From 938c3e5a587ce950a94964ea509b9e7f8834dfae Mon Sep 17 00:00:00 2001
From: wwf <yearningwang@iqtogether.com>
Date: 星期二, 20 五月 2025 10:09:00 +0800
Subject: [PATCH] 初始化

---
 app/components/workflow/nodes/loop/utils.ts                                                                                     |  179 
 app/components/base/auto-height-textarea/style.module.scss                                                                      |    0 
 app/components/header/assets/anthropic.svg                                                                                      |   11 
 app/components/base/icons/src/vender/line/images/index.ts                                                                       |    1 
 app/components/base/list-empty/index.tsx                                                                                        |   38 
 app/components/workflow/operator/control.tsx                                                                                    |  103 
 app/components/base/icons/assets/vender/solid/users/user-01.svg                                                                 |    8 
 app/components/base/block-input/index.tsx                                                                                       |  146 
 app/components/workflow/block-selector/tabs.tsx                                                                                 |   85 
 i18n/th-TH/app-log.ts                                                                                                           |   98 
 app/components/datasets/create/website/firecrawl/header.tsx                                                                     |   43 
 utils/tool-call.ts                                                                                                              |    6 
 app/components/app/configuration/base/var-highlight/index.tsx                                                                   |   37 
 app/components/base/prompt-editor/plugins/component-picker-block/menu.tsx                                                       |   31 
 app/components/datasets/common/retrieval-param-config/index.tsx                                                                 |  295 
 app/components/workflow/nodes/start/components/var-list.tsx                                                                     |   70 
 public/pdf.worker.min.mjs                                                                                                       |   21 
 app/components/plugins/marketplace/search-box/index.tsx                                                                         |   70 
 app/components/base/icons/assets/public/knowledge/chunk.svg                                                                     |   13 
 app/components/datasets/documents/detail/completed/common/action-buttons.tsx                                                    |   86 
 app/components/workflow/nodes/if-else/components/condition-value.tsx                                                            |  108 
 app/components/workflow/nodes/_base/components/file-upload-setting.tsx                                                          |  199 
 app/components/plugins/marketplace/description/index.tsx                                                                        |   71 
 app/components/base/icons/assets/vender/line/mediaAndDevices/stop.svg                                                           |   10 
 app/components/workflow/block-selector/market-place-plugin/action.tsx                                                           |   89 
 app/(commonLayout)/apps/assets/add.svg                                                                                          |    3 
 app/components/app/create-app-dialog/app-list/sidebar.tsx                                                                       |   60 
 app/components/base/radio/component/group/index.tsx                                                                             |   24 
 app/components/workflow/run/node.tsx                                                                                            |  258 
 app/components/base/checkbox/index.tsx                                                                                          |   51 
 app/components/base/icons/assets/vender/line/development/git-branch-01.svg                                                      |    5 
 app/components/base/logo/dify-logo.tsx                                                                                          |   45 
 app/components/plugins/utils.ts                                                                                                 |   26 
 app/components/base/icons/assets/vender/line/files/file-plus-01.svg                                                             |    5 
 app/components/plugins/marketplace/context.tsx                                                                                  |  348 
 i18n/ja-JP/dataset-settings.ts                                                                                                  |   43 
 app/components/base/pagination/type.ts                                                                                          |   58 
 app/components/base/icons/src/public/files/Pdf.tsx                                                                              |   20 
 app/components/app/configuration/ctrl-btn-group/index.tsx                                                                       |   24 
 i18n/fa-IR/dataset-documents.ts                                                                                                 |  394 
 app/account/delete-account/index.tsx                                                                                            |   44 
 app/components/base/icons/assets/public/billing/google-cloud.svg                                                                |    8 
 app/components/base/icons/assets/vender/line/files/file-upload.svg                                                              |    6 
 service/use-base.ts                                                                                                             |   26 
 app/components/datasets/create/assets/zap-fast.svg                                                                              |    6 
 app/components/app/overview/assets/refresh-hover.svg                                                                            |    3 
 app/components/base/icons/src/vender/line/files/FileUpload.json                                                                 |   52 
 app/components/base/icons/src/vender/line/mediaAndDevices/Speaker.json                                                          |  112 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/index.tsx                         |  277 
 i18n/vi-VN/register.ts                                                                                                          |    4 
 app/components/base/prompt-editor/plugins/context-block/context-block-replacement-block.tsx                                     |   64 
 public/vs/basic-languages/flow9/flow9.js                                                                                        |   10 
 app/components/header/account-setting/model-provider-page/provider-added-card/priority-use-tip.tsx                              |   19 
 app/components/share/text-generation/run-batch/csv-download/index.tsx                                                           |   70 
 app/components/workflow/nodes/variable-assigner/node.tsx                                                                        |   61 
 app/components/header/account-setting/model-provider-page/model-name/index.tsx                                                  |   84 
 app/components/base/chat/utils.ts                                                                                               |  193 
 app/components/base/icons/src/public/other/Icon3Dots.tsx                                                                        |   20 
 app/components/workflow-app/hooks/use-workflow-refresh-draft.ts                                                                 |   36 
 i18n/hi-IN/dataset-settings.ts                                                                                                  |   48 
 i18n/ja-JP/app-overview.ts                                                                                                      |  173 
 app/components/datasets/create/assets/md.svg                                                                                    |   18 
 app/components/workflow/panel/version-history-panel/filter/index.tsx                                                            |   81 
 app/components/base/icons/assets/vender/workflow/question-classifier.svg                                                        |    5 
 utils/semver.ts                                                                                                                 |    9 
 app/components/workflow/panel/version-history-panel/context-menu/index.tsx                                                      |   84 
 app/components/plugins/card/base/corner-mark.tsx                                                                                |   12 
 context/external-api-panel-context.tsx                                                                                          |   28 
 app/components/workflow/limit-tips.tsx                                                                                          |   39 
 app/components/base/prompt-editor/plugins/on-blur-or-focus-block.tsx                                                            |   69 
 app/components/base/icons/src/vender/line/users/User01.json                                                                     |   39 
 app/components/plugins/plugin-detail-panel/tool-selector/hooks.ts                                                               |   14 
 app/components/workflow/types.ts                                                                                                |  435 
 app/components/base/icons/assets/vender/solid/alertsAndFeedback/alert-triangle.svg                                              |    5 
 app/components/datasets/external-knowledge-base/create/index.tsx                                                                |  128 
 app/components/app/create-from-dsl-modal/index.tsx                                                                              |  320 
 app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/api/page.tsx                                                      |    9 
 app/components/workflow/nodes/knowledge-retrieval/hooks.ts                                                                      |   14 
 i18n/uk-UA/layout.ts                                                                                                            |    4 
 app/components/workflow/nodes/assigner/components/var-list/use-var-list.ts                                                      |   39 
 app/components/plugins/install-plugin/base/check-task-status.ts                                                                 |   63 
 app/components/workflow/nodes/parameter-extractor/components/extract-parameter/list.tsx                                         |   85 
 app/components/base/icons/src/vender/solid/development/Container.json                                                           |   44 
 app/components/base/icons/assets/vender/solid/mediaAndDevices/speaker.svg                                                       |   15 
 app/components/base/icons/src/image/llm/Wxyy.tsx                                                                                |   20 
 app/components/base/icons/assets/vender/line/mediaAndDevices/speaker.svg                                                        |   15 
 app/components/base/markdown-blocks/form.tsx                                                                                    |  238 
 i18n/it-IT/dataset-creation.ts                                                                                                  |  241 
 i18n/ro-RO/run-log.ts                                                                                                           |   31 
 i18n/ru-RU/dataset-creation.ts                                                                                                  |  218 
 app/components/base/icons/src/vender/solid/development/Variable02.tsx                                                           |   20 
 app/components/base/icons/src/vender/line/editor/LetterSpacing01.json                                                           |   39 
 app/components/workflow/panel/chat-variable-panel/components/variable-type-select.tsx                                           |   66 
 app/components/app/configuration/config-vision/index.tsx                                                                        |  112 
 app/components/app/configuration/base/group-name/index.tsx                                                                      |   24 
 app/components/workflow/nodes/http/types.ts                                                                                     |   84 
 app/components/base/icons/src/public/llm/OpenaiGreen.tsx                                                                        |   20 
 app/components/base/features/new-feature-panel/feature-card.tsx                                                                 |   61 
 app/components/base/icons/assets/public/tracing/tracing-icon.svg                                                                |    6 
 app/components/base/icons/assets/vender/line/editor/letter-spacing-01.svg                                                       |    5 
 app/components/base/icons/assets/vender/solid/editor/paragraph.svg                                                              |    5 
 app/components/base/icons/src/vender/workflow/TemplatingTransform.tsx                                                           |   20 
 app/components/plugins/plugin-page/install-plugin-dropdown.tsx                                                                  |  140 
 app/components/base/form/components/field/number-input.tsx                                                                      |   49 
 app/components/workflow/nodes/_base/panel.tsx                                                                                   |  209 
 app/components/base/icons/src/vender/line/files/Folder.tsx                                                                      |   20 
 app/components/base/icons/src/vender/line/general/Target04.json                                                                 |   65 
 public/vs/basic-languages/scheme/scheme.js                                                                                      |   10 
 app/components/base/icons/src/public/billing/Asterisk.tsx                                                                       |   20 
 app/components/base/chat/chat-with-history/chat-wrapper.tsx                                                                     |  270 
 app/components/workflow/nodes/_base/components/error-handle/fail-branch-card.tsx                                                |   32 
 app/account/header.tsx                                                                                                          |   39 
 app/components/base/icons/assets/public/llm/chatglm-text.svg                                                                    |   16 
 app/components/base/features/new-feature-panel/annotation-reply/annotation-ctrl-button.tsx                                      |   79 
 app/components/base/icons/src/vender/line/development/PromptEngineering.json                                                    |   65 
 app/components/base/icons/src/vender/line/others/LongArrowLeft.tsx                                                              |   20 
 app/components/app-sidebar/basic.tsx                                                                                            |   99 
 app/components/base/icons/src/public/files/Doc.json                                                                             |  169 
 package.json                                                                                                                    |  229 
 app/components/header/account-setting/members-page/invited-modal/index.module.css                                               |   21 
 app/components/workflow/nodes/list-operator/components/filter-condition.tsx                                                     |  113 
 app/components/base/icons/src/vender/features/VirtualAssistant.tsx                                                              |   20 
 app/components/base/icons/src/vender/line/editor/Collapse.tsx                                                                   |   20 
 app/components/workflow/nodes/end/default.ts                                                                                    |   27 
 i18n/ru-RU/app-annotation.ts                                                                                                    |   87 
 app/components/workflow/block-selector/all-tools.tsx                                                                            |  168 
 app/components/workflow/panel/workflow-preview.tsx                                                                              |  213 
 i18n/fr-FR/dataset-settings.ts                                                                                                  |   43 
 app/components/workflow/panel/chat-variable-panel/components/variable-item.tsx                                                  |   49 
 service/knowledge/use-hit-testing.ts                                                                                            |    0 
 app/components/workflow/nodes/loop/components/loop-variables/empty.tsx                                                          |   13 
 app/components/app/configuration/config/agent/agent-setting/item-panel.tsx                                                      |   41 
 app/components/base/icons/assets/public/plugins/verified-light.svg                                                              |   58 
 app/components/base/icons/src/public/llm/Openllm.tsx                                                                            |   20 
 app/components/base/icons/src/vender/solid/general/AnswerTriangle.json                                                          |   27 
 app/components/datasets/create/website/base/crawling.tsx                                                                        |   37 
 app/components/tools/edit-custom-collection-modal/examples.ts                                                                   |  181 
 app/components/base/icons/src/public/tracing/WeaveIcon.tsx                                                                      |   16 
 i18n/it-IT/app.ts                                                                                                               |  225 
 app/components/app/configuration/prompt-value-panel/utils.ts                                                                    |   13 
 i18n/check-i18n.js                                                                                                              |   85 
 public/screenshots/light/Workflow@2x.png                                                                                        |    0 
 app/forgot-password/page.tsx                                                                                                    |   26 
 app/components/base/badge/index.css                                                                                             |   28 
 app/components/base/icons/src/vender/solid/communication/index.ts                                                               |   12 
 app/components/workflow/nodes/_base/components/before-run-form/form-item.tsx                                                    |  301 
 app/components/workflow/hooks/use-workflow-run-event/index.ts                                                                   |   15 
 app/components/workflow/run/utils/format-log/graph-to-log-struct.ts                                                             |  356 
 app/components/base/icons/src/vender/line/financeAndECommerce/Balance.json                                                      |   29 
 i18n/ja-JP/dataset-hit-testing.ts                                                                                               |   34 
 hooks/use-metadata.ts                                                                                                           |  395 
 app/components/base/icons/assets/vender/solid/general/check-done-01.svg                                                         |    4 
 app/components/header/account-setting/model-provider-page/hooks.ts                                                              |  353 
 public/vs/base/common/worker/simpleWorker.nls.fr.js                                                                             |    8 
 app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx                                                 |   96 
 app/components/base/icons/src/vender/line/general/DotsGrid.json                                                                 |  134 
 i18n/it-IT/app-debug.ts                                                                                                         |  471 
 app/components/base/icons/src/vender/line/files/ClipboardCheck.json                                                             |   29 
 app/components/app/configuration/debug/debug-with-multiple-model/model-parameter-trigger.tsx                                    |  126 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-icon.tsx                                         |   39 
 app/components/base/icons/assets/vender/features/love-message.svg                                                               |    3 
 app/components/base/icons/assets/vender/solid/development/container.svg                                                         |    5 
 app/components/base/icons/src/public/llm/Gpt3.json                                                                              |   51 
 i18n/pl-PL/dataset-documents.ts                                                                                                 |  396 
 app/components/workflow/nodes/_base/components/support-var-input/index.tsx                                                      |   52 
 app/components/workflow/nodes/loop/use-config.ts                                                                                |  379 
 app/components/custom/style.module.css                                                                                          |    6 
 app/components/workflow/nodes/_base/components/field.tsx                                                                        |   65 
 public/vs/basic-languages/elixir/elixir.js                                                                                      |   10 
 app/components/base/icons/src/vender/solid/editor/Citations.tsx                                                                 |   20 
 app/components/base/icons/src/vender/workflow/End.tsx                                                                           |   20 
 app/signin/components/social-auth.tsx                                                                                           |   62 
 app/components/header/account-setting/members-page/invited-modal/assets/copy-hover.svg                                          |    3 
 app/components/workflow/panel/env-panel/variable-modal.tsx                                                                      |  167 
 app/components/base/icons/assets/public/knowledge/selection-mod.svg                                                             |   13 
 i18n/uk-UA/app-annotation.ts                                                                                                    |   87 
 app/components/base/icons/assets/vender/solid/communication/message-fast.svg                                                    |    3 
 app/components/workflow/run/utils/format-log/retry/index.ts                                                                     |   43 
 i18n/sl-SI/app-overview.ts                                                                                                      |  173 
 app/components/base/icons/assets/vender/line/others/icon-3-dots.svg                                                             |    5 
 app/components/base/notion-page-selector/base.tsx                                                                               |  136 
 models/debug.ts                                                                                                                 |  256 
 app/components/base/chat/chat/chat-input-area/hooks.ts                                                                          |   46 
 app/components/base/icons/assets/public/billing/ar-cube-1.svg                                                                   |    3 
 app/components/base/icons/src/public/llm/OpenllmText.tsx                                                                        |   20 
 app/components/datasets/hit-testing/utils/extension-to-file-type.ts                                                             |   31 
 app/components/base/icons/src/public/common/Lock.tsx                                                                            |   20 
 app/components/base/icons/src/vender/line/communication/ChatBotSlim.json                                                        |   68 
 app/components/workflow/nodes/_base/components/error-handle/error-handle-type-selector.tsx                                      |   97 
 public/vs/basic-languages/shell/shell.js                                                                                        |   10 
 app/components/base/icons/src/vender/solid/arrows/ChevronDown.json                                                              |   39 
 app/components/workflow/nodes/loop/components/loop-variables/input-mode-selec.tsx                                               |   37 
 app/components/base/icons/src/vender/line/general/index.ts                                                                      |   27 
 app/components/workflow/nodes/document-extractor/default.ts                                                                     |   36 
 app/components/develop/md.tsx                                                                                                   |  151 
 i18n/sl-SI/custom.ts                                                                                                            |   32 
 app/components/plugins/plugin-page/filter-management/index.tsx                                                                  |   45 
 app/components/base/icons/src/vender/solid/communication/MessageDotsCircle.tsx                                                  |   20 
 service/workflow.ts                                                                                                             |   72 
 app/components/base/icons/src/image/llm/index.ts                                                                                |    9 
 app/components/workflow/nodes/assigner/types.ts                                                                                 |   32 
 app/components/base/icons/assets/vender/solid/layout/grid-01.svg                                                                |   10 
 app/components/base/icons/src/vender/other/Generator.tsx                                                                        |   20 
 app/components/workflow/nodes/_base/hooks/use-available-var-list.ts                                                             |   53 
 app/components/workflow/run/assets/bg-line-success.svg                                                                          |    3 
 app/components/workflow/panel/version-history-panel/delete-confirm-modal.tsx                                                    |   42 
 i18n/fa-IR/time.ts                                                                                                              |   37 
 app/components/base/icons/assets/vender/line/arrows/arrow-narrow-left.svg                                                       |    3 
 app/components/datasets/create/file-uploader/index.tsx                                                                          |  381 
 i18n/hi-IN/custom.ts                                                                                                            |   32 
 app/components/plugins/install-plugin/base/loading.tsx                                                                          |   23 
 app/components/app/configuration/base/warning-mask/index.tsx                                                                    |   43 
 app/components/base/icons/assets/vender/workflow/home.svg                                                                       |    5 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-agent-log.ts                                                  |   50 
 app/components/datasets/create/assets/pattern-recognition-mod.svg                                                               |   12 
 README.md                                                                                                                       |  118 
 app/components/header/account-setting/menu-dialog.tsx                                                                           |   60 
 app/components/workflow/update-dsl-modal.tsx                                                                                    |  302 
 app/components/base/icons/src/vender/line/files/FileUpload.tsx                                                                  |   20 
 app/components/workflow/nodes/end/utils.ts                                                                                      |    5 
 app/components/develop/secret-key/assets/qrcode.svg                                                                             |    4 
 app/components/base/icons/src/public/billing/SparklesSoft.json                                                                  |   36 
 app/components/plugins/card/base/download-count.tsx                                                                             |   19 
 app/components/base/icons/src/vender/other/Group.json                                                                           |   66 
 app/(shareLayout)/chatbot/[token]/page.tsx                                                                                      |   11 
 public/vs/base/common/worker/simpleWorker.nls.zh-tw.js                                                                          |    8 
 app/components/base/icons/assets/public/common/lock.svg                                                                         |    5 
 app/education-apply/role-selector.tsx                                                                                           |   53 
 app/components/workflow/nodes/variable-assigner/components/var-list/use-var-list.ts                                             |   34 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/panel.tsx                                                     |  238 
 app/components/base/icons/src/vender/solid/files/FileSearch02.tsx                                                               |   20 
 app/components/workflow/utils/node.ts                                                                                           |  145 
 app/components/datasets/create/website/jina-reader/base/field.tsx                                                               |   54 
 app/components/datasets/documents/detail/batch-modal/csv-downloader.tsx                                                         |  109 
 app/components/app/configuration/debug/chat-user-input.tsx                                                                      |  108 
 public/vs/basic-languages/sophia/sophia.js                                                                                      |   10 
 i18n/fr-FR/app-annotation.ts                                                                                                    |   87 
 app/components/base/icons/src/vender/features/FolderUpload.json                                                                 |   26 
 app/components/base/copy-feedback/index.tsx                                                                                     |   91 
 public/vs/basic-languages/azcli/azcli.js                                                                                        |   10 
 app/components/base/icons/src/vender/line/arrows/ChevronSelectorVertical.json                                                   |   29 
 i18n/vi-VN/plugin.ts                                                                                                            |  215 
 app/components/share/text-generation/result/index.tsx                                                                           |  466 
 app/components/base/icons/assets/image/llm/tongyi-text.png                                                                      |    0 
 app/(commonLayout)/datasets/layout.tsx                                                                                          |   14 
 app/components/header/assets/bitbucket.svg                                                                                      |   10 
 app/components/app/annotation/view-annotation-modal/hit-history-no-data.tsx                                                     |   19 
 app/components/base/icons/src/vender/other/ReplayLine.tsx                                                                       |   20 
 app/components/base/badge/index.tsx                                                                                             |   81 
 app/components/plugins/plugin-page/filter-management/constant.ts                                                                |   11 
 app/components/base/icons/assets/vender/line/editor/type-square.svg                                                             |    5 
 app/components/datasets/create/stepper/index.tsx                                                                                |   27 
 app/components/base/icons/src/public/llm/AnthropicLight.json                                                                    | 1046 
 app/components/base/date-and-time-picker/year-and-month-picker/options.tsx                                                      |   55 
 app/components/base/features/new-feature-panel/file-upload/index.tsx                                                            |  105 
 app/components/base/icons/src/vender/plugin/LeftCorner.tsx                                                                      |   20 
 app/components/base/icons/src/vender/solid/development/FileHeart02.tsx                                                          |   20 
 app/components/base/icons/src/public/common/Dify.tsx                                                                            |   20 
 app/components/base/icons/src/vender/line/development/BracketsX.tsx                                                             |   20 
 app/components/workflow/hooks/use-workflow-run.ts                                                                               |   17 
 app/components/base/icons/src/vender/solid/mediaAndDevices/MagicEyes.json                                                       |   38 
 app/components/base/audio-btn/audio.player.manager.ts                                                                           |   50 
 app/components/base/icons/src/public/plugins/index.ts                                                                           |    7 
 app/components/base/icons/assets/public/common/d.svg                                                                            |   16 
 app/components/datasets/create/assets/star.svg                                                                                  |   11 
 app/components/base/icons/src/vender/line/files/FilePlus01.tsx                                                                  |   20 
 app/components/datasets/create/assets/close.svg                                                                                 |    3 
 app/account/account-page/index.tsx                                                                                              |  320 
 app/components/base/icons/assets/public/llm/azureai-text.svg                                                                    |   30 
 app/components/header/assets/twitter.svg                                                                                        |    3 
 app/components/datasets/create/assets/notion.svg                                                                                |   12 
 app/components/datasets/metadata/hooks/use-check-metadata-name.ts                                                               |   28 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-common-variable-selector.tsx.tsx |   91 
 app/components/base/icons/src/public/knowledge/SelectionMod.json                                                                |  116 
 app/signin/assets/google.svg                                                                                                    |   13 
 app/components/base/icons/src/image/llm/WxyyText.module.css                                                                     |    5 
 app/components/base/icons/assets/vender/line/general/plus-02.svg                                                                |    5 
 i18n/en-US/run-log.ts                                                                                                           |   31 
 i18n/ko-KR/education.ts                                                                                                         |   47 
 service/knowledge/use-document.ts                                                                                               |  132 
 app/components/datasets/documents/detail/completed/segment-card/index.tsx                                                       |  254 
 app/components/base/icons/assets/vender/line/mapsAndTravel/route.svg                                                            |   10 
 app/components/base/icons/assets/vender/workflow/knowledge-retrieval.svg                                                        |    5 
 app/components/base/icons/src/vender/solid/editor/Colors.json                                                                   |   62 
 app/(commonLayout)/datasets/Container.tsx                                                                                       |  141 
 app/components/datasets/documents/assets/briefcase.svg                                                                          |    3 
 public/vs/basic-languages/qsharp/qsharp.js                                                                                      |   10 
 typography.js                                                                                                                   |  357 
 app/components/workflow/nodes/tool/panel.tsx                                                                                    |  202 
 app/components/base/features/hooks.ts                                                                                           |   16 
 app/components/base/icons/assets/public/thought/search.svg                                                                      |   10 
 app/components/workflow/header/undo-redo.tsx                                                                                    |   66 
 public/logo/logo.svg                                                                                                            |   12 
 i18n/language.ts                                                                                                                |  114 
 app/components/workflow/hooks/use-format-time-from-now.ts                                                                       |   12 
 i18n/zh-Hant/login.ts                                                                                                           |  110 
 app/components/base/notion-page-selector/assets/notion-empty-page.svg                                                           |    3 
 app/components/workflow/nodes/variable-assigner/components/add-variable/index.tsx                                               |   89 
 app/components/base/video-gallery/VideoPlayer.tsx                                                                               |  278 
 app/components/base/date-and-time-picker/types.ts                                                                               |  105 
 app/components/base/file-uploader/file-uploader-in-chat-input/index.tsx                                                         |   41 
 public/screenshots/light/Chatbot@2x.png                                                                                         |    0 
 i18n/ko-KR/register.ts                                                                                                          |    3 
 app/components/base/features/new-feature-panel/annotation-reply/score-slider/base-slider/style.module.css                       |   20 
 app/components/base/icons/src/public/common/DiagonalDividingLine.json                                                           |   28 
 app/components/base/icons/assets/public/llm/jina.svg                                                                            |    4 
 app/components/base/icons/src/vender/line/mediaAndDevices/Stop.json                                                             |   66 
 app/components/plugins/plugin-page/index.tsx                                                                                    |  299 
 app/components/base/icons/assets/public/avatar/robot.svg                                                                        |   11 
 app/components/workflow/nodes/code/utils.ts                                                                                     |    3 
 public/vs/basic-languages/abap/abap.js                                                                                          |   10 
 app/components/base/chat/chat-with-history/hooks.tsx                                                                            |  495 
 app/components/datasets/common/document-file-icon.tsx                                                                           |   40 
 app/components/app/text-generate/item/index.tsx                                                                                 |  383 
 app/components/base/tag/index.tsx                                                                                               |   42 
 app/components/workflow/nodes/question-classifier/panel.tsx                                                                     |  204 
 app/components/base/features/new-feature-panel/moderation/index.tsx                                                             |  176 
 app/components/base/icons/src/vender/line/development/PromptEngineering.tsx                                                     |   20 
 i18n/th-TH/app-debug.ts                                                                                                         |    4 
 app/components/base/icons/assets/vender/line/arrows/arrow-up-right.svg                                                          |    5 
 app/components/workflow/nodes/code/panel.tsx                                                                                    |  159 
 app/components/base/date-and-time-picker/date-picker/index.tsx                                                                  |  309 
 app/components/base/icons/assets/vender/line/general/upload-03.svg                                                              |   10 
 app/components/base/icons/src/public/llm/Cohere.tsx                                                                             |   20 
 app/components/base/icons/src/vender/line/development/TerminalSquare.json                                                       |   39 
 app/components/develop/template/template_chat.zh.mdx                                                                            | 1394 
 i18n/it-IT/workflow.ts                                                                                                          |  946 
 app/components/base/icons/assets/vender/solid/mediaAndDevices/sliders-02.svg                                                    |    8 
 app/components/base/icons/src/public/llm/AzureOpenaiService.tsx                                                                 |   20 
 public/vs/basic-languages/redis/redis.js                                                                                        |   10 
 app/components/workflow/panel/env-panel/index.tsx                                                                               |  195 
 app/components/plugins/plugin-page/debug-info.tsx                                                                               |   67 
 app/components/workflow/nodes/_base/hooks/use-node-info.ts                                                                      |   22 
 i18n/de-DE/custom.ts                                                                                                            |   32 
 app/components/base/icons/src/vender/workflow/index.ts                                                                          |   21 
 i18n/ru-RU/app-overview.ts                                                                                                      |  173 
 app/components/base/icons/src/vender/line/arrows/index.ts                                                                       |    8 
 app/components/base/icons/src/image/llm/BaichuanTextCn.module.css                                                               |    5 
 app/components/base/icons/src/vender/line/education/index.ts                                                                    |    1 
 app/components/explore/create-app-modal/index.tsx                                                                               |  195 
 app/components/base/prompt-editor/plugins/workflow-variable-block/node.tsx                                                      |  104 
 app/components/base/icons/src/image/llm/Minimax.tsx                                                                             |   20 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/index.tsx                           |  183 
 .gitignore                                                                                                                      |   56 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-finished.ts                                                   |   35 
 i18n/es-ES/dataset-hit-testing.ts                                                                                               |   35 
 app/components/app/configuration/dataset-config/type-icon/index.tsx                                                             |   33 
 i18n/hi-IN/explore.ts                                                                                                           |   45 
 app/components/base/icons/src/public/tracing/TracingIcon.tsx                                                                    |   20 
 app/components/base/features/new-feature-panel/moderation/form-generation.tsx                                                   |   80 
 app/components/base/icons/src/vender/line/arrows/RefreshCw05.json                                                               |   29 
 app/components/base/corner-label/index.tsx                                                                                      |   21 
 app/components/billing/utils/index.ts                                                                                           |   29 
 app/components/base/icons/src/vender/solid/development/PuzzlePiece01.tsx                                                        |   20 
 app/components/workflow/note-node/note-editor/toolbar/divider.tsx                                                               |    7 
 app/components/base/chat/embedded-chatbot/header/index.tsx                                                                      |  179 
 app/components/base/icons/src/vender/line/arrows/ChevronSelectorVertical.tsx                                                    |   20 
 app/components/workflow/block-selector/tool/tool-list-tree-view/item.tsx                                                        |   47 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-finished.ts                                         |   57 
 app/components/base/icons/src/vender/line/shapes/CubeOutline.json                                                               |   98 
 app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx                                                |  447 
 i18n/de-DE/app-overview.ts                                                                                                      |  173 
 i18n/ko-KR/share-app.ts                                                                                                         |   78 
 app/components/base/icons/src/public/tracing/LangsmithIcon.tsx                                                                  |   20 
 app/components/develop/secret-key/assets/trash-gray.svg                                                                         |    3 
 i18n/tr-TR/workflow.ts                                                                                                          |  922 
 app/components/plugins/plugin-detail-panel/index.tsx                                                                            |   62 
 app/components/workflow/panel/index.tsx                                                                                         |   50 
 app/components/base/prompt-editor/plugins/history-block/node.tsx                                                                |   90 
 public/vs/basic-languages/yaml/yaml.js                                                                                          |   10 
 app/components/base/icons/src/public/files/Yaml.tsx                                                                             |   20 
 app/components/develop/doc.tsx                                                                                                  |  178 
 app/components/base/icons/src/vender/solid/editor/Brush01.tsx                                                                   |   20 
 app/components/app/configuration/dataset-config/params-config/weighted-score.tsx                                                |   62 
 app/components/base/icons/src/public/common/Github.json                                                                         |   36 
 context/explore-context.ts                                                                                                      |   21 
 app/components/app/configuration/dataset-config/select-dataset/index.tsx                                                        |  176 
 app/components/base/prompt-log-modal/card.tsx                                                                                   |   42 
 i18n/pl-PL/explore.ts                                                                                                           |   45 
 app/components/plugins/plugin-detail-panel/app-selector/app-trigger.tsx                                                         |   48 
 app/components/base/icons/assets/public/llm/openllm.svg                                                                         |   12 
 jest.config.ts                                                                                                                  |  210 
 public/vs/basic-languages/less/less.js                                                                                          |   11 
 app/components/base/icons/src/vender/solid/education/Unblur.json                                                                |  152 
 app/components/base/notion-page-selector/workspace-selector/index.tsx                                                           |   80 
 app/components/base/custom-icon/index.tsx                                                                                       |   16 
 app/components/base/icons/src/image/llm/TongyiTextCn.module.css                                                                 |    5 
 app/components/base/icons/src/vender/line/weather/index.ts                                                                      |    1 
 app/components/workflow/nodes/document-extractor/panel.tsx                                                                      |  124 
 app/components/base/icons/src/vender/solid/general/ZapNarrow.json                                                               |   38 
 app/components/workflow/nodes/if-else/node.tsx                                                                                  |  103 
 app/components/app/configuration/config/code-generator/get-code-generator-res.tsx                                               |  230 
 i18n/en-US/time.ts                                                                                                              |   37 
 app/components/base/icons/src/vender/line/financeAndECommerce/Tag03.tsx                                                         |   20 
 app/components/base/icons/src/vender/solid/arrows/ChevronDown.tsx                                                               |   20 
 app/components/base/icons/src/vender/line/editor/Colors.tsx                                                                     |   20 
 app/components/workflow/nodes/knowledge-retrieval/components/dataset-item.tsx                                                   |  125 
 i18n/zh-Hant/workflow.ts                                                                                                        |  921 
 app/components/base/icons/assets/public/llm/openai-blue.svg                                                                     |    4 
 app/components/app/overview/apikey-info-panel/index.tsx                                                                         |   73 
 themes/manual-light.css                                                                                                         |   65 
 app/components/datasets/common/economical-retrieval-method-config/index.tsx                                                     |   42 
 app/components/app/overview/appCard.tsx                                                                                         |  273 
 i18n/zh-Hans/dataset-settings.ts                                                                                                |   43 
 app/components/billing/plan/index.tsx                                                                                           |  137 
 app/components/datasets/create/assets/pdf.svg                                                                                   |   22 
 i18n/en-US/dataset-settings.ts                                                                                                  |   43 
 i18n/th-TH/tools.ts                                                                                                             |  158 
 app/components/base/icons/assets/public/files/doc.svg                                                                           |   22 
 app/components/workflow-app/hooks/use-workflow-run.ts                                                                           |  357 
 app/components/workflow/nodes/if-else/components/condition-number-input.tsx                                                     |  168 
 app/components/workflow-app/hooks/use-workflow-start-run.tsx                                                                    |   96 
 app/components/base/icons/src/vender/line/files/ClipboardCheck.tsx                                                              |   20 
 app/components/develop/secret-key/assets/qrcode-hover.svg                                                                       |    4 
 app/components/base/date-and-time-picker/calendar/days-of-week.tsx                                                              |   21 
 app/components/base/icons/src/vender/workflow/TemplatingTransform.json                                                          |  154 
 app/components/base/grid-mask/Grid.svg                                                                                          | 2146 
 app/components/base/icons/src/vender/line/files/FileCheck02.tsx                                                                 |   20 
 app/components/base/icons/src/vender/other/Group.tsx                                                                            |   20 
 app/components/base/icons/src/vender/solid/communication/CuteRobot.json                                                         |   38 
 app/components/plugins/plugin-detail-panel/app-selector/app-picker.tsx                                                          |  123 
 app/components/workflow/nodes/_base/components/list-no-data-placeholder.tsx                                                     |   18 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/config.ts                                                     |    8 
 app/components/base/icons/assets/vender/solid/mediaAndDevices/document-support-icon.svg                                         |    3 
 app/components/plugins/marketplace/search-box/tags-filter.tsx                                                                   |  138 
 i18n/pt-BR/custom.ts                                                                                                            |   32 
 i18n/en-US/app-overview.ts                                                                                                      |  173 
 app/components/datasets/metadata/utils/get-icon.ts                                                                              |   10 
 app/components/workflow/nodes/tool/types.ts                                                                                     |   25 
 app/components/base/chat/chat-with-history/sidebar/item.tsx                                                                     |   58 
 app/components/datasets/hit-testing/modify-retrieval-modal.tsx                                                                  |  118 
 app/components/workflow/block-selector/index.tsx                                                                                |  171 
 app/components/base/icons/src/vender/line/financeAndECommerce/GoldCoin.json                                                     |  120 
 app/components/datasets/metadata/hooks/use-metadata-document.ts                                                                 |  159 
 app/components/base/icons/src/vender/line/others/Colors.json                                                                    |   66 
 app/components/workflow/block-selector/market-place-plugin/item.tsx                                                             |   77 
 app/components/base/icons/src/vender/line/shapes/CubeOutline.tsx                                                                |   20 
 app/components/base/prompt-editor/plugins/context-block/node.tsx                                                                |  100 
 app/components/workflow/block-selector/hooks.ts                                                                                 |   55 
 app/components/base/icons/assets/public/plugins/verified-dark.svg                                                               |   58 
 app/components/base/icons/assets/public/knowledge/collapse.svg                                                                  |    9 
 public/vs/basic-languages/powershell/powershell.js                                                                              |   10 
 app/components/base/icons/assets/public/common/dify.svg                                                                         |    8 
 app/components/base/icons/src/vender/solid/mediaAndDevices/Play.tsx                                                             |   20 
 app/components/base/icons/src/vender/workflow/Agent.json                                                                        |   53 
 app/components/base/icons/assets/public/llm/xorbits-inference-text.svg                                                          |   42 
 app/components/base/chat/__tests__/multiRootNodesMessages.json                                                                  |   52 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/provider-config-modal.tsx                                     |  390 
 app/components/workflow/nodes/_base/components/error-handle/hooks.ts                                                            |  123 
 service/demo/index.tsx                                                                                                          |  100 
 app/components/header/assets/gpt.svg                                                                                            |    4 
 app/components/workflow/utils/common.ts                                                                                         |   35 
 app/components/app/configuration/config/index.tsx                                                                               |   99 
 app/components/app/configuration/config-var/select-type-item/index.tsx                                                          |   41 
 app/components/base/icons/src/vender/line/general/Check.tsx                                                                     |   20 
 i18n/th-TH/dataset-settings.ts                                                                                                  |   43 
 app/components/app/log/model-info.tsx                                                                                           |  107 
 app/components/base/features/context.tsx                                                                                        |   27 
 i18n/hi-IN/tools.ts                                                                                                             |  163 
 app/components/base/icons/src/vender/solid/files/Folder.json                                                                    |   38 
 app/components/workflow/nodes/question-classifier/use-config.ts                                                                 |  258 
 app/components/workflow/nodes/_base/components/prompt/editor.tsx                                                                |  306 
 app/components/app/configuration/dataset-config/params-config/weighted-score.css                                                |    7 
 app/components/base/icons/assets/vender/solid/general/message-clock-circle.svg                                                  |    5 
 app/components/workflow/nodes/_base/components/readonly-input-with-select-var.tsx                                               |   90 
 service/knowledge/use-create-dataset.ts                                                                                         |  223 
 app/(commonLayout)/apps/page.tsx                                                                                                |   37 
 app/components/app/duplicate-modal/index.tsx                                                                                    |  124 
 app/components/base/date-and-time-picker/calendar/item.tsx                                                                      |   30 
 app/components/base/prompt-editor/plugins/placeholder.tsx                                                                       |   27 
 app/components/workflow/nodes/variable-assigner/panel.tsx                                                                       |  127 
 app/components/base/icons/src/vender/line/mediaAndDevices/StopCircle.json                                                       |   59 
 app/components/base/icons/assets/public/files/txt.svg                                                                           |   23 
 app/components/app/configuration/config-var/config-select/index.spec.tsx                                                        |   82 
 app/components/base/icons/assets/image/llm/wxyy-text-cn.png                                                                     |    0 
 i18n/th-TH/app-api.ts                                                                                                           |   85 
 app/components/base/icons/assets/public/plugins/partner-dark.svg                                                                |   58 
 app/components/workflow/datasets-detail-store/store.ts                                                                          |   38 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/type-selector.tsx                 |   69 
 app/components/base/chat/chat/answer/__mocks__/markdownContent.ts                                                               |   61 
 app/components/workflow/nodes/_base/components/split.tsx                                                                        |   18 
 context/datasets-context.tsx                                                                                                    |   21 
 app/components/base/icons/src/vender/features/Microphone01.tsx                                                                  |   20 
 app/components/tools/add-tool-modal/category.tsx                                                                                |   69 
 app/components/base/icons/src/vender/solid/FinanceAndECommerce/Scales02.tsx                                                     |   20 
 app/components/base/icons/src/vender/solid/layout/Grid01.tsx                                                                    |   20 
 app/components/header/account-setting/model-provider-page/model-selector/popup.tsx                                              |  121 
 app/components/base/icons/src/public/files/Docx.json                                                                            |  178 
 app/components/base/icons/assets/vender/line/others/colors.svg                                                                  |   10 
 app/account/layout.tsx                                                                                                          |   40 
 app/components/plugins/card/base/org-info.tsx                                                                                   |   30 
 app/components/base/file-uploader/dynamic-pdf-preview.tsx                                                                       |   17 
 app/components/base/prompt-editor/plugins/workflow-variable-block/index.tsx                                                     |   82 
 app/components/workflow/nodes/assigner/hooks.ts                                                                                 |   70 
 i18n/pt-BR/app-overview.ts                                                                                                      |  173 
 i18n/ro-RO/billing.ts                                                                                                           |  200 
 i18n/ru-RU/time.ts                                                                                                              |   37 
 i18n/de-DE/app-annotation.ts                                                                                                    |   87 
 app/components/base/icons/assets/vender/line/alertsAndFeedback/thumbs-up.svg                                                    |   10 
 app/components/base/icons/assets/public/thought/web-reader.svg                                                                  |   10 
 app/components/base/icons/assets/public/other/message-3-fill.svg                                                                |   23 
 app/components/base/icons/src/public/llm/index.ts                                                                               |   42 
 app/components/workflow/utils/variable.ts                                                                                       |   18 
 app/components/workflow/nodes/_base/components/error-handle/types.ts                                                            |   13 
 i18n/de-DE/dataset-settings.ts                                                                                                  |   43 
 app/components/base/chat/chat-with-history/header-in-mobile.tsx                                                                 |  152 
 app/components/base/icons/src/vender/line/files/File02.json                                                                     |   39 
 app/components/base/icons/src/vender/solid/FinanceAndECommerce/GoldCoin.tsx                                                     |   20 
 app/components/workflow/simple-node/index.tsx                                                                                   |  148 
 app/(commonLayout)/datasets/template/template.zh.mdx                                                                            | 2394 
 i18n/index.ts                                                                                                                   |   29 
 app/components/base/chat/chat-with-history/inputs-form/index.tsx                                                                |   79 
 app/components/datasets/documents/assets/target.svg                                                                             |   10 
 app/components/workflow/nodes/_base/components/input-var-type-icon.tsx                                                          |   32 
 app/components/workflow/run/loop-log/loop-result-panel.tsx                                                                      |  148 
 app/components/base/icons/src/vender/line/general/InfoCircle.json                                                               |   66 
 app/components/base/confirm/index.tsx                                                                                           |  108 
 app/components/base/features/new-feature-panel/annotation-reply/type.ts                                                         |    4 
 app/components/base/icons/assets/public/llm/azure-openai-service.svg                                                            |    7 
 app/components/base/icons/src/public/llm/IflytekSparkTextCn.json                                                                |   98 
 app/components/base/radio/ui.tsx                                                                                                |   18 
 app/components/header/account-setting/data-source-page/data-source-notion/index.tsx                                             |   85 
 app/signin/page.module.css                                                                                                      |    7 
 app/components/base/chat/embedded-chatbot/index.tsx                                                                             |  241 
 app/components/workflow/nodes/http/panel.tsx                                                                                    |  213 
 app/components/workflow/nodes/question-classifier/utils.ts                                                                      |    3 
 app/components/base/icons/src/public/plugins/Wikipedia.json                                                                     |   26 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/advanced-actions.tsx              |   59 
 public/vs/editor/editor.main.nls.ru.js                                                                                          |   15 
 app/components/base/icons/assets/vender/line/editor/left-indent-02.svg                                                          |    3 
 app/components/base/icons/src/public/tracing/index.ts                                                                           |    9 
 app/components/base/icons/src/vender/solid/FinanceAndECommerce/index.ts                                                         |    2 
 app/components/header/account-setting/members-page/invited-modal/invitation-link.tsx                                            |   62 
 docker/pm2.json                                                                                                                 |   11 
 app/components/datasets/documents/detail/completed/child-segment-list.tsx                                                       |  195 
 i18n/de-DE/register.ts                                                                                                          |    4 
 app/components/base/chat/__tests__/mixedTestMessages.json                                                                       |   42 
 app/components/base/chat/chat/answer/index.tsx                                                                                  |  239 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/cardView.tsx                                                          |  144 
 app/components/datasets/documents/style.module.css                                                                              |  118 
 app/components/workflow/nodes/tool/node.tsx                                                                                     |   53 
 app/account/account-page/AvatarWithEdit.tsx                                                                                     |  122 
 app/components/base/icons/src/vender/line/general/X.tsx                                                                         |   20 
 app/components/base/icons/src/public/common/MultiPathRetrieval.tsx                                                              |   20 
 i18n/vi-VN/layout.ts                                                                                                            |    4 
 app/components/app/annotation/batch-add-annotation-modal/index.tsx                                                              |  124 
 app/components/datasets/rename-modal/index.tsx                                                                                  |  110 
 app/components/workflow/nodes/assigner/components/var-list/index.tsx                                                            |  225 
 app/components/app/configuration/config-prompt/style.module.css                                                                 |   28 
 app/components/base/icons/src/vender/line/alertsAndFeedback/index.ts                                                            |    3 
 app/components/base/icons/src/vender/solid/security/Lock01.json                                                                 |   38 
 public/vs/basic-languages/bat/bat.js                                                                                            |   10 
 app/components/base/icons/src/public/llm/Gpt3.tsx                                                                               |   20 
 app/components/base/icons/src/vender/features/Vision.json                                                                       |   28 
 app/components/base/icons/assets/public/llm/chatglm.svg                                                                         |    9 
 app/components/base/icons/assets/vender/solid/development/database-02.svg                                                       |    5 
 app/components/plugins/permission-setting-modal/style.module.css                                                                |    7 
 app/components/base/file-uploader/pdf-preview.tsx                                                                               |  103 
 app/components/base/icons/assets/public/llm/cohere.svg                                                                          |   16 
 app/components/base/icons/assets/vender/solid/mediaAndDevices/play.svg                                                          |    5 
 app/components/base/icons/src/public/llm/Replicate.json                                                                         |   39 
 context/i18n.ts                                                                                                                 |   38 
 app/components/plugins/plugin-detail-panel/detail-header.tsx                                                                    |  312 
 app/components/datasets/create/assets/research-mod.svg                                                                          |    6 
 app/components/base/file-uploader/store.tsx                                                                                     |   67 
 app/(shareLayout)/layout.tsx                                                                                                    |   19 
 app/components/workflow/blocks.tsx                                                                                              |    5 
 app/components/workflow/panel/version-history-panel/filter/use-filter.ts                                                        |   17 
 app/components/base/icons/assets/vender/workflow/loop.svg                                                                       |    5 
 app/components/base/icons/src/public/llm/JinaText.json                                                                          |   82 
 app/components/workflow/run/agent-log/index.tsx                                                                                 |    2 
 app/components/base/icons/src/public/llm/OpenaiViolet.tsx                                                                       |   20 
 app/components/datasets/create/website/base/mock-crawl-result.ts                                                                |   24 
 i18n/zh-Hans/login.ts                                                                                                           |  110 
 app/components/app/configuration/debug/index.tsx                                                                                |  561 
 app/components/datasets/documents/detail/completed/common/add-another.tsx                                                       |   32 
 i18n/ro-RO/custom.ts                                                                                                            |   32 
 app/components/base/icons/src/image/llm/Tongyi.module.css                                                                       |    5 
 app/components/base/icons/assets/vender/solid/communication/message-dots-circle.svg                                             |    5 
 i18n/hi-IN/app.ts                                                                                                               |  214 
 public/education/bg.png                                                                                                         |    0 
 app/components/header/account-setting/model-provider-page/model-modal/index.tsx                                                 |  401 
 i18n/README.md                                                                                                                  |  175 
 i18n/tr-TR/app-annotation.ts                                                                                                    |   87 
 app/components/base/prompt-editor/plugins/component-picker-block/variable-option.tsx                                            |   60 
 app/components/workflow/help-line/types.ts                                                                                      |   11 
 app/components/tools/utils/index.ts                                                                                             |   27 
 app/components/base/icons/src/public/files/Html.tsx                                                                             |   20 
 app/components/workflow/operator/export-image.tsx                                                                               |  131 
 app/components/plugins/plugin-detail-panel/action-list.tsx                                                                      |  112 
 app/components/workflow/header/header-in-normal.tsx                                                                             |   69 
 app/components/datasets/create/assets/web.svg                                                                                   |    4 
 app/components/datasets/external-api/external-knowledge-api-card/index.tsx                                                      |  151 
 i18n/ja-JP/workflow.ts                                                                                                          |  920 
 app/components/base/icons/src/public/llm/ChatglmText.tsx                                                                        |   20 
 app/components/base/icons/src/public/llm/Replicate.tsx                                                                          |   20 
 app/components/base/chat/embedded-chatbot/inputs-form/view-form-dropdown.tsx                                                    |   52 
 i18n/ru-RU/tools.ts                                                                                                             |  158 
 app/components/datasets/documents/detail/completed/segment-detail.tsx                                                           |  185 
 app/components/base/icons/src/vender/solid/mediaAndDevices/Play.json                                                            |   38 
 app/components/share/text-generation/run-batch/res-download/index.tsx                                                           |   50 
 app/components/base/icons/assets/vender/solid/general/tool-03.svg                                                               |    9 
 app/components/workflow/run/loop-result-panel.tsx                                                                               |  124 
 app/components/workflow/run/retry-log/retry-log-trigger.tsx                                                                     |   41 
 app/reset-password/check-code/page.tsx                                                                                          |   96 
 app/components/billing/annotation-full/style.module.css                                                                         |    7 
 app/components/header/account-setting/model-provider-page/model-badge/index.tsx                                                 |   22 
 app/components/base/prompt-editor/utils.ts                                                                                      |  328 
 app/education-apply/hooks.ts                                                                                                    |   67 
 i18n/zh-Hant/app-annotation.ts                                                                                                  |   90 
 app/components/explore/item-operation/index.tsx                                                                                 |   90 
 app/components/workflow/nodes/start/default.ts                                                                                  |   23 
 public/vs/basic-languages/sql/sql.js                                                                                            |   10 
 app/components/base/icons/assets/vender/line/time/clock-play-slim.svg                                                           |    5 
 app/components/workflow/nodes/_base/components/title-description-input.tsx                                                      |   87 
 public/vs/base/common/worker/simpleWorker.nls.ja.js                                                                             |    8 
 app/components/base/date-and-time-picker/date-picker/header.tsx                                                                 |   41 
 public/vs/basic-languages/vb/vb.js                                                                                              |   10 
 app/components/base/icons/assets/vender/line/others/file-code.svg                                                               |    3 
 app/components/workflow/header/run-and-history.tsx                                                                              |  111 
 i18n/ja-JP/app-annotation.ts                                                                                                    |   90 
 app/components/app/configuration/config-prompt/confirm-add-var/index.tsx                                                        |   69 
 app/components/base/icons/assets/vender/line/time/clock-refresh.svg                                                             |    9 
 app/components/header/account-setting/model-provider-page/model-modal/model-load-balancing-entry-modal.tsx                      |  348 
 app/components/header/account-setting/data-source-page/panel/config-item.tsx                                                    |   83 
 app/components/share/text-generation/run-batch/index.tsx                                                                        |   59 
 app/components/app/configuration/tools/external-data-tool-modal.tsx                                                             |  304 
 app/components/base/icons/src/vender/line/layout/Grid01.json                                                                    |   83 
 public/vs/editor/editor.main.nls.ko.js                                                                                          |   13 
 app/(commonLayout)/apps/NewAppCard.tsx                                                                                          |  118 
 app/components/base/icons/assets/vender/line/others/long-arrow-right.svg                                                        |    3 
 app/components/base/icons/assets/vender/solid/development/pattern-recognition.svg                                               |   11 
 themes/dark.css                                                                                                                 |  739 
 app/components/plugins/install-plugin/base/use-get-icon.ts                                                                      |   16 
 app/components/base/icons/assets/public/llm/replicate-text.svg                                                                  |   13 
 app/components/base/icons/src/vender/line/general/Menu01.json                                                                   |   39 
 app/components/base/icons/src/vender/workflow/Iteration.json                                                                    |   36 
 app/components/base/icons/src/vender/solid/general/AnswerTriangle.tsx                                                           |   20 
 app/components/workflow/panel/chat-record/user-input.tsx                                                                        |   56 
 app/reset-password/page.tsx                                                                                                     |  102 
 i18n/es-ES/plugin-tags.ts                                                                                                       |   25 
 app/components/base/markdown-blocks/music.tsx                                                                                   |   37 
 app/components/app/configuration/config/automatic/style.module.css                                                              |    7 
 app/components/workflow/nodes/answer/utils.ts                                                                                   |    5 
 app/components/app/configuration/config-prompt/index.tsx                                                                        |  170 
 i18n/th-TH/dataset.ts                                                                                                           |  220 
 app/components/workflow/nodes/question-classifier/types.ts                                                                      |   18 
 app/components/base/icons/assets/public/common/n-to-1-retrieval.svg                                                             |   18 
 app/components/base/icons/src/vender/workflow/LoopEnd.json                                                                      |   38 
 app/components/base/icons/src/vender/solid/development/Database03.json                                                          |   28 
 app/components/base/icons/src/vender/solid/general/Eye.tsx                                                                      |   20 
 app/components/app/configuration/debug/debug-with-single-model/index.tsx                                                        |  185 
 i18n/ro-RO/dataset.ts                                                                                                           |  221 
 app/components/base/icons/src/public/billing/AwsMarketplace.tsx                                                                 |   20 
 app/components/base/icons/src/public/llm/Localai.tsx                                                                            |   20 
 app/components/workflow/note-node/note-editor/toolbar/font-size-selector.tsx                                                    |   84 
 app/components/datasets/create/step-two/escape.ts                                                                               |   18 
 public/screenshots/light/TextGenerator@2x.png                                                                                   |    0 
 app/components/base/icons/src/public/thought/index.ts                                                                           |    5 
 i18n/ko-KR/app-annotation.ts                                                                                                    |   87 
 app/components/plugins/marketplace/constants.ts                                                                                 |    4 
 app/components/workflow/nodes/llm/use-config.ts                                                                                 |  448 
 app/components/base/icons/src/vender/solid/general/ArrowDownRoundFill.tsx                                                       |   20 
 app/components/base/icons/src/public/files/Docx.tsx                                                                             |   20 
 app/components/base/icons/src/vender/solid/general/index.ts                                                                     |   18 
 public/vs/basic-languages/xml/xml.js                                                                                            |   10 
 app/components/tools/types.ts                                                                                                   |  170 
 app/components/base/icons/assets/vender/solid/general/edit-04.svg                                                               |    4 
 public/screenshots/light/Agent@2x.png                                                                                           |    0 
 app/forgot-password/ForgotPasswordForm.tsx                                                                                      |  123 
 i18n/tr-TR/time.ts                                                                                                              |   37 
 app/components/workflow/nodes/_base/components/help-link.tsx                                                                    |   36 
 app/components/base/icons/assets/vender/solid/general/arrow-down-round-fill.svg                                                 |    5 
 app/components/base/icons/assets/vender/line/mapsAndTravel/globe-01.svg                                                         |   10 
 app/components/base/icons/src/vender/line/development/PuzzlePiece01.json                                                        |   66 
 i18n/pt-BR/login.ts                                                                                                             |  110 
 app/components/datasets/create/stop-embedding-modal/index.tsx                                                                   |   45 
 app/components/datasets/hit-testing/components/result-item-footer.tsx                                                           |   42 
 app/components/base/icons/src/public/knowledge/ParentChildType.json                                                             |   56 
 app/components/app/configuration/debug/debug-with-multiple-model/context.tsx                                                    |   43 
 app/components/datasets/documents/detail/completed/common/keywords.tsx                                                          |   47 
 i18n/fa-IR/dataset-hit-testing.ts                                                                                               |   35 
 app/components/base/chat/embedded-chatbot/theme/utils.ts                                                                        |   29 
 app/components/base/segmented-control/index.tsx                                                                                 |   68 
 app/components/datasets/create/step-two/language-select/index.tsx                                                               |   62 
 app/components/base/icons/src/public/files/Xlsx.tsx                                                                             |   20 
 app/components/base/icons/src/vender/solid/general/Github.json                                                                  |   36 
 app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/picker/field.tsx                                |   77 
 public/screenshots/dark/TextGenerator@3x.png                                                                                    |    0 
 app/components/base/button/index.tsx                                                                                            |   62 
 i18n/zh-Hant/app-overview.ts                                                                                                    |  173 
 i18n/ro-RO/app-api.ts                                                                                                           |   85 
 i18n/fa-IR/app-overview.ts                                                                                                      |  173 
 app/components/base/chat/chat-with-history/context.tsx                                                                          |   94 
 app/components/share/utils.ts                                                                                                   |   75 
 app/components/base/chat/__tests__/branchedTestMessages.json                                                                    |   42 
 app/components/app/configuration/dataset-config/context-var/index.tsx                                                           |   37 
 app/components/base/icons/assets/vender/line/general/edit-04.svg                                                                |    3 
 app/components/base/icons/src/public/llm/Jina.json                                                                              |   35 
 app/components/base/prompt-editor/types.ts                                                                                      |   77 
 app/components/workflow/panel/env-panel/variable-trigger.tsx                                                                    |   67 
 app/components/base/chat/chat/log/index.tsx                                                                                     |   42 
 app/components/base/icons/assets/vender/line/general/settings-01.svg                                                            |   13 
 app/components/base/select/index.tsx                                                                                            |  382 
 app/components/datasets/documents/detail/batch-modal/index.tsx                                                                  |   66 
 public/vs/editor/editor.main.nls.es.js                                                                                          |   15 
 app/components/workflow/nodes/loop/insert-block.tsx                                                                             |   61 
 app/components/workflow/nodes/loop/components/condition-value.tsx                                                               |   98 
 app/components/base/icons/assets/vender/solid/communication/list-sparkle.svg                                                    |    6 
 app/components/base/file-uploader/index.ts                                                                                      |    7 
 app/components/base/button/index.css                                                                                            |  186 
 app/components/datasets/create/assets/watercrawl.svg                                                                            |   20 
 app/components/app-sidebar/style.module.css                                                                                     |   11 
 app/components/workflow/nodes/llm/components/prompt-generator-btn.tsx                                                           |   51 
 app/components/base/icons/src/public/llm/Baichuan.json                                                                          |   76 
 app/components/workflow/nodes/knowledge-retrieval/types.ts                                                                      |  133 
 app/components/header/assets/hugging-face.svg                                                                                   |   21 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-retry.ts                                                 |   39 
 i18n/th-TH/billing.ts                                                                                                           |  200 
 i18n/tr-TR/plugin-tags.ts                                                                                                       |   25 
 i18n/de-DE/app.ts                                                                                                               |  221 
 app/components/base/icons/assets/public/llm/replicate.svg                                                                       |    4 
 app/components/base/icons/src/vender/line/time/ClockPlaySlim.tsx                                                                |   20 
 app/components/base/icons/assets/vender/workflow/http.svg                                                                       |   10 
 app/components/plugins/install-plugin/install-bundle/ready-to-install.tsx                                                       |   57 
 app/components/header/account-setting/members-page/invited-modal/index.tsx                                                      |   99 
 app/components/billing/annotation-full/usage.tsx                                                                                |   32 
 app/components/workflow/nodes/_base/components/variable/var-type-picker.tsx                                                     |   71 
 app/components/base/ga/index.tsx                                                                                                |   60 
 app/components/base/icons/assets/vender/solid/mediaAndDevices/magic-eyes.svg                                                    |    5 
 app/components/share/text-generation/icons/star.svg                                                                             |    5 
 utils/context.ts                                                                                                                |   45 
 app/components/tools/add-tool-modal/empty.png                                                                                   |    0 
 app/(commonLayout)/apps/assets/github.svg                                                                                       |   17 
 app/components/workflow/hooks/use-workflow.ts                                                                                   |  559 
 app/components/base/icons/assets/vender/line/financeAndECommerce/tag-03.svg                                                     |    5 
 app/components/base/icons/src/vender/solid/development/Database02.tsx                                                           |   20 
 app/components/workflow/header/editing-title.tsx                                                                                |   42 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-config.tsx                                    |  301 
 app/components/workflow/nodes/if-else/default.ts                                                                                |   80 
 i18n/tr-TR/login.ts                                                                                                             |  110 
 app/components/base/chat/chat/loading-anim/style.module.css                                                                     |   82 
 app/components/base/icons/assets/vender/line/general/link-external-02.svg                                                       |    5 
 app/components/workflow/header/index.tsx                                                                                        |   51 
 app/components/base/param-item/score-threshold-item.tsx                                                                         |   54 
 i18n/fa-IR/explore.ts                                                                                                           |   44 
 app/components/header/app-back/index.tsx                                                                                        |   36 
 app/components/base/icons/assets/vender/line/others/bubble-x.svg                                                                |    8 
 app/components/datasets/external-knowledge-base/create/RetrievalSettings.tsx                                                    |   67 
 app/components/base/icons/assets/public/llm/gpt-4.svg                                                                           |    5 
 app/components/plugins/plugin-item/action.tsx                                                                                   |  165 
 app/components/datasets/create/assets/family-mod.svg                                                                            |    6 
 app/components/datasets/create/step-two/index.module.css                                                                        |  413 
 app/components/datasets/create/website/jina-reader/base/options-wrap.tsx                                                        |   55 
 app/components/plugins/base/badges/verified.tsx                                                                                 |   29 
 app/components/header/account-setting/model-provider-page/provider-added-card/priority-selector.tsx                             |   76 
 app/components/tools/add-tool-modal/index.tsx                                                                                   |  257 
 app/components/workflow/nodes/llm/components/structure-output.tsx                                                               |   75 
 app/components/workflow/store/workflow/help-line-slice.ts                                                                       |   19 
 app/components/base/icons/assets/vender/workflow/parameter-extractor.svg                                                        |   28 
 app/components/workflow/nodes/_base/components/editor/code-editor/style.css                                                     |   16 
 app/components/base/icons/src/public/billing/ArCube1.json                                                                       |   29 
 app/components/base/icons/src/vender/line/users/index.ts                                                                        |    2 
 app/components/workflow/nodes/llm/panel.tsx                                                                                     |  363 
 app/components/base/features/index.tsx                                                                                          |    1 
 app/components/base/portal-to-follow-elem/index.tsx                                                                             |  187 
 app/components/plugins/marketplace/utils.ts                                                                                     |  147 
 app/components/base/date-and-time-picker/calendar/index.tsx                                                                     |   27 
 app/components/datasets/create/index.tsx                                                                                        |  177 
 app/components/base/icons/src/public/billing/Buildings.json                                                                     |   39 
 app/components/base/icons/assets/vender/line/general/hash-02.svg                                                                |    5 
 app/components/base/new-audio-button/index.tsx                                                                                  |   99 
 app/components/workflow/header/view-history.tsx                                                                                 |  221 
 app/components/datasets/create/website/base/checkbox-with-label.tsx                                                             |   40 
 app/components/plugins/plugin-detail-panel/strategy-detail.tsx                                                                  |  164 
 app/components/base/icons/assets/public/llm/anthropic.svg                                                                       |    4 
 i18n/hi-IN/app-debug.ts                                                                                                         |  469 
 app/components/plugins/card/index.tsx                                                                                           |   97 
 i18n/uk-UA/dataset-documents.ts                                                                                                 |  395 
 app/components/base/icons/assets/vender/line/development/bar-chart-square-02.svg                                                |    5 
 app/(commonLayout)/plugins/page.tsx                                                                                             |   16 
 app/components/workflow/hooks/use-workflow-refresh-draft.ts                                                                     |    9 
 app/components/base/icons/src/vender/line/communication/CuteRobot.tsx                                                           |   20 
 hooks/use-pay.tsx                                                                                                               |  119 
 app/components/base/chat/chat-with-history/sidebar/operation.tsx                                                                |  101 
 app/components/datasets/documents/assets/graduationHat.svg                                                                      |    3 
 app/components/base/icons/assets/vender/solid/files/file-05.svg                                                                 |    8 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/actions.tsx                       |   56 
 i18n/uk-UA/app-debug.ts                                                                                                         |  418 
 app/(commonLayout)/tools/page.tsx                                                                                               |   28 
 public/vs/basic-languages/m3/m3.js                                                                                              |   10 
 app/components/app/annotation/list.tsx                                                                                          |   91 
 app/components/workflow/panel/version-history-panel/empty.tsx                                                                   |   30 
 app/components/workflow/custom-edge-linear-gradient-render.tsx                                                                  |   53 
 app/components/datasets/create/assets/jina.png                                                                                  |    0 
 app/components/plugins/marketplace/list/card-wrapper.tsx                                                                        |  103 
 app/components/workflow/nodes/answer/types.ts                                                                                   |    6 
 app/components/base/auto-height-textarea/index.tsx                                                                              |   96 
 app/components/header/account-setting/model-provider-page/provider-added-card/cooldown-timer.tsx                                |   64 
 hooks/use-theme.ts                                                                                                              |   13 
 app/components/base/button/index.spec.tsx                                                                                       |  110 
 app/components/base/input/index.spec.tsx                                                                                        |  124 
 public/vs/basic-languages/cypher/cypher.js                                                                                      |   10 
 app/components/base/icons/assets/vender/line/development/webhooks.svg                                                           |   12 
 app/components/plugins/install-plugin/install-bundle/steps/installed.tsx                                                        |   65 
 app/components/base/icons/assets/vender/solid/general/search-md.svg                                                             |    5 
 app/components/custom/custom-web-app-brand/index.tsx                                                                            |  319 
 app/components/datasets/create/assets/option-card-effect-blue.svg                                                               |   12 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/logs/page.tsx                                                                  |   11 
 app/components/workflow/nodes/variable-assigner/hooks.ts                                                                        |  165 
 app/components/base/icons/src/vender/solid/communication/MessageDotsCircle.json                                                 |   38 
 app/components/datasets/create/website/jina-reader/base/url-input.tsx                                                           |   48 
 app/components/base/icons/src/vender/solid/mediaAndDevices/AudioSupportIcon.tsx                                                 |   20 
 app/components/datasets/documents/detail/completed/common/chunk-content.tsx                                                     |  203 
 app/components/base/icons/assets/vender/line/alertsAndFeedback/alert-triangle.svg                                               |    5 
 app/components/header/dataset-nav/index.tsx                                                                                     |   65 
 service/sso.ts                                                                                                                  |   16 
 .vscode/extensions.json                                                                                                         |    7 
 i18n/de-DE/app-debug.ts                                                                                                         |  392 
 app/components/base/notion-page-selector/assets/search.svg                                                                      |    5 
 app/components/base/icons/src/vender/solid/mapsAndTravel/Globe06.tsx                                                            |   20 
 app/components/workflow/nodes/loop/use-is-var-file-attribute.ts                                                                 |   35 
 app/components/base/premium-badge/index.tsx                                                                                     |   74 
 app/components/base/icons/src/vender/other/Openai.tsx                                                                           |   20 
 app/components/base/premium-badge/index.css                                                                                     |   56 
 app/components/header/assets/trash.svg                                                                                          |    3 
 app/components/base/icons/src/public/llm/AnthropicText.json                                                                     |  539 
 app/components/base/icons/src/public/common/MultiPathRetrieval.json                                                             |  153 
 i18n/it-IT/share-app.ts                                                                                                         |   84 
 app/components/base/icons/src/vender/line/financeAndECommerce/Balance.tsx                                                       |   20 
 app/components/datasets/create/file-uploader/index.module.css                                                                   |  131 
 app/components/base/icons/src/vender/line/images/ImagePlus.json                                                                 |   39 
 app/components/workflow/nodes/_base/components/remove-button.tsx                                                                |   21 
 i18n/ko-KR/explore.ts                                                                                                           |   44 
 i18n/pt-BR/dataset-creation.ts                                                                                                  |  218 
 app/components/base/icons/src/public/llm/Azureai.tsx                                                                            |   20 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/assets/schema-generator-light.tsx   |   15 
 app/components/base/radio/component/radio/index.tsx                                                                             |   63 
 app/components/base/icons/src/public/llm/XorbitsInferenceText.json                                                              |  329 
 i18n/zh-Hans/workflow.ts                                                                                                        |  918 
 app/components/base/icons/src/vender/solid/mapsAndTravel/Route.tsx                                                              |   20 
 app/components/workflow/panel/version-history-panel/filter/filter-switch.tsx                                                    |   33 
 app/components/datasets/common/document-picker/index.tsx                                                                        |  118 
 app/components/workflow/nodes/knowledge-retrieval/node.tsx                                                                      |   50 
 app/components/explore/app-card/index.tsx                                                                                       |   70 
 app/components/base/icons/src/public/other/DefaultToolIcon.json                                                                 |   81 
 app/components/workflow/nodes/_base/components/next-step/container.tsx                                                          |   65 
 app/components/base/agent-log-modal/index.tsx                                                                                   |   61 
 app/components/base/tab-slider-plain/index.tsx                                                                                  |   78 
 app/components/plugins/install-plugin/hooks/use-check-installed.tsx                                                             |   33 
 app/components/base/icons/assets/vender/line/general/pin-01.svg                                                                 |    5 
 app/activate/page.tsx                                                                                                           |   20 
 app/components/app/overview/settings/index.tsx                                                                                  |  474 
 app/components/header/account-setting/data-source-page/index.module.css                                                         |    0 
 i18n/ko-KR/plugin-tags.ts                                                                                                       |   25 
 app/education-apply/user-info.tsx                                                                                               |   61 
 public/vs/basic-languages/fsharp/fsharp.js                                                                                      |   10 
 app/components/app/configuration/config-var/var-item.tsx                                                                        |   72 
 app/components/workflow/note-node/note-editor/toolbar/color-picker.tsx                                                          |  111 
 app/components/base/icons/src/public/common/D.tsx                                                                               |   20 
 app/components/datasets/documents/detail/completed/common/batch-action.tsx                                                      |  114 
 app/components/workflow/run/utils/format-log/parallel/index.ts                                                                  |  175 
 app/components/workflow/nodes/_base/hooks/use-one-step-run.ts                                                                   |  543 
 i18n/en-US/common.ts                                                                                                            |  671 
 models/share.ts                                                                                                                 |   48 
 app/components/app/type-selector/index.tsx                                                                                      |  168 
 i18n/uk-UA/app.ts                                                                                                               |  214 
 app/dev-preview/page.tsx                                                                                                        |   11 
 i18n/tr-TR/layout.ts                                                                                                            |    3 
 service/_tools_util.ts                                                                                                          |    5 
 i18n/ru-RU/custom.ts                                                                                                            |   32 
 app/components/base/icons/src/vender/line/mediaAndDevices/StopCircle.tsx                                                        |   20 
 i18n/zh-Hans/layout.ts                                                                                                          |    4 
 app/components/base/icons/assets/public/llm/xorbits-inference.svg                                                               |   24 
 i18n/ja-JP/login.ts                                                                                                             |  110 
 app/components/workflow/note-node/hooks.ts                                                                                      |   32 
 app/components/develop/template/template_advanced_chat.ja.mdx                                                                   | 1365 
 app/components/base/icons/assets/vender/line/layout/align-right-01.svg                                                          |    5 
 app/components/base/icons/src/public/common/Highlight.tsx                                                                       |   20 
 app/components/base/icons/src/public/plugins/WebReader.json                                                                     |   39 
 i18n/fr-FR/time.ts                                                                                                              |   37 
 i18n/zh-Hant/custom.ts                                                                                                          |   32 
 app/components/base/icons/assets/vender/solid/development/prompt-engineering.svg                                                |    8 
 app/components/base/date-and-time-picker/time-picker/header.tsx                                                                 |   16 
 app/components/app/configuration/base/icons/citation.tsx                                                                        |    0 
 app/components/base/icons/src/vender/line/layout/LayoutGrid02.tsx                                                               |   20 
 app/components/base/grid-mask/style.module.css                                                                                  |    5 
 app/components/datasets/create/assets/alert-triangle.svg                                                                        |    3 
 app/components/datasets/create/step-two/index.tsx                                                                               | 1175 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/config-button.tsx                                             |   71 
 app/components/workflow/nodes/loop-end/default.ts                                                                               |   23 
 app/components/datasets/create/step-two/option-card.tsx                                                                         |  106 
 app/components/workflow/run/hooks.ts                                                                                            |  115 
 app/components/base/file-icon/index.tsx                                                                                         |   55 
 app/components/base/float-popover-container/index.tsx                                                                           |   37 
 app/components/base/icons/assets/vender/workflow/end.svg                                                                        |    5 
 app/components/base/features/new-feature-panel/index.tsx                                                                        |  126 
 app/components/base/icons/src/public/billing/Group2.tsx                                                                         |   20 
 app/components/datasets/formatted-text/flavours/type.ts                                                                         |    5 
 app/components/base/icons/src/vender/line/development/BarChartSquare02.tsx                                                      |   20 
 app/components/base/icons/src/vender/solid/development/BarChartSquare02.tsx                                                     |   20 
 i18n/hi-IN/register.ts                                                                                                          |    3 
 i18n/pl-PL/common.ts                                                                                                            |  690 
 app/components/workflow/nodes/code/code-parser.ts                                                                               |   86 
 app/components/base/icons/assets/public/llm/openai-transparent.svg                                                              |    3 
 public/vs/basic-languages/graphql/graphql.js                                                                                    |   10 
 app/components/base/icons/src/public/billing/Sparkles.tsx                                                                       |   20 
 i18n/es-ES/workflow.ts                                                                                                          |  919 
 app/components/datasets/formatted-text/flavours/edit-slice.tsx                                                                  |  115 
 app/components/base/icons/src/public/llm/HuggingfaceTextHub.tsx                                                                 |   20 
 app/components/datasets/create/assets/Loading.svg                                                                               |   16 
 app/components/workflow/nodes/http/components/key-value/bulk-edit/index.tsx                                                     |   62 
 app/components/base/icons/src/vender/line/layout/index.ts                                                                       |    4 
 app/components/base/icons/src/public/llm/Zhipuai.json                                                                           |   53 
 app/components/datasets/create/assets/gold.svg                                                                                  |    4 
 Dockerfile                                                                                                                      |   76 
 app/components/base/icons/src/public/education/Triangle.tsx                                                                     |   20 
 app/components/datasets/create/assets/book-open-01.svg                                                                          |    4 
 app/components/base/icons/src/vender/line/general/InfoCircle.tsx                                                                |   20 
 app/components/base/slider/index.tsx                                                                                            |   41 
 app/components/base/textarea/index.tsx                                                                                          |   54 
 i18n/fr-FR/layout.ts                                                                                                            |    4 
 app/components/base/icons/assets/vender/line/general/link-03.svg                                                                |    8 
 app/components/base/icons/assets/vender/line/mediaAndDevices/stop-circle.svg                                                    |    8 
 config/index.ts                                                                                                                 |  332 
 app/components/base/icons/src/vender/line/files/FileDownload02.json                                                             |   29 
 app/components/base/icons/src/public/plugins/Wikipedia.tsx                                                                      |   20 
 app/components/base/icons/src/vender/workflow/Answer.json                                                                       |   38 
 app/components/workflow/hooks/use-nodes-sync-draft.ts                                                                           |   39 
 app/components/workflow/run/utils/format-log/agent/index.ts                                                                     |   99 
 i18n/pl-PL/plugin.ts                                                                                                            |  215 
 app/components/base/icons/assets/vender/line/financeAndECommerce/balance.svg                                                    |    3 
 app/components/base/file-uploader/file-image-render.tsx                                                                         |   32 
 app/components/base/icons/assets/public/files/pdf.svg                                                                           |   22 
 app/components/workflow/candidate-node.tsx                                                                                      |  111 
 app/components/base/icons/src/vender/line/general/Hash02.json                                                                   |   38 
 app/components/workflow/block-selector/tool/tool-list-flat-view/list.tsx                                                        |   64 
 i18n/zh-Hant/app.ts                                                                                                             |  213 
 app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsDown.json                                                     |   66 
 app/components/workflow/nodes/template-transform/utils.ts                                                                       |    5 
 app/components/workflow/store/workflow/chat-variable-slice.ts                                                                   |   34 
 app/components/workflow/block-selector/types.ts                                                                                 |   44 
 i18n/ro-RO/tools.ts                                                                                                             |  158 
 app/components/base/icons/assets/vender/solid/mediaAndDevices/microphone-01.svg                                                 |    8 
 app/components/base/icons/assets/public/billing/keyframe.svg                                                                    |    3 
 app/repos/[owner]/[repo]/releases/route.ts                                                                                      |   36 
 app/components/develop/template/template.ja.mdx                                                                                 |  706 
 app/components/workflow/nodes/_base/components/next-step/add.tsx                                                                |  108 
 public/vs/basic-languages/clojure/clojure.js                                                                                    |   10 
 app/components/app/configuration/base/icons/remove-icon/style.module.css                                                        |    0 
 public/vs/language/css/cssWorker.js                                                                                             |   78 
 app/components/header/account-setting/api-based-extension-page/index.tsx                                                        |   57 
 app/components/plugins/plugin-detail-panel/model-selector/index.tsx                                                             |  251 
 app/components/plugins/plugin-detail-panel/model-list.tsx                                                                       |   46 
 app/components/base/features/new-feature-panel/conversation-opener/modal.tsx                                                    |  223 
 app/components/base/icons/src/public/billing/Keyframe.tsx                                                                       |   20 
 app/components/base/icons/assets/public/files/yaml.svg                                                                          |    1 
 app/components/base/chat/chat/hooks.ts                                                                                          |  710 
 app/components/base/icons/src/public/common/Line3.tsx                                                                           |   20 
 i18n/uk-UA/dataset.ts                                                                                                           |  222 
 app/components/workflow/hooks/use-nodes-interactions.ts                                                                         | 1552 
 app/components/base/icons/src/vender/solid/communication/MessageSmileSquare.tsx                                                 |   20 
 app/components/base/icons/src/vender/solid/mediaAndDevices/MagicEyes.tsx                                                        |   20 
 app/components/datasets/documents/assets/bookOpen.svg                                                                           |    3 
 app/components/base/icons/src/public/plugins/VerifiedLight.tsx                                                                  |   20 
 i18n/fr-FR/dataset-hit-testing.ts                                                                                               |   35 
 app/components/base/icons/src/public/thought/ThoughtList.json                                                                   |   83 
 public/vs/basic-languages/razor/razor.js                                                                                        |   10 
 app/components/base/icons/assets/public/llm/iflytek-spark-text-cn.svg                                                           |   11 
 app/components/base/icons/src/vender/solid/education/Beaker02.tsx                                                               |   20 
 app/components/workflow/nodes/knowledge-retrieval/components/retrieval-config.tsx                                               |  156 
 app/components/base/icons/src/vender/line/arrows/ArrowUpRight.tsx                                                               |   20 
 app/components/base/form/components/label.spec.tsx                                                                              |   53 
 app/components/base/icons/src/vender/line/general/LogOut04.tsx                                                                  |   20 
 app/components/datasets/create/assets/Icon-3-dots.svg                                                                           |    3 
 app/components/base/icons/src/vender/line/mediaAndDevices/SlidersH.tsx                                                          |   20 
 i18n/sl-SI/dataset-creation.ts                                                                                                  |  218 
 app/components/workflow/nodes/_base/components/add-button.tsx                                                                   |   33 
 app/components/base/icons/src/public/billing/Asterisk.json                                                                      |   38 
 app/components/base/icons/src/vender/line/communication/AiText.json                                                             |   39 
 app/components/base/icons/assets/vender/workflow/code.svg                                                                       |    5 
 i18n/it-IT/education.ts                                                                                                         |   47 
 app/components/base/icons/src/public/thought/DataSet.tsx                                                                        |   20 
 app/components/plugins/plugin-page/filter-management/search-box.tsx                                                             |   30 
 app/components/plugins/plugin-page/use-uploader.ts                                                                              |   86 
 i18n/uk-UA/billing.ts                                                                                                           |  200 
 i18n/en-US/plugin.ts                                                                                                            |  215 
 app/components/workflow/datasets-detail-store/provider.tsx                                                                      |   53 
 app/components/base/icons/assets/vender/workflow/if-else.svg                                                                    |    5 
 i18n/sl-SI/tools.ts                                                                                                             |  158 
 i18n/en-US/workflow.ts                                                                                                          |  917 
 app/components/base/radio-card/simple/index.tsx                                                                                 |   45 
 app/components/base/icons/src/vender/line/others/Tools.tsx                                                                      |   20 
 app/components/plugins/marketplace/index.tsx                                                                                    |   72 
 app/components/tools/marketplace/index.tsx                                                                                      |  118 
 app/components/base/form/components/field/text.tsx                                                                              |   48 
 app/components/base/icons/src/vender/solid/mediaAndDevices/Sliders02.tsx                                                        |   20 
 i18n/DEV.md                                                                                                                     |   49 
 app/components/datasets/metadata/edit-metadata-batch/modal.tsx                                                                  |  189 
 app/components/plugins/install-plugin/install-bundle/index.tsx                                                                  |   75 
 app/components/datasets/external-knowledge-base/create/ExternalApiSelect.tsx                                                    |  110 
 app/components/workflow/nodes/_base/components/input-number-with-slider.tsx                                                     |   65 
 i18n/pt-BR/time.ts                                                                                                              |   37 
 app/components/workflow/block-selector/tool/tool.tsx                                                                            |  134 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/page.tsx                                                              |   28 
 app/components/base/grid-mask/index.tsx                                                                                         |   26 
 .storybook/preview.tsx                                                                                                          |   37 
 app/components/datasets/hit-testing/index.tsx                                                                                   |  216 
 app/components/base/icons/assets/vender/solid/development/semantic.svg                                                          |    6 
 app/components/plugins/marketplace/intersection-line/hooks.ts                                                                   |   30 
 public/vs/basic-languages/tcl/tcl.js                                                                                            |   10 
 app/components/base/features/new-feature-panel/text-to-speech/index.tsx                                                         |  102 
 public/vs/basic-languages/sparql/sparql.js                                                                                      |   10 
 app/components/base/icons/src/public/common/DiagonalDividingLine.tsx                                                            |   20 
 app/components/app/annotation/view-annotation-modal/index.tsx                                                                   |  215 
 app/components/base/chat/embedded-chatbot/chat-wrapper.tsx                                                                      |  264 
 app/components/workflow/nodes/http/components/authorization/index.tsx                                                           |  183 
 app/components/base/icons/src/vender/solid/development/BarChartSquare02.json                                                    |   38 
 app/components/base/icons/assets/vender/workflow/answer.svg                                                                     |    5 
 app/components/base/icons/src/public/llm/CohereText.json                                                                        |   90 
 app/components/base/icons/src/vender/line/files/FileText.tsx                                                                    |   20 
 postcss.config.js                                                                                                               |    6 
 app/components/workflow/panel/debug-and-preview/empty.tsx                                                                       |   19 
 app/components/base/icons/src/vender/line/mapsAndTravel/Globe01.json                                                            |   66 
 app/components/base/image-uploader/image-list.tsx                                                                               |  143 
 app/components/base/icons/assets/vender/line/files/file-02.svg                                                                  |    5 
 app/components/base/icons/src/vender/line/mediaAndDevices/Stop.tsx                                                              |   20 
 app/components/base/icons/assets/public/llm/Anthropic-dark.svg                                                                  |  186 
 app/components/base/form/components/form/submit-button.tsx                                                                      |   25 
 public/vs/language/html/htmlWorker.js                                                                                           |  452 
 app/components/base/with-input-validation/index.tsx                                                                             |   24 
 app/components/datasets/create/assets/setting-gear-mod.svg                                                                      |    4 
 app/components/app/annotation/header-opts/index.tsx                                                                             |  175 
 app/components/base/icons/src/vender/line/general/Pin01.json                                                                    |   39 
 i18n/sl-SI/app-annotation.ts                                                                                                    |   87 
 app/components/base/icons/src/public/other/RowStruct.json                                                                       |   56 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-finished.ts                                              |   72 
 app/components/workflow/note-node/note-editor/plugins/format-detector-plugin/hooks.ts                                           |   78 
 app/components/base/icons/src/image/llm/MinimaxText.tsx                                                                         |   20 
 app/components/app/overview/assets/chromeplugin-install.svg                                                                     |    6 
 app/components/base/icons/assets/vender/line/general/target-04.svg                                                              |   10 
 app/components/base/icons/assets/vender/solid/general/check-circle.svg                                                          |    5 
 i18n/pt-BR/explore.ts                                                                                                           |   44 
 app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-modal.tsx                    |  189 
 i18n/uk-UA/plugin-tags.ts                                                                                                       |   25 
 app/components/explore/item-operation/style.module.css                                                                          |   33 
 app/components/workflow/nodes/loop/components/condition-list/index.tsx                                                          |  126 
 app/components/workflow/nodes/_base/hooks/use-toggle-expend.ts                                                                  |   41 
 utils/format.spec.ts                                                                                                            |  104 
 app/components/app/configuration/debug/types.ts                                                                                 |   18 
 app/components/base/icons/assets/vender/solid/editor/brush-01.svg                                                               |    4 
 app/components/base/icons/assets/public/llm/iflytek-spark-text.svg                                                              |   24 
 app/components/base/icons/src/vender/line/others/Icon3Dots.json                                                                 |   39 
 app/components/workflow/nodes/loop/types.ts                                                                                     |   94 
 i18n/es-ES/layout.ts                                                                                                            |    4 
 i18n/hi-IN/app-annotation.ts                                                                                                    |   87 
 app/components/base/icons/assets/vender/solid/files/file-search-02.svg                                                          |    8 
 app/components/datasets/common/document-status-with-action/auto-disabled-document.tsx                                           |   38 
 context/app-context.tsx                                                                                                         |  159 
 app/components/workflow/nodes/http/components/timeout/index.tsx                                                                 |   93 
 app/components/base/chat/__tests__/realWorldMessages.json                                                                       |  441 
 app/components/base/icons/src/vender/line/arrows/ChevronRight.json                                                              |   39 
 app/components/workflow/nodes/http/hooks/use-key-value-list.ts                                                                  |   58 
 app/components/datasets/preview/index.tsx                                                                                       |    0 
 app/components/base/chat/chat/chat-input-area/operation.tsx                                                                     |   78 
 app/components/base/notion-page-selector/search-input/index.tsx                                                                 |   42 
 i18n/fa-IR/common.ts                                                                                                            |  672 
 hooks/use-breakpoints.spec.ts                                                                                                   |   93 
 app/components/plugins/install-plugin/base/version.tsx                                                                          |   34 
 app/components/base/icons/src/vender/line/general/UploadCloud01.json                                                            |   42 
 app/components/base/icons/src/vender/line/weather/Stars02.json                                                                  |   29 
 app/components/base/icons/src/vender/line/general/Plus02.tsx                                                                    |   20 
 app/components/base/icons/src/public/llm/OpenaiBlue.json                                                                        |   37 
 public/vs/basic-languages/rust/rust.js                                                                                          |   10 
 app/components/base/loading/style.css                                                                                           |   41 
 app/components/workflow/nodes/http/use-config.ts                                                                                |  235 
 app/components/workflow/nodes/if-else/components/condition-list/index.tsx                                                       |  136 
 app/components/base/icons/assets/vender/line/arrows/chevron-right.svg                                                           |    5 
 app/components/workflow/nodes/assigner/panel.tsx                                                                                |   68 
 app/components/base/icons/assets/vender/solid/development/bar-chart-square-02.svg                                               |    5 
 i18n/hi-IN/dataset-documents.ts                                                                                                 |  396 
 app/components/base/icons/src/vender/solid/editor/TypeSquare.tsx                                                                |   20 
 i18n/fa-IR/login.ts                                                                                                             |  110 
 app/components/base/icons/assets/vender/line/others/drag-handle.svg                                                             |    5 
 public/vs/basic-languages/javascript/javascript.js                                                                              |   10 
 i18n/sl-SI/dataset-hit-testing.ts                                                                                               |   35 
 app/components/base/icons/assets/image/llm/tongyi-text-cn.png                                                                   |    0 
 i18n/ko-KR/dataset-creation.ts                                                                                                  |  219 
 app/components/workflow/store/workflow/workflow-slice.ts                                                                        |   63 
 app/components/workflow/nodes/llm/utils.ts                                                                                      |  336 
 i18n/zh-Hans/app-annotation.ts                                                                                                  |   90 
 app/components/app/store.ts                                                                                                     |   54 
 i18n/zh-Hans/time.ts                                                                                                            |   38 
 app/components/tools/labels/constant.ts                                                                                         |    4 
 app/(commonLayout)/datasets/page.tsx                                                                                            |    7 
 app/components/base/modal-like-wrap/index.tsx                                                                                   |   58 
 app/account/delete-account/components/verify-email.tsx                                                                          |   55 
 app/components/datasets/documents/assets/cardLoading.svg                                                                        |   15 
 app/components/workflow/hooks/use-selection-interactions.ts                                                                     |  140 
 i18n/hi-IN/education.ts                                                                                                         |   47 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/tracing-icon.tsx                                              |   28 
 app/components/billing/pricing/index.tsx                                                                                        |  146 
 app/components/base/icons/src/vender/line/general/Upload03.tsx                                                                  |   20 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/hooks.ts                                    |  441 
 app/components/base/icons/src/vender/line/general/Edit05.tsx                                                                    |   20 
 i18n/pl-PL/app-log.ts                                                                                                           |  102 
 app/components/base/icons/src/public/files/Json.json                                                                            |  178 
 service/fetch.ts                                                                                                                |  208 
 app/components/datasets/api/index.tsx                                                                                           |    9 
 app/components/billing/pricing/select-plan-range.tsx                                                                            |   54 
 app/components/base/prompt-editor/plugins/query-block/component.tsx                                                             |   33 
 app/components/app/configuration/base/warning-mask/has-not-set-api.tsx                                                          |   38 
 app/components/app/configuration/config-var/modal-foot.tsx                                                                      |   24 
 app/components/base/icons/src/vender/solid/shapes/Star04.json                                                                   |   36 
 i18n/zh-Hans/plugin-tags.ts                                                                                                     |   25 
 app/components/base/chat/chat/citation/progress-tooltip.tsx                                                                     |   46 
 app/components/workflow/nodes/knowledge-retrieval/panel.tsx                                                                     |  221 
 app/components/workflow/nodes/answer/default.ts                                                                                 |   36 
 app/components/base/icons/src/vender/solid/communication/Logic.json                                                             |   53 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/field.tsx                                                     |   41 
 app/components/datasets/create/assets/file.svg                                                                                  |    4 
 app/components/header/account-setting/model-provider-page/provider-added-card/model-list.tsx                                    |  102 
 app/components/base/icons/src/vender/solid/communication/MessageHeartCircle.tsx                                                 |   20 
 public/vs/base/common/worker/simpleWorker.nls.de.js                                                                             |    8 
 app/components/base/icons/assets/public/tracing/weave-icon.svg                                                                  |   33 
 app/components/base/icons/assets/vender/line/time/clock-fast-forward.svg                                                        |    3 
 app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout-main.tsx                                                   |  199 
 i18n/ko-KR/dataset.ts                                                                                                           |  220 
 public/favicon.ico                                                                                                              |    0 
 app/components/base/icons/assets/public/llm/zhipuai-text-cn.svg                                                                 |    8 
 app/components/base/icons/src/vender/solid/security/index.ts                                                                    |    1 
 app/components/datasets/create/website/base/crawled-result.tsx                                                                  |   89 
 app/components/base/icons/assets/vender/line/financeAndECommerce/gold-coin.svg                                                  |   16 
 app/components/base/icons/src/vender/line/development/TerminalSquare.tsx                                                        |   20 
 app/components/workflow/header/chat-variable-button.tsx                                                                         |   24 
 app/components/base/icons/src/public/llm/Localai.json                                                                           |  107 
 app/components/base/icons/src/vender/solid/shapes/Corner.json                                                                   |   27 
 app/components/base/icons/src/public/llm/ZhipuaiText.tsx                                                                        |   20 
 app/components/plugins/install-plugin/install-from-local-package/index.tsx                                                      |  133 
 app/components/app/configuration/debug/hooks.tsx                                                                                |  158 
 app/components/base/icons/src/vender/line/financeAndECommerce/index.ts                                                          |    6 
 public/screenshots/dark/Workflow.png                                                                                            |    0 
 app/components/app/overview/assets/iframe-option.svg                                                                            |  102 
 app/components/base/icons/src/public/plugins/VerifiedDark.tsx                                                                   |   20 
 app/components/workflow/nodes/if-else/panel.tsx                                                                                 |   87 
 app/components/base/icons/src/public/llm/AzureaiText.tsx                                                                        |   20 
 app/components/base/icons/src/public/llm/ChatglmText.json                                                                       |  135 
 app/components/base/icons/assets/vender/solid/security/lock-01.svg                                                              |    5 
 app/components/workflow/run/agent-log/agent-result-panel.tsx                                                                    |   60 
 app/components/base/icons/assets/public/tracing/langsmith-icon-big.svg                                                          |   24 
 app/components/workflow/nodes/http/utils.ts                                                                                     |   21 
 i18n/de-DE/plugin.ts                                                                                                            |  215 
 i18n/it-IT/custom.ts                                                                                                            |   33 
 i18n/pl-PL/register.ts                                                                                                          |    4 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/store.ts                                    |   34 
 app/components/base/icons/src/vender/solid/education/Beaker02.json                                                              |   38 
 app/components/base/icons/assets/public/knowledge/general-type.svg                                                              |    5 
 app/components/workflow/nodes/template-transform/default.ts                                                                     |   38 
 app/components/base/param-item/index.tsx                                                                                        |   79 
 app/components/header/account-setting/data-source-page/data-source-notion/operate/index.tsx                                     |  101 
 app/components/base/icons/src/vender/line/general/Upload03.json                                                                 |   66 
 app/components/base/chat/types.ts                                                                                               |   86 
 app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-configs.tsx                  |  274 
 hooks/use-i18n.ts                                                                                                               |    9 
 i18n/zh-Hans/app-api.ts                                                                                                         |   85 
 app/components/base/icons/assets/public/billing/buildings.svg                                                                   |    5 
 app/styles/preflight.css                                                                                                        |  379 
 app/components/base/icons/src/vender/solid/layout/index.ts                                                                      |    1 
 i18n/ro-RO/app-log.ts                                                                                                           |   98 
 public/vs/basic-languages/lexon/lexon.js                                                                                        |   10 
 i18n/zh-Hans/run-log.ts                                                                                                         |   31 
 app/components/base/icons/src/vender/solid/editor/Citations.json                                                                |   36 
 public/vs/language/html/htmlMode.js                                                                                             |   13 
 app/components/base/icons/src/vender/line/editor/index.ts                                                                       |    8 
 app/components/workflow/nodes/http/components/curl-panel.tsx                                                                    |  160 
 app/components/app/overview/assets/refresh.svg                                                                                  |    3 
 app/components/base/icons/src/vender/solid/mediaAndDevices/MagicWand.tsx                                                        |   20 
 app/components/plugins/plugin-detail-panel/endpoint-modal.tsx                                                                   |   96 
 app/components/base/icons/src/vender/solid/communication/AiText.json                                                            |   53 
 app/components/base/icons/assets/vender/line/users/users-01.svg                                                                 |    5 
 app/components/base/icons/src/public/llm/ZhipuaiText.json                                                                       |   44 
 i18n/th-TH/plugin-tags.ts                                                                                                       |   25 
 app/components/base/copy-feedback/style.module.css                                                                              |   15 
 app/components/base/icons/src/public/knowledge/Chunk.json                                                                       |  116 
 app/components/base/icons/assets/vender/solid/mediaAndDevices/magic-wand.svg                                                    |   10 
 app/components/base/icons/src/vender/line/general/Settings01.tsx                                                                |   20 
 app/components/base/markdown-blocks/think-block.tsx                                                                             |   99 
 app/components/base/icons/assets/public/common/highlight.svg                                                                    |    9 
 app/components/workflow-app/hooks/index.ts                                                                                      |    7 
 app/components/base/icons/src/vender/line/files/index.ts                                                                        |   11 
 app/components/workflow/header/header-in-restoring.tsx                                                                          |   93 
 public/vs/language/json/jsonWorker.js                                                                                           |   36 
 app/components/workflow/panel-contextmenu.tsx                                                                                   |  130 
 app/components/base/icons/src/vender/line/general/Edit05.json                                                                   |   66 
 app/components/datasets/metadata/hooks/use-batch-edit-document-metadata.ts                                                      |  143 
 app/components/develop/secret-key/secret-key-generate.tsx                                                                       |   41 
 app/components/base/icons/assets/vender/line/files/clipboard.svg                                                                |    3 
 app/components/workflow/help-line/index.tsx                                                                                     |   72 
 app/components/base/icons/src/vender/solid/development/ApiConnection.json                                                       |   53 
 app/components/base/chat/chat/content-switch.tsx                                                                                |   39 
 public/vs/basic-languages/scss/scss.js                                                                                          |   12 
 app/components/base/icons/src/image/llm/Wxyy.module.css                                                                         |    5 
 utils/permission.ts                                                                                                             |   18 
 app/components/base/icons/assets/vender/solid/shapes/star-04.svg                                                                |    5 
 app/components/workflow/nodes/_base/components/collapse/index.tsx                                                               |   69 
 utils/classnames.ts                                                                                                             |    8 
 app/components/base/icons/assets/public/billing/azure.svg                                                                       |   25 
 app/components/base/icons/src/vender/line/time/ClockRefresh.tsx                                                                 |   20 
 app/components/datasets/metadata/metadata-document/no-data.tsx                                                                  |   27 
 app/components/workflow/nodes/_base/components/variable-tag.tsx                                                                 |   94 
 app/components/base/icons/assets/vender/workflow/variable-x.svg                                                                 |    5 
 app/components/base/voice-input/index.tsx                                                                                       |  216 
 i18n/uk-UA/login.ts                                                                                                             |  110 
 app/components/workflow/header/checklist.tsx                                                                                    |  166 
 public/screenshots/dark/Workflow@3x.png                                                                                         |    0 
 app/components/datasets/formatted-text/formatted.tsx                                                                            |   12 
 app/components/base/icons/src/public/llm/AnthropicDark.tsx                                                                      |   20 
 app/components/base/icons/src/vender/line/general/CheckDone01.json                                                              |   39 
 app/components/workflow/nodes/assigner/utils.ts                                                                                 |   83 
 app/components/workflow/panel/global-variable-panel/index.tsx                                                                   |   54 
 app/components/base/icons/src/public/billing/AwsMarketplace.json                                                                |  179 
 app/components/header/account-dropdown/index.tsx                                                                                |  223 
 service/billing.ts                                                                                                              |   14 
 app/components/app/configuration/config-vision/param-config.tsx                                                                 |   42 
 app/components/explore/sidebar/index.tsx                                                                                        |  153 
 public/vs/basic-languages/ruby/ruby.js                                                                                          |   10 
 app/components/base/chat/chat/utils.ts                                                                                          |   52 
 public/vs/basic-languages/restructuredtext/restructuredtext.js                                                                  |   10 
 app/components/workflow/nodes/loop/components/condition-list/condition-var-selector.tsx                                         |   58 
 app/components/base/icons/src/public/files/Doc.tsx                                                                              |   20 
 public/vs/basic-languages/scala/scala.js                                                                                        |   10 
 app/components/plugins/install-plugin/hooks/use-fold-anim-into.ts                                                               |   57 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/type.ts                                                       |   32 
 app/components/base/tooltip/content.tsx                                                                                         |   22 
 app/components/base/icons/src/vender/line/others/GlobalVariable.json                                                            |   28 
 app/components/datasets/common/check-rerank-model.ts                                                                            |   70 
 app/components/base/icons/src/vender/line/general/LogOut01.json                                                                 |   39 
 app/components/base/icons/assets/vender/line/files/file-arrow-01.svg                                                            |    5 
 app/components/billing/billing-page/index.tsx                                                                                   |   40 
 i18n/th-TH/share-app.ts                                                                                                         |   78 
 app/components/datasets/metadata/edit-metadata-batch/input-combined.tsx                                                         |   61 
 app/components/base/icons/src/public/llm/OpenaiText.tsx                                                                         |   20 
 app/components/develop/template/template.zh.mdx                                                                                 |  967 
 app/components/workflow/block-selector/tool-picker.tsx                                                                          |  176 
 app/components/base/prompt-editor/plugins/component-picker-block/prompt-option.tsx                                              |   45 
 app/components/base/icons/assets/vender/line/others/long-arrow-left.svg                                                         |    3 
 app/components/workflow/run/utils/format-log/loop/index.ts                                                                      |   56 
 app/components/workflow/block-selector/index-bar.tsx                                                                            |   97 
 i18n/fr-FR/run-log.ts                                                                                                           |   31 
 service/apps.ts                                                                                                                 |  179 
 app/components/workflow/style.css                                                                                               |   24 
 public/vs/basic-languages/dart/dart.js                                                                                          |   10 
 app/components/base/avatar/index.tsx                                                                                            |   54 
 app/components/header/index.module.css                                                                                          |   15 
 app/components/workflow/nodes/_base/components/agent-strategy.tsx                                                               |  239 
 app/components/base/svg/index.tsx                                                                                               |   22 
 i18n/hi-IN/share-app.ts                                                                                                         |   85 
 app/components/base/chat/chat/context.tsx                                                                                       |   66 
 app/components/header/account-setting/members-page/invite-modal/index.tsx                                                       |  123 
 app/components/app/switch-app-modal/index.tsx                                                                                   |  174 
 app/reset-password/layout.tsx                                                                                                   |   27 
 i18n/pt-BR/share-app.ts                                                                                                         |   82 
 app/components/base/mermaid/index.tsx                                                                                           |  590 
 app/components/workflow/nodes/iteration/types.ts                                                                                |   20 
 app/components/base/features/new-feature-panel/image-upload/index.tsx                                                           |  114 
 app/components/base/icons/src/vender/workflow/QuestionClassifier.tsx                                                            |   20 
 app/components/base/icons/src/vender/features/TextToAudio.json                                                                  |   77 
 app/components/base/icons/src/vender/solid/development/PromptEngineering.json                                                   |   53 
 app/components/workflow/header/global-variable-button.tsx                                                                       |   20 
 app/components/workflow-app/hooks/use-workflow-template.ts                                                                      |   74 
 app/components/base/icons/src/vender/workflow/End.json                                                                          |   38 
 app/components/workflow/panel/chat-variable-panel/components/object-value-item.tsx                                              |  135 
 app/components/workflow/nodes/_base/components/retry/retry-on-node.tsx                                                          |   91 
 app/components/header/account-dropdown/compliance.tsx                                                                           |  185 
 i18n/ru-RU/education.ts                                                                                                         |   47 
 app/components/workflow/nodes/_base/components/install-plugin-button.tsx                                                        |   45 
 i18n/de-DE/layout.ts                                                                                                            |    4 
 app/components/plugins/plugin-page/plugin-tasks/hooks.ts                                                                        |  100 
 app/components/base/icons/src/vender/line/files/FilePlus02.tsx                                                                  |   20 
 app/components/base/tag-management/selector.tsx                                                                                 |  278 
 app/components/base/icons/src/public/common/Soc2.tsx                                                                            |   20 
 app/components/base/video-gallery/VideoPlayer.module.css                                                                        |  188 
 app/components/workflow/nodes/_base/components/panel-operator/change-block.tsx                                                  |   71 
 app/components/workflow/constants.ts                                                                                            |  597 
 app/components/workflow-app/components/workflow-header/chat-variable-trigger.tsx                                                |   17 
 app/components/datasets/create/website/jina-reader/base/input.tsx                                                               |   58 
 app/components/base/icons/src/public/llm/OpenaiViolet.json                                                                      |   37 
 app/components/datasets/chunk.tsx                                                                                               |   56 
 app/components/base/icons/src/vender/solid/general/ZapFast.tsx                                                                  |   20 
 app/components/workflow/block-selector/tool/action-item.tsx                                                                     |   90 
 app/components/workflow/hooks/use-config-vision.ts                                                                              |   88 
 i18n/fa-IR/custom.ts                                                                                                            |   32 
 app/components/plugins/marketplace/plugin-type-switch.tsx                                                                       |  120 
 app/components/base/file-uploader/utils.ts                                                                                      |  196 
 app/components/header/account-setting/model-provider-page/model-selector/model-trigger.tsx                                      |   78 
 app/components/workflow/nodes/_base/components/next-step/line.tsx                                                               |   73 
 app/components/base/icons/assets/vender/line/files/file-download-02.svg                                                         |    3 
 app/components/app/overview/embedded/index.tsx                                                                                  |  193 
 i18n/hi-IN/app-api.ts                                                                                                           |   85 
 app/components/base/icons/src/public/tracing/OpikIconBig.tsx                                                                    |   20 
 app/components/datasets/documents/detail/completed/display-toggle.tsx                                                           |   40 
 app/components/workflow/nodes/variable-assigner/components/node-variable-item.tsx                                               |  111 
 app/components/workflow/panel/debug-and-preview/hooks.ts                                                                        |  506 
 i18n/hi-IN/app-log.ts                                                                                                           |  106 
 app/components/base/icons/src/vender/solid/mediaAndDevices/Sliders02.json                                                       |   77 
 app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx                                             |  130 
 i18n/fr-FR/dataset-documents.ts                                                                                                 |  395 
 i18n/pl-PL/app-api.ts                                                                                                           |  104 
 app/components/header/nav/nav-selector/index.tsx                                                                                |  189 
 app/components/datasets/create/website/preview.tsx                                                                              |   41 
 app/components/base/icons/src/vender/line/layout/AlignLeft01.json                                                               |   39 
 utils/get-icon.ts                                                                                                               |    5 
 app/components/base/icons/IconBase.spec.tsx                                                                                     |   67 
 app/components/workflow/nodes/_base/hooks/use-resize-panel.ts                                                                   |  121 
 app/(commonLayout)/datasets/connect/page.tsx                                                                                    |    8 
 app/components/base/icons/assets/public/llm/azureai.svg                                                                         |   23 
 app/(commonLayout)/datasets/Datasets.tsx                                                                                        |   98 
 app/components/base/drawer/index.tsx                                                                                            |   94 
 app/components/base/icons/src/public/files/Json.tsx                                                                             |   20 
 app/components/app/text-generate/saved-items/no-data/index.tsx                                                                  |   42 
 app/components/base/chat/chat/thought/index.tsx                                                                                 |   58 
 app/components/datasets/common/document-status-with-action/status-with-action.tsx                                               |   70 
 app/components/app/configuration/base/warning-mask/formatting-changed.tsx                                                       |   41 
 app/components/workflow/nodes/tool/components/input-var-list.tsx                                                                |  247 
 app/components/datasets/preview/header.tsx                                                                                      |   23 
 app/components/datasets/create/website/index.tsx                                                                                |  161 
 app/components/app/configuration/debug/debug-with-multiple-model/index.tsx                                                      |  171 
 app/components/base/chat/chat/citation/tooltip.tsx                                                                              |   46 
 app/components/base/icons/assets/vender/workflow/docs-extractor.svg                                                             |    9 
 i18n/vi-VN/explore.ts                                                                                                           |   44 
 app/components/base/icons/src/vender/line/arrows/ReverseLeft.tsx                                                                |   20 
 app/components/share/text-generation/result/header.tsx                                                                          |  113 
 public/screenshots/dark/Chatflow.png                                                                                            |    0 
 app/components/workflow/nodes/parameter-extractor/default.ts                                                                    |   69 
 app/components/workflow/nodes/parameter-extractor/use-config.ts                                                                 |  307 
 app/components/base/icons/src/public/llm/IflytekSparkTextCn.tsx                                                                 |   20 
 app/components/base/app-icon-picker/index.tsx                                                                                   |  150 
 app/components/base/icons/src/vender/features/Document.tsx                                                                      |   20 
 i18n/th-TH/education.ts                                                                                                         |   47 
 app/components/datasets/settings/index-method-radio/assets/high-quality.svg                                                     |   12 
 app/components/workflow/hooks/index.ts                                                                                          |   19 
 app/components/workflow/nodes/http/node.tsx                                                                                     |   30 
 public/vs/basic-languages/cpp/cpp.js                                                                                            |   10 
 app/components/datasets/settings/index-method-radio/assets/economy.svg                                                          |    5 
 app/components/base/icons/src/vender/plugin/BoxSparkleFill.json                                                                 |   66 
 app/components/header/account-setting/Integrations-page/index.tsx                                                               |   74 
 app/components/base/icons/src/vender/line/development/Database01.tsx                                                            |   20 
 assets/docx.svg                                                                                                                 |   23 
 app/components/workflow/nodes/loop/components/loop-variables/variable-type-select.tsx                                           |   51 
 app/components/base/icons/assets/public/tracing/langfuse-icon.svg                                                               |   32 
 app/components/header/tools-nav/index.tsx                                                                                       |   39 
 i18n/fa-IR/layout.ts                                                                                                            |    4 
 app/components/base/icons/src/vender/solid/communication/AiText.tsx                                                             |   20 
 app/components/workflow/block-selector/view-type-select.tsx                                                                     |   58 
 app/components/workflow/hooks/use-workflow-interactions.ts                                                                      |  403 
 app/components/workflow/note-node/note-editor/store.ts                                                                          |   72 
 app/components/base/icons/src/vender/line/editor/Colors.json                                                                    |   39 
 app/components/workflow/nodes/question-classifier/components/class-item.tsx                                                     |   60 
 app/(shareLayout)/completion/[token]/page.tsx                                                                                   |   10 
 app/components/tools/add-tool-modal/tools.tsx                                                                                   |  150 
 app/components/plugins/plugin-page/plugin-tasks/index.tsx                                                                       |  194 
 public/screenshots/dark/Chatbot.png                                                                                             |    0 
 app/components/workflow/header/restoring-title.tsx                                                                              |   49 
 app/components/workflow/panel/global-variable-panel/item.tsx                                                                    |   30 
 app/components/workflow/nodes/_base/components/error-handle/default-value.tsx                                                   |   89 
 app/components/base/icons/src/vender/line/general/LinkExternal02.tsx                                                            |   20 
 app/components/workflow/nodes/variable-assigner/components/node-group-item.tsx                                                  |  151 
 app/components/workflow/utils/workflow-init.spec.ts                                                                             |   69 
 app/components/base/loading/index.tsx                                                                                           |   29 
 app/components/workflow/nodes/_base/components/retry/style.module.css                                                           |    5 
 public/vs/basic-languages/twig/twig.js                                                                                          |   10 
 app/components/base/icons/src/vender/solid/alertsAndFeedback/index.ts                                                           |    1 
 app/components/workflow/nodes/_base/components/node-control.tsx                                                                 |   94 
 app/components/base/icons/src/vender/line/arrows/ArrowUpRight.json                                                              |   39 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-number.tsx                       |   88 
 app/components/workflow/nodes/loop/components/condition-list/condition-item.tsx                                                 |  330 
 app/components/workflow/store/workflow/form-slice.ts                                                                            |   18 
 app/components/workflow/note-node/note-editor/context.tsx                                                                       |   65 
 app/components/workflow/nodes/template-transform/node.tsx                                                                       |   13 
 i18n/vi-VN/app-debug.ts                                                                                                         |  418 
 app/components/base/icons/src/vender/line/development/Variable.tsx                                                              |   20 
 app/components/workflow/nodes/llm/components/config-prompt.tsx                                                                  |  247 
 app/components/datasets/metadata/edit-metadata-batch/label.tsx                                                                  |   27 
 app/components/base/icons/src/vender/solid/editor/TypeSquare.json                                                               |   28 
 app/components/base/icons/src/vender/line/communication/ChatBotSlim.tsx                                                         |   20 
 app/components/base/icons/src/public/common/Dify.json                                                                           |   62 
 app/components/base/icons/src/vender/line/general/Link03.tsx                                                                    |   20 
 app/components/base/float-right-container/index.tsx                                                                             |   23 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts                                                  |   53 
 public/screenshots/light/Workflow@3x.png                                                                                        |    0 
 app/components/plugins/plugin-detail-panel/app-selector/app-inputs-panel.tsx                                                    |  180 
 app/components/base/icons/src/vender/solid/users/Users01.tsx                                                                    |   20 
 app/components/base/icons/assets/public/llm/huggingface.svg                                                                     |   19 
 app/components/datasets/metadata/metadata-dataset/dataset-metadata-drawer.tsx                                                   |  248 
 models/app.ts                                                                                                                   |  115 
 i18n/hi-IN/layout.ts                                                                                                            |    4 
 app/components/datasets/hit-testing/style.module.css                                                                            |   43 
 i18n/uk-UA/register.ts                                                                                                          |    4 
 app/components/datasets/external-api/external-api-modal/Form.tsx                                                                |   92 
 app/components/workflow/panel/version-history-panel/restore-confirm-modal.tsx                                                   |   42 
 app/components/base/icons/assets/vender/line/development/database-01.svg                                                        |    3 
 app/components/workflow/panel/chat-variable-panel/components/array-value-list.tsx                                               |   72 
 i18n/zh-Hans/app-log.ts                                                                                                         |   98 
 app/components/base/icons/src/public/llm/Jina.tsx                                                                               |   20 
 app/components/plugins/plugin-page/filter-management/category-filter.tsx                                                        |  127 
 app/components/develop/secret-key/secret-key-modal.tsx                                                                          |  147 
 app/components/datasets/create/website/jina-reader/header.tsx                                                                   |   43 
 app/components/plugins/plugin-detail-panel/endpoint-card.tsx                                                                    |  219 
 hooks/use-mitt.ts                                                                                                               |   74 
 app/components/base/prompt-editor/plugins/tree-view.tsx                                                                         |   19 
 app/components/datasets/hit-testing/components/child-chunks-item.tsx                                                            |   30 
 app/components/base/chat/chat/question.tsx                                                                                      |  178 
 utils/var-basePath.js                                                                                                           |    6 
 i18n/fr-FR/app-overview.ts                                                                                                      |  173 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-trigger.tsx                                      |   69 
 app/components/workflow/nodes/_base/node.tsx                                                                                    |  323 
 app/components/base/icons/src/vender/line/general/ChecklistSquare.json                                                          |   36 
 app/components/base/icons/src/public/llm/AzureaiText.json                                                                       |  243 
 app/components/base/icons/assets/vender/solid/communication/bubble-text-mod.svg                                                 |    3 
 app/components/base/icons/src/public/llm/AnthropicText.tsx                                                                      |   20 
 i18n/ru-RU/run-log.ts                                                                                                           |   31 
 app/components/base/icons/src/vender/line/financeAndECommerce/Tag03.json                                                        |   39 
 i18n/pt-BR/layout.ts                                                                                                            |    4 
 app/components/base/install-button/index.tsx                                                                                    |   27 
 public/vs/editor/editor.main.nls.it.js                                                                                          |   13 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-next.ts                                        |   35 
 app/components/base/features/types.ts                                                                                           |   79 
 app/components/base/chat/chat/try-to-ask.tsx                                                                                    |   47 
 app/components/base/icons/assets/public/files/docx.svg                                                                          |   23 
 app/components/workflow/hooks/use-edges-interactions-without-sync.ts                                                            |   27 
 app/components/base/icons/src/public/llm/OpenaiGreen.json                                                                       |   37 
 app/components/base/content-dialog/index.tsx                                                                                    |   51 
 app/components/workflow/panel/debug-and-preview/index.tsx                                                                       |  144 
 i18n/es-ES/share-app.ts                                                                                                         |   82 
 app/components/develop/index.tsx                                                                                                |   35 
 i18n/fr-FR/custom.ts                                                                                                            |   32 
 i18n/es-ES/billing.ts                                                                                                           |  200 
 app/components/base/icons/src/vender/plugin/BoxSparkleFill.tsx                                                                  |   20 
 app/components/billing/apps-full-in-dialog/index.tsx                                                                            |   84 
 app/components/datasets/documents/detail/metadata/index.tsx                                                                     |  377 
 i18n/ja-JP/dataset-documents.ts                                                                                                 |  394 
 app/components/base/icons/src/image/llm/WxyyTextCn.tsx                                                                          |   20 
 app/components/base/icons/src/vender/workflow/Loop.json                                                                         |   38 
 app/components/workflow/run/agent-log/agent-log-nav.tsx                                                                         |   78 
 app/components/workflow-app/hooks/use-nodes-sync-draft.ts                                                                       |  148 
 app/components/base/icons/src/vender/solid/general/QuestionTriangle.tsx                                                         |   20 
 app/components/base/chat/chat/index.tsx                                                                                         |  348 
 app/components/develop/tag.tsx                                                                                                  |   65 
 public/screenshots/light/TextGenerator@3x.png                                                                                   |    0 
 app/components/base/radio-card/index.tsx                                                                                        |   68 
 app/components/base/linked-apps-panel/index.tsx                                                                                 |   62 
 app/components/workflow/nodes/knowledge-retrieval/components/add-dataset.tsx                                                    |   41 
 app/components/base/icons/src/vender/line/weather/Stars02.tsx                                                                   |   20 
 app/components/base/app-icon-picker/utils.ts                                                                                    |  166 
 public/embed.js                                                                                                                 |  441 
 app/components/base/icons/assets/vender/line/development/brackets-x.svg                                                         |    3 
 app/components/base/pagination/index.tsx                                                                                        |  167 
 app/components/base/icons/src/vender/line/general/Refresh.json                                                                  |   23 
 app/components/base/prompt-log-modal/index.tsx                                                                                  |   72 
 app/components/header/account-setting/model-provider-page/model-selector/index.tsx                                              |  122 
 i18n/de-DE/dataset.ts                                                                                                           |  221 
 app/components/base/icons/assets/vender/solid/development/database-03.svg                                                       |    3 
 app/components/base/icons/assets/vender/line/general/settings-04.svg                                                            |    5 
 app/components/plugins/base/badges/partner.tsx                                                                                  |   29 
 app/components/header/account-setting/model-provider-page/model-selector/popup-item.tsx                                         |  195 
 assets/pdf.svg                                                                                                                  |   22 
 app/components/base/icons/src/public/llm/Cohere.json                                                                            |  112 
 app/components/workflow/simple-node/constants.ts                                                                                |    1 
 app/components/base/icons/assets/vender/workflow/list-filter.svg                                                                |    5 
 app/components/base/icons/assets/image/llm/minimax.png                                                                          |    0 
 app/components/base/features/new-feature-panel/annotation-reply/config-param.tsx                                                |   24 
 i18n/zh-Hant/billing.ts                                                                                                         |  200 
 app/components/base/icons/assets/vender/line/files/file-text.svg                                                                |    5 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/index.tsx                                   |   28 
 i18n/es-ES/plugin.ts                                                                                                            |  215 
 app/components/base/icons/src/vender/solid/general/SearchMd.tsx                                                                 |   20 
 types/feature.ts                                                                                                                |   54 
 app/components/app/configuration/config/agent/prompt-editor.tsx                                                                 |  149 
 app/components/workflow/run/iteration-log/iteration-log-trigger.tsx                                                             |  103 
 .vscode/settings.example.json                                                                                                   |   26 
 app/components/workflow/nodes/http/default.ts                                                                                   |   65 
 i18n/en-US/dataset-creation.ts                                                                                                  |  216 
 app/components/base/chat/chat/answer/tool-detail.tsx                                                                            |   71 
 app/components/base/icons/src/vender/solid/communication/Send03.json                                                            |   36 
 i18n/fa-IR/dataset.ts                                                                                                           |  221 
 app/components/workflow/nodes/tool/utils.ts                                                                                     |    5 
 app/components/app/configuration/config-var/select-var-type.tsx                                                                 |   79 
 app/components/datasets/documents/detail/completed/index.tsx                                                                    |  735 
 app/(commonLayout)/apps/assets/chat.svg                                                                                         |    3 
 app/components/base/image-uploader/audio-preview.tsx                                                                            |   37 
 app/components/app/configuration/style.module.css                                                                               |   14 
 app/components/base/icons/src/vender/line/others/Exchange02.json                                                                |   26 
 i18n/th-TH/dataset-documents.ts                                                                                                 |  394 
 i18n/vi-VN/workflow.ts                                                                                                          |  921 
 app/components/base/icons/src/vender/solid/communication/Logic.tsx                                                              |   20 
 app/components/header/account-setting/api-based-extension-page/empty.tsx                                                        |   28 
 app/components/workflow/panel/inputs-panel.tsx                                                                                  |  130 
 app/components/base/icons/src/vender/workflow/ListFilter.json                                                                   |   38 
 i18n/zh-Hans/app-debug.ts                                                                                                       |  529 
 app/components/workflow/panel/chat-variable-panel/components/object-value-list.tsx                                              |   36 
 i18n/ru-RU/share-app.ts                                                                                                         |   82 
 app/components/base/icons/assets/public/thought/thought-list.svg                                                                |    8 
 app/components/base/icons/src/vender/solid/education/index.ts                                                                   |    4 
 app/components/base/icons/src/vender/solid/files/File05.tsx                                                                     |   20 
 app/components/datasets/create/empty-dataset-creation-modal/index.tsx                                                           |   71 
 app/components/workflow-app/store/workflow/workflow-slice.ts                                                                    |   18 
 app/components/base/icons/src/vender/solid/general/QuestionTriangle.json                                                        |   45 
 i18n/ja-JP/app.ts                                                                                                               |  214 
 app/components/app/configuration/config/automatic/get-automatic-res.tsx                                                         |  330 
 i18n/fa-IR/register.ts                                                                                                          |    4 
 app/components/header/assets/file.svg                                                                                           |    3 
 i18n/es-ES/common.ts                                                                                                            |  671 
 i18n/zh-Hans/dataset-hit-testing.ts                                                                                             |   34 
 app/components/base/switch/index.tsx                                                                                            |   87 
 app/components/workflow/header/running-title.tsx                                                                                |   24 
 app/components/base/prompt-editor/hooks.ts                                                                                      |  185 
 app/components/base/icons/src/vender/solid/development/ApiConnectionMod.json                                                    |   38 
 app/components/base/icons/src/vender/features/Citations.tsx                                                                     |   20 
 app/components/datasets/documents/assets/normal.svg                                                                             |    4 
 i18n/fr-FR/common.ts                                                                                                            |  672 
 app/components/base/icons/src/vender/line/education/BookOpen01.tsx                                                              |   20 
 app/components/workflow/nodes/end/use-config.ts                                                                                 |   27 
 app/components/base/icons/assets/public/billing/aws-marketplace.svg                                                             |   23 
 app/components/base/icons/src/vender/solid/general/CheckDone01.tsx                                                              |   20 
 app/components/header/account-setting/language-page/index.module.css                                                            |   24 
 app/components/base/icons/assets/vender/solid/editor/colors.svg                                                                 |    9 
 app/components/base/icons/src/public/plugins/PartnerLight.tsx                                                                   |   20 
 app/components/plugins/plugin-detail-panel/operation-dropdown.tsx                                                               |  101 
 app/components/workflow/run/utils/format-log/index.ts                                                                           |   98 
 app/components/base/icons/assets/vender/plugin/left-corner.svg                                                                  |    3 
 app/components/base/icons/src/public/common/Highlight.json                                                                      |   67 
 app/components/app-sidebar/dataset-info.tsx                                                                                     |   45 
 i18n/th-TH/explore.ts                                                                                                           |   44 
 app/components/base/icons/src/vender/line/arrows/ArrowNarrowLeft.json                                                           |   29 
 app/components/header/account-setting/model-provider-page/model-modal/Form.tsx                                                  |  424 
 app/components/base/icons/src/public/education/Triangle.json                                                                    |   27 
 app/components/base/icons/src/vender/line/general/AtSign.json                                                                   |   66 
 app/components/workflow/nodes/list-operator/components/limit-config.tsx                                                         |   80 
 app/components/base/icons/assets/public/common/line-3.svg                                                                       |    3 
 app/components/base/spinner/index.tsx                                                                                           |   24 
 app/components/datasets/settings/form/index.tsx                                                                                 |  354 
 i18n/pt-BR/dataset-hit-testing.ts                                                                                               |   35 
 app/components/develop/secret-key/assets/trash-red.svg                                                                          |    3 
 app/components/workflow/nodes/iteration/add-block.tsx                                                                           |   79 
 app/components/base/icons/src/vender/line/financeAndECommerce/ReceiptList.json                                                  |   29 
 app/components/base/icons/assets/vender/solid/general/target-04.svg                                                             |    5 
 app/components/base/icons/src/vender/solid/mediaAndDevices/MagicBox.json                                                        |   64 
 app/components/tools/workflow-tool/confirm-modal/index.tsx                                                                      |   46 
 app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/settings/page.tsx                                                 |   20 
 next.config.js                                                                                                                  |   69 
 app/components/workflow/nodes/iteration-start/default.ts                                                                        |   21 
 public/logo/logo-embedded-chat-header@2x.png                                                                                    |    0 
 i18n/fr-FR/plugin.ts                                                                                                            |  215 
 app/components/plugins/plugin-page/plugins-panel.tsx                                                                            |   84 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/assets/index.tsx                    |    7 
 app/components/base/prompt-editor/plugins/variable-value-block/utils.ts                                                         |    5 
 app/components/base/icons/assets/vender/solid/files/folder.svg                                                                  |    5 
 app/components/billing/upgrade-btn/style.module.css                                                                             |    9 
 app/components/base/icons/src/vender/solid/general/PlusCircle.json                                                              |   38 
 app/components/base/icons/assets/public/llm/cohere-text.svg                                                                     |   11 
 app/components/base/icons/src/public/common/Line3.json                                                                          |   28 
 app/components/base/icons/src/public/llm/AzureOpenaiServiceText.tsx                                                             |   20 
 app/components/base/icons/src/public/llm/XorbitsInferenceText.tsx                                                               |   20 
 app/components/base/icons/assets/vender/line/general/upload-cloud-01.svg                                                        |    4 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-string.tsx                       |   84 
 app/education-apply/types.ts                                                                                                    |   11 
 app/components/base/icons/src/public/billing/Keyframe.json                                                                      |   28 
 i18n/sl-SI/billing.ts                                                                                                           |  200 
 app/components/base/radio/index.tsx                                                                                             |   15 
 app/components/base/file-uploader/file-input.tsx                                                                                |   49 
 app/components/billing/type.ts                                                                                                  |  107 
 app/dev-only/layout.tsx                                                                                                         |    9 
 app/components/datasets/preview/container.tsx                                                                                   |   29 
 app/components/base/chat/__tests__/multiRootNodesWithLegacyTestMessages.json                                                    |   52 
 app/components/workflow-app/components/workflow-children.tsx                                                                    |   69 
 app/components/workflow/store/workflow/panel-slice.ts                                                                           |   32 
 i18n/pt-BR/education.ts                                                                                                         |   47 
 app/components/workflow/nodes/parameter-extractor/types.ts                                                                      |   37 
 app/components/base/icons/assets/vender/features/vision.svg                                                                     |    3 
 app/components/datasets/common/retrieval-method-info/index.tsx                                                                  |   64 
 app/components/datasets/documents/assets/layoutRightClose.svg                                                                   |    4 
 app/components/workflow/nodes/variable-assigner/components/var-list/index.tsx                                                   |   86 
 app/components/base/icons/assets/vender/solid/general/x-circle.svg                                                              |    3 
 app/components/base/list-empty/horizontal-line.tsx                                                                              |   21 
 i18n/zh-Hant/plugin-tags.ts                                                                                                     |   25 
 app/components/base/icons/src/public/thought/Loading.json                                                                       |   64 
 app/components/plugins/install-plugin/install-from-github/steps/selectPackage.tsx                                               |  125 
 app/components/base/popover/index.tsx                                                                                           |  120 
 app/components/base/icons/assets/public/other/Icon-3-dots.svg                                                                   |    3 
 app/components/base/icons/src/public/model/index.ts                                                                             |    1 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-item.tsx                         |  196 
 app/components/base/icons/assets/public/billing/diamond.svg                                                                     |    5 
 public/vs/basic-languages/mips/mips.js                                                                                          |   10 
 i18n/zh-Hant/share-app.ts                                                                                                       |   78 
 app/components/workflow/nodes/tool/default.ts                                                                                   |   68 
 app/components/base/icons/src/vender/line/general/Refresh.tsx                                                                   |   20 
 i18n/de-DE/dataset-hit-testing.ts                                                                                               |   35 
 app/components/base/icons/src/public/other/Message3Fill.tsx                                                                     |   20 
 app/components/header/app-nav/index.tsx                                                                                         |  150 
 i18n/de-DE/billing.ts                                                                                                           |  200 
 app/components/header/account-setting/key-validator/ValidateStatus.tsx                                                          |   32 
 app/components/workflow/nodes/assigner/use-config.ts                                                                            |  133 
 i18n/fa-IR/tools.ts                                                                                                             |  158 
 i18n/hi-IN/workflow.ts                                                                                                          |  941 
 app/components/datasets/metadata/edit-metadata-batch/edited-beacon.tsx                                                          |   36 
 app/components/workflow/nodes/parameter-extractor/components/extract-parameter/import-from-tool.tsx                             |   93 
 app/components/base/features/new-feature-panel/more-like-this.tsx                                                               |   57 
 app/components/base/icons/assets/vender/line/layout/layout-grid-02.svg                                                          |    3 
 public/embed.min.js                                                                                                             |   42 
 i18n/uk-UA/time.ts                                                                                                              |   37 
 app/components/datasets/common/chunking-mode-label.tsx                                                                          |   29 
 app/components/header/account-setting/model-provider-page/provider-added-card/credential-panel.tsx                              |  114 
 app/components/workflow/nodes/if-else/components/condition-list/condition-operator.tsx                                          |   94 
 app/components/workflow/nodes/_base/components/add-variable-popup.tsx                                                           |   36 
 app/components/base/icons/src/vender/line/general/Bookmark.tsx                                                                  |   20 
 i18n/es-ES/dataset-documents.ts                                                                                                 |  395 
 app/components/base/radio/context/index.tsx                                                                                     |    6 
 app/components/base/icons/src/image/llm/Tongyi.tsx                                                                              |   20 
 app/components/base/icons/src/public/thought/ThoughtList.tsx                                                                    |   20 
 app/components/header/account-setting/members-page/invite-modal/index.module.css                                                |   12 
 pnpm-lock.yaml                                                                                                                  | 18718 ++
 app/components/base/icons/assets/public/plugins/web-reader.svg                                                                  |    4 
 app/components/base/icons/src/image/llm/BaichuanTextCn.tsx                                                                      |   20 
 public/vs/basic-languages/hcl/hcl.js                                                                                            |   10 
 app/components/workflow/nodes/if-else/utils.ts                                                                                  |  174 
 i18n/zh-Hant/education.ts                                                                                                       |   47 
 app/components/base/icons/src/vender/line/others/BubbleX.json                                                                   |   57 
 app/components/workflow/nodes/list-operator/components/extract-input.tsx                                                        |   51 
 app/components/base/icons/src/vender/workflow/Jinja.tsx                                                                         |   20 
 app/components/workflow/nodes/question-classifier/components/class-list.tsx                                                     |   87 
 app/components/datasets/documents/detail/embedding/style.module.css                                                             |   59 
 app/components/base/icons/src/vender/line/arrows/ReverseLeft.json                                                               |   39 
 app/components/workflow/note-node/constants.ts                                                                                  |   42 
 i18n/ru-RU/app.ts                                                                                                               |  214 
 app/components/base/icons/assets/vender/line/time/clock-play.svg                                                                |   10 
 public/vs/editor/editor.main.nls.zh-cn.js                                                                                       |   15 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/develop/page.tsx                                                               |   19 
 app/components/base/tooltip/index.spec.tsx                                                                                      |  116 
 app/activate/activateForm.tsx                                                                                                   |   67 
 app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsDown.tsx                                                      |   20 
 i18n/pl-PL/dataset-hit-testing.ts                                                                                               |   35 
 service/explore.ts                                                                                                              |   41 
 app/signin/invite-settings/page.tsx                                                                                             |  154 
 app/components/app/create-app-modal/index.tsx                                                                                   |  364 
 i18n/es-ES/custom.ts                                                                                                            |   32 
 app/(commonLayout)/explore/layout.tsx                                                                                           |   16 
 app/components/header/account-setting/model-provider-page/provider-added-card/index.tsx                                         |  186 
 app/components/billing/vector-space-full/style.module.css                                                                       |    7 
 app/components/base/icons/src/vender/solid/shapes/Star06.tsx                                                                    |   20 
 service/knowledge/use-metadata.ts                                                                                               |  146 
 public/logo/logo-embedded-chat-avatar.png                                                                                       |    0 
 app/components/base/icons/assets/public/files/unknown.svg                                                                       |   23 
 app/components/base/icons/assets/vender/line/general/log-out-01.svg                                                             |    5 
 app/components/datasets/create/stop-embedding-modal/index.module.css                                                            |   37 
 app/components/base/icons/src/public/knowledge/SelectionMod.tsx                                                                 |   20 
 app/components/workflow/nodes/_base/components/editor/wrap.tsx                                                                  |   48 
 app/components/base/icons/src/vender/solid/mediaAndDevices/VideoSupportIcon.json                                                |   26 
 i18n/es-ES/time.ts                                                                                                              |   37 
 app/components/base/icons/src/vender/workflow/IterationStart.tsx                                                                |   20 
 app/(shareLayout)/chat/[token]/page.tsx                                                                                         |   11 
 app/components/base/icons/src/vender/line/general/Edit04.json                                                                   |   29 
 app/components/datasets/create/website/watercrawl/header.tsx                                                                    |   43 
 i18n/es-ES/education.ts                                                                                                         |   47 
 app/components/base/icons/assets/public/tracing/weave-icon-big.svg                                                              |   33 
 app/components/base/icons/src/vender/line/images/ImagePlus.tsx                                                                  |   20 
 app/components/base/loading/index.spec.tsx                                                                                      |   29 
 app/components/workflow/custom-connection-line.tsx                                                                              |   40 
 app/components/base/icons/src/vender/solid/mediaAndDevices/Robot.tsx                                                            |   20 
 app/components/base/icons/script.mjs                                                                                            |  174 
 app/components/plugins/install-plugin/install-from-github/steps/loaded.tsx                                                      |  180 
 i18n/pl-PL/app.ts                                                                                                               |  221 
 i18n/ro-RO/login.ts                                                                                                             |  110 
 app/components/datasets/documents/detail/completed/common/empty.tsx                                                             |   78 
 app/components/workflow/note-node/note-editor/theme/index.ts                                                                    |   18 
 app/components/workflow/run/utils/format-log/iteration/index.spec.ts                                                            |   23 
 app/components/workflow/block-selector/constants.tsx                                                                            |  111 
 app/components/workflow/note-node/note-editor/toolbar/hooks.ts                                                                  |  147 
 app/components/header/account-setting/model-provider-page/provider-added-card/quota-panel.tsx                                   |   66 
 app/components/base/svg/style.module.css                                                                                        |   11 
 app/components/base/icons/src/vender/solid/general/MessageClockCircle.json                                                      |   36 
 app/components/base/icons/assets/vender/line/mediaAndDevices/sliders-h.svg                                                      |    3 
 app/components/app/text-generate/item/result-tab.tsx                                                                            |   56 
 app/components/base/icons/src/public/llm/BaichuanText.json                                                                      |  156 
 app/components/base/prompt-editor/plugins/update-block.tsx                                                                      |   42 
 app/components/tools/provider/tool-item.tsx                                                                                     |   54 
 app/components/base/date-and-time-picker/date-picker/footer.tsx                                                                 |   59 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-failed.ts                                                     |   26 
 app/components/base/prompt-editor/plugins/workflow-variable-block/workflow-variable-block-replacement-block.tsx                 |   66 
 app/components/plugins/plugin-detail-panel/strategy-item.tsx                                                                    |   50 
 app/components/base/audio-btn/style.module.css                                                                                  |   10 
 app/components/workflow/panel/version-history-panel/context-menu/use-context-menu.ts                                            |   42 
 service/log.ts                                                                                                                  |   80 
 app/components/base/chat/__tests__/partialMessages.json                                                                         |  122 
 app/components/workflow/nodes/assigner/node.tsx                                                                                 |   86 
 app/components/workflow/nodes/_base/components/option-card.tsx                                                                  |   74 
 app/components/base/copy-icon/index.tsx                                                                                         |   53 
 app/components/base/icons/utils.spec.ts                                                                                         |   70 
 app/components/app/configuration/dataset-config/settings-modal/index.tsx                                                        |  390 
 app/components/base/form/components/field/checkbox.tsx                                                                          |   43 
 app/components/base/icons/src/vender/solid/general/Github.tsx                                                                   |   20 
 app/signin/_header.tsx                                                                                                          |   42 
 app/components/share/text-generation/menu-dropdown.tsx                                                                          |  100 
 app/components/base/icons/src/vender/line/general/CheckDone01.tsx                                                               |   20 
 app/components/workflow/hooks/use-helpline.ts                                                                                   |  127 
 app/components/header/header-wrapper.tsx                                                                                        |   27 
 i18n/zh-Hant/dataset-settings.ts                                                                                                |   43 
 app/components/base/icons/assets/public/other/row-struct.svg                                                                    |    5 
 app/components/base/icons/src/vender/solid/editor/Paragraph.json                                                                |   44 
 app/components/custom/custom-web-app-brand/style.module.css                                                                     |    3 
 app/components/workflow/note-node/note-editor/plugins/link-editor-plugin/component.tsx                                          |  149 
 app/components/workflow/run/utils/format-log/agent/data.ts                                                                      |  179 
 app/components/base/icons/src/vender/line/editor/ImageIndentLeft.json                                                           |   39 
 app/components/base/icons/assets/image/llm/tongyi.png                                                                           |    0 
 app/components/datasets/documents/detail/completed/common/dot.tsx                                                               |   11 
 i18n/tr-TR/app-overview.ts                                                                                                      |  173 
 app/components/base/icons/src/public/llm/BaichuanText.tsx                                                                       |   20 
 app/components/tools/labels/filter.tsx                                                                                          |  136 
 app/components/workflow/nodes/tool/use-config.ts                                                                                |  325 
 app/components/app/configuration/config-vision/param-config-content.tsx                                                         |  142 
 app/components/base/icons/assets/vender/solid/development/terminal-square.svg                                                   |    5 
 app/components/with-i18n.tsx                                                                                                    |   20 
 app/components/datasets/create/assets/normal.svg                                                                                |    4 
 app/components/base/icons/src/vender/line/files/FileText.json                                                                   |   39 
 i18n/zh-Hans/plugin.ts                                                                                                          |  215 
 app/components/base/icons/src/vender/line/general/Pin02.json                                                                    |   29 
 app/components/header/plugins-nav/downloading-icon.module.css                                                                   |   44 
 app/components/base/file-uploader/utils.spec.ts                                                                                 |  614 
 app/components/datasets/create/assets/option-card-effect-purple.svg                                                             |   12 
 i18n/pl-PL/dataset-settings.ts                                                                                                  |   48 
 app/components/base/icons/src/vender/solid/users/User01.json                                                                    |   57 
 app/components/workflow/nodes/agent/components/tool-icon.tsx                                                                    |   83 
 app/components/app-sidebar/completion.png                                                                                       |    0 
 app/components/workflow/block-selector/tools.tsx                                                                                |  127 
 app/components/datasets/create/assets/file-list-3-fill.svg                                                                      |    5 
 context/event-emitter.tsx                                                                                                       |   28 
 app/components/base/icons/assets/vender/line/general/edit-05.svg                                                                |   10 
 app/components/base/icons/src/vender/line/others/DragHandle.json                                                                |   38 
 app/components/base/icons/assets/public/files/md.svg                                                                            |   18 
 app/components/workflow/header/header-in-view-history.tsx                                                                       |   50 
 i18n/it-IT/tools.ts                                                                                                             |  168 
 app/components/develop/code.tsx                                                                                                 |  305 
 public/screenshots/light/TextGenerator.png                                                                                      |    0 
 i18n/en-US/dataset-documents.ts                                                                                                 |  394 
 app/components/base/icons/assets/public/llm/jina-text.svg                                                                       |   12 
 app/components/develop/template/template_workflow.ja.mdx                                                                        |  796 
 app/components/base/icons/src/vender/solid/development/TerminalSquare.tsx                                                       |   20 
 .env.example                                                                                                                    |   60 
 app/components/base/icons/assets/vender/solid/education/unblur.svg                                                              |   19 
 app/components/base/toast/index.spec.tsx                                                                                        |  193 
 app/components/base/toast/style.module.css                                                                                      |   44 
 app/components/datasets/documents/detail/embedding/skeleton/index.tsx                                                           |   66 
 app/components/datasets/documents/detail/completed/skeleton/full-doc-list-skeleton.tsx                                          |   25 
 app/components/workflow/utils/tool.ts                                                                                           |   43 
 app/components/base/prompt-editor/plugins/variable-value-block/node.tsx                                                         |   64 
 app/components/workflow/nodes/document-extractor/types.ts                                                                       |    6 
 app/components/app-sidebar/index.tsx                                                                                            |  126 
 app/components/base/dialog/index.tsx                                                                                            |   81 
 app/components/base/icons/assets/vender/line/education/book-open-01.svg                                                         |    6 
 app/components/base/icons/src/public/common/Github.tsx                                                                          |   20 
 app/components/datasets/documents/detail/batch-modal/csv-uploader.tsx                                                           |  128 
 app/components/app/log/filter.tsx                                                                                               |  101 
 app/components/explore/category.tsx                                                                                             |   60 
 app/components/datasets/create/file-preview/index.tsx                                                                           |   70 
 app/components/workflow/nodes/loop-start/types.ts                                                                               |    3 
 app/components/header/account-setting/key-validator/Operate.tsx                                                                 |   87 
 app/components/app/configuration/config-prompt/advanced-prompt-input.tsx                                                        |  275 
 app/components/base/form/index.tsx                                                                                              |   25 
 app/components/datasets/create/assets/unknown.svg                                                                               |   23 
 app/components/workflow/nodes/agent/node.tsx                                                                                    |  115 
 public/vs/basic-languages/liquid/liquid.js                                                                                      |   10 
 app/components/workflow/nodes/llm/components/config-prompt-item.tsx                                                             |  151 
 app/components/workflow/nodes/_base/components/before-run-form/index.tsx                                                        |  205 
 app/(commonLayout)/explore/installed/[appId]/page.tsx                                                                           |   16 
 app/signin/components/mail-and-password-auth.tsx                                                                                |  174 
 app/components/header/account-setting/data-source-page/data-source-website/config-firecrawl-modal.tsx                           |  161 
 app/components/base/chat/chat-with-history/header/index.tsx                                                                     |  164 
 app/components/base/icons/assets/vender/line/development/artificial-brain.svg                                                   |    3 
 i18n/en-US/billing.ts                                                                                                           |  190 
 app/components/base/icons/src/vender/line/alertsAndFeedback/AlertTriangle.tsx                                                   |   20 
 app/components/base/features/new-feature-panel/conversation-opener/index.tsx                                                    |  119 
 app/components/app/annotation/batch-add-annotation-modal/csv-downloader.tsx                                                     |   73 
 app/components/datasets/documents/detail/completed/common/tag.tsx                                                               |   15 
 app/components/header/account-setting/model-provider-page/model-parameter-modal/status-indicators.tsx                           |   99 
 app/components/workflow/nodes/iteration/use-config.ts                                                                           |  245 
 i18n/ru-RU/app-log.ts                                                                                                           |   98 
 app/components/datasets/create/index.module.css                                                                                 |    0 
 app/components/app/create-app-dialog/index.tsx                                                                                  |   36 
 app/components/base/icons/assets/public/avatar/user.svg                                                                         |   12 
 app/components/base/icons/src/public/llm/AzureOpenaiService.json                                                                |   74 
 app/components/base/icons/src/vender/solid/mediaAndDevices/StopCircle.tsx                                                       |   20 
 i18n/de-DE/time.ts                                                                                                              |   37 
 app/components/base/progress-bar/progress-circle.tsx                                                                            |   64 
 i18n/fr-FR/app-debug.ts                                                                                                         |  410 
 context/workspace-context.tsx                                                                                                   |   36 
 app/components/workflow/dsl-export-confirm-modal.tsx                                                                            |   86 
 i18n/hi-IN/dataset-hit-testing.ts                                                                                               |   35 
 app/components/datasets/documents/detail/settings/index.tsx                                                                     |   96 
 app/components/workflow/nodes/llm/node.tsx                                                                                      |   36 
 app/components/app/configuration/base/icons/more-like-this-icon.tsx                                                             |   14 
 public/screenshots/dark/TextGenerator@2x.png                                                                                    |    0 
 app/components/base/chat/chat/check-input-forms-hooks.ts                                                                        |   54 
 app/components/base/icons/src/public/other/Message3Fill.json                                                                    |  173 
 service/refresh-token.ts                                                                                                        |   92 
 i18n/ro-RO/dataset-creation.ts                                                                                                  |  218 
 app/components/base/icons/src/vender/line/arrows/RefreshCcw01.json                                                              |   29 
 app/components/base/icons/src/vender/solid/communication/BubbleTextMod.tsx                                                      |   20 
 app/components/develop/secret-key/assets/pause.svg                                                                              |   10 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/workflow/page.tsx                                                              |   12 
 app/components/base/icons/src/vender/solid/development/Database03.tsx                                                           |   20 
 app/components/datasets/metadata/base/date-picker.tsx                                                                           |   76 
 app/components/app/log/index.tsx                                                                                                |  129 
 app/components/base/icons/src/vender/solid/development/ApiConnectionMod.tsx                                                     |   20 
 app/components/explore/sidebar/app-nav-item/index.tsx                                                                           |   75 
 public/vs/basic-languages/java/java.js                                                                                          |   10 
 public/screenshots/dark/Workflow@2x.png                                                                                         |    0 
 app/components/base/theme-selector.tsx                                                                                          |   97 
 i18n/hi-IN/time.ts                                                                                                              |   37 
 app/components/base/icons/assets/public/llm/openai-green.svg                                                                    |    4 
 i18n/pl-PL/run-log.ts                                                                                                           |   31 
 i18n/ja-JP/register.ts                                                                                                          |    4 
 app/components/datasets/common/document-status-with-action/index-failed.tsx                                                     |   70 
 app/components/workflow/nodes/constants.ts                                                                                      |  104 
 i18n/uk-UA/tools.ts                                                                                                             |  158 
 app/components/base/icons/src/public/files/Pdf.json                                                                             |  169 
 app/components/base/icons/src/public/llm/OpenaiTransparent.tsx                                                                  |   20 
 app/components/base/tag-management/index.tsx                                                                                    |   92 
 app/components/base/icons/src/vender/line/layout/Grid01.tsx                                                                     |   20 
 i18n/hi-IN/run-log.ts                                                                                                           |   31 
 app/components/base/file-uploader/file-type-icon.tsx                                                                            |   91 
 app/components/workflow/nodes/if-else/use-is-var-file-attribute.ts                                                              |   48 
 app/components/app/overview/appChart.tsx                                                                                        |  450 
 app/components/base/icons/src/vender/workflow/LoopEnd.tsx                                                                       |   20 
 app/components/base/date-and-time-picker/utils/dayjs.ts                                                                         |   80 
 app/components/billing/usage-info/vector-space-info.tsx                                                                         |   36 
 i18n/ko-KR/billing.ts                                                                                                           |  200 
 app/components/workflow/nodes/iteration/panel.tsx                                                                               |  176 
 app/components/app/app-publisher/suggested-action.tsx                                                                           |   29 
 i18n/zh-Hans/custom.ts                                                                                                          |   32 
 app/components/base/date-and-time-picker/year-and-month-picker/footer.tsx                                                       |   25 
 public/vs/basic-languages/lua/lua.js                                                                                            |   10 
 app/components/base/icons/src/public/tracing/OpikIcon.json                                                                      |  163 
 app/components/app/annotation/empty-element.tsx                                                                                 |   26 
 app/components/header/account-setting/plugin-page/SerpapiPlugin.tsx                                                             |   80 
 app/components/base/icons/src/vender/other/index.ts                                                                             |    5 
 i18n/zh-Hant/tools.ts                                                                                                           |  158 
 app/components/base/icons/src/public/tracing/TracingIcon.json                                                                   |   47 
 app/components/base/icons/src/vender/other/AnthropicText.json                                                                   |  539 
 i18n/ru-RU/login.ts                                                                                                             |  110 
 i18n/fa-IR/dataset-settings.ts                                                                                                  |   43 
 app/components/base/chat/embedded-chatbot/hooks.tsx                                                                             |  405 
 app/components/base/prompt-editor/plugins/query-block/index.tsx                                                                 |   68 
 app/components/workflow/nodes/variable-assigner/types.ts                                                                        |   15 
 app/components/datasets/create/top-bar/index.tsx                                                                                |   47 
 app/components/tools/utils/to-form-schema.ts                                                                                    |   96 
 i18n/ru-RU/layout.ts                                                                                                            |    4 
 app/components/workflow/nodes/if-else/components/condition-files-list-value.tsx                                                 |  115 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/configuration/page.tsx                                                         |   10 
 app/components/base/icons/src/vender/solid/FinanceAndECommerce/GoldCoin.json                                                    |   26 
 app/components/base/icons/src/vender/workflow/IfElse.json                                                                       |   38 
 app/components/base/icons/assets/vender/workflow/loop-end.svg                                                                   |    5 
 app/components/base/icons/src/vender/solid/users/UsersPlus.json                                                                 |   77 
 app/components/app/configuration/config/feature/use-feature.tsx                                                                 |   96 
 app/components/base/icons/src/vender/line/others/BubbleX.tsx                                                                    |   20 
 app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx                                                    |  221 
 app/components/base/voice-input/index.module.css                                                                                |   10 
 app/components/workflow/nodes/iteration-start/constants.ts                                                                      |    1 
 i18n/ja-JP/explore.ts                                                                                                           |   44 
 i18n/th-TH/app-overview.ts                                                                                                      |  173 
 app/components/datasets/documents/detail/completed/skeleton/parent-chunk-card-skeleton.tsx                                      |   45 
 app/components/base/icons/src/vender/solid/communication/ChatBot.json                                                           |   58 
 app/components/base/features/new-feature-panel/citation.tsx                                                                     |   56 
 app/components/base/icons/assets/public/billing/group-2.svg                                                                     |    3 
 app/components/base/prompt-editor/plugins/variable-value-block/index.tsx                                                        |   52 
 app/components/base/icons/src/vender/line/general/Pin01.tsx                                                                     |   20 
 app/components/header/account-dropdown/workplace-selector/index.module.css                                                      |    5 
 public/vs/base/worker/workerMain.js                                                                                             |   27 
 app/components/base/file-uploader/audio-preview.tsx                                                                             |   46 
 app/components/workflow/hooks/use-checklist.ts                                                                                  |  260 
 app/components/develop/secret-key/assets/copy-hover.svg                                                                         |    3 
 app/components/plugins/install-plugin/install-bundle/item/marketplace-item.tsx                                                  |   36 
 i18n/fa-IR/billing.ts                                                                                                           |  200 
 app/components/base/icons/assets/vender/line/editor/image-indent-left.svg                                                       |    5 
 i18n/sl-SI/education.ts                                                                                                         |   47 
 app/account/avatar.tsx                                                                                                          |  109 
 app/components/base/icons/src/vender/solid/development/Database02.json                                                          |   46 
 app/components/base/icons/src/vender/plugin/LeftCorner.json                                                                     |   27 
 app/components/base/input-number/index.spec.tsx                                                                                 |   97 
 app/components/base/icons/src/vender/line/general/Edit02.tsx                                                                    |   20 
 i18n/ru-RU/dataset-documents.ts                                                                                                 |  395 
 app/components/explore/installed-app/index.tsx                                                                                  |   42 
 i18n/ru-RU/app-api.ts                                                                                                           |   85 
 app/components/base/icons/src/public/files/Html.json                                                                            |  178 
 app/components/base/divider/index.spec.tsx                                                                                      |   55 
 app/components/base/icons/src/public/common/NTo1Retrieval.tsx                                                                   |   20 
 app/components/workflow/nodes/list-operator/use-config.ts                                                                       |  188 
 app/components/tools/provider/detail.tsx                                                                                        |  430 
 app/components/workflow/nodes/list-operator/components/sub-variable-picker.tsx                                                  |   73 
 i18n/zh-Hant/dataset.ts                                                                                                         |  221 
 app/components/base/icons/assets/vender/line/development/container.svg                                                          |    3 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-started.ts                                                    |   58 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-operator.tsx                     |   98 
 models/common.ts                                                                                                                |  304 
 i18n/en-US/dataset.ts                                                                                                           |  221 
 service/use-tools.ts                                                                                                            |  121 
 app/components/datasets/hit-testing/components/score.tsx                                                                        |   28 
 app/components/datasets/documents/detail/segment-add/index.tsx                                                                  |  135 
 app/components/swr-initor.tsx                                                                                                   |   89 
 app/components/base/features/new-feature-panel/annotation-reply/use-annotation-config.ts                                        |   89 
 app/components/base/icons/assets/vender/solid/files/file-zip.svg                                                                |    6 
 app/components/base/icons/src/vender/other/Generator.json                                                                       |   37 
 i18n/sl-SI/share-app.ts                                                                                                         |   79 
 utils/var.ts                                                                                                                    |  110 
 app/components/workflow/nodes/loop/components/loop-variables/form-item.tsx                                                      |  144 
 app/components/workflow/nodes/agent/components/model-bar.tsx                                                                    |   75 
 app/components/base/drawer-plus/index.tsx                                                                                       |  105 
 app/components/base/icons/assets/public/common/iso.svg                                                                          |    1 
 app/components/base/icons/assets/public/thought/loading.svg                                                                     |   10 
 app/components/plugins/plugin-detail-panel/model-selector/llm-params-panel.tsx                                                  |  126 
 app/components/datasets/create/website/watercrawl/options.tsx                                                                   |   85 
 app/components/plugins/install-plugin/base/installed.tsx                                                                        |   60 
 i18n/zh-Hant/layout.ts                                                                                                          |    4 
 app/components/app/workflow-log/filter.tsx                                                                                      |   74 
 app/components/base/radio/style.module.css                                                                                      |   13 
 app/components/base/icons/assets/image/llm/wxyy-text.png                                                                        |    0 
 app/components/base/icons/src/vender/line/mediaAndDevices/PlayCircle.json                                                       |   86 
 app/components/base/icons/src/public/thought/WebReader.tsx                                                                      |   20 
 app/components/plugins/install-plugin/install-from-local-package/steps/uploading.tsx                                            |   99 
 app/components/base/icons/src/public/tracing/LangfuseIcon.json                                                                  |  236 
 app/components/base/icons/src/vender/workflow/IterationStart.json                                                               |   36 
 app/page.tsx                                                                                                                    |   18 
 i18n/it-IT/time.ts                                                                                                              |   37 
 app/components/plugins/marketplace/list/index.tsx                                                                               |   79 
 app/components/workflow/nodes/variable-assigner/utils.ts                                                                        |   16 
 app/components/base/icons/src/vender/workflow/Home.json                                                                         |   38 
 app/components/base/prompt-editor/plugins/custom-text/node.tsx                                                                  |   52 
 app/education-apply/verify-state-modal.tsx                                                                                      |  122 
 app/components/base/icons/src/vender/solid/mapsAndTravel/Globe06.json                                                           |   57 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/auto-width-input.tsx              |   81 
 app/components/workflow/nodes/_base/components/remove-effect-var-confirm.tsx                                                    |   31 
 app/components/base/file-uploader/types.ts                                                                                      |   33 
 app/components/base/icons/src/public/avatar/Robot.tsx                                                                           |   20 
 i18n/th-TH/time.ts                                                                                                              |   37 
 app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/documents/style.module.css                                        |    9 
 app/components/billing/config.ts                                                                                                |   86 
 app/components/base/icons/src/public/llm/OpenaiText.json                                                                        |   77 
 i18n/ko-KR/dataset-documents.ts                                                                                                 |  394 
 app/components/base/icons/assets/vender/solid/editor/type-square.svg                                                            |    3 
 i18n/en-US/share-app.ts                                                                                                         |   82 
 app/components/base/image-uploader/chat-image-uploader.tsx                                                                      |  159 
 app/components/workflow/nodes/if-else/components/condition-add.tsx                                                              |   76 
 app/components/workflow/nodes/llm/components/resolution-picker.tsx                                                              |   44 
 i18n/fa-IR/workflow.ts                                                                                                          |  921 
 i18n/ko-KR/app-overview.ts                                                                                                      |  173 
 app/components/base/file-uploader/file-uploader-in-attachment/file-item.tsx                                                     |  154 
 i18n/hi-IN/common.ts                                                                                                            |  694 
 app/components/workflow/nodes/loop/node.tsx                                                                                     |   61 
 app/components/datasets/documents/detail/completed/skeleton/paragraph-list-skeleton.tsx                                         |   76 
 public/logo/logo-site-dark.png                                                                                                  |    0 
 public/vs/language/json/jsonMode.js                                                                                             |   15 
 app/components/datasets/create/assets/trash.svg                                                                                 |    3 
 app/components/plugins/install-plugin/hooks/use-hide-logic.ts                                                                   |   40 
 app/components/workflow/nodes/_base/components/variable/output-var-list.tsx                                                     |  109 
 public/vs/basic-languages/ecl/ecl.js                                                                                            |   10 
 app/components/workflow/hooks/use-nodes-interactions-without-sync.ts                                                            |   27 
 app/components/datasets/create/assets/rerank.svg                                                                                |   13 
 i18n/ru-RU/billing.ts                                                                                                           |  200 
 app/components/workflow/nodes/http/components/api-input.tsx                                                                     |   81 
 app/account/delete-account/state.tsx                                                                                            |   39 
 app/components/app/configuration/prompt-mode/advanced-mode-waring.tsx                                                           |   52 
 app/components/base/icons/src/vender/solid/mediaAndDevices/DocumentSupportIcon.json                                             |   26 
 app/components/base/logo/logo-embedded-chat-header.tsx                                                                          |   24 
 app/components/base/icons/src/vender/solid/arrows/HighPriority.json                                                             |   53 
 app/components/workflow/nodes/_base/components/editor/code-editor/index.tsx                                                     |  197 
 app/components/base/icons/src/vender/solid/mediaAndDevices/AudioSupportIcon.json                                                |   26 
 app/components/tools/setting/build-in/config-credentials.tsx                                                                    |  130 
 app/components/base/icons/src/vender/workflow/Agent.tsx                                                                         |   20 
 app/components/base/icons/src/vender/line/development/GitBranch01.tsx                                                           |   20 
 app/components/base/text-generation/types.ts                                                                                    |   43 
 app/components/workflow/panel/version-history-panel/loading/index.tsx                                                           |   19 
 app/components/datasets/hit-testing/assets/grid.svg                                                                             |    6 
 app/components/base/icons/assets/vender/workflow/agent.svg                                                                      |    8 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/config-popup.tsx                                              |  259 
 app/components/app/annotation/type.ts                                                                                           |   39 
 app/components/base/badge.tsx                                                                                                   |   37 
 service/plugins.ts                                                                                                              |  108 
 app/components/base/chat/embedded-chatbot/utils.ts                                                                              |    3 
 i18n/zh-Hans/explore.ts                                                                                                         |   44 
 i18n/es-ES/run-log.ts                                                                                                           |   31 
 app/components/datasets/create/step-three/index.module.css                                                                      |   75 
 public/screenshots/light/Chatbot.png                                                                                            |    0 
 app/components/workflow/hooks-store/provider.tsx                                                                                |   36 
 app/components/datasets/create/assets/sliders-02.svg                                                                            |    8 
 app/components/base/features/new-feature-panel/annotation-reply/score-slider/base-slider/index.tsx                              |   38 
 app/components/base/icons/assets/vender/solid/mediaAndDevices/magic-box.svg                                                     |    9 
 app/components/plugins/plugin-page/plugin-info.tsx                                                                              |   41 
 app/components/plugins/plugin-detail-panel/tool-selector/index.tsx                                                              |  458 
 i18n/pt-BR/app-api.ts                                                                                                           |   85 
 i18n/ro-RO/plugin-tags.ts                                                                                                       |   25 
 app/components/base/icons/src/vender/line/general/Edit04.tsx                                                                    |   20 
 app/components/workflow/nodes/loop/components/condition-list/condition-operator.tsx                                             |   94 
 app/components/workflow/custom-edge.tsx                                                                                         |  170 
 app/components/base/icons/src/vender/line/editor/LeftIndent02.json                                                              |   29 
 utils/app-redirection.ts                                                                                                        |   17 
 app/components/base/icons/src/vender/line/mapsAndTravel/Route.json                                                              |   66 
 app/components/header/utils/util.ts                                                                                             |   25 
 app/components/workflow/hooks/use-shortcuts.ts                                                                                  |  202 
 app/components/base/icons/src/public/llm/ZhipuaiTextCn.tsx                                                                      |   20 
 app/components/header/assets/github.svg                                                                                         |   17 
 app/components/base/icons/assets/vender/other/openai.svg                                                                        |    9 
 app/components/base/icons/src/vender/line/general/Plus02.json                                                                   |   39 
 app/(shareLayout)/workflow/[token]/page.tsx                                                                                     |   11 
 app/components/workflow/store/workflow/version-slice.ts                                                                         |   26 
 app/components/header/account-setting/model-provider-page/utils.ts                                                              |  195 
 app/components/header/assets/azure.svg                                                                                          |    4 
 app/components/plugins/plugin-page/filter-management/store.ts                                                                   |   27 
 i18n/th-TH/dataset-creation.ts                                                                                                  |  218 
 app/components/base/icons/src/vender/workflow/Llm.tsx                                                                           |   20 
 i18n/zh-Hans/common.ts                                                                                                          |  671 
 i18n/pt-BR/common.ts                                                                                                            |  672 
 app/components/base/list-empty/vertical-line.tsx                                                                                |   21 
 themes/markdown-light.css                                                                                                       |   44 
 app/components/base/icons/assets/vender/line/arrows/chevron-down-double.svg                                                     |    5 
 service/knowledge/use-segment.ts                                                                                                |  172 
 app/(commonLayout)/datasets/store.ts                                                                                            |   11 
 app/account/delete-account/components/feed-back.tsx                                                                             |   68 
 app/components/base/form/form-scenarios/demo/types.ts                                                                           |   34 
 public/vs/basic-languages/freemarker2/freemarker2.js                                                                            |   12 
 public/vs/basic-languages/protobuf/protobuf.js                                                                                  |   11 
 app/components/plugins/card/card-more-info.tsx                                                                                  |   36 
 app/components/workflow/hooks/use-workflow-history.ts                                                                           |  150 
 app/components/base/icons/src/vender/line/files/Folder.json                                                                     |   39 
 app/components/datasets/metadata/metadata-dataset/create-metadata-modal.tsx                                                     |   45 
 app/components/sentry-initor.tsx                                                                                                |   29 
 i18n/hi-IN/plugin-tags.ts                                                                                                       |   25 
 app/components/base/chat/chat-with-history/inputs-form/content.tsx                                                              |  115 
 app/account/page.tsx                                                                                                            |    7 
 i18n/ko-KR/time.ts                                                                                                              |   37 
 app/components/base/chat/chat/answer/operation.tsx                                                                              |  195 
 app/components/base/icons/assets/vender/line/general/pin-02.svg                                                                 |    3 
 app/signin/components/sso-auth.tsx                                                                                              |   73 
 app/components/base/icons/src/public/knowledge/LayoutRight2LineMod.tsx                                                          |   20 
 app/components/tools/workflow-tool/method-selector.tsx                                                                          |   77 
 app/components/header/assets/sync.svg                                                                                           |    3 
 app/signin/normalForm.tsx                                                                                                       |  217 
 app/components/base/icons/assets/vender/solid/communication/cute-robot.svg                                                      |    5 
 app/components/base/icons/src/vender/workflow/IfElse.tsx                                                                        |   20 
 app/components/workflow/nodes/_base/components/selector.tsx                                                                     |   96 
 public/vs/basic-languages/mdx/mdx.js                                                                                            |   10 
 i18n/tr-TR/app-api.ts                                                                                                           |   85 
 app/components/base/chat/chat/answer/basic-content.tsx                                                                          |   31 
 app/components/workflow/nodes/knowledge-retrieval/default.ts                                                                    |   57 
 app/components/header/plugins-nav/downloading-icon.tsx                                                                          |   17 
 app/components/base/icons/src/public/common/D.json                                                                              |  125 
 app/components/base/icons/assets/vender/features/virtual-assistant.svg                                                          |    4 
 app/components/app/configuration/config/config-document.tsx                                                                     |   78 
 app/components/base/tag-management/filter.tsx                                                                                   |  147 
 i18n/es-ES/dataset-creation.ts                                                                                                  |  218 
 app/components/base/icons/src/vender/solid/communication/MessageFast.tsx                                                        |   20 
 app/components/datasets/create/website/no-data.tsx                                                                              |   69 
 i18n/fr-FR/app.ts                                                                                                               |  213 
 i18n/de-DE/dataset-documents.ts                                                                                                 |  396 
 app/components/datasets/create/icons.ts                                                                                         |   16 
 app/components/base/icons/src/vender/solid/general/Edit04.json                                                                  |   39 
 i18n/ru-RU/dataset-hit-testing.ts                                                                                               |   35 
 app/components/base/icons/assets/vender/line/communication/message-fast-plus.svg                                                |    3 
 app/components/header/account-setting/model-provider-page/provider-icon/index.tsx                                               |   53 
 app/components/base/icons/assets/vender/line/shapes/cube-outline.svg                                                            |   13 
 app/components/app/configuration/config/assistant-type-picker/index.tsx                                                         |  165 
 app/(commonLayout)/datasets/template/template.en.mdx                                                                            | 2352 
 app/components/base/icons/assets/vender/line/editor/bezier-curve-03.svg                                                         |    5 
 app/components/base/icons/src/public/llm/AnthropicDark.json                                                                     | 1046 
 app/components/workflow/panel/debug-and-preview/chat-wrapper.tsx                                                                |  168 
 i18n/sl-SI/app-api.ts                                                                                                           |   85 
 app/components/workflow/nodes/_base/components/file-type-item.tsx                                                               |   78 
 app/components/i18n.tsx                                                                                                         |   31 
 app/components/base/icons/src/vender/solid/alertsAndFeedback/AlertTriangle.json                                                 |   38 
 app/components/header/account-setting/model-provider-page/model-icon/index.tsx                                                  |   50 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-started.ts                                               |   92 
 i18n/en-US/education.ts                                                                                                         |   47 
 app/components/workflow/nodes/knowledge-retrieval/utils.ts                                                                      |  244 
 app/components/workflow/block-selector/tool/tool-list-tree-view/list.tsx                                                        |   56 
 hooks/use-timestamp.ts                                                                                                          |   25 
 app/components/base/chat/chat/answer/index.stories.tsx                                                                          |   96 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/card.tsx                                    |   46 
 app/components/workflow/nodes/template-transform/types.ts                                                                       |    6 
 app/signin/layout.tsx                                                                                                           |   21 
 i18n/pl-PL/education.ts                                                                                                         |   47 
 app/components/base/icons/assets/public/common/message-chat-square.svg                                                          |    4 
 app/components/base/icons/src/vender/line/general/DotsGrid.tsx                                                                  |   20 
 app/components/base/icons/src/vender/solid/general/Download02.json                                                              |   29 
 app/components/base/icons/src/vender/solid/users/UserEdit02.tsx                                                                 |   20 
 i18n/zh-Hans/dataset-creation.ts                                                                                                |  216 
 app/components/base/icons/assets/vender/solid/general/zap-narrow.svg                                                            |    5 
 app/components/base/icons/src/public/billing/ArCube1.tsx                                                                        |   20 
 app/components/workflow/nodes/_base/components/error-handle/error-handle-on-panel.tsx                                           |   91 
 app/components/app/configuration/dataset-config/index.tsx                                                                       |  288 
 app/components/base/icons/assets/public/plugins/partner-light.svg                                                               |   58 
 i18n/pt-BR/dataset.ts                                                                                                           |  221 
 app/components/workflow/nodes/agent/default.ts                                                                                  |  143 
 app/components/workflow/nodes/start/types.ts                                                                                    |    5 
 app/components/base/icons/assets/vender/solid/mapsAndTravel/globe-06.svg                                                        |    8 
 i18n/pl-PL/custom.ts                                                                                                            |   33 
 app/components/base/icons/src/vender/line/others/Exchange02.tsx                                                                 |   20 
 app/components/base/icons/assets/vender/line/layout/grid-01.svg                                                                 |   10 
 i18n/fr-FR/dataset-creation.ts                                                                                                  |  218 
 app/components/base/toast/index.tsx                                                                                             |  161 
 app/components/workflow/panel/version-history-panel/index.tsx                                                                   |  279 
 app/components/base/icons/src/vender/solid/general/PlusCircle.tsx                                                               |   20 
 app/components/plugins/hooks.ts                                                                                                 |  108 
 app/components/base/icons/assets/public/llm/anthropic-text.svg                                                                  |   78 
 app/components/base/icons/src/public/billing/SparklesSoft.tsx                                                                   |   20 
 app/components/base/features/new-feature-panel/annotation-reply/index.tsx                                                       |  153 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/index.tsx                                  |   75 
 app/components/base/icons/src/public/tracing/LangfuseIconBig.json                                                               |  236 
 app/components/header/account-setting/language-page/index.tsx                                                                   |   86 
 app/components/datasets/metadata/edit-metadata-batch/add-row.tsx                                                                |   45 
 app/components/app/configuration/base/feature-panel/index.tsx                                                                   |   48 
 i18n/ro-RO/app-annotation.ts                                                                                                    |   87 
 app/components/base/form/components/label.tsx                                                                                   |   48 
 app/components/workflow/nodes/knowledge-retrieval/components/dataset-list.tsx                                                   |   82 
 app/components/header/nav/index.module.css                                                                                      |    0 
 service/base.ts                                                                                                                 |  584 
 app/components/header/account-setting/members-page/index.tsx                                                                    |  178 
 app/components/workflow/hooks/use-workflow-variables.ts                                                                         |  113 
 i18n/vi-VN/dataset-hit-testing.ts                                                                                               |   35 
 i18n/th-TH/custom.ts                                                                                                            |   32 
 app/components/datasets/external-api/external-api-modal/index.tsx                                                               |  218 
 app/components/base/icons/src/vender/line/mediaAndDevices/index.ts                                                              |    6 
 themes/manual-dark.css                                                                                                          |   65 
 app/components/header/account-dropdown/support.tsx                                                                              |   94 
 app/components/datasets/hit-testing/textarea.tsx                                                                                |  200 
 i18n/it-IT/run-log.ts                                                                                                           |   31 
 i18n/sl-SI/run-log.ts                                                                                                           |   31 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-value-method.tsx                 |   71 
 app/components/base/tab-slider/index.tsx                                                                                        |   87 
 app/components/workflow/hooks/use-nodes-layout.ts                                                                               |   96 
 app/components/base/icons/src/vender/line/general/Settings04.json                                                               |   39 
 app/components/base/theme-switcher.tsx                                                                                          |   58 
 app/components/base/app-icon/index.tsx                                                                                          |   71 
 app/components/share/text-generation/result/content.tsx                                                                         |   34 
 app/components/base/icons/src/vender/line/general/AtSign.tsx                                                                    |   20 
 i18n/uk-UA/explore.ts                                                                                                           |   44 
 app/(commonLayout)/apps/assets/completion-solid.svg                                                                             |    4 
 hooks/use-app-favicon.ts                                                                                                        |   44 
 app/reset-password/set-password/page.tsx                                                                                        |  193 
 app/components/base/markdown-blocks/button.tsx                                                                                  |   39 
 app/components/billing/vector-space-full/index.tsx                                                                              |   29 
 app/components/share/text-generation/info-modal.tsx                                                                             |   49 
 app/components/workflow/block-selector/market-place-plugin/list.tsx                                                             |  131 
 i18n/ja-JP/app-log.ts                                                                                                           |   98 
 i18n/ko-KR/dataset-hit-testing.ts                                                                                               |   35 
 app/components/base/icons/src/vender/line/time/ClockRefresh.json                                                                |   62 
 i18n/en-US/custom.ts                                                                                                            |   32 
 service/use-workflow.ts                                                                                                         |   87 
 app/(shareLayout)/webapp-signin/page.tsx                                                                                        |  103 
 app/components/plugins/plugin-detail-panel/agent-strategy-list.tsx                                                              |   58 
 app/components/base/notion-page-selector/notion-page-selector-modal/index.tsx                                                   |   63 
 app/components/datasets/create/website/base/error-message.tsx                                                                   |   30 
 app/components/plugins/install-plugin/install-from-marketplace/index.tsx                                                        |  125 
 app/components/header/assets/salesforce.svg                                                                                     |   12 
 app/components/base/icons/src/vender/line/mapsAndTravel/Globe01.tsx                                                             |   20 
 app/components/base/chat/chat-with-history/sidebar/list.tsx                                                                     |   40 
 app/components/datasets/create/assets/folder-plus.svg                                                                           |    3 
 app/components/base/icons/src/public/common/MessageChatSquare.json                                                              |   37 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-started.ts                                          |   82 
 i18n/ko-KR/workflow.ts                                                                                                          |  921 
 app/components/workflow/nodes/llm/types.ts                                                                                      |   68 
 i18n/tr-TR/dataset.ts                                                                                                           |  221 
 app/components/base/app-icon-picker/style.module.css                                                                            |   12 
 app/components/workflow/run/agent-log/agent-log-item.tsx                                                                        |  126 
 app/components/workflow/utils/edge.ts                                                                                           |   23 
 app/components/explore/index.tsx                                                                                                |   63 
 app/components/workflow/run/assets/bg-line-error.svg                                                                            |    3 
 i18n/hi-IN/dataset-creation.ts                                                                                                  |  238 
 app/components/base/icons/src/vender/solid/general/ZapFast.json                                                                 |   79 
 app/components/workflow/nodes/_base/components/input-support-select-var.tsx                                                     |  126 
 public/vs/basic-languages/typescript/typescript.js                                                                              |   10 
 app/components/base/icons/src/public/files/Txt.json                                                                             |  180 
 app/components/plugins/plugin-detail-panel/tool-selector/tool-credentials-form.tsx                                              |   97 
 app/components/header/account-setting/model-provider-page/hooks.spec.ts                                                         |   87 
 app/components/base/icons/src/vender/solid/files/File05.json                                                                    |   55 
 i18n/zh-Hans/tools.ts                                                                                                           |  158 
 app/components/app/overview/embedded/style.module.css                                                                           |   20 
 app/components/base/chat/chat/citation/popup.tsx                                                                                |  131 
 app/components/workflow/nodes/_base/components/variable/assigned-var-reference-popup.tsx                                        |   39 
 app/components/plugins/plugin-page/filter-management/tag-filter.tsx                                                             |  122 
 app/components/base/prompt-editor/plugins/history-block/history-block-replacement-block.tsx                                     |   62 
 app/components/workflow/nodes/_base/components/config-vision.tsx                                                                |   91 
 app/components/base/icons/src/public/knowledge/ParentChildType.tsx                                                              |   20 
 app/components/base/icons/assets/vender/solid/general/download-02.svg                                                           |    3 
 app/components/workflow/run/status.tsx                                                                                          |  151 
 i18n/zh-Hant/register.ts                                                                                                        |    4 
 app/components/base/icons/src/public/llm/HuggingfaceTextHub.json                                                                |  350 
 app/components/workflow/utils/workflow.ts                                                                                       |  329 
 app/components/base/icons/assets/public/llm/localai-text.svg                                                                    |   22 
 app/components/datasets/hit-testing/components/result-item-external.tsx                                                         |   60 
 app/components/base/icons/src/public/common/index.ts                                                                            |   15 
 app/components/base/icons/src/vender/solid/layout/Grid01.json                                                                   |   79 
 app/components/plugins/marketplace/search-box/search-box-wrapper.tsx                                                            |   45 
 app/components/workflow/panel/version-history-panel/filter/filter-item.tsx                                                      |   32 
 app/components/app/create-app-dialog/app-card/index.tsx                                                                         |   60 
 app/components/base/icons/src/vender/line/development/ArtificialBrain.json                                                      |   29 
 app/components/workflow/nodes/code/dependency-picker.tsx                                                                        |   85 
 app/components/base/icons/src/public/llm/OpenaiBlack.tsx                                                                        |   20 
 app/components/plugins/install-plugin/install-bundle/steps/install.tsx                                                          |  118 
 app/components/datasets/create/assets/arrow-narrow-left.svg                                                                     |    3 
 app/components/datasets/documents/detail/completed/status-item.tsx                                                              |   22 
 app/components/header/account-setting/members-page/invited-modal/assets/copied.svg                                              |    3 
 app/components/workflow/block-selector/blocks.tsx                                                                               |  125 
 app/(commonLayout)/apps/assets/link-gray.svg                                                                                    |    3 
 i18n/pl-PL/share-app.ts                                                                                                         |   83 
 app/components/base/icons/src/vender/solid/mediaAndDevices/Microphone01.json                                                    |   55 
 app/components/datasets/documents/detail/new-segment.tsx                                                                        |  205 
 public/vs/basic-languages/pug/pug.js                                                                                            |   10 
 public/vs/basic-languages/msdax/msdax.js                                                                                        |   10 
 app/components/base/icons/assets/vender/line/general/menu-01.svg                                                                |    5 
 app/components/app/configuration/config-var/config-modal/index.tsx                                                              |  249 
 app/components/base/icons/assets/vender/line/files/file-check-02.svg                                                            |    5 
 app/components/workflow/nodes/_base/components/next-step/operator.tsx                                                           |  129 
 app/components/workflow/run/assets/highlight.svg                                                                                |    9 
 app/components/workflow/utils/layout.ts                                                                                         |  178 
 service/datasets.ts                                                                                                             |  289 
 public/vs/basic-languages/cameligo/cameligo.js                                                                                  |   10 
 app/components/workflow/nodes/document-extractor/node.tsx                                                                       |   42 
 app/components/base/icons/src/vender/line/general/UploadCloud01.tsx                                                             |   20 
 app/components/base/simple-pie-chart/index.module.css                                                                           |    4 
 app/components/base/icons/assets/vender/workflow/iteration-start.svg                                                            |    5 
 app/components/base/icons/assets/vender/line/development/terminal-square.svg                                                    |    5 
 app/components/plugins/marketplace/sort-dropdown/index.tsx                                                                      |   94 
 app/components/base/features/new-feature-panel/feature-bar.tsx                                                                  |  145 
 app/components/datasets/documents/assets/layoutRightShow.svg                                                                    |    4 
 public/screenshots/dark/Chatbot@3x.png                                                                                          |    0 
 app/components/base/icons/src/public/common/Gdpr.tsx                                                                            |   20 
 app/components/base/prompt-editor/plugins/history-block/index.tsx                                                               |   80 
 app/components/base/mermaid/utils.ts                                                                                            |  232 
 app/components/base/icons/src/public/files/Md.json                                                                              |  144 
 app/components/base/icons/src/public/llm/LocalaiText.tsx                                                                        |   20 
 app/components/workflow/nodes/start/components/var-item.tsx                                                                     |  103 
 themes/tailwind-theme-var-define.ts                                                                                             |  740 
 app/components/base/icons/assets/vender/solid/users/user-edit-02.svg                                                            |   14 
 app/components/datasets/create/website/firecrawl/index.tsx                                                                      |  217 
 app/components/app-sidebar/app-info.tsx                                                                                         |  418 
 app/components/base/icons/src/vender/solid/editor/Colors.tsx                                                                    |   20 
 app/components/base/icons/assets/vender/line/communication/message-check-remove.svg                                             |    5 
 app/components/workflow/nodes/parameter-extractor/components/extract-parameter/item.tsx                                         |   59 
 app/components/base/chat/chat/citation/index.tsx                                                                                |  125 
 app/components/base/date-and-time-picker/time-picker/options.tsx                                                                |   71 
 app/components/base/icons/src/vender/line/financeAndECommerce/Tag01.tsx                                                         |   20 
 app/components/base/icons/src/public/thought/DataSet.json                                                                       |   64 
 app/components/header/account-setting/data-source-page/panel/types.ts                                                           |    4 
 app/components/app/configuration/debug/debug-with-multiple-model/debug-item.tsx                                                 |  129 
 public/screenshots/light/Chatflow.png                                                                                           |    0 
 app/components/workflow/nodes/_base/hooks/use-var-list.ts                                                                       |   37 
 app/components/workflow/run/output-panel.tsx                                                                                    |  111 
 i18n/ro-RO/register.ts                                                                                                          |    4 
 app/components/workflow/hooks/use-edges-interactions.ts                                                                         |  161 
 app/components/app/configuration/config-var/input-type-icon.tsx                                                                 |   44 
 app/components/base/chat/chat/answer/__mocks__/workflowProcess.ts                                                               |  138 
 app/components/base/icons/assets/vender/solid/FinanceAndECommerce/gold-coin.svg                                                 |    3 
 app/components/base/icons/src/vender/line/mediaAndDevices/SlidersH.json                                                         |   29 
 app/components/base/prompt-editor/plugins/workflow-variable-block/component.tsx                                                 |  169 
 app/components/base/chat/constants.ts                                                                                           |    2 
 app/components/datasets/documents/detail/completed/skeleton/general-list-skeleton.tsx                                           |   74 
 app/components/base/icons/src/public/plugins/PartnerDark.json                                                                   |  447 
 app/components/base/icons/src/vender/solid/general/SearchMd.json                                                                |   38 
 app/components/base/app-icon-picker/ImageInput.tsx                                                                              |  126 
 public/screenshots/light/Agent@3x.png                                                                                           |    0 
 app/components/base/icons/src/public/files/index.ts                                                                             |   11 
 app/components/base/icons/assets/vender/other/generator.svg                                                                     |    4 
 app/components/base/icons/assets/public/tracing/langfuse-icon-big.svg                                                           |   32 
 app/components/base/image-gallery/index.tsx                                                                                     |   84 
 i18n/tr-TR/billing.ts                                                                                                           |  200 
 app/components/base/icons/src/vender/solid/development/FileHeart02.json                                                         |   50 
 app/components/app/create-app-dialog/app-list/index.tsx                                                                         |  253 
 app/components/base/icons/src/vender/workflow/Http.json                                                                         |   71 
 context/query-client.tsx                                                                                                        |   23 
 i18n/es-ES/app-api.ts                                                                                                           |   85 
 public/vs/language/typescript/tsWorker.js                                                                                       | 37249 +++++
 i18n/sl-SI/app.ts                                                                                                               |  214 
 app/components/workflow/nodes/_base/components/group.tsx                                                                        |   25 
 app/components/workflow/panel/version-history-panel/version-history-item.tsx                                                    |  137 
 i18n/de-DE/dataset-creation.ts                                                                                                  |  218 
 public/vs/basic-languages/sb/sb.js                                                                                              |   10 
 i18n/vi-VN/dataset-creation.ts                                                                                                  |  218 
 i18n/ko-KR/layout.ts                                                                                                            |    3 
 app/components/datasets/create/step-one/index.tsx                                                                               |  325 
 i18n/sl-SI/dataset.ts                                                                                                           |  221 
 app/components/base/icons/utils.ts                                                                                              |   66 
 app/components/datasets/create/website/jina-reader/index.tsx                                                                    |  230 
 app/components/base/icons/src/vender/solid/development/Semantic.json                                                            |   53 
 i18n/tr-TR/tools.ts                                                                                                             |  158 
 app/components/plugins/base/key-value-item.tsx                                                                                  |   66 
 app/components/datasets/documents/detail/metadata/style.module.css                                                              |  103 
 app/components/base/icons/src/vender/solid/mediaAndDevices/DocumentSupportIcon.tsx                                              |   20 
 app/components/header/account-setting/key-validator/declarations.ts                                                             |   43 
 assets/md.svg                                                                                                                   |   18 
 app/components/base/icons/src/vender/solid/development/index.ts                                                                 |   13 
 app/components/base/chat/chat/chat-input-area/index.tsx                                                                         |  246 
 i18n/pt-BR/billing.ts                                                                                                           |  201 
 app/components/header/account-setting/key-validator/index.tsx                                                                   |  122 
 app/components/base/icons/src/public/tracing/LangsmithIcon.json                                                                 |  188 
 app/components/base/icons/src/vender/features/MessageFast.json                                                                  |   28 
 app/components/base/icons/src/vender/line/development/FileHeart02.tsx                                                           |   20 
 app/components/base/icons/src/public/files/Unknown.tsx                                                                          |   20 
 app/components/base/icons/src/vender/solid/development/PuzzlePiece01.json                                                       |   38 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-finished.ts                                    |   60 
 app/components/workflow/note-node/note-editor/plugins/link-editor-plugin/hooks.ts                                               |  115 
 app/components/base/icons/assets/vender/line/arrows/chevron-selector-vertical.svg                                               |    3 
 app/components/base/icons/src/vender/line/general/LogOut01.tsx                                                                  |   20 
 public/vs/editor/editor.main.nls.de.js                                                                                          |   15 
 app/components/datasets/create/notion-page-preview/index.tsx                                                                    |   75 
 app/components/base/icons/src/vender/workflow/Llm.json                                                                          |   38 
 i18n/fa-IR/plugin.ts                                                                                                            |  215 
 i18n/it-IT/plugin.ts                                                                                                            |  215 
 app/components/plugins/marketplace/empty/line.tsx                                                                               |   21 
 app/components/base/icons/src/vender/line/development/Container.tsx                                                             |   20 
 public/vs/base/common/worker/simpleWorker.nls.it.js                                                                             |    8 
 app/components/base/notion-page-selector/notion-page-selector-modal/index.module.css                                            |   28 
 public/vs/basic-languages/csp/csp.js                                                                                            |   10 
 app/components/workflow/nodes/_base/components/collapse/field-collapse.tsx                                                      |   36 
 utils/index.ts                                                                                                                  |  101 
 app/components/datasets/create/website/index.module.css                                                                         |   13 
 service/use-models.ts                                                                                                           |   17 
 app/components/base/icons/assets/vender/line/general/check-done-01.svg                                                          |    5 
 public/vs/basic-languages/powerquery/powerquery.js                                                                              |   10 
 app/components/base/icons/src/vender/line/general/Target04.tsx                                                                  |   20 
 app/components/workflow/store/workflow/history-slice.ts                                                                         |   25 
 i18n/ja-JP/plugin-tags.ts                                                                                                       |   25 
 app/components/base/icons/src/vender/features/Document.json                                                                     |   23 
 app/components/plugins/plugin-detail-panel/utils.ts                                                                             |   21 
 app/components/datasets/create/step-two/unescape.ts                                                                             |   54 
 app/components/base/icons/assets/vender/line/alertsAndFeedback/thumbs-down.svg                                                  |   10 
 app/components/workflow/nodes/_base/hooks/use-node-crud.ts                                                                      |   19 
 app/components/base/icons/assets/public/thought/data-set.svg                                                                    |   10 
 app/components/plugins/marketplace/list/list-with-collection.tsx                                                                |   86 
 i18n/tr-TR/dataset-hit-testing.ts                                                                                               |   35 
 app/components/datasets/create/website/firecrawl/options.tsx                                                                    |   85 
 app/components/workflow/nodes/assigner/components/operation-selector.tsx                                                        |  128 
 app/components/workflow/nodes/parameter-extractor/components/reasoning-mode-picker.tsx                                          |   49 
 app/components/base/icons/src/public/common/Iso.tsx                                                                             |   20 
 public/vs/basic-languages/pascal/pascal.js                                                                                      |   10 
 app/components/header/account-setting/model-provider-page/model-parameter-modal/parameter-item.tsx                              |  295 
 app/components/app/configuration/config/agent-setting-button.tsx                                                                |   47 
 app/components/datasets/create/empty-dataset-creation-modal/index.module.css                                                    |   35 
 utils/classnames.spec.ts                                                                                                        |   56 
 app/components/workflow/nodes/_base/components/node-resizer.tsx                                                                 |   60 
 app/components/base/icons/assets/public/llm/zhipuai.svg                                                                         |    8 
 i18n/zh-Hans/app.ts                                                                                                             |  201 
 i18n/ko-KR/custom.ts                                                                                                            |   32 
 app/components/base/icons/src/public/llm/Huggingface.json                                                                       |  158 
 app/components/base/icons/src/vender/line/mediaAndDevices/Microphone01.tsx                                                      |   20 
 i18n/vi-VN/billing.ts                                                                                                           |  200 
 i18n/fa-IR/dataset-creation.ts                                                                                                  |  218 
 app/components/base/chat/chat/answer/more.tsx                                                                                   |   46 
 i18n/en-US/app.ts                                                                                                               |  200 
 public/vs/basic-languages/markdown/markdown.js                                                                                  |   10 
 app/components/base/icons/src/public/education/index.ts                                                                         |    1 
 utils/index.spec.ts                                                                                                             |  295 
 app/components/base/icons/assets/vender/line/arrows/refresh-cw-05.svg                                                           |    3 
 i18n/vi-VN/app-api.ts                                                                                                           |   85 
 app/components/base/icons/assets/public/education/triangle.svg                                                                  |    3 
 app/components/datasets/create/stepper/step.tsx                                                                                 |   46 
 app/components/workflow/run/loop-log/loop-log-trigger.tsx                                                                       |  109 
 app/components/base/icons/src/vender/line/development/Webhooks.json                                                             |   89 
 app/components/app/configuration/dataset-config/card-item/item.tsx                                                              |  122 
 app/components/header/account-setting/api-based-extension-page/selector.tsx                                                     |  127 
 app/(commonLayout)/datasets/create/page.tsx                                                                                     |   12 
 app/components/plugins/card/base/placeholder.tsx                                                                                |   51 
 app/components/workflow/run/loop-log/index.tsx                                                                                  |    2 
 app/components/base/icons/assets/public/billing/asterisk.svg                                                                    |    5 
 app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/tree-indent-line.tsx                            |   24 
 app/components/base/icons/assets/vender/line/editor/colors.svg                                                                  |    5 
 app/components/base/icons/src/vender/workflow/DocsExtractor.tsx                                                                 |   20 
 app/components/base/icons/src/vender/solid/development/Container.tsx                                                            |   20 
 i18n/pl-PL/login.ts                                                                                                             |  115 
 app/components/base/icons/src/public/billing/Sparkles.json                                                                      |   95 
 utils/format.ts                                                                                                                 |   58 
 app/components/base/icons/assets/vender/line/weather/stars-02.svg                                                               |    3 
 app/components/header/index.tsx                                                                                                 |  115 
 app/components/base/icons/assets/public/other/default-tool-icon.svg                                                             |    9 
 app/components/base/icons/assets/vender/solid/development/api-connection.svg                                                    |    8 
 app/components/header/account-setting/members-page/edit-workspace-modal/index.module.css                                        |    0 
 i18n/ro-RO/dataset-hit-testing.ts                                                                                               |   35 
 app/components/workflow/run/utils/format-log/iteration/index.ts                                                                 |   56 
 app/components/base/icons/src/public/llm/AzureOpenaiServiceText.json                                                            |  236 
 app/components/app/configuration/base/icons/suggested-questions-after-answer-icon.tsx                                           |   12 
 i18n/es-ES/dataset.ts                                                                                                           |  219 
 app/components/base/svg-gallery/index.tsx                                                                                       |   78 
 app/components/base/icons/src/vender/line/files/FileArrow01.json                                                                |   39 
 app/components/base/prompt-editor/plugins/component-picker-block/hooks.tsx                                                      |  288 
 public/vs/basic-languages/bicep/bicep.js                                                                                        |   11 
 app/components/app/configuration/debug/debug-with-multiple-model/chat-item.tsx                                                  |  160 
 app/components/base/icons/assets/vender/line/general/refresh.svg                                                                |    1 
 app/components/datasets/create/assets/star-07.svg                                                                               |   11 
 i18n/sl-SI/common.ts                                                                                                            |  871 
 app/(commonLayout)/layout.tsx                                                                                                   |   38 
 app/components/base/icons/src/vender/line/general/LogIn04.tsx                                                                   |   20 
 app/components/datasets/create/assets/piggy-bank-01.svg                                                                         |    4 
 app/components/base/icons/assets/vender/line/mediaAndDevices/microphone-01.svg                                                  |    5 
 i18n/de-DE/common.ts                                                                                                            |  672 
 app/components/workflow/nodes/iteration/node.tsx                                                                                |   72 
 service/use-education.ts                                                                                                        |   67 
 app/components/base/icons/src/vender/line/general/Bookmark.json                                                                 |   29 
 app/components/workflow/nodes/_base/components/setting-item.tsx                                                                 |   28 
 app/components/workflow/nodes/end/node.tsx                                                                                      |   88 
 app/components/base/icons/src/image/llm/MinimaxText.module.css                                                                  |    5 
 i18n/vi-VN/dataset-documents.ts                                                                                                 |  394 
 app/components/base/icons/src/public/tracing/LangsmithIconBig.tsx                                                               |   20 
 app/components/plugins/provider-card.tsx                                                                                        |   99 
 app/components/base/image-uploader/uploader.tsx                                                                                 |   58 
 app/components/base/icons/src/vender/solid/shapes/index.ts                                                                      |    3 
 app/components/datasets/create/assets/html.svg                                                                                  |   23 
 app/components/base/icons/src/vender/line/general/Hash02.tsx                                                                    |   20 
 app/components/base/icons/src/vender/line/communication/MessageFastPlus.tsx                                                     |   20 
 app/components/workflow/syncing-data-modal.tsx                                                                                  |   15 
 i18n/ko-KR/app.ts                                                                                                               |  210 
 app/components/base/icons/assets/public/common/gdpr.svg                                                                         |   53 
 app/components/plugins/update-plugin/from-market-place.tsx                                                                      |  154 
 app/components/workflow/nodes/loop-start/default.ts                                                                             |   21 
 app/components/base/icons/src/public/llm/Anthropic.tsx                                                                          |   20 
 app/components/develop/secret-key/secret-key-button.tsx                                                                         |   35 
 app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form.tsx                                              |  275 
 app/components/base/icons/assets/vender/solid/development/variable-02.svg                                                       |    9 
 app/components/base/icons/src/vender/line/time/index.ts                                                                         |    4 
 app/components/datasets/documents/assets/typeSquare.svg                                                                         |    3 
 app/components/app/configuration/config-var/index.tsx                                                                           |  271 
 app/components/base/icons/src/vender/solid/alertsAndFeedback/AlertTriangle.tsx                                                  |   20 
 app/components/base/icons/assets/vender/line/communication/chat-bot.svg                                                         |   14 
 app/components/tools/edit-custom-collection-modal/modal.tsx                                                                     |  360 
 i18n/en-US/login.ts                                                                                                             |  109 
 app/components/workflow/nodes/_base/components/error-handle/utils.ts                                                            |   83 
 i18n/ro-RO/time.ts                                                                                                              |   37 
 app/components/workflow/nodes/_base/components/variable/var-list.tsx                                                            |  109 
 app/components/datasets/documents/assets/messageTextCircle.svg                                                                  |    3 
 app/components/workflow/nodes/http/components/authorization/radio-group.tsx                                                     |   62 
 i18n/server.ts                                                                                                                  |   56 
 app/components/base/icons/src/vender/workflow/ListFilter.tsx                                                                    |   20 
 app/components/base/icons/src/image/llm/TongyiText.module.css                                                                   |    5 
 app/components/base/icons/src/vender/line/general/LogOut04.json                                                                 |   53 
 app/components/billing/usage-info/apps-info.tsx                                                                                 |   34 
 public/vs/basic-languages/wgsl/wgsl.js                                                                                          |  307 
 i18n/uk-UA/app-overview.ts                                                                                                      |  173 
 app/components/billing/progress-bar/index.tsx                                                                                   |   24 
 app/components/base/icons/assets/vender/solid/general/question-triangle.svg                                                     |    6 
 service/use-plugins.ts                                                                                                          |  529 
 app/components/workflow/nodes/code/node.tsx                                                                                     |   13 
 i18n/sl-SI/time.ts                                                                                                              |   37 
 app/components/base/icons/assets/vender/line/others/exchange-02.svg                                                             |    3 
 app/components/base/icons/assets/vender/solid/general/answer-triangle.svg                                                       |    3 
 app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/documents/create/page.tsx                                         |   20 
 app/components/base/icons/assets/vender/features/citations.svg                                                                  |    3 
 assets/action.svg                                                                                                               |    5 
 app/components/header/account-setting/plugin-page/utils.ts                                                                      |   34 
 i18n/ja-JP/app-debug.ts                                                                                                         |  527 
 app/components/base/icons/assets/vender/line/financeAndECommerce/receipt-list.svg                                               |    3 
 i18n/ru-RU/plugin-tags.ts                                                                                                       |   25 
 app/components/base/icons/src/public/common/SparklesSoft.tsx                                                                    |   20 
 app/components/datasets/external-knowledge-base/create/declarations.ts                                                          |   12 
 app/components/datasets/create/assets/docx.svg                                                                                  |   23 
 app/components/workflow/nodes/_base/components/variable/var-reference-popup.tsx                                                 |   65 
 app/components/base/chat/chat-with-history/sidebar/index.tsx                                                                    |  179 
 app/components/base/icons/src/image/llm/TongyiText.tsx                                                                          |   20 
 app/components/header/account-setting/model-provider-page/model-parameter-modal/model-display.tsx                               |   25 
 app/components/base/icons/assets/public/files/json.svg                                                                          |   23 
 app/components/base/icons/src/public/model/Checked.json                                                                         |   29 
 i18n/i18next-config.ts                                                                                                          |   65 
 public/logo/logo-embedded-chat-header@3x.png                                                                                    |    0 
 app/components/base/date-and-time-picker/year-and-month-picker/header.tsx                                                       |   27 
 i18n/ko-KR/plugin.ts                                                                                                            |  215 
 app/components/base/icons/assets/vender/line/users/user-01.svg                                                                  |    5 
 app/components/base/mermaid/utils.spec.ts                                                                                       |    8 
 i18n/vi-VN/plugin-tags.ts                                                                                                       |   25 
 app/components/plugins/plugin-mutation-model/index.tsx                                                                          |   79 
 public/logo/logo-embedded-chat-header.png                                                                                       |    0 
 app/components/app/configuration/images/prompt.svg                                                                              |   19 
 app/components/datasets/create/step-two/preview-item/index.tsx                                                                  |   78 
 app/components/datasets/formatted-text/flavours/preview-slice.tsx                                                               |   56 
 app/components/workflow/note-node/note-editor/plugins/link-editor-plugin/index.tsx                                              |   25 
 app/components/workflow/utils/index.ts                                                                                          |    8 
 app/components/workflow/nodes/_base/components/panel-operator/index.tsx                                                         |   77 
 app/components/workflow/nodes/iteration-start/index.tsx                                                                         |   42 
 public/screenshots/light/Chatflow@2x.png                                                                                        |    0 
 app/components/base/icons/src/vender/solid/development/PatternRecognition.json                                                  |   98 
 app/components/base/prompt-editor/plugins/history-block/component.tsx                                                           |   92 
 app/components/base/icons/assets/public/llm/openai-violet.svg                                                                   |    4 
 app/components/workflow/simple-node/types.ts                                                                                    |    3 
 app/components/base/image-uploader/text-generation-image-uploader.tsx                                                           |  148 
 app/components/workflow/operator/add-block.tsx                                                                                  |  111 
 app/components/base/icons/src/vender/solid/security/Lock01.tsx                                                                  |   20 
 app/components/datasets/create/assets/upload-cloud-01.svg                                                                       |    4 
 i18n/en-US/explore.ts                                                                                                           |   44 
 app/components/base/icons/src/public/model/Checked.tsx                                                                          |   20 
 app/components/base/icons/src/image/llm/Minimax.module.css                                                                      |    5 
 i18n/tr-TR/dataset-settings.ts                                                                                                  |   43 
 utils/emoji.ts                                                                                                                  |   11 
 app/components/app/configuration/config/agent/agent-tools/setting-built-in-tool.tsx                                             |  238 
 i18n/ja-JP/app-api.ts                                                                                                           |   85 
 app/components/base/icons/assets/public/files/csv.svg                                                                           |   24 
 app/components/base/icons/src/public/files/Txt.tsx                                                                              |   20 
 app/components/workflow/run/utils/format-log/graph-to-log-struct.spec.ts                                                        |  138 
 app/components/datasets/documents/assets/file.svg                                                                               |    3 
 app/components/workflow/nodes/start/use-config.ts                                                                               |   82 
 app/components/workflow/nodes/question-classifier/node.tsx                                                                      |   72 
 app/components/base/notion-page-selector/assets/clear.svg                                                                       |    3 
 app/components/base/icons/src/vender/workflow/ParameterExtractor.json                                                           |  266 
 app/components/base/prompt-editor/plugins/query-block/query-block-replacement-block.tsx                                         |   60 
 app/components/base/spinner/index.spec.tsx                                                                                      |   49 
 app/components/header/license-env/index.tsx                                                                                     |   32 
 app/components/base/icons/src/vender/solid/editor/Paragraph.tsx                                                                 |   20 
 .storybook/main.ts                                                                                                              |   19 
 app/components/base/with-input-validation/index.spec.tsx                                                                        |   41 
 app/components/app/annotation/remove-annotation-confirm-modal/index.tsx                                                         |   29 
 app/components/workflow/nodes/iteration-start/types.ts                                                                          |    3 
 app/components/base/icons/src/vender/line/layout/AlignRight01.json                                                              |   39 
 app/components/base/icons/src/public/llm/Openllm.json                                                                           |   83 
 app/components/workflow/nodes/list-operator/types.ts                                                                            |   38 
 app/components/workflow/run/status-container.tsx                                                                                |   51 
 app/components/datasets/documents/rename-modal.tsx                                                                              |   76 
 app/components/workflow/hooks-store/store.ts                                                                                    |   75 
 i18n/it-IT/dataset.ts                                                                                                           |  227 
 i18n/pt-BR/app-log.ts                                                                                                           |  105 
 app/init/page.tsx                                                                                                               |   17 
 app/components/workflow/nodes/list-operator/node.tsx                                                                            |   42 
 app/components/base/icons/src/vender/line/development/FileHeart02.json                                                          |   52 
 app/components/base/icons/assets/public/llm/huggingface-text-hub.svg                                                            |   45 
 app/components/base/icons/assets/public/knowledge/layout-right-2-line-mod.svg                                                   |    5 
 app/components/datasets/metadata/metadata-dataset/select-metadata.tsx                                                           |   82 
 app/(commonLayout)/datasets/DatasetCard.tsx                                                                                     |  240 
 app/components/app/configuration/base/warning-mask/cannot-query-dataset.tsx                                                     |   31 
 app/components/header/account-setting/data-source-page/data-source-website/index.tsx                                            |  132 
 i18n/zh-Hant/time.ts                                                                                                            |   37 
 app/components/base/icons/assets/vender/solid/communication/chat-bot.svg                                                        |    7 
 app/components/workflow/nodes/code/default.ts                                                                                   |   43 
 i18n/en-US/app-annotation.ts                                                                                                    |   87 
 app/components/base/icons/src/public/llm/Huggingface.tsx                                                                        |   20 
 app/components/datasets/create/assets/annotation-info.svg                                                                       |    3 
 app/components/workflow/header/view-workflow-history.tsx                                                                        |  273 
 app/components/base/icons/src/vender/line/development/CodeBrowser.tsx                                                           |   20 
 i18n/it-IT/app-annotation.ts                                                                                                    |   89 
 app/components/base/search-input/index.tsx                                                                                      |   77 
 app/components/base/features/new-feature-panel/text-to-speech/voice-settings.tsx                                                |   47 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/advanced-options.tsx              |   77 
 .storybook/storybook.css                                                                                                        |    6 
 app/components/base/icons/assets/vender/line/financeAndECommerce/tag-01.svg                                                     |   10 
 context/dataset-detail.ts                                                                                                       |   17 
 app/components/header/plugins-nav/index.tsx                                                                                     |   66 
 i18n/fr-FR/app-api.ts                                                                                                           |   85 
 i18n/pt-BR/register.ts                                                                                                          |    4 
 app/install/installForm.tsx                                                                                                     |  184 
 app/components/base/icons/assets/vender/solid/FinanceAndECommerce/scales-02.svg                                                 |    5 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/required-switch.tsx               |   25 
 app/components/base/icons/assets/public/llm/zhipuai-text.svg                                                                    |    6 
 app/components/develop/template/template_workflow.zh.mdx                                                                        |  783 
 app/components/datasets/create/website/jina-reader/options.tsx                                                                  |   61 
 app/components/header/account-setting/model-provider-page/model-selector/feature-icon.tsx                                       |  124 
 app/components/base/icons/src/vender/line/users/User01.tsx                                                                      |   20 
 service/_tools_util.spec.ts                                                                                                     |   16 
 i18n/th-TH/layout.ts                                                                                                            |    3 
 i18n/uk-UA/education.ts                                                                                                         |   47 
 app/components/base/icons/assets/vender/line/general/x.svg                                                                      |    5 
 app/components/workflow-app/hooks/use-is-chat-mode.ts                                                                           |    7 
 app/components/base/icons/src/vender/line/general/Settings04.tsx                                                                |   20 
 app/components/plugins/plugin-page/use-permission.ts                                                                            |   61 
 app/components/base/icons/src/vender/line/others/Colors.tsx                                                                     |   20 
 app/components/base/icons/src/vender/solid/communication/Send03.tsx                                                             |   20 
 app/components/base/icons/src/public/billing/Diamond.tsx                                                                        |   20 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/add-field.tsx                               |   33 
 service/strategy.ts                                                                                                             |   10 
 app/components/app/text-generate/saved-items/index.tsx                                                                          |   75 
 app/components/base/icons/src/vender/line/others/Env.tsx                                                                        |   20 
 service/tag.ts                                                                                                                  |   47 
 app/components/base/icons/src/vender/workflow/Assigner.json                                                                     |   68 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-replace.ts                                               |   23 
 app/components/app/configuration/tools/index.tsx                                                                                |  191 
 app/components/base/icons/src/vender/line/communication/index.ts                                                                |    6 
 app/components/workflow/nodes/_base/components/variable/constant-field.tsx                                                      |   65 
 i18n/ru-RU/workflow.ts                                                                                                          |  921 
 app/components/base/icons/src/public/tracing/WeaveIcon.json                                                                     |  279 
 app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/documents/page.tsx                                                |   20 
 app/components/base/icons/src/public/other/Icon3Dots.json                                                                       |   29 
 app/signin/page.tsx                                                                                                             |   15 
 app/components/base/icons/src/vender/line/mapsAndTravel/index.ts                                                                |    2 
 app/components/base/action-button/index.tsx                                                                                     |   73 
 i18n/vi-VN/app-log.ts                                                                                                           |  100 
 app/components/base/icons/src/vender/workflow/VariableX.tsx                                                                     |   20 
 app/components/base/icons/assets/public/model/checked.svg                                                                       |    3 
 i18n/pt-BR/dataset-documents.ts                                                                                                 |  395 
 app/components/base/icons/src/vender/line/files/FileDownload02.tsx                                                              |   20 
 app/components/plugins/install-plugin/hooks/use-refresh-plugin-list.tsx                                                         |   48 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/annotations/page.tsx                                                           |   15 
 i18n/ro-RO/plugin.ts                                                                                                            |  215 
 app/components/base/icons/src/public/llm/Azureai.json                                                                           |  180 
 i18n/sl-SI/login.ts                                                                                                             |  110 
 i18n/ro-RO/app-overview.ts                                                                                                      |  173 
 app/components/base/icons/src/vender/line/editor/AlignLeft.json                                                                 |   39 
 app/components/base/icons/assets/vender/line/general/edit-02.svg                                                                |   10 
 app/components/base/icons/src/public/llm/HuggingfaceText.json                                                                   |  322 
 app/components/base/icons/src/vender/line/editor/BezierCurve03.json                                                             |   38 
 app/components/base/action-button/index.css                                                                                     |   45 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-chunk.ts                                                 |   25 
 app/components/base/icons/src/public/llm/Microsoft.tsx                                                                          |   20 
 app/components/workflow/nodes/end/panel.tsx                                                                                     |   49 
 i18n/de-DE/explore.ts                                                                                                           |   44 
 public/vs/basic-languages/apex/apex.js                                                                                          |   10 
 i18n/tr-TR/register.ts                                                                                                          |    3 
 app/components/workflow/nodes/list-operator/panel.tsx                                                                           |  184 
 app/components/header/account-setting/index.tsx                                                                                 |  229 
 app/components/header/account-setting/model-provider-page/index.tsx                                                             |  161 
 app/components/base/icons/src/public/llm/Chatglm.json                                                                           |   72 
 public/vs/basic-languages/perl/perl.js                                                                                          |   10 
 app/components/base/prompt-editor/plugins/query-block/node.tsx                                                                  |   59 
 app/components/billing/pricing/self-hosted-plan-item.tsx                                                                        |  176 
 app/components/datasets/external-api/declarations.ts                                                                            |   16 
 i18n/tr-TR/app-log.ts                                                                                                           |   98 
 app/components/datasets/create/website/jina-reader/base/checkbox-with-label.tsx                                                 |   40 
 app/components/header/indicator/index.tsx                                                                                       |   59 
 app/components/app/annotation/index.tsx                                                                                         |  287 
 app/components/app/create-from-dsl-modal/dsl-confirm-modal.tsx                                                                  |   46 
 app/components/base/icons/assets/vender/line/editor/collapse.svg                                                                |    9 
 app/components/base/features/new-feature-panel/moderation/moderation-setting-modal.tsx                                          |  380 
 app/components/header/app-selector/index.tsx                                                                                    |  112 
 app/components/workflow/nodes/_base/components/next-step/item.tsx                                                               |   86 
 app/components/base/icons/src/image/llm/WxyyText.tsx                                                                            |   20 
 i18n/ru-RU/common.ts                                                                                                            |  672 
 app/components/datasets/create/assets/txt.svg                                                                                   |   23 
 app/components/base/icons/src/public/common/MessageChatSquare.tsx                                                               |   20 
 app/components/base/icons/assets/vender/line/others/tools.svg                                                                   |   14 
 app/components/base/image-uploader/image-link-input.tsx                                                                         |   56 
 app/components/workflow/nodes/_base/components/retry/retry-on-panel.tsx                                                         |  117 
 app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/hitTesting/page.tsx                                               |   20 
 app/components/develop/secret-key/assets/copy.svg                                                                               |    3 
 app/components/base/icons/src/vender/line/time/ClockPlaySlim.json                                                               |   39 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/assets/schema-generator-dark.tsx    |   15 
 app/components/workflow/nodes/start/panel.tsx                                                                                   |  184 
 app/components/browser-initor.tsx                                                                                               |   52 
 types/workflow.ts                                                                                                               |  354 
 i18n/fa-IR/share-app.ts                                                                                                         |   78 
 app/components/datasets/create/website/watercrawl/index.tsx                                                                     |  217 
 app/components/base/emoji-picker/index.tsx                                                                                      |   65 
 app/components/billing/apps-full-in-dialog/style.module.css                                                                     |    7 
 app/components/datasets/documents/detail/completed/child-segment-detail.tsx                                                     |  134 
 app/(commonLayout)/apps/assets/discord.svg                                                                                      |    3 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-date.tsx                         |   86 
 i18n/it-IT/billing.ts                                                                                                           |  213 
 app/components/base/icons/src/vender/workflow/Home.tsx                                                                          |   20 
 app/components/workflow/run/agent-log/agent-log-trigger.tsx                                                                     |   49 
 app/components/base/icons/src/public/llm/OpenllmText.json                                                                       |  143 
 i18n/tr-TR/dataset-documents.ts                                                                                                 |  394 
 app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/documents/[documentId]/page.tsx                                   |   21 
 app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/picker/index.tsx                                |   82 
 service/debug.ts                                                                                                                |  114 
 app/components/datasets/metadata/metadata-dataset/field.tsx                                                                     |   23 
 app/components/base/icons/src/vender/line/financeAndECommerce/ReceiptList.tsx                                                   |   20 
 app/components/plugins/plugin-detail-panel/multiple-tool-selector/index.tsx                                                     |  170 
 i18n/vi-VN/dataset.ts                                                                                                           |  221 
 i18n/fa-IR/education.ts                                                                                                         |   47 
 app/components/base/icons/src/vender/solid/users/UsersPlus.tsx                                                                  |   20 
 app/components/base/icons/src/vender/line/development/Webhooks.tsx                                                              |   20 
 app/components/workflow/nodes/_base/components/editor/text-editor.tsx                                                           |   63 
 app/components/header/account-setting/data-source-page/data-source-website/config-watercrawl-modal.tsx                          |  161 
 app/education-apply/search-input.tsx                                                                                            |  122 
 i18n/ro-RO/education.ts                                                                                                         |   47 
 app/components/base/icons/assets/vender/solid/editor/citations.svg                                                              |    5 
 app/components/base/icons/src/vender/features/MessageFast.tsx                                                                   |   20 
 public/screenshots/light/Workflow.png                                                                                           |    0 
 app/components/base/icons/assets/public/common/github.svg                                                                       |    5 
 app/components/workflow/operator/hooks.ts                                                                                       |   41 
 i18n/ro-RO/share-app.ts                                                                                                         |   82 
 app/components/header/env-nav/index.tsx                                                                                         |   46 
 public/vs/basic-languages/objective-c/objective-c.js                                                                            |   10 
 app/components/base/icons/assets/public/tracing/opik-icon.svg                                                                   |   88 
 app/components/base/icons/src/vender/line/others/LongArrowRight.json                                                            |   27 
 app/components/app/configuration/base/var-highlight/style.module.css                                                            |    3 
 app/components/workflow/store/workflow/tool-slice.ts                                                                            |   26 
 app/components/datasets/hit-testing/components/result-item.tsx                                                                  |  100 
 app/components/base/icons/src/public/llm/XorbitsInference.tsx                                                                   |   20 
 app/components/base/form/form-scenarios/demo/index.tsx                                                                          |   68 
 service/common.ts                                                                                                               |  353 
 public/vs/editor/editor.main.nls.zh-tw.js                                                                                       |   13 
 app/components/header/account-setting/model-provider-page/model-selector/empty-trigger.tsx                                      |   40 
 public/vs/basic-languages/systemverilog/systemverilog.js                                                                        |   10 
 app/components/header/account-dropdown/workplace-selector/index.tsx                                                             |   94 
 app/components/workflow/nodes/agent/panel.tsx                                                                                   |  177 
 app/components/workflow/context.tsx                                                                                             |   29 
 app/components/datasets/formatted-text/flavours/shared.tsx                                                                      |   80 
 app/components/base/icons/src/vender/solid/development/Semantic.tsx                                                             |   20 
 app/signin/check-code/page.tsx                                                                                                  |   96 
 i18n/it-IT/dataset-settings.ts                                                                                                  |   48 
 app/components/app/configuration/base/icons/remove-icon/index.tsx                                                               |   31 
 app/components/base/icons/src/vender/solid/communication/ListSparkle.json                                                       |   53 
 app/components/workflow/nodes/if-else/use-config.ts                                                                             |  278 
 app/components/header/account-setting/model-provider-page/model-parameter-modal/agent-model-trigger.tsx                         |  154 
 app/components/datasets/hit-testing/components/chunk-detail-modal.tsx                                                           |   92 
 app/components/app/annotation/edit-annotation-modal/index.tsx                                                                   |  146 
 app/components/workflow/nodes/_base/components/panel-operator/panel-operator-popup.tsx                                          |  197 
 app/components/base/icons/src/vender/solid/communication/CuteRobot.tsx                                                          |   20 
 app/education-apply/education-apply-page.tsx                                                                                    |  189 
 assets/doc.svg                                                                                                                  |   22 
 app/components/datasets/create/assets/progress-indicator.svg                                                                    |    8 
 i18n/en-US/plugin-tags.ts                                                                                                       |   25 
 i18n/vi-VN/app.ts                                                                                                               |  214 
 public/screenshots/light/Agent.png                                                                                              |    0 
 app/components/base/icons/assets/vender/solid/education/beaker-02.svg                                                           |    5 
 i18n/de-DE/education.ts                                                                                                         |   47 
 i18n/it-IT/login.ts                                                                                                             |  120 
 app/components/base/icons/src/public/plugins/VerifiedLight.json                                                                 |  456 
 app/components/tools/add-tool-modal/empty.tsx                                                                                   |   21 
 app/components/header/account-setting/Integrations-page/index.module.css                                                        |   24 
 context/debug-configuration.ts                                                                                                  |  263 
 app/components/develop/template/template.en.mdx                                                                                 |  708 
 i18n/th-TH/register.ts                                                                                                          |    3 
 app/components/base/icons/src/public/llm/JinaText.tsx                                                                           |   20 
 app/components/base/icons/src/vender/line/layout/AlignLeft01.tsx                                                                |   20 
 i18n/zh-Hant/dataset-hit-testing.ts                                                                                             |   35 
 app/components/base/icons/src/vender/line/layout/AlignRight01.tsx                                                               |   20 
 app/components/workflow/hooks/use-nodes-data.ts                                                                                 |   77 
 app/components/base/form/form-scenarios/demo/contact-fields.tsx                                                                 |   35 
 app/components/base/icons/src/vender/solid/mediaAndDevices/VideoSupportIcon.tsx                                                 |   20 
 app/components/plugins/constants.ts                                                                                             |   27 
 app/components/app/configuration/debug/debug-with-multiple-model/text-generation-item.tsx                                       |  144 
 app/components/base/icons/src/public/files/Unknown.json                                                                         |  199 
 i18n/it-IT/app-api.ts                                                                                                           |  106 
 app/components/base/icons/src/vender/solid/communication/EditList.json                                                          |   53 
 app/components/workflow/nodes/http/components/key-value/index.tsx                                                               |   62 
 app/components/base/chat/chat-with-history/header/mobile-operation-dropdown.tsx                                                 |   59 
 public/vs/editor/editor.main.css                                                                                                |    6 
 app/components/header/assets/google.svg                                                                                         |   13 
 app/components/base/form/components/field/select.tsx                                                                            |   51 
 i18n/ru-RU/explore.ts                                                                                                           |   44 
 app/components/base/audio-gallery/AudioPlayer.tsx                                                                               |  319 
 app/components/base/icons/src/vender/line/files/Clipboard.json                                                                  |   29 
 app/components/workflow/hooks-store/index.ts                                                                                    |    2 
 app/components/base/icons/src/public/knowledge/GeneralType.json                                                                 |   38 
 i18n/pt-BR/run-log.ts                                                                                                           |   31 
 app/components/base/icons/src/vender/solid/general/MessageClockCircle.tsx                                                       |   20 
 app/components/workflow/nodes/_base/components/retry/utils.ts                                                                   |    0 
 i18n/zh-Hant/explore.ts                                                                                                         |   44 
 app/components/base/select/locale.tsx                                                                                           |   61 
 app/components/base/icons/src/vender/line/financeAndECommerce/Tag01.json                                                        |   66 
 app/components/datasets/hit-testing/components/result-item-meta.tsx                                                             |   45 
 app/components/base/tag-management/tag-item-editor.tsx                                                                          |  151 
 app/components/base/agent-log-modal/tracing.tsx                                                                                 |   25 
 app/components/base/icons/src/public/common/Lock.json                                                                           |   38 
 public/screenshots/dark/TextGenerator.png                                                                                       |    0 
 app/components/base/icons/src/public/thought/Loading.tsx                                                                        |   20 
 app/components/base/icons/src/vender/line/financeAndECommerce/GoldCoin.tsx                                                      |   20 
 app/components/base/icons/src/vender/features/Microphone01.json                                                                 |   37 
 i18n/ja-JP/dataset-creation.ts                                                                                                  |  216 
 app/components/header/account-setting/data-source-page/data-source-website/config-jina-reader-modal.tsx                         |  140 
 app/components/workflow/panel/chat-variable-panel/components/variable-modal-trigger.tsx                                         |   69 
 i18n/ja-JP/dataset.ts                                                                                                           |  221 
 i18n/es-ES/app-overview.ts                                                                                                      |  173 
 app/components/workflow-app/index.tsx                                                                                           |  108 
 app/components/workflow/nodes/start/node.tsx                                                                                    |   40 
 themes/light.css                                                                                                                |  739 
 app/components/tools/marketplace/hooks.ts                                                                                       |  117 
 app/(commonLayout)/apps/assets/right-arrow.svg                                                                                  |    3 
 i18n/tr-TR/run-log.ts                                                                                                           |   31 
 public/vs/basic-languages/st/st.js                                                                                              |   10 
 app/components/base/icons/src/public/plugins/Google.json                                                                        |   53 
 app/components/workflow/nodes/assigner/default.ts                                                                               |   52 
 i18n/fr-FR/billing.ts                                                                                                           |  200 
 i18n/fr-FR/register.ts                                                                                                          |    4 
 app/components/app/configuration/config/automatic/automatic-btn.tsx                                                             |   25 
 app/components/base/icons/src/vender/solid/arrows/index.ts                                                                      |    2 
 app/components/base/icons/src/public/knowledge/Chunk.tsx                                                                        |   20 
 app/components/datasets/hit-testing/modify-external-retrieval-modal.tsx                                                         |   71 
 app/components/base/icons/assets/vender/solid/shapes/corner.svg                                                                 |    3 
 app/components/base/pagination/hook.ts                                                                                          |   95 
 i18n/hi-IN/login.ts                                                                                                             |  115 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/utils.ts                                   |   66 
 app/components/base/file-uploader/file-uploader-in-attachment/index.tsx                                                         |  133 
 app/components/base/icons/assets/vender/solid/development/file-heart-02.svg                                                     |    6 
 app/components/base/icons/src/vender/line/mapsAndTravel/Route.tsx                                                               |   20 
 app/components/base/icons/src/vender/line/arrows/ChevronDownDouble.tsx                                                          |   20 
 models/log.ts                                                                                                                   |  355 
 app/components/base/icons/src/vender/line/editor/LetterSpacing01.tsx                                                            |   20 
 app/components/app/app-publisher/features-wrapper.tsx                                                                           |   86 
 app/components/plugins/plugin-detail-panel/app-selector/index.tsx                                                               |  143 
 app/components/base/icons/assets/vender/solid/users/users-plus.svg                                                              |   10 
 app/components/base/icons/src/public/tracing/WeaveIconBig.tsx                                                                   |   16 
 app/components/datasets/create/embedding-process/index.module.css                                                               |   89 
 public/vs/basic-languages/dockerfile/dockerfile.js                                                                              |   10 
 app/components/base/icons/src/vender/solid/communication/MessageSmileSquare.json                                                |   38 
 app/components/base/image-uploader/utils.ts                                                                                     |   36 
 app/components/base/icons/src/vender/line/education/BookOpen01.json                                                             |   49 
 app/components/base/icons/src/vender/line/others/Apps02.json                                                                    |   36 
 app/components/header/account-setting/key-validator/hooks.ts                                                                    |   31 
 app/components/header/account-setting/plugin-page/index.tsx                                                                     |   38 
 app/components/base/icons/src/public/common/Notion.tsx                                                                          |   20 
 app/components/header/explore-nav/index.tsx                                                                                     |   38 
 app/components/app/configuration/features/experience-enhance-group/more-like-this/index.tsx                                     |   51 
 app/components/base/icons/src/vender/line/general/Settings01.json                                                               |   86 
 app/components/header/maintenance-notice.tsx                                                                                    |   39 
 app/components/base/icons/src/vender/line/time/ClockPlay.tsx                                                                    |   20 
 app/components/workflow/nodes/_base/components/info-panel.tsx                                                                   |   27 
 app/components/app/workflow-log/detail.tsx                                                                                      |   26 
 public/vs/basic-languages/solidity/solidity.js                                                                                  |   10 
 public/vs/basic-languages/pascaligo/pascaligo.js                                                                                |   10 
 app/components/workflow/note-node/note-editor/utils.ts                                                                          |   22 
 app/components/base/icons/src/vender/solid/files/FileZip.json                                                                   |   47 
 app/components/workflow/nodes/code/use-config.ts                                                                                |  178 
 public/vs/basic-languages/python/python.js                                                                                      |   10 
 app/components/workflow/nodes/index.tsx                                                                                         |   52 
 app/components/base/icons/src/vender/line/files/FileArrow01.tsx                                                                 |   20 
 utils/timezone.ts                                                                                                               |    7 
 app/components/base/icons/assets/vender/solid/development/puzzle-piece-01.svg                                                   |    5 
 app/components/base/icons/src/public/llm/CohereText.tsx                                                                         |   20 
 i18n/zh-Hant/common.ts                                                                                                          |  672 
 app/components/base/icons/assets/public/tracing/opik-icon-big.svg                                                               |   87 
 app/components/workflow/nodes/_base/components/retry/types.ts                                                                   |    5 
 app/components/base/icons/assets/image/llm/minimax-text.png                                                                     |    0 
 app/components/develop/template/template_chat.ja.mdx                                                                            | 1392 
 app/components/base/icons/src/vender/line/financeAndECommerce/CoinsStacked01.tsx                                                |   20 
 app/components/header/account-setting/api-based-extension-page/modal.tsx                                                        |  150 
 app/components/base/image-uploader/image-preview.tsx                                                                            |  269 
 app/components/base/app-icon-picker/hooks.tsx                                                                                   |   43 
 app/components/tools/labels/selector.tsx                                                                                        |  122 
 app/components/base/icons/src/vender/line/general/LinkExternal02.json                                                           |   38 
 app/components/header/assets/notion.svg                                                                                         |   12 
 app/components/base/tab-slider-new/index.tsx                                                                                    |   40 
 app/components/base/chat/embedded-chatbot/inputs-form/content.tsx                                                               |  115 
 i18n/pt-BR/plugin-tags.ts                                                                                                       |   25 
 app/components/base/icons/src/vender/line/general/LogIn04.json                                                                  |   53 
 app/components/base/icons/src/vender/line/editor/ImageIndentLeft.tsx                                                            |   20 
 app/components/base/icons/src/vender/other/AnthropicText.tsx                                                                    |   20 
 app/components/base/icons/src/vender/line/general/Pin02.tsx                                                                     |   20 
 app/components/develop/template/template_chat.en.mdx                                                                            | 1700 
 public/screenshots/dark/Chatbot@2x.png                                                                                          |    0 
 app/components/base/icons/src/public/llm/Zhipuai.tsx                                                                            |   20 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/context.tsx                                 |   50 
 app/components/billing/priority-label/index.tsx                                                                                 |   65 
 app/components/base/image-gallery/style.module.css                                                                              |   22 
 app/components/plugins/install-plugin/install-bundle/item/github-item.tsx                                                       |   62 
 app/components/base/icons/assets/vender/line/financeAndECommerce/coins-stacked-01.svg                                           |    5 
 i18n/vi-VN/run-log.ts                                                                                                           |   31 
 app/components/header/account-setting/model-provider-page/system-model-selector/index.tsx                                       |  265 
 app/components/base/icons/src/public/billing/GoogleCloud.tsx                                                                    |   20 
 app/components/base/icons/src/public/tracing/OpikIconBig.json                                                                   |  162 
 app/components/datasets/metadata/hooks/use-edit-dataset-metadata.ts                                                             |   96 
 i18n/fr-FR/dataset.ts                                                                                                           |  220 
 i18n/vi-VN/app-overview.ts                                                                                                      |  173 
 app/components/base/icons/src/public/llm/IflytekSparkText.json                                                                  |  187 
 app/components/header/account-setting/model-provider-page/model-parameter-modal/presets-parameter.tsx                           |   63 
 app/components/workflow/panel/debug-and-preview/conversation-variable-modal.tsx                                                 |  156 
 middleware.ts                                                                                                                   |   86 
 public/vs/editor/editor.main.js                                                                                                 |  762 
 app/components/datasets/documents/assets/bezierCurve.svg                                                                        |    3 
 app/components/base/icons/src/vender/solid/communication/MessageFast.json                                                       |   28 
 app/components/base/icons/src/vender/solid/education/Unblur.tsx                                                                 |   20 
 i18n/it-IT/common.ts                                                                                                            |  703 
 app/components/base/icons/src/public/knowledge/Collapse.tsx                                                                     |   20 
 app/components/base/icons/src/vender/line/development/PuzzlePiece01.tsx                                                         |   20 
 i18n/fr-FR/plugin-tags.ts                                                                                                       |   25 
 public/screenshots/dark/Chatflow@3x.png                                                                                         |    0 
 app/components/header/account-setting/members-page/edit-workspace-modal/index.tsx                                               |   90 
 app/components/base/icons/src/vender/line/files/Clipboard.tsx                                                                   |   20 
 app/components/workflow/store/workflow/env-variable-slice.ts                                                                    |   20 
 app/components/base/icons/assets/vender/solid/communication/send-03.svg                                                         |    5 
 app/components/base/chat/chat-with-history/header/operation.tsx                                                                 |   73 
 app/components/workflow/nodes/utils.ts                                                                                          |   30 
 i18n/ru-RU/plugin.ts                                                                                                            |  215 
 app/components/base/icons/src/vender/solid/files/FileSearch02.json                                                              |   57 
 app/components/base/icons/IconBase.tsx                                                                                          |   39 
 app/components/base/audio-gallery/index.tsx                                                                                     |   12 
 app/components/workflow/features.tsx                                                                                            |   60 
 app/components/workflow/nodes/loop-start/constants.ts                                                                           |    1 
 i18n/pl-PL/workflow.ts                                                                                                          |  921 
 app/components/datasets/documents/detail/completed/common/segment-index-tag.tsx                                                 |   40 
 public/vs/basic-languages/redshift/redshift.js                                                                                  |   10 
 app/components/base/markdown.tsx                                                                                                |  355 
 app/components/base/icons/assets/vender/solid/general/plus-circle.svg                                                           |    5 
 app/components/app/annotation/add-annotation-modal/index.tsx                                                                    |  121 
 app/components/header/account-setting/model-provider-page/install-from-marketplace.tsx                                          |   83 
 app/components/base/features/new-feature-panel/file-upload/setting-modal.tsx                                                    |   53 
 app/account/account-page/index.module.css                                                                                       |    9 
 app/components/base/prompt-editor/index.tsx                                                                                     |  226 
 app/components/workflow/block-icon.tsx                                                                                          |  147 
 app/components/base/icons/assets/public/billing/sparkles.svg                                                                    |   14 
 i18n/it-IT/dataset-hit-testing.ts                                                                                               |   36 
 i18n/ja-JP/billing.ts                                                                                                           |  192 
 app/components/header/account-setting/model-provider-page/model-selector/deprecated-model-trigger.tsx                           |   54 
 app/components/base/file-uploader/file-from-link-or-local/index.tsx                                                             |  129 
 app/components/base/icons/assets/public/llm/openai-text.svg                                                                     |    8 
 i18n/ro-RO/app.ts                                                                                                               |  214 
 app/components/workflow/nodes/question-classifier/components/advanced-setting.tsx                                               |   82 
 app/components/base/icons/src/vender/line/arrows/ArrowNarrowLeft.tsx                                                            |   20 
 app/components/workflow/run/tracing-panel.tsx                                                                                   |  199 
 app/components/base/icons/assets/vender/workflow/llm.svg                                                                        |    5 
 app/components/workflow/run/index.tsx                                                                                           |  172 
 app/components/base/chat/embedded-chatbot/inputs-form/index.tsx                                                                 |   79 
 app/components/datasets/hit-testing/assets/plugin.svg                                                                           |   10 
 app/components/plugins/card/base/description.tsx                                                                                |   31 
 app/components/base/icons/src/vender/line/files/File02.tsx                                                                      |   20 
 app/components/app/configuration/dataset-config/context-var/var-picker.tsx                                                      |  104 
 public/vs/language/typescript/tsMode.js                                                                                         |   20 
 app/components/base/icons/src/vender/solid/general/Edit03.tsx                                                                   |   20 
 app/components/plugins/marketplace/types.ts                                                                                     |   59 
 i18n/tr-TR/app-debug.ts                                                                                                         |  460 
 app/components/workflow/note-node/note-editor/plugins/format-detector-plugin/index.tsx                                          |    9 
 i18n/it-IT/app-log.ts                                                                                                           |  102 
 i18n/uk-UA/dataset-settings.ts                                                                                                  |   43 
 tailwind.config.js                                                                                                              |   12 
 app/components/custom/custom-page/index.tsx                                                                                     |   38 
 service/share.ts                                                                                                                |  270 
 types/app.ts                                                                                                                    |  450 
 app/components/base/icons/src/vender/solid/editor/index.ts                                                                      |    5 
 app/components/plugins/update-plugin/from-github.tsx                                                                            |   26 
 app/components/base/features/new-feature-panel/file-upload/setting-content.tsx                                                  |   89 
 i18n/es-ES/tools.ts                                                                                                             |  158 
 app/components/datasets/create/assets/xlsx.svg                                                                                  |   18 
 app/components/app/annotation/batch-add-annotation-modal/csv-uploader.tsx                                                       |  126 
 app/components/base/icons/src/vender/solid/general/Tool03.tsx                                                                   |   20 
 app/components/workflow/nodes/loop/panel.tsx                                                                                    |  160 
 app/components/plugins/install-plugin/utils.ts                                                                                  |   60 
 app/components/workflow/nodes/answer/node.tsx                                                                                   |   26 
 app/components/plugins/install-plugin/install-from-local-package/steps/install.tsx                                              |  164 
 app/components/base/icons/assets/image/llm/baichuan-text-cn.png                                                                 |    0 
 i18n/zh-Hans/app-overview.ts                                                                                                    |  173 
 app/components/develop/secret-key/assets/play.svg                                                                               |   11 
 app/components/workflow/nodes/loop/components/condition-files-list-value.tsx                                                    |  115 
 app/components/base/audio-btn/audio.ts                                                                                          |  247 
 context/provider-context.tsx                                                                                                    |  201 
 app/components/base/icons/src/vender/solid/mediaAndDevices/Speaker.tsx                                                          |   20 
 i18n/fr-FR/app-log.ts                                                                                                           |   98 
 i18n/sl-SI/workflow.ts                                                                                                          | 1354 
 app/components/base/icons/src/vender/features/index.ts                                                                          |   10 
 app/components/base/icons/assets/vender/line/general/info-circle.svg                                                            |   10 
 i18n/ru-RU/dataset-settings.ts                                                                                                  |   43 
 app/components/datasets/settings/permission-selector/index.tsx                                                                  |  195 
 app/components/workflow/hooks/use-panel-interactions.ts                                                                         |   37 
 i18n/en-US/tools.ts                                                                                                             |  158 
 app/components/base/icons/assets/vender/features/document.svg                                                                   |    3 
 app/components/plugins/update-plugin/index.tsx                                                                                  |   33 
 app/components/workflow/note-node/note-editor/toolbar/command.tsx                                                               |   83 
 i18n/en-US/app-debug.ts                                                                                                         |  537 
 i18n/zh-Hant/dataset-creation.ts                                                                                                |  218 
 app/components/base/icons/src/public/tracing/LangsmithIconBig.json                                                              |  188 
 app/components/header/assets/alpha.svg                                                                                          |    4 
 service/use-apps.ts                                                                                                             |   27 
 app/components/base/chat/chat/loading-anim/index.tsx                                                                            |   17 
 app/components/datasets/documents/index.tsx                                                                                     |  350 
 app/components/base/icons/src/public/common/Iso.json                                                                            |  121 
 app/components/base/icons/assets/public/common/sparkles-soft.svg                                                                |    6 
 app/components/workflow/hooks/use-node-data-update.ts                                                                           |   43 
 utils/time.ts                                                                                                                   |   12 
 app/components/base/icons/src/vender/features/ContentModeration.tsx                                                             |   20 
 app/components/tools/workflow-tool/configure-button.tsx                                                                         |  258 
 app/components/base/icons/src/public/other/RowStruct.tsx                                                                        |   20 
 app/components/base/icons/src/public/other/index.ts                                                                             |    4 
 app/components/base/icons/assets/vender/line/others/global-variable.svg                                                         |    3 
 app/components/base/icons/src/vender/line/others/FileCode.json                                                                  |   26 
 app/components/datasets/documents/assets/globe.svg                                                                              |   10 
 i18n/uk-UA/workflow.ts                                                                                                          |  921 
 app/components/base/icons/src/vender/features/TextToAudio.tsx                                                                   |   20 
 app/components/base/agent-log-modal/iteration.tsx                                                                               |   51 
 app/components/base/icons/assets/public/tracing/langsmith-icon.svg                                                              |   24 
 app/components/base/icons/assets/vender/features/microphone-01.svg                                                              |    4 
 app/components/base/icons/src/vender/line/users/Users01.tsx                                                                     |   20 
 app/components/workflow/shortcuts-name.tsx                                                                                      |   32 
 i18n/ja-JP/tools.ts                                                                                                             |  158 
 app/components/workflow/nodes/iteration/default.ts                                                                              |   63 
 app/components/workflow/index.tsx                                                                                               |  379 
 app/components/workflow/nodes/_base/components/toggle-expand-btn.tsx                                                            |   30 
 app/components/app/configuration/config-prompt/simple-prompt-input.tsx                                                          |  284 
 app/components/app/configuration/base/warning-mask/style.module.css                                                             |    8 
 app/components/workflow/nodes/answer/panel.tsx                                                                                  |   47 
 i18n/en-US/app-log.ts                                                                                                           |   98 
 app/(commonLayout)/apps/hooks/useAppsQueryState.ts                                                                              |   60 
 app/components/base/icons/src/vender/solid/general/CheckCircle.tsx                                                              |   20 
 public/vs/base/common/worker/simpleWorker.nls.js                                                                                |    8 
 app/components/workflow/nodes/variable-assigner/use-config.ts                                                                   |  190 
 app/components/plugins/marketplace/empty/index.tsx                                                                              |   63 
 i18n/vi-VN/time.ts                                                                                                              |   37 
 app/components/base/icons/assets/public/llm/baichuan.svg                                                                        |   11 
 app/components/base/prompt-editor/plugins/context-block/component.tsx                                                           |  104 
 app/components/base/icons/src/vender/solid/development/PatternRecognition.tsx                                                   |   20 
 app/components/base/icons/assets/public/llm/openai-black.svg                                                                    |    4 
 public/vs/basic-languages/postiats/postiats.js                                                                                  |   10 
 app/install/page.tsx                                                                                                            |   20 
 app/components/workflow/nodes/_base/hooks/use-output-var-list.ts                                                                |  121 
 i18n/fa-IR/app-annotation.ts                                                                                                    |   87 
 app/components/datasets/metadata/metadata-dataset/select-metadata-modal.tsx                                                     |   82 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-variable-selector.tsx            |   92 
 app/components/workflow/nodes/_base/components/error-handle/error-handle-tip.tsx                                                |   43 
 app/components/header/account-setting/data-source-page/panel/style.module.css                                                   |   17 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-started.ts                                     |   85 
 app/components/header/account-setting/model-provider-page/model-parameter-modal/index.tsx                                       |  267 
 i18n/de-DE/workflow.ts                                                                                                          |  921 
 app/components/base/icons/src/vender/line/mediaAndDevices/Speaker.tsx                                                           |   20 
 app/components/datasets/create/embedding-process/index.tsx                                                                      |  357 
 public/screenshots/dark/Agent.png                                                                                               |    0 
 i18n/th-TH/dataset-hit-testing.ts                                                                                               |   35 
 app/components/datasets/create/assets/check.svg                                                                                 |    3 
 app/components/base/icons/assets/vender/solid/arrows/high-priority.svg                                                          |    6 
 app/components/develop/template/template_advanced_chat.en.mdx                                                                   | 1660 
 app/components/datasets/documents/detail/embedding/index.tsx                                                                    |  314 
 app/dev-only/i18n-checker/page.tsx                                                                                              |  164 
 i18n/uk-UA/dataset-creation.ts                                                                                                  |  218 
 app/components/workflow/nodes/_base/components/retry/hooks.ts                                                                   |   41 
 app/components/base/icons/assets/vender/line/general/log-out-04.svg                                                             |    8 
 i18n/ro-RO/layout.ts                                                                                                            |    4 
 app/components/base/icons/src/public/llm/IflytekSpark.tsx                                                                       |   20 
 app/components/datasets/loading.tsx                                                                                             |    0 
 app/components/base/icons/assets/vender/workflow/assigner.svg                                                                   |    9 
 app/components/workflow/note-node/note-editor/editor.tsx                                                                        |   66 
 utils/timezone.json                                                                                                             | 1274 
 app/components/base/icons/src/image/llm/TongyiTextCn.tsx                                                                        |   20 
 app/components/base/icons/assets/vender/line/arrows/refresh-ccw-01.svg                                                          |    3 
 public/vs/basic-languages/pgsql/pgsql.js                                                                                        |   10 
 app/components/base/icons/assets/vender/line/files/file-plus-02.svg                                                             |    3 
 app/components/datasets/create/website/jina-reader/base/error-message.tsx                                                       |   30 
 app/components/app/configuration/dataset-config/params-config/config-content.tsx                                                |  382 
 app/components/base/icons/src/vender/line/mediaAndDevices/PlayCircle.tsx                                                        |   20 
 app/components/base/icons/assets/vender/line/arrows/reverse-left.svg                                                            |    5 
 app/components/base/icons/src/vender/line/financeAndECommerce/CoinsStacked01.json                                               |   39 
 i18n/sl-SI/plugin.ts                                                                                                            |  215 
 app/styles/markdown.scss                                                                                                        | 1044 
 app/components/workflow/hooks/use-workflow-mode.ts                                                                              |   14 
 app/components/datasets/external-knowledge-base/create/InfoPanel.tsx                                                            |   33 
 global.d.ts                                                                                                                     |    5 
 app/components/workflow/nodes/loop/add-block.tsx                                                                                |   80 
 app/components/base/portal-to-follow-elem/index.spec.tsx                                                                        |  121 
 app/components/plugins/update-plugin/plugin-version-picker.tsx                                                                  |  118 
 app/signin/oneMoreStep.tsx                                                                                                      |  176 
 app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/documents/[documentId]/settings/page.tsx                          |   21 
 app/components/workflow/panel/debug-and-preview/user-input.tsx                                                                  |   56 
 i18n/tr-TR/explore.ts                                                                                                           |   44 
 app/components/base/param-item/top-k-item.tsx                                                                                   |   54 
 app/components/app/overview/assets/chromeplugin-option.svg                                                                      |  159 
 app/components/develop/template/template_workflow.en.mdx                                                                        |  792 
 app/components/base/notion-page-selector/assets/notion-page.svg                                                                 |    3 
 app/components/base/icons/src/vender/workflow/Jinja.json                                                                        |   98 
 app/components/share/text-generation/run-once/index.tsx                                                                         |  184 
 public/vs/editor/editor.main.nls.ja.js                                                                                          |   15 
 app/components/workflow/note-node/note-editor/toolbar/operator.tsx                                                              |  107 
 app/components/base/icons/src/vender/workflow/Loop.tsx                                                                          |   20 
 app/components/base/icons/src/public/llm/OpenaiTransparent.json                                                                 |   26 
 app/components/plugins/plugin-detail-panel/app-selector/app-inputs-form.tsx                                                     |  125 
 i18n/zh-Hant/plugin.ts                                                                                                          |  215 
 app/components/workflow/panel/chat-variable-panel/index.tsx                                                                     |  202 
 i18n/pl-PL/plugin-tags.ts                                                                                                       |   25 
 assets/csv.svg                                                                                                                  |   22 
 app/components/base/notion-page-selector/index.tsx                                                                              |    2 
 app/components/base/voice-input/utils.ts                                                                                        |   47 
 i18n/vi-VN/custom.ts                                                                                                            |   32 
 app/components/base/features/new-feature-panel/moderation/moderation-content.tsx                                                |   72 
 app/components/base/icons/src/public/knowledge/GeneralType.tsx                                                                  |   20 
 app/components/base/date-and-time-picker/hooks.ts                                                                               |   49 
 app/components/header/plan-badge/index.tsx                                                                                      |   64 
 app/components/base/icons/src/vender/line/editor/LeftIndent02.tsx                                                               |   20 
 app/components/base/icons/src/vender/line/development/Database01.json                                                           |   29 
 app/components/base/icons/src/vender/line/communication/AiText.tsx                                                              |   20 
 app/components/base/features/new-feature-panel/follow-up.tsx                                                                    |   56 
 app/components/base/icons/src/public/files/Csv.json                                                                             |  181 
 app/components/base/tag-management/tag-remove-modal.tsx                                                                         |   49 
 app/components/base/icons/src/vender/line/development/Database03.tsx                                                            |   20 
 i18n/zh-Hant/run-log.ts                                                                                                         |   31 
 app/components/base/icons/src/vender/solid/users/User01.tsx                                                                     |   20 
 i18n/it-IT/app-overview.ts                                                                                                      |  193 
 app/components/tools/workflow-tool/index.tsx                                                                                    |  282 
 service/use-endpoints.ts                                                                                                        |  149 
 app/components/base/icons/src/vender/line/development/Variable.json                                                             |   62 
 app/components/base/video-gallery/index.tsx                                                                                     |   12 
 app/components/datasets/create/step-two/inputs.tsx                                                                              |   79 
 app/components/workflow/nodes/http/components/key-value/key-value-edit/index.tsx                                                |   87 
 app/components/base/agent-log-modal/detail.tsx                                                                                  |  132 
 app/components/workflow/run/special-result-panel.tsx                                                                            |   98 
 app/(commonLayout)/app/(appDetailLayout)/layout.tsx                                                                             |   28 
 app/components/base/answer-icon/index.tsx                                                                                       |   47 
 app/components/base/icons/src/vender/solid/general/Target04.tsx                                                                 |   20 
 public/screenshots/light/Chatbot@3x.png                                                                                         |    0 
 app/components/base/file-uploader/video-preview.tsx                                                                             |   45 
 app/components/plugins/types.ts                                                                                                 |  457 
 i18n/de-DE/share-app.ts                                                                                                         |   82 
 app/components/workflow/nodes/parameter-extractor/components/extract-parameter/update.tsx                                       |  189 
 app/components/base/prompt-editor/plugins/component-picker-block/index.tsx                                                      |  227 
 app/components/header/account-setting/api-based-extension-page/item.tsx                                                         |   74 
 app/components/base/icons/src/vender/solid/shapes/Star04.tsx                                                                    |   20 
 hooks/use-breakpoints.ts                                                                                                        |   29 
 app/components/base/icons/src/public/plugins/Google.tsx                                                                         |   20 
 app/components/base/slider/style.css                                                                                            |   11 
 app/components/tools/edit-custom-collection-modal/config-credentials.tsx                                                        |  154 
 app/components/base/select/pure.tsx                                                                                             |  157 
 app/components/base/icons/assets/vender/solid/communication/ai-text.svg                                                         |    6 
 app/components/base/file-uploader/file-uploader-in-chat-input/file-list.tsx                                                     |   82 
 app/components/base/icons/src/vender/line/development/Database03.json                                                           |   29 
 app/components/base/tag-input/index.tsx                                                                                         |  121 
 app/components/explore/app-list/style.module.css                                                                                |   29 
 app/components/workflow/workflow-history-store.tsx                                                                              |  121 
 app/components/workflow/run/utils/format-log/retry/index.spec.ts                                                                |   21 
 app/components/datasets/documents/detail/completed/segment-card/chunk-content.tsx                                               |   57 
 app/components/base/icons/src/vender/line/others/Tools.json                                                                     |  119 
 i18n/pt-BR/workflow.ts                                                                                                          |  921 
 app/components/base/icons/src/vender/line/development/ArtificialBrain.tsx                                                       |   20 
 public/vs/basic-languages/html/html.js                                                                                          |   10 
 app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars.tsx                                       |  170 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/chartView.tsx                                                         |  106 
 app/components/datasets/create/assets/option-card-effect-orange.svg                                                             |   12 
 i18n/de-DE/run-log.ts                                                                                                           |   32 
 app/components/base/icons/assets/vender/line/files/folder.svg                                                                   |    5 
 app/components/develop/secret-key/input-copy.tsx                                                                                |   57 
 app/components/base/icons/assets/vender/solid/education/bubble-text.svg                                                         |    5 
 app/components/base/icons/src/public/billing/Azure.tsx                                                                          |   20 
 i18n/ko-KR/tools.ts                                                                                                             |  158 
 app/components/base/icons/src/vender/solid/communication/EditList.tsx                                                           |   20 
 assets/json.svg                                                                                                                 |   23 
 app/components/datasets/create/assets/doc.svg                                                                                   |   22 
 app/components/plugins/plugin-item/index.tsx                                                                                    |  197 
 app/components/base/icons/src/public/llm/Chatglm.tsx                                                                            |   20 
 app/components/base/icons/src/vender/solid/users/UserEdit02.json                                                                |   92 
 app/components/workflow/run/retry-log/retry-result-panel.tsx                                                                    |   46 
 app/components/datasets/create/assets/note-mod.svg                                                                              |    5 
 assets/txt.svg                                                                                                                  |   23 
 app/components/app/app-publisher/version-info-modal.tsx                                                                         |  112 
 app/components/header/account-setting/members-page/invited-modal/assets/copy.svg                                                |    3 
 app/components/header/account-setting/model-provider-page/provider-added-card/model-list-item.tsx                               |  128 
 app/(commonLayout)/apps/assets/link.svg                                                                                         |    3 
 app/components/base/icons/src/vender/solid/mediaAndDevices/StopCircle.json                                                      |   38 
 i18n/ru-RU/register.ts                                                                                                          |    4 
 app/components/base/icons/src/vender/line/development/GitBranch01.json                                                          |   39 
 app/components/base/icons/src/vender/solid/general/XCircle.json                                                                 |   29 
 app/components/base/chat/chat/type.ts                                                                                           |  147 
 app/components/workflow/nodes/document-extractor/use-config.ts                                                                  |  111 
 app/components/base/features/new-feature-panel/speech-to-text.tsx                                                               |   56 
 i18n/tr-TR/share-app.ts                                                                                                         |   78 
 app/components/workflow/nodes/_base/components/output-vars.tsx                                                                  |   85 
 app/components/datasets/documents/assets/star.svg                                                                               |   11 
 i18n/th-TH/app.ts                                                                                                               |  210 
 public/vs/base/common/worker/simpleWorker.nls.ko.js                                                                             |    8 
 app/components/base/icons/src/vender/solid/general/ZapNarrow.tsx                                                                |   20 
 app/components/base/icons/src/vender/workflow/Http.tsx                                                                          |   20 
 app/components/base/file-uploader/file-uploader-in-chat-input/file-image-item.tsx                                               |  110 
 app/components/datasets/documents/assets/atSign.svg                                                                             |   10 
 app/components/base/icons/src/vender/line/general/Link03.json                                                                   |   57 
 i18n/fr-FR/workflow.ts                                                                                                          |  920 
 app/components/base/icons/src/vender/line/others/index.ts                                                                       |   12 
 app/components/base/input-number/index.tsx                                                                                      |  114 
 app/components/base/dropdown/index.tsx                                                                                          |  106 
 app/components/base/icons/src/vender/line/shapes/index.ts                                                                       |    1 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/schema-editor.tsx                                         |   23 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/layout-main.tsx                                                                |  177 
 app/components/base/icons/src/vender/line/alertsAndFeedback/AlertTriangle.json                                                  |   39 
 app/components/workflow/note-node/note-editor/index.tsx                                                                         |    3 
 app/(commonLayout)/apps/Apps.tsx                                                                                                |  219 
 docker/entrypoint.sh                                                                                                            |   40 
 i18n/sl-SI/explore.ts                                                                                                           |   44 
 app/components/base/icons/src/public/thought/Search.json                                                                        |   64 
 __mocks__/mime.js                                                                                                               |    0 
 app/components/base/icons/src/image/llm/WxyyTextCn.module.css                                                                   |    5 
 i18n/ro-RO/dataset-settings.ts                                                                                                  |   43 
 app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx                                                      |  232 
 i18n/ja-JP/layout.ts                                                                                                            |    4 
 app/components/base/fullscreen-modal/index.tsx                                                                                  |   74 
 app/components/base/icons/src/public/billing/GoogleCloud.json                                                                   |   66 
 app/components/base/icons/src/public/tracing/LangfuseIcon.tsx                                                                   |   20 
 app/components/base/icons/assets/vender/solid/development/api-connection-mod.svg                                                |    5 
 app/components/base/icons/src/vender/line/development/index.ts                                                                  |   14 
 app/components/plugins/marketplace/intersection-line/index.tsx                                                                  |   21 
 app/components/base/icons/src/vender/solid/communication/ChatBot.tsx                                                            |   20 
 i18n/pt-BR/app.ts                                                                                                               |  214 
 app/components/base/input/index.tsx                                                                                             |   97 
 app/components/header/assets/serpapi.png                                                                                        |    0 
 app/components/base/icons/src/public/avatar/Robot.json                                                                          |   92 
 app/components/base/icons/src/public/billing/index.ts                                                                           |   11 
 public/screenshots/dark/Chatflow@2x.png                                                                                         |    0 
 app/components/workflow/utils/workflow-init.ts                                                                                  |  338 
 i18n/tr-TR/education.ts                                                                                                         |   47 
 app/components/base/icons/assets/vender/line/general/checklist-square.svg                                                       |    5 
 app/components/datasets/metadata/edit-metadata-batch/input-has-set-multiple-value.tsx                                           |   34 
 app/components/base/icons/assets/public/llm/microsoft.svg                                                                       |    8 
 app/components/base/notion-icon/index.tsx                                                                                       |   58 
 app/components/workflow-app/components/workflow-header/index.tsx                                                                |   31 
 app/components/base/icons/src/public/tracing/WeaveIconBig.json                                                                  |  279 
 app/components/workflow/run/agent-log/agent-log-nav-more.tsx                                                                    |   61 
 app/components/datasets/metadata/metadata-document/info-group.tsx                                                               |  111 
 app/components/base/icons/src/vender/workflow/Assigner.tsx                                                                      |   20 
 app/components/base/chat/chat-with-history/sidebar/rename-modal.tsx                                                             |   47 
 app/components/base/icons/src/public/common/SparklesSoft.json                                                                   |   47 
 app/components/app/app-publisher/publish-with-multiple-model.tsx                                                                |  108 
 app/components/app/configuration/hooks/use-advanced-prompt-config.ts                                                            |  194 
 app/components/base/icons/src/vender/solid/mediaAndDevices/Speaker.json                                                         |  112 
 public/vs/basic-languages/pla/pla.js                                                                                            |   10 
 app/components/app/log/var-panel.tsx                                                                                            |   83 
 app/components/base/icons/assets/public/billing/sparkles-soft.svg                                                               |    4 
 app/components/workflow/nodes/_base/components/node-status-icon.tsx                                                             |   43 
 app/components/base/icons/src/public/llm/XorbitsInference.json                                                                  |  176 
 app/components/develop/secret-key/assets/copied.svg                                                                             |    3 
 app/components/workflow/note-node/note-editor/theme/theme.css                                                                   |   32 
 i18n/ro-RO/workflow.ts                                                                                                          |  921 
 i18n/tr-TR/app.ts                                                                                                               |  210 
 app/components/base/icons/src/vender/line/others/LongArrowRight.tsx                                                             |   20 
 i18n/ja-JP/time.ts                                                                                                              |   37 
 app/components/base/icons/src/public/llm/IflytekSparkText.tsx                                                                   |   20 
 i18n/ro-RO/dataset-documents.ts                                                                                                 |  395 
 app/components/base/chat/__tests__/legacyTestMessages.json                                                                      |   42 
 app/components/workflow/nodes/variable-assigner/components/var-group-item.tsx                                                   |  178 
 i18n/th-TH/plugin.ts                                                                                                            |  215 
 public/vs/base/common/worker/simpleWorker.nls.ru.js                                                                             |    8 
 app/components/base/icons/src/public/llm/HuggingfaceText.tsx                                                                    |   20 
 app/components/base/icons/src/vender/solid/general/ArrowDownRoundFill.json                                                      |   36 
 app/(commonLayout)/explore/apps/page.tsx                                                                                        |    8 
 app/components/base/emoji-picker/Inner.tsx                                                                                      |  173 
 i18n/th-TH/run-log.ts                                                                                                           |   31 
 app/components/datasets/create/website/base/input.tsx                                                                           |   63 
 app/components/workflow/panel/chat-variable-panel/components/variable-modal.tsx                                                 |  398 
 i18n/ja-JP/education.ts                                                                                                         |   47 
 public/vs/basic-languages/php/php.js                                                                                            |   10 
 app/components/base/icons/src/vender/line/development/Container.json                                                            |   29 
 app/components/base/icons/src/public/llm/IflytekSpark.json                                                                      |   44 
 app/components/base/icons/src/vender/features/ContentModeration.json                                                            |   28 
 app/components/workflow/nodes/_base/components/node-handle.tsx                                                                  |  215 
 app/components/datasets/create/website/base/field.tsx                                                                           |   54 
 app/components/base/form/form-scenarios/demo/shared-options.tsx                                                                 |   14 
 app/components/base/icons/assets/public/common/soc2.svg                                                                         |  103 
 app/components/base/icons/src/vender/solid/files/FileZip.tsx                                                                    |   20 
 app/components/workflow/nodes/parameter-extractor/node.tsx                                                                      |   32 
 app/components/base/qrcode/index.tsx                                                                                            |   80 
 app/components/app/create-from-dsl-modal/uploader.tsx                                                                           |  141 
 app/components/base/icons/src/vender/line/communication/MessageCheckRemove.json                                                 |   39 
 app/components/base/features/new-feature-panel/dialog-wrapper.tsx                                                               |   55 
 app/components/base/icons/src/public/files/Md.tsx                                                                               |   20 
 app/components/datasets/create/website/base/crawled-result-item.tsx                                                             |   60 
 i18n/ja-JP/run-log.ts                                                                                                           |   31 
 app/components/base/icons/src/vender/solid/education/Heart02.tsx                                                                |   20 
 app/components/app/configuration/config/agent/agent-tools/index.tsx                                                             |  302 
 app/components/workflow/nodes/code/types.ts                                                                                     |   19 
 app/components/base/icons/src/vender/line/communication/MessageCheckRemove.tsx                                                  |   20 
 i18n/hi-IN/plugin.ts                                                                                                            |  215 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/schema-node.tsx                             |  194 
 app/components/app/overview/style.module.css                                                                                    |   31 
 app/components/base/icons/assets/vender/solid/communication/logic.svg                                                           |    8 
 app/components/header/account-setting/model-provider-page/model-parameter-modal/configuration-button.tsx                        |   32 
 app/components/plugins/install-plugin/install-bundle/item/package-item.tsx                                                      |   41 
 app/components/plugins/install-plugin/install-from-github/steps/setURL.tsx                                                      |   56 
 app/components/base/icons/assets/vender/solid/mediaAndDevices/audio-support-icon.svg                                            |    3 
 app/components/header/account-setting/members-page/operation/index.tsx                                                          |  134 
 i18n/es-ES/app.ts                                                                                                               |  213 
 i18n/sl-SI/plugin-tags.ts                                                                                                       |   25 
 app/components/base/icons/assets/public/llm/localai.svg                                                                         |   15 
 app/components/base/icons/src/vender/line/files/FileCheck02.json                                                                |   39 
 hooks/use-import-dsl.ts                                                                                                         |  163 
 app/components/header/account-setting/model-provider-page/model-modal/Input.tsx                                                 |   74 
 i18n/pl-PL/dataset.ts                                                                                                           |  227 
 app/components/base/icons/src/vender/line/files/FilePlus02.json                                                                 |   29 
 app/components/base/icons/src/vender/solid/development/ApiConnection.tsx                                                        |   20 
 app/components/plugins/card/base/title.tsx                                                                                      |   13 
 app/(commonLayout)/apps/assets/completion.svg                                                                                   |    3 
 app/components/workflow/nodes/knowledge-retrieval/use-config.ts                                                                 |  452 
 i18n/zh-Hans/dataset.ts                                                                                                         |  221 
 app/components/base/icons/assets/vender/line/layout/align-left-01.svg                                                           |    5 
 app/components/datasets/common/retrieval-method-config/index.tsx                                                                |  157 
 app/components/base/icons/src/vender/solid/mediaAndDevices/Microphone01.tsx                                                     |   20 
 app/components/datasets/create/assets/piggy-bank-mod.svg                                                                        |    7 
 app/components/base/icons/src/vender/line/general/Edit02.json                                                                   |   66 
 app/components/base/icons/src/vender/solid/shapes/Star06.json                                                                   |   62 
 i18n/es-ES/app-log.ts                                                                                                           |   98 
 app/components/base/icons/src/vender/solid/general/Edit03.json                                                                  |   57 
 app/components/base/icons/src/vender/line/communication/ChatBot.json                                                            |   93 
 i18n/ja-JP/plugin.ts                                                                                                            |  215 
 i18n/ko-KR/run-log.ts                                                                                                           |   31 
 app/components/header/account-setting/members-page/invite-modal/role-selector.tsx                                               |   95 
 i18n/es-ES/login.ts                                                                                                             |  110 
 i18n/es-ES/explore.ts                                                                                                           |   44 
 app/components/base/icons/src/vender/line/others/DragHandle.tsx                                                                 |   20 
 app/components/app/configuration/index.tsx                                                                                      | 1068 
 i18n/it-IT/plugin-tags.ts                                                                                                       |   25 
 app/components/base/icons/src/vender/line/time/ClockFastForward.tsx                                                             |   20 
 app/components/app/overview/assets/code-browser.svg                                                                             |    3 
 app/components/base/icons/src/public/files/Xlsx.json                                                                            |  145 
 app/components/workflow/nodes/start/utils.ts                                                                                    |    5 
 app/(commonLayout)/datasets/NewDatasetCard.tsx                                                                                  |   42 
 app/components/base/date-and-time-picker/time-picker/index.tsx                                                                  |  170 
 app/(commonLayout)/datasets/Doc.tsx                                                                                             |  131 
 app/components/workflow/nodes/end/types.ts                                                                                      |    5 
 i18n/zh-Hans/education.ts                                                                                                       |   47 
 app/components/base/icons/assets/vender/workflow/jinja.svg                                                                      |   13 
 app/components/base/prompt-editor/constants.tsx                                                                                 |   58 
 app/components/workflow/store/index.ts                                                                                          |    1 
 i18n/uk-UA/share-app.ts                                                                                                         |   78 
 i18n/fr-FR/share-app.ts                                                                                                         |   82 
 i18n/vi-VN/login.ts                                                                                                             |  110 
 app/components/develop/ApiServer.tsx                                                                                            |   36 
 i18n/tr-TR/dataset-creation.ts                                                                                                  |  218 
 i18n/pt-BR/plugin.ts                                                                                                            |  215 
 app/components/workflow/nodes/agent/use-config.ts                                                                               |  220 
 i18n/pl-PL/app-annotation.ts                                                                                                    |   89 
 app/components/app/configuration/config-prompt/conversation-history/history-panel.tsx                                           |   60 
 i18n/ko-KR/app-debug.ts                                                                                                         |  418 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/style.module.css                                                               |    6 
 app/components/workflow/nodes/loop/components/condition-list/condition-input.tsx                                                |   53 
 app/components/base/chip/index.tsx                                                                                              |  109 
 app/components/base/icons/src/vender/solid/FinanceAndECommerce/Scales02.json                                                    |   48 
 app/components/base/icons/assets/vender/solid/arrows/chevron-down.svg                                                           |    5 
 app/components/base/logo/logo-embedded-chat-avatar.tsx                                                                          |   19 
 i18n/de-DE/tools.ts                                                                                                             |  158 
 app/components/base/icons/src/vender/solid/general/Download02.tsx                                                               |   20 
 assets/html.svg                                                                                                                 |   23 
 app/components/develop/secret-key/style.module.css                                                                              |   57 
 models/explore.ts                                                                                                               |   37 
 public/vs/basic-languages/kotlin/kotlin.js                                                                                      |   10 
 app/signin/assets/github.svg                                                                                                    |   17 
 public/vs/editor/editor.main.nls.fr.js                                                                                          |   13 
 app/components/app-sidebar/navLink.tsx                                                                                          |   63 
 app/components/base/icons/src/vender/line/others/GlobalVariable.tsx                                                             |   20 
 i18n/pl-PL/billing.ts                                                                                                           |  212 
 app/components/base/chat/chat/answer/__mocks__/markdownContentSVG.ts                                                            |   27 
 app/components/base/icons/src/vender/line/others/LongArrowLeft.json                                                             |   27 
 app/components/datasets/external-knowledge-base/create/KnowledgeBaseInfo.tsx                                                    |   53 
 app/components/workflow/panel/record.tsx                                                                                        |   33 
 app/components/base/icons/assets/vender/solid/shapes/star-06.svg                                                                |    9 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-filter/metadata-filter-selector.tsx              |  106 
 i18n/sl-SI/app-log.ts                                                                                                           |   98 
 app/components/base/icons/src/vender/line/editor/TypeSquare.tsx                                                                 |   20 
 app/components/base/icons/src/public/knowledge/Collapse.json                                                                    |   62 
 app/components/base/icons/src/public/common/Soc2.json                                                                           |  938 
 app/components/base/chat/chat/question.stories.tsx                                                                              |   33 
 app/(commonLayout)/education-apply/page.tsx                                                                                     |   29 
 app/components/billing/annotation-full/index.tsx                                                                                |   31 
 public/logo/logo-monochrome-white.svg                                                                                           |   12 
 app/components/tools/add-tool-modal/type.tsx                                                                                    |   34 
 i18n/hi-IN/billing.ts                                                                                                           |  213 
 app/components/plugins/plugin-detail-panel/model-selector/tts-params-panel.tsx                                                  |   67 
 app/components/app/configuration/config-prompt/message-type-selector.tsx                                                        |   50 
 app/components/base/chat/chat/thought/panel.tsx                                                                                 |   28 
 app/components/app/configuration/dataset-config/card-item/style.module.css                                                      |   22 
 app/components/base/icons/src/vender/solid/education/BubbleText.tsx                                                             |   20 
 app/components/workflow/nodes/template-transform/panel.tsx                                                                      |  130 
 app/components/base/file-uploader/file-uploader-in-chat-input/file-item.tsx                                                     |  156 
 app/components/base/icons/src/public/plugins/PartnerDark.tsx                                                                    |   20 
 app/components/share/text-generation/no-data/index.tsx                                                                          |   22 
 public/vs/basic-languages/swift/swift.js                                                                                        |   13 
 app/components/base/icons/assets/public/knowledge/parent-child-type.svg                                                         |    7 
 app/components/workflow/plugin-dependency/hooks.ts                                                                              |   17 
 app/components/share/text-generation/run-batch/csv-reader/index.tsx                                                             |   73 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/add-condition.tsx                                         |   95 
 i18n/auto-gen-i18n.js                                                                                                           |  109 
 app/components/base/icons/src/vender/solid/education/BubbleText.json                                                            |   38 
 app/components/base/icons/src/vender/features/LoveMessage.tsx                                                                   |   20 
 app/components/base/icons/src/vender/line/editor/AlignLeft.tsx                                                                  |   20 
 app/components/base/copy-btn/index.tsx                                                                                          |   54 
 context/modal-context.tsx                                                                                                       |  380 
 app/components/base/file-uploader/hooks.ts                                                                                      |  367 
 app/components/base/sort/index.tsx                                                                                              |   92 
 app/components/header/account-setting/data-source-page/index.tsx                                                                |   20 
 app/components/base/icons/src/vender/solid/communication/MessageHeartCircle.json                                                |   38 
 app/components/datasets/create/step-three/index.tsx                                                                             |   75 
 i18n/hi-IN/dataset.ts                                                                                                           |  228 
 app/components/base/icons/src/vender/workflow/Answer.tsx                                                                        |   20 
 assets/delete.svg                                                                                                               |    3 
 app/components/base/icons/assets/vender/features/message-fast.svg                                                               |    3 
 app/components/base/icons/assets/vender/solid/general/zap-fast.svg                                                              |   10 
 i18n/fr-FR/login.ts                                                                                                             |  110 
 app/components/datasets/documents/detail/completed/segment-list.tsx                                                             |  119 
 app/components/workflow/run/assets/bg-line-warning.svg                                                                          |    3 
 app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx                                              |  336 
 app/components/workflow/panel/env-panel/env-item.tsx                                                                            |   53 
 i18n/vi-VN/common.ts                                                                                                            |  672 
 i18n/ko-KR/login.ts                                                                                                             |  110 
 app/components/base/icons/assets/vender/features/content-moderation.svg                                                         |    3 
 app/components/base/icons/assets/vender/solid/mediaAndDevices/robot.svg                                                         |    5 
 app/components/app/configuration/config-var/config-modal/field.tsx                                                              |   24 
 app/components/workflow/nodes/loop/components/condition-number-input.tsx                                                        |  168 
 app/components/i18n-server.tsx                                                                                                  |   22 
 app/components/header/github-star/index.tsx                                                                                     |   27 
 app/components/base/icons/assets/public/llm/huggingface-text.svg                                                                |   42 
 app/components/base/icons/src/public/plugins/WebReader.tsx                                                                      |   20 
 app/components/base/icons/src/public/common/NTo1Retrieval.json                                                                  |  146 
 i18n/pl-PL/dataset-creation.ts                                                                                                  |  234 
 app/components/base/icons/assets/vender/other/anthropic-text.svg                                                                |   78 
 app/components/base/icons/src/vender/solid/general/XCircle.tsx                                                                  |   20 
 app/components/header/account-setting/collapse/index.tsx                                                                        |   54 
 app/components/workflow/nodes/answer/use-config.ts                                                                              |   41 
 app/components/base/features/new-feature-panel/annotation-reply/config-param-modal.tsx                                          |  139 
 app/components/workflow/nodes/list-operator/default.ts                                                                          |   65 
 i18n/ro-RO/app-debug.ts                                                                                                         |  427 
 app/components/base/icons/assets/vender/other/replay-line.svg                                                                   |    5 
 app/components/base/checkbox/assets/indeterminate-icon.tsx                                                                      |   11 
 app/components/workflow/nodes/if-else/components/condition-list/condition-var-selector.tsx                                      |   58 
 app/components/base/icons/assets/vender/solid/general/eye.svg                                                                   |    4 
 app/components/workflow/note-node/note-editor/toolbar/index.tsx                                                                 |   48 
 app/components/workflow/run/result-text.tsx                                                                                     |   75 
 app/components/base/file-uploader/file-list-in-log.tsx                                                                          |  106 
 app/components/base/icons/src/vender/solid/users/index.ts                                                                       |    4 
 app/components/workflow/nodes/loop/use-interactions.ts                                                                          |  149 
 app/components/datasets/documents/list.tsx                                                                                      |  687 
 i18n/en-US/register.ts                                                                                                          |    4 
 app/components/workflow/store/workflow/workflow-draft-slice.ts                                                                  |   36 
 app/components/base/features/new-feature-panel/annotation-reply/score-slider/index.tsx                                          |   46 
 app/components/base/icons/assets/vender/solid/mediaAndDevices/video-support-icon.svg                                            |    3 
 i18n/fa-IR/run-log.ts                                                                                                           |   31 
 app/components/base/auto-height-textarea/common.tsx                                                                             |   54 
 app/components/base/icons/src/vender/workflow/Iteration.tsx                                                                     |   20 
 app/components/base/chat/embedded-chatbot/theme/theme-context.ts                                                                |   75 
 app/components/base/icons/src/public/billing/Buildings.tsx                                                                      |   20 
 app/components/base/icons/assets/vender/other/group.svg                                                                         |    8 
 app/components/base/icons/src/vender/other/ReplayLine.json                                                                      |   36 
 i18n/fa-IR/app-debug.ts                                                                                                         |  455 
 app/components/header/account-setting/key-validator/KeyInput.tsx                                                                |   77 
 app/components/base/icons/src/vender/solid/development/Variable02.json                                                          |   62 
 public/screenshots/dark/Agent@3x.png                                                                                            |    0 
 app/components/workflow/operator/tip-popup.tsx                                                                                  |   33 
 app/(commonLayout)/datasets/(datasetDetailLayout)/layout.tsx                                                                    |   16 
 app/components/base/icons/src/vender/line/others/FileCode.tsx                                                                   |   20 
 app/components/base/icons/src/vender/solid/general/Edit04.tsx                                                                   |   20 
 app/components/workflow/panel/version-history-panel/context-menu/menu-item.tsx                                                  |   39 
 app/components/base/icons/src/public/files/Yaml.json                                                                            |  181 
 app/components/base/divider/with-label.tsx                                                                                      |   23 
 app/components/base/icons/src/vender/solid/editor/Brush01.json                                                                  |   35 
 app/components/plugins/card/base/card-icon.tsx                                                                                  |   66 
 i18n/pl-PL/app-overview.ts                                                                                                      |  191 
 app/components/workflow/note-node/index.tsx                                                                                     |  130 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/provider-panel.tsx                                            |  104 
 app/components/header/account-about/index.tsx                                                                                   |   87 
 hooks/use-timestamp.spec.ts                                                                                                     |   65 
 public/vs/basic-languages/julia/julia.js                                                                                        |   10 
 app/components/workflow/run/utils/format-log/loop/index.spec.ts                                                                 |   23 
 app/components/header/account-setting/data-source-page/panel/index.tsx                                                          |  145 
 app/components/base/date-and-time-picker/common/option-list-item.tsx                                                            |   38 
 app/components/workflow/run/assets/bg-line-running.svg                                                                          |    3 
 i18n/fr-FR/education.ts                                                                                                         |   47 
 app/components/signin/countdown.tsx                                                                                             |   41 
 app/education-apply/constants.ts                                                                                                |    2 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-panel.tsx                                        |   51 
 i18n/vi-VN/education.ts                                                                                                         |   47 
 app/components/base/icons/src/public/llm/Gpt4.tsx                                                                               |   20 
 app/components/plugins/marketplace/hooks.ts                                                                                     |  177 
 app/components/base/icons/src/public/tracing/LangfuseIconBig.tsx                                                                |   20 
 app/components/base/icons/assets/public/llm/baichuan-text.svg                                                                   |   19 
 app/components/base/icons/src/vender/features/FolderUpload.tsx                                                                  |   20 
 app/components/workflow/nodes/_base/components/switch-plugin-version.tsx                                                        |  126 
 app/(commonLayout)/app/(appDetailLayout)/[appId]/layout.tsx                                                                     |   14 
 app/components/base/date-and-time-picker/time-picker/footer.tsx                                                                 |   37 
 public/vs/basic-languages/r/r.js                                                                                                |   10 
 i18n/ro-RO/common.ts                                                                                                            |  672 
 app/components/base/icons/assets/public/plugins/google.svg                                                                      |    6 
 app/components/base/tooltip/index.tsx                                                                                           |  116 
 i18n/es-ES/app-debug.ts                                                                                                         |  419 
 app/components/base/tag-management/store.ts                                                                                     |   19 
 app/components/datasets/common/document-picker/document-list.tsx                                                                |   42 
 app/components/workflow/nodes/template-transform/use-config.ts                                                                  |  137 
 app/components/base/icons/src/public/llm/ReplicateText.tsx                                                                      |   20 
 app/components/app/configuration/config-prompt/prompt-editor-height-resize-wrap.tsx                                             |   96 
 app/components/base/chat/chat/thought/tool.tsx                                                                                  |  106 
 app/components/base/features/store.ts                                                                                           |   66 
 app/components/base/icons/assets/public/files/html.svg                                                                          |   23 
 app/components/base/icons/assets/vender/line/general/log-in-04.svg                                                              |    8 
 app/components/base/icons/src/public/knowledge/index.ts                                                                         |    6 
 app/components/base/icons/src/vender/features/Citations.json                                                                    |   26 
 app/components/base/icons/assets/public/common/diagonal-dividing-line.svg                                                       |    3 
 app/components/base/icons/src/vender/workflow/KnowledgeRetrieval.tsx                                                            |   20 
 app/components/base/icons/src/vender/solid/development/TerminalSquare.json                                                      |   38 
 app/components/base/icons/assets/vender/features/folder-upload.svg                                                              |    3 
 app/components/base/icons/src/public/llm/Microsoft.json                                                                         |   76 
 public/vs/base/common/worker/simpleWorker.nls.es.js                                                                             |    8 
 app/components/base/icons/src/vender/line/arrows/RefreshCw05.tsx                                                                |   20 
 app/components/plugins/plugin-page/empty/index.tsx                                                                              |  121 
 public/vs/basic-languages/mysql/mysql.js                                                                                        |   10 
 app/components/header/account-setting/model-provider-page/provider-added-card/add-model-button.tsx                              |   27 
 public/vs/basic-languages/go/go.js                                                                                              |   10 
 app/components/base/icons/src/vender/line/general/X.json                                                                        |   39 
 app/components/datasets/create/step-one/index.module.css                                                                        |   66 
 i18n/zh-Hant/app-debug.ts                                                                                                       |  404 
 app/components/base/icons/assets/public/llm/azure-openai-service-text.svg                                                       |   25 
 public/vs/basic-languages/csharp/csharp.js                                                                                      |   10 
 app/components/workflow/plugin-dependency/store.ts                                                                              |   11 
 app/components/workflow/nodes/loop/components/loop-variables/index.tsx                                                          |   28 
 app/routePrefixHandle.tsx                                                                                                       |   53 
 i18n/de-DE/plugin-tags.ts                                                                                                       |   25 
 app/components/datasets/create/website/base/url-input.tsx                                                                       |   48 
 app/components/base/icons/assets/vender/line/development/variable.svg                                                           |    9 
 service/use-common.ts                                                                                                           |   28 
 app/components/workflow-app/components/workflow-header/features-trigger.tsx                                                     |  152 
 app/components/base/icons/assets/public/plugins/wikipedia.svg                                                                   |    3 
 app/components/base/icons/src/vender/line/arrows/ChevronDownDouble.json                                                         |   39 
 app/components/base/file-uploader/constants.ts                                                                                  |    8 
 app/components/base/copy-btn/style.module.css                                                                                   |   15 
 app/components/datasets/metadata/metadata-document/index.tsx                                                                    |  120 
 app/components/base/icons/assets/vender/workflow/templating-transform.svg                                                       |   19 
 app/components/base/image-uploader/hooks.ts                                                                                     |  270 
 utils/model-config.ts                                                                                                           |  164 
 app/components/base/icons/src/vender/workflow/DocsExtractor.json                                                                |   64 
 app/components/base/icons/src/vender/line/general/ChecklistSquare.tsx                                                           |   20 
 app/components/base/icons/src/public/common/Gdpr.json                                                                           |  340 
 app/components/base/icons/src/vender/features/VirtualAssistant.json                                                             |   35 
 i18n/uk-UA/run-log.ts                                                                                                           |   31 
 app/components/base/icons/src/vender/solid/mediaAndDevices/Robot.json                                                           |   38 
 app/components/base/icons/src/public/files/Csv.tsx                                                                              |   20 
 app/components/explore/app-list/index.tsx                                                                                       |  246 
 i18n/fa-IR/plugin-tags.ts                                                                                                       |   25 
 i18n/fa-IR/app.ts                                                                                                               |  214 
 app/init/InitPasswordPopup.tsx                                                                                                  |   83 
 app/components/app/configuration/features/experience-enhance-group/index.tsx                                                    |   43 
 app/components/tools/edit-custom-collection-modal/test-api.tsx                                                                  |  134 
 app/components/billing/upgrade-btn/index.tsx                                                                                    |   67 
 app/components/base/icons/assets/public/common/multi-path-retrieval.svg                                                         |   19 
 app/components/base/icons/assets/vender/line/files/clipboard-check.svg                                                          |    3 
 hooks/use-moderate.ts                                                                                                           |   49 
 app/components/base/icons/src/public/llm/AnthropicLight.tsx                                                                     |   20 
 app/components/base/skeleton/index.tsx                                                                                          |   50 
 app/components/base/icons/assets/vender/line/mediaAndDevices/play-circle.svg                                                    |   13 
 app/components/base/notion-page-selector/assets/down-arrow.svg                                                                  |    3 
 i18n/hi-IN/app-overview.ts                                                                                                      |  191 
 i18n/en-US/app-api.ts                                                                                                           |   85 
 app/components/base/icons/assets/vender/solid/communication/message-heart-circle.svg                                            |    5 
 app/signin/components/mail-and-code-auth.tsx                                                                                    |   72 
 app/components/base/icons/src/vender/solid/files/Folder.tsx                                                                     |   20 
 i18n/ru-RU/app-debug.ts                                                                                                         |  463 
 app/components/base/icons/src/vender/line/communication/CuteRobot.json                                                          |   39 
 app/components/workflow/run/meta.tsx                                                                                            |  117 
 app/components/base/chat/chat/answer/workflow-process.tsx                                                                       |   94 
 i18n/ja-JP/common.ts                                                                                                            |  672 
 i18n/zh-Hans/share-app.ts                                                                                                       |   78 
 app/components/datasets/metadata/metadata-dataset/create-content.tsx                                                            |   90 
 app/components/base/icons/assets/vender/solid/education/heart-02.svg                                                            |    3 
 app/components/plugins/plugin-page/context.tsx                                                                                  |   89 
 app/components/base/icons/assets/public/files/xlsx.svg                                                                          |   18 
 app/components/base/icons/src/vender/line/files/FilePlus01.json                                                                 |   39 
 app/components/base/icons/src/vender/line/communication/MessageFastPlus.json                                                    |   29 
 i18n/es-ES/app-annotation.ts                                                                                                    |   87 
 app/(commonLayout)/datasets/DatasetFooter.tsx                                                                                   |   19 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/json-importer.tsx                                         |  136 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/generated-result.tsx                |  121 
 app/components/base/tag-management/constant.ts                                                                                  |    6 
 i18n/en-US/layout.ts                                                                                                            |    4 
 service/tools.ts                                                                                                                |  160 
 app/account/delete-account/components/check-email.tsx                                                                           |   48 
 app/components/app/configuration/dataset-config/params-config/index.tsx                                                         |  156 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/code-editor.tsx                                           |  140 
 app/components/workflow/run/iteration-log/index.tsx                                                                             |    2 
 app/components/workflow/header/version-history-button.tsx                                                                       |   66 
 public/logo/logo-site.png                                                                                                       |    0 
 app/components/workflow-app/components/workflow-main.tsx                                                                        |   91 
 app/components/base/icons/src/public/llm/Anthropic.json                                                                         |   37 
 app/components/base/icons/src/public/plugins/PartnerLight.json                                                                  |  446 
 public/screenshots/light/Chatflow@3x.png                                                                                        |    0 
 app/components/base/icons/src/vender/line/mediaAndDevices/Microphone01.json                                                     |   39 
 app/components/base/icons/src/vender/solid/files/index.ts                                                                       |    4 
 app/components/app/configuration/base/operation-btn/index.tsx                                                                   |   44 
 app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/show/index.tsx                                  |   39 
 models/datasets.ts                                                                                                              |  694 
 app/components/workflow/nodes/http/components/edit-body/index.tsx                                                               |  204 
 public/vs/basic-languages/ini/ini.js                                                                                            |   10 
 app/components/workflow/run/utils/format-log/agent/index.spec.ts                                                                |   15 
 i18n/it-IT/layout.ts                                                                                                            |    4 
 app/components/base/form/components/field/options.tsx                                                                           |   34 
 i18n/uk-UA/common.ts                                                                                                            |  673 
 app/components/base/icons/src/vender/line/communication/ChatBot.tsx                                                             |   20 
 public/vs/base/common/worker/simpleWorker.nls.zh-cn.js                                                                          |    8 
 service/use-strategy.ts                                                                                                         |   36 
 app/components/base/icons/src/public/llm/LocalaiText.json                                                                       |  170 
 app/components/workflow/operator/index.tsx                                                                                      |   35 
 app/components/base/icons/assets/vender/solid/users/users-01.svg                                                                |   10 
 app/components/app/configuration/config/agent/agent-setting/index.tsx                                                           |  165 
 app/components/base/icons/src/public/llm/Baichuan.tsx                                                                           |   20 
 i18n/es-ES/register.ts                                                                                                          |    4 
 app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-filter/index.tsx                                 |  105 
 eslint.config.mjs                                                                                                               |  249 
 app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsUp.json                                                       |   66 
 app/components/develop/secret-key/assets/svged.svg                                                                              |    1 
 app/(commonLayout)/apps/AppCard.tsx                                                                                             |  426 
 app/components/base/icons/src/public/common/Notion.json                                                                         |   83 
 app/components/base/icons/src/vender/workflow/Code.tsx                                                                          |   20 
 app/components/app-sidebar/expert.png                                                                                           |    0 
 jest.setup.ts                                                                                                                   |    6 
 app/components/base/icons/assets/vender/solid/general/edit-03.svg                                                               |    8 
 i18n/ko-KR/common.ts                                                                                                            |  668 
 app/components/workflow/nodes/_base/components/before-run-form/form.tsx                                                         |   97 
 public/vs/basic-languages/handlebars/handlebars.js                                                                              |   10 
 app/components/base/icons/src/vender/line/development/CodeBrowser.json                                                          |   39 
 app/components/base/message-log-modal/index.tsx                                                                                 |   71 
 i18n/de-DE/app-api.ts                                                                                                           |   85 
 app/components/develop/secret-key/assets/svg.svg                                                                                |    1 
 app/components/base/icons/src/vender/solid/general/CheckCircle.json                                                             |   38 
 app/components/workflow/nodes/_base/components/variable/var-full-path-panel.tsx                                                 |   59 
 app/components/workflow/nodes/variable-assigner/default.ts                                                                      |   59 
 app/components/base/icons/src/vender/line/development/BracketsX.json                                                            |   29 
 app/components/base/icons/src/vender/solid/mediaAndDevices/MagicWand.json                                                       |   73 
 app/components/base/icons/src/public/avatar/User.json                                                                           |   89 
 app/components/app/configuration/config-var/config-select/index.tsx                                                             |   96 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/prompt-editor.tsx                   |  108 
 app/components/base/icons/src/vender/line/time/ClockFastForward.json                                                            |   29 
 i18n/it-IT/register.ts                                                                                                          |    4 
 i18n/sl-SI/layout.ts                                                                                                            |    4 
 app/components/plugins/marketplace/list/list-wrapper.tsx                                                                        |   75 
 app/components/base/prompt-editor/plugins/context-block/index.tsx                                                               |   75 
 app/components/tools/edit-custom-collection-modal/index.tsx                                                                     |  366 
 app/components/workflow/header/env-button.tsx                                                                                   |   24 
 app/components/workflow/nodes/if-else/types.ts                                                                                  |   71 
 i18n/it-IT/explore.ts                                                                                                           |   45 
 service/annotation.ts                                                                                                           |   65 
 app/components/app/annotation/filter.tsx                                                                                        |   48 
 i18n/ja-JP/custom.ts                                                                                                            |   32 
 utils/clipboard.ts                                                                                                              |   35 
 app/components/datasets/create/assets/selection-mod.svg                                                                         |   12 
 app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/show/field.tsx                                  |   74 
 i18n/de-DE/login.ts                                                                                                             |  110 
 app/components/base/icons/src/public/knowledge/LayoutRight2LineMod.json                                                         |   36 
 i18n/fr-FR/explore.ts                                                                                                           |   44 
 i18n/pt-BR/dataset-settings.ts                                                                                                  |   43 
 i18n/ja-JP/share-app.ts                                                                                                         |   78 
 app/components/base/pagination/pagination.tsx                                                                                   |  190 
 app/components/app/overview/customize/index.tsx                                                                                 |  119 
 app/components/base/icons/src/vender/line/editor/TypeSquare.json                                                                |   38 
 app/components/base/progress-bar/index.tsx                                                                                      |   20 
 app/components/datasets/create/assets/csv.svg                                                                                   |   22 
 app/components/workflow/nodes/loop-start/index.tsx                                                                              |   42 
 app/(commonLayout)/apps/assets/chat-solid.svg                                                                                   |    4 
 app/components/base/icons/src/public/thought/WebReader.json                                                                     |   64 
 app/components/workflow/nodes/http/components/key-value/key-value-edit/input-item.tsx                                           |  109 
 app/components/workflow/store/workflow/index.ts                                                                                 |   81 
 app/components/datasets/documents/detail/style.module.css                                                                       |   11 
 app/components/base/icons/src/public/llm/OpenaiBlack.json                                                                       |   37 
 app/components/base/text-generation/hooks.ts                                                                                    |   61 
 app/components/workflow/nodes/loop/components/loop-variables/item.tsx                                                           |   78 
 i18n/it-IT/dataset-documents.ts                                                                                                 |  397 
 app/components/workflow/nodes/if-else/components/condition-list/condition-input.tsx                                             |   56 
 app/components/base/audio-btn/index.tsx                                                                                         |  110 
 app/components/base/icons/assets/image/llm/wxyy.png                                                                             |    0 
 app/components/datasets/settings/index-method-radio/index.tsx                                                                   |  106 
 app/components/base/icons/src/vender/line/time/ClockPlay.json                                                                   |   66 
 app/components/base/simple-pie-chart/index.tsx                                                                                  |   67 
 app/components/workflow/nodes/iteration/use-interactions.ts                                                                     |  155 
 i18n/vi-VN/share-app.ts                                                                                                         |   78 
 app/components/workflow-app/components/workflow-panel.tsx                                                                       |  109 
 app/components/workflow/store/workflow/node-slice.ts                                                                            |   76 
 i18n/en-US/dataset-hit-testing.ts                                                                                               |   34 
 app/components/plugins/install-plugin/install-from-marketplace/steps/install.tsx                                                |  172 
 app/components/workflow/nodes/_base/components/next-step/index.tsx                                                              |  114 
 app/components/base/icons/src/vender/line/layout/LayoutGrid02.json                                                              |   29 
 app/components/base/icons/src/vender/solid/development/PromptEngineering.tsx                                                    |   20 
 app/components/base/notion-page-selector/page-selector/index.tsx                                                                |  320 
 i18n/zh-Hans/dataset-documents.ts                                                                                               |  393 
 app/components/base/icons/src/public/plugins/VerifiedDark.json                                                                  |  457 
 hooks/use-knowledge.ts                                                                                                          |   32 
 public/vs/language/css/cssMode.js                                                                                               |   13 
 app/components/base/app-icon/style.module.css                                                                                   |   23 
 public/screenshots/dark/Agent@2x.png                                                                                            |    0 
 i18n/ko-KR/app-log.ts                                                                                                           |   99 
 models/user.ts                                                                                                                  |   17 
 app/components/app/overview/assets/scripts-option.svg                                                                           |  160 
 i18n/sl-SI/app-debug.ts                                                                                                         |  242 
 app/components/base/icons/assets/vender/plugin/box-sparkle-fill.svg                                                             |    9 
 app/components/develop/template/template_advanced_chat.zh.mdx                                                                   | 1684 
 app/components/base/icons/src/vender/solid/mediaAndDevices/MagicBox.tsx                                                         |   20 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/index.tsx                                                 |   34 
 i18n/zh-Hant/dataset-documents.ts                                                                                               |  394 
 app/components/base/icons/assets/vender/line/general/bookmark.svg                                                               |    3 
 app/components/base/icons/src/vender/solid/users/Users01.json                                                                   |   79 
 app/components/base/icons/src/vender/other/Openai.json                                                                          |   80 
 app/components/datasets/documents/detail/completed/common/regeneration-modal.tsx                                                |  132 
 app/components/base/chat/chat-with-history/index.tsx                                                                            |  253 
 app/components/base/icons/assets/public/llm/iflytek-spark.svg                                                                   |    5 
 i18n/th-TH/workflow.ts                                                                                                          |  920 
 app/components/base/icons/src/vender/features/LoveMessage.json                                                                  |   26 
 i18n/tr-TR/plugin.ts                                                                                                            |  215 
 app/components/base/icons/src/vender/line/general/Check.json                                                                    |   39 
 public/vs/base/browser/ui/codicons/codicon/codicon.ttf                                                                          |    0 
 i18n/sl-SI/register.ts                                                                                                          |    4 
 i18n/fa-IR/app-api.ts                                                                                                           |   85 
 app/components/base/icons/assets/public/llm/Anthropic-light.svg                                                                 |  186 
 i18n/uk-UA/plugin.ts                                                                                                            |  215 
 i18n/es-ES/dataset-settings.ts                                                                                                  |   43 
 i18n/th-TH/login.ts                                                                                                             |  109 
 i18n/zh-Hans/billing.ts                                                                                                         |  190 
 app/components/base/icons/src/vender/line/general/Menu01.tsx                                                                    |   20 
 app/components/plugins/permission-setting-modal/modal.tsx                                                                       |   93 
 app/components/base/icons/src/vender/line/editor/Collapse.json                                                                  |   62 
 app/components/base/icons/assets/public/llm/openllm-text.svg                                                                    |   19 
 app/components/workflow/run/result-panel.tsx                                                                                    |  160 
 i18n/pt-BR/app-debug.ts                                                                                                         |  423 
 app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx                                          |  240 
 app/components/workflow/nodes/_base/components/editor/base.tsx                                                                  |  123 
 app/components/datasets/documents/detail/completed/style.module.css                                                             |  146 
 app/styles/globals.css                                                                                                          |  700 
 app/components/plugins/install-plugin/hooks.ts                                                                                  |  107 
 app/components/base/icons/assets/vender/solid/mapsAndTravel/route.svg                                                           |    7 
 app/components/datasets/documents/detail/completed/common/full-screen-drawer.tsx                                                |   36 
 app/components/plugins/plugin-page/list/index.tsx                                                                               |   23 
 app/components/base/prompt-editor/plugins/variable-block/index.tsx                                                              |   45 
 i18n/ro-RO/explore.ts                                                                                                           |   44 
 i18n/uk-UA/app-api.ts                                                                                                           |   85 
 app/components/workflow/nodes/loop/components/condition-wrap.tsx                                                                |  146 
 app/components/base/icons/assets/vender/line/others/apps-02.svg                                                                 |    5 
 app/(commonLayout)/list.module.css                                                                                              |  217 
 app/components/plugins/base/badges/icon-with-tooltip.tsx                                                                        |   37 
 app/components/base/icons/src/vender/line/others/Env.json                                                                       |   90 
 app/(commonLayout)/datasets/template/template.ja.mdx                                                                            | 2005 
 app/components/base/icons/src/vender/workflow/KnowledgeRetrieval.json                                                           |   38 
 i18n/pt-BR/app-annotation.ts                                                                                                    |   87 
 .husky/pre-commit                                                                                                               |   78 
 app/components/workflow/panel/chat-record/index.tsx                                                                             |  138 
 app/components/plugins/plugin-detail-panel/endpoint-list.tsx                                                                    |  122 
 i18n/pl-PL/tools.ts                                                                                                             |  162 
 app/components/base/icons/assets/vender/solid/communication/edit-list.svg                                                       |    6 
 app/components/base/icons/src/vender/workflow/QuestionClassifier.json                                                           |   38 
 app/components/base/icons/src/vender/solid/communication/BubbleTextMod.json                                                     |   28 
 app/components/datasets/external-api/external-api-panel/index.tsx                                                               |   90 
 app/components/app/configuration/config-prompt/conversation-history/edit-modal.tsx                                              |   58 
 app/components/billing/annotation-full/modal.tsx                                                                                |   47 
 app/components/app/configuration/config-var/config-string/index.tsx                                                             |   45 
 app/components/base/tab-header/index.tsx                                                                                        |   50 
 i18n/pl-PL/time.ts                                                                                                              |   37 
 app/components/workflow/nodes/_base/components/code-generator-button.tsx                                                        |   48 
 app/components/base/icons/src/vender/workflow/ParameterExtractor.tsx                                                            |   20 
 app/components/plugins/install-plugin/install-from-github/index.tsx                                                             |  235 
 app/components/datasets/create/website/base/options-wrap.tsx                                                                    |   55 
 app/components/base/icons/src/public/avatar/User.tsx                                                                            |   20 
 app/components/workflow/nodes/_base/hooks/use-node-help-link.ts                                                                 |   69 
 app/components/datasets/create/assets/json.svg                                                                                  |   23 
 app/components/datasets/external-knowledge-base/connector/index.tsx                                                             |   36 
 app/components/base/radio-card/simple/style.module.css                                                                          |   25 
 app/components/plugins/install-plugin/base/loading-error.tsx                                                                    |   45 
 i18n/sl-SI/dataset-settings.ts                                                                                                  |   43 
 i18n/pl-PL/layout.ts                                                                                                            |    4 
 i18n/languages.json                                                                                                             |  151 
 app/components/base/icons/assets/vender/line/general/dots-grid.svg                                                              |   15 
 app/components/datasets/metadata/types.ts                                                                                       |   41 
 app/components/share/text-generation/index.tsx                                                                                  |  676 
 app/components/base/icons/assets/vender/line/development/file-heart-02.svg                                                      |    6 
 app/components/base/icons/src/vender/line/arrows/ChevronRight.tsx                                                               |   20 
 app/components/header/account-setting/model-provider-page/declarations.ts                                                       |  271 
 app/components/workflow/nodes/_base/components/variable/var-reference-vars.tsx                                                  |  367 
 app/components/workflow/run/iteration-log/iteration-result-panel.tsx                                                            |  128 
 app/components/workflow/nodes/loop/default.ts                                                                                   |   94 
 app/components/datasets/common/document-picker/preview-document-picker.tsx                                                      |   82 
 app/components/datasets/create/notion-page-preview/index.module.css                                                             |   33 
 app/components/base/icons/src/vender/line/editor/BezierCurve03.tsx                                                              |   20 
 i18n/vi-VN/app-annotation.ts                                                                                                    |   87 
 app/components/base/icons/src/public/thought/Search.tsx                                                                         |   20 
 app/components/workflow/nodes/if-else/components/condition-wrap.tsx                                                             |  226 
 app/components/base/icons/src/vender/features/Vision.tsx                                                                        |   20 
 app/components/datasets/create/file-preview/index.module.css                                                                    |   39 
 tsconfig.json                                                                                                                   |   42 
 app/components/datasets/documents/detail/completed/new-child-segment.tsx                                                        |  174 
 app/components/workflow/nodes/code/code-parser.spec.ts                                                                          |  326 
 app/components/base/icons/src/vender/solid/communication/ListSparkle.tsx                                                        |   20 
 app/components/billing/header-billing-btn/index.tsx                                                                             |   60 
 public/vs/loader.js                                                                                                             |   11 
 app/components/base/divider/index.tsx                                                                                           |   36 
 app/components/base/icons/assets/vender/solid/mediaAndDevices/stop-circle.svg                                                   |    5 
 app/components/workflow/operator/zoom-in-out.tsx                                                                                |  229 
 i18n/fa-IR/app-log.ts                                                                                                           |   98 
 app/components/base/chat/chat-with-history/inputs-form/view-form-dropdown.tsx                                                   |   48 
 app/components/base/icons/assets/vender/line/editor/align-left.svg                                                              |    5 
 app/components/base/icons/assets/vender/line/images/image-plus.svg                                                              |    5 
 app/components/base/icons/src/vender/solid/general/CheckDone01.json                                                             |   37 
 public/vs/editor/editor.main.nls.js                                                                                             |   13 
 app/components/app/log-annotation/index.tsx                                                                                     |   63 
 app/components/base/icons/src/public/billing/Group2.json                                                                        |   29 
 app/components/base/icons/src/vender/workflow/Code.json                                                                         |   38 
 app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout.tsx                                                        |   17 
 i18n/uk-UA/dataset-hit-testing.ts                                                                                               |   35 
 i18n/zh-Hans/register.ts                                                                                                        |    4 
 i18n/zh-Hant/app-api.ts                                                                                                         |   85 
 app/components/app/configuration/dataset-config/card-item/index.tsx                                                             |   58 
 public/vs/basic-languages/coffee/coffee.js                                                                                      |   10 
 app/components/base/agent-log-modal/result.tsx                                                                                  |  126 
 app/components/base/app-unavailable.tsx                                                                                         |   29 
 app/components/base/icons/assets/vender/features/text-to-audio.svg                                                              |    8 
 app/components/workflow/nodes/llm/default.ts                                                                                    |   91 
 app/components/base/icons/src/vender/solid/mapsAndTravel/index.ts                                                               |    2 
 context/external-knowledge-api-context.tsx                                                                                      |   46 
 app/components/plugins/install-plugin/install-bundle/item/loaded-item.tsx                                                       |   51 
 app/components/plugins/install-plugin/install-from-local-package/ready-to-install.tsx                                           |   76 
 app/components/base/modal/index.css                                                                                             |    7 
 app/components/datasets/documents/detail/index.tsx                                                                              |  300 
 app/components/base/icons/assets/vender/line/development/code-browser.svg                                                       |    5 
 app/components/base/icons/assets/vender/line/development/prompt-engineering.svg                                                 |    7 
 utils/zod.spec.ts                                                                                                               |  173 
 app/components/workflow/nodes/question-classifier/default.ts                                                                    |   76 
 app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-next.ts                                             |   35 
 app/components/base/icons/src/vender/solid/general/Tool03.json                                                                  |   62 
 i18n/de-DE/app-log.ts                                                                                                           |   98 
 i18n/ko-KR/dataset-settings.ts                                                                                                  |   43 
 i18n/fr-FR/tools.ts                                                                                                             |  158 
 app/components/base/icons/src/vender/solid/general/Target04.json                                                                |   46 
 app/components/plugins/plugin-detail-panel/tool-selector/tool-item.tsx                                                          |  163 
 app/components/base/icons/src/public/llm/ReplicateText.json                                                                     |  116 
 app/components/tools/add-tool-modal/D.png                                                                                       |    0 
 i18n/ko-KR/app-api.ts                                                                                                           |   87 
 app/components/plugins/plugin-detail-panel/tool-selector/tool-trigger.tsx                                                       |   63 
 app/components/base/chat/__tests__/__snapshots__/utils.spec.ts.snap                                                             | 2804 
 app/components/base/icons/assets/vender/workflow/iteration.svg                                                                  |    5 
 app/components/base/icons/src/public/billing/Azure.json                                                                         |  193 
 app/components/datasets/metadata/add-metadata-button.tsx                                                                        |   31 
 app/components/workflow/nodes/_base/components/variable/utils.ts                                                                | 1496 
 app/components/base/icons/src/public/other/DefaultToolIcon.tsx                                                                  |   20 
 i18n/pt-BR/tools.ts                                                                                                             |  158 
 themes/markdown-dark.css                                                                                                        |   44 
 i18n/ru-RU/dataset.ts                                                                                                           |  221 
 app/components/base/icons/assets/vender/line/communication/chat-bot-slim.svg                                                    |    9 
 app/components/app/annotation/edit-annotation-modal/edit-item/index.tsx                                                         |  128 
 app/components/tools/edit-custom-collection-modal/get-schema.tsx                                                                |  123 
 app/page.module.css                                                                                                             |  266 
 public/vs/basic-languages/css/css.js                                                                                            |   12 
 app/components/app/workflow-log/index.tsx                                                                                       |  120 
 app/components/datasets/metadata/metadata-document/field.tsx                                                                    |   26 
 i18n/tr-TR/custom.ts                                                                                                            |   32 
 hooks/use-tab-searchparams.ts                                                                                                   |   44 
 app/components/base/modal/index.tsx                                                                                             |   86 
 app/components/base/notion-page-selector/assets/setting.svg                                                                     |   11 
 app/components/base/icons/src/vender/workflow/VariableX.json                                                                    |   38 
 app/components/datasets/metadata/edit-metadata-batch/edit-row.tsx                                                               |   56 
 app/components/app/configuration/prompt-value-panel/index.tsx                                                                   |  214 
 app/components/workflow/plugin-dependency/index.tsx                                                                             |   24 
 service/knowledge/use-import.ts                                                                                                 |    0 
 app/components/app/configuration/ctrl-btn-group/style.module.css                                                                |    6 
 app/components/base/icons/src/public/billing/Diamond.json                                                                       |   39 
 i18n/tr-TR/common.ts                                                                                                            |  672 
 app/components/base/icons/assets/vender/line/general/check.svg                                                                  |    5 
 app/components/header/account-setting/model-provider-page/model-parameter-modal/trigger.tsx                                     |  112 
 app/components/workflow-app/hooks/use-workflow-init.ts                                                                          |  123 
 app/components/workflow/note-node/types.ts                                                                                      |   17 
 app/components/header/nav/index.tsx                                                                                             |   95 
 app/components/base/chat/__tests__/utils.spec.ts                                                                                |  271 
 app/components/workflow/block-selector/use-sticky-scroll.ts                                                                     |   45 
 app/components/base/icons/src/vender/solid/general/Eye.json                                                                     |   37 
 app/components/app/log/list.tsx                                                                                                 |  764 
 i18n/th-TH/app-annotation.ts                                                                                                    |   87 
 bin/uglify-embed.js                                                                                                             |    9 
 app/components/base/image-uploader/video-preview.tsx                                                                            |   37 
 i18n/uk-UA/custom.ts                                                                                                            |   32 
 app/components/workflow/nodes/parameter-extractor/panel.tsx                                                                     |  273 
 i18n/sl-SI/dataset-documents.ts                                                                                                 |  395 
 app/components/workflow/nodes/_base/components/memory-config.tsx                                                                |  207 
 app/components/workflow/run/assets/highlight-dark.svg                                                                           |    9 
 app/components/base/icons/src/vender/solid/education/Heart02.json                                                               |   26 
 app/components/base/icons/src/vender/solid/shapes/Corner.tsx                                                                    |   20 
 i18n/th-TH/common.ts                                                                                                            |  667 
 app/components/base/icons/src/vender/line/arrows/RefreshCcw01.tsx                                                               |   20 
 app/components/base/icons/src/vender/solid/mapsAndTravel/Route.json                                                             |   58 
 app/components/workflow/hooks/use-workflow-start-run.tsx                                                                        |   13 
 app/components/base/chat/chat/answer/suggested-questions.tsx                                                                    |   37 
 app/components/base/icons/src/vender/line/users/Users01.json                                                                    |   39 
 app/components/workflow/panel/version-history-panel/loading/item.tsx                                                            |   40 
 app/components/base/icons/src/vender/line/development/BarChartSquare02.json                                                     |   39 
 app/components/base/icons/assets/vender/solid/general/github.svg                                                                |    5 
 app/layout.tsx                                                                                                                  |   85 
 app/components/base/icons/assets/vender/solid/communication/message-smile-square.svg                                            |    5 
 .dockerignore                                                                                                                   |   24 
 app/components/base/icons/src/vender/solid/arrows/HighPriority.tsx                                                              |   20 
 app/components/billing/pricing/plan-item.tsx                                                                                    |  235 
 app/components/tools/provider/custom-create-card.tsx                                                                            |   76 
 app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsUp.tsx                                                        |   20 
 app/components/base/icons/assets/vender/line/development/puzzle-piece-01.svg                                                    |   10 
 app/components/base/icons/assets/public/common/notion.svg                                                                       |   12 
 i18n/vi-VN/tools.ts                                                                                                             |  158 
 app/components/base/checkbox/index.spec.tsx                                                                                     |   67 
 app/components/base/icons/assets/vender/line/others/env.svg                                                                     |   11 
 app/components/base/icons/src/public/llm/Gpt4.json                                                                              |   51 
 i18n/zh-Hant/app-log.ts                                                                                                         |   98 
 app/components/workflow/nodes/http/components/key-value/key-value-edit/item.tsx                                                 |  135 
 app/components/base/button/add-button.tsx                                                                                       |   22 
 app/components/base/icons/src/public/llm/OpenaiBlue.tsx                                                                         |   20 
 app/components/base/icons/src/vender/line/others/Apps02.tsx                                                                     |   20 
 app/components/billing/usage-info/index.tsx                                                                                     |   71 
 app/components/workflow/node-contextmenu.tsx                                                                                    |   51 
 app/components/base/icons/src/vender/line/others/Icon3Dots.tsx                                                                  |   20 
 app/components/datasets/documents/assets/hitLoading.svg                                                                         |   15 
 app/components/app/annotation/add-annotation-modal/edit-item/index.tsx                                                          |   45 
 app/components/datasets/hit-testing/assets/clock.svg                                                                            |    3 
 tailwind-common-config.ts                                                                                                       |  138 
 i18n/vi-VN/dataset-settings.ts                                                                                                  |   43 
 assets/xlsx.svg                                                                                                                 |   18 
 app/components/base/agent-log-modal/tool-call.tsx                                                                               |  142 
 app/components/base/icons/assets/vender/line/communication/ai-text.svg                                                          |    5 
 app/components/base/button/index.stories.tsx                                                                                    |  107 
 app/components/workflow/nodes/_base/components/error-handle/error-handle-on-node.tsx                                            |   67 
 i18n/pl-PL/app-debug.ts                                                                                                         |  466 
 app/components/base/icons/src/vender/solid/mediaAndDevices/index.ts                                                             |   12 
 app/components/base/icons/assets/vender/line/development/database-03.svg                                                        |    3 
 app/components/base/icons/src/public/tracing/OpikIcon.tsx                                                                       |   20 
 app/components/workflow/panel/chat-variable-panel/type.ts                                                                       |    8 
 app/components/app/app-publisher/index.tsx                                                                                      |  304 
 app/components/workflow/nodes/llm/components/json-schema-config-modal/error-message.tsx                                         |   27 
 app/components/base/icons/assets/vender/line/general/at-sign.svg                                                                |   10 
 app/components/workflow/nodes/agent/types.ts                                                                                    |   16 
 app/forgot-password/ChangePasswordForm.tsx                                                                                      |  176 
 app/components/base/icons/assets/vender/line/communication/cute-robot.svg                                                       |    5 
 app/components/base/icons/src/public/avatar/index.ts                                                                            |    2 
 app/components/base/chat/embedded-chatbot/context.tsx                                                                           |   81 
 app/components/base/icons/assets/public/llm/gpt-3.svg                                                                           |    5 
 app/components/workflow/run/retry-log/index.tsx                                                                                 |    2 
 app/components/base/icons/src/vender/plugin/index.ts                                                                            |    2 
 i18n/uk-UA/app-log.ts                                                                                                           |   98 
 app/components/base/icons/src/public/llm/ZhipuaiTextCn.json                                                                     |   62 
 app/components/app/workflow-log/list.tsx                                                                                        |  145 
 app/components/workflow/nodes/loop/components/condition-add.tsx                                                                 |   74 
 app/components/base/chat/chat/answer/agent-content.tsx                                                                          |   61 
 app/components/tools/provider-list.tsx                                                                                          |  165 
 3,891 files changed, 416,477 insertions(+), 1 deletions(-)

diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..31eb66c
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,24 @@
+.env
+.env.*
+
+# Logs
+logs
+*.log*
+
+# node
+node_modules
+.husky
+.next
+
+# vscode
+.vscode
+
+# webstorm
+.idea
+*.iml
+*.iws
+*.ipr
+
+
+# Jetbrains
+.idea
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..e501df9
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,60 @@
+# For production release, change this to PRODUCTION
+NEXT_PUBLIC_DEPLOY_ENV=DEVELOPMENT
+# The deployment edition, SELF_HOSTED
+NEXT_PUBLIC_EDITION=SELF_HOSTED
+# The base URL of console application, refers to the Console base URL of WEB service if console domain is
+# different from api or web app domain.
+# example: http://cloud.dify.ai/console/api
+NEXT_PUBLIC_API_PREFIX=http://localhost:5001/console/api
+NEXT_PUBLIC_WEB_PREFIX=http://localhost:3000
+# The URL for Web APP, refers to the Web App base URL of WEB service if web app domain is different from
+# console or api domain.
+# example: http://udify.app/api
+NEXT_PUBLIC_PUBLIC_API_PREFIX=http://localhost:5001/api
+NEXT_PUBLIC_PUBLIC_WEB_PREFIX=http://localhost:3000
+# The API PREFIX for MARKETPLACE
+NEXT_PUBLIC_MARKETPLACE_API_PREFIX=https://marketplace.dify.ai/api/v1
+# The URL for MARKETPLACE
+NEXT_PUBLIC_MARKETPLACE_URL_PREFIX=https://marketplace.dify.ai
+
+# SENTRY
+NEXT_PUBLIC_SENTRY_DSN=
+
+# Disable Next.js Telemetry (https://nextjs.org/telemetry)
+NEXT_TELEMETRY_DISABLED=1
+
+# Disable Upload Image as WebApp icon default is false
+NEXT_PUBLIC_UPLOAD_IMAGE_AS_ICON=false
+
+# The timeout for the text generation in millisecond
+NEXT_PUBLIC_TEXT_GENERATION_TIMEOUT_MS=60000
+
+# CSP https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
+NEXT_PUBLIC_CSP_WHITELIST=
+# Default is not allow to embed into iframe to prevent Clickjacking: https://owasp.org/www-community/attacks/Clickjacking
+NEXT_PUBLIC_ALLOW_EMBED=
+
+# Github Access Token, used for invoking Github API
+NEXT_PUBLIC_GITHUB_ACCESS_TOKEN=
+# The maximum number of top-k value for RAG.
+NEXT_PUBLIC_TOP_K_MAX_VALUE=10
+
+# The maximum number of tokens for segmentation
+NEXT_PUBLIC_INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=4000
+
+# Maximum loop count in the workflow
+NEXT_PUBLIC_LOOP_NODE_MAX_COUNT=100
+
+# Maximum number of tools in the agent/workflow
+NEXT_PUBLIC_MAX_TOOLS_NUM=10
+
+# Maximum number of Parallelism branches in the workflow
+NEXT_PUBLIC_MAX_PARALLEL_LIMIT=10
+
+# The maximum number of iterations for agent setting
+NEXT_PUBLIC_MAX_ITERATIONS_NUM=5
+
+NEXT_PUBLIC_ENABLE_WEBSITE_JINAREADER=true
+NEXT_PUBLIC_ENABLE_WEBSITE_FIRECRAWL=true
+NEXT_PUBLIC_ENABLE_WEBSITE_WATERCRAWL=true
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..048c5f6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,56 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+/.history
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# local env files
+.env*.local
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
+
+# npm
+package-lock.json
+
+# yarn
+.pnp.cjs
+.pnp.loader.mjs
+.yarn/
+
+.favorites.json
+
+# storybook
+/storybook-static
+*storybook.log
+
+# mise
+mise.toml
+
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100644
index 0000000..2ad3922
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,78 @@
+#!/bin/sh
+# get the list of modified files
+files=$(git diff --cached --name-only)
+
+# check if api or web directory is modified
+
+api_modified=false
+web_modified=false
+
+for file in $files
+do
+    # Use POSIX compliant pattern matching
+    case "$file" in
+        api/*.py)
+            # set api_modified flag to true
+            api_modified=true
+            ;;
+        web/*)
+            # set web_modified flag to true
+            web_modified=true
+            ;;
+    esac
+done
+
+# run linters based on the modified modules
+
+if $api_modified; then
+    echo "Running Ruff linter on api module"
+
+    # run Ruff linter auto-fixing
+    uv run --project api --dev ruff check --fix ./api
+
+    # run Ruff linter checks
+    uv run --project api --dev ruff check  ./api || status=$?
+
+    status=${status:-0}
+
+
+    if [ $status -ne 0 ]; then
+      echo "Ruff linter on api module error, exit code: $status"
+      echo "Please run 'dev/reformat' to fix the fixable linting errors."
+      exit 1
+    fi
+fi
+
+if $web_modified; then
+    echo "Running ESLint on web module"
+    cd ./web || exit 1
+    lint-staged
+
+    echo "Running unit tests check"
+    modified_files=$(git diff --cached --name-only -- utils | grep -v '\.spec\.ts$' || true)
+
+    if [ -n "$modified_files" ]; then
+        for file in $modified_files; do
+            test_file="${file%.*}.spec.ts"
+            echo "Checking for test file: $test_file"
+
+            # check if the test file exists
+            if [ -f "../$test_file" ]; then
+                echo "Detected changes in $file, running corresponding unit tests..."
+                pnpm run test "../$test_file"
+
+                if [ $? -ne 0 ]; then
+                    echo "Unit tests failed. Please fix the errors before committing."
+                    exit 1
+                fi
+                echo "Unit tests for $file passed."
+            else
+                echo "Warning: $file does not have a corresponding test file."
+            fi
+
+        done
+        echo "All unit tests for modified web/utils files have passed."
+    fi
+
+    cd ../
+fi
diff --git a/.storybook/main.ts b/.storybook/main.ts
new file mode 100644
index 0000000..fecf774
--- /dev/null
+++ b/.storybook/main.ts
@@ -0,0 +1,19 @@
+import type { StorybookConfig } from '@storybook/nextjs'
+
+const config: StorybookConfig = {
+  // stories: ['../stories/**/*.mdx', '../stories/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
+  stories: ['../app/components/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
+  addons: [
+    '@storybook/addon-onboarding',
+    '@storybook/addon-links',
+    '@storybook/addon-essentials',
+    '@chromatic-com/storybook',
+    '@storybook/addon-interactions',
+  ],
+  framework: {
+    name: '@storybook/nextjs',
+    options: {},
+  },
+  staticDirs: ['../public'],
+}
+export default config
diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx
new file mode 100644
index 0000000..5532860
--- /dev/null
+++ b/.storybook/preview.tsx
@@ -0,0 +1,37 @@
+import React from 'react'
+import type { Preview } from '@storybook/react'
+import { withThemeByDataAttribute } from '@storybook/addon-themes'
+import I18nServer from '../app/components/i18n-server'
+
+import '../app/styles/globals.css'
+import '../app/styles/markdown.scss'
+import './storybook.css'
+
+export const decorators = [
+  withThemeByDataAttribute({
+    themes: {
+      light: 'light',
+      dark: 'dark',
+    },
+    defaultTheme: 'light',
+    attributeName: 'data-theme',
+  }),
+  (Story) => {
+    return <I18nServer>
+      <Story />
+    </I18nServer>
+  },
+]
+
+const preview: Preview = {
+  parameters: {
+    controls: {
+      matchers: {
+        color: /(background|color)$/i,
+        date: /Date$/i,
+      },
+    },
+  },
+}
+
+export default preview
diff --git a/.storybook/storybook.css b/.storybook/storybook.css
new file mode 100644
index 0000000..85df108
--- /dev/null
+++ b/.storybook/storybook.css
@@ -0,0 +1,6 @@
+html,
+body {
+  max-width: unset;
+  overflow: auto;
+  user-select: text;
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..e0e72ce
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,7 @@
+{
+  "recommendations": [
+    "bradlc.vscode-tailwindcss",
+    "firsttris.vscode-jest-runner",
+    "kisstkondoros.vscode-codemetrics"
+  ]
+}
diff --git a/.vscode/settings.example.json b/.vscode/settings.example.json
new file mode 100644
index 0000000..ce5c9d6
--- /dev/null
+++ b/.vscode/settings.example.json
@@ -0,0 +1,26 @@
+{
+  "prettier.enable": false,
+  "editor.formatOnSave": true,
+  "editor.codeActionsOnSave": {
+    "source.fixAll.eslint": "explicit"
+  },
+  "eslint.format.enable": true,
+  "[python]": {
+    "editor.formatOnType": true
+  },
+  "[html]": {
+    "editor.defaultFormatter": "vscode.html-language-features"
+  },
+  "[typescriptreact]": {
+    "editor.defaultFormatter": "vscode.typescript-language-features"
+  },
+  "[javascriptreact]": {
+    "editor.defaultFormatter": "vscode.typescript-language-features"
+  },
+  "[jsonc]": {
+    "editor.defaultFormatter": "vscode.json-language-features"
+  },
+  "typescript.tsdk": "node_modules/typescript/lib",
+  "typescript.enablePromptUseWorkspaceTsdk": true,
+  "npm.packageManager": "pnpm"
+}
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..dfc5ba8
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,76 @@
+# base image
+FROM node:22-alpine3.21 AS base
+LABEL maintainer="takatost@gmail.com"
+
+# if you located in China, you can use aliyun mirror to speed up
+# RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
+
+RUN apk add --no-cache tzdata
+RUN npm install -g pnpm@10.8.0
+ENV PNPM_HOME="/pnpm"
+ENV PATH="$PNPM_HOME:$PATH"
+
+
+# install packages
+FROM base AS packages
+
+WORKDIR /app/web
+
+COPY package.json .
+COPY pnpm-lock.yaml .
+
+# if you located in China, you can use taobao registry to speed up
+# RUN pnpm install --frozen-lockfile --registry https://registry.npmmirror.com/
+
+RUN pnpm install --frozen-lockfile
+
+# build resources
+FROM base AS builder
+WORKDIR /app/web
+COPY --from=packages /app/web/ .
+COPY . .
+
+ENV NODE_OPTIONS="--max-old-space-size=4096"
+RUN pnpm build
+
+
+# production stage
+FROM base AS production
+
+ENV NODE_ENV=production
+ENV EDITION=SELF_HOSTED
+ENV DEPLOY_ENV=PRODUCTION
+ENV CONSOLE_API_URL=http://127.0.0.1:5001
+ENV APP_API_URL=http://127.0.0.1:5001
+ENV MARKETPLACE_API_URL=https://marketplace.dify.ai
+ENV MARKETPLACE_URL=https://marketplace.dify.ai
+ENV PORT=3000
+ENV NEXT_TELEMETRY_DISABLED=1
+ENV PM2_INSTANCES=2
+
+# set timezone
+ENV TZ=UTC
+RUN ln -s /usr/share/zoneinfo/${TZ} /etc/localtime \
+    && echo ${TZ} > /etc/timezone
+
+
+WORKDIR /app/web
+COPY --from=builder /app/web/public ./public
+COPY --from=builder /app/web/.next/standalone ./
+COPY --from=builder /app/web/.next/static ./.next/static
+
+COPY docker/entrypoint.sh ./entrypoint.sh
+
+
+# global runtime packages
+RUN pnpm add -g pm2 \
+    && mkdir /.pm2 \
+    && chown -R 1001:0 /.pm2 /app/web \
+    && chmod -R g=u /.pm2 /app/web
+
+ARG COMMIT_SHA
+ENV COMMIT_SHA=${COMMIT_SHA}
+
+USER 1001
+EXPOSE 3000
+ENTRYPOINT ["/bin/sh", "./entrypoint.sh"]
diff --git a/README.md b/README.md
index ed958fd..ddb1155 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,120 @@
-## app-qxueyou-dify
+# Dify Frontend
+
+This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
+
+## Getting Started
+
+### Run by source code
+
+Before starting the web frontend service, please make sure the following environment is ready.
+- [Node.js](https://nodejs.org) >= v22.11.x
+- [pnpm](https://pnpm.io) v10.x
+
+First, install the dependencies:
+
+```bash
+pnpm install
+```
+
+Then, configure the environment variables. Create a file named `.env.local` in the current directory and copy the contents from `.env.example`. Modify the values of these environment variables according to your requirements:
+
+```bash
+cp .env.example .env.local
+```
+
+```
+# For production release, change this to PRODUCTION
+NEXT_PUBLIC_DEPLOY_ENV=DEVELOPMENT
+# The deployment edition, SELF_HOSTED
+NEXT_PUBLIC_EDITION=SELF_HOSTED
+# The base URL of console application, refers to the Console base URL of WEB service if console domain is
+# different from api or web app domain.
+# example: http://cloud.dify.ai/console/api
+NEXT_PUBLIC_API_PREFIX=http://localhost:5001/console/api
+NEXT_PUBLIC_WEB_PREFIX=http://localhost:3000
+# The URL for Web APP, refers to the Web App base URL of WEB service if web app domain is different from
+# console or api domain.
+# example: http://udify.app/api
+NEXT_PUBLIC_PUBLIC_API_PREFIX=http://localhost:5001/api
+NEXT_PUBLIC_PUBLIC_WEB_PREFIX=http://localhost:3000
+
+# SENTRY
+NEXT_PUBLIC_SENTRY_DSN=
+```
+
+Finally, run the development server:
+
+```bash
+pnpm run dev
+```
+
+Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
+
+You can start editing the file under folder `app`. The page auto-updates as you edit the file.
+
+## Deploy
+
+### Deploy on server
+
+First, build the app for production:
+
+```bash
+pnpm run build
+```
+
+Then, start the server:
+
+```bash
+pnpm run start
+```
+
+If you want to customize the host and port:
+
+```bash
+pnpm run start --port=3001 --host=0.0.0.0
+```
+
+If you want to customize the number of instances launched by PM2, you can configure `PM2_INSTANCES` in `docker-compose.yaml` or `Dockerfile`.
+
+## Storybook
+
+This project uses [Storybook](https://storybook.js.org/) for UI component development.
+
+To start the storybook server, run:
+
+```bash
+pnpm storybook
+```
+
+Open [http://localhost:6006](http://localhost:6006) with your browser to see the result.
+
+## Lint Code
+
+If your IDE is VSCode, rename `web/.vscode/settings.example.json` to `web/.vscode/settings.json` for lint code setting.
+
+## Test
+
+We start to use [Jest](https://jestjs.io/) and [React Testing Library](https://testing-library.com/docs/react-testing-library/intro/) for Unit Testing.
+
+You can create a test file with a suffix of `.spec` beside the file that to be tested. For example, if you want to test a file named `util.ts`. The test file name should be `util.spec.ts`.
+
+Run test:
+
+```bash
+pnpm run test
+```
+
+If you are not familiar with writing tests, here is some code to refer to:
+* [classnames.spec.ts](./utils/classnames.spec.ts)
+* [index.spec.tsx](./app/components/base/button/index.spec.tsx)
 
 
 
+
+## Documentation
+
+Visit <https://docs.dify.ai/getting-started/readme> to view the full documentation.
+
+## Community
+
+The Dify community can be found on [Discord community](https://discord.gg/5AEfbxcd9k), where you can ask questions, voice ideas, and share your projects.
diff --git a/__mocks__/mime.js b/__mocks__/mime.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/__mocks__/mime.js
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/annotations/page.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/annotations/page.tsx"
new file mode 100644
index 0000000..5fb3ff4
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/annotations/page.tsx"
@@ -0,0 +1,15 @@
+import React from 'react'
+import Main from '@/app/components/app/log-annotation'
+import { PageType } from '@/app/components/base/features/new-feature-panel/annotation-reply/type'
+
+export type IProps = {
+  params: Promise<{ appId: string }>
+}
+
+const Logs = async () => {
+  return (
+    <Main pageType={PageType.annotation} />
+  )
+}
+
+export default Logs
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/configuration/page.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/configuration/page.tsx"
new file mode 100644
index 0000000..41143b9
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/configuration/page.tsx"
@@ -0,0 +1,10 @@
+import React from 'react'
+import Configuration from '@/app/components/app/configuration'
+
+const IConfiguration = async () => {
+  return (
+    <Configuration />
+  )
+}
+
+export default IConfiguration
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/develop/page.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/develop/page.tsx"
new file mode 100644
index 0000000..415d822
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/develop/page.tsx"
@@ -0,0 +1,19 @@
+import React from 'react'
+import type { Locale } from '@/i18n'
+import DevelopMain from '@/app/components/develop'
+
+export type IDevelopProps = {
+  params: Promise<{ locale: Locale; appId: string }>
+}
+
+const Develop = async (props: IDevelopProps) => {
+  const params = await props.params
+
+  const {
+    appId,
+  } = params
+
+  return <DevelopMain appId={appId} />
+}
+
+export default Develop
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/layout-main.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/layout-main.tsx"
new file mode 100644
index 0000000..1434a81
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/layout-main.tsx"
@@ -0,0 +1,177 @@
+'use client'
+import type { FC } from 'react'
+import { useUnmount } from 'ahooks'
+import React, { useCallback, useEffect, useState } from 'react'
+import { usePathname, useRouter } from 'next/navigation'
+import {
+  RiDashboard2Fill,
+  RiDashboard2Line,
+  RiFileList3Fill,
+  RiFileList3Line,
+  RiTerminalBoxFill,
+  RiTerminalBoxLine,
+  RiTerminalWindowFill,
+  RiTerminalWindowLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useShallow } from 'zustand/react/shallow'
+import { useContextSelector } from 'use-context-selector'
+import s from './style.module.css'
+import cn from '@/utils/classnames'
+import { useStore } from '@/app/components/app/store'
+import AppSideBar from '@/app/components/app-sidebar'
+import type { NavIcon } from '@/app/components/app-sidebar/navLink'
+import { fetchAppDetail, fetchAppSSO } from '@/service/apps'
+import AppContext, { useAppContext } from '@/context/app-context'
+import Loading from '@/app/components/base/loading'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import type { App } from '@/types/app'
+
+export type IAppDetailLayoutProps = {
+  children: React.ReactNode
+  appId: string
+}
+
+const AppDetailLayout: FC<IAppDetailLayoutProps> = (props) => {
+  const {
+    children,
+    appId, // get appId in path
+  } = props
+  const { t } = useTranslation()
+  const router = useRouter()
+  const pathname = usePathname()
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+  const { isCurrentWorkspaceEditor, isLoadingCurrentWorkspace } = useAppContext()
+  const { appDetail, setAppDetail, setAppSiderbarExpand } = useStore(useShallow(state => ({
+    appDetail: state.appDetail,
+    setAppDetail: state.setAppDetail,
+    setAppSiderbarExpand: state.setAppSiderbarExpand,
+  })))
+  const [isLoadingAppDetail, setIsLoadingAppDetail] = useState(false)
+  const [appDetailRes, setAppDetailRes] = useState<App | null>(null)
+  const [navigation, setNavigation] = useState<Array<{
+    name: string
+    href: string
+    icon: NavIcon
+    selectedIcon: NavIcon
+  }>>([])
+  const systemFeatures = useContextSelector(AppContext, state => state.systemFeatures)
+
+  const getNavigations = useCallback((appId: string, isCurrentWorkspaceEditor: boolean, mode: string) => {
+    const navs = [
+      ...(isCurrentWorkspaceEditor
+        ? [{
+          name: t('common.appMenus.promptEng'),
+          href: `/app/${appId}/${(mode === 'workflow' || mode === 'advanced-chat') ? 'workflow' : 'configuration'}`,
+          icon: RiTerminalWindowLine,
+          selectedIcon: RiTerminalWindowFill,
+        }]
+        : []
+      ),
+      {
+        name: t('common.appMenus.apiAccess'),
+        href: `/app/${appId}/develop`,
+        icon: RiTerminalBoxLine,
+        selectedIcon: RiTerminalBoxFill,
+      },
+      ...(isCurrentWorkspaceEditor
+        ? [{
+          name: mode !== 'workflow'
+            ? t('common.appMenus.logAndAnn')
+            : t('common.appMenus.logs'),
+          href: `/app/${appId}/logs`,
+          icon: RiFileList3Line,
+          selectedIcon: RiFileList3Fill,
+        }]
+        : []
+      ),
+      {
+        name: t('common.appMenus.overview'),
+        href: `/app/${appId}/overview`,
+        icon: RiDashboard2Line,
+        selectedIcon: RiDashboard2Fill,
+      },
+    ]
+    return navs
+  }, [])
+
+  useEffect(() => {
+    if (appDetail) {
+      document.title = `${(appDetail.name || 'App')} - Dify`
+      const localeMode = localStorage.getItem('app-detail-collapse-or-expand') || 'expand'
+      const mode = isMobile ? 'collapse' : 'expand'
+      setAppSiderbarExpand(isMobile ? mode : localeMode)
+      // TODO: consider screen size and mode
+      // if ((appDetail.mode === 'advanced-chat' || appDetail.mode === 'workflow') && (pathname).endsWith('workflow'))
+      //   setAppSiderbarExpand('collapse')
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [appDetail, isMobile])
+
+  useEffect(() => {
+    setAppDetail()
+    setIsLoadingAppDetail(true)
+    fetchAppDetail({ url: '/apps', id: appId }).then((res) => {
+      setAppDetailRes(res)
+    }).catch((e: any) => {
+      if (e.status === 404)
+        router.replace('/apps')
+    }).finally(() => {
+      setIsLoadingAppDetail(false)
+    })
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [appId, pathname])
+
+  useEffect(() => {
+    if (!appDetailRes || isLoadingCurrentWorkspace || isLoadingAppDetail)
+      return
+    const res = appDetailRes
+    // redirection
+    const canIEditApp = isCurrentWorkspaceEditor
+    if (!canIEditApp && (pathname.endsWith('configuration') || pathname.endsWith('workflow') || pathname.endsWith('logs'))) {
+      router.replace(`/app/${appId}/overview`)
+      return
+    }
+    if ((res.mode === 'workflow' || res.mode === 'advanced-chat') && (pathname).endsWith('configuration')) {
+      router.replace(`/app/${appId}/workflow`)
+    }
+    else if ((res.mode !== 'workflow' && res.mode !== 'advanced-chat') && (pathname).endsWith('workflow')) {
+      router.replace(`/app/${appId}/configuration`)
+    }
+    else {
+      setAppDetail({ ...res, enable_sso: false })
+      setNavigation(getNavigations(appId, isCurrentWorkspaceEditor, res.mode))
+      if (systemFeatures.enable_web_sso_switch_component && canIEditApp) {
+        fetchAppSSO({ appId }).then((ssoRes) => {
+          setAppDetail({ ...res, enable_sso: ssoRes.enabled })
+        })
+      }
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [appDetailRes, isCurrentWorkspaceEditor, isLoadingAppDetail, isLoadingCurrentWorkspace, systemFeatures.enable_web_sso_switch_component])
+
+  useUnmount(() => {
+    setAppDetail()
+  })
+
+  if (!appDetail) {
+    return (
+      <div className='flex h-full items-center justify-center bg-background-body'>
+        <Loading />
+      </div>
+    )
+  }
+
+  return (
+    <div className={cn(s.app, 'relative flex', 'overflow-hidden')}>
+      {appDetail && (
+        <AppSideBar title={appDetail.name} icon={appDetail.icon} icon_background={appDetail.icon_background as string} desc={appDetail.mode} navigation={navigation} />
+      )}
+      <div className="grow overflow-hidden bg-components-panel-bg">
+        {children}
+      </div>
+    </div>
+  )
+}
+export default React.memo(AppDetailLayout)
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/layout.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/layout.tsx"
new file mode 100644
index 0000000..491a046
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/layout.tsx"
@@ -0,0 +1,14 @@
+import Main from './layout-main'
+
+const AppDetailLayout = async (props: {
+  children: React.ReactNode
+  params: Promise<{ appId: string }>
+}) => {
+  const {
+    children,
+    params,
+  } = props
+
+  return <Main appId={(await params).appId}>{children}</Main>
+}
+export default AppDetailLayout
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/logs/page.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/logs/page.tsx"
new file mode 100644
index 0000000..244a357
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/logs/page.tsx"
@@ -0,0 +1,11 @@
+import React from 'react'
+import Main from '@/app/components/app/log-annotation'
+import { PageType } from '@/app/components/base/features/new-feature-panel/annotation-reply/type'
+
+const Logs = async () => {
+  return (
+    <Main pageType={PageType.log} />
+  )
+}
+
+export default Logs
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/cardView.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/cardView.tsx"
new file mode 100644
index 0000000..79b4594
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/cardView.tsx"
@@ -0,0 +1,144 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext, useContextSelector } from 'use-context-selector'
+import AppCard from '@/app/components/app/overview/appCard'
+import Loading from '@/app/components/base/loading'
+import { ToastContext } from '@/app/components/base/toast'
+import {
+  fetchAppDetail,
+  fetchAppSSO,
+  updateAppSSO,
+  updateAppSiteAccessToken,
+  updateAppSiteConfig,
+  updateAppSiteStatus,
+} from '@/service/apps'
+import type { App, AppSSO } from '@/types/app'
+import type { UpdateAppSiteCodeResponse } from '@/models/app'
+import { asyncRunSafe } from '@/utils'
+import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
+import type { IAppCardProps } from '@/app/components/app/overview/appCard'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import AppContext from '@/context/app-context'
+
+export type ICardViewProps = {
+  appId: string
+  isInPanel?: boolean
+  className?: string
+}
+
+const CardView: FC<ICardViewProps> = ({ appId, isInPanel, className }) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const appDetail = useAppStore(state => state.appDetail)
+  const setAppDetail = useAppStore(state => state.setAppDetail)
+  const systemFeatures = useContextSelector(AppContext, state => state.systemFeatures)
+
+  const updateAppDetail = async () => {
+    try {
+      const res = await fetchAppDetail({ url: '/apps', id: appId })
+      if (systemFeatures.enable_web_sso_switch_component) {
+        const ssoRes = await fetchAppSSO({ appId })
+        setAppDetail({ ...res, enable_sso: ssoRes.enabled })
+      }
+      else {
+        setAppDetail({ ...res })
+      }
+    }
+    catch (error) { console.error(error) }
+  }
+
+  const handleCallbackResult = (err: Error | null, message?: string) => {
+    const type = err ? 'error' : 'success'
+
+    message ||= (type === 'success' ? 'modifiedSuccessfully' : 'modifiedUnsuccessfully')
+
+    if (type === 'success')
+      updateAppDetail()
+
+    notify({
+      type,
+      message: t(`common.actionMsg.${message}`),
+    })
+  }
+
+  const onChangeSiteStatus = async (value: boolean) => {
+    const [err] = await asyncRunSafe<App>(
+      updateAppSiteStatus({
+        url: `/apps/${appId}/site-enable`,
+        body: { enable_site: value },
+      }) as Promise<App>,
+    )
+
+    handleCallbackResult(err)
+  }
+
+  const onChangeApiStatus = async (value: boolean) => {
+    const [err] = await asyncRunSafe<App>(
+      updateAppSiteStatus({
+        url: `/apps/${appId}/api-enable`,
+        body: { enable_api: value },
+      }) as Promise<App>,
+    )
+
+    handleCallbackResult(err)
+  }
+
+  const onSaveSiteConfig: IAppCardProps['onSaveSiteConfig'] = async (params) => {
+    const [err] = await asyncRunSafe<App>(
+      updateAppSiteConfig({
+        url: `/apps/${appId}/site`,
+        body: params,
+      }) as Promise<App>,
+    )
+    if (!err)
+      localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
+
+    if (systemFeatures.enable_web_sso_switch_component) {
+      const [sso_err] = await asyncRunSafe<AppSSO>(
+        updateAppSSO({ id: appId, enabled: Boolean(params.enable_sso) }) as Promise<AppSSO>,
+      )
+      if (sso_err) {
+        handleCallbackResult(sso_err)
+        return
+      }
+    }
+
+    handleCallbackResult(err)
+  }
+
+  const onGenerateCode = async () => {
+    const [err] = await asyncRunSafe<UpdateAppSiteCodeResponse>(
+      updateAppSiteAccessToken({
+        url: `/apps/${appId}/site/access-token-reset`,
+      }) as Promise<UpdateAppSiteCodeResponse>,
+    )
+
+    handleCallbackResult(err, err ? 'generatedUnsuccessfully' : 'generatedSuccessfully')
+  }
+
+  if (!appDetail)
+    return <Loading />
+
+  return (
+    <div className={className || 'mb-6 grid w-full grid-cols-1 gap-6 xl:grid-cols-2'}>
+      <AppCard
+        appInfo={appDetail}
+        cardType="webapp"
+        isInPanel={isInPanel}
+        onChangeStatus={onChangeSiteStatus}
+        onGenerateCode={onGenerateCode}
+        onSaveSiteConfig={onSaveSiteConfig}
+      />
+      <AppCard
+        cardType="api"
+        appInfo={appDetail}
+        isInPanel={isInPanel}
+        onChangeStatus={onChangeApiStatus}
+      />
+    </div>
+  )
+}
+
+export default CardView
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/chartView.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/chartView.tsx"
new file mode 100644
index 0000000..4afba06
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/chartView.tsx"
@@ -0,0 +1,106 @@
+'use client'
+import React, { useState } from 'react'
+import dayjs from 'dayjs'
+import quarterOfYear from 'dayjs/plugin/quarterOfYear'
+import { useTranslation } from 'react-i18next'
+import type { PeriodParams } from '@/app/components/app/overview/appChart'
+import { AvgResponseTime, AvgSessionInteractions, AvgUserInteractions, ConversationsChart, CostChart, EndUsersChart, MessagesChart, TokenPerSecond, UserSatisfactionRate, WorkflowCostChart, WorkflowDailyTerminalsChart, WorkflowMessagesChart } from '@/app/components/app/overview/appChart'
+import type { Item } from '@/app/components/base/select'
+import { SimpleSelect } from '@/app/components/base/select'
+import { TIME_PERIOD_MAPPING } from '@/app/components/app/log/filter'
+import { useStore as useAppStore } from '@/app/components/app/store'
+
+dayjs.extend(quarterOfYear)
+
+const today = dayjs()
+
+const queryDateFormat = 'YYYY-MM-DD HH:mm'
+
+export type IChartViewProps = {
+  appId: string
+}
+
+export default function ChartView({ appId }: IChartViewProps) {
+  const { t } = useTranslation()
+  const appDetail = useAppStore(state => state.appDetail)
+  const isChatApp = appDetail?.mode !== 'completion' && appDetail?.mode !== 'workflow'
+  const isWorkflow = appDetail?.mode === 'workflow'
+  const [period, setPeriod] = useState<PeriodParams>({ name: t('appLog.filter.period.last7days'), query: { start: today.subtract(7, 'day').startOf('day').format(queryDateFormat), end: today.endOf('day').format(queryDateFormat) } })
+
+  const onSelect = (item: Item) => {
+    if (item.value === -1) {
+      setPeriod({ name: item.name, query: undefined })
+    }
+    else if (item.value === 0) {
+      const startOfToday = today.startOf('day').format(queryDateFormat)
+      const endOfToday = today.endOf('day').format(queryDateFormat)
+      setPeriod({ name: item.name, query: { start: startOfToday, end: endOfToday } })
+    }
+    else {
+      setPeriod({ name: item.name, query: { start: today.subtract(item.value as number, 'day').startOf('day').format(queryDateFormat), end: today.endOf('day').format(queryDateFormat) } })
+    }
+  }
+
+  if (!appDetail)
+    return null
+
+  return (
+    <div>
+      <div className='system-xl-semibold mb-4 mt-8 flex flex-row items-center text-text-primary'>
+        <span className='mr-3'>{t('appOverview.analysis.title')}</span>
+        <SimpleSelect
+          items={Object.entries(TIME_PERIOD_MAPPING).map(([k, v]) => ({ value: k, name: t(`appLog.filter.period.${v.name}`) }))}
+          className='mt-0 !w-40'
+          onSelect={(item) => {
+            const id = item.value
+            const value = TIME_PERIOD_MAPPING[id]?.value ?? '-1'
+            const name = item.name || t('appLog.filter.period.allTime')
+            onSelect({ value, name })
+          }}
+          defaultValue={'2'}
+        />
+      </div>
+      {!isWorkflow && (
+        <div className='mb-6 grid w-full grid-cols-1 gap-6 xl:grid-cols-2'>
+          <ConversationsChart period={period} id={appId} />
+          <EndUsersChart period={period} id={appId} />
+        </div>
+      )}
+      {!isWorkflow && (
+        <div className='mb-6 grid w-full grid-cols-1 gap-6 xl:grid-cols-2'>
+          {isChatApp
+            ? (
+              <AvgSessionInteractions period={period} id={appId} />
+            )
+            : (
+              <AvgResponseTime period={period} id={appId} />
+            )}
+          <TokenPerSecond period={period} id={appId} />
+        </div>
+      )}
+      {!isWorkflow && (
+        <div className='mb-6 grid w-full grid-cols-1 gap-6 xl:grid-cols-2'>
+          <UserSatisfactionRate period={period} id={appId} />
+          <CostChart period={period} id={appId} />
+        </div>
+      )}
+      {!isWorkflow && isChatApp && (
+        <div className='mb-6 grid w-full grid-cols-1 gap-6 xl:grid-cols-2'>
+          <MessagesChart period={period} id={appId} />
+        </div>
+      )}
+      {isWorkflow && (
+        <div className='mb-6 grid w-full grid-cols-1 gap-6 xl:grid-cols-2'>
+          <WorkflowMessagesChart period={period} id={appId} />
+          <WorkflowDailyTerminalsChart period={period} id={appId} />
+        </div>
+      )}
+      {isWorkflow && (
+        <div className='mb-6 grid w-full grid-cols-1 gap-6 xl:grid-cols-2'>
+          <WorkflowCostChart period={period} id={appId} />
+          <AvgUserInteractions period={period} id={appId} />
+        </div>
+      )}
+    </div>
+  )
+}
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/page.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/page.tsx"
new file mode 100644
index 0000000..0f1bb7e
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/page.tsx"
@@ -0,0 +1,28 @@
+import React from 'react'
+import ChartView from './chartView'
+import CardView from './cardView'
+import TracingPanel from './tracing/panel'
+import ApikeyInfoPanel from '@/app/components/app/overview/apikey-info-panel'
+
+export type IDevelopProps = {
+  params: Promise<{ appId: string }>
+}
+
+const Overview = async (props: IDevelopProps) => {
+  const params = await props.params
+
+  const {
+    appId,
+  } = params
+
+  return (
+    <div className="h-full overflow-scroll bg-chatbot-bg px-4 py-6 sm:px-12">
+      <ApikeyInfoPanel />
+      <TracingPanel />
+      <CardView appId={appId} />
+      <ChartView appId={appId} />
+    </div>
+  )
+}
+
+export default Overview
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/config-button.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/config-button.tsx"
new file mode 100644
index 0000000..3d05575
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/config-button.tsx"
@@ -0,0 +1,71 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useRef, useState } from 'react'
+import {
+  RiEqualizer2Line,
+} from '@remixicon/react'
+import type { PopupProps } from './config-popup'
+import ConfigPopup from './config-popup'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+
+type Props = {
+  readOnly: boolean
+  className?: string
+  hasConfigured: boolean
+  controlShowPopup?: number
+} & PopupProps
+
+const ConfigBtn: FC<Props> = ({
+  className,
+  hasConfigured,
+  controlShowPopup,
+  ...popupProps
+}) => {
+  const [open, doSetOpen] = useState(false)
+  const openRef = useRef(open)
+  const setOpen = useCallback((v: boolean) => {
+    doSetOpen(v)
+    openRef.current = v
+  }, [doSetOpen])
+
+  const handleTrigger = useCallback(() => {
+    setOpen(!openRef.current)
+  }, [setOpen])
+
+  useEffect(() => {
+    if (controlShowPopup)
+      // setOpen(!openRef.current)
+      setOpen(true)
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [controlShowPopup])
+
+  if (popupProps.readOnly && !hasConfigured)
+    return null
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: 12,
+        crossAxis: hasConfigured ? 8 : 49,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={handleTrigger}>
+        <div className={cn(className, 'rounded-md p-1')}>
+          <RiEqualizer2Line className='h-4 w-4 text-text-tertiary' />
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[11]'>
+        <ConfigPopup {...popupProps} />
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default React.memo(ConfigBtn)
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/config-popup.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/config-popup.tsx"
new file mode 100644
index 0000000..0efc508
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/config-popup.tsx"
@@ -0,0 +1,259 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import TracingIcon from './tracing-icon'
+import ProviderPanel from './provider-panel'
+import type { LangFuseConfig, LangSmithConfig, OpikConfig, WeaveConfig } from './type'
+import { TracingProvider } from './type'
+import ProviderConfigModal from './provider-config-modal'
+import Indicator from '@/app/components/header/indicator'
+import Switch from '@/app/components/base/switch'
+import Tooltip from '@/app/components/base/tooltip'
+import Divider from '@/app/components/base/divider'
+import cn from '@/utils/classnames'
+
+const I18N_PREFIX = 'app.tracing'
+
+export type PopupProps = {
+  appId: string
+  readOnly: boolean
+  enabled: boolean
+  onStatusChange: (enabled: boolean) => void
+  chosenProvider: TracingProvider | null
+  onChooseProvider: (provider: TracingProvider) => void
+  langSmithConfig: LangSmithConfig | null
+  langFuseConfig: LangFuseConfig | null
+  opikConfig: OpikConfig | null
+  weaveConfig: WeaveConfig | null
+  onConfigUpdated: (provider: TracingProvider, payload: LangSmithConfig | LangFuseConfig | OpikConfig | WeaveConfig) => void
+  onConfigRemoved: (provider: TracingProvider) => void
+}
+
+const ConfigPopup: FC<PopupProps> = ({
+  appId,
+  readOnly,
+  enabled,
+  onStatusChange,
+  chosenProvider,
+  onChooseProvider,
+  langSmithConfig,
+  langFuseConfig,
+  opikConfig,
+  weaveConfig,
+  onConfigUpdated,
+  onConfigRemoved,
+}) => {
+  const { t } = useTranslation()
+
+  const [currentProvider, setCurrentProvider] = useState<TracingProvider | null>(TracingProvider.langfuse)
+  const [isShowConfigModal, {
+    setTrue: showConfigModal,
+    setFalse: hideConfigModal,
+  }] = useBoolean(false)
+  const handleOnConfig = useCallback((provider: TracingProvider) => {
+    return () => {
+      setCurrentProvider(provider)
+      showConfigModal()
+    }
+  }, [showConfigModal])
+
+  const handleOnChoose = useCallback((provider: TracingProvider) => {
+    return () => {
+      onChooseProvider(provider)
+    }
+  }, [onChooseProvider])
+
+  const handleConfigUpdated = useCallback((payload: LangSmithConfig | LangFuseConfig | OpikConfig | WeaveConfig) => {
+    onConfigUpdated(currentProvider!, payload)
+    hideConfigModal()
+  }, [currentProvider, hideConfigModal, onConfigUpdated])
+
+  const handleConfigRemoved = useCallback(() => {
+    onConfigRemoved(currentProvider!)
+    hideConfigModal()
+  }, [currentProvider, hideConfigModal, onConfigRemoved])
+
+  const providerAllConfigured = langSmithConfig && langFuseConfig && opikConfig && weaveConfig
+  const providerAllNotConfigured = !langSmithConfig && !langFuseConfig && !opikConfig && !weaveConfig
+
+  const switchContent = (
+    <Switch
+      className='ml-3'
+      defaultValue={enabled}
+      onChange={onStatusChange}
+      disabled={providerAllNotConfigured}
+    />
+  )
+  const langSmithPanel = (
+    <ProviderPanel
+      type={TracingProvider.langSmith}
+      readOnly={readOnly}
+      config={langSmithConfig}
+      hasConfigured={!!langSmithConfig}
+      onConfig={handleOnConfig(TracingProvider.langSmith)}
+      isChosen={chosenProvider === TracingProvider.langSmith}
+      onChoose={handleOnChoose(TracingProvider.langSmith)}
+      key="langSmith-provider-panel"
+    />
+  )
+
+  const langfusePanel = (
+    <ProviderPanel
+      type={TracingProvider.langfuse}
+      readOnly={readOnly}
+      config={langFuseConfig}
+      hasConfigured={!!langFuseConfig}
+      onConfig={handleOnConfig(TracingProvider.langfuse)}
+      isChosen={chosenProvider === TracingProvider.langfuse}
+      onChoose={handleOnChoose(TracingProvider.langfuse)}
+      key="langfuse-provider-panel"
+    />
+  )
+
+  const opikPanel = (
+    <ProviderPanel
+      type={TracingProvider.opik}
+      readOnly={readOnly}
+      config={opikConfig}
+      hasConfigured={!!opikConfig}
+      onConfig={handleOnConfig(TracingProvider.opik)}
+      isChosen={chosenProvider === TracingProvider.opik}
+      onChoose={handleOnChoose(TracingProvider.opik)}
+      key="opik-provider-panel"
+    />
+  )
+
+  const weavePanel = (
+    <ProviderPanel
+      type={TracingProvider.weave}
+      readOnly={readOnly}
+      config={weaveConfig}
+      hasConfigured={!!weaveConfig}
+      onConfig={handleOnConfig(TracingProvider.weave)}
+      isChosen={chosenProvider === TracingProvider.weave}
+      onChoose={handleOnChoose(TracingProvider.weave)}
+      key="weave-provider-panel"
+    />
+  )
+  const configuredProviderPanel = () => {
+    const configuredPanels: JSX.Element[] = []
+
+    if (langFuseConfig)
+      configuredPanels.push(langfusePanel)
+
+    if (langSmithConfig)
+      configuredPanels.push(langSmithPanel)
+
+    if (opikConfig)
+      configuredPanels.push(opikPanel)
+
+    if (weaveConfig)
+      configuredPanels.push(weavePanel)
+
+    return configuredPanels
+  }
+
+  const moreProviderPanel = () => {
+    const notConfiguredPanels: JSX.Element[] = []
+
+    if (!langFuseConfig)
+      notConfiguredPanels.push(langfusePanel)
+
+    if (!langSmithConfig)
+      notConfiguredPanels.push(langSmithPanel)
+
+    if (!opikConfig)
+      notConfiguredPanels.push(opikPanel)
+
+    if (!weaveConfig)
+      notConfiguredPanels.push(weavePanel)
+
+    return notConfiguredPanels
+  }
+
+  const configuredProviderConfig = () => {
+    if (currentProvider === TracingProvider.langSmith)
+      return langSmithConfig
+    if (currentProvider === TracingProvider.langfuse)
+      return langFuseConfig
+    if (currentProvider === TracingProvider.opik)
+      return opikConfig
+    return weaveConfig
+  }
+
+  return (
+    <div className='w-[420px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg p-4 shadow-xl'>
+      <div className='flex items-center justify-between'>
+        <div className='flex items-center'>
+          <TracingIcon size='md' className='mr-2' />
+          <div className='title-2xl-semi-bold text-text-primary'>{t(`${I18N_PREFIX}.tracing`)}</div>
+        </div>
+        <div className='flex items-center'>
+          <Indicator color={enabled ? 'green' : 'gray'} />
+          <div className={cn('system-xs-semibold-uppercase ml-1 text-text-tertiary', enabled && 'text-util-colors-green-green-600')}>
+            {t(`${I18N_PREFIX}.${enabled ? 'enabled' : 'disabled'}`)}
+          </div>
+          {!readOnly && (
+            <>
+              {providerAllNotConfigured
+                ? (
+                  <Tooltip
+                    popupContent={t(`${I18N_PREFIX}.disabledTip`)}
+                  >
+                    {switchContent}
+                  </Tooltip>
+                )
+                : switchContent}
+            </>
+          )}
+        </div>
+      </div>
+
+      <div className='system-xs-regular mt-2 text-text-tertiary'>
+        {t(`${I18N_PREFIX}.tracingDescription`)}
+      </div>
+      <Divider className='my-3' />
+      <div className='relative'>
+        {(providerAllConfigured || providerAllNotConfigured)
+          ? (
+            <>
+              <div className='system-xs-medium-uppercase text-text-tertiary'>{t(`${I18N_PREFIX}.configProviderTitle.${providerAllConfigured ? 'configured' : 'notConfigured'}`)}</div>
+              <div className='mt-2 space-y-2'>
+                {langfusePanel}
+                {langSmithPanel}
+                {opikPanel}
+                {weavePanel}
+              </div>
+            </>
+          )
+          : (
+            <>
+              <div className='system-xs-medium-uppercase text-text-tertiary'>{t(`${I18N_PREFIX}.configProviderTitle.configured`)}</div>
+              <div className='mt-2 space-y-2'>
+                {configuredProviderPanel()}
+              </div>
+              <div className='system-xs-medium-uppercase mt-3 text-text-tertiary'>{t(`${I18N_PREFIX}.configProviderTitle.moreProvider`)}</div>
+              <div className='mt-2 space-y-2'>
+                {moreProviderPanel()}
+              </div>
+            </>
+          )}
+
+      </div>
+      {isShowConfigModal && (
+        <ProviderConfigModal
+          appId={appId}
+          type={currentProvider!}
+          payload={configuredProviderConfig()}
+          onCancel={hideConfigModal}
+          onSaved={handleConfigUpdated}
+          onChosen={onChooseProvider}
+          onRemoved={handleConfigRemoved}
+        />
+      )}
+    </div>
+  )
+}
+export default React.memo(ConfigPopup)
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/config.ts" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/config.ts"
new file mode 100644
index 0000000..5d3c407
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/config.ts"
@@ -0,0 +1,8 @@
+import { TracingProvider } from './type'
+
+export const docURL = {
+  [TracingProvider.langSmith]: 'https://docs.smith.langchain.com/',
+  [TracingProvider.langfuse]: 'https://docs.langfuse.com',
+  [TracingProvider.opik]: 'https://www.comet.com/docs/opik/tracing/integrations/dify#setup-instructions',
+  [TracingProvider.weave]: 'https://weave-docs.wandb.ai/',
+}
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/field.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/field.tsx"
new file mode 100644
index 0000000..eecd356
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/field.tsx"
@@ -0,0 +1,41 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+import Input from '@/app/components/base/input'
+
+type Props = {
+  className?: string
+  label: string
+  labelClassName?: string
+  value: string | number
+  onChange: (value: string) => void
+  isRequired?: boolean
+  placeholder?: string
+}
+
+const Field: FC<Props> = ({
+  className,
+  label,
+  labelClassName,
+  value,
+  onChange,
+  isRequired = false,
+  placeholder = '',
+}) => {
+  return (
+    <div className={cn(className)}>
+      <div className='flex py-[7px]'>
+        <div className={cn(labelClassName, 'flex h-[18px] items-center text-[13px] font-medium text-text-primary')}>{label} </div>
+        {isRequired && <span className='ml-0.5 text-xs font-semibold text-[#D92D20]'>*</span>}
+      </div>
+      <Input
+        value={value}
+        onChange={e => onChange(e.target.value)}
+        className='h-9'
+        placeholder={placeholder}
+      />
+    </div>
+  )
+}
+export default React.memo(Field)
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/panel.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/panel.tsx"
new file mode 100644
index 0000000..8575117
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/panel.tsx"
@@ -0,0 +1,238 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
+import {
+  RiArrowDownDoubleLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { usePathname } from 'next/navigation'
+import { useBoolean } from 'ahooks'
+import type { LangFuseConfig, LangSmithConfig, OpikConfig, WeaveConfig } from './type'
+import { TracingProvider } from './type'
+import TracingIcon from './tracing-icon'
+import ConfigButton from './config-button'
+import cn from '@/utils/classnames'
+import { LangfuseIcon, LangsmithIcon, OpikIcon, WeaveIcon } from '@/app/components/base/icons/src/public/tracing'
+import Indicator from '@/app/components/header/indicator'
+import { fetchTracingConfig as doFetchTracingConfig, fetchTracingStatus, updateTracingStatus } from '@/service/apps'
+import type { TracingStatus } from '@/models/app'
+import Toast from '@/app/components/base/toast'
+import { useAppContext } from '@/context/app-context'
+import Loading from '@/app/components/base/loading'
+import Divider from '@/app/components/base/divider'
+
+const I18N_PREFIX = 'app.tracing'
+
+const Title = ({
+  className,
+}: {
+  className?: string
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className={cn('system-xl-semibold flex items-center text-text-primary', className)}>
+      {t('common.appMenus.overview')}
+    </div>
+  )
+}
+const Panel: FC = () => {
+  const { t } = useTranslation()
+  const pathname = usePathname()
+  const matched = pathname.match(/\/app\/([^/]+)/)
+  const appId = (matched?.length && matched[1]) ? matched[1] : ''
+  const { isCurrentWorkspaceEditor } = useAppContext()
+  const readOnly = !isCurrentWorkspaceEditor
+
+  const [isLoaded, {
+    setTrue: setLoaded,
+  }] = useBoolean(false)
+
+  const [tracingStatus, setTracingStatus] = useState<TracingStatus | null>(null)
+  const enabled = tracingStatus?.enabled || false
+  const handleTracingStatusChange = async (tracingStatus: TracingStatus, noToast?: boolean) => {
+    await updateTracingStatus({ appId, body: tracingStatus })
+    setTracingStatus(tracingStatus)
+    if (!noToast) {
+      Toast.notify({
+        type: 'success',
+        message: t('common.api.success'),
+      })
+    }
+  }
+
+  const handleTracingEnabledChange = (enabled: boolean) => {
+    handleTracingStatusChange({
+      tracing_provider: tracingStatus?.tracing_provider || null,
+      enabled,
+    })
+  }
+  const handleChooseProvider = (provider: TracingProvider) => {
+    handleTracingStatusChange({
+      tracing_provider: provider,
+      enabled: true,
+    })
+  }
+  const inUseTracingProvider: TracingProvider | null = tracingStatus?.tracing_provider || null
+
+  const InUseProviderIcon
+    = inUseTracingProvider === TracingProvider.langSmith
+      ? LangsmithIcon
+      : inUseTracingProvider === TracingProvider.langfuse
+        ? LangfuseIcon
+        : inUseTracingProvider === TracingProvider.opik
+          ? OpikIcon
+          : inUseTracingProvider === TracingProvider.weave
+            ? WeaveIcon
+            : LangsmithIcon
+
+  const [langSmithConfig, setLangSmithConfig] = useState<LangSmithConfig | null>(null)
+  const [langFuseConfig, setLangFuseConfig] = useState<LangFuseConfig | null>(null)
+  const [opikConfig, setOpikConfig] = useState<OpikConfig | null>(null)
+  const [weaveConfig, setWeaveConfig] = useState<WeaveConfig | null>(null)
+  const hasConfiguredTracing = !!(langSmithConfig || langFuseConfig || opikConfig || weaveConfig)
+
+  const fetchTracingConfig = async () => {
+    const { tracing_config: langSmithConfig, has_not_configured: langSmithHasNotConfig } = await doFetchTracingConfig({ appId, provider: TracingProvider.langSmith })
+    if (!langSmithHasNotConfig)
+      setLangSmithConfig(langSmithConfig as LangSmithConfig)
+    const { tracing_config: langFuseConfig, has_not_configured: langFuseHasNotConfig } = await doFetchTracingConfig({ appId, provider: TracingProvider.langfuse })
+    if (!langFuseHasNotConfig)
+      setLangFuseConfig(langFuseConfig as LangFuseConfig)
+    const { tracing_config: opikConfig, has_not_configured: OpikHasNotConfig } = await doFetchTracingConfig({ appId, provider: TracingProvider.opik })
+    if (!OpikHasNotConfig)
+      setOpikConfig(opikConfig as OpikConfig)
+    const { tracing_config: weaveConfig, has_not_configured: weaveHasNotConfig } = await doFetchTracingConfig({ appId, provider: TracingProvider.weave })
+    if (!weaveHasNotConfig)
+      setWeaveConfig(weaveConfig as WeaveConfig)
+  }
+
+  const handleTracingConfigUpdated = async (provider: TracingProvider) => {
+    // call api to hide secret key value
+    const { tracing_config } = await doFetchTracingConfig({ appId, provider })
+    if (provider === TracingProvider.langSmith)
+      setLangSmithConfig(tracing_config as LangSmithConfig)
+    else if (provider === TracingProvider.langfuse)
+      setLangFuseConfig(tracing_config as LangFuseConfig)
+    else if (provider === TracingProvider.opik)
+      setOpikConfig(tracing_config as OpikConfig)
+    else if (provider === TracingProvider.weave)
+      setWeaveConfig(tracing_config as WeaveConfig)
+  }
+
+  const handleTracingConfigRemoved = (provider: TracingProvider) => {
+    if (provider === TracingProvider.langSmith)
+      setLangSmithConfig(null)
+    else if (provider === TracingProvider.langfuse)
+      setLangFuseConfig(null)
+    else if (provider === TracingProvider.opik)
+      setOpikConfig(null)
+    else if (provider === TracingProvider.weave)
+      setWeaveConfig(null)
+    if (provider === inUseTracingProvider) {
+      handleTracingStatusChange({
+        enabled: false,
+        tracing_provider: null,
+      }, true)
+    }
+  }
+
+  useEffect(() => {
+    (async () => {
+      const tracingStatus = await fetchTracingStatus({ appId })
+      setTracingStatus(tracingStatus)
+      await fetchTracingConfig()
+      setLoaded()
+    })()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  const [controlShowPopup, setControlShowPopup] = useState<number>(0)
+  const showPopup = useCallback(() => {
+    setControlShowPopup(Date.now())
+  }, [setControlShowPopup])
+  if (!isLoaded) {
+    return (
+      <div className='mb-3 flex items-center justify-between'>
+        <Title className='h-[41px]' />
+        <div className='w-[200px]'>
+          <Loading />
+        </div>
+      </div>
+    )
+  }
+
+  return (
+    <div className={cn('mb-3 flex items-center justify-between')}>
+      <Title className='h-[41px]' />
+      <div
+        className={cn(
+          'flex cursor-pointer items-center rounded-xl border-l-[0.5px] border-t border-effects-highlight bg-background-default-dodge p-2 shadow-xs hover:border-effects-highlight-lightmode-off hover:bg-background-default-lighter',
+          controlShowPopup && 'border-effects-highlight-lightmode-off bg-background-default-lighter',
+        )}
+        onClick={showPopup}
+      >
+        {!inUseTracingProvider && (
+          <>
+            <TracingIcon size='md' />
+            <div className='system-sm-semibold mx-2 text-text-secondary'>{t(`${I18N_PREFIX}.title`)}</div>
+            <div className='flex items-center' onClick={e => e.stopPropagation()}>
+              <ConfigButton
+                appId={appId}
+                readOnly={readOnly}
+                hasConfigured={false}
+                enabled={enabled}
+                onStatusChange={handleTracingEnabledChange}
+                chosenProvider={inUseTracingProvider}
+                onChooseProvider={handleChooseProvider}
+                langSmithConfig={langSmithConfig}
+                langFuseConfig={langFuseConfig}
+                opikConfig={opikConfig}
+                weaveConfig={weaveConfig}
+                onConfigUpdated={handleTracingConfigUpdated}
+                onConfigRemoved={handleTracingConfigRemoved}
+                controlShowPopup={controlShowPopup}
+              />
+            </div>
+            <Divider type='vertical' className='h-3.5' />
+            <div className='rounded-md p-1'>
+              <RiArrowDownDoubleLine className='h-4 w-4 text-text-tertiary' />
+            </div>
+          </>
+        )}
+        {hasConfiguredTracing && (
+          <>
+            <div className='ml-4 mr-1 flex items-center'>
+              <Indicator color={enabled ? 'green' : 'gray'} />
+              <div className='system-xs-semibold-uppercase ml-1.5 text-text-tertiary'>
+                {t(`${I18N_PREFIX}.${enabled ? 'enabled' : 'disabled'}`)}
+              </div>
+            </div>
+            {InUseProviderIcon && <InUseProviderIcon className='ml-1 h-4' />}
+            <Divider type='vertical' className='h-3.5' />
+            <div className='flex items-center' onClick={e => e.stopPropagation()}>
+              <ConfigButton
+                appId={appId}
+                readOnly={readOnly}
+                hasConfigured
+                className='ml-2'
+                enabled={enabled}
+                onStatusChange={handleTracingEnabledChange}
+                chosenProvider={inUseTracingProvider}
+                onChooseProvider={handleChooseProvider}
+                langSmithConfig={langSmithConfig}
+                langFuseConfig={langFuseConfig}
+                opikConfig={opikConfig}
+                weaveConfig={weaveConfig}
+                onConfigUpdated={handleTracingConfigUpdated}
+                onConfigRemoved={handleTracingConfigRemoved}
+                controlShowPopup={controlShowPopup}
+              />
+            </div>
+          </>
+        )}
+      </div >
+    </div >
+  )
+}
+export default React.memo(Panel)
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/provider-config-modal.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/provider-config-modal.tsx"
new file mode 100644
index 0000000..c0b52a9
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/provider-config-modal.tsx"
@@ -0,0 +1,390 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import Field from './field'
+import type { LangFuseConfig, LangSmithConfig, OpikConfig, WeaveConfig } from './type'
+import { TracingProvider } from './type'
+import { docURL } from './config'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+} from '@/app/components/base/portal-to-follow-elem'
+import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security'
+import Button from '@/app/components/base/button'
+import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general'
+import Confirm from '@/app/components/base/confirm'
+import { addTracingConfig, removeTracingConfig, updateTracingConfig } from '@/service/apps'
+import Toast from '@/app/components/base/toast'
+import Divider from '@/app/components/base/divider'
+
+type Props = {
+  appId: string
+  type: TracingProvider
+  payload?: LangSmithConfig | LangFuseConfig | OpikConfig | WeaveConfig | null
+  onRemoved: () => void
+  onCancel: () => void
+  onSaved: (payload: LangSmithConfig | LangFuseConfig | OpikConfig | WeaveConfig) => void
+  onChosen: (provider: TracingProvider) => void
+}
+
+const I18N_PREFIX = 'app.tracing.configProvider'
+
+const langSmithConfigTemplate = {
+  api_key: '',
+  project: '',
+  endpoint: '',
+}
+
+const langFuseConfigTemplate = {
+  public_key: '',
+  secret_key: '',
+  host: '',
+}
+
+const opikConfigTemplate = {
+  api_key: '',
+  project: '',
+  url: '',
+  workspace: '',
+}
+
+const weaveConfigTemplate = {
+  api_key: '',
+  entity: '',
+  project: '',
+  endpoint: '',
+}
+
+const ProviderConfigModal: FC<Props> = ({
+  appId,
+  type,
+  payload,
+  onRemoved,
+  onCancel,
+  onSaved,
+  onChosen,
+}) => {
+  const { t } = useTranslation()
+  const isEdit = !!payload
+  const isAdd = !isEdit
+  const [isSaving, setIsSaving] = useState(false)
+  const [config, setConfig] = useState<LangSmithConfig | LangFuseConfig | OpikConfig | WeaveConfig>((() => {
+    if (isEdit)
+      return payload
+
+    if (type === TracingProvider.langSmith)
+      return langSmithConfigTemplate
+
+    else if (type === TracingProvider.langfuse)
+      return langFuseConfigTemplate
+
+    else if (type === TracingProvider.opik)
+      return opikConfigTemplate
+
+    return weaveConfigTemplate
+  })())
+  const [isShowRemoveConfirm, {
+    setTrue: showRemoveConfirm,
+    setFalse: hideRemoveConfirm,
+  }] = useBoolean(false)
+
+  const handleRemove = useCallback(async () => {
+    await removeTracingConfig({
+      appId,
+      provider: type,
+    })
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.remove'),
+    })
+    onRemoved()
+    hideRemoveConfirm()
+  }, [hideRemoveConfirm, appId, type, t, onRemoved])
+
+  const handleConfigChange = useCallback((key: string) => {
+    return (value: string) => {
+      setConfig({
+        ...config,
+        [key]: value,
+      })
+    }
+  }, [config])
+
+  const checkValid = useCallback(() => {
+    let errorMessage = ''
+    if (type === TracingProvider.langSmith) {
+      const postData = config as LangSmithConfig
+      if (!postData.api_key)
+        errorMessage = t('common.errorMsg.fieldRequired', { field: 'API Key' })
+      if (!errorMessage && !postData.project)
+        errorMessage = t('common.errorMsg.fieldRequired', { field: t(`${I18N_PREFIX}.project`) })
+    }
+
+    if (type === TracingProvider.langfuse) {
+      const postData = config as LangFuseConfig
+      if (!errorMessage && !postData.secret_key)
+        errorMessage = t('common.errorMsg.fieldRequired', { field: t(`${I18N_PREFIX}.secretKey`) })
+      if (!errorMessage && !postData.public_key)
+        errorMessage = t('common.errorMsg.fieldRequired', { field: t(`${I18N_PREFIX}.publicKey`) })
+      if (!errorMessage && !postData.host)
+        errorMessage = t('common.errorMsg.fieldRequired', { field: 'Host' })
+    }
+
+    if (type === TracingProvider.opik) {
+      // todo: check field validity
+      // const postData = config as OpikConfig
+    }
+
+    if (type === TracingProvider.weave) {
+      const postData = config as WeaveConfig
+      if (!errorMessage && !postData.api_key)
+        errorMessage = t('common.errorMsg.fieldRequired', { field: 'API Key' })
+      if (!errorMessage && !postData.project)
+        errorMessage = t('common.errorMsg.fieldRequired', { field: t(`${I18N_PREFIX}.project`) })
+    }
+
+    return errorMessage
+  }, [config, t, type])
+  const handleSave = useCallback(async () => {
+    if (isSaving)
+      return
+    const errorMessage = checkValid()
+    if (errorMessage) {
+      Toast.notify({
+        type: 'error',
+        message: errorMessage,
+      })
+      return
+    }
+    const action = isEdit ? updateTracingConfig : addTracingConfig
+    try {
+      await action({
+        appId,
+        body: {
+          tracing_provider: type,
+          tracing_config: config,
+        },
+      })
+      Toast.notify({
+        type: 'success',
+        message: t('common.api.success'),
+      })
+      onSaved(config)
+      if (isAdd)
+        onChosen(type)
+    }
+    finally {
+      setIsSaving(false)
+    }
+  }, [appId, checkValid, config, isAdd, isEdit, isSaving, onChosen, onSaved, t, type])
+
+  return (
+    <>
+      {!isShowRemoveConfirm
+        ? (
+          <PortalToFollowElem open>
+            <PortalToFollowElemContent className='z-[60] h-full w-full'>
+              <div className='fixed inset-0 flex items-center justify-center bg-background-overlay'>
+                <div className='mx-2 max-h-[calc(100vh-120px)] w-[640px] overflow-y-auto rounded-2xl bg-components-panel-bg shadow-xl'>
+                  <div className='px-8 pt-8'>
+                    <div className='mb-4 flex items-center justify-between'>
+                      <div className='title-2xl-semi-bold text-text-primary'>{t(`${I18N_PREFIX}.title`)}{t(`app.tracing.${type}.title`)}</div>
+                    </div>
+
+                    <div className='space-y-4'>
+                      {type === TracingProvider.weave && (
+                        <>
+                          <Field
+                            label='API Key'
+                            labelClassName='!text-sm'
+                            isRequired
+                            value={(config as WeaveConfig).api_key}
+                            onChange={handleConfigChange('api_key')}
+                            placeholder={t(`${I18N_PREFIX}.placeholder`, { key: 'API Key' })!}
+                          />
+                          <Field
+                            label={t(`${I18N_PREFIX}.project`)!}
+                            labelClassName='!text-sm'
+                            isRequired
+                            value={(config as WeaveConfig).project}
+                            onChange={handleConfigChange('project')}
+                            placeholder={t(`${I18N_PREFIX}.placeholder`, { key: t(`${I18N_PREFIX}.project`) })!}
+                          />
+                          <Field
+                            label='Entity'
+                            labelClassName='!text-sm'
+                            value={(config as WeaveConfig).entity}
+                            onChange={handleConfigChange('entity')}
+                            placeholder={t(`${I18N_PREFIX}.placeholder`, { key: 'Entity' })!}
+                          />
+                          <Field
+                            label='Endpoint'
+                            labelClassName='!text-sm'
+                            value={(config as WeaveConfig).endpoint}
+                            onChange={handleConfigChange('endpoint')}
+                            placeholder={'https://trace.wandb.ai/'}
+                          />
+                        </>
+                      )}
+                      {type === TracingProvider.langSmith && (
+                        <>
+                          <Field
+                            label='API Key'
+                            labelClassName='!text-sm'
+                            isRequired
+                            value={(config as LangSmithConfig).api_key}
+                            onChange={handleConfigChange('api_key')}
+                            placeholder={t(`${I18N_PREFIX}.placeholder`, { key: 'API Key' })!}
+                          />
+                          <Field
+                            label={t(`${I18N_PREFIX}.project`)!}
+                            labelClassName='!text-sm'
+                            isRequired
+                            value={(config as LangSmithConfig).project}
+                            onChange={handleConfigChange('project')}
+                            placeholder={t(`${I18N_PREFIX}.placeholder`, { key: t(`${I18N_PREFIX}.project`) })!}
+                          />
+                          <Field
+                            label='Endpoint'
+                            labelClassName='!text-sm'
+                            value={(config as LangSmithConfig).endpoint}
+                            onChange={handleConfigChange('endpoint')}
+                            placeholder={'https://api.smith.langchain.com'}
+                          />
+                        </>
+                      )}
+                      {type === TracingProvider.langfuse && (
+                        <>
+                          <Field
+                            label={t(`${I18N_PREFIX}.secretKey`)!}
+                            labelClassName='!text-sm'
+                            value={(config as LangFuseConfig).secret_key}
+                            isRequired
+                            onChange={handleConfigChange('secret_key')}
+                            placeholder={t(`${I18N_PREFIX}.placeholder`, { key: t(`${I18N_PREFIX}.secretKey`) })!}
+                          />
+                          <Field
+                            label={t(`${I18N_PREFIX}.publicKey`)!}
+                            labelClassName='!text-sm'
+                            isRequired
+                            value={(config as LangFuseConfig).public_key}
+                            onChange={handleConfigChange('public_key')}
+                            placeholder={t(`${I18N_PREFIX}.placeholder`, { key: t(`${I18N_PREFIX}.publicKey`) })!}
+                          />
+                          <Field
+                            label='Host'
+                            labelClassName='!text-sm'
+                            isRequired
+                            value={(config as LangFuseConfig).host}
+                            onChange={handleConfigChange('host')}
+                            placeholder='https://cloud.langfuse.com'
+                          />
+                        </>
+                      )}
+                      {type === TracingProvider.opik && (
+                        <>
+                          <Field
+                            label='API Key'
+                            labelClassName='!text-sm'
+                            value={(config as OpikConfig).api_key}
+                            onChange={handleConfigChange('api_key')}
+                            placeholder={t(`${I18N_PREFIX}.placeholder`, { key: 'API Key' })!}
+                          />
+                          <Field
+                            label={t(`${I18N_PREFIX}.project`)!}
+                            labelClassName='!text-sm'
+                            value={(config as OpikConfig).project}
+                            onChange={handleConfigChange('project')}
+                            placeholder={t(`${I18N_PREFIX}.placeholder`, { key: t(`${I18N_PREFIX}.project`) })!}
+                          />
+                          <Field
+                            label='Workspace'
+                            labelClassName='!text-sm'
+                            value={(config as OpikConfig).workspace}
+                            onChange={handleConfigChange('workspace')}
+                            placeholder={'default'}
+                          />
+                          <Field
+                            label='Url'
+                            labelClassName='!text-sm'
+                            value={(config as OpikConfig).url}
+                            onChange={handleConfigChange('url')}
+                            placeholder={'https://www.comet.com/opik/api/'}
+                          />
+                        </>
+                      )}
+                    </div>
+                    <div className='my-8 flex h-8 items-center justify-between'>
+                      <a
+                        className='flex items-center space-x-1 text-xs font-normal leading-[18px] text-[#155EEF]'
+                        target='_blank'
+                        href={docURL[type]}
+                      >
+                        <span>{t(`${I18N_PREFIX}.viewDocsLink`, { key: t(`app.tracing.${type}.title`) })}</span>
+                        <LinkExternal02 className='h-3 w-3' />
+                      </a>
+                      <div className='flex items-center'>
+                        {isEdit && (
+                          <>
+                            <Button
+                              className='h-9 text-sm font-medium text-text-secondary'
+                              onClick={showRemoveConfirm}
+                            >
+                              <span className='text-[#D92D20]'>{t('common.operation.remove')}</span>
+                            </Button>
+                            <Divider className='mx-3 h-[18px]' />
+                          </>
+                        )}
+                        <Button
+                          className='mr-2 h-9 text-sm font-medium text-text-secondary'
+                          onClick={onCancel}
+                        >
+                          {t('common.operation.cancel')}
+                        </Button>
+                        <Button
+                          className='h-9 text-sm font-medium'
+                          variant='primary'
+                          onClick={handleSave}
+                          loading={isSaving}
+                        >
+                          {t(`common.operation.${isAdd ? 'saveAndEnable' : 'save'}`)}
+                        </Button>
+                      </div>
+
+                    </div>
+                  </div>
+                  <div className='border-t-[0.5px] border-divider-regular'>
+                    <div className='flex items-center justify-center bg-background-section-burn py-3 text-xs text-text-tertiary'>
+                      <Lock01 className='mr-1 h-3 w-3 text-text-tertiary' />
+                      {t('common.modelProvider.encrypted.front')}
+                      <a
+                        className='mx-1 text-primary-600'
+                        target='_blank' rel='noopener noreferrer'
+                        href='https://pycryptodome.readthedocs.io/en/latest/src/cipher/oaep.html'
+                      >
+                        PKCS1_OAEP
+                      </a>
+                      {t('common.modelProvider.encrypted.back')}
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </PortalToFollowElemContent>
+          </PortalToFollowElem>
+        )
+        : (
+          <Confirm
+            isShow
+            type='warning'
+            title={t(`${I18N_PREFIX}.removeConfirmTitle`, { key: t(`app.tracing.${type}.title`) })!}
+            content={t(`${I18N_PREFIX}.removeConfirmContent`)}
+            onConfirm={handleRemove}
+            onCancel={hideRemoveConfirm}
+          />
+        )}
+    </>
+  )
+}
+export default React.memo(ProviderConfigModal)
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/provider-panel.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/provider-panel.tsx"
new file mode 100644
index 0000000..bdccc50
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/provider-panel.tsx"
@@ -0,0 +1,104 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import {
+  RiEqualizer2Line,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { TracingProvider } from './type'
+import cn from '@/utils/classnames'
+import { LangfuseIconBig, LangsmithIconBig, OpikIconBig, WeaveIconBig } from '@/app/components/base/icons/src/public/tracing'
+import { Eye as View } from '@/app/components/base/icons/src/vender/solid/general'
+
+const I18N_PREFIX = 'app.tracing'
+
+type Props = {
+  type: TracingProvider
+  readOnly: boolean
+  isChosen: boolean
+  config: any
+  onChoose: () => void
+  hasConfigured: boolean
+  onConfig: () => void
+}
+
+const getIcon = (type: TracingProvider) => {
+  return ({
+    [TracingProvider.langSmith]: LangsmithIconBig,
+    [TracingProvider.langfuse]: LangfuseIconBig,
+    [TracingProvider.opik]: OpikIconBig,
+    [TracingProvider.weave]: WeaveIconBig,
+  })[type]
+}
+
+const ProviderPanel: FC<Props> = ({
+  type,
+  readOnly,
+  isChosen,
+  config,
+  onChoose,
+  hasConfigured,
+  onConfig,
+}) => {
+  const { t } = useTranslation()
+  const Icon = getIcon(type)
+
+  const handleConfigBtnClick = useCallback((e: React.MouseEvent) => {
+    e.stopPropagation()
+    onConfig()
+  }, [onConfig])
+
+  const viewBtnClick = useCallback((e: React.MouseEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+
+    const url = config?.project_url
+    if (url)
+      window.open(url, '_blank', 'noopener,noreferrer')
+  }, [config?.project_url])
+
+  const handleChosen = useCallback((e: React.MouseEvent) => {
+    e.stopPropagation()
+    if (isChosen || !hasConfigured || readOnly)
+      return
+    onChoose()
+  }, [hasConfigured, isChosen, onChoose, readOnly])
+  return (
+    <div
+      className={cn(
+        'rounded-xl border-[1.5px] bg-background-section-burn px-4 py-3',
+        isChosen ? 'border-components-option-card-option-selected-border bg-background-section' : 'border-transparent',
+        !isChosen && hasConfigured && !readOnly && 'cursor-pointer',
+      )}
+      onClick={handleChosen}
+    >
+      <div className={'flex items-center justify-between space-x-1'}>
+        <div className='flex items-center'>
+          <Icon className='h-6' />
+          {isChosen && <div className='system-2xs-medium-uppercase ml-1 flex h-4 items-center rounded-[4px] border border-text-accent-secondary px-1 text-text-accent-secondary'>{t(`${I18N_PREFIX}.inUse`)}</div>}
+        </div>
+        {!readOnly && (
+          <div className={'flex items-center justify-between space-x-1'}>
+            {hasConfigured && (
+              <div className='flex h-6 cursor-pointer items-center space-x-1 rounded-md border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-2 text-text-secondary shadow-xs' onClick={viewBtnClick} >
+                <View className='h-3 w-3' />
+                <div className='text-xs font-medium'>{t(`${I18N_PREFIX}.view`)}</div>
+              </div>
+            )}
+            <div
+              className='flex h-6 cursor-pointer items-center space-x-1 rounded-md border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-2 text-text-secondary shadow-xs'
+              onClick={handleConfigBtnClick}
+            >
+              <RiEqualizer2Line className='h-3 w-3' />
+              <div className='text-xs font-medium'>{t(`${I18N_PREFIX}.config`)}</div>
+            </div>
+          </div>
+        )}
+      </div>
+      <div className='system-xs-regular mt-2 text-text-tertiary'>
+        {t(`${I18N_PREFIX}.${type}.description`)}
+      </div>
+    </div>
+  )
+}
+export default React.memo(ProviderPanel)
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/tracing-icon.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/tracing-icon.tsx"
new file mode 100644
index 0000000..ec9117d
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/tracing-icon.tsx"
@@ -0,0 +1,28 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+import { TracingIcon as Icon } from '@/app/components/base/icons/src/public/tracing'
+
+type Props = {
+  className?: string
+  size: 'lg' | 'md'
+}
+
+const sizeClassMap = {
+  lg: 'w-9 h-9 p-2 rounded-[10px]',
+  md: 'w-6 h-6 p-1 rounded-lg',
+}
+
+const TracingIcon: FC<Props> = ({
+  className,
+  size,
+}) => {
+  const sizeClass = sizeClassMap[size]
+  return (
+    <div className={cn(className, sizeClass, 'bg-primary-500 shadow-md')}>
+      <Icon className='h-full w-full' />
+    </div>
+  )
+}
+export default React.memo(TracingIcon)
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/type.ts" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/type.ts"
new file mode 100644
index 0000000..386c589
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/overview/tracing/type.ts"
@@ -0,0 +1,32 @@
+export enum TracingProvider {
+  langSmith = 'langsmith',
+  langfuse = 'langfuse',
+  opik = 'opik',
+  weave = 'weave',
+}
+
+export type LangSmithConfig = {
+  api_key: string
+  project: string
+  endpoint: string
+}
+
+export type LangFuseConfig = {
+  public_key: string
+  secret_key: string
+  host: string
+}
+
+export type OpikConfig = {
+  api_key: string
+  project: string
+  workspace: string
+  url: string
+}
+
+export type WeaveConfig = {
+  api_key: string
+  entity: string
+  project: string
+  endpoint: string
+}
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/style.module.css" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/style.module.css"
new file mode 100644
index 0000000..45c7d19
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/style.module.css"
@@ -0,0 +1,6 @@
+.app {
+    flex-grow: 1;
+    height: 0;
+    border-radius: 16px 16px 0px 0px;
+    box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.05), 0px 0px 2px -1px rgba(0, 0, 0, 0.03);
+}
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/workflow/page.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/workflow/page.tsx"
new file mode 100644
index 0000000..d5df70f
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/\133appId\135/workflow/page.tsx"
@@ -0,0 +1,12 @@
+'use client'
+
+import WorkflowApp from '@/app/components/workflow-app'
+
+const Page = () => {
+  return (
+    <div className='h-full w-full overflow-x-auto'>
+      <WorkflowApp />
+    </div>
+  )
+}
+export default Page
diff --git "a/app/\050commonLayout\051/app/\050appDetailLayout\051/layout.tsx" "b/app/\050commonLayout\051/app/\050appDetailLayout\051/layout.tsx"
new file mode 100644
index 0000000..dda198f
--- /dev/null
+++ "b/app/\050commonLayout\051/app/\050appDetailLayout\051/layout.tsx"
@@ -0,0 +1,28 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect } from 'react'
+import { useRouter } from 'next/navigation'
+import { useAppContext } from '@/context/app-context'
+
+export type IAppDetail = {
+  children: React.ReactNode
+}
+
+const AppDetail: FC<IAppDetail> = ({ children }) => {
+  const router = useRouter()
+  const { isCurrentWorkspaceDatasetOperator } = useAppContext()
+
+  useEffect(() => {
+    if (isCurrentWorkspaceDatasetOperator)
+      return router.replace('/datasets')
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isCurrentWorkspaceDatasetOperator])
+
+  return (
+    <>
+      {children}
+    </>
+  )
+}
+
+export default React.memo(AppDetail)
diff --git "a/app/\050commonLayout\051/apps/AppCard.tsx" "b/app/\050commonLayout\051/apps/AppCard.tsx"
new file mode 100644
index 0000000..c2ad1f1
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/AppCard.tsx"
@@ -0,0 +1,426 @@
+'use client'
+
+import { useContext, useContextSelector } from 'use-context-selector'
+import { useRouter } from 'next/navigation'
+import { useCallback, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiMoreFill } from '@remixicon/react'
+import type { App } from '@/types/app'
+import Confirm from '@/app/components/base/confirm'
+import Toast, { ToastContext } from '@/app/components/base/toast'
+import { copyApp, deleteApp, exportAppConfig, updateAppInfo } from '@/service/apps'
+import DuplicateAppModal from '@/app/components/app/duplicate-modal'
+import type { DuplicateAppModalProps } from '@/app/components/app/duplicate-modal'
+import AppIcon from '@/app/components/base/app-icon'
+import AppsContext, { useAppContext } from '@/context/app-context'
+import type { HtmlContentProps } from '@/app/components/base/popover'
+import CustomPopover from '@/app/components/base/popover'
+import Divider from '@/app/components/base/divider'
+import { WEB_PREFIX } from '@/config'
+import { getRedirection } from '@/utils/app-redirection'
+import { useProviderContext } from '@/context/provider-context'
+import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
+import type { CreateAppModalProps } from '@/app/components/explore/create-app-modal'
+import EditAppModal from '@/app/components/explore/create-app-modal'
+import SwitchAppModal from '@/app/components/app/switch-app-modal'
+import type { Tag } from '@/app/components/base/tag-management/constant'
+import TagSelector from '@/app/components/base/tag-management/selector'
+import type { EnvironmentVariable } from '@/app/components/workflow/types'
+import DSLExportConfirmModal from '@/app/components/workflow/dsl-export-confirm-modal'
+import { fetchWorkflowDraft } from '@/service/workflow'
+import { fetchInstalledAppList } from '@/service/explore'
+import { AppTypeIcon } from '@/app/components/app/type-selector'
+import cn from '@/utils/classnames'
+
+export type AppCardProps = {
+  app: App
+  onRefresh?: () => void
+}
+
+const AppCard = ({ app, onRefresh }: AppCardProps) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const { isCurrentWorkspaceEditor } = useAppContext()
+  const { onPlanInfoChanged } = useProviderContext()
+  const { push } = useRouter()
+
+  const mutateApps = useContextSelector(
+    AppsContext,
+    state => state.mutateApps,
+  )
+
+  const [showEditModal, setShowEditModal] = useState(false)
+  const [showDuplicateModal, setShowDuplicateModal] = useState(false)
+  const [showSwitchModal, setShowSwitchModal] = useState<boolean>(false)
+  const [showConfirmDelete, setShowConfirmDelete] = useState(false)
+  const [secretEnvList, setSecretEnvList] = useState<EnvironmentVariable[]>([])
+
+  const onConfirmDelete = useCallback(async () => {
+    try {
+      await deleteApp(app.id)
+      notify({ type: 'success', message: t('app.appDeleted') })
+      if (onRefresh)
+        onRefresh()
+      mutateApps()
+      onPlanInfoChanged()
+    }
+    catch (e: any) {
+      notify({
+        type: 'error',
+        message: `${t('app.appDeleteFailed')}${'message' in e ? `: ${e.message}` : ''}`,
+      })
+    }
+    setShowConfirmDelete(false)
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [app.id])
+
+  const onEdit: CreateAppModalProps['onConfirm'] = useCallback(async ({
+    name,
+    icon_type,
+    icon,
+    icon_background,
+    description,
+    use_icon_as_answer_icon,
+  }) => {
+    try {
+      await updateAppInfo({
+        appID: app.id,
+        name,
+        icon_type,
+        icon,
+        icon_background,
+        description,
+        use_icon_as_answer_icon,
+      })
+      setShowEditModal(false)
+      notify({
+        type: 'success',
+        message: t('app.editDone'),
+      })
+      if (onRefresh)
+        onRefresh()
+      mutateApps()
+    }
+    catch {
+      notify({ type: 'error', message: t('app.editFailed') })
+    }
+  }, [app.id, mutateApps, notify, onRefresh, t])
+
+  const onCopy: DuplicateAppModalProps['onConfirm'] = async ({ name, icon_type, icon, icon_background }) => {
+    try {
+      const newApp = await copyApp({
+        appID: app.id,
+        name,
+        icon_type,
+        icon,
+        icon_background,
+        mode: app.mode,
+      })
+      setShowDuplicateModal(false)
+      notify({
+        type: 'success',
+        message: t('app.newApp.appCreated'),
+      })
+      localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
+      if (onRefresh)
+        onRefresh()
+      mutateApps()
+      onPlanInfoChanged()
+      getRedirection(isCurrentWorkspaceEditor, newApp, push)
+    }
+    catch {
+      notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
+    }
+  }
+
+  const onExport = async (include = false) => {
+    try {
+      const { data } = await exportAppConfig({
+        appID: app.id,
+        include,
+      })
+      const a = document.createElement('a')
+      const file = new Blob([data], { type: 'application/yaml' })
+      a.href = URL.createObjectURL(file)
+      a.download = `${app.name}.yml`
+      a.click()
+    }
+    catch {
+      notify({ type: 'error', message: t('app.exportFailed') })
+    }
+  }
+
+  const exportCheck = async () => {
+    if (app.mode !== 'workflow' && app.mode !== 'advanced-chat') {
+      onExport()
+      return
+    }
+    try {
+      const workflowDraft = await fetchWorkflowDraft(`/apps/${app.id}/workflows/draft`)
+      const list = (workflowDraft.environment_variables || []).filter(env => env.value_type === 'secret')
+      if (list.length === 0) {
+        onExport()
+        return
+      }
+      setSecretEnvList(list)
+    }
+    catch {
+      notify({ type: 'error', message: t('app.exportFailed') })
+    }
+  }
+
+  const onSwitch = () => {
+    if (onRefresh)
+      onRefresh()
+    mutateApps()
+    setShowSwitchModal(false)
+  }
+
+  const Operations = (props: HtmlContentProps) => {
+    const onMouseLeave = async () => {
+      props.onClose?.()
+    }
+    const onClickSettings = async (e: React.MouseEvent<HTMLButtonElement>) => {
+      e.stopPropagation()
+      props.onClick?.()
+      e.preventDefault()
+      setShowEditModal(true)
+    }
+    const onClickDuplicate = async (e: React.MouseEvent<HTMLButtonElement>) => {
+      e.stopPropagation()
+      props.onClick?.()
+      e.preventDefault()
+      setShowDuplicateModal(true)
+    }
+    const onClickExport = async (e: React.MouseEvent<HTMLButtonElement>) => {
+      e.stopPropagation()
+      props.onClick?.()
+      e.preventDefault()
+      exportCheck()
+    }
+    const onClickSwitch = async (e: React.MouseEvent<HTMLDivElement>) => {
+      e.stopPropagation()
+      props.onClick?.()
+      e.preventDefault()
+      setShowSwitchModal(true)
+    }
+    const onClickDelete = async (e: React.MouseEvent<HTMLDivElement>) => {
+      e.stopPropagation()
+      props.onClick?.()
+      e.preventDefault()
+      setShowConfirmDelete(true)
+    }
+    const onClickInstalledApp = async (e: React.MouseEvent<HTMLButtonElement>) => {
+      e.stopPropagation()
+      props.onClick?.()
+      e.preventDefault()
+      try {
+        const { installed_apps }: any = await fetchInstalledAppList(app.id) || {}
+        if (installed_apps?.length > 0)
+          window.open(`${WEB_PREFIX}/explore/installed/${installed_apps[0].id}`, '_blank')
+        else
+          throw new Error('No app found in Explore')
+      }
+      catch (e: any) {
+        Toast.notify({ type: 'error', message: `${e.message || e}` })
+      }
+    }
+    return (
+      <div className="relative w-full py-1" onMouseLeave={onMouseLeave}>
+        <button className='mx-1 flex h-8 w-[calc(100%_-_8px)] cursor-pointer items-center gap-2 rounded-lg px-3 py-[6px] hover:bg-state-base-hover' onClick={onClickSettings}>
+          <span className='system-sm-regular text-text-secondary'>{t('app.editApp')}</span>
+        </button>
+        <Divider className="!my-1" />
+        <button className='mx-1 flex h-8 w-[calc(100%_-_8px)] cursor-pointer items-center gap-2 rounded-lg px-3 py-[6px] hover:bg-state-base-hover' onClick={onClickDuplicate}>
+          <span className='system-sm-regular text-text-secondary'>{t('app.duplicate')}</span>
+        </button>
+        <button className='mx-1 flex h-8 w-[calc(100%_-_8px)] cursor-pointer items-center gap-2 rounded-lg px-3 py-[6px] hover:bg-state-base-hover' onClick={onClickExport}>
+          <span className='system-sm-regular text-text-secondary'>{t('app.export')}</span>
+        </button>
+        {(app.mode === 'completion' || app.mode === 'chat') && (
+          <>
+            <Divider className="!my-1" />
+            <div
+              className='mx-1 flex h-9 cursor-pointer items-center rounded-lg px-3 py-2 hover:bg-state-base-hover'
+              onClick={onClickSwitch}
+            >
+              <span className='text-sm leading-5 text-text-secondary'>{t('app.switch')}</span>
+            </div>
+          </>
+        )}
+        <Divider className="!my-1" />
+        <button className='mx-1 flex h-8 w-[calc(100%_-_8px)] cursor-pointer items-center gap-2 rounded-lg px-3 py-[6px] hover:bg-state-base-hover' onClick={onClickInstalledApp}>
+          <span className='system-sm-regular text-text-secondary'>{t('app.openInExplore')}</span>
+        </button>
+        <Divider className="!my-1" />
+        <div
+          className='group mx-1 flex h-8 w-[calc(100%_-_8px)] cursor-pointer items-center gap-2 rounded-lg px-3 py-[6px] hover:bg-state-destructive-hover'
+          onClick={onClickDelete}
+        >
+          <span className='system-sm-regular text-text-secondary group-hover:text-text-destructive'>
+            {t('common.operation.delete')}
+          </span>
+        </div>
+      </div>
+    )
+  }
+
+  const [tags, setTags] = useState<Tag[]>(app.tags)
+  useEffect(() => {
+    setTags(app.tags)
+  }, [app.tags])
+
+  return (
+    <>
+      <div
+        onClick={(e) => {
+          e.preventDefault()
+          getRedirection(isCurrentWorkspaceEditor, app, push)
+        }}
+        className='group relative col-span-1 inline-flex h-[160px] cursor-pointer flex-col rounded-xl border-[1px] border-solid border-components-card-border bg-components-card-bg shadow-sm transition-all duration-200 ease-in-out hover:shadow-lg'
+      >
+        <div className='flex h-[66px] shrink-0 grow-0 items-center gap-3 px-[14px] pb-3 pt-[14px]'>
+          <div className='relative shrink-0'>
+            <AppIcon
+              size="large"
+              iconType={app.icon_type}
+              icon={app.icon}
+              background={app.icon_background}
+              imageUrl={app.icon_url}
+            />
+            <AppTypeIcon type={app.mode} wrapperClassName='absolute -bottom-0.5 -right-0.5 w-4 h-4 shadow-sm' className='h-3 w-3' />
+          </div>
+          <div className='w-0 grow py-[1px]'>
+            <div className='flex items-center text-sm font-semibold leading-5 text-text-secondary'>
+              <div className='truncate' title={app.name}>{app.name}</div>
+            </div>
+            <div className='flex items-center text-[10px] font-medium leading-[18px] text-text-tertiary'>
+              {app.mode === 'advanced-chat' && <div className='truncate'>{t('app.types.advanced').toUpperCase()}</div>}
+              {app.mode === 'chat' && <div className='truncate'>{t('app.types.chatbot').toUpperCase()}</div>}
+              {app.mode === 'agent-chat' && <div className='truncate'>{t('app.types.agent').toUpperCase()}</div>}
+              {app.mode === 'workflow' && <div className='truncate'>{t('app.types.workflow').toUpperCase()}</div>}
+              {app.mode === 'completion' && <div className='truncate'>{t('app.types.completion').toUpperCase()}</div>}
+            </div>
+          </div>
+        </div>
+        <div className='title-wrapper h-[90px] px-[14px] text-xs leading-normal text-text-tertiary'>
+          <div
+            className={cn(tags.length ? 'line-clamp-2' : 'line-clamp-4', 'group-hover:line-clamp-2')}
+            title={app.description}
+          >
+            {app.description}
+          </div>
+        </div>
+        <div className={cn(
+          'absolute bottom-1 left-0 right-0 h-[42px] shrink-0 items-center pb-[6px] pl-[14px] pr-[6px] pt-1',
+          tags.length ? 'flex' : '!hidden group-hover:!flex',
+        )}>
+          {isCurrentWorkspaceEditor && (
+            <>
+              <div className={cn('flex w-0 grow items-center gap-1')} onClick={(e) => {
+                e.stopPropagation()
+                e.preventDefault()
+              }}>
+                <div className={cn(
+                  'mr-[41px] w-full grow group-hover:!mr-0 group-hover:!block',
+                  tags.length ? '!block' : '!hidden',
+                )}>
+                  <TagSelector
+                    position='bl'
+                    type='app'
+                    targetID={app.id}
+                    value={tags.map(tag => tag.id)}
+                    selectedTags={tags}
+                    onCacheUpdate={setTags}
+                    onChange={onRefresh}
+                  />
+                </div>
+              </div>
+              <div className='mx-1 !hidden h-[14px] w-[1px] shrink-0 group-hover:!flex' />
+              <div className='!hidden shrink-0 group-hover:!flex'>
+                <CustomPopover
+                  htmlContent={<Operations />}
+                  position="br"
+                  trigger="click"
+                  btnElement={
+                    <div
+                      className='flex h-8 w-8 cursor-pointer items-center justify-center rounded-md'
+                    >
+                      <RiMoreFill className='h-4 w-4 text-text-tertiary' />
+                    </div>
+                  }
+                  btnClassName={open =>
+                    cn(
+                      open ? '!bg-black/5 !shadow-none' : '!bg-transparent',
+                      'h-8 w-8 rounded-md border-none !p-2 hover:!bg-black/5',
+                    )
+                  }
+                  popupClassName={
+                    (app.mode === 'completion' || app.mode === 'chat')
+                      ? '!w-[256px] translate-x-[-224px]'
+                      : '!w-[160px] translate-x-[-128px]'
+                  }
+                  className={'!z-20 h-fit'}
+                />
+              </div>
+            </>
+          )}
+        </div>
+      </div>
+      {showEditModal && (
+        <EditAppModal
+          isEditModal
+          appName={app.name}
+          appIconType={app.icon_type}
+          appIcon={app.icon}
+          appIconBackground={app.icon_background}
+          appIconUrl={app.icon_url}
+          appDescription={app.description}
+          appMode={app.mode}
+          appUseIconAsAnswerIcon={app.use_icon_as_answer_icon}
+          show={showEditModal}
+          onConfirm={onEdit}
+          onHide={() => setShowEditModal(false)}
+        />
+      )}
+      {showDuplicateModal && (
+        <DuplicateAppModal
+          appName={app.name}
+          icon_type={app.icon_type}
+          icon={app.icon}
+          icon_background={app.icon_background}
+          icon_url={app.icon_url}
+          show={showDuplicateModal}
+          onConfirm={onCopy}
+          onHide={() => setShowDuplicateModal(false)}
+        />
+      )}
+      {showSwitchModal && (
+        <SwitchAppModal
+          show={showSwitchModal}
+          appDetail={app}
+          onClose={() => setShowSwitchModal(false)}
+          onSuccess={onSwitch}
+        />
+      )}
+      {showConfirmDelete && (
+        <Confirm
+          title={t('app.deleteAppConfirmTitle')}
+          content={t('app.deleteAppConfirmContent')}
+          isShow={showConfirmDelete}
+          onConfirm={onConfirmDelete}
+          onCancel={() => setShowConfirmDelete(false)}
+        />
+      )}
+      {secretEnvList.length > 0 && (
+        <DSLExportConfirmModal
+          envList={secretEnvList}
+          onConfirm={onExport}
+          onClose={() => setSecretEnvList([])}
+        />
+      )}
+    </>
+  )
+}
+
+export default AppCard
diff --git "a/app/\050commonLayout\051/apps/Apps.tsx" "b/app/\050commonLayout\051/apps/Apps.tsx"
new file mode 100644
index 0000000..1375f4d
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/Apps.tsx"
@@ -0,0 +1,219 @@
+'use client'
+
+import { useCallback, useEffect, useRef, useState } from 'react'
+import {
+  useRouter,
+} from 'next/navigation'
+import useSWRInfinite from 'swr/infinite'
+import { useTranslation } from 'react-i18next'
+import { useDebounceFn } from 'ahooks'
+import {
+  RiApps2Line,
+  RiExchange2Line,
+  RiFile4Line,
+  RiMessage3Line,
+  RiRobot3Line,
+} from '@remixicon/react'
+import AppCard from './AppCard'
+import NewAppCard from './NewAppCard'
+import useAppsQueryState from './hooks/useAppsQueryState'
+import type { AppListResponse } from '@/models/app'
+import { fetchAppList } from '@/service/apps'
+import { useAppContext } from '@/context/app-context'
+import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
+import { CheckModal } from '@/hooks/use-pay'
+import TabSliderNew from '@/app/components/base/tab-slider-new'
+import { useTabSearchParams } from '@/hooks/use-tab-searchparams'
+import Input from '@/app/components/base/input'
+import { useStore as useTagStore } from '@/app/components/base/tag-management/store'
+import TagManagementModal from '@/app/components/base/tag-management'
+import TagFilter from '@/app/components/base/tag-management/filter'
+import CheckboxWithLabel from '@/app/components/datasets/create/website/base/checkbox-with-label'
+
+const getKey = (
+  pageIndex: number,
+  previousPageData: AppListResponse,
+  activeTab: string,
+  isCreatedByMe: boolean,
+  tags: string[],
+  keywords: string,
+) => {
+  if (!pageIndex || previousPageData.has_more) {
+    const params: any = { url: 'apps', params: { page: pageIndex + 1, limit: 30, name: keywords, is_created_by_me: isCreatedByMe } }
+
+    if (activeTab !== 'all')
+      params.params.mode = activeTab
+    else
+      delete params.params.mode
+
+    if (tags.length)
+      params.params.tag_ids = tags
+
+    return params
+  }
+  return null
+}
+
+const Apps = () => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const { isCurrentWorkspaceEditor, isCurrentWorkspaceDatasetOperator } = useAppContext()
+  const showTagManagementModal = useTagStore(s => s.showTagManagementModal)
+  const [activeTab, setActiveTab] = useTabSearchParams({
+    defaultTab: 'all',
+  })
+  const { query: { tagIDs = [], keywords = '', isCreatedByMe: queryIsCreatedByMe = false }, setQuery } = useAppsQueryState()
+  const [isCreatedByMe, setIsCreatedByMe] = useState(queryIsCreatedByMe)
+  const [tagFilterValue, setTagFilterValue] = useState<string[]>(tagIDs)
+  const [searchKeywords, setSearchKeywords] = useState(keywords)
+  const newAppCardRef = useRef<HTMLDivElement>(null)
+  const setKeywords = useCallback((keywords: string) => {
+    setQuery(prev => ({ ...prev, keywords }))
+  }, [setQuery])
+  const setTagIDs = useCallback((tagIDs: string[]) => {
+    setQuery(prev => ({ ...prev, tagIDs }))
+  }, [setQuery])
+
+  const { data, isLoading, error, setSize, mutate } = useSWRInfinite(
+    (pageIndex: number, previousPageData: AppListResponse) => getKey(pageIndex, previousPageData, activeTab, isCreatedByMe, tagIDs, searchKeywords),
+    fetchAppList,
+    {
+      revalidateFirstPage: true,
+      shouldRetryOnError: false,
+      dedupingInterval: 500,
+      errorRetryCount: 3,
+    },
+  )
+
+  const anchorRef = useRef<HTMLDivElement>(null)
+  const options = [
+    { value: 'all', text: t('app.types.all'), icon: <RiApps2Line className='mr-1 h-[14px] w-[14px]' /> },
+    { value: 'chat', text: t('app.types.chatbot'), icon: <RiMessage3Line className='mr-1 h-[14px] w-[14px]' /> },
+    { value: 'agent-chat', text: t('app.types.agent'), icon: <RiRobot3Line className='mr-1 h-[14px] w-[14px]' /> },
+    { value: 'completion', text: t('app.types.completion'), icon: <RiFile4Line className='mr-1 h-[14px] w-[14px]' /> },
+    { value: 'advanced-chat', text: t('app.types.advanced'), icon: <RiMessage3Line className='mr-1 h-[14px] w-[14px]' /> },
+    { value: 'workflow', text: t('app.types.workflow'), icon: <RiExchange2Line className='mr-1 h-[14px] w-[14px]' /> },
+  ]
+
+  useEffect(() => {
+    document.title = `${t('common.menus.apps')} - Dify`
+    if (localStorage.getItem(NEED_REFRESH_APP_LIST_KEY) === '1') {
+      localStorage.removeItem(NEED_REFRESH_APP_LIST_KEY)
+      mutate()
+    }
+  }, [mutate, t])
+
+  useEffect(() => {
+    if (isCurrentWorkspaceDatasetOperator)
+      return router.replace('/datasets')
+  }, [router, isCurrentWorkspaceDatasetOperator])
+
+  useEffect(() => {
+    const hasMore = data?.at(-1)?.has_more ?? true
+    let observer: IntersectionObserver | undefined
+
+    if (error) {
+      if (observer)
+        observer.disconnect()
+      return
+    }
+
+    if (anchorRef.current) {
+      observer = new IntersectionObserver((entries) => {
+        if (entries[0].isIntersecting && !isLoading && !error && hasMore)
+          setSize((size: number) => size + 1)
+      }, { rootMargin: '100px' })
+      observer.observe(anchorRef.current)
+    }
+    return () => observer?.disconnect()
+  }, [isLoading, setSize, anchorRef, mutate, data, error])
+
+  const { run: handleSearch } = useDebounceFn(() => {
+    setSearchKeywords(keywords)
+  }, { wait: 500 })
+  const handleKeywordsChange = (value: string) => {
+    setKeywords(value)
+    handleSearch()
+  }
+
+  const { run: handleTagsUpdate } = useDebounceFn(() => {
+    setTagIDs(tagFilterValue)
+  }, { wait: 500 })
+  const handleTagsChange = (value: string[]) => {
+    setTagFilterValue(value)
+    handleTagsUpdate()
+  }
+
+  const handleCreatedByMeChange = useCallback(() => {
+    const newValue = !isCreatedByMe
+    setIsCreatedByMe(newValue)
+    setQuery(prev => ({ ...prev, isCreatedByMe: newValue }))
+  }, [isCreatedByMe, setQuery])
+
+  return (
+    <>
+      <div className='sticky top-0 z-10 flex flex-wrap items-center justify-between gap-y-2 bg-background-body px-12 pb-2 pt-4 leading-[56px]'>
+        <TabSliderNew
+          value={activeTab}
+          onChange={setActiveTab}
+          options={options}
+        />
+        <div className='flex items-center gap-2'>
+          <CheckboxWithLabel
+            className='mr-2'
+            label={t('app.showMyCreatedAppsOnly')}
+            isChecked={isCreatedByMe}
+            onChange={handleCreatedByMeChange}
+          />
+          <TagFilter type='app' value={tagFilterValue} onChange={handleTagsChange} />
+          <Input
+            showLeftIcon
+            showClearIcon
+            wrapperClassName='w-[200px]'
+            value={keywords}
+            onChange={e => handleKeywordsChange(e.target.value)}
+            onClear={() => handleKeywordsChange('')}
+          />
+        </div>
+      </div>
+      {(data && data[0].total > 0)
+        ? <div className='relative grid grow grid-cols-1 content-start gap-4 px-12 pt-2 sm:grid-cols-1 md:grid-cols-2 xl:grid-cols-4 2xl:grid-cols-5 2k:grid-cols-6'>
+          {isCurrentWorkspaceEditor
+            && <NewAppCard ref={newAppCardRef} onSuccess={mutate} />}
+          {data.map(({ data: apps }) => apps.map(app => (
+            <AppCard key={app.id} app={app} onRefresh={mutate} />
+          )))}
+        </div>
+        : <div className='relative grid grow grid-cols-1 content-start gap-4 overflow-hidden px-12 pt-2 sm:grid-cols-1 md:grid-cols-2 xl:grid-cols-4 2xl:grid-cols-5 2k:grid-cols-6'>
+          {isCurrentWorkspaceEditor
+            && <NewAppCard ref={newAppCardRef} className='z-10' onSuccess={mutate} />}
+          <NoAppsFound />
+        </div>}
+      <CheckModal />
+      <div ref={anchorRef} className='h-0'> </div>
+      {showTagManagementModal && (
+        <TagManagementModal type='app' show={showTagManagementModal} />
+      )}
+    </>
+  )
+}
+
+export default Apps
+
+function NoAppsFound() {
+  const { t } = useTranslation()
+  function renderDefaultCard() {
+    const defaultCards = Array.from({ length: 36 }, (_, index) => (
+      <div key={index} className='inline-flex h-[160px] rounded-xl bg-background-default-lighter'></div>
+    ))
+    return defaultCards
+  }
+  return (
+    <>
+      {renderDefaultCard()}
+      <div className='absolute bottom-0 left-0 right-0 top-0 flex items-center justify-center bg-gradient-to-t from-background-body to-transparent'>
+        <span className='system-md-medium text-text-tertiary'>{t('app.newApp.noAppsFound')}</span>
+      </div>
+    </>
+  )
+}
diff --git "a/app/\050commonLayout\051/apps/NewAppCard.tsx" "b/app/\050commonLayout\051/apps/NewAppCard.tsx"
new file mode 100644
index 0000000..0b42577
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/NewAppCard.tsx"
@@ -0,0 +1,118 @@
+'use client'
+
+import { useMemo, useState } from 'react'
+import {
+  useRouter,
+  useSearchParams,
+} from 'next/navigation'
+import { useTranslation } from 'react-i18next'
+import CreateAppTemplateDialog from '@/app/components/app/create-app-dialog'
+import CreateAppModal from '@/app/components/app/create-app-modal'
+import CreateFromDSLModal, { CreateFromDSLModalTab } from '@/app/components/app/create-from-dsl-modal'
+import { useProviderContext } from '@/context/provider-context'
+import { FileArrow01, FilePlus01, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files'
+import cn from '@/utils/classnames'
+
+export type CreateAppCardProps = {
+  className?: string
+  onSuccess?: () => void
+}
+
+const CreateAppCard = (
+  {
+    ref,
+    className,
+    onSuccess,
+  }: CreateAppCardProps & {
+    ref: React.RefObject<HTMLDivElement>;
+  },
+) => {
+  const { t } = useTranslation()
+  const { onPlanInfoChanged } = useProviderContext()
+  const searchParams = useSearchParams()
+  const { replace } = useRouter()
+  const dslUrl = searchParams.get('remoteInstallUrl') || undefined
+
+  const [showNewAppTemplateDialog, setShowNewAppTemplateDialog] = useState(false)
+  const [showNewAppModal, setShowNewAppModal] = useState(false)
+  const [showCreateFromDSLModal, setShowCreateFromDSLModal] = useState(!!dslUrl)
+
+  const activeTab = useMemo(() => {
+    if (dslUrl)
+      return CreateFromDSLModalTab.FROM_URL
+
+    return undefined
+  }, [dslUrl])
+
+  return (
+    <div
+      ref={ref}
+      className={cn('relative col-span-1 inline-flex h-[160px] flex-col justify-between rounded-xl border-[0.5px] border-components-card-border bg-components-card-bg', className)}
+    >
+      <div className='grow rounded-t-xl p-2'>
+        <div className='px-6 pb-1 pt-2 text-xs font-medium leading-[18px] text-text-tertiary'>{t('app.createApp')}</div>
+        <button className='mb-1 flex w-full cursor-pointer items-center rounded-lg px-6 py-[7px] text-[13px] font-medium leading-[18px] text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary' onClick={() => setShowNewAppModal(true)}>
+          <FilePlus01 className='mr-2 h-4 w-4 shrink-0' />
+          {t('app.newApp.startFromBlank')}
+        </button>
+        <button className='flex w-full cursor-pointer items-center rounded-lg px-6 py-[7px] text-[13px] font-medium leading-[18px] text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary' onClick={() => setShowNewAppTemplateDialog(true)}>
+          <FilePlus02 className='mr-2 h-4 w-4 shrink-0' />
+          {t('app.newApp.startFromTemplate')}
+        </button>
+        <button
+          onClick={() => setShowCreateFromDSLModal(true)}
+          className='flex w-full cursor-pointer items-center rounded-lg px-6 py-[7px] text-[13px] font-medium leading-[18px] text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary'>
+          <FileArrow01 className='mr-2 h-4 w-4 shrink-0' />
+          {t('app.importDSL')}
+        </button>
+      </div>
+
+      <CreateAppModal
+        show={showNewAppModal}
+        onClose={() => setShowNewAppModal(false)}
+        onSuccess={() => {
+          onPlanInfoChanged()
+          if (onSuccess)
+            onSuccess()
+        }}
+        onCreateFromTemplate={() => {
+          setShowNewAppTemplateDialog(true)
+          setShowNewAppModal(false)
+        }}
+      />
+      <CreateAppTemplateDialog
+        show={showNewAppTemplateDialog}
+        onClose={() => setShowNewAppTemplateDialog(false)}
+        onSuccess={() => {
+          onPlanInfoChanged()
+          if (onSuccess)
+            onSuccess()
+        }}
+        onCreateFromBlank={() => {
+          setShowNewAppModal(true)
+          setShowNewAppTemplateDialog(false)
+        }}
+      />
+      <CreateFromDSLModal
+        show={showCreateFromDSLModal}
+        onClose={() => {
+          setShowCreateFromDSLModal(false)
+
+          if (dslUrl)
+            replace('/')
+        }}
+        activeTab={activeTab}
+        dslUrl={dslUrl}
+        onSuccess={() => {
+          onPlanInfoChanged()
+          if (onSuccess)
+            onSuccess()
+        }}
+      />
+    </div>
+  )
+}
+
+CreateAppCard.displayName = 'CreateAppCard'
+export default CreateAppCard
+export { CreateAppCard }
diff --git "a/app/\050commonLayout\051/apps/assets/add.svg" "b/app/\050commonLayout\051/apps/assets/add.svg"
new file mode 100644
index 0000000..9958e85
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/assets/add.svg"
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8 4V8M8 8V12M8 8H12M8 8H4" stroke="#6B7280" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git "a/app/\050commonLayout\051/apps/assets/chat-solid.svg" "b/app/\050commonLayout\051/apps/assets/chat-solid.svg"
new file mode 100644
index 0000000..a793e98
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/assets/chat-solid.svg"
@@ -0,0 +1,4 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.631586 8.25C0.631586 6.46656 2.04586 5 3.8158 5C5.58573 5 7.00001 6.46656 7.00001 8.25C7.00001 10.0334 5.58573 11.5 3.8158 11.5C3.45197 11.5 3.10149 11.4375 2.77474 11.3222C2.72073 11.3031 2.68723 11.2913 2.66266 11.2832C2.65821 11.2817 2.65456 11.2806 2.65164 11.2796L2.64892 11.2799C2.63177 11.2818 2.60839 11.285 2.56507 11.2909L1.06766 11.4954C0.905637 11.5175 0.743029 11.459 0.632239 11.3387C0.521449 11.2185 0.476481 11.0516 0.511825 10.8919L0.817497 9.51109C0.828118 9.46311 0.833802 9.43722 0.837453 9.41817C0.83766 9.4171 0.838022 9.41517 0.838022 9.41517C0.837114 9.412 0.835963 9.40808 0.834525 9.40332C0.826292 9.37605 0.814183 9.33888 0.794499 9.27863C0.688657 8.95463 0.631586 8.60857 0.631586 8.25Z" fill="#98A2B3"/>
+<path d="M2.57377 4.1863C2.96256 4.06535 3.37698 4 3.80894 4C6.16566 4 8.00006 5.94534 8.00006 8.24999C8.00006 8.65682 7.9429 9.05245 7.8358 9.42816C8.10681 9.37948 8.36964 9.30678 8.6219 9.21229C8.65748 9.19897 8.69298 9.18534 8.72893 9.17304C8.75795 9.17641 8.78684 9.18093 8.81574 9.18517L10.4222 9.42065C10.498 9.43179 10.5841 9.44444 10.6591 9.4487C10.7422 9.45343 10.8713 9.45292 11.0081 9.39408C11.1789 9.32061 11.3164 9.18628 11.3938 9.01716C11.4558 8.88174 11.4593 8.75269 11.4564 8.66955C11.4539 8.59442 11.4433 8.5081 11.4339 8.43202L11.2309 6.78307C11.2256 6.7402 11.2229 6.71768 11.2213 6.70118C11.23 6.66505 11.2466 6.6301 11.2598 6.59546C11.4492 6.09896 11.5526 5.56093 11.5526 5C11.5526 2.51163 9.52304 0.5 7.02632 0.5C4.80843 0.5 2.95915 2.08742 2.57377 4.1863Z" fill="#98A2B3"/>
+</svg>
diff --git "a/app/\050commonLayout\051/apps/assets/chat.svg" "b/app/\050commonLayout\051/apps/assets/chat.svg"
new file mode 100644
index 0000000..0971349
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/assets/chat.svg"
@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M14.1667 6.66634H15.8333C16.2754 6.66634 16.6993 6.84194 17.0118 7.1545C17.3244 7.46706 17.5 7.89098 17.5 8.33301V13.333C17.5 13.775 17.3244 14.199 17.0118 14.5115C16.6993 14.8241 16.2754 14.9997 15.8333 14.9997H14.1667V18.333L10.8333 14.9997H7.5C7.28111 14.9999 7.06433 14.9569 6.86211 14.8731C6.6599 14.7893 6.47623 14.6663 6.32167 14.5113M6.32167 14.5113L9.16667 11.6663H12.5C12.942 11.6663 13.366 11.4907 13.6785 11.1782C13.9911 10.8656 14.1667 10.4417 14.1667 9.99967V4.99967C14.1667 4.55765 13.9911 4.13372 13.6785 3.82116C13.366 3.5086 12.942 3.33301 12.5 3.33301H4.16667C3.72464 3.33301 3.30072 3.5086 2.98816 3.82116C2.67559 4.13372 2.5 4.55765 2.5 4.99967V9.99967C2.5 10.4417 2.67559 10.8656 2.98816 11.1782C3.30072 11.4907 3.72464 11.6663 4.16667 11.6663H5.83333V14.9997L6.32167 14.5113Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git "a/app/\050commonLayout\051/apps/assets/completion-solid.svg" "b/app/\050commonLayout\051/apps/assets/completion-solid.svg"
new file mode 100644
index 0000000..a9dc7e3
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/assets/completion-solid.svg"
@@ -0,0 +1,4 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M6.5 1.00779C6.5 0.994638 6.5 0.988062 6.49943 0.976137C6.48764 0.729248 6.27052 0.51224 6.02363 0.50056C6.01171 0.499996 6.0078 0.499998 6.00001 0.5H4.37933C3.97686 0.499995 3.64468 0.49999 3.37409 0.522098C3.09304 0.545061 2.83469 0.594343 2.59202 0.717989C2.2157 0.909735 1.90973 1.2157 1.71799 1.59202C1.59434 1.83469 1.54506 2.09304 1.5221 2.37409C1.49999 2.64468 1.49999 2.97686 1.5 3.37934V8.62066C1.49999 9.02313 1.49999 9.35532 1.5221 9.62591C1.54506 9.90696 1.59434 10.1653 1.71799 10.408C1.90973 10.7843 2.2157 11.0903 2.59202 11.282C2.83469 11.4057 3.09304 11.4549 3.37409 11.4779C3.64468 11.5 3.97686 11.5 4.37934 11.5H7.62066C8.02314 11.5 8.35532 11.5 8.62591 11.4779C8.90696 11.4549 9.16531 11.4057 9.40798 11.282C9.78431 11.0903 10.0903 10.7843 10.282 10.408C10.4057 10.1653 10.4549 9.90696 10.4779 9.62591C10.5 9.35532 10.5 9.02314 10.5 8.62066V4.99997C10.5 4.9922 10.5 4.98832 10.4994 4.97641C10.4878 4.72949 10.2707 4.51236 10.0238 4.50057C10.0119 4.50001 10.0054 4.50001 9.99225 4.50001L7.78404 4.50001C7.65786 4.50002 7.53496 4.50004 7.43089 4.49153C7.31659 4.48219 7.18172 4.46016 7.04601 4.39101C6.85785 4.29514 6.70487 4.14216 6.609 3.954C6.53985 3.81828 6.51781 3.68342 6.50848 3.56912C6.49997 3.46504 6.49999 3.34215 6.5 3.21596L6.5 1.00779ZM4 6.5C3.72386 6.5 3.5 6.72386 3.5 7C3.5 7.27614 3.72386 7.5 4 7.5H8C8.27614 7.5 8.5 7.27614 8.5 7C8.5 6.72386 8.27614 6.5 8 6.5H4ZM4 8.5C3.72386 8.5 3.5 8.72386 3.5 9C3.5 9.27614 3.72386 9.5 4 9.5H7C7.27614 9.5 7.5 9.27614 7.5 9C7.5 8.72386 7.27614 8.5 7 8.5H4Z" fill="#98A2B3"/>
+<path d="M9.45398 3.5C9.60079 3.5 9.67419 3.5 9.73432 3.46314C9.81925 3.41107 9.87002 3.28842 9.84674 3.19157C9.83025 3.12299 9.78238 3.07516 9.68665 2.97952L8.02049 1.31336C7.92484 1.21762 7.87701 1.16975 7.80843 1.15326C7.71158 1.12998 7.58893 1.18075 7.53687 1.26567C7.5 1.3258 7.5 1.39921 7.5 1.54602L7.5 3.09998C7.5 3.23999 7.5 3.30999 7.52725 3.36347C7.55122 3.41051 7.58946 3.44876 7.6365 3.47272C7.68998 3.49997 7.75998 3.49997 7.9 3.49998L9.45398 3.5Z" fill="#98A2B3"/>
+</svg>
diff --git "a/app/\050commonLayout\051/apps/assets/completion.svg" "b/app/\050commonLayout\051/apps/assets/completion.svg"
new file mode 100644
index 0000000..34af441
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/assets/completion.svg"
@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M16.25 11.875V9.6875C16.25 8.1342 14.9908 6.875 13.4375 6.875H12.1875C11.6697 6.875 11.25 6.45527 11.25 5.9375V4.6875C11.25 3.1342 9.9908 1.875 8.4375 1.875H6.875M6.875 12.5H13.125M6.875 15H10M8.75 1.875H4.6875C4.16973 1.875 3.75 2.29473 3.75 2.8125V17.1875C3.75 17.7053 4.16973 18.125 4.6875 18.125H15.3125C15.8303 18.125 16.25 17.7053 16.25 17.1875V9.375C16.25 5.23286 12.8921 1.875 8.75 1.875Z" stroke="#1F2A37" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git "a/app/\050commonLayout\051/apps/assets/discord.svg" "b/app/\050commonLayout\051/apps/assets/discord.svg"
new file mode 100644
index 0000000..9f22a1a
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/assets/discord.svg"
@@ -0,0 +1,3 @@
+<svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M22.0101 4.50191C20.3529 3.74154 18.5759 3.18133 16.7179 2.86048C16.6841 2.85428 16.6503 2.86976 16.6328 2.90071C16.4043 3.30719 16.1511 3.83748 15.9738 4.25429C13.9754 3.95511 11.9873 3.95511 10.0298 4.25429C9.85253 3.82822 9.59019 3.30719 9.36062 2.90071C9.34319 2.87079 9.30939 2.85532 9.27555 2.86048C7.41857 3.18031 5.64152 3.74051 3.98335 4.50191C3.96899 4.5081 3.95669 4.51843 3.94852 4.53183C0.577841 9.56755 -0.345529 14.4795 0.107445 19.3306C0.109495 19.3543 0.122817 19.377 0.141265 19.3914C2.36514 21.0246 4.51935 22.0161 6.63355 22.6732C6.66739 22.6836 6.70324 22.6712 6.72477 22.6433C7.22489 21.9604 7.6707 21.2402 8.05293 20.4829C8.07549 20.4386 8.05396 20.386 8.00785 20.3684C7.30073 20.1002 6.6274 19.7731 5.97971 19.4017C5.92848 19.3718 5.92437 19.2985 5.9715 19.2635C6.1078 19.1613 6.24414 19.0551 6.37428 18.9478C6.39783 18.9282 6.43064 18.924 6.45833 18.9364C10.7134 20.8791 15.32 20.8791 19.5249 18.9364C19.5525 18.923 19.5854 18.9272 19.6099 18.9467C19.7401 19.054 19.8764 19.1613 20.0137 19.2635C20.0609 19.2985 20.0578 19.3718 20.0066 19.4017C19.3589 19.7804 18.6855 20.1002 17.9774 20.3674C17.9313 20.3849 17.9108 20.4386 17.9333 20.4829C18.3238 21.2392 18.7696 21.9593 19.2605 22.6423C19.281 22.6712 19.3179 22.6836 19.3517 22.6732C21.4761 22.0161 23.6303 21.0246 25.8542 19.3914C25.8737 19.377 25.886 19.3553 25.8881 19.3316C26.4302 13.7232 24.98 8.85156 22.0439 4.53286C22.0367 4.51843 22.0245 4.5081 22.0101 4.50191ZM8.68836 16.3768C7.40729 16.3768 6.35173 15.2007 6.35173 13.7563C6.35173 12.3119 7.38682 11.1358 8.68836 11.1358C10.0001 11.1358 11.0455 12.3222 11.025 13.7563C11.025 15.2007 9.98986 16.3768 8.68836 16.3768ZM17.3276 16.3768C16.0466 16.3768 14.991 15.2007 14.991 13.7563C14.991 12.3119 16.0261 11.1358 17.3276 11.1358C18.6394 11.1358 19.6847 12.3222 19.6643 13.7563C19.6643 15.2007 18.6394 16.3768 17.3276 16.3768Z" fill="#5865F2"/>
+</svg>
diff --git "a/app/\050commonLayout\051/apps/assets/github.svg" "b/app/\050commonLayout\051/apps/assets/github.svg"
new file mode 100644
index 0000000..f03798b
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/assets/github.svg"
@@ -0,0 +1,17 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_131_1011)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.0003 0.5C9.15149 0.501478 6.39613 1.51046 4.22687 3.34652C2.05761 5.18259 0.615903 7.72601 0.159545 10.522C-0.296814 13.318 0.261927 16.1842 1.73587 18.6082C3.20981 21.0321 5.50284 22.8558 8.20493 23.753C8.80105 23.8636 9.0256 23.4941 9.0256 23.18C9.0256 22.8658 9.01367 21.955 9.0097 20.9592C5.6714 21.6804 4.96599 19.5505 4.96599 19.5505C4.42152 18.1674 3.63464 17.8039 3.63464 17.8039C2.54571 17.065 3.71611 17.0788 3.71611 17.0788C4.92227 17.1637 5.55616 18.3097 5.55616 18.3097C6.62521 20.1333 8.36389 19.6058 9.04745 19.2976C9.15475 18.5251 9.46673 17.9995 9.8105 17.7012C7.14383 17.4008 4.34204 16.3774 4.34204 11.8054C4.32551 10.6197 4.76802 9.47305 5.57801 8.60268C5.45481 8.30236 5.04348 7.08923 5.69524 5.44143C5.69524 5.44143 6.7027 5.12135 8.9958 6.66444C10.9627 6.12962 13.0379 6.12962 15.0047 6.66444C17.2958 5.12135 18.3013 5.44143 18.3013 5.44143C18.9551 7.08528 18.5437 8.29841 18.4205 8.60268C19.2331 9.47319 19.6765 10.6218 19.6585 11.8094C19.6585 16.3912 16.8507 17.4008 14.1801 17.6952C14.6093 18.0667 14.9928 18.7918 14.9928 19.9061C14.9928 21.5026 14.9789 22.7868 14.9789 23.18C14.9789 23.4981 15.1955 23.8695 15.8035 23.753C18.5059 22.8557 20.7992 21.0317 22.2731 18.6073C23.747 16.183 24.3055 13.3163 23.8486 10.5201C23.3917 7.7238 21.9493 5.18035 19.7793 3.34461C17.6093 1.50886 14.8533 0.500541 12.0042 0.5H12.0003Z" fill="#191717"/>
+<path d="M4.54444 17.6321C4.5186 17.6914 4.42322 17.7092 4.34573 17.6677C4.26823 17.6262 4.21061 17.5491 4.23843 17.4879C4.26625 17.4266 4.35964 17.4108 4.43714 17.4523C4.51463 17.4938 4.57424 17.5729 4.54444 17.6321Z" fill="#191717"/>
+<path d="M5.03123 18.1714C4.99008 18.192 4.943 18.1978 4.89805 18.1877C4.8531 18.1776 4.81308 18.1523 4.78483 18.1161C4.70734 18.0331 4.69143 17.9185 4.75104 17.8671C4.81066 17.8157 4.91797 17.8395 4.99546 17.9224C5.07296 18.0054 5.09084 18.12 5.03123 18.1714Z" fill="#191717"/>
+<path d="M5.50425 18.857C5.43072 18.9084 5.30553 18.857 5.23598 18.7543C5.21675 18.7359 5.20146 18.7138 5.19101 18.6893C5.18056 18.6649 5.17517 18.6386 5.17517 18.612C5.17517 18.5855 5.18056 18.5592 5.19101 18.5347C5.20146 18.5103 5.21675 18.4882 5.23598 18.4698C5.3095 18.4204 5.4347 18.4698 5.50425 18.5705C5.57379 18.6713 5.57578 18.8057 5.50425 18.857V18.857Z" fill="#191717"/>
+<path d="M6.14612 19.5207C6.08054 19.5939 5.94741 19.5741 5.83812 19.4753C5.72883 19.3765 5.70299 19.2422 5.76857 19.171C5.83414 19.0999 5.96727 19.1197 6.08054 19.2165C6.1938 19.3133 6.21566 19.4496 6.14612 19.5207V19.5207Z" fill="#191717"/>
+<path d="M7.04617 19.9081C7.01637 20.001 6.88124 20.0425 6.74612 20.003C6.611 19.9635 6.52158 19.8528 6.54741 19.758C6.57325 19.6631 6.71036 19.6197 6.84747 19.6631C6.98457 19.7066 7.07201 19.8113 7.04617 19.9081Z" fill="#191717"/>
+<path d="M8.02783 19.9752C8.02783 20.072 7.91656 20.155 7.77349 20.1569C7.63042 20.1589 7.51318 20.0799 7.51318 19.9831C7.51318 19.8863 7.62445 19.8033 7.76752 19.8013C7.91059 19.7993 8.02783 19.8764 8.02783 19.9752Z" fill="#191717"/>
+<path d="M8.9419 19.8232C8.95978 19.92 8.86042 20.0207 8.71735 20.0445C8.57428 20.0682 8.4491 20.0109 8.43121 19.916C8.41333 19.8212 8.51666 19.7185 8.65576 19.6928C8.79485 19.6671 8.92401 19.7264 8.9419 19.8232Z" fill="#191717"/>
+</g>
+<defs>
+<clipPath id="clip0_131_1011">
+<rect width="24" height="24" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git "a/app/\050commonLayout\051/apps/assets/link-gray.svg" "b/app/\050commonLayout\051/apps/assets/link-gray.svg"
new file mode 100644
index 0000000..a293cfc
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/assets/link-gray.svg"
@@ -0,0 +1,3 @@
+<svg width="13" height="14" viewBox="0 0 13 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.41663 3.75033H3.24996C2.96264 3.75033 2.68709 3.86446 2.48393 4.06763C2.28076 4.27079 2.16663 4.54634 2.16663 4.83366V10.2503C2.16663 10.5376 2.28076 10.8132 2.48393 11.0164C2.68709 11.2195 2.96264 11.3337 3.24996 11.3337H8.66663C8.95394 11.3337 9.22949 11.2195 9.43266 11.0164C9.63582 10.8132 9.74996 10.5376 9.74996 10.2503V8.08366M7.58329 2.66699H10.8333M10.8333 2.66699V5.91699M10.8333 2.66699L5.41663 8.08366" stroke="#9CA3AF" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git "a/app/\050commonLayout\051/apps/assets/link.svg" "b/app/\050commonLayout\051/apps/assets/link.svg"
new file mode 100644
index 0000000..2926c28
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/assets/link.svg"
@@ -0,0 +1,3 @@
+<svg width="13" height="14" viewBox="0 0 13 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.41663 3.75008H3.24996C2.96264 3.75008 2.68709 3.86422 2.48393 4.06738C2.28076 4.27055 2.16663 4.5461 2.16663 4.83341V10.2501C2.16663 10.5374 2.28076 10.8129 2.48393 11.0161C2.68709 11.2193 2.96264 11.3334 3.24996 11.3334H8.66663C8.95394 11.3334 9.22949 11.2193 9.43266 11.0161C9.63582 10.8129 9.74996 10.5374 9.74996 10.2501V8.08341M7.58329 2.66675H10.8333M10.8333 2.66675V5.91675M10.8333 2.66675L5.41663 8.08341" stroke="#1C64F2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git "a/app/\050commonLayout\051/apps/assets/right-arrow.svg" "b/app/\050commonLayout\051/apps/assets/right-arrow.svg"
new file mode 100644
index 0000000..a2c1ced
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/assets/right-arrow.svg"
@@ -0,0 +1,3 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7 2.5L10.5 6M10.5 6L7 9.5M10.5 6H1.5" stroke="#1C64F2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git "a/app/\050commonLayout\051/apps/hooks/useAppsQueryState.ts" "b/app/\050commonLayout\051/apps/hooks/useAppsQueryState.ts"
new file mode 100644
index 0000000..dc95a4b
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/hooks/useAppsQueryState.ts"
@@ -0,0 +1,60 @@
+import { type ReadonlyURLSearchParams, usePathname, useRouter, useSearchParams } from 'next/navigation'
+import { useCallback, useEffect, useMemo, useState } from 'react'
+
+type AppsQuery = {
+  tagIDs?: string[]
+  keywords?: string
+  isCreatedByMe?: boolean
+}
+
+// Parse the query parameters from the URL search string.
+function parseParams(params: ReadonlyURLSearchParams): AppsQuery {
+  const tagIDs = params.get('tagIDs')?.split(';')
+  const keywords = params.get('keywords') || undefined
+  const isCreatedByMe = params.get('isCreatedByMe') === 'true'
+  return { tagIDs, keywords, isCreatedByMe }
+}
+
+// Update the URL search string with the given query parameters.
+function updateSearchParams(query: AppsQuery, current: URLSearchParams) {
+  const { tagIDs, keywords, isCreatedByMe } = query || {}
+
+  if (tagIDs && tagIDs.length > 0)
+    current.set('tagIDs', tagIDs.join(';'))
+  else
+    current.delete('tagIDs')
+
+  if (keywords)
+    current.set('keywords', keywords)
+  else
+    current.delete('keywords')
+
+  if (isCreatedByMe)
+    current.set('isCreatedByMe', 'true')
+  else
+    current.delete('isCreatedByMe')
+}
+
+function useAppsQueryState() {
+  const searchParams = useSearchParams()
+  const [query, setQuery] = useState<AppsQuery>(() => parseParams(searchParams))
+
+  const router = useRouter()
+  const pathname = usePathname()
+  const syncSearchParams = useCallback((params: URLSearchParams) => {
+    const search = params.toString()
+    const query = search ? `?${search}` : ''
+    router.push(`${pathname}${query}`, { scroll: false })
+  }, [router, pathname])
+
+  // Update the URL search string whenever the query changes.
+  useEffect(() => {
+    const params = new URLSearchParams(searchParams)
+    updateSearchParams(query, params)
+    syncSearchParams(params)
+  }, [query, searchParams, syncSearchParams])
+
+  return useMemo(() => ({ query, setQuery }), [query])
+}
+
+export default useAppsQueryState
diff --git "a/app/\050commonLayout\051/apps/page.tsx" "b/app/\050commonLayout\051/apps/page.tsx"
new file mode 100644
index 0000000..4a146d9
--- /dev/null
+++ "b/app/\050commonLayout\051/apps/page.tsx"
@@ -0,0 +1,37 @@
+'use client'
+import { useContextSelector } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import { RiDiscordFill, RiGithubFill } from '@remixicon/react'
+import Link from 'next/link'
+import style from '../list.module.css'
+import Apps from './Apps'
+import AppContext from '@/context/app-context'
+import { LicenseStatus } from '@/types/feature'
+import { useEducationInit } from '@/app/education-apply/hooks'
+
+const AppList = () => {
+  const { t } = useTranslation()
+  useEducationInit()
+
+  const systemFeatures = useContextSelector(AppContext, v => v.systemFeatures)
+
+  return (
+    <div className='relative flex h-0 shrink-0 grow flex-col overflow-y-auto bg-background-body'>
+      <Apps />
+      {systemFeatures.license.status === LicenseStatus.NONE && <footer className='shrink-0 grow-0 px-12 py-6'>
+        <h3 className='text-gradient text-xl font-semibold leading-tight'>{t('app.join')}</h3>
+        <p className='system-sm-regular mt-1 text-text-tertiary'>{t('app.communityIntro')}</p>
+        <div className='mt-3 flex items-center gap-2'>
+          <Link className={style.socialMediaLink} target='_blank' rel='noopener noreferrer' href='https://github.com/langgenius/dify'>
+            <RiGithubFill className='h-5 w-5 text-text-tertiary' />
+          </Link>
+          <Link className={style.socialMediaLink} target='_blank' rel='noopener noreferrer' href='https://discord.gg/FngNHpbcY7'>
+            <RiDiscordFill className='h-5 w-5 text-text-tertiary' />
+          </Link>
+        </div>
+      </footer>}
+    </div >
+  )
+}
+
+export default AppList
diff --git "a/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/api/page.tsx" "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/api/page.tsx"
new file mode 100644
index 0000000..167520c
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/api/page.tsx"
@@ -0,0 +1,9 @@
+import React from 'react'
+
+const page = () => {
+  return (
+    <div>dataset detail api</div>
+  )
+}
+
+export default page
diff --git "a/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/\133documentId\135/page.tsx" "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/\133documentId\135/page.tsx"
new file mode 100644
index 0000000..1db6b66
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/\133documentId\135/page.tsx"
@@ -0,0 +1,21 @@
+import React from 'react'
+import MainDetail from '@/app/components/datasets/documents/detail'
+
+export type IDocumentDetailProps = {
+  params: Promise<{ datasetId: string; documentId: string }>
+}
+
+const DocumentDetail = async (props: IDocumentDetailProps) => {
+  const params = await props.params
+
+  const {
+    datasetId,
+    documentId,
+  } = params
+
+  return (
+    <MainDetail datasetId={datasetId} documentId={documentId} />
+  )
+}
+
+export default DocumentDetail
diff --git "a/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/\133documentId\135/settings/page.tsx" "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/\133documentId\135/settings/page.tsx"
new file mode 100644
index 0000000..5395214
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/\133documentId\135/settings/page.tsx"
@@ -0,0 +1,21 @@
+import React from 'react'
+import Settings from '@/app/components/datasets/documents/detail/settings'
+
+export type IProps = {
+  params: Promise<{ datasetId: string; documentId: string }>
+}
+
+const DocumentSettings = async (props: IProps) => {
+  const params = await props.params
+
+  const {
+    datasetId,
+    documentId,
+  } = params
+
+  return (
+    <Settings datasetId={datasetId} documentId={documentId} />
+  )
+}
+
+export default DocumentSettings
diff --git "a/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/create/page.tsx" "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/create/page.tsx"
new file mode 100644
index 0000000..8fd2caa
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/create/page.tsx"
@@ -0,0 +1,20 @@
+import React from 'react'
+import DatasetUpdateForm from '@/app/components/datasets/create'
+
+export type IProps = {
+  params: Promise<{ datasetId: string }>
+}
+
+const Create = async (props: IProps) => {
+  const params = await props.params
+
+  const {
+    datasetId,
+  } = params
+
+  return (
+    <DatasetUpdateForm datasetId={datasetId} />
+  )
+}
+
+export default Create
diff --git "a/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/page.tsx" "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/page.tsx"
new file mode 100644
index 0000000..2ff4631
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/page.tsx"
@@ -0,0 +1,20 @@
+import React from 'react'
+import Main from '@/app/components/datasets/documents'
+
+export type IProps = {
+  params: Promise<{ datasetId: string }>
+}
+
+const Documents = async (props: IProps) => {
+  const params = await props.params
+
+  const {
+    datasetId,
+  } = params
+
+  return (
+    <Main datasetId={datasetId} />
+  )
+}
+
+export default Documents
diff --git "a/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/style.module.css" "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/style.module.css"
new file mode 100644
index 0000000..67a9fe3
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/documents/style.module.css"
@@ -0,0 +1,9 @@
+.logTable td {
+  padding: 7px 8px;
+  box-sizing: border-box;
+  max-width: 200px;
+}
+
+.pagination li {
+  list-style: none;
+}
diff --git "a/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/hitTesting/page.tsx" "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/hitTesting/page.tsx"
new file mode 100644
index 0000000..9a701c6
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/hitTesting/page.tsx"
@@ -0,0 +1,20 @@
+import React from 'react'
+import Main from '@/app/components/datasets/hit-testing'
+
+type Props = {
+  params: Promise<{ datasetId: string }>
+}
+
+const HitTesting = async (props: Props) => {
+  const params = await props.params
+
+  const {
+    datasetId,
+  } = params
+
+  return (
+    <Main datasetId={datasetId} />
+  )
+}
+
+export default HitTesting
diff --git "a/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/layout-main.tsx" "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/layout-main.tsx"
new file mode 100644
index 0000000..5619b1e
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/layout-main.tsx"
@@ -0,0 +1,199 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useMemo } from 'react'
+import { usePathname } from 'next/navigation'
+import useSWR from 'swr'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import {
+  RiEqualizer2Fill,
+  RiEqualizer2Line,
+  RiFileTextFill,
+  RiFileTextLine,
+  RiFocus2Fill,
+  RiFocus2Line,
+} from '@remixicon/react'
+import {
+  PaperClipIcon,
+} from '@heroicons/react/24/outline'
+import { RiApps2AddLine, RiBookOpenLine, RiInformation2Line } from '@remixicon/react'
+import classNames from '@/utils/classnames'
+import { fetchDatasetDetail, fetchDatasetRelatedApps } from '@/service/datasets'
+import type { RelatedAppResponse } from '@/models/datasets'
+import AppSideBar from '@/app/components/app-sidebar'
+import Loading from '@/app/components/base/loading'
+import DatasetDetailContext from '@/context/dataset-detail'
+import { DataSourceType } from '@/models/datasets'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import { LanguagesSupported } from '@/i18n/language'
+import { useStore } from '@/app/components/app/store'
+import { getLocaleOnClient } from '@/i18n'
+import { useAppContext } from '@/context/app-context'
+import Tooltip from '@/app/components/base/tooltip'
+import LinkedAppsPanel from '@/app/components/base/linked-apps-panel'
+
+export type IAppDetailLayoutProps = {
+  children: React.ReactNode
+  params: { datasetId: string }
+}
+
+type IExtraInfoProps = {
+  isMobile: boolean
+  relatedApps?: RelatedAppResponse
+  expand: boolean
+}
+
+const ExtraInfo = ({ isMobile, relatedApps, expand }: IExtraInfoProps) => {
+  const locale = getLocaleOnClient()
+  const [isShowTips, { toggle: toggleTips, set: setShowTips }] = useBoolean(!isMobile)
+  const { t } = useTranslation()
+
+  const hasRelatedApps = relatedApps?.data && relatedApps?.data?.length > 0
+  const relatedAppsTotal = relatedApps?.data?.length || 0
+
+  useEffect(() => {
+    setShowTips(!isMobile)
+  }, [isMobile, setShowTips])
+
+  return <div>
+    {hasRelatedApps && (
+      <>
+        {!isMobile && (
+          <Tooltip
+            position='right'
+            noDecoration
+            needsDelay
+            popupContent={
+              <LinkedAppsPanel
+                relatedApps={relatedApps.data}
+                isMobile={isMobile}
+              />
+            }
+          >
+            <div className='system-xs-medium-uppercase inline-flex cursor-pointer items-center space-x-1 text-text-secondary'>
+              <span>{relatedAppsTotal || '--'} {t('common.datasetMenus.relatedApp')}</span>
+              <RiInformation2Line className='h-4 w-4' />
+            </div>
+          </Tooltip>
+        )}
+
+        {isMobile && <div className={classNames('uppercase text-xs text-text-tertiary font-medium pb-2 pt-4', 'flex items-center justify-center !px-0 gap-1')}>
+          {relatedAppsTotal || '--'}
+          <PaperClipIcon className='h-4 w-4 text-text-secondary' />
+        </div>}
+      </>
+    )}
+    {!hasRelatedApps && !expand && (
+      <Tooltip
+        position='right'
+        noDecoration
+        needsDelay
+        popupContent={
+          <div className='w-[240px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-4'>
+            <div className='inline-flex rounded-lg border-[0.5px] border-components-panel-border-subtle bg-background-default-subtle p-2'>
+              <RiApps2AddLine className='h-4 w-4 text-text-tertiary' />
+            </div>
+            <div className='my-2 text-xs text-text-tertiary'>{t('common.datasetMenus.emptyTip')}</div>
+            <a
+              className='mt-2 inline-flex cursor-pointer items-center text-xs text-text-accent'
+              href={
+                locale === LanguagesSupported[1]
+                  ? 'https://docs.dify.ai/zh-hans/guides/knowledge-base/integrate-knowledge-within-application'
+                  : 'https://docs.dify.ai/guides/knowledge-base/integrate-knowledge-within-application'
+              }
+              target='_blank' rel='noopener noreferrer'
+            >
+              <RiBookOpenLine className='mr-1 text-text-accent' />
+              {t('common.datasetMenus.viewDoc')}
+            </a>
+          </div>
+        }
+      >
+        <div className='system-xs-medium-uppercase inline-flex cursor-pointer items-center space-x-1 text-text-secondary'>
+          <span>{t('common.datasetMenus.noRelatedApp')}</span>
+          <RiInformation2Line className='h-4 w-4' />
+        </div>
+      </Tooltip>
+    )}
+  </div>
+}
+
+const DatasetDetailLayout: FC<IAppDetailLayoutProps> = (props) => {
+  const {
+    children,
+    params: { datasetId },
+  } = props
+  const pathname = usePathname()
+  const hideSideBar = /documents\/create$/.test(pathname)
+  const { t } = useTranslation()
+  const { isCurrentWorkspaceDatasetOperator } = useAppContext()
+
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+
+  const { data: datasetRes, error, mutate: mutateDatasetRes } = useSWR({
+    url: 'fetchDatasetDetail',
+    datasetId,
+  }, apiParams => fetchDatasetDetail(apiParams.datasetId))
+
+  const { data: relatedApps } = useSWR({
+    action: 'fetchDatasetRelatedApps',
+    datasetId,
+  }, apiParams => fetchDatasetRelatedApps(apiParams.datasetId))
+
+  const navigation = useMemo(() => {
+    const baseNavigation = [
+      { name: t('common.datasetMenus.hitTesting'), href: `/datasets/${datasetId}/hitTesting`, icon: RiFocus2Line, selectedIcon: RiFocus2Fill },
+      { name: t('common.datasetMenus.settings'), href: `/datasets/${datasetId}/settings`, icon: RiEqualizer2Line, selectedIcon: RiEqualizer2Fill },
+    ]
+
+    if (datasetRes?.provider !== 'external') {
+      baseNavigation.unshift({
+        name: t('common.datasetMenus.documents'),
+        href: `/datasets/${datasetId}/documents`,
+        icon: RiFileTextLine,
+        selectedIcon: RiFileTextFill,
+      })
+    }
+    return baseNavigation
+  }, [datasetRes?.provider, datasetId, t])
+
+  useEffect(() => {
+    if (datasetRes)
+      document.title = `${datasetRes.name || 'Dataset'} - Dify`
+  }, [datasetRes])
+
+  const setAppSiderbarExpand = useStore(state => state.setAppSiderbarExpand)
+
+  useEffect(() => {
+    const localeMode = localStorage.getItem('app-detail-collapse-or-expand') || 'expand'
+    const mode = isMobile ? 'collapse' : 'expand'
+    setAppSiderbarExpand(isMobile ? mode : localeMode)
+  }, [isMobile, setAppSiderbarExpand])
+
+  if (!datasetRes && !error)
+    return <Loading type='app' />
+
+  return (
+    <div className='flex grow overflow-hidden'>
+      {!hideSideBar && <AppSideBar
+        title={datasetRes?.name || '--'}
+        icon={datasetRes?.icon || 'https://static.dify.ai/images/dataset-default-icon.png'}
+        icon_background={datasetRes?.icon_background || '#F5F5F5'}
+        desc={datasetRes?.description || '--'}
+        isExternal={datasetRes?.provider === 'external'}
+        navigation={navigation}
+        extraInfo={!isCurrentWorkspaceDatasetOperator ? mode => <ExtraInfo isMobile={mode === 'collapse'} relatedApps={relatedApps} expand={mode === 'collapse'} /> : undefined}
+        iconType={datasetRes?.data_source_type === DataSourceType.NOTION ? 'notion' : 'dataset'}
+      />}
+      <DatasetDetailContext.Provider value={{
+        indexingTechnique: datasetRes?.indexing_technique,
+        dataset: datasetRes,
+        mutateDatasetRes: () => mutateDatasetRes(),
+      }}>
+        <div className="grow overflow-hidden bg-background-default-subtle">{children}</div>
+      </DatasetDetailContext.Provider>
+    </div>
+  )
+}
+export default React.memo(DatasetDetailLayout)
diff --git "a/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/layout.tsx" "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/layout.tsx"
new file mode 100644
index 0000000..a8772f7
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/layout.tsx"
@@ -0,0 +1,17 @@
+import Main from './layout-main'
+
+const DatasetDetailLayout = async (
+  props: {
+    children: React.ReactNode
+    params: Promise<{ datasetId: string }>
+  },
+) => {
+  const params = await props.params
+
+  const {
+    children,
+  } = props
+
+  return <Main params={(await params)}>{children}</Main>
+}
+export default DatasetDetailLayout
diff --git "a/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/settings/page.tsx" "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/settings/page.tsx"
new file mode 100644
index 0000000..d9a196d
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/\133datasetId\135/settings/page.tsx"
@@ -0,0 +1,20 @@
+import React from 'react'
+import { getLocaleOnServer, useTranslation as translate } from '@/i18n/server'
+import Form from '@/app/components/datasets/settings/form'
+
+const Settings = async () => {
+  const locale = await getLocaleOnServer()
+  const { t } = await translate(locale, 'dataset-settings')
+
+  return (
+    <div className='h-full overflow-y-auto'>
+      <div className='px-6 py-3'>
+        <div className='system-xl-semibold mb-1 text-text-primary'>{t('title')}</div>
+        <div className='system-sm-regular text-text-tertiary'>{t('desc')}</div>
+      </div>
+      <Form />
+    </div>
+  )
+}
+
+export default Settings
diff --git "a/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/layout.tsx" "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/layout.tsx"
new file mode 100644
index 0000000..ccbc58f
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/\050datasetDetailLayout\051/layout.tsx"
@@ -0,0 +1,16 @@
+import type { FC } from 'react'
+import React from 'react'
+
+export type IDatasetDetail = {
+  children: React.ReactNode
+}
+
+const AppDetail: FC<IDatasetDetail> = ({ children }) => {
+  return (
+    <>
+      {children}
+    </>
+  )
+}
+
+export default React.memo(AppDetail)
diff --git "a/app/\050commonLayout\051/datasets/Container.tsx" "b/app/\050commonLayout\051/datasets/Container.tsx"
new file mode 100644
index 0000000..b484c04
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/Container.tsx"
@@ -0,0 +1,141 @@
+'use client'
+
+// Libraries
+import { useEffect, useMemo, useRef, useState } from 'react'
+import { useRouter } from 'next/navigation'
+import { useTranslation } from 'react-i18next'
+import { useBoolean, useDebounceFn } from 'ahooks'
+import { useQuery } from '@tanstack/react-query'
+
+// Components
+import ExternalAPIPanel from '../../components/datasets/external-api/external-api-panel'
+import Datasets from './Datasets'
+import DatasetFooter from './DatasetFooter'
+import ApiServer from '../../components/develop/ApiServer'
+import Doc from './Doc'
+import TabSliderNew from '@/app/components/base/tab-slider-new'
+import TagManagementModal from '@/app/components/base/tag-management'
+import TagFilter from '@/app/components/base/tag-management/filter'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import { ApiConnectionMod } from '@/app/components/base/icons/src/vender/solid/development'
+import CheckboxWithLabel from '@/app/components/datasets/create/website/base/checkbox-with-label'
+
+// Services
+import { fetchDatasetApiBaseUrl } from '@/service/datasets'
+
+// Hooks
+import { useTabSearchParams } from '@/hooks/use-tab-searchparams'
+import { useStore as useTagStore } from '@/app/components/base/tag-management/store'
+import { useAppContext } from '@/context/app-context'
+import { useExternalApiPanel } from '@/context/external-api-panel-context'
+
+const Container = () => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const { currentWorkspace, isCurrentWorkspaceOwner } = useAppContext()
+  const showTagManagementModal = useTagStore(s => s.showTagManagementModal)
+  const { showExternalApiPanel, setShowExternalApiPanel } = useExternalApiPanel()
+  const [includeAll, { toggle: toggleIncludeAll }] = useBoolean(false)
+
+  document.title = `${t('dataset.knowledge')} - Dify`
+
+  const options = useMemo(() => {
+    return [
+      { value: 'dataset', text: t('dataset.datasets') },
+      ...(currentWorkspace.role === 'dataset_operator' ? [] : [{ value: 'api', text: t('dataset.datasetsApi') }]),
+    ]
+  }, [currentWorkspace.role, t])
+
+  const [activeTab, setActiveTab] = useTabSearchParams({
+    defaultTab: 'dataset',
+  })
+  const containerRef = useRef<HTMLDivElement>(null)
+  const { data } = useQuery(
+    {
+      queryKey: ['datasetApiBaseInfo'],
+      queryFn: () => fetchDatasetApiBaseUrl('/datasets/api-base-info'),
+      enabled: activeTab !== 'dataset',
+    },
+  )
+
+  const [keywords, setKeywords] = useState('')
+  const [searchKeywords, setSearchKeywords] = useState('')
+  const { run: handleSearch } = useDebounceFn(() => {
+    setSearchKeywords(keywords)
+  }, { wait: 500 })
+  const handleKeywordsChange = (value: string) => {
+    setKeywords(value)
+    handleSearch()
+  }
+  const [tagFilterValue, setTagFilterValue] = useState<string[]>([])
+  const [tagIDs, setTagIDs] = useState<string[]>([])
+  const { run: handleTagsUpdate } = useDebounceFn(() => {
+    setTagIDs(tagFilterValue)
+  }, { wait: 500 })
+  const handleTagsChange = (value: string[]) => {
+    setTagFilterValue(value)
+    handleTagsUpdate()
+  }
+
+  useEffect(() => {
+    if (currentWorkspace.role === 'normal')
+      return router.replace('/apps')
+  }, [currentWorkspace, router])
+
+  return (
+    <div ref={containerRef} className='scroll-container relative flex grow flex-col overflow-y-auto bg-background-body'>
+      <div className='sticky top-0 z-10 flex flex-wrap items-center justify-between gap-y-2 bg-background-body px-12 pb-2 pt-4 leading-[56px]'>
+        <TabSliderNew
+          value={activeTab}
+          onChange={newActiveTab => setActiveTab(newActiveTab)}
+          options={options}
+        />
+        {activeTab === 'dataset' && (
+          <div className='flex items-center justify-center gap-2'>
+            {isCurrentWorkspaceOwner && <CheckboxWithLabel
+              isChecked={includeAll}
+              onChange={toggleIncludeAll}
+              label={t('dataset.allKnowledge')}
+              labelClassName='system-md-regular text-text-secondary'
+              className='mr-2'
+              tooltip={t('dataset.allKnowledgeDescription') as string}
+            />}
+            <TagFilter type='knowledge' value={tagFilterValue} onChange={handleTagsChange} />
+            <Input
+              showLeftIcon
+              showClearIcon
+              wrapperClassName='w-[200px]'
+              value={keywords}
+              onChange={e => handleKeywordsChange(e.target.value)}
+              onClear={() => handleKeywordsChange('')}
+            />
+            <div className="h-4 w-[1px] bg-divider-regular" />
+            <Button
+              className='shadows-shadow-xs gap-0.5'
+              onClick={() => setShowExternalApiPanel(true)}
+            >
+              <ApiConnectionMod className='h-4 w-4 text-components-button-secondary-text' />
+              <div className='system-sm-medium flex items-center justify-center gap-1 px-0.5 text-components-button-secondary-text'>{t('dataset.externalAPIPanelTitle')}</div>
+            </Button>
+          </div>
+        )}
+        {activeTab === 'api' && data && <ApiServer apiBaseUrl={data.api_base_url || ''} />}
+      </div>
+      {activeTab === 'dataset' && (
+        <>
+          <Datasets containerRef={containerRef} tags={tagIDs} keywords={searchKeywords} includeAll={includeAll} />
+          <DatasetFooter />
+          {showTagManagementModal && (
+            <TagManagementModal type='knowledge' show={showTagManagementModal} />
+          )}
+        </>
+      )}
+      {activeTab === 'api' && data && <Doc apiBaseUrl={data.api_base_url || ''} />}
+
+      {showExternalApiPanel && <ExternalAPIPanel onClose={() => setShowExternalApiPanel(false)} />}
+    </div>
+  )
+}
+
+export default Container
diff --git "a/app/\050commonLayout\051/datasets/DatasetCard.tsx" "b/app/\050commonLayout\051/datasets/DatasetCard.tsx"
new file mode 100644
index 0000000..e0012b4
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/DatasetCard.tsx"
@@ -0,0 +1,240 @@
+'use client'
+
+import { useContext } from 'use-context-selector'
+import { useRouter } from 'next/navigation'
+import { useCallback, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiMoreFill } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import Confirm from '@/app/components/base/confirm'
+import { ToastContext } from '@/app/components/base/toast'
+import { checkIsUsedInApp, deleteDataset } from '@/service/datasets'
+import type { DataSet } from '@/models/datasets'
+import Tooltip from '@/app/components/base/tooltip'
+import { Folder } from '@/app/components/base/icons/src/vender/solid/files'
+import type { HtmlContentProps } from '@/app/components/base/popover'
+import CustomPopover from '@/app/components/base/popover'
+import Divider from '@/app/components/base/divider'
+import RenameDatasetModal from '@/app/components/datasets/rename-modal'
+import type { Tag } from '@/app/components/base/tag-management/constant'
+import TagSelector from '@/app/components/base/tag-management/selector'
+import CornerLabel from '@/app/components/base/corner-label'
+import { useAppContext } from '@/context/app-context'
+
+export type DatasetCardProps = {
+  dataset: DataSet
+  onSuccess?: () => void
+}
+
+const DatasetCard = ({
+  dataset,
+  onSuccess,
+}: DatasetCardProps) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const { push } = useRouter()
+  const EXTERNAL_PROVIDER = 'external' as const
+
+  const { isCurrentWorkspaceDatasetOperator } = useAppContext()
+  const [tags, setTags] = useState<Tag[]>(dataset.tags)
+
+  const [showRenameModal, setShowRenameModal] = useState(false)
+  const [showConfirmDelete, setShowConfirmDelete] = useState(false)
+  const [confirmMessage, setConfirmMessage] = useState<string>('')
+  const isExternalProvider = (provider: string): boolean => provider === EXTERNAL_PROVIDER
+  const detectIsUsedByApp = useCallback(async () => {
+    try {
+      const { is_using: isUsedByApp } = await checkIsUsedInApp(dataset.id)
+      setConfirmMessage(isUsedByApp ? t('dataset.datasetUsedByApp')! : t('dataset.deleteDatasetConfirmContent')!)
+    }
+    catch (e: any) {
+      const res = await e.json()
+      notify({ type: 'error', message: res?.message || 'Unknown error' })
+    }
+
+    setShowConfirmDelete(true)
+  }, [dataset.id, notify, t])
+  const onConfirmDelete = useCallback(async () => {
+    try {
+      await deleteDataset(dataset.id)
+      notify({ type: 'success', message: t('dataset.datasetDeleted') })
+      if (onSuccess)
+        onSuccess()
+    }
+    catch {
+    }
+    setShowConfirmDelete(false)
+  }, [dataset.id, notify, onSuccess, t])
+
+  const Operations = (props: HtmlContentProps & { showDelete: boolean }) => {
+    const onMouseLeave = async () => {
+      props.onClose?.()
+    }
+    const onClickRename = async (e: React.MouseEvent<HTMLDivElement>) => {
+      e.stopPropagation()
+      props.onClick?.()
+      e.preventDefault()
+      setShowRenameModal(true)
+    }
+    const onClickDelete = async (e: React.MouseEvent<HTMLDivElement>) => {
+      e.stopPropagation()
+      props.onClick?.()
+      e.preventDefault()
+      detectIsUsedByApp()
+    }
+    return (
+      <div className="relative w-full py-1" onMouseLeave={onMouseLeave}>
+        <div className='mx-1 flex h-8 cursor-pointer items-center gap-2 rounded-lg px-3 py-[6px] hover:bg-state-base-hover' onClick={onClickRename}>
+          <span className='text-sm text-text-secondary'>{t('common.operation.settings')}</span>
+        </div>
+        {props.showDelete && (
+          <>
+            <Divider className="!my-1" />
+            <div
+              className='group mx-1 flex h-8 cursor-pointer items-center gap-2 rounded-lg px-3 py-[6px] hover:bg-state-destructive-hover'
+              onClick={onClickDelete}
+            >
+              <span className={cn('text-sm text-text-secondary', 'group-hover:text-text-destructive')}>
+                {t('common.operation.delete')}
+              </span>
+            </div>
+          </>
+        )}
+      </div>
+    )
+  }
+
+  useEffect(() => {
+    setTags(dataset.tags)
+  }, [dataset])
+
+  return (
+    <>
+      <div
+        className='group relative col-span-1 flex min-h-[160px] cursor-pointer flex-col rounded-xl border-[0.5px] border-solid border-components-card-border bg-components-card-bg shadow-sm transition-all duration-200 ease-in-out hover:shadow-lg'
+        data-disable-nprogress={true}
+        onClick={(e) => {
+          e.preventDefault()
+          isExternalProvider(dataset.provider)
+            ? push(`/datasets/${dataset.id}/hitTesting`)
+            : push(`/datasets/${dataset.id}/documents`)
+        }}
+      >
+        {isExternalProvider(dataset.provider) && <CornerLabel label='External' className='absolute right-0' labelClassName='rounded-tr-xl' />}
+        <div className='flex h-[66px] shrink-0 grow-0 items-center gap-3 px-[14px] pb-3 pt-[14px]'>
+          <div className={cn(
+            'flex shrink-0 items-center justify-center rounded-md border-[0.5px] border-[#E0EAFF] bg-[#F5F8FF] p-2.5',
+            !dataset.embedding_available && 'opacity-50 hover:opacity-100',
+          )}>
+            <Folder className='h-5 w-5 text-[#444CE7]' />
+          </div>
+          <div className='w-0 grow py-[1px]'>
+            <div className='flex items-center text-sm font-semibold leading-5 text-text-secondary'>
+              <div className={cn('truncate', !dataset.embedding_available && 'text-text-tertiary opacity-50 hover:opacity-100')} title={dataset.name}>{dataset.name}</div>
+              {!dataset.embedding_available && (
+                <Tooltip
+                  popupContent={t('dataset.unavailableTip')}
+                >
+                  <span className='ml-1 inline-flex w-max shrink-0 rounded-md border border-divider-regular px-1 text-xs font-normal leading-[18px] text-text-tertiary'>{t('dataset.unavailable')}</span>
+                </Tooltip>
+              )}
+            </div>
+            <div className='mt-[1px] flex items-center text-xs leading-[18px] text-text-tertiary'>
+              <div
+                className={cn('truncate', (!dataset.embedding_available || !dataset.document_count) && 'opacity-50')}
+                title={dataset.provider === 'external' ? `${dataset.app_count}${t('dataset.appCount')}` : `${dataset.document_count}${t('dataset.documentCount')} 路 ${Math.round(dataset.word_count / 1000)}${t('dataset.wordCount')} 路 ${dataset.app_count}${t('dataset.appCount')}`}
+              >
+                {dataset.provider === 'external'
+                  ? <>
+                    <span>{dataset.app_count}{t('dataset.appCount')}</span>
+                  </>
+                  : <>
+                    <span>{dataset.document_count}{t('dataset.documentCount')}</span>
+                    <span className='mx-0.5 w-1 shrink-0 text-text-tertiary'>路</span>
+                    <span>{Math.round(dataset.word_count / 1000)}{t('dataset.wordCount')}</span>
+                    <span className='mx-0.5 w-1 shrink-0 text-text-tertiary'>路</span>
+                    <span>{dataset.app_count}{t('dataset.appCount')}</span>
+                  </>
+                }
+              </div>
+            </div>
+          </div>
+        </div>
+        <div
+          className={cn(
+            'mb-2 max-h-[72px] grow px-[14px] text-xs leading-normal text-text-tertiary group-hover:line-clamp-2 group-hover:max-h-[36px]',
+            tags.length ? 'line-clamp-2' : 'line-clamp-4',
+            !dataset.embedding_available && 'opacity-50 hover:opacity-100',
+          )}
+          title={dataset.description}>
+          {dataset.description}
+        </div>
+        <div className={cn(
+          'mt-4 h-[42px] shrink-0 items-center pb-[6px] pl-[14px] pr-[6px] pt-1',
+          tags.length ? 'flex' : '!hidden group-hover:!flex',
+        )}>
+          <div className={cn('flex w-0 grow items-center gap-1', !dataset.embedding_available && 'opacity-50 hover:opacity-100')} onClick={(e) => {
+            e.stopPropagation()
+            e.preventDefault()
+          }}>
+            <div className={cn(
+              'mr-[41px] w-full grow group-hover:!mr-0 group-hover:!block',
+              tags.length ? '!block' : '!hidden',
+            )}>
+              <TagSelector
+                position='bl'
+                type='knowledge'
+                targetID={dataset.id}
+                value={tags.map(tag => tag.id)}
+                selectedTags={tags}
+                onCacheUpdate={setTags}
+                onChange={onSuccess}
+              />
+            </div>
+          </div>
+          <div className='mx-1 !hidden h-[14px] w-[1px] shrink-0 bg-divider-regular group-hover:!flex' />
+          <div className='!hidden shrink-0 group-hover:!flex'>
+            <CustomPopover
+              htmlContent={<Operations showDelete={!isCurrentWorkspaceDatasetOperator} />}
+              position="br"
+              trigger="click"
+              btnElement={
+                <div
+                  className='flex h-8 w-8 cursor-pointer items-center justify-center rounded-md'
+                >
+                  <RiMoreFill className='h-4 w-4 text-text-secondary' />
+                </div>
+              }
+              btnClassName={open =>
+                cn(
+                  open ? '!bg-black/5 !shadow-none' : '!bg-transparent',
+                  'h-8 w-8 rounded-md border-none !p-2 hover:!bg-black/5',
+                )
+              }
+              className={'!z-20 h-fit !w-[128px]'}
+            />
+          </div>
+        </div>
+      </div>
+      {showRenameModal && (
+        <RenameDatasetModal
+          show={showRenameModal}
+          dataset={dataset}
+          onClose={() => setShowRenameModal(false)}
+          onSuccess={onSuccess}
+        />
+      )}
+      {showConfirmDelete && (
+        <Confirm
+          title={t('dataset.deleteDatasetConfirmTitle')}
+          content={confirmMessage}
+          isShow={showConfirmDelete}
+          onConfirm={onConfirmDelete}
+          onCancel={() => setShowConfirmDelete(false)}
+        />
+      )}
+    </>
+  )
+}
+
+export default DatasetCard
diff --git "a/app/\050commonLayout\051/datasets/DatasetFooter.tsx" "b/app/\050commonLayout\051/datasets/DatasetFooter.tsx"
new file mode 100644
index 0000000..1f29700
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/DatasetFooter.tsx"
@@ -0,0 +1,19 @@
+'use client'
+
+import { useTranslation } from 'react-i18next'
+
+const DatasetFooter = () => {
+  const { t } = useTranslation()
+
+  return (
+    <footer className='shrink-0 grow-0 px-12 py-6'>
+      <h3 className='text-gradient text-xl font-semibold leading-tight'>{t('dataset.didYouKnow')}</h3>
+      <p className='mt-1 text-sm font-normal leading-tight text-text-secondary'>
+        {t('dataset.intro1')}<span className='inline-flex items-center gap-1 text-text-accent'>{t('dataset.intro2')}</span>{t('dataset.intro3')}<br />
+        {t('dataset.intro4')}<span className='inline-flex items-center gap-1 text-text-accent'>{t('dataset.intro5')}</span>{t('dataset.intro6')}
+      </p>
+    </footer>
+  )
+}
+
+export default DatasetFooter
diff --git "a/app/\050commonLayout\051/datasets/Datasets.tsx" "b/app/\050commonLayout\051/datasets/Datasets.tsx"
new file mode 100644
index 0000000..6383513
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/Datasets.tsx"
@@ -0,0 +1,98 @@
+'use client'
+
+import { useCallback, useEffect, useRef } from 'react'
+import useSWRInfinite from 'swr/infinite'
+import { debounce } from 'lodash-es'
+import { useTranslation } from 'react-i18next'
+import NewDatasetCard from './NewDatasetCard'
+import DatasetCard from './DatasetCard'
+import type { DataSetListResponse, FetchDatasetsParams } from '@/models/datasets'
+import { fetchDatasets } from '@/service/datasets'
+import { useAppContext } from '@/context/app-context'
+
+const getKey = (
+  pageIndex: number,
+  previousPageData: DataSetListResponse,
+  tags: string[],
+  keyword: string,
+  includeAll: boolean,
+) => {
+  if (!pageIndex || previousPageData.has_more) {
+    const params: FetchDatasetsParams = {
+      url: 'datasets',
+      params: {
+        page: pageIndex + 1,
+        limit: 30,
+        include_all: includeAll,
+      },
+    }
+    if (tags.length)
+      params.params.tag_ids = tags
+    if (keyword)
+      params.params.keyword = keyword
+    return params
+  }
+  return null
+}
+
+type Props = {
+  containerRef: React.RefObject<HTMLDivElement>
+  tags: string[]
+  keywords: string
+  includeAll: boolean
+}
+
+const Datasets = ({
+  containerRef,
+  tags,
+  keywords,
+  includeAll,
+}: Props) => {
+  const { isCurrentWorkspaceEditor } = useAppContext()
+  const { data, isLoading, setSize, mutate } = useSWRInfinite(
+    (pageIndex: number, previousPageData: DataSetListResponse) => getKey(pageIndex, previousPageData, tags, keywords, includeAll),
+    fetchDatasets,
+    { revalidateFirstPage: false, revalidateAll: true },
+  )
+  const loadingStateRef = useRef(false)
+  const anchorRef = useRef<HTMLAnchorElement>(null)
+
+  const { t } = useTranslation()
+
+  useEffect(() => {
+    loadingStateRef.current = isLoading
+    document.title = `${t('dataset.knowledge')} - Dify`
+  }, [isLoading, t])
+
+  const onScroll = useCallback(
+    debounce(() => {
+      if (!loadingStateRef.current && containerRef.current && anchorRef.current) {
+        const { scrollTop, clientHeight } = containerRef.current
+        const anchorOffset = anchorRef.current.offsetTop
+        if (anchorOffset - scrollTop - clientHeight < 100)
+          setSize(size => size + 1)
+      }
+    }, 50),
+    [setSize],
+  )
+
+  useEffect(() => {
+    const currentContainer = containerRef.current
+    currentContainer?.addEventListener('scroll', onScroll)
+    return () => {
+      currentContainer?.removeEventListener('scroll', onScroll)
+      onScroll.cancel()
+    }
+  }, [onScroll])
+
+  return (
+    <nav className='grid shrink-0 grow grid-cols-1 content-start gap-4 px-12 pt-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4'>
+      { isCurrentWorkspaceEditor && <NewDatasetCard ref={anchorRef} /> }
+      {data?.map(({ data: datasets }) => datasets.map(dataset => (
+        <DatasetCard key={dataset.id} dataset={dataset} onSuccess={mutate} />),
+      ))}
+    </nav>
+  )
+}
+
+export default Datasets
diff --git "a/app/\050commonLayout\051/datasets/Doc.tsx" "b/app/\050commonLayout\051/datasets/Doc.tsx"
new file mode 100644
index 0000000..efdfe15
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/Doc.tsx"
@@ -0,0 +1,131 @@
+'use client'
+
+import { useEffect, useMemo, useState } from 'react'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import { RiListUnordered } from '@remixicon/react'
+import TemplateEn from './template/template.en.mdx'
+import TemplateZh from './template/template.zh.mdx'
+import TemplateJa from './template/template.ja.mdx'
+import I18n from '@/context/i18n'
+import { LanguagesSupported } from '@/i18n/language'
+import useTheme from '@/hooks/use-theme'
+import { Theme } from '@/types/app'
+import cn from '@/utils/classnames'
+
+type DocProps = {
+  apiBaseUrl: string
+}
+
+const Doc = ({ apiBaseUrl }: DocProps) => {
+  const { locale } = useContext(I18n)
+  const { t } = useTranslation()
+  const [toc, setToc] = useState<Array<{ href: string; text: string }>>([])
+  const [isTocExpanded, setIsTocExpanded] = useState(false)
+  const { theme } = useTheme()
+
+  // Set initial TOC expanded state based on screen width
+  useEffect(() => {
+    const mediaQuery = window.matchMedia('(min-width: 1280px)')
+    setIsTocExpanded(mediaQuery.matches)
+  }, [])
+
+  // Extract TOC from article content
+  useEffect(() => {
+    const extractTOC = () => {
+      const article = document.querySelector('article')
+      if (article) {
+        const headings = article.querySelectorAll('h2')
+        const tocItems = Array.from(headings).map((heading) => {
+          const anchor = heading.querySelector('a')
+          if (anchor) {
+            return {
+              href: anchor.getAttribute('href') || '',
+              text: anchor.textContent || '',
+            }
+          }
+          return null
+        }).filter((item): item is { href: string; text: string } => item !== null)
+        setToc(tocItems)
+      }
+    }
+
+    setTimeout(extractTOC, 0)
+  }, [locale])
+
+  // Handle TOC item click
+  const handleTocClick = (e: React.MouseEvent<HTMLAnchorElement>, item: { href: string; text: string }) => {
+    e.preventDefault()
+    const targetId = item.href.replace('#', '')
+    const element = document.getElementById(targetId)
+    if (element) {
+      const scrollContainer = document.querySelector('.scroll-container')
+      if (scrollContainer) {
+        const headerOffset = -40
+        const elementTop = element.offsetTop - headerOffset
+        scrollContainer.scrollTo({
+          top: elementTop,
+          behavior: 'smooth',
+        })
+      }
+    }
+  }
+
+  const Template = useMemo(() => {
+    switch (locale) {
+      case LanguagesSupported[1]:
+        return <TemplateZh apiBaseUrl={apiBaseUrl} />
+      case LanguagesSupported[7]:
+        return <TemplateJa apiBaseUrl={apiBaseUrl} />
+      default:
+        return <TemplateEn apiBaseUrl={apiBaseUrl} />
+    }
+  }, [apiBaseUrl, locale])
+
+  return (
+    <div className="flex">
+      <div className={`fixed right-20 top-32 z-10 transition-all ${isTocExpanded ? 'w-64' : 'w-10'}`}>
+        {isTocExpanded
+          ? (
+            <nav className="toc max-h-[calc(100vh-150px)] w-full overflow-y-auto rounded-lg bg-components-panel-bg p-4 shadow-md">
+              <div className="mb-4 flex items-center justify-between">
+                <h3 className="text-lg font-semibold text-text-primary">{t('appApi.develop.toc')}</h3>
+                <button
+                  onClick={() => setIsTocExpanded(false)}
+                  className="text-text-tertiary hover:text-text-secondary"
+                >
+                  鉁�
+                </button>
+              </div>
+              <ul className="space-y-2">
+                {toc.map((item, index) => (
+                  <li key={index}>
+                    <a
+                      href={item.href}
+                      className="text-text-secondary transition-colors duration-200 hover:text-text-primary hover:underline"
+                      onClick={e => handleTocClick(e, item)}
+                    >
+                      {item.text}
+                    </a>
+                  </li>
+                ))}
+              </ul>
+            </nav>
+          )
+          : (
+            <button
+              onClick={() => setIsTocExpanded(true)}
+              className="flex h-10 w-10 items-center justify-center rounded-full bg-components-button-secondary-bg shadow-md transition-colors duration-200 hover:bg-components-button-secondary-bg-hover"
+            >
+              <RiListUnordered className="h-6 w-6 text-components-button-secondary-text" />
+            </button>
+          )}
+      </div>
+      <article className={cn('prose-xl prose mx-1 rounded-t-xl bg-background-default px-4 pt-16 sm:mx-12', theme === Theme.dark && 'prose-invert')}>
+        {Template}
+      </article>
+    </div>
+  )
+}
+
+export default Doc
diff --git "a/app/\050commonLayout\051/datasets/NewDatasetCard.tsx" "b/app/\050commonLayout\051/datasets/NewDatasetCard.tsx"
new file mode 100644
index 0000000..ddc48c2
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/NewDatasetCard.tsx"
@@ -0,0 +1,42 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import Link from 'next/link'
+import {
+  RiAddLine,
+  RiArrowRightLine,
+} from '@remixicon/react'
+
+const CreateAppCard = (
+  {
+    ref,
+    ..._
+  },
+) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='bg-background-default-dimm flex min-h-[160px] flex-col rounded-xl border-[0.5px]
+      border-components-panel-border transition-all duration-200 ease-in-out'
+    >
+      <Link ref={ref} className='group flex grow cursor-pointer items-start p-4' href={'/datasets/create'}>
+        <div className='flex items-center gap-3'>
+          <div className='flex h-10 w-10 items-center justify-center rounded-lg border border-dashed border-divider-regular bg-background-default-lighter
+            p-2 group-hover:border-solid group-hover:border-effects-highlight group-hover:bg-background-default-dodge'
+          >
+            <RiAddLine className='h-4 w-4 text-text-tertiary group-hover:text-text-accent'/>
+          </div>
+          <div className='system-md-semibold text-text-secondary group-hover:text-text-accent'>{t('dataset.createDataset')}</div>
+        </div>
+      </Link>
+      <div className='system-xs-regular p-4 pt-0 text-text-tertiary'>{t('dataset.createDatasetIntro')}</div>
+      <Link className='group flex cursor-pointer items-center gap-1 rounded-b-xl border-t-[0.5px] border-divider-subtle p-4' href={'datasets/connect'}>
+        <div className='system-xs-medium text-text-tertiary group-hover:text-text-accent'>{t('dataset.connectDataset')}</div>
+        <RiArrowRightLine className='h-3.5 w-3.5 text-text-tertiary group-hover:text-text-accent' />
+      </Link>
+    </div>
+  )
+}
+
+CreateAppCard.displayName = 'CreateAppCard'
+
+export default CreateAppCard
diff --git "a/app/\050commonLayout\051/datasets/connect/page.tsx" "b/app/\050commonLayout\051/datasets/connect/page.tsx"
new file mode 100644
index 0000000..724c506
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/connect/page.tsx"
@@ -0,0 +1,8 @@
+import React from 'react'
+import ExternalKnowledgeBaseConnector from '@/app/components/datasets/external-knowledge-base/connector'
+
+const ExternalKnowledgeBaseCreation = () => {
+  return <ExternalKnowledgeBaseConnector />
+}
+
+export default ExternalKnowledgeBaseCreation
diff --git "a/app/\050commonLayout\051/datasets/create/page.tsx" "b/app/\050commonLayout\051/datasets/create/page.tsx"
new file mode 100644
index 0000000..663a830
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/create/page.tsx"
@@ -0,0 +1,12 @@
+import React from 'react'
+import DatasetUpdateForm from '@/app/components/datasets/create'
+
+type Props = {}
+
+const DatasetCreation = async (props: Props) => {
+  return (
+    <DatasetUpdateForm />
+  )
+}
+
+export default DatasetCreation
diff --git "a/app/\050commonLayout\051/datasets/layout.tsx" "b/app/\050commonLayout\051/datasets/layout.tsx"
new file mode 100644
index 0000000..aecb537
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/layout.tsx"
@@ -0,0 +1,14 @@
+'use client'
+
+import { ExternalApiPanelProvider } from '@/context/external-api-panel-context'
+import { ExternalKnowledgeApiProvider } from '@/context/external-knowledge-api-context'
+
+export default function DatasetsLayout({ children }: { children: React.ReactNode }) {
+  return (
+    <ExternalKnowledgeApiProvider>
+      <ExternalApiPanelProvider>
+        {children}
+      </ExternalApiPanelProvider>
+    </ExternalKnowledgeApiProvider>
+  )
+}
diff --git "a/app/\050commonLayout\051/datasets/page.tsx" "b/app/\050commonLayout\051/datasets/page.tsx"
new file mode 100644
index 0000000..678de47
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/page.tsx"
@@ -0,0 +1,7 @@
+import Container from './Container'
+
+const AppList = async () => {
+  return <Container />
+}
+
+export default AppList
diff --git "a/app/\050commonLayout\051/datasets/store.ts" "b/app/\050commonLayout\051/datasets/store.ts"
new file mode 100644
index 0000000..40b7b15
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/store.ts"
@@ -0,0 +1,11 @@
+import { create } from 'zustand'
+
+type DatasetStore = {
+  showExternalApiPanel: boolean
+  setShowExternalApiPanel: (show: boolean) => void
+}
+
+export const useDatasetStore = create<DatasetStore>(set => ({
+  showExternalApiPanel: false,
+  setShowExternalApiPanel: show => set({ showExternalApiPanel: show }),
+}))
diff --git "a/app/\050commonLayout\051/datasets/template/template.en.mdx" "b/app/\050commonLayout\051/datasets/template/template.en.mdx"
new file mode 100644
index 0000000..7f28610
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/template/template.en.mdx"
@@ -0,0 +1,2352 @@
+{/**
+  * @typedef Props
+  * @property {string} apiBaseUrl
+  */}
+
+import { CodeGroup } from '@/app/components/develop/code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstruction, Paragraph } from '@/app/components/develop/md.tsx'
+
+# Knowledge API
+
+<div>
+  ### Authentication
+
+  Service API of Dify authenticates using an `API-Key`.
+
+  It is suggested that developers store the `API-Key` in the backend instead of sharing or storing it in the client side to avoid the leakage of the `API-Key`, which may lead to property loss.
+
+  All API requests should include your `API-Key` in the **`Authorization`** HTTP Header, as shown below:
+
+  <CodeGroup title="Code">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+
+    ```
+  </CodeGroup>
+</div>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/document/create-by-text'
+  method='POST'
+  title='Create a Document from Text'
+  name='#create-by-text'
+/>
+<Row>
+  <Col>
+    This API is based on an existing knowledge and creates a new document through text based on this knowledge.
+
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        Document name
+      </Property>
+      <Property name='text' type='string' key='text'>
+        Document content
+      </Property>
+      <Property name='indexing_technique' type='string' key='indexing_technique'>
+        Index mode
+          - <code>high_quality</code> High quality: embedding using embedding model, built as vector database index
+          - <code>economy</code> Economy: Build using inverted index of keyword table index
+      </Property>
+      <Property name='doc_form' type='string' key='doc_form'>
+        Format of indexed content
+          - <code>text_model</code> Text documents are directly embedded; `economy` mode defaults to using this form
+          - <code>hierarchical_model</code> Parent-child mode
+          - <code>qa_model</code> Q&A Mode: Generates Q&A pairs for segmented documents and then embeds the questions
+      </Property>
+      <Property name='doc_language' type='string' key='doc_language'>
+        In Q&A mode, specify the language of the document, for example: <code>English</code>, <code>Chinese</code>
+      </Property>
+      <Property name='process_rule' type='object' key='process_rule'>
+        Processing rules
+          - <code>mode</code> (string) Cleaning, segmentation mode, automatic / custom
+          - <code>rules</code> (object) Custom rules (in automatic mode, this field is empty)
+            - <code>pre_processing_rules</code> (array[object]) Preprocessing rules
+              - <code>id</code> (string) Unique identifier for the preprocessing rule
+                - enumerate
+                  - <code>remove_extra_spaces</code> Replace consecutive spaces, newlines, tabs
+                  - <code>remove_urls_emails</code> Delete URL, email address
+              - <code>enabled</code> (bool) Whether to select this rule or not. If no document ID is passed in, it represents the default value.
+            - <code>segmentation</code> (object) Segmentation rules
+              - <code>separator</code> Custom segment identifier, currently only allows one delimiter to be set. Default is \n
+              - <code>max_tokens</code> Maximum length (token) defaults to 1000
+            - <code>parent_mode</code> Retrieval mode of parent chunks: <code>full-doc</code> full text retrieval / <code>paragraph</code> paragraph retrieval
+            - <code>subchunk_segmentation</code> (object) Child chunk rules
+              - <code>separator</code> Segmentation identifier. Currently, only one delimiter is allowed. The default is <code>***</code>
+              - <code>max_tokens</code> The maximum length (tokens) must be validated to be shorter than the length of the parent chunk
+              - <code>chunk_overlap</code> Define the overlap between adjacent chunks (optional)
+      </Property>
+      <PropertyInstruction>When no parameters are set for the knowledge base, the first upload requires the following parameters to be provided; if not provided, the default parameters will be used.</PropertyInstruction>
+      <Property name='retrieval_model' type='object' key='retrieval_model'>
+        Retrieval model
+          - <code>search_method</code> (string) Search method
+            - <code>hybrid_search</code> Hybrid search
+            - <code>semantic_search</code> Semantic search
+            - <code>full_text_search</code> Full-text search
+          - <code>reranking_enable</code> (bool) Whether to enable reranking
+          - <code>reranking_mode</code> (object) Rerank model configuration
+            - <code>reranking_provider_name</code> (string) Rerank model provider
+            - <code>reranking_model_name</code> (string) Rerank model name
+          - <code>top_k</code> (int) Number of results to return
+          - <code>score_threshold_enabled</code> (bool) Whether to enable score threshold
+          - <code>score_threshold</code> (float) Score threshold
+      </Property>
+      <Property name='embedding_model' type='string' key='embedding_model'>
+        Embedding model name
+      </Property>
+      <Property name='embedding_model_provider' type='string' key='embedding_model_provider'>
+        Embedding model provider
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/document/create-by-text"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/document/create-by-text' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "text","text": "text","indexing_technique": "high_quality","process_rule": {"mode": "automatic"}}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/document/create-by-text' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "name": "text",
+        "text": "text",
+        "indexing_technique": "high_quality",
+        "process_rule": {
+            "mode": "automatic"
+        }
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "document": {
+        "id": "",
+        "position": 1,
+        "data_source_type": "upload_file",
+        "data_source_info": {
+            "upload_file_id": ""
+        },
+        "dataset_process_rule_id": "",
+        "name": "text.txt",
+        "created_from": "api",
+        "created_by": "",
+        "created_at": 1695690280,
+        "tokens": 0,
+        "indexing_status": "waiting",
+        "error": null,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "archived": false,
+        "display_status": "queuing",
+        "word_count": 0,
+        "hit_count": 0,
+        "doc_form": "text_model"
+      },
+      "batch": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/document/create-by-file'
+  method='POST'
+  title='Create a Document from a File'
+  name='#create-by-file'
+/>
+<Row>
+  <Col>
+    This API is based on an existing knowledge and creates a new document through a file based on this knowledge.
+
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='data' type='multipart/form-data json string' key='data'>
+        - <code>original_document_id</code> Source document ID (optional)
+          - Used to re-upload the document or modify the document cleaning and segmentation configuration. The missing information is copied from the source document
+          - The source document cannot be an archived document
+          - When original_document_id is passed in, the update operation is performed on behalf of the document. process_rule is a fillable item. If not filled in, the segmentation method of the source document will be used by default
+          - When original_document_id is not passed in, the new operation is performed on behalf of the document, and process_rule is required
+
+        - <code>indexing_technique</code> Index mode
+          - <code>high_quality</code> High quality: embedding using embedding model, built as vector database index
+          - <code>economy</code> Economy: Build using inverted index of keyword table index
+
+        - <code>doc_form</code> Format of indexed content
+          - <code>text_model</code> Text documents are directly embedded; `economy` mode defaults to using this form
+          - <code>hierarchical_model</code> Parent-child mode
+          - <code>qa_model</code> Q&A Mode: Generates Q&A pairs for segmented documents and then embeds the questions
+
+        - <code>doc_language</code> In Q&A mode, specify the language of the document, for example: <code>English</code>, <code>Chinese</code>
+
+        - <code>process_rule</code> Processing rules
+          - <code>mode</code> (string) Cleaning, segmentation mode, automatic / custom
+          - <code>rules</code> (object) Custom rules (in automatic mode, this field is empty)
+            - <code>pre_processing_rules</code> (array[object]) Preprocessing rules
+              - <code>id</code> (string) Unique identifier for the preprocessing rule
+                - enumerate
+                  - <code>remove_extra_spaces</code> Replace consecutive spaces, newlines, tabs
+                  - <code>remove_urls_emails</code> Delete URL, email address
+              - <code>enabled</code> (bool) Whether to select this rule or not. If no document ID is passed in, it represents the default value.
+            - <code>segmentation</code> (object) Segmentation rules
+              - <code>separator</code> Custom segment identifier, currently only allows one delimiter to be set. Default is \n
+              - <code>max_tokens</code> Maximum length (token) defaults to 1000
+            - <code>parent_mode</code> Retrieval mode of parent chunks: <code>full-doc</code> full text retrieval / <code>paragraph</code> paragraph retrieval
+            - <code>subchunk_segmentation</code> (object) Child chunk rules
+              - <code>separator</code> Segmentation identifier. Currently, only one delimiter is allowed. The default is <code>***</code>
+              - <code>max_tokens</code> The maximum length (tokens) must be validated to be shorter than the length of the parent chunk
+              - <code>chunk_overlap</code> Define the overlap between adjacent chunks (optional)
+      </Property>
+      <Property name='file' type='multipart/form-data' key='file'>
+        Files that need to be uploaded.
+      </Property>
+      <PropertyInstruction>When no parameters are set for the knowledge base, the first upload requires the following parameters to be provided; if not provided, the default parameters will be used.</PropertyInstruction>
+      <Property name='retrieval_model' type='object' key='retrieval_model'>
+        Retrieval model
+          - <code>search_method</code> (string) Search method
+            - <code>hybrid_search</code> Hybrid search
+            - <code>semantic_search</code> Semantic search
+            - <code>full_text_search</code> Full-text search
+          - <code>reranking_enable</code> (bool) Whether to enable reranking
+          - <code>reranking_mode</code> (object) Rerank model configuration
+            - <code>reranking_provider_name</code> (string) Rerank model provider
+            - <code>reranking_model_name</code> (string) Rerank model name
+          - <code>top_k</code> (int) Number of results to return
+          - <code>score_threshold_enabled</code> (bool) Whether to enable score threshold
+          - <code>score_threshold</code> (float) Score threshold
+      </Property>
+      <Property name='embedding_model' type='string' key='embedding_model'>
+        Embedding model name
+      </Property>
+      <Property name='embedding_model_provider' type='string' key='embedding_model_provider'>
+        Embedding model provider
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/document/create-by-file"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/document/create-by-file' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'data="{"indexing_technique":"high_quality","process_rule":{"rules":{"pre_processing_rules":[{"id":"remove_extra_spaces","enabled":true},{"id":"remove_urls_emails","enabled":true}],"segmentation":{"separator":"###","max_tokens":500}},"mode":"custom"}}";type=text/plain' \\\n--form 'file=@"/path/to/file"'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/document/create-by-file' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'data="{\"name\":\"Dify\",\"indexing_technique\":\"high_quality\",\"process_rule\":{\"rules\":{\"pre_processing_rules\":[{\"id\":\"remove_extra_spaces\",\"enabled\":true},{\"id\":\"remove_urls_emails\",\"enabled\":true}],\"segmentation\":{\"separator\":\"###\",\"max_tokens\":500}},\"mode\":\"custom\"}}";type=text/plain' \
+    --form 'file=@"/path/to/file"'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "document": {
+        "id": "",
+        "position": 1,
+        "data_source_type": "upload_file",
+        "data_source_info": {
+          "upload_file_id": ""
+        },
+        "dataset_process_rule_id": "",
+        "name": "Dify.txt",
+        "created_from": "api",
+        "created_by": "",
+        "created_at": 1695308667,
+        "tokens": 0,
+        "indexing_status": "waiting",
+        "error": null,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "archived": false,
+        "display_status": "queuing",
+        "word_count": 0,
+        "hit_count": 0,
+        "doc_form": "text_model"
+      },
+      "batch": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets'
+  method='POST'
+  title='Create an Empty Knowledge Base'
+  name='#create_empty_dataset'
+/>
+<Row>
+  <Col>
+    ### Request Body
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        Knowledge name
+      </Property>
+      <Property name='description' type='string' key='description'>
+        Knowledge description (optional)
+      </Property>
+      <Property name='indexing_technique' type='string' key='indexing_technique'>
+        Index technique (optional)
+        If this is not set, embedding_model, embedding_model_provider and retrieval_model will be set to null
+          - <code>high_quality</code> High quality
+          - <code>economy</code> Economy
+      </Property>
+      <Property name='permission' type='string' key='permission'>
+        Permission
+          - <code>only_me</code> Only me
+          - <code>all_team_members</code> All team members
+          - <code>partial_members</code> Partial members
+      </Property>
+      <Property name='provider' type='string' key='provider'>
+        Provider (optional, default: vendor)
+          - <code>vendor</code> Vendor
+          - <code>external</code> External knowledge
+      </Property>
+      <Property name='external_knowledge_api_id' type='str' key='external_knowledge_api_id'>
+        External knowledge API ID (optional)
+      </Property>
+      <Property name='external_knowledge_id' type='str' key='external_knowledge_id'>
+        External knowledge ID (optional)
+      </Property>
+      <Property name='embedding_model' type='str' key='embedding_model'>
+        Embedding model name (optional)
+      </Property>
+      <Property name='embedding_model_provider' type='str' key='embedding_model_provider'>
+        Embedding model provider name (optional)
+      </Property>
+      <Property name='retrieval_model' type='object' key='retrieval_model'>
+        Retrieval model (optional)
+          - <code>search_method</code> (string) Search method
+            - <code>hybrid_search</code> Hybrid search
+            - <code>semantic_search</code> Semantic search
+            - <code>full_text_search</code> Full-text search
+          - <code>reranking_enable</code> (bool) Whether to enable reranking
+          - <code>reranking_model</code> (object) Rerank model configuration
+              - <code>reranking_provider_name</code> (string) Rerank model provider
+              - <code>reranking_model_name</code> (string) Rerank model name
+          - <code>top_k</code> (int) Number of results to return
+          - <code>score_threshold_enabled</code> (bool) Whether to enable score threshold
+          - <code>score_threshold</code> (float) Score threshold
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "name", "permission": "only_me"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${apiBaseUrl}/v1/datasets' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+      "name": "name",
+      "permission": "only_me"
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "",
+      "name": "name",
+      "description": null,
+      "provider": "vendor",
+      "permission": "only_me",
+      "data_source_type": null,
+      "indexing_technique": null,
+      "app_count": 0,
+      "document_count": 0,
+      "word_count": 0,
+      "created_by": "",
+      "created_at": 1695636173,
+      "updated_by": "",
+      "updated_at": 1695636173,
+      "embedding_model": null,
+      "embedding_model_provider": null,
+      "embedding_available": null
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets'
+  method='GET'
+  title='Get Knowledge Base List'
+  name='#dataset_list'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        Search keyword, optional
+      </Property>
+      <Property name='tag_ids' type='array[string]' key='tag_ids'>
+        Tag ID list, optional
+      </Property>
+      <Property name='page' type='string' key='page'>
+        Page number, optional, default 1
+      </Property>
+      <Property name='limit' type='string' key='limit'>
+        Number of items returned, optional, default 20, range 1-100
+      </Property>
+      <Property name='include_all' type='boolean' key='include_all'>
+        Whether to include all datasets (only effective for owners), optional, defaults to false
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets?page=1&limit=20' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [
+        {
+          "id": "",
+          "name": "name",
+          "description": "desc",
+          "permission": "only_me",
+          "data_source_type": "upload_file",
+          "indexing_technique": "",
+          "app_count": 2,
+          "document_count": 10,
+          "word_count": 1200,
+          "created_by": "",
+          "created_at": "",
+          "updated_by": "",
+          "updated_at": ""
+        },
+        ...
+      ],
+      "has_more": true,
+      "limit": 20,
+      "total": 50,
+      "page": 1
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}'
+  method='GET'
+  title='Get knowledge base details by knowledge base ID'
+  name='#view_dataset'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge Base ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets/{dataset_id}"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "eaedb485-95ac-4ffd-ab1e-18da6d676a2f",
+      "name": "Test Knowledge Base",
+      "description": "",
+      "provider": "vendor",
+      "permission": "only_me",
+      "data_source_type": null,
+      "indexing_technique": null,
+      "app_count": 0,
+      "document_count": 0,
+      "word_count": 0,
+      "created_by": "e99a1635-f725-4951-a99a-1daaaa76cfc6",
+      "created_at": 1735620612,
+      "updated_by": "e99a1635-f725-4951-a99a-1daaaa76cfc6",
+      "updated_at": 1735620612,
+      "embedding_model": null,
+      "embedding_model_provider": null,
+      "embedding_available": true,
+      "retrieval_model_dict": {
+        "search_method": "semantic_search",
+        "reranking_enable": false,
+        "reranking_mode": null,
+        "reranking_model": {
+          "reranking_provider_name": "",
+          "reranking_model_name": ""
+        },
+        "weights": null,
+        "top_k": 2,
+        "score_threshold_enabled": false,
+        "score_threshold": null
+      },
+      "tags": [],
+      "doc_form": null,
+      "external_knowledge_info": {
+        "external_knowledge_id": null,
+        "external_knowledge_api_id": null,
+        "external_knowledge_api_name": null,
+        "external_knowledge_api_endpoint": null
+      },
+      "external_retrieval_model": {
+        "top_k": 2,
+        "score_threshold": 0.0,
+        "score_threshold_enabled": null
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}'
+  method='PATCH'
+  title='Update knowledge base'
+  name='#update_dataset'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge Base ID
+      </Property>
+      <Property name='indexing_technique' type='string' key='indexing_technique'>
+        Index technique (optional)
+          - <code>high_quality</code> High quality
+          - <code>economy</code> Economy
+      </Property>
+      <Property name='permission' type='string' key='permission'>
+        Permission
+          - <code>only_me</code> Only me
+          - <code>all_team_members</code> All team members
+          - <code>partial_members</code> Partial members
+      </Property>
+      <Property name='embedding_model_provider' type='string' key='embedding_model_provider'>
+        Specified embedding model provider, must be set up in the system first, corresponding to the provider field(Optional)
+      </Property>
+      <Property name='embedding_model' type='string' key='embedding_model'>
+        Specified embedding model, corresponding to the model field(Optional)
+      </Property>
+      <Property name='retrieval_model' type='object' key='retrieval_model'>
+        Retrieval model (optional, if not filled, it will be recalled according to the default method)
+        - <code>search_method</code> (text) Search method: One of the following four keywords is required
+          - <code>keyword_search</code> Keyword search
+          - <code>semantic_search</code> Semantic search
+          - <code>full_text_search</code> Full-text search
+          - <code>hybrid_search</code> Hybrid search
+        - <code>reranking_enable</code> (bool) Whether to enable reranking, required if the search mode is semantic_search or hybrid_search (optional)
+        - <code>reranking_mode</code> (object) Rerank model configuration, required if reranking is enabled
+            - <code>reranking_provider_name</code> (string) Rerank model provider
+            - <code>reranking_model_name</code> (string) Rerank model name
+        - <code>weights</code> (float) Semantic search weight setting in hybrid search mode
+        - <code>top_k</code> (integer) Number of results to return (optional)
+        - <code>score_threshold_enabled</code> (bool) Whether to enable score threshold
+        - <code>score_threshold</code> (float) Score threshold
+      </Property>
+      <Property name='partial_member_list' type='array' key='partial_member_list'>
+        Partial member list(Optional)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="PATCH"
+      label="/datasets/{dataset_id}"
+      targetCode={`curl --location --request PATCH '${props.apiBaseUrl}/datasets/{dataset_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{
+        "name": "Test Knowledge Base", 
+        "indexing_technique": "high_quality", 
+        "permission": "only_me", 
+        "embedding_model_provider": "zhipuai", 
+        "embedding_model": "embedding-3", 
+        "retrieval_model": {
+          "search_method": "keyword_search",
+          "reranking_enable": false,
+          "reranking_mode": null,
+          "reranking_model": {
+              "reranking_provider_name": "",
+              "reranking_model_name": ""
+          },
+          "weights": null,
+          "top_k": 1,
+          "score_threshold_enabled": false,
+          "score_threshold": null
+        }, 
+        "partial_member_list": []
+      }'
+    `}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request PATCH '${props.apiBaseUrl}/datasets/{dataset_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+      "name": "Test Knowledge Base", 
+      "indexing_technique": "high_quality", 
+      "permission": "only_me", 
+      "embedding_model_provider": "zhipuai", 
+      "embedding_model": "embedding-3", 
+      "retrieval_model": {
+        "search_method": "keyword_search",
+        "reranking_enable": false,
+        "reranking_mode": null,
+        "reranking_model": {
+            "reranking_provider_name": "",
+            "reranking_model_name": ""
+        },
+        "weights": null,
+        "top_k": 1,
+        "score_threshold_enabled": false,
+        "score_threshold": null
+      }, 
+      "partial_member_list": []
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "eaedb485-95ac-4ffd-ab1e-18da6d676a2f",
+      "name": "Test Knowledge Base",
+      "description": "",
+      "provider": "vendor",
+      "permission": "only_me",
+      "data_source_type": null,
+      "indexing_technique": "high_quality",
+      "app_count": 0,
+      "document_count": 0,
+      "word_count": 0,
+      "created_by": "e99a1635-f725-4951-a99a-1daaaa76cfc6",
+      "created_at": 1735620612,
+      "updated_by": "e99a1635-f725-4951-a99a-1daaaa76cfc6",
+      "updated_at": 1735622679,
+      "embedding_model": "embedding-3",
+      "embedding_model_provider": "zhipuai",
+      "embedding_available": null,
+      "retrieval_model_dict": {
+          "search_method": "semantic_search",
+          "reranking_enable": false,
+          "reranking_mode": null,
+          "reranking_model": {
+              "reranking_provider_name": "",
+              "reranking_model_name": ""
+          },
+          "weights": null,
+          "top_k": 2,
+          "score_threshold_enabled": false,
+          "score_threshold": null
+      },
+      "tags": [],
+      "doc_form": null,
+      "external_knowledge_info": {
+          "external_knowledge_id": null,
+          "external_knowledge_api_id": null,
+          "external_knowledge_api_name": null,
+          "external_knowledge_api_endpoint": null
+      },
+      "external_retrieval_model": {
+          "top_k": 2,
+          "score_threshold": 0.0,
+          "score_threshold_enabled": null
+      },
+      "partial_member_list": []
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}'
+  method='DELETE'
+  title='Delete a Knowledge Base'
+  name='#delete_dataset'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="DELETE"
+      label="/datasets/{dataset_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/update-by-text'
+  method='POST'
+  title='Update a Document with Text'
+  name='#update-by-text'
+/>
+<Row>
+  <Col>
+    This API is based on an existing knowledge and updates the document through text based on this knowledge.
+
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        Document ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        Document name (optional)
+      </Property>
+      <Property name='text' type='string' key='text'>
+        Document content (optional)
+      </Property>
+      <Property name='process_rule' type='object' key='process_rule'>
+        Processing rules
+          - <code>mode</code> (string) Cleaning, segmentation mode, automatic / custom
+          - <code>rules</code> (object) Custom rules (in automatic mode, this field is empty)
+            - <code>pre_processing_rules</code> (array[object]) Preprocessing rules
+              - <code>id</code> (string) Unique identifier for the preprocessing rule
+                - enumerate
+                  - <code>remove_extra_spaces</code> Replace consecutive spaces, newlines, tabs
+                  - <code>remove_urls_emails</code> Delete URL, email address
+              - <code>enabled</code> (bool) Whether to select this rule or not. If no document ID is passed in, it represents the default value.
+            - <code>segmentation</code> (object) Segmentation rules
+              - <code>separator</code> Custom segment identifier, currently only allows one delimiter to be set. Default is \n
+              - <code>max_tokens</code> Maximum length (token) defaults to 1000
+            - <code>parent_mode</code> Retrieval mode of parent chunks: <code>full-doc</code> full text retrieval / <code>paragraph</code> paragraph retrieval
+            - <code>subchunk_segmentation</code> (object) Child chunk rules
+              - <code>separator</code> Segmentation identifier. Currently, only one delimiter is allowed. The default is <code>***</code>
+              - <code>max_tokens</code> The maximum length (tokens) must be validated to be shorter than the length of the parent chunk
+              - <code>chunk_overlap</code> Define the overlap between adjacent chunks (optional)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/update-by-text"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/update-by-text' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "name","text": "text"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/update-by-text' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "name": "name",
+        "text": "text"
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "document": {
+        "id": "",
+        "position": 1,
+        "data_source_type": "upload_file",
+        "data_source_info": {
+          "upload_file_id": ""
+        },
+        "dataset_process_rule_id": "",
+        "name": "name.txt",
+        "created_from": "api",
+        "created_by": "",
+        "created_at": 1695308667,
+        "tokens": 0,
+        "indexing_status": "waiting",
+        "error": null,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "archived": false,
+        "display_status": "queuing",
+        "word_count": 0,
+        "hit_count": 0,
+        "doc_form": "text_model"
+      },
+      "batch": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/update-by-file'
+  method='POST'
+  title='Update a Document with a File'
+  name='#update-by-file'
+/>
+<Row>
+  <Col>
+    This API is based on an existing knowledge, and updates documents through files based on this knowledge
+
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        Document ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        Document name (optional)
+      </Property>
+      <Property name='file' type='multipart/form-data' key='file'>
+        Files to be uploaded
+      </Property>
+      <Property name='process_rule' type='object' key='process_rule'>
+        Processing rules
+          - <code>mode</code> (string) Cleaning, segmentation mode, automatic / custom
+          - <code>rules</code> (object) Custom rules (in automatic mode, this field is empty)
+            - <code>pre_processing_rules</code> (array[object]) Preprocessing rules
+              - <code>id</code> (string) Unique identifier for the preprocessing rule
+                - enumerate
+                  - <code>remove_extra_spaces</code> Replace consecutive spaces, newlines, tabs
+                  - <code>remove_urls_emails</code> Delete URL, email address
+              - <code>enabled</code> (bool) Whether to select this rule or not. If no document ID is passed in, it represents the default value.
+            - <code>segmentation</code> (object) Segmentation rules
+              - <code>separator</code> Custom segment identifier, currently only allows one delimiter to be set. Default is \n
+              - <code>max_tokens</code> Maximum length (token) defaults to 1000
+            - <code>parent_mode</code> Retrieval mode of parent chunks: <code>full-doc</code> full text retrieval / <code>paragraph</code> paragraph retrieval
+            - <code>subchunk_segmentation</code> (object) Child chunk rules
+              - <code>separator</code> Segmentation identifier. Currently, only one delimiter is allowed. The default is <code>***</code>
+              - <code>max_tokens</code> The maximum length (tokens) must be validated to be shorter than the length of the parent chunk
+              - <code>chunk_overlap</code> Define the overlap between adjacent chunks (optional)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/update-by-file"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/update-by-file' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'data="{"name":"Dify","indexing_technique":"high_quality","process_rule":{"rules":{"pre_processing_rules":[{"id":"remove_extra_spaces","enabled":true},{"id":"remove_urls_emails","enabled":true}],"segmentation":{"separator":"###","max_tokens":500}},"mode":"custom"}}";type=text/plain' \\\n--form 'file=@"/path/to/file"'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/update-by-file' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'data="{\"name\":\"Dify\",\"indexing_technique\":\"high_quality\",\"process_rule\":{\"rules\":{\"pre_processing_rules\":[{\"id\":\"remove_extra_spaces\",\"enabled\":true},{\"id\":\"remove_urls_emails\",\"enabled\":true}],\"segmentation\":{\"separator\":\"###\",\"max_tokens\":500}},\"mode\":\"custom\"}}";type=text/plain' \
+    --form 'file=@"/path/to/file"'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "document": {
+        "id": "",
+        "position": 1,
+        "data_source_type": "upload_file",
+        "data_source_info": {
+          "upload_file_id": ""
+        },
+        "dataset_process_rule_id": "",
+        "name": "Dify.txt",
+        "created_from": "api",
+        "created_by": "",
+        "created_at": 1695308667,
+        "tokens": 0,
+        "indexing_status": "waiting",
+        "error": null,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "archived": false,
+        "display_status": "queuing",
+        "word_count": 0,
+        "hit_count": 0,
+        "doc_form": "text_model"
+      },
+      "batch": "20230921150427533684"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{batch}/indexing-status'
+  method='GET'
+  title='Get Document Embedding Status (Progress)'
+  name='#indexing_status'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='batch' type='string' key='batch'>
+        Batch number of uploaded documents
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents/{batch}/indexing-status"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{batch}/indexing-status' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{batch}/indexing-status' \
+    --header 'Authorization: Bearer {api_key}' \
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data":[{
+        "id": "",
+        "indexing_status": "indexing",
+        "processing_started_at": 1681623462.0,
+        "parsing_completed_at": 1681623462.0,
+        "cleaning_completed_at": 1681623462.0,
+        "splitting_completed_at": 1681623462.0,
+        "completed_at": null,
+        "paused_at": null,
+        "error": null,
+        "stopped_at": null,
+        "completed_segments": 24,
+        "total_segments": 100
+      }]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}'
+  method='DELETE'
+  title='Delete a Document'
+  name='#delete_document'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        Document ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="DELETE"
+      label="/datasets/{dataset_id}/documents/{document_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents'
+  method='GET'
+  title='Get the Document List of a Knowledge Base'
+  name='#dataset_document_list'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+    </Properties>
+
+    ### Query
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        Search keywords, currently only search document names (optional)
+      </Property>
+      <Property name='page' type='string' key='page'>
+        Page number (optional)
+      </Property>
+      <Property name='limit' type='string' key='limit'>
+        Number of items returned, default 20, range 1-100 (optional)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents' \
+    --header 'Authorization: Bearer {api_key}' \
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [
+        {
+          "id": "",
+          "position": 1,
+          "data_source_type": "file_upload",
+          "data_source_info": null,
+          "dataset_process_rule_id": null,
+          "name": "dify",
+          "created_from": "",
+          "created_by": "",
+          "created_at": 1681623639,
+          "tokens": 0,
+          "indexing_status": "waiting",
+          "error": null,
+          "enabled": true,
+          "disabled_at": null,
+          "disabled_by": null,
+          "archived": false
+        },
+      ],
+      "has_more": false,
+      "limit": 20,
+      "total": 9,
+      "page": 1
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments'
+  method='POST'
+  title='Add Chunks to a Document'
+  name='#create_new_segment'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        Document ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='segments' type='object list' key='segments'>
+        - <code>content</code> (text) Text content / question content, required
+        - <code>answer</code> (text) Answer content, if the mode of the knowledge is Q&A mode, pass the value (optional)
+        - <code>keywords</code> (list) Keywords (optional)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"segments": [{"content": "1","answer": "1","keywords": ["a"]}]}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+      "segments": [
+        {
+          "content": "1",
+          "answer": "1",
+          "keywords": ["a"]
+        }
+      ]
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [{
+        "id": "",
+        "position": 1,
+        "document_id": "",
+        "content": "1",
+        "answer": "1",
+        "word_count": 25,
+        "tokens": 0,
+        "keywords": [
+          "a"
+        ],
+        "index_node_id": "",
+        "index_node_hash": "",
+        "hit_count": 0,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }],
+      "doc_form": "text_model"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments'
+  method='GET'
+  title='Get Chunks from a Document'
+  name='#get_segment'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        Document ID
+      </Property>
+    </Properties>
+
+     ### Query
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        Keyword (optional)
+      </Property>
+      <Property name='status' type='string' key='status'>
+        Search status, completed
+      </Property>
+      <Property name='page' type='string' key='page'>
+        Page number (optional)
+      </Property>
+      <Property name='limit' type='string' key='limit'>
+        Number of items returned, default 20, range 1-100 (optional)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [{
+        "id": "",
+        "position": 1,
+        "document_id": "",
+        "content": "1",
+        "answer": "1",
+        "word_count": 25,
+        "tokens": 0,
+        "keywords": [
+            "a"
+        ],
+        "index_node_id": "",
+        "index_node_hash": "",
+        "hit_count": 0,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }],
+      "doc_form": "text_model",
+      "has_more": false,
+      "limit": 20,
+      "total": 9,
+      "page": 1
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}'
+  method='DELETE'
+  title='Delete a Chunk in a Document'
+  name='#delete_segment'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        Document ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        Document Segment ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="DELETE"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}'
+  method='POST'
+  title='Update a Chunk in a Document'
+  name='#update_segment'
+/>
+<Row>
+  <Col>
+    ### POST
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        Document ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        Document Segment ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='segment' type='object' key='segment'>
+        - <code>content</code> (text) Text content / question content, required
+        - <code>answer</code> (text) Answer content, passed if the knowledge is in Q&A mode (optional)
+        - <code>keywords</code> (list) Keyword (optional)
+        - <code>enabled</code> (bool) False / true (optional)
+        - <code>regenerate_child_chunks</code> (bool) Whether to regenerate child chunks (optional)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'\\\n--data-raw '{\"segment\": {\"content\": \"1\",\"answer\": \"1\", \"keywords\": [\"a\"], \"enabled\": false}}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+      "segment": {
+          "content": "1",
+          "answer": "1",
+          "keywords": ["a"],
+          "enabled": false
+      }
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": {
+        "id": "",
+        "position": 1,
+        "document_id": "",
+        "content": "1",
+        "answer": "1",
+        "word_count": 25,
+        "tokens": 0,
+        "keywords": [
+            "a"
+        ],
+        "index_node_id": "",
+        "index_node_hash": "",
+        "hit_count": 0,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      },
+      "doc_form": "text_model"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks'
+  method='POST'
+  title='Create Child Chunk'
+  name='#create_child_chunk'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        Document ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        Segment ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='content' type='string' key='content'>
+        Child chunk content
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"content": "Child chunk content"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "content": "Child chunk content"
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": {
+        "id": "",
+        "segment_id": "",
+        "content": "Child chunk content",
+        "word_count": 25,
+        "tokens": 0,
+        "index_node_id": "",
+        "index_node_hash": "",
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks'
+  method='GET'
+  title='Get Child Chunks'
+  name='#get_child_chunks'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        Document ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        Segment ID
+      </Property>
+    </Properties>
+
+    ### Query
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        Search keyword (optional)
+      </Property>
+      <Property name='page' type='integer' key='page'>
+        Page number (optional, default: 1)
+      </Property>
+      <Property name='limit' type='integer' key='limit'>
+        Items per page (optional, default: 20, max: 100)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks?page=1&limit=20' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [{
+        "id": "",
+        "segment_id": "",
+        "content": "Child chunk content",
+        "word_count": 25,
+        "tokens": 0,
+        "index_node_id": "",
+        "index_node_hash": "",
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }],
+      "total": 1,
+      "total_pages": 1,
+      "page": 1,
+      "limit": 20
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}'
+  method='DELETE'
+  title='Delete Child Chunk'
+  name='#delete_child_chunk'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        Document ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        Segment ID
+      </Property>
+      <Property name='child_chunk_id' type='string' key='child_chunk_id'>
+        Child Chunk ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="DELETE"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/segments/{segment_id}/child_chunks/{child_chunk_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/segments/{segment_id}/child_chunks/{child_chunk_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}'
+  method='PATCH'
+  title='Update Child Chunk'
+  name='#update_child_chunk'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        Document ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        Segment ID
+      </Property>
+      <Property name='child_chunk_id' type='string' key='child_chunk_id'>
+        Child Chunk ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='content' type='string' key='content'>
+        Child chunk content
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="PATCH"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}"
+      targetCode={`curl --location --request PATCH '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"content": "Updated child chunk content"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request PATCH '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "content": "Updated child chunk content"
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": {
+        "id": "",
+        "segment_id": "",
+        "content": "Updated child chunk content",
+        "word_count": 25,
+        "tokens": 0,
+        "index_node_id": "",
+        "index_node_hash": "",
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/upload-file'
+  method='GET'
+  title='Get Upload File'
+  name='#get_upload_file'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        Document ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents/{document_id}/upload-file"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/upload-file' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/upload-file' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "file_id",
+      "name": "file_name",
+      "size": 1024,
+      "extension": "txt",
+      "url": "preview_url",
+      "download_url": "download_url",
+      "mime_type": "text/plain",
+      "created_by": "user_id",
+      "created_at": 1728734540,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/retrieve'
+  method='POST'
+  title='Retrieve Chunks from a Knowledge Base'
+  name='#dataset_retrieval'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='query' type='string' key='query'>
+        Query keyword
+      </Property>
+      <Property name='retrieval_model' type='object' key='retrieval_model'>
+        Retrieval model (optional, if not filled, it will be recalled according to the default method)
+        - <code>search_method</code> (text) Search method: One of the following four keywords is required
+          - <code>keyword_search</code> Keyword search
+          - <code>semantic_search</code> Semantic search
+          - <code>full_text_search</code> Full-text search
+          - <code>hybrid_search</code> Hybrid search
+        - <code>reranking_enable</code> (bool) Whether to enable reranking, required if the search mode is semantic_search or hybrid_search (optional)
+        - <code>reranking_mode</code> (object) Rerank model configuration, required if reranking is enabled
+            - <code>reranking_provider_name</code> (string) Rerank model provider
+            - <code>reranking_model_name</code> (string) Rerank model name
+        - <code>weights</code> (float) Semantic search weight setting in hybrid search mode
+        - <code>top_k</code> (integer) Number of results to return (optional)
+        - <code>score_threshold_enabled</code> (bool) Whether to enable score threshold
+        - <code>score_threshold</code> (float) Score threshold
+      </Property>
+      <Property name='external_retrieval_model' type='object' key='external_retrieval_model'>
+          Unused field
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/retrieve"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/retrieve' \\\n--header 'Authorization: Bearer {api_key}'\\\n--header 'Content-Type: application/json'\\\n--data-raw '{
+    "query": "test",
+    "retrieval_model": {
+        "search_method": "keyword_search",
+        "reranking_enable": false,
+        "reranking_mode": null,
+        "reranking_model": {
+            "reranking_provider_name": "",
+            "reranking_model_name": ""
+        },
+        "weights": null,
+        "top_k": 1,
+        "score_threshold_enabled": false,
+        "score_threshold": null
+    }
+}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/retrieve' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "query": "test",
+        "retrieval_model": {
+            "search_method": "keyword_search",
+            "reranking_enable": false,
+            "reranking_mode": null,
+            "reranking_model": {
+                "reranking_provider_name": "",
+                "reranking_model_name": ""
+            },
+            "weights": null,
+            "top_k": 2,
+            "score_threshold_enabled": false,
+            "score_threshold": null
+        }
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "query": {
+        "content": "test"
+      },
+      "records": [
+        {
+          "segment": {
+            "id": "7fa6f24f-8679-48b3-bc9d-bdf28d73f218",
+            "position": 1,
+            "document_id": "a8c6c36f-9f5d-4d7a-8472-f5d7b75d71d2",
+            "content": "Operation guide",
+            "answer": null,
+            "word_count": 847,
+            "tokens": 280,
+            "keywords": [
+              "install",
+              "java",
+              "base",
+              "scripts",
+              "jdk",
+              "manual",
+              "internal",
+              "opens",
+              "add",
+              "vmoptions"
+            ],
+            "index_node_id": "39dd8443-d960-45a8-bb46-7275ad7fbc8e",
+            "index_node_hash": "0189157697b3c6a418ccf8264a09699f25858975578f3467c76d6bfc94df1d73",
+            "hit_count": 0,
+            "enabled": true,
+            "disabled_at": null,
+            "disabled_by": null,
+            "status": "completed",
+            "created_by": "dbcb1ab5-90c8-41a7-8b78-73b235eb6f6f",
+            "created_at": 1728734540,
+            "indexing_at": 1728734552,
+            "completed_at": 1728734584,
+            "error": null,
+            "stopped_at": null,
+            "document": {
+              "id": "a8c6c36f-9f5d-4d7a-8472-f5d7b75d71d2",
+              "data_source_type": "upload_file",
+              "name": "readme.txt",
+            }
+          },
+          "score": 3.730463140527718e-05,
+          "tsne_position": null
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata'
+  method='POST'
+  title='Create a Knowledge Metadata'
+  name='#create_metadata'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='segment' type='object' key='segment'>
+        - <code>type</code> (string) Metadata type, required
+        - <code>name</code> (string) Metadata name, required
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/metadata"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/metadata' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'\\\n--data-raw '{"type": "string", "name": "test"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "abc",
+      "type": "string",
+      "name": "test",
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata/{metadata_id}'
+  method='PATCH'
+  title='Update a Knowledge Metadata'
+  name='#update_metadata'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='metadata_id' type='string' key='metadata_id'>
+        Metadata ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='segment' type='object' key='segment'>
+        - <code>name</code> (string) Metadata name, required
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="PATCH"
+      label="/datasets/{dataset_id}/metadata/{metadata_id}"
+      targetCode={`curl --location --request PATCH '${props.apiBaseUrl}/datasets/{dataset_id}/metadata/{metadata_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'\\\n--data-raw '{"name": "test"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "abc",
+      "type": "string",
+      "name": "test",
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata/{metadata_id}'
+  method='DELETE'
+  title='Delete a Knowledge Metadata'
+  name='#delete_metadata'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='metadata_id' type='string' key='metadata_id'>
+        Metadata ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="DELETE"
+      label="/datasets/{dataset_id}/metadata/{metadata_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/metadata/{metadata_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata/built-in/{action}'
+  method='POST'
+  title='Disable Or Enable Built-in Metadata'
+  name='#toggle_metadata'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+      <Property name='action' type='string' key='action'>
+        disable/enable
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/metadata/built-in/{action}"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/metadata/built-in/{action}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/metadata'
+  method='POST'
+  title='Update Documents Metadata'
+  name='#update_documents_metadata'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='operation_data' type='object list' key='segments'>
+        - <code>document_id</code> (string) Document ID
+        - <code>metadata_list</code> (list) Metadata list
+          - <code>id</code> (string) Metadata ID
+          - <code>value</code> (string) Metadata value
+          - <code>name</code> (string) Metadata name
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/metadata"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/metadata' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'\\\n--data-raw '{"operation_data": [{"document_id": "document_id", "metadata_list": [{"id": "id", "value": "value", "name": "name"}]}]}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata'
+  method='GET'
+  title='Get Knowledge Metadata List'
+  name='#dataset_metadata_list'
+/>
+<Row>
+  <Col>
+    ### Params
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        Knowledge ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets/{dataset_id}/metadata"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/metadata' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "doc_metadata": [
+        {
+          "id": "",
+          "name": "name",
+          "type": "string",
+          "use_count": 0,
+        },
+        ...
+      ],
+      "built_in_field_enabled": true
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+ 
+<Heading
+ url='/workspaces/current/models/model-types/text-embedding'
+ method='GET'
+ title='Get available embedding models'
+ name='#model_type_list'
+/>
+<Row>
+   <Col>
+     ### Query
+     <Properties>
+     </Properties>
+   </Col>
+   <Col sticky>
+     <CodeGroup
+       title="Request"
+       tag="GET"
+       label="/datasets/{dataset_id}"
+       targetCode={`curl --location --location --request GET '${props.apiBaseUrl}/workspaces/current/models/model-types/text-embedding' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' `}
+     >
+     ```bash {{ title: 'cURL' }}
+     curl --location --request GET '${props.apiBaseUrl}/workspaces/current/models/model-types/text-embedding' \
+     --header 'Authorization: Bearer {api_key}' \
+     --header 'Content-Type: application/json' \
+     ```
+     </CodeGroup>
+     <CodeGroup title="Response">
+     ```json {{ title: 'Response' }}
+     {
+       "data": [
+           {
+               "provider": "zhipuai",
+               "label": {
+                   "zh_Hans": "鏅鸿氨 AI",
+                   "en_US": "ZHIPU AI"
+               },
+               "icon_small": {
+                   "zh_Hans": "http://127.0.0.1:5001/console/api/workspaces/current/model-providers/zhipuai/icon_small/zh_Hans",
+                   "en_US": "http://127.0.0.1:5001/console/api/workspaces/current/model-providers/zhipuai/icon_small/en_US"
+               },
+               "icon_large": {
+                   "zh_Hans": "http://127.0.0.1:5001/console/api/workspaces/current/model-providers/zhipuai/icon_large/zh_Hans",
+                   "en_US": "http://127.0.0.1:5001/console/api/workspaces/current/model-providers/zhipuai/icon_large/en_US"
+               },
+               "status": "active",
+               "models": [
+                   {
+                       "model": "embedding-3",
+                       "label": {
+                           "zh_Hans": "embedding-3",
+                           "en_US": "embedding-3"
+                       },
+                       "model_type": "text-embedding",
+                       "features": null,
+                       "fetch_from": "predefined-model",
+                       "model_properties": {
+                           "context_size": 8192
+                       },
+                       "deprecated": false,
+                       "status": "active",
+                       "load_balancing_enabled": false
+                   },
+                   {
+                       "model": "embedding-2",
+                       "label": {
+                           "zh_Hans": "embedding-2",
+                           "en_US": "embedding-2"
+                       },
+                       "model_type": "text-embedding",
+                       "features": null,
+                       "fetch_from": "predefined-model",
+                       "model_properties": {
+                           "context_size": 8192
+                       },
+                       "deprecated": false,
+                       "status": "active",
+                       "load_balancing_enabled": false
+                   },
+                   {
+                       "model": "text_embedding",
+                       "label": {
+                           "zh_Hans": "text_embedding",
+                           "en_US": "text_embedding"
+                       },
+                       "model_type": "text-embedding",
+                       "features": null,
+                       "fetch_from": "predefined-model",
+                       "model_properties": {
+                           "context_size": 512
+                       },
+                       "deprecated": false,
+                       "status": "active",
+                       "load_balancing_enabled": false
+                   }
+               ]
+           }
+       ]
+     }
+     ```
+     </CodeGroup>
+   </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Row>
+  <Col>
+    ### Error message
+    <Properties>
+      <Property name='code' type='string' key='code'>
+        Error code
+      </Property>
+    </Properties>
+    <Properties>
+      <Property name='status' type='number' key='status'>
+        Error status
+      </Property>
+    </Properties>
+    <Properties>
+      <Property name='message' type='string' key='message'>
+        Error message
+      </Property>
+    </Properties>
+  </Col>
+  <Col>
+    <CodeGroup title="Example">
+    ```json {{ title: 'Response' }}
+      {
+        "code": "no_file_uploaded",
+        "message": "Please upload your file.",
+        "status": 400
+      }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+<table className="max-w-auto border-collapse border border-slate-400" style={{ maxWidth: 'none', width: 'auto' }}>
+  <thead style={{ background: '#f9fafc' }}>
+    <tr>
+      <th className="p-2 border border-slate-300">code</th>
+      <th className="p-2 border border-slate-300">status</th>
+      <th className="p-2 border border-slate-300">message</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td className="p-2 border border-slate-300">no_file_uploaded</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">Please upload your file.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">too_many_files</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">Only one file is allowed.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">file_too_large</td>
+      <td className="p-2 border border-slate-300">413</td>
+      <td className="p-2 border border-slate-300">File size exceeded.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">unsupported_file_type</td>
+      <td className="p-2 border border-slate-300">415</td>
+      <td className="p-2 border border-slate-300">File type not allowed.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">high_quality_dataset_only</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">Current operation only supports 'high-quality' datasets.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">dataset_not_initialized</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">The dataset is still being initialized or indexing. Please wait a moment.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">archived_document_immutable</td>
+      <td className="p-2 border border-slate-300">403</td>
+      <td className="p-2 border border-slate-300">The archived document is not editable.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">dataset_name_duplicate</td>
+      <td className="p-2 border border-slate-300">409</td>
+      <td className="p-2 border border-slate-300">The dataset name already exists. Please modify your dataset name.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">invalid_action</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">Invalid action.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">document_already_finished</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">The document has been processed. Please refresh the page or go to the document details.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">document_indexing</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">The document is being processed and cannot be edited.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">invalid_metadata</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">The metadata content is incorrect. Please check and verify.</td>
+    </tr>
+  </tbody>
+</table>
+<div className="pb-4" />
diff --git "a/app/\050commonLayout\051/datasets/template/template.ja.mdx" "b/app/\050commonLayout\051/datasets/template/template.ja.mdx"
new file mode 100644
index 0000000..defd488
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/template/template.ja.mdx"
@@ -0,0 +1,2005 @@
+{/**
+  * @typedef Props
+  * @property {string} apiBaseUrl
+  */}
+
+import { CodeGroup } from '@/app/components/develop/code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstruction, Paragraph } from '@/app/components/develop/md.tsx'
+
+# 銉娿儸銉冦偢 API
+
+<div>
+  ### 瑾嶈
+
+  Dify 銇偟銉笺儞銈� API 銇� `API-Key` 銈掍娇鐢ㄣ仐銇﹁獚瑷笺仐銇俱仚銆�
+
+  闁嬬櫤鑰呫伅銆乣API-Key` 銈掋偗銉┿偆銈€兂銉堝伌銇у叡鏈夈伨銇熴伅淇濆瓨銇欍倠銇仹銇仾銇忋�併儛銉冦偗銈ㄣ兂銉夈伀淇濆瓨銇欍倠銇撱仺銈掓帹濂ㄣ仐銇俱仚銆傘亾銈屻伀銈堛倞銆乣API-Key` 銇紡娲┿伀銈堛倠璨$敚鎼嶅け銈掗槻銇愩亾銇ㄣ亴銇с亶銇俱仚銆�
+
+  銇欍伖銇︺伄 API 銉偗銈ㄣ偣銉堛伀銇�佷互涓嬨伄銈堛亞銇� **`Authorization`** HTTP 銉樸儍銉�銉笺伀 `API-Key` 銈掑惈銈併倠蹇呰銇屻亗銈娿伨銇欙細
+
+  <CodeGroup title="銈炽兗銉�">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+
+    ```
+  </CodeGroup>
+</div>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/document/create-by-text'
+  method='POST'
+  title='銉嗐偔銈广儓銇嬨倝銉夈偔銉ャ儭銉炽儓銈掍綔鎴�'
+  name='#create-by-text'
+/>
+<Row>
+  <Col>
+    銇撱伄 API 銇棦瀛樸伄銉娿儸銉冦偢銇熀銇ャ亜銇︺亰銈娿�併亾銇儕銉儍銈搞倰鍩恒伀銉嗐偔銈广儓銈掍娇鐢ㄣ仐銇︽柊銇椼亜銉夈偔銉ャ儭銉炽儓銈掍綔鎴愩仐銇俱仚銆�
+
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        銉夈偔銉ャ儭銉炽儓鍚�
+      </Property>
+      <Property name='text' type='string' key='text'>
+        銉夈偔銉ャ儭銉炽儓鍐呭
+      </Property>
+      <Property name='indexing_technique' type='string' key='indexing_technique'>
+        銈ゃ兂銉囥儍銈偣銉€兗銉�
+          - <code>high_quality</code> 楂樺搧璩�: 鍩嬨倎杈笺伩銉€儑銉倰浣跨敤銇椼仸銉欍偗銉堛儷銉囥兗銈裤儥銉笺偣銈ゃ兂銉囥儍銈偣銈掓绡�
+          - <code>economy</code> 绲屾笀: 銈兗銉兗銉夈儐銉笺儢銉偆銉炽儑銉冦偗銈广伄鍙嶈虎銈ゃ兂銉囥儍銈偣銈掓绡�
+      </Property>
+      <Property name='doc_form' type='string' key='doc_form'>
+        銈ゃ兂銉囥儍銈偣鍖栥仌銈屻仧鍐呭銇舰寮�
+          - <code>text_model</code> 銉嗐偔銈广儓銉夈偔銉ャ儭銉炽儓銇洿鎺ュ煁銈佽炯銇俱倢銇俱仚; `economy` 銉€兗銉夈仹銇亾銇舰寮忋亴銉囥儠銈┿儷銉�
+          - <code>hierarchical_model</code> 瑕瓙銉€兗銉�
+          - <code>qa_model</code> Q&A 銉€兗銉�: 鍒嗗壊銇曘倢銇熴儔銈儱銉°兂銉堛伄璩晱銇ㄥ洖绛斻儦銈€倰鐢熸垚銇椼�佽唱鍟忋倰鍩嬨倎杈笺伩銇俱仚
+      </Property>
+      <Property name='doc_language' type='string' key='doc_language'>
+        Q&A 銉€兗銉夈仹銇�併儔銈儱銉°兂銉堛伄瑷�瑾炪倰鎸囧畾銇椼伨銇欍�備緥: <code>English</code>, <code>Chinese</code>
+      </Property>
+      <Property name='process_rule' type='object' key='process_rule'>
+        鍑︾悊銉兗銉�
+          - <code>mode</code> (string) 銈儶銉笺儖銉炽偘銆併偦銈般儭銉炽儐銉笺偡銉с兂銉€兗銉夈�佽嚜鍕� / 銈偣銈裤儬
+          - <code>rules</code> (object) 銈偣銈裤儬銉兗銉� (鑷嫊銉€兗銉夈仹銇�併亾銇儠銈c兗銉儔銇┖)
+            - <code>pre_processing_rules</code> (array[object]) 鍓嶅嚘鐞嗐儷銉笺儷
+              - <code>id</code> (string) 鍓嶅嚘鐞嗐儷銉笺儷銇竴鎰忚瓨鍒ュ瓙
+                - 鍒楁寵
+                  - <code>remove_extra_spaces</code> 閫g稓銇欍倠銈广儦銉笺偣銆佹敼琛屻�併偪銉栥倰缃彌
+                  - <code>remove_urls_emails</code> URL銆併儭銉笺儷銈€儔銉偣銈掑墛闄�
+              - <code>enabled</code> (bool) 銇撱伄銉兗銉倰閬告姙銇欍倠銇嬨仼銇嗐亱銆傘儔銈儱銉°兂銉� ID 銇屾浮銇曘倢銇亜鍫村悎銆併儑銉曘偐銉儓鍊ゃ倰琛ㄣ仐銇俱仚銆�
+            - <code>segmentation</code> (object) 銈汇偘銉°兂銉嗐兗銈枫儳銉炽儷銉笺儷
+              - <code>separator</code> 銈偣銈裤儬銈汇偘銉°兂銉堣瓨鍒ュ瓙銆傜従鍦ㄣ伅 1 銇ゃ伄鍖哄垏銈婃枃瀛椼伄銇胯ō瀹氬彲鑳姐�傘儑銉曘偐銉儓銇� \n
+              - <code>max_tokens</code> 鏈�澶ч暦 (銉堛兗銈兂) 銉囥儠銈┿儷銉堛伅 1000
+            - <code>parent_mode</code> 瑕儊銉c兂銈伄妞滅储銉€兗銉�: <code>full-doc</code> 鍏ㄦ枃妞滅储 / <code>paragraph</code> 娈佃惤妞滅储
+            - <code>subchunk_segmentation</code> (object) 瀛愩儊銉c兂銈儷銉笺儷
+              - <code>separator</code> 銈汇偘銉°兂銉嗐兗銈枫儳銉宠瓨鍒ュ瓙銆傜従鍦ㄣ伅 1 銇ゃ伄鍖哄垏銈婃枃瀛椼伄銇胯ū鍙�傘儑銉曘偐銉儓銇� <code>***</code>
+              - <code>max_tokens</code> 鏈�澶ч暦 (銉堛兗銈兂) 銇Κ銉併儯銉炽偗銇暦銇曘倛銈婄煭銇勩亾銇ㄣ倰妞滆銇欍倠蹇呰銇屻亗銈娿伨銇�
+              - <code>chunk_overlap</code> 闅f帴銇欍倠銉併儯銉炽偗闁撱伄閲嶈銈掑畾缇� (銈儣銈枫儳銉�)
+      </Property>
+      <PropertyInstruction>銉娿儸銉冦偢銉欍兗銈广伀銉戙儵銉°兗銈裤亴瑷畾銇曘倢銇︺亜銇亜鍫村悎銆佹渶鍒濄伄銈€儍銉椼儹銉笺儔銇伅浠ヤ笅銇儜銉┿儭銉笺偪銈掓彁渚涖仚銈嬪繀瑕併亴銇傘倞銇俱仚銆傛彁渚涖仌銈屻仾銇勫牬鍚堛�併儑銉曘偐銉儓銉戙儵銉°兗銈裤亴浣跨敤銇曘倢銇俱仚銆�</PropertyInstruction>
+      <Property name='retrieval_model' type='object' key='retrieval_model'>
+        妞滅储銉€儑銉�
+          - <code>search_method</code> (string) 妞滅储鏂规硶
+            - <code>hybrid_search</code> 銉忋偆銉栥儶銉冦儔妞滅储
+            - <code>semantic_search</code> 銈汇優銉炽儐銈c儍銈绱�
+            - <code>full_text_search</code> 鍏ㄦ枃妞滅储
+          - <code>reranking_enable</code> (bool) 鍐嶃儵銉炽偔銉炽偘銈掓湁鍔广伀銇欍倠銇嬨仼銇嗐亱
+          - <code>reranking_mode</code> (object) 鍐嶃儵銉炽偔銉炽偘銉€儑銉鎴�
+            - <code>reranking_provider_name</code> (string) 鍐嶃儵銉炽偔銉炽偘銉€儑銉儣銉儛銈ゃ儉銉�
+            - <code>reranking_model_name</code> (string) 鍐嶃儵銉炽偔銉炽偘銉€儑銉悕
+          - <code>top_k</code> (int) 杩斻仌銈屻倠绲愭灉銇暟
+          - <code>score_threshold_enabled</code> (bool) 銈广偝銈㈤柧鍊ゃ倰鏈夊姽銇仚銈嬨亱銇┿亞銇�
+          - <code>score_threshold</code> (float) 銈广偝銈㈤柧鍊�
+      </Property>
+      <Property name='embedding_model' type='string' key='embedding_model'>
+        鍩嬨倎杈笺伩銉€儑銉悕
+      </Property>
+      <Property name='embedding_model_provider' type='string' key='embedding_model_provider'>
+        鍩嬨倎杈笺伩銉€儑銉儣銉儛銈ゃ儉銉�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="POST"
+      label="/datasets/{dataset_id}/document/create-by-text"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/document/create-by-text' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "text","text": "text","indexing_technique": "high_quality","process_rule": {"mode": "automatic"}}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/document/create-by-text' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "name": "text",
+        "text": "text",
+        "indexing_technique": "high_quality",
+        "process_rule": {
+            "mode": "automatic"
+        }
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "document": {
+        "id": "",
+        "position": 1,
+        "data_source_type": "upload_file",
+        "data_source_info": {
+            "upload_file_id": ""
+        },
+        "dataset_process_rule_id": "",
+        "name": "text.txt",
+        "created_from": "api",
+        "created_by": "",
+        "created_at": 1695690280,
+        "tokens": 0,
+        "indexing_status": "waiting",
+        "error": null,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "archived": false,
+        "display_status": "queuing",
+        "word_count": 0,
+        "hit_count": 0,
+        "doc_form": "text_model"
+      },
+      "batch": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/document/create-by-file'
+  method='POST'
+  title='銉曘偂銈ゃ儷銇嬨倝銉夈偔銉ャ儭銉炽儓銈掍綔鎴�'
+  name='#create-by-file'
+/>
+<Row>
+  <Col>
+    銇撱伄 API 銇棦瀛樸伄銉娿儸銉冦偢銇熀銇ャ亜銇︺亰銈娿�併亾銇儕銉儍銈搞倰鍩恒伀銉曘偂銈ゃ儷銈掍娇鐢ㄣ仐銇︽柊銇椼亜銉夈偔銉ャ儭銉炽儓銈掍綔鎴愩仐銇俱仚銆�
+
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    <Properties>
+      <Property name='data' type='multipart/form-data json string' key='data'>
+        - <code>original_document_id</code> 鍏冦伄銉夈偔銉ャ儭銉炽儓 ID (銈儣銈枫儳銉�)
+          - 銉夈偔銉ャ儭銉炽儓銈掑啀銈€儍銉椼儹銉笺儔銇俱仧銇偗銉兗銉嬨兂銈般仺銈汇偘銉°兂銉嗐兗銈枫儳銉虫鎴愩倰澶夋洿銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍�傛瑺钀姐仐銇︺亜銈嬫儏鍫便伅鍏冦伄銉夈偔銉ャ儭銉炽儓銇嬨倝銈炽償銉笺仌銈屻伨銇欍��
+          - 鍏冦伄銉夈偔銉ャ儭銉炽儓銇偄銉笺偒銈ゃ儢銇曘倢銇熴儔銈儱銉°兂銉堛仹銇傘仯銇︺伅銇倞銇俱仜銈撱��
+          - original_document_id 銇屾浮銇曘倢銇熷牬鍚堛�佹洿鏂版搷浣溿亴瀹熻銇曘倢銇俱仚銆俻rocess_rule 銇叆鍔涘彲鑳姐仾闋呯洰銇с仚銆傚叆鍔涖仌銈屻仾銇勫牬鍚堛�佸厓銇儔銈儱銉°兂銉堛伄銈汇偘銉°兂銉嗐兗銈枫儳銉虫柟娉曘亴銉囥儠銈┿儷銉堛仹浣跨敤銇曘倢銇俱仚銆�
+          - original_document_id 銇屾浮銇曘倢銇亜鍫村悎銆佹柊銇椼亜鎿嶄綔銇屽疅琛屻仌銈屻�乸rocess_rule 銇屽繀瑕併仹銇欍��
+
+        - <code>indexing_technique</code> 銈ゃ兂銉囥儍銈偣銉€兗銉�
+          - <code>high_quality</code> 楂樺搧璩�: 鍩嬨倎杈笺伩銉€儑銉倰浣跨敤銇椼仸銉欍偗銉堛儷銉囥兗銈裤儥銉笺偣銈ゃ兂銉囥儍銈偣銈掓绡�
+          - <code>economy</code> 绲屾笀: 銈兗銉兗銉夈儐銉笺儢銉偆銉炽儑銉冦偗銈广伄鍙嶈虎銈ゃ兂銉囥儍銈偣銈掓绡�
+
+        - <code>doc_form</code> 銈ゃ兂銉囥儍銈偣鍖栥仌銈屻仧鍐呭銇舰寮�
+          - <code>text_model</code> 銉嗐偔銈广儓銉夈偔銉ャ儭銉炽儓銇洿鎺ュ煁銈佽炯銇俱倢銇俱仚; `economy` 銉€兗銉夈仹銇亾銇舰寮忋亴銉囥儠銈┿儷銉�
+          - <code>hierarchical_model</code> 瑕瓙銉€兗銉�
+          - <code>qa_model</code> Q&A 銉€兗銉�: 鍒嗗壊銇曘倢銇熴儔銈儱銉°兂銉堛伄璩晱銇ㄥ洖绛斻儦銈€倰鐢熸垚銇椼�佽唱鍟忋倰鍩嬨倎杈笺伩銇俱仚
+
+        - <code>doc_language</code> Q&A 銉€兗銉夈仹銇�併儔銈儱銉°兂銉堛伄瑷�瑾炪倰鎸囧畾銇椼伨銇欍�備緥: <code>English</code>, <code>Chinese</code>
+
+        - <code>process_rule</code> 鍑︾悊銉兗銉�
+          - <code>mode</code> (string) 銈儶銉笺儖銉炽偘銆併偦銈般儭銉炽儐銉笺偡銉с兂銉€兗銉夈�佽嚜鍕� / 銈偣銈裤儬
+          - <code>rules</code> (object) 銈偣銈裤儬銉兗銉� (鑷嫊銉€兗銉夈仹銇�併亾銇儠銈c兗銉儔銇┖)
+            - <code>pre_processing_rules</code> (array[object]) 鍓嶅嚘鐞嗐儷銉笺儷
+              - <code>id</code> (string) 鍓嶅嚘鐞嗐儷銉笺儷銇竴鎰忚瓨鍒ュ瓙
+                - 鍒楁寵
+                  - <code>remove_extra_spaces</code> 閫g稓銇欍倠銈广儦銉笺偣銆佹敼琛屻�併偪銉栥倰缃彌
+                  - <code>remove_urls_emails</code> URL銆併儭銉笺儷銈€儔銉偣銈掑墛闄�
+              - <code>enabled</code> (bool) 銇撱伄銉兗銉倰閬告姙銇欍倠銇嬨仼銇嗐亱銆傘儔銈儱銉°兂銉� ID 銇屾浮銇曘倢銇亜鍫村悎銆併儑銉曘偐銉儓鍊ゃ倰琛ㄣ仐銇俱仚銆�
+            - <code>segmentation</code> (object) 銈汇偘銉°兂銉嗐兗銈枫儳銉炽儷銉笺儷
+              - <code>separator</code> 銈偣銈裤儬銈汇偘銉°兂銉堣瓨鍒ュ瓙銆傜従鍦ㄣ伅 1 銇ゃ伄鍖哄垏銈婃枃瀛椼伄銇胯ō瀹氬彲鑳姐�傘儑銉曘偐銉儓銇� \n
+              - <code>max_tokens</code> 鏈�澶ч暦 (銉堛兗銈兂) 銉囥儠銈┿儷銉堛伅 1000
+            - <code>parent_mode</code> 瑕儊銉c兂銈伄妞滅储銉€兗銉�: <code>full-doc</code> 鍏ㄦ枃妞滅储 / <code>paragraph</code> 娈佃惤妞滅储
+            - <code>subchunk_segmentation</code> (object) 瀛愩儊銉c兂銈儷銉笺儷
+              - <code>separator</code> 銈汇偘銉°兂銉嗐兗銈枫儳銉宠瓨鍒ュ瓙銆傜従鍦ㄣ伅 1 銇ゃ伄鍖哄垏銈婃枃瀛椼伄銇胯ū鍙�傘儑銉曘偐銉儓銇� <code>***</code>
+              - <code>max_tokens</code> 鏈�澶ч暦 (銉堛兗銈兂) 銇Κ銉併儯銉炽偗銇暦銇曘倛銈婄煭銇勩亾銇ㄣ倰妞滆銇欍倠蹇呰銇屻亗銈娿伨銇�
+              - <code>chunk_overlap</code> 闅f帴銇欍倠銉併儯銉炽偗闁撱伄閲嶈銈掑畾缇� (銈儣銈枫儳銉�)
+      </Property>
+      <Property name='file' type='multipart/form-data' key='file'>
+        銈€儍銉椼儹銉笺儔銇欍倠蹇呰銇屻亗銈嬨儠銈°偆銉��
+      </Property>
+      <PropertyInstruction>銉娿儸銉冦偢銉欍兗銈广伀銉戙儵銉°兗銈裤亴瑷畾銇曘倢銇︺亜銇亜鍫村悎銆佹渶鍒濄伄銈€儍銉椼儹銉笺儔銇伅浠ヤ笅銇儜銉┿儭銉笺偪銈掓彁渚涖仚銈嬪繀瑕併亴銇傘倞銇俱仚銆傛彁渚涖仌銈屻仾銇勫牬鍚堛�併儑銉曘偐銉儓銉戙儵銉°兗銈裤亴浣跨敤銇曘倢銇俱仚銆�</PropertyInstruction>
+      <Property name='retrieval_model' type='object' key='retrieval_model'>
+        妞滅储銉€儑銉�
+          - <code>search_method</code> (string) 妞滅储鏂规硶
+            - <code>hybrid_search</code> 銉忋偆銉栥儶銉冦儔妞滅储
+            - <code>semantic_search</code> 銈汇優銉炽儐銈c儍銈绱�
+            - <code>full_text_search</code> 鍏ㄦ枃妞滅储
+          - <code>reranking_enable</code> (bool) 鍐嶃儵銉炽偔銉炽偘銈掓湁鍔广伀銇欍倠銇嬨仼銇嗐亱
+          - <code>reranking_mode</code> (object) 鍐嶃儵銉炽偔銉炽偘銉€儑銉鎴�
+            - <code>reranking_provider_name</code> (string) 鍐嶃儵銉炽偔銉炽偘銉€儑銉儣銉儛銈ゃ儉銉�
+            - <code>reranking_model_name</code> (string) 鍐嶃儵銉炽偔銉炽偘銉€儑銉悕
+          - <code>top_k</code> (int) 杩斻仌銈屻倠绲愭灉銇暟
+          - <code>score_threshold_enabled</code> (bool) 銈广偝銈㈤柧鍊ゃ倰鏈夊姽銇仚銈嬨亱銇┿亞銇�
+          - <code>score_threshold</code> (float) 銈广偝銈㈤柧鍊�
+      </Property>
+      <Property name='embedding_model' type='string' key='embedding_model'>
+        鍩嬨倎杈笺伩銉€儑銉悕
+      </Property>
+      <Property name='embedding_model_provider' type='string' key='embedding_model_provider'>
+        鍩嬨倎杈笺伩銉€儑銉儣銉儛銈ゃ儉銉�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="POST"
+      label="/datasets/{dataset_id}/document/create-by-file"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/document/create-by-file' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'data="{"indexing_technique":"high_quality","process_rule":{"rules":{"pre_processing_rules":[{"id":"remove_extra_spaces","enabled":true},{"id":"remove_urls_emails","enabled":true}],"segmentation":{"separator":"###","max_tokens":500}},"mode":"custom"}}";type=text/plain' \\\n--form 'file=@"/path/to/file"'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/document/create-by-file' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'data="{\"name\":\"Dify\",\"indexing_technique\":\"high_quality\",\"process_rule\":{\"rules\":{\"pre_processing_rules\":[{\"id\":\"remove_extra_spaces\",\"enabled\":true},{\"id\":\"remove_urls_emails\",\"enabled\":true}],\"segmentation\":{\"separator\":\"###\",\"max_tokens\":500}},\"mode\":\"custom\"}}";type=text/plain' \
+    --form 'file=@"/path/to/file"'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "document": {
+        "id": "",
+        "position": 1,
+        "data_source_type": "upload_file",
+        "data_source_info": {
+          "upload_file_id": ""
+        },
+        "dataset_process_rule_id": "",
+        "name": "Dify.txt",
+        "created_from": "api",
+        "created_by": "",
+        "created_at": 1695308667,
+        "tokens": 0,
+        "indexing_status": "waiting",
+        "error": null,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "archived": false,
+        "display_status": "queuing",
+        "word_count": 0,
+        "hit_count": 0,
+        "doc_form": "text_model"
+      },
+      "batch": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets'
+  method='POST'
+  title='绌恒伄銉娿儸銉冦偢銉欍兗銈广倰浣滄垚'
+  name='#create_empty_dataset'
+/>
+<Row>
+  <Col>
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        銉娿儸銉冦偢鍚�
+      </Property>
+      <Property name='description' type='string' key='description'>
+        銉娿儸銉冦偢銇鏄� (銈儣銈枫儳銉�)
+      </Property>
+      <Property name='indexing_technique' type='string' key='indexing_technique'>
+        銈ゃ兂銉囥儍銈偣鎶�琛� (銈儣銈枫儳銉�)
+          - <code>high_quality</code> 楂樺搧璩�
+          - <code>economy</code> 绲屾笀
+      </Property>
+      <Property name='permission' type='string' key='permission'>
+        妯╅檺
+          - <code>only_me</code> 鑷垎銇伩
+          - <code>all_team_members</code> 銇欍伖銇︺伄銉併兗銉犮儭銉炽儛銉�
+          - <code>partial_members</code> 涓�閮ㄣ伄銉°兂銉愩兗
+      </Property>
+      <Property name='provider' type='string' key='provider'>
+        銉椼儹銉愩偆銉�銉� (銈儣銈枫儳銉炽�併儑銉曘偐銉儓: vendor)
+          - <code>vendor</code> 銉欍兂銉�銉�
+          - <code>external</code> 澶栭儴銉娿儸銉冦偢
+      </Property>
+      <Property name='external_knowledge_api_id' type='str' key='external_knowledge_api_id'>
+        澶栭儴銉娿儸銉冦偢 API ID (銈儣銈枫儳銉�)
+      </Property>
+      <Property name='external_knowledge_id' type='str' key='external_knowledge_id'>
+        澶栭儴銉娿儸銉冦偢 ID (銈儣銈枫儳銉�)
+      </Property>
+      <Property name='embedding_model' type='str' key='embedding_model'>
+        鍩嬨倎杈笺伩銉€儑銉悕锛堜换鎰忥級
+      </Property>
+      <Property name='embedding_model_provider' type='str' key='embedding_model_provider'>
+        鍩嬨倎杈笺伩銉€儑銉伄銉椼儹銉愩偆銉�鍚嶏紙浠绘剰锛�
+      </Property>
+      <Property name='retrieval_model' type='object' key='retrieval_model'>
+        妞滅储銉€儑銉紙浠绘剰锛�
+          - <code>search_method</code> (鏂囧瓧鍒�) 妞滅储鏂规硶
+            - <code>hybrid_search</code> 銉忋偆銉栥儶銉冦儔妞滅储
+            - <code>semantic_search</code> 銈汇優銉炽儐銈c儍銈绱�
+            - <code>full_text_search</code> 鍏ㄦ枃妞滅储
+          - <code>reranking_enable</code> (銉栥兗銉��) 銉儵銉炽偔銉炽偘銈掓湁鍔广伀銇欍倠銇嬨仼銇嗐亱
+          - <code>reranking_model</code> (銈儢銈搞偋銈儓) 銉儵銉炽偗銉€儑銉伄瑷畾
+              - <code>reranking_provider_name</code> (鏂囧瓧鍒�) 銉儵銉炽偗銉€儑銉伄銉椼儹銉愩偆銉�
+              - <code>reranking_model_name</code> (鏂囧瓧鍒�) 銉儵銉炽偗銉€儑銉悕
+          - <code>top_k</code> (鏁存暟) 杩斻仌銈屻倠绲愭灉銇暟
+          - <code>score_threshold_enabled</code> (銉栥兗銉��) 銈广偝銈㈤柧鍊ゃ倰鏈夊姽銇仚銈嬨亱銇┿亞銇�
+          - <code>score_threshold</code> (娴嫊灏忔暟鐐规暟) 銈广偝銈㈤柧鍊�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="POST"
+      label="/datasets"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "name", "permission": "only_me"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${apiBaseUrl}/v1/datasets' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+      "name": "name",
+      "permission": "only_me"
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "",
+      "name": "name",
+      "description": null,
+      "provider": "vendor",
+      "permission": "only_me",
+      "data_source_type": null,
+      "indexing_technique": null,
+      "app_count": 0,
+      "document_count": 0,
+      "word_count": 0,
+      "created_by": "",
+      "created_at": 1695636173,
+      "updated_by": "",
+      "updated_at": 1695636173,
+      "embedding_model": null,
+      "embedding_model_provider": null,
+      "embedding_available": null
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets'
+  method='GET'
+  title='銉娿儸銉冦偢銉欍兗銈广儶銈广儓銈掑彇寰�'
+  name='#dataset_list'
+/>
+<Row>
+  <Col>
+    ### 銈偍銉�
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        妞滅储銈兗銉兗銉夈�併偑銉椼偡銉с兂
+      </Property>
+      <Property name='tag_ids' type='array[string]' key='tag_ids'>
+        銈裤偘ID銉偣銉堛�併偑銉椼偡銉с兂
+      </Property>
+      <Property name='page' type='string' key='page'>
+        銉氥兗銈哥暘鍙枫�併偑銉椼偡銉с兂銆併儑銉曘偐銉儓1
+      </Property>
+      <Property name='limit' type='string' key='limit'>
+        杩斻仌銈屻倠銈€偆銉嗐儬鏁般�併偑銉椼偡銉с兂銆併儑銉曘偐銉儓20銆佺瘎鍥�1-100
+      </Property>
+      <Property name='include_all' type='boolean' key='include_all'>
+        銇欍伖銇︺伄銉囥兗銈裤偦銉冦儓銈掑惈銈併倠銇嬨仼銇嗐亱锛堟墍鏈夎�呫伄銇挎湁鍔癸級銆併偑銉椼偡銉с兂銆併儑銉曘偐銉儓銇痜alse
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="GET"
+      label="/datasets"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets?page=1&limit=20' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [
+        {
+          "id": "",
+          "name": "name",
+          "description": "desc",
+          "permission": "only_me",
+          "data_source_type": "upload_file",
+          "indexing_technique": "",
+          "app_count": 2,
+          "document_count": 10,
+          "word_count": 1200,
+          "created_by": "",
+          "created_at": "",
+          "updated_by": "",
+          "updated_at": ""
+        },
+        ...
+      ],
+      "has_more": true,
+      "limit": 20,
+      "total": 50,
+      "page": 1
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}'
+  method='DELETE'
+  title='銉娿儸銉冦偢銉欍兗銈广倰鍓婇櫎'
+  name='#delete_dataset'
+/>
+<Row>
+  <Col>
+    ### 銉戙儵銉°兗銈�
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="DELETE"
+      label="/datasets/{dataset_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```text {{ title: '銉偣銉濄兂銈�' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/update-by-text'
+  method='POST'
+  title='銉嗐偔銈广儓銇с儔銈儱銉°兂銉堛倰鏇存柊'
+  name='#update-by-text'
+/>
+<Row>
+  <Col>
+    銇撱伄 API 銇棦瀛樸伄銉娿儸銉冦偢銇熀銇ャ亜銇︺亰銈娿�併亾銇儕銉儍銈搞倰鍩恒伀銉嗐偔銈广儓銈掍娇鐢ㄣ仐銇︺儔銈儱銉°兂銉堛倰鏇存柊銇椼伨銇欍��
+
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        銉夈偔銉ャ儭銉炽儓 ID
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        銉夈偔銉ャ儭銉炽儓鍚� (銈儣銈枫儳銉�)
+      </Property>
+      <Property name='text' type='string' key='text'>
+        銉夈偔銉ャ儭銉炽儓鍐呭 (銈儣銈枫儳銉�)
+      </Property>
+      <Property name='process_rule' type='object' key='process_rule'>
+        鍑︾悊銉兗銉�
+          - <code>mode</code> (string) 銈儶銉笺儖銉炽偘銆併偦銈般儭銉炽儐銉笺偡銉с兂銉€兗銉夈�佽嚜鍕� / 銈偣銈裤儬
+          - <code>rules</code> (object) 銈偣銈裤儬銉兗銉� (鑷嫊銉€兗銉夈仹銇�併亾銇儠銈c兗銉儔銇┖)
+            - <code>pre_processing_rules</code> (array[object]) 鍓嶅嚘鐞嗐儷銉笺儷
+              - <code>id</code> (string) 鍓嶅嚘鐞嗐儷銉笺儷銇竴鎰忚瓨鍒ュ瓙
+                - 鍒楁寵
+                  - <code>remove_extra_spaces</code> 閫g稓銇欍倠銈广儦銉笺偣銆佹敼琛屻�併偪銉栥倰缃彌
+                  - <code>remove_urls_emails</code> URL銆併儭銉笺儷銈€儔銉偣銈掑墛闄�
+              - <code>enabled</code> (bool) 銇撱伄銉兗銉倰閬告姙銇欍倠銇嬨仼銇嗐亱銆傘儔銈儱銉°兂銉� ID 銇屾浮銇曘倢銇亜鍫村悎銆併儑銉曘偐銉儓鍊ゃ倰琛ㄣ仐銇俱仚銆�
+            - <code>segmentation</code> (object) 銈汇偘銉°兂銉嗐兗銈枫儳銉炽儷銉笺儷
+              - <code>separator</code> 銈偣銈裤儬銈汇偘銉°兂銉堣瓨鍒ュ瓙銆傜従鍦ㄣ伅 1 銇ゃ伄鍖哄垏銈婃枃瀛椼伄銇胯ō瀹氬彲鑳姐�傘儑銉曘偐銉儓銇� \n
+              - <code>max_tokens</code> 鏈�澶ч暦 (銉堛兗銈兂) 銉囥儠銈┿儷銉堛伅 1000
+            - <code>parent_mode</code> 瑕儊銉c兂銈伄妞滅储銉€兗銉�: <code>full-doc</code> 鍏ㄦ枃妞滅储 / <code>paragraph</code> 娈佃惤妞滅储
+            - <code>subchunk_segmentation</code> (object) 瀛愩儊銉c兂銈儷銉笺儷
+              - <code>separator</code> 銈汇偘銉°兂銉嗐兗銈枫儳銉宠瓨鍒ュ瓙銆傜従鍦ㄣ伅 1 銇ゃ伄鍖哄垏銈婃枃瀛椼伄銇胯ū鍙�傘儑銉曘偐銉儓銇� <code>***</code>
+              - <code>max_tokens</code> 鏈�澶ч暦 (銉堛兗銈兂) 銇Κ銉併儯銉炽偗銇暦銇曘倛銈婄煭銇勩亾銇ㄣ倰妞滆銇欍倠蹇呰銇屻亗銈娿伨銇�
+              - <code>chunk_overlap</code> 闅f帴銇欍倠銉併儯銉炽偗闁撱伄閲嶈銈掑畾缇� (銈儣銈枫儳銉�)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/update-by-text"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/update-by-text' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "name","text": "text"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/update-by-text' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "name": "name",
+        "text": "text"
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "document": {
+        "id": "",
+        "position": 1,
+        "data_source_type": "upload_file",
+        "data_source_info": {
+          "upload_file_id": ""
+        },
+        "dataset_process_rule_id": "",
+        "name": "name.txt",
+        "created_from": "api",
+        "created_by": "",
+        "created_at": 1695308667,
+        "tokens": 0,
+        "indexing_status": "waiting",
+        "error": null,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "archived": false,
+        "display_status": "queuing",
+        "word_count": 0,
+        "hit_count": 0,
+        "doc_form": "text_model"
+      },
+      "batch": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/update-by-file'
+  method='POST'
+  title='銉曘偂銈ゃ儷銇с儔銈儱銉°兂銉堛倰鏇存柊'
+  name='#update-by-file'
+/>
+<Row>
+  <Col>
+    銇撱伄 API 銇棦瀛樸伄銉娿儸銉冦偢銇熀銇ャ亜銇︺亰銈娿�併亾銇儕銉儍銈搞倰鍩恒伀銉曘偂銈ゃ儷銈掍娇鐢ㄣ仐銇︺儔銈儱銉°兂銉堛倰鏇存柊銇椼伨銇欍��
+
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        銉夈偔銉ャ儭銉炽儓 ID
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        銉夈偔銉ャ儭銉炽儓鍚� (銈儣銈枫儳銉�)
+      </Property>
+      <Property name='file' type='multipart/form-data' key='file'>
+        銈€儍銉椼儹銉笺儔銇欍倠銉曘偂銈ゃ儷
+      </Property>
+      <Property name='process_rule' type='object' key='process_rule'>
+        鍑︾悊銉兗銉�
+          - <code>mode</code> (string) 銈儶銉笺儖銉炽偘銆併偦銈般儭銉炽儐銉笺偡銉с兂銉€兗銉夈�佽嚜鍕� / 銈偣銈裤儬
+          - <code>rules</code> (object) 銈偣銈裤儬銉兗銉� (鑷嫊銉€兗銉夈仹銇�併亾銇儠銈c兗銉儔銇┖)
+            - <code>pre_processing_rules</code> (array[object]) 鍓嶅嚘鐞嗐儷銉笺儷
+              - <code>id</code> (string) 鍓嶅嚘鐞嗐儷銉笺儷銇竴鎰忚瓨鍒ュ瓙
+                - 鍒楁寵
+                  - <code>remove_extra_spaces</code> 閫g稓銇欍倠銈广儦銉笺偣銆佹敼琛屻�併偪銉栥倰缃彌
+                  - <code>remove_urls_emails</code> URL銆併儭銉笺儷銈€儔銉偣銈掑墛闄�
+              - <code>enabled</code> (bool) 銇撱伄銉兗銉倰閬告姙銇欍倠銇嬨仼銇嗐亱銆傘儔銈儱銉°兂銉� ID 銇屾浮銇曘倢銇亜鍫村悎銆併儑銉曘偐銉儓鍊ゃ倰琛ㄣ仐銇俱仚銆�
+            - <code>segmentation</code> (object) 銈汇偘銉°兂銉嗐兗銈枫儳銉炽儷銉笺儷
+              - <code>separator</code> 銈偣銈裤儬銈汇偘銉°兂銉堣瓨鍒ュ瓙銆傜従鍦ㄣ伅 1 銇ゃ伄鍖哄垏銈婃枃瀛椼伄銇胯ō瀹氬彲鑳姐�傘儑銉曘偐銉儓銇� \n
+              - <code>max_tokens</code> 鏈�澶ч暦 (銉堛兗銈兂) 銉囥儠銈┿儷銉堛伅 1000
+            - <code>parent_mode</code> 瑕儊銉c兂銈伄妞滅储銉€兗銉�: <code>full-doc</code> 鍏ㄦ枃妞滅储 / <code>paragraph</code> 娈佃惤妞滅储
+            - <code>subchunk_segmentation</code> (object) 瀛愩儊銉c兂銈儷銉笺儷
+              - <code>separator</code> 銈汇偘銉°兂銉嗐兗銈枫儳銉宠瓨鍒ュ瓙銆傜従鍦ㄣ伅 1 銇ゃ伄鍖哄垏銈婃枃瀛椼伄銇胯ū鍙�傘儑銉曘偐銉儓銇� <code>***</code>
+              - <code>max_tokens</code> 鏈�澶ч暦 (銉堛兗銈兂) 銇Κ銉併儯銉炽偗銇暦銇曘倛銈婄煭銇勩亾銇ㄣ倰妞滆銇欍倠蹇呰銇屻亗銈娿伨銇�
+              - <code>chunk_overlap</code> 闅f帴銇欍倠銉併儯銉炽偗闁撱伄閲嶈銈掑畾缇� (銈儣銈枫儳銉�)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/update-by-file"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/update-by-file' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'data="{"name":"Dify","indexing_technique":"high_quality","process_rule":{"rules":{"pre_processing_rules":[{"id":"remove_extra_spaces","enabled":true},{"id":"remove_urls_emails","enabled":true}],"segmentation":{"separator":"###","max_tokens":500}},"mode":"custom"}}";type=text/plain' \\\n--form 'file=@"/path/to/file"'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/update-by-file' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'data="{\"name\":\"Dify\",\"indexing_technique\":\"high_quality\",\"process_rule\":{\"rules\":{\"pre_processing_rules\":[{\"id\":\"remove_extra_spaces\",\"enabled\":true},{\"id\":\"remove_urls_emails\",\"enabled\":true}],\"segmentation\":{\"separator\":\"###\",\"max_tokens\":500}},\"mode\":\"custom\"}}";type=text/plain' \
+    --form 'file=@"/path/to/file"'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "document": {
+        "id": "",
+        "position": 1,
+        "data_source_type": "upload_file",
+        "data_source_info": {
+          "upload_file_id": ""
+        },
+        "dataset_process_rule_id": "",
+        "name": "Dify.txt",
+        "created_from": "api",
+        "created_by": "",
+        "created_at": 1695308667,
+        "tokens": 0,
+        "indexing_status": "waiting",
+        "error": null,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "archived": false,
+        "display_status": "queuing",
+        "word_count": 0,
+        "hit_count": 0,
+        "doc_form": "text_model"
+      },
+      "batch": "20230921150427533684"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{batch}/indexing-status'
+  method='GET'
+  title='銉夈偔銉ャ儭銉炽儓銇煁銈佽炯銇裤偣銉嗐兗銈裤偣 (閫茶鐘舵硜) 銈掑彇寰�'
+  name='#indexing_status'
+/>
+<Row>
+  <Col>
+    ### 銉戙儵銉°兗銈�
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='batch' type='string' key='batch'>
+        銈€儍銉椼儹銉笺儔銇曘倢銇熴儔銈儱銉°兂銉堛伄銉愩儍銉佺暘鍙�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents/{batch}/indexing-status"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{batch}/indexing-status' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{batch}/indexing-status' \
+    --header 'Authorization: Bearer {api_key}' \
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "data":[{
+        "id": "",
+        "indexing_status": "indexing",
+        "processing_started_at": 1681623462.0,
+        "parsing_completed_at": 1681623462.0,
+        "cleaning_completed_at": 1681623462.0,
+        "splitting_completed_at": 1681623462.0,
+        "completed_at": null,
+        "paused_at": null,
+        "error": null,
+        "stopped_at": null,
+        "completed_segments": 24,
+        "total_segments": 100
+      }]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}'
+  method='DELETE'
+  title='銉夈偔銉ャ儭銉炽儓銈掑墛闄�'
+  name='#delete_document'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        銉夈偔銉ャ儭銉炽儓 ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="DELETE"
+      label="/datasets/{dataset_id}/documents/{document_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```text {{ title: '銉偣銉濄兂銈�' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents'
+  method='GET'
+  title='銉娿儸銉冦偢銉欍兗銈广伄銉夈偔銉ャ儭銉炽儓銉偣銉堛倰鍙栧緱'
+  name='#dataset_document_list'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+    </Properties>
+
+    ### 銈偍銉�
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        妞滅储銈兗銉兗銉夈�佺従鍦ㄣ伅銉夈偔銉ャ儭銉炽儓鍚嶃伄銇挎绱� (銈儣銈枫儳銉�)
+      </Property>
+      <Property name='page' type='string' key='page'>
+        銉氥兗銈哥暘鍙� (銈儣銈枫儳銉�)
+      </Property>
+      <Property name='limit' type='string' key='limit'>
+        杩斻仌銈屻倠銈€偆銉嗐儬鏁般�併儑銉曘偐銉儓銇� 20銆佺瘎鍥层伅 1-100 (銈儣銈枫儳銉�)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents' \
+    --header 'Authorization: Bearer {api_key}' \
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [
+        {
+          "id": "",
+          "position": 1,
+          "data_source_type": "file_upload",
+          "data_source_info": null,
+          "dataset_process_rule_id": null,
+          "name": "dify",
+          "created_from": "",
+          "created_by": "",
+          "created_at": 1681623639,
+          "tokens": 0,
+          "indexing_status": "waiting",
+          "error": null,
+          "enabled": true,
+          "disabled_at": null,
+          "disabled_by": null,
+          "archived": false
+        },
+      ],
+      "has_more": false,
+      "limit": 20,
+      "total": 9,
+      "page": 1
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments'
+  method='POST'
+  title='銉夈偔銉ャ儭銉炽儓銇儊銉c兂銈倰杩藉姞'
+  name='#create_new_segment'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        銉夈偔銉ャ儭銉炽儓 ID
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    <Properties>
+      <Property name='segments' type='object list' key='segments'>
+        - <code>content</code> (text) 銉嗐偔銈广儓鍐呭 / 璩晱鍐呭銆佸繀闋�
+        - <code>answer</code> (text) 鍥炵瓟鍐呭銆併儕銉儍銈搞伄銉€兗銉夈亴 Q&A 銉€兗銉夈伄鍫村悎銇�ゃ倰娓°仐銇俱仚 (銈儣銈枫儳銉�)
+        - <code>keywords</code> (list) 銈兗銉兗銉� (銈儣銈枫儳銉�)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"segments": [{"content": "1","answer": "1","keywords": ["a"]}]}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+      "segments": [
+        {
+          "content": "1",
+          "answer": "1",
+          "keywords": ["a"]
+        }
+      ]
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [{
+        "id": "",
+        "position": 1,
+        "document_id": "",
+        "content": "1",
+        "answer": "1",
+        "word_count": 25,
+        "tokens": 0,
+        "keywords": [
+          "a"
+        ],
+        "index_node_id": "",
+        "index_node_hash": "",
+        "hit_count": 0,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }],
+      "doc_form": "text_model"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments'
+  method='GET'
+  title='銉夈偔銉ャ儭銉炽儓銇嬨倝銉併儯銉炽偗銈掑彇寰�'
+  name='#get_segment'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        銉夈偔銉ャ儭銉炽儓 ID
+      </Property>
+    </Properties>
+
+     ### 銈偍銉�
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        銈兗銉兗銉� (銈儣銈枫儳銉�)
+      </Property>
+      <Property name='status' type='string' key='status'>
+        妞滅储銈广儐銉笺偪銈广�乧ompleted
+      </Property>
+      <Property name='page' type='string' key='page'>
+        銉氥兗銈哥暘鍙� (銈儣銈枫儳銉�)
+      </Property>
+      <Property name='limit' type='string' key='limit'>
+        杩斻仌銈屻倠銈€偆銉嗐儬鏁般�併儑銉曘偐銉儓銇� 20銆佺瘎鍥层伅 1-100 (銈儣銈枫儳銉�)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [{
+        "id": "",
+        "position": 1,
+        "document_id": "",
+        "content": "1",
+        "answer": "1",
+        "word_count": 25,
+        "tokens": 0,
+        "keywords": [
+            "a"
+        ],
+        "index_node_id": "",
+        "index_node_hash": "",
+        "hit_count": 0,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }],
+      "doc_form": "text_model",
+      "has_more": false,
+      "limit": 20,
+      "total": 9,
+      "page": 1
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}'
+  method='DELETE'
+  title='銉夈偔銉ャ儭銉炽儓鍐呫伄銉併儯銉炽偗銈掑墛闄�'
+  name='#delete_segment'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        銉夈偔銉ャ儭銉炽儓 ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        銉夈偔銉ャ儭銉炽儓銈汇偘銉°兂銉� ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="DELETE"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```text {{ title: '銉偣銉濄兂銈�' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}'
+  method='POST'
+  title='銉夈偔銉ャ儭銉炽儓鍐呫伄銉併儯銉炽偗銈掓洿鏂�'
+  name='#update_segment'
+/>
+<Row>
+  <Col>
+    ### POST
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        銉夈偔銉ャ儭銉炽儓 ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        銉夈偔銉ャ儭銉炽儓銈汇偘銉°兂銉� ID
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    <Properties>
+      <Property name='segment' type='object' key='segment'>
+        - <code>content</code> (text) 銉嗐偔銈广儓鍐呭 / 璩晱鍐呭銆佸繀闋�
+        - <code>answer</code> (text) 鍥炵瓟鍐呭銆併儕銉儍銈搞亴 Q&A 銉€兗銉夈伄鍫村悎銇�ゃ倰娓°仐銇俱仚 (銈儣銈枫儳銉�)
+        - <code>keywords</code> (list) 銈兗銉兗銉� (銈儣銈枫儳銉�)
+        - <code>enabled</code> (bool) False / true (銈儣銈枫儳銉�)
+        - <code>regenerate_child_chunks</code> (bool) 瀛愩儊銉c兂銈倰鍐嶇敓鎴愩仚銈嬨亱銇┿亞銇� (銈儣銈枫儳銉�)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'\\\n--data-raw '{\"segment\": {\"content\": \"1\",\"answer\": \"1\", \"keywords\": [\"a\"], \"enabled\": false}}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+      "segment": {
+          "content": "1",
+          "answer": "1",
+          "keywords": ["a"],
+          "enabled": false
+      }
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "data": {
+        "id": "",
+        "position": 1,
+        "document_id": "",
+        "content": "1",
+        "answer": "1",
+        "word_count": 25,
+        "tokens": 0,
+        "keywords": [
+            "a"
+        ],
+        "index_node_id": "",
+        "index_node_hash": "",
+        "hit_count": 0,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      },
+      "doc_form": "text_model"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks'
+  method='POST'
+  title='瀛愩儊銉c兂銈倰浣滄垚'
+  name='#create_child_chunk'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        銉夈偔銉ャ儭銉炽儓 ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        銈汇偘銉°兂銉� ID
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    <Properties>
+      <Property name='content' type='string' key='content'>
+        瀛愩儊銉c兂銈伄鍐呭
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"content": "Child chunk content"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "content": "Child chunk content"
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "data": {
+        "id": "",
+        "segment_id": "",
+        "content": "Child chunk content",
+        "word_count": 25,
+        "tokens": 0,
+        "index_node_id": "",
+        "index_node_hash": "",
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks'
+  method='GET'
+  title='瀛愩儊銉c兂銈倰鍙栧緱'
+  name='#get_child_chunks'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        銉夈偔銉ャ儭銉炽儓 ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        銈汇偘銉°兂銉� ID
+      </Property>
+    </Properties>
+
+    ### 銈偍銉�
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        妞滅储銈兗銉兗銉� (銈儣銈枫儳銉�)
+      </Property>
+      <Property name='page' type='integer' key='page'>
+        銉氥兗銈哥暘鍙� (銈儣銈枫儳銉炽�併儑銉曘偐銉儓: 1)
+      </Property>
+      <Property name='limit' type='integer' key='limit'>
+        銉氥兗銈搞亗銇熴倞銇偄銈ゃ儐銉犳暟 (銈儣銈枫儳銉炽�併儑銉曘偐銉儓: 20銆佹渶澶�: 100)
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks?page=1&limit=20' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [{
+        "id": "",
+        "segment_id": "",
+        "content": "Child chunk content",
+        "word_count": 25,
+        "tokens": 0,
+        "index_node_id": "",
+        "index_node_hash": "",
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }],
+      "total": 1,
+      "total_pages": 1,
+      "page": 1,
+      "limit": 20
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}'
+  method='DELETE'
+  title='瀛愩儊銉c兂銈倰鍓婇櫎'
+  name='#delete_child_chunk'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        銉夈偔銉ャ儭銉炽儓 ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        銈汇偘銉°兂銉� ID
+      </Property>
+      <Property name='child_chunk_id' type='string' key='child_chunk_id'>
+        瀛愩儊銉c兂銈� ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="DELETE"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/segments/{segment_id}/child_chunks/{child_chunk_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/segments/{segment_id}/child_chunks/{child_chunk_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```text {{ title: '銉偣銉濄兂銈�' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}'
+  method='PATCH'
+  title='瀛愩儊銉c兂銈倰鏇存柊'
+  name='#update_child_chunk'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        銉夈偔銉ャ儭銉炽儓 ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        銈汇偘銉°兂銉� ID
+      </Property>
+      <Property name='child_chunk_id' type='string' key='child_chunk_id'>
+        瀛愩儊銉c兂銈� ID
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    <Properties>
+      <Property name='content' type='string' key='content'>
+        瀛愩儊銉c兂銈伄鍐呭
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="PATCH"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}"
+      targetCode={`curl --location --request PATCH '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"content": "Updated child chunk content"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request PATCH '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "content": "Updated child chunk content"
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "data": {
+        "id": "",
+        "segment_id": "",
+        "content": "Updated child chunk content",
+        "word_count": 25,
+        "tokens": 0,
+        "index_node_id": "",
+        "index_node_hash": "",
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/upload-file'
+  method='GET'
+  title='銈€儍銉椼儹銉笺儔銉曘偂銈ゃ儷銈掑彇寰�'
+  name='#get_upload_file'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        銉夈偔銉ャ儭銉炽儓 ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents/{document_id}/upload-file"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/upload-file' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/upload-file' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "file_id",
+      "name": "file_name",
+      "size": 1024,
+      "extension": "txt",
+      "url": "preview_url",
+      "download_url": "download_url",
+      "mime_type": "text/plain",
+      "created_by": "user_id",
+      "created_at": 1728734540,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/retrieve'
+  method='POST'
+  title='銉娿儸銉冦偢銉欍兗銈广亱銈夈儊銉c兂銈倰鍙栧緱'
+  name='#dataset_retrieval'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    <Properties>
+      <Property name='query' type='string' key='query'>
+        銈偍銉偔銉笺儻銉笺儔
+      </Property>
+      <Property name='retrieval_model' type='object' key='retrieval_model'>
+        妞滅储銉€儑銉� (銈儣銈枫儳銉炽�佸叆鍔涖仌銈屻仾銇勫牬鍚堛伅銉囥儠銈┿儷銉堛伄鏂规硶銇с儶銈炽兗銉仌銈屻伨銇�)
+        - <code>search_method</code> (text) 妞滅储鏂规硶: 浠ヤ笅銇� 4 銇ゃ伄銈兗銉兗銉夈伄銇勩仛銈屻亱銇屽繀瑕併仹銇�
+          - <code>keyword_search</code> 銈兗銉兗銉夋绱�
+          - <code>semantic_search</code> 銈汇優銉炽儐銈c儍銈绱�
+          - <code>full_text_search</code> 鍏ㄦ枃妞滅储
+          - <code>hybrid_search</code> 銉忋偆銉栥儶銉冦儔妞滅储
+        - <code>reranking_enable</code> (bool) 鍐嶃儵銉炽偔銉炽偘銈掓湁鍔广伀銇欍倠銇嬨仼銇嗐亱銆佹绱€儮銉笺儔銇� semantic_search 銇俱仧銇� hybrid_search 銇牬鍚堛伀蹇呴爤 (銈儣銈枫儳銉�)
+        - <code>reranking_mode</code> (object) 鍐嶃儵銉炽偔銉炽偘銉€儑銉鎴愩�佸啀銉┿兂銈兂銈般亴鏈夊姽銇牬鍚堛伀蹇呴爤
+            - <code>reranking_provider_name</code> (string) 鍐嶃儵銉炽偔銉炽偘銉€儑銉儣銉儛銈ゃ儉銉�
+            - <code>reranking_model_name</code> (string) 鍐嶃儵銉炽偔銉炽偘銉€儑銉悕
+        - <code>weights</code> (float) 銉忋偆銉栥儶銉冦儔妞滅储銉€兗銉夈仹銇偦銉炪兂銉嗐偅銉冦偗妞滅储銇噸銇胯ō瀹�
+        - <code>top_k</code> (integer) 杩斻仌銈屻倠绲愭灉銇暟 (銈儣銈枫儳銉�)
+        - <code>score_threshold_enabled</code> (bool) 銈广偝銈㈤柧鍊ゃ倰鏈夊姽銇仚銈嬨亱銇┿亞銇�
+        - <code>score_threshold</code> (float) 銈广偝銈㈤柧鍊�
+      </Property>
+      <Property name='external_retrieval_model' type='object' key='external_retrieval_model'>
+          鏈娇鐢ㄣ儠銈c兗銉儔
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="POST"
+      label="/datasets/{dataset_id}/retrieve"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/retrieve' \\\n--header 'Authorization: Bearer {api_key}'\\\n--header 'Content-Type: application/json'\\\n--data-raw '{
+    "query": "test",
+    "retrieval_model": {
+        "search_method": "keyword_search",
+        "reranking_enable": false,
+        "reranking_mode": null,
+        "reranking_model": {
+            "reranking_provider_name": "",
+            "reranking_model_name": ""
+        },
+        "weights": null,
+        "top_k": 1,
+        "score_threshold_enabled": false,
+        "score_threshold": null
+    }
+}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/retrieve' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "query": "test",
+        "retrieval_model": {
+            "search_method": "keyword_search",
+            "reranking_enable": false,
+            "reranking_mode": null,
+            "reranking_model": {
+                "reranking_provider_name": "",
+                "reranking_model_name": ""
+            },
+            "weights": null,
+            "top_k": 2,
+            "score_threshold_enabled": false,
+            "score_threshold": null
+        }
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "query": {
+        "content": "test"
+      },
+      "records": [
+        {
+          "segment": {
+            "id": "7fa6f24f-8679-48b3-bc9d-bdf28d73f218",
+            "position": 1,
+            "document_id": "a8c6c36f-9f5d-4d7a-8472-f5d7b75d71d2",
+            "content": "Operation guide",
+            "answer": null,
+            "word_count": 847,
+            "tokens": 280,
+            "keywords": [
+              "install",
+              "java",
+              "base",
+              "scripts",
+              "jdk",
+              "manual",
+              "internal",
+              "opens",
+              "add",
+              "vmoptions"
+            ],
+            "index_node_id": "39dd8443-d960-45a8-bb46-7275ad7fbc8e",
+            "index_node_hash": "0189157697b3c6a418ccf8264a09699f25858975578f3467c76d6bfc94df1d73",
+            "hit_count": 0,
+            "enabled": true,
+            "disabled_at": null,
+            "disabled_by": null,
+            "status": "completed",
+            "created_by": "dbcb1ab5-90c8-41a7-8b78-73b235eb6f6f",
+            "created_at": 1728734540,
+            "indexing_at": 1728734552,
+            "completed_at": 1728734584,
+            "error": null,
+            "stopped_at": null,
+            "document": {
+              "id": "a8c6c36f-9f5d-4d7a-8472-f5d7b75d71d2",
+              "data_source_type": "upload_file",
+              "name": "readme.txt",
+            }
+          },
+          "score": 3.730463140527718e-05,
+          "tsne_position": null
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata'
+  method='POST'
+  title='銉娿儸銉冦偢銉°偪銉囥兗銈裤倰浣滄垚'
+  name='#create_metadata'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    <Properties>
+      <Property name='segment' type='object' key='segment'>
+        - <code>type</code> (string) 銉°偪銉囥兗銈裤伄绋銆佸繀闋�
+        - <code>name</code> (string) 銉°偪銉囥兗銈裤伄鍚嶅墠銆佸繀闋�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="POST"
+      label="/datasets/{dataset_id}/metadata"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/metadata' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'\\\n--data-raw '{"type": "string", "name": "test"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "abc",
+      "type": "string",
+      "name": "test",
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata/{metadata_id}'
+  method='PATCH'
+  title='銉娿儸銉冦偢銉°偪銉囥兗銈裤倰鏇存柊'
+  name='#update_metadata'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='metadata_id' type='string' key='metadata_id'>
+        銉°偪銉囥兗銈� ID
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    <Properties>
+      <Property name='segment' type='object' key='segment'>
+        - <code>name</code> (string) 銉°偪銉囥兗銈裤伄鍚嶅墠銆佸繀闋�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="PATCH"
+      label="/datasets/{dataset_id}/metadata/{metadata_id}"
+      targetCode={`curl --location --request PATCH '${props.apiBaseUrl}/datasets/{dataset_id}/metadata/{metadata_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'\\\n--data-raw '{"name": "test"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "abc",
+      "type": "string",
+      "name": "test",
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata/{metadata_id}'
+  method='DELETE'
+  title='銉娿儸銉冦偢銉°偪銉囥兗銈裤倰鍓婇櫎'
+  name='#delete_metadata'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='metadata_id' type='string' key='metadata_id'>
+        銉°偪銉囥兗銈� ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="DELETE"
+      label="/datasets/{dataset_id}/metadata/{metadata_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/metadata/{metadata_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata/built-in/{action}'
+  method='POST'
+  title='绲勩伩杈笺伩銉°偪銉囥兗銈裤倰鐒″姽鍖栥伨銇熴伅鏈夊姽鍖�'
+  name='#toggle_metadata'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+      <Property name='action' type='string' key='action'>
+        disable/enable
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="POST"
+      label="/datasets/{dataset_id}/metadata/built-in/{action}"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/metadata/built-in/{action}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/metadata'
+  method='POST'
+  title='銉夈偔銉ャ儭銉炽儓銉°偪銉囥兗銈裤倰鏇存柊'
+  name='#update_documents_metadata'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    <Properties>
+      <Property name='operation_data' type='object list' key='segments'>
+        - <code>document_id</code> (string) 銉夈偔銉ャ儭銉炽儓 ID
+        - <code>metadata_list</code> (list) 銉°偪銉囥兗銈裤儶銈广儓
+          - <code>id</code> (string) 銉°偪銉囥兗銈� ID
+          - <code>value</code> (string) 銉°偪銉囥兗銈裤伄鍊�
+          - <code>name</code> (string) 銉°偪銉囥兗銈裤伄鍚嶅墠
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/metadata"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/metadata' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'\\\n--data-raw '{"operation_data": [{"document_id": "document_id", "metadata_list": [{"id": "id", "value": "value", "name": "name"}]}]}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata'
+  method='GET'
+  title='銉娿儸銉冦偢銉°偪銉囥兗銈裤儶銈广儓銈掑彇寰�'
+  name='#dataset_metadata_list'
+/>
+<Row>
+  <Col>
+    ### 銉戙偣
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        銉娿儸銉冦偢 ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="銉偗銈ㄣ偣銉�"
+      tag="GET"
+      label="/datasets/{dataset_id}/metadata"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/metadata' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉偣銉濄兂銈�">
+    ```json {{ title: 'Response' }}
+    {
+      "doc_metadata": [
+        {
+          "id": "",
+          "name": "name",
+          "type": "string",
+          "use_count": 0,
+        },
+        ...
+      ],
+      "built_in_field_enabled": true
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Row>
+  <Col>
+    ### 銈ㄣ儵銉笺儭銉冦偦銉笺偢
+    <Properties>
+      <Property name='code' type='string' key='code'>
+        銈ㄣ儵銉笺偝銉笺儔
+      </Property>
+    </Properties>
+    <Properties>
+      <Property name='status' type='number' key='status'>
+        銈ㄣ儵銉笺偣銉嗐兗銈裤偣
+      </Property>
+    </Properties>
+    <Properties>
+      <Property name='message' type='string' key='message'>
+        銈ㄣ儵銉笺儭銉冦偦銉笺偢
+      </Property>
+    </Properties>
+  </Col>
+  <Col>
+    <CodeGroup title="渚�">
+    ```json {{ title: 'Response' }}
+      {
+        "code": "no_file_uploaded",
+        "message": "Please upload your file.",
+        "status": 400
+      }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+<table className="max-w-auto border-collapse border border-slate-400" style={{ maxWidth: 'none', width: 'auto' }}>
+  <thead style={{ background: '#f9fafc' }}>
+    <tr>
+      <th className="p-2 border border-slate-300">code</th>
+      <th className="p-2 border border-slate-300">status</th>
+      <th className="p-2 border border-slate-300">message</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td className="p-2 border border-slate-300">no_file_uploaded</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">Please upload your file.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">too_many_files</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">Only one file is allowed.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">file_too_large</td>
+      <td className="p-2 border border-slate-300">413</td>
+      <td className="p-2 border border-slate-300">File size exceeded.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">unsupported_file_type</td>
+      <td className="p-2 border border-slate-300">415</td>
+      <td className="p-2 border border-slate-300">File type not allowed.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">high_quality_dataset_only</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">Current operation only supports 'high-quality' datasets.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">dataset_not_initialized</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">The dataset is still being initialized or indexing. Please wait a moment.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">archived_document_immutable</td>
+      <td className="p-2 border border-slate-300">403</td>
+      <td className="p-2 border border-slate-300">The archived document is not editable.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">dataset_name_duplicate</td>
+      <td className="p-2 border border-slate-300">409</td>
+      <td className="p-2 border border-slate-300">The dataset name already exists. Please modify your dataset name.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">invalid_action</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">Invalid action.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">document_already_finished</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">The document has been processed. Please refresh the page or go to the document details.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">document_indexing</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">The document is being processed and cannot be edited.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">invalid_metadata</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">The metadata content is incorrect. Please check and verify.</td>
+    </tr>
+  </tbody>
+</table>
+<div className="pb-4" />
diff --git "a/app/\050commonLayout\051/datasets/template/template.zh.mdx" "b/app/\050commonLayout\051/datasets/template/template.zh.mdx"
new file mode 100644
index 0000000..e3c716e
--- /dev/null
+++ "b/app/\050commonLayout\051/datasets/template/template.zh.mdx"
@@ -0,0 +1,2394 @@
+{/**
+  * @typedef Props
+  * @property {string} apiBaseUrl
+  */}
+
+import { CodeGroup } from '@/app/components/develop/code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty, PropertyInstruction, Paragraph } from '@/app/components/develop/md.tsx'
+
+# 鐭ヨ瘑搴� API
+
+<div>
+  ### 閴存潈
+
+  Dify Service API 浣跨敤 `API-Key` 杩涜閴存潈銆�
+
+  寤鸿寮�鍙戣�呮妸 `API-Key` 鏀惧湪鍚庣瀛樺偍锛岃�岄潪鍒嗕韩鎴栬�呮斁鍦ㄥ鎴风瀛樺偍锛屼互鍏� `API-Key` 娉勯湶锛屽鑷磋储浜ф崯澶便��
+
+  鎵�鏈� API 璇锋眰閮藉簲鍦� **`Authorization`** HTTP Header 涓寘鍚偍鐨� `API-Key`锛屽涓嬫墍绀猴細
+
+  <CodeGroup title="Code">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+
+    ```
+  </CodeGroup>
+</div>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/document/create-by-text'
+  method='POST'
+  title='閫氳繃鏂囨湰鍒涘缓鏂囨。'
+  name='#create-by-text'
+/>
+<Row>
+  <Col>
+    姝ゆ帴鍙e熀浜庡凡瀛樺湪鐭ヨ瘑搴擄紝鍦ㄦ鐭ヨ瘑搴撶殑鍩虹涓婇�氳繃鏂囨湰鍒涘缓鏂扮殑鏂囨。
+
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        鏂囨。鍚嶇О
+      </Property>
+      <Property name='text' type='string' key='text'>
+        鏂囨。鍐呭
+      </Property>
+      <Property name='indexing_technique' type='string' key='indexing_technique'>
+        绱㈠紩鏂瑰紡
+          - <code>high_quality</code> 楂樿川閲忥細浣跨敤  
+        ding 妯″瀷杩涜宓屽叆锛屾瀯寤轰负鍚戦噺鏁版嵁搴撶储寮�
+          - <code>economy</code> 缁忔祹锛氫娇鐢� keyword table index 鐨勫�掓帓绱㈠紩杩涜鏋勫缓
+      </Property>
+      <Property name='doc_form' type='string' key='doc_form'>
+        绱㈠紩鍐呭鐨勫舰寮�
+          - <code>text_model</code> text 鏂囨。鐩存帴 embedding锛岀粡娴庢ā寮忛粯璁や负璇ユā寮�
+          - <code>hierarchical_model</code> parent-child 妯″紡
+          - <code>qa_model</code> Q&A 妯″紡锛氫负鍒嗙墖鏂囨。鐢熸垚 Q&A 瀵癸紝鐒跺悗瀵归棶棰樿繘琛� embedding
+      </Property>
+      <Property name='doc_language' type='string' key='doc_language'>
+        鍦� Q&A 妯″紡涓嬶紝鎸囧畾鏂囨。鐨勮瑷�锛屼緥濡傦細<code>English</code>銆�<code>Chinese</code>
+      </Property>
+      <Property name='process_rule' type='object' key='process_rule'>
+        澶勭悊瑙勫垯
+          - <code>mode</code> (string) 娓呮礂銆佸垎娈垫ā寮� 锛宎utomatic 鑷姩 / custom 鑷畾涔�
+          - <code>rules</code> (object) 鑷畾涔夎鍒欙紙鑷姩妯″紡涓嬶紝璇ュ瓧娈典负绌猴級
+            - <code>pre_processing_rules</code> (array[object]) 棰勫鐞嗚鍒�
+              - <code>id</code> (string) 棰勫鐞嗚鍒欑殑鍞竴鏍囪瘑绗�
+                - 鏋氫妇锛�
+                  - <code>remove_extra_spaces</code> 鏇挎崲杩炵画绌烘牸銆佹崲琛岀銆佸埗琛ㄧ
+                  - <code>remove_urls_emails</code> 鍒犻櫎 URL銆佺數瀛愰偖浠跺湴鍧�
+              - <code>enabled</code> (bool) 鏄惁閫変腑璇ヨ鍒欙紝涓嶄紶鍏ユ枃妗� ID 鏃朵唬琛ㄩ粯璁ゅ��
+            - <code>segmentation</code> (object) 鍒嗘瑙勫垯
+              - <code>separator</code> 鑷畾涔夊垎娈垫爣璇嗙锛岀洰鍓嶄粎鍏佽璁剧疆涓�涓垎闅旂銆傞粯璁や负 <code>\n</code>
+              - <code>max_tokens</code> 鏈�澶ч暱搴︼紙token锛夐粯璁や负 1000
+            - <code>parent_mode</code> 鐖跺垎娈电殑鍙洖妯″紡 <code>full-doc</code> 鍏ㄦ枃鍙洖 / <code>paragraph</code> 娈佃惤鍙洖
+            - <code>subchunk_segmentation</code> (object) 瀛愬垎娈佃鍒�
+              - <code>separator</code> 鍒嗘鏍囪瘑绗︼紝鐩墠浠呭厑璁歌缃竴涓垎闅旂銆傞粯璁や负 <code>***</code>
+              - <code>max_tokens</code> 鏈�澶ч暱搴� (token) 闇�瑕佹牎楠屽皬浜庣埗绾х殑闀垮害
+              - <code>chunk_overlap</code> 鍒嗘閲嶅彔鎸囩殑鏄湪瀵规暟鎹繘琛屽垎娈垫椂锛屾涓庢涔嬮棿瀛樺湪涓�瀹氱殑閲嶅彔閮ㄥ垎锛堥�夊~锛�
+      </Property>
+      <PropertyInstruction>褰撶煡璇嗗簱鏈缃换浣曞弬鏁扮殑鏃跺�欙紝棣栨涓婁紶闇�瑕佹彁渚涗互涓嬪弬鏁帮紝鏈彁渚涘垯浣跨敤榛樿閫夐」锛�</PropertyInstruction>
+      <Property name='retrieval_model' type='object' key='retrieval_model'>
+        妫�绱㈡ā寮�
+          - <code>search_method</code> (string) 妫�绱㈡柟娉�
+            - <code>hybrid_search</code> 娣峰悎妫�绱�
+            - <code>semantic_search</code> 璇箟妫�绱�
+            - <code>full_text_search</code> 鍏ㄦ枃妫�绱�
+          - <code>reranking_enable</code> (bool) 鏄惁寮�鍚痳erank
+          - <code>reranking_mode</code> (String) 娣峰悎妫�绱�
+            - <code>weighted_score</code> 鏉冮噸璁剧疆
+            - <code>reranking_model</code> Rerank 妯″瀷
+          - <code>reranking_model</code> (object) Rerank 妯″瀷閰嶇疆
+            - <code>reranking_provider_name</code> (string) Rerank 妯″瀷鐨勬彁渚涘晢
+            - <code>reranking_model_name</code> (string) Rerank 妯″瀷鐨勫悕绉�
+          - <code>top_k</code> (int) 鍙洖鏉℃暟
+          - <code>score_threshold_enabled</code> (bool)鏄惁寮�鍚彫鍥炲垎鏁伴檺鍒�
+          - <code>score_threshold</code> (float) 鍙洖鍒嗘暟闄愬埗
+      </Property>
+      <Property name='embedding_model' type='string' key='embedding_model'>
+        Embedding 妯″瀷鍚嶇О
+      </Property>
+      <Property name='embedding_model_provider' type='string' key='embedding_model_provider'>
+        Embedding 妯″瀷渚涘簲鍟�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/document/create-by-text"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/document/create-by-text' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "text","text": "text","indexing_technique": "high_quality","process_rule": {"mode": "automatic"}}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/document/create-by-text' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "name": "text",
+        "text": "text",
+        "indexing_technique": "high_quality",
+        "process_rule": {
+            "mode": "automatic"
+        }
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "document": {
+        "id": "",
+        "position": 1,
+        "data_source_type": "upload_file",
+        "data_source_info": {
+            "upload_file_id": ""
+        },
+        "dataset_process_rule_id": "",
+        "name": "text.txt",
+        "created_from": "api",
+        "created_by": "",
+        "created_at": 1695690280,
+        "tokens": 0,
+        "indexing_status": "waiting",
+        "error": null,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "archived": false,
+        "display_status": "queuing",
+        "word_count": 0,
+        "hit_count": 0,
+        "doc_form": "text_model"
+      },
+      "batch": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/document/create-by-file'
+  method='POST'
+  title='閫氳繃鏂囦欢鍒涘缓鏂囨。 '
+  name='#create-by-file'
+/>
+<Row>
+  <Col>
+    姝ゆ帴鍙e熀浜庡凡瀛樺湪鐭ヨ瘑搴擄紝鍦ㄦ鐭ヨ瘑搴撶殑鍩虹涓婇�氳繃鏂囦欢鍒涘缓鏂扮殑鏂囨。
+
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='data' type='multipart/form-data json string' key='data'>
+        - <code>original_document_id</code> 婧愭枃妗� ID锛堥�夊~锛�
+          - 鐢ㄤ簬閲嶆柊涓婁紶鏂囨。鎴栦慨鏀规枃妗f竻娲椼�佸垎娈甸厤缃紝缂哄け鐨勪俊鎭粠婧愭枃妗e鍒�
+          - 婧愭枃妗d笉鍙负褰掓。鐨勬枃妗�
+          - 褰撲紶鍏� <code>original_document_id</code> 鏃讹紝浠h〃鏂囨。杩涜鏇存柊鎿嶄綔锛�<code>process_rule</code> 涓哄彲濉」鐩紝涓嶅~榛樿浣跨敤婧愭枃妗g殑鍒嗘鏂瑰紡
+          - 鏈紶鍏� <code>original_document_id</code> 鏃讹紝浠h〃鏂囨。杩涜鏂板鎿嶄綔锛�<code>process_rule</code> 涓哄繀濉�
+
+        - <code>indexing_technique</code> 绱㈠紩鏂瑰紡
+          - <code>high_quality</code> 楂樿川閲忥細浣跨敤  embedding 妯″瀷杩涜宓屽叆锛屾瀯寤轰负鍚戦噺鏁版嵁搴撶储寮�
+          - <code>economy</code> 缁忔祹锛氫娇鐢� keyword table index 鐨勫�掓帓绱㈠紩杩涜鏋勫缓
+
+        - <code>doc_form</code> 绱㈠紩鍐呭鐨勫舰寮�
+          - <code>text_model</code> text 鏂囨。鐩存帴 embedding锛岀粡娴庢ā寮忛粯璁や负璇ユā寮�
+          - <code>hierarchical_model</code> parent-child 妯″紡
+          - <code>qa_model</code> Q&A 妯″紡锛氫负鍒嗙墖鏂囨。鐢熸垚 Q&A 瀵癸紝鐒跺悗瀵归棶棰樿繘琛� embedding
+
+        - <code>doc_language</code> 鍦� Q&A 妯″紡涓嬶紝鎸囧畾鏂囨。鐨勮瑷�锛屼緥濡傦細<code>English</code>銆�<code>Chinese</code>
+
+        - <code>process_rule</code> 澶勭悊瑙勫垯
+          - <code>mode</code> (string) 娓呮礂銆佸垎娈垫ā寮� 锛宎utomatic 鑷姩 / custom 鑷畾涔�
+          - <code>rules</code> (object) 鑷畾涔夎鍒欙紙鑷姩妯″紡涓嬶紝璇ュ瓧娈典负绌猴級
+            - <code>pre_processing_rules</code> (array[object]) 棰勫鐞嗚鍒�
+              - <code>id</code> (string) 棰勫鐞嗚鍒欑殑鍞竴鏍囪瘑绗�
+                - 鏋氫妇锛�
+                  - <code>remove_extra_spaces</code> 鏇挎崲杩炵画绌烘牸銆佹崲琛岀銆佸埗琛ㄧ
+                  - <code>remove_urls_emails</code> 鍒犻櫎 URL銆佺數瀛愰偖浠跺湴鍧�
+              - <code>enabled</code> (bool) 鏄惁閫変腑璇ヨ鍒欙紝涓嶄紶鍏ユ枃妗� ID 鏃朵唬琛ㄩ粯璁ゅ��
+            - <code>segmentation</code> (object) 鍒嗘瑙勫垯
+              - <code>separator</code> 鑷畾涔夊垎娈垫爣璇嗙锛岀洰鍓嶄粎鍏佽璁剧疆涓�涓垎闅旂銆傞粯璁や负 \n
+              - <code>max_tokens</code> 鏈�澶ч暱搴︼紙token锛夐粯璁や负 1000
+            - <code>parent_mode</code> 鐖跺垎娈电殑鍙洖妯″紡 <code>full-doc</code> 鍏ㄦ枃鍙洖 / <code>paragraph</code> 娈佃惤鍙洖
+            - <code>subchunk_segmentation</code> (object) 瀛愬垎娈佃鍒�
+              - <code>separator</code> 鍒嗘鏍囪瘑绗︼紝鐩墠浠呭厑璁歌缃竴涓垎闅旂銆傞粯璁や负 <code>***</code>
+              - <code>max_tokens</code> 鏈�澶ч暱搴� (token) 闇�瑕佹牎楠屽皬浜庣埗绾х殑闀垮害
+              - <code>chunk_overlap</code> 鍒嗘閲嶅彔鎸囩殑鏄湪瀵规暟鎹繘琛屽垎娈垫椂锛屾涓庢涔嬮棿瀛樺湪涓�瀹氱殑閲嶅彔閮ㄥ垎锛堥�夊~锛�
+      </Property>
+      <Property name='file' type='multipart/form-data' key='file'>
+        闇�瑕佷笂浼犵殑鏂囦欢銆�
+      </Property>
+      <PropertyInstruction>褰撶煡璇嗗簱鏈缃换浣曞弬鏁扮殑鏃跺�欙紝棣栨涓婁紶闇�瑕佹彁渚涗互涓嬪弬鏁帮紝鏈彁渚涘垯浣跨敤榛樿閫夐」锛�</PropertyInstruction>
+      <Property name='retrieval_model' type='object' key='retrieval_model'>
+        妫�绱㈡ā寮�
+          - <code>search_method</code> (string) 妫�绱㈡柟娉�
+            - <code>hybrid_search</code> 娣峰悎妫�绱�
+            - <code>semantic_search</code> 璇箟妫�绱�
+            - <code>full_text_search</code> 鍏ㄦ枃妫�绱�
+          - <code>reranking_enable</code> (bool) 鏄惁寮�鍚痳erank
+          - <code>reranking_model</code> (object) Rerank 妯″瀷閰嶇疆
+            - <code>reranking_provider_name</code> (string) Rerank 妯″瀷鐨勬彁渚涘晢
+            - <code>reranking_model_name</code> (string) Rerank 妯″瀷鐨勫悕绉�
+          - <code>top_k</code> (int) 鍙洖鏉℃暟
+          - <code>score_threshold_enabled</code> (bool)鏄惁寮�鍚彫鍥炲垎鏁伴檺鍒�
+          - <code>score_threshold</code> (float) 鍙洖鍒嗘暟闄愬埗
+      </Property>
+      <Property name='embedding_model' type='string' key='embedding_model'>
+        Embedding 妯″瀷鍚嶇О
+      </Property>
+      <Property name='embedding_model_provider' type='string' key='embedding_model_provider'>
+        Embedding 妯″瀷渚涘簲鍟�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/document/create-by-file"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/document/create-by-file' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'data="{"indexing_technique":"high_quality","process_rule":{"rules":{"pre_processing_rules":[{"id":"remove_extra_spaces","enabled":true},{"id":"remove_urls_emails","enabled":true}],"segmentation":{"separator":"###","max_tokens":500}},"mode":"custom"}}";type=text/plain' \\\n--form 'file=@"/path/to/file"'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/document/create-by-file' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'data="{\"name\":\"Dify\",\"indexing_technique\":\"high_quality\",\"process_rule\":{\"rules\":{\"pre_processing_rules\":[{\"id\":\"remove_extra_spaces\",\"enabled\":true},{\"id\":\"remove_urls_emails\",\"enabled\":true}],\"segmentation\":{\"separator\":\"###\",\"max_tokens\":500}},\"mode\":\"custom\"}}";type=text/plain' \
+    --form 'file=@"/path/to/file"'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "document": {
+        "id": "",
+        "position": 1,
+        "data_source_type": "upload_file",
+        "data_source_info": {
+          "upload_file_id": ""
+        },
+        "dataset_process_rule_id": "",
+        "name": "Dify.txt",
+        "created_from": "api",
+        "created_by": "",
+        "created_at": 1695308667,
+        "tokens": 0,
+        "indexing_status": "waiting",
+        "error": null,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "archived": false,
+        "display_status": "queuing",
+        "word_count": 0,
+        "hit_count": 0,
+        "doc_form": "text_model"
+      },
+      "batch": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets'
+  method='POST'
+  title='鍒涘缓绌虹煡璇嗗簱'
+  name='#create_empty_dataset'
+/>
+<Row>
+  <Col>
+    ### Request Body
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        鐭ヨ瘑搴撳悕绉帮紙蹇呭~锛�
+      </Property>
+      <Property name='description' type='string' key='description'>
+        鐭ヨ瘑搴撴弿杩帮紙閫夊~锛�
+      </Property>
+      <Property name='indexing_technique' type='string' key='indexing_technique'>
+        绱㈠紩妯″紡锛堥�夊~锛屽缓璁~鍐欙級
+          - <code>high_quality</code> 楂樿川閲�
+          - <code>economy</code> 缁忔祹
+      </Property>
+      <Property name='permission' type='string' key='permission'>
+        鏉冮檺锛堥�夊~锛岄粯璁� only_me锛�
+          - <code>only_me</code> 浠呰嚜宸�
+          - <code>all_team_members</code> 鎵�鏈夊洟闃熸垚鍛�
+          - <code>partial_members</code> 閮ㄥ垎鍥㈤槦鎴愬憳
+      </Property>
+      <Property name='provider' type='string' key='provider'>
+        Provider锛堥�夊~锛岄粯璁� vendor锛�
+          - <code>vendor</code> 涓婁紶鏂囦欢
+          - <code>external</code> 澶栭儴鐭ヨ瘑搴�
+      </Property>
+      <Property name='external_knowledge_api_id' type='str' key='external_knowledge_api_id'>
+        澶栭儴鐭ヨ瘑搴� API_ID锛堥�夊~锛�
+      </Property>
+      <Property name='external_knowledge_id' type='str' key='external_knowledge_id'>
+        澶栭儴鐭ヨ瘑搴� ID锛堥�夊~锛�
+      </Property>
+      <Property name='embedding_model' type='str' key='embedding_model'>
+        Embedding 妯″瀷鍚嶇О
+      </Property>
+      <Property name='embedding_model_provider' type='str' key='embedding_model_provider'>
+        Embedding 妯″瀷渚涘簲鍟�
+      </Property>
+      <Property name='retrieval_model' type='object' key='retrieval_model'>
+        妫�绱㈡ā寮�
+          - <code>search_method</code> (string) 妫�绱㈡柟娉�
+            - <code>hybrid_search</code> 娣峰悎妫�绱�
+            - <code>semantic_search</code> 璇箟妫�绱�
+            - <code>full_text_search</code> 鍏ㄦ枃妫�绱�
+          - <code>reranking_enable</code> (bool) 鏄惁寮�鍚痳erank
+          - <code>reranking_model</code> (object) Rerank 妯″瀷閰嶇疆
+            - <code>reranking_provider_name</code> (string) Rerank 妯″瀷鐨勬彁渚涘晢
+            - <code>reranking_model_name</code> (string) Rerank 妯″瀷鐨勫悕绉�
+          - <code>top_k</code> (int) 鍙洖鏉℃暟
+          - <code>score_threshold_enabled</code> (bool)鏄惁寮�鍚彫鍥炲垎鏁伴檺鍒�
+          - <code>score_threshold</code> (float) 鍙洖鍒嗘暟闄愬埗
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "name", "permission": "only_me"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+      "name": "name",
+      "permission": "only_me"
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "",
+      "name": "name",
+      "description": null,
+      "provider": "vendor",
+      "permission": "only_me",
+      "data_source_type": null,
+      "indexing_technique": null,
+      "app_count": 0,
+      "document_count": 0,
+      "word_count": 0,
+      "created_by": "",
+      "created_at": 1695636173,
+      "updated_by": "",
+      "updated_at": 1695636173,
+      "embedding_model": null,
+      "embedding_model_provider": null,
+      "embedding_available": null
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets'
+  method='GET'
+  title='鐭ヨ瘑搴撳垪琛�'
+  name='#dataset_list'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        鎼滅储鍏抽敭璇嶏紝鍙��
+      </Property>
+      <Property name='tag_ids' type='array[string]' key='tag_ids'>
+        鏍囩 ID 鍒楄〃锛屽彲閫�
+      </Property>
+      <Property name='page' type='integer' key='page'>
+        椤电爜锛屽彲閫夛紝榛樿涓� 1
+      </Property>
+      <Property name='limit' type='string' key='limit'>
+        杩斿洖鏉℃暟锛屽彲閫夛紝榛樿 20锛岃寖鍥� 1-100
+      </Property>
+      <Property name='include_all' type='boolean' key='include_all'>
+        鏄惁鍖呭惈鎵�鏈夋暟鎹泦锛堜粎瀵规墍鏈夎�呯敓鏁堬級锛屽彲閫夛紝榛樿涓� false
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets?page=1&limit=20' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [
+        {
+          "id": "",
+          "name": "鐭ヨ瘑搴撳悕绉�",
+          "description": "鎻忚堪淇℃伅",
+          "permission": "only_me",
+          "data_source_type": "upload_file",
+          "indexing_technique": "",
+          "app_count": 2,
+          "document_count": 10,
+          "word_count": 1200,
+          "created_by": "",
+          "created_at": "",
+          "updated_by": "",
+          "updated_at": ""
+        },
+        ...
+      ],
+      "has_more": true,
+      "limit": 20,
+      "total": 50,
+      "page": 1
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}'
+  method='GET'
+  title='鏌ョ湅鐭ヨ瘑搴撹鎯�'
+  name='#view_dataset'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets/{dataset_id}"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "eaedb485-95ac-4ffd-ab1e-18da6d676a2f",
+      "name": "Test Knowledge Base",
+      "description": "",
+      "provider": "vendor",
+      "permission": "only_me",
+      "data_source_type": null,
+      "indexing_technique": null,
+      "app_count": 0,
+      "document_count": 0,
+      "word_count": 0,
+      "created_by": "e99a1635-f725-4951-a99a-1daaaa76cfc6",
+      "created_at": 1735620612,
+      "updated_by": "e99a1635-f725-4951-a99a-1daaaa76cfc6",
+      "updated_at": 1735620612,
+      "embedding_model": null,
+      "embedding_model_provider": null,
+      "embedding_available": true,
+      "retrieval_model_dict": {
+        "search_method": "semantic_search",
+        "reranking_enable": false,
+        "reranking_mode": null,
+        "reranking_model": {
+          "reranking_provider_name": "",
+          "reranking_model_name": ""
+        },
+        "weights": null,
+        "top_k": 2,
+        "score_threshold_enabled": false,
+        "score_threshold": null
+      },
+      "tags": [],
+      "doc_form": null,
+      "external_knowledge_info": {
+        "external_knowledge_id": null,
+        "external_knowledge_api_id": null,
+        "external_knowledge_api_name": null,
+        "external_knowledge_api_endpoint": null
+      },
+      "external_retrieval_model": {
+        "top_k": 2,
+        "score_threshold": 0.0,
+        "score_threshold_enabled": null
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}'
+  method='PATCH'
+  title='淇敼鐭ヨ瘑搴撹鎯�'
+  name='#update_dataset'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='indexing_technique' type='string' key='indexing_technique'>
+        绱㈠紩妯″紡锛堥�夊~锛屽缓璁~鍐欙級
+          - <code>high_quality</code> 楂樿川閲�
+          - <code>economy</code> 缁忔祹
+      </Property>
+      <Property name='permission' type='string' key='permission'>
+        鏉冮檺锛堥�夊~锛岄粯璁� only_me锛�
+          - <code>only_me</code> 浠呰嚜宸�
+          - <code>all_team_members</code> 鎵�鏈夊洟闃熸垚鍛�
+          - <code>partial_members</code> 閮ㄥ垎鍥㈤槦鎴愬憳
+      </Property>
+      <Property name='embedding_model_provider' type='string' key='embedding_model_provider'>
+        宓屽叆妯″瀷鎻愪緵鍟嗭紙閫夊~锛�, 蹇呴』鍏堝湪绯荤粺鍐呰瀹氬ソ鎺ュ叆鐨勬ā鍨嬶紝瀵瑰簲鐨勬槸provider瀛楁
+      </Property>
+      <Property name='embedding_model' type='string' key='embedding_model'>
+        宓屽叆妯″瀷锛堥�夊~锛�
+      </Property>
+      <Property name='retrieval_model' type='object' key='retrieval_model'>
+        妫�绱㈠弬鏁帮紙閫夊~锛屽涓嶅~锛屾寜鐓ч粯璁ゆ柟寮忓彫鍥烇級
+        - <code>search_method</code> (text) 妫�绱㈡柟娉曪細浠ヤ笅鍥涗釜鍏抽敭瀛椾箣涓�锛屽繀濉�
+          - <code>keyword_search</code> 鍏抽敭瀛楁绱�
+          - <code>semantic_search</code> 璇箟妫�绱�
+          - <code>full_text_search</code> 鍏ㄦ枃妫�绱�
+          - <code>hybrid_search</code> 娣峰悎妫�绱�
+        - <code>reranking_enable</code> (bool) 鏄惁鍚敤 Reranking锛岄潪蹇呭~锛屽鏋滄绱㈡ā寮忎负 semantic_search 妯″紡鎴栬�� hybrid_search 鍒欎紶鍊�
+        - <code>reranking_mode</code> (object) Rerank 妯″瀷閰嶇疆锛岄潪蹇呭~锛屽鏋滃惎鐢ㄤ簡 reranking 鍒欎紶鍊�
+            - <code>reranking_provider_name</code> (string) Rerank 妯″瀷鎻愪緵鍟�
+            - <code>reranking_model_name</code> (string) Rerank 妯″瀷鍚嶇О
+        - <code>weights</code> (float) 娣峰悎妫�绱㈡ā寮忎笅璇剰妫�绱㈢殑鏉冮噸璁剧疆
+        - <code>top_k</code> (integer) 杩斿洖缁撴灉鏁伴噺锛岄潪蹇呭~
+        - <code>score_threshold_enabled</code> (bool) 鏄惁寮�鍚� score 闃堝��
+        - <code>score_threshold</code> (float) Score 闃堝��
+      </Property>
+      <Property name='partial_member_list' type='array' key='partial_member_list'>
+        閮ㄥ垎鍥㈤槦鎴愬憳 ID 鍒楄〃锛堥�夊~锛�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="PATCH"
+      label="/datasets/{dataset_id}"
+      targetCode={`curl --location --request PATCH '${props.apiBaseUrl}/datasets/{dataset_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{
+        "name": "Test Knowledge Base", 
+        "indexing_technique": "high_quality", 
+        "permission": "only_me", 
+        "embedding_model_provider": "zhipuai", 
+        "embedding_model": "embedding-3", 
+        "retrieval_model": {
+          "search_method": "keyword_search",
+          "reranking_enable": false,
+          "reranking_mode": null,
+          "reranking_model": {
+              "reranking_provider_name": "",
+              "reranking_model_name": ""
+          },
+          "weights": null,
+          "top_k": 1,
+          "score_threshold_enabled": false,
+          "score_threshold": null
+        }, 
+        "partial_member_list": []
+      }'
+    `}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request PATCH '${props.apiBaseUrl}/datasets/{dataset_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+      "name": "Test Knowledge Base", 
+      "indexing_technique": "high_quality", 
+      "permission": "only_me", 
+      "embedding_model_provider": "zhipuai", 
+      "embedding_model": "embedding-3", 
+      "retrieval_model": {
+        "search_method": "keyword_search",
+        "reranking_enable": false,
+        "reranking_mode": null,
+        "reranking_model": {
+            "reranking_provider_name": "",
+            "reranking_model_name": ""
+        },
+        "weights": null,
+        "top_k": 1,
+        "score_threshold_enabled": false,
+        "score_threshold": null
+      }, 
+      "partial_member_list": []
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "eaedb485-95ac-4ffd-ab1e-18da6d676a2f",
+      "name": "Test Knowledge Base",
+      "description": "",
+      "provider": "vendor",
+      "permission": "only_me",
+      "data_source_type": null,
+      "indexing_technique": "high_quality",
+      "app_count": 0,
+      "document_count": 0,
+      "word_count": 0,
+      "created_by": "e99a1635-f725-4951-a99a-1daaaa76cfc6",
+      "created_at": 1735620612,
+      "updated_by": "e99a1635-f725-4951-a99a-1daaaa76cfc6",
+      "updated_at": 1735622679,
+      "embedding_model": "embedding-3",
+      "embedding_model_provider": "zhipuai",
+      "embedding_available": null,
+      "retrieval_model_dict": {
+          "search_method": "semantic_search",
+          "reranking_enable": false,
+          "reranking_mode": null,
+          "reranking_model": {
+              "reranking_provider_name": "",
+              "reranking_model_name": ""
+          },
+          "weights": null,
+          "top_k": 2,
+          "score_threshold_enabled": false,
+          "score_threshold": null
+      },
+      "tags": [],
+      "doc_form": null,
+      "external_knowledge_info": {
+          "external_knowledge_id": null,
+          "external_knowledge_api_id": null,
+          "external_knowledge_api_name": null,
+          "external_knowledge_api_endpoint": null
+      },
+      "external_retrieval_model": {
+          "top_k": 2,
+          "score_threshold": 0.0,
+          "score_threshold_enabled": null
+      },
+      "partial_member_list": []
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}'
+  method='DELETE'
+  title='鍒犻櫎鐭ヨ瘑搴�'
+  name='#delete_dataset'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="DELETE"
+      label="/datasets/{dataset_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/update-by-text'
+  method='POST'
+  title='閫氳繃鏂囨湰鏇存柊鏂囨。'
+  name='#update-by-text'
+/>
+<Row>
+  <Col>
+    姝ゆ帴鍙e熀浜庡凡瀛樺湪鐭ヨ瘑搴擄紝鍦ㄦ鐭ヨ瘑搴撶殑鍩虹涓婇�氳繃鏂囨湰鏇存柊鏂囨。
+
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        鏂囨。 ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        鏂囨。鍚嶇О锛堥�夊~锛�
+      </Property>
+      <Property name='text' type='string' key='text'>
+        鏂囨。鍐呭锛堥�夊~锛�
+      </Property>
+      <Property name='process_rule' type='object' key='process_rule'>
+        澶勭悊瑙勫垯锛堥�夊~锛�
+          - <code>mode</code> (string) 娓呮礂銆佸垎娈垫ā寮� 锛宎utomatic 鑷姩 / custom 鑷畾涔�
+          - <code>rules</code> (object) 鑷畾涔夎鍒欙紙鑷姩妯″紡涓嬶紝璇ュ瓧娈典负绌猴級
+            - <code>pre_processing_rules</code> (array[object]) 棰勫鐞嗚鍒�
+              - <code>id</code> (string) 棰勫鐞嗚鍒欑殑鍞竴鏍囪瘑绗�
+                - 鏋氫妇锛�
+                  - <code>remove_extra_spaces</code> 鏇挎崲杩炵画绌烘牸銆佹崲琛岀銆佸埗琛ㄧ
+                  - <code>remove_urls_emails</code> 鍒犻櫎 URL銆佺數瀛愰偖浠跺湴鍧�
+              - <code>enabled</code> (bool) 鏄惁閫変腑璇ヨ鍒欙紝涓嶄紶鍏ユ枃妗� ID 鏃朵唬琛ㄩ粯璁ゅ��
+            - <code>segmentation</code> (object) 鍒嗘瑙勫垯
+              - <code>separator</code> 鑷畾涔夊垎娈垫爣璇嗙锛岀洰鍓嶄粎鍏佽璁剧疆涓�涓垎闅旂銆傞粯璁や负 \n
+              - <code>max_tokens</code> 鏈�澶ч暱搴︼紙token锛夐粯璁や负 1000
+            - <code>parent_mode</code> 鐖跺垎娈电殑鍙洖妯″紡 <code>full-doc</code> 鍏ㄦ枃鍙洖 / <code>paragraph</code> 娈佃惤鍙洖
+            - <code>subchunk_segmentation</code> (object) 瀛愬垎娈佃鍒�
+              - <code>separator</code> 鍒嗘鏍囪瘑绗︼紝鐩墠浠呭厑璁歌缃竴涓垎闅旂銆傞粯璁や负 <code>***</code>
+              - <code>max_tokens</code> 鏈�澶ч暱搴� (token) 闇�瑕佹牎楠屽皬浜庣埗绾х殑闀垮害
+              - <code>chunk_overlap</code> 鍒嗘閲嶅彔鎸囩殑鏄湪瀵规暟鎹繘琛屽垎娈垫椂锛屾涓庢涔嬮棿瀛樺湪涓�瀹氱殑閲嶅彔閮ㄥ垎锛堥�夊~锛�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/update-by-text"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/update-by-text' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"name": "name","text": "text"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/update-by-text' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "name": "name",
+        "text": "text"
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "document": {
+        "id": "",
+        "position": 1,
+        "data_source_type": "upload_file",
+        "data_source_info": {
+          "upload_file_id": ""
+        },
+        "dataset_process_rule_id": "",
+        "name": "name.txt",
+        "created_from": "api",
+        "created_by": "",
+        "created_at": 1695308667,
+        "tokens": 0,
+        "indexing_status": "waiting",
+        "error": null,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "archived": false,
+        "display_status": "queuing",
+        "word_count": 0,
+        "hit_count": 0,
+        "doc_form": "text_model"
+      },
+      "batch": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/update-by-file'
+  method='POST'
+  title='閫氳繃鏂囦欢鏇存柊鏂囨。'
+  name='#update-by-file'
+/>
+<Row>
+  <Col>
+    姝ゆ帴鍙e熀浜庡凡瀛樺湪鐭ヨ瘑搴擄紝鍦ㄦ鐭ヨ瘑搴撶殑鍩虹涓婇�氳繃鏂囦欢鏇存柊鏂囨。鐨勬搷浣溿��
+
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        鏂囨。 ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        鏂囨。鍚嶇О锛堥�夊~锛�
+      </Property>
+      <Property name='file' type='multipart/form-data' key='file'>
+        闇�瑕佷笂浼犵殑鏂囦欢
+      </Property>
+      <Property name='process_rule' type='object' key='process_rule'>
+        澶勭悊瑙勫垯锛堥�夊~锛�
+          - <code>mode</code> (string) 娓呮礂銆佸垎娈垫ā寮� 锛宎utomatic 鑷姩 / custom 鑷畾涔�
+          - <code>rules</code> (object) 鑷畾涔夎鍒欙紙鑷姩妯″紡涓嬶紝璇ュ瓧娈典负绌猴級
+            - <code>pre_processing_rules</code> (array[object]) 棰勫鐞嗚鍒�
+              - <code>id</code> (string) 棰勫鐞嗚鍒欑殑鍞竴鏍囪瘑绗�
+                - 鏋氫妇锛�
+                  - <code>remove_extra_spaces</code> 鏇挎崲杩炵画绌烘牸銆佹崲琛岀銆佸埗琛ㄧ
+                  - <code>remove_urls_emails</code> 鍒犻櫎 URL銆佺數瀛愰偖浠跺湴鍧�
+              - <code>enabled</code> (bool) 鏄惁閫変腑璇ヨ鍒欙紝涓嶄紶鍏ユ枃妗� ID 鏃朵唬琛ㄩ粯璁ゅ��
+            - <code>segmentation</code> (object) 鍒嗘瑙勫垯
+              - <code>separator</code> 鑷畾涔夊垎娈垫爣璇嗙锛岀洰鍓嶄粎鍏佽璁剧疆涓�涓垎闅旂銆傞粯璁や负 \n
+              - <code>max_tokens</code> 鏈�澶ч暱搴︼紙token锛夐粯璁や负 1000
+            - <code>parent_mode</code> 鐖跺垎娈电殑鍙洖妯″紡 <code>full-doc</code> 鍏ㄦ枃鍙洖 / <code>paragraph</code> 娈佃惤鍙洖
+            - <code>subchunk_segmentation</code> (object) 瀛愬垎娈佃鍒�
+              - <code>separator</code> 鍒嗘鏍囪瘑绗︼紝鐩墠浠呭厑璁歌缃竴涓垎闅旂銆傞粯璁や负 <code>***</code>
+              - <code>max_tokens</code> 鏈�澶ч暱搴� (token) 闇�瑕佹牎楠屽皬浜庣埗绾х殑闀垮害
+              - <code>chunk_overlap</code> 鍒嗘閲嶅彔鎸囩殑鏄湪瀵规暟鎹繘琛屽垎娈垫椂锛屾涓庢涔嬮棿瀛樺湪涓�瀹氱殑閲嶅彔閮ㄥ垎锛堥�夊~锛�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/update-by-file"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/update-by-file' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'data="{"name":"Dify","indexing_technique":"high_quality","process_rule":{"rules":{"pre_processing_rules":[{"id":"remove_extra_spaces","enabled":true},{"id":"remove_urls_emails","enabled":true}],"segmentation":{"separator":"###","max_tokens":500}},"mode":"custom"}}";type=text/plain' \\\n--form 'file=@"/path/to/file"'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/update-by-file' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'data="{\"name\":\"Dify\",\"indexing_technique\":\"high_quality\",\"process_rule\":{\"rules\":{\"pre_processing_rules\":[{\"id\":\"remove_extra_spaces\",\"enabled\":true},{\"id\":\"remove_urls_emails\",\"enabled\":true}],\"segmentation\":{\"separator\":\"###\",\"max_tokens\":500}},\"mode\":\"custom\"}}";type=text/plain' \
+    --form 'file=@"/path/to/file"'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "document": {
+        "id": "",
+        "position": 1,
+        "data_source_type": "upload_file",
+        "data_source_info": {
+          "upload_file_id": ""
+        },
+        "dataset_process_rule_id": "",
+        "name": "Dify.txt",
+        "created_from": "api",
+        "created_by": "",
+        "created_at": 1695308667,
+        "tokens": 0,
+        "indexing_status": "waiting",
+        "error": null,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "archived": false,
+        "display_status": "queuing",
+        "word_count": 0,
+        "hit_count": 0,
+        "doc_form": "text_model"
+      },
+      "batch": "20230921150427533684"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{batch}/indexing-status'
+  method='GET'
+  title='鑾峰彇鏂囨。宓屽叆鐘舵�侊紙杩涘害锛�'
+  name='#indexing_status'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='batch' type='string' key='batch'>
+        涓婁紶鏂囨。鐨勬壒娆″彿
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents/{batch}/indexing-status"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{batch}/indexing-status' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{batch}/indexing-status' \
+    --header 'Authorization: Bearer {api_key}' \
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data":[{
+        "id": "",
+        "indexing_status": "indexing",
+        "processing_started_at": 1681623462.0,
+        "parsing_completed_at": 1681623462.0,
+        "cleaning_completed_at": 1681623462.0,
+        "splitting_completed_at": 1681623462.0,
+        "completed_at": null,
+        "paused_at": null,
+        "error": null,
+        "stopped_at": null,
+        "completed_segments": 24,
+        "total_segments": 100
+      }]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}'
+  method='DELETE'
+  title='鍒犻櫎鏂囨。'
+  name='#delete_document'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        鏂囨。 ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="DELETE"
+      label="/datasets/{dataset_id}/documents/{document_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents'
+  method='GET'
+  title='鐭ヨ瘑搴撴枃妗e垪琛�'
+  name='#dataset_document_list'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+    </Properties>
+
+    ### Query
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        鎼滅储鍏抽敭璇嶏紝鍙�夛紝鐩墠浠呮悳绱㈡枃妗e悕绉�
+      </Property>
+      <Property name='page' type='string' key='page'>
+        椤电爜锛屽彲閫�
+      </Property>
+      <Property name='limit' type='string' key='limit'>
+        杩斿洖鏉℃暟锛屽彲閫夛紝榛樿 20锛岃寖鍥� 1-100
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents' \
+    --header 'Authorization: Bearer {api_key}' \
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [
+        {
+          "id": "",
+          "position": 1,
+          "data_source_type": "file_upload",
+          "data_source_info": null,
+          "dataset_process_rule_id": null,
+          "name": "dify",
+          "created_from": "",
+          "created_by": "",
+          "created_at": 1681623639,
+          "tokens": 0,
+          "indexing_status": "waiting",
+          "error": null,
+          "enabled": true,
+          "disabled_at": null,
+          "disabled_by": null,
+          "archived": false
+        },
+      ],
+      "has_more": false,
+      "limit": 20,
+      "total": 9,
+      "page": 1
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments'
+  method='POST'
+  title='鏂板鍒嗘'
+  name='#create_new_segment'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        鏂囨。 ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='segments' type='object list' key='segments'>
+        - <code>content</code> (text) 鏂囨湰鍐呭/闂鍐呭锛屽繀濉�
+        - <code>answer</code> (text) 绛旀鍐呭锛岄潪蹇呭~锛屽鏋滅煡璇嗗簱鐨勬ā寮忎负 Q&A 妯″紡鍒欎紶鍊�
+        - <code>keywords</code> (list) 鍏抽敭瀛楋紝闈炲繀濉�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"segments": [{"content": "1","answer": "1","keywords": ["a"]}]}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+      "segments": [
+        {
+          "content": "1",
+          "answer": "1",
+          "keywords": ["a"]
+        }
+      ]
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [{
+        "id": "",
+        "position": 1,
+        "document_id": "",
+        "content": "1",
+        "answer": "1",
+        "word_count": 25,
+        "tokens": 0,
+        "keywords": [
+            "a"
+        ],
+        "index_node_id": "",
+        "index_node_hash": "",
+        "hit_count": 0,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }],
+      "doc_form": "text_model"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments'
+  method='GET'
+  title='鏌ヨ鏂囨。鍒嗘'
+  name='#get_segment'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        鏂囨。 ID
+      </Property>
+    </Properties>
+
+     ### Query
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        鎼滅储鍏抽敭璇嶏紝鍙��
+      </Property>
+      <Property name='status' type='string' key='status'>
+        鎼滅储鐘舵�侊紝completed
+      </Property>
+      <Property name='page' type='string' key='page'>
+        椤电爜锛屽彲閫�
+      </Property>
+      <Property name='limit' type='string' key='limit'>
+        杩斿洖鏉℃暟锛屽彲閫夛紝榛樿 20锛岃寖鍥� 1-100
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [{
+        "id": "",
+        "position": 1,
+        "document_id": "",
+        "content": "1",
+        "answer": "1",
+        "word_count": 25,
+        "tokens": 0,
+        "keywords": [
+            "a"
+        ],
+        "index_node_id": "",
+        "index_node_hash": "",
+        "hit_count": 0,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }],
+      "doc_form": "text_model",
+      "has_more": false,
+      "limit": 20,
+      "total": 9,
+      "page": 1
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}'
+  method='DELETE'
+  title='鍒犻櫎鏂囨。鍒嗘'
+  name='#delete_segment'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        鏂囨。 ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        鏂囨。鍒嗘ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="DELETE"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}'
+  method='POST'
+  title='鏇存柊鏂囨。鍒嗘'
+  name='#update_segment'
+/>
+<Row>
+  <Col>
+    ### POST
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        鏂囨。 ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        鏂囨。鍒嗘ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='segment' type='object' key='segment'>
+        - <code>content</code> (text) 鏂囨湰鍐呭/闂鍐呭锛屽繀濉�
+        - <code>answer</code> (text) 绛旀鍐呭锛岄潪蹇呭~锛屽鏋滅煡璇嗗簱鐨勬ā寮忎负 Q&A 妯″紡鍒欎紶鍊�
+        - <code>keywords</code> (list) 鍏抽敭瀛楋紝闈炲繀濉�
+        - <code>enabled</code> (bool) false/true锛岄潪蹇呭~
+        - <code>regenerate_child_chunks</code> (bool) 鏄惁閲嶆柊鐢熸垚瀛愬垎娈碉紝闈炲繀濉�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'\\\n--data-raw '{\"segment\": {\"content\": \"1\",\"answer\": \"1\", \"keywords\": [\"a\"], \"enabled\": false}}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+      "segment": {
+          "content": "1",
+          "answer": "1",
+          "keywords": ["a"],
+          "enabled": false
+      }
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": {
+        "id": "",
+        "position": 1,
+        "document_id": "",
+        "content": "1",
+        "answer": "1",
+        "word_count": 25,
+        "tokens": 0,
+        "keywords": [
+            "a"
+        ],
+        "index_node_id": "",
+        "index_node_hash": "",
+        "hit_count": 0,
+        "enabled": true,
+        "disabled_at": null,
+        "disabled_by": null,
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      },
+      "doc_form": "text_model"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks'
+  method='POST'
+  title='鏂板鏂囨。瀛愬垎娈�'
+  name='#create_child_chunk'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        鏂囨。 ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        鍒嗘 ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='content' type='string' key='content'>
+        瀛愬垎娈靛唴瀹�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"content": "瀛愬垎娈靛唴瀹�"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "content": "瀛愬垎娈靛唴瀹�"
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": {
+        "id": "",
+        "segment_id": "",
+        "content": "瀛愬垎娈靛唴瀹�",
+        "word_count": 25,
+        "tokens": 0,
+        "index_node_id": "",
+        "index_node_hash": "",
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks'
+  method='GET'
+  title='鏌ヨ鏂囨。瀛愬垎娈�'
+  name='#get_child_chunks'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        鏂囨。 ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        鍒嗘 ID
+      </Property>
+    </Properties>
+
+    ### Query
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        鎼滅储鍏抽敭璇嶏紙閫夊~锛�
+      </Property>
+      <Property name='page' type='integer' key='page'>
+        椤电爜锛堥�夊~锛岄粯璁�1锛�
+      </Property>
+      <Property name='limit' type='integer' key='limit'>
+        姣忛〉鏁伴噺锛堥�夊~锛岄粯璁�20锛屾渶澶�100锛�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks?page=1&limit=20' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [{
+        "id": "",
+        "segment_id": "",
+        "content": "瀛愬垎娈靛唴瀹�",
+        "word_count": 25,
+        "tokens": 0,
+        "index_node_id": "",
+        "index_node_hash": "",
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }],
+      "total": 1,
+      "total_pages": 1,
+      "page": 1,
+      "limit": 20
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}'
+  method='DELETE'
+  title='鍒犻櫎鏂囨。瀛愬垎娈�'
+  name='#delete_child_chunk'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        鏂囨。 ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        鍒嗘 ID
+      </Property>
+      <Property name='child_chunk_id' type='string' key='child_chunk_id'>
+        瀛愬垎娈� ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="DELETE"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Row>
+  <Col>
+    ### 閿欒淇℃伅
+    <Properties>
+      <Property name='code' type='string' key='code'>
+        杩斿洖鐨勯敊璇唬鐮�
+      </Property>
+    </Properties>
+    <Properties>
+      <Property name='status' type='number' key='status'>
+        杩斿洖鐨勯敊璇姸鎬�
+      </Property>
+    </Properties>
+    <Properties>
+      <Property name='message' type='string' key='message'>
+        杩斿洖鐨勯敊璇俊鎭�
+      </Property>
+    </Properties>
+  </Col>
+  <Col>
+    <CodeGroup title="Example">
+    ```json {{ title: 'Response' }}
+      {
+        "code": "no_file_uploaded",
+        "message": "Please upload your file.",
+        "status": 400
+      }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}'
+  method='PATCH'
+  title='鏇存柊鏂囨。瀛愬垎娈�'
+  name='#update_child_chunk'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        鏂囨。 ID
+      </Property>
+      <Property name='segment_id' type='string' key='segment_id'>
+        鍒嗘 ID
+      </Property>
+      <Property name='child_chunk_id' type='string' key='child_chunk_id'>
+        瀛愬垎娈� ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='content' type='string' key='content'>
+        瀛愬垎娈靛唴瀹�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="PATCH"
+      label="/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}"
+      targetCode={`curl --location --request PATCH '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"content": "鏇存柊鐨勫瓙鍒嗘鍐呭"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request PATCH '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/segments/{segment_id}/child_chunks/{child_chunk_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "content": "鏇存柊鐨勫瓙鍒嗘鍐呭"
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": {
+        "id": "",
+        "segment_id": "",
+        "content": "鏇存柊鐨勫瓙鍒嗘鍐呭",
+        "word_count": 25,
+        "tokens": 0,
+        "index_node_id": "",
+        "index_node_hash": "",
+        "status": "completed",
+        "created_by": "",
+        "created_at": 1695312007,
+        "indexing_at": 1695312007,
+        "completed_at": 1695312007,
+        "error": null,
+        "stopped_at": null
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/{document_id}/upload-file'
+  method='GET'
+  title='鑾峰彇涓婁紶鏂囦欢'
+  name='#get_upload_file'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='document_id' type='string' key='document_id'>
+        鏂囨。 ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets/{dataset_id}/documents/{document_id}/upload-file"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/upload-file' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/documents/{document_id}/upload-file' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "file_id",
+      "name": "file_name",
+      "size": 1024,
+      "extension": "txt",
+      "url": "preview_url",
+      "download_url": "download_url",
+      "mime_type": "text/plain",
+      "created_by": "user_id",
+      "created_at": 1728734540,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/retrieve'
+  method='POST'
+  title='妫�绱㈢煡璇嗗簱'
+  name='#dataset_retrieval'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='query' type='string' key='query'>
+        妫�绱㈠叧閿瘝
+      </Property>
+      <Property name='retrieval_model' type='object' key='retrieval_model'>
+        妫�绱㈠弬鏁帮紙閫夊~锛屽涓嶅~锛屾寜鐓ч粯璁ゆ柟寮忓彫鍥烇級
+        - <code>search_method</code> (text) 妫�绱㈡柟娉曪細浠ヤ笅鍥涗釜鍏抽敭瀛椾箣涓�锛屽繀濉�
+          - <code>keyword_search</code> 鍏抽敭瀛楁绱�
+          - <code>semantic_search</code> 璇箟妫�绱�
+          - <code>full_text_search</code> 鍏ㄦ枃妫�绱�
+          - <code>hybrid_search</code> 娣峰悎妫�绱�
+        - <code>reranking_enable</code> (bool) 鏄惁鍚敤 Reranking锛岄潪蹇呭~锛屽鏋滄绱㈡ā寮忎负 semantic_search 妯″紡鎴栬�� hybrid_search 鍒欎紶鍊�
+        - <code>reranking_mode</code> (object) Rerank 妯″瀷閰嶇疆锛岄潪蹇呭~锛屽鏋滃惎鐢ㄤ簡 reranking 鍒欎紶鍊�
+            - <code>reranking_provider_name</code> (string) Rerank 妯″瀷鎻愪緵鍟�
+            - <code>reranking_model_name</code> (string) Rerank 妯″瀷鍚嶇О
+        - <code>weights</code> (float) 娣峰悎妫�绱㈡ā寮忎笅璇剰妫�绱㈢殑鏉冮噸璁剧疆
+        - <code>top_k</code> (integer) 杩斿洖缁撴灉鏁伴噺锛岄潪蹇呭~
+        - <code>score_threshold_enabled</code> (bool) 鏄惁寮�鍚� score 闃堝��
+        - <code>score_threshold</code> (float) Score 闃堝��
+      </Property>
+      <Property name='external_retrieval_model' type='object' key='external_retrieval_model'>
+          鏈惎鐢ㄥ瓧娈�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/retrieve"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/retrieve' \\\n--header 'Authorization: Bearer {api_key}'\\\n--header 'Content-Type: application/json'\\\n--data-raw '{
+    "query": "test",
+    "retrieval_model": {
+        "search_method": "keyword_search",
+        "reranking_enable": false,
+        "reranking_mode": null,
+        "reranking_model": {
+            "reranking_provider_name": "",
+            "reranking_model_name": ""
+        },
+        "weights": null,
+        "top_k": 1,
+        "score_threshold_enabled": false,
+        "score_threshold": null
+    }
+}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/retrieve' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "query": "test",
+        "retrieval_model": {
+            "search_method": "keyword_search",
+            "reranking_enable": false,
+            "reranking_mode": null,
+            "reranking_model": {
+                "reranking_provider_name": "",
+                "reranking_model_name": ""
+            },
+            "weights": null,
+            "top_k": 2,
+            "score_threshold_enabled": false,
+            "score_threshold": null
+        }
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "query": {
+        "content": "test"
+      },
+      "records": [
+        {
+          "segment": {
+            "id": "7fa6f24f-8679-48b3-bc9d-bdf28d73f218",
+            "position": 1,
+            "document_id": "a8c6c36f-9f5d-4d7a-8472-f5d7b75d71d2",
+            "content": "Operation guide",
+            "answer": null,
+            "word_count": 847,
+            "tokens": 280,
+            "keywords": [
+              "install",
+              "java",
+              "base",
+              "scripts",
+              "jdk",
+              "manual",
+              "internal",
+              "opens",
+              "add",
+              "vmoptions"
+            ],
+            "index_node_id": "39dd8443-d960-45a8-bb46-7275ad7fbc8e",
+            "index_node_hash": "0189157697b3c6a418ccf8264a09699f25858975578f3467c76d6bfc94df1d73",
+            "hit_count": 0,
+            "enabled": true,
+            "disabled_at": null,
+            "disabled_by": null,
+            "status": "completed",
+            "created_by": "dbcb1ab5-90c8-41a7-8b78-73b235eb6f6f",
+            "created_at": 1728734540,
+            "indexing_at": 1728734552,
+            "completed_at": 1728734584,
+            "error": null,
+            "stopped_at": null,
+            "document": {
+              "id": "a8c6c36f-9f5d-4d7a-8472-f5d7b75d71d2",
+              "data_source_type": "upload_file",
+              "name": "readme.txt",
+            }
+          },
+          "score": 3.730463140527718e-05,
+          "tsne_position": null
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata'
+  method='POST'
+  title='鏂板鍏冩暟鎹�'
+  name='#create_metadata'
+/>
+<Row>
+  <Col>
+    ### Params
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='segment' type='object' key='segment'>
+        - <code>type</code> (string) 鍏冩暟鎹被鍨嬶紝蹇呭~
+        - <code>name</code> (string) 鍏冩暟鎹悕绉帮紝蹇呭~
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/metadata"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/metadata' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'\\\n--data-raw '{"type": "string", "name": "test"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "abc",
+      "type": "string",
+      "name": "test",
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata/{metadata_id}'
+  method='PATCH'
+  title='鏇存柊鍏冩暟鎹�'
+  name='#update_metadata'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='metadata_id' type='string' key='metadata_id'>
+        鍏冩暟鎹� ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='segment' type='object' key='segment'>
+        - <code>name</code> (string) 鍏冩暟鎹悕绉帮紝蹇呭~
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="PATCH"
+      label="/datasets/{dataset_id}/metadata/{metadata_id}"
+      targetCode={`curl --location --request PATCH '${props.apiBaseUrl}/datasets/{dataset_id}/metadata/{metadata_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'\\\n--data-raw '{"name": "test"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "abc",
+      "type": "string",
+      "name": "test",
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata/{metadata_id}'
+  method='DELETE'
+  title='鍒犻櫎鍏冩暟鎹�'
+  name='#delete_metadata'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='metadata_id' type='string' key='metadata_id'>
+        鍏冩暟鎹� ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="DELETE"
+      label="/datasets/{dataset_id}/metadata/{metadata_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/datasets/{dataset_id}/metadata/{metadata_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata/built-in/{action}'
+  method='POST'
+  title='鍚敤/绂佺敤鍐呯疆鍏冩暟鎹�'
+  name='#toggle_metadata'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+      <Property name='action' type='string' key='action'>
+        disable/enable
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/metadata/built-in/{action}"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/metadata/built-in/{action}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/documents/metadata'
+  method='POST'
+  title='鏇存柊鏂囨。鍏冩暟鎹�'
+  name='#update_documents_metadata'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+    <Properties>
+      <Property name='operation_data' type='object list' key='segments'>
+        - <code>document_id</code> (string) 鏂囨。 ID
+        - <code>metadata_list</code> (list) 鍏冩暟鎹垪琛�
+          - <code>id</code> (string) 鍏冩暟鎹� ID
+          - <code>type</code> (string) 鍏冩暟鎹被鍨�
+          - <code>name</code> (string) 鍏冩暟鎹悕绉�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/datasets/{dataset_id}/documents/metadata"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/datasets/{dataset_id}/documents/metadata' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'\\\n--data-raw '{"operation_data": [{"document_id": "document_id", "metadata_list": [{"id": "id", "value": "value", "name": "name"}]}]}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Heading
+  url='/datasets/{dataset_id}/metadata'
+  method='GET'
+  title='鏌ヨ鐭ヨ瘑搴撳厓鏁版嵁鍒楄〃'
+  name='#dataset_metadata_list'
+/>
+<Row>
+  <Col>
+    ### Path
+    <Properties>
+      <Property name='dataset_id' type='string' key='dataset_id'>
+        鐭ヨ瘑搴� ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/datasets/{dataset_id}/metadata"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/datasets/{dataset_id}/metadata' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "doc_metadata": [
+        {
+          "id": "",
+          "name": "name",
+          "type": "string",
+          "use_count": 0,
+        },
+        ...
+      ],
+      "built_in_field_enabled": true
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+ 
+<Heading
+ url='/workspaces/current/models/model-types/text-embedding'
+ method='GET'
+ title='鑾峰彇宓屽叆妯″瀷鍒楄〃'
+ name='#model_type_list'
+/>
+<Row>
+   <Col>
+     ### Query
+     <Properties>
+     </Properties>
+   </Col>
+   <Col sticky>
+     <CodeGroup
+       title="Request"
+       tag="GET"
+       label="/datasets/{dataset_id}"
+       targetCode={`curl --location --location --request GET '${props.apiBaseUrl}/workspaces/current/models/model-types/text-embedding' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' `}
+     >
+     ```bash {{ title: 'cURL' }}
+     curl --location --request GET '${props.apiBaseUrl}/workspaces/current/models/model-types/text-embedding' \
+     --header 'Authorization: Bearer {api_key}' \
+     --header 'Content-Type: application/json' \
+     ```
+     </CodeGroup>
+     <CodeGroup title="Response">
+     ```json {{ title: 'Response' }}
+     {
+       "data": [
+           {
+               "provider": "zhipuai",
+               "label": {
+                   "zh_Hans": "鏅鸿氨 AI",
+                   "en_US": "ZHIPU AI"
+               },
+               "icon_small": {
+                   "zh_Hans": "http://127.0.0.1:5001/console/api/workspaces/current/model-providers/zhipuai/icon_small/zh_Hans",
+                   "en_US": "http://127.0.0.1:5001/console/api/workspaces/current/model-providers/zhipuai/icon_small/en_US"
+               },
+               "icon_large": {
+                   "zh_Hans": "http://127.0.0.1:5001/console/api/workspaces/current/model-providers/zhipuai/icon_large/zh_Hans",
+                   "en_US": "http://127.0.0.1:5001/console/api/workspaces/current/model-providers/zhipuai/icon_large/en_US"
+               },
+               "status": "active",
+               "models": [
+                   {
+                       "model": "embedding-3",
+                       "label": {
+                           "zh_Hans": "embedding-3",
+                           "en_US": "embedding-3"
+                       },
+                       "model_type": "text-embedding",
+                       "features": null,
+                       "fetch_from": "predefined-model",
+                       "model_properties": {
+                           "context_size": 8192
+                       },
+                       "deprecated": false,
+                       "status": "active",
+                       "load_balancing_enabled": false
+                   },
+                   {
+                       "model": "embedding-2",
+                       "label": {
+                           "zh_Hans": "embedding-2",
+                           "en_US": "embedding-2"
+                       },
+                       "model_type": "text-embedding",
+                       "features": null,
+                       "fetch_from": "predefined-model",
+                       "model_properties": {
+                           "context_size": 8192
+                       },
+                       "deprecated": false,
+                       "status": "active",
+                       "load_balancing_enabled": false
+                   },
+                   {
+                       "model": "text_embedding",
+                       "label": {
+                           "zh_Hans": "text_embedding",
+                           "en_US": "text_embedding"
+                       },
+                       "model_type": "text-embedding",
+                       "features": null,
+                       "fetch_from": "predefined-model",
+                       "model_properties": {
+                           "context_size": 512
+                       },
+                       "deprecated": false,
+                       "status": "active",
+                       "load_balancing_enabled": false
+                   }
+               ]
+           }
+       ]
+     }
+     ```
+     </CodeGroup>
+   </Col>
+</Row>
+
+<hr className='ml-0 mr-0' />
+
+<Row>
+  <Col>
+    ### 閿欒淇℃伅
+    <Properties>
+      <Property name='code' type='string' key='code'>
+        杩斿洖鐨勯敊璇唬鐮�
+      </Property>
+    </Properties>
+    <Properties>
+      <Property name='status' type='number' key='status'>
+        杩斿洖鐨勯敊璇姸鎬�
+      </Property>
+    </Properties>
+    <Properties>
+      <Property name='message' type='string' key='message'>
+        杩斿洖鐨勯敊璇俊鎭�
+      </Property>
+    </Properties>
+  </Col>
+  <Col>
+    <CodeGroup title="Example">
+    ```json {{ title: 'Response' }}
+      {
+        "code": "no_file_uploaded",
+        "message": "Please upload your file.",
+        "status": 400
+      }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+<table className="max-w-auto border-collapse border border-slate-400" style={{ maxWidth: 'none', width: 'auto' }}>
+  <thead style={{ background: '#f9fafc' }}>
+    <tr>
+      <th className="p-2 border border-slate-300">code</th>
+      <th className="p-2 border border-slate-300">status</th>
+      <th className="p-2 border border-slate-300">message</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td className="p-2 border border-slate-300">no_file_uploaded</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">Please upload your file.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">too_many_files</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">Only one file is allowed.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">file_too_large</td>
+      <td className="p-2 border border-slate-300">413</td>
+      <td className="p-2 border border-slate-300">File size exceeded.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">unsupported_file_type</td>
+      <td className="p-2 border border-slate-300">415</td>
+      <td className="p-2 border border-slate-300">File type not allowed.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">high_quality_dataset_only</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">Current operation only supports 'high-quality' datasets.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">dataset_not_initialized</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">The dataset is still being initialized or indexing. Please wait a moment.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">archived_document_immutable</td>
+      <td className="p-2 border border-slate-300">403</td>
+      <td className="p-2 border border-slate-300">The archived document is not editable.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">dataset_name_duplicate</td>
+      <td className="p-2 border border-slate-300">409</td>
+      <td className="p-2 border border-slate-300">The dataset name already exists. Please modify your dataset name.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">invalid_action</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">Invalid action.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">document_already_finished</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">The document has been processed. Please refresh the page or go to the document details.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">document_indexing</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">The document is being processed and cannot be edited.</td>
+    </tr>
+    <tr>
+      <td className="p-2 border border-slate-300">invalid_metadata</td>
+      <td className="p-2 border border-slate-300">400</td>
+      <td className="p-2 border border-slate-300">The metadata content is incorrect. Please check and verify.</td>
+    </tr>
+  </tbody>
+</table>
+<div className="pb-4" />
diff --git "a/app/\050commonLayout\051/education-apply/page.tsx" "b/app/\050commonLayout\051/education-apply/page.tsx"
new file mode 100644
index 0000000..8730344
--- /dev/null
+++ "b/app/\050commonLayout\051/education-apply/page.tsx"
@@ -0,0 +1,29 @@
+'use client'
+
+import {
+  useEffect,
+  useMemo,
+} from 'react'
+import {
+  useRouter,
+  useSearchParams,
+} from 'next/navigation'
+import EducationApplyPage from '@/app/education-apply/education-apply-page'
+import { useProviderContext } from '@/context/provider-context'
+
+export default function EducationApply() {
+  const router = useRouter()
+  const { enableEducationPlan, isEducationAccount } = useProviderContext()
+  const searchParams = useSearchParams()
+  const token = searchParams.get('token')
+  const showEducationApplyPage = useMemo(() => {
+    return enableEducationPlan && !isEducationAccount && token
+  }, [enableEducationPlan, isEducationAccount, token])
+
+  useEffect(() => {
+    if (!showEducationApplyPage)
+      router.replace('/')
+  }, [showEducationApplyPage, router])
+
+  return <EducationApplyPage />
+}
diff --git "a/app/\050commonLayout\051/explore/apps/page.tsx" "b/app/\050commonLayout\051/explore/apps/page.tsx"
new file mode 100644
index 0000000..b243060
--- /dev/null
+++ "b/app/\050commonLayout\051/explore/apps/page.tsx"
@@ -0,0 +1,8 @@
+import React from 'react'
+import AppList from '@/app/components/explore/app-list'
+
+const Apps = () => {
+  return <AppList />
+}
+
+export default React.memo(Apps)
diff --git "a/app/\050commonLayout\051/explore/installed/\133appId\135/page.tsx" "b/app/\050commonLayout\051/explore/installed/\133appId\135/page.tsx"
new file mode 100644
index 0000000..938a039
--- /dev/null
+++ "b/app/\050commonLayout\051/explore/installed/\133appId\135/page.tsx"
@@ -0,0 +1,16 @@
+import type { FC } from 'react'
+import React from 'react'
+import Main from '@/app/components/explore/installed-app'
+
+export type IInstalledAppProps = {
+  params: Promise<{
+    appId: string
+  }>
+}
+
+const InstalledApp: FC<IInstalledAppProps> = async ({ params }) => {
+  return (
+    <Main id={(await params).appId} />
+  )
+}
+export default React.memo(InstalledApp)
diff --git "a/app/\050commonLayout\051/explore/layout.tsx" "b/app/\050commonLayout\051/explore/layout.tsx"
new file mode 100644
index 0000000..3af7bb1
--- /dev/null
+++ "b/app/\050commonLayout\051/explore/layout.tsx"
@@ -0,0 +1,16 @@
+import type { FC } from 'react'
+import React from 'react'
+import ExploreClient from '@/app/components/explore'
+export type IAppDetail = {
+  children: React.ReactNode
+}
+
+const AppDetail: FC<IAppDetail> = ({ children }) => {
+  return (
+    <ExploreClient>
+      {children}
+    </ExploreClient>
+  )
+}
+
+export default React.memo(AppDetail)
diff --git "a/app/\050commonLayout\051/layout.tsx" "b/app/\050commonLayout\051/layout.tsx"
new file mode 100644
index 0000000..af36d4d
--- /dev/null
+++ "b/app/\050commonLayout\051/layout.tsx"
@@ -0,0 +1,38 @@
+import React from 'react'
+import type { ReactNode } from 'react'
+import SwrInitor from '@/app/components/swr-initor'
+import { AppContextProvider } from '@/context/app-context'
+import GA, { GaType } from '@/app/components/base/ga'
+import HeaderWrapper from '@/app/components/header/header-wrapper'
+import Header from '@/app/components/header'
+import { EventEmitterContextProvider } from '@/context/event-emitter'
+import { ProviderContextProvider } from '@/context/provider-context'
+import { ModalContextProvider } from '@/context/modal-context'
+
+const Layout = ({ children }: { children: ReactNode }) => {
+  return (
+    <>
+      <GA gaType={GaType.admin} />
+      <SwrInitor>
+        <AppContextProvider>
+          <EventEmitterContextProvider>
+            <ProviderContextProvider>
+              <ModalContextProvider>
+                <HeaderWrapper>
+                  <Header />
+                </HeaderWrapper>
+                {children}
+              </ModalContextProvider>
+            </ProviderContextProvider>
+          </EventEmitterContextProvider>
+        </AppContextProvider>
+      </SwrInitor>
+    </>
+  )
+}
+
+export const metadata = {
+  title: 'Dify',
+}
+
+export default Layout
diff --git "a/app/\050commonLayout\051/list.module.css" "b/app/\050commonLayout\051/list.module.css"
new file mode 100644
index 0000000..c4d3aec
--- /dev/null
+++ "b/app/\050commonLayout\051/list.module.css"
@@ -0,0 +1,217 @@
+.listItem {
+  @apply col-span-1 bg-white border-2 border-solid border-transparent rounded-xl shadow-xs min-h-[160px] flex flex-col transition-all duration-200 ease-in-out cursor-pointer hover:shadow-lg;
+}
+
+.listItem.newItemCard {
+  @apply outline outline-1 outline-gray-200 -outline-offset-1 hover:shadow-sm hover:bg-white;
+  background-color: rgba(229, 231, 235, 0.5);
+}
+
+.listItem.selectable {
+  @apply relative bg-gray-50 outline outline-1 outline-gray-200 -outline-offset-1 shadow-none hover:bg-none hover:shadow-none hover:outline-primary-200 transition-colors;
+}
+
+.listItem.selectable * {
+  @apply relative;
+}
+
+.listItem.selectable::before {
+  content: "";
+  @apply absolute top-0 left-0 block w-full h-full rounded-lg pointer-events-none opacity-0 transition-opacity duration-200 ease-in-out hover:opacity-100;
+  background: linear-gradient(0deg,
+      rgba(235, 245, 255, 0.5),
+      rgba(235, 245, 255, 0.5)),
+    #ffffff;
+}
+
+.listItem.selectable:hover::before {
+  @apply opacity-100;
+}
+
+.listItem.selected {
+  @apply border-primary-600 hover:border-primary-600 border-2;
+}
+
+.listItem.selected::before {
+  @apply opacity-100;
+}
+
+.appIcon {
+  @apply flex items-center justify-center w-8 h-8 bg-pink-100 rounded-lg grow-0 shrink-0;
+}
+
+.appIcon.medium {
+  @apply w-9 h-9;
+}
+
+.appIcon.large {
+  @apply w-10 h-10;
+}
+
+.newItemIcon {
+  @apply flex items-center justify-center w-8 h-8 transition-colors duration-200 ease-in-out border border-gray-200 rounded-lg hover:bg-white grow-0 shrink-0;
+}
+
+.listItem:hover .newItemIcon {
+  @apply bg-gray-50 border-primary-100;
+}
+
+.newItemCard .newItemIcon {
+  @apply bg-gray-100;
+}
+
+.newItemCard:hover .newItemIcon {
+  @apply bg-white;
+}
+
+.selectable .newItemIcon {
+  @apply bg-gray-50;
+}
+
+.selectable:hover .newItemIcon {
+  @apply bg-primary-50;
+}
+
+.newItemIconImage {
+  @apply grow-0 shrink-0 block w-4 h-4 bg-center bg-contain transition-colors duration-200 ease-in-out;
+  color: #1f2a37;
+}
+
+.listItem:hover .newIconImage {
+  @apply text-primary-600;
+}
+
+.newItemIconAdd {
+  background-image: url("./apps/assets/add.svg");
+}
+
+/* .newItemIconChat {
+  background-image: url("~@/app/components/base/icons/assets/public/header-nav/studio/Robot.svg");
+}
+
+.selected .newItemIconChat {
+  background-image: url("~@/app/components/base/icons/assets/public/header-nav/studio/Robot-Active.svg");
+} */
+
+.newItemIconComplete {
+  background-image: url("./apps/assets/completion.svg");
+}
+
+.listItemTitle {
+  @apply flex pt-[14px] px-[14px] pb-3 h-[66px] items-center gap-3 grow-0 shrink-0;
+}
+
+.listItemHeading {
+  @apply relative h-8 text-sm font-medium leading-8 grow;
+}
+
+.listItemHeadingContent {
+  @apply absolute top-0 left-0 w-full h-full overflow-hidden text-ellipsis whitespace-nowrap;
+}
+
+.actionIconWrapper {
+  @apply hidden h-8 w-8 p-2 rounded-md border-none hover:bg-gray-100 !important;
+}
+
+.listItem:hover .actionIconWrapper {
+  @apply !inline-flex;
+}
+
+.deleteDatasetIcon {
+  @apply hidden grow-0 shrink-0 basis-8 w-8 h-8 rounded-lg transition-colors duration-200 ease-in-out bg-white border border-gray-200 hover:bg-gray-100 bg-center bg-no-repeat;
+  background-size: 16px;
+  background-image: url('~@/assets/delete.svg');
+}
+
+.listItem:hover .deleteDatasetIcon {
+  @apply block;
+}
+
+.listItemDescription {
+  @apply mb-3 px-[14px] h-9 text-xs leading-normal text-gray-500 line-clamp-2;
+}
+
+.listItemDescription.noClip {
+  @apply line-clamp-none;
+}
+
+.listItemFooter {
+  @apply flex items-center flex-wrap min-h-[42px] px-[14px] pt-2 pb-[10px];
+}
+
+.listItemFooter.datasetCardFooter {
+  @apply flex items-center gap-4 text-xs text-gray-500;
+}
+
+.listItemStats {
+  @apply flex items-center gap-1;
+}
+
+.listItemFooterIcon {
+  @apply block w-3 h-3 bg-center bg-contain;
+}
+
+.solidChatIcon {
+  background-image: url("./apps/assets/chat-solid.svg");
+}
+
+.solidCompletionIcon {
+  background-image: url("./apps/assets/completion-solid.svg");
+}
+
+.newItemCardHeading {
+  @apply transition-colors duration-200 ease-in-out;
+}
+
+.listItem:hover .newItemCardHeading {
+  @apply text-primary-600;
+}
+
+.listItemLink {
+  @apply inline-flex items-center gap-1 text-xs text-gray-400 transition-colors duration-200 ease-in-out;
+}
+
+.listItem:hover .listItemLink {
+  @apply text-primary-600;
+}
+
+.linkIcon {
+  @apply block w-[13px] h-[13px] bg-center bg-contain;
+  background-image: url("./apps/assets/link.svg");
+}
+
+.linkIcon.grayLinkIcon {
+  background-image: url("./apps/assets/link-gray.svg");
+}
+
+.listItem:hover .grayLinkIcon {
+  background-image: url("./apps/assets/link.svg");
+}
+
+.rightIcon {
+  @apply block w-[13px] h-[13px] bg-center bg-contain;
+  background-image: url("./apps/assets/right-arrow.svg");
+}
+
+.socialMediaLink {
+  @apply flex items-center justify-center w-8 h-8 cursor-pointer hover:opacity-80 transition-opacity duration-200 ease-in-out;
+}
+
+.socialMediaIcon {
+  @apply block w-6 h-6 bg-center bg-contain;
+}
+
+/* #region new app dialog */
+.newItemCaption {
+  @apply inline-flex items-center mb-2 text-sm font-medium;
+}
+
+/* #endregion new app dialog */
+
+.unavailable {
+  @apply opacity-50;
+}
+
+.listItem:hover .unavailable {
+  @apply opacity-100;
+}
diff --git "a/app/\050commonLayout\051/plugins/page.tsx" "b/app/\050commonLayout\051/plugins/page.tsx"
new file mode 100644
index 0000000..47f2791
--- /dev/null
+++ "b/app/\050commonLayout\051/plugins/page.tsx"
@@ -0,0 +1,16 @@
+import PluginPage from '@/app/components/plugins/plugin-page'
+import PluginsPanel from '@/app/components/plugins/plugin-page/plugins-panel'
+import Marketplace from '@/app/components/plugins/marketplace'
+import { getLocaleOnServer } from '@/i18n/server'
+
+const PluginList = async () => {
+  const locale = await getLocaleOnServer()
+  return (
+    <PluginPage
+      plugins={<PluginsPanel />}
+      marketplace={<Marketplace locale={locale} pluginTypeSwitchClassName='top-[60px]' searchBoxAutoAnimate={false} showSearchParams={false} />}
+    />
+  )
+}
+
+export default PluginList
diff --git "a/app/\050commonLayout\051/tools/page.tsx" "b/app/\050commonLayout\051/tools/page.tsx"
new file mode 100644
index 0000000..1b08d54
--- /dev/null
+++ "b/app/\050commonLayout\051/tools/page.tsx"
@@ -0,0 +1,28 @@
+'use client'
+import type { FC } from 'react'
+import { useRouter } from 'next/navigation'
+import { useTranslation } from 'react-i18next'
+import React, { useEffect } from 'react'
+import ToolProviderList from '@/app/components/tools/provider-list'
+import { useAppContext } from '@/context/app-context'
+
+const Layout: FC = () => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const { isCurrentWorkspaceDatasetOperator } = useAppContext()
+
+  useEffect(() => {
+    if (typeof window !== 'undefined')
+      document.title = `${t('tools.title')} - Dify`
+    if (isCurrentWorkspaceDatasetOperator)
+      return router.replace('/datasets')
+  }, [isCurrentWorkspaceDatasetOperator, router, t])
+
+  useEffect(() => {
+    if (isCurrentWorkspaceDatasetOperator)
+      return router.replace('/datasets')
+  }, [isCurrentWorkspaceDatasetOperator, router])
+
+  return <ToolProviderList />
+}
+export default React.memo(Layout)
diff --git "a/app/\050shareLayout\051/chat/\133token\135/page.tsx" "b/app/\050shareLayout\051/chat/\133token\135/page.tsx"
new file mode 100644
index 0000000..640c403
--- /dev/null
+++ "b/app/\050shareLayout\051/chat/\133token\135/page.tsx"
@@ -0,0 +1,11 @@
+'use client'
+import React from 'react'
+import ChatWithHistoryWrap from '@/app/components/base/chat/chat-with-history'
+
+const Chat = () => {
+  return (
+    <ChatWithHistoryWrap />
+  )
+}
+
+export default React.memo(Chat)
diff --git "a/app/\050shareLayout\051/chatbot/\133token\135/page.tsx" "b/app/\050shareLayout\051/chatbot/\133token\135/page.tsx"
new file mode 100644
index 0000000..6196afe
--- /dev/null
+++ "b/app/\050shareLayout\051/chatbot/\133token\135/page.tsx"
@@ -0,0 +1,11 @@
+'use client'
+import React from 'react'
+import EmbeddedChatbot from '@/app/components/base/chat/embedded-chatbot'
+
+const Chatbot = () => {
+  return (
+    <EmbeddedChatbot />
+  )
+}
+
+export default React.memo(Chatbot)
diff --git "a/app/\050shareLayout\051/completion/\133token\135/page.tsx" "b/app/\050shareLayout\051/completion/\133token\135/page.tsx"
new file mode 100644
index 0000000..e8bc9d7
--- /dev/null
+++ "b/app/\050shareLayout\051/completion/\133token\135/page.tsx"
@@ -0,0 +1,10 @@
+import React from 'react'
+import Main from '@/app/components/share/text-generation'
+
+const Completion = () => {
+  return (
+    <Main />
+  )
+}
+
+export default React.memo(Completion)
diff --git "a/app/\050shareLayout\051/layout.tsx" "b/app/\050shareLayout\051/layout.tsx"
new file mode 100644
index 0000000..83adbd3
--- /dev/null
+++ "b/app/\050shareLayout\051/layout.tsx"
@@ -0,0 +1,19 @@
+import React from 'react'
+import type { FC } from 'react'
+import type { Metadata } from 'next'
+
+export const metadata: Metadata = {
+  icons: 'data:,', // prevent browser from using default favicon
+}
+
+const Layout: FC<{
+  children: React.ReactNode
+}> = ({ children }) => {
+  return (
+    <div className="h-full min-w-[300px] pb-[env(safe-area-inset-bottom)]">
+      {children}
+    </div>
+  )
+}
+
+export default Layout
diff --git "a/app/\050shareLayout\051/webapp-signin/page.tsx" "b/app/\050shareLayout\051/webapp-signin/page.tsx"
new file mode 100644
index 0000000..d58fafa
--- /dev/null
+++ "b/app/\050shareLayout\051/webapp-signin/page.tsx"
@@ -0,0 +1,103 @@
+'use client'
+import { useRouter, useSearchParams } from 'next/navigation'
+import type { FC } from 'react'
+import React, { useEffect } from 'react'
+import cn from '@/utils/classnames'
+import Toast from '@/app/components/base/toast'
+import { fetchSystemFeatures, fetchWebOAuth2SSOUrl, fetchWebOIDCSSOUrl, fetchWebSAMLSSOUrl } from '@/service/share'
+import { setAccessToken } from '@/app/components/share/utils'
+import Loading from '@/app/components/base/loading'
+
+const WebSSOForm: FC = () => {
+  const searchParams = useSearchParams()
+  const router = useRouter()
+
+  const redirectUrl = searchParams.get('redirect_url')
+  const tokenFromUrl = searchParams.get('web_sso_token')
+  const message = searchParams.get('message')
+
+  const showErrorToast = (message: string) => {
+    Toast.notify({
+      type: 'error',
+      message,
+    })
+  }
+
+  const getAppCodeFromRedirectUrl = () => {
+    const appCode = redirectUrl?.split('/').pop()
+    if (!appCode)
+      return null
+
+    return appCode
+  }
+
+  const processTokenAndRedirect = async () => {
+    const appCode = getAppCodeFromRedirectUrl()
+    if (!appCode || !tokenFromUrl || !redirectUrl) {
+      showErrorToast('redirect url or app code or token is invalid.')
+      return
+    }
+
+    await setAccessToken(appCode, tokenFromUrl)
+    router.push(redirectUrl)
+  }
+
+  const handleSSOLogin = async (protocol: string) => {
+    const appCode = getAppCodeFromRedirectUrl()
+    if (!appCode || !redirectUrl) {
+      showErrorToast('redirect url or app code is invalid.')
+      return
+    }
+
+    switch (protocol) {
+      case 'saml': {
+        const samlRes = await fetchWebSAMLSSOUrl(appCode, redirectUrl)
+        router.push(samlRes.url)
+        break
+      }
+      case 'oidc': {
+        const oidcRes = await fetchWebOIDCSSOUrl(appCode, redirectUrl)
+        router.push(oidcRes.url)
+        break
+      }
+      case 'oauth2': {
+        const oauth2Res = await fetchWebOAuth2SSOUrl(appCode, redirectUrl)
+        router.push(oauth2Res.url)
+        break
+      }
+      default:
+        showErrorToast('SSO protocol is not supported.')
+    }
+  }
+
+  useEffect(() => {
+    const init = async () => {
+      const res = await fetchSystemFeatures()
+      const protocol = res.sso_enforced_for_web_protocol
+
+      if (message) {
+        showErrorToast(message)
+        return
+      }
+
+      if (!tokenFromUrl) {
+        await handleSSOLogin(protocol)
+        return
+      }
+
+      await processTokenAndRedirect()
+    }
+
+    init()
+  }, [message, tokenFromUrl]) // Added dependencies to useEffect
+
+  return (
+    <div className="flex h-full items-center justify-center">
+      <div className={cn('flex w-full grow flex-col items-center justify-center', 'px-6', 'md:px-[108px]')}>
+        <Loading type='area' />
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(WebSSOForm)
diff --git "a/app/\050shareLayout\051/workflow/\133token\135/page.tsx" "b/app/\050shareLayout\051/workflow/\133token\135/page.tsx"
new file mode 100644
index 0000000..e93bc8c
--- /dev/null
+++ "b/app/\050shareLayout\051/workflow/\133token\135/page.tsx"
@@ -0,0 +1,11 @@
+import React from 'react'
+
+import Main from '@/app/components/share/text-generation'
+
+const Workflow = () => {
+  return (
+    <Main isWorkflow />
+  )
+}
+
+export default React.memo(Workflow)
diff --git a/app/account/account-page/AvatarWithEdit.tsx b/app/account/account-page/AvatarWithEdit.tsx
new file mode 100644
index 0000000..8250789
--- /dev/null
+++ b/app/account/account-page/AvatarWithEdit.tsx
@@ -0,0 +1,122 @@
+'use client'
+
+import type { Area } from 'react-easy-crop'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { RiPencilLine } from '@remixicon/react'
+import { updateUserProfile } from '@/service/common'
+import { ToastContext } from '@/app/components/base/toast'
+import ImageInput, { type OnImageInput } from '@/app/components/base/app-icon-picker/ImageInput'
+import Modal from '@/app/components/base/modal'
+import Divider from '@/app/components/base/divider'
+import Button from '@/app/components/base/button'
+import Avatar, { type AvatarProps } from '@/app/components/base/avatar'
+import { useLocalFileUploader } from '@/app/components/base/image-uploader/hooks'
+import type { ImageFile } from '@/types/app'
+import getCroppedImg from '@/app/components/base/app-icon-picker/utils'
+import { DISABLE_UPLOAD_IMAGE_AS_ICON } from '@/config'
+
+type InputImageInfo = { file: File } | { tempUrl: string; croppedAreaPixels: Area; fileName: string }
+type AvatarWithEditProps = AvatarProps & { onSave?: () => void }
+
+const AvatarWithEdit = ({ onSave, ...props }: AvatarWithEditProps) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+
+  const [inputImageInfo, setInputImageInfo] = useState<InputImageInfo>()
+  const [isShowAvatarPicker, setIsShowAvatarPicker] = useState(false)
+  const [uploading, setUploading] = useState(false)
+
+  const handleImageInput: OnImageInput = useCallback(async (isCropped: boolean, fileOrTempUrl: string | File, croppedAreaPixels?: Area, fileName?: string) => {
+    setInputImageInfo(
+      isCropped
+        ? { tempUrl: fileOrTempUrl as string, croppedAreaPixels: croppedAreaPixels!, fileName: fileName! }
+        : { file: fileOrTempUrl as File },
+    )
+  }, [setInputImageInfo])
+
+  const handleSaveAvatar = useCallback(async (uploadedFileId: string) => {
+    try {
+      await updateUserProfile({ url: 'account/avatar', body: { avatar: uploadedFileId } })
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      setIsShowAvatarPicker(false)
+      onSave?.()
+    }
+    catch (e) {
+      notify({ type: 'error', message: (e as Error).message })
+    }
+  }, [notify, onSave, t])
+
+  const { handleLocalFileUpload } = useLocalFileUploader({
+    limit: 3,
+    disabled: false,
+    onUpload: (imageFile: ImageFile) => {
+      if (imageFile.progress === 100) {
+        setUploading(false)
+        setInputImageInfo(undefined)
+        handleSaveAvatar(imageFile.fileId)
+      }
+
+      // Error
+      if (imageFile.progress === -1)
+        setUploading(false)
+    },
+  })
+
+  const handleSelect = useCallback(async () => {
+    if (!inputImageInfo)
+      return
+    setUploading(true)
+    if ('file' in inputImageInfo) {
+      handleLocalFileUpload(inputImageInfo.file)
+      return
+    }
+    const blob = await getCroppedImg(inputImageInfo.tempUrl, inputImageInfo.croppedAreaPixels, inputImageInfo.fileName)
+    const file = new File([blob], inputImageInfo.fileName, { type: blob.type })
+    handleLocalFileUpload(file)
+  }, [handleLocalFileUpload, inputImageInfo])
+
+  if (DISABLE_UPLOAD_IMAGE_AS_ICON)
+    return <Avatar {...props} />
+
+  return (
+    <>
+      <div>
+        <div className="group relative">
+          <Avatar {...props} />
+          <div
+            onClick={() => { setIsShowAvatarPicker(true) }}
+            className="absolute inset-0 flex cursor-pointer items-center justify-center rounded-full bg-black bg-opacity-50 opacity-0 transition-opacity group-hover:opacity-100"
+          >
+            <span className="text-xs text-white">
+              <RiPencilLine />
+            </span>
+          </div>
+        </div>
+      </div>
+
+      <Modal
+        closable
+        className="!w-[362px] !p-0"
+        isShow={isShowAvatarPicker}
+        onClose={() => setIsShowAvatarPicker(false)}
+      >
+        <ImageInput onImageInput={handleImageInput} cropShape='round' />
+        <Divider className='m-0' />
+
+        <div className='flex w-full items-center justify-center gap-2 p-3'>
+          <Button className='w-full' onClick={() => setIsShowAvatarPicker(false)}>
+            {t('app.iconPicker.cancel')}
+          </Button>
+
+          <Button variant="primary" className='w-full' disabled={uploading || !inputImageInfo} loading={uploading} onClick={handleSelect}>
+            {t('app.iconPicker.ok')}
+          </Button>
+        </div>
+      </Modal>
+    </>
+  )
+}
+
+export default AvatarWithEdit
diff --git a/app/account/account-page/index.module.css b/app/account/account-page/index.module.css
new file mode 100644
index 0000000..949d125
--- /dev/null
+++ b/app/account/account-page/index.module.css
@@ -0,0 +1,9 @@
+.modal {
+  padding: 24px 32px !important;
+  width: 400px !important;
+}
+
+.bg {
+  background: linear-gradient(180deg, rgba(217, 45, 32, 0.05) 0%, rgba(217, 45, 32, 0.00) 24.02%), #F9FAFB;
+}
+
diff --git a/app/account/account-page/index.tsx b/app/account/account-page/index.tsx
new file mode 100644
index 0000000..72d2648
--- /dev/null
+++ b/app/account/account-page/index.tsx
@@ -0,0 +1,320 @@
+'use client'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiGraduationCapFill,
+} from '@remixicon/react'
+import { useContext } from 'use-context-selector'
+import DeleteAccount from '../delete-account'
+import s from './index.module.css'
+import AvatarWithEdit from './AvatarWithEdit'
+import Collapse from '@/app/components/header/account-setting/collapse'
+import type { IItem } from '@/app/components/header/account-setting/collapse'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import { updateUserProfile } from '@/service/common'
+import { useAppContext } from '@/context/app-context'
+import { useProviderContext } from '@/context/provider-context'
+import { ToastContext } from '@/app/components/base/toast'
+import AppIcon from '@/app/components/base/app-icon'
+import { IS_CE_EDITION } from '@/config'
+import Input from '@/app/components/base/input'
+import PremiumBadge from '@/app/components/base/premium-badge'
+
+const titleClassName = `
+  system-sm-semibold text-text-secondary
+`
+const descriptionClassName = `
+  mt-1 body-xs-regular text-text-tertiary
+`
+
+const validPassword = /^(?=.*[a-zA-Z])(?=.*\d).{8,}$/
+
+export default function AccountPage() {
+  const { t } = useTranslation()
+  const { systemFeatures } = useAppContext()
+  const { mutateUserProfile, userProfile, apps } = useAppContext()
+  const { isEducationAccount } = useProviderContext()
+  const { notify } = useContext(ToastContext)
+  const [editNameModalVisible, setEditNameModalVisible] = useState(false)
+  const [editName, setEditName] = useState('')
+  const [editing, setEditing] = useState(false)
+  const [editPasswordModalVisible, setEditPasswordModalVisible] = useState(false)
+  const [currentPassword, setCurrentPassword] = useState('')
+  const [password, setPassword] = useState('')
+  const [confirmPassword, setConfirmPassword] = useState('')
+  const [showDeleteAccountModal, setShowDeleteAccountModal] = useState(false)
+  const [showCurrentPassword, setShowCurrentPassword] = useState(false)
+  const [showPassword, setShowPassword] = useState(false)
+  const [showConfirmPassword, setShowConfirmPassword] = useState(false)
+
+  const handleEditName = () => {
+    setEditNameModalVisible(true)
+    setEditName(userProfile.name)
+  }
+  const handleSaveName = async () => {
+    try {
+      setEditing(true)
+      await updateUserProfile({ url: 'account/name', body: { name: editName } })
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      mutateUserProfile()
+      setEditNameModalVisible(false)
+      setEditing(false)
+    }
+    catch (e) {
+      notify({ type: 'error', message: (e as Error).message })
+      setEditNameModalVisible(false)
+      setEditing(false)
+    }
+  }
+
+  const showErrorMessage = (message: string) => {
+    notify({
+      type: 'error',
+      message,
+    })
+  }
+  const valid = () => {
+    if (!password.trim()) {
+      showErrorMessage(t('login.error.passwordEmpty'))
+      return false
+    }
+    if (!validPassword.test(password)) {
+      showErrorMessage(t('login.error.passwordInvalid'))
+      return false
+    }
+    if (password !== confirmPassword) {
+      showErrorMessage(t('common.account.notEqual'))
+      return false
+    }
+
+    return true
+  }
+  const resetPasswordForm = () => {
+    setCurrentPassword('')
+    setPassword('')
+    setConfirmPassword('')
+  }
+  const handleSavePassword = async () => {
+    if (!valid())
+      return
+    try {
+      setEditing(true)
+      await updateUserProfile({
+        url: 'account/password',
+        body: {
+          password: currentPassword,
+          new_password: password,
+          repeat_new_password: confirmPassword,
+        },
+      })
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      mutateUserProfile()
+      setEditPasswordModalVisible(false)
+      resetPasswordForm()
+      setEditing(false)
+    }
+    catch (e) {
+      notify({ type: 'error', message: (e as Error).message })
+      setEditPasswordModalVisible(false)
+      setEditing(false)
+    }
+  }
+
+  const renderAppItem = (item: IItem) => {
+    return (
+      <div className='flex px-3 py-1'>
+        <div className='mr-3'>
+          <AppIcon size='tiny' />
+        </div>
+        <div className='system-sm-medium mt-[3px] text-text-secondary'>{item.name}</div>
+      </div>
+    )
+  }
+
+  return (
+    <>
+      <div className='pb-3 pt-2'>
+        <h4 className='title-2xl-semi-bold text-text-primary'>{t('common.account.myAccount')}</h4>
+      </div>
+      <div className='mb-8 flex items-center rounded-xl bg-gradient-to-r from-background-gradient-bg-fill-chat-bg-2 to-background-gradient-bg-fill-chat-bg-1 p-6'>
+        <AvatarWithEdit avatar={userProfile.avatar_url} name={userProfile.name} onSave={ mutateUserProfile } size={64} />
+        <div className='ml-4'>
+          <p className='system-xl-semibold text-text-primary'>
+            {userProfile.name}
+            {isEducationAccount && (
+              <PremiumBadge size='s' color='blue' className='ml-1 !px-2'>
+                <RiGraduationCapFill className='mr-1 h-3 w-3' />
+                <span className='system-2xs-medium'>EDU</span>
+              </PremiumBadge>
+            )}
+          </p>
+          <p className='system-xs-regular text-text-tertiary'>{userProfile.email}</p>
+        </div>
+      </div>
+      <div className='mb-8'>
+        <div className={titleClassName}>{t('common.account.name')}</div>
+        <div className='mt-2 flex w-full items-center justify-between gap-2'>
+          <div className='system-sm-regular flex-1 rounded-lg bg-components-input-bg-normal p-2 text-components-input-text-filled '>
+            <span className='pl-1'>{userProfile.name}</span>
+          </div>
+          <div className='system-sm-medium cursor-pointer rounded-lg bg-components-button-tertiary-bg px-3 py-2 text-components-button-tertiary-text' onClick={handleEditName}>
+            {t('common.operation.edit')}
+          </div>
+        </div>
+      </div>
+      <div className='mb-8'>
+        <div className={titleClassName}>{t('common.account.email')}</div>
+        <div className='mt-2 flex w-full items-center justify-between gap-2'>
+          <div className='system-sm-regular flex-1 rounded-lg bg-components-input-bg-normal p-2 text-components-input-text-filled '>
+            <span className='pl-1'>{userProfile.email}</span>
+          </div>
+        </div>
+      </div>
+      {
+        systemFeatures.enable_email_password_login && (
+          <div className='mb-8 flex justify-between gap-2'>
+            <div>
+              <div className='system-sm-semibold mb-1 text-text-secondary'>{t('common.account.password')}</div>
+              <div className='body-xs-regular mb-2 text-text-tertiary'>{t('common.account.passwordTip')}</div>
+            </div>
+            <Button onClick={() => setEditPasswordModalVisible(true)}>{userProfile.is_password_set ? t('common.account.resetPassword') : t('common.account.setPassword')}</Button>
+          </div>
+        )
+      }
+      <div className='mb-6 border-[1px] border-divider-subtle' />
+      <div className='mb-8'>
+        <div className={titleClassName}>{t('common.account.langGeniusAccount')}</div>
+        <div className={descriptionClassName}>{t('common.account.langGeniusAccountTip')}</div>
+        {!!apps.length && (
+          <Collapse
+            title={`${t('common.account.showAppLength', { length: apps.length })}`}
+            items={apps.map(app => ({ key: app.id, name: app.name }))}
+            renderItem={renderAppItem}
+            wrapperClassName='mt-2'
+          />
+        )}
+        {!IS_CE_EDITION && <Button className='mt-2 text-components-button-destructive-secondary-text' onClick={() => setShowDeleteAccountModal(true)}>{t('common.account.delete')}</Button>}
+      </div>
+      {
+        editNameModalVisible && (
+          <Modal
+            isShow
+            onClose={() => setEditNameModalVisible(false)}
+            className={s.modal}
+          >
+            <div className='title-2xl-semi-bold mb-6 text-text-primary'>{t('common.account.editName')}</div>
+            <div className={titleClassName}>{t('common.account.name')}</div>
+            <Input className='mt-2'
+              value={editName}
+              onChange={e => setEditName(e.target.value)}
+            />
+            <div className='mt-10 flex justify-end'>
+              <Button className='mr-2' onClick={() => setEditNameModalVisible(false)}>{t('common.operation.cancel')}</Button>
+              <Button
+                disabled={editing || !editName}
+                variant='primary'
+                onClick={handleSaveName}
+              >
+                {t('common.operation.save')}
+              </Button>
+            </div>
+          </Modal>
+        )
+      }
+      {
+        editPasswordModalVisible && (
+          <Modal
+            isShow
+            onClose={() => {
+              setEditPasswordModalVisible(false)
+              resetPasswordForm()
+            }}
+            className={s.modal}
+          >
+            <div className='title-2xl-semi-bold mb-6 text-text-primary'>{userProfile.is_password_set ? t('common.account.resetPassword') : t('common.account.setPassword')}</div>
+            {userProfile.is_password_set && (
+              <>
+                <div className={titleClassName}>{t('common.account.currentPassword')}</div>
+                <div className='relative mt-2'>
+                  <Input
+                    type={showCurrentPassword ? 'text' : 'password'}
+                    value={currentPassword}
+                    onChange={e => setCurrentPassword(e.target.value)}
+                  />
+
+                  <div className="absolute inset-y-0 right-0 flex items-center">
+                    <Button
+                      type="button"
+                      variant='ghost'
+                      onClick={() => setShowCurrentPassword(!showCurrentPassword)}
+                    >
+                      {showCurrentPassword ? '馃憖' : '馃槤'}
+                    </Button>
+                  </div>
+                </div>
+              </>
+            )}
+            <div className='system-sm-semibold mt-8 text-text-secondary'>
+              {userProfile.is_password_set ? t('common.account.newPassword') : t('common.account.password')}
+            </div>
+            <div className='relative mt-2'>
+              <Input
+                type={showPassword ? 'text' : 'password'}
+                value={password}
+                onChange={e => setPassword(e.target.value)}
+              />
+              <div className="absolute inset-y-0 right-0 flex items-center">
+                <Button
+                  type="button"
+                  variant='ghost'
+                  onClick={() => setShowPassword(!showPassword)}
+                >
+                  {showPassword ? '馃憖' : '馃槤'}
+                </Button>
+              </div>
+            </div>
+            <div className='system-sm-semibold mt-8 text-text-secondary'>{t('common.account.confirmPassword')}</div>
+            <div className='relative mt-2'>
+              <Input
+                type={showConfirmPassword ? 'text' : 'password'}
+                value={confirmPassword}
+                onChange={e => setConfirmPassword(e.target.value)}
+              />
+              <div className="absolute inset-y-0 right-0 flex items-center">
+                <Button
+                  type="button"
+                  variant='ghost'
+                  onClick={() => setShowConfirmPassword(!showConfirmPassword)}
+                >
+                  {showConfirmPassword ? '馃憖' : '馃槤'}
+                </Button>
+              </div>
+            </div>
+            <div className='mt-10 flex justify-end'>
+              <Button className='mr-2' onClick={() => {
+                setEditPasswordModalVisible(false)
+                resetPasswordForm()
+              }}>{t('common.operation.cancel')}</Button>
+              <Button
+                disabled={editing}
+                variant='primary'
+                onClick={handleSavePassword}
+              >
+                {userProfile.is_password_set ? t('common.operation.reset') : t('common.operation.save')}
+              </Button>
+            </div>
+          </Modal>
+        )
+      }
+      {
+        showDeleteAccountModal && (
+          <DeleteAccount
+            onCancel={() => setShowDeleteAccountModal(false)}
+            onConfirm={() => setShowDeleteAccountModal(false)}
+          />
+        )
+      }
+    </>
+  )
+}
diff --git a/app/account/avatar.tsx b/app/account/avatar.tsx
new file mode 100644
index 0000000..ea897e6
--- /dev/null
+++ b/app/account/avatar.tsx
@@ -0,0 +1,109 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { Fragment } from 'react'
+import { useRouter } from 'next/navigation'
+import {
+  RiGraduationCapFill,
+} from '@remixicon/react'
+import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react'
+import Avatar from '@/app/components/base/avatar'
+import { logout } from '@/service/common'
+import { useAppContext } from '@/context/app-context'
+import { useProviderContext } from '@/context/provider-context'
+import { LogOut01 } from '@/app/components/base/icons/src/vender/line/general'
+import PremiumBadge from '@/app/components/base/premium-badge'
+
+export type IAppSelector = {
+  isMobile: boolean
+}
+
+export default function AppSelector() {
+  const router = useRouter()
+  const { t } = useTranslation()
+  const { userProfile } = useAppContext()
+  const { isEducationAccount } = useProviderContext()
+
+  const handleLogout = async () => {
+    await logout({
+      url: '/logout',
+      params: {},
+    })
+
+    localStorage.removeItem('setup_status')
+    localStorage.removeItem('console_token')
+    localStorage.removeItem('refresh_token')
+
+    router.push('/signin')
+  }
+
+  return (
+    <Menu as="div" className="relative inline-block text-left">
+      {
+        ({ open }) => (
+          <>
+            <div>
+              <MenuButton
+                className={`
+                    p-1x inline-flex
+                    items-center rounded-[20px] text-sm
+                    text-text-primary
+                    mobile:px-1
+                    ${open && 'bg-components-panel-bg-blur'}
+                  `}
+              >
+                <Avatar avatar={userProfile.avatar_url} name={userProfile.name} size={32} />
+              </MenuButton>
+            </div>
+            <Transition
+              as={Fragment}
+              enter="transition ease-out duration-100"
+              enterFrom="transform opacity-0 scale-95"
+              enterTo="transform opacity-100 scale-100"
+              leave="transition ease-in duration-75"
+              leaveFrom="transform opacity-100 scale-100"
+              leaveTo="transform opacity-0 scale-95"
+            >
+              <MenuItems
+                className="
+                    absolute -right-2 -top-1 w-60 max-w-80
+                    origin-top-right divide-y divide-divider-subtle rounded-lg bg-components-panel-bg-blur
+                    shadow-lg
+                  "
+              >
+                <MenuItem>
+                  <div className='p-1'>
+                    <div className='flex flex-nowrap items-center px-3 py-2'>
+                      <div className='grow'>
+                        <div className='system-md-medium break-all text-text-primary'>
+                          {userProfile.name}
+                          {isEducationAccount && (
+                            <PremiumBadge size='s' color='blue' className='ml-1 !px-2'>
+                              <RiGraduationCapFill className='mr-1 h-3 w-3' />
+                              <span className='system-2xs-medium'>EDU</span>
+                            </PremiumBadge>
+                          )}
+                        </div>
+                        <div className='system-xs-regular break-all text-text-tertiary'>{userProfile.email}</div>
+                      </div>
+                      <Avatar avatar={userProfile.avatar_url} name={userProfile.name} size={32} />
+                    </div>
+                  </div>
+                </MenuItem>
+                <MenuItem>
+                  <div className='p-1' onClick={() => handleLogout()}>
+                    <div
+                      className='group flex h-9 cursor-pointer items-center justify-start rounded-lg px-3 hover:bg-state-base-hover'
+                    >
+                      <LogOut01 className='mr-1 flex h-4 w-4 text-text-tertiary' />
+                      <div className='text-[14px] font-normal text-text-secondary'>{t('common.userProfile.logout')}</div>
+                    </div>
+                  </div>
+                </MenuItem>
+              </MenuItems>
+            </Transition>
+          </>
+        )
+      }
+    </Menu>
+  )
+}
diff --git a/app/account/delete-account/components/check-email.tsx b/app/account/delete-account/components/check-email.tsx
new file mode 100644
index 0000000..6359340
--- /dev/null
+++ b/app/account/delete-account/components/check-email.tsx
@@ -0,0 +1,48 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { useCallback, useState } from 'react'
+import Link from 'next/link'
+import { useSendDeleteAccountEmail } from '../state'
+import { useAppContext } from '@/context/app-context'
+import Input from '@/app/components/base/input'
+import Button from '@/app/components/base/button'
+
+type DeleteAccountProps = {
+  onCancel: () => void
+  onConfirm: () => void
+}
+
+export default function CheckEmail(props: DeleteAccountProps) {
+  const { t } = useTranslation()
+  const { userProfile } = useAppContext()
+  const [userInputEmail, setUserInputEmail] = useState('')
+
+  const { isPending: isSendingEmail, mutateAsync: getDeleteEmailVerifyCode } = useSendDeleteAccountEmail()
+
+  const handleConfirm = useCallback(async () => {
+    try {
+      const ret = await getDeleteEmailVerifyCode()
+      if (ret.result === 'success')
+        props.onConfirm()
+    }
+    catch (error) { console.error(error) }
+  }, [getDeleteEmailVerifyCode, props])
+
+  return <>
+    <div className='body-md-medium py-1 text-text-destructive'>
+      {t('common.account.deleteTip')}
+    </div>
+    <div className='body-md-regular pb-2 pt-1 text-text-secondary'>
+      {t('common.account.deletePrivacyLinkTip')}
+      <Link href='https://dify.ai/privacy' className='text-text-accent'>{t('common.account.deletePrivacyLink')}</Link>
+    </div>
+    <label className='system-sm-semibold mb-1 mt-3 flex h-6 items-center text-text-secondary'>{t('common.account.deleteLabel')}</label>
+    <Input placeholder={t('common.account.deletePlaceholder') as string} onChange={(e) => {
+      setUserInputEmail(e.target.value)
+    }} />
+    <div className='mt-3 flex w-full flex-col gap-2'>
+      <Button className='w-full' disabled={userInputEmail !== userProfile.email || isSendingEmail} loading={isSendingEmail} variant='primary' onClick={handleConfirm}>{t('common.account.sendVerificationButton')}</Button>
+      <Button className='w-full' onClick={props.onCancel}>{t('common.operation.cancel')}</Button>
+    </div>
+  </>
+}
diff --git a/app/account/delete-account/components/feed-back.tsx b/app/account/delete-account/components/feed-back.tsx
new file mode 100644
index 0000000..2cd30bc
--- /dev/null
+++ b/app/account/delete-account/components/feed-back.tsx
@@ -0,0 +1,68 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { useCallback, useState } from 'react'
+import { useRouter } from 'next/navigation'
+import { useDeleteAccountFeedback } from '../state'
+import { useAppContext } from '@/context/app-context'
+import Button from '@/app/components/base/button'
+import CustomDialog from '@/app/components/base/dialog'
+import Textarea from '@/app/components/base/textarea'
+import Toast from '@/app/components/base/toast'
+import { logout } from '@/service/common'
+
+type DeleteAccountProps = {
+  onCancel: () => void
+  onConfirm: () => void
+}
+
+export default function FeedBack(props: DeleteAccountProps) {
+  const { t } = useTranslation()
+  const { userProfile } = useAppContext()
+  const router = useRouter()
+  const [userFeedback, setUserFeedback] = useState('')
+  const { isPending, mutateAsync: sendFeedback } = useDeleteAccountFeedback()
+
+  const handleSuccess = useCallback(async () => {
+    try {
+      await logout({
+        url: '/logout',
+        params: {},
+      })
+      localStorage.removeItem('refresh_token')
+      localStorage.removeItem('console_token')
+      router.push('/signin')
+      Toast.notify({ type: 'info', message: t('common.account.deleteSuccessTip') })
+    }
+    catch (error) { console.error(error) }
+  }, [router, t])
+
+  const handleSubmit = useCallback(async () => {
+    try {
+      await sendFeedback({ feedback: userFeedback, email: userProfile.email })
+      props.onConfirm()
+      await handleSuccess()
+    }
+    catch (error) { console.error(error) }
+  }, [handleSuccess, userFeedback, sendFeedback, userProfile, props])
+
+  const handleSkip = useCallback(() => {
+    props.onCancel()
+    handleSuccess()
+  }, [handleSuccess, props])
+  return <CustomDialog
+    show={true}
+    onClose={props.onCancel}
+    title={t('common.account.feedbackTitle')}
+    className="max-w-[480px]"
+    footer={false}
+  >
+    <label className='system-sm-semibold mb-1 mt-3 flex items-center text-text-secondary'>{t('common.account.feedbackLabel')}</label>
+    <Textarea rows={6} value={userFeedback} placeholder={t('common.account.feedbackPlaceholder') as string} onChange={(e) => {
+      setUserFeedback(e.target.value)
+    }} />
+    <div className='mt-3 flex w-full flex-col gap-2'>
+      <Button className='w-full' loading={isPending} variant='primary' onClick={handleSubmit}>{t('common.operation.submit')}</Button>
+      <Button className='w-full' onClick={handleSkip}>{t('common.operation.skip')}</Button>
+    </div>
+  </CustomDialog>
+}
diff --git a/app/account/delete-account/components/verify-email.tsx b/app/account/delete-account/components/verify-email.tsx
new file mode 100644
index 0000000..7c9d097
--- /dev/null
+++ b/app/account/delete-account/components/verify-email.tsx
@@ -0,0 +1,55 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { useCallback, useEffect, useState } from 'react'
+import Link from 'next/link'
+import { useAccountDeleteStore, useConfirmDeleteAccount, useSendDeleteAccountEmail } from '../state'
+import Input from '@/app/components/base/input'
+import Button from '@/app/components/base/button'
+import Countdown from '@/app/components/signin/countdown'
+
+const CODE_EXP = /[A-Za-z\d]{6}/gi
+
+type DeleteAccountProps = {
+  onCancel: () => void
+  onConfirm: () => void
+}
+
+export default function VerifyEmail(props: DeleteAccountProps) {
+  const { t } = useTranslation()
+  const emailToken = useAccountDeleteStore(state => state.sendEmailToken)
+  const [verificationCode, setVerificationCode] = useState<string>()
+  const [shouldButtonDisabled, setShouldButtonDisabled] = useState(true)
+  const { mutate: sendEmail } = useSendDeleteAccountEmail()
+  const { isPending: isDeleting, mutateAsync: confirmDeleteAccount } = useConfirmDeleteAccount()
+
+  useEffect(() => {
+    setShouldButtonDisabled(!(verificationCode && CODE_EXP.test(verificationCode)) || isDeleting)
+  }, [verificationCode, isDeleting])
+
+  const handleConfirm = useCallback(async () => {
+    try {
+      const ret = await confirmDeleteAccount({ code: verificationCode!, token: emailToken })
+      if (ret.result === 'success')
+        props.onConfirm()
+    }
+    catch (error) { console.error(error) }
+  }, [emailToken, verificationCode, confirmDeleteAccount, props])
+  return <>
+    <div className='body-md-medium pt-1 text-text-destructive'>
+      {t('common.account.deleteTip')}
+    </div>
+    <div className='body-md-regular pb-2 pt-1 text-text-secondary'>
+      {t('common.account.deletePrivacyLinkTip')}
+      <Link href='https://dify.ai/privacy' className='text-text-accent'>{t('common.account.deletePrivacyLink')}</Link>
+    </div>
+    <label className='system-sm-semibold mb-1 mt-3 flex h-6 items-center text-text-secondary'>{t('common.account.verificationLabel')}</label>
+    <Input minLength={6} maxLength={6} placeholder={t('common.account.verificationPlaceholder') as string} onChange={(e) => {
+      setVerificationCode(e.target.value)
+    }} />
+    <div className='mt-3 flex w-full flex-col gap-2'>
+      <Button className='w-full' disabled={shouldButtonDisabled} loading={isDeleting} variant='warning' onClick={handleConfirm}>{t('common.account.permanentlyDeleteButton')}</Button>
+      <Button className='w-full' onClick={props.onCancel}>{t('common.operation.cancel')}</Button>
+      <Countdown onResend={sendEmail} />
+    </div>
+  </>
+}
diff --git a/app/account/delete-account/index.tsx b/app/account/delete-account/index.tsx
new file mode 100644
index 0000000..5458890
--- /dev/null
+++ b/app/account/delete-account/index.tsx
@@ -0,0 +1,44 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { useCallback, useState } from 'react'
+import CheckEmail from './components/check-email'
+import VerifyEmail from './components/verify-email'
+import FeedBack from './components/feed-back'
+import CustomDialog from '@/app/components/base/dialog'
+import { COUNT_DOWN_KEY, COUNT_DOWN_TIME_MS } from '@/app/components/signin/countdown'
+
+type DeleteAccountProps = {
+  onCancel: () => void
+  onConfirm: () => void
+}
+
+export default function DeleteAccount(props: DeleteAccountProps) {
+  const { t } = useTranslation()
+
+  const [showVerifyEmail, setShowVerifyEmail] = useState(false)
+  const [showFeedbackDialog, setShowFeedbackDialog] = useState(false)
+
+  const handleEmailCheckSuccess = useCallback(async () => {
+    try {
+      setShowVerifyEmail(true)
+      localStorage.setItem(COUNT_DOWN_KEY, `${COUNT_DOWN_TIME_MS}`)
+    }
+    catch (error) { console.error(error) }
+  }, [])
+
+  if (showFeedbackDialog)
+    return <FeedBack onCancel={props.onCancel} onConfirm={props.onConfirm} />
+
+  return <CustomDialog
+    show={true}
+    onClose={props.onCancel}
+    title={t('common.account.delete')}
+    className="max-w-[480px]"
+    footer={false}
+  >
+    {!showVerifyEmail && <CheckEmail onCancel={props.onCancel} onConfirm={handleEmailCheckSuccess} />}
+    {showVerifyEmail && <VerifyEmail onCancel={props.onCancel} onConfirm={() => {
+      setShowFeedbackDialog(true)
+    }} />}
+  </CustomDialog>
+}
diff --git a/app/account/delete-account/state.tsx b/app/account/delete-account/state.tsx
new file mode 100644
index 0000000..4c43fba
--- /dev/null
+++ b/app/account/delete-account/state.tsx
@@ -0,0 +1,39 @@
+import { useMutation } from '@tanstack/react-query'
+import { create } from 'zustand'
+import { sendDeleteAccountCode, submitDeleteAccountFeedback, verifyDeleteAccountCode } from '@/service/common'
+
+type State = {
+  sendEmailToken: string
+  setSendEmailToken: (token: string) => void
+}
+
+export const useAccountDeleteStore = create<State>(set => ({
+  sendEmailToken: '',
+  setSendEmailToken: (token: string) => set({ sendEmailToken: token }),
+}))
+
+export function useSendDeleteAccountEmail() {
+  const updateEmailToken = useAccountDeleteStore(state => state.setSendEmailToken)
+  return useMutation({
+    mutationKey: ['delete-account'],
+    mutationFn: sendDeleteAccountCode,
+    onSuccess: (ret) => {
+      if (ret.result === 'success')
+        updateEmailToken(ret.data)
+    },
+  })
+}
+
+export function useConfirmDeleteAccount() {
+  return useMutation({
+    mutationKey: ['confirm-delete-account'],
+    mutationFn: verifyDeleteAccountCode,
+  })
+}
+
+export function useDeleteAccountFeedback() {
+  return useMutation({
+    mutationKey: ['delete-account-feedback'],
+    mutationFn: submitDeleteAccountFeedback,
+  })
+}
diff --git a/app/account/header.tsx b/app/account/header.tsx
new file mode 100644
index 0000000..11b6bee
--- /dev/null
+++ b/app/account/header.tsx
@@ -0,0 +1,39 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { RiArrowRightUpLine, RiRobot2Line } from '@remixicon/react'
+import { useRouter } from 'next/navigation'
+import Button from '../components/base/button'
+import Avatar from './avatar'
+import DifyLogo from '@/app/components/base/logo/dify-logo'
+import { useCallback } from 'react'
+
+const Header = () => {
+  const { t } = useTranslation()
+  const router = useRouter()
+
+  const back = useCallback(() => {
+    router.back()
+  }, [router])
+
+  return (
+    <div className='flex flex-1 items-center justify-between px-4'>
+      <div className='flex items-center gap-3'>
+        <div className='flex cursor-pointer items-center' onClick={back}>
+          <DifyLogo />
+        </div>
+        <div className='h-4 w-[1px] origin-center rotate-[11.31deg] bg-divider-regular' />
+        <p className='title-3xl-semi-bold relative mt-[-2px] text-text-primary'>{t('common.account.account')}</p>
+      </div>
+      <div className='flex shrink-0 items-center gap-3'>
+        <Button className='system-sm-medium gap-2 px-3 py-2' onClick={back}>
+          <RiRobot2Line className='h-4 w-4' />
+          <p>{t('common.account.studio')}</p>
+          <RiArrowRightUpLine className='h-4 w-4' />
+        </Button>
+        <div className='h-4 w-[1px] bg-divider-regular' />
+        <Avatar />
+      </div>
+    </div>
+  )
+}
+export default Header
diff --git a/app/account/layout.tsx b/app/account/layout.tsx
new file mode 100644
index 0000000..9ee7435
--- /dev/null
+++ b/app/account/layout.tsx
@@ -0,0 +1,40 @@
+import React from 'react'
+import type { ReactNode } from 'react'
+import Header from './header'
+import SwrInitor from '@/app/components/swr-initor'
+import { AppContextProvider } from '@/context/app-context'
+import GA, { GaType } from '@/app/components/base/ga'
+import HeaderWrapper from '@/app/components/header/header-wrapper'
+import { EventEmitterContextProvider } from '@/context/event-emitter'
+import { ProviderContextProvider } from '@/context/provider-context'
+import { ModalContextProvider } from '@/context/modal-context'
+
+const Layout = ({ children }: { children: ReactNode }) => {
+  return (
+    <>
+      <GA gaType={GaType.admin} />
+      <SwrInitor>
+        <AppContextProvider>
+          <EventEmitterContextProvider>
+            <ProviderContextProvider>
+              <ModalContextProvider>
+                <HeaderWrapper>
+                  <Header />
+                </HeaderWrapper>
+                <div className='relative flex h-0 shrink-0 grow flex-col overflow-y-auto bg-components-panel-bg'>
+                  {children}
+                </div>
+              </ModalContextProvider>
+            </ProviderContextProvider>
+          </EventEmitterContextProvider>
+        </AppContextProvider>
+      </SwrInitor>
+    </>
+  )
+}
+
+export const metadata = {
+  title: 'Dify',
+}
+
+export default Layout
diff --git a/app/account/page.tsx b/app/account/page.tsx
new file mode 100644
index 0000000..baf386e
--- /dev/null
+++ b/app/account/page.tsx
@@ -0,0 +1,7 @@
+import AccountPage from './account-page'
+
+export default function Account() {
+  return <div className='mx-auto w-full max-w-[640px] px-6 pt-12'>
+    <AccountPage />
+  </div>
+}
diff --git a/app/activate/activateForm.tsx b/app/activate/activateForm.tsx
new file mode 100644
index 0000000..782b24b
--- /dev/null
+++ b/app/activate/activateForm.tsx
@@ -0,0 +1,67 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import useSWR from 'swr'
+import { useRouter, useSearchParams } from 'next/navigation'
+import cn from '@/utils/classnames'
+import Button from '@/app/components/base/button'
+
+import { invitationCheck } from '@/service/common'
+import Loading from '@/app/components/base/loading'
+
+const ActivateForm = () => {
+  const router = useRouter()
+  const { t } = useTranslation()
+  const searchParams = useSearchParams()
+  const workspaceID = searchParams.get('workspace_id')
+  const email = searchParams.get('email')
+  const token = searchParams.get('token')
+
+  const checkParams = {
+    url: '/activate/check',
+    params: {
+      ...workspaceID && { workspace_id: workspaceID },
+      ...email && { email },
+      token,
+    },
+  }
+  const { data: checkRes } = useSWR(checkParams, invitationCheck, {
+    revalidateOnFocus: false,
+    onSuccess(data) {
+      if (data.is_valid) {
+        const params = new URLSearchParams(searchParams)
+        const { email, workspace_id } = data.data
+        params.set('email', encodeURIComponent(email))
+        params.set('workspace_id', encodeURIComponent(workspace_id))
+        params.set('invite_token', encodeURIComponent(token as string))
+        router.replace(`/signin?${params.toString()}`)
+      }
+    },
+  })
+
+  return (
+    <div className={
+      cn(
+        'flex w-full grow flex-col items-center justify-center',
+        'px-6',
+        'md:px-[108px]',
+      )
+    }>
+      {!checkRes && <Loading />}
+      {checkRes && !checkRes.is_valid && (
+        <div className="flex flex-col md:w-[400px]">
+          <div className="mx-auto w-full">
+            <div className="mb-3 flex h-20 w-20 items-center justify-center rounded-[20px] border border-divider-regular bg-components-option-card-option-bg p-5 text-[40px] font-bold shadow-lg">馃し鈥嶁檪锔�</div>
+            <h2 className="text-[32px] font-bold text-text-primary">{t('login.invalid')}</h2>
+          </div>
+          <div className="mx-auto mt-6 w-full">
+            <Button variant='primary' className='w-full !text-sm'>
+              <a href="https://dify.ai">{t('login.explore')}</a>
+            </Button>
+          </div>
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default ActivateForm
diff --git a/app/activate/page.tsx b/app/activate/page.tsx
new file mode 100644
index 0000000..221559f
--- /dev/null
+++ b/app/activate/page.tsx
@@ -0,0 +1,20 @@
+import React from 'react'
+import Header from '../signin/_header'
+import ActivateForm from './activateForm'
+import cn from '@/utils/classnames'
+
+const Activate = () => {
+  return (
+    <div className={cn('flex min-h-screen w-full justify-center bg-background-default-burn p-6')}>
+      <div className={cn('flex w-full shrink-0 flex-col rounded-2xl border border-effects-highlight bg-background-default-subtle')}>
+        <Header />
+        <ActivateForm />
+        <div className='px-8 py-6 text-sm font-normal text-text-tertiary'>
+          漏 {new Date().getFullYear()} LangGenius, Inc. All rights reserved.
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default Activate
diff --git a/app/components/app-sidebar/app-info.tsx b/app/components/app-sidebar/app-info.tsx
new file mode 100644
index 0000000..5ec0e31
--- /dev/null
+++ b/app/components/app-sidebar/app-info.tsx
@@ -0,0 +1,418 @@
+import { useTranslation } from 'react-i18next'
+import { useRouter } from 'next/navigation'
+import { useContext, useContextSelector } from 'use-context-selector'
+import React, { useCallback, useState } from 'react'
+import {
+  RiDeleteBinLine,
+  RiEditLine,
+  RiEqualizer2Line,
+  RiExchange2Line,
+  RiFileCopy2Line,
+  RiFileDownloadLine,
+  RiFileUploadLine,
+  RiMoreLine,
+} from '@remixicon/react'
+import AppIcon from '../base/app-icon'
+import SwitchAppModal from '../app/switch-app-modal'
+import cn from '@/utils/classnames'
+import Confirm from '@/app/components/base/confirm'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { ToastContext } from '@/app/components/base/toast'
+import AppsContext, { useAppContext } from '@/context/app-context'
+import { useProviderContext } from '@/context/provider-context'
+import { copyApp, deleteApp, exportAppConfig, updateAppInfo } from '@/service/apps'
+import DuplicateAppModal from '@/app/components/app/duplicate-modal'
+import type { DuplicateAppModalProps } from '@/app/components/app/duplicate-modal'
+import CreateAppModal from '@/app/components/explore/create-app-modal'
+import type { CreateAppModalProps } from '@/app/components/explore/create-app-modal'
+import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
+import { getRedirection } from '@/utils/app-redirection'
+import UpdateDSLModal from '@/app/components/workflow/update-dsl-modal'
+import type { EnvironmentVariable } from '@/app/components/workflow/types'
+import DSLExportConfirmModal from '@/app/components/workflow/dsl-export-confirm-modal'
+import { fetchWorkflowDraft } from '@/service/workflow'
+import ContentDialog from '@/app/components/base/content-dialog'
+import Button from '@/app/components/base/button'
+import CardView from '@/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/cardView'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '../base/portal-to-follow-elem'
+
+export type IAppInfoProps = {
+  expand: boolean
+}
+
+const AppInfo = ({ expand }: IAppInfoProps) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const { replace } = useRouter()
+  const { onPlanInfoChanged } = useProviderContext()
+  const appDetail = useAppStore(state => state.appDetail)
+  const setAppDetail = useAppStore(state => state.setAppDetail)
+  const [open, setOpen] = useState(false)
+  const [showEditModal, setShowEditModal] = useState(false)
+  const [showDuplicateModal, setShowDuplicateModal] = useState(false)
+  const [showConfirmDelete, setShowConfirmDelete] = useState(false)
+  const [showSwitchModal, setShowSwitchModal] = useState<boolean>(false)
+  const [showImportDSLModal, setShowImportDSLModal] = useState<boolean>(false)
+  const [secretEnvList, setSecretEnvList] = useState<EnvironmentVariable[]>([])
+
+  const mutateApps = useContextSelector(
+    AppsContext,
+    state => state.mutateApps,
+  )
+
+  const onEdit: CreateAppModalProps['onConfirm'] = useCallback(async ({
+    name,
+    icon_type,
+    icon,
+    icon_background,
+    description,
+    use_icon_as_answer_icon,
+  }) => {
+    if (!appDetail)
+      return
+    try {
+      const app = await updateAppInfo({
+        appID: appDetail.id,
+        name,
+        icon_type,
+        icon,
+        icon_background,
+        description,
+        use_icon_as_answer_icon,
+      })
+      setShowEditModal(false)
+      notify({
+        type: 'success',
+        message: t('app.editDone'),
+      })
+      setAppDetail(app)
+      mutateApps()
+    }
+    catch {
+      notify({ type: 'error', message: t('app.editFailed') })
+    }
+  }, [appDetail, mutateApps, notify, setAppDetail, t])
+
+  const onCopy: DuplicateAppModalProps['onConfirm'] = async ({ name, icon_type, icon, icon_background }) => {
+    if (!appDetail)
+      return
+    try {
+      const newApp = await copyApp({
+        appID: appDetail.id,
+        name,
+        icon_type,
+        icon,
+        icon_background,
+        mode: appDetail.mode,
+      })
+      setShowDuplicateModal(false)
+      notify({
+        type: 'success',
+        message: t('app.newApp.appCreated'),
+      })
+      localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
+      mutateApps()
+      onPlanInfoChanged()
+      getRedirection(true, newApp, replace)
+    }
+    catch {
+      notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
+    }
+  }
+
+  const onExport = async (include = false) => {
+    if (!appDetail)
+      return
+    try {
+      const { data } = await exportAppConfig({
+        appID: appDetail.id,
+        include,
+      })
+      const a = document.createElement('a')
+      const file = new Blob([data], { type: 'application/yaml' })
+      a.href = URL.createObjectURL(file)
+      a.download = `${appDetail.name}.yml`
+      a.click()
+    }
+    catch {
+      notify({ type: 'error', message: t('app.exportFailed') })
+    }
+  }
+
+  const exportCheck = async () => {
+    if (!appDetail)
+      return
+    if (appDetail.mode !== 'workflow' && appDetail.mode !== 'advanced-chat') {
+      onExport()
+      return
+    }
+    try {
+      const workflowDraft = await fetchWorkflowDraft(`/apps/${appDetail.id}/workflows/draft`)
+      const list = (workflowDraft.environment_variables || []).filter(env => env.value_type === 'secret')
+      if (list.length === 0) {
+        onExport()
+        return
+      }
+      setSecretEnvList(list)
+    }
+    catch {
+      notify({ type: 'error', message: t('app.exportFailed') })
+    }
+  }
+
+  const onConfirmDelete = useCallback(async () => {
+    if (!appDetail)
+      return
+    try {
+      await deleteApp(appDetail.id)
+      notify({ type: 'success', message: t('app.appDeleted') })
+      mutateApps()
+      onPlanInfoChanged()
+      setAppDetail()
+      replace('/apps')
+    }
+    catch (e: any) {
+      notify({
+        type: 'error',
+        message: `${t('app.appDeleteFailed')}${'message' in e ? `: ${e.message}` : ''}`,
+      })
+    }
+    setShowConfirmDelete(false)
+  }, [appDetail, mutateApps, notify, onPlanInfoChanged, replace, setAppDetail, t])
+
+  const { isCurrentWorkspaceEditor } = useAppContext()
+
+  const [showMore, setShowMore] = useState(false)
+  const handleTriggerMore = useCallback(() => {
+    setShowMore(true)
+  }, [setShowMore])
+
+  if (!appDetail)
+    return null
+
+  return (
+    <div>
+      <button
+        onClick={() => {
+          if (isCurrentWorkspaceEditor)
+            setOpen(v => !v)
+        }}
+        className='block w-full'
+      >
+        <div className={cn('flex rounded-lg', expand ? 'flex-col gap-2 p-2 pb-2.5' : 'items-start justify-center gap-1 p-1', open && 'bg-state-base-hover', isCurrentWorkspaceEditor && 'cursor-pointer hover:bg-state-base-hover')}>
+          <div className={`flex items-center self-stretch ${expand ? 'justify-between' : 'flex-col gap-1'}`}>
+            <AppIcon
+              size={expand ? 'large' : 'small'}
+              iconType={appDetail.icon_type}
+              icon={appDetail.icon}
+              background={appDetail.icon_background}
+              imageUrl={appDetail.icon_url}
+            />
+            <div className='flex items-center justify-center rounded-md p-0.5'>
+              <div className='flex h-5 w-5 items-center justify-center'>
+                <RiEqualizer2Line className='h-4 w-4 text-text-tertiary' />
+              </div>
+            </div>
+          </div>
+          {
+            expand && (
+              <div className='flex flex-col items-start gap-1'>
+                <div className='flex w-full'>
+                  <div className='system-md-semibold truncate text-text-secondary'>{appDetail.name}</div>
+                </div>
+                <div className='system-2xs-medium-uppercase text-text-tertiary'>{appDetail.mode === 'advanced-chat' ? t('app.types.advanced') : appDetail.mode === 'agent-chat' ? t('app.types.agent') : appDetail.mode === 'chat' ? t('app.types.chatbot') : appDetail.mode === 'completion' ? t('app.types.completion') : t('app.types.workflow')}</div>
+              </div>
+            )
+          }
+        </div>
+      </button>
+      <ContentDialog
+        show={open}
+        onClose={() => setOpen(false)}
+        className='absolute bottom-2 left-2 top-2 flex w-[420px] flex-col rounded-2xl !p-0'
+      >
+        <div className='flex shrink-0 flex-col items-start justify-center gap-3 self-stretch p-4'>
+          <div className='flex items-center gap-3 self-stretch'>
+            <AppIcon
+              size="large"
+              iconType={appDetail.icon_type}
+              icon={appDetail.icon}
+              background={appDetail.icon_background}
+              imageUrl={appDetail.icon_url}
+            />
+            <div className='flex w-full grow flex-col items-start justify-center'>
+              <div className='system-md-semibold w-full truncate text-text-secondary'>{appDetail.name}</div>
+              <div className='system-2xs-medium-uppercase text-text-tertiary'>{appDetail.mode === 'advanced-chat' ? t('app.types.advanced') : appDetail.mode === 'agent-chat' ? t('app.types.agent') : appDetail.mode === 'chat' ? t('app.types.chatbot') : appDetail.mode === 'completion' ? t('app.types.completion') : t('app.types.workflow')}</div>
+            </div>
+          </div>
+          {/* description */}
+          {appDetail.description && (
+            <div className='system-xs-regular text-text-tertiary'>{appDetail.description}</div>
+          )}
+          {/* operations */}
+          <div className='flex flex-wrap items-center gap-1 self-stretch'>
+            <Button
+              size={'small'}
+              variant={'secondary'}
+              className='gap-[1px]'
+              onClick={() => {
+                setOpen(false)
+                setShowEditModal(true)
+              }}
+            >
+              <RiEditLine className='h-3.5 w-3.5 text-components-button-secondary-text' />
+              <span className='system-xs-medium text-components-button-secondary-text'>{t('app.editApp')}</span>
+            </Button>
+            <Button
+              size={'small'}
+              variant={'secondary'}
+              className='gap-[1px]'
+              onClick={() => {
+                setOpen(false)
+                setShowDuplicateModal(true)
+              }}
+            >
+              <RiFileCopy2Line className='h-3.5 w-3.5 text-components-button-secondary-text' />
+              <span className='system-xs-medium text-components-button-secondary-text'>{t('app.duplicate')}</span>
+            </Button>
+            <Button
+              size={'small'}
+              variant={'secondary'}
+              className='gap-[1px]'
+              onClick={exportCheck}
+            >
+              <RiFileDownloadLine className='h-3.5 w-3.5 text-components-button-secondary-text' />
+              <span className='system-xs-medium text-components-button-secondary-text'>{t('app.export')}</span>
+            </Button>
+            {appDetail.mode !== 'agent-chat' && <PortalToFollowElem
+              open={showMore}
+              onOpenChange={setShowMore}
+              placement='bottom-end'
+              offset={{
+                mainAxis: 4,
+              }}>
+              <PortalToFollowElemTrigger onClick={handleTriggerMore}>
+                <Button
+                  size={'small'}
+                  variant={'secondary'}
+                  className='gap-[1px]'
+                >
+                  <RiMoreLine className='h-3.5 w-3.5 text-components-button-secondary-text' />
+                  <span className='system-xs-medium text-components-button-secondary-text'>{t('common.operation.more')}</span>
+                </Button>
+              </PortalToFollowElemTrigger>
+              <PortalToFollowElemContent className='z-[21]'>
+                <div className='flex w-[264px] flex-col rounded-[12px] border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg backdrop-blur-[5px]'>
+                  {
+                    (appDetail.mode === 'advanced-chat' || appDetail.mode === 'workflow')
+                    && <div className='flex h-8 cursor-pointer items-center gap-x-1 rounded-lg p-1.5 hover:bg-state-base-hover'
+                      onClick={() => {
+                        setOpen(false)
+                        setShowImportDSLModal(true)
+                      }}>
+                      <RiFileUploadLine className='h-4 w-4 text-text-tertiary' />
+                      <span className='system-md-regular text-text-secondary'>{t('workflow.common.importDSL')}</span>
+                    </div>
+                  }
+                  {
+                    (appDetail.mode === 'completion' || appDetail.mode === 'chat')
+                    && <div className='flex h-8 cursor-pointer items-center gap-x-1 rounded-lg p-1.5 hover:bg-state-base-hover'
+                      onClick={() => {
+                        setOpen(false)
+                        setShowSwitchModal(true)
+                      }}>
+                      <RiExchange2Line className='h-4 w-4 text-text-tertiary' />
+                      <span className='system-md-regular text-text-secondary'>{t('app.switch')}</span>
+                    </div>
+                  }
+                </div>
+              </PortalToFollowElemContent>
+            </PortalToFollowElem>}
+          </div>
+        </div>
+        <div className='flex flex-1'>
+          <CardView
+            appId={appDetail.id}
+            isInPanel={true}
+            className='flex grow flex-col gap-2 overflow-auto px-2 py-1'
+          />
+        </div>
+        <div className='flex min-h-fit shrink-0 flex-col items-start justify-center gap-3 self-stretch border-t-[0.5px] border-divider-subtle p-2'>
+          <Button
+            size={'medium'}
+            variant={'ghost'}
+            className='gap-0.5'
+            onClick={() => {
+              setOpen(false)
+              setShowConfirmDelete(true)
+            }}
+          >
+            <RiDeleteBinLine className='h-4 w-4 text-text-tertiary' />
+            <span className='system-sm-medium text-text-tertiary'>{t('common.operation.deleteApp')}</span>
+          </Button>
+        </div>
+      </ContentDialog>
+      {showSwitchModal && (
+        <SwitchAppModal
+          inAppDetail
+          show={showSwitchModal}
+          appDetail={appDetail}
+          onClose={() => setShowSwitchModal(false)}
+          onSuccess={() => setShowSwitchModal(false)}
+        />
+      )}
+      {showEditModal && (
+        <CreateAppModal
+          isEditModal
+          appName={appDetail.name}
+          appIconType={appDetail.icon_type}
+          appIcon={appDetail.icon}
+          appIconBackground={appDetail.icon_background}
+          appIconUrl={appDetail.icon_url}
+          appDescription={appDetail.description}
+          appMode={appDetail.mode}
+          appUseIconAsAnswerIcon={appDetail.use_icon_as_answer_icon}
+          show={showEditModal}
+          onConfirm={onEdit}
+          onHide={() => setShowEditModal(false)}
+        />
+      )}
+      {showDuplicateModal && (
+        <DuplicateAppModal
+          appName={appDetail.name}
+          icon_type={appDetail.icon_type}
+          icon={appDetail.icon}
+          icon_background={appDetail.icon_background}
+          icon_url={appDetail.icon_url}
+          show={showDuplicateModal}
+          onConfirm={onCopy}
+          onHide={() => setShowDuplicateModal(false)}
+        />
+      )}
+      {showConfirmDelete && (
+        <Confirm
+          title={t('app.deleteAppConfirmTitle')}
+          content={t('app.deleteAppConfirmContent')}
+          isShow={showConfirmDelete}
+          onConfirm={onConfirmDelete}
+          onCancel={() => setShowConfirmDelete(false)}
+        />
+      )}
+      {showImportDSLModal && (
+        <UpdateDSLModal
+          onCancel={() => setShowImportDSLModal(false)}
+          onBackup={exportCheck}
+        />
+      )}
+      {secretEnvList.length > 0 && (
+        <DSLExportConfirmModal
+          envList={secretEnvList}
+          onConfirm={onExport}
+          onClose={() => setSecretEnvList([])}
+        />
+      )}
+    </div>
+  )
+}
+
+export default React.memo(AppInfo)
diff --git a/app/components/app-sidebar/basic.tsx b/app/components/app-sidebar/basic.tsx
new file mode 100644
index 0000000..6a7d5a1
--- /dev/null
+++ b/app/components/app-sidebar/basic.tsx
@@ -0,0 +1,99 @@
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import AppIcon from '../base/app-icon'
+import Tooltip from '@/app/components/base/tooltip'
+
+export type IAppBasicProps = {
+  iconType?: 'app' | 'api' | 'dataset' | 'webapp' | 'notion'
+  icon?: string
+  icon_background?: string | null
+  isExternal?: boolean
+  name: string
+  type: string | React.ReactNode
+  hoverTip?: string
+  textStyle?: { main?: string; extra?: string }
+  isExtraInLine?: boolean
+  mode?: string
+}
+
+const ApiSvg = <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path d="M8.5 3.5C8.5 4.60457 9.39543 5.5 10.5 5.5C11.6046 5.5 12.5 4.60457 12.5 3.5C12.5 2.39543 11.6046 1.5 10.5 1.5C9.39543 1.5 8.5 2.39543 8.5 3.5Z" stroke="#5850EC" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
+  <path d="M12.5 9C12.5 10.1046 13.3954 11 14.5 11C15.6046 11 16.5 10.1046 16.5 9C16.5 7.89543 15.6046 7 14.5 7C13.3954 7 12.5 7.89543 12.5 9Z" stroke="#5850EC" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
+  <path d="M8.5 3.5H5.5L3.5 6.5" stroke="#5850EC" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
+  <path d="M8.5 14.5C8.5 15.6046 9.39543 16.5 10.5 16.5C11.6046 16.5 12.5 15.6046 12.5 14.5C12.5 13.3954 11.6046 12.5 10.5 12.5C9.39543 12.5 8.5 13.3954 8.5 14.5Z" stroke="#5850EC" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
+  <path d="M8.5 14.5H5.5L3.5 11.5" stroke="#5850EC" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
+  <path d="M12.5 9H1.5" stroke="#5850EC" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
+</svg>
+
+const DatasetSvg = <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path fillRule="evenodd" clipRule="evenodd" d="M0.833497 5.13481C0.833483 4.69553 0.83347 4.31654 0.858973 4.0044C0.88589 3.67495 0.94532 3.34727 1.10598 3.03195C1.34567 2.56155 1.72812 2.17909 2.19852 1.93941C2.51384 1.77875 2.84152 1.71932 3.17097 1.6924C3.48312 1.6669 3.86209 1.66691 4.30137 1.66693L7.62238 1.66684C8.11701 1.66618 8.55199 1.66561 8.95195 1.80356C9.30227 1.92439 9.62134 2.12159 9.88607 2.38088C10.1883 2.67692 10.3823 3.06624 10.603 3.50894L11.3484 5.00008H14.3679C15.0387 5.00007 15.5924 5.00006 16.0434 5.03691C16.5118 5.07518 16.9424 5.15732 17.3468 5.36339C17.974 5.68297 18.4839 6.19291 18.8035 6.82011C19.0096 7.22456 19.0917 7.65515 19.13 8.12356C19.1668 8.57455 19.1668 9.12818 19.1668 9.79898V13.5345C19.1668 14.2053 19.1668 14.7589 19.13 15.2099C19.0917 15.6784 19.0096 16.1089 18.8035 16.5134C18.4839 17.1406 17.974 17.6505 17.3468 17.9701C16.9424 18.1762 16.5118 18.2583 16.0434 18.2966C15.5924 18.3334 15.0387 18.3334 14.3679 18.3334H5.63243C4.96163 18.3334 4.40797 18.3334 3.95698 18.2966C3.48856 18.2583 3.05798 18.1762 2.65353 17.9701C2.02632 17.6505 1.51639 17.1406 1.19681 16.5134C0.990734 16.1089 0.908597 15.6784 0.870326 15.2099C0.833478 14.7589 0.833487 14.2053 0.833497 13.5345V5.13481ZM7.51874 3.33359C8.17742 3.33359 8.30798 3.34447 8.4085 3.37914C8.52527 3.41942 8.63163 3.48515 8.71987 3.57158C8.79584 3.64598 8.86396 3.7579 9.15852 4.34704L9.48505 5.00008L2.50023 5.00008C2.50059 4.61259 2.50314 4.34771 2.5201 4.14012C2.5386 3.91374 2.57 3.82981 2.59099 3.7886C2.67089 3.6318 2.79837 3.50432 2.95517 3.42442C2.99638 3.40343 3.08031 3.37203 3.30669 3.35353C3.54281 3.33424 3.85304 3.33359 4.3335 3.33359H7.51874Z" fill="#444CE7" />
+</svg>
+
+const WebappSvg = <svg width="16" height="18" viewBox="0 0 16 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path d="M14.375 5.45825L7.99998 8.99992M7.99998 8.99992L1.62498 5.45825M7.99998 8.99992L8 16.1249M14.75 12.0439V5.95603C14.75 5.69904 14.75 5.57055 14.7121 5.45595C14.6786 5.35457 14.6239 5.26151 14.5515 5.18299C14.4697 5.09424 14.3574 5.03184 14.1328 4.90704L8.58277 1.8237C8.37007 1.70553 8.26372 1.64645 8.15109 1.62329C8.05141 1.60278 7.9486 1.60278 7.84891 1.62329C7.73628 1.64645 7.62993 1.70553 7.41723 1.8237L1.86723 4.90704C1.64259 5.03184 1.53026 5.09424 1.44847 5.18299C1.37612 5.26151 1.32136 5.35457 1.28786 5.45595C1.25 5.57055 1.25 5.69904 1.25 5.95603V12.0439C1.25 12.3008 1.25 12.4293 1.28786 12.5439C1.32136 12.6453 1.37612 12.7384 1.44847 12.8169C1.53026 12.9056 1.64259 12.968 1.86723 13.0928L7.41723 16.1762C7.62993 16.2943 7.73628 16.3534 7.84891 16.3766C7.9486 16.3971 8.05141 16.3971 8.15109 16.3766C8.26372 16.3534 8.37007 16.2943 8.58277 16.1762L14.1328 13.0928C14.3574 12.968 14.4697 12.9056 14.5515 12.8169C14.6239 12.7384 14.6786 12.6453 14.7121 12.5439C14.75 12.4293 14.75 12.3008 14.75 12.0439Z" stroke="#155EEF" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
+</svg>
+
+const NotionSvg = <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <g clipPath="url(#clip0_6294_13848)">
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M4.287 21.9133L1.70748 18.6999C1.08685 17.9267 0.75 16.976 0.75 15.9974V4.36124C0.75 2.89548 1.92269 1.67923 3.43553 1.57594L15.3991 0.759137C16.2682 0.699797 17.1321 0.930818 17.8461 1.41353L22.0494 4.25543C22.8018 4.76414 23.25 5.59574 23.25 6.48319V19.7124C23.25 21.1468 22.0969 22.3345 20.6157 22.4256L7.3375 23.243C6.1555 23.3158 5.01299 22.8178 4.287 21.9133Z" fill="white" />
+    <path d="M8.43607 10.1842V10.0318C8.43607 9.64564 8.74535 9.32537 9.14397 9.29876L12.0475 9.10491L16.0628 15.0178V9.82823L15.0293 9.69046V9.6181C15.0293 9.22739 15.3456 8.90501 15.7493 8.88433L18.3912 8.74899V9.12918C18.3912 9.30765 18.2585 9.46031 18.0766 9.49108L17.4408 9.59861V18.0029L16.6429 18.2773C15.9764 18.5065 15.2343 18.2611 14.8527 17.6853L10.9545 11.803V17.4173L12.1544 17.647L12.1377 17.7583C12.0853 18.1069 11.7843 18.3705 11.4202 18.3867L8.43607 18.5195C8.39662 18.1447 8.67758 17.8093 9.06518 17.7686L9.45771 17.7273V10.2416L8.43607 10.1842Z" fill="black" />
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M15.5062 2.22521L3.5426 3.04201C2.82599 3.09094 2.27051 3.66706 2.27051 4.36136V15.9975C2.27051 16.6499 2.49507 17.2837 2.90883 17.7992L5.48835 21.0126C5.90541 21.5322 6.56174 21.8183 7.24076 21.7765L20.519 20.9591C21.1995 20.9172 21.7293 20.3716 21.7293 19.7125V6.48332C21.7293 6.07557 21.5234 5.69348 21.1777 5.45975L16.9743 2.61784C16.546 2.32822 16.0277 2.1896 15.5062 2.22521ZM4.13585 4.54287C3.96946 4.41968 4.04865 4.16303 4.25768 4.14804L15.5866 3.33545C15.9476 3.30956 16.3063 3.40896 16.5982 3.61578L18.8713 5.22622C18.9576 5.28736 18.9171 5.41935 18.8102 5.42516L6.8129 6.07764C6.44983 6.09739 6.09144 5.99073 5.80276 5.77699L4.13585 4.54287ZM6.25018 8.12315C6.25018 7.7334 6.56506 7.41145 6.9677 7.38952L19.6523 6.69871C20.0447 6.67734 20.375 6.97912 20.375 7.35898V18.8141C20.375 19.2031 20.0613 19.5247 19.6594 19.5476L7.05516 20.2648C6.61845 20.2896 6.25018 19.954 6.25018 19.5312V8.12315Z" fill="black" />
+  </g>
+  <defs>
+    <clipPath id="clip0_6294_13848">
+      <rect width="24" height="24" fill="white" />
+    </clipPath>
+  </defs>
+</svg>
+
+const ICON_MAP = {
+  app: <AppIcon className='border !border-[rgba(0,0,0,0.05)]' />,
+  api: <AppIcon innerIcon={ApiSvg} className='border !border-purple-200 !bg-purple-50' />,
+  dataset: <AppIcon innerIcon={DatasetSvg} className='!border-[0.5px] !border-indigo-100 !bg-indigo-25' />,
+  webapp: <AppIcon innerIcon={WebappSvg} className='border !border-primary-200 !bg-primary-100' />,
+  notion: <AppIcon innerIcon={NotionSvg} className='!border-[0.5px] !border-indigo-100 !bg-white' />,
+}
+
+export default function AppBasic({ icon, icon_background, name, isExternal, type, hoverTip, textStyle, isExtraInLine, mode = 'expand', iconType = 'app' }: IAppBasicProps) {
+  const { t } = useTranslation()
+
+  return (
+    <div className="flex grow items-center">
+      {icon && icon_background && iconType === 'app' && (
+        <div className='mr-3 shrink-0'>
+          <AppIcon icon={icon} background={icon_background} />
+        </div>
+      )}
+      {iconType !== 'app'
+        && <div className='mr-3 shrink-0'>
+          {ICON_MAP[iconType]}
+        </div>
+
+      }
+      {mode === 'expand' && <div className="group w-full">
+        <div className={`system-md-semibold flex flex-row items-center text-text-secondary group-hover:text-text-primary ${textStyle?.main ?? ''}`}>
+          <div className="min-w-0 overflow-hidden text-ellipsis break-normal">
+            {name}
+          </div>
+          {hoverTip
+            && <Tooltip
+              popupContent={
+                <div className='w-[240px]'>
+                  {hoverTip}
+                </div>
+              }
+              popupClassName='ml-1'
+              triggerClassName='w-4 h-4 ml-1'
+              position='top'
+            />
+          }
+        </div>
+        {isExtraInLine ? (
+          <div className="system-2xs-medium-uppercase flex text-text-tertiary">{type}</div>
+        ) : (
+          <div className='system-2xs-medium-uppercase text-text-tertiary'>{isExternal ? t('dataset.externalTag') : type}</div>
+        )}
+      </div>}
+    </div>
+  )
+}
diff --git a/app/components/app-sidebar/completion.png b/app/components/app-sidebar/completion.png
new file mode 100644
index 0000000..7a3cbd5
--- /dev/null
+++ b/app/components/app-sidebar/completion.png
Binary files differ
diff --git a/app/components/app-sidebar/dataset-info.tsx b/app/components/app-sidebar/dataset-info.tsx
new file mode 100644
index 0000000..7374013
--- /dev/null
+++ b/app/components/app-sidebar/dataset-info.tsx
@@ -0,0 +1,45 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import AppIcon from '../base/app-icon'
+
+const DatasetSvg = <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path fillRule="evenodd" clipRule="evenodd" d="M0.833497 5.13481C0.833483 4.69553 0.83347 4.31654 0.858973 4.0044C0.88589 3.67495 0.94532 3.34727 1.10598 3.03195C1.34567 2.56155 1.72812 2.17909 2.19852 1.93941C2.51384 1.77875 2.84152 1.71932 3.17097 1.6924C3.48312 1.6669 3.86209 1.66691 4.30137 1.66693L7.62238 1.66684C8.11701 1.66618 8.55199 1.66561 8.95195 1.80356C9.30227 1.92439 9.62134 2.12159 9.88607 2.38088C10.1883 2.67692 10.3823 3.06624 10.603 3.50894L11.3484 5.00008H14.3679C15.0387 5.00007 15.5924 5.00006 16.0434 5.03691C16.5118 5.07518 16.9424 5.15732 17.3468 5.36339C17.974 5.68297 18.4839 6.19291 18.8035 6.82011C19.0096 7.22456 19.0917 7.65515 19.13 8.12356C19.1668 8.57455 19.1668 9.12818 19.1668 9.79898V13.5345C19.1668 14.2053 19.1668 14.7589 19.13 15.2099C19.0917 15.6784 19.0096 16.1089 18.8035 16.5134C18.4839 17.1406 17.974 17.6505 17.3468 17.9701C16.9424 18.1762 16.5118 18.2583 16.0434 18.2966C15.5924 18.3334 15.0387 18.3334 14.3679 18.3334H5.63243C4.96163 18.3334 4.40797 18.3334 3.95698 18.2966C3.48856 18.2583 3.05798 18.1762 2.65353 17.9701C2.02632 17.6505 1.51639 17.1406 1.19681 16.5134C0.990734 16.1089 0.908597 15.6784 0.870326 15.2099C0.833478 14.7589 0.833487 14.2053 0.833497 13.5345V5.13481ZM7.51874 3.33359C8.17742 3.33359 8.30798 3.34447 8.4085 3.37914C8.52527 3.41942 8.63163 3.48515 8.71987 3.57158C8.79584 3.64598 8.86396 3.7579 9.15852 4.34704L9.48505 5.00008L2.50023 5.00008C2.50059 4.61259 2.50314 4.34771 2.5201 4.14012C2.5386 3.91374 2.57 3.82981 2.59099 3.7886C2.67089 3.6318 2.79837 3.50432 2.95517 3.42442C2.99638 3.40343 3.08031 3.37203 3.30669 3.35353C3.54281 3.33424 3.85304 3.33359 4.3335 3.33359H7.51874Z" fill="#444CE7" />
+</svg>
+
+type Props = {
+  isExternal?: boolean
+  name: string
+  description: string
+  expand: boolean
+  extraInfo?: React.ReactNode
+}
+
+const DatasetInfo: FC<Props> = ({
+  name,
+  description,
+  isExternal,
+  expand,
+  extraInfo,
+}) => {
+  const { t } = useTranslation()
+  return (
+    <div className='pl-1 pt-1'>
+      <div className='mr-3 shrink-0'>
+        <AppIcon innerIcon={DatasetSvg} className='!border-[0.5px] !border-indigo-100 !bg-indigo-25' />
+      </div>
+      {expand && (
+        <div className='mt-2'>
+          <div className='system-md-semibold text-text-secondary'>
+            {name}
+          </div>
+          <div className='system-2xs-medium-uppercase mt-1 text-text-tertiary'>{isExternal ? t('dataset.externalTag') : t('dataset.localDocs')}</div>
+          <div className='system-xs-regular  my-3 text-text-tertiary first-letter:capitalize'>{description}</div>
+        </div>
+      )}
+      {extraInfo}
+    </div>
+  )
+}
+export default React.memo(DatasetInfo)
diff --git a/app/components/app-sidebar/expert.png b/app/components/app-sidebar/expert.png
new file mode 100644
index 0000000..ba941a5
--- /dev/null
+++ b/app/components/app-sidebar/expert.png
Binary files differ
diff --git a/app/components/app-sidebar/index.tsx b/app/components/app-sidebar/index.tsx
new file mode 100644
index 0000000..3276a1c
--- /dev/null
+++ b/app/components/app-sidebar/index.tsx
@@ -0,0 +1,126 @@
+import React, { useEffect } from 'react'
+import { useShallow } from 'zustand/react/shallow'
+import { RiLayoutLeft2Line, RiLayoutRight2Line } from '@remixicon/react'
+import NavLink from './navLink'
+import type { NavIcon } from './navLink'
+import AppBasic from './basic'
+import AppInfo from './app-info'
+import DatasetInfo from './dataset-info'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import cn from '@/utils/classnames'
+
+export type IAppDetailNavProps = {
+  iconType?: 'app' | 'dataset' | 'notion'
+  title: string
+  desc: string
+  isExternal?: boolean
+  icon: string
+  icon_background: string
+  navigation: Array<{
+    name: string
+    href: string
+    icon: NavIcon
+    selectedIcon: NavIcon
+  }>
+  extraInfo?: (modeState: string) => React.ReactNode
+}
+
+const AppDetailNav = ({ title, desc, isExternal, icon, icon_background, navigation, extraInfo, iconType = 'app' }: IAppDetailNavProps) => {
+  const { appSidebarExpand, setAppSiderbarExpand } = useAppStore(useShallow(state => ({
+    appSidebarExpand: state.appSidebarExpand,
+    setAppSiderbarExpand: state.setAppSiderbarExpand,
+  })))
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+  const expand = appSidebarExpand === 'expand'
+
+  const handleToggle = (state: string) => {
+    setAppSiderbarExpand(state === 'expand' ? 'collapse' : 'expand')
+  }
+
+  useEffect(() => {
+    if (appSidebarExpand) {
+      localStorage.setItem('app-detail-collapse-or-expand', appSidebarExpand)
+      setAppSiderbarExpand(appSidebarExpand)
+    }
+  }, [appSidebarExpand, setAppSiderbarExpand])
+
+  return (
+    <div
+      className={`
+        flex shrink-0 flex-col border-r border-divider-burn bg-background-default-subtle transition-all
+        ${expand ? 'w-[216px]' : 'w-14'}
+      `}
+    >
+      <div
+        className={`
+          shrink-0
+          ${expand ? 'p-2' : 'p-1'}
+        `}
+      >
+        {iconType === 'app' && (
+          <AppInfo expand={expand} />
+        )}
+        {iconType === 'dataset' && (
+          <DatasetInfo
+            name={title}
+            description={desc}
+            isExternal={isExternal}
+            expand={expand}
+            extraInfo={extraInfo && extraInfo(appSidebarExpand)}
+          />
+        )}
+        {!['app', 'dataset'].includes(iconType) && (
+          <AppBasic
+            mode={appSidebarExpand}
+            iconType={iconType}
+            icon={icon}
+            icon_background={icon_background}
+            name={title}
+            type={desc}
+            isExternal={isExternal}
+          />
+        )}
+      </div>
+      <div className='px-4'>
+        <div className={cn('mx-auto mt-1 h-[1px] bg-divider-subtle', !expand && 'w-6')} />
+      </div>
+      <nav
+        className={`
+          grow space-y-1
+          ${expand ? 'p-4' : 'px-2.5 py-4'}
+        `}
+      >
+        {navigation.map((item, index) => {
+          return (
+            <NavLink key={index} mode={appSidebarExpand} iconMap={{ selected: item.selectedIcon, normal: item.icon }} name={item.name} href={item.href} />
+          )
+        })}
+      </nav>
+      {
+        !isMobile && (
+          <div
+            className={`
+              shrink-0 py-3
+              ${expand ? 'px-6' : 'px-4'}
+            `}
+          >
+            <div
+              className='flex h-6 w-6 cursor-pointer items-center justify-center'
+              onClick={() => handleToggle(appSidebarExpand)}
+            >
+              {
+                expand
+                  ? <RiLayoutRight2Line className='h-5 w-5 text-components-menu-item-text' />
+                  : <RiLayoutLeft2Line className='h-5 w-5 text-components-menu-item-text' />
+              }
+            </div>
+          </div>
+        )
+      }
+    </div>
+  )
+}
+
+export default React.memo(AppDetailNav)
diff --git a/app/components/app-sidebar/navLink.tsx b/app/components/app-sidebar/navLink.tsx
new file mode 100644
index 0000000..295b553
--- /dev/null
+++ b/app/components/app-sidebar/navLink.tsx
@@ -0,0 +1,63 @@
+'use client'
+
+import { useSelectedLayoutSegment } from 'next/navigation'
+import Link from 'next/link'
+import classNames from '@/utils/classnames'
+import type { RemixiconComponentType } from '@remixicon/react'
+
+export type NavIcon = React.ComponentType<
+React.PropsWithoutRef<React.ComponentProps<'svg'>> & {
+  title?: string | undefined
+  titleId?: string | undefined
+}> | RemixiconComponentType
+
+export type NavLinkProps = {
+  name: string
+  href: string
+  iconMap: {
+    selected: NavIcon
+    normal: NavIcon
+  }
+  mode?: string
+}
+
+export default function NavLink({
+  name,
+  href,
+  iconMap,
+  mode = 'expand',
+}: NavLinkProps) {
+  const segment = useSelectedLayoutSegment()
+  const formattedSegment = (() => {
+    let res = segment?.toLowerCase()
+    // logs and annotations use the same nav
+    if (res === 'annotations')
+      res = 'logs'
+
+    return res
+  })()
+  const isActive = href.toLowerCase().split('/')?.pop() === formattedSegment
+  const NavIcon = isActive ? iconMap.selected : iconMap.normal
+
+  return (
+    <Link
+      key={name}
+      href={href}
+      className={classNames(
+        isActive ? 'bg-state-accent-active text-text-accent font-semibold' : 'text-components-menu-item-text hover:bg-state-base-hover hover:text-components-menu-item-text-hover',
+        'group flex items-center h-9 rounded-md py-2 text-sm font-normal',
+        mode === 'expand' ? 'px-3' : 'px-2.5',
+      )}
+      title={mode === 'collapse' ? name : ''}
+    >
+      <NavIcon
+        className={classNames(
+          'h-4 w-4 flex-shrink-0',
+          mode === 'expand' ? 'mr-2' : 'mr-0',
+        )}
+        aria-hidden="true"
+      />
+      {mode === 'expand' && name}
+    </Link>
+  )
+}
diff --git a/app/components/app-sidebar/style.module.css b/app/components/app-sidebar/style.module.css
new file mode 100644
index 0000000..ca0978b
--- /dev/null
+++ b/app/components/app-sidebar/style.module.css
@@ -0,0 +1,11 @@
+.sidebar {
+    border-right: 1px solid #F3F4F6;
+}
+
+.completionPic {
+background-image: url('./completion.png')
+}
+
+.expertPic {
+background-image: url('./expert.png')
+}
diff --git a/app/components/app/annotation/add-annotation-modal/edit-item/index.tsx b/app/components/app/annotation/add-annotation-modal/edit-item/index.tsx
new file mode 100644
index 0000000..4c118c6
--- /dev/null
+++ b/app/components/app/annotation/add-annotation-modal/edit-item/index.tsx
@@ -0,0 +1,45 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import Textarea from '@/app/components/base/textarea'
+import { Robot, User } from '@/app/components/base/icons/src/public/avatar'
+
+export enum EditItemType {
+  Query = 'query',
+  Answer = 'answer',
+}
+type Props = {
+  type: EditItemType
+  content: string
+  onChange: (content: string) => void
+}
+
+const EditItem: FC<Props> = ({
+  type,
+  content,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const avatar = type === EditItemType.Query ? <User className='h-6 w-6' /> : <Robot className='h-6 w-6' />
+  const name = type === EditItemType.Query ? t('appAnnotation.addModal.queryName') : t('appAnnotation.addModal.answerName')
+  const placeholder = type === EditItemType.Query ? t('appAnnotation.addModal.queryPlaceholder') : t('appAnnotation.addModal.answerPlaceholder')
+
+  return (
+    <div className='flex' onClick={e => e.stopPropagation()}>
+      <div className='mr-3 shrink-0'>
+        {avatar}
+      </div>
+      <div className='grow'>
+        <div className='system-xs-semibold mb-1 text-text-primary'>{name}</div>
+        <Textarea
+          value={content}
+          onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => onChange(e.target.value)}
+          placeholder={placeholder}
+          autoFocus
+        />
+      </div>
+    </div>
+  )
+}
+export default React.memo(EditItem)
diff --git a/app/components/app/annotation/add-annotation-modal/index.tsx b/app/components/app/annotation/add-annotation-modal/index.tsx
new file mode 100644
index 0000000..274a57a
--- /dev/null
+++ b/app/components/app/annotation/add-annotation-modal/index.tsx
@@ -0,0 +1,121 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { AnnotationItemBasic } from '../type'
+import EditItem, { EditItemType } from './edit-item'
+import Checkbox from '@/app/components/base/checkbox'
+import Drawer from '@/app/components/base/drawer-plus'
+import Button from '@/app/components/base/button'
+import Toast from '@/app/components/base/toast'
+import { useProviderContext } from '@/context/provider-context'
+import AnnotationFull from '@/app/components/billing/annotation-full'
+type Props = {
+  isShow: boolean
+  onHide: () => void
+  onAdd: (payload: AnnotationItemBasic) => void
+}
+
+const AddAnnotationModal: FC<Props> = ({
+  isShow,
+  onHide,
+  onAdd,
+}) => {
+  const { t } = useTranslation()
+  const { plan, enableBilling } = useProviderContext()
+  const isAnnotationFull = (enableBilling && plan.usage.annotatedResponse >= plan.total.annotatedResponse)
+  const [question, setQuestion] = useState('')
+  const [answer, setAnswer] = useState('')
+  const [isCreateNext, setIsCreateNext] = useState(false)
+  const [isSaving, setIsSaving] = useState(false)
+
+  const isValid = (payload: AnnotationItemBasic) => {
+    if (!payload.question)
+      return t('appAnnotation.errorMessage.queryRequired')
+
+    if (!payload.answer)
+      return t('appAnnotation.errorMessage.answerRequired')
+
+    return true
+  }
+
+  const handleSave = async () => {
+    const payload = {
+      question,
+      answer,
+    }
+    if (isValid(payload) !== true) {
+      Toast.notify({
+        type: 'error',
+        message: isValid(payload) as string,
+      })
+      return
+    }
+
+    setIsSaving(true)
+    try {
+      await onAdd(payload)
+    }
+    catch {
+    }
+    setIsSaving(false)
+
+    if (isCreateNext) {
+      setQuestion('')
+      setAnswer('')
+    }
+    else {
+      onHide()
+    }
+  }
+  return (
+    <div>
+      <Drawer
+        isShow={isShow}
+        onHide={onHide}
+        maxWidthClassName='!max-w-[480px]'
+        title={t('appAnnotation.addModal.title') as string}
+        body={(
+          <div className='space-y-6 p-6 pb-4'>
+            <EditItem
+              type={EditItemType.Query}
+              content={question}
+              onChange={setQuestion}
+            />
+            <EditItem
+              type={EditItemType.Answer}
+              content={answer}
+              onChange={setAnswer}
+            />
+          </div>
+        )}
+        foot={
+          (
+            <div>
+              {isAnnotationFull && (
+                <div className='mb-4 mt-6 px-6'>
+                  <AnnotationFull />
+                </div>
+              )}
+              <div className='system-sm-medium flex h-16 items-center justify-between rounded-bl-xl rounded-br-xl border-t border-divider-subtle bg-background-section-burn px-4 text-text-tertiary'>
+                <div
+                  className='flex items-center space-x-2'
+                >
+                  <Checkbox checked={isCreateNext} onCheck={() => setIsCreateNext(!isCreateNext)} />
+                  <div>{t('appAnnotation.addModal.createNext')}</div>
+                </div>
+                <div className='mt-2 flex space-x-2'>
+                  <Button className='h-7 text-xs' onClick={onHide}>{t('common.operation.cancel')}</Button>
+                  <Button className='h-7 text-xs' variant='primary' onClick={handleSave} loading={isSaving} disabled={isAnnotationFull}>{t('common.operation.add')}</Button>
+                </div>
+              </div>
+            </div>
+
+          )
+        }
+      >
+      </Drawer>
+    </div>
+  )
+}
+export default React.memo(AddAnnotationModal)
diff --git a/app/components/app/annotation/batch-add-annotation-modal/csv-downloader.tsx b/app/components/app/annotation/batch-add-annotation-modal/csv-downloader.tsx
new file mode 100644
index 0000000..8fb42e1
--- /dev/null
+++ b/app/components/app/annotation/batch-add-annotation-modal/csv-downloader.tsx
@@ -0,0 +1,73 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import {
+  useCSVDownloader,
+} from 'react-papaparse'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { Download02 as DownloadIcon } from '@/app/components/base/icons/src/vender/solid/general'
+import I18n from '@/context/i18n'
+import { LanguagesSupported } from '@/i18n/language'
+
+const CSV_TEMPLATE_QA_EN = [
+  ['question', 'answer'],
+  ['question1', 'answer1'],
+  ['question2', 'answer2'],
+]
+const CSV_TEMPLATE_QA_CN = [
+  ['闂', '绛旀'],
+  ['闂 1', '绛旀 1'],
+  ['闂 2', '绛旀 2'],
+]
+
+const CSVDownload: FC = () => {
+  const { t } = useTranslation()
+
+  const { locale } = useContext(I18n)
+  const { CSVDownloader, Type } = useCSVDownloader()
+
+  const getTemplate = () => {
+    return locale !== LanguagesSupported[1] ? CSV_TEMPLATE_QA_EN : CSV_TEMPLATE_QA_CN
+  }
+
+  return (
+    <div className='mt-6'>
+      <div className='system-sm-medium text-text-primary'>{t('share.generation.csvStructureTitle')}</div>
+      <div className='mt-2 max-h-[500px] overflow-auto'>
+        <table className='w-full table-fixed border-separate border-spacing-0 rounded-lg border border-divider-regular text-xs'>
+          <thead className='text-text-tertiary'>
+            <tr>
+              <td className='h-9 border-b border-divider-regular pl-3 pr-2'>{t('appAnnotation.batchModal.question')}</td>
+              <td className='h-9 border-b border-divider-regular pl-3 pr-2'>{t('appAnnotation.batchModal.answer')}</td>
+            </tr>
+          </thead>
+          <tbody className='text-text-secondary'>
+            <tr>
+              <td className='h-9 border-b border-divider-subtle pl-3 pr-2 text-[13px]'>{t('appAnnotation.batchModal.question')} 1</td>
+              <td className='h-9 border-b border-divider-subtle pl-3 pr-2 text-[13px]'>{t('appAnnotation.batchModal.answer')} 1</td>
+            </tr>
+            <tr>
+              <td className='h-9 pl-3 pr-2 text-[13px]'>{t('appAnnotation.batchModal.question')} 2</td>
+              <td className='h-9 pl-3 pr-2 text-[13px]'>{t('appAnnotation.batchModal.answer')} 2</td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+      <CSVDownloader
+        className="mt-2 block cursor-pointer"
+        type={Type.Link}
+        filename={`template-${locale}`}
+        bom={true}
+        data={getTemplate()}
+      >
+        <div className='system-xs-medium flex h-[18px] items-center space-x-1 text-text-accent'>
+          <DownloadIcon className='mr-1 h-3 w-3' />
+          {t('appAnnotation.batchModal.template')}
+        </div>
+      </CSVDownloader>
+    </div>
+
+  )
+}
+export default React.memo(CSVDownload)
diff --git a/app/components/app/annotation/batch-add-annotation-modal/csv-uploader.tsx b/app/components/app/annotation/batch-add-annotation-modal/csv-uploader.tsx
new file mode 100644
index 0000000..dfc8d10
--- /dev/null
+++ b/app/components/app/annotation/batch-add-annotation-modal/csv-uploader.tsx
@@ -0,0 +1,126 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { RiDeleteBinLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import { Csv as CSVIcon } from '@/app/components/base/icons/src/public/files'
+import { ToastContext } from '@/app/components/base/toast'
+import Button from '@/app/components/base/button'
+
+export type Props = {
+  file: File | undefined
+  updateFile: (file?: File) => void
+}
+
+const CSVUploader: FC<Props> = ({
+  file,
+  updateFile,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const [dragging, setDragging] = useState(false)
+  const dropRef = useRef<HTMLDivElement>(null)
+  const dragRef = useRef<HTMLDivElement>(null)
+  const fileUploader = useRef<HTMLInputElement>(null)
+
+  const handleDragEnter = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+    e.target !== dragRef.current && setDragging(true)
+  }
+  const handleDragOver = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+  }
+  const handleDragLeave = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+    e.target === dragRef.current && setDragging(false)
+  }
+  const handleDrop = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+    setDragging(false)
+    if (!e.dataTransfer)
+      return
+    const files = [...e.dataTransfer.files]
+    if (files.length > 1) {
+      notify({ type: 'error', message: t('datasetCreation.stepOne.uploader.validation.count') })
+      return
+    }
+    updateFile(files[0])
+  }
+  const selectHandle = () => {
+    if (fileUploader.current)
+      fileUploader.current.click()
+  }
+  const removeFile = () => {
+    if (fileUploader.current)
+      fileUploader.current.value = ''
+    updateFile()
+  }
+  const fileChangeHandle = (e: React.ChangeEvent<HTMLInputElement>) => {
+    const currentFile = e.target.files?.[0]
+    updateFile(currentFile)
+  }
+
+  useEffect(() => {
+    dropRef.current?.addEventListener('dragenter', handleDragEnter)
+    dropRef.current?.addEventListener('dragover', handleDragOver)
+    dropRef.current?.addEventListener('dragleave', handleDragLeave)
+    dropRef.current?.addEventListener('drop', handleDrop)
+    return () => {
+      dropRef.current?.removeEventListener('dragenter', handleDragEnter)
+      dropRef.current?.removeEventListener('dragover', handleDragOver)
+      dropRef.current?.removeEventListener('dragleave', handleDragLeave)
+      dropRef.current?.removeEventListener('drop', handleDrop)
+    }
+  }, [])
+
+  return (
+    <div className='mt-6'>
+      <input
+        ref={fileUploader}
+        style={{ display: 'none' }}
+        type="file"
+        id="fileUploader"
+        accept='.csv'
+        onChange={fileChangeHandle}
+      />
+      <div ref={dropRef}>
+        {!file && (
+          <div className={cn('system-sm-regular flex h-20 items-center rounded-xl border border-dashed border-components-dropzone-border bg-components-dropzone-bg', dragging && 'border border-components-dropzone-border-accent bg-components-dropzone-bg-accent')}>
+            <div className='flex w-full items-center justify-center space-x-2'>
+              <CSVIcon className="shrink-0" />
+              <div className='text-text-tertiary'>
+                {t('appAnnotation.batchModal.csvUploadTitle')}
+                <span className='cursor-pointer text-text-accent' onClick={selectHandle}>{t('appAnnotation.batchModal.browse')}</span>
+              </div>
+            </div>
+            {dragging && <div ref={dragRef} className='absolute left-0 top-0 h-full w-full' />}
+          </div>
+        )}
+        {file && (
+          <div className={cn('group flex h-20 items-center rounded-xl border border-components-panel-border bg-components-panel-bg px-6 text-sm font-normal', 'hover:border-components-panel-bg-blur hover:bg-components-panel-bg-blur')}>
+            <CSVIcon className="shrink-0" />
+            <div className='ml-2 flex w-0 grow'>
+              <span className='max-w-[calc(100%_-_30px)] overflow-hidden text-ellipsis whitespace-nowrap text-text-primary'>{file.name.replace(/.csv$/, '')}</span>
+              <span className='shrink-0 text-text-tertiary'>.csv</span>
+            </div>
+            <div className='hidden items-center group-hover:flex'>
+              <Button variant='secondary' onClick={selectHandle}>{t('datasetCreation.stepOne.uploader.change')}</Button>
+              <div className='mx-2 h-4 w-px bg-divider-regular' />
+              <div className='cursor-pointer p-2' onClick={removeFile}>
+                <RiDeleteBinLine className='h-4 w-4 text-text-tertiary' />
+              </div>
+            </div>
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(CSVUploader)
diff --git a/app/components/app/annotation/batch-add-annotation-modal/index.tsx b/app/components/app/annotation/batch-add-annotation-modal/index.tsx
new file mode 100644
index 0000000..8f4e907
--- /dev/null
+++ b/app/components/app/annotation/batch-add-annotation-modal/index.tsx
@@ -0,0 +1,124 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import CSVUploader from './csv-uploader'
+import CSVDownloader from './csv-downloader'
+import Button from '@/app/components/base/button'
+import Modal from '@/app/components/base/modal'
+import Toast from '@/app/components/base/toast'
+import { annotationBatchImport, checkAnnotationBatchImportProgress } from '@/service/annotation'
+import { useProviderContext } from '@/context/provider-context'
+import AnnotationFull from '@/app/components/billing/annotation-full'
+import { noop } from 'lodash-es'
+
+export enum ProcessStatus {
+  WAITING = 'waiting',
+  PROCESSING = 'processing',
+  COMPLETED = 'completed',
+  ERROR = 'error',
+}
+
+export type IBatchModalProps = {
+  appId: string
+  isShow: boolean
+  onCancel: () => void
+  onAdded: () => void
+}
+
+const BatchModal: FC<IBatchModalProps> = ({
+  appId,
+  isShow,
+  onCancel,
+  onAdded,
+}) => {
+  const { t } = useTranslation()
+  const { plan, enableBilling } = useProviderContext()
+  const isAnnotationFull = (enableBilling && plan.usage.annotatedResponse >= plan.total.annotatedResponse)
+  const [currentCSV, setCurrentCSV] = useState<File>()
+  const handleFile = (file?: File) => setCurrentCSV(file)
+
+  useEffect(() => {
+    if (!isShow)
+      setCurrentCSV(undefined)
+  }, [isShow])
+
+  const [importStatus, setImportStatus] = useState<ProcessStatus | string>()
+  const notify = Toast.notify
+  const checkProcess = async (jobID: string) => {
+    try {
+      const res = await checkAnnotationBatchImportProgress({ jobID, appId })
+      setImportStatus(res.job_status)
+      if (res.job_status === ProcessStatus.WAITING || res.job_status === ProcessStatus.PROCESSING)
+        setTimeout(() => checkProcess(res.job_id), 2500)
+      if (res.job_status === ProcessStatus.ERROR)
+        notify({ type: 'error', message: `${t('appAnnotation.batchModal.runError')}` })
+      if (res.job_status === ProcessStatus.COMPLETED) {
+        notify({ type: 'success', message: `${t('appAnnotation.batchModal.completed')}` })
+        onAdded()
+        onCancel()
+      }
+    }
+    catch (e: any) {
+      notify({ type: 'error', message: `${t('appAnnotation.batchModal.runError')}${'message' in e ? `: ${e.message}` : ''}` })
+    }
+  }
+
+  const runBatch = async (csv: File) => {
+    const formData = new FormData()
+    formData.append('file', csv)
+    try {
+      const res = await annotationBatchImport({
+        url: `/apps/${appId}/annotations/batch-import`,
+        body: formData,
+      })
+      setImportStatus(res.job_status)
+      checkProcess(res.job_id)
+    }
+    catch (e: any) {
+      notify({ type: 'error', message: `${t('appAnnotation.batchModal.runError')}${'message' in e ? `: ${e.message}` : ''}` })
+    }
+  }
+
+  const handleSend = () => {
+    if (!currentCSV)
+      return
+    runBatch(currentCSV)
+  }
+
+  return (
+    <Modal isShow={isShow} onClose={noop} className='!max-w-[520px] !rounded-xl px-8 py-6'>
+      <div className='system-xl-medium relative pb-1 text-text-primary'>{t('appAnnotation.batchModal.title')}</div>
+      <div className='absolute right-4 top-4 cursor-pointer p-2' onClick={onCancel}>
+        <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+      </div>
+      <CSVUploader
+        file={currentCSV}
+        updateFile={handleFile}
+      />
+      <CSVDownloader />
+
+      {isAnnotationFull && (
+        <div className='mt-4'>
+          <AnnotationFull />
+        </div>
+      )}
+
+      <div className='mt-[28px] flex justify-end pt-6'>
+        <Button className='system-sm-medium mr-2 text-text-tertiary' onClick={onCancel}>
+          {t('appAnnotation.batchModal.cancel')}
+        </Button>
+        <Button
+          variant="primary"
+          onClick={handleSend}
+          disabled={isAnnotationFull || !currentCSV}
+          loading={importStatus === ProcessStatus.PROCESSING || importStatus === ProcessStatus.WAITING}
+        >
+          {t('appAnnotation.batchModal.run')}
+        </Button>
+      </div>
+    </Modal>
+  )
+}
+export default React.memo(BatchModal)
diff --git a/app/components/app/annotation/edit-annotation-modal/edit-item/index.tsx b/app/components/app/annotation/edit-annotation-modal/edit-item/index.tsx
new file mode 100644
index 0000000..f68ec4a
--- /dev/null
+++ b/app/components/app/annotation/edit-annotation-modal/edit-item/index.tsx
@@ -0,0 +1,128 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiDeleteBinLine, RiEditFill, RiEditLine } from '@remixicon/react'
+import { Robot, User } from '@/app/components/base/icons/src/public/avatar'
+import Textarea from '@/app/components/base/textarea'
+import Button from '@/app/components/base/button'
+import cn from '@/utils/classnames'
+
+export enum EditItemType {
+  Query = 'query',
+  Answer = 'answer',
+}
+type Props = {
+  type: EditItemType
+  content: string
+  readonly?: boolean
+  onSave: (content: string) => void
+}
+
+export const EditTitle: FC<{ className?: string; title: string }> = ({ className, title }) => (
+  <div className={cn(className, 'system-xs-medium flex h-[18px] items-center text-text-tertiary')}>
+    <RiEditFill className='mr-1 h-3.5 w-3.5' />
+    <div>{title}</div>
+    <div
+      className='ml-2 h-[1px] grow'
+      style={{
+        background: 'linear-gradient(90deg, rgba(0, 0, 0, 0.05) -1.65%, rgba(0, 0, 0, 0.00) 100%)',
+      }}
+    ></div>
+  </div>
+)
+const EditItem: FC<Props> = ({
+  type,
+  readonly,
+  content,
+  onSave,
+}) => {
+  const { t } = useTranslation()
+  const [newContent, setNewContent] = useState('')
+  const showNewContent = newContent && newContent !== content
+  const avatar = type === EditItemType.Query ? <User className='h-6 w-6' /> : <Robot className='h-6 w-6' />
+  const name = type === EditItemType.Query ? t('appAnnotation.editModal.queryName') : t('appAnnotation.editModal.answerName')
+  const editTitle = type === EditItemType.Query ? t('appAnnotation.editModal.yourQuery') : t('appAnnotation.editModal.yourAnswer')
+  const placeholder = type === EditItemType.Query ? t('appAnnotation.editModal.queryPlaceholder') : t('appAnnotation.editModal.answerPlaceholder')
+  const [isEdit, setIsEdit] = useState(false)
+
+  const handleSave = () => {
+    onSave(newContent)
+    setIsEdit(false)
+  }
+
+  const handleCancel = () => {
+    setNewContent('')
+    setIsEdit(false)
+  }
+
+  return (
+    <div className='flex' onClick={e => e.stopPropagation()}>
+      <div className='mr-3 shrink-0'>
+        {avatar}
+      </div>
+      <div className='grow'>
+        <div className='system-xs-semibold mb-1 text-text-primary'>{name}</div>
+        <div className='system-sm-regular text-text-primary'>{content}</div>
+        {!isEdit
+          ? (
+            <div>
+              {showNewContent && (
+                <div className='mt-3'>
+                  <EditTitle title={editTitle} />
+                  <div className='system-sm-regular mt-1 text-text-primary'>{newContent}</div>
+                </div>
+              )}
+              <div className='mt-2 flex items-center'>
+                {!readonly && (
+                  <div
+                    className='system-xs-medium flex cursor-pointer items-center space-x-1 text-text-accent'
+                    onClick={() => {
+                      setIsEdit(true)
+                    }}
+                  >
+                    <RiEditLine className='mr-1 h-3.5 w-3.5' />
+                    <div>{t('common.operation.edit')}</div>
+                  </div>
+                )}
+
+                {showNewContent && (
+                  <div className='system-xs-medium ml-2 flex items-center text-text-tertiary'>
+                    <div className='mr-2'>路</div>
+                    <div
+                      className='flex cursor-pointer items-center space-x-1'
+                      onClick={() => {
+                        setNewContent(content)
+                        onSave(content)
+                      }}
+                    >
+                      <div className='h-3.5 w-3.5'>
+                        <RiDeleteBinLine className='h-3.5 w-3.5' />
+                      </div>
+                      <div>{t('common.operation.delete')}</div>
+                    </div>
+                  </div>
+                )}
+              </div>
+            </div>
+          )
+          : (
+            <div className='mt-3'>
+              <EditTitle title={editTitle} />
+              <Textarea
+                value={newContent}
+                onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => setNewContent(e.target.value)}
+                placeholder={placeholder}
+                autoFocus
+              />
+              <div className='mt-2 flex space-x-2'>
+                <Button size='small' variant='primary' onClick={handleSave}>{t('common.operation.save')}</Button>
+                <Button size='small' onClick={handleCancel}>{t('common.operation.cancel')}</Button>
+              </div>
+            </div>
+          )}
+      </div>
+    </div>
+  )
+}
+export default React.memo(EditItem)
diff --git a/app/components/app/annotation/edit-annotation-modal/index.tsx b/app/components/app/annotation/edit-annotation-modal/index.tsx
new file mode 100644
index 0000000..2961ce3
--- /dev/null
+++ b/app/components/app/annotation/edit-annotation-modal/index.tsx
@@ -0,0 +1,146 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import EditItem, { EditItemType } from './edit-item'
+import Drawer from '@/app/components/base/drawer-plus'
+import { MessageCheckRemove } from '@/app/components/base/icons/src/vender/line/communication'
+import Confirm from '@/app/components/base/confirm'
+import { addAnnotation, editAnnotation } from '@/service/annotation'
+import Toast from '@/app/components/base/toast'
+import { useProviderContext } from '@/context/provider-context'
+import AnnotationFull from '@/app/components/billing/annotation-full'
+import useTimestamp from '@/hooks/use-timestamp'
+
+type Props = {
+  isShow: boolean
+  onHide: () => void
+  appId: string
+  messageId?: string
+  annotationId?: string
+  query: string
+  answer: string
+  onEdited: (editedQuery: string, editedAnswer: string) => void
+  onAdded: (annotationId: string, authorName: string, editedQuery: string, editedAnswer: string) => void
+  createdAt?: number
+  onRemove: () => void
+  onlyEditResponse?: boolean
+}
+
+const EditAnnotationModal: FC<Props> = ({
+  isShow,
+  onHide,
+  query,
+  answer,
+  onEdited,
+  onAdded,
+  appId,
+  messageId,
+  annotationId,
+  createdAt,
+  onRemove,
+  onlyEditResponse,
+}) => {
+  const { t } = useTranslation()
+  const { formatTime } = useTimestamp()
+  const { plan, enableBilling } = useProviderContext()
+  const isAdd = !annotationId
+  const isAnnotationFull = (enableBilling && plan.usage.annotatedResponse >= plan.total.annotatedResponse)
+  const handleSave = async (type: EditItemType, editedContent: string) => {
+    let postQuery = query
+    let postAnswer = answer
+    if (type === EditItemType.Query)
+      postQuery = editedContent
+    else
+      postAnswer = editedContent
+    if (!isAdd) {
+      await editAnnotation(appId, annotationId, {
+        message_id: messageId,
+        question: postQuery,
+        answer: postAnswer,
+      })
+      onEdited(postQuery, postAnswer)
+    }
+    else {
+      const res: any = await addAnnotation(appId, {
+        question: postQuery,
+        answer: postAnswer,
+        message_id: messageId,
+      })
+      onAdded(res.id, res.account?.name, postQuery, postAnswer)
+    }
+
+    Toast.notify({
+      message: t('common.api.actionSuccess') as string,
+      type: 'success',
+    })
+  }
+  const [showModal, setShowModal] = useState(false)
+
+  return (
+    <div>
+      <Drawer
+        isShow={isShow}
+        onHide={onHide}
+        maxWidthClassName='!max-w-[480px]'
+        title={t('appAnnotation.editModal.title') as string}
+        body={(
+          <div>
+            <div className='space-y-6 p-6 pb-4'>
+              <EditItem
+                type={EditItemType.Query}
+                content={query}
+                readonly={(isAdd && isAnnotationFull) || onlyEditResponse}
+                onSave={editedContent => handleSave(EditItemType.Query, editedContent)}
+              />
+              <EditItem
+                type={EditItemType.Answer}
+                content={answer}
+                readonly={isAdd && isAnnotationFull}
+                onSave={editedContent => handleSave(EditItemType.Answer, editedContent)}
+              />
+              <Confirm
+                isShow={showModal}
+                onCancel={() => setShowModal(false)}
+                onConfirm={() => {
+                  onRemove()
+                  setShowModal(false)
+                  onHide()
+                }}
+                title={t('appDebug.feature.annotation.removeConfirm')}
+              />
+            </div>
+          </div>
+        )}
+        foot={
+          <div>
+            {isAnnotationFull && (
+              <div className='mb-4 mt-6 px-6'>
+                <AnnotationFull />
+              </div>
+            )}
+
+            {
+              annotationId
+                ? (
+                  <div className='system-sm-medium flex h-16 items-center justify-between rounded-bl-xl rounded-br-xl border-t border-divider-subtle bg-background-section-burn px-4 text-text-tertiary'>
+                    <div
+                      className='flex cursor-pointer items-center space-x-2 pl-3'
+                      onClick={() => setShowModal(true)}
+                    >
+                      <MessageCheckRemove />
+                      <div>{t('appAnnotation.editModal.removeThisCache')}</div>
+                    </div>
+                    {createdAt && <div>{t('appAnnotation.editModal.createdAt')}&nbsp;{formatTime(createdAt, t('appLog.dateTimeFormat') as string)}</div>}
+                  </div>
+                )
+                : undefined
+            }
+          </div>
+        }
+      />
+    </div>
+
+  )
+}
+export default React.memo(EditAnnotationModal)
diff --git a/app/components/app/annotation/empty-element.tsx b/app/components/app/annotation/empty-element.tsx
new file mode 100644
index 0000000..a240f93
--- /dev/null
+++ b/app/components/app/annotation/empty-element.tsx
@@ -0,0 +1,26 @@
+'use client'
+import type { FC, SVGProps } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+
+const ThreeDotsIcon = ({ className }: SVGProps<SVGElement>) => {
+  return <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" className={className ?? ''}>
+    <path d="M5 6.5V5M8.93934 7.56066L10 6.5M10.0103 11.5H11.5103" stroke="#374151" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
+  </svg>
+}
+
+const EmptyElement: FC = () => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex h-full items-center justify-center'>
+      <div className='box-border h-fit w-[560px] rounded-2xl bg-background-section-burn px-5 py-4'>
+        <span className='system-md-semibold text-text-secondary'>{t('appAnnotation.noData.title')}<ThreeDotsIcon className='relative -left-1.5 -top-3 inline' /></span>
+        <div className='system-sm-regular mt-2 text-text-tertiary'>
+          {t('appAnnotation.noData.description')}
+        </div>
+      </div>
+    </div>
+  )
+}
+export default React.memo(EmptyElement)
diff --git a/app/components/app/annotation/filter.tsx b/app/components/app/annotation/filter.tsx
new file mode 100644
index 0000000..b494d38
--- /dev/null
+++ b/app/components/app/annotation/filter.tsx
@@ -0,0 +1,48 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import useSWR from 'swr'
+import Input from '@/app/components/base/input'
+import { fetchAnnotationsCount } from '@/service/log'
+
+export type QueryParam = {
+  keyword?: string
+}
+
+type IFilterProps = {
+  appId: string
+  queryParams: QueryParam
+  setQueryParams: (v: QueryParam) => void
+  children: React.JSX.Element
+}
+
+const Filter: FC<IFilterProps> = ({
+  appId,
+  queryParams,
+  setQueryParams,
+  children,
+}) => {
+  // TODO: change fetch list api
+  const { data } = useSWR({ url: `/apps/${appId}/annotations/count` }, fetchAnnotationsCount)
+  const { t } = useTranslation()
+  if (!data)
+    return null
+  return (
+    <div className='mb-2 flex flex-row flex-wrap items-center justify-between gap-2'>
+      <Input
+        wrapperClassName='w-[200px]'
+        showLeftIcon
+        showClearIcon
+        value={queryParams.keyword}
+        placeholder={t('common.operation.search')!}
+        onChange={(e) => {
+          setQueryParams({ ...queryParams, keyword: e.target.value })
+        }}
+        onClear={() => setQueryParams({ ...queryParams, keyword: '' })}
+      />
+      {children}
+    </div>
+  )
+}
+export default React.memo(Filter)
diff --git a/app/components/app/annotation/header-opts/index.tsx b/app/components/app/annotation/header-opts/index.tsx
new file mode 100644
index 0000000..eb397db
--- /dev/null
+++ b/app/components/app/annotation/header-opts/index.tsx
@@ -0,0 +1,175 @@
+'use client'
+import type { FC } from 'react'
+import React, { Fragment, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAddLine,
+  RiMoreFill,
+} from '@remixicon/react'
+import { useContext } from 'use-context-selector'
+import {
+  useCSVDownloader,
+} from 'react-papaparse'
+import { Menu, MenuButton, MenuItems, Transition } from '@headlessui/react'
+import Button from '../../../base/button'
+import AddAnnotationModal from '../add-annotation-modal'
+import type { AnnotationItemBasic } from '../type'
+import BatchAddModal from '../batch-add-annotation-modal'
+import cn from '@/utils/classnames'
+import CustomPopover from '@/app/components/base/popover'
+import { FileDownload02, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files'
+import { ChevronRight } from '@/app/components/base/icons/src/vender/line/arrows'
+
+import I18n from '@/context/i18n'
+import { fetchExportAnnotationList } from '@/service/annotation'
+import { LanguagesSupported } from '@/i18n/language'
+
+const CSV_HEADER_QA_EN = ['Question', 'Answer']
+const CSV_HEADER_QA_CN = ['闂', '绛旀']
+
+type Props = {
+  appId: string
+  onAdd: (payload: AnnotationItemBasic) => void
+  onAdded: () => void
+  controlUpdateList: number
+}
+
+const HeaderOptions: FC<Props> = ({
+  appId,
+  onAdd,
+  onAdded,
+  controlUpdateList,
+}) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const { CSVDownloader, Type } = useCSVDownloader()
+  const [list, setList] = useState<AnnotationItemBasic[]>([])
+  const annotationUnavailable = list.length === 0
+
+  const listTransformer = (list: AnnotationItemBasic[]) => list.map(
+    (item: AnnotationItemBasic) => {
+      const dataString = `{"messages": [{"role": "system", "content": ""}, {"role": "user", "content": ${JSON.stringify(item.question)}}, {"role": "assistant", "content": ${JSON.stringify(item.answer)}}]}`
+      return dataString
+    },
+  )
+
+  const JSONLOutput = () => {
+    const a = document.createElement('a')
+    const content = listTransformer(list).join('\n')
+    const file = new Blob([content], { type: 'application/jsonl' })
+    a.href = URL.createObjectURL(file)
+    a.download = `annotations-${locale}.jsonl`
+    a.click()
+  }
+
+  const fetchList = async () => {
+    const { data }: any = await fetchExportAnnotationList(appId)
+    setList(data as AnnotationItemBasic[])
+  }
+
+  useEffect(() => {
+    fetchList()
+  }, [])
+  useEffect(() => {
+    if (controlUpdateList)
+      fetchList()
+  }, [controlUpdateList])
+
+  const [showBulkImportModal, setShowBulkImportModal] = useState(false)
+
+  const Operations = () => {
+    return (
+      <div className="w-full py-1">
+        <button className='mx-1 flex h-9 w-[calc(100%_-_8px)] cursor-pointer items-center space-x-2 rounded-lg px-3 py-2 hover:bg-components-panel-on-panel-item-bg-hover disabled:opacity-50' onClick={() => {
+          setShowBulkImportModal(true)
+        }}>
+          <FilePlus02 className='h-4 w-4 text-text-tertiary' />
+          <span className='system-sm-regular grow text-left text-text-secondary'>{t('appAnnotation.table.header.bulkImport')}</span>
+        </button>
+        <Menu as="div" className="relative h-full w-full">
+          <MenuButton className='mx-1 flex h-9 w-[calc(100%_-_8px)] cursor-pointer items-center space-x-2 rounded-lg px-3 py-2 hover:bg-components-panel-on-panel-item-bg-hover disabled:opacity-50'>
+            <FileDownload02 className='h-4 w-4 text-text-tertiary' />
+            <span className='system-sm-regular grow text-left text-text-secondary'>{t('appAnnotation.table.header.bulkExport')}</span>
+            <ChevronRight className='h-[14px] w-[14px] shrink-0 text-text-tertiary' />
+          </MenuButton>
+          <Transition
+            as={Fragment}
+            enter="transition ease-out duration-100"
+            enterFrom="transform opacity-0 scale-95"
+            enterTo="transform opacity-100 scale-100"
+            leave="transition ease-in duration-75"
+            leaveFrom="transform opacity-100 scale-100"
+            leaveTo="transform opacity-0 scale-95"
+          >
+            <MenuItems
+              className={cn(
+                'absolute left-1 top-[1px] z-10 min-w-[100px] origin-top-right -translate-x-full rounded-xl border-[0.5px] border-components-panel-on-panel-item-bg bg-components-panel-bg py-1 shadow-xs',
+              )}
+            >
+              <CSVDownloader
+                type={Type.Link}
+                filename={`annotations-${locale}`}
+                bom={true}
+                data={[
+                  locale !== LanguagesSupported[1] ? CSV_HEADER_QA_EN : CSV_HEADER_QA_CN,
+                  ...list.map(item => [item.question, item.answer]),
+                ]}
+              >
+                <button disabled={annotationUnavailable} className='mx-1 flex h-9 w-[calc(100%_-_8px)] cursor-pointer items-center space-x-2 rounded-lg px-3 py-2 hover:bg-components-panel-on-panel-item-bg-hover disabled:opacity-50'>
+                  <span className='system-sm-regular grow text-left text-text-secondary'>CSV</span>
+                </button>
+              </CSVDownloader>
+              <button disabled={annotationUnavailable} className={cn('mx-1 flex h-9 w-[calc(100%_-_8px)] cursor-pointer items-center space-x-2 rounded-lg px-3 py-2 hover:bg-components-panel-on-panel-item-bg-hover disabled:opacity-50', '!border-0')} onClick={JSONLOutput}>
+                <span className='system-sm-regular grow text-left text-text-secondary'>JSONL</span>
+              </button>
+            </MenuItems>
+          </Transition>
+        </Menu>
+      </div>
+    )
+  }
+
+  const [showAddModal, setShowAddModal] = React.useState(false)
+
+  return (
+    <div className='flex space-x-2'>
+      <Button variant='primary' onClick={() => setShowAddModal(true)}>
+        <RiAddLine className='mr-0.5 h-4 w-4' />
+        <div>{t('appAnnotation.table.header.addAnnotation')}</div>
+      </Button>
+      <CustomPopover
+        htmlContent={<Operations />}
+        position="br"
+        trigger="click"
+        btnElement={
+          <Button variant='secondary' className='w-8 p-0'>
+            <RiMoreFill className='h-4 w-4' />
+          </Button>
+        }
+        btnClassName='p-0 border-0'
+        className={'!z-20 h-fit !w-[155px]'}
+        popupClassName='!w-full !overflow-visible'
+        manualClose
+      />
+      {showAddModal && (
+        <AddAnnotationModal
+          isShow={showAddModal}
+          onHide={() => setShowAddModal(false)}
+          onAdd={onAdd}
+        />
+      )}
+
+      {
+        showBulkImportModal && (
+          <BatchAddModal
+            appId={appId}
+            isShow={showBulkImportModal}
+            onCancel={() => setShowBulkImportModal(false)}
+            onAdded={onAdded}
+          />
+        )
+      }
+    </div>
+  )
+}
+export default React.memo(HeaderOptions)
diff --git a/app/components/app/annotation/index.tsx b/app/components/app/annotation/index.tsx
new file mode 100644
index 0000000..f010f5f
--- /dev/null
+++ b/app/components/app/annotation/index.tsx
@@ -0,0 +1,287 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useDebounce } from 'ahooks'
+import { RiEqualizer2Line } from '@remixicon/react'
+import Toast from '../../base/toast'
+import Filter from './filter'
+import type { QueryParam } from './filter'
+import List from './list'
+import EmptyElement from './empty-element'
+import HeaderOpts from './header-opts'
+import { AnnotationEnableStatus, type AnnotationItem, type AnnotationItemBasic, JobStatus } from './type'
+import ViewAnnotationModal from './view-annotation-modal'
+import { MessageFast } from '@/app/components/base/icons/src/vender/solid/communication'
+import ActionButton from '@/app/components/base/action-button'
+import Pagination from '@/app/components/base/pagination'
+import Switch from '@/app/components/base/switch'
+import { addAnnotation, delAnnotation, fetchAnnotationConfig as doFetchAnnotationConfig, editAnnotation, fetchAnnotationList, queryAnnotationJobStatus, updateAnnotationScore, updateAnnotationStatus } from '@/service/annotation'
+import Loading from '@/app/components/base/loading'
+import { APP_PAGE_LIMIT } from '@/config'
+import ConfigParamModal from '@/app/components/base/features/new-feature-panel/annotation-reply/config-param-modal'
+import type { AnnotationReplyConfig } from '@/models/debug'
+import { sleep } from '@/utils'
+import { useProviderContext } from '@/context/provider-context'
+import AnnotationFullModal from '@/app/components/billing/annotation-full/modal'
+import type { App } from '@/types/app'
+import cn from '@/utils/classnames'
+
+type Props = {
+  appDetail: App
+}
+
+const Annotation: FC<Props> = ({
+  appDetail,
+}) => {
+  const { t } = useTranslation()
+  const [isShowEdit, setIsShowEdit] = React.useState(false)
+  const [annotationConfig, setAnnotationConfig] = useState<AnnotationReplyConfig | null>(null)
+  const [isChatApp, setIsChatApp] = useState(false)
+
+  const fetchAnnotationConfig = async () => {
+    const res = await doFetchAnnotationConfig(appDetail.id)
+    setAnnotationConfig(res as AnnotationReplyConfig)
+    return (res as AnnotationReplyConfig).id
+  }
+  useEffect(() => {
+    const isChatApp = appDetail.mode !== 'completion'
+    setIsChatApp(isChatApp)
+    if (isChatApp)
+      fetchAnnotationConfig()
+  }, [])
+  const [controlRefreshSwitch, setControlRefreshSwitch] = useState(Date.now())
+  const { plan, enableBilling } = useProviderContext()
+  const isAnnotationFull = (enableBilling && plan.usage.annotatedResponse >= plan.total.annotatedResponse)
+  const [isShowAnnotationFullModal, setIsShowAnnotationFullModal] = useState(false)
+  const ensureJobCompleted = async (jobId: string, status: AnnotationEnableStatus) => {
+    let isCompleted = false
+    while (!isCompleted) {
+      const res: any = await queryAnnotationJobStatus(appDetail.id, status, jobId)
+      isCompleted = res.job_status === JobStatus.completed
+      if (isCompleted)
+        break
+
+      await sleep(2000)
+    }
+  }
+
+  const [queryParams, setQueryParams] = useState<QueryParam>({})
+  const [currPage, setCurrPage] = React.useState<number>(0)
+  const debouncedQueryParams = useDebounce(queryParams, { wait: 500 })
+  const [limit, setLimit] = React.useState<number>(APP_PAGE_LIMIT)
+  const query = {
+    page: currPage + 1,
+    limit,
+    keyword: debouncedQueryParams.keyword || '',
+  }
+
+  const [controlUpdateList, setControlUpdateList] = useState(Date.now())
+  const [list, setList] = useState<AnnotationItem[]>([])
+  const [total, setTotal] = useState(10)
+  const [isLoading, setIsLoading] = useState(false)
+  const fetchList = async (page = 1) => {
+    setIsLoading(true)
+    try {
+      const { data, total }: any = await fetchAnnotationList(appDetail.id, {
+        ...query,
+        page,
+      })
+      setList(data as AnnotationItem[])
+      setTotal(total)
+    }
+    catch {
+
+    }
+    setIsLoading(false)
+  }
+
+  useEffect(() => {
+    fetchList(currPage + 1)
+  }, [currPage])
+
+  useEffect(() => {
+    fetchList(1)
+    setControlUpdateList(Date.now())
+  }, [queryParams])
+
+  const handleAdd = async (payload: AnnotationItemBasic) => {
+    await addAnnotation(appDetail.id, {
+      ...payload,
+    })
+    Toast.notify({
+      message: t('common.api.actionSuccess'),
+      type: 'success',
+    })
+    fetchList()
+    setControlUpdateList(Date.now())
+  }
+
+  const handleRemove = async (id: string) => {
+    await delAnnotation(appDetail.id, id)
+    Toast.notify({
+      message: t('common.api.actionSuccess'),
+      type: 'success',
+    })
+    fetchList()
+    setControlUpdateList(Date.now())
+  }
+
+  const [currItem, setCurrItem] = useState<AnnotationItem | null>(list[0])
+  const [isShowViewModal, setIsShowViewModal] = useState(false)
+  useEffect(() => {
+    if (!isShowEdit)
+      setControlRefreshSwitch(Date.now())
+  }, [isShowEdit])
+  const handleView = (item: AnnotationItem) => {
+    setCurrItem(item)
+    setIsShowViewModal(true)
+  }
+
+  const handleSave = async (question: string, answer: string) => {
+    await editAnnotation(appDetail.id, (currItem as AnnotationItem).id, {
+      question,
+      answer,
+    })
+    Toast.notify({
+      message: t('common.api.actionSuccess'),
+      type: 'success',
+    })
+    fetchList()
+    setControlUpdateList(Date.now())
+  }
+
+  return (
+    <div className='flex h-full flex-col'>
+      <p className='system-sm-regular text-text-tertiary'>{t('appLog.description')}</p>
+      <div className='flex flex-1 flex-col py-4'>
+        <Filter appId={appDetail.id} queryParams={queryParams} setQueryParams={setQueryParams}>
+          <div className='flex items-center space-x-2'>
+            {isChatApp && (
+              <>
+                <div className={cn(!annotationConfig?.enabled && 'pr-2', 'flex h-7 items-center space-x-1 rounded-lg border border-components-panel-border bg-components-panel-bg-blur pl-2')}>
+                  <MessageFast className='h-4 w-4 text-util-colors-indigo-indigo-600' />
+                  <div className='system-sm-medium text-text-primary'>{t('appAnnotation.name')}</div>
+                  <Switch
+                    key={controlRefreshSwitch}
+                    defaultValue={annotationConfig?.enabled}
+                    size='md'
+                    onChange={async (value) => {
+                      if (value) {
+                        if (isAnnotationFull) {
+                          setIsShowAnnotationFullModal(true)
+                          setControlRefreshSwitch(Date.now())
+                          return
+                        }
+                        setIsShowEdit(true)
+                      }
+                      else {
+                        const { job_id: jobId }: any = await updateAnnotationStatus(appDetail.id, AnnotationEnableStatus.disable, annotationConfig?.embedding_model, annotationConfig?.score_threshold)
+                        await ensureJobCompleted(jobId, AnnotationEnableStatus.disable)
+                        await fetchAnnotationConfig()
+                        Toast.notify({
+                          message: t('common.api.actionSuccess'),
+                          type: 'success',
+                        })
+                      }
+                    }}
+                  ></Switch>
+                  {annotationConfig?.enabled && (
+                    <div className='flex items-center pl-1.5'>
+                      <div className='mr-1 h-3.5 w-[1px] shrink-0 bg-divider-subtle'></div>
+                      <ActionButton onClick={() => setIsShowEdit(true)}>
+                        <RiEqualizer2Line className='h-4 w-4 text-text-tertiary' />
+                      </ActionButton>
+                    </div>
+                  )}
+                </div>
+                <div className='mx-3 h-3.5 w-[1px] shrink-0 bg-divider-regular'></div>
+              </>
+            )}
+
+            <HeaderOpts
+              appId={appDetail.id}
+              controlUpdateList={controlUpdateList}
+              onAdd={handleAdd}
+              onAdded={() => {
+                fetchList()
+              }}
+            />
+          </div>
+        </Filter>
+        {isLoading
+          ? <Loading type='app' />
+          : total > 0
+            ? <List
+              list={list}
+              onRemove={handleRemove}
+              onView={handleView}
+            />
+            : <div className='flex h-full grow items-center justify-center'><EmptyElement /></div>
+        }
+        {/* Show Pagination only if the total is more than the limit */}
+        {(total && total > APP_PAGE_LIMIT)
+          ? <Pagination
+            current={currPage}
+            onChange={setCurrPage}
+            total={total}
+            limit={limit}
+            onLimitChange={setLimit}
+          />
+          : null}
+
+        {isShowViewModal && (
+          <ViewAnnotationModal
+            appId={appDetail.id}
+            isShow={isShowViewModal}
+            onHide={() => setIsShowViewModal(false)}
+            onRemove={async () => {
+              await handleRemove((currItem as AnnotationItem)?.id)
+            }}
+            item={currItem as AnnotationItem}
+            onSave={handleSave}
+          />
+        )}
+        {isShowEdit && (
+          <ConfigParamModal
+            appId={appDetail.id}
+            isShow
+            isInit={!annotationConfig?.enabled}
+            onHide={() => {
+              setIsShowEdit(false)
+            }}
+            onSave={async (embeddingModel, score) => {
+              if (
+                embeddingModel.embedding_model_name !== annotationConfig?.embedding_model?.embedding_model_name
+                || embeddingModel.embedding_provider_name !== annotationConfig?.embedding_model?.embedding_provider_name
+              ) {
+                const { job_id: jobId }: any = await updateAnnotationStatus(appDetail.id, AnnotationEnableStatus.enable, embeddingModel, score)
+                await ensureJobCompleted(jobId, AnnotationEnableStatus.enable)
+              }
+              const annotationId = await fetchAnnotationConfig()
+              if (score !== annotationConfig?.score_threshold)
+                await updateAnnotationScore(appDetail.id, annotationId, score)
+
+              await fetchAnnotationConfig()
+              Toast.notify({
+                message: t('common.api.actionSuccess'),
+                type: 'success',
+              })
+              setIsShowEdit(false)
+            }}
+            annotationConfig={annotationConfig!}
+          />
+        )}
+        {
+          isShowAnnotationFullModal && (
+            <AnnotationFullModal
+              show={isShowAnnotationFullModal}
+              onHide={() => setIsShowAnnotationFullModal(false)}
+            />
+          )
+        }
+      </div>
+    </div>
+  )
+}
+export default React.memo(Annotation)
diff --git a/app/components/app/annotation/list.tsx b/app/components/app/annotation/list.tsx
new file mode 100644
index 0000000..319f099
--- /dev/null
+++ b/app/components/app/annotation/list.tsx
@@ -0,0 +1,91 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiDeleteBinLine, RiEditLine } from '@remixicon/react'
+import type { AnnotationItem } from './type'
+import RemoveAnnotationConfirmModal from './remove-annotation-confirm-modal'
+import ActionButton from '@/app/components/base/action-button'
+import useTimestamp from '@/hooks/use-timestamp'
+import cn from '@/utils/classnames'
+
+type Props = {
+  list: AnnotationItem[]
+  onRemove: (id: string) => void
+  onView: (item: AnnotationItem) => void
+}
+
+const List: FC<Props> = ({
+  list,
+  onView,
+  onRemove,
+}) => {
+  const { t } = useTranslation()
+  const { formatTime } = useTimestamp()
+  const [currId, setCurrId] = React.useState<string | null>(null)
+  const [showConfirmDelete, setShowConfirmDelete] = React.useState(false)
+  return (
+    <div className='overflow-x-auto'>
+      <table className={cn('mt-2 w-full min-w-[440px] border-collapse border-0')}>
+        <thead className='system-xs-medium-uppercase text-text-tertiary'>
+          <tr>
+            <td className='w-5 whitespace-nowrap rounded-l-lg bg-background-section-burn pl-2 pr-1'>{t('appAnnotation.table.header.question')}</td>
+            <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appAnnotation.table.header.answer')}</td>
+            <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appAnnotation.table.header.createdAt')}</td>
+            <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appAnnotation.table.header.hits')}</td>
+            <td className='w-[96px] whitespace-nowrap rounded-r-lg bg-background-section-burn py-1.5 pl-3'>{t('appAnnotation.table.header.actions')}</td>
+          </tr>
+        </thead>
+        <tbody className="system-sm-regular text-text-secondary">
+          {list.map(item => (
+            <tr
+              key={item.id}
+              className='cursor-pointer border-b border-divider-subtle hover:bg-background-default-hover'
+              onClick={
+                () => {
+                  onView(item)
+                }
+              }
+            >
+              <td
+                className='max-w-[250px] overflow-hidden text-ellipsis whitespace-nowrap p-3 pr-2'
+                title={item.question}
+              >{item.question}</td>
+              <td
+                className='max-w-[250px] overflow-hidden text-ellipsis whitespace-nowrap p-3 pr-2'
+                title={item.answer}
+              >{item.answer}</td>
+              <td className='p-3 pr-2'>{formatTime(item.created_at, t('appLog.dateTimeFormat') as string)}</td>
+              <td className='p-3 pr-2'>{item.hit_count}</td>
+              <td className='w-[96px] p-3 pr-2' onClick={e => e.stopPropagation()}>
+                {/* Actions */}
+                <div className='flex space-x-1 text-text-tertiary'>
+                  <ActionButton onClick={() => onView(item)}>
+                    <RiEditLine className='h-4 w-4' />
+                  </ActionButton>
+                  <ActionButton
+                    onClick={() => {
+                      setCurrId(item.id)
+                      setShowConfirmDelete(true)
+                    }}
+                  >
+                    <RiDeleteBinLine className='h-4 w-4' />
+                  </ActionButton>
+                </div>
+              </td>
+            </tr>
+          ))}
+        </tbody>
+      </table>
+      <RemoveAnnotationConfirmModal
+        isShow={showConfirmDelete}
+        onHide={() => setShowConfirmDelete(false)}
+        onRemove={() => {
+          onRemove(currId as string)
+          setShowConfirmDelete(false)
+        }}
+      />
+    </div>
+  )
+}
+export default React.memo(List)
diff --git a/app/components/app/annotation/remove-annotation-confirm-modal/index.tsx b/app/components/app/annotation/remove-annotation-confirm-modal/index.tsx
new file mode 100644
index 0000000..a6ade49
--- /dev/null
+++ b/app/components/app/annotation/remove-annotation-confirm-modal/index.tsx
@@ -0,0 +1,29 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import Confirm from '@/app/components/base/confirm'
+
+type Props = {
+  isShow: boolean
+  onHide: () => void
+  onRemove: () => void
+}
+
+const RemoveAnnotationConfirmModal: FC<Props> = ({
+  isShow,
+  onHide,
+  onRemove,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <Confirm
+      isShow={isShow}
+      onCancel={onHide}
+      onConfirm={onRemove}
+      title={t('appDebug.feature.annotation.removeConfirm')}
+    />
+  )
+}
+export default React.memo(RemoveAnnotationConfirmModal)
diff --git a/app/components/app/annotation/type.ts b/app/components/app/annotation/type.ts
new file mode 100644
index 0000000..5df6f51
--- /dev/null
+++ b/app/components/app/annotation/type.ts
@@ -0,0 +1,39 @@
+export type AnnotationItemBasic = {
+  message_id?: string
+  question: string
+  answer: string
+}
+
+export type AnnotationItem = {
+  id: string
+  question: string
+  answer: string
+  created_at: number
+  hit_count: number
+}
+
+export type HitHistoryItem = {
+  id: string
+  question: string
+  match: string
+  response: string
+  source: string
+  score: number
+  created_at: number
+}
+
+export type EmbeddingModelConfig = {
+  embedding_provider_name: string
+  embedding_model_name: string
+}
+
+export enum AnnotationEnableStatus {
+  enable = 'enable',
+  disable = 'disable',
+}
+
+export enum JobStatus {
+  waiting = 'waiting',
+  processing = 'processing',
+  completed = 'completed',
+}
diff --git a/app/components/app/annotation/view-annotation-modal/hit-history-no-data.tsx b/app/components/app/annotation/view-annotation-modal/hit-history-no-data.tsx
new file mode 100644
index 0000000..ae4eb67
--- /dev/null
+++ b/app/components/app/annotation/view-annotation-modal/hit-history-no-data.tsx
@@ -0,0 +1,19 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { ClockFastForward } from '@/app/components/base/icons/src/vender/line/time'
+
+const HitHistoryNoData: FC = () => {
+  const { t } = useTranslation()
+  return (
+    <div className='mx-auto mt-20 w-[480px] space-y-2 rounded-2xl bg-background-section-burn p-5'>
+      <div className='inline-block rounded-lg border border-divider-subtle p-3'>
+        <ClockFastForward className='h-5 w-5 text-text-tertiary' />
+      </div>
+      <div className='system-sm-regular text-text-tertiary'>{t('appAnnotation.viewModal.noHitHistory')}</div>
+    </div>
+  )
+}
+
+export default React.memo(HitHistoryNoData)
diff --git a/app/components/app/annotation/view-annotation-modal/index.tsx b/app/components/app/annotation/view-annotation-modal/index.tsx
new file mode 100644
index 0000000..08904d2
--- /dev/null
+++ b/app/components/app/annotation/view-annotation-modal/index.tsx
@@ -0,0 +1,215 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import EditItem, { EditItemType } from '../edit-annotation-modal/edit-item'
+import type { AnnotationItem, HitHistoryItem } from '../type'
+import HitHistoryNoData from './hit-history-no-data'
+import Badge from '@/app/components/base/badge'
+import Drawer from '@/app/components/base/drawer-plus'
+import Pagination from '@/app/components/base/pagination'
+import { MessageCheckRemove } from '@/app/components/base/icons/src/vender/line/communication'
+import Confirm from '@/app/components/base/confirm'
+import TabSlider from '@/app/components/base/tab-slider-plain'
+import { fetchHitHistoryList } from '@/service/annotation'
+import { APP_PAGE_LIMIT } from '@/config'
+import useTimestamp from '@/hooks/use-timestamp'
+import cn from '@/utils/classnames'
+
+type Props = {
+  appId: string
+  isShow: boolean
+  onHide: () => void
+  item: AnnotationItem
+  onSave: (editedQuery: string, editedAnswer: string) => void
+  onRemove: () => void
+}
+
+enum TabType {
+  annotation = 'annotation',
+  hitHistory = 'hitHistory',
+}
+
+const ViewAnnotationModal: FC<Props> = ({
+  appId,
+  isShow,
+  onHide,
+  item,
+  onSave,
+  onRemove,
+}) => {
+  const { id, question, answer, created_at: createdAt } = item
+  const [newQuestion, setNewQuery] = useState(question)
+  const [newAnswer, setNewAnswer] = useState(answer)
+  const { t } = useTranslation()
+  const { formatTime } = useTimestamp()
+  const [currPage, setCurrPage] = React.useState<number>(0)
+  const [total, setTotal] = useState(0)
+  const [hitHistoryList, setHitHistoryList] = useState<HitHistoryItem[]>([])
+  const fetchHitHistory = async (page = 1) => {
+    try {
+      const { data, total }: any = await fetchHitHistoryList(appId, id, {
+        page,
+        limit: 10,
+      })
+      setHitHistoryList(data as HitHistoryItem[])
+      setTotal(total)
+    }
+    catch {
+    }
+  }
+
+  useEffect(() => {
+    fetchHitHistory(currPage + 1)
+  }, [currPage])
+
+  const tabs = [
+    { value: TabType.annotation, text: t('appAnnotation.viewModal.annotatedResponse') },
+    {
+      value: TabType.hitHistory,
+      text: (
+        hitHistoryList.length > 0
+          ? (
+            <div className='flex items-center space-x-1'>
+              <div>{t('appAnnotation.viewModal.hitHistory')}</div>
+              <Badge
+                text={`${total} ${t(`appAnnotation.viewModal.hit${hitHistoryList.length > 1 ? 's' : ''}`)}`}
+              />
+            </div>
+          )
+          : t('appAnnotation.viewModal.hitHistory')
+      ),
+    },
+  ]
+  const [activeTab, setActiveTab] = useState(TabType.annotation)
+  const handleSave = (type: EditItemType, editedContent: string) => {
+    if (type === EditItemType.Query) {
+      setNewQuery(editedContent)
+      onSave(editedContent, newAnswer)
+    }
+    else {
+      setNewAnswer(editedContent)
+      onSave(newQuestion, editedContent)
+    }
+  }
+  const [showModal, setShowModal] = useState(false)
+
+  const annotationTab = (
+    <>
+      <EditItem
+        type={EditItemType.Query}
+        content={question}
+        onSave={editedContent => handleSave(EditItemType.Query, editedContent)}
+      />
+      <EditItem
+        type={EditItemType.Answer}
+        content={answer}
+        onSave={editedContent => handleSave(EditItemType.Answer, editedContent)}
+      />
+    </>
+  )
+
+  const hitHistoryTab = total === 0
+    ? (<HitHistoryNoData />)
+    : (
+      <div>
+        <table className={cn('w-full min-w-[440px] border-collapse border-0')} >
+          <thead className="system-xs-medium-uppercase text-text-tertiary">
+            <tr>
+              <td className='w-5 whitespace-nowrap rounded-l-lg bg-background-section-burn pl-2 pr-1'>{t('appAnnotation.hitHistoryTable.query')}</td>
+              <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appAnnotation.hitHistoryTable.match')}</td>
+              <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appAnnotation.hitHistoryTable.response')}</td>
+              <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appAnnotation.hitHistoryTable.source')}</td>
+              <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appAnnotation.hitHistoryTable.score')}</td>
+              <td className='w-[160px] whitespace-nowrap rounded-r-lg bg-background-section-burn py-1.5 pl-3'>{t('appAnnotation.hitHistoryTable.time')}</td>
+            </tr>
+          </thead>
+          <tbody className="system-sm-regular text-text-secondary">
+            {hitHistoryList.map(item => (
+              <tr
+                key={item.id}
+                className={'cursor-pointer border-b border-divider-subtle hover:bg-background-default-hover'}
+              >
+                <td
+                  className='max-w-[250px] overflow-hidden text-ellipsis whitespace-nowrap p-3 pr-2'
+                  title={item.question}
+                >{item.question}</td>
+                <td
+                  className='max-w-[250px] overflow-hidden text-ellipsis whitespace-nowrap p-3 pr-2'
+                  title={item.match}
+                >{item.match}</td>
+                <td
+                  className='max-w-[250px] overflow-hidden text-ellipsis whitespace-nowrap p-3 pr-2'
+                  title={item.response}
+                >{item.response}</td>
+                <td className='p-3 pr-2'>{item.source}</td>
+                <td className='p-3 pr-2'>{item.score ? item.score.toFixed(2) : '-'}</td>
+                <td className='p-3 pr-2'>{formatTime(item.created_at, t('appLog.dateTimeFormat') as string)}</td>
+              </tr>
+            ))}
+          </tbody>
+        </table>
+        {(total && total > APP_PAGE_LIMIT)
+          ? <Pagination
+            className='px-0'
+            current={currPage}
+            onChange={setCurrPage}
+            total={total}
+          />
+          : null}
+      </div>
+
+    )
+  return (
+    <div>
+      <Drawer
+        isShow={isShow}
+        onHide={onHide}
+        maxWidthClassName='!max-w-[800px]'
+        title={
+          <TabSlider
+            className='relative top-[9px] shrink-0'
+            value={activeTab}
+            onChange={v => setActiveTab(v as TabType)}
+            options={tabs}
+            noBorderBottom
+            itemClassName='!pb-3.5'
+          />
+        }
+        body={(
+          <div>
+            <div className='space-y-6 p-6 pb-4'>
+              {activeTab === TabType.annotation ? annotationTab : hitHistoryTab}
+            </div>
+            <Confirm
+              isShow={showModal}
+              onCancel={() => setShowModal(false)}
+              onConfirm={async () => {
+                await onRemove()
+                setShowModal(false)
+                onHide()
+              }}
+              title={t('appDebug.feature.annotation.removeConfirm')}
+            />
+          </div>
+        )}
+        foot={id
+          ? (
+            <div className='system-sm-medium flex h-16 items-center justify-between rounded-bl-xl rounded-br-xl border-t border-divider-subtle bg-background-section-burn px-4 text-text-tertiary'>
+              <div
+                className='flex cursor-pointer items-center space-x-2 pl-3'
+                onClick={() => setShowModal(true)}
+              >
+                <MessageCheckRemove />
+                <div>{t('appAnnotation.editModal.removeThisCache')}</div>
+              </div>
+              <div>{t('appAnnotation.editModal.createdAt')}&nbsp;{formatTime(createdAt, t('appLog.dateTimeFormat') as string)}</div>
+            </div>
+          )
+          : undefined}
+      />
+    </div>
+
+  )
+}
+export default React.memo(ViewAnnotationModal)
diff --git a/app/components/app/app-publisher/features-wrapper.tsx b/app/components/app/app-publisher/features-wrapper.tsx
new file mode 100644
index 0000000..dadd112
--- /dev/null
+++ b/app/components/app/app-publisher/features-wrapper.tsx
@@ -0,0 +1,86 @@
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import type { AppPublisherProps } from '@/app/components/app/app-publisher'
+import Confirm from '@/app/components/base/confirm'
+import AppPublisher from '@/app/components/app/app-publisher'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import type { ModelAndParameter } from '@/app/components/app/configuration/debug/types'
+import type { FileUpload } from '@/app/components/base/features/types'
+import { Resolution } from '@/types/app'
+import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'
+import { SupportUploadFileTypes } from '@/app/components/workflow/types'
+
+type Props = Omit<AppPublisherProps, 'onPublish'> & {
+  onPublish?: (modelAndParameter?: ModelAndParameter, features?: any) => Promise<any> | any
+  publishedConfig?: any
+  resetAppConfig?: () => void
+}
+
+const FeaturesWrappedAppPublisher = (props: Props) => {
+  const { t } = useTranslation()
+  const features = useFeatures(s => s.features)
+  const featuresStore = useFeaturesStore()
+  const [restoreConfirmOpen, setRestoreConfirmOpen] = useState(false)
+  const handleConfirm = useCallback(() => {
+    props.resetAppConfig?.()
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+    const newFeatures = produce(features, (draft) => {
+      draft.moreLikeThis = props.publishedConfig.modelConfig.more_like_this || { enabled: false }
+      draft.opening = {
+        enabled: !!props.publishedConfig.modelConfig.opening_statement,
+        opening_statement: props.publishedConfig.modelConfig.opening_statement || '',
+        suggested_questions: props.publishedConfig.modelConfig.suggested_questions || [],
+      }
+      draft.moderation = props.publishedConfig.modelConfig.sensitive_word_avoidance || { enabled: false }
+      draft.speech2text = props.publishedConfig.modelConfig.speech_to_text || { enabled: false }
+      draft.text2speech = props.publishedConfig.modelConfig.text_to_speech || { enabled: false }
+      draft.suggested = props.publishedConfig.modelConfig.suggested_questions_after_answer || { enabled: false }
+      draft.citation = props.publishedConfig.modelConfig.retriever_resource || { enabled: false }
+      draft.annotationReply = props.publishedConfig.modelConfig.annotation_reply || { enabled: false }
+      draft.file = {
+        image: {
+          detail: props.publishedConfig.modelConfig.file_upload?.image?.detail || Resolution.high,
+          enabled: !!props.publishedConfig.modelConfig.file_upload?.image?.enabled,
+          number_limits: props.publishedConfig.modelConfig.file_upload?.image?.number_limits || 3,
+          transfer_methods: props.publishedConfig.modelConfig.file_upload?.image?.transfer_methods || ['local_file', 'remote_url'],
+        },
+        enabled: !!(props.publishedConfig.modelConfig.file_upload?.enabled || props.publishedConfig.modelConfig.file_upload?.image?.enabled),
+        allowed_file_types: props.publishedConfig.modelConfig.file_upload?.allowed_file_types || [SupportUploadFileTypes.image],
+        allowed_file_extensions: props.publishedConfig.modelConfig.file_upload?.allowed_file_extensions || FILE_EXTS[SupportUploadFileTypes.image].map(ext => `.${ext}`),
+        allowed_file_upload_methods: props.publishedConfig.modelConfig.file_upload?.allowed_file_upload_methods || props.publishedConfig.modelConfig.file_upload?.image?.transfer_methods || ['local_file', 'remote_url'],
+        number_limits: props.publishedConfig.modelConfig.file_upload?.number_limits || props.publishedConfig.modelConfig.file_upload?.image?.number_limits || 3,
+      } as FileUpload
+    })
+    setFeatures(newFeatures)
+    setRestoreConfirmOpen(false)
+  }, [featuresStore, props])
+
+  const handlePublish = useCallback((modelAndParameter?: ModelAndParameter) => {
+    return props.onPublish?.(modelAndParameter, features)
+  }, [features, props])
+
+  return (
+    <>
+      <AppPublisher {...{
+        ...props,
+        onPublish: handlePublish,
+        onRestore: () => setRestoreConfirmOpen(true),
+      }}/>
+      {restoreConfirmOpen && (
+        <Confirm
+          title={t('appDebug.resetConfig.title')}
+          content={t('appDebug.resetConfig.message')}
+          isShow={restoreConfirmOpen}
+          onConfirm={handleConfirm}
+          onCancel={() => setRestoreConfirmOpen(false)}
+        />
+      )}
+    </>
+  )
+}
+
+export default FeaturesWrappedAppPublisher
diff --git a/app/components/app/app-publisher/index.tsx b/app/components/app/app-publisher/index.tsx
new file mode 100644
index 0000000..1214483
--- /dev/null
+++ b/app/components/app/app-publisher/index.tsx
@@ -0,0 +1,304 @@
+import {
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import dayjs from 'dayjs'
+import {
+  RiArrowDownSLine,
+  RiPlanetLine,
+  RiPlayCircleLine,
+  RiPlayList2Line,
+  RiTerminalBoxLine,
+} from '@remixicon/react'
+import { useKeyPress } from 'ahooks'
+import Toast from '../../base/toast'
+import type { ModelAndParameter } from '../configuration/debug/types'
+import { getKeyboardKeyCodeBySystem } from '../../workflow/utils'
+import SuggestedAction from './suggested-action'
+import PublishWithMultipleModel from './publish-with-multiple-model'
+import Button from '@/app/components/base/button'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { WEB_PREFIX } from '@/config'
+import { fetchInstalledAppList } from '@/service/explore'
+import EmbeddedModal from '@/app/components/app/overview/embedded'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { useGetLanguage } from '@/context/i18n'
+import { CodeBrowser } from '@/app/components/base/icons/src/vender/line/development'
+import WorkflowToolConfigureButton from '@/app/components/tools/workflow-tool/configure-button'
+import type { InputVar } from '@/app/components/workflow/types'
+import { appDefaultIconBackground } from '@/config'
+import type { PublishWorkflowParams } from '@/types/workflow'
+
+export type AppPublisherProps = {
+  disabled?: boolean
+  publishDisabled?: boolean
+  publishedAt?: number
+  /** only needed in workflow / chatflow mode */
+  draftUpdatedAt?: number
+  debugWithMultipleModel?: boolean
+  multipleModelConfigs?: ModelAndParameter[]
+  /** modelAndParameter is passed when debugWithMultipleModel is true */
+  onPublish?: (params?: any) => Promise<any> | any
+  onRestore?: () => Promise<any> | any
+  onToggle?: (state: boolean) => void
+  crossAxisOffset?: number
+  toolPublished?: boolean
+  inputs?: InputVar[]
+  onRefreshData?: () => void
+}
+
+const PUBLISH_SHORTCUT = ['鈱�', '鈬�', 'P']
+
+const AppPublisher = ({
+  disabled = false,
+  publishDisabled = false,
+  publishedAt,
+  draftUpdatedAt,
+  debugWithMultipleModel = false,
+  multipleModelConfigs = [],
+  onPublish,
+  onRestore,
+  onToggle,
+  crossAxisOffset = 0,
+  toolPublished,
+  inputs,
+  onRefreshData,
+}: AppPublisherProps) => {
+  const { t } = useTranslation()
+  const [published, setPublished] = useState(false)
+  const [open, setOpen] = useState(false)
+  const appDetail = useAppStore(state => state.appDetail)
+  const { app_base_url: appBaseURL = '', access_token: accessToken = '' } = appDetail?.site ?? {}
+  const appMode = (appDetail?.mode !== 'completion' && appDetail?.mode !== 'workflow') ? 'chat' : appDetail.mode
+  const appURL = `${appBaseURL}/${appMode}/${accessToken}`
+  const isChatApp = ['chat', 'agent-chat', 'completion'].includes(appDetail?.mode || '')
+
+  const language = useGetLanguage()
+  const formatTimeFromNow = useCallback((time: number) => {
+    return dayjs(time).locale(language === 'zh_Hans' ? 'zh-cn' : language.replace('_', '-')).fromNow()
+  }, [language])
+
+  const handlePublish = useCallback(async (params?: ModelAndParameter | PublishWorkflowParams) => {
+    try {
+      await onPublish?.(params)
+      setPublished(true)
+    }
+    catch {
+      setPublished(false)
+    }
+  }, [onPublish])
+
+  const handleRestore = useCallback(async () => {
+    try {
+      await onRestore?.()
+      setOpen(false)
+    }
+    catch {}
+  }, [onRestore])
+
+  const handleTrigger = useCallback(() => {
+    const state = !open
+
+    if (disabled) {
+      setOpen(false)
+      return
+    }
+
+    onToggle?.(state)
+    setOpen(state)
+
+    if (state)
+      setPublished(false)
+  }, [disabled, onToggle, open])
+
+  const handleOpenInExplore = useCallback(async () => {
+    try {
+      const { installed_apps }: any = await fetchInstalledAppList(appDetail?.id) || {}
+      if (installed_apps?.length > 0)
+        window.open(`${WEB_PREFIX}/explore/installed/${installed_apps[0].id}`, '_blank')
+      else
+        throw new Error('No app found in Explore')
+    }
+    catch (e: any) {
+      Toast.notify({ type: 'error', message: `${e.message || e}` })
+    }
+  }, [appDetail?.id])
+
+  const [embeddingModalOpen, setEmbeddingModalOpen] = useState(false)
+
+  useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.shift.p`, (e) => {
+    e.preventDefault()
+    if (publishDisabled || published)
+      return
+    handlePublish()
+  },
+  { exactMatch: true, useCapture: true })
+
+  return (
+    <>
+      <PortalToFollowElem
+        open={open}
+        onOpenChange={setOpen}
+        placement='bottom-end'
+        offset={{
+          mainAxis: 4,
+          crossAxis: crossAxisOffset,
+        }}
+      >
+        <PortalToFollowElemTrigger onClick={handleTrigger}>
+          <Button
+            variant='primary'
+            className='p-2'
+            disabled={disabled}
+          >
+            {t('workflow.common.publish')}
+            <RiArrowDownSLine className='h-4 w-4 text-components-button-primary-text' />
+          </Button>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[11]'>
+          <div className='w-[320px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl shadow-shadow-shadow-5'>
+            <div className='p-4 pt-3'>
+              <div className='system-xs-medium-uppercase flex h-6 items-center text-text-tertiary'>
+                {publishedAt ? t('workflow.common.latestPublished') : t('workflow.common.currentDraftUnpublished')}
+              </div>
+              {publishedAt
+                ? (
+                  <div className='flex items-center justify-between'>
+                    <div className='system-sm-medium flex items-center text-text-secondary'>
+                      {t('workflow.common.publishedAt')} {formatTimeFromNow(publishedAt)}
+                    </div>
+                    {isChatApp && <Button
+                      variant='secondary-accent'
+                      size='small'
+                      onClick={handleRestore}
+                      disabled={published}
+                    >
+                      {t('workflow.common.restore')}
+                    </Button>}
+                  </div>
+                )
+                : (
+                  <div className='system-sm-medium flex items-center text-text-secondary'>
+                    {t('workflow.common.autoSaved')} 路 {Boolean(draftUpdatedAt) && formatTimeFromNow(draftUpdatedAt!)}
+                  </div>
+                )}
+              {debugWithMultipleModel
+                ? (
+                  <PublishWithMultipleModel
+                    multipleModelConfigs={multipleModelConfigs}
+                    onSelect={item => handlePublish(item)}
+                  // textGenerationModelList={textGenerationModelList}
+                  />
+                )
+                : (
+                  <Button
+                    variant='primary'
+                    className='mt-3 w-full'
+                    onClick={() => handlePublish()}
+                    disabled={publishDisabled || published}
+                  >
+                    {
+                      published
+                        ? t('workflow.common.published')
+                        : (
+                          <div className='flex gap-1'>
+                            <span>{t('workflow.common.publishUpdate')}</span>
+                            <div className='flex gap-0.5'>
+                              {PUBLISH_SHORTCUT.map(key => (
+                                <span key={key} className='system-kbd h-4 w-4 rounded-[4px] bg-components-kbd-bg-white text-text-primary-on-surface'>
+                                  {key}
+                                </span>
+                              ))}
+                            </div>
+                          </div>
+                        )
+                    }
+                  </Button>
+                )
+              }
+            </div>
+            <div className='border-t-[0.5px] border-t-divider-regular p-4 pt-3'>
+              <SuggestedAction
+                disabled={!publishedAt}
+                link={appURL}
+                icon={<RiPlayCircleLine className='h-4 w-4' />}
+              >
+                {t('workflow.common.runApp')}
+              </SuggestedAction>
+              {appDetail?.mode === 'workflow' || appDetail?.mode === 'completion'
+                ? (
+                  <SuggestedAction
+                    disabled={!publishedAt}
+                    link={`${appURL}${appURL.includes('?') ? '&' : '?'}mode=batch`}
+                    icon={<RiPlayList2Line className='h-4 w-4' />}
+                  >
+                    {t('workflow.common.batchRunApp')}
+                  </SuggestedAction>
+                )
+                : (
+                  <SuggestedAction
+                    onClick={() => {
+                      setEmbeddingModalOpen(true)
+                      handleTrigger()
+                    }}
+                    disabled={!publishedAt}
+                    icon={<CodeBrowser className='h-4 w-4' />}
+                  >
+                    {t('workflow.common.embedIntoSite')}
+                  </SuggestedAction>
+                )}
+              <SuggestedAction
+                onClick={() => {
+                  publishedAt && handleOpenInExplore()
+                }}
+                disabled={!publishedAt}
+                icon={<RiPlanetLine className='h-4 w-4' />}
+              >
+                {t('workflow.common.openInExplore')}
+              </SuggestedAction>
+              <SuggestedAction
+                disabled={!publishedAt}
+                link='./develop'
+                icon={<RiTerminalBoxLine className='h-4 w-4' />}
+              >
+                {t('workflow.common.accessAPIReference')}
+              </SuggestedAction>
+              {appDetail?.mode === 'workflow' && (
+                <WorkflowToolConfigureButton
+                  disabled={!publishedAt}
+                  published={!!toolPublished}
+                  detailNeedUpdate={!!toolPublished && published}
+                  workflowAppId={appDetail?.id}
+                  icon={{
+                    content: (appDetail.icon_type === 'image' ? '馃' : appDetail?.icon) || '馃',
+                    background: (appDetail.icon_type === 'image' ? appDefaultIconBackground : appDetail?.icon_background) || appDefaultIconBackground,
+                  }}
+                  name={appDetail?.name}
+                  description={appDetail?.description}
+                  inputs={inputs}
+                  handlePublish={handlePublish}
+                  onRefreshData={onRefreshData}
+                />
+              )}
+            </div>
+          </div>
+        </PortalToFollowElemContent>
+        <EmbeddedModal
+          siteInfo={appDetail?.site}
+          isShow={embeddingModalOpen}
+          onClose={() => setEmbeddingModalOpen(false)}
+          appBaseUrl={appBaseURL}
+          accessToken={accessToken}
+        />
+      </PortalToFollowElem >
+    </>
+  )
+}
+
+export default memo(AppPublisher)
diff --git a/app/components/app/app-publisher/publish-with-multiple-model.tsx b/app/components/app/app-publisher/publish-with-multiple-model.tsx
new file mode 100644
index 0000000..e376787
--- /dev/null
+++ b/app/components/app/app-publisher/publish-with-multiple-model.tsx
@@ -0,0 +1,108 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine } from '@remixicon/react'
+import type { ModelAndParameter } from '../configuration/debug/types'
+import ModelIcon from '../../header/account-setting/model-provider-page/model-icon'
+import Button from '@/app/components/base/button'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { useProviderContext } from '@/context/provider-context'
+import type { Model, ModelItem } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks'
+
+type PublishWithMultipleModelProps = {
+  multipleModelConfigs: ModelAndParameter[]
+  // textGenerationModelList?: Model[]
+  onSelect: (v: ModelAndParameter) => void
+}
+const PublishWithMultipleModel: FC<PublishWithMultipleModelProps> = ({
+  multipleModelConfigs,
+  // textGenerationModelList = [],
+  onSelect,
+}) => {
+  const { t } = useTranslation()
+  const language = useLanguage()
+  const { textGenerationModelList } = useProviderContext()
+  const [open, setOpen] = useState(false)
+
+  const validModelConfigs: (ModelAndParameter & { modelItem: ModelItem; providerItem: Model })[] = []
+
+  multipleModelConfigs.forEach((item) => {
+    const provider = textGenerationModelList.find(model => model.provider === item.provider)
+
+    if (provider) {
+      const model = provider.models.find(model => model.model === item.model)
+
+      if (model) {
+        validModelConfigs.push({
+          id: item.id,
+          model: item.model,
+          provider: item.provider,
+          modelItem: model,
+          providerItem: provider,
+          parameters: item.parameters,
+        })
+      }
+    }
+  })
+
+  const handleToggle = () => {
+    if (validModelConfigs.length)
+      setOpen(v => !v)
+  }
+
+  const handleSelect = (item: ModelAndParameter) => {
+    onSelect(item)
+    setOpen(false)
+  }
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+    >
+      <PortalToFollowElemTrigger className='w-full' onClick={handleToggle}>
+        <Button
+          variant='primary'
+          disabled={!validModelConfigs.length}
+          className='mt-3 w-full'
+        >
+          {t('appDebug.operation.applyConfig')}
+          <RiArrowDownSLine className='ml-0.5 h-3 w-3' />
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-50 mt-1 w-[288px]'>
+        <div className='rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg p-1 shadow-lg'>
+          <div className='flex h-[22px] items-center px-3 text-xs font-medium text-text-tertiary'>
+            {t('appDebug.publishAs')}
+          </div>
+          {
+            validModelConfigs.map((item, index) => (
+              <div
+                key={item.id}
+                className='flex h-8 cursor-pointer items-center rounded-lg px-3 text-sm text-text-tertiary hover:bg-state-base-hover'
+                onClick={() => handleSelect(item)}
+              >
+                <span className='min-w-[18px] italic'>#{index + 1}</span>
+                <ModelIcon modelName={item.model} provider={item.providerItem} className='ml-2' />
+                <div
+                  className='ml-1 truncate text-text-secondary'
+                  title={item.modelItem.label[language]}
+                >
+                  {item.modelItem.label[language]}
+                </div>
+              </div>
+            ))
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default PublishWithMultipleModel
diff --git a/app/components/app/app-publisher/suggested-action.tsx b/app/components/app/app-publisher/suggested-action.tsx
new file mode 100644
index 0000000..388fb8b
--- /dev/null
+++ b/app/components/app/app-publisher/suggested-action.tsx
@@ -0,0 +1,29 @@
+import type { HTMLProps, PropsWithChildren } from 'react'
+import { RiArrowRightUpLine } from '@remixicon/react'
+import classNames from '@/utils/classnames'
+
+export type SuggestedActionProps = PropsWithChildren<HTMLProps<HTMLAnchorElement> & {
+  icon?: React.ReactNode
+  link?: string
+  disabled?: boolean
+}>
+
+const SuggestedAction = ({ icon, link, disabled, children, className, ...props }: SuggestedActionProps) => (
+  <a
+    href={disabled ? undefined : link}
+    target='_blank'
+    rel='noreferrer'
+    className={classNames(
+      'flex justify-start items-center gap-2 py-2 px-2.5 bg-background-section-burn rounded-lg transition-colors [&:not(:first-child)]:mt-1',
+      disabled ? 'shadow-xs opacity-30 cursor-not-allowed' : 'text-text-secondary hover:bg-state-accent-hover hover:text-text-accent cursor-pointer',
+      className,
+    )}
+    {...props}
+  >
+    <div className='relative h-4 w-4'>{icon}</div>
+    <div className='system-sm-medium shrink grow basis-0'>{children}</div>
+    <RiArrowRightUpLine className='h-3.5 w-3.5' />
+  </a>
+)
+
+export default SuggestedAction
diff --git a/app/components/app/app-publisher/version-info-modal.tsx b/app/components/app/app-publisher/version-info-modal.tsx
new file mode 100644
index 0000000..4d5d370
--- /dev/null
+++ b/app/components/app/app-publisher/version-info-modal.tsx
@@ -0,0 +1,112 @@
+import React, { type FC, useCallback, useState } from 'react'
+import Modal from '@/app/components/base/modal'
+import type { VersionHistory } from '@/types/workflow'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import Input from '../../base/input'
+import Textarea from '../../base/textarea'
+import Button from '../../base/button'
+import Toast from '@/app/components/base/toast'
+
+type VersionInfoModalProps = {
+  isOpen: boolean
+  versionInfo?: VersionHistory
+  onClose: () => void
+  onPublish: (params: { title: string; releaseNotes: string; id?: string }) => void
+}
+
+const TITLE_MAX_LENGTH = 15
+const RELEASE_NOTES_MAX_LENGTH = 100
+
+const VersionInfoModal: FC<VersionInfoModalProps> = ({
+  isOpen,
+  versionInfo,
+  onClose,
+  onPublish,
+}) => {
+  const { t } = useTranslation()
+  const [title, setTitle] = useState(versionInfo?.marked_name || '')
+  const [releaseNotes, setReleaseNotes] = useState(versionInfo?.marked_comment || '')
+  const [titleError, setTitleError] = useState(false)
+  const [releaseNotesError, setReleaseNotesError] = useState(false)
+
+  const handlePublish = () => {
+    if (title.length > TITLE_MAX_LENGTH) {
+      setTitleError(true)
+      Toast.notify({
+        type: 'error',
+        message: t('workflow.versionHistory.editField.titleLengthLimit', { limit: TITLE_MAX_LENGTH }),
+      })
+      return
+    }
+    else {
+      titleError && setTitleError(false)
+    }
+
+    if (releaseNotes.length > RELEASE_NOTES_MAX_LENGTH) {
+      setReleaseNotesError(true)
+      Toast.notify({
+        type: 'error',
+        message: t('workflow.versionHistory.editField.releaseNotesLengthLimit', { limit: RELEASE_NOTES_MAX_LENGTH }),
+      })
+      return
+    }
+    else {
+      releaseNotesError && setReleaseNotesError(false)
+    }
+
+    onPublish({ title, releaseNotes, id: versionInfo?.id })
+    onClose()
+  }
+
+  const handleTitleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
+    setTitle(e.target.value)
+  }, [])
+
+  const handleDescriptionChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {
+    setReleaseNotes(e.target.value)
+  }, [])
+
+  return <Modal className='p-0' isShow={isOpen} onClose={onClose}>
+    <div className='relative w-full p-6 pb-4 pr-14'>
+      <div className='title-2xl-semi-bold text-text-primary first-letter:capitalize'>
+        {versionInfo?.marked_name ? t('workflow.versionHistory.editVersionInfo') : t('workflow.versionHistory.nameThisVersion')}
+      </div>
+      <div className='absolute right-5 top-5 flex h-8 w-8 cursor-pointer items-center justify-center p-1.5' onClick={onClose}>
+        <RiCloseLine className='h-[18px] w-[18px] text-text-tertiary' />
+      </div>
+    </div>
+    <div className='flex flex-col gap-y-4 px-6 py-3'>
+      <div className='flex flex-col gap-y-1'>
+        <div className='system-sm-semibold flex h-6 items-center text-text-secondary'>
+          {t('workflow.versionHistory.editField.title')}
+        </div>
+        <Input
+          value={title}
+          placeholder={`${t('workflow.versionHistory.nameThisVersion')}${t('workflow.panel.optional')}`}
+          onChange={handleTitleChange}
+          destructive={titleError}
+        />
+      </div>
+      <div className='flex flex-col gap-y-1'>
+        <div className='system-sm-semibold flex h-6 items-center text-text-secondary'>
+          {t('workflow.versionHistory.editField.releaseNotes')}
+        </div>
+        <Textarea
+          value={releaseNotes}
+          placeholder={`${t('workflow.versionHistory.releaseNotesPlaceholder')}${t('workflow.panel.optional')}`}
+          onChange={handleDescriptionChange}
+          destructive={releaseNotesError}
+        />
+      </div>
+    </div>
+    <div className='flex justify-end p-6 pt-5'>
+      <div className='flex items-center gap-x-3'>
+        <Button onClick={onClose}>{t('common.operation.cancel')}</Button>
+        <Button variant='primary' onClick={handlePublish}>{t('workflow.common.publish')}</Button>
+      </div>
+    </div>
+  </Modal>
+}
+
+export default VersionInfoModal
diff --git a/app/components/app/configuration/base/feature-panel/index.tsx b/app/components/app/configuration/base/feature-panel/index.tsx
new file mode 100644
index 0000000..ec5ab96
--- /dev/null
+++ b/app/components/app/configuration/base/feature-panel/index.tsx
@@ -0,0 +1,48 @@
+'use client'
+import type { FC, ReactNode } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+
+export type IFeaturePanelProps = {
+  className?: string
+  headerIcon?: ReactNode
+  title: ReactNode
+  headerRight?: ReactNode
+  hasHeaderBottomBorder?: boolean
+  noBodySpacing?: boolean
+  children?: ReactNode
+}
+
+const FeaturePanel: FC<IFeaturePanelProps> = ({
+  className,
+  headerIcon,
+  title,
+  headerRight,
+  hasHeaderBottomBorder,
+  noBodySpacing,
+  children,
+}) => {
+  return (
+    <div className={cn('rounded-xl border-l-[0.5px] border-t-[0.5px] border-effects-highlight bg-background-section-burn pb-3', noBodySpacing && 'pb-0', className)}>
+      {/* Header */}
+      <div className={cn('px-3 pt-2', hasHeaderBottomBorder && 'border-b border-divider-subtle')}>
+        <div className='flex h-8 items-center justify-between'>
+          <div className='flex shrink-0 items-center space-x-1'>
+            {headerIcon && <div className='flex h-6 w-6 items-center justify-center'>{headerIcon}</div>}
+            <div className='system-sm-semibold text-text-secondary'>{title}</div>
+          </div>
+          <div className='flex items-center gap-2'>
+            {headerRight && <div>{headerRight}</div>}
+          </div>
+        </div>
+      </div>
+      {/* Body */}
+      {children && (
+        <div className={cn(!noBodySpacing && 'mt-1 px-3')}>
+          {children}
+        </div>
+      )}
+    </div>
+  )
+}
+export default React.memo(FeaturePanel)
diff --git a/app/components/app/configuration/base/group-name/index.tsx b/app/components/app/configuration/base/group-name/index.tsx
new file mode 100644
index 0000000..d387b11
--- /dev/null
+++ b/app/components/app/configuration/base/group-name/index.tsx
@@ -0,0 +1,24 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+
+export type IGroupNameProps = {
+  name: string
+}
+
+const GroupName: FC<IGroupNameProps> = ({
+  name,
+}) => {
+  return (
+    <div className='mb-1 flex items-center'>
+      <div className='mr-3 text-xs font-semibold uppercase leading-[18px] text-text-tertiary'>{name}</div>
+      <div className='h-[1px] grow'
+        style={{
+          background: 'linear-gradient(270deg, rgba(243, 244, 246, 0) 0%, #F3F4F6 100%)',
+
+        }}
+      ></div>
+    </div>
+  )
+}
+export default React.memo(GroupName)
diff --git a/app/components/app/configuration/base/icons/citation.tsx b/app/components/app/configuration/base/icons/citation.tsx
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/components/app/configuration/base/icons/citation.tsx
diff --git a/app/components/app/configuration/base/icons/more-like-this-icon.tsx b/app/components/app/configuration/base/icons/more-like-this-icon.tsx
new file mode 100644
index 0000000..74c808e
--- /dev/null
+++ b/app/components/app/configuration/base/icons/more-like-this-icon.tsx
@@ -0,0 +1,14 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+
+const MoreLikeThisIcon: FC = () => {
+  return (
+    <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+      <path fillRule="evenodd" clipRule="evenodd" d="M5.83914 0.666748H10.1609C10.6975 0.666741 11.1404 0.666734 11.5012 0.696212C11.8759 0.726829 12.2204 0.792538 12.544 0.957399C13.0457 1.21306 13.4537 1.62101 13.7093 2.12277C13.8742 2.44633 13.9399 2.7908 13.9705 3.16553C14 3.52633 14 3.96923 14 4.50587V7.41171C14 7.62908 14 7.73776 13.9652 7.80784C13.9303 7.87806 13.8939 7.91566 13.8249 7.95288C13.756 7.99003 13.6262 7.99438 13.3665 8.00307C12.8879 8.01909 12.4204 8.14633 11.997 8.36429C10.9478 7.82388 9.62021 7.82912 8.53296 8.73228C7.15064 9.88056 6.92784 11.8645 8.0466 13.2641C8.36602 13.6637 8.91519 14.1949 9.40533 14.6492C9.49781 14.7349 9.54405 14.7777 9.5632 14.8041C9.70784 15.003 9.5994 15.2795 9.35808 15.3271C9.32614 15.3334 9.26453 15.3334 9.14129 15.3334H5.83912C5.30248 15.3334 4.85958 15.3334 4.49878 15.304C4.12405 15.2733 3.77958 15.2076 3.45603 15.0428C2.95426 14.7871 2.54631 14.3792 2.29065 13.8774C2.12579 13.5538 2.06008 13.2094 2.02946 12.8346C1.99999 12.4738 1.99999 12.0309 2 11.4943V4.50587C1.99999 3.96924 1.99999 3.52632 2.02946 3.16553C2.06008 2.7908 2.12579 2.44633 2.29065 2.12277C2.54631 1.62101 2.95426 1.21306 3.45603 0.957399C3.77958 0.792538 4.12405 0.726829 4.49878 0.696212C4.85957 0.666734 5.3025 0.666741 5.83914 0.666748ZM4.66667 5.33342C4.29848 5.33342 4 5.63189 4 6.00008C4 6.36827 4.29848 6.66675 4.66667 6.66675H8.66667C9.03486 6.66675 9.33333 6.36827 9.33333 6.00008C9.33333 5.63189 9.03486 5.33342 8.66667 5.33342H4.66667ZM4 8.66675C4 8.29856 4.29848 8.00008 4.66667 8.00008H6C6.36819 8.00008 6.66667 8.29856 6.66667 8.66675C6.66667 9.03494 6.36819 9.33342 6 9.33342H4.66667C4.29848 9.33342 4 9.03494 4 8.66675ZM4.66667 2.66675C4.29848 2.66675 4 2.96523 4 3.33342C4 3.7016 4.29848 4.00008 4.66667 4.00008H10.6667C11.0349 4.00008 11.3333 3.7016 11.3333 3.33342C11.3333 2.96523 11.0349 2.66675 10.6667 2.66675H4.66667Z" fill="#DD2590" />
+      <path d="M11.9977 10.0256C11.3313 9.26808 10.2199 9.06432 9.3849 9.75796C8.54988 10.4516 8.43232 11.6113 9.08807 12.4317C9.58479 13.0531 10.9986 14.3025 11.655 14.8719C11.7744 14.9754 11.8341 15.0272 11.9037 15.0477C11.9642 15.0654 12.0312 15.0654 12.0917 15.0477C12.1613 15.0272 12.221 14.9754 12.3404 14.8719C12.9968 14.3025 14.4106 13.0531 14.9074 12.4317C15.5631 11.6113 15.4599 10.4443 14.6105 9.75796C13.7612 9.07161 12.6642 9.26808 11.9977 10.0256Z" fill="#DD2590" />
+    </svg>
+
+  )
+}
+export default React.memo(MoreLikeThisIcon)
diff --git a/app/components/app/configuration/base/icons/remove-icon/index.tsx b/app/components/app/configuration/base/icons/remove-icon/index.tsx
new file mode 100644
index 0000000..f4b30a9
--- /dev/null
+++ b/app/components/app/configuration/base/icons/remove-icon/index.tsx
@@ -0,0 +1,31 @@
+'use client'
+import React, { useState } from 'react'
+import cn from '@/utils/classnames'
+
+type IRemoveIconProps = {
+  className?: string
+  isHoverStatus?: boolean
+  onClick: () => void
+}
+
+const RemoveIcon = ({
+  className,
+  isHoverStatus,
+  onClick,
+}: IRemoveIconProps) => {
+  const [isHovered, setIsHovered] = useState(false)
+  const computedIsHovered = isHoverStatus || isHovered
+  return (
+    <div
+      className={cn(className, computedIsHovered && 'bg-[#FEE4E2]', 'flex h-6 w-6 cursor-pointer items-center justify-center rounded-md hover:bg-[#FEE4E2]')}
+      onMouseEnter={() => setIsHovered(true)}
+      onMouseLeave={() => setIsHovered(false)}
+      onClick={onClick}
+    >
+      <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+        <path d="M10 6H14M6 8H18M16.6667 8L16.1991 15.0129C16.129 16.065 16.0939 16.5911 15.8667 16.99C15.6666 17.3412 15.3648 17.6235 15.0011 17.7998C14.588 18 14.0607 18 13.0062 18H10.9938C9.93927 18 9.41202 18 8.99889 17.7998C8.63517 17.6235 8.33339 17.3412 8.13332 16.99C7.90607 16.5911 7.871 16.065 7.80086 15.0129L7.33333 8M10.6667 11V14.3333M13.3333 11V14.3333" stroke={computedIsHovered ? '#D92D20' : '#667085'} strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
+      </svg>
+    </div>
+  )
+}
+export default React.memo(RemoveIcon)
diff --git a/app/components/app/configuration/base/icons/remove-icon/style.module.css b/app/components/app/configuration/base/icons/remove-icon/style.module.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/components/app/configuration/base/icons/remove-icon/style.module.css
diff --git a/app/components/app/configuration/base/icons/suggested-questions-after-answer-icon.tsx b/app/components/app/configuration/base/icons/suggested-questions-after-answer-icon.tsx
new file mode 100644
index 0000000..cabc2e4
--- /dev/null
+++ b/app/components/app/configuration/base/icons/suggested-questions-after-answer-icon.tsx
@@ -0,0 +1,12 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+
+const SuggestedQuestionsAfterAnswerIcon: FC = () => {
+  return (
+    <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+      <path fillRule="evenodd" clipRule="evenodd" d="M10.8275 1.33325H5.17245C4.63581 1.33324 4.19289 1.33324 3.8321 1.36272C3.45737 1.39333 3.1129 1.45904 2.78934 1.6239C2.28758 1.87956 1.87963 2.28751 1.62397 2.78928C1.45911 3.11284 1.3934 3.4573 1.36278 3.83204C1.3333 4.19283 1.33331 4.63574 1.33332 5.17239L1.33328 9.42497C1.333 9.95523 1.33278 10.349 1.42418 10.6901C1.67076 11.6103 2.38955 12.3291 3.3098 12.5757C3.51478 12.6306 3.73878 12.6525 3.99998 12.6611L3.99998 13.5806C3.99995 13.7374 3.99992 13.8973 4.01182 14.0283C4.0232 14.1536 4.05333 14.3901 4.21844 14.5969C4.40843 14.8349 4.69652 14.9734 5.00106 14.973C5.26572 14.9728 5.46921 14.8486 5.57416 14.7792C5.6839 14.7066 5.80872 14.6067 5.93117 14.5087L7.53992 13.2217C7.88564 12.9451 7.98829 12.8671 8.09494 12.8126C8.20192 12.7579 8.3158 12.718 8.43349 12.6938C8.55081 12.6697 8.67974 12.6666 9.12248 12.6666H10.8275C11.3642 12.6666 11.8071 12.6666 12.1679 12.6371C12.5426 12.6065 12.8871 12.5408 13.2106 12.3759C13.7124 12.1203 14.1203 11.7123 14.376 11.2106C14.5409 10.887 14.6066 10.5425 14.6372 10.1678C14.6667 9.80701 14.6667 9.36411 14.6667 8.82747V5.17237C14.6667 4.63573 14.6667 4.19283 14.6372 3.83204C14.6066 3.4573 14.5409 3.11284 14.376 2.78928C14.1203 2.28751 13.7124 1.87956 13.2106 1.6239C12.8871 1.45904 12.5426 1.39333 12.1679 1.36272C11.8071 1.33324 11.3642 1.33324 10.8275 1.33325ZM8.99504 4.99992C8.99504 4.44763 9.44275 3.99992 9.99504 3.99992C10.5473 3.99992 10.995 4.44763 10.995 4.99992C10.995 5.5522 10.5473 5.99992 9.99504 5.99992C9.44275 5.99992 8.99504 5.5522 8.99504 4.99992ZM4.92837 7.79996C5.222 7.57974 5.63816 7.63837 5.85961 7.93051C5.90071 7.98295 5.94593 8.03229 5.99199 8.08035C6.09019 8.18282 6.23775 8.32184 6.42882 8.4608C6.81353 8.74059 7.3454 8.99996 7.99504 8.99996C8.64469 8.99996 9.17655 8.74059 9.56126 8.4608C9.75233 8.32184 9.89989 8.18282 9.99809 8.08035C10.0441 8.0323 10.0894 7.98294 10.1305 7.93051C10.3519 7.63837 10.7681 7.57974 11.0617 7.79996C11.3563 8.02087 11.416 8.43874 11.195 8.73329C11.1967 8.73112 11.1928 8.7361 11.186 8.74466C11.1697 8.7651 11.1372 8.80597 11.1261 8.81916C11.087 8.86575 11.0317 8.92884 10.9607 9.00289C10.8194 9.15043 10.6128 9.34474 10.3455 9.53912C9.81353 9.92599 9.01206 10.3333 7.99504 10.3333C6.97802 10.3333 6.17655 9.92599 5.64459 9.53912C5.37733 9.34474 5.17072 9.15043 5.02934 9.00289C4.95837 8.92884 4.90305 8.86575 4.86395 8.81916C4.84438 8.79585 4.82881 8.77659 4.81731 8.76207C4.58702 8.46455 4.61798 8.03275 4.92837 7.79996ZM5.99504 3.99992C5.44275 3.99992 4.99504 4.44763 4.99504 4.99992C4.99504 5.5522 5.44275 5.99992 5.99504 5.99992C6.54732 5.99992 6.99504 5.5522 6.99504 4.99992C6.99504 4.44763 6.54732 3.99992 5.99504 3.99992Z" fill="#06AED4" />
+    </svg>
+  )
+}
+export default React.memo(SuggestedQuestionsAfterAnswerIcon)
diff --git a/app/components/app/configuration/base/operation-btn/index.tsx b/app/components/app/configuration/base/operation-btn/index.tsx
new file mode 100644
index 0000000..aba35cd
--- /dev/null
+++ b/app/components/app/configuration/base/operation-btn/index.tsx
@@ -0,0 +1,44 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAddLine,
+  RiEditLine,
+} from '@remixicon/react'
+import cn from '@/utils/classnames'
+import { noop } from 'lodash-es'
+
+export type IOperationBtnProps = {
+  className?: string
+  type: 'add' | 'edit'
+  actionName?: string
+  onClick?: () => void
+}
+
+const iconMap = {
+  add: <RiAddLine className='h-3.5 w-3.5' />,
+  edit: <RiEditLine className='h-3.5 w-3.5' />,
+}
+
+const OperationBtn: FC<IOperationBtnProps> = ({
+  className,
+  type,
+  actionName,
+  onClick = noop,
+}) => {
+  const { t } = useTranslation()
+  return (
+    <div
+      className={cn('flex h-7 cursor-pointer select-none items-center space-x-1 rounded-md px-3 text-text-secondary hover:bg-state-base-hover', className)}
+      onClick={onClick}>
+      <div>
+        {iconMap[type]}
+      </div>
+      <div className='text-xs font-medium'>
+        {actionName || t(`common.operation.${type}`)}
+      </div>
+    </div>
+  )
+}
+export default React.memo(OperationBtn)
diff --git a/app/components/app/configuration/base/var-highlight/index.tsx b/app/components/app/configuration/base/var-highlight/index.tsx
new file mode 100644
index 0000000..1900dd5
--- /dev/null
+++ b/app/components/app/configuration/base/var-highlight/index.tsx
@@ -0,0 +1,37 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+
+import s from './style.module.css'
+
+export type IVarHighlightProps = {
+  name: string
+  className?: string
+}
+
+const VarHighlight: FC<IVarHighlightProps> = ({
+  name,
+  className = '',
+}) => {
+  return (
+    <div
+      key={name}
+      className={`${s.item} ${className} mb-2 flex h-5 items-center justify-center rounded-md px-1 text-xs font-medium text-primary-600`}
+    >
+      <span className='opacity-60'>{'{{'}</span>
+      <span>{name}</span>
+      <span className='opacity-60'>{'}}'}</span>
+    </div>
+  )
+}
+
+export const varHighlightHTML = ({ name, className = '' }: IVarHighlightProps) => {
+  const html = `<div class="${s.item} ${className} inline-flex mb-2 items-center justify-center px-1 rounded-md h-5 text-xs font-medium text-primary-600">
+  <span class='opacity-60'>{{</span>
+  <span>${name}</span>
+  <span class='opacity-60'>}}</span>
+</div>`
+  return html
+}
+
+export default React.memo(VarHighlight)
diff --git a/app/components/app/configuration/base/var-highlight/style.module.css b/app/components/app/configuration/base/var-highlight/style.module.css
new file mode 100644
index 0000000..2bcef0d
--- /dev/null
+++ b/app/components/app/configuration/base/var-highlight/style.module.css
@@ -0,0 +1,3 @@
+.item {
+  background-color: rgba(21, 94, 239, 0.05);
+}
diff --git a/app/components/app/configuration/base/warning-mask/cannot-query-dataset.tsx b/app/components/app/configuration/base/warning-mask/cannot-query-dataset.tsx
new file mode 100644
index 0000000..be247b0
--- /dev/null
+++ b/app/components/app/configuration/base/warning-mask/cannot-query-dataset.tsx
@@ -0,0 +1,31 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import WarningMask from '.'
+import Button from '@/app/components/base/button'
+
+export type IFormattingChangedProps = {
+  onConfirm: () => void
+}
+
+const FormattingChanged: FC<IFormattingChangedProps> = ({
+  onConfirm,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <WarningMask
+      title={t('appDebug.feature.dataSet.queryVariable.unableToQueryDataSet')}
+      description={t('appDebug.feature.dataSet.queryVariable.unableToQueryDataSetTip')}
+      footer={
+        <div className='flex space-x-2'>
+          <Button variant='primary' className='flex !w-[96px] justify-start' onClick={onConfirm}>
+            <span className='text-[13px] font-medium'>{t('appDebug.feature.dataSet.queryVariable.ok')}</span>
+          </Button>
+        </div>
+      }
+    />
+  )
+}
+export default React.memo(FormattingChanged)
diff --git a/app/components/app/configuration/base/warning-mask/formatting-changed.tsx b/app/components/app/configuration/base/warning-mask/formatting-changed.tsx
new file mode 100644
index 0000000..35c2283
--- /dev/null
+++ b/app/components/app/configuration/base/warning-mask/formatting-changed.tsx
@@ -0,0 +1,41 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import WarningMask from '.'
+import Button from '@/app/components/base/button'
+
+export type IFormattingChangedProps = {
+  onConfirm: () => void
+  onCancel: () => void
+}
+
+const icon = (
+  <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M1.33337 6.66667C1.33337 6.66667 2.67003 4.84548 3.75593 3.75883C4.84183 2.67218 6.34244 2 8.00004 2C11.3137 2 14 4.68629 14 8C14 11.3137 11.3137 14 8.00004 14C5.26465 14 2.95678 12.1695 2.23455 9.66667M1.33337 6.66667V2.66667M1.33337 6.66667H5.33337" stroke="white" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
+  </svg>
+)
+
+const FormattingChanged: FC<IFormattingChangedProps> = ({
+  onConfirm,
+  onCancel,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <WarningMask
+      title={t('appDebug.formattingChangedTitle')}
+      description={t('appDebug.formattingChangedText')}
+      footer={
+        <div className='flex space-x-2'>
+          <Button variant='primary' className='flex space-x-2' onClick={onConfirm}>
+            {icon}
+            <span>{t('common.operation.refresh')}</span>
+          </Button>
+          <Button onClick={onCancel}>{t('common.operation.cancel') as string}</Button>
+        </div>
+      }
+    />
+  )
+}
+export default React.memo(FormattingChanged)
diff --git a/app/components/app/configuration/base/warning-mask/has-not-set-api.tsx b/app/components/app/configuration/base/warning-mask/has-not-set-api.tsx
new file mode 100644
index 0000000..d83f9d9
--- /dev/null
+++ b/app/components/app/configuration/base/warning-mask/has-not-set-api.tsx
@@ -0,0 +1,38 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import WarningMask from '.'
+import Button from '@/app/components/base/button'
+
+export type IHasNotSetAPIProps = {
+  isTrailFinished: boolean
+  onSetting: () => void
+}
+
+const icon = (
+  <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M14 6.00001L14 2.00001M14 2.00001H9.99999M14 2.00001L8 8M6.66667 2H5.2C4.0799 2 3.51984 2 3.09202 2.21799C2.71569 2.40973 2.40973 2.71569 2.21799 3.09202C2 3.51984 2 4.07989 2 5.2V10.8C2 11.9201 2 12.4802 2.21799 12.908C2.40973 13.2843 2.71569 13.5903 3.09202 13.782C3.51984 14 4.07989 14 5.2 14H10.8C11.9201 14 12.4802 14 12.908 13.782C13.2843 13.5903 13.5903 13.2843 13.782 12.908C14 12.4802 14 11.9201 14 10.8V9.33333" stroke="white" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
+  </svg>
+
+)
+
+const HasNotSetAPI: FC<IHasNotSetAPIProps> = ({
+  isTrailFinished,
+  onSetting,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <WarningMask
+      title={isTrailFinished ? t('appDebug.notSetAPIKey.trailFinished') : t('appDebug.notSetAPIKey.title')}
+      description={t('appDebug.notSetAPIKey.description')}
+      footer={
+        <Button variant='primary' className='flex space-x-2' onClick={onSetting}>
+          <span>{t('appDebug.notSetAPIKey.settingBtn')}</span>
+          {icon}
+        </Button>}
+    />
+  )
+}
+export default React.memo(HasNotSetAPI)
diff --git a/app/components/app/configuration/base/warning-mask/index.tsx b/app/components/app/configuration/base/warning-mask/index.tsx
new file mode 100644
index 0000000..fbe58be
--- /dev/null
+++ b/app/components/app/configuration/base/warning-mask/index.tsx
@@ -0,0 +1,43 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+
+import s from './style.module.css'
+
+export type IWarningMaskProps = {
+  title: string
+  description: string
+  footer: React.ReactNode
+}
+
+const warningIcon = (
+  <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M9.99996 13.3334V10.0001M9.99996 6.66675H10.0083M18.3333 10.0001C18.3333 14.6025 14.6023 18.3334 9.99996 18.3334C5.39759 18.3334 1.66663 14.6025 1.66663 10.0001C1.66663 5.39771 5.39759 1.66675 9.99996 1.66675C14.6023 1.66675 18.3333 5.39771 18.3333 10.0001Z" stroke="#F79009" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
+  </svg>
+)
+
+const WarningMask: FC<IWarningMaskProps> = ({
+  title,
+  description,
+  footer,
+}) => {
+  return (
+    <div className={`${s.mask} absolute inset-0 z-10 pt-16`}
+    >
+      <div className='mx-auto px-10'>
+        <div className={`${s.icon} flex h-11 w-11 items-center justify-center rounded-xl bg-white`}>{warningIcon}</div>
+        <div className='mt-4 text-[24px] font-semibold leading-normal text-gray-800'>
+          {title}
+        </div>
+        <div className='mt-3 text-base text-gray-500'>
+          {description}
+        </div>
+        <div className='mt-6'>
+          {footer}
+        </div>
+      </div>
+
+    </div>
+  )
+}
+export default React.memo(WarningMask)
diff --git a/app/components/app/configuration/base/warning-mask/style.module.css b/app/components/app/configuration/base/warning-mask/style.module.css
new file mode 100644
index 0000000..87f226f
--- /dev/null
+++ b/app/components/app/configuration/base/warning-mask/style.module.css
@@ -0,0 +1,8 @@
+.mask {
+  background-color: rgba(239, 244, 255, 0.9);
+  backdrop-filter: blur(2px);
+}
+
+.icon {
+  box-shadow: 0px 12px 16px -4px rgba(16, 24, 40, 0.08), 0px 4px 6px -2px rgba(16, 24, 40, 0.03);
+}
diff --git a/app/components/app/configuration/config-prompt/advanced-prompt-input.tsx b/app/components/app/configuration/config-prompt/advanced-prompt-input.tsx
new file mode 100644
index 0000000..1eec519
--- /dev/null
+++ b/app/components/app/configuration/config-prompt/advanced-prompt-input.tsx
@@ -0,0 +1,275 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import copy from 'copy-to-clipboard'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { useBoolean } from 'ahooks'
+import produce from 'immer'
+import {
+  RiDeleteBinLine,
+  RiErrorWarningFill,
+} from '@remixicon/react'
+import s from './style.module.css'
+import MessageTypeSelector from './message-type-selector'
+import ConfirmAddVar from './confirm-add-var'
+import PromptEditorHeightResizeWrap from './prompt-editor-height-resize-wrap'
+import cn from '@/utils/classnames'
+import type { PromptRole, PromptVariable } from '@/models/debug'
+import {
+  Clipboard,
+  ClipboardCheck,
+} from '@/app/components/base/icons/src/vender/line/files'
+import Button from '@/app/components/base/button'
+import Tooltip from '@/app/components/base/tooltip'
+import PromptEditor from '@/app/components/base/prompt-editor'
+import ConfigContext from '@/context/debug-configuration'
+import { getNewVar, getVars } from '@/utils/var'
+import { AppType } from '@/types/app'
+import { useModalContext } from '@/context/modal-context'
+import type { ExternalDataTool } from '@/models/common'
+import { useToastContext } from '@/app/components/base/toast'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { ADD_EXTERNAL_DATA_TOOL } from '@/app/components/app/configuration/config-var'
+import { INSERT_VARIABLE_VALUE_BLOCK_COMMAND } from '@/app/components/base/prompt-editor/plugins/variable-block'
+type Props = {
+  type: PromptRole
+  isChatMode: boolean
+  value: string
+  onTypeChange: (value: PromptRole) => void
+  onChange: (value: string) => void
+  canDelete: boolean
+  onDelete: () => void
+  promptVariables: PromptVariable[]
+  isContextMissing: boolean
+  onHideContextMissingTip: () => void
+  noResize?: boolean
+}
+
+const AdvancedPromptInput: FC<Props> = ({
+  type,
+  isChatMode,
+  value,
+  onChange,
+  onTypeChange,
+  canDelete,
+  onDelete,
+  promptVariables,
+  isContextMissing,
+  onHideContextMissingTip,
+  noResize,
+}) => {
+  const { t } = useTranslation()
+  const { eventEmitter } = useEventEmitterContextContext()
+
+  const {
+    mode,
+    hasSetBlockStatus,
+    modelConfig,
+    setModelConfig,
+    conversationHistoriesRole,
+    showHistoryModal,
+    dataSets,
+    showSelectDataSet,
+    externalDataToolsConfig,
+  } = useContext(ConfigContext)
+  const { notify } = useToastContext()
+  const { setShowExternalDataToolModal } = useModalContext()
+  const handleOpenExternalDataToolModal = () => {
+    setShowExternalDataToolModal({
+      payload: {},
+      onSaveCallback: (newExternalDataTool: ExternalDataTool) => {
+        eventEmitter?.emit({
+          type: ADD_EXTERNAL_DATA_TOOL,
+          payload: newExternalDataTool,
+        } as any)
+        eventEmitter?.emit({
+          type: INSERT_VARIABLE_VALUE_BLOCK_COMMAND,
+          payload: newExternalDataTool.variable,
+        } as any)
+      },
+      onValidateBeforeSaveCallback: (newExternalDataTool: ExternalDataTool) => {
+        for (let i = 0; i < promptVariables.length; i++) {
+          if (promptVariables[i].key === newExternalDataTool.variable) {
+            notify({ type: 'error', message: t('appDebug.varKeyError.keyAlreadyExists', { key: promptVariables[i].key }) })
+            return false
+          }
+        }
+
+        return true
+      },
+    })
+  }
+  const isChatApp = mode !== AppType.completion
+  const [isCopied, setIsCopied] = React.useState(false)
+
+  const promptVariablesObj = (() => {
+    const obj: Record<string, boolean> = {}
+    promptVariables.forEach((item) => {
+      obj[item.key] = true
+    })
+    return obj
+  })()
+  const [newPromptVariables, setNewPromptVariables] = React.useState<PromptVariable[]>(promptVariables)
+  const [isShowConfirmAddVar, { setTrue: showConfirmAddVar, setFalse: hideConfirmAddVar }] = useBoolean(false)
+  const handlePromptChange = (newValue: string) => {
+    if (value === newValue)
+      return
+    onChange(newValue)
+  }
+  const handleBlur = () => {
+    const keys = getVars(value)
+    const newPromptVariables = keys.filter(key => !(key in promptVariablesObj) && !externalDataToolsConfig.find(item => item.variable === key)).map(key => getNewVar(key, ''))
+    if (newPromptVariables.length > 0) {
+      setNewPromptVariables(newPromptVariables)
+      showConfirmAddVar()
+    }
+  }
+
+  const handleAutoAdd = (isAdd: boolean) => {
+    return () => {
+      if (isAdd) {
+        const newModelConfig = produce(modelConfig, (draft) => {
+          draft.configs.prompt_variables = [...draft.configs.prompt_variables, ...newPromptVariables]
+        })
+        setModelConfig(newModelConfig)
+      }
+      hideConfirmAddVar()
+    }
+  }
+
+  const minHeight = 102
+  const [editorHeight, setEditorHeight] = React.useState(isChatMode ? 200 : 508)
+  const contextMissing = (
+    <div
+      className='flex h-11 items-center justify-between rounded-tl-xl rounded-tr-xl pb-1 pl-4 pr-3 pt-2'
+      style={{
+        background: 'linear-gradient(180deg, #FEF0C7 0%, rgba(254, 240, 199, 0) 100%)',
+      }}
+    >
+      <div className='flex items-center pr-2' >
+        <RiErrorWarningFill className='mr-1 h-4 w-4 text-[#F79009]' />
+        <div className='text-[13px] font-medium leading-[18px] text-[#DC6803]'>{t('appDebug.promptMode.contextMissing')}</div>
+      </div>
+      <Button
+        size='small'
+        variant='secondary-accent'
+        onClick={onHideContextMissingTip}
+      >{t('common.operation.ok')}</Button>
+    </div>
+  )
+  return (
+    <div className={`rounded-xl bg-gradient-to-r from-components-input-border-active-prompt-1 to-components-input-border-active-prompt-2 p-0.5 shadow-xs ${!isContextMissing ? '' : s.warningBorder}`}>
+      <div className='rounded-xl bg-background-default'>
+        {isContextMissing
+          ? contextMissing
+          : (
+            <div className={cn(s.boxHeader, 'flex h-11 items-center justify-between rounded-tl-xl rounded-tr-xl bg-background-default pb-1 pl-4 pr-3 pt-2 hover:shadow-xs')}>
+              {isChatMode
+                ? (
+                  <MessageTypeSelector value={type} onChange={onTypeChange} />
+                )
+                : (
+                  <div className='flex items-center space-x-1'>
+
+                    <div className='text-sm font-semibold uppercase text-indigo-800'>{t('appDebug.pageTitle.line1')}
+                    </div>
+                    <Tooltip
+                      popupContent={
+                        <div className='w-[180px]'>
+                          {t('appDebug.promptTip')}
+                        </div>
+                      }
+                    />
+                  </div>)}
+              <div className={cn(s.optionWrap, 'items-center space-x-1')}>
+                {canDelete && (
+                  <RiDeleteBinLine onClick={onDelete} className='h-6 w-6 cursor-pointer p-1 text-text-tertiary' />
+                )}
+                {!isCopied
+                  ? (
+                    <Clipboard className='h-6 w-6 cursor-pointer p-1 text-text-tertiary' onClick={() => {
+                      copy(value)
+                      setIsCopied(true)
+                    }} />
+                  )
+                  : (
+                    <ClipboardCheck className='h-6 w-6 p-1 text-text-tertiary' />
+                  )}
+              </div>
+            </div>
+          )}
+
+        <PromptEditorHeightResizeWrap
+          className='min-h-[102px] overflow-y-auto px-4 text-sm text-text-secondary'
+          height={editorHeight}
+          minHeight={minHeight}
+          onHeightChange={setEditorHeight}
+          footer={(
+            <div className='flex pb-2 pl-4'>
+              <div className="h-[18px] rounded-md bg-divider-regular px-1 text-xs leading-[18px] text-text-tertiary">{value.length}</div>
+            </div>
+          )}
+          hideResize={noResize}
+        >
+          <PromptEditor
+            className='min-h-[84px]'
+            value={value}
+            contextBlock={{
+              show: true,
+              selectable: !hasSetBlockStatus.context,
+              datasets: dataSets.map(item => ({
+                id: item.id,
+                name: item.name,
+                type: item.data_source_type,
+              })),
+              onAddContext: showSelectDataSet,
+            }}
+            variableBlock={{
+              show: true,
+              variables: modelConfig.configs.prompt_variables.filter(item => item.type !== 'api').map(item => ({
+                name: item.name,
+                value: item.key,
+              })),
+            }}
+            externalToolBlock={{
+              externalTools: modelConfig.configs.prompt_variables.filter(item => item.type === 'api').map(item => ({
+                name: item.name,
+                variableName: item.key,
+                icon: item.icon,
+                icon_background: item.icon_background,
+              })),
+              onAddExternalTool: handleOpenExternalDataToolModal,
+            }}
+            historyBlock={{
+              show: !isChatMode && isChatApp,
+              selectable: !hasSetBlockStatus.history,
+              history: {
+                user: conversationHistoriesRole?.user_prefix,
+                assistant: conversationHistoriesRole?.assistant_prefix,
+              },
+              onEditRole: showHistoryModal,
+            }}
+            queryBlock={{
+              show: !isChatMode && isChatApp,
+              selectable: !hasSetBlockStatus.query,
+            }}
+            onChange={handlePromptChange}
+            onBlur={handleBlur}
+          />
+        </PromptEditorHeightResizeWrap>
+
+      </div>
+
+      {isShowConfirmAddVar && (
+        <ConfirmAddVar
+          varNameArr={newPromptVariables.map(v => v.name)}
+          onConfirm={handleAutoAdd(true)}
+          onCancel={handleAutoAdd(false)}
+          onHide={hideConfirmAddVar}
+        />
+      )}
+    </div>
+  )
+}
+export default React.memo(AdvancedPromptInput)
diff --git a/app/components/app/configuration/config-prompt/confirm-add-var/index.tsx b/app/components/app/configuration/config-prompt/confirm-add-var/index.tsx
new file mode 100644
index 0000000..413f73f
--- /dev/null
+++ b/app/components/app/configuration/config-prompt/confirm-add-var/index.tsx
@@ -0,0 +1,69 @@
+'use client'
+import type { FC } from 'react'
+import React, { useRef } from 'react'
+import { useTranslation } from 'react-i18next'
+import VarHighlight from '../../base/var-highlight'
+import Button from '@/app/components/base/button'
+
+export type IConfirmAddVarProps = {
+  varNameArr: string[]
+  onConfirm: () => void
+  onCancel: () => void
+  onHide: () => void
+}
+
+const VarIcon = (
+  <svg width="16" height="14" viewBox="0 0 16 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M13.8683 0.704745C13.7051 0.374685 13.3053 0.239393 12.9752 0.402563C12.6452 0.565732 12.5099 0.965573 12.673 1.29563C13.5221 3.01316 13.9999 4.94957 13.9999 7.00019C13.9999 9.05081 13.5221 10.9872 12.673 12.7047C12.5099 13.0348 12.6452 13.4346 12.9752 13.5978C13.3053 13.761 13.7051 13.6257 13.8683 13.2956C14.8063 11.3983 15.3333 9.26009 15.3333 7.00019C15.3333 4.74029 14.8063 2.60209 13.8683 0.704745Z" fill="#FD853A" />
+    <path d="M3.32687 1.29563C3.49004 0.965573 3.35475 0.565732 3.02469 0.402563C2.69463 0.239393 2.29479 0.374685 2.13162 0.704745C1.19364 2.60209 0.666626 4.74029 0.666626 7.00019C0.666626 9.26009 1.19364 11.3983 2.13162 13.2956C2.29479 13.6257 2.69463 13.761 3.02469 13.5978C3.35475 13.4346 3.49004 13.0348 3.32687 12.7047C2.47779 10.9872 1.99996 9.05081 1.99996 7.00019C1.99996 4.94957 2.47779 3.01316 3.32687 1.29563Z" fill="#FD853A" />
+    <path d="M9.33238 4.8413C9.74208 4.36081 10.3411 4.08337 10.9726 4.08337H11.0324C11.4006 4.08337 11.6991 4.38185 11.6991 4.75004C11.6991 5.11823 11.4006 5.41671 11.0324 5.41671H10.9726C10.7329 5.41671 10.5042 5.52196 10.347 5.7064L8.78693 7.536L9.28085 9.27382C9.29145 9.31112 9.32388 9.33337 9.35696 9.33337H10.2864C10.6545 9.33337 10.953 9.63185 10.953 10C10.953 10.3682 10.6545 10.6667 10.2864 10.6667H9.35696C8.72382 10.6667 8.17074 10.245 7.99832 9.63834L7.74732 8.75524L6.76373 9.90878C6.35403 10.3893 5.75501 10.6667 5.1235 10.6667H5.06372C4.69553 10.6667 4.39705 10.3682 4.39705 10C4.39705 9.63185 4.69553 9.33337 5.06372 9.33337H5.1235C5.3632 9.33337 5.59189 9.22812 5.74915 9.04368L7.30926 7.21399L6.81536 5.47626C6.80476 5.43897 6.77233 5.41671 6.73925 5.41671H5.80986C5.44167 5.41671 5.14319 5.11823 5.14319 4.75004C5.14319 4.38185 5.44167 4.08337 5.80986 4.08337H6.73925C7.37239 4.08337 7.92547 4.50508 8.0979 5.11174L8.34887 5.99475L9.33238 4.8413Z" fill="#FD853A" />
+  </svg>
+)
+
+const ConfirmAddVar: FC<IConfirmAddVarProps> = ({
+  varNameArr,
+  onConfirm,
+  onCancel,
+  // onHide,
+}) => {
+  const { t } = useTranslation()
+  const mainContentRef = useRef<HTMLDivElement>(null)
+  // new prompt editor blur trigger click...
+  // useClickAway(() => {
+  //   onHide()
+  // }, mainContentRef)
+  return (
+    <div className='absolute inset-0  flex items-center justify-center rounded-xl'
+      style={{
+        backgroundColor: 'rgba(35, 56, 118, 0.2)',
+      }}>
+      <div
+        ref={mainContentRef}
+        className='w-[420px] rounded-xl bg-components-panel-bg p-6'
+        style={{
+          boxShadow: '0px 12px 16px -4px rgba(16, 24, 40, 0.08), 0px 4px 6px -2px rgba(16, 24, 40, 0.03)',
+        }}
+      >
+        <div className='flex items-start space-x-3'>
+          <div
+            className='flex h-10 w-10 shrink-0 items-center justify-center rounded-xl border border-components-card-border bg-components-card-bg-alt shadow-lg'
+          >{VarIcon}</div>
+          <div className='grow-1'>
+            <div className='text-sm font-medium text-text-primary'>{t('appDebug.autoAddVar')}</div>
+            <div className='mt-[15px] flex max-h-[66px] flex-wrap space-x-1 overflow-y-auto px-1'>
+              {varNameArr.map(name => (
+                <VarHighlight key={name} name={name} />
+              ))}
+            </div>
+          </div>
+        </div>
+        <div className='mt-7 flex justify-end space-x-2'>
+          <Button onClick={onCancel}>{t('common.operation.cancel')}</Button>
+          <Button variant='primary' onClick={onConfirm}>{t('common.operation.add')}</Button>
+        </div>
+      </div>
+
+    </div>
+  )
+}
+export default React.memo(ConfirmAddVar)
diff --git a/app/components/app/configuration/config-prompt/conversation-history/edit-modal.tsx b/app/components/app/configuration/config-prompt/conversation-history/edit-modal.tsx
new file mode 100644
index 0000000..ff115da
--- /dev/null
+++ b/app/components/app/configuration/config-prompt/conversation-history/edit-modal.tsx
@@ -0,0 +1,58 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import Modal from '@/app/components/base/modal'
+import type { ConversationHistoriesRole } from '@/models/debug'
+import Button from '@/app/components/base/button'
+type Props = {
+  isShow: boolean
+  saveLoading: boolean
+  data: ConversationHistoriesRole
+  onClose: () => void
+  onSave: (data: any) => void
+}
+
+const EditModal: FC<Props> = ({
+  isShow,
+  saveLoading,
+  data,
+  onClose,
+  onSave,
+}) => {
+  const { t } = useTranslation()
+  const [tempData, setTempData] = useState(data)
+  return (
+    <Modal
+      title={t('appDebug.feature.conversationHistory.editModal.title')}
+      isShow={isShow}
+      onClose={onClose}
+    >
+      <div className={'mt-6 text-sm font-medium leading-[21px] text-text-primary'}>{t('appDebug.feature.conversationHistory.editModal.userPrefix')}</div>
+      <input className={'mt-2 box-border h-10 w-full rounded-lg bg-components-input-bg-normal px-3 text-sm leading-10'}
+        value={tempData.user_prefix}
+        onChange={e => setTempData({
+          ...tempData,
+          user_prefix: e.target.value,
+        })}
+      />
+
+      <div className={'mt-6 text-sm font-medium leading-[21px] text-text-primary'}>{t('appDebug.feature.conversationHistory.editModal.assistantPrefix')}</div>
+      <input className={'mt-2 box-border h-10 w-full rounded-lg bg-components-input-bg-normal px-3 text-sm leading-10'}
+        value={tempData.assistant_prefix}
+        onChange={e => setTempData({
+          ...tempData,
+          assistant_prefix: e.target.value,
+        })}
+        placeholder={t('common.chat.conversationNamePlaceholder') || ''}
+      />
+
+      <div className='mt-10 flex justify-end'>
+        <Button className='mr-2 shrink-0' onClick={onClose}>{t('common.operation.cancel')}</Button>
+        <Button variant='primary' className='shrink-0' onClick={() => onSave(tempData)} loading={saveLoading}>{t('common.operation.save')}</Button>
+      </div>
+    </Modal>
+  )
+}
+
+export default React.memo(EditModal)
diff --git a/app/components/app/configuration/config-prompt/conversation-history/history-panel.tsx b/app/components/app/configuration/config-prompt/conversation-history/history-panel.tsx
new file mode 100644
index 0000000..592c952
--- /dev/null
+++ b/app/components/app/configuration/config-prompt/conversation-history/history-panel.tsx
@@ -0,0 +1,60 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import OperationBtn from '@/app/components/app/configuration/base/operation-btn'
+import Panel from '@/app/components/app/configuration/base/feature-panel'
+import { MessageClockCircle } from '@/app/components/base/icons/src/vender/solid/general'
+import I18n from '@/context/i18n'
+import { LanguagesSupported } from '@/i18n/language'
+
+type Props = {
+  showWarning: boolean
+  onShowEditModal: () => void
+}
+
+const HistoryPanel: FC<Props> = ({
+  showWarning,
+  onShowEditModal,
+}) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+
+  return (
+    <Panel
+      className='mt-2'
+      title={
+        <div className='flex items-center gap-2'>
+          <div>{t('appDebug.feature.conversationHistory.title')}</div>
+        </div>
+      }
+      headerIcon={
+        <div className='rounded-md p-1 shadow-xs'>
+          <MessageClockCircle className='h-4 w-4 text-[#DD2590]' />
+        </div>}
+      headerRight={
+        <div className='flex items-center'>
+          <div className='text-xs text-text-tertiary'>{t('appDebug.feature.conversationHistory.description')}</div>
+          <div className='ml-3 h-[14px] w-[1px] bg-divider-regular'></div>
+          <OperationBtn type="edit" onClick={onShowEditModal} />
+        </div>
+      }
+      noBodySpacing
+    >
+      {showWarning && (
+        <div className='flex justify-between rounded-b-xl bg-background-section-burn px-3 py-2 text-xs text-text-secondary'>
+          <div>{t('appDebug.feature.conversationHistory.tip')}
+            <a href={`${locale === LanguagesSupported[1]
+              ? 'https://docs.dify.ai/zh-hans/learn-more/extended-reading/prompt-engineering/README'
+              : 'https://docs.dify.ai/en/features/prompt-engineering'}`}
+            target='_blank' rel='noopener noreferrer'
+            className='text-[#155EEF]'>{t('appDebug.feature.conversationHistory.learnMore')}
+            </a>
+          </div>
+        </div>
+      )}
+    </Panel>
+  )
+}
+export default React.memo(HistoryPanel)
diff --git a/app/components/app/configuration/config-prompt/index.tsx b/app/components/app/configuration/config-prompt/index.tsx
new file mode 100644
index 0000000..1caca47
--- /dev/null
+++ b/app/components/app/configuration/config-prompt/index.tsx
@@ -0,0 +1,170 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useContext } from 'use-context-selector'
+import produce from 'immer'
+import {
+  RiAddLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import SimplePromptInput from './simple-prompt-input'
+import Button from '@/app/components/base/button'
+import AdvancedMessageInput from '@/app/components/app/configuration/config-prompt/advanced-prompt-input'
+import { PromptRole } from '@/models/debug'
+import type { PromptItem, PromptVariable } from '@/models/debug'
+import { type AppType, ModelModeType } from '@/types/app'
+import ConfigContext from '@/context/debug-configuration'
+import { MAX_PROMPT_MESSAGE_LENGTH } from '@/config'
+export type IPromptProps = {
+  mode: AppType
+  promptTemplate: string
+  promptVariables: PromptVariable[]
+  readonly?: boolean
+  noTitle?: boolean
+  gradientBorder?: boolean
+  editorHeight?: number
+  noResize?: boolean
+  onChange?: (prompt: string, promptVariables: PromptVariable[]) => void
+}
+
+const Prompt: FC<IPromptProps> = ({
+  mode,
+  promptTemplate,
+  promptVariables,
+  noTitle,
+  gradientBorder,
+  readonly = false,
+  editorHeight,
+  noResize,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    isAdvancedMode,
+    currentAdvancedPrompt,
+    setCurrentAdvancedPrompt,
+    modelModeType,
+    dataSets,
+    hasSetBlockStatus,
+  } = useContext(ConfigContext)
+
+  const handleMessageTypeChange = (index: number, role: PromptRole) => {
+    const newPrompt = produce(currentAdvancedPrompt as PromptItem[], (draft) => {
+      draft[index].role = role
+    })
+    setCurrentAdvancedPrompt(newPrompt)
+  }
+
+  const handleValueChange = (value: string, index?: number) => {
+    if (modelModeType === ModelModeType.chat) {
+      const newPrompt = produce(currentAdvancedPrompt as PromptItem[], (draft) => {
+        draft[index as number].text = value
+      })
+      setCurrentAdvancedPrompt(newPrompt, true)
+    }
+    else {
+      const prompt = currentAdvancedPrompt as PromptItem
+      setCurrentAdvancedPrompt({
+        ...prompt,
+        text: value,
+      }, true)
+    }
+  }
+
+  const handleAddMessage = () => {
+    const currentAdvancedPromptList = currentAdvancedPrompt as PromptItem[]
+    if (currentAdvancedPromptList.length === 0) {
+      setCurrentAdvancedPrompt([{
+        role: PromptRole.system,
+        text: '',
+      }])
+      return
+    }
+    const lastMessageType = currentAdvancedPromptList[currentAdvancedPromptList.length - 1]?.role
+    const appendMessage = {
+      role: lastMessageType === PromptRole.user ? PromptRole.assistant : PromptRole.user,
+      text: '',
+    }
+    setCurrentAdvancedPrompt([...currentAdvancedPromptList, appendMessage])
+  }
+
+  const handlePromptDelete = (index: number) => {
+    const currentAdvancedPromptList = currentAdvancedPrompt as PromptItem[]
+    const newPrompt = produce(currentAdvancedPromptList, (draft) => {
+      draft.splice(index, 1)
+    })
+    setCurrentAdvancedPrompt(newPrompt)
+  }
+
+  const isContextMissing = dataSets.length > 0 && !hasSetBlockStatus.context
+  const [isHideContextMissTip, setIsHideContextMissTip] = React.useState(false)
+
+  if (!isAdvancedMode) {
+    return (
+      <SimplePromptInput
+        mode={mode}
+        promptTemplate={promptTemplate}
+        promptVariables={promptVariables}
+        readonly={readonly}
+        onChange={onChange}
+        noTitle={noTitle}
+        gradientBorder={gradientBorder}
+        editorHeight={editorHeight}
+        noResize={noResize}
+      />
+    )
+  }
+
+  return (
+    <div>
+      <div className='space-y-3'>
+        {modelModeType === ModelModeType.chat
+          ? (
+            (currentAdvancedPrompt as PromptItem[]).map((item, index) => (
+              <AdvancedMessageInput
+                key={index}
+                isChatMode
+                type={item.role as PromptRole}
+                value={item.text}
+                onTypeChange={type => handleMessageTypeChange(index, type)}
+                canDelete={(currentAdvancedPrompt as PromptItem[]).length > 1}
+                onDelete={() => handlePromptDelete(index)}
+                onChange={value => handleValueChange(value, index)}
+                promptVariables={promptVariables}
+                isContextMissing={isContextMissing && !isHideContextMissTip}
+                onHideContextMissingTip={() => setIsHideContextMissTip(true)}
+                noResize={noResize}
+              />
+            ))
+          )
+          : (
+            <AdvancedMessageInput
+              type={(currentAdvancedPrompt as PromptItem).role as PromptRole}
+              isChatMode={false}
+              value={(currentAdvancedPrompt as PromptItem).text}
+              onTypeChange={type => handleMessageTypeChange(0, type)}
+              canDelete={false}
+              onDelete={() => handlePromptDelete(0)}
+              onChange={value => handleValueChange(value)}
+              promptVariables={promptVariables}
+              isContextMissing={isContextMissing && !isHideContextMissTip}
+              onHideContextMissingTip={() => setIsHideContextMissTip(true)}
+              noResize={noResize}
+            />
+          )
+        }
+      </div>
+      {(modelModeType === ModelModeType.chat && (currentAdvancedPrompt as PromptItem[]).length < MAX_PROMPT_MESSAGE_LENGTH) && (
+        <Button
+          onClick={handleAddMessage}
+          className='mt-3 w-full'>
+          <RiAddLine className='mr-2 h-4 w-4' />
+          <div>{t('appDebug.promptMode.operation.addMessage')}</div>
+        </Button>
+      )}
+    </div>
+  )
+}
+
+export default React.memo(Prompt)
diff --git a/app/components/app/configuration/config-prompt/message-type-selector.tsx b/app/components/app/configuration/config-prompt/message-type-selector.tsx
new file mode 100644
index 0000000..17b3ecb
--- /dev/null
+++ b/app/components/app/configuration/config-prompt/message-type-selector.tsx
@@ -0,0 +1,50 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useBoolean, useClickAway } from 'ahooks'
+import cn from '@/utils/classnames'
+import { PromptRole } from '@/models/debug'
+import { ChevronSelectorVertical } from '@/app/components/base/icons/src/vender/line/arrows'
+type Props = {
+  value: PromptRole
+  onChange: (value: PromptRole) => void
+}
+
+const allTypes = [PromptRole.system, PromptRole.user, PromptRole.assistant]
+const MessageTypeSelector: FC<Props> = ({
+  value,
+  onChange,
+}) => {
+  const [showOption, { setFalse: setHide, toggle: toggleShow }] = useBoolean(false)
+  const ref = React.useRef(null)
+  useClickAway(() => {
+    setHide()
+  }, ref)
+  return (
+    <div className='relative left-[-8px]' ref={ref}>
+      <div
+        onClick={toggleShow}
+        className={cn(showOption && 'bg-indigo-100', 'flex h-7 cursor-pointer items-center space-x-0.5 rounded-lg pl-1.5 pr-1 text-indigo-800')}>
+        <div className='text-sm font-semibold uppercase'>{value}</div>
+        <ChevronSelectorVertical className='h-3 w-3 ' />
+      </div>
+      {showOption && (
+        <div className='absolute top-[30px] z-10 rounded-lg border border-components-panel-border bg-components-panel-bg p-1 shadow-lg'>
+          {allTypes.map(type => (
+            <div
+              key={type}
+              onClick={() => {
+                setHide()
+                onChange(type)
+              }}
+              className='flex h-9 min-w-[44px] cursor-pointer items-center rounded-lg px-3 text-sm font-medium uppercase text-text-secondary hover:bg-state-base-hover'
+            >{type}</div>
+          ))
+          }
+        </div>
+      )
+      }
+    </div>
+  )
+}
+export default React.memo(MessageTypeSelector)
diff --git a/app/components/app/configuration/config-prompt/prompt-editor-height-resize-wrap.tsx b/app/components/app/configuration/config-prompt/prompt-editor-height-resize-wrap.tsx
new file mode 100644
index 0000000..1457a29
--- /dev/null
+++ b/app/components/app/configuration/config-prompt/prompt-editor-height-resize-wrap.tsx
@@ -0,0 +1,96 @@
+'use client'
+import React, { useCallback, useEffect, useState } from 'react'
+import type { FC } from 'react'
+import { useDebounceFn } from 'ahooks'
+import cn from '@/utils/classnames'
+
+type Props = {
+  className?: string
+  height: number
+  minHeight: number
+  onHeightChange: (height: number) => void
+  children: React.JSX.Element
+  footer?: React.JSX.Element
+  hideResize?: boolean
+}
+
+const PromptEditorHeightResizeWrap: FC<Props> = ({
+  className,
+  height,
+  minHeight,
+  onHeightChange,
+  children,
+  footer,
+  hideResize,
+}) => {
+  const [clientY, setClientY] = useState(0)
+  const [isResizing, setIsResizing] = useState(false)
+  const [prevUserSelectStyle, setPrevUserSelectStyle] = useState(getComputedStyle(document.body).userSelect)
+  const [oldHeight, setOldHeight] = useState(height)
+
+  const handleStartResize = useCallback((e: React.MouseEvent<HTMLElement>) => {
+    setClientY(e.clientY)
+    setIsResizing(true)
+    setOldHeight(height)
+    setPrevUserSelectStyle(getComputedStyle(document.body).userSelect)
+    document.body.style.userSelect = 'none'
+  }, [height])
+
+  const handleStopResize = useCallback(() => {
+    setIsResizing(false)
+    document.body.style.userSelect = prevUserSelectStyle
+  }, [prevUserSelectStyle])
+
+  const { run: didHandleResize } = useDebounceFn((e) => {
+    if (!isResizing)
+      return
+
+    const offset = e.clientY - clientY
+    let newHeight = oldHeight + offset
+    if (newHeight < minHeight)
+      newHeight = minHeight
+    onHeightChange(newHeight)
+  }, {
+    wait: 0,
+  })
+
+  const handleResize = useCallback(didHandleResize, [isResizing, height, minHeight, clientY])
+
+  useEffect(() => {
+    document.addEventListener('mousemove', handleResize)
+    return () => {
+      document.removeEventListener('mousemove', handleResize)
+    }
+  }, [handleResize])
+
+  useEffect(() => {
+    document.addEventListener('mouseup', handleStopResize)
+    return () => {
+      document.removeEventListener('mouseup', handleStopResize)
+    }
+  }, [handleStopResize])
+
+  return (
+    <div
+      className='relative'
+    >
+      <div className={cn(className, 'overflow-y-auto')}
+        style={{
+          height,
+        }}
+      >
+        {children}
+      </div>
+      {/* resize handler */}
+      {footer}
+      {!hideResize && (
+        <div
+          className='absolute bottom-0 left-0 flex h-2 w-full cursor-row-resize justify-center'
+          onMouseDown={handleStartResize}>
+          <div className='h-[3px] w-5 rounded-sm bg-gray-300'></div>
+        </div>
+      )}
+    </div>
+  )
+}
+export default React.memo(PromptEditorHeightResizeWrap)
diff --git a/app/components/app/configuration/config-prompt/simple-prompt-input.tsx b/app/components/app/configuration/config-prompt/simple-prompt-input.tsx
new file mode 100644
index 0000000..3268c1d
--- /dev/null
+++ b/app/components/app/configuration/config-prompt/simple-prompt-input.tsx
@@ -0,0 +1,284 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import produce from 'immer'
+import { useContext } from 'use-context-selector'
+import ConfirmAddVar from './confirm-add-var'
+import PromptEditorHeightResizeWrap from './prompt-editor-height-resize-wrap'
+import cn from '@/utils/classnames'
+import type { PromptVariable } from '@/models/debug'
+import Tooltip from '@/app/components/base/tooltip'
+import type { CompletionParams } from '@/types/app'
+import { AppType } from '@/types/app'
+import { getNewVar, getVars } from '@/utils/var'
+import AutomaticBtn from '@/app/components/app/configuration/config/automatic/automatic-btn'
+import type { AutomaticRes } from '@/service/debug'
+import GetAutomaticResModal from '@/app/components/app/configuration/config/automatic/get-automatic-res'
+import PromptEditor from '@/app/components/base/prompt-editor'
+import ConfigContext from '@/context/debug-configuration'
+import { useModalContext } from '@/context/modal-context'
+import type { ExternalDataTool } from '@/models/common'
+import { useToastContext } from '@/app/components/base/toast'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { ADD_EXTERNAL_DATA_TOOL } from '@/app/components/app/configuration/config-var'
+import { INSERT_VARIABLE_VALUE_BLOCK_COMMAND } from '@/app/components/base/prompt-editor/plugins/variable-block'
+import { PROMPT_EDITOR_UPDATE_VALUE_BY_EVENT_EMITTER } from '@/app/components/base/prompt-editor/plugins/update-block'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import { useFeaturesStore } from '@/app/components/base/features/hooks'
+import { noop } from 'lodash-es'
+
+export type ISimplePromptInput = {
+  mode: AppType
+  promptTemplate: string
+  promptVariables: PromptVariable[]
+  readonly?: boolean
+  onChange?: (prompt: string, promptVariables: PromptVariable[]) => void
+  noTitle?: boolean
+  gradientBorder?: boolean
+  editorHeight?: number
+  noResize?: boolean
+}
+
+const Prompt: FC<ISimplePromptInput> = ({
+  mode,
+  promptTemplate,
+  promptVariables,
+  readonly = false,
+  onChange,
+  noTitle,
+  editorHeight: initEditorHeight,
+  noResize,
+}) => {
+  const { t } = useTranslation()
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+  const featuresStore = useFeaturesStore()
+  const {
+    features,
+    setFeatures,
+  } = featuresStore!.getState()
+
+  const { eventEmitter } = useEventEmitterContextContext()
+  const {
+    modelConfig,
+    completionParams,
+    dataSets,
+    setModelConfig,
+    setPrevPromptConfig,
+    setIntroduction,
+    hasSetBlockStatus,
+    showSelectDataSet,
+    externalDataToolsConfig,
+  } = useContext(ConfigContext)
+  const { notify } = useToastContext()
+  const { setShowExternalDataToolModal } = useModalContext()
+  const handleOpenExternalDataToolModal = () => {
+    setShowExternalDataToolModal({
+      payload: {},
+      onSaveCallback: (newExternalDataTool: ExternalDataTool) => {
+        eventEmitter?.emit({
+          type: ADD_EXTERNAL_DATA_TOOL,
+          payload: newExternalDataTool,
+        } as any)
+        eventEmitter?.emit({
+          type: INSERT_VARIABLE_VALUE_BLOCK_COMMAND,
+          payload: newExternalDataTool.variable,
+        } as any)
+      },
+      onValidateBeforeSaveCallback: (newExternalDataTool: ExternalDataTool) => {
+        for (let i = 0; i < promptVariables.length; i++) {
+          if (promptVariables[i].key === newExternalDataTool.variable) {
+            notify({ type: 'error', message: t('appDebug.varKeyError.keyAlreadyExists', { key: promptVariables[i].key }) })
+            return false
+          }
+        }
+
+        return true
+      },
+    })
+  }
+  const promptVariablesObj = (() => {
+    const obj: Record<string, boolean> = {}
+    promptVariables.forEach((item) => {
+      obj[item.key] = true
+    })
+    return obj
+  })()
+
+  const [newPromptVariables, setNewPromptVariables] = React.useState<PromptVariable[]>(promptVariables)
+  const [newTemplates, setNewTemplates] = React.useState('')
+  const [isShowConfirmAddVar, { setTrue: showConfirmAddVar, setFalse: hideConfirmAddVar }] = useBoolean(false)
+
+  const handleChange = (newTemplates: string, keys: string[]) => {
+    const newPromptVariables = keys.filter(key => !(key in promptVariablesObj) && !externalDataToolsConfig.find(item => item.variable === key)).map(key => getNewVar(key, ''))
+    if (newPromptVariables.length > 0) {
+      setNewPromptVariables(newPromptVariables)
+      setNewTemplates(newTemplates)
+      showConfirmAddVar()
+      return
+    }
+    onChange?.(newTemplates, [])
+  }
+
+  const handleAutoAdd = (isAdd: boolean) => {
+    return () => {
+      onChange?.(newTemplates, isAdd ? newPromptVariables : [])
+      hideConfirmAddVar()
+    }
+  }
+
+  const [showAutomatic, { setTrue: showAutomaticTrue, setFalse: showAutomaticFalse }] = useBoolean(false)
+  const handleAutomaticRes = (res: AutomaticRes) => {
+    // put eventEmitter in first place to prevent overwrite the configs.prompt_variables.But another problem is that prompt won't hight the prompt_variables.
+    eventEmitter?.emit({
+      type: PROMPT_EDITOR_UPDATE_VALUE_BY_EVENT_EMITTER,
+      payload: res.prompt,
+    } as any)
+    const newModelConfig = produce(modelConfig, (draft) => {
+      draft.configs.prompt_template = res.prompt
+      draft.configs.prompt_variables = res.variables.map(key => ({ key, name: key, type: 'string', required: true }))
+    })
+    setModelConfig(newModelConfig)
+    setPrevPromptConfig(modelConfig.configs)
+
+    if (mode !== AppType.completion) {
+      setIntroduction(res.opening_statement)
+      const newFeatures = produce(features, (draft) => {
+        draft.opening = {
+          ...draft.opening,
+          enabled: !!res.opening_statement,
+          opening_statement: res.opening_statement,
+        }
+      })
+      setFeatures(newFeatures)
+    }
+    showAutomaticFalse()
+  }
+  const minHeight = initEditorHeight || 228
+  const [editorHeight, setEditorHeight] = useState(minHeight)
+
+  return (
+    <div className={cn('relative rounded-xl bg-gradient-to-r from-components-input-border-active-prompt-1 to-components-input-border-active-prompt-2 p-0.5 shadow-xs')}>
+      <div className='rounded-xl bg-background-section-burn'>
+        {!noTitle && (
+          <div className="flex h-11 items-center justify-between pl-3 pr-2.5">
+            <div className="flex items-center space-x-1">
+              <div className='h2 system-sm-semibold-uppercase text-text-secondary'>{mode !== AppType.completion ? t('appDebug.chatSubTitle') : t('appDebug.completionSubTitle')}</div>
+              {!readonly && (
+                <Tooltip
+                  popupContent={
+                    <div className='w-[180px]'>
+                      {t('appDebug.promptTip')}
+                    </div>
+                  }
+                />
+              )}
+            </div>
+            <div className='flex items-center'>
+              {!readonly && !isMobile && (
+                <AutomaticBtn onClick={showAutomaticTrue} />
+              )}
+            </div>
+          </div>
+        )}
+
+        <PromptEditorHeightResizeWrap
+          className='min-h-[228px] rounded-t-xl bg-background-default px-4 pt-2 text-sm text-text-secondary'
+          height={editorHeight}
+          minHeight={minHeight}
+          onHeightChange={setEditorHeight}
+          hideResize={noResize}
+          footer={(
+            <div className='flex rounded-b-xl bg-background-default pb-2 pl-4'>
+              <div className="h-[18px] rounded-md bg-components-badge-bg-gray-soft px-1 text-xs leading-[18px] text-text-tertiary">{promptTemplate.length}</div>
+            </div>
+          )}
+        >
+          <PromptEditor
+            className='min-h-[210px]'
+            compact
+            value={promptTemplate}
+            contextBlock={{
+              show: false,
+              selectable: !hasSetBlockStatus.context,
+              datasets: dataSets.map(item => ({
+                id: item.id,
+                name: item.name,
+                type: item.data_source_type,
+              })),
+              onAddContext: showSelectDataSet,
+            }}
+            variableBlock={{
+              show: true,
+              variables: modelConfig.configs.prompt_variables.filter(item => item.type !== 'api').map(item => ({
+                name: item.name,
+                value: item.key,
+              })),
+            }}
+            externalToolBlock={{
+              show: true,
+              externalTools: modelConfig.configs.prompt_variables.filter(item => item.type === 'api').map(item => ({
+                name: item.name,
+                variableName: item.key,
+                icon: item.icon,
+                icon_background: item.icon_background,
+              })),
+              onAddExternalTool: handleOpenExternalDataToolModal,
+            }}
+            historyBlock={{
+              show: false,
+              selectable: false,
+              history: {
+                user: '',
+                assistant: '',
+              },
+              onEditRole: noop,
+            }}
+            queryBlock={{
+              show: false,
+              selectable: !hasSetBlockStatus.query,
+            }}
+            onChange={(value) => {
+              if (handleChange)
+                handleChange(value, [])
+            }}
+            onBlur={() => {
+              handleChange(promptTemplate, getVars(promptTemplate))
+            }}
+            editable={!readonly}
+          />
+        </PromptEditorHeightResizeWrap>
+      </div>
+
+      {isShowConfirmAddVar && (
+        <ConfirmAddVar
+          varNameArr={newPromptVariables.map(v => v.name)}
+          onConfirm={handleAutoAdd(true)}
+          onCancel={handleAutoAdd(false)}
+          onHide={hideConfirmAddVar}
+        />
+      )}
+
+      {showAutomatic && (
+        <GetAutomaticResModal
+          mode={mode as AppType}
+          model={
+            {
+              provider: modelConfig.provider,
+              name: modelConfig.model_id,
+              mode: modelConfig.mode,
+              completion_params: completionParams as CompletionParams,
+            }
+          }
+          isShow={showAutomatic}
+          onClose={showAutomaticFalse}
+          onFinished={handleAutomaticRes}
+        />
+      )}
+    </div>
+  )
+}
+
+export default React.memo(Prompt)
diff --git a/app/components/app/configuration/config-prompt/style.module.css b/app/components/app/configuration/config-prompt/style.module.css
new file mode 100644
index 0000000..224d59d
--- /dev/null
+++ b/app/components/app/configuration/config-prompt/style.module.css
@@ -0,0 +1,28 @@
+.gradientBorder {
+  background: radial-gradient(circle at 100% 100%, #fcfcfd 0, #fcfcfd 10px, transparent 10px) 0% 0%/12px 12px no-repeat,
+            radial-gradient(circle at 0 100%, #fcfcfd 0, #fcfcfd 10px, transparent 10px) 100% 0%/12px 12px no-repeat,
+            radial-gradient(circle at 100% 0, #fcfcfd 0, #fcfcfd 10px, transparent 10px) 0% 100%/12px 12px no-repeat,
+            radial-gradient(circle at 0 0, #fcfcfd 0, #fcfcfd 10px, transparent 10px) 100% 100%/12px 12px no-repeat,
+            linear-gradient(#fcfcfd, #fcfcfd) 50% 50%/calc(100% - 4px) calc(100% - 24px) no-repeat,
+            linear-gradient(#fcfcfd, #fcfcfd) 50% 50%/calc(100% - 24px) calc(100% - 4px) no-repeat,
+            radial-gradient(at 100% 100%, rgba(45,13,238,0.8) 0%, transparent 70%),
+            radial-gradient(at 100% 0%, rgba(45,13,238,0.8) 0%, transparent 70%),
+            radial-gradient(at 0% 0%, rgba(42,135,245,0.8) 0%, transparent 70%),
+            radial-gradient(at 0% 100%, rgba(42,135,245,0.8) 0%, transparent 70%);
+  border-radius: 12px;
+  padding: 2px;
+  box-sizing: border-box;
+}
+
+.warningBorder {
+  border: 2px solid #F79009;
+  border-radius: 12px;
+}
+
+.optionWrap {
+  display: none;
+}
+
+.boxHeader:hover .optionWrap {
+  display: flex;
+}
diff --git a/app/components/app/configuration/config-var/config-modal/field.tsx b/app/components/app/configuration/config-var/config-modal/field.tsx
new file mode 100644
index 0000000..78bd2d9
--- /dev/null
+++ b/app/components/app/configuration/config-var/config-modal/field.tsx
@@ -0,0 +1,24 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+
+type Props = {
+  className?: string
+  title: string
+  children: React.JSX.Element
+}
+
+const Field: FC<Props> = ({
+  className,
+  title,
+  children,
+}) => {
+  return (
+    <div className={cn(className)}>
+      <div className='system-sm-semibold leading-8 text-text-secondary'>{title}</div>
+      <div>{children}</div>
+    </div>
+  )
+}
+export default React.memo(Field)
diff --git a/app/components/app/configuration/config-var/config-modal/index.tsx b/app/components/app/configuration/config-var/config-modal/index.tsx
new file mode 100644
index 0000000..4b6bfda
--- /dev/null
+++ b/app/components/app/configuration/config-var/config-modal/index.tsx
@@ -0,0 +1,249 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import produce from 'immer'
+import ModalFoot from '../modal-foot'
+import ConfigSelect from '../config-select'
+import ConfigString from '../config-string'
+import SelectTypeItem from '../select-type-item'
+import Field from './field'
+import Input from '@/app/components/base/input'
+import Toast from '@/app/components/base/toast'
+import { checkKeys, getNewVarInWorkflow } from '@/utils/var'
+import ConfigContext from '@/context/debug-configuration'
+import type { InputVar, MoreInfo, UploadFileSetting } from '@/app/components/workflow/types'
+import Modal from '@/app/components/base/modal'
+import { ChangeType, InputVarType, SupportUploadFileTypes } from '@/app/components/workflow/types'
+import FileUploadSetting from '@/app/components/workflow/nodes/_base/components/file-upload-setting'
+import Checkbox from '@/app/components/base/checkbox'
+import { DEFAULT_FILE_UPLOAD_SETTING } from '@/app/components/workflow/constants'
+import { DEFAULT_VALUE_MAX_LEN } from '@/config'
+
+const TEXT_MAX_LENGTH = 256
+
+export type IConfigModalProps = {
+  isCreate?: boolean
+  payload?: InputVar
+  isShow: boolean
+  varKeys?: string[]
+  onClose: () => void
+  onConfirm: (newValue: InputVar, moreInfo?: MoreInfo) => void
+  supportFile?: boolean
+}
+
+const ConfigModal: FC<IConfigModalProps> = ({
+  isCreate,
+  payload,
+  isShow,
+  onClose,
+  onConfirm,
+  supportFile,
+}) => {
+  const { modelConfig } = useContext(ConfigContext)
+  const { t } = useTranslation()
+  const [tempPayload, setTempPayload] = useState<InputVar>(payload || getNewVarInWorkflow('') as any)
+  const { type, label, variable, options, max_length } = tempPayload
+  const modalRef = useRef<HTMLDivElement>(null)
+  useEffect(() => {
+    // To fix the first input element auto focus, then directly close modal will raise error
+    if (isShow)
+      modalRef.current?.focus()
+  }, [isShow])
+
+  const isStringInput = type === InputVarType.textInput || type === InputVarType.paragraph
+  const checkVariableName = useCallback((value: string, canBeEmpty?: boolean) => {
+    const { isValid, errorMessageKey } = checkKeys([value], canBeEmpty)
+    if (!isValid) {
+      Toast.notify({
+        type: 'error',
+        message: t(`appDebug.varKeyError.${errorMessageKey}`, { key: t('appDebug.variableConfig.varName') }),
+      })
+      return false
+    }
+    return true
+  }, [t])
+  const handlePayloadChange = useCallback((key: string) => {
+    return (value: any) => {
+      setTempPayload((prev) => {
+        const newPayload = {
+          ...prev,
+          [key]: value,
+        }
+
+        return newPayload
+      })
+    }
+  }, [])
+
+  const handleTypeChange = useCallback((type: InputVarType) => {
+    return () => {
+      const newPayload = produce(tempPayload, (draft) => {
+        draft.type = type
+        if ([InputVarType.singleFile, InputVarType.multiFiles].includes(type)) {
+          (Object.keys(DEFAULT_FILE_UPLOAD_SETTING)).forEach((key) => {
+            if (key !== 'max_length')
+              (draft as any)[key] = (DEFAULT_FILE_UPLOAD_SETTING as any)[key]
+          })
+          if (type === InputVarType.multiFiles)
+            draft.max_length = DEFAULT_FILE_UPLOAD_SETTING.max_length
+        }
+        if (type === InputVarType.paragraph)
+          draft.max_length = DEFAULT_VALUE_MAX_LEN
+      })
+      setTempPayload(newPayload)
+    }
+  }, [tempPayload])
+
+  const handleVarKeyBlur = useCallback((e: any) => {
+    const varName = e.target.value
+    if (!checkVariableName(varName, true) || tempPayload.label)
+      return
+
+    setTempPayload((prev) => {
+      return {
+        ...prev,
+        label: varName,
+      }
+    })
+  }, [checkVariableName, tempPayload.label])
+
+  const handleConfirm = () => {
+    const moreInfo = tempPayload.variable === payload?.variable
+      ? undefined
+      : {
+        type: ChangeType.changeVarName,
+        payload: { beforeKey: payload?.variable || '', afterKey: tempPayload.variable },
+      }
+
+    const isVariableNameValid = checkVariableName(tempPayload.variable)
+    if (!isVariableNameValid)
+      return
+
+    // TODO: check if key already exists. should the consider the edit case
+    // if (varKeys.map(key => key?.trim()).includes(tempPayload.variable.trim())) {
+    //   Toast.notify({
+    //     type: 'error',
+    //     message: t('appDebug.varKeyError.keyAlreadyExists', { key: tempPayload.variable }),
+    //   })
+    //   return
+    // }
+
+    if (!tempPayload.label) {
+      Toast.notify({ type: 'error', message: t('appDebug.variableConfig.errorMsg.labelNameRequired') })
+      return
+    }
+    if (isStringInput || type === InputVarType.number) {
+      onConfirm(tempPayload, moreInfo)
+    }
+    else if (type === InputVarType.select) {
+      if (options?.length === 0) {
+        Toast.notify({ type: 'error', message: t('appDebug.variableConfig.errorMsg.atLeastOneOption') })
+        return
+      }
+      const obj: Record<string, boolean> = {}
+      let hasRepeatedItem = false
+      options?.forEach((o) => {
+        if (obj[o]) {
+          hasRepeatedItem = true
+          return
+        }
+        obj[o] = true
+      })
+      if (hasRepeatedItem) {
+        Toast.notify({ type: 'error', message: t('appDebug.variableConfig.errorMsg.optionRepeat') })
+        return
+      }
+      onConfirm(tempPayload, moreInfo)
+    }
+    else if ([InputVarType.singleFile, InputVarType.multiFiles].includes(type)) {
+      if (tempPayload.allowed_file_types?.length === 0) {
+        const errorMessages = t('workflow.errorMsg.fieldRequired', { field: t('appDebug.variableConfig.file.supportFileTypes') })
+        Toast.notify({ type: 'error', message: errorMessages })
+        return
+      }
+      if (tempPayload.allowed_file_types?.includes(SupportUploadFileTypes.custom) && !tempPayload.allowed_file_extensions?.length) {
+        const errorMessages = t('workflow.errorMsg.fieldRequired', { field: t('appDebug.variableConfig.file.custom.name') })
+        Toast.notify({ type: 'error', message: errorMessages })
+        return
+      }
+      onConfirm(tempPayload, moreInfo)
+    }
+    else {
+      onConfirm(tempPayload, moreInfo)
+    }
+  }
+
+  return (
+    <Modal
+      title={t(`appDebug.variableConfig.${isCreate ? 'addModalTitle' : 'editModalTitle'}`)}
+      isShow={isShow}
+      onClose={onClose}
+    >
+      <div className='mb-8' ref={modalRef} tabIndex={-1}>
+        <div className='space-y-2'>
+
+          <Field title={t('appDebug.variableConfig.fieldType')}>
+            <div className='grid grid-cols-3 gap-2'>
+              <SelectTypeItem type={InputVarType.textInput} selected={type === InputVarType.textInput} onClick={handleTypeChange(InputVarType.textInput)} />
+              <SelectTypeItem type={InputVarType.paragraph} selected={type === InputVarType.paragraph} onClick={handleTypeChange(InputVarType.paragraph)} />
+              <SelectTypeItem type={InputVarType.select} selected={type === InputVarType.select} onClick={handleTypeChange(InputVarType.select)} />
+              <SelectTypeItem type={InputVarType.number} selected={type === InputVarType.number} onClick={handleTypeChange(InputVarType.number)} />
+              {supportFile && <>
+                <SelectTypeItem type={InputVarType.singleFile} selected={type === InputVarType.singleFile} onClick={handleTypeChange(InputVarType.singleFile)} />
+                <SelectTypeItem type={InputVarType.multiFiles} selected={type === InputVarType.multiFiles} onClick={handleTypeChange(InputVarType.multiFiles)} />
+              </>}
+            </div>
+          </Field>
+
+          <Field title={t('appDebug.variableConfig.varName')}>
+            <Input
+              value={variable}
+              onChange={e => handlePayloadChange('variable')(e.target.value)}
+              onBlur={handleVarKeyBlur}
+              placeholder={t('appDebug.variableConfig.inputPlaceholder')!}
+            />
+          </Field>
+          <Field title={t('appDebug.variableConfig.labelName')}>
+            <Input
+              value={label as string}
+              onChange={e => handlePayloadChange('label')(e.target.value)}
+              placeholder={t('appDebug.variableConfig.inputPlaceholder')!}
+            />
+          </Field>
+
+          {isStringInput && (
+            <Field title={t('appDebug.variableConfig.maxLength')}>
+              <ConfigString maxLength={type === InputVarType.textInput ? TEXT_MAX_LENGTH : Infinity} modelId={modelConfig.model_id} value={max_length} onChange={handlePayloadChange('max_length')} />
+            </Field>
+
+          )}
+          {type === InputVarType.select && (
+            <Field title={t('appDebug.variableConfig.options')}>
+              <ConfigSelect options={options || []} onChange={handlePayloadChange('options')} />
+            </Field>
+          )}
+
+          {[InputVarType.singleFile, InputVarType.multiFiles].includes(type) && (
+            <FileUploadSetting
+              payload={tempPayload as UploadFileSetting}
+              onChange={(p: UploadFileSetting) => setTempPayload(p as InputVar)}
+              isMultiple={type === InputVarType.multiFiles}
+            />
+          )}
+
+          <div className='!mt-5 flex h-6 items-center space-x-2'>
+            <Checkbox checked={tempPayload.required} onCheck={() => handlePayloadChange('required')(!tempPayload.required)} />
+            <span className='system-sm-semibold text-text-secondary'>{t('appDebug.variableConfig.required')}</span>
+          </div>
+        </div>
+      </div>
+      <ModalFoot
+        onConfirm={handleConfirm}
+        onCancel={onClose}
+      />
+    </Modal>
+  )
+}
+export default React.memo(ConfigModal)
diff --git a/app/components/app/configuration/config-var/config-select/index.spec.tsx b/app/components/app/configuration/config-var/config-select/index.spec.tsx
new file mode 100644
index 0000000..18df318
--- /dev/null
+++ b/app/components/app/configuration/config-var/config-select/index.spec.tsx
@@ -0,0 +1,82 @@
+import { fireEvent, render, screen } from '@testing-library/react'
+import ConfigSelect from './index'
+
+jest.mock('react-sortablejs', () => ({
+  ReactSortable: ({ children }: { children: React.ReactNode }) => <div>{children}</div>,
+}))
+
+jest.mock('react-i18next', () => ({
+  useTranslation: () => ({
+    t: (key: string) => key,
+  }),
+}))
+
+describe('ConfigSelect Component', () => {
+  const defaultProps = {
+    options: ['Option 1', 'Option 2'],
+    onChange: jest.fn(),
+  }
+
+  afterEach(() => {
+    jest.clearAllMocks()
+  })
+
+  it('renders all options', () => {
+    render(<ConfigSelect {...defaultProps} />)
+
+    defaultProps.options.forEach((option) => {
+      expect(screen.getByDisplayValue(option)).toBeInTheDocument()
+    })
+  })
+
+  it('renders add button', () => {
+    render(<ConfigSelect {...defaultProps} />)
+
+    expect(screen.getByText('appDebug.variableConfig.addOption')).toBeInTheDocument()
+  })
+
+  it('handles option deletion', () => {
+    render(<ConfigSelect {...defaultProps} />)
+    const optionContainer = screen.getByDisplayValue('Option 1').closest('div')
+    const deleteButton = optionContainer?.querySelector('div[role="button"]')
+
+    if (!deleteButton) return
+    fireEvent.click(deleteButton)
+    expect(defaultProps.onChange).toHaveBeenCalledWith(['Option 2'])
+  })
+
+  it('handles adding new option', () => {
+    render(<ConfigSelect {...defaultProps} />)
+    const addButton = screen.getByText('appDebug.variableConfig.addOption')
+
+    fireEvent.click(addButton)
+
+    expect(defaultProps.onChange).toHaveBeenCalledWith([...defaultProps.options, ''])
+  })
+
+  it('applies focus styles on input focus', () => {
+    render(<ConfigSelect {...defaultProps} />)
+    const firstInput = screen.getByDisplayValue('Option 1')
+
+    fireEvent.focus(firstInput)
+
+    expect(firstInput.closest('div')).toHaveClass('border-components-input-border-active')
+  })
+
+  it('applies delete hover styles', () => {
+    render(<ConfigSelect {...defaultProps} />)
+    const optionContainer = screen.getByDisplayValue('Option 1').closest('div')
+    const deleteButton = optionContainer?.querySelector('div[role="button"]')
+
+    if (!deleteButton) return
+    fireEvent.mouseEnter(deleteButton)
+    expect(optionContainer).toHaveClass('border-components-input-border-destructive')
+  })
+
+  it('renders empty state correctly', () => {
+    render(<ConfigSelect options={[]} onChange={defaultProps.onChange} />)
+
+    expect(screen.queryByRole('textbox')).not.toBeInTheDocument()
+    expect(screen.getByText('appDebug.variableConfig.addOption')).toBeInTheDocument()
+  })
+})
diff --git a/app/components/app/configuration/config-var/config-select/index.tsx b/app/components/app/configuration/config-var/config-select/index.tsx
new file mode 100644
index 0000000..40ddaef
--- /dev/null
+++ b/app/components/app/configuration/config-var/config-select/index.tsx
@@ -0,0 +1,96 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { RiAddLine, RiDeleteBinLine, RiDraggable } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { ReactSortable } from 'react-sortablejs'
+import cn from '@/utils/classnames'
+
+export type Options = string[]
+export type IConfigSelectProps = {
+  options: Options
+  onChange: (options: Options) => void
+}
+
+const ConfigSelect: FC<IConfigSelectProps> = ({
+  options,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const [focusID, setFocusID] = useState<number | null>(null)
+  const [deletingID, setDeletingID] = useState<number | null>(null)
+
+  const optionList = options.map((content, index) => {
+    return ({
+      id: index,
+      name: content,
+    })
+  })
+
+  return (
+    <div>
+      {options.length > 0 && (
+        <div className='mb-1'>
+          <ReactSortable
+            className="space-y-1"
+            list={optionList}
+            setList={list => onChange(list.map(item => item.name))}
+            handle='.handle'
+            ghostClass="opacity-50"
+            animation={150}
+          >
+            {options.map((o, index) => (
+              <div
+                className={cn(
+                  'group relative flex items-center rounded-lg border border-components-panel-border-subtle bg-components-panel-on-panel-item-bg pl-2.5 hover:bg-components-panel-on-panel-item-bg-hover',
+                  focusID === index && 'border-components-input-border-active bg-components-input-bg-active hover:border-components-input-border-active hover:bg-components-input-bg-active',
+                  deletingID === index && 'border-components-input-border-destructive bg-state-destructive-hover hover:border-components-input-border-destructive hover:bg-state-destructive-hover',
+                )}
+                key={index}
+              >
+                <RiDraggable className='handle h-4 w-4 cursor-grab text-text-quaternary' />
+                <input
+                  key={index}
+                  type='input'
+                  value={o || ''}
+                  onChange={(e) => {
+                    const value = e.target.value
+                    onChange(options.map((item, i) => {
+                      if (index === i)
+                        return value
+
+                      return item
+                    }))
+                  }}
+                  className={'h-9 w-full grow cursor-pointer overflow-x-auto rounded-lg border-0 bg-transparent pl-1.5 pr-8 text-sm leading-9 text-text-secondary focus:outline-none'}
+                  onFocus={() => setFocusID(index)}
+                  onBlur={() => setFocusID(null)}
+                />
+                <div
+                  role='button'
+                  className='absolute right-1.5 top-1/2 block translate-y-[-50%] cursor-pointer rounded-md p-1 text-text-tertiary hover:bg-state-destructive-hover hover:text-text-destructive'
+                  onClick={() => {
+                    onChange(options.filter((_, i) => index !== i))
+                  }}
+                  onMouseEnter={() => setDeletingID(index)}
+                  onMouseLeave={() => setDeletingID(null)}
+                >
+                  <RiDeleteBinLine className='h-3.5 w-3.5' />
+                </div>
+              </div>
+            ))}
+          </ReactSortable>
+        </div>
+      )}
+
+      <div
+        onClick={() => { onChange([...options, '']) }}
+        className='mt-1 flex h-9 cursor-pointer items-center gap-2 rounded-lg bg-components-button-tertiary-bg px-3  text-components-button-tertiary-text hover:bg-components-button-tertiary-bg-hover'>
+        <RiAddLine className='h-4 w-4' />
+        <div className='system-sm-medium text-[13px]'>{t('appDebug.variableConfig.addOption')}</div>
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(ConfigSelect)
diff --git a/app/components/app/configuration/config-var/config-string/index.tsx b/app/components/app/configuration/config-var/config-string/index.tsx
new file mode 100644
index 0000000..78f185b
--- /dev/null
+++ b/app/components/app/configuration/config-var/config-string/index.tsx
@@ -0,0 +1,45 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect } from 'react'
+import Input from '@/app/components/base/input'
+
+export type IConfigStringProps = {
+  value: number | undefined
+  maxLength: number
+  modelId: string
+  onChange: (value: number | undefined) => void
+}
+
+const ConfigString: FC<IConfigStringProps> = ({
+  value,
+  onChange,
+  maxLength,
+}) => {
+  useEffect(() => {
+    if (value && value > maxLength)
+      onChange(maxLength)
+  }, [value, maxLength, onChange])
+
+  return (
+    <div>
+      <Input
+        type="number"
+        max={maxLength}
+        min={1}
+        value={value || ''}
+        onChange={(e) => {
+          let value = Number.parseInt(e.target.value, 10)
+          if (value > maxLength)
+            value = maxLength
+
+          else if (value < 1)
+            value = 1
+
+          onChange(value)
+        }}
+      />
+    </div>
+  )
+}
+
+export default React.memo(ConfigString)
diff --git a/app/components/app/configuration/config-var/index.tsx b/app/components/app/configuration/config-var/index.tsx
new file mode 100644
index 0000000..612d476
--- /dev/null
+++ b/app/components/app/configuration/config-var/index.tsx
@@ -0,0 +1,271 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import { useContext } from 'use-context-selector'
+import produce from 'immer'
+import Panel from '../base/feature-panel'
+import EditModal from './config-modal'
+import VarItem from './var-item'
+import SelectVarType from './select-var-type'
+import Tooltip from '@/app/components/base/tooltip'
+import type { PromptVariable } from '@/models/debug'
+import { DEFAULT_VALUE_MAX_LEN } from '@/config'
+import { getNewVar } from '@/utils/var'
+import Toast from '@/app/components/base/toast'
+import Confirm from '@/app/components/base/confirm'
+import ConfigContext from '@/context/debug-configuration'
+import { AppType } from '@/types/app'
+import type { ExternalDataTool } from '@/models/common'
+import { useModalContext } from '@/context/modal-context'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import type { InputVar } from '@/app/components/workflow/types'
+import { InputVarType } from '@/app/components/workflow/types'
+
+export const ADD_EXTERNAL_DATA_TOOL = 'ADD_EXTERNAL_DATA_TOOL'
+
+type ExternalDataToolParams = {
+  key: string
+  type: string
+  index: number
+  name: string
+  config?: Record<string, any>
+  icon?: string
+  icon_background?: string
+}
+
+export type IConfigVarProps = {
+  promptVariables: PromptVariable[]
+  readonly?: boolean
+  onPromptVariablesChange?: (promptVariables: PromptVariable[]) => void
+}
+
+const ConfigVar: FC<IConfigVarProps> = ({ promptVariables, readonly, onPromptVariablesChange }) => {
+  const { t } = useTranslation()
+  const {
+    mode,
+    dataSets,
+  } = useContext(ConfigContext)
+  const { eventEmitter } = useEventEmitterContextContext()
+
+  const hasVar = promptVariables.length > 0
+  const [currIndex, setCurrIndex] = useState<number>(-1)
+  const currItem = currIndex !== -1 ? promptVariables[currIndex] : null
+  const currItemToEdit: InputVar | null = (() => {
+    if (!currItem)
+      return null
+
+    return {
+      ...currItem,
+      label: currItem.name,
+      variable: currItem.key,
+      type: currItem.type === 'string' ? InputVarType.textInput : currItem.type,
+    } as InputVar
+  })()
+  const updatePromptVariableItem = (payload: InputVar) => {
+    const newPromptVariables = produce(promptVariables, (draft) => {
+      const { variable, label, type, ...rest } = payload
+      draft[currIndex] = {
+        ...rest,
+        type: type === InputVarType.textInput ? 'string' : type,
+        key: variable,
+        name: label as string,
+      }
+
+      if (payload.type === InputVarType.textInput)
+        draft[currIndex].max_length = draft[currIndex].max_length || DEFAULT_VALUE_MAX_LEN
+
+      if (payload.type !== InputVarType.select)
+        delete draft[currIndex].options
+    })
+
+    onPromptVariablesChange?.(newPromptVariables)
+  }
+
+  const { setShowExternalDataToolModal } = useModalContext()
+
+  const handleOpenExternalDataToolModal = (
+    { key, type, index, name, config, icon, icon_background }: ExternalDataToolParams,
+    oldPromptVariables: PromptVariable[],
+  ) => {
+    setShowExternalDataToolModal({
+      payload: {
+        type,
+        variable: key,
+        label: name,
+        config,
+        icon,
+        icon_background,
+      },
+      onSaveCallback: (newExternalDataTool: ExternalDataTool) => {
+        const newPromptVariables = oldPromptVariables.map((item, i) => {
+          if (i === index) {
+            return {
+              key: newExternalDataTool.variable as string,
+              name: newExternalDataTool.label as string,
+              enabled: newExternalDataTool.enabled,
+              type: newExternalDataTool.type as string,
+              config: newExternalDataTool.config,
+              required: item.required,
+              icon: newExternalDataTool.icon,
+              icon_background: newExternalDataTool.icon_background,
+            }
+          }
+          return item
+        })
+        onPromptVariablesChange?.(newPromptVariables)
+      },
+      onCancelCallback: () => {
+        if (!key)
+          onPromptVariablesChange?.(promptVariables.filter((_, i) => i !== index))
+      },
+      onValidateBeforeSaveCallback: (newExternalDataTool: ExternalDataTool) => {
+        for (let i = 0; i < promptVariables.length; i++) {
+          if (promptVariables[i].key === newExternalDataTool.variable && i !== index) {
+            Toast.notify({ type: 'error', message: t('appDebug.varKeyError.keyAlreadyExists', { key: promptVariables[i].key }) })
+            return false
+          }
+        }
+
+        return true
+      },
+    })
+  }
+
+  const handleAddVar = (type: string) => {
+    const newVar = getNewVar('', type)
+    const newPromptVariables = [...promptVariables, newVar]
+    onPromptVariablesChange?.(newPromptVariables)
+
+    if (type === 'api') {
+      handleOpenExternalDataToolModal({
+        type,
+        key: newVar.key,
+        name: newVar.name,
+        index: promptVariables.length,
+      }, newPromptVariables)
+    }
+  }
+
+  eventEmitter?.useSubscription((v: any) => {
+    if (v.type === ADD_EXTERNAL_DATA_TOOL) {
+      const payload = v.payload
+      onPromptVariablesChange?.([
+        ...promptVariables,
+        {
+          key: payload.variable as string,
+          name: payload.label as string,
+          enabled: payload.enabled,
+          type: payload.type as string,
+          config: payload.config,
+          required: true,
+          icon: payload.icon,
+          icon_background: payload.icon_background,
+        },
+      ])
+    }
+  })
+
+  const [isShowDeleteContextVarModal, { setTrue: showDeleteContextVarModal, setFalse: hideDeleteContextVarModal }] = useBoolean(false)
+  const [removeIndex, setRemoveIndex] = useState<number | null>(null)
+  const didRemoveVar = (index: number) => {
+    onPromptVariablesChange?.(promptVariables.filter((_, i) => i !== index))
+  }
+
+  const handleRemoveVar = (index: number) => {
+    const removeVar = promptVariables[index]
+
+    if (mode === AppType.completion && dataSets.length > 0 && removeVar.is_context_var) {
+      showDeleteContextVarModal()
+      setRemoveIndex(index)
+      return
+    }
+    didRemoveVar(index)
+  }
+
+  // const [currKey, setCurrKey] = useState<string | null>(null)
+  const [isShowEditModal, { setTrue: showEditModal, setFalse: hideEditModal }] = useBoolean(false)
+
+  const handleConfig = ({ key, type, index, name, config, icon, icon_background }: ExternalDataToolParams) => {
+    // setCurrKey(key)
+    setCurrIndex(index)
+    if (type !== 'string' && type !== 'paragraph' && type !== 'select' && type !== 'number') {
+      handleOpenExternalDataToolModal({ key, type, index, name, config, icon, icon_background }, promptVariables)
+      return
+    }
+
+    showEditModal()
+  }
+  return (
+    <Panel
+      className="mt-2"
+      title={
+        <div className='flex items-center'>
+          <div className='mr-1'>{t('appDebug.variableTitle')}</div>
+          {!readonly && (
+            <Tooltip
+              popupContent={
+                <div className='w-[180px]'>
+                  {t('appDebug.variableTip')}
+                </div>
+              }
+            />
+          )}
+        </div>
+      }
+      headerRight={!readonly ? <SelectVarType onChange={handleAddVar} /> : null}
+      noBodySpacing
+    >
+      {!hasVar && (
+        <div className='mt-1 px-3 pb-3'>
+          <div className='pb-1 pt-2 text-xs text-text-tertiary'>{t('appDebug.notSetVar')}</div>
+        </div>
+      )}
+      {hasVar && (
+        <div className='mt-1 px-3 pb-3'>
+          {promptVariables.map(({ key, name, type, required, config, icon, icon_background }, index) => (
+            <VarItem
+              key={index}
+              readonly={readonly}
+              name={key}
+              label={name}
+              required={!!required}
+              type={type}
+              onEdit={() => handleConfig({ type, key, index, name, config, icon, icon_background })}
+              onRemove={() => handleRemoveVar(index)}
+            />
+          ))}
+        </div>
+      )}
+
+      {isShowEditModal && (
+        <EditModal
+          payload={currItemToEdit!}
+          isShow={isShowEditModal}
+          onClose={hideEditModal}
+          onConfirm={(item) => {
+            updatePromptVariableItem(item)
+            hideEditModal()
+          }}
+          varKeys={promptVariables.map(v => v.key)}
+        />
+      )}
+
+      {isShowDeleteContextVarModal && (
+        <Confirm
+          isShow={isShowDeleteContextVarModal}
+          title={t('appDebug.feature.dataSet.queryVariable.deleteContextVarTitle', { varName: promptVariables[removeIndex as number]?.name })}
+          content={t('appDebug.feature.dataSet.queryVariable.deleteContextVarTip')}
+          onConfirm={() => {
+            didRemoveVar(removeIndex as number)
+            hideDeleteContextVarModal()
+          }}
+          onCancel={hideDeleteContextVarModal}
+        />
+      )}
+
+    </Panel>
+  )
+}
+export default React.memo(ConfigVar)
diff --git a/app/components/app/configuration/config-var/input-type-icon.tsx b/app/components/app/configuration/config-var/input-type-icon.tsx
new file mode 100644
index 0000000..edd2dc6
--- /dev/null
+++ b/app/components/app/configuration/config-var/input-type-icon.tsx
@@ -0,0 +1,44 @@
+'use client'
+import React from 'react'
+import type { FC } from 'react'
+import { ApiConnection } from '@/app/components/base/icons/src/vender/solid/development'
+import InputVarTypeIcon from '@/app/components/workflow/nodes/_base/components/input-var-type-icon'
+import { InputVarType } from '@/app/components/workflow/types'
+
+export type IInputTypeIconProps = {
+  type: 'string' | 'select'
+  className: string
+}
+
+const IconMap = (type: IInputTypeIconProps['type'], className: string) => {
+  const classNames = `w-3.5 h-3.5 ${className}`
+  const icons = {
+    string: (
+      <InputVarTypeIcon type={InputVarType.textInput} className={classNames} />
+    ),
+    paragraph: (
+      <InputVarTypeIcon type={InputVarType.paragraph} className={classNames} />
+    ),
+    select: (
+      <InputVarTypeIcon type={InputVarType.select} className={classNames} />
+    ),
+    number: (
+      <InputVarTypeIcon type={InputVarType.number} className={classNames} />
+    ),
+    api: (
+      <ApiConnection className={classNames} />
+    ),
+  }
+
+  return icons[type]
+}
+
+const InputTypeIcon: FC<IInputTypeIconProps> = ({
+  type,
+  className,
+}) => {
+  const Icon = IconMap(type, className)
+  return Icon
+}
+
+export default React.memo(InputTypeIcon)
diff --git a/app/components/app/configuration/config-var/modal-foot.tsx b/app/components/app/configuration/config-var/modal-foot.tsx
new file mode 100644
index 0000000..a73ebe4
--- /dev/null
+++ b/app/components/app/configuration/config-var/modal-foot.tsx
@@ -0,0 +1,24 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import Button from '@/app/components/base/button'
+
+export type IModalFootProps = {
+  onConfirm: () => void
+  onCancel: () => void
+}
+
+const ModalFoot: FC<IModalFootProps> = ({
+  onConfirm,
+  onCancel,
+}) => {
+  const { t } = useTranslation()
+  return (
+    <div className='flex justify-end gap-2'>
+      <Button onClick={onCancel}>{t('common.operation.cancel')}</Button>
+      <Button variant='primary' onClick={onConfirm}>{t('common.operation.save')}</Button>
+    </div>
+  )
+}
+export default React.memo(ModalFoot)
diff --git a/app/components/app/configuration/config-var/select-type-item/index.tsx b/app/components/app/configuration/config-var/select-type-item/index.tsx
new file mode 100644
index 0000000..a952bcf
--- /dev/null
+++ b/app/components/app/configuration/config-var/select-type-item/index.tsx
@@ -0,0 +1,41 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+import type { InputVarType } from '@/app/components/workflow/types'
+import InputVarTypeIcon from '@/app/components/workflow/nodes/_base/components/input-var-type-icon'
+export type ISelectTypeItemProps = {
+  type: InputVarType
+  selected: boolean
+  onClick: () => void
+}
+
+const i18nFileTypeMap: Record<string, string> = {
+  'file': 'single-file',
+  'file-list': 'multi-files',
+}
+
+const SelectTypeItem: FC<ISelectTypeItemProps> = ({
+  type,
+  selected,
+  onClick,
+}) => {
+  const { t } = useTranslation()
+  const typeName = t(`appDebug.variableConfig.${i18nFileTypeMap[type] || type}`)
+
+  return (
+    <div
+      className={cn(
+        'flex h-[58px] flex-col items-center justify-center space-y-1 rounded-lg border border-components-option-card-option-border bg-components-option-card-option-bg text-text-secondary',
+        selected ? 'system-xs-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg shadow-xs' : ' system-xs-regular cursor-pointer hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs')}
+      onClick={onClick}
+    >
+      <div className='shrink-0'>
+        <InputVarTypeIcon type={type} className='h-5 w-5' />
+      </div>
+      <span>{typeName}</span>
+    </div>
+  )
+}
+export default React.memo(SelectTypeItem)
diff --git a/app/components/app/configuration/config-var/select-var-type.tsx b/app/components/app/configuration/config-var/select-var-type.tsx
new file mode 100644
index 0000000..f82e931
--- /dev/null
+++ b/app/components/app/configuration/config-var/select-var-type.tsx
@@ -0,0 +1,79 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+import OperationBtn from '@/app/components/app/configuration/base/operation-btn'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { ApiConnection } from '@/app/components/base/icons/src/vender/solid/development'
+import InputVarTypeIcon from '@/app/components/workflow/nodes/_base/components/input-var-type-icon'
+import { InputVarType } from '@/app/components/workflow/types'
+
+type Props = {
+  onChange: (value: string) => void
+}
+
+type ItemProps = {
+  text: string
+  value: string
+  Icon?: any
+  type?: InputVarType
+  onClick: (value: string) => void
+}
+
+const SelectItem: FC<ItemProps> = ({ text, type, value, Icon, onClick }) => {
+  return (
+    <div
+      className='flex h-8 cursor-pointer items-center rounded-lg px-3 hover:bg-gray-50'
+      onClick={() => onClick(value)}
+    >
+      {Icon ? <Icon className='h-4 w-4 text-gray-500' /> : <InputVarTypeIcon type={type!} className='h-4 w-4 text-gray-500' />}
+      <div className='ml-2 truncate text-xs text-gray-600'>{text}</div>
+    </div>
+  )
+}
+
+const SelectVarType: FC<Props> = ({
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const handleChange = (value: string) => {
+    onChange(value)
+    setOpen(false)
+  }
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: 8,
+        crossAxis: -2,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+        <OperationBtn type='add' className={cn(open && 'bg-gray-200')} />
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent style={{ zIndex: 1000 }}>
+        <div className='min-w-[192px] rounded-lg border border-gray-200 bg-white shadow-lg'>
+          <div className='p-1'>
+            <SelectItem type={InputVarType.textInput} value='string' text={t('appDebug.variableConfig.string')} onClick={handleChange}></SelectItem>
+            <SelectItem type={InputVarType.paragraph} value='paragraph' text={t('appDebug.variableConfig.paragraph')} onClick={handleChange}></SelectItem>
+            <SelectItem type={InputVarType.select} value='select' text={t('appDebug.variableConfig.select')} onClick={handleChange}></SelectItem>
+            <SelectItem type={InputVarType.number} value='number' text={t('appDebug.variableConfig.number')} onClick={handleChange}></SelectItem>
+          </div>
+          <div className='h-[1px] bg-gray-100'></div>
+          <div className='p-1'>
+            <SelectItem Icon={ApiConnection} value='api' text={t('appDebug.variableConfig.apiBasedVar')} onClick={handleChange}></SelectItem>
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default React.memo(SelectVarType)
diff --git a/app/components/app/configuration/config-var/var-item.tsx b/app/components/app/configuration/config-var/var-item.tsx
new file mode 100644
index 0000000..78ed4b1
--- /dev/null
+++ b/app/components/app/configuration/config-var/var-item.tsx
@@ -0,0 +1,72 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import {
+  RiDeleteBinLine,
+  RiEditLine,
+} from '@remixicon/react'
+import type { IInputTypeIconProps } from './input-type-icon'
+import IconTypeIcon from './input-type-icon'
+import { BracketsX as VarIcon } from '@/app/components/base/icons/src/vender/line/development'
+import Badge from '@/app/components/base/badge'
+import cn from '@/utils/classnames'
+
+type ItemProps = {
+  readonly?: boolean
+  name: string
+  label: string
+  required: boolean
+  type: string
+  onEdit: () => void
+  onRemove: () => void
+}
+
+const VarItem: FC<ItemProps> = ({
+  readonly,
+  name,
+  label,
+  required,
+  type,
+  onEdit,
+  onRemove,
+}) => {
+  const [isDeleting, setIsDeleting] = useState(false)
+
+  return (
+    <div className={cn('group relative mb-1 flex h-[34px] w-full items-center  rounded-lg border-[0.5px] border-components-panel-border-subtle bg-components-panel-on-panel-item-bg pl-2.5 pr-3 shadow-xs last-of-type:mb-0 hover:bg-components-panel-on-panel-item-bg-hover hover:shadow-sm', isDeleting && 'border-state-destructive-border hover:bg-state-destructive-hover', readonly && 'cursor-not-allowed opacity-30')}>
+      <VarIcon className='mr-1 h-4 w-4 shrink-0 text-text-accent' />
+      <div className='flex w-0 grow items-center'>
+        <div className='truncate' title={`${name} 路 ${label}`}>
+          <span className='system-sm-medium text-text-secondary'>{name}</span>
+          <span className='system-xs-regular px-1 text-text-quaternary'>路</span>
+          <span className='system-xs-medium text-text-tertiary'>{label}</span>
+        </div>
+      </div>
+      <div className='shrink-0'>
+        <div className={cn('flex items-center', !readonly && 'group-hover:hidden')}>
+          {required && <Badge text='required' />}
+          <span className='system-xs-regular pl-2 pr-1 text-text-tertiary'>{type}</span>
+          <IconTypeIcon type={type as IInputTypeIconProps['type']} className='text-text-tertiary' />
+        </div>
+        <div className={cn('hidden items-center justify-end rounded-lg', !readonly && 'group-hover:flex')}>
+          <div
+            className='mr-1 flex h-6 w-6 cursor-pointer items-center justify-center rounded-md hover:bg-black/5'
+            onClick={onEdit}
+          >
+            <RiEditLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+          <div
+            className='flex h-6 w-6 cursor-pointer items-center  justify-center text-text-tertiary hover:text-text-destructive'
+            onClick={onRemove}
+            onMouseOver={() => setIsDeleting(true)}
+            onMouseLeave={() => setIsDeleting(false)}
+          >
+            <RiDeleteBinLine className='h-4 w-4' />
+          </div>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default VarItem
diff --git a/app/components/app/configuration/config-vision/index.tsx b/app/components/app/configuration/config-vision/index.tsx
new file mode 100644
index 0000000..f719822
--- /dev/null
+++ b/app/components/app/configuration/config-vision/index.tsx
@@ -0,0 +1,112 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { useContext } from 'use-context-selector'
+import ParamConfig from './param-config'
+import { Vision } from '@/app/components/base/icons/src/vender/features'
+import Tooltip from '@/app/components/base/tooltip'
+// import OptionCard from '@/app/components/workflow/nodes/_base/components/option-card'
+import ConfigContext from '@/context/debug-configuration'
+// import { Resolution } from '@/types/app'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import Switch from '@/app/components/base/switch'
+import { SupportUploadFileTypes } from '@/app/components/workflow/types'
+
+const ConfigVision: FC = () => {
+  const { t } = useTranslation()
+  const { isShowVisionConfig, isAllowVideoUpload } = useContext(ConfigContext)
+  const file = useFeatures(s => s.features.file)
+  const featuresStore = useFeaturesStore()
+
+  const isImageEnabled = file?.allowed_file_types?.includes(SupportUploadFileTypes.image) ?? false
+
+  const handleChange = useCallback((value: boolean) => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+
+    const newFeatures = produce(features, (draft) => {
+      if (value) {
+        draft.file!.allowed_file_types = Array.from(new Set([
+          ...(draft.file?.allowed_file_types || []),
+          SupportUploadFileTypes.image,
+          ...(isAllowVideoUpload ? [SupportUploadFileTypes.video] : []),
+        ]))
+      }
+      else {
+        draft.file!.allowed_file_types = draft.file!.allowed_file_types?.filter(
+          type => type !== SupportUploadFileTypes.image && (isAllowVideoUpload ? type !== SupportUploadFileTypes.video : true),
+        )
+      }
+
+      if (draft.file) {
+        draft.file.enabled = (draft.file.allowed_file_types?.length ?? 0) > 0
+        draft.file.image = {
+          ...(draft.file.image || {}),
+          enabled: value,
+        }
+      }
+    })
+    setFeatures(newFeatures)
+  }, [featuresStore, isAllowVideoUpload])
+
+  if (!isShowVisionConfig)
+    return null
+
+  return (
+    <div className='mt-2 flex items-center gap-2 rounded-xl border-l-[0.5px] border-t-[0.5px] border-effects-highlight bg-background-section-burn p-2'>
+      <div className='shrink-0 p-1'>
+        <div className='rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-indigo-indigo-600 p-1 shadow-xs'>
+          <Vision className='h-4 w-4 text-text-primary-on-surface' />
+        </div>
+      </div>
+      <div className='flex grow items-center'>
+        <div className='system-sm-semibold mr-1 text-text-secondary'>{t('appDebug.vision.name')}</div>
+        <Tooltip
+          popupContent={
+            <div className='w-[180px]' >
+              {t('appDebug.vision.description')}
+            </div>
+          }
+        />
+      </div>
+      <div className='flex shrink-0 items-center'>
+        {/* <div className='mr-2 flex items-center gap-0.5'>
+          <div className='text-text-tertiary system-xs-medium-uppercase'>{t('appDebug.vision.visionSettings.resolution')}</div>
+          <Tooltip
+            popupContent={
+              <div className='w-[180px]' >
+                {t('appDebug.vision.visionSettings.resolutionTooltip').split('\n').map(item => (
+                  <div key={item}>{item}</div>
+                ))}
+              </div>
+            }
+          />
+        </div> */}
+        {/* <div className='flex items-center gap-1'>
+          <OptionCard
+            title={t('appDebug.vision.visionSettings.high')}
+            selected={file?.image?.detail === Resolution.high}
+            onSelect={() => handleChange(Resolution.high)}
+          />
+          <OptionCard
+            title={t('appDebug.vision.visionSettings.low')}
+            selected={file?.image?.detail === Resolution.low}
+            onSelect={() => handleChange(Resolution.low)}
+          />
+        </div> */}
+        <ParamConfig />
+        <div className='ml-1 mr-3 h-3.5 w-[1px] bg-divider-regular'></div>
+        <Switch
+          defaultValue={isImageEnabled}
+          onChange={handleChange}
+          size='md'
+        />
+      </div>
+    </div>
+  )
+}
+export default React.memo(ConfigVision)
diff --git a/app/components/app/configuration/config-vision/param-config-content.tsx b/app/components/app/configuration/config-vision/param-config-content.tsx
new file mode 100644
index 0000000..f0d8122
--- /dev/null
+++ b/app/components/app/configuration/config-vision/param-config-content.tsx
@@ -0,0 +1,142 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import OptionCard from '@/app/components/workflow/nodes/_base/components/option-card'
+import { Resolution, TransferMethod } from '@/types/app'
+import ParamItem from '@/app/components/base/param-item'
+import Tooltip from '@/app/components/base/tooltip'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import type { FileUpload } from '@/app/components/base/features/types'
+
+const MIN = 1
+const MAX = 6
+const ParamConfigContent: FC = () => {
+  const { t } = useTranslation()
+  const file = useFeatures(s => s.features.file)
+  const featuresStore = useFeaturesStore()
+
+  const handleChange = useCallback((data: FileUpload) => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+
+    const newFeatures = produce(features, (draft) => {
+      draft.file = {
+        ...draft.file,
+        allowed_file_upload_methods: data.allowed_file_upload_methods,
+        number_limits: data.number_limits,
+        image: {
+          enabled: data.enabled,
+          detail: data.image?.detail,
+          transfer_methods: data.allowed_file_upload_methods,
+          number_limits: data.number_limits,
+        },
+      }
+    })
+    setFeatures(newFeatures)
+  }, [featuresStore])
+
+  return (
+    <div>
+      <div className='text-base font-semibold leading-6 text-text-primary'>{t('appDebug.vision.visionSettings.title')}</div>
+      <div className='space-y-6 pt-3'>
+        <div>
+          <div className='mb-2 flex items-center  space-x-1'>
+            <div className='text-[13px] font-semibold leading-[18px] text-text-secondary'>{t('appDebug.vision.visionSettings.resolution')}</div>
+            <Tooltip
+              popupContent={
+                <div className='w-[180px]' >
+                  {t('appDebug.vision.visionSettings.resolutionTooltip').split('\n').map(item => (
+                    <div key={item}>{item}</div>
+                  ))}
+                </div>
+              }
+            />
+          </div>
+          <div className='flex items-center gap-1'>
+            <OptionCard
+              className='grow'
+              title={t('appDebug.vision.visionSettings.high')}
+              selected={file?.image?.detail === Resolution.high}
+              onSelect={() => handleChange({
+                ...file,
+                image: { detail: Resolution.high },
+              })}
+            />
+            <OptionCard
+              className='grow'
+              title={t('appDebug.vision.visionSettings.low')}
+              selected={file?.image?.detail === Resolution.low}
+              onSelect={() => handleChange({
+                ...file,
+                image: { detail: Resolution.low },
+              })}
+            />
+          </div>
+        </div>
+        <div>
+          <div className='mb-2 text-[13px] font-semibold leading-[18px] text-text-secondary'>{t('appDebug.vision.visionSettings.uploadMethod')}</div>
+          <div className='flex items-center gap-1'>
+            <OptionCard
+              className='grow'
+              title={t('appDebug.vision.visionSettings.both')}
+              selected={!!file?.allowed_file_upload_methods?.includes(TransferMethod.local_file) && !!file?.allowed_file_upload_methods?.includes(TransferMethod.remote_url)}
+              onSelect={() => handleChange({
+                ...file,
+                allowed_file_upload_methods: [TransferMethod.local_file, TransferMethod.remote_url],
+              })}
+            />
+            <OptionCard
+              className='grow'
+              title={t('appDebug.vision.visionSettings.localUpload')}
+              selected={!!file?.allowed_file_upload_methods?.includes(TransferMethod.local_file) && file?.allowed_file_upload_methods?.length === 1}
+              onSelect={() => handleChange({
+                ...file,
+                allowed_file_upload_methods: [TransferMethod.local_file],
+              })}
+            />
+            <OptionCard
+              className='grow'
+              title={t('appDebug.vision.visionSettings.url')}
+              selected={!!file?.allowed_file_upload_methods?.includes(TransferMethod.remote_url) && file?.allowed_file_upload_methods?.length === 1}
+              onSelect={() => handleChange({
+                ...file,
+                allowed_file_upload_methods: [TransferMethod.remote_url],
+              })}
+            />
+          </div>
+        </div>
+        <div>
+          <ParamItem
+            id='upload_limit'
+            className=''
+            name={t('appDebug.vision.visionSettings.uploadLimit')}
+            noTooltip
+            {...{
+              default: 2,
+              step: 1,
+              min: MIN,
+              max: MAX,
+            }}
+            value={file?.number_limits || 3}
+            enable={true}
+            onChange={(_key: string, value: number) => {
+              if (!value)
+                return
+
+              handleChange({
+                ...file,
+                number_limits: value,
+              })
+            }}
+          />
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(ParamConfigContent)
diff --git a/app/components/app/configuration/config-vision/param-config.tsx b/app/components/app/configuration/config-vision/param-config.tsx
new file mode 100644
index 0000000..5e4aac6
--- /dev/null
+++ b/app/components/app/configuration/config-vision/param-config.tsx
@@ -0,0 +1,42 @@
+'use client'
+import type { FC } from 'react'
+import { memo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiSettings2Line } from '@remixicon/react'
+import ParamConfigContent from './param-config-content'
+import Button from '@/app/components/base/button'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import cn from '@/utils/classnames'
+
+const ParamsConfig: FC = () => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: 4,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+        <Button variant='ghost' size='small' className={cn('')}>
+          <RiSettings2Line className='h-3.5 w-3.5' />
+          <div className='ml-1'>{t('appDebug.voice.settings')}</div>
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent style={{ zIndex: 50 }}>
+        <div className='w-80 space-y-3 rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg p-4 shadow-lg sm:w-[412px]'>
+          <ParamConfigContent />
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default memo(ParamsConfig)
diff --git a/app/components/app/configuration/config/agent-setting-button.tsx b/app/components/app/configuration/config/agent-setting-button.tsx
new file mode 100644
index 0000000..b0a93d5
--- /dev/null
+++ b/app/components/app/configuration/config/agent-setting-button.tsx
@@ -0,0 +1,47 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiSettings2Line } from '@remixicon/react'
+import AgentSetting from './agent/agent-setting'
+import Button from '@/app/components/base/button'
+import type { AgentConfig } from '@/models/debug'
+
+type Props = {
+  isFunctionCall: boolean
+  isChatModel: boolean
+  agentConfig?: AgentConfig
+  onAgentSettingChange: (payload: AgentConfig) => void
+}
+
+const AgentSettingButton: FC<Props> = ({
+  onAgentSettingChange,
+  isFunctionCall,
+  isChatModel,
+  agentConfig,
+}) => {
+  const { t } = useTranslation()
+  const [isShowAgentSetting, setIsShowAgentSetting] = useState(false)
+
+  return (
+    <>
+      <Button onClick={() => setIsShowAgentSetting(true)} className='mr-2 shrink-0'>
+        <RiSettings2Line className='mr-1 h-4 w-4 text-text-tertiary' />
+        {t('appDebug.agent.setting.name')}
+      </Button>
+      {isShowAgentSetting && (
+        <AgentSetting
+          isFunctionCall={isFunctionCall}
+          payload={agentConfig as AgentConfig}
+          isChatModel={isChatModel}
+          onSave={(payloadNew) => {
+            onAgentSettingChange(payloadNew)
+            setIsShowAgentSetting(false)
+          }}
+          onCancel={() => setIsShowAgentSetting(false)}
+        />
+      )}
+    </>
+  )
+}
+export default React.memo(AgentSettingButton)
diff --git a/app/components/app/configuration/config/agent/agent-setting/index.tsx b/app/components/app/configuration/config/agent/agent-setting/index.tsx
new file mode 100644
index 0000000..26a1242
--- /dev/null
+++ b/app/components/app/configuration/config/agent/agent-setting/index.tsx
@@ -0,0 +1,165 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import { useClickAway } from 'ahooks'
+import ItemPanel from './item-panel'
+import Button from '@/app/components/base/button'
+import { CuteRobot } from '@/app/components/base/icons/src/vender/solid/communication'
+import { Unblur } from '@/app/components/base/icons/src/vender/solid/education'
+import Slider from '@/app/components/base/slider'
+import type { AgentConfig } from '@/models/debug'
+import { DEFAULT_AGENT_PROMPT, MAX_ITERATIONS_NUM } from '@/config'
+
+type Props = {
+  isChatModel: boolean
+  payload: AgentConfig
+  isFunctionCall: boolean
+  onCancel: () => void
+  onSave: (payload: any) => void
+}
+
+const maxIterationsMin = 1
+
+const AgentSetting: FC<Props> = ({
+  isChatModel,
+  payload,
+  isFunctionCall,
+  onCancel,
+  onSave,
+}) => {
+  const { t } = useTranslation()
+  const [tempPayload, setTempPayload] = useState(payload)
+  const ref = useRef(null)
+  const [mounted, setMounted] = useState(false)
+
+  useClickAway(() => {
+    if (mounted)
+      onCancel()
+  }, ref)
+
+  useEffect(() => {
+    setMounted(true)
+  }, [])
+
+  const handleSave = () => {
+    onSave(tempPayload)
+  }
+
+  return (
+    <div className='fixed inset-0 z-[100] flex justify-end overflow-hidden p-2'
+      style={{
+        backgroundColor: 'rgba(16, 24, 40, 0.20)',
+      }}
+    >
+      <div
+        ref={ref}
+        className='flex h-full w-[640px] flex-col overflow-hidden rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl'
+      >
+        <div className='flex h-14 shrink-0 items-center justify-between border-b border-divider-regular pl-6 pr-5'>
+          <div className='flex flex-col text-base font-semibold text-text-primary'>
+            <div className='leading-6'>{t('appDebug.agent.setting.name')}</div>
+          </div>
+          <div className='flex items-center'>
+            <div
+              onClick={onCancel}
+              className='flex h-6 w-6 cursor-pointer items-center justify-center'
+            >
+              <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+            </div>
+          </div>
+        </div>
+        {/* Body */}
+        <div className='grow overflow-y-auto border-b p-6 pb-[68px] pt-5' style={{
+          borderBottom: 'rgba(0, 0, 0, 0.05)',
+        }}>
+          {/* Agent Mode */}
+          <ItemPanel
+            className='mb-4'
+            icon={
+              <CuteRobot className='h-4 w-4 text-indigo-600' />
+            }
+            name={t('appDebug.agent.agentMode')}
+            description={t('appDebug.agent.agentModeDes')}
+          >
+            <div className='text-[13px] font-medium leading-[18px] text-text-primary'>{isFunctionCall ? t('appDebug.agent.agentModeType.functionCall') : t('appDebug.agent.agentModeType.ReACT')}</div>
+          </ItemPanel>
+
+          <ItemPanel
+            className='mb-4'
+            icon={
+              <Unblur className='h-4 w-4 text-[#FB6514]' />
+            }
+            name={t('appDebug.agent.setting.maximumIterations.name')}
+            description={t('appDebug.agent.setting.maximumIterations.description')}
+          >
+            <div className='flex items-center'>
+              <Slider
+                className='mr-3 w-[156px]'
+                min={maxIterationsMin}
+                max={MAX_ITERATIONS_NUM}
+                value={tempPayload.max_iteration}
+                onChange={(value) => {
+                  setTempPayload({
+                    ...tempPayload,
+                    max_iteration: value,
+                  })
+                }}
+              />
+
+              <input
+                type="number"
+                min={maxIterationsMin}
+                max={MAX_ITERATIONS_NUM} step={1}
+                className="block h-7 w-11 rounded-lg border-0 bg-components-input-bg-normal px-1.5 pl-1 leading-7 text-text-primary placeholder:text-text-tertiary focus:ring-1 focus:ring-inset focus:ring-primary-600"
+                value={tempPayload.max_iteration}
+                onChange={(e) => {
+                  let value = Number.parseInt(e.target.value, 10)
+                  if (value < maxIterationsMin)
+                    value = maxIterationsMin
+
+                  if (value > MAX_ITERATIONS_NUM)
+                    value = MAX_ITERATIONS_NUM
+                  setTempPayload({
+                    ...tempPayload,
+                    max_iteration: value,
+                  })
+                }} />
+            </div>
+          </ItemPanel>
+
+          {!isFunctionCall && (
+            <div className='rounded-xl bg-background-section-burn py-2 shadow-xs'>
+              <div className='flex h-8 items-center px-4 text-sm font-semibold leading-6 text-text-secondary'>{t('tools.builtInPromptTitle')}</div>
+              <div className='h-[396px] overflow-y-auto whitespace-pre-line px-4 text-sm font-normal leading-5 text-text-secondary'>
+                {isChatModel ? DEFAULT_AGENT_PROMPT.chat : DEFAULT_AGENT_PROMPT.completion}
+              </div>
+              <div className='px-4'>
+                <div className='inline-flex h-5 items-center rounded-md bg-components-input-bg-normal px-1 text-xs font-medium leading-[18px] text-text-tertiary'>{(isChatModel ? DEFAULT_AGENT_PROMPT.chat : DEFAULT_AGENT_PROMPT.completion).length}</div>
+              </div>
+            </div>
+          )}
+
+        </div>
+        <div
+          className='sticky bottom-0 z-[5] flex w-full justify-end border-t border-divider-regular bg-background-section-burn px-6 py-4'
+        >
+          <Button
+            onClick={onCancel}
+            className='mr-2'
+          >
+            {t('common.operation.cancel')}
+          </Button>
+          <Button
+            variant='primary'
+            onClick={handleSave}
+          >
+            {t('common.operation.save')}
+          </Button>
+        </div>
+      </div>
+    </div>
+  )
+}
+export default React.memo(AgentSetting)
diff --git a/app/components/app/configuration/config/agent/agent-setting/item-panel.tsx b/app/components/app/configuration/config/agent/agent-setting/item-panel.tsx
new file mode 100644
index 0000000..6512e11
--- /dev/null
+++ b/app/components/app/configuration/config/agent/agent-setting/item-panel.tsx
@@ -0,0 +1,41 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+import Tooltip from '@/app/components/base/tooltip'
+type Props = {
+  className?: string
+  icon: React.JSX.Element
+  name: string
+  description: string
+  children: React.JSX.Element
+}
+
+const ItemPanel: FC<Props> = ({
+  className,
+  icon,
+  name,
+  description,
+  children,
+}) => {
+  return (
+    <div className={cn(className, 'flex h-12 items-center justify-between rounded-lg bg-background-section-burn px-3')}>
+      <div className='flex items-center'>
+        {icon}
+        <div className='ml-3 mr-1 text-sm font-semibold leading-6 text-text-secondary'>{name}</div>
+        <Tooltip
+          popupContent={
+            <div className='w-[180px]'>
+              {description}
+            </div>
+          }
+        >
+        </Tooltip>
+      </div>
+      <div>
+        {children}
+      </div>
+    </div>
+  )
+}
+export default React.memo(ItemPanel)
diff --git a/app/components/app/configuration/config/agent/agent-tools/index.tsx b/app/components/app/configuration/config/agent/agent-tools/index.tsx
new file mode 100644
index 0000000..4b773c0
--- /dev/null
+++ b/app/components/app/configuration/config/agent/agent-tools/index.tsx
@@ -0,0 +1,302 @@
+'use client'
+import type { FC } from 'react'
+import React, { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import copy from 'copy-to-clipboard'
+import produce from 'immer'
+import {
+  RiDeleteBinLine,
+  RiEqualizer2Line,
+  RiInformation2Line,
+} from '@remixicon/react'
+import { useFormattingChangedDispatcher } from '../../../debug/hooks'
+import SettingBuiltInTool from './setting-built-in-tool'
+import Panel from '@/app/components/app/configuration/base/feature-panel'
+import OperationBtn from '@/app/components/app/configuration/base/operation-btn'
+import AppIcon from '@/app/components/base/app-icon'
+import Button from '@/app/components/base/button'
+import Indicator from '@/app/components/header/indicator'
+import Switch from '@/app/components/base/switch'
+import Toast from '@/app/components/base/toast'
+import ConfigContext from '@/context/debug-configuration'
+import type { AgentTool } from '@/types/app'
+import { type Collection, CollectionType } from '@/app/components/tools/types'
+import { MAX_TOOLS_NUM } from '@/config'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback'
+import Tooltip from '@/app/components/base/tooltip'
+import { DefaultToolIcon } from '@/app/components/base/icons/src/public/other'
+import ConfigCredential from '@/app/components/tools/setting/build-in/config-credentials'
+import { updateBuiltInToolCredential } from '@/service/tools'
+import cn from '@/utils/classnames'
+import ToolPicker from '@/app/components/workflow/block-selector/tool-picker'
+import type { ToolDefaultValue } from '@/app/components/workflow/block-selector/types'
+import { canFindTool } from '@/utils'
+
+type AgentToolWithMoreInfo = AgentTool & { icon: any; collection?: Collection } | null
+const AgentTools: FC = () => {
+  const { t } = useTranslation()
+  const [isShowChooseTool, setIsShowChooseTool] = useState(false)
+  const { modelConfig, setModelConfig, collectionList } = useContext(ConfigContext)
+  const formattingChangedDispatcher = useFormattingChangedDispatcher()
+
+  const [currentTool, setCurrentTool] = useState<AgentToolWithMoreInfo>(null)
+  const currentCollection = useMemo(() => {
+    if (!currentTool) return null
+    const collection = collectionList.find(collection => canFindTool(collection.id, currentTool?.provider_id) && collection.type === currentTool?.provider_type)
+    return collection
+  }, [currentTool, collectionList])
+  const [isShowSettingTool, setIsShowSettingTool] = useState(false)
+  const [isShowSettingAuth, setShowSettingAuth] = useState(false)
+  const tools = (modelConfig?.agentConfig?.tools as AgentTool[] || []).map((item) => {
+    const collection = collectionList.find(
+      collection =>
+        canFindTool(collection.id, item.provider_id)
+        && collection.type === item.provider_type,
+    )
+    const icon = collection?.icon
+    return {
+      ...item,
+      icon,
+      collection,
+    }
+  })
+
+  const handleToolSettingChange = (value: Record<string, any>) => {
+    const newModelConfig = produce(modelConfig, (draft) => {
+      const tool = (draft.agentConfig.tools).find((item: any) => item.provider_id === currentTool?.collection?.id && item.tool_name === currentTool?.tool_name)
+      if (tool)
+        (tool as AgentTool).tool_parameters = value
+    })
+    setModelConfig(newModelConfig)
+    setIsShowSettingTool(false)
+    formattingChangedDispatcher()
+  }
+
+  const handleToolAuthSetting = (value: AgentToolWithMoreInfo) => {
+    const newModelConfig = produce(modelConfig, (draft) => {
+      const tool = (draft.agentConfig.tools).find((item: any) => item.provider_id === value?.collection?.id && item.tool_name === value?.tool_name)
+      if (tool)
+        (tool as AgentTool).notAuthor = false
+    })
+    setModelConfig(newModelConfig)
+    setIsShowSettingTool(false)
+    formattingChangedDispatcher()
+  }
+
+  const [isDeleting, setIsDeleting] = useState<number>(-1)
+
+  const handleSelectTool = (tool: ToolDefaultValue) => {
+    const newModelConfig = produce(modelConfig, (draft) => {
+      draft.agentConfig.tools.push({
+        provider_id: tool.provider_id,
+        provider_type: tool.provider_type as CollectionType,
+        provider_name: tool.provider_name,
+        tool_name: tool.tool_name,
+        tool_label: tool.tool_label,
+        tool_parameters: tool.params,
+        notAuthor: !tool.is_team_authorization,
+        enabled: true,
+      })
+    })
+    setModelConfig(newModelConfig)
+  }
+
+  return (
+    <>
+      <Panel
+        className={cn('mt-2', tools.length === 0 && 'pb-2')}
+        noBodySpacing={tools.length === 0}
+        title={
+          <div className='flex items-center'>
+            <div className='mr-1'>{t('appDebug.agent.tools.name')}</div>
+            <Tooltip
+              popupContent={
+                <div className='w-[180px]'>
+                  {t('appDebug.agent.tools.description')}
+                </div>
+              }
+            />
+          </div>
+        }
+        headerRight={
+          <div className='flex items-center'>
+            <div className='text-xs font-normal leading-[18px] text-text-tertiary'>{tools.filter(item => !!item.enabled).length}/{tools.length}&nbsp;{t('appDebug.agent.tools.enabled')}</div>
+            {tools.length < MAX_TOOLS_NUM && (
+              <>
+                <div className='ml-3 mr-1 h-3.5 w-px bg-divider-regular'></div>
+                <ToolPicker
+                  trigger={<OperationBtn type="add" />}
+                  isShow={isShowChooseTool}
+                  onShowChange={setIsShowChooseTool}
+                  disabled={false}
+                  supportAddCustomTool
+                  onSelect={handleSelectTool}
+                  selectedTools={tools}
+                />
+              </>
+            )}
+          </div>
+        }
+      >
+        <div className='grid grid-cols-1 flex-wrap items-center justify-between gap-1 2xl:grid-cols-2'>
+          {tools.map((item: AgentTool & { icon: any; collection?: Collection }, index) => (
+            <div key={index}
+              className={cn(
+                'cursor group relative flex w-full items-center justify-between rounded-lg border-[0.5px] border-components-panel-border-subtle bg-components-panel-on-panel-item-bg p-1.5 pr-2 shadow-xs last-of-type:mb-0 hover:bg-components-panel-on-panel-item-bg-hover hover:shadow-sm',
+                isDeleting === index && 'border-state-destructive-border hover:bg-state-destructive-hover',
+              )}
+            >
+              <div className='flex w-0 grow items-center'>
+                {item.isDeleted && <DefaultToolIcon className='h-5 w-5' />}
+                {!item.isDeleted && (
+                  <div className={cn((item.notAuthor || !item.enabled) && 'opacity-50')}>
+                    {typeof item.icon === 'string' && <div className='h-5 w-5 rounded-md bg-cover bg-center' style={{ backgroundImage: `url(${item.icon})` }} />}
+                    {typeof item.icon !== 'string' && <AppIcon className='rounded-md' size='xs' icon={item.icon?.content} background={item.icon?.background} />}
+                  </div>
+                )}
+                <div
+                  className={cn(
+                    'system-xs-regular ml-1.5 flex w-0 grow items-center truncate',
+                    (item.isDeleted || item.notAuthor || !item.enabled) ? 'opacity-50' : '',
+                  )}
+                >
+                  <span className='system-xs-medium pr-1.5 text-text-secondary'>{item.provider_type === CollectionType.builtIn ? item.provider_name.split('/').pop() : item.tool_label}</span>
+                  <span className='text-text-tertiary'>{item.tool_label}</span>
+                  {!item.isDeleted && (
+                    <Tooltip
+                      needsDelay
+                      popupContent={
+                        <div className='w-[180px]'>
+                          <div className='mb-1.5 text-text-secondary'>{item.tool_name}</div>
+                          <div className='mb-1.5 text-text-tertiary'>{t('tools.toolNameUsageTip')}</div>
+                          <div className='cursor-pointer text-text-accent' onClick={() => copy(item.tool_name)}>{t('tools.copyToolName')}</div>
+                        </div>
+                      }
+                    >
+                      <div className='h-4 w-4'>
+                        <div className='ml-0.5 hidden group-hover:inline-block'>
+                          <RiInformation2Line className='h-4 w-4 text-text-tertiary' />
+                        </div>
+                      </div>
+                    </Tooltip>
+                  )}
+                </div>
+              </div>
+              <div className='ml-1 flex shrink-0 items-center'>
+                {item.isDeleted && (
+                  <div className='mr-2 flex items-center'>
+                    <Tooltip
+                      popupContent={t('tools.toolRemoved')}
+                      needsDelay
+                    >
+                      <div className='mr-1 cursor-pointer rounded-md p-1 hover:bg-black/5'>
+                        <AlertTriangle className='h-4 w-4 text-[#F79009]' />
+                      </div>
+                    </Tooltip>
+                    <div
+                      className='cursor-pointer rounded-md p-1 text-text-tertiary hover:text-text-destructive'
+                      onClick={() => {
+                        const newModelConfig = produce(modelConfig, (draft) => {
+                          draft.agentConfig.tools.splice(index, 1)
+                        })
+                        setModelConfig(newModelConfig)
+                        formattingChangedDispatcher()
+                      }}
+                      onMouseOver={() => setIsDeleting(index)}
+                      onMouseLeave={() => setIsDeleting(-1)}
+                    >
+                      <RiDeleteBinLine className='h-4 w-4' />
+                    </div>
+                  </div>
+                )}
+                {!item.isDeleted && (
+                  <div className='mr-2 hidden items-center gap-1 group-hover:flex'>
+                    {!item.notAuthor && (
+                      <Tooltip
+                        popupContent={t('tools.setBuiltInTools.infoAndSetting')}
+                        needsDelay
+                      >
+                        <div className='cursor-pointer rounded-md p-1  hover:bg-black/5' onClick={() => {
+                          setCurrentTool(item)
+                          setIsShowSettingTool(true)
+                        }}>
+                          <RiEqualizer2Line className='h-4 w-4 text-text-tertiary' />
+                        </div>
+                      </Tooltip>
+                    )}
+                    <div
+                      className='cursor-pointer rounded-md p-1 text-text-tertiary hover:text-text-destructive'
+                      onClick={() => {
+                        const newModelConfig = produce(modelConfig, (draft) => {
+                          draft.agentConfig.tools.splice(index, 1)
+                        })
+                        setModelConfig(newModelConfig)
+                        formattingChangedDispatcher()
+                      }}
+                      onMouseOver={() => setIsDeleting(index)}
+                      onMouseLeave={() => setIsDeleting(-1)}
+                    >
+                      <RiDeleteBinLine className='h-4 w-4' />
+                    </div>
+                  </div>
+                )}
+                <div className={cn(item.isDeleted && 'opacity-50')}>
+                  {!item.notAuthor && (
+                    <Switch
+                      defaultValue={item.isDeleted ? false : item.enabled}
+                      disabled={item.isDeleted}
+                      size='md'
+                      onChange={(enabled) => {
+                        const newModelConfig = produce(modelConfig, (draft) => {
+                          (draft.agentConfig.tools[index] as any).enabled = enabled
+                        })
+                        setModelConfig(newModelConfig)
+                        formattingChangedDispatcher()
+                      }} />
+                  )}
+                  {item.notAuthor && (
+                    <Button variant='secondary' size='small' onClick={() => {
+                      setCurrentTool(item)
+                      setShowSettingAuth(true)
+                    }}>
+                      {t('tools.notAuthorized')}
+                      <Indicator className='ml-2' color='orange' />
+                    </Button>
+                  )}
+                </div>
+              </div>
+            </div>
+          ))}
+        </div >
+      </Panel >
+      {isShowSettingTool && (
+        <SettingBuiltInTool
+          toolName={currentTool?.tool_name as string}
+          setting={currentTool?.tool_parameters}
+          collection={currentTool?.collection as Collection}
+          isBuiltIn={currentTool?.collection?.type === CollectionType.builtIn}
+          isModel={currentTool?.collection?.type === CollectionType.model}
+          onSave={handleToolSettingChange}
+          onHide={() => setIsShowSettingTool(false)}
+        />
+      )}
+      {isShowSettingAuth && (
+        <ConfigCredential
+          collection={currentCollection as any}
+          onCancel={() => setShowSettingAuth(false)}
+          onSaved={async (value) => {
+            await updateBuiltInToolCredential((currentCollection as any).name, value)
+            Toast.notify({
+              type: 'success',
+              message: t('common.api.actionSuccess'),
+            })
+            handleToolAuthSetting(currentTool)
+            setShowSettingAuth(false)
+          }}
+        />
+      )}
+    </>
+  )
+}
+export default React.memo(AgentTools)
diff --git a/app/components/app/configuration/config/agent/agent-tools/setting-built-in-tool.tsx b/app/components/app/configuration/config/agent/agent-tools/setting-built-in-tool.tsx
new file mode 100644
index 0000000..952ad66
--- /dev/null
+++ b/app/components/app/configuration/config/agent/agent-tools/setting-built-in-tool.tsx
@@ -0,0 +1,238 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import {
+  RiArrowLeftLine,
+  RiCloseLine,
+} from '@remixicon/react'
+import Drawer from '@/app/components/base/drawer'
+import Loading from '@/app/components/base/loading'
+import ActionButton from '@/app/components/base/action-button'
+import Icon from '@/app/components/plugins/card/base/card-icon'
+import OrgInfo from '@/app/components/plugins/card/base/org-info'
+import Description from '@/app/components/plugins/card/base/description'
+import TabSlider from '@/app/components/base/tab-slider-plain'
+
+import Button from '@/app/components/base/button'
+import Form from '@/app/components/header/account-setting/model-provider-page/model-modal/Form'
+import { addDefaultValue, toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
+import type { Collection, Tool } from '@/app/components/tools/types'
+import { CollectionType } from '@/app/components/tools/types'
+import { fetchBuiltInToolList, fetchCustomToolList, fetchModelToolList, fetchWorkflowToolList } from '@/service/tools'
+import I18n from '@/context/i18n'
+import { getLanguage } from '@/i18n/language'
+import cn from '@/utils/classnames'
+
+type Props = {
+  showBackButton?: boolean
+  collection: Collection
+  isBuiltIn?: boolean
+  isModel?: boolean
+  toolName: string
+  setting?: Record<string, any>
+  readonly?: boolean
+  onHide: () => void
+  onSave?: (value: Record<string, any>) => void
+}
+
+const SettingBuiltInTool: FC<Props> = ({
+  showBackButton = false,
+  collection,
+  isBuiltIn = true,
+  isModel = true,
+  toolName,
+  setting = {},
+  readonly,
+  onHide,
+  onSave,
+}) => {
+  const { locale } = useContext(I18n)
+  const language = getLanguage(locale)
+  const { t } = useTranslation()
+
+  const [isLoading, setIsLoading] = useState(true)
+  const [tools, setTools] = useState<Tool[]>([])
+  const currTool = tools.find(tool => tool.name === toolName)
+  const formSchemas = currTool ? toolParametersToFormSchemas(currTool.parameters) : []
+  const infoSchemas = formSchemas.filter(item => item.form === 'llm')
+  const settingSchemas = formSchemas.filter(item => item.form !== 'llm')
+  const hasSetting = settingSchemas.length > 0
+  const [tempSetting, setTempSetting] = useState(setting)
+  const [currType, setCurrType] = useState('info')
+  const isInfoActive = currType === 'info'
+  useEffect(() => {
+    if (!collection)
+      return
+
+    (async () => {
+      setIsLoading(true)
+      try {
+        const list = await new Promise<Tool[]>((resolve) => {
+          (async function () {
+            if (isModel)
+              resolve(await fetchModelToolList(collection.name))
+            else if (isBuiltIn)
+              resolve(await fetchBuiltInToolList(collection.name))
+            else if (collection.type === CollectionType.workflow)
+              resolve(await fetchWorkflowToolList(collection.id))
+            else
+              resolve(await fetchCustomToolList(collection.name))
+          }())
+        })
+        setTools(list)
+        const currTool = list.find(tool => tool.name === toolName)
+        if (currTool) {
+          const formSchemas = toolParametersToFormSchemas(currTool.parameters)
+          setTempSetting(addDefaultValue(setting, formSchemas))
+        }
+      }
+      catch { }
+      setIsLoading(false)
+    })()
+  }, [collection?.name, collection?.id, collection?.type])
+
+  useEffect(() => {
+    setCurrType((!readonly && hasSetting) ? 'setting' : 'info')
+  }, [hasSetting])
+
+  const isValid = (() => {
+    let valid = true
+    settingSchemas.forEach((item) => {
+      if (item.required && !tempSetting[item.name])
+        valid = false
+    })
+    return valid
+  })()
+
+  const getType = (type: string) => {
+    if (type === 'number-input')
+      return t('tools.setBuiltInTools.number')
+    if (type === 'text-input')
+      return t('tools.setBuiltInTools.string')
+    if (type === 'file')
+      return t('tools.setBuiltInTools.file')
+    return type
+  }
+
+  const infoUI = (
+    <div className=''>
+      {infoSchemas.length > 0 && (
+        <div className='space-y-1 py-2'>
+          {infoSchemas.map((item, index) => (
+            <div key={index} className='py-1'>
+              <div className='flex items-center gap-2'>
+                <div className='code-sm-semibold text-text-secondary'>{item.label[language]}</div>
+                <div className='system-xs-regular text-text-tertiary'>
+                  {getType(item.type)}
+                </div>
+                {item.required && (
+                  <div className='system-xs-medium text-text-warning-secondary'>{t('tools.setBuiltInTools.required')}</div>
+                )}
+              </div>
+              {item.human_description && (
+                <div className='system-xs-regular mt-0.5 text-text-tertiary'>
+                  {item.human_description?.[language]}
+                </div>
+              )}
+            </div>
+          ))}
+        </div>
+      )}
+    </div>
+  )
+
+  const settingUI = (
+    <Form
+      value={tempSetting}
+      onChange={setTempSetting}
+      formSchemas={settingSchemas}
+      isEditMode={false}
+      showOnVariableMap={{}}
+      validating={false}
+      readonly={readonly}
+    />
+  )
+
+  return (
+    <Drawer
+      isOpen
+      clickOutsideNotOpen={false}
+      onClose={onHide}
+      footer={null}
+      mask={false}
+      positionCenter={false}
+      panelClassName={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')}
+    >
+      <>
+        {isLoading && <Loading type='app' />}
+        {!isLoading && (
+          <>
+            {/* header */}
+            <div className='relative border-b border-divider-subtle p-4 pb-3'>
+              <div className='absolute right-3 top-3'>
+                <ActionButton onClick={onHide}>
+                  <RiCloseLine className='h-4 w-4' />
+                </ActionButton>
+              </div>
+              {showBackButton && (
+                <div
+                  className='system-xs-semibold-uppercase mb-2 flex cursor-pointer items-center gap-1 text-text-accent-secondary'
+                  onClick={onHide}
+                >
+                  <RiArrowLeftLine className='h-4 w-4' />
+                  BACK
+                </div>
+              )}
+              <div className='flex items-center gap-1'>
+                <Icon size='tiny' className='h-6 w-6' src={collection.icon} />
+                <OrgInfo
+                  packageNameClassName='w-auto'
+                  orgName={collection.author}
+                  packageName={collection.name.split('/').pop() || ''}
+                />
+              </div>
+              <div className='system-md-semibold mt-1 text-text-primary'>{currTool?.label[language]}</div>
+              {!!currTool?.description[language] && (
+                <Description className='mt-3' text={currTool.description[language]} descriptionLineRows={2}></Description>
+              )}
+            </div>
+            {/* form */}
+            <div className='h-full'>
+              <div className='flex h-full flex-col'>
+                {(hasSetting && !readonly) ? (
+                  <TabSlider
+                    className='mt-1 shrink-0 px-4'
+                    itemClassName='py-3'
+                    noBorderBottom
+                    value={currType}
+                    onChange={(value) => {
+                      setCurrType(value)
+                    }}
+                    options={[
+                      { value: 'info', text: t('tools.setBuiltInTools.parameters')! },
+                      { value: 'setting', text: t('tools.setBuiltInTools.setting')! },
+                    ]}
+                  />
+                ) : (
+                  <div className='system-sm-semibold-uppercase p-4 pb-1 text-text-primary'>{t('tools.setBuiltInTools.parameters')}</div>
+                )}
+                <div className='h-0 grow overflow-y-auto px-4'>
+                  {isInfoActive ? infoUI : settingUI}
+                </div>
+                {!readonly && !isInfoActive && (
+                  <div className='mt-2 flex shrink-0 justify-end space-x-2 rounded-b-[10px]  border-t border-divider-regular bg-components-panel-bg px-6 py-4'>
+                    <Button className='flex h-8 items-center !px-3 !text-[13px] font-medium ' onClick={onHide}>{t('common.operation.cancel')}</Button>
+                    <Button className='flex h-8 items-center !px-3 !text-[13px] font-medium' variant='primary' disabled={!isValid} onClick={() => onSave?.(addDefaultValue(tempSetting, formSchemas))}>{t('common.operation.save')}</Button>
+                  </div>
+                )}
+              </div>
+            </div>
+          </>
+        )}
+      </>
+    </Drawer>
+  )
+}
+export default React.memo(SettingBuiltInTool)
diff --git a/app/components/app/configuration/config/agent/prompt-editor.tsx b/app/components/app/configuration/config/agent/prompt-editor.tsx
new file mode 100644
index 0000000..7f7f140
--- /dev/null
+++ b/app/components/app/configuration/config/agent/prompt-editor.tsx
@@ -0,0 +1,149 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import copy from 'copy-to-clipboard'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+import {
+  Clipboard,
+  ClipboardCheck,
+} from '@/app/components/base/icons/src/vender/line/files'
+import PromptEditor from '@/app/components/base/prompt-editor'
+import type { ExternalDataTool } from '@/models/common'
+import ConfigContext from '@/context/debug-configuration'
+import { useModalContext } from '@/context/modal-context'
+import { useToastContext } from '@/app/components/base/toast'
+import s from '@/app/components/app/configuration/config-prompt/style.module.css'
+import { noop } from 'lodash-es'
+
+type Props = {
+  className?: string
+  type: 'first-prompt' | 'next-iteration'
+  value: string
+  onChange: (value: string) => void
+}
+
+const Editor: FC<Props> = ({
+  className,
+  type,
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  const { notify } = useToastContext()
+
+  const [isCopied, setIsCopied] = React.useState(false)
+  const {
+    modelConfig,
+    hasSetBlockStatus,
+    dataSets,
+    showSelectDataSet,
+    externalDataToolsConfig,
+    setExternalDataToolsConfig,
+  } = useContext(ConfigContext)
+  const promptVariables = modelConfig.configs.prompt_variables
+  const { setShowExternalDataToolModal } = useModalContext()
+  const isFirstPrompt = type === 'first-prompt'
+  const editorHeight = isFirstPrompt ? 'h-[336px]' : 'h-[52px]'
+
+  const handleOpenExternalDataToolModal = () => {
+    setShowExternalDataToolModal({
+      payload: {},
+      onSaveCallback: (newExternalDataTool: ExternalDataTool) => {
+        setExternalDataToolsConfig([...externalDataToolsConfig, newExternalDataTool])
+      },
+      onValidateBeforeSaveCallback: (newExternalDataTool: ExternalDataTool) => {
+        for (let i = 0; i < promptVariables.length; i++) {
+          if (promptVariables[i].key === newExternalDataTool.variable) {
+            notify({ type: 'error', message: t('appDebug.varKeyError.keyAlreadyExists', { key: promptVariables[i].key }) })
+            return false
+          }
+        }
+
+        for (let i = 0; i < externalDataToolsConfig.length; i++) {
+          if (externalDataToolsConfig[i].variable === newExternalDataTool.variable) {
+            notify({ type: 'error', message: t('appDebug.varKeyError.keyAlreadyExists', { key: externalDataToolsConfig[i].variable }) })
+            return false
+          }
+        }
+
+        return true
+      },
+    })
+  }
+  return (
+    <div className={cn(className, s.gradientBorder, 'relative')}>
+      <div className='rounded-xl bg-white'>
+        <div className={cn(s.boxHeader, 'flex h-11 items-center justify-between rounded-tl-xl rounded-tr-xl bg-white pb-1 pl-4 pr-3 pt-2 hover:shadow-xs')}>
+          <div className='text-sm font-semibold uppercase text-indigo-800'>{t(`appDebug.agent.${isFirstPrompt ? 'firstPrompt' : 'nextIteration'}`)}</div>
+          <div className={cn(s.optionWrap, 'items-center space-x-1')}>
+            {!isCopied
+              ? (
+                <Clipboard className='h-6 w-6 cursor-pointer p-1 text-gray-500' onClick={() => {
+                  copy(value)
+                  setIsCopied(true)
+                }} />
+              )
+              : (
+                <ClipboardCheck className='h-6 w-6 p-1 text-gray-500' />
+              )}
+          </div>
+        </div>
+        <div className={cn(editorHeight, ' min-h-[102px] overflow-y-auto px-4 text-sm text-gray-700')}>
+          <PromptEditor
+            className={editorHeight}
+            value={value}
+            contextBlock={{
+              show: true,
+              selectable: !hasSetBlockStatus.context,
+              datasets: dataSets.map(item => ({
+                id: item.id,
+                name: item.name,
+                type: item.data_source_type,
+              })),
+              onAddContext: showSelectDataSet,
+            }}
+            variableBlock={{
+              show: true,
+              variables: modelConfig.configs.prompt_variables.map(item => ({
+                name: item.name,
+                value: item.key,
+              })),
+            }}
+            externalToolBlock={{
+              show: true,
+              externalTools: externalDataToolsConfig.map(item => ({
+                name: item.label!,
+                variableName: item.variable!,
+                icon: item.icon,
+                icon_background: item.icon_background,
+              })),
+              onAddExternalTool: handleOpenExternalDataToolModal,
+            }}
+            historyBlock={{
+              show: false,
+              selectable: false,
+              history: {
+                user: '',
+                assistant: '',
+              },
+              onEditRole: noop,
+            }}
+            queryBlock={{
+              show: false,
+              selectable: false,
+            }}
+            onChange={onChange}
+            onBlur={noop}
+          />
+        </div>
+        <div className='flex pb-2 pl-4'>
+          <div className="h-[18px] rounded-md bg-gray-100 px-1 text-xs leading-[18px] text-gray-500">{value.length}</div>
+        </div>
+      </div>
+    </div>
+  )
+}
+export default React.memo(Editor)
diff --git a/app/components/app/configuration/config/assistant-type-picker/index.tsx b/app/components/app/configuration/config/assistant-type-picker/index.tsx
new file mode 100644
index 0000000..874c6bc
--- /dev/null
+++ b/app/components/app/configuration/config/assistant-type-picker/index.tsx
@@ -0,0 +1,165 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine } from '@remixicon/react'
+import AgentSetting from '../agent/agent-setting'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { BubbleText } from '@/app/components/base/icons/src/vender/solid/education'
+import Radio from '@/app/components/base/radio/ui'
+import { CuteRobot } from '@/app/components/base/icons/src/vender/solid/communication'
+import { Settings04 } from '@/app/components/base/icons/src/vender/line/general'
+import { ArrowUpRight } from '@/app/components/base/icons/src/vender/line/arrows'
+import type { AgentConfig } from '@/models/debug'
+
+type Props = {
+  value: string
+  disabled: boolean
+  onChange: (value: string) => void
+  isFunctionCall: boolean
+  isChatModel: boolean
+  agentConfig?: AgentConfig
+  onAgentSettingChange: (payload: AgentConfig) => void
+}
+
+type ItemProps = {
+  text: string
+  disabled: boolean
+  value: string
+  isChecked: boolean
+  description: string
+  Icon: any
+  onClick: (value: string) => void
+}
+
+const SelectItem: FC<ItemProps> = ({ text, value, Icon, isChecked, description, onClick, disabled }) => {
+  return (
+    <div
+      className={cn(disabled ? 'opacity-50' : 'cursor-pointer', isChecked ? 'border-[2px] border-indigo-600 shadow-sm' : 'border border-gray-100', 'mb-2 rounded-xl bg-gray-25 p-3 pr-4 hover:bg-gray-50')}
+      onClick={() => !disabled && onClick(value)}
+    >
+      <div className='flex items-center justify-between'>
+        <div className='flex items-center '>
+          <div className='mr-3 rounded-lg bg-indigo-50 p-1'>
+            <Icon className='h-4 w-4 text-indigo-600' />
+          </div>
+          <div className='text-sm font-medium leading-5 text-gray-900'>{text}</div>
+        </div>
+        <Radio isChecked={isChecked} />
+      </div>
+      <div className='ml-9 text-xs font-normal leading-[18px] text-gray-500'>{description}</div>
+    </div>
+  )
+}
+
+const AssistantTypePicker: FC<Props> = ({
+  value,
+  disabled,
+  onChange,
+  onAgentSettingChange,
+  isFunctionCall,
+  isChatModel,
+  agentConfig,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const handleChange = (chosenValue: string) => {
+    if (value === chosenValue)
+      return
+
+    onChange(chosenValue)
+    if (chosenValue !== 'agent')
+      setOpen(false)
+  }
+  const isAgent = value === 'agent'
+  const [isShowAgentSetting, setIsShowAgentSetting] = useState(false)
+
+  const agentConfigUI = (
+    <>
+      <div className='my-4 h-[1px] bg-gray-100'></div>
+      <div
+        className={cn(isAgent ? 'group cursor-pointer hover:bg-primary-50' : 'opacity-30', 'rounded-xl bg-gray-50 p-3 pr-4 ')}
+        onClick={() => {
+          if (isAgent) {
+            setOpen(false)
+            setIsShowAgentSetting(true)
+          }
+        }}
+      >
+        <div className='flex items-center justify-between'>
+          <div className='flex items-center '>
+            <div className='mr-3 rounded-lg bg-gray-200 p-1 group-hover:bg-white'>
+              <Settings04 className='h-4 w-4 text-gray-600 group-hover:text-[#155EEF]' />
+            </div>
+            <div className='text-sm font-medium leading-5 text-gray-900 group-hover:text-[#155EEF]'>{t('appDebug.agent.setting.name')}</div>
+          </div>
+          <ArrowUpRight className='h-4 w-4 text-gray-500 group-hover:text-[#155EEF]' />
+        </div>
+        <div className='ml-9 text-xs font-normal leading-[18px] text-gray-500'>{t('appDebug.agent.setting.description')}</div>
+      </div>
+    </>
+  )
+  return (
+    <>
+      <PortalToFollowElem
+        open={open}
+        onOpenChange={setOpen}
+        placement='bottom-end'
+        offset={{
+          mainAxis: 8,
+          crossAxis: -2,
+        }}
+      >
+        <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+          <div className={cn(open && 'bg-gray-50', 'flex h-8 cursor-pointer select-none items-center space-x-1 rounded-lg border border-black/5 px-3 text-indigo-600')}>
+            {isAgent ? <BubbleText className='h-3 w-3' /> : <CuteRobot className='h-3 w-3' />}
+            <div className='text-xs font-medium'>{t(`appDebug.assistantType.${isAgent ? 'agentAssistant' : 'chatAssistant'}.name`)}</div>
+            <RiArrowDownSLine className='h-3 w-3' />
+          </div>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent style={{ zIndex: 1000 }}>
+          <div className='relative left-0.5 w-[480px] rounded-xl border border-black/8 bg-white p-6 shadow-lg'>
+            <div className='mb-2 text-sm font-semibold leading-5 text-gray-900'>{t('appDebug.assistantType.name')}</div>
+            <SelectItem
+              Icon={BubbleText}
+              value='chat'
+              disabled={disabled}
+              text={t('appDebug.assistantType.chatAssistant.name')}
+              description={t('appDebug.assistantType.chatAssistant.description')}
+              isChecked={!isAgent}
+              onClick={handleChange}
+            />
+            <SelectItem
+              Icon={CuteRobot}
+              value='agent'
+              disabled={disabled}
+              text={t('appDebug.assistantType.agentAssistant.name')}
+              description={t('appDebug.assistantType.agentAssistant.description')}
+              isChecked={isAgent}
+              onClick={handleChange}
+            />
+            {!disabled && agentConfigUI}
+          </div>
+        </PortalToFollowElemContent>
+      </PortalToFollowElem>
+      {isShowAgentSetting && (
+        <AgentSetting
+          isFunctionCall={isFunctionCall}
+          payload={agentConfig as AgentConfig}
+          isChatModel={isChatModel}
+          onSave={(payloadNew) => {
+            onAgentSettingChange(payloadNew)
+            setIsShowAgentSetting(false)
+          }}
+          onCancel={() => setIsShowAgentSetting(false)}
+        />
+      )}
+    </>
+  )
+}
+export default React.memo(AssistantTypePicker)
diff --git a/app/components/app/configuration/config/automatic/automatic-btn.tsx b/app/components/app/configuration/config/automatic/automatic-btn.tsx
new file mode 100644
index 0000000..b2d4e30
--- /dev/null
+++ b/app/components/app/configuration/config/automatic/automatic-btn.tsx
@@ -0,0 +1,25 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiSparklingFill,
+} from '@remixicon/react'
+import Button from '@/app/components/base/button'
+
+export type IAutomaticBtnProps = {
+  onClick: () => void
+}
+const AutomaticBtn: FC<IAutomaticBtnProps> = ({
+  onClick,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <Button variant='secondary-accent' size='small' onClick={onClick}>
+      <RiSparklingFill className='mr-1 h-3.5 w-3.5' />
+      <span className=''>{t('appDebug.operation.automatic')}</span>
+    </Button>
+  )
+}
+export default React.memo(AutomaticBtn)
diff --git a/app/components/app/configuration/config/automatic/get-automatic-res.tsx b/app/components/app/configuration/config/automatic/get-automatic-res.tsx
new file mode 100644
index 0000000..e4b333d
--- /dev/null
+++ b/app/components/app/configuration/config/automatic/get-automatic-res.tsx
@@ -0,0 +1,330 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import {
+  RiDatabase2Line,
+  RiFileExcel2Line,
+  RiGitCommitLine,
+  RiNewspaperLine,
+  RiPresentationLine,
+  RiRoadMapLine,
+  RiTerminalBoxLine,
+  RiTranslate,
+  RiUser2Line,
+} from '@remixicon/react'
+import cn from 'classnames'
+import s from './style.module.css'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import Textarea from '@/app/components/base/textarea'
+import Toast from '@/app/components/base/toast'
+import { generateRule } from '@/service/debug'
+import ConfigPrompt from '@/app/components/app/configuration/config-prompt'
+import type { Model } from '@/types/app'
+import { AppType } from '@/types/app'
+import ConfigVar from '@/app/components/app/configuration/config-var'
+import GroupName from '@/app/components/app/configuration/base/group-name'
+import Loading from '@/app/components/base/loading'
+import Confirm from '@/app/components/base/confirm'
+import { LoveMessage } from '@/app/components/base/icons/src/vender/features'
+
+// type
+import type { AutomaticRes } from '@/service/debug'
+import { Generator } from '@/app/components/base/icons/src/vender/other'
+import ModelIcon from '@/app/components/header/account-setting/model-provider-page/model-icon'
+import ModelName from '@/app/components/header/account-setting/model-provider-page/model-name'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+
+export type IGetAutomaticResProps = {
+  mode: AppType
+  model: Model
+  isShow: boolean
+  onClose: () => void
+  onFinished: (res: AutomaticRes) => void
+  isInLLMNode?: boolean
+}
+
+const TryLabel: FC<{
+  Icon: any
+  text: string
+  onClick: () => void
+}> = ({ Icon, text, onClick }) => {
+  return (
+    <div
+      className='mr-1 mt-2 flex h-7 shrink-0 cursor-pointer items-center rounded-lg bg-components-button-secondary-bg px-2'
+      onClick={onClick}
+    >
+      <Icon className='h-4 w-4 text-text-tertiary'></Icon>
+      <div className='ml-1 text-xs font-medium text-text-secondary'>{text}</div>
+    </div>
+  )
+}
+
+const GetAutomaticRes: FC<IGetAutomaticResProps> = ({
+  mode,
+  model,
+  isShow,
+  onClose,
+  isInLLMNode,
+  onFinished,
+}) => {
+  const { t } = useTranslation()
+  const {
+    currentProvider,
+    currentModel,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.textGeneration)
+  const tryList = [
+    {
+      icon: RiTerminalBoxLine,
+      key: 'pythonDebugger',
+    },
+    {
+      icon: RiTranslate,
+      key: 'translation',
+    },
+    {
+      icon: RiPresentationLine,
+      key: 'meetingTakeaways',
+    },
+    {
+      icon: RiNewspaperLine,
+      key: 'writingsPolisher',
+    },
+    {
+      icon: RiUser2Line,
+      key: 'professionalAnalyst',
+    },
+    {
+      icon: RiFileExcel2Line,
+      key: 'excelFormulaExpert',
+    },
+    {
+      icon: RiRoadMapLine,
+      key: 'travelPlanning',
+    },
+    {
+      icon: RiDatabase2Line,
+      key: 'SQLSorcerer',
+    },
+    {
+      icon: RiGitCommitLine,
+      key: 'GitGud',
+    },
+  ]
+
+  const [instruction, setInstruction] = React.useState<string>('')
+  const handleChooseTemplate = useCallback((key: string) => {
+    return () => {
+      const template = t(`appDebug.generate.template.${key}.instruction`)
+      setInstruction(template)
+    }
+  }, [t])
+  const isValid = () => {
+    if (instruction.trim() === '') {
+      Toast.notify({
+        type: 'error',
+        message: t('common.errorMsg.fieldRequired', {
+          field: t('appDebug.generate.instruction'),
+        }),
+      })
+      return false
+    }
+    return true
+  }
+  const [isLoading, { setTrue: setLoadingTrue, setFalse: setLoadingFalse }] = useBoolean(false)
+  const [res, setRes] = React.useState<AutomaticRes | null>(null)
+
+  const renderLoading = (
+    <div className='flex h-full w-0 grow flex-col items-center justify-center space-y-3'>
+      <Loading />
+      <div className='text-[13px] text-text-tertiary'>{t('appDebug.generate.loading')}</div>
+    </div>
+  )
+
+  const renderNoData = (
+    <div className='flex h-full w-0 grow flex-col items-center justify-center space-y-3 px-8'>
+      <Generator className='h-14 w-14 text-text-tertiary' />
+      <div className='text-center text-[13px] font-normal leading-5 text-text-tertiary'>
+        <div>{t('appDebug.generate.noDataLine1')}</div>
+        <div>{t('appDebug.generate.noDataLine2')}</div>
+      </div>
+    </div>
+  )
+
+  const onGenerate = async () => {
+    if (!isValid())
+      return
+    if (isLoading)
+      return
+    setLoadingTrue()
+    try {
+      const { error, ...res } = await generateRule({
+        instruction,
+        model_config: model,
+        no_variable: !!isInLLMNode,
+      })
+      setRes(res)
+      if (error) {
+        Toast.notify({
+          type: 'error',
+          message: error,
+        })
+      }
+    }
+    finally {
+      setLoadingFalse()
+    }
+  }
+
+  const [showConfirmOverwrite, setShowConfirmOverwrite] = React.useState(false)
+
+  const isShowAutoPromptResPlaceholder = () => {
+    return !isLoading && !res
+  }
+
+  return (
+    <Modal
+      isShow={isShow}
+      onClose={onClose}
+      className='min-w-[1140px] !p-0'
+      closable
+    >
+      <div className='flex h-[680px] flex-wrap'>
+        <div className='h-full w-[570px] shrink-0 overflow-y-auto border-r border-divider-regular p-6'>
+          <div className='mb-8'>
+            <div className={`text-lg font-bold leading-[28px] ${s.textGradient}`}>{t('appDebug.generate.title')}</div>
+            <div className='mt-1 text-[13px] font-normal text-text-tertiary'>{t('appDebug.generate.description')}</div>
+          </div>
+          <div className='mb-8 flex items-center'>
+            <ModelIcon
+              className='mr-1.5 shrink-0 '
+              provider={currentProvider}
+              modelName={currentModel?.model}
+            />
+            <ModelName
+              className='grow'
+              modelItem={currentModel!}
+              showMode
+              showFeatures
+            />
+          </div>
+          <div >
+            <div className='flex items-center'>
+              <div className='mr-3 shrink-0 text-xs font-semibold uppercase leading-[18px] text-text-tertiary'>{t('appDebug.generate.tryIt')}</div>
+              <div className='h-px grow' style={{
+                background: 'linear-gradient(to right, rgba(243, 244, 246, 1), rgba(243, 244, 246, 0))',
+              }}></div>
+            </div>
+            <div className='flex flex-wrap'>
+              {tryList.map(item => (
+                <TryLabel
+                  key={item.key}
+                  Icon={item.icon}
+                  text={t(`appDebug.generate.template.${item.key}.name`)}
+                  onClick={handleChooseTemplate(item.key)}
+                />
+              ))}
+            </div>
+          </div>
+          {/* inputs */}
+          <div className='mt-6'>
+            <div className='text-[0px]'>
+              <div className='mb-2 text-sm font-medium leading-5 text-text-primary'>{t('appDebug.generate.instruction')}</div>
+              <Textarea
+                className="h-[200px] resize-none"
+                placeholder={t('appDebug.generate.instructionPlaceHolder') as string}
+                value={instruction}
+                onChange={e => setInstruction(e.target.value)} />
+            </div>
+
+            <div className='mt-5 flex justify-end'>
+              <Button
+                className='flex space-x-1'
+                variant='primary'
+                onClick={onGenerate}
+                disabled={isLoading}
+              >
+                <Generator className='h-4 w-4 text-white' />
+                <span className='text-xs font-semibold text-white'>{t('appDebug.generate.generate')}</span>
+              </Button>
+            </div>
+          </div>
+        </div>
+
+        {(!isLoading && res) && (
+          <div className='h-full w-0 grow p-6 pb-0'>
+            <div className='mb-3 shrink-0 text-base font-semibold leading-[160%] text-text-secondary'>{t('appDebug.generate.resTitle')}</div>
+            <div className={cn('max-h-[555px] overflow-y-auto', !isInLLMNode && 'pb-2')}>
+              <ConfigPrompt
+                mode={mode}
+                promptTemplate={res?.prompt || ''}
+                promptVariables={[]}
+                readonly
+                noTitle={isInLLMNode}
+                gradientBorder
+                editorHeight={isInLLMNode ? 524 : 0}
+                noResize={isInLLMNode}
+              />
+              {!isInLLMNode && (
+                <>
+                  {(res?.variables?.length && res?.variables?.length > 0)
+                    ? (
+                      <ConfigVar
+                        promptVariables={res?.variables.map(key => ({ key, name: key, type: 'string', required: true })) || []}
+                        readonly
+                      />
+                    )
+                    : ''}
+
+                  {(mode !== AppType.completion && res?.opening_statement) && (
+                    <div className='mt-7'>
+                      <GroupName name={t('appDebug.feature.groupChat.title')} />
+                      <div
+                        className='mb-1 rounded-xl border-l-[0.5px] border-t-[0.5px] border-effects-highlight bg-background-section-burn p-3'
+                      >
+                        <div className='mb-2 flex items-center gap-2'>
+                          <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-blue-light-blue-light-500 p-1 shadow-xs'>
+                            <LoveMessage className='h-4 w-4 text-text-primary-on-surface' />
+                          </div>
+                          <div className='system-sm-semibold flex grow items-center text-text-secondary'>
+                            {t('appDebug.feature.conversationOpener.title')}
+                          </div>
+                        </div>
+                        <div className='system-xs-regular min-h-8 text-text-tertiary'>{res.opening_statement}</div>
+                      </div>
+                    </div>
+                  )}
+                </>
+              )}
+            </div>
+
+            <div className='flex justify-end bg-background-default py-4'>
+              <Button onClick={onClose}>{t('common.operation.cancel')}</Button>
+              <Button variant='primary' className='ml-2' onClick={() => {
+                setShowConfirmOverwrite(true)
+              }}>{t('appDebug.generate.apply')}</Button>
+            </div>
+          </div>
+        )}
+        {isLoading && renderLoading}
+        {isShowAutoPromptResPlaceholder() && renderNoData}
+        {showConfirmOverwrite && (
+          <Confirm
+            title={t('appDebug.generate.overwriteTitle')}
+            content={t('appDebug.generate.overwriteMessage')}
+            isShow={showConfirmOverwrite}
+            onConfirm={() => {
+              setShowConfirmOverwrite(false)
+              onFinished(res!)
+            }}
+            onCancel={() => setShowConfirmOverwrite(false)}
+          />
+        )}
+      </div>
+    </Modal>
+  )
+}
+export default React.memo(GetAutomaticRes)
diff --git a/app/components/app/configuration/config/automatic/style.module.css b/app/components/app/configuration/config/automatic/style.module.css
new file mode 100644
index 0000000..15bedd8
--- /dev/null
+++ b/app/components/app/configuration/config/automatic/style.module.css
@@ -0,0 +1,7 @@
+.textGradient {
+  background: linear-gradient(92deg, #2250F2 -29.55%, #0EBCF3 75.22%);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+  text-fill-color: transparent;
+}
diff --git a/app/components/app/configuration/config/code-generator/get-code-generator-res.tsx b/app/components/app/configuration/config/code-generator/get-code-generator-res.tsx
new file mode 100644
index 0000000..ddae2f5
--- /dev/null
+++ b/app/components/app/configuration/config/code-generator/get-code-generator-res.tsx
@@ -0,0 +1,230 @@
+import type { FC } from 'react'
+import React from 'react'
+import cn from 'classnames'
+import useBoolean from 'ahooks/lib/useBoolean'
+import { useTranslation } from 'react-i18next'
+import ConfigPrompt from '../../config-prompt'
+import { languageMap } from '../../../../workflow/nodes/_base/components/editor/code-editor/index'
+import { generateRuleCode } from '@/service/debug'
+import type { CodeGenRes } from '@/service/debug'
+import { type AppType, type Model, ModelModeType } from '@/types/app'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import { Generator } from '@/app/components/base/icons/src/vender/other'
+import Toast from '@/app/components/base/toast'
+import Loading from '@/app/components/base/loading'
+import Confirm from '@/app/components/base/confirm'
+import type { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import ModelIcon from '@/app/components/header/account-setting/model-provider-page/model-icon'
+import ModelName from '@/app/components/header/account-setting/model-provider-page/model-name'
+export type IGetCodeGeneratorResProps = {
+  mode: AppType
+  isShow: boolean
+  codeLanguages: CodeLanguage
+  onClose: () => void
+  onFinished: (res: CodeGenRes) => void
+}
+
+export const GetCodeGeneratorResModal: FC<IGetCodeGeneratorResProps> = (
+  {
+    mode,
+    isShow,
+    codeLanguages,
+    onClose,
+    onFinished,
+  },
+) => {
+  const {
+    currentProvider,
+    currentModel,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.textGeneration)
+  const { t } = useTranslation()
+  const [instruction, setInstruction] = React.useState<string>('')
+  const [isLoading, { setTrue: setLoadingTrue, setFalse: setLoadingFalse }] = useBoolean(false)
+  const [res, setRes] = React.useState<CodeGenRes | null>(null)
+  const isValid = () => {
+    if (instruction.trim() === '') {
+      Toast.notify({
+        type: 'error',
+        message: t('common.errorMsg.fieldRequired', {
+          field: t('appDebug.code.instruction'),
+        }),
+      })
+      return false
+    }
+    return true
+  }
+  const model: Model = {
+    provider: currentProvider?.provider || '',
+    name: currentModel?.model || '',
+    mode: ModelModeType.chat,
+    // This is a fixed parameter
+    completion_params: {
+      temperature: 0.7,
+      max_tokens: 0,
+      top_p: 0,
+      echo: false,
+      stop: [],
+      presence_penalty: 0,
+      frequency_penalty: 0,
+    },
+  }
+  const isInLLMNode = true
+  const onGenerate = async () => {
+    if (!isValid())
+      return
+    if (isLoading)
+      return
+    setLoadingTrue()
+    try {
+      const { error, ...res } = await generateRuleCode({
+        instruction,
+        model_config: model,
+        no_variable: !!isInLLMNode,
+        code_language: languageMap[codeLanguages] || 'javascript',
+      })
+      setRes(res)
+      if (error) {
+        Toast.notify({
+          type: 'error',
+          message: error,
+        })
+      }
+    }
+    finally {
+      setLoadingFalse()
+    }
+  }
+  const [showConfirmOverwrite, setShowConfirmOverwrite] = React.useState(false)
+
+  const renderLoading = (
+    <div className='flex h-full w-0 grow flex-col items-center justify-center space-y-3'>
+      <Loading />
+      <div className='text-[13px] text-gray-400'>{t('appDebug.codegen.loading')}</div>
+    </div>
+  )
+  const renderNoData = (
+    <div className='flex h-full w-0 grow flex-col items-center justify-center space-y-3 px-8'>
+      <Generator className='h-14 w-14 text-gray-300' />
+      <div className='text-center text-[13px] font-normal leading-5 text-gray-400'>
+        <div>{t('appDebug.codegen.noDataLine1')}</div>
+        <div>{t('appDebug.codegen.noDataLine2')}</div>
+      </div>
+    </div>
+  )
+
+  return (
+    <Modal
+      isShow={isShow}
+      onClose={onClose}
+      className='min-w-[1140px] !p-0'
+      closable
+    >
+      <div className='relative flex h-[680px] flex-wrap'>
+        <div className='h-full w-[570px] shrink-0 overflow-y-auto border-r border-gray-100 p-8'>
+          <div className='mb-8'>
+            <div className={'text-lg font-bold leading-[28px]'}>{t('appDebug.codegen.title')}</div>
+            <div className='mt-1 text-[13px] font-normal text-gray-500'>{t('appDebug.codegen.description')}</div>
+          </div>
+          <div className='flex items-center'>
+            <ModelIcon
+              className='mr-1.5 shrink-0'
+              provider={currentProvider}
+              modelName={currentModel?.model}
+            />
+            <ModelName
+              className='grow'
+              modelItem={currentModel!}
+              showMode
+              showFeatures
+            />
+          </div>
+          <div className='mt-6'>
+            <div className='text-[0px]'>
+              <div className='mb-2 text-sm font-medium leading-5 text-gray-900'>{t('appDebug.codegen.instruction')}</div>
+              <textarea
+                className="h-[200px] w-full overflow-y-auto rounded-lg bg-gray-50 px-3 py-2 text-sm"
+                placeholder={t('appDebug.codegen.instructionPlaceholder') || ''}
+                value={instruction}
+                onChange={e => setInstruction(e.target.value)}
+              />
+            </div>
+
+            <div className='mt-5 flex justify-end'>
+              <Button
+                className='flex space-x-1'
+                variant='primary'
+                onClick={onGenerate}
+                disabled={isLoading}
+              >
+                <Generator className='h-4 w-4 text-white' />
+                <span className='text-xs font-semibold text-white'>{t('appDebug.codegen.generate')}</span>
+              </Button>
+            </div>
+          </div>
+        </div>
+        {isLoading && renderLoading}
+        {!isLoading && !res && renderNoData}
+        {(!isLoading && res) && (
+          <div className='h-full w-0 grow p-6 pb-0'>
+            <div className='mb-3 shrink-0 text-base font-semibold leading-[160%] text-gray-800'>{t('appDebug.codegen.resTitle')}</div>
+            <div className={cn('max-h-[555px] overflow-y-auto', !isInLLMNode && 'pb-2')}>
+              <ConfigPrompt
+                mode={mode}
+                promptTemplate={res?.code || ''}
+                promptVariables={[]}
+                readonly
+                noTitle={isInLLMNode}
+                gradientBorder
+                editorHeight={isInLLMNode ? 524 : 0}
+                noResize={isInLLMNode}
+              />
+              {!isInLLMNode && (
+                <>
+                  {res?.code && (
+                    <div className='mt-4'>
+                      <h3 className='mb-2 text-sm font-medium text-gray-900'>{t('appDebug.codegen.generatedCode')}</h3>
+                      <pre className='overflow-x-auto rounded-lg bg-gray-50 p-4'>
+                        <code className={`language-${res.language}`}>
+                          {res.code}
+                        </code>
+                      </pre>
+                    </div>
+                  )}
+                  {res?.error && (
+                    <div className='mt-4 rounded-lg bg-red-50 p-4'>
+                      <p className='text-sm text-red-600'>{res.error}</p>
+                    </div>
+                  )}
+                </>
+              )}
+            </div>
+
+            <div className='flex justify-end bg-white py-4'>
+              <Button onClick={onClose}>{t('common.operation.cancel')}</Button>
+              <Button variant='primary' className='ml-2' onClick={() => {
+                setShowConfirmOverwrite(true)
+              }}>{t('appDebug.codegen.apply')}</Button>
+            </div>
+          </div>
+        )}
+      </div>
+      {showConfirmOverwrite && (
+        <Confirm
+          title={t('appDebug.codegen.overwriteConfirmTitle')}
+          content={t('appDebug.codegen.overwriteConfirmMessage')}
+          isShow={showConfirmOverwrite}
+          onConfirm={() => {
+            setShowConfirmOverwrite(false)
+            onFinished(res!)
+          }}
+          onCancel={() => setShowConfirmOverwrite(false)}
+        />
+      )}
+    </Modal>
+  )
+}
+
+export default React.memo(GetCodeGeneratorResModal)
diff --git a/app/components/app/configuration/config/config-document.tsx b/app/components/app/configuration/config/config-document.tsx
new file mode 100644
index 0000000..9300bbc
--- /dev/null
+++ b/app/components/app/configuration/config/config-document.tsx
@@ -0,0 +1,78 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { useContext } from 'use-context-selector'
+
+import { Document } from '@/app/components/base/icons/src/vender/features'
+import Tooltip from '@/app/components/base/tooltip'
+import ConfigContext from '@/context/debug-configuration'
+import { SupportUploadFileTypes } from '@/app/components/workflow/types'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import Switch from '@/app/components/base/switch'
+
+const ConfigDocument: FC = () => {
+  const { t } = useTranslation()
+  const file = useFeatures(s => s.features.file)
+  const featuresStore = useFeaturesStore()
+  const { isShowDocumentConfig } = useContext(ConfigContext)
+
+  const isDocumentEnabled = file?.allowed_file_types?.includes(SupportUploadFileTypes.document) ?? false
+
+  const handleChange = useCallback((value: boolean) => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+
+    const newFeatures = produce(features, (draft) => {
+      if (value) {
+        draft.file!.allowed_file_types = Array.from(new Set([
+          ...(draft.file?.allowed_file_types || []),
+          SupportUploadFileTypes.document,
+        ]))
+      }
+      else {
+        draft.file!.allowed_file_types = draft.file!.allowed_file_types?.filter(
+          type => type !== SupportUploadFileTypes.document,
+        )
+      }
+      if (draft.file)
+        draft.file.enabled = (draft.file.allowed_file_types?.length ?? 0) > 0
+    })
+    setFeatures(newFeatures)
+  }, [featuresStore])
+
+  if (!isShowDocumentConfig)
+    return null
+
+  return (
+    <div className='mt-2 flex items-center gap-2 rounded-xl border-l-[0.5px] border-t-[0.5px] bg-background-section-burn p-2'>
+      <div className='shrink-0 p-1'>
+        <div className='rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-indigo-indigo-600 p-1 shadow-xs'>
+          <Document className='h-4 w-4 text-text-primary-on-surface' />
+        </div>
+      </div>
+      <div className='flex grow items-center'>
+        <div className='system-sm-semibold mr-1 text-text-secondary'>{t('appDebug.feature.documentUpload.title')}</div>
+        <Tooltip
+          popupContent={
+            <div className='w-[180px]' >
+              {t('appDebug.feature.documentUpload.description')}
+            </div>
+          }
+        />
+      </div>
+      <div className='flex shrink-0 items-center'>
+        <div className='ml-1 mr-3 h-3.5 w-[1px] bg-divider-subtle'></div>
+        <Switch
+          defaultValue={isDocumentEnabled}
+          onChange={handleChange}
+          size='md'
+        />
+      </div>
+    </div>
+  )
+}
+export default React.memo(ConfigDocument)
diff --git a/app/components/app/configuration/config/feature/use-feature.tsx b/app/components/app/configuration/config/feature/use-feature.tsx
new file mode 100644
index 0000000..acc08dd
--- /dev/null
+++ b/app/components/app/configuration/config/feature/use-feature.tsx
@@ -0,0 +1,96 @@
+import React, { useEffect } from 'react'
+
+function useFeature({
+  introduction,
+  setIntroduction,
+  moreLikeThis,
+  setMoreLikeThis,
+  suggestedQuestionsAfterAnswer,
+  setSuggestedQuestionsAfterAnswer,
+  speechToText,
+  setSpeechToText,
+  textToSpeech,
+  setTextToSpeech,
+  citation,
+  setCitation,
+  annotation,
+  setAnnotation,
+  moderation,
+  setModeration,
+}: {
+  introduction: string
+  setIntroduction: (introduction: string) => void
+  moreLikeThis: boolean
+  setMoreLikeThis: (moreLikeThis: boolean) => void
+  suggestedQuestionsAfterAnswer: boolean
+  setSuggestedQuestionsAfterAnswer: (suggestedQuestionsAfterAnswer: boolean) => void
+  speechToText: boolean
+  setSpeechToText: (speechToText: boolean) => void
+  textToSpeech: boolean
+  setTextToSpeech: (textToSpeech: boolean) => void
+  citation: boolean
+  setCitation: (citation: boolean) => void
+  annotation: boolean
+  setAnnotation: (annotation: boolean) => void
+  moderation: boolean
+  setModeration: (moderation: boolean) => void
+}) {
+  const [tempShowOpeningStatement, setTempShowOpeningStatement] = React.useState(!!introduction)
+  useEffect(() => {
+    // wait to api data back
+    if (introduction)
+      setTempShowOpeningStatement(true)
+  }, [introduction])
+
+  // const [tempMoreLikeThis, setTempMoreLikeThis] = React.useState(moreLikeThis)
+  // useEffect(() => {
+  //   setTempMoreLikeThis(moreLikeThis)
+  // }, [moreLikeThis])
+
+  const featureConfig = {
+    openingStatement: tempShowOpeningStatement,
+    moreLikeThis,
+    suggestedQuestionsAfterAnswer,
+    speechToText,
+    textToSpeech,
+    citation,
+    annotation,
+    moderation,
+  }
+  const handleFeatureChange = (key: string, value: boolean) => {
+    switch (key) {
+      case 'openingStatement':
+        if (!value)
+          setIntroduction('')
+
+        setTempShowOpeningStatement(value)
+        break
+      case 'moreLikeThis':
+        setMoreLikeThis(value)
+        break
+      case 'suggestedQuestionsAfterAnswer':
+        setSuggestedQuestionsAfterAnswer(value)
+        break
+      case 'speechToText':
+        setSpeechToText(value)
+        break
+      case 'textToSpeech':
+        setTextToSpeech(value)
+        break
+      case 'citation':
+        setCitation(value)
+        break
+      case 'annotation':
+        setAnnotation(value)
+        break
+      case 'moderation':
+        setModeration(value)
+    }
+  }
+  return {
+    featureConfig,
+    handleFeatureChange,
+  }
+}
+
+export default useFeature
diff --git a/app/components/app/configuration/config/index.tsx b/app/components/app/configuration/config/index.tsx
new file mode 100644
index 0000000..dc20955
--- /dev/null
+++ b/app/components/app/configuration/config/index.tsx
@@ -0,0 +1,99 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useContext } from 'use-context-selector'
+import produce from 'immer'
+import { useFormattingChangedDispatcher } from '../debug/hooks'
+import DatasetConfig from '../dataset-config'
+import HistoryPanel from '../config-prompt/conversation-history/history-panel'
+import ConfigVision from '../config-vision'
+import ConfigDocument from './config-document'
+import AgentTools from './agent/agent-tools'
+import ConfigContext from '@/context/debug-configuration'
+import ConfigPrompt from '@/app/components/app/configuration/config-prompt'
+import ConfigVar from '@/app/components/app/configuration/config-var'
+import type { ModelConfig, PromptVariable } from '@/models/debug'
+import type { AppType } from '@/types/app'
+import { ModelModeType } from '@/types/app'
+
+const Config: FC = () => {
+  const {
+    mode,
+    isAdvancedMode,
+    modelModeType,
+    isAgent,
+    hasSetBlockStatus,
+    showHistoryModal,
+    modelConfig,
+    setModelConfig,
+    setPrevPromptConfig,
+  } = useContext(ConfigContext)
+  const isChatApp = ['advanced-chat', 'agent-chat', 'chat'].includes(mode)
+  const formattingChangedDispatcher = useFormattingChangedDispatcher()
+
+  const promptTemplate = modelConfig.configs.prompt_template
+  const promptVariables = modelConfig.configs.prompt_variables
+  // simple mode
+  const handlePromptChange = (newTemplate: string, newVariables: PromptVariable[]) => {
+    const newModelConfig = produce(modelConfig, (draft: ModelConfig) => {
+      draft.configs.prompt_template = newTemplate
+      draft.configs.prompt_variables = [...draft.configs.prompt_variables, ...newVariables]
+    })
+    if (modelConfig.configs.prompt_template !== newTemplate)
+      formattingChangedDispatcher()
+
+    setPrevPromptConfig(modelConfig.configs)
+    setModelConfig(newModelConfig)
+  }
+
+  const handlePromptVariablesNameChange = (newVariables: PromptVariable[]) => {
+    setPrevPromptConfig(modelConfig.configs)
+    const newModelConfig = produce(modelConfig, (draft: ModelConfig) => {
+      draft.configs.prompt_variables = newVariables
+    })
+    setModelConfig(newModelConfig)
+  }
+
+  return (
+    <>
+      <div
+        className="relative h-0 grow overflow-y-auto px-6 pb-[50px]"
+      >
+        {/* Template */}
+        <ConfigPrompt
+          mode={mode as AppType}
+          promptTemplate={promptTemplate}
+          promptVariables={promptVariables}
+          onChange={handlePromptChange}
+        />
+
+        {/* Variables */}
+        <ConfigVar
+          promptVariables={promptVariables}
+          onPromptVariablesChange={handlePromptVariablesNameChange}
+        />
+
+        {/* Dataset */}
+        <DatasetConfig />
+
+        {/* Tools */}
+        {isAgent && (
+          <AgentTools />
+        )}
+
+        <ConfigVision />
+
+        <ConfigDocument />
+
+        {/* Chat History */}
+        {isAdvancedMode && isChatApp && modelModeType === ModelModeType.completion && (
+          <HistoryPanel
+            showWarning={!hasSetBlockStatus.history}
+            onShowEditModal={showHistoryModal}
+          />
+        )}
+      </div>
+    </>
+  )
+}
+export default React.memo(Config)
diff --git a/app/components/app/configuration/ctrl-btn-group/index.tsx b/app/components/app/configuration/ctrl-btn-group/index.tsx
new file mode 100644
index 0000000..e126e12
--- /dev/null
+++ b/app/components/app/configuration/ctrl-btn-group/index.tsx
@@ -0,0 +1,24 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import s from './style.module.css'
+import Button from '@/app/components/base/button'
+
+export type IContrlBtnGroupProps = {
+  onSave: () => void
+  onReset: () => void
+}
+
+const ContrlBtnGroup: FC<IContrlBtnGroupProps> = ({ onSave, onReset }) => {
+  const { t } = useTranslation()
+  return (
+    <div className="fixed bottom-0 left-[224px] h-[64px] w-[519px]">
+      <div className={`${s.ctrlBtn} flex h-full items-center gap-2  bg-white pl-4`}>
+        <Button variant='primary' onClick={onSave}>{t('appDebug.operation.applyConfig')}</Button>
+        <Button onClick={onReset}>{t('appDebug.operation.resetConfig')}</Button>
+      </div>
+    </div>
+  )
+}
+export default React.memo(ContrlBtnGroup)
diff --git a/app/components/app/configuration/ctrl-btn-group/style.module.css b/app/components/app/configuration/ctrl-btn-group/style.module.css
new file mode 100644
index 0000000..3e87486
--- /dev/null
+++ b/app/components/app/configuration/ctrl-btn-group/style.module.css
@@ -0,0 +1,6 @@
+.ctrlBtn {
+    left: -16px;
+    right: -16px;
+    bottom: -16px;
+    border-top: 1px solid #F3F4F6;
+}
diff --git a/app/components/app/configuration/dataset-config/card-item/index.tsx b/app/components/app/configuration/dataset-config/card-item/index.tsx
new file mode 100644
index 0000000..1220c75
--- /dev/null
+++ b/app/components/app/configuration/dataset-config/card-item/index.tsx
@@ -0,0 +1,58 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import TypeIcon from '../type-icon'
+import RemoveIcon from '../../base/icons/remove-icon'
+import s from './style.module.css'
+import cn from '@/utils/classnames'
+import type { DataSet } from '@/models/datasets'
+import { formatNumber } from '@/utils/format'
+import Tooltip from '@/app/components/base/tooltip'
+
+export type ICardItemProps = {
+  className?: string
+  config: DataSet
+  onRemove: (id: string) => void
+  readonly?: boolean
+}
+const CardItem: FC<ICardItemProps> = ({
+  className,
+  config,
+  onRemove,
+  readonly,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div
+      className={
+        cn(className, s.card,
+          'relative flex cursor-pointer items-center  rounded-xl border border-gray-200 bg-white px-3  py-2.5')
+      }>
+      <div className='flex items-center space-x-2'>
+        <div className={cn(!config.embedding_available && 'opacity-50')}>
+          <TypeIcon type="upload_file" />
+        </div>
+        <div>
+          <div className='mr-1 flex w-[160px] items-center'>
+            <div className={cn('overflow-hidden text-ellipsis whitespace-nowrap text-[13px] font-medium leading-[18px] text-gray-800', !config.embedding_available && 'opacity-50')}>{config.name}</div>
+            {!config.embedding_available && (
+              <Tooltip
+                popupContent={t('dataset.unavailableTip')}
+              >
+                <span className='inline-flex shrink-0 whitespace-nowrap rounded-md border border-gray-200 px-1 text-xs font-normal leading-[18px] text-gray-500'>{t('dataset.unavailable')}</span>
+              </Tooltip>
+            )}
+          </div>
+          <div className={cn('flex max-w-[150px] text-xs text-gray-500', !config.embedding_available && 'opacity-50')}>
+            {formatNumber(config.word_count)} {t('appDebug.feature.dataSet.words')} 路 {formatNumber(config.document_count)} {t('appDebug.feature.dataSet.textBlocks')}
+          </div>
+        </div>
+      </div>
+
+      {!readonly && <RemoveIcon className={`${s.deleteBtn} absolute right-1 top-1/2 translate-y-[-50%]`} onClick={() => onRemove(config.id)} />}
+    </div>
+  )
+}
+export default React.memo(CardItem)
diff --git a/app/components/app/configuration/dataset-config/card-item/item.tsx b/app/components/app/configuration/dataset-config/card-item/item.tsx
new file mode 100644
index 0000000..4feba8b
--- /dev/null
+++ b/app/components/app/configuration/dataset-config/card-item/item.tsx
@@ -0,0 +1,122 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import {
+  RiDeleteBinLine,
+  RiEditLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import SettingsModal from '../settings-modal'
+import type { DataSet } from '@/models/datasets'
+import { DataSourceType } from '@/models/datasets'
+import FileIcon from '@/app/components/base/file-icon'
+import { Folder } from '@/app/components/base/icons/src/vender/solid/files'
+import { Globe06 } from '@/app/components/base/icons/src/vender/solid/mapsAndTravel'
+import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
+import Drawer from '@/app/components/base/drawer'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import Badge from '@/app/components/base/badge'
+import { useKnowledge } from '@/hooks/use-knowledge'
+import cn from '@/utils/classnames'
+
+type ItemProps = {
+  className?: string
+  config: DataSet
+  onRemove: (id: string) => void
+  readonly?: boolean
+  onSave: (newDataset: DataSet) => void
+  editable?: boolean
+}
+
+const Item: FC<ItemProps> = ({
+  config,
+  onSave,
+  onRemove,
+  editable = true,
+}) => {
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+  const [showSettingsModal, setShowSettingsModal] = useState(false)
+  const { formatIndexingTechniqueAndMethod } = useKnowledge()
+  const { t } = useTranslation()
+
+  const handleSave = (newDataset: DataSet) => {
+    onSave(newDataset)
+    setShowSettingsModal(false)
+  }
+
+  const [isDeleting, setIsDeleting] = useState(false)
+
+  return (
+    <div className={cn(
+      'group relative mb-1 flex h-10 w-full cursor-pointer items-center justify-between rounded-lg border-[0.5px] border-components-panel-border-subtle bg-components-panel-on-panel-item-bg px-2 last-of-type:mb-0 hover:bg-components-panel-on-panel-item-bg-hover',
+      isDeleting && 'border-state-destructive-border hover:bg-state-destructive-hover',
+    )}>
+      <div className='flex w-0 grow items-center space-x-1.5'>
+        {
+          config.data_source_type === DataSourceType.FILE && (
+            <div className='mr-2 flex h-6 w-6 shrink-0 items-center justify-center rounded-md border-[0.5px] border-[#E0EAFF] bg-[#F5F8FF]'>
+              <Folder className='h-4 w-4 text-[#444CE7]' />
+            </div>
+          )
+        }
+        {
+          config.data_source_type === DataSourceType.NOTION && (
+            <div className='mr-2 flex h-6 w-6 shrink-0 items-center justify-center rounded-md border-[0.5px] border-[#EAECF5]'>
+              <FileIcon type='notion' className='h-4 w-4' />
+            </div>
+          )
+        }
+        {
+          config.data_source_type === DataSourceType.WEB && (
+            <div className='mr-2 flex h-6 w-6 shrink-0 items-center justify-center rounded-md border-[0.5px] border-blue-100 bg-[#F5FAFF]'>
+              <Globe06 className='h-4 w-4 text-blue-600' />
+            </div>
+          )
+        }
+        <div className='system-sm-medium w-0 grow truncate text-text-secondary' title={config.name}>{config.name}</div>
+      </div>
+      <div className='ml-2 hidden shrink-0 items-center space-x-1 group-hover:flex'>
+        {
+          editable && <ActionButton
+            onClick={(e) => {
+              e.stopPropagation()
+              setShowSettingsModal(true)
+            }}
+          >
+            <RiEditLine className='h-4 w-4 shrink-0 text-text-tertiary' />
+          </ActionButton>
+        }
+        <ActionButton
+          onClick={() => onRemove(config.id)}
+          state={isDeleting ? ActionButtonState.Destructive : ActionButtonState.Default}
+          onMouseEnter={() => setIsDeleting(true)}
+          onMouseLeave={() => setIsDeleting(false)}
+        >
+          <RiDeleteBinLine className={cn('h-4 w-4 shrink-0 text-text-tertiary', isDeleting && 'text-text-destructive')} />
+        </ActionButton>
+      </div>
+      {
+        config.indexing_technique && <Badge
+          className='shrink-0 group-hover:hidden'
+          text={formatIndexingTechniqueAndMethod(config.indexing_technique, config.retrieval_model_dict?.search_method)}
+        />
+      }
+      {
+        config.provider === 'external' && <Badge
+          className='shrink-0 group-hover:hidden'
+          text={t('dataset.externalTag') as string}
+        />
+      }
+      <Drawer isOpen={showSettingsModal} onClose={() => setShowSettingsModal(false)} footer={null} mask={isMobile} panelClassName='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[640px] rounded-xl'>
+        <SettingsModal
+          currentDataset={config}
+          onCancel={() => setShowSettingsModal(false)}
+          onSave={handleSave}
+        />
+      </Drawer>
+    </div >
+  )
+}
+
+export default Item
diff --git a/app/components/app/configuration/dataset-config/card-item/style.module.css b/app/components/app/configuration/dataset-config/card-item/style.module.css
new file mode 100644
index 0000000..da07056
--- /dev/null
+++ b/app/components/app/configuration/dataset-config/card-item/style.module.css
@@ -0,0 +1,22 @@
+.card {
+  box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05);
+  width: 100%;
+}
+
+.card:hover {
+  box-shadow: 0px 4px 8px -2px rgba(16, 24, 40, 0.1), 0px 2px 4px -2px rgba(16, 24, 40, 0.06);
+}
+
+.btnWrap {
+  padding-left: 64px;
+  visibility: hidden;
+  background: linear-gradient(270deg, #FFF 49.99%, rgba(255, 255, 255, 0.00) 98.1%);
+}
+
+.card:hover .btnWrap {
+  visibility: visible;
+}
+
+.settingBtn:hover {
+  background-color: rgba(0, 0, 0, 0.05);
+}
diff --git a/app/components/app/configuration/dataset-config/context-var/index.tsx b/app/components/app/configuration/dataset-config/context-var/index.tsx
new file mode 100644
index 0000000..ebba9c5
--- /dev/null
+++ b/app/components/app/configuration/dataset-config/context-var/index.tsx
@@ -0,0 +1,37 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import type { Props } from './var-picker'
+import VarPicker from './var-picker'
+import cn from '@/utils/classnames'
+import { BracketsX } from '@/app/components/base/icons/src/vender/line/development'
+import Tooltip from '@/app/components/base/tooltip'
+
+const ContextVar: FC<Props> = (props) => {
+  const { t } = useTranslation()
+  const { value, options } = props
+  const currItem = options.find(item => item.value === value)
+  const notSetVar = !currItem
+  return (
+    <div className={cn(notSetVar ? 'rounded-bl-xl rounded-br-xl border-[#FEF0C7] bg-[#FEF0C7]' : 'border-components-panel-border-subtle', 'flex h-12 items-center justify-between border-t px-3 ')}>
+      <div className='flex shrink-0 items-center space-x-1'>
+        <div className='p-1'>
+          <BracketsX className='h-4 w-4 text-text-accent' />
+        </div>
+        <div className='mr-1 text-sm font-medium text-text-secondary'>{t('appDebug.feature.dataSet.queryVariable.title')}</div>
+        <Tooltip
+          popupContent={
+            <div className='w-[180px]'>
+              {t('appDebug.feature.dataSet.queryVariable.tip')}
+            </div>
+          }
+        />
+      </div>
+
+      <VarPicker {...props} />
+    </div>
+  )
+}
+
+export default React.memo(ContextVar)
diff --git a/app/components/app/configuration/dataset-config/context-var/var-picker.tsx b/app/components/app/configuration/dataset-config/context-var/var-picker.tsx
new file mode 100644
index 0000000..c443ea0
--- /dev/null
+++ b/app/components/app/configuration/dataset-config/context-var/var-picker.tsx
@@ -0,0 +1,104 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { ChevronDownIcon } from '@heroicons/react/24/outline'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import type { IInputTypeIconProps } from '@/app/components/app/configuration/config-var/input-type-icon'
+import IconTypeIcon from '@/app/components/app/configuration/config-var/input-type-icon'
+
+type Option = { name: string; value: string; type: string }
+export type Props = {
+  triggerClassName?: string
+  className?: string
+  value: string | undefined
+  options: Option[]
+  onChange: (value: string) => void
+  notSelectedVarTip?: string | null
+}
+
+const VarItem: FC<{ item: Option }> = ({ item }) => (
+  <div className='flex h-[18px] items-center space-x-1 rounded bg-[#EFF8FF] px-1'>
+    <IconTypeIcon type={item.type as IInputTypeIconProps['type']} className='text-[#1570EF]' />
+    <div className='flex text-xs font-medium text-[#1570EF]'>
+      <span className='opacity-60'>{'{{'}</span>
+      <span className='max-w-[150px] truncate'>{item.value}</span>
+      <span className='opacity-60'>{'}}'}</span>
+    </div>
+  </div>
+)
+const VarPicker: FC<Props> = ({
+  triggerClassName,
+  className,
+  value,
+  options,
+  onChange,
+  notSelectedVarTip,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const currItem = options.find(item => item.value === value)
+  const notSetVar = !currItem
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: 8,
+      }}
+    >
+      <PortalToFollowElemTrigger className={cn(triggerClassName)} onClick={() => setOpen(v => !v)}>
+        <div className={cn(
+          className,
+          notSetVar ? 'border-[#FEDF89] bg-[#FFFCF5] text-[#DC6803]' : ' border-components-button-secondary-border text-text-accent hover:bg-components-button-secondary-bg',
+          open ? 'bg-components-button-secondary-bg' : 'bg-transparent',
+          `
+          flex h-8 cursor-pointer items-center justify-center space-x-1 rounded-lg border  px-2 text-[13px]
+          font-medium  shadow-xs
+          `)}>
+          <div>
+            {value
+              ? (
+                <VarItem item={currItem as Option} />
+              )
+              : (<div>
+                {notSelectedVarTip || t('appDebug.feature.dataSet.queryVariable.choosePlaceholder')}
+              </div>)}
+          </div>
+          <ChevronDownIcon className={cn(open && 'rotate-180 text-text-tertiary', 'h-3.5 w-3.5')} />
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent style={{ zIndex: 1000 }}>
+        {options.length > 0
+          ? (<div className='max-h-[50vh] w-[240px] overflow-y-auto rounded-lg  border border-components-panel-border bg-components-panel-bg p-1 shadow-lg'>
+            {options.map(({ name, value, type }, index) => (
+              <div
+                key={index}
+                className='flex cursor-pointer rounded-lg px-3 py-1 hover:bg-state-base-hover'
+                onClick={() => {
+                  onChange(value)
+                  setOpen(false)
+                }}
+              >
+                <VarItem item={{ name, value, type }} />
+              </div>
+            ))}
+          </div>)
+          : (
+            <div className='w-[240px] rounded-lg border border-components-panel-border bg-components-panel-bg p-6 shadow-lg'>
+              <div className='mb-1 text-sm font-medium text-text-secondary'>{t('appDebug.feature.dataSet.queryVariable.noVar')}</div>
+              <div className='text-xs leading-normal text-text-tertiary'>{t('appDebug.feature.dataSet.queryVariable.noVarTip')}</div>
+            </div>
+          )}
+
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default React.memo(VarPicker)
diff --git a/app/components/app/configuration/dataset-config/index.tsx b/app/components/app/configuration/dataset-config/index.tsx
new file mode 100644
index 0000000..6165cfd
--- /dev/null
+++ b/app/components/app/configuration/dataset-config/index.tsx
@@ -0,0 +1,288 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { intersectionBy } from 'lodash-es'
+import { useContext } from 'use-context-selector'
+import produce from 'immer'
+import { v4 as uuid4 } from 'uuid'
+import { useFormattingChangedDispatcher } from '../debug/hooks'
+import FeaturePanel from '../base/feature-panel'
+import OperationBtn from '../base/operation-btn'
+import CardItem from './card-item/item'
+import ParamsConfig from './params-config'
+import ContextVar from './context-var'
+import ConfigContext from '@/context/debug-configuration'
+import { AppType } from '@/types/app'
+import type { DataSet } from '@/models/datasets'
+import {
+  getMultipleRetrievalConfig,
+  getSelectedDatasetsMode,
+} from '@/app/components/workflow/nodes/knowledge-retrieval/utils'
+import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { useSelector as useAppContextSelector } from '@/context/app-context'
+import { hasEditPermissionForDataset } from '@/utils/permission'
+import MetadataFilter from '@/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-filter'
+import type {
+  HandleAddCondition,
+  HandleRemoveCondition,
+  HandleToggleConditionLogicalOperator,
+  HandleUpdateCondition,
+  MetadataFilteringModeEnum,
+} from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+import {
+  ComparisonOperator,
+  LogicalOperator,
+  MetadataFilteringVariableType,
+} from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+
+const DatasetConfig: FC = () => {
+  const { t } = useTranslation()
+  const userProfile = useAppContextSelector(s => s.userProfile)
+  const {
+    mode,
+    dataSets: dataSet,
+    setDataSets: setDataSet,
+    modelConfig,
+    setModelConfig,
+    showSelectDataSet,
+    isAgent,
+    datasetConfigs,
+    datasetConfigsRef,
+    setDatasetConfigs,
+    setRerankSettingModalOpen,
+  } = useContext(ConfigContext)
+  const formattingChangedDispatcher = useFormattingChangedDispatcher()
+
+  const hasData = dataSet.length > 0
+
+  const {
+    currentModel: currentRerankModel,
+    currentProvider: currentRerankProvider,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
+
+  const onRemove = (id: string) => {
+    const filteredDataSets = dataSet.filter(item => item.id !== id)
+    setDataSet(filteredDataSets)
+    const retrievalConfig = getMultipleRetrievalConfig(datasetConfigs as any, filteredDataSets, dataSet, {
+      provider: currentRerankProvider?.provider,
+      model: currentRerankModel?.model,
+    })
+    setDatasetConfigs({
+      ...(datasetConfigs as any),
+      ...retrievalConfig,
+    })
+    const {
+      allExternal,
+      allInternal,
+      mixtureInternalAndExternal,
+      mixtureHighQualityAndEconomic,
+      inconsistentEmbeddingModel,
+    } = getSelectedDatasetsMode(filteredDataSets)
+
+    if (
+      (allInternal && (mixtureHighQualityAndEconomic || inconsistentEmbeddingModel))
+      || mixtureInternalAndExternal
+      || allExternal
+    )
+      setRerankSettingModalOpen(true)
+    formattingChangedDispatcher()
+  }
+
+  const handleSave = (newDataset: DataSet) => {
+    const index = dataSet.findIndex(item => item.id === newDataset.id)
+
+    const newDatasets = [...dataSet.slice(0, index), newDataset, ...dataSet.slice(index + 1)]
+    setDataSet(newDatasets)
+    formattingChangedDispatcher()
+  }
+
+  const promptVariables = modelConfig.configs.prompt_variables
+  const promptVariablesToSelect = promptVariables.map(item => ({
+    name: item.name,
+    type: item.type,
+    value: item.key,
+  }))
+  const selectedContextVar = promptVariables?.find(item => item.is_context_var)
+  const handleSelectContextVar = (selectedValue: string) => {
+    const newModelConfig = produce(modelConfig, (draft) => {
+      draft.configs.prompt_variables = modelConfig.configs.prompt_variables.map((item) => {
+        return ({
+          ...item,
+          is_context_var: item.key === selectedValue,
+        })
+      })
+    })
+    setModelConfig(newModelConfig)
+  }
+
+  const formattedDataset = useMemo(() => {
+    return dataSet.map((item) => {
+      const datasetConfig = {
+        createdBy: item.created_by,
+        partialMemberList: item.partial_member_list || [],
+        permission: item.permission,
+      }
+      return {
+        ...item,
+        editable: hasEditPermissionForDataset(userProfile?.id || '', datasetConfig),
+      }
+    })
+  }, [dataSet, userProfile?.id])
+
+  const metadataList = useMemo(() => {
+    return intersectionBy(...formattedDataset.filter((dataset) => {
+      return !!dataset.doc_metadata
+    }).map((dataset) => {
+      return dataset.doc_metadata!
+    }), 'name')
+  }, [formattedDataset])
+
+  const handleMetadataFilterModeChange = useCallback((newMode: MetadataFilteringModeEnum) => {
+    setDatasetConfigs(produce(datasetConfigsRef.current!, (draft) => {
+      draft.metadata_filtering_mode = newMode
+    }))
+  }, [setDatasetConfigs, datasetConfigsRef])
+
+  const handleAddCondition = useCallback<HandleAddCondition>(({ name, type }) => {
+    let operator: ComparisonOperator = ComparisonOperator.is
+
+    if (type === MetadataFilteringVariableType.number)
+      operator = ComparisonOperator.equal
+
+    const newCondition = {
+      id: uuid4(),
+      name,
+      comparison_operator: operator,
+    }
+
+    const newInputs = produce(datasetConfigsRef.current!, (draft) => {
+      if (draft.metadata_filtering_conditions) {
+        draft.metadata_filtering_conditions.conditions.push(newCondition)
+      }
+      else {
+        draft.metadata_filtering_conditions = {
+          logical_operator: LogicalOperator.and,
+          conditions: [newCondition],
+        }
+      }
+    })
+    setDatasetConfigs(newInputs)
+  }, [setDatasetConfigs, datasetConfigsRef])
+
+  const handleRemoveCondition = useCallback<HandleRemoveCondition>((id) => {
+    const conditions = datasetConfigsRef.current!.metadata_filtering_conditions?.conditions || []
+    const index = conditions.findIndex(c => c.id === id)
+    const newInputs = produce(datasetConfigsRef.current!, (draft) => {
+      if (index > -1)
+        draft.metadata_filtering_conditions?.conditions.splice(index, 1)
+    })
+    setDatasetConfigs(newInputs)
+  }, [setDatasetConfigs, datasetConfigsRef])
+
+  const handleUpdateCondition = useCallback<HandleUpdateCondition>((id, newCondition) => {
+    const conditions = datasetConfigsRef.current!.metadata_filtering_conditions?.conditions || []
+    const index = conditions.findIndex(c => c.id === id)
+    const newInputs = produce(datasetConfigsRef.current!, (draft) => {
+      if (index > -1)
+        draft.metadata_filtering_conditions!.conditions[index] = newCondition
+    })
+    setDatasetConfigs(newInputs)
+  }, [setDatasetConfigs, datasetConfigsRef])
+
+  const handleToggleConditionLogicalOperator = useCallback<HandleToggleConditionLogicalOperator>(() => {
+    const oldLogicalOperator = datasetConfigsRef.current!.metadata_filtering_conditions?.logical_operator
+    const newLogicalOperator = oldLogicalOperator === LogicalOperator.and ? LogicalOperator.or : LogicalOperator.and
+    const newInputs = produce(datasetConfigsRef.current!, (draft) => {
+      draft.metadata_filtering_conditions!.logical_operator = newLogicalOperator
+    })
+    setDatasetConfigs(newInputs)
+  }, [setDatasetConfigs, datasetConfigsRef])
+
+  const handleMetadataModelChange = useCallback((model: { provider: string; modelId: string; mode?: string }) => {
+    const newInputs = produce(datasetConfigsRef.current!, (draft) => {
+      draft.metadata_model_config = {
+        provider: model.provider,
+        name: model.modelId,
+        mode: model.mode || 'chat',
+        completion_params: draft.metadata_model_config?.completion_params || { temperature: 0.7 },
+      }
+    })
+    setDatasetConfigs(newInputs)
+  }, [setDatasetConfigs, datasetConfigsRef])
+
+  const handleMetadataCompletionParamsChange = useCallback((newParams: Record<string, any>) => {
+    const newInputs = produce(datasetConfigsRef.current!, (draft) => {
+      draft.metadata_model_config = {
+        ...draft.metadata_model_config!,
+        completion_params: newParams,
+      }
+    })
+    setDatasetConfigs(newInputs)
+  }, [setDatasetConfigs, datasetConfigsRef])
+
+  return (
+    <FeaturePanel
+      className='mt-2'
+      title={t('appDebug.feature.dataSet.title')}
+      headerRight={
+        <div className='flex items-center gap-1'>
+          {!isAgent && <ParamsConfig disabled={!hasData} selectedDatasets={dataSet} />}
+          <OperationBtn type="add" onClick={showSelectDataSet} />
+        </div>
+      }
+      hasHeaderBottomBorder={!hasData}
+      noBodySpacing
+    >
+      {hasData
+        ? (
+          <div className='mt-1 flex flex-wrap justify-between px-3 pb-3'>
+            {formattedDataset.map(item => (
+              <CardItem
+                key={item.id}
+                config={item}
+                onRemove={onRemove}
+                onSave={handleSave}
+                editable={item.editable}
+              />
+            ))}
+          </div>
+        )
+        : (
+          <div className='mt-1 px-3 pb-3'>
+            <div className='pb-1 pt-2 text-xs text-text-tertiary'>{t('appDebug.feature.dataSet.noData')}</div>
+          </div>
+        )}
+
+      <div className='border-t border-t-divider-subtle py-2'>
+        <MetadataFilter
+          metadataList={metadataList}
+          selectedDatasetsLoaded
+          metadataFilterMode={datasetConfigs.metadata_filtering_mode}
+          metadataFilteringConditions={datasetConfigs.metadata_filtering_conditions}
+          handleAddCondition={handleAddCondition}
+          handleMetadataFilterModeChange={handleMetadataFilterModeChange}
+          handleRemoveCondition={handleRemoveCondition}
+          handleToggleConditionLogicalOperator={handleToggleConditionLogicalOperator}
+          handleUpdateCondition={handleUpdateCondition}
+          metadataModelConfig={datasetConfigs.metadata_model_config}
+          handleMetadataModelChange={handleMetadataModelChange}
+          handleMetadataCompletionParamsChange={handleMetadataCompletionParamsChange}
+          isCommonVariable
+          availableCommonStringVars={promptVariablesToSelect.filter(item => item.type === MetadataFilteringVariableType.string || item.type === MetadataFilteringVariableType.select)}
+          availableCommonNumberVars={promptVariablesToSelect.filter(item => item.type === MetadataFilteringVariableType.number)}
+        />
+      </div>
+
+      {mode === AppType.completion && dataSet.length > 0 && (
+        <ContextVar
+          value={selectedContextVar?.key}
+          options={promptVariablesToSelect}
+          onChange={handleSelectContextVar}
+        />
+      )}
+    </FeaturePanel>
+  )
+}
+export default React.memo(DatasetConfig)
diff --git a/app/components/app/configuration/dataset-config/params-config/config-content.tsx b/app/components/app/configuration/dataset-config/params-config/config-content.tsx
new file mode 100644
index 0000000..86025f6
--- /dev/null
+++ b/app/components/app/configuration/dataset-config/params-config/config-content.tsx
@@ -0,0 +1,382 @@
+'use client'
+
+import { memo, useCallback, useEffect, useMemo } from 'react'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import WeightedScore from './weighted-score'
+import TopKItem from '@/app/components/base/param-item/top-k-item'
+import ScoreThresholdItem from '@/app/components/base/param-item/score-threshold-item'
+import { RETRIEVE_TYPE } from '@/types/app'
+import type {
+  DatasetConfigs,
+} from '@/models/debug'
+import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
+import { useCurrentProviderAndModel, useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import type { ModelConfig } from '@/app/components/workflow/types'
+import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal'
+import Tooltip from '@/app/components/base/tooltip'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import type {
+  DataSet,
+} from '@/models/datasets'
+import { RerankingModeEnum } from '@/models/datasets'
+import cn from '@/utils/classnames'
+import { useSelectedDatasetsMode } from '@/app/components/workflow/nodes/knowledge-retrieval/hooks'
+import Switch from '@/app/components/base/switch'
+import Toast from '@/app/components/base/toast'
+import Divider from '@/app/components/base/divider'
+import { noop } from 'lodash-es'
+
+type Props = {
+  datasetConfigs: DatasetConfigs
+  onChange: (configs: DatasetConfigs, isRetrievalModeChange?: boolean) => void
+  isInWorkflow?: boolean
+  singleRetrievalModelConfig?: ModelConfig
+  onSingleRetrievalModelChange?: (config: ModelConfig) => void
+  onSingleRetrievalModelParamsChange?: (config: ModelConfig) => void
+  selectedDatasets?: DataSet[]
+}
+
+const ConfigContent: FC<Props> = ({
+  datasetConfigs,
+  onChange,
+  isInWorkflow,
+  singleRetrievalModelConfig: singleRetrievalConfig = {} as ModelConfig,
+  onSingleRetrievalModelChange = noop,
+  onSingleRetrievalModelParamsChange = noop,
+  selectedDatasets = [],
+}) => {
+  const { t } = useTranslation()
+  const selectedDatasetsMode = useSelectedDatasetsMode(selectedDatasets)
+  const type = datasetConfigs.retrieval_model
+
+  useEffect(() => {
+    if (type === RETRIEVE_TYPE.oneWay) {
+      onChange({
+        ...datasetConfigs,
+        retrieval_model: RETRIEVE_TYPE.multiWay,
+      }, isInWorkflow)
+    }
+  }, [type, datasetConfigs, isInWorkflow, onChange])
+
+  const {
+    modelList: rerankModelList,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
+
+  const {
+    currentModel: currentRerankModel,
+  } = useCurrentProviderAndModel(
+    rerankModelList,
+    {
+      provider: datasetConfigs.reranking_model?.reranking_provider_name,
+      model: datasetConfigs.reranking_model?.reranking_model_name,
+    },
+  )
+
+  const rerankModel = useMemo(() => {
+    return {
+      provider_name: datasetConfigs?.reranking_model?.reranking_provider_name ?? '',
+      model_name: datasetConfigs?.reranking_model?.reranking_model_name ?? '',
+    }
+  }, [datasetConfigs.reranking_model])
+
+  const handleParamChange = (key: string, value: number) => {
+    if (key === 'top_k') {
+      onChange({
+        ...datasetConfigs,
+        top_k: value,
+      })
+    }
+    else if (key === 'score_threshold') {
+      onChange({
+        ...datasetConfigs,
+        score_threshold: value,
+      })
+    }
+  }
+
+  const handleSwitch = (key: string, enable: boolean) => {
+    if (key === 'top_k')
+      return
+
+    onChange({
+      ...datasetConfigs,
+      score_threshold_enabled: enable,
+    })
+  }
+
+  const handleWeightedScoreChange = (value: { value: number[] }) => {
+    const configs = {
+      ...datasetConfigs,
+      weights: {
+        ...datasetConfigs.weights!,
+        vector_setting: {
+          ...datasetConfigs.weights!.vector_setting!,
+          vector_weight: value.value[0],
+        },
+        keyword_setting: {
+          keyword_weight: value.value[1],
+        },
+      },
+    }
+    onChange(configs)
+  }
+
+  const handleRerankModeChange = (mode: RerankingModeEnum) => {
+    if (mode === datasetConfigs.reranking_mode)
+      return
+
+    if (mode === RerankingModeEnum.RerankingModel && !currentRerankModel)
+      Toast.notify({ type: 'error', message: t('workflow.errorMsg.rerankModelRequired') })
+
+    onChange({
+      ...datasetConfigs,
+      reranking_mode: mode,
+    })
+  }
+
+  const model = singleRetrievalConfig
+
+  const rerankingModeOptions = [
+    {
+      value: RerankingModeEnum.WeightedScore,
+      label: t('dataset.weightedScore.title'),
+      tips: t('dataset.weightedScore.description'),
+    },
+    {
+      value: RerankingModeEnum.RerankingModel,
+      label: t('common.modelProvider.rerankModel.key'),
+      tips: t('common.modelProvider.rerankModel.tip'),
+    },
+  ]
+
+  const showWeightedScore = selectedDatasetsMode.allHighQuality
+    && !selectedDatasetsMode.inconsistentEmbeddingModel
+
+  const showWeightedScorePanel = showWeightedScore && datasetConfigs.reranking_mode === RerankingModeEnum.WeightedScore && datasetConfigs.weights
+  const selectedRerankMode = datasetConfigs.reranking_mode || RerankingModeEnum.RerankingModel
+
+  const canManuallyToggleRerank = useMemo(() => {
+    return (selectedDatasetsMode.allInternal && selectedDatasetsMode.allEconomic)
+    || selectedDatasetsMode.allExternal
+  }, [selectedDatasetsMode.allEconomic, selectedDatasetsMode.allExternal, selectedDatasetsMode.allInternal])
+
+  const showRerankModel = useMemo(() => {
+    if (!canManuallyToggleRerank)
+      return true
+
+    return datasetConfigs.reranking_enable
+  }, [datasetConfigs.reranking_enable, canManuallyToggleRerank])
+
+  const handleDisabledSwitchClick = useCallback((enable: boolean) => {
+    if (!currentRerankModel && enable)
+      Toast.notify({ type: 'error', message: t('workflow.errorMsg.rerankModelRequired') })
+    onChange({
+      ...datasetConfigs,
+      reranking_enable: enable,
+    })
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [currentRerankModel, datasetConfigs, onChange])
+
+  return (
+    <div>
+      <div className='system-xl-semibold text-text-primary'>{t('dataset.retrievalSettings')}</div>
+      <div className='system-xs-regular text-text-tertiary'>
+        {t('dataset.defaultRetrievalTip')}
+      </div>
+      {type === RETRIEVE_TYPE.multiWay && (
+        <>
+          <div className='my-2 flex h-6 items-center py-1'>
+            <div className='system-xs-semibold-uppercase mr-2 shrink-0 text-text-secondary'>
+              {t('dataset.rerankSettings')}
+            </div>
+            <Divider bgStyle='gradient' className='mx-0 !h-px' />
+          </div>
+          {
+            selectedDatasetsMode.inconsistentEmbeddingModel
+            && (
+              <div className='system-xs-medium mt-4 text-text-warning'>
+                {t('dataset.inconsistentEmbeddingModelTip')}
+              </div>
+            )
+          }
+          {
+            selectedDatasetsMode.mixtureInternalAndExternal && (
+              <div className='system-xs-medium mt-4 text-text-warning'>
+                {t('dataset.mixtureInternalAndExternalTip')}
+              </div>
+            )
+          }
+          {
+            selectedDatasetsMode.allExternal && (
+              <div className='system-xs-medium mt-4 text-text-warning'>
+                {t('dataset.allExternalTip')}
+              </div>
+            )
+          }
+          {
+            selectedDatasetsMode.mixtureHighQualityAndEconomic
+            && (
+              <div className='system-xs-medium mt-4 text-text-warning'>
+                {t('dataset.mixtureHighQualityAndEconomicTip')}
+              </div>
+            )
+          }
+          {
+            showWeightedScore && (
+              <div className='flex items-center justify-between'>
+                {
+                  rerankingModeOptions.map(option => (
+                    <div
+                      key={option.value}
+                      className={cn(
+                        'system-sm-medium flex h-8 w-[calc((100%-8px)/2)] cursor-pointer items-center justify-center rounded-lg border border-components-option-card-option-border bg-components-option-card-option-bg text-text-secondary',
+                        selectedRerankMode === option.value && 'border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg text-text-primary',
+                      )}
+                      onClick={() => handleRerankModeChange(option.value)}
+                    >
+                      <div className='truncate'>{option.label}</div>
+                      <Tooltip
+                        popupContent={
+                          <div className='w-[200px]'>
+                            {option.tips}
+                          </div>
+                        }
+                        popupClassName='ml-0.5'
+                        triggerClassName='ml-0.5 w-3.5 h-3.5'
+                      />
+                    </div>
+                  ))
+                }
+              </div>
+            )
+          }
+          {
+            !showWeightedScorePanel && (
+              <div className='mt-2'>
+                <div className='flex items-center'>
+                  {
+                    selectedDatasetsMode.allEconomic && !selectedDatasetsMode.mixtureInternalAndExternal && (
+                      <Switch
+                        size='md'
+                        defaultValue={showRerankModel}
+                        disabled={!canManuallyToggleRerank}
+                        onChange={handleDisabledSwitchClick}
+                      />
+                    )
+                  }
+                  <div className='system-sm-semibold ml-1 leading-[32px] text-text-secondary'>{t('common.modelProvider.rerankModel.key')}</div>
+                  <Tooltip
+                    popupContent={
+                      <div className="w-[200px]">
+                        {t('common.modelProvider.rerankModel.tip')}
+                      </div>
+                    }
+                    popupClassName='ml-1'
+                    triggerClassName='ml-1 w-4 h-4'
+                  />
+                </div>
+                {
+                  showRerankModel && (
+                    <div>
+                      <ModelSelector
+                        defaultModel={rerankModel && { provider: rerankModel?.provider_name, model: rerankModel?.model_name }}
+                        onSelect={(v) => {
+                          onChange({
+                            ...datasetConfigs,
+                            reranking_model: {
+                              reranking_provider_name: v.provider,
+                              reranking_model_name: v.model,
+                            },
+                          })
+                        }}
+                        modelList={rerankModelList}
+                      />
+                    </div>
+                  )}
+              </div>
+            )
+          }
+          {
+            showWeightedScorePanel
+            && (
+              <div className='mt-2 space-y-4'>
+                <WeightedScore
+                  value={{
+                    value: [
+                      datasetConfigs.weights!.vector_setting.vector_weight,
+                      datasetConfigs.weights!.keyword_setting.keyword_weight,
+                    ],
+                  }}
+                  onChange={handleWeightedScoreChange}
+                />
+                <TopKItem
+                  value={datasetConfigs.top_k}
+                  onChange={handleParamChange}
+                  enable={true}
+                />
+                <ScoreThresholdItem
+                  value={datasetConfigs.score_threshold as number}
+                  onChange={handleParamChange}
+                  enable={datasetConfigs.score_threshold_enabled}
+                  hasSwitch={true}
+                  onSwitchChange={handleSwitch}
+                />
+              </div>
+            )
+          }
+          {
+            !showWeightedScorePanel
+            && (
+              <div className='mt-4 space-y-4'>
+                <TopKItem
+                  value={datasetConfigs.top_k}
+                  onChange={handleParamChange}
+                  enable={true}
+                />
+                {
+                  showRerankModel && (
+                    <ScoreThresholdItem
+                      value={datasetConfigs.score_threshold as number}
+                      onChange={handleParamChange}
+                      enable={datasetConfigs.score_threshold_enabled}
+                      hasSwitch={true}
+                      onSwitchChange={handleSwitch}
+                    />
+                  )
+                }
+              </div>
+            )
+          }
+        </>
+      )}
+
+      {isInWorkflow && type === RETRIEVE_TYPE.oneWay && (
+        <div className='mt-4'>
+          <div className='flex items-center space-x-0.5'>
+            <div className='text-[13px] font-medium leading-[32px] text-text-primary'>{t('common.modelProvider.systemReasoningModel.key')}</div>
+            <Tooltip
+              popupContent={t('common.modelProvider.systemReasoningModel.tip')}
+            />
+          </div>
+          <ModelParameterModal
+            isInWorkflow={isInWorkflow}
+            popupClassName='!w-[387px]'
+            portalToFollowElemContentClassName='!z-[1002]'
+            isAdvancedMode={true}
+            mode={model?.mode}
+            provider={model?.provider}
+            completionParams={model?.completion_params}
+            modelId={model?.name}
+            setModel={onSingleRetrievalModelChange}
+            onCompletionParamsChange={onSingleRetrievalModelParamsChange}
+            hideDebugWithMultipleModel
+            debugWithMultipleModel={false}
+          />
+        </div>
+      )
+      }
+    </div >
+  )
+}
+export default memo(ConfigContent)
diff --git a/app/components/app/configuration/dataset-config/params-config/index.tsx b/app/components/app/configuration/dataset-config/params-config/index.tsx
new file mode 100644
index 0000000..df2b429
--- /dev/null
+++ b/app/components/app/configuration/dataset-config/params-config/index.tsx
@@ -0,0 +1,156 @@
+'use client'
+import { memo, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { RiEqualizer2Line } from '@remixicon/react'
+import ConfigContent from './config-content'
+import cn from '@/utils/classnames'
+import ConfigContext from '@/context/debug-configuration'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import { RETRIEVE_TYPE } from '@/types/app'
+import Toast from '@/app/components/base/toast'
+import { useCurrentProviderAndModel, useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { RerankingModeEnum } from '@/models/datasets'
+import type { DataSet } from '@/models/datasets'
+import type { DatasetConfigs } from '@/models/debug'
+import {
+  getMultipleRetrievalConfig,
+} from '@/app/components/workflow/nodes/knowledge-retrieval/utils'
+
+type ParamsConfigProps = {
+  disabled?: boolean
+  selectedDatasets: DataSet[]
+}
+const ParamsConfig = ({
+  disabled,
+  selectedDatasets,
+}: ParamsConfigProps) => {
+  const { t } = useTranslation()
+  const {
+    datasetConfigs,
+    setDatasetConfigs,
+    rerankSettingModalOpen,
+    setRerankSettingModalOpen,
+  } = useContext(ConfigContext)
+  const [tempDataSetConfigs, setTempDataSetConfigs] = useState(datasetConfigs)
+
+  useEffect(() => {
+    setTempDataSetConfigs(datasetConfigs)
+  }, [datasetConfigs])
+
+  const {
+    modelList: rerankModelList,
+    currentModel: rerankDefaultModel,
+    currentProvider: rerankDefaultProvider,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
+
+  const {
+    currentModel: isCurrentRerankModelValid,
+  } = useCurrentProviderAndModel(
+    rerankModelList,
+    {
+      provider: tempDataSetConfigs.reranking_model?.reranking_provider_name ?? '',
+      model: tempDataSetConfigs.reranking_model?.reranking_model_name ?? '',
+    },
+  )
+
+  const isValid = () => {
+    let errMsg = ''
+    if (tempDataSetConfigs.retrieval_model === RETRIEVE_TYPE.multiWay) {
+      if (tempDataSetConfigs.reranking_enable
+        && tempDataSetConfigs.reranking_mode === RerankingModeEnum.RerankingModel
+        && !isCurrentRerankModelValid
+      )
+        errMsg = t('appDebug.datasetConfig.rerankModelRequired')
+    }
+    if (errMsg) {
+      Toast.notify({
+        type: 'error',
+        message: errMsg,
+      })
+    }
+    return !errMsg
+  }
+  const handleSave = () => {
+    if (!isValid())
+      return
+    setDatasetConfigs(tempDataSetConfigs)
+    setRerankSettingModalOpen(false)
+  }
+
+  const handleSetTempDataSetConfigs = (newDatasetConfigs: DatasetConfigs) => {
+    const { datasets, retrieval_model, score_threshold_enabled, ...restConfigs } = newDatasetConfigs
+
+    const retrievalConfig = getMultipleRetrievalConfig({
+      top_k: restConfigs.top_k,
+      score_threshold: restConfigs.score_threshold,
+      reranking_model: restConfigs.reranking_model && {
+        provider: restConfigs.reranking_model.reranking_provider_name,
+        model: restConfigs.reranking_model.reranking_model_name,
+      },
+      reranking_mode: restConfigs.reranking_mode,
+      weights: restConfigs.weights,
+      reranking_enable: restConfigs.reranking_enable,
+    }, selectedDatasets, selectedDatasets, {
+      provider: rerankDefaultProvider?.provider,
+      model: rerankDefaultModel?.model,
+    })
+
+    setTempDataSetConfigs({
+      ...retrievalConfig,
+      reranking_model: {
+        reranking_provider_name: retrievalConfig.reranking_model?.provider || '',
+        reranking_model_name: retrievalConfig.reranking_model?.model || '',
+      },
+      retrieval_model,
+      score_threshold_enabled,
+      datasets,
+    })
+  }
+
+  return (
+    <div>
+      <Button
+        variant='ghost'
+        size='small'
+        className={cn('h-7', rerankSettingModalOpen && 'bg-components-button-ghost-bg-hover')}
+        onClick={() => {
+          setRerankSettingModalOpen(true)
+        }}
+        disabled={disabled}
+      >
+        <RiEqualizer2Line className='mr-1 h-3.5 w-3.5' />
+        {t('dataset.retrievalSettings')}
+      </Button>
+      {
+        rerankSettingModalOpen && (
+          <Modal
+            isShow={rerankSettingModalOpen}
+            onClose={() => {
+              setRerankSettingModalOpen(false)
+            }}
+            className='sm:min-w-[528px]'
+          >
+            <ConfigContent
+              datasetConfigs={tempDataSetConfigs}
+              onChange={handleSetTempDataSetConfigs}
+              selectedDatasets={selectedDatasets}
+            />
+
+            <div className='mt-6 flex justify-end'>
+              <Button className='mr-2 shrink-0' onClick={() => {
+                setTempDataSetConfigs(datasetConfigs)
+                setRerankSettingModalOpen(false)
+              }}>{t('common.operation.cancel')}</Button>
+              <Button variant='primary' className='shrink-0' onClick={handleSave} >{t('common.operation.save')}</Button>
+            </div>
+          </Modal>
+        )
+      }
+
+    </div>
+  )
+}
+export default memo(ParamsConfig)
diff --git a/app/components/app/configuration/dataset-config/params-config/weighted-score.css b/app/components/app/configuration/dataset-config/params-config/weighted-score.css
new file mode 100644
index 0000000..ef93506
--- /dev/null
+++ b/app/components/app/configuration/dataset-config/params-config/weighted-score.css
@@ -0,0 +1,7 @@
+.weightedScoreSliderTrack {
+  background: var(--color-util-colors-blue-light-blue-light-500) !important;
+}
+
+.weightedScoreSliderTrack-1 {
+  background: transparent !important;
+}
diff --git a/app/components/app/configuration/dataset-config/params-config/weighted-score.tsx b/app/components/app/configuration/dataset-config/params-config/weighted-score.tsx
new file mode 100644
index 0000000..5f0ad94
--- /dev/null
+++ b/app/components/app/configuration/dataset-config/params-config/weighted-score.tsx
@@ -0,0 +1,62 @@
+import { memo } from 'react'
+import { useTranslation } from 'react-i18next'
+import './weighted-score.css'
+import Slider from '@/app/components/base/slider'
+import cn from '@/utils/classnames'
+import { noop } from 'lodash-es'
+
+const formatNumber = (value: number) => {
+  if (value > 0 && value < 1)
+    return `0.${value * 10}`
+  else if (value === 1)
+    return '1.0'
+
+  return value
+}
+
+type Value = {
+  value: number[]
+}
+
+type WeightedScoreProps = {
+  value: Value
+  onChange: (value: Value) => void
+}
+const WeightedScore = ({
+  value,
+  onChange = noop,
+}: WeightedScoreProps) => {
+  const { t } = useTranslation()
+
+  return (
+    <div>
+      <div className='space-x-3 rounded-lg border border-components-panel-border px-3 pb-2 pt-5'>
+        <Slider
+          className={cn('h-0.5 grow rounded-full !bg-util-colors-teal-teal-500')}
+          max={1.0}
+          min={0}
+          step={0.1}
+          value={value.value[0]}
+          onChange={v => onChange({ value: [v, (10 - v * 10) / 10] })}
+          trackClassName='weightedScoreSliderTrack'
+        />
+        <div className='mt-3 flex justify-between'>
+          <div className='system-xs-semibold-uppercase flex w-[90px] shrink-0 items-center text-util-colors-blue-light-blue-light-500'>
+            <div className='mr-1 truncate uppercase' title={t('dataset.weightedScore.semantic') || ''}>
+              {t('dataset.weightedScore.semantic')}
+            </div>
+            {formatNumber(value.value[0])}
+          </div>
+          <div className='system-xs-semibold-uppercase flex w-[90px] shrink-0 items-center justify-end text-util-colors-teal-teal-500'>
+            {formatNumber(value.value[1])}
+            <div className='ml-1 truncate uppercase' title={t('dataset.weightedScore.keyword') || ''}>
+              {t('dataset.weightedScore.keyword')}
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default memo(WeightedScore)
diff --git a/app/components/app/configuration/dataset-config/select-dataset/index.tsx b/app/components/app/configuration/dataset-config/select-dataset/index.tsx
new file mode 100644
index 0000000..70f5e1e
--- /dev/null
+++ b/app/components/app/configuration/dataset-config/select-dataset/index.tsx
@@ -0,0 +1,176 @@
+'use client'
+import type { FC } from 'react'
+import React, { useRef, useState } from 'react'
+import { useGetState, useInfiniteScroll } from 'ahooks'
+import { useTranslation } from 'react-i18next'
+import Link from 'next/link'
+import produce from 'immer'
+import TypeIcon from '../type-icon'
+import Modal from '@/app/components/base/modal'
+import type { DataSet } from '@/models/datasets'
+import Button from '@/app/components/base/button'
+import { fetchDatasets } from '@/service/datasets'
+import Loading from '@/app/components/base/loading'
+import Badge from '@/app/components/base/badge'
+import { useKnowledge } from '@/hooks/use-knowledge'
+import cn from '@/utils/classnames'
+
+export type ISelectDataSetProps = {
+  isShow: boolean
+  onClose: () => void
+  selectedIds: string[]
+  onSelect: (dataSet: DataSet[]) => void
+}
+
+const SelectDataSet: FC<ISelectDataSetProps> = ({
+  isShow,
+  onClose,
+  selectedIds,
+  onSelect,
+}) => {
+  const { t } = useTranslation()
+  const [selected, setSelected] = React.useState<DataSet[]>(selectedIds.map(id => ({ id }) as any))
+  const [loaded, setLoaded] = React.useState(false)
+  const [datasets, setDataSets] = React.useState<DataSet[] | null>(null)
+  const hasNoData = !datasets || datasets?.length === 0
+  const canSelectMulti = true
+
+  const listRef = useRef<HTMLDivElement>(null)
+  const [page, setPage, getPage] = useGetState(1)
+  const [isNoMore, setIsNoMore] = useState(false)
+  const { formatIndexingTechniqueAndMethod } = useKnowledge()
+
+  useInfiniteScroll(
+    async () => {
+      if (!isNoMore) {
+        const { data, has_more } = await fetchDatasets({ url: '/datasets', params: { page } })
+        setPage(getPage() + 1)
+        setIsNoMore(!has_more)
+        const newList = [...(datasets || []), ...data.filter(item => item.indexing_technique || item.provider === 'external')]
+        setDataSets(newList)
+        setLoaded(true)
+        if (!selected.find(item => !item.name))
+          return { list: [] }
+
+        const newSelected = produce(selected, (draft) => {
+          selected.forEach((item, index) => {
+            if (!item.name) { // not fetched database
+              const newItem = newList.find(i => i.id === item.id)
+              if (newItem)
+                draft[index] = newItem
+            }
+          })
+        })
+        setSelected(newSelected)
+      }
+      return { list: [] }
+    },
+    {
+      target: listRef,
+      isNoMore: () => {
+        return isNoMore
+      },
+      reloadDeps: [isNoMore],
+    },
+  )
+
+  const toggleSelect = (dataSet: DataSet) => {
+    const isSelected = selected.some(item => item.id === dataSet.id)
+    if (isSelected) {
+      setSelected(selected.filter(item => item.id !== dataSet.id))
+    }
+    else {
+      if (canSelectMulti)
+        setSelected([...selected, dataSet])
+      else
+        setSelected([dataSet])
+    }
+  }
+
+  const handleSelect = () => {
+    onSelect(selected)
+  }
+  return (
+    <Modal
+      isShow={isShow}
+      onClose={onClose}
+      className='w-[400px]'
+      title={t('appDebug.feature.dataSet.selectTitle')}
+    >
+      {!loaded && (
+        <div className='flex h-[200px]'>
+          <Loading type='area' />
+        </div>
+      )}
+
+      {(loaded && hasNoData) && (
+        <div className='mt-6 flex h-[128px] items-center justify-center space-x-1  rounded-lg border text-[13px]'
+          style={{
+            background: 'rgba(0, 0, 0, 0.02)',
+            borderColor: 'rgba(0, 0, 0, 0.02',
+          }}
+        >
+          <span className='text-text-tertiary'>{t('appDebug.feature.dataSet.noDataSet')}</span>
+          <Link href={'/datasets/create'} className='font-normal text-text-accent'>{t('appDebug.feature.dataSet.toCreate')}</Link>
+        </div>
+      )}
+
+      {datasets && datasets?.length > 0 && (
+        <>
+          <div ref={listRef} className='mt-7 max-h-[286px] space-y-1 overflow-y-auto'>
+            {datasets.map(item => (
+              <div
+                key={item.id}
+                className={cn(
+                  'flex h-10 cursor-pointer items-center justify-between rounded-lg border-[0.5px] border-components-panel-border-subtle bg-components-panel-on-panel-item-bg px-2 shadow-xs hover:border-components-panel-border hover:bg-components-panel-on-panel-item-bg-hover hover:shadow-sm',
+                  selected.some(i => i.id === item.id) && 'border-[1.5px] border-components-option-card-option-selected-border bg-state-accent-hover shadow-xs hover:border-components-option-card-option-selected-border hover:bg-state-accent-hover hover:shadow-xs',
+                  !item.embedding_available && 'hover:border-components-panel-border-subtle hover:bg-components-panel-on-panel-item-bg hover:shadow-xs',
+                )}
+                onClick={() => {
+                  if (!item.embedding_available)
+                    return
+                  toggleSelect(item)
+                }}
+              >
+                <div className='mr-1 flex items-center overflow-hidden'>
+                  <div className={cn('mr-2', !item.embedding_available && 'opacity-30')}>
+                    <TypeIcon type="upload_file" size='md' />
+                  </div>
+                  <div className={cn('max-w-[200px] truncate text-[13px] font-medium text-text-secondary', !item.embedding_available && '!max-w-[120px] opacity-30')}>{item.name}</div>
+                  {!item.embedding_available && (
+                    <span className='ml-1 shrink-0 rounded-md border border-divider-deep px-1 text-xs font-normal leading-[18px] text-text-tertiary'>{t('dataset.unavailable')}</span>
+                  )}
+                </div>
+                {
+                  item.indexing_technique && (
+                    <Badge
+                      className='shrink-0'
+                      text={formatIndexingTechniqueAndMethod(item.indexing_technique, item.retrieval_model_dict?.search_method)}
+                    />
+                  )
+                }
+                {
+                  item.provider === 'external' && (
+                    <Badge className='shrink-0' text={t('dataset.externalTag')} />
+                  )
+                }
+              </div>
+            ))}
+          </div>
+        </>
+      )}
+      {loaded && (
+        <div className='mt-8 flex items-center justify-between'>
+          <div className='text-sm  font-medium text-text-secondary'>
+            {selected.length > 0 && `${selected.length} ${t('appDebug.feature.dataSet.selected')}`}
+          </div>
+          <div className='flex space-x-2'>
+            <Button onClick={onClose}>{t('common.operation.cancel')}</Button>
+            <Button variant='primary' onClick={handleSelect} disabled={hasNoData}>{t('common.operation.add')}</Button>
+          </div>
+        </div>
+      )}
+    </Modal>
+  )
+}
+export default React.memo(SelectDataSet)
diff --git a/app/components/app/configuration/dataset-config/settings-modal/index.tsx b/app/components/app/configuration/dataset-config/settings-modal/index.tsx
new file mode 100644
index 0000000..3170d33
--- /dev/null
+++ b/app/components/app/configuration/dataset-config/settings-modal/index.tsx
@@ -0,0 +1,390 @@
+import type { FC } from 'react'
+import { useRef, useState } from 'react'
+import { useMount } from 'ahooks'
+import { useTranslation } from 'react-i18next'
+import { isEqual } from 'lodash-es'
+import { RiCloseLine } from '@remixicon/react'
+import { ApiConnectionMod } from '@/app/components/base/icons/src/vender/solid/development'
+import cn from '@/utils/classnames'
+import IndexMethodRadio from '@/app/components/datasets/settings/index-method-radio'
+import Divider from '@/app/components/base/divider'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import { type DataSet, DatasetPermission } from '@/models/datasets'
+import { useToastContext } from '@/app/components/base/toast'
+import { updateDatasetSetting } from '@/service/datasets'
+import { useAppContext } from '@/context/app-context'
+import { useModalContext } from '@/context/modal-context'
+import type { RetrievalConfig } from '@/types/app'
+import RetrievalSettings from '@/app/components/datasets/external-knowledge-base/create/RetrievalSettings'
+import RetrievalMethodConfig from '@/app/components/datasets/common/retrieval-method-config'
+import EconomicalRetrievalMethodConfig from '@/app/components/datasets/common/economical-retrieval-method-config'
+import { isReRankModelSelected } from '@/app/components/datasets/common/check-rerank-model'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback'
+import PermissionSelector from '@/app/components/datasets/settings/permission-selector'
+import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
+import {
+  useModelList,
+  useModelListAndDefaultModelAndCurrentProviderAndModel,
+} from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { fetchMembers } from '@/service/common'
+import type { Member } from '@/models/common'
+
+type SettingsModalProps = {
+  currentDataset: DataSet
+  onCancel: () => void
+  onSave: (newDataset: DataSet) => void
+}
+
+const rowClass = `
+  flex justify-between py-4 flex-wrap gap-y-2
+`
+
+const labelClass = `
+  flex w-[168px] shrink-0
+`
+
+const SettingsModal: FC<SettingsModalProps> = ({
+  currentDataset,
+  onCancel,
+  onSave,
+}) => {
+  const { data: embeddingsModelList } = useModelList(ModelTypeEnum.textEmbedding)
+  const {
+    modelList: rerankModelList,
+    defaultModel: rerankDefaultModel,
+    currentModel: isRerankDefaultModelValid,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const ref = useRef(null)
+  const isExternal = currentDataset.provider === 'external'
+  const { setShowAccountSettingModal } = useModalContext()
+  const [loading, setLoading] = useState(false)
+  const { isCurrentWorkspaceDatasetOperator } = useAppContext()
+  const [localeCurrentDataset, setLocaleCurrentDataset] = useState({ ...currentDataset })
+  const [topK, setTopK] = useState(localeCurrentDataset?.external_retrieval_model.top_k ?? 2)
+  const [scoreThreshold, setScoreThreshold] = useState(localeCurrentDataset?.external_retrieval_model.score_threshold ?? 0.5)
+  const [scoreThresholdEnabled, setScoreThresholdEnabled] = useState(localeCurrentDataset?.external_retrieval_model.score_threshold_enabled ?? false)
+  const [selectedMemberIDs, setSelectedMemberIDs] = useState<string[]>(currentDataset.partial_member_list || [])
+  const [memberList, setMemberList] = useState<Member[]>([])
+
+  const [indexMethod, setIndexMethod] = useState(currentDataset.indexing_technique)
+  const [retrievalConfig, setRetrievalConfig] = useState(localeCurrentDataset?.retrieval_model_dict as RetrievalConfig)
+
+  const handleValueChange = (type: string, value: string) => {
+    setLocaleCurrentDataset({ ...localeCurrentDataset, [type]: value })
+  }
+  const [isHideChangedTip, setIsHideChangedTip] = useState(false)
+  const isRetrievalChanged = !isEqual(retrievalConfig, localeCurrentDataset?.retrieval_model_dict) || indexMethod !== localeCurrentDataset?.indexing_technique
+
+  const handleSettingsChange = (data: { top_k?: number; score_threshold?: number; score_threshold_enabled?: boolean }) => {
+    if (data.top_k !== undefined)
+      setTopK(data.top_k)
+    if (data.score_threshold !== undefined)
+      setScoreThreshold(data.score_threshold)
+    if (data.score_threshold_enabled !== undefined)
+      setScoreThresholdEnabled(data.score_threshold_enabled)
+
+    setLocaleCurrentDataset({
+      ...localeCurrentDataset,
+      external_retrieval_model: {
+        ...localeCurrentDataset?.external_retrieval_model,
+        ...data,
+      },
+    })
+  }
+
+  const handleSave = async () => {
+    if (loading)
+      return
+    if (!localeCurrentDataset.name?.trim()) {
+      notify({ type: 'error', message: t('datasetSettings.form.nameError') })
+      return
+    }
+    if (
+      !isReRankModelSelected({
+        rerankModelList,
+        retrievalConfig,
+        indexMethod,
+      })
+    ) {
+      notify({ type: 'error', message: t('appDebug.datasetConfig.rerankModelRequired') })
+      return
+    }
+    try {
+      setLoading(true)
+      const { id, name, description, permission } = localeCurrentDataset
+      const requestParams = {
+        datasetId: id,
+        body: {
+          name,
+          description,
+          permission,
+          indexing_technique: indexMethod,
+          retrieval_model: {
+            ...retrievalConfig,
+            score_threshold: retrievalConfig.score_threshold_enabled ? retrievalConfig.score_threshold : 0,
+          },
+          embedding_model: localeCurrentDataset.embedding_model,
+          embedding_model_provider: localeCurrentDataset.embedding_model_provider,
+          ...(isExternal && {
+            external_knowledge_id: currentDataset!.external_knowledge_info.external_knowledge_id,
+            external_knowledge_api_id: currentDataset!.external_knowledge_info.external_knowledge_api_id,
+            external_retrieval_model: {
+              top_k: topK,
+              score_threshold: scoreThreshold,
+              score_threshold_enabled: scoreThresholdEnabled,
+            },
+          }),
+        },
+      } as any
+      if (permission === DatasetPermission.partialMembers) {
+        requestParams.body.partial_member_list = selectedMemberIDs.map((id) => {
+          return {
+            user_id: id,
+            role: memberList.find(member => member.id === id)?.role,
+          }
+        })
+      }
+      await updateDatasetSetting(requestParams)
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      onSave({
+        ...localeCurrentDataset,
+        indexing_technique: indexMethod,
+        retrieval_model_dict: retrievalConfig,
+      })
+    }
+    catch {
+      notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+    }
+    finally {
+      setLoading(false)
+    }
+  }
+
+  const getMembers = async () => {
+    const { accounts } = await fetchMembers({ url: '/workspaces/current/members', params: {} })
+    if (!accounts)
+      setMemberList([])
+    else
+      setMemberList(accounts)
+  }
+
+  useMount(() => {
+    getMembers()
+  })
+
+  return (
+    <div
+      className='flex w-full flex-col overflow-hidden rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl'
+      style={{
+        height: 'calc(100vh - 72px)',
+      }}
+      ref={ref}
+    >
+      <div className='flex h-14 shrink-0 items-center justify-between border-b border-divider-regular pl-6 pr-5'>
+        <div className='flex flex-col text-base font-semibold text-text-primary'>
+          <div className='leading-6'>{t('datasetSettings.title')}</div>
+        </div>
+        <div className='flex items-center'>
+          <div
+            onClick={onCancel}
+            className='flex h-6 w-6 cursor-pointer items-center justify-center'
+          >
+            <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+        </div>
+      </div>
+      {/* Body */}
+      <div className='overflow-y-auto border-b border-divider-regular p-6 pb-[68px] pt-5'>
+        <div className={cn(rowClass, 'items-center')}>
+          <div className={labelClass}>
+            <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.name')}</div>
+          </div>
+          <Input
+            value={localeCurrentDataset.name}
+            onChange={e => handleValueChange('name', e.target.value)}
+            className='block h-9'
+            placeholder={t('datasetSettings.form.namePlaceholder') || ''}
+          />
+        </div>
+        <div className={cn(rowClass)}>
+          <div className={labelClass}>
+            <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.desc')}</div>
+          </div>
+          <div className='w-full'>
+            <Textarea
+              value={localeCurrentDataset.description || ''}
+              onChange={e => handleValueChange('description', e.target.value)}
+              className='resize-none'
+              placeholder={t('datasetSettings.form.descPlaceholder') || ''}
+            />
+          </div>
+        </div>
+        <div className={rowClass}>
+          <div className={labelClass}>
+            <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.permissions')}</div>
+          </div>
+          <div className='w-full'>
+            <PermissionSelector
+              disabled={!localeCurrentDataset?.embedding_available || isCurrentWorkspaceDatasetOperator}
+              permission={localeCurrentDataset.permission}
+              value={selectedMemberIDs}
+              onChange={v => handleValueChange('permission', v!)}
+              onMemberSelect={setSelectedMemberIDs}
+              memberList={memberList}
+            />
+          </div>
+        </div>
+        {currentDataset && currentDataset.indexing_technique && (
+          <div className={cn(rowClass)}>
+            <div className={labelClass}>
+              <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.indexMethod')}</div>
+            </div>
+            <div className='grow'>
+              <IndexMethodRadio
+                disable={!localeCurrentDataset?.embedding_available}
+                value={indexMethod}
+                onChange={v => setIndexMethod(v!)}
+                docForm={currentDataset.doc_form}
+                currentValue={currentDataset.indexing_technique}
+              />
+            </div>
+          </div>
+        )}
+        {indexMethod === 'high_quality' && (
+          <div className={cn(rowClass)}>
+            <div className={labelClass}>
+              <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.embeddingModel')}</div>
+            </div>
+            <div className='w-full'>
+              <div className='h-8 w-full rounded-lg bg-components-input-bg-normal opacity-60'>
+                <ModelSelector
+                  readonly
+                  defaultModel={{
+                    provider: localeCurrentDataset.embedding_model_provider,
+                    model: localeCurrentDataset.embedding_model,
+                  }}
+                  modelList={embeddingsModelList}
+                />
+              </div>
+              <div className='mt-2 w-full text-xs leading-6 text-text-tertiary'>
+                {t('datasetSettings.form.embeddingModelTip')}
+                <span className='cursor-pointer text-text-accent' onClick={() => setShowAccountSettingModal({ payload: 'provider' })}>{t('datasetSettings.form.embeddingModelTipLink')}</span>
+              </div>
+            </div>
+          </div>
+        )}
+
+        {/* Retrieval Method Config */}
+        {currentDataset?.provider === 'external'
+          ? <>
+            <div className={rowClass}><Divider /></div>
+            <div className={rowClass}>
+              <div className={labelClass}>
+                <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.retrievalSetting.title')}</div>
+              </div>
+              <RetrievalSettings
+                topK={topK}
+                scoreThreshold={scoreThreshold}
+                scoreThresholdEnabled={scoreThresholdEnabled}
+                onChange={handleSettingsChange}
+                isInRetrievalSetting={true}
+              />
+            </div>
+            <div className={rowClass}><Divider /></div>
+            <div className={rowClass}>
+              <div className={labelClass}>
+                <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.externalKnowledgeAPI')}</div>
+              </div>
+              <div className='w-full max-w-[480px]'>
+                <div className='flex h-full items-center gap-1 rounded-lg bg-components-input-bg-normal px-3 py-2'>
+                  <ApiConnectionMod className='h-4 w-4 text-text-secondary' />
+                  <div className='system-sm-medium overflow-hidden text-ellipsis text-text-secondary'>
+                    {currentDataset?.external_knowledge_info.external_knowledge_api_name}
+                  </div>
+                  <div className='system-xs-regular text-text-tertiary'>路</div>
+                  <div className='system-xs-regular text-text-tertiary'>{currentDataset?.external_knowledge_info.external_knowledge_api_endpoint}</div>
+                </div>
+              </div>
+            </div>
+            <div className={rowClass}>
+              <div className={labelClass}>
+                <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.externalKnowledgeID')}</div>
+              </div>
+              <div className='w-full max-w-[480px]'>
+                <div className='flex h-full items-center gap-1 rounded-lg bg-components-input-bg-normal px-3 py-2'>
+                  <div className='system-xs-regular text-text-tertiary'>{currentDataset?.external_knowledge_info.external_knowledge_id}</div>
+                </div>
+              </div>
+            </div>
+            <div className={rowClass}><Divider /></div>
+          </>
+          : <div className={rowClass}>
+            <div className={cn(labelClass, 'w-auto min-w-[168px]')}>
+              <div>
+                <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.retrievalSetting.title')}</div>
+                <div className='text-xs font-normal leading-[18px] text-text-tertiary'>
+                  <a target='_blank' rel='noopener noreferrer' href='https://docs.dify.ai/guides/knowledge-base/create-knowledge-and-upload-documents#id-4-retrieval-settings' className='text-text-accent'>{t('datasetSettings.form.retrievalSetting.learnMore')}</a>
+                  {t('datasetSettings.form.retrievalSetting.description')}
+                </div>
+              </div>
+            </div>
+            <div>
+              {indexMethod === 'high_quality'
+                ? (
+                  <RetrievalMethodConfig
+                    value={retrievalConfig}
+                    onChange={setRetrievalConfig}
+                  />
+                )
+                : (
+                  <EconomicalRetrievalMethodConfig
+                    value={retrievalConfig}
+                    onChange={setRetrievalConfig}
+                  />
+                )}
+            </div>
+          </div>}
+      </div>
+      {isRetrievalChanged && !isHideChangedTip && (
+        <div className='absolute bottom-[76px] left-[30px] right-[30px] z-10 flex h-10 items-center justify-between rounded-lg border border-[#FEF0C7] bg-[#FFFAEB] px-3 shadow-lg'>
+          <div className='flex items-center'>
+            <AlertTriangle className='mr-1 h-3 w-3 text-[#F79009]' />
+            <div className='text-xs font-medium leading-[18px] text-gray-700'>{t('appDebug.datasetConfig.retrieveChangeTip')}</div>
+          </div>
+          <div className='cursor-pointer p-1' onClick={(e) => {
+            setIsHideChangedTip(true)
+            e.stopPropagation()
+            e.nativeEvent.stopImmediatePropagation()
+          }}>
+            <RiCloseLine className='h-4 w-4 text-gray-500' />
+          </div>
+        </div>
+      )}
+
+      <div
+        className='sticky bottom-0 z-[5] flex w-full justify-end border-t border-divider-regular bg-background-section px-6 py-4'
+      >
+        <Button
+          onClick={onCancel}
+          className='mr-2'
+        >
+          {t('common.operation.cancel')}
+        </Button>
+        <Button
+          variant='primary'
+          disabled={loading}
+          onClick={handleSave}
+        >
+          {t('common.operation.save')}
+        </Button>
+      </div>
+    </div>
+  )
+}
+
+export default SettingsModal
diff --git a/app/components/app/configuration/dataset-config/type-icon/index.tsx b/app/components/app/configuration/dataset-config/type-icon/index.tsx
new file mode 100644
index 0000000..65951f6
--- /dev/null
+++ b/app/components/app/configuration/dataset-config/type-icon/index.tsx
@@ -0,0 +1,33 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+
+export type ITypeIconProps = {
+  type: 'upload_file'
+  size?: 'md' | 'lg'
+}
+
+// data_source_type: current only support upload_file
+const Icon = ({ type, size = 'lg' }: ITypeIconProps) => {
+  const len = size === 'lg' ? 32 : 24
+  const iconMap = {
+    upload_file: (
+      <svg width={len} height={len} viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+        <rect x="0.25" y="0.25" width="31.5" height="31.5" rx="7.75" fill="#F5F8FF" />
+        <path fillRule="evenodd" clipRule="evenodd" d="M8.66669 12.1078C8.66668 11.7564 8.66667 11.4532 8.68707 11.2035C8.7086 10.9399 8.75615 10.6778 8.88468 10.4255C9.07642 10.0492 9.38238 9.74322 9.75871 9.55147C10.011 9.42294 10.2731 9.3754 10.5367 9.35387C10.7864 9.33346 11.0896 9.33347 11.441 9.33349L14.0978 9.33341C14.4935 9.33289 14.8415 9.33243 15.1615 9.4428C15.4417 9.53946 15.697 9.69722 15.9087 9.90465C16.1506 10.1415 16.3058 10.4529 16.4823 10.8071L17.0786 12H19.4942C20.0309 12 20.4738 12 20.8346 12.0295C21.2093 12.0601 21.5538 12.1258 21.8773 12.2907C22.3791 12.5463 22.787 12.9543 23.0427 13.456C23.2076 13.7796 23.2733 14.1241 23.3039 14.4988C23.3334 14.8596 23.3334 15.3025 23.3334 15.8391V18.8276C23.3334 19.3642 23.3334 19.8071 23.3039 20.1679C23.2733 20.5426 23.2076 20.8871 23.0427 21.2107C22.787 21.7124 22.3791 22.1204 21.8773 22.376C21.5538 22.5409 21.2093 22.6066 20.8346 22.6372C20.4738 22.6667 20.0309 22.6667 19.4942 22.6667H12.5058C11.9692 22.6667 11.5263 22.6667 11.1655 22.6372C10.7907 22.6066 10.4463 22.5409 10.1227 22.376C9.62095 22.1204 9.213 21.7124 8.95734 21.2107C8.79248 20.8871 8.72677 20.5426 8.69615 20.1679C8.66667 19.8071 8.66668 19.3642 8.66669 18.8276V12.1078ZM14.0149 10.6668C14.5418 10.6668 14.6463 10.6755 14.7267 10.7033C14.8201 10.7355 14.9052 10.7881 14.9758 10.8572C15.0366 10.9167 15.0911 11.0063 15.3267 11.4776L15.5879 12L10.0001 12C10.0004 11.69 10.0024 11.4781 10.016 11.312C10.0308 11.1309 10.0559 11.0638 10.0727 11.0308C10.1366 10.9054 10.2386 10.8034 10.364 10.7395C10.397 10.7227 10.4641 10.6976 10.6452 10.6828C10.8341 10.6673 11.0823 10.6668 11.4667 10.6668H14.0149Z" fill="#444CE7" />
+        <rect x="0.25" y="0.25" width="31.5" height="31.5" rx="7.75" stroke="#E0EAFF" strokeWidth="0.5" />
+      </svg>
+    ),
+  }
+  return iconMap[type]
+}
+
+const TypeIcon: FC<ITypeIconProps> = ({
+  type,
+  size = 'lg',
+}) => {
+  return (
+    <Icon type={type} size={size} ></Icon>
+  )
+}
+export default React.memo(TypeIcon)
diff --git a/app/components/app/configuration/debug/chat-user-input.tsx b/app/components/app/configuration/debug/chat-user-input.tsx
new file mode 100644
index 0000000..fb4ac31
--- /dev/null
+++ b/app/components/app/configuration/debug/chat-user-input.tsx
@@ -0,0 +1,108 @@
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import ConfigContext from '@/context/debug-configuration'
+import Input from '@/app/components/base/input'
+import Select from '@/app/components/base/select'
+import Textarea from '@/app/components/base/textarea'
+import { DEFAULT_VALUE_MAX_LEN } from '@/config'
+import type { Inputs } from '@/models/debug'
+import cn from '@/utils/classnames'
+
+type Props = {
+  inputs: Inputs
+}
+
+const ChatUserInput = ({
+  inputs,
+}: Props) => {
+  const { t } = useTranslation()
+  const { modelConfig, setInputs } = useContext(ConfigContext)
+
+  const promptVariables = modelConfig.configs.prompt_variables.filter(({ key, name }) => {
+    return key && key?.trim() && name && name?.trim()
+  })
+
+  const promptVariableObj = (() => {
+    const obj: Record<string, boolean> = {}
+    promptVariables.forEach((input) => {
+      obj[input.key] = true
+    })
+    return obj
+  })()
+
+  const handleInputValueChange = (key: string, value: string) => {
+    if (!(key in promptVariableObj))
+      return
+
+    const newInputs = { ...inputs }
+    promptVariables.forEach((input) => {
+      if (input.key === key)
+        newInputs[key] = value
+    })
+    setInputs(newInputs)
+  }
+
+  if (!promptVariables.length)
+    return null
+
+  return (
+    <div className={cn('z-[1] rounded-xl border-[0.5px] border-components-panel-border-subtle bg-components-panel-on-panel-item-bg shadow-xs')}>
+      <div className='px-4 pb-4 pt-3'>
+        {promptVariables.map(({ key, name, type, options, max_length, required }, index) => (
+          <div
+            key={key}
+            className='mb-4 last-of-type:mb-0'
+          >
+            <div>
+              <div className='system-sm-semibold mb-1 flex h-6 items-center gap-1 text-text-secondary'>
+                <div className='truncate'>{name || key}</div>
+                {!required && <span className='system-xs-regular text-text-tertiary'>{t('workflow.panel.optional')}</span>}
+              </div>
+              <div className='grow'>
+                {type === 'string' && (
+                  <Input
+                    value={inputs[key] ? `${inputs[key]}` : ''}
+                    onChange={(e) => { handleInputValueChange(key, e.target.value) }}
+                    placeholder={name}
+                    autoFocus={index === 0}
+                    maxLength={max_length || DEFAULT_VALUE_MAX_LEN}
+                  />
+                )}
+                {type === 'paragraph' && (
+                  <Textarea
+                    className='h-[120px] grow'
+                    placeholder={name}
+                    value={inputs[key] ? `${inputs[key]}` : ''}
+                    onChange={(e) => { handleInputValueChange(key, e.target.value) }}
+                  />
+                )}
+                {type === 'select' && (
+                  <Select
+                    className='w-full'
+                    defaultValue={inputs[key] as string}
+                    onSelect={(i) => { handleInputValueChange(key, i.value as string) }}
+                    items={(options || []).map(i => ({ name: i, value: i }))}
+                    allowSearch={false}
+                  />
+                )}
+                {type === 'number' && (
+                  <Input
+                    type='number'
+                    value={inputs[key] ? `${inputs[key]}` : ''}
+                    onChange={(e) => { handleInputValueChange(key, e.target.value) }}
+                    placeholder={name}
+                    autoFocus={index === 0}
+                    maxLength={max_length || DEFAULT_VALUE_MAX_LEN}
+                  />
+                )}
+              </div>
+            </div>
+          </div>
+        ))}
+      </div>
+    </div>
+  )
+}
+
+export default ChatUserInput
diff --git a/app/components/app/configuration/debug/debug-with-multiple-model/chat-item.tsx b/app/components/app/configuration/debug/debug-with-multiple-model/chat-item.tsx
new file mode 100644
index 0000000..ad4c06b
--- /dev/null
+++ b/app/components/app/configuration/debug/debug-with-multiple-model/chat-item.tsx
@@ -0,0 +1,160 @@
+import type { FC } from 'react'
+import {
+  memo,
+  useCallback,
+  useMemo,
+} from 'react'
+import type { ModelAndParameter } from '../types'
+import {
+  APP_CHAT_WITH_MULTIPLE_MODEL,
+  APP_CHAT_WITH_MULTIPLE_MODEL_RESTART,
+} from '../types'
+import {
+  useConfigFromDebugContext,
+  useFormattingChangedSubscription,
+} from '../hooks'
+import Chat from '@/app/components/base/chat/chat'
+import { useChat } from '@/app/components/base/chat/chat/hooks'
+import { useDebugConfigurationContext } from '@/context/debug-configuration'
+import type { ChatConfig, OnSend } from '@/app/components/base/chat/types'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { useProviderContext } from '@/context/provider-context'
+import {
+  fetchConversationMessages,
+  fetchSuggestedQuestions,
+  stopChatMessageResponding,
+} from '@/service/debug'
+import Avatar from '@/app/components/base/avatar'
+import { useAppContext } from '@/context/app-context'
+import { ModelFeatureEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { useFeatures } from '@/app/components/base/features/hooks'
+import type { InputForm } from '@/app/components/base/chat/chat/type'
+import { getLastAnswer } from '@/app/components/base/chat/utils'
+import { canFindTool } from '@/utils'
+
+type ChatItemProps = {
+  modelAndParameter: ModelAndParameter
+}
+const ChatItem: FC<ChatItemProps> = ({
+  modelAndParameter,
+}) => {
+  const { userProfile } = useAppContext()
+  const {
+    modelConfig,
+    appId,
+    inputs,
+    collectionList,
+  } = useDebugConfigurationContext()
+  const { textGenerationModelList } = useProviderContext()
+  const features = useFeatures(s => s.features)
+  const configTemplate = useConfigFromDebugContext()
+  const config = useMemo(() => {
+    return {
+      ...configTemplate,
+      more_like_this: features.moreLikeThis,
+      opening_statement: features.opening?.enabled ? (features.opening?.opening_statement || '') : '',
+      suggested_questions: features.opening?.enabled ? (features.opening?.suggested_questions || []) : [],
+      sensitive_word_avoidance: features.moderation,
+      speech_to_text: features.speech2text,
+      text_to_speech: features.text2speech,
+      file_upload: features.file,
+      suggested_questions_after_answer: features.suggested,
+      retriever_resource: features.citation,
+      annotation_reply: features.annotationReply,
+    } as ChatConfig
+  }, [configTemplate, features])
+  const inputsForm = useMemo(() => {
+    return modelConfig.configs.prompt_variables.filter(item => item.type !== 'api').map(item => ({ ...item, label: item.name, variable: item.key })) as InputForm[]
+  }, [modelConfig.configs.prompt_variables])
+  const {
+    chatList,
+    isResponding,
+    handleSend,
+    suggestedQuestions,
+    handleRestart,
+  } = useChat(
+    config,
+    {
+      inputs,
+      inputsForm,
+    },
+    [],
+    taskId => stopChatMessageResponding(appId, taskId),
+  )
+  useFormattingChangedSubscription(chatList)
+
+  const doSend: OnSend = useCallback((message, files) => {
+    const currentProvider = textGenerationModelList.find(item => item.provider === modelAndParameter.provider)
+    const currentModel = currentProvider?.models.find(model => model.model === modelAndParameter.model)
+    const supportVision = currentModel?.features?.includes(ModelFeatureEnum.vision)
+
+    const configData = {
+      ...config,
+      model: {
+        provider: modelAndParameter.provider,
+        name: modelAndParameter.model,
+        mode: currentModel?.model_properties.mode,
+        completion_params: modelAndParameter.parameters,
+      },
+    }
+
+    const data: any = {
+      query: message,
+      inputs,
+      model_config: configData,
+      parent_message_id: getLastAnswer(chatList)?.id || null,
+    }
+
+    if ((config.file_upload as any).enabled && files?.length && supportVision)
+      data.files = files
+
+    handleSend(
+      `apps/${appId}/chat-messages`,
+      data,
+      {
+        onGetConversationMessages: (conversationId, getAbortController) => fetchConversationMessages(appId, conversationId, getAbortController),
+        onGetSuggestedQuestions: (responseItemId, getAbortController) => fetchSuggestedQuestions(appId, responseItemId, getAbortController),
+      },
+    )
+  }, [appId, chatList, config, handleSend, inputs, modelAndParameter.model, modelAndParameter.parameters, modelAndParameter.provider, textGenerationModelList])
+
+  const { eventEmitter } = useEventEmitterContextContext()
+  eventEmitter?.useSubscription((v: any) => {
+    if (v.type === APP_CHAT_WITH_MULTIPLE_MODEL)
+      doSend(v.payload.message, v.payload.files)
+    if (v.type === APP_CHAT_WITH_MULTIPLE_MODEL_RESTART)
+      handleRestart()
+  })
+
+  const allToolIcons = useMemo(() => {
+    const icons: Record<string, any> = {}
+    modelConfig.agentConfig.tools?.forEach((item: any) => {
+      icons[item.tool_name] = collectionList.find((collection: any) => canFindTool(collection.id, item.provider_id))?.icon
+    })
+    return icons
+  }, [collectionList, modelConfig.agentConfig.tools])
+
+  if (!chatList.length)
+    return null
+
+  return (
+    <Chat
+      config={config}
+      chatList={chatList}
+      isResponding={isResponding}
+      noChatInput
+      noStopResponding
+      chatContainerClassName='p-4'
+      chatFooterClassName='p-4 pb-0'
+      suggestedQuestions={suggestedQuestions}
+      onSend={doSend}
+      showPromptLog
+      questionIcon={<Avatar avatar={userProfile.avatar_url} name={userProfile.name} size={40} />}
+      allToolIcons={allToolIcons}
+      hideLogModal
+      noSpacing
+    />
+  )
+}
+
+export default memo(ChatItem)
diff --git a/app/components/app/configuration/debug/debug-with-multiple-model/context.tsx b/app/components/app/configuration/debug/debug-with-multiple-model/context.tsx
new file mode 100644
index 0000000..1fcd878
--- /dev/null
+++ b/app/components/app/configuration/debug/debug-with-multiple-model/context.tsx
@@ -0,0 +1,43 @@
+'use client'
+
+import { createContext, useContext } from 'use-context-selector'
+import type { ModelAndParameter } from '../types'
+import { noop } from 'lodash-es'
+
+export type DebugWithMultipleModelContextType = {
+  multipleModelConfigs: ModelAndParameter[]
+  onMultipleModelConfigsChange: (multiple: boolean, modelConfigs: ModelAndParameter[]) => void
+  onDebugWithMultipleModelChange: (singleModelConfig: ModelAndParameter) => void
+  checkCanSend?: () => boolean
+}
+const DebugWithMultipleModelContext = createContext<DebugWithMultipleModelContextType>({
+  multipleModelConfigs: [],
+  onMultipleModelConfigsChange: noop,
+  onDebugWithMultipleModelChange: noop,
+})
+
+export const useDebugWithMultipleModelContext = () => useContext(DebugWithMultipleModelContext)
+
+type DebugWithMultipleModelContextProviderProps = {
+  children: React.ReactNode
+} & DebugWithMultipleModelContextType
+export const DebugWithMultipleModelContextProvider = ({
+  children,
+  onMultipleModelConfigsChange,
+  multipleModelConfigs,
+  onDebugWithMultipleModelChange,
+  checkCanSend,
+}: DebugWithMultipleModelContextProviderProps) => {
+  return (
+    <DebugWithMultipleModelContext.Provider value={{
+      onMultipleModelConfigsChange,
+      multipleModelConfigs,
+      onDebugWithMultipleModelChange,
+      checkCanSend,
+    }}>
+      {children}
+    </DebugWithMultipleModelContext.Provider>
+  )
+}
+
+export default DebugWithMultipleModelContext
diff --git a/app/components/app/configuration/debug/debug-with-multiple-model/debug-item.tsx b/app/components/app/configuration/debug/debug-with-multiple-model/debug-item.tsx
new file mode 100644
index 0000000..95c43f5
--- /dev/null
+++ b/app/components/app/configuration/debug/debug-with-multiple-model/debug-item.tsx
@@ -0,0 +1,129 @@
+import type { CSSProperties, FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { memo } from 'react'
+import type { ModelAndParameter } from '../types'
+import ModelParameterTrigger from './model-parameter-trigger'
+import ChatItem from './chat-item'
+import TextGenerationItem from './text-generation-item'
+import { useDebugWithMultipleModelContext } from './context'
+import { useDebugConfigurationContext } from '@/context/debug-configuration'
+import Dropdown from '@/app/components/base/dropdown'
+import type { Item } from '@/app/components/base/dropdown'
+import { useProviderContext } from '@/context/provider-context'
+import { ModelStatusEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+
+type DebugItemProps = {
+  modelAndParameter: ModelAndParameter
+  className?: string
+  style?: CSSProperties
+}
+const DebugItem: FC<DebugItemProps> = ({
+  modelAndParameter,
+  className,
+  style,
+}) => {
+  const { t } = useTranslation()
+  const { mode } = useDebugConfigurationContext()
+  const {
+    multipleModelConfigs,
+    onMultipleModelConfigsChange,
+    onDebugWithMultipleModelChange,
+  } = useDebugWithMultipleModelContext()
+  const { textGenerationModelList } = useProviderContext()
+
+  const index = multipleModelConfigs.findIndex(v => v.id === modelAndParameter.id)
+  const currentProvider = textGenerationModelList.find(item => item.provider === modelAndParameter.provider)
+  const currentModel = currentProvider?.models.find(item => item.model === modelAndParameter.model)
+
+  const handleSelect = (item: Item) => {
+    if (item.value === 'duplicate') {
+      if (multipleModelConfigs.length >= 4)
+        return
+
+      onMultipleModelConfigsChange(
+        true,
+        [
+          ...multipleModelConfigs.slice(0, index + 1),
+          {
+            ...modelAndParameter,
+            id: `${Date.now()}`,
+          },
+          ...multipleModelConfigs.slice(index + 1),
+        ],
+      )
+    }
+    if (item.value === 'debug-as-single-model')
+      onDebugWithMultipleModelChange(modelAndParameter)
+    if (item.value === 'remove') {
+      onMultipleModelConfigsChange(
+        true,
+        multipleModelConfigs.filter(item => item.id !== modelAndParameter.id),
+      )
+    }
+  }
+
+  return (
+    <div
+      className={`flex min-w-[320px] flex-col rounded-xl bg-background-section-burn ${className}`}
+      style={style}
+    >
+      <div className='flex h-10 shrink-0 items-center justify-between border-b-[0.5px] border-divider-regular px-3'>
+        <div className='flex h-5 w-6 items-center justify-center font-medium italic text-text-tertiary'>
+          #{index + 1}
+        </div>
+        <ModelParameterTrigger
+          modelAndParameter={modelAndParameter}
+        />
+        <Dropdown
+          onSelect={handleSelect}
+          items={[
+            ...(
+              multipleModelConfigs.length <= 3
+                ? [
+                  {
+                    value: 'duplicate',
+                    text: t('appDebug.duplicateModel'),
+                  },
+                ]
+                : []
+            ),
+            ...(
+              (modelAndParameter.provider && modelAndParameter.model)
+                ? [
+                  {
+                    value: 'debug-as-single-model',
+                    text: t('appDebug.debugAsSingleModel'),
+                  },
+                ]
+                : []
+            ),
+          ]}
+          secondItems={
+            multipleModelConfigs.length > 2
+              ? [
+                {
+                  value: 'remove',
+                  text: t('common.operation.remove') as string,
+                },
+              ]
+              : undefined
+          }
+        />
+      </div>
+      <div style={{ height: 'calc(100% - 40px)' }}>
+        {
+          (mode === 'chat' || mode === 'agent-chat') && currentProvider && currentModel && currentModel.status === ModelStatusEnum.active && (
+            <ChatItem modelAndParameter={modelAndParameter} />
+          )
+        }
+        {
+          mode === 'completion' && currentProvider && currentModel && currentModel.status === ModelStatusEnum.active && (
+            <TextGenerationItem modelAndParameter={modelAndParameter}/>
+          )
+        }
+      </div>
+    </div>
+  )
+}
+
+export default memo(DebugItem)
diff --git a/app/components/app/configuration/debug/debug-with-multiple-model/index.tsx b/app/components/app/configuration/debug/debug-with-multiple-model/index.tsx
new file mode 100644
index 0000000..75ba836
--- /dev/null
+++ b/app/components/app/configuration/debug/debug-with-multiple-model/index.tsx
@@ -0,0 +1,171 @@
+import type { FC } from 'react'
+import {
+  memo,
+  useCallback,
+  useMemo,
+} from 'react'
+import { APP_CHAT_WITH_MULTIPLE_MODEL } from '../types'
+import DebugItem from './debug-item'
+import {
+  DebugWithMultipleModelContextProvider,
+  useDebugWithMultipleModelContext,
+} from './context'
+import type { DebugWithMultipleModelContextType } from './context'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import ChatInputArea from '@/app/components/base/chat/chat/chat-input-area'
+import { useDebugConfigurationContext } from '@/context/debug-configuration'
+import { useFeatures } from '@/app/components/base/features/hooks'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import type { FileEntity } from '@/app/components/base/file-uploader/types'
+import type { InputForm } from '@/app/components/base/chat/chat/type'
+
+const DebugWithMultipleModel = () => {
+  const {
+    mode,
+    inputs,
+    modelConfig,
+  } = useDebugConfigurationContext()
+  const speech2text = useFeatures(s => s.features.speech2text)
+  const file = useFeatures(s => s.features.file)
+  const {
+    multipleModelConfigs,
+    checkCanSend,
+  } = useDebugWithMultipleModelContext()
+
+  const { eventEmitter } = useEventEmitterContextContext()
+  const isChatMode = mode === 'chat' || mode === 'agent-chat'
+
+  const handleSend = useCallback((message: string, files?: FileEntity[]) => {
+    if (checkCanSend && !checkCanSend())
+      return
+
+    eventEmitter?.emit({
+      type: APP_CHAT_WITH_MULTIPLE_MODEL,
+      payload: {
+        message,
+        files,
+      },
+    } as any)
+  }, [eventEmitter, checkCanSend])
+
+  const twoLine = multipleModelConfigs.length === 2
+  const threeLine = multipleModelConfigs.length === 3
+  const fourLine = multipleModelConfigs.length === 4
+
+  const size = useMemo(() => {
+    let width = ''
+    let height = ''
+    if (twoLine) {
+      width = 'calc(50% - 4px - 24px)'
+      height = '100%'
+    }
+    if (threeLine) {
+      width = 'calc(33.3% - 5.33px - 16px)'
+      height = '100%'
+    }
+    if (fourLine) {
+      width = 'calc(50% - 4px - 24px)'
+      height = 'calc(50% - 4px)'
+    }
+
+    return {
+      width,
+      height,
+    }
+  }, [twoLine, threeLine, fourLine])
+  const position = useCallback((idx: number) => {
+    let translateX = '0'
+    let translateY = '0'
+
+    if (twoLine && idx === 1)
+      translateX = 'calc(100% + 8px)'
+    if (threeLine && idx === 1)
+      translateX = 'calc(100% + 8px)'
+    if (threeLine && idx === 2)
+      translateX = 'calc(200% + 16px)'
+    if (fourLine && idx === 1)
+      translateX = 'calc(100% + 8px)'
+    if (fourLine && idx === 2)
+      translateY = 'calc(100% + 8px)'
+    if (fourLine && idx === 3) {
+      translateX = 'calc(100% + 8px)'
+      translateY = 'calc(100% + 8px)'
+    }
+
+    return {
+      translateX,
+      translateY,
+    }
+  }, [twoLine, threeLine, fourLine])
+
+  const setShowAppConfigureFeaturesModal = useAppStore(s => s.setShowAppConfigureFeaturesModal)
+  const inputsForm = modelConfig.configs.prompt_variables.filter(item => item.type !== 'api').map(item => ({ ...item, label: item.name, variable: item.key })) as InputForm[]
+
+  return (
+    <div className='flex h-full flex-col'>
+      <div
+        className={`
+          relative mb-3 grow overflow-auto px-6
+        `}
+        style={{ height: isChatMode ? 'calc(100% - 60px)' : '100%' }}
+      >
+        {
+          multipleModelConfigs.map((modelConfig, index) => (
+            <DebugItem
+              key={modelConfig.id}
+              modelAndParameter={modelConfig}
+              className={`
+                absolute left-6 top-0 min-h-[200px]
+                ${twoLine && index === 0 && 'mr-2'}
+                ${threeLine && (index === 0 || index === 1) && 'mr-2'}
+                ${fourLine && (index === 0 || index === 2) && 'mr-2'}
+                ${fourLine && (index === 0 || index === 1) && 'mb-2'}
+              `}
+              style={{
+                width: size.width,
+                height: size.height,
+                transform: `translateX(${position(index).translateX}) translateY(${position(index).translateY})`,
+              }}
+            />
+          ))
+        }
+      </div>
+      {isChatMode && (
+        <div className='shrink-0 px-6 pb-0'>
+          <ChatInputArea
+            showFeatureBar
+            showFileUpload={false}
+            onFeatureBarClick={setShowAppConfigureFeaturesModal}
+            onSend={handleSend}
+            speechToTextConfig={speech2text as any}
+            visionConfig={file}
+            inputs={inputs}
+            inputsForm={inputsForm}
+          />
+        </div>
+      )}
+    </div>
+  )
+}
+
+const DebugWithMultipleModelMemoed = memo(DebugWithMultipleModel)
+
+const DebugWithMultipleModelWrapper: FC<DebugWithMultipleModelContextType> = ({
+  onMultipleModelConfigsChange,
+  multipleModelConfigs,
+  onDebugWithMultipleModelChange,
+  checkCanSend,
+}) => {
+  return (
+    <DebugWithMultipleModelContextProvider
+      onMultipleModelConfigsChange={onMultipleModelConfigsChange}
+      multipleModelConfigs={multipleModelConfigs}
+      onDebugWithMultipleModelChange={onDebugWithMultipleModelChange}
+      checkCanSend={checkCanSend}
+    >
+      <DebugWithMultipleModelMemoed />
+    </DebugWithMultipleModelContextProvider>
+  )
+}
+
+export default memo(DebugWithMultipleModelWrapper)
diff --git a/app/components/app/configuration/debug/debug-with-multiple-model/model-parameter-trigger.tsx b/app/components/app/configuration/debug/debug-with-multiple-model/model-parameter-trigger.tsx
new file mode 100644
index 0000000..17d04ac
--- /dev/null
+++ b/app/components/app/configuration/debug/debug-with-multiple-model/model-parameter-trigger.tsx
@@ -0,0 +1,126 @@
+import type { FC } from 'react'
+import { memo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine } from '@remixicon/react'
+import type { ModelAndParameter } from '../types'
+import { useDebugWithMultipleModelContext } from './context'
+import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal'
+import ModelIcon from '@/app/components/header/account-setting/model-provider-page/model-icon'
+import ModelName from '@/app/components/header/account-setting/model-provider-page/model-name'
+import {
+  type FormValue,
+  MODEL_STATUS_TEXT,
+  ModelStatusEnum,
+} from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { useDebugConfigurationContext } from '@/context/debug-configuration'
+import { CubeOutline } from '@/app/components/base/icons/src/vender/line/shapes'
+import Tooltip from '@/app/components/base/tooltip'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/line/alertsAndFeedback'
+import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks'
+
+type ModelParameterTriggerProps = {
+  modelAndParameter: ModelAndParameter
+}
+const ModelParameterTrigger: FC<ModelParameterTriggerProps> = ({
+  modelAndParameter,
+}) => {
+  const { t } = useTranslation()
+  const {
+    mode,
+    isAdvancedMode,
+  } = useDebugConfigurationContext()
+  const {
+    multipleModelConfigs,
+    onMultipleModelConfigsChange,
+    onDebugWithMultipleModelChange,
+  } = useDebugWithMultipleModelContext()
+  const language = useLanguage()
+  const index = multipleModelConfigs.findIndex(v => v.id === modelAndParameter.id)
+
+  const handleSelectModel = ({ modelId, provider }: { modelId: string; provider: string }) => {
+    const newModelConfigs = [...multipleModelConfigs]
+    newModelConfigs[index] = {
+      ...newModelConfigs[index],
+      model: modelId,
+      provider,
+    }
+    onMultipleModelConfigsChange(true, newModelConfigs)
+  }
+  const handleParamsChange = (params: FormValue) => {
+    const newModelConfigs = [...multipleModelConfigs]
+    newModelConfigs[index] = {
+      ...newModelConfigs[index],
+      parameters: params,
+    }
+    onMultipleModelConfigsChange(true, newModelConfigs)
+  }
+
+  return (
+    <ModelParameterModal
+      mode={mode}
+      isAdvancedMode={isAdvancedMode}
+      provider={modelAndParameter.provider}
+      modelId={modelAndParameter.model}
+      completionParams={modelAndParameter.parameters}
+      onCompletionParamsChange={handleParamsChange}
+      setModel={handleSelectModel}
+      debugWithMultipleModel
+      onDebugWithMultipleModelChange={() => onDebugWithMultipleModelChange(modelAndParameter)}
+      renderTrigger={({
+        open,
+        currentProvider,
+        currentModel,
+      }) => (
+        <div
+          className={`
+            flex h-8 max-w-[200px] cursor-pointer items-center rounded-lg px-2
+            ${open && 'bg-state-base-hover'}
+            ${currentModel && currentModel.status !== ModelStatusEnum.active && '!bg-[#FFFAEB]'}
+          `}
+        >
+          {
+            currentProvider && (
+              <ModelIcon
+                className='mr-1 !h-4 !w-4'
+                provider={currentProvider}
+                modelName={currentModel?.model}
+              />
+            )
+          }
+          {
+            !currentProvider && (
+              <div className='mr-1 flex h-4 w-4 items-center justify-center rounded'>
+                <CubeOutline className='h-4 w-4 text-text-accent' />
+              </div>
+            )
+          }
+          {
+            currentModel && (
+              <ModelName
+                className='mr-0.5 text-text-secondary'
+                modelItem={currentModel}
+              />
+            )
+          }
+          {
+            !currentModel && (
+              <div className='mr-0.5 truncate text-[13px] font-medium text-text-accent'>
+                {t('common.modelProvider.selectModel')}
+              </div>
+            )
+          }
+          <RiArrowDownSLine className={`h-3 w-3 ${(currentModel && currentProvider) ? 'text-text-tertiary' : 'text-text-accent'}`} />
+          {
+            currentModel && currentModel.status !== ModelStatusEnum.active && (
+              <Tooltip popupContent={MODEL_STATUS_TEXT[currentModel.status][language]}>
+                <AlertTriangle className='h-4 w-4 text-[#F79009]' />
+              </Tooltip>
+            )
+          }
+        </div>
+      )}
+    />
+  )
+}
+
+export default memo(ModelParameterTrigger)
diff --git a/app/components/app/configuration/debug/debug-with-multiple-model/text-generation-item.tsx b/app/components/app/configuration/debug/debug-with-multiple-model/text-generation-item.tsx
new file mode 100644
index 0000000..8f8555e
--- /dev/null
+++ b/app/components/app/configuration/debug/debug-with-multiple-model/text-generation-item.tsx
@@ -0,0 +1,144 @@
+import type { FC } from 'react'
+import { memo } from 'react'
+import type { ModelAndParameter } from '../types'
+import { APP_CHAT_WITH_MULTIPLE_MODEL } from '../types'
+import type {
+  OnSend,
+  TextGenerationConfig,
+} from '@/app/components/base/text-generation/types'
+import { useTextGeneration } from '@/app/components/base/text-generation/hooks'
+import TextGeneration from '@/app/components/app/text-generate/item'
+import { useDebugConfigurationContext } from '@/context/debug-configuration'
+import { promptVariablesToUserInputsForm } from '@/utils/model-config'
+import { TransferMethod } from '@/app/components/base/chat/types'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { useProviderContext } from '@/context/provider-context'
+import { useFeatures } from '@/app/components/base/features/hooks'
+import { noop } from 'lodash-es'
+
+type TextGenerationItemProps = {
+  modelAndParameter: ModelAndParameter
+}
+const TextGenerationItem: FC<TextGenerationItemProps> = ({
+  modelAndParameter,
+}) => {
+  const {
+    isAdvancedMode,
+    modelConfig,
+    appId,
+    inputs,
+    promptMode,
+    speechToTextConfig,
+    introduction,
+    suggestedQuestionsAfterAnswerConfig,
+    citationConfig,
+    externalDataToolsConfig,
+    chatPromptConfig,
+    completionPromptConfig,
+    dataSets,
+    datasetConfigs,
+  } = useDebugConfigurationContext()
+  const { textGenerationModelList } = useProviderContext()
+  const features = useFeatures(s => s.features)
+  const postDatasets = dataSets.map(({ id }) => ({
+    dataset: {
+      enabled: true,
+      id,
+    },
+  }))
+  const contextVar = modelConfig.configs.prompt_variables.find(item => item.is_context_var)?.key
+  const config: TextGenerationConfig = {
+    pre_prompt: !isAdvancedMode ? modelConfig.configs.prompt_template : '',
+    prompt_type: promptMode,
+    chat_prompt_config: isAdvancedMode ? chatPromptConfig : {},
+    completion_prompt_config: isAdvancedMode ? completionPromptConfig : {},
+    user_input_form: promptVariablesToUserInputsForm(modelConfig.configs.prompt_variables),
+    dataset_query_variable: contextVar || '',
+    // features
+    more_like_this: features.moreLikeThis as any,
+    sensitive_word_avoidance: features.moderation as any,
+    text_to_speech: features.text2speech as any,
+    file_upload: features.file as any,
+    opening_statement: introduction,
+    speech_to_text: speechToTextConfig,
+    suggested_questions_after_answer: suggestedQuestionsAfterAnswerConfig,
+    retriever_resource: citationConfig,
+    external_data_tools: externalDataToolsConfig,
+    agent_mode: {
+      enabled: false,
+      tools: [],
+    },
+    dataset_configs: {
+      ...datasetConfigs,
+      datasets: {
+        datasets: [...postDatasets],
+      } as any,
+    },
+  }
+  const {
+    completion,
+    handleSend,
+    isResponding,
+    messageId,
+  } = useTextGeneration()
+
+  const doSend: OnSend = (message, files) => {
+    const currentProvider = textGenerationModelList.find(item => item.provider === modelAndParameter.provider)
+    const currentModel = currentProvider?.models.find(model => model.model === modelAndParameter.model)
+
+    const configData = {
+      ...config,
+      model: {
+        provider: modelAndParameter.provider,
+        name: modelAndParameter.model,
+        mode: currentModel?.model_properties.mode,
+        completion_params: modelAndParameter.parameters,
+      },
+    }
+
+    const data: any = {
+      inputs,
+      model_config: configData,
+    }
+
+    if ((config.file_upload as any).enabled && files && files?.length > 0) {
+      data.files = files.map((item) => {
+        if (item.transfer_method === TransferMethod.local_file) {
+          return {
+            ...item,
+            url: '',
+          }
+        }
+        return item
+      })
+    }
+
+    handleSend(
+      `apps/${appId}/completion-messages`,
+      data,
+    )
+  }
+
+  const { eventEmitter } = useEventEmitterContextContext()
+  eventEmitter?.useSubscription((v: any) => {
+    if (v.type === APP_CHAT_WITH_MULTIPLE_MODEL)
+      doSend(v.payload.message, v.payload.files)
+  })
+
+  return (
+    <TextGeneration
+      className='flex h-full flex-col overflow-y-auto border-none'
+      content={completion}
+      isLoading={!completion && isResponding}
+      isResponding={isResponding}
+      isInstalledApp={false}
+      siteInfo={null}
+      messageId={messageId}
+      isError={false}
+      onRetry={noop}
+      inSidePanel
+    />
+  )
+}
+
+export default memo(TextGenerationItem)
diff --git a/app/components/app/configuration/debug/debug-with-single-model/index.tsx b/app/components/app/configuration/debug/debug-with-single-model/index.tsx
new file mode 100644
index 0000000..d439b00
--- /dev/null
+++ b/app/components/app/configuration/debug/debug-with-single-model/index.tsx
@@ -0,0 +1,185 @@
+import { memo, useCallback, useImperativeHandle, useMemo } from 'react'
+import {
+  useConfigFromDebugContext,
+  useFormattingChangedSubscription,
+} from '../hooks'
+import Chat from '@/app/components/base/chat/chat'
+import { useChat } from '@/app/components/base/chat/chat/hooks'
+import { useDebugConfigurationContext } from '@/context/debug-configuration'
+import type { ChatConfig, ChatItem, ChatItemInTree, OnSend } from '@/app/components/base/chat/types'
+import { useProviderContext } from '@/context/provider-context'
+import {
+  fetchConversationMessages,
+  fetchSuggestedQuestions,
+  stopChatMessageResponding,
+} from '@/service/debug'
+import Avatar from '@/app/components/base/avatar'
+import { useAppContext } from '@/context/app-context'
+import { ModelFeatureEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { useFeatures } from '@/app/components/base/features/hooks'
+import { getLastAnswer, isValidGeneratedAnswer } from '@/app/components/base/chat/utils'
+import type { InputForm } from '@/app/components/base/chat/chat/type'
+import { canFindTool } from '@/utils'
+import type { FileEntity } from '@/app/components/base/file-uploader/types'
+
+type DebugWithSingleModelProps = {
+  checkCanSend?: () => boolean
+}
+export type DebugWithSingleModelRefType = {
+  handleRestart: () => void
+}
+const DebugWithSingleModel = (
+  {
+    ref,
+    checkCanSend,
+  }: DebugWithSingleModelProps & {
+    ref: React.RefObject<DebugWithSingleModelRefType>;
+  },
+) => {
+  const { userProfile } = useAppContext()
+  const {
+    modelConfig,
+    appId,
+    inputs,
+    collectionList,
+    completionParams,
+    // isShowVisionConfig,
+  } = useDebugConfigurationContext()
+  const { textGenerationModelList } = useProviderContext()
+  const features = useFeatures(s => s.features)
+  const configTemplate = useConfigFromDebugContext()
+  const config = useMemo(() => {
+    return {
+      ...configTemplate,
+      more_like_this: features.moreLikeThis,
+      opening_statement: features.opening?.enabled ? (features.opening?.opening_statement || '') : '',
+      suggested_questions: features.opening?.enabled ? (features.opening?.suggested_questions || []) : [],
+      sensitive_word_avoidance: features.moderation,
+      speech_to_text: features.speech2text,
+      text_to_speech: features.text2speech,
+      file_upload: features.file,
+      suggested_questions_after_answer: features.suggested,
+      retriever_resource: features.citation,
+      annotation_reply: features.annotationReply,
+    } as ChatConfig
+  }, [configTemplate, features])
+  const inputsForm = useMemo(() => {
+    return modelConfig.configs.prompt_variables.filter(item => item.type !== 'api').map(item => ({ ...item, label: item.name, variable: item.key })) as InputForm[]
+  }, [modelConfig.configs.prompt_variables])
+  const {
+    chatList,
+    setTargetMessageId,
+    isResponding,
+    handleSend,
+    suggestedQuestions,
+    handleStop,
+    handleRestart,
+    handleAnnotationAdded,
+    handleAnnotationEdited,
+    handleAnnotationRemoved,
+  } = useChat(
+    config,
+    {
+      inputs,
+      inputsForm,
+    },
+    [],
+    taskId => stopChatMessageResponding(appId, taskId),
+  )
+  useFormattingChangedSubscription(chatList)
+
+  const doSend: OnSend = useCallback((message, files, isRegenerate = false, parentAnswer: ChatItem | null = null) => {
+    if (checkCanSend && !checkCanSend())
+      return
+    const currentProvider = textGenerationModelList.find(item => item.provider === modelConfig.provider)
+    const currentModel = currentProvider?.models.find(model => model.model === modelConfig.model_id)
+    const supportVision = currentModel?.features?.includes(ModelFeatureEnum.vision)
+
+    const configData = {
+      ...config,
+      model: {
+        provider: modelConfig.provider,
+        name: modelConfig.model_id,
+        mode: modelConfig.mode,
+        completion_params: completionParams,
+      },
+    }
+
+    const data: any = {
+      query: message,
+      inputs,
+      model_config: configData,
+      parent_message_id: (isRegenerate ? parentAnswer?.id : getLastAnswer(chatList)?.id) || null,
+    }
+
+    if ((config.file_upload as any)?.enabled && files?.length && supportVision)
+      data.files = files
+
+    handleSend(
+      `apps/${appId}/chat-messages`,
+      data,
+      {
+        onGetConversationMessages: (conversationId, getAbortController) => fetchConversationMessages(appId, conversationId, getAbortController),
+        onGetSuggestedQuestions: (responseItemId, getAbortController) => fetchSuggestedQuestions(appId, responseItemId, getAbortController),
+      },
+    )
+  }, [appId, chatList, checkCanSend, completionParams, config, handleSend, inputs, modelConfig.mode, modelConfig.model_id, modelConfig.provider, textGenerationModelList])
+
+  const doRegenerate = useCallback((chatItem: ChatItemInTree, editedQuestion?: { message: string, files?: FileEntity[] }) => {
+    const question = editedQuestion ? chatItem : chatList.find(item => item.id === chatItem.parentMessageId)!
+    const parentAnswer = chatList.find(item => item.id === question.parentMessageId)
+    doSend(editedQuestion ? editedQuestion.message : question.content,
+      editedQuestion ? editedQuestion.files : question.message_files,
+      true,
+      isValidGeneratedAnswer(parentAnswer) ? parentAnswer : null,
+    )
+  }, [chatList, doSend])
+
+  const allToolIcons = useMemo(() => {
+    const icons: Record<string, any> = {}
+    modelConfig.agentConfig.tools?.forEach((item: any) => {
+      icons[item.tool_name] = collectionList.find((collection: any) => canFindTool(collection.id, item.provider_id))?.icon
+    })
+    return icons
+  }, [collectionList, modelConfig.agentConfig.tools])
+
+  useImperativeHandle(ref, () => {
+    return {
+      handleRestart,
+    }
+  }, [handleRestart])
+
+  const setShowAppConfigureFeaturesModal = useAppStore(s => s.setShowAppConfigureFeaturesModal)
+
+  return (
+    <Chat
+      config={config}
+      chatList={chatList}
+      isResponding={isResponding}
+      chatContainerClassName='px-3 pt-6'
+      chatFooterClassName='px-3 pt-10 pb-0'
+      showFeatureBar
+      showFileUpload={false}
+      onFeatureBarClick={setShowAppConfigureFeaturesModal}
+      suggestedQuestions={suggestedQuestions}
+      onSend={doSend}
+      inputs={inputs}
+      inputsForm={inputsForm}
+      onRegenerate={doRegenerate}
+      switchSibling={siblingMessageId => setTargetMessageId(siblingMessageId)}
+      onStopResponding={handleStop}
+      showPromptLog
+      questionIcon={<Avatar avatar={userProfile.avatar_url} name={userProfile.name} size={40} />}
+      allToolIcons={allToolIcons}
+      onAnnotationEdited={handleAnnotationEdited}
+      onAnnotationAdded={handleAnnotationAdded}
+      onAnnotationRemoved={handleAnnotationRemoved}
+      noSpacing
+    />
+  )
+}
+
+DebugWithSingleModel.displayName = 'DebugWithSingleModel'
+
+export default memo(DebugWithSingleModel)
diff --git a/app/components/app/configuration/debug/hooks.tsx b/app/components/app/configuration/debug/hooks.tsx
new file mode 100644
index 0000000..12022e7
--- /dev/null
+++ b/app/components/app/configuration/debug/hooks.tsx
@@ -0,0 +1,158 @@
+import {
+  useCallback,
+  useRef,
+  useState,
+} from 'react'
+import type {
+  DebugWithSingleOrMultipleModelConfigs,
+  ModelAndParameter,
+} from './types'
+import { ORCHESTRATE_CHANGED } from './types'
+import type {
+  ChatConfig,
+  ChatItem,
+} from '@/app/components/base/chat/types'
+import {
+  AgentStrategy,
+} from '@/types/app'
+import { promptVariablesToUserInputsForm } from '@/utils/model-config'
+import { useDebugConfigurationContext } from '@/context/debug-configuration'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+
+export const useDebugWithSingleOrMultipleModel = (appId: string) => {
+  const localeDebugWithSingleOrMultipleModelConfigs = localStorage.getItem('app-debug-with-single-or-multiple-models')
+
+  const debugWithSingleOrMultipleModelConfigs = useRef<DebugWithSingleOrMultipleModelConfigs>({})
+
+  if (localeDebugWithSingleOrMultipleModelConfigs) {
+    try {
+      debugWithSingleOrMultipleModelConfigs.current = JSON.parse(localeDebugWithSingleOrMultipleModelConfigs) || {}
+    }
+    catch (e) {
+      console.error(e)
+    }
+  }
+
+  const [
+    debugWithMultipleModel,
+    setDebugWithMultipleModel,
+  ] = useState(debugWithSingleOrMultipleModelConfigs.current[appId]?.multiple || false)
+
+  const [
+    multipleModelConfigs,
+    setMultipleModelConfigs,
+  ] = useState(debugWithSingleOrMultipleModelConfigs.current[appId]?.configs || [])
+
+  const handleMultipleModelConfigsChange = useCallback((
+    multiple: boolean,
+    modelConfigs: ModelAndParameter[],
+  ) => {
+    const value = {
+      multiple,
+      configs: modelConfigs,
+    }
+    debugWithSingleOrMultipleModelConfigs.current[appId] = value
+    localStorage.setItem('app-debug-with-single-or-multiple-models', JSON.stringify(debugWithSingleOrMultipleModelConfigs.current))
+    setDebugWithMultipleModel(value.multiple)
+    setMultipleModelConfigs(value.configs)
+  }, [appId])
+
+  return {
+    debugWithMultipleModel,
+    multipleModelConfigs,
+    handleMultipleModelConfigsChange,
+  }
+}
+
+export const useConfigFromDebugContext = () => {
+  const {
+    isAdvancedMode,
+    modelConfig,
+    appId,
+    promptMode,
+    speechToTextConfig,
+    introduction,
+    suggestedQuestions: openingSuggestedQuestions,
+    suggestedQuestionsAfterAnswerConfig,
+    citationConfig,
+    moderationConfig,
+    chatPromptConfig,
+    completionPromptConfig,
+    dataSets,
+    datasetConfigs,
+    visionConfig,
+    annotationConfig,
+    textToSpeechConfig,
+    isFunctionCall,
+  } = useDebugConfigurationContext()
+  const postDatasets = dataSets.map(({ id }) => ({
+    dataset: {
+      enabled: true,
+      id,
+    },
+  }))
+  const contextVar = modelConfig.configs.prompt_variables.find(item => item.is_context_var)?.key
+  const config: ChatConfig = {
+    pre_prompt: !isAdvancedMode ? modelConfig.configs.prompt_template : '',
+    prompt_type: promptMode,
+    chat_prompt_config: isAdvancedMode ? chatPromptConfig : {},
+    completion_prompt_config: isAdvancedMode ? completionPromptConfig : {},
+    user_input_form: promptVariablesToUserInputsForm(modelConfig.configs.prompt_variables),
+    dataset_query_variable: contextVar || '',
+    opening_statement: introduction,
+    more_like_this: {
+      enabled: false,
+    },
+    suggested_questions: openingSuggestedQuestions,
+    suggested_questions_after_answer: suggestedQuestionsAfterAnswerConfig,
+    text_to_speech: textToSpeechConfig,
+    speech_to_text: speechToTextConfig,
+    retriever_resource: citationConfig,
+    sensitive_word_avoidance: moderationConfig,
+    agent_mode: {
+      ...modelConfig.agentConfig,
+      strategy: isFunctionCall ? AgentStrategy.functionCall : AgentStrategy.react,
+    },
+    dataset_configs: {
+      ...datasetConfigs,
+      datasets: {
+        datasets: [...postDatasets],
+      } as any,
+    },
+    file_upload: {
+      image: visionConfig,
+    },
+    annotation_reply: annotationConfig,
+
+    supportAnnotation: true,
+    appId,
+    supportCitationHitInfo: true,
+  }
+
+  return config
+}
+
+export const useFormattingChangedDispatcher = () => {
+  const { eventEmitter } = useEventEmitterContextContext()
+
+  const dispatcher = useCallback(() => {
+    eventEmitter?.emit({
+      type: ORCHESTRATE_CHANGED,
+    } as any)
+  }, [eventEmitter])
+
+  return dispatcher
+}
+export const useFormattingChangedSubscription = (chatList: ChatItem[]) => {
+  const {
+    formattingChanged,
+    setFormattingChanged,
+  } = useDebugConfigurationContext()
+  const { eventEmitter } = useEventEmitterContextContext()
+  eventEmitter?.useSubscription((v: any) => {
+    if (v.type === ORCHESTRATE_CHANGED) {
+      if (chatList.some(item => item.isAnswer) && !formattingChanged)
+        setFormattingChanged(true)
+    }
+  })
+}
diff --git a/app/components/app/configuration/debug/index.tsx b/app/components/app/configuration/debug/index.tsx
new file mode 100644
index 0000000..477328d
--- /dev/null
+++ b/app/components/app/configuration/debug/index.tsx
@@ -0,0 +1,561 @@
+'use client'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import React, { useCallback, useEffect, useRef, useState } from 'react'
+import produce, { setAutoFreeze } from 'immer'
+import { useBoolean } from 'ahooks'
+import {
+  RiAddLine,
+  RiEqualizer2Line,
+  RiSparklingFill,
+} from '@remixicon/react'
+import { useContext } from 'use-context-selector'
+import { useShallow } from 'zustand/react/shallow'
+import HasNotSetAPIKEY from '../base/warning-mask/has-not-set-api'
+import FormattingChanged from '../base/warning-mask/formatting-changed'
+import GroupName from '../base/group-name'
+import CannotQueryDataset from '../base/warning-mask/cannot-query-dataset'
+import DebugWithMultipleModel from './debug-with-multiple-model'
+import DebugWithSingleModel from './debug-with-single-model'
+import type { DebugWithSingleModelRefType } from './debug-with-single-model'
+import type { ModelAndParameter } from './types'
+import {
+  APP_CHAT_WITH_MULTIPLE_MODEL,
+  APP_CHAT_WITH_MULTIPLE_MODEL_RESTART,
+} from './types'
+import { AppType, ModelModeType, TransferMethod } from '@/types/app'
+import ChatUserInput from '@/app/components/app/configuration/debug/chat-user-input'
+import PromptValuePanel from '@/app/components/app/configuration/prompt-value-panel'
+import ConfigContext from '@/context/debug-configuration'
+import { ToastContext } from '@/app/components/base/toast'
+import { sendCompletionMessage } from '@/service/debug'
+import Button from '@/app/components/base/button'
+import { RefreshCcw01 } from '@/app/components/base/icons/src/vender/line/arrows'
+import TooltipPlus from '@/app/components/base/tooltip'
+import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
+import type { ModelConfig as BackendModelConfig, VisionFile, VisionSettings } from '@/types/app'
+import { promptVariablesToUserInputsForm } from '@/utils/model-config'
+import TextGeneration from '@/app/components/app/text-generate/item'
+import { IS_CE_EDITION } from '@/config'
+import type { Inputs } from '@/models/debug'
+import { useDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelFeatureEnum, ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import type { ModelParameterModalProps } from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { useProviderContext } from '@/context/provider-context'
+import AgentLogModal from '@/app/components/base/agent-log-modal'
+import PromptLogModal from '@/app/components/base/prompt-log-modal'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import { noop } from 'lodash-es'
+
+type IDebug = {
+  isAPIKeySet: boolean
+  onSetting: () => void
+  inputs: Inputs
+  modelParameterParams: Pick<ModelParameterModalProps, 'setModel' | 'onCompletionParamsChange'>
+  debugWithMultipleModel: boolean
+  multipleModelConfigs: ModelAndParameter[]
+  onMultipleModelConfigsChange: (multiple: boolean, modelConfigs: ModelAndParameter[]) => void
+}
+
+const Debug: FC<IDebug> = ({
+  isAPIKeySet = true,
+  onSetting,
+  inputs,
+  modelParameterParams,
+  debugWithMultipleModel,
+  multipleModelConfigs,
+  onMultipleModelConfigsChange,
+}) => {
+  const { t } = useTranslation()
+  const {
+    appId,
+    mode,
+    modelModeType,
+    hasSetBlockStatus,
+    isAdvancedMode,
+    promptMode,
+    chatPromptConfig,
+    completionPromptConfig,
+    introduction,
+    suggestedQuestionsAfterAnswerConfig,
+    speechToTextConfig,
+    textToSpeechConfig,
+    citationConfig,
+    formattingChanged,
+    setFormattingChanged,
+    dataSets,
+    modelConfig,
+    completionParams,
+    hasSetContextVar,
+    datasetConfigs,
+  } = useContext(ConfigContext)
+  const { eventEmitter } = useEventEmitterContextContext()
+  const { data: text2speechDefaultModel } = useDefaultModel(ModelTypeEnum.textEmbedding)
+  useEffect(() => {
+    setAutoFreeze(false)
+    return () => {
+      setAutoFreeze(true)
+    }
+  }, [])
+
+  const [isResponding, { setTrue: setRespondingTrue, setFalse: setRespondingFalse }] = useBoolean(false)
+  const [isShowFormattingChangeConfirm, setIsShowFormattingChangeConfirm] = useState(false)
+  const [isShowCannotQueryDataset, setShowCannotQueryDataset] = useState(false)
+
+  useEffect(() => {
+    if (formattingChanged)
+      setIsShowFormattingChangeConfirm(true)
+  }, [formattingChanged])
+
+  const debugWithSingleModelRef = React.useRef<DebugWithSingleModelRefType | null>(null)
+  const handleClearConversation = () => {
+    debugWithSingleModelRef.current?.handleRestart()
+  }
+  const clearConversation = async () => {
+    if (debugWithMultipleModel) {
+      eventEmitter?.emit({
+        type: APP_CHAT_WITH_MULTIPLE_MODEL_RESTART,
+      } as any)
+      return
+    }
+
+    handleClearConversation()
+  }
+
+  const handleConfirm = () => {
+    clearConversation()
+    setIsShowFormattingChangeConfirm(false)
+    setFormattingChanged(false)
+  }
+
+  const handleCancel = () => {
+    setIsShowFormattingChangeConfirm(false)
+    setFormattingChanged(false)
+  }
+
+  const { notify } = useContext(ToastContext)
+  const logError = useCallback((message: string) => {
+    notify({ type: 'error', message })
+  }, [notify])
+  const [completionFiles, setCompletionFiles] = useState<VisionFile[]>([])
+
+  const checkCanSend = useCallback(() => {
+    if (isAdvancedMode && mode !== AppType.completion) {
+      if (modelModeType === ModelModeType.completion) {
+        if (!hasSetBlockStatus.history) {
+          notify({ type: 'error', message: t('appDebug.otherError.historyNoBeEmpty') })
+          return false
+        }
+        if (!hasSetBlockStatus.query) {
+          notify({ type: 'error', message: t('appDebug.otherError.queryNoBeEmpty') })
+          return false
+        }
+      }
+    }
+    let hasEmptyInput = ''
+    const requiredVars = modelConfig.configs.prompt_variables.filter(({ key, name, required, type }) => {
+      if (type !== 'string' && type !== 'paragraph' && type !== 'select')
+        return false
+      const res = (!key || !key.trim()) || (!name || !name.trim()) || (required || required === undefined || required === null)
+      return res
+    }) // compatible with old version
+    // debugger
+    requiredVars.forEach(({ key, name }) => {
+      if (hasEmptyInput)
+        return
+
+      if (!inputs[key])
+        hasEmptyInput = name
+    })
+
+    if (hasEmptyInput) {
+      logError(t('appDebug.errorMessage.valueOfVarRequired', { key: hasEmptyInput }))
+      return false
+    }
+
+    if (completionFiles.find(item => item.transfer_method === TransferMethod.local_file && !item.upload_file_id)) {
+      notify({ type: 'info', message: t('appDebug.errorMessage.waitForFileUpload') })
+      return false
+    }
+    return !hasEmptyInput
+  }, [
+    completionFiles,
+    hasSetBlockStatus.history,
+    hasSetBlockStatus.query,
+    inputs,
+    isAdvancedMode,
+    mode,
+    modelConfig.configs.prompt_variables,
+    t,
+    logError,
+    notify,
+    modelModeType,
+  ])
+
+  const [completionRes, setCompletionRes] = useState('')
+  const [messageId, setMessageId] = useState<string | null>(null)
+  const features = useFeatures(s => s.features)
+  const featuresStore = useFeaturesStore()
+
+  const sendTextCompletion = async () => {
+    if (isResponding) {
+      notify({ type: 'info', message: t('appDebug.errorMessage.waitForResponse') })
+      return false
+    }
+
+    if (dataSets.length > 0 && !hasSetContextVar) {
+      setShowCannotQueryDataset(true)
+      return true
+    }
+
+    if (!checkCanSend())
+      return
+
+    const postDatasets = dataSets.map(({ id }) => ({
+      dataset: {
+        enabled: true,
+        id,
+      },
+    }))
+    const contextVar = modelConfig.configs.prompt_variables.find(item => item.is_context_var)?.key
+
+    const postModelConfig: BackendModelConfig = {
+      pre_prompt: !isAdvancedMode ? modelConfig.configs.prompt_template : '',
+      prompt_type: promptMode,
+      chat_prompt_config: {},
+      completion_prompt_config: {},
+      user_input_form: promptVariablesToUserInputsForm(modelConfig.configs.prompt_variables),
+      dataset_query_variable: contextVar || '',
+      dataset_configs: {
+        ...datasetConfigs,
+        datasets: {
+          datasets: [...postDatasets],
+        } as any,
+      },
+      agent_mode: {
+        enabled: false,
+        tools: [],
+      },
+      model: {
+        provider: modelConfig.provider,
+        name: modelConfig.model_id,
+        mode: modelConfig.mode,
+        completion_params: completionParams as any,
+      },
+      more_like_this: features.moreLikeThis as any,
+      sensitive_word_avoidance: features.moderation as any,
+      text_to_speech: features.text2speech as any,
+      file_upload: features.file as any,
+      opening_statement: introduction,
+      suggested_questions_after_answer: suggestedQuestionsAfterAnswerConfig,
+      speech_to_text: speechToTextConfig,
+      retriever_resource: citationConfig,
+    }
+
+    if (isAdvancedMode) {
+      postModelConfig.chat_prompt_config = chatPromptConfig
+      postModelConfig.completion_prompt_config = completionPromptConfig
+    }
+
+    const data: Record<string, any> = {
+      inputs,
+      model_config: postModelConfig,
+    }
+
+    if ((features.file as any).enabled && completionFiles && completionFiles?.length > 0) {
+      data.files = completionFiles.map((item) => {
+        if (item.transfer_method === TransferMethod.local_file) {
+          return {
+            ...item,
+            url: '',
+          }
+        }
+        return item
+      })
+    }
+
+    setCompletionRes('')
+    setMessageId('')
+    let res: string[] = []
+
+    setRespondingTrue()
+    sendCompletionMessage(appId, data, {
+      onData: (data: string, _isFirstMessage: boolean, { messageId }) => {
+        res.push(data)
+        setCompletionRes(res.join(''))
+        setMessageId(messageId)
+      },
+      onMessageReplace: (messageReplace) => {
+        res = [messageReplace.answer]
+        setCompletionRes(res.join(''))
+      },
+      onCompleted() {
+        setRespondingFalse()
+      },
+      onError() {
+        setRespondingFalse()
+      },
+    })
+  }
+
+  const handleSendTextCompletion = () => {
+    if (debugWithMultipleModel) {
+      eventEmitter?.emit({
+        type: APP_CHAT_WITH_MULTIPLE_MODEL,
+        payload: {
+          message: '',
+          files: completionFiles,
+        },
+      } as any)
+      return
+    }
+
+    sendTextCompletion()
+  }
+
+  const varList = modelConfig.configs.prompt_variables.map((item: any) => {
+    return {
+      label: item.key,
+      value: inputs[item.key],
+    }
+  })
+
+  const { textGenerationModelList } = useProviderContext()
+  const handleChangeToSingleModel = (item: ModelAndParameter) => {
+    const currentProvider = textGenerationModelList.find(modelItem => modelItem.provider === item.provider)
+    const currentModel = currentProvider?.models.find(model => model.model === item.model)
+
+    modelParameterParams.setModel({
+      modelId: item.model,
+      provider: item.provider,
+      mode: currentModel?.model_properties.mode as string,
+      features: currentModel?.features,
+    })
+    modelParameterParams.onCompletionParamsChange(item.parameters)
+    onMultipleModelConfigsChange(
+      false,
+      [],
+    )
+  }
+
+  const handleVisionConfigInMultipleModel = useCallback(() => {
+    if (debugWithMultipleModel && mode) {
+      const supportedVision = multipleModelConfigs.some((modelConfig) => {
+        const currentProvider = textGenerationModelList.find(modelItem => modelItem.provider === modelConfig.provider)
+        const currentModel = currentProvider?.models.find(model => model.model === modelConfig.model)
+
+        return currentModel?.features?.includes(ModelFeatureEnum.vision)
+      })
+      const {
+        features,
+        setFeatures,
+      } = featuresStore!.getState()
+
+      const newFeatures = produce(features, (draft) => {
+        draft.file = {
+          ...draft.file,
+          enabled: supportedVision,
+        }
+      })
+      setFeatures(newFeatures)
+    }
+  }, [debugWithMultipleModel, featuresStore, mode, multipleModelConfigs, textGenerationModelList])
+
+  useEffect(() => {
+    handleVisionConfigInMultipleModel()
+  }, [multipleModelConfigs, mode, handleVisionConfigInMultipleModel])
+
+  const { currentLogItem, setCurrentLogItem, showPromptLogModal, setShowPromptLogModal, showAgentLogModal, setShowAgentLogModal } = useAppStore(useShallow(state => ({
+    currentLogItem: state.currentLogItem,
+    setCurrentLogItem: state.setCurrentLogItem,
+    showPromptLogModal: state.showPromptLogModal,
+    setShowPromptLogModal: state.setShowPromptLogModal,
+    showAgentLogModal: state.showAgentLogModal,
+    setShowAgentLogModal: state.setShowAgentLogModal,
+  })))
+  const [width, setWidth] = useState(0)
+  const ref = useRef<HTMLDivElement>(null)
+
+  const adjustModalWidth = () => {
+    if (ref.current)
+      setWidth(document.body.clientWidth - (ref.current?.clientWidth + 16) - 8)
+  }
+
+  useEffect(() => {
+    adjustModalWidth()
+  }, [])
+
+  const [expanded, setExpanded] = useState(true)
+
+  return (
+    <>
+      <div className="shrink-0">
+        <div className='flex items-center justify-between px-4 pb-2 pt-3'>
+          <div className='system-xl-semibold text-text-primary'>{t('appDebug.inputs.title')}</div>
+          <div className='flex items-center'>
+            {
+              debugWithMultipleModel
+                ? (
+                  <>
+                    <Button
+                      variant='ghost-accent'
+                      onClick={() => onMultipleModelConfigsChange(true, [...multipleModelConfigs, { id: `${Date.now()}`, model: '', provider: '', parameters: {} }])}
+                      disabled={multipleModelConfigs.length >= 4}
+                    >
+                      <RiAddLine className='mr-1 h-3.5 w-3.5' />
+                      {t('common.modelProvider.addModel')}({multipleModelConfigs.length}/4)
+                    </Button>
+                    <div className='mx-2 h-[14px] w-[1px] bg-divider-regular' />
+                  </>
+                )
+                : null
+            }
+            {mode !== AppType.completion && (
+              <>
+                <TooltipPlus
+                  popupContent={t('common.operation.refresh')}
+                >
+                  <ActionButton onClick={clearConversation}>
+                    <RefreshCcw01 className='h-4 w-4' />
+                  </ActionButton>
+                </TooltipPlus>
+                {varList.length > 0 && (
+                  <div className='relative ml-1 mr-2'>
+                    <TooltipPlus
+                      popupContent={t('workflow.panel.userInputField')}
+                    >
+                      <ActionButton state={expanded ? ActionButtonState.Active : undefined} onClick={() => setExpanded(!expanded)}>
+                        <RiEqualizer2Line className='h-4 w-4' />
+                      </ActionButton>
+                    </TooltipPlus>
+                    {expanded && <div className='absolute bottom-[-14px] right-[5px] z-10 h-3 w-3 rotate-45 border-l-[0.5px] border-t-[0.5px] border-components-panel-border-subtle bg-components-panel-on-panel-item-bg' />}
+                  </div>
+                )}
+              </>
+            )}
+          </div>
+        </div>
+        {mode !== AppType.completion && expanded && (
+          <div className='mx-3'>
+            <ChatUserInput inputs={inputs} />
+          </div>
+        )}
+        {mode === AppType.completion && (
+          <PromptValuePanel
+            appType={mode as AppType}
+            onSend={handleSendTextCompletion}
+            inputs={inputs}
+            visionConfig={{
+              ...features.file! as VisionSettings,
+              transfer_methods: features.file!.allowed_file_upload_methods || [],
+              image_file_size_limit: features.file?.fileUploadConfig?.image_file_size_limit,
+            }}
+            onVisionFilesChange={setCompletionFiles}
+          />
+        )}
+      </div>
+      {
+        debugWithMultipleModel && (
+          <div className='mt-3 grow overflow-hidden' ref={ref}>
+            <DebugWithMultipleModel
+              multipleModelConfigs={multipleModelConfigs}
+              onMultipleModelConfigsChange={onMultipleModelConfigsChange}
+              onDebugWithMultipleModelChange={handleChangeToSingleModel}
+              checkCanSend={checkCanSend}
+            />
+            {showPromptLogModal && (
+              <PromptLogModal
+                width={width}
+                currentLogItem={currentLogItem}
+                onCancel={() => {
+                  setCurrentLogItem()
+                  setShowPromptLogModal(false)
+                }}
+              />
+            )}
+            {showAgentLogModal && (
+              <AgentLogModal
+                width={width}
+                currentLogItem={currentLogItem}
+                onCancel={() => {
+                  setCurrentLogItem()
+                  setShowAgentLogModal(false)
+                }}
+              />
+            )}
+          </div>
+        )
+      }
+      {
+        !debugWithMultipleModel && (
+          <div className="flex grow flex-col" ref={ref}>
+            {/* Chat */}
+            {mode !== AppType.completion && (
+              <div className='h-0 grow overflow-hidden'>
+                <DebugWithSingleModel
+                  ref={debugWithSingleModelRef}
+                  checkCanSend={checkCanSend}
+                />
+              </div>
+            )}
+            {/* Text  Generation */}
+            {mode === AppType.completion && (
+              <>
+                {(completionRes || isResponding) && (
+                  <>
+                    <div className='mx-4 mt-3'><GroupName name={t('appDebug.result')} /></div>
+                    <div className='mx-3 mb-8'>
+                      <TextGeneration
+                        className="mt-2"
+                        content={completionRes}
+                        isLoading={!completionRes && isResponding}
+                        isShowTextToSpeech={textToSpeechConfig.enabled && !!text2speechDefaultModel}
+                        isResponding={isResponding}
+                        isInstalledApp={false}
+                        messageId={messageId}
+                        isError={false}
+                        onRetry={noop}
+                        siteInfo={null}
+                      />
+                    </div>
+                  </>
+                )}
+                {!completionRes && !isResponding && (
+                  <div className='flex grow flex-col items-center justify-center gap-2'>
+                    <RiSparklingFill className='h-12 w-12 text-text-empty-state-icon' />
+                    <div className='system-sm-regular text-text-quaternary'>{t('appDebug.noResult')}</div>
+                  </div>
+                )}
+              </>
+            )}
+            {mode === AppType.completion && showPromptLogModal && (
+              <PromptLogModal
+                width={width}
+                currentLogItem={currentLogItem}
+                onCancel={() => {
+                  setCurrentLogItem()
+                  setShowPromptLogModal(false)
+                }}
+              />
+            )}
+            {isShowCannotQueryDataset && (
+              <CannotQueryDataset
+                onConfirm={() => setShowCannotQueryDataset(false)}
+              />
+            )}
+          </div>
+        )
+      }
+      {isShowFormattingChangeConfirm && (
+        <FormattingChanged
+          onConfirm={handleConfirm}
+          onCancel={handleCancel}
+        />
+      )}
+      {!isAPIKeySet && (<HasNotSetAPIKEY isTrailFinished={!IS_CE_EDITION} onSetting={onSetting} />)}
+    </>
+  )
+}
+export default React.memo(Debug)
diff --git a/app/components/app/configuration/debug/types.ts b/app/components/app/configuration/debug/types.ts
new file mode 100644
index 0000000..ada665a
--- /dev/null
+++ b/app/components/app/configuration/debug/types.ts
@@ -0,0 +1,18 @@
+export type ModelAndParameter = {
+  id: string
+  model: string
+  provider: string
+  parameters: Record<string, any>
+}
+
+export type MultipleAndConfigs = {
+  multiple: boolean
+  configs: ModelAndParameter[]
+}
+
+export type DebugWithSingleOrMultipleModelConfigs = {
+  [k: string]: MultipleAndConfigs
+}
+export const APP_CHAT_WITH_MULTIPLE_MODEL = 'APP_CHAT_WITH_MULTIPLE_MODEL'
+export const APP_CHAT_WITH_MULTIPLE_MODEL_RESTART = 'APP_CHAT_WITH_MULTIPLE_MODEL_RESTART'
+export const ORCHESTRATE_CHANGED = 'ORCHESTRATE_CHANGED'
diff --git a/app/components/app/configuration/features/experience-enhance-group/index.tsx b/app/components/app/configuration/features/experience-enhance-group/index.tsx
new file mode 100644
index 0000000..4a629a6
--- /dev/null
+++ b/app/components/app/configuration/features/experience-enhance-group/index.tsx
@@ -0,0 +1,43 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import GroupName from '../../base/group-name'
+import TextToSpeech from '../chat-group/text-to-speech'
+import MoreLikeThis from './more-like-this'
+
+/*
+* Include
+* 1. More like this
+*/
+
+type ExperienceGroupProps = {
+  isShowTextToSpeech: boolean
+  isShowMoreLike: boolean
+}
+
+const ExperienceEnhanceGroup: FC<ExperienceGroupProps> = ({
+  isShowTextToSpeech,
+  isShowMoreLike,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='mt-7'>
+      <GroupName name={t('appDebug.feature.groupExperience.title')}/>
+      <div className='space-y-3'>
+        {
+          isShowMoreLike && (
+            <MoreLikeThis/>
+          )
+        }
+        {
+          isShowTextToSpeech && (
+            <TextToSpeech/>
+          )
+        }
+      </div>
+    </div>
+  )
+}
+export default React.memo(ExperienceEnhanceGroup)
diff --git a/app/components/app/configuration/features/experience-enhance-group/more-like-this/index.tsx b/app/components/app/configuration/features/experience-enhance-group/more-like-this/index.tsx
new file mode 100644
index 0000000..e110d0c
--- /dev/null
+++ b/app/components/app/configuration/features/experience-enhance-group/more-like-this/index.tsx
@@ -0,0 +1,51 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { XMarkIcon } from '@heroicons/react/24/outline'
+import { useLocalStorageState } from 'ahooks'
+import MoreLikeThisIcon from '../../../base/icons/more-like-this-icon'
+import Panel from '@/app/components/app/configuration/base/feature-panel'
+
+const GENERATE_NUM = 1
+
+const warningIcon = (
+  <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path fillRule="evenodd" clipRule="evenodd" d="M6.40616 0.834307C6.14751 0.719294 5.85222 0.719294 5.59356 0.834307C5.3938 0.923133 5.26403 1.07959 5.17373 1.20708C5.08495 1.33242 4.9899 1.49664 4.88536 1.67723L0.751783 8.81705C0.646828 8.9983 0.551451 9.16302 0.486781 9.3028C0.421056 9.44487 0.349754 9.63584 0.372478 9.85381C0.401884 10.1359 0.549654 10.3922 0.779012 10.5589C0.956259 10.6878 1.15726 10.7218 1.31314 10.7361C1.46651 10.7501 1.65684 10.7501 1.86628 10.7501H10.1334C10.3429 10.7501 10.5332 10.7501 10.6866 10.7361C10.8425 10.7218 11.0435 10.6878 11.2207 10.5589C11.4501 10.3922 11.5978 10.1359 11.6272 9.85381C11.65 9.63584 11.5787 9.44487 11.5129 9.3028C11.4483 9.16303 11.3529 8.99833 11.248 8.81709L7.11436 1.67722C7.00983 1.49663 6.91477 1.33242 6.82599 1.20708C6.73569 1.07959 6.60593 0.923133 6.40616 0.834307ZM6.49988 4.50012C6.49988 4.22398 6.27602 4.00012 5.99988 4.00012C5.72374 4.00012 5.49988 4.22398 5.49988 4.50012V6.50012C5.49988 6.77626 5.72374 7.00012 5.99988 7.00012C6.27602 7.00012 6.49988 6.77626 6.49988 6.50012V4.50012ZM5.99988 8.00012C5.72374 8.00012 5.49988 8.22398 5.49988 8.50012C5.49988 8.77626 5.72374 9.00012 5.99988 9.00012H6.00488C6.28102 9.00012 6.50488 8.77626 6.50488 8.50012C6.50488 8.22398 6.28102 8.00012 6.00488 8.00012H5.99988Z" fill="#F79009" />
+  </svg>
+
+)
+const MoreLikeThis: FC = () => {
+  const { t } = useTranslation()
+
+  const [isHideTip, setIsHideTip] = useLocalStorageState('isHideMoreLikeThisTip', {
+    defaultValue: false,
+  })
+
+  const headerRight = (
+    <div className='text-xs text-gray-500'>{t('appDebug.feature.moreLikeThis.generateNumTip')} {GENERATE_NUM}</div>
+  )
+  return (
+    <Panel
+      className='mt-4'
+      title={t('appDebug.feature.moreLikeThis.title')}
+      headerIcon={<MoreLikeThisIcon />}
+      headerRight={headerRight}
+      noBodySpacing
+    >
+      {!isHideTip && (
+        <div className='flex h-9 items-center justify-between rounded-b-xl bg-[#FFFAEB] px-3 text-xs text-gray-700'>
+          <div className='flex  items-center space-x-2'>
+            <div>{warningIcon}</div>
+            <div>{t('appDebug.feature.moreLikeThis.tip')}</div>
+          </div>
+          <div className='flex h-4 w-4 cursor-pointer items-center justify-center' onClick={() => setIsHideTip(true)}>
+            <XMarkIcon className="h-3 w-3" />
+          </div>
+        </div>
+      )}
+
+    </Panel>
+  )
+}
+export default React.memo(MoreLikeThis)
diff --git a/app/components/app/configuration/hooks/use-advanced-prompt-config.ts b/app/components/app/configuration/hooks/use-advanced-prompt-config.ts
new file mode 100644
index 0000000..193ac87
--- /dev/null
+++ b/app/components/app/configuration/hooks/use-advanced-prompt-config.ts
@@ -0,0 +1,194 @@
+import { useState } from 'react'
+import { clone } from 'lodash-es'
+import produce from 'immer'
+import type { ChatPromptConfig, CompletionPromptConfig, ConversationHistoriesRole, PromptItem } from '@/models/debug'
+import { PromptMode } from '@/models/debug'
+import { ModelModeType } from '@/types/app'
+import { DEFAULT_CHAT_PROMPT_CONFIG, DEFAULT_COMPLETION_PROMPT_CONFIG } from '@/config'
+import { PRE_PROMPT_PLACEHOLDER_TEXT, checkHasContextBlock, checkHasHistoryBlock, checkHasQueryBlock } from '@/app/components/base/prompt-editor/constants'
+import { fetchPromptTemplate } from '@/service/debug'
+import type { FormValue } from '@/app/components/header/account-setting/model-provider-page/declarations'
+
+type Param = {
+  appMode: string
+  modelModeType: ModelModeType
+  modelName: string
+  promptMode: PromptMode
+  prePrompt: string
+  onUserChangedPrompt: () => void
+  hasSetDataSet: boolean
+  completionParams: FormValue
+  setCompletionParams: (params: FormValue) => void
+  setStop: (stop: string[]) => void
+}
+
+const useAdvancedPromptConfig = ({
+  appMode,
+  modelModeType,
+  modelName,
+  promptMode,
+  prePrompt,
+  onUserChangedPrompt,
+  hasSetDataSet,
+  completionParams,
+  setCompletionParams,
+  setStop,
+}: Param) => {
+  const isAdvancedPrompt = promptMode === PromptMode.advanced
+  const [chatPromptConfig, setChatPromptConfig] = useState<ChatPromptConfig>(clone(DEFAULT_CHAT_PROMPT_CONFIG))
+  const [completionPromptConfig, setCompletionPromptConfig] = useState<CompletionPromptConfig>(clone(DEFAULT_COMPLETION_PROMPT_CONFIG))
+
+  const currentAdvancedPrompt = (() => {
+    if (!isAdvancedPrompt)
+      return []
+
+    return (modelModeType === ModelModeType.chat) ? chatPromptConfig.prompt : completionPromptConfig.prompt
+  })()
+
+  const setCurrentAdvancedPrompt = (prompt: PromptItem | PromptItem[], isUserChanged?: boolean) => {
+    if (!isAdvancedPrompt)
+      return
+
+    if (modelModeType === ModelModeType.chat) {
+      setChatPromptConfig({
+        ...chatPromptConfig,
+        prompt: prompt as PromptItem[],
+      })
+    }
+    else {
+      setCompletionPromptConfig({
+        ...completionPromptConfig,
+        prompt: prompt as PromptItem,
+      })
+    }
+    if (isUserChanged)
+      onUserChangedPrompt()
+  }
+
+  const setConversationHistoriesRole = (conversationHistoriesRole: ConversationHistoriesRole) => {
+    setCompletionPromptConfig({
+      ...completionPromptConfig,
+      conversation_histories_role: conversationHistoriesRole,
+    })
+  }
+
+  const hasSetBlockStatus = (() => {
+    if (!isAdvancedPrompt) {
+      return {
+        context: checkHasContextBlock(prePrompt),
+        history: false,
+        query: false,
+      }
+    }
+    if (modelModeType === ModelModeType.chat) {
+      return {
+        context: !!chatPromptConfig.prompt.find(p => checkHasContextBlock(p.text)),
+        history: false,
+        query: !!chatPromptConfig.prompt.find(p => checkHasQueryBlock(p.text)),
+      }
+    }
+    else {
+      const prompt = completionPromptConfig.prompt?.text
+      return {
+        context: checkHasContextBlock(prompt),
+        history: checkHasHistoryBlock(prompt),
+        query: checkHasQueryBlock(prompt),
+      }
+    }
+  })()
+
+  /* prompt: simple to advanced process, or chat model to completion model
+  * 1. migrate prompt
+  * 2. change promptMode to advanced
+  */
+  const migrateToDefaultPrompt = async (isMigrateToCompetition?: boolean, toModelModeType?: ModelModeType) => {
+    const mode = modelModeType
+    const toReplacePrePrompt = prePrompt || ''
+    if (!isAdvancedPrompt) {
+      const { chat_prompt_config, completion_prompt_config, stop } = await fetchPromptTemplate({
+        appMode,
+        mode,
+        modelName,
+        hasSetDataSet,
+      })
+      if (modelModeType === ModelModeType.chat) {
+        const newPromptConfig = produce(chat_prompt_config, (draft) => {
+          draft.prompt = draft.prompt.map((p) => {
+            return {
+              ...p,
+              text: p.text.replace(PRE_PROMPT_PLACEHOLDER_TEXT, toReplacePrePrompt),
+            }
+          })
+        })
+        setChatPromptConfig(newPromptConfig)
+      }
+
+      else {
+        const newPromptConfig = produce(completion_prompt_config, (draft) => {
+          draft.prompt.text = draft.prompt.text.replace(PRE_PROMPT_PLACEHOLDER_TEXT, toReplacePrePrompt)
+        })
+        setCompletionPromptConfig(newPromptConfig)
+        setCompletionParams({
+          ...completionParams,
+          stop,
+        })
+      }
+      return
+    }
+
+    if (isMigrateToCompetition) {
+      const { completion_prompt_config, chat_prompt_config, stop } = await fetchPromptTemplate({
+        appMode,
+        mode: toModelModeType as ModelModeType,
+        modelName,
+        hasSetDataSet,
+      })
+
+      if (toModelModeType === ModelModeType.completion) {
+        const newPromptConfig = produce(completion_prompt_config, (draft) => {
+          if (!completionPromptConfig.prompt?.text)
+            draft.prompt.text = draft.prompt.text.replace(PRE_PROMPT_PLACEHOLDER_TEXT, toReplacePrePrompt)
+
+          else
+            draft.prompt.text = completionPromptConfig.prompt?.text.replace(PRE_PROMPT_PLACEHOLDER_TEXT, toReplacePrePrompt)
+
+          if (['advanced-chat', 'agent-chat', 'chat'].includes(appMode) && completionPromptConfig.conversation_histories_role.assistant_prefix && completionPromptConfig.conversation_histories_role.user_prefix)
+            draft.conversation_histories_role = completionPromptConfig.conversation_histories_role
+        })
+        setCompletionPromptConfig(newPromptConfig)
+        if (!completionParams.stop || completionParams.stop.length === 0) {
+          setCompletionParams({
+            ...completionParams,
+            stop,
+          })
+        }
+        setStop(stop) // switch mode's params is async. It may override the stop value.
+      }
+      else {
+        const newPromptConfig = produce(chat_prompt_config, (draft) => {
+          draft.prompt = draft.prompt.map((p) => {
+            return {
+              ...p,
+              text: p.text.replace(PRE_PROMPT_PLACEHOLDER_TEXT, toReplacePrePrompt),
+            }
+          })
+        })
+        setChatPromptConfig(newPromptConfig)
+      }
+    }
+  }
+
+  return {
+    chatPromptConfig,
+    setChatPromptConfig,
+    completionPromptConfig,
+    setCompletionPromptConfig,
+    currentAdvancedPrompt,
+    setCurrentAdvancedPrompt,
+    hasSetBlockStatus,
+    setConversationHistoriesRole,
+    migrateToDefaultPrompt,
+  }
+}
+
+export default useAdvancedPromptConfig
diff --git a/app/components/app/configuration/images/prompt.svg b/app/components/app/configuration/images/prompt.svg
new file mode 100644
index 0000000..88453d2
--- /dev/null
+++ b/app/components/app/configuration/images/prompt.svg
@@ -0,0 +1,19 @@
+<svg width="72" height="35" viewBox="0 0 72 35" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M17.0565 5.76794C18.2191 5.76794 19.1045 6.03461 19.7125 6.56794C20.3205 7.09061 20.6245 7.77328 20.6245 8.61594C20.6245 8.86128 20.6031 9.09061 20.5605 9.30394C20.4325 10.0506 20.1071 10.7173 19.5845 11.3039C19.0618 11.8906 18.3631 12.3066 17.4885 12.5519L19.2965 16.9999H16.2085L14.6245 12.7599H13.9685L13.2165 16.9999H10.4805L12.4645 5.76794H17.0565ZM17.7605 9.41594C17.7818 9.24528 17.7925 9.13328 17.7925 9.07994C17.7925 8.73861 17.6805 8.47728 17.4565 8.29594C17.2431 8.10394 16.9231 8.00794 16.4965 8.00794H14.8005L14.3045 10.8239H16.0005C16.5018 10.8239 16.8965 10.7013 17.1845 10.4559C17.4831 10.2106 17.6751 9.86394 17.7605 9.41594Z" fill="#1D2939"/>
+<path d="M10.0798 9.38394C9.97312 10.0346 9.72245 10.6319 9.32778 11.1759C8.93312 11.7093 8.39445 12.1413 7.71178 12.4719C7.03978 12.8026 6.24511 12.9679 5.32778 12.9679H3.63178L2.91178 16.9999H0.175781L2.15978 5.76794H6.59178C7.76511 5.76794 8.65045 6.02928 9.24778 6.55194C9.84512 7.06394 10.1438 7.76261 10.1438 8.64794C10.1438 8.91461 10.1224 9.15994 10.0798 9.38394ZM5.48778 10.8239C6.51178 10.8239 7.11445 10.3439 7.29578 9.38394C7.31711 9.21328 7.32778 9.09061 7.32778 9.01594C7.32778 8.67461 7.21578 8.41328 6.99178 8.23194C6.77845 8.03994 6.44778 7.94394 5.99978 7.94394H4.51178L4.01578 10.8239H5.48778Z" fill="#1D2939"/>
+<path d="M26.52 17.112C25.5706 17.112 24.7333 16.9147 24.008 16.52C23.2933 16.1254 22.7386 15.5707 22.344 14.856C21.9493 14.1414 21.752 13.32 21.752 12.392C21.752 11.08 22.0346 9.91203 22.6 8.88803C23.1653 7.85337 23.9493 7.04803 24.952 6.47203C25.9653 5.89603 27.112 5.60803 28.392 5.60803C29.352 5.60803 30.1946 5.80537 30.92 6.20003C31.6453 6.58403 32.2053 7.13336 32.6 7.84803C32.9946 8.55203 33.192 9.3627 33.192 10.28C33.192 11.592 32.9093 12.7707 32.344 13.816C31.7786 14.8507 30.9893 15.6614 29.976 16.248C28.9626 16.824 27.8106 17.112 26.52 17.112ZM26.936 14.584C27.64 14.584 28.2586 14.4027 28.792 14.04C29.3253 13.6774 29.736 13.192 30.024 12.584C30.3226 11.9654 30.472 11.2987 30.472 10.584C30.472 9.81603 30.2586 9.21337 29.832 8.77603C29.4053 8.3387 28.808 8.12003 28.04 8.12003C27.336 8.12003 26.712 8.30137 26.168 8.66403C25.6346 9.0267 25.2186 9.51203 24.92 10.12C24.632 10.7174 24.488 11.3787 24.488 12.104C24.488 12.872 24.7013 13.48 25.128 13.928C25.5546 14.3654 26.1573 14.584 26.936 14.584Z" fill="#1D2939"/>
+<path d="M69.5515 5.76794L69.1835 7.92794H66.1915L64.5915 16.9999H61.8555L63.4555 7.92794H60.4795L60.8635 5.76794H69.5515Z" fill="#1D2939"/>
+<path d="M59.0876 9.38394C58.9809 10.0346 58.7303 10.6319 58.3356 11.1759C57.9409 11.7093 57.4023 12.1413 56.7196 12.4719C56.0476 12.8026 55.2529 12.9679 54.3356 12.9679H52.6396L51.9196 16.9999H49.1836L51.1676 5.76794H55.5996C56.7729 5.76794 57.6583 6.02928 58.2556 6.55194C58.8529 7.06394 59.1516 7.76261 59.1516 8.64794C59.1516 8.91461 59.1303 9.15994 59.0876 9.38394ZM54.4956 10.8239C55.5196 10.8239 56.1223 10.3439 56.3036 9.38394C56.3249 9.21328 56.3356 9.09061 56.3356 9.01594C56.3356 8.67461 56.2236 8.41328 55.9996 8.23194C55.7863 8.03994 55.4556 7.94394 55.0076 7.94394H53.5196L53.0236 10.8239H54.4956Z" fill="#1D2939"/>
+<path d="M48.8798 5.76794L46.8958 16.9999H44.1598L45.3598 10.2639L41.6478 16.9999H39.4398L38.0958 10.2319L36.9118 16.9999H34.1758L36.1598 5.76794H39.3918L41.1838 13.5439L45.6638 5.76794H48.8798Z" fill="#1D2939"/>
+<path d="M67.6792 24.28C68.1912 24.28 68.6272 24.384 68.9872 24.592C69.3552 24.792 69.6192 25.044 69.7792 25.348L69.9472 24.388H71.3272L70.1512 31.108C70.0392 31.716 69.8152 32.256 69.4792 32.728C69.1432 33.208 68.7072 33.584 68.1712 33.856C67.6352 34.128 67.0312 34.264 66.3592 34.264C65.7752 34.264 65.2632 34.168 64.8232 33.976C64.3832 33.792 64.0512 33.524 63.8272 33.172C63.6032 32.82 63.5072 32.404 63.5392 31.924H64.8952C64.9352 32.268 65.1072 32.544 65.4112 32.752C65.7152 32.968 66.1032 33.076 66.5752 33.076C67.1272 33.076 67.6032 32.908 68.0032 32.572C68.4032 32.236 68.6592 31.748 68.7712 31.108L68.9632 30.004C68.6752 30.316 68.3152 30.58 67.8832 30.796C67.4512 31.004 66.9832 31.108 66.4792 31.108C65.9752 31.108 65.5272 30.996 65.1352 30.772C64.7432 30.548 64.4352 30.232 64.2112 29.824C63.9952 29.408 63.8872 28.932 63.8872 28.396C63.8872 28.156 63.9112 27.912 63.9592 27.664C64.0792 27 64.3192 26.412 64.6792 25.9C65.0472 25.388 65.4952 24.992 66.0232 24.712C66.5512 24.424 67.1032 24.28 67.6792 24.28ZM69.3712 27.688C69.4032 27.536 69.4192 27.372 69.4192 27.196C69.4192 26.66 69.2592 26.24 68.9392 25.936C68.6272 25.624 68.2352 25.468 67.7632 25.468C67.4112 25.468 67.0672 25.556 66.7312 25.732C66.3952 25.9 66.1032 26.152 65.8552 26.488C65.6072 26.816 65.4432 27.208 65.3632 27.664C65.3312 27.816 65.3152 27.98 65.3152 28.156C65.3152 28.7 65.4712 29.132 65.7832 29.452C66.1032 29.764 66.4992 29.92 66.9712 29.92C67.3232 29.92 67.6672 29.832 68.0032 29.656C68.3392 29.48 68.6312 29.224 68.8792 28.888C69.1272 28.544 69.2912 28.144 69.3712 27.688Z" fill="#667085"/>
+<path d="M60.5582 24.28C61.2542 24.28 61.8062 24.468 62.2142 24.844C62.6302 25.212 62.8382 25.744 62.8382 26.44C62.8382 26.616 62.8182 26.836 62.7782 27.1L62.0822 31H60.7262L61.3862 27.304C61.4182 27.08 61.4342 26.92 61.4342 26.824C61.4342 26.384 61.3102 26.048 61.0622 25.816C60.8222 25.584 60.4862 25.468 60.0542 25.468C59.5342 25.468 59.0942 25.628 58.7342 25.948C58.3822 26.26 58.1582 26.712 58.0622 27.304V27.268L57.4022 31H56.0342L57.1982 24.388H58.5662L58.4342 25.156C58.7062 24.884 59.0262 24.672 59.3942 24.52C59.7702 24.36 60.1582 24.28 60.5582 24.28Z" fill="#667085"/>
+<path d="M54.8861 23.512C54.6701 23.512 54.4941 23.444 54.3581 23.308C54.2221 23.172 54.1541 23 54.1541 22.792C54.1541 22.512 54.2581 22.272 54.4661 22.072C54.6821 21.864 54.9261 21.76 55.1981 21.76C55.4141 21.76 55.5861 21.828 55.7141 21.964C55.8501 22.1 55.9181 22.272 55.9181 22.48C55.9181 22.76 55.8141 23.004 55.6061 23.212C55.3981 23.412 55.1581 23.512 54.8861 23.512ZM55.4021 24.388L54.2381 31H52.8701L54.0341 24.388H55.4021Z" fill="#667085"/>
+<path d="M50.5926 25.552C50.8646 25.152 51.1846 24.84 51.5526 24.616C51.9286 24.392 52.3446 24.28 52.8006 24.28L52.5486 25.696H52.2006C51.6726 25.696 51.2486 25.828 50.9286 26.092C50.6086 26.356 50.3846 26.812 50.2566 27.46L49.6326 31H48.2646L49.4286 24.388H50.7966L50.5926 25.552Z" fill="#667085"/>
+<path d="M44.89 24.28C45.714 24.28 46.37 24.512 46.858 24.976C47.354 25.44 47.602 26.064 47.602 26.848C47.602 27.032 47.582 27.252 47.542 27.508C47.51 27.684 47.454 27.9 47.374 28.156H42.322C42.314 28.212 42.31 28.296 42.31 28.408C42.31 28.88 42.454 29.256 42.742 29.536C43.038 29.816 43.422 29.956 43.894 29.956C44.638 29.956 45.21 29.648 45.61 29.032H47.086C46.782 29.64 46.334 30.14 45.742 30.532C45.15 30.916 44.466 31.108 43.69 31.108C43.138 31.108 42.654 31 42.238 30.784C41.822 30.568 41.498 30.26 41.266 29.86C41.034 29.452 40.918 28.976 40.918 28.432C40.918 28.2 40.942 27.952 40.99 27.688C41.11 27.008 41.354 26.412 41.722 25.9C42.09 25.38 42.546 24.98 43.09 24.7C43.642 24.42 44.242 24.28 44.89 24.28ZM46.174 27.172C46.19 27.028 46.198 26.924 46.198 26.86C46.198 26.42 46.05 26.072 45.754 25.816C45.466 25.56 45.09 25.432 44.626 25.432C44.138 25.432 43.698 25.588 43.306 25.9C42.914 26.212 42.646 26.636 42.502 27.172H46.174Z" fill="#667085"/>
+<path d="M37.4837 24.28C38.3077 24.28 38.9637 24.512 39.4517 24.976C39.9477 25.44 40.1957 26.064 40.1957 26.848C40.1957 27.032 40.1757 27.252 40.1357 27.508C40.1037 27.684 40.0477 27.9 39.9677 28.156H34.9157C34.9077 28.212 34.9037 28.296 34.9037 28.408C34.9037 28.88 35.0477 29.256 35.3357 29.536C35.6317 29.816 36.0157 29.956 36.4877 29.956C37.2317 29.956 37.8037 29.648 38.2037 29.032H39.6797C39.3757 29.64 38.9277 30.14 38.3357 30.532C37.7437 30.916 37.0597 31.108 36.2837 31.108C35.7317 31.108 35.2477 31 34.8317 30.784C34.4157 30.568 34.0917 30.26 33.8597 29.86C33.6277 29.452 33.5117 28.976 33.5117 28.432C33.5117 28.2 33.5357 27.952 33.5837 27.688C33.7037 27.008 33.9477 26.412 34.3157 25.9C34.6837 25.38 35.1397 24.98 35.6837 24.7C36.2357 24.42 36.8357 24.28 37.4837 24.28ZM38.7677 27.172C38.7837 27.028 38.7917 26.924 38.7917 26.86C38.7917 26.42 38.6437 26.072 38.3477 25.816C38.0597 25.56 37.6837 25.432 37.2197 25.432C36.7317 25.432 36.2917 25.588 35.8997 25.9C35.5077 26.212 35.2397 26.636 35.0957 27.172H38.7677Z" fill="#667085"/>
+<path d="M30.1832 24.28C30.8792 24.28 31.4312 24.468 31.8392 24.844C32.2552 25.212 32.4632 25.744 32.4632 26.44C32.4632 26.616 32.4432 26.836 32.4032 27.1L31.7072 31H30.3512L31.0112 27.304C31.0432 27.08 31.0592 26.92 31.0592 26.824C31.0592 26.384 30.9352 26.048 30.6872 25.816C30.4472 25.584 30.1112 25.468 29.6792 25.468C29.1592 25.468 28.7192 25.628 28.3592 25.948C28.0072 26.26 27.7832 26.712 27.6872 27.304V27.268L27.0272 31H25.6592L26.8232 24.388H28.1912L28.0592 25.156C28.3312 24.884 28.6512 24.672 29.0192 24.52C29.3952 24.36 29.7832 24.28 30.1832 24.28Z" fill="#667085"/>
+<path d="M24.5111 23.512C24.2951 23.512 24.1191 23.444 23.9831 23.308C23.8471 23.172 23.7791 23 23.7791 22.792C23.7791 22.512 23.8831 22.272 24.0911 22.072C24.3071 21.864 24.5511 21.76 24.8231 21.76C25.0391 21.76 25.2111 21.828 25.3391 21.964C25.4751 22.1 25.5431 22.272 25.5431 22.48C25.5431 22.76 25.4391 23.004 25.2311 23.212C25.0231 23.412 24.7831 23.512 24.5111 23.512ZM25.0271 24.388L23.8631 31H22.4951L23.6591 24.388H25.0271Z" fill="#667085"/>
+<path d="M18.2144 24.28C18.7264 24.28 19.1624 24.384 19.5224 24.592C19.8904 24.792 20.1544 25.044 20.3144 25.348L20.4824 24.388H21.8624L20.6864 31.108C20.5744 31.716 20.3504 32.256 20.0144 32.728C19.6784 33.208 19.2424 33.584 18.7064 33.856C18.1704 34.128 17.5664 34.264 16.8944 34.264C16.3104 34.264 15.7984 34.168 15.3584 33.976C14.9184 33.792 14.5864 33.524 14.3624 33.172C14.1384 32.82 14.0424 32.404 14.0744 31.924H15.4304C15.4704 32.268 15.6424 32.544 15.9464 32.752C16.2504 32.968 16.6384 33.076 17.1104 33.076C17.6624 33.076 18.1384 32.908 18.5384 32.572C18.9384 32.236 19.1944 31.748 19.3064 31.108L19.4984 30.004C19.2104 30.316 18.8504 30.58 18.4184 30.796C17.9864 31.004 17.5184 31.108 17.0144 31.108C16.5104 31.108 16.0624 30.996 15.6704 30.772C15.2784 30.548 14.9704 30.232 14.7464 29.824C14.5304 29.408 14.4224 28.932 14.4224 28.396C14.4224 28.156 14.4464 27.912 14.4944 27.664C14.6144 27 14.8544 26.412 15.2144 25.9C15.5824 25.388 16.0304 24.992 16.5584 24.712C17.0864 24.424 17.6384 24.28 18.2144 24.28ZM19.9064 27.688C19.9384 27.536 19.9544 27.372 19.9544 27.196C19.9544 26.66 19.7944 26.24 19.4744 25.936C19.1624 25.624 18.7704 25.468 18.2984 25.468C17.9464 25.468 17.6024 25.556 17.2664 25.732C16.9304 25.9 16.6384 26.152 16.3904 26.488C16.1424 26.816 15.9784 27.208 15.8984 27.664C15.8664 27.816 15.8504 27.98 15.8504 28.156C15.8504 28.7 16.0064 29.132 16.3184 29.452C16.6384 29.764 17.0344 29.92 17.5064 29.92C17.8584 29.92 18.2024 29.832 18.5384 29.656C18.8744 29.48 19.1664 29.224 19.4144 28.888C19.6624 28.544 19.8264 28.144 19.9064 27.688Z" fill="#667085"/>
+<path d="M11.0933 24.28C11.7893 24.28 12.3413 24.468 12.7493 24.844C13.1653 25.212 13.3733 25.744 13.3733 26.44C13.3733 26.616 13.3533 26.836 13.3133 27.1L12.6173 31H11.2613L11.9213 27.304C11.9533 27.08 11.9693 26.92 11.9693 26.824C11.9693 26.384 11.8453 26.048 11.5973 25.816C11.3573 25.584 11.0213 25.468 10.5893 25.468C10.0693 25.468 9.62934 25.628 9.26934 25.948C8.91734 26.26 8.69334 26.712 8.59734 27.304V27.268L7.93734 31H6.56934L7.73334 24.388H9.10134L8.96934 25.156C9.24134 24.884 9.56134 24.672 9.92934 24.52C10.3053 24.36 10.6933 24.28 11.0933 24.28Z" fill="#667085"/>
+<path d="M2.92837 23.7159L2.48437 26.2479H5.36437L5.18437 27.3039H2.30437L1.83637 29.9319H5.07637L4.88437 30.9999H0.276367L1.75237 22.6479H6.36037L6.16837 23.7159H2.92837Z" fill="#667085"/>
+</svg>
diff --git a/app/components/app/configuration/index.tsx b/app/components/app/configuration/index.tsx
new file mode 100644
index 0000000..5b8f865
--- /dev/null
+++ b/app/components/app/configuration/index.tsx
@@ -0,0 +1,1068 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import useSWR from 'swr'
+import { basePath } from '@/utils/var'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { usePathname } from 'next/navigation'
+import produce from 'immer'
+import { useBoolean, useGetState } from 'ahooks'
+import { clone, isEqual } from 'lodash-es'
+import { CodeBracketIcon } from '@heroicons/react/20/solid'
+import { useShallow } from 'zustand/react/shallow'
+import AgentSettingButton from '@/app/components/app/configuration/config/agent-setting-button'
+import useAdvancedPromptConfig from '@/app/components/app/configuration/hooks/use-advanced-prompt-config'
+import EditHistoryModal from '@/app/components/app/configuration/config-prompt/conversation-history/edit-modal'
+import {
+  useDebugWithSingleOrMultipleModel,
+  useFormattingChangedDispatcher,
+} from '@/app/components/app/configuration/debug/hooks'
+import type { ModelAndParameter } from '@/app/components/app/configuration/debug/types'
+import Button from '@/app/components/base/button'
+import Divider from '@/app/components/base/divider'
+import Loading from '@/app/components/base/loading'
+import AppPublisher from '@/app/components/app/app-publisher/features-wrapper'
+import type {
+  AnnotationReplyConfig,
+  DatasetConfigs,
+  Inputs,
+  ModelConfig,
+  ModerationConfig,
+  MoreLikeThisConfig,
+  PromptConfig,
+  PromptVariable,
+  TextToSpeechConfig,
+} from '@/models/debug'
+import type { ExternalDataTool } from '@/models/common'
+import type { DataSet } from '@/models/datasets'
+import type { ModelConfig as BackendModelConfig, VisionSettings } from '@/types/app'
+import ConfigContext from '@/context/debug-configuration'
+import Config from '@/app/components/app/configuration/config'
+import Debug from '@/app/components/app/configuration/debug'
+import Confirm from '@/app/components/base/confirm'
+import { ModelFeatureEnum, ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { ToastContext } from '@/app/components/base/toast'
+import { fetchAppDetail, updateAppModelConfig } from '@/service/apps'
+import { promptVariablesToUserInputsForm, userInputsFormToPromptVariables } from '@/utils/model-config'
+import { fetchDatasets } from '@/service/datasets'
+import { useProviderContext } from '@/context/provider-context'
+import { AgentStrategy, AppType, ModelModeType, RETRIEVE_TYPE, Resolution, TransferMethod } from '@/types/app'
+import { PromptMode } from '@/models/debug'
+import { ANNOTATION_DEFAULT, DATASET_DEFAULT, DEFAULT_AGENT_SETTING, DEFAULT_CHAT_PROMPT_CONFIG, DEFAULT_COMPLETION_PROMPT_CONFIG } from '@/config'
+import SelectDataSet from '@/app/components/app/configuration/dataset-config/select-dataset'
+import { useModalContext } from '@/context/modal-context'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import Drawer from '@/app/components/base/drawer'
+import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal'
+import type { FormValue } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import {
+  useModelListAndDefaultModelAndCurrentProviderAndModel,
+  useTextGenerationCurrentProviderAndModelAndModelList,
+} from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { fetchCollectionList } from '@/service/tools'
+import type { Collection } from '@/app/components/tools/types'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import {
+  getMultipleRetrievalConfig,
+  getSelectedDatasetsMode,
+} from '@/app/components/workflow/nodes/knowledge-retrieval/utils'
+import { FeaturesProvider } from '@/app/components/base/features'
+import type { Features as FeaturesData, FileUpload } from '@/app/components/base/features/types'
+import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'
+import { SupportUploadFileTypes } from '@/app/components/workflow/types'
+import NewFeaturePanel from '@/app/components/base/features/new-feature-panel'
+import { fetchFileUploadConfig } from '@/service/common'
+import {
+  correctModelProvider,
+  correctToolProvider,
+} from '@/utils'
+import PluginDependency from '@/app/components/workflow/plugin-dependency'
+import { supportFunctionCall } from '@/utils/tool-call'
+
+type PublishConfig = {
+  modelConfig: ModelConfig
+  completionParams: FormValue
+}
+
+const Configuration: FC = () => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const { appDetail, showAppConfigureFeaturesModal, setAppSiderbarExpand, setShowAppConfigureFeaturesModal } = useAppStore(useShallow(state => ({
+    appDetail: state.appDetail,
+    setAppSiderbarExpand: state.setAppSiderbarExpand,
+    showAppConfigureFeaturesModal: state.showAppConfigureFeaturesModal,
+    setShowAppConfigureFeaturesModal: state.setShowAppConfigureFeaturesModal,
+  })))
+  const { data: fileUploadConfigResponse } = useSWR({ url: '/files/upload' }, fetchFileUploadConfig)
+
+  const latestPublishedAt = useMemo(() => appDetail?.model_config?.updated_at, [appDetail])
+  const [formattingChanged, setFormattingChanged] = useState(false)
+  const { setShowAccountSettingModal } = useModalContext()
+  const [hasFetchedDetail, setHasFetchedDetail] = useState(false)
+  const isLoading = !hasFetchedDetail
+  const pathname = usePathname()
+  const matched = pathname.match(/\/app\/([^/]+)/)
+  const appId = (matched?.length && matched[1]) ? matched[1] : ''
+  const [mode, setMode] = useState('')
+  const [publishedConfig, setPublishedConfig] = useState<PublishConfig | null>(null)
+
+  const [conversationId, setConversationId] = useState<string | null>('')
+
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+  const [isShowDebugPanel, { setTrue: showDebugPanel, setFalse: hideDebugPanel }] = useBoolean(false)
+
+  const [introduction, setIntroduction] = useState<string>('')
+  const [suggestedQuestions, setSuggestedQuestions] = useState<string[]>([])
+  const [controlClearChatMessage, setControlClearChatMessage] = useState(0)
+  const [prevPromptConfig, setPrevPromptConfig] = useState<PromptConfig>({
+    prompt_template: '',
+    prompt_variables: [],
+  })
+  const [moreLikeThisConfig, setMoreLikeThisConfig] = useState<MoreLikeThisConfig>({
+    enabled: false,
+  })
+  const [suggestedQuestionsAfterAnswerConfig, setSuggestedQuestionsAfterAnswerConfig] = useState<MoreLikeThisConfig>({
+    enabled: false,
+  })
+  const [speechToTextConfig, setSpeechToTextConfig] = useState<MoreLikeThisConfig>({
+    enabled: false,
+  })
+  const [textToSpeechConfig, setTextToSpeechConfig] = useState<TextToSpeechConfig>({
+    enabled: false,
+    voice: '',
+    language: '',
+  })
+  const [citationConfig, setCitationConfig] = useState<MoreLikeThisConfig>({
+    enabled: false,
+  })
+  const [annotationConfig, doSetAnnotationConfig] = useState<AnnotationReplyConfig>({
+    id: '',
+    enabled: false,
+    score_threshold: ANNOTATION_DEFAULT.score_threshold,
+    embedding_model: {
+      embedding_provider_name: '',
+      embedding_model_name: '',
+    },
+  })
+  const formattingChangedDispatcher = useFormattingChangedDispatcher()
+  const setAnnotationConfig = (config: AnnotationReplyConfig, notSetFormatChanged?: boolean) => {
+    doSetAnnotationConfig(config)
+    if (!notSetFormatChanged)
+      formattingChangedDispatcher()
+  }
+
+  const [moderationConfig, setModerationConfig] = useState<ModerationConfig>({
+    enabled: false,
+  })
+  const [externalDataToolsConfig, setExternalDataToolsConfig] = useState<ExternalDataTool[]>([])
+  const [inputs, setInputs] = useState<Inputs>({})
+  const [query, setQuery] = useState('')
+  const [completionParams, doSetCompletionParams] = useState<FormValue>({})
+  const [_, setTempStop, getTempStop] = useGetState<string[]>([])
+  const setCompletionParams = (value: FormValue) => {
+    const params = { ...value }
+
+    // eslint-disable-next-line ts/no-use-before-define
+    if ((!params.stop || params.stop.length === 0) && (modeModeTypeRef.current === ModelModeType.completion)) {
+      params.stop = getTempStop()
+      setTempStop([])
+    }
+    doSetCompletionParams(params)
+  }
+
+  const [modelConfig, doSetModelConfig] = useState<ModelConfig>({
+    provider: 'langgenius/openai/openai',
+    model_id: 'gpt-3.5-turbo',
+    mode: ModelModeType.unset,
+    configs: {
+      prompt_template: '',
+      prompt_variables: [] as PromptVariable[],
+    },
+    more_like_this: null,
+    opening_statement: '',
+    suggested_questions: [],
+    sensitive_word_avoidance: null,
+    speech_to_text: null,
+    text_to_speech: null,
+    file_upload: null,
+    suggested_questions_after_answer: null,
+    retriever_resource: null,
+    annotation_reply: null,
+    dataSets: [],
+    agentConfig: DEFAULT_AGENT_SETTING,
+  })
+  const isAgent = mode === 'agent-chat'
+
+  const isOpenAI = modelConfig.provider === 'langgenius/openai/openai'
+
+  const [collectionList, setCollectionList] = useState<Collection[]>([])
+  const [datasetConfigs, doSetDatasetConfigs] = useState<DatasetConfigs>({
+    retrieval_model: RETRIEVE_TYPE.multiWay,
+    reranking_model: {
+      reranking_provider_name: '',
+      reranking_model_name: '',
+    },
+    top_k: DATASET_DEFAULT.top_k,
+    score_threshold_enabled: false,
+    score_threshold: DATASET_DEFAULT.score_threshold,
+    datasets: {
+      datasets: [],
+    },
+  })
+  const datasetConfigsRef = useRef(datasetConfigs)
+  const setDatasetConfigs = useCallback((newDatasetConfigs: DatasetConfigs) => {
+    doSetDatasetConfigs(newDatasetConfigs)
+    datasetConfigsRef.current = newDatasetConfigs
+  }, [])
+
+  const setModelConfig = (newModelConfig: ModelConfig) => {
+    doSetModelConfig(newModelConfig)
+  }
+
+  const modelModeType = modelConfig.mode
+  const modeModeTypeRef = useRef(modelModeType)
+  useEffect(() => {
+    modeModeTypeRef.current = modelModeType
+  }, [modelModeType])
+
+  const [dataSets, setDataSets] = useState<DataSet[]>([])
+  const contextVar = modelConfig.configs.prompt_variables.find(item => item.is_context_var)?.key
+  const hasSetContextVar = !!contextVar
+  const [isShowSelectDataSet, { setTrue: showSelectDataSet, setFalse: hideSelectDataSet }] = useBoolean(false)
+  const selectedIds = dataSets.map(item => item.id)
+  const [rerankSettingModalOpen, setRerankSettingModalOpen] = useState(false)
+  const {
+    currentModel: currentRerankModel,
+    currentProvider: currentRerankProvider,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
+  const handleSelect = (data: DataSet[]) => {
+    if (isEqual(data.map(item => item.id), dataSets.map(item => item.id))) {
+      hideSelectDataSet()
+      return
+    }
+
+    formattingChangedDispatcher()
+    let newDatasets = data
+    if (data.find(item => !item.name)) { // has not loaded selected dataset
+      const newSelected = produce(data, (draft) => {
+        data.forEach((item, index) => {
+          if (!item.name) { // not fetched database
+            const newItem = dataSets.find(i => i.id === item.id)
+            if (newItem)
+              draft[index] = newItem
+          }
+        })
+      })
+      setDataSets(newSelected)
+      newDatasets = newSelected
+    }
+    else {
+      setDataSets(data)
+    }
+    hideSelectDataSet()
+    const {
+      allExternal,
+      allInternal,
+      mixtureInternalAndExternal,
+      mixtureHighQualityAndEconomic,
+      inconsistentEmbeddingModel,
+    } = getSelectedDatasetsMode(newDatasets)
+
+    if (
+      (allInternal && (mixtureHighQualityAndEconomic || inconsistentEmbeddingModel))
+      || mixtureInternalAndExternal
+      || allExternal
+    )
+      setRerankSettingModalOpen(true)
+
+    const { datasets, retrieval_model, score_threshold_enabled, ...restConfigs } = datasetConfigs
+
+    const retrievalConfig = getMultipleRetrievalConfig({
+      top_k: restConfigs.top_k,
+      score_threshold: restConfigs.score_threshold,
+      reranking_model: restConfigs.reranking_model && {
+        provider: restConfigs.reranking_model.reranking_provider_name,
+        model: restConfigs.reranking_model.reranking_model_name,
+      },
+      reranking_mode: restConfigs.reranking_mode,
+      weights: restConfigs.weights,
+      reranking_enable: restConfigs.reranking_enable,
+    }, newDatasets, dataSets, {
+      provider: currentRerankProvider?.provider,
+      model: currentRerankModel?.model,
+    })
+
+    setDatasetConfigs({
+      ...datasetConfigsRef.current,
+      ...retrievalConfig,
+      reranking_model: {
+        reranking_provider_name: retrievalConfig?.reranking_model?.provider || '',
+        reranking_model_name: retrievalConfig?.reranking_model?.model || '',
+      },
+      retrieval_model,
+      score_threshold_enabled,
+      datasets,
+    })
+  }
+
+  const [isShowHistoryModal, { setTrue: showHistoryModal, setFalse: hideHistoryModal }] = useBoolean(false)
+
+  const syncToPublishedConfig = (_publishedConfig: PublishConfig) => {
+    const modelConfig = _publishedConfig.modelConfig
+    setModelConfig(_publishedConfig.modelConfig)
+    setCompletionParams(_publishedConfig.completionParams)
+    setDataSets(modelConfig.dataSets || [])
+    // reset feature
+    setIntroduction(modelConfig.opening_statement!)
+    setMoreLikeThisConfig(modelConfig.more_like_this || {
+      enabled: false,
+    })
+    setSuggestedQuestionsAfterAnswerConfig(modelConfig.suggested_questions_after_answer || {
+      enabled: false,
+    })
+    setSpeechToTextConfig(modelConfig.speech_to_text || {
+      enabled: false,
+    })
+    setTextToSpeechConfig(modelConfig.text_to_speech || {
+      enabled: false,
+      voice: '',
+      language: '',
+    })
+    setCitationConfig(modelConfig.retriever_resource || {
+      enabled: false,
+    })
+  }
+
+  const { isAPIKeySet } = useProviderContext()
+  const {
+    currentModel: currModel,
+    textGenerationModelList,
+  } = useTextGenerationCurrentProviderAndModelAndModelList(
+    {
+      provider: modelConfig.provider,
+      model: modelConfig.model_id,
+    },
+  )
+
+  const isFunctionCall = supportFunctionCall(currModel?.features)
+
+  // Fill old app data missing model mode.
+  useEffect(() => {
+    if (hasFetchedDetail && !modelModeType) {
+      const mode = currModel?.model_properties.mode as (ModelModeType | undefined)
+      if (mode) {
+        const newModelConfig = produce(modelConfig, (draft: ModelConfig) => {
+          draft.mode = mode
+        })
+        setModelConfig(newModelConfig)
+      }
+    }
+  }, [textGenerationModelList, hasFetchedDetail, modelModeType, currModel, modelConfig])
+
+  const [promptMode, doSetPromptMode] = useState(PromptMode.simple)
+  const isAdvancedMode = promptMode === PromptMode.advanced
+  const [canReturnToSimpleMode, setCanReturnToSimpleMode] = useState(true)
+  const setPromptMode = async (mode: PromptMode) => {
+    if (mode === PromptMode.advanced) {
+      // eslint-disable-next-line ts/no-use-before-define
+      await migrateToDefaultPrompt()
+      setCanReturnToSimpleMode(true)
+    }
+
+    doSetPromptMode(mode)
+  }
+  const [visionConfig, doSetVisionConfig] = useState({
+    enabled: false,
+    number_limits: 2,
+    detail: Resolution.low,
+    transfer_methods: [TransferMethod.local_file],
+  })
+
+  const handleSetVisionConfig = (config: VisionSettings, notNoticeFormattingChanged?: boolean) => {
+    doSetVisionConfig({
+      enabled: config.enabled || false,
+      number_limits: config.number_limits || 2,
+      detail: config.detail || Resolution.low,
+      transfer_methods: config.transfer_methods || [TransferMethod.local_file],
+    })
+    if (!notNoticeFormattingChanged)
+      formattingChangedDispatcher()
+  }
+
+  const {
+    chatPromptConfig,
+    setChatPromptConfig,
+    completionPromptConfig,
+    setCompletionPromptConfig,
+    currentAdvancedPrompt,
+    setCurrentAdvancedPrompt,
+    hasSetBlockStatus,
+    setConversationHistoriesRole,
+    migrateToDefaultPrompt,
+  } = useAdvancedPromptConfig({
+    appMode: mode,
+    modelName: modelConfig.model_id,
+    promptMode,
+    modelModeType,
+    prePrompt: modelConfig.configs.prompt_template,
+    hasSetDataSet: dataSets.length > 0,
+    onUserChangedPrompt: () => {
+      setCanReturnToSimpleMode(false)
+    },
+    completionParams,
+    setCompletionParams,
+    setStop: setTempStop,
+  })
+  const setModel = async ({
+    modelId,
+    provider,
+    mode: modeMode,
+    features,
+  }: { modelId: string; provider: string; mode: string; features: string[] }) => {
+    if (isAdvancedMode) {
+      const appMode = mode
+
+      if (modeMode === ModelModeType.completion) {
+        if (appMode !== AppType.completion) {
+          if (!completionPromptConfig.prompt?.text || !completionPromptConfig.conversation_histories_role.assistant_prefix || !completionPromptConfig.conversation_histories_role.user_prefix)
+            await migrateToDefaultPrompt(true, ModelModeType.completion)
+        }
+        else {
+          if (!completionPromptConfig.prompt?.text)
+            await migrateToDefaultPrompt(true, ModelModeType.completion)
+        }
+      }
+      if (modeMode === ModelModeType.chat) {
+        if (chatPromptConfig.prompt.length === 0)
+          await migrateToDefaultPrompt(true, ModelModeType.chat)
+      }
+    }
+    const newModelConfig = produce(modelConfig, (draft: ModelConfig) => {
+      draft.provider = provider
+      draft.model_id = modelId
+      draft.mode = modeMode as ModelModeType
+    })
+
+    setModelConfig(newModelConfig)
+    const supportVision = features && features.includes(ModelFeatureEnum.vision)
+
+    handleSetVisionConfig({
+      ...visionConfig,
+      enabled: supportVision,
+    }, true)
+    setCompletionParams({})
+  }
+
+  const isShowVisionConfig = !!currModel?.features?.includes(ModelFeatureEnum.vision)
+  const isShowDocumentConfig = !!currModel?.features?.includes(ModelFeatureEnum.document)
+  const isAllowVideoUpload = !!currModel?.features?.includes(ModelFeatureEnum.video)
+  // *** web app features ***
+  const featuresData: FeaturesData = useMemo(() => {
+    return {
+      moreLikeThis: modelConfig.more_like_this || { enabled: false },
+      opening: {
+        enabled: !!modelConfig.opening_statement,
+        opening_statement: modelConfig.opening_statement || '',
+        suggested_questions: modelConfig.suggested_questions || [],
+      },
+      moderation: modelConfig.sensitive_word_avoidance || { enabled: false },
+      speech2text: modelConfig.speech_to_text || { enabled: false },
+      text2speech: modelConfig.text_to_speech || { enabled: false },
+      file: {
+        image: {
+          detail: modelConfig.file_upload?.image?.detail || Resolution.high,
+          enabled: !!modelConfig.file_upload?.image?.enabled,
+          number_limits: modelConfig.file_upload?.image?.number_limits || 3,
+          transfer_methods: modelConfig.file_upload?.image?.transfer_methods || ['local_file', 'remote_url'],
+        },
+        enabled: !!(modelConfig.file_upload?.enabled || modelConfig.file_upload?.image?.enabled),
+        allowed_file_types: modelConfig.file_upload?.allowed_file_types || [],
+        allowed_file_extensions: modelConfig.file_upload?.allowed_file_extensions || [...FILE_EXTS[SupportUploadFileTypes.image], ...FILE_EXTS[SupportUploadFileTypes.video]].map(ext => `.${ext}`),
+        allowed_file_upload_methods: modelConfig.file_upload?.allowed_file_upload_methods || modelConfig.file_upload?.image?.transfer_methods || ['local_file', 'remote_url'],
+        number_limits: modelConfig.file_upload?.number_limits || modelConfig.file_upload?.image?.number_limits || 3,
+        fileUploadConfig: fileUploadConfigResponse,
+      } as FileUpload,
+      suggested: modelConfig.suggested_questions_after_answer || { enabled: false },
+      citation: modelConfig.retriever_resource || { enabled: false },
+      annotationReply: modelConfig.annotation_reply || { enabled: false },
+    }
+  }, [fileUploadConfigResponse, modelConfig])
+  const handleFeaturesChange = useCallback((flag: any) => {
+    setShowAppConfigureFeaturesModal(true)
+    if (flag)
+      formattingChangedDispatcher()
+  }, [formattingChangedDispatcher, setShowAppConfigureFeaturesModal])
+  const handleAddPromptVariable = useCallback((variable: PromptVariable[]) => {
+    const newModelConfig = produce(modelConfig, (draft: ModelConfig) => {
+      draft.configs.prompt_variables = [...draft.configs.prompt_variables, ...variable]
+    })
+    setModelConfig(newModelConfig)
+  }, [modelConfig])
+
+  useEffect(() => {
+    (async () => {
+      const collectionList = await fetchCollectionList()
+      if (basePath) {
+        collectionList.forEach((item) => {
+          if (typeof item.icon == 'string' && !item.icon.includes(basePath))
+            item.icon = `${basePath}${item.icon}`
+        })
+      }
+      setCollectionList(collectionList)
+      fetchAppDetail({ url: '/apps', id: appId }).then(async (res: any) => {
+        setMode(res.mode)
+        const modelConfig = res.model_config
+        const promptMode = modelConfig.prompt_type === PromptMode.advanced ? PromptMode.advanced : PromptMode.simple
+        doSetPromptMode(promptMode)
+        if (promptMode === PromptMode.advanced) {
+          if (modelConfig.chat_prompt_config && modelConfig.chat_prompt_config.prompt.length > 0)
+            setChatPromptConfig(modelConfig.chat_prompt_config)
+          else
+            setChatPromptConfig(clone(DEFAULT_CHAT_PROMPT_CONFIG))
+          setCompletionPromptConfig(modelConfig.completion_prompt_config || clone(DEFAULT_COMPLETION_PROMPT_CONFIG) as any)
+          setCanReturnToSimpleMode(false)
+        }
+
+        const model = res.model_config.model
+
+        let datasets: any = null
+        // old dataset struct
+        if (modelConfig.agent_mode?.tools?.find(({ dataset }: any) => dataset?.enabled))
+          datasets = modelConfig.agent_mode?.tools.filter(({ dataset }: any) => dataset?.enabled)
+        // new dataset struct
+        else if (modelConfig.dataset_configs.datasets?.datasets?.length > 0)
+          datasets = modelConfig.dataset_configs?.datasets?.datasets
+
+        if (dataSets && datasets?.length && datasets?.length > 0) {
+          const { data: dataSetsWithDetail } = await fetchDatasets({ url: '/datasets', params: { page: 1, ids: datasets.map(({ dataset }: any) => dataset.id) } })
+          datasets = dataSetsWithDetail
+          setDataSets(datasets)
+        }
+
+        setIntroduction(modelConfig.opening_statement)
+        setSuggestedQuestions(modelConfig.suggested_questions || [])
+        if (modelConfig.more_like_this)
+          setMoreLikeThisConfig(modelConfig.more_like_this)
+
+        if (modelConfig.suggested_questions_after_answer)
+          setSuggestedQuestionsAfterAnswerConfig(modelConfig.suggested_questions_after_answer)
+
+        if (modelConfig.speech_to_text)
+          setSpeechToTextConfig(modelConfig.speech_to_text)
+
+        if (modelConfig.text_to_speech)
+          setTextToSpeechConfig(modelConfig.text_to_speech)
+
+        if (modelConfig.retriever_resource)
+          setCitationConfig(modelConfig.retriever_resource)
+
+        if (modelConfig.annotation_reply) {
+          let annotationConfig = modelConfig.annotation_reply
+          if (modelConfig.annotation_reply.enabled) {
+            annotationConfig = {
+              ...modelConfig.annotation_reply,
+              embedding_model: {
+                ...modelConfig.annotation_reply.embedding_model,
+                embedding_provider_name: correctModelProvider(modelConfig.annotation_reply.embedding_model.embedding_provider_name),
+              },
+            }
+          }
+          setAnnotationConfig(annotationConfig, true)
+        }
+
+        if (modelConfig.sensitive_word_avoidance)
+          setModerationConfig(modelConfig.sensitive_word_avoidance)
+
+        if (modelConfig.external_data_tools)
+          setExternalDataToolsConfig(modelConfig.external_data_tools)
+
+        const config = {
+          modelConfig: {
+            provider: correctModelProvider(model.provider),
+            model_id: model.name,
+            mode: model.mode,
+            configs: {
+              prompt_template: modelConfig.pre_prompt || '',
+              prompt_variables: userInputsFormToPromptVariables(
+                [
+                  ...modelConfig.user_input_form,
+                  ...(
+                    modelConfig.external_data_tools?.length
+                      ? modelConfig.external_data_tools.map((item: any) => {
+                        return {
+                          external_data_tool: {
+                            variable: item.variable as string,
+                            label: item.label as string,
+                            enabled: item.enabled,
+                            type: item.type as string,
+                            config: item.config,
+                            required: true,
+                            icon: item.icon,
+                            icon_background: item.icon_background,
+                          },
+                        }
+                      })
+                      : []
+                  ),
+                ],
+                modelConfig.dataset_query_variable,
+              ),
+            },
+            more_like_this: modelConfig.more_like_this,
+            opening_statement: modelConfig.opening_statement,
+            suggested_questions: modelConfig.suggested_questions,
+            sensitive_word_avoidance: modelConfig.sensitive_word_avoidance,
+            speech_to_text: modelConfig.speech_to_text,
+            text_to_speech: modelConfig.text_to_speech,
+            file_upload: modelConfig.file_upload,
+            suggested_questions_after_answer: modelConfig.suggested_questions_after_answer,
+            retriever_resource: modelConfig.retriever_resource,
+            annotation_reply: modelConfig.annotation_reply,
+            external_data_tools: modelConfig.external_data_tools,
+            dataSets: datasets || [],
+            agentConfig: res.mode === 'agent-chat' ? {
+              max_iteration: DEFAULT_AGENT_SETTING.max_iteration,
+              ...modelConfig.agent_mode,
+              // remove dataset
+              enabled: true, // modelConfig.agent_mode?.enabled is not correct. old app: the value of app with dataset's is always true
+              tools: modelConfig.agent_mode?.tools.filter((tool: any) => {
+                return !tool.dataset
+              }).map((tool: any) => {
+                const toolInCollectionList = collectionList.find(c => tool.provider_id === c.id)
+                return {
+                  ...tool,
+                  isDeleted: res.deleted_tools?.some((deletedTool: any) => deletedTool.id === tool.id && deletedTool.tool_name === tool.tool_name),
+                  notAuthor: toolInCollectionList?.is_team_authorization === false,
+                  ...(tool.provider_type === 'builtin' ? {
+                    provider_id: correctToolProvider(tool.provider_name, !!toolInCollectionList),
+                    provider_name: correctToolProvider(tool.provider_name, !!toolInCollectionList),
+                  } : {}),
+                }
+              }),
+            } : DEFAULT_AGENT_SETTING,
+          },
+          completionParams: model.completion_params,
+        }
+
+        if (modelConfig.file_upload)
+          handleSetVisionConfig(modelConfig.file_upload.image, true)
+
+        syncToPublishedConfig(config)
+        setPublishedConfig(config)
+        const retrievalConfig = getMultipleRetrievalConfig({
+          ...modelConfig.dataset_configs,
+          reranking_model: modelConfig.dataset_configs.reranking_model && {
+            provider: modelConfig.dataset_configs.reranking_model.reranking_provider_name,
+            model: modelConfig.dataset_configs.reranking_model.reranking_model_name,
+          },
+        }, datasets, datasets, {
+          provider: currentRerankProvider?.provider,
+          model: currentRerankModel?.model,
+        })
+        setDatasetConfigs({
+          retrieval_model: RETRIEVE_TYPE.multiWay,
+          ...modelConfig.dataset_configs,
+          ...retrievalConfig,
+          ...(retrievalConfig.reranking_model ? {
+            reranking_model: {
+              reranking_model_name: retrievalConfig.reranking_model.model,
+              reranking_provider_name: correctModelProvider(retrievalConfig.reranking_model.provider),
+            },
+          } : {}),
+        })
+        setHasFetchedDetail(true)
+      })
+    })()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [appId])
+
+  const promptEmpty = (() => {
+    if (mode !== AppType.completion)
+      return false
+
+    if (isAdvancedMode) {
+      if (modelModeType === ModelModeType.chat)
+        return chatPromptConfig.prompt.every(({ text }: any) => !text)
+
+      else
+        return !completionPromptConfig.prompt?.text
+    }
+
+    else { return !modelConfig.configs.prompt_template }
+  })()
+  const cannotPublish = (() => {
+    if (mode !== AppType.completion) {
+      if (!isAdvancedMode)
+        return false
+
+      if (modelModeType === ModelModeType.completion) {
+        if (!hasSetBlockStatus.history || !hasSetBlockStatus.query)
+          return true
+
+        return false
+      }
+
+      return false
+    }
+    else { return promptEmpty }
+  })()
+  const contextVarEmpty = mode === AppType.completion && dataSets.length > 0 && !hasSetContextVar
+  const onPublish = async (modelAndParameter?: ModelAndParameter, features?: FeaturesData) => {
+    const modelId = modelAndParameter?.model || modelConfig.model_id
+    const promptTemplate = modelConfig.configs.prompt_template
+    const promptVariables = modelConfig.configs.prompt_variables
+
+    if (promptEmpty) {
+      notify({ type: 'error', message: t('appDebug.otherError.promptNoBeEmpty') })
+      return
+    }
+    if (isAdvancedMode && mode !== AppType.completion) {
+      if (modelModeType === ModelModeType.completion) {
+        if (!hasSetBlockStatus.history) {
+          notify({ type: 'error', message: t('appDebug.otherError.historyNoBeEmpty') })
+          return
+        }
+        if (!hasSetBlockStatus.query) {
+          notify({ type: 'error', message: t('appDebug.otherError.queryNoBeEmpty') })
+          return
+        }
+      }
+    }
+    if (contextVarEmpty) {
+      notify({ type: 'error', message: t('appDebug.feature.dataSet.queryVariable.contextVarNotEmpty') })
+      return
+    }
+    const postDatasets = dataSets.map(({ id }) => ({
+      dataset: {
+        enabled: true,
+        id,
+      },
+    }))
+
+    const fileUpload = { ...features?.file }
+    delete fileUpload?.fileUploadConfig
+
+    // new model config data struct
+    const data: BackendModelConfig = {
+      // Simple Mode prompt
+      pre_prompt: !isAdvancedMode ? promptTemplate : '',
+      prompt_type: promptMode,
+      chat_prompt_config: {},
+      completion_prompt_config: {},
+      user_input_form: promptVariablesToUserInputsForm(promptVariables),
+      dataset_query_variable: contextVar || '',
+      //  features
+      more_like_this: features?.moreLikeThis as any,
+      opening_statement: features?.opening?.enabled ? (features.opening?.opening_statement || '') : '',
+      suggested_questions: features?.opening?.enabled ? (features.opening?.suggested_questions || []) : [],
+      sensitive_word_avoidance: features?.moderation as any,
+      speech_to_text: features?.speech2text as any,
+      text_to_speech: features?.text2speech as any,
+      file_upload: fileUpload as any,
+      suggested_questions_after_answer: features?.suggested as any,
+      retriever_resource: features?.citation as any,
+      agent_mode: {
+        ...modelConfig.agentConfig,
+        strategy: isFunctionCall ? AgentStrategy.functionCall : AgentStrategy.react,
+      },
+      model: {
+        provider: modelAndParameter?.provider || modelConfig.provider,
+        name: modelId,
+        mode: modelConfig.mode,
+        completion_params: modelAndParameter?.parameters || completionParams as any,
+      },
+      dataset_configs: {
+        ...datasetConfigs,
+        datasets: {
+          datasets: [...postDatasets],
+        } as any,
+      },
+    }
+
+    if (isAdvancedMode) {
+      data.chat_prompt_config = chatPromptConfig
+      data.completion_prompt_config = completionPromptConfig
+    }
+
+    await updateAppModelConfig({ url: `/apps/${appId}/model-config`, body: data })
+    const newModelConfig = produce(modelConfig, (draft: any) => {
+      draft.opening_statement = introduction
+      draft.more_like_this = moreLikeThisConfig
+      draft.suggested_questions_after_answer = suggestedQuestionsAfterAnswerConfig
+      draft.speech_to_text = speechToTextConfig
+      draft.text_to_speech = textToSpeechConfig
+      draft.retriever_resource = citationConfig
+      draft.dataSets = dataSets
+    })
+    setPublishedConfig({
+      modelConfig: newModelConfig,
+      completionParams,
+    })
+    notify({ type: 'success', message: t('common.api.success') })
+
+    setCanReturnToSimpleMode(false)
+    return true
+  }
+
+  const [showUseGPT4Confirm, setShowUseGPT4Confirm] = useState(false)
+
+  const {
+    debugWithMultipleModel,
+    multipleModelConfigs,
+    handleMultipleModelConfigsChange,
+  } = useDebugWithSingleOrMultipleModel(appId)
+
+  const handleDebugWithMultipleModelChange = () => {
+    handleMultipleModelConfigsChange(
+      true,
+      [
+        { id: `${Date.now()}`, model: modelConfig.model_id, provider: modelConfig.provider, parameters: completionParams },
+        { id: `${Date.now()}-no-repeat`, model: '', provider: '', parameters: {} },
+      ],
+    )
+    setAppSiderbarExpand('collapse')
+  }
+
+  if (isLoading) {
+    return <div className='flex h-full items-center justify-center'>
+      <Loading type='area' />
+    </div>
+  }
+
+  return (
+    <ConfigContext.Provider value={{
+      appId,
+      isAPIKeySet,
+      isTrailFinished: false,
+      mode,
+      modelModeType,
+      promptMode,
+      isAdvancedMode,
+      isAgent,
+      isOpenAI,
+      isFunctionCall,
+      collectionList,
+      setPromptMode,
+      canReturnToSimpleMode,
+      setCanReturnToSimpleMode,
+      chatPromptConfig,
+      completionPromptConfig,
+      currentAdvancedPrompt,
+      setCurrentAdvancedPrompt,
+      conversationHistoriesRole: completionPromptConfig.conversation_histories_role,
+      showHistoryModal,
+      setConversationHistoriesRole,
+      hasSetBlockStatus,
+      conversationId,
+      introduction,
+      setIntroduction,
+      suggestedQuestions,
+      setSuggestedQuestions,
+      setConversationId,
+      controlClearChatMessage,
+      setControlClearChatMessage,
+      prevPromptConfig,
+      setPrevPromptConfig,
+      moreLikeThisConfig,
+      setMoreLikeThisConfig,
+      suggestedQuestionsAfterAnswerConfig,
+      setSuggestedQuestionsAfterAnswerConfig,
+      speechToTextConfig,
+      setSpeechToTextConfig,
+      textToSpeechConfig,
+      setTextToSpeechConfig,
+      citationConfig,
+      setCitationConfig,
+      annotationConfig,
+      setAnnotationConfig,
+      moderationConfig,
+      setModerationConfig,
+      externalDataToolsConfig,
+      setExternalDataToolsConfig,
+      formattingChanged,
+      setFormattingChanged,
+      inputs,
+      setInputs,
+      query,
+      setQuery,
+      completionParams,
+      setCompletionParams,
+      modelConfig,
+      setModelConfig,
+      showSelectDataSet,
+      dataSets,
+      setDataSets,
+      datasetConfigs,
+      datasetConfigsRef,
+      setDatasetConfigs,
+      hasSetContextVar,
+      isShowVisionConfig,
+      visionConfig,
+      setVisionConfig: handleSetVisionConfig,
+      isAllowVideoUpload,
+      isShowDocumentConfig,
+      rerankSettingModalOpen,
+      setRerankSettingModalOpen,
+    }}
+    >
+      <FeaturesProvider features={featuresData}>
+        <>
+          <div className="flex h-full flex-col">
+            <div className='relative flex h-[200px] grow pt-14'>
+              {/* Header */}
+              <div className='bg-default-subtle absolute left-0 top-0 h-14 w-full'>
+                <div className='flex h-14 items-center justify-between px-6'>
+                  <div className='flex items-center'>
+                    <div className='system-xl-semibold text-text-primary'>{t('appDebug.orchestrate')}</div>
+                    <div className='flex h-[14px] items-center space-x-1 text-xs'>
+                      {isAdvancedMode && (
+                        <div className='system-xs-medium-uppercase ml-1 flex h-5 items-center rounded-md border border-components-button-secondary-border px-1.5 uppercase text-text-tertiary'>{t('appDebug.promptMode.advanced')}</div>
+                      )}
+                    </div>
+                  </div>
+                  <div className='flex items-center'>
+                    {/* Agent Setting */}
+                    {isAgent && (
+                      <AgentSettingButton
+                        isChatModel={modelConfig.mode === ModelModeType.chat}
+                        agentConfig={modelConfig.agentConfig}
+
+                        isFunctionCall={isFunctionCall}
+                        onAgentSettingChange={(config) => {
+                          const nextConfig = produce(modelConfig, (draft: ModelConfig) => {
+                            draft.agentConfig = config
+                          })
+                          setModelConfig(nextConfig)
+                        }}
+                      />
+                    )}
+                    {/* Model and Parameters */}
+                    {!debugWithMultipleModel && (
+                      <>
+                        <ModelParameterModal
+                          isAdvancedMode={isAdvancedMode}
+                          mode={mode}
+                          provider={modelConfig.provider}
+                          completionParams={completionParams}
+                          modelId={modelConfig.model_id}
+                          setModel={setModel as any}
+                          onCompletionParamsChange={(newParams: FormValue) => {
+                            setCompletionParams(newParams)
+                          }}
+                          debugWithMultipleModel={debugWithMultipleModel}
+                          onDebugWithMultipleModelChange={handleDebugWithMultipleModelChange}
+                        />
+                        <Divider type='vertical' className='mx-2 h-[14px]' />
+                      </>
+                    )}
+                    {isMobile && (
+                      <Button className='mr-2 !h-8 !text-[13px] font-medium' onClick={showDebugPanel}>
+                        <span className='mr-1'>{t('appDebug.operation.debugConfig')}</span>
+                        <CodeBracketIcon className="h-4 w-4 text-text-tertiary" />
+                      </Button>
+                    )}
+                    <AppPublisher {...{
+                      publishDisabled: cannotPublish,
+                      publishedAt: (latestPublishedAt || 0) * 1000,
+                      debugWithMultipleModel,
+                      multipleModelConfigs,
+                      onPublish,
+                      publishedConfig: publishedConfig!,
+                      resetAppConfig: () => syncToPublishedConfig(publishedConfig!),
+                    }} />
+                  </div>
+                </div>
+              </div>
+              <div className={`flex h-full w-full shrink-0 flex-col sm:w-1/2 ${debugWithMultipleModel && 'max-w-[560px]'}`}>
+                <Config />
+              </div>
+              {!isMobile && <div className="relative flex h-full w-1/2 grow flex-col overflow-y-auto " style={{ borderColor: 'rgba(0, 0, 0, 0.02)' }}>
+                <div className='flex grow flex-col rounded-tl-2xl border-l-[0.5px] border-t-[0.5px] border-components-panel-border bg-chatbot-bg '>
+                  <Debug
+                    isAPIKeySet={isAPIKeySet}
+                    onSetting={() => setShowAccountSettingModal({ payload: 'provider' })}
+                    inputs={inputs}
+                    modelParameterParams={{
+                      setModel: setModel as any,
+                      onCompletionParamsChange: setCompletionParams,
+                    }}
+                    debugWithMultipleModel={debugWithMultipleModel}
+                    multipleModelConfigs={multipleModelConfigs}
+                    onMultipleModelConfigsChange={handleMultipleModelConfigsChange}
+                  />
+                </div>
+              </div>}
+            </div>
+          </div>
+          {showUseGPT4Confirm && (
+            <Confirm
+              title={t('appDebug.trailUseGPT4Info.title')}
+              content={t('appDebug.trailUseGPT4Info.description')}
+              isShow={showUseGPT4Confirm}
+              onConfirm={() => {
+                setShowAccountSettingModal({ payload: 'provider' })
+                setShowUseGPT4Confirm(false)
+              }}
+              onCancel={() => setShowUseGPT4Confirm(false)}
+            />
+          )}
+
+          {isShowSelectDataSet && (
+            <SelectDataSet
+              isShow={isShowSelectDataSet}
+              onClose={hideSelectDataSet}
+              selectedIds={selectedIds}
+              onSelect={handleSelect}
+            />
+          )}
+
+          {isShowHistoryModal && (
+            <EditHistoryModal
+              isShow={isShowHistoryModal}
+              saveLoading={false}
+              onClose={hideHistoryModal}
+              data={completionPromptConfig.conversation_histories_role}
+              onSave={(data) => {
+                setConversationHistoriesRole(data)
+                hideHistoryModal()
+              }}
+            />
+          )}
+          {isMobile && (
+            <Drawer showClose isOpen={isShowDebugPanel} onClose={hideDebugPanel} mask footer={null}>
+              <Debug
+                isAPIKeySet={isAPIKeySet}
+                onSetting={() => setShowAccountSettingModal({ payload: 'provider' })}
+                inputs={inputs}
+                modelParameterParams={{
+                  setModel: setModel as any,
+                  onCompletionParamsChange: setCompletionParams,
+                }}
+                debugWithMultipleModel={debugWithMultipleModel}
+                multipleModelConfigs={multipleModelConfigs}
+                onMultipleModelConfigsChange={handleMultipleModelConfigsChange}
+              />
+            </Drawer>
+          )}
+          {showAppConfigureFeaturesModal && (
+            <NewFeaturePanel
+              show
+              inWorkflow={false}
+              showFileUpload={false}
+              isChatMode={mode !== 'completion'}
+              disabled={false}
+              onChange={handleFeaturesChange}
+              onClose={() => setShowAppConfigureFeaturesModal(false)}
+              promptVariables={modelConfig.configs.prompt_variables}
+              onAutoAddPromptVariable={handleAddPromptVariable}
+            />
+          )}
+          <PluginDependency />
+        </>
+      </FeaturesProvider>
+    </ConfigContext.Provider>
+  )
+}
+export default React.memo(Configuration)
diff --git a/app/components/app/configuration/prompt-mode/advanced-mode-waring.tsx b/app/components/app/configuration/prompt-mode/advanced-mode-waring.tsx
new file mode 100644
index 0000000..cca775c
--- /dev/null
+++ b/app/components/app/configuration/prompt-mode/advanced-mode-waring.tsx
@@ -0,0 +1,52 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import I18n from '@/context/i18n'
+import { LanguagesSupported } from '@/i18n/language'
+type Props = {
+  onReturnToSimpleMode: () => void
+}
+
+const AdvancedModeWarning: FC<Props> = ({
+  onReturnToSimpleMode,
+}) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const [show, setShow] = React.useState(true)
+  if (!show)
+    return null
+  return (
+    <div className='mb-3 rounded-xl border border-[#FEF0C7] bg-[#FFFAEB] px-4 py-3' >
+      <div className='mb-2 text-xs font-bold leading-[18px] text-[#DC6803]'>{t('appDebug.promptMode.advancedWarning.title')}</div>
+      <div className='flex items-center justify-between'>
+        <div className='text-xs leading-[18px] '>
+          <span className='text-gray-700'>{t('appDebug.promptMode.advancedWarning.description')}</span>
+          <a
+            className='font-medium text-[#155EEF]'
+            href={`https://docs.dify.ai/${locale === LanguagesSupported[1] ? '/guides/features/prompt-engineering' : 'features/prompt-engineering'}`}
+            target='_blank' rel='noopener noreferrer'
+          >
+            {t('appDebug.promptMode.advancedWarning.learnMore')}
+          </a>
+        </div>
+
+        <div className='flex items-center space-x-1'>
+          <div
+            onClick={onReturnToSimpleMode}
+            className='flex h-6 shrink-0 cursor-pointer items-center space-x-1 rounded-lg border border-gray-200 bg-indigo-600 px-2 text-xs font-semibold text-white shadow-xs'
+          >
+            <div className='text-xs font-semibold uppercase'>{t('appDebug.promptMode.switchBack')}</div>
+          </div>
+          <div
+            className='flex h-6 cursor-pointer items-center rounded-md border border-gray-200 bg-[#fff] px-2 text-xs font-medium text-primary-600 shadow-xs'
+            onClick={() => setShow(false)}
+          >{t('appDebug.promptMode.advancedWarning.ok')}</div>
+        </div>
+
+      </div>
+    </div>
+  )
+}
+export default React.memo(AdvancedModeWarning)
diff --git a/app/components/app/configuration/prompt-value-panel/index.tsx b/app/components/app/configuration/prompt-value-panel/index.tsx
new file mode 100644
index 0000000..e509ee5
--- /dev/null
+++ b/app/components/app/configuration/prompt-value-panel/index.tsx
@@ -0,0 +1,214 @@
+'use client'
+import type { FC } from 'react'
+import React, { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import {
+  RiArrowDownSLine,
+  RiArrowRightSLine,
+  RiPlayLargeFill,
+} from '@remixicon/react'
+import ConfigContext from '@/context/debug-configuration'
+import type { Inputs } from '@/models/debug'
+import { AppType, ModelModeType } from '@/types/app'
+import Select from '@/app/components/base/select'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import Tooltip from '@/app/components/base/tooltip'
+import TextGenerationImageUploader from '@/app/components/base/image-uploader/text-generation-image-uploader'
+import FeatureBar from '@/app/components/base/features/new-feature-panel/feature-bar'
+import type { VisionFile, VisionSettings } from '@/types/app'
+import { DEFAULT_VALUE_MAX_LEN } from '@/config'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import cn from '@/utils/classnames'
+
+export type IPromptValuePanelProps = {
+  appType: AppType
+  onSend?: () => void
+  inputs: Inputs
+  visionConfig: VisionSettings
+  onVisionFilesChange: (files: VisionFile[]) => void
+}
+
+const PromptValuePanel: FC<IPromptValuePanelProps> = ({
+  appType,
+  onSend,
+  inputs,
+  visionConfig,
+  onVisionFilesChange,
+}) => {
+  const { t } = useTranslation()
+  const { modelModeType, modelConfig, setInputs, mode, isAdvancedMode, completionPromptConfig, chatPromptConfig } = useContext(ConfigContext)
+  const [userInputFieldCollapse, setUserInputFieldCollapse] = useState(false)
+  const promptVariables = modelConfig.configs.prompt_variables.filter(({ key, name }) => {
+    return key && key?.trim() && name && name?.trim()
+  })
+
+  const promptVariableObj = useMemo(() => {
+    const obj: Record<string, boolean> = {}
+    promptVariables.forEach((input) => {
+      obj[input.key] = true
+    })
+    return obj
+  }, [promptVariables])
+
+  const canNotRun = useMemo(() => {
+    if (mode !== AppType.completion)
+      return true
+
+    if (isAdvancedMode) {
+      if (modelModeType === ModelModeType.chat)
+        return chatPromptConfig.prompt.every(({ text }) => !text)
+      return !completionPromptConfig.prompt?.text
+    }
+
+    else { return !modelConfig.configs.prompt_template }
+  }, [chatPromptConfig.prompt, completionPromptConfig.prompt?.text, isAdvancedMode, mode, modelConfig.configs.prompt_template, modelModeType])
+
+  const handleInputValueChange = (key: string, value: string) => {
+    if (!(key in promptVariableObj))
+      return
+
+    const newInputs = { ...inputs }
+    promptVariables.forEach((input) => {
+      if (input.key === key)
+        newInputs[key] = value
+    })
+    setInputs(newInputs)
+  }
+
+  const onClear = () => {
+    const newInputs: Inputs = {}
+    promptVariables.forEach((item) => {
+      newInputs[item.key] = ''
+    })
+    setInputs(newInputs)
+  }
+
+  const setShowAppConfigureFeaturesModal = useAppStore(s => s.setShowAppConfigureFeaturesModal)
+
+  return (
+    <>
+      <div className='relative z-[1] mx-3 rounded-xl border-[0.5px] border-components-panel-border-subtle bg-components-panel-on-panel-item-bg shadow-md'>
+        <div className={cn('px-4 pt-3', userInputFieldCollapse ? 'pb-3' : 'pb-1')}>
+          <div className='flex cursor-pointer items-center gap-0.5 py-0.5' onClick={() => setUserInputFieldCollapse(!userInputFieldCollapse)}>
+            <div className='system-md-semibold-uppercase text-text-secondary'>{t('appDebug.inputs.userInputField')}</div>
+            {userInputFieldCollapse && <RiArrowRightSLine className='h-4 w-4 text-text-secondary'/>}
+            {!userInputFieldCollapse && <RiArrowDownSLine className='h-4 w-4 text-text-secondary'/>}
+          </div>
+          {!userInputFieldCollapse && (
+            <div className='system-xs-regular mt-1 text-text-tertiary'>{t('appDebug.inputs.completionVarTip')}</div>
+          )}
+        </div>
+        {!userInputFieldCollapse && promptVariables.length > 0 && (
+          <div className='px-4 pb-4 pt-3'>
+            {promptVariables.map(({ key, name, type, options, max_length, required }, index) => (
+              <div
+                key={key}
+                className='mb-4 last-of-type:mb-0'
+              >
+                <div>
+                  <div className='system-sm-semibold mb-1 flex h-6 items-center gap-1 text-text-secondary'>
+                    <div className='truncate'>{name || key}</div>
+                    {!required && <span className='system-xs-regular text-text-tertiary'>{t('workflow.panel.optional')}</span>}
+                  </div>
+                  <div className='grow'>
+                    {type === 'string' && (
+                      <Input
+                        value={inputs[key] ? `${inputs[key]}` : ''}
+                        onChange={(e) => { handleInputValueChange(key, e.target.value) }}
+                        placeholder={name}
+                        autoFocus={index === 0}
+                        maxLength={max_length || DEFAULT_VALUE_MAX_LEN}
+                      />
+                    )}
+                    {type === 'paragraph' && (
+                      <Textarea
+                        className='h-[120px] grow'
+                        placeholder={name}
+                        value={inputs[key] ? `${inputs[key]}` : ''}
+                        onChange={(e) => { handleInputValueChange(key, e.target.value) }}
+                      />
+                    )}
+                    {type === 'select' && (
+                      <Select
+                        className='w-full'
+                        defaultValue={inputs[key] as string}
+                        onSelect={(i) => { handleInputValueChange(key, i.value as string) }}
+                        items={(options || []).map(i => ({ name: i, value: i }))}
+                        allowSearch={false}
+                        bgClassName='bg-gray-50'
+                      />
+                    )}
+                    {type === 'number' && (
+                      <Input
+                        type='number'
+                        value={inputs[key] ? `${inputs[key]}` : ''}
+                        onChange={(e) => { handleInputValueChange(key, e.target.value) }}
+                        placeholder={name}
+                        autoFocus={index === 0}
+                        maxLength={max_length || DEFAULT_VALUE_MAX_LEN}
+                      />
+                    )}
+                  </div>
+                </div>
+              </div>
+            ))}
+            {visionConfig?.enabled && (
+              <div className="mt-3 justify-between xl:flex">
+                <div className="mr-1 w-[120px] shrink-0 py-2 text-sm text-text-primary">{t('common.imageUploader.imageUpload')}</div>
+                <div className='grow'>
+                  <TextGenerationImageUploader
+                    settings={visionConfig}
+                    onFilesChange={files => onVisionFilesChange(files.filter(file => file.progress !== -1).map(fileItem => ({
+                      type: 'image',
+                      transfer_method: fileItem.type,
+                      url: fileItem.url,
+                      upload_file_id: fileItem.fileId,
+                    })))}
+                  />
+                </div>
+              </div>
+            )}
+          </div>
+        )}
+        {!userInputFieldCollapse && (
+          <div className='flex justify-between border-t border-divider-subtle p-4 pt-3'>
+            <Button className='w-[72px]' onClick={onClear}>{t('common.operation.clear')}</Button>
+            {canNotRun && (
+              <Tooltip popupContent={t('appDebug.otherError.promptNoBeEmpty')} needsDelay>
+                <Button
+                  variant="primary"
+                  disabled={canNotRun}
+                  onClick={() => onSend && onSend()}
+                  className="w-[96px]">
+                  <RiPlayLargeFill className="mr-0.5 h-4 w-4 shrink-0" aria-hidden="true" />
+                  {t('appDebug.inputs.run')}
+                </Button>
+              </Tooltip>
+            )}
+            {!canNotRun && (
+              <Button
+                variant="primary"
+                disabled={canNotRun}
+                onClick={() => onSend && onSend()}
+                className="w-[96px]">
+                <RiPlayLargeFill className="mr-0.5 h-4 w-4 shrink-0" aria-hidden="true" />
+                {t('appDebug.inputs.run')}
+              </Button>
+            )}
+          </div>
+        )}
+      </div>
+      <div className='mx-3'>
+        <FeatureBar
+          showFileUpload={false}
+          isChatMode={appType !== AppType.completion}
+          onFeatureBarClick={setShowAppConfigureFeaturesModal} />
+      </div>
+    </>
+  )
+}
+
+export default React.memo(PromptValuePanel)
diff --git a/app/components/app/configuration/prompt-value-panel/utils.ts b/app/components/app/configuration/prompt-value-panel/utils.ts
new file mode 100644
index 0000000..bc4656d
--- /dev/null
+++ b/app/components/app/configuration/prompt-value-panel/utils.ts
@@ -0,0 +1,13 @@
+import type { PromptVariable } from '@/models/debug'
+
+export function replaceStringWithValues(str: string, promptVariables: PromptVariable[], inputs: Record<string, any>) {
+  return str.replace(/\{\{([^}]+)\}\}/g, (match, key) => {
+    const name = inputs[key]
+    if (name) { // has set value
+      return name
+    }
+
+    const valueObj: PromptVariable | undefined = promptVariables.find(v => v.key === key)
+    return valueObj ? `{{${valueObj.name}}}` : match
+  })
+}
diff --git a/app/components/app/configuration/style.module.css b/app/components/app/configuration/style.module.css
new file mode 100644
index 0000000..01f2c93
--- /dev/null
+++ b/app/components/app/configuration/style.module.css
@@ -0,0 +1,14 @@
+.advancedPromptMode {
+  position: relative;
+}
+
+.advancedPromptMode::before {
+  content: '';
+  position: absolute;
+  bottom: 0;
+  left: -1px;
+  width: 100%;
+  height: 3px;
+  background-color: rgba(68, 76, 231, 0.18);
+  transform: skewX(-30deg);
+}
diff --git a/app/components/app/configuration/tools/external-data-tool-modal.tsx b/app/components/app/configuration/tools/external-data-tool-modal.tsx
new file mode 100644
index 0000000..ee4bd57
--- /dev/null
+++ b/app/components/app/configuration/tools/external-data-tool-modal.tsx
@@ -0,0 +1,304 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import useSWR from 'swr'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import FormGeneration from '@/app/components/base/features/new-feature-panel/moderation/form-generation'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import EmojiPicker from '@/app/components/base/emoji-picker'
+import ApiBasedExtensionSelector from '@/app/components/header/account-setting/api-based-extension-page/selector'
+import { BookOpen01 } from '@/app/components/base/icons/src/vender/line/education'
+import { fetchCodeBasedExtensionList } from '@/service/common'
+import { SimpleSelect } from '@/app/components/base/select'
+import I18n from '@/context/i18n'
+import { LanguagesSupported } from '@/i18n/language'
+import type {
+  CodeBasedExtensionItem,
+  ExternalDataTool,
+} from '@/models/common'
+import { useToastContext } from '@/app/components/base/toast'
+import AppIcon from '@/app/components/base/app-icon'
+import { noop } from 'lodash-es'
+
+const systemTypes = ['api']
+type ExternalDataToolModalProps = {
+  data: ExternalDataTool
+  onCancel: () => void
+  onSave: (externalDataTool: ExternalDataTool) => void
+  onValidateBeforeSave?: (externalDataTool: ExternalDataTool) => boolean
+}
+type Provider = {
+  key: string
+  name: string
+  form_schema?: CodeBasedExtensionItem['form_schema']
+}
+const ExternalDataToolModal: FC<ExternalDataToolModalProps> = ({
+  data,
+  onCancel,
+  onSave,
+  onValidateBeforeSave,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const { locale } = useContext(I18n)
+  const [localeData, setLocaleData] = useState(data.type ? data : { ...data, type: 'api' })
+  const [showEmojiPicker, setShowEmojiPicker] = useState(false)
+  const { data: codeBasedExtensionList } = useSWR(
+    '/code-based-extension?module=external_data_tool',
+    fetchCodeBasedExtensionList,
+  )
+
+  const providers: Provider[] = [
+    {
+      key: 'api',
+      name: t('common.apiBasedExtension.selector.title'),
+    },
+    ...(
+      codeBasedExtensionList
+        ? codeBasedExtensionList.data.map((item) => {
+          return {
+            key: item.name,
+            name: locale === 'zh-Hans' ? item.label['zh-Hans'] : item.label['en-US'],
+            form_schema: item.form_schema,
+          }
+        })
+        : []
+    ),
+  ]
+  const currentProvider = providers.find(provider => provider.key === localeData.type)
+
+  const handleDataTypeChange = (type: string) => {
+    let config: undefined | Record<string, any>
+    const currProvider = providers.find(provider => provider.key === type)
+
+    if (systemTypes.findIndex(t => t === type) < 0 && currProvider?.form_schema) {
+      config = currProvider?.form_schema.reduce((prev, next) => {
+        prev[next.variable] = next.default
+        return prev
+      }, {} as Record<string, any>)
+    }
+    setLocaleData({
+      ...localeData,
+      type,
+      config,
+    })
+  }
+
+  const handleDataExtraChange = (extraValue: Record<string, string>) => {
+    setLocaleData({
+      ...localeData,
+      config: {
+        ...localeData.config,
+        ...extraValue,
+      },
+    })
+  }
+
+  const handleValueChange = (value: Record<string, string>) => {
+    setLocaleData({
+      ...localeData,
+      ...value,
+    })
+  }
+
+  const handleDataApiBasedChange = (apiBasedExtensionId: string) => {
+    setLocaleData({
+      ...localeData,
+      config: {
+        ...localeData.config,
+        api_based_extension_id: apiBasedExtensionId,
+      },
+    })
+  }
+
+  const formatData = (originData: ExternalDataTool) => {
+    const { type, config } = originData
+    const params: Record<string, string | undefined> = {}
+
+    if (type === 'api')
+      params.api_based_extension_id = config?.api_based_extension_id
+
+    if (systemTypes.findIndex(t => t === type) < 0 && currentProvider?.form_schema) {
+      currentProvider.form_schema.forEach((form) => {
+        params[form.variable] = config?.[form.variable]
+      })
+    }
+
+    return {
+      ...originData,
+      type,
+      enabled: data.type ? data.enabled : true,
+      config: {
+        ...params,
+      },
+    }
+  }
+
+  const handleSave = () => {
+    if (!localeData.type) {
+      notify({ type: 'error', message: t('appDebug.errorMessage.valueOfVarRequired', { key: t('appDebug.feature.tools.modal.toolType.title') }) })
+      return
+    }
+
+    if (!localeData.label) {
+      notify({ type: 'error', message: t('appDebug.errorMessage.valueOfVarRequired', { key: t('appDebug.feature.tools.modal.name.title') }) })
+      return
+    }
+
+    if (!localeData.variable) {
+      notify({ type: 'error', message: t('appDebug.errorMessage.valueOfVarRequired', { key: t('appDebug.feature.tools.modal.variableName.title') }) })
+      return
+    }
+
+    if (localeData.variable && !/[a-zA-Z_]\w{0,29}/g.test(localeData.variable)) {
+      notify({ type: 'error', message: t('appDebug.varKeyError.notValid', { key: t('appDebug.feature.tools.modal.variableName.title') }) })
+      return
+    }
+
+    if (localeData.type === 'api' && !localeData.config?.api_based_extension_id) {
+      notify({ type: 'error', message: t('appDebug.errorMessage.valueOfVarRequired', { key: locale !== LanguagesSupported[1] ? 'API Extension' : 'API 鎵╁睍' }) })
+      return
+    }
+
+    if (systemTypes.findIndex(t => t === localeData.type) < 0 && currentProvider?.form_schema) {
+      for (let i = 0; i < currentProvider.form_schema.length; i++) {
+        if (!localeData.config?.[currentProvider.form_schema[i].variable] && currentProvider.form_schema[i].required) {
+          notify({
+            type: 'error',
+            message: t('appDebug.errorMessage.valueOfVarRequired', { key: locale !== LanguagesSupported[1] ? currentProvider.form_schema[i].label['en-US'] : currentProvider.form_schema[i].label['zh-Hans'] }),
+          })
+          return
+        }
+      }
+    }
+
+    const formattedData = formatData(localeData)
+
+    if (onValidateBeforeSave && !onValidateBeforeSave(formattedData))
+      return
+
+    onSave(formatData(formattedData))
+  }
+
+  const action = data.type ? t('common.operation.edit') : t('common.operation.add')
+
+  return (
+    <Modal
+      isShow
+      onClose={noop}
+      className='!w-[640px] !max-w-none !p-8 !pb-6'
+    >
+      <div className='mb-2 text-xl font-semibold text-gray-900'>
+        {`${action} ${t('appDebug.variableConfig.apiBasedVar')}`}
+      </div>
+      <div className='py-2'>
+        <div className='text-sm font-medium leading-9 text-gray-900'>
+          {t('common.apiBasedExtension.type')}
+        </div>
+        <SimpleSelect
+          defaultValue={localeData.type}
+          items={providers.map((option) => {
+            return {
+              value: option.key,
+              name: option.name,
+            }
+          })}
+          onSelect={item => handleDataTypeChange(item.value as string)}
+        />
+      </div>
+      <div className='py-2'>
+        <div className='text-sm font-medium leading-9 text-gray-900'>
+          {t('appDebug.feature.tools.modal.name.title')}
+        </div>
+        <div className='flex items-center'>
+          <input
+            value={localeData.label || ''}
+            onChange={e => handleValueChange({ label: e.target.value })}
+            className='mr-2 block h-9 grow appearance-none rounded-lg bg-gray-100 px-3 text-sm text-gray-900 outline-none'
+            placeholder={t('appDebug.feature.tools.modal.name.placeholder') || ''}
+          />
+          <AppIcon size='large'
+            onClick={() => { setShowEmojiPicker(true) }}
+            className='!h-9 !w-9 cursor-pointer rounded-lg border-[0.5px] border-black/5 '
+            icon={localeData.icon}
+            background={localeData.icon_background}
+          />
+        </div>
+      </div>
+      <div className='py-2'>
+        <div className='text-sm font-medium leading-9 text-gray-900'>
+          {t('appDebug.feature.tools.modal.variableName.title')}
+        </div>
+        <input
+          value={localeData.variable || ''}
+          onChange={e => handleValueChange({ variable: e.target.value })}
+          className='block h-9 w-full appearance-none rounded-lg bg-gray-100 px-3 text-sm text-gray-900 outline-none'
+          placeholder={t('appDebug.feature.tools.modal.variableName.placeholder') || ''}
+        />
+      </div>
+      {
+        localeData.type === 'api' && (
+          <div className='py-2'>
+            <div className='flex h-9 items-center justify-between text-sm font-medium text-gray-900'>
+              {t('common.apiBasedExtension.selector.title')}
+              <a
+                href={t('common.apiBasedExtension.linkUrl') || '/'}
+                target='_blank' rel='noopener noreferrer'
+                className='group flex items-center text-xs font-normal text-gray-500 hover:text-primary-600'
+              >
+                <BookOpen01 className='mr-1 h-3 w-3 text-gray-500 group-hover:text-primary-600' />
+                {t('common.apiBasedExtension.link')}
+              </a>
+            </div>
+            <ApiBasedExtensionSelector
+              value={localeData.config?.api_based_extension_id || ''}
+              onChange={handleDataApiBasedChange}
+            />
+          </div>
+        )
+      }
+      {
+        systemTypes.findIndex(t => t === localeData.type) < 0
+        && currentProvider?.form_schema
+        && (
+          <FormGeneration
+            forms={currentProvider?.form_schema}
+            value={localeData.config}
+            onChange={handleDataExtraChange}
+          />
+        )
+      }
+      <div className='mt-6 flex items-center justify-end'>
+        <Button
+          onClick={onCancel}
+          className='mr-2'
+        >
+          {t('common.operation.cancel')}
+        </Button>
+        <Button
+          variant='primary'
+          onClick={handleSave}
+        >
+          {t('common.operation.save')}
+        </Button>
+      </div>
+      {
+        showEmojiPicker && (
+          <EmojiPicker
+            onSelect={(icon, icon_background) => {
+              handleValueChange({ icon, icon_background })
+              setShowEmojiPicker(false)
+            }}
+            onClose={() => {
+              handleValueChange({ icon: '', icon_background: '' })
+              setShowEmojiPicker(false)
+            }}
+          />
+        )
+      }
+    </Modal>
+  )
+}
+
+export default ExternalDataToolModal
diff --git a/app/components/app/configuration/tools/index.tsx b/app/components/app/configuration/tools/index.tsx
new file mode 100644
index 0000000..ba586bb
--- /dev/null
+++ b/app/components/app/configuration/tools/index.tsx
@@ -0,0 +1,191 @@
+// abandoned
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import copy from 'copy-to-clipboard'
+import { useContext } from 'use-context-selector'
+import {
+  RiAddLine,
+  RiArrowDownSLine,
+  RiDeleteBinLine,
+} from '@remixicon/react'
+import ConfigContext from '@/context/debug-configuration'
+import Switch from '@/app/components/base/switch'
+import Tooltip from '@/app/components/base/tooltip'
+import { Tool03 } from '@/app/components/base/icons/src/vender/solid/general'
+import {
+  Settings01,
+} from '@/app/components/base/icons/src/vender/line/general'
+import { useModalContext } from '@/context/modal-context'
+import type { ExternalDataTool } from '@/models/common'
+import AppIcon from '@/app/components/base/app-icon'
+import { useToastContext } from '@/app/components/base/toast'
+
+const Tools = () => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const { setShowExternalDataToolModal } = useModalContext()
+  const {
+    externalDataToolsConfig,
+    setExternalDataToolsConfig,
+    modelConfig,
+  } = useContext(ConfigContext)
+  const [expanded, setExpanded] = useState(true)
+  const [copied, setCopied] = useState(false)
+
+  const handleSaveExternalDataToolModal = (externalDataTool: ExternalDataTool, index: number) => {
+    if (index > -1) {
+      setExternalDataToolsConfig([
+        ...externalDataToolsConfig.slice(0, index),
+        externalDataTool,
+        ...externalDataToolsConfig.slice(index + 1),
+      ])
+    }
+    else {
+      setExternalDataToolsConfig([...externalDataToolsConfig, externalDataTool])
+    }
+  }
+  const handleValidateBeforeSaveExternalDataToolModal = (newExternalDataTool: ExternalDataTool, index: number) => {
+    const promptVariables = modelConfig?.configs?.prompt_variables || []
+    for (let i = 0; i < promptVariables.length; i++) {
+      if (promptVariables[i].key === newExternalDataTool.variable) {
+        notify({ type: 'error', message: t('appDebug.varKeyError.keyAlreadyExists', { key: promptVariables[i].key }) })
+        return false
+      }
+    }
+
+    let existedExternalDataTools = []
+    if (index > -1) {
+      existedExternalDataTools = [
+        ...externalDataToolsConfig.slice(0, index),
+        ...externalDataToolsConfig.slice(index + 1),
+      ]
+    }
+    else {
+      existedExternalDataTools = [...externalDataToolsConfig]
+    }
+
+    for (let i = 0; i < existedExternalDataTools.length; i++) {
+      if (existedExternalDataTools[i].variable === newExternalDataTool.variable) {
+        notify({ type: 'error', message: t('appDebug.varKeyError.keyAlreadyExists', { key: existedExternalDataTools[i].variable }) })
+        return false
+      }
+    }
+
+    return true
+  }
+  const handleOpenExternalDataToolModal = (payload: ExternalDataTool, index: number) => {
+    setShowExternalDataToolModal({
+      payload,
+      onSaveCallback: (externalDataTool: ExternalDataTool) => handleSaveExternalDataToolModal(externalDataTool, index),
+      onValidateBeforeSaveCallback: (newExternalDataTool: ExternalDataTool) => handleValidateBeforeSaveExternalDataToolModal(newExternalDataTool, index),
+    })
+  }
+
+  return (
+    <div className='mt-3 rounded-xl bg-gray-50 px-3'>
+      <div className='flex h-12 items-center'>
+        <div className='flex grow items-center'>
+          <div
+            className={`
+              group mr-1 flex h-6 w-6 items-center justify-center rounded-md
+              ${externalDataToolsConfig.length && 'hover:bg-white hover:shadow-xs'}
+            `}
+            onClick={() => setExpanded(v => !v)}
+          >
+            {
+              externalDataToolsConfig.length
+                ? <Tool03 className='h-4 w-4 text-[#444CE7] group-hover:hidden' />
+                : <Tool03 className='h-4 w-4 text-[#444CE7]' />
+            }
+            {
+              !!externalDataToolsConfig.length && (
+                <RiArrowDownSLine className={`hidden h-4 w-4 cursor-pointer text-primary-600 group-hover:block ${expanded ? 'rotate-180' : 'rotate-0'}`} />
+              )
+            }
+          </div>
+          <div className='mr-1 text-sm font-semibold text-gray-800'>
+            {t('appDebug.feature.tools.title')}
+          </div>
+          <Tooltip
+            popupContent={
+              <div className='max-w-[160px]'>
+                {t('appDebug.feature.tools.tips')}
+              </div>
+            }
+          />
+        </div>
+        {
+          !expanded && !!externalDataToolsConfig.length && (
+            <>
+              <div className='mr-3 text-xs text-gray-500'>{t('appDebug.feature.tools.toolsInUse', { count: externalDataToolsConfig.length })}</div>
+              <div className='mr-1 h-3.5 w-[1px] bg-gray-200' />
+            </>
+          )
+        }
+        <div
+          className='flex h-7 cursor-pointer items-center px-3 text-xs font-medium text-gray-700'
+          onClick={() => handleOpenExternalDataToolModal({}, -1)}
+        >
+          <RiAddLine className='mr-[5px] h-3.5 w-3.5 ' />
+          {t('common.operation.add')}
+        </div>
+      </div>
+      {
+        expanded && !!externalDataToolsConfig.length && (
+          <div className='pb-3'>
+            {
+              externalDataToolsConfig.map((item, index: number) => (
+                <div
+                  key={`${index}-${item.type}-${item.label}-${item.variable}`}
+                  className='group mb-1 flex items-center rounded-lg border-[0.5px] border-gray-200 bg-white px-2.5 py-2 shadow-xs last-of-type:mb-0'
+                >
+                  <div className='flex grow items-center'>
+                    <AppIcon size='large'
+                      className='mr-2 !h-6 !w-6 rounded-md border-[0.5px] border-black/5'
+                      icon={item.icon}
+                      background={item.icon_background}
+                    />
+                    <div className='mr-2 text-[13px] font-medium text-gray-800'>{item.label}</div>
+                    <Tooltip
+                      popupContent={copied ? t('appApi.copied') : `${item.variable}, ${t('appApi.copy')}`}
+                    >
+                      <div
+                        className='text-xs text-gray-500'
+                        onClick={() => {
+                          copy(item.variable || '')
+                          setCopied(true)
+                        }}
+                      >
+                        {item.variable}
+                      </div>
+                    </Tooltip>
+                  </div>
+                  <div
+                    className='mr-1 hidden h-6 w-6 cursor-pointer items-center justify-center rounded-md hover:bg-black/5 group-hover:flex'
+                    onClick={() => handleOpenExternalDataToolModal(item, index)}
+                  >
+                    <Settings01 className='h-4 w-4 text-gray-500' />
+                  </div>
+                  <div
+                    className='group/action hidden h-6 w-6 cursor-pointer items-center justify-center rounded-md hover:bg-[#FEE4E2] group-hover:flex'
+                    onClick={() => setExternalDataToolsConfig([...externalDataToolsConfig.slice(0, index), ...externalDataToolsConfig.slice(index + 1)])}
+                  >
+                    <RiDeleteBinLine className='h-4 w-4 text-gray-500 group-hover/action:text-[#D92D20]' />
+                  </div>
+                  <div className='ml-2 mr-3 hidden h-3.5 w-[1px] bg-gray-200 group-hover:block' />
+                  <Switch
+                    size='l'
+                    defaultValue={item.enabled}
+                    onChange={(enabled: boolean) => handleSaveExternalDataToolModal({ ...item, enabled }, index)}
+                  />
+                </div>
+              ))
+            }
+          </div>
+        )
+      }
+    </div>
+  )
+}
+
+export default Tools
diff --git a/app/components/app/create-app-dialog/app-card/index.tsx b/app/components/app/create-app-dialog/app-card/index.tsx
new file mode 100644
index 0000000..7f7ede0
--- /dev/null
+++ b/app/components/app/create-app-dialog/app-card/index.tsx
@@ -0,0 +1,60 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { PlusIcon } from '@heroicons/react/20/solid'
+import { AppTypeIcon, AppTypeLabel } from '../../type-selector'
+import Button from '@/app/components/base/button'
+import cn from '@/utils/classnames'
+import type { App } from '@/models/explore'
+import AppIcon from '@/app/components/base/app-icon'
+
+export type AppCardProps = {
+  app: App
+  canCreate: boolean
+  onCreate: () => void
+}
+
+const AppCard = ({
+  app,
+  onCreate,
+}: AppCardProps) => {
+  const { t } = useTranslation()
+  const { app: appBasicInfo } = app
+  return (
+    <div className={cn('group relative flex h-[132px] cursor-pointer flex-col overflow-hidden rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg p-4  shadow-xs hover:shadow-lg')}>
+      <div className='flex shrink-0 grow-0 items-center gap-3 pb-2'>
+        <div className='relative shrink-0'>
+          <AppIcon
+            size='large'
+            iconType={appBasicInfo.icon_type}
+            icon={appBasicInfo.icon}
+            background={appBasicInfo.icon_background}
+            imageUrl={appBasicInfo.icon_url}
+          />
+          <AppTypeIcon wrapperClassName='absolute -bottom-0.5 -right-0.5 w-4 h-4 rounded-[4px] border border-divider-regular outline outline-components-panel-on-panel-item-bg'
+            className='h-3 w-3' type={appBasicInfo.mode} />
+        </div>
+        <div className='flex grow flex-col gap-1'>
+          <div className='line-clamp-1'>
+            <span className='system-md-semibold text-text-secondary' title={appBasicInfo.name}>{appBasicInfo.name}</span>
+          </div>
+          <AppTypeLabel className='system-2xs-medium-uppercase text-text-tertiary' type={app.app.mode} />
+        </div>
+      </div>
+      <div className="system-xs-regular py-1 text-text-tertiary">
+        <div className='line-clamp-3'>
+          {app.description}
+        </div>
+      </div>
+      <div className={cn('absolute bottom-0 left-0 right-0 hidden bg-gradient-to-t from-components-panel-gradient-2 from-[60.27%] to-transparent p-4 pt-8 group-hover:flex')}>
+        <div className={cn('flex h-8 w-full items-center space-x-2')}>
+          <Button variant='primary' className='grow' onClick={() => onCreate()}>
+            <PlusIcon className='mr-1 h-4 w-4' />
+            <span className='text-xs'>{t('app.newApp.useTemplate')}</span>
+          </Button>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default AppCard
diff --git a/app/components/app/create-app-dialog/app-list/index.tsx b/app/components/app/create-app-dialog/app-list/index.tsx
new file mode 100644
index 0000000..0b0b325
--- /dev/null
+++ b/app/components/app/create-app-dialog/app-list/index.tsx
@@ -0,0 +1,253 @@
+'use client'
+
+import React, { useMemo, useState } from 'react'
+import { useRouter } from 'next/navigation'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import useSWR from 'swr'
+import { useDebounceFn } from 'ahooks'
+import { RiRobot2Line } from '@remixicon/react'
+import AppCard from '../app-card'
+import Sidebar, { AppCategories, AppCategoryLabel } from './sidebar'
+import Toast from '@/app/components/base/toast'
+import Divider from '@/app/components/base/divider'
+import cn from '@/utils/classnames'
+import ExploreContext from '@/context/explore-context'
+import type { App } from '@/models/explore'
+import { fetchAppDetail, fetchAppList } from '@/service/explore'
+import { importDSL } from '@/service/apps'
+import { useTabSearchParams } from '@/hooks/use-tab-searchparams'
+import CreateAppModal from '@/app/components/explore/create-app-modal'
+import AppTypeSelector from '@/app/components/app/type-selector'
+import type { CreateAppModalProps } from '@/app/components/explore/create-app-modal'
+import Loading from '@/app/components/base/loading'
+import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
+import { useAppContext } from '@/context/app-context'
+import { getRedirection } from '@/utils/app-redirection'
+import Input from '@/app/components/base/input'
+import type { AppMode } from '@/types/app'
+import { DSLImportMode } from '@/models/app'
+import { usePluginDependencies } from '@/app/components/workflow/plugin-dependency/hooks'
+
+type AppsProps = {
+  onSuccess?: () => void
+  onCreateFromBlank?: () => void
+}
+
+// export enum PageType {
+//   EXPLORE = 'explore',
+//   CREATE = 'create',
+// }
+
+const Apps = ({
+  onSuccess,
+  onCreateFromBlank,
+}: AppsProps) => {
+  const { t } = useTranslation()
+  const { isCurrentWorkspaceEditor } = useAppContext()
+  const { push } = useRouter()
+  const { hasEditPermission } = useContext(ExploreContext)
+  const allCategoriesEn = AppCategories.RECOMMENDED
+
+  const [keywords, setKeywords] = useState('')
+  const [searchKeywords, setSearchKeywords] = useState('')
+
+  const { run: handleSearch } = useDebounceFn(() => {
+    setSearchKeywords(keywords)
+  }, { wait: 500 })
+
+  const handleKeywordsChange = (value: string) => {
+    setKeywords(value)
+    handleSearch()
+  }
+
+  const [currentType, setCurrentType] = useState<AppMode[]>([])
+  const [currCategory, setCurrCategory] = useTabSearchParams({
+    defaultTab: allCategoriesEn,
+    disableSearchParams: true,
+  })
+
+  const {
+    data: { categories, allList },
+  } = useSWR(
+    ['/explore/apps'],
+    () =>
+      fetchAppList().then(({ categories, recommended_apps }) => ({
+        categories,
+        allList: recommended_apps.sort((a, b) => a.position - b.position),
+      })),
+    {
+      fallbackData: {
+        categories: [],
+        allList: [],
+      },
+    },
+  )
+
+  const filteredList = useMemo(() => {
+    const filteredByCategory = allList.filter((item) => {
+      if (currCategory === allCategoriesEn)
+        return true
+      return item.category === currCategory
+    })
+    if (currentType.length === 0)
+      return filteredByCategory
+    return filteredByCategory.filter((item) => {
+      if (currentType.includes('chat') && item.app.mode === 'chat')
+        return true
+      if (currentType.includes('advanced-chat') && item.app.mode === 'advanced-chat')
+        return true
+      if (currentType.includes('agent-chat') && item.app.mode === 'agent-chat')
+        return true
+      if (currentType.includes('completion') && item.app.mode === 'completion')
+        return true
+      if (currentType.includes('workflow') && item.app.mode === 'workflow')
+        return true
+      return false
+    })
+  }, [currentType, currCategory, allCategoriesEn, allList])
+
+  const searchFilteredList = useMemo(() => {
+    if (!searchKeywords || !filteredList || filteredList.length === 0)
+      return filteredList
+
+    const lowerCaseSearchKeywords = searchKeywords.toLowerCase()
+
+    return filteredList.filter(item =>
+      item.app && item.app.name && item.app.name.toLowerCase().includes(lowerCaseSearchKeywords),
+    )
+  }, [searchKeywords, filteredList])
+
+  const [currApp, setCurrApp] = React.useState<App | null>(null)
+  const [isShowCreateModal, setIsShowCreateModal] = React.useState(false)
+  const { handleCheckPluginDependencies } = usePluginDependencies()
+  const onCreate: CreateAppModalProps['onConfirm'] = async ({
+    name,
+    icon_type,
+    icon,
+    icon_background,
+    description,
+  }) => {
+    const { export_data, mode } = await fetchAppDetail(
+      currApp?.app.id as string,
+    )
+    try {
+      const app = await importDSL({
+        mode: DSLImportMode.YAML_CONTENT,
+        yaml_content: export_data,
+        name,
+        icon_type,
+        icon,
+        icon_background,
+        description,
+      })
+      setIsShowCreateModal(false)
+      Toast.notify({
+        type: 'success',
+        message: t('app.newApp.appCreated'),
+      })
+      if (onSuccess)
+        onSuccess()
+      if (app.app_id)
+        await handleCheckPluginDependencies(app.app_id)
+      localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
+      getRedirection(isCurrentWorkspaceEditor, { id: app.app_id!, mode }, push)
+    }
+    catch {
+      Toast.notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
+    }
+  }
+
+  if (!categories || categories.length === 0) {
+    return (
+      <div className="flex h-full items-center">
+        <Loading type="area" />
+      </div>
+    )
+  }
+
+  return (
+    <div className='flex h-full flex-col'>
+      <div className='flex items-center justify-between border-b border-divider-burn py-3'>
+        <div className='min-w-[180px] pl-5'>
+          <span className='title-xl-semi-bold text-text-primary'>{t('app.newApp.startFromTemplate')}</span>
+        </div>
+        <div className='flex max-w-[548px] flex-1 items-center rounded-xl border border-components-panel-border bg-components-panel-bg-blur p-1.5 shadow-md'>
+          <AppTypeSelector value={currentType} onChange={setCurrentType} />
+          <div className='h-[14px]'>
+            <Divider type='vertical' />
+          </div>
+          <Input
+            showClearIcon
+            wrapperClassName='w-full flex-1'
+            className='bg-transparent hover:border-transparent hover:bg-transparent focus:border-transparent focus:bg-transparent focus:shadow-none'
+            placeholder={t('app.newAppFromTemplate.searchAllTemplate') as string}
+            value={keywords}
+            onChange={e => handleKeywordsChange(e.target.value)}
+            onClear={() => handleKeywordsChange('')}
+          />
+        </div>
+        <div className='h-8 w-[180px]'></div>
+      </div>
+      <div className='relative flex flex-1 overflow-y-auto'>
+        {!searchKeywords && <div className='h-full w-[200px] p-4'>
+          <Sidebar current={currCategory as AppCategories} categories={categories} onClick={(category) => { setCurrCategory(category) }} onCreateFromBlank={onCreateFromBlank} />
+        </div>}
+        <div className='h-full flex-1 shrink-0 grow overflow-auto border-l border-divider-burn p-6 pt-2'>
+          {searchFilteredList && searchFilteredList.length > 0 && <>
+            <div className='pb-1 pt-4'>
+              {searchKeywords
+                ? <p className='title-md-semi-bold text-text-tertiary'>{searchFilteredList.length > 1 ? t('app.newApp.foundResults', { count: searchFilteredList.length }) : t('app.newApp.foundResult', { count: searchFilteredList.length })}</p>
+                : <div className='flex h-[22px] items-center'>
+                  <AppCategoryLabel category={currCategory as AppCategories} className='title-md-semi-bold text-text-primary' />
+                </div>}
+            </div>
+            <div
+              className={cn(
+                'grid shrink-0 grid-cols-1 content-start gap-3 sm:grid-cols-1 md:grid-cols-2 xl:grid-cols-4 2xl:grid-cols-5 2k:grid-cols-6',
+              )}>
+              {searchFilteredList.map(app => (
+                <AppCard
+                  key={app.app_id}
+                  app={app}
+                  canCreate={hasEditPermission}
+                  onCreate={() => {
+                    setCurrApp(app)
+                    setIsShowCreateModal(true)
+                  }}
+                />
+              ))}
+            </div>
+          </>}
+          {(!searchFilteredList || searchFilteredList.length === 0) && <NoTemplateFound />}
+        </div>
+      </div>
+      {isShowCreateModal && (
+        <CreateAppModal
+          appIconType={currApp?.app.icon_type || 'emoji'}
+          appIcon={currApp?.app.icon || ''}
+          appIconBackground={currApp?.app.icon_background || ''}
+          appIconUrl={currApp?.app.icon_url}
+          appName={currApp?.app.name || ''}
+          appDescription={currApp?.app.description || ''}
+          show={isShowCreateModal}
+          onConfirm={onCreate}
+          onHide={() => setIsShowCreateModal(false)}
+        />
+      )}
+    </div>
+  )
+}
+
+export default React.memo(Apps)
+
+function NoTemplateFound() {
+  const { t } = useTranslation()
+  return <div className='w-full rounded-lg bg-workflow-process-bg p-4'>
+    <div className='mb-2 inline-flex h-8 w-8 items-center justify-center rounded-lg bg-components-card-bg shadow-lg'>
+      <RiRobot2Line className='h-5 w-5 text-text-tertiary' />
+    </div>
+    <p className='title-md-semi-bold text-text-primary'>{t('app.newApp.noTemplateFound')}</p>
+    <p className='system-sm-regular text-text-tertiary'>{t('app.newApp.noTemplateFoundTip')}</p>
+  </div>
+}
diff --git a/app/components/app/create-app-dialog/app-list/sidebar.tsx b/app/components/app/create-app-dialog/app-list/sidebar.tsx
new file mode 100644
index 0000000..346de07
--- /dev/null
+++ b/app/components/app/create-app-dialog/app-list/sidebar.tsx
@@ -0,0 +1,60 @@
+'use client'
+import { RiStickyNoteAddLine, RiThumbUpLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import classNames from '@/utils/classnames'
+import Divider from '@/app/components/base/divider'
+
+export enum AppCategories {
+  RECOMMENDED = 'Recommended',
+}
+
+type SidebarProps = {
+  current: AppCategories | string
+  categories: string[]
+  onClick?: (category: AppCategories | string) => void
+  onCreateFromBlank?: () => void
+}
+
+export default function Sidebar({ current, categories, onClick, onCreateFromBlank }: SidebarProps) {
+  const { t } = useTranslation()
+  return <div className="flex h-full w-full flex-col">
+    <ul className='pt-0.5'>
+      <CategoryItem category={AppCategories.RECOMMENDED} active={current === AppCategories.RECOMMENDED} onClick={onClick} />
+    </ul>
+    <div className='system-xs-medium-uppercase mb-0.5 mt-3 px-3 pb-1 pt-2 text-text-tertiary'>{t('app.newAppFromTemplate.byCategories')}</div>
+    <ul className='flex grow flex-col gap-0.5'>
+      {categories.map(category => (<CategoryItem key={category} category={category} active={current === category} onClick={onClick} />))}
+    </ul>
+    <Divider bgStyle='gradient' />
+    <div className='flex cursor-pointer items-center gap-1 px-3 py-1 text-text-tertiary' onClick={onCreateFromBlank}>
+      <RiStickyNoteAddLine className='h-3.5 w-3.5' />
+      <span className='system-xs-regular'>{t('app.newApp.startFromBlank')}</span>
+    </div>
+  </div>
+}
+
+type CategoryItemProps = {
+  active: boolean
+  category: AppCategories | string
+  onClick?: (category: AppCategories | string) => void
+}
+function CategoryItem({ category, active, onClick }: CategoryItemProps) {
+  return <li
+    className={classNames('p-1 pl-3 h-8 rounded-lg flex items-center gap-2 group cursor-pointer hover:bg-state-base-hover [&.active]:bg-state-base-active', active && 'active')}
+    onClick={() => { onClick?.(category) }}>
+    {category === AppCategories.RECOMMENDED && <div className='inline-flex h-5 w-5 items-center justify-center rounded-md'>
+      <RiThumbUpLine className='h-4 w-4 text-components-menu-item-text group-[.active]:text-components-menu-item-text-active' />
+    </div>}
+    <AppCategoryLabel category={category}
+      className={classNames('system-sm-medium text-components-menu-item-text group-[.active]:text-components-menu-item-text-active group-hover:text-components-menu-item-text-hover', active && 'system-sm-semibold')} />
+  </li >
+}
+
+type AppCategoryLabelProps = {
+  category: AppCategories | string
+  className?: string
+}
+export function AppCategoryLabel({ category, className }: AppCategoryLabelProps) {
+  const { t } = useTranslation()
+  return <span className={className}>{category === AppCategories.RECOMMENDED ? t('app.newAppFromTemplate.sidebar.Recommended') : category}</span>
+}
diff --git a/app/components/app/create-app-dialog/index.tsx b/app/components/app/create-app-dialog/index.tsx
new file mode 100644
index 0000000..794bbbf
--- /dev/null
+++ b/app/components/app/create-app-dialog/index.tsx
@@ -0,0 +1,36 @@
+'use client'
+import { useCallback } from 'react'
+import { useKeyPress } from 'ahooks'
+import AppList from './app-list'
+import FullScreenModal from '@/app/components/base/fullscreen-modal'
+
+type CreateAppDialogProps = {
+  show: boolean
+  onSuccess: () => void
+  onClose: () => void
+  onCreateFromBlank?: () => void
+}
+
+const CreateAppTemplateDialog = ({ show, onSuccess, onClose, onCreateFromBlank }: CreateAppDialogProps) => {
+  const handleEscKeyPress = useCallback(() => {
+    if (show)
+      onClose()
+  }, [show, onClose])
+
+  useKeyPress('esc', handleEscKeyPress)
+
+  return (
+    <FullScreenModal
+      open={show}
+      closable
+      onClose={onClose}
+    >
+      <AppList onCreateFromBlank={onCreateFromBlank} onSuccess={() => {
+        onSuccess()
+        onClose()
+      }} />
+    </FullScreenModal>
+  )
+}
+
+export default CreateAppTemplateDialog
diff --git a/app/components/app/create-app-modal/index.tsx b/app/components/app/create-app-modal/index.tsx
new file mode 100644
index 0000000..f91f440
--- /dev/null
+++ b/app/components/app/create-app-modal/index.tsx
@@ -0,0 +1,364 @@
+'use client'
+
+import { useCallback, useEffect, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+
+import { useRouter, useSearchParams } from 'next/navigation'
+import { useContext, useContextSelector } from 'use-context-selector'
+import { RiArrowRightLine, RiCommandLine, RiCornerDownLeftLine, RiExchange2Fill } from '@remixicon/react'
+import Link from 'next/link'
+import { useDebounceFn, useKeyPress } from 'ahooks'
+import Image from 'next/image'
+import AppIconPicker from '../../base/app-icon-picker'
+import type { AppIconSelection } from '../../base/app-icon-picker'
+import Button from '@/app/components/base/button'
+import Divider from '@/app/components/base/divider'
+import cn from '@/utils/classnames'
+import { WEB_PREFIX } from '@/config'
+import AppsContext, { useAppContext } from '@/context/app-context'
+import { useProviderContext } from '@/context/provider-context'
+import { ToastContext } from '@/app/components/base/toast'
+import type { AppMode } from '@/types/app'
+import { AppModes } from '@/types/app'
+import { createApp } from '@/service/apps'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import AppIcon from '@/app/components/base/app-icon'
+import AppsFull from '@/app/components/billing/apps-full-in-dialog'
+import { BubbleTextMod, ChatBot, ListSparkle, Logic } from '@/app/components/base/icons/src/vender/solid/communication'
+import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
+import { getRedirection } from '@/utils/app-redirection'
+import FullScreenModal from '@/app/components/base/fullscreen-modal'
+import useTheme from '@/hooks/use-theme'
+
+type CreateAppProps = {
+  onSuccess: () => void
+  onClose: () => void
+  onCreateFromTemplate?: () => void
+}
+
+function CreateApp({ onClose, onSuccess, onCreateFromTemplate }: CreateAppProps) {
+  const { t } = useTranslation()
+  const { push } = useRouter()
+  const { notify } = useContext(ToastContext)
+  const mutateApps = useContextSelector(AppsContext, state => state.mutateApps)
+
+  const [appMode, setAppMode] = useState<AppMode>('chat')
+  const [appIcon, setAppIcon] = useState<AppIconSelection>({ type: 'emoji', icon: '馃', background: '#FFEAD5' })
+  const [showAppIconPicker, setShowAppIconPicker] = useState(false)
+  const [name, setName] = useState('')
+  const [description, setDescription] = useState('')
+
+  const { plan, enableBilling } = useProviderContext()
+  const isAppsFull = (enableBilling && plan.usage.buildApps >= plan.total.buildApps)
+  const { isCurrentWorkspaceEditor } = useAppContext()
+
+  const isCreatingRef = useRef(false)
+
+  const searchParams = useSearchParams()
+
+  useEffect(() => {
+    const category = searchParams.get('category')
+    if (category && AppModes.includes(category as AppMode))
+      setAppMode(category as AppMode)
+  }, [searchParams])
+
+  const onCreate = useCallback(async () => {
+    if (!appMode) {
+      notify({ type: 'error', message: t('app.newApp.appTypeRequired') })
+      return
+    }
+    if (!name.trim()) {
+      notify({ type: 'error', message: t('app.newApp.nameNotEmpty') })
+      return
+    }
+    if (isCreatingRef.current)
+      return
+    isCreatingRef.current = true
+    try {
+      const app = await createApp({
+        name,
+        description,
+        icon_type: appIcon.type,
+        icon: appIcon.type === 'emoji' ? appIcon.icon : appIcon.fileId,
+        icon_background: appIcon.type === 'emoji' ? appIcon.background : undefined,
+        mode: appMode,
+      })
+      notify({ type: 'success', message: t('app.newApp.appCreated') })
+      onSuccess()
+      onClose()
+      mutateApps()
+      localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
+      getRedirection(isCurrentWorkspaceEditor, app, push)
+    }
+    catch {
+      notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
+    }
+    isCreatingRef.current = false
+  }, [name, notify, t, appMode, appIcon, description, onSuccess, onClose, mutateApps, push, isCurrentWorkspaceEditor])
+
+  const { run: handleCreateApp } = useDebounceFn(onCreate, { wait: 300 })
+  useKeyPress(['meta.enter', 'ctrl.enter'], () => {
+    if (isAppsFull)
+      return
+    handleCreateApp()
+  })
+  return <>
+    <div className='flex h-full justify-center overflow-y-auto overflow-x-hidden'>
+      <div className='flex flex-1 shrink-0 justify-end'>
+        <div className='px-10'>
+          <div className='h-6 w-full 2xl:h-[139px]' />
+          <div className='pb-6 pt-1'>
+            <span className='title-2xl-semi-bold text-text-primary'>{t('app.newApp.startFromBlank')}</span>
+          </div>
+          <div className='mb-2 leading-6'>
+            <span className='system-sm-semibold text-text-secondary'>{t('app.newApp.chooseAppType')}</span>
+          </div>
+          <div className='flex w-[660px] flex-col gap-4'>
+            <div>
+              <div className='mb-2'>
+                <span className='system-2xs-medium-uppercase text-text-tertiary'>{t('app.newApp.forBeginners')}</span>
+              </div>
+              <div className='flex flex-row gap-2'>
+                <AppTypeCard
+                  active={appMode === 'chat'}
+                  title={t('app.types.chatbot')}
+                  description={t('app.newApp.chatbotShortDescription')}
+                  icon={<div className='flex h-6 w-6 items-center justify-center rounded-md bg-components-icon-bg-blue-solid'>
+                    <ChatBot className='h-4 w-4 text-components-avatar-shape-fill-stop-100' />
+                  </div>}
+                  onClick={() => {
+                    setAppMode('chat')
+                  }} />
+                <AppTypeCard
+                  active={appMode === 'agent-chat'}
+                  title={t('app.types.agent')}
+                  description={t('app.newApp.agentShortDescription')}
+                  icon={<div className='flex h-6 w-6 items-center justify-center rounded-md bg-components-icon-bg-violet-solid'>
+                    <Logic className='h-4 w-4 text-components-avatar-shape-fill-stop-100' />
+                  </div>}
+                  onClick={() => {
+                    setAppMode('agent-chat')
+                  }} />
+                <AppTypeCard
+                  active={appMode === 'completion'}
+                  title={t('app.newApp.completeApp')}
+                  description={t('app.newApp.completionShortDescription')}
+                  icon={<div className='flex h-6 w-6 items-center justify-center rounded-md bg-components-icon-bg-teal-solid'>
+                    <ListSparkle className='h-4 w-4 text-components-avatar-shape-fill-stop-100' />
+                  </div>}
+                  onClick={() => {
+                    setAppMode('completion')
+                  }} />
+              </div>
+            </div>
+            <div>
+              <div className='mb-2'>
+                <span className='system-2xs-medium-uppercase text-text-tertiary'>{t('app.newApp.forAdvanced')}</span>
+              </div>
+              <div className='flex flex-row gap-2'>
+                <AppTypeCard
+                  active={appMode === 'advanced-chat'}
+                  title={t('app.types.advanced')}
+                  description={t('app.newApp.advancedShortDescription')}
+                  icon={<div className='flex h-6 w-6 items-center justify-center rounded-md bg-components-icon-bg-blue-light-solid'>
+                    <BubbleTextMod className='h-4 w-4 text-components-avatar-shape-fill-stop-100' />
+                  </div>}
+                  onClick={() => {
+                    setAppMode('advanced-chat')
+                  }} />
+                <AppTypeCard
+                  active={appMode === 'workflow'}
+                  title={t('app.types.workflow')}
+                  description={t('app.newApp.workflowShortDescription')}
+                  icon={<div className='flex h-6 w-6 items-center justify-center rounded-md bg-components-icon-bg-indigo-solid'>
+                    <RiExchange2Fill className='h-4 w-4 text-components-avatar-shape-fill-stop-100' />
+                  </div>}
+                  onClick={() => {
+                    setAppMode('workflow')
+                  }} />
+              </div>
+            </div>
+            <Divider style={{ margin: 0 }} />
+            <div className='flex items-center space-x-3'>
+              <div className='flex-1'>
+                <div className='mb-1 flex h-6 items-center'>
+                  <label className='system-sm-semibold text-text-secondary'>{t('app.newApp.captionName')}</label>
+                </div>
+                <Input
+                  value={name}
+                  onChange={e => setName(e.target.value)}
+                  placeholder={t('app.newApp.appNamePlaceholder') || ''}
+                />
+              </div>
+              <AppIcon
+                iconType={appIcon.type}
+                icon={appIcon.type === 'emoji' ? appIcon.icon : appIcon.fileId}
+                background={appIcon.type === 'emoji' ? appIcon.background : undefined}
+                imageUrl={appIcon.type === 'image' ? appIcon.url : undefined}
+                size='xxl' className='cursor-pointer rounded-2xl'
+                onClick={() => { setShowAppIconPicker(true) }}
+              />
+              {showAppIconPicker && <AppIconPicker
+                onSelect={(payload) => {
+                  setAppIcon(payload)
+                  setShowAppIconPicker(false)
+                }}
+                onClose={() => {
+                  setShowAppIconPicker(false)
+                }}
+              />}
+            </div>
+            <div>
+              <div className='mb-1 flex h-6 items-center'>
+                <label className='system-sm-semibold text-text-secondary'>{t('app.newApp.captionDescription')}</label>
+                <span className='system-xs-regular ml-1 text-text-tertiary'>({t('app.newApp.optional')})</span>
+              </div>
+              <Textarea
+                className='resize-none'
+                placeholder={t('app.newApp.appDescriptionPlaceholder') || ''}
+                value={description}
+                onChange={e => setDescription(e.target.value)}
+              />
+            </div>
+          </div>
+          {isAppsFull && <AppsFull className='mt-4' loc='app-create' />}
+          <div className='flex items-center justify-between pb-10 pt-5'>
+            <div className='system-xs-regular flex cursor-pointer items-center gap-1 text-text-tertiary' onClick={onCreateFromTemplate}>
+              <span>{t('app.newApp.noIdeaTip')}</span>
+              <div className='p-[1px]'>
+                <RiArrowRightLine className='h-3.5 w-3.5' />
+              </div>
+            </div>
+            <div className='flex gap-2'>
+              <Button onClick={onClose}>{t('app.newApp.Cancel')}</Button>
+              <Button disabled={isAppsFull || !name} className='gap-1' variant="primary" onClick={handleCreateApp}>
+                <span>{t('app.newApp.Create')}</span>
+                <div className='flex gap-0.5'>
+                  <RiCommandLine size={14} className='system-kbd rounded-sm bg-components-kbd-bg-white p-0.5' />
+                  <RiCornerDownLeftLine size={14} className='system-kbd rounded-sm bg-components-kbd-bg-white p-0.5' />
+                </div>
+              </Button>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div className='relative flex h-full flex-1 shrink justify-start overflow-hidden'>
+        <div className='absolute left-0 right-0 top-0 h-6 border-b border-b-divider-subtle 2xl:h-[139px]'></div>
+        <div className='max-w-[760px] border-x border-x-divider-subtle'>
+          <div className='h-6 2xl:h-[139px]' />
+          <AppPreview mode={appMode} />
+          <div className='absolute left-0 right-0 border-b border-b-divider-subtle'></div>
+          <div className='flex h-[448px] w-[664px] items-center justify-center' style={{ background: 'repeating-linear-gradient(135deg, transparent, transparent 2px, rgba(16,24,40,0.04) 4px,transparent 3px, transparent 6px)' }}>
+            <AppScreenShot show={appMode === 'chat'} mode='chat' />
+            <AppScreenShot show={appMode === 'advanced-chat'} mode='advanced-chat' />
+            <AppScreenShot show={appMode === 'agent-chat'} mode='agent-chat' />
+            <AppScreenShot show={appMode === 'completion'} mode='completion' />
+            <AppScreenShot show={appMode === 'workflow'} mode='workflow' />
+          </div>
+          <div className='absolute left-0 right-0 border-b border-b-divider-subtle'></div>
+        </div>
+      </div>
+    </div>
+  </>
+}
+type CreateAppDialogProps = CreateAppProps & {
+  show: boolean
+}
+const CreateAppModal = ({ show, onClose, onSuccess, onCreateFromTemplate }: CreateAppDialogProps) => {
+  return (
+    <FullScreenModal
+      overflowVisible
+      closable
+      open={show}
+      onClose={onClose}
+    >
+      <CreateApp onClose={onClose} onSuccess={onSuccess} onCreateFromTemplate={onCreateFromTemplate} />
+    </FullScreenModal>
+  )
+}
+
+export default CreateAppModal
+
+type AppTypeCardProps = {
+  icon: React.JSX.Element
+  title: string
+  description: string
+  active: boolean
+  onClick: () => void
+}
+function AppTypeCard({ icon, title, description, active, onClick }: AppTypeCardProps) {
+  return <div
+    className={
+      cn(`relative box-content h-[84px] w-[191px] cursor-pointer rounded-xl
+      border-[0.5px] border-components-option-card-option-border
+      bg-components-panel-on-panel-item-bg p-3 shadow-xs hover:shadow-md`, active
+        ? 'shadow-md outline outline-[1.5px] outline-components-option-card-option-selected-border'
+        : '')
+    }
+    onClick={onClick}
+  >
+    {icon}
+    <div className='system-sm-semibold mb-0.5 mt-2 text-text-secondary'>{title}</div>
+    <div className='system-xs-regular text-text-tertiary'>{description}</div>
+  </div>
+}
+
+function AppPreview({ mode }: { mode: AppMode }) {
+  const { t } = useTranslation()
+  const modeToPreviewInfoMap = {
+    'chat': {
+      title: t('app.types.chatbot'),
+      description: t('app.newApp.chatbotUserDescription'),
+      link: 'https://docs.dify.ai/guides/application-orchestrate/readme',
+    },
+    'advanced-chat': {
+      title: t('app.types.advanced'),
+      description: t('app.newApp.advancedUserDescription'),
+      link: 'https://docs.dify.ai/en/guides/workflow/README',
+    },
+    'agent-chat': {
+      title: t('app.types.agent'),
+      description: t('app.newApp.agentUserDescription'),
+      link: 'https://docs.dify.ai/en/guides/application-orchestrate/agent',
+    },
+    'completion': {
+      title: t('app.newApp.completeApp'),
+      description: t('app.newApp.completionUserDescription'),
+      link: null,
+    },
+    'workflow': {
+      title: t('app.types.workflow'),
+      description: t('app.newApp.workflowUserDescription'),
+      link: 'https://docs.dify.ai/en/guides/workflow/README',
+    },
+  }
+  const previewInfo = modeToPreviewInfoMap[mode]
+  return <div className='px-8 py-4'>
+    <h4 className='system-sm-semibold-uppercase text-text-secondary'>{previewInfo.title}</h4>
+    <div className='system-xs-regular mt-1 min-h-8 max-w-96 text-text-tertiary'>
+      <span>{previewInfo.description}</span>
+      {previewInfo.link && <Link target='_blank' href={previewInfo.link} className='ml-1 text-text-accent'>{t('app.newApp.learnMore')}</Link>}
+    </div>
+  </div>
+}
+
+function AppScreenShot({ mode, show }: { mode: AppMode; show: boolean }) {
+  const { theme } = useTheme()
+  const modeToImageMap = {
+    'chat': 'Chatbot',
+    'advanced-chat': 'Chatflow',
+    'agent-chat': 'Agent',
+    'completion': 'TextGenerator',
+    'workflow': 'Workflow',
+  }
+  return <picture>
+    <source media="(resolution: 1x)" srcSet={`${WEB_PREFIX}/screenshots/${theme}/${modeToImageMap[mode]}.png`} />
+    <source media="(resolution: 2x)" srcSet={`${WEB_PREFIX}/screenshots/${theme}/${modeToImageMap[mode]}@2x.png`} />
+    <source media="(resolution: 3x)" srcSet={`${WEB_PREFIX}/screenshots/${theme}/${modeToImageMap[mode]}@3x.png`} />
+    <Image className={show ? '' : 'hidden'}
+      src={`${WEB_PREFIX}/screenshots/${theme}/${modeToImageMap[mode]}.png`}
+      alt='App Screen Shot'
+      width={664} height={448} />
+  </picture>
+}
diff --git a/app/components/app/create-from-dsl-modal/dsl-confirm-modal.tsx b/app/components/app/create-from-dsl-modal/dsl-confirm-modal.tsx
new file mode 100644
index 0000000..e6aadaa
--- /dev/null
+++ b/app/components/app/create-from-dsl-modal/dsl-confirm-modal.tsx
@@ -0,0 +1,46 @@
+import { useTranslation } from 'react-i18next'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+
+type DSLConfirmModalProps = {
+  versions?: {
+    importedVersion: string
+    systemVersion: string
+  }
+  onCancel: () => void
+  onConfirm: () => void
+  confirmDisabled?: boolean
+}
+const DSLConfirmModal = ({
+  versions = { importedVersion: '', systemVersion: '' },
+  onCancel,
+  onConfirm,
+  confirmDisabled = false,
+}: DSLConfirmModalProps) => {
+  const { t } = useTranslation()
+
+  return (
+    <Modal
+      isShow
+      onClose={() => onCancel()}
+      className='w-[480px]'
+    >
+      <div className='flex flex-col items-start gap-2 self-stretch pb-4'>
+        <div className='title-2xl-semi-bold text-text-primary'>{t('app.newApp.appCreateDSLErrorTitle')}</div>
+        <div className='system-md-regular flex grow flex-col text-text-secondary'>
+          <div>{t('app.newApp.appCreateDSLErrorPart1')}</div>
+          <div>{t('app.newApp.appCreateDSLErrorPart2')}</div>
+          <br />
+          <div>{t('app.newApp.appCreateDSLErrorPart3')}<span className='system-md-medium'>{versions.importedVersion}</span></div>
+          <div>{t('app.newApp.appCreateDSLErrorPart4')}<span className='system-md-medium'>{versions.systemVersion}</span></div>
+        </div>
+      </div>
+      <div className='flex items-start justify-end gap-2 self-stretch pt-6'>
+        <Button variant='secondary' onClick={() => onCancel()}>{t('app.newApp.Cancel')}</Button>
+        <Button variant='primary' destructive onClick={onConfirm} disabled={confirmDisabled}>{t('app.newApp.Confirm')}</Button>
+      </div>
+    </Modal>
+  )
+}
+
+export default DSLConfirmModal
diff --git a/app/components/app/create-from-dsl-modal/index.tsx b/app/components/app/create-from-dsl-modal/index.tsx
new file mode 100644
index 0000000..9739ac4
--- /dev/null
+++ b/app/components/app/create-from-dsl-modal/index.tsx
@@ -0,0 +1,320 @@
+'use client'
+
+import type { MouseEventHandler } from 'react'
+import { useMemo, useRef, useState } from 'react'
+import { useRouter } from 'next/navigation'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine, RiCommandLine, RiCornerDownLeftLine } from '@remixicon/react'
+import { useDebounceFn, useKeyPress } from 'ahooks'
+import Uploader from './uploader'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Modal from '@/app/components/base/modal'
+import { ToastContext } from '@/app/components/base/toast'
+import {
+  importDSL,
+  importDSLConfirm,
+} from '@/service/apps'
+import {
+  DSLImportMode,
+  DSLImportStatus,
+} from '@/models/app'
+import { useAppContext } from '@/context/app-context'
+import { useProviderContext } from '@/context/provider-context'
+import AppsFull from '@/app/components/billing/apps-full-in-dialog'
+import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
+import { getRedirection } from '@/utils/app-redirection'
+import cn from '@/utils/classnames'
+import { usePluginDependencies } from '@/app/components/workflow/plugin-dependency/hooks'
+import { noop } from 'lodash-es'
+
+type CreateFromDSLModalProps = {
+  show: boolean
+  onSuccess?: () => void
+  onClose: () => void
+  activeTab?: string
+  dslUrl?: string
+}
+
+export enum CreateFromDSLModalTab {
+  FROM_FILE = 'from-file',
+  FROM_URL = 'from-url',
+}
+
+const CreateFromDSLModal = ({ show, onSuccess, onClose, activeTab = CreateFromDSLModalTab.FROM_FILE, dslUrl = '' }: CreateFromDSLModalProps) => {
+  const { push } = useRouter()
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const [currentFile, setDSLFile] = useState<File>()
+  const [fileContent, setFileContent] = useState<string>()
+  const [currentTab, setCurrentTab] = useState(activeTab)
+  const [dslUrlValue, setDslUrlValue] = useState(dslUrl)
+  const [showErrorModal, setShowErrorModal] = useState(false)
+  const [versions, setVersions] = useState<{ importedVersion: string; systemVersion: string }>()
+  const [importId, setImportId] = useState<string>()
+  const { handleCheckPluginDependencies } = usePluginDependencies()
+
+  const readFile = (file: File) => {
+    const reader = new FileReader()
+    reader.onload = function (event) {
+      const content = event.target?.result
+      setFileContent(content as string)
+    }
+    reader.readAsText(file)
+  }
+
+  const handleFile = (file?: File) => {
+    setDSLFile(file)
+    if (file)
+      readFile(file)
+    if (!file)
+      setFileContent('')
+  }
+
+  const { isCurrentWorkspaceEditor } = useAppContext()
+  const { plan, enableBilling } = useProviderContext()
+  const isAppsFull = (enableBilling && plan.usage.buildApps >= plan.total.buildApps)
+
+  const isCreatingRef = useRef(false)
+
+  const onCreate: MouseEventHandler = async () => {
+    if (currentTab === CreateFromDSLModalTab.FROM_FILE && !currentFile)
+      return
+    if (currentTab === CreateFromDSLModalTab.FROM_URL && !dslUrlValue)
+      return
+    if (isCreatingRef.current)
+      return
+    isCreatingRef.current = true
+    try {
+      let response
+
+      if (currentTab === CreateFromDSLModalTab.FROM_FILE) {
+        response = await importDSL({
+          mode: DSLImportMode.YAML_CONTENT,
+          yaml_content: fileContent || '',
+        })
+      }
+      if (currentTab === CreateFromDSLModalTab.FROM_URL) {
+        response = await importDSL({
+          mode: DSLImportMode.YAML_URL,
+          yaml_url: dslUrlValue || '',
+        })
+      }
+
+      if (!response)
+        return
+      const { id, status, app_id, app_mode, imported_dsl_version, current_dsl_version } = response
+      if (status === DSLImportStatus.COMPLETED || status === DSLImportStatus.COMPLETED_WITH_WARNINGS) {
+        if (onSuccess)
+          onSuccess()
+        if (onClose)
+          onClose()
+
+        notify({
+          type: status === DSLImportStatus.COMPLETED ? 'success' : 'warning',
+          message: t(status === DSLImportStatus.COMPLETED ? 'app.newApp.appCreated' : 'app.newApp.caution'),
+          children: status === DSLImportStatus.COMPLETED_WITH_WARNINGS && t('app.newApp.appCreateDSLWarning'),
+        })
+        localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
+        if (app_id)
+          await handleCheckPluginDependencies(app_id)
+        getRedirection(isCurrentWorkspaceEditor, { id: app_id!, mode: app_mode }, push)
+      }
+      else if (status === DSLImportStatus.PENDING) {
+        setVersions({
+          importedVersion: imported_dsl_version ?? '',
+          systemVersion: current_dsl_version ?? '',
+        })
+        if (onClose)
+          onClose()
+        setTimeout(() => {
+          setShowErrorModal(true)
+        }, 300)
+        setImportId(id)
+      }
+      else {
+        notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
+      }
+    }
+    // eslint-disable-next-line unused-imports/no-unused-vars
+    catch (e) {
+      notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
+    }
+    isCreatingRef.current = false
+  }
+
+  const { run: handleCreateApp } = useDebounceFn(onCreate, { wait: 300 })
+
+  useKeyPress(['meta.enter', 'ctrl.enter'], () => {
+    if (show && !isAppsFull && ((currentTab === CreateFromDSLModalTab.FROM_FILE && currentFile) || (currentTab === CreateFromDSLModalTab.FROM_URL && dslUrlValue)))
+      handleCreateApp()
+  })
+
+  useKeyPress('esc', () => {
+    if (show && !showErrorModal)
+      onClose()
+  })
+
+  const onDSLConfirm: MouseEventHandler = async () => {
+    try {
+      if (!importId)
+        return
+      const response = await importDSLConfirm({
+        import_id: importId,
+      })
+
+      const { status, app_id, app_mode } = response
+
+      if (status === DSLImportStatus.COMPLETED) {
+        if (onSuccess)
+          onSuccess()
+        if (onClose)
+          onClose()
+
+        notify({
+          type: 'success',
+          message: t('app.newApp.appCreated'),
+        })
+        if (app_id)
+          await handleCheckPluginDependencies(app_id)
+        localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
+        getRedirection(isCurrentWorkspaceEditor, { id: app_id!, mode: app_mode }, push)
+      }
+      else if (status === DSLImportStatus.FAILED) {
+        notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
+      }
+    }
+    // eslint-disable-next-line unused-imports/no-unused-vars
+    catch (e) {
+      notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
+    }
+  }
+
+  const tabs = [
+    {
+      key: CreateFromDSLModalTab.FROM_FILE,
+      label: t('app.importFromDSLFile'),
+    },
+    {
+      key: CreateFromDSLModalTab.FROM_URL,
+      label: t('app.importFromDSLUrl'),
+    },
+  ]
+
+  const buttonDisabled = useMemo(() => {
+    if (isAppsFull)
+      return true
+    if (currentTab === CreateFromDSLModalTab.FROM_FILE)
+      return !currentFile
+    if (currentTab === CreateFromDSLModalTab.FROM_URL)
+      return !dslUrlValue
+    return false
+  }, [isAppsFull, currentTab, currentFile, dslUrlValue])
+
+  return (
+    <>
+      <Modal
+        className='w-[520px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg p-0 shadow-xl'
+        isShow={show}
+        onClose={noop}
+      >
+        <div className='title-2xl-semi-bold flex items-center justify-between pb-3 pl-6 pr-5 pt-6 text-text-primary'>
+          {t('app.importFromDSL')}
+          <div
+            className='flex h-8 w-8 cursor-pointer items-center'
+            onClick={() => onClose()}
+          >
+            <RiCloseLine className='h-5 w-5 text-text-tertiary' />
+          </div>
+        </div>
+        <div className='system-md-semibold flex h-9 items-center space-x-6 border-b border-divider-subtle px-6 text-text-tertiary'>
+          {
+            tabs.map(tab => (
+              <div
+                key={tab.key}
+                className={cn(
+                  'relative flex h-full cursor-pointer items-center',
+                  currentTab === tab.key && 'text-text-primary',
+                )}
+                onClick={() => setCurrentTab(tab.key)}
+              >
+                {tab.label}
+                {
+                  currentTab === tab.key && (
+                    <div className='absolute bottom-0 h-[2px] w-full bg-util-colors-blue-brand-blue-brand-600'></div>
+                  )
+                }
+              </div>
+            ))
+          }
+        </div>
+        <div className='px-6 py-4'>
+          {
+            currentTab === CreateFromDSLModalTab.FROM_FILE && (
+              <Uploader
+                className='mt-0'
+                file={currentFile}
+                updateFile={handleFile}
+              />
+            )
+          }
+          {
+            currentTab === CreateFromDSLModalTab.FROM_URL && (
+              <div>
+                <div className='system-md-semibold mb-1 text-text-secondary'>DSL URL</div>
+                <Input
+                  placeholder={t('app.importFromDSLUrlPlaceholder') || ''}
+                  value={dslUrlValue}
+                  onChange={e => setDslUrlValue(e.target.value)}
+                />
+              </div>
+            )
+          }
+        </div>
+        {isAppsFull && (
+          <div className='px-6'>
+            <AppsFull className='mt-0' loc='app-create-dsl' />
+          </div>
+        )}
+        <div className='flex justify-end px-6 py-5'>
+          <Button className='mr-2' onClick={onClose}>{t('app.newApp.Cancel')}</Button>
+          <Button
+            disabled={buttonDisabled}
+            variant="primary"
+            onClick={handleCreateApp}
+            className="gap-1"
+          >
+            <span>{t('app.newApp.Create')}</span>
+            <div className='flex gap-0.5'>
+              <RiCommandLine size={14} className='system-kbd rounded-sm bg-components-kbd-bg-white p-0.5' />
+              <RiCornerDownLeftLine size={14} className='system-kbd rounded-sm bg-components-kbd-bg-white p-0.5' />
+            </div>
+          </Button>
+        </div>
+      </Modal>
+      <Modal
+        isShow={showErrorModal}
+        onClose={() => setShowErrorModal(false)}
+        className='w-[480px]'
+      >
+        <div className='flex flex-col items-start gap-2 self-stretch pb-4'>
+          <div className='title-2xl-semi-bold text-text-primary'>{t('app.newApp.appCreateDSLErrorTitle')}</div>
+          <div className='system-md-regular flex grow flex-col text-text-secondary'>
+            <div>{t('app.newApp.appCreateDSLErrorPart1')}</div>
+            <div>{t('app.newApp.appCreateDSLErrorPart2')}</div>
+            <br />
+            <div>{t('app.newApp.appCreateDSLErrorPart3')}<span className='system-md-medium'>{versions?.importedVersion}</span></div>
+            <div>{t('app.newApp.appCreateDSLErrorPart4')}<span className='system-md-medium'>{versions?.systemVersion}</span></div>
+          </div>
+        </div>
+        <div className='flex items-start justify-end gap-2 self-stretch pt-6'>
+          <Button variant='secondary' onClick={() => setShowErrorModal(false)}>{t('app.newApp.Cancel')}</Button>
+          <Button variant='primary' destructive onClick={onDSLConfirm}>{t('app.newApp.Confirm')}</Button>
+        </div>
+      </Modal>
+    </>
+  )
+}
+
+export default CreateFromDSLModal
diff --git a/app/components/app/create-from-dsl-modal/uploader.tsx b/app/components/app/create-from-dsl-modal/uploader.tsx
new file mode 100644
index 0000000..6ad4116
--- /dev/null
+++ b/app/components/app/create-from-dsl-modal/uploader.tsx
@@ -0,0 +1,141 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useRef, useState } from 'react'
+import {
+  RiDeleteBinLine,
+  RiUploadCloud2Line,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { formatFileSize } from '@/utils/format'
+import cn from '@/utils/classnames'
+import { Yaml as YamlIcon } from '@/app/components/base/icons/src/public/files'
+import { ToastContext } from '@/app/components/base/toast'
+import ActionButton from '@/app/components/base/action-button'
+
+export type Props = {
+  file: File | undefined
+  updateFile: (file?: File) => void
+  className?: string
+}
+
+const Uploader: FC<Props> = ({
+  file,
+  updateFile,
+  className,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const [dragging, setDragging] = useState(false)
+  const dropRef = useRef<HTMLDivElement>(null)
+  const dragRef = useRef<HTMLDivElement>(null)
+  const fileUploader = useRef<HTMLInputElement>(null)
+
+  const handleDragEnter = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+    e.target !== dragRef.current && setDragging(true)
+  }
+  const handleDragOver = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+  }
+  const handleDragLeave = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+    e.target === dragRef.current && setDragging(false)
+  }
+  const handleDrop = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+    setDragging(false)
+    if (!e.dataTransfer)
+      return
+    const files = [...e.dataTransfer.files]
+    if (files.length > 1) {
+      notify({ type: 'error', message: t('datasetCreation.stepOne.uploader.validation.count') })
+      return
+    }
+    updateFile(files[0])
+  }
+  const selectHandle = () => {
+    const originalFile = file
+    if (fileUploader.current) {
+      fileUploader.current.value = ''
+      fileUploader.current.click()
+      // If no file is selected, restore the original file
+      fileUploader.current.oncancel = () => updateFile(originalFile)
+    }
+  }
+  const removeFile = () => {
+    if (fileUploader.current)
+      fileUploader.current.value = ''
+    updateFile()
+  }
+  const fileChangeHandle = (e: React.ChangeEvent<HTMLInputElement>) => {
+    const currentFile = e.target.files?.[0]
+    updateFile(currentFile)
+  }
+
+  useEffect(() => {
+    dropRef.current?.addEventListener('dragenter', handleDragEnter)
+    dropRef.current?.addEventListener('dragover', handleDragOver)
+    dropRef.current?.addEventListener('dragleave', handleDragLeave)
+    dropRef.current?.addEventListener('drop', handleDrop)
+    return () => {
+      dropRef.current?.removeEventListener('dragenter', handleDragEnter)
+      dropRef.current?.removeEventListener('dragover', handleDragOver)
+      dropRef.current?.removeEventListener('dragleave', handleDragLeave)
+      dropRef.current?.removeEventListener('drop', handleDrop)
+    }
+  }, [])
+
+  return (
+    <div className={cn('mt-6', className)}>
+      <input
+        ref={fileUploader}
+        style={{ display: 'none' }}
+        type="file"
+        id="fileUploader"
+        accept='.yaml,.yml'
+        onChange={fileChangeHandle}
+      />
+      <div ref={dropRef}>
+        {!file && (
+          <div className={cn('flex h-12 items-center rounded-[10px] border border-dashed border-components-dropzone-border bg-components-dropzone-bg text-sm font-normal', dragging && 'border-components-dropzone-border-accent bg-components-dropzone-bg-accent')}>
+            <div className='flex w-full items-center justify-center space-x-2'>
+              <RiUploadCloud2Line className='h-6 w-6 text-text-tertiary' />
+              <div className='text-text-tertiary'>
+                {t('datasetCreation.stepOne.uploader.button')}
+                <span className='cursor-pointer pl-1 text-text-accent' onClick={selectHandle}>{t('datasetDocuments.list.batchModal.browse')}</span>
+              </div>
+            </div>
+            {dragging && <div ref={dragRef} className='absolute left-0 top-0 h-full w-full' />}
+          </div>
+        )}
+        {file && (
+          <div className={cn('group flex items-center rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg shadow-xs', ' hover:bg-components-panel-on-panel-item-bg-hover')}>
+            <div className='flex items-center justify-center p-3'>
+              <YamlIcon className="h-6 w-6 shrink-0" />
+            </div>
+            <div className='flex grow flex-col items-start gap-0.5 py-1 pr-2'>
+              <span className='font-inter max-w-[calc(100%_-_30px)] overflow-hidden text-ellipsis whitespace-nowrap text-[12px] font-medium leading-4 text-text-secondary'>{file.name}</span>
+              <div className='font-inter flex h-3 items-center gap-1 self-stretch text-[10px] font-medium uppercase leading-3 text-text-tertiary'>
+                <span>YAML</span>
+                <span className='text-text-quaternary'>路</span>
+                <span>{formatFileSize(file.size)}</span>
+              </div>
+            </div>
+            <div className='hidden items-center pr-3 group-hover:flex'>
+              <ActionButton onClick={removeFile}>
+                <RiDeleteBinLine className='h-4 w-4 text-text-tertiary' />
+              </ActionButton>
+            </div>
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Uploader)
diff --git a/app/components/app/duplicate-modal/index.tsx b/app/components/app/duplicate-modal/index.tsx
new file mode 100644
index 0000000..f98fb83
--- /dev/null
+++ b/app/components/app/duplicate-modal/index.tsx
@@ -0,0 +1,124 @@
+'use client'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import AppIconPicker from '../../base/app-icon-picker'
+import cn from '@/utils/classnames'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Toast from '@/app/components/base/toast'
+import AppIcon from '@/app/components/base/app-icon'
+import { useProviderContext } from '@/context/provider-context'
+import AppsFull from '@/app/components/billing/apps-full-in-dialog'
+import type { AppIconType } from '@/types/app'
+import { noop } from 'lodash-es'
+
+export type DuplicateAppModalProps = {
+  appName: string
+  icon_type: AppIconType | null
+  icon: string
+  icon_background?: string | null
+  icon_url?: string | null
+  show: boolean
+  onConfirm: (info: {
+    name: string
+    icon_type: AppIconType
+    icon: string
+    icon_background?: string | null
+  }) => Promise<void>
+  onHide: () => void
+}
+
+const DuplicateAppModal = ({
+  appName,
+  icon_type,
+  icon,
+  icon_background,
+  icon_url,
+  show = false,
+  onConfirm,
+  onHide,
+}: DuplicateAppModalProps) => {
+  const { t } = useTranslation()
+
+  const [name, setName] = React.useState(appName)
+
+  const [showAppIconPicker, setShowAppIconPicker] = useState(false)
+  const [appIcon, setAppIcon] = useState(
+    icon_type === 'image'
+      ? { type: 'image' as const, url: icon_url, fileId: icon }
+      : { type: 'emoji' as const, icon, background: icon_background },
+  )
+
+  const { plan, enableBilling } = useProviderContext()
+  const isAppsFull = (enableBilling && plan.usage.buildApps >= plan.total.buildApps)
+
+  const submit = () => {
+    if (!name.trim()) {
+      Toast.notify({ type: 'error', message: t('explore.appCustomize.nameRequired') })
+      return
+    }
+    onConfirm({
+      name,
+      icon_type: appIcon.type,
+      icon: appIcon.type === 'emoji' ? appIcon.icon : appIcon.fileId,
+      icon_background: appIcon.type === 'emoji' ? appIcon.background : undefined,
+    })
+    onHide()
+  }
+
+  return (
+    <>
+      <Modal
+        isShow={show}
+        onClose={noop}
+        className={cn('relative !max-w-[480px]', 'px-8')}
+      >
+        <div className='absolute right-4 top-4 cursor-pointer p-2' onClick={onHide}>
+          <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+        </div>
+        <div className='relative mb-9 mt-3 text-xl font-semibold leading-[30px] text-text-primary'>{t('app.duplicateTitle')}</div>
+        <div className='system-sm-regular mb-9 text-text-secondary'>
+          <div className='system-md-medium mb-2'>{t('explore.appCustomize.subTitle')}</div>
+          <div className='flex items-center justify-between space-x-2'>
+            <AppIcon
+              size='large'
+              onClick={() => { setShowAppIconPicker(true) }}
+              className='cursor-pointer'
+              iconType={appIcon.type}
+              icon={appIcon.type === 'image' ? appIcon.fileId : appIcon.icon}
+              background={appIcon.type === 'image' ? undefined : appIcon.background}
+              imageUrl={appIcon.type === 'image' ? appIcon.url : undefined}
+            />
+            <Input
+              value={name}
+              onChange={e => setName(e.target.value)}
+              className='h-10'
+            />
+          </div>
+          {isAppsFull && <AppsFull className='mt-4' loc='app-duplicate-create' />}
+        </div>
+        <div className='flex flex-row-reverse'>
+          <Button disabled={isAppsFull} className='ml-2 w-24' variant='primary' onClick={submit}>{t('app.duplicate')}</Button>
+          <Button className='w-24' onClick={onHide}>{t('common.operation.cancel')}</Button>
+        </div>
+      </Modal>
+      {showAppIconPicker && <AppIconPicker
+        onSelect={(payload) => {
+          setAppIcon(payload)
+          setShowAppIconPicker(false)
+        }}
+        onClose={() => {
+          setAppIcon(icon_type === 'image'
+            ? { type: 'image', url: icon_url!, fileId: icon }
+            : { type: 'emoji', icon, background: icon_background! })
+          setShowAppIconPicker(false)
+        }}
+      />}
+    </>
+
+  )
+}
+
+export default DuplicateAppModal
diff --git a/app/components/app/log-annotation/index.tsx b/app/components/app/log-annotation/index.tsx
new file mode 100644
index 0000000..12a611e
--- /dev/null
+++ b/app/components/app/log-annotation/index.tsx
@@ -0,0 +1,63 @@
+'use client'
+import type { FC } from 'react'
+import React, { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useRouter } from 'next/navigation'
+import cn from '@/utils/classnames'
+import Log from '@/app/components/app/log'
+import WorkflowLog from '@/app/components/app/workflow-log'
+import Annotation from '@/app/components/app/annotation'
+import Loading from '@/app/components/base/loading'
+import { PageType } from '@/app/components/base/features/new-feature-panel/annotation-reply/type'
+import TabSlider from '@/app/components/base/tab-slider-plain'
+import { useStore as useAppStore } from '@/app/components/app/store'
+
+type Props = {
+  pageType: PageType
+}
+
+const LogAnnotation: FC<Props> = ({
+  pageType,
+}) => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const appDetail = useAppStore(state => state.appDetail)
+
+  const options = useMemo(() => {
+    if (appDetail?.mode === 'completion')
+      return [{ value: PageType.log, text: t('appLog.title') }]
+    return [
+      { value: PageType.log, text: t('appLog.title') },
+      { value: PageType.annotation, text: t('appAnnotation.title') },
+    ]
+  }, [appDetail?.mode, t])
+
+  if (!appDetail) {
+    return (
+      <div className='flex h-full items-center justify-center bg-background-body'>
+        <Loading />
+      </div>
+    )
+  }
+
+  return (
+    <div className='flex h-full flex-col px-6 pt-3'>
+      {appDetail.mode !== 'workflow' && (
+        <TabSlider
+          className='shrink-0'
+          value={pageType}
+          onChange={(value) => {
+            router.push(`/app/${appDetail.id}/${value === PageType.log ? 'logs' : 'annotations'}`)
+          }}
+          options={options}
+        />
+      )}
+      <div className={cn('h-0 grow', appDetail.mode !== 'workflow' && 'mt-3')}>
+        {pageType === PageType.log && appDetail.mode !== 'workflow' && (<Log appDetail={appDetail} />)}
+        {pageType === PageType.annotation && (<Annotation appDetail={appDetail} />)}
+        {pageType === PageType.log && appDetail.mode === 'workflow' && (<WorkflowLog appDetail={appDetail} />)}
+      </div>
+    </div>
+  )
+}
+export default React.memo(LogAnnotation)
diff --git a/app/components/app/log/filter.tsx b/app/components/app/log/filter.tsx
new file mode 100644
index 0000000..6e259a2
--- /dev/null
+++ b/app/components/app/log/filter.tsx
@@ -0,0 +1,101 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import useSWR from 'swr'
+import dayjs from 'dayjs'
+import { RiCalendarLine } from '@remixicon/react'
+import quarterOfYear from 'dayjs/plugin/quarterOfYear'
+import type { QueryParam } from './index'
+import Chip from '@/app/components/base/chip'
+import Input from '@/app/components/base/input'
+import Sort from '@/app/components/base/sort'
+import { fetchAnnotationsCount } from '@/service/log'
+dayjs.extend(quarterOfYear)
+
+const today = dayjs()
+
+export const TIME_PERIOD_MAPPING: { [key: string]: { value: number; name: string } } = {
+  1: { value: 0, name: 'today' },
+  2: { value: 7, name: 'last7days' },
+  3: { value: 28, name: 'last4weeks' },
+  4: { value: today.diff(today.subtract(3, 'month'), 'day'), name: 'last3months' },
+  5: { value: today.diff(today.subtract(12, 'month'), 'day'), name: 'last12months' },
+  6: { value: today.diff(today.startOf('month'), 'day'), name: 'monthToDate' },
+  7: { value: today.diff(today.startOf('quarter'), 'day'), name: 'quarterToDate' },
+  8: { value: today.diff(today.startOf('year'), 'day'), name: 'yearToDate' },
+  9: { value: -1, name: 'allTime' },
+}
+
+type IFilterProps = {
+  isChatMode?: boolean
+  appId: string
+  queryParams: QueryParam
+  setQueryParams: (v: QueryParam) => void
+}
+
+const Filter: FC<IFilterProps> = ({ isChatMode, appId, queryParams, setQueryParams }: IFilterProps) => {
+  const { data } = useSWR({ url: `/apps/${appId}/annotations/count` }, fetchAnnotationsCount)
+  const { t } = useTranslation()
+  if (!data)
+    return null
+  return (
+    <div className='mb-2 flex flex-row flex-wrap items-center gap-2'>
+      <Chip
+        className='min-w-[150px]'
+        panelClassName='w-[270px]'
+        leftIcon={<RiCalendarLine className='h-4 w-4 text-text-secondary' />}
+        value={queryParams.period}
+        onSelect={(item) => {
+          setQueryParams({ ...queryParams, period: item.value })
+        }}
+        onClear={() => setQueryParams({ ...queryParams, period: '9' })}
+        items={Object.entries(TIME_PERIOD_MAPPING).map(([k, v]) => ({ value: k, name: t(`appLog.filter.period.${v.name}`) }))}
+      />
+      <Chip
+        className='min-w-[150px]'
+        panelClassName='w-[270px]'
+        showLeftIcon={false}
+        value={queryParams.annotation_status || 'all'}
+        onSelect={(item) => {
+          setQueryParams({ ...queryParams, annotation_status: item.value as string })
+        }}
+        onClear={() => setQueryParams({ ...queryParams, annotation_status: 'all' })}
+        items={[
+          { value: 'all', name: t('appLog.filter.annotation.all') },
+          { value: 'annotated', name: t('appLog.filter.annotation.annotated', { count: data?.count }) },
+          { value: 'not_annotated', name: t('appLog.filter.annotation.not_annotated') },
+        ]}
+      />
+      <Input
+        wrapperClassName='w-[200px]'
+        showLeftIcon
+        showClearIcon
+        value={queryParams.keyword}
+        placeholder={t('common.operation.search')!}
+        onChange={(e) => {
+          setQueryParams({ ...queryParams, keyword: e.target.value })
+        }}
+        onClear={() => setQueryParams({ ...queryParams, keyword: '' })}
+      />
+      {isChatMode && (
+        <>
+          <div className='h-3.5 w-px bg-divider-regular'></div>
+          <Sort
+            order={queryParams.sort_by?.startsWith('-') ? '-' : ''}
+            value={queryParams.sort_by?.replace('-', '') || 'created_at'}
+            items={[
+              { value: 'created_at', name: t('appLog.table.header.time') },
+              { value: 'updated_at', name: t('appLog.table.header.updatedTime') },
+            ]}
+            onSelect={(value) => {
+              setQueryParams({ ...queryParams, sort_by: value as string })
+            }}
+          />
+        </>
+      )}
+    </div>
+  )
+}
+
+export default Filter
diff --git a/app/components/app/log/index.tsx b/app/components/app/log/index.tsx
new file mode 100644
index 0000000..8e523b7
--- /dev/null
+++ b/app/components/app/log/index.tsx
@@ -0,0 +1,129 @@
+'use client'
+import type { FC, SVGProps } from 'react'
+import React, { useState } from 'react'
+import useSWR from 'swr'
+import Link from 'next/link'
+import { usePathname } from 'next/navigation'
+import { useDebounce } from 'ahooks'
+import { omit } from 'lodash-es'
+import dayjs from 'dayjs'
+import { Trans, useTranslation } from 'react-i18next'
+import List from './list'
+import Filter, { TIME_PERIOD_MAPPING } from './filter'
+import Pagination from '@/app/components/base/pagination'
+import Loading from '@/app/components/base/loading'
+import { fetchChatConversations, fetchCompletionConversations } from '@/service/log'
+import { APP_PAGE_LIMIT } from '@/config'
+import type { App, AppMode } from '@/types/app'
+export type ILogsProps = {
+  appDetail: App
+}
+
+export type QueryParam = {
+  period: string
+  annotation_status?: string
+  keyword?: string
+  sort_by?: string
+}
+
+const ThreeDotsIcon = ({ className }: SVGProps<SVGElement>) => {
+  return <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" className={className ?? ''}>
+    <path d="M5 6.5V5M8.93934 7.56066L10 6.5M10.0103 11.5H11.5103" stroke="#374151" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
+  </svg>
+}
+
+const EmptyElement: FC<{ appUrl: string }> = ({ appUrl }) => {
+  const { t } = useTranslation()
+  const pathname = usePathname()
+  const pathSegments = pathname.split('/')
+  pathSegments.pop()
+  return <div className='flex h-full items-center justify-center'>
+    <div className='box-border h-fit w-[560px] rounded-2xl bg-background-section-burn px-5 py-4'>
+      <span className='system-md-semibold text-text-secondary'>{t('appLog.table.empty.element.title')}<ThreeDotsIcon className='relative -left-1.5 -top-3 inline' /></span>
+      <div className='system-sm-regular mt-2 text-text-tertiary'>
+        <Trans
+          i18nKey="appLog.table.empty.element.content"
+          components={{ shareLink: <Link href={`${pathSegments.join('/')}/overview`} className='text-util-colors-blue-blue-600' />, testLink: <Link href={appUrl} className='text-util-colors-blue-blue-600' target='_blank' rel='noopener noreferrer' /> }}
+        />
+      </div>
+    </div>
+  </div>
+}
+
+const Logs: FC<ILogsProps> = ({ appDetail }) => {
+  const { t } = useTranslation()
+  const [queryParams, setQueryParams] = useState<QueryParam>({
+    period: '2',
+    annotation_status: 'all',
+    sort_by: '-created_at',
+  })
+  const [currPage, setCurrPage] = React.useState<number>(0)
+  const [limit, setLimit] = React.useState<number>(APP_PAGE_LIMIT)
+  const debouncedQueryParams = useDebounce(queryParams, { wait: 500 })
+
+  // Get the app type first
+  const isChatMode = appDetail.mode !== 'completion'
+
+  const query = {
+    page: currPage + 1,
+    limit,
+    ...((debouncedQueryParams.period !== '9')
+      ? {
+        start: dayjs().subtract(TIME_PERIOD_MAPPING[debouncedQueryParams.period].value, 'day').startOf('day').format('YYYY-MM-DD HH:mm'),
+        end: dayjs().endOf('day').format('YYYY-MM-DD HH:mm'),
+      }
+      : {}),
+    ...(isChatMode ? { sort_by: debouncedQueryParams.sort_by } : {}),
+    ...omit(debouncedQueryParams, ['period']),
+  }
+
+  const getWebAppType = (appType: AppMode) => {
+    if (appType !== 'completion' && appType !== 'workflow')
+      return 'chat'
+    return appType
+  }
+
+  // When the details are obtained, proceed to the next request
+  const { data: chatConversations, mutate: mutateChatList } = useSWR(() => isChatMode
+    ? {
+      url: `/apps/${appDetail.id}/chat-conversations`,
+      params: query,
+    }
+    : null, fetchChatConversations)
+
+  const { data: completionConversations, mutate: mutateCompletionList } = useSWR(() => !isChatMode
+    ? {
+      url: `/apps/${appDetail.id}/completion-conversations`,
+      params: query,
+    }
+    : null, fetchCompletionConversations)
+
+  const total = isChatMode ? chatConversations?.total : completionConversations?.total
+
+  return (
+    <div className='flex h-full grow flex-col'>
+      <p className='system-sm-regular shrink-0 text-text-tertiary'>{t('appLog.description')}</p>
+      <div className='flex max-h-[calc(100%-16px)] flex-1 grow flex-col py-4'>
+        <Filter isChatMode={isChatMode} appId={appDetail.id} queryParams={queryParams} setQueryParams={setQueryParams} />
+        {total === undefined
+          ? <Loading type='app' />
+          : total > 0
+            ? <List logs={isChatMode ? chatConversations : completionConversations} appDetail={appDetail} onRefresh={isChatMode ? mutateChatList : mutateCompletionList} />
+            : <EmptyElement appUrl={`${appDetail.site.app_base_url}/${getWebAppType(appDetail.mode)}/${appDetail.site.access_token}`} />
+        }
+        {/* Show Pagination only if the total is more than the limit */}
+        {(total && total > APP_PAGE_LIMIT)
+          ? <Pagination
+            current={currPage}
+            onChange={setCurrPage}
+            total={total}
+            limit={limit}
+            onLimitChange={setLimit}
+          />
+          : null}
+      </div>
+    </div>
+  )
+}
+
+export default Logs
diff --git a/app/components/app/log/list.tsx b/app/components/app/log/list.tsx
new file mode 100644
index 0000000..7ce164c
--- /dev/null
+++ b/app/components/app/log/list.tsx
@@ -0,0 +1,764 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useRef, useState } from 'react'
+import useSWR from 'swr'
+import {
+  HandThumbDownIcon,
+  HandThumbUpIcon,
+} from '@heroicons/react/24/outline'
+import { RiCloseLine, RiEditFill } from '@remixicon/react'
+import { get } from 'lodash-es'
+import InfiniteScroll from 'react-infinite-scroll-component'
+import dayjs from 'dayjs'
+import utc from 'dayjs/plugin/utc'
+import timezone from 'dayjs/plugin/timezone'
+import { createContext, useContext } from 'use-context-selector'
+import { useShallow } from 'zustand/react/shallow'
+import { useTranslation } from 'react-i18next'
+import type { ChatItemInTree } from '../../base/chat/types'
+import Indicator from '../../header/indicator'
+import VarPanel from './var-panel'
+import type { FeedbackFunc, FeedbackType, IChatItem, SubmitAnnotationFunc } from '@/app/components/base/chat/chat/type'
+import type { Annotation, ChatConversationGeneralDetail, ChatConversationsResponse, ChatMessage, ChatMessagesRequest, CompletionConversationGeneralDetail, CompletionConversationsResponse, LogAnnotation } from '@/models/log'
+import type { App } from '@/types/app'
+import ActionButton from '@/app/components/base/action-button'
+import Loading from '@/app/components/base/loading'
+import Drawer from '@/app/components/base/drawer'
+import Chat from '@/app/components/base/chat/chat'
+import { ToastContext } from '@/app/components/base/toast'
+import { fetchChatConversationDetail, fetchChatMessages, fetchCompletionConversationDetail, updateLogMessageAnnotations, updateLogMessageFeedbacks } from '@/service/log'
+import ModelInfo from '@/app/components/app/log/model-info'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import TextGeneration from '@/app/components/app/text-generate/item'
+import { addFileInfos, sortAgentSorts } from '@/app/components/tools/utils'
+import MessageLogModal from '@/app/components/base/message-log-modal'
+import PromptLogModal from '@/app/components/base/prompt-log-modal'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { useAppContext } from '@/context/app-context'
+import useTimestamp from '@/hooks/use-timestamp'
+import Tooltip from '@/app/components/base/tooltip'
+import { CopyIcon } from '@/app/components/base/copy-icon'
+import { buildChatItemTree, getThreadMessages } from '@/app/components/base/chat/utils'
+import { getProcessedFilesFromResponse } from '@/app/components/base/file-uploader/utils'
+import cn from '@/utils/classnames'
+import { noop } from 'lodash-es'
+
+dayjs.extend(utc)
+dayjs.extend(timezone)
+
+type IConversationList = {
+  logs?: ChatConversationsResponse | CompletionConversationsResponse
+  appDetail: App
+  onRefresh: () => void
+}
+
+const defaultValue = 'N/A'
+
+type IDrawerContext = {
+  onClose: () => void
+  appDetail?: App
+}
+
+type StatusCount = {
+  success: number
+  failed: number
+  partial_success: number
+}
+
+const DrawerContext = createContext<IDrawerContext>({} as IDrawerContext)
+
+/**
+ * Icon component with numbers
+ */
+const HandThumbIconWithCount: FC<{ count: number; iconType: 'up' | 'down' }> = ({ count, iconType }) => {
+  const classname = iconType === 'up' ? 'text-primary-600 bg-primary-50' : 'text-red-600 bg-red-50'
+  const Icon = iconType === 'up' ? HandThumbUpIcon : HandThumbDownIcon
+  return <div className={`inline-flex w-fit items-center rounded-md p-1 text-xs ${classname} mr-1 last:mr-0`}>
+    <Icon className={'mr-0.5 h-3 w-3 rounded-md'} />
+    {count > 0 ? count : null}
+  </div>
+}
+
+const statusTdRender = (statusCount: StatusCount) => {
+  if (!statusCount)
+    return null
+
+  if (statusCount.partial_success + statusCount.failed === 0) {
+    return (
+      <div className='system-xs-semibold-uppercase inline-flex items-center gap-1'>
+        <Indicator color={'green'} />
+        <span className='text-util-colors-green-green-600'>Success</span>
+      </div>
+    )
+  }
+  else if (statusCount.failed === 0) {
+    return (
+      <div className='system-xs-semibold-uppercase inline-flex items-center gap-1'>
+        <Indicator color={'green'} />
+        <span className='text-util-colors-green-green-600'>Partial Success</span>
+      </div>
+    )
+  }
+  else {
+    return (
+      <div className='system-xs-semibold-uppercase inline-flex items-center gap-1'>
+        <Indicator color={'red'} />
+        <span className='text-util-colors-red-red-600'>{statusCount.failed} {`${statusCount.failed > 1 ? 'Failures' : 'Failure'}`}</span>
+      </div>
+    )
+  }
+}
+
+const getFormattedChatList = (messages: ChatMessage[], conversationId: string, timezone: string, format: string) => {
+  const newChatList: IChatItem[] = []
+  messages.forEach((item: ChatMessage) => {
+    const questionFiles = item.message_files?.filter((file: any) => file.belongs_to === 'user') || []
+    newChatList.push({
+      id: `question-${item.id}`,
+      content: item.inputs.query || item.inputs.default_input || item.query, // text generation: item.inputs.query; chat: item.query
+      isAnswer: false,
+      message_files: getProcessedFilesFromResponse(questionFiles.map((item: any) => ({ ...item, related_id: item.id }))),
+      parentMessageId: item.parent_message_id || undefined,
+    })
+
+    const answerFiles = item.message_files?.filter((file: any) => file.belongs_to === 'assistant') || []
+    newChatList.push({
+      id: item.id,
+      content: item.answer,
+      agent_thoughts: addFileInfos(item.agent_thoughts ? sortAgentSorts(item.agent_thoughts) : item.agent_thoughts, item.message_files),
+      feedback: item.feedbacks.find(item => item.from_source === 'user'), // user feedback
+      adminFeedback: item.feedbacks.find(item => item.from_source === 'admin'), // admin feedback
+      feedbackDisabled: false,
+      isAnswer: true,
+      message_files: getProcessedFilesFromResponse(answerFiles.map((item: any) => ({ ...item, related_id: item.id }))),
+      log: [
+        ...item.message,
+        ...(item.message[item.message.length - 1]?.role !== 'assistant'
+          ? [
+            {
+              role: 'assistant',
+              text: item.answer,
+              files: item.message_files?.filter((file: any) => file.belongs_to === 'assistant') || [],
+            },
+          ]
+          : []),
+      ] as IChatItem['log'],
+      workflow_run_id: item.workflow_run_id,
+      conversationId,
+      input: {
+        inputs: item.inputs,
+        query: item.query,
+      },
+      more: {
+        time: dayjs.unix(item.created_at).tz(timezone).format(format),
+        tokens: item.answer_tokens + item.message_tokens,
+        latency: item.provider_response_latency.toFixed(2),
+      },
+      citation: item.metadata?.retriever_resources,
+      annotation: (() => {
+        if (item.annotation_hit_history) {
+          return {
+            id: item.annotation_hit_history.annotation_id,
+            authorName: item.annotation_hit_history.annotation_create_account?.name || 'N/A',
+            created_at: item.annotation_hit_history.created_at,
+          }
+        }
+
+        if (item.annotation) {
+          return {
+            id: item.annotation.id,
+            authorName: item.annotation.account.name,
+            logAnnotation: item.annotation,
+            created_at: 0,
+          }
+        }
+
+        return undefined
+      })(),
+      parentMessageId: `question-${item.id}`,
+    })
+  })
+  return newChatList
+}
+
+type IDetailPanel = {
+  detail: any
+  onFeedback: FeedbackFunc
+  onSubmitAnnotation: SubmitAnnotationFunc
+}
+
+function DetailPanel({ detail, onFeedback }: IDetailPanel) {
+  const { userProfile: { timezone } } = useAppContext()
+  const { formatTime } = useTimestamp()
+  const { onClose, appDetail } = useContext(DrawerContext)
+  const { currentLogItem, setCurrentLogItem, showMessageLogModal, setShowMessageLogModal, showPromptLogModal, setShowPromptLogModal, currentLogModalActiveTab } = useAppStore(useShallow(state => ({
+    currentLogItem: state.currentLogItem,
+    setCurrentLogItem: state.setCurrentLogItem,
+    showMessageLogModal: state.showMessageLogModal,
+    setShowMessageLogModal: state.setShowMessageLogModal,
+    showPromptLogModal: state.showPromptLogModal,
+    setShowPromptLogModal: state.setShowPromptLogModal,
+    currentLogModalActiveTab: state.currentLogModalActiveTab,
+  })))
+  const { t } = useTranslation()
+  const [hasMore, setHasMore] = useState(true)
+  const [varValues, setVarValues] = useState<Record<string, string>>({})
+
+  const [allChatItems, setAllChatItems] = useState<IChatItem[]>([])
+  const [chatItemTree, setChatItemTree] = useState<ChatItemInTree[]>([])
+  const [threadChatItems, setThreadChatItems] = useState<IChatItem[]>([])
+
+  const fetchData = useCallback(async () => {
+    try {
+      if (!hasMore)
+        return
+
+      const params: ChatMessagesRequest = {
+        conversation_id: detail.id,
+        limit: 10,
+      }
+      if (allChatItems[0]?.id)
+        params.first_id = allChatItems[0]?.id.replace('question-', '')
+      const messageRes = await fetchChatMessages({
+        url: `/apps/${appDetail?.id}/chat-messages`,
+        params,
+      })
+      if (messageRes.data.length > 0) {
+        const varValues = messageRes.data.at(-1)!.inputs
+        setVarValues(varValues)
+      }
+      setHasMore(messageRes.has_more)
+
+      const newAllChatItems = [
+        ...getFormattedChatList(messageRes.data, detail.id, timezone!, t('appLog.dateTimeFormat') as string),
+        ...allChatItems,
+      ]
+      setAllChatItems(newAllChatItems)
+
+      let tree = buildChatItemTree(newAllChatItems)
+      if (messageRes.has_more === false && detail?.model_config?.configs?.introduction) {
+        tree = [{
+          id: 'introduction',
+          isAnswer: true,
+          isOpeningStatement: true,
+          content: detail?.model_config?.configs?.introduction ?? 'hello',
+          feedbackDisabled: true,
+          children: tree,
+        }]
+      }
+      setChatItemTree(tree)
+
+      setThreadChatItems(getThreadMessages(tree, newAllChatItems.at(-1)?.id))
+    }
+    catch (err) {
+      console.error(err)
+    }
+  }, [allChatItems, detail.id, hasMore, timezone, t, appDetail, detail?.model_config?.configs?.introduction])
+
+  const switchSibling = useCallback((siblingMessageId: string) => {
+    setThreadChatItems(getThreadMessages(chatItemTree, siblingMessageId))
+  }, [chatItemTree])
+
+  const handleAnnotationEdited = useCallback((query: string, answer: string, index: number) => {
+    setAllChatItems(allChatItems.map((item, i) => {
+      if (i === index - 1) {
+        return {
+          ...item,
+          content: query,
+        }
+      }
+      if (i === index) {
+        return {
+          ...item,
+          annotation: {
+            ...item.annotation,
+            logAnnotation: {
+              ...item.annotation?.logAnnotation,
+              content: answer,
+            },
+          } as any,
+        }
+      }
+      return item
+    }))
+  }, [allChatItems])
+  const handleAnnotationAdded = useCallback((annotationId: string, authorName: string, query: string, answer: string, index: number) => {
+    setAllChatItems(allChatItems.map((item, i) => {
+      if (i === index - 1) {
+        return {
+          ...item,
+          content: query,
+        }
+      }
+      if (i === index) {
+        const answerItem = {
+          ...item,
+          content: item.content,
+          annotation: {
+            id: annotationId,
+            authorName,
+            logAnnotation: {
+              content: answer,
+              account: {
+                id: '',
+                name: authorName,
+                email: '',
+              },
+            },
+          } as Annotation,
+        }
+        return answerItem
+      }
+      return item
+    }))
+  }, [allChatItems])
+  const handleAnnotationRemoved = useCallback((index: number) => {
+    setAllChatItems(allChatItems.map((item, i) => {
+      if (i === index) {
+        return {
+          ...item,
+          content: item.content,
+          annotation: undefined,
+        }
+      }
+      return item
+    }))
+  }, [allChatItems])
+
+  const fetchInitiated = useRef(false)
+
+  useEffect(() => {
+    if (appDetail?.id && detail.id && appDetail?.mode !== 'completion' && !fetchInitiated.current) {
+      fetchInitiated.current = true
+      fetchData()
+    }
+  }, [appDetail?.id, detail.id, appDetail?.mode, fetchData])
+
+  const isChatMode = appDetail?.mode !== 'completion'
+  const isAdvanced = appDetail?.mode === 'advanced-chat'
+
+  const varList = (detail.model_config as any).user_input_form?.map((item: any) => {
+    const itemContent = item[Object.keys(item)[0]]
+    return {
+      label: itemContent.variable,
+      value: varValues[itemContent.variable] || detail.message?.inputs?.[itemContent.variable],
+    }
+  }) || []
+  const message_files = (!isChatMode && detail.message.message_files && detail.message.message_files.length > 0)
+    ? detail.message.message_files.map((item: any) => item.url)
+    : []
+
+  const [width, setWidth] = useState(0)
+  const ref = useRef<HTMLDivElement>(null)
+
+  const adjustModalWidth = () => {
+    if (ref.current)
+      setWidth(document.body.clientWidth - (ref.current?.clientWidth + 16) - 8)
+  }
+
+  useEffect(() => {
+    adjustModalWidth()
+  }, [])
+
+  return (
+    <div ref={ref} className='flex h-full flex-col rounded-xl border-[0.5px] border-components-panel-border'>
+      {/* Panel Header */}
+      <div className='flex shrink-0 items-center gap-2 rounded-t-xl bg-components-panel-bg pb-2 pl-4 pr-3 pt-3'>
+        <div className='shrink-0'>
+          <div className='system-xs-semibold-uppercase mb-0.5 text-text-primary'>{isChatMode ? t('appLog.detail.conversationId') : t('appLog.detail.time')}</div>
+          {isChatMode && (
+            <div className='system-2xs-regular-uppercase flex items-center text-text-secondary'>
+              <Tooltip
+                popupContent={detail.id}
+              >
+                <div className='truncate'>{detail.id}</div>
+              </Tooltip>
+              <CopyIcon content={detail.id} />
+            </div>
+          )}
+          {!isChatMode && (
+            <div className='system-2xs-regular-uppercase text-text-secondary'>{formatTime(detail.created_at, t('appLog.dateTimeFormat') as string)}</div>
+          )}
+        </div>
+        <div className='flex grow flex-wrap items-center justify-end gap-y-1'>
+          {!isAdvanced && <ModelInfo model={detail.model_config.model} />}
+        </div>
+        <ActionButton size='l' onClick={onClose}>
+          <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+        </ActionButton>
+      </div>
+      {/* Panel Body */}
+      <div className='shrink-0 px-1 pt-1'>
+        <div className='rounded-t-xl bg-background-section-burn p-3 pb-2'>
+          {(varList.length > 0 || (!isChatMode && message_files.length > 0)) && (
+            <VarPanel
+              varList={varList}
+              message_files={message_files}
+            />
+          )}
+        </div>
+      </div>
+      <div className='mx-1 mb-1 grow overflow-auto rounded-b-xl bg-background-section-burn'>
+        {!isChatMode
+          ? <div className="px-6 py-4">
+            <div className='flex h-[18px] items-center space-x-3'>
+              <div className='system-xs-semibold-uppercase text-text-tertiary'>{t('appLog.table.header.output')}</div>
+              <div className='h-[1px] grow' style={{
+                background: 'linear-gradient(270deg, rgba(243, 244, 246, 0) 0%, rgb(243, 244, 246) 100%)',
+              }}></div>
+            </div>
+            <TextGeneration
+              className='mt-2'
+              content={detail.message.answer}
+              messageId={detail.message.id}
+              isError={false}
+              onRetry={noop}
+              isInstalledApp={false}
+              supportFeedback
+              feedback={detail.message.feedbacks.find((item: any) => item.from_source === 'admin')}
+              onFeedback={feedback => onFeedback(detail.message.id, feedback)}
+              isShowTextToSpeech
+              siteInfo={null}
+            />
+          </div>
+          : threadChatItems.length < 8
+            ? <div className="mb-4 pt-4">
+              <Chat
+                config={{
+                  appId: appDetail?.id,
+                  text_to_speech: {
+                    enabled: true,
+                  },
+                  questionEditEnable: false,
+                  supportAnnotation: true,
+                  annotation_reply: {
+                    enabled: true,
+                  },
+                  supportFeedback: true,
+                } as any}
+                chatList={threadChatItems}
+                onAnnotationAdded={handleAnnotationAdded}
+                onAnnotationEdited={handleAnnotationEdited}
+                onAnnotationRemoved={handleAnnotationRemoved}
+                onFeedback={onFeedback}
+                noChatInput
+                showPromptLog
+                hideProcessDetail
+                chatContainerInnerClassName='px-3'
+                switchSibling={switchSibling}
+              />
+            </div>
+            : <div
+              className="py-4"
+              id="scrollableDiv"
+              style={{
+                height: 1000, // Specify a value
+                overflow: 'auto',
+                display: 'flex',
+                flexDirection: 'column-reverse',
+              }}>
+              {/* Put the scroll bar always on the bottom */}
+              <InfiniteScroll
+                scrollableTarget="scrollableDiv"
+                dataLength={threadChatItems.length}
+                next={fetchData}
+                hasMore={hasMore}
+                loader={<div className='system-xs-regular text-center text-text-tertiary'>{t('appLog.detail.loading')}...</div>}
+                // endMessage={<div className='text-center'>Nothing more to show</div>}
+                // below props only if you need pull down functionality
+                refreshFunction={fetchData}
+                pullDownToRefresh
+                pullDownToRefreshThreshold={50}
+                // pullDownToRefreshContent={
+                //   <div className='text-center'>Pull down to refresh</div>
+                // }
+                // releaseToRefreshContent={
+                //   <div className='text-center'>Release to refresh</div>
+                // }
+                // To put endMessage and loader to the top.
+                style={{ display: 'flex', flexDirection: 'column-reverse' }}
+                inverse={true}
+              >
+                <Chat
+                  config={{
+                    appId: appDetail?.id,
+                    text_to_speech: {
+                      enabled: true,
+                    },
+                    questionEditEnable: false,
+                    supportAnnotation: true,
+                    annotation_reply: {
+                      enabled: true,
+                    },
+                    supportFeedback: true,
+                  } as any}
+                  chatList={threadChatItems}
+                  onAnnotationAdded={handleAnnotationAdded}
+                  onAnnotationEdited={handleAnnotationEdited}
+                  onAnnotationRemoved={handleAnnotationRemoved}
+                  onFeedback={onFeedback}
+                  noChatInput
+                  showPromptLog
+                  hideProcessDetail
+                  chatContainerInnerClassName='px-3'
+                  switchSibling={switchSibling}
+                />
+              </InfiniteScroll>
+            </div>
+        }
+      </div>
+      {showMessageLogModal && (
+        <MessageLogModal
+          width={width}
+          currentLogItem={currentLogItem}
+          onCancel={() => {
+            setCurrentLogItem()
+            setShowMessageLogModal(false)
+          }}
+          defaultTab={currentLogModalActiveTab}
+        />
+      )}
+      {showPromptLogModal && (
+        <PromptLogModal
+          width={width}
+          currentLogItem={currentLogItem}
+          onCancel={() => {
+            setCurrentLogItem()
+            setShowPromptLogModal(false)
+          }}
+        />
+      )}
+    </div>
+  )
+}
+
+/**
+   * Text App Conversation Detail Component
+   */
+const CompletionConversationDetailComp: FC<{ appId?: string; conversationId?: string }> = ({ appId, conversationId }) => {
+  // Text Generator App Session Details Including Message List
+  const detailParams = ({ url: `/apps/${appId}/completion-conversations/${conversationId}` })
+  const { data: conversationDetail, mutate: conversationDetailMutate } = useSWR(() => (appId && conversationId) ? detailParams : null, fetchCompletionConversationDetail)
+  const { notify } = useContext(ToastContext)
+  const { t } = useTranslation()
+
+  const handleFeedback = async (mid: string, { rating }: FeedbackType): Promise<boolean> => {
+    try {
+      await updateLogMessageFeedbacks({ url: `/apps/${appId}/feedbacks`, body: { message_id: mid, rating } })
+      conversationDetailMutate()
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      return true
+    }
+    catch {
+      notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+      return false
+    }
+  }
+
+  const handleAnnotation = async (mid: string, value: string): Promise<boolean> => {
+    try {
+      await updateLogMessageAnnotations({ url: `/apps/${appId}/annotations`, body: { message_id: mid, content: value } })
+      conversationDetailMutate()
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      return true
+    }
+    catch {
+      notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+      return false
+    }
+  }
+
+  if (!conversationDetail)
+    return null
+
+  return <DetailPanel
+    detail={conversationDetail}
+    onFeedback={handleFeedback}
+    onSubmitAnnotation={handleAnnotation}
+  />
+}
+
+/**
+   * Chat App Conversation Detail Component
+   */
+const ChatConversationDetailComp: FC<{ appId?: string; conversationId?: string }> = ({ appId, conversationId }) => {
+  const detailParams = { url: `/apps/${appId}/chat-conversations/${conversationId}` }
+  const { data: conversationDetail } = useSWR(() => (appId && conversationId) ? detailParams : null, fetchChatConversationDetail)
+  const { notify } = useContext(ToastContext)
+  const { t } = useTranslation()
+
+  const handleFeedback = async (mid: string, { rating }: FeedbackType): Promise<boolean> => {
+    try {
+      await updateLogMessageFeedbacks({ url: `/apps/${appId}/feedbacks`, body: { message_id: mid, rating } })
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      return true
+    }
+    catch {
+      notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+      return false
+    }
+  }
+
+  const handleAnnotation = async (mid: string, value: string): Promise<boolean> => {
+    try {
+      await updateLogMessageAnnotations({ url: `/apps/${appId}/annotations`, body: { message_id: mid, content: value } })
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      return true
+    }
+    catch {
+      notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+      return false
+    }
+  }
+
+  if (!conversationDetail)
+    return null
+
+  return <DetailPanel
+    detail={conversationDetail}
+    onFeedback={handleFeedback}
+    onSubmitAnnotation={handleAnnotation}
+  />
+}
+
+/**
+   * Conversation list component including basic information
+   */
+const ConversationList: FC<IConversationList> = ({ logs, appDetail, onRefresh }) => {
+  const { t } = useTranslation()
+  const { formatTime } = useTimestamp()
+
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+
+  const [showDrawer, setShowDrawer] = useState<boolean>(false) // Whether to display the chat details drawer
+  const [currentConversation, setCurrentConversation] = useState<ChatConversationGeneralDetail | CompletionConversationGeneralDetail | undefined>() // Currently selected conversation
+  const isChatMode = appDetail.mode !== 'completion' // Whether the app is a chat app
+  const isChatflow = appDetail.mode === 'advanced-chat' // Whether the app is a chatflow app
+  const { setShowPromptLogModal, setShowAgentLogModal, setShowMessageLogModal } = useAppStore(useShallow(state => ({
+    setShowPromptLogModal: state.setShowPromptLogModal,
+    setShowAgentLogModal: state.setShowAgentLogModal,
+    setShowMessageLogModal: state.setShowMessageLogModal,
+  })))
+
+  // Annotated data needs to be highlighted
+  const renderTdValue = (value: string | number | null, isEmptyStyle: boolean, isHighlight = false, annotation?: LogAnnotation) => {
+    return (
+      <Tooltip
+        popupContent={
+          <span className='inline-flex items-center text-xs text-text-tertiary'>
+            <RiEditFill className='mr-1 h-3 w-3' />{`${t('appLog.detail.annotationTip', { user: annotation?.account?.name })} ${formatTime(annotation?.created_at || dayjs().unix(), 'MM-DD hh:mm A')}`}
+          </span>
+        }
+        popupClassName={(isHighlight && !isChatMode) ? '' : '!hidden'}
+      >
+        <div className={cn(isEmptyStyle ? 'text-text-quaternary' : 'text-text-secondary', !isHighlight ? '' : 'bg-orange-100', 'system-sm-regular overflow-hidden text-ellipsis whitespace-nowrap')}>
+          {value || '-'}
+        </div>
+      </Tooltip>
+    )
+  }
+
+  const onCloseDrawer = () => {
+    onRefresh()
+    setShowDrawer(false)
+    setCurrentConversation(undefined)
+    setShowPromptLogModal(false)
+    setShowAgentLogModal(false)
+    setShowMessageLogModal(false)
+  }
+
+  if (!logs)
+    return <Loading />
+
+  return (
+    <div className='overflow-x-auto'>
+      <table className={cn('mt-2 w-full min-w-[440px] border-collapse border-0')}>
+        <thead className='system-xs-medium-uppercase text-text-tertiary'>
+          <tr>
+            <td className='w-5 whitespace-nowrap rounded-l-lg bg-background-section-burn pl-2 pr-1'></td>
+            <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{isChatMode ? t('appLog.table.header.summary') : t('appLog.table.header.input')}</td>
+            <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appLog.table.header.endUser')}</td>
+            {isChatflow && <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appLog.table.header.status')}</td>}
+            <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{isChatMode ? t('appLog.table.header.messageCount') : t('appLog.table.header.output')}</td>
+            <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appLog.table.header.userRate')}</td>
+            <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appLog.table.header.adminRate')}</td>
+            <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appLog.table.header.updatedTime')}</td>
+            <td className='whitespace-nowrap rounded-r-lg bg-background-section-burn py-1.5 pl-3'>{t('appLog.table.header.time')}</td>
+          </tr>
+        </thead>
+        <tbody className="system-sm-regular text-text-secondary">
+          {logs.data.map((log: any) => {
+            const endUser = log.from_end_user_session_id || log.from_account_name
+            const leftValue = get(log, isChatMode ? 'name' : 'message.inputs.query') || (!isChatMode ? (get(log, 'message.query') || get(log, 'message.inputs.default_input')) : '') || ''
+            const rightValue = get(log, isChatMode ? 'message_count' : 'message.answer')
+            return <tr
+              key={log.id}
+              className={cn('cursor-pointer border-b border-divider-subtle hover:bg-background-default-hover', currentConversation?.id !== log.id ? '' : 'bg-background-default-hover')}
+              onClick={() => {
+                setShowDrawer(true)
+                setCurrentConversation(log)
+              }}>
+              <td className='h-4'>
+                {!log.read_at && (
+                  <div className='flex items-center p-3 pr-0.5'>
+                    <span className='inline-block h-1.5 w-1.5 rounded bg-util-colors-blue-blue-500'></span>
+                  </div>
+                )}
+              </td>
+              <td className='w-[160px] p-3 pr-2' style={{ maxWidth: isChatMode ? 300 : 200 }}>
+                {renderTdValue(leftValue || t('appLog.table.empty.noChat'), !leftValue, isChatMode && log.annotated)}
+              </td>
+              <td className='p-3 pr-2'>{renderTdValue(endUser || defaultValue, !endUser)}</td>
+              {isChatflow && <td className='w-[160px] p-3 pr-2' style={{ maxWidth: isChatMode ? 300 : 200 }}>
+                {statusTdRender(log.status_count)}
+              </td>}
+              <td className='p-3 pr-2' style={{ maxWidth: isChatMode ? 100 : 200 }}>
+                {renderTdValue(rightValue === 0 ? 0 : (rightValue || t('appLog.table.empty.noOutput')), !rightValue, !isChatMode && !!log.annotation?.content, log.annotation)}
+              </td>
+              <td className='p-3 pr-2'>
+                {(!log.user_feedback_stats.like && !log.user_feedback_stats.dislike)
+                  ? renderTdValue(defaultValue, true)
+                  : <>
+                    {!!log.user_feedback_stats.like && <HandThumbIconWithCount iconType='up' count={log.user_feedback_stats.like} />}
+                    {!!log.user_feedback_stats.dislike && <HandThumbIconWithCount iconType='down' count={log.user_feedback_stats.dislike} />}
+                  </>
+                }
+              </td>
+              <td className='p-3 pr-2'>
+                {(!log.admin_feedback_stats.like && !log.admin_feedback_stats.dislike)
+                  ? renderTdValue(defaultValue, true)
+                  : <>
+                    {!!log.admin_feedback_stats.like && <HandThumbIconWithCount iconType='up' count={log.admin_feedback_stats.like} />}
+                    {!!log.admin_feedback_stats.dislike && <HandThumbIconWithCount iconType='down' count={log.admin_feedback_stats.dislike} />}
+                  </>
+                }
+              </td>
+              <td className='w-[160px] p-3 pr-2'>{formatTime(log.updated_at, t('appLog.dateTimeFormat') as string)}</td>
+              <td className='w-[160px] p-3 pr-2'>{formatTime(log.created_at, t('appLog.dateTimeFormat') as string)}</td>
+            </tr>
+          })}
+        </tbody>
+      </table>
+      <Drawer
+        isOpen={showDrawer}
+        onClose={onCloseDrawer}
+        mask={isMobile}
+        footer={null}
+        panelClassName='mt-16 mx-2 sm:mr-2 mb-4 !p-0 !max-w-[640px] rounded-xl bg-components-panel-bg'
+      >
+        <DrawerContext.Provider value={{
+          onClose: onCloseDrawer,
+          appDetail,
+        }}>
+          {isChatMode
+            ? <ChatConversationDetailComp appId={appDetail.id} conversationId={currentConversation?.id} />
+            : <CompletionConversationDetailComp appId={appDetail.id} conversationId={currentConversation?.id} />
+          }
+        </DrawerContext.Provider>
+      </Drawer>
+    </div>
+  )
+}
+
+export default ConversationList
diff --git a/app/components/app/log/model-info.tsx b/app/components/app/log/model-info.tsx
new file mode 100644
index 0000000..626ef09
--- /dev/null
+++ b/app/components/app/log/model-info.tsx
@@ -0,0 +1,107 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiInformation2Line,
+} from '@remixicon/react'
+import ModelIcon from '@/app/components/header/account-setting/model-provider-page/model-icon'
+import ModelName from '@/app/components/header/account-setting/model-provider-page/model-name'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { useTextGenerationCurrentProviderAndModelAndModelList } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import cn from '@/utils/classnames'
+
+const PARAM_MAP = {
+  temperature: 'Temperature',
+  top_p: 'Top P',
+  presence_penalty: 'Presence Penalty',
+  max_tokens: 'Max Token',
+  stop: 'Stop',
+  frequency_penalty: 'Frequency Penalty',
+}
+
+type Props = {
+  model: any
+}
+
+const ModelInfo: FC<Props> = ({
+  model,
+}) => {
+  const { t } = useTranslation()
+  const modelName = model.name
+  const provideName = model.provider as any
+  const {
+    currentModel,
+    currentProvider,
+  } = useTextGenerationCurrentProviderAndModelAndModelList(
+    { provider: provideName, model: modelName },
+  )
+
+  const [open, setOpen] = React.useState(false)
+
+  const getParamValue = (param: string) => {
+    const value = model.completion_params?.[param] || '-'
+    if (param === 'stop') {
+      if (Array.isArray(value))
+        return value.join(',')
+      else
+        return '-'
+    }
+
+    return value
+  }
+
+  return (
+    <div className={cn('flex items-center rounded-lg')}>
+      <div className='mr-px flex h-8 shrink-0 items-center gap-1 rounded-l-lg bg-components-input-bg-normal pl-1.5 pr-2'>
+        <ModelIcon
+          className='!h-5 !w-5'
+          provider={currentProvider}
+          modelName={currentModel?.model}
+        />
+        <ModelName
+          modelItem={currentModel!}
+          showMode
+        />
+      </div>
+      <PortalToFollowElem
+        open={open}
+        onOpenChange={setOpen}
+        placement='bottom-end'
+        offset={4}
+      >
+        <div className='relative'>
+          <PortalToFollowElemTrigger
+            onClick={() => setOpen(v => !v)}
+            className='block'
+          >
+            <div className={cn(
+              'cursor-pointer rounded-r-lg bg-components-button-tertiary-bg p-2 hover:bg-components-button-tertiary-bg-hover',
+              open && 'bg-components-button-tertiary-bg-hover',
+            )}>
+              <RiInformation2Line className='h-4 w-4 text-text-tertiary' />
+            </div>
+          </PortalToFollowElemTrigger>
+          <PortalToFollowElemContent className='z-[1002]'>
+            <div className='relative w-[280px] overflow-hidden rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg px-4 pb-2 pt-3 shadow-xl'>
+              <div className='system-sm-semibold-uppercase mb-1 h-6 text-text-secondary'>{t('appLog.detail.modelParams')}</div>
+              <div className='py-1'>
+                {['temperature', 'top_p', 'presence_penalty', 'max_tokens', 'stop'].map((param: string, index: number) => {
+                  return <div className='flex justify-between py-1.5' key={index}>
+                    <span className='system-xs-medium-uppercase text-text-tertiary'>{PARAM_MAP[param as keyof typeof PARAM_MAP]}</span>
+                    <span className='system-xs-medium-uppercase text-text-secondary'>{getParamValue(param)}</span>
+                  </div>
+                })}
+              </div>
+            </div>
+          </PortalToFollowElemContent>
+        </div>
+      </PortalToFollowElem>
+    </div>
+  )
+}
+export default React.memo(ModelInfo)
diff --git a/app/components/app/log/var-panel.tsx b/app/components/app/log/var-panel.tsx
new file mode 100644
index 0000000..dd8c231
--- /dev/null
+++ b/app/components/app/log/var-panel.tsx
@@ -0,0 +1,83 @@
+'use client'
+import { useBoolean } from 'ahooks'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowDownSLine,
+  RiArrowRightSLine,
+} from '@remixicon/react'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import ImagePreview from '@/app/components/base/image-uploader/image-preview'
+import cn from '@/utils/classnames'
+
+type Props = {
+  varList: { label: string; value: string }[]
+  message_files: string[]
+}
+
+const VarPanel: FC<Props> = ({
+  varList,
+  message_files,
+}) => {
+  const { t } = useTranslation()
+  const [isCollapse, { toggle: toggleCollapse }] = useBoolean(false)
+  const [imagePreviewUrl, setImagePreviewUrl] = useState('')
+
+  return (
+    <div className='rounded-[10px] border border-divider-subtle bg-chat-bubble-bg'>
+      <div
+        className={cn('flex cursor-pointer items-center gap-1 border-b border-divider-subtle px-3 pb-2 pt-2.5 text-text-secondary', isCollapse && 'border-0 pb-2.5')}
+        onClick={toggleCollapse}
+      >
+        <Variable02 className='h-4 w-4' />
+        <div className='system-md-medium grow'>{t('appLog.detail.variables')}</div>
+        {
+          isCollapse
+            ? <RiArrowRightSLine className='h-4 w-4' />
+            : <RiArrowDownSLine className='h-4 w-4' />
+        }
+      </div>
+      {!isCollapse && (
+        <div className='flex max-h-[500px] flex-col gap-2 overflow-y-auto p-3'>
+          {varList.map(({ label, value }, index) => (
+            <div key={index} className='system-xs-medium flex py-2'>
+              <div className='flex w-[128px] shrink-0 text-text-accent'>
+                <span className='shrink-0 opacity-60'>{'{{'}</span>
+                <span className='truncate'>{label}</span>
+                <span className='shrink-0 opacity-60'>{'}}'}</span>
+              </div>
+              <div className='whitespace-pre-wrap pl-2.5 text-text-secondary'>{value}</div>
+            </div>
+          ))}
+
+          {message_files.length > 0 && (
+            <div className='mt-1 flex py-2'>
+              <div className='system-xs-medium w-[128px] shrink-0 text-text-tertiary'>{t('appLog.detail.uploadImages')}</div>
+              <div className="flex space-x-2">
+                {message_files.map((url, index) => (
+                  <div
+                    key={index}
+                    className="ml-2.5 h-16 w-16 cursor-pointer rounded-lg bg-cover bg-center bg-no-repeat"
+                    style={{ backgroundImage: `url(${url})` }}
+                    onClick={() => setImagePreviewUrl(url)}
+                  />
+                ))}
+              </div>
+            </div>
+          )}
+        </div>
+      )}
+      {
+        imagePreviewUrl && (
+          <ImagePreview
+            url={imagePreviewUrl}
+            title={imagePreviewUrl}
+            onCancel={() => setImagePreviewUrl('')}
+          />
+        )
+      }
+    </div>
+  )
+}
+export default React.memo(VarPanel)
diff --git a/app/components/app/overview/apikey-info-panel/index.tsx b/app/components/app/overview/apikey-info-panel/index.tsx
new file mode 100644
index 0000000..7654d49
--- /dev/null
+++ b/app/components/app/overview/apikey-info-panel/index.tsx
@@ -0,0 +1,73 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import Button from '@/app/components/base/button'
+import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general'
+import { IS_CE_EDITION } from '@/config'
+import { useProviderContext } from '@/context/provider-context'
+import { useModalContext } from '@/context/modal-context'
+
+const APIKeyInfoPanel: FC = () => {
+  const isCloud = !IS_CE_EDITION
+
+  const { isAPIKeySet } = useProviderContext()
+  const { setShowAccountSettingModal } = useModalContext()
+
+  const { t } = useTranslation()
+
+  const [isShow, setIsShow] = useState(true)
+
+  if (isAPIKeySet)
+    return null
+
+  if (!(isShow))
+    return null
+
+  return (
+    <div className={cn('border-components-panel-border bg-components-panel-bg', 'relative mb-6 rounded-2xl border p-8 shadow-md ')}>
+      <div className={cn('text-[24px] font-semibold text-text-primary', isCloud ? 'flex h-8 items-center space-x-1' : 'mb-6 leading-8')}>
+        {isCloud && <em-emoji id={'馃榾'} />}
+        {isCloud
+          ? (
+            <div>{t('appOverview.apiKeyInfo.cloud.trial.title', { providerName: 'OpenAI' })}</div>
+          )
+          : (
+            <div>
+              <div>{t('appOverview.apiKeyInfo.selfHost.title.row1')}</div>
+              <div>{t('appOverview.apiKeyInfo.selfHost.title.row2')}</div>
+            </div>
+          )}
+      </div>
+      {isCloud && (
+        <div className='mt-1 text-sm font-normal text-text-tertiary'>{t(`appOverview.apiKeyInfo.cloud.${'trial'}.description`)}</div>
+      )}
+      <Button
+        variant='primary'
+        className='mt-2 space-x-2'
+        onClick={() => setShowAccountSettingModal({ payload: 'provider' })}
+      >
+        <div className='text-sm font-medium'>{t('appOverview.apiKeyInfo.setAPIBtn')}</div>
+        <LinkExternal02 className='h-4 w-4' />
+      </Button>
+      {!isCloud && (
+        <a
+          className='mt-2 flex h-[26px] items-center space-x-1  p-1 text-xs font-medium text-[#155EEF]'
+          href='https://cloud.dify.ai/apps'
+          target='_blank' rel='noopener noreferrer'
+        >
+          <div>{t('appOverview.apiKeyInfo.tryCloud')}</div>
+          <LinkExternal02 className='h-3 w-3' />
+        </a>
+      )}
+      <div
+        onClick={() => setIsShow(false)}
+        className='absolute right-4 top-4 flex h-8 w-8 cursor-pointer items-center justify-center '>
+        <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+      </div>
+    </div>
+  )
+}
+export default React.memo(APIKeyInfoPanel)
diff --git a/app/components/app/overview/appCard.tsx b/app/components/app/overview/appCard.tsx
new file mode 100644
index 0000000..04fc8f2
--- /dev/null
+++ b/app/components/app/overview/appCard.tsx
@@ -0,0 +1,273 @@
+'use client'
+import React, { useMemo, useState } from 'react'
+import { usePathname, useRouter } from 'next/navigation'
+import { useTranslation } from 'react-i18next'
+import {
+  RiBookOpenLine,
+  RiEqualizer2Line,
+  RiExternalLinkLine,
+  RiPaintBrushLine,
+  RiWindowLine,
+} from '@remixicon/react'
+import SettingsModal from './settings'
+import EmbeddedModal from './embedded'
+import CustomizeModal from './customize'
+import style from './style.module.css'
+import type { ConfigParams } from './settings'
+import Tooltip from '@/app/components/base/tooltip'
+import AppBasic from '@/app/components/app-sidebar/basic'
+import { asyncRunSafe, randomString } from '@/utils'
+import Button from '@/app/components/base/button'
+import Switch from '@/app/components/base/switch'
+import Divider from '@/app/components/base/divider'
+import CopyFeedback from '@/app/components/base/copy-feedback'
+import Confirm from '@/app/components/base/confirm'
+import ShareQRCode from '@/app/components/base/qrcode'
+import SecretKeyButton from '@/app/components/develop/secret-key/secret-key-button'
+import type { AppDetailResponse } from '@/models/app'
+import { useAppContext } from '@/context/app-context'
+import type { AppSSO } from '@/types/app'
+import Indicator from '@/app/components/header/indicator'
+
+export type IAppCardProps = {
+  className?: string
+  appInfo: AppDetailResponse & Partial<AppSSO>
+  isInPanel?: boolean
+  cardType?: 'api' | 'webapp'
+  customBgColor?: string
+  onChangeStatus: (val: boolean) => Promise<void>
+  onSaveSiteConfig?: (params: ConfigParams) => Promise<void>
+  onGenerateCode?: () => Promise<void>
+}
+
+function AppCard({
+  appInfo,
+  isInPanel,
+  cardType = 'webapp',
+  customBgColor,
+  onChangeStatus,
+  onSaveSiteConfig,
+  onGenerateCode,
+  className,
+}: IAppCardProps) {
+  const router = useRouter()
+  const pathname = usePathname()
+  const { isCurrentWorkspaceManager, isCurrentWorkspaceEditor } = useAppContext()
+  const [showSettingsModal, setShowSettingsModal] = useState(false)
+  const [showEmbedded, setShowEmbedded] = useState(false)
+  const [showCustomizeModal, setShowCustomizeModal] = useState(false)
+  const [genLoading, setGenLoading] = useState(false)
+  const [showConfirmDelete, setShowConfirmDelete] = useState(false)
+
+  const { t } = useTranslation()
+
+  const OPERATIONS_MAP = useMemo(() => {
+    const operationsMap = {
+      webapp: [
+        { opName: t('appOverview.overview.appInfo.launch'), opIcon: RiExternalLinkLine },
+      ] as { opName: string; opIcon: any }[],
+      api: [{ opName: t('appOverview.overview.apiInfo.doc'), opIcon: RiBookOpenLine }],
+      app: [],
+    }
+    if (appInfo.mode !== 'completion' && appInfo.mode !== 'workflow')
+      operationsMap.webapp.push({ opName: t('appOverview.overview.appInfo.embedded.entry'), opIcon: RiWindowLine })
+
+    operationsMap.webapp.push({ opName: t('appOverview.overview.appInfo.customize.entry'), opIcon: RiPaintBrushLine })
+
+    if (isCurrentWorkspaceEditor)
+      operationsMap.webapp.push({ opName: t('appOverview.overview.appInfo.settings.entry'), opIcon: RiEqualizer2Line })
+
+    return operationsMap
+  }, [isCurrentWorkspaceEditor, appInfo, t])
+
+  const isApp = cardType === 'webapp'
+  const basicName = isApp
+    ? appInfo?.site?.title
+    : t('appOverview.overview.apiInfo.title')
+  const toggleDisabled = isApp ? !isCurrentWorkspaceEditor : !isCurrentWorkspaceManager
+  const runningStatus = isApp ? appInfo.enable_site : appInfo.enable_api
+  const { app_base_url, access_token } = appInfo.site ?? {}
+  const appMode = (appInfo.mode !== 'completion' && appInfo.mode !== 'workflow') ? 'chat' : appInfo.mode
+  const appUrl = `${app_base_url}/${appMode}/${access_token}`
+  const apiUrl = appInfo?.api_base_url
+
+  const genClickFuncByName = (opName: string) => {
+    switch (opName) {
+      case t('appOverview.overview.appInfo.launch'):
+        return () => {
+          window.open(appUrl, '_blank')
+        }
+      case t('appOverview.overview.appInfo.customize.entry'):
+        return () => {
+          setShowCustomizeModal(true)
+        }
+      case t('appOverview.overview.appInfo.settings.entry'):
+        return () => {
+          setShowSettingsModal(true)
+        }
+      case t('appOverview.overview.appInfo.embedded.entry'):
+        return () => {
+          setShowEmbedded(true)
+        }
+      default:
+        // jump to page develop
+        return () => {
+          const pathSegments = pathname.split('/')
+          pathSegments.pop()
+          router.push(`${pathSegments.join('/')}/develop`)
+        }
+    }
+  }
+
+  const onGenCode = async () => {
+    if (onGenerateCode) {
+      setGenLoading(true)
+      await asyncRunSafe(onGenerateCode())
+      setGenLoading(false)
+    }
+  }
+
+  return (
+    <div
+      className={
+        `${isInPanel ? 'border-l-[0.5px] border-t' : 'border-[0.5px] shadow-xs'} w-full max-w-full rounded-xl border-effects-highlight ${className ?? ''}`}
+    >
+      <div className={`${customBgColor ?? 'bg-background-default'} rounded-xl`}>
+        <div className='flex w-full flex-col items-start justify-center gap-3 self-stretch border-b-[0.5px] border-divider-subtle p-3'>
+          <div className='flex w-full items-center gap-3 self-stretch'>
+            <AppBasic
+              iconType={cardType}
+              icon={appInfo.icon}
+              icon_background={appInfo.icon_background}
+              name={basicName}
+              type={
+                isApp
+                  ? t('appOverview.overview.appInfo.explanation')
+                  : t('appOverview.overview.apiInfo.explanation')
+              }
+            />
+            <div className='flex items-center gap-1'>
+              <Indicator color={runningStatus ? 'green' : 'yellow'} />
+              <div className={`${runningStatus ? 'text-text-success' : 'text-text-warning'} system-xs-semibold-uppercase`}>
+                {runningStatus
+                  ? t('appOverview.overview.status.running')
+                  : t('appOverview.overview.status.disable')}
+              </div>
+            </div>
+            <Switch defaultValue={runningStatus} onChange={onChangeStatus} disabled={toggleDisabled} />
+          </div>
+          <div className='flex flex-col items-start justify-center self-stretch'>
+            <div className="system-xs-medium pb-1 text-text-tertiary">
+              {isApp
+                ? t('appOverview.overview.appInfo.accessibleAddress')
+                : t('appOverview.overview.apiInfo.accessibleAddress')}
+            </div>
+            <div className="inline-flex h-9 w-full items-center gap-0.5 rounded-lg bg-components-input-bg-normal p-1 pl-2">
+              <div className="flex h-4 min-w-0 flex-1 items-start justify-start gap-2 px-1">
+                <div className="overflow-hidden text-ellipsis whitespace-nowrap text-xs font-medium text-text-secondary">
+                  {isApp ? appUrl : apiUrl}
+                </div>
+              </div>
+              <CopyFeedback
+                content={isApp ? appUrl : apiUrl}
+                className={'!size-6'}
+              />
+              {isApp && <ShareQRCode content={isApp ? appUrl : apiUrl} className='z-50 !size-6 rounded-md hover:bg-state-base-hover' selectorId={randomString(8)} />}
+              {isApp && <Divider type="vertical" className="!mx-0.5 !h-3.5 shrink-0" />}
+              {/* button copy link/ button regenerate */}
+              {showConfirmDelete && (
+                <Confirm
+                  type='warning'
+                  title={t('appOverview.overview.appInfo.regenerate')}
+                  content={t('appOverview.overview.appInfo.regenerateNotice')}
+                  isShow={showConfirmDelete}
+                  onConfirm={() => {
+                    onGenCode()
+                    setShowConfirmDelete(false)
+                  }}
+                  onCancel={() => setShowConfirmDelete(false)}
+                />
+              )}
+              {isApp && isCurrentWorkspaceManager && (
+                <Tooltip
+                  popupContent={t('appOverview.overview.appInfo.regenerate') || ''}
+                >
+                  <div
+                    className="h-6 w-6 cursor-pointer rounded-md hover:bg-state-base-hover"
+                    onClick={() => setShowConfirmDelete(true)}
+                  >
+                    <div
+                      className={
+                        `h-full w-full ${style.refreshIcon} ${genLoading ? style.generateLogo : ''}`}
+                    ></div>
+                  </div>
+                </Tooltip>
+              )}
+            </div>
+          </div>
+        </div>
+        <div className={'flex items-center gap-1 self-stretch p-3'}>
+          {!isApp && <SecretKeyButton appId={appInfo.id} />}
+          {OPERATIONS_MAP[cardType].map((op) => {
+            const disabled
+              = op.opName === t('appOverview.overview.appInfo.settings.entry')
+                ? false
+                : !runningStatus
+            return (
+              <Button
+                className="mr-1 min-w-[88px]"
+                size="small"
+                variant={'ghost'}
+                key={op.opName}
+                onClick={genClickFuncByName(op.opName)}
+                disabled={disabled}
+              >
+                <Tooltip
+                  popupContent={
+                    t('appOverview.overview.appInfo.preUseReminder') ?? ''
+                  }
+                  popupClassName={disabled ? 'mt-[-8px]' : '!hidden'}
+                >
+                  <div className="flex items-center justify-center gap-[1px]">
+                    <op.opIcon className="h-3.5 w-3.5" />
+                    <div className={`${runningStatus ? 'text-text-tertiary' : 'text-components-button-ghost-text-disabled'} system-xs-medium px-[3px]`}>{op.opName}</div>
+                  </div>
+                </Tooltip>
+              </Button>
+            )
+          })}
+        </div>
+      </div>
+      {isApp
+        ? (
+          <>
+            <SettingsModal
+              isChat={appMode === 'chat'}
+              appInfo={appInfo}
+              isShow={showSettingsModal}
+              onClose={() => setShowSettingsModal(false)}
+              onSave={onSaveSiteConfig}
+            />
+            <EmbeddedModal
+              siteInfo={appInfo.site}
+              isShow={showEmbedded}
+              onClose={() => setShowEmbedded(false)}
+              appBaseUrl={app_base_url}
+              accessToken={access_token}
+            />
+            <CustomizeModal
+              isShow={showCustomizeModal}
+              linkUrl=""
+              onClose={() => setShowCustomizeModal(false)}
+              appId={appInfo.id}
+              api_base_url={appInfo.api_base_url}
+              mode={appInfo.mode}
+            />
+          </>
+        )
+        : null}
+    </div>
+  )
+}
+
+export default AppCard
diff --git a/app/components/app/overview/appChart.tsx b/app/components/app/overview/appChart.tsx
new file mode 100644
index 0000000..4e74eda
--- /dev/null
+++ b/app/components/app/overview/appChart.tsx
@@ -0,0 +1,450 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import ReactECharts from 'echarts-for-react'
+import type { EChartsOption } from 'echarts'
+import useSWR from 'swr'
+import dayjs from 'dayjs'
+import { get } from 'lodash-es'
+import Decimal from 'decimal.js'
+import { useTranslation } from 'react-i18next'
+import { formatNumber } from '@/utils/format'
+import Basic from '@/app/components/app-sidebar/basic'
+import Loading from '@/app/components/base/loading'
+import type { AppDailyConversationsResponse, AppDailyEndUsersResponse, AppDailyMessagesResponse, AppTokenCostsResponse } from '@/models/app'
+import { getAppDailyConversations, getAppDailyEndUsers, getAppDailyMessages, getAppStatistics, getAppTokenCosts, getWorkflowDailyConversations } from '@/service/apps'
+const valueFormatter = (v: string | number) => v
+
+const COLOR_TYPE_MAP = {
+  green: {
+    lineColor: 'rgba(6, 148, 162, 1)',
+    bgColor: ['rgba(6, 148, 162, 0.2)', 'rgba(67, 174, 185, 0.08)'],
+  },
+  orange: {
+    lineColor: 'rgba(255, 138, 76, 1)',
+    bgColor: ['rgba(254, 145, 87, 0.2)', 'rgba(255, 138, 76, 0.1)'],
+  },
+  blue: {
+    lineColor: 'rgba(28, 100, 242, 1)',
+    bgColor: ['rgba(28, 100, 242, 0.3)', 'rgba(28, 100, 242, 0.1)'],
+  },
+}
+
+const COMMON_COLOR_MAP = {
+  label: '#9CA3AF',
+  splitLineLight: '#F3F4F6',
+  splitLineDark: '#E5E7EB',
+}
+
+type IColorType = 'green' | 'orange' | 'blue'
+type IChartType = 'messages' | 'conversations' | 'endUsers' | 'costs' | 'workflowCosts'
+type IChartConfigType = { colorType: IColorType; showTokens?: boolean }
+
+const commonDateFormat = 'MMM D, YYYY'
+
+const CHART_TYPE_CONFIG: Record<string, IChartConfigType> = {
+  messages: {
+    colorType: 'green',
+  },
+  conversations: {
+    colorType: 'green',
+  },
+  endUsers: {
+    colorType: 'orange',
+  },
+  costs: {
+    colorType: 'blue',
+    showTokens: true,
+  },
+  workflowCosts: {
+    colorType: 'blue',
+  },
+}
+
+const sum = (arr: Decimal.Value[]): number => {
+  return Decimal.sum(...arr).toNumber()
+}
+
+const defaultPeriod = {
+  start: dayjs().subtract(7, 'day').format(commonDateFormat),
+  end: dayjs().format(commonDateFormat),
+}
+
+export type PeriodParams = {
+  name: string
+  query?: {
+    start: string
+    end: string
+  }
+}
+
+export type IBizChartProps = {
+  period: PeriodParams
+  id: string
+}
+
+export type IChartProps = {
+  className?: string
+  basicInfo: { title: string; explanation: string; timePeriod: string }
+  valueKey?: string
+  isAvg?: boolean
+  unit?: string
+  yMax?: number
+  chartType: IChartType
+  chartData: AppDailyMessagesResponse | AppDailyConversationsResponse | AppDailyEndUsersResponse | AppTokenCostsResponse | { data: Array<{ date: string; count: number }> }
+}
+
+const Chart: React.FC<IChartProps> = ({
+  basicInfo: { title, explanation, timePeriod },
+  chartType = 'conversations',
+  chartData,
+  valueKey,
+  isAvg,
+  unit = '',
+  yMax,
+  className,
+}) => {
+  const { t } = useTranslation()
+  const statistics = chartData.data
+  const statisticsLen = statistics.length
+  const extraDataForMarkLine = new Array(statisticsLen >= 2 ? statisticsLen - 2 : statisticsLen).fill('1')
+  extraDataForMarkLine.push('')
+  extraDataForMarkLine.unshift('')
+
+  const xData = statistics.map(({ date }) => date)
+  const yField = valueKey || Object.keys(statistics[0]).find(name => name.includes('count')) || ''
+  const yData = statistics.map((item) => {
+    // @ts-expect-error field is valid
+    return item[yField] || 0
+  })
+
+  const options: EChartsOption = {
+    dataset: {
+      dimensions: ['date', yField],
+      source: statistics,
+    },
+    grid: { top: 8, right: 36, bottom: 0, left: 0, containLabel: true },
+    tooltip: {
+      trigger: 'item',
+      position: 'top',
+      borderWidth: 0,
+    },
+    xAxis: [{
+      type: 'category',
+      boundaryGap: false,
+      axisLabel: {
+        color: COMMON_COLOR_MAP.label,
+        hideOverlap: true,
+        overflow: 'break',
+        formatter(value) {
+          return dayjs(value).format(commonDateFormat)
+        },
+      },
+      axisLine: { show: false },
+      axisTick: { show: false },
+      splitLine: {
+        show: true,
+        lineStyle: {
+          color: COMMON_COLOR_MAP.splitLineLight,
+          width: 1,
+          type: [10, 10],
+        },
+        interval(index) {
+          return index === 0 || index === xData.length - 1
+        },
+      },
+    }, {
+      position: 'bottom',
+      boundaryGap: false,
+      data: extraDataForMarkLine,
+      axisLabel: { show: false },
+      axisLine: { show: false },
+      axisTick: { show: false },
+      splitLine: {
+        show: true,
+        lineStyle: {
+          color: COMMON_COLOR_MAP.splitLineDark,
+        },
+        interval(index, value) {
+          return !!value
+        },
+      },
+    }],
+    yAxis: {
+      max: yMax ?? 'dataMax',
+      type: 'value',
+      axisLabel: { color: COMMON_COLOR_MAP.label, hideOverlap: true },
+      splitLine: {
+        lineStyle: {
+          color: COMMON_COLOR_MAP.splitLineLight,
+        },
+      },
+    },
+    series: [
+      {
+        type: 'line',
+        showSymbol: true,
+        // symbol: 'circle',
+        // triggerLineEvent: true,
+        symbolSize: 4,
+        lineStyle: {
+          color: COLOR_TYPE_MAP[CHART_TYPE_CONFIG[chartType].colorType].lineColor,
+          width: 2,
+        },
+        itemStyle: {
+          color: COLOR_TYPE_MAP[CHART_TYPE_CONFIG[chartType].colorType].lineColor,
+        },
+        areaStyle: {
+          color: {
+            type: 'linear',
+            x: 0,
+            y: 0,
+            x2: 0,
+            y2: 1,
+            colorStops: [{
+              offset: 0, color: COLOR_TYPE_MAP[CHART_TYPE_CONFIG[chartType].colorType].bgColor[0],
+            }, {
+              offset: 1, color: COLOR_TYPE_MAP[CHART_TYPE_CONFIG[chartType].colorType].bgColor[1],
+            }],
+            global: false,
+          },
+        },
+        tooltip: {
+          padding: [8, 12, 8, 12],
+          formatter(params) {
+            return `<div style='color:#6B7280;font-size:12px'>${params.name}</div>
+                          <div style='font-size:14px;color:#1F2A37'>${valueFormatter((params.data as any)[yField])}
+                              ${!CHART_TYPE_CONFIG[chartType].showTokens
+                                ? ''
+                                : `<span style='font-size:12px'>
+                                  <span style='margin-left:4px;color:#6B7280'>(</span>
+                                  <span style='color:#FF8A4C'>~$${get(params.data, 'total_price', 0)}</span>
+                                  <span style='color:#6B7280'>)</span>
+                              </span>`}
+                          </div>`
+          },
+        },
+      },
+    ],
+  }
+  const sumData = isAvg ? (sum(yData) / yData.length) : sum(yData)
+
+  return (
+    <div className={`flex w-full flex-col rounded-xl bg-components-chart-bg px-6 py-4 shadow-xs ${className ?? ''}`}>
+      <div className='mb-3'>
+        <Basic name={title} type={timePeriod} hoverTip={explanation} />
+      </div>
+      <div className='mb-4 flex-1'>
+        <Basic
+          isExtraInLine={CHART_TYPE_CONFIG[chartType].showTokens}
+          name={chartType !== 'costs' ? (`${sumData.toLocaleString()} ${unit}`) : `${sumData < 1000 ? sumData : (`${formatNumber(Math.round(sumData / 1000))}k`)}`}
+          type={!CHART_TYPE_CONFIG[chartType].showTokens
+            ? ''
+            : <span>{t('appOverview.analysis.tokenUsage.consumed')} Tokens<span className='text-sm'>
+              <span className='ml-1 text-text-tertiary'>(</span>
+              <span className='text-orange-400'>~{sum(statistics.map(item => Number.parseFloat(get(item, 'total_price', '0')))).toLocaleString('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 4 })}</span>
+              <span className='text-text-tertiary'>)</span>
+            </span></span>}
+          textStyle={{ main: `!text-3xl !font-normal ${sumData === 0 ? '!text-text-quaternary' : ''}` }} />
+      </div>
+      <ReactECharts option={options} style={{ height: 160 }} />
+    </div>
+  )
+}
+
+const getDefaultChartData = ({ start, end, key = 'count' }: { start: string; end: string; key?: string }) => {
+  const diffDays = dayjs(end).diff(dayjs(start), 'day')
+  return Array.from({ length: diffDays || 1 }, () => ({ date: '', [key]: 0 })).map((item, index) => {
+    item.date = dayjs(start).add(index, 'day').format(commonDateFormat)
+    return item
+  })
+}
+
+export const MessagesChart: FC<IBizChartProps> = ({ id, period }) => {
+  const { t } = useTranslation()
+  const { data: response } = useSWR({ url: `/apps/${id}/statistics/daily-messages`, params: period.query }, getAppDailyMessages)
+  if (!response)
+    return <Loading />
+  const noDataFlag = !response.data || response.data.length === 0
+  return <Chart
+    basicInfo={{ title: t('appOverview.analysis.totalMessages.title'), explanation: t('appOverview.analysis.totalMessages.explanation'), timePeriod: period.name }}
+    chartData={!noDataFlag ? response : { data: getDefaultChartData(period.query ?? defaultPeriod) }}
+    chartType='messages'
+    {...(noDataFlag && { yMax: 500 })}
+  />
+}
+
+export const ConversationsChart: FC<IBizChartProps> = ({ id, period }) => {
+  const { t } = useTranslation()
+  const { data: response } = useSWR({ url: `/apps/${id}/statistics/daily-conversations`, params: period.query }, getAppDailyConversations)
+  if (!response)
+    return <Loading />
+  const noDataFlag = !response.data || response.data.length === 0
+  return <Chart
+    basicInfo={{ title: t('appOverview.analysis.totalConversations.title'), explanation: t('appOverview.analysis.totalConversations.explanation'), timePeriod: period.name }}
+    chartData={!noDataFlag ? response : { data: getDefaultChartData(period.query ?? defaultPeriod) }}
+    chartType='conversations'
+    {...(noDataFlag && { yMax: 500 })}
+  />
+}
+
+export const EndUsersChart: FC<IBizChartProps> = ({ id, period }) => {
+  const { t } = useTranslation()
+
+  const { data: response } = useSWR({ url: `/apps/${id}/statistics/daily-end-users`, id, params: period.query }, getAppDailyEndUsers)
+  if (!response)
+    return <Loading />
+  const noDataFlag = !response.data || response.data.length === 0
+  return <Chart
+    basicInfo={{ title: t('appOverview.analysis.activeUsers.title'), explanation: t('appOverview.analysis.activeUsers.explanation'), timePeriod: period.name }}
+    chartData={!noDataFlag ? response : { data: getDefaultChartData(period.query ?? defaultPeriod) }}
+    chartType='endUsers'
+    {...(noDataFlag && { yMax: 500 })}
+  />
+}
+
+export const AvgSessionInteractions: FC<IBizChartProps> = ({ id, period }) => {
+  const { t } = useTranslation()
+  const { data: response } = useSWR({ url: `/apps/${id}/statistics/average-session-interactions`, params: period.query }, getAppStatistics)
+  if (!response)
+    return <Loading />
+  const noDataFlag = !response.data || response.data.length === 0
+  return <Chart
+    basicInfo={{ title: t('appOverview.analysis.avgSessionInteractions.title'), explanation: t('appOverview.analysis.avgSessionInteractions.explanation'), timePeriod: period.name }}
+    chartData={!noDataFlag ? response : { data: getDefaultChartData({ ...(period.query ?? defaultPeriod), key: 'interactions' }) } as any}
+    chartType='conversations'
+    valueKey='interactions'
+    isAvg
+    {...(noDataFlag && { yMax: 500 })}
+  />
+}
+
+export const AvgResponseTime: FC<IBizChartProps> = ({ id, period }) => {
+  const { t } = useTranslation()
+  const { data: response } = useSWR({ url: `/apps/${id}/statistics/average-response-time`, params: period.query }, getAppStatistics)
+  if (!response)
+    return <Loading />
+  const noDataFlag = !response.data || response.data.length === 0
+  return <Chart
+    basicInfo={{ title: t('appOverview.analysis.avgResponseTime.title'), explanation: t('appOverview.analysis.avgResponseTime.explanation'), timePeriod: period.name }}
+    chartData={!noDataFlag ? response : { data: getDefaultChartData({ ...(period.query ?? defaultPeriod), key: 'latency' }) } as any}
+    valueKey='latency'
+    chartType='conversations'
+    isAvg
+    unit={t('appOverview.analysis.ms') as string}
+    {...(noDataFlag && { yMax: 500 })}
+  />
+}
+
+export const TokenPerSecond: FC<IBizChartProps> = ({ id, period }) => {
+  const { t } = useTranslation()
+  const { data: response } = useSWR({ url: `/apps/${id}/statistics/tokens-per-second`, params: period.query }, getAppStatistics)
+  if (!response)
+    return <Loading />
+  const noDataFlag = !response.data || response.data.length === 0
+  return <Chart
+    basicInfo={{ title: t('appOverview.analysis.tps.title'), explanation: t('appOverview.analysis.tps.explanation'), timePeriod: period.name }}
+    chartData={!noDataFlag ? response : { data: getDefaultChartData({ ...(period.query ?? defaultPeriod), key: 'tps' }) } as any}
+    valueKey='tps'
+    chartType='conversations'
+    isAvg
+    unit={t('appOverview.analysis.tokenPS') as string}
+    {...(noDataFlag && { yMax: 100 })}
+    className="min-w-0"
+  />
+}
+
+export const UserSatisfactionRate: FC<IBizChartProps> = ({ id, period }) => {
+  const { t } = useTranslation()
+  const { data: response } = useSWR({ url: `/apps/${id}/statistics/user-satisfaction-rate`, params: period.query }, getAppStatistics)
+  if (!response)
+    return <Loading />
+  const noDataFlag = !response.data || response.data.length === 0
+  return <Chart
+    basicInfo={{ title: t('appOverview.analysis.userSatisfactionRate.title'), explanation: t('appOverview.analysis.userSatisfactionRate.explanation'), timePeriod: period.name }}
+    chartData={!noDataFlag ? response : { data: getDefaultChartData({ ...(period.query ?? defaultPeriod), key: 'rate' }) } as any}
+    valueKey='rate'
+    chartType='endUsers'
+    isAvg
+    {...(noDataFlag && { yMax: 1000 })}
+    className='h-full'
+  />
+}
+
+export const CostChart: FC<IBizChartProps> = ({ id, period }) => {
+  const { t } = useTranslation()
+
+  const { data: response } = useSWR({ url: `/apps/${id}/statistics/token-costs`, params: period.query }, getAppTokenCosts)
+  if (!response)
+    return <Loading />
+  const noDataFlag = !response.data || response.data.length === 0
+  return <Chart
+    basicInfo={{ title: t('appOverview.analysis.tokenUsage.title'), explanation: t('appOverview.analysis.tokenUsage.explanation'), timePeriod: period.name }}
+    chartData={!noDataFlag ? response : { data: getDefaultChartData(period.query ?? defaultPeriod) }}
+    chartType='costs'
+    {...(noDataFlag && { yMax: 100 })}
+  />
+}
+
+export const WorkflowMessagesChart: FC<IBizChartProps> = ({ id, period }) => {
+  const { t } = useTranslation()
+  const { data: response } = useSWR({ url: `/apps/${id}/workflow/statistics/daily-conversations`, params: period.query }, getWorkflowDailyConversations)
+  if (!response)
+    return <Loading />
+  const noDataFlag = !response.data || response.data.length === 0
+  return <Chart
+    basicInfo={{ title: t('appOverview.analysis.totalMessages.title'), explanation: t('appOverview.analysis.totalMessages.explanation'), timePeriod: period.name }}
+    chartData={!noDataFlag ? response : { data: getDefaultChartData({ ...(period.query ?? defaultPeriod), key: 'runs' }) }}
+    chartType='conversations'
+    valueKey='runs'
+    {...(noDataFlag && { yMax: 500 })}
+  />
+}
+
+export const WorkflowDailyTerminalsChart: FC<IBizChartProps> = ({ id, period }) => {
+  const { t } = useTranslation()
+
+  const { data: response } = useSWR({ url: `/apps/${id}/workflow/statistics/daily-terminals`, id, params: period.query }, getAppDailyEndUsers)
+  if (!response)
+    return <Loading />
+  const noDataFlag = !response.data || response.data.length === 0
+  return <Chart
+    basicInfo={{ title: t('appOverview.analysis.activeUsers.title'), explanation: t('appOverview.analysis.activeUsers.explanation'), timePeriod: period.name }}
+    chartData={!noDataFlag ? response : { data: getDefaultChartData(period.query ?? defaultPeriod) }}
+    chartType='endUsers'
+    {...(noDataFlag && { yMax: 500 })}
+  />
+}
+
+export const WorkflowCostChart: FC<IBizChartProps> = ({ id, period }) => {
+  const { t } = useTranslation()
+
+  const { data: response } = useSWR({ url: `/apps/${id}/workflow/statistics/token-costs`, params: period.query }, getAppTokenCosts)
+  if (!response)
+    return <Loading />
+  const noDataFlag = !response.data || response.data.length === 0
+  return <Chart
+    basicInfo={{ title: t('appOverview.analysis.tokenUsage.title'), explanation: t('appOverview.analysis.tokenUsage.explanation'), timePeriod: period.name }}
+    chartData={!noDataFlag ? response : { data: getDefaultChartData(period.query ?? defaultPeriod) }}
+    chartType='workflowCosts'
+    {...(noDataFlag && { yMax: 100 })}
+  />
+}
+
+export const AvgUserInteractions: FC<IBizChartProps> = ({ id, period }) => {
+  const { t } = useTranslation()
+  const { data: response } = useSWR({ url: `/apps/${id}/workflow/statistics/average-app-interactions`, params: period.query }, getAppStatistics)
+  if (!response)
+    return <Loading />
+  const noDataFlag = !response.data || response.data.length === 0
+  return <Chart
+    basicInfo={{ title: t('appOverview.analysis.avgUserInteractions.title'), explanation: t('appOverview.analysis.avgUserInteractions.explanation'), timePeriod: period.name }}
+    chartData={!noDataFlag ? response : { data: getDefaultChartData({ ...(period.query ?? defaultPeriod), key: 'interactions' }) } as any}
+    chartType='conversations'
+    valueKey='interactions'
+    isAvg
+    {...(noDataFlag && { yMax: 500 })}
+  />
+}
+
+export default Chart
diff --git a/app/components/app/overview/assets/chromeplugin-install.svg b/app/components/app/overview/assets/chromeplugin-install.svg
new file mode 100644
index 0000000..a94d0d9
--- /dev/null
+++ b/app/components/app/overview/assets/chromeplugin-install.svg
@@ -0,0 +1,6 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M4.91722 6.7298L3.08403 3.65525C2.93723 3.40905 2.86384 3.28596 2.84729 3.14436C2.83386 3.02937 2.85797 2.8842 2.90785 2.77973C2.96928 2.65108 3.06488 2.5699 3.2561 2.40754C4.53491 1.32168 6.19097 0.666626 8.00002 0.666626C10.5383 0.666626 12.7753 1.95619 14.0918 3.91589C14.2371 4.13226 14.3098 4.24045 14.3034 4.35234C14.2981 4.44429 14.2454 4.54327 14.172 4.59892C14.0827 4.66663 13.9425 4.66663 13.6621 4.66663H8.00002C6.60882 4.66663 5.41668 5.51889 4.91722 6.7298Z" fill="white"/>
+<path d="M0.666687 7.99996C0.666687 6.87421 0.92035 5.80771 1.37364 4.85449C1.48535 4.61957 1.5412 4.50211 1.64056 4.45053C1.72221 4.40813 1.83412 4.40288 1.91938 4.43744C2.02313 4.4795 2.0948 4.5997 2.23814 4.8401L5.06356 9.57876C5.62637 10.6234 6.73029 11.3333 8.00002 11.3333C8.13686 11.3333 8.27178 11.325 8.4043 11.309L6.62101 14.4166C6.4785 14.665 6.40724 14.7891 6.29186 14.873C6.19827 14.941 6.05961 14.9912 5.94418 14.9988C5.80188 15.0083 5.68457 14.9648 5.44995 14.8778C2.65701 13.8418 0.666687 11.1533 0.666687 7.99996Z" fill="white"/>
+<path d="M7.81791 15.0098C7.73532 15.1537 7.83408 15.3333 8.00002 15.3333C12.0501 15.3333 15.3334 12.05 15.3334 7.99996C15.3334 7.58673 15.2992 7.18148 15.2335 6.78688C15.1924 6.53989 15.1718 6.41639 15.0928 6.29755C15.0287 6.20113 14.9162 6.10577 14.8105 6.05838C14.6803 5.99996 14.5371 5.99996 14.2505 5.99996H10.6669C11.0854 6.55707 11.3334 7.24956 11.3334 7.99996C11.3334 8.65299 11.1456 9.26216 10.821 9.77642L7.81791 15.0098Z" fill="white"/>
+<path d="M10 7.99996C10 9.10453 9.10459 9.99996 8.00002 9.99996C6.89545 9.99996 6.00002 9.10453 6.00002 7.99996C6.00002 6.89539 6.89545 5.99996 8.00002 5.99996C9.10459 5.99996 10 6.89539 10 7.99996Z" fill="white"/>
+</svg>
diff --git a/app/components/app/overview/assets/chromeplugin-option.svg b/app/components/app/overview/assets/chromeplugin-option.svg
new file mode 100644
index 0000000..c35a083
--- /dev/null
+++ b/app/components/app/overview/assets/chromeplugin-option.svg
@@ -0,0 +1,159 @@
+<svg width="180" height="131" viewBox="0 0 180 131" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g filter="url(#filter0_d_40_1547)">
+<g clip-path="url(#clip0_40_1547)">
+<rect width="180" height="128" rx="6" fill="#FCFCFD"/>
+<mask id="path-3-inside-1_40_1547" fill="white">
+<path d="M0 0H180V10H0V0Z"/>
+</mask>
+<path d="M0 0H180V10H0V0Z" fill="#F2F4F7"/>
+<circle cx="5.5" cy="5" r="1.5" fill="#D9D9D9"/>
+<circle cx="10.5" cy="5" r="1.5" fill="#D9D9D9"/>
+<circle cx="15.5" cy="5" r="1.5" fill="#D9D9D9"/>
+<g opacity="0.05">
+<rect x="58" y="3" width="64" height="4" rx="1.28571" fill="#101828"/>
+</g>
+<path d="M156.499 3C156.92 3 157.289 3.08357 157.604 3.25071C157.919 3.41785 158.162 3.65337 158.333 3.95726C158.508 4.25736 158.595 4.60494 158.595 5C158.595 5.39126 158.508 5.73884 158.333 6.04274C158.162 6.34663 157.917 6.58215 157.598 6.74929C157.283 6.91643 156.916 7 156.499 7H155V3H156.499Z" fill="white" fill-opacity="0.9"/>
+<path d="M156.499 3C156.92 3 157.289 3.08357 157.604 3.25071C157.919 3.41785 158.162 3.65337 158.333 3.95726C158.508 4.25736 158.595 4.60494 158.595 5C158.595 5.39126 158.508 5.73884 158.333 6.04274C158.162 6.34663 157.917 6.58215 157.598 6.74929C157.283 6.91643 156.916 7 156.499 7H155V3H156.499Z" fill="url(#paint0_angular_40_1547)"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M162.595 3.16669C161.583 3.16669 160.762 3.9875 160.762 5.00002C160.762 6.01254 161.583 6.83335 162.595 6.83335C163.608 6.83335 164.429 6.01254 164.429 5.00002C164.429 3.9875 163.608 3.16669 162.595 3.16669ZM162.38 4.28454C162.445 4.21945 162.445 4.11392 162.38 4.04884C162.315 3.98375 162.209 3.98375 162.144 4.04884L161.644 4.54884C161.579 4.61392 161.579 4.71945 161.644 4.78454L162.144 5.28454C162.209 5.34963 162.315 5.34963 162.38 5.28454C162.445 5.21945 162.445 5.11392 162.38 5.04884L161.998 4.66669L162.38 4.28454ZM163.047 4.7155C162.982 4.65042 162.876 4.65042 162.811 4.7155C162.746 4.78059 162.746 4.88612 162.811 4.9512L163.193 5.33335L162.811 5.7155C162.746 5.78059 162.746 5.88612 162.811 5.9512C162.876 6.01629 162.982 6.01629 163.047 5.9512L163.547 5.4512C163.612 5.38612 163.612 5.28059 163.547 5.2155L163.047 4.7155Z" fill="#D0D5DD"/>
+<path d="M168.663 3.19751C168.618 3.1884 168.573 3.1884 168.528 3.19751C168.477 3.20804 168.431 3.23368 168.395 3.25406L168.385 3.2596C168.091 3.42284 167.594 3.69911 167.314 3.85488C167.246 3.8927 167.212 3.91161 167.2 3.9366C167.191 3.95839 167.19 3.98339 167.2 4.00523C167.212 4.03028 167.245 4.04938 167.313 4.08758L168.53 4.77196C168.554 4.78537 168.566 4.79208 168.578 4.79471C168.59 4.79703 168.601 4.79703 168.612 4.79471C168.625 4.79208 168.637 4.78537 168.661 4.77196L169.877 4.08757C169.945 4.04938 169.979 4.03028 169.991 4.00523C170 3.98339 170 3.95839 169.99 3.9366C169.979 3.91161 169.945 3.8927 169.877 3.85488C169.597 3.69911 169.1 3.42284 168.806 3.2596L168.796 3.25406C168.76 3.23368 168.714 3.20804 168.663 3.19751Z" fill="#D0D5DD"/>
+<path d="M170.261 4.48169C170.261 4.40697 170.261 4.36961 170.246 4.34779C170.232 4.32876 170.211 4.31641 170.187 4.31378C170.161 4.31076 170.128 4.32912 170.063 4.36582L168.83 5.0592C168.805 5.07312 168.793 5.08008 168.784 5.08992C168.776 5.09863 168.77 5.10893 168.766 5.12015C168.762 5.13282 168.762 5.14702 168.762 5.17541V6.53795C168.762 6.61248 168.762 6.64975 168.778 6.67155C168.791 6.69056 168.812 6.70295 168.836 6.70567C168.862 6.70879 168.895 6.69076 168.96 6.65469C169.238 6.50047 169.742 6.22017 170.039 6.05524L170.05 6.04943C170.088 6.02821 170.137 6.00153 170.174 5.96117C170.206 5.92627 170.23 5.88491 170.245 5.83985C170.262 5.78774 170.262 5.73244 170.262 5.68846L170.262 5.67644C170.262 5.34926 170.262 4.79272 170.261 4.48169Z" fill="#D0D5DD"/>
+<path d="M168.231 6.65469C168.296 6.69075 168.328 6.70879 168.355 6.70567C168.378 6.70295 168.399 6.69056 168.413 6.67155C168.429 6.64975 168.429 6.61248 168.429 6.53795V5.17541C168.429 5.14702 168.429 5.13283 168.425 5.12015C168.421 5.10894 168.415 5.09864 168.407 5.08993C168.398 5.08008 168.386 5.07312 168.361 5.0592L167.128 4.36583C167.063 4.32912 167.03 4.31077 167.004 4.31378C166.98 4.31641 166.959 4.32876 166.945 4.3478C166.93 4.36961 166.93 4.40697 166.929 4.4817C166.929 4.79272 166.929 5.34926 166.929 5.67644L166.929 5.68846C166.929 5.73244 166.928 5.78774 166.946 5.83985C166.96 5.88491 166.985 5.92627 167.017 5.96117C167.054 6.00153 167.103 6.02821 167.141 6.04943L167.152 6.05524C167.449 6.22017 167.953 6.50047 168.231 6.65469Z" fill="#D0D5DD"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M173.679 3.75002C173.679 3.42785 173.94 3.16669 174.262 3.16669C174.584 3.16669 174.845 3.42785 174.845 3.75002V3.83335L174.851 3.83335C174.963 3.83335 175.055 3.83335 175.13 3.8385C175.209 3.84383 175.281 3.85526 175.351 3.8841C175.514 3.95176 175.644 4.08155 175.711 4.2449C175.74 4.31453 175.752 4.38688 175.757 4.4651C175.759 4.5007 175.761 4.54002 175.761 4.58335H175.845C176.168 4.58335 176.429 4.84452 176.429 5.16669C176.429 5.48885 176.168 5.75002 175.845 5.75002H175.762V5.87357C175.762 6.00773 175.762 6.11846 175.755 6.20866C175.747 6.30234 175.731 6.38846 175.689 6.46935C175.626 6.59479 175.524 6.69678 175.398 6.76069C175.317 6.80191 175.231 6.81833 175.137 6.82599C175.047 6.83336 174.937 6.83336 174.802 6.83335H174.679C174.587 6.83335 174.512 6.75873 174.512 6.66669V6.37502C174.512 6.25996 174.419 6.16669 174.304 6.16669C174.189 6.16669 174.095 6.25996 174.095 6.37502V6.66669C174.095 6.75873 174.021 6.83335 173.929 6.83335H173.722C173.588 6.83336 173.477 6.83336 173.387 6.82599C173.293 6.81833 173.207 6.80191 173.126 6.76069C173.001 6.69678 172.899 6.59479 172.835 6.46935C172.794 6.38846 172.777 6.30234 172.77 6.20866C172.762 6.11846 172.762 6.00773 172.762 5.87357L172.762 5.58335C172.762 5.49131 172.837 5.41669 172.929 5.41669H173.179C173.317 5.41669 173.429 5.30476 173.429 5.16669C173.429 5.02862 173.317 4.91669 173.179 4.91669H172.929C172.837 4.91669 172.762 4.84207 172.762 4.75002L172.762 4.74431C172.762 4.63268 172.762 4.54053 172.767 4.4651C172.773 4.38688 172.784 4.31453 172.813 4.2449C172.881 4.08155 173.01 3.95176 173.174 3.8841C173.243 3.85526 173.316 3.84383 173.394 3.8385C173.469 3.83335 173.561 3.83335 173.673 3.83335L173.679 3.83335L173.679 3.75002Z" fill="#D0D5DD"/>
+<path d="M180 9.5H0V10.5H180V9.5Z" fill="#EAECF0" mask="url(#path-3-inside-1_40_1547)"/>
+<rect width="180" height="118" transform="translate(0 10)" fill="#F2F4F7"/>
+<mask id="path-13-inside-2_40_1547" fill="white">
+<path d="M0 10H180V22H0V10Z"/>
+</mask>
+<path d="M0 10H180V22H0V10Z" fill="#FCFCFD"/>
+<circle opacity="0.1" cx="10.5" cy="16" r="2.5" fill="#101828"/>
+<g opacity="0.1">
+<rect x="15" y="15.1429" width="15.4286" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="130.286" y="15.1429" width="7.42857" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="141.714" y="15.1429" width="7.42857" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="153.143" y="15.1429" width="7.42857" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="164.571" y="15.1429" width="7.42857" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<path d="M180 21.5H0V22.5H180V21.5Z" fill="black" fill-opacity="0.05" mask="url(#path-13-inside-2_40_1547)"/>
+<rect width="67" height="118" transform="translate(113 10)" fill="url(#paint1_radial_40_1547)"/>
+<g filter="url(#filter1_dd_40_1547)">
+<g clip-path="url(#clip1_40_1547)">
+<rect x="118" y="12" width="60" height="86" rx="4" fill="#F2F4F7"/>
+<mask id="path-23-inside-3_40_1547" fill="white">
+<path d="M118 12H178V21.8578H118V12Z"/>
+</mask>
+<path d="M118 12H178V21.8578H118V12Z" fill="#F9FAFB"/>
+<g opacity="0.12">
+<rect x="138.571" y="16.0718" width="18.8571" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<path d="M178 21.763H118V21.9526H178V21.763Z" fill="#EAECF0" mask="url(#path-23-inside-3_40_1547)"/>
+<g clip-path="url(#clip2_40_1547)">
+<rect width="60" height="76.1422" transform="translate(118 21.8578)" fill="#F9FAFB"/>
+<rect width="60" height="76.1422" transform="translate(118 21.8578)" fill="white"/>
+<g clip-path="url(#clip3_40_1547)">
+<rect x="120.934" y="25.9667" width="12" height="12" rx="6" fill="#D5F5F6"/>
+<path d="M123.434 35.4567H130.434V28.4567H123.434V35.4567Z" fill="url(#pattern0)"/>
+<rect x="121.014" y="26.047" width="11.8393" height="11.8393" rx="5.91964" stroke="black" stroke-opacity="0.05" stroke-width="0.160714"/>
+<path d="M137.033 25.8578H166.738C169.619 25.8578 171.059 25.8578 172.159 26.4183C173.126 26.9114 173.913 27.6981 174.406 28.6658C174.967 29.766 174.967 31.2061 174.967 34.0864V35.6292C174.967 38.5095 174.967 39.9496 174.406 41.0497C173.913 42.0174 173.126 42.8042 172.159 43.2973C171.059 43.8578 169.619 43.8578 166.738 43.8578H145.262C142.382 43.8578 140.941 43.8578 139.841 43.2973C138.874 42.8042 138.087 42.0174 137.594 41.0497C137.033 39.9496 137.033 38.5095 137.033 35.6292V25.8578Z" fill="#F2F4F7"/>
+<g opacity="0.1">
+<rect x="142.176" y="29.715" width="27.6479" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="142.176" y="34.0007" width="27.6479" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="142.176" y="38.2864" width="23.4286" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<path d="M134.794 26.3574C134.652 26.1438 134.805 25.8577 135.062 25.8577H137.033V29.7148L134.794 26.3574Z" fill="#F2F4F7"/>
+</g>
+<rect width="60" height="15.1659" transform="translate(118.066 82.6727)" fill="url(#paint2_linear_40_1547)"/>
+<g filter="url(#filter2_b_40_1547)">
+<rect x="118.066" y="90.6794" width="59.9337" height="7.58293" fill="white" fill-opacity="0.01"/>
+</g>
+<rect x="121.242" y="85.8481" width="53.6493" height="8.81516" rx="2.1327" fill="white"/>
+<g clip-path="url(#clip4_40_1547)">
+<path d="M162.079 90.003V90.2558C162.079 90.7444 161.683 91.1404 161.194 91.1404M160.31 90.003V90.2558C160.31 90.7444 160.706 91.1404 161.194 91.1404M161.194 91.1404V91.5196M160.689 91.5196H161.7M161.194 90.6349C160.985 90.6349 160.815 90.4652 160.815 90.2558V89.3711C160.815 89.1617 160.985 88.9919 161.194 88.9919C161.404 88.9919 161.574 89.1617 161.574 89.3711V90.2558C161.574 90.4652 161.404 90.6349 161.194 90.6349Z" stroke="#667085" stroke-width="0.236967" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<rect x="165.744" y="88.7391" width="0.189573" height="3.03317" fill="black" fill-opacity="0.05"/>
+<path d="M172.083 90.3607C172.116 90.2945 172.116 90.2169 172.083 90.1507C172.055 90.0924 172.004 90.0618 171.978 90.0471C171.95 90.0312 171.913 90.0149 171.877 89.9987L169.226 88.8056C169.189 88.789 169.152 88.7724 169.121 88.7617C169.093 88.7518 169.035 88.7338 168.972 88.7515C168.9 88.7714 168.842 88.8239 168.815 88.8932C168.791 88.9546 168.803 89.0134 168.81 89.0428C168.817 89.0747 168.83 89.113 168.843 89.1514L169.099 89.9246C169.12 89.9868 169.13 90.0179 169.15 90.041C169.167 90.0613 169.188 90.077 169.213 90.0867C169.241 90.0977 169.274 90.0977 169.339 90.0977H170.484C170.571 90.0977 170.642 90.1684 170.642 90.2557C170.642 90.3429 170.571 90.4137 170.484 90.4137H169.342C169.277 90.4137 169.244 90.4137 169.216 90.4246C169.192 90.4343 169.17 90.4499 169.153 90.4702C169.134 90.4931 169.123 90.5241 169.103 90.5862L168.844 91.3589C168.831 91.3974 168.818 91.4357 168.811 91.4677C168.804 91.497 168.791 91.556 168.815 91.6175C168.842 91.6869 168.901 91.7396 168.972 91.7596C169.036 91.7774 169.093 91.7593 169.122 91.7494C169.153 91.7387 169.19 91.7221 169.227 91.7054L171.877 90.5127C171.913 90.4964 171.95 90.4802 171.978 90.4643C172.004 90.4496 172.055 90.419 172.083 90.3607Z" fill="#D0D5DD"/>
+<rect x="121.242" y="85.8481" width="53.6493" height="8.81516" rx="2.1327" stroke="#EAECF0" stroke-width="0.28436"/>
+</g>
+</g>
+<rect x="118.5" y="12.5" width="59" height="85" rx="3.5" stroke="#B2CCFF"/>
+</g>
+</g>
+<rect x="0.25" y="0.25" width="179.5" height="127.5" rx="5.75" stroke="#EAECF0" stroke-width="0.5"/>
+</g>
+<defs>
+<filter id="filter0_d_40_1547" x="-2" y="-1" width="184" height="132" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_40_1547"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_40_1547" result="shape"/>
+</filter>
+<filter id="filter1_dd_40_1547" x="114.209" y="12" width="67.5829" height="93.5829" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feMorphology radius="0.758293" operator="erode" in="SourceAlpha" result="effect1_dropShadow_40_1547"/>
+<feOffset dy="1.51659"/>
+<feGaussianBlur stdDeviation="0.758293"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.03 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_40_1547"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feMorphology radius="0.758293" operator="erode" in="SourceAlpha" result="effect2_dropShadow_40_1547"/>
+<feOffset dy="3.79147"/>
+<feGaussianBlur stdDeviation="2.27488"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.08 0"/>
+<feBlend mode="normal" in2="effect1_dropShadow_40_1547" result="effect2_dropShadow_40_1547"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow_40_1547" result="shape"/>
+</filter>
+<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_40_1547" transform="scale(0.00625)"/>
+</pattern>
+<filter id="filter2_b_40_1547" x="116.55" y="89.1629" width="62.9668" height="10.6161" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feGaussianBlur in="BackgroundImageFix" stdDeviation="0.758293"/>
+<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_40_1547"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_40_1547" result="shape"/>
+</filter>
+<radialGradient id="paint0_angular_40_1547" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(156.667 5) rotate(90) scale(2 1.91353)">
+<stop stop-color="#001FC2"/>
+<stop offset="0.711334" stop-color="#0667F8" stop-opacity="0.2"/>
+<stop offset="1" stop-color="#155EEF" stop-opacity="0"/>
+</radialGradient>
+<radialGradient id="paint1_radial_40_1547" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(64.5) rotate(135.735) scale(55.1589 31.9368)">
+<stop stop-color="#101828" stop-opacity="0.1"/>
+<stop offset="1" stop-color="#101828" stop-opacity="0"/>
+</radialGradient>
+<linearGradient id="paint2_linear_40_1547" x1="30" y1="0" x2="30" y2="15.1659" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<clipPath id="clip0_40_1547">
+<rect width="180" height="128" rx="6" fill="white"/>
+</clipPath>
+<clipPath id="clip1_40_1547">
+<rect x="118" y="12" width="60" height="86" rx="4" fill="white"/>
+</clipPath>
+<clipPath id="clip2_40_1547">
+<rect width="60" height="76.1422" fill="white" transform="translate(118 21.8578)"/>
+</clipPath>
+<clipPath id="clip3_40_1547">
+<rect width="60" height="76.1422" fill="white" transform="translate(118 21.8578)"/>
+</clipPath>
+<clipPath id="clip4_40_1547">
+<rect width="3.03317" height="3.03317" fill="white" transform="translate(159.678 88.7391)"/>
+</clipPath>
+<image id="image0_40_1547" width="160" height="160" xlink:href="data:image/png;base64,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"/>
+</defs>
+</svg>
diff --git a/app/components/app/overview/assets/code-browser.svg b/app/components/app/overview/assets/code-browser.svg
new file mode 100644
index 0000000..33434d7
--- /dev/null
+++ b/app/components/app/overview/assets/code-browser.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M14.6667 6H1.33337M9.33337 11.6667L11 10L9.33337 8.33333M6.66671 8.33333L5.00004 10L6.66671 11.6667M1.33337 5.2L1.33337 10.8C1.33337 11.9201 1.33337 12.4802 1.55136 12.908C1.74311 13.2843 2.04907 13.5903 2.42539 13.782C2.85322 14 3.41327 14 4.53337 14H11.4667C12.5868 14 13.1469 14 13.5747 13.782C13.951 13.5903 14.257 13.2843 14.4487 12.908C14.6667 12.4802 14.6667 11.9201 14.6667 10.8V5.2C14.6667 4.0799 14.6667 3.51984 14.4487 3.09202C14.257 2.7157 13.951 2.40973 13.5747 2.21799C13.1469 2 12.5868 2 11.4667 2L4.53337 2C3.41327 2 2.85322 2 2.42539 2.21799C2.04907 2.40973 1.74311 2.71569 1.55136 3.09202C1.33337 3.51984 1.33337 4.0799 1.33337 5.2Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/app/overview/assets/iframe-option.svg b/app/components/app/overview/assets/iframe-option.svg
new file mode 100644
index 0000000..d9ffc02
--- /dev/null
+++ b/app/components/app/overview/assets/iframe-option.svg
@@ -0,0 +1,102 @@
+<svg width="192" height="132" viewBox="0 0 192 132" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g filter="url(#filter0_d_6785_52470)">
+<g clip-path="url(#clip0_6785_52470)">
+<rect x="2" y="1" width="188" height="128" rx="6" fill="#FCFCFD"/>
+<mask id="path-3-inside-1_6785_52470" fill="white">
+<path d="M2 1H190V11H2V1Z"/>
+</mask>
+<path d="M2 1H190V11H2V1Z" fill="#F2F4F7"/>
+<circle cx="7.5" cy="6" r="1.5" fill="#D9D9D9"/>
+<circle cx="12.5" cy="6" r="1.5" fill="#D9D9D9"/>
+<circle cx="17.5" cy="6" r="1.5" fill="#D9D9D9"/>
+<path d="M190 10.5H2V11.5H190V10.5Z" fill="#EAECF0" mask="url(#path-3-inside-1_6785_52470)"/>
+<rect width="188" height="118" transform="translate(2 11)" fill="#F2F4F7"/>
+<mask id="path-8-inside-2_6785_52470" fill="white">
+<path d="M2 11H190V23H2V11Z"/>
+</mask>
+<path d="M2 11H190V23H2V11Z" fill="#FCFCFD"/>
+<circle opacity="0.1" cx="12.5" cy="17" r="2.5" fill="#101828"/>
+<g opacity="0.1">
+<rect x="17" y="16.1428" width="15.4286" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="140.286" y="16.1428" width="7.42857" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="151.714" y="16.1428" width="7.42857" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="163.143" y="16.1428" width="7.42857" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="174.571" y="16.1428" width="7.42857" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<path d="M190 22.5H2V23.5H190V22.5Z" fill="black" fill-opacity="0.05" mask="url(#path-8-inside-2_6785_52470)"/>
+<g clip-path="url(#clip1_6785_52470)">
+<rect x="36" y="35" width="120" height="80" rx="4" fill="#F2F4F7"/>
+<rect width="120" height="80" transform="translate(36 35)" fill="white"/>
+<rect x="40.9004" y="40.1089" width="12" height="12" rx="6" fill="#D5F5F6"/>
+<path d="M43.4004 49.5989H50.4004V42.5989H43.4004V49.5989Z" fill="url(#pattern0)"/>
+<rect x="40.9807" y="40.1892" width="11.8393" height="11.8393" rx="5.91964" stroke="black" stroke-opacity="0.05" stroke-width="0.160714"/>
+<path d="M57 40H142.771C145.652 40 147.092 40 148.192 40.5605C149.16 41.0536 149.946 41.8404 150.439 42.8081C151 43.9082 151 45.3483 151 48.2286V49.7714C151 52.6517 151 54.0918 150.439 55.192C149.946 56.1597 149.16 56.9464 148.192 57.4395C147.092 58 145.652 58 142.771 58H65.2286C62.3483 58 60.9082 58 59.8081 57.4395C58.8404 56.9464 58.0536 56.1597 57.5605 55.192C57 54.0918 57 52.6517 57 49.7714V40Z" fill="#F2F4F7"/>
+<g opacity="0.1">
+<rect x="62.1428" y="43.8572" width="83.7143" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="62.1428" y="48.1428" width="83.7143" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="62.1428" y="52.4287" width="23.4286" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<path d="M54.7611 40.4995C54.6187 40.2859 54.7718 39.9998 55.0286 39.9998H56.9994V43.8569L54.7611 40.4995Z" fill="#F2F4F7"/>
+<rect width="119.934" height="15.1659" transform="translate(36 100.303)" fill="url(#paint0_linear_6785_52470)"/>
+<g filter="url(#filter1_b_6785_52470)">
+<rect x="36" y="108.31" width="119.934" height="7.58293" fill="white" fill-opacity="0.01"/>
+</g>
+<rect x="39.1754" y="103.479" width="113.583" height="8.81516" rx="2.1327" fill="white"/>
+<g clip-path="url(#clip2_6785_52470)">
+<path d="M139.946 107.633V107.886C139.946 108.374 139.55 108.771 139.061 108.771M138.177 107.633V107.886C138.177 108.374 138.573 108.771 139.061 108.771M139.061 108.771V109.15M138.556 109.15H139.567M139.061 108.265C138.852 108.265 138.682 108.095 138.682 107.886V107.001C138.682 106.792 138.852 106.622 139.061 106.622C139.271 106.622 139.441 106.792 139.441 107.001V107.886C139.441 108.095 139.271 108.265 139.061 108.265Z" stroke="#667085" stroke-width="0.236967" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<rect x="143.612" y="106.369" width="0.189573" height="3.03317" fill="black" fill-opacity="0.05"/>
+<path d="M149.951 107.991C149.984 107.925 149.984 107.847 149.951 107.781C149.922 107.723 149.872 107.692 149.845 107.678C149.817 107.662 149.781 107.645 149.745 107.629L147.094 106.436C147.057 106.419 147.02 106.403 146.989 106.392C146.96 106.382 146.903 106.364 146.84 106.382C146.768 106.402 146.71 106.454 146.683 106.524C146.658 106.585 146.671 106.644 146.677 106.673C146.685 106.705 146.698 106.743 146.71 106.782L146.967 107.555C146.988 107.617 146.998 107.648 147.017 107.671C147.034 107.692 147.056 107.708 147.081 107.717C147.109 107.728 147.141 107.728 147.207 107.728H148.351C148.439 107.728 148.509 107.799 148.509 107.886C148.509 107.973 148.439 108.044 148.351 108.044H147.21C147.144 108.044 147.112 108.044 147.084 108.055C147.059 108.065 147.038 108.08 147.021 108.101C147.001 108.124 146.991 108.155 146.97 108.217L146.712 108.989C146.699 109.028 146.686 109.066 146.678 109.098C146.671 109.128 146.659 109.187 146.683 109.248C146.71 109.317 146.768 109.37 146.84 109.39C146.904 109.408 146.961 109.39 146.99 109.38C147.021 109.369 147.057 109.353 147.094 109.336L149.745 108.143C149.781 108.127 149.817 108.111 149.845 108.095C149.872 108.08 149.922 108.05 149.951 107.991Z" fill="#D0D5DD"/>
+<rect x="39.1754" y="103.479" width="113.583" height="8.81516" rx="2.1327" stroke="#EAECF0" stroke-width="0.28436"/>
+</g>
+<rect x="36.5" y="35.5" width="119" height="79" rx="3.5" stroke="#B2CCFF"/>
+</g>
+<rect x="2.25" y="1.25" width="187.5" height="127.5" rx="5.75" stroke="#EAECF0" stroke-width="0.5"/>
+</g>
+<defs>
+<filter id="filter0_d_6785_52470" x="0" y="0" width="192" height="132" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6785_52470"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6785_52470" result="shape"/>
+</filter>
+<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_6785_52470" transform="scale(0.00625)"/>
+</pattern>
+<filter id="filter1_b_6785_52470" x="34.4834" y="106.793" width="122.967" height="10.6162" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feGaussianBlur in="BackgroundImageFix" stdDeviation="0.758293"/>
+<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_6785_52470"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_6785_52470" result="shape"/>
+</filter>
+<linearGradient id="paint0_linear_6785_52470" x1="59.9668" y1="0" x2="59.9668" y2="15.1659" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<clipPath id="clip0_6785_52470">
+<rect x="2" y="1" width="188" height="128" rx="6" fill="white"/>
+</clipPath>
+<clipPath id="clip1_6785_52470">
+<rect x="36" y="35" width="120" height="80" rx="4" fill="white"/>
+</clipPath>
+<clipPath id="clip2_6785_52470">
+<rect width="3.03317" height="3.03317" fill="white" transform="translate(137.545 106.369)"/>
+</clipPath>
+<image id="image0_6785_52470" width="160" height="160" xlink:href="data:image/png;base64,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"/>
+</defs>
+</svg>
diff --git a/app/components/app/overview/assets/refresh-hover.svg b/app/components/app/overview/assets/refresh-hover.svg
new file mode 100644
index 0000000..b2d2813
--- /dev/null
+++ b/app/components/app/overview/assets/refresh-hover.svg
@@ -0,0 +1,3 @@
+<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M21.6353 16.5954C21.4501 18.3353 20.4643 19.9658 18.833 20.9076C16.1226 22.4724 12.6569 21.5438 11.0921 18.8335L10.9255 18.5448M10.3641 15.4047C10.5493 13.6647 11.5352 12.0343 13.1665 11.0924C15.8768 9.5276 19.3425 10.4562 20.9073 13.1666L21.074 13.4552M10.3288 20.044L10.8168 18.2227L12.6382 18.7107M19.3616 13.2893L21.183 13.7774L21.671 11.956" stroke="#1D2939" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/app/overview/assets/refresh.svg b/app/components/app/overview/assets/refresh.svg
new file mode 100644
index 0000000..be35d3c
--- /dev/null
+++ b/app/components/app/overview/assets/refresh.svg
@@ -0,0 +1,3 @@
+<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M21.6353 16.5954C21.4501 18.3353 20.4643 19.9658 18.833 20.9076C16.1226 22.4724 12.6569 21.5438 11.0921 18.8335L10.9255 18.5448M10.3641 15.4047C10.5493 13.6647 11.5352 12.0343 13.1665 11.0924C15.8768 9.5276 19.3425 10.4562 20.9073 13.1666L21.074 13.4552M10.3288 20.044L10.8168 18.2227L12.6382 18.7107M19.3616 13.2893L21.183 13.7774L21.671 11.956" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/app/overview/assets/scripts-option.svg b/app/components/app/overview/assets/scripts-option.svg
new file mode 100644
index 0000000..fee4040
--- /dev/null
+++ b/app/components/app/overview/assets/scripts-option.svg
@@ -0,0 +1,160 @@
+<svg width="188" height="128" viewBox="0 0 188 128" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g filter="url(#filter0_d_6785_52392)">
+<g clip-path="url(#clip0_6785_52392)">
+<rect width="188" height="128" rx="6" fill="#FCFCFD"/>
+<mask id="path-3-inside-1_6785_52392" fill="white">
+<path d="M0 0H188V10H0V0Z"/>
+</mask>
+<path d="M0 0H188V10H0V0Z" fill="#F2F4F7"/>
+<circle cx="5.5" cy="5" r="1.5" fill="#D9D9D9"/>
+<circle cx="10.5" cy="5" r="1.5" fill="#D9D9D9"/>
+<circle cx="15.5" cy="5" r="1.5" fill="#D9D9D9"/>
+<g opacity="0.05">
+<rect x="62" y="3" width="64" height="4" rx="1.28571" fill="#101828"/>
+</g>
+<path d="M188 9.5H0V10.5H188V9.5Z" fill="#EAECF0" mask="url(#path-3-inside-1_6785_52392)"/>
+<rect width="188" height="118" transform="translate(0 10)" fill="#F2F4F7"/>
+<mask id="path-9-inside-2_6785_52392" fill="white">
+<path d="M0 10H188V22H0V10Z"/>
+</mask>
+<path d="M0 10H188V22H0V10Z" fill="#FCFCFD"/>
+<circle opacity="0.1" cx="10.5" cy="16" r="2.5" fill="#101828"/>
+<g opacity="0.1">
+<rect x="15" y="15.1428" width="15.4286" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="138.286" y="15.1428" width="7.42857" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="149.714" y="15.1428" width="7.42857" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="161.143" y="15.1428" width="7.42857" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="172.571" y="15.1428" width="7.42857" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<path d="M188 21.5H0V22.5H188V21.5Z" fill="black" fill-opacity="0.05" mask="url(#path-9-inside-2_6785_52392)"/>
+<rect width="70" height="101.1" transform="translate(117.934 27.3269)" fill="url(#paint0_radial_6785_52392)"/>
+<g filter="url(#filter1_dd_6785_52392)">
+<g clip-path="url(#clip1_6785_52392)">
+<rect x="122.934" y="32.3269" width="60" height="80" rx="4" fill="#F2F4F7"/>
+<mask id="path-19-inside-3_6785_52392" fill="white">
+<path d="M122.934 32.3269H182.934V42.1847H122.934V32.3269Z"/>
+</mask>
+<path d="M122.934 32.3269H182.934V42.1847H122.934V32.3269Z" fill="#F9FAFB"/>
+<g opacity="0.12">
+<rect x="143.505" y="36.3987" width="18.8571" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<path d="M182.934 42.0899H122.934V42.2795H182.934V42.0899Z" fill="#EAECF0" mask="url(#path-19-inside-3_6785_52392)"/>
+<g clip-path="url(#clip2_6785_52392)">
+<rect width="60" height="70.1422" transform="translate(122.934 42.1848)" fill="#F9FAFB"/>
+<rect width="60" height="70.1422" transform="translate(122.934 42.1848)" fill="white"/>
+<g clip-path="url(#clip3_6785_52392)">
+<rect x="125.867" y="46.2937" width="12" height="12" rx="6" fill="#D5F5F6"/>
+<path d="M128.367 55.7837H135.367V48.7837H128.367V55.7837Z" fill="url(#pattern0)"/>
+<rect x="125.948" y="46.3741" width="11.8393" height="11.8393" rx="5.91964" stroke="black" stroke-opacity="0.05" stroke-width="0.160714"/>
+<path d="M141.967 46.1848H171.672C174.552 46.1848 175.992 46.1848 177.092 46.7454C178.06 47.2384 178.847 48.0252 179.34 48.9929C179.9 50.093 179.9 51.5331 179.9 54.4134V55.9562C179.9 58.8365 179.9 60.2767 179.34 61.3768C178.847 62.3445 178.06 63.1312 177.092 63.6243C175.992 64.1848 174.552 64.1848 171.672 64.1848H150.195C147.315 64.1848 145.875 64.1848 144.775 63.6243C143.807 63.1312 143.02 62.3445 142.527 61.3768C141.967 60.2767 141.967 58.8365 141.967 55.9562V46.1848Z" fill="#F2F4F7"/>
+<g opacity="0.1">
+<rect x="147.11" y="50.042" width="27.6479" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="147.11" y="54.3276" width="27.6479" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<g opacity="0.1">
+<rect x="147.11" y="58.6135" width="23.4286" height="1.71429" rx="0.857144" fill="#101828"/>
+</g>
+<path d="M139.728 46.6843C139.586 46.4707 139.739 46.1846 139.995 46.1846H141.966V50.0417L139.728 46.6843Z" fill="#F2F4F7"/>
+</g>
+<rect width="60" height="15.1659" transform="translate(123 96.9998)" fill="url(#paint1_linear_6785_52392)"/>
+<g filter="url(#filter2_b_6785_52392)">
+<rect x="123" y="105.007" width="59.9337" height="7.58293" fill="white" fill-opacity="0.01"/>
+</g>
+<rect x="126.175" y="100.175" width="53.6493" height="8.81516" rx="2.1327" fill="white"/>
+<g clip-path="url(#clip4_6785_52392)">
+<path d="M167.012 104.33V104.582C167.012 105.071 166.616 105.467 166.128 105.467M165.243 104.33V104.582C165.243 105.071 165.639 105.467 166.128 105.467M166.128 105.467V105.846M165.622 105.846H166.633M166.128 104.962C165.918 104.962 165.748 104.792 165.748 104.582V103.698C165.748 103.488 165.918 103.319 166.128 103.319C166.337 103.319 166.507 103.488 166.507 103.698V104.582C166.507 104.792 166.337 104.962 166.128 104.962Z" stroke="#667085" stroke-width="0.236967" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<rect x="170.678" y="103.066" width="0.189573" height="3.03317" fill="black" fill-opacity="0.05"/>
+<path d="M177.017 104.688C177.05 104.622 177.05 104.544 177.017 104.478C176.988 104.419 176.938 104.389 176.912 104.374C176.883 104.358 176.847 104.342 176.811 104.326L174.16 103.133C174.123 103.116 174.086 103.099 174.055 103.089C174.027 103.079 173.969 103.061 173.906 103.078C173.834 103.098 173.776 103.151 173.749 103.22C173.725 103.282 173.737 103.34 173.744 103.37C173.751 103.402 173.764 103.44 173.777 103.478L174.033 104.252C174.054 104.314 174.064 104.345 174.083 104.368C174.1 104.388 174.122 104.404 174.147 104.414C174.175 104.425 174.207 104.425 174.273 104.425H175.417C175.505 104.425 175.575 104.495 175.575 104.583C175.575 104.67 175.505 104.741 175.417 104.741H174.276C174.211 104.741 174.178 104.741 174.15 104.752C174.125 104.761 174.104 104.777 174.087 104.797C174.068 104.82 174.057 104.851 174.036 104.913L173.778 105.686C173.765 105.724 173.752 105.763 173.744 105.795C173.737 105.824 173.725 105.883 173.749 105.945C173.776 106.014 173.834 106.067 173.906 106.087C173.97 106.104 174.027 106.086 174.056 106.076C174.087 106.066 174.124 106.049 174.161 106.032L176.811 104.84C176.847 104.823 176.883 104.807 176.912 104.791C176.938 104.777 176.988 104.746 177.017 104.688Z" fill="#D0D5DD"/>
+<rect x="126.175" y="100.175" width="53.6493" height="8.81516" rx="2.1327" stroke="#EAECF0" stroke-width="0.28436"/>
+</g>
+</g>
+<rect x="123.434" y="32.8269" width="59" height="79" rx="3.5" stroke="#B2CCFF"/>
+</g>
+<g filter="url(#filter3_d_6785_52392)">
+<rect x="173.834" y="114.327" width="9.09953" height="9.09952" rx="4.54976" fill="#004EEB"/>
+<path d="M179.521 120.014L177.246 117.739M177.246 120.014L179.521 117.739" stroke="white" stroke-width="0.379147" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</g>
+<rect x="0.25" y="0.25" width="187.5" height="127.5" rx="5.75" stroke="#EAECF0" stroke-width="0.5"/>
+</g>
+<defs>
+<filter id="filter0_d_6785_52392" x="-2" y="-1" width="192" height="132" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6785_52392"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6785_52392" result="shape"/>
+</filter>
+<filter id="filter1_dd_6785_52392" x="119.142" y="32.3269" width="67.5829" height="87.5829" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feMorphology radius="0.758293" operator="erode" in="SourceAlpha" result="effect1_dropShadow_6785_52392"/>
+<feOffset dy="1.51659"/>
+<feGaussianBlur stdDeviation="0.758293"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.03 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6785_52392"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feMorphology radius="0.758293" operator="erode" in="SourceAlpha" result="effect2_dropShadow_6785_52392"/>
+<feOffset dy="3.79147"/>
+<feGaussianBlur stdDeviation="2.27488"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.08 0"/>
+<feBlend mode="normal" in2="effect1_dropShadow_6785_52392" result="effect2_dropShadow_6785_52392"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow_6785_52392" result="shape"/>
+</filter>
+<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_6785_52392" transform="scale(0.00625)"/>
+</pattern>
+<filter id="filter2_b_6785_52392" x="121.483" y="103.49" width="62.9668" height="10.6162" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feGaussianBlur in="BackgroundImageFix" stdDeviation="0.758293"/>
+<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_6785_52392"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_6785_52392" result="shape"/>
+</filter>
+<filter id="filter3_d_6785_52392" x="173.455" y="114.137" width="9.8579" height="9.8579" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="0.189573"/>
+<feGaussianBlur stdDeviation="0.189573"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6785_52392"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6785_52392" result="shape"/>
+</filter>
+<radialGradient id="paint0_radial_6785_52392" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(70 101.1) rotate(180) scale(68.8389 32.6854)">
+<stop stop-color="#101828" stop-opacity="0.1"/>
+<stop offset="1" stop-color="#101828" stop-opacity="0"/>
+</radialGradient>
+<linearGradient id="paint1_linear_6785_52392" x1="30" y1="0" x2="30" y2="15.1659" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<clipPath id="clip0_6785_52392">
+<rect width="188" height="128" rx="6" fill="white"/>
+</clipPath>
+<clipPath id="clip1_6785_52392">
+<rect x="122.934" y="32.3269" width="60" height="80" rx="4" fill="white"/>
+</clipPath>
+<clipPath id="clip2_6785_52392">
+<rect width="60" height="70.1422" fill="white" transform="translate(122.934 42.1848)"/>
+</clipPath>
+<clipPath id="clip3_6785_52392">
+<rect width="60" height="70.1422" fill="white" transform="translate(122.934 42.1848)"/>
+</clipPath>
+<clipPath id="clip4_6785_52392">
+<rect width="3.03317" height="3.03317" fill="white" transform="translate(164.611 103.066)"/>
+</clipPath>
+<image id="image0_6785_52392" width="160" height="160" xlink:href="data:image/png;base64,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"/>
+</defs>
+</svg>
diff --git a/app/components/app/overview/customize/index.tsx b/app/components/app/overview/customize/index.tsx
new file mode 100644
index 0000000..4e84dd8
--- /dev/null
+++ b/app/components/app/overview/customize/index.tsx
@@ -0,0 +1,119 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { ArrowTopRightOnSquareIcon } from '@heroicons/react/24/outline'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import type { AppMode } from '@/types/app'
+import I18n from '@/context/i18n'
+import Button from '@/app/components/base/button'
+import Modal from '@/app/components/base/modal'
+import Tag from '@/app/components/base/tag'
+import { LanguagesSupported } from '@/i18n/language'
+
+type IShareLinkProps = {
+  isShow: boolean
+  onClose: () => void
+  linkUrl: string
+  api_base_url: string
+  appId: string
+  mode: AppMode
+}
+
+const StepNum: FC<{ children: React.ReactNode }> = ({ children }) =>
+  <div className='mr-3 flex h-7 w-7 shrink-0 items-center justify-center rounded-2xl bg-util-colors-blue-blue-50 text-text-accent'>
+    {children}
+  </div>
+
+const GithubIcon = ({ className }: { className: string }) => {
+  return (
+    <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg" className={className}>
+      <path d="M5.80078 13.7109C5.80078 13.6406 5.73047 13.5703 5.625 13.5703C5.51953 13.5703 5.44922 13.6406 5.44922 13.7109C5.44922 13.7812 5.51953 13.8516 5.625 13.8164C5.73047 13.8164 5.80078 13.7812 5.80078 13.7109ZM4.71094 13.5352C4.71094 13.6055 4.78125 13.7109 4.88672 13.7109C4.95703 13.7461 5.0625 13.7109 5.09766 13.6406C5.09766 13.5703 5.0625 13.5 4.95703 13.4648C4.85156 13.4297 4.74609 13.4648 4.71094 13.5352ZM6.29297 13.5C6.1875 13.5 6.11719 13.5703 6.11719 13.6758C6.11719 13.7461 6.22266 13.7812 6.32812 13.7461C6.43359 13.7109 6.50391 13.6758 6.46875 13.6055C6.46875 13.5352 6.36328 13.4648 6.29297 13.5ZM8.57812 0C3.72656 0 0 3.72656 0 8.57812C0 12.4805 2.42578 15.8203 5.94141 17.0156C6.39844 17.0859 6.53906 16.8047 6.53906 16.5938C6.53906 16.3477 6.53906 15.1523 6.53906 14.4141C6.53906 14.4141 4.07812 14.9414 3.55078 13.3594C3.55078 13.3594 3.16406 12.3398 2.60156 12.0938C2.60156 12.0938 1.79297 11.5312 2.63672 11.5312C2.63672 11.5312 3.51562 11.6016 4.00781 12.4453C4.78125 13.8164 6.04688 13.4297 6.57422 13.1836C6.64453 12.6211 6.85547 12.2344 7.13672 11.9883C5.16797 11.7773 3.16406 11.4961 3.16406 8.12109C3.16406 7.13672 3.44531 6.67969 4.00781 6.04688C3.90234 5.80078 3.62109 4.88672 4.11328 3.65625C4.81641 3.44531 6.53906 4.60547 6.53906 4.60547C7.24219 4.39453 7.98047 4.32422 8.71875 4.32422C9.49219 4.32422 10.2305 4.39453 10.9336 4.60547C10.9336 4.60547 12.6211 3.41016 13.3594 3.65625C13.8516 4.88672 13.5352 5.80078 13.4648 6.04688C14.0273 6.67969 14.3789 7.13672 14.3789 8.12109C14.3789 11.4961 12.3047 11.7773 10.3359 11.9883C10.6523 12.2695 10.9336 12.7969 10.9336 13.6406C10.9336 14.8008 10.8984 16.2773 10.8984 16.5586C10.8984 16.8047 11.0742 17.0859 11.5312 16.9805C15.0469 15.8203 17.4375 12.4805 17.4375 8.57812C17.4375 3.72656 13.4648 0 8.57812 0ZM3.41016 12.1289C3.33984 12.1641 3.375 12.2695 3.41016 12.3398C3.48047 12.375 3.55078 12.4102 3.62109 12.375C3.65625 12.3398 3.65625 12.2344 3.58594 12.1641C3.51562 12.1289 3.44531 12.0938 3.41016 12.1289ZM3.02344 11.8477C2.98828 11.918 3.02344 11.9531 3.09375 11.9883C3.16406 12.0234 3.23438 12.0234 3.26953 11.9531C3.26953 11.918 3.23438 11.8828 3.16406 11.8477C3.09375 11.8125 3.05859 11.8125 3.02344 11.8477ZM4.14844 13.1133C4.11328 13.1484 4.11328 13.2539 4.21875 13.3242C4.28906 13.3945 4.39453 13.4297 4.42969 13.3594C4.46484 13.3242 4.46484 13.2188 4.39453 13.1484C4.32422 13.0781 4.21875 13.043 4.14844 13.1133ZM3.76172 12.5859C3.69141 12.6211 3.69141 12.7266 3.76172 12.7969C3.83203 12.8672 3.90234 12.9023 3.97266 12.8672C4.00781 12.832 4.00781 12.7266 3.97266 12.6562C3.90234 12.5859 3.83203 12.5508 3.76172 12.5859Z" fill="#1F2A37" />
+    </svg>
+  )
+}
+
+const prefixCustomize = 'appOverview.overview.appInfo.customize'
+
+const CustomizeModal: FC<IShareLinkProps> = ({
+  isShow,
+  onClose,
+  appId,
+  api_base_url,
+  mode,
+}) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const isChatApp = mode === 'chat' || mode === 'advanced-chat'
+
+  return <Modal
+    title={t(`${prefixCustomize}.title`)}
+    description={t(`${prefixCustomize}.explanation`)}
+    isShow={isShow}
+    onClose={onClose}
+    className='w-[640px] !max-w-2xl'
+    closable={true}
+  >
+    <div className='mt-4 w-full rounded-lg border-[0.5px] border-components-panel-border px-6 py-5'>
+      <Tag bordered={true} hideBg={true} className='border-text-accent-secondary uppercase text-text-accent-secondary'>{t(`${prefixCustomize}.way`)} 1</Tag>
+      <p className='system-sm-medium my-2 text-text-secondary'>{t(`${prefixCustomize}.way1.name`)}</p>
+      <div className='flex py-4'>
+        <StepNum>1</StepNum>
+        <div className='flex flex-col'>
+          <div className='text-text-primary'>{t(`${prefixCustomize}.way1.step1`)}</div>
+          <div className='mb-2 mt-1 text-xs text-text-tertiary'>{t(`${prefixCustomize}.way1.step1Tip`)}</div>
+          <a href={`https://github.com/langgenius/${isChatApp ? 'webapp-conversation' : 'webapp-text-generator'}`} target='_blank' rel='noopener noreferrer'>
+            <Button><GithubIcon className='mr-2 text-text-secondary' />{t(`${prefixCustomize}.way1.step1Operation`)}</Button>
+          </a>
+        </div>
+      </div>
+      <div className='flex pt-4'>
+        <StepNum>2</StepNum>
+        <div className='flex flex-col'>
+          <div className='text-text-primary'>{t(`${prefixCustomize}.way1.step3`)}</div>
+          <div className='mb-2 mt-1 text-xs text-text-tertiary'>{t(`${prefixCustomize}.way1.step2Tip`)}</div>
+          <a href="https://vercel.com/docs/concepts/deployments/git/vercel-for-github" target='_blank' rel='noopener noreferrer'>
+            <Button>
+              <div className='mr-1.5 border-b-[12px] border-l-[7px] border-r-[7px] border-t-0 border-solid border-text-primary border-l-transparent border-r-transparent border-t-transparent'></div>
+              <span>{t(`${prefixCustomize}.way1.step2Operation`)}</span>
+            </Button>
+          </a>
+        </div>
+      </div>
+      <div className='flex py-4'>
+        <StepNum>3</StepNum>
+        <div className='flex w-full flex-col overflow-hidden'>
+          <div className='text-text-primary'>{t(`${prefixCustomize}.way1.step3`)}</div>
+          <div className='mb-2 mt-1 text-xs text-text-tertiary'>{t(`${prefixCustomize}.way1.step3Tip`)}</div>
+          <pre className='box-border select-text overflow-x-scroll rounded-lg border-[0.5px] border-components-panel-border bg-background-section px-4 py-3 text-xs font-medium text-text-secondary'>
+            NEXT_PUBLIC_APP_ID={`'${appId}'`} <br />
+            NEXT_PUBLIC_APP_KEY={'\'<Web API Key From Dify>\''} <br />
+            NEXT_PUBLIC_API_URL={`'${api_base_url}'`}
+          </pre>
+        </div>
+      </div>
+
+    </div>
+    <div className='mt-4 w-full rounded-lg border-[0.5px] border-components-panel-border px-6 py-5'>
+      <Tag bordered={true} hideBg={true} className='border-text-accent-secondary uppercase text-text-accent-secondary'>{t(`${prefixCustomize}.way`)} 2</Tag>
+      <p className='system-sm-medium my-2 text-text-secondary'>{t(`${prefixCustomize}.way2.name`)}</p>
+      <Button
+        className='mt-2'
+        onClick={() =>
+          window.open(
+            `https://docs.dify.ai/${locale !== LanguagesSupported[1]
+              ? 'user-guide/launching-dify-apps/developing-with-apis'
+              : `${locale.toLowerCase()}/guides/application-publishing/developing-with-apis`
+            }`,
+            '_blank',
+          )
+        }
+      >
+        <span className='text-sm text-text-secondary'>{t(`${prefixCustomize}.way2.operation`)}</span>
+        <ArrowTopRightOnSquareIcon className='ml-1 h-4 w-4 shrink-0 text-text-secondary' />
+      </Button>
+    </div>
+  </Modal>
+}
+
+export default CustomizeModal
diff --git a/app/components/app/overview/embedded/index.tsx b/app/components/app/overview/embedded/index.tsx
new file mode 100644
index 0000000..e047b4f
--- /dev/null
+++ b/app/components/app/overview/embedded/index.tsx
@@ -0,0 +1,193 @@
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiClipboardFill,
+  RiClipboardLine,
+} from '@remixicon/react'
+import copy from 'copy-to-clipboard'
+import style from './style.module.css'
+import Modal from '@/app/components/base/modal'
+import Tooltip from '@/app/components/base/tooltip'
+import { useAppContext } from '@/context/app-context'
+import { IS_CE_EDITION } from '@/config'
+import type { SiteInfo } from '@/models/share'
+import { useThemeContext } from '@/app/components/base/chat/embedded-chatbot/theme/theme-context'
+import ActionButton from '@/app/components/base/action-button'
+import cn from '@/utils/classnames'
+
+type Props = {
+  siteInfo?: SiteInfo
+  isShow: boolean
+  onClose: () => void
+  accessToken: string
+  appBaseUrl: string
+  className?: string
+}
+
+const OPTION_MAP = {
+  iframe: {
+    getContent: (url: string, token: string) =>
+      `<iframe
+ src="${url}/chatbot/${token}"
+ style="width: 100%; height: 100%; min-height: 700px"
+ frameborder="0"
+ allow="microphone">
+</iframe>`,
+  },
+  scripts: {
+    getContent: (url: string, token: string, primaryColor: string, isTestEnv?: boolean) =>
+      `<script>
+ window.difyChatbotConfig = {
+  token: '${token}'${isTestEnv
+        ? `,
+  isDev: true`
+        : ''}${IS_CE_EDITION
+          ? `,
+  baseUrl: '${url}'`
+          : ''},
+  systemVariables: {
+    // user_id: 'YOU CAN DEFINE USER ID HERE',
+    // conversation_id: 'YOU CAN DEFINE CONVERSATION ID HERE, IT MUST BE A VALID UUID',
+  },
+ }
+</script>
+<script
+ src="${url}/embed.min.js"
+ id="${token}"
+ defer>
+</script>
+<style>
+  #dify-chatbot-bubble-button {
+    background-color: ${primaryColor} !important;
+  }
+  #dify-chatbot-bubble-window {
+    width: 24rem !important;
+    height: 40rem !important;
+  }
+</style>`,
+  },
+  chromePlugin: {
+    getContent: (url: string, token: string) => `ChatBot URL: ${url}/chatbot/${token}`,
+  },
+}
+const prefixEmbedded = 'appOverview.overview.appInfo.embedded'
+
+type Option = keyof typeof OPTION_MAP
+
+type OptionStatus = {
+  iframe: boolean
+  scripts: boolean
+  chromePlugin: boolean
+}
+
+const Embedded = ({ siteInfo, isShow, onClose, appBaseUrl, accessToken, className }: Props) => {
+  const { t } = useTranslation()
+  const [option, setOption] = useState<Option>('iframe')
+  const [isCopied, setIsCopied] = useState<OptionStatus>({ iframe: false, scripts: false, chromePlugin: false })
+
+  const { langeniusVersionInfo } = useAppContext()
+  const themeBuilder = useThemeContext()
+  themeBuilder.buildTheme(siteInfo?.chat_color_theme ?? null, siteInfo?.chat_color_theme_inverted ?? false)
+  const isTestEnv = langeniusVersionInfo.current_env === 'TESTING' || langeniusVersionInfo.current_env === 'DEVELOPMENT'
+  const onClickCopy = () => {
+    if (option === 'chromePlugin') {
+      const splitUrl = OPTION_MAP[option].getContent(appBaseUrl, accessToken).split(': ')
+      if (splitUrl.length > 1)
+        copy(splitUrl[1])
+    }
+    else {
+      copy(OPTION_MAP[option].getContent(appBaseUrl, accessToken, themeBuilder.theme?.primaryColor ?? '#1C64F2', isTestEnv))
+    }
+    setIsCopied({ ...isCopied, [option]: true })
+  }
+
+  // when toggle option, reset then copy status
+  const resetCopyStatus = () => {
+    const cache = { ...isCopied }
+    Object.keys(cache).forEach((key) => {
+      cache[key as keyof OptionStatus] = false
+    })
+    setIsCopied(cache)
+  }
+
+  const navigateToChromeUrl = () => {
+    window.open('https://chrome.google.com/webstore/detail/dify-chatbot/ceehdapohffmjmkdcifjofadiaoeggaf', '_blank', 'noopener,noreferrer')
+  }
+
+  useEffect(() => {
+    resetCopyStatus()
+  }, [isShow])
+
+  return (
+    <Modal
+      title={t(`${prefixEmbedded}.title`)}
+      isShow={isShow}
+      onClose={onClose}
+      className="w-[640px] !max-w-2xl"
+      wrapperClassName={className}
+      closable={true}
+    >
+      <div className="system-sm-medium mb-4 mt-8 text-text-primary">
+        {t(`${prefixEmbedded}.explanation`)}
+      </div>
+      <div className="flex flex-wrap items-center justify-between gap-y-2">
+        {Object.keys(OPTION_MAP).map((v, index) => {
+          return (
+            <div
+              key={index}
+              className={cn(
+                style.option,
+                style[`${v}Icon`],
+                option === v && style.active,
+              )}
+              onClick={() => {
+                setOption(v as Option)
+                resetCopyStatus()
+              }}
+            ></div>
+          )
+        })}
+      </div>
+      {option === 'chromePlugin' && (
+        <div className="mt-6 w-full">
+          <div className={cn('inline-flex w-full items-center justify-center gap-2 rounded-lg py-3',
+            'shrink-0 cursor-pointer bg-primary-600 text-white hover:bg-primary-600/75 hover:shadow-sm')}>
+            <div className={`relative h-4 w-4 ${style.pluginInstallIcon}`}></div>
+            <div className="font-['Inter'] text-sm font-medium leading-tight text-white" onClick={navigateToChromeUrl}>{t(`${prefixEmbedded}.chromePlugin`)}</div>
+          </div>
+        </div>
+      )}
+      <div className={cn('inline-flex w-full flex-col items-start justify-start rounded-lg border-[0.5px] border-components-panel-border bg-background-section',
+        'mt-6')}>
+        <div className="inline-flex items-center justify-start gap-2 self-stretch rounded-t-lg bg-background-section-burn py-1  pl-3 pr-1">
+          <div className="system-sm-medium shrink-0 grow text-text-secondary">
+            {t(`${prefixEmbedded}.${option}`)}
+          </div>
+          <Tooltip
+            popupContent={
+              (isCopied[option]
+                ? t(`${prefixEmbedded}.copied`)
+                : t(`${prefixEmbedded}.copy`)) || ''
+            }
+          >
+            <ActionButton>
+              <div
+                onClick={onClickCopy}
+              >
+                {isCopied[option] && <RiClipboardFill className='h-4 w-4' />}
+                {!isCopied[option] && <RiClipboardLine className='h-4 w-4' />}
+              </div>
+            </ActionButton>
+          </Tooltip>
+        </div>
+        <div className="flex w-full items-start justify-start gap-2 overflow-x-auto p-3">
+          <div className="shrink grow basis-0 font-mono text-[13px] leading-tight text-text-secondary">
+            <pre className='select-text'>{OPTION_MAP[option].getContent(appBaseUrl, accessToken, themeBuilder.theme?.primaryColor ?? '#1C64F2', isTestEnv)}</pre>
+          </div>
+        </div>
+      </div>
+    </Modal>
+  )
+}
+
+export default Embedded
diff --git a/app/components/app/overview/embedded/style.module.css b/app/components/app/overview/embedded/style.module.css
new file mode 100644
index 0000000..f2a4d2d
--- /dev/null
+++ b/app/components/app/overview/embedded/style.module.css
@@ -0,0 +1,20 @@
+.option {
+  width: 188px;
+  height: 128px;
+  @apply box-border cursor-pointer bg-auto bg-no-repeat bg-center rounded-md;
+}
+.active {
+  @apply border-[1.5px] border-[#2970FF];
+}
+.iframeIcon {
+  background-image: url(../assets/iframe-option.svg);
+}
+.scriptsIcon {
+  background-image: url(../assets/scripts-option.svg);
+}
+.chromePluginIcon {
+  background-image: url(../assets/chromeplugin-option.svg);
+}
+.pluginInstallIcon {
+  background-image: url(../assets/chromeplugin-install.svg);
+}
diff --git a/app/components/app/overview/settings/index.tsx b/app/components/app/overview/settings/index.tsx
new file mode 100644
index 0000000..c0a5fdf
--- /dev/null
+++ b/app/components/app/overview/settings/index.tsx
@@ -0,0 +1,474 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
+import { RiArrowRightSLine, RiCloseLine } from '@remixicon/react'
+import Link from 'next/link'
+import { Trans, useTranslation } from 'react-i18next'
+import { useContext, useContextSelector } from 'use-context-selector'
+import { SparklesSoft } from '@/app/components/base/icons/src/public/common'
+import Modal from '@/app/components/base/modal'
+import ActionButton from '@/app/components/base/action-button'
+import Button from '@/app/components/base/button'
+import Divider from '@/app/components/base/divider'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import AppIcon from '@/app/components/base/app-icon'
+import Switch from '@/app/components/base/switch'
+import PremiumBadge from '@/app/components/base/premium-badge'
+import { SimpleSelect } from '@/app/components/base/select'
+import type { AppDetailResponse } from '@/models/app'
+import type { AppIconType, AppSSO, Language } from '@/types/app'
+import { useToastContext } from '@/app/components/base/toast'
+import { LanguagesSupported, languages } from '@/i18n/language'
+import Tooltip from '@/app/components/base/tooltip'
+import AppContext, { useAppContext } from '@/context/app-context'
+import { useProviderContext } from '@/context/provider-context'
+import { useModalContext } from '@/context/modal-context'
+import type { AppIconSelection } from '@/app/components/base/app-icon-picker'
+import AppIconPicker from '@/app/components/base/app-icon-picker'
+import I18n from '@/context/i18n'
+import cn from '@/utils/classnames'
+
+export type ISettingsModalProps = {
+  isChat: boolean
+  appInfo: AppDetailResponse & Partial<AppSSO>
+  isShow: boolean
+  defaultValue?: string
+  onClose: () => void
+  onSave?: (params: ConfigParams) => Promise<void>
+}
+
+export type ConfigParams = {
+  title: string
+  description: string
+  default_language: string
+  chat_color_theme: string
+  chat_color_theme_inverted: boolean
+  prompt_public: boolean
+  copyright: string
+  privacy_policy: string
+  custom_disclaimer: string
+  icon_type: AppIconType
+  icon: string
+  icon_background?: string
+  show_workflow_steps: boolean
+  use_icon_as_answer_icon: boolean
+  enable_sso?: boolean
+}
+
+const prefixSettings = 'appOverview.overview.appInfo.settings'
+
+const SettingsModal: FC<ISettingsModalProps> = ({
+  isChat,
+  appInfo,
+  isShow = false,
+  onClose,
+  onSave,
+}) => {
+  const systemFeatures = useContextSelector(AppContext, state => state.systemFeatures)
+  const { isCurrentWorkspaceEditor } = useAppContext()
+  const { notify } = useToastContext()
+  const [isShowMore, setIsShowMore] = useState(false)
+  const {
+    title,
+    icon_type,
+    icon,
+    icon_background,
+    icon_url,
+    description,
+    chat_color_theme,
+    chat_color_theme_inverted,
+    copyright,
+    privacy_policy,
+    custom_disclaimer,
+    default_language,
+    show_workflow_steps,
+    use_icon_as_answer_icon,
+  } = appInfo.site
+  const [inputInfo, setInputInfo] = useState({
+    title,
+    desc: description,
+    chatColorTheme: chat_color_theme,
+    chatColorThemeInverted: chat_color_theme_inverted,
+    copyright,
+    copyrightSwitchValue: !!copyright,
+    privacyPolicy: privacy_policy,
+    customDisclaimer: custom_disclaimer,
+    show_workflow_steps,
+    use_icon_as_answer_icon,
+    enable_sso: appInfo.enable_sso,
+  })
+  const [language, setLanguage] = useState(default_language)
+  const [saveLoading, setSaveLoading] = useState(false)
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+
+  const [showAppIconPicker, setShowAppIconPicker] = useState(false)
+  const [appIcon, setAppIcon] = useState<AppIconSelection>(
+    icon_type === 'image'
+      ? { type: 'image', url: icon_url!, fileId: icon }
+      : { type: 'emoji', icon, background: icon_background! },
+  )
+
+  const { enableBilling, plan } = useProviderContext()
+  const { setShowPricingModal, setShowAccountSettingModal } = useModalContext()
+  const isFreePlan = plan.type === 'sandbox'
+  const handlePlanClick = useCallback(() => {
+    if (isFreePlan)
+      setShowPricingModal()
+    else
+      setShowAccountSettingModal({ payload: 'billing' })
+  }, [isFreePlan, setShowAccountSettingModal, setShowPricingModal])
+
+  useEffect(() => {
+    setInputInfo({
+      title,
+      desc: description,
+      chatColorTheme: chat_color_theme,
+      chatColorThemeInverted: chat_color_theme_inverted,
+      copyright,
+      copyrightSwitchValue: !!copyright,
+      privacyPolicy: privacy_policy,
+      customDisclaimer: custom_disclaimer,
+      show_workflow_steps,
+      use_icon_as_answer_icon,
+      enable_sso: appInfo.enable_sso,
+    })
+    setLanguage(default_language)
+    setAppIcon(icon_type === 'image'
+      ? { type: 'image', url: icon_url!, fileId: icon }
+      : { type: 'emoji', icon, background: icon_background! })
+  }, [appInfo])
+
+  const onHide = () => {
+    onClose()
+    setTimeout(() => {
+      setIsShowMore(false)
+    }, 200)
+  }
+
+  const onClickSave = async () => {
+    if (!inputInfo.title) {
+      notify({ type: 'error', message: t('app.newApp.nameNotEmpty') })
+      return
+    }
+
+    const validateColorHex = (hex: string | null) => {
+      if (hex === null || hex?.length === 0)
+        return true
+
+      const regex = /#([A-Fa-f0-9]{6})/
+      const check = regex.test(hex)
+      return check
+    }
+
+    const validatePrivacyPolicy = (privacyPolicy: string | null) => {
+      if (privacyPolicy === null || privacyPolicy?.length === 0)
+        return true
+
+      return privacyPolicy.startsWith('http://') || privacyPolicy.startsWith('https://')
+    }
+
+    if (inputInfo !== null) {
+      if (!validateColorHex(inputInfo.chatColorTheme)) {
+        notify({ type: 'error', message: t(`${prefixSettings}.invalidHexMessage`) })
+        return
+      }
+      if (!validatePrivacyPolicy(inputInfo.privacyPolicy)) {
+        notify({ type: 'error', message: t(`${prefixSettings}.invalidPrivacyPolicy`) })
+        return
+      }
+    }
+
+    setSaveLoading(true)
+    const params = {
+      title: inputInfo.title,
+      description: inputInfo.desc,
+      default_language: language,
+      chat_color_theme: inputInfo.chatColorTheme,
+      chat_color_theme_inverted: inputInfo.chatColorThemeInverted,
+      prompt_public: false,
+      copyright: isFreePlan
+        ? ''
+        : inputInfo.copyrightSwitchValue
+          ? inputInfo.copyright
+          : '',
+      privacy_policy: inputInfo.privacyPolicy,
+      custom_disclaimer: inputInfo.customDisclaimer,
+      icon_type: appIcon.type,
+      icon: appIcon.type === 'emoji' ? appIcon.icon : appIcon.fileId,
+      icon_background: appIcon.type === 'emoji' ? appIcon.background : undefined,
+      show_workflow_steps: inputInfo.show_workflow_steps,
+      use_icon_as_answer_icon: inputInfo.use_icon_as_answer_icon,
+      enable_sso: inputInfo.enable_sso,
+    }
+    await onSave?.(params)
+    setSaveLoading(false)
+    onHide()
+  }
+
+  const onChange = (field: string) => {
+    return (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
+      let value: string | boolean
+      if (e.target.type === 'checkbox')
+        value = (e.target as HTMLInputElement).checked
+      else
+        value = e.target.value
+
+      setInputInfo(item => ({ ...item, [field]: value }))
+    }
+  }
+
+  const onDesChange = (value: string) => {
+    setInputInfo(item => ({ ...item, desc: value }))
+  }
+
+  return (
+    <>
+      <Modal
+        isShow={isShow}
+        closable={false}
+        onClose={onHide}
+        className='max-w-[520px] p-0'
+      >
+        {/* header */}
+        <div className='pb-3 pl-6 pr-5 pt-5'>
+          <div className='flex items-center gap-1'>
+            <div className='title-2xl-semi-bold grow text-text-primary'>{t(`${prefixSettings}.title`)}</div>
+            <ActionButton className='shrink-0' onClick={onHide}>
+              <RiCloseLine className='h-4 w-4' />
+            </ActionButton>
+          </div>
+          <div className='system-xs-regular mt-0.5 text-text-tertiary'>
+            <span>{t(`${prefixSettings}.modalTip`)}</span>
+            <Link href={`${locale === LanguagesSupported[1] ? 'https://docs.dify.ai/zh-hans/guides/application-publishing/launch-your-webapp-quickly#she-zhi-ni-de-ai-zhan-dian' : 'https://docs.dify.ai/en/guides/application-publishing/launch-your-webapp-quickly/README'}`} target='_blank' rel='noopener noreferrer' className='text-text-accent'>{t('common.operation.learnMore')}</Link>
+          </div>
+        </div>
+        {/* form body */}
+        <div className='space-y-5 px-6 py-3'>
+          {/* name & icon */}
+          <div className='flex gap-4'>
+            <div className='grow'>
+              <div className={cn('system-sm-semibold mb-1 py-1 text-text-secondary')}>{t(`${prefixSettings}.webName`)}</div>
+              <Input
+                className='w-full'
+                value={inputInfo.title}
+                onChange={onChange('title')}
+                placeholder={t('app.appNamePlaceholder') || ''}
+              />
+            </div>
+            <AppIcon
+              size='xxl'
+              onClick={() => { setShowAppIconPicker(true) }}
+              className='mt-2 cursor-pointer'
+              iconType={appIcon.type}
+              icon={appIcon.type === 'image' ? appIcon.fileId : appIcon.icon}
+              background={appIcon.type === 'image' ? undefined : appIcon.background}
+              imageUrl={appIcon.type === 'image' ? appIcon.url : undefined}
+            />
+          </div>
+          {/* description */}
+          <div className='relative'>
+            <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t(`${prefixSettings}.webDesc`)}</div>
+            <Textarea
+              className='mt-1'
+              value={inputInfo.desc}
+              onChange={e => onDesChange(e.target.value)}
+              placeholder={t(`${prefixSettings}.webDescPlaceholder`) as string}
+            />
+            <p className={cn('body-xs-regular pb-0.5 text-text-tertiary')}>{t(`${prefixSettings}.webDescTip`)}</p>
+          </div>
+          <Divider className="my-0 h-px" />
+          {/* answer icon */}
+          {isChat && (
+            <div className='w-full'>
+              <div className='flex items-center justify-between'>
+                <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t('app.answerIcon.title')}</div>
+                <Switch
+                  defaultValue={inputInfo.use_icon_as_answer_icon}
+                  onChange={v => setInputInfo({ ...inputInfo, use_icon_as_answer_icon: v })}
+                />
+              </div>
+              <p className='body-xs-regular pb-0.5 text-text-tertiary'>{t('app.answerIcon.description')}</p>
+            </div>
+          )}
+          {/* language */}
+          <div className='flex items-center'>
+            <div className={cn('system-sm-semibold grow py-1 text-text-secondary')}>{t(`${prefixSettings}.language`)}</div>
+            <SimpleSelect
+              wrapperClassName='w-[200px]'
+              items={languages.filter(item => item.supported)}
+              defaultValue={language}
+              onSelect={item => setLanguage(item.value as Language)}
+              notClearable
+            />
+          </div>
+          {/* theme color */}
+          {isChat && (
+            <div className='flex items-center'>
+              <div className='grow'>
+                <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t(`${prefixSettings}.chatColorTheme`)}</div>
+                <div className='body-xs-regular pb-0.5 text-text-tertiary'>{t(`${prefixSettings}.chatColorThemeDesc`)}</div>
+              </div>
+              <div className='shrink-0'>
+                <Input
+                  className='mb-1 w-[200px]'
+                  value={inputInfo.chatColorTheme ?? ''}
+                  onChange={onChange('chatColorTheme')}
+                  placeholder='E.g #A020F0'
+                />
+                <div className='flex items-center justify-between'>
+                  <p className={cn('body-xs-regular text-text-tertiary')}>{t(`${prefixSettings}.chatColorThemeInverted`)}</p>
+                  <Switch defaultValue={inputInfo.chatColorThemeInverted} onChange={v => setInputInfo({ ...inputInfo, chatColorThemeInverted: v })}></Switch>
+                </div>
+              </div>
+            </div>
+          )}
+          {/* workflow detail */}
+          <div className='w-full'>
+            <div className='flex items-center justify-between'>
+              <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t(`${prefixSettings}.workflow.subTitle`)}</div>
+              <Switch
+                disabled={!(appInfo.mode === 'workflow' || appInfo.mode === 'advanced-chat')}
+                defaultValue={inputInfo.show_workflow_steps}
+                onChange={v => setInputInfo({ ...inputInfo, show_workflow_steps: v })}
+              />
+            </div>
+            <p className='body-xs-regular pb-0.5 text-text-tertiary'>{t(`${prefixSettings}.workflow.showDesc`)}</p>
+          </div>
+          {/* SSO */}
+          {systemFeatures.enable_web_sso_switch_component && (
+            <>
+              <Divider className="my-0 h-px" />
+              <div className='w-full'>
+                <p className='system-xs-medium-uppercase mb-1 text-text-tertiary'>{t(`${prefixSettings}.sso.label`)}</p>
+                <div className='flex items-center justify-between'>
+                  <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t(`${prefixSettings}.sso.title`)}</div>
+                  <Tooltip
+                    disabled={systemFeatures.sso_enforced_for_web}
+                    popupContent={
+                      <div className='w-[180px]'>{t(`${prefixSettings}.sso.tooltip`)}</div>
+                    }
+                    asChild={false}
+                  >
+                    <Switch disabled={!systemFeatures.sso_enforced_for_web || !isCurrentWorkspaceEditor} defaultValue={systemFeatures.sso_enforced_for_web && inputInfo.enable_sso} onChange={v => setInputInfo({ ...inputInfo, enable_sso: v })}></Switch>
+                  </Tooltip>
+                </div>
+                <p className='body-xs-regular pb-0.5 text-text-tertiary'>{t(`${prefixSettings}.sso.description`)}</p>
+              </div>
+            </>
+          )}
+          {/* more settings switch */}
+          <Divider className="my-0 h-px" />
+          {!isShowMore && (
+            <div className='flex cursor-pointer items-center' onClick={() => setIsShowMore(true)}>
+              <div className='grow'>
+                <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t(`${prefixSettings}.more.entry`)}</div>
+                <p className={cn('body-xs-regular pb-0.5 text-text-tertiary')}>{t(`${prefixSettings}.more.copyRightPlaceholder`)} & {t(`${prefixSettings}.more.privacyPolicyPlaceholder`)}</p>
+              </div>
+              <RiArrowRightSLine className='ml-1 h-4 w-4 shrink-0 text-text-secondary' />
+            </div>
+          )}
+          {/* more settings */}
+          {isShowMore && (
+            <>
+              {/* copyright */}
+              <div className='w-full'>
+                <div className='flex items-center'>
+                  <div className='flex grow items-center'>
+                    <div className={cn('system-sm-semibold mr-1 py-1 text-text-secondary')}>{t(`${prefixSettings}.more.copyright`)}</div>
+                    {/* upgrade button */}
+                    {enableBilling && isFreePlan && (
+                      <div className='h-[18px] select-none'>
+                        <PremiumBadge size='s' color='blue' allowHover={true} onClick={handlePlanClick}>
+                          <SparklesSoft className='flex h-3.5 w-3.5 items-center py-[1px] pl-[3px] text-components-premium-badge-indigo-text-stop-0' />
+                          <div className='system-xs-medium'>
+                            <span className='p-1'>
+                              {t('billing.upgradeBtn.encourageShort')}
+                            </span>
+                          </div>
+                        </PremiumBadge>
+                      </div>
+                    )}
+                  </div>
+                  <Tooltip
+                    disabled={!isFreePlan}
+                    popupContent={
+                      <div className='w-[260px]'>{t(`${prefixSettings}.more.copyrightTooltip`)}</div>
+                    }
+                    asChild={false}
+                  >
+                    <Switch
+                      disabled={isFreePlan}
+                      defaultValue={inputInfo.copyrightSwitchValue}
+                      onChange={v => setInputInfo({ ...inputInfo, copyrightSwitchValue: v })}
+                    />
+                  </Tooltip>
+                </div>
+                <p className='body-xs-regular pb-0.5 text-text-tertiary'>{t(`${prefixSettings}.more.copyrightTip`)}</p>
+                {inputInfo.copyrightSwitchValue && (
+                  <Input
+                    className='mt-2 h-10'
+                    value={inputInfo.copyright}
+                    onChange={onChange('copyright')}
+                    placeholder={t(`${prefixSettings}.more.copyRightPlaceholder`) as string}
+                  />
+                )}
+              </div>
+              {/* privacy policy */}
+              <div className='w-full'>
+                <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t(`${prefixSettings}.more.privacyPolicy`)}</div>
+                <p className={cn('body-xs-regular pb-0.5 text-text-tertiary')}>
+                  <Trans
+                    i18nKey={`${prefixSettings}.more.privacyPolicyTip`}
+                    components={{ privacyPolicyLink: <Link href={'https://dify.ai/privacy'} target='_blank' rel='noopener noreferrer' className='text-text-accent' /> }}
+                  />
+                </p>
+                <Input
+                  className='mt-1'
+                  value={inputInfo.privacyPolicy}
+                  onChange={onChange('privacyPolicy')}
+                  placeholder={t(`${prefixSettings}.more.privacyPolicyPlaceholder`) as string}
+                />
+              </div>
+              {/* custom disclaimer */}
+              <div className='w-full'>
+                <div className={cn('system-sm-semibold py-1 text-text-secondary')}>{t(`${prefixSettings}.more.customDisclaimer`)}</div>
+                <p className={cn('body-xs-regular pb-0.5 text-text-tertiary')}>{t(`${prefixSettings}.more.customDisclaimerTip`)}</p>
+                <Textarea
+                  className='mt-1'
+                  value={inputInfo.customDisclaimer}
+                  onChange={onChange('customDisclaimer')}
+                  placeholder={t(`${prefixSettings}.more.customDisclaimerPlaceholder`) as string}
+                />
+              </div>
+            </>
+          )}
+        </div>
+        {/* footer */}
+        <div className='flex justify-end p-6 pt-5'>
+          <Button className='mr-2' onClick={onHide}>{t('common.operation.cancel')}</Button>
+          <Button variant='primary' onClick={onClickSave} loading={saveLoading}>{t('common.operation.save')}</Button>
+        </div>
+
+        {showAppIconPicker && (
+          <div onClick={e => e.stopPropagation()}>
+            <AppIconPicker
+              onSelect={(payload) => {
+                setAppIcon(payload)
+                setShowAppIconPicker(false)
+              }}
+              onClose={() => {
+                setAppIcon(icon_type === 'image'
+                  ? { type: 'image', url: icon_url!, fileId: icon }
+                  : { type: 'emoji', icon, background: icon_background! })
+                setShowAppIconPicker(false)
+              }}
+            />
+          </div>
+        )}
+      </Modal>
+    </>
+  )
+}
+export default React.memo(SettingsModal)
diff --git a/app/components/app/overview/style.module.css b/app/components/app/overview/style.module.css
new file mode 100644
index 0000000..ad63b29
--- /dev/null
+++ b/app/components/app/overview/style.module.css
@@ -0,0 +1,31 @@
+.generateLogo {
+  animation: 2s rotate linear infinite;
+}
+
+@keyframes rotate {
+  from {
+    transform: rotate(0deg);
+  }
+
+  to {
+    transform: rotate(360deg);
+  }
+}
+
+.codeBrowserIcon {
+  @apply w-4 h-4 bg-center bg-no-repeat;
+  background-image: url(./assets/code-browser.svg);
+}
+
+.refreshIcon {
+  background-image: url(./assets/refresh.svg);
+  background-position: center;
+  background-repeat: no-repeat;
+}
+
+.refreshIcon:hover {
+  background-image: url(./assets/refresh-hover.svg);
+  background-position: center;
+  background-repeat: no-repeat;
+}
+
diff --git a/app/components/app/store.ts b/app/components/app/store.ts
new file mode 100644
index 0000000..5f02f92
--- /dev/null
+++ b/app/components/app/store.ts
@@ -0,0 +1,54 @@
+import { create } from 'zustand'
+import type { App, AppSSO } from '@/types/app'
+import type { IChatItem } from '@/app/components/base/chat/chat/type'
+
+type State = {
+  appDetail?: App & Partial<AppSSO>
+  appSidebarExpand: string
+  currentLogItem?: IChatItem
+  currentLogModalActiveTab: string
+  showPromptLogModal: boolean
+  showAgentLogModal: boolean
+  showMessageLogModal: boolean
+  showAppConfigureFeaturesModal: boolean
+}
+
+type Action = {
+  setAppDetail: (appDetail?: App & Partial<AppSSO>) => void
+  setAppSiderbarExpand: (state: string) => void
+  setCurrentLogItem: (item?: IChatItem) => void
+  setCurrentLogModalActiveTab: (tab: string) => void
+  setShowPromptLogModal: (showPromptLogModal: boolean) => void
+  setShowAgentLogModal: (showAgentLogModal: boolean) => void
+  setShowMessageLogModal: (showMessageLogModal: boolean) => void
+  setShowAppConfigureFeaturesModal: (showAppConfigureFeaturesModal: boolean) => void
+}
+
+export const useStore = create<State & Action>(set => ({
+  appDetail: undefined,
+  setAppDetail: appDetail => set(() => ({ appDetail })),
+  appSidebarExpand: '',
+  setAppSiderbarExpand: appSidebarExpand => set(() => ({ appSidebarExpand })),
+  currentLogItem: undefined,
+  currentLogModalActiveTab: 'DETAIL',
+  setCurrentLogItem: currentLogItem => set(() => ({ currentLogItem })),
+  setCurrentLogModalActiveTab: currentLogModalActiveTab => set(() => ({ currentLogModalActiveTab })),
+  showPromptLogModal: false,
+  setShowPromptLogModal: showPromptLogModal => set(() => ({ showPromptLogModal })),
+  showAgentLogModal: false,
+  setShowAgentLogModal: showAgentLogModal => set(() => ({ showAgentLogModal })),
+  showMessageLogModal: false,
+  setShowMessageLogModal: showMessageLogModal => set(() => {
+    if (showMessageLogModal) {
+      return { showMessageLogModal }
+    }
+    else {
+      return {
+        showMessageLogModal,
+        currentLogModalActiveTab: 'DETAIL',
+      }
+    }
+  }),
+  showAppConfigureFeaturesModal: false,
+  setShowAppConfigureFeaturesModal: showAppConfigureFeaturesModal => set(() => ({ showAppConfigureFeaturesModal })),
+}))
diff --git a/app/components/app/switch-app-modal/index.tsx b/app/components/app/switch-app-modal/index.tsx
new file mode 100644
index 0000000..f1654eb
--- /dev/null
+++ b/app/components/app/switch-app-modal/index.tsx
@@ -0,0 +1,174 @@
+'use client'
+
+import { useEffect, useState } from 'react'
+import { useRouter } from 'next/navigation'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import AppIconPicker from '../../base/app-icon-picker'
+import cn from '@/utils/classnames'
+import Checkbox from '@/app/components/base/checkbox'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Modal from '@/app/components/base/modal'
+import Confirm from '@/app/components/base/confirm'
+import { ToastContext } from '@/app/components/base/toast'
+import { deleteApp, switchApp } from '@/service/apps'
+import { useAppContext } from '@/context/app-context'
+import { useProviderContext } from '@/context/provider-context'
+import AppsFull from '@/app/components/billing/apps-full-in-dialog'
+import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
+import { getRedirection } from '@/utils/app-redirection'
+import type { App } from '@/types/app'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback'
+import AppIcon from '@/app/components/base/app-icon'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { noop } from 'lodash-es'
+
+type SwitchAppModalProps = {
+  show: boolean
+  appDetail: App
+  onSuccess?: () => void
+  onClose: () => void
+  inAppDetail?: boolean
+}
+
+const SwitchAppModal = ({ show, appDetail, inAppDetail = false, onSuccess, onClose }: SwitchAppModalProps) => {
+  const { push, replace } = useRouter()
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const setAppDetail = useAppStore(s => s.setAppDetail)
+
+  const { isCurrentWorkspaceEditor } = useAppContext()
+  const { plan, enableBilling } = useProviderContext()
+  const isAppsFull = (enableBilling && plan.usage.buildApps >= plan.total.buildApps)
+
+  const [showAppIconPicker, setShowAppIconPicker] = useState(false)
+  const [appIcon, setAppIcon] = useState(
+    appDetail.icon_type === 'image'
+      ? { type: 'image' as const, url: appDetail.icon_url, fileId: appDetail.icon }
+      : { type: 'emoji' as const, icon: appDetail.icon, background: appDetail.icon_background },
+  )
+
+  const [name, setName] = useState(`${appDetail.name}(copy)`)
+  const [removeOriginal, setRemoveOriginal] = useState<boolean>(false)
+  const [showConfirmDelete, setShowConfirmDelete] = useState(false)
+
+  const goStart = async () => {
+    try {
+      const { new_app_id: newAppID } = await switchApp({
+        appID: appDetail.id,
+        name,
+        icon_type: appIcon.type,
+        icon: appIcon.type === 'emoji' ? appIcon.icon : appIcon.fileId,
+        icon_background: appIcon.type === 'emoji' ? appIcon.background : undefined,
+      })
+      if (onSuccess)
+        onSuccess()
+      if (onClose)
+        onClose()
+      notify({ type: 'success', message: t('app.newApp.appCreated') })
+      if (inAppDetail)
+        setAppDetail()
+      if (removeOriginal)
+        await deleteApp(appDetail.id)
+      localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
+      getRedirection(
+        isCurrentWorkspaceEditor,
+        {
+          id: newAppID,
+          mode: appDetail.mode === 'completion' ? 'workflow' : 'advanced-chat',
+        },
+        removeOriginal ? replace : push,
+      )
+    }
+    catch {
+      notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
+    }
+  }
+
+  useEffect(() => {
+    if (removeOriginal)
+      setShowConfirmDelete(true)
+  }, [removeOriginal])
+
+  return (
+    <>
+      <Modal
+        className={cn('w-[600px] max-w-[600px] p-8')}
+        isShow={show}
+        onClose={noop}
+      >
+        <div className='absolute right-4 top-4 cursor-pointer p-2' onClick={onClose}>
+          <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+        </div>
+        <div className='h-12 w-12 rounded-xl border-[0.5px] border-divider-regular bg-background-default-burn p-3 shadow-xl'>
+          <AlertTriangle className='h-6 w-6 text-[rgb(247,144,9)]' />
+        </div>
+        <div className='relative mt-3 text-xl font-semibold leading-[30px] text-text-primary'>{t('app.switch')}</div>
+        <div className='my-1 text-sm leading-5 text-text-tertiary'>
+          <span>{t('app.switchTipStart')}</span>
+          <span className='font-medium text-text-secondary'>{t('app.switchTip')}</span>
+          <span>{t('app.switchTipEnd')}</span>
+        </div>
+        <div className='pb-4'>
+          <div className='py-2 text-sm font-medium leading-[20px] text-text-primary'>{t('app.switchLabel')}</div>
+          <div className='flex items-center justify-between space-x-2'>
+            <AppIcon
+              size='large'
+              onClick={() => { setShowAppIconPicker(true) }}
+              className='cursor-pointer'
+              iconType={appIcon.type}
+              icon={appIcon.type === 'image' ? appIcon.fileId : appIcon.icon}
+              background={appIcon.type === 'image' ? undefined : appIcon.background}
+              imageUrl={appIcon.type === 'image' ? appIcon.url : undefined}
+            />
+            <Input
+              value={name}
+              onChange={e => setName(e.target.value)}
+              placeholder={t('app.newApp.appNamePlaceholder') || ''}
+              className='h-10 grow'
+            />
+          </div>
+          {showAppIconPicker && <AppIconPicker
+            onSelect={(payload) => {
+              setAppIcon(payload)
+              setShowAppIconPicker(false)
+            }}
+            onClose={() => {
+              setAppIcon(appDetail.icon_type === 'image'
+                ? { type: 'image' as const, url: appDetail.icon_url, fileId: appDetail.icon }
+                : { type: 'emoji' as const, icon: appDetail.icon, background: appDetail.icon_background })
+              setShowAppIconPicker(false)
+            }}
+          />}
+        </div>
+        {isAppsFull && <AppsFull loc='app-switch' />}
+        <div className='flex items-center justify-between pt-6'>
+          <div className='flex items-center'>
+            <Checkbox className='shrink-0' checked={removeOriginal} onCheck={() => setRemoveOriginal(!removeOriginal)} />
+            <div className="ml-2 cursor-pointer text-sm leading-5 text-text-secondary" onClick={() => setRemoveOriginal(!removeOriginal)}>{t('app.removeOriginal')}</div>
+          </div>
+          <div className='flex items-center'>
+            <Button className='mr-2' onClick={onClose}>{t('app.newApp.Cancel')}</Button>
+            <Button className='border-red-700' disabled={isAppsFull || !name} variant="warning" onClick={goStart}>{t('app.switchStart')}</Button>
+          </div>
+        </div>
+      </Modal>
+      {showConfirmDelete && (
+        <Confirm
+          title={t('app.deleteAppConfirmTitle')}
+          content={t('app.deleteAppConfirmContent')}
+          isShow={showConfirmDelete}
+          onConfirm={() => setShowConfirmDelete(false)}
+          onCancel={() => {
+            setShowConfirmDelete(false)
+            setRemoveOriginal(false)
+          }}
+        />
+      )}
+    </>
+  )
+}
+
+export default SwitchAppModal
diff --git a/app/components/app/text-generate/item/index.tsx b/app/components/app/text-generate/item/index.tsx
new file mode 100644
index 0000000..aa3ffa3
--- /dev/null
+++ b/app/components/app/text-generate/item/index.tsx
@@ -0,0 +1,383 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiBookmark3Line,
+  RiClipboardLine,
+  RiFileList3Line,
+  RiPlayList2Line,
+  RiReplay15Line,
+  RiSparklingFill,
+  RiSparklingLine,
+  RiThumbDownLine,
+  RiThumbUpLine,
+} from '@remixicon/react'
+import copy from 'copy-to-clipboard'
+import { useParams } from 'next/navigation'
+import { useBoolean } from 'ahooks'
+import ResultTab from './result-tab'
+import { Markdown } from '@/app/components/base/markdown'
+import Loading from '@/app/components/base/loading'
+import Toast from '@/app/components/base/toast'
+import type { FeedbackType } from '@/app/components/base/chat/chat/type'
+import { fetchMoreLikeThis, updateFeedback } from '@/service/share'
+import { fetchTextGenerationMessage } from '@/service/debug'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import WorkflowProcessItem from '@/app/components/base/chat/chat/answer/workflow-process'
+import type { WorkflowProcess } from '@/app/components/base/chat/types'
+import type { SiteInfo } from '@/models/share'
+import { useChatContext } from '@/app/components/base/chat/chat/context'
+import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
+import NewAudioButton from '@/app/components/base/new-audio-button'
+import cn from '@/utils/classnames'
+
+const MAX_DEPTH = 3
+
+export type IGenerationItemProps = {
+  isWorkflow?: boolean
+  workflowProcessData?: WorkflowProcess
+  className?: string
+  isError: boolean
+  onRetry: () => void
+  content: any
+  messageId?: string | null
+  conversationId?: string
+  isLoading?: boolean
+  isResponding?: boolean
+  isInWebApp?: boolean
+  moreLikeThis?: boolean
+  depth?: number
+  feedback?: FeedbackType
+  onFeedback?: (feedback: FeedbackType) => void
+  onSave?: (messageId: string) => void
+  isMobile?: boolean
+  isInstalledApp: boolean
+  installedAppId?: string
+  taskId?: string
+  controlClearMoreLikeThis?: number
+  supportFeedback?: boolean
+  isShowTextToSpeech?: boolean
+  hideProcessDetail?: boolean
+  siteInfo: SiteInfo | null
+  inSidePanel?: boolean
+}
+
+export const copyIcon = (
+  <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M9.3335 2.33341C9.87598 2.33341 10.1472 2.33341 10.3698 2.39304C10.9737 2.55486 11.4454 3.02657 11.6072 3.63048C11.6668 3.85302 11.6668 4.12426 11.6668 4.66675V10.0334C11.6668 11.0135 11.6668 11.5036 11.4761 11.8779C11.3083 12.2072 11.0406 12.4749 10.7113 12.6427C10.337 12.8334 9.84692 12.8334 8.86683 12.8334H5.1335C4.1534 12.8334 3.66336 12.8334 3.28901 12.6427C2.95973 12.4749 2.69201 12.2072 2.52423 11.8779C2.3335 11.5036 2.3335 11.0135 2.3335 10.0334V4.66675C2.3335 4.12426 2.3335 3.85302 2.39313 3.63048C2.55494 3.02657 3.02665 2.55486 3.63056 2.39304C3.8531 2.33341 4.12435 2.33341 4.66683 2.33341M5.60016 3.50008H8.40016C8.72686 3.50008 8.89021 3.50008 9.01499 3.4365C9.12475 3.38058 9.21399 3.29134 9.26992 3.18158C9.3335 3.05679 9.3335 2.89345 9.3335 2.56675V2.10008C9.3335 1.77338 9.3335 1.61004 9.26992 1.48525C9.21399 1.37549 9.12475 1.28625 9.01499 1.23033C8.89021 1.16675 8.72686 1.16675 8.40016 1.16675H5.60016C5.27347 1.16675 5.11012 1.16675 4.98534 1.23033C4.87557 1.28625 4.78634 1.37549 4.73041 1.48525C4.66683 1.61004 4.66683 1.77338 4.66683 2.10008V2.56675C4.66683 2.89345 4.66683 3.05679 4.73041 3.18158C4.78634 3.29134 4.87557 3.38058 4.98534 3.4365C5.11012 3.50008 5.27347 3.50008 5.60016 3.50008Z" stroke="#344054" strokeWidth="1.25" strokeLinecap="round" strokeLinejoin="round" />
+  </svg>
+)
+
+const GenerationItem: FC<IGenerationItemProps> = ({
+  isWorkflow,
+  workflowProcessData,
+  className,
+  isError,
+  onRetry,
+  content,
+  messageId,
+  isLoading,
+  isResponding,
+  moreLikeThis,
+  isInWebApp = false,
+  feedback,
+  onFeedback,
+  onSave,
+  depth = 1,
+  isMobile,
+  isInstalledApp,
+  installedAppId,
+  taskId,
+  controlClearMoreLikeThis,
+  supportFeedback,
+  isShowTextToSpeech,
+  hideProcessDetail,
+  siteInfo,
+  inSidePanel,
+}) => {
+  const { t } = useTranslation()
+  const params = useParams()
+  const isTop = depth === 1
+  const [completionRes, setCompletionRes] = useState('')
+  const [childMessageId, setChildMessageId] = useState<string | null>(null)
+  const [childFeedback, setChildFeedback] = useState<FeedbackType>({
+    rating: null,
+  })
+  const {
+    config,
+  } = useChatContext()
+
+  const setCurrentLogItem = useAppStore(s => s.setCurrentLogItem)
+  const setShowPromptLogModal = useAppStore(s => s.setShowPromptLogModal)
+
+  const handleFeedback = async (childFeedback: FeedbackType) => {
+    await updateFeedback({ url: `/messages/${childMessageId}/feedbacks`, body: { rating: childFeedback.rating } }, isInstalledApp, installedAppId)
+    setChildFeedback(childFeedback)
+  }
+
+  const [isQuerying, { setTrue: startQuerying, setFalse: stopQuerying }] = useBoolean(false)
+
+  const childProps = {
+    isInWebApp: true,
+    content: completionRes,
+    messageId: childMessageId,
+    depth: depth + 1,
+    moreLikeThis: true,
+    onFeedback: handleFeedback,
+    isLoading: isQuerying,
+    feedback: childFeedback,
+    onSave,
+    isShowTextToSpeech,
+    isMobile,
+    isInstalledApp,
+    installedAppId,
+    controlClearMoreLikeThis,
+    isWorkflow,
+    siteInfo,
+    taskId,
+  }
+
+  const handleMoreLikeThis = async () => {
+    if (isQuerying || !messageId) {
+      Toast.notify({ type: 'warning', message: t('appDebug.errorMessage.waitForResponse') })
+      return
+    }
+    startQuerying()
+    const res: any = await fetchMoreLikeThis(messageId as string, isInstalledApp, installedAppId)
+    setCompletionRes(res.answer)
+    setChildFeedback({
+      rating: null,
+    })
+    setChildMessageId(res.id)
+    stopQuerying()
+  }
+
+  useEffect(() => {
+    if (controlClearMoreLikeThis) {
+      setChildMessageId(null)
+      setCompletionRes('')
+    }
+  }, [controlClearMoreLikeThis])
+
+  // regeneration clear child
+  useEffect(() => {
+    if (isLoading)
+      setChildMessageId(null)
+  }, [isLoading])
+
+  const handleOpenLogModal = async () => {
+    const data = await fetchTextGenerationMessage({
+      appId: params.appId as string,
+      messageId: messageId!,
+    })
+    const logItem = {
+      ...data,
+      log: [
+        ...data.message,
+        ...(data.message[data.message.length - 1].role !== 'assistant'
+          ? [
+            {
+              role: 'assistant',
+              text: data.answer,
+              files: data.message_files?.filter((file: any) => file.belongs_to === 'assistant') || [],
+            },
+          ]
+          : []),
+      ],
+    }
+    setCurrentLogItem(logItem)
+    setShowPromptLogModal(true)
+  }
+
+  const [currentTab, setCurrentTab] = useState<string>('DETAIL')
+  const showResultTabs = !!workflowProcessData?.resultText || !!workflowProcessData?.files?.length
+  const switchTab = async (tab: string) => {
+    setCurrentTab(tab)
+  }
+  useEffect(() => {
+    if (workflowProcessData?.resultText || !!workflowProcessData?.files?.length)
+      switchTab('RESULT')
+    else
+      switchTab('DETAIL')
+  }, [workflowProcessData?.files?.length, workflowProcessData?.resultText])
+
+  return (
+    <>
+      <div className={cn('relative', !isTop && 'mt-3', className)}>
+        {isLoading && (
+          <div className={cn('flex h-10 items-center', !inSidePanel && 'rounded-2xl border-t border-divider-subtle bg-chat-bubble-bg')}><Loading type='area' /></div>
+        )}
+        {!isLoading && (
+          <>
+            {/* result content */}
+            <div className={cn(
+              'relative',
+              !inSidePanel && 'rounded-2xl border-t border-divider-subtle bg-chat-bubble-bg',
+            )}>
+              {workflowProcessData && (
+                <>
+                  <div className={cn(
+                    'p-3',
+                    showResultTabs && 'border-b border-divider-subtle',
+                  )}>
+                    {taskId && (
+                      <div className={cn('system-2xs-medium-uppercase mb-2 flex items-center text-text-accent-secondary', isError && 'text-text-destructive')}>
+                        <RiPlayList2Line className='mr-1 h-3 w-3' />
+                        <span>{t('share.generation.execution')}</span>
+                        <span className='px-1'>路</span>
+                        <span>{taskId}</span>
+                      </div>
+                    )}
+                    {siteInfo && workflowProcessData && (
+                      <WorkflowProcessItem
+                        data={workflowProcessData}
+                        expand={workflowProcessData.expand}
+                        hideProcessDetail={hideProcessDetail}
+                        hideInfo={hideProcessDetail}
+                        readonly={!siteInfo.show_workflow_steps}
+                      />
+                    )}
+                    {showResultTabs && (
+                      <div className='flex items-center space-x-6 px-1'>
+                        <div
+                          className={cn(
+                            'system-sm-semibold-uppercase cursor-pointer border-b-2 border-transparent py-3 text-text-tertiary',
+                            currentTab === 'RESULT' && 'border-util-colors-blue-brand-blue-brand-600 text-text-primary',
+                          )}
+                          onClick={() => switchTab('RESULT')}
+                        >{t('runLog.result')}</div>
+                        <div
+                          className={cn(
+                            'system-sm-semibold-uppercase cursor-pointer border-b-2 border-transparent py-3 text-text-tertiary',
+                            currentTab === 'DETAIL' && 'border-util-colors-blue-brand-blue-brand-600 text-text-primary',
+                          )}
+                          onClick={() => switchTab('DETAIL')}
+                        >{t('runLog.detail')}</div>
+                      </div>
+                    )}
+                  </div>
+                  {!isError && (
+                    <ResultTab data={workflowProcessData} content={content} currentTab={currentTab} />
+                  )}
+                </>
+              )}
+              {!workflowProcessData && taskId && (
+                <div className={cn('system-2xs-medium-uppercase sticky left-0 top-0 flex w-full items-center rounded-t-2xl bg-components-actionbar-bg p-4 pb-3 text-text-accent-secondary', isError && 'text-text-destructive')}>
+                  <RiPlayList2Line className='mr-1 h-3 w-3' />
+                  <span>{t('share.generation.execution')}</span>
+                  <span className='px-1'>路</span>
+                  <span>{`${taskId}${depth > 1 ? `-${depth - 1}` : ''}`}</span>
+                </div>
+              )}
+              {isError && (
+                <div className='body-lg-regular p-4 pt-0 text-text-quaternary'>{t('share.generation.batchFailed.outputPlaceholder')}</div>
+              )}
+              {!workflowProcessData && !isError && (typeof content === 'string') && (
+                <div className={cn('p-4', taskId && 'pt-0')}>
+                  <Markdown content={content} />
+                </div>
+              )}
+            </div>
+            {/* meta data */}
+            <div className={cn(
+              'system-xs-regular relative mt-1 h-4 px-4 text-text-quaternary',
+              isMobile && ((childMessageId || isQuerying) && depth < 3) && 'pl-10',
+            )}>
+              {!isWorkflow && <span>{content?.length} {t('common.unit.char')}</span>}
+              {/* action buttons */}
+              <div className='absolute bottom-1 right-2 flex items-center'>
+                {!isInWebApp && !isInstalledApp && !isResponding && (
+                  <div className='ml-1 flex items-center gap-0.5 rounded-[10px] border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg p-0.5 shadow-md backdrop-blur-sm'>
+                    <ActionButton disabled={isError || !messageId} onClick={handleOpenLogModal}>
+                      <RiFileList3Line className='h-4 w-4' />
+                      {/* <div>{t('common.operation.log')}</div> */}
+                    </ActionButton>
+                  </div>
+                )}
+                <div className='ml-1 flex items-center gap-0.5 rounded-[10px] border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg p-0.5 shadow-md backdrop-blur-sm'>
+                  {moreLikeThis && (
+                    <ActionButton state={depth === MAX_DEPTH ? ActionButtonState.Disabled : ActionButtonState.Default} disabled={depth === MAX_DEPTH} onClick={handleMoreLikeThis}>
+                      <RiSparklingLine className='h-4 w-4' />
+                    </ActionButton>
+                  )}
+                  {isShowTextToSpeech && (
+                    <NewAudioButton
+                      id={messageId!}
+                      voice={config?.text_to_speech?.voice}
+                    />
+                  )}
+                  {((currentTab === 'RESULT' && workflowProcessData?.resultText) || !isWorkflow) && (
+                    <ActionButton disabled={isError || !messageId} onClick={() => {
+                      const copyContent = isWorkflow ? workflowProcessData?.resultText : content
+                      if (typeof copyContent === 'string')
+                        copy(copyContent)
+                      else
+                        copy(JSON.stringify(copyContent))
+                      Toast.notify({ type: 'success', message: t('common.actionMsg.copySuccessfully') })
+                    }}>
+                      <RiClipboardLine className='h-4 w-4' />
+                    </ActionButton>
+                  )}
+                  {isInWebApp && isError && (
+                    <ActionButton onClick={onRetry}>
+                      <RiReplay15Line className='h-4 w-4' />
+                    </ActionButton>
+                  )}
+                  {isInWebApp && !isWorkflow && (
+                    <ActionButton disabled={isError || !messageId} onClick={() => { onSave?.(messageId as string) }}>
+                      <RiBookmark3Line className='h-4 w-4' />
+                    </ActionButton>
+                  )}
+                </div>
+                {(supportFeedback || isInWebApp) && !isWorkflow && !isError && messageId && (
+                  <div className='ml-1 flex items-center gap-0.5 rounded-[10px] border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg p-0.5 shadow-md backdrop-blur-sm'>
+                    {!feedback?.rating && (
+                      <>
+                        <ActionButton onClick={() => onFeedback?.({ rating: 'like' })}>
+                          <RiThumbUpLine className='h-4 w-4' />
+                        </ActionButton>
+                        <ActionButton onClick={() => onFeedback?.({ rating: 'dislike' })}>
+                          <RiThumbDownLine className='h-4 w-4' />
+                        </ActionButton>
+                      </>
+                    )}
+                    {feedback?.rating === 'like' && (
+                      <ActionButton state={ActionButtonState.Active} onClick={() => onFeedback?.({ rating: null })}>
+                        <RiThumbUpLine className='h-4 w-4' />
+                      </ActionButton>
+                    )}
+                    {feedback?.rating === 'dislike' && (
+                      <ActionButton state={ActionButtonState.Destructive} onClick={() => onFeedback?.({ rating: null })}>
+                        <RiThumbDownLine className='h-4 w-4' />
+                      </ActionButton>
+                    )}
+                  </div>
+                )}
+              </div>
+            </div>
+            {/* more like this elements */}
+            {!isTop && (
+              <div className={cn(
+                'absolute top-[-32px] flex h-[33px] w-4 justify-center',
+                isMobile ? 'left-[17px]' : 'left-[50%] translate-x-[-50%]',
+              )}>
+                <div className='h-full w-0.5 bg-divider-regular'></div>
+                <div className={cn(
+                  'absolute left-0 flex h-4 w-4 items-center justify-center rounded-2xl border-[0.5px] border-divider-subtle bg-util-colors-blue-blue-500 shadow-xs',
+                  isMobile ? 'top-[3.5px]' : 'top-2',
+                )}>
+                  <RiSparklingFill className='h-3 w-3 text-text-primary-on-surface' />
+                </div>
+              </div>
+            )}
+          </>
+        )}
+      </div>
+      {((childMessageId || isQuerying) && depth < 3) && (
+        <GenerationItem {...childProps as any} />
+      )}
+    </>
+  )
+}
+export default React.memo(GenerationItem)
diff --git a/app/components/app/text-generate/item/result-tab.tsx b/app/components/app/text-generate/item/result-tab.tsx
new file mode 100644
index 0000000..94d5ded
--- /dev/null
+++ b/app/components/app/text-generate/item/result-tab.tsx
@@ -0,0 +1,56 @@
+import {
+  memo,
+} from 'react'
+import { Markdown } from '@/app/components/base/markdown'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
+import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+import type { WorkflowProcess } from '@/app/components/base/chat/types'
+import { FileList } from '@/app/components/base/file-uploader'
+
+const ResultTab = ({
+  data,
+  content,
+  currentTab,
+}: {
+  data?: WorkflowProcess
+  content: any
+  currentTab: string
+}) => {
+  return (
+    <>
+      {currentTab === 'RESULT' && (
+        <div className='space-y-3 p-4'>
+          {data?.resultText && <Markdown content={data?.resultText || ''} />}
+          {!!data?.files?.length && (
+            <div className='flex flex-col gap-2'>
+              {data?.files.map((item: any) => (
+                <div key={item.varName} className='system-xs-regular flex flex-col gap-1'>
+                  <div className='py-1 text-text-tertiary '>{item.varName}</div>
+                  <FileList
+                    files={item.list}
+                    showDeleteAction={false}
+                    showDownloadAction
+                    canPreview
+                  />
+                </div>
+              ))}
+            </div>
+          )}
+        </div>
+      )}
+      {currentTab === 'DETAIL' && content && (
+        <div className='p-4'>
+          <CodeEditor
+            readOnly
+            title={<div>JSON OUTPUT</div>}
+            language={CodeLanguage.json}
+            value={content}
+            isJSONStringifyBeauty
+          />
+        </div>
+      )}
+    </>
+  )
+}
+
+export default memo(ResultTab)
diff --git a/app/components/app/text-generate/saved-items/index.tsx b/app/components/app/text-generate/saved-items/index.tsx
new file mode 100644
index 0000000..c22a4ca
--- /dev/null
+++ b/app/components/app/text-generate/saved-items/index.tsx
@@ -0,0 +1,75 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import {
+  RiClipboardLine,
+  RiDeleteBinLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import copy from 'copy-to-clipboard'
+import NoData from './no-data'
+import cn from '@/utils/classnames'
+import type { SavedMessage } from '@/models/debug'
+import { Markdown } from '@/app/components/base/markdown'
+import Toast from '@/app/components/base/toast'
+import ActionButton from '@/app/components/base/action-button'
+import NewAudioButton from '@/app/components/base/new-audio-button'
+
+export type ISavedItemsProps = {
+  className?: string
+  isShowTextToSpeech?: boolean
+  list: SavedMessage[]
+  onRemove: (id: string) => void
+  onStartCreateContent: () => void
+}
+
+const SavedItems: FC<ISavedItemsProps> = ({
+  className,
+  isShowTextToSpeech,
+  list,
+  onRemove,
+  onStartCreateContent,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className={cn('space-y-4', className)}>
+      {list.length === 0
+        ? (
+          <NoData onStartCreateContent={onStartCreateContent} />
+        )
+        : (<>
+          {list.map(({ id, answer }) => (
+            <div key={id} className='relative'>
+              <div className={cn(
+                'rounded-2xl bg-background-section-burn p-4',
+              )}>
+                <Markdown content={answer} />
+              </div>
+              <div className='system-xs-regular mt-1 h-4 px-4 text-text-quaternary'>
+                <span>{answer.length} {t('common.unit.char')}</span>
+              </div>
+              <div className='absolute bottom-1 right-2'>
+                <div className='ml-1 flex items-center gap-0.5 rounded-[10px] border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg p-0.5 shadow-md backdrop-blur-sm'>
+                  {isShowTextToSpeech && <NewAudioButton value={answer}/>}
+                  <ActionButton onClick={() => {
+                    copy(answer)
+                    Toast.notify({ type: 'success', message: t('common.actionMsg.copySuccessfully') })
+                  }}>
+                    <RiClipboardLine className='h-4 w-4' />
+                  </ActionButton>
+                  <ActionButton onClick={() => {
+                    onRemove(id)
+                  }}>
+                    <RiDeleteBinLine className='h-4 w-4' />
+                  </ActionButton>
+                </div>
+              </div>
+            </div>
+          ))}
+        </>)}
+
+    </div>
+  )
+}
+export default React.memo(SavedItems)
diff --git a/app/components/app/text-generate/saved-items/no-data/index.tsx b/app/components/app/text-generate/saved-items/no-data/index.tsx
new file mode 100644
index 0000000..69c4966
--- /dev/null
+++ b/app/components/app/text-generate/saved-items/no-data/index.tsx
@@ -0,0 +1,42 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAddLine,
+  RiBookmark3Line,
+} from '@remixicon/react'
+import Button from '@/app/components/base/button'
+export type INoDataProps = {
+  onStartCreateContent: () => void
+}
+
+const NoData: FC<INoDataProps> = ({
+  onStartCreateContent,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='rounded-xl bg-background-section-burn p-6 '>
+      <div className='flex h-10 w-10 items-center justify-center rounded-[10px] border-[0.5px] border-components-card-border bg-components-card-bg-alt shadow-lg backdrop-blur-sm'>
+        <RiBookmark3Line className='h-4 w-4 text-text-accent'/>
+      </div>
+      <div className='mt-3'>
+        <span className='system-xl-semibold text-text-secondary'>{t('share.generation.savedNoData.title')}</span>
+      </div>
+      <div className='system-sm-regular mt-1 text-text-tertiary'>
+        {t('share.generation.savedNoData.description')}
+      </div>
+      <Button
+        variant='primary'
+        className='mt-3'
+        onClick={onStartCreateContent}
+      >
+        <RiAddLine className='mr-1 h-4 w-4' />
+        <span>{t('share.generation.savedNoData.startCreateContent')}</span>
+      </Button>
+    </div>
+  )
+}
+
+export default React.memo(NoData)
diff --git a/app/components/app/type-selector/index.tsx b/app/components/app/type-selector/index.tsx
new file mode 100644
index 0000000..0accafd
--- /dev/null
+++ b/app/components/app/type-selector/index.tsx
@@ -0,0 +1,168 @@
+import { useTranslation } from 'react-i18next'
+import React, { useState } from 'react'
+import { RiArrowDownSLine, RiCloseCircleFill, RiExchange2Fill, RiFilter3Line } from '@remixicon/react'
+import Checkbox from '../../base/checkbox'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { BubbleTextMod, ChatBot, ListSparkle, Logic } from '@/app/components/base/icons/src/vender/solid/communication'
+import type { AppMode } from '@/types/app'
+export type AppSelectorProps = {
+  value: Array<AppMode>
+  onChange: (value: AppSelectorProps['value']) => void
+}
+
+const allTypes: AppMode[] = ['chat', 'agent-chat', 'completion', 'advanced-chat', 'workflow']
+
+const AppTypeSelector = ({ value, onChange }: AppSelectorProps) => {
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <div className='relative'>
+        <PortalToFollowElemTrigger
+          onClick={() => setOpen(v => !v)}
+          className='block'
+        >
+          <div className={cn(
+            'flex cursor-pointer items-center justify-between space-x-1 rounded-md px-2 hover:bg-state-base-hover',
+          )}>
+            <AppTypeSelectTrigger values={value} />
+            {value && value.length > 0 && <div className='h-4 w-4' onClick={(e) => {
+              e.stopPropagation()
+              onChange([])
+            }}>
+              <RiCloseCircleFill className='h-3.5 w-3.5 cursor-pointer text-text-quaternary hover:text-text-tertiary' />
+            </div>}
+          </div>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[1002]'>
+          <ul className='relative w-[240px] rounded-xl border border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg backdrop-blur-[5px]'>
+            {allTypes.map(mode => (
+              <AppTypeSelectorItem key={mode} type={mode}
+                checked={Boolean(value.length > 0 && value?.indexOf(mode) !== -1)}
+                onClick={() => {
+                  if (value?.indexOf(mode) !== -1)
+                    onChange(value?.filter(v => v !== mode) ?? [])
+                  else
+                    onChange([...(value || []), mode])
+                }} />
+            ))}
+          </ul>
+        </PortalToFollowElemContent>
+      </div >
+    </PortalToFollowElem >
+  )
+}
+
+export default AppTypeSelector
+
+function AppTypeSelectTrigger({ values }: { values: AppSelectorProps['value'] }) {
+  const { t } = useTranslation()
+  if (!values || values.length === 0) {
+    return <div className={cn(
+      'flex h-8 items-center justify-between gap-1',
+    )}>
+      <RiFilter3Line className='h-4 w-4 text-text-tertiary' />
+      <div className='system-sm-medium min-w-[65px] grow text-center text-text-tertiary'>{t('app.typeSelector.all')}</div>
+      <RiArrowDownSLine className='h-4 w-4 text-text-tertiary' />
+    </div>
+  }
+  if (values.length === 1) {
+    return <div className={cn(
+      'flex h-8 flex-nowrap items-center justify-between gap-1',
+    )}>
+      <AppTypeIcon type={values[0]} />
+      <div className='line-clamp-1 flex flex-1 items-center text-center'>
+        <AppTypeLabel type={values[0]} className="system-sm-medium text-components-menu-item-text" />
+      </div>
+    </div>
+  }
+  return <div className={cn(
+    'relative flex h-8 items-center justify-between -space-x-2',
+  )}>
+    {values.map((mode, index) => (<AppTypeIcon key={mode} type={mode} wrapperClassName='border border-components-panel-on-panel-item-bg' style={{ zIndex: 5 - index }} />))}
+  </div>
+}
+
+type AppTypeSelectorItemProps = {
+  checked: boolean
+  type: AppMode
+  onClick: () => void
+}
+function AppTypeSelectorItem({ checked, type, onClick }: AppTypeSelectorItemProps) {
+  return <li className='flex cursor-pointer items-center space-x-2 rounded-lg py-1 pl-2 pr-1 hover:bg-state-base-hover' onClick={onClick}>
+    <Checkbox checked={checked} />
+    <AppTypeIcon type={type} />
+    <div className='grow p-1 pl-0'>
+      <AppTypeLabel type={type} className="system-sm-medium text-components-menu-item-text" />
+    </div>
+  </li>
+}
+
+type AppTypeIconProps = {
+  type: AppMode
+  style?: React.CSSProperties
+  className?: string
+  wrapperClassName?: string
+}
+
+export function AppTypeIcon({ type, className, wrapperClassName, style }: AppTypeIconProps) {
+  const wrapperClassNames = cn('inline-flex h-5 w-5 items-center justify-center rounded-md border border-divider-regular', wrapperClassName)
+  const iconClassNames = cn('h-3.5 w-3.5 text-components-avatar-shape-fill-stop-100', className)
+  if (type === 'chat') {
+    return <div style={style} className={cn(wrapperClassNames, 'bg-components-icon-bg-blue-solid')}>
+      <ChatBot className={iconClassNames} />
+    </div>
+  }
+  if (type === 'agent-chat') {
+    return <div style={style} className={cn(wrapperClassNames, 'bg-components-icon-bg-violet-solid')}>
+      <Logic className={iconClassNames} />
+    </div>
+  }
+  if (type === 'advanced-chat') {
+    return <div style={style} className={cn(wrapperClassNames, 'bg-components-icon-bg-blue-light-solid')}>
+      <BubbleTextMod className={iconClassNames} />
+    </div>
+  }
+  if (type === 'workflow') {
+    return <div style={style} className={cn(wrapperClassNames, 'bg-components-icon-bg-indigo-solid')}>
+      <RiExchange2Fill className={iconClassNames} />
+    </div>
+  }
+  if (type === 'completion') {
+    return <div style={style} className={cn(wrapperClassNames, 'bg-components-icon-bg-teal-solid')}>
+      <ListSparkle className={iconClassNames} />
+    </div>
+  }
+  return null
+}
+
+type AppTypeLabelProps = {
+  type: AppMode
+  className?: string
+}
+export function AppTypeLabel({ type, className }: AppTypeLabelProps) {
+  const { t } = useTranslation()
+  let label = ''
+  if (type === 'chat')
+    label = t('app.typeSelector.chatbot')
+  if (type === 'agent-chat')
+    label = t('app.typeSelector.agent')
+  if (type === 'completion')
+    label = t('app.typeSelector.completion')
+  if (type === 'advanced-chat')
+    label = t('app.typeSelector.advanced')
+  if (type === 'workflow')
+    label = t('app.typeSelector.workflow')
+
+  return <span className={className}>{label}</span>
+}
diff --git a/app/components/app/workflow-log/detail.tsx b/app/components/app/workflow-log/detail.tsx
new file mode 100644
index 0000000..dc3eb89
--- /dev/null
+++ b/app/components/app/workflow-log/detail.tsx
@@ -0,0 +1,26 @@
+'use client'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import Run from '@/app/components/workflow/run'
+
+type ILogDetail = {
+  runID: string
+  onClose: () => void
+}
+
+const DetailPanel: FC<ILogDetail> = ({ runID, onClose }) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='relative flex grow flex-col pt-3'>
+      <span className='absolute right-3 top-4 z-20 cursor-pointer p-1' onClick={onClose}>
+        <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+      </span>
+      <h1 className='system-xl-semibold shrink-0 px-4 py-1 text-text-primary'>{t('appLog.runDetail.workflowTitle')}</h1>
+      <Run runID={runID}/>
+    </div>
+  )
+}
+
+export default DetailPanel
diff --git a/app/components/app/workflow-log/filter.tsx b/app/components/app/workflow-log/filter.tsx
new file mode 100644
index 0000000..f60e1f9
--- /dev/null
+++ b/app/components/app/workflow-log/filter.tsx
@@ -0,0 +1,74 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import dayjs from 'dayjs'
+import { RiCalendarLine } from '@remixicon/react'
+import quarterOfYear from 'dayjs/plugin/quarterOfYear'
+import type { QueryParam } from './index'
+import Chip from '@/app/components/base/chip'
+import Input from '@/app/components/base/input'
+dayjs.extend(quarterOfYear)
+
+const today = dayjs()
+
+export const TIME_PERIOD_MAPPING: { [key: string]: { value: number; name: string } } = {
+  1: { value: 0, name: 'today' },
+  2: { value: 7, name: 'last7days' },
+  3: { value: 28, name: 'last4weeks' },
+  4: { value: today.diff(today.subtract(3, 'month'), 'day'), name: 'last3months' },
+  5: { value: today.diff(today.subtract(12, 'month'), 'day'), name: 'last12months' },
+  6: { value: today.diff(today.startOf('month'), 'day'), name: 'monthToDate' },
+  7: { value: today.diff(today.startOf('quarter'), 'day'), name: 'quarterToDate' },
+  8: { value: today.diff(today.startOf('year'), 'day'), name: 'yearToDate' },
+  9: { value: -1, name: 'allTime' },
+}
+
+type IFilterProps = {
+  queryParams: QueryParam
+  setQueryParams: (v: QueryParam) => void
+}
+
+const Filter: FC<IFilterProps> = ({ queryParams, setQueryParams }: IFilterProps) => {
+  const { t } = useTranslation()
+  return (
+    <div className='mb-2 flex flex-row flex-wrap gap-2'>
+      <Chip
+        value={queryParams.status || 'all'}
+        onSelect={(item) => {
+          setQueryParams({ ...queryParams, status: item.value as string })
+        }}
+        onClear={() => setQueryParams({ ...queryParams, status: 'all' })}
+        items={[{ value: 'all', name: 'All' },
+          { value: 'succeeded', name: 'Success' },
+          { value: 'failed', name: 'Fail' },
+          { value: 'stopped', name: 'Stop' },
+        ]}
+      />
+      <Chip
+        className='min-w-[150px]'
+        panelClassName='w-[270px]'
+        leftIcon={<RiCalendarLine className='h-4 w-4 text-text-secondary' />}
+        value={queryParams.period}
+        onSelect={(item) => {
+          setQueryParams({ ...queryParams, period: item.value })
+        }}
+        onClear={() => setQueryParams({ ...queryParams, period: '9' })}
+        items={Object.entries(TIME_PERIOD_MAPPING).map(([k, v]) => ({ value: k, name: t(`appLog.filter.period.${v.name}`) }))}
+      />
+      <Input
+        wrapperClassName='w-[200px]'
+        showLeftIcon
+        showClearIcon
+        value={queryParams.keyword}
+        placeholder={t('common.operation.search')!}
+        onChange={(e) => {
+          setQueryParams({ ...queryParams, keyword: e.target.value })
+        }}
+        onClear={() => setQueryParams({ ...queryParams, keyword: '' })}
+      />
+    </div>
+  )
+}
+
+export default Filter
diff --git a/app/components/app/workflow-log/index.tsx b/app/components/app/workflow-log/index.tsx
new file mode 100644
index 0000000..c350a8b
--- /dev/null
+++ b/app/components/app/workflow-log/index.tsx
@@ -0,0 +1,120 @@
+'use client'
+import type { FC, SVGProps } from 'react'
+import React, { useState } from 'react'
+import useSWR from 'swr'
+import { usePathname } from 'next/navigation'
+import { useDebounce } from 'ahooks'
+import { omit } from 'lodash-es'
+import dayjs from 'dayjs'
+import utc from 'dayjs/plugin/utc'
+import timezone from 'dayjs/plugin/timezone'
+import { Trans, useTranslation } from 'react-i18next'
+import Link from 'next/link'
+import List from './list'
+import Filter, { TIME_PERIOD_MAPPING } from './filter'
+import Pagination from '@/app/components/base/pagination'
+import Loading from '@/app/components/base/loading'
+import { fetchWorkflowLogs } from '@/service/log'
+import { APP_PAGE_LIMIT } from '@/config'
+import type { App, AppMode } from '@/types/app'
+import { useAppContext } from '@/context/app-context'
+
+dayjs.extend(utc)
+dayjs.extend(timezone)
+
+export type ILogsProps = {
+  appDetail: App
+}
+
+export type QueryParam = {
+  period: string
+  status?: string
+  keyword?: string
+}
+
+const ThreeDotsIcon = ({ className }: SVGProps<SVGElement>) => {
+  return <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" className={className ?? ''}>
+    <path d="M5 6.5V5M8.93934 7.56066L10 6.5M10.0103 11.5H11.5103" stroke="#374151" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
+  </svg>
+}
+const EmptyElement: FC<{ appUrl: string }> = ({ appUrl }) => {
+  const { t } = useTranslation()
+  const pathname = usePathname()
+  const pathSegments = pathname.split('/')
+  pathSegments.pop()
+  return <div className='flex h-full items-center justify-center'>
+    <div className='box-border h-fit w-[560px] rounded-2xl bg-background-section-burn px-5 py-4'>
+      <span className='system-md-semibold text-text-secondary'>{t('appLog.table.empty.element.title')}<ThreeDotsIcon className='relative -left-1.5 -top-3 inline' /></span>
+      <div className='system-sm-regular mt-2 text-text-tertiary'>
+        <Trans
+          i18nKey="appLog.table.empty.element.content"
+          components={{ shareLink: <Link href={`${pathSegments.join('/')}/overview`} className='text-util-colors-blue-blue-600' />, testLink: <Link href={appUrl} className='text-util-colors-blue-blue-600' target='_blank' rel='noopener noreferrer' /> }}
+        />
+      </div>
+    </div>
+  </div>
+}
+
+const Logs: FC<ILogsProps> = ({ appDetail }) => {
+  const { t } = useTranslation()
+  const { userProfile: { timezone } } = useAppContext()
+  const [queryParams, setQueryParams] = useState<QueryParam>({ status: 'all', period: '2' })
+  const [currPage, setCurrPage] = React.useState<number>(0)
+  const debouncedQueryParams = useDebounce(queryParams, { wait: 500 })
+  const [limit, setLimit] = React.useState<number>(APP_PAGE_LIMIT)
+
+  const query = {
+    page: currPage + 1,
+    limit,
+    ...(debouncedQueryParams.status !== 'all' ? { status: debouncedQueryParams.status } : {}),
+    ...(debouncedQueryParams.keyword ? { keyword: debouncedQueryParams.keyword } : {}),
+    ...((debouncedQueryParams.period !== '9')
+      ? {
+        created_at__after: dayjs().subtract(TIME_PERIOD_MAPPING[debouncedQueryParams.period].value, 'day').startOf('day').tz(timezone).format('YYYY-MM-DDTHH:mm:ssZ'),
+        created_at__before: dayjs().endOf('day').tz(timezone).format('YYYY-MM-DDTHH:mm:ssZ'),
+      }
+      : {}),
+    ...omit(debouncedQueryParams, ['period', 'status']),
+  }
+
+  const getWebAppType = (appType: AppMode) => {
+    if (appType !== 'completion' && appType !== 'workflow')
+      return 'chat'
+    return appType
+  }
+
+  const { data: workflowLogs, mutate } = useSWR({
+    url: `/apps/${appDetail.id}/workflow-app-logs`,
+    params: query,
+  }, fetchWorkflowLogs)
+  const total = workflowLogs?.total
+
+  return (
+    <div className='flex h-full flex-col'>
+      <h1 className='system-xl-semibold text-text-primary'>{t('appLog.workflowTitle')}</h1>
+      <p className='system-sm-regular text-text-tertiary'>{t('appLog.workflowSubtitle')}</p>
+      <div className='flex max-h-[calc(100%-16px)] flex-1 flex-col py-4'>
+        <Filter queryParams={queryParams} setQueryParams={setQueryParams} />
+        {/* workflow log */}
+        {total === undefined
+          ? <Loading type='app' />
+          : total > 0
+            ? <List logs={workflowLogs} appDetail={appDetail} onRefresh={mutate} />
+            : <EmptyElement appUrl={`${appDetail.site.app_base_url}/${getWebAppType(appDetail.mode)}/${appDetail.site.access_token}`} />
+        }
+        {/* Show Pagination only if the total is more than the limit */}
+        {(total && total > APP_PAGE_LIMIT)
+          ? <Pagination
+            current={currPage}
+            onChange={setCurrPage}
+            total={total}
+            limit={limit}
+            onLimitChange={setLimit}
+          />
+          : null}
+      </div>
+    </div>
+  )
+}
+
+export default Logs
diff --git a/app/components/app/workflow-log/list.tsx b/app/components/app/workflow-log/list.tsx
new file mode 100644
index 0000000..b01c049
--- /dev/null
+++ b/app/components/app/workflow-log/list.tsx
@@ -0,0 +1,145 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import DetailPanel from './detail'
+import type { WorkflowAppLogDetail, WorkflowLogsResponse } from '@/models/log'
+import type { App } from '@/types/app'
+import Loading from '@/app/components/base/loading'
+import Drawer from '@/app/components/base/drawer'
+import Indicator from '@/app/components/header/indicator'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import useTimestamp from '@/hooks/use-timestamp'
+import cn from '@/utils/classnames'
+
+type ILogs = {
+  logs?: WorkflowLogsResponse
+  appDetail?: App
+  onRefresh: () => void
+}
+
+const defaultValue = 'N/A'
+
+const WorkflowAppLogList: FC<ILogs> = ({ logs, appDetail, onRefresh }) => {
+  const { t } = useTranslation()
+  const { formatTime } = useTimestamp()
+
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+
+  const [showDrawer, setShowDrawer] = useState<boolean>(false)
+  const [currentLog, setCurrentLog] = useState<WorkflowAppLogDetail | undefined>()
+
+  const statusTdRender = (status: string) => {
+    if (status === 'succeeded') {
+      return (
+        <div className='system-xs-semibold-uppercase inline-flex items-center gap-1'>
+          <Indicator color={'green'} />
+          <span className='text-util-colors-green-green-600'>Success</span>
+        </div>
+      )
+    }
+    if (status === 'failed') {
+      return (
+        <div className='system-xs-semibold-uppercase inline-flex items-center gap-1'>
+          <Indicator color={'red'} />
+          <span className='text-util-colors-red-red-600'>Fail</span>
+        </div>
+      )
+    }
+    if (status === 'stopped') {
+      return (
+        <div className='system-xs-semibold-uppercase inline-flex items-center gap-1'>
+          <Indicator color={'yellow'} />
+          <span className='text-util-colors-warning-warning-600'>Stop</span>
+        </div>
+      )
+    }
+    if (status === 'running') {
+      return (
+        <div className='system-xs-semibold-uppercase inline-flex items-center gap-1'>
+          <Indicator color={'blue'} />
+          <span className='text-util-colors-blue-light-blue-light-600'>Running</span>
+        </div>
+      )
+    }
+    if (status === 'partial-succeeded') {
+      return (
+        <div className='system-xs-semibold-uppercase inline-flex items-center gap-1'>
+          <Indicator color={'green'} />
+          <span className='text-util-colors-green-green-600'>Partial Success</span>
+        </div>
+      )
+    }
+  }
+
+  const onCloseDrawer = () => {
+    onRefresh()
+    setShowDrawer(false)
+    setCurrentLog(undefined)
+  }
+
+  if (!logs || !appDetail)
+    return <Loading />
+
+  return (
+    <div className='overflow-x-auto'>
+      <table className={cn('mt-2 w-full min-w-[440px] border-collapse border-0')}>
+        <thead className='system-xs-medium-uppercase text-text-tertiary'>
+          <tr>
+            <td className='w-5 whitespace-nowrap rounded-l-lg bg-background-section-burn pl-2 pr-1'></td>
+            <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appLog.table.header.startTime')}</td>
+            <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appLog.table.header.status')}</td>
+            <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appLog.table.header.runtime')}</td>
+            <td className='whitespace-nowrap bg-background-section-burn py-1.5 pl-3'>{t('appLog.table.header.tokens')}</td>
+            <td className='whitespace-nowrap rounded-r-lg bg-background-section-burn py-1.5 pl-3'>{t('appLog.table.header.user')}</td>
+          </tr>
+        </thead>
+        <tbody className="system-sm-regular text-text-secondary">
+          {logs.data.map((log: WorkflowAppLogDetail) => {
+            const endUser = log.created_by_end_user ? log.created_by_end_user.session_id : log.created_by_account ? log.created_by_account.name : defaultValue
+            return <tr
+              key={log.id}
+              className={cn('cursor-pointer border-b border-divider-subtle hover:bg-background-default-hover', currentLog?.id !== log.id ? '' : 'bg-background-default-hover')}
+              onClick={() => {
+                setCurrentLog(log)
+                setShowDrawer(true)
+              }}>
+              <td className='h-4'>
+                {!log.read_at && (
+                  <div className='flex items-center p-3 pr-0.5'>
+                    <span className='inline-block h-1.5 w-1.5 rounded bg-util-colors-blue-blue-500'></span>
+                  </div>
+                )}
+              </td>
+              <td className='w-[160px] p-3 pr-2'>{formatTime(log.created_at, t('appLog.dateTimeFormat') as string)}</td>
+              <td className='p-3 pr-2'>{statusTdRender(log.workflow_run.status)}</td>
+              <td className='p-3 pr-2'>
+                <div className={cn(
+                  log.workflow_run.elapsed_time === 0 && 'text-text-quaternary',
+                )}>{`${log.workflow_run.elapsed_time.toFixed(3)}s`}</div>
+              </td>
+              <td className='p-3 pr-2'>{log.workflow_run.total_tokens}</td>
+              <td className='p-3 pr-2'>
+                <div className={cn(endUser === defaultValue ? 'text-text-quaternary' : 'text-text-secondary', 'overflow-hidden text-ellipsis whitespace-nowrap')}>
+                  {endUser}
+                </div>
+              </td>
+            </tr>
+          })}
+        </tbody>
+      </table>
+      <Drawer
+        isOpen={showDrawer}
+        onClose={onCloseDrawer}
+        mask={isMobile}
+        footer={null}
+        panelClassName='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[600px] rounded-xl border border-components-panel-border'
+      >
+        <DetailPanel onClose={onCloseDrawer} runID={currentLog?.workflow_run.id || ''} />
+      </Drawer>
+    </div>
+  )
+}
+
+export default WorkflowAppLogList
diff --git a/app/components/base/action-button/index.css b/app/components/base/action-button/index.css
new file mode 100644
index 0000000..3c1a10b
--- /dev/null
+++ b/app/components/base/action-button/index.css
@@ -0,0 +1,45 @@
+@tailwind components;
+
+@layer components {
+    .action-btn {
+        @apply inline-flex justify-center items-center cursor-pointer text-text-tertiary hover:text-text-secondary hover:bg-state-base-hover
+    }
+
+    .action-btn-hover {
+        @apply bg-state-base-hover
+    }
+
+    .action-btn-disabled {
+        @apply cursor-not-allowed
+    }
+
+    .action-btn-xl {
+        @apply p-2 w-9 h-9 rounded-lg
+    }
+
+    .action-btn-l {
+        @apply p-1.5 w-8 h-8 rounded-lg
+    }
+
+    /* m is for the regular button */
+    .action-btn-m {
+        @apply p-0.5 w-6 h-6 rounded-lg
+    }
+
+    .action-btn-xs {
+        @apply p-0 w-4 h-4 rounded
+    }
+
+    .action-btn.action-btn-active {
+        @apply text-text-accent bg-state-accent-active hover:bg-state-accent-active-alt
+    }
+
+    .action-btn.action-btn-disabled {
+        @apply text-text-disabled
+    }
+
+    .action-btn.action-btn-destructive {
+        @apply text-text-destructive bg-state-destructive-hover
+    }
+
+}
diff --git a/app/components/base/action-button/index.tsx b/app/components/base/action-button/index.tsx
new file mode 100644
index 0000000..c90d1a8
--- /dev/null
+++ b/app/components/base/action-button/index.tsx
@@ -0,0 +1,73 @@
+import type { CSSProperties } from 'react'
+import React from 'react'
+import { type VariantProps, cva } from 'class-variance-authority'
+import classNames from '@/utils/classnames'
+
+enum ActionButtonState {
+  Destructive = 'destructive',
+  Active = 'active',
+  Disabled = 'disabled',
+  Default = '',
+  Hover = 'hover',
+}
+
+const actionButtonVariants = cva(
+  'action-btn',
+  {
+    variants: {
+      size: {
+        xs: 'action-btn-xs',
+        m: 'action-btn-m',
+        l: 'action-btn-l',
+        xl: 'action-btn-xl',
+      },
+    },
+    defaultVariants: {
+      size: 'm',
+    },
+  },
+)
+
+export type ActionButtonProps = {
+  size?: 'xs' | 's' | 'm' | 'l' | 'xl'
+  state?: ActionButtonState
+  styleCss?: CSSProperties
+} & React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof actionButtonVariants>
+
+function getActionButtonState(state: ActionButtonState) {
+  switch (state) {
+    case ActionButtonState.Destructive:
+      return 'action-btn-destructive'
+    case ActionButtonState.Active:
+      return 'action-btn-active'
+    case ActionButtonState.Disabled:
+      return 'action-btn-disabled'
+    case ActionButtonState.Hover:
+      return 'action-btn-hover'
+    default:
+      return ''
+  }
+}
+
+const ActionButton = React.forwardRef<HTMLButtonElement, ActionButtonProps>(
+  ({ className, size, state = ActionButtonState.Default, styleCss, children, ...props }, ref) => {
+    return (
+      <button
+        type='button'
+        className={classNames(
+          actionButtonVariants({ className, size }),
+          getActionButtonState(state),
+        )}
+        ref={ref}
+        style={styleCss}
+        {...props}
+      >
+        {children}
+      </button>
+    )
+  },
+)
+ActionButton.displayName = 'ActionButton'
+
+export default ActionButton
+export { ActionButton, ActionButtonState, actionButtonVariants }
diff --git a/app/components/base/agent-log-modal/detail.tsx b/app/components/base/agent-log-modal/detail.tsx
new file mode 100644
index 0000000..148b168
--- /dev/null
+++ b/app/components/base/agent-log-modal/detail.tsx
@@ -0,0 +1,132 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useMemo, useState } from 'react'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import { flatten, uniq } from 'lodash-es'
+import ResultPanel from './result'
+import TracingPanel from './tracing'
+import cn from '@/utils/classnames'
+import { ToastContext } from '@/app/components/base/toast'
+import Loading from '@/app/components/base/loading'
+import { fetchAgentLogDetail } from '@/service/log'
+import type { AgentIteration, AgentLogDetailResponse } from '@/models/log'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import type { IChatItem } from '@/app/components/base/chat/chat/type'
+
+export type AgentLogDetailProps = {
+  activeTab?: 'DETAIL' | 'TRACING'
+  conversationID: string
+  log: IChatItem
+  messageID: string
+}
+
+const AgentLogDetail: FC<AgentLogDetailProps> = ({
+  activeTab = 'DETAIL',
+  conversationID,
+  messageID,
+  log,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const [currentTab, setCurrentTab] = useState<string>(activeTab)
+  const appDetail = useAppStore(s => s.appDetail)
+  const [loading, setLoading] = useState<boolean>(true)
+  const [runDetail, setRunDetail] = useState<AgentLogDetailResponse>()
+  const [list, setList] = useState<AgentIteration[]>([])
+
+  const tools = useMemo(() => {
+    const res = uniq(flatten(runDetail?.iterations.map((iteration) => {
+      return iteration.tool_calls.map((tool: any) => tool.tool_name).filter(Boolean)
+    })).filter(Boolean))
+    return res
+  }, [runDetail])
+
+  const getLogDetail = useCallback(async (appID: string, conversationID: string, messageID: string) => {
+    try {
+      const res = await fetchAgentLogDetail({
+        appID,
+        params: {
+          conversation_id: conversationID,
+          message_id: messageID,
+        },
+      })
+      setRunDetail(res)
+      setList(res.iterations)
+    }
+    catch (err) {
+      notify({
+        type: 'error',
+        message: `${err}`,
+      })
+    }
+  }, [notify])
+
+  const getData = async (appID: string, conversationID: string, messageID: string) => {
+    setLoading(true)
+    await getLogDetail(appID, conversationID, messageID)
+    setLoading(false)
+  }
+
+  const switchTab = async (tab: string) => {
+    setCurrentTab(tab)
+  }
+
+  useEffect(() => {
+    // fetch data
+    if (appDetail)
+      getData(appDetail.id, conversationID, messageID)
+  }, [appDetail, conversationID, messageID])
+
+  return (
+    <div className='relative flex grow flex-col'>
+      {/* tab */}
+      <div className='flex shrink-0 items-center border-b-[0.5px] border-divider-regular px-4'>
+        <div
+          className={cn(
+            'mr-6 cursor-pointer border-b-2 border-transparent py-3 text-[13px] font-semibold leading-[18px] text-text-tertiary',
+            currentTab === 'DETAIL' && '!border-[rgb(21,94,239)] text-text-secondary',
+          )}
+          onClick={() => switchTab('DETAIL')}
+        >{t('runLog.detail')}</div>
+        <div
+          className={cn(
+            'mr-6 cursor-pointer border-b-2 border-transparent py-3 text-[13px] font-semibold leading-[18px] text-text-tertiary',
+            currentTab === 'TRACING' && '!border-[rgb(21,94,239)] text-text-secondary',
+          )}
+          onClick={() => switchTab('TRACING')}
+        >{t('runLog.tracing')}</div>
+      </div>
+      {/* panel detail */}
+      <div className={cn('h-0 grow overflow-y-auto rounded-b-2xl bg-components-panel-bg', currentTab !== 'DETAIL' && '!bg-background-section')}>
+        {loading && (
+          <div className='flex h-full items-center justify-center bg-components-panel-bg'>
+            <Loading />
+          </div>
+        )}
+        {!loading && currentTab === 'DETAIL' && runDetail && (
+          <ResultPanel
+            inputs={log.input}
+            outputs={log.content}
+            status={runDetail.meta.status}
+            error={runDetail.meta.error}
+            elapsed_time={runDetail.meta.elapsed_time}
+            total_tokens={runDetail.meta.total_tokens}
+            created_at={runDetail.meta.start_time}
+            created_by={runDetail.meta.executor}
+            agentMode={runDetail.meta.agent_mode}
+            tools={tools}
+            iterations={runDetail.iterations.length}
+          />
+        )}
+        {!loading && currentTab === 'TRACING' && (
+          <TracingPanel
+            list={list}
+          />
+        )}
+      </div>
+    </div>
+  )
+}
+
+export default AgentLogDetail
diff --git a/app/components/base/agent-log-modal/index.tsx b/app/components/base/agent-log-modal/index.tsx
new file mode 100644
index 0000000..024ea2a
--- /dev/null
+++ b/app/components/base/agent-log-modal/index.tsx
@@ -0,0 +1,61 @@
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import { useEffect, useRef, useState } from 'react'
+import { useClickAway } from 'ahooks'
+import AgentLogDetail from './detail'
+import cn from '@/utils/classnames'
+import type { IChatItem } from '@/app/components/base/chat/chat/type'
+
+type AgentLogModalProps = {
+  currentLogItem?: IChatItem
+  width: number
+  onCancel: () => void
+}
+const AgentLogModal: FC<AgentLogModalProps> = ({
+  currentLogItem,
+  width,
+  onCancel,
+}) => {
+  const { t } = useTranslation()
+  const ref = useRef(null)
+  const [mounted, setMounted] = useState(false)
+
+  useClickAway(() => {
+    if (mounted)
+      onCancel()
+  }, ref)
+
+  useEffect(() => {
+    setMounted(true)
+  }, [])
+
+  if (!currentLogItem || !currentLogItem.conversationId)
+    return null
+
+  return (
+    <div
+      className={cn('relative z-10 flex flex-col rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg py-3 shadow-xl')}
+      style={{
+        width: 480,
+        position: 'fixed',
+        top: 56 + 8,
+        left: 8 + (width - 480),
+        bottom: 16,
+      }}
+      ref={ref}
+    >
+      <h1 className='text-md shrink-0 px-4 py-1 font-semibold text-text-primary'>{t('appLog.runDetail.workflowTitle')}</h1>
+      <span className='absolute right-3 top-4 z-20 cursor-pointer p-1' onClick={onCancel}>
+        <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+      </span>
+      <AgentLogDetail
+        conversationID={currentLogItem.conversationId}
+        messageID={currentLogItem.id}
+        log={currentLogItem}
+      />
+    </div>
+  )
+}
+
+export default AgentLogModal
diff --git a/app/components/base/agent-log-modal/iteration.tsx b/app/components/base/agent-log-modal/iteration.tsx
new file mode 100644
index 0000000..d6f8e84
--- /dev/null
+++ b/app/components/base/agent-log-modal/iteration.tsx
@@ -0,0 +1,51 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import type { FC } from 'react'
+import ToolCall from './tool-call'
+import Divider from '@/app/components/base/divider'
+import type { AgentIteration } from '@/models/log'
+import cn from '@/utils/classnames'
+
+type Props = {
+  isFinal: boolean
+  index: number
+  iterationInfo: AgentIteration
+}
+
+const Iteration: FC<Props> = ({ iterationInfo, isFinal, index }) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className={cn('px-4 py-2')}>
+      <div className='flex items-center'>
+        {isFinal && (
+          <div className='mr-3 shrink-0 text-xs font-semibold leading-[18px] text-text-tertiary'>{t('appLog.agentLogDetail.finalProcessing')}</div>
+        )}
+        {!isFinal && (
+          <div className='mr-3 shrink-0 text-xs font-semibold leading-[18px] text-text-tertiary'>{`${t('appLog.agentLogDetail.iteration').toUpperCase()} ${index}`}</div>
+        )}
+        <Divider bgStyle='gradient' className='mx-0 h-[1px] grow'/>
+      </div>
+      <ToolCall
+        isLLM
+        isFinal={isFinal}
+        tokens={iterationInfo.tokens}
+        observation={iterationInfo.tool_raw.outputs}
+        finalAnswer={iterationInfo.thought}
+        toolCall={{
+          status: 'success',
+          tool_icon: null,
+        }}
+      />
+      {iterationInfo.tool_calls.map((toolCall, index) => (
+        <ToolCall
+          isLLM={false}
+          key={index}
+          toolCall={toolCall}
+        />
+      ))}
+    </div>
+  )
+}
+
+export default Iteration
diff --git a/app/components/base/agent-log-modal/result.tsx b/app/components/base/agent-log-modal/result.tsx
new file mode 100644
index 0000000..850f457
--- /dev/null
+++ b/app/components/base/agent-log-modal/result.tsx
@@ -0,0 +1,126 @@
+'use client'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import StatusPanel from '@/app/components/workflow/run/status'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
+import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+import useTimestamp from '@/hooks/use-timestamp'
+
+type ResultPanelProps = {
+  status: string
+  elapsed_time?: number
+  total_tokens?: number
+  error?: string
+  inputs?: any
+  outputs?: any
+  created_by?: string
+  created_at: string
+  agentMode?: string
+  tools?: string[]
+  iterations?: number
+}
+
+const ResultPanel: FC<ResultPanelProps> = ({
+  elapsed_time,
+  total_tokens,
+  error,
+  inputs,
+  outputs,
+  created_by,
+  created_at,
+  agentMode,
+  tools,
+  iterations,
+}) => {
+  const { t } = useTranslation()
+  const { formatTime } = useTimestamp()
+
+  return (
+    <div className='bg-components-panel-bg py-2'>
+      <div className='px-4 py-2'>
+        <StatusPanel
+          status='succeeded'
+          time={elapsed_time}
+          tokens={total_tokens}
+          error={error}
+        />
+      </div>
+      <div className='flex flex-col gap-2 px-4 py-2'>
+        <CodeEditor
+          readOnly
+          title={<div>INPUT</div>}
+          language={CodeLanguage.json}
+          value={inputs}
+          isJSONStringifyBeauty
+        />
+        <CodeEditor
+          readOnly
+          title={<div>OUTPUT</div>}
+          language={CodeLanguage.json}
+          value={outputs}
+          isJSONStringifyBeauty
+        />
+      </div>
+      <div className='px-4 py-2'>
+        <div className='h-[0.5px] bg-divider-regular opacity-5' />
+      </div>
+      <div className='px-4 py-2'>
+        <div className='relative'>
+          <div className='h-6 text-xs font-medium leading-6 text-text-tertiary'>{t('runLog.meta.title')}</div>
+          <div className='py-1'>
+            <div className='flex'>
+              <div className='w-[104px] shrink-0 truncate px-2 py-[5px] text-xs leading-[18px] text-text-tertiary'>{t('runLog.meta.status')}</div>
+              <div className='grow px-2 py-[5px] text-xs leading-[18px] text-text-primary'>
+                <span>SUCCESS</span>
+              </div>
+            </div>
+            <div className='flex'>
+              <div className='w-[104px] shrink-0 truncate px-2 py-[5px] text-xs leading-[18px] text-text-tertiary'>{t('runLog.meta.executor')}</div>
+              <div className='grow px-2 py-[5px] text-xs leading-[18px] text-text-primary'>
+                <span>{created_by || 'N/A'}</span>
+              </div>
+            </div>
+            <div className='flex'>
+              <div className='w-[104px] shrink-0 truncate px-2 py-[5px] text-xs leading-[18px] text-text-tertiary'>{t('runLog.meta.startTime')}</div>
+              <div className='grow px-2 py-[5px] text-xs leading-[18px] text-text-primary'>
+                <span>{formatTime(Date.parse(created_at) / 1000, t('appLog.dateTimeFormat') as string)}</span>
+              </div>
+            </div>
+            <div className='flex'>
+              <div className='w-[104px] shrink-0 truncate px-2 py-[5px] text-xs leading-[18px] text-text-tertiary'>{t('runLog.meta.time')}</div>
+              <div className='grow px-2 py-[5px] text-xs leading-[18px] text-text-primary'>
+                <span>{`${elapsed_time?.toFixed(3)}s`}</span>
+              </div>
+            </div>
+            <div className='flex'>
+              <div className='w-[104px] shrink-0 truncate px-2 py-[5px] text-xs leading-[18px] text-text-tertiary'>{t('runLog.meta.tokens')}</div>
+              <div className='grow px-2 py-[5px] text-xs leading-[18px] text-text-primary'>
+                <span>{`${total_tokens || 0} Tokens`}</span>
+              </div>
+            </div>
+            <div className='flex'>
+              <div className='w-[104px] shrink-0 truncate px-2 py-[5px] text-xs leading-[18px] text-text-tertiary'>{t('appLog.agentLogDetail.agentMode')}</div>
+              <div className='grow px-2 py-[5px] text-xs leading-[18px] text-text-primary'>
+                <span>{agentMode === 'function_call' ? t('appDebug.agent.agentModeType.functionCall') : t('appDebug.agent.agentModeType.ReACT')}</span>
+              </div>
+            </div>
+            <div className='flex'>
+              <div className='w-[104px] shrink-0 truncate px-2 py-[5px] text-xs leading-[18px] text-text-tertiary'>{t('appLog.agentLogDetail.toolUsed')}</div>
+              <div className='grow px-2 py-[5px] text-xs leading-[18px] text-text-primary'>
+                <span>{tools?.length ? tools?.join(', ') : 'Null'}</span>
+              </div>
+            </div>
+            <div className='flex'>
+              <div className='w-[104px] shrink-0 truncate px-2 py-[5px] text-xs leading-[18px] text-text-tertiary'>{t('appLog.agentLogDetail.iterations')}</div>
+              <div className='grow px-2 py-[5px] text-xs leading-[18px] text-text-primary'>
+                <span>{iterations}</span>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default ResultPanel
diff --git a/app/components/base/agent-log-modal/tool-call.tsx b/app/components/base/agent-log-modal/tool-call.tsx
new file mode 100644
index 0000000..499a703
--- /dev/null
+++ b/app/components/base/agent-log-modal/tool-call.tsx
@@ -0,0 +1,142 @@
+'use client'
+import type { FC } from 'react'
+import { useState } from 'react'
+import {
+  RiCheckboxCircleLine,
+  RiErrorWarningLine,
+} from '@remixicon/react'
+import { useContext } from 'use-context-selector'
+import cn from '@/utils/classnames'
+import BlockIcon from '@/app/components/workflow/block-icon'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
+import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+import { ChevronRight } from '@/app/components/base/icons/src/vender/line/arrows'
+import type { ToolCall } from '@/models/log'
+import { BlockEnum } from '@/app/components/workflow/types'
+import I18n from '@/context/i18n'
+
+type Props = {
+  toolCall: ToolCall
+  isLLM: boolean
+  isFinal?: boolean
+  tokens?: number
+  observation?: any
+  finalAnswer?: any
+}
+
+const ToolCallItem: FC<Props> = ({ toolCall, isLLM = false, isFinal, tokens, observation, finalAnswer }) => {
+  const [collapseState, setCollapseState] = useState<boolean>(true)
+  const { locale } = useContext(I18n)
+  const toolName = isLLM ? 'LLM' : (toolCall.tool_label[locale] || toolCall.tool_label[locale.replaceAll('-', '_')])
+
+  const getTime = (time: number) => {
+    if (time < 1)
+      return `${(time * 1000).toFixed(3)} ms`
+    if (time > 60)
+      return `${Number.parseInt(Math.round(time / 60).toString())} m ${(time % 60).toFixed(3)} s`
+    return `${time.toFixed(3)} s`
+  }
+
+  const getTokenCount = (tokens: number) => {
+    if (tokens < 1000)
+      return tokens
+    if (tokens >= 1000 && tokens < 1000000)
+      return `${Number.parseFloat((tokens / 1000).toFixed(3))}K`
+    if (tokens >= 1000000)
+      return `${Number.parseFloat((tokens / 1000000).toFixed(3))}M`
+  }
+
+  return (
+    <div className={cn('py-1')}>
+      <div className={cn('group rounded-2xl border border-components-panel-border bg-background-default shadow-xs transition-all hover:shadow-md')}>
+        <div
+          className={cn(
+            'flex cursor-pointer items-center py-3 pl-[6px] pr-3',
+            !collapseState && '!pb-2',
+          )}
+          onClick={() => setCollapseState(!collapseState)}
+        >
+          <ChevronRight
+            className={cn(
+              'mr-1 h-3 w-3 shrink-0 text-text-quaternary transition-all group-hover:text-text-tertiary',
+              !collapseState && 'rotate-90',
+            )}
+          />
+          <BlockIcon className={cn('mr-2 shrink-0')} type={isLLM ? BlockEnum.LLM : BlockEnum.Tool} toolIcon={toolCall.tool_icon} />
+          <div className={cn(
+            'grow truncate text-[13px] font-semibold leading-[16px] text-text-secondary',
+          )} title={toolName}>{toolName}</div>
+          <div className='shrink-0 text-xs leading-[18px] text-text-tertiary'>
+            {toolCall.time_cost && (
+              <span>{getTime(toolCall.time_cost || 0)}</span>
+            )}
+            {isLLM && (
+              <span>{`${getTokenCount(tokens || 0)} tokens`}</span>
+            )}
+          </div>
+          {toolCall.status === 'success' && (
+            <RiCheckboxCircleLine className='ml-2 h-3.5 w-3.5 shrink-0 text-[#12B76A]' />
+          )}
+          {toolCall.status === 'error' && (
+            <RiErrorWarningLine className='ml-2 h-3.5 w-3.5 shrink-0 text-[#F04438]' />
+          )}
+        </div>
+        {!collapseState && (
+          <div className='pb-2'>
+            <div className={cn('px-[10px] py-1')}>
+              {toolCall.status === 'error' && (
+                <div className='rounded-lg border-[0.5px] border-[rbga(0,0,0,0.05)] bg-[#fef3f2] px-3 py-[10px] text-xs leading-[18px] text-[#d92d20] shadow-xs'>{toolCall.error}</div>
+              )}
+            </div>
+            {toolCall.tool_input && (
+              <div className={cn('px-[10px] py-1')}>
+                <CodeEditor
+                  readOnly
+                  title={<div>INPUT</div>}
+                  language={CodeLanguage.json}
+                  value={toolCall.tool_input}
+                  isJSONStringifyBeauty
+                />
+              </div>
+            )}
+            {toolCall.tool_output && (
+              <div className={cn('px-[10px] py-1')}>
+                <CodeEditor
+                  readOnly
+                  title={<div>OUTPUT</div>}
+                  language={CodeLanguage.json}
+                  value={toolCall.tool_output}
+                  isJSONStringifyBeauty
+                />
+              </div>
+            )}
+            {isLLM && (
+              <div className={cn('px-[10px] py-1')}>
+                <CodeEditor
+                  readOnly
+                  title={<div>OBSERVATION</div>}
+                  language={CodeLanguage.json}
+                  value={observation}
+                  isJSONStringifyBeauty
+                />
+              </div>
+            )}
+            {isLLM && (
+              <div className={cn('px-[10px] py-1')}>
+                <CodeEditor
+                  readOnly
+                  title={<div>{isFinal ? 'FINAL ANSWER' : 'THOUGHT'}</div>}
+                  language={CodeLanguage.json}
+                  value={finalAnswer}
+                  isJSONStringifyBeauty
+                />
+              </div>
+            )}
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+
+export default ToolCallItem
diff --git a/app/components/base/agent-log-modal/tracing.tsx b/app/components/base/agent-log-modal/tracing.tsx
new file mode 100644
index 0000000..c390d25
--- /dev/null
+++ b/app/components/base/agent-log-modal/tracing.tsx
@@ -0,0 +1,25 @@
+'use client'
+import type { FC } from 'react'
+import Iteration from './iteration'
+import type { AgentIteration } from '@/models/log'
+
+type TracingPanelProps = {
+  list: AgentIteration[]
+}
+
+const TracingPanel: FC<TracingPanelProps> = ({ list }) => {
+  return (
+    <div className='bg-background-section'>
+      {list.map((iteration, index) => (
+        <Iteration
+          key={index}
+          index={index + 1}
+          isFinal={index + 1 === list.length}
+          iterationInfo={iteration}
+        />
+      ))}
+    </div>
+  )
+}
+
+export default TracingPanel
diff --git a/app/components/base/answer-icon/index.tsx b/app/components/base/answer-icon/index.tsx
new file mode 100644
index 0000000..faad4e5
--- /dev/null
+++ b/app/components/base/answer-icon/index.tsx
@@ -0,0 +1,47 @@
+'use client'
+
+import type { FC } from 'react'
+import { init } from 'emoji-mart'
+import data from '@emoji-mart/data'
+import classNames from '@/utils/classnames'
+import type { AppIconType } from '@/types/app'
+
+init({ data })
+
+export type AnswerIconProps = {
+  iconType?: AppIconType | null
+  icon?: string | null
+  background?: string | null
+  imageUrl?: string | null
+}
+
+const AnswerIcon: FC<AnswerIconProps> = ({
+  iconType,
+  icon,
+  background,
+  imageUrl,
+}) => {
+  const wrapperClassName = classNames(
+    'flex',
+    'items-center',
+    'justify-center',
+    'w-full',
+    'h-full',
+    'rounded-full',
+    'border-[0.5px]',
+    'border-black/5',
+    'text-xl',
+  )
+  const isValidImageIcon = iconType === 'image' && imageUrl
+  return <div
+    className={wrapperClassName}
+    style={{ background: background || '#D5F5F6' }}
+  >
+    {isValidImageIcon
+      ? <img src={imageUrl} className="h-full w-full rounded-full" alt="answer icon" />
+      : (icon && icon !== '') ? <em-emoji id={icon} /> : <em-emoji id='馃' />
+    }
+  </div>
+}
+
+export default AnswerIcon
diff --git a/app/components/base/app-icon-picker/ImageInput.tsx b/app/components/base/app-icon-picker/ImageInput.tsx
new file mode 100644
index 0000000..9c0a95c
--- /dev/null
+++ b/app/components/base/app-icon-picker/ImageInput.tsx
@@ -0,0 +1,126 @@
+'use client'
+
+import type { ChangeEvent, FC } from 'react'
+import { createRef, useEffect, useState } from 'react'
+import Cropper, { type Area, type CropperProps } from 'react-easy-crop'
+import classNames from 'classnames'
+import { useTranslation } from 'react-i18next'
+
+import { ImagePlus } from '../icons/src/vender/line/images'
+import { useDraggableUploader } from './hooks'
+import { checkIsAnimatedImage } from './utils'
+import { ALLOW_FILE_EXTENSIONS } from '@/types/app'
+
+export type OnImageInput = {
+  (isCropped: true, tempUrl: string, croppedAreaPixels: Area, fileName: string): void
+  (isCropped: false, file: File): void
+}
+
+type UploaderProps = {
+  className?: string
+  cropShape?: CropperProps['cropShape']
+  onImageInput?: OnImageInput
+}
+
+const ImageInput: FC<UploaderProps> = ({
+  className,
+  cropShape,
+  onImageInput,
+}) => {
+  const { t } = useTranslation()
+  const [inputImage, setInputImage] = useState<{ file: File; url: string }>()
+  const [isAnimatedImage, setIsAnimatedImage] = useState<boolean>(false)
+  useEffect(() => {
+    return () => {
+      if (inputImage)
+        URL.revokeObjectURL(inputImage.url)
+    }
+  }, [inputImage])
+
+  const [crop, setCrop] = useState({ x: 0, y: 0 })
+  const [zoom, setZoom] = useState(1)
+
+  const onCropComplete = async (_: Area, croppedAreaPixels: Area) => {
+    if (!inputImage)
+      return
+    onImageInput?.(true, inputImage.url, croppedAreaPixels, inputImage.file.name)
+  }
+
+  const handleLocalFileInput = (e: ChangeEvent<HTMLInputElement>) => {
+    const file = e.target.files?.[0]
+    if (file) {
+      setInputImage({ file, url: URL.createObjectURL(file) })
+      checkIsAnimatedImage(file).then((isAnimatedImage) => {
+        setIsAnimatedImage(!!isAnimatedImage)
+        if (isAnimatedImage)
+          onImageInput?.(false, file)
+      })
+    }
+  }
+
+  const {
+    isDragActive,
+    handleDragEnter,
+    handleDragOver,
+    handleDragLeave,
+    handleDrop,
+  } = useDraggableUploader((file: File) => setInputImage({ file, url: URL.createObjectURL(file) }))
+
+  const inputRef = createRef<HTMLInputElement>()
+
+  const handleShowImage = () => {
+    if (isAnimatedImage) {
+      return (
+        <img src={inputImage?.url} alt='' />
+      )
+    }
+
+    return (
+      <Cropper
+        image={inputImage?.url}
+        crop={crop}
+        zoom={zoom}
+        aspect={1}
+        cropShape={cropShape}
+        onCropChange={setCrop}
+        onCropComplete={onCropComplete}
+        onZoomChange={setZoom}
+      />
+    )
+  }
+
+  return (
+    <div className={classNames(className, 'w-full px-3 py-1.5')}>
+      <div
+        className={classNames(
+          isDragActive && 'border-primary-600',
+          'relative aspect-square bg-gray-50 border-[1.5px] border-gray-200 border-dashed rounded-lg flex flex-col justify-center items-center text-gray-500')}
+        onDragEnter={handleDragEnter}
+        onDragOver={handleDragOver}
+        onDragLeave={handleDragLeave}
+        onDrop={handleDrop}
+      >
+        {
+          !inputImage
+            ? <>
+              <ImagePlus className="pointer-events-none mb-3 h-[30px] w-[30px]" />
+              <div className="mb-[2px] text-sm font-medium">
+                <span className="pointer-events-none">{t('common.imageInput.dropImageHere')}&nbsp;</span>
+                <button className="text-components-button-primary-bg" onClick={() => inputRef.current?.click()}>{t('common.imageInput.browse')}</button>
+                <input
+                  ref={inputRef} type="file" className="hidden"
+                  onClick={e => ((e.target as HTMLInputElement).value = '')}
+                  accept={ALLOW_FILE_EXTENSIONS.map(ext => `.${ext}`).join(',')}
+                  onChange={handleLocalFileInput}
+                />
+              </div>
+              <div className="pointer-events-none">{t('common.imageInput.supportedFormats')}</div>
+            </>
+            : handleShowImage()
+        }
+      </div>
+    </div>
+  )
+}
+
+export default ImageInput
diff --git a/app/components/base/app-icon-picker/hooks.tsx b/app/components/base/app-icon-picker/hooks.tsx
new file mode 100644
index 0000000..b3f67c0
--- /dev/null
+++ b/app/components/base/app-icon-picker/hooks.tsx
@@ -0,0 +1,43 @@
+import { useCallback, useState } from 'react'
+
+export const useDraggableUploader = <T extends HTMLElement>(setImageFn: (file: File) => void) => {
+  const [isDragActive, setIsDragActive] = useState(false)
+
+  const handleDragEnter = useCallback((e: React.DragEvent<T>) => {
+    e.preventDefault()
+    e.stopPropagation()
+    setIsDragActive(true)
+  }, [])
+
+  const handleDragOver = useCallback((e: React.DragEvent<T>) => {
+    e.preventDefault()
+    e.stopPropagation()
+  }, [])
+
+  const handleDragLeave = useCallback((e: React.DragEvent<T>) => {
+    e.preventDefault()
+    e.stopPropagation()
+    setIsDragActive(false)
+  }, [])
+
+  const handleDrop = useCallback((e: React.DragEvent<T>) => {
+    e.preventDefault()
+    e.stopPropagation()
+    setIsDragActive(false)
+
+    const file = e.dataTransfer.files[0]
+
+    if (!file)
+      return
+
+    setImageFn(file)
+  }, [setImageFn])
+
+  return {
+    handleDragEnter,
+    handleDragOver,
+    handleDragLeave,
+    handleDrop,
+    isDragActive,
+  }
+}
diff --git a/app/components/base/app-icon-picker/index.tsx b/app/components/base/app-icon-picker/index.tsx
new file mode 100644
index 0000000..8304de1
--- /dev/null
+++ b/app/components/base/app-icon-picker/index.tsx
@@ -0,0 +1,150 @@
+import type { FC } from 'react'
+import { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { Area } from 'react-easy-crop'
+import Modal from '../modal'
+import Divider from '../divider'
+import Button from '../button'
+import { ImagePlus } from '../icons/src/vender/line/images'
+import { useLocalFileUploader } from '../image-uploader/hooks'
+import EmojiPickerInner from '../emoji-picker/Inner'
+import type { OnImageInput } from './ImageInput'
+import ImageInput from './ImageInput'
+import s from './style.module.css'
+import getCroppedImg from './utils'
+import type { AppIconType, ImageFile } from '@/types/app'
+import cn from '@/utils/classnames'
+import { DISABLE_UPLOAD_IMAGE_AS_ICON } from '@/config'
+import { noop } from 'lodash-es'
+
+export type AppIconEmojiSelection = {
+  type: 'emoji'
+  icon: string
+  background: string
+}
+
+export type AppIconImageSelection = {
+  type: 'image'
+  fileId: string
+  url: string
+}
+
+export type AppIconSelection = AppIconEmojiSelection | AppIconImageSelection
+
+type AppIconPickerProps = {
+  onSelect?: (payload: AppIconSelection) => void
+  onClose?: () => void
+  className?: string
+}
+
+const AppIconPicker: FC<AppIconPickerProps> = ({
+  onSelect,
+  onClose,
+  className,
+}) => {
+  const { t } = useTranslation()
+
+  const tabs = [
+    { key: 'emoji', label: t('app.iconPicker.emoji'), icon: <span className="text-lg">馃</span> },
+    { key: 'image', label: t('app.iconPicker.image'), icon: <ImagePlus /> },
+  ]
+  const [activeTab, setActiveTab] = useState<AppIconType>('emoji')
+
+  const [emoji, setEmoji] = useState<{ emoji: string; background: string }>()
+  const handleSelectEmoji = useCallback((emoji: string, background: string) => {
+    setEmoji({ emoji, background })
+  }, [setEmoji])
+
+  const [uploading, setUploading] = useState<boolean>()
+
+  const { handleLocalFileUpload } = useLocalFileUploader({
+    limit: 3,
+    disabled: false,
+    onUpload: (imageFile: ImageFile) => {
+      if (imageFile.fileId) {
+        setUploading(false)
+        onSelect?.({
+          type: 'image',
+          fileId: imageFile.fileId,
+          url: imageFile.url,
+        })
+      }
+    },
+  })
+
+  type InputImageInfo = { file: File } | { tempUrl: string; croppedAreaPixels: Area; fileName: string }
+  const [inputImageInfo, setInputImageInfo] = useState<InputImageInfo>()
+
+  const handleImageInput: OnImageInput = async (isCropped: boolean, fileOrTempUrl: string | File, croppedAreaPixels?: Area, fileName?: string) => {
+    setInputImageInfo(
+      isCropped
+        ? { tempUrl: fileOrTempUrl as string, croppedAreaPixels: croppedAreaPixels!, fileName: fileName! }
+        : { file: fileOrTempUrl as File },
+    )
+  }
+
+  const handleSelect = async () => {
+    if (activeTab === 'emoji') {
+      if (emoji) {
+        onSelect?.({
+          type: 'emoji',
+          icon: emoji.emoji,
+          background: emoji.background,
+        })
+      }
+    }
+    else {
+      if (!inputImageInfo)
+        return
+      setUploading(true)
+      if ('file' in inputImageInfo) {
+        handleLocalFileUpload(inputImageInfo.file)
+        return
+      }
+      const blob = await getCroppedImg(inputImageInfo.tempUrl, inputImageInfo.croppedAreaPixels, inputImageInfo.fileName)
+      const file = new File([blob], inputImageInfo.fileName, { type: blob.type })
+      handleLocalFileUpload(file)
+    }
+  }
+
+  return <Modal
+    onClose={noop}
+    isShow
+    closable={false}
+    wrapperClassName={className}
+    className={cn(s.container, '!w-[362px] !p-0')}
+  >
+    {!DISABLE_UPLOAD_IMAGE_AS_ICON && <div className="w-full p-2 pb-0">
+      <div className='flex items-center justify-center gap-2 rounded-xl bg-background-body p-1'>
+        {tabs.map(tab => (
+          <button
+            key={tab.key}
+            className={`
+                        flex h-8 flex-1 shrink-0 items-center justify-center rounded-xl p-2 text-sm font-medium
+                        ${activeTab === tab.key && 'bg-components-main-nav-nav-button-bg-active shadow-md'}
+                      `}
+            onClick={() => setActiveTab(tab.key as AppIconType)}
+          >
+            {tab.icon} &nbsp; {tab.label}
+          </button>
+        ))}
+      </div>
+    </div>}
+
+    <EmojiPickerInner className={cn(activeTab === 'emoji' ? 'block' : 'hidden', 'pt-2')} onSelect={handleSelectEmoji} />
+    <ImageInput className={activeTab === 'image' ? 'block' : 'hidden'} onImageInput={handleImageInput} />
+
+    <Divider className='m-0' />
+    <div className='flex w-full items-center justify-center gap-2 p-3'>
+      <Button className='w-full' onClick={() => onClose?.()}>
+        {t('app.iconPicker.cancel')}
+      </Button>
+
+      <Button variant="primary" className='w-full' disabled={uploading} loading={uploading} onClick={handleSelect}>
+        {t('app.iconPicker.ok')}
+      </Button>
+    </div>
+  </Modal>
+}
+
+export default AppIconPicker
diff --git a/app/components/base/app-icon-picker/style.module.css b/app/components/base/app-icon-picker/style.module.css
new file mode 100644
index 0000000..5facb35
--- /dev/null
+++ b/app/components/base/app-icon-picker/style.module.css
@@ -0,0 +1,12 @@
+.container {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+    width: 362px;
+    max-height: 552px;
+
+    border: 0.5px solid #EAECF0;
+    box-shadow: 0px 12px 16px -4px rgba(16, 24, 40, 0.08), 0px 4px 6px -2px rgba(16, 24, 40, 0.03);
+    border-radius: 12px;
+    background: #fff;
+}
diff --git a/app/components/base/app-icon-picker/utils.ts b/app/components/base/app-icon-picker/utils.ts
new file mode 100644
index 0000000..f63b75e
--- /dev/null
+++ b/app/components/base/app-icon-picker/utils.ts
@@ -0,0 +1,166 @@
+export const createImage = (url: string) =>
+  new Promise<HTMLImageElement>((resolve, reject) => {
+    const image = new Image()
+    image.addEventListener('load', () => resolve(image))
+    image.addEventListener('error', error => reject(error))
+    image.setAttribute('crossOrigin', 'anonymous') // needed to avoid cross-origin issues on CodeSandbox
+    image.src = url
+  })
+
+export function getRadianAngle(degreeValue: number) {
+  return (degreeValue * Math.PI) / 180
+}
+
+export function getMimeType(fileName: string): string {
+  const extension = fileName.split('.').pop()?.toLowerCase()
+  switch (extension) {
+    case 'png':
+      return 'image/png'
+    case 'jpg':
+    case 'jpeg':
+      return 'image/jpeg'
+    case 'gif':
+      return 'image/gif'
+    case 'webp':
+      return 'image/webp'
+    default:
+      return 'image/jpeg'
+  }
+}
+
+/**
+ * Returns the new bounding area of a rotated rectangle.
+ */
+export function rotateSize(width: number, height: number, rotation: number) {
+  const rotRad = getRadianAngle(rotation)
+
+  return {
+    width:
+            Math.abs(Math.cos(rotRad) * width) + Math.abs(Math.sin(rotRad) * height),
+    height:
+            Math.abs(Math.sin(rotRad) * width) + Math.abs(Math.cos(rotRad) * height),
+  }
+}
+
+/**
+ * This function was adapted from the one in the ReadMe of https://github.com/DominicTobias/react-image-crop
+ */
+export default async function getCroppedImg(
+  imageSrc: string,
+  pixelCrop: { x: number; y: number; width: number; height: number },
+  fileName: string,
+  rotation = 0,
+  flip = { horizontal: false, vertical: false },
+): Promise<Blob> {
+  const image = await createImage(imageSrc)
+  const canvas = document.createElement('canvas')
+  const ctx = canvas.getContext('2d')
+  const mimeType = getMimeType(fileName)
+
+  if (!ctx)
+    throw new Error('Could not create a canvas context')
+
+  const rotRad = getRadianAngle(rotation)
+
+  // calculate bounding box of the rotated image
+  const { width: bBoxWidth, height: bBoxHeight } = rotateSize(
+    image.width,
+    image.height,
+    rotation,
+  )
+
+  // set canvas size to match the bounding box
+  canvas.width = bBoxWidth
+  canvas.height = bBoxHeight
+
+  // translate canvas context to a central location to allow rotating and flipping around the center
+  ctx.translate(bBoxWidth / 2, bBoxHeight / 2)
+  ctx.rotate(rotRad)
+  ctx.scale(flip.horizontal ? -1 : 1, flip.vertical ? -1 : 1)
+  ctx.translate(-image.width / 2, -image.height / 2)
+
+  // draw rotated image
+  ctx.drawImage(image, 0, 0)
+
+  const croppedCanvas = document.createElement('canvas')
+
+  const croppedCtx = croppedCanvas.getContext('2d')
+
+  if (!croppedCtx)
+    throw new Error('Could not create a canvas context')
+
+  // Set the size of the cropped canvas
+  croppedCanvas.width = pixelCrop.width
+  croppedCanvas.height = pixelCrop.height
+
+  // Draw the cropped image onto the new canvas
+  croppedCtx.drawImage(
+    canvas,
+    pixelCrop.x,
+    pixelCrop.y,
+    pixelCrop.width,
+    pixelCrop.height,
+    0,
+    0,
+    pixelCrop.width,
+    pixelCrop.height,
+  )
+
+  return new Promise((resolve, reject) => {
+    croppedCanvas.toBlob((file) => {
+      if (file)
+        resolve(file)
+      else
+        reject(new Error('Could not create a blob'))
+    }, mimeType)
+  })
+}
+
+export function checkIsAnimatedImage(file: File): Promise<boolean> {
+  return new Promise((resolve, reject) => {
+    const fileReader = new FileReader()
+
+    fileReader.onload = function (e) {
+      const arr = new Uint8Array(e.target?.result as ArrayBuffer)
+
+      // Check file extension
+      const fileName = file.name.toLowerCase()
+      if (fileName.endsWith('.gif')) {
+        // If file is a GIF, assume it's animated
+        resolve(true)
+      }
+      // Check for WebP signature (RIFF and WEBP)
+      else if (isWebP(arr)) {
+        resolve(checkWebPAnimation(arr)) // Check if it's animated
+      }
+      else {
+        resolve(false) // Not a GIF or WebP
+      }
+    }
+
+    fileReader.onerror = function (err) {
+      reject(err) // Reject the promise on error
+    }
+
+    // Read the file as an array buffer
+    fileReader.readAsArrayBuffer(file)
+  })
+}
+
+// Function to check for WebP signature
+function isWebP(arr: Uint8Array) {
+  return (
+    arr[0] === 0x52 && arr[1] === 0x49 && arr[2] === 0x46 && arr[3] === 0x46
+    && arr[8] === 0x57 && arr[9] === 0x45 && arr[10] === 0x42 && arr[11] === 0x50
+  ) // "WEBP"
+}
+
+// Function to check if the WebP is animated (contains ANIM chunk)
+function checkWebPAnimation(arr: Uint8Array) {
+  // Search for the ANIM chunk in WebP to determine if it's animated
+  for (let i = 12; i < arr.length - 4; i++) {
+    if (arr[i] === 0x41 && arr[i + 1] === 0x4E && arr[i + 2] === 0x49 && arr[i + 3] === 0x4D)
+      return true // Found animation
+  }
+  return false // No animation chunk found
+}
diff --git a/app/components/base/app-icon/index.tsx b/app/components/base/app-icon/index.tsx
new file mode 100644
index 0000000..ac17af1
--- /dev/null
+++ b/app/components/base/app-icon/index.tsx
@@ -0,0 +1,71 @@
+'use client'
+
+import type { FC } from 'react'
+import { init } from 'emoji-mart'
+import data from '@emoji-mart/data'
+import { cva } from 'class-variance-authority'
+import type { AppIconType } from '@/types/app'
+import classNames from '@/utils/classnames'
+
+init({ data })
+
+export type AppIconProps = {
+  size?: 'xs' | 'tiny' | 'small' | 'medium' | 'large' | 'xl' | 'xxl'
+  rounded?: boolean
+  iconType?: AppIconType | null
+  icon?: string
+  background?: string | null
+  imageUrl?: string | null
+  className?: string
+  innerIcon?: React.ReactNode
+  onClick?: () => void
+}
+const appIconVariants = cva(
+  'flex items-center justify-center relative text-lg rounded-lg grow-0 shrink-0 overflow-hidden leading-none',
+  {
+    variants: {
+      size: {
+        xs: 'w-4 h-4 text-xs',
+        tiny: 'w-6 h-6 text-base',
+        small: 'w-8 h-8 text-xl',
+        medium: 'w-9 h-9 text-[22px]',
+        large: 'w-10 h-10 text-[24px]',
+        xl: 'w-12 h-12 text-[28px]',
+        xxl: 'w-14 h-14 text-[32px]',
+      },
+      rounded: {
+        true: 'rounded-full',
+      },
+    },
+    defaultVariants: {
+      size: 'medium',
+      rounded: false,
+    },
+  })
+const AppIcon: FC<AppIconProps> = ({
+  size = 'medium',
+  rounded = false,
+  iconType,
+  icon,
+  background,
+  imageUrl,
+  className,
+  innerIcon,
+  onClick,
+}) => {
+  const isValidImageIcon = iconType === 'image' && imageUrl
+
+  return <span
+    className={classNames(appIconVariants({ size, rounded }), className)}
+    style={{ background: isValidImageIcon ? undefined : (background || '#FFEAD5') }}
+    onClick={onClick}
+  >
+    {isValidImageIcon
+
+      ? <img src={imageUrl} className="h-full w-full" alt="app icon" />
+      : (innerIcon || ((icon && icon !== '') ? <em-emoji id={icon} /> : <em-emoji id='馃' />))
+    }
+  </span>
+}
+
+export default AppIcon
diff --git a/app/components/base/app-icon/style.module.css b/app/components/base/app-icon/style.module.css
new file mode 100644
index 0000000..4ee84fb
--- /dev/null
+++ b/app/components/base/app-icon/style.module.css
@@ -0,0 +1,23 @@
+.appIcon {
+  @apply flex items-center justify-center relative w-9 h-9 text-lg rounded-lg grow-0 shrink-0;
+}
+
+.appIcon.large {
+  @apply w-10 h-10;
+}
+
+.appIcon.small {
+  @apply w-8 h-8;
+}
+
+.appIcon.tiny {
+  @apply w-6 h-6 text-base;
+}
+
+.appIcon.xs {
+  @apply w-5 h-5 text-base;
+}
+
+.appIcon.rounded {
+  @apply rounded-full;
+}
diff --git a/app/components/base/app-unavailable.tsx b/app/components/base/app-unavailable.tsx
new file mode 100644
index 0000000..00abb4c
--- /dev/null
+++ b/app/components/base/app-unavailable.tsx
@@ -0,0 +1,29 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+
+type IAppUnavailableProps = {
+  code?: number
+  isUnknownReason?: boolean
+  unknownReason?: string
+}
+
+const AppUnavailable: FC<IAppUnavailableProps> = ({
+  code = 404,
+  isUnknownReason,
+  unknownReason,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex h-screen w-screen items-center justify-center'>
+      <h1 className='mr-5 h-[50px] pr-5 text-[24px] font-medium leading-[50px]'
+        style={{
+          borderRight: '1px solid rgba(0,0,0,.3)',
+        }}>{code}</h1>
+      <div className='text-sm'>{unknownReason || (isUnknownReason ? t('share.common.appUnknownError') : t('share.common.appUnavailable'))}</div>
+    </div>
+  )
+}
+export default React.memo(AppUnavailable)
diff --git a/app/components/base/audio-btn/audio.player.manager.ts b/app/components/base/audio-btn/audio.player.manager.ts
new file mode 100644
index 0000000..86eb377
--- /dev/null
+++ b/app/components/base/audio-btn/audio.player.manager.ts
@@ -0,0 +1,50 @@
+import AudioPlayer from '@/app/components/base/audio-btn/audio'
+declare global {
+  // eslint-disable-next-line ts/consistent-type-definitions
+  interface AudioPlayerManager {
+    instance: AudioPlayerManager
+  }
+
+}
+
+export class AudioPlayerManager {
+  private static instance: AudioPlayerManager
+  private audioPlayers: AudioPlayer | null = null
+  private msgId: string | undefined
+
+  public static getInstance(): AudioPlayerManager {
+    if (!AudioPlayerManager.instance) {
+      AudioPlayerManager.instance = new AudioPlayerManager()
+      this.instance = AudioPlayerManager.instance
+    }
+
+    return AudioPlayerManager.instance
+  }
+
+  public getAudioPlayer(url: string, isPublic: boolean, id: string | undefined, msgContent: string | null | undefined, voice: string | undefined, callback: ((event: string) => void) | null): AudioPlayer {
+    if (this.msgId && this.msgId === id && this.audioPlayers) {
+      this.audioPlayers.setCallback(callback)
+      return this.audioPlayers
+    }
+    else {
+      if (this.audioPlayers) {
+        try {
+          this.audioPlayers.pauseAudio()
+          this.audioPlayers.cacheBuffers = []
+          this.audioPlayers.sourceBuffer?.abort()
+        }
+        catch {
+        }
+      }
+
+      this.msgId = id
+      this.audioPlayers = new AudioPlayer(url, isPublic, id, msgContent, voice, callback)
+      return this.audioPlayers
+    }
+  }
+
+  public resetMsgId(msgId: string) {
+    this.msgId = msgId
+    this.audioPlayers?.resetMsgId(msgId)
+  }
+}
diff --git a/app/components/base/audio-btn/audio.ts b/app/components/base/audio-btn/audio.ts
new file mode 100644
index 0000000..00797d0
--- /dev/null
+++ b/app/components/base/audio-btn/audio.ts
@@ -0,0 +1,247 @@
+import Toast from '@/app/components/base/toast'
+import { textToAudioStream } from '@/service/share'
+
+declare global {
+  // eslint-disable-next-line ts/consistent-type-definitions
+  interface Window {
+    ManagedMediaSource: any
+  }
+}
+
+export default class AudioPlayer {
+  mediaSource: MediaSource | null
+  audio: HTMLAudioElement
+  audioContext: AudioContext
+  sourceBuffer?: any
+  cacheBuffers: ArrayBuffer[] = []
+  pauseTimer: number | null = null
+  msgId: string | undefined
+  msgContent: string | null | undefined = null
+  voice: string | undefined = undefined
+  isLoadData = false
+  url: string
+  isPublic: boolean
+  callback: ((event: string) => void) | null
+
+  constructor(streamUrl: string, isPublic: boolean, msgId: string | undefined, msgContent: string | null | undefined, voice: string | undefined, callback: ((event: string) => void) | null) {
+    this.audioContext = new AudioContext()
+    this.msgId = msgId
+    this.msgContent = msgContent
+    this.url = streamUrl
+    this.isPublic = isPublic
+    this.voice = voice
+    this.callback = callback
+
+    // Compatible with iphone ios17 ManagedMediaSource
+    const MediaSource = window.ManagedMediaSource || window.MediaSource
+    if (!MediaSource) {
+      Toast.notify({
+        message: 'Your browser does not support audio streaming, if you are using an iPhone, please update to iOS 17.1 or later.',
+        type: 'error',
+      })
+    }
+    this.mediaSource = MediaSource ? new MediaSource() : null
+    this.audio = new Audio()
+    this.setCallback(callback)
+    if (!window.MediaSource) { // if use  ManagedMediaSource
+      this.audio.disableRemotePlayback = true
+      this.audio.controls = true
+    }
+    this.audio.src = this.mediaSource ? URL.createObjectURL(this.mediaSource) : ''
+    this.audio.autoplay = true
+
+    const source = this.audioContext.createMediaElementSource(this.audio)
+    source.connect(this.audioContext.destination)
+    this.listenMediaSource('audio/mpeg')
+  }
+
+  public resetMsgId(msgId: string) {
+    this.msgId = msgId
+  }
+
+  private listenMediaSource(contentType: string) {
+    this.mediaSource?.addEventListener('sourceopen', () => {
+      if (this.sourceBuffer)
+        return
+
+      this.sourceBuffer = this.mediaSource?.addSourceBuffer(contentType)
+    })
+  }
+
+  public setCallback(callback: ((event: string) => void) | null) {
+    this.callback = callback
+    if (callback) {
+      this.audio.addEventListener('ended', () => {
+        callback('ended')
+      }, false)
+      this.audio.addEventListener('paused', () => {
+        callback('paused')
+      }, true)
+      this.audio.addEventListener('loaded', () => {
+        callback('loaded')
+      }, true)
+      this.audio.addEventListener('play', () => {
+        callback('play')
+      }, true)
+      this.audio.addEventListener('timeupdate', () => {
+        callback('timeupdate')
+      }, true)
+      this.audio.addEventListener('loadeddate', () => {
+        callback('loadeddate')
+      }, true)
+      this.audio.addEventListener('canplay', () => {
+        callback('canplay')
+      }, true)
+      this.audio.addEventListener('error', () => {
+        callback('error')
+      }, true)
+    }
+  }
+
+  private async loadAudio() {
+    try {
+      const audioResponse: any = await textToAudioStream(this.url, this.isPublic, { content_type: 'audio/mpeg' }, {
+        message_id: this.msgId,
+        streaming: true,
+        voice: this.voice,
+        text: this.msgContent,
+      })
+
+      if (audioResponse.status !== 200) {
+        this.isLoadData = false
+        if (this.callback)
+          this.callback('error')
+      }
+
+      const reader = audioResponse.body.getReader()
+      while (true) {
+        const { value, done } = await reader.read()
+
+        if (done) {
+          this.receiveAudioData(value)
+          break
+        }
+
+        this.receiveAudioData(value)
+      }
+    }
+    catch {
+      this.isLoadData = false
+      this.callback && this.callback('error')
+    }
+  }
+
+  // play audio
+  public playAudio() {
+    if (this.isLoadData) {
+      if (this.audioContext.state === 'suspended') {
+        this.audioContext.resume().then((_) => {
+          this.audio.play()
+          this.callback && this.callback('play')
+        })
+      }
+      else if (this.audio.ended) {
+        this.audio.play()
+        this.callback && this.callback('play')
+      }
+      if (this.callback)
+        this.callback('play')
+    }
+    else {
+      this.isLoadData = true
+      this.loadAudio()
+    }
+  }
+
+  private theEndOfStream() {
+    const endTimer = setInterval(() => {
+      if (!this.sourceBuffer?.updating) {
+        this.mediaSource?.endOfStream()
+        clearInterval(endTimer)
+      }
+    }, 10)
+  }
+
+  private finishStream() {
+    const timer = setInterval(() => {
+      if (!this.cacheBuffers.length) {
+        this.theEndOfStream()
+        clearInterval(timer)
+      }
+
+      if (this.cacheBuffers.length && !this.sourceBuffer?.updating) {
+        const arrayBuffer = this.cacheBuffers.shift()!
+        this.sourceBuffer?.appendBuffer(arrayBuffer)
+      }
+    }, 10)
+  }
+
+  public async playAudioWithAudio(audio: string, play = true) {
+    if (!audio || !audio.length) {
+      this.finishStream()
+      return
+    }
+
+    const audioContent = Buffer.from(audio, 'base64')
+    this.receiveAudioData(new Uint8Array(audioContent))
+    if (play) {
+      this.isLoadData = true
+      if (this.audio.paused) {
+        this.audioContext.resume().then((_) => {
+          this.audio.play()
+          this.callback && this.callback('play')
+        })
+      }
+      else if (this.audio.ended) {
+        this.audio.play()
+        this.callback && this.callback('play')
+      }
+      else if (this.audio.played) { /* empty */ }
+
+      else {
+        this.audio.play()
+        this.callback && this.callback('play')
+      }
+    }
+  }
+
+  public pauseAudio() {
+    this.callback && this.callback('paused')
+    this.audio.pause()
+    this.audioContext.suspend()
+  }
+
+  private receiveAudioData(unit8Array: Uint8Array) {
+    if (!unit8Array) {
+      this.finishStream()
+      return
+    }
+    const audioData = this.byteArrayToArrayBuffer(unit8Array)
+    if (!audioData.byteLength) {
+      if (this.mediaSource?.readyState === 'open')
+        this.finishStream()
+      return
+    }
+
+    if (this.sourceBuffer?.updating) {
+      this.cacheBuffers.push(audioData)
+    }
+    else {
+      if (this.cacheBuffers.length && !this.sourceBuffer?.updating) {
+        this.cacheBuffers.push(audioData)
+        const cacheBuffer = this.cacheBuffers.shift()!
+        this.sourceBuffer?.appendBuffer(cacheBuffer)
+      }
+      else {
+        this.sourceBuffer?.appendBuffer(audioData)
+      }
+    }
+  }
+
+  private byteArrayToArrayBuffer(byteArray: Uint8Array): ArrayBuffer {
+    const arrayBuffer = new ArrayBuffer(byteArray.length)
+    const uint8Array = new Uint8Array(arrayBuffer)
+    uint8Array.set(byteArray)
+    return arrayBuffer
+  }
+}
diff --git a/app/components/base/audio-btn/index.tsx b/app/components/base/audio-btn/index.tsx
new file mode 100644
index 0000000..2a54a8e
--- /dev/null
+++ b/app/components/base/audio-btn/index.tsx
@@ -0,0 +1,110 @@
+'use client'
+import { useState } from 'react'
+import { t } from 'i18next'
+import { useParams, usePathname } from 'next/navigation'
+import s from './style.module.css'
+import Tooltip from '@/app/components/base/tooltip'
+import Loading from '@/app/components/base/loading'
+import { AudioPlayerManager } from '@/app/components/base/audio-btn/audio.player.manager'
+
+type AudioBtnProps = {
+  id?: string
+  voice?: string
+  value?: string
+  className?: string
+  isAudition?: boolean
+  noCache?: boolean
+}
+
+type AudioState = 'initial' | 'loading' | 'playing' | 'paused' | 'ended'
+
+const AudioBtn = ({
+  id,
+  voice,
+  value,
+  className,
+  isAudition,
+}: AudioBtnProps) => {
+  const [audioState, setAudioState] = useState<AudioState>('initial')
+
+  const params = useParams()
+  const pathname = usePathname()
+  const audio_finished_call = (event: string): void => {
+    switch (event) {
+      case 'ended':
+        setAudioState('ended')
+        break
+      case 'paused':
+        setAudioState('ended')
+        break
+      case 'loaded':
+        setAudioState('loading')
+        break
+      case 'play':
+        setAudioState('playing')
+        break
+      case 'error':
+        setAudioState('ended')
+        break
+    }
+  }
+  let url = ''
+  let isPublic = false
+
+  if (params.token) {
+    url = '/text-to-audio'
+    isPublic = true
+  }
+  else if (params.appId) {
+    if (pathname.search('explore/installed') > -1)
+      url = `/installed-apps/${params.appId}/text-to-audio`
+    else
+      url = `/apps/${params.appId}/text-to-audio`
+  }
+  const handleToggle = async () => {
+    if (audioState === 'playing' || audioState === 'loading') {
+      setTimeout(() => setAudioState('paused'), 1)
+      AudioPlayerManager.getInstance().getAudioPlayer(url, isPublic, id, value, voice, audio_finished_call).pauseAudio()
+    }
+    else {
+      setTimeout(() => setAudioState('loading'), 1)
+      AudioPlayerManager.getInstance().getAudioPlayer(url, isPublic, id, value, voice, audio_finished_call).playAudio()
+    }
+  }
+
+  const tooltipContent = {
+    initial: t('appApi.play'),
+    ended: t('appApi.play'),
+    paused: t('appApi.pause'),
+    playing: t('appApi.playing'),
+    loading: t('appApi.loading'),
+  }[audioState]
+
+  return (
+    <div className={`inline-flex items-center justify-center ${(audioState === 'loading' || audioState === 'playing') ? 'mr-1' : className}`}>
+      <Tooltip
+        popupContent={tooltipContent}
+      >
+        <button
+          disabled={audioState === 'loading'}
+          className={`box-border flex h-6 w-6 cursor-pointer items-center justify-center ${isAudition ? 'p-0.5' : 'rounded-md bg-white p-0'}`}
+          onClick={handleToggle}
+        >
+          {audioState === 'loading'
+            ? (
+              <div className='flex h-full w-full items-center justify-center rounded-md'>
+                <Loading />
+              </div>
+            )
+            : (
+              <div className={'flex h-full w-full items-center justify-center rounded-md hover:bg-gray-50'}>
+                <div className={`h-4 w-4 ${(audioState === 'playing') ? s.pauseIcon : s.playIcon}`}></div>
+              </div>
+            )}
+        </button>
+      </Tooltip>
+    </div>
+  )
+}
+
+export default AudioBtn
diff --git a/app/components/base/audio-btn/style.module.css b/app/components/base/audio-btn/style.module.css
new file mode 100644
index 0000000..7e3175a
--- /dev/null
+++ b/app/components/base/audio-btn/style.module.css
@@ -0,0 +1,10 @@
+.playIcon {
+  background-image: url(~@/app/components/develop/secret-key/assets/play.svg);
+  background-position: center;
+  background-repeat: no-repeat;
+}
+.pauseIcon {
+  background-image: url(~@/app/components/develop/secret-key/assets/pause.svg);
+  background-position: center;
+  background-repeat: no-repeat;
+}
diff --git a/app/components/base/audio-gallery/AudioPlayer.tsx b/app/components/base/audio-gallery/AudioPlayer.tsx
new file mode 100644
index 0000000..67ded63
--- /dev/null
+++ b/app/components/base/audio-gallery/AudioPlayer.tsx
@@ -0,0 +1,319 @@
+import React, { useCallback, useEffect, useRef, useState } from 'react'
+import { t } from 'i18next'
+import {
+  RiPauseCircleFill,
+  RiPlayLargeFill,
+} from '@remixicon/react'
+import Toast from '@/app/components/base/toast'
+import useTheme from '@/hooks/use-theme'
+import { Theme } from '@/types/app'
+import cn from '@/utils/classnames'
+
+type AudioPlayerProps = {
+  src: string
+}
+
+const AudioPlayer: React.FC<AudioPlayerProps> = ({ src }) => {
+  const [isPlaying, setIsPlaying] = useState(false)
+  const [currentTime, setCurrentTime] = useState(0)
+  const [duration, setDuration] = useState(0)
+  const [waveformData, setWaveformData] = useState<number[]>([])
+  const [bufferedTime, setBufferedTime] = useState(0)
+  const audioRef = useRef<HTMLAudioElement>(null)
+  const canvasRef = useRef<HTMLCanvasElement>(null)
+  const [hasStartedPlaying, setHasStartedPlaying] = useState(false)
+  const [hoverTime, setHoverTime] = useState(0)
+  const [isAudioAvailable, setIsAudioAvailable] = useState(true)
+  const { theme } = useTheme()
+
+  useEffect(() => {
+    const audio = audioRef.current
+    if (!audio)
+      return
+
+    const handleError = () => {
+      setIsAudioAvailable(false)
+    }
+
+    const setAudioData = () => {
+      setDuration(audio.duration)
+    }
+
+    const setAudioTime = () => {
+      setCurrentTime(audio.currentTime)
+    }
+
+    const handleProgress = () => {
+      if (audio.buffered.length > 0)
+        setBufferedTime(audio.buffered.end(audio.buffered.length - 1))
+    }
+
+    const handleEnded = () => {
+      setIsPlaying(false)
+    }
+
+    audio.addEventListener('loadedmetadata', setAudioData)
+    audio.addEventListener('timeupdate', setAudioTime)
+    audio.addEventListener('progress', handleProgress)
+    audio.addEventListener('ended', handleEnded)
+    audio.addEventListener('error', handleError)
+
+    // Preload audio metadata
+    audio.load()
+
+    // Delayed generation of waveform data
+    // eslint-disable-next-line ts/no-use-before-define
+    const timer = setTimeout(() => generateWaveformData(src), 1000)
+
+    return () => {
+      audio.removeEventListener('loadedmetadata', setAudioData)
+      audio.removeEventListener('timeupdate', setAudioTime)
+      audio.removeEventListener('progress', handleProgress)
+      audio.removeEventListener('ended', handleEnded)
+      audio.removeEventListener('error', handleError)
+      clearTimeout(timer)
+    }
+  }, [src])
+
+  const generateWaveformData = async (audioSrc: string) => {
+    if (!window.AudioContext && !(window as any).webkitAudioContext) {
+      setIsAudioAvailable(false)
+      Toast.notify({
+        type: 'error',
+        message: 'Web Audio API is not supported in this browser',
+      })
+      return null
+    }
+
+    const url = new URL(src)
+    const isHttp = url.protocol === 'http:' || url.protocol === 'https:'
+    if (!isHttp) {
+      setIsAudioAvailable(false)
+      return null
+    }
+
+    const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)()
+    const samples = 70
+
+    try {
+      const response = await fetch(audioSrc, { mode: 'cors' })
+      if (!response || !response.ok) {
+        setIsAudioAvailable(false)
+        return null
+      }
+
+      const arrayBuffer = await response.arrayBuffer()
+      const audioBuffer = await audioContext.decodeAudioData(arrayBuffer)
+      const channelData = audioBuffer.getChannelData(0)
+      const blockSize = Math.floor(channelData.length / samples)
+      const waveformData: number[] = []
+
+      for (let i = 0; i < samples; i++) {
+        let sum = 0
+        for (let j = 0; j < blockSize; j++)
+          sum += Math.abs(channelData[i * blockSize + j])
+
+        // Apply nonlinear scaling to enhance small amplitudes
+        waveformData.push((sum / blockSize) * 5)
+      }
+
+      // Normalized waveform data
+      const maxAmplitude = Math.max(...waveformData)
+      const normalizedWaveform = waveformData.map(amp => amp / maxAmplitude)
+
+      setWaveformData(normalizedWaveform)
+      setIsAudioAvailable(true)
+    }
+    catch {
+      const waveform: number[] = []
+      let prevValue = Math.random()
+
+      for (let i = 0; i < samples; i++) {
+        const targetValue = Math.random()
+        const interpolatedValue = prevValue + (targetValue - prevValue) * 0.3
+        waveform.push(interpolatedValue)
+        prevValue = interpolatedValue
+      }
+
+      const maxAmplitude = Math.max(...waveform)
+      const randomWaveform = waveform.map(amp => amp / maxAmplitude)
+
+      setWaveformData(randomWaveform)
+      setIsAudioAvailable(true)
+    }
+    finally {
+      await audioContext.close()
+    }
+  }
+
+  const togglePlay = useCallback(() => {
+    const audio = audioRef.current
+    if (audio && isAudioAvailable) {
+      if (isPlaying) {
+        setHasStartedPlaying(false)
+        audio.pause()
+      }
+      else {
+        setHasStartedPlaying(true)
+        audio.play().catch(error => console.error('Error playing audio:', error))
+      }
+
+      setIsPlaying(!isPlaying)
+    }
+    else {
+      Toast.notify({
+        type: 'error',
+        message: 'Audio element not found',
+      })
+      setIsAudioAvailable(false)
+    }
+  }, [isAudioAvailable, isPlaying])
+
+  const handleCanvasInteraction = useCallback((e: React.MouseEvent | React.TouchEvent) => {
+    e.preventDefault()
+
+    const getClientX = (event: React.MouseEvent | React.TouchEvent): number => {
+      if ('touches' in event)
+        return event.touches[0].clientX
+      return event.clientX
+    }
+
+    const updateProgress = (clientX: number) => {
+      const canvas = canvasRef.current
+      const audio = audioRef.current
+      if (!canvas || !audio)
+        return
+
+      const rect = canvas.getBoundingClientRect()
+      const percent = Math.min(Math.max(0, clientX - rect.left), rect.width) / rect.width
+      const newTime = percent * duration
+
+      // Removes the buffer check, allowing drag to any location
+      audio.currentTime = newTime
+      setCurrentTime(newTime)
+
+      if (!isPlaying) {
+        setIsPlaying(true)
+        audio.play().catch((error) => {
+          Toast.notify({
+            type: 'error',
+            message: `Error playing audio: ${error}`,
+          })
+          setIsPlaying(false)
+        })
+      }
+    }
+
+    updateProgress(getClientX(e))
+  }, [duration, isPlaying])
+
+  const formatTime = (time: number) => {
+    const minutes = Math.floor(time / 60)
+    const seconds = Math.floor(time % 60)
+    return `${minutes}:${seconds.toString().padStart(2, '0')}`
+  }
+
+  const drawWaveform = useCallback(() => {
+    const canvas = canvasRef.current
+    if (!canvas)
+      return
+
+    const ctx = canvas.getContext('2d')
+    if (!ctx)
+      return
+
+    const width = canvas.width
+    const height = canvas.height
+    const data = waveformData
+
+    ctx.clearRect(0, 0, width, height)
+
+    const barWidth = width / data.length
+    const playedWidth = (currentTime / duration) * width
+    const cornerRadius = 2
+
+    // Draw waveform bars
+    data.forEach((value, index) => {
+      let color
+
+      if (index * barWidth <= playedWidth)
+        color = theme === Theme.light ? '#296DFF' : '#84ABFF'
+      else if ((index * barWidth / width) * duration <= hoverTime)
+        color = theme === Theme.light ? 'rgba(21,90,239,.40)' : 'rgba(200, 206, 218, 0.28)'
+      else
+        color = theme === Theme.light ? 'rgba(21,90,239,.20)' : 'rgba(200, 206, 218, 0.14)'
+
+      const barHeight = value * height
+      const rectX = index * barWidth
+      const rectY = (height - barHeight) / 2
+      const rectWidth = barWidth * 0.5
+      const rectHeight = barHeight
+
+      ctx.lineWidth = 1
+      ctx.fillStyle = color
+      if (ctx.roundRect) {
+        ctx.beginPath()
+        ctx.roundRect(rectX, rectY, rectWidth, rectHeight, cornerRadius)
+        ctx.fill()
+      }
+      else {
+        ctx.fillRect(rectX, rectY, rectWidth, rectHeight)
+      }
+    })
+  }, [currentTime, duration, hoverTime, theme, waveformData])
+
+  useEffect(() => {
+    drawWaveform()
+  }, [drawWaveform, bufferedTime, hasStartedPlaying])
+
+  const handleMouseMove = useCallback((e: React.MouseEvent) => {
+    const canvas = canvasRef.current
+    const audio = audioRef.current
+    if (!canvas || !audio)
+      return
+
+    const rect = canvas.getBoundingClientRect()
+    const percent = Math.min(Math.max(0, e.clientX - rect.left), rect.width) / rect.width
+    const time = percent * duration
+
+    // Check if the hovered position is within a buffered range before updating hoverTime
+    for (let i = 0; i < audio.buffered.length; i++) {
+      if (time >= audio.buffered.start(i) && time <= audio.buffered.end(i)) {
+        setHoverTime(time)
+        break
+      }
+    }
+  }, [duration])
+
+  return (
+    <div className='flex h-9 min-w-[240px] max-w-[420px] items-end gap-2 rounded-[10px] border border-components-panel-border-subtle bg-components-chat-input-audio-bg-alt p-2 shadow-xs backdrop-blur-sm'>
+      <audio ref={audioRef} src={src} preload="auto"/>
+      <button className='inline-flex shrink-0 cursor-pointer items-center justify-center border-none text-text-accent transition-all hover:text-text-accent-secondary disabled:text-components-button-primary-bg-disabled' onClick={togglePlay} disabled={!isAudioAvailable}>
+        {isPlaying
+          ? (
+            <RiPauseCircleFill className='h-5 w-5' />
+          )
+          : (
+            <RiPlayLargeFill className='h-5 w-5' />
+          )}
+      </button>
+      <div className={cn(isAudioAvailable && 'grow')} hidden={!isAudioAvailable}>
+        <div className='flex h-8 items-center justify-center'>
+          <canvas
+            ref={canvasRef}
+            className='relative flex h-6 w-full grow cursor-pointer items-center justify-center'
+            onClick={handleCanvasInteraction}
+            onMouseMove={handleMouseMove}
+            onMouseDown={handleCanvasInteraction}
+          />
+          <div className='system-xs-medium inline-flex min-w-[50px] items-center justify-center text-text-accent-secondary'>
+            <span className='rounded-[10px] px-0.5 py-1'>{formatTime(duration)}</span>
+          </div>
+        </div>
+      </div>
+      <div className='absolute left-0 top-0 flex h-full w-full items-center justify-center text-text-quaternary' hidden={isAudioAvailable}>{t('common.operation.audioSourceUnavailable')}</div>
+    </div>
+  )
+}
+
+export default AudioPlayer
diff --git a/app/components/base/audio-gallery/index.tsx b/app/components/base/audio-gallery/index.tsx
new file mode 100644
index 0000000..6e11d43
--- /dev/null
+++ b/app/components/base/audio-gallery/index.tsx
@@ -0,0 +1,12 @@
+import React from 'react'
+import AudioPlayer from './AudioPlayer'
+
+type Props = {
+  srcs: string[]
+}
+
+const AudioGallery: React.FC<Props> = ({ srcs }) => {
+  return (<><br/>{srcs.map((src, index) => (<AudioPlayer key={`audio_${index}`} src={src}/>))}</>)
+}
+
+export default React.memo(AudioGallery)
diff --git a/app/components/base/auto-height-textarea/common.tsx b/app/components/base/auto-height-textarea/common.tsx
new file mode 100644
index 0000000..841bfdd
--- /dev/null
+++ b/app/components/base/auto-height-textarea/common.tsx
@@ -0,0 +1,54 @@
+import { useEffect, useRef } from 'react'
+import cn from '@/utils/classnames'
+
+type AutoHeightTextareaProps =
+  & React.DetailedHTMLProps<React.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>
+  & { outerClassName?: string }
+
+const AutoHeightTextarea = (
+  {
+    ref: outRef,
+    outerClassName,
+    value,
+    className,
+    placeholder,
+    autoFocus,
+    disabled,
+    ...rest
+  }: AutoHeightTextareaProps & {
+    ref: React.RefObject<HTMLTextAreaElement>;
+  },
+) => {
+  const innerRef = useRef<HTMLTextAreaElement>(null)
+  const ref = outRef || innerRef
+
+  useEffect(() => {
+    if (autoFocus && !disabled && value) {
+      if (typeof ref !== 'function') {
+        ref.current?.setSelectionRange(`${value}`.length, `${value}`.length)
+        ref.current?.focus()
+      }
+    }
+  }, [autoFocus, disabled, ref])
+  return (
+    (<div className={outerClassName}>
+      <div className='relative'>
+        <div className={cn(className, 'invisible whitespace-pre-wrap break-all')}>
+          {!value ? placeholder : `${value}`.replace(/\n$/, '\n ')}
+        </div>
+        <textarea
+          ref={ref}
+          placeholder={placeholder}
+          className={cn(className, 'absolute inset-0 h-full w-full resize-none appearance-none border-none outline-none disabled:bg-transparent')}
+          value={value}
+          disabled={disabled}
+          {...rest}
+        />
+      </div>
+    </div>)
+  )
+}
+
+AutoHeightTextarea.displayName = 'AutoHeightTextarea'
+
+export default AutoHeightTextarea
diff --git a/app/components/base/auto-height-textarea/index.tsx b/app/components/base/auto-height-textarea/index.tsx
new file mode 100644
index 0000000..da412a1
--- /dev/null
+++ b/app/components/base/auto-height-textarea/index.tsx
@@ -0,0 +1,96 @@
+import { useEffect, useRef } from 'react'
+import cn from '@/utils/classnames'
+import { sleep } from '@/utils'
+
+type IProps = {
+  placeholder?: string
+  value: string
+  onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void
+  className?: string
+  wrapperClassName?: string
+  minHeight?: number
+  maxHeight?: number
+  autoFocus?: boolean
+  controlFocus?: number
+  onKeyDown?: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void
+  onKeyUp?: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void
+}
+
+const AutoHeightTextarea = (
+  {
+    ref: outerRef,
+    value,
+    onChange,
+    placeholder,
+    className,
+    wrapperClassName,
+    minHeight = 36,
+    maxHeight = 96,
+    autoFocus,
+    controlFocus,
+    onKeyDown,
+    onKeyUp,
+  }: IProps & {
+    ref: React.RefObject<unknown>;
+  },
+) => {
+  // eslint-disable-next-line react-hooks/rules-of-hooks
+  const ref = outerRef || useRef<HTMLTextAreaElement>(null)
+
+  const doFocus = () => {
+    if (ref.current) {
+      ref.current.setSelectionRange(value.length, value.length)
+      ref.current.focus()
+      return true
+    }
+    return false
+  }
+
+  const focus = async () => {
+    if (!doFocus()) {
+      let hasFocus = false
+      await sleep(100)
+      hasFocus = doFocus()
+      if (!hasFocus)
+        focus()
+    }
+  }
+
+  useEffect(() => {
+    if (autoFocus)
+      focus()
+  }, [])
+  useEffect(() => {
+    if (controlFocus)
+      focus()
+  }, [controlFocus])
+
+  return (
+    (<div className={`relative ${wrapperClassName}`}>
+      <div className={cn(className, 'invisible overflow-y-auto whitespace-pre-wrap  break-all')} style={{
+        minHeight,
+        maxHeight,
+        paddingRight: (value && value.trim().length > 10000) ? 140 : 130,
+      }}>
+        {!value ? placeholder : value.replace(/\n$/, '\n ')}
+      </div>
+      <textarea
+        ref={ref}
+        autoFocus={autoFocus}
+        className={cn(className, 'absolute inset-0 resize-none overflow-auto')}
+        style={{
+          paddingRight: (value && value.trim().length > 10000) ? 140 : 130,
+        }}
+        placeholder={placeholder}
+        onChange={onChange}
+        onKeyDown={onKeyDown}
+        onKeyUp={onKeyUp}
+        value={value}
+      />
+    </div>)
+  )
+}
+
+AutoHeightTextarea.displayName = 'AutoHeightTextarea'
+
+export default AutoHeightTextarea
diff --git a/app/components/base/auto-height-textarea/style.module.scss b/app/components/base/auto-height-textarea/style.module.scss
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/components/base/auto-height-textarea/style.module.scss
diff --git a/app/components/base/avatar/index.tsx b/app/components/base/avatar/index.tsx
new file mode 100644
index 0000000..2a08f75
--- /dev/null
+++ b/app/components/base/avatar/index.tsx
@@ -0,0 +1,54 @@
+'use client'
+import { useState } from 'react'
+import cn from '@/utils/classnames'
+
+export type AvatarProps = {
+  name: string
+  avatar: string | null
+  size?: number
+  className?: string
+  textClassName?: string
+}
+const Avatar = ({
+  name,
+  avatar,
+  size = 30,
+  className,
+  textClassName,
+}: AvatarProps) => {
+  const avatarClassName = 'shrink-0 flex items-center rounded-full bg-primary-600'
+  const style = { width: `${size}px`, height: `${size}px`, fontSize: `${size}px`, lineHeight: `${size}px` }
+  const [imgError, setImgError] = useState(false)
+
+  const handleError = () => {
+    setImgError(true)
+  }
+
+  if (avatar && !imgError) {
+    return (
+      <img
+        className={cn(avatarClassName, className)}
+        style={style}
+        alt={name}
+        src={avatar}
+        onError={handleError}
+      />
+    )
+  }
+
+  return (
+    <div
+      className={cn(avatarClassName, className)}
+      style={style}
+    >
+      <div
+        className={cn(textClassName, 'scale-[0.4] text-center text-white')}
+        style={style}
+      >
+        {name[0].toLocaleUpperCase()}
+      </div>
+    </div>
+  )
+}
+
+export default Avatar
diff --git a/app/components/base/badge.tsx b/app/components/base/badge.tsx
new file mode 100644
index 0000000..0362d8d
--- /dev/null
+++ b/app/components/base/badge.tsx
@@ -0,0 +1,37 @@
+import type { ReactNode } from 'react'
+import { memo } from 'react'
+import cn from '@/utils/classnames'
+
+type BadgeProps = {
+  className?: string
+  text?: ReactNode
+  children?: ReactNode
+  uppercase?: boolean
+  hasRedCornerMark?: boolean
+}
+
+const Badge = ({
+  className,
+  text,
+  children,
+  uppercase = true,
+  hasRedCornerMark,
+}: BadgeProps) => {
+  return (
+    <div
+      className={cn(
+        'relative inline-flex h-5 items-center rounded-[5px] border border-divider-deep px-[5px] leading-3 text-text-tertiary',
+        uppercase ? 'system-2xs-medium-uppercase' : 'system-xs-medium',
+        className,
+      )}
+    >
+      {hasRedCornerMark && (
+        <div className='absolute right-[-2px] top-[-2px] h-1.5 w-1.5 rounded-[2px] border border-components-badge-status-light-error-border-inner bg-components-badge-status-light-error-bg shadow-sm'>
+        </div>
+      )}
+      {children || text}
+    </div>
+  )
+}
+
+export default memo(Badge)
diff --git a/app/components/base/badge/index.css b/app/components/base/badge/index.css
new file mode 100644
index 0000000..24c62cd
--- /dev/null
+++ b/app/components/base/badge/index.css
@@ -0,0 +1,28 @@
+@tailwind components;
+
+@layer components {
+    .badge {
+        @apply inline-flex justify-center items-center text-text-tertiary border border-divider-deep
+    }
+
+    .badge-l {
+        @apply rounded-md gap-1 min-w-6
+    }
+
+    /* m is for the regular button */
+    .badge-m {
+        @apply rounded-md gap-[3px] min-w-5
+    }
+
+    .badge-s {
+        @apply rounded-[5px] gap-0.5 min-w-[18px]
+    }
+
+    .badge.badge-warning {
+        @apply text-text-warning border border-text-warning
+    }
+
+    .badge.badge-accent {
+        @apply text-text-accent-secondary border border-text-accent-secondary
+    }
+}
diff --git a/app/components/base/badge/index.tsx b/app/components/base/badge/index.tsx
new file mode 100644
index 0000000..88ba026
--- /dev/null
+++ b/app/components/base/badge/index.tsx
@@ -0,0 +1,81 @@
+import type { CSSProperties, ReactNode } from 'react'
+import React from 'react'
+import { type VariantProps, cva } from 'class-variance-authority'
+import classNames from '@/utils/classnames'
+import './index.css'
+
+enum BadgeState {
+  Warning = 'warning',
+  Accent = 'accent',
+  Default = '',
+}
+
+const BadgeVariants = cva(
+  'badge',
+  {
+    variants: {
+      size: {
+        s: 'badge-s',
+        m: 'badge-m',
+        l: 'badge-l',
+      },
+    },
+    defaultVariants: {
+      size: 'm',
+    },
+  },
+)
+
+type BadgeProps = {
+  size?: 's' | 'm' | 'l'
+  iconOnly?: boolean
+  uppercase?: boolean
+  state?: BadgeState
+  styleCss?: CSSProperties
+  children?: ReactNode
+} & React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof BadgeVariants>
+
+function getBadgeState(state: BadgeState) {
+  switch (state) {
+    case BadgeState.Warning:
+      return 'badge-warning'
+    case BadgeState.Accent:
+      return 'badge-accent'
+    default:
+      return ''
+  }
+}
+
+const Badge: React.FC<BadgeProps> = ({
+  className,
+  size,
+  state = BadgeState.Default,
+  iconOnly = false,
+  uppercase = false,
+  styleCss,
+  children,
+  ...props
+}) => {
+  return (
+    <div
+      className={classNames(
+        BadgeVariants({ size, className }),
+        getBadgeState(state),
+        size === 's'
+          ? (iconOnly ? 'p-[3px]' : 'px-[5px] py-[3px]')
+          : size === 'l'
+            ? (iconOnly ? 'p-1.5' : 'px-2 py-1')
+            : (iconOnly ? 'p-1' : 'px-[5px] py-[2px]'),
+        uppercase ? 'system-2xs-medium-uppercase' : 'system-2xs-medium',
+      )}
+      style={styleCss}
+      {...props}
+    >
+      {children}
+    </div>
+  )
+}
+Badge.displayName = 'Badge'
+
+export default Badge
+export { Badge, BadgeState, BadgeVariants }
diff --git a/app/components/base/block-input/index.tsx b/app/components/base/block-input/index.tsx
new file mode 100644
index 0000000..9b26b52
--- /dev/null
+++ b/app/components/base/block-input/index.tsx
@@ -0,0 +1,146 @@
+'use client'
+
+import type { ChangeEvent, FC } from 'react'
+import React, { useCallback, useEffect, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { varHighlightHTML } from '../../app/configuration/base/var-highlight'
+import Toast from '../toast'
+import classNames from '@/utils/classnames'
+import { checkKeys } from '@/utils/var'
+
+// regex to match the {{}} and replace it with a span
+const regex = /\{\{([^}]+)\}\}/g
+
+export const getInputKeys = (value: string) => {
+  const keys = value.match(regex)?.map((item) => {
+    return item.replace('{{', '').replace('}}', '')
+  }) || []
+  const keyObj: Record<string, boolean> = {}
+  // remove duplicate keys
+  const res: string[] = []
+  keys.forEach((key) => {
+    if (keyObj[key])
+      return
+
+    keyObj[key] = true
+    res.push(key)
+  })
+  return res
+}
+
+export type IBlockInputProps = {
+  value: string
+  className?: string // wrapper class
+  highLightClassName?: string // class for the highlighted text default is text-blue-500
+  readonly?: boolean
+  onConfirm?: (value: string, keys: string[]) => void
+}
+
+const BlockInput: FC<IBlockInputProps> = ({
+  value = '',
+  className,
+  readonly = false,
+  onConfirm,
+}) => {
+  const { t } = useTranslation()
+  // current is used to store the current value of the contentEditable element
+  const [currentValue, setCurrentValue] = useState<string>(value)
+  useEffect(() => {
+    setCurrentValue(value)
+  }, [value])
+
+  const contentEditableRef = useRef<HTMLTextAreaElement>(null)
+  const [isEditing, setIsEditing] = useState<boolean>(false)
+  useEffect(() => {
+    if (isEditing && contentEditableRef.current) {
+      // TODO: Focus at the click position
+      if (currentValue)
+        contentEditableRef.current.setSelectionRange(currentValue.length, currentValue.length)
+
+      contentEditableRef.current.focus()
+    }
+  }, [isEditing])
+
+  const style = classNames({
+    'block px-4 py-2 w-full h-full text-sm text-gray-900 outline-0 border-0 break-all': true,
+    'block-input--editing': isEditing,
+  })
+
+  const coloredContent = (currentValue || '')
+    .replace(/</g, '&lt;')
+    .replace(/>/g, '&gt;')
+    .replace(regex, varHighlightHTML({ name: '$1' })) // `<span class="${highLightClassName}">{{$1}}</span>`
+    .replace(/\n/g, '<br />')
+
+  // Not use useCallback. That will cause out callback get old data.
+  const handleSubmit = (value: string) => {
+    if (onConfirm) {
+      const keys = getInputKeys(value)
+      const { isValid, errorKey, errorMessageKey } = checkKeys(keys)
+      if (!isValid) {
+        Toast.notify({
+          type: 'error',
+          message: t(`appDebug.varKeyError.${errorMessageKey}`, { key: errorKey }),
+        })
+        return
+      }
+      onConfirm(value, keys)
+    }
+  }
+
+  const onValueChange = useCallback((e: ChangeEvent<HTMLTextAreaElement>) => {
+    const value = e.target.value
+    setCurrentValue(value)
+    handleSubmit(value)
+  }, [])
+
+  // Prevent rerendering caused cursor to jump to the start of the contentEditable element
+  const TextAreaContentView = () => {
+    return <div
+      className={classNames(style, className)}
+      dangerouslySetInnerHTML={{ __html: coloredContent }}
+      suppressContentEditableWarning={true}
+    />
+  }
+
+  const placeholder = ''
+  const editAreaClassName = 'focus:outline-none bg-transparent text-sm'
+
+  const textAreaContent = (
+    <div className={classNames(readonly ? 'max-h-[180px] pb-5' : 'h-[180px]', ' overflow-y-auto')} onClick={() => !readonly && setIsEditing(true)}>
+      {isEditing
+        ? <div className='h-full px-4 py-2'>
+          <textarea
+            ref={contentEditableRef}
+            className={classNames(editAreaClassName, 'block w-full h-full resize-none')}
+            placeholder={placeholder}
+            onChange={onValueChange}
+            value={currentValue}
+            onBlur={() => {
+              blur()
+              setIsEditing(false)
+              // click confirm also make blur. Then outer value is change. So below code has problem.
+              // setTimeout(() => {
+              //   handleCancel()
+              // }, 1000)
+            }}
+          />
+        </div>
+        : <TextAreaContentView />}
+    </div>)
+
+  return (
+    <div className={classNames('block-input w-full overflow-y-auto bg-white border-none rounded-xl')}>
+      {textAreaContent}
+      {/* footer */}
+      {!readonly && (
+        <div className='flex pb-2 pl-4'>
+          <div className="h-[18px] rounded-md bg-gray-100 px-1 text-xs leading-[18px] text-gray-500">{currentValue?.length}</div>
+        </div>
+      )}
+
+    </div>
+  )
+}
+
+export default React.memo(BlockInput)
diff --git a/app/components/base/button/add-button.tsx b/app/components/base/button/add-button.tsx
new file mode 100644
index 0000000..420b668
--- /dev/null
+++ b/app/components/base/button/add-button.tsx
@@ -0,0 +1,22 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { RiAddLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+
+type Props = {
+  className?: string
+  onClick: () => void
+}
+
+const AddButton: FC<Props> = ({
+  className,
+  onClick,
+}) => {
+  return (
+    <div className={cn(className, 'cursor-pointer select-none rounded-md p-1 hover:bg-state-base-hover')} onClick={onClick}>
+      <RiAddLine className='h-4 w-4 text-text-tertiary' />
+    </div>
+  )
+}
+export default React.memo(AddButton)
diff --git a/app/components/base/button/index.css b/app/components/base/button/index.css
new file mode 100644
index 0000000..47e5914
--- /dev/null
+++ b/app/components/base/button/index.css
@@ -0,0 +1,186 @@
+@tailwind components;
+
+@layer components {
+  .btn {
+    @apply inline-flex justify-center items-center cursor-pointer whitespace-nowrap;
+  }
+
+  .btn-disabled {
+    @apply cursor-not-allowed;
+  }
+
+  .btn-small {
+    @apply px-2 h-6 rounded-md text-xs font-medium;
+  }
+
+  .btn-medium {
+    @apply px-3.5 h-8 rounded-lg text-[13px] leading-4 font-medium;
+  }
+
+  .btn-large {
+    @apply px-4 h-9 rounded-[10px] text-sm font-semibold;
+  }
+
+  .btn-primary {
+    @apply
+    shadow
+    bg-components-button-primary-bg
+    border-components-button-primary-border
+    hover:bg-components-button-primary-bg-hover
+    hover:border-components-button-primary-border-hover
+    text-components-button-primary-text;
+  }
+
+  .btn-primary.btn-destructive {
+    @apply
+    bg-components-button-destructive-primary-bg
+    border-components-button-destructive-primary-border
+    hover:bg-components-button-destructive-primary-bg-hover
+    hover:border-components-button-destructive-primary-border-hover
+    text-components-button-destructive-primary-text;
+  }
+
+  .btn-primary.btn-disabled {
+    @apply
+    shadow-none
+    bg-components-button-primary-bg-disabled
+    border-components-button-primary-border-disabled
+    text-components-button-primary-text-disabled;
+  }
+
+  .btn-primary.btn-destructive.btn-disabled {
+    @apply
+    shadow-none
+    bg-components-button-destructive-primary-bg-disabled
+    border-components-button-destructive-primary-border-disabled
+    text-components-button-destructive-primary-text-disabled;
+  }
+
+  .btn-secondary {
+    @apply
+    border-[0.5px]
+    shadow-xs
+    bg-components-button-secondary-bg
+    border-components-button-secondary-border
+    hover:bg-components-button-secondary-bg-hover
+    hover:border-components-button-secondary-border-hover
+    text-components-button-secondary-text;
+  }
+
+  .btn-secondary.btn-disabled {
+    @apply
+    bg-components-button-secondary-bg-disabled
+    border-components-button-secondary-border-disabled
+    text-components-button-secondary-text-disabled;
+  }
+
+  .btn-secondary.btn-destructive {
+    @apply
+    bg-components-button-destructive-secondary-bg
+    border-components-button-destructive-secondary-border
+    hover:bg-components-button-destructive-secondary-bg-hover
+    hover:border-components-button-destructive-secondary-border-hover
+    text-components-button-destructive-secondary-text;
+  }
+
+  .btn-secondary.btn-destructive.btn-disabled {
+    @apply
+    bg-components-button-destructive-secondary-bg-disabled
+    border-components-button-destructive-secondary-border-disabled
+    text-components-button-destructive-secondary-text-disabled;
+  }
+
+
+  .btn-secondary-accent {
+    @apply
+    border-[0.5px]
+    shadow-xs
+    bg-components-button-secondary-bg
+    border-components-button-secondary-border
+    hover:bg-components-button-secondary-bg-hover
+    hover:border-components-button-secondary-border-hover
+    text-components-button-secondary-accent-text;
+  }
+
+  .btn-secondary-accent.btn-disabled {
+    @apply
+    bg-components-button-secondary-bg-disabled
+    border-components-button-secondary-border-disabled
+    text-components-button-secondary-accent-text-disabled;
+  }
+
+  .btn-warning {
+    @apply
+    bg-components-button-destructive-primary-bg
+    border-components-button-destructive-primary-border
+    hover:bg-components-button-destructive-primary-bg-hover
+    hover:border-components-button-destructive-primary-border-hover
+    text-components-button-destructive-primary-text;
+  }
+
+  .btn-warning.btn-disabled {
+    @apply
+    bg-components-button-destructive-primary-bg-disabled
+    border-components-button-destructive-primary-border-disabled
+    text-components-button-destructive-primary-text-disabled;
+  }
+
+  .btn-tertiary {
+    @apply
+    bg-components-button-tertiary-bg
+    hover:bg-components-button-tertiary-bg-hover
+    text-components-button-tertiary-text;
+  }
+
+  .btn-tertiary.btn-disabled {
+    @apply
+    bg-components-button-tertiary-bg-disabled
+    text-components-button-tertiary-text-disabled;
+  }
+
+  .btn-tertiary.btn-destructive {
+    @apply
+    bg-components-button-destructive-tertiary-bg
+    hover:bg-components-button-destructive-tertiary-bg-hover
+    text-components-button-destructive-tertiary-text;
+  }
+
+  .btn-tertiary.btn-destructive.btn-disabled {
+    @apply
+    bg-components-button-destructive-tertiary-bg-disabled
+    text-components-button-destructive-tertiary-text-disabled;
+  }
+
+  .btn-ghost {
+    @apply
+    hover:bg-components-button-ghost-bg-hover
+    text-components-button-ghost-text;
+  }
+
+  .btn-ghost.btn-disabled {
+    @apply
+    text-components-button-ghost-text-disabled;
+  }
+
+  .btn-ghost.btn-destructive {
+    @apply
+    hover:bg-components-button-destructive-ghost-bg-hover
+    text-components-button-destructive-ghost-text;
+  }
+
+  .btn-ghost.btn-destructive.btn-disabled {
+    @apply
+    text-components-button-destructive-ghost-text-disabled;
+  }
+
+  .btn-ghost-accent {
+    @apply
+    hover:bg-state-accent-hover
+    text-components-button-secondary-accent-text;
+  }
+
+  .btn-ghost-accent.btn-disabled {
+    @apply
+    text-components-button-secondary-accent-text-disabled;
+  }
+}
diff --git a/app/components/base/button/index.spec.tsx b/app/components/base/button/index.spec.tsx
new file mode 100644
index 0000000..9da2620
--- /dev/null
+++ b/app/components/base/button/index.spec.tsx
@@ -0,0 +1,110 @@
+import React from 'react'
+import { cleanup, fireEvent, render } from '@testing-library/react'
+import Button from './index'
+
+afterEach(cleanup)
+// https://testing-library.com/docs/queries/about
+describe('Button', () => {
+  describe('Button text', () => {
+    test('Button text should be same as children', async () => {
+      const { getByRole, container } = render(<Button>Click me</Button>)
+      expect(getByRole('button').textContent).toBe('Click me')
+      expect(container.querySelector('button')?.textContent).toBe('Click me')
+    })
+  })
+
+  describe('Button loading', () => {
+    test('Loading button text should include same as children', async () => {
+      const { getByRole } = render(<Button loading>Click me</Button>)
+      expect(getByRole('button').textContent?.includes('Loading')).toBe(true)
+    })
+    test('Not loading button text should include same as children', async () => {
+      const { getByRole } = render(<Button loading={false}>Click me</Button>)
+      expect(getByRole('button').textContent?.includes('Loading')).toBe(false)
+    })
+
+    test('Loading button should have loading classname', async () => {
+      const animClassName = 'anim-breath'
+      const { getByRole } = render(<Button loading spinnerClassName={animClassName}>Click me</Button>)
+      expect(getByRole('button').getElementsByClassName('animate-spin')[0]?.className).toContain(animClassName)
+    })
+  })
+
+  describe('Button style', () => {
+    test('Button should have default variant', async () => {
+      const { getByRole } = render(<Button>Click me</Button>)
+      expect(getByRole('button').className).toContain('btn-secondary')
+    })
+
+    test('Button should have primary variant', async () => {
+      const { getByRole } = render(<Button variant='primary'>Click me</Button>)
+      expect(getByRole('button').className).toContain('btn-primary')
+    })
+
+    test('Button should have warning variant', async () => {
+      const { getByRole } = render(<Button variant='warning'>Click me</Button>)
+      expect(getByRole('button').className).toContain('btn-warning')
+    })
+
+    test('Button should have secondary variant', async () => {
+      const { getByRole } = render(<Button variant='secondary'>Click me</Button>)
+      expect(getByRole('button').className).toContain('btn-secondary')
+    })
+
+    test('Button should have secondary-accent variant', async () => {
+      const { getByRole } = render(<Button variant='secondary-accent'>Click me</Button>)
+      expect(getByRole('button').className).toContain('btn-secondary-accent')
+    })
+    test('Button should have ghost variant', async () => {
+      const { getByRole } = render(<Button variant='ghost'>Click me</Button>)
+      expect(getByRole('button').className).toContain('btn-ghost')
+    })
+    test('Button should have ghost-accent variant', async () => {
+      const { getByRole } = render(<Button variant='ghost-accent'>Click me</Button>)
+      expect(getByRole('button').className).toContain('btn-ghost-accent')
+    })
+
+    test('Button disabled should have disabled variant', async () => {
+      const { getByRole } = render(<Button disabled>Click me</Button>)
+      expect(getByRole('button').className).toContain('btn-disabled')
+    })
+  })
+
+  describe('Button size', () => {
+    test('Button should have default size', async () => {
+      const { getByRole } = render(<Button>Click me</Button>)
+      expect(getByRole('button').className).toContain('btn-medium')
+    })
+
+    test('Button should have small size', async () => {
+      const { getByRole } = render(<Button size='small'>Click me</Button>)
+      expect(getByRole('button').className).toContain('btn-small')
+    })
+
+    test('Button should have medium size', async () => {
+      const { getByRole } = render(<Button size='medium'>Click me</Button>)
+      expect(getByRole('button').className).toContain('btn-medium')
+    })
+
+    test('Button should have large size', async () => {
+      const { getByRole } = render(<Button size='large'>Click me</Button>)
+      expect(getByRole('button').className).toContain('btn-large')
+    })
+  })
+
+  describe('Button destructive', () => {
+    test('Button should have destructive classname', async () => {
+      const { getByRole } = render(<Button destructive>Click me</Button>)
+      expect(getByRole('button').className).toContain('btn-destructive')
+    })
+  })
+
+  describe('Button events', () => {
+    test('onClick should been call after clicked', async () => {
+      const onClick = jest.fn()
+      const { getByRole } = render(<Button onClick={onClick}>Click me</Button>)
+      fireEvent.click(getByRole('button'))
+      expect(onClick).toHaveBeenCalled()
+    })
+  })
+})
diff --git a/app/components/base/button/index.stories.tsx b/app/components/base/button/index.stories.tsx
new file mode 100644
index 0000000..c1b18f1
--- /dev/null
+++ b/app/components/base/button/index.stories.tsx
@@ -0,0 +1,107 @@
+import type { Meta, StoryObj } from '@storybook/react'
+import { fn } from '@storybook/test'
+
+import { RocketLaunchIcon } from '@heroicons/react/20/solid'
+import { Button } from '.'
+
+const meta = {
+  title: 'Base/Button',
+  component: Button,
+  parameters: {
+    layout: 'centered',
+  },
+  tags: ['autodocs'],
+  argTypes: {
+    loading: { control: 'boolean' },
+    variant: {
+      control: 'select',
+      options: ['primary', 'warning', 'secondary', 'secondary-accent', 'ghost', 'ghost-accent', 'tertiary'],
+    },
+  },
+  args: {
+    variant: 'ghost',
+    onClick: fn(),
+    children: 'adsf',
+  },
+} satisfies Meta<typeof Button>
+
+export default meta
+type Story = StoryObj<typeof meta>
+
+export const Default: Story = {
+  args: {
+    variant: 'primary',
+    loading: false,
+    children: 'Primary Button',
+  },
+}
+
+export const Secondary: Story = {
+  args: {
+    variant: 'secondary',
+    children: 'Secondary Button',
+  },
+}
+
+export const SecondaryAccent: Story = {
+  args: {
+    variant: 'secondary-accent',
+    children: 'Secondary Accent Button',
+  },
+}
+
+export const Ghost: Story = {
+  args: {
+    variant: 'ghost',
+    children: 'Ghost Button',
+  },
+}
+
+export const GhostAccent: Story = {
+  args: {
+    variant: 'ghost-accent',
+    children: 'Ghost Accent Button',
+  },
+}
+
+export const Tertiary: Story = {
+  args: {
+    variant: 'tertiary',
+    children: 'Tertiary Button',
+  },
+}
+
+export const Warning: Story = {
+  args: {
+    variant: 'warning',
+    children: 'Warning Button',
+  },
+}
+
+export const Disabled: Story = {
+  args: {
+    variant: 'primary',
+    disabled: true,
+    children: 'Disabled Button',
+  },
+}
+
+export const Loading: Story = {
+  args: {
+    variant: 'primary',
+    loading: true,
+    children: 'Loading Button',
+  },
+}
+
+export const WithIcon: Story = {
+  args: {
+    variant: 'primary',
+    children: (
+      <>
+        <RocketLaunchIcon className="mr-1.5 h-4 w-4 stroke-[1.8px]" />
+        Launch
+      </>
+    ),
+  },
+}
diff --git a/app/components/base/button/index.tsx b/app/components/base/button/index.tsx
new file mode 100644
index 0000000..b467c49
--- /dev/null
+++ b/app/components/base/button/index.tsx
@@ -0,0 +1,62 @@
+import type { CSSProperties } from 'react'
+import React from 'react'
+import { type VariantProps, cva } from 'class-variance-authority'
+import Spinner from '../spinner'
+import classNames from '@/utils/classnames'
+
+const buttonVariants = cva(
+  'btn disabled:btn-disabled',
+  {
+    variants: {
+      variant: {
+        'primary': 'btn-primary',
+        'warning': 'btn-warning',
+        'secondary': 'btn-secondary',
+        'secondary-accent': 'btn-secondary-accent',
+        'ghost': 'btn-ghost',
+        'ghost-accent': 'btn-ghost-accent',
+        'tertiary': 'btn-tertiary',
+      },
+      size: {
+        small: 'btn-small',
+        medium: 'btn-medium',
+        large: 'btn-large',
+      },
+    },
+    defaultVariants: {
+      variant: 'secondary',
+      size: 'medium',
+    },
+  },
+)
+
+export type ButtonProps = {
+  destructive?: boolean
+  loading?: boolean
+  styleCss?: CSSProperties
+  spinnerClassName?: string
+} & React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof buttonVariants>
+
+const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
+  ({ className, variant, size, destructive, loading, styleCss, children, spinnerClassName, ...props }, ref) => {
+    return (
+      <button
+        type='button'
+        className={classNames(
+          buttonVariants({ variant, size, className }),
+          destructive && 'btn-destructive',
+        )}
+        ref={ref}
+        style={styleCss}
+        {...props}
+      >
+        {children}
+        {loading && <Spinner loading={loading} className={classNames('!text-white !h-3 !w-3 !border-2 !ml-1', spinnerClassName)} />}
+      </button>
+    )
+  },
+)
+Button.displayName = 'Button'
+
+export default Button
+export { Button, buttonVariants }
diff --git a/app/components/base/chat/__tests__/__snapshots__/utils.spec.ts.snap b/app/components/base/chat/__tests__/__snapshots__/utils.spec.ts.snap
new file mode 100644
index 0000000..4ffcfa3
--- /dev/null
+++ b/app/components/base/chat/__tests__/__snapshots__/utils.spec.ts.snap
@@ -0,0 +1,2804 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`build chat item tree and get thread messages should get thread messages from tree6, using specified message as target 1`] = `
+[
+  {
+    "children": [
+      {
+        "agent_thoughts": [
+          {
+            "chain_id": null,
+            "created_at": 1726105791,
+            "files": [],
+            "id": "f9d7ff7c-3a3b-4d9a-a289-657817f4caff",
+            "message_id": "ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+            "observation": "",
+            "position": 1,
+            "thought": "Sure, I'll play! My number is 57. Your turn!",
+            "tool": "",
+            "tool_input": "",
+            "tool_labels": {},
+          },
+        ],
+        "children": [
+          {
+            "children": [
+              {
+                "agent_thoughts": [
+                  {
+                    "chain_id": null,
+                    "created_at": 1726105795,
+                    "files": [],
+                    "id": "f61a3fce-37ac-4f9d-9935-95f97e598dfe",
+                    "message_id": "73bbad14-d915-499d-87bf-0df14d40779d",
+                    "observation": "",
+                    "position": 1,
+                    "thought": "I choose 83. What's your next number?",
+                    "tool": "",
+                    "tool_input": "",
+                    "tool_labels": {},
+                  },
+                ],
+                "children": [
+                  {
+                    "children": [
+                      {
+                        "agent_thoughts": [
+                          {
+                            "chain_id": null,
+                            "created_at": 1726105799,
+                            "files": [],
+                            "id": "9730d587-9268-4683-9dd9-91a1cab9510b",
+                            "message_id": "4c5d0841-1206-463e-95d8-71f812877658",
+                            "observation": "",
+                            "position": 1,
+                            "thought": "I'll go with 112. Your turn!",
+                            "tool": "",
+                            "tool_input": "",
+                            "tool_labels": {},
+                          },
+                        ],
+                        "children": [],
+                        "content": "I'll go with 112. Your turn!",
+                        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                        "feedbackDisabled": false,
+                        "id": "4c5d0841-1206-463e-95d8-71f812877658",
+                        "input": {
+                          "inputs": {},
+                          "query": "99",
+                        },
+                        "isAnswer": true,
+                        "log": [
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "Sure, I'll play! My number is 57. Your turn!",
+                          },
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "58",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "I choose 83. What's your next number?",
+                          },
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "99",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "I'll go with 112. Your turn!",
+                          },
+                        ],
+                        "message_files": [],
+                        "more": {
+                          "latency": "1.49",
+                          "time": "09/11/2024 09:50 PM",
+                          "tokens": 86,
+                        },
+                        "parentMessageId": "question-4c5d0841-1206-463e-95d8-71f812877658",
+                        "siblingIndex": 0,
+                        "workflow_run_id": null,
+                      },
+                    ],
+                    "content": "99",
+                    "id": "question-4c5d0841-1206-463e-95d8-71f812877658",
+                    "isAnswer": false,
+                    "message_files": [],
+                    "parentMessageId": "73bbad14-d915-499d-87bf-0df14d40779d",
+                  },
+                ],
+                "content": "I choose 83. What's your next number?",
+                "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                "feedbackDisabled": false,
+                "id": "73bbad14-d915-499d-87bf-0df14d40779d",
+                "input": {
+                  "inputs": {},
+                  "query": "58",
+                },
+                "isAnswer": true,
+                "log": [
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "Sure, I'll play! My number is 57. Your turn!",
+                  },
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "58",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "I choose 83. What's your next number?",
+                  },
+                ],
+                "message_files": [],
+                "more": {
+                  "latency": "1.33",
+                  "time": "09/11/2024 09:49 PM",
+                  "tokens": 68,
+                },
+                "parentMessageId": "question-73bbad14-d915-499d-87bf-0df14d40779d",
+                "siblingIndex": 0,
+                "workflow_run_id": null,
+              },
+            ],
+            "content": "58",
+            "id": "question-73bbad14-d915-499d-87bf-0df14d40779d",
+            "isAnswer": false,
+            "message_files": [],
+            "parentMessageId": "ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+          },
+        ],
+        "content": "Sure, I'll play! My number is 57. Your turn!",
+        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+        "feedbackDisabled": false,
+        "id": "ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+        "input": {
+          "inputs": {},
+          "query": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+        },
+        "isAnswer": true,
+        "log": [
+          {
+            "files": [],
+            "role": "user",
+            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "Sure, I'll play! My number is 57. Your turn!",
+          },
+        ],
+        "message_files": [],
+        "more": {
+          "latency": "1.56",
+          "time": "09/11/2024 09:49 PM",
+          "tokens": 49,
+        },
+        "parentMessageId": "question-ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+        "siblingIndex": 0,
+        "workflow_run_id": null,
+      },
+    ],
+    "content": "Let's play a game, I say a number , and you response me with another bigger, yet random-looking number. I'll start first, 38",
+    "id": "question-ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+    "isAnswer": false,
+    "message_files": [],
+  },
+  {
+    "agent_thoughts": [
+      {
+        "chain_id": null,
+        "created_at": 1726105791,
+        "files": [],
+        "id": "f9d7ff7c-3a3b-4d9a-a289-657817f4caff",
+        "message_id": "ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+        "observation": "",
+        "position": 1,
+        "thought": "Sure, I'll play! My number is 57. Your turn!",
+        "tool": "",
+        "tool_input": "",
+        "tool_labels": {},
+      },
+    ],
+    "children": [
+      {
+        "children": [
+          {
+            "agent_thoughts": [
+              {
+                "chain_id": null,
+                "created_at": 1726105795,
+                "files": [],
+                "id": "f61a3fce-37ac-4f9d-9935-95f97e598dfe",
+                "message_id": "73bbad14-d915-499d-87bf-0df14d40779d",
+                "observation": "",
+                "position": 1,
+                "thought": "I choose 83. What's your next number?",
+                "tool": "",
+                "tool_input": "",
+                "tool_labels": {},
+              },
+            ],
+            "children": [
+              {
+                "children": [
+                  {
+                    "agent_thoughts": [
+                      {
+                        "chain_id": null,
+                        "created_at": 1726105799,
+                        "files": [],
+                        "id": "9730d587-9268-4683-9dd9-91a1cab9510b",
+                        "message_id": "4c5d0841-1206-463e-95d8-71f812877658",
+                        "observation": "",
+                        "position": 1,
+                        "thought": "I'll go with 112. Your turn!",
+                        "tool": "",
+                        "tool_input": "",
+                        "tool_labels": {},
+                      },
+                    ],
+                    "children": [],
+                    "content": "I'll go with 112. Your turn!",
+                    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                    "feedbackDisabled": false,
+                    "id": "4c5d0841-1206-463e-95d8-71f812877658",
+                    "input": {
+                      "inputs": {},
+                      "query": "99",
+                    },
+                    "isAnswer": true,
+                    "log": [
+                      {
+                        "files": [],
+                        "role": "user",
+                        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                      },
+                      {
+                        "files": [],
+                        "role": "assistant",
+                        "text": "Sure, I'll play! My number is 57. Your turn!",
+                      },
+                      {
+                        "files": [],
+                        "role": "user",
+                        "text": "58",
+                      },
+                      {
+                        "files": [],
+                        "role": "assistant",
+                        "text": "I choose 83. What's your next number?",
+                      },
+                      {
+                        "files": [],
+                        "role": "user",
+                        "text": "99",
+                      },
+                      {
+                        "files": [],
+                        "role": "assistant",
+                        "text": "I'll go with 112. Your turn!",
+                      },
+                    ],
+                    "message_files": [],
+                    "more": {
+                      "latency": "1.49",
+                      "time": "09/11/2024 09:50 PM",
+                      "tokens": 86,
+                    },
+                    "parentMessageId": "question-4c5d0841-1206-463e-95d8-71f812877658",
+                    "siblingIndex": 0,
+                    "workflow_run_id": null,
+                  },
+                ],
+                "content": "99",
+                "id": "question-4c5d0841-1206-463e-95d8-71f812877658",
+                "isAnswer": false,
+                "message_files": [],
+                "parentMessageId": "73bbad14-d915-499d-87bf-0df14d40779d",
+              },
+            ],
+            "content": "I choose 83. What's your next number?",
+            "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+            "feedbackDisabled": false,
+            "id": "73bbad14-d915-499d-87bf-0df14d40779d",
+            "input": {
+              "inputs": {},
+              "query": "58",
+            },
+            "isAnswer": true,
+            "log": [
+              {
+                "files": [],
+                "role": "user",
+                "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+              },
+              {
+                "files": [],
+                "role": "assistant",
+                "text": "Sure, I'll play! My number is 57. Your turn!",
+              },
+              {
+                "files": [],
+                "role": "user",
+                "text": "58",
+              },
+              {
+                "files": [],
+                "role": "assistant",
+                "text": "I choose 83. What's your next number?",
+              },
+            ],
+            "message_files": [],
+            "more": {
+              "latency": "1.33",
+              "time": "09/11/2024 09:49 PM",
+              "tokens": 68,
+            },
+            "parentMessageId": "question-73bbad14-d915-499d-87bf-0df14d40779d",
+            "siblingIndex": 0,
+            "workflow_run_id": null,
+          },
+        ],
+        "content": "58",
+        "id": "question-73bbad14-d915-499d-87bf-0df14d40779d",
+        "isAnswer": false,
+        "message_files": [],
+        "parentMessageId": "ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+      },
+    ],
+    "content": "Sure, I'll play! My number is 57. Your turn!",
+    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+    "feedbackDisabled": false,
+    "id": "ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+    "input": {
+      "inputs": {},
+      "query": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+    },
+    "isAnswer": true,
+    "log": [
+      {
+        "files": [],
+        "role": "user",
+        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+      },
+      {
+        "files": [],
+        "role": "assistant",
+        "text": "Sure, I'll play! My number is 57. Your turn!",
+      },
+    ],
+    "message_files": [],
+    "more": {
+      "latency": "1.56",
+      "time": "09/11/2024 09:49 PM",
+      "tokens": 49,
+    },
+    "nextSibling": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+    "parentMessageId": "question-ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+    "prevSibling": undefined,
+    "siblingCount": 2,
+    "siblingIndex": 0,
+    "workflow_run_id": null,
+  },
+  {
+    "children": [
+      {
+        "agent_thoughts": [
+          {
+            "chain_id": null,
+            "created_at": 1726105795,
+            "files": [],
+            "id": "f61a3fce-37ac-4f9d-9935-95f97e598dfe",
+            "message_id": "73bbad14-d915-499d-87bf-0df14d40779d",
+            "observation": "",
+            "position": 1,
+            "thought": "I choose 83. What's your next number?",
+            "tool": "",
+            "tool_input": "",
+            "tool_labels": {},
+          },
+        ],
+        "children": [
+          {
+            "children": [
+              {
+                "agent_thoughts": [
+                  {
+                    "chain_id": null,
+                    "created_at": 1726105799,
+                    "files": [],
+                    "id": "9730d587-9268-4683-9dd9-91a1cab9510b",
+                    "message_id": "4c5d0841-1206-463e-95d8-71f812877658",
+                    "observation": "",
+                    "position": 1,
+                    "thought": "I'll go with 112. Your turn!",
+                    "tool": "",
+                    "tool_input": "",
+                    "tool_labels": {},
+                  },
+                ],
+                "children": [],
+                "content": "I'll go with 112. Your turn!",
+                "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                "feedbackDisabled": false,
+                "id": "4c5d0841-1206-463e-95d8-71f812877658",
+                "input": {
+                  "inputs": {},
+                  "query": "99",
+                },
+                "isAnswer": true,
+                "log": [
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "Sure, I'll play! My number is 57. Your turn!",
+                  },
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "58",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "I choose 83. What's your next number?",
+                  },
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "99",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "I'll go with 112. Your turn!",
+                  },
+                ],
+                "message_files": [],
+                "more": {
+                  "latency": "1.49",
+                  "time": "09/11/2024 09:50 PM",
+                  "tokens": 86,
+                },
+                "parentMessageId": "question-4c5d0841-1206-463e-95d8-71f812877658",
+                "siblingIndex": 0,
+                "workflow_run_id": null,
+              },
+            ],
+            "content": "99",
+            "id": "question-4c5d0841-1206-463e-95d8-71f812877658",
+            "isAnswer": false,
+            "message_files": [],
+            "parentMessageId": "73bbad14-d915-499d-87bf-0df14d40779d",
+          },
+        ],
+        "content": "I choose 83. What's your next number?",
+        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+        "feedbackDisabled": false,
+        "id": "73bbad14-d915-499d-87bf-0df14d40779d",
+        "input": {
+          "inputs": {},
+          "query": "58",
+        },
+        "isAnswer": true,
+        "log": [
+          {
+            "files": [],
+            "role": "user",
+            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "Sure, I'll play! My number is 57. Your turn!",
+          },
+          {
+            "files": [],
+            "role": "user",
+            "text": "58",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "I choose 83. What's your next number?",
+          },
+        ],
+        "message_files": [],
+        "more": {
+          "latency": "1.33",
+          "time": "09/11/2024 09:49 PM",
+          "tokens": 68,
+        },
+        "parentMessageId": "question-73bbad14-d915-499d-87bf-0df14d40779d",
+        "siblingIndex": 0,
+        "workflow_run_id": null,
+      },
+    ],
+    "content": "58",
+    "id": "question-73bbad14-d915-499d-87bf-0df14d40779d",
+    "isAnswer": false,
+    "message_files": [],
+    "parentMessageId": "ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+  },
+  {
+    "agent_thoughts": [
+      {
+        "chain_id": null,
+        "created_at": 1726105795,
+        "files": [],
+        "id": "f61a3fce-37ac-4f9d-9935-95f97e598dfe",
+        "message_id": "73bbad14-d915-499d-87bf-0df14d40779d",
+        "observation": "",
+        "position": 1,
+        "thought": "I choose 83. What's your next number?",
+        "tool": "",
+        "tool_input": "",
+        "tool_labels": {},
+      },
+    ],
+    "children": [
+      {
+        "children": [
+          {
+            "agent_thoughts": [
+              {
+                "chain_id": null,
+                "created_at": 1726105799,
+                "files": [],
+                "id": "9730d587-9268-4683-9dd9-91a1cab9510b",
+                "message_id": "4c5d0841-1206-463e-95d8-71f812877658",
+                "observation": "",
+                "position": 1,
+                "thought": "I'll go with 112. Your turn!",
+                "tool": "",
+                "tool_input": "",
+                "tool_labels": {},
+              },
+            ],
+            "children": [],
+            "content": "I'll go with 112. Your turn!",
+            "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+            "feedbackDisabled": false,
+            "id": "4c5d0841-1206-463e-95d8-71f812877658",
+            "input": {
+              "inputs": {},
+              "query": "99",
+            },
+            "isAnswer": true,
+            "log": [
+              {
+                "files": [],
+                "role": "user",
+                "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+              },
+              {
+                "files": [],
+                "role": "assistant",
+                "text": "Sure, I'll play! My number is 57. Your turn!",
+              },
+              {
+                "files": [],
+                "role": "user",
+                "text": "58",
+              },
+              {
+                "files": [],
+                "role": "assistant",
+                "text": "I choose 83. What's your next number?",
+              },
+              {
+                "files": [],
+                "role": "user",
+                "text": "99",
+              },
+              {
+                "files": [],
+                "role": "assistant",
+                "text": "I'll go with 112. Your turn!",
+              },
+            ],
+            "message_files": [],
+            "more": {
+              "latency": "1.49",
+              "time": "09/11/2024 09:50 PM",
+              "tokens": 86,
+            },
+            "parentMessageId": "question-4c5d0841-1206-463e-95d8-71f812877658",
+            "siblingIndex": 0,
+            "workflow_run_id": null,
+          },
+        ],
+        "content": "99",
+        "id": "question-4c5d0841-1206-463e-95d8-71f812877658",
+        "isAnswer": false,
+        "message_files": [],
+        "parentMessageId": "73bbad14-d915-499d-87bf-0df14d40779d",
+      },
+    ],
+    "content": "I choose 83. What's your next number?",
+    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+    "feedbackDisabled": false,
+    "id": "73bbad14-d915-499d-87bf-0df14d40779d",
+    "input": {
+      "inputs": {},
+      "query": "58",
+    },
+    "isAnswer": true,
+    "log": [
+      {
+        "files": [],
+        "role": "user",
+        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+      },
+      {
+        "files": [],
+        "role": "assistant",
+        "text": "Sure, I'll play! My number is 57. Your turn!",
+      },
+      {
+        "files": [],
+        "role": "user",
+        "text": "58",
+      },
+      {
+        "files": [],
+        "role": "assistant",
+        "text": "I choose 83. What's your next number?",
+      },
+    ],
+    "message_files": [],
+    "more": {
+      "latency": "1.33",
+      "time": "09/11/2024 09:49 PM",
+      "tokens": 68,
+    },
+    "parentMessageId": "question-73bbad14-d915-499d-87bf-0df14d40779d",
+    "prevSibling": undefined,
+    "siblingCount": 1,
+    "siblingIndex": 0,
+    "workflow_run_id": null,
+  },
+  {
+    "children": [
+      {
+        "agent_thoughts": [
+          {
+            "chain_id": null,
+            "created_at": 1726105799,
+            "files": [],
+            "id": "9730d587-9268-4683-9dd9-91a1cab9510b",
+            "message_id": "4c5d0841-1206-463e-95d8-71f812877658",
+            "observation": "",
+            "position": 1,
+            "thought": "I'll go with 112. Your turn!",
+            "tool": "",
+            "tool_input": "",
+            "tool_labels": {},
+          },
+        ],
+        "children": [],
+        "content": "I'll go with 112. Your turn!",
+        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+        "feedbackDisabled": false,
+        "id": "4c5d0841-1206-463e-95d8-71f812877658",
+        "input": {
+          "inputs": {},
+          "query": "99",
+        },
+        "isAnswer": true,
+        "log": [
+          {
+            "files": [],
+            "role": "user",
+            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "Sure, I'll play! My number is 57. Your turn!",
+          },
+          {
+            "files": [],
+            "role": "user",
+            "text": "58",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "I choose 83. What's your next number?",
+          },
+          {
+            "files": [],
+            "role": "user",
+            "text": "99",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "I'll go with 112. Your turn!",
+          },
+        ],
+        "message_files": [],
+        "more": {
+          "latency": "1.49",
+          "time": "09/11/2024 09:50 PM",
+          "tokens": 86,
+        },
+        "parentMessageId": "question-4c5d0841-1206-463e-95d8-71f812877658",
+        "siblingIndex": 0,
+        "workflow_run_id": null,
+      },
+    ],
+    "content": "99",
+    "id": "question-4c5d0841-1206-463e-95d8-71f812877658",
+    "isAnswer": false,
+    "message_files": [],
+    "parentMessageId": "73bbad14-d915-499d-87bf-0df14d40779d",
+  },
+  {
+    "agent_thoughts": [
+      {
+        "chain_id": null,
+        "created_at": 1726105799,
+        "files": [],
+        "id": "9730d587-9268-4683-9dd9-91a1cab9510b",
+        "message_id": "4c5d0841-1206-463e-95d8-71f812877658",
+        "observation": "",
+        "position": 1,
+        "thought": "I'll go with 112. Your turn!",
+        "tool": "",
+        "tool_input": "",
+        "tool_labels": {},
+      },
+    ],
+    "children": [],
+    "content": "I'll go with 112. Your turn!",
+    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+    "feedbackDisabled": false,
+    "id": "4c5d0841-1206-463e-95d8-71f812877658",
+    "input": {
+      "inputs": {},
+      "query": "99",
+    },
+    "isAnswer": true,
+    "log": [
+      {
+        "files": [],
+        "role": "user",
+        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+      },
+      {
+        "files": [],
+        "role": "assistant",
+        "text": "Sure, I'll play! My number is 57. Your turn!",
+      },
+      {
+        "files": [],
+        "role": "user",
+        "text": "58",
+      },
+      {
+        "files": [],
+        "role": "assistant",
+        "text": "I choose 83. What's your next number?",
+      },
+      {
+        "files": [],
+        "role": "user",
+        "text": "99",
+      },
+      {
+        "files": [],
+        "role": "assistant",
+        "text": "I'll go with 112. Your turn!",
+      },
+    ],
+    "message_files": [],
+    "more": {
+      "latency": "1.49",
+      "time": "09/11/2024 09:50 PM",
+      "tokens": 86,
+    },
+    "parentMessageId": "question-4c5d0841-1206-463e-95d8-71f812877658",
+    "prevSibling": undefined,
+    "siblingCount": 1,
+    "siblingIndex": 0,
+    "workflow_run_id": null,
+  },
+]
+`;
+
+exports[`build chat item tree and get thread messages should get thread messages from tree6, using the last message as target 1`] = `
+[
+  {
+    "children": [
+      {
+        "agent_thoughts": [
+          {
+            "chain_id": null,
+            "created_at": 1726105809,
+            "files": [],
+            "id": "1019cd79-d141-4f9f-880a-fc1441cfd802",
+            "message_id": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+            "observation": "",
+            "position": 1,
+            "thought": "Sure! My number is 54. Your turn!",
+            "tool": "",
+            "tool_input": "",
+            "tool_labels": {},
+          },
+        ],
+        "children": [
+          {
+            "children": [
+              {
+                "agent_thoughts": [
+                  {
+                    "chain_id": null,
+                    "created_at": 1726105822,
+                    "files": [],
+                    "id": "0773bec7-b992-4a53-92b2-20ebaeae8798",
+                    "message_id": "324bce32-c98c-435d-a66b-bac974ebb5ed",
+                    "observation": "",
+                    "position": 1,
+                    "thought": "My number is 4729. Your turn!",
+                    "tool": "",
+                    "tool_input": "",
+                    "tool_labels": {},
+                  },
+                ],
+                "children": [],
+                "content": "My number is 4729. Your turn!",
+                "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                "feedbackDisabled": false,
+                "id": "324bce32-c98c-435d-a66b-bac974ebb5ed",
+                "input": {
+                  "inputs": {},
+                  "query": "3306",
+                },
+                "isAnswer": true,
+                "log": [
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "Sure! My number is 54. Your turn!",
+                  },
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "3306",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "My number is 4729. Your turn!",
+                  },
+                ],
+                "message_files": [],
+                "more": {
+                  "latency": "1.30",
+                  "time": "09/11/2024 09:50 PM",
+                  "tokens": 66,
+                },
+                "parentMessageId": "question-324bce32-c98c-435d-a66b-bac974ebb5ed",
+                "siblingIndex": 0,
+                "workflow_run_id": null,
+              },
+            ],
+            "content": "3306",
+            "id": "question-324bce32-c98c-435d-a66b-bac974ebb5ed",
+            "isAnswer": false,
+            "message_files": [],
+            "parentMessageId": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+          },
+          {
+            "children": [
+              {
+                "agent_thoughts": [
+                  {
+                    "chain_id": null,
+                    "created_at": 1726107812,
+                    "files": [],
+                    "id": "5ca650f3-982c-4399-8b95-9ea241c76707",
+                    "message_id": "684b5396-4e91-4043-88e9-aabe48b21acc",
+                    "observation": "",
+                    "position": 1,
+                    "thought": "My number is 4821. Your turn!",
+                    "tool": "",
+                    "tool_input": "",
+                    "tool_labels": {},
+                  },
+                ],
+                "children": [
+                  {
+                    "children": [
+                      {
+                        "agent_thoughts": [
+                          {
+                            "chain_id": null,
+                            "created_at": 1726111024,
+                            "files": [],
+                            "id": "095cacab-afad-4387-a41d-1662578b8b13",
+                            "message_id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                            "observation": "",
+                            "position": 1,
+                            "thought": "My number is 1456. Your turn!",
+                            "tool": "",
+                            "tool_input": "",
+                            "tool_labels": {},
+                          },
+                        ],
+                        "children": [],
+                        "content": "My number is 1456. Your turn!",
+                        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                        "feedbackDisabled": false,
+                        "id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                        "input": {
+                          "inputs": {},
+                          "query": "1003",
+                        },
+                        "isAnswer": true,
+                        "log": [
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "Sure! My number is 54. Your turn!",
+                          },
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "3306",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "My number is 4821. Your turn!",
+                          },
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "1003",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "My number is 1456. Your turn!",
+                          },
+                        ],
+                        "message_files": [],
+                        "more": {
+                          "latency": "1.38",
+                          "time": "09/11/2024 11:17 PM",
+                          "tokens": 86,
+                        },
+                        "parentMessageId": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                        "siblingIndex": 0,
+                        "workflow_run_id": null,
+                      },
+                    ],
+                    "content": "1003",
+                    "id": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                    "isAnswer": false,
+                    "message_files": [],
+                    "parentMessageId": "684b5396-4e91-4043-88e9-aabe48b21acc",
+                  },
+                ],
+                "content": "My number is 4821. Your turn!",
+                "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                "feedbackDisabled": false,
+                "id": "684b5396-4e91-4043-88e9-aabe48b21acc",
+                "input": {
+                  "inputs": {},
+                  "query": "3306",
+                },
+                "isAnswer": true,
+                "log": [
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "Sure! My number is 54. Your turn!",
+                  },
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "3306",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "My number is 4821. Your turn!",
+                  },
+                ],
+                "message_files": [],
+                "more": {
+                  "latency": "1.48",
+                  "time": "09/11/2024 10:23 PM",
+                  "tokens": 66,
+                },
+                "parentMessageId": "question-684b5396-4e91-4043-88e9-aabe48b21acc",
+                "siblingIndex": 1,
+                "workflow_run_id": null,
+              },
+            ],
+            "content": "3306",
+            "id": "question-684b5396-4e91-4043-88e9-aabe48b21acc",
+            "isAnswer": false,
+            "message_files": [],
+            "parentMessageId": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+          },
+        ],
+        "content": "Sure! My number is 54. Your turn!",
+        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+        "feedbackDisabled": false,
+        "id": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+        "input": {
+          "inputs": {},
+          "query": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+        },
+        "isAnswer": true,
+        "log": [
+          {
+            "files": [],
+            "role": "user",
+            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "Sure! My number is 54. Your turn!",
+          },
+        ],
+        "message_files": [],
+        "more": {
+          "latency": "1.52",
+          "time": "09/11/2024 09:50 PM",
+          "tokens": 46,
+        },
+        "parentMessageId": "question-cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+        "siblingIndex": 1,
+        "workflow_run_id": null,
+      },
+    ],
+    "content": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+    "id": "question-cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+    "isAnswer": false,
+    "message_files": [],
+  },
+  {
+    "agent_thoughts": [
+      {
+        "chain_id": null,
+        "created_at": 1726105809,
+        "files": [],
+        "id": "1019cd79-d141-4f9f-880a-fc1441cfd802",
+        "message_id": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+        "observation": "",
+        "position": 1,
+        "thought": "Sure! My number is 54. Your turn!",
+        "tool": "",
+        "tool_input": "",
+        "tool_labels": {},
+      },
+    ],
+    "children": [
+      {
+        "children": [
+          {
+            "agent_thoughts": [
+              {
+                "chain_id": null,
+                "created_at": 1726105822,
+                "files": [],
+                "id": "0773bec7-b992-4a53-92b2-20ebaeae8798",
+                "message_id": "324bce32-c98c-435d-a66b-bac974ebb5ed",
+                "observation": "",
+                "position": 1,
+                "thought": "My number is 4729. Your turn!",
+                "tool": "",
+                "tool_input": "",
+                "tool_labels": {},
+              },
+            ],
+            "children": [],
+            "content": "My number is 4729. Your turn!",
+            "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+            "feedbackDisabled": false,
+            "id": "324bce32-c98c-435d-a66b-bac974ebb5ed",
+            "input": {
+              "inputs": {},
+              "query": "3306",
+            },
+            "isAnswer": true,
+            "log": [
+              {
+                "files": [],
+                "role": "user",
+                "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+              },
+              {
+                "files": [],
+                "role": "assistant",
+                "text": "Sure! My number is 54. Your turn!",
+              },
+              {
+                "files": [],
+                "role": "user",
+                "text": "3306",
+              },
+              {
+                "files": [],
+                "role": "assistant",
+                "text": "My number is 4729. Your turn!",
+              },
+            ],
+            "message_files": [],
+            "more": {
+              "latency": "1.30",
+              "time": "09/11/2024 09:50 PM",
+              "tokens": 66,
+            },
+            "parentMessageId": "question-324bce32-c98c-435d-a66b-bac974ebb5ed",
+            "siblingIndex": 0,
+            "workflow_run_id": null,
+          },
+        ],
+        "content": "3306",
+        "id": "question-324bce32-c98c-435d-a66b-bac974ebb5ed",
+        "isAnswer": false,
+        "message_files": [],
+        "parentMessageId": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+      },
+      {
+        "children": [
+          {
+            "agent_thoughts": [
+              {
+                "chain_id": null,
+                "created_at": 1726107812,
+                "files": [],
+                "id": "5ca650f3-982c-4399-8b95-9ea241c76707",
+                "message_id": "684b5396-4e91-4043-88e9-aabe48b21acc",
+                "observation": "",
+                "position": 1,
+                "thought": "My number is 4821. Your turn!",
+                "tool": "",
+                "tool_input": "",
+                "tool_labels": {},
+              },
+            ],
+            "children": [
+              {
+                "children": [
+                  {
+                    "agent_thoughts": [
+                      {
+                        "chain_id": null,
+                        "created_at": 1726111024,
+                        "files": [],
+                        "id": "095cacab-afad-4387-a41d-1662578b8b13",
+                        "message_id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                        "observation": "",
+                        "position": 1,
+                        "thought": "My number is 1456. Your turn!",
+                        "tool": "",
+                        "tool_input": "",
+                        "tool_labels": {},
+                      },
+                    ],
+                    "children": [],
+                    "content": "My number is 1456. Your turn!",
+                    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                    "feedbackDisabled": false,
+                    "id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                    "input": {
+                      "inputs": {},
+                      "query": "1003",
+                    },
+                    "isAnswer": true,
+                    "log": [
+                      {
+                        "files": [],
+                        "role": "user",
+                        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                      },
+                      {
+                        "files": [],
+                        "role": "assistant",
+                        "text": "Sure! My number is 54. Your turn!",
+                      },
+                      {
+                        "files": [],
+                        "role": "user",
+                        "text": "3306",
+                      },
+                      {
+                        "files": [],
+                        "role": "assistant",
+                        "text": "My number is 4821. Your turn!",
+                      },
+                      {
+                        "files": [],
+                        "role": "user",
+                        "text": "1003",
+                      },
+                      {
+                        "files": [],
+                        "role": "assistant",
+                        "text": "My number is 1456. Your turn!",
+                      },
+                    ],
+                    "message_files": [],
+                    "more": {
+                      "latency": "1.38",
+                      "time": "09/11/2024 11:17 PM",
+                      "tokens": 86,
+                    },
+                    "parentMessageId": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                    "siblingIndex": 0,
+                    "workflow_run_id": null,
+                  },
+                ],
+                "content": "1003",
+                "id": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                "isAnswer": false,
+                "message_files": [],
+                "parentMessageId": "684b5396-4e91-4043-88e9-aabe48b21acc",
+              },
+            ],
+            "content": "My number is 4821. Your turn!",
+            "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+            "feedbackDisabled": false,
+            "id": "684b5396-4e91-4043-88e9-aabe48b21acc",
+            "input": {
+              "inputs": {},
+              "query": "3306",
+            },
+            "isAnswer": true,
+            "log": [
+              {
+                "files": [],
+                "role": "user",
+                "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+              },
+              {
+                "files": [],
+                "role": "assistant",
+                "text": "Sure! My number is 54. Your turn!",
+              },
+              {
+                "files": [],
+                "role": "user",
+                "text": "3306",
+              },
+              {
+                "files": [],
+                "role": "assistant",
+                "text": "My number is 4821. Your turn!",
+              },
+            ],
+            "message_files": [],
+            "more": {
+              "latency": "1.48",
+              "time": "09/11/2024 10:23 PM",
+              "tokens": 66,
+            },
+            "parentMessageId": "question-684b5396-4e91-4043-88e9-aabe48b21acc",
+            "siblingIndex": 1,
+            "workflow_run_id": null,
+          },
+        ],
+        "content": "3306",
+        "id": "question-684b5396-4e91-4043-88e9-aabe48b21acc",
+        "isAnswer": false,
+        "message_files": [],
+        "parentMessageId": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+      },
+    ],
+    "content": "Sure! My number is 54. Your turn!",
+    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+    "feedbackDisabled": false,
+    "id": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+    "input": {
+      "inputs": {},
+      "query": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+    },
+    "isAnswer": true,
+    "log": [
+      {
+        "files": [],
+        "role": "user",
+        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+      },
+      {
+        "files": [],
+        "role": "assistant",
+        "text": "Sure! My number is 54. Your turn!",
+      },
+    ],
+    "message_files": [],
+    "more": {
+      "latency": "1.52",
+      "time": "09/11/2024 09:50 PM",
+      "tokens": 46,
+    },
+    "nextSibling": undefined,
+    "parentMessageId": "question-cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+    "prevSibling": "ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+    "siblingCount": 2,
+    "siblingIndex": 1,
+    "workflow_run_id": null,
+  },
+  {
+    "children": [
+      {
+        "agent_thoughts": [
+          {
+            "chain_id": null,
+            "created_at": 1726107812,
+            "files": [],
+            "id": "5ca650f3-982c-4399-8b95-9ea241c76707",
+            "message_id": "684b5396-4e91-4043-88e9-aabe48b21acc",
+            "observation": "",
+            "position": 1,
+            "thought": "My number is 4821. Your turn!",
+            "tool": "",
+            "tool_input": "",
+            "tool_labels": {},
+          },
+        ],
+        "children": [
+          {
+            "children": [
+              {
+                "agent_thoughts": [
+                  {
+                    "chain_id": null,
+                    "created_at": 1726111024,
+                    "files": [],
+                    "id": "095cacab-afad-4387-a41d-1662578b8b13",
+                    "message_id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                    "observation": "",
+                    "position": 1,
+                    "thought": "My number is 1456. Your turn!",
+                    "tool": "",
+                    "tool_input": "",
+                    "tool_labels": {},
+                  },
+                ],
+                "children": [],
+                "content": "My number is 1456. Your turn!",
+                "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                "feedbackDisabled": false,
+                "id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                "input": {
+                  "inputs": {},
+                  "query": "1003",
+                },
+                "isAnswer": true,
+                "log": [
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "Sure! My number is 54. Your turn!",
+                  },
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "3306",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "My number is 4821. Your turn!",
+                  },
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "1003",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "My number is 1456. Your turn!",
+                  },
+                ],
+                "message_files": [],
+                "more": {
+                  "latency": "1.38",
+                  "time": "09/11/2024 11:17 PM",
+                  "tokens": 86,
+                },
+                "parentMessageId": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                "siblingIndex": 0,
+                "workflow_run_id": null,
+              },
+            ],
+            "content": "1003",
+            "id": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+            "isAnswer": false,
+            "message_files": [],
+            "parentMessageId": "684b5396-4e91-4043-88e9-aabe48b21acc",
+          },
+        ],
+        "content": "My number is 4821. Your turn!",
+        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+        "feedbackDisabled": false,
+        "id": "684b5396-4e91-4043-88e9-aabe48b21acc",
+        "input": {
+          "inputs": {},
+          "query": "3306",
+        },
+        "isAnswer": true,
+        "log": [
+          {
+            "files": [],
+            "role": "user",
+            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "Sure! My number is 54. Your turn!",
+          },
+          {
+            "files": [],
+            "role": "user",
+            "text": "3306",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "My number is 4821. Your turn!",
+          },
+        ],
+        "message_files": [],
+        "more": {
+          "latency": "1.48",
+          "time": "09/11/2024 10:23 PM",
+          "tokens": 66,
+        },
+        "parentMessageId": "question-684b5396-4e91-4043-88e9-aabe48b21acc",
+        "siblingIndex": 1,
+        "workflow_run_id": null,
+      },
+    ],
+    "content": "3306",
+    "id": "question-684b5396-4e91-4043-88e9-aabe48b21acc",
+    "isAnswer": false,
+    "message_files": [],
+    "parentMessageId": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+  },
+  {
+    "agent_thoughts": [
+      {
+        "chain_id": null,
+        "created_at": 1726107812,
+        "files": [],
+        "id": "5ca650f3-982c-4399-8b95-9ea241c76707",
+        "message_id": "684b5396-4e91-4043-88e9-aabe48b21acc",
+        "observation": "",
+        "position": 1,
+        "thought": "My number is 4821. Your turn!",
+        "tool": "",
+        "tool_input": "",
+        "tool_labels": {},
+      },
+    ],
+    "children": [
+      {
+        "children": [
+          {
+            "agent_thoughts": [
+              {
+                "chain_id": null,
+                "created_at": 1726111024,
+                "files": [],
+                "id": "095cacab-afad-4387-a41d-1662578b8b13",
+                "message_id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                "observation": "",
+                "position": 1,
+                "thought": "My number is 1456. Your turn!",
+                "tool": "",
+                "tool_input": "",
+                "tool_labels": {},
+              },
+            ],
+            "children": [],
+            "content": "My number is 1456. Your turn!",
+            "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+            "feedbackDisabled": false,
+            "id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+            "input": {
+              "inputs": {},
+              "query": "1003",
+            },
+            "isAnswer": true,
+            "log": [
+              {
+                "files": [],
+                "role": "user",
+                "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+              },
+              {
+                "files": [],
+                "role": "assistant",
+                "text": "Sure! My number is 54. Your turn!",
+              },
+              {
+                "files": [],
+                "role": "user",
+                "text": "3306",
+              },
+              {
+                "files": [],
+                "role": "assistant",
+                "text": "My number is 4821. Your turn!",
+              },
+              {
+                "files": [],
+                "role": "user",
+                "text": "1003",
+              },
+              {
+                "files": [],
+                "role": "assistant",
+                "text": "My number is 1456. Your turn!",
+              },
+            ],
+            "message_files": [],
+            "more": {
+              "latency": "1.38",
+              "time": "09/11/2024 11:17 PM",
+              "tokens": 86,
+            },
+            "parentMessageId": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+            "siblingIndex": 0,
+            "workflow_run_id": null,
+          },
+        ],
+        "content": "1003",
+        "id": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+        "isAnswer": false,
+        "message_files": [],
+        "parentMessageId": "684b5396-4e91-4043-88e9-aabe48b21acc",
+      },
+    ],
+    "content": "My number is 4821. Your turn!",
+    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+    "feedbackDisabled": false,
+    "id": "684b5396-4e91-4043-88e9-aabe48b21acc",
+    "input": {
+      "inputs": {},
+      "query": "3306",
+    },
+    "isAnswer": true,
+    "log": [
+      {
+        "files": [],
+        "role": "user",
+        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+      },
+      {
+        "files": [],
+        "role": "assistant",
+        "text": "Sure! My number is 54. Your turn!",
+      },
+      {
+        "files": [],
+        "role": "user",
+        "text": "3306",
+      },
+      {
+        "files": [],
+        "role": "assistant",
+        "text": "My number is 4821. Your turn!",
+      },
+    ],
+    "message_files": [],
+    "more": {
+      "latency": "1.48",
+      "time": "09/11/2024 10:23 PM",
+      "tokens": 66,
+    },
+    "nextSibling": undefined,
+    "parentMessageId": "question-684b5396-4e91-4043-88e9-aabe48b21acc",
+    "prevSibling": "324bce32-c98c-435d-a66b-bac974ebb5ed",
+    "siblingCount": 2,
+    "siblingIndex": 1,
+    "workflow_run_id": null,
+  },
+  {
+    "children": [
+      {
+        "agent_thoughts": [
+          {
+            "chain_id": null,
+            "created_at": 1726111024,
+            "files": [],
+            "id": "095cacab-afad-4387-a41d-1662578b8b13",
+            "message_id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+            "observation": "",
+            "position": 1,
+            "thought": "My number is 1456. Your turn!",
+            "tool": "",
+            "tool_input": "",
+            "tool_labels": {},
+          },
+        ],
+        "children": [],
+        "content": "My number is 1456. Your turn!",
+        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+        "feedbackDisabled": false,
+        "id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+        "input": {
+          "inputs": {},
+          "query": "1003",
+        },
+        "isAnswer": true,
+        "log": [
+          {
+            "files": [],
+            "role": "user",
+            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "Sure! My number is 54. Your turn!",
+          },
+          {
+            "files": [],
+            "role": "user",
+            "text": "3306",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "My number is 4821. Your turn!",
+          },
+          {
+            "files": [],
+            "role": "user",
+            "text": "1003",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "My number is 1456. Your turn!",
+          },
+        ],
+        "message_files": [],
+        "more": {
+          "latency": "1.38",
+          "time": "09/11/2024 11:17 PM",
+          "tokens": 86,
+        },
+        "parentMessageId": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+        "siblingIndex": 0,
+        "workflow_run_id": null,
+      },
+    ],
+    "content": "1003",
+    "id": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+    "isAnswer": false,
+    "message_files": [],
+    "parentMessageId": "684b5396-4e91-4043-88e9-aabe48b21acc",
+  },
+  {
+    "agent_thoughts": [
+      {
+        "chain_id": null,
+        "created_at": 1726111024,
+        "files": [],
+        "id": "095cacab-afad-4387-a41d-1662578b8b13",
+        "message_id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+        "observation": "",
+        "position": 1,
+        "thought": "My number is 1456. Your turn!",
+        "tool": "",
+        "tool_input": "",
+        "tool_labels": {},
+      },
+    ],
+    "children": [],
+    "content": "My number is 1456. Your turn!",
+    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+    "feedbackDisabled": false,
+    "id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+    "input": {
+      "inputs": {},
+      "query": "1003",
+    },
+    "isAnswer": true,
+    "log": [
+      {
+        "files": [],
+        "role": "user",
+        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+      },
+      {
+        "files": [],
+        "role": "assistant",
+        "text": "Sure! My number is 54. Your turn!",
+      },
+      {
+        "files": [],
+        "role": "user",
+        "text": "3306",
+      },
+      {
+        "files": [],
+        "role": "assistant",
+        "text": "My number is 4821. Your turn!",
+      },
+      {
+        "files": [],
+        "role": "user",
+        "text": "1003",
+      },
+      {
+        "files": [],
+        "role": "assistant",
+        "text": "My number is 1456. Your turn!",
+      },
+    ],
+    "message_files": [],
+    "more": {
+      "latency": "1.38",
+      "time": "09/11/2024 11:17 PM",
+      "tokens": 86,
+    },
+    "nextSibling": undefined,
+    "parentMessageId": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+    "prevSibling": undefined,
+    "siblingCount": 1,
+    "siblingIndex": 0,
+    "workflow_run_id": null,
+  },
+]
+`;
+
+exports[`build chat item tree and get thread messages should work with partial messages 1 1`] = `
+[
+  {
+    "children": [
+      {
+        "agent_thoughts": [
+          {
+            "chain_id": null,
+            "created_at": 1726105799,
+            "files": [],
+            "id": "9730d587-9268-4683-9dd9-91a1cab9510b",
+            "message_id": "4c5d0841-1206-463e-95d8-71f812877658",
+            "observation": "",
+            "position": 1,
+            "thought": "I'll go with 112. Your turn!",
+            "tool": "",
+            "tool_input": "",
+            "tool_labels": {},
+          },
+        ],
+        "children": [],
+        "content": "I'll go with 112. Your turn!",
+        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+        "feedbackDisabled": false,
+        "id": "4c5d0841-1206-463e-95d8-71f812877658",
+        "input": {
+          "inputs": {},
+          "query": "99",
+        },
+        "isAnswer": true,
+        "log": [
+          {
+            "files": [],
+            "role": "user",
+            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "Sure, I'll play! My number is 57. Your turn!",
+          },
+          {
+            "files": [],
+            "role": "user",
+            "text": "58",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "I choose 83. What's your next number?",
+          },
+          {
+            "files": [],
+            "role": "user",
+            "text": "99",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "I'll go with 112. Your turn!",
+          },
+        ],
+        "message_files": [],
+        "more": {
+          "latency": "1.49",
+          "time": "09/11/2024 09:50 PM",
+          "tokens": 86,
+        },
+        "parentMessageId": "question-4c5d0841-1206-463e-95d8-71f812877658",
+        "siblingIndex": 0,
+        "workflow_run_id": null,
+      },
+    ],
+    "content": "99",
+    "id": "question-4c5d0841-1206-463e-95d8-71f812877658",
+    "isAnswer": false,
+    "message_files": [],
+    "parentMessageId": "73bbad14-d915-499d-87bf-0df14d40779d",
+  },
+  {
+    "children": [
+      {
+        "agent_thoughts": [
+          {
+            "chain_id": null,
+            "created_at": 1726105809,
+            "files": [],
+            "id": "1019cd79-d141-4f9f-880a-fc1441cfd802",
+            "message_id": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+            "observation": "",
+            "position": 1,
+            "thought": "Sure! My number is 54. Your turn!",
+            "tool": "",
+            "tool_input": "",
+            "tool_labels": {},
+          },
+        ],
+        "children": [
+          {
+            "children": [
+              {
+                "agent_thoughts": [
+                  {
+                    "chain_id": null,
+                    "created_at": 1726105822,
+                    "files": [],
+                    "id": "0773bec7-b992-4a53-92b2-20ebaeae8798",
+                    "message_id": "324bce32-c98c-435d-a66b-bac974ebb5ed",
+                    "observation": "",
+                    "position": 1,
+                    "thought": "My number is 4729. Your turn!",
+                    "tool": "",
+                    "tool_input": "",
+                    "tool_labels": {},
+                  },
+                ],
+                "children": [],
+                "content": "My number is 4729. Your turn!",
+                "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                "feedbackDisabled": false,
+                "id": "324bce32-c98c-435d-a66b-bac974ebb5ed",
+                "input": {
+                  "inputs": {},
+                  "query": "3306",
+                },
+                "isAnswer": true,
+                "log": [
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "Sure! My number is 54. Your turn!",
+                  },
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "3306",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "My number is 4729. Your turn!",
+                  },
+                ],
+                "message_files": [],
+                "more": {
+                  "latency": "1.30",
+                  "time": "09/11/2024 09:50 PM",
+                  "tokens": 66,
+                },
+                "parentMessageId": "question-324bce32-c98c-435d-a66b-bac974ebb5ed",
+                "siblingIndex": 0,
+                "workflow_run_id": null,
+              },
+            ],
+            "content": "3306",
+            "id": "question-324bce32-c98c-435d-a66b-bac974ebb5ed",
+            "isAnswer": false,
+            "message_files": [],
+            "parentMessageId": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+          },
+          {
+            "children": [
+              {
+                "agent_thoughts": [
+                  {
+                    "chain_id": null,
+                    "created_at": 1726107812,
+                    "files": [],
+                    "id": "5ca650f3-982c-4399-8b95-9ea241c76707",
+                    "message_id": "684b5396-4e91-4043-88e9-aabe48b21acc",
+                    "observation": "",
+                    "position": 1,
+                    "thought": "My number is 4821. Your turn!",
+                    "tool": "",
+                    "tool_input": "",
+                    "tool_labels": {},
+                  },
+                ],
+                "children": [
+                  {
+                    "children": [
+                      {
+                        "agent_thoughts": [
+                          {
+                            "chain_id": null,
+                            "created_at": 1726111024,
+                            "files": [],
+                            "id": "095cacab-afad-4387-a41d-1662578b8b13",
+                            "message_id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                            "observation": "",
+                            "position": 1,
+                            "thought": "My number is 1456. Your turn!",
+                            "tool": "",
+                            "tool_input": "",
+                            "tool_labels": {},
+                          },
+                        ],
+                        "children": [],
+                        "content": "My number is 1456. Your turn!",
+                        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                        "feedbackDisabled": false,
+                        "id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                        "input": {
+                          "inputs": {},
+                          "query": "1003",
+                        },
+                        "isAnswer": true,
+                        "log": [
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "Sure! My number is 54. Your turn!",
+                          },
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "3306",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "My number is 4821. Your turn!",
+                          },
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "1003",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "My number is 1456. Your turn!",
+                          },
+                        ],
+                        "message_files": [],
+                        "more": {
+                          "latency": "1.38",
+                          "time": "09/11/2024 11:17 PM",
+                          "tokens": 86,
+                        },
+                        "parentMessageId": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                        "siblingIndex": 0,
+                        "workflow_run_id": null,
+                      },
+                    ],
+                    "content": "1003",
+                    "id": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                    "isAnswer": false,
+                    "message_files": [],
+                    "parentMessageId": "684b5396-4e91-4043-88e9-aabe48b21acc",
+                  },
+                ],
+                "content": "My number is 4821. Your turn!",
+                "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                "feedbackDisabled": false,
+                "id": "684b5396-4e91-4043-88e9-aabe48b21acc",
+                "input": {
+                  "inputs": {},
+                  "query": "3306",
+                },
+                "isAnswer": true,
+                "log": [
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "Sure! My number is 54. Your turn!",
+                  },
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "3306",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "My number is 4821. Your turn!",
+                  },
+                ],
+                "message_files": [],
+                "more": {
+                  "latency": "1.48",
+                  "time": "09/11/2024 10:23 PM",
+                  "tokens": 66,
+                },
+                "parentMessageId": "question-684b5396-4e91-4043-88e9-aabe48b21acc",
+                "siblingIndex": 1,
+                "workflow_run_id": null,
+              },
+            ],
+            "content": "3306",
+            "id": "question-684b5396-4e91-4043-88e9-aabe48b21acc",
+            "isAnswer": false,
+            "message_files": [],
+            "parentMessageId": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+          },
+        ],
+        "content": "Sure! My number is 54. Your turn!",
+        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+        "feedbackDisabled": false,
+        "id": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+        "input": {
+          "inputs": {},
+          "query": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+        },
+        "isAnswer": true,
+        "log": [
+          {
+            "files": [],
+            "role": "user",
+            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "Sure! My number is 54. Your turn!",
+          },
+        ],
+        "message_files": [],
+        "more": {
+          "latency": "1.52",
+          "time": "09/11/2024 09:50 PM",
+          "tokens": 46,
+        },
+        "parentMessageId": "question-cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+        "siblingIndex": 0,
+        "workflow_run_id": null,
+      },
+    ],
+    "content": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+    "id": "question-cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+    "isAnswer": false,
+    "message_files": [],
+  },
+]
+`;
+
+exports[`build chat item tree and get thread messages should work with partial messages 2 1`] = `
+[
+  {
+    "children": [
+      {
+        "children": [],
+        "content": "237.",
+        "id": "ebb73fe2-15de-46dd-aab5-75416d8448eb",
+        "isAnswer": true,
+        "parentMessageId": "question-ebb73fe2-15de-46dd-aab5-75416d8448eb",
+        "siblingIndex": 0,
+      },
+    ],
+    "content": "123",
+    "id": "question-ebb73fe2-15de-46dd-aab5-75416d8448eb",
+    "isAnswer": false,
+    "parentMessageId": "57c989f9-3fa4-4dec-9ee5-c3568dd27418",
+  },
+  {
+    "children": [
+      {
+        "children": [],
+        "content": "My number is 256.",
+        "id": "3553d508-3850-462e-8594-078539f940f9",
+        "isAnswer": true,
+        "parentMessageId": "question-3553d508-3850-462e-8594-078539f940f9",
+        "siblingIndex": 1,
+      },
+    ],
+    "content": "123",
+    "id": "question-3553d508-3850-462e-8594-078539f940f9",
+    "isAnswer": false,
+    "parentMessageId": "57c989f9-3fa4-4dec-9ee5-c3568dd27418",
+  },
+  {
+    "children": [
+      {
+        "children": [
+          {
+            "children": [
+              {
+                "children": [
+                  {
+                    "children": [
+                      {
+                        "children": [
+                          {
+                            "children": [
+                              {
+                                "children": [
+                                  {
+                                    "children": [
+                                      {
+                                        "children": [
+                                          {
+                                            "children": [
+                                              {
+                                                "children": [
+                                                  {
+                                                    "children": [
+                                                      {
+                                                        "children": [
+                                                          {
+                                                            "children": [
+                                                              {
+                                                                "children": [],
+                                                                "content": "My number is 3e (approximately 8.15).",
+                                                                "id": "9eac3bcc-8d3b-4e56-a12b-44c34cebc719",
+                                                                "isAnswer": true,
+                                                                "parentMessageId": "question-9eac3bcc-8d3b-4e56-a12b-44c34cebc719",
+                                                                "siblingIndex": 0,
+                                                              },
+                                                            ],
+                                                            "content": "e",
+                                                            "id": "question-9eac3bcc-8d3b-4e56-a12b-44c34cebc719",
+                                                            "isAnswer": false,
+                                                            "parentMessageId": "5c56a2b3-f057-42a0-9b2c-52a35713cd8c",
+                                                          },
+                                                        ],
+                                                        "content": "My number is 2蟺 (approximately 6.28).",
+                                                        "id": "5c56a2b3-f057-42a0-9b2c-52a35713cd8c",
+                                                        "isAnswer": true,
+                                                        "parentMessageId": "question-5c56a2b3-f057-42a0-9b2c-52a35713cd8c",
+                                                        "siblingIndex": 0,
+                                                      },
+                                                    ],
+                                                    "content": "蟺",
+                                                    "id": "question-5c56a2b3-f057-42a0-9b2c-52a35713cd8c",
+                                                    "isAnswer": false,
+                                                    "parentMessageId": "46a49bb9-0881-459e-8c6a-24d20ae48d2f",
+                                                  },
+                                                ],
+                                                "content": "My number is 145.",
+                                                "id": "46a49bb9-0881-459e-8c6a-24d20ae48d2f",
+                                                "isAnswer": true,
+                                                "parentMessageId": "question-46a49bb9-0881-459e-8c6a-24d20ae48d2f",
+                                                "siblingIndex": 0,
+                                              },
+                                            ],
+                                            "content": "78",
+                                            "id": "question-46a49bb9-0881-459e-8c6a-24d20ae48d2f",
+                                            "isAnswer": false,
+                                            "parentMessageId": "3cded945-855a-4a24-aab7-43c7dd54664c",
+                                          },
+                                        ],
+                                        "content": "My number is 7.89.",
+                                        "id": "3cded945-855a-4a24-aab7-43c7dd54664c",
+                                        "isAnswer": true,
+                                        "parentMessageId": "question-3cded945-855a-4a24-aab7-43c7dd54664c",
+                                        "siblingIndex": 0,
+                                      },
+                                    ],
+                                    "content": "3.11",
+                                    "id": "question-3cded945-855a-4a24-aab7-43c7dd54664c",
+                                    "isAnswer": false,
+                                    "parentMessageId": "a956de3d-ef95-4d90-84fe-f7a26ef28cd7",
+                                  },
+                                ],
+                                "content": "My number is 22.",
+                                "id": "a956de3d-ef95-4d90-84fe-f7a26ef28cd7",
+                                "isAnswer": true,
+                                "parentMessageId": "question-a956de3d-ef95-4d90-84fe-f7a26ef28cd7",
+                                "siblingIndex": 0,
+                              },
+                            ],
+                            "content": "-5",
+                            "id": "question-a956de3d-ef95-4d90-84fe-f7a26ef28cd7",
+                            "isAnswer": false,
+                            "parentMessageId": "93bac05d-1470-4ac9-b090-fe21cd7c3d55",
+                          },
+                        ],
+                        "content": "My number is 4782.",
+                        "id": "93bac05d-1470-4ac9-b090-fe21cd7c3d55",
+                        "isAnswer": true,
+                        "parentMessageId": "question-93bac05d-1470-4ac9-b090-fe21cd7c3d55",
+                        "siblingIndex": 0,
+                      },
+                    ],
+                    "content": "3306",
+                    "id": "question-93bac05d-1470-4ac9-b090-fe21cd7c3d55",
+                    "isAnswer": false,
+                    "parentMessageId": "9e51a13b-7780-4565-98dc-f2d8c3b1758f",
+                  },
+                ],
+                "content": "My number is 2048.",
+                "id": "9e51a13b-7780-4565-98dc-f2d8c3b1758f",
+                "isAnswer": true,
+                "parentMessageId": "question-9e51a13b-7780-4565-98dc-f2d8c3b1758f",
+                "siblingIndex": 0,
+              },
+            ],
+            "content": "1024",
+            "id": "question-9e51a13b-7780-4565-98dc-f2d8c3b1758f",
+            "isAnswer": false,
+            "parentMessageId": "507f9df9-1f06-4a57-bb38-f00228c42c22",
+          },
+        ],
+        "content": "My number is 259.",
+        "id": "507f9df9-1f06-4a57-bb38-f00228c42c22",
+        "isAnswer": true,
+        "parentMessageId": "question-507f9df9-1f06-4a57-bb38-f00228c42c22",
+        "siblingIndex": 2,
+      },
+    ],
+    "content": "123",
+    "id": "question-507f9df9-1f06-4a57-bb38-f00228c42c22",
+    "isAnswer": false,
+    "parentMessageId": "57c989f9-3fa4-4dec-9ee5-c3568dd27418",
+  },
+]
+`;
+
+exports[`build chat item tree and get thread messages should work with real world messages 1`] = `
+[
+  {
+    "children": [
+      {
+        "agent_thoughts": [
+          {
+            "chain_id": null,
+            "created_at": 1726105791,
+            "files": [],
+            "id": "f9d7ff7c-3a3b-4d9a-a289-657817f4caff",
+            "message_id": "ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+            "observation": "",
+            "position": 1,
+            "thought": "Sure, I'll play! My number is 57. Your turn!",
+            "tool": "",
+            "tool_input": "",
+            "tool_labels": {},
+          },
+        ],
+        "children": [
+          {
+            "children": [
+              {
+                "agent_thoughts": [
+                  {
+                    "chain_id": null,
+                    "created_at": 1726105795,
+                    "files": [],
+                    "id": "f61a3fce-37ac-4f9d-9935-95f97e598dfe",
+                    "message_id": "73bbad14-d915-499d-87bf-0df14d40779d",
+                    "observation": "",
+                    "position": 1,
+                    "thought": "I choose 83. What's your next number?",
+                    "tool": "",
+                    "tool_input": "",
+                    "tool_labels": {},
+                  },
+                ],
+                "children": [
+                  {
+                    "children": [
+                      {
+                        "agent_thoughts": [
+                          {
+                            "chain_id": null,
+                            "created_at": 1726105799,
+                            "files": [],
+                            "id": "9730d587-9268-4683-9dd9-91a1cab9510b",
+                            "message_id": "4c5d0841-1206-463e-95d8-71f812877658",
+                            "observation": "",
+                            "position": 1,
+                            "thought": "I'll go with 112. Your turn!",
+                            "tool": "",
+                            "tool_input": "",
+                            "tool_labels": {},
+                          },
+                        ],
+                        "children": [],
+                        "content": "I'll go with 112. Your turn!",
+                        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                        "feedbackDisabled": false,
+                        "id": "4c5d0841-1206-463e-95d8-71f812877658",
+                        "input": {
+                          "inputs": {},
+                          "query": "99",
+                        },
+                        "isAnswer": true,
+                        "log": [
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "Sure, I'll play! My number is 57. Your turn!",
+                          },
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "58",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "I choose 83. What's your next number?",
+                          },
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "99",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "I'll go with 112. Your turn!",
+                          },
+                        ],
+                        "message_files": [],
+                        "more": {
+                          "latency": "1.49",
+                          "time": "09/11/2024 09:50 PM",
+                          "tokens": 86,
+                        },
+                        "parentMessageId": "question-4c5d0841-1206-463e-95d8-71f812877658",
+                        "siblingIndex": 0,
+                        "workflow_run_id": null,
+                      },
+                    ],
+                    "content": "99",
+                    "id": "question-4c5d0841-1206-463e-95d8-71f812877658",
+                    "isAnswer": false,
+                    "message_files": [],
+                    "parentMessageId": "73bbad14-d915-499d-87bf-0df14d40779d",
+                  },
+                ],
+                "content": "I choose 83. What's your next number?",
+                "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                "feedbackDisabled": false,
+                "id": "73bbad14-d915-499d-87bf-0df14d40779d",
+                "input": {
+                  "inputs": {},
+                  "query": "58",
+                },
+                "isAnswer": true,
+                "log": [
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "Sure, I'll play! My number is 57. Your turn!",
+                  },
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "58",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "I choose 83. What's your next number?",
+                  },
+                ],
+                "message_files": [],
+                "more": {
+                  "latency": "1.33",
+                  "time": "09/11/2024 09:49 PM",
+                  "tokens": 68,
+                },
+                "parentMessageId": "question-73bbad14-d915-499d-87bf-0df14d40779d",
+                "siblingIndex": 0,
+                "workflow_run_id": null,
+              },
+            ],
+            "content": "58",
+            "id": "question-73bbad14-d915-499d-87bf-0df14d40779d",
+            "isAnswer": false,
+            "message_files": [],
+            "parentMessageId": "ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+          },
+        ],
+        "content": "Sure, I'll play! My number is 57. Your turn!",
+        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+        "feedbackDisabled": false,
+        "id": "ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+        "input": {
+          "inputs": {},
+          "query": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+        },
+        "isAnswer": true,
+        "log": [
+          {
+            "files": [],
+            "role": "user",
+            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "Sure, I'll play! My number is 57. Your turn!",
+          },
+        ],
+        "message_files": [],
+        "more": {
+          "latency": "1.56",
+          "time": "09/11/2024 09:49 PM",
+          "tokens": 49,
+        },
+        "parentMessageId": "question-ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+        "siblingIndex": 0,
+        "workflow_run_id": null,
+      },
+    ],
+    "content": "Let's play a game, I say a number , and you response me with another bigger, yet random-looking number. I'll start first, 38",
+    "id": "question-ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+    "isAnswer": false,
+    "message_files": [],
+  },
+  {
+    "children": [
+      {
+        "agent_thoughts": [
+          {
+            "chain_id": null,
+            "created_at": 1726105809,
+            "files": [],
+            "id": "1019cd79-d141-4f9f-880a-fc1441cfd802",
+            "message_id": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+            "observation": "",
+            "position": 1,
+            "thought": "Sure! My number is 54. Your turn!",
+            "tool": "",
+            "tool_input": "",
+            "tool_labels": {},
+          },
+        ],
+        "children": [
+          {
+            "children": [
+              {
+                "agent_thoughts": [
+                  {
+                    "chain_id": null,
+                    "created_at": 1726105822,
+                    "files": [],
+                    "id": "0773bec7-b992-4a53-92b2-20ebaeae8798",
+                    "message_id": "324bce32-c98c-435d-a66b-bac974ebb5ed",
+                    "observation": "",
+                    "position": 1,
+                    "thought": "My number is 4729. Your turn!",
+                    "tool": "",
+                    "tool_input": "",
+                    "tool_labels": {},
+                  },
+                ],
+                "children": [],
+                "content": "My number is 4729. Your turn!",
+                "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                "feedbackDisabled": false,
+                "id": "324bce32-c98c-435d-a66b-bac974ebb5ed",
+                "input": {
+                  "inputs": {},
+                  "query": "3306",
+                },
+                "isAnswer": true,
+                "log": [
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "Sure! My number is 54. Your turn!",
+                  },
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "3306",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "My number is 4729. Your turn!",
+                  },
+                ],
+                "message_files": [],
+                "more": {
+                  "latency": "1.30",
+                  "time": "09/11/2024 09:50 PM",
+                  "tokens": 66,
+                },
+                "parentMessageId": "question-324bce32-c98c-435d-a66b-bac974ebb5ed",
+                "siblingIndex": 0,
+                "workflow_run_id": null,
+              },
+            ],
+            "content": "3306",
+            "id": "question-324bce32-c98c-435d-a66b-bac974ebb5ed",
+            "isAnswer": false,
+            "message_files": [],
+            "parentMessageId": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+          },
+          {
+            "children": [
+              {
+                "agent_thoughts": [
+                  {
+                    "chain_id": null,
+                    "created_at": 1726107812,
+                    "files": [],
+                    "id": "5ca650f3-982c-4399-8b95-9ea241c76707",
+                    "message_id": "684b5396-4e91-4043-88e9-aabe48b21acc",
+                    "observation": "",
+                    "position": 1,
+                    "thought": "My number is 4821. Your turn!",
+                    "tool": "",
+                    "tool_input": "",
+                    "tool_labels": {},
+                  },
+                ],
+                "children": [
+                  {
+                    "children": [
+                      {
+                        "agent_thoughts": [
+                          {
+                            "chain_id": null,
+                            "created_at": 1726111024,
+                            "files": [],
+                            "id": "095cacab-afad-4387-a41d-1662578b8b13",
+                            "message_id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                            "observation": "",
+                            "position": 1,
+                            "thought": "My number is 1456. Your turn!",
+                            "tool": "",
+                            "tool_input": "",
+                            "tool_labels": {},
+                          },
+                        ],
+                        "children": [],
+                        "content": "My number is 1456. Your turn!",
+                        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                        "feedbackDisabled": false,
+                        "id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                        "input": {
+                          "inputs": {},
+                          "query": "1003",
+                        },
+                        "isAnswer": true,
+                        "log": [
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "Sure! My number is 54. Your turn!",
+                          },
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "3306",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "My number is 4821. Your turn!",
+                          },
+                          {
+                            "files": [],
+                            "role": "user",
+                            "text": "1003",
+                          },
+                          {
+                            "files": [],
+                            "role": "assistant",
+                            "text": "My number is 1456. Your turn!",
+                          },
+                        ],
+                        "message_files": [],
+                        "more": {
+                          "latency": "1.38",
+                          "time": "09/11/2024 11:17 PM",
+                          "tokens": 86,
+                        },
+                        "parentMessageId": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                        "siblingIndex": 0,
+                        "workflow_run_id": null,
+                      },
+                    ],
+                    "content": "1003",
+                    "id": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+                    "isAnswer": false,
+                    "message_files": [],
+                    "parentMessageId": "684b5396-4e91-4043-88e9-aabe48b21acc",
+                  },
+                ],
+                "content": "My number is 4821. Your turn!",
+                "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+                "feedbackDisabled": false,
+                "id": "684b5396-4e91-4043-88e9-aabe48b21acc",
+                "input": {
+                  "inputs": {},
+                  "query": "3306",
+                },
+                "isAnswer": true,
+                "log": [
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "Sure! My number is 54. Your turn!",
+                  },
+                  {
+                    "files": [],
+                    "role": "user",
+                    "text": "3306",
+                  },
+                  {
+                    "files": [],
+                    "role": "assistant",
+                    "text": "My number is 4821. Your turn!",
+                  },
+                ],
+                "message_files": [],
+                "more": {
+                  "latency": "1.48",
+                  "time": "09/11/2024 10:23 PM",
+                  "tokens": 66,
+                },
+                "parentMessageId": "question-684b5396-4e91-4043-88e9-aabe48b21acc",
+                "siblingIndex": 1,
+                "workflow_run_id": null,
+              },
+            ],
+            "content": "3306",
+            "id": "question-684b5396-4e91-4043-88e9-aabe48b21acc",
+            "isAnswer": false,
+            "message_files": [],
+            "parentMessageId": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+          },
+        ],
+        "content": "Sure! My number is 54. Your turn!",
+        "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+        "feedbackDisabled": false,
+        "id": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+        "input": {
+          "inputs": {},
+          "query": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+        },
+        "isAnswer": true,
+        "log": [
+          {
+            "files": [],
+            "role": "user",
+            "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+          },
+          {
+            "files": [],
+            "role": "assistant",
+            "text": "Sure! My number is 54. Your turn!",
+          },
+        ],
+        "message_files": [],
+        "more": {
+          "latency": "1.52",
+          "time": "09/11/2024 09:50 PM",
+          "tokens": 46,
+        },
+        "parentMessageId": "question-cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+        "siblingIndex": 1,
+        "workflow_run_id": null,
+      },
+    ],
+    "content": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+    "id": "question-cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+    "isAnswer": false,
+    "message_files": [],
+  },
+]
+`;
diff --git a/app/components/base/chat/__tests__/branchedTestMessages.json b/app/components/base/chat/__tests__/branchedTestMessages.json
new file mode 100644
index 0000000..30e0a82
--- /dev/null
+++ b/app/components/base/chat/__tests__/branchedTestMessages.json
@@ -0,0 +1,42 @@
+[
+  {
+    "id": "question-1",
+    "isAnswer": false,
+    "parentMessageId": null
+  },
+  {
+    "id": "1",
+    "isAnswer": true,
+    "parentMessageId": "question-1"
+  },
+  {
+    "id": "question-2",
+    "isAnswer": false,
+    "parentMessageId": "1"
+  },
+  {
+    "id": "2",
+    "isAnswer": true,
+    "parentMessageId": "question-2"
+  },
+  {
+    "id": "question-3",
+    "isAnswer": false,
+    "parentMessageId": "2"
+  },
+  {
+    "id": "3",
+    "isAnswer": true,
+    "parentMessageId": "question-3"
+  },
+  {
+    "id": "question-4",
+    "isAnswer": false,
+    "parentMessageId": "1"
+  },
+  {
+    "id": "4",
+    "isAnswer": true,
+    "parentMessageId": "question-4"
+  }
+]
diff --git a/app/components/base/chat/__tests__/legacyTestMessages.json b/app/components/base/chat/__tests__/legacyTestMessages.json
new file mode 100644
index 0000000..2dab589
--- /dev/null
+++ b/app/components/base/chat/__tests__/legacyTestMessages.json
@@ -0,0 +1,42 @@
+[
+  {
+    "id": "question-1",
+    "isAnswer": false,
+    "parentMessageId": "00000000-0000-0000-0000-000000000000"
+  },
+  {
+    "id": "1",
+    "isAnswer": true,
+    "parentMessageId": "question-1"
+  },
+  {
+    "id": "question-2",
+    "isAnswer": false,
+    "parentMessageId": "00000000-0000-0000-0000-000000000000"
+  },
+  {
+    "id": "2",
+    "isAnswer": true,
+    "parentMessageId": "question-2"
+  },
+  {
+    "id": "question-3",
+    "isAnswer": false,
+    "parentMessageId": "00000000-0000-0000-0000-000000000000"
+  },
+  {
+    "id": "3",
+    "isAnswer": true,
+    "parentMessageId": "question-3"
+  },
+  {
+    "id": "question-4",
+    "isAnswer": false,
+    "parentMessageId": "00000000-0000-0000-0000-000000000000"
+  },
+  {
+    "id": "4",
+    "isAnswer": true,
+    "parentMessageId": "question-4"
+  }
+]
diff --git a/app/components/base/chat/__tests__/mixedTestMessages.json b/app/components/base/chat/__tests__/mixedTestMessages.json
new file mode 100644
index 0000000..14789d9
--- /dev/null
+++ b/app/components/base/chat/__tests__/mixedTestMessages.json
@@ -0,0 +1,42 @@
+[
+  {
+    "id": "question-1",
+    "isAnswer": false,
+    "parentMessageId": "00000000-0000-0000-0000-000000000000"
+  },
+  {
+    "id": "1",
+    "isAnswer": true,
+    "parentMessageId": "question-1"
+  },
+  {
+    "id": "question-2",
+    "isAnswer": false,
+    "parentMessageId": "00000000-0000-0000-0000-000000000000"
+  },
+  {
+    "id": "2",
+    "isAnswer": true,
+    "parentMessageId": "question-2"
+  },
+  {
+    "id": "question-3",
+    "isAnswer": false,
+    "parentMessageId": "2"
+  },
+  {
+    "id": "3",
+    "isAnswer": true,
+    "parentMessageId": "question-3"
+  },
+  {
+    "id": "question-4",
+    "isAnswer": false,
+    "parentMessageId": "1"
+  },
+  {
+    "id": "4",
+    "isAnswer": true,
+    "parentMessageId": "question-4"
+  }
+]
diff --git a/app/components/base/chat/__tests__/multiRootNodesMessages.json b/app/components/base/chat/__tests__/multiRootNodesMessages.json
new file mode 100644
index 0000000..782ccb7
--- /dev/null
+++ b/app/components/base/chat/__tests__/multiRootNodesMessages.json
@@ -0,0 +1,52 @@
+[
+  {
+    "id": "question-1",
+    "isAnswer": false,
+    "parentMessageId": null
+  },
+  {
+    "id": "1",
+    "isAnswer": true,
+    "parentMessageId": "question-1"
+  },
+  {
+    "id": "question-2",
+    "isAnswer": false,
+    "parentMessageId": "1"
+  },
+  {
+    "id": "2",
+    "isAnswer": true,
+    "parentMessageId": "question-2"
+  },
+  {
+    "id": "question-3",
+    "isAnswer": false,
+    "parentMessageId": "2"
+  },
+  {
+    "id": "3",
+    "isAnswer": true,
+    "parentMessageId": "question-3"
+  },
+  {
+    "id": "question-4",
+    "isAnswer": false,
+    "parentMessageId": "1"
+  },
+  {
+    "id": "4",
+    "isAnswer": true,
+    "parentMessageId": "question-4"
+  },
+  {
+    "id": "question-5",
+    "isAnswer": false,
+    "parentMessageId": null
+  },
+  {
+    "id": "5",
+    "isAnswer": true,
+    "parentMessageId": "question-5"
+  }
+]
diff --git a/app/components/base/chat/__tests__/multiRootNodesWithLegacyTestMessages.json b/app/components/base/chat/__tests__/multiRootNodesWithLegacyTestMessages.json
new file mode 100644
index 0000000..5eadc72
--- /dev/null
+++ b/app/components/base/chat/__tests__/multiRootNodesWithLegacyTestMessages.json
@@ -0,0 +1,52 @@
+[
+  {
+    "id": "question-1",
+    "isAnswer": false,
+    "parentMessageId": "00000000-0000-0000-0000-000000000000"
+  },
+  {
+    "id": "1",
+    "isAnswer": true,
+    "parentMessageId": "question-1"
+  },
+  {
+    "id": "question-2",
+    "isAnswer": false,
+    "parentMessageId": "00000000-0000-0000-0000-000000000000"
+  },
+  {
+    "id": "2",
+    "isAnswer": true,
+    "parentMessageId": "question-2"
+  },
+  {
+    "id": "question-3",
+    "isAnswer": false,
+    "parentMessageId": "00000000-0000-0000-0000-000000000000"
+  },
+  {
+    "id": "3",
+    "isAnswer": true,
+    "parentMessageId": "question-3"
+  },
+  {
+    "id": "question-4",
+    "isAnswer": false,
+    "parentMessageId": "1"
+  },
+  {
+    "id": "4",
+    "isAnswer": true,
+    "parentMessageId": "question-4"
+  },
+  {
+    "id": "question-5",
+    "isAnswer": false,
+    "parentMessageId": null
+  },
+  {
+    "id": "5",
+    "isAnswer": true,
+    "parentMessageId": "question-5"
+  }
+]
diff --git a/app/components/base/chat/__tests__/partialMessages.json b/app/components/base/chat/__tests__/partialMessages.json
new file mode 100644
index 0000000..916c6ad
--- /dev/null
+++ b/app/components/base/chat/__tests__/partialMessages.json
@@ -0,0 +1,122 @@
+[
+  {
+    "id": "question-ebb73fe2-15de-46dd-aab5-75416d8448eb",
+    "content": "123",
+    "isAnswer": false,
+    "parentMessageId": "57c989f9-3fa4-4dec-9ee5-c3568dd27418"
+  },
+  {
+    "id": "ebb73fe2-15de-46dd-aab5-75416d8448eb",
+    "content": "237.",
+    "isAnswer": true,
+    "parentMessageId": "question-ebb73fe2-15de-46dd-aab5-75416d8448eb"
+  },
+  {
+    "id": "question-3553d508-3850-462e-8594-078539f940f9",
+    "content": "123",
+    "isAnswer": false,
+    "parentMessageId": "57c989f9-3fa4-4dec-9ee5-c3568dd27418"
+  },
+  {
+    "id": "3553d508-3850-462e-8594-078539f940f9",
+    "content": "My number is 256.",
+    "isAnswer": true,
+    "parentMessageId": "question-3553d508-3850-462e-8594-078539f940f9"
+  },
+  {
+    "id": "question-507f9df9-1f06-4a57-bb38-f00228c42c22",
+    "content": "123",
+    "isAnswer": false,
+    "parentMessageId": "57c989f9-3fa4-4dec-9ee5-c3568dd27418"
+  },
+  {
+    "id": "507f9df9-1f06-4a57-bb38-f00228c42c22",
+    "content": "My number is 259.",
+    "isAnswer": true,
+    "parentMessageId": "question-507f9df9-1f06-4a57-bb38-f00228c42c22"
+  },
+  {
+    "id": "question-9e51a13b-7780-4565-98dc-f2d8c3b1758f",
+    "content": "1024",
+    "isAnswer": false,
+    "parentMessageId": "507f9df9-1f06-4a57-bb38-f00228c42c22"
+  },
+  {
+    "id": "9e51a13b-7780-4565-98dc-f2d8c3b1758f",
+    "content": "My number is 2048.",
+    "isAnswer": true,
+    "parentMessageId": "question-9e51a13b-7780-4565-98dc-f2d8c3b1758f"
+  },
+  {
+    "id": "question-93bac05d-1470-4ac9-b090-fe21cd7c3d55",
+    "content": "3306",
+    "isAnswer": false,
+    "parentMessageId": "9e51a13b-7780-4565-98dc-f2d8c3b1758f"
+  },
+  {
+    "id": "93bac05d-1470-4ac9-b090-fe21cd7c3d55",
+    "content": "My number is 4782.",
+    "isAnswer": true,
+    "parentMessageId": "question-93bac05d-1470-4ac9-b090-fe21cd7c3d55"
+  },
+  {
+    "id": "question-a956de3d-ef95-4d90-84fe-f7a26ef28cd7",
+    "content": "-5",
+    "isAnswer": false,
+    "parentMessageId": "93bac05d-1470-4ac9-b090-fe21cd7c3d55"
+  },
+  {
+    "id": "a956de3d-ef95-4d90-84fe-f7a26ef28cd7",
+    "content": "My number is 22.",
+    "isAnswer": true,
+    "parentMessageId": "question-a956de3d-ef95-4d90-84fe-f7a26ef28cd7"
+  },
+  {
+    "id": "question-3cded945-855a-4a24-aab7-43c7dd54664c",
+    "content": "3.11",
+    "isAnswer": false,
+    "parentMessageId": "a956de3d-ef95-4d90-84fe-f7a26ef28cd7"
+  },
+  {
+    "id": "3cded945-855a-4a24-aab7-43c7dd54664c",
+    "content": "My number is 7.89.",
+    "isAnswer": true,
+    "parentMessageId": "question-3cded945-855a-4a24-aab7-43c7dd54664c"
+  },
+  {
+    "id": "question-46a49bb9-0881-459e-8c6a-24d20ae48d2f",
+    "content": "78",
+    "isAnswer": false,
+    "parentMessageId": "3cded945-855a-4a24-aab7-43c7dd54664c"
+  },
+  {
+    "id": "46a49bb9-0881-459e-8c6a-24d20ae48d2f",
+    "content": "My number is 145.",
+    "isAnswer": true,
+    "parentMessageId": "question-46a49bb9-0881-459e-8c6a-24d20ae48d2f"
+  },
+  {
+    "id": "question-5c56a2b3-f057-42a0-9b2c-52a35713cd8c",
+    "content": "蟺",
+    "isAnswer": false,
+    "parentMessageId": "46a49bb9-0881-459e-8c6a-24d20ae48d2f"
+  },
+  {
+    "id": "5c56a2b3-f057-42a0-9b2c-52a35713cd8c",
+    "content": "My number is 2蟺 (approximately 6.28).",
+    "isAnswer": true,
+    "parentMessageId": "question-5c56a2b3-f057-42a0-9b2c-52a35713cd8c"
+  },
+  {
+    "id": "question-9eac3bcc-8d3b-4e56-a12b-44c34cebc719",
+    "content": "e",
+    "isAnswer": false,
+    "parentMessageId": "5c56a2b3-f057-42a0-9b2c-52a35713cd8c"
+  },
+  {
+    "id": "9eac3bcc-8d3b-4e56-a12b-44c34cebc719",
+    "content": "My number is 3e (approximately 8.15).",
+    "isAnswer": true,
+    "parentMessageId": "question-9eac3bcc-8d3b-4e56-a12b-44c34cebc719"
+  }
+]
diff --git a/app/components/base/chat/__tests__/realWorldMessages.json b/app/components/base/chat/__tests__/realWorldMessages.json
new file mode 100644
index 0000000..858052c
--- /dev/null
+++ b/app/components/base/chat/__tests__/realWorldMessages.json
@@ -0,0 +1,441 @@
+[
+  {
+    "id": "question-ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+    "content": "Let's play a game, I say a number , and you response me with another bigger, yet random-looking number. I'll start first, 38",
+    "isAnswer": false,
+    "message_files": []
+  },
+  {
+    "id": "ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+    "content": "Sure, I'll play! My number is 57. Your turn!",
+    "agent_thoughts": [
+      {
+        "id": "f9d7ff7c-3a3b-4d9a-a289-657817f4caff",
+        "chain_id": null,
+        "message_id": "ff4c2b43-48a5-47ad-9dc5-08b34ddba61b",
+        "position": 1,
+        "thought": "Sure, I'll play! My number is 57. Your turn!",
+        "tool": "",
+        "tool_labels": {},
+        "tool_input": "",
+        "created_at": 1726105791,
+        "observation": "",
+        "files": []
+      }
+    ],
+    "feedbackDisabled": false,
+    "isAnswer": true,
+    "message_files": [],
+    "log": [
+      {
+        "role": "user",
+        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+        "files": []
+      },
+      {
+        "role": "assistant",
+        "text": "Sure, I'll play! My number is 57. Your turn!",
+        "files": []
+      }
+    ],
+    "workflow_run_id": null,
+    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+    "input": {
+      "inputs": {},
+      "query": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38"
+    },
+    "more": {
+      "time": "09/11/2024 09:49 PM",
+      "tokens": 49,
+      "latency": "1.56"
+    },
+    "parentMessageId": "question-ff4c2b43-48a5-47ad-9dc5-08b34ddba61b"
+  },
+  {
+    "id": "question-73bbad14-d915-499d-87bf-0df14d40779d",
+    "content": "58",
+    "isAnswer": false,
+    "message_files": [],
+    "parentMessageId": "ff4c2b43-48a5-47ad-9dc5-08b34ddba61b"
+  },
+  {
+    "id": "73bbad14-d915-499d-87bf-0df14d40779d",
+    "content": "I choose 83. What's your next number?",
+    "agent_thoughts": [
+      {
+        "id": "f61a3fce-37ac-4f9d-9935-95f97e598dfe",
+        "chain_id": null,
+        "message_id": "73bbad14-d915-499d-87bf-0df14d40779d",
+        "position": 1,
+        "thought": "I choose 83. What's your next number?",
+        "tool": "",
+        "tool_labels": {},
+        "tool_input": "",
+        "created_at": 1726105795,
+        "observation": "",
+        "files": []
+      }
+    ],
+    "feedbackDisabled": false,
+    "isAnswer": true,
+    "message_files": [],
+    "log": [
+      {
+        "role": "user",
+        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+        "files": []
+      },
+      {
+        "role": "assistant",
+        "text": "Sure, I'll play! My number is 57. Your turn!",
+        "files": []
+      },
+      {
+        "role": "user",
+        "text": "58",
+        "files": []
+      },
+      {
+        "role": "assistant",
+        "text": "I choose 83. What's your next number?",
+        "files": []
+      }
+    ],
+    "workflow_run_id": null,
+    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+    "input": {
+      "inputs": {},
+      "query": "58"
+    },
+    "more": {
+      "time": "09/11/2024 09:49 PM",
+      "tokens": 68,
+      "latency": "1.33"
+    },
+    "parentMessageId": "question-73bbad14-d915-499d-87bf-0df14d40779d"
+  },
+  {
+    "id": "question-4c5d0841-1206-463e-95d8-71f812877658",
+    "content": "99",
+    "isAnswer": false,
+    "message_files": [],
+    "parentMessageId": "73bbad14-d915-499d-87bf-0df14d40779d"
+  },
+  {
+    "id": "4c5d0841-1206-463e-95d8-71f812877658",
+    "content": "I'll go with 112. Your turn!",
+    "agent_thoughts": [
+      {
+        "id": "9730d587-9268-4683-9dd9-91a1cab9510b",
+        "chain_id": null,
+        "message_id": "4c5d0841-1206-463e-95d8-71f812877658",
+        "position": 1,
+        "thought": "I'll go with 112. Your turn!",
+        "tool": "",
+        "tool_labels": {},
+        "tool_input": "",
+        "created_at": 1726105799,
+        "observation": "",
+        "files": []
+      }
+    ],
+    "feedbackDisabled": false,
+    "isAnswer": true,
+    "message_files": [],
+    "log": [
+      {
+        "role": "user",
+        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+        "files": []
+      },
+      {
+        "role": "assistant",
+        "text": "Sure, I'll play! My number is 57. Your turn!",
+        "files": []
+      },
+      {
+        "role": "user",
+        "text": "58",
+        "files": []
+      },
+      {
+        "role": "assistant",
+        "text": "I choose 83. What's your next number?",
+        "files": []
+      },
+      {
+        "role": "user",
+        "text": "99",
+        "files": []
+      },
+      {
+        "role": "assistant",
+        "text": "I'll go with 112. Your turn!",
+        "files": []
+      }
+    ],
+    "workflow_run_id": null,
+    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+    "input": {
+      "inputs": {},
+      "query": "99"
+    },
+    "more": {
+      "time": "09/11/2024 09:50 PM",
+      "tokens": 86,
+      "latency": "1.49"
+    },
+    "parentMessageId": "question-4c5d0841-1206-463e-95d8-71f812877658"
+  },
+  {
+    "id": "question-cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+    "content": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+    "isAnswer": false,
+    "message_files": []
+  },
+  {
+    "id": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+    "content": "Sure! My number is 54. Your turn!",
+    "agent_thoughts": [
+      {
+        "id": "1019cd79-d141-4f9f-880a-fc1441cfd802",
+        "chain_id": null,
+        "message_id": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd",
+        "position": 1,
+        "thought": "Sure! My number is 54. Your turn!",
+        "tool": "",
+        "tool_labels": {},
+        "tool_input": "",
+        "created_at": 1726105809,
+        "observation": "",
+        "files": []
+      }
+    ],
+    "feedbackDisabled": false,
+    "isAnswer": true,
+    "message_files": [],
+    "log": [
+      {
+        "role": "user",
+        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+        "files": []
+      },
+      {
+        "role": "assistant",
+        "text": "Sure! My number is 54. Your turn!",
+        "files": []
+      }
+    ],
+    "workflow_run_id": null,
+    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+    "input": {
+      "inputs": {},
+      "query": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38"
+    },
+    "more": {
+      "time": "09/11/2024 09:50 PM",
+      "tokens": 46,
+      "latency": "1.52"
+    },
+    "parentMessageId": "question-cd5affb0-7bc2-4a6f-be7e-25e74595c9dd"
+  },
+  {
+    "id": "question-324bce32-c98c-435d-a66b-bac974ebb5ed",
+    "content": "3306",
+    "isAnswer": false,
+    "message_files": [],
+    "parentMessageId": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd"
+  },
+  {
+    "id": "324bce32-c98c-435d-a66b-bac974ebb5ed",
+    "content": "My number is 4729. Your turn!",
+    "agent_thoughts": [
+      {
+        "id": "0773bec7-b992-4a53-92b2-20ebaeae8798",
+        "chain_id": null,
+        "message_id": "324bce32-c98c-435d-a66b-bac974ebb5ed",
+        "position": 1,
+        "thought": "My number is 4729. Your turn!",
+        "tool": "",
+        "tool_labels": {},
+        "tool_input": "",
+        "created_at": 1726105822,
+        "observation": "",
+        "files": []
+      }
+    ],
+    "feedbackDisabled": false,
+    "isAnswer": true,
+    "message_files": [],
+    "log": [
+      {
+        "role": "user",
+        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+        "files": []
+      },
+      {
+        "role": "assistant",
+        "text": "Sure! My number is 54. Your turn!",
+        "files": []
+      },
+      {
+        "role": "user",
+        "text": "3306",
+        "files": []
+      },
+      {
+        "role": "assistant",
+        "text": "My number is 4729. Your turn!",
+        "files": []
+      }
+    ],
+    "workflow_run_id": null,
+    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+    "input": {
+      "inputs": {},
+      "query": "3306"
+    },
+    "more": {
+      "time": "09/11/2024 09:50 PM",
+      "tokens": 66,
+      "latency": "1.30"
+    },
+    "parentMessageId": "question-324bce32-c98c-435d-a66b-bac974ebb5ed"
+  },
+  {
+    "id": "question-684b5396-4e91-4043-88e9-aabe48b21acc",
+    "content": "3306",
+    "isAnswer": false,
+    "message_files": [],
+    "parentMessageId": "cd5affb0-7bc2-4a6f-be7e-25e74595c9dd"
+  },
+  {
+    "id": "684b5396-4e91-4043-88e9-aabe48b21acc",
+    "content": "My number is 4821. Your turn!",
+    "agent_thoughts": [
+      {
+        "id": "5ca650f3-982c-4399-8b95-9ea241c76707",
+        "chain_id": null,
+        "message_id": "684b5396-4e91-4043-88e9-aabe48b21acc",
+        "position": 1,
+        "thought": "My number is 4821. Your turn!",
+        "tool": "",
+        "tool_labels": {},
+        "tool_input": "",
+        "created_at": 1726107812,
+        "observation": "",
+        "files": []
+      }
+    ],
+    "feedbackDisabled": false,
+    "isAnswer": true,
+    "message_files": [],
+    "log": [
+      {
+        "role": "user",
+        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+        "files": []
+      },
+      {
+        "role": "assistant",
+        "text": "Sure! My number is 54. Your turn!",
+        "files": []
+      },
+      {
+        "role": "user",
+        "text": "3306",
+        "files": []
+      },
+      {
+        "role": "assistant",
+        "text": "My number is 4821. Your turn!",
+        "files": []
+      }
+    ],
+    "workflow_run_id": null,
+    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+    "input": {
+      "inputs": {},
+      "query": "3306"
+    },
+    "more": {
+      "time": "09/11/2024 10:23 PM",
+      "tokens": 66,
+      "latency": "1.48"
+    },
+    "parentMessageId": "question-684b5396-4e91-4043-88e9-aabe48b21acc"
+  },
+  {
+    "id": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c",
+    "content": "1003",
+    "isAnswer": false,
+    "message_files": [],
+    "parentMessageId": "684b5396-4e91-4043-88e9-aabe48b21acc"
+  },
+  {
+    "id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+    "content": "My number is 1456. Your turn!",
+    "agent_thoughts": [
+      {
+        "id": "095cacab-afad-4387-a41d-1662578b8b13",
+        "chain_id": null,
+        "message_id": "19904a7b-7494-4ed8-b72c-1d18668cea8c",
+        "position": 1,
+        "thought": "My number is 1456. Your turn!",
+        "tool": "",
+        "tool_labels": {},
+        "tool_input": "",
+        "created_at": 1726111024,
+        "observation": "",
+        "files": []
+      }
+    ],
+    "feedbackDisabled": false,
+    "isAnswer": true,
+    "message_files": [],
+    "log": [
+      {
+        "role": "user",
+        "text": "Let's play a game, I say a number , and you response me with another bigger, yet randomly number. I'll start first, 38",
+        "files": []
+      },
+      {
+        "role": "assistant",
+        "text": "Sure! My number is 54. Your turn!",
+        "files": []
+      },
+      {
+        "role": "user",
+        "text": "3306",
+        "files": []
+      },
+      {
+        "role": "assistant",
+        "text": "My number is 4821. Your turn!",
+        "files": []
+      },
+      {
+        "role": "user",
+        "text": "1003",
+        "files": []
+      },
+      {
+        "role": "assistant",
+        "text": "My number is 1456. Your turn!",
+        "files": []
+      }
+    ],
+    "workflow_run_id": null,
+    "conversationId": "dd6c9cfd-2656-48ec-bd51-2139c1790d80",
+    "input": {
+      "inputs": {},
+      "query": "1003"
+    },
+    "more": {
+      "time": "09/11/2024 11:17 PM",
+      "tokens": 86,
+      "latency": "1.38"
+    },
+    "parentMessageId": "question-19904a7b-7494-4ed8-b72c-1d18668cea8c"
+  }
+]
diff --git a/app/components/base/chat/__tests__/utils.spec.ts b/app/components/base/chat/__tests__/utils.spec.ts
new file mode 100644
index 0000000..3dc484c
--- /dev/null
+++ b/app/components/base/chat/__tests__/utils.spec.ts
@@ -0,0 +1,271 @@
+import { get } from 'lodash-es'
+import { buildChatItemTree, getThreadMessages } from '../utils'
+import type { ChatItemInTree } from '../types'
+import branchedTestMessages from './branchedTestMessages.json'
+import legacyTestMessages from './legacyTestMessages.json'
+import mixedTestMessages from './mixedTestMessages.json'
+import multiRootNodesMessages from './multiRootNodesMessages.json'
+import multiRootNodesWithLegacyTestMessages from './multiRootNodesWithLegacyTestMessages.json'
+import realWorldMessages from './realWorldMessages.json'
+import partialMessages from './partialMessages.json'
+
+function visitNode(tree: ChatItemInTree | ChatItemInTree[], path: string): ChatItemInTree {
+  return get(tree, path)
+}
+
+describe('build chat item tree and get thread messages', () => {
+  const tree1 = buildChatItemTree(branchedTestMessages as ChatItemInTree[])
+
+  it('should build chat item tree1', () => {
+    const a1 = visitNode(tree1, '0.children.0')
+    expect(a1.id).toBe('1')
+    expect(a1.children).toHaveLength(2)
+
+    const a2 = visitNode(a1, 'children.0.children.0')
+    expect(a2.id).toBe('2')
+    expect(a2.siblingIndex).toBe(0)
+
+    const a3 = visitNode(a2, 'children.0.children.0')
+    expect(a3.id).toBe('3')
+
+    const a4 = visitNode(a1, 'children.1.children.0')
+    expect(a4.id).toBe('4')
+    expect(a4.siblingIndex).toBe(1)
+  })
+
+  it('should get thread messages from tree1, using the last message as the target', () => {
+    const threadChatItems1_1 = getThreadMessages(tree1)
+    expect(threadChatItems1_1).toHaveLength(4)
+
+    const q1 = visitNode(threadChatItems1_1, '0')
+    const a1 = visitNode(threadChatItems1_1, '1')
+    const q4 = visitNode(threadChatItems1_1, '2')
+    const a4 = visitNode(threadChatItems1_1, '3')
+
+    expect(q1.id).toBe('question-1')
+    expect(a1.id).toBe('1')
+    expect(q4.id).toBe('question-4')
+    expect(a4.id).toBe('4')
+
+    expect(a4.siblingCount).toBe(2)
+    expect(a4.siblingIndex).toBe(1)
+  })
+
+  it('should get thread messages from tree1, using the message with id 3 as the target', () => {
+    const threadChatItems1_2 = getThreadMessages(tree1, '3')
+    expect(threadChatItems1_2).toHaveLength(6)
+
+    const q1 = visitNode(threadChatItems1_2, '0')
+    const a1 = visitNode(threadChatItems1_2, '1')
+    const q2 = visitNode(threadChatItems1_2, '2')
+    const a2 = visitNode(threadChatItems1_2, '3')
+    const q3 = visitNode(threadChatItems1_2, '4')
+    const a3 = visitNode(threadChatItems1_2, '5')
+
+    expect(q1.id).toBe('question-1')
+    expect(a1.id).toBe('1')
+    expect(q2.id).toBe('question-2')
+    expect(a2.id).toBe('2')
+    expect(q3.id).toBe('question-3')
+    expect(a3.id).toBe('3')
+
+    expect(a2.siblingCount).toBe(2)
+    expect(a2.siblingIndex).toBe(0)
+  })
+
+  const tree2 = buildChatItemTree(legacyTestMessages as ChatItemInTree[])
+  it('should work with legacy chat items', () => {
+    expect(tree2).toHaveLength(1)
+    const q1 = visitNode(tree2, '0')
+    const a1 = visitNode(q1, 'children.0')
+    const q2 = visitNode(a1, 'children.0')
+    const a2 = visitNode(q2, 'children.0')
+    const q3 = visitNode(a2, 'children.0')
+    const a3 = visitNode(q3, 'children.0')
+    const q4 = visitNode(a3, 'children.0')
+    const a4 = visitNode(q4, 'children.0')
+
+    expect(q1.id).toBe('question-1')
+    expect(a1.id).toBe('1')
+    expect(q2.id).toBe('question-2')
+    expect(a2.id).toBe('2')
+    expect(q3.id).toBe('question-3')
+    expect(a3.id).toBe('3')
+    expect(q4.id).toBe('question-4')
+    expect(a4.id).toBe('4')
+  })
+
+  it('should get thread messages from tree2, using the last message as the target', () => {
+    const threadMessages2 = getThreadMessages(tree2)
+    expect(threadMessages2).toHaveLength(8)
+
+    const q1 = visitNode(threadMessages2, '0')
+    const a1 = visitNode(threadMessages2, '1')
+    const q2 = visitNode(threadMessages2, '2')
+    const a2 = visitNode(threadMessages2, '3')
+    const q3 = visitNode(threadMessages2, '4')
+    const a3 = visitNode(threadMessages2, '5')
+    const q4 = visitNode(threadMessages2, '6')
+    const a4 = visitNode(threadMessages2, '7')
+
+    expect(q1.id).toBe('question-1')
+    expect(a1.id).toBe('1')
+    expect(q2.id).toBe('question-2')
+    expect(a2.id).toBe('2')
+    expect(q3.id).toBe('question-3')
+    expect(a3.id).toBe('3')
+    expect(q4.id).toBe('question-4')
+    expect(a4.id).toBe('4')
+
+    expect(a1.siblingCount).toBe(1)
+    expect(a1.siblingIndex).toBe(0)
+    expect(a2.siblingCount).toBe(1)
+    expect(a2.siblingIndex).toBe(0)
+    expect(a3.siblingCount).toBe(1)
+    expect(a3.siblingIndex).toBe(0)
+    expect(a4.siblingCount).toBe(1)
+    expect(a4.siblingIndex).toBe(0)
+  })
+
+  const tree3 = buildChatItemTree(mixedTestMessages as ChatItemInTree[])
+  it('should build mixed chat items tree', () => {
+    expect(tree3).toHaveLength(1)
+
+    const a1 = visitNode(tree3, '0.children.0')
+    expect(a1.id).toBe('1')
+    expect(a1.children).toHaveLength(2)
+
+    const a2 = visitNode(a1, 'children.0.children.0')
+    expect(a2.id).toBe('2')
+    expect(a2.siblingIndex).toBe(0)
+
+    const a3 = visitNode(a2, 'children.0.children.0')
+    expect(a3.id).toBe('3')
+
+    const a4 = visitNode(a1, 'children.1.children.0')
+    expect(a4.id).toBe('4')
+    expect(a4.siblingIndex).toBe(1)
+  })
+
+  it('should get thread messages from tree3, using the last message as the target', () => {
+    const threadMessages3_1 = getThreadMessages(tree3)
+    expect(threadMessages3_1).toHaveLength(4)
+
+    const q1 = visitNode(threadMessages3_1, '0')
+    const a1 = visitNode(threadMessages3_1, '1')
+    const q4 = visitNode(threadMessages3_1, '2')
+    const a4 = visitNode(threadMessages3_1, '3')
+
+    expect(q1.id).toBe('question-1')
+    expect(a1.id).toBe('1')
+    expect(q4.id).toBe('question-4')
+    expect(a4.id).toBe('4')
+
+    expect(a4.siblingCount).toBe(2)
+    expect(a4.siblingIndex).toBe(1)
+  })
+
+  it('should get thread messages from tree3, using the message with id 3 as the target', () => {
+    const threadMessages3_2 = getThreadMessages(tree3, '3')
+    expect(threadMessages3_2).toHaveLength(6)
+
+    const q1 = visitNode(threadMessages3_2, '0')
+    const a1 = visitNode(threadMessages3_2, '1')
+    const q2 = visitNode(threadMessages3_2, '2')
+    const a2 = visitNode(threadMessages3_2, '3')
+    const q3 = visitNode(threadMessages3_2, '4')
+    const a3 = visitNode(threadMessages3_2, '5')
+
+    expect(q1.id).toBe('question-1')
+    expect(a1.id).toBe('1')
+    expect(q2.id).toBe('question-2')
+    expect(a2.id).toBe('2')
+    expect(q3.id).toBe('question-3')
+    expect(a3.id).toBe('3')
+
+    expect(a2.siblingCount).toBe(2)
+    expect(a2.siblingIndex).toBe(0)
+  })
+
+  const tree4 = buildChatItemTree(multiRootNodesMessages as ChatItemInTree[])
+  it('should build multi root nodes chat items tree', () => {
+    expect(tree4).toHaveLength(2)
+
+    const a5 = visitNode(tree4, '1.children.0')
+    expect(a5.id).toBe('5')
+    expect(a5.siblingIndex).toBe(1)
+  })
+
+  it('should get thread messages from tree4, using the last message as the target', () => {
+    const threadMessages4 = getThreadMessages(tree4)
+    expect(threadMessages4).toHaveLength(2)
+
+    const a1 = visitNode(threadMessages4, '0.children.0')
+    expect(a1.id).toBe('5')
+  })
+
+  it('should get thread messages from tree4, using the message with id 2 as the target', () => {
+    const threadMessages4_1 = getThreadMessages(tree4, '2')
+    expect(threadMessages4_1).toHaveLength(6)
+    const a1 = visitNode(threadMessages4_1, '1')
+    expect(a1.id).toBe('1')
+    const a2 = visitNode(threadMessages4_1, '3')
+    expect(a2.id).toBe('2')
+    const a3 = visitNode(threadMessages4_1, '5')
+    expect(a3.id).toBe('3')
+  })
+
+  const tree5 = buildChatItemTree(multiRootNodesWithLegacyTestMessages as ChatItemInTree[])
+  it('should work with multi root nodes chat items with legacy chat items', () => {
+    expect(tree5).toHaveLength(2)
+
+    const q5 = visitNode(tree5, '1')
+    expect(q5.id).toBe('question-5')
+    expect(q5.parentMessageId).toBe(null)
+
+    const a5 = visitNode(q5, 'children.0')
+    expect(a5.id).toBe('5')
+    expect(a5.children).toHaveLength(0)
+  })
+
+  it('should get thread messages from tree5, using the last message as the target', () => {
+    const threadMessages5 = getThreadMessages(tree5)
+    expect(threadMessages5).toHaveLength(2)
+
+    const q5 = visitNode(threadMessages5, '0')
+    const a5 = visitNode(threadMessages5, '1')
+
+    expect(q5.id).toBe('question-5')
+    expect(a5.id).toBe('5')
+
+    expect(a5.siblingCount).toBe(2)
+    expect(a5.siblingIndex).toBe(1)
+  })
+
+  const tree6 = buildChatItemTree(realWorldMessages as ChatItemInTree[])
+  it('should work with real world messages', () => {
+    expect(tree6).toMatchSnapshot()
+  })
+
+  it ('should get thread messages from tree6, using the last message as target', () => {
+    const threadMessages6_1 = getThreadMessages(tree6)
+    expect(threadMessages6_1).toMatchSnapshot()
+  })
+
+  it ('should get thread messages from tree6, using specified message as target', () => {
+    const threadMessages6_2 = getThreadMessages(tree6, 'ff4c2b43-48a5-47ad-9dc5-08b34ddba61b')
+    expect(threadMessages6_2).toMatchSnapshot()
+  })
+
+  const partialMessages1 = (realWorldMessages as ChatItemInTree[]).slice(-10)
+  const tree7 = buildChatItemTree(partialMessages1)
+  it('should work with partial messages 1', () => {
+    expect(tree7).toMatchSnapshot()
+  })
+
+  const partialMessages2 = partialMessages as ChatItemInTree[]
+  const tree8 = buildChatItemTree(partialMessages2)
+  it('should work with partial messages 2', () => {
+    expect(tree8).toMatchSnapshot()
+  })
+})
diff --git a/app/components/base/chat/chat-with-history/chat-wrapper.tsx b/app/components/base/chat/chat-with-history/chat-wrapper.tsx
new file mode 100644
index 0000000..63de135
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/chat-wrapper.tsx
@@ -0,0 +1,270 @@
+import { useCallback, useEffect, useMemo, useState } from 'react'
+import Chat from '../chat'
+import type {
+  ChatConfig,
+  ChatItem,
+  ChatItemInTree,
+  OnSend,
+} from '../types'
+import { useChat } from '../chat/hooks'
+import { getLastAnswer, isValidGeneratedAnswer } from '../utils'
+import { useChatWithHistoryContext } from './context'
+import { InputVarType } from '@/app/components/workflow/types'
+import { TransferMethod } from '@/types/app'
+import InputsForm from '@/app/components/base/chat/chat-with-history/inputs-form'
+import {
+  fetchSuggestedQuestions,
+  getUrl,
+  stopChatMessageResponding,
+} from '@/service/share'
+import AppIcon from '@/app/components/base/app-icon'
+import AnswerIcon from '@/app/components/base/answer-icon'
+import SuggestedQuestions from '@/app/components/base/chat/chat/answer/suggested-questions'
+import { Markdown } from '@/app/components/base/markdown'
+import cn from '@/utils/classnames'
+import type { FileEntity } from '../../file-uploader/types'
+
+const ChatWrapper = () => {
+  const {
+    appParams,
+    appPrevChatTree,
+    currentConversationId,
+    currentConversationItem,
+    currentConversationInputs,
+    inputsForms,
+    newConversationInputs,
+    newConversationInputsRef,
+    handleNewConversationCompleted,
+    isMobile,
+    isInstalledApp,
+    appId,
+    appMeta,
+    handleFeedback,
+    currentChatInstanceRef,
+    appData,
+    themeBuilder,
+    sidebarCollapseState,
+    clearChatList,
+    setClearChatList,
+    setIsResponding,
+  } = useChatWithHistoryContext()
+  const appConfig = useMemo(() => {
+    const config = appParams || {}
+
+    return {
+      ...config,
+      file_upload: {
+        ...(config as any).file_upload,
+        fileUploadConfig: (config as any).system_parameters,
+      },
+      supportFeedback: true,
+      opening_statement: currentConversationId ? currentConversationItem?.introduction : (config as any).opening_statement,
+    } as ChatConfig
+  }, [appParams, currentConversationItem?.introduction, currentConversationId])
+  const {
+    chatList,
+    setTargetMessageId,
+    handleSend,
+    handleStop,
+    isResponding: respondingState,
+    suggestedQuestions,
+  } = useChat(
+    appConfig,
+    {
+      inputs: (currentConversationId ? currentConversationInputs : newConversationInputs) as any,
+      inputsForm: inputsForms,
+    },
+    appPrevChatTree,
+    taskId => stopChatMessageResponding('', taskId, isInstalledApp, appId),
+    clearChatList,
+    setClearChatList,
+  )
+  const inputsFormValue = currentConversationId ? currentConversationInputs : newConversationInputsRef?.current
+  const inputDisabled = useMemo(() => {
+    let hasEmptyInput = ''
+    let fileIsUploading = false
+    const requiredVars = inputsForms.filter(({ required }) => required)
+    if (requiredVars.length) {
+      requiredVars.forEach(({ variable, label, type }) => {
+        if (hasEmptyInput)
+          return
+
+        if (fileIsUploading)
+          return
+
+        if (!inputsFormValue?.[variable])
+          hasEmptyInput = label as string
+
+        if ((type === InputVarType.singleFile || type === InputVarType.multiFiles) && inputsFormValue?.[variable]) {
+          const files = inputsFormValue[variable]
+          if (Array.isArray(files))
+            fileIsUploading = files.find(item => item.transferMethod === TransferMethod.local_file && !item.uploadedId)
+          else
+            fileIsUploading = files.transferMethod === TransferMethod.local_file && !files.uploadedId
+        }
+      })
+    }
+    if (hasEmptyInput)
+      return true
+
+    if (fileIsUploading)
+      return true
+    return false
+  }, [inputsFormValue, inputsForms])
+
+  useEffect(() => {
+    if (currentChatInstanceRef.current)
+      currentChatInstanceRef.current.handleStop = handleStop
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  useEffect(() => {
+    setIsResponding(respondingState)
+  }, [respondingState, setIsResponding])
+
+  const doSend: OnSend = useCallback((message, files, isRegenerate = false, parentAnswer: ChatItem | null = null) => {
+    const data: any = {
+      query: message,
+      files,
+      inputs: currentConversationId ? currentConversationInputs : newConversationInputs,
+      conversation_id: currentConversationId,
+      parent_message_id: (isRegenerate ? parentAnswer?.id : getLastAnswer(chatList)?.id) || null,
+    }
+
+    handleSend(
+      getUrl('chat-messages', isInstalledApp, appId || ''),
+      data,
+      {
+        onGetSuggestedQuestions: responseItemId => fetchSuggestedQuestions(responseItemId, isInstalledApp, appId),
+        onConversationComplete: currentConversationId ? undefined : handleNewConversationCompleted,
+        isPublicAPI: !isInstalledApp,
+      },
+    )
+  }, [chatList, handleNewConversationCompleted, handleSend, currentConversationId, currentConversationInputs, newConversationInputs, isInstalledApp, appId])
+
+  const doRegenerate = useCallback((chatItem: ChatItemInTree, editedQuestion?: { message: string, files?: FileEntity[] }) => {
+    const question = editedQuestion ? chatItem : chatList.find(item => item.id === chatItem.parentMessageId)!
+    const parentAnswer = chatList.find(item => item.id === question.parentMessageId)
+    doSend(editedQuestion ? editedQuestion.message : question.content,
+      editedQuestion ? editedQuestion.files : question.message_files,
+      true,
+      isValidGeneratedAnswer(parentAnswer) ? parentAnswer : null,
+    )
+  }, [chatList, doSend])
+
+  const messageList = useMemo(() => {
+    if (currentConversationId)
+      return chatList
+    return chatList.filter(item => !item.isOpeningStatement)
+  }, [chatList, currentConversationId])
+
+  const [collapsed, setCollapsed] = useState(!!currentConversationId)
+
+  const chatNode = useMemo(() => {
+    if (!inputsForms.length)
+      return null
+    if (isMobile) {
+      if (!currentConversationId)
+        return <InputsForm collapsed={collapsed} setCollapsed={setCollapsed} />
+      return null
+    }
+    else {
+      return <InputsForm collapsed={collapsed} setCollapsed={setCollapsed} />
+    }
+  }, [inputsForms.length, isMobile, currentConversationId, collapsed])
+
+  const welcome = useMemo(() => {
+    const welcomeMessage = chatList.find(item => item.isOpeningStatement)
+    if (respondingState)
+      return null
+    if (currentConversationId)
+      return null
+    if (!welcomeMessage)
+      return null
+    if (!collapsed && inputsForms.length > 0)
+      return null
+    if (welcomeMessage.suggestedQuestions && welcomeMessage.suggestedQuestions?.length > 0) {
+      return (
+        <div className='flex min-h-[50vh] items-center justify-center px-4 py-12'>
+          <div className='flex max-w-[720px] grow gap-4'>
+            <AppIcon
+              size='xl'
+              iconType={appData?.site.icon_type}
+              icon={appData?.site.icon}
+              background={appData?.site.icon_background}
+              imageUrl={appData?.site.icon_url}
+            />
+            <div className='w-0 grow'>
+              <div className='body-lg-regular grow rounded-2xl bg-chat-bubble-bg px-4 py-3 text-text-primary'>
+                <Markdown content={welcomeMessage.content} />
+                <SuggestedQuestions item={welcomeMessage} />
+              </div>
+            </div>
+          </div>
+        </div>
+      )
+    }
+    return (
+      <div className={cn('flex h-[50vh] flex-col items-center justify-center gap-3 py-12')}>
+        <AppIcon
+          size='xl'
+          iconType={appData?.site.icon_type}
+          icon={appData?.site.icon}
+          background={appData?.site.icon_background}
+          imageUrl={appData?.site.icon_url}
+        />
+        <div className='max-w-[768px] px-4'>
+          <Markdown className='!body-2xl-regular !text-text-tertiary' content={welcomeMessage.content} />
+        </div>
+      </div>
+    )
+  }, [appData?.site.icon, appData?.site.icon_background, appData?.site.icon_type, appData?.site.icon_url, chatList, collapsed, currentConversationId, inputsForms.length, respondingState])
+
+  const answerIcon = (appData?.site && appData.site.use_icon_as_answer_icon)
+    ? <AnswerIcon
+      iconType={appData.site.icon_type}
+      icon={appData.site.icon}
+      background={appData.site.icon_background}
+      imageUrl={appData.site.icon_url}
+    />
+    : null
+
+  return (
+    <div
+      className='h-full overflow-hidden bg-chatbot-bg'
+    >
+      <Chat
+        appData={appData}
+        config={appConfig}
+        chatList={messageList}
+        isResponding={respondingState}
+        chatContainerInnerClassName={`mx-auto pt-6 w-full max-w-[768px] ${isMobile && 'px-4'}`}
+        chatFooterClassName='pb-4'
+        chatFooterInnerClassName={`mx-auto w-full max-w-[768px] ${isMobile ? 'px-2' : 'px-4'}`}
+        onSend={doSend}
+        inputs={currentConversationId ? currentConversationInputs as any : newConversationInputs}
+        inputsForm={inputsForms}
+        onRegenerate={doRegenerate}
+        onStopResponding={handleStop}
+        chatNode={
+          <>
+            {chatNode}
+            {welcome}
+          </>
+        }
+        allToolIcons={appMeta?.tool_icons || {}}
+        onFeedback={handleFeedback}
+        suggestedQuestions={suggestedQuestions}
+        answerIcon={answerIcon}
+        hideProcessDetail
+        themeBuilder={themeBuilder}
+        switchSibling={siblingMessageId => setTargetMessageId(siblingMessageId)}
+        inputDisabled={inputDisabled}
+        isMobile={isMobile}
+        sidebarCollapseState={sidebarCollapseState}
+      />
+    </div>
+  )
+}
+
+export default ChatWrapper
diff --git a/app/components/base/chat/chat-with-history/context.tsx b/app/components/base/chat/chat-with-history/context.tsx
new file mode 100644
index 0000000..7dd7a78
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/context.tsx
@@ -0,0 +1,94 @@
+'use client'
+
+import type { RefObject } from 'react'
+import { createContext, useContext } from 'use-context-selector'
+import type {
+  Callback,
+  ChatConfig,
+  ChatItemInTree,
+  Feedback,
+} from '../types'
+import type { ThemeBuilder } from '../embedded-chatbot/theme/theme-context'
+import type {
+  AppConversationData,
+  AppData,
+  AppMeta,
+  ConversationItem,
+} from '@/models/share'
+import { noop } from 'lodash-es'
+
+export type ChatWithHistoryContextValue = {
+  appInfoError?: any
+  appInfoLoading?: boolean
+  appMeta?: AppMeta
+  appData?: AppData
+  appParams?: ChatConfig
+  appChatListDataLoading?: boolean
+  currentConversationId: string
+  currentConversationItem?: ConversationItem
+  appPrevChatTree: ChatItemInTree[]
+  pinnedConversationList: AppConversationData['data']
+  conversationList: AppConversationData['data']
+  newConversationInputs: Record<string, any>
+  newConversationInputsRef: RefObject<Record<string, any>>
+  handleNewConversationInputsChange: (v: Record<string, any>) => void
+  inputsForms: any[]
+  handleNewConversation: () => void
+  handleStartChat: (callback?: any) => void
+  handleChangeConversation: (conversationId: string) => void
+  handlePinConversation: (conversationId: string) => void
+  handleUnpinConversation: (conversationId: string) => void
+  handleDeleteConversation: (conversationId: string, callback: Callback) => void
+  conversationRenaming: boolean
+  handleRenameConversation: (conversationId: string, newName: string, callback: Callback) => void
+  handleNewConversationCompleted: (newConversationId: string) => void
+  chatShouldReloadKey: string
+  isMobile: boolean
+  isInstalledApp: boolean
+  appId?: string
+  handleFeedback: (messageId: string, feedback: Feedback) => void
+  currentChatInstanceRef: RefObject<{ handleStop: () => void }>
+  themeBuilder?: ThemeBuilder
+  sidebarCollapseState?: boolean
+  handleSidebarCollapse: (state: boolean) => void
+  clearChatList?: boolean
+  setClearChatList: (state: boolean) => void
+  isResponding?: boolean
+  setIsResponding: (state: boolean) => void,
+  currentConversationInputs: Record<string, any> | null,
+  setCurrentConversationInputs: (v: Record<string, any>) => void,
+}
+
+export const ChatWithHistoryContext = createContext<ChatWithHistoryContextValue>({
+  currentConversationId: '',
+  appPrevChatTree: [],
+  pinnedConversationList: [],
+  conversationList: [],
+  newConversationInputs: {},
+  newConversationInputsRef: { current: {} },
+  handleNewConversationInputsChange: noop,
+  inputsForms: [],
+  handleNewConversation: noop,
+  handleStartChat: noop,
+  handleChangeConversation: noop,
+  handlePinConversation: noop,
+  handleUnpinConversation: noop,
+  handleDeleteConversation: noop,
+  conversationRenaming: false,
+  handleRenameConversation: noop,
+  handleNewConversationCompleted: noop,
+  chatShouldReloadKey: '',
+  isMobile: false,
+  isInstalledApp: false,
+  handleFeedback: noop,
+  currentChatInstanceRef: { current: { handleStop: noop } },
+  sidebarCollapseState: false,
+  handleSidebarCollapse: noop,
+  clearChatList: false,
+  setClearChatList: noop,
+  isResponding: false,
+  setIsResponding: noop,
+  currentConversationInputs: {},
+  setCurrentConversationInputs: noop,
+})
+export const useChatWithHistoryContext = () => useContext(ChatWithHistoryContext)
diff --git a/app/components/base/chat/chat-with-history/header-in-mobile.tsx b/app/components/base/chat/chat-with-history/header-in-mobile.tsx
new file mode 100644
index 0000000..ec8da7b
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/header-in-mobile.tsx
@@ -0,0 +1,152 @@
+import { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiMenuLine,
+} from '@remixicon/react'
+import { useChatWithHistoryContext } from './context'
+import Operation from './header/operation'
+import Sidebar from './sidebar'
+import MobileOperationDropdown from './header/mobile-operation-dropdown'
+import AppIcon from '@/app/components/base/app-icon'
+import ActionButton from '@/app/components/base/action-button'
+import { Message3Fill } from '@/app/components/base/icons/src/public/other'
+import InputsFormContent from '@/app/components/base/chat/chat-with-history/inputs-form/content'
+import Confirm from '@/app/components/base/confirm'
+import RenameModal from '@/app/components/base/chat/chat-with-history/sidebar/rename-modal'
+import type { ConversationItem } from '@/models/share'
+
+const HeaderInMobile = () => {
+  const {
+    appData,
+    currentConversationId,
+    currentConversationItem,
+    pinnedConversationList,
+    handleNewConversation,
+    handlePinConversation,
+    handleUnpinConversation,
+    handleDeleteConversation,
+    handleRenameConversation,
+    conversationRenaming,
+    inputsForms,
+  } = useChatWithHistoryContext()
+  const { t } = useTranslation()
+  const isPin = pinnedConversationList.some(item => item.id === currentConversationId)
+  const [showConfirm, setShowConfirm] = useState<ConversationItem | null>(null)
+  const [showRename, setShowRename] = useState<ConversationItem | null>(null)
+  const handleOperate = useCallback((type: string) => {
+    if (type === 'pin')
+      handlePinConversation(currentConversationId)
+
+    if (type === 'unpin')
+      handleUnpinConversation(currentConversationId)
+
+    if (type === 'delete')
+      setShowConfirm(currentConversationItem as any)
+
+    if (type === 'rename')
+      setShowRename(currentConversationItem as any)
+  }, [currentConversationId, currentConversationItem, handlePinConversation, handleUnpinConversation])
+  const handleCancelConfirm = useCallback(() => {
+    setShowConfirm(null)
+  }, [])
+  const handleDelete = useCallback(() => {
+    if (showConfirm)
+      handleDeleteConversation(showConfirm.id, { onSuccess: handleCancelConfirm })
+  }, [showConfirm, handleDeleteConversation, handleCancelConfirm])
+  const handleCancelRename = useCallback(() => {
+    setShowRename(null)
+  }, [])
+  const handleRename = useCallback((newName: string) => {
+    if (showRename)
+      handleRenameConversation(showRename.id, newName, { onSuccess: handleCancelRename })
+  }, [showRename, handleRenameConversation, handleCancelRename])
+  const [showSidebar, setShowSidebar] = useState(false)
+  const [showChatSettings, setShowChatSettings] = useState(false)
+
+  return (
+    <>
+      <div className='flex shrink-0 items-center gap-1 bg-mask-top2bottom-gray-50-to-transparent px-2 py-3'>
+        <ActionButton size='l' className='shrink-0' onClick={() => setShowSidebar(true)}>
+          <RiMenuLine className='h-[18px] w-[18px]' />
+        </ActionButton>
+        <div className='flex grow items-center justify-center'>
+          {!currentConversationId && (
+            <>
+              <AppIcon
+                className='mr-2'
+                size='tiny'
+                icon={appData?.site.icon}
+                iconType={appData?.site.icon_type}
+                imageUrl={appData?.site.icon_url}
+                background={appData?.site.icon_background}
+              />
+              <div className='system-md-semibold truncate text-text-secondary'>
+                {appData?.site.title}
+              </div>
+            </>
+          )}
+          {currentConversationId && (
+            <Operation
+              title={currentConversationItem?.name || ''}
+              isPinned={!!isPin}
+              togglePin={() => handleOperate(isPin ? 'unpin' : 'pin')}
+              isShowDelete
+              isShowRenameConversation
+              onRenameConversation={() => handleOperate('rename')}
+              onDelete={() => handleOperate('delete')}
+            />
+          )}
+        </div>
+        <MobileOperationDropdown
+          handleResetChat={handleNewConversation}
+          handleViewChatSettings={() => setShowChatSettings(true)}
+          hideViewChatSettings={inputsForms.length < 1}
+        />
+      </div>
+      {showSidebar && (
+        <div className='fixed inset-0 z-50 flex bg-background-overlay p-1'
+          onClick={() => setShowSidebar(false)}
+        >
+          <div className='flex h-full w-[calc(100vw_-_40px)] rounded-xl bg-components-panel-bg shadow-lg backdrop-blur-sm' onClick={e => e.stopPropagation()}>
+            <Sidebar />
+          </div>
+        </div>
+      )}
+      {showChatSettings && (
+        <div className='fixed inset-0 z-50 flex justify-end bg-background-overlay p-1'
+          onClick={() => setShowChatSettings(false)}
+        >
+          <div className='flex h-full w-[calc(100vw_-_40px)] flex-col rounded-xl bg-components-panel-bg shadow-lg backdrop-blur-sm' onClick={e => e.stopPropagation()}>
+            <div className='flex items-center gap-3 rounded-t-2xl border-b border-divider-subtle px-4 py-3'>
+              <Message3Fill className='h-6 w-6 shrink-0' />
+              <div className='system-xl-semibold grow text-text-secondary'>{t('share.chat.chatSettingsTitle')}</div>
+            </div>
+            <div className='p-4'>
+              <InputsFormContent />
+            </div>
+          </div>
+        </div>
+      )}
+      {!!showConfirm && (
+        <Confirm
+          title={t('share.chat.deleteConversation.title')}
+          content={t('share.chat.deleteConversation.content') || ''}
+          isShow
+          onCancel={handleCancelConfirm}
+          onConfirm={handleDelete}
+        />
+      )}
+      {showRename && (
+        <RenameModal
+          isShow
+          onClose={handleCancelRename}
+          saveLoading={conversationRenaming}
+          name={showRename?.name || ''}
+          onSave={handleRename}
+        />
+      )}
+    </>
+  )
+}
+
+export default HeaderInMobile
diff --git a/app/components/base/chat/chat-with-history/header/index.tsx b/app/components/base/chat/chat-with-history/header/index.tsx
new file mode 100644
index 0000000..b5c5bcc
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/header/index.tsx
@@ -0,0 +1,164 @@
+import { useCallback, useState } from 'react'
+import {
+  RiEditBoxLine,
+  RiLayoutRight2Line,
+  RiResetLeftLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import {
+  useChatWithHistoryContext,
+} from '../context'
+import Operation from './operation'
+import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
+import AppIcon from '@/app/components/base/app-icon'
+import Tooltip from '@/app/components/base/tooltip'
+import ViewFormDropdown from '@/app/components/base/chat/chat-with-history/inputs-form/view-form-dropdown'
+import Confirm from '@/app/components/base/confirm'
+import RenameModal from '@/app/components/base/chat/chat-with-history/sidebar/rename-modal'
+import type { ConversationItem } from '@/models/share'
+import cn from '@/utils/classnames'
+
+const Header = () => {
+  const {
+    appData,
+    currentConversationId,
+    currentConversationItem,
+    inputsForms,
+    pinnedConversationList,
+    handlePinConversation,
+    handleUnpinConversation,
+    conversationRenaming,
+    handleRenameConversation,
+    handleDeleteConversation,
+    handleNewConversation,
+    sidebarCollapseState,
+    handleSidebarCollapse,
+    isResponding,
+  } = useChatWithHistoryContext()
+  const { t } = useTranslation()
+  const isSidebarCollapsed = sidebarCollapseState
+
+  const isPin = pinnedConversationList.some(item => item.id === currentConversationId)
+
+  const [showConfirm, setShowConfirm] = useState<ConversationItem | null>(null)
+  const [showRename, setShowRename] = useState<ConversationItem | null>(null)
+  const handleOperate = useCallback((type: string) => {
+    if (type === 'pin')
+      handlePinConversation(currentConversationId)
+
+    if (type === 'unpin')
+      handleUnpinConversation(currentConversationId)
+
+    if (type === 'delete')
+      setShowConfirm(currentConversationItem as any)
+
+    if (type === 'rename')
+      setShowRename(currentConversationItem as any)
+  }, [currentConversationId, currentConversationItem, handlePinConversation, handleUnpinConversation])
+  const handleCancelConfirm = useCallback(() => {
+    setShowConfirm(null)
+  }, [])
+  const handleDelete = useCallback(() => {
+    if (showConfirm)
+      handleDeleteConversation(showConfirm.id, { onSuccess: handleCancelConfirm })
+  }, [showConfirm, handleDeleteConversation, handleCancelConfirm])
+  const handleCancelRename = useCallback(() => {
+    setShowRename(null)
+  }, [])
+  const handleRename = useCallback((newName: string) => {
+    if (showRename)
+      handleRenameConversation(showRename.id, newName, { onSuccess: handleCancelRename })
+  }, [showRename, handleRenameConversation, handleCancelRename])
+
+  return (
+    <>
+      <div className='flex h-14 shrink-0 items-center justify-between p-3'>
+        <div className={cn('flex items-center gap-1 transition-all duration-200 ease-in-out', !isSidebarCollapsed && 'user-select-none opacity-0')}>
+          <ActionButton className={cn(!isSidebarCollapsed && 'cursor-default')} size='l' onClick={() => handleSidebarCollapse(false)}>
+            <RiLayoutRight2Line className='h-[18px] w-[18px]' />
+          </ActionButton>
+          <div className='mr-1 shrink-0'>
+            <AppIcon
+              size='large'
+              iconType={appData?.site.icon_type}
+              icon={appData?.site.icon}
+              background={appData?.site.icon_background}
+              imageUrl={appData?.site.icon_url}
+            />
+          </div>
+          {!currentConversationId && (
+            <div className={cn('system-md-semibold grow truncate text-text-secondary')}>{appData?.site.title}</div>
+          )}
+          {currentConversationId && currentConversationItem && isSidebarCollapsed && (
+            <>
+              <div className='p-1 text-divider-deep'>/</div>
+              <Operation
+                title={currentConversationItem?.name || ''}
+                isPinned={!!isPin}
+                togglePin={() => handleOperate(isPin ? 'unpin' : 'pin')}
+                isShowDelete
+                isShowRenameConversation
+                onRenameConversation={() => handleOperate('rename')}
+                onDelete={() => handleOperate('delete')}
+              />
+            </>
+          )}
+          <div className='flex items-center px-1'>
+            <div className='h-[14px] w-px bg-divider-regular'></div>
+          </div>
+          {isSidebarCollapsed && (
+            <Tooltip
+              disabled={!!currentConversationId}
+              popupContent={t('share.chat.newChatTip')}
+            >
+              <div>
+                <ActionButton
+                  size='l'
+                  state={(!currentConversationId || isResponding) ? ActionButtonState.Disabled : ActionButtonState.Default}
+                  disabled={!currentConversationId || isResponding}
+                  onClick={handleNewConversation}
+                >
+                  <RiEditBoxLine className='h-[18px] w-[18px]' />
+                </ActionButton>
+              </div>
+            </Tooltip>
+          )}
+        </div>
+        <div className='flex items-center gap-1'>
+          {currentConversationId && (
+            <Tooltip
+              popupContent={t('share.chat.resetChat')}
+            >
+              <ActionButton size='l' onClick={handleNewConversation}>
+                <RiResetLeftLine className='h-[18px] w-[18px]' />
+              </ActionButton>
+            </Tooltip>
+          )}
+          {currentConversationId && inputsForms.length > 0 && (
+            <ViewFormDropdown />
+          )}
+        </div>
+      </div>
+      {!!showConfirm && (
+        <Confirm
+          title={t('share.chat.deleteConversation.title')}
+          content={t('share.chat.deleteConversation.content') || ''}
+          isShow
+          onCancel={handleCancelConfirm}
+          onConfirm={handleDelete}
+        />
+      )}
+      {showRename && (
+        <RenameModal
+          isShow
+          onClose={handleCancelRename}
+          saveLoading={conversationRenaming}
+          name={showRename?.name || ''}
+          onSave={handleRename}
+        />
+      )}
+    </>
+  )
+}
+
+export default Header
diff --git a/app/components/base/chat/chat-with-history/header/mobile-operation-dropdown.tsx b/app/components/base/chat/chat-with-history/header/mobile-operation-dropdown.tsx
new file mode 100644
index 0000000..4bb6940
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/header/mobile-operation-dropdown.tsx
@@ -0,0 +1,59 @@
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiMoreFill,
+} from '@remixicon/react'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
+
+type Props = {
+  handleResetChat: () => void
+  handleViewChatSettings: () => void
+  hideViewChatSettings?: boolean
+}
+
+const MobileOperationDropdown = ({
+  handleResetChat,
+  handleViewChatSettings,
+  hideViewChatSettings = false,
+}: Props) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: 4,
+        crossAxis: -4,
+      }}
+    >
+      <PortalToFollowElemTrigger
+        onClick={() => setOpen(v => !v)}
+      >
+        <ActionButton size='l' state={open ? ActionButtonState.Hover : ActionButtonState.Default}>
+          <RiMoreFill className='h-[18px] w-[18px]' />
+        </ActionButton>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className="z-40">
+        <div
+          className={'min-w-[160px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg backdrop-blur-sm'}
+        >
+          <div className='system-md-regular flex cursor-pointer items-center space-x-1 rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover' onClick={handleResetChat}>
+            <span className='grow'>{t('share.chat.resetChat')}</span>
+          </div>
+          {!hideViewChatSettings && (
+            <div className='system-md-regular flex cursor-pointer items-center space-x-1 rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover' onClick={handleViewChatSettings}>
+              <span className='grow'>{t('share.chat.viewChatSettings')}</span>
+            </div>
+          )}
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+
+  )
+}
+
+export default MobileOperationDropdown
diff --git a/app/components/base/chat/chat-with-history/header/operation.tsx b/app/components/base/chat/chat-with-history/header/operation.tsx
new file mode 100644
index 0000000..0923d71
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/header/operation.tsx
@@ -0,0 +1,73 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import type { Placement } from '@floating-ui/react'
+import {
+  RiArrowDownSLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+import cn from '@/utils/classnames'
+
+type Props = {
+  title: string
+  isPinned: boolean
+  isShowRenameConversation?: boolean
+  onRenameConversation?: () => void
+  isShowDelete: boolean
+  togglePin: () => void
+  onDelete: () => void
+  placement?: Placement
+}
+
+const Operation: FC<Props> = ({
+  title,
+  isPinned,
+  togglePin,
+  isShowRenameConversation,
+  onRenameConversation,
+  isShowDelete,
+  onDelete,
+  placement = 'bottom-start',
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement={placement}
+      offset={4}
+    >
+      <PortalToFollowElemTrigger
+        onClick={() => setOpen(v => !v)}
+      >
+        <div className={cn('flex cursor-pointer items-center rounded-lg p-1.5 pl-2 text-text-secondary hover:bg-state-base-hover', open && 'bg-state-base-hover')}>
+          <div className='system-md-semibold'>{title}</div>
+          <RiArrowDownSLine className='h-4 w-4 ' />
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className="z-50">
+        <div
+          className={'min-w-[120px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg backdrop-blur-sm'}
+        >
+          <div className={cn('system-md-regular flex cursor-pointer items-center space-x-1 rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover')} onClick={togglePin}>
+            <span className='grow'>{isPinned ? t('explore.sidebar.action.unpin') : t('explore.sidebar.action.pin')}</span>
+          </div>
+          {isShowRenameConversation && (
+            <div className={cn('system-md-regular flex cursor-pointer items-center space-x-1 rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover')} onClick={onRenameConversation}>
+              <span className='grow'>{t('explore.sidebar.action.rename')}</span>
+            </div>
+          )}
+          {isShowDelete && (
+            <div className={cn('system-md-regular group flex cursor-pointer items-center space-x-1 rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-destructive-hover hover:text-text-destructive')} onClick={onDelete} >
+              <span className='grow'>{t('explore.sidebar.action.delete')}</span>
+            </div>
+          )}
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default React.memo(Operation)
diff --git a/app/components/base/chat/chat-with-history/hooks.tsx b/app/components/base/chat/chat-with-history/hooks.tsx
new file mode 100644
index 0000000..91ceaff
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/hooks.tsx
@@ -0,0 +1,495 @@
+import {
+  useCallback,
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import useSWR from 'swr'
+import { useLocalStorageState } from 'ahooks'
+import produce from 'immer'
+import type {
+  Callback,
+  ChatConfig,
+  ChatItem,
+  Feedback,
+} from '../types'
+import { CONVERSATION_ID_INFO } from '../constants'
+import { buildChatItemTree, getProcessedSystemVariablesFromUrlParams } from '../utils'
+import { addFileInfos, sortAgentSorts } from '../../../tools/utils'
+import { getProcessedFilesFromResponse } from '@/app/components/base/file-uploader/utils'
+import {
+  delConversation,
+  fetchAppInfo,
+  fetchAppMeta,
+  fetchAppParams,
+  fetchChatList,
+  fetchConversations,
+  generationConversationName,
+  pinConversation,
+  renameConversation,
+  unpinConversation,
+  updateFeedback,
+} from '@/service/share'
+import type { InstalledApp } from '@/models/explore'
+import type {
+  AppData,
+  ConversationItem,
+} from '@/models/share'
+import { useToastContext } from '@/app/components/base/toast'
+import { changeLanguage } from '@/i18n/i18next-config'
+import { useAppFavicon } from '@/hooks/use-app-favicon'
+import { InputVarType } from '@/app/components/workflow/types'
+import { TransferMethod } from '@/types/app'
+import { noop } from 'lodash-es'
+
+function getFormattedChatList(messages: any[]) {
+  const newChatList: ChatItem[] = []
+  messages.forEach((item) => {
+    const questionFiles = item.message_files?.filter((file: any) => file.belongs_to === 'user') || []
+    newChatList.push({
+      id: `question-${item.id}`,
+      content: item.query,
+      isAnswer: false,
+      message_files: getProcessedFilesFromResponse(questionFiles.map((item: any) => ({ ...item, related_id: item.id, upload_file_id: item.upload_file_id }))),
+      parentMessageId: item.parent_message_id || undefined,
+    })
+    const answerFiles = item.message_files?.filter((file: any) => file.belongs_to === 'assistant') || []
+    newChatList.push({
+      id: item.id,
+      content: item.answer,
+      agent_thoughts: addFileInfos(item.agent_thoughts ? sortAgentSorts(item.agent_thoughts) : item.agent_thoughts, item.message_files),
+      feedback: item.feedback,
+      isAnswer: true,
+      citation: item.retriever_resources,
+      message_files: getProcessedFilesFromResponse(answerFiles.map((item: any) => ({ ...item, related_id: item.id, upload_file_id: item.upload_file_id }))),
+      parentMessageId: `question-${item.id}`,
+    })
+  })
+  return newChatList
+}
+
+export const useChatWithHistory = (installedAppInfo?: InstalledApp) => {
+  const isInstalledApp = useMemo(() => !!installedAppInfo, [installedAppInfo])
+  const { data: appInfo, isLoading: appInfoLoading, error: appInfoError } = useSWR(installedAppInfo ? null : 'appInfo', fetchAppInfo)
+
+  useAppFavicon({
+    enable: !installedAppInfo,
+    icon_type: appInfo?.site.icon_type,
+    icon: appInfo?.site.icon,
+    icon_background: appInfo?.site.icon_background,
+    icon_url: appInfo?.site.icon_url,
+  })
+
+  const appData = useMemo(() => {
+    if (isInstalledApp) {
+      const { id, app } = installedAppInfo!
+      return {
+        app_id: id,
+        site: {
+          title: app.name,
+          icon_type: app.icon_type,
+          icon: app.icon,
+          icon_background: app.icon_background,
+          icon_url: app.icon_url,
+          prompt_public: false,
+          copyright: '',
+          show_workflow_steps: true,
+          use_icon_as_answer_icon: app.use_icon_as_answer_icon,
+        },
+        plan: 'basic',
+      } as AppData
+    }
+
+    return appInfo
+  }, [isInstalledApp, installedAppInfo, appInfo])
+  const appId = useMemo(() => appData?.app_id, [appData])
+
+  const [userId, setUserId] = useState<string>()
+  useEffect(() => {
+    getProcessedSystemVariablesFromUrlParams().then(({ user_id }) => {
+      setUserId(user_id)
+    })
+  }, [])
+
+  useEffect(() => {
+    if (appData?.site.default_language)
+      changeLanguage(appData.site.default_language)
+  }, [appData])
+
+  const [sidebarCollapseState, setSidebarCollapseState] = useState<boolean>(false)
+  const handleSidebarCollapse = useCallback((state: boolean) => {
+    if (appId) {
+      setSidebarCollapseState(state)
+      localStorage.setItem('webappSidebarCollapse', state ? 'collapsed' : 'expanded')
+    }
+  }, [appId, setSidebarCollapseState])
+  useEffect(() => {
+    if (appId) {
+      const localState = localStorage.getItem('webappSidebarCollapse')
+      setSidebarCollapseState(localState === 'collapsed')
+    }
+  }, [appId])
+  const [conversationIdInfo, setConversationIdInfo] = useLocalStorageState<Record<string, Record<string, string>>>(CONVERSATION_ID_INFO, {
+    defaultValue: {},
+  })
+  const currentConversationId = useMemo(() => conversationIdInfo?.[appId || '']?.[userId || 'DEFAULT'] || '', [appId, conversationIdInfo, userId])
+  const handleConversationIdInfoChange = useCallback((changeConversationId: string) => {
+    if (appId) {
+      let prevValue = conversationIdInfo?.[appId || '']
+      if (typeof prevValue === 'string')
+        prevValue = {}
+      setConversationIdInfo({
+        ...conversationIdInfo,
+        [appId || '']: {
+          ...prevValue,
+          [userId || 'DEFAULT']: changeConversationId,
+        },
+      })
+    }
+  }, [appId, conversationIdInfo, setConversationIdInfo, userId])
+
+  const [newConversationId, setNewConversationId] = useState('')
+  const chatShouldReloadKey = useMemo(() => {
+    if (currentConversationId === newConversationId)
+      return ''
+
+    return currentConversationId
+  }, [currentConversationId, newConversationId])
+
+  const { data: appParams } = useSWR(['appParams', isInstalledApp, appId], () => fetchAppParams(isInstalledApp, appId))
+  const { data: appMeta } = useSWR(['appMeta', isInstalledApp, appId], () => fetchAppMeta(isInstalledApp, appId))
+  const { data: appPinnedConversationData, mutate: mutateAppPinnedConversationData } = useSWR(['appConversationData', isInstalledApp, appId, true], () => fetchConversations(isInstalledApp, appId, undefined, true, 100))
+  const { data: appConversationData, isLoading: appConversationDataLoading, mutate: mutateAppConversationData } = useSWR(['appConversationData', isInstalledApp, appId, false], () => fetchConversations(isInstalledApp, appId, undefined, false, 100))
+  const { data: appChatListData, isLoading: appChatListDataLoading } = useSWR(chatShouldReloadKey ? ['appChatList', chatShouldReloadKey, isInstalledApp, appId] : null, () => fetchChatList(chatShouldReloadKey, isInstalledApp, appId))
+
+  const [clearChatList, setClearChatList] = useState(false)
+  const [isResponding, setIsResponding] = useState(false)
+  const appPrevChatTree = useMemo(
+    () => (currentConversationId && appChatListData?.data.length)
+      ? buildChatItemTree(getFormattedChatList(appChatListData.data))
+      : [],
+    [appChatListData, currentConversationId],
+  )
+
+  const [showNewConversationItemInList, setShowNewConversationItemInList] = useState(false)
+
+  const pinnedConversationList = useMemo(() => {
+    return appPinnedConversationData?.data || []
+  }, [appPinnedConversationData])
+  const { t } = useTranslation()
+  const newConversationInputsRef = useRef<Record<string, any>>({})
+  const [newConversationInputs, setNewConversationInputs] = useState<Record<string, any>>({})
+  const handleNewConversationInputsChange = useCallback((newInputs: Record<string, any>) => {
+    newConversationInputsRef.current = newInputs
+    setNewConversationInputs(newInputs)
+  }, [])
+  const inputsForms = useMemo(() => {
+    return (appParams?.user_input_form || []).filter((item: any) => !item.external_data_tool).map((item: any) => {
+      if (item.paragraph) {
+        return {
+          ...item.paragraph,
+          type: 'paragraph',
+        }
+      }
+      if (item.number) {
+        return {
+          ...item.number,
+          type: 'number',
+        }
+      }
+      if (item.select) {
+        return {
+          ...item.select,
+          type: 'select',
+        }
+      }
+
+      if (item['file-list']) {
+        return {
+          ...item['file-list'],
+          type: 'file-list',
+        }
+      }
+
+      if (item.file) {
+        return {
+          ...item.file,
+          type: 'file',
+        }
+      }
+
+      return {
+        ...item['text-input'],
+        type: 'text-input',
+      }
+    })
+  }, [appParams])
+  useEffect(() => {
+    const conversationInputs: Record<string, any> = {}
+
+    inputsForms.forEach((item: any) => {
+      conversationInputs[item.variable] = item.default || null
+    })
+    handleNewConversationInputsChange(conversationInputs)
+  }, [handleNewConversationInputsChange, inputsForms])
+
+  const { data: newConversation } = useSWR(newConversationId ? [isInstalledApp, appId, newConversationId] : null, () => generationConversationName(isInstalledApp, appId, newConversationId), { revalidateOnFocus: false })
+  const [originConversationList, setOriginConversationList] = useState<ConversationItem[]>([])
+  useEffect(() => {
+    if (appConversationData?.data && !appConversationDataLoading)
+      setOriginConversationList(appConversationData?.data)
+  }, [appConversationData, appConversationDataLoading])
+  const conversationList = useMemo(() => {
+    const data = originConversationList.slice()
+
+    if (showNewConversationItemInList && data[0]?.id !== '') {
+      data.unshift({
+        id: '',
+        name: t('share.chat.newChatDefaultName'),
+        inputs: {},
+        introduction: '',
+      })
+    }
+    return data
+  }, [originConversationList, showNewConversationItemInList, t])
+
+  useEffect(() => {
+    if (newConversation) {
+      setOriginConversationList(produce((draft) => {
+        const index = draft.findIndex(item => item.id === newConversation.id)
+
+        if (index > -1)
+          draft[index] = newConversation
+        else
+          draft.unshift(newConversation)
+      }))
+    }
+  }, [newConversation])
+
+  const currentConversationItem = useMemo(() => {
+    let conversationItem = conversationList.find(item => item.id === currentConversationId)
+
+    if (!conversationItem && pinnedConversationList.length)
+      conversationItem = pinnedConversationList.find(item => item.id === currentConversationId)
+
+    return conversationItem
+  }, [conversationList, currentConversationId, pinnedConversationList])
+
+  const currentConversationLatestInputs = useMemo(() => {
+    if (!currentConversationId || !appChatListData?.data.length)
+      return newConversationInputsRef.current || {}
+    return appChatListData.data.slice().pop().inputs || {}
+  }, [appChatListData, currentConversationId])
+  const [currentConversationInputs, setCurrentConversationInputs] = useState<Record<string, any>>(currentConversationLatestInputs || {})
+  useEffect(() => {
+    if (currentConversationItem)
+      setCurrentConversationInputs(currentConversationLatestInputs || {})
+  }, [currentConversationItem, currentConversationLatestInputs])
+
+  const { notify } = useToastContext()
+  const checkInputsRequired = useCallback((silent?: boolean) => {
+    let hasEmptyInput = ''
+    let fileIsUploading = false
+    const requiredVars = inputsForms.filter(({ required }) => required)
+    if (requiredVars.length) {
+      requiredVars.forEach(({ variable, label, type }) => {
+        if (hasEmptyInput)
+          return
+
+        if (fileIsUploading)
+          return
+
+        if (!newConversationInputsRef.current[variable] && !silent)
+          hasEmptyInput = label as string
+
+        if ((type === InputVarType.singleFile || type === InputVarType.multiFiles) && newConversationInputsRef.current[variable] && !silent) {
+          const files = newConversationInputsRef.current[variable]
+          if (Array.isArray(files))
+            fileIsUploading = files.find(item => item.transferMethod === TransferMethod.local_file && !item.uploadedId)
+          else
+            fileIsUploading = files.transferMethod === TransferMethod.local_file && !files.uploadedId
+        }
+      })
+    }
+
+    if (hasEmptyInput) {
+      notify({ type: 'error', message: t('appDebug.errorMessage.valueOfVarRequired', { key: hasEmptyInput }) })
+      return false
+    }
+
+    if (fileIsUploading) {
+      notify({ type: 'info', message: t('appDebug.errorMessage.waitForFileUpload') })
+      return
+    }
+
+    return true
+  }, [inputsForms, notify, t])
+  const handleStartChat = useCallback((callback: any) => {
+    if (checkInputsRequired()) {
+      setShowNewConversationItemInList(true)
+      callback?.()
+    }
+  }, [setShowNewConversationItemInList, checkInputsRequired])
+  const currentChatInstanceRef = useRef<{ handleStop: () => void }>({ handleStop: noop })
+  const handleChangeConversation = useCallback((conversationId: string) => {
+    currentChatInstanceRef.current.handleStop()
+    setNewConversationId('')
+    handleConversationIdInfoChange(conversationId)
+    if (conversationId)
+      setClearChatList(false)
+  }, [handleConversationIdInfoChange, setClearChatList])
+  const handleNewConversation = useCallback(() => {
+    currentChatInstanceRef.current.handleStop()
+    setShowNewConversationItemInList(true)
+    handleChangeConversation('')
+    handleNewConversationInputsChange({})
+    setClearChatList(true)
+  }, [handleChangeConversation, setShowNewConversationItemInList, handleNewConversationInputsChange, setClearChatList])
+  const handleUpdateConversationList = useCallback(() => {
+    mutateAppConversationData()
+    mutateAppPinnedConversationData()
+  }, [mutateAppConversationData, mutateAppPinnedConversationData])
+
+  const handlePinConversation = useCallback(async (conversationId: string) => {
+    await pinConversation(isInstalledApp, appId, conversationId)
+    notify({ type: 'success', message: t('common.api.success') })
+    handleUpdateConversationList()
+  }, [isInstalledApp, appId, notify, t, handleUpdateConversationList])
+
+  const handleUnpinConversation = useCallback(async (conversationId: string) => {
+    await unpinConversation(isInstalledApp, appId, conversationId)
+    notify({ type: 'success', message: t('common.api.success') })
+    handleUpdateConversationList()
+  }, [isInstalledApp, appId, notify, t, handleUpdateConversationList])
+
+  const [conversationDeleting, setConversationDeleting] = useState(false)
+  const handleDeleteConversation = useCallback(async (
+    conversationId: string,
+    {
+      onSuccess,
+    }: Callback,
+  ) => {
+    if (conversationDeleting)
+      return
+
+    try {
+      setConversationDeleting(true)
+      await delConversation(isInstalledApp, appId, conversationId)
+      notify({ type: 'success', message: t('common.api.success') })
+      onSuccess()
+    }
+    finally {
+      setConversationDeleting(false)
+    }
+
+    if (conversationId === currentConversationId)
+      handleNewConversation()
+
+    handleUpdateConversationList()
+  }, [isInstalledApp, appId, notify, t, handleUpdateConversationList, handleNewConversation, currentConversationId, conversationDeleting])
+
+  const [conversationRenaming, setConversationRenaming] = useState(false)
+  const handleRenameConversation = useCallback(async (
+    conversationId: string,
+    newName: string,
+    {
+      onSuccess,
+    }: Callback,
+  ) => {
+    if (conversationRenaming)
+      return
+
+    if (!newName.trim()) {
+      notify({
+        type: 'error',
+        message: t('common.chat.conversationNameCanNotEmpty'),
+      })
+      return
+    }
+
+    setConversationRenaming(true)
+    try {
+      await renameConversation(isInstalledApp, appId, conversationId, newName)
+
+      notify({
+        type: 'success',
+        message: t('common.actionMsg.modifiedSuccessfully'),
+      })
+      setOriginConversationList(produce((draft) => {
+        const index = originConversationList.findIndex(item => item.id === conversationId)
+        const item = draft[index]
+
+        draft[index] = {
+          ...item,
+          name: newName,
+        }
+      }))
+      onSuccess()
+    }
+    finally {
+      setConversationRenaming(false)
+    }
+  }, [isInstalledApp, appId, notify, t, conversationRenaming, originConversationList])
+
+  const handleNewConversationCompleted = useCallback((newConversationId: string) => {
+    setNewConversationId(newConversationId)
+    handleConversationIdInfoChange(newConversationId)
+    setShowNewConversationItemInList(false)
+    mutateAppConversationData()
+  }, [mutateAppConversationData, handleConversationIdInfoChange])
+
+  const handleFeedback = useCallback(async (messageId: string, feedback: Feedback) => {
+    await updateFeedback({ url: `/messages/${messageId}/feedbacks`, body: { rating: feedback.rating } }, isInstalledApp, appId)
+    notify({ type: 'success', message: t('common.api.success') })
+  }, [isInstalledApp, appId, t, notify])
+
+  return {
+    appInfoError,
+    appInfoLoading,
+    isInstalledApp,
+    appId,
+    currentConversationId,
+    currentConversationItem,
+    handleConversationIdInfoChange,
+    appData,
+    appParams: appParams || {} as ChatConfig,
+    appMeta,
+    appPinnedConversationData,
+    appConversationData,
+    appConversationDataLoading,
+    appChatListData,
+    appChatListDataLoading,
+    appPrevChatTree,
+    pinnedConversationList,
+    conversationList,
+    setShowNewConversationItemInList,
+    newConversationInputs,
+    newConversationInputsRef,
+    handleNewConversationInputsChange,
+    inputsForms,
+    handleNewConversation,
+    handleStartChat,
+    handleChangeConversation,
+    handlePinConversation,
+    handleUnpinConversation,
+    conversationDeleting,
+    handleDeleteConversation,
+    conversationRenaming,
+    handleRenameConversation,
+    handleNewConversationCompleted,
+    newConversationId,
+    chatShouldReloadKey,
+    handleFeedback,
+    currentChatInstanceRef,
+    sidebarCollapseState,
+    handleSidebarCollapse,
+    clearChatList,
+    setClearChatList,
+    isResponding,
+    setIsResponding,
+    currentConversationInputs,
+    setCurrentConversationInputs,
+  }
+}
diff --git a/app/components/base/chat/chat-with-history/index.tsx b/app/components/base/chat/chat-with-history/index.tsx
new file mode 100644
index 0000000..dfd7bd2
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/index.tsx
@@ -0,0 +1,253 @@
+import type { FC } from 'react'
+import {
+  useEffect,
+  useState,
+} from 'react'
+import { useAsyncEffect } from 'ahooks'
+import { useThemeContext } from '../embedded-chatbot/theme/theme-context'
+import {
+  ChatWithHistoryContext,
+  useChatWithHistoryContext,
+} from './context'
+import { useChatWithHistory } from './hooks'
+import Sidebar from './sidebar'
+import Header from './header'
+import HeaderInMobile from './header-in-mobile'
+import ChatWrapper from './chat-wrapper'
+import type { InstalledApp } from '@/models/explore'
+import Loading from '@/app/components/base/loading'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import { checkOrSetAccessToken } from '@/app/components/share/utils'
+import AppUnavailable from '@/app/components/base/app-unavailable'
+import cn from '@/utils/classnames'
+
+type ChatWithHistoryProps = {
+  className?: string
+}
+const ChatWithHistory: FC<ChatWithHistoryProps> = ({
+  className,
+}) => {
+  const {
+    appInfoError,
+    appData,
+    appInfoLoading,
+    appChatListDataLoading,
+    chatShouldReloadKey,
+    isMobile,
+    themeBuilder,
+    sidebarCollapseState,
+  } = useChatWithHistoryContext()
+  const isSidebarCollapsed = sidebarCollapseState
+  const customConfig = appData?.custom_config
+  const site = appData?.site
+
+  const [showSidePanel, setShowSidePanel] = useState(false)
+
+  useEffect(() => {
+    themeBuilder?.buildTheme(site?.chat_color_theme, site?.chat_color_theme_inverted)
+    if (site) {
+      if (customConfig)
+        document.title = `${site.title}`
+      else
+        document.title = `${site.title} - Powered by Dify`
+    }
+  }, [site, customConfig, themeBuilder])
+
+  if (appInfoLoading) {
+    return (
+      <Loading type='app' />
+    )
+  }
+
+  if (appInfoError) {
+    return (
+      <AppUnavailable />
+    )
+  }
+
+  return (
+    <div className={cn(
+      'flex h-full bg-background-default-burn',
+      isMobile && 'flex-col',
+      className,
+    )}>
+      {!isMobile && (
+        <div className={cn(
+          'flex w-[236px] flex-col p-1 pr-0 transition-all duration-200 ease-in-out',
+          isSidebarCollapsed && 'w-0 overflow-hidden !p-0',
+        )}>
+          <Sidebar />
+        </div>
+      )}
+      {isMobile && (
+        <HeaderInMobile />
+      )}
+      <div className={cn('relative grow p-2', isMobile && 'h-[calc(100%_-_56px)] p-0')}>
+        {isSidebarCollapsed && (
+          <div
+            className={cn(
+              'absolute top-0 z-20 flex h-full w-[256px] flex-col p-2 transition-all duration-500 ease-in-out',
+              showSidePanel ? 'left-0' : 'left-[-248px]',
+            )}
+            onMouseEnter={() => setShowSidePanel(true)}
+            onMouseLeave={() => setShowSidePanel(false)}
+          >
+            <Sidebar isPanel />
+          </div>
+        )}
+        <div className={cn('flex h-full flex-col overflow-hidden border-[0,5px] border-components-panel-border-subtle bg-chatbot-bg', isMobile ? 'rounded-t-2xl' : 'rounded-2xl')}>
+          {!isMobile && <Header />}
+          {appChatListDataLoading && (
+            <Loading type='app' />
+          )}
+          {!appChatListDataLoading && (
+            <ChatWrapper key={chatShouldReloadKey} />
+          )}
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export type ChatWithHistoryWrapProps = {
+  installedAppInfo?: InstalledApp
+  className?: string
+}
+const ChatWithHistoryWrap: FC<ChatWithHistoryWrapProps> = ({
+  installedAppInfo,
+  className,
+}) => {
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+  const themeBuilder = useThemeContext()
+
+  const {
+    appInfoError,
+    appInfoLoading,
+    appData,
+    appParams,
+    appMeta,
+    appChatListDataLoading,
+    currentConversationId,
+    currentConversationItem,
+    appPrevChatTree,
+    pinnedConversationList,
+    conversationList,
+    newConversationInputs,
+    newConversationInputsRef,
+    handleNewConversationInputsChange,
+    inputsForms,
+    handleNewConversation,
+    handleStartChat,
+    handleChangeConversation,
+    handlePinConversation,
+    handleUnpinConversation,
+    handleDeleteConversation,
+    conversationRenaming,
+    handleRenameConversation,
+    handleNewConversationCompleted,
+    chatShouldReloadKey,
+    isInstalledApp,
+    appId,
+    handleFeedback,
+    currentChatInstanceRef,
+    sidebarCollapseState,
+    handleSidebarCollapse,
+    clearChatList,
+    setClearChatList,
+    isResponding,
+    setIsResponding,
+    currentConversationInputs,
+    setCurrentConversationInputs,
+  } = useChatWithHistory(installedAppInfo)
+
+  return (
+    <ChatWithHistoryContext.Provider value={{
+      appInfoError,
+      appInfoLoading,
+      appData,
+      appParams,
+      appMeta,
+      appChatListDataLoading,
+      currentConversationId,
+      currentConversationItem,
+      appPrevChatTree,
+      pinnedConversationList,
+      conversationList,
+      newConversationInputs,
+      newConversationInputsRef,
+      handleNewConversationInputsChange,
+      inputsForms,
+      handleNewConversation,
+      handleStartChat,
+      handleChangeConversation,
+      handlePinConversation,
+      handleUnpinConversation,
+      handleDeleteConversation,
+      conversationRenaming,
+      handleRenameConversation,
+      handleNewConversationCompleted,
+      chatShouldReloadKey,
+      isMobile,
+      isInstalledApp,
+      appId,
+      handleFeedback,
+      currentChatInstanceRef,
+      themeBuilder,
+      sidebarCollapseState,
+      handleSidebarCollapse,
+      clearChatList,
+      setClearChatList,
+      isResponding,
+      setIsResponding,
+      currentConversationInputs,
+      setCurrentConversationInputs,
+    }}>
+      <ChatWithHistory className={className} />
+    </ChatWithHistoryContext.Provider>
+  )
+}
+
+const ChatWithHistoryWrapWithCheckToken: FC<ChatWithHistoryWrapProps> = ({
+  installedAppInfo,
+  className,
+}) => {
+  const [initialized, setInitialized] = useState(false)
+  const [appUnavailable, setAppUnavailable] = useState<boolean>(false)
+  const [isUnknownReason, setIsUnknownReason] = useState<boolean>(false)
+
+  useAsyncEffect(async () => {
+    if (!initialized) {
+      if (!installedAppInfo) {
+        try {
+          await checkOrSetAccessToken()
+        }
+        catch (e: any) {
+          if (e.status === 404) {
+            setAppUnavailable(true)
+          }
+          else {
+            setIsUnknownReason(true)
+            setAppUnavailable(true)
+          }
+        }
+      }
+      setInitialized(true)
+    }
+  }, [])
+
+  if (!initialized)
+    return null
+
+  if (appUnavailable)
+    return <AppUnavailable isUnknownReason={isUnknownReason} />
+
+  return (
+    <ChatWithHistoryWrap
+      installedAppInfo={installedAppInfo}
+      className={className}
+    />
+  )
+}
+
+export default ChatWithHistoryWrapWithCheckToken
diff --git a/app/components/base/chat/chat-with-history/inputs-form/content.tsx b/app/components/base/chat/chat-with-history/inputs-form/content.tsx
new file mode 100644
index 0000000..b8d1824
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/inputs-form/content.tsx
@@ -0,0 +1,115 @@
+import React, { memo, useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useChatWithHistoryContext } from '../context'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import { PortalSelect } from '@/app/components/base/select'
+import { FileUploaderInAttachmentWrapper } from '@/app/components/base/file-uploader'
+import { InputVarType } from '@/app/components/workflow/types'
+
+type Props = {
+  showTip?: boolean
+}
+
+const InputsFormContent = ({ showTip }: Props) => {
+  const { t } = useTranslation()
+  const {
+    appParams,
+    inputsForms,
+    currentConversationId,
+    currentConversationInputs,
+    setCurrentConversationInputs,
+    newConversationInputs,
+    newConversationInputsRef,
+    handleNewConversationInputsChange,
+  } = useChatWithHistoryContext()
+  const inputsFormValue = currentConversationId ? currentConversationInputs : newConversationInputs
+
+  const handleFormChange = useCallback((variable: string, value: any) => {
+    setCurrentConversationInputs({
+      ...currentConversationInputs,
+      [variable]: value,
+    })
+    handleNewConversationInputsChange({
+      ...newConversationInputsRef.current,
+      [variable]: value,
+    })
+  }, [newConversationInputsRef, handleNewConversationInputsChange, currentConversationInputs, setCurrentConversationInputs])
+
+  return (
+    <div className='space-y-4'>
+      {inputsForms.map(form => (
+        <div key={form.variable} className='space-y-1'>
+          <div className='flex h-6 items-center gap-1'>
+            <div className='system-md-semibold text-text-secondary'>{form.label}</div>
+            {!form.required && (
+              <div className='system-xs-regular text-text-tertiary'>{t('appDebug.variableTable.optional')}</div>
+            )}
+          </div>
+          {form.type === InputVarType.textInput && (
+            <Input
+              value={inputsFormValue?.[form.variable] || ''}
+              onChange={e => handleFormChange(form.variable, e.target.value)}
+              placeholder={form.label}
+            />
+          )}
+          {form.type === InputVarType.number && (
+            <Input
+              type='number'
+              value={inputsFormValue?.[form.variable] || ''}
+              onChange={e => handleFormChange(form.variable, e.target.value)}
+              placeholder={form.label}
+            />
+          )}
+          {form.type === InputVarType.paragraph && (
+            <Textarea
+              value={inputsFormValue?.[form.variable] || ''}
+              onChange={e => handleFormChange(form.variable, e.target.value)}
+              placeholder={form.label}
+            />
+          )}
+          {form.type === InputVarType.select && (
+            <PortalSelect
+              popupClassName='w-[200px]'
+              value={inputsFormValue?.[form.variable]}
+              items={form.options.map((option: string) => ({ value: option, name: option }))}
+              onSelect={item => handleFormChange(form.variable, item.value as string)}
+              placeholder={form.label}
+            />
+          )}
+          {form.type === InputVarType.singleFile && (
+            <FileUploaderInAttachmentWrapper
+              value={inputsFormValue?.[form.variable] ? [inputsFormValue?.[form.variable]] : []}
+              onChange={files => handleFormChange(form.variable, files[0])}
+              fileConfig={{
+                allowed_file_types: form.allowed_file_types,
+                allowed_file_extensions: form.allowed_file_extensions,
+                allowed_file_upload_methods: form.allowed_file_upload_methods,
+                number_limits: 1,
+                fileUploadConfig: (appParams as any).system_parameters,
+              }}
+            />
+          )}
+          {form.type === InputVarType.multiFiles && (
+            <FileUploaderInAttachmentWrapper
+              value={inputsFormValue?.[form.variable] || []}
+              onChange={files => handleFormChange(form.variable, files)}
+              fileConfig={{
+                allowed_file_types: form.allowed_file_types,
+                allowed_file_extensions: form.allowed_file_extensions,
+                allowed_file_upload_methods: form.allowed_file_upload_methods,
+                number_limits: form.max_length,
+                fileUploadConfig: (appParams as any).system_parameters,
+              }}
+            />
+          )}
+        </div>
+      ))}
+      {showTip && (
+        <div className='system-xs-regular text-text-tertiary'>{t('share.chat.chatFormTip')}</div>
+      )}
+    </div>
+  )
+}
+
+export default memo(InputsFormContent)
diff --git a/app/components/base/chat/chat-with-history/inputs-form/index.tsx b/app/components/base/chat/chat-with-history/inputs-form/index.tsx
new file mode 100644
index 0000000..30ec11c
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/inputs-form/index.tsx
@@ -0,0 +1,79 @@
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { Message3Fill } from '@/app/components/base/icons/src/public/other'
+import Button from '@/app/components/base/button'
+import Divider from '@/app/components/base/divider'
+import InputsFormContent from '@/app/components/base/chat/chat-with-history/inputs-form/content'
+import { useChatWithHistoryContext } from '../context'
+import cn from '@/utils/classnames'
+
+type Props = {
+  collapsed: boolean
+  setCollapsed: (collapsed: boolean) => void
+}
+
+const InputsFormNode = ({
+  collapsed,
+  setCollapsed,
+}: Props) => {
+  const { t } = useTranslation()
+  const {
+    isMobile,
+    currentConversationId,
+    handleStartChat,
+    themeBuilder,
+  } = useChatWithHistoryContext()
+
+  return (
+    <div className={cn('flex flex-col items-center px-4 pt-6', isMobile && 'pt-4')}>
+      <div className={cn(
+        'w-full max-w-[672px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-md',
+        collapsed && 'border border-components-card-border bg-components-card-bg shadow-none',
+      )}>
+        <div className={cn(
+          'flex items-center gap-3 rounded-t-2xl px-6 py-4',
+          !collapsed && 'border-b border-divider-subtle',
+          isMobile && 'px-4 py-3',
+        )}>
+          <Message3Fill className='h-6 w-6 shrink-0' />
+          <div className='system-xl-semibold grow text-text-secondary'>{t('share.chat.chatSettingsTitle')}</div>
+          {collapsed && (
+            <Button className='uppercase text-text-tertiary' size='small' variant='ghost' onClick={() => setCollapsed(false)}>{t('common.operation.edit')}</Button>
+          )}
+          {!collapsed && currentConversationId && (
+            <Button className='uppercase text-text-tertiary' size='small' variant='ghost' onClick={() => setCollapsed(true)}>{t('common.operation.close')}</Button>
+          )}
+        </div>
+        {!collapsed && (
+          <div className={cn('p-6', isMobile && 'p-4')}>
+            <InputsFormContent />
+          </div>
+        )}
+        {!collapsed && !currentConversationId && (
+          <div className={cn('p-6', isMobile && 'p-4')}>
+            <Button
+              variant='primary'
+              className='w-full'
+              onClick={() => handleStartChat(() => setCollapsed(true))}
+              style={
+                themeBuilder?.theme
+                  ? {
+                    backgroundColor: themeBuilder?.theme.primaryColor,
+                  }
+                  : {}
+              }
+            >{t('share.chat.startChat')}</Button>
+          </div>
+        )}
+      </div>
+      {collapsed && (
+        <div className='flex w-full max-w-[720px] items-center py-4'>
+          <Divider bgStyle='gradient' className='h-px basis-1/2 rotate-180' />
+          <Divider bgStyle='gradient' className='h-px basis-1/2' />
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default InputsFormNode
diff --git a/app/components/base/chat/chat-with-history/inputs-form/view-form-dropdown.tsx b/app/components/base/chat/chat-with-history/inputs-form/view-form-dropdown.tsx
new file mode 100644
index 0000000..43df99c
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/inputs-form/view-form-dropdown.tsx
@@ -0,0 +1,48 @@
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiChatSettingsLine,
+} from '@remixicon/react'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
+import { Message3Fill } from '@/app/components/base/icons/src/public/other'
+import InputsFormContent from '@/app/components/base/chat/chat-with-history/inputs-form/content'
+
+const ViewFormDropdown = () => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 4,
+      }}
+    >
+      <PortalToFollowElemTrigger
+        onClick={() => setOpen(v => !v)}
+      >
+        <ActionButton size='l' state={open ? ActionButtonState.Hover : ActionButtonState.Default}>
+          <RiChatSettingsLine className='h-[18px] w-[18px]' />
+        </ActionButton>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className="z-50">
+        <div className='w-[400px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-lg backdrop-blur-sm'>
+          <div className='flex items-center gap-3 rounded-t-2xl border-b border-divider-subtle px-6 py-4'>
+            <Message3Fill className='h-6 w-6 shrink-0' />
+            <div className='system-xl-semibold grow text-text-secondary'>{t('share.chat.chatSettingsTitle')}</div>
+          </div>
+          <div className='p-6'>
+            <InputsFormContent />
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+
+  )
+}
+
+export default ViewFormDropdown
diff --git a/app/components/base/chat/chat-with-history/sidebar/index.tsx b/app/components/base/chat/chat-with-history/sidebar/index.tsx
new file mode 100644
index 0000000..dc4e864
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/sidebar/index.tsx
@@ -0,0 +1,179 @@
+import {
+  useCallback,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiEditBoxLine,
+  RiExpandRightLine,
+  RiLayoutLeft2Line,
+} from '@remixicon/react'
+import { useChatWithHistoryContext } from '../context'
+import AppIcon from '@/app/components/base/app-icon'
+import ActionButton from '@/app/components/base/action-button'
+import Button from '@/app/components/base/button'
+import List from '@/app/components/base/chat/chat-with-history/sidebar/list'
+import MenuDropdown from '@/app/components/share/text-generation/menu-dropdown'
+import Confirm from '@/app/components/base/confirm'
+import RenameModal from '@/app/components/base/chat/chat-with-history/sidebar/rename-modal'
+import DifyLogo from '@/app/components/base/logo/dify-logo'
+import type { ConversationItem } from '@/models/share'
+import cn from '@/utils/classnames'
+
+type Props = {
+  isPanel?: boolean
+}
+
+const Sidebar = ({ isPanel }: Props) => {
+  const { t } = useTranslation()
+  const {
+    appData,
+    handleNewConversation,
+    pinnedConversationList,
+    conversationList,
+    currentConversationId,
+    handleChangeConversation,
+    handlePinConversation,
+    handleUnpinConversation,
+    conversationRenaming,
+    handleRenameConversation,
+    handleDeleteConversation,
+    sidebarCollapseState,
+    handleSidebarCollapse,
+    isMobile,
+    isResponding,
+  } = useChatWithHistoryContext()
+  const isSidebarCollapsed = sidebarCollapseState
+
+  const [showConfirm, setShowConfirm] = useState<ConversationItem | null>(null)
+  const [showRename, setShowRename] = useState<ConversationItem | null>(null)
+
+  const handleOperate = useCallback((type: string, item: ConversationItem) => {
+    if (type === 'pin')
+      handlePinConversation(item.id)
+
+    if (type === 'unpin')
+      handleUnpinConversation(item.id)
+
+    if (type === 'delete')
+      setShowConfirm(item)
+
+    if (type === 'rename')
+      setShowRename(item)
+  }, [handlePinConversation, handleUnpinConversation])
+  const handleCancelConfirm = useCallback(() => {
+    setShowConfirm(null)
+  }, [])
+  const handleDelete = useCallback(() => {
+    if (showConfirm)
+      handleDeleteConversation(showConfirm.id, { onSuccess: handleCancelConfirm })
+  }, [showConfirm, handleDeleteConversation, handleCancelConfirm])
+  const handleCancelRename = useCallback(() => {
+    setShowRename(null)
+  }, [])
+  const handleRename = useCallback((newName: string) => {
+    if (showRename)
+      handleRenameConversation(showRename.id, newName, { onSuccess: handleCancelRename })
+  }, [showRename, handleRenameConversation, handleCancelRename])
+
+  return (
+    <div className={cn(
+      'flex w-full grow flex-col',
+      isPanel && 'rounded-xl border-[0.5px] border-components-panel-border-subtle bg-components-panel-bg shadow-lg',
+    )}>
+      <div className={cn(
+        'flex shrink-0 items-center gap-3 p-3 pr-2',
+      )}>
+        <div className='shrink-0'>
+          <AppIcon
+            size='large'
+            iconType={appData?.site.icon_type}
+            icon={appData?.site.icon}
+            background={appData?.site.icon_background}
+            imageUrl={appData?.site.icon_url}
+          />
+        </div>
+        <div className={cn('system-md-semibold grow truncate text-text-secondary')}>{appData?.site.title}</div>
+        {!isMobile && isSidebarCollapsed && (
+          <ActionButton size='l' onClick={() => handleSidebarCollapse(false)}>
+            <RiExpandRightLine className='h-[18px] w-[18px]' />
+          </ActionButton>
+        )}
+        {!isMobile && !isSidebarCollapsed && (
+          <ActionButton size='l' onClick={() => handleSidebarCollapse(true)}>
+            <RiLayoutLeft2Line className='h-[18px] w-[18px]' />
+          </ActionButton>
+        )}
+      </div>
+      <div className='shrink-0 px-3 py-4'>
+        <Button variant='secondary-accent' disabled={isResponding} className='w-full justify-center' onClick={handleNewConversation}>
+          <RiEditBoxLine className='mr-1 h-4 w-4' />
+          {t('share.chat.newChat')}
+        </Button>
+      </div>
+      <div className='h-0 grow space-y-2 overflow-y-auto px-3 pt-4'>
+        {/* pinned list */}
+        {!!pinnedConversationList.length && (
+          <div className='mb-4'>
+            <List
+              isPin
+              title={t('share.chat.pinnedTitle') || ''}
+              list={pinnedConversationList}
+              onChangeConversation={handleChangeConversation}
+              onOperate={handleOperate}
+              currentConversationId={currentConversationId}
+            />
+          </div>
+        )}
+        {!!conversationList.length && (
+          <List
+            title={(pinnedConversationList.length && t('share.chat.unpinnedTitle')) || ''}
+            list={conversationList}
+            onChangeConversation={handleChangeConversation}
+            onOperate={handleOperate}
+            currentConversationId={currentConversationId}
+          />
+        )}
+      </div>
+      <div className='flex shrink-0 items-center justify-between p-3'>
+        <MenuDropdown placement='top-start' data={appData?.site} />
+        {/* powered by */}
+        <div className='shrink-0'>
+          {!appData?.custom_config?.remove_webapp_brand && (
+            <div className={cn(
+              'flex shrink-0 items-center gap-1.5 px-1',
+            )}>
+              <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('share.chat.poweredBy')}</div>
+              {appData?.custom_config?.replace_webapp_logo && (
+                <img src={appData?.custom_config?.replace_webapp_logo} alt='logo' className='block h-5 w-auto' />
+              )}
+              {!appData?.custom_config?.replace_webapp_logo && (
+                <DifyLogo size='small' />
+              )}
+            </div>
+          )}
+        </div>
+      </div>
+      {!!showConfirm && (
+        <Confirm
+          title={t('share.chat.deleteConversation.title')}
+          content={t('share.chat.deleteConversation.content') || ''}
+          isShow
+          onCancel={handleCancelConfirm}
+          onConfirm={handleDelete}
+        />
+      )}
+      {showRename && (
+        <RenameModal
+          isShow
+          onClose={handleCancelRename}
+          saveLoading={conversationRenaming}
+          name={showRename?.name || ''}
+          onSave={handleRename}
+        />
+      )}
+    </div>
+  )
+}
+
+export default Sidebar
diff --git a/app/components/base/chat/chat-with-history/sidebar/item.tsx b/app/components/base/chat/chat-with-history/sidebar/item.tsx
new file mode 100644
index 0000000..ea17f3f
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/sidebar/item.tsx
@@ -0,0 +1,58 @@
+import type { FC } from 'react'
+import {
+  memo,
+  useRef,
+} from 'react'
+import { useHover } from 'ahooks'
+import type { ConversationItem } from '@/models/share'
+import Operation from '@/app/components/base/chat/chat-with-history/sidebar/operation'
+import cn from '@/utils/classnames'
+
+type ItemProps = {
+  isPin?: boolean
+  item: ConversationItem
+  onOperate: (type: string, item: ConversationItem) => void
+  onChangeConversation: (conversationId: string) => void
+  currentConversationId: string
+}
+const Item: FC<ItemProps> = ({
+  isPin,
+  item,
+  onOperate,
+  onChangeConversation,
+  currentConversationId,
+}) => {
+  const ref = useRef(null)
+  const isHovering = useHover(ref)
+  const isSelected = currentConversationId === item.id
+
+  return (
+    <div
+      ref={ref}
+      key={item.id}
+      className={cn(
+        'system-sm-medium group flex cursor-pointer rounded-lg p-1 pl-3 text-components-menu-item-text hover:bg-state-base-hover',
+        isSelected && 'bg-state-accent-active text-text-accent hover:bg-state-accent-active',
+      )}
+      onClick={() => onChangeConversation(item.id)}
+    >
+      <div className='grow truncate p-1 pl-0' title={item.name}>{item.name}</div>
+      {item.id !== '' && (
+        <div className='shrink-0' onClick={e => e.stopPropagation()}>
+          <Operation
+            isActive={isSelected}
+            isPinned={!!isPin}
+            isItemHovering={isHovering}
+            togglePin={() => onOperate(isPin ? 'unpin' : 'pin', item)}
+            isShowDelete
+            isShowRenameConversation
+            onRenameConversation={() => onOperate('rename', item)}
+            onDelete={() => onOperate('delete', item)}
+          />
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default memo(Item)
diff --git a/app/components/base/chat/chat-with-history/sidebar/list.tsx b/app/components/base/chat/chat-with-history/sidebar/list.tsx
new file mode 100644
index 0000000..4a9c207
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/sidebar/list.tsx
@@ -0,0 +1,40 @@
+import type { FC } from 'react'
+import Item from './item'
+import type { ConversationItem } from '@/models/share'
+
+type ListProps = {
+  isPin?: boolean
+  title?: string
+  list: ConversationItem[]
+  onOperate: (type: string, item: ConversationItem) => void
+  onChangeConversation: (conversationId: string) => void
+  currentConversationId: string
+}
+const List: FC<ListProps> = ({
+  isPin,
+  title,
+  list,
+  onOperate,
+  onChangeConversation,
+  currentConversationId,
+}) => {
+  return (
+    <div className='space-y-0.5'>
+      {title && (
+        <div className='system-xs-medium-uppercase px-3 pb-1 pt-2 text-text-tertiary'>{title}</div>
+      )}
+      {list.map(item => (
+        <Item
+          key={item.id}
+          isPin={isPin}
+          item={item}
+          onOperate={onOperate}
+          onChangeConversation={onChangeConversation}
+          currentConversationId={currentConversationId}
+        />
+      ))}
+    </div>
+  )
+}
+
+export default List
diff --git a/app/components/base/chat/chat-with-history/sidebar/operation.tsx b/app/components/base/chat/chat-with-history/sidebar/operation.tsx
new file mode 100644
index 0000000..19d2aa2
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/sidebar/operation.tsx
@@ -0,0 +1,101 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useRef, useState } from 'react'
+import {
+  RiDeleteBinLine,
+  RiEditLine,
+  RiMoreFill,
+  RiPushpinLine,
+  RiUnpinLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
+import cn from '@/utils/classnames'
+
+type Props = {
+  isActive?: boolean
+  isItemHovering?: boolean
+  isPinned: boolean
+  isShowRenameConversation?: boolean
+  onRenameConversation?: () => void
+  isShowDelete: boolean
+  togglePin: () => void
+  onDelete: () => void
+}
+
+const Operation: FC<Props> = ({
+  isActive,
+  isItemHovering,
+  isPinned,
+  togglePin,
+  isShowRenameConversation,
+  onRenameConversation,
+  isShowDelete,
+  onDelete,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const ref = useRef(null)
+  const [isHovering, { setTrue: setIsHovering, setFalse: setNotHovering }] = useBoolean(false)
+  useEffect(() => {
+    if (!isItemHovering && !isHovering)
+      setOpen(false)
+  }, [isItemHovering, isHovering])
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={4}
+    >
+      <PortalToFollowElemTrigger
+        onClick={() => setOpen(v => !v)}
+      >
+        <ActionButton
+          className={cn((isItemHovering || open) ? 'opacity-100' : 'opacity-0')}
+          state={
+            isActive
+              ? ActionButtonState.Active
+              : open
+                ? ActionButtonState.Hover
+                : ActionButtonState.Default
+          }
+        >
+          <RiMoreFill className='h-4 w-4' />
+        </ActionButton>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className="z-50">
+        <div
+          ref={ref}
+          className={'min-w-[120px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg backdrop-blur-sm'}
+          onMouseEnter={setIsHovering}
+          onMouseLeave={setNotHovering}
+          onClick={(e) => {
+            e.stopPropagation()
+          }}
+        >
+          <div className={cn('system-md-regular flex cursor-pointer items-center space-x-1 rounded-lg px-2 py-1.5 text-text-secondary hover:bg-state-base-hover')} onClick={togglePin}>
+            {isPinned && <RiUnpinLine className='h-4 w-4 shrink-0 text-text-tertiary' />}
+            {!isPinned && <RiPushpinLine className='h-4 w-4 shrink-0 text-text-tertiary' />}
+            <span className='grow'>{isPinned ? t('explore.sidebar.action.unpin') : t('explore.sidebar.action.pin')}</span>
+          </div>
+          {isShowRenameConversation && (
+            <div className={cn('system-md-regular flex cursor-pointer items-center space-x-1 rounded-lg px-2 py-1.5 text-text-secondary hover:bg-state-base-hover')} onClick={onRenameConversation}>
+              <RiEditLine className='h-4 w-4 shrink-0 text-text-tertiary' />
+              <span className='grow'>{t('explore.sidebar.action.rename')}</span>
+            </div>
+          )}
+          {isShowDelete && (
+            <div className={cn('system-md-regular group flex cursor-pointer items-center space-x-1 rounded-lg px-2 py-1.5 text-text-secondary hover:bg-state-destructive-hover hover:text-text-destructive')} onClick={onDelete} >
+              <RiDeleteBinLine className={cn('h-4 w-4 shrink-0 text-text-tertiary group-hover:text-text-destructive')} />
+              <span className='grow'>{t('explore.sidebar.action.delete')}</span>
+            </div>
+          )}
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default React.memo(Operation)
diff --git a/app/components/base/chat/chat-with-history/sidebar/rename-modal.tsx b/app/components/base/chat/chat-with-history/sidebar/rename-modal.tsx
new file mode 100644
index 0000000..bbd087a
--- /dev/null
+++ b/app/components/base/chat/chat-with-history/sidebar/rename-modal.tsx
@@ -0,0 +1,47 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+
+export type IRenameModalProps = {
+  isShow: boolean
+  saveLoading: boolean
+  name: string
+  onClose: () => void
+  onSave: (name: string) => void
+}
+
+const RenameModal: FC<IRenameModalProps> = ({
+  isShow,
+  saveLoading,
+  name,
+  onClose,
+  onSave,
+}) => {
+  const { t } = useTranslation()
+  const [tempName, setTempName] = useState(name)
+
+  return (
+    <Modal
+      title={t('common.chat.renameConversation')}
+      isShow={isShow}
+      onClose={onClose}
+    >
+      <div className={'mt-6 text-sm font-medium leading-[21px] text-text-primary'}>{t('common.chat.conversationName')}</div>
+      <Input className='mt-2 h-10 w-full'
+        value={tempName}
+        onChange={e => setTempName(e.target.value)}
+        placeholder={t('common.chat.conversationNamePlaceholder') || ''}
+      />
+
+      <div className='mt-10 flex justify-end'>
+        <Button className='mr-2 shrink-0' onClick={onClose}>{t('common.operation.cancel')}</Button>
+        <Button variant='primary' className='shrink-0' onClick={() => onSave(tempName)} loading={saveLoading}>{t('common.operation.save')}</Button>
+      </div>
+    </Modal>
+  )
+}
+export default React.memo(RenameModal)
diff --git a/app/components/base/chat/chat/answer/__mocks__/markdownContent.ts b/app/components/base/chat/chat/answer/__mocks__/markdownContent.ts
new file mode 100644
index 0000000..a7a25f5
--- /dev/null
+++ b/app/components/base/chat/chat/answer/__mocks__/markdownContent.ts
@@ -0,0 +1,61 @@
+export const markdownContent = `
+# Heading 1
+
+## Heading 2
+
+### Heading 3
+
+#### Heading 4
+
+##### Heading 5
+
+###### Heading 6
+
+# Basic markdown content.
+
+Should support **bold**, *italic*, and ~~strikethrough~~.
+Should support [links](https://www.google.com).
+Should support inline \`code\` blocks.
+
+# Number list
+
+1. First item
+2. Second item
+3. Third item
+
+# Bullet list
+
+- First item
+- Second item
+- Third item
+
+# Link
+
+[Google](https://www.google.com)
+
+# Image
+
+![Alt text](https://picsum.photos/200/300)
+
+# Table
+
+| Column 1 | Column 2 | Column 3 |
+| -------- | -------- | -------- |
+| Cell 1   | Cell 2   | Cell 3   |
+| Cell 4   | Cell 5   | Cell 6   |
+| Cell 7   | Cell 8   | Cell 9   |
+
+# Code
+
+\`\`\`JavaScript
+const code = "code"
+\`\`\`
+
+# Blockquote
+
+> This is a blockquote.
+
+# Horizontal rule
+
+---
+`
diff --git a/app/components/base/chat/chat/answer/__mocks__/markdownContentSVG.ts b/app/components/base/chat/chat/answer/__mocks__/markdownContentSVG.ts
new file mode 100644
index 0000000..bcc3ae6
--- /dev/null
+++ b/app/components/base/chat/chat/answer/__mocks__/markdownContentSVG.ts
@@ -0,0 +1,27 @@
+export const markdownContentSVG = `
+\`\`\`svg
+<svg width="400" height="600" xmlns="http://www.w3.org/2000/svg">
+  <rect width="100%" height="100%" fill="#F0F8FF"/>
+
+  <text x="50%" y="60" font-family="妤蜂綋" font-size="32" fill="#4682B4" text-anchor="middle">鍒涙剰Logo璁捐</text>
+
+  <line x1="50" y1="80" x2="350" y2="80" stroke="#B0C4DE" stroke-width="2"/>
+
+  <text x="50%" y="120" font-family="Arial" font-size="24" fill="#708090" text-anchor="middle">绉戠爺</text>
+  <text x="50%" y="150" font-family="MS Mincho" font-size="20" fill="#778899" text-anchor="middle">绉戝鐮旂┒</text>
+
+  <text x="50%" y="200" font-family="姹囨枃鏄庢湞浣�" font-size="18" fill="#696969" text-anchor="middle">
+    <tspan x="50%" dy="25">鎺㈢储鏈煡鐨勭伅濉旓紝</tspan>
+    <tspan x="50%" dy="25">鐓т寒浜虹被鍓嶈繘鐨勯亾璺��</tspan>
+    <tspan x="50%" dy="25">绉戠爺锛屾槸姘镐笉鐔勭伃鐨勫ソ濂囧績锛�</tspan>
+    <tspan x="50%" dy="25">涔熸槸鎺ㄥ姩涓栫晫杩涙鐨勫紩鎿庛��</tspan>
+  </text>
+
+  <circle cx="200" cy="400" r="80" fill="none" stroke="#4169E1" stroke-width="3"/>
+  <line x1="200" y1="320" x2="200" y2="480" stroke="#4169E1" stroke-width="3"/>
+  <line x1="120" y1="400" x2="280" y2="400" stroke="#4169E1" stroke-width="3"/>
+
+  <text x="50%" y="550" font-family="寰蒋闆呴粦" font-size="16" fill="#1E90FF" text-anchor="middle">鎺㈢储 鈥� 鍒涙柊 鈥� 杩涙</text>
+</svg>
+\`\`\`
+`
diff --git a/app/components/base/chat/chat/answer/__mocks__/workflowProcess.ts b/app/components/base/chat/chat/answer/__mocks__/workflowProcess.ts
new file mode 100644
index 0000000..b6bd9a6
--- /dev/null
+++ b/app/components/base/chat/chat/answer/__mocks__/workflowProcess.ts
@@ -0,0 +1,138 @@
+import type { WorkflowProcess } from '@/app/components/base/chat/types'
+import { WorkflowRunningStatus } from '@/app/components/workflow/types'
+
+export const mockedWorkflowProcess = {
+  status: WorkflowRunningStatus.Succeeded,
+  resultText: 'Hello, how can I assist you today?',
+  tracing: [
+    {
+      extras: {},
+      id: 'f6337dc9-e280-4915-965f-10b0552dd917',
+      node_id: '1724232060789',
+      node_type: 'start',
+      title: 'Start',
+      index: 1,
+      predecessor_node_id: null,
+      inputs: {
+        'sys.query': 'hi',
+        'sys.files': [],
+        'sys.conversation_id': '92ce0a3e-8f15-43d1-b31d-32716c4b10a7',
+        'sys.user_id': 'fbff43f9-d5a4-4e85-b63b-d3a91d806c6f',
+        'sys.dialogue_count': 1,
+        'sys.app_id': 'b2e8906a-aad3-43a0-9ace-0e44cc7315e1',
+        'sys.workflow_id': '70004abe-561f-418b-b9e8-8c957ce55140',
+        'sys.workflow_run_id': '69db9267-aaee-42e1-9581-dbfb67e8eeb5',
+      },
+      process_data: null,
+      outputs: {
+        'sys.query': 'hi',
+        'sys.files': [],
+        'sys.conversation_id': '92ce0a3e-8f15-43d1-b31d-32716c4b10a7',
+        'sys.user_id': 'fbff43f9-d5a4-4e85-b63b-d3a91d806c6f',
+        'sys.dialogue_count': 1,
+        'sys.app_id': 'b2e8906a-aad3-43a0-9ace-0e44cc7315e1',
+        'sys.workflow_id': '70004abe-561f-418b-b9e8-8c957ce55140',
+        'sys.workflow_run_id': '69db9267-aaee-42e1-9581-dbfb67e8eeb5',
+      },
+      status: 'succeeded',
+      error: null,
+      elapsed_time: 0.035744,
+      execution_metadata: null,
+      created_at: 1728980002,
+      finished_at: 1728980002,
+      files: [],
+      parallel_id: null,
+      parallel_start_node_id: null,
+      parent_parallel_id: null,
+      parent_parallel_start_node_id: null,
+      iteration_id: null,
+      loop_id: null,
+    },
+    {
+      extras: {},
+      id: '92204d8d-4198-4c46-aa02-c2754b11dec9',
+      node_id: 'llm',
+      node_type: 'llm',
+      title: 'LLM',
+      index: 2,
+      predecessor_node_id: '1724232060789',
+      inputs: null,
+      process_data: {
+        model_mode: 'chat',
+        prompts: [
+          {
+            role: 'system',
+            text: 'hi',
+            files: [],
+          },
+          {
+            role: 'user',
+            text: 'hi',
+            files: [],
+          },
+        ],
+        model_provider: 'openai',
+        model_name: 'gpt-4o-mini',
+      },
+      outputs: {
+        text: 'Hello! How can I assist you today?',
+        usage: {
+          prompt_tokens: 13,
+          prompt_unit_price: '0.15',
+          prompt_price_unit: '0.000001',
+          prompt_price: '0.0000020',
+          completion_tokens: 9,
+          completion_unit_price: '0.60',
+          completion_price_unit: '0.000001',
+          completion_price: '0.0000054',
+          total_tokens: 22,
+          total_price: '0.0000074',
+          currency: 'USD',
+          latency: 1.8902503330027685,
+        },
+        finish_reason: 'stop',
+      },
+      status: 'succeeded',
+      error: null,
+      elapsed_time: 5.089409,
+      execution_metadata: {
+        total_tokens: 22,
+        total_price: '0.0000074',
+        currency: 'USD',
+      },
+      created_at: 1728980002,
+      finished_at: 1728980007,
+      files: [],
+      parallel_id: null,
+      parallel_start_node_id: null,
+      parent_parallel_id: null,
+      parent_parallel_start_node_id: null,
+      iteration_id: null,
+      loop_id: null,
+    },
+    {
+      extras: {},
+      id: '7149bac6-60f9-4e06-a5ed-1d9d3764c06b',
+      node_id: 'answer',
+      node_type: 'answer',
+      title: 'Answer',
+      index: 3,
+      predecessor_node_id: 'llm',
+      inputs: null,
+      process_data: null,
+      outputs: {
+        answer: 'Hello! How can I assist you today?',
+      },
+      status: 'succeeded',
+      error: null,
+      elapsed_time: 0.015339,
+      execution_metadata: null,
+      created_at: 1728980007,
+      finished_at: 1728980007,
+      parallel_id: null,
+      parallel_start_node_id: null,
+      parent_parallel_id: null,
+      parent_parallel_start_node_id: null,
+    },
+  ],
+} as unknown as WorkflowProcess
diff --git a/app/components/base/chat/chat/answer/agent-content.tsx b/app/components/base/chat/chat/answer/agent-content.tsx
new file mode 100644
index 0000000..c20e38c
--- /dev/null
+++ b/app/components/base/chat/chat/answer/agent-content.tsx
@@ -0,0 +1,61 @@
+import type { FC } from 'react'
+import { memo } from 'react'
+import type {
+  ChatItem,
+} from '../../types'
+import { Markdown } from '@/app/components/base/markdown'
+import Thought from '@/app/components/base/chat/chat/thought'
+import { FileList } from '@/app/components/base/file-uploader'
+import { getProcessedFilesFromResponse } from '@/app/components/base/file-uploader/utils'
+
+type AgentContentProps = {
+  item: ChatItem
+  responding?: boolean
+  content?: string
+}
+const AgentContent: FC<AgentContentProps> = ({
+  item,
+  responding,
+  content,
+}) => {
+  const {
+    annotation,
+    agent_thoughts,
+  } = item
+
+  if (annotation?.logAnnotation)
+    return <Markdown content={annotation?.logAnnotation.content || ''} />
+
+  return (
+    <div>
+      {content ? <Markdown content={content} /> : agent_thoughts?.map((thought, index) => (
+        <div key={index} className='px-2 py-1'>
+          {thought.thought && (
+            <Markdown content={thought.thought} />
+          )}
+          {/* {item.tool} */}
+          {/* perhaps not use tool */}
+          {!!thought.tool && (
+            <Thought
+              thought={thought}
+              isFinished={!!thought.observation || !responding}
+            />
+          )}
+
+          {
+            !!thought.message_files?.length && (
+              <FileList
+                files={getProcessedFilesFromResponse(thought.message_files.map((item: any) => ({ ...item, related_id: item.id })))}
+                showDeleteAction={false}
+                showDownloadAction={true}
+                canPreview={true}
+              />
+            )
+          }
+        </div>
+      ))}
+    </div>
+  )
+}
+
+export default memo(AgentContent)
diff --git a/app/components/base/chat/chat/answer/basic-content.tsx b/app/components/base/chat/chat/answer/basic-content.tsx
new file mode 100644
index 0000000..6c8a44c
--- /dev/null
+++ b/app/components/base/chat/chat/answer/basic-content.tsx
@@ -0,0 +1,31 @@
+import type { FC } from 'react'
+import { memo } from 'react'
+import type { ChatItem } from '../../types'
+import { Markdown } from '@/app/components/base/markdown'
+import cn from '@/utils/classnames'
+
+type BasicContentProps = {
+  item: ChatItem
+}
+const BasicContent: FC<BasicContentProps> = ({
+  item,
+}) => {
+  const {
+    annotation,
+    content,
+  } = item
+
+  if (annotation?.logAnnotation)
+    return <Markdown content={annotation?.logAnnotation.content || ''} />
+
+  return (
+    <Markdown
+      className={cn(
+        item.isError && '!text-[#F04438]',
+      )}
+      content={content}
+    />
+  )
+}
+
+export default memo(BasicContent)
diff --git a/app/components/base/chat/chat/answer/index.stories.tsx b/app/components/base/chat/chat/answer/index.stories.tsx
new file mode 100644
index 0000000..18bc129
--- /dev/null
+++ b/app/components/base/chat/chat/answer/index.stories.tsx
@@ -0,0 +1,96 @@
+import type { Meta, StoryObj } from '@storybook/react'
+
+import type { ChatItem } from '../../types'
+import { mockedWorkflowProcess } from './__mocks__/workflowProcess'
+import { markdownContent } from './__mocks__/markdownContent'
+import { markdownContentSVG } from './__mocks__/markdownContentSVG'
+import Answer from '.'
+
+const meta = {
+  title: 'Base/Chat Answer',
+  component: Answer,
+  parameters: {
+    layout: 'fullscreen',
+  },
+  tags: ['autodocs'],
+  argTypes: {
+    noChatInput: { control: 'boolean', description: 'If set to true, some buttons that are supposed to be shown on hover will not be displayed.' },
+    responding: { control: 'boolean', description: 'Indicates if the answer is being generated.' },
+    showPromptLog: { control: 'boolean', description: 'If set to true, the prompt log button will be shown on hover.' },
+  },
+  args: {
+    noChatInput: false,
+    responding: false,
+    showPromptLog: false,
+  },
+} satisfies Meta<typeof Answer>
+
+export default meta
+type Story = StoryObj<typeof meta>
+
+const mockedBaseChatItem = {
+  id: '1',
+  isAnswer: true,
+  content: 'Hello, how can I assist you today?',
+} satisfies ChatItem
+
+export const Basic: Story = {
+  args: {
+    item: mockedBaseChatItem,
+    question: mockedBaseChatItem.content,
+    index: 0,
+  },
+  render: (args) => {
+    return <div className="w-full px-10 py-5">
+      <Answer {...args} />
+    </div>
+  },
+}
+
+export const WithWorkflowProcess: Story = {
+  args: {
+    item: {
+      ...mockedBaseChatItem,
+      workflowProcess: mockedWorkflowProcess,
+    },
+    question: mockedBaseChatItem.content,
+    index: 0,
+  },
+  render: (args) => {
+    return <div className="w-full px-10 py-5">
+      <Answer {...args} />
+    </div>
+  },
+}
+
+export const WithMarkdownContent: Story = {
+  args: {
+    item: {
+      ...mockedBaseChatItem,
+      content: markdownContent,
+    },
+    question: mockedBaseChatItem.content,
+    index: 0,
+  },
+  render: (args) => {
+    return <div className="w-full px-10 py-5">
+      <Answer {...args} />
+    </div>
+  },
+}
+
+export const WithMarkdownSVG: Story = {
+  args: {
+    item: {
+      ...mockedBaseChatItem,
+      content: markdownContentSVG,
+    },
+    question: mockedBaseChatItem.content,
+    index: 0,
+  },
+  render: (args) => {
+    return <div className="w-full px-10 py-5">
+      <Answer {...args} />
+    </div>
+  },
+}
diff --git a/app/components/base/chat/chat/answer/index.tsx b/app/components/base/chat/chat/answer/index.tsx
new file mode 100644
index 0000000..a0a9323
--- /dev/null
+++ b/app/components/base/chat/chat/answer/index.tsx
@@ -0,0 +1,239 @@
+import type {
+  FC,
+  ReactNode,
+} from 'react'
+import { memo, useCallback, useEffect, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import type {
+  ChatConfig,
+  ChatItem,
+} from '../../types'
+import Operation from './operation'
+import AgentContent from './agent-content'
+import BasicContent from './basic-content'
+import SuggestedQuestions from './suggested-questions'
+import More from './more'
+import WorkflowProcessItem from './workflow-process'
+import LoadingAnim from '@/app/components/base/chat/chat/loading-anim'
+import Citation from '@/app/components/base/chat/chat/citation'
+import { EditTitle } from '@/app/components/app/annotation/edit-annotation-modal/edit-item'
+import type { AppData } from '@/models/share'
+import AnswerIcon from '@/app/components/base/answer-icon'
+import cn from '@/utils/classnames'
+import { FileList } from '@/app/components/base/file-uploader'
+import ContentSwitch from '../content-switch'
+
+type AnswerProps = {
+  item: ChatItem
+  question: string
+  index: number
+  config?: ChatConfig
+  answerIcon?: ReactNode
+  responding?: boolean
+  showPromptLog?: boolean
+  chatAnswerContainerInner?: string
+  hideProcessDetail?: boolean
+  appData?: AppData
+  noChatInput?: boolean
+  switchSibling?: (siblingMessageId: string) => void
+}
+const Answer: FC<AnswerProps> = ({
+  item,
+  question,
+  index,
+  config,
+  answerIcon,
+  responding,
+  showPromptLog,
+  chatAnswerContainerInner,
+  hideProcessDetail,
+  appData,
+  noChatInput,
+  switchSibling,
+}) => {
+  const { t } = useTranslation()
+  const {
+    content,
+    citation,
+    agent_thoughts,
+    more,
+    annotation,
+    workflowProcess,
+    allFiles,
+    message_files,
+  } = item
+  const hasAgentThoughts = !!agent_thoughts?.length
+
+  const [containerWidth, setContainerWidth] = useState(0)
+  const [contentWidth, setContentWidth] = useState(0)
+  const containerRef = useRef<HTMLDivElement>(null)
+  const contentRef = useRef<HTMLDivElement>(null)
+
+  const getContainerWidth = () => {
+    if (containerRef.current)
+      setContainerWidth(containerRef.current?.clientWidth + 16)
+  }
+  useEffect(() => {
+    getContainerWidth()
+  }, [])
+
+  const getContentWidth = () => {
+    if (contentRef.current)
+      setContentWidth(contentRef.current?.clientWidth)
+  }
+
+  useEffect(() => {
+    if (!responding)
+      getContentWidth()
+  }, [responding])
+
+  // Recalculate contentWidth when content changes (e.g., SVG preview/source toggle)
+  useEffect(() => {
+    if (!containerRef.current)
+      return
+    const resizeObserver = new ResizeObserver(() => {
+      getContentWidth()
+    })
+    resizeObserver.observe(containerRef.current)
+    return () => {
+      resizeObserver.disconnect()
+    }
+  }, [])
+
+  const handleSwitchSibling = useCallback((direction: 'prev' | 'next') => {
+    if (direction === 'prev')
+      item.prevSibling && switchSibling?.(item.prevSibling)
+    else
+      item.nextSibling && switchSibling?.(item.nextSibling)
+  }, [switchSibling, item.prevSibling, item.nextSibling])
+
+  return (
+    <div className='mb-2 flex last:mb-0'>
+      <div className='relative h-10 w-10 shrink-0'>
+        {answerIcon || <AnswerIcon />}
+        {responding && (
+          <div className='absolute left-[-3px] top-[-3px] flex h-4 w-4 items-center rounded-full border-[0.5px] border-divider-subtle bg-background-section-burn pl-[6px] shadow-xs'>
+            <LoadingAnim type='avatar' />
+          </div>
+        )}
+      </div>
+      <div className='chat-answer-container group ml-4 w-0 grow pb-4' ref={containerRef}>
+        <div className={cn('group relative pr-10', chatAnswerContainerInner)}>
+          <div
+            ref={contentRef}
+            className={cn('body-lg-regular relative inline-block max-w-full rounded-2xl bg-chat-bubble-bg px-4 py-3 text-text-primary', workflowProcess && 'w-full')}
+          >
+            {
+              !responding && (
+                <Operation
+                  hasWorkflowProcess={!!workflowProcess}
+                  maxSize={containerWidth - contentWidth - 4}
+                  contentWidth={contentWidth}
+                  item={item}
+                  question={question}
+                  index={index}
+                  showPromptLog={showPromptLog}
+                  noChatInput={noChatInput}
+                />
+              )
+            }
+            {/** Render the normal steps */}
+            {
+              workflowProcess && !hideProcessDetail && (
+                <WorkflowProcessItem
+                  data={workflowProcess}
+                  item={item}
+                  hideProcessDetail={hideProcessDetail}
+                />
+              )
+            }
+            {/** Hide workflow steps by it's settings in siteInfo */}
+            {
+              workflowProcess && hideProcessDetail && appData && (
+                <WorkflowProcessItem
+                  data={workflowProcess}
+                  item={item}
+                  hideProcessDetail={hideProcessDetail}
+                  readonly={!appData.site.show_workflow_steps}
+                />
+              )
+            }
+            {
+              responding && !content && !hasAgentThoughts && (
+                <div className='flex h-5 w-6 items-center justify-center'>
+                  <LoadingAnim type='text' />
+                </div>
+              )
+            }
+            {
+              content && !hasAgentThoughts && (
+                <BasicContent item={item} />
+              )
+            }
+            {
+              (hasAgentThoughts) && (
+                <AgentContent
+                  item={item}
+                  responding={responding}
+                  content={content}
+                />
+              )
+            }
+            {
+              !!allFiles?.length && (
+                <FileList
+                  className='my-1'
+                  files={allFiles}
+                  showDeleteAction={false}
+                  showDownloadAction
+                  canPreview
+                />
+              )
+            }
+            {
+              !!message_files?.length && (
+                <FileList
+                  className='my-1'
+                  files={message_files}
+                  showDeleteAction={false}
+                  showDownloadAction
+                  canPreview
+                />
+              )
+            }
+            {
+              annotation?.id && annotation.authorName && (
+                <EditTitle
+                  className='mt-1'
+                  title={t('appAnnotation.editBy', { author: annotation.authorName })}
+                />
+              )
+            }
+            <SuggestedQuestions item={item} />
+            {
+              !!citation?.length && !responding && (
+                <Citation data={citation} showHitInfo={config?.supportCitationHitInfo} />
+              )
+            }
+            {
+              item.siblingCount && item.siblingCount > 1 && item.siblingIndex !== undefined && (
+                <ContentSwitch
+                  count={item.siblingCount}
+                  currentIndex={item.siblingIndex}
+                  prevDisabled={!item.prevSibling}
+                  nextDisabled={!item.nextSibling}
+                  switchSibling={handleSwitchSibling}
+                />
+              )
+            }
+          </div>
+        </div>
+        <More more={more} />
+      </div>
+    </div>
+  )
+}
+
+export default memo(Answer, (prevProps, nextProps) =>
+  prevProps.responding === false && nextProps.responding === false,
+)
diff --git a/app/components/base/chat/chat/answer/more.tsx b/app/components/base/chat/chat/answer/more.tsx
new file mode 100644
index 0000000..e86011e
--- /dev/null
+++ b/app/components/base/chat/chat/answer/more.tsx
@@ -0,0 +1,46 @@
+import type { FC } from 'react'
+import { memo } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { ChatItem } from '../../types'
+import { formatNumber } from '@/utils/format'
+
+type MoreProps = {
+  more: ChatItem['more']
+}
+const More: FC<MoreProps> = ({
+  more,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='system-xs-regular mt-1 flex items-center text-text-quaternary opacity-0 group-hover:opacity-100'>
+      {
+        more && (
+          <>
+            <div
+              className='mr-2 max-w-[33.3%] shrink-0 truncate'
+              title={`${t('appLog.detail.timeConsuming')} ${more.latency}${t('appLog.detail.second')}`}
+            >
+              {`${t('appLog.detail.timeConsuming')} ${more.latency}${t('appLog.detail.second')}`}
+            </div>
+            <div
+              className='max-w-[33.3%] shrink-0 truncate'
+              title={`${t('appLog.detail.tokenCost')} ${formatNumber(more.tokens)}`}
+            >
+              {`${t('appLog.detail.tokenCost')} ${formatNumber(more.tokens)}`}
+            </div>
+            <div className='mx-2 shrink-0'>路</div>
+            <div
+              className='max-w-[33.3%] shrink-0 truncate'
+              title={more.time}
+            >
+              {more.time}
+            </div>
+          </>
+        )
+      }
+    </div>
+  )
+}
+
+export default memo(More)
diff --git a/app/components/base/chat/chat/answer/operation.tsx b/app/components/base/chat/chat/answer/operation.tsx
new file mode 100644
index 0000000..0fbb7ce
--- /dev/null
+++ b/app/components/base/chat/chat/answer/operation.tsx
@@ -0,0 +1,195 @@
+import type { FC } from 'react'
+import {
+  memo,
+  useMemo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiClipboardLine,
+  RiResetLeftLine,
+  RiThumbDownLine,
+  RiThumbUpLine,
+} from '@remixicon/react'
+import type { ChatItem } from '../../types'
+import { useChatContext } from '../context'
+import copy from 'copy-to-clipboard'
+import Toast from '@/app/components/base/toast'
+import AnnotationCtrlButton from '@/app/components/base/features/new-feature-panel/annotation-reply/annotation-ctrl-button'
+import EditReplyModal from '@/app/components/app/annotation/edit-annotation-modal'
+import Log from '@/app/components/base/chat/chat/log'
+import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
+import NewAudioButton from '@/app/components/base/new-audio-button'
+import cn from '@/utils/classnames'
+
+type OperationProps = {
+  item: ChatItem
+  question: string
+  index: number
+  showPromptLog?: boolean
+  maxSize: number
+  contentWidth: number
+  hasWorkflowProcess: boolean
+  noChatInput?: boolean
+}
+const Operation: FC<OperationProps> = ({
+  item,
+  question,
+  index,
+  showPromptLog,
+  maxSize,
+  contentWidth,
+  hasWorkflowProcess,
+  noChatInput,
+}) => {
+  const { t } = useTranslation()
+  const {
+    config,
+    onAnnotationAdded,
+    onAnnotationEdited,
+    onAnnotationRemoved,
+    onFeedback,
+    onRegenerate,
+  } = useChatContext()
+  const [isShowReplyModal, setIsShowReplyModal] = useState(false)
+  const {
+    id,
+    isOpeningStatement,
+    content: messageContent,
+    annotation,
+    feedback,
+    adminFeedback,
+    agent_thoughts,
+  } = item
+  const [localFeedback, setLocalFeedback] = useState(config?.supportAnnotation ? adminFeedback : feedback)
+
+  const content = useMemo(() => {
+    if (agent_thoughts?.length)
+      return agent_thoughts.reduce((acc, cur) => acc + cur.thought, '')
+
+    return messageContent
+  }, [agent_thoughts, messageContent])
+
+  const handleFeedback = async (rating: 'like' | 'dislike' | null) => {
+    if (!config?.supportFeedback || !onFeedback)
+      return
+
+    await onFeedback?.(id, { rating })
+    setLocalFeedback({ rating })
+  }
+
+  const operationWidth = useMemo(() => {
+    let width = 0
+    if (!isOpeningStatement)
+      width += 26
+    if (!isOpeningStatement && showPromptLog)
+      width += 28 + 8
+    if (!isOpeningStatement && config?.text_to_speech?.enabled)
+      width += 26
+    if (!isOpeningStatement && config?.supportAnnotation && config?.annotation_reply?.enabled)
+      width += 26
+    if (config?.supportFeedback && !localFeedback?.rating && onFeedback && !isOpeningStatement)
+      width += 60 + 8
+    if (config?.supportFeedback && localFeedback?.rating && onFeedback && !isOpeningStatement)
+      width += 28 + 8
+    return width
+  }, [isOpeningStatement, showPromptLog, config?.text_to_speech?.enabled, config?.supportAnnotation, config?.annotation_reply?.enabled, config?.supportFeedback, localFeedback?.rating, onFeedback])
+
+  const positionRight = useMemo(() => operationWidth < maxSize, [operationWidth, maxSize])
+
+  return (
+    <>
+      <div
+        className={cn(
+          'absolute flex justify-end gap-1',
+          hasWorkflowProcess && '-bottom-4 right-2',
+          !positionRight && '-bottom-4 right-2',
+          !hasWorkflowProcess && positionRight && '!top-[9px]',
+        )}
+        style={(!hasWorkflowProcess && positionRight) ? { left: contentWidth + 8 } : {}}
+      >
+        {showPromptLog && !isOpeningStatement && (
+          <div className='hidden group-hover:block'>
+            <Log logItem={item} />
+          </div>
+        )}
+        {!isOpeningStatement && (
+          <div className='ml-1 hidden items-center gap-0.5 rounded-[10px] border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg p-0.5 shadow-md backdrop-blur-sm group-hover:flex'>
+            {(config?.text_to_speech?.enabled) && (
+              <NewAudioButton
+                id={id}
+                value={content}
+                voice={config?.text_to_speech?.voice}
+              />
+            )}
+            <ActionButton onClick={() => {
+              copy(content)
+              Toast.notify({ type: 'success', message: t('common.actionMsg.copySuccessfully') })
+            }}>
+              <RiClipboardLine className='h-4 w-4' />
+            </ActionButton>
+            {!noChatInput && (
+              <ActionButton onClick={() => onRegenerate?.(item)}>
+                <RiResetLeftLine className='h-4 w-4' />
+              </ActionButton>
+            )}
+            {(config?.supportAnnotation && config.annotation_reply?.enabled) && (
+              <AnnotationCtrlButton
+                appId={config?.appId || ''}
+                messageId={id}
+                cached={!!annotation?.id}
+                query={question}
+                answer={content}
+                onAdded={(id, authorName) => onAnnotationAdded?.(id, authorName, question, content, index)}
+                onEdit={() => setIsShowReplyModal(true)}
+              />
+            )}
+          </div>
+        )}
+        {!isOpeningStatement && config?.supportFeedback && !localFeedback?.rating && onFeedback && (
+          <div className='ml-1 hidden items-center gap-0.5 rounded-[10px] border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg p-0.5 shadow-md backdrop-blur-sm group-hover:flex'>
+            {!localFeedback?.rating && (
+              <>
+                <ActionButton onClick={() => handleFeedback('like')}>
+                  <RiThumbUpLine className='h-4 w-4' />
+                </ActionButton>
+                <ActionButton onClick={() => handleFeedback('dislike')}>
+                  <RiThumbDownLine className='h-4 w-4' />
+                </ActionButton>
+              </>
+            )}
+          </div>
+        )}
+        {!isOpeningStatement && config?.supportFeedback && localFeedback?.rating && onFeedback && (
+          <div className='ml-1 flex items-center gap-0.5 rounded-[10px] border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg p-0.5 shadow-md backdrop-blur-sm'>
+            {localFeedback?.rating === 'like' && (
+              <ActionButton state={ActionButtonState.Active} onClick={() => handleFeedback(null)}>
+                <RiThumbUpLine className='h-4 w-4' />
+              </ActionButton>
+            )}
+            {localFeedback?.rating === 'dislike' && (
+              <ActionButton state={ActionButtonState.Destructive} onClick={() => handleFeedback(null)}>
+                <RiThumbDownLine className='h-4 w-4' />
+              </ActionButton>
+            )}
+          </div>
+        )}
+      </div>
+      <EditReplyModal
+        isShow={isShowReplyModal}
+        onHide={() => setIsShowReplyModal(false)}
+        query={question}
+        answer={content}
+        onEdited={(editedQuery, editedAnswer) => onAnnotationEdited?.(editedQuery, editedAnswer, index)}
+        onAdded={(annotationId, authorName, editedQuery, editedAnswer) => onAnnotationAdded?.(annotationId, authorName, editedQuery, editedAnswer, index)}
+        appId={config?.appId || ''}
+        messageId={id}
+        annotationId={annotation?.id || ''}
+        createdAt={annotation?.created_at}
+        onRemove={() => onAnnotationRemoved?.(index)}
+      />
+    </>
+  )
+}
+
+export default memo(Operation)
diff --git a/app/components/base/chat/chat/answer/suggested-questions.tsx b/app/components/base/chat/chat/answer/suggested-questions.tsx
new file mode 100644
index 0000000..8b64bff
--- /dev/null
+++ b/app/components/base/chat/chat/answer/suggested-questions.tsx
@@ -0,0 +1,37 @@
+import type { FC } from 'react'
+import { memo } from 'react'
+import type { ChatItem } from '../../types'
+import { useChatContext } from '../context'
+
+type SuggestedQuestionsProps = {
+  item: ChatItem
+}
+const SuggestedQuestions: FC<SuggestedQuestionsProps> = ({
+  item,
+}) => {
+  const { onSend } = useChatContext()
+
+  const {
+    isOpeningStatement,
+    suggestedQuestions,
+  } = item
+
+  if (!isOpeningStatement || !suggestedQuestions?.length)
+    return null
+
+  return (
+    <div className='flex flex-wrap'>
+      {suggestedQuestions.filter(q => !!q && q.trim()).map((question, index) => (
+        <div
+          key={index}
+          className='system-sm-medium mr-1 mt-1 inline-flex max-w-full shrink-0 cursor-pointer flex-wrap rounded-lg border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-3.5 py-2 text-components-button-secondary-accent-text shadow-xs last:mr-0 hover:border-components-button-secondary-border-hover hover:bg-components-button-secondary-bg-hover'
+          onClick={() => onSend?.(question)}
+        >
+          {question}
+        </div>),
+      )}
+    </div>
+  )
+}
+
+export default memo(SuggestedQuestions)
diff --git a/app/components/base/chat/chat/answer/tool-detail.tsx b/app/components/base/chat/chat/answer/tool-detail.tsx
new file mode 100644
index 0000000..26d1b3b
--- /dev/null
+++ b/app/components/base/chat/chat/answer/tool-detail.tsx
@@ -0,0 +1,71 @@
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowDownSLine,
+  RiArrowRightSLine,
+  RiHammerFill,
+  RiLoader2Line,
+} from '@remixicon/react'
+import type { ToolInfoInThought } from '../type'
+import cn from '@/utils/classnames'
+
+type ToolDetailProps = {
+  payload: ToolInfoInThought
+}
+const ToolDetail = ({
+  payload,
+}: ToolDetailProps) => {
+  const { t } = useTranslation()
+  const { name, label, input, isFinished, output } = payload
+  const toolLabel = name.startsWith('dataset_') ? t('dataset.knowledge') : label
+  const [expand, setExpand] = useState(false)
+
+  return (
+    <div
+      className={cn(
+        'rounded-xl',
+        !expand && 'border-l-[0.25px] border-components-panel-border bg-workflow-process-bg',
+        expand && 'border-[0.5px] border-components-panel-border-subtle bg-background-section-burn',
+      )}
+    >
+      <div
+        className={cn(
+          'system-xs-medium flex cursor-pointer items-center px-2.5 py-2 text-text-tertiary',
+          expand && 'pb-1.5',
+        )}
+        onClick={() => setExpand(!expand)}
+      >
+        {isFinished && <RiHammerFill className='mr-1 h-3.5 w-3.5' />}
+        {!isFinished && <RiLoader2Line className='mr-1 h-3.5 w-3.5 animate-spin' />}
+        {t(`tools.thought.${isFinished ? 'used' : 'using'}`)}
+        <div className='mx-1 text-text-secondary'>{toolLabel}</div>
+        {!expand && <RiArrowRightSLine className='h-4 w-4' />}
+        {expand && <RiArrowDownSLine className='ml-auto h-4 w-4' />}
+      </div>
+      {
+        expand && (
+          <>
+            <div className='mx-1 mb-0.5 rounded-[10px] bg-components-panel-on-panel-item-bg text-text-secondary'>
+              <div className='system-xs-semibold-uppercase flex h-7 items-center justify-between px-2 pt-1'>
+                {t('tools.thought.requestTitle')}
+              </div>
+              <div className='code-xs-regular break-words px-3 pb-2 pt-1'>
+                {input}
+              </div>
+            </div>
+            <div className='mx-1 mb-1 rounded-[10px] bg-components-panel-on-panel-item-bg text-text-secondary'>
+              <div className='system-xs-semibold-uppercase flex h-7 items-center justify-between px-2 pt-1'>
+                {t('tools.thought.responseTitle')}
+              </div>
+              <div className='code-xs-regular break-words px-3 pb-2 pt-1'>
+                {output}
+              </div>
+            </div>
+          </>
+        )
+      }
+    </div>
+  )
+}
+
+export default ToolDetail
diff --git a/app/components/base/chat/chat/answer/workflow-process.tsx b/app/components/base/chat/chat/answer/workflow-process.tsx
new file mode 100644
index 0000000..4651ff4
--- /dev/null
+++ b/app/components/base/chat/chat/answer/workflow-process.tsx
@@ -0,0 +1,94 @@
+import {
+  useEffect,
+  useState,
+} from 'react'
+import {
+  RiArrowRightSLine,
+  RiErrorWarningFill,
+  RiLoader2Line,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import type { ChatItem, WorkflowProcess } from '../../types'
+import TracingPanel from '@/app/components/workflow/run/tracing-panel'
+import cn from '@/utils/classnames'
+import { CheckCircle } from '@/app/components/base/icons/src/vender/solid/general'
+import { WorkflowRunningStatus } from '@/app/components/workflow/types'
+
+type WorkflowProcessProps = {
+  data: WorkflowProcess
+  item?: ChatItem
+  expand?: boolean
+  hideInfo?: boolean
+  hideProcessDetail?: boolean
+  readonly?: boolean
+}
+const WorkflowProcessItem = ({
+  data,
+  expand = false,
+  hideInfo = false,
+  hideProcessDetail = false,
+  readonly = false,
+}: WorkflowProcessProps) => {
+  const { t } = useTranslation()
+  const [collapse, setCollapse] = useState(!expand)
+  const running = data.status === WorkflowRunningStatus.Running
+  const succeeded = data.status === WorkflowRunningStatus.Succeeded
+  const failed = data.status === WorkflowRunningStatus.Failed || data.status === WorkflowRunningStatus.Stopped
+
+  useEffect(() => {
+    setCollapse(!expand)
+  }, [expand])
+
+  return (
+    <div
+      className={cn(
+        '-mx-1 rounded-xl px-2.5',
+        collapse ? 'border-l-[0.25px] border-components-panel-border py-[7px]' : 'border-[0.5px] border-components-panel-border-subtle px-1 pb-1 pt-[7px]',
+        running && !collapse && 'bg-background-section-burn',
+        succeeded && !collapse && 'bg-state-success-hover',
+        failed && !collapse && 'bg-state-destructive-hover',
+        collapse && 'bg-workflow-process-bg',
+      )}
+    >
+      <div
+        className={cn('flex cursor-pointer items-center', !collapse && 'px-1.5', readonly && 'cursor-default')}
+        onClick={() => !readonly && setCollapse(!collapse)}
+      >
+        {
+          running && (
+            <RiLoader2Line className='mr-1 h-3.5 w-3.5 shrink-0 animate-spin text-text-tertiary' />
+          )
+        }
+        {
+          succeeded && (
+            <CheckCircle className='mr-1 h-3.5 w-3.5 shrink-0 text-text-success' />
+          )
+        }
+        {
+          failed && (
+            <RiErrorWarningFill className='mr-1 h-3.5 w-3.5 shrink-0 text-text-destructive' />
+          )
+        }
+        <div className={cn('system-xs-medium text-text-secondary', !collapse && 'grow')}>
+          {t('workflow.common.workflowProcess')}
+        </div>
+        {!readonly && <RiArrowRightSLine className={cn('ml-1 h-4 w-4 text-text-tertiary', !collapse && 'rotate-90')} />}
+      </div>
+      {
+        !collapse && !readonly && (
+          <div className='mt-1.5'>
+            {
+              <TracingPanel
+                list={data.tracing}
+                hideNodeInfo={hideInfo}
+                hideNodeProcessDetail={hideProcessDetail}
+              />
+            }
+          </div>
+        )
+      }
+    </div>
+  )
+}
+
+export default WorkflowProcessItem
diff --git a/app/components/base/chat/chat/chat-input-area/hooks.ts b/app/components/base/chat/chat/chat-input-area/hooks.ts
new file mode 100644
index 0000000..6b6e801
--- /dev/null
+++ b/app/components/base/chat/chat/chat-input-area/hooks.ts
@@ -0,0 +1,46 @@
+import {
+  useCallback,
+  useRef,
+  useState,
+} from 'react'
+
+export const useTextAreaHeight = () => {
+  const wrapperRef = useRef<HTMLDivElement>(null)
+  const textareaRef = useRef<HTMLTextAreaElement | undefined>(undefined)
+  const textValueRef = useRef<HTMLDivElement>(null)
+  const holdSpaceRef = useRef<HTMLDivElement>(null)
+  const [isMultipleLine, setIsMultipleLine] = useState(false)
+
+  const handleComputeHeight = useCallback(() => {
+    const textareaElement = textareaRef.current
+
+    if (wrapperRef.current && textareaElement && textValueRef.current && holdSpaceRef.current) {
+      const { width: wrapperWidth } = wrapperRef.current.getBoundingClientRect()
+      const { height: textareaHeight } = textareaElement.getBoundingClientRect()
+      const { width: textValueWidth } = textValueRef.current.getBoundingClientRect()
+      const { width: holdSpaceWidth } = holdSpaceRef.current.getBoundingClientRect()
+      if (textareaHeight > 32) {
+        setIsMultipleLine(true)
+      }
+      else {
+        if (textValueWidth + holdSpaceWidth >= wrapperWidth)
+          setIsMultipleLine(true)
+        else
+          setIsMultipleLine(false)
+      }
+    }
+  }, [])
+
+  const handleTextareaResize = useCallback(() => {
+    handleComputeHeight()
+  }, [handleComputeHeight])
+
+  return {
+    wrapperRef,
+    textareaRef,
+    textValueRef,
+    holdSpaceRef,
+    handleTextareaResize,
+    isMultipleLine,
+  }
+}
diff --git a/app/components/base/chat/chat/chat-input-area/index.tsx b/app/components/base/chat/chat/chat-input-area/index.tsx
new file mode 100644
index 0000000..14d8185
--- /dev/null
+++ b/app/components/base/chat/chat/chat-input-area/index.tsx
@@ -0,0 +1,246 @@
+import {
+  useCallback,
+  useRef,
+  useState,
+} from 'react'
+import Textarea from 'react-textarea-autosize'
+import { useTranslation } from 'react-i18next'
+import Recorder from 'js-audio-recorder'
+import type {
+  EnableType,
+  OnSend,
+} from '../../types'
+import type { Theme } from '../../embedded-chatbot/theme/theme-context'
+import type { InputForm } from '../type'
+import { useCheckInputsForms } from '../check-input-forms-hooks'
+import { useTextAreaHeight } from './hooks'
+import Operation from './operation'
+import cn from '@/utils/classnames'
+import { FileListInChatInput } from '@/app/components/base/file-uploader'
+import { useFile } from '@/app/components/base/file-uploader/hooks'
+import {
+  FileContextProvider,
+  useFileStore,
+} from '@/app/components/base/file-uploader/store'
+import VoiceInput from '@/app/components/base/voice-input'
+import { useToastContext } from '@/app/components/base/toast'
+import FeatureBar from '@/app/components/base/features/new-feature-panel/feature-bar'
+import type { FileUpload } from '@/app/components/base/features/types'
+import { TransferMethod } from '@/types/app'
+
+type ChatInputAreaProps = {
+  showFeatureBar?: boolean
+  showFileUpload?: boolean
+  featureBarDisabled?: boolean
+  onFeatureBarClick?: (state: boolean) => void
+  visionConfig?: FileUpload
+  speechToTextConfig?: EnableType
+  onSend?: OnSend
+  inputs?: Record<string, any>
+  inputsForm?: InputForm[]
+  theme?: Theme | null
+  isResponding?: boolean
+  disabled?: boolean
+}
+const ChatInputArea = ({
+  showFeatureBar,
+  showFileUpload,
+  featureBarDisabled,
+  onFeatureBarClick,
+  visionConfig,
+  speechToTextConfig = { enabled: true },
+  onSend,
+  inputs = {},
+  inputsForm = [],
+  theme,
+  isResponding,
+  disabled,
+}: ChatInputAreaProps) => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const {
+    wrapperRef,
+    textareaRef,
+    textValueRef,
+    holdSpaceRef,
+    handleTextareaResize,
+    isMultipleLine,
+  } = useTextAreaHeight()
+  const [query, setQuery] = useState('')
+  const [showVoiceInput, setShowVoiceInput] = useState(false)
+  const filesStore = useFileStore()
+  const {
+    handleDragFileEnter,
+    handleDragFileLeave,
+    handleDragFileOver,
+    handleDropFile,
+    handleClipboardPasteFile,
+    isDragActive,
+  } = useFile(visionConfig!)
+  const { checkInputsForm } = useCheckInputsForms()
+  const historyRef = useRef([''])
+  const [currentIndex, setCurrentIndex] = useState(-1)
+  const isComposingRef = useRef(false)
+  const handleSend = () => {
+    if (isResponding) {
+      notify({ type: 'info', message: t('appDebug.errorMessage.waitForResponse') })
+      return
+    }
+
+    if (onSend) {
+      const { files, setFiles } = filesStore.getState()
+      if (files.find(item => item.transferMethod === TransferMethod.local_file && !item.uploadedId)) {
+        notify({ type: 'info', message: t('appDebug.errorMessage.waitForFileUpload') })
+        return
+      }
+      if (!query || !query.trim()) {
+        notify({ type: 'info', message: t('appAnnotation.errorMessage.queryRequired') })
+        return
+      }
+      if (checkInputsForm(inputs, inputsForm)) {
+        onSend(query, files)
+        setQuery('')
+        setFiles([])
+      }
+    }
+  }
+  const handleCompositionStart = () => {
+    // e: React.CompositionEvent<HTMLTextAreaElement>
+    isComposingRef.current = true
+  }
+  const handleCompositionEnd = () => {
+    // safari or some browsers will trigger compositionend before keydown.
+    // delay 50ms for safari.
+    setTimeout(() => {
+      isComposingRef.current = false
+    }, 50)
+  }
+  const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
+    if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) {
+      // if isComposing, exit
+      if (isComposingRef.current) return
+      e.preventDefault()
+      setQuery(query.replace(/\n$/, ''))
+      historyRef.current.push(query)
+      setCurrentIndex(historyRef.current.length)
+      handleSend()
+    }
+    else if (e.key === 'ArrowUp' && !e.shiftKey && !e.nativeEvent.isComposing && e.metaKey) {
+      // When the cmd + up key is pressed, output the previous element
+      if (currentIndex > 0) {
+        setCurrentIndex(currentIndex - 1)
+        setQuery(historyRef.current[currentIndex - 1])
+      }
+    }
+    else if (e.key === 'ArrowDown' && !e.shiftKey && !e.nativeEvent.isComposing && e.metaKey) {
+      // When the cmd + down key is pressed, output the next element
+      if (currentIndex < historyRef.current.length - 1) {
+        setCurrentIndex(currentIndex + 1)
+        setQuery(historyRef.current[currentIndex + 1])
+      }
+      else if (currentIndex === historyRef.current.length - 1) {
+        // If it is the last element, clear the input box
+        setCurrentIndex(historyRef.current.length)
+        setQuery('')
+      }
+    }
+  }
+
+  const handleShowVoiceInput = useCallback(() => {
+    (Recorder as any).getPermission().then(() => {
+      setShowVoiceInput(true)
+    }, () => {
+      notify({ type: 'error', message: t('common.voiceInput.notAllow') })
+    })
+  }, [t, notify])
+
+  const operation = (
+    <Operation
+      ref={holdSpaceRef}
+      fileConfig={visionConfig}
+      speechToTextConfig={speechToTextConfig}
+      onShowVoiceInput={handleShowVoiceInput}
+      onSend={handleSend}
+      theme={theme}
+    />
+  )
+
+  return (
+    <>
+      <div
+        className={cn(
+          'relative z-10 rounded-xl border border-components-chat-input-border bg-components-panel-bg-blur pb-[9px] shadow-md',
+          isDragActive && 'border border-dashed border-components-option-card-option-selected-border',
+          disabled && 'pointer-events-none border-components-panel-border opacity-50 shadow-none',
+        )}
+      >
+        <div className='relative max-h-[158px] overflow-y-auto overflow-x-hidden px-[9px] pt-[9px]'>
+          <FileListInChatInput fileConfig={visionConfig!} />
+          <div
+            ref={wrapperRef}
+            className='flex items-center justify-between'
+          >
+            <div className='relative flex w-full grow items-center'>
+              <div
+                ref={textValueRef}
+                className='body-lg-regular pointer-events-none invisible absolute h-auto w-auto whitespace-pre p-1 leading-6'
+              >
+                {query}
+              </div>
+              <Textarea
+                ref={ref => textareaRef.current = ref as any}
+                className={cn(
+                  'body-lg-regular w-full resize-none bg-transparent p-1 leading-6 text-text-tertiary outline-none',
+                )}
+                placeholder={t('common.chat.inputPlaceholder') || ''}
+                autoFocus
+                minRows={1}
+                onResize={handleTextareaResize}
+                value={query}
+                onChange={(e) => {
+                  setQuery(e.target.value)
+                  setTimeout(handleTextareaResize, 0)
+                }}
+                onKeyDown={handleKeyDown}
+                onCompositionStart={handleCompositionStart}
+                onCompositionEnd={handleCompositionEnd}
+                onPaste={handleClipboardPasteFile}
+                onDragEnter={handleDragFileEnter}
+                onDragLeave={handleDragFileLeave}
+                onDragOver={handleDragFileOver}
+                onDrop={handleDropFile}
+              />
+            </div>
+            {
+              !isMultipleLine && operation
+            }
+          </div>
+          {
+            showVoiceInput && (
+              <VoiceInput
+                onCancel={() => setShowVoiceInput(false)}
+                onConverted={text => setQuery(text)}
+              />
+            )
+          }
+        </div>
+        {
+          isMultipleLine && (
+            <div className='px-[9px]'>{operation}</div>
+          )
+        }
+      </div>
+      {showFeatureBar && <FeatureBar showFileUpload={showFileUpload} disabled={featureBarDisabled} onFeatureBarClick={onFeatureBarClick} />}
+    </>
+  )
+}
+
+const ChatInputAreaWrapper = (props: ChatInputAreaProps) => {
+  return (
+    <FileContextProvider>
+      <ChatInputArea {...props} />
+    </FileContextProvider>
+  )
+}
+
+export default ChatInputAreaWrapper
diff --git a/app/components/base/chat/chat/chat-input-area/operation.tsx b/app/components/base/chat/chat/chat-input-area/operation.tsx
new file mode 100644
index 0000000..122dfcb
--- /dev/null
+++ b/app/components/base/chat/chat/chat-input-area/operation.tsx
@@ -0,0 +1,78 @@
+import { memo } from 'react'
+import {
+  RiMicLine,
+  RiSendPlane2Fill,
+} from '@remixicon/react'
+import type {
+  EnableType,
+} from '../../types'
+import type { Theme } from '../../embedded-chatbot/theme/theme-context'
+import Button from '@/app/components/base/button'
+import ActionButton from '@/app/components/base/action-button'
+import { FileUploaderInChatInput } from '@/app/components/base/file-uploader'
+import type { FileUpload } from '@/app/components/base/features/types'
+import cn from '@/utils/classnames'
+
+type OperationProps = {
+  fileConfig?: FileUpload
+  speechToTextConfig?: EnableType
+  onShowVoiceInput?: () => void
+  onSend: () => void
+  theme?: Theme | null
+}
+const Operation = (
+  {
+    ref,
+    fileConfig,
+    speechToTextConfig,
+    onShowVoiceInput,
+    onSend,
+    theme,
+  }: OperationProps & {
+    ref: React.RefObject<HTMLDivElement>;
+  },
+) => {
+  return (
+    <div
+      className={cn(
+        'flex shrink-0 items-center justify-end',
+      )}
+    >
+      <div
+        className='flex items-center pl-1'
+        ref={ref}
+      >
+        <div className='flex items-center space-x-1'>
+          {fileConfig?.enabled && <FileUploaderInChatInput fileConfig={fileConfig} />}
+          {
+            speechToTextConfig?.enabled && (
+              <ActionButton
+                size='l'
+                onClick={onShowVoiceInput}
+              >
+                <RiMicLine className='h-5 w-5' />
+              </ActionButton>
+            )
+          }
+        </div>
+        <Button
+          className='ml-3 w-8 px-0'
+          variant='primary'
+          onClick={onSend}
+          style={
+            theme
+              ? {
+                backgroundColor: theme.primaryColor,
+              }
+              : {}
+          }
+        >
+          <RiSendPlane2Fill className='h-4 w-4' />
+        </Button>
+      </div>
+    </div>
+  )
+}
+Operation.displayName = 'Operation'
+
+export default memo(Operation)
diff --git a/app/components/base/chat/chat/check-input-forms-hooks.ts b/app/components/base/chat/chat/check-input-forms-hooks.ts
new file mode 100644
index 0000000..62c59a0
--- /dev/null
+++ b/app/components/base/chat/chat/check-input-forms-hooks.ts
@@ -0,0 +1,54 @@
+import { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { InputForm } from './type'
+import { useToastContext } from '@/app/components/base/toast'
+import { InputVarType } from '@/app/components/workflow/types'
+import { TransferMethod } from '@/types/app'
+
+export const useCheckInputsForms = () => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+
+  const checkInputsForm = useCallback((inputs: Record<string, any>, inputsForm: InputForm[]) => {
+    let hasEmptyInput = ''
+    let fileIsUploading = false
+    const requiredVars = inputsForm.filter(({ required }) => required)
+
+    if (requiredVars?.length) {
+      requiredVars.forEach(({ variable, label, type }) => {
+        if (hasEmptyInput)
+          return
+
+        if (fileIsUploading)
+          return
+
+        if (!inputs[variable])
+          hasEmptyInput = label as string
+
+        if ((type === InputVarType.singleFile || type === InputVarType.multiFiles) && inputs[variable]) {
+          const files = inputs[variable]
+          if (Array.isArray(files))
+            fileIsUploading = files.find(item => item.transferMethod === TransferMethod.local_file && !item.uploadedId)
+          else
+            fileIsUploading = files.transferMethod === TransferMethod.local_file && !files.uploadedId
+        }
+      })
+    }
+
+    if (hasEmptyInput) {
+      notify({ type: 'error', message: t('appDebug.errorMessage.valueOfVarRequired', { key: hasEmptyInput }) })
+      return false
+    }
+
+    if (fileIsUploading) {
+      notify({ type: 'info', message: t('appDebug.errorMessage.waitForFileUpload') })
+      return
+    }
+
+    return true
+  }, [notify, t])
+
+  return {
+    checkInputsForm,
+  }
+}
diff --git a/app/components/base/chat/chat/citation/index.tsx b/app/components/base/chat/chat/citation/index.tsx
new file mode 100644
index 0000000..9552492
--- /dev/null
+++ b/app/components/base/chat/chat/citation/index.tsx
@@ -0,0 +1,125 @@
+import { useEffect, useMemo, useRef, useState } from 'react'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine } from '@remixicon/react'
+import type { CitationItem } from '../type'
+import Popup from './popup'
+
+export type Resources = {
+  documentId: string
+  documentName: string
+  dataSourceType: string
+  sources: CitationItem[]
+}
+
+type CitationProps = {
+  data: CitationItem[]
+  showHitInfo?: boolean
+  containerClassName?: string
+}
+const Citation: FC<CitationProps> = ({
+  data,
+  showHitInfo,
+  containerClassName = 'chat-answer-container',
+}) => {
+  const { t } = useTranslation()
+  const elesRef = useRef<HTMLDivElement[]>([])
+  const [limitNumberInOneLine, setLimitNumberInOneLine] = useState(0)
+  const [showMore, setShowMore] = useState(false)
+  const resources = useMemo(() => data.reduce((prev: Resources[], next) => {
+    const documentId = next.document_id
+    const documentName = next.document_name
+    const dataSourceType = next.data_source_type
+    const documentIndex = prev.findIndex(i => i.documentId === documentId)
+
+    if (documentIndex > -1) {
+      prev[documentIndex].sources.push(next)
+    }
+    else {
+      prev.push({
+        documentId,
+        documentName,
+        dataSourceType,
+        sources: [next],
+      })
+    }
+
+    return prev
+  }, []), [data])
+
+  const handleAdjustResourcesLayout = () => {
+    const containerWidth = document.querySelector(`.${containerClassName}`)!.clientWidth - 40
+    let totalWidth = 0
+    for (let i = 0; i < resources.length; i++) {
+      totalWidth += elesRef.current[i].clientWidth
+
+      if (totalWidth + i * 4 > containerWidth!) {
+        totalWidth -= elesRef.current[i].clientWidth
+
+        if (totalWidth + 34 > containerWidth!)
+          setLimitNumberInOneLine(i - 1)
+        else
+          setLimitNumberInOneLine(i)
+
+        break
+      }
+      else {
+        setLimitNumberInOneLine(i + 1)
+      }
+    }
+  }
+
+  useEffect(() => {
+    handleAdjustResourcesLayout()
+  }, [])
+
+  const resourcesLength = resources.length
+
+  return (
+    <div className='-mb-1 mt-3'>
+      <div className='system-xs-medium mb-2 flex items-center text-text-tertiary'>
+        {t('common.chat.citation.title')}
+        <div className='ml-2 h-[1px] grow bg-divider-regular' />
+      </div>
+      <div className='relative flex flex-wrap'>
+        {
+          resources.map((res, index) => (
+            <div
+              key={index}
+              className='absolute left-0 top-0 -z-10 mb-1 mr-1 h-7 w-auto max-w-[240px] whitespace-nowrap pl-7 pr-2 text-xs opacity-0'
+              ref={(ele: any) => (elesRef.current[index] = ele!)}
+            >
+              {res.documentName}
+            </div>
+          ))
+        }
+        {
+          resources.slice(0, showMore ? resourcesLength : limitNumberInOneLine).map((res, index) => (
+            <div key={index} className='mb-1 mr-1 cursor-pointer'>
+              <Popup
+                data={res}
+                showHitInfo={showHitInfo}
+              />
+            </div>
+          ))
+        }
+        {
+          limitNumberInOneLine < resourcesLength && (
+            <div
+              className='system-xs-medium flex h-7 cursor-pointer items-center rounded-lg bg-components-panel-bg px-2 text-text-tertiary'
+              onClick={() => setShowMore(v => !v)}
+            >
+              {
+                !showMore
+                  ? `+ ${resourcesLength - limitNumberInOneLine}`
+                  : <RiArrowDownSLine className='h-4 w-4 rotate-180 text-text-tertiary' />
+              }
+            </div>
+          )
+        }
+      </div>
+    </div>
+  )
+}
+
+export default Citation
diff --git a/app/components/base/chat/chat/citation/popup.tsx b/app/components/base/chat/chat/citation/popup.tsx
new file mode 100644
index 0000000..c26f427
--- /dev/null
+++ b/app/components/base/chat/chat/citation/popup.tsx
@@ -0,0 +1,131 @@
+import { Fragment, useState } from 'react'
+import type { FC } from 'react'
+import Link from 'next/link'
+import { useTranslation } from 'react-i18next'
+import Tooltip from './tooltip'
+import ProgressTooltip from './progress-tooltip'
+import type { Resources } from './index'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import FileIcon from '@/app/components/base/file-icon'
+import {
+  Hash02,
+  Target04,
+} from '@/app/components/base/icons/src/vender/line/general'
+import { ArrowUpRight } from '@/app/components/base/icons/src/vender/line/arrows'
+import {
+  BezierCurve03,
+  TypeSquare,
+} from '@/app/components/base/icons/src/vender/line/editor'
+
+type PopupProps = {
+  data: Resources
+  showHitInfo?: boolean
+}
+
+const Popup: FC<PopupProps> = ({
+  data,
+  showHitInfo = false,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const fileType = data.dataSourceType !== 'notion'
+    ? (/\.([^.]*)$/g.exec(data.documentName)?.[1] || '')
+    : 'notion'
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='top-start'
+      offset={{
+        mainAxis: 8,
+        crossAxis: -2,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+        <div className='flex h-7 max-w-[240px] items-center rounded-lg bg-components-button-secondary-bg px-2'>
+          <FileIcon type={fileType} className='mr-1 h-4 w-4 shrink-0' />
+          <div className='truncate text-xs text-text-tertiary'>{data.documentName}</div>
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent style={{ zIndex: 1000 }}>
+        <div className='max-w-[360px] rounded-xl bg-background-section-burn shadow-lg'>
+          <div className='px-4 pb-2 pt-3'>
+            <div className='flex h-[18px] items-center'>
+              <FileIcon type={fileType} className='mr-1 h-4 w-4 shrink-0' />
+              <div className='system-xs-medium truncate text-text-tertiary'>{data.documentName}</div>
+            </div>
+          </div>
+          <div className='max-h-[450px] overflow-y-auto rounded-lg bg-components-panel-bg px-4 py-0.5'>
+            <div className='w-full'>
+              {
+                data.sources.map((source, index) => (
+                  <Fragment key={index}>
+                    <div className='group py-3'>
+                      <div className='mb-2 flex items-center justify-between'>
+                        <div className='flex h-5 items-center rounded-md border border-divider-subtle px-1.5'>
+                          <Hash02 className='mr-0.5 h-3 w-3 text-text-quaternary' />
+                          <div className='text-[11px] font-medium text-text-tertiary'>
+                            {source.segment_position || index + 1}
+                          </div>
+                        </div>
+                        {
+                          showHitInfo && (
+                            <Link
+                              href={`/datasets/${source.dataset_id}/documents/${source.document_id}`}
+                              className='hidden h-[18px] items-center text-xs text-text-accent group-hover:flex'>
+                              {t('common.chat.citation.linkToDataset')}
+                              <ArrowUpRight className='ml-1 h-3 w-3' />
+                            </Link>
+                          )
+                        }
+                      </div>
+                      <div className='break-words text-[13px] text-text-secondary'>{source.content}</div>
+                      {
+                        showHitInfo && (
+                          <div className='system-xs-medium mt-2 flex flex-wrap items-center text-text-quaternary'>
+                            <Tooltip
+                              text={t('common.chat.citation.characters')}
+                              data={source.word_count}
+                              icon={<TypeSquare className='mr-1 h-3 w-3' />}
+                            />
+                            <Tooltip
+                              text={t('common.chat.citation.hitCount')}
+                              data={source.hit_count}
+                              icon={<Target04 className='mr-1 h-3 w-3' />}
+                            />
+                            <Tooltip
+                              text={t('common.chat.citation.vectorHash')}
+                              data={source.index_node_hash?.substring(0, 7)}
+                              icon={<BezierCurve03 className='mr-1 h-3 w-3' />}
+                            />
+                            {
+                              source.score && (
+                                <ProgressTooltip data={Number(source.score.toFixed(2))} />
+                              )
+                            }
+                          </div>
+                        )
+                      }
+                    </div>
+                    {
+                      index !== data.sources.length - 1 && (
+                        <div className='my-1 h-[1px] bg-divider-regular' />
+                      )
+                    }
+                  </Fragment>
+                ))
+              }
+            </div>
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default Popup
diff --git a/app/components/base/chat/chat/citation/progress-tooltip.tsx b/app/components/base/chat/chat/citation/progress-tooltip.tsx
new file mode 100644
index 0000000..e1f2404
--- /dev/null
+++ b/app/components/base/chat/chat/citation/progress-tooltip.tsx
@@ -0,0 +1,46 @@
+import { useState } from 'react'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+
+type ProgressTooltipProps = {
+  data: number
+}
+
+const ProgressTooltip: FC<ProgressTooltipProps> = ({
+  data,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='top-start'
+    >
+      <PortalToFollowElemTrigger
+        onMouseEnter={() => setOpen(true)}
+        onMouseLeave={() => setOpen(false)}
+      >
+        <div className='flex grow items-center'>
+          <div className='mr-1 h-1.5 w-16 overflow-hidden rounded-[3px] border border-components-progress-gray-border'>
+            <div className='h-full bg-components-progress-gray-progress' style={{ width: `${data * 100}%` }}></div>
+          </div>
+          {data}
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent style={{ zIndex: 1001 }}>
+        <div className='system-xs-medium rounded-lg bg-components-tooltip-bg p-3 text-text-quaternary shadow-lg'>
+          {t('common.chat.citation.hitScore')} {data}
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default ProgressTooltip
diff --git a/app/components/base/chat/chat/citation/tooltip.tsx b/app/components/base/chat/chat/citation/tooltip.tsx
new file mode 100644
index 0000000..8d58e9a
--- /dev/null
+++ b/app/components/base/chat/chat/citation/tooltip.tsx
@@ -0,0 +1,46 @@
+import React, { useState } from 'react'
+import type { FC } from 'react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+
+type TooltipProps = {
+  data: number | string
+  text: string
+  icon: React.ReactNode
+}
+
+const Tooltip: FC<TooltipProps> = ({
+  data,
+  text,
+  icon,
+}) => {
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='top-start'
+    >
+      <PortalToFollowElemTrigger
+        onMouseEnter={() => setOpen(true)}
+        onMouseLeave={() => setOpen(false)}
+      >
+        <div className='mr-6 flex items-center'>
+          {icon}
+          {data}
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent style={{ zIndex: 1001 }}>
+        <div className='system-xs-medium rounded-lg bg-components-tooltip-bg p-3 text-text-quaternary shadow-lg'>
+          {text} {data}
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default Tooltip
diff --git a/app/components/base/chat/chat/content-switch.tsx b/app/components/base/chat/chat/content-switch.tsx
new file mode 100644
index 0000000..cf428f4
--- /dev/null
+++ b/app/components/base/chat/chat/content-switch.tsx
@@ -0,0 +1,39 @@
+import { ChevronRight } from '../../icons/src/vender/line/arrows'
+
+export default function ContentSwitch({
+  count,
+  currentIndex,
+  prevDisabled,
+  nextDisabled,
+  switchSibling,
+}: {
+  count?: number
+  currentIndex?: number
+  prevDisabled: boolean
+  nextDisabled: boolean
+  switchSibling: (direction: 'prev' | 'next') => void
+}) {
+  return (
+    count && count > 1 && currentIndex !== undefined && (
+      <div className="flex items-center justify-center pt-3.5 text-sm">
+        <button
+          className={`${prevDisabled ? 'opacity-30' : 'opacity-100'}`}
+          disabled={prevDisabled}
+          onClick={() => !prevDisabled && switchSibling('prev')}
+        >
+          <ChevronRight className="h-[14px] w-[14px] rotate-180 text-text-primary" />
+        </button>
+        <span className="px-2 text-xs text-text-primary">
+          {currentIndex + 1} / {count}
+        </span>
+        <button
+          className={`${nextDisabled ? 'opacity-30' : 'opacity-100'}`}
+          disabled={nextDisabled}
+          onClick={() => !nextDisabled && switchSibling('next')}
+        >
+          <ChevronRight className="h-[14px] w-[14px] text-text-primary" />
+        </button>
+      </div>
+    )
+  )
+}
diff --git a/app/components/base/chat/chat/context.tsx b/app/components/base/chat/chat/context.tsx
new file mode 100644
index 0000000..8c69884
--- /dev/null
+++ b/app/components/base/chat/chat/context.tsx
@@ -0,0 +1,66 @@
+'use client'
+
+import type { ReactNode } from 'react'
+import { createContext, useContext } from 'use-context-selector'
+import type { ChatProps } from './index'
+
+export type ChatContextValue = Pick<ChatProps, 'config'
+  | 'isResponding'
+  | 'chatList'
+  | 'showPromptLog'
+  | 'questionIcon'
+  | 'answerIcon'
+  | 'onSend'
+  | 'onRegenerate'
+  | 'onAnnotationEdited'
+  | 'onAnnotationAdded'
+  | 'onAnnotationRemoved'
+  | 'onFeedback'
+>
+
+const ChatContext = createContext<ChatContextValue>({
+  chatList: [],
+})
+
+type ChatContextProviderProps = {
+  children: ReactNode
+} & ChatContextValue
+
+export const ChatContextProvider = ({
+  children,
+  config,
+  isResponding,
+  chatList,
+  showPromptLog,
+  questionIcon,
+  answerIcon,
+  onSend,
+  onRegenerate,
+  onAnnotationEdited,
+  onAnnotationAdded,
+  onAnnotationRemoved,
+  onFeedback,
+}: ChatContextProviderProps) => {
+  return (
+    <ChatContext.Provider value={{
+      config,
+      isResponding,
+      chatList: chatList || [],
+      showPromptLog,
+      questionIcon,
+      answerIcon,
+      onSend,
+      onRegenerate,
+      onAnnotationEdited,
+      onAnnotationAdded,
+      onAnnotationRemoved,
+      onFeedback,
+    }}>
+      {children}
+    </ChatContext.Provider>
+  )
+}
+
+export const useChatContext = () => useContext(ChatContext)
+
+export default ChatContext
diff --git a/app/components/base/chat/chat/hooks.ts b/app/components/base/chat/chat/hooks.ts
new file mode 100644
index 0000000..fde4674
--- /dev/null
+++ b/app/components/base/chat/chat/hooks.ts
@@ -0,0 +1,710 @@
+import {
+  useCallback,
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { produce, setAutoFreeze } from 'immer'
+import { uniqBy } from 'lodash-es'
+import { useParams, usePathname } from 'next/navigation'
+import { v4 as uuidV4 } from 'uuid'
+import type {
+  ChatConfig,
+  ChatItem,
+  ChatItemInTree,
+  Inputs,
+} from '../types'
+import { getThreadMessages } from '../utils'
+import type { InputForm } from './type'
+import {
+  getProcessedInputs,
+  processOpeningStatement,
+} from './utils'
+import { TransferMethod } from '@/types/app'
+import { useToastContext } from '@/app/components/base/toast'
+import { ssePost } from '@/service/base'
+import type { Annotation } from '@/models/log'
+import { WorkflowRunningStatus } from '@/app/components/workflow/types'
+import useTimestamp from '@/hooks/use-timestamp'
+import { AudioPlayerManager } from '@/app/components/base/audio-btn/audio.player.manager'
+import type { FileEntity } from '@/app/components/base/file-uploader/types'
+import {
+  getProcessedFiles,
+  getProcessedFilesFromResponse,
+} from '@/app/components/base/file-uploader/utils'
+import { noop } from 'lodash-es'
+
+type GetAbortController = (abortController: AbortController) => void
+type SendCallback = {
+  onGetConversationMessages?: (conversationId: string, getAbortController: GetAbortController) => Promise<any>
+  onGetSuggestedQuestions?: (responseItemId: string, getAbortController: GetAbortController) => Promise<any>
+  onConversationComplete?: (conversationId: string) => void
+  isPublicAPI?: boolean
+}
+
+export const useChat = (
+  config?: ChatConfig,
+  formSettings?: {
+    inputs: Inputs
+    inputsForm: InputForm[]
+  },
+  prevChatTree?: ChatItemInTree[],
+  stopChat?: (taskId: string) => void,
+  clearChatList?: boolean,
+  clearChatListCallback?: (state: boolean) => void,
+) => {
+  const { t } = useTranslation()
+  const { formatTime } = useTimestamp()
+  const { notify } = useToastContext()
+  const conversationId = useRef('')
+  const hasStopResponded = useRef(false)
+  const [isResponding, setIsResponding] = useState(false)
+  const isRespondingRef = useRef(false)
+  const taskIdRef = useRef('')
+  const [suggestedQuestions, setSuggestQuestions] = useState<string[]>([])
+  const conversationMessagesAbortControllerRef = useRef<AbortController | null>(null)
+  const suggestedQuestionsAbortControllerRef = useRef<AbortController | null>(null)
+  const params = useParams()
+  const pathname = usePathname()
+
+  const [chatTree, setChatTree] = useState<ChatItemInTree[]>(prevChatTree || [])
+  const chatTreeRef = useRef<ChatItemInTree[]>(chatTree)
+  const [targetMessageId, setTargetMessageId] = useState<string>()
+  const threadMessages = useMemo(() => getThreadMessages(chatTree, targetMessageId), [chatTree, targetMessageId])
+
+  const getIntroduction = useCallback((str: string) => {
+    return processOpeningStatement(str, formSettings?.inputs || {}, formSettings?.inputsForm || [])
+  }, [formSettings?.inputs, formSettings?.inputsForm])
+
+  /** Final chat list that will be rendered */
+  const chatList = useMemo(() => {
+    const ret = [...threadMessages]
+    if (config?.opening_statement) {
+      const index = threadMessages.findIndex(item => item.isOpeningStatement)
+
+      if (index > -1) {
+        ret[index] = {
+          ...ret[index],
+          content: getIntroduction(config.opening_statement),
+          suggestedQuestions: config.suggested_questions,
+        }
+      }
+      else {
+        ret.unshift({
+          id: 'opening-statement',
+          content: getIntroduction(config.opening_statement),
+          isAnswer: true,
+          isOpeningStatement: true,
+          suggestedQuestions: config.suggested_questions,
+        })
+      }
+    }
+    return ret
+  }, [threadMessages, config?.opening_statement, getIntroduction, config?.suggested_questions])
+
+  useEffect(() => {
+    setAutoFreeze(false)
+    return () => {
+      setAutoFreeze(true)
+    }
+  }, [])
+
+  /** Find the target node by bfs and then operate on it */
+  const produceChatTreeNode = useCallback((targetId: string, operation: (node: ChatItemInTree) => void) => {
+    return produce(chatTreeRef.current, (draft) => {
+      const queue: ChatItemInTree[] = [...draft]
+      while (queue.length > 0) {
+        const current = queue.shift()!
+        if (current.id === targetId) {
+          operation(current)
+          break
+        }
+        if (current.children)
+          queue.push(...current.children)
+      }
+    })
+  }, [])
+
+  type UpdateChatTreeNode = {
+    (id: string, fields: Partial<ChatItemInTree>): void
+    (id: string, update: (node: ChatItemInTree) => void): void
+  }
+
+  const updateChatTreeNode: UpdateChatTreeNode = useCallback((
+    id: string,
+    fieldsOrUpdate: Partial<ChatItemInTree> | ((node: ChatItemInTree) => void),
+  ) => {
+    const nextState = produceChatTreeNode(id, (node) => {
+      if (typeof fieldsOrUpdate === 'function') {
+        fieldsOrUpdate(node)
+      }
+      else {
+        Object.keys(fieldsOrUpdate).forEach((key) => {
+          (node as any)[key] = (fieldsOrUpdate as any)[key]
+        })
+      }
+    })
+    setChatTree(nextState)
+    chatTreeRef.current = nextState
+  }, [produceChatTreeNode])
+
+  const handleResponding = useCallback((isResponding: boolean) => {
+    setIsResponding(isResponding)
+    isRespondingRef.current = isResponding
+  }, [])
+
+  const handleStop = useCallback(() => {
+    hasStopResponded.current = true
+    handleResponding(false)
+    if (stopChat && taskIdRef.current)
+      stopChat(taskIdRef.current)
+    if (conversationMessagesAbortControllerRef.current)
+      conversationMessagesAbortControllerRef.current.abort()
+    if (suggestedQuestionsAbortControllerRef.current)
+      suggestedQuestionsAbortControllerRef.current.abort()
+  }, [stopChat, handleResponding])
+
+  const handleRestart = useCallback((cb?: any) => {
+    conversationId.current = ''
+    taskIdRef.current = ''
+    handleStop()
+    setChatTree([])
+    setSuggestQuestions([])
+    cb?.()
+  }, [handleStop])
+
+  const updateCurrentQAOnTree = useCallback(({
+    parentId,
+    responseItem,
+    placeholderQuestionId,
+    questionItem,
+  }: {
+    parentId?: string
+    responseItem: ChatItem
+    placeholderQuestionId: string
+    questionItem: ChatItem
+  }) => {
+    let nextState: ChatItemInTree[]
+    const currentQA = { ...questionItem, children: [{ ...responseItem, children: [] }] }
+    if (!parentId && !chatTree.some(item => [placeholderQuestionId, questionItem.id].includes(item.id))) {
+      // QA whose parent is not provided is considered as a first message of the conversation,
+      // and it should be a root node of the chat tree
+      nextState = produce(chatTree, (draft) => {
+        draft.push(currentQA)
+      })
+    }
+    else {
+      // find the target QA in the tree and update it; if not found, insert it to its parent node
+      nextState = produceChatTreeNode(parentId!, (parentNode) => {
+        const questionNodeIndex = parentNode.children!.findIndex(item => [placeholderQuestionId, questionItem.id].includes(item.id))
+        if (questionNodeIndex === -1)
+          parentNode.children!.push(currentQA)
+        else
+          parentNode.children![questionNodeIndex] = currentQA
+      })
+    }
+    setChatTree(nextState)
+    chatTreeRef.current = nextState
+  }, [chatTree, produceChatTreeNode])
+
+  const handleSend = useCallback(async (
+    url: string,
+    data: {
+      query: string
+      files?: FileEntity[]
+      parent_message_id?: string
+      [key: string]: any
+    },
+    {
+      onGetConversationMessages,
+      onGetSuggestedQuestions,
+      onConversationComplete,
+      isPublicAPI,
+    }: SendCallback,
+  ) => {
+    setSuggestQuestions([])
+
+    if (isRespondingRef.current) {
+      notify({ type: 'info', message: t('appDebug.errorMessage.waitForResponse') })
+      return false
+    }
+
+    const parentMessage = threadMessages.find(item => item.id === data.parent_message_id)
+
+    const placeholderQuestionId = `question-${Date.now()}`
+    const questionItem = {
+      id: placeholderQuestionId,
+      content: data.query,
+      isAnswer: false,
+      message_files: data.files,
+      parentMessageId: data.parent_message_id,
+    }
+
+    const placeholderAnswerId = `answer-placeholder-${Date.now()}`
+    const placeholderAnswerItem = {
+      id: placeholderAnswerId,
+      content: '',
+      isAnswer: true,
+      parentMessageId: questionItem.id,
+      siblingIndex: parentMessage?.children?.length ?? chatTree.length,
+    }
+
+    setTargetMessageId(parentMessage?.id)
+    updateCurrentQAOnTree({
+      parentId: data.parent_message_id,
+      responseItem: placeholderAnswerItem,
+      placeholderQuestionId,
+      questionItem,
+    })
+
+    // answer
+    const responseItem: ChatItemInTree = {
+      id: placeholderAnswerId,
+      content: '',
+      agent_thoughts: [],
+      message_files: [],
+      isAnswer: true,
+      parentMessageId: questionItem.id,
+      siblingIndex: parentMessage?.children?.length ?? chatTree.length,
+    }
+
+    handleResponding(true)
+    hasStopResponded.current = false
+
+    const { query, files, inputs, ...restData } = data
+    const bodyParams = {
+      response_mode: 'streaming',
+      conversation_id: conversationId.current,
+      files: getProcessedFiles(files || []),
+      query,
+      inputs: getProcessedInputs(inputs || {}, formSettings?.inputsForm || []),
+      ...restData,
+    }
+    if (bodyParams?.files?.length) {
+      bodyParams.files = bodyParams.files.map((item) => {
+        if (item.transfer_method === TransferMethod.local_file) {
+          return {
+            ...item,
+            url: '',
+          }
+        }
+        return item
+      })
+    }
+
+    let isAgentMode = false
+    let hasSetResponseId = false
+
+    let ttsUrl = ''
+    let ttsIsPublic = false
+    if (params.token) {
+      ttsUrl = '/text-to-audio'
+      ttsIsPublic = true
+    }
+    else if (params.appId) {
+      if (pathname.search('explore/installed') > -1)
+        ttsUrl = `/installed-apps/${params.appId}/text-to-audio`
+      else
+        ttsUrl = `/apps/${params.appId}/text-to-audio`
+    }
+    const player = AudioPlayerManager.getInstance().getAudioPlayer(ttsUrl, ttsIsPublic, uuidV4(), 'none', 'none', noop)
+    ssePost(
+      url,
+      {
+        body: bodyParams,
+      },
+      {
+        isPublicAPI,
+        onData: (message: string, isFirstMessage: boolean, { conversationId: newConversationId, messageId, taskId }: any) => {
+          if (!isAgentMode) {
+            responseItem.content = responseItem.content + message
+          }
+          else {
+            const lastThought = responseItem.agent_thoughts?.[responseItem.agent_thoughts?.length - 1]
+            if (lastThought)
+              lastThought.thought = lastThought.thought + message // need immer setAutoFreeze
+          }
+
+          if (messageId && !hasSetResponseId) {
+            questionItem.id = `question-${messageId}`
+            responseItem.id = messageId
+            responseItem.parentMessageId = questionItem.id
+            hasSetResponseId = true
+          }
+
+          if (isFirstMessage && newConversationId)
+            conversationId.current = newConversationId
+
+          taskIdRef.current = taskId
+          if (messageId)
+            responseItem.id = messageId
+
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: data.parent_message_id,
+          })
+        },
+        async onCompleted(hasError?: boolean) {
+          handleResponding(false)
+
+          if (hasError)
+            return
+
+          if (onConversationComplete)
+            onConversationComplete(conversationId.current)
+
+          if (conversationId.current && !hasStopResponded.current && onGetConversationMessages) {
+            const { data }: any = await onGetConversationMessages(
+              conversationId.current,
+              newAbortController => conversationMessagesAbortControllerRef.current = newAbortController,
+            )
+            const newResponseItem = data.find((item: any) => item.id === responseItem.id)
+            if (!newResponseItem)
+              return
+
+            updateChatTreeNode(responseItem.id, {
+              content: newResponseItem.answer,
+              log: [
+                ...newResponseItem.message,
+                ...(newResponseItem.message[newResponseItem.message.length - 1].role !== 'assistant'
+                  ? [
+                    {
+                      role: 'assistant',
+                      text: newResponseItem.answer,
+                      files: newResponseItem.message_files?.filter((file: any) => file.belongs_to === 'assistant') || [],
+                    },
+                  ]
+                  : []),
+              ],
+              more: {
+                time: formatTime(newResponseItem.created_at, 'hh:mm A'),
+                tokens: newResponseItem.answer_tokens + newResponseItem.message_tokens,
+                latency: newResponseItem.provider_response_latency.toFixed(2),
+              },
+              // for agent log
+              conversationId: conversationId.current,
+              input: {
+                inputs: newResponseItem.inputs,
+                query: newResponseItem.query,
+              },
+            })
+          }
+          if (config?.suggested_questions_after_answer?.enabled && !hasStopResponded.current && onGetSuggestedQuestions) {
+            try {
+              const { data }: any = await onGetSuggestedQuestions(
+                responseItem.id,
+                newAbortController => suggestedQuestionsAbortControllerRef.current = newAbortController,
+              )
+              setSuggestQuestions(data)
+            }
+            // eslint-disable-next-line unused-imports/no-unused-vars
+            catch (e) {
+              setSuggestQuestions([])
+            }
+          }
+        },
+        onFile(file) {
+          const lastThought = responseItem.agent_thoughts?.[responseItem.agent_thoughts?.length - 1]
+          if (lastThought)
+            responseItem.agent_thoughts![responseItem.agent_thoughts!.length - 1].message_files = [...(lastThought as any).message_files, file]
+
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: data.parent_message_id,
+          })
+        },
+        onThought(thought) {
+          isAgentMode = true
+          const response = responseItem as any
+          if (thought.message_id && !hasSetResponseId)
+            response.id = thought.message_id
+          if (thought.conversation_id)
+            response.conversationId = thought.conversation_id
+
+          if (response.agent_thoughts.length === 0) {
+            response.agent_thoughts.push(thought)
+          }
+          else {
+            const lastThought = response.agent_thoughts[response.agent_thoughts.length - 1]
+            // thought changed but still the same thought, so update.
+            if (lastThought.id === thought.id) {
+              thought.thought = lastThought.thought
+              thought.message_files = lastThought.message_files
+              responseItem.agent_thoughts![response.agent_thoughts.length - 1] = thought
+            }
+            else {
+              responseItem.agent_thoughts!.push(thought)
+            }
+          }
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: data.parent_message_id,
+          })
+        },
+        onMessageEnd: (messageEnd) => {
+          if (messageEnd.metadata?.annotation_reply) {
+            responseItem.id = messageEnd.id
+            responseItem.annotation = ({
+              id: messageEnd.metadata.annotation_reply.id,
+              authorName: messageEnd.metadata.annotation_reply.account.name,
+            })
+            updateCurrentQAOnTree({
+              placeholderQuestionId,
+              questionItem,
+              responseItem,
+              parentId: data.parent_message_id,
+            })
+            return
+          }
+          responseItem.citation = messageEnd.metadata?.retriever_resources || []
+          const processedFilesFromResponse = getProcessedFilesFromResponse(messageEnd.files || [])
+          responseItem.allFiles = uniqBy([...(responseItem.allFiles || []), ...(processedFilesFromResponse || [])], 'id')
+
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: data.parent_message_id,
+          })
+        },
+        onMessageReplace: (messageReplace) => {
+          responseItem.content = messageReplace.answer
+        },
+        onError() {
+          handleResponding(false)
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: data.parent_message_id,
+          })
+        },
+        onWorkflowStarted: ({ workflow_run_id, task_id }) => {
+          taskIdRef.current = task_id
+          responseItem.workflow_run_id = workflow_run_id
+          responseItem.workflowProcess = {
+            status: WorkflowRunningStatus.Running,
+            tracing: [],
+          }
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: data.parent_message_id,
+          })
+        },
+        onWorkflowFinished: ({ data: workflowFinishedData }) => {
+          responseItem.workflowProcess!.status = workflowFinishedData.status as WorkflowRunningStatus
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: data.parent_message_id,
+          })
+        },
+        onIterationStart: ({ data: iterationStartedData }) => {
+          responseItem.workflowProcess!.tracing!.push({
+            ...iterationStartedData,
+            status: WorkflowRunningStatus.Running,
+          })
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: data.parent_message_id,
+          })
+        },
+        onIterationFinish: ({ data: iterationFinishedData }) => {
+          const tracing = responseItem.workflowProcess!.tracing!
+          const iterationIndex = tracing.findIndex(item => item.node_id === iterationFinishedData.node_id
+            && (item.execution_metadata?.parallel_id === iterationFinishedData.execution_metadata?.parallel_id || item.parallel_id === iterationFinishedData.execution_metadata?.parallel_id))!
+          tracing[iterationIndex] = {
+            ...tracing[iterationIndex],
+            ...iterationFinishedData,
+            status: WorkflowRunningStatus.Succeeded,
+          }
+
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: data.parent_message_id,
+          })
+        },
+        onNodeStarted: ({ data: nodeStartedData }) => {
+          if (nodeStartedData.iteration_id)
+            return
+
+          if (data.loop_id)
+            return
+
+          responseItem.workflowProcess!.tracing!.push({
+            ...nodeStartedData,
+            status: WorkflowRunningStatus.Running,
+          })
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: data.parent_message_id,
+          })
+        },
+        onNodeFinished: ({ data: nodeFinishedData }) => {
+          if (nodeFinishedData.iteration_id)
+            return
+
+          if (data.loop_id)
+            return
+
+          const currentIndex = responseItem.workflowProcess!.tracing!.findIndex((item) => {
+            if (!item.execution_metadata?.parallel_id)
+              return item.node_id === nodeFinishedData.node_id
+
+            return item.node_id === nodeFinishedData.node_id && (item.execution_metadata?.parallel_id === nodeFinishedData.execution_metadata?.parallel_id)
+          })
+          responseItem.workflowProcess!.tracing[currentIndex] = nodeFinishedData as any
+
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: data.parent_message_id,
+          })
+        },
+        onTTSChunk: (messageId: string, audio: string) => {
+          if (!audio || audio === '')
+            return
+          player.playAudioWithAudio(audio, true)
+          AudioPlayerManager.getInstance().resetMsgId(messageId)
+        },
+        onTTSEnd: (messageId: string, audio: string) => {
+          player.playAudioWithAudio(audio, false)
+        },
+        onLoopStart: ({ data: loopStartedData }) => {
+          responseItem.workflowProcess!.tracing!.push({
+            ...loopStartedData,
+            status: WorkflowRunningStatus.Running,
+          })
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: data.parent_message_id,
+          })
+        },
+        onLoopFinish: ({ data: loopFinishedData }) => {
+          const tracing = responseItem.workflowProcess!.tracing!
+          const loopIndex = tracing.findIndex(item => item.node_id === loopFinishedData.node_id
+            && (item.execution_metadata?.parallel_id === loopFinishedData.execution_metadata?.parallel_id || item.parallel_id === loopFinishedData.execution_metadata?.parallel_id))!
+          tracing[loopIndex] = {
+            ...tracing[loopIndex],
+            ...loopFinishedData,
+            status: WorkflowRunningStatus.Succeeded,
+          }
+
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: data.parent_message_id,
+          })
+        },
+      })
+    return true
+  }, [
+    t,
+    chatTree.length,
+    threadMessages,
+    config?.suggested_questions_after_answer,
+    updateCurrentQAOnTree,
+    updateChatTreeNode,
+    notify,
+    handleResponding,
+    formatTime,
+    params.token,
+    params.appId,
+    pathname,
+    formSettings,
+  ])
+
+  const handleAnnotationEdited = useCallback((query: string, answer: string, index: number) => {
+    const targetQuestionId = chatList[index - 1].id
+    const targetAnswerId = chatList[index].id
+
+    updateChatTreeNode(targetQuestionId, {
+      content: query,
+    })
+    updateChatTreeNode(targetAnswerId, {
+      content: answer,
+      annotation: {
+        ...chatList[index].annotation,
+        logAnnotation: undefined,
+      } as any,
+    })
+  }, [chatList, updateChatTreeNode])
+
+  const handleAnnotationAdded = useCallback((annotationId: string, authorName: string, query: string, answer: string, index: number) => {
+    const targetQuestionId = chatList[index - 1].id
+    const targetAnswerId = chatList[index].id
+
+    updateChatTreeNode(targetQuestionId, {
+      content: query,
+    })
+
+    updateChatTreeNode(targetAnswerId, {
+      content: chatList[index].content,
+      annotation: {
+        id: annotationId,
+        authorName,
+        logAnnotation: {
+          content: answer,
+          account: {
+            id: '',
+            name: authorName,
+            email: '',
+          },
+        },
+      } as Annotation,
+    })
+  }, [chatList, updateChatTreeNode])
+
+  const handleAnnotationRemoved = useCallback((index: number) => {
+    const targetAnswerId = chatList[index].id
+
+    updateChatTreeNode(targetAnswerId, {
+      content: chatList[index].content,
+      annotation: {
+        ...(chatList[index].annotation || {}),
+        id: '',
+      } as Annotation,
+    })
+  }, [chatList, updateChatTreeNode])
+
+  useEffect(() => {
+    if (clearChatList)
+      handleRestart(() => clearChatListCallback?.(false))
+  }, [clearChatList, clearChatListCallback, handleRestart])
+
+  return {
+    chatList,
+    setTargetMessageId,
+    conversationId: conversationId.current,
+    isResponding,
+    setIsResponding,
+    handleSend,
+    suggestedQuestions,
+    handleRestart,
+    handleStop,
+    handleAnnotationEdited,
+    handleAnnotationAdded,
+    handleAnnotationRemoved,
+  }
+}
diff --git a/app/components/base/chat/chat/index.tsx b/app/components/base/chat/chat/index.tsx
new file mode 100644
index 0000000..7c8eb23
--- /dev/null
+++ b/app/components/base/chat/chat/index.tsx
@@ -0,0 +1,348 @@
+import type {
+  FC,
+  ReactNode,
+} from 'react'
+import {
+  memo,
+  useCallback,
+  useEffect,
+  useRef,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { debounce } from 'lodash-es'
+import { useShallow } from 'zustand/react/shallow'
+import type {
+  ChatConfig,
+  ChatItem,
+  Feedback,
+  OnRegenerate,
+  OnSend,
+} from '../types'
+import type { ThemeBuilder } from '../embedded-chatbot/theme/theme-context'
+import Question from './question'
+import Answer from './answer'
+import ChatInputArea from './chat-input-area'
+import TryToAsk from './try-to-ask'
+import { ChatContextProvider } from './context'
+import type { InputForm } from './type'
+import cn from '@/utils/classnames'
+import type { Emoji } from '@/app/components/tools/types'
+import Button from '@/app/components/base/button'
+import { StopCircle } from '@/app/components/base/icons/src/vender/solid/mediaAndDevices'
+import AgentLogModal from '@/app/components/base/agent-log-modal'
+import PromptLogModal from '@/app/components/base/prompt-log-modal'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import type { AppData } from '@/models/share'
+
+export type ChatProps = {
+  appData?: AppData
+  chatList: ChatItem[]
+  config?: ChatConfig
+  isResponding?: boolean
+  noStopResponding?: boolean
+  onStopResponding?: () => void
+  noChatInput?: boolean
+  onSend?: OnSend
+  inputs?: Record<string, any>
+  inputsForm?: InputForm[]
+  onRegenerate?: OnRegenerate
+  chatContainerClassName?: string
+  chatContainerInnerClassName?: string
+  chatFooterClassName?: string
+  chatFooterInnerClassName?: string
+  suggestedQuestions?: string[]
+  showPromptLog?: boolean
+  questionIcon?: ReactNode
+  answerIcon?: ReactNode
+  allToolIcons?: Record<string, string | Emoji>
+  onAnnotationEdited?: (question: string, answer: string, index: number) => void
+  onAnnotationAdded?: (annotationId: string, authorName: string, question: string, answer: string, index: number) => void
+  onAnnotationRemoved?: (index: number) => void
+  chatNode?: ReactNode
+  onFeedback?: (messageId: string, feedback: Feedback) => void
+  chatAnswerContainerInner?: string
+  hideProcessDetail?: boolean
+  hideLogModal?: boolean
+  themeBuilder?: ThemeBuilder
+  switchSibling?: (siblingMessageId: string) => void
+  showFeatureBar?: boolean
+  showFileUpload?: boolean
+  onFeatureBarClick?: (state: boolean) => void
+  noSpacing?: boolean
+  inputDisabled?: boolean
+  isMobile?: boolean
+  sidebarCollapseState?: boolean
+}
+
+const Chat: FC<ChatProps> = ({
+  appData,
+  config,
+  onSend,
+  inputs,
+  inputsForm,
+  onRegenerate,
+  chatList,
+  isResponding,
+  noStopResponding,
+  onStopResponding,
+  noChatInput,
+  chatContainerClassName,
+  chatContainerInnerClassName,
+  chatFooterClassName,
+  chatFooterInnerClassName,
+  suggestedQuestions,
+  showPromptLog,
+  questionIcon,
+  answerIcon,
+  onAnnotationAdded,
+  onAnnotationEdited,
+  onAnnotationRemoved,
+  chatNode,
+  onFeedback,
+  chatAnswerContainerInner,
+  hideProcessDetail,
+  hideLogModal,
+  themeBuilder,
+  switchSibling,
+  showFeatureBar,
+  showFileUpload,
+  onFeatureBarClick,
+  noSpacing,
+  inputDisabled,
+  isMobile,
+  sidebarCollapseState,
+}) => {
+  const { t } = useTranslation()
+  const { currentLogItem, setCurrentLogItem, showPromptLogModal, setShowPromptLogModal, showAgentLogModal, setShowAgentLogModal } = useAppStore(useShallow(state => ({
+    currentLogItem: state.currentLogItem,
+    setCurrentLogItem: state.setCurrentLogItem,
+    showPromptLogModal: state.showPromptLogModal,
+    setShowPromptLogModal: state.setShowPromptLogModal,
+    showAgentLogModal: state.showAgentLogModal,
+    setShowAgentLogModal: state.setShowAgentLogModal,
+  })))
+  const [width, setWidth] = useState(0)
+  const chatContainerRef = useRef<HTMLDivElement>(null)
+  const chatContainerInnerRef = useRef<HTMLDivElement>(null)
+  const chatFooterRef = useRef<HTMLDivElement>(null)
+  const chatFooterInnerRef = useRef<HTMLDivElement>(null)
+  const userScrolledRef = useRef(false)
+
+  const handleScrollToBottom = useCallback(() => {
+    if (chatList.length > 1 && chatContainerRef.current && !userScrolledRef.current)
+      chatContainerRef.current.scrollTop = chatContainerRef.current.scrollHeight
+  }, [chatList.length])
+
+  const handleWindowResize = useCallback(() => {
+    if (chatContainerRef.current)
+      setWidth(document.body.clientWidth - (chatContainerRef.current?.clientWidth + 16) - 8)
+
+    if (chatContainerRef.current && chatFooterRef.current)
+      chatFooterRef.current.style.width = `${chatContainerRef.current.clientWidth}px`
+
+    if (chatContainerInnerRef.current && chatFooterInnerRef.current)
+      chatFooterInnerRef.current.style.width = `${chatContainerInnerRef.current.clientWidth}px`
+  }, [])
+
+  useEffect(() => {
+    handleScrollToBottom()
+    handleWindowResize()
+  }, [handleScrollToBottom, handleWindowResize])
+
+  useEffect(() => {
+    if (chatContainerRef.current) {
+      requestAnimationFrame(() => {
+        handleScrollToBottom()
+        handleWindowResize()
+      })
+    }
+  })
+
+  useEffect(() => {
+    window.addEventListener('resize', debounce(handleWindowResize))
+    return () => window.removeEventListener('resize', handleWindowResize)
+  }, [handleWindowResize])
+
+  useEffect(() => {
+    if (chatFooterRef.current && chatContainerRef.current) {
+      // container padding bottom
+      const resizeContainerObserver = new ResizeObserver((entries) => {
+        for (const entry of entries) {
+          const { blockSize } = entry.borderBoxSize[0]
+          chatContainerRef.current!.style.paddingBottom = `${blockSize}px`
+          handleScrollToBottom()
+        }
+      })
+      resizeContainerObserver.observe(chatFooterRef.current)
+
+      // footer width
+      const resizeFooterObserver = new ResizeObserver((entries) => {
+        for (const entry of entries) {
+          const { inlineSize } = entry.borderBoxSize[0]
+          chatFooterRef.current!.style.width = `${inlineSize}px`
+        }
+      })
+      resizeFooterObserver.observe(chatContainerRef.current)
+
+      return () => {
+        resizeContainerObserver.disconnect()
+        resizeFooterObserver.disconnect()
+      }
+    }
+  }, [handleScrollToBottom])
+
+  useEffect(() => {
+    const chatContainer = chatContainerRef.current
+    if (chatContainer) {
+      const setUserScrolled = () => {
+        // eslint-disable-next-line sonarjs/no-gratuitous-expressions
+        if (chatContainer) // its in event callback, chatContainer may be null
+          userScrolledRef.current = chatContainer.scrollHeight - chatContainer.scrollTop > chatContainer.clientHeight
+      }
+      chatContainer.addEventListener('scroll', setUserScrolled)
+      return () => chatContainer.removeEventListener('scroll', setUserScrolled)
+    }
+  }, [])
+
+  useEffect(() => {
+    if (!sidebarCollapseState)
+      setTimeout(() => handleWindowResize(), 200)
+  }, [handleWindowResize, sidebarCollapseState])
+
+  const hasTryToAsk = config?.suggested_questions_after_answer?.enabled && !!suggestedQuestions?.length && onSend
+
+  return (
+    <ChatContextProvider
+      config={config}
+      chatList={chatList}
+      isResponding={isResponding}
+      showPromptLog={showPromptLog}
+      questionIcon={questionIcon}
+      answerIcon={answerIcon}
+      onSend={onSend}
+      onRegenerate={onRegenerate}
+      onAnnotationAdded={onAnnotationAdded}
+      onAnnotationEdited={onAnnotationEdited}
+      onAnnotationRemoved={onAnnotationRemoved}
+      onFeedback={onFeedback}
+    >
+      <div className='relative h-full'>
+        <div
+          ref={chatContainerRef}
+          className={cn('relative h-full overflow-y-auto overflow-x-hidden', chatContainerClassName)}
+        >
+          {chatNode}
+          <div
+            ref={chatContainerInnerRef}
+            className={cn('w-full', !noSpacing && 'px-8', chatContainerInnerClassName)}
+          >
+            {
+              chatList.map((item, index) => {
+                if (item.isAnswer) {
+                  const isLast = item.id === chatList[chatList.length - 1]?.id
+                  return (
+                    <Answer
+                      appData={appData}
+                      key={item.id}
+                      item={item}
+                      question={chatList[index - 1]?.content}
+                      index={index}
+                      config={config}
+                      answerIcon={answerIcon}
+                      responding={isLast && isResponding}
+                      showPromptLog={showPromptLog}
+                      chatAnswerContainerInner={chatAnswerContainerInner}
+                      hideProcessDetail={hideProcessDetail}
+                      noChatInput={noChatInput}
+                      switchSibling={switchSibling}
+                    />
+                  )
+                }
+                return (
+                  <Question
+                    key={item.id}
+                    item={item}
+                    questionIcon={questionIcon}
+                    theme={themeBuilder?.theme}
+                    enableEdit={config?.questionEditEnable}
+                    switchSibling={switchSibling}
+                  />
+                )
+              })
+            }
+          </div>
+        </div>
+        <div
+          className={`absolute bottom-0 flex justify-center bg-chat-input-mask ${(hasTryToAsk || !noChatInput || !noStopResponding) && chatFooterClassName}`}
+          ref={chatFooterRef}
+        >
+          <div
+            ref={chatFooterInnerRef}
+            className={cn('relative', chatFooterInnerClassName)}
+          >
+            {
+              !noStopResponding && isResponding && (
+                <div className='mb-2 flex justify-center'>
+                  <Button onClick={onStopResponding}>
+                    <StopCircle className='mr-[5px] h-3.5 w-3.5 text-gray-500' />
+                    <span className='text-xs font-normal text-gray-500'>{t('appDebug.operation.stopResponding')}</span>
+                  </Button>
+                </div>
+              )
+            }
+            {
+              hasTryToAsk && (
+                <TryToAsk
+                  suggestedQuestions={suggestedQuestions}
+                  onSend={onSend}
+                  isMobile={isMobile}
+                />
+              )
+            }
+            {
+              !noChatInput && (
+                <ChatInputArea
+                  disabled={inputDisabled}
+                  showFeatureBar={showFeatureBar}
+                  showFileUpload={showFileUpload}
+                  featureBarDisabled={isResponding}
+                  onFeatureBarClick={onFeatureBarClick}
+                  visionConfig={config?.file_upload}
+                  speechToTextConfig={config?.speech_to_text}
+                  onSend={onSend}
+                  inputs={inputs}
+                  inputsForm={inputsForm}
+                  theme={themeBuilder?.theme}
+                  isResponding={isResponding}
+                />
+              )
+            }
+          </div>
+        </div>
+        {showPromptLogModal && !hideLogModal && (
+          <PromptLogModal
+            width={width}
+            currentLogItem={currentLogItem}
+            onCancel={() => {
+              setCurrentLogItem()
+              setShowPromptLogModal(false)
+            }}
+          />
+        )}
+        {showAgentLogModal && !hideLogModal && (
+          <AgentLogModal
+            width={width}
+            currentLogItem={currentLogItem}
+            onCancel={() => {
+              setCurrentLogItem()
+              setShowAgentLogModal(false)
+            }}
+          />
+        )}
+      </div>
+    </ChatContextProvider>
+  )
+}
+
+export default memo(Chat)
diff --git a/app/components/base/chat/chat/loading-anim/index.tsx b/app/components/base/chat/chat/loading-anim/index.tsx
new file mode 100644
index 0000000..dd43ef9
--- /dev/null
+++ b/app/components/base/chat/chat/loading-anim/index.tsx
@@ -0,0 +1,17 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import s from './style.module.css'
+
+export type ILoadingAnimProps = {
+  type: 'text' | 'avatar'
+}
+
+const LoadingAnim: FC<ILoadingAnimProps> = ({
+  type,
+}) => {
+  return (
+    <div className={`${s['dot-flashing']} ${s[type]}`}></div>
+  )
+}
+export default React.memo(LoadingAnim)
diff --git a/app/components/base/chat/chat/loading-anim/style.module.css b/app/components/base/chat/chat/loading-anim/style.module.css
new file mode 100644
index 0000000..b1371ec
--- /dev/null
+++ b/app/components/base/chat/chat/loading-anim/style.module.css
@@ -0,0 +1,82 @@
+.dot-flashing {
+  position: relative;
+  animation: 1s infinite linear alternate;
+  animation-delay: 0.5s;
+}
+
+.dot-flashing::before,
+.dot-flashing::after {
+  content: "";
+  display: inline-block;
+  position: absolute;
+  top: 0;
+  animation: 1s infinite linear alternate;
+}
+
+.dot-flashing::before {
+  animation-delay: 0s;
+}
+
+.dot-flashing::after {
+  animation-delay: 1s;
+}
+
+@keyframes dot-flashing {
+  0% {
+    background-color: #667085;
+  }
+
+  50%,
+  100% {
+    background-color: rgba(102, 112, 133, 0.3);
+  }
+}
+
+@keyframes dot-flashing-avatar {
+  0% {
+    background-color: #155EEF;
+  }
+
+  50%,
+  100% {
+    background-color: rgba(21, 94, 239, 0.3);
+  }
+}
+
+.text,
+.text::before,
+.text::after {
+  width: 4px;
+  height: 4px;
+  border-radius: 50%;
+  background-color: #667085;
+  color: #667085;
+  animation-name: dot-flashing;
+}
+
+.text::before {
+  left: -7px;
+}
+
+.text::after {
+  left: 7px;
+}
+
+.avatar,
+.avatar::before,
+.avatar::after {
+  width: 2px;
+  height: 2px;
+  border-radius: 50%;
+  background-color: #155EEF;
+  color: #155EEF;
+  animation-name: dot-flashing-avatar;
+}
+
+.avatar::before {
+  left: -5px;
+}
+
+.avatar::after {
+  left: 5px;
+}
diff --git a/app/components/base/chat/chat/log/index.tsx b/app/components/base/chat/chat/log/index.tsx
new file mode 100644
index 0000000..5963e12
--- /dev/null
+++ b/app/components/base/chat/chat/log/index.tsx
@@ -0,0 +1,42 @@
+import type { FC } from 'react'
+import { RiFileList3Line } from '@remixicon/react'
+import type { IChatItem } from '@/app/components/base/chat/chat/type'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import ActionButton from '@/app/components/base/action-button'
+
+type LogProps = {
+  logItem: IChatItem
+}
+const Log: FC<LogProps> = ({
+  logItem,
+}) => {
+  const setCurrentLogItem = useAppStore(s => s.setCurrentLogItem)
+  const setShowPromptLogModal = useAppStore(s => s.setShowPromptLogModal)
+  const setShowAgentLogModal = useAppStore(s => s.setShowAgentLogModal)
+  const setShowMessageLogModal = useAppStore(s => s.setShowMessageLogModal)
+  const { workflow_run_id: runID, agent_thoughts } = logItem
+  const isAgent = agent_thoughts && agent_thoughts.length > 0
+
+  return (
+    <div
+      className='ml-1 flex items-center gap-0.5 rounded-[10px] border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg p-0.5 shadow-md backdrop-blur-sm'
+      onClick={(e) => {
+        e.stopPropagation()
+        e.nativeEvent.stopImmediatePropagation()
+        setCurrentLogItem(logItem)
+        if (runID)
+          setShowMessageLogModal(true)
+        else if (isAgent)
+          setShowAgentLogModal(true)
+        else
+          setShowPromptLogModal(true)
+      }}
+    >
+      <ActionButton>
+        <RiFileList3Line className='h-4 w-4' />
+      </ActionButton>
+    </div>
+  )
+}
+
+export default Log
diff --git a/app/components/base/chat/chat/question.stories.tsx b/app/components/base/chat/chat/question.stories.tsx
new file mode 100644
index 0000000..9c0eb8c
--- /dev/null
+++ b/app/components/base/chat/chat/question.stories.tsx
@@ -0,0 +1,33 @@
+import type { Meta, StoryObj } from '@storybook/react'
+
+import type { ChatItem } from '../types'
+import Question from './question'
+import { User } from '@/app/components/base/icons/src/public/avatar'
+
+const meta = {
+  title: 'Base/Chat Question',
+  component: Question,
+  parameters: {
+    layout: 'centered',
+  },
+  tags: ['autodocs'],
+  argTypes: {},
+  args: {},
+} satisfies Meta<typeof Question>
+
+export default meta
+type Story = StoryObj<typeof meta>
+
+export const Default: Story = {
+  args: {
+    item: {
+      id: '1',
+      isAnswer: false,
+      content: 'You are a helpful assistant.',
+    } satisfies ChatItem,
+    theme: undefined,
+    questionIcon: <div className='h-full w-full rounded-full border-[0.5px] border-black/5'>
+      <User className='h-full w-full' />
+    </div>,
+  },
+}
diff --git a/app/components/base/chat/chat/question.tsx b/app/components/base/chat/chat/question.tsx
new file mode 100644
index 0000000..8fc49d1
--- /dev/null
+++ b/app/components/base/chat/chat/question.tsx
@@ -0,0 +1,178 @@
+import type {
+  FC,
+  ReactNode,
+} from 'react'
+import {
+  memo,
+  useCallback,
+  useEffect,
+  useRef,
+  useState,
+} from 'react'
+import type { ChatItem } from '../types'
+import type { Theme } from '../embedded-chatbot/theme/theme-context'
+import { CssTransform } from '../embedded-chatbot/theme/utils'
+import ContentSwitch from './content-switch'
+import { User } from '@/app/components/base/icons/src/public/avatar'
+import { Markdown } from '@/app/components/base/markdown'
+import { FileList } from '@/app/components/base/file-uploader'
+import ActionButton from '../../action-button'
+import { RiClipboardLine, RiEditLine } from '@remixicon/react'
+import Toast from '../../toast'
+import copy from 'copy-to-clipboard'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+import Textarea from 'react-textarea-autosize'
+import Button from '../../button'
+import { useChatContext } from './context'
+
+type QuestionProps = {
+  item: ChatItem
+  questionIcon?: ReactNode
+  theme: Theme | null | undefined
+  enableEdit?: boolean
+  switchSibling?: (siblingMessageId: string) => void
+}
+
+const Question: FC<QuestionProps> = ({
+  item,
+  questionIcon,
+  theme,
+  enableEdit = true,
+  switchSibling,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    content,
+    message_files,
+  } = item
+
+  const {
+    onRegenerate,
+  } = useChatContext()
+
+  const [isEditing, setIsEditing] = useState(false)
+  const [editedContent, setEditedContent] = useState(content)
+  const [contentWidth, setContentWidth] = useState(0)
+  const contentRef = useRef<HTMLDivElement>(null)
+
+  const handleEdit = useCallback(() => {
+    setIsEditing(true)
+    setEditedContent(content)
+  }, [content])
+
+  const handleResend = useCallback(() => {
+    setIsEditing(false)
+    onRegenerate?.(item, { message: editedContent, files: message_files })
+  }, [editedContent, message_files, item, onRegenerate])
+
+  const handleCancelEditing = useCallback(() => {
+    setIsEditing(false)
+    setEditedContent(content)
+  }, [content])
+
+  const handleSwitchSibling = useCallback((direction: 'prev' | 'next') => {
+    if (direction === 'prev')
+      item.prevSibling && switchSibling?.(item.prevSibling)
+    else
+      item.nextSibling && switchSibling?.(item.nextSibling)
+  }, [switchSibling, item.prevSibling, item.nextSibling])
+
+  const getContentWidth = () => {
+    if (contentRef.current)
+      setContentWidth(contentRef.current?.clientWidth)
+  }
+
+  useEffect(() => {
+    if (!contentRef.current)
+      return
+    const resizeObserver = new ResizeObserver(() => {
+      getContentWidth()
+    })
+    resizeObserver.observe(contentRef.current)
+    return () => {
+      resizeObserver.disconnect()
+    }
+  }, [])
+
+  return (
+    <div className='mb-2 flex justify-end last:mb-0'>
+      <div className={cn('group relative mr-4 flex max-w-full items-start pl-14', isEditing && 'flex-1')}>
+        <div className={cn('mr-2 gap-1', isEditing ? 'hidden' : 'flex')}>
+          <div
+            className="absolute hidden gap-0.5 rounded-[10px] border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg p-0.5 shadow-md backdrop-blur-sm group-hover:flex"
+            style={{ right: contentWidth + 8 }}
+          >
+            <ActionButton onClick={() => {
+              copy(content)
+              Toast.notify({ type: 'success', message: t('common.actionMsg.copySuccessfully') })
+            }}>
+              <RiClipboardLine className='h-4 w-4' />
+            </ActionButton>
+            {enableEdit && <ActionButton onClick={handleEdit}>
+              <RiEditLine className='h-4 w-4' />
+            </ActionButton>}
+          </div>
+        </div>
+        <div
+          ref={contentRef}
+          className='w-full rounded-2xl bg-[#D1E9FF]/50 px-4 py-3 text-sm text-gray-900'
+          style={theme?.chatBubbleColorStyle ? CssTransform(theme.chatBubbleColorStyle) : {}}
+        >
+          {
+            !!message_files?.length && (
+              <FileList
+                className='mb-2'
+                files={message_files}
+                showDeleteAction={false}
+                showDownloadAction={true}
+              />
+            )
+          }
+          { !isEditing
+            ? <Markdown content={content} />
+            : <div className="
+                flex flex-col gap-2 rounded-xl
+                border border-components-chat-input-border bg-components-panel-bg-blur p-[9px] shadow-md
+              ">
+              <div className="max-h-[158px] overflow-y-auto overflow-x-hidden">
+                <Textarea
+                  className={cn(
+                    'body-lg-regular w-full p-1 leading-6 text-text-tertiary outline-none',
+                  )}
+                  autoFocus
+                  minRows={1}
+                  value={editedContent}
+                  onChange={e => setEditedContent(e.target.value)}
+                />
+              </div>
+              <div className="flex justify-end gap-2">
+                <Button variant='ghost' onClick={handleCancelEditing}>{t('common.operation.cancel')}</Button>
+                <Button variant='primary' onClick={handleResend}>{t('common.chat.resend')}</Button>
+              </div>
+            </div> }
+          { !isEditing && <ContentSwitch
+            count={item.siblingCount}
+            currentIndex={item.siblingIndex}
+            prevDisabled={!item.prevSibling}
+            nextDisabled={!item.nextSibling}
+            switchSibling={handleSwitchSibling}
+          />}
+        </div>
+        <div className='mt-1 h-[18px]' />
+      </div>
+      <div className='h-10 w-10 shrink-0'>
+        {
+          questionIcon || (
+            <div className='h-full w-full rounded-full border-[0.5px] border-black/5'>
+              <User className='h-full w-full' />
+            </div>
+          )
+        }
+      </div>
+    </div>
+  )
+}
+
+export default memo(Question)
diff --git a/app/components/base/chat/chat/thought/index.tsx b/app/components/base/chat/chat/thought/index.tsx
new file mode 100644
index 0000000..36f7e65
--- /dev/null
+++ b/app/components/base/chat/chat/thought/index.tsx
@@ -0,0 +1,58 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { ThoughtItem, ToolInfoInThought } from '../type'
+import ToolDetail from '@/app/components/base/chat/chat/answer/tool-detail'
+
+export type IThoughtProps = {
+  thought: ThoughtItem
+  isFinished: boolean
+}
+
+function getValue(value: string, isValueArray: boolean, index: number) {
+  if (isValueArray) {
+    try {
+      return JSON.parse(value)[index]
+    }
+    catch {
+    }
+  }
+  return value
+}
+
+const Thought: FC<IThoughtProps> = ({
+  thought,
+  isFinished,
+}) => {
+  const [toolNames, isValueArray]: [string[], boolean] = (() => {
+    try {
+      if (Array.isArray(JSON.parse(thought.tool)))
+        return [JSON.parse(thought.tool), true]
+    }
+    catch {
+    }
+    return [[thought.tool], false]
+  })()
+
+  const toolThoughtList = toolNames.map((toolName, index) => {
+    return {
+      name: toolName,
+      label: thought.tool_labels?.toolName?.language ?? toolName,
+      input: getValue(thought.tool_input, isValueArray, index),
+      output: getValue(thought.observation, isValueArray, index),
+      isFinished,
+    }
+  })
+
+  return (
+    <div className='my-2 space-y-2'>
+      {toolThoughtList.map((item: ToolInfoInThought, index) => (
+        <ToolDetail
+          key={index}
+          payload={item}
+        />
+      ))}
+    </div>
+  )
+}
+export default React.memo(Thought)
diff --git a/app/components/base/chat/chat/thought/panel.tsx b/app/components/base/chat/chat/thought/panel.tsx
new file mode 100644
index 0000000..541818c
--- /dev/null
+++ b/app/components/base/chat/chat/thought/panel.tsx
@@ -0,0 +1,28 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+
+type Props = {
+  isRequest: boolean
+  toolName: string
+  content: string
+}
+
+const Panel: FC<Props> = ({
+  isRequest,
+  toolName,
+  content,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='overflow-hidden rounded-md border border-black/5 bg-gray-100'>
+      <div className='flex items-center bg-gray-50 px-2 py-1 text-xs font-medium uppercase leading-[18px] text-gray-500'>
+        {t(`tools.thought.${isRequest ? 'requestTitle' : 'responseTitle'}`)} {toolName}
+      </div>
+      <div className='border-t border-black/5 p-2 text-xs leading-4 text-gray-700'>{content}</div>
+    </div>
+  )
+}
+export default React.memo(Panel)
diff --git a/app/components/base/chat/chat/thought/tool.tsx b/app/components/base/chat/chat/thought/tool.tsx
new file mode 100644
index 0000000..d0a3c52
--- /dev/null
+++ b/app/components/base/chat/chat/thought/tool.tsx
@@ -0,0 +1,106 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+
+import {
+  RiArrowDownSLine,
+  RiLoader2Line,
+} from '@remixicon/react'
+import type { ToolInfoInThought } from '../type'
+import Panel from './panel'
+import cn from '@/utils/classnames'
+import { CheckCircle } from '@/app/components/base/icons/src/vender/solid/general'
+import { DataSet as DataSetIcon } from '@/app/components/base/icons/src/public/thought'
+import type { Emoji } from '@/app/components/tools/types'
+import AppIcon from '@/app/components/base/app-icon'
+
+type Props = {
+  payload: ToolInfoInThought
+  allToolIcons?: Record<string, string | Emoji>
+}
+
+const getIcon = (toolName: string, allToolIcons: Record<string, string | Emoji>) => {
+  if (toolName.startsWith('dataset_'))
+    return <DataSetIcon className='shrink-0'></DataSetIcon>
+  const icon = allToolIcons[toolName]
+  if (!icon)
+    return null
+  return (
+    typeof icon === 'string'
+      ? (
+        <div
+          className='h-3 w-3 shrink-0 rounded-[3px] bg-cover bg-center'
+          style={{
+            backgroundImage: `url(${icon})`,
+          }}
+        ></div>
+      )
+      : (
+        <AppIcon
+          className='shrink-0 rounded-[3px]'
+          size='xs'
+          icon={icon?.content}
+          background={icon?.background}
+        />
+      ))
+}
+
+const Tool: FC<Props> = ({
+  payload,
+  allToolIcons = {},
+}) => {
+  const { t } = useTranslation()
+  const { name, label, input, isFinished, output } = payload
+  const toolName = name.startsWith('dataset_') ? t('dataset.knowledge') : name
+  const toolLabel = name.startsWith('dataset_') ? t('dataset.knowledge') : label
+  const [isShowDetail, setIsShowDetail] = useState(false)
+  const icon = getIcon(name, allToolIcons) as any
+  return (
+    <div>
+      <div className={cn(!isShowDetail && 'shadow-sm', !isShowDetail && 'inline-block', 'max-w-full overflow-x-auto rounded-md bg-white')}>
+        <div
+          className={cn('flex h-7 cursor-pointer items-center px-2')}
+          onClick={() => setIsShowDetail(!isShowDetail)}
+        >
+          {!isFinished && (
+            <RiLoader2Line className='h-3 w-3 shrink-0 animate-spin text-gray-500' />
+          )}
+          {isFinished && !isShowDetail && (
+            <CheckCircle className='h-3 w-3 shrink-0 text-[#12B76A]' />
+          )}
+          {isFinished && isShowDetail && (
+            icon
+          )}
+          <span className='mx-1 shrink-0 text-xs font-medium text-gray-500'>
+            {t(`tools.thought.${isFinished ? 'used' : 'using'}`)}
+          </span>
+          <span
+            className='truncate text-xs font-medium text-gray-700'
+            title={toolLabel}
+          >
+            {toolLabel}
+          </span>
+          <RiArrowDownSLine
+            className={cn(isShowDetail && 'rotate-180', 'ml-1 h-3 w-3 shrink-0 cursor-pointer select-none text-gray-500')}
+          />
+        </div>
+        {isShowDetail && (
+          <div className='space-y-2 border-t border-black/5 p-2 '>
+            <Panel
+              isRequest={true}
+              toolName={toolName}
+              content={input} />
+            {output && (
+              <Panel
+                isRequest={false}
+                toolName={toolName}
+                content={output as string} />
+            )}
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+export default React.memo(Tool)
diff --git a/app/components/base/chat/chat/try-to-ask.tsx b/app/components/base/chat/chat/try-to-ask.tsx
new file mode 100644
index 0000000..7e3dcc9
--- /dev/null
+++ b/app/components/base/chat/chat/try-to-ask.tsx
@@ -0,0 +1,47 @@
+import type { FC } from 'react'
+import { memo } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { OnSend } from '../types'
+import Button from '@/app/components/base/button'
+import Divider from '@/app/components/base/divider'
+import cn from '@/utils/classnames'
+
+type TryToAskProps = {
+  suggestedQuestions: string[]
+  onSend: OnSend
+  isMobile?: boolean
+}
+const TryToAsk: FC<TryToAskProps> = ({
+  suggestedQuestions,
+  onSend,
+  isMobile,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='mb-2 py-2'>
+      <div className={cn('mb-2.5 flex items-center justify-between gap-2', isMobile && 'justify-end')}>
+        <Divider bgStyle='gradient' className='h-px grow rotate-180' />
+        <div className='system-xs-medium-uppercase shrink-0 text-text-tertiary'>{t('appDebug.feature.suggestedQuestionsAfterAnswer.tryToAsk')}</div>
+        {!isMobile && <Divider bgStyle='gradient' className='h-px grow' />}
+      </div>
+      <div className={cn('flex flex-wrap justify-center', isMobile && 'justify-end')}>
+        {
+          suggestedQuestions.map((suggestQuestion, index) => (
+            <Button
+              size='small'
+              key={index}
+              variant='secondary-accent'
+              className='mb-1 mr-1 last:mr-0'
+              onClick={() => onSend(suggestQuestion)}
+            >
+              {suggestQuestion}
+            </Button>
+          ))
+        }
+      </div>
+    </div>
+  )
+}
+
+export default memo(TryToAsk)
diff --git a/app/components/base/chat/chat/type.ts b/app/components/base/chat/chat/type.ts
new file mode 100644
index 0000000..b37151f
--- /dev/null
+++ b/app/components/base/chat/chat/type.ts
@@ -0,0 +1,147 @@
+import type { TypeWithI18N } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import type { Annotation, MessageRating } from '@/models/log'
+import type { FileEntity } from '@/app/components/base/file-uploader/types'
+import type { InputVarType } from '@/app/components/workflow/types'
+import type { FileResponse } from '@/types/workflow'
+
+export type MessageMore = {
+  time: string
+  tokens: number
+  latency: number | string
+}
+
+export type FeedbackType = {
+  rating: MessageRating
+  content?: string | null
+}
+
+export type FeedbackFunc = (
+  messageId: string,
+  feedback: FeedbackType
+) => Promise<any>
+export type SubmitAnnotationFunc = (
+  messageId: string,
+  content: string
+) => Promise<any>
+
+export type DisplayScene = 'web' | 'console'
+
+export type ToolInfoInThought = {
+  name: string
+  label: string
+  input: string
+  output: string
+  isFinished: boolean
+}
+
+export type ThoughtItem = {
+  id: string
+  tool: string // plugin or dataset. May has multi.
+  thought: string
+  tool_input: string
+  tool_labels?: { [key: string]: TypeWithI18N }
+  message_id: string
+  conversation_id: string
+  observation: string
+  position: number
+  files?: string[]
+  message_files?: FileEntity[]
+}
+
+export type CitationItem = {
+  content: string
+  data_source_type: string
+  dataset_name: string
+  dataset_id: string
+  document_id: string
+  document_name: string
+  hit_count: number
+  index_node_hash: string
+  segment_id: string
+  segment_position: number
+  score: number
+  word_count: number
+}
+
+export type IChatItem = {
+  id: string
+  content: string
+  citation?: CitationItem[]
+  /**
+   * Specific message type
+   */
+  isAnswer: boolean
+  /**
+   * The user feedback result of this message
+   */
+  feedback?: FeedbackType
+  /**
+   * The admin feedback result of this message
+   */
+  adminFeedback?: FeedbackType
+  /**
+   * Whether to hide the feedback area
+   */
+  feedbackDisabled?: boolean
+  /**
+   * More information about this message
+   */
+  more?: MessageMore
+  annotation?: Annotation
+  useCurrentUserAvatar?: boolean
+  isOpeningStatement?: boolean
+  suggestedQuestions?: string[]
+  log?: { role: string; text: string; files?: FileEntity[] }[]
+  agent_thoughts?: ThoughtItem[]
+  message_files?: FileEntity[]
+  workflow_run_id?: string
+  // for agent log
+  conversationId?: string
+  input?: any
+  parentMessageId?: string | null
+  siblingCount?: number
+  siblingIndex?: number
+  prevSibling?: string
+  nextSibling?: string
+}
+
+export type Metadata = {
+  retriever_resources?: CitationItem[]
+  annotation_reply: {
+    id: string
+    account: {
+      id: string
+      name: string
+    }
+  }
+}
+
+export type MessageEnd = {
+  id: string
+  metadata: Metadata
+  files?: FileResponse[]
+}
+
+export type MessageReplace = {
+  id: string
+  task_id: string
+  answer: string
+  conversation_id: string
+}
+
+export type AnnotationReply = {
+  id: string
+  task_id: string
+  answer: string
+  conversation_id: string
+  annotation_id: string
+  annotation_author_name: string
+}
+
+export type InputForm = {
+  type: InputVarType
+  label: string
+  variable: any
+  required: boolean
+  [key: string]: any
+}
diff --git a/app/components/base/chat/chat/utils.ts b/app/components/base/chat/chat/utils.ts
new file mode 100644
index 0000000..69bc680
--- /dev/null
+++ b/app/components/base/chat/chat/utils.ts
@@ -0,0 +1,52 @@
+import type { InputForm } from './type'
+import { InputVarType } from '@/app/components/workflow/types'
+import { getProcessedFiles } from '@/app/components/base/file-uploader/utils'
+
+export const processOpeningStatement = (openingStatement: string, inputs: Record<string, any>, inputsForm: InputForm[]) => {
+  if (!openingStatement)
+    return openingStatement
+
+  return openingStatement.replace(/\{\{([^}]+)\}\}/g, (match, key) => {
+    const name = inputs[key]
+    if (name) { // has set value
+      return name
+    }
+
+    const valueObj = inputsForm.find(v => v.variable === key)
+    return valueObj ? `{{${valueObj.label}}}` : match
+  })
+}
+
+export const processInputFileFromServer = (fileItem: Record<string, any>) => {
+  return {
+    type: fileItem.type,
+    transfer_method: fileItem.transfer_method,
+    url: fileItem.remote_url,
+    upload_file_id: fileItem.related_id,
+  }
+}
+
+export const getProcessedInputs = (inputs: Record<string, any>, inputsForm: InputForm[]) => {
+  const processedInputs = { ...inputs }
+
+  inputsForm.forEach((item) => {
+    const inputValue = inputs[item.variable]
+    if (!inputValue)
+      return
+
+    if (item.type === InputVarType.singleFile) {
+      if ('transfer_method' in inputValue)
+        processedInputs[item.variable] = processInputFileFromServer(inputValue)
+      else
+        processedInputs[item.variable] = getProcessedFiles([inputValue])[0]
+    }
+    else if (item.type === InputVarType.multiFiles) {
+      if ('transfer_method' in inputValue[0])
+        processedInputs[item.variable] = inputValue.map(processInputFileFromServer)
+      else
+        processedInputs[item.variable] = getProcessedFiles(inputValue)
+    }
+  })
+
+  return processedInputs
+}
diff --git a/app/components/base/chat/constants.ts b/app/components/base/chat/constants.ts
new file mode 100644
index 0000000..309f0f0
--- /dev/null
+++ b/app/components/base/chat/constants.ts
@@ -0,0 +1,2 @@
+export const CONVERSATION_ID_INFO = 'conversationIdInfo'
+export const UUID_NIL = '00000000-0000-0000-0000-000000000000'
diff --git a/app/components/base/chat/embedded-chatbot/chat-wrapper.tsx b/app/components/base/chat/embedded-chatbot/chat-wrapper.tsx
new file mode 100644
index 0000000..a06930c
--- /dev/null
+++ b/app/components/base/chat/embedded-chatbot/chat-wrapper.tsx
@@ -0,0 +1,264 @@
+import { useCallback, useEffect, useMemo, useState } from 'react'
+import Chat from '../chat'
+import type {
+  ChatConfig,
+  ChatItem,
+  ChatItemInTree,
+  OnSend,
+} from '../types'
+import { useChat } from '../chat/hooks'
+import { getLastAnswer, isValidGeneratedAnswer } from '../utils'
+import { useEmbeddedChatbotContext } from './context'
+import { isDify } from './utils'
+import { InputVarType } from '@/app/components/workflow/types'
+import { TransferMethod } from '@/types/app'
+import InputsForm from '@/app/components/base/chat/embedded-chatbot/inputs-form'
+import {
+  fetchSuggestedQuestions,
+  getUrl,
+  stopChatMessageResponding,
+} from '@/service/share'
+import AppIcon from '@/app/components/base/app-icon'
+import LogoAvatar from '@/app/components/base/logo/logo-embedded-chat-avatar'
+import AnswerIcon from '@/app/components/base/answer-icon'
+import SuggestedQuestions from '@/app/components/base/chat/chat/answer/suggested-questions'
+import { Markdown } from '@/app/components/base/markdown'
+import cn from '@/utils/classnames'
+import type { FileEntity } from '../../file-uploader/types'
+
+const ChatWrapper = () => {
+  const {
+    appData,
+    appParams,
+    appPrevChatList,
+    currentConversationId,
+    currentConversationItem,
+    currentConversationInputs,
+    inputsForms,
+    newConversationInputs,
+    newConversationInputsRef,
+    handleNewConversationCompleted,
+    isMobile,
+    isInstalledApp,
+    appId,
+    appMeta,
+    handleFeedback,
+    currentChatInstanceRef,
+    themeBuilder,
+    clearChatList,
+    setClearChatList,
+    setIsResponding,
+  } = useEmbeddedChatbotContext()
+  const appConfig = useMemo(() => {
+    const config = appParams || {}
+
+    return {
+      ...config,
+      file_upload: {
+        ...(config as any).file_upload,
+        fileUploadConfig: (config as any).system_parameters,
+      },
+      supportFeedback: true,
+      opening_statement: currentConversationId ? currentConversationItem?.introduction : (config as any).opening_statement,
+    } as ChatConfig
+  }, [appParams, currentConversationItem?.introduction, currentConversationId])
+  const {
+    chatList,
+    setTargetMessageId,
+    handleSend,
+    handleStop,
+    isResponding: respondingState,
+    suggestedQuestions,
+  } = useChat(
+    appConfig,
+    {
+      inputs: (currentConversationId ? currentConversationInputs : newConversationInputs) as any,
+      inputsForm: inputsForms,
+    },
+    appPrevChatList,
+    taskId => stopChatMessageResponding('', taskId, isInstalledApp, appId),
+    clearChatList,
+    setClearChatList,
+  )
+  const inputsFormValue = currentConversationId ? currentConversationInputs : newConversationInputsRef?.current
+  const inputDisabled = useMemo(() => {
+    let hasEmptyInput = ''
+    let fileIsUploading = false
+    const requiredVars = inputsForms.filter(({ required }) => required)
+    if (requiredVars.length) {
+      requiredVars.forEach(({ variable, label, type }) => {
+        if (hasEmptyInput)
+          return
+
+        if (fileIsUploading)
+          return
+
+        if (!inputsFormValue?.[variable])
+          hasEmptyInput = label as string
+
+        if ((type === InputVarType.singleFile || type === InputVarType.multiFiles) && inputsFormValue?.[variable]) {
+          const files = inputsFormValue[variable]
+          if (Array.isArray(files))
+            fileIsUploading = files.find(item => item.transferMethod === TransferMethod.local_file && !item.uploadedId)
+          else
+            fileIsUploading = files.transferMethod === TransferMethod.local_file && !files.uploadedId
+        }
+      })
+    }
+    if (hasEmptyInput)
+      return true
+
+    if (fileIsUploading)
+      return true
+    return false
+  }, [inputsFormValue, inputsForms])
+
+  useEffect(() => {
+    if (currentChatInstanceRef.current)
+      currentChatInstanceRef.current.handleStop = handleStop
+  }, [currentChatInstanceRef, handleStop])
+  useEffect(() => {
+    setIsResponding(respondingState)
+  }, [respondingState, setIsResponding])
+
+  const doSend: OnSend = useCallback((message, files, isRegenerate = false, parentAnswer: ChatItem | null = null) => {
+    const data: any = {
+      query: message,
+      files,
+      inputs: currentConversationId ? currentConversationInputs : newConversationInputs,
+      conversation_id: currentConversationId,
+      parent_message_id: (isRegenerate ? parentAnswer?.id : getLastAnswer(chatList)?.id) || null,
+    }
+
+    handleSend(
+      getUrl('chat-messages', isInstalledApp, appId || ''),
+      data,
+      {
+        onGetSuggestedQuestions: responseItemId => fetchSuggestedQuestions(responseItemId, isInstalledApp, appId),
+        onConversationComplete: currentConversationId ? undefined : handleNewConversationCompleted,
+        isPublicAPI: !isInstalledApp,
+      },
+    )
+  }, [currentConversationId, currentConversationInputs, newConversationInputs, chatList, handleSend, isInstalledApp, appId, handleNewConversationCompleted])
+
+  const doRegenerate = useCallback((chatItem: ChatItemInTree, editedQuestion?: { message: string, files?: FileEntity[] }) => {
+    const question = editedQuestion ? chatItem : chatList.find(item => item.id === chatItem.parentMessageId)!
+    const parentAnswer = chatList.find(item => item.id === question.parentMessageId)
+    doSend(editedQuestion ? editedQuestion.message : question.content,
+      editedQuestion ? editedQuestion.files : question.message_files,
+      true,
+      isValidGeneratedAnswer(parentAnswer) ? parentAnswer : null,
+    )
+  }, [chatList, doSend])
+
+  const messageList = useMemo(() => {
+    if (currentConversationId)
+      return chatList
+    return chatList.filter(item => !item.isOpeningStatement)
+  }, [chatList, currentConversationId])
+
+  const [collapsed, setCollapsed] = useState(!!currentConversationId)
+
+  const chatNode = useMemo(() => {
+    if (!inputsForms.length)
+      return null
+    if (isMobile) {
+      if (!currentConversationId)
+        return <InputsForm collapsed={collapsed} setCollapsed={setCollapsed} />
+      return <div className='mb-4'></div>
+    }
+    else {
+      return <InputsForm collapsed={collapsed} setCollapsed={setCollapsed} />
+    }
+  }, [inputsForms.length, isMobile, currentConversationId, collapsed])
+
+  const welcome = useMemo(() => {
+    const welcomeMessage = chatList.find(item => item.isOpeningStatement)
+    if (respondingState)
+      return null
+    if (currentConversationId)
+      return null
+    if (!welcomeMessage)
+      return null
+    if (!collapsed && inputsForms.length > 0)
+      return null
+    if (welcomeMessage.suggestedQuestions && welcomeMessage.suggestedQuestions?.length > 0) {
+      return (
+        <div className={cn('flex items-center justify-center px-4 py-12', isMobile ? 'min-h-[30vh] py-0' : 'h-[50vh]')}>
+          <div className='flex max-w-[720px] grow gap-4'>
+            <AppIcon
+              size='xl'
+              iconType={appData?.site.icon_type}
+              icon={appData?.site.icon}
+              background={appData?.site.icon_background}
+              imageUrl={appData?.site.icon_url}
+            />
+            <div className='body-lg-regular grow rounded-2xl bg-chat-bubble-bg px-4 py-3 text-text-primary'>
+              <Markdown content={welcomeMessage.content} />
+              <SuggestedQuestions item={welcomeMessage} />
+            </div>
+          </div>
+        </div>
+      )
+    }
+    return (
+      <div className={cn('flex h-[50vh] flex-col items-center justify-center gap-3 py-12', isMobile ? 'min-h-[30vh] py-0' : 'h-[50vh]')}>
+        <AppIcon
+          size='xl'
+          iconType={appData?.site.icon_type}
+          icon={appData?.site.icon}
+          background={appData?.site.icon_background}
+          imageUrl={appData?.site.icon_url}
+        />
+        <div className='max-w-[768px] px-4'>
+          <Markdown className='!body-2xl-regular !text-text-tertiary' content={welcomeMessage.content} />
+        </div>
+      </div>
+    )
+  }, [appData?.site.icon, appData?.site.icon_background, appData?.site.icon_type, appData?.site.icon_url, chatList, collapsed, currentConversationId, inputsForms.length, respondingState])
+
+  const answerIcon = isDify()
+    ? <LogoAvatar className='relative shrink-0' />
+    : (appData?.site && appData.site.use_icon_as_answer_icon)
+      ? <AnswerIcon
+        iconType={appData.site.icon_type}
+        icon={appData.site.icon}
+        background={appData.site.icon_background}
+        imageUrl={appData.site.icon_url}
+      />
+      : null
+
+  return (
+    <Chat
+      appData={appData}
+      config={appConfig}
+      chatList={messageList}
+      isResponding={respondingState}
+      chatContainerInnerClassName={cn('mx-auto w-full max-w-full pt-4 tablet:px-4', isMobile && 'px-4')}
+      chatFooterClassName={cn('pb-4', !isMobile && 'rounded-b-2xl')}
+      chatFooterInnerClassName={cn('mx-auto w-full max-w-full px-4', isMobile && 'px-2')}
+      onSend={doSend}
+      inputs={currentConversationId ? currentConversationInputs as any : newConversationInputs}
+      inputsForm={inputsForms}
+      onRegenerate={doRegenerate}
+      onStopResponding={handleStop}
+      chatNode={
+        <>
+          {chatNode}
+          {welcome}
+        </>
+      }
+      allToolIcons={appMeta?.tool_icons || {}}
+      onFeedback={handleFeedback}
+      suggestedQuestions={suggestedQuestions}
+      answerIcon={answerIcon}
+      hideProcessDetail
+      themeBuilder={themeBuilder}
+      switchSibling={siblingMessageId => setTargetMessageId(siblingMessageId)}
+      inputDisabled={inputDisabled}
+      isMobile={isMobile}
+    />
+  )
+}
+
+export default ChatWrapper
diff --git a/app/components/base/chat/embedded-chatbot/context.tsx b/app/components/base/chat/embedded-chatbot/context.tsx
new file mode 100644
index 0000000..fb00dbd
--- /dev/null
+++ b/app/components/base/chat/embedded-chatbot/context.tsx
@@ -0,0 +1,81 @@
+'use client'
+
+import type { RefObject } from 'react'
+import { createContext, useContext } from 'use-context-selector'
+import type {
+  ChatConfig,
+  ChatItem,
+  Feedback,
+} from '../types'
+import type { ThemeBuilder } from './theme/theme-context'
+import type {
+  AppConversationData,
+  AppData,
+  AppMeta,
+  ConversationItem,
+} from '@/models/share'
+import { noop } from 'lodash-es'
+
+export type EmbeddedChatbotContextValue = {
+  appInfoError?: any
+  appInfoLoading?: boolean
+  appMeta?: AppMeta
+  appData?: AppData
+  appParams?: ChatConfig
+  appChatListDataLoading?: boolean
+  currentConversationId: string
+  currentConversationItem?: ConversationItem
+  appPrevChatList: ChatItem[]
+  pinnedConversationList: AppConversationData['data']
+  conversationList: AppConversationData['data']
+  newConversationInputs: Record<string, any>
+  newConversationInputsRef: RefObject<Record<string, any>>
+  handleNewConversationInputsChange: (v: Record<string, any>) => void
+  inputsForms: any[]
+  handleNewConversation: () => void
+  handleStartChat: (callback?: any) => void
+  handleChangeConversation: (conversationId: string) => void
+  handleNewConversationCompleted: (newConversationId: string) => void
+  chatShouldReloadKey: string
+  isMobile: boolean
+  isInstalledApp: boolean
+  allowResetChat: boolean
+  appId?: string
+  handleFeedback: (messageId: string, feedback: Feedback) => void
+  currentChatInstanceRef: RefObject<{ handleStop: () => void }>
+  themeBuilder?: ThemeBuilder
+  clearChatList?: boolean
+  setClearChatList: (state: boolean) => void
+  isResponding?: boolean
+  setIsResponding: (state: boolean) => void,
+  currentConversationInputs: Record<string, any> | null,
+  setCurrentConversationInputs: (v: Record<string, any>) => void,
+}
+
+export const EmbeddedChatbotContext = createContext<EmbeddedChatbotContextValue>({
+  currentConversationId: '',
+  appPrevChatList: [],
+  pinnedConversationList: [],
+  conversationList: [],
+  newConversationInputs: {},
+  newConversationInputsRef: { current: {} },
+  handleNewConversationInputsChange: noop,
+  inputsForms: [],
+  handleNewConversation: noop,
+  handleStartChat: noop,
+  handleChangeConversation: noop,
+  handleNewConversationCompleted: noop,
+  chatShouldReloadKey: '',
+  isMobile: false,
+  isInstalledApp: false,
+  allowResetChat: true,
+  handleFeedback: noop,
+  currentChatInstanceRef: { current: { handleStop: noop } },
+  clearChatList: false,
+  setClearChatList: noop,
+  isResponding: false,
+  setIsResponding: noop,
+  currentConversationInputs: {},
+  setCurrentConversationInputs: noop,
+})
+export const useEmbeddedChatbotContext = () => useContext(EmbeddedChatbotContext)
diff --git a/app/components/base/chat/embedded-chatbot/header/index.tsx b/app/components/base/chat/embedded-chatbot/header/index.tsx
new file mode 100644
index 0000000..c6c02a4
--- /dev/null
+++ b/app/components/base/chat/embedded-chatbot/header/index.tsx
@@ -0,0 +1,179 @@
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
+import { RiCollapseDiagonal2Line, RiExpandDiagonal2Line, RiResetLeftLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import type { Theme } from '../theme/theme-context'
+import { CssTransform } from '../theme/utils'
+import {
+  useEmbeddedChatbotContext,
+} from '../context'
+import Tooltip from '@/app/components/base/tooltip'
+import ActionButton from '@/app/components/base/action-button'
+import Divider from '@/app/components/base/divider'
+import ViewFormDropdown from '@/app/components/base/chat/embedded-chatbot/inputs-form/view-form-dropdown'
+import DifyLogo from '@/app/components/base/logo/dify-logo'
+import cn from '@/utils/classnames'
+
+export type IHeaderProps = {
+  isMobile?: boolean
+  allowResetChat?: boolean
+  customerIcon?: React.ReactNode
+  title: string
+  theme?: Theme
+  onCreateNewChat?: () => void
+}
+const Header: FC<IHeaderProps> = ({
+  isMobile,
+  allowResetChat,
+  customerIcon,
+  title,
+  theme,
+  onCreateNewChat,
+}) => {
+  const { t } = useTranslation()
+  const {
+    appData,
+    currentConversationId,
+    inputsForms,
+  } = useEmbeddedChatbotContext()
+
+  const isClient = typeof window !== 'undefined'
+  const isIframe = isClient ? window.self !== window.top : false
+  const [parentOrigin, setParentOrigin] = useState('')
+  const [showToggleExpandButton, setShowToggleExpandButton] = useState(false)
+  const [expanded, setExpanded] = useState(false)
+
+  const handleMessageReceived = useCallback((event: MessageEvent) => {
+    let currentParentOrigin = parentOrigin
+    if (!currentParentOrigin && event.data.type === 'dify-chatbot-config') {
+      currentParentOrigin = event.origin
+      setParentOrigin(event.origin)
+    }
+    if (event.origin !== currentParentOrigin)
+      return
+    if (event.data.type === 'dify-chatbot-config')
+      setShowToggleExpandButton(event.data.payload.isToggledByButton && !event.data.payload.isDraggable)
+  }, [parentOrigin])
+
+  useEffect(() => {
+    if (!isIframe) return
+
+    const listener = (event: MessageEvent) => handleMessageReceived(event)
+    window.addEventListener('message', listener)
+
+    window.parent.postMessage({ type: 'dify-chatbot-iframe-ready' }, '*')
+
+    return () => window.removeEventListener('message', listener)
+  }, [isIframe, handleMessageReceived])
+
+  const handleToggleExpand = useCallback(() => {
+    if (!isIframe || !showToggleExpandButton) return
+    setExpanded(!expanded)
+    window.parent.postMessage({
+      type: 'dify-chatbot-expand-change',
+    }, parentOrigin)
+  }, [isIframe, parentOrigin, showToggleExpandButton, expanded])
+
+  if (!isMobile) {
+    return (
+      <div className='flex h-14 shrink-0 items-center justify-end p-3'>
+        <div className='flex items-center gap-1'>
+          {/* powered by */}
+          <div className='shrink-0'>
+            {!appData?.custom_config?.remove_webapp_brand && (
+              <div className={cn(
+                'flex shrink-0 items-center gap-1.5 px-2',
+              )}>
+                <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('share.chat.poweredBy')}</div>
+                {appData?.custom_config?.replace_webapp_logo && (
+                  <img src={appData?.custom_config?.replace_webapp_logo} alt='logo' className='block h-5 w-auto' />
+                )}
+                {!appData?.custom_config?.replace_webapp_logo && (
+                  <DifyLogo size='small' />
+                )}
+              </div>
+            )}
+          </div>
+          {currentConversationId && (
+            <Divider type='vertical' className='h-3.5' />
+          )}
+          {
+            showToggleExpandButton && (
+              <Tooltip
+                popupContent={expanded ? t('share.chat.collapse') : t('share.chat.expand')}
+              >
+                <ActionButton size='l' onClick={handleToggleExpand}>
+                  {
+                    expanded
+                      ? <RiCollapseDiagonal2Line className='h-[18px] w-[18px]' />
+                      : <RiExpandDiagonal2Line className='h-[18px] w-[18px]' />
+                  }
+                </ActionButton>
+              </Tooltip>
+            )
+          }
+          {currentConversationId && allowResetChat && (
+            <Tooltip
+              popupContent={t('share.chat.resetChat')}
+            >
+              <ActionButton size='l' onClick={onCreateNewChat}>
+                <RiResetLeftLine className='h-[18px] w-[18px]' />
+              </ActionButton>
+            </Tooltip>
+          )}
+          {currentConversationId && inputsForms.length > 0 && (
+            <ViewFormDropdown />
+          )}
+        </div>
+      </div>
+    )
+  }
+
+  return (
+    <div
+      className={cn('flex h-14 shrink-0 items-center justify-between rounded-t-2xl px-3')}
+      style={Object.assign({}, CssTransform(theme?.backgroundHeaderColorStyle ?? ''), CssTransform(theme?.headerBorderBottomStyle ?? ''))}
+    >
+      <div className="flex grow items-center space-x-3">
+        {customerIcon}
+        <div
+          className='system-md-semibold truncate'
+          style={CssTransform(theme?.colorFontOnHeaderStyle ?? '')}
+        >
+          {title}
+        </div>
+      </div>
+      <div className='flex items-center gap-1'>
+        {
+          showToggleExpandButton && (
+            <Tooltip
+              popupContent={expanded ? t('share.chat.collapse') : t('share.chat.expand')}
+            >
+              <ActionButton size='l' onClick={handleToggleExpand}>
+                {
+                  expanded
+                    ? <RiCollapseDiagonal2Line className={cn('h-[18px] w-[18px]', theme?.colorPathOnHeader)} />
+                    : <RiExpandDiagonal2Line className={cn('h-[18px] w-[18px]', theme?.colorPathOnHeader)} />
+                }
+              </ActionButton>
+            </Tooltip>
+          )
+        }
+        {currentConversationId && allowResetChat && (
+          <Tooltip
+            popupContent={t('share.chat.resetChat')}
+          >
+            <ActionButton size='l' onClick={onCreateNewChat}>
+              <RiResetLeftLine className={cn('h-[18px] w-[18px]', theme?.colorPathOnHeader)} />
+            </ActionButton>
+          </Tooltip>
+        )}
+        {currentConversationId && inputsForms.length > 0 && (
+          <ViewFormDropdown iconColor={theme?.colorPathOnHeader} />
+        )}
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Header)
diff --git a/app/components/base/chat/embedded-chatbot/hooks.tsx b/app/components/base/chat/embedded-chatbot/hooks.tsx
new file mode 100644
index 0000000..7efbc95
--- /dev/null
+++ b/app/components/base/chat/embedded-chatbot/hooks.tsx
@@ -0,0 +1,405 @@
+import {
+  useCallback,
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import useSWR from 'swr'
+import { useLocalStorageState } from 'ahooks'
+import produce from 'immer'
+import type {
+  ChatConfig,
+  ChatItem,
+  Feedback,
+} from '../types'
+import { CONVERSATION_ID_INFO } from '../constants'
+import { buildChatItemTree, getProcessedInputsFromUrlParams, getProcessedSystemVariablesFromUrlParams } from '../utils'
+import { getProcessedFilesFromResponse } from '../../file-uploader/utils'
+import {
+  fetchAppInfo,
+  fetchAppMeta,
+  fetchAppParams,
+  fetchChatList,
+  fetchConversations,
+  generationConversationName,
+  updateFeedback,
+} from '@/service/share'
+import type {
+  // AppData,
+  ConversationItem,
+} from '@/models/share'
+import { useToastContext } from '@/app/components/base/toast'
+import { changeLanguage } from '@/i18n/i18next-config'
+import { InputVarType } from '@/app/components/workflow/types'
+import { TransferMethod } from '@/types/app'
+import { addFileInfos, sortAgentSorts } from '@/app/components/tools/utils'
+import { noop } from 'lodash-es'
+
+function getFormattedChatList(messages: any[]) {
+  const newChatList: ChatItem[] = []
+  messages.forEach((item) => {
+    const questionFiles = item.message_files?.filter((file: any) => file.belongs_to === 'user') || []
+    newChatList.push({
+      id: `question-${item.id}`,
+      content: item.query,
+      isAnswer: false,
+      message_files: getProcessedFilesFromResponse(questionFiles.map((item: any) => ({ ...item, related_id: item.id }))),
+      parentMessageId: item.parent_message_id || undefined,
+    })
+    const answerFiles = item.message_files?.filter((file: any) => file.belongs_to === 'assistant') || []
+    newChatList.push({
+      id: item.id,
+      content: item.answer,
+      agent_thoughts: addFileInfos(item.agent_thoughts ? sortAgentSorts(item.agent_thoughts) : item.agent_thoughts, item.message_files),
+      feedback: item.feedback,
+      isAnswer: true,
+      citation: item.retriever_resources,
+      message_files: getProcessedFilesFromResponse(answerFiles.map((item: any) => ({ ...item, related_id: item.id }))),
+      parentMessageId: `question-${item.id}`,
+    })
+  })
+  return newChatList
+}
+
+export const useEmbeddedChatbot = () => {
+  const isInstalledApp = false
+  const { data: appInfo, isLoading: appInfoLoading, error: appInfoError } = useSWR('appInfo', fetchAppInfo)
+
+  const appData = useMemo(() => {
+    return appInfo
+  }, [appInfo])
+  const appId = useMemo(() => appData?.app_id, [appData])
+
+  const [userId, setUserId] = useState<string>()
+  const [conversationId, setConversationId] = useState<string>()
+  useEffect(() => {
+    getProcessedSystemVariablesFromUrlParams().then(({ user_id, conversation_id }) => {
+      setUserId(user_id)
+      setConversationId(conversation_id)
+    })
+  }, [])
+
+  useEffect(() => {
+    const setLanguageFromParams = async () => {
+      // Check URL parameters for language override
+      const urlParams = new URLSearchParams(window.location.search)
+      const localeParam = urlParams.get('locale')
+
+      // Check for encoded system variables
+      const systemVariables = await getProcessedSystemVariablesFromUrlParams()
+      const localeFromSysVar = systemVariables.locale
+
+      if (localeParam) {
+        // If locale parameter exists in URL, use it instead of default
+        changeLanguage(localeParam)
+      }
+      else if (localeFromSysVar) {
+        // If locale is set as a system variable, use that
+        changeLanguage(localeFromSysVar)
+      }
+      else if (appInfo?.site.default_language) {
+        // Otherwise use the default from app config
+        changeLanguage(appInfo.site.default_language)
+      }
+    }
+
+    setLanguageFromParams()
+  }, [appInfo])
+
+  const [conversationIdInfo, setConversationIdInfo] = useLocalStorageState<Record<string, Record<string, string>>>(CONVERSATION_ID_INFO, {
+    defaultValue: {},
+  })
+  const allowResetChat = !conversationId
+  const currentConversationId = useMemo(() => conversationIdInfo?.[appId || '']?.[userId || 'DEFAULT'] || conversationId || '',
+    [appId, conversationIdInfo, userId, conversationId])
+  const handleConversationIdInfoChange = useCallback((changeConversationId: string) => {
+    if (appId) {
+      let prevValue = conversationIdInfo?.[appId || '']
+      if (typeof prevValue === 'string')
+        prevValue = {}
+      setConversationIdInfo({
+        ...conversationIdInfo,
+        [appId || '']: {
+          ...prevValue,
+          [userId || 'DEFAULT']: changeConversationId,
+        },
+      })
+    }
+  }, [appId, conversationIdInfo, setConversationIdInfo, userId])
+
+  const [newConversationId, setNewConversationId] = useState('')
+  const chatShouldReloadKey = useMemo(() => {
+    if (currentConversationId === newConversationId)
+      return ''
+
+    return currentConversationId
+  }, [currentConversationId, newConversationId])
+
+  const { data: appParams } = useSWR(['appParams', isInstalledApp, appId], () => fetchAppParams(isInstalledApp, appId))
+  const { data: appMeta } = useSWR(['appMeta', isInstalledApp, appId], () => fetchAppMeta(isInstalledApp, appId))
+  const { data: appPinnedConversationData } = useSWR(['appConversationData', isInstalledApp, appId, true], () => fetchConversations(isInstalledApp, appId, undefined, true, 100))
+  const { data: appConversationData, isLoading: appConversationDataLoading, mutate: mutateAppConversationData } = useSWR(['appConversationData', isInstalledApp, appId, false], () => fetchConversations(isInstalledApp, appId, undefined, false, 100))
+  const { data: appChatListData, isLoading: appChatListDataLoading } = useSWR(chatShouldReloadKey ? ['appChatList', chatShouldReloadKey, isInstalledApp, appId] : null, () => fetchChatList(chatShouldReloadKey, isInstalledApp, appId))
+
+  const [clearChatList, setClearChatList] = useState(false)
+  const [isResponding, setIsResponding] = useState(false)
+  const appPrevChatList = useMemo(
+    () => (currentConversationId && appChatListData?.data.length)
+      ? buildChatItemTree(getFormattedChatList(appChatListData.data))
+      : [],
+    [appChatListData, currentConversationId],
+  )
+
+  const [showNewConversationItemInList, setShowNewConversationItemInList] = useState(false)
+
+  const pinnedConversationList = useMemo(() => {
+    return appPinnedConversationData?.data || []
+  }, [appPinnedConversationData])
+  const { t } = useTranslation()
+  const newConversationInputsRef = useRef<Record<string, any>>({})
+  const [newConversationInputs, setNewConversationInputs] = useState<Record<string, any>>({})
+  const [initInputs, setInitInputs] = useState<Record<string, any>>({})
+  const handleNewConversationInputsChange = useCallback((newInputs: Record<string, any>) => {
+    newConversationInputsRef.current = newInputs
+    setNewConversationInputs(newInputs)
+  }, [])
+  const inputsForms = useMemo(() => {
+    return (appParams?.user_input_form || []).filter((item: any) => !item.external_data_tool).map((item: any) => {
+      if (item.paragraph) {
+        let value = initInputs[item.paragraph.variable]
+        if (value && item.paragraph.max_length && value.length > item.paragraph.max_length)
+          value = value.slice(0, item.paragraph.max_length)
+
+        return {
+          ...item.paragraph,
+          default: value || item.default,
+          type: 'paragraph',
+        }
+      }
+      if (item.number) {
+        const convertedNumber = Number(initInputs[item.number.variable]) ?? undefined
+        return {
+          ...item.number,
+          default: convertedNumber || item.default,
+          type: 'number',
+        }
+      }
+      if (item.select) {
+        const isInputInOptions = item.select.options.includes(initInputs[item.select.variable])
+        return {
+          ...item.select,
+          default: (isInputInOptions ? initInputs[item.select.variable] : undefined) || item.default,
+          type: 'select',
+        }
+      }
+
+      if (item['file-list']) {
+        return {
+          ...item['file-list'],
+          type: 'file-list',
+        }
+      }
+
+      if (item.file) {
+        return {
+          ...item.file,
+          type: 'file',
+        }
+      }
+
+      let value = initInputs[item['text-input'].variable]
+      if (value && item['text-input'].max_length && value.length > item['text-input'].max_length)
+        value = value.slice(0, item['text-input'].max_length)
+
+      return {
+        ...item['text-input'],
+        default: value || item.default,
+        type: 'text-input',
+      }
+    })
+  }, [initInputs, appParams])
+
+  useEffect(() => {
+    // init inputs from url params
+    (async () => {
+      const inputs = await getProcessedInputsFromUrlParams()
+      setInitInputs(inputs)
+    })()
+  }, [])
+  useEffect(() => {
+    const conversationInputs: Record<string, any> = {}
+
+    inputsForms.forEach((item: any) => {
+      conversationInputs[item.variable] = item.default || null
+    })
+    handleNewConversationInputsChange(conversationInputs)
+  }, [handleNewConversationInputsChange, inputsForms])
+
+  const { data: newConversation } = useSWR(newConversationId ? [isInstalledApp, appId, newConversationId] : null, () => generationConversationName(isInstalledApp, appId, newConversationId), { revalidateOnFocus: false })
+  const [originConversationList, setOriginConversationList] = useState<ConversationItem[]>([])
+  useEffect(() => {
+    if (appConversationData?.data && !appConversationDataLoading)
+      setOriginConversationList(appConversationData?.data)
+  }, [appConversationData, appConversationDataLoading])
+  const conversationList = useMemo(() => {
+    const data = originConversationList.slice()
+
+    if (showNewConversationItemInList && data[0]?.id !== '') {
+      data.unshift({
+        id: '',
+        name: t('share.chat.newChatDefaultName'),
+        inputs: {},
+        introduction: '',
+      })
+    }
+    return data
+  }, [originConversationList, showNewConversationItemInList, t])
+
+  useEffect(() => {
+    if (newConversation) {
+      setOriginConversationList(produce((draft) => {
+        const index = draft.findIndex(item => item.id === newConversation.id)
+
+        if (index > -1)
+          draft[index] = newConversation
+        else
+          draft.unshift(newConversation)
+      }))
+    }
+  }, [newConversation])
+
+  const currentConversationItem = useMemo(() => {
+    let conversationItem = conversationList.find(item => item.id === currentConversationId)
+
+    if (!conversationItem && pinnedConversationList.length)
+      conversationItem = pinnedConversationList.find(item => item.id === currentConversationId)
+
+    return conversationItem
+  }, [conversationList, currentConversationId, pinnedConversationList])
+
+  const currentConversationLatestInputs = useMemo(() => {
+    if (!currentConversationId || !appChatListData?.data.length)
+      return newConversationInputsRef.current || {}
+    return appChatListData.data.slice().pop().inputs || {}
+  }, [appChatListData, currentConversationId])
+  const [currentConversationInputs, setCurrentConversationInputs] = useState<Record<string, any>>(currentConversationLatestInputs || {})
+  useEffect(() => {
+    if (currentConversationItem)
+      setCurrentConversationInputs(currentConversationLatestInputs || {})
+  }, [currentConversationItem, currentConversationLatestInputs])
+
+  const { notify } = useToastContext()
+  const checkInputsRequired = useCallback((silent?: boolean) => {
+    let hasEmptyInput = ''
+    let fileIsUploading = false
+    const requiredVars = inputsForms.filter(({ required }) => required)
+    if (requiredVars.length) {
+      requiredVars.forEach(({ variable, label, type }) => {
+        if (hasEmptyInput)
+          return
+
+        if (fileIsUploading)
+          return
+
+        if (!newConversationInputsRef.current[variable] && !silent)
+          hasEmptyInput = label as string
+
+        if ((type === InputVarType.singleFile || type === InputVarType.multiFiles) && newConversationInputsRef.current[variable] && !silent) {
+          const files = newConversationInputsRef.current[variable]
+          if (Array.isArray(files))
+            fileIsUploading = files.find(item => item.transferMethod === TransferMethod.local_file && !item.uploadedId)
+          else
+            fileIsUploading = files.transferMethod === TransferMethod.local_file && !files.uploadedId
+        }
+      })
+    }
+
+    if (hasEmptyInput) {
+      notify({ type: 'error', message: t('appDebug.errorMessage.valueOfVarRequired', { key: hasEmptyInput }) })
+      return false
+    }
+
+    if (fileIsUploading) {
+      notify({ type: 'info', message: t('appDebug.errorMessage.waitForFileUpload') })
+      return
+    }
+
+    return true
+  }, [inputsForms, notify, t])
+  const handleStartChat = useCallback((callback?: any) => {
+    if (checkInputsRequired()) {
+      setShowNewConversationItemInList(true)
+      callback?.()
+    }
+  }, [setShowNewConversationItemInList, checkInputsRequired])
+  const currentChatInstanceRef = useRef<{ handleStop: () => void }>({ handleStop: noop })
+  const handleChangeConversation = useCallback((conversationId: string) => {
+    currentChatInstanceRef.current.handleStop()
+    setNewConversationId('')
+    handleConversationIdInfoChange(conversationId)
+    if (conversationId)
+      setClearChatList(false)
+  }, [handleConversationIdInfoChange, setClearChatList])
+  const handleNewConversation = useCallback(async () => {
+    currentChatInstanceRef.current.handleStop()
+    setShowNewConversationItemInList(true)
+    handleChangeConversation('')
+    handleNewConversationInputsChange(await getProcessedInputsFromUrlParams())
+    setClearChatList(true)
+  }, [handleChangeConversation, setShowNewConversationItemInList, handleNewConversationInputsChange, setClearChatList])
+
+  const handleNewConversationCompleted = useCallback((newConversationId: string) => {
+    setNewConversationId(newConversationId)
+    handleConversationIdInfoChange(newConversationId)
+    setShowNewConversationItemInList(false)
+    mutateAppConversationData()
+  }, [mutateAppConversationData, handleConversationIdInfoChange])
+
+  const handleFeedback = useCallback(async (messageId: string, feedback: Feedback) => {
+    await updateFeedback({ url: `/messages/${messageId}/feedbacks`, body: { rating: feedback.rating } }, isInstalledApp, appId)
+    notify({ type: 'success', message: t('common.api.success') })
+  }, [isInstalledApp, appId, t, notify])
+
+  return {
+    appInfoError,
+    appInfoLoading,
+    isInstalledApp,
+    allowResetChat,
+    appId,
+    currentConversationId,
+    currentConversationItem,
+    handleConversationIdInfoChange,
+    appData,
+    appParams: appParams || {} as ChatConfig,
+    appMeta,
+    appPinnedConversationData,
+    appConversationData,
+    appConversationDataLoading,
+    appChatListData,
+    appChatListDataLoading,
+    appPrevChatList,
+    pinnedConversationList,
+    conversationList,
+    setShowNewConversationItemInList,
+    newConversationInputs,
+    newConversationInputsRef,
+    handleNewConversationInputsChange,
+    inputsForms,
+    handleNewConversation,
+    handleStartChat,
+    handleChangeConversation,
+    handleNewConversationCompleted,
+    newConversationId,
+    chatShouldReloadKey,
+    handleFeedback,
+    currentChatInstanceRef,
+    clearChatList,
+    setClearChatList,
+    isResponding,
+    setIsResponding,
+    currentConversationInputs,
+    setCurrentConversationInputs,
+  }
+}
diff --git a/app/components/base/chat/embedded-chatbot/index.tsx b/app/components/base/chat/embedded-chatbot/index.tsx
new file mode 100644
index 0000000..59c358a
--- /dev/null
+++ b/app/components/base/chat/embedded-chatbot/index.tsx
@@ -0,0 +1,241 @@
+import {
+  useEffect,
+  useState,
+} from 'react'
+import { useAsyncEffect } from 'ahooks'
+import { useTranslation } from 'react-i18next'
+import {
+  EmbeddedChatbotContext,
+  useEmbeddedChatbotContext,
+} from './context'
+import { useEmbeddedChatbot } from './hooks'
+import { isDify } from './utils'
+import { useThemeContext } from './theme/theme-context'
+import { CssTransform } from './theme/utils'
+import { checkOrSetAccessToken } from '@/app/components/share/utils'
+import AppUnavailable from '@/app/components/base/app-unavailable'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import Loading from '@/app/components/base/loading'
+import LogoHeader from '@/app/components/base/logo/logo-embedded-chat-header'
+import Header from '@/app/components/base/chat/embedded-chatbot/header'
+import ChatWrapper from '@/app/components/base/chat/embedded-chatbot/chat-wrapper'
+import DifyLogo from '@/app/components/base/logo/dify-logo'
+import cn from '@/utils/classnames'
+
+const Chatbot = () => {
+  const {
+    isMobile,
+    allowResetChat,
+    appInfoError,
+    appInfoLoading,
+    appData,
+    appChatListDataLoading,
+    chatShouldReloadKey,
+    handleNewConversation,
+    themeBuilder,
+  } = useEmbeddedChatbotContext()
+  const { t } = useTranslation()
+
+  const customConfig = appData?.custom_config
+  const site = appData?.site
+
+  const difyIcon = <LogoHeader />
+
+  useEffect(() => {
+    themeBuilder?.buildTheme(site?.chat_color_theme, site?.chat_color_theme_inverted)
+    if (site) {
+      if (customConfig)
+        document.title = `${site.title}`
+      else
+        document.title = `${site.title} - Powered by Dify`
+    }
+  }, [site, customConfig, themeBuilder])
+
+  if (appInfoLoading) {
+    return (
+      <>
+        {!isMobile && <Loading type='app' />}
+        {isMobile && (
+          <div className={cn('relative')}>
+            <div className={cn('flex h-[calc(100vh_-_60px)] flex-col rounded-2xl border-[0.5px] border-components-panel-border shadow-xs')}>
+              <Loading type='app' />
+            </div>
+          </div>
+        )}
+      </>
+    )
+  }
+
+  if (appInfoError) {
+    return (
+      <>
+        {!isMobile && <AppUnavailable />}
+        {isMobile && (
+          <div className={cn('relative')}>
+            <div className={cn('flex h-[calc(100vh_-_60px)] flex-col rounded-2xl border-[0.5px] border-components-panel-border shadow-xs')}>
+              <AppUnavailable />
+            </div>
+          </div>
+        )}
+      </>
+    )
+  }
+  return (
+    <div className='relative'>
+      <div
+        className={cn(
+          'flex flex-col rounded-2xl border border-components-panel-border-subtle',
+          isMobile ? 'h-[calc(100vh_-_60px)] border-[0.5px] border-components-panel-border shadow-xs' : 'h-[100vh] bg-chatbot-bg',
+        )}
+        style={isMobile ? Object.assign({}, CssTransform(themeBuilder?.theme?.backgroundHeaderColorStyle ?? '')) : {}}
+      >
+        <Header
+          isMobile={isMobile}
+          allowResetChat={allowResetChat}
+          title={site?.title || ''}
+          customerIcon={isDify() ? difyIcon : ''}
+          theme={themeBuilder?.theme}
+          onCreateNewChat={handleNewConversation}
+        />
+        <div className={cn('flex grow flex-col overflow-y-auto', isMobile && '!h-[calc(100vh_-_3rem)] rounded-2xl bg-chatbot-bg')}>
+          {appChatListDataLoading && (
+            <Loading type='app' />
+          )}
+          {!appChatListDataLoading && (
+            <ChatWrapper key={chatShouldReloadKey} />
+          )}
+        </div>
+      </div>
+      {/* powered by */}
+      {isMobile && (
+        <div className='flex h-[60px] shrink-0 items-center pl-2'>
+          {!appData?.custom_config?.remove_webapp_brand && (
+            <div className={cn(
+              'flex shrink-0 items-center gap-1.5 px-2',
+            )}>
+              <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('share.chat.poweredBy')}</div>
+              {appData?.custom_config?.replace_webapp_logo && (
+                <img src={appData?.custom_config?.replace_webapp_logo} alt='logo' className='block h-5 w-auto' />
+              )}
+              {!appData?.custom_config?.replace_webapp_logo && (
+                <DifyLogo size='small' />
+              )}
+            </div>
+          )}
+        </div>
+      )}
+    </div>
+  )
+}
+
+const EmbeddedChatbotWrapper = () => {
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+  const themeBuilder = useThemeContext()
+
+  const {
+    appInfoError,
+    appInfoLoading,
+    appData,
+    appParams,
+    appMeta,
+    appChatListDataLoading,
+    currentConversationId,
+    currentConversationItem,
+    appPrevChatList,
+    pinnedConversationList,
+    conversationList,
+    newConversationInputs,
+    newConversationInputsRef,
+    handleNewConversationInputsChange,
+    inputsForms,
+    handleNewConversation,
+    handleStartChat,
+    handleChangeConversation,
+    handleNewConversationCompleted,
+    chatShouldReloadKey,
+    isInstalledApp,
+    allowResetChat,
+    appId,
+    handleFeedback,
+    currentChatInstanceRef,
+    clearChatList,
+    setClearChatList,
+    isResponding,
+    setIsResponding,
+    currentConversationInputs,
+    setCurrentConversationInputs,
+  } = useEmbeddedChatbot()
+
+  return <EmbeddedChatbotContext.Provider value={{
+    appInfoError,
+    appInfoLoading,
+    appData,
+    appParams,
+    appMeta,
+    appChatListDataLoading,
+    currentConversationId,
+    currentConversationItem,
+    appPrevChatList,
+    pinnedConversationList,
+    conversationList,
+    newConversationInputs,
+    newConversationInputsRef,
+    handleNewConversationInputsChange,
+    inputsForms,
+    handleNewConversation,
+    handleStartChat,
+    handleChangeConversation,
+    handleNewConversationCompleted,
+    chatShouldReloadKey,
+    isMobile,
+    isInstalledApp,
+    allowResetChat,
+    appId,
+    handleFeedback,
+    currentChatInstanceRef,
+    themeBuilder,
+    clearChatList,
+    setClearChatList,
+    isResponding,
+    setIsResponding,
+    currentConversationInputs,
+    setCurrentConversationInputs,
+  }}>
+    <Chatbot />
+  </EmbeddedChatbotContext.Provider>
+}
+
+const EmbeddedChatbot = () => {
+  const [initialized, setInitialized] = useState(false)
+  const [appUnavailable, setAppUnavailable] = useState<boolean>(false)
+  const [isUnknownReason, setIsUnknownReason] = useState<boolean>(false)
+
+  useAsyncEffect(async () => {
+    if (!initialized) {
+      try {
+        await checkOrSetAccessToken()
+      }
+      catch (e: any) {
+        if (e.status === 404) {
+          setAppUnavailable(true)
+        }
+        else {
+          setIsUnknownReason(true)
+          setAppUnavailable(true)
+        }
+      }
+      setInitialized(true)
+    }
+  }, [])
+
+  if (!initialized)
+    return null
+
+  if (appUnavailable)
+    return <AppUnavailable isUnknownReason={isUnknownReason} />
+
+  return <EmbeddedChatbotWrapper />
+}
+
+export default EmbeddedChatbot
diff --git a/app/components/base/chat/embedded-chatbot/inputs-form/content.tsx b/app/components/base/chat/embedded-chatbot/inputs-form/content.tsx
new file mode 100644
index 0000000..e56520d
--- /dev/null
+++ b/app/components/base/chat/embedded-chatbot/inputs-form/content.tsx
@@ -0,0 +1,115 @@
+import React, { memo, useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useEmbeddedChatbotContext } from '../context'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import { PortalSelect } from '@/app/components/base/select'
+import { FileUploaderInAttachmentWrapper } from '@/app/components/base/file-uploader'
+import { InputVarType } from '@/app/components/workflow/types'
+
+type Props = {
+  showTip?: boolean
+}
+
+const InputsFormContent = ({ showTip }: Props) => {
+  const { t } = useTranslation()
+  const {
+    appParams,
+    inputsForms,
+    currentConversationId,
+    currentConversationInputs,
+    setCurrentConversationInputs,
+    newConversationInputs,
+    newConversationInputsRef,
+    handleNewConversationInputsChange,
+  } = useEmbeddedChatbotContext()
+  const inputsFormValue = currentConversationId ? currentConversationInputs : newConversationInputs
+
+  const handleFormChange = useCallback((variable: string, value: any) => {
+    setCurrentConversationInputs({
+      ...currentConversationInputs,
+      [variable]: value,
+    })
+    handleNewConversationInputsChange({
+      ...newConversationInputsRef.current,
+      [variable]: value,
+    })
+  }, [newConversationInputsRef, handleNewConversationInputsChange, currentConversationInputs, setCurrentConversationInputs])
+
+  return (
+    <div className='space-y-4'>
+      {inputsForms.map(form => (
+        <div key={form.variable} className='space-y-1'>
+          <div className='flex h-6 items-center gap-1'>
+            <div className='system-md-semibold text-text-secondary'>{form.label}</div>
+            {!form.required && (
+              <div className='system-xs-regular text-text-tertiary'>{t('appDebug.variableTable.optional')}</div>
+            )}
+          </div>
+          {form.type === InputVarType.textInput && (
+            <Input
+              value={inputsFormValue?.[form.variable] || ''}
+              onChange={e => handleFormChange(form.variable, e.target.value)}
+              placeholder={form.label}
+            />
+          )}
+          {form.type === InputVarType.number && (
+            <Input
+              type='number'
+              value={inputsFormValue?.[form.variable] || ''}
+              onChange={e => handleFormChange(form.variable, e.target.value)}
+              placeholder={form.label}
+            />
+          )}
+          {form.type === InputVarType.paragraph && (
+            <Textarea
+              value={inputsFormValue?.[form.variable] || ''}
+              onChange={e => handleFormChange(form.variable, e.target.value)}
+              placeholder={form.label}
+            />
+          )}
+          {form.type === InputVarType.select && (
+            <PortalSelect
+              popupClassName='w-[200px]'
+              value={inputsFormValue?.[form.variable]}
+              items={form.options.map((option: string) => ({ value: option, name: option }))}
+              onSelect={item => handleFormChange(form.variable, item.value as string)}
+              placeholder={form.label}
+            />
+          )}
+          {form.type === InputVarType.singleFile && (
+            <FileUploaderInAttachmentWrapper
+              value={inputsFormValue?.[form.variable] ? [inputsFormValue?.[form.variable]] : []}
+              onChange={files => handleFormChange(form.variable, files[0])}
+              fileConfig={{
+                allowed_file_types: form.allowed_file_types,
+                allowed_file_extensions: form.allowed_file_extensions,
+                allowed_file_upload_methods: form.allowed_file_upload_methods,
+                number_limits: 1,
+                fileUploadConfig: (appParams as any).system_parameters,
+              }}
+            />
+          )}
+          {form.type === InputVarType.multiFiles && (
+            <FileUploaderInAttachmentWrapper
+              value={inputsFormValue?.[form.variable] || []}
+              onChange={files => handleFormChange(form.variable, files)}
+              fileConfig={{
+                allowed_file_types: form.allowed_file_types,
+                allowed_file_extensions: form.allowed_file_extensions,
+                allowed_file_upload_methods: form.allowed_file_upload_methods,
+                number_limits: form.max_length,
+                fileUploadConfig: (appParams as any).system_parameters,
+              }}
+            />
+          )}
+        </div>
+      ))}
+      {showTip && (
+        <div className='system-xs-regular text-text-tertiary'>{t('share.chat.chatFormTip')}</div>
+      )}
+    </div>
+  )
+}
+
+export default memo(InputsFormContent)
diff --git a/app/components/base/chat/embedded-chatbot/inputs-form/index.tsx b/app/components/base/chat/embedded-chatbot/inputs-form/index.tsx
new file mode 100644
index 0000000..4ac4aaa
--- /dev/null
+++ b/app/components/base/chat/embedded-chatbot/inputs-form/index.tsx
@@ -0,0 +1,79 @@
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { Message3Fill } from '@/app/components/base/icons/src/public/other'
+import Button from '@/app/components/base/button'
+import Divider from '@/app/components/base/divider'
+import InputsFormContent from '@/app/components/base/chat/embedded-chatbot/inputs-form/content'
+import { useEmbeddedChatbotContext } from '../context'
+import cn from '@/utils/classnames'
+
+type Props = {
+  collapsed: boolean
+  setCollapsed: (collapsed: boolean) => void
+}
+
+const InputsFormNode = ({
+  collapsed,
+  setCollapsed,
+}: Props) => {
+  const { t } = useTranslation()
+  const {
+    isMobile,
+    currentConversationId,
+    themeBuilder,
+    handleStartChat,
+  } = useEmbeddedChatbotContext()
+
+  return (
+    <div className={cn('mb-6 flex flex-col items-center px-4 pt-6', isMobile && 'mb-4 pt-4')}>
+      <div className={cn(
+        'w-full max-w-[672px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-md',
+        collapsed && 'border border-components-card-border bg-components-card-bg shadow-none',
+      )}>
+        <div className={cn(
+          'flex items-center gap-3 rounded-t-2xl px-6 py-4',
+          !collapsed && 'border-b border-divider-subtle',
+          isMobile && 'px-4 py-3',
+        )}>
+          <Message3Fill className='h-6 w-6 shrink-0' />
+          <div className='system-xl-semibold grow text-text-secondary'>{t('share.chat.chatSettingsTitle')}</div>
+          {collapsed && (
+            <Button className='uppercase text-text-tertiary' size='small' variant='ghost' onClick={() => setCollapsed(false)}>{t('common.operation.edit')}</Button>
+          )}
+          {!collapsed && currentConversationId && (
+            <Button className='uppercase text-text-tertiary' size='small' variant='ghost' onClick={() => setCollapsed(true)}>{t('common.operation.close')}</Button>
+          )}
+        </div>
+        {!collapsed && (
+          <div className={cn('p-6', isMobile && 'p-4')}>
+            <InputsFormContent />
+          </div>
+        )}
+        {!collapsed && !currentConversationId && (
+          <div className={cn('p-6', isMobile && 'p-4')}>
+            <Button
+              variant='primary'
+              className='w-full'
+              onClick={() => handleStartChat(() => setCollapsed(true))}
+              style={
+                themeBuilder?.theme
+                  ? {
+                    backgroundColor: themeBuilder?.theme.primaryColor,
+                  }
+                  : {}
+              }
+            >{t('share.chat.startChat')}</Button>
+          </div>
+        )}
+      </div>
+      {collapsed && (
+        <div className='flex w-full max-w-[720px] items-center py-4'>
+          <Divider bgStyle='gradient' className='h-px basis-1/2 rotate-180' />
+          <Divider bgStyle='gradient' className='h-px basis-1/2' />
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default InputsFormNode
diff --git a/app/components/base/chat/embedded-chatbot/inputs-form/view-form-dropdown.tsx b/app/components/base/chat/embedded-chatbot/inputs-form/view-form-dropdown.tsx
new file mode 100644
index 0000000..d6c8986
--- /dev/null
+++ b/app/components/base/chat/embedded-chatbot/inputs-form/view-form-dropdown.tsx
@@ -0,0 +1,52 @@
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiChatSettingsLine,
+} from '@remixicon/react'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
+import { Message3Fill } from '@/app/components/base/icons/src/public/other'
+import InputsFormContent from '@/app/components/base/chat/embedded-chatbot/inputs-form/content'
+import cn from '@/utils/classnames'
+
+type Props = {
+  iconColor?: string
+}
+const ViewFormDropdown = ({ iconColor }: Props) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 4,
+      }}
+    >
+      <PortalToFollowElemTrigger
+        onClick={() => setOpen(v => !v)}
+      >
+        <ActionButton size='l' state={open ? ActionButtonState.Hover : ActionButtonState.Default}>
+          <RiChatSettingsLine className={cn('h-[18px] w-[18px]', iconColor)} />
+        </ActionButton>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className="z-50">
+        <div className='w-[400px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-lg backdrop-blur-sm'>
+          <div className='flex items-center gap-3 rounded-t-2xl border-b border-divider-subtle px-6 py-4'>
+            <Message3Fill className='h-6 w-6 shrink-0' />
+            <div className='system-xl-semibold grow text-text-secondary'>{t('share.chat.chatSettingsTitle')}</div>
+          </div>
+          <div className='p-6'>
+            <InputsFormContent />
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+
+  )
+}
+
+export default ViewFormDropdown
diff --git a/app/components/base/chat/embedded-chatbot/theme/theme-context.ts b/app/components/base/chat/embedded-chatbot/theme/theme-context.ts
new file mode 100644
index 0000000..d4d617d
--- /dev/null
+++ b/app/components/base/chat/embedded-chatbot/theme/theme-context.ts
@@ -0,0 +1,75 @@
+import { createContext, useContext } from 'use-context-selector'
+import { hexToRGBA } from './utils'
+
+export class Theme {
+  public chatColorTheme: string | null
+  public chatColorThemeInverted: boolean
+
+  public primaryColor = '#1C64F2'
+  public backgroundHeaderColorStyle = 'backgroundImage: linear-gradient(to right, #2563eb, #0ea5e9)'
+  public headerBorderBottomStyle = ''
+  public colorFontOnHeaderStyle = 'color: white'
+  public colorPathOnHeader = 'text-text-primary-on-surface'
+  public backgroundButtonDefaultColorStyle = 'backgroundColor: #1C64F2'
+  public roundedBackgroundColorStyle = 'backgroundColor: rgb(245 248 255)'
+  public chatBubbleColorStyle = 'backgroundColor: rgb(225 239 254)'
+  public chatBubbleColor = 'rgb(225 239 254)'
+
+  constructor(chatColorTheme: string | null = null, chatColorThemeInverted = false) {
+    this.chatColorTheme = chatColorTheme
+    this.chatColorThemeInverted = chatColorThemeInverted
+    this.configCustomColor()
+    this.configInvertedColor()
+  }
+
+  private configCustomColor() {
+    if (this.chatColorTheme !== null && this.chatColorTheme !== '') {
+      this.primaryColor = this.chatColorTheme ?? '#1C64F2'
+      this.backgroundHeaderColorStyle = `backgroundColor: ${this.primaryColor}`
+      this.backgroundButtonDefaultColorStyle = `backgroundColor: ${this.primaryColor}; color: ${this.colorFontOnHeaderStyle};`
+      this.roundedBackgroundColorStyle = `backgroundColor: ${hexToRGBA(this.primaryColor, 0.05)}`
+      this.chatBubbleColorStyle = `backgroundColor: ${hexToRGBA(this.primaryColor, 0.15)}`
+      this.chatBubbleColor = `${hexToRGBA(this.primaryColor, 0.15)}`
+    }
+  }
+
+  private configInvertedColor() {
+    if (this.chatColorThemeInverted) {
+      this.backgroundHeaderColorStyle = 'backgroundColor: #ffffff'
+      this.colorFontOnHeaderStyle = `color: ${this.primaryColor}`
+      this.headerBorderBottomStyle = 'borderBottom: 1px solid #ccc'
+      this.colorPathOnHeader = this.primaryColor
+    }
+  }
+}
+
+export class ThemeBuilder {
+  private _theme?: Theme
+  private buildChecker = false
+
+  public get theme() {
+    if (this._theme === undefined) {
+      this._theme = new Theme()
+      return this._theme
+    }
+    else {
+      return this._theme
+    }
+  }
+
+  public buildTheme(chatColorTheme: string | null = null, chatColorThemeInverted = false) {
+    if (!this.buildChecker) {
+      this._theme = new Theme(chatColorTheme, chatColorThemeInverted)
+      this.buildChecker = true
+    }
+    else {
+      if (this.theme?.chatColorTheme !== chatColorTheme || this.theme?.chatColorThemeInverted !== chatColorThemeInverted) {
+        this._theme = new Theme(chatColorTheme, chatColorThemeInverted)
+        this.buildChecker = true
+      }
+    }
+  }
+}
+
+const ThemeContext = createContext<ThemeBuilder>(new ThemeBuilder())
+export const useThemeContext = () => useContext(ThemeContext)
diff --git a/app/components/base/chat/embedded-chatbot/theme/utils.ts b/app/components/base/chat/embedded-chatbot/theme/utils.ts
new file mode 100644
index 0000000..812b928
--- /dev/null
+++ b/app/components/base/chat/embedded-chatbot/theme/utils.ts
@@ -0,0 +1,29 @@
+export function hexToRGBA(hex: string, opacity: number): string {
+  hex = hex.replace('#', '')
+
+  const r = Number.parseInt(hex.slice(0, 2), 16)
+  const g = Number.parseInt(hex.slice(2, 4), 16)
+  const b = Number.parseInt(hex.slice(4, 6), 16)
+
+  // Returning an RGB color object
+  return `rgba(${r},${g},${b},${opacity.toString()})`
+}
+
+/**
+ * Since strings cannot be directly assigned to the 'style' attribute in JSX,
+ * this method transforms the string into an object representation of the styles.
+ */
+export function CssTransform(cssString: string): object {
+  if (cssString.length === 0)
+    return {}
+
+  const style: object = {}
+  const propertyValuePairs = cssString.split(';')
+  for (const pair of propertyValuePairs) {
+    if (pair.trim().length > 0) {
+      const [property, value] = pair.split(':')
+      Object.assign(style, { [property.trim()]: value.trim() })
+    }
+  }
+  return style
+}
diff --git a/app/components/base/chat/embedded-chatbot/utils.ts b/app/components/base/chat/embedded-chatbot/utils.ts
new file mode 100644
index 0000000..a3fa68e
--- /dev/null
+++ b/app/components/base/chat/embedded-chatbot/utils.ts
@@ -0,0 +1,3 @@
+export const isDify = () => {
+  return document.referrer.includes('dify.ai')
+}
diff --git a/app/components/base/chat/types.ts b/app/components/base/chat/types.ts
new file mode 100644
index 0000000..91f9bc9
--- /dev/null
+++ b/app/components/base/chat/types.ts
@@ -0,0 +1,86 @@
+import type {
+  ModelConfig,
+  VisionSettings,
+} from '@/types/app'
+import type { IChatItem } from '@/app/components/base/chat/chat/type'
+import type { NodeTracing } from '@/types/workflow'
+import type { WorkflowRunningStatus } from '@/app/components/workflow/types'
+import type { FileEntity } from '@/app/components/base/file-uploader/types'
+
+export type { VisionFile } from '@/types/app'
+export { TransferMethod } from '@/types/app'
+export type {
+  Inputs,
+  PromptVariable,
+} from '@/models/debug'
+
+export type UserInputForm = {
+  default: string
+  label: string
+  required: boolean
+  variable: string
+}
+
+export type UserInputFormTextInput = {
+  'text-input': UserInputForm & {
+    max_length: number
+  }
+}
+
+export type UserInputFormSelect = {
+  select: UserInputForm & {
+    options: string[]
+  }
+}
+
+export type UserInputFormParagraph = {
+  paragraph: UserInputForm
+}
+
+export type VisionConfig = VisionSettings
+
+export type EnableType = {
+  enabled: boolean
+}
+
+export type ChatConfig = Omit<ModelConfig, 'model'> & {
+  supportAnnotation?: boolean
+  appId?: string
+  questionEditEnable?: boolean
+  supportFeedback?: boolean
+  supportCitationHitInfo?: boolean
+}
+
+export type WorkflowProcess = {
+  status: WorkflowRunningStatus
+  tracing: NodeTracing[]
+  expand?: boolean // for UI
+  resultText?: string
+  files?: FileEntity[]
+}
+
+export type ChatItem = IChatItem & {
+  isError?: boolean
+  workflowProcess?: WorkflowProcess
+  conversationId?: string
+  allFiles?: FileEntity[]
+}
+
+export type ChatItemInTree = {
+  children?: ChatItemInTree[]
+} & ChatItem
+
+export type OnSend = {
+  (message: string, files?: FileEntity[]): void
+  (message: string, files: FileEntity[] | undefined, isRegenerate: boolean, lastAnswer?: ChatItem | null): void
+}
+
+export type OnRegenerate = (chatItem: ChatItem) => void
+
+export type Callback = {
+  onSuccess: () => void
+}
+
+export type Feedback = {
+  rating: 'like' | 'dislike' | null
+}
diff --git a/app/components/base/chat/utils.ts b/app/components/base/chat/utils.ts
new file mode 100644
index 0000000..bdac599
--- /dev/null
+++ b/app/components/base/chat/utils.ts
@@ -0,0 +1,193 @@
+import { UUID_NIL } from './constants'
+import type { IChatItem } from './chat/type'
+import type { ChatItem, ChatItemInTree } from './types'
+
+async function decodeBase64AndDecompress(base64String: string) {
+  try {
+    const binaryString = atob(base64String)
+    const compressedUint8Array = Uint8Array.from(binaryString, char => char.charCodeAt(0))
+    const decompressedStream = new Response(compressedUint8Array).body?.pipeThrough(new DecompressionStream('gzip'))
+    const decompressedArrayBuffer = await new Response(decompressedStream).arrayBuffer()
+    return new TextDecoder().decode(decompressedArrayBuffer)
+  }
+  catch {
+    return undefined
+  }
+}
+
+async function getProcessedInputsFromUrlParams(): Promise<Record<string, any>> {
+  const urlParams = new URLSearchParams(window.location.search)
+  const inputs: Record<string, any> = {}
+  const entriesArray = Array.from(urlParams.entries())
+  await Promise.all(
+    entriesArray.map(async ([key, value]) => {
+      if (!key.startsWith('sys.'))
+        inputs[key] = await decodeBase64AndDecompress(decodeURIComponent(value))
+    }),
+  )
+  return inputs
+}
+
+async function getProcessedSystemVariablesFromUrlParams(): Promise<Record<string, any>> {
+  const urlParams = new URLSearchParams(window.location.search)
+  const systemVariables: Record<string, any> = {}
+  const entriesArray = Array.from(urlParams.entries())
+  await Promise.all(
+    entriesArray.map(async ([key, value]) => {
+      if (key.startsWith('sys.'))
+        systemVariables[key.slice(4)] = await decodeBase64AndDecompress(decodeURIComponent(value))
+    }),
+  )
+  return systemVariables
+}
+
+function isValidGeneratedAnswer(item?: ChatItem | ChatItemInTree): boolean {
+  return !!item && item.isAnswer && !item.id.startsWith('answer-placeholder-') && !item.isOpeningStatement
+}
+
+function getLastAnswer<T extends ChatItem | ChatItemInTree>(chatList: T[]): T | null {
+  for (let i = chatList.length - 1; i >= 0; i--) {
+    const item = chatList[i]
+    if (isValidGeneratedAnswer(item))
+      return item
+  }
+  return null
+}
+
+/**
+ * Build a chat item tree from a chat list
+ * @param allMessages - The chat list, sorted from oldest to newest
+ * @returns The chat item tree
+ */
+function buildChatItemTree(allMessages: IChatItem[]): ChatItemInTree[] {
+  const map: Record<string, ChatItemInTree> = {}
+  const rootNodes: ChatItemInTree[] = []
+  const childrenCount: Record<string, number> = {}
+
+  let lastAppendedLegacyAnswer: ChatItemInTree | null = null
+  for (let i = 0; i < allMessages.length; i += 2) {
+    const question = allMessages[i]!
+    const answer = allMessages[i + 1]!
+
+    const isLegacy = question.parentMessageId === UUID_NIL
+    const parentMessageId = isLegacy
+      ? (lastAppendedLegacyAnswer?.id || '')
+      : (question.parentMessageId || '')
+
+    // Process question
+    childrenCount[parentMessageId] = (childrenCount[parentMessageId] || 0) + 1
+    const questionNode: ChatItemInTree = {
+      ...question,
+      children: [],
+    }
+    map[question.id] = questionNode
+
+    // Process answer
+    childrenCount[question.id] = 1
+    const answerNode: ChatItemInTree = {
+      ...answer,
+      children: [],
+      siblingIndex: isLegacy ? 0 : childrenCount[parentMessageId] - 1,
+    }
+    map[answer.id] = answerNode
+
+    // Connect question and answer
+    questionNode.children!.push(answerNode)
+
+    // Append to parent or add to root
+    if (isLegacy) {
+      if (!lastAppendedLegacyAnswer)
+        rootNodes.push(questionNode)
+      else
+        lastAppendedLegacyAnswer.children!.push(questionNode)
+
+      lastAppendedLegacyAnswer = answerNode
+    }
+    else {
+      if (
+        !parentMessageId
+        || !allMessages.some(item => item.id === parentMessageId) // parent message might not be fetched yet, in this case we will append the question to the root nodes
+      )
+        rootNodes.push(questionNode)
+      else
+        map[parentMessageId]?.children!.push(questionNode)
+    }
+  }
+
+  return rootNodes
+}
+
+function getThreadMessages(tree: ChatItemInTree[], targetMessageId?: string): ChatItemInTree[] {
+  let ret: ChatItemInTree[] = []
+  let targetNode: ChatItemInTree | undefined
+
+  // find path to the target message
+  const stack = tree.slice().reverse().map(rootNode => ({
+    node: rootNode,
+    path: [rootNode],
+  }))
+  while (stack.length > 0) {
+    const { node, path } = stack.pop()!
+    if (
+      node.id === targetMessageId
+      || (!targetMessageId && !node.children?.length && !stack.length) // if targetMessageId is not provided, we use the last message in the tree as the target
+    ) {
+      targetNode = node
+      ret = path.map((item, index) => {
+        if (!item.isAnswer)
+          return item
+
+        const parentAnswer = path[index - 2]
+        const siblingCount = !parentAnswer ? tree.length : parentAnswer.children!.length
+        const prevSibling = !parentAnswer ? tree[item.siblingIndex! - 1]?.children?.[0]?.id : parentAnswer.children![item.siblingIndex! - 1]?.children?.[0].id
+        const nextSibling = !parentAnswer ? tree[item.siblingIndex! + 1]?.children?.[0]?.id : parentAnswer.children![item.siblingIndex! + 1]?.children?.[0].id
+
+        return { ...item, siblingCount, prevSibling, nextSibling }
+      })
+      break
+    }
+    if (node.children) {
+      for (let i = node.children.length - 1; i >= 0; i--) {
+        stack.push({
+          node: node.children[i],
+          path: [...path, node.children[i]],
+        })
+      }
+    }
+  }
+
+  // append all descendant messages to the path
+  if (targetNode) {
+    const stack = [targetNode]
+    while (stack.length > 0) {
+      const node = stack.pop()!
+      if (node !== targetNode)
+        ret.push(node)
+      if (node.children?.length) {
+        const lastChild = node.children.at(-1)!
+
+        if (!lastChild.isAnswer) {
+          stack.push(lastChild)
+          continue
+        }
+
+        const parentAnswer = ret.at(-2)
+        const siblingCount = parentAnswer?.children?.length
+        const prevSibling = parentAnswer?.children?.at(-2)?.children?.[0]?.id
+
+        stack.push({ ...lastChild, siblingCount, prevSibling })
+      }
+    }
+  }
+
+  return ret
+}
+
+export {
+  getProcessedInputsFromUrlParams,
+  getProcessedSystemVariablesFromUrlParams,
+  isValidGeneratedAnswer,
+  getLastAnswer,
+  buildChatItemTree,
+  getThreadMessages,
+}
diff --git a/app/components/base/checkbox/assets/indeterminate-icon.tsx b/app/components/base/checkbox/assets/indeterminate-icon.tsx
new file mode 100644
index 0000000..56df8db
--- /dev/null
+++ b/app/components/base/checkbox/assets/indeterminate-icon.tsx
@@ -0,0 +1,11 @@
+const IndeterminateIcon = () => {
+  return (
+    <div data-testid='indeterminate-icon'>
+      <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none">
+        <path d="M2.5 6H9.5" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"/>
+      </svg>
+    </div>
+  )
+}
+
+export default IndeterminateIcon
diff --git a/app/components/base/checkbox/index.spec.tsx b/app/components/base/checkbox/index.spec.tsx
new file mode 100644
index 0000000..7ef901a
--- /dev/null
+++ b/app/components/base/checkbox/index.spec.tsx
@@ -0,0 +1,67 @@
+import { fireEvent, render, screen } from '@testing-library/react'
+import Checkbox from './index'
+
+describe('Checkbox Component', () => {
+  const mockProps = {
+    id: 'test',
+  }
+
+  it('renders unchecked checkbox by default', () => {
+    render(<Checkbox {...mockProps} />)
+    const checkbox = screen.getByTestId('checkbox-test')
+    expect(checkbox).toBeInTheDocument()
+    expect(checkbox).not.toHaveClass('bg-components-checkbox-bg')
+  })
+
+  it('renders checked checkbox when checked prop is true', () => {
+    render(<Checkbox {...mockProps} checked />)
+    const checkbox = screen.getByTestId('checkbox-test')
+    expect(checkbox).toHaveClass('bg-components-checkbox-bg')
+    expect(screen.getByTestId('check-icon-test')).toBeInTheDocument()
+  })
+
+  it('renders indeterminate state correctly', () => {
+    render(<Checkbox {...mockProps} indeterminate />)
+    expect(screen.getByTestId('indeterminate-icon')).toBeInTheDocument()
+  })
+
+  it('handles click events when not disabled', () => {
+    const onCheck = jest.fn()
+    render(<Checkbox {...mockProps} onCheck={onCheck} />)
+    const checkbox = screen.getByTestId('checkbox-test')
+
+    fireEvent.click(checkbox)
+    expect(onCheck).toHaveBeenCalledTimes(1)
+  })
+
+  it('does not handle click events when disabled', () => {
+    const onCheck = jest.fn()
+    render(<Checkbox {...mockProps} disabled onCheck={onCheck} />)
+    const checkbox = screen.getByTestId('checkbox-test')
+
+    fireEvent.click(checkbox)
+    expect(onCheck).not.toHaveBeenCalled()
+    expect(checkbox).toHaveClass('cursor-not-allowed')
+  })
+
+  it('applies custom className when provided', () => {
+    const customClass = 'custom-class'
+    render(<Checkbox {...mockProps} className={customClass} />)
+    const checkbox = screen.getByTestId('checkbox-test')
+    expect(checkbox).toHaveClass(customClass)
+  })
+
+  it('applies correct styles for disabled checked state', () => {
+    render(<Checkbox {...mockProps} checked disabled />)
+    const checkbox = screen.getByTestId('checkbox-test')
+    expect(checkbox).toHaveClass('bg-components-checkbox-bg-disabled-checked')
+    expect(checkbox).toHaveClass('cursor-not-allowed')
+  })
+
+  it('applies correct styles for disabled unchecked state', () => {
+    render(<Checkbox {...mockProps} disabled />)
+    const checkbox = screen.getByTestId('checkbox-test')
+    expect(checkbox).toHaveClass('bg-components-checkbox-bg-disabled')
+    expect(checkbox).toHaveClass('cursor-not-allowed')
+  })
+})
diff --git a/app/components/base/checkbox/index.tsx b/app/components/base/checkbox/index.tsx
new file mode 100644
index 0000000..3e47967
--- /dev/null
+++ b/app/components/base/checkbox/index.tsx
@@ -0,0 +1,51 @@
+import { RiCheckLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import IndeterminateIcon from './assets/indeterminate-icon'
+
+type CheckboxProps = {
+  id?: string
+  checked?: boolean
+  onCheck?: () => void
+  className?: string
+  disabled?: boolean
+  indeterminate?: boolean
+}
+
+const Checkbox = ({
+    id,
+    checked,
+    onCheck,
+    className,
+    disabled,
+    indeterminate,
+}: CheckboxProps) => {
+  const checkClassName = (checked || indeterminate)
+    ? 'bg-components-checkbox-bg text-components-checkbox-icon hover:bg-components-checkbox-bg-hover'
+    : 'border border-components-checkbox-border bg-components-checkbox-bg-unchecked hover:bg-components-checkbox-bg-unchecked-hover hover:border-components-checkbox-border-hover'
+  const disabledClassName = (checked || indeterminate)
+    ? 'cursor-not-allowed bg-components-checkbox-bg-disabled-checked text-components-checkbox-icon-disabled hover:bg-components-checkbox-bg-disabled-checked'
+    : 'cursor-not-allowed border-components-checkbox-border-disabled bg-components-checkbox-bg-disabled hover:border-components-checkbox-border-disabled hover:bg-components-checkbox-bg-disabled'
+
+  return (
+    <div
+      id={id}
+      className={cn(
+        'flex h-4 w-4 cursor-pointer items-center justify-center rounded-[4px] shadow-xs shadow-shadow-shadow-3',
+        checkClassName,
+        disabled && disabledClassName,
+        className,
+      )}
+      onClick={() => {
+        if (disabled)
+          return
+        onCheck?.()
+      }}
+      data-testid={`checkbox-${id}`}
+    >
+      {!checked && indeterminate && <IndeterminateIcon />}
+      {checked && <RiCheckLine className='h-3 w-3' data-testid={`check-icon-${id}`} />}
+    </div>
+  )
+}
+
+export default Checkbox
diff --git a/app/components/base/chip/index.tsx b/app/components/base/chip/index.tsx
new file mode 100644
index 0000000..eeaf2b1
--- /dev/null
+++ b/app/components/base/chip/index.tsx
@@ -0,0 +1,109 @@
+import type { FC } from 'react'
+import { useMemo, useState } from 'react'
+import { RiArrowDownSLine, RiCheckLine, RiCloseCircleFill, RiFilter3Line } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+
+export type Item = {
+  value: number | string
+  name: string
+} & Record<string, any>
+
+type Props = {
+  className?: string
+  panelClassName?: string
+  showLeftIcon?: boolean
+  leftIcon?: any
+  value: number | string
+  items: Item[]
+  onSelect: (item: any) => void
+  onClear: () => void
+}
+const Chip: FC<Props> = ({
+  className,
+  panelClassName,
+  showLeftIcon = true,
+  leftIcon,
+  value,
+  items,
+  onSelect,
+  onClear,
+}) => {
+  const [open, setOpen] = useState(false)
+
+  const triggerContent = useMemo(() => {
+    return items.find(item => item.value === value)?.name || ''
+  }, [items, value])
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <div className='relative'>
+        <PortalToFollowElemTrigger
+          onClick={() => setOpen(v => !v)}
+          className='block'
+        >
+          <div className={cn(
+            'flex min-h-8 cursor-pointer items-center rounded-lg border-[0.5px] border-transparent bg-components-input-bg-normal px-2 py-1 hover:bg-state-base-hover-alt',
+            open && !value && '!bg-state-base-hover-alt hover:bg-state-base-hover-alt',
+            !open && !!value && '!border-components-button-secondary-border !bg-components-button-secondary-bg shadow-xs hover:border-components-button-secondary-border-hover hover:!bg-components-button-secondary-bg-hover',
+            open && !!value && '!border-components-button-secondary-border-hover !bg-components-button-secondary-bg-hover shadow-xs hover:border-components-button-secondary-border-hover hover:!bg-components-button-secondary-bg-hover',
+            className,
+          )}>
+            {showLeftIcon && (
+              <div className='p-0.5'>
+                {leftIcon || (
+                  <RiFilter3Line className={cn('h-4 w-4 text-text-tertiary', !!value && 'text-text-secondary')} />
+                )}
+              </div>
+            )}
+            <div className='flex grow items-center gap-0.5 first-line:p-1'>
+              <div className={cn('system-sm-regular text-text-tertiary', !!value && 'text-text-secondary')}>
+                {triggerContent}
+              </div>
+            </div>
+            {!value && <RiArrowDownSLine className='h-4 w-4 text-text-tertiary' />}
+            {!!value && (
+              <div className='group/clear cursor-pointer p-[1px]' onClick={(e) => {
+                e.stopPropagation()
+                onClear()
+              }}>
+                <RiCloseCircleFill className='h-3.5 w-3.5 text-text-quaternary group-hover/clear:text-text-tertiary' />
+              </div>
+            )}
+          </div>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[1002]'>
+          <div className={cn('relative w-[240px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg', panelClassName)}>
+            <div className='max-h-72 overflow-auto p-1'>
+              {items.map(item => (
+                <div
+                  key={item.value}
+                  className='flex cursor-pointer items-center gap-2 rounded-lg px-2 py-[6px] pl-3 hover:bg-state-base-hover'
+                  onClick={() => {
+                    onSelect(item)
+                    setOpen(false)
+                  }}
+                >
+                  <div title={item.name} className='system-sm-medium grow truncate text-text-secondary'>{item.name}</div>
+                  {value === item.value && <RiCheckLine className='h-4 w-4 shrink-0 text-util-colors-blue-light-blue-light-600' />}
+                </div>
+              ))}
+            </div>
+          </div>
+        </PortalToFollowElemContent>
+      </div>
+    </PortalToFollowElem>
+
+  )
+}
+
+export default Chip
diff --git a/app/components/base/confirm/index.tsx b/app/components/base/confirm/index.tsx
new file mode 100644
index 0000000..8cb1c8b
--- /dev/null
+++ b/app/components/base/confirm/index.tsx
@@ -0,0 +1,108 @@
+import React, { useEffect, useRef, useState } from 'react'
+import { createPortal } from 'react-dom'
+import { useTranslation } from 'react-i18next'
+import Button from '../button'
+
+export type IConfirm = {
+  className?: string
+  isShow: boolean
+  type?: 'info' | 'warning'
+  title: string
+  content?: React.ReactNode
+  confirmText?: string | null
+  onConfirm: () => void
+  cancelText?: string
+  onCancel: () => void
+  isLoading?: boolean
+  isDisabled?: boolean
+  showConfirm?: boolean
+  showCancel?: boolean
+  maskClosable?: boolean
+}
+
+function Confirm({
+  isShow,
+  type = 'warning',
+  title,
+  content,
+  confirmText,
+  cancelText,
+  onConfirm,
+  onCancel,
+  showConfirm = true,
+  showCancel = true,
+  isLoading = false,
+  isDisabled = false,
+  maskClosable = true,
+}: IConfirm) {
+  const { t } = useTranslation()
+  const dialogRef = useRef<HTMLDivElement>(null)
+  const [isVisible, setIsVisible] = useState(isShow)
+
+  const confirmTxt = confirmText || `${t('common.operation.confirm')}`
+  const cancelTxt = cancelText || `${t('common.operation.cancel')}`
+
+  useEffect(() => {
+    const handleKeyDown = (event: KeyboardEvent) => {
+      if (event.key === 'Escape')
+        onCancel()
+      if (event.key === 'Enter' && isShow) {
+        event.preventDefault()
+        onConfirm()
+      }
+    }
+
+    document.addEventListener('keydown', handleKeyDown)
+    return () => {
+      document.removeEventListener('keydown', handleKeyDown)
+    }
+  }, [onCancel, onConfirm, isShow])
+
+  const handleClickOutside = (event: MouseEvent) => {
+    if (maskClosable && dialogRef.current && !dialogRef.current.contains(event.target as Node))
+      onCancel()
+  }
+
+  useEffect(() => {
+    document.addEventListener('mousedown', handleClickOutside)
+    return () => {
+      document.removeEventListener('mousedown', handleClickOutside)
+    }
+  }, [maskClosable])
+
+  useEffect(() => {
+    if (isShow) {
+      setIsVisible(true)
+    }
+    else {
+      const timer = setTimeout(() => setIsVisible(false), 200)
+      return () => clearTimeout(timer)
+    }
+  }, [isShow])
+
+  if (!isVisible)
+    return null
+
+  return createPortal(
+    <div className={'fixed inset-0 z-[10000000] flex items-center justify-center bg-background-overlay'}
+      onClick={(e) => {
+        e.preventDefault()
+        e.stopPropagation()
+      }}>
+      <div ref={dialogRef} className={'relative w-full max-w-[480px] overflow-hidden'}>
+        <div className='shadows-shadow-lg flex max-w-full flex-col items-start rounded-2xl border-[0.5px] border-solid border-components-panel-border bg-components-panel-bg'>
+          <div className='flex flex-col items-start gap-2 self-stretch pb-4 pl-6 pr-6 pt-6'>
+            <div className='title-2xl-semi-bold text-text-primary'>{title}</div>
+            <div className='system-md-regular w-full text-text-tertiary'>{content}</div>
+          </div>
+          <div className='flex items-start justify-end gap-2 self-stretch p-6'>
+            {showCancel && <Button onClick={onCancel}>{cancelTxt}</Button>}
+            {showConfirm && <Button variant={'primary'} destructive={type !== 'info'} loading={isLoading} disabled={isDisabled} onClick={onConfirm}>{confirmTxt}</Button>}
+          </div>
+        </div>
+      </div>
+    </div>, document.body,
+  )
+}
+
+export default React.memo(Confirm)
diff --git a/app/components/base/content-dialog/index.tsx b/app/components/base/content-dialog/index.tsx
new file mode 100644
index 0000000..861a36f
--- /dev/null
+++ b/app/components/base/content-dialog/index.tsx
@@ -0,0 +1,51 @@
+import type { ReactNode } from 'react'
+import { Transition, TransitionChild } from '@headlessui/react'
+import classNames from '@/utils/classnames'
+
+type ContentDialogProps = {
+  className?: string
+  show: boolean
+  onClose?: () => void
+  children: ReactNode
+}
+
+const ContentDialog = ({
+  className,
+  show,
+  onClose,
+  children,
+}: ContentDialogProps) => {
+  return (
+    <Transition
+      show={show}
+      as="div"
+      className="absolute left-0 top-0 z-20 box-border h-full w-full p-2"
+    >
+      <TransitionChild>
+        <div
+          className={classNames(
+            'absolute left-0 inset-0 w-full bg-app-detail-overlay-bg',
+            'duration-300 ease-in data-[closed]:opacity-0',
+            'data-[enter]:opacity-100',
+            'data-[leave]:opacity-0',
+          )}
+          onClick={onClose}
+        />
+      </TransitionChild>
+
+      <TransitionChild>
+        <div className={classNames(
+          'absolute left-0 w-full bg-app-detail-bg border-r border-divider-burn',
+          'duration-100 ease-in data-[closed]:-translate-x-full',
+          'data-[enter]:ease-out data-[enter]:duration-300 data-[enter]:translate-x-0',
+          'data-[leave]:ease-in data-[leave]:duration-200 data-[leave]:-translate-x-full',
+          className,
+        )}>
+          {children}
+        </div>
+      </TransitionChild>
+    </Transition>
+  )
+}
+
+export default ContentDialog
diff --git a/app/components/base/copy-btn/index.tsx b/app/components/base/copy-btn/index.tsx
new file mode 100644
index 0000000..88c8ba6
--- /dev/null
+++ b/app/components/base/copy-btn/index.tsx
@@ -0,0 +1,54 @@
+'use client'
+import { useState } from 'react'
+import { t } from 'i18next'
+import { debounce } from 'lodash-es'
+import copy from 'copy-to-clipboard'
+import s from './style.module.css'
+import Tooltip from '@/app/components/base/tooltip'
+
+type ICopyBtnProps = {
+  value: string
+  className?: string
+  isPlain?: boolean
+}
+
+const CopyBtn = ({
+  value,
+  className,
+  isPlain,
+}: ICopyBtnProps) => {
+  const [isCopied, setIsCopied] = useState(false)
+
+  const onClickCopy = debounce(() => {
+    copy(value)
+    setIsCopied(true)
+  }, 100)
+
+  const onMouseLeave = debounce(() => {
+    setIsCopied(false)
+  }, 100)
+
+  return (
+    <div className={`${className}`}>
+      <Tooltip
+        popupContent={(isCopied ? t('appApi.copied') : t('appApi.copy'))}
+        asChild={false}
+      >
+        <div
+          onMouseLeave={onMouseLeave}
+          className={'box-border flex cursor-pointer items-center justify-center rounded-md bg-components-button-secondary-bg p-0.5'}
+          style={!isPlain
+            ? {
+              boxShadow: '0px 4px 8px -2px rgba(16, 24, 40, 0.1), 0px 2px 4px -2px rgba(16, 24, 40, 0.06)',
+            }
+            : {}}
+          onClick={onClickCopy}
+        >
+          <div className={`h-6 w-6 rounded-md hover:bg-components-button-secondary-bg-hover  ${s.copyIcon} ${isCopied ? s.copied : ''}`}></div>
+        </div>
+      </Tooltip>
+    </div>
+  )
+}
+
+export default CopyBtn
diff --git a/app/components/base/copy-btn/style.module.css b/app/components/base/copy-btn/style.module.css
new file mode 100644
index 0000000..83625d6
--- /dev/null
+++ b/app/components/base/copy-btn/style.module.css
@@ -0,0 +1,15 @@
+.copyIcon {
+  background-image: url(~@/app/components/develop/secret-key/assets/copy.svg);
+  background-position: center;
+  background-repeat: no-repeat;
+}
+
+.copyIcon:hover {
+  background-image: url(~@/app/components/develop/secret-key/assets/copy-hover.svg);
+  background-position: center;
+  background-repeat: no-repeat;
+}
+
+.copyIcon.copied {
+  background-image: url(~@/app/components/develop/secret-key/assets/copied.svg);
+}
diff --git a/app/components/base/copy-feedback/index.tsx b/app/components/base/copy-feedback/index.tsx
new file mode 100644
index 0000000..18ebe03
--- /dev/null
+++ b/app/components/base/copy-feedback/index.tsx
@@ -0,0 +1,91 @@
+'use client'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiClipboardFill,
+  RiClipboardLine,
+} from '@remixicon/react'
+import { debounce } from 'lodash-es'
+import copy from 'copy-to-clipboard'
+import copyStyle from './style.module.css'
+import Tooltip from '@/app/components/base/tooltip'
+import ActionButton from '@/app/components/base/action-button'
+
+type Props = {
+  content: string
+  className?: string
+}
+
+const prefixEmbedded = 'appOverview.overview.appInfo.embedded'
+
+const CopyFeedback = ({ content }: Props) => {
+  const { t } = useTranslation()
+  const [isCopied, setIsCopied] = useState<boolean>(false)
+
+  const onClickCopy = debounce(() => {
+    copy(content)
+    setIsCopied(true)
+  }, 100)
+
+  const onMouseLeave = debounce(() => {
+    setIsCopied(false)
+  }, 100)
+
+  return (
+    <Tooltip
+      popupContent={
+        (isCopied
+          ? t(`${prefixEmbedded}.copied`)
+          : t(`${prefixEmbedded}.copy`)) || ''
+      }
+    >
+      <ActionButton>
+        <div
+          onClick={onClickCopy}
+          onMouseLeave={onMouseLeave}
+        >
+          {isCopied && <RiClipboardFill className='h-4 w-4' />}
+          {!isCopied && <RiClipboardLine className='h-4 w-4' />}
+        </div>
+      </ActionButton>
+    </Tooltip>
+  )
+}
+
+export default CopyFeedback
+
+export const CopyFeedbackNew = ({ content, className }: Pick<Props, 'className' | 'content'>) => {
+  const { t } = useTranslation()
+  const [isCopied, setIsCopied] = useState<boolean>(false)
+
+  const onClickCopy = debounce(() => {
+    copy(content)
+    setIsCopied(true)
+  }, 100)
+
+  const onMouseLeave = debounce(() => {
+    setIsCopied(false)
+  }, 100)
+
+  return (
+    <Tooltip
+      popupContent={
+        (isCopied
+          ? t(`${prefixEmbedded}.copied`)
+          : t(`${prefixEmbedded}.copy`)) || ''
+      }
+    >
+      <div
+        className={`h-8 w-8 cursor-pointer rounded-lg hover:bg-components-button-ghost-bg-hover ${className ?? ''
+        }`}
+      >
+        <div
+          onClick={onClickCopy}
+          onMouseLeave={onMouseLeave}
+          className={`h-full w-full ${copyStyle.copyIcon} ${isCopied ? copyStyle.copied : ''
+          }`}
+        ></div>
+      </div>
+    </Tooltip>
+  )
+}
diff --git a/app/components/base/copy-feedback/style.module.css b/app/components/base/copy-feedback/style.module.css
new file mode 100644
index 0000000..83625d6
--- /dev/null
+++ b/app/components/base/copy-feedback/style.module.css
@@ -0,0 +1,15 @@
+.copyIcon {
+  background-image: url(~@/app/components/develop/secret-key/assets/copy.svg);
+  background-position: center;
+  background-repeat: no-repeat;
+}
+
+.copyIcon:hover {
+  background-image: url(~@/app/components/develop/secret-key/assets/copy-hover.svg);
+  background-position: center;
+  background-repeat: no-repeat;
+}
+
+.copyIcon.copied {
+  background-image: url(~@/app/components/develop/secret-key/assets/copied.svg);
+}
diff --git a/app/components/base/copy-icon/index.tsx b/app/components/base/copy-icon/index.tsx
new file mode 100644
index 0000000..c9e8a5a
--- /dev/null
+++ b/app/components/base/copy-icon/index.tsx
@@ -0,0 +1,53 @@
+'use client'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { debounce } from 'lodash-es'
+import copy from 'copy-to-clipboard'
+import Tooltip from '../tooltip'
+import {
+  Clipboard,
+  ClipboardCheck,
+} from '@/app/components/base/icons/src/vender/line/files'
+
+type Props = {
+  content: string
+}
+
+const prefixEmbedded = 'appOverview.overview.appInfo.embedded'
+
+export const CopyIcon = ({ content }: Props) => {
+  const { t } = useTranslation()
+  const [isCopied, setIsCopied] = useState<boolean>(false)
+
+  const onClickCopy = debounce(() => {
+    copy(content)
+    setIsCopied(true)
+  }, 100)
+
+  const onMouseLeave = debounce(() => {
+    setIsCopied(false)
+  }, 100)
+
+  return (
+    <Tooltip
+      popupContent={
+        (isCopied
+          ? t(`${prefixEmbedded}.copied`)
+          : t(`${prefixEmbedded}.copy`)) || ''
+      }
+    >
+      <div onMouseLeave={onMouseLeave}>
+        {!isCopied
+          ? (
+            <Clipboard className='mx-1 h-3.5 w-3.5 cursor-pointer text-text-tertiary' onClick={onClickCopy} />
+          )
+          : (
+            <ClipboardCheck className='mx-1 h-3.5 w-3.5 text-text-tertiary' />
+          )
+        }
+      </div>
+    </Tooltip>
+  )
+}
+
+export default CopyIcon
diff --git a/app/components/base/corner-label/index.tsx b/app/components/base/corner-label/index.tsx
new file mode 100644
index 0000000..9e192ed
--- /dev/null
+++ b/app/components/base/corner-label/index.tsx
@@ -0,0 +1,21 @@
+import { Corner } from '../icons/src/vender/solid/shapes'
+import cn from '@/utils/classnames'
+
+type CornerLabelProps = {
+  label: string
+  className?: string
+  labelClassName?: string
+}
+
+const CornerLabel: React.FC<CornerLabelProps> = ({ label, className, labelClassName }) => {
+  return (
+    <div className={cn('group/corner-label inline-flex items-start', className)}>
+      <Corner className='h-5 w-[13px] text-background-section group-hover/corner-label:text-background-section-burn' />
+      <div className={cn('flex items-center gap-0.5 bg-background-section py-1 pr-2 group-hover/corner-label:bg-background-section-burn', labelClassName)}>
+        <div className='system-2xs-medium-uppercase text-text-tertiary'>{label}</div>
+      </div>
+    </div>
+  )
+}
+
+export default CornerLabel
diff --git a/app/components/base/custom-icon/index.tsx b/app/components/base/custom-icon/index.tsx
new file mode 100644
index 0000000..c3afee9
--- /dev/null
+++ b/app/components/base/custom-icon/index.tsx
@@ -0,0 +1,16 @@
+import type { FC } from 'react'
+import React from 'react'
+
+type IconProps = {
+  icon: any
+  className?: string
+  [key: string]: any
+}
+
+const Icon: FC<IconProps> = ({ icon, className, ...other }) => {
+  return (
+    <img src={icon} className={`h-3 w-3 ${className}`} {...other} alt="icon" />
+  )
+}
+
+export default Icon
diff --git a/app/components/base/date-and-time-picker/calendar/days-of-week.tsx b/app/components/base/date-and-time-picker/calendar/days-of-week.tsx
new file mode 100644
index 0000000..f7a59f2
--- /dev/null
+++ b/app/components/base/date-and-time-picker/calendar/days-of-week.tsx
@@ -0,0 +1,21 @@
+import React from 'react'
+import { useDaysOfWeek } from '../hooks'
+
+export const DaysOfWeek = () => {
+  const daysOfWeek = useDaysOfWeek()
+
+  return (
+    <div className='grid grid-cols-7 gap-x-0.5 border-b-[0.5px] border-divider-regular p-2'>
+      {daysOfWeek.map(day => (
+        <div
+          key={day}
+          className='system-2xs-medium flex items-center justify-center text-text-tertiary'
+        >
+          {day}
+        </div>
+      ))}
+    </div>
+  )
+}
+
+export default React.memo(DaysOfWeek)
diff --git a/app/components/base/date-and-time-picker/calendar/index.tsx b/app/components/base/date-and-time-picker/calendar/index.tsx
new file mode 100644
index 0000000..00612fc
--- /dev/null
+++ b/app/components/base/date-and-time-picker/calendar/index.tsx
@@ -0,0 +1,27 @@
+import type { FC } from 'react'
+import type { CalendarProps } from '../types'
+import { DaysOfWeek } from './days-of-week'
+import CalendarItem from './item'
+
+const Calendar: FC<CalendarProps> = ({
+  days,
+  selectedDate,
+  onDateClick,
+  wrapperClassName,
+}) => {
+  return <div className={wrapperClassName}>
+    <DaysOfWeek/>
+    <div className='grid grid-cols-7 gap-0.5 p-2'>
+      {
+        days.map(day => <CalendarItem
+          key={day.date.format('YYYY-MM-DD')}
+          day={day}
+          selectedDate={selectedDate}
+          onClick={onDateClick}
+        />)
+      }
+    </div>
+  </div>
+}
+
+export default Calendar
diff --git a/app/components/base/date-and-time-picker/calendar/item.tsx b/app/components/base/date-and-time-picker/calendar/item.tsx
new file mode 100644
index 0000000..20e0b84
--- /dev/null
+++ b/app/components/base/date-and-time-picker/calendar/item.tsx
@@ -0,0 +1,30 @@
+import React, { type FC } from 'react'
+import type { CalendarItemProps } from '../types'
+import cn from '@/utils/classnames'
+import dayjs from '../utils/dayjs'
+
+const Item: FC<CalendarItemProps> = ({
+  day,
+  selectedDate,
+  onClick,
+}) => {
+  const { date, isCurrentMonth } = day
+  const isSelected = selectedDate?.isSame(date, 'date')
+  const isToday = date.isSame(dayjs(), 'date')
+
+  return (
+    <button
+      onClick={() => onClick(date)}
+      className={cn(
+        'system-sm-medium relative flex items-center justify-center rounded-lg px-1 py-2',
+        isCurrentMonth ? 'text-text-secondary' : 'text-text-quaternary hover:text-text-secondary',
+        isSelected ? 'system-sm-medium bg-components-button-primary-bg text-components-button-primary-text' : 'hover:bg-state-base-hover',
+      )}
+    >
+      {date.date()}
+      {isToday && <div className='absolute bottom-1 mx-auto h-1 w-1 rounded-full bg-components-button-primary-bg' />}
+    </button>
+  )
+}
+
+export default React.memo(Item)
diff --git a/app/components/base/date-and-time-picker/common/option-list-item.tsx b/app/components/base/date-and-time-picker/common/option-list-item.tsx
new file mode 100644
index 0000000..d11a6e9
--- /dev/null
+++ b/app/components/base/date-and-time-picker/common/option-list-item.tsx
@@ -0,0 +1,38 @@
+import React, { type FC, useEffect, useRef } from 'react'
+import cn from '@/utils/classnames'
+
+type OptionListItemProps = {
+  isSelected: boolean
+  onClick: () => void
+} & React.LiHTMLAttributes<HTMLLIElement>
+
+const OptionListItem: FC<OptionListItemProps> = ({
+  isSelected,
+  onClick,
+  children,
+}) => {
+  const listItemRef = useRef<HTMLLIElement>(null)
+
+  useEffect(() => {
+    if (isSelected)
+      listItemRef.current?.scrollIntoView({ behavior: 'instant' })
+  }, [])
+
+  return (
+    <li
+      ref={listItemRef}
+      className={cn(
+        'system-xs-medium flex cursor-pointer items-center justify-center rounded-md px-1.5 py-1 text-components-button-ghost-text',
+        isSelected ? 'bg-components-button-ghost-bg-hover' : 'hover:bg-components-button-ghost-bg-hover',
+      )}
+      onClick={() => {
+        listItemRef.current?.scrollIntoView({ behavior: 'smooth' })
+        onClick()
+      }}
+    >
+      {children}
+    </li>
+  )
+}
+
+export default React.memo(OptionListItem)
diff --git a/app/components/base/date-and-time-picker/date-picker/footer.tsx b/app/components/base/date-and-time-picker/date-picker/footer.tsx
new file mode 100644
index 0000000..6351a82
--- /dev/null
+++ b/app/components/base/date-and-time-picker/date-picker/footer.tsx
@@ -0,0 +1,59 @@
+import React, { type FC } from 'react'
+import Button from '../../button'
+import { type DatePickerFooterProps, ViewType } from '../types'
+import { RiTimeLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import { useTranslation } from 'react-i18next'
+
+const Footer: FC<DatePickerFooterProps> = ({
+  needTimePicker,
+  displayTime,
+  view,
+  handleClickTimePicker,
+  handleSelectCurrentDate,
+  handleConfirmDate,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className={cn(
+      'flex items-center justify-between border-t-[0.5px] border-divider-regular p-2',
+      !needTimePicker && 'justify-end',
+    )}>
+      {/* Time Picker */}
+      {needTimePicker && (
+        <button
+          type='button'
+          className='system-xs-medium flex items-center gap-x-[1px] rounded-md border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-1.5
+                      py-1 text-components-button-secondary-accent-text shadow-xs shadow-shadow-shadow-3 backdrop-blur-[5px]'
+          onClick={handleClickTimePicker}
+        >
+          <RiTimeLine className='h-3.5 w-3.5' />
+          {view === ViewType.date && <span>{displayTime}</span>}
+          {view === ViewType.time && <span>{t('time.operation.pickDate')}</span>}
+        </button>
+      )}
+      <div className='flex items-center gap-x-1'>
+        {/* Now */}
+        <button
+          type='button'
+          className='system-xs-medium flex items-center justify-center px-1.5 py-1 text-components-button-secondary-accent-text'
+          onClick={handleSelectCurrentDate}
+        >
+          <span className='px-[3px]'>{t('time.operation.now')}</span>
+        </button>
+        {/* Confirm Button */}
+        <Button
+          variant='primary'
+          size='small'
+          className='w-16 px-1.5 py-1'
+          onClick={handleConfirmDate}
+        >
+          {t('time.operation.ok')}
+        </Button>
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Footer)
diff --git a/app/components/base/date-and-time-picker/date-picker/header.tsx b/app/components/base/date-and-time-picker/date-picker/header.tsx
new file mode 100644
index 0000000..2631cdb
--- /dev/null
+++ b/app/components/base/date-and-time-picker/date-picker/header.tsx
@@ -0,0 +1,41 @@
+import React, { type FC } from 'react'
+import { RiArrowDownSLine, RiArrowUpSLine } from '@remixicon/react'
+import type { DatePickerHeaderProps } from '../types'
+import { useMonths } from '../hooks'
+
+const Header: FC<DatePickerHeaderProps> = ({
+  handleOpenYearMonthPicker,
+  currentDate,
+  onClickNextMonth,
+  onClickPrevMonth,
+}) => {
+  const months = useMonths()
+
+  return (
+    <div className='mx-2 mt-2 flex items-center'>
+      <div className='flex-1'>
+        <button
+          onClick={handleOpenYearMonthPicker}
+          className='system-md-semibold flex items-center gap-x-0.5 rounded-lg px-2 py-1.5 text-text-primary hover:bg-state-base-hover'
+        >
+          <span>{`${months[currentDate.month()]} ${currentDate.year()}`}</span>
+          <RiArrowDownSLine className='h-4 w-4 text-text-tertiary' />
+        </button>
+      </div>
+      <button
+        onClick={onClickPrevMonth}
+        className='rounded-lg p-1.5 hover:bg-state-base-hover'
+      >
+        <RiArrowUpSLine className='h-[18px] w-[18px] text-text-secondary' />
+      </button>
+      <button
+        onClick={onClickNextMonth}
+        className='rounded-lg p-1.5 hover:bg-state-base-hover'
+      >
+        <RiArrowDownSLine className='h-[18px] w-[18px] text-text-secondary' />
+      </button>
+    </div>
+  )
+}
+
+export default React.memo(Header)
diff --git a/app/components/base/date-and-time-picker/date-picker/index.tsx b/app/components/base/date-and-time-picker/date-picker/index.tsx
new file mode 100644
index 0000000..f4fc861
--- /dev/null
+++ b/app/components/base/date-and-time-picker/date-picker/index.tsx
@@ -0,0 +1,309 @@
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import { RiCalendarLine, RiCloseCircleFill } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import type { DatePickerProps, Period } from '../types'
+import { ViewType } from '../types'
+import type { Dayjs } from 'dayjs'
+import dayjs, {
+  clearMonthMapCache,
+  cloneTime,
+  getDateWithTimezone,
+  getDaysInMonth,
+  getHourIn12Hour,
+} from '../utils/dayjs'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import DatePickerHeader from './header'
+import Calendar from '../calendar'
+import DatePickerFooter from './footer'
+import YearAndMonthPickerHeader from '../year-and-month-picker/header'
+import YearAndMonthPickerOptions from '../year-and-month-picker/options'
+import YearAndMonthPickerFooter from '../year-and-month-picker/footer'
+import TimePickerHeader from '../time-picker/header'
+import TimePickerOptions from '../time-picker/options'
+import { useTranslation } from 'react-i18next'
+
+const DatePicker = ({
+  value,
+  timezone,
+  onChange,
+  onClear,
+  placeholder,
+  needTimePicker = true,
+  renderTrigger,
+  triggerWrapClassName,
+  popupZIndexClassname = 'z-[11]',
+}: DatePickerProps) => {
+  const { t } = useTranslation()
+  const [isOpen, setIsOpen] = useState(false)
+  const [view, setView] = useState(ViewType.date)
+  const containerRef = useRef<HTMLDivElement>(null)
+  const isInitial = useRef(true)
+  const inputValue = useRef(value ? value.tz(timezone) : undefined).current
+  const defaultValue = useRef(getDateWithTimezone({ timezone })).current
+
+  const [currentDate, setCurrentDate] = useState(inputValue || defaultValue)
+  const [selectedDate, setSelectedDate] = useState(inputValue)
+
+  const [selectedMonth, setSelectedMonth] = useState((inputValue || defaultValue).month())
+  const [selectedYear, setSelectedYear] = useState((inputValue || defaultValue).year())
+
+  useEffect(() => {
+    const handleClickOutside = (event: MouseEvent) => {
+      if (containerRef.current && !containerRef.current.contains(event.target as Node)) {
+        setIsOpen(false)
+        setView(ViewType.date)
+      }
+    }
+    document.addEventListener('mousedown', handleClickOutside)
+    return () => document.removeEventListener('mousedown', handleClickOutside)
+  }, [])
+
+  useEffect(() => {
+    if (isInitial.current) {
+      isInitial.current = false
+      return
+    }
+    clearMonthMapCache()
+    if (value) {
+      const newValue = getDateWithTimezone({ date: value, timezone })
+      setCurrentDate(newValue)
+      setSelectedDate(newValue)
+      onChange(newValue)
+    }
+    else {
+      setCurrentDate(prev => getDateWithTimezone({ date: prev, timezone }))
+      setSelectedDate(prev => prev ? getDateWithTimezone({ date: prev, timezone }) : undefined)
+    }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [timezone])
+
+  const handleClickTrigger = (e: React.MouseEvent) => {
+    e.stopPropagation()
+    if (isOpen) {
+      setIsOpen(false)
+      return
+    }
+    setView(ViewType.date)
+    setIsOpen(true)
+    if (value) {
+      setCurrentDate(value)
+      setSelectedDate(value)
+    }
+  }
+
+  const handleClear = (e: React.MouseEvent) => {
+    e.stopPropagation()
+    setSelectedDate(undefined)
+    if (!isOpen)
+      onClear()
+  }
+
+  const days = useMemo(() => {
+    return getDaysInMonth(currentDate)
+  }, [currentDate])
+
+  const handleClickNextMonth = useCallback(() => {
+    setCurrentDate(currentDate.clone().add(1, 'month'))
+  }, [currentDate])
+
+  const handleClickPrevMonth = useCallback(() => {
+    setCurrentDate(currentDate.clone().subtract(1, 'month'))
+  }, [currentDate])
+
+  const handleDateSelect = useCallback((day: Dayjs) => {
+    const newDate = cloneTime(day, selectedDate || getDateWithTimezone({ timezone }))
+    setCurrentDate(newDate)
+    setSelectedDate(newDate)
+  }, [selectedDate, timezone])
+
+  const handleSelectCurrentDate = () => {
+    const newDate = getDateWithTimezone({ timezone })
+    setCurrentDate(newDate)
+    setSelectedDate(newDate)
+    onChange(newDate)
+    setIsOpen(false)
+  }
+
+  const handleConfirmDate = () => {
+    // debugger
+    onChange(selectedDate ? selectedDate.tz(timezone) : undefined)
+    setIsOpen(false)
+  }
+
+  const handleClickTimePicker = () => {
+    if (view === ViewType.date) {
+      setView(ViewType.time)
+      return
+    }
+    if (view === ViewType.time)
+      setView(ViewType.date)
+  }
+
+  const handleTimeSelect = (hour: string, minute: string, period: Period) => {
+    const newTime = cloneTime(dayjs(), dayjs(`1/1/2000 ${hour}:${minute} ${period}`))
+    setSelectedDate((prev) => {
+      return prev ? cloneTime(prev, newTime) : newTime
+    })
+  }
+
+  const handleSelectHour = useCallback((hour: string) => {
+    const selectedTime = selectedDate || getDateWithTimezone({ timezone })
+    handleTimeSelect(hour, selectedTime.minute().toString().padStart(2, '0'), selectedTime.format('A') as Period)
+  }, [selectedDate, timezone])
+
+  const handleSelectMinute = useCallback((minute: string) => {
+    const selectedTime = selectedDate || getDateWithTimezone({ timezone })
+    handleTimeSelect(getHourIn12Hour(selectedTime).toString().padStart(2, '0'), minute, selectedTime.format('A') as Period)
+  }, [selectedDate, timezone])
+
+  const handleSelectPeriod = useCallback((period: Period) => {
+    const selectedTime = selectedDate || getDateWithTimezone({ timezone })
+    handleTimeSelect(getHourIn12Hour(selectedTime).toString().padStart(2, '0'), selectedTime.minute().toString().padStart(2, '0'), period)
+  }, [selectedDate, timezone])
+
+  const handleOpenYearMonthPicker = () => {
+    setSelectedMonth(currentDate.month())
+    setSelectedYear(currentDate.year())
+    setView(ViewType.yearMonth)
+  }
+
+  const handleCloseYearMonthPicker = useCallback(() => {
+    setView(ViewType.date)
+  }, [])
+
+  const handleMonthSelect = useCallback((month: number) => {
+    setSelectedMonth(month)
+  }, [])
+
+  const handleYearSelect = useCallback((year: number) => {
+    setSelectedYear(year)
+  }, [])
+
+  const handleYearMonthCancel = useCallback(() => {
+    setView(ViewType.date)
+  }, [])
+
+  const handleYearMonthConfirm = () => {
+    setCurrentDate(prev => prev.clone().month(selectedMonth).year(selectedYear))
+    setView(ViewType.date)
+  }
+
+  const timeFormat = needTimePicker ? 'MMMM D, YYYY hh:mm A' : 'MMMM D, YYYY'
+  const displayValue = value?.format(timeFormat) || ''
+  const displayTime = selectedDate?.format('hh:mm A') || '--:-- --'
+  const placeholderDate = isOpen && selectedDate ? selectedDate.format(timeFormat) : (placeholder || t('time.defaultPlaceholder'))
+
+  return (
+    <PortalToFollowElem
+      open={isOpen}
+      onOpenChange={setIsOpen}
+      placement='bottom-end'
+    >
+      <PortalToFollowElemTrigger className={triggerWrapClassName}>
+        {renderTrigger ? (renderTrigger({
+          value,
+          selectedDate,
+          isOpen,
+          handleClear,
+          handleClickTrigger,
+        })) : (
+          <div
+            className='group flex w-[252px] cursor-pointer items-center gap-x-0.5 rounded-lg bg-components-input-bg-normal px-2 py-1 hover:bg-state-base-hover-alt'
+            onClick={handleClickTrigger}
+          >
+            <input
+              className='system-xs-regular flex-1 cursor-pointer appearance-none truncate bg-transparent p-1
+            text-components-input-text-filled outline-none placeholder:text-components-input-text-placeholder'
+              readOnly
+              value={isOpen ? '' : displayValue}
+              placeholder={placeholderDate}
+            />
+            <RiCalendarLine className={cn(
+              'h-4 w-4 shrink-0 text-text-quaternary',
+              isOpen ? 'text-text-secondary' : 'group-hover:text-text-secondary',
+              (displayValue || (isOpen && selectedDate)) && 'group-hover:hidden',
+            )} />
+            <RiCloseCircleFill
+              className={cn(
+                'hidden h-4 w-4 shrink-0 text-text-quaternary',
+                (displayValue || (isOpen && selectedDate)) && 'hover:text-text-secondary group-hover:inline-block',
+              )}
+              onClick={handleClear}
+            />
+          </div>
+        )}
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className={popupZIndexClassname}>
+        <div className='mt-1 w-[252px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-lg shadow-shadow-shadow-5'>
+          {/* Header */}
+          {view === ViewType.date ? (
+            <DatePickerHeader
+              handleOpenYearMonthPicker={handleOpenYearMonthPicker}
+              currentDate={currentDate}
+              onClickNextMonth={handleClickNextMonth}
+              onClickPrevMonth={handleClickPrevMonth}
+            />
+          ) : view === ViewType.yearMonth ? (
+            <YearAndMonthPickerHeader
+              selectedYear={selectedYear}
+              selectedMonth={selectedMonth}
+              onClick={handleCloseYearMonthPicker}
+            />
+          ) : (
+            <TimePickerHeader />
+          )}
+
+          {/* Content */}
+          {
+            view === ViewType.date ? (
+              <Calendar
+                days={days}
+                selectedDate={selectedDate}
+                onDateClick={handleDateSelect}
+              />
+            ) : view === ViewType.yearMonth ? (
+              <YearAndMonthPickerOptions
+                selectedMonth={selectedMonth}
+                selectedYear={selectedYear}
+                handleMonthSelect={handleMonthSelect}
+                handleYearSelect={handleYearSelect}
+              />
+            ) : (
+              <TimePickerOptions
+                selectedTime={selectedDate}
+                handleSelectHour={handleSelectHour}
+                handleSelectMinute={handleSelectMinute}
+                handleSelectPeriod={handleSelectPeriod}
+              />
+            )
+          }
+
+          {/* Footer */}
+          {
+            [ViewType.date, ViewType.time].includes(view) ? (
+              <DatePickerFooter
+                needTimePicker={needTimePicker}
+                displayTime={displayTime}
+                view={view}
+                handleClickTimePicker={handleClickTimePicker}
+                handleSelectCurrentDate={handleSelectCurrentDate}
+                handleConfirmDate={handleConfirmDate}
+              />
+            ) : (
+              <YearAndMonthPickerFooter
+                handleYearMonthCancel={handleYearMonthCancel}
+                handleYearMonthConfirm={handleYearMonthConfirm}
+              />
+            )
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default DatePicker
diff --git a/app/components/base/date-and-time-picker/hooks.ts b/app/components/base/date-and-time-picker/hooks.ts
new file mode 100644
index 0000000..b92a8e2
--- /dev/null
+++ b/app/components/base/date-and-time-picker/hooks.ts
@@ -0,0 +1,49 @@
+import dayjs from './utils/dayjs'
+import { Period } from './types'
+import { useTranslation } from 'react-i18next'
+
+const YEAR_RANGE = 100
+
+export const useDaysOfWeek = () => {
+  const { t } = useTranslation()
+  const daysOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].map(day => t(`time.daysInWeek.${day}`))
+
+  return daysOfWeek
+}
+
+export const useMonths = () => {
+  const { t } = useTranslation()
+  const months = [
+    'January',
+    'February',
+    'March',
+    'April',
+    'May',
+    'June',
+    'July',
+    'August',
+    'September',
+    'October',
+    'November',
+    'December',
+  ].map(month => t(`time.months.${month}`))
+
+  return months
+}
+
+export const useYearOptions = () => {
+  const yearOptions = Array.from({ length: 200 }, (_, i) => dayjs().year() - YEAR_RANGE / 2 + i)
+  return yearOptions
+}
+
+export const useTimeOptions = () => {
+  const hourOptions = Array.from({ length: 12 }, (_, i) => (i + 1).toString().padStart(2, '0'))
+  const minuteOptions = Array.from({ length: 60 }, (_, i) => i.toString().padStart(2, '0'))
+  const periodOptions = [Period.AM, Period.PM]
+
+  return {
+    hourOptions,
+    minuteOptions,
+    periodOptions,
+  }
+}
diff --git a/app/components/base/date-and-time-picker/time-picker/footer.tsx b/app/components/base/date-and-time-picker/time-picker/footer.tsx
new file mode 100644
index 0000000..47dd8b1
--- /dev/null
+++ b/app/components/base/date-and-time-picker/time-picker/footer.tsx
@@ -0,0 +1,37 @@
+import React, { type FC } from 'react'
+import type { TimePickerFooterProps } from '../types'
+import Button from '../../button'
+import { useTranslation } from 'react-i18next'
+
+const Footer: FC<TimePickerFooterProps> = ({
+  handleSelectCurrentTime,
+  handleConfirm,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex items-center justify-end border-t-[0.5px] border-divider-regular p-2'>
+      <div className='flex items-center gap-x-1'>
+        {/* Now */}
+        <button
+          type='button'
+          className='system-xs-medium flex items-center justify-center px-1.5 py-1 text-components-button-secondary-accent-text'
+          onClick={handleSelectCurrentTime}
+        >
+          <span className='px-[3px]'>{t('time.operation.now')}</span>
+        </button>
+        {/* Confirm Button */}
+        <Button
+          variant='primary'
+          size='small'
+          className='w-16 px-1.5 py-1'
+          onClick={handleConfirm.bind(null)}
+        >
+          {t('time.operation.ok')}
+        </Button>
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Footer)
diff --git a/app/components/base/date-and-time-picker/time-picker/header.tsx b/app/components/base/date-and-time-picker/time-picker/header.tsx
new file mode 100644
index 0000000..3d85b2e
--- /dev/null
+++ b/app/components/base/date-and-time-picker/time-picker/header.tsx
@@ -0,0 +1,16 @@
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+
+const Header = () => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex flex-col border-b-[0.5px] border-divider-regular'>
+      <div className='system-md-semibold flex items-center px-2 py-1.5 text-text-primary'>
+        {t('time.title.pickTime')}
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Header)
diff --git a/app/components/base/date-and-time-picker/time-picker/index.tsx b/app/components/base/date-and-time-picker/time-picker/index.tsx
new file mode 100644
index 0000000..a5e666d
--- /dev/null
+++ b/app/components/base/date-and-time-picker/time-picker/index.tsx
@@ -0,0 +1,170 @@
+import React, { useCallback, useEffect, useRef, useState } from 'react'
+import type { Period, TimePickerProps } from '../types'
+import dayjs, { cloneTime, getDateWithTimezone, getHourIn12Hour } from '../utils/dayjs'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Footer from './footer'
+import Options from './options'
+import Header from './header'
+import { useTranslation } from 'react-i18next'
+import { RiCloseCircleFill, RiTimeLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+
+const TimePicker = ({
+  value,
+  timezone,
+  placeholder,
+  onChange,
+  onClear,
+  renderTrigger,
+}: TimePickerProps) => {
+  const { t } = useTranslation()
+  const [isOpen, setIsOpen] = useState(false)
+  const containerRef = useRef<HTMLDivElement>(null)
+  const isInitial = useRef(true)
+  const [selectedTime, setSelectedTime] = useState(value ? getDateWithTimezone({ timezone, date: value }) : undefined)
+
+  useEffect(() => {
+    const handleClickOutside = (event: MouseEvent) => {
+      if (containerRef.current && !containerRef.current.contains(event.target as Node))
+        setIsOpen(false)
+    }
+    document.addEventListener('mousedown', handleClickOutside)
+    return () => document.removeEventListener('mousedown', handleClickOutside)
+  }, [])
+
+  useEffect(() => {
+    if (isInitial.current) {
+      isInitial.current = false
+      return
+    }
+    if (value) {
+      const newValue = getDateWithTimezone({ date: value, timezone })
+      setSelectedTime(newValue)
+      onChange(newValue)
+    }
+    else {
+      setSelectedTime(prev => prev ? getDateWithTimezone({ date: prev, timezone }) : undefined)
+    }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [timezone])
+
+  const handleClickTrigger = (e: React.MouseEvent) => {
+    e.stopPropagation()
+    if (isOpen) {
+      setIsOpen(false)
+      return
+    }
+    setIsOpen(true)
+    if (value)
+      setSelectedTime(value)
+  }
+
+  const handleClear = (e: React.MouseEvent) => {
+    e.stopPropagation()
+    setSelectedTime(undefined)
+    if (!isOpen)
+      onClear()
+  }
+
+  const handleTimeSelect = (hour: string, minute: string, period: Period) => {
+    const newTime = cloneTime(dayjs(), dayjs(`1/1/2000 ${hour}:${minute} ${period}`))
+    setSelectedTime((prev) => {
+      return prev ? cloneTime(prev, newTime) : newTime
+    })
+  }
+
+  const handleSelectHour = useCallback((hour: string) => {
+    const time = selectedTime || dayjs().startOf('day')
+    handleTimeSelect(hour, time.minute().toString().padStart(2, '0'), time.format('A') as Period)
+  }, [selectedTime])
+
+  const handleSelectMinute = useCallback((minute: string) => {
+    const time = selectedTime || dayjs().startOf('day')
+    handleTimeSelect(getHourIn12Hour(time).toString().padStart(2, '0'), minute, time.format('A') as Period)
+  }, [selectedTime])
+
+  const handleSelectPeriod = useCallback((period: Period) => {
+    const time = selectedTime || dayjs().startOf('day')
+    handleTimeSelect(getHourIn12Hour(time).toString().padStart(2, '0'), time.minute().toString().padStart(2, '0'), period)
+  }, [selectedTime])
+
+  const handleSelectCurrentTime = useCallback(() => {
+    const newDate = getDateWithTimezone({ timezone })
+    setSelectedTime(newDate)
+    onChange(newDate)
+    setIsOpen(false)
+  }, [onChange, timezone])
+
+  const handleConfirm = useCallback(() => {
+    onChange(selectedTime)
+    setIsOpen(false)
+  }, [onChange, selectedTime])
+
+  const timeFormat = 'hh:mm A'
+  const displayValue = value?.format(timeFormat) || ''
+  const placeholderDate = isOpen && selectedTime ? selectedTime.format(timeFormat) : (placeholder || t('time.defaultPlaceholder'))
+
+  return (
+    <PortalToFollowElem
+      open={isOpen}
+      onOpenChange={setIsOpen}
+      placement='bottom-end'
+    >
+      <PortalToFollowElemTrigger>
+        {renderTrigger ? (renderTrigger()) : (
+          <div
+            className='group flex w-[252px] cursor-pointer items-center gap-x-0.5 rounded-lg bg-components-input-bg-normal px-2 py-1 hover:bg-state-base-hover-alt'
+            onClick={handleClickTrigger}
+          >
+            <input
+              className='system-xs-regular flex-1 cursor-pointer appearance-none truncate bg-transparent p-1
+            text-components-input-text-filled outline-none placeholder:text-components-input-text-placeholder'
+              readOnly
+              value={isOpen ? '' : displayValue}
+              placeholder={placeholderDate}
+            />
+            <RiTimeLine className={cn(
+              'h-4 w-4 shrink-0 text-text-quaternary',
+              isOpen ? 'text-text-secondary' : 'group-hover:text-text-secondary',
+              (displayValue || (isOpen && selectedTime)) && 'group-hover:hidden',
+            )} />
+            <RiCloseCircleFill
+              className={cn(
+                'hidden h-4 w-4 shrink-0 text-text-quaternary',
+                (displayValue || (isOpen && selectedTime)) && 'hover:text-text-secondary group-hover:inline-block',
+              )}
+              onClick={handleClear}
+            />
+          </div>
+        )}
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-50'>
+        <div className='mt-1 w-[252px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-lg shadow-shadow-shadow-5'>
+          {/* Header */}
+          <Header />
+
+          {/* Time Options */}
+          <Options
+            selectedTime={selectedTime}
+            handleSelectHour={handleSelectHour}
+            handleSelectMinute={handleSelectMinute}
+            handleSelectPeriod={handleSelectPeriod}
+          />
+
+          {/* Footer */}
+          <Footer
+            handleSelectCurrentTime={handleSelectCurrentTime}
+            handleConfirm={handleConfirm}
+          />
+
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default TimePicker
diff --git a/app/components/base/date-and-time-picker/time-picker/options.tsx b/app/components/base/date-and-time-picker/time-picker/options.tsx
new file mode 100644
index 0000000..887f6f4
--- /dev/null
+++ b/app/components/base/date-and-time-picker/time-picker/options.tsx
@@ -0,0 +1,71 @@
+import React, { type FC } from 'react'
+import { useTimeOptions } from '../hooks'
+import type { TimeOptionsProps } from '../types'
+import OptionListItem from '../common/option-list-item'
+
+const Options: FC<TimeOptionsProps> = ({
+  selectedTime,
+  handleSelectHour,
+  handleSelectMinute,
+  handleSelectPeriod,
+}) => {
+  const { hourOptions, minuteOptions, periodOptions } = useTimeOptions()
+
+  return (
+    <div className='grid grid-cols-3 gap-x-1 p-2'>
+      {/* Hour */}
+      <ul className='no-scrollbar flex h-[208px] flex-col gap-y-0.5 overflow-y-auto pb-[184px]'>
+        {
+          hourOptions.map((hour) => {
+            const isSelected = selectedTime?.format('hh') === hour
+            return (
+              <OptionListItem
+                key={hour}
+                isSelected={isSelected}
+                onClick={handleSelectHour.bind(null, hour)}
+              >
+                {hour}
+              </OptionListItem>
+            )
+          })
+        }
+      </ul>
+      {/* Minute */}
+      <ul className='no-scrollbar flex h-[208px] flex-col gap-y-0.5 overflow-y-auto pb-[184px]'>
+        {
+          minuteOptions.map((minute) => {
+            const isSelected = selectedTime?.format('mm') === minute
+            return (
+              <OptionListItem
+                key={minute}
+                isSelected={isSelected}
+                onClick={handleSelectMinute.bind(null, minute)}
+              >
+                {minute}
+              </OptionListItem>
+            )
+          })
+        }
+      </ul>
+      {/* Period */}
+      <ul className='no-scrollbar flex h-[208px] flex-col gap-y-0.5 overflow-y-auto pb-[184px]'>
+        {
+          periodOptions.map((period) => {
+            const isSelected = selectedTime?.format('A') === period
+            return (
+              <OptionListItem
+                key={period}
+                isSelected={isSelected}
+                onClick={handleSelectPeriod.bind(null, period)}
+              >
+                {period}
+              </OptionListItem>
+            )
+          })
+        }
+      </ul>
+    </div>
+  )
+}
+
+export default React.memo(Options)
diff --git a/app/components/base/date-and-time-picker/types.ts b/app/components/base/date-and-time-picker/types.ts
new file mode 100644
index 0000000..214c0f0
--- /dev/null
+++ b/app/components/base/date-and-time-picker/types.ts
@@ -0,0 +1,105 @@
+import type { Dayjs } from 'dayjs'
+
+export enum ViewType {
+  date = 'date',
+  yearMonth = 'yearMonth',
+  time = 'time',
+}
+
+export enum Period {
+  AM = 'AM',
+  PM = 'PM',
+}
+
+export type TriggerProps = {
+  value: Dayjs | undefined
+  selectedDate: Dayjs | undefined
+  isOpen: boolean
+  handleClear: (e: React.MouseEvent) => void
+  handleClickTrigger: (e: React.MouseEvent) => void
+}
+
+export type DatePickerProps = {
+  value: Dayjs | undefined
+  timezone?: string
+  placeholder?: string
+  needTimePicker?: boolean
+  onChange: (date: Dayjs | undefined) => void
+  onClear: () => void
+  triggerWrapClassName?: string
+  renderTrigger?: (props: TriggerProps) => React.ReactNode
+  popupZIndexClassname?: string
+}
+
+export type DatePickerHeaderProps = {
+  handleOpenYearMonthPicker: () => void
+  currentDate: Dayjs
+  onClickNextMonth: () => void
+  onClickPrevMonth: () => void
+}
+
+export type DatePickerFooterProps = {
+  needTimePicker: boolean
+  displayTime: string
+  view: ViewType
+  handleClickTimePicker: () => void
+  handleSelectCurrentDate: () => void
+  handleConfirmDate: () => void
+}
+
+export type TimePickerProps = {
+  value: Dayjs | undefined
+  timezone?: string
+  placeholder?: string
+  onChange: (date: Dayjs | undefined) => void
+  onClear: () => void
+  renderTrigger?: () => React.ReactNode
+}
+
+export type TimePickerFooterProps = {
+  handleSelectCurrentTime: () => void
+  handleConfirm: () => void
+}
+
+export type Day = {
+  date: Dayjs
+  isCurrentMonth: boolean
+}
+
+export type CalendarProps = {
+  days: Day[]
+  selectedDate: Dayjs | undefined
+  onDateClick: (date: Dayjs) => void
+  wrapperClassName?: string
+}
+
+export type CalendarItemProps = {
+  day: Day
+  selectedDate: Dayjs | undefined
+  onClick: (date: Dayjs) => void
+}
+
+export type TimeOptionsProps = {
+  selectedTime: Dayjs | undefined
+  handleSelectHour: (hour: string) => void
+  handleSelectMinute: (minute: string) => void
+  handleSelectPeriod: (period: Period) => void
+}
+
+export type YearAndMonthPickerHeaderProps = {
+  selectedYear: number
+  selectedMonth: number
+  onClick: () => void
+}
+
+export type YearAndMonthPickerOptionsProps = {
+  selectedYear: number
+  selectedMonth: number
+  handleYearSelect: (year: number) => void
+  handleMonthSelect: (month: number) => void
+}
+
+export type YearAndMonthPickerFooterProps = {
+  handleYearMonthCancel: () => void
+  handleYearMonthConfirm: () => void
+}
diff --git a/app/components/base/date-and-time-picker/utils/dayjs.ts b/app/components/base/date-and-time-picker/utils/dayjs.ts
new file mode 100644
index 0000000..0928fa5
--- /dev/null
+++ b/app/components/base/date-and-time-picker/utils/dayjs.ts
@@ -0,0 +1,80 @@
+import dayjs, { type Dayjs } from 'dayjs'
+import type { Day } from '../types'
+import utc from 'dayjs/plugin/utc'
+import timezone from 'dayjs/plugin/timezone'
+
+dayjs.extend(utc)
+dayjs.extend(timezone)
+
+export default dayjs
+
+const monthMaps: Record<string, Day[]> = {}
+
+export const cloneTime = (targetDate: Dayjs, sourceDate: Dayjs) => {
+  return targetDate.clone()
+    .set('hour', sourceDate.hour())
+    .set('minute', sourceDate.minute())
+}
+
+export const getDaysInMonth = (currentDate: Dayjs) => {
+  const key = currentDate.format('YYYY-MM')
+  // return the cached days
+  if (monthMaps[key])
+    return monthMaps[key]
+
+  const daysInCurrentMonth = currentDate.daysInMonth()
+  const firstDay = currentDate.startOf('month').day()
+  const lastDay = currentDate.endOf('month').day()
+  const lastDayInLastMonth = currentDate.clone().subtract(1, 'month').endOf('month')
+  const firstDayInNextMonth = currentDate.clone().add(1, 'month').startOf('month')
+  const days: Day[] = []
+  const daysInOneWeek = 7
+  const totalLines = 6
+
+  // Add cells for days before the first day of the month
+  for (let i = firstDay - 1; i >= 0; i--) {
+    const date = cloneTime(lastDayInLastMonth.subtract(i, 'day'), currentDate)
+    days.push({
+      date,
+      isCurrentMonth: false,
+    })
+  }
+
+  // Add days of the month
+  for (let i = 1; i <= daysInCurrentMonth; i++) {
+    const date = cloneTime(currentDate.startOf('month').add(i - 1, 'day'), currentDate)
+    days.push({
+      date,
+      isCurrentMonth: true,
+    })
+  }
+
+  // Add cells for days after the last day of the month
+  const totalLinesOfCurrentMonth = Math.ceil((daysInCurrentMonth - ((daysInOneWeek - firstDay) + lastDay + 1)) / 7) + 2
+  const needAdditionalLine = totalLinesOfCurrentMonth < totalLines
+  for (let i = 0; lastDay + i < (needAdditionalLine ? 2 * daysInOneWeek - 1 : daysInOneWeek - 1); i++) {
+    const date = cloneTime(firstDayInNextMonth.add(i, 'day'), currentDate)
+    days.push({
+      date,
+      isCurrentMonth: false,
+    })
+  }
+
+  // cache the days
+  monthMaps[key] = days
+  return days
+}
+
+export const clearMonthMapCache = () => {
+  for (const key in monthMaps)
+    delete monthMaps[key]
+}
+
+export const getHourIn12Hour = (date: Dayjs) => {
+  const hour = date.hour()
+  return hour === 0 ? 12 : hour >= 12 ? hour - 12 : hour
+}
+
+export const getDateWithTimezone = (props: { date?: Dayjs, timezone?: string }) => {
+  return props.date ? dayjs.tz(props.date, props.timezone) : dayjs().tz(props.timezone)
+}
diff --git a/app/components/base/date-and-time-picker/year-and-month-picker/footer.tsx b/app/components/base/date-and-time-picker/year-and-month-picker/footer.tsx
new file mode 100644
index 0000000..8e0566a
--- /dev/null
+++ b/app/components/base/date-and-time-picker/year-and-month-picker/footer.tsx
@@ -0,0 +1,25 @@
+import type { FC } from 'react'
+import React from 'react'
+import Button from '../../button'
+import type { YearAndMonthPickerFooterProps } from '../types'
+import { useTranslation } from 'react-i18next'
+
+const Footer: FC<YearAndMonthPickerFooterProps> = ({
+  handleYearMonthCancel,
+  handleYearMonthConfirm,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='grid grid-cols-2 gap-x-1 p-2'>
+      <Button size='small' onClick={handleYearMonthCancel}>
+        {t('time.operation.cancel')}
+      </Button>
+      <Button variant='primary' size='small' onClick={handleYearMonthConfirm}>
+        {t('time.operation.ok')}
+      </Button>
+    </div>
+  )
+}
+
+export default React.memo(Footer)
diff --git a/app/components/base/date-and-time-picker/year-and-month-picker/header.tsx b/app/components/base/date-and-time-picker/year-and-month-picker/header.tsx
new file mode 100644
index 0000000..63923e6
--- /dev/null
+++ b/app/components/base/date-and-time-picker/year-and-month-picker/header.tsx
@@ -0,0 +1,27 @@
+import React, { type FC } from 'react'
+import type { YearAndMonthPickerHeaderProps } from '../types'
+import { useMonths } from '../hooks'
+import { RiArrowUpSLine } from '@remixicon/react'
+
+const Header: FC<YearAndMonthPickerHeaderProps> = ({
+  selectedYear,
+  selectedMonth,
+  onClick,
+}) => {
+  const months = useMonths()
+
+  return (
+    <div className='flex border-b-[0.5px] border-divider-regular p-2 pb-1'>
+      {/* Year and Month */}
+      <button
+        onClick={onClick}
+        className='system-md-semibold flex items-center gap-x-0.5 rounded-lg px-2 py-1.5 text-text-primary hover:bg-state-base-hover'
+      >
+        <span>{`${months[selectedMonth]} ${selectedYear}`}</span>
+        <RiArrowUpSLine className='h-4 w-4 text-text-tertiary' />
+      </button>
+    </div>
+  )
+}
+
+export default React.memo(Header)
diff --git a/app/components/base/date-and-time-picker/year-and-month-picker/options.tsx b/app/components/base/date-and-time-picker/year-and-month-picker/options.tsx
new file mode 100644
index 0000000..684db79
--- /dev/null
+++ b/app/components/base/date-and-time-picker/year-and-month-picker/options.tsx
@@ -0,0 +1,55 @@
+import React, { type FC } from 'react'
+import type { YearAndMonthPickerOptionsProps } from '../types'
+import { useMonths, useYearOptions } from '../hooks'
+import OptionListItem from '../common/option-list-item'
+
+const Options: FC<YearAndMonthPickerOptionsProps> = ({
+  selectedMonth,
+  selectedYear,
+  handleMonthSelect,
+  handleYearSelect,
+}) => {
+  const months = useMonths()
+  const yearOptions = useYearOptions()
+
+  return (
+    <div className='grid grid-cols-2 gap-x-1 p-2'>
+      {/* Month Picker */}
+      <ul className='no-scrollbar flex h-[208px] flex-col gap-y-0.5 overflow-y-auto pb-[184px]'>
+        {
+          months.map((month, index) => {
+            const isSelected = selectedMonth === index
+            return (
+              <OptionListItem
+                key={month}
+                isSelected={isSelected}
+                onClick={handleMonthSelect.bind(null, index)}
+              >
+                {month}
+              </OptionListItem>
+            )
+          })
+        }
+      </ul>
+      {/* Year Picker */}
+      <ul className='no-scrollbar flex h-[208px] flex-col gap-y-0.5 overflow-y-auto pb-[184px]'>
+        {
+          yearOptions.map((year) => {
+            const isSelected = selectedYear === year
+            return (
+              <OptionListItem
+                key={year}
+                isSelected={isSelected}
+                onClick={handleYearSelect.bind(null, year)}
+              >
+                {year}
+              </OptionListItem>
+            )
+          })
+        }
+      </ul>
+    </div>
+  )
+}
+
+export default React.memo(Options)
diff --git a/app/components/base/dialog/index.tsx b/app/components/base/dialog/index.tsx
new file mode 100644
index 0000000..6eae3bc
--- /dev/null
+++ b/app/components/base/dialog/index.tsx
@@ -0,0 +1,81 @@
+import { Fragment, useCallback } from 'react'
+import type { ElementType, ReactNode } from 'react'
+import { Dialog, DialogPanel, DialogTitle, Transition, TransitionChild } from '@headlessui/react'
+import classNames from '@/utils/classnames'
+
+// https://headlessui.com/react/dialog
+
+type DialogProps = {
+  className?: string
+  titleClassName?: string
+  bodyClassName?: string
+  footerClassName?: string
+  titleAs?: ElementType
+  title?: ReactNode
+  children: ReactNode
+  footer?: ReactNode
+  show: boolean
+  onClose?: () => void
+}
+
+const CustomDialog = ({
+  className,
+  titleClassName,
+  bodyClassName,
+  footerClassName,
+  titleAs,
+  title,
+  children,
+  footer,
+  show,
+  onClose,
+}: DialogProps) => {
+  const close = useCallback(() => onClose?.(), [onClose])
+  return (
+    <Transition appear show={show} as={Fragment}>
+      <Dialog as="div" className="relative z-40" onClose={close}>
+        <TransitionChild>
+          <div className={classNames(
+            'fixed inset-0 bg-background-overlay-backdrop backdrop-blur-[6px]',
+            'duration-300 ease-in data-[closed]:opacity-0',
+            'data-[enter]:opacity-100',
+            'data-[leave]:opacity-0',
+          )} />
+        </TransitionChild>
+
+        <div className="fixed inset-0 overflow-y-auto">
+          <div className="flex min-h-full items-center justify-center">
+            <TransitionChild>
+              <DialogPanel className={classNames(
+                'w-full max-w-[800px] p-6 overflow-hidden transition-all transform bg-components-panel-bg border-[0.5px] border-components-panel-border shadow-xl rounded-2xl',
+                'duration-100 ease-in data-[closed]:opacity-0 data-[closed]:scale-95',
+                'data-[enter]:opacity-100 data-[enter]:scale-100',
+                'data-[leave]:opacity-0 data-[enter]:scale-95',
+                className,
+              )}>
+                {Boolean(title) && (
+                  <DialogTitle
+                    as={titleAs || 'h3'}
+                    className={classNames('pr-8 pb-3 title-2xl-semi-bold text-text-primary', titleClassName)}
+                  >
+                    {title}
+                  </DialogTitle>
+                )}
+                <div className={classNames(bodyClassName)}>
+                  {children}
+                </div>
+                {Boolean(footer) && (
+                  <div className={classNames('flex items-center justify-end gap-2 px-6 pb-6 pt-3', footerClassName)}>
+                    {footer}
+                  </div>
+                )}
+              </DialogPanel>
+            </TransitionChild>
+          </div>
+        </div>
+      </Dialog>
+    </Transition >
+  )
+}
+
+export default CustomDialog
diff --git a/app/components/base/divider/index.spec.tsx b/app/components/base/divider/index.spec.tsx
new file mode 100644
index 0000000..d33bfeb
--- /dev/null
+++ b/app/components/base/divider/index.spec.tsx
@@ -0,0 +1,55 @@
+import { render } from '@testing-library/react'
+import '@testing-library/jest-dom'
+import Divider from './index'
+
+describe('Divider', () => {
+  it('renders with default props', () => {
+    const { container } = render(<Divider />)
+    const divider = container.firstChild as HTMLElement
+    expect(divider).toHaveClass('w-full h-[0.5px] my-2')
+    expect(divider).toHaveClass('bg-divider-regular')
+  })
+
+  it('renders horizontal solid divider correctly', () => {
+    const { container } = render(<Divider type="horizontal" bgStyle="solid" />)
+    const divider = container.firstChild as HTMLElement
+    expect(divider).toHaveClass('w-full h-[0.5px] my-2')
+    expect(divider).toHaveClass('bg-divider-regular')
+  })
+
+  it('renders vertical solid divider correctly', () => {
+    const { container } = render(<Divider type="vertical" bgStyle="solid" />)
+    const divider = container.firstChild as HTMLElement
+    expect(divider).toHaveClass('w-[1px] h-full mx-2')
+    expect(divider).toHaveClass('bg-divider-regular')
+  })
+
+  it('renders horizontal gradient divider correctly', () => {
+    const { container } = render(<Divider type="horizontal" bgStyle="gradient" />)
+    const divider = container.firstChild as HTMLElement
+    expect(divider).toHaveClass('w-full h-[0.5px] my-2')
+    expect(divider).toHaveClass('bg-gradient-to-r from-divider-regular to-background-gradient-mask-transparent')
+  })
+
+  it('renders vertical gradient divider correctly', () => {
+    const { container } = render(<Divider type="vertical" bgStyle="gradient" />)
+    const divider = container.firstChild as HTMLElement
+    expect(divider).toHaveClass('w-[1px] h-full mx-2')
+    expect(divider).toHaveClass('bg-gradient-to-r from-divider-regular to-background-gradient-mask-transparent')
+  })
+
+  it('applies custom className correctly', () => {
+    const customClass = 'test-custom-class'
+    const { container } = render(<Divider className={customClass} />)
+    const divider = container.firstChild as HTMLElement
+    expect(divider).toHaveClass(customClass)
+    expect(divider).toHaveClass('w-full h-[0.5px] my-2')
+  })
+
+  it('applies custom style correctly', () => {
+    const customStyle = { margin: '10px' }
+    const { container } = render(<Divider style={customStyle} />)
+    const divider = container.firstChild as HTMLElement
+    expect(divider).toHaveStyle('margin: 10px')
+  })
+})
diff --git a/app/components/base/divider/index.tsx b/app/components/base/divider/index.tsx
new file mode 100644
index 0000000..6fe16b9
--- /dev/null
+++ b/app/components/base/divider/index.tsx
@@ -0,0 +1,36 @@
+import type { CSSProperties, FC } from 'react'
+import React from 'react'
+import { type VariantProps, cva } from 'class-variance-authority'
+import classNames from '@/utils/classnames'
+
+const dividerVariants = cva('',
+  {
+    variants: {
+      type: {
+        horizontal: 'w-full h-[0.5px] my-2 ',
+        vertical: 'w-[1px] h-full mx-2',
+      },
+      bgStyle: {
+        gradient: 'bg-gradient-to-r from-divider-regular to-background-gradient-mask-transparent',
+        solid: 'bg-divider-regular',
+      },
+    },
+    defaultVariants: {
+      type: 'horizontal',
+      bgStyle: 'solid',
+    },
+  },
+)
+
+export type DividerProps = {
+  className?: string
+  style?: CSSProperties
+} & VariantProps<typeof dividerVariants>
+
+const Divider: FC<DividerProps> = ({ type, bgStyle, className = '', style }) => {
+  return (
+    <div className={classNames(dividerVariants({ type, bgStyle }), className)} style={style}></div>
+  )
+}
+
+export default Divider
diff --git a/app/components/base/divider/with-label.tsx b/app/components/base/divider/with-label.tsx
new file mode 100644
index 0000000..0cd9796
--- /dev/null
+++ b/app/components/base/divider/with-label.tsx
@@ -0,0 +1,23 @@
+import type { FC } from 'react'
+import type { DividerProps } from '.'
+import Divider from '.'
+import classNames from '@/utils/classnames'
+
+export type DividerWithLabelProps = DividerProps & {
+  label: string
+}
+
+export const DividerWithLabel: FC<DividerWithLabelProps> = (props) => {
+  const { label, className, ...rest } = props
+  return <div
+    className="my-2 flex items-center gap-2"
+  >
+    <Divider {...rest} className={classNames('flex-1', className)} />
+    <span className="text-xs text-text-tertiary">
+      {label}
+    </span>
+    <Divider {...rest} className={classNames('flex-1', className)} />
+  </div>
+}
+
+export default DividerWithLabel
diff --git a/app/components/base/drawer-plus/index.tsx b/app/components/base/drawer-plus/index.tsx
new file mode 100644
index 0000000..33a1948
--- /dev/null
+++ b/app/components/base/drawer-plus/index.tsx
@@ -0,0 +1,105 @@
+'use client'
+import type { FC } from 'react'
+import React, { useRef } from 'react'
+import { RiCloseLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import Drawer from '@/app/components/base/drawer'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+
+type Props = {
+  isShow: boolean
+  onHide: () => void
+  dialogClassName?: string
+  dialogBackdropClassName?: string
+  panelClassName?: string
+  maxWidthClassName?: string
+  contentClassName?: string
+  headerClassName?: string
+  height?: number | string
+  title: string | React.JSX.Element
+  titleDescription?: string | React.JSX.Element
+  body: React.JSX.Element
+  foot?: React.JSX.Element
+  isShowMask?: boolean
+  clickOutsideNotOpen?: boolean
+  positionCenter?: boolean
+}
+
+const DrawerPlus: FC<Props> = ({
+  isShow,
+  onHide,
+  dialogClassName = '',
+  dialogBackdropClassName = '',
+  panelClassName = '',
+  maxWidthClassName = '!max-w-[640px]',
+  height = 'calc(100vh - 72px)',
+  contentClassName,
+  headerClassName,
+  title,
+  titleDescription,
+  body,
+  foot,
+  isShowMask,
+  clickOutsideNotOpen = true,
+  positionCenter,
+}) => {
+  const ref = useRef(null)
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+
+  if (!isShow)
+    return null
+
+  return (
+    // clickOutsideNotOpen to fix confirm modal click cause drawer close
+    <Drawer
+      isOpen={isShow}
+      clickOutsideNotOpen={clickOutsideNotOpen}
+      onClose={onHide}
+      footer={null}
+      mask={isMobile || isShowMask}
+      positionCenter={positionCenter}
+      dialogClassName={dialogClassName}
+      dialogBackdropClassName={dialogBackdropClassName}
+      panelClassName={cn('mx-2 mb-3 mt-16 rounded-xl !p-0 sm:mr-2', panelClassName, maxWidthClassName)}
+    >
+      <div
+        className={cn(contentClassName, 'flex w-full flex-col rounded-xl border-[0.5px] border-divider-subtle bg-components-panel-bg shadow-xl')}
+        style={{
+          height,
+        }}
+        ref={ref}
+      >
+        <div className={cn(headerClassName, 'shrink-0 border-b border-divider-subtle py-4')}>
+          <div className='flex h-6 items-center justify-between pl-6 pr-5'>
+            <div className='system-xl-semibold text-text-primary'>
+              {title}
+            </div>
+            <div className='flex items-center'>
+              <div
+                onClick={onHide}
+                className='flex h-6 w-6 cursor-pointer items-center justify-center'
+              >
+                <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+              </div>
+            </div>
+          </div>
+          {titleDescription && (
+            <div className='system-xs-regular pl-6 pr-10 text-text-tertiary'>
+              {titleDescription}
+            </div>
+          )}
+        </div>
+        <div className='grow overflow-y-auto'>
+          {body}
+        </div>
+        {foot && (
+          <div className='shrink-0'>
+            {foot}
+          </div>
+        )}
+      </div>
+    </Drawer>
+  )
+}
+export default React.memo(DrawerPlus)
diff --git a/app/components/base/drawer/index.tsx b/app/components/base/drawer/index.tsx
new file mode 100644
index 0000000..8217caa
--- /dev/null
+++ b/app/components/base/drawer/index.tsx
@@ -0,0 +1,94 @@
+'use client'
+import { Dialog, DialogBackdrop, DialogTitle } from '@headlessui/react'
+import { useTranslation } from 'react-i18next'
+import { XMarkIcon } from '@heroicons/react/24/outline'
+import Button from '../button'
+import cn from '@/utils/classnames'
+
+export type IDrawerProps = {
+  title?: string
+  description?: string
+  dialogClassName?: string
+  dialogBackdropClassName?: string
+  panelClassName?: string
+  children: React.ReactNode
+  footer?: React.ReactNode
+  mask?: boolean
+  positionCenter?: boolean
+  isOpen: boolean
+  showClose?: boolean
+  clickOutsideNotOpen?: boolean
+  onClose: () => void
+  onCancel?: () => void
+  onOk?: () => void
+  unmount?: boolean
+}
+
+export default function Drawer({
+  title = '',
+  description = '',
+  dialogClassName = '',
+  dialogBackdropClassName = '',
+  panelClassName = '',
+  children,
+  footer,
+  mask = true,
+  positionCenter,
+  showClose = false,
+  isOpen,
+  clickOutsideNotOpen,
+  onClose,
+  onCancel,
+  onOk,
+  unmount = false,
+}: IDrawerProps) {
+  const { t } = useTranslation()
+  return (
+    <Dialog
+      unmount={unmount}
+      open={isOpen}
+      onClose={() => !clickOutsideNotOpen && onClose()}
+      className={cn('fixed inset-0 z-[30] overflow-y-auto', dialogClassName)}
+    >
+      <div className={cn('flex h-screen w-screen justify-end', positionCenter && '!justify-center')}>
+        {/* mask */}
+        <DialogBackdrop
+          className={cn('fixed inset-0 z-[40]', mask && 'bg-black/30', dialogBackdropClassName)}
+          onClick={() => {
+            !clickOutsideNotOpen && onClose()
+          }}
+        />
+        <div className={cn('relative z-[50] flex w-full max-w-sm flex-col justify-between overflow-hidden bg-components-panel-bg p-6 text-left align-middle shadow-xl', panelClassName)}>
+          <>
+            <div className='flex justify-between'>
+              {title && <DialogTitle
+                as="h3"
+                className="text-lg font-medium leading-6 text-text-primary"
+              >
+                {title}
+              </DialogTitle>}
+              {showClose && <DialogTitle className="mb-4 flex cursor-pointer items-center" as="div">
+                <XMarkIcon className='h-4 w-4 text-text-tertiary' onClick={onClose} />
+              </DialogTitle>}
+            </div>
+            {description && <div className='mt-2 text-xs font-normal text-text-tertiary'>{description}</div>}
+            {children}
+          </>
+          {footer || (footer === null
+            ? null
+            : <div className="mt-10 flex flex-row justify-end">
+              <Button
+                className='mr-2'
+                onClick={() => {
+                  onCancel && onCancel()
+                }}>{t('common.operation.cancel')}</Button>
+              <Button
+                onClick={() => {
+                  onOk && onOk()
+                }}>{t('common.operation.save')}</Button>
+            </div>)}
+        </div>
+      </div>
+    </Dialog>
+  )
+}
diff --git a/app/components/base/dropdown/index.tsx b/app/components/base/dropdown/index.tsx
new file mode 100644
index 0000000..cdee153
--- /dev/null
+++ b/app/components/base/dropdown/index.tsx
@@ -0,0 +1,106 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import {
+  RiMoreFill,
+} from '@remixicon/react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+
+export type Item = {
+  value: string | number
+  text: string | React.JSX.Element
+}
+type DropdownProps = {
+  items: Item[]
+  secondItems?: Item[]
+  onSelect: (item: Item) => void
+  renderTrigger?: (open: boolean) => React.ReactNode
+  popupClassName?: string
+}
+const Dropdown: FC<DropdownProps> = ({
+  items,
+  onSelect,
+  secondItems,
+  renderTrigger,
+  popupClassName,
+}) => {
+  const [open, setOpen] = useState(false)
+
+  const handleSelect = (item: Item) => {
+    setOpen(false)
+    onSelect(item)
+  }
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+        {
+          renderTrigger
+            ? renderTrigger(open)
+            : (
+              <div
+                className={`
+                  flex h-6 w-6 cursor-pointer items-center justify-center rounded-md
+                  ${open && 'bg-divider-regular'}
+                `}
+              >
+                <RiMoreFill className='h-4 w-4 text-text-tertiary' />
+              </div>
+            )
+        }
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className={popupClassName}>
+        <div className='rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg text-sm text-text-secondary shadow-lg'>
+          {
+            !!items.length && (
+              <div className='p-1'>
+                {
+                  items.map(item => (
+                    <div
+                      key={item.value}
+                      className='flex h-8 cursor-pointer items-center rounded-lg px-3 hover:bg-components-panel-on-panel-item-bg-hover'
+                      onClick={() => handleSelect(item)}
+                    >
+                      {item.text}
+                    </div>
+                  ))
+                }
+              </div>
+            )
+          }
+          {
+            (!!items.length && !!secondItems?.length) && (
+              <div className='h-[1px] bg-divider-regular' />
+            )
+          }
+          {
+            !!secondItems?.length && (
+              <div className='p-1'>
+                {
+                  secondItems.map(item => (
+                    <div
+                      key={item.value}
+                      className='flex h-8 cursor-pointer items-center rounded-lg px-3 hover:bg-components-panel-on-panel-item-bg-hover'
+                      onClick={() => handleSelect(item)}
+                    >
+                      {item.text}
+                    </div>
+                  ))
+                }
+              </div>
+            )
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default Dropdown
diff --git a/app/components/base/emoji-picker/Inner.tsx b/app/components/base/emoji-picker/Inner.tsx
new file mode 100644
index 0000000..34ce3f7
--- /dev/null
+++ b/app/components/base/emoji-picker/Inner.tsx
@@ -0,0 +1,173 @@
+'use client'
+import type { ChangeEvent, FC } from 'react'
+import React, { useState } from 'react'
+import data from '@emoji-mart/data'
+import type { EmojiMartData } from '@emoji-mart/data'
+import { init } from 'emoji-mart'
+import {
+  MagnifyingGlassIcon,
+} from '@heroicons/react/24/outline'
+import Input from '@/app/components/base/input'
+import Divider from '@/app/components/base/divider'
+import { searchEmoji } from '@/utils/emoji'
+import cn from '@/utils/classnames'
+
+declare global {
+  // eslint-disable-next-line ts/no-namespace
+  namespace JSX {
+    // eslint-disable-next-line ts/consistent-type-definitions
+    interface IntrinsicElements {
+      'em-emoji': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>
+    }
+  }
+}
+
+init({ data })
+
+const backgroundColors = [
+  '#FFEAD5',
+  '#E4FBCC',
+  '#D3F8DF',
+  '#E0F2FE',
+
+  '#E0EAFF',
+  '#EFF1F5',
+  '#FBE8FF',
+  '#FCE7F6',
+
+  '#FEF7C3',
+  '#E6F4D7',
+  '#D5F5F6',
+  '#D1E9FF',
+
+  '#D1E0FF',
+  '#D5D9EB',
+  '#ECE9FE',
+  '#FFE4E8',
+]
+
+type IEmojiPickerInnerProps = {
+  emoji?: string
+  background?: string
+  onSelect?: (emoji: string, background: string) => void
+  className?: string
+}
+
+const EmojiPickerInner: FC<IEmojiPickerInnerProps> = ({
+  onSelect,
+  className,
+}) => {
+  const { categories } = data as EmojiMartData
+  const [selectedEmoji, setSelectedEmoji] = useState('')
+  const [selectedBackground, setSelectedBackground] = useState(backgroundColors[0])
+
+  const [searchedEmojis, setSearchedEmojis] = useState<string[]>([])
+  const [isSearching, setIsSearching] = useState(false)
+
+  React.useEffect(() => {
+    if (selectedEmoji && selectedBackground)
+      onSelect?.(selectedEmoji, selectedBackground)
+  }, [onSelect, selectedEmoji, selectedBackground])
+
+  return <div className={cn(className)}>
+    <div className='flex w-full flex-col items-center px-3 pb-2'>
+      <div className="relative w-full">
+        <div className="pointer-events-none absolute inset-y-0 left-0 z-10 flex items-center pl-3">
+          <MagnifyingGlassIcon className="h-5 w-5 text-text-quaternary" aria-hidden="true" />
+        </div>
+        <Input
+          className="pl-10"
+          type="search"
+          id="search"
+          placeholder="Search emojis..."
+          onChange={async (e: ChangeEvent<HTMLInputElement>) => {
+            if (e.target.value === '') {
+              setIsSearching(false)
+            }
+            else {
+              setIsSearching(true)
+              const emojis = await searchEmoji(e.target.value)
+              setSearchedEmojis(emojis)
+            }
+          }}
+        />
+      </div>
+    </div>
+    <Divider className='my-3' />
+
+    <div className="max-h-[200px] w-full overflow-y-auto overflow-x-hidden px-3">
+      {isSearching && <>
+        <div key={'category-search'} className='flex flex-col'>
+          <p className='system-xs-medium-uppercase mb-1 text-text-primary'>Search</p>
+          <div className='grid h-full w-full grid-cols-8 gap-1'>
+            {searchedEmojis.map((emoji: string, index: number) => {
+              return <div
+                key={`emoji-search-${index}`}
+                className='inline-flex h-10 w-10 items-center justify-center rounded-lg'
+                onClick={() => {
+                  setSelectedEmoji(emoji)
+                }}
+              >
+                <div className='flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg p-1 ring-components-input-border-hover ring-offset-1 hover:ring-1'>
+                  <em-emoji id={emoji} />
+                </div>
+              </div>
+            })}
+          </div>
+        </div>
+      </>}
+
+      {categories.map((category, index: number) => {
+        return <div key={`category-${index}`} className='flex flex-col'>
+          <p className='system-xs-medium-uppercase mb-1 text-text-primary'>{category.id}</p>
+          <div className='grid h-full w-full grid-cols-8 gap-1'>
+            {category.emojis.map((emoji, index: number) => {
+              return <div
+                key={`emoji-${index}`}
+                className='inline-flex h-10 w-10 items-center justify-center rounded-lg'
+                onClick={() => {
+                  setSelectedEmoji(emoji)
+                }}
+              >
+                <div className='flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg p-1 ring-components-input-border-hover ring-offset-1 hover:ring-1'>
+                  <em-emoji id={emoji} />
+                </div>
+              </div>
+            })}
+
+          </div>
+        </div>
+      })}
+    </div>
+
+    {/* Color Select */}
+    <div className={cn('p-3 pb-0', selectedEmoji === '' ? 'opacity-25' : '')}>
+      <p className='system-xs-medium-uppercase mb-2 text-text-primary'>Choose Style</p>
+      <div className='grid h-full w-full grid-cols-8 gap-1'>
+        {backgroundColors.map((color) => {
+          return <div
+            key={color}
+            className={
+              cn(
+                'cursor-pointer',
+                'ring-offset-1 hover:ring-1',
+                'inline-flex h-10 w-10 items-center justify-center rounded-lg',
+                color === selectedBackground ? 'ring-1 ring-components-input-border-hover' : '',
+              )}
+            onClick={() => {
+              setSelectedBackground(color)
+            }}
+          >
+            <div className={cn(
+              'flex h-8 w-8 items-center justify-center rounded-lg p-1',
+            )
+            } style={{ background: color }}>
+              {selectedEmoji !== '' && <em-emoji id={selectedEmoji} />}
+            </div>
+          </div>
+        })}
+      </div>
+    </div>
+  </div>
+}
+export default EmojiPickerInner
diff --git a/app/components/base/emoji-picker/index.tsx b/app/components/base/emoji-picker/index.tsx
new file mode 100644
index 0000000..d3b20bb
--- /dev/null
+++ b/app/components/base/emoji-picker/index.tsx
@@ -0,0 +1,65 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import EmojiPickerInner from './Inner'
+import cn from '@/utils/classnames'
+import Divider from '@/app/components/base/divider'
+import Button from '@/app/components/base/button'
+import Modal from '@/app/components/base/modal'
+import { noop } from 'lodash-es'
+
+type IEmojiPickerProps = {
+  isModal?: boolean
+  onSelect?: (emoji: string, background: string) => void
+  onClose?: () => void
+  className?: string
+}
+
+const EmojiPicker: FC<IEmojiPickerProps> = ({
+  isModal = true,
+  onSelect,
+  onClose,
+  className,
+}) => {
+  const { t } = useTranslation()
+  const [selectedEmoji, setSelectedEmoji] = useState('')
+  const [selectedBackground, setSelectedBackground] = useState<string>()
+
+  const handleSelectEmoji = useCallback((emoji: string, background: string) => {
+    setSelectedEmoji(emoji)
+    setSelectedBackground(background)
+  }, [setSelectedEmoji, setSelectedBackground])
+
+  return isModal
+    ? <Modal
+      onClose={noop}
+      isShow
+      closable={false}
+      wrapperClassName={className}
+      className={cn('flex max-h-[552px] flex-col rounded-xl border-[0.5px] border-divider-subtle p-0 shadow-xl')}
+    >
+      <EmojiPickerInner
+        className="pt-3"
+        onSelect={handleSelectEmoji} />
+      <Divider className='mb-0 mt-3' />
+      <div className='flex w-full items-center justify-center gap-2 p-3'>
+        <Button className='w-full' onClick={() => {
+          onClose && onClose()
+        }}>
+          {t('app.iconPicker.cancel')}
+        </Button>
+        <Button
+          disabled={selectedEmoji === '' || !selectedBackground}
+          variant="primary"
+          className='w-full'
+          onClick={() => {
+            onSelect && onSelect(selectedEmoji, selectedBackground!)
+          }}>
+          {t('app.iconPicker.ok')}
+        </Button>
+      </div>
+    </Modal>
+    : <></>
+}
+export default EmojiPicker
diff --git a/app/components/base/features/context.tsx b/app/components/base/features/context.tsx
new file mode 100644
index 0000000..dc04f6b
--- /dev/null
+++ b/app/components/base/features/context.tsx
@@ -0,0 +1,27 @@
+import {
+  createContext,
+  useRef,
+} from 'react'
+import type {
+  FeaturesState,
+  FeaturesStore,
+} from './store'
+import { createFeaturesStore } from './store'
+
+export const FeaturesContext = createContext<FeaturesStore | null>(null)
+
+type FeaturesProviderProps = {
+  children: React.ReactNode
+} & Partial<FeaturesState>
+export const FeaturesProvider = ({ children, ...props }: FeaturesProviderProps) => {
+  const storeRef = useRef<FeaturesStore | undefined>(undefined)
+
+  if (!storeRef.current)
+    storeRef.current = createFeaturesStore(props)
+
+  return (
+    <FeaturesContext.Provider value={storeRef.current}>
+      {children}
+    </FeaturesContext.Provider>
+  )
+}
diff --git a/app/components/base/features/hooks.ts b/app/components/base/features/hooks.ts
new file mode 100644
index 0000000..933685b
--- /dev/null
+++ b/app/components/base/features/hooks.ts
@@ -0,0 +1,16 @@
+import { useContext } from 'react'
+import { useStore } from 'zustand'
+import { FeaturesContext } from './context'
+import type { FeatureStoreState } from './store'
+
+export function useFeatures<T>(selector: (state: FeatureStoreState) => T): T {
+  const store = useContext(FeaturesContext)
+  if (!store)
+    throw new Error('Missing FeaturesContext.Provider in the tree')
+
+  return useStore(store, selector)
+}
+
+export function useFeaturesStore() {
+  return useContext(FeaturesContext)
+}
diff --git a/app/components/base/features/index.tsx b/app/components/base/features/index.tsx
new file mode 100644
index 0000000..daea711
--- /dev/null
+++ b/app/components/base/features/index.tsx
@@ -0,0 +1 @@
+export { FeaturesProvider } from './context'
diff --git a/app/components/base/features/new-feature-panel/annotation-reply/annotation-ctrl-button.tsx b/app/components/base/features/new-feature-panel/annotation-reply/annotation-ctrl-button.tsx
new file mode 100644
index 0000000..3050249
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/annotation-reply/annotation-ctrl-button.tsx
@@ -0,0 +1,79 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiEditLine,
+  RiFileEditLine,
+} from '@remixicon/react'
+import ActionButton from '@/app/components/base/action-button'
+import Tooltip from '@/app/components/base/tooltip'
+import { addAnnotation } from '@/service/annotation'
+import Toast from '@/app/components/base/toast'
+import { useProviderContext } from '@/context/provider-context'
+import { useModalContext } from '@/context/modal-context'
+
+type Props = {
+  appId: string
+  messageId?: string
+  cached: boolean
+  query: string
+  answer: string
+  onAdded: (annotationId: string, authorName: string) => void
+  onEdit: () => void
+}
+
+const AnnotationCtrlButton: FC<Props> = ({
+  cached,
+  query,
+  answer,
+  appId,
+  messageId,
+  onAdded,
+  onEdit,
+}) => {
+  const { t } = useTranslation()
+  const { plan, enableBilling } = useProviderContext()
+  const isAnnotationFull = (enableBilling && plan.usage.annotatedResponse >= plan.total.annotatedResponse)
+  const { setShowAnnotationFullModal } = useModalContext()
+  const handleAdd = async () => {
+    if (isAnnotationFull) {
+      setShowAnnotationFullModal()
+      return
+    }
+    const res: any = await addAnnotation(appId, {
+      message_id: messageId,
+      question: query,
+      answer,
+    })
+    Toast.notify({
+      message: t('common.api.actionSuccess') as string,
+      type: 'success',
+    })
+    onAdded(res.id, res.account?.name)
+  }
+
+  return (
+    <>
+      {cached && (
+        <Tooltip
+          popupContent={t('appDebug.feature.annotation.edit')}
+        >
+          <ActionButton onClick={onEdit}>
+            <RiEditLine className='h-4 w-4' />
+          </ActionButton>
+        </Tooltip>
+      )}
+      {!cached && answer && (
+        <Tooltip
+          popupContent={t('appDebug.feature.annotation.add')}
+        >
+          <ActionButton onClick={handleAdd}>
+            <RiFileEditLine className='h-4 w-4' />
+          </ActionButton>
+        </Tooltip>
+      )}
+    </>
+  )
+}
+export default React.memo(AnnotationCtrlButton)
diff --git a/app/components/base/features/new-feature-panel/annotation-reply/config-param-modal.tsx b/app/components/base/features/new-feature-panel/annotation-reply/config-param-modal.tsx
new file mode 100644
index 0000000..33677f0
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/annotation-reply/config-param-modal.tsx
@@ -0,0 +1,139 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import ScoreSlider from './score-slider'
+import { Item } from './config-param'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import Toast from '@/app/components/base/toast'
+import type { AnnotationReplyConfig } from '@/models/debug'
+import { ANNOTATION_DEFAULT } from '@/config'
+import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
+import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+
+type Props = {
+  appId: string
+  isShow: boolean
+  onHide: () => void
+  onSave: (embeddingModel: {
+    embedding_provider_name: string
+    embedding_model_name: string
+  }, score: number) => void
+  isInit?: boolean
+  annotationConfig: AnnotationReplyConfig
+}
+
+const ConfigParamModal: FC<Props> = ({
+  isShow,
+  onHide: doHide,
+  onSave,
+  isInit,
+  annotationConfig: oldAnnotationConfig,
+}) => {
+  const { t } = useTranslation()
+  const {
+    modelList: embeddingsModelList,
+    defaultModel: embeddingsDefaultModel,
+    currentModel: isEmbeddingsDefaultModelValid,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.textEmbedding)
+  const [annotationConfig, setAnnotationConfig] = useState(oldAnnotationConfig)
+
+  const [isLoading, setLoading] = useState(false)
+  const [embeddingModel, setEmbeddingModel] = useState(oldAnnotationConfig.embedding_model
+    ? {
+      providerName: oldAnnotationConfig.embedding_model.embedding_provider_name,
+      modelName: oldAnnotationConfig.embedding_model.embedding_model_name,
+    }
+    : (embeddingsDefaultModel
+      ? {
+        providerName: embeddingsDefaultModel.provider.provider,
+        modelName: embeddingsDefaultModel.model,
+      }
+      : undefined))
+  const onHide = () => {
+    if (!isLoading)
+      doHide()
+  }
+
+  const handleSave = async () => {
+    if (!embeddingModel || !embeddingModel.modelName || (embeddingModel.modelName === embeddingsDefaultModel?.model && !isEmbeddingsDefaultModelValid)) {
+      Toast.notify({
+        message: t('common.modelProvider.embeddingModel.required'),
+        type: 'error',
+      })
+      return
+    }
+    setLoading(true)
+    await onSave({
+      embedding_provider_name: embeddingModel.providerName,
+      embedding_model_name: embeddingModel.modelName,
+    }, annotationConfig.score_threshold)
+    setLoading(false)
+  }
+
+  return (
+    <Modal
+      isShow={isShow}
+      onClose={onHide}
+      className='!mt-14 !w-[640px] !max-w-none !p-6'
+    >
+      <div className='title-2xl-semi-bold mb-2 text-text-primary'>
+        {t(`appAnnotation.initSetup.${isInit ? 'title' : 'configTitle'}`)}
+      </div>
+
+      <div className='mt-6 space-y-3'>
+        <Item
+          title={t('appDebug.feature.annotation.scoreThreshold.title')}
+          tooltip={t('appDebug.feature.annotation.scoreThreshold.description')}
+        >
+          <ScoreSlider
+            className='mt-1'
+            value={(annotationConfig.score_threshold || ANNOTATION_DEFAULT.score_threshold) * 100}
+            onChange={(val) => {
+              setAnnotationConfig({
+                ...annotationConfig,
+                score_threshold: val / 100,
+              })
+            }}
+          />
+        </Item>
+
+        <Item
+          title={t('common.modelProvider.embeddingModel.key')}
+          tooltip={t('appAnnotation.embeddingModelSwitchTip')}
+        >
+          <div className='pt-1'>
+            <ModelSelector
+              defaultModel={embeddingModel && {
+                provider: embeddingModel.providerName,
+                model: embeddingModel.modelName,
+              }}
+              modelList={embeddingsModelList}
+              onSelect={(val) => {
+                setEmbeddingModel({
+                  providerName: val.provider,
+                  modelName: val.model,
+                })
+              }}
+            />
+          </div>
+        </Item>
+      </div>
+
+      <div className='mt-6 flex justify-end gap-2'>
+        <Button onClick={onHide}>{t('common.operation.cancel')}</Button>
+        <Button
+          variant='primary'
+          onClick={handleSave}
+          loading={isLoading}
+        >
+          <div></div>
+          <div>{t(`appAnnotation.initSetup.${isInit ? 'confirmBtn' : 'configConfirmBtn'}`)}</div>
+        </Button >
+      </div >
+    </Modal >
+  )
+}
+export default React.memo(ConfigParamModal)
diff --git a/app/components/base/features/new-feature-panel/annotation-reply/config-param.tsx b/app/components/base/features/new-feature-panel/annotation-reply/config-param.tsx
new file mode 100644
index 0000000..e2febcf
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/annotation-reply/config-param.tsx
@@ -0,0 +1,24 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import Tooltip from '@/app/components/base/tooltip'
+
+export const Item: FC<{ title: string; tooltip: string; children: React.JSX.Element }> = ({
+  title,
+  tooltip,
+  children,
+}) => {
+  return (
+    <div>
+      <div className='mb-1 flex items-center space-x-1'>
+        <div className='system-sm-semibold py-1 text-text-secondary'>{title}</div>
+        <Tooltip
+          popupContent={
+            <div className='system-sm-regular max-w-[200px] text-text-secondary'>{tooltip}</div>
+          }
+        />
+      </div>
+      <div>{children}</div>
+    </div>
+  )
+}
diff --git a/app/components/base/features/new-feature-panel/annotation-reply/index.tsx b/app/components/base/features/new-feature-panel/annotation-reply/index.tsx
new file mode 100644
index 0000000..34ecf23
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/annotation-reply/index.tsx
@@ -0,0 +1,153 @@
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { usePathname, useRouter } from 'next/navigation'
+import produce from 'immer'
+import { RiEqualizer2Line, RiExternalLinkLine } from '@remixicon/react'
+import { MessageFast } from '@/app/components/base/icons/src/vender/features'
+import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card'
+import Button from '@/app/components/base/button'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+import useAnnotationConfig from '@/app/components/base/features/new-feature-panel/annotation-reply/use-annotation-config'
+import ConfigParamModal from '@/app/components/base/features/new-feature-panel/annotation-reply/config-param-modal'
+import AnnotationFullModal from '@/app/components/billing/annotation-full/modal'
+import { ANNOTATION_DEFAULT } from '@/config'
+import type { AnnotationReplyConfig } from '@/models/debug'
+
+type Props = {
+  disabled?: boolean
+  onChange?: OnFeaturesChange
+}
+
+const AnnotationReply = ({
+  disabled,
+  onChange,
+}: Props) => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const pathname = usePathname()
+  const matched = pathname.match(/\/app\/([^/]+)/)
+  const appId = (matched?.length && matched[1]) ? matched[1] : ''
+  const featuresStore = useFeaturesStore()
+  const annotationReply = useFeatures(s => s.features.annotationReply)
+
+  const updateAnnotationReply = useCallback((newConfig: AnnotationReplyConfig) => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+    const newFeatures = produce(features, (draft) => {
+      draft.annotationReply = newConfig
+    })
+    setFeatures(newFeatures)
+    if (onChange)
+      onChange(newFeatures)
+  }, [featuresStore, onChange])
+
+  const {
+    handleEnableAnnotation,
+    handleDisableAnnotation,
+    isShowAnnotationConfigInit,
+    setIsShowAnnotationConfigInit,
+    isShowAnnotationFullModal,
+    setIsShowAnnotationFullModal,
+  } = useAnnotationConfig({
+    appId,
+    annotationConfig: annotationReply as any || {
+      id: '',
+      enabled: false,
+      score_threshold: ANNOTATION_DEFAULT.score_threshold,
+      embedding_model: {
+        embedding_provider_name: '',
+        embedding_model_name: '',
+      },
+    },
+    setAnnotationConfig: updateAnnotationReply,
+  })
+
+  const handleSwitch = useCallback((enabled: boolean) => {
+    if (enabled)
+      setIsShowAnnotationConfigInit(true)
+    else
+      handleDisableAnnotation(annotationReply?.embedding_model as any)
+  }, [annotationReply?.embedding_model, handleDisableAnnotation, setIsShowAnnotationConfigInit])
+
+  const [isHovering, setIsHovering] = useState(false)
+
+  return (
+    <>
+      <FeatureCard
+        icon={
+          <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-indigo-indigo-600 p-1 shadow-xs'>
+            <MessageFast className='h-4 w-4 text-text-primary-on-surface' />
+          </div>
+        }
+        title={t('appDebug.feature.annotation.title')}
+        value={!!annotationReply?.enabled}
+        onChange={state => handleSwitch(state)}
+        onMouseEnter={() => setIsHovering(true)}
+        onMouseLeave={() => setIsHovering(false)}
+        disabled={disabled}
+      >
+        <>
+          {!annotationReply?.enabled && (
+            <div className='system-xs-regular line-clamp-2 min-h-8 text-text-tertiary'>{t('appDebug.feature.annotation.description')}</div>
+          )}
+          {!!annotationReply?.enabled && (
+            <>
+              {!isHovering && (
+                <div className='flex items-center gap-4 pt-0.5'>
+                  <div className=''>
+                    <div className='system-2xs-medium-uppercase mb-0.5 text-text-tertiary'>{t('appDebug.feature.annotation.scoreThreshold.title')}</div>
+                    <div className='system-xs-regular text-text-secondary'>{annotationReply.score_threshold || '-'}</div>
+                  </div>
+                  <div className='h-[27px] w-px rotate-12 bg-divider-subtle'></div>
+                  <div className=''>
+                    <div className='system-2xs-medium-uppercase mb-0.5 text-text-tertiary'>{t('common.modelProvider.embeddingModel.key')}</div>
+                    <div className='system-xs-regular text-text-secondary'>{annotationReply.embedding_model?.embedding_model_name}</div>
+                  </div>
+                </div>
+              )}
+              {isHovering && (
+                <div className='flex items-center justify-between'>
+                  <Button className='w-[178px]' onClick={() => setIsShowAnnotationConfigInit(true)} disabled={disabled}>
+                    <RiEqualizer2Line className='mr-1 h-4 w-4' />
+                    {t('common.operation.params')}
+                  </Button>
+                  <Button className='w-[178px]' onClick={() => {
+                    router.push(`/app/${appId}/annotations`)
+                  }}>
+                    <RiExternalLinkLine className='mr-1 h-4 w-4' />
+                    {t('appDebug.feature.annotation.cacheManagement')}
+                  </Button>
+                </div>
+              )}
+            </>
+          )}
+        </>
+      </FeatureCard>
+      <ConfigParamModal
+        appId={appId}
+        isInit
+        isShow={isShowAnnotationConfigInit}
+        onHide={() => {
+          setIsShowAnnotationConfigInit(false)
+          // showChooseFeatureTrue()
+        }}
+        onSave={async (embeddingModel, score) => {
+          await handleEnableAnnotation(embeddingModel, score)
+          setIsShowAnnotationConfigInit(false)
+        }}
+        annotationConfig={annotationReply as any}
+      />
+      {isShowAnnotationFullModal && (
+        <AnnotationFullModal
+          show={isShowAnnotationFullModal}
+          onHide={() => setIsShowAnnotationFullModal(false)}
+        />
+      )}
+    </>
+  )
+}
+
+export default AnnotationReply
diff --git a/app/components/base/features/new-feature-panel/annotation-reply/score-slider/base-slider/index.tsx b/app/components/base/features/new-feature-panel/annotation-reply/score-slider/base-slider/index.tsx
new file mode 100644
index 0000000..cc8e125
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/annotation-reply/score-slider/base-slider/index.tsx
@@ -0,0 +1,38 @@
+import ReactSlider from 'react-slider'
+import s from './style.module.css'
+import cn from '@/utils/classnames'
+
+type ISliderProps = {
+  className?: string
+  value: number
+  max?: number
+  min?: number
+  step?: number
+  disabled?: boolean
+  onChange: (value: number) => void
+}
+
+const Slider: React.FC<ISliderProps> = ({ className, max, min, step, value, disabled, onChange }) => {
+  return <ReactSlider
+    disabled={disabled}
+    value={isNaN(value) ? 0 : value}
+    min={min || 0}
+    max={max || 100}
+    step={step || 1}
+    className={cn(className, s.slider)}
+    thumbClassName={cn(s['slider-thumb'], 'top-[-7px] h-[18px] w-2 cursor-pointer rounded-[36px] border !border-black/8 bg-white shadow-md')}
+    trackClassName={s['slider-track']}
+    onChange={onChange}
+    renderThumb={(props, state) => (
+      <div {...props}>
+        <div className='relative h-full w-full'>
+          <div className='system-sm-semibold absolute left-[50%] top-[-16px] translate-x-[-50%] text-text-primary'>
+            {(state.valueNow / 100).toFixed(2)}
+          </div>
+        </div>
+      </div>
+    )}
+  />
+}
+
+export default Slider
diff --git a/app/components/base/features/new-feature-panel/annotation-reply/score-slider/base-slider/style.module.css b/app/components/base/features/new-feature-panel/annotation-reply/score-slider/base-slider/style.module.css
new file mode 100644
index 0000000..8ef23b5
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/annotation-reply/score-slider/base-slider/style.module.css
@@ -0,0 +1,20 @@
+.slider {
+    position: relative;
+}
+
+.slider.disabled {
+    opacity: 0.6;
+}
+
+.slider-thumb:focus {
+    outline: none;
+}
+
+.slider-track {
+    background-color: #528BFF;
+    height: 2px;
+}
+
+.slider-track-1 {
+    background-color: #E5E7EB;
+}
diff --git a/app/components/base/features/new-feature-panel/annotation-reply/score-slider/index.tsx b/app/components/base/features/new-feature-panel/annotation-reply/score-slider/index.tsx
new file mode 100644
index 0000000..2fc89b9
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/annotation-reply/score-slider/index.tsx
@@ -0,0 +1,46 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import Slider from '@/app/components/base/features/new-feature-panel/annotation-reply/score-slider/base-slider'
+
+type Props = {
+  className?: string
+  value: number
+  onChange: (value: number) => void
+}
+
+const ScoreSlider: FC<Props> = ({
+  className,
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className={className}>
+      <div className='mt-[14px] h-[1px]'>
+        <Slider
+          max={100}
+          min={80}
+          step={1}
+          value={value}
+          onChange={onChange}
+        />
+      </div>
+      <div className='system-xs-semibold-uppercase mt-[10px] flex items-center justify-between'>
+        <div className='flex space-x-1 text-util-colors-cyan-cyan-500'>
+          <div>0.8</div>
+          <div>路</div>
+          <div>{t('appDebug.feature.annotation.scoreThreshold.easyMatch')}</div>
+        </div>
+        <div className='flex space-x-1 text-util-colors-blue-blue-500'>
+          <div>1.0</div>
+          <div>路</div>
+          <div>{t('appDebug.feature.annotation.scoreThreshold.accurateMatch')}</div>
+        </div>
+      </div>
+    </div>
+  )
+}
+export default React.memo(ScoreSlider)
diff --git a/app/components/base/features/new-feature-panel/annotation-reply/type.ts b/app/components/base/features/new-feature-panel/annotation-reply/type.ts
new file mode 100644
index 0000000..9104534
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/annotation-reply/type.ts
@@ -0,0 +1,4 @@
+export enum PageType {
+  log = 'log',
+  annotation = 'annotation',
+}
diff --git a/app/components/base/features/new-feature-panel/annotation-reply/use-annotation-config.ts b/app/components/base/features/new-feature-panel/annotation-reply/use-annotation-config.ts
new file mode 100644
index 0000000..540302c
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/annotation-reply/use-annotation-config.ts
@@ -0,0 +1,89 @@
+import React, { useState } from 'react'
+import produce from 'immer'
+import type { AnnotationReplyConfig } from '@/models/debug'
+import { queryAnnotationJobStatus, updateAnnotationStatus } from '@/service/annotation'
+import type { EmbeddingModelConfig } from '@/app/components/app/annotation/type'
+import { AnnotationEnableStatus, JobStatus } from '@/app/components/app/annotation/type'
+import { sleep } from '@/utils'
+import { ANNOTATION_DEFAULT } from '@/config'
+import { useProviderContext } from '@/context/provider-context'
+
+type Params = {
+  appId: string
+  annotationConfig: AnnotationReplyConfig
+  setAnnotationConfig: (annotationConfig: AnnotationReplyConfig) => void
+}
+const useAnnotationConfig = ({
+  appId,
+  annotationConfig,
+  setAnnotationConfig,
+}: Params) => {
+  const { plan, enableBilling } = useProviderContext()
+  const isAnnotationFull = (enableBilling && plan.usage.annotatedResponse >= plan.total.annotatedResponse)
+  const [isShowAnnotationFullModal, setIsShowAnnotationFullModal] = useState(false)
+  const [isShowAnnotationConfigInit, doSetIsShowAnnotationConfigInit] = React.useState(false)
+  const setIsShowAnnotationConfigInit = (isShow: boolean) => {
+    if (isShow) {
+      if (isAnnotationFull) {
+        setIsShowAnnotationFullModal(true)
+        return
+      }
+    }
+    doSetIsShowAnnotationConfigInit(isShow)
+  }
+  const ensureJobCompleted = async (jobId: string, status: AnnotationEnableStatus) => {
+    let isCompleted = false
+    while (!isCompleted) {
+      const res: any = await queryAnnotationJobStatus(appId, status, jobId)
+      isCompleted = res.job_status === JobStatus.completed
+      if (isCompleted)
+        break
+
+      await sleep(2000)
+    }
+  }
+
+  const handleEnableAnnotation = async (embeddingModel: EmbeddingModelConfig, score?: number) => {
+    if (isAnnotationFull)
+      return
+
+    const { job_id: jobId }: any = await updateAnnotationStatus(appId, AnnotationEnableStatus.enable, embeddingModel, score)
+    await ensureJobCompleted(jobId, AnnotationEnableStatus.enable)
+    setAnnotationConfig(produce(annotationConfig, (draft: AnnotationReplyConfig) => {
+      draft.enabled = true
+      draft.embedding_model = embeddingModel
+      if (!draft.score_threshold)
+        draft.score_threshold = ANNOTATION_DEFAULT.score_threshold
+    }))
+  }
+
+  const setScore = (score: number, embeddingModel?: EmbeddingModelConfig) => {
+    setAnnotationConfig(produce(annotationConfig, (draft: AnnotationReplyConfig) => {
+      draft.score_threshold = score
+      if (embeddingModel)
+        draft.embedding_model = embeddingModel
+    }))
+  }
+
+  const handleDisableAnnotation = async (embeddingModel: EmbeddingModelConfig) => {
+    if (!annotationConfig.enabled)
+      return
+
+    await updateAnnotationStatus(appId, AnnotationEnableStatus.disable, embeddingModel)
+    setAnnotationConfig(produce(annotationConfig, (draft: AnnotationReplyConfig) => {
+      draft.enabled = false
+    }))
+  }
+
+  return {
+    handleEnableAnnotation,
+    handleDisableAnnotation,
+    isShowAnnotationConfigInit,
+    setIsShowAnnotationConfigInit,
+    isShowAnnotationFullModal,
+    setIsShowAnnotationFullModal,
+    setScore,
+  }
+}
+
+export default useAnnotationConfig
diff --git a/app/components/base/features/new-feature-panel/citation.tsx b/app/components/base/features/new-feature-panel/citation.tsx
new file mode 100644
index 0000000..773304d
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/citation.tsx
@@ -0,0 +1,56 @@
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { Citations } from '@/app/components/base/icons/src/vender/features'
+import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+import { FeatureEnum } from '@/app/components/base/features/types'
+
+type Props = {
+  disabled?: boolean
+  onChange?: OnFeaturesChange
+}
+
+const Citation = ({
+  disabled,
+  onChange,
+}: Props) => {
+  const { t } = useTranslation()
+  const features = useFeatures(s => s.features)
+  const featuresStore = useFeaturesStore()
+
+  const handleChange = useCallback((type: FeatureEnum, enabled: boolean) => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+
+    const newFeatures = produce(features, (draft) => {
+      draft[type] = {
+        ...draft[type],
+        enabled,
+      }
+    })
+    setFeatures(newFeatures)
+    if (onChange)
+      onChange(newFeatures)
+  }, [featuresStore, onChange])
+
+  return (
+    <FeatureCard
+      icon={
+        <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-warning-warning-500 p-1 shadow-xs'>
+          <Citations className='h-4 w-4 text-text-primary-on-surface' />
+        </div>
+      }
+      title={t('appDebug.feature.citation.title')}
+      value={!!features.citation?.enabled}
+      description={t('appDebug.feature.citation.description')!}
+      onChange={state => handleChange(FeatureEnum.citation, state)}
+      disabled={disabled}
+    />
+  )
+}
+
+export default Citation
diff --git a/app/components/base/features/new-feature-panel/conversation-opener/index.tsx b/app/components/base/features/new-feature-panel/conversation-opener/index.tsx
new file mode 100644
index 0000000..e407588
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/conversation-opener/index.tsx
@@ -0,0 +1,119 @@
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { RiEditLine } from '@remixicon/react'
+import { LoveMessage } from '@/app/components/base/icons/src/vender/features'
+import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card'
+import Button from '@/app/components/base/button'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+import { FeatureEnum } from '@/app/components/base/features/types'
+import { useModalContext } from '@/context/modal-context'
+import type { PromptVariable } from '@/models/debug'
+import type { InputVar } from '@/app/components/workflow/types'
+
+type Props = {
+  disabled?: boolean
+  onChange?: OnFeaturesChange
+  promptVariables?: PromptVariable[]
+  workflowVariables?: InputVar[]
+  onAutoAddPromptVariable?: (variable: PromptVariable[]) => void
+}
+
+const ConversationOpener = ({
+  disabled,
+  onChange,
+  promptVariables,
+  workflowVariables,
+  onAutoAddPromptVariable,
+}: Props) => {
+  const { t } = useTranslation()
+  const { setShowOpeningModal } = useModalContext()
+  const opening = useFeatures(s => s.features.opening)
+  const featuresStore = useFeaturesStore()
+  const [isHovering, setIsHovering] = useState(false)
+  const handleOpenOpeningModal = useCallback(() => {
+    if (disabled)
+      return
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+    setShowOpeningModal({
+      payload: {
+        ...opening,
+        promptVariables,
+        workflowVariables,
+        onAutoAddPromptVariable,
+      },
+      onSaveCallback: (newOpening) => {
+        const newFeatures = produce(features, (draft) => {
+          draft.opening = newOpening
+        })
+        setFeatures(newFeatures)
+        if (onChange)
+          onChange()
+      },
+      onCancelCallback: () => {
+        if (onChange)
+          onChange()
+      },
+    })
+  }, [disabled, featuresStore, onAutoAddPromptVariable, onChange, opening, promptVariables, setShowOpeningModal])
+
+  const handleChange = useCallback((type: FeatureEnum, enabled: boolean) => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+
+    const newFeatures = produce(features, (draft) => {
+      draft[type] = {
+        ...draft[type],
+        enabled,
+      }
+    })
+    setFeatures(newFeatures)
+    if (onChange)
+      onChange()
+  }, [featuresStore, onChange])
+
+  return (
+    <FeatureCard
+      icon={
+        <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-blue-light-blue-light-500 p-1 shadow-xs'>
+          <LoveMessage className='h-4 w-4 text-text-primary-on-surface' />
+        </div>
+      }
+      title={t('appDebug.feature.conversationOpener.title')}
+      value={!!opening?.enabled}
+      onChange={state => handleChange(FeatureEnum.opening, state)}
+      onMouseEnter={() => setIsHovering(true)}
+      onMouseLeave={() => setIsHovering(false)}
+      disabled={disabled}
+    >
+      <>
+        {!opening?.enabled && (
+          <div className='system-xs-regular line-clamp-2 min-h-8 text-text-tertiary'>{t('appDebug.feature.conversationOpener.description')}</div>
+        )}
+        {!!opening?.enabled && (
+          <>
+            {!isHovering && (
+              <div className='system-xs-regular line-clamp-2 min-h-8 text-text-tertiary'>
+                {opening.opening_statement || t('appDebug.openingStatement.placeholder')}
+              </div>
+            )}
+            {isHovering && (
+              <Button className='w-full' onClick={handleOpenOpeningModal} disabled={disabled}>
+                <RiEditLine className='mr-1 h-4 w-4' />
+                {t('appDebug.openingStatement.writeOpener')}
+              </Button>
+            )}
+          </>
+        )}
+      </>
+    </FeatureCard>
+  )
+}
+
+export default ConversationOpener
diff --git a/app/components/base/features/new-feature-panel/conversation-opener/modal.tsx b/app/components/base/features/new-feature-panel/conversation-opener/modal.tsx
new file mode 100644
index 0000000..117c8a5
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/conversation-opener/modal.tsx
@@ -0,0 +1,223 @@
+import React, { useCallback, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import produce from 'immer'
+import { ReactSortable } from 'react-sortablejs'
+import { RiAddLine, RiAsterisk, RiCloseLine, RiDeleteBinLine, RiDraggable } from '@remixicon/react'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import Divider from '@/app/components/base/divider'
+import ConfirmAddVar from '@/app/components/app/configuration/config-prompt/confirm-add-var'
+import type { OpeningStatement } from '@/app/components/base/features/types'
+import { getInputKeys } from '@/app/components/base/block-input'
+import type { PromptVariable } from '@/models/debug'
+import type { InputVar } from '@/app/components/workflow/types'
+import { getNewVar } from '@/utils/var'
+import cn from '@/utils/classnames'
+import { noop } from 'lodash-es'
+
+type OpeningSettingModalProps = {
+  data: OpeningStatement
+  onSave: (newState: OpeningStatement) => void
+  onCancel: () => void
+  promptVariables?: PromptVariable[]
+  workflowVariables?: InputVar[]
+  onAutoAddPromptVariable?: (variable: PromptVariable[]) => void
+}
+
+const MAX_QUESTION_NUM = 10
+
+const OpeningSettingModal = ({
+  data,
+  onSave,
+  onCancel,
+  promptVariables = [],
+  workflowVariables = [],
+  onAutoAddPromptVariable,
+}: OpeningSettingModalProps) => {
+  const { t } = useTranslation()
+  const [tempValue, setTempValue] = useState(data?.opening_statement || '')
+  useEffect(() => {
+    setTempValue(data.opening_statement || '')
+  }, [data.opening_statement])
+  const [tempSuggestedQuestions, setTempSuggestedQuestions] = useState(data.suggested_questions || [])
+  const [isShowConfirmAddVar, { setTrue: showConfirmAddVar, setFalse: hideConfirmAddVar }] = useBoolean(false)
+  const [notIncludeKeys, setNotIncludeKeys] = useState<string[]>([])
+
+  const handleSave = useCallback((ignoreVariablesCheck?: boolean) => {
+    if (!ignoreVariablesCheck) {
+      const keys = getInputKeys(tempValue)
+      const promptKeys = promptVariables.map(item => item.key)
+      const workflowVariableKeys = workflowVariables.map(item => item.variable)
+      let notIncludeKeys: string[] = []
+
+      if (promptKeys.length === 0 && workflowVariables.length === 0) {
+        if (keys.length > 0)
+          notIncludeKeys = keys
+      }
+      else {
+        if (workflowVariables.length > 0)
+          notIncludeKeys = keys.filter(key => !workflowVariableKeys.includes(key))
+        else notIncludeKeys = keys.filter(key => !promptKeys.includes(key))
+      }
+
+      if (notIncludeKeys.length > 0) {
+        setNotIncludeKeys(notIncludeKeys)
+        showConfirmAddVar()
+        return
+      }
+    }
+    const newOpening = produce(data, (draft) => {
+      if (draft) {
+        draft.opening_statement = tempValue
+        draft.suggested_questions = tempSuggestedQuestions
+      }
+    })
+    onSave(newOpening)
+  }, [data, onSave, promptVariables, workflowVariables, showConfirmAddVar, tempSuggestedQuestions, tempValue])
+
+  const cancelAutoAddVar = useCallback(() => {
+    hideConfirmAddVar()
+    handleSave(true)
+  }, [handleSave, hideConfirmAddVar])
+
+  const autoAddVar = useCallback(() => {
+    onAutoAddPromptVariable?.([
+      ...notIncludeKeys.map(key => getNewVar(key, 'string')),
+    ])
+    hideConfirmAddVar()
+    handleSave(true)
+  }, [handleSave, hideConfirmAddVar, notIncludeKeys, onAutoAddPromptVariable])
+
+  const [focusID, setFocusID] = useState<number | null>(null)
+  const [deletingID, setDeletingID] = useState<number | null>(null)
+
+  const renderQuestions = () => {
+    return (
+      <div>
+        <div className='flex items-center py-2'>
+          <div className='flex shrink-0 space-x-0.5 text-xs font-medium leading-[18px] text-text-tertiary'>
+            <div className='uppercase'>{t('appDebug.openingStatement.openingQuestion')}</div>
+            <div>路</div>
+            <div>{tempSuggestedQuestions.length}/{MAX_QUESTION_NUM}</div>
+          </div>
+          <Divider bgStyle='gradient' className='ml-3 h-px w-0 grow'/>
+        </div>
+        <ReactSortable
+          className="space-y-1"
+          list={tempSuggestedQuestions.map((name, index) => {
+            return {
+              id: index,
+              name,
+            }
+          })}
+          setList={list => setTempSuggestedQuestions(list.map(item => item.name))}
+          handle='.handle'
+          ghostClass="opacity-50"
+          animation={150}
+        >
+          {tempSuggestedQuestions.map((question, index) => {
+            return (
+              <div
+                className={cn(
+                  'group relative flex items-center rounded-lg border border-components-panel-border-subtle bg-components-panel-on-panel-item-bg pl-2.5 hover:bg-components-panel-on-panel-item-bg-hover',
+                  focusID === index && 'border-components-input-border-active bg-components-input-bg-active hover:border-components-input-border-active hover:bg-components-input-bg-active',
+                  deletingID === index && 'border-components-input-border-destructive bg-state-destructive-hover hover:border-components-input-border-destructive hover:bg-state-destructive-hover',
+                )}
+                key={index}
+              >
+                <RiDraggable className='handle h-4 w-4 cursor-grab text-text-quaternary' />
+                <input
+                  type="input"
+                  value={question || ''}
+                  onChange={(e) => {
+                    const value = e.target.value
+                    setTempSuggestedQuestions(tempSuggestedQuestions.map((item, i) => {
+                      if (index === i)
+                        return value
+
+                      return item
+                    }))
+                  }}
+                  className={'h-9 w-full grow cursor-pointer overflow-x-auto rounded-lg border-0 bg-transparent pl-1.5 pr-8 text-sm leading-9 text-text-secondary focus:outline-none'}
+                  onFocus={() => setFocusID(index)}
+                  onBlur={() => setFocusID(null)}
+                />
+
+                <div
+                  className='absolute right-1.5 top-1/2 block translate-y-[-50%] cursor-pointer rounded-md p-1 text-text-tertiary hover:bg-state-destructive-hover hover:text-text-destructive'
+                  onClick={() => {
+                    setTempSuggestedQuestions(tempSuggestedQuestions.filter((_, i) => index !== i))
+                  }}
+                  onMouseEnter={() => setDeletingID(index)}
+                  onMouseLeave={() => setDeletingID(null)}
+                >
+                  <RiDeleteBinLine className='h-3.5 w-3.5' />
+                </div>
+              </div>
+            )
+          })}</ReactSortable>
+        {tempSuggestedQuestions.length < MAX_QUESTION_NUM && (
+          <div
+            onClick={() => { setTempSuggestedQuestions([...tempSuggestedQuestions, '']) }}
+            className='mt-1 flex h-9 cursor-pointer items-center gap-2 rounded-lg bg-components-button-tertiary-bg px-3  text-components-button-tertiary-text hover:bg-components-button-tertiary-bg-hover'>
+            <RiAddLine className='h-4 w-4' />
+            <div className='system-sm-medium text-[13px]'>{t('appDebug.variableConfig.addOption')}</div>
+          </div>
+        )}
+      </div>
+    )
+  }
+
+  return (
+    <Modal
+      isShow
+      onClose={noop}
+      className='!mt-14 !w-[640px] !max-w-none !bg-components-panel-bg-blur !p-6'
+    >
+      <div className='mb-6 flex items-center justify-between'>
+        <div className='title-2xl-semi-bold text-text-primary'>{t('appDebug.feature.conversationOpener.title')}</div>
+        <div className='cursor-pointer p-1' onClick={onCancel}><RiCloseLine className='h-4 w-4 text-text-tertiary'/></div>
+      </div>
+      <div className='mb-8 flex gap-2'>
+        <div className='mt-1.5 h-8 w-8 shrink-0 rounded-lg border-components-panel-border bg-util-colors-orange-dark-orange-dark-500 p-1.5'>
+          <RiAsterisk className='h-5 w-5 text-text-primary-on-surface' />
+        </div>
+        <div className='grow rounded-2xl border-t border-divider-subtle bg-chat-bubble-bg p-3 shadow-xs'>
+          <textarea
+            value={tempValue}
+            rows={3}
+            onChange={e => setTempValue(e.target.value)}
+            className="system-md-regular w-full border-0 bg-transparent  px-0 text-text-secondary focus:outline-none"
+            placeholder={t('appDebug.openingStatement.placeholder') as string}
+          />
+          {renderQuestions()}
+        </div>
+      </div>
+      <div className='flex items-center justify-end'>
+        <Button
+          onClick={onCancel}
+          className='mr-2'
+        >
+          {t('common.operation.cancel')}
+        </Button>
+        <Button
+          variant='primary'
+          onClick={() => handleSave()}
+        >
+          {t('common.operation.save')}
+        </Button>
+      </div>
+      {isShowConfirmAddVar && (
+        <ConfirmAddVar
+          varNameArr={notIncludeKeys}
+          onConfirm={autoAddVar}
+          onCancel={cancelAutoAddVar}
+          onHide={hideConfirmAddVar}
+        />
+      )}
+    </Modal>
+  )
+}
+
+export default OpeningSettingModal
diff --git a/app/components/base/features/new-feature-panel/dialog-wrapper.tsx b/app/components/base/features/new-feature-panel/dialog-wrapper.tsx
new file mode 100644
index 0000000..b87b635
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/dialog-wrapper.tsx
@@ -0,0 +1,55 @@
+import { Fragment, useCallback } from 'react'
+import type { ReactNode } from 'react'
+import { Dialog, DialogPanel, Transition, TransitionChild } from '@headlessui/react'
+import cn from '@/utils/classnames'
+
+type DialogProps = {
+  className?: string
+  children: ReactNode
+  show: boolean
+  onClose?: () => void
+  inWorkflow?: boolean
+}
+
+const DialogWrapper = ({
+  className,
+  children,
+  show,
+  onClose,
+  inWorkflow = true,
+}: DialogProps) => {
+  const close = useCallback(() => onClose?.(), [onClose])
+  return (
+    <Transition appear show={show} as={Fragment}>
+      <Dialog as="div" className="relative z-40" onClose={close}>
+        <TransitionChild>
+          <div className={cn(
+            'fixed inset-0 bg-black bg-opacity-25',
+            'data-[closed]:opacity-0',
+            'data-[enter]:opacity-100 data-[enter]:duration-300 data-[enter]:ease-out',
+            'data-[leave]:opacity-0 data-[leave]:duration-200 data-[leave]:ease-in',
+          )} />
+        </TransitionChild>
+
+        <div className="fixed inset-0">
+          <div className={cn('flex min-h-full flex-col items-end justify-center pb-2', inWorkflow ? 'pt-[112px]' : 'pr-2 pt-[64px]')}>
+            <TransitionChild>
+              <DialogPanel className={cn(
+                'relative flex h-0 w-[420px] grow flex-col overflow-hidden border-components-panel-border bg-components-panel-bg-alt p-0 text-left align-middle shadow-xl transition-all',
+                inWorkflow ? 'rounded-l-2xl border-b-[0.5px] border-l-[0.5px] border-t-[0.5px]' : 'rounded-2xl border-[0.5px]',
+                'data-[closed]:scale-95  data-[closed]:opacity-0',
+                'data-[enter]:scale-100 data-[enter]:opacity-100 data-[enter]:duration-300 data-[enter]:ease-out',
+                'data-[leave]:scale-95 data-[leave]:opacity-0 data-[leave]:duration-200 data-[leave]:ease-in',
+                className,
+              )}>
+                {children}
+              </DialogPanel>
+            </TransitionChild>
+          </div>
+        </div>
+      </Dialog>
+    </Transition >
+  )
+}
+
+export default DialogWrapper
diff --git a/app/components/base/features/new-feature-panel/feature-bar.tsx b/app/components/base/features/new-feature-panel/feature-bar.tsx
new file mode 100644
index 0000000..bea26d8
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/feature-bar.tsx
@@ -0,0 +1,145 @@
+import React, { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiApps2AddLine, RiArrowRightLine, RiSparklingFill } from '@remixicon/react'
+import { Citations, ContentModeration, FolderUpload, LoveMessage, MessageFast, Microphone01, TextToAudio, VirtualAssistant } from '@/app/components/base/icons/src/vender/features'
+import Button from '@/app/components/base/button'
+import Tooltip from '@/app/components/base/tooltip'
+import VoiceSettings from '@/app/components/base/features/new-feature-panel/text-to-speech/voice-settings'
+import { useFeatures } from '@/app/components/base/features/hooks'
+import cn from '@/utils/classnames'
+
+type Props = {
+  isChatMode?: boolean
+  showFileUpload?: boolean
+  disabled?: boolean
+  onFeatureBarClick?: (state: boolean) => void
+}
+
+const FeatureBar = ({
+  isChatMode = true,
+  showFileUpload = true,
+  disabled,
+  onFeatureBarClick,
+}: Props) => {
+  const { t } = useTranslation()
+  const features = useFeatures(s => s.features)
+  const [modalOpen, setModalOpen] = useState(false)
+
+  const noFeatureEnabled = useMemo(() => {
+    // completion app citation is always true but not enabled for setting
+    const data = {
+      ...features,
+      citation: { enabled: isChatMode ? features.citation?.enabled : false },
+      file: showFileUpload ? features.file! : { enabled: false },
+    }
+    return !Object.values(data).some(f => f.enabled)
+  }, [features, isChatMode, showFileUpload])
+
+  return (
+    <div className='m-1 mt-0 -translate-y-2 rounded-b-[10px] border-b border-l border-r border-components-panel-border-subtle bg-util-colors-indigo-indigo-50 px-2.5 py-2 pt-4'>
+      {noFeatureEnabled && (
+        <div className='flex cursor-pointer items-end gap-1' onClick={() => onFeatureBarClick?.(true)}>
+          <RiApps2AddLine className='h-3.5 w-3.5 text-text-accent' />
+          <div className='body-xs-medium text-text-accent'>{t('appDebug.feature.bar.empty')}</div>
+          <RiArrowRightLine className='h-3.5 w-3.5 text-text-accent' />
+        </div>
+      )}
+      {!noFeatureEnabled && (
+        <div className='flex items-center gap-2'>
+          <div className='flex shrink-0 items-center gap-0.5'>
+            {!!features.moreLikeThis?.enabled && (
+              <Tooltip
+                popupContent={t('appDebug.feature.moreLikeThis.title')}
+              >
+                <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-blue-light-blue-light-500 p-1 shadow-xs'>
+                  <RiSparklingFill className='h-3.5 w-3.5 text-text-primary-on-surface' />
+                </div>
+              </Tooltip>
+            )}
+            {!!features.opening?.enabled && (
+              <Tooltip
+                popupContent={t('appDebug.feature.conversationOpener.title')}
+              >
+                <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-blue-light-blue-light-500 p-1 shadow-xs'>
+                  <LoveMessage className='h-3.5 w-3.5 text-text-primary-on-surface' />
+                </div>
+              </Tooltip>
+            )}
+            {!!features.moderation?.enabled && (
+              <Tooltip
+                popupContent={t('appDebug.feature.moderation.title')}
+              >
+                <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-text-success p-1 shadow-xs'>
+                  <ContentModeration className='h-3.5 w-3.5 text-text-primary-on-surface' />
+                </div>
+              </Tooltip>
+            )}
+            {!!features.speech2text?.enabled && (
+              <Tooltip
+                popupContent={t('appDebug.feature.speechToText.title')}
+              >
+                <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-violet-violet-600 p-1 shadow-xs'>
+                  <Microphone01 className='h-3.5 w-3.5 text-text-primary-on-surface' />
+                </div>
+              </Tooltip>
+            )}
+            {!!features.text2speech?.enabled && (
+              <VoiceSettings placementLeft={false} open={modalOpen && !disabled} onOpen={setModalOpen}>
+                <Tooltip
+                  popupContent={t('appDebug.feature.textToSpeech.title')}
+                >
+                  <div className={cn('shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-violet-violet-600 p-1 shadow-xs', !disabled && 'cursor-pointer')}>
+                    <TextToAudio className='h-3.5 w-3.5 text-text-primary-on-surface' />
+                  </div>
+                </Tooltip>
+              </VoiceSettings>
+            )}
+            {showFileUpload && !!features.file?.enabled && (
+              <Tooltip
+                popupContent={t('appDebug.feature.fileUpload.title')}
+              >
+                <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-blue-blue-600 p-1 shadow-xs'>
+                  <FolderUpload className='h-3.5 w-3.5 text-text-primary-on-surface' />
+                </div>
+              </Tooltip>
+            )}
+            {!!features.suggested?.enabled && (
+              <Tooltip
+                popupContent={t('appDebug.feature.suggestedQuestionsAfterAnswer.title')}
+              >
+                <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-blue-light-blue-light-500 p-1 shadow-xs'>
+                  <VirtualAssistant className='h-3.5 w-3.5 text-text-primary-on-surface' />
+                </div>
+              </Tooltip>
+            )}
+            {isChatMode && !!features.citation?.enabled && (
+              <Tooltip
+                popupContent={t('appDebug.feature.citation.title')}
+              >
+                <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-warning-warning-500 p-1 shadow-xs'>
+                  <Citations className='h-4 w-4 text-text-primary-on-surface' />
+                </div>
+              </Tooltip>
+            )}
+            {isChatMode && !!features.annotationReply?.enabled && (
+              <Tooltip
+                popupContent={t('appDebug.feature.annotation.title')}
+              >
+                <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-indigo-indigo-600 p-1 shadow-xs'>
+                  <MessageFast className='h-3.5 w-3.5 text-text-primary-on-surface' />
+                </div>
+              </Tooltip>
+            )}
+          </div>
+          <div className='body-xs-regular grow text-text-tertiary'>{t('appDebug.feature.bar.enableText')}</div>
+          <Button className='shrink-0' variant='ghost-accent' size='small' onClick={() => onFeatureBarClick?.(true)}>
+            <div className='mx-1'>{t('appDebug.feature.bar.manage')}</div>
+            <RiArrowRightLine className='h-3.5 w-3.5 text-text-accent' />
+          </Button>
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default FeatureBar
diff --git a/app/components/base/features/new-feature-panel/feature-card.tsx b/app/components/base/features/new-feature-panel/feature-card.tsx
new file mode 100644
index 0000000..c895ef1
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/feature-card.tsx
@@ -0,0 +1,61 @@
+import React from 'react'
+import {
+  RiQuestionLine,
+} from '@remixicon/react'
+import Switch from '@/app/components/base/switch'
+import Tooltip from '@/app/components/base/tooltip'
+
+type Props = {
+  icon: any
+  title: any
+  tooltip?: any
+  value: any
+  description?: string
+  children?: React.ReactNode
+  disabled?: boolean
+  onChange?: (state: any) => void
+  onMouseEnter?: () => void
+  onMouseLeave?: () => void
+}
+
+const FeatureCard = ({
+  icon,
+  title,
+  tooltip,
+  value,
+  description,
+  children,
+  disabled,
+  onChange,
+  onMouseEnter,
+  onMouseLeave,
+}: Props) => {
+  return (
+    <div
+      className='mb-1 rounded-xl border-l-[0.5px] border-t-[0.5px] border-effects-highlight bg-background-section-burn p-3'
+      onMouseEnter={onMouseEnter}
+      onMouseLeave={onMouseLeave}
+    >
+      <div className='mb-2 flex items-center gap-2'>
+        {icon}
+        <div className='system-sm-semibold flex grow items-center text-text-secondary'>
+          {title}
+          {tooltip && (
+            <Tooltip
+              popupContent={tooltip}
+            >
+              <div className='ml-0.5 p-px'><RiQuestionLine className='h-3.5 w-3.5 text-text-quaternary' /></div>
+            </Tooltip>
+          )}
+        </div>
+        <Switch disabled={disabled} className='shrink-0' onChange={state => onChange?.(state)} defaultValue={value} />
+      </div>
+      {description && (
+        <div className='system-xs-regular line-clamp-2 min-h-8 text-text-tertiary'>{description}</div>
+      )}
+      {children}
+    </div>
+  )
+}
+
+export default FeatureCard
diff --git a/app/components/base/features/new-feature-panel/file-upload/index.tsx b/app/components/base/features/new-feature-panel/file-upload/index.tsx
new file mode 100644
index 0000000..1fc1bff
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/file-upload/index.tsx
@@ -0,0 +1,105 @@
+import React, { useCallback, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { RiEqualizer2Line } from '@remixicon/react'
+import { FolderUpload } from '@/app/components/base/icons/src/vender/features'
+import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card'
+import SettingModal from '@/app/components/base/features/new-feature-panel/file-upload/setting-modal'
+import Button from '@/app/components/base/button'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+import { FeatureEnum } from '@/app/components/base/features/types'
+
+type Props = {
+  disabled: boolean
+  onChange?: OnFeaturesChange
+}
+
+const FileUpload = ({
+  disabled,
+  onChange,
+}: Props) => {
+  const { t } = useTranslation()
+  const file = useFeatures(s => s.features.file)
+  const featuresStore = useFeaturesStore()
+  const [modalOpen, setModalOpen] = useState(false)
+  const [isHovering, setIsHovering] = useState(false)
+
+  const supportedTypes = useMemo(() => {
+    return file?.allowed_file_types?.join(',') || '-'
+  }, [file?.allowed_file_types])
+
+  const handleChange = useCallback((type: FeatureEnum, enabled: boolean) => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+
+    const newFeatures = produce(features, (draft) => {
+      draft[type] = {
+        ...draft[type],
+        enabled,
+        image: { enabled },
+      }
+    })
+    setFeatures(newFeatures)
+    if (onChange)
+      onChange()
+  }, [featuresStore, onChange])
+
+  return (
+    <FeatureCard
+      icon={
+        <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-blue-blue-600 p-1 shadow-xs'>
+          <FolderUpload className='h-4 w-4 text-text-primary-on-surface' />
+        </div>
+      }
+      title={t('appDebug.feature.fileUpload.title')}
+      value={file?.enabled}
+      onChange={state => handleChange(FeatureEnum.file, state)}
+      onMouseEnter={() => setIsHovering(true)}
+      onMouseLeave={() => setIsHovering(false)}
+      disabled={disabled}
+    >
+      <>
+        {!file?.enabled && (
+          <div className='system-xs-regular line-clamp-2 min-h-8 text-text-tertiary'>{t('appDebug.feature.fileUpload.description')}</div>
+        )}
+        {file?.enabled && (
+          <>
+            {!isHovering && !modalOpen && (
+              <div className='flex items-center gap-4 pt-0.5'>
+                <div className=''>
+                  <div className='system-2xs-medium-uppercase mb-0.5 text-text-tertiary'>{t('appDebug.feature.fileUpload.supportedTypes')}</div>
+                  <div className='system-xs-regular text-text-secondary'>{supportedTypes}</div>
+                </div>
+                <div className='h-[27px] w-px rotate-12 bg-divider-subtle'></div>
+                <div className=''>
+                  <div className='system-2xs-medium-uppercase mb-0.5 text-text-tertiary'>{t('appDebug.feature.fileUpload.numberLimit')}</div>
+                  <div className='system-xs-regular text-text-secondary'>{file?.number_limits}</div>
+                </div>
+              </div>
+            )}
+            {(isHovering || modalOpen) && (
+              <SettingModal
+                open={modalOpen && !disabled}
+                onOpen={(v) => {
+                  setModalOpen(v)
+                  setIsHovering(v)
+                }}
+                onChange={onChange}
+              >
+                <Button className='w-full' disabled={disabled}>
+                  <RiEqualizer2Line className='mr-1 h-4 w-4' />
+                  {t('common.operation.settings')}
+                </Button>
+              </SettingModal>
+            )}
+          </>
+        )}
+      </>
+    </FeatureCard>
+  )
+}
+
+export default FileUpload
diff --git a/app/components/base/features/new-feature-panel/file-upload/setting-content.tsx b/app/components/base/features/new-feature-panel/file-upload/setting-content.tsx
new file mode 100644
index 0000000..5a53aa4
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/file-upload/setting-content.tsx
@@ -0,0 +1,89 @@
+import React, { useCallback, useMemo, useState } from 'react'
+import produce from 'immer'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import FileUploadSetting from '@/app/components/workflow/nodes/_base/components/file-upload-setting'
+import Button from '@/app/components/base/button'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+import type { UploadFileSetting } from '@/app/components/workflow/types'
+import { SupportUploadFileTypes } from '@/app/components/workflow/types'
+import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'
+
+type SettingContentProps = {
+  imageUpload?: boolean
+  onClose: () => void
+  onChange?: OnFeaturesChange
+}
+const SettingContent = ({
+  imageUpload,
+  onClose,
+  onChange,
+}: SettingContentProps) => {
+  const { t } = useTranslation()
+  const featuresStore = useFeaturesStore()
+  const file = useFeatures(state => state.features.file)
+  const fileSettingPayload = useMemo(() => {
+    return {
+      allowed_file_upload_methods: file?.allowed_file_upload_methods || ['local_file', 'remote_url'],
+      allowed_file_types: file?.allowed_file_types || [SupportUploadFileTypes.image],
+      allowed_file_extensions: file?.allowed_file_extensions || FILE_EXTS[SupportUploadFileTypes.image],
+      max_length: file?.number_limits || 3,
+    } as UploadFileSetting
+  }, [file])
+  const [tempPayload, setTempPayload] = useState<UploadFileSetting>(fileSettingPayload)
+
+  const handleChange = useCallback(() => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+
+    const newFeatures = produce(features, (draft) => {
+      draft.file = {
+        ...draft.file,
+        allowed_file_upload_methods: tempPayload.allowed_file_upload_methods,
+        number_limits: tempPayload.max_length,
+        allowed_file_types: tempPayload.allowed_file_types,
+        allowed_file_extensions: tempPayload.allowed_file_extensions,
+      }
+    })
+
+    setFeatures(newFeatures)
+    if (onChange)
+      onChange()
+  }, [featuresStore, onChange, tempPayload])
+
+  return (
+    <>
+      <div className='mb-4 flex items-center justify-between'>
+        <div className='system-xl-semibold text-text-primary'>{!imageUpload ? t('appDebug.feature.fileUpload.modalTitle') : t('appDebug.feature.imageUpload.modalTitle')}</div>
+        <div className='cursor-pointer p-1' onClick={onClose}><RiCloseLine className='h-4 w-4 text-text-tertiary'/></div>
+      </div>
+      <FileUploadSetting
+        isMultiple
+        inFeaturePanel
+        hideSupportFileType={imageUpload}
+        payload={tempPayload}
+        onChange={(p: UploadFileSetting) => setTempPayload(p)}
+      />
+      <div className='mt-4 flex items-center justify-end'>
+        <Button
+          onClick={onClose}
+          className='mr-2'
+        >
+          {t('common.operation.cancel')}
+        </Button>
+        <Button
+          variant='primary'
+          onClick={handleChange}
+          disabled={tempPayload.allowed_file_types.length === 0}
+        >
+          {t('common.operation.save')}
+        </Button>
+      </div>
+    </>
+  )
+}
+
+export default React.memo(SettingContent)
diff --git a/app/components/base/features/new-feature-panel/file-upload/setting-modal.tsx b/app/components/base/features/new-feature-panel/file-upload/setting-modal.tsx
new file mode 100644
index 0000000..92f93b8
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/file-upload/setting-modal.tsx
@@ -0,0 +1,53 @@
+'use client'
+import { memo } from 'react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import SettingContent from '@/app/components/base/features/new-feature-panel/file-upload/setting-content'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+
+type FileUploadSettingsProps = {
+  open: boolean
+  onOpen: (state: any) => void
+  onChange?: OnFeaturesChange
+  disabled?: boolean
+  children?: React.ReactNode
+  imageUpload?: boolean
+}
+const FileUploadSettings = ({
+  open,
+  onOpen,
+  onChange,
+  disabled,
+  children,
+  imageUpload,
+}: FileUploadSettingsProps) => {
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={onOpen}
+      placement='left'
+      offset={{
+        mainAxis: 32,
+      }}
+    >
+      <PortalToFollowElemTrigger className='flex' onClick={() => !disabled && onOpen((open: boolean) => !open)}>
+        {children}
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent style={{ zIndex: 50 }}>
+        <div className='w-[360px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg p-4 shadow-2xl'>
+          <SettingContent
+            imageUpload={imageUpload}
+            onClose={() => onOpen(false)}
+            onChange={(v) => {
+              onChange?.(v)
+              onOpen(false)
+            }} />
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default memo(FileUploadSettings)
diff --git a/app/components/base/features/new-feature-panel/follow-up.tsx b/app/components/base/features/new-feature-panel/follow-up.tsx
new file mode 100644
index 0000000..a81bc94
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/follow-up.tsx
@@ -0,0 +1,56 @@
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { VirtualAssistant } from '@/app/components/base/icons/src/vender/features'
+import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+import { FeatureEnum } from '@/app/components/base/features/types'
+
+type Props = {
+  disabled?: boolean
+  onChange?: OnFeaturesChange
+}
+
+const FollowUp = ({
+  disabled,
+  onChange,
+}: Props) => {
+  const { t } = useTranslation()
+  const features = useFeatures(s => s.features)
+  const featuresStore = useFeaturesStore()
+
+  const handleChange = useCallback((type: FeatureEnum, enabled: boolean) => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+
+    const newFeatures = produce(features, (draft) => {
+      draft[type] = {
+        ...draft[type],
+        enabled,
+      }
+    })
+    setFeatures(newFeatures)
+    if (onChange)
+      onChange(newFeatures)
+  }, [featuresStore, onChange])
+
+  return (
+    <FeatureCard
+      icon={
+        <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-blue-light-blue-light-500 p-1 shadow-xs'>
+          <VirtualAssistant className='h-4 w-4 text-text-primary-on-surface' />
+        </div>
+      }
+      title={t('appDebug.feature.suggestedQuestionsAfterAnswer.title')}
+      value={!!features.suggested?.enabled}
+      description={t('appDebug.feature.suggestedQuestionsAfterAnswer.description')!}
+      onChange={state => handleChange(FeatureEnum.suggested, state)}
+      disabled={disabled}
+    />
+  )
+}
+
+export default FollowUp
diff --git a/app/components/base/features/new-feature-panel/image-upload/index.tsx b/app/components/base/features/new-feature-panel/image-upload/index.tsx
new file mode 100644
index 0000000..f09c35a
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/image-upload/index.tsx
@@ -0,0 +1,114 @@
+import React, { useCallback, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { RiEqualizer2Line, RiImage2Fill } from '@remixicon/react'
+import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card'
+import SettingModal from '@/app/components/base/features/new-feature-panel/file-upload/setting-modal'
+import Badge from '@/app/components/base/badge'
+import Button from '@/app/components/base/button'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+import { FeatureEnum } from '@/app/components/base/features/types'
+
+type Props = {
+  disabled: boolean
+  onChange?: OnFeaturesChange
+}
+
+const FileUpload = ({
+  disabled,
+  onChange,
+}: Props) => {
+  const { t } = useTranslation()
+  const file = useFeatures(s => s.features.file)
+  const featuresStore = useFeaturesStore()
+  const [modalOpen, setModalOpen] = useState(false)
+  const [isHovering, setIsHovering] = useState(false)
+
+  const supportedTypes = useMemo(() => {
+    return file?.allowed_file_types?.join(',') || '-'
+  }, [file?.allowed_file_types])
+
+  const handleChange = useCallback((type: FeatureEnum, enabled: boolean) => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+
+    const newFeatures = produce(features, (draft) => {
+      draft[type] = {
+        ...draft[type],
+        enabled,
+        image: { enabled },
+      }
+    })
+    setFeatures(newFeatures)
+    if (onChange)
+      onChange()
+  }, [featuresStore, onChange])
+
+  return (
+    <FeatureCard
+      icon={
+        <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-indigo-indigo-600 p-1 shadow-xs'>
+          <RiImage2Fill className='h-4 w-4 text-text-primary-on-surface' />
+        </div>
+      }
+      title={
+        <div className='flex items-center'>
+          {t('appDebug.feature.imageUpload.title')}
+          <Badge
+            text='LEGACY'
+            className='mx-1 shrink-0 border-text-accent-secondary text-text-accent-secondary'
+          />
+        </div>
+      }
+      value={file?.enabled}
+      onChange={state => handleChange(FeatureEnum.file, state)}
+      onMouseEnter={() => setIsHovering(true)}
+      onMouseLeave={() => setIsHovering(false)}
+      disabled={disabled}
+    >
+      <>
+        {!file?.enabled && (
+          <div className='system-xs-regular line-clamp-2 min-h-8 text-text-tertiary'>{t('appDebug.feature.imageUpload.description')}</div>
+        )}
+        {file?.enabled && (
+          <>
+            {!isHovering && !modalOpen && (
+              <div className='flex items-center gap-4 pt-0.5'>
+                <div className=''>
+                  <div className='system-2xs-medium-uppercase mb-0.5 text-text-tertiary'>{t('appDebug.feature.imageUpload.supportedTypes')}</div>
+                  <div className='system-xs-regular text-text-secondary'>{supportedTypes}</div>
+                </div>
+                <div className='h-[27px] w-px rotate-12 bg-divider-subtle'></div>
+                <div className=''>
+                  <div className='system-2xs-medium-uppercase mb-0.5 text-text-tertiary'>{t('appDebug.feature.imageUpload.numberLimit')}</div>
+                  <div className='system-xs-regular text-text-secondary'>{file?.number_limits}</div>
+                </div>
+              </div>
+            )}
+            {(isHovering || modalOpen) && (
+              <SettingModal
+                imageUpload
+                open={modalOpen && !disabled}
+                onOpen={(v) => {
+                  setModalOpen(v)
+                  setIsHovering(v)
+                }}
+                onChange={onChange}
+              >
+                <Button className='w-full' disabled={disabled}>
+                  <RiEqualizer2Line className='mr-1 h-4 w-4' />
+                  {t('common.operation.settings')}
+                </Button>
+              </SettingModal>
+            )}
+          </>
+        )}
+      </>
+    </FeatureCard>
+  )
+}
+
+export default FileUpload
diff --git a/app/components/base/features/new-feature-panel/index.tsx b/app/components/base/features/new-feature-panel/index.tsx
new file mode 100644
index 0000000..eee6805
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/index.tsx
@@ -0,0 +1,126 @@
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { RiCloseLine, RiInformation2Fill } from '@remixicon/react'
+import DialogWrapper from '@/app/components/base/features/new-feature-panel/dialog-wrapper'
+import { useDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+
+import MoreLikeThis from '@/app/components/base/features/new-feature-panel/more-like-this'
+import ConversationOpener from '@/app/components/base/features/new-feature-panel/conversation-opener'
+import FollowUp from '@/app/components/base/features/new-feature-panel/follow-up'
+import SpeechToText from '@/app/components/base/features/new-feature-panel/speech-to-text'
+import TextToSpeech from '@/app/components/base/features/new-feature-panel/text-to-speech'
+import FileUpload from '@/app/components/base/features/new-feature-panel/file-upload'
+import Citation from '@/app/components/base/features/new-feature-panel/citation'
+import ImageUpload from '@/app/components/base/features/new-feature-panel/image-upload'
+import Moderation from '@/app/components/base/features/new-feature-panel/moderation'
+import AnnotationReply from '@/app/components/base/features/new-feature-panel/annotation-reply'
+import type { PromptVariable } from '@/models/debug'
+import type { InputVar } from '@/app/components/workflow/types'
+import I18n from '@/context/i18n'
+import { LanguagesSupported } from '@/i18n/language'
+
+type Props = {
+  show: boolean
+  isChatMode: boolean
+  disabled: boolean
+  onChange?: OnFeaturesChange
+  onClose: () => void
+  inWorkflow?: boolean
+  showFileUpload?: boolean
+  promptVariables?: PromptVariable[]
+  workflowVariables?: InputVar[]
+  onAutoAddPromptVariable?: (variable: PromptVariable[]) => void
+}
+
+const NewFeaturePanel = ({
+  show,
+  isChatMode,
+  disabled,
+  onChange,
+  onClose,
+  inWorkflow = true,
+  showFileUpload = true,
+  promptVariables,
+  workflowVariables,
+  onAutoAddPromptVariable,
+}: Props) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const { data: speech2textDefaultModel } = useDefaultModel(ModelTypeEnum.speech2text)
+  const { data: text2speechDefaultModel } = useDefaultModel(ModelTypeEnum.tts)
+
+  return (
+    <DialogWrapper
+      show={show}
+      onClose={onClose}
+      inWorkflow={inWorkflow}
+    >
+      <div className='flex h-full grow flex-col'>
+        {/* header */}
+        <div className='flex shrink-0 justify-between p-4 pb-3'>
+          <div>
+            <div className='system-xl-semibold text-text-primary'>{t('workflow.common.features')}</div>
+            <div className='body-xs-regular text-text-tertiary'>{t('workflow.common.featuresDescription')}</div>
+          </div>
+          <div className='h-8 w-8 cursor-pointer p-2' onClick={onClose}><RiCloseLine className='h-4 w-4 text-text-tertiary'/></div>
+        </div>
+        {/* list */}
+        <div className='grow basis-0 overflow-y-auto px-4 pb-4'>
+          {showFileUpload && (
+            <div className='relative mb-1 rounded-xl border border-components-panel-border p-2 shadow-xs'>
+              <div className='absolute left-0 top-0 h-full w-full rounded-xl opacity-40' style={{ background: 'linear-gradient(92deg, rgba(11, 165, 236, 0.25) 18.12%, rgba(255, 255, 255, 0.00) 167.31%)' }}></div>
+              <div className='relative flex h-full w-full items-start'>
+                <div className='mr-0.5 shrink-0 p-0.5'>
+                  <RiInformation2Fill className='h-5 w-5 text-text-accent' />
+                </div>
+                <div className='system-xs-medium p-1 text-text-primary'>
+                  <span>{isChatMode ? t('workflow.common.fileUploadTip') : t('workflow.common.ImageUploadLegacyTip')}</span>
+                  <a
+                    className='text-text-accent'
+                    href={`https://docs.dify.ai/${locale === LanguagesSupported[1] ? 'v/zh-hans/' : ''}guides/workflow/bulletin`}
+                    target='_blank' rel='noopener noreferrer'
+                  >{t('workflow.common.featuresDocLink')}</a>
+                </div>
+              </div>
+            </div>
+          )}
+          {!isChatMode && !inWorkflow && (
+            <MoreLikeThis disabled={disabled} onChange={onChange} />
+          )}
+          {isChatMode && (
+            <ConversationOpener
+              disabled={disabled}
+              onChange={onChange}
+              promptVariables={promptVariables}
+              workflowVariables={workflowVariables}
+              onAutoAddPromptVariable={onAutoAddPromptVariable}
+            />
+          )}
+          {isChatMode && (
+            <FollowUp disabled={disabled} onChange={onChange} />
+          )}
+          {text2speechDefaultModel && (isChatMode || !inWorkflow) && (
+            <TextToSpeech disabled={disabled} onChange={onChange} />
+          )}
+          {isChatMode && speech2textDefaultModel && (
+            <SpeechToText disabled={disabled} onChange={onChange} />
+          )}
+          {showFileUpload && isChatMode && <FileUpload disabled={disabled} onChange={onChange} />}
+          {showFileUpload && !isChatMode && <ImageUpload disabled={disabled} onChange={onChange} />}
+          {isChatMode && (
+            <Citation disabled={disabled} onChange={onChange} />
+          )}
+          {(isChatMode || !inWorkflow) && <Moderation disabled={disabled} onChange={onChange} />}
+          {!inWorkflow && isChatMode && (
+            <AnnotationReply disabled={disabled} onChange={onChange} />
+          )}
+        </div>
+      </div>
+    </DialogWrapper>
+  )
+}
+
+export default NewFeaturePanel
diff --git a/app/components/base/features/new-feature-panel/moderation/form-generation.tsx b/app/components/base/features/new-feature-panel/moderation/form-generation.tsx
new file mode 100644
index 0000000..dccf10d
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/moderation/form-generation.tsx
@@ -0,0 +1,80 @@
+import type { FC } from 'react'
+import { useContext } from 'use-context-selector'
+import type { CodeBasedExtensionForm } from '@/models/common'
+import I18n from '@/context/i18n'
+import { PortalSelect } from '@/app/components/base/select'
+import Textarea from '@/app/components/base/textarea'
+import type { ModerationConfig } from '@/models/debug'
+
+type FormGenerationProps = {
+  forms: CodeBasedExtensionForm[]
+  value: ModerationConfig['config']
+  onChange: (v: Record<string, string>) => void
+}
+const FormGeneration: FC<FormGenerationProps> = ({
+  forms,
+  value,
+  onChange,
+}) => {
+  const { locale } = useContext(I18n)
+
+  const handleFormChange = (type: string, v: string) => {
+    onChange({ ...value, [type]: v })
+  }
+
+  return (
+    <>
+      {
+        forms.map((form, index) => (
+          <div
+            key={index}
+            className='py-2'
+          >
+            <div className='flex h-9 items-center text-sm font-medium text-text-primary'>
+              {locale === 'zh-Hans' ? form.label['zh-Hans'] : form.label['en-US']}
+            </div>
+            {
+              form.type === 'text-input' && (
+                <input
+                  value={value?.[form.variable] || ''}
+                  className='block h-9 w-full appearance-none rounded-lg bg-components-input-bg-normal px-3 text-sm text-text-primary outline-none'
+                  placeholder={form.placeholder}
+                  onChange={e => handleFormChange(form.variable, e.target.value)}
+                />
+              )
+            }
+            {
+              form.type === 'paragraph' && (
+                <div className='relative'>
+                  <Textarea
+                    className='resize-none'
+                    value={value?.[form.variable] || ''}
+                    placeholder={form.placeholder}
+                    onChange={e => handleFormChange(form.variable, e.target.value)}
+                  />
+                </div>
+              )
+            }
+            {
+              form.type === 'select' && (
+                <PortalSelect
+                  value={value?.[form.variable]}
+                  items={form.options.map((option) => {
+                    return {
+                      name: option.label[locale === 'zh-Hans' ? 'zh-Hans' : 'en-US'],
+                      value: option.value,
+                    }
+                  })}
+                  onSelect={item => handleFormChange(form.variable, item.value as string)}
+                  popupClassName='w-[576px] !z-[102]'
+                />
+              )
+            }
+          </div>
+        ))
+      }
+    </>
+  )
+}
+
+export default FormGeneration
diff --git a/app/components/base/features/new-feature-panel/moderation/index.tsx b/app/components/base/features/new-feature-panel/moderation/index.tsx
new file mode 100644
index 0000000..78f4f2d
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/moderation/index.tsx
@@ -0,0 +1,176 @@
+import React, { useCallback, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import useSWR from 'swr'
+import produce from 'immer'
+import { useContext } from 'use-context-selector'
+import { RiEqualizer2Line } from '@remixicon/react'
+import { ContentModeration } from '@/app/components/base/icons/src/vender/features'
+import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card'
+import Button from '@/app/components/base/button'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+import { FeatureEnum } from '@/app/components/base/features/types'
+import { fetchCodeBasedExtensionList } from '@/service/common'
+import { useModalContext } from '@/context/modal-context'
+import I18n from '@/context/i18n'
+
+type Props = {
+  disabled?: boolean
+  onChange?: OnFeaturesChange
+}
+
+const Moderation = ({
+  disabled,
+  onChange,
+}: Props) => {
+  const { t } = useTranslation()
+  const { setShowModerationSettingModal } = useModalContext()
+  const { locale } = useContext(I18n)
+  const featuresStore = useFeaturesStore()
+  const moderation = useFeatures(s => s.features.moderation)
+  const { data: codeBasedExtensionList } = useSWR(
+    '/code-based-extension?module=moderation',
+    fetchCodeBasedExtensionList,
+  )
+  const [isHovering, setIsHovering] = useState(false)
+
+  const handleOpenModerationSettingModal = () => {
+    if (disabled)
+      return
+
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+    setShowModerationSettingModal({
+      payload: moderation as any,
+      onSaveCallback: (newModeration) => {
+        const newFeatures = produce(features, (draft) => {
+          draft.moderation = newModeration
+        })
+        setFeatures(newFeatures)
+        if (onChange)
+          onChange(newFeatures)
+      },
+      onCancelCallback: () => {
+        if (onChange)
+          onChange()
+      },
+    })
+  }
+
+  const handleChange = useCallback((type: FeatureEnum, enabled: boolean) => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+
+    if (enabled && !features.moderation?.type && type === FeatureEnum.moderation) {
+      setShowModerationSettingModal({
+        payload: {
+          enabled: true,
+          type: 'keywords',
+          config: {
+            keywords: '',
+            inputs_config: {
+              enabled: true,
+              preset_response: '',
+            },
+          },
+        },
+        onSaveCallback: (newModeration) => {
+          const newFeatures = produce(features, (draft) => {
+            draft.moderation = newModeration
+          })
+          setFeatures(newFeatures)
+          if (onChange)
+            onChange(newFeatures)
+        },
+        onCancelCallback: () => {
+          const newFeatures = produce(features, (draft) => {
+            draft.moderation = { enabled: false }
+          })
+          setFeatures(newFeatures)
+          if (onChange)
+            onChange()
+        },
+      })
+    }
+
+    if (!enabled) {
+      const newFeatures = produce(features, (draft) => {
+        draft.moderation = { enabled: false }
+      })
+      setFeatures(newFeatures)
+      if (onChange)
+        onChange(newFeatures)
+    }
+  }, [featuresStore, onChange, setShowModerationSettingModal])
+
+  const providerContent = useMemo(() => {
+    if (moderation?.type === 'openai_moderation')
+      return t('appDebug.feature.moderation.modal.provider.openai')
+    else if (moderation?.type === 'keywords')
+      return t('appDebug.feature.moderation.modal.provider.keywords')
+    else if (moderation?.type === 'api')
+      return t('common.apiBasedExtension.selector.title')
+    else
+      return codeBasedExtensionList?.data.find(item => item.name === moderation?.type)?.label[locale] || '-'
+  }, [codeBasedExtensionList?.data, locale, moderation?.type, t])
+
+  const enableContent = useMemo(() => {
+    if (moderation?.config?.inputs_config?.enabled && moderation.config?.outputs_config?.enabled)
+      return t('appDebug.feature.moderation.allEnabled')
+    else if (moderation?.config?.inputs_config?.enabled)
+      return t('appDebug.feature.moderation.inputEnabled')
+    else if (moderation?.config?.outputs_config?.enabled)
+      return t('appDebug.feature.moderation.outputEnabled')
+  }, [moderation?.config?.inputs_config?.enabled, moderation?.config?.outputs_config?.enabled, t])
+
+  return (
+    <FeatureCard
+      icon={
+        <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-text-success p-1 shadow-xs'>
+          <ContentModeration className='h-4 w-4 text-text-primary-on-surface' />
+        </div>
+      }
+      title={t('appDebug.feature.moderation.title')}
+      value={!!moderation?.enabled}
+      onChange={state => handleChange(FeatureEnum.moderation, state)}
+      onMouseEnter={() => setIsHovering(true)}
+      onMouseLeave={() => setIsHovering(false)}
+      disabled={disabled}
+    >
+      <>
+        {!moderation?.enabled && (
+          <div className='system-xs-regular line-clamp-2 min-h-8 text-text-tertiary'>{t('appDebug.feature.moderation.description')}</div>
+        )}
+        {!!moderation?.enabled && (
+          <>
+            {!isHovering && (
+              <div className='flex items-center gap-4 pt-0.5'>
+                <div className=''>
+                  <div className='system-2xs-medium-uppercase mb-0.5 text-text-tertiary'>{t('appDebug.feature.moderation.modal.provider.title')}</div>
+                  <div className='system-xs-regular text-text-secondary'>{providerContent}</div>
+                </div>
+                <div className='h-[27px] w-px rotate-12 bg-divider-subtle'></div>
+                <div className=''>
+                  <div className='system-2xs-medium-uppercase mb-0.5 text-text-tertiary'>{t('appDebug.feature.moderation.contentEnableLabel')}</div>
+                  <div className='system-xs-regular text-text-secondary'>{enableContent}</div>
+                </div>
+              </div>
+            )}
+            {isHovering && (
+              <Button className='w-full' onClick={handleOpenModerationSettingModal} disabled={disabled}>
+                <RiEqualizer2Line className='mr-1 h-4 w-4' />
+                {t('common.operation.settings')}
+              </Button>
+            )}
+          </>
+        )}
+      </>
+    </FeatureCard>
+  )
+}
+
+export default Moderation
diff --git a/app/components/base/features/new-feature-panel/moderation/moderation-content.tsx b/app/components/base/features/new-feature-panel/moderation/moderation-content.tsx
new file mode 100644
index 0000000..9c00a7d
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/moderation/moderation-content.tsx
@@ -0,0 +1,72 @@
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import Switch from '@/app/components/base/switch'
+import type { ModerationContentConfig } from '@/models/debug'
+
+type ModerationContentProps = {
+  title: string
+  info?: string
+  showPreset?: boolean
+  config: ModerationContentConfig
+  onConfigChange: (config: ModerationContentConfig) => void
+}
+const ModerationContent: FC<ModerationContentProps> = ({
+  title,
+  info,
+  showPreset = true,
+  config,
+  onConfigChange,
+}) => {
+  const { t } = useTranslation()
+
+  const handleConfigChange = (field: string, value: boolean | string) => {
+    if (field === 'preset_response' && typeof value === 'string')
+      value = value.slice(0, 100)
+    onConfigChange({ ...config, [field]: value })
+  }
+
+  return (
+    <div className='py-2'>
+      <div className='rounded-lg border border-components-panel-border bg-components-panel-bg'>
+        <div className='flex h-10 items-center justify-between rounded-lg px-3'>
+          <div className='shrink-0 text-sm font-medium text-text-primary'>{title}</div>
+          <div className='flex grow items-center justify-end'>
+            {
+              info && (
+                <div className='mr-2 truncate text-xs text-text-tertiary' title={info}>{info}</div>
+              )
+            }
+            <Switch
+              size='l'
+              defaultValue={config.enabled}
+              onChange={v => handleConfigChange('enabled', v)}
+            />
+          </div>
+        </div>
+        {
+          config.enabled && showPreset && (
+            <div className='rounded-lg bg-components-panel-bg px-3 pb-3 pt-1'>
+              <div className='flex h-8 items-center justify-between text-[13px] font-medium text-text-secondary'>
+                {t('appDebug.feature.moderation.modal.content.preset')}
+                <span className='text-xs font-normal text-text-tertiary'>{t('appDebug.feature.moderation.modal.content.supportMarkdown')}</span>
+              </div>
+              <div className='relative h-20 rounded-lg bg-components-input-bg-normal px-3 py-2'>
+                <textarea
+                  value={config.preset_response || ''}
+                  className='block h-full w-full resize-none appearance-none bg-transparent text-sm text-text-secondary outline-none'
+                  placeholder={t('appDebug.feature.moderation.modal.content.placeholder') || ''}
+                  onChange={e => handleConfigChange('preset_response', e.target.value)}
+                />
+                <div className='absolute bottom-2 right-2 flex h-5 items-center rounded-md bg-background-section px-1 text-xs font-medium text-text-quaternary'>
+                  <span>{(config.preset_response || '').length}</span>/<span className='text-text-tertiary'>100</span>
+                </div>
+              </div>
+            </div>
+          )
+        }
+      </div>
+    </div>
+  )
+}
+
+export default ModerationContent
diff --git a/app/components/base/features/new-feature-panel/moderation/moderation-setting-modal.tsx b/app/components/base/features/new-feature-panel/moderation/moderation-setting-modal.tsx
new file mode 100644
index 0000000..ab5200f
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/moderation/moderation-setting-modal.tsx
@@ -0,0 +1,380 @@
+import type { ChangeEvent, FC } from 'react'
+import { useState } from 'react'
+import useSWR from 'swr'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import ModerationContent from './moderation-content'
+import FormGeneration from './form-generation'
+import ApiBasedExtensionSelector from '@/app/components/header/account-setting/api-based-extension-page/selector'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import Divider from '@/app/components/base/divider'
+import { BookOpen01 } from '@/app/components/base/icons/src/vender/line/education'
+import type { ModerationConfig, ModerationContentConfig } from '@/models/debug'
+import { useToastContext } from '@/app/components/base/toast'
+import {
+  fetchCodeBasedExtensionList,
+  fetchModelProviders,
+} from '@/service/common'
+import type { CodeBasedExtensionItem } from '@/models/common'
+import I18n from '@/context/i18n'
+import { LanguagesSupported } from '@/i18n/language'
+import { InfoCircle } from '@/app/components/base/icons/src/vender/line/general'
+import { useModalContext } from '@/context/modal-context'
+import { CustomConfigurationStatusEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import cn from '@/utils/classnames'
+import { noop } from 'lodash-es'
+
+const systemTypes = ['openai_moderation', 'keywords', 'api']
+
+type Provider = {
+  key: string
+  name: string
+  form_schema?: CodeBasedExtensionItem['form_schema']
+}
+
+type ModerationSettingModalProps = {
+  data: ModerationConfig
+  onCancel: () => void
+  onSave: (moderationConfig: ModerationConfig) => void
+}
+
+const ModerationSettingModal: FC<ModerationSettingModalProps> = ({
+  data,
+  onCancel,
+  onSave,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const { locale } = useContext(I18n)
+  const { data: modelProviders, isLoading, mutate } = useSWR('/workspaces/current/model-providers', fetchModelProviders)
+  const [localeData, setLocaleData] = useState<ModerationConfig>(data)
+  const { setShowAccountSettingModal } = useModalContext()
+  const handleOpenSettingsModal = () => {
+    setShowAccountSettingModal({
+      payload: 'provider',
+      onCancelCallback: () => {
+        mutate()
+      },
+    })
+  }
+  const { data: codeBasedExtensionList } = useSWR(
+    '/code-based-extension?module=moderation',
+    fetchCodeBasedExtensionList,
+  )
+  const openaiProvider = modelProviders?.data.find(item => item.provider === 'langgenius/openai/openai')
+  const systemOpenaiProviderEnabled = openaiProvider?.system_configuration.enabled
+  const systemOpenaiProviderQuota = systemOpenaiProviderEnabled ? openaiProvider?.system_configuration.quota_configurations.find(item => item.quota_type === openaiProvider.system_configuration.current_quota_type) : undefined
+  const systemOpenaiProviderCanUse = systemOpenaiProviderQuota?.is_valid
+  const customOpenaiProvidersCanUse = openaiProvider?.custom_configuration.status === CustomConfigurationStatusEnum.active
+  const isOpenAIProviderConfigured = customOpenaiProvidersCanUse || systemOpenaiProviderCanUse
+  const providers: Provider[] = [
+    {
+      key: 'openai_moderation',
+      name: t('appDebug.feature.moderation.modal.provider.openai'),
+    },
+    {
+      key: 'keywords',
+      name: t('appDebug.feature.moderation.modal.provider.keywords'),
+    },
+    {
+      key: 'api',
+      name: t('common.apiBasedExtension.selector.title'),
+    },
+    ...(
+      codeBasedExtensionList
+        ? codeBasedExtensionList.data.map((item) => {
+          return {
+            key: item.name,
+            name: locale === 'zh-Hans' ? item.label['zh-Hans'] : item.label['en-US'],
+            form_schema: item.form_schema,
+          }
+        })
+        : []
+    ),
+  ]
+
+  const currentProvider = providers.find(provider => provider.key === localeData.type)
+
+  const handleDataTypeChange = (type: string) => {
+    let config: undefined | Record<string, any>
+    const currProvider = providers.find(provider => provider.key === type)
+
+    if (systemTypes.findIndex(t => t === type) < 0 && currProvider?.form_schema) {
+      config = currProvider?.form_schema.reduce((prev, next) => {
+        prev[next.variable] = next.default
+        return prev
+      }, {} as Record<string, any>)
+    }
+    setLocaleData({
+      ...localeData,
+      type,
+      config,
+    })
+  }
+
+  const handleDataKeywordsChange = (e: ChangeEvent<HTMLTextAreaElement>) => {
+    const value = e.target.value
+
+    const arr = value.split('\n').reduce((prev: string[], next: string) => {
+      if (next !== '')
+        prev.push(next.slice(0, 100))
+      if (next === '' && prev[prev.length - 1] !== '')
+        prev.push(next)
+
+      return prev
+    }, [])
+
+    setLocaleData({
+      ...localeData,
+      config: {
+        ...localeData.config,
+        keywords: arr.slice(0, 100).join('\n'),
+      },
+    })
+  }
+
+  const handleDataContentChange = (contentType: string, contentConfig: ModerationContentConfig) => {
+    setLocaleData({
+      ...localeData,
+      config: {
+        ...localeData.config,
+        [contentType]: contentConfig,
+      },
+    })
+  }
+
+  const handleDataApiBasedChange = (apiBasedExtensionId: string) => {
+    setLocaleData({
+      ...localeData,
+      config: {
+        ...localeData.config,
+        api_based_extension_id: apiBasedExtensionId,
+      },
+    })
+  }
+
+  const handleDataExtraChange = (extraValue: Record<string, string>) => {
+    setLocaleData({
+      ...localeData,
+      config: {
+        ...localeData.config,
+        ...extraValue,
+      },
+    })
+  }
+
+  const formatData = (originData: ModerationConfig) => {
+    const { enabled, type, config } = originData
+    const { inputs_config, outputs_config } = config!
+    const params: Record<string, string | undefined> = {}
+
+    if (type === 'keywords')
+      params.keywords = config?.keywords
+
+    if (type === 'api')
+      params.api_based_extension_id = config?.api_based_extension_id
+
+    if (systemTypes.findIndex(t => t === type) < 0 && currentProvider?.form_schema) {
+      currentProvider.form_schema.forEach((form) => {
+        params[form.variable] = config?.[form.variable]
+      })
+    }
+
+    return {
+      type,
+      enabled,
+      config: {
+        inputs_config: inputs_config || { enabled: false },
+        outputs_config: outputs_config || { enabled: false },
+        ...params,
+      },
+    }
+  }
+
+  const handleSave = () => {
+    if (localeData.type === 'openai_moderation' && !isOpenAIProviderConfigured)
+      return
+
+    if (!localeData.config?.inputs_config?.enabled && !localeData.config?.outputs_config?.enabled) {
+      notify({ type: 'error', message: t('appDebug.feature.moderation.modal.content.condition') })
+      return
+    }
+
+    if (localeData.type === 'keywords' && !localeData.config.keywords) {
+      notify({ type: 'error', message: t('appDebug.errorMessage.valueOfVarRequired', { key: locale !== LanguagesSupported[1] ? 'keywords' : '鍏抽敭璇�' }) })
+      return
+    }
+
+    if (localeData.type === 'api' && !localeData.config.api_based_extension_id) {
+      notify({ type: 'error', message: t('appDebug.errorMessage.valueOfVarRequired', { key: locale !== LanguagesSupported[1] ? 'API Extension' : 'API 鎵╁睍' }) })
+      return
+    }
+
+    if (systemTypes.findIndex(t => t === localeData.type) < 0 && currentProvider?.form_schema) {
+      for (let i = 0; i < currentProvider.form_schema.length; i++) {
+        if (!localeData.config?.[currentProvider.form_schema[i].variable] && currentProvider.form_schema[i].required) {
+          notify({
+            type: 'error',
+            message: t('appDebug.errorMessage.valueOfVarRequired', { key: locale !== LanguagesSupported[1] ? currentProvider.form_schema[i].label['en-US'] : currentProvider.form_schema[i].label['zh-Hans'] }),
+          })
+          return
+        }
+      }
+    }
+
+    if (localeData.config.inputs_config?.enabled && !localeData.config.inputs_config.preset_response && localeData.type !== 'api') {
+      notify({ type: 'error', message: t('appDebug.feature.moderation.modal.content.errorMessage') })
+      return
+    }
+
+    if (localeData.config.outputs_config?.enabled && !localeData.config.outputs_config.preset_response && localeData.type !== 'api') {
+      notify({ type: 'error', message: t('appDebug.feature.moderation.modal.content.errorMessage') })
+      return
+    }
+
+    onSave(formatData(localeData))
+  }
+
+  return (
+    <Modal
+      isShow
+      onClose={noop}
+      className='!mt-14 !w-[600px] !max-w-none !p-6'
+    >
+      <div className='flex items-center justify-between'>
+        <div className='title-2xl-semi-bold text-text-primary'>{t('appDebug.feature.moderation.modal.title')}</div>
+        <div className='cursor-pointer p-1' onClick={onCancel}><RiCloseLine className='h-4 w-4 text-text-tertiary' /></div>
+      </div>
+      <div className='py-2'>
+        <div className='text-sm font-medium leading-9 text-text-primary'>
+          {t('appDebug.feature.moderation.modal.provider.title')}
+        </div>
+        <div className='grid grid-cols-3 gap-2.5'>
+          {
+            providers.map(provider => (
+              <div
+                key={provider.key}
+                className={cn(
+                  'system-sm-regular flex h-8 cursor-default items-center rounded-md border border-components-option-card-option-border bg-components-option-card-option-bg px-2 text-text-secondary',
+                  localeData.type !== provider.key && 'cursor-pointer hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs',
+                  localeData.type === provider.key && 'system-sm-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg shadow-xs',
+                  localeData.type === 'openai_moderation' && provider.key === 'openai_moderation' && !isOpenAIProviderConfigured && 'text-text-disabled',
+                )}
+                onClick={() => handleDataTypeChange(provider.key)}
+              >
+                <div className={cn(
+                  'mr-2 h-4 w-4 rounded-full border border-components-radio-border bg-components-radio-bg shadow-xs',
+                  localeData.type === provider.key && 'border-[5px] border-components-radio-border-checked',
+                )}></div>
+                {provider.name}
+              </div>
+            ))
+          }
+        </div>
+        {
+          !isLoading && !isOpenAIProviderConfigured && localeData.type === 'openai_moderation' && (
+            <div className='mt-2 flex items-center rounded-lg border border-[#FEF0C7] bg-[#FFFAEB] px-3 py-2'>
+              <InfoCircle className='mr-1 h-4 w-4 text-[#F79009]' />
+              <div className='flex items-center text-xs font-medium text-gray-700'>
+                {t('appDebug.feature.moderation.modal.openaiNotConfig.before')}
+                <span
+                  className='cursor-pointer text-primary-600'
+                  onClick={handleOpenSettingsModal}
+                >
+                  &nbsp;{t('common.settings.provider')}&nbsp;
+                </span>
+                {t('appDebug.feature.moderation.modal.openaiNotConfig.after')}
+              </div>
+            </div>
+          )
+        }
+      </div>
+      {
+        localeData.type === 'keywords' && (
+          <div className='py-2'>
+            <div className='mb-1 text-sm font-medium text-text-primary'>{t('appDebug.feature.moderation.modal.provider.keywords')}</div>
+            <div className='mb-2 text-xs text-text-tertiary'>{t('appDebug.feature.moderation.modal.keywords.tip')}</div>
+            <div className='relative h-[88px] rounded-lg bg-components-input-bg-normal px-3 py-2'>
+              <textarea
+                value={localeData.config?.keywords || ''}
+                onChange={handleDataKeywordsChange}
+                className='block h-full w-full resize-none appearance-none bg-transparent text-sm text-text-secondary outline-none'
+                placeholder={t('appDebug.feature.moderation.modal.keywords.placeholder') || ''}
+              />
+              <div className='absolute bottom-2 right-2 flex h-5 items-center rounded-md bg-background-section px-1 text-xs font-medium text-text-quaternary'>
+                <span>{(localeData.config?.keywords || '').split('\n').filter(Boolean).length}</span>/<span className='text-text-tertiary'>100 {t('appDebug.feature.moderation.modal.keywords.line')}</span>
+              </div>
+            </div>
+          </div>
+        )
+      }
+      {
+        localeData.type === 'api' && (
+          <div className='py-2'>
+            <div className='flex h-9 items-center justify-between'>
+              <div className='text-sm font-medium text-text-primary'>{t('common.apiBasedExtension.selector.title')}</div>
+              <a
+                href={t('common.apiBasedExtension.linkUrl') || '/'}
+                target='_blank' rel='noopener noreferrer'
+                className='group flex items-center text-xs text-text-tertiary hover:text-primary-600'
+              >
+                <BookOpen01 className='mr-1 h-3 w-3 text-text-tertiary group-hover:text-primary-600' />
+                {t('common.apiBasedExtension.link')}
+              </a>
+            </div>
+            <ApiBasedExtensionSelector
+              value={localeData.config?.api_based_extension_id || ''}
+              onChange={handleDataApiBasedChange}
+            />
+          </div>
+        )
+      }
+      {
+        systemTypes.findIndex(t => t === localeData.type) < 0
+        && currentProvider?.form_schema
+        && (
+          <FormGeneration
+            forms={currentProvider?.form_schema}
+            value={localeData.config}
+            onChange={handleDataExtraChange}
+          />
+        )
+      }
+      <Divider bgStyle='gradient' className='my-3 h-px' />
+      <ModerationContent
+        title={t('appDebug.feature.moderation.modal.content.input') || ''}
+        config={localeData.config?.inputs_config || { enabled: false, preset_response: '' }}
+        onConfigChange={config => handleDataContentChange('inputs_config', config)}
+        info={(localeData.type === 'api' && t('appDebug.feature.moderation.modal.content.fromApi')) || ''}
+        showPreset={localeData.type !== 'api'}
+      />
+      <ModerationContent
+        title={t('appDebug.feature.moderation.modal.content.output') || ''}
+        config={localeData.config?.outputs_config || { enabled: false, preset_response: '' }}
+        onConfigChange={config => handleDataContentChange('outputs_config', config)}
+        info={(localeData.type === 'api' && t('appDebug.feature.moderation.modal.content.fromApi')) || ''}
+        showPreset={localeData.type !== 'api'}
+      />
+      <div className='mb-8 mt-1 text-xs font-medium text-text-tertiary'>{t('appDebug.feature.moderation.modal.content.condition')}</div>
+      <div className='flex items-center justify-end'>
+        <Button
+          onClick={onCancel}
+          className='mr-2'
+        >
+          {t('common.operation.cancel')}
+        </Button>
+        <Button
+          variant='primary'
+          onClick={handleSave}
+          disabled={localeData.type === 'openai_moderation' && !isOpenAIProviderConfigured}
+        >
+          {t('common.operation.save')}
+        </Button>
+      </div>
+    </Modal>
+  )
+}
+
+export default ModerationSettingModal
diff --git a/app/components/base/features/new-feature-panel/more-like-this.tsx b/app/components/base/features/new-feature-panel/more-like-this.tsx
new file mode 100644
index 0000000..d2e2fc6
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/more-like-this.tsx
@@ -0,0 +1,57 @@
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { RiSparklingFill } from '@remixicon/react'
+import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+import { FeatureEnum } from '@/app/components/base/features/types'
+
+type Props = {
+  disabled?: boolean
+  onChange?: OnFeaturesChange
+}
+
+const MoreLikeThis = ({
+  disabled,
+  onChange,
+}: Props) => {
+  const { t } = useTranslation()
+  const features = useFeatures(s => s.features)
+  const featuresStore = useFeaturesStore()
+
+  const handleChange = useCallback((type: FeatureEnum, enabled: boolean) => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+
+    const newFeatures = produce(features, (draft) => {
+      draft[type] = {
+        ...draft[type],
+        enabled,
+      }
+    })
+    setFeatures(newFeatures)
+    if (onChange)
+      onChange()
+  }, [featuresStore, onChange])
+
+  return (
+    <FeatureCard
+      icon={
+        <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-blue-light-blue-light-500 p-1 shadow-xs'>
+          <RiSparklingFill className='h-4 w-4 text-text-primary-on-surface' />
+        </div>
+      }
+      title={t('appDebug.feature.moreLikeThis.title')}
+      tooltip={t('appDebug.feature.moreLikeThis.tip')}
+      value={!!features.moreLikeThis?.enabled}
+      description={t('appDebug.feature.moreLikeThis.description')!}
+      onChange={state => handleChange(FeatureEnum.moreLikeThis, state)}
+      disabled={disabled}
+    />
+  )
+}
+
+export default MoreLikeThis
diff --git a/app/components/base/features/new-feature-panel/speech-to-text.tsx b/app/components/base/features/new-feature-panel/speech-to-text.tsx
new file mode 100644
index 0000000..7905f8a
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/speech-to-text.tsx
@@ -0,0 +1,56 @@
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { Microphone01 } from '@/app/components/base/icons/src/vender/features'
+import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+import { FeatureEnum } from '@/app/components/base/features/types'
+
+type Props = {
+  disabled: boolean
+  onChange?: OnFeaturesChange
+}
+
+const SpeechToText = ({
+  disabled,
+  onChange,
+}: Props) => {
+  const { t } = useTranslation()
+  const features = useFeatures(s => s.features)
+  const featuresStore = useFeaturesStore()
+
+  const handleChange = useCallback((type: FeatureEnum, enabled: boolean) => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+
+    const newFeatures = produce(features, (draft) => {
+      draft[type] = {
+        ...draft[type],
+        enabled,
+      }
+    })
+    setFeatures(newFeatures)
+    if (onChange)
+      onChange()
+  }, [featuresStore, onChange])
+
+  return (
+    <FeatureCard
+      icon={
+        <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-violet-violet-600 p-1 shadow-xs'>
+          <Microphone01 className='h-4 w-4 text-text-primary-on-surface' />
+        </div>
+      }
+      title={t('appDebug.feature.speechToText.title')}
+      value={!!features.speech2text?.enabled}
+      description={t('appDebug.feature.speechToText.description')!}
+      onChange={state => handleChange(FeatureEnum.speech2text, state)}
+      disabled={disabled}
+    />
+  )
+}
+
+export default SpeechToText
diff --git a/app/components/base/features/new-feature-panel/text-to-speech/index.tsx b/app/components/base/features/new-feature-panel/text-to-speech/index.tsx
new file mode 100644
index 0000000..39f77f6
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/text-to-speech/index.tsx
@@ -0,0 +1,102 @@
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { RiEqualizer2Line } from '@remixicon/react'
+import { TextToAudio } from '@/app/components/base/icons/src/vender/features'
+import FeatureCard from '@/app/components/base/features/new-feature-panel/feature-card'
+import Button from '@/app/components/base/button'
+import VoiceSettings from '@/app/components/base/features/new-feature-panel/text-to-speech/voice-settings'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+import { FeatureEnum } from '@/app/components/base/features/types'
+import { languages } from '@/i18n/language'
+import { TtsAutoPlay } from '@/types/app'
+
+type Props = {
+  disabled: boolean
+  onChange?: OnFeaturesChange
+}
+
+const TextToSpeech = ({
+  disabled,
+  onChange,
+}: Props) => {
+  const { t } = useTranslation()
+  const textToSpeech = useFeatures(s => s.features.text2speech) // .language .voice .autoPlay
+  const languageInfo = languages.find(i => i.value === textToSpeech?.language)
+  const [modalOpen, setModalOpen] = useState(false)
+  const [isHovering, setIsHovering] = useState(false)
+  const features = useFeatures(s => s.features)
+  const featuresStore = useFeaturesStore()
+
+  const handleChange = useCallback((type: FeatureEnum, enabled: boolean) => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+
+    const newFeatures = produce(features, (draft) => {
+      draft[type] = {
+        ...draft[type],
+        enabled,
+      }
+    })
+    setFeatures(newFeatures)
+    if (onChange)
+      onChange()
+  }, [featuresStore, onChange])
+
+  return (
+    <FeatureCard
+      icon={
+        <div className='shrink-0 rounded-lg border-[0.5px] border-divider-subtle bg-util-colors-violet-violet-600 p-1 shadow-xs'>
+          <TextToAudio className='h-4 w-4 text-text-primary-on-surface' />
+        </div>
+      }
+      title={t('appDebug.feature.textToSpeech.title')}
+      value={!!features.text2speech?.enabled}
+      onChange={state => handleChange(FeatureEnum.text2speech, state)}
+      onMouseEnter={() => setIsHovering(true)}
+      onMouseLeave={() => setIsHovering(false)}
+      disabled={disabled}
+    >
+      <>
+        {!features.text2speech?.enabled && (
+          <div className='system-xs-regular line-clamp-2 min-h-8 text-text-tertiary'>{t('appDebug.feature.textToSpeech.description')}</div>
+        )}
+        {!!features.text2speech?.enabled && (
+          <>
+            {!isHovering && !modalOpen && (
+              <div className='flex items-center gap-4 pt-0.5'>
+                <div className=''>
+                  <div className='system-2xs-medium-uppercase mb-0.5 text-text-tertiary'>{t('appDebug.voice.voiceSettings.language')}</div>
+                  <div className='system-xs-regular text-text-secondary'>{languageInfo?.name || '-'}</div>
+                </div>
+                <div className='h-[27px] w-px rotate-12 bg-divider-subtle'></div>
+                <div className=''>
+                  <div className='system-2xs-medium-uppercase mb-0.5 text-text-tertiary'>{t('appDebug.voice.voiceSettings.voice')}</div>
+                  <div className='system-xs-regular text-text-secondary'>{features.text2speech?.voice || t('appDebug.voice.defaultDisplay')}</div>
+                </div>
+                <div className='h-[27px] w-px rotate-12 bg-divider-subtle'></div>
+                <div className=''>
+                  <div className='system-2xs-medium-uppercase mb-0.5 text-text-tertiary'>{t('appDebug.voice.voiceSettings.autoPlay')}</div>
+                  <div className='system-xs-regular text-text-secondary'>{features.text2speech?.autoPlay === TtsAutoPlay.enabled ? t('appDebug.voice.voiceSettings.autoPlayEnabled') : t('appDebug.voice.voiceSettings.autoPlayDisabled')}</div>
+                </div>
+              </div>
+            )}
+            {(isHovering || modalOpen) && (
+              <VoiceSettings open={modalOpen && !disabled} onOpen={setModalOpen} onChange={onChange}>
+                <Button className='w-full' disabled={disabled}>
+                  <RiEqualizer2Line className='mr-1 h-4 w-4' />
+                  {t('appDebug.voice.voiceSettings.title')}
+                </Button>
+              </VoiceSettings>
+            )}
+          </>
+        )}
+      </>
+    </FeatureCard>
+  )
+}
+
+export default TextToSpeech
diff --git a/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx b/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx
new file mode 100644
index 0000000..57659d6
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/text-to-speech/param-config-content.tsx
@@ -0,0 +1,240 @@
+'use client'
+import useSWR from 'swr'
+import produce from 'immer'
+import React, { Fragment } from 'react'
+import { usePathname } from 'next/navigation'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import { Listbox, ListboxButton, ListboxOption, ListboxOptions, Transition } from '@headlessui/react'
+import { CheckIcon, ChevronDownIcon } from '@heroicons/react/20/solid'
+import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
+import type { Item } from '@/app/components/base/select'
+import { fetchAppVoices } from '@/service/apps'
+import Tooltip from '@/app/components/base/tooltip'
+import Switch from '@/app/components/base/switch'
+import AudioBtn from '@/app/components/base/audio-btn'
+import { languages } from '@/i18n/language'
+import { TtsAutoPlay } from '@/types/app'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+import classNames from '@/utils/classnames'
+
+type VoiceParamConfigProps = {
+  onClose: () => void
+  onChange?: OnFeaturesChange
+}
+const VoiceParamConfig = ({
+  onClose,
+  onChange,
+}: VoiceParamConfigProps) => {
+  const { t } = useTranslation()
+  const pathname = usePathname()
+  const matched = pathname.match(/\/app\/([^/]+)/)
+  const appId = (matched?.length && matched[1]) ? matched[1] : ''
+  const text2speech = useFeatures(state => state.features.text2speech)
+  const featuresStore = useFeaturesStore()
+
+  let languageItem = languages.find(item => item.value === text2speech?.language)
+  if (languages && !languageItem)
+    languageItem = languages[0]
+  const localLanguagePlaceholder = languageItem?.name || t('common.placeholder.select')
+
+  const language = languageItem?.value
+  const voiceItems = useSWR({ appId, language }, fetchAppVoices).data
+  let voiceItem = voiceItems?.find(item => item.value === text2speech?.voice)
+  if (voiceItems && !voiceItem)
+    voiceItem = voiceItems[0]
+  const localVoicePlaceholder = voiceItem?.name || t('common.placeholder.select')
+
+  const handleChange = (value: Record<string, string>) => {
+    const {
+      features,
+      setFeatures,
+    } = featuresStore!.getState()
+
+    const newFeatures = produce(features, (draft) => {
+      draft.text2speech = {
+        ...draft.text2speech,
+        ...value,
+      }
+    })
+
+    setFeatures(newFeatures)
+    if (onChange)
+      onChange()
+  }
+
+  return (
+    <>
+      <div className='mb-4 flex items-center justify-between'>
+        <div className='system-xl-semibold text-text-primary'>{t('appDebug.voice.voiceSettings.title')}</div>
+        <div className='cursor-pointer p-1' onClick={onClose}><RiCloseLine className='h-4 w-4 text-text-tertiary' /></div>
+      </div>
+      <div className='mb-3'>
+        <div className='system-sm-semibold mb-1 flex items-center py-1 text-text-secondary'>
+          {t('appDebug.voice.voiceSettings.language')}
+          <Tooltip
+            popupContent={
+              <div className='w-[180px]'>
+                {t('appDebug.voice.voiceSettings.resolutionTooltip').split('\n').map(item => (
+                  <div key={item}>{item}
+                  </div>
+                ))}
+              </div>
+            }
+          />
+        </div>
+        <Listbox
+          value={languageItem}
+          onChange={(value: Item) => {
+            handleChange({
+              language: String(value.value),
+            })
+          }}
+        >
+          <div className='relative h-8'>
+            <ListboxButton
+              className={'h-full w-full cursor-pointer rounded-lg border-0 bg-components-input-bg-normal py-1.5 pl-3 pr-10 focus-visible:bg-state-base-hover focus-visible:outline-none group-hover:bg-state-base-hover sm:text-sm sm:leading-6'}>
+              <span className={classNames('block truncate text-left text-text-secondary', !languageItem?.name && 'text-text-tertiary')}>
+                {languageItem?.name ? t(`common.voice.language.${languageItem?.value.replace('-', '')}`) : localLanguagePlaceholder}
+              </span>
+              <span className="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2">
+                <ChevronDownIcon
+                  className="h-4 w-4 text-text-tertiary"
+                  aria-hidden="true"
+                />
+              </span>
+            </ListboxButton>
+            <Transition
+              as={Fragment}
+              leave="transition ease-in duration-100"
+              leaveFrom="opacity-100"
+              leaveTo="opacity-0"
+            >
+
+              <ListboxOptions
+                className="absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md border-[0.5px] border-components-panel-border bg-components-panel-bg px-1 py-1 text-base shadow-lg focus:outline-none sm:text-sm">
+                {languages.map((item: Item) => (
+                  <ListboxOption
+                    key={item.value}
+                    className={
+                      'relative cursor-pointer select-none rounded-lg py-2 pl-3 pr-9 text-text-secondary hover:bg-state-base-hover data-[active]:bg-state-base-active'
+                    }
+                    value={item}
+                    disabled={false}
+                  >
+                    {({ /* active, */ selected }) => (
+                      <>
+                        <span
+                          className={classNames('block', selected && 'font-normal')}>{t(`common.voice.language.${(item.value).toString().replace('-', '')}`)}</span>
+                        {(selected || item.value === text2speech?.language) && (
+                          <span
+                            className={classNames(
+                              'absolute inset-y-0 right-0 flex items-center pr-4 text-text-secondary',
+                            )}
+                          >
+                            <CheckIcon className="h-4 w-4" aria-hidden="true" />
+                          </span>
+                        )}
+                      </>
+                    )}
+                  </ListboxOption>
+                ))}
+              </ListboxOptions>
+            </Transition>
+          </div>
+        </Listbox>
+      </div>
+      <div className='mb-3'>
+        <div className='system-sm-semibold mb-1 py-1 text-text-secondary'>
+          {t('appDebug.voice.voiceSettings.voice')}
+        </div>
+        <div className='flex items-center gap-1'>
+          <Listbox
+            value={voiceItem ?? {}}
+            disabled={!languageItem}
+            onChange={(value: Item) => {
+              handleChange({
+                voice: String(value.value),
+              })
+            }}
+          >
+            <div className={'relative h-8 grow'}>
+              <ListboxButton
+                className={'h-full w-full cursor-pointer rounded-lg border-0 bg-components-input-bg-normal py-1.5 pl-3 pr-10 focus-visible:bg-state-base-hover focus-visible:outline-none group-hover:bg-state-base-hover sm:text-sm sm:leading-6'}>
+                <span
+                  className={classNames('block truncate text-left text-text-secondary', !voiceItem?.name && 'text-text-tertiary')}>{voiceItem?.name ?? localVoicePlaceholder}</span>
+                <span className="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2">
+                  <ChevronDownIcon
+                    className="h-4 w-4 text-text-tertiary"
+                    aria-hidden="true"
+                  />
+                </span>
+              </ListboxButton>
+              <Transition
+                as={Fragment}
+                leave="transition ease-in duration-100"
+                leaveFrom="opacity-100"
+                leaveTo="opacity-0"
+              >
+
+                <ListboxOptions
+                  className="absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md border-[0.5px] border-components-panel-border bg-components-panel-bg px-1 py-1 text-base shadow-lg focus:outline-none sm:text-sm">
+                  {voiceItems?.map((item: Item) => (
+                    <ListboxOption
+                      key={item.value}
+                      className={
+                        'relative cursor-pointer select-none rounded-lg py-2 pl-3 pr-9 text-text-secondary hover:bg-state-base-hover data-[active]:bg-state-base-active'
+                      }
+                      value={item}
+                      disabled={false}
+                    >
+                      {({ /* active, */ selected }) => (
+                        <>
+                          <span className={classNames('block', selected && 'font-normal')}>{item.name}</span>
+                          {(selected || item.value === text2speech?.voice) && (
+                            <span
+                              className={classNames(
+                                'absolute inset-y-0 right-0 flex items-center pr-4 text-text-secondary',
+                              )}
+                            >
+                              <CheckIcon className="h-4 w-4" aria-hidden="true" />
+                            </span>
+                          )}
+                        </>
+                      )}
+                    </ListboxOption>
+                  ))}
+                </ListboxOptions>
+              </Transition>
+            </div>
+          </Listbox>
+          {languageItem?.example && (
+            <div className='h-8 shrink-0 rounded-lg bg-components-button-tertiary-bg p-1'>
+              <AudioBtn
+                value={languageItem?.example}
+                isAudition
+                voice={text2speech?.voice}
+                noCache
+              />
+            </div>
+          )}
+        </div>
+      </div>
+      <div>
+        <div className='system-sm-semibold mb-1 py-1 text-text-secondary'>
+          {t('appDebug.voice.voiceSettings.autoPlay')}
+        </div>
+        <Switch className='shrink-0'
+          defaultValue={text2speech?.autoPlay === TtsAutoPlay.enabled}
+          onChange={(value: boolean) => {
+            handleChange({
+              autoPlay: value ? TtsAutoPlay.enabled : TtsAutoPlay.disabled,
+            })
+          }}
+        />
+      </div>
+    </>
+  )
+}
+
+export default React.memo(VoiceParamConfig)
diff --git a/app/components/base/features/new-feature-panel/text-to-speech/voice-settings.tsx b/app/components/base/features/new-feature-panel/text-to-speech/voice-settings.tsx
new file mode 100644
index 0000000..3c77897
--- /dev/null
+++ b/app/components/base/features/new-feature-panel/text-to-speech/voice-settings.tsx
@@ -0,0 +1,47 @@
+'use client'
+import { memo } from 'react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import ParamConfigContent from '@/app/components/base/features/new-feature-panel/text-to-speech/param-config-content'
+import type { OnFeaturesChange } from '@/app/components/base/features/types'
+
+type VoiceSettingsProps = {
+  open: boolean
+  onOpen: (state: any) => void
+  onChange?: OnFeaturesChange
+  disabled?: boolean
+  children?: React.ReactNode
+  placementLeft?: boolean
+}
+const VoiceSettings = ({
+  open,
+  onOpen,
+  onChange,
+  disabled,
+  children,
+  placementLeft = true,
+}: VoiceSettingsProps) => {
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={onOpen}
+      placement={placementLeft ? 'left' : 'top'}
+      offset={{
+        mainAxis: placementLeft ? 32 : 4,
+      }}
+    >
+      <PortalToFollowElemTrigger className='flex' onClick={() => !disabled && onOpen((open: boolean) => !open)}>
+        {children}
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent style={{ zIndex: 50 }}>
+        <div className='w-[360px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg p-4 shadow-2xl'>
+          <ParamConfigContent onClose={() => onOpen(false)} onChange={onChange} />
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default memo(VoiceSettings)
diff --git a/app/components/base/features/store.ts b/app/components/base/features/store.ts
new file mode 100644
index 0000000..2b8c3f7
--- /dev/null
+++ b/app/components/base/features/store.ts
@@ -0,0 +1,66 @@
+import { createStore } from 'zustand'
+import type { Features } from './types'
+import { Resolution, TransferMethod } from '@/types/app'
+
+export type FeaturesModal = {
+  showFeaturesModal: boolean
+  setShowFeaturesModal: (showFeaturesModal: boolean) => void
+}
+
+export type FeaturesState = {
+  features: Features
+}
+
+export type FeaturesAction = {
+  setFeatures: (features: Features) => void
+}
+
+export type FeatureStoreState = FeaturesState & FeaturesAction & FeaturesModal
+
+export type FeaturesStore = ReturnType<typeof createFeaturesStore>
+
+export const createFeaturesStore = (initProps?: Partial<FeaturesState>) => {
+  const DEFAULT_PROPS: FeaturesState = {
+    features: {
+      moreLikeThis: {
+        enabled: false,
+      },
+      opening: {
+        enabled: false,
+      },
+      suggested: {
+        enabled: false,
+      },
+      text2speech: {
+        enabled: false,
+      },
+      speech2text: {
+        enabled: false,
+      },
+      citation: {
+        enabled: false,
+      },
+      moderation: {
+        enabled: false,
+      },
+      file: {
+        image: {
+          enabled: false,
+          detail: Resolution.high,
+          number_limits: 3,
+          transfer_methods: [TransferMethod.local_file, TransferMethod.remote_url],
+        },
+      },
+      annotationReply: {
+        enabled: false,
+      },
+    },
+  }
+  return createStore<FeatureStoreState>()(set => ({
+    ...DEFAULT_PROPS,
+    ...initProps,
+    setFeatures: features => set(() => ({ features })),
+    showFeaturesModal: false,
+    setShowFeaturesModal: showFeaturesModal => set(() => ({ showFeaturesModal })),
+  }))
+}
diff --git a/app/components/base/features/types.ts b/app/components/base/features/types.ts
new file mode 100644
index 0000000..83f8763
--- /dev/null
+++ b/app/components/base/features/types.ts
@@ -0,0 +1,79 @@
+import type { Resolution, TransferMethod, TtsAutoPlay } from '@/types/app'
+import type { FileUploadConfigResponse } from '@/models/common'
+
+export type EnabledOrDisabled = {
+  enabled?: boolean
+}
+
+export type MoreLikeThis = EnabledOrDisabled
+
+export type OpeningStatement = EnabledOrDisabled & {
+  opening_statement?: string
+  suggested_questions?: string[]
+}
+
+export type SuggestedQuestionsAfterAnswer = EnabledOrDisabled
+
+export type TextToSpeech = EnabledOrDisabled & {
+  language?: string
+  voice?: string
+  autoPlay?: TtsAutoPlay
+}
+
+export type SpeechToText = EnabledOrDisabled
+
+export type RetrieverResource = EnabledOrDisabled
+
+export type SensitiveWordAvoidance = EnabledOrDisabled & {
+  type?: string
+  config?: any
+}
+
+export type FileUpload = {
+  image?: EnabledOrDisabled & {
+    detail?: Resolution
+    number_limits?: number
+    transfer_methods?: TransferMethod[]
+  }
+  allowed_file_types?: string[]
+  allowed_file_extensions?: string[]
+  allowed_file_upload_methods?: TransferMethod[]
+  number_limits?: number
+  fileUploadConfig?: FileUploadConfigResponse
+} & EnabledOrDisabled
+
+export type AnnotationReplyConfig = {
+  enabled: boolean
+  id?: string
+  score_threshold?: number
+  embedding_model?: {
+    embedding_provider_name: string
+    embedding_model_name: string
+  }
+}
+
+export enum FeatureEnum {
+  moreLikeThis = 'moreLikeThis',
+  opening = 'opening',
+  suggested = 'suggested',
+  text2speech = 'text2speech',
+  speech2text = 'speech2text',
+  citation = 'citation',
+  moderation = 'moderation',
+  file = 'file',
+  annotationReply = 'annotationReply',
+}
+
+export type Features = {
+  [FeatureEnum.moreLikeThis]?: MoreLikeThis
+  [FeatureEnum.opening]?: OpeningStatement
+  [FeatureEnum.suggested]?: SuggestedQuestionsAfterAnswer
+  [FeatureEnum.text2speech]?: TextToSpeech
+  [FeatureEnum.speech2text]?: SpeechToText
+  [FeatureEnum.citation]?: RetrieverResource
+  [FeatureEnum.moderation]?: SensitiveWordAvoidance
+  [FeatureEnum.file]?: FileUpload
+  [FeatureEnum.annotationReply]?: AnnotationReplyConfig
+}
+
+export type OnFeaturesChange = (features?: Features) => void
diff --git a/app/components/base/file-icon/index.tsx b/app/components/base/file-icon/index.tsx
new file mode 100644
index 0000000..6b217b1
--- /dev/null
+++ b/app/components/base/file-icon/index.tsx
@@ -0,0 +1,55 @@
+import type { FC } from 'react'
+import {
+  Csv,
+  Doc,
+  Docx,
+  Html,
+  Json,
+  Md,
+  Pdf,
+  Txt,
+  Unknown,
+  Xlsx,
+} from '@/app/components/base/icons/src/public/files'
+import { Notion } from '@/app/components/base/icons/src/public/common'
+
+type FileIconProps = {
+  type: string
+  className?: string
+}
+
+const FileIcon: FC<FileIconProps> = ({
+  type,
+  className,
+}) => {
+  switch (type) {
+    case 'csv':
+      return <Csv className={className} />
+    case 'doc':
+      return <Doc className={className} />
+    case 'docx':
+      return <Docx className={className} />
+    case 'htm':
+    case 'html':
+      return <Html className={className} />
+    case 'json':
+      return <Json className={className} />
+    case 'md':
+    case 'markdown':
+    case 'mdx':
+      return <Md className={className} />
+    case 'pdf':
+      return <Pdf className={className} />
+    case 'txt':
+      return <Txt className={className} />
+    case 'xls':
+    case 'xlsx':
+      return <Xlsx className={className} />
+    case 'notion':
+      return <Notion className={className} />
+    default:
+      return <Unknown className={className} />
+  }
+}
+
+export default FileIcon
diff --git a/app/components/base/file-uploader/audio-preview.tsx b/app/components/base/file-uploader/audio-preview.tsx
new file mode 100644
index 0000000..22d244a
--- /dev/null
+++ b/app/components/base/file-uploader/audio-preview.tsx
@@ -0,0 +1,46 @@
+import type { FC } from 'react'
+import { createPortal } from 'react-dom'
+import { RiCloseLine } from '@remixicon/react'
+import React from 'react'
+
+import { useHotkeys } from 'react-hotkeys-hook'
+
+type AudioPreviewProps = {
+  url: string
+  title: string
+  onCancel: () => void
+}
+const AudioPreview: FC<AudioPreviewProps> = ({
+  url,
+  title,
+  onCancel,
+}) => {
+  useHotkeys('esc', onCancel)
+
+  return createPortal(
+    <div
+      className='fixed inset-0 z-[1000] flex items-center justify-center bg-black/80 p-8'
+      onClick={e => e.stopPropagation()}
+      tabIndex={-1}
+    >
+      <div>
+        <audio controls title={title} autoPlay={false} preload="metadata">
+          <source
+            type="audio/mpeg"
+            src={url}
+            className='max-h-full max-w-full'
+          />
+        </audio>
+      </div>
+      <div
+        className='absolute right-6 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg bg-white/[0.08] backdrop-blur-[2px]'
+        onClick={onCancel}
+      >
+        <RiCloseLine className='h-4 w-4 text-gray-500'/>
+      </div>
+    </div>,
+    document.body,
+  )
+}
+
+export default AudioPreview
diff --git a/app/components/base/file-uploader/constants.ts b/app/components/base/file-uploader/constants.ts
new file mode 100644
index 0000000..a749d73
--- /dev/null
+++ b/app/components/base/file-uploader/constants.ts
@@ -0,0 +1,8 @@
+// fallback for file size limit of dify_config
+export const IMG_SIZE_LIMIT = 10 * 1024 * 1024
+export const FILE_SIZE_LIMIT = 15 * 1024 * 1024
+export const AUDIO_SIZE_LIMIT = 50 * 1024 * 1024
+export const VIDEO_SIZE_LIMIT = 100 * 1024 * 1024
+export const MAX_FILE_UPLOAD_LIMIT = 10
+
+export const FILE_URL_REGEX = /^(https?|ftp):\/\//
diff --git a/app/components/base/file-uploader/dynamic-pdf-preview.tsx b/app/components/base/file-uploader/dynamic-pdf-preview.tsx
new file mode 100644
index 0000000..116db89
--- /dev/null
+++ b/app/components/base/file-uploader/dynamic-pdf-preview.tsx
@@ -0,0 +1,17 @@
+'use client'
+
+import dynamic from 'next/dynamic'
+
+type DynamicPdfPreviewProps = {
+  url: string
+  onCancel: () => void
+}
+const DynamicPdfPreview = dynamic<DynamicPdfPreviewProps>(
+  (() => {
+    if (typeof window !== 'undefined')
+      return import('./pdf-preview')
+  }) as any,
+  { ssr: false }, // This will prevent the module from being loaded on the server-side
+)
+
+export default DynamicPdfPreview
diff --git a/app/components/base/file-uploader/file-from-link-or-local/index.tsx b/app/components/base/file-uploader/file-from-link-or-local/index.tsx
new file mode 100644
index 0000000..4f11923
--- /dev/null
+++ b/app/components/base/file-uploader/file-from-link-or-local/index.tsx
@@ -0,0 +1,129 @@
+import {
+  memo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiUploadCloud2Line } from '@remixicon/react'
+import FileInput from '../file-input'
+import { useFile } from '../hooks'
+import { useStore } from '../store'
+import { FILE_URL_REGEX } from '../constants'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Button from '@/app/components/base/button'
+import type { FileUpload } from '@/app/components/base/features/types'
+import cn from '@/utils/classnames'
+
+type FileFromLinkOrLocalProps = {
+  showFromLink?: boolean
+  showFromLocal?: boolean
+  trigger: (open: boolean) => React.ReactNode
+  fileConfig: FileUpload
+}
+const FileFromLinkOrLocal = ({
+  showFromLink = true,
+  showFromLocal = true,
+  trigger,
+  fileConfig,
+}: FileFromLinkOrLocalProps) => {
+  const { t } = useTranslation()
+  const files = useStore(s => s.files)
+  const [open, setOpen] = useState(false)
+  const [url, setUrl] = useState('')
+  const [showError, setShowError] = useState(false)
+  const { handleLoadFileFromLink } = useFile(fileConfig)
+  const disabled = !!fileConfig.number_limits && files.length >= fileConfig.number_limits
+
+  const handleSaveUrl = () => {
+    if (!url)
+      return
+
+    if (!FILE_URL_REGEX.test(url)) {
+      setShowError(true)
+      return
+    }
+    handleLoadFileFromLink(url)
+    setUrl('')
+  }
+
+  return (
+    <PortalToFollowElem
+      placement='top'
+      offset={4}
+      open={open}
+      onOpenChange={setOpen}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)} asChild>
+        {trigger(open)}
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[1001]'>
+        <div className='w-[280px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-3 shadow-lg'>
+          {
+            showFromLink && (
+              <>
+                <div className={cn(
+                  'flex h-8 items-center rounded-lg border border-components-input-border-active bg-components-input-bg-active p-1 shadow-xs',
+                  showError && 'border-components-input-border-destructive',
+                )}>
+                  <input
+                    className='system-sm-regular mr-0.5 block grow appearance-none bg-transparent px-1 outline-none'
+                    placeholder={t('common.fileUploader.pasteFileLinkInputPlaceholder') || ''}
+                    value={url}
+                    onChange={(e) => {
+                      setShowError(false)
+                      setUrl(e.target.value.trim())
+                    }}
+                    disabled={disabled}
+                  />
+                  <Button
+                    className='shrink-0'
+                    size='small'
+                    variant='primary'
+                    disabled={!url || disabled}
+                    onClick={handleSaveUrl}
+                  >
+                    {t('common.operation.ok')}
+                  </Button>
+                </div>
+                {
+                  showError && (
+                    <div className='body-xs-regular mt-0.5 text-text-destructive'>
+                      {t('common.fileUploader.pasteFileLinkInvalid')}
+                    </div>
+                  )
+                }
+              </>
+            )
+          }
+          {
+            showFromLink && showFromLocal && (
+              <div className='system-2xs-medium-uppercase flex h-7 items-center p-2 text-text-quaternary'>
+                <div className='mr-2 h-[1px] w-[93px] bg-gradient-to-l from-[rgba(16,24,40,0.08)]' />
+                OR
+                <div className='ml-2 h-[1px] w-[93px] bg-gradient-to-r from-[rgba(16,24,40,0.08)]' />
+              </div>
+            )
+          }
+          {
+            showFromLocal && (
+              <Button
+                className='relative w-full'
+                variant='secondary-accent'
+                disabled={disabled}
+              >
+                <RiUploadCloud2Line className='mr-1 h-4 w-4' />
+                {t('common.fileUploader.uploadFromComputer')}
+                <FileInput fileConfig={fileConfig} />
+              </Button>
+            )
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default memo(FileFromLinkOrLocal)
diff --git a/app/components/base/file-uploader/file-image-render.tsx b/app/components/base/file-uploader/file-image-render.tsx
new file mode 100644
index 0000000..d613505
--- /dev/null
+++ b/app/components/base/file-uploader/file-image-render.tsx
@@ -0,0 +1,32 @@
+import cn from '@/utils/classnames'
+
+type FileImageRenderProps = {
+  imageUrl: string
+  className?: string
+  alt?: string
+  onLoad?: () => void
+  onError?: () => void
+  showDownloadAction?: boolean
+}
+const FileImageRender = ({
+  imageUrl,
+  className,
+  alt,
+  onLoad,
+  onError,
+  showDownloadAction,
+}: FileImageRenderProps) => {
+  return (
+    <div className={cn('border-[2px] border-effects-image-frame shadow-xs', className)}>
+      <img
+        className={cn('h-full w-full object-cover', showDownloadAction && 'cursor-pointer')}
+        alt={alt || 'Preview'}
+        onLoad={onLoad}
+        onError={onError}
+        src={imageUrl}
+      />
+    </div>
+  )
+}
+
+export default FileImageRender
diff --git a/app/components/base/file-uploader/file-input.tsx b/app/components/base/file-uploader/file-input.tsx
new file mode 100644
index 0000000..ba3bade
--- /dev/null
+++ b/app/components/base/file-uploader/file-input.tsx
@@ -0,0 +1,49 @@
+import { useFile } from './hooks'
+import { useStore } from './store'
+import type { FileUpload } from '@/app/components/base/features/types'
+import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'
+import { SupportUploadFileTypes } from '@/app/components/workflow/types'
+
+type FileInputProps = {
+  fileConfig: FileUpload
+}
+const FileInput = ({
+  fileConfig,
+}: FileInputProps) => {
+  const files = useStore(s => s.files)
+  const { handleLocalFileUpload } = useFile(fileConfig)
+  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+    const targetFiles = e.target.files
+
+    if (targetFiles) {
+      if (fileConfig.number_limits) {
+        for (let i = 0; i < targetFiles.length; i++) {
+          if (i + 1 + files.length <= fileConfig.number_limits)
+            handleLocalFileUpload(targetFiles[i])
+        }
+      }
+      else {
+        handleLocalFileUpload(targetFiles[0])
+      }
+    }
+  }
+
+  const allowedFileTypes = fileConfig.allowed_file_types
+  const isCustom = allowedFileTypes?.includes(SupportUploadFileTypes.custom)
+  const exts = isCustom ? (fileConfig.allowed_file_extensions || []) : (allowedFileTypes?.map(type => FILE_EXTS[type]) || []).flat().map(item => `.${item}`)
+  const accept = exts.join(',')
+
+  return (
+    <input
+      className='absolute inset-0 block w-full cursor-pointer text-[0] opacity-0 disabled:cursor-not-allowed'
+      onClick={e => ((e.target as HTMLInputElement).value = '')}
+      type='file'
+      onChange={handleChange}
+      accept={accept}
+      disabled={!!(fileConfig.number_limits && files.length >= fileConfig?.number_limits)}
+      multiple={!!fileConfig.number_limits && fileConfig.number_limits > 1}
+    />
+  )
+}
+
+export default FileInput
diff --git a/app/components/base/file-uploader/file-list-in-log.tsx b/app/components/base/file-uploader/file-list-in-log.tsx
new file mode 100644
index 0000000..c28b41e
--- /dev/null
+++ b/app/components/base/file-uploader/file-list-in-log.tsx
@@ -0,0 +1,106 @@
+import React, { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowRightSLine } from '@remixicon/react'
+import FileImageRender from './file-image-render'
+import FileTypeIcon from './file-type-icon'
+import FileItem from './file-uploader-in-attachment/file-item'
+import type { FileEntity } from './types'
+import {
+  getFileAppearanceType,
+} from './utils'
+import Tooltip from '@/app/components/base/tooltip'
+import { SupportUploadFileTypes } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+
+type Props = {
+  fileList: {
+    varName: string
+    list: FileEntity[]
+  }[]
+  isExpanded?: boolean
+  noBorder?: boolean
+  noPadding?: boolean
+}
+
+const FileListInLog = ({ fileList, isExpanded = false, noBorder = false, noPadding = false }: Props) => {
+  const { t } = useTranslation()
+  const [expanded, setExpanded] = useState(isExpanded)
+  const fullList = useMemo(() => {
+    return fileList.reduce((acc: FileEntity[], { list }) => {
+      return [...acc, ...list]
+    }, [])
+  }, [fileList])
+
+  if (!fileList.length)
+    return null
+
+  return (
+    <div className={cn('px-3 py-2', expanded && 'py-3', !noBorder && 'border-t border-divider-subtle', noPadding && '!p-0')}>
+      <div className='flex justify-between gap-1'>
+        {expanded && (
+          <div className='system-xs-semibold-uppercase grow cursor-pointer py-1 text-text-secondary' onClick={() => setExpanded(!expanded)}>{t('appLog.runDetail.fileListLabel')}</div>
+        )}
+        {!expanded && (
+          <div className='flex gap-1'>
+            {fullList.map((file) => {
+              const { id, name, type, supportFileType, base64Url, url } = file
+              const isImageFile = supportFileType === SupportUploadFileTypes.image
+              return (
+                <>
+                  {isImageFile && (
+                    <Tooltip
+                      popupContent={name}
+                    >
+                      <div key={id}>
+                        <FileImageRender
+                          className='h-8 w-8'
+                          imageUrl={base64Url || url || ''}
+                        />
+                      </div>
+                    </Tooltip>
+                  )}
+                  {!isImageFile && (
+                    <Tooltip
+                      popupContent={name}
+                    >
+                      <div key={id} className='rounded-md border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg p-1.5 shadow-xs'>
+                        <FileTypeIcon
+                          type={getFileAppearanceType(name, type)}
+                          size='md'
+                        />
+                      </div>
+                    </Tooltip>
+                  )}
+                </>
+              )
+            })}
+          </div>
+        )}
+        <div className='flex cursor-pointer items-center gap-1' onClick={() => setExpanded(!expanded)}>
+          {!expanded && <div className='system-xs-medium-uppercase text-text-tertiary'>{t('appLog.runDetail.fileListDetail')}</div>}
+          <RiArrowRightSLine className={cn('h-4 w-4 text-text-tertiary', expanded && 'rotate-90')} />
+        </div>
+      </div>
+      {expanded && (
+        <div className='flex flex-col gap-3'>
+          {fileList.map(item => (
+            <div key={item.varName} className='system-xs-regular flex flex-col gap-1'>
+              <div className='py-1 text-text-tertiary '>{item.varName}</div>
+              {item.list.map(file => (
+                <FileItem
+                  key={file.id}
+                  file={file}
+                  showDeleteAction={false}
+                  showDownloadAction
+                  canPreview
+                />
+              ))}
+            </div>
+          ))}
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default FileListInLog
diff --git a/app/components/base/file-uploader/file-type-icon.tsx b/app/components/base/file-uploader/file-type-icon.tsx
new file mode 100644
index 0000000..08d0131
--- /dev/null
+++ b/app/components/base/file-uploader/file-type-icon.tsx
@@ -0,0 +1,91 @@
+import { memo } from 'react'
+import {
+  RiFile3Fill,
+  RiFileCodeFill,
+  RiFileExcelFill,
+  RiFileGifFill,
+  RiFileImageFill,
+  RiFileMusicFill,
+  RiFilePdf2Fill,
+  RiFilePpt2Fill,
+  RiFileTextFill,
+  RiFileVideoFill,
+  RiFileWordFill,
+  RiMarkdownFill,
+} from '@remixicon/react'
+import { FileAppearanceTypeEnum } from './types'
+import type { FileAppearanceType } from './types'
+import cn from '@/utils/classnames'
+
+const FILE_TYPE_ICON_MAP = {
+  [FileAppearanceTypeEnum.pdf]: {
+    component: RiFilePdf2Fill,
+    color: 'text-[#EA3434]',
+  },
+  [FileAppearanceTypeEnum.image]: {
+    component: RiFileImageFill,
+    color: 'text-[#00B2EA]',
+  },
+  [FileAppearanceTypeEnum.video]: {
+    component: RiFileVideoFill,
+    color: 'text-[#844FDA]',
+  },
+  [FileAppearanceTypeEnum.audio]: {
+    component: RiFileMusicFill,
+    color: 'text-[#FF3093]',
+  },
+  [FileAppearanceTypeEnum.document]: {
+    component: RiFileTextFill,
+    color: 'text-[#6F8BB5]',
+  },
+  [FileAppearanceTypeEnum.code]: {
+    component: RiFileCodeFill,
+    color: 'text-[#BCC0D1]',
+  },
+  [FileAppearanceTypeEnum.markdown]: {
+    component: RiMarkdownFill,
+    color: 'text-[#309BEC]',
+  },
+  [FileAppearanceTypeEnum.custom]: {
+    component: RiFile3Fill,
+    color: 'text-[#BCC0D1]',
+  },
+  [FileAppearanceTypeEnum.excel]: {
+    component: RiFileExcelFill,
+    color: 'text-[#01AC49]',
+  },
+  [FileAppearanceTypeEnum.word]: {
+    component: RiFileWordFill,
+    color: 'text-[#2684FF]',
+  },
+  [FileAppearanceTypeEnum.ppt]: {
+    component: RiFilePpt2Fill,
+    color: 'text-[#FF650F]',
+  },
+  [FileAppearanceTypeEnum.gif]: {
+    component: RiFileGifFill,
+    color: 'text-[#00B2EA]',
+  },
+}
+type FileTypeIconProps = {
+  type: FileAppearanceType
+  size?: 'sm' | 'lg' | 'md'
+  className?: string
+}
+const SizeMap = {
+  sm: 'w-4 h-4',
+  md: 'w-5 h-5',
+  lg: 'w-6 h-6',
+}
+const FileTypeIcon = ({
+  type,
+  size = 'sm',
+  className,
+}: FileTypeIconProps) => {
+  const Icon = FILE_TYPE_ICON_MAP[type]?.component || FILE_TYPE_ICON_MAP[FileAppearanceTypeEnum.document].component
+  const color = FILE_TYPE_ICON_MAP[type]?.color || FILE_TYPE_ICON_MAP[FileAppearanceTypeEnum.document].color
+
+  return <Icon className={cn('shrink-0', SizeMap[size], color, className)} />
+}
+
+export default memo(FileTypeIcon)
diff --git a/app/components/base/file-uploader/file-uploader-in-attachment/file-item.tsx b/app/components/base/file-uploader/file-uploader-in-attachment/file-item.tsx
new file mode 100644
index 0000000..fab1c36
--- /dev/null
+++ b/app/components/base/file-uploader/file-uploader-in-attachment/file-item.tsx
@@ -0,0 +1,154 @@
+import {
+  memo,
+  useState,
+} from 'react'
+import {
+  RiDeleteBinLine,
+  RiDownloadLine,
+  RiEyeLine,
+} from '@remixicon/react'
+import FileTypeIcon from '../file-type-icon'
+import {
+  downloadFile,
+  fileIsUploaded,
+  getFileAppearanceType,
+  getFileExtension,
+} from '../utils'
+import FileImageRender from '../file-image-render'
+import type { FileEntity } from '../types'
+import ActionButton from '@/app/components/base/action-button'
+import ProgressCircle from '@/app/components/base/progress-bar/progress-circle'
+import { formatFileSize } from '@/utils/format'
+import cn from '@/utils/classnames'
+import { ReplayLine } from '@/app/components/base/icons/src/vender/other'
+import { SupportUploadFileTypes } from '@/app/components/workflow/types'
+import ImagePreview from '@/app/components/base/image-uploader/image-preview'
+
+type FileInAttachmentItemProps = {
+  file: FileEntity
+  showDeleteAction?: boolean
+  showDownloadAction?: boolean
+  onRemove?: (fileId: string) => void
+  onReUpload?: (fileId: string) => void
+  canPreview?: boolean
+}
+const FileInAttachmentItem = ({
+  file,
+  showDeleteAction,
+  showDownloadAction = true,
+  onRemove,
+  onReUpload,
+  canPreview,
+}: FileInAttachmentItemProps) => {
+  const { id, name, type, progress, supportFileType, base64Url, url, isRemote } = file
+  const ext = getFileExtension(name, type, isRemote)
+  const isImageFile = supportFileType === SupportUploadFileTypes.image
+  const [imagePreviewUrl, setImagePreviewUrl] = useState('')
+  return (
+    <>
+      <div className={cn(
+        'flex h-12 items-center rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg pr-3 shadow-xs',
+        progress === -1 && 'border-state-destructive-border bg-state-destructive-hover',
+      )}>
+        <div className='flex h-12 w-12 items-center justify-center'>
+          {
+            isImageFile && (
+              <FileImageRender
+                className='h-8 w-8'
+                imageUrl={base64Url || url || ''}
+              />
+            )
+          }
+          {
+            !isImageFile && (
+              <FileTypeIcon
+                type={getFileAppearanceType(name, type)}
+                size='lg'
+              />
+            )
+          }
+        </div>
+        <div className='mr-1 w-0 grow'>
+          <div
+            className='system-xs-medium mb-0.5 flex items-center truncate text-text-secondary'
+            title={file.name}
+          >
+            <div className='truncate'>{name}</div>
+          </div>
+          <div className='system-2xs-medium-uppercase flex items-center text-text-tertiary'>
+            {
+              ext && (
+                <span>{ext.toLowerCase()}</span>
+              )
+            }
+            {
+              ext && (
+                <span className='system-2xs-medium mx-1'>鈥�</span>
+              )
+            }
+            {
+              !!file.size && (
+                <span>{formatFileSize(file.size)}</span>
+              )
+            }
+          </div>
+        </div>
+        <div className='flex shrink-0 items-center'>
+          {
+            progress >= 0 && !fileIsUploaded(file) && (
+              <ProgressCircle
+                className='mr-2.5'
+                percentage={progress}
+              />
+            )
+          }
+          {
+            progress === -1 && (
+              <ActionButton
+                className='mr-1'
+                onClick={() => onReUpload?.(id)}
+              >
+                <ReplayLine className='h-4 w-4 text-text-tertiary' />
+              </ActionButton>
+            )
+          }
+          {
+            showDeleteAction && (
+              <ActionButton onClick={() => onRemove?.(id)}>
+                <RiDeleteBinLine className='h-4 w-4' />
+              </ActionButton>
+            )
+          }
+          {
+            canPreview && isImageFile && (
+              <ActionButton className='mr-1' onClick={() => setImagePreviewUrl(url || '')}>
+                <RiEyeLine className='h-4 w-4' />
+              </ActionButton>
+            )
+          }
+          {
+            showDownloadAction && (
+              <ActionButton onClick={(e) => {
+                e.stopPropagation()
+                downloadFile(url || base64Url || '', name)
+              }}>
+                <RiDownloadLine className='h-4 w-4' />
+              </ActionButton>
+            )
+          }
+        </div>
+      </div>
+      {
+        imagePreviewUrl && canPreview && (
+          <ImagePreview
+            title={name}
+            url={imagePreviewUrl}
+            onCancel={() => setImagePreviewUrl('')}
+          />
+        )
+      }
+    </>
+  )
+}
+
+export default memo(FileInAttachmentItem)
diff --git a/app/components/base/file-uploader/file-uploader-in-attachment/index.tsx b/app/components/base/file-uploader/file-uploader-in-attachment/index.tsx
new file mode 100644
index 0000000..ab4e2aa
--- /dev/null
+++ b/app/components/base/file-uploader/file-uploader-in-attachment/index.tsx
@@ -0,0 +1,133 @@
+import {
+  useCallback,
+} from 'react'
+import {
+  RiLink,
+  RiUploadCloud2Line,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import FileFromLinkOrLocal from '../file-from-link-or-local'
+import {
+  FileContextProvider,
+  useStore,
+} from '../store'
+import type { FileEntity } from '../types'
+import FileInput from '../file-input'
+import { useFile } from '../hooks'
+import FileItem from './file-item'
+import Button from '@/app/components/base/button'
+import cn from '@/utils/classnames'
+import type { FileUpload } from '@/app/components/base/features/types'
+import { TransferMethod } from '@/types/app'
+
+type Option = {
+  value: string
+  label: string
+  icon: React.JSX.Element
+}
+type FileUploaderInAttachmentProps = {
+  fileConfig: FileUpload
+}
+const FileUploaderInAttachment = ({
+  fileConfig,
+}: FileUploaderInAttachmentProps) => {
+  const { t } = useTranslation()
+  const files = useStore(s => s.files)
+  const {
+    handleRemoveFile,
+    handleReUploadFile,
+  } = useFile(fileConfig)
+  const options = [
+    {
+      value: TransferMethod.local_file,
+      label: t('common.fileUploader.uploadFromComputer'),
+      icon: <RiUploadCloud2Line className='h-4 w-4' />,
+    },
+    {
+      value: TransferMethod.remote_url,
+      label: t('common.fileUploader.pasteFileLink'),
+      icon: <RiLink className='h-4 w-4' />,
+    },
+  ]
+
+  const renderButton = useCallback((option: Option, open?: boolean) => {
+    return (
+      <Button
+        key={option.value}
+        variant='tertiary'
+        className={cn('relative grow', open && 'bg-components-button-tertiary-bg-hover')}
+        disabled={!!(fileConfig.number_limits && files.length >= fileConfig.number_limits)}
+      >
+        {option.icon}
+        <span className='ml-1'>{option.label}</span>
+        {
+          option.value === TransferMethod.local_file && (
+            <FileInput fileConfig={fileConfig} />
+          )
+        }
+      </Button>
+    )
+  }, [fileConfig, files.length])
+  const renderTrigger = useCallback((option: Option) => {
+    return (open: boolean) => renderButton(option, open)
+  }, [renderButton])
+  const renderOption = useCallback((option: Option) => {
+    if (option.value === TransferMethod.local_file && fileConfig?.allowed_file_upload_methods?.includes(TransferMethod.local_file))
+      return renderButton(option)
+
+    if (option.value === TransferMethod.remote_url && fileConfig?.allowed_file_upload_methods?.includes(TransferMethod.remote_url)) {
+      return (
+        <FileFromLinkOrLocal
+          key={option.value}
+          showFromLocal={false}
+          trigger={renderTrigger(option)}
+          fileConfig={fileConfig}
+        />
+      )
+    }
+  }, [renderButton, renderTrigger, fileConfig])
+
+  return (
+    <div>
+      <div className='flex items-center space-x-1'>
+        {options.map(renderOption)}
+      </div>
+      <div className='mt-1 space-y-1'>
+        {
+          files.map(file => (
+            <FileItem
+              key={file.id}
+              file={file}
+              showDeleteAction
+              showDownloadAction={false}
+              onRemove={() => handleRemoveFile(file.id)}
+              onReUpload={() => handleReUploadFile(file.id)}
+            />
+          ))
+        }
+      </div>
+    </div>
+  )
+}
+
+type FileUploaderInAttachmentWrapperProps = {
+  value?: FileEntity[]
+  onChange: (files: FileEntity[]) => void
+  fileConfig: FileUpload
+}
+const FileUploaderInAttachmentWrapper = ({
+  value,
+  onChange,
+  fileConfig,
+}: FileUploaderInAttachmentWrapperProps) => {
+  return (
+    <FileContextProvider
+      value={value}
+      onChange={onChange}
+    >
+      <FileUploaderInAttachment fileConfig={fileConfig} />
+    </FileContextProvider>
+  )
+}
+
+export default FileUploaderInAttachmentWrapper
diff --git a/app/components/base/file-uploader/file-uploader-in-chat-input/file-image-item.tsx b/app/components/base/file-uploader/file-uploader-in-chat-input/file-image-item.tsx
new file mode 100644
index 0000000..5160348
--- /dev/null
+++ b/app/components/base/file-uploader/file-uploader-in-chat-input/file-image-item.tsx
@@ -0,0 +1,110 @@
+import { useState } from 'react'
+import {
+  RiCloseLine,
+  RiDownloadLine,
+} from '@remixicon/react'
+import FileImageRender from '../file-image-render'
+import type { FileEntity } from '../types'
+import {
+  downloadFile,
+  fileIsUploaded,
+} from '../utils'
+import Button from '@/app/components/base/button'
+import ProgressCircle from '@/app/components/base/progress-bar/progress-circle'
+import { ReplayLine } from '@/app/components/base/icons/src/vender/other'
+import ImagePreview from '@/app/components/base/image-uploader/image-preview'
+
+type FileImageItemProps = {
+  file: FileEntity
+  showDeleteAction?: boolean
+  showDownloadAction?: boolean
+  canPreview?: boolean
+  onRemove?: (fileId: string) => void
+  onReUpload?: (fileId: string) => void
+}
+const FileImageItem = ({
+  file,
+  showDeleteAction,
+  showDownloadAction,
+  canPreview,
+  onRemove,
+  onReUpload,
+}: FileImageItemProps) => {
+  const { id, progress, base64Url, url, name } = file
+  const [imagePreviewUrl, setImagePreviewUrl] = useState('')
+  const download_url = url ? `${url}&as_attachment=true` : base64Url
+
+  return (
+    <>
+      <div
+        className='group/file-image relative cursor-pointer'
+        onClick={() => canPreview && setImagePreviewUrl(base64Url || url || '')}
+      >
+        {
+          showDeleteAction && (
+            <Button
+              className='absolute -right-1.5 -top-1.5 z-[11] hidden h-5 w-5 rounded-full p-0 group-hover/file-image:flex'
+              onClick={() => onRemove?.(id)}
+            >
+              <RiCloseLine className='h-4 w-4 text-components-button-secondary-text' />
+            </Button>
+          )
+        }
+        <FileImageRender
+          className='h-[68px] w-[68px] shadow-md'
+          imageUrl={base64Url || url || ''}
+          showDownloadAction={showDownloadAction}
+        />
+        {
+          progress >= 0 && !fileIsUploaded(file) && (
+            <div className='absolute inset-0 z-10 flex items-center justify-center border-[2px] border-effects-image-frame bg-background-overlay-alt'>
+              <ProgressCircle
+                percentage={progress}
+                size={12}
+                circleStrokeColor='stroke-components-progress-white-border'
+                circleFillColor='fill-transparent'
+                sectorFillColor='fill-components-progress-white-progress'
+              />
+            </div>
+          )
+        }
+        {
+          progress === -1 && (
+            <div className='absolute inset-0 z-10 flex items-center justify-center border-[2px] border-state-destructive-border bg-background-overlay-destructive'>
+              <ReplayLine
+                className='h-5 w-5'
+                onClick={() => onReUpload?.(id)}
+              />
+            </div>
+          )
+        }
+        {
+          showDownloadAction && (
+            <div className='absolute inset-0.5 z-10 hidden bg-background-overlay-alt bg-opacity-[0.3] group-hover/file-image:block'>
+              <div
+                className='absolute bottom-0.5 right-0.5  flex h-6 w-6 items-center justify-center rounded-lg bg-components-actionbar-bg shadow-md'
+                onClick={(e) => {
+                  e.stopPropagation()
+                  downloadFile(download_url || '', name)
+                }}
+              >
+                <RiDownloadLine className='h-4 w-4 text-text-tertiary' />
+              </div>
+            </div>
+          )
+        }
+      </div>
+      {
+        imagePreviewUrl && canPreview && (
+          <ImagePreview
+            title={name}
+            url={imagePreviewUrl}
+            onCancel={() => setImagePreviewUrl('')}
+          />
+        )
+      }
+    </>
+  )
+}
+
+export default FileImageItem
diff --git a/app/components/base/file-uploader/file-uploader-in-chat-input/file-item.tsx b/app/components/base/file-uploader/file-uploader-in-chat-input/file-item.tsx
new file mode 100644
index 0000000..667bf7c
--- /dev/null
+++ b/app/components/base/file-uploader/file-uploader-in-chat-input/file-item.tsx
@@ -0,0 +1,156 @@
+import {
+  RiCloseLine,
+  RiDownloadLine,
+} from '@remixicon/react'
+import { useState } from 'react'
+import {
+  downloadFile,
+  fileIsUploaded,
+  getFileAppearanceType,
+  getFileExtension,
+} from '../utils'
+import FileTypeIcon from '../file-type-icon'
+import type { FileEntity } from '../types'
+import cn from '@/utils/classnames'
+import { formatFileSize } from '@/utils/format'
+import ProgressCircle from '@/app/components/base/progress-bar/progress-circle'
+import { ReplayLine } from '@/app/components/base/icons/src/vender/other'
+import ActionButton from '@/app/components/base/action-button'
+import Button from '@/app/components/base/button'
+import PdfPreview from '@/app/components/base/file-uploader/dynamic-pdf-preview'
+import AudioPreview from '@/app/components/base/file-uploader/audio-preview'
+import VideoPreview from '@/app/components/base/file-uploader/video-preview'
+
+type FileItemProps = {
+  file: FileEntity
+  showDeleteAction?: boolean
+  showDownloadAction?: boolean
+  canPreview?: boolean
+  onRemove?: (fileId: string) => void
+  onReUpload?: (fileId: string) => void
+}
+const FileItem = ({
+  file,
+  showDeleteAction,
+  showDownloadAction = true,
+  onRemove,
+  onReUpload,
+  canPreview,
+}: FileItemProps) => {
+  const { id, name, type, progress, url, base64Url, isRemote } = file
+  const [previewUrl, setPreviewUrl] = useState('')
+  const ext = getFileExtension(name, type, isRemote)
+  const uploadError = progress === -1
+
+  let tmp_preview_url = url || base64Url
+  if (!tmp_preview_url && file?.originalFile)
+    tmp_preview_url = URL.createObjectURL(file.originalFile.slice()).toString()
+  const download_url = url ? `${url}&as_attachment=true` : base64Url
+
+  return (
+    <>
+      <div
+        className={cn(
+          'group/file-item relative h-[68px] w-[144px] rounded-lg border-[0.5px] border-components-panel-border bg-components-card-bg p-2 shadow-xs',
+          !uploadError && 'hover:bg-components-card-bg-alt',
+          uploadError && 'border border-state-destructive-border bg-state-destructive-hover',
+          uploadError && 'bg-state-destructive-hover-alt hover:border-[0.5px] hover:border-state-destructive-border',
+        )}
+      >
+        {
+          showDeleteAction && (
+            <Button
+              className='absolute -right-1.5 -top-1.5 z-[11] hidden h-5 w-5 rounded-full p-0 group-hover/file-item:flex'
+              onClick={() => onRemove?.(id)}
+            >
+              <RiCloseLine className='h-4 w-4 text-components-button-secondary-text' />
+            </Button>
+          )
+        }
+        <div
+          className='system-xs-medium mb-1 line-clamp-2 h-8 cursor-pointer break-all text-text-tertiary'
+          title={name}
+          onClick={() => canPreview && setPreviewUrl(tmp_preview_url || '')}
+        >
+          {name}
+        </div>
+        <div className='relative flex items-center justify-between'>
+          <div className='system-2xs-medium-uppercase flex items-center text-text-tertiary'>
+            <FileTypeIcon
+              size='sm'
+              type={getFileAppearanceType(name, type)}
+              className='mr-1'
+            />
+            {
+              ext && (
+                <>
+                  {ext}
+                  <div className='mx-1'>路</div>
+                </>
+              )
+            }
+            {
+              !!file.size && formatFileSize(file.size)
+            }
+          </div>
+          {
+            showDownloadAction && download_url && (
+              <ActionButton
+                size='m'
+                className='absolute -right-1 -top-1 hidden group-hover/file-item:flex'
+                onClick={(e) => {
+                  e.stopPropagation()
+                  downloadFile(download_url || '', name)
+                }}
+              >
+                <RiDownloadLine className='h-3.5 w-3.5 text-text-tertiary' />
+              </ActionButton>
+            )
+          }
+          {
+            progress >= 0 && !fileIsUploaded(file) && (
+              <ProgressCircle
+                percentage={progress}
+                size={12}
+                className='shrink-0'
+              />
+            )
+          }
+          {
+            uploadError && (
+              <ReplayLine
+                className='h-4 w-4 text-text-tertiary'
+                onClick={() => onReUpload?.(id)}
+              />
+            )
+          }
+        </div>
+      </div>
+      {
+        type.split('/')[0] === 'audio' && canPreview && previewUrl && (
+          <AudioPreview
+            title={name}
+            url={previewUrl}
+            onCancel={() => setPreviewUrl('')}
+          />
+        )
+      }
+      {
+        type.split('/')[0] === 'video' && canPreview && previewUrl && (
+          <VideoPreview
+            title={name}
+            url={previewUrl}
+            onCancel={() => setPreviewUrl('')}
+          />
+        )
+      }
+      {
+        type.split('/')[1] === 'pdf' && canPreview && previewUrl && (
+          <PdfPreview url={previewUrl} onCancel={() => { setPreviewUrl('') }} />
+        )
+      }
+    </>
+  )
+}
+
+export default FileItem
diff --git a/app/components/base/file-uploader/file-uploader-in-chat-input/file-list.tsx b/app/components/base/file-uploader/file-uploader-in-chat-input/file-list.tsx
new file mode 100644
index 0000000..ba90904
--- /dev/null
+++ b/app/components/base/file-uploader/file-uploader-in-chat-input/file-list.tsx
@@ -0,0 +1,82 @@
+import { useFile } from '../hooks'
+import { useStore } from '../store'
+import type { FileEntity } from '../types'
+import FileImageItem from './file-image-item'
+import FileItem from './file-item'
+import type { FileUpload } from '@/app/components/base/features/types'
+import { SupportUploadFileTypes } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+
+type FileListProps = {
+  className?: string
+  files: FileEntity[]
+  onRemove?: (fileId: string) => void
+  onReUpload?: (fileId: string) => void
+  showDeleteAction?: boolean
+  showDownloadAction?: boolean
+  canPreview?: boolean
+}
+export const FileList = ({
+  className,
+  files,
+  onReUpload,
+  onRemove,
+  showDeleteAction = true,
+  showDownloadAction = false,
+  canPreview = true,
+}: FileListProps) => {
+  return (
+    <div className={cn('flex flex-wrap gap-2', className)}>
+      {
+        files.map((file) => {
+          if (file.supportFileType === SupportUploadFileTypes.image) {
+            return (
+              <FileImageItem
+                key={file.id}
+                file={file}
+                showDeleteAction={showDeleteAction}
+                showDownloadAction={showDownloadAction}
+                onRemove={onRemove}
+                onReUpload={onReUpload}
+                canPreview={canPreview}
+              />
+            )
+          }
+
+          return (
+            <FileItem
+              key={file.id}
+              file={file}
+              showDeleteAction={showDeleteAction}
+              showDownloadAction={showDownloadAction}
+              onRemove={onRemove}
+              onReUpload={onReUpload}
+              canPreview={canPreview}
+            />
+          )
+        })
+      }
+    </div>
+  )
+}
+
+type FileListInChatInputProps = {
+  fileConfig: FileUpload
+}
+export const FileListInChatInput = ({
+  fileConfig,
+}: FileListInChatInputProps) => {
+  const files = useStore(s => s.files)
+  const {
+    handleRemoveFile,
+    handleReUploadFile,
+  } = useFile(fileConfig)
+
+  return (
+    <FileList
+      files={files}
+      onReUpload={handleReUploadFile}
+      onRemove={handleRemoveFile}
+    />
+  )
+}
diff --git a/app/components/base/file-uploader/file-uploader-in-chat-input/index.tsx b/app/components/base/file-uploader/file-uploader-in-chat-input/index.tsx
new file mode 100644
index 0000000..7e6e190
--- /dev/null
+++ b/app/components/base/file-uploader/file-uploader-in-chat-input/index.tsx
@@ -0,0 +1,41 @@
+import {
+  memo,
+  useCallback,
+} from 'react'
+import {
+  RiAttachmentLine,
+} from '@remixicon/react'
+import FileFromLinkOrLocal from '../file-from-link-or-local'
+import ActionButton from '@/app/components/base/action-button'
+import cn from '@/utils/classnames'
+import type { FileUpload } from '@/app/components/base/features/types'
+import { TransferMethod } from '@/types/app'
+
+type FileUploaderInChatInputProps = {
+  fileConfig: FileUpload
+}
+const FileUploaderInChatInput = ({
+  fileConfig,
+}: FileUploaderInChatInputProps) => {
+  const renderTrigger = useCallback((open: boolean) => {
+    return (
+      <ActionButton
+        size='l'
+        className={cn(open && 'bg-state-base-hover')}
+      >
+        <RiAttachmentLine className='h-5 w-5' />
+      </ActionButton>
+    )
+  }, [])
+
+  return (
+    <FileFromLinkOrLocal
+      trigger={renderTrigger}
+      fileConfig={fileConfig}
+      showFromLocal={fileConfig?.allowed_file_upload_methods?.includes(TransferMethod.local_file)}
+      showFromLink={fileConfig?.allowed_file_upload_methods?.includes(TransferMethod.remote_url)}
+    />
+  )
+}
+
+export default memo(FileUploaderInChatInput)
diff --git a/app/components/base/file-uploader/hooks.ts b/app/components/base/file-uploader/hooks.ts
new file mode 100644
index 0000000..66d5b46
--- /dev/null
+++ b/app/components/base/file-uploader/hooks.ts
@@ -0,0 +1,367 @@
+import type { ClipboardEvent } from 'react'
+import {
+  useCallback,
+  useState,
+} from 'react'
+import { useParams } from 'next/navigation'
+import produce from 'immer'
+import { v4 as uuid4 } from 'uuid'
+import { useTranslation } from 'react-i18next'
+import type { FileEntity } from './types'
+import { useFileStore } from './store'
+import {
+  fileUpload,
+  getSupportFileType,
+  isAllowedFileExtension,
+} from './utils'
+import {
+  AUDIO_SIZE_LIMIT,
+  FILE_SIZE_LIMIT,
+  IMG_SIZE_LIMIT,
+  MAX_FILE_UPLOAD_LIMIT,
+  VIDEO_SIZE_LIMIT,
+} from '@/app/components/base/file-uploader/constants'
+import { useToastContext } from '@/app/components/base/toast'
+import { TransferMethod } from '@/types/app'
+import { SupportUploadFileTypes } from '@/app/components/workflow/types'
+import type { FileUpload } from '@/app/components/base/features/types'
+import { formatFileSize } from '@/utils/format'
+import { uploadRemoteFileInfo } from '@/service/common'
+import type { FileUploadConfigResponse } from '@/models/common'
+import { noop } from 'lodash-es'
+
+export const useFileSizeLimit = (fileUploadConfig?: FileUploadConfigResponse) => {
+  const imgSizeLimit = Number(fileUploadConfig?.image_file_size_limit) * 1024 * 1024 || IMG_SIZE_LIMIT
+  const docSizeLimit = Number(fileUploadConfig?.file_size_limit) * 1024 * 1024 || FILE_SIZE_LIMIT
+  const audioSizeLimit = Number(fileUploadConfig?.audio_file_size_limit) * 1024 * 1024 || AUDIO_SIZE_LIMIT
+  const videoSizeLimit = Number(fileUploadConfig?.video_file_size_limit) * 1024 * 1024 || VIDEO_SIZE_LIMIT
+  const maxFileUploadLimit = Number(fileUploadConfig?.workflow_file_upload_limit) || MAX_FILE_UPLOAD_LIMIT
+
+  return {
+    imgSizeLimit,
+    docSizeLimit,
+    audioSizeLimit,
+    videoSizeLimit,
+    maxFileUploadLimit,
+  }
+}
+
+export const useFile = (fileConfig: FileUpload) => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const fileStore = useFileStore()
+  const params = useParams()
+  const { imgSizeLimit, docSizeLimit, audioSizeLimit, videoSizeLimit } = useFileSizeLimit(fileConfig.fileUploadConfig)
+
+  const checkSizeLimit = useCallback((fileType: string, fileSize: number) => {
+    switch (fileType) {
+      case SupportUploadFileTypes.image: {
+        if (fileSize > imgSizeLimit) {
+          notify({
+            type: 'error',
+            message: t('common.fileUploader.uploadFromComputerLimit', {
+              type: SupportUploadFileTypes.image,
+              size: formatFileSize(imgSizeLimit),
+            }),
+          })
+          return false
+        }
+        return true
+      }
+      case SupportUploadFileTypes.document: {
+        if (fileSize > docSizeLimit) {
+          notify({
+            type: 'error',
+            message: t('common.fileUploader.uploadFromComputerLimit', {
+              type: SupportUploadFileTypes.document,
+              size: formatFileSize(docSizeLimit),
+            }),
+          })
+          return false
+        }
+        return true
+      }
+      case SupportUploadFileTypes.audio: {
+        if (fileSize > audioSizeLimit) {
+          notify({
+            type: 'error',
+            message: t('common.fileUploader.uploadFromComputerLimit', {
+              type: SupportUploadFileTypes.audio,
+              size: formatFileSize(audioSizeLimit),
+            }),
+          })
+          return false
+        }
+        return true
+      }
+      case SupportUploadFileTypes.video: {
+        if (fileSize > videoSizeLimit) {
+          notify({
+            type: 'error',
+            message: t('common.fileUploader.uploadFromComputerLimit', {
+              type: SupportUploadFileTypes.video,
+              size: formatFileSize(videoSizeLimit),
+            }),
+          })
+          return false
+        }
+        return true
+      }
+      case SupportUploadFileTypes.custom: {
+        if (fileSize > docSizeLimit) {
+          notify({
+            type: 'error',
+            message: t('common.fileUploader.uploadFromComputerLimit', {
+              type: SupportUploadFileTypes.document,
+              size: formatFileSize(docSizeLimit),
+            }),
+          })
+          return false
+        }
+        return true
+      }
+      default: {
+        return true
+      }
+    }
+  }, [audioSizeLimit, docSizeLimit, imgSizeLimit, notify, t, videoSizeLimit])
+
+  const handleAddFile = useCallback((newFile: FileEntity) => {
+    const {
+      files,
+      setFiles,
+    } = fileStore.getState()
+
+    const newFiles = produce(files, (draft) => {
+      draft.push(newFile)
+    })
+    setFiles(newFiles)
+  }, [fileStore])
+
+  const handleUpdateFile = useCallback((newFile: FileEntity) => {
+    const {
+      files,
+      setFiles,
+    } = fileStore.getState()
+
+    const newFiles = produce(files, (draft) => {
+      const index = draft.findIndex(file => file.id === newFile.id)
+
+      if (index > -1)
+        draft[index] = newFile
+    })
+    setFiles(newFiles)
+  }, [fileStore])
+
+  const handleRemoveFile = useCallback((fileId: string) => {
+    const {
+      files,
+      setFiles,
+    } = fileStore.getState()
+
+    const newFiles = files.filter(file => file.id !== fileId)
+    setFiles(newFiles)
+  }, [fileStore])
+
+  const handleReUploadFile = useCallback((fileId: string) => {
+    const {
+      files,
+      setFiles,
+    } = fileStore.getState()
+    const index = files.findIndex(file => file.id === fileId)
+
+    if (index > -1) {
+      const uploadingFile = files[index]
+      const newFiles = produce(files, (draft) => {
+        draft[index].progress = 0
+      })
+      setFiles(newFiles)
+      fileUpload({
+        file: uploadingFile.originalFile!,
+        onProgressCallback: (progress) => {
+          handleUpdateFile({ ...uploadingFile, progress })
+        },
+        onSuccessCallback: (res) => {
+          handleUpdateFile({ ...uploadingFile, uploadedId: res.id, progress: 100 })
+        },
+        onErrorCallback: () => {
+          notify({ type: 'error', message: t('common.fileUploader.uploadFromComputerUploadError') })
+          handleUpdateFile({ ...uploadingFile, progress: -1 })
+        },
+      }, !!params.token)
+    }
+  }, [fileStore, notify, t, handleUpdateFile, params])
+
+  const startProgressTimer = useCallback((fileId: string) => {
+    const timer = setInterval(() => {
+      const files = fileStore.getState().files
+      const file = files.find(file => file.id === fileId)
+
+      if (file && file.progress < 80 && file.progress >= 0)
+        handleUpdateFile({ ...file, progress: file.progress + 20 })
+      else
+        clearTimeout(timer)
+    }, 200)
+  }, [fileStore, handleUpdateFile])
+  const handleLoadFileFromLink = useCallback((url: string) => {
+    const allowedFileTypes = fileConfig.allowed_file_types
+
+    const uploadingFile = {
+      id: uuid4(),
+      name: url,
+      type: '',
+      size: 0,
+      progress: 0,
+      transferMethod: TransferMethod.remote_url,
+      supportFileType: '',
+      url,
+      isRemote: true,
+    }
+    handleAddFile(uploadingFile)
+    startProgressTimer(uploadingFile.id)
+
+    uploadRemoteFileInfo(url, !!params.token).then((res) => {
+      const newFile = {
+        ...uploadingFile,
+        type: res.mime_type,
+        size: res.size,
+        progress: 100,
+        supportFileType: getSupportFileType(res.name, res.mime_type, allowedFileTypes?.includes(SupportUploadFileTypes.custom)),
+        uploadedId: res.id,
+        url: res.url,
+      }
+      if (!isAllowedFileExtension(res.name, res.mime_type, fileConfig.allowed_file_types || [], fileConfig.allowed_file_extensions || [])) {
+        notify({ type: 'error', message: t('common.fileUploader.fileExtensionNotSupport') })
+        handleRemoveFile(uploadingFile.id)
+      }
+      if (!checkSizeLimit(newFile.supportFileType, newFile.size))
+        handleRemoveFile(uploadingFile.id)
+      else
+        handleUpdateFile(newFile)
+    }).catch(() => {
+      notify({ type: 'error', message: t('common.fileUploader.pasteFileLinkInvalid') })
+      handleRemoveFile(uploadingFile.id)
+    })
+  }, [checkSizeLimit, handleAddFile, handleUpdateFile, notify, t, handleRemoveFile, fileConfig?.allowed_file_types, fileConfig.allowed_file_extensions, startProgressTimer, params.token])
+
+  const handleLoadFileFromLinkSuccess = useCallback(noop, [])
+
+  const handleLoadFileFromLinkError = useCallback(noop, [])
+
+  const handleClearFiles = useCallback(() => {
+    const {
+      setFiles,
+    } = fileStore.getState()
+    setFiles([])
+  }, [fileStore])
+
+  const handleLocalFileUpload = useCallback((file: File) => {
+    if (!isAllowedFileExtension(file.name, file.type, fileConfig.allowed_file_types || [], fileConfig.allowed_file_extensions || [])) {
+      notify({ type: 'error', message: t('common.fileUploader.fileExtensionNotSupport') })
+      return
+    }
+    const allowedFileTypes = fileConfig.allowed_file_types
+    const fileType = getSupportFileType(file.name, file.type, allowedFileTypes?.includes(SupportUploadFileTypes.custom))
+    if (!checkSizeLimit(fileType, file.size))
+      return
+
+    const reader = new FileReader()
+    const isImage = file.type.startsWith('image')
+
+    reader.addEventListener(
+      'load',
+      () => {
+        const uploadingFile = {
+          id: uuid4(),
+          name: file.name,
+          type: file.type,
+          size: file.size,
+          progress: 0,
+          transferMethod: TransferMethod.local_file,
+          supportFileType: getSupportFileType(file.name, file.type, allowedFileTypes?.includes(SupportUploadFileTypes.custom)),
+          originalFile: file,
+          base64Url: isImage ? reader.result as string : '',
+        }
+        handleAddFile(uploadingFile)
+        fileUpload({
+          file: uploadingFile.originalFile,
+          onProgressCallback: (progress) => {
+            handleUpdateFile({ ...uploadingFile, progress })
+          },
+          onSuccessCallback: (res) => {
+            handleUpdateFile({ ...uploadingFile, uploadedId: res.id, progress: 100 })
+          },
+          onErrorCallback: () => {
+            notify({ type: 'error', message: t('common.fileUploader.uploadFromComputerUploadError') })
+            handleUpdateFile({ ...uploadingFile, progress: -1 })
+          },
+        }, !!params.token)
+      },
+      false,
+    )
+    reader.addEventListener(
+      'error',
+      () => {
+        notify({ type: 'error', message: t('common.fileUploader.uploadFromComputerReadError') })
+      },
+      false,
+    )
+    reader.readAsDataURL(file)
+  }, [checkSizeLimit, notify, t, handleAddFile, handleUpdateFile, params.token, fileConfig?.allowed_file_types, fileConfig?.allowed_file_extensions])
+
+  const handleClipboardPasteFile = useCallback((e: ClipboardEvent<HTMLTextAreaElement>) => {
+    const file = e.clipboardData?.files[0]
+    const text = e.clipboardData?.getData('text/plain')
+    if (file && !text) {
+      e.preventDefault()
+      handleLocalFileUpload(file)
+    }
+  }, [handleLocalFileUpload])
+
+  const [isDragActive, setIsDragActive] = useState(false)
+  const handleDragFileEnter = useCallback((e: React.DragEvent<HTMLElement>) => {
+    e.preventDefault()
+    e.stopPropagation()
+    setIsDragActive(true)
+  }, [])
+
+  const handleDragFileOver = useCallback((e: React.DragEvent<HTMLElement>) => {
+    e.preventDefault()
+    e.stopPropagation()
+  }, [])
+
+  const handleDragFileLeave = useCallback((e: React.DragEvent<HTMLElement>) => {
+    e.preventDefault()
+    e.stopPropagation()
+    setIsDragActive(false)
+  }, [])
+
+  const handleDropFile = useCallback((e: React.DragEvent<HTMLElement>) => {
+    e.preventDefault()
+    e.stopPropagation()
+    setIsDragActive(false)
+
+    const file = e.dataTransfer.files[0]
+
+    if (file)
+      handleLocalFileUpload(file)
+  }, [handleLocalFileUpload])
+
+  return {
+    handleAddFile,
+    handleUpdateFile,
+    handleRemoveFile,
+    handleReUploadFile,
+    handleLoadFileFromLink,
+    handleLoadFileFromLinkSuccess,
+    handleLoadFileFromLinkError,
+    handleClearFiles,
+    handleLocalFileUpload,
+    handleClipboardPasteFile,
+    isDragActive,
+    handleDragFileEnter,
+    handleDragFileOver,
+    handleDragFileLeave,
+    handleDropFile,
+  }
+}
diff --git a/app/components/base/file-uploader/index.ts b/app/components/base/file-uploader/index.ts
new file mode 100644
index 0000000..ff5914c
--- /dev/null
+++ b/app/components/base/file-uploader/index.ts
@@ -0,0 +1,7 @@
+export { default as FileUploaderInAttachmentWrapper } from './file-uploader-in-attachment'
+export { default as FileItemInAttachment } from './file-uploader-in-attachment/file-item'
+export { default as FileUploaderInChatInput } from './file-uploader-in-chat-input'
+export { default as FileTypeIcon } from './file-type-icon'
+export { FileListInChatInput } from './file-uploader-in-chat-input/file-list'
+export { FileList } from './file-uploader-in-chat-input/file-list'
+export { default as FileItem } from './file-uploader-in-chat-input/file-item'
diff --git a/app/components/base/file-uploader/pdf-preview.tsx b/app/components/base/file-uploader/pdf-preview.tsx
new file mode 100644
index 0000000..f8a02e8
--- /dev/null
+++ b/app/components/base/file-uploader/pdf-preview.tsx
@@ -0,0 +1,103 @@
+import type { FC } from 'react'
+import { createPortal } from 'react-dom'
+import 'react-pdf-highlighter/dist/style.css'
+import { PdfHighlighter, PdfLoader } from 'react-pdf-highlighter'
+import { t } from 'i18next'
+import { RiCloseLine, RiZoomInLine, RiZoomOutLine } from '@remixicon/react'
+import React, { useState } from 'react'
+import { useHotkeys } from 'react-hotkeys-hook'
+import Loading from '@/app/components/base/loading'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import Tooltip from '@/app/components/base/tooltip'
+import { noop } from 'lodash-es'
+
+type PdfPreviewProps = {
+  url: string
+  onCancel: () => void
+}
+
+const PdfPreview: FC<PdfPreviewProps> = ({
+  url,
+  onCancel,
+}) => {
+  const media = useBreakpoints()
+  const [scale, setScale] = useState(1)
+  const [position, setPosition] = useState({ x: 0, y: 0 })
+  const isMobile = media === MediaType.mobile
+
+  const zoomIn = () => {
+    setScale(prevScale => Math.min(prevScale * 1.2, 15))
+    setPosition({ x: position.x - 50, y: position.y - 50 })
+  }
+
+  const zoomOut = () => {
+    setScale((prevScale) => {
+      const newScale = Math.max(prevScale / 1.2, 0.5)
+      if (newScale === 1)
+        setPosition({ x: 0, y: 0 })
+      else
+        setPosition({ x: position.x + 50, y: position.y + 50 })
+
+      return newScale
+    })
+  }
+
+  useHotkeys('esc', onCancel)
+  useHotkeys('up', zoomIn)
+  useHotkeys('down', zoomOut)
+
+  return createPortal(
+    <div
+      className={`fixed inset-0 z-[1000] flex items-center justify-center bg-black/80 ${!isMobile && 'p-8'}`}
+      onClick={e => e.stopPropagation()}
+      tabIndex={-1}
+    >
+      <div
+        className='h-[95vh] max-h-full w-[100vw] max-w-full overflow-hidden'
+        style={{ transform: `scale(${scale})`, transformOrigin: 'center', scrollbarWidth: 'none', msOverflowStyle: 'none' }}
+      >
+        <PdfLoader
+          workerSrc='/pdf.worker.min.mjs'
+          url={url}
+          beforeLoad={<div className='flex h-64 items-center justify-center'><Loading type='app' /></div>}
+        >
+          {(pdfDocument) => {
+            return (
+              <PdfHighlighter
+                pdfDocument={pdfDocument}
+                enableAreaSelection={event => event.altKey}
+                scrollRef={noop}
+                onScrollChange={noop}
+                onSelectionFinished={() => null}
+                highlightTransform={() => { return <div/> }}
+                highlights={[]}
+              />
+            )
+          }}
+        </PdfLoader>
+      </div>
+      <Tooltip popupContent={t('common.operation.zoomOut')}>
+        <div className='absolute right-24 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg'
+          onClick={zoomOut}>
+          <RiZoomOutLine className='h-4 w-4 text-gray-500'/>
+        </div>
+      </Tooltip>
+      <Tooltip popupContent={t('common.operation.zoomIn')}>
+        <div className='absolute right-16 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg'
+          onClick={zoomIn}>
+          <RiZoomInLine className='h-4 w-4 text-gray-500'/>
+        </div>
+      </Tooltip>
+      <Tooltip popupContent={t('common.operation.cancel')}>
+        <div
+          className='absolute right-6 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg bg-white/8 backdrop-blur-[2px]'
+          onClick={onCancel}>
+          <RiCloseLine className='h-4 w-4 text-gray-500'/>
+        </div>
+      </Tooltip>
+    </div>,
+    document.body,
+  )
+}
+
+export default PdfPreview
diff --git a/app/components/base/file-uploader/store.tsx b/app/components/base/file-uploader/store.tsx
new file mode 100644
index 0000000..cddfdf6
--- /dev/null
+++ b/app/components/base/file-uploader/store.tsx
@@ -0,0 +1,67 @@
+import {
+  createContext,
+  useContext,
+  useRef,
+} from 'react'
+import {
+  create,
+  useStore as useZustandStore,
+} from 'zustand'
+import type {
+  FileEntity,
+} from './types'
+
+type Shape = {
+  files: FileEntity[]
+  setFiles: (files: FileEntity[]) => void
+}
+
+export const createFileStore = (
+  value: FileEntity[] = [],
+  onChange?: (files: FileEntity[]) => void,
+) => {
+  return create<Shape>(set => ({
+    files: value ? [...value] : [],
+    setFiles: (files) => {
+      set({ files })
+      onChange?.(files)
+    },
+  }))
+}
+
+type FileStore = ReturnType<typeof createFileStore>
+export const FileContext = createContext<FileStore | null>(null)
+
+export function useStore<T>(selector: (state: Shape) => T): T {
+  const store = useContext(FileContext)
+  if (!store)
+    throw new Error('Missing FileContext.Provider in the tree')
+
+  return useZustandStore(store, selector)
+}
+
+export const useFileStore = () => {
+  return useContext(FileContext)!
+}
+
+type FileProviderProps = {
+  children: React.ReactNode
+  value?: FileEntity[]
+  onChange?: (files: FileEntity[]) => void
+}
+export const FileContextProvider = ({
+  children,
+  value,
+  onChange,
+}: FileProviderProps) => {
+  const storeRef = useRef<FileStore | undefined>(undefined)
+
+  if (!storeRef.current)
+    storeRef.current = createFileStore(value, onChange)
+
+  return (
+    <FileContext.Provider value={storeRef.current}>
+      {children}
+    </FileContext.Provider>
+  )
+}
diff --git a/app/components/base/file-uploader/types.ts b/app/components/base/file-uploader/types.ts
new file mode 100644
index 0000000..285023f
--- /dev/null
+++ b/app/components/base/file-uploader/types.ts
@@ -0,0 +1,33 @@
+import type { TransferMethod } from '@/types/app'
+
+export enum FileAppearanceTypeEnum {
+  image = 'image',
+  video = 'video',
+  audio = 'audio',
+  document = 'document',
+  code = 'code',
+  pdf = 'pdf',
+  markdown = 'markdown',
+  excel = 'excel',
+  word = 'word',
+  ppt = 'ppt',
+  gif = 'gif',
+  custom = 'custom',
+}
+
+export type FileAppearanceType = keyof typeof FileAppearanceTypeEnum
+
+export type FileEntity = {
+  id: string
+  name: string
+  size: number
+  type: string
+  progress: number
+  transferMethod: TransferMethod
+  supportFileType: string
+  originalFile?: File
+  uploadedId?: string
+  base64Url?: string
+  url?: string
+  isRemote?: boolean
+}
diff --git a/app/components/base/file-uploader/utils.spec.ts b/app/components/base/file-uploader/utils.spec.ts
new file mode 100644
index 0000000..c8cf9fb
--- /dev/null
+++ b/app/components/base/file-uploader/utils.spec.ts
@@ -0,0 +1,614 @@
+import mime from 'mime'
+import { upload } from '@/service/base'
+import {
+  downloadFile,
+  fileIsUploaded,
+  fileUpload,
+  getFileAppearanceType,
+  getFileExtension,
+  getFileNameFromUrl,
+  getFilesInLogs,
+  getProcessedFiles,
+  getProcessedFilesFromResponse,
+  getSupportFileExtensionList,
+  getSupportFileType,
+  isAllowedFileExtension,
+} from './utils'
+import { FileAppearanceTypeEnum } from './types'
+import { SupportUploadFileTypes } from '@/app/components/workflow/types'
+import { TransferMethod } from '@/types/app'
+import { FILE_EXTS } from '../prompt-editor/constants'
+
+jest.mock('mime', () => ({
+  __esModule: true,
+  default: {
+    getExtension: jest.fn(),
+  },
+}))
+
+jest.mock('@/service/base', () => ({
+  upload: jest.fn(),
+}))
+
+describe('file-uploader utils', () => {
+  beforeEach(() => {
+    jest.clearAllMocks()
+  })
+
+  describe('fileUpload', () => {
+    it('should handle successful file upload', async () => {
+      const mockFile = new File(['test'], 'test.txt')
+      const mockCallbacks = {
+        onProgressCallback: jest.fn(),
+        onSuccessCallback: jest.fn(),
+        onErrorCallback: jest.fn(),
+      }
+
+      jest.mocked(upload).mockResolvedValue({ id: '123' })
+
+      await fileUpload({
+        file: mockFile,
+        ...mockCallbacks,
+      })
+
+      expect(upload).toHaveBeenCalled()
+      expect(mockCallbacks.onSuccessCallback).toHaveBeenCalledWith({ id: '123' })
+    })
+  })
+
+  describe('getFileExtension', () => {
+    it('should get extension from mimetype', () => {
+      jest.mocked(mime.getExtension).mockReturnValue('pdf')
+      expect(getFileExtension('file', 'application/pdf')).toBe('pdf')
+    })
+
+    it('should get extension from filename if mimetype fails', () => {
+      jest.mocked(mime.getExtension).mockReturnValue(null)
+      expect(getFileExtension('file.txt', '')).toBe('txt')
+      expect(getFileExtension('file.txt.docx', '')).toBe('docx')
+      expect(getFileExtension('file', '')).toBe('')
+    })
+
+    it('should return empty string for remote files', () => {
+      expect(getFileExtension('file.txt', '', true)).toBe('')
+    })
+  })
+
+  describe('getFileAppearanceType', () => {
+    it('should identify gif files', () => {
+      jest.mocked(mime.getExtension).mockReturnValue('gif')
+      expect(getFileAppearanceType('image.gif', 'image/gif'))
+        .toBe(FileAppearanceTypeEnum.gif)
+    })
+
+    it('should identify image files', () => {
+      jest.mocked(mime.getExtension).mockReturnValue('jpg')
+      expect(getFileAppearanceType('image.jpg', 'image/jpeg'))
+        .toBe(FileAppearanceTypeEnum.image)
+
+      jest.mocked(mime.getExtension).mockReturnValue('jpeg')
+      expect(getFileAppearanceType('image.jpeg', 'image/jpeg'))
+        .toBe(FileAppearanceTypeEnum.image)
+
+      jest.mocked(mime.getExtension).mockReturnValue('png')
+      expect(getFileAppearanceType('image.png', 'image/png'))
+        .toBe(FileAppearanceTypeEnum.image)
+
+      jest.mocked(mime.getExtension).mockReturnValue('webp')
+      expect(getFileAppearanceType('image.webp', 'image/webp'))
+        .toBe(FileAppearanceTypeEnum.image)
+
+      jest.mocked(mime.getExtension).mockReturnValue('svg')
+      expect(getFileAppearanceType('image.svg', 'image/svgxml'))
+        .toBe(FileAppearanceTypeEnum.image)
+    })
+
+    it('should identify video files', () => {
+      jest.mocked(mime.getExtension).mockReturnValue('mp4')
+      expect(getFileAppearanceType('video.mp4', 'video/mp4'))
+        .toBe(FileAppearanceTypeEnum.video)
+
+      jest.mocked(mime.getExtension).mockReturnValue('mov')
+      expect(getFileAppearanceType('video.mov', 'video/quicktime'))
+        .toBe(FileAppearanceTypeEnum.video)
+
+      jest.mocked(mime.getExtension).mockReturnValue('mpeg')
+      expect(getFileAppearanceType('video.mpeg', 'video/mpeg'))
+        .toBe(FileAppearanceTypeEnum.video)
+
+      jest.mocked(mime.getExtension).mockReturnValue('webm')
+      expect(getFileAppearanceType('video.web', 'video/webm'))
+        .toBe(FileAppearanceTypeEnum.video)
+    })
+
+    it('should identify audio files', () => {
+      jest.mocked(mime.getExtension).mockReturnValue('mp3')
+      expect(getFileAppearanceType('audio.mp3', 'audio/mpeg'))
+        .toBe(FileAppearanceTypeEnum.audio)
+
+      jest.mocked(mime.getExtension).mockReturnValue('m4a')
+      expect(getFileAppearanceType('audio.m4a', 'audio/mp4'))
+        .toBe(FileAppearanceTypeEnum.audio)
+
+      jest.mocked(mime.getExtension).mockReturnValue('wav')
+      expect(getFileAppearanceType('audio.wav', 'audio/vnd.wav'))
+        .toBe(FileAppearanceTypeEnum.audio)
+
+      jest.mocked(mime.getExtension).mockReturnValue('amr')
+      expect(getFileAppearanceType('audio.amr', 'audio/AMR'))
+        .toBe(FileAppearanceTypeEnum.audio)
+
+      jest.mocked(mime.getExtension).mockReturnValue('mpga')
+      expect(getFileAppearanceType('audio.mpga', 'audio/mpeg'))
+        .toBe(FileAppearanceTypeEnum.audio)
+    })
+
+    it('should identify code files', () => {
+      jest.mocked(mime.getExtension).mockReturnValue('html')
+      expect(getFileAppearanceType('index.html', 'text/html'))
+        .toBe(FileAppearanceTypeEnum.code)
+    })
+
+    it('should identify PDF files', () => {
+      jest.mocked(mime.getExtension).mockReturnValue('pdf')
+      expect(getFileAppearanceType('doc.pdf', 'application/pdf'))
+        .toBe(FileAppearanceTypeEnum.pdf)
+    })
+
+    it('should identify markdown files', () => {
+      jest.mocked(mime.getExtension).mockReturnValue('md')
+      expect(getFileAppearanceType('file.md', 'text/markdown'))
+        .toBe(FileAppearanceTypeEnum.markdown)
+
+      jest.mocked(mime.getExtension).mockReturnValue('markdown')
+      expect(getFileAppearanceType('file.markdown', 'text/markdown'))
+        .toBe(FileAppearanceTypeEnum.markdown)
+
+      jest.mocked(mime.getExtension).mockReturnValue('mdx')
+      expect(getFileAppearanceType('file.mdx', 'text/mdx'))
+        .toBe(FileAppearanceTypeEnum.markdown)
+    })
+
+    it('should identify excel files', () => {
+      jest.mocked(mime.getExtension).mockReturnValue('xlsx')
+      expect(getFileAppearanceType('doc.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'))
+        .toBe(FileAppearanceTypeEnum.excel)
+
+      jest.mocked(mime.getExtension).mockReturnValue('xls')
+      expect(getFileAppearanceType('doc.xls', 'application/vnd.ms-excel'))
+        .toBe(FileAppearanceTypeEnum.excel)
+    })
+
+    it('should identify word files', () => {
+      jest.mocked(mime.getExtension).mockReturnValue('doc')
+      expect(getFileAppearanceType('doc.doc', 'application/msword'))
+        .toBe(FileAppearanceTypeEnum.word)
+
+      jest.mocked(mime.getExtension).mockReturnValue('docx')
+      expect(getFileAppearanceType('doc.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'))
+        .toBe(FileAppearanceTypeEnum.word)
+    })
+
+    it('should identify word files', () => {
+      jest.mocked(mime.getExtension).mockReturnValue('ppt')
+      expect(getFileAppearanceType('doc.ppt', 'application/vnd.ms-powerpoint'))
+        .toBe(FileAppearanceTypeEnum.ppt)
+
+      jest.mocked(mime.getExtension).mockReturnValue('pptx')
+      expect(getFileAppearanceType('doc.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'))
+        .toBe(FileAppearanceTypeEnum.ppt)
+    })
+
+    it('should identify document files', () => {
+      jest.mocked(mime.getExtension).mockReturnValue('txt')
+      expect(getFileAppearanceType('file.txt', 'text/plain'))
+        .toBe(FileAppearanceTypeEnum.document)
+
+      jest.mocked(mime.getExtension).mockReturnValue('csv')
+      expect(getFileAppearanceType('file.csv', 'text/csv'))
+        .toBe(FileAppearanceTypeEnum.document)
+
+      jest.mocked(mime.getExtension).mockReturnValue('msg')
+      expect(getFileAppearanceType('file.msg', 'application/vnd.ms-outlook'))
+        .toBe(FileAppearanceTypeEnum.document)
+
+      jest.mocked(mime.getExtension).mockReturnValue('eml')
+      expect(getFileAppearanceType('file.eml', 'message/rfc822'))
+        .toBe(FileAppearanceTypeEnum.document)
+
+      jest.mocked(mime.getExtension).mockReturnValue('xml')
+      expect(getFileAppearanceType('file.xml', 'application/rssxml'))
+        .toBe(FileAppearanceTypeEnum.document)
+
+      jest.mocked(mime.getExtension).mockReturnValue('epub')
+      expect(getFileAppearanceType('file.epub', 'application/epubzip'))
+        .toBe(FileAppearanceTypeEnum.document)
+    })
+
+    it('should handle null mime extension', () => {
+      jest.mocked(mime.getExtension).mockReturnValue(null)
+      expect(getFileAppearanceType('file.txt', 'text/plain'))
+        .toBe(FileAppearanceTypeEnum.document)
+    })
+  })
+
+  describe('getSupportFileType', () => {
+    it('should return custom type when isCustom is true', () => {
+      expect(getSupportFileType('file.txt', '', true))
+        .toBe(SupportUploadFileTypes.custom)
+    })
+
+    it('should return file type when isCustom is false', () => {
+      expect(getSupportFileType('file.txt', 'text/plain'))
+        .toBe(SupportUploadFileTypes.document)
+    })
+  })
+
+  describe('getProcessedFiles', () => {
+    it('should process files correctly', () => {
+      const files = [{
+        id: '123',
+        name: 'test.txt',
+        size: 1024,
+        type: 'text/plain',
+        progress: 100,
+        supportFileType: 'document',
+        transferMethod: TransferMethod.remote_url,
+        url: 'http://example.com',
+        uploadedId: '123',
+      }]
+
+      const result = getProcessedFiles(files)
+      expect(result[0]).toEqual({
+        type: 'document',
+        transfer_method: TransferMethod.remote_url,
+        url: 'http://example.com',
+        upload_file_id: '123',
+      })
+    })
+  })
+
+  describe('getProcessedFilesFromResponse', () => {
+    it('should process files correctly', () => {
+      const files = [{
+        related_id: '2a38e2ca-1295-415d-a51d-65d4ff9912d9',
+        extension: '.jpeg',
+        filename: 'test.jpeg',
+        size: 2881761,
+        mime_type: 'image/jpeg',
+        transfer_method: TransferMethod.local_file,
+        type: 'image',
+        url: 'https://upload.dify.dev/files/xxx/file-preview',
+      }]
+
+      const result = getProcessedFilesFromResponse(files)
+      expect(result[0]).toEqual({
+        id: '2a38e2ca-1295-415d-a51d-65d4ff9912d9',
+        name: 'test.jpeg',
+        size: 2881761,
+        type: 'image/jpeg',
+        progress: 100,
+        transferMethod: TransferMethod.local_file,
+        supportFileType: 'image',
+        uploadedId: '2a38e2ca-1295-415d-a51d-65d4ff9912d9',
+        url: 'https://upload.dify.dev/files/xxx/file-preview',
+      })
+    })
+  })
+
+  describe('getFileNameFromUrl', () => {
+    it('should extract filename from URL', () => {
+      expect(getFileNameFromUrl('http://example.com/path/file.txt'))
+        .toBe('file.txt')
+    })
+  })
+
+  describe('getSupportFileExtensionList', () => {
+    it('should handle custom file types', () => {
+      const result = getSupportFileExtensionList(
+        [SupportUploadFileTypes.custom],
+        ['.pdf', '.txt', '.doc'],
+      )
+      expect(result).toEqual(['PDF', 'TXT', 'DOC'])
+    })
+
+    it('should handle standard file types', () => {
+      const mockFileExts = {
+        image: ['JPG', 'PNG'],
+        document: ['PDF', 'TXT'],
+        video: ['MP4', 'MOV'],
+      }
+
+      // Temporarily mock FILE_EXTS
+      const originalFileExts = { ...FILE_EXTS }
+      Object.assign(FILE_EXTS, mockFileExts)
+
+      const result = getSupportFileExtensionList(
+        ['image', 'document'],
+        [],
+      )
+      expect(result).toEqual(['JPG', 'PNG', 'PDF', 'TXT'])
+
+      // Restore original FILE_EXTS
+      Object.assign(FILE_EXTS, originalFileExts)
+    })
+
+    it('should return empty array for empty inputs', () => {
+      const result = getSupportFileExtensionList([], [])
+      expect(result).toEqual([])
+    })
+
+    it('should prioritize custom types over standard types', () => {
+      const mockFileExts = {
+        image: ['JPG', 'PNG'],
+      }
+
+      // Temporarily mock FILE_EXTS
+      const originalFileExts = { ...FILE_EXTS }
+      Object.assign(FILE_EXTS, mockFileExts)
+
+      const result = getSupportFileExtensionList(
+        [SupportUploadFileTypes.custom, 'image'],
+        ['.csv', '.xml'],
+      )
+      expect(result).toEqual(['CSV', 'XML'])
+
+      // Restore original FILE_EXTS
+      Object.assign(FILE_EXTS, originalFileExts)
+    })
+  })
+
+  describe('isAllowedFileExtension', () => {
+    it('should validate allowed file extensions', () => {
+      jest.mocked(mime.getExtension).mockReturnValue('pdf')
+      expect(isAllowedFileExtension(
+        'test.pdf',
+        'application/pdf',
+        ['document'],
+        ['.pdf'],
+      )).toBe(true)
+    })
+  })
+
+  describe('getFilesInLogs', () => {
+    const mockFileData = {
+      dify_model_identity: '__dify__file__',
+      related_id: '123',
+      filename: 'test.pdf',
+      size: 1024,
+      mime_type: 'application/pdf',
+      transfer_method: 'local_file',
+      type: 'document',
+      url: 'http://example.com/test.pdf',
+    }
+
+    it('should handle empty or null input', () => {
+      expect(getFilesInLogs(null)).toEqual([])
+      expect(getFilesInLogs({})).toEqual([])
+      expect(getFilesInLogs(undefined)).toEqual([])
+    })
+
+    it('should process single file object', () => {
+      const input = {
+        file1: mockFileData,
+      }
+
+      const expected = [{
+        varName: 'file1',
+        list: [{
+          id: '123',
+          name: 'test.pdf',
+          size: 1024,
+          type: 'application/pdf',
+          progress: 100,
+          transferMethod: 'local_file',
+          supportFileType: 'document',
+          uploadedId: '123',
+          url: 'http://example.com/test.pdf',
+        }],
+      }]
+
+      expect(getFilesInLogs(input)).toEqual(expected)
+    })
+
+    it('should process array of files', () => {
+      const input = {
+        files: [mockFileData, mockFileData],
+      }
+
+      const expected = [{
+        varName: 'files',
+        list: [
+          {
+            id: '123',
+            name: 'test.pdf',
+            size: 1024,
+            type: 'application/pdf',
+            progress: 100,
+            transferMethod: 'local_file',
+            supportFileType: 'document',
+            uploadedId: '123',
+            url: 'http://example.com/test.pdf',
+          },
+          {
+            id: '123',
+            name: 'test.pdf',
+            size: 1024,
+            type: 'application/pdf',
+            progress: 100,
+            transferMethod: 'local_file',
+            supportFileType: 'document',
+            uploadedId: '123',
+            url: 'http://example.com/test.pdf',
+          },
+        ],
+      }]
+
+      expect(getFilesInLogs(input)).toEqual(expected)
+    })
+
+    it('should ignore non-file objects and arrays', () => {
+      const input = {
+        regularString: 'not a file',
+        regularNumber: 123,
+        regularArray: [1, 2, 3],
+        regularObject: { key: 'value' },
+        file: mockFileData,
+      }
+
+      const expected = [{
+        varName: 'file',
+        list: [{
+          id: '123',
+          name: 'test.pdf',
+          size: 1024,
+          type: 'application/pdf',
+          progress: 100,
+          transferMethod: 'local_file',
+          supportFileType: 'document',
+          uploadedId: '123',
+          url: 'http://example.com/test.pdf',
+        }],
+      }]
+
+      expect(getFilesInLogs(input)).toEqual(expected)
+    })
+
+    it('should handle mixed file types in array', () => {
+      const input = {
+        mixedFiles: [
+          mockFileData,
+          { notAFile: true },
+          mockFileData,
+        ],
+      }
+
+      const expected = [{
+        varName: 'mixedFiles',
+        list: [
+          {
+            id: '123',
+            name: 'test.pdf',
+            size: 1024,
+            type: 'application/pdf',
+            progress: 100,
+            transferMethod: 'local_file',
+            supportFileType: 'document',
+            uploadedId: '123',
+            url: 'http://example.com/test.pdf',
+          },
+          {
+            id: undefined,
+            name: undefined,
+            progress: 100,
+            size: 0,
+            supportFileType: undefined,
+            transferMethod: undefined,
+            type: undefined,
+            uploadedId: undefined,
+            url: undefined,
+          },
+          {
+            id: '123',
+            name: 'test.pdf',
+            size: 1024,
+            type: 'application/pdf',
+            progress: 100,
+            transferMethod: 'local_file',
+            supportFileType: 'document',
+            uploadedId: '123',
+            url: 'http://example.com/test.pdf',
+          },
+        ],
+      }]
+
+      expect(getFilesInLogs(input)).toEqual(expected)
+    })
+  })
+
+  describe('fileIsUploaded', () => {
+    it('should identify uploaded files', () => {
+      expect(fileIsUploaded({
+        uploadedId: '123',
+        progress: 100,
+      } as any)).toBe(true)
+    })
+
+    it('should identify remote files as uploaded', () => {
+      expect(fileIsUploaded({
+        transferMethod: TransferMethod.remote_url,
+        progress: 100,
+      } as any)).toBe(true)
+    })
+  })
+
+  describe('downloadFile', () => {
+    let mockAnchor: HTMLAnchorElement
+    let createElementMock: jest.SpyInstance
+    let appendChildMock: jest.SpyInstance
+    let removeChildMock: jest.SpyInstance
+
+    beforeEach(() => {
+      // Mock createElement and appendChild
+      mockAnchor = {
+        href: '',
+        download: '',
+        style: { display: '' },
+        target: '',
+        title: '',
+        click: jest.fn(),
+      } as unknown as HTMLAnchorElement
+
+      createElementMock = jest.spyOn(document, 'createElement').mockReturnValue(mockAnchor as any)
+      appendChildMock = jest.spyOn(document.body, 'appendChild').mockImplementation((node: Node) => {
+        return node
+      })
+      removeChildMock = jest.spyOn(document.body, 'removeChild').mockImplementation((node: Node) => {
+        return node
+      })
+    })
+
+    afterEach(() => {
+      jest.resetAllMocks()
+    })
+
+    it('should create and trigger download with correct attributes', () => {
+      const url = 'https://example.com/test.pdf'
+      const filename = 'test.pdf'
+
+      downloadFile(url, filename)
+
+      // Verify anchor element was created with correct properties
+      expect(createElementMock).toHaveBeenCalledWith('a')
+      expect(mockAnchor.href).toBe(url)
+      expect(mockAnchor.download).toBe(filename)
+      expect(mockAnchor.style.display).toBe('none')
+      expect(mockAnchor.target).toBe('_blank')
+      expect(mockAnchor.title).toBe(filename)
+
+      // Verify DOM operations
+      expect(appendChildMock).toHaveBeenCalledWith(mockAnchor)
+      expect(mockAnchor.click).toHaveBeenCalled()
+      expect(removeChildMock).toHaveBeenCalledWith(mockAnchor)
+    })
+
+    it('should handle empty filename', () => {
+      const url = 'https://example.com/test.pdf'
+      const filename = ''
+
+      downloadFile(url, filename)
+
+      expect(mockAnchor.download).toBe('')
+      expect(mockAnchor.title).toBe('')
+    })
+
+    it('should handle empty url', () => {
+      const url = ''
+      const filename = 'test.pdf'
+
+      downloadFile(url, filename)
+
+      expect(mockAnchor.href).toBe('')
+    })
+  })
+})
diff --git a/app/components/base/file-uploader/utils.ts b/app/components/base/file-uploader/utils.ts
new file mode 100644
index 0000000..e05c0b2
--- /dev/null
+++ b/app/components/base/file-uploader/utils.ts
@@ -0,0 +1,196 @@
+import mime from 'mime'
+import { FileAppearanceTypeEnum } from './types'
+import type { FileEntity } from './types'
+import { upload } from '@/service/base'
+import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'
+import { SupportUploadFileTypes } from '@/app/components/workflow/types'
+import type { FileResponse } from '@/types/workflow'
+import { TransferMethod } from '@/types/app'
+
+type FileUploadParams = {
+  file: File
+  onProgressCallback: (progress: number) => void
+  onSuccessCallback: (res: { id: string }) => void
+  onErrorCallback: () => void
+}
+type FileUpload = (v: FileUploadParams, isPublic?: boolean, url?: string) => void
+export const fileUpload: FileUpload = ({
+  file,
+  onProgressCallback,
+  onSuccessCallback,
+  onErrorCallback,
+}, isPublic, url) => {
+  const formData = new FormData()
+  formData.append('file', file)
+  const onProgress = (e: ProgressEvent) => {
+    if (e.lengthComputable) {
+      const percent = Math.floor(e.loaded / e.total * 100)
+      onProgressCallback(percent)
+    }
+  }
+
+  upload({
+    xhr: new XMLHttpRequest(),
+    data: formData,
+    onprogress: onProgress,
+  }, isPublic, url)
+    .then((res: { id: string }) => {
+      onSuccessCallback(res)
+    })
+    .catch(() => {
+      onErrorCallback()
+    })
+}
+
+export const getFileExtension = (fileName: string, fileMimetype: string, isRemote?: boolean) => {
+  let extension = ''
+  if (fileMimetype)
+    extension = mime.getExtension(fileMimetype) || ''
+
+  if (fileName && !extension) {
+    const fileNamePair = fileName.split('.')
+    const fileNamePairLength = fileNamePair.length
+
+    if (fileNamePairLength > 1)
+      extension = fileNamePair[fileNamePairLength - 1]
+    else
+      extension = ''
+  }
+
+  if (isRemote)
+    extension = ''
+
+  return extension
+}
+
+export const getFileAppearanceType = (fileName: string, fileMimetype: string) => {
+  const extension = getFileExtension(fileName, fileMimetype)
+
+  if (extension === 'gif')
+    return FileAppearanceTypeEnum.gif
+
+  if (FILE_EXTS.image.includes(extension.toUpperCase()))
+    return FileAppearanceTypeEnum.image
+
+  if (FILE_EXTS.video.includes(extension.toUpperCase()))
+    return FileAppearanceTypeEnum.video
+
+  if (FILE_EXTS.audio.includes(extension.toUpperCase()))
+    return FileAppearanceTypeEnum.audio
+
+  if (extension === 'html')
+    return FileAppearanceTypeEnum.code
+
+  if (extension === 'pdf')
+    return FileAppearanceTypeEnum.pdf
+
+  if (extension === 'md' || extension === 'markdown' || extension === 'mdx')
+    return FileAppearanceTypeEnum.markdown
+
+  if (extension === 'xlsx' || extension === 'xls')
+    return FileAppearanceTypeEnum.excel
+
+  if (extension === 'docx' || extension === 'doc')
+    return FileAppearanceTypeEnum.word
+
+  if (extension === 'pptx' || extension === 'ppt')
+    return FileAppearanceTypeEnum.ppt
+
+  if (FILE_EXTS.document.includes(extension.toUpperCase()))
+    return FileAppearanceTypeEnum.document
+
+  return FileAppearanceTypeEnum.custom
+}
+
+export const getSupportFileType = (fileName: string, fileMimetype: string, isCustom?: boolean) => {
+  if (isCustom)
+    return SupportUploadFileTypes.custom
+
+  const extension = getFileExtension(fileName, fileMimetype)
+  for (const key in FILE_EXTS) {
+    if ((FILE_EXTS[key]).includes(extension.toUpperCase()))
+      return key
+  }
+
+  return ''
+}
+
+export const getProcessedFiles = (files: FileEntity[]) => {
+  return files.filter(file => file.progress !== -1).map(fileItem => ({
+    type: fileItem.supportFileType,
+    transfer_method: fileItem.transferMethod,
+    url: fileItem.url || '',
+    upload_file_id: fileItem.uploadedId || '',
+  }))
+}
+
+export const getProcessedFilesFromResponse = (files: FileResponse[]) => {
+  return files.map((fileItem) => {
+    return {
+      id: fileItem.related_id,
+      name: fileItem.filename,
+      size: fileItem.size || 0,
+      type: fileItem.mime_type,
+      progress: 100,
+      transferMethod: fileItem.transfer_method,
+      supportFileType: fileItem.type,
+      uploadedId: fileItem.upload_file_id || fileItem.related_id,
+      url: fileItem.url,
+    }
+  })
+}
+
+export const getFileNameFromUrl = (url: string) => {
+  const urlParts = url.split('/')
+  return urlParts[urlParts.length - 1] || ''
+}
+
+export const getSupportFileExtensionList = (allowFileTypes: string[], allowFileExtensions: string[]) => {
+  if (allowFileTypes.includes(SupportUploadFileTypes.custom))
+    return allowFileExtensions.map(item => item.slice(1).toUpperCase())
+
+  return allowFileTypes.map(type => FILE_EXTS[type]).flat()
+}
+
+export const isAllowedFileExtension = (fileName: string, fileMimetype: string, allowFileTypes: string[], allowFileExtensions: string[]) => {
+  return getSupportFileExtensionList(allowFileTypes, allowFileExtensions).includes(getFileExtension(fileName, fileMimetype).toUpperCase())
+}
+
+export const getFilesInLogs = (rawData: any) => {
+  const result = Object.keys(rawData || {}).map((key) => {
+    if (typeof rawData[key] === 'object' && rawData[key]?.dify_model_identity === '__dify__file__') {
+      return {
+        varName: key,
+        list: getProcessedFilesFromResponse([rawData[key]]),
+      }
+    }
+    if (Array.isArray(rawData[key]) && rawData[key].some(item => item?.dify_model_identity === '__dify__file__')) {
+      return {
+        varName: key,
+        list: getProcessedFilesFromResponse(rawData[key]),
+      }
+    }
+    return undefined
+  }).filter(Boolean)
+  return result
+}
+
+export const fileIsUploaded = (file: FileEntity) => {
+  if (file.uploadedId)
+    return true
+
+  if (file.transferMethod === TransferMethod.remote_url && file.progress === 100)
+    return true
+}
+
+export const downloadFile = (url: string, filename: string) => {
+  const anchor = document.createElement('a')
+  anchor.href = url
+  anchor.download = filename
+  anchor.style.display = 'none'
+  anchor.target = '_blank'
+  anchor.title = filename
+  document.body.appendChild(anchor)
+  anchor.click()
+  document.body.removeChild(anchor)
+}
diff --git a/app/components/base/file-uploader/video-preview.tsx b/app/components/base/file-uploader/video-preview.tsx
new file mode 100644
index 0000000..16ae27c
--- /dev/null
+++ b/app/components/base/file-uploader/video-preview.tsx
@@ -0,0 +1,45 @@
+import type { FC } from 'react'
+import { createPortal } from 'react-dom'
+import { RiCloseLine } from '@remixicon/react'
+import React from 'react'
+import { useHotkeys } from 'react-hotkeys-hook'
+
+type VideoPreviewProps = {
+  url: string
+  title: string
+  onCancel: () => void
+}
+const VideoPreview: FC<VideoPreviewProps> = ({
+  url,
+  title,
+  onCancel,
+}) => {
+  useHotkeys('esc', onCancel)
+
+  return createPortal(
+    <div
+      className='fixed inset-0 z-[1000] flex items-center justify-center bg-black/80 p-8'
+      onClick={e => e.stopPropagation()}
+      tabIndex={-1}
+    >
+      <div>
+        <video controls title={title} autoPlay={false} preload="metadata">
+          <source
+            type="video/mp4"
+            src={url}
+            className='max-h-full max-w-full'
+          />
+        </video>
+      </div>
+      <div
+        className='absolute right-6 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg bg-white/[0.08] backdrop-blur-[2px]'
+        onClick={onCancel}
+      >
+        <RiCloseLine className='h-4 w-4 text-gray-500'/>
+      </div>
+    </div>,
+    document.body,
+  )
+}
+
+export default VideoPreview
diff --git a/app/components/base/float-popover-container/index.tsx b/app/components/base/float-popover-container/index.tsx
new file mode 100644
index 0000000..be5db82
--- /dev/null
+++ b/app/components/base/float-popover-container/index.tsx
@@ -0,0 +1,37 @@
+'use client'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import type { PortalToFollowElemOptions } from '@/app/components/base/portal-to-follow-elem'
+
+type IFloatRightContainerProps = {
+  isMobile: boolean
+  open: boolean
+  toggle: () => void
+  triggerElement?: React.ReactNode
+  children?: React.ReactNode
+} & PortalToFollowElemOptions
+
+const FloatRightContainer = ({ open, toggle, triggerElement, isMobile, children, ...portalProps }: IFloatRightContainerProps) => {
+  return (
+    <>
+      {isMobile && (
+        <PortalToFollowElem open={open} {...portalProps}>
+          <PortalToFollowElemTrigger onClick={toggle}>
+            {triggerElement}
+          </PortalToFollowElemTrigger>
+          <PortalToFollowElemContent>
+            {children}
+          </PortalToFollowElemContent>
+        </PortalToFollowElem>
+      )}
+      {!isMobile && open && (
+        <>{children}</>
+      )}
+    </>
+  )
+}
+
+export default FloatRightContainer
diff --git a/app/components/base/float-right-container/index.tsx b/app/components/base/float-right-container/index.tsx
new file mode 100644
index 0000000..4148c70
--- /dev/null
+++ b/app/components/base/float-right-container/index.tsx
@@ -0,0 +1,23 @@
+'use client'
+import Drawer from '@/app/components/base/drawer'
+import type { IDrawerProps } from '@/app/components/base/drawer'
+
+type IFloatRightContainerProps = {
+  isMobile: boolean
+  children?: React.ReactNode
+} & IDrawerProps
+
+const FloatRightContainer = ({ isMobile, children, isOpen, ...drawerProps }: IFloatRightContainerProps) => {
+  return (
+    <>
+      {isMobile && (
+        <Drawer isOpen={isOpen} {...drawerProps}>{children}</Drawer>
+      )}
+      {(!isMobile && isOpen) && (
+        <>{children}</>
+      )}
+    </>
+  )
+}
+
+export default FloatRightContainer
diff --git a/app/components/base/form/components/field/checkbox.tsx b/app/components/base/form/components/field/checkbox.tsx
new file mode 100644
index 0000000..855dbd8
--- /dev/null
+++ b/app/components/base/form/components/field/checkbox.tsx
@@ -0,0 +1,43 @@
+import cn from '@/utils/classnames'
+import { useFieldContext } from '../..'
+import Checkbox from '../../../checkbox'
+
+type CheckboxFieldProps = {
+  label: string;
+  labelClassName?: string;
+}
+
+const CheckboxField = ({
+  label,
+  labelClassName,
+}: CheckboxFieldProps) => {
+  const field = useFieldContext<boolean>()
+
+  return (
+    <div className='flex gap-2'>
+      <div className='flex h-6 shrink-0 items-center'>
+        <Checkbox
+          id={field.name}
+          checked={field.state.value}
+          onCheck={() => {
+            field.handleChange(!field.state.value)
+          }}
+        />
+      </div>
+      <label
+        htmlFor={field.name}
+        className={cn(
+          'system-sm-medium grow cursor-pointer pt-1 text-text-secondary',
+          labelClassName,
+        )}
+        onClick={() => {
+          field.handleChange(!field.state.value)
+        }}
+      >
+        {label}
+      </label>
+    </div>
+  )
+}
+
+export default CheckboxField
diff --git a/app/components/base/form/components/field/number-input.tsx b/app/components/base/form/components/field/number-input.tsx
new file mode 100644
index 0000000..fce3143
--- /dev/null
+++ b/app/components/base/form/components/field/number-input.tsx
@@ -0,0 +1,49 @@
+import React from 'react'
+import { useFieldContext } from '../..'
+import Label from '../label'
+import cn from '@/utils/classnames'
+import type { InputNumberProps } from '../../../input-number'
+import { InputNumber } from '../../../input-number'
+
+type TextFieldProps = {
+  label: string
+  isRequired?: boolean
+  showOptional?: boolean
+  tooltip?: string
+  className?: string
+  labelClassName?: string
+} & Omit<InputNumberProps, 'id' | 'value' | 'onChange' | 'onBlur'>
+
+const NumberInputField = ({
+  label,
+  isRequired,
+  showOptional,
+  tooltip,
+  className,
+  labelClassName,
+  ...inputProps
+}: TextFieldProps) => {
+  const field = useFieldContext<number | undefined>()
+
+  return (
+    <div className={cn('flex flex-col gap-y-0.5', className)}>
+      <Label
+        htmlFor={field.name}
+        label={label}
+        isRequired={isRequired}
+        showOptional={showOptional}
+        tooltip={tooltip}
+        className={labelClassName}
+      />
+      <InputNumber
+        id={field.name}
+        value={field.state.value}
+        onChange={value => field.handleChange(value)}
+        onBlur={field.handleBlur}
+        {...inputProps}
+      />
+    </div>
+  )
+}
+
+export default NumberInputField
diff --git a/app/components/base/form/components/field/options.tsx b/app/components/base/form/components/field/options.tsx
new file mode 100644
index 0000000..9ff71e5
--- /dev/null
+++ b/app/components/base/form/components/field/options.tsx
@@ -0,0 +1,34 @@
+import cn from '@/utils/classnames'
+import { useFieldContext } from '../..'
+import Label from '../label'
+import ConfigSelect from '@/app/components/app/configuration/config-var/config-select'
+
+type OptionsFieldProps = {
+  label: string;
+  className?: string;
+  labelClassName?: string;
+}
+
+const OptionsField = ({
+  label,
+  className,
+  labelClassName,
+}: OptionsFieldProps) => {
+  const field = useFieldContext<string[]>()
+
+  return (
+    <div className={cn('flex flex-col gap-y-0.5', className)}>
+      <Label
+        htmlFor={field.name}
+        label={label}
+        className={labelClassName}
+      />
+      <ConfigSelect
+        options={field.state.value}
+        onChange={value => field.handleChange(value)}
+      />
+    </div>
+  )
+}
+
+export default OptionsField
diff --git a/app/components/base/form/components/field/select.tsx b/app/components/base/form/components/field/select.tsx
new file mode 100644
index 0000000..95af3c0
--- /dev/null
+++ b/app/components/base/form/components/field/select.tsx
@@ -0,0 +1,51 @@
+import cn from '@/utils/classnames'
+import { useFieldContext } from '../..'
+import PureSelect from '../../../select/pure'
+import Label from '../label'
+
+type SelectOption = {
+  value: string
+  label: string
+}
+
+type SelectFieldProps = {
+  label: string
+  options: SelectOption[]
+  isRequired?: boolean
+  showOptional?: boolean
+  tooltip?: string
+  className?: string
+  labelClassName?: string
+}
+
+const SelectField = ({
+  label,
+  options,
+  isRequired,
+  showOptional,
+  tooltip,
+  className,
+  labelClassName,
+}: SelectFieldProps) => {
+  const field = useFieldContext<string>()
+
+  return (
+    <div className={cn('flex flex-col gap-y-0.5', className)}>
+      <Label
+        htmlFor={field.name}
+        label={label}
+        isRequired={isRequired}
+        showOptional={showOptional}
+        tooltip={tooltip}
+        className={labelClassName}
+      />
+      <PureSelect
+        value={field.state.value}
+        options={options}
+        onChange={value => field.handleChange(value)}
+      />
+    </div>
+  )
+}
+
+export default SelectField
diff --git a/app/components/base/form/components/field/text.tsx b/app/components/base/form/components/field/text.tsx
new file mode 100644
index 0000000..b209029
--- /dev/null
+++ b/app/components/base/form/components/field/text.tsx
@@ -0,0 +1,48 @@
+import React from 'react'
+import { useFieldContext } from '../..'
+import Input, { type InputProps } from '../../../input'
+import Label from '../label'
+import cn from '@/utils/classnames'
+
+type TextFieldProps = {
+  label: string
+  isRequired?: boolean
+  showOptional?: boolean
+  tooltip?: string
+  className?: string
+  labelClassName?: string
+} & Omit<InputProps, 'className' | 'onChange' | 'onBlur' | 'value' | 'id'>
+
+const TextField = ({
+  label,
+  isRequired,
+  showOptional,
+  tooltip,
+  className,
+  labelClassName,
+  ...inputProps
+}: TextFieldProps) => {
+  const field = useFieldContext<string>()
+
+  return (
+    <div className={cn('flex flex-col gap-y-0.5', className)}>
+      <Label
+        htmlFor={field.name}
+        label={label}
+        isRequired={isRequired}
+        showOptional={showOptional}
+        tooltip={tooltip}
+        className={labelClassName}
+      />
+      <Input
+        id={field.name}
+        value={field.state.value}
+        onChange={e => field.handleChange(e.target.value)}
+        onBlur={field.handleBlur}
+        {...inputProps}
+      />
+    </div>
+  )
+}
+
+export default TextField
diff --git a/app/components/base/form/components/form/submit-button.tsx b/app/components/base/form/components/form/submit-button.tsx
new file mode 100644
index 0000000..494d19b
--- /dev/null
+++ b/app/components/base/form/components/form/submit-button.tsx
@@ -0,0 +1,25 @@
+import { useStore } from '@tanstack/react-form'
+import { useFormContext } from '../..'
+import Button, { type ButtonProps } from '../../../button'
+
+type SubmitButtonProps = Omit<ButtonProps, 'disabled' | 'loading' | 'onClick'>
+
+const SubmitButton = ({ ...buttonProps }: SubmitButtonProps) => {
+  const form = useFormContext()
+
+  const [isSubmitting, canSubmit] = useStore(form.store, state => [
+    state.isSubmitting,
+    state.canSubmit,
+  ])
+
+  return (
+    <Button
+      disabled={isSubmitting || !canSubmit}
+      loading={isSubmitting}
+      onClick={() => form.handleSubmit()}
+      {...buttonProps}
+    />
+  )
+}
+
+export default SubmitButton
diff --git a/app/components/base/form/components/label.spec.tsx b/app/components/base/form/components/label.spec.tsx
new file mode 100644
index 0000000..b2dc98a
--- /dev/null
+++ b/app/components/base/form/components/label.spec.tsx
@@ -0,0 +1,53 @@
+import { fireEvent, render, screen } from '@testing-library/react'
+import Label from './label'
+
+jest.mock('react-i18next', () => ({
+  useTranslation: () => ({
+    t: (key: string) => key,
+  }),
+}))
+
+describe('Label Component', () => {
+  const defaultProps = {
+    htmlFor: 'test-input',
+    label: 'Test Label',
+  }
+
+  it('renders basic label correctly', () => {
+    render(<Label {...defaultProps} />)
+    const label = screen.getByTestId('label')
+    expect(label).toBeInTheDocument()
+    expect(label).toHaveAttribute('for', 'test-input')
+  })
+
+  it('shows optional text when showOptional is true', () => {
+    render(<Label {...defaultProps} showOptional />)
+    expect(screen.getByText('common.label.optional')).toBeInTheDocument()
+  })
+
+  it('shows required asterisk when isRequired is true', () => {
+    render(<Label {...defaultProps} isRequired />)
+    expect(screen.getByText('*')).toBeInTheDocument()
+  })
+
+  it('renders tooltip when tooltip prop is provided', () => {
+    const tooltipText = 'Test Tooltip'
+    render(<Label {...defaultProps} tooltip={tooltipText} />)
+    const trigger = screen.getByTestId('test-input-tooltip')
+    fireEvent.mouseEnter(trigger)
+    expect(screen.getByText(tooltipText)).toBeInTheDocument()
+  })
+
+  it('applies custom className when provided', () => {
+    const customClass = 'custom-label'
+    render(<Label {...defaultProps} className={customClass} />)
+    const label = screen.getByTestId('label')
+    expect(label).toHaveClass(customClass)
+  })
+
+  it('does not show optional text and required asterisk simultaneously', () => {
+    render(<Label {...defaultProps} isRequired showOptional />)
+    expect(screen.queryByText('common.label.optional')).not.toBeInTheDocument()
+    expect(screen.getByText('*')).toBeInTheDocument()
+  })
+})
diff --git a/app/components/base/form/components/label.tsx b/app/components/base/form/components/label.tsx
new file mode 100644
index 0000000..4b104c9
--- /dev/null
+++ b/app/components/base/form/components/label.tsx
@@ -0,0 +1,48 @@
+import cn from '@/utils/classnames'
+import Tooltip from '../../tooltip'
+import { useTranslation } from 'react-i18next'
+
+export type LabelProps = {
+  htmlFor: string
+  label: string
+  isRequired?: boolean
+  showOptional?: boolean
+  tooltip?: string
+  className?: string
+}
+
+const Label = ({
+  htmlFor,
+  label,
+  isRequired,
+  showOptional,
+  tooltip,
+  className,
+}: LabelProps) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex h-6 items-center'>
+      <label
+        data-testid='label'
+        htmlFor={htmlFor}
+        className={cn('system-sm-medium text-text-secondary', className)}
+      >
+        {label}
+      </label>
+      {!isRequired && showOptional && <div className='system-xs-regular ml-1 text-text-tertiary'>{t('common.label.optional')}</div>}
+      {isRequired && <div className='system-xs-regular ml-1 text-text-destructive-secondary'>*</div>}
+      {tooltip && (
+        <Tooltip
+          popupContent={
+            <div className='w-[200px]'>{tooltip}</div>
+          }
+          triggerClassName='ml-0.5 w-4 h-4'
+          triggerTestId={`${htmlFor}-tooltip`}
+        />
+      )}
+    </div>
+  )
+}
+
+export default Label
diff --git a/app/components/base/form/form-scenarios/demo/contact-fields.tsx b/app/components/base/form/form-scenarios/demo/contact-fields.tsx
new file mode 100644
index 0000000..9ba664f
--- /dev/null
+++ b/app/components/base/form/form-scenarios/demo/contact-fields.tsx
@@ -0,0 +1,35 @@
+import { withForm } from '../..'
+import { demoFormOpts } from './shared-options'
+import { ContactMethods } from './types'
+
+const ContactFields = withForm({
+  ...demoFormOpts,
+  render: ({ form }) => {
+    return (
+      <div className='my-2'>
+        <h3 className='title-lg-bold text-text-primary'>Contacts</h3>
+        <div className='flex flex-col gap-4'>
+          <form.AppField
+            name='contact.email'
+            children={field => <field.TextField label='Email' />}
+          />
+          <form.AppField
+            name='contact.phone'
+            children={field => <field.TextField label='Phone' />}
+          />
+          <form.AppField
+            name='contact.preferredContactMethod'
+            children={field => (
+              <field.SelectField
+                label='Preferred Contact Method'
+                options={ContactMethods}
+              />
+            )}
+          />
+        </div>
+      </div>
+    )
+  },
+})
+
+export default ContactFields
diff --git a/app/components/base/form/form-scenarios/demo/index.tsx b/app/components/base/form/form-scenarios/demo/index.tsx
new file mode 100644
index 0000000..f08edee
--- /dev/null
+++ b/app/components/base/form/form-scenarios/demo/index.tsx
@@ -0,0 +1,68 @@
+import { useStore } from '@tanstack/react-form'
+import { useAppForm } from '../..'
+import ContactFields from './contact-fields'
+import { demoFormOpts } from './shared-options'
+import { UserSchema } from './types'
+
+const DemoForm = () => {
+  const form = useAppForm({
+    ...demoFormOpts,
+    validators: {
+      onSubmit: ({ value }) => {
+        // Validate the entire form
+        const result = UserSchema.safeParse(value)
+        if (!result.success) {
+          const issues = result.error.issues
+          console.log('Validation errors:', issues)
+          return issues[0].message
+        }
+        return undefined
+      },
+    },
+    onSubmit: ({ value }) => {
+      console.log('Form submitted:', value)
+    },
+  })
+
+const name = useStore(form.store, state => state.values.name)
+
+  return (
+    <form
+      className='flex w-[400px] flex-col gap-4'
+      onSubmit={(e) => {
+        e.preventDefault()
+        e.stopPropagation()
+        form.handleSubmit()
+      }}
+    >
+      <form.AppField
+        name='name'
+        children={field => (
+          <field.TextField label='Name' />
+        )}
+      />
+      <form.AppField
+        name='surname'
+        children={field => (
+          <field.TextField label='Surname' />
+        )}
+      />
+      <form.AppField
+        name='isAcceptingTerms'
+        children={field => (
+          <field.CheckboxField label='I accept the terms and conditions.' />
+        )}
+      />
+      {
+        !!name && (
+          <ContactFields form={form} />
+        )
+      }
+      <form.AppForm>
+        <form.SubmitButton>Submit</form.SubmitButton>
+      </form.AppForm>
+    </form>
+  )
+}
+
+export default DemoForm
diff --git a/app/components/base/form/form-scenarios/demo/shared-options.tsx b/app/components/base/form/form-scenarios/demo/shared-options.tsx
new file mode 100644
index 0000000..8b216c8
--- /dev/null
+++ b/app/components/base/form/form-scenarios/demo/shared-options.tsx
@@ -0,0 +1,14 @@
+import { formOptions } from '@tanstack/react-form'
+
+export const demoFormOpts = formOptions({
+  defaultValues: {
+    name: '',
+    surname: '',
+    isAcceptingTerms: false,
+    contact: {
+      email: '',
+      phone: '',
+      preferredContactMethod: 'email',
+    },
+  },
+})
diff --git a/app/components/base/form/form-scenarios/demo/types.ts b/app/components/base/form/form-scenarios/demo/types.ts
new file mode 100644
index 0000000..c4e626e
--- /dev/null
+++ b/app/components/base/form/form-scenarios/demo/types.ts
@@ -0,0 +1,34 @@
+import { z } from 'zod'
+
+const ContactMethod = z.union([
+  z.literal('email'),
+  z.literal('phone'),
+  z.literal('whatsapp'),
+  z.literal('sms'),
+])
+
+export const ContactMethods = ContactMethod.options.map(({ value }) => ({
+  value,
+  label: value.charAt(0).toUpperCase() + value.slice(1),
+}))
+
+export const UserSchema = z.object({
+  name: z
+    .string()
+    .regex(/^[A-Z]/, 'Name must start with a capital letter')
+    .min(3, 'Name must be at least 3 characters long'),
+  surname: z
+    .string()
+    .min(3, 'Surname must be at least 3 characters long')
+    .regex(/^[A-Z]/, 'Surname must start with a capital letter'),
+  isAcceptingTerms: z.boolean().refine(val => val, {
+    message: 'You must accept the terms and conditions',
+  }),
+  contact: z.object({
+    email: z.string().email('Invalid email address'),
+    phone: z.string().optional(),
+    preferredContactMethod: ContactMethod,
+  }),
+})
+
+export type User = z.infer<typeof UserSchema>
diff --git a/app/components/base/form/index.tsx b/app/components/base/form/index.tsx
new file mode 100644
index 0000000..aeb482a
--- /dev/null
+++ b/app/components/base/form/index.tsx
@@ -0,0 +1,25 @@
+import { createFormHook, createFormHookContexts } from '@tanstack/react-form'
+import TextField from './components/field/text'
+import NumberInputField from './components/field/number-input'
+import CheckboxField from './components/field/checkbox'
+import SelectField from './components/field/select'
+import OptionsField from './components/field/options'
+import SubmitButton from './components/form/submit-button'
+
+export const { fieldContext, useFieldContext, formContext, useFormContext }
+  = createFormHookContexts()
+
+export const { useAppForm, withForm } = createFormHook({
+  fieldComponents: {
+    TextField,
+    NumberInputField,
+    CheckboxField,
+    SelectField,
+    OptionsField,
+  },
+  formComponents: {
+    SubmitButton,
+  },
+  fieldContext,
+  formContext,
+})
diff --git a/app/components/base/fullscreen-modal/index.tsx b/app/components/base/fullscreen-modal/index.tsx
new file mode 100644
index 0000000..209507a
--- /dev/null
+++ b/app/components/base/fullscreen-modal/index.tsx
@@ -0,0 +1,74 @@
+import { Dialog, DialogPanel, Transition, TransitionChild } from '@headlessui/react'
+import { RiCloseLargeLine } from '@remixicon/react'
+import classNames from '@/utils/classnames'
+import { noop } from 'lodash-es'
+
+type IModal = {
+  className?: string
+  wrapperClassName?: string
+  open: boolean
+  onClose?: () => void
+  title?: React.ReactNode
+  description?: React.ReactNode
+  children?: React.ReactNode
+  closable?: boolean
+  overflowVisible?: boolean
+}
+
+export default function FullScreenModal({
+  className,
+  wrapperClassName,
+  open,
+  onClose = noop,
+  children,
+  closable = false,
+  overflowVisible = false,
+}: IModal) {
+  return (
+    <Transition show={open} appear>
+      <Dialog as="div" className={classNames('modal-dialog', wrapperClassName)} onClose={onClose}>
+        <TransitionChild>
+          <div className={classNames(
+            'fixed inset-0 bg-background-overlay-backdrop backdrop-blur-[6px]',
+            'duration-300 ease-in data-[closed]:opacity-0',
+            'data-[enter]:opacity-100',
+            'data-[leave]:opacity-0',
+          )} />
+        </TransitionChild>
+
+        <div
+          className="fixed inset-0 h-screen w-screen p-4"
+          onClick={(e) => {
+            e.preventDefault()
+            e.stopPropagation()
+          }}
+        >
+          <div className="relative h-full w-full rounded-2xl border border-effects-highlight bg-background-default-subtle">
+            <TransitionChild>
+              <DialogPanel className={classNames(
+                'h-full',
+                overflowVisible ? 'overflow-visible' : 'overflow-hidden',
+                'duration-100 ease-in data-[closed]:opacity-0 data-[closed]:scale-95',
+                'data-[enter]:opacity-100 data-[enter]:scale-100',
+                'data-[leave]:opacity-0 data-[enter]:scale-95',
+                className,
+              )}>
+                {closable
+                  && <div
+                    className='absolute right-3 top-3 z-50 flex h-9 w-9 cursor-pointer items-center justify-center
+                  rounded-[10px] bg-components-button-tertiary-bg hover:bg-components-button-tertiary-bg-hover'
+                    onClick={(e) => {
+                      e.stopPropagation()
+                      onClose()
+                    }}>
+                    <RiCloseLargeLine className='h-3.5 w-3.5 text-components-button-tertiary-text' />
+                  </div>}
+                {children}
+              </DialogPanel>
+            </TransitionChild>
+          </div>
+        </div>
+      </Dialog>
+    </Transition>
+  )
+}
diff --git a/app/components/base/ga/index.tsx b/app/components/base/ga/index.tsx
new file mode 100644
index 0000000..7a95561
--- /dev/null
+++ b/app/components/base/ga/index.tsx
@@ -0,0 +1,60 @@
+import type { FC } from 'react'
+import React from 'react'
+import Script from 'next/script'
+import { type UnsafeUnwrappedHeaders, headers } from 'next/headers'
+import { IS_CE_EDITION } from '@/config'
+
+export enum GaType {
+  admin = 'admin',
+  webapp = 'webapp',
+}
+
+const gaIdMaps = {
+  [GaType.admin]: 'G-DM9497FN4V',
+  [GaType.webapp]: 'G-2MFWXK7WYT',
+}
+
+export type IGAProps = {
+  gaType: GaType
+}
+
+const GA: FC<IGAProps> = ({
+  gaType,
+}) => {
+  if (IS_CE_EDITION)
+    return null
+
+  const nonce = process.env.NODE_ENV === 'production' ? (headers() as unknown as UnsafeUnwrappedHeaders).get('x-nonce') : ''
+
+  return (
+    <>
+      <Script
+        strategy="beforeInteractive"
+        async
+        src={`https://www.googletagmanager.com/gtag/js?id=${gaIdMaps[gaType]}`}
+        nonce={nonce!}
+      ></Script>
+      <Script
+        id="ga-init"
+        dangerouslySetInnerHTML={{
+          __html: `
+window.dataLayer = window.dataLayer || [];
+function gtag(){dataLayer.push(arguments);}
+gtag('js', new Date());
+gtag('config', '${gaIdMaps[gaType]}');
+          `,
+        }}
+        nonce={nonce!}
+      >
+      </Script>
+      {/* Cookie banner */}
+      <Script
+        id="cookieyes"
+        src='https://cdn-cookieyes.com/client_data/2a645945fcae53f8e025a2b1/script.js'
+        nonce={nonce!}
+      ></Script>
+    </>
+
+  )
+}
+export default React.memo(GA)
diff --git a/app/components/base/grid-mask/Grid.svg b/app/components/base/grid-mask/Grid.svg
new file mode 100644
index 0000000..88cdeea
--- /dev/null
+++ b/app/components/base/grid-mask/Grid.svg
@@ -0,0 +1,2146 @@
+<svg width="1480" height="800" viewBox="0 0 1480 800" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g opacity="0.3">
+<rect x="-17.7148" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect opacity="0.7" x="342.285" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect opacity="0.5" x="990.285" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="24" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="24" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="24" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="48" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect opacity="0.7" x="582.285" y="48" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="48" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="48" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="72" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="72" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect opacity="0.5" x="102.285" y="96" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect opacity="0.7" x="270.285" y="96" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect opacity="0.7" x="606.285" y="96" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect opacity="0.5" x="822.285" y="96" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect opacity="0.7" x="1182.29" y="96" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="96" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="120" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="120" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect opacity="0.5" x="318.285" y="144" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="144" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect opacity="0.5" x="774.285" y="144" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="144" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="144" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="168" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect opacity="0.5" x="510.285" y="192" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="192" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="192" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="216" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="216" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="216" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="216" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect opacity="0.5" x="678.285" y="240" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="240" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="264" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect opacity="0.3" x="846.285" y="264" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="264" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="264" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="288" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="312" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="312" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="312" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="312" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="336" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="336" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="360" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="360" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect opacity="0.5" x="678.285" y="384" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="384" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="408" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="408" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="408" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="432" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="432" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="456" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="480" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="480" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="480" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="504" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="528" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="552" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="552" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="576" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="576" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="600" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="600" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="624" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="648" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="672" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="696" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="720" width="24" height="24" fill="#C8CEDA" fill-opacity="0.5" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="720" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="744" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="768" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="-17.7148" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="6.28516" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="30.2852" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="54.2852" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="78.2852" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="102.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="126.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="150.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="174.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="198.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="222.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="246.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="270.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="294.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="318.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="342.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="366.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="390.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="414.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="438.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="462.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="486.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="510.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="534.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="558.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="582.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="606.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="630.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="654.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="678.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="702.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="726.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="750.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="774.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="798.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="822.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="846.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="870.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="894.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="918.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="942.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="966.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="990.285" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1014.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1038.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1062.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1086.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1110.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1134.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1158.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1182.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1206.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1230.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1254.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1278.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1302.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1326.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1350.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1374.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1398.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1422.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1446.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+<rect x="1470.29" y="792" width="24" height="24" stroke="#101828" stroke-opacity="0.04"/>
+</g>
+</svg>
diff --git a/app/components/base/grid-mask/index.tsx b/app/components/base/grid-mask/index.tsx
new file mode 100644
index 0000000..6805c3d
--- /dev/null
+++ b/app/components/base/grid-mask/index.tsx
@@ -0,0 +1,26 @@
+import type { FC } from 'react'
+import Style from './style.module.css'
+import classNames from '@/utils/classnames'
+
+type GridMaskProps = {
+  children: React.ReactNode
+  wrapperClassName?: string
+  canvasClassName?: string
+  gradientClassName?: string
+}
+const GridMask: FC<GridMaskProps> = ({
+  children,
+  wrapperClassName,
+  canvasClassName,
+  gradientClassName,
+}) => {
+  return (
+    <div className={classNames('relative bg-saas-background', wrapperClassName)}>
+      <div className={classNames('absolute inset-0 w-full h-full z-0 opacity-70', canvasClassName, Style.gridBg)} />
+      <div className={classNames('absolute w-full h-full z-[1] bg-grid-mask-background rounded-lg', gradientClassName)} />
+      <div className='relative z-[2]'>{children}</div>
+    </div>
+  )
+}
+
+export default GridMask
diff --git a/app/components/base/grid-mask/style.module.css b/app/components/base/grid-mask/style.module.css
new file mode 100644
index 0000000..e051271
--- /dev/null
+++ b/app/components/base/grid-mask/style.module.css
@@ -0,0 +1,5 @@
+.gridBg{
+  background-image: url(./Grid.svg);
+  background-repeat: repeat;
+  background-position: 0 0;
+}
diff --git a/app/components/base/icons/IconBase.spec.tsx b/app/components/base/icons/IconBase.spec.tsx
new file mode 100644
index 0000000..e440040
--- /dev/null
+++ b/app/components/base/icons/IconBase.spec.tsx
@@ -0,0 +1,67 @@
+import { fireEvent, render, screen } from '@testing-library/react'
+import '@testing-library/jest-dom'
+import React from 'react'
+import type { IconData } from './IconBase'
+import IconBase from './IconBase'
+import * as utils from './utils'
+
+// Mock the utils module
+jest.mock('./utils', () => ({
+  generate: jest.fn((icon, key, props) => (
+    <svg
+      data-testid="mock-svg"
+      key={key}
+      {...props}
+    >
+      mocked svg content
+    </svg>
+  )),
+}))
+
+describe('IconBase Component', () => {
+  const mockData: IconData = {
+    name: 'test-icon',
+    icon: { name: 'svg', attributes: {}, children: [] },
+  }
+
+  beforeEach(() => {
+    jest.clearAllMocks()
+  })
+
+  it('renders properly with required props', () => {
+    render(<IconBase data={mockData} />)
+    const svg = screen.getByTestId('mock-svg')
+    expect(svg).toBeInTheDocument()
+    expect(svg).toHaveAttribute('data-icon', mockData.name)
+    expect(svg).toHaveAttribute('aria-hidden', 'true')
+  })
+
+  it('passes className to the generated SVG', () => {
+    render(<IconBase data={mockData} className="custom-class" />)
+    const svg = screen.getByTestId('mock-svg')
+    expect(svg).toHaveAttribute('class', 'custom-class')
+    expect(utils.generate).toHaveBeenCalledWith(
+      mockData.icon,
+      'svg-test-icon',
+      expect.objectContaining({ className: 'custom-class' }),
+    )
+  })
+
+  it('handles onClick events', () => {
+    const handleClick = jest.fn()
+    render(<IconBase data={mockData} onClick={handleClick} />)
+    const svg = screen.getByTestId('mock-svg')
+    fireEvent.click(svg)
+    expect(handleClick).toHaveBeenCalledTimes(1)
+  })
+
+  it('applies custom styles', () => {
+    const customStyle = { color: 'red', fontSize: '24px' }
+    render(<IconBase data={mockData} style={customStyle} />)
+    expect(utils.generate).toHaveBeenCalledWith(
+      mockData.icon,
+      'svg-test-icon',
+      expect.objectContaining({ style: customStyle }),
+    )
+  })
+})
diff --git a/app/components/base/icons/IconBase.tsx b/app/components/base/icons/IconBase.tsx
new file mode 100644
index 0000000..134c948
--- /dev/null
+++ b/app/components/base/icons/IconBase.tsx
@@ -0,0 +1,39 @@
+import { generate } from './utils'
+import type { AbstractNode } from './utils'
+
+export type IconData = {
+  name: string
+  icon: AbstractNode
+}
+
+export type IconBaseProps = {
+  data: IconData
+  className?: string
+  onClick?: React.MouseEventHandler<SVGElement>
+  style?: React.CSSProperties
+}
+
+const IconBase = (
+  {
+    ref,
+    ...props
+  }: IconBaseProps & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => {
+  const { data, className, onClick, style, ...restProps } = props
+
+  return generate(data.icon, `svg-${data.name}`, {
+    className,
+    onClick,
+    style,
+    'data-icon': data.name,
+    'aria-hidden': 'true',
+    ...restProps,
+    'ref': ref,
+  })
+}
+
+IconBase.displayName = 'IconBase'
+
+export default IconBase
diff --git a/app/components/base/icons/assets/image/llm/baichuan-text-cn.png b/app/components/base/icons/assets/image/llm/baichuan-text-cn.png
new file mode 100644
index 0000000..9346b69
--- /dev/null
+++ b/app/components/base/icons/assets/image/llm/baichuan-text-cn.png
Binary files differ
diff --git a/app/components/base/icons/assets/image/llm/minimax-text.png b/app/components/base/icons/assets/image/llm/minimax-text.png
new file mode 100644
index 0000000..5066b52
--- /dev/null
+++ b/app/components/base/icons/assets/image/llm/minimax-text.png
Binary files differ
diff --git a/app/components/base/icons/assets/image/llm/minimax.png b/app/components/base/icons/assets/image/llm/minimax.png
new file mode 100644
index 0000000..30c71e9
--- /dev/null
+++ b/app/components/base/icons/assets/image/llm/minimax.png
Binary files differ
diff --git a/app/components/base/icons/assets/image/llm/tongyi-text-cn.png b/app/components/base/icons/assets/image/llm/tongyi-text-cn.png
new file mode 100644
index 0000000..bd8f276
--- /dev/null
+++ b/app/components/base/icons/assets/image/llm/tongyi-text-cn.png
Binary files differ
diff --git a/app/components/base/icons/assets/image/llm/tongyi-text.png b/app/components/base/icons/assets/image/llm/tongyi-text.png
new file mode 100644
index 0000000..94de011
--- /dev/null
+++ b/app/components/base/icons/assets/image/llm/tongyi-text.png
Binary files differ
diff --git a/app/components/base/icons/assets/image/llm/tongyi.png b/app/components/base/icons/assets/image/llm/tongyi.png
new file mode 100644
index 0000000..c1aff40
--- /dev/null
+++ b/app/components/base/icons/assets/image/llm/tongyi.png
Binary files differ
diff --git a/app/components/base/icons/assets/image/llm/wxyy-text-cn.png b/app/components/base/icons/assets/image/llm/wxyy-text-cn.png
new file mode 100644
index 0000000..669d3c7
--- /dev/null
+++ b/app/components/base/icons/assets/image/llm/wxyy-text-cn.png
Binary files differ
diff --git a/app/components/base/icons/assets/image/llm/wxyy-text.png b/app/components/base/icons/assets/image/llm/wxyy-text.png
new file mode 100644
index 0000000..fb50487
--- /dev/null
+++ b/app/components/base/icons/assets/image/llm/wxyy-text.png
Binary files differ
diff --git a/app/components/base/icons/assets/image/llm/wxyy.png b/app/components/base/icons/assets/image/llm/wxyy.png
new file mode 100644
index 0000000..9239199
--- /dev/null
+++ b/app/components/base/icons/assets/image/llm/wxyy.png
Binary files differ
diff --git a/app/components/base/icons/assets/public/avatar/robot.svg b/app/components/base/icons/assets/public/avatar/robot.svg
new file mode 100644
index 0000000..55b70bb
--- /dev/null
+++ b/app/components/base/icons/assets/public/avatar/robot.svg
@@ -0,0 +1,11 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<rect width="24" height="24" rx="12" fill="#D5F5F6"/>
+<rect x="0.25" y="0.25" width="23.5" height="23.5" rx="11.75" stroke="black" stroke-opacity="0.05" stroke-width="0.5"/>
+<path d="M4 20.12H20V4.12H4V20.12Z" fill="url(#pattern0)"/>
+<defs>
+<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_13843_72627" transform="scale(0.00625)"/>
+</pattern>
+<image id="image0_13843_72627" width="160" height="160" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgCAYAAACLz2ctAABqnElEQVR4nO39d7xkx3nfCX+rTujcN6fJg8EAGAwIEJEACRJiDqKYJYqUlSjZsiR7bVm2LMm7tvfVem0v9ZHXkkxJq8gokRQlkWIQM0iARAaIHAZhcrh3bux8zqmq9486qfveO9MDDgmSwjOfntt9YoVfPameekoYY3ienqfniuRzXYDn6R83ucNe+M/f+7vn/HClNVtmJ9kxN4nWisWVJqO1CpHSHJ1fZHykysRIlXY3YKXRZsvkKFprGp0eY7UyjVYHYwzVSolSsUDBc9E9wYNPPMnxxdN4rsvbLhnl1RfVMaE+5/JtSNLFNI6ij30DnDGELMLK457pNd5A7+TbRbh0PVFrJ0b7CANowAFjwCku4lTvxal+Grf+cWOiE4xtgZFdyC0vguIY6Oj8FNMRrLQjfv/OBZ6ab+IVily+7xJ275imsbyIMoJWL7BtWfJYanTAQLno0QlCokiBhLVGh2q5SKVUoNHustZoUS2X8XwXYQQV13/WZfwXb3/zWa8ZGoD/+EhYMPZWXyIWH/4NwhOvE1HooOwpJODEfyNtcRg0J5DNV+OKV+PW34Mz8sfIXX+IdNRzWZPvZXoegBuREOCWYPGBX2Lp4f9Id3FGAMIDpkDMbYPxi6A6A64P7WVYPQKnHsPMdzAtA9HqFUKu/j7LlWtMaeJ/x/GPPdfV+l6k73sAOkKAdCxozgdJF5wCYvXQr3LilvdijBAOiDkHsf+1sOvNMHYNyFmgimWDHWAV2k8gTn4J8+jfYQ48jWkDpx/9GXS0gx0vfSfFydPQPU/lFLiOQZ6naj9X9H0OQEE3UhC2QRk4Hwa9EHD64bdx/Nb/C2OE8EFcdQXi6n8BIy/Fgi4A0wDW0nIgBJQvhQv2I3a+GXHhX2Ju/TP0iQCxdOAV5uEP/D9i39v+OVE3wJwHiewaji5XWetJnO9jFH5fA9B1JN860eT60hOM+x2M/naMemNlrOpuNU98/L8RBkVRAfHilyOu+3cgpkEfBhNhuV6iAMb3ooDYwJBVuPjnEKNzyC/8v+jDy/DMzT9L0f+i2PHSvwQB5tswmqQgDEO+flDT6NVxxPkZe88FfV8D0JeGoy3JXacdXrstxOA++54QgNSYE/f+HGvze4UL8vLL4LqfB9oQ3AvCxYIutkKEABLOq+1ho0Eds6J85jrED/0U8tP/C70QYeYf+VWx+7Wfxy0vocNnXW/hQqPtc6gb4knF+bGrnxv6vgagABxhuHNtlhsKk9SLIUTPUhxJF6L2tFo99E9QILaX4QVvhKgB6hn7Mg0WgCZ+e55i5IsYkEZANA+z+xEvuA5x6zcxSyeuNsfveIOY2v8hos6zq7O0j//cgRprvRpFV/DsnvS9Qd/XAAQoOHCq4/D3B3q8e28TIb0YKOdIbhGz9NS1NOb3CB/EBfuhWIDWI+BqEPHHEGMt5n55MAoTc0UBWlqpLNZgx+WI6fsxh1qwevzlbH3xh3BKnDu7FiAjvnXS5a7FIhKNWDcQvr/o+x6AAK5Q3HW6xP4JwwtnGmCk5UDn0jfCYBpHbqQbSTHjwtgUNJ8GuWZbSUbgJI5nyPQ4gxXHZJzPyBiAEqKTIGuImTnEkSdh5eD1FKoTFMcXUcE51VN4gkYz4lMHTxMpRcH5/gYf/KAAUEKo4a+eLOCs3M8LigcwpoRJUTEESQ+WD+wEoFyEaBlWT4PXA1eBE8Xqn7GflPtpUr3QxPJRCdACtAuhC6oGRQcKYDrLsxz64gyF+uK5zIpIGdKJJH9z6nJO98oU3YAfhGn8HwgAAhSkpqlcPjJ/JT8xKbis/DRCuRgzLJcwvgnFuO3UHqw9Bl4EhQgcZbmfNJnhgcHE30UKhNgqVvFHSwgdCAvQU3bGLtRFGQRTyN7Q03JCRHQp87EjO7lzxaHoRXAug+t7mH5gAGiAklS0qPHh5et4N5oX1OdBucNxCteTCNcxCkw3hOVlhA8UiEVw7gOp6y99OYBRGVPUWBAGQNjGNEAriNU2Z1j1QDiGrirw0WPbubO5hbIfgNE/ANCz9AMDQIhBKAJayudDKzfyE85dXF55BqE99NkMEyN7oJeNBtUEdwV0AYQfT8E5WCmb98CI7L3oTDIbE9srEZgARAC6AaoLjm96hM1FhDkrBxSeodtx+KuFq7mruYWy7CIwPzDggx8wAELCCSPakeTDJ/cR7J7lyi0OjnQw+gxsxy8Z02qf5JlnUB1wGkAPjA/GzbkAE3UvAWDOGDY57qcTv3RoQahaYDpAub7KjpecpjDKhr7ARMpLzVJL8alHDXcsVagUe9YB9IOEPn4AAQiZOO6oCn/6ZIXr2pp37Vqg6PYw0WbTBgJK43cjHGPaSigXpG+BZ1yyyY+YEya3pN8TgzgWvUYDEYgw5oQdIARRmXoA9Cl6K2w0JSeEAUdx/6lRPnqgzkrHUPYN8geK72X0AwlAsFjwhCJUEd88JHB7Pm+8UDBWESBjEBoDkbZcxZGIqT3fEKXyaRqNKe2BVNawxQGTn33Lc7/8C3MAJAag0VbS6g5IDWJy561CuhG9tr1PGmvgxLMo3Z7HLSdK3HxMcrLVY6QokTjfnUZ7DugHFoAJudJQcCX3rI5z5DHBGy/x2F6XCC3wPIfKRGwPaAeEOCi23f0lcd/N76IAWtuZh7wBImId0OQBmDCnPBfMfbQCOiCqtZOiVPqkWTyI0AG4ESryeeRElUNLLqXJIkfEGPcu1nBERNXrfZ+7mc9OP/AABMvwXKk43ZF85O4G3ccPUfPrjNTHeOWNO7hwm6FaCBD1snKveNXv6sdue4tu90q6bO/Nc70EeGIDDpjqgJCC0cTGiIzA37bng5T8x4kWCMNR7j+ym0ePS+54KqKrIqoXTuBO1ag4IcqY7+s53mHpHwUAwWKl6Aq63YiTC02Cik+z0+S2+0MeftxjetRhcqLBhXMzt9evuO63eeCWX8fgZXPAGVNjQI1M/IAJJhO8pgcNMD1+d2Pi4t+bX9zKQqNOI9rCt46NsrB4DG1OUi1C2TMIx5zdYv8Bon80AEzIkYKC7+B7kqIvcR1o9QRPHivy4AHF7fWQcfni398ZHHvN5OqRFxU8Rd3T+B54DnhJLEIfyuizhHsaghC6IawGDoFbaz2iXvjeB782c2RiZh8qmqLk+5S8JYpeREf+YBoYw9A/OgAOkuNIHNcBVxAFaufxw903332i8iNl/z0XlUUXEbXxTQPfrFJimZpYpSbbFEQPR+p0SrinPdq6RENXWdOjdBkhEnVCymiv7C91xa+Xy/Il9TE+Xi30vlHwpGmrH3QN7+z0jxaAQghc10EpVe102i8OWuoNKhBvGHFn905fUAanQGQkShuCCIJIsRSFzEchSgVEUYjW1o0iXIHjuDiOj+t4uK6H77pUXYnngBTGu4DwShUFV0bN4D2dQH1eVKO/1drc4rjOYSn/8a6O/UcHQGMMQggwZuvS6ZWfWDzZfJNjiteMVCcLE2NTFEtFDAKtI3yse6TkxbMhwokdg2Ub6JBEYaUhWYnlYTAmRBuDMQajDRqDkAJHe9Wg03t7ozH/9nZ37clmZ/nmkN5HqnXnq/8Y+eH3HwANaK2JlEYpDTEQsmgoawoYDFoblNJIBFLE10lJt9fb/sRTT/2179euKxerjNY9EIog6FgjwnERQiBxECKe/Eomfk3yn45Dr+LDIgZeEqhgDFpr+9cotFZordEoIhXQ6bRYWVm6cHlt6cK15so7R8adf7V7x/ifozVKa1Su7CDif2B0DGrsYMIIlFIYob8vZ0m+JwGYcA6lDcbo+Dc1wBdSjBUKXrFaLjiloq8HASgHAOi6UriOYzzXQQiMVy1HpW2jNz1692PX7Zzbi6gYwqhHu91AIAijACkdpJCI9CMQSKS0f4HY5BUxtwMLOo1Oy6wt8JRCafvRWqGNIowCOt0m3aCDwHB6/mStUyq9Zd/UyG3CcV3lOChjhJC27I7jIKQwAjDGiDwAHSlMZJDG8YXriB6Y08agjKGhjYmUNmhj2+J7kcN+zwBQa9tIBiq+60y4jnPVxEjlSinE9oLvFj3H3SUEVVE0k/sv2u7v01ulkLEDJB8hvwkXEABSGIHQM1M1d23ptH7m68/IHfICVDlCafspFSo4rocUlvsJIS0YEQiZ8CHRtwrUJCBMgactt8sB0MSADKOAbq9Du9skDHscPXwQxhSvf8+PvHLv3ku+LgzS2GgX0e/rIQbg+rUAxkbfCtd1It1tnSoVvEgbDnuuWC757oonxcPNTviQ0fpJpfWCijnz90I09XMOwJi7OQXfvapS8l9X9JxXSyl3uo7cKqVwwLo2DFaXMmgKBQ8pxDqRk3PZZdO1on8CXwjB3NQsr/2xH+YTSx/l4H1PsmPXBYRRSBSGhOWAgl/CdT0caSd+BZYLImL4DaxBNomuh8FoCz5lYtBpqxdatSGgG3TpdJqEUY/5UydZkYv82M+/i0svvaziCqeScLek7KmIz9VpkJLiKKXQWk95jgR4YcFzqJd8tIFKsdDQWh/uBOGtq83O36+1Ol+LlG7q51huP2cAtHqOlr7jvGFsovRznitf7rrOSKJjaW2I1EaNI1BKp0B7Ns0npWTr3Dbe8vNv5wP/z5/y9FNPsGvXHlQUEamQcrGK7xfxPD/WA2MxnOd6+YDQBHymXwznj4VRQBB0aPfaRGHAwsJJjq0d5B3/6l1ce8P1mMgQacW5ZisbDEsVQqBMVq4k3MGRouY57v5iwds/Wim9pxOGd5xebX682w0/Gil96lk043mh5wSAWhsqxcJLdsyM/cpoufRmKaWrjFW6B0d6voEH/b6D5zf6vfH7NUIIduzYxbv/zU/z4d/5C5448CgX7LgQYwxhFFAqVCgUSniOj+O4MQjzpUhKmoCPNFA04dTaGLSKCKOAXtAlCLtEUcjxE4dZCI7z5l96Bze9+hWYyKR6b54GtYqN6rrR9Ru1mzGGyBgbtyjwygX/xh3T4zeOVSs/ubTW/J+dIPorpc13ffbvuwpArQ1hFHmzkyO/vn1m5FdKBX8sjBRRFMWK/no6Vw53LmA0yrD3wkv4p//hl/jw+97Po7ffz9aJXUxMTqOUIgh7+H4R3y3gOC5SxnphTge0DDszChKOp7RCqZAg7BGEPaIopNlY4+DRJ3EmNT/5Kz/Li1/2cqIgRBud6gl50J2t7hsNzPzvXKjiuhvDUCEE1EqFa0arpQ8uN9pvOayi/7C8Gj1+lteeV/quAVBpQ7Hg7p4cqfzX0UrxnZFS9IIwFm1ZE+ZBY31oOtWvsnMDfHLQCFmnpvcfix0aVlxFii1btvHL/+Ff87m/+RRf/5uvsnDgJFumtjM6NmG5l+PhuT6u4yIdN7WQ+1mySQ0PpSKiKCRSIZGKaLeanDh1lJVggYtecjFv/5kf54I9e+m02qjcxO/5inXO5qFFXNZMf00BGV8UKUWkFKPV0tuL/sw+Felf7wbR37tmc53zfJIYVuf4dvIDbp0ZxxFi33i99MGS710dRBsEYhJ715RV3gGk4+D5BRzp4LiWA0np4Dh2IlbGwDUGEFYMCgFSyMxdl4NsouBbxTsRnRqjDb7vIz3JvXfeyVc+9Xke/cbDmIZmYmSa0dEJisVyygUd6cTWsS15ouslvj6lFGHUo9lcY3FpnpZpsnX/dl7ywzfx8te9hkq5SrvRiqNqZGpdJy6kRBqkYyqul/VJZipEYmCZ2GTWWsfuHo2KrFUfhQFRFGF07AgfSOSUB6XvOghoHzq19GunVpr/y5cuVe/7PD+gNgbXcfZNj5Q/7Djyyjz4ksoLEVtwSuEXitTqo5TLNYrFEl6hiCsdpOPEok+kYrCPCRozoKP1j2ANsSPYEBmFMgplbEdprYjCEK0Ue/dfQXl0jD1XPsgD37ibg/c/yfGDh6m4VerVMaqVGgW/iHRdHOHYuWATgy4MaLebNFprtDoNtK+YvHCWq1/8Yi6/9ip279lLuTqGdF1GZ6pI18N1LKAdHBzh4AgLxEQqiBjgiYKSSoIYlQkDsWC0xpuOrXGlFFEY0Ot16XabNNZW6bSb1n/oevHzsrYKowhXOuWdsxO/I4RkYbnxv85kfZ8PGhqA51oIA0RK40i5Z3q08iFHcmUYqj6ncUJBEFAoFJmc28no2ASFQintAK1U6oLRxJkJRNYsKYgHSpm3WJNOTMSdQWPiJWrEHDDR3TzXY6Q2ymWXv5Adu3Zz9KWHefLBRzn46JPMHz/B0aMHMUrjGR+ZE8MKBR54RY/KbI3dOy5m9/697LpoD5OT01QqVXyvEHNcjTFO/G5hA19FDCKsM11KkTNKcrXMz4JACs716/AFruvheT6VSh3ENOFMSLOxyuLCcdbWVnCkREo3J/oFkdZI8LdPj/4OhqDTCv7Y+Q7OVQ8NwHPxFyWSr1wsFHfNjf+O78qrukE0oIeRiqvxiWnmtuykVKrYURudJXHPgGgVCGL7MwWb9eTGYmpAt5JITCyyHSkQQiGEIALKlQrFcokoCGm1mmzZso39l1/ByvISCydPceroMRaOn6K90kTF3NxxHcq1CuOzk0xv3cLk7DQjY2PUanUqpQrlaoVCqRR3uMR1XRzPclCBBZwjZOp5trNA621+Y5JUHP01SurbX8tkhobUFSOlZGxsknp9jNOnT3Dy+GGiKMT13L77tdIIhL9lsv7eQ8HSY1FkbnGd7wwIhwbgWjh8GgmlNb7j8rLL9/zKlqnRN3V7/YBKRrDSETNz29mybTcYQxD0Nn1mXgQNUv7Y4PeNxo3tdCfWB7UFgisQ+AgREakI1/Ooj4xSq9WJooi5uS1cuPdioiii0+3Q63ZjXcw+0/N8qzJ4Hp7n4fu+dWa71nKWUuI4Dq7nWX0WGbu4ZQy+/vbZbGL32zFU7IDv4TgOs7PbKZUqHHrmcQtC18sscWGNRtcRI1MTtd+eX2y9wRizOOiAPx80NAAnapWhHxpGisnR2hVbp0b/fRgpK1bIjVBjiKKQua072bplN5EKUUptag3HNw39/mFIAE6cakqj7cIfVyKkRCqJjq1Do+0UnOu7FLUFdF1rayiZzPARUmbzxTLTVaWU1nBxrSHlSKcvwMCR8rxMiaWc/wznk4prrQmCHiMj41yw51KefuoRoijCdZw+t02kDPVK4bpOEP3qwun2b7pynZz/tmloAE7Wa0NdZ60y4+y7YO5XPUeOdHpRqtskFEUhE5MzzM3tJFJRatVtRFnnrG/eYZzOm1GiMzoyBqExNshZOkgp0I6LVNl0WuIS0okeOeg0jssvRQxiKWILV8YgjH+TWfDJHPP5oLNxxo3OB0GPam2E7Tv3cvDpR20/DOh7kdLUK4Vf7HXUR40290shzisrGBqAnucNdZ3Smnql9PKRavmdYaSRsp+rRVFEuVpj6/YLUtfFmfjd+c8DkL0r9gam+ldq5ODgSBMbArYUWmd6WBb9kpU0daSn03bZBwEyt5JdComTWPKcYY6X883311MQ9Bgbm6Q9s42TJw7jOf1LQI2BgueMjtYLv7Cy0vulhOOfLxoagHMTo0Ndp7QRY/XizwqJH0X9oRtJMOjs3A481ycMg5xud3YxMkiZ7fbsE1aknDAGhDaaOHwUgRNfYJAuOUV943dtBCeRY/8SmbpYzga+zd/y7dJ6bTqKIqZnt9FsrNBuNXG9/nw6RkOh4P5YSPv3w1A9cj51waEB6DhnXxxtDBR858JyqfAKa0n1e+XDKGRsfIqRkYnU0u33cT07OjfwDYjO3FFhwJESbSw/zDpBxCvfkjflLNa+52zQMYmOSBZVk/MifUcoX6eNCjR4XGuF5/lMzWzl8DOPx3qtiEO2bL/6rjMxViu9vtEKHpHPBQDb7bMnglVaM1qvvNaRYjbU1r2QNzxc12Vicjb+uVHzbHQsLzI35nRn4oB5HStx4ibPNOm3RH+zz0mDWsX6MiXF7n9Cdt0gd8g4nciOiLwKsHmZBx3Q51LvwYFxNgNFRRH1+jjV+hjNtRVc110na8tF703dtnofnL+swEMDcKV15v0t7IyHdLeUC68CUt0nyVobhhH1kTGq1Tp6wOKFfqD0H88AcubrNj9ucgDuh3P2juxvOlOc8WWTzdgMxbnW43LAwj+b7tc/+7F57c7cbsNclxXZ4DkeY+NTtBorVm9N+HysRfi+e430uCIM1O3iPLkFhwbg2YScNgYp5TbPc65FgEiMj5iLCCmoj44jpbMhAM/05o0aLw8qs8k1CQ1eM+hzS3CV55DpNSaZZcixvuTG7AXrfieH0npmD+wr65laISv3xleerd5ZMYeLftZGU63WKZRKhEGAcGTfRhSe65S1UVeeXl273TlPjumhATg1cmY3jNKaerV0ecFzZpTWfdXVxk72Vysj6RwmZLzmbAJpI+rvxDM37pn4jej7nueFJh39/fcngBooa4ozkev0jd4z3MBbL7o3v2aDYpxdN92AjFEUCkUqlRrLvQWEcPpmSIwxjNYrVyEd4cjzs5p+aABWyuUzntcGSiX3CoNxcr2GwE7tlMtVPK+Q+tFg/YTSd4rO/clnGhLD+9vO1u1n0u+eLX07TzLxiCuVq6wsnybpxxTUxlAseC8s9VRNa7O2+ZOGp6EBWKuXznyBAccx25JQqrTgcYvYcCZn03neDaTYeYXks33ed9BYfdb0nQBuSibuK9duQSuSVHaC+D+zRcFUZFg7H070oQHY7ZxhLtiAEZSqZfdCx5Fx4ELGAqWU+IUzA3iwKc/UtPmI5PzRJC5vmOef2Xd4vuG/MT0bACU4yDyJ/VOcG+0MMFjXM9VdG43nFXBdnygKBwJvDY4jKlMTIyPna2gODUApN58JMQakZExKsSNzM2TN40gH/9sIbEwoAV4+FjDfCbZhc40bF2MjUJ6587/z4DsXSuorIac/Z1rmIBC/vYVuBimdGIBRbERlzhygGqlouzHcez4wODQAC5XC5ieFQBgjBcGAbwzriI2jQOylz67Ugv5F57nH91HfNfGrhs12NoxV+d2i1ORJ26ufb21org2G3fc9T5zxd54cx8V1bWa6xKhKIKi1djzHnXGdb2NfvhwN74aJzrJgSphxLfWoNc7j4gphY9ikg5DZTMq5OJTTSf6kHGdxqCZCKC+I8qH7Q0WMfJu0ef3Orlrklf7+c8ML7DwQkwDWcyEpbRSP1gbpJGueiS1iTRjpiVCfHykxNADDMwWJGhDC1KVH0chEOIh4qaHGxWGY6Zu8Qwb6ueXZBGbeobOpZpdDwHdbyOYF52bnz3TNsymvBJsrx2Q+zjNxxix+UoCIpyN1vHYmKZ+BngpGgjA6L8N1aAD6Z/Q7CoDdxuhqsjNRWmFtYt1N5jp/gzUOqX6XcE5yhoatfhaGLtKwdVdKHMdG2Nk8KFlin8wBm/M9bsANz3Ux+Nlo46DZVIdaR3KgbNlNIhanBkfKNKLakTaoS2lDpO1CeGVsJE8yEJP1MUl7JovnBf3R7evVDnuvlDJdZpq5s8FojYvY4zuu5NltC9lHw4fkn/GsAWOawi5sdtPqCAtAIMsytfHdSJF1QGrxkynbBpDSoei7lACBzTbQDSKWOm3rayyVKboOZd/F8wqEQEdperH6kG9m613I9BvzLETVuVLeu2izb62Xt/n6Oo5D2XMoAAZFp9ulpzSrnTZRGFKtVKgUChQ8Fyl9AqATKUKl+p6Yt5wN8RRbujJw/YBJDDo0dpcAk0HQGNDadIxzfvIID78o6SxTL8YYR0eRrWausjrnSe+7Pnc0HaXpuYw0IIRkxHfxUCysLHL7k0e49bFjHFlsstiOONWySb1HCg4jnmR6pMCL9s5x5Z45Ltg2x2ShTENpemHUv6CcBOyxAPwubIElYvBtZIxZ7mSXo456DpiQIydO8OgzJ7j1saM8fXKNNS1Y7ipCDWNFh+mKx0TV45pd07zoku3s2jLLSKHEmjL0whApTH9dk+oi0Ilit2FBrQol4/jHBIBaa4yQSMfZeL3DOdLQAAxUhCPlGYwRU8MYR2iNSfKoGOtXSvSKrMnzQQHYvmcgbD/+Xin41IFHDh3kw1/+Fl97aokH16DnVqE6CqUSjBfsQ8IAOh14usn7H3mKaedRrpsr8e6XXcxrrtlHrVhlOVRx+H9/6e2qNJlk6BqsGxuZBptrdP3Xi4Evm3kCNIJ60aNIxP2PP8YHvnw/X3xiiUOBS1QYgeoMVCowUQTXiRNRd2CxxZ89dpQdX32a66Z93nrdHl7/osupF0sshxFK6TQqvd9tlblykjbA2LhFDGgMymDFdyzCbQYwxkwYOjCQyN8YpOsipESp9Wu/N6LhI6JPL9NwBKJeR4TBOmeTEMIUXTdO1Bgfi2ua6LVIgTAyMzby3hpjYm6X6EOSCd9lfmmBP/3Kt/jT2w/zZK8CO/bB/i0wUYdyAXw33ktB2I09AgWdHqw2mT+1wKcPH+UfPvwgr/vmk/zTV+zjFVe9gJbj0wmD2K+Wb0C7Sk5nMiep3abtMgiu/I80dCsHvDxok+lkq15IJj2Xp44e4k8+eycffeA0J80o7LgctszCxAhUSra+brxhiTagtM2G3mhzeH6Rw0eO8rcfe4y33HWIX3jFpdxwxT5ajkcnDDPwJepGss1xvq75DRk1IM2ALigIw1CHUW9d/4mCj2o1Uc0mfrG4aZvlaXgj5MQ8p+64g+nrrsbZdwk6DPtKLmXcb9pk1qYU5Jbu24KKROsQ6/osOeM5DtOuy+2PPs6vvf+b3NEowCVXwYU7YaIGFQ+KZDtZ5od1CIQl6I7Crlm4eDfRkZN8+rEn+fr/dyf/9jXz/MsfeTFeoUojCHK3xjwhKft5MPE2M/z7dGQDnusy6Ui+fM89/NqH7uShZhX2XQ0X7ICpUagWoCyy+ibbhRniHTkL0KvCjkm4aBfqxGk+8dgBvvzHd/ArLz3Gv37bjfiFCqu9nm3jXDVtORIjLztuud3ABxLrTfepzMZAuYxZW+Op93+QsBtw1cteCq8+exsNb4QIQW9+Hv/v/p7i1t1E27fD2lrcZxKlOoVIhzb1gzEYYZA6s6Ty/zL7t687AIMrXcZch0/cche//rEHODy2C17zAtgyDiMuVIEStjM8+rdLMNhRG2K3Se24MDYK4zWYm2LtsWf4j196jAMnPsdvvfvl1MYmWe31cp2xicJ6niiJMIbEMgXPcak7mj/+9Ff5T598jMXJPXD9Ptg6A+NFqMX1LQI+/XvVQf+2sB0JIyUY3Q4zE6wc2Mp/+ua3OLb8Bf7jj7+M2ugEK90eUqw3KjPHfTalmf41FnG2bTRGG9cYIwGFAeX7lNYalP78A7S+fitcfhmit/kS2zwNn5pDCKhW8R5/nG1/+D6c3/xNnH0XQaeLIx1OzB+fOblwgoLvQ2zhaZGlHdNJvrw+4NmxlvBCKawY+sgXb+fffPRhGpdeDlfug6kqjAH1uDPypVbG6kKGTDx5QBmoYAFbdqA8AZUyjFT54F3fQn3k6/zeP30NJa9COwj6rG7IcLieGW7EHgfU/MGH5M6mzzUGKSTjruQvv3obv/LXjxPuvQJeeDHMTcC4tPUtY4GXikUDYWRFr+daXdDFDshyXN8qUC5D5UIYq/H/3XYXp/74y/zBL76GWmWUtaDbxwT6yoXdGDFNri5NnDnCGmhxNNNMyfdLBhMq12VCGWZ/9/dp3nsf1OtI34chsymcW24YIcB1EV/6IuZ1r8Xduwc8B9fmMJZJmt3U5afj/M7agk/n4JdVP/GPSaZ9n6/e9xD//hOP0rjsSrj6Upguwji2M5LZwGYHjh6Hg4dhcQkvXtwUeC6MjsLO7bB9G4xULBj9+OOWwL0AHMlH7n2ACz5zJ//uLS+l5zhEWmFdr+TKl5RSpOVMjq03MfodGplDKTti6PdDjvsetzz0ML/5N48R7r3c1nfruK3vKHawSaAXwolT8MxhODWP0+3iGUPXcaFWsXXdtR0mxiwIC/HHd8CdA/d6PnnLHWz52Df5rz/9KnzXpRdmg26Q6RsR91WcawaTMBJiA85xXdd1lCOpeT67Tp2mfP8DrLru0MBL6NyTEwmBqVQwCIKjxzAz05hCER0pk+RHRtugACmlHUVJPhMBet2Ys8fGCwUeP3iYf/P+u1jaeTFctQ9mijCFBZ+DVbYfehRxx91c2+nw8tlpLhgbYbZSRgrBfLvD0UaTW77yNb6GJLzqCnjhC6BazOlOPugd0A347a89xEWzD/KmG65ioRf18eeBLsn9P8jvNri+T5L3w1jEzuW6X+LYwkl+9SP3cLK2A154iQXfFBZ8RSyXO3AIbr2Di+YXeNXUOPumJpmdGqfie5xudzjRanHHnXfzpZtvYe3SS+BF11iDJWkzKYBpCK/iD2+9nV2fuYN/9qYXs6BEn+9zUKqbmJlIaRlIKsm0QaJ0TzhmpNFktmZ3FIiKRQiGz56R0LPPjlUsEFUrlO+4E3/3blTBF1GkcB27FljFIz5ZzK2NHVU6140Jl3AdF6l6/M7f3cMTTMJVl8J0CSbJGnJxFT75Wa49cpRfu/YKbnzh5cxsmU31cEO2ne/S0jLfvO9B/ui22/n0Aw/Bm38Ytk5bfUoDqgh7d9FdXON3v3aI6/dvp1Qbox0Em6iAg5Bbr72ul7uCVNMSImeH2VkNX4R88CsP8OBaGV56McyNwwQwggVfpwdf/Bp77r2PX7l4L69/+xvZtms7nusSkbmtXKDRbHH/g4/w4Xvu5w8feBh+5PWwb69VQQC0gHAOs7if9958Hy99wWEu2L2TxW47mydP62U9uMrY7SJQOnalWQAqpYl8n/H5U2b3/Q/Qe+OPEJXLeM8yyGRofum4Lsr3CTzPV0JMOIuLs87yytz4X/7lzOgnPkGvUgu1UnFyoXivi/i3Upow/qtVfFzbbFWR1tRdj2888DR/d6ADV+2HmZFM53OA4/PwZx/iJ48f5xM/9WO84w2vobxllnlgHlgEloAF4CQgx8d4wytfxl+955/wm1rh/OkH4anDtrfqWA4zWYVLLuDu1QKfuO1JfKHR8VJEbbTtgL6PiVO6qTgTftZJ9nwu5Vv62+6XYDtQpwOw5Hk8dPAIH7z7NOzdA9tmMp2vBDTa8LG/44Zbb+Ov3/R6fvldb2Pmwt2suC6ncvU9Hdc3rFa47oZr+f1/9tO8b8cWJt7/EbjrPqsvVuL6jjlw0U5OV2f54NefxDEhwpFpgsp0bxKt02PpFhO5flRaEUohLnroAbXj9tvr5vTpLc6pU7Na66nQdWtdx4n3ahmOhuaAjV6vMnrgwC/vP3To5VNra9vK731vyfmDPxD+woKRBw68r/hDN4VBoYgTRQihrfiVAhNXKKlMPiQfbMaFbtji/V95ks7YLOyag1FhO8MFVprwkb/mPd0u7/s3v4iulDlBNnLyVU0Eey8GZmVijP/yS+/B/6MP8J8//DH4hZ+BmUnLCbvAzDjMbuHD9xzmddecZmR8kk43yhJY9rHDfu0vncQzpL5PkfqfrH9FSIEx+akwO8shTcjf3PYUx0wddm+FsUJmcPQi+MwXuOH+h/jLf/0LbNuxjVNkHG/QWQ/W6F8CPN/jF9/9DsZrNd7zV5+gXanA/ossCEeAdhkuuoCPPXQf73jyOBft3cpiL2AQLkIIdGRBKIXAKJ22SU8bykovzT3+5KtLt93263sffGgaY1SwuBi5pdLSVWtrjz2xa+f/KzzvgSFgNTwHfPTv/u5fvviWW/77ZYcOvW6m07msdurUnvJTT13grq3tkY8++mv+kcPXhr6vdJRlCVVKESlNFClUpGzWzni06XhHoLLv8Pgzp/jK4TZcuANGS5nrITLw+a9w7eGj/NYvvQdTKbPCek9EQoP+1BawJiX//j3v5keNgU9+zuqRRWyn1H3YOsNjHY9HDi1REHZzHGtMWW6dfFfxzkw6GUwpJ1fxdTpOsmnSOiqV1dOqIRrXkSyvrXLbwTbMzsLkqLVaK3Gh7/kWs1/7Jv/jZ97Fjh3bmB/oqM28RAILxEXgnT/yWv7tJRfBx//Oqi4O9h11YOs0i94IX3jwOF6sIqR1jeunVGS5otK233Qm2SJjENpo58mnf5ql5evKhw/vKh85sme03b541+LiDe9aWPjZLY889icLy8uTw+BqaADK++77iYsG5/7iCQg67RkOH3lLZIxMWbpSKfCiGHg67gijkoQ/4ArF3Y/Ps+rVYG7SdkSy/umZQ5Ruu4v/88ffwtzEWAq+jTphI8eIANqALPj8x5/8UbY/fgAeeczWOnHTTIwQlUe5/Zk1VNSNN5lRKJWAUKVAyjopr16oGHjJtRkgtUp2R9KxaNN40nDgyDKPNCTMTUHVt+XwgKU1+OJX+dUbr+NFl1/KPP3Ay9d7owGYgLAB/Mo/eQc3RSHcersVxYW4viMlmJnmjkNNVpstHCHSwaF1PHAiyzSiKLKf3ICLEOiV1RvE4sKrNipIEdjy9FPXLhw8+MoNiriOhgbgyNLSzjJYsVgDJjyYLMBMGRxDcOSYr5QSeT0vihRhXIEwrYRO9QmJodlsc+vjp2Fs3LpNEr+XMvCNO3j5aJ2brr+G5VxdN5qDNQPn899XgP0X7OLte3bBLbdbMedjuWy1AKMj3Hm0zeJKE2mMHfXr9J9sYPXpRIO/k2258hwk/milQQXcceA0DYowXs+czBJ44CH2LK/yjte8nNZZ6rQZGAWW849WyvzUDdfCHXdlXLAIlATMTPCtZcXjhxcoOGTgUjrXRxZ8tuxZPbUQ9JaXa+HycoVRH2ZKMOnDqEzdZJPGEBw9esUwuBoagONKlyTYif+5WZjdBrM7YNsFUK4QNJvohF1Hec4Qd0YUZaNKxVszYFhYWuOpxRDGR6Ho2ko4wPIKztMHeceLrqIkJedu4GeksbPmb7nhWuoLp+HkKfsOHyg4UKtyKhCcXuuCUSRbR6hYD7JcXPVzhYHvYfI9tJ8wUkQqSu+zuag1vW7A08s9qFShUsxmdIIQHn6Mt116MdunJmixflbwbJM0eYA2gVe86GoukRIOPGVP+Nj3jVRYMT5PH28gTNIfKu2XpNzrBllk9eOw3SEKQ5idgy27LBbmtsJMHQrWmFenF2eH6ZuhjZByGLoUJEzOwugM+D44DpRLcOI0Pa2zESOytGxGacIw6zCtVJyDzqCVZLXZoyHdeKJd2EYCOH6S0V7AVfsuIj+pc6ZO2KyzElG878LdXOI43HnoCOzcajveA0pFVnFZbvWYGo0Io3DdJL1JnXtn0sLs+f5FU9l31xg6StEIDJSLdubGw/bCYgPnxCmuf9VNQBwHsEldNuL+g9d1gC1TE1w3Mc5jTx+EG6627/GxfVcostyJCIOQKLSOnWS2TWpDGEaEoULbHersOa1RYUQQKULfhektUK5ArwdRBOU6dJ+hPN9m7dChiU0aqo+GBqACKHgwPg3jU7YSnge1Kqb6FEEY2EJHESDihIzCAi6MCKIIJ4owWiNiS1grRaMZ0BQFqNb79b9Wm22+x8TYKAHDxwZsBo8IKJVKbKuUuTNJtFSJP7UqDYosNQJ0FBJFKt0CwT40s4jzPsDEh5bMEuRBZ0MMcwEXMQ5bQZelFlCNgyqqWKSFIWVgZmK8L8ZpM7AN0iAwNRbb2ybHbYiawPZ2FeuYL9VZ6jYIApudNr8Dp5SSKIoIwyg+RpwX0TITwpDA92Bm1gKw04EwhFYJlpeI5tsUJyeHCoc5BwAacD0YGYWJCfALFoBjY+hiiSAWv5GyABQmA6CMIrsRoOdl0TIIQm0IooDK0hM4j3UodCYQYz7Cc1j81n1sLRao+B4qCJED7ptBGuyYdeJLCMq+z9TYCM7dDzEjyphAoZcDgpMruCfmEeqFBHY3JwsuYwGXhuybDH4CwyqSnoAJrXGx/l6Sme0kJjI5Iow1BhD4rWNUTh6lKg4hDhSRVY+1I0cYjxRTE6OYSCFzwbP94Rrrj7HBMW1AFAtsmxrH/8ptjHz6FjzXRzdC1EKb9qFDRBOz9PR2okjl5noNQkqrUugQE3v5E/9opCNQEZF0YHLKDqRmwwKwUIBSxc6kRNH5BWBkjAXdyJg1GIpFywXHxtGFAkHOyDDCZgQVwm6m7CirEzlhzAHjiOB2N6Ba8dnOAguPHWXk9AROoYJ0PXonDtPcWicMQkqOQZ1lVV7/3Oz6mQpHCCIh6PQCSk8eZWvXRQUBqtOkubpCxXOola6mE1oLMI0kA8DEa1tiESXgdKRp33wzpaNHOfTGN7JtahIZW/aDAExAGQlNpVxgi9/gwDOPM9U5jFOs4hbKeGvLRKZNOwhxlEF0e1nW1Q3reWZyDFAssBxGiJOLbPvG/bjCIey2CNsNVhaX2FqbJVCCIIxzNcazHUI6sU6rMPHEfhoVExuUIQJGx+ynULDTcJ5nw7KAzunTZ0mlYWn4iGgA14X6iJ3wLxbti0dHCB1JLzY+ImX3AtHkABhZ0exEKgWgFIJOp0e5WKRWr3OkuUylWMKUS3YDl1qdw40Wq+0OI+PjdJUauvE36ibHcWiHIceXVvArZcJKGe1KFIpeo81YqYjveXS7PeuvpD9yJZGxQkDLcTn04EO89cMfYM/yMn8WRRz+mZ9hBybbqTIFYH9ZSsqjXK6gHJ/QL6FLRUypiCvrNI6d5sTSEpdv30Ycoj10jde1gLQh9YfmT6P8AqZeJdSGSGh6QQ+3WGZ8dIQwDAjDMBW1YBCOSY0r4l2nTLzoSSnbh6FWNrpoYtwGIAQ9+7dYppu02RA0tBXcAQLHtSHh9RH7GRmFkVECx6WnNVrFjuacHynvjgmjiDAMCcOQIIroBQGOIxmtli2H0wajbPb5SrnCSqPD0/PzeJ7zba1cMwZ8z2NhdZVDK2uUy1Ub4aHspjFREFIrFygWXHpBYEe4ylm+sQsmip3Oz7TabPvrv+YS36f44pfwoi98npOPPEYTgVY6syoHPmFoLc7JkRpohVERaLv0seQX6GjBEyfmkc6zB15CnnRodLocPLVArVhGCJnqcVEYUil4lEs+nV5AGJctjPW+1GhUeWvf1sHOkGg6WtuQr9ExGInxUKtBoUALGz86DA0NwAAIHMdyvWIxjjerQKVCz5H0VN6Bmeu0pPChit0TGRB7QUioFXt3ziK1QoUhRtltHarlMu3Q8Jl77gdhU+c+ezIUCy6fu+9BDi81GanVMVpbEEQROozYu3MWz3PodoOcHzCbxYkijY4Uy0LQuec+brrnbuTei+jsvoAXRAHbP/UpjvSCbPYn9zfxIYZRRLcXcMGOaWrFAkE3sPXVCs/18EoVPnPvg6x1uhSGTAq/EWljqJWK3PXU09z9zDHGRset/qoUaEW33WX79DhjI1UazQ6R0haEUZS6oKJk5iPvD4zrFKqIjsbioFqzWCiXoFgCx6PD2V1GCZ0TAFtAvGjUfhy78V2oNAGknvRIq5z3PP6tY0dnbrI7UopWu8PFF2xhsl6h22pjtMIohSNdxsen+ft7H+LAiZOMlEvntFtTQsYYyoUCK602n7jjW5Sqo/iej1ERJoqIeiEFV3LxBVvo9cLYf5fz+SV1iWdxjrTaXPSpT7K77NPZtRtVreLvu4Qbb7mZxqOP0ZQSk0xnJRIg8YlqTaPZZmZylG3TY3SabVCWExpjmJ6Y4vanj/K1hx6hXimmmfnPlTzHAQkf/cadtLVDrVKzwRBKocMIHURccclOHEfQ6wUWZKkjXVvgpVNwOj2eTEVG2tDV8Y4CrmOxICRIQYShzXcIgGta21GklPX7KAW9Hu0gIIR4BsROtZl4cXhScDXgmA0jW7m1RoexkQp7t03TXGtCDAwwTE9Mcqqt+O2/+SwaQ9HzzkkUGyznrJR83ve5L3HPkQW2TM/aANkowihFq9FibmKErTPjNFqdlOslXFwpO4WmlWLZcdD33MdL77oN84LL0SOjiGKR7iWXclHUY+dnPsPRMIrbIQ5dUhmgldJ0gxDPc9l3wRbCbhcdhpgwwmhFrVLDKdX575/8B+ZX1qg/i0FnjGGsVuZTd97D3979EFvmttk0G8py+26zzWjJ5+Jdc6w12ilnTpzqycyViqce453ts76MQ+vaSmO6PRudnWBBKZr6OwjAVWVoBiG614NuFzpdaLVoRBE9QzzHa9LMBNkEvk6DEqIoCVCwlQ3CiHanx/VX7KUA9FptKxaVwnFctm3dxYfueIDf+/Q/UK8UKQwJQmMMjhCM1yv8/Z338N7PfY3Jma0UPB8dRegwRAc9gk6HG668iGLBo9XpxuXvHzjJXPCxZod9n/ok232H7t6LkZ6HcFzUxBTOJZdww9e/QuuxAzSlzHTBWDVJ5oKV0qw2Wlz3wr1M1Su01hqYKESHlgtum9vOXUeW+D8+8te4rqBeKg21aD5pk6nRGg8cPMRvfORvEZVxRmojVqqEIUQhjZVVrtu/m7HRCiuNFkprwnBAX+2bNjX2k87j22CNpjFE7TZ02tDtYrpder0eK1GUTiMOQ+cEwIZSLHU6LLdaNJpNus0GqtmkpRShMevmTZNprJS15xR0FQPSYDi9ssaeXTNcf+kuVhaWMFGADgOM1tSqNaa37OK3/v6rvPdvP03ZdxmvVuwa5WTBU+wuSb5LIamXy4xVy3z0lm/yr97/NxRHZ5gcnbBiKAggDFldXGXX7ATXv/BCFlfWYq6dlE+lHMyoiGXpYO67n5fc8U3Yvx9drdmIZaUQQtK75FIubq2x+3Of5WikUnVEx/PDScdqbQE4Plrlxqsuprm0ig566CBARxGe57Fr14X85d2P8Kt/+iFa3TZTIzV8x4kdwlmyoKS+IKgUi0yOVLn90cf5ufd9gOOBy9a5bTaTQRhiwpDmyhqTlSKvuOEyltcaub5IfLiDc+A6jWDSCRCVjeVsA+1Oh6jRoNVqsdpqsdRqsxoEsQ44nBEyvB8QWFWKxWaT7loDt9DDCwIKpRLN2G2RbJiczFoJITKOkkSGxH7C1EFsINKKpdU1Xvniy/jWE4dZW1qhPjmBlhLwmRybQEiH//OTN/PE8Xl+4TU3cem2rYxVymluFDDpllhRFPH0qRO8/2u38Yc33015dJq5ySk7lxn00GGPsN0maLV49RtuwHEEzXYX33HRxi6oTkL7DNaHeKLTZf/nPsM2E9LddYFdyZisq4hC1OgYhd27uPErX+TPXvs6mnt240chaRy0AYOO/dGG08tr3HDVxdx27+MsLSwxOueiHbuPSKVUZsuOvfzJ7Y/w6PwS/+6Nr+JFe/cwVa8QJYuFtLE5cYRAYjixvMyffeVe/sdnv8YKRXbt2IVEoMIAHQSobpe1hSXe9LobqFQKHD4+j+95hJHK4hgTf7sQ6Rww8bSpwe5vYmJm0gWWWi1ay8t0V1dRQUC32WS517NumCEN+XMC4FoUcbrZpLW6guv7uIUChW6XtTAiIl6wojWpM9hkoNQqU2ITiqcZEcDySpOtsxO87ZXX8Bef/iaFYiFdg4TnMzE6SrlQ5OOPHOWLT3yAl164k5v2X8S2sTozI3UcIZlvNDixssbtB57hq488xfGOYmpuF/VKBR0pdNBDdXuYbo/FE6f5oav3ceX+nZyYXwIBkdY20DTN32HHccsvED34CC+5/Rtw4R5MtY5QIaJnq2qUAiFQF+7l4ocfZffnP8+xX/hnbFfazkjE/sBsmSOsNdtMT4zwzje+hPd9+At0VtYoj8l0a9VyscQFey7mvvlT/OQff4zrd83x6hdcws7JcaZH6pR9j8Vmi/m1BvcfOsYXHnyMA4staqNT7BodswuIogAddDFBj4Xj81x78U6uv+pCjp86jRC2vwbn8OysjYijerRd7J8E6xswWqGNoaM1pxtruEtL9FZXUWFI0Gqx0uue0yYi5wxAv9GgUCji+D6O7+O326z1emk4u4q5UVIpnYZ6Jx+dq7BJ+hkDHDlxmhfu38kPL67xyVvuZ2rHHB7YZYG+R6lYYPe2nay1mnz2wEk+8+ghKq6kULKbR3c6PXqhJnJ86tVRdk3WkQJUGKKCHqZnwTd/5ASXbJ/mba+7jtNLK0RRhOM4KFS/89gYHCk4EYRc/KUvcEF7hWDXyzBCYILAKt5C2E5SEd3xSSpbZrjh5i/xF699Hd3tW3FVlH9cGtQggJPzS1y8Z463v/o6PvzpW3EcSaFeR5k4rZ3rsWNuG81Om28eW+Hrz3ydsgN+wU9dRkGo6CCplmts2zaN73loFcXWbs+C7+hJdo3VeOcbb2BpdZVON8B1HDT57TJsX0ghQcusr2KJRtIs8U6hXWM4tbqKW64SNtZQYUjUbtPo9vqCR84bABXQVArZbOJ5Po7nIT0f13dZ7XUxxCNK6XRxiwVg5lNLzHqT9EZS9VinUVpz8NgpfuiGfTRbHb5y3xOMzU1TrFVRWmFipX+0WmO0Vk/9VkEUEhlDZXycMcexu/xgbHhYFFl9MgiIOh1OHzvFrslRfvptN9Fud1hrdvBc1y4VEHbVGmSpzpquT/DEk7z0a1/GbNtKc2Tc+hDD0G60aCxvE0ohXB95wR4uu/lWtt7ydU7++I+zTauYq/XLJK11POgWuPFFl7DWaPOZr99HPVKUx0Zs53sK43tUikWq5S2pxRpEEaHWFEdcaq6L77rpvHsU9DCxzqd6PU4fO8WWSpGfedtNdIIui8tNu7BJrd8eF2GlkkniGeNFSX1sUtnpxq6BhZVVnEIR1Wqho4io06XTSwB4nnVABbSVQrWaeK6HcF2k6+K4Ls0wQGEDG9G2udNpLJUp4qklxcAkP8RJgQydXsSRU6f54VdeyWitzKdvfYBuq0N9csxyHMfBuC7CcXCExPFcSr7Nz2GMAa1RYWDdLMknDGivNFhdWOLafbt455teQhAFLC038DwXbXS2qWAWAoMDnFCK3V/5CnuXl1m76gUErhe7NEK0so0sASKFMIZoao7p8Tov+dLn+dDLbmJidgo3ikjyH+bbBgFBGHH4xDyve+ULGR+t8rHP3Uan1WF0ehKKESLyUK6LdGydC45D0Y3raydp0bFLKfFtmiik22ixfHKBK3bN8aM/cgOhjlhYWMNzHUIdpdvFJsgTicokwNEiZRhoaVEpjF1Sqm3kTM9oltbWkAUf1e5goggVBAS9HuHw+Du3/IBtpQhabRzpIlwH4bh2jjVS8VpSHYvgjIxOVobZj0pCsUgsuGy9aeLzanV6PHX0JNddcyHTE3U+9ZV7OHnwKOWxOuVaFXwPpJM6P0XSm7HoMtpyYh0G9Fod1pZWqDmSt738Kl56w6UsNxqsrLXxPReldbzwZn1kcdf1aB86wo23fBWmRmiOTxIlHCJKEqLH2UGUstHUxRKru3bywrsf5Iu3f5NTb34LW5RG5eOyYgmRrELu9kKePnKCK6/YzfhohU996W4OHT5OoV6hMlrH8T2M49kUeVLGYV4ZAE2sq5koIuh0aCyuUjSa1193KS+/8TJOr62xvNrEd13CyFbUEQId4y9LQy0QaISRts+UQQodFzlO2qStEdQDVlsthO+jul1QygZ39KxPeFhHzDkBsKc1vW4XKV2EIxGO/RtEEcpYDpiGTcVSWGuNk1vyp0y2+NumfEhSdxCvS7CbBQah4sChE8zOjPHz73w5Dz56mDsefJr5w8cRBZ9SpYRX9Ek2hbbqiXWUR0FIp9VGdQMqnsNNL9jDDVdfxNhYhSOnFuj1QlzXteqAsWuYM2zEG7UKOCkNu772NS47dZLFa68gKBTjjtEYVJpFQQBCa6TROEKyOj3H1vJjXP/lL/HxF9/I+EgdGcWxdZBy27wUCCPNgUPHmZ0c5Z/+xKu5/6Fn+OY9j3Pi6AnwPArlEn6pgBNnHxBxG2utUWFIt9Uh6gUUBVx74TZefPVFjI5XOHhynm4vwHNcgtjiTffxi3VAka7cMwhh9T8dr4lJd71KEowqhdGG0ECj00a4LiYIbNuHASYKOXPc0rMEoIkBaHpdpHQQjp2CEY60FqaxBbY6Qw646eKcbJVY4sNKwpzSzAmxe0ElXiQBh48vUC75vOCynVyydyvPPH2KZ44vcOjEEmsrayCTRIsxEIyh7Hvsnh1n1/ZpLtw1y/h4laW1Jk8cPJ65alRkwatzG3TFUahCQOC6NE6c5K1fvxmn6tOYnEYJSRSD3KaTE9l7MQitcTCocpWV7Vu55vHH+OLd97DwqlcwGanUws1HueR9mQBHTy7iFzz279/BJRdu5emDp3jm6AKHT55m6fQyPeLMBdhMpxJDwXPZOzXK9tkJdm6bYnK6zmq7zRMHj9u0vo4gTKKJhN2gW8dLSWUcdSNiLiexEesq3ilepBIt7q84WEQZQ6fbRTiu1Tm1xkQhRIqI4cPGzokDRgZ0ECJk12a9dyz3IVa0VRxd0nefyi1LjLlgYoSYPBcwWTZVbTIuKoSg1e7xROME5XKBrbun2LN3jnarR7vbo9cLaXcCtDaUyj7lYoFyyadWKxMZRbPd5cCh4/G0pWPBrkwc7WTZdD7w02CXiyy4HjN33sUVRw6yeMkuwmLZupriiBKTM+aTvYSljhefuy4r07Nsf/Ig1978FT5zzTXUC16cIyeVaGnYf+pgxmCEoNMNeOrwSUpFn7nt41xwwSzdbkCj0aHbC2m3uyitKRR9KkWfgu9RqRZRaNZaHZ46dgpjDK7jxMahLWnM+NDxhtyY2BUmkp0FBEZaqz6ZTsQxaSiaZRg2oj3CYHo9iAGI0favspLBPd9GiIkBaMLAcgrHseATAqEUykCkNI7SffBXSiOVIVJWRCVumETfN0nah9RPRsrRkjg8AwgpabV7rLU6SCGplH0KRY9yqcTIZBUpbBi5NoaWClg40cAojYiTewsZG0mxzmgjtpOd0ZOesKZvJB2Wlpb5oVu+StGBhckZQsdNMx0YpTGDe/UZg9QGoW1ddHWElZkJrnn4fr78yMMsXX019SDMkh/Fzl+TdLxOkjcRc2FBu9uj0bLzCoWCT9H3KRUL1MZKSCnsfLrWtKOQ06cahEpbDidtvKXSOk1xnGY/FdiF9MJmQjXJ3sUi2eZHgDLpTBZKpuqUiR3RQluViTDA9BxMGNl+igJEwmCGpHNOUm5UBKHARNLuIyYkMm48bXQ2Woz1wNrjyeJuO52TT5CNSdZU5LPGZKIp05XsMRlHCbeaPRqm2wd2KRKlOs6cH4dwaZ24Vaw3PxFFOW9R+mIJrBQ8Kg8+xAsff5SV2Ql65RpKEBtRBmMUNoN95kNLZjhEnIZOej5L07PMHV9k/623ctu+SyljcnmZ4xmSpNMhzcya6sgmNjYEdLoBrVY3lhD9XZykF0423Lb5obJrpCTdt1mbWOQCJtEBE31HgDQSRKxSGTKjMscUhImziAWhjZiOolQ/RPdnGDsbnVNyIgMYZYDIKqWx/pA0SqQ1TlxAg9XHVM4KNjpLcmPSxs7pg/m69s3zZteKHKfoS4WRtFAsZ7Q25HcmR0iE0NbPZwuX3pktQDJoIVhstXnxbd9kVGtOTU4RJNxPK1C23ibuSBJAxzMGIp4rlQJ0rUarWuDKb93NNw++lubuXRRUaIHVt92rSf9PxLImlc2J9pXWN9M8TQ4Y/Zwnq1taOTbeKSThFfYOnRtMymhEHuyx0ZP0r4kiKzi0AXTqI/yOcMCkUtZHazGe92vpWASTm2oD4jUhKnXD6EFgxS2Qcrn4gdnvzFLMKpf/P/fbJNEV2dRRauCmu3hmLZTNemTl6Hoe5tAz7H/wWzTLHo1yNdZv7aJs21syHny5QsQDD60QkcJRmsgtMD85wdaDx9ly372c2LGDORVnCMvpnWkNkmel2NpkUBJzIpG9u+9paR2tWNXxt+QFwmSZ+kXuXmkMiCyULkrngrNCaqWRStlXKgMijmTPlf87AsC+hyY2QqY2WXatNCLWQ5K+z+dVScJ6+sKLdL6h7dHMlRiDMHFbJI21Sbi33Z0pE259S3pSLmDSazMtzB6TwHKkmXzwASZaDU7NTdCUrg3fCuxMA9JJk6KbAfSI2BEulUJGCmkgKFfwBFxw/708eePLCOr1bDDkytfPm/p1g3S4mYyLCUSs7RjSgvQ9JJEEJFZSOuCEsCBEZE2ZYFYIW4ckeLjfCrYA7NtjRG3M8oYF4fAA7Fsou/4tSf4ToU1WYUh9fwn4Eh0wEaHJVlAkDZqDhMiJX8hen+IweXkejwKMTqTj5vIgL9YTioSgudpg52MPcQpoSYew07bulp6LcR1MEv1L4kvLuFMCQLRGqAjR6+FEEQ1XUDj4DOLgMzQufyHVDbaCyNSwTDfsK2+/JMzUCJ2VIeFmiYhP74lnMmSM61QymP5Bmmw2kEweKG3SNdwJ2QSkuQHybYAPzhGAYhCAMdm6mDT5UB4QSbaoSMduithKzrbdShpXZ4XvE8+kLTz49n4+wbrrsweS2kX0HTbp9QJhG73bYa3d5kEgOjaPWFhEJFkgpGNnI9IVazm4xFzBLqyy0cEmiqAXgIY2EardIYwdubqPadlCJO6cPmDn6tivX2V+IDN4Thj6VEzsNFrawnlOmHuLxq4JFtrkEizFrqO4QFplOuDGGuW50bPPkDpA1n0S5xTu0w2te0LHSR513oFGHoDZkUGOmOgz6f+i//58OFu/VDR94joTHDlKDXYLnnqxyKlXv4G1xx9BBQHCaAqx4xmgoDWhsHPjeW4lAc9AJAWhkPgGAimJHAcpJeHcFtxduymqCCVk+s4+bparS16NSd1w63S+fgCk9Teg08vz/RGLbxNrhibbny9VTWI/XxIVLpL+NBasyhgwen07Pks6NxFMX9/3kTLW15fslJQ0UqIXKmMtZDXARTM+mPD/5MhgI8ecIZ422mj0JZ4V+p6QiKX+tw7q7YmqU/M9OlddTe+qq9PR3zM5Dtf/RgyZVWrVMVuXdtKzsbLvSsmYViR7G6TA6itG/951CQhzxcx+GCtZ00EaV16va7fktMmVNXfC9D87Tc+b9KejY24qABugINSGsictmgL8Wm2ofFLD+wGlxBmwcPNksDqeHARgfMzqgPGujulNtpNsdbKsAiatCvR1eo7vpyM8vUHkQJJDojFpR6Uj3SQT+TnmmjOMClpRFAKTcKgECAmLMrnCpNkLNigvMaQMCGXngjUWXMlWqiK9zt6bJDFPn5W8xuQ5bvyWPvWs37WVvd9SNl3Zbxf3XZQ+3GRGiErcWbb1tIp13TNwQAN4lcpQcalDA9A5S2YCY6zTUqbcwlJyzOZTVgPRMiYdXTkNMKWN32cy0MRAy3O6jVT4pL3yrh3ynWWS67KGNX03ZwCm74oYeolOlZzPsedUPRB9SkQsUUxqEAiTGDXJATI9LsVh8v8GnZ8bQOt1XXKGX3KmP3I9T0LbhJVKaYSrY/DnGIrZfMWHwSbgahw7NlRc6vAi2HU1QSA3erGAbK53wLhQWiG03fQuiYpO7skaJGuEvmMkIzYn5tbxSNGPDkTaWCmccrIo8zVuokgn6cgwmJx7Q+Sfl74n//zcDECfaM0pxHndNW81xCIyr5OlojHRv5JZDjaBYFyGpN1zNe4rU1+tc32VH1xCG6L4I7S2rR77aZTBRjydwSDtAlt37lzd8IIBGhqAo47TOw0lf5PzBmHXVKiEl9nOtsfiFVaJd33QikiLTm5WglRYZGdNCrbMykvZF/1w6neOZl8NyUbQmTDK3xWXI8VHwmXXN3gCyLxt0Bfhnh8bSb0SF5UZfJbVsdAxaHNNlM5mpPcnN2fqQN4na8iV1+S1hqQQg1w+exwkjEJbz4XS8aCwJyOlLGg2yVSRpoUbqZ/a8IIBGhqAN5SKpz/e6WwvwLquEI5DbXqKk8QBp0lCGyznc4yNIlHK6hCZnzBr5WRqyoIv15qJ/GIDkZx6T+PfA/PJ6y7PnbPdvV5W5Xf7JAf/DKR5Vk2uzFhdMccZRIwKHddhsPx5o8m6NpJ6ZgEbg8aHSMZgTuybPiT1KyGCAcd+rgrZ1/iAjl+g7fYZ1hixz0j2OY7CkEK1RnF0jKDZ6KuPBNaAPULwes9/jCFoaADetH//Fz93y63vWcAmW8/v6Fny/U5t67aHVbt3pcQ42eaEpP4/legVJtN77LhPhXGGuaRB+hlBrt2y68FgdGperB8c+fvzRkp6dmD4Dz6hv4fp61oTi0NDyrr7QWb67jqTDp1/nRCC/jcOnM/9EBtelX3XG1Svr4Yxi051Y0OsswvC+LskmT2BIAopzcw8XN8yJ44fPXxpkjTeEGfPAK4fGVm8aM/urw9R3eEBuPM1r/6/f+bIkem/PXXqJb1IVUIpfY01uacvuuiTp+a2PtN+6OGrKyYd8zafcDx5bSOe473kkkl8kRcVcbfmLMOssTbiZyY9nwjqbGqq/w5tQLoOXrGE6zrIAeNho2cnvGjT9+feseljUlrPwTeCtJ1I0fR6ASrskYZH5Z4j0nKTTaf1PX2jtsqVdwN1wo7L7KidBbFcUGqNFHHwqxREYUQHcWJyz54vL95/3/8eIiqOEHjGqCp0bqrXD73+xpe8l127zi8HpFh66qaL9r79mosv2vfk4aNzJ2dna72g57ajSPH6N958sDbyy6rTEapQSF0NOq6MVWg1brruw6TSdV3nyGyU5zs4Ex3Z0XTqLqdTZ96/eF+zQoFqpYIXdAkWT9JrNuitraHCAAeySOH4++D7TDowBhrOceLwJ0uRtjMc+ZJnvDa3IMnYfDVS2o27nTim0khJsVrDrdYojYwh6yM0A7vWVsYFSACZL0s6KTNAG7df3vE9ILozTQelDVHcb44xaCOQwiDjSa751cb0ca/0wesvufieqUp12q3Xo9FOp3OR0YtzE5NPulu3nuIsCUXTdhzqKoAoIjAmGKnV7p8qFO4PKxUiFbI6OsXiC69BHz5eNipCGWumqBiAkbZ+I2VEagmLXIP2NZoA1AYNuk4ZynO5zKmcrIk3WqOAUr1Ood1g4evf4NB993L68EF0FNkMCDqi07GeAmMM0pFUK2Wb8iP2/vepVmRlEECr3SEMQ2zePUOlUrJrcgfcTMkdiTtGCGh3enSDwALYGHzfwy/4hPFC9trEOHMX72PbdS+msuNCGs0WRAFSyvQZ2fMSQK5T7FLumLSPyf/on5AiMRoFAhIr2BicOLTMGDAy1oq1ch8r1Zr7R8a/uN2BsFplTAimjEZ4HlEQDA2scwvHMoYgigiMRrWadIslFt74NtT2XYgDT5tQG/xYzCbcL4iTTiar3hImIWKrdf3gNalPLKH81vZ5fmlywzbdwtsYlBBUqjXU04/zjY9/mBOHDzE5MsLendsZHx1lpF7l1Pwid93/MK7jEClFpVzi+muuoFws2LCyjUjEC7cx3H7Pg5w6vYTn2cVNl+/fz9zMFL14x8g8B8pVDd9zuf/RJ3jq0DH8gke3FzIzO8Pl+/bS7nRpNlscO3mKB778RR679etc+cNvYvaHXkdDSFTQQ8gsqDbBk8ib3wNsL8/xEikRd+aAVpo5dwQQGk0Qi2AHkFLgaEGkDToM9erkpPuNPfvYefBxRns9ekrRM7HI3rj1NqRntV2r7HToFcscfONbWL38SqqdNr0oEoE2+FqjjE0Pq7B55LLN/5Jo3iwUqk+hjtsxnU6O8TU4wDF2lkKkDZmJXq0NhfoI7Ufv49Y/fR8O8JqX38TOHVvtmhCt8X2fTmRj3ZLJd9d1GRkbpVIu2Tg4M1CwmJ0kycs937Nra6Wd163Wa4xNjtOJd2DfUNkHCn6BYrGEENjFXSKkWCwxPTtjU5sIwaX797G8usbd936LW//m41y5tMSut76blvJAR6n5nAn63AjdgCxni6/WeS9idkP+m9aGMM4BKLXBESA1OMK61QKlBVpz39gUIor4qeYiY53O0Plg8nTOG1bLbgdTLLL49ncRXXEV9U6bSsHHdT3d0xo/jliOjOWAvTh8JzJZQEKfaEobL9vUL2ndvMTIOF+isK/nMcaALBaJFo5z+4f+gnKxwI/96NuZnBij3emitQ2kLJeKlCrl3LMs8qv1OtValTBO2m0x1z9UnDhmyfXddPGUEZpStUJtbAy30xkoU1ZGARSKBdyCH+uLVl1wfZfq6Ai9IIh3ERDsHB9l1+6dfPWWb3DXzV/Gn5hm8qbX0ms2cqpLzukeszqR/D/oKO7jfP0nBhQhpDGEyhDE63hcBI4BV2AzMoDxEJSV5t6JWbzRMX754Xsom82najejc9IB3eUlot176P7mLzB748vY1u0hRqrUKmXuqFW7QaToxuI3MiZdQ6tTJ3S83QP0uWLoA1naLvZPngPm56Y2Et5C4DqSp7/0Obqry/zkP/95Lt53ESsrq4yUS/YebahUy5xcXLL3GIMxdnfPkclxRkbqBL1gQBHN3udIm5HKKxQsiOIiVUfrjE9P0mq2+6Vh3nASgmKxQKFYSFcPam3wi0XGp6bo9nr2uACjDYVCgbe85Y0snV7k4c9/hhftvwLq46heJ7ccYbBtcu8bbMu4FtnYNemYzt8hY2aBNnYDIgROHFARKY0QIvJ9T8tI4Qm4pzLOn87u5L825hlX0bqAkzPR8AAcGSV61WtZ+JG3YK68holWE+G5IGCkWqHg+xBGdLQmDaM32BGXuGHIxKtVZk1ubdAmYsQMNHR2ou+8ESB9n9b8PIfvvYcXXnk5L3rpDXTabSYLhZyXwlCtVhk7NY+U1pK2WxNIxiYnGB8fp9vrptqpIe+uMUjp4DiSYqmYbuQMgpGxUSZnZyg0GnGoe1L9jJULIShXyhSKhXRZu0ZTKpWYmJ2m2+5YFSWustaasdFRXv361/DHf/RnzD/yEFM3vhzVS3TorFyDTXQmadg3r537niA0SbWHseH5EYZICELAKIUwxjiuYww2fUldhXxz525+O5zlXxw8wBZXnrkAORoagB+95kaiao2oXMZ56pm+51cbHY63Wm0Ecfq1BDRW6zVx0kMD6axA1hr970kEXr9fK9N21gneNFjA4EiXtdMLdDtNLot3VF9ZXul7l8FQr9cZHR+zXETbtcx+wWdyZpqx8TG6nV7Ov9avHzmOixQCx3XjgaaRjmRsapLJmSn8Yv/+LInwTuyEar3G6MS4bQljMGjK1QqTM9O0m62+FW/Wuq6w77L91As+S4cOMXqDXQKbOr3zs0E59K0z7wYNlXzlcghMjBut48jn3BRgUrZGGAXHlte0jvMACQNKCP5cCG4e3cKrtaG42OI3ODsNDcDf/NjfIoxGbuDfkY5DY22tK4tJYu3kY0VekqLNLvMDIeKpptzE7yCwNpt7HTyQqTZW3CebrlRqNcbGJ7KAAnsRGsPo2CjFcsUGy2LDzAulIpNTU1TrNYqlXgbs5F5h31HwfXq9Hr1eQBIeIAXUanXGxidAOPSnPBPpuwFGRkYYn5pIo38MgBSMjo3h+YW+/InaGKq1Kq1WG1c69IIevTj/Nrk5dZGKFDKbaYP2y4y5HFJT9ScH5DiwxIotG7hq48csICMIusokaX7SugoMj7tFHjQGE5jzC8BwdXXzk0LgKB1JDVpksbhWjoDQpFaxVdyTTtG5ud/kjtziwbhBTHYy/8d+z3vwo8huG4Dk+OGjjI6PZSlDEmvZaEZGR6nUqjlnjkFKQbVeoz4yQrfQpS/iJAG6MfiFAl6nk0anJNzCLxaoj43aGLpBKzUdaIL62Ciu62YDB3Bcl/roCE6crya5U2nN9PQUjz70KKudDlOT0zY7hVK5cHrRp/7JXBsNjgORA1ufcZe7X2DFu4mULbPKPVAKiBSjfjHYNT2poiGdzWeioQE4Nz626TnpOHRbrfDUEbuzTp+CEYtgrTM9cDAMaIDX5CbP00tzv/NXZ9apAQh6uFOz1HddyDdv/jrHjxznksv2MT8/b/OhxCJzdGyUer1mQRSHlwshqI3UGR0fpd3u0Kfjm6wTCqUi7ZaP4yQBF/ZTKpcZHRu1YM+rIOQDFKyu6LhOX538gh8fd23qNyyoC4UC9foIX/j05wiA6t5LsmwHJvEFZgqLEPlQ/Bx361Py+j0K/eFuseg2xBm3klEUc0EDhIpawY92TE6YIPh2NtG1NDQAZ84AQNd1aTpOV2pj2Z3MsS1jMFpnCYhMNhQz7S77Yhj4m6I0B7xYjTRpgpX4uFI4hRIzr3gtB/7s9/hv//m/8Bd/9WG2b9vB4tLpdJf2YrFEoVBEiCyxkQEKhQLlciVVD9YJUgPFUjG2VPtFe9EvUK3W6MZ7vPXdmQJBUKvX4sX9mZ7m+wVqtToY4vR1xvoGJ6b5g999H//w2c8zfeX1FHZcgO710inHTATHv3LSMh9xZFW43HAfWERj+mqaRG1bI4R0kVl8sYoo+V5nfKQe9nrnkgt1YxoagEfWmpuek45Lr91tKUdqlJLo/GJmG+OWjGxDvPI+uyA5Gv/MR/bGHCRurJTb5eY0Bzmk6LQoX7SfXa97K5//h7/lF37qZ/nP//3/5sK9FxLpkEhF1It1CoU4A3UOR6VymUq1kkajbGTIlcqlLLdyjgp+kVqxRrfWzQEwLRUkXLZYT58sZAJAn9HaKJ7nIRB4vken1eF//Y/f47d+4z9Q276b6Te81Q7keDfSZFot41w5hTg+koawmsymz4w8G2CwfgsIyzCsMz5mEal+aUA6nOyFzXuOz+so8Zd+GzQ0APdsndv8Ia5LY63RefohR4W9nsT1+liYjjeoMfTnNenX5RKnLuTb0sQNYJsiieDL3CeQuUlS663XZezlr8XxPT712b/jgfvu401veTPXXX8901tn2DK3jVNHT4DRyFiUqV6P+eMn0GFIp93J6W39VCyVWF1dIWh3kcQ+MwxLCwscP36EpZWl9QA0iQol6I20aa6sWkDEufd6zSZPP3mAxdOLLM0v8ugjj/DFz36Wr91yG/V9l7Ptre9GVGtE7VbaLjquf94AsSFTyeDRGfBEjlvGBRKI1CebtaEFpd3KIsr8Zslo1EAYsWVyvPeii/bQ63Y3BsQ5kBh256H/9MkvbHrO9zwWl5Zv+pP3f/izjUazLApeGholNJhQc8G1VzE+N0fY62EDN+29fePP5MVyFt+XcylihEl1oFT3wYo3Gf8VGKTjIoslesePsHDHLTSePkApCig5klqtShgpVhdO2zdpjev7TG2dw3GdbJZig7pKIVFacfrYccJegIh9iZNbZilVK6hIrXcVJY2NQDqSpfl5miurSOlgtKZcq1IdG6PdbNIJAppGIscnmbnmBuqXXQlCoLsdjEiSPSXt0a9LI+w2uUmSJrCh9On3+JpECmflTFYaGqTjoJTiyTvupL26gvR8y0QQCMdg1lq89Uff+nvvftPr/7dWq70pJgB++rorzngezoEDPrG0uRXsui6tVruBFCEqBC1jj7OxUbZJSD4i5eZ93I/+QQYWbDp3XT5DRF53zItKg7UCbcLuCNFu4sxsYfqt72ai1aS3tEjUatIMArRWjBR8EghrrVnodnJi39KAey19Y+XaIhVHpifXul2WksTfgxP9SX7l+P7i5QXGPS8dfKFSrEYK6dl0c2Oj4zgjozZzf7djM5LF4Eu3ke0ft5lKgnUkJzlyUmMl5oKZJZzALvM6mPhYpLEbj6sIpBNLJ0GShmGh3Vv82tNHz8oBzysAf/RFV296ruB5zK+urd7x+S+0GidPjph41GT6W0TY661rqJyUTsGWB8CASpN+kYPnYtIQZ3dKhrdBdNoW1I6LP7uFgnSsS2Ig6higSD+Yk9duBMDBewubao39BsNGz/aTRoA4s0KE6nbj9TOkoE7aKOVkuacOct28iy6REhgb3ZzcJMkcz8mVUkqiKEAHdhMUnc7vGkygcR2HdtBbfPSpZ/iu6oCPP31w84c4knYYLfuFwhJCbkl9Arkm6bZbhFrHbqVknUR/Q2Wj8MxqwdmUhsRo6btWRemulOdCm4nT7yiJbKFCXtQm5cnTMGVL1BcgbXdMYi3HojenIwa9HioKIUlDksBeaJxCEd/zllWn3ec0f7Y0NAA/+60HNz9pDIViMXA8r2HBZwZaxhAEXcLUFdO/JDLPOzbmIWenMwGl79wmQQbPFQ1y3GGuz7ddQs9mkOjcjYl5ZwwEQRjv/pSXNQa0xnUcdfGOrWujo6NZ1NC3QUMD8MJdO894vlgsdRaPHTuVeZvpGz1Rt5eOmLyRkfNU5Z7Wf2Zzyu7rF5PrO2RYTpa5Kfqfu/F164/1l2oYbt1/x0b3iXV3nK1dBsu5eXvmmUDy9LDbsXOmnpNrWAFK45XL7bHJyVPjtRpB9F0E4MsuvfiM5yuVslo+dvTpb92c5BROHLACHIew2STqdPArFVQYki7+yFM+zx2Z2FgXo28gi+cSuUbKujP/INN3Prk+ESu5l6Wel/zx/KP6YZ5PzZfv5lwhB94Vf0/fwTrqr3NSn5xLSMjchWeBuYA0k+sgpJNyZQpleqq7shIXWZJzV9hQtpHRBeW4Rxu9kEh/F0Xw0cXFM54vNhu45dIBt1ImCgLIbzkvHVSnQ6/VpDgykjpTM+oH3vrfGSXYHmy0/Jd1t4n+H9ZGERtfk3t29q4NH9SHocH1a2lZRHYutTnPVMDN3jc4CMVg+5mBAicpTPo9gP1N1X9MSIkKw9y8/3pgj0xMHFzqdBeD8+ADhHOZCVlePeN5z3NxSuXDhVpNRfPzDn7OGS0ERIruygojW7eRr7gZ4Cp5OpOYO9t1G1+zHqDZvRu/f1jKrMm8wDs3cbxZPYZTKwaBvcFCeNbxwdxvg3RdeivL9FotcJ08O7bfpWR6eurQhdOTvU7nXPbE3JyGBuB0vXbmB0mHaqH4+Mj4+KnWiRNb1mlljqR18gTRBXuQrrsBFzwb9euJ+cYbzhJMN2Toe8b5p7zoPDfKg+Hs+u+56aeb3Z+/VkhJ8+QJTLcLxWL/U6IQUS4zPjH+oAlDxHkQv3AOABwreGc8L4CZkZGDl++7+PbjDz/8tmyj3LgSnkewvMza8eOMX3ghqh2dYWG4pX6wDK94b1y+9e8Z1igZ5tr+675daK83O57dnf206XOMwfF8gmaLtcOHbTbYPmQCYcj0rt2Nyy/YcUu94BI652f4Dg3AK+emznjeALVySS1dednXvviFL71NtdtQKOSUZ6sMrzzzNPVt23B9HxUMrr0YjgbbBjZq3OG4yNlo0D7fjLuc6T3DcqRhn/fs71vvdkr0ROl7rD7xOFGjYblfMv8JJHGB+y/e+60d46MPhUGAds5l8eXmNPRTksXQm32kgCgMuHz3jq/v3rWjSXcgVMcY8H2C5WUWHnkY4ThIJ69nnJnMJt/T8g1x//no1LN38JlJDPwdPPedUQvOQMbgFUusHT/O8oHHwY0lXX6EBwGiUuHKfXtvrniy6wkoOuKsn2HovAHQ2hmK6Xrl4Ve++LrP4kg7lzjYqr7P6pMHWHj8MZxi8ZxAmLRHngzrwZWYGufiK/t2rhFnuWozQ2qzunznaOCNBtxymfbqMqfuvRsdReC6uULEalSnw2X7L164+tKL/tqVkkqpSLl49s8wNHyGVO/MOmBcXIQU4Tte+0P/47bb737DA3fdU2V8LBfUiJ3e8TwWH34YR0rG9+5FKGdocTyoOG92zbnQsAr7MOfOpjM+G4Cd2Xo9E60XuQA2FYmDWyjSXl7kxF13EbXbmejN/DLQC/CqVX72nW/+8xfs3v7AWqt1Xrn08BHRU2NDP3RnpXr7L/70j330X9z/4M+pTheKOV1QG3BcIGL+W9+iu7LC9Asutw7qXi9bVbdhLfM59DZ33/Q3+8adcN4pduzm14pkUNmI17HB8c1pI5fKcM+Kj+d0ca9QxAhYfvpJTj/8EFGvl4FvkJZXeO2Pvfngu1550x9KKRirlYcu8zA0dDzgcTVc+LUBm/xHsf8XfuO3Pv3JT3xqF7PT/UotWG5nNHR7FMbGmNy3j+rMLE6hgApDKw7OVPDc+/K/B49t1j3DGg0bvWczV87mnHAzEK73S54JrhuV7Uzlyv+WQiB9H4Od6Vh64nHWDh+ymU59P+ufPPdbXWN8bIS//pP/+Us/dPHeP1jj3GhkiGuG5oDrw8w3uQ6IjKLq+A//3M/++LseePjRP3nm6UP7GR8Dk6wZhnSdaqlIb22VY7ffRmlikpGdu6hu2YJXKpGuJ4lsFIsABrcvyNOZQJP/vTklcOnnX/nvg8/Inx/s9DO/rx98wz53s+dv9C6ZGHpSolVEc36e1UMHaRw/jgl64BcsANOltCL+I6DXoyxF+G9/5Z//p+sv3vvHrb5Snz8aGoCdc1gBJYQgRFMeqd3+qje/7mc//Icf+GS70ZyjVolzqMVkfQB2BGpNZ/E0ndML+E+NUZ6epjQ+TnF0DL9SsXn0ktvixeTJfsJAFp6ff/TA9+zcBtw4uVD035fuDJl/wAZmR3LrxkDdvNs2GiTDyKS8D1VIgRDSJluK62KMIer1aC8t0VleorMwT/v0aUwyTZq6WvLLaOOvWsPCIpe85of+y0tufNF/7WGB8p1QZIYWwZ949PFzezBxwkfX4a5v3Pmjf/xHf/Hna5Gq9OmD624S9ly88zbSwamUKY6OUqyN4FXKeOUybqGILBZwXM9mtxJx14vs3fDstb9z19CePZ1ZOJ/pRo0xAm00OgrRYUjU6xG2WkTdLkGjQWd5mbDZsDuZgwXe2bwOWiMaTV75ypv+4t0/8aO/cMW+vcFMrUqSivdcaE46Z73mO8IBE5JC4OPw8le+7OPPzJ92P/WxT743CoKteD4bVifRQzzPfoxBdTq0mk1aHAUhrP/QL+AUfZxCEddxEZ6L9HyE54Hr4mIXe5s4fRoGjJSWmzkSobU9LyU62SwxWWGWpqOwK6Gcgh/vPp4E0W7wicGfSK8s83WyMm1jV42NpIlzZsei0KgIHNdOdRmDEQIVRTZgVCu7pgbQvR4qCNBGE8XfVS+wojXv/HddOyGQb+N17Y515CoF7S57L9//+7/27//lb1y/bVtwWqs438+zGJDnE4DOJmn5z0ZRpAiCgLG52b+sbp071F1a+sNut/sCfJ9sfeqA1Ztftu+69gO2gzCoXhfVaecac5PmyeutCXdNjyXvTMqQ6xiT+xJzWBNbuZkyNrjBQ/w9eWYfGzUZOjeiBAAJoDdakbfZ72R1kYi3kU3cZQPrltP6DuIvuazXQzpOWJie/v9N7tn9X1zfN2vYVYaCZwG+Iem8bVZ4JjLGEAYBUspvTu3c/mPt1cZ/X5pfeJMxxoKrb5HHIBByv5POdZwYlInivIlJcjaZkQLyDOBN1s3mdC5L+QG5Uc+eC53FTEpBPTCAzvTOdW2StEfuPiEgjEBrRkdHnpjdtfP/Wmi0Phj2Apvm5LtA3xUAJqSUwi8WH6vW6u/wfe/Hu43mv1xeW7uWUIPnWjGUM8jOSH3cbyMaUAg3vGRj42PDa85K54NHnOUZ65YTPMtXGCCKIFIUy6XFUrXy/t17Lvij2sT4EycfOTdd/9ul7yoAwVqwSkVheaT+wW3btnzh8MHDP9taWfmZdi+8WIeBBaET6w4btvGgY2QjkyN3TV5U9XEBNr7PbPAMTB9HzI7n78+9p4/7DJZzg/rkkhdlCbFz7zW569KimQ2qm3vOYDXB6rcqBG0oV0rNsdHRz8xu2/I/V5qt2zQQhd8drpen7zoAE7IZnsSpSr3233Zunf3w0aPHX9npdN/UDcKbOp3OuJ0xcTLxs26Xuo044AZiJ/06eN0ACDdSAfK/zZlAtMk7Ny3n4CW5awbLYQbrMOAn2qwMxlh3SrKgWmmk4wQTY2N3V2qVL1y4Z9eX3FLxG2vNFnp1Lc3Y+t2m5wyAYHVDpRSe6x7xCoW/qE+MfyCIoit6rc6rVBhev7y6donWeotRajTLVQJp9EPyWwrStRJKZedTGtCXBJvojRtfnivx2b8PMuj8j0GbZdPrN6EkKZKM12okDmSt7WBVNvE6SuE4Do7ntT1HLviFwjOzM9MPtLrdfxipVW+p1+vNYrFo0yhH5yew9NnScwrAhOxOmxqttRZS3jc9M3WflFIGh46MTU6M7+y023sbrdbFjuPsMUE40Q2jySDo1VzHHddGlyKtizYRg6YocCKBG/V16KAFuUlBzmILrLt2I6m/0TvSfL0bXJ88Z0CSD5LEUBRChRAFAFIKz5WhEKJTdJ3lQKnGSKm4pIRYrNVrx7TmsUqtcsCFp1q9cPGCvXvaTz19kCiKiKIIpRRmw71Pv7v0PQHAPBlj4jRqRgtYLBQLi5FS95aEoF6tTumgV19qtkdEx6lMjI9PVgr++OGl1enW0pIpSMl1l+0rHFltjJ9YXvG1ihJ/XKpJ2Zesty3MwI/+RXE53TDv2Rm8N40kESmg+q7JqXTCZIuGUubYt3rNZI+UDvVyKXzR3t3LTx853n344BFDrSZ3bJlpSGPmXc89feLEqcbM3HQjDMLVibmZ06cXVwK/WMRVirVOjyiK0PGeH99LNPRMyPP0PH0n6PzEVT9Pz9OzpOcB+Dw9p/Q8AJ+n55SeB+Dz9JzS8wB8np5Teh6Az9NzSs8D8Hl6Tul5AD5Pzyn9/wEFaPppgwjxcAAAAABJRU5ErkJggg=="/>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/avatar/user.svg b/app/components/base/icons/assets/public/avatar/user.svg
new file mode 100644
index 0000000..1608b0a
--- /dev/null
+++ b/app/components/base/icons/assets/public/avatar/user.svg
@@ -0,0 +1,12 @@
+<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_5968_39205)">
+<rect width="512" height="512" rx="256" fill="#B2DDFF"/>
+<circle opacity="0.68" cx="256" cy="196" r="84" fill="white"/>
+<ellipse opacity="0.68" cx="256" cy="583.5" rx="266" ry="274.5" fill="white"/>
+</g>
+<defs>
+<clipPath id="clip0_5968_39205">
+<rect width="512" height="512" rx="256" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/billing/ar-cube-1.svg b/app/components/base/icons/assets/public/billing/ar-cube-1.svg
new file mode 100644
index 0000000..2022ecd
--- /dev/null
+++ b/app/components/base/icons/assets/public/billing/ar-cube-1.svg
@@ -0,0 +1,3 @@
+<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M14.0002 14V23.9166M14.0002 14L5.25 9.07806M14.0002 14L22.4731 9.2338M23.625 9.95052V18.0493C23.625 18.8924 23.1703 19.6697 22.4356 20.0831L15.1439 24.1846C14.4336 24.5842 13.5663 24.5842 12.8561 24.1846L5.56439 20.0831C4.82967 19.6697 4.375 18.8924 4.375 18.0493V9.95052C4.375 9.10756 4.82967 8.33012 5.56439 7.91684L12.8561 3.81529C13.5663 3.41574 14.4336 3.41574 15.1439 3.81529L22.4356 7.91684C23.1703 8.33012 23.625 9.10756 23.625 9.95052Z" stroke="#101828" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/billing/asterisk.svg b/app/components/base/icons/assets/public/billing/asterisk.svg
new file mode 100644
index 0000000..1ee4059
--- /dev/null
+++ b/app/components/base/icons/assets/public/billing/asterisk.svg
@@ -0,0 +1,5 @@
+<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="asterisk">
+<path id="Vector" d="M14.0033 3.20837V24.7917M4.65747 8.60421L23.3492 19.3959M4.6586 19.3959L23.3503 8.60421" stroke="#101828" stroke-width="1.5" stroke-linecap="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/billing/aws-marketplace.svg b/app/components/base/icons/assets/public/billing/aws-marketplace.svg
new file mode 100644
index 0000000..02fb327
--- /dev/null
+++ b/app/components/base/icons/assets/public/billing/aws-marketplace.svg
@@ -0,0 +1,23 @@
+<svg width="126" height="24" viewBox="0 0 126 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_394_42756)">
+<path d="M47.3963 14.5593V8.71609C47.3963 8.14631 47.2869 7.73413 47.0682 7.45531C46.8494 7.1886 46.5091 7.04313 46.0473 7.04313C45.2209 7.04313 44.3824 7.29771 43.5438 7.80687C43.556 7.89173 43.556 7.97659 43.556 8.06145C43.556 8.14631 43.556 8.2433 43.556 8.32816V14.5351H41.8667V8.69184C41.8667 8.12207 41.7573 7.70989 41.5386 7.43106C41.3198 7.16436 40.9795 7.01888 40.5177 7.01888C39.6549 7.01888 38.8284 7.27346 38.0385 7.7705V14.523H36.3492V5.9157H37.759L37.9291 6.77642C39.0229 6.0248 40.0802 5.66112 41.1132 5.66112C42.1705 5.66112 42.8875 6.06117 43.2521 6.86128C44.3702 6.06117 45.5004 5.66112 46.6185 5.66112C47.3963 5.66112 48.004 5.87933 48.4172 6.32788C48.8425 6.7643 49.0491 7.39469 49.0491 8.20693V14.523H47.3963V14.5593Z" fill="white"/>
+<path d="M56.0492 14.5593L55.9156 13.6744C55.5023 14.0259 55.0527 14.2926 54.5666 14.4866C54.0683 14.6806 53.5822 14.7775 53.0961 14.7775C52.294 14.7775 51.6498 14.5472 51.1637 14.0865C50.6776 13.6259 50.4346 13.0197 50.4346 12.2439C50.4346 11.4195 50.7262 10.7527 51.3217 10.2678C51.9172 9.77078 52.7072 9.52832 53.7037 9.52832C54.36 9.52832 55.077 9.62531 55.8426 9.81927V8.70397C55.8426 8.09782 55.709 7.6614 55.4294 7.41894C55.1499 7.16436 54.6759 7.04313 54.0075 7.04313C53.0474 7.04313 52.0509 7.21285 51.0179 7.56441V6.37637C51.4311 6.15816 51.9294 6.00056 52.5127 5.87933C53.1082 5.7581 53.7037 5.69749 54.2992 5.69749C55.3808 5.69749 56.1708 5.9157 56.6812 6.36425C57.1916 6.81279 57.4468 7.49168 57.4468 8.41302V14.5593H56.0492ZM53.4971 13.5046C54.2627 13.5046 55.0527 13.2137 55.8426 12.6439V10.9103C55.2471 10.7649 54.6516 10.6921 54.044 10.6921C52.7679 10.6921 52.1238 11.1892 52.1238 12.1711C52.1238 12.5954 52.2453 12.9349 52.4763 13.1652C52.7193 13.3834 53.0596 13.5046 53.4971 13.5046Z" fill="white"/>
+<path d="M59.3792 14.5593V5.95207H60.7889L60.9712 7.22497C61.2872 6.88553 61.5788 6.61883 61.8584 6.43698C62.1379 6.25514 62.4053 6.10966 62.6969 6.0248C62.9764 5.93994 63.2924 5.89145 63.6206 5.89145C63.8393 5.89145 64.0702 5.90357 64.3133 5.93994V7.46743C63.9487 7.41894 63.6449 7.39469 63.3896 7.39469C62.4782 7.39469 61.7004 7.6614 61.0563 8.20693V14.5593H59.3792Z" fill="white"/>
+<path d="M65.3584 14.5593V2H67.0477V9.71017L70.7057 5.96419H72.7596L68.6762 10.0496L73.027 14.5593H70.9002L67.0355 10.486V14.5593H65.3584Z" fill="white"/>
+<path d="M74.5704 10.6194C74.5947 11.5892 74.8378 12.3166 75.2996 12.7773C75.7614 13.2379 76.4663 13.4683 77.4385 13.4683C78.3378 13.4683 79.2493 13.2985 80.1729 12.947V14.1472C79.3587 14.5836 78.3621 14.8139 77.1833 14.8139C75.7857 14.8139 74.7284 14.426 74.0235 13.6622C73.3065 12.8985 72.954 11.7589 72.954 10.2557C72.954 8.81307 73.3065 7.69776 74.0235 6.90978C74.7405 6.12179 75.7371 5.70961 77.0131 5.70961C78.0948 5.70961 78.9212 6.01268 79.4924 6.61883C80.0757 7.22497 80.3552 8.0857 80.3552 9.18888C80.3552 9.72229 80.3066 10.2072 80.2215 10.6315H74.5704V10.6194ZM76.9159 6.97039C76.1989 6.97039 75.6399 7.1886 75.251 7.60078C74.8499 8.02508 74.6312 8.65547 74.5704 9.49195H78.8118C78.824 9.40709 78.824 9.2495 78.824 9.05553C78.824 8.36452 78.666 7.84324 78.3379 7.49168C78.0219 7.15223 77.5479 6.97039 76.9159 6.97039Z" fill="white"/>
+<path d="M86.9421 14.3532C86.3831 14.5715 85.7511 14.6806 85.0584 14.6806C83.4421 14.6806 82.64 13.8804 82.64 12.2681V7.27346H81.0722V6.1824L82.6886 5.97631L82.9438 3.52749H84.3171V5.93994H86.8692V7.26134H84.3171V12.1832C84.3171 12.6075 84.4143 12.8985 84.5966 13.0682C84.7789 13.2379 85.107 13.3228 85.5567 13.3228C86.0185 13.3228 86.4803 13.2622 86.93 13.1531V14.3532H86.9421Z" fill="white"/>
+<path d="M88.0967 5.95207H89.5064L89.6644 6.83704C90.5273 6.0733 91.4874 5.69749 92.5447 5.69749C93.6506 5.69749 94.5135 6.09754 95.1454 6.89765C95.7774 7.69776 96.0933 8.7767 96.0933 10.1466C96.0933 11.5407 95.7531 12.656 95.0846 13.4925C94.4162 14.329 93.5291 14.7533 92.411 14.7533C91.3901 14.7533 90.5151 14.4139 89.7738 13.7471V18.0628H88.0967V5.95207ZM92.0585 7.05525C91.2564 7.05525 90.4908 7.30983 89.7738 7.83112V12.5712C90.5151 13.1167 91.2564 13.3834 92.0221 13.3834C93.5898 13.3834 94.3676 12.3287 94.3676 10.2315C94.3676 9.15251 94.1732 8.36453 93.7964 7.84324C93.4318 7.32196 92.8485 7.05525 92.0585 7.05525Z" fill="white"/>
+<path d="M100.711 14.4381C100.335 14.5715 99.9337 14.6442 99.484 14.6442C98.8885 14.6442 98.4267 14.4745 98.1107 14.1229C97.7948 13.7835 97.6368 13.2864 97.6368 12.6439V2H99.326V12.5348C99.326 12.7894 99.3746 12.9834 99.484 13.1046C99.5934 13.2258 99.7757 13.2864 100.019 13.2864C100.25 13.2864 100.481 13.2743 100.711 13.2379V14.4381Z" fill="white"/>
+<path d="M107.225 14.5593L107.092 13.6744C106.679 14.0259 106.229 14.2926 105.743 14.4866C105.245 14.6806 104.758 14.7775 104.272 14.7775C103.47 14.7775 102.826 14.5472 102.34 14.0865C101.854 13.6259 101.611 13.0197 101.611 12.2439C101.611 11.4195 101.902 10.7527 102.498 10.2678C103.093 9.77078 103.883 9.52832 104.88 9.52832C105.536 9.52832 106.253 9.62531 107.019 9.81927V8.70397C107.019 8.09782 106.885 7.6614 106.606 7.41894C106.326 7.16436 105.852 7.04313 105.184 7.04313C104.224 7.04313 103.227 7.21285 102.194 7.56441V6.37637C102.607 6.15816 103.106 6.00056 103.689 5.87933C104.284 5.7581 104.88 5.69749 105.475 5.69749C106.557 5.69749 107.347 5.9157 107.857 6.36425C108.368 6.81279 108.623 7.49168 108.623 8.41302V14.5593H107.225ZM104.673 13.5046C105.439 13.5046 106.229 13.2137 107.019 12.6439V10.9103C106.423 10.7649 105.828 10.6921 105.22 10.6921C103.944 10.6921 103.3 11.1892 103.3 12.1711C103.3 12.5954 103.422 12.9349 103.652 13.1652C103.896 13.3834 104.236 13.5046 104.673 13.5046Z" fill="white"/>
+<path d="M116.571 14.232C115.915 14.5715 115.149 14.7412 114.286 14.7412C112.95 14.7412 111.929 14.3532 111.212 13.5895C110.507 12.8258 110.142 11.7226 110.142 10.2678C110.142 8.82519 110.507 7.72201 111.236 6.93402C111.965 6.14603 112.998 5.7581 114.335 5.7581C115.101 5.7581 115.805 5.9157 116.474 6.23089V7.43106C115.83 7.22497 115.198 7.12799 114.566 7.12799C113.618 7.12799 112.925 7.37045 112.512 7.85536C112.087 8.34028 111.88 9.10402 111.88 10.1587V10.3769C111.88 11.4074 112.099 12.159 112.512 12.6439C112.937 13.1288 113.606 13.3713 114.529 13.3713C115.137 13.3713 115.805 13.2622 116.535 13.0318V14.232H116.571Z" fill="white"/>
+<path d="M118.965 10.6194C118.99 11.5892 119.233 12.3166 119.694 12.7773C120.156 13.2379 120.861 13.4683 121.833 13.4683C122.733 13.4683 123.644 13.2985 124.568 12.947V14.1472C123.754 14.5836 122.757 14.8139 121.578 14.8139C120.181 14.8139 119.123 14.426 118.418 13.6622C117.701 12.8985 117.349 11.7589 117.349 10.2557C117.349 8.81307 117.701 7.69776 118.418 6.90978C119.135 6.12179 120.132 5.70961 121.408 5.70961C122.49 5.70961 123.316 6.01268 123.887 6.61883C124.471 7.22497 124.75 8.0857 124.75 9.18888C124.75 9.72229 124.701 10.2072 124.616 10.6315H118.965V10.6194ZM121.311 6.97039C120.594 6.97039 120.035 7.1886 119.646 7.60078C119.245 8.02508 119.026 8.65547 118.965 9.49195H123.207C123.219 9.40709 123.219 9.2495 123.219 9.05553C123.219 8.36452 123.061 7.84324 122.733 7.49168C122.405 7.15223 121.931 6.97039 121.311 6.97039Z" fill="white"/>
+<path d="M27.0036 14.8139C26.4567 14.8139 25.922 14.7533 25.3994 14.6321C24.8768 14.5108 24.4758 14.3775 24.1962 14.2199C24.0261 14.1229 23.9167 14.0259 23.8803 13.9289C23.8317 13.832 23.8195 13.735 23.8195 13.638V13.1167C23.8195 12.8985 23.8924 12.7894 24.0504 12.7894C24.1112 12.7894 24.1719 12.8015 24.2449 12.8258C24.3056 12.85 24.4029 12.8864 24.5122 12.9349C24.8647 13.0925 25.2414 13.2137 25.6546 13.2985C26.0678 13.3834 26.481 13.4198 26.8942 13.4198C27.5505 13.4198 28.0487 13.3107 28.4133 13.0803C28.7658 12.85 28.9481 12.5227 28.9481 12.0984C28.9481 11.8074 28.8508 11.565 28.6686 11.371C28.4862 11.177 28.1338 10.9952 27.6234 10.8255L26.1164 10.3527C25.3508 10.1102 24.8039 9.75866 24.4515 9.29799C24.1112 8.83732 23.9289 8.34028 23.9289 7.79475C23.9289 7.35832 24.0261 6.97039 24.2084 6.64307C24.3907 6.31575 24.6459 6.0248 24.9497 5.79447C25.2536 5.56413 25.6182 5.38229 26.0313 5.26106C26.4446 5.13983 26.8821 5.07922 27.3439 5.07922C27.5748 5.07922 27.8057 5.09134 28.0487 5.12771C28.2797 5.16408 28.5106 5.20045 28.7172 5.24894C28.9238 5.29743 29.1304 5.34592 29.3127 5.40654C29.495 5.46715 29.6408 5.52777 29.7502 5.58838C29.896 5.67324 29.9932 5.7581 30.054 5.84296C30.1148 5.92782 30.1391 6.03693 30.1391 6.1824V6.66732C30.1391 6.88553 30.0661 6.99464 29.9082 6.99464C29.8231 6.99464 29.6894 6.95827 29.5071 6.87341C28.9116 6.6067 28.2432 6.47335 27.514 6.47335C26.9185 6.47335 26.4567 6.57033 26.1286 6.7643C25.8004 6.95827 25.6425 7.26134 25.6425 7.68564C25.6425 7.97659 25.7397 8.21905 25.9463 8.42514C26.1529 8.61911 26.5296 8.81307 27.0887 8.99492L28.5592 9.46771C29.3127 9.71017 29.8474 10.0375 30.1634 10.4618C30.4793 10.8861 30.6495 11.371 30.6495 11.9165C30.6495 12.3651 30.5644 12.7651 30.3821 13.1167C30.1998 13.4683 29.9446 13.7835 29.6286 14.038C29.3127 14.2926 28.9238 14.4866 28.4741 14.6199C28.0244 14.7412 27.5383 14.8139 27.0036 14.8139ZM13.6718 14.5351C13.4895 14.5351 13.3558 14.4987 13.2707 14.4381C13.1856 14.3775 13.1127 14.232 13.052 14.0259L10.6214 6.01268C10.5606 5.80659 10.5363 5.67324 10.5363 5.6005C10.5363 5.43078 10.6214 5.34592 10.7915 5.34592H11.8124C12.0068 5.34592 12.1405 5.38229 12.2256 5.4429C12.2985 5.50352 12.3714 5.64899 12.4322 5.85508L14.1822 12.7045L15.7742 5.85508C15.8228 5.64899 15.8836 5.51564 15.9687 5.4429C16.0538 5.38229 16.1874 5.34592 16.3819 5.34592H17.2204C17.4149 5.34592 17.5486 5.38229 17.6336 5.4429C17.7187 5.50352 17.7795 5.64899 17.8281 5.85508L19.4687 12.8015L21.2674 5.85508C21.3281 5.64899 21.4011 5.51564 21.474 5.4429C21.5469 5.38229 21.6927 5.34592 21.8872 5.34592H22.8473C23.0174 5.34592 23.1025 5.43078 23.1025 5.6005C23.1025 5.64899 23.0903 5.69749 23.0903 5.7581C23.0781 5.81871 23.0538 5.90357 23.0174 6.01268L20.5138 14.0259C20.4531 14.232 20.3802 14.3654 20.2951 14.4381C20.21 14.4987 20.0763 14.5351 19.894 14.5351H19.0069C18.8124 14.5351 18.6787 14.4987 18.5937 14.426C18.5086 14.3532 18.4478 14.2199 18.3992 14.0138L16.7829 7.3462L15.1787 14.0138C15.1301 14.2199 15.0693 14.3532 14.9842 14.426C14.8992 14.4987 14.7655 14.5351 14.571 14.5351H13.6718ZM5.32267 13.4077C5.66296 13.4077 6.0154 13.347 6.39214 13.2137C6.76888 13.0925 7.09701 12.8621 7.37653 12.5469C7.54667 12.353 7.6682 12.1347 7.72897 11.8802C7.78973 11.6377 7.82619 11.3346 7.82619 10.9831V10.5466C7.52237 10.4739 7.20639 10.4133 6.86611 10.3769C6.53797 10.3406 6.20984 10.3163 5.89387 10.3163C5.20114 10.3163 4.69072 10.4497 4.35044 10.7285C4.01015 11.0073 3.84001 11.4074 3.84001 11.9287C3.84001 12.4136 3.96154 12.7773 4.21675 13.0197C4.49627 13.2864 4.84871 13.4077 5.32267 13.4077ZM9.53976 11.8317C9.53976 12.2196 9.57622 12.5227 9.66129 12.753C9.73421 12.9834 9.85574 13.2258 10.0016 13.4925C10.0502 13.5774 10.0745 13.6501 10.0745 13.7228C10.0745 13.832 10.0137 13.9289 9.88005 14.0259L9.21163 14.4866C9.11441 14.5472 9.02934 14.5715 8.94427 14.5715C8.83489 14.5715 8.73767 14.523 8.64044 14.426C8.49461 14.2805 8.37308 14.1229 8.2637 13.9411C8.16647 13.7713 8.0571 13.5653 7.94772 13.3349C7.13347 14.2926 6.11262 14.7654 4.89732 14.7654C4.0223 14.7654 3.32959 14.523 2.83131 14.0259C2.32089 13.5289 2.06567 12.8621 2.06567 12.0378C2.06567 11.1528 2.38165 10.4497 3.01361 9.90413C3.64556 9.37073 4.49627 9.0919 5.55358 9.0919C5.90602 9.0919 6.27061 9.11614 6.64735 9.17676C7.02409 9.22525 7.42514 9.31011 7.83834 9.40709V8.64335C7.83834 7.85536 7.68036 7.30983 7.35222 6.98251C7.02409 6.66732 6.46506 6.4976 5.66296 6.4976C5.29837 6.4976 4.92163 6.54609 4.54488 6.63095C4.16814 6.71581 3.7914 6.83704 3.42681 6.98251C3.25667 7.05525 3.13514 7.10374 3.06222 7.11587C2.9893 7.12799 2.94069 7.14011 2.90423 7.14011C2.75839 7.14011 2.68548 7.031 2.68548 6.81279V6.30363C2.68548 6.13391 2.70978 6.01268 2.75839 5.93994C2.80701 5.86721 2.90423 5.79447 3.05007 5.72173C3.41466 5.53989 3.85216 5.38229 4.36259 5.24894C4.87301 5.11559 5.40775 5.05497 5.97894 5.05497C7.21854 5.05497 8.11786 5.3338 8.70121 5.90357C9.2724 6.46123 9.56407 7.30983 9.56407 8.44938V11.8317H9.53976Z" fill="white"/>
+<path d="M28.9723 19.8449C25.5573 22.3665 20.5989 23.7 16.3332 23.7C10.3539 23.7 4.97014 21.4936 0.886731 17.8204C0.570753 17.5294 0.850272 17.1415 1.23917 17.3597C5.63855 19.9177 11.0709 21.4451 16.6978 21.4451C20.4895 21.4451 24.658 20.6572 28.4862 19.0448C29.0573 18.8023 29.5313 19.4327 28.9723 19.8449Z" fill="#FF9900"/>
+<path d="M30.3942 18.2205C29.9567 17.6628 27.5018 17.9537 26.3958 18.0871C26.0677 18.1235 26.0069 17.8325 26.3108 17.6264C28.2674 16.2565 31.4758 16.6566 31.8525 17.1051C32.2293 17.5658 31.7553 20.7784 29.9202 22.3059C29.6407 22.5362 29.3733 22.415 29.4949 22.0998C29.9081 21.0815 30.8317 18.7902 30.3942 18.2205Z" fill="#FF9900"/>
+</g>
+<defs>
+<clipPath id="clip0_394_42756">
+<rect width="124.5" height="24" fill="white" transform="translate(0.75)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/billing/azure.svg b/app/components/base/icons/assets/public/billing/azure.svg
new file mode 100644
index 0000000..186ab0a
--- /dev/null
+++ b/app/components/base/icons/assets/public/billing/azure.svg
@@ -0,0 +1,25 @@
+<svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Group 5">
+<path id="Vector" d="M7.08403 0.812966H12.8543L6.86419 18.5609C6.80263 18.7433 6.68542 18.9018 6.52907 19.0141C6.37271 19.1263 6.18509 19.1867 5.99261 19.1868H1.50193C1.35609 19.1868 1.21234 19.1521 1.08258 19.0855C0.952814 19.019 0.840765 18.9225 0.755699 18.804C0.670633 18.6855 0.614995 18.5485 0.593389 18.4043C0.571782 18.2601 0.584829 18.1128 0.631448 17.9746L6.21222 1.43879C6.27376 1.25634 6.39099 1.09779 6.54739 0.985482C6.70379 0.873171 6.89148 0.812976 7.08403 0.812966Z" fill="url(#paint0_linear_644_3772)"/>
+<path id="Vector_2" d="M15.469 12.7173H6.31874C6.23367 12.7173 6.15054 12.7428 6.08019 12.7906C6.00984 12.8384 5.95552 12.9063 5.92431 12.9855C5.8931 13.0646 5.88644 13.1513 5.90521 13.2343C5.92398 13.3173 5.96731 13.3927 6.02954 13.4506L11.9093 18.9386C12.0805 19.0983 12.3059 19.187 12.54 19.187H17.7212L15.469 12.7173Z" fill="#0078D4"/>
+<path id="Vector_3" d="M7.08432 0.813056C6.88967 0.812309 6.69988 0.873821 6.54267 0.988606C6.38547 1.10339 6.26908 1.26543 6.21052 1.45107L0.638609 17.9596C0.588854 18.0983 0.573233 18.2469 0.593069 18.3929C0.612904 18.5389 0.667613 18.678 0.752567 18.7984C0.83752 18.9188 0.950219 19.0169 1.08113 19.0845C1.21204 19.1522 1.35731 19.1873 1.50466 19.1869H6.11124C6.28281 19.1562 6.44316 19.0806 6.57593 18.9676C6.7087 18.8547 6.80911 18.7086 6.86692 18.5442L7.97807 15.2695L11.9471 18.9715C12.1134 19.109 12.3221 19.1851 12.5379 19.1869H17.6998L15.4359 12.7172L8.83614 12.7188L12.8754 0.813056H7.08432Z" fill="url(#paint1_linear_644_3772)"/>
+<path id="Vector_4" d="M14.4539 1.43799C14.3925 1.25583 14.2754 1.09755 14.1193 0.985434C13.9631 0.87332 13.7757 0.813027 13.5835 0.813049H7.15259C7.34482 0.81306 7.53221 0.873366 7.68837 0.985475C7.84453 1.09758 7.96159 1.25585 8.02307 1.43799L13.6041 17.9744C13.6507 18.1126 13.6638 18.26 13.6422 18.4042C13.6206 18.5485 13.565 18.6856 13.4799 18.8041C13.3949 18.9226 13.2828 19.0191 13.153 19.0857C13.0232 19.1523 12.8795 19.1871 12.7336 19.1871H19.1647C19.3105 19.187 19.4543 19.1523 19.584 19.0856C19.7138 19.019 19.8258 18.9225 19.9109 18.804C19.9959 18.6855 20.0515 18.5484 20.0731 18.4042C20.0947 18.2599 20.0816 18.1126 20.0349 17.9744L14.4539 1.43799Z" fill="url(#paint2_linear_644_3772)"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_644_3772" x1="9.1871" y1="2.17453" x2="3.19457" y2="19.878" gradientUnits="userSpaceOnUse">
+<stop stop-color="#114A8B"/>
+<stop offset="1" stop-color="#0669BC"/>
+</linearGradient>
+<linearGradient id="paint1_linear_644_3772" x1="11.0593" y1="10.4249" x2="9.67315" y2="10.8936" gradientUnits="userSpaceOnUse">
+<stop stop-opacity="0.3"/>
+<stop offset="0.071" stop-opacity="0.2"/>
+<stop offset="0.321" stop-opacity="0.1"/>
+<stop offset="0.623" stop-opacity="0.05"/>
+<stop offset="1" stop-opacity="0"/>
+</linearGradient>
+<linearGradient id="paint2_linear_644_3772" x1="10.2966" y1="1.65827" x2="16.8746" y2="19.1833" gradientUnits="userSpaceOnUse">
+<stop stop-color="#3CCBF4"/>
+<stop offset="1" stop-color="#2892DF"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/billing/buildings.svg b/app/components/base/icons/assets/public/billing/buildings.svg
new file mode 100644
index 0000000..34e784d
--- /dev/null
+++ b/app/components/base/icons/assets/public/billing/buildings.svg
@@ -0,0 +1,5 @@
+<svg width="29" height="28" viewBox="0 0 29 28" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="buildings">
+<path id="Vector" d="M5.04134 22.4583H17.2913M5.04134 22.4583V6.70833C5.04134 5.41967 6.08601 4.375 7.37467 4.375H14.958C16.2467 4.375 17.2913 5.41967 17.2913 6.70833V9.33333M5.04134 22.4583H2.70801M17.2913 22.4583V9.33333M17.2913 22.4583H24.2913M17.2913 9.33333H21.958C23.2467 9.33333 24.2913 10.378 24.2913 11.6667V22.4583M24.2913 22.4583H26.6247M12.6247 10.2083H9.70801M9.70801 14.875H12.6247" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/billing/diamond.svg b/app/components/base/icons/assets/public/billing/diamond.svg
new file mode 100644
index 0000000..f3692f8
--- /dev/null
+++ b/app/components/base/icons/assets/public/billing/diamond.svg
@@ -0,0 +1,5 @@
+<svg width="29" height="28" viewBox="0 0 29 28" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="diamond">
+<path id="Vector" d="M10.2499 9.04167L7.62486 11.6667L10.2499 14.2917M15.9831 22.8501L25.4978 13.3353C26.4164 12.4168 26.408 10.925 25.4791 10.017L20.3883 5.03988C19.9523 4.61365 19.3668 4.375 18.7571 4.375H9.90929C9.29958 4.375 8.71408 4.61365 8.27811 5.03988L3.18727 10.017C2.25844 10.925 2.25002 12.4168 3.16852 13.3353L12.6833 22.8501C13.5945 23.7613 15.0719 23.7613 15.9831 22.8501Z" stroke="#DC6803" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/billing/google-cloud.svg b/app/components/base/icons/assets/public/billing/google-cloud.svg
new file mode 100644
index 0000000..61e30a3
--- /dev/null
+++ b/app/components/base/icons/assets/public/billing/google-cloud.svg
@@ -0,0 +1,8 @@
+<svg width="22" height="18" viewBox="0 0 22 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Group 4">
+<path id="Vector" d="M14.1587 5.40399H14.7992L16.6247 3.57855L16.7143 2.80353C15.6686 1.88054 14.4049 1.23936 13.0424 0.94058C11.68 0.641797 10.2639 0.695269 8.92788 1.09594C7.59187 1.49662 6.38006 2.23127 5.40691 3.2305C4.43376 4.22973 3.73142 5.46055 3.36621 6.80669C3.56957 6.72334 3.79485 6.70982 4.00672 6.76826L7.6576 6.16619C7.6576 6.16619 7.84334 5.85874 7.93942 5.87796C8.72169 5.01883 9.80276 4.4912 10.9613 4.40309C12.1199 4.31497 13.2683 4.67304 14.1715 5.40399H14.1587Z" fill="#EA4335"/>
+<path id="Vector_2" d="M19.225 6.80663C18.8055 5.2615 17.944 3.87244 16.7463 2.80988L14.1843 5.3719C14.7182 5.80819 15.1461 6.36003 15.4357 6.9858C15.7253 7.61158 15.869 8.29494 15.856 8.98435V9.43911C16.1554 9.43911 16.4519 9.49809 16.7286 9.61268C17.0052 9.72727 17.2566 9.89523 17.4683 10.107C17.6801 10.3187 17.848 10.5701 17.9626 10.8467C18.0772 11.1234 18.1362 11.4199 18.1362 11.7193C18.1362 12.0187 18.0772 12.3153 17.9626 12.5919C17.848 12.8685 17.6801 13.1199 17.4683 13.3316C17.2566 13.5434 17.0052 13.7113 16.7286 13.8259C16.4519 13.9405 16.1554 13.9995 15.856 13.9995H11.2956L10.8408 14.4607V17.1956L11.2956 17.6504H15.856C17.1295 17.6603 18.3723 17.2601 19.4007 16.5089C20.429 15.7577 21.1883 14.6954 21.5662 13.4792C21.944 12.2631 21.9204 10.9576 21.4988 9.75589C21.0771 8.55419 20.2799 7.52012 19.225 6.80663Z" fill="#4285F4"/>
+<path id="Vector_3" d="M6.72886 17.625H11.2893V13.9741H6.72886C6.40396 13.9741 6.08286 13.9042 5.78732 13.7692L5.14681 13.9677L3.30856 15.7932L3.14844 16.4337C4.17929 17.2121 5.43714 17.6306 6.72886 17.625Z" fill="#34A853"/>
+<path id="Vector_4" d="M6.7289 5.78196C5.49325 5.78934 4.29076 6.18247 3.28939 6.90643C2.28801 7.6304 1.53775 8.64904 1.1434 9.8201C0.749049 10.9912 0.730302 12.2561 1.08978 13.4384C1.44925 14.6206 2.16899 15.661 3.14848 16.4143L5.79377 13.7691C5.4576 13.6172 5.16331 13.386 4.93613 13.0954C4.70895 12.8048 4.55567 12.4634 4.48944 12.1005C4.42321 11.7376 4.446 11.3641 4.55587 11.0119C4.66574 10.6598 4.8594 10.3396 5.12024 10.0788C5.38107 9.81792 5.7013 9.62426 6.05343 9.51439C6.40557 9.40452 6.7791 9.38172 7.14198 9.44795C7.50487 9.51418 7.84626 9.66747 8.13688 9.89465C8.4275 10.1218 8.65867 10.4161 8.81055 10.7523L11.4558 8.10699C10.9006 7.38115 10.185 6.79357 9.36499 6.39023C8.54496 5.98688 7.64275 5.7787 6.7289 5.78196Z" fill="#FBBC05"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/billing/group-2.svg b/app/components/base/icons/assets/public/billing/group-2.svg
new file mode 100644
index 0000000..22970f8
--- /dev/null
+++ b/app/components/base/icons/assets/public/billing/group-2.svg
@@ -0,0 +1,3 @@
+<svg width="29" height="28" viewBox="0 0 29 28" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M17.4942 15.3771C21.1508 13.8584 25.694 15.7846 27.1017 21.1559C27.4448 22.465 26.348 23.625 24.9948 23.625H19.6233M13.2066 8.16667C13.2066 10.2608 11.509 11.9583 9.41493 11.9583C7.32086 11.9583 5.62326 10.2608 5.62326 8.16667C5.62326 6.07258 7.32086 4.375 9.41493 4.375C11.509 4.375 13.2066 6.07258 13.2066 8.16667ZM23.7066 8.16667C23.7066 10.2608 22.009 11.9583 19.9149 11.9583C17.8209 11.9583 16.1232 10.2608 16.1232 8.16667C16.1232 6.07258 17.8209 4.375 19.9149 4.375C22.009 4.375 23.7066 6.07258 23.7066 8.16667ZM14.328 23.625H4.3352C2.98193 23.625 1.88599 22.4589 2.22976 21.15C4.42721 12.7833 14.2359 12.7833 16.4335 21.15C16.7772 22.4589 15.6813 23.625 14.328 23.625Z" stroke="#444CE7" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/billing/keyframe.svg b/app/components/base/icons/assets/public/billing/keyframe.svg
new file mode 100644
index 0000000..2690394
--- /dev/null
+++ b/app/components/base/icons/assets/public/billing/keyframe.svg
@@ -0,0 +1,3 @@
+<svg width="29" height="28" viewBox="0 0 29 28" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M15.9831 3.98321C15.072 3.072 13.5945 3.072 12.6833 3.98321L4.31648 12.35C3.40526 13.2612 3.40524 14.7386 4.31647 15.6499L12.6833 24.0167C13.5945 24.9279 15.072 24.9279 15.9831 24.0167L24.35 15.6499C25.2612 14.7386 25.2612 13.2612 24.35 12.35L15.9831 3.98321Z" stroke="#155AEF" stroke-width="1.5" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/billing/sparkles-soft.svg b/app/components/base/icons/assets/public/billing/sparkles-soft.svg
new file mode 100644
index 0000000..7a24c14
--- /dev/null
+++ b/app/components/base/icons/assets/public/billing/sparkles-soft.svg
@@ -0,0 +1,4 @@
+<svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.5" d="M9.75878 1.67256C9.74813 1.57435 9.6684 1.5001 9.5735 1.5C9.47861 1.4999 9.39874 1.57397 9.38789 1.67217C9.33725 2.12931 9.20693 2.44292 9.00273 2.65564C8.79849 2.86835 8.49744 3.00411 8.05857 3.05683C7.9643 3.06816 7.89321 3.15136 7.89331 3.2502C7.89341 3.34905 7.96469 3.43208 8.05896 3.44321C8.49038 3.49411 8.79835 3.62984 9.00773 3.84402C9.216 4.05703 9.34877 4.3702 9.38736 4.82276C9.39595 4.92317 9.47673 5.00011 9.5735 5C9.67027 4.99988 9.75096 4.92276 9.75926 4.82232C9.79627 4.37742 9.92894 4.05719 10.1386 3.83882C10.3482 3.62045 10.6556 3.48223 11.0827 3.44372C11.1792 3.43503 11.2532 3.35103 11.2533 3.25022C11.2534 3.14942 11.1795 3.06524 11.0832 3.05632C10.6487 3.01612 10.3481 2.87779 10.1436 2.66085C9.93797 2.44273 9.80765 2.12197 9.75878 1.67256Z" fill="#FCFCFD"/>
+<path d="M6.45025 2.94373C6.42279 2.69117 6.21783 2.50026 5.9738 2.5C5.72982 2.49974 5.52443 2.69021 5.49649 2.94271C5.36631 4.11822 5.0312 4.92465 4.50609 5.47164C3.98098 6.0186 3.20681 6.3677 2.07832 6.5033C1.83592 6.5324 1.65307 6.74635 1.65332 7.0005C1.65357 7.2547 1.83684 7.4682 2.0793 7.4968C3.1887 7.6277 3.9805 7.97675 4.51896 8.5275C5.05449 9.07525 5.39598 9.8805 5.49519 11.0442C5.51722 11.3024 5.72502 11.5003 5.97385 11.5C6.22273 11.4997 6.43009 11.3014 6.45154 11.0431C6.54658 9.89905 6.88782 9.07565 7.42686 8.5141C7.96595 7.9526 8.75641 7.59715 9.8547 7.49815C10.1026 7.4758 10.293 7.2598 10.2933 7.00055C10.2936 6.74135 10.1037 6.5249 9.8558 6.50195C8.7386 6.3986 7.96556 6.0429 7.43972 5.48504C6.911 4.92415 6.57591 4.09936 6.45025 2.94373Z" fill="#FCFCFD"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/billing/sparkles.svg b/app/components/base/icons/assets/public/billing/sparkles.svg
new file mode 100644
index 0000000..fced090
--- /dev/null
+++ b/app/components/base/icons/assets/public/billing/sparkles.svg
@@ -0,0 +1,14 @@
+<svg width="600" height="600" viewBox="0 0 600 600" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g clip-path="url(#clip0_1_382)">
+<rect width="600" height="600" fill="url(#pattern999)"/>
+</g>
+<defs>
+<pattern id="pattern999" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_1_382" transform="scale(0.000976562)"/>
+</pattern>
+<clipPath id="clip0_1_382">
+<rect width="600" height="600" fill="white"/>
+</clipPath>
+<image id="image0_1_382" width="1024" height="1024" xlink:href="data:image/png;base64,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fAkQAMjX8WZvEUAAAQQQQGAaBfav3Va5+vLVF91w5YXXrzm15sZZI+3L0janXjw2vhMAt5ACBGmVfFs/rOzbPLX272rbdefa7XvWPdz30v+uuOFDI/YaJQIIIIBA/gQIAOTvmLPHCCCAAAIIIJABAQsGXLFq2TWXllf+9qr5yy9pFhCY6uaqwv/KWwd276zu2/rq4aPbt+/Zv5PW/qnqsRwCCCAw8wUIAMz8Y8weIoAAAggggEALCCggsOzs7s7fWL5w5col3ef2zJ69oFQsLzx/UVdn59GFC8NdGFzQ3//y4YHBWr3a/+bQ0NF9vzy+98jAO2/2vXzodVr5QynGEUAAAQRCAQIAoQbjCCCAAAIIIIAAAggggAACCMxQgeB5MzN0D9ktBBBAAAEEEEAAAQQQQAABBBAoEADgS4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCOgv+e0AAABaSURBVCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCPwfNaPiwKKqjBIAAAAASUVORK5CYII="/>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/common/d.svg b/app/components/base/icons/assets/public/common/d.svg
new file mode 100644
index 0000000..fdcd607
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/d.svg
@@ -0,0 +1,16 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2 1H7.94339C11.8094 1 14.9434 4.13401 14.9434 8C14.9434 11.866 11.8094 15 7.9434 15H2V1Z" fill="white"/>
+<path d="M2 1H7.94339C11.8094 1 14.9434 4.13401 14.9434 8C14.9434 11.866 11.8094 15 7.9434 15H2V1Z" fill="url(#paint0_angular_19344_240446)"/>
+<path d="M7.94336 8H8.20751V15H7.94336V8Z" fill="url(#paint1_linear_19344_240446)"/>
+<defs>
+<radialGradient id="paint0_angular_19344_240446" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(7.9434 8) rotate(90) scale(8.75 8.75)">
+<stop stop-color="#001FC2"/>
+<stop offset="0.711334" stop-color="#0667F8" stop-opacity="0.2"/>
+<stop offset="1" stop-color="#155EEF" stop-opacity="0"/>
+</radialGradient>
+<linearGradient id="paint1_linear_19344_240446" x1="8.06244" y1="8.43754" x2="7.93744" y2="9.20317" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/common/diagonal-dividing-line.svg b/app/components/base/icons/assets/public/common/diagonal-dividing-line.svg
new file mode 100644
index 0000000..608e53e
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/diagonal-dividing-line.svg
@@ -0,0 +1,3 @@
+<svg width="7" height="20" viewBox="0 0 7 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path id="Line 3" d="M1 19.3544L5.94174 0.645657" stroke="#EAECF0" stroke-linecap="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/common/dify.svg b/app/components/base/icons/assets/public/common/dify.svg
new file mode 100644
index 0000000..7cbccc4
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/dify.svg
@@ -0,0 +1,8 @@
+<svg width="50" height="26" viewBox="0 0 50 26" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Dify">
+<path d="M6.61784 2.064C8.37784 2.064 9.92184 2.408 11.2498 3.096C12.5938 3.784 13.6258 4.768 14.3458 6.048C15.0818 7.312 15.4498 8.784 15.4498 10.464C15.4498 12.144 15.0818 13.616 14.3458 14.88C13.6258 16.128 12.5938 17.096 11.2498 17.784C9.92184 18.472 8.37784 18.816 6.61784 18.816H0.761841V2.064H6.61784ZM6.49784 15.96C8.25784 15.96 9.61784 15.48 10.5778 14.52C11.5378 13.56 12.0178 12.208 12.0178 10.464C12.0178 8.72 11.5378 7.36 10.5778 6.384C9.61784 5.392 8.25784 4.896 6.49784 4.896H4.12184V15.96H6.49784Z" fill="#1D2939"/>
+<path d="M20.869 3.936C20.277 3.936 19.781 3.752 19.381 3.384C18.997 3 18.805 2.528 18.805 1.968C18.805 1.408 18.997 0.944 19.381 0.576C19.781 0.192 20.277 0 20.869 0C21.461 0 21.949 0.192 22.333 0.576C22.733 0.944 22.933 1.408 22.933 1.968C22.933 2.528 22.733 3 22.333 3.384C21.949 3.752 21.461 3.936 20.869 3.936ZM22.525 5.52V18.816H19.165V5.52H22.525Z" fill="#1D2939"/>
+<path d="M33.1407 8.28H30.8127V18.816H27.4047V8.28H25.8927V5.52H27.4047V4.848C27.4047 3.216 27.8687 2.016 28.7967 1.248C29.7247 0.48 31.1247 0.12 32.9967 0.168001V3C32.1807 2.984 31.6127 3.12 31.2927 3.408C30.9727 3.696 30.8127 4.216 30.8127 4.968V5.52H33.1407V8.28Z" fill="#1D2939"/>
+<path d="M49.2381 5.52L41.0061 25.104H37.4301L40.3101 18.48L34.9821 5.52H38.7501L42.1821 14.808L45.6621 5.52H49.2381Z" fill="#1D2939"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/common/gdpr.svg b/app/components/base/icons/assets/public/common/gdpr.svg
new file mode 100644
index 0000000..163a983
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/gdpr.svg
@@ -0,0 +1,53 @@
+<svg width="23" height="28" viewBox="0 0 23 28" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Group">
+<g id="Group_2">
+<path id="Vector" d="M11.0371 28L10.7001 27.8596C8.90271 27.1013 0 23.001 0 16.8786V4.32497L11.0371 0L22.0742 4.32497V16.8786C22.0742 23.001 13.1434 27.1013 11.3741 27.8596L11.0371 28ZM1.71314 5.47643V16.8786C1.71314 18.9569 3.11735 21.0632 5.86961 23.1414C7.89167 24.658 10.0822 25.7252 11.0652 26.1464C12.0481 25.6971 14.2387 24.658 16.2608 23.1414C19.013 21.0632 20.4173 18.9569 20.4173 16.8786V5.47643L11.0652 1.82548L1.71314 5.47643Z" fill="white"/>
+</g>
+<g id="Group_3">
+<g id="Group_4">
+<path id="Vector_2" d="M11.0371 0.898682V27.0732C12.666 26.3711 21.2317 22.4674 21.2317 16.8786C21.2317 10.672 21.2317 4.88664 21.2317 4.88664L11.0371 0.898682Z" fill="#1611D3"/>
+</g>
+<g id="Group_5">
+<path id="Vector_3" d="M11.0371 0.898682V27.0732C9.40823 26.3711 0.842529 22.4674 0.842529 16.8786C0.842529 10.672 0.842529 4.88664 0.842529 4.88664L11.0371 0.898682Z" fill="#0D00A0"/>
+</g>
+</g>
+<g id="Group_6">
+<path id="Vector_4" d="M7.1333 15.5306C7.04905 15.5867 6.93671 15.6429 6.82437 15.671C6.71204 15.7272 6.5997 15.7552 6.48736 15.7833C6.37503 15.8114 6.23461 15.8395 6.0661 15.8676C5.92568 15.8957 5.72909 15.8957 5.56058 15.8957C5.33591 15.8957 5.1674 15.8676 4.97081 15.8114C4.80231 15.7552 4.6338 15.671 4.52147 15.5867C4.40913 15.5025 4.26871 15.3621 4.18445 15.2216C4.07212 15.0812 4.01595 14.9408 3.9317 14.7723C3.84745 14.6038 3.81936 14.4353 3.79128 14.2668C3.76319 14.0983 3.73511 13.9017 3.73511 13.7332C3.73511 13.5366 3.76319 13.34 3.79128 13.1715C3.81936 12.9749 3.87553 12.8064 3.95978 12.6379C4.04403 12.4694 4.12829 12.329 4.24062 12.1885C4.35296 12.0481 4.4653 11.9358 4.60572 11.8235C4.74614 11.7111 4.91465 11.6549 5.08315 11.5988C5.25166 11.5426 5.44825 11.5145 5.64484 11.5145C5.75717 11.5145 5.84143 11.5145 5.92568 11.5145C6.00993 11.5145 6.09418 11.5426 6.15035 11.5426C6.2346 11.5426 6.29077 11.5707 6.34694 11.5988C6.40311 11.6269 6.48736 11.6549 6.54353 11.683C6.5997 11.7111 6.68395 11.7673 6.74012 11.8235C6.79629 11.8796 6.88054 11.9358 6.9648 11.992L6.57162 12.5256C6.48736 12.4413 6.40311 12.3571 6.31886 12.3009C6.23461 12.2447 6.15035 12.1885 6.09418 12.1605C6.00993 12.1324 5.92568 12.1043 5.84143 12.1043C5.75717 12.1043 5.67292 12.0762 5.56058 12.0762C5.39208 12.0762 5.22357 12.1043 5.08315 12.1885C4.94273 12.2728 4.83039 12.3851 4.74614 12.5256C4.66189 12.666 4.57764 12.8345 4.52147 13.003C4.4653 13.1715 4.43721 13.3962 4.43721 13.6208C4.43721 13.8455 4.4653 14.0702 4.49338 14.2668C4.52147 14.4634 4.60572 14.66 4.68997 14.8004C4.77422 14.9408 4.88656 15.0812 5.05507 15.1655C5.19549 15.2497 5.36399 15.3059 5.58867 15.3059C5.64484 15.3059 5.70101 15.3059 5.75717 15.3059C5.81334 15.3059 5.89759 15.3059 5.95376 15.2778C6.00993 15.2778 6.09418 15.2497 6.15035 15.2497C6.20652 15.2497 6.26269 15.2216 6.31886 15.2216V13.7894H7.04905V15.5306H7.1333Z" fill="white"/>
+<path id="Vector_5" d="M8.93074 11.5707C9.32391 11.5707 9.66093 11.6268 9.91368 11.7392C10.1945 11.8515 10.3911 11.9919 10.5877 12.1885C10.7562 12.3851 10.8685 12.5817 10.9528 12.8345C11.0371 13.0872 11.0651 13.34 11.0651 13.6208C11.0651 13.8174 11.0371 14.014 11.009 14.1825C10.9809 14.351 10.9247 14.5476 10.8685 14.7161C10.7843 14.8846 10.7 15.025 10.5877 15.1655C10.4754 15.3059 10.3349 15.4182 10.1664 15.5025C9.99794 15.5867 9.82943 15.671 9.60476 15.7271C9.38008 15.7833 9.15541 15.8114 8.87457 15.8114H7.83545V11.5988H8.93074V11.5707ZM8.62181 12.1324V15.2497H8.84648C9.04307 15.2497 9.23966 15.2216 9.43625 15.1374C9.60476 15.0812 9.77326 14.9689 9.8856 14.8285C10.026 14.688 10.1103 14.5195 10.1945 14.3229C10.2788 14.1263 10.3069 13.8736 10.3069 13.5927C10.3069 13.3962 10.2788 13.2276 10.2226 13.0311C10.1664 12.8626 10.0822 12.694 9.96985 12.5536C9.85752 12.4132 9.7171 12.3009 9.54859 12.2166C9.38008 12.1324 9.15541 12.0762 8.90265 12.0762H8.62181V12.1324Z" fill="white"/>
+<path id="Vector_6" d="M12.5537 14.1825V15.8114H11.8235V11.5988H13.0311C13.312 11.5988 13.5366 11.6268 13.7332 11.683C13.9298 11.7392 14.0983 11.8234 14.2106 11.9358C14.3511 12.0481 14.4353 12.1885 14.4915 12.3289C14.5477 12.4694 14.5757 12.6379 14.5757 12.8345C14.5757 12.8906 14.5757 12.9749 14.5477 13.0872C14.5196 13.1715 14.4915 13.2838 14.4634 13.3681C14.4072 13.4804 14.3511 13.5647 14.2668 13.6489C14.1826 13.7332 14.0983 13.8174 13.9579 13.9017C13.8175 13.9859 13.677 14.0421 13.5085 14.0983C13.34 14.1544 13.1434 14.1544 12.8907 14.1544H12.5537V14.1825ZM12.5537 13.6208H12.9188C13.0592 13.6208 13.1715 13.5927 13.2839 13.5647C13.3962 13.5366 13.4805 13.4804 13.5647 13.4242C13.649 13.3681 13.7051 13.2838 13.7613 13.1715C13.8175 13.0872 13.8175 12.9749 13.8175 12.8345C13.8175 12.7221 13.7894 12.6379 13.7613 12.5536C13.7332 12.4694 13.677 12.3851 13.6209 12.3289C13.5647 12.2728 13.4524 12.2166 13.34 12.1604C13.2277 12.1324 13.0873 12.1043 12.9188 12.1043H12.5537V13.6208Z" fill="white"/>
+<path id="Vector_7" d="M15.9519 15.8114H15.2217V11.5988H16.4293C16.7101 11.5988 16.9348 11.6268 17.1314 11.683C17.328 11.7392 17.4965 11.8234 17.6088 11.9077C17.7493 12.02 17.8335 12.1324 17.8897 12.2728C17.9459 12.4132 17.9739 12.5817 17.9739 12.7502C17.9739 12.8625 17.9459 13.003 17.9178 13.1153C17.8897 13.2276 17.8335 13.3681 17.7493 13.4804C17.665 13.5927 17.5808 13.7051 17.4403 13.7893C17.2999 13.8736 17.1595 13.9578 16.9629 14.014L18.2548 15.8114H17.4123L16.2889 14.0983C16.2327 14.0983 16.2046 14.0983 16.1485 14.0983C16.0923 14.0983 16.0361 14.0983 15.9519 14.0702V15.8114ZM15.9519 13.5085C16.008 13.5085 16.0642 13.5085 16.1204 13.5085C16.1765 13.5085 16.2327 13.5085 16.2889 13.5085C16.4293 13.5085 16.5697 13.4804 16.6821 13.4523C16.7944 13.4242 16.9067 13.3681 16.991 13.3119C17.0752 13.2557 17.1314 13.1715 17.1876 13.0872C17.2437 13.003 17.2437 12.8906 17.2437 12.7783C17.2437 12.666 17.2157 12.5536 17.1876 12.4694C17.1595 12.3851 17.1033 12.3289 17.0472 12.2728C16.991 12.2166 16.8787 12.1885 16.7663 12.1604C16.654 12.1324 16.4855 12.1324 16.317 12.1324H15.98V13.5085H15.9519Z" fill="white"/>
+</g>
+<g id="Group_7">
+<g id="Group_8">
+<path id="Vector_8" d="M11.0372 4.63391L11.3461 5.56069H12.301L11.5427 6.12238L11.8236 7.02107L11.0372 6.45939L10.2789 7.02107L10.5598 6.12238L9.80151 5.56069H10.7564L11.0372 4.63391Z" fill="#F7BC37"/>
+</g>
+<g id="Group_9">
+<path id="Vector_9" d="M14.3231 5.53259L14.632 6.43129H15.5869L14.8005 6.99297L15.1095 7.91975L14.3231 7.35807L13.5648 7.91975L13.8457 6.99297L13.0593 6.43129H14.0423L14.3231 5.53259Z" fill="#F7BC37"/>
+</g>
+<g id="Group_10">
+<path id="Vector_10" d="M17.0472 7.9198L17.3281 8.81849H18.2829L17.5247 9.38018L17.8055 10.307L17.0472 9.74528L16.2609 10.307L16.5698 9.38018L15.7834 8.81849H16.7383L17.0472 7.9198Z" fill="#F7BC37"/>
+</g>
+<g id="Group_11">
+<path id="Vector_11" d="M11.0372 19.7714L11.3461 20.6981H12.301L11.5427 21.2598L11.8236 22.1585L11.0372 21.5968L10.2789 22.1585L10.5598 21.2598L9.80151 20.6981H10.7564L11.0372 19.7714Z" fill="#F7BC37"/>
+</g>
+<g id="Group_12">
+<path id="Vector_12" d="M14.3231 18.985L14.632 19.8837H15.5869L14.8005 20.4454L15.1095 21.3721L14.3231 20.8105L13.5648 21.3721L13.8457 20.4454L13.0593 19.8837H14.0423L14.3231 18.985Z" fill="#F7BC37"/>
+</g>
+<g id="Group_13">
+<path id="Vector_13" d="M17.0472 17.019L17.3281 17.9458H18.2829L17.5247 18.5075L17.8055 19.4062L17.0472 18.8445L16.2609 19.4062L16.5698 18.5075L15.7834 17.9458H16.7383L17.0472 17.019Z" fill="#F7BC37"/>
+</g>
+<g id="Group_14">
+<path id="Vector_14" d="M7.77942 5.53259L7.47049 6.43129H6.51562L7.30199 6.99297L6.99306 7.91975L7.77942 7.35807L8.53769 7.91975L8.25685 6.99297L9.01512 6.43129H8.06026L7.77942 5.53259Z" fill="#F7BC37"/>
+</g>
+<g id="Group_15">
+<path id="Vector_15" d="M5.05529 7.9198L4.77444 8.81849H3.81958L4.57785 9.38018L4.29701 10.307L5.05529 9.74528L5.84165 10.307L5.53272 9.38018L6.31908 8.81849H5.36421L5.05529 7.9198Z" fill="#F7BC37"/>
+</g>
+<g id="Group_16">
+<path id="Vector_16" d="M7.77942 18.985L7.47049 19.8837H6.51562L7.30199 20.4454L6.99306 21.3721L7.77942 20.8105L8.53769 21.3721L8.25685 20.4454L9.01512 19.8837H8.06026L7.77942 18.985Z" fill="#F7BC37"/>
+</g>
+<g id="Group_17">
+<path id="Vector_17" d="M5.05529 17.019L4.77444 17.9458H3.81958L4.57785 18.5075L4.29701 19.4062L5.05529 18.8445L5.84165 19.4062L5.53272 18.5075L6.31908 17.9458H5.36421L5.05529 17.019Z" fill="#F7BC37"/>
+</g>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/common/github.svg b/app/components/base/icons/assets/public/common/github.svg
new file mode 100644
index 0000000..df07bfb
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/github.svg
@@ -0,0 +1,5 @@
+<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="github">
+<path id="Vector" d="M9 1.125C4.64906 1.125 1.125 4.64906 1.125 9C1.125 12.4847 3.37922 15.428 6.50953 16.4714C6.90328 16.5403 7.05094 16.3041 7.05094 16.0973C7.05094 15.9103 7.04109 15.2902 7.04109 14.6306C5.0625 14.9948 4.55062 14.1483 4.39312 13.7053C4.30453 13.4789 3.92063 12.78 3.58594 12.593C3.31031 12.4453 2.91656 12.0811 3.57609 12.0712C4.19625 12.0614 4.63922 12.6422 4.78688 12.8784C5.49563 14.0695 6.62766 13.7348 7.08047 13.5281C7.14938 13.0163 7.35609 12.6717 7.5825 12.4748C5.83031 12.278 3.99938 11.5987 3.99938 8.58656C3.99938 7.73016 4.30453 7.02141 4.80656 6.47016C4.72781 6.27328 4.45219 5.46609 4.88531 4.38328C4.88531 4.38328 5.54484 4.17656 7.05094 5.19047C7.68094 5.01328 8.35031 4.92469 9.01969 4.92469C9.68906 4.92469 10.3584 5.01328 10.9884 5.19047C12.4945 4.16672 13.1541 4.38328 13.1541 4.38328C13.5872 5.46609 13.3116 6.27328 13.2328 6.47016C13.7348 7.02141 14.04 7.72031 14.04 8.58656C14.04 11.6086 12.1992 12.278 10.447 12.4748C10.7325 12.7209 10.9786 13.1934 10.9786 13.9317C10.9786 14.985 10.9688 15.8316 10.9688 16.0973C10.9688 16.3041 11.1164 16.5502 11.5102 16.4714C13.0735 15.9436 14.432 14.9389 15.3943 13.5986C16.3567 12.2583 16.8746 10.65 16.875 9C16.875 4.64906 13.3509 1.125 9 1.125Z" fill="#24292F"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/common/highlight.svg b/app/components/base/icons/assets/public/common/highlight.svg
new file mode 100644
index 0000000..f4b8090
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/highlight.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="46" height="24" viewBox="0 0 46 24" fill="none">
+  <path opacity="0.5" d="M-6.5 8C-6.5 3.58172 -2.91828 0 1.5 0H45.5L33.0248 24H1.49999C-2.91829 24 -6.5 20.4183 -6.5 16V8Z" fill="url(#paint0_linear_6333_42118)"/>
+  <defs>
+    <linearGradient id="paint0_linear_6333_42118" x1="1.81679" y1="5.47784e-07" x2="101.257" y2="30.3866" gradientUnits="userSpaceOnUse">
+      <stop stop-color="white" stop-opacity="0.12"/>
+      <stop offset="1" stop-color="white" stop-opacity="0.3"/>
+    </linearGradient>
+  </defs>
+</svg>
\ No newline at end of file
diff --git a/app/components/base/icons/assets/public/common/iso.svg b/app/components/base/icons/assets/public/common/iso.svg
new file mode 100644
index 0000000..c48c357
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/iso.svg
@@ -0,0 +1 @@
+<svg fill="none" height="64" viewBox="0 0 64 64" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m8 9.82143c0-2.6628 2.2386-4.82143 5-4.82143h38c2.7614 0 5 2.15863 5 4.82143v44.35717c0 2.6628-2.2386 4.8214-5 4.8214h-38c-2.7614 0-5-2.1586-5-4.8214z" fill="#2a3e92"/><g fill="#fff"><path d="m43.4424 46.9899v-1.84h3.08v7.31h-2.05v-5.47z"/><path d="m36.5801 48.7c0-1.1467.2333-2.05.7-2.71.4666-.66 1.2-.99 2.2-.99s1.7333.33 2.2.99c.4733.66.71 1.5633.71 2.71 0 1.16-.2334 2.07-.7 2.73-.4667.66-1.2034.99-2.21.99-1.0067 0-1.7434-.33-2.21-.99-.46-.66-.69-1.57-.69-2.73zm3.87 0c0-.6-.0634-1.0567-.19-1.37-.1267-.32-.3867-.48-.78-.48-.3934 0-.6534.16-.78.48-.1267.3133-.19.77-.19 1.37 0 .6133.06 1.08.18 1.4.1266.3133.39.47.79.47s.66-.1567.78-.47c.1266-.32.19-.7867.19-1.4z"/><path d="m29.5078 48.7c0-1.1467.2333-2.05.7-2.71s1.2-.99 2.2-.99 1.7333.33 2.2.99c.4733.66.71 1.5633.71 2.71 0 1.16-.2333 2.07-.7 2.73s-1.2033.99-2.21.99-1.7433-.33-2.21-.99c-.46-.66-.69-1.57-.69-2.73zm3.87 0c0-.6-.0633-1.0567-.19-1.37-.1267-.32-.3867-.48-.78-.48s-.6533.16-.78.48c-.1267.3133-.19.77-.19 1.37 0 .6133.06 1.08.18 1.4.1267.3133.39.47.79.47s.66-.1567.78-.47c.1267-.32.19-.7867.19-1.4z"/><path d="m28.4533 46.6099-2.4 5.85h-2.01l2.42-5.62h-2.85v-1.68h4.84z"/><path d="m17.52 50.89c.6467-.5067 1.1767-.9433 1.59-1.31s.76-.7433 1.04-1.13c.28-.3933.42-.7667.42-1.12 0-.2133-.05-.38-.15-.5-.0933-.12-.2333-.18-.42-.18-.1933 0-.3433.0833-.45.25-.1067.16-.1567.3967-.15.71h-1.9c.02-.5933.15-1.0833.39-1.47.24-.3933.5533-.68.94-.86.3867-.1867.8167-.28 1.29-.28.82 0 1.43.2033 1.83.61s.6.9333.6 1.58c0 .6933-.2333 1.3433-.7 1.95-.46.6067-1.0367 1.15-1.73 1.63h2.5v1.59h-5.1z"/><path clip-rule="evenodd" d="m32.5672 11.0281c1.0059.0357 2.2045.2319 3.2746.5387 3.289.9417 6.1071 2.9857 8.1332 5.8894.1106.1605.2033.3103.2033.3317 0 .0286-.1605.0393-.5136.0393h-.5137l-.1641-.2319c-.453-.6278-1.3377-1.6123-1.9191-2.1296l-.2497-.2212-.61.1534c-1.0916.2676-2.2937.4852-3.4923.6314-.2711.0357-.4923.0749-.4923.0856 0 .0143.05.1855.1106.3782.1391.4601.3532 1.2306.3532 1.2877 0 .0357-.1106.0464-.4459.0464h-.4424l-.0606-.2069c-.0144-.0559-.0371-.1365-.0606-.22-.0229-.0816-.0466-.1661-.0643-.233-.1141-.3924-.2889-.9239-.3174-.956-.0143-.0179-.2497-.0143-.5208.0071-.2676.0214-1.0274.0571-1.6838.082-1.2592.0428-3.0321.0036-4.2164-.0963-.3032-.0249-.5636-.0357-.5778-.0214-.0286.0286-.2854.8312-.4067 1.2842l-.0963.3603h-.4388c-.4031 0-.4423-.0071-.4423-.0642 0-.0785.2033-.8347.3567-1.3234.0607-.1855.0963-.3496.0785-.3639-.0143-.0107-.1926-.0428-.3995-.0642-.9739-.1106-2.3865-.371-3.4673-.635l-.6671-.1641-.1891.1606c-.5743.4922-1.4982 1.5053-1.9726 2.1581l-.214.2961h-.5244c-.2925 0-.528-.0107-.528-.0214 0-.0464.5708-.8383.8918-1.245 1.3698-1.7158 3.0464-3.0642 5.0298-4.0451 1.5124-.7492 2.9893-1.1879 4.7265-1.4126.4387-.0571 1.6016-.1178 1.8727-.0999.0678.0035.3675.0178.66.0249zm-1.2702.8884c-.824.2818-1.6088 1.1736-2.3293 2.6468-.1641.3318-.3068.635-.3175.6671-.0179.0499.0107.0642.1641.0821.8846.0963 3.2033.1462 4.4661.0927 1.516-.0642 1.6587-.0749 1.6587-.1427 0-.0892-.5351-1.1629-.7634-1.5267-.4637-.7491-.9239-1.27-1.3947-1.5803-.4959-.321-.9988-.4031-1.484-.239zm-1.9937.139c-1.912.4031-3.4745 1.0487-5.1082 2.1189-.3996.2604-.528.371-.4281.371.0123 0 .1824.0368.3973.0833l.1093.0237c.8632.1962 2.6646.4922 3.2925.5422l.1355.0107.1498-.3567c.4352-1.0167 1.113-2.1261 1.6623-2.704.1213-.1284.1213-.1319.0393-.1284-.05.0036-.1605.0179-.2497.0393zm5.6573 1.2843c-.2069-.3318-.6135-.8918-.8597-1.1772l-.0035-.004c-.0584-.0664-.0945-.1073-.0853-.126.0148-.0301.1474-.0021.4938.0711l.0088.0018c1.673.3532 3.3567 1.0666 4.8764 2.069.2782.1819.5065.346.5065.3639 0 .0891-2.6576.5564-3.7812.667l-.2319.0214-.1248-.3103c-.1641-.4174-.5458-1.1665-.7991-1.5767z" fill-rule="evenodd"/><path d="m30.8906 19.1863c.5565.0678.8704.082 2.365.0927l1.7194.0143v3.849h-3.0642l-.0214-.8383-.214-.0856c-.6136-.2426-1.4376-.3746-2.3544-.3781-.9025 0-1.3091.0784-1.6979.3388-.3996.2605-.4566.792-.1249 1.1201.346.3496.7705.4602 2.6611.6956 1.6338.2069 2.2652.3389 3.0571.6493.3817.1498.8633.4316 1.1629.6849.4423.3674.8062.9738.9738 1.6159.1249.478.1606 1.3983.0714 1.887-.1534.8348-.4673 1.434-1.0416 1.9798-.6207.5922-1.4198.981-2.522 1.2271-1.2164.2747-2.9394.3175-4.6659.1213-.5922-.0642-.9346-.0785-2.3579-.0892l-1.6694-.0142v-3.8133h3.0677v.7847l.1391.0714c.4531.2283 1.3841.3959 2.3651.4173 1.6908.0428 2.4506-.2568 2.4542-.9702 0-.2783-.0785-.4281-.3139-.5922-.3425-.2426-.824-.3531-2.3615-.5493-1.8478-.239-2.579-.4067-3.3817-.7848-1.2806-.6064-1.912-1.5303-2.0404-2.9857-.0713-.7706.0535-1.4911.3567-2.1189.6814-1.4091 2.2402-2.2188 4.6552-2.4186.4851-.0392 2.1617.0143 2.7824.0892z"/><path clip-rule="evenodd" d="m48.2307 20.9806c-.981-.9774-2.2474-1.5767-3.8383-1.8157-.3924-.0607-1.8371-.1035-2.1938-.0678-1.0631.1106-1.9228.3353-2.7182.7099-1.9049.9025-3.0892 2.579-3.3817 4.7907-.0607.4673-.0714 1.5945-.0179 2.0404.1356 1.1166.4745 2.0726 1.0238 2.9073.4531.6849 1.2913 1.4375 2.0797 1.8656 1.1665.635 2.7967.9524 4.3983.8597 3.0571-.1819 5.2295-1.6873 6.0678-4.2057.2461-.742.3496-1.4483.3496-2.39.0035-1.9655-.5743-3.4994-1.7693-4.6944zm-7.7841 3.6847c.214-1.5268.906-2.3722 2.0939-2.5541.2961-.0464.9132-.0179 1.2093.0499.5279.1284 1.0023.4566 1.2949.9025.4209.635.5957 1.4019.5957 2.6112-.0036 1.4732-.2533 2.3258-.874 2.9429-.4459.4495-.8561.6136-1.6088.6492-1.4447.0678-2.3187-.6635-2.6575-2.2259-.1071-.4994-.1356-1.78-.0535-2.3757z" fill-rule="evenodd"/><path d="m22.2402 22.5002h-2.069v6.4209h2.069v3.1748l-8.2224-.0178-.0107-1.5803-.0071-1.5767h2.069v-6.4209l-1.0238-.0071-1.0274-.0107-.0107-1.5803-.0071-1.5767h8.2402z"/><path clip-rule="evenodd" d="m22.5684 35.9913c-.5601-.4852-1.5518-1.5874-2.0048-2.2295l-.1177-.1677h-.5315c-.4174 0-.528.0107-.5066.0428.4495.767 1.4769 2.0012 2.2973 2.7646 2.3865 2.2188 5.1367 3.503 8.4007 3.9239.6278.0785 2.547.0892 3.2105.0178 4.0202-.4459 7.6551-2.472 10.1165-5.6432.2747-.3532.7455-1.031.7455-1.0773 0-.0143-.2318-.0286-.5136-.0286h-.5101l-.3104.4067c-.1676.2247-.4816.6064-.6956.8525-.371.4174-1.1415 1.1843-1.3127 1.2985-.0713.0464-.132.0392-.6421-.0928-.9845-.2497-2.283-.4958-3.3282-.6278-.2461-.0285-.4958-.0642-.56-.0749l-.1142-.0178.0892-.2569c.0963-.2782.4067-1.3912.4067-1.4518 0-.025-.1499-.0357-.4495-.0285l-.4495.0107-.1177.428c-.0642.2355-.1712.5957-.239.8026l-.1213.3746h-.2318c-.1249 0-.5886-.025-1.0309-.0535-1.4091-.0928-4.4126-.0607-5.5648.0571l-.1998.0214-.1498-.4745-.0158-.053c-.0769-.2586-.1768-.5945-.2268-.7746l-.0963-.346h-.4388c-.3995 0-.4423.0072-.4423.0642 0 .0785.2105.8419.3567 1.3021.0607.1962.107.3567.0999.3602-.0071.0036-.2997.0428-.6528.0857-1.1415.1391-2.2473.3424-3.3639.6171l-.5814.1427zm7.698.0141c-.9631.0535-1.623.0927-1.6337.1034-.0286.0286.4209.9525.6563 1.3591.5066.8704 1.006 1.4554 1.5196 1.7907.3354.2176.5387.289.8704.3175.3246.025.5601-.0285.9239-.214.4103-.2105 1.0024-.8062 1.4055-1.4162.2675-.4031.931-1.6694.931-1.7764 0-.0571-.0749-.0678-.7669-.1142-.585-.0392-3.4352-.0749-3.9061-.0499zm-3.7032.3211c.3603-.0499.7027-.0963.7598-.1035.0606-.0107.1676-.0142.2425-.0107l.1356.0036.1712.3924c.4424 1.0166.9881 1.9156 1.566 2.5755.107.1249.1748.2247.1534.2247s-.264-.0463-.5386-.107c-1.327-.2782-2.654-.7812-3.874-1.4625-.4709-.2604-1.409-.8633-1.4732-.9418-.0286-.0356.0998-.0749.5778-.1783.7527-.1605 1.4233-.2747 2.2795-.3924zm9.2354.0962c-.132.3353-.5743 1.2129-.8062 1.5946-.2497.4137-.5529.8347-.8169 1.1379-.1105.1284-.1926.2354-.1855.2461.0393.0393 1.2521-.2532 1.9014-.4601 1.1664-.371 2.6361-1.0987 3.6991-1.83l.3139-.2176-.189-.0428c-.956-.2212-2.1011-.4281-3.0107-.5458-.3139-.0392-.6279-.0785-.6956-.0892-.0483-.0055-.0779-.0089-.101.0018-.0367.017-.057.0694-.1095.2051z" fill-rule="evenodd"/></g></svg>
\ No newline at end of file
diff --git a/app/components/base/icons/assets/public/common/line-3.svg b/app/components/base/icons/assets/public/common/line-3.svg
new file mode 100644
index 0000000..f4fdb70
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/line-3.svg
@@ -0,0 +1,3 @@
+<svg width="5" height="12" viewBox="0 0 5 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path id="Line 3" d="M1 11.3545L3.94174 0.645781" stroke="#D0D5DD" stroke-linecap="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/common/lock.svg b/app/components/base/icons/assets/public/common/lock.svg
new file mode 100644
index 0000000..a698784
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/lock.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="lock">
+<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M8 1.75C6.27411 1.75 4.875 3.14911 4.875 4.875V6.125C3.83947 6.125 3 6.96444 3 8V12.375C3 13.4106 3.83947 14.25 4.875 14.25H11.125C12.1606 14.25 13 13.4106 13 12.375V8C13 6.96444 12.1606 6.125 11.125 6.125V4.875C11.125 3.14911 9.72587 1.75 8 1.75ZM9.875 6.125V4.875C9.875 3.83947 9.03556 3 8 3C6.96444 3 6.125 3.83947 6.125 4.875V6.125H9.875ZM8 8.625C8.34519 8.625 8.625 8.90481 8.625 9.25V11.125C8.625 11.4702 8.34519 11.75 8 11.75C7.65481 11.75 7.375 11.4702 7.375 11.125V9.25C7.375 8.90481 7.65481 8.625 8 8.625Z" fill="#155AEF"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/common/message-chat-square.svg b/app/components/base/icons/assets/public/common/message-chat-square.svg
new file mode 100644
index 0000000..cf7f642
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/message-chat-square.svg
@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.77438 6.6665H12.5591C12.9105 6.66649 13.2137 6.66648 13.4634 6.68688C13.727 6.70842 13.9891 6.75596 14.2414 6.88449C14.6177 7.07624 14.9237 7.3822 15.1154 7.75852C15.244 8.01078 15.2915 8.27292 15.313 8.53649C15.3334 8.7862 15.3334 9.08938 15.3334 9.44082V11.2974C15.3334 11.5898 15.3334 11.8421 15.3192 12.0509C15.3042 12.2708 15.2712 12.4908 15.1812 12.7081C14.9782 13.1981 14.5888 13.5875 14.0988 13.7905C13.8815 13.8805 13.6616 13.9135 13.4417 13.9285C13.4068 13.9308 13.3707 13.9328 13.3334 13.9345V14.6665C13.3334 14.9147 13.1955 15.1424 12.9756 15.2573C12.7556 15.3723 12.49 15.3556 12.2862 15.2139L10.8353 14.2051C10.6118 14.0498 10.5666 14.0214 10.5238 14.0021C10.4746 13.9798 10.4228 13.9635 10.3696 13.9537C10.3235 13.9452 10.2702 13.9427 9.99803 13.9427H8.7744C8.42296 13.9427 8.11978 13.9427 7.87006 13.9223C7.6065 13.9008 7.34435 13.8532 7.0921 13.7247C6.71578 13.533 6.40981 13.227 6.21807 12.8507C6.08954 12.5984 6.04199 12.3363 6.02046 12.0727C6.00006 11.823 6.00007 11.5198 6.00008 11.1684V9.44081C6.00007 9.08938 6.00006 8.7862 6.02046 8.53649C6.04199 8.27292 6.08954 8.01078 6.21807 7.75852C6.40981 7.3822 6.71578 7.07624 7.0921 6.88449C7.34435 6.75596 7.6065 6.70842 7.87006 6.68688C8.11978 6.66648 8.42295 6.66649 8.77438 6.6665Z" fill="#444CE7"/>
+<path d="M9.4943 0.666504H4.5059C3.96926 0.666496 3.52635 0.666489 3.16555 0.695967C2.79082 0.726584 2.44635 0.792293 2.12279 0.957154C1.62103 1.21282 1.21308 1.62076 0.957417 2.12253C0.792557 2.44609 0.726847 2.79056 0.69623 3.16529C0.666752 3.52608 0.666759 3.96899 0.666768 4.50564L0.666758 7.6804C0.666669 7.97482 0.666603 8.19298 0.694924 8.38632C0.86568 9.55207 1.78121 10.4676 2.94695 10.6383C2.99461 10.6453 3.02432 10.6632 3.03714 10.6739L3.03714 11.7257C3.03711 11.9075 3.03708 12.0858 3.04976 12.2291C3.06103 12.3565 3.09053 12.6202 3.27795 12.8388C3.48686 13.0825 3.80005 13.2111 4.11993 13.1845C4.40689 13.1607 4.61323 12.9938 4.71072 12.9111C4.73849 12.8875 4.76726 12.8618 4.7968 12.8344C4.73509 12.594 4.70707 12.3709 4.69157 12.1813C4.66659 11.8756 4.66668 11.5224 4.66676 11.1966V9.41261C4.66668 9.08685 4.66659 8.73364 4.69157 8.42793C4.71984 8.08191 4.78981 7.62476 5.03008 7.15322C5.34965 6.52601 5.85959 6.01608 6.4868 5.6965C6.95834 5.45624 7.41549 5.38627 7.7615 5.358C8.06722 5.33302 8.42041 5.3331 8.74617 5.33318H12.5873C12.8311 5.33312 13.0903 5.33306 13.3334 5.3435V4.50562C13.3334 3.96898 13.3334 3.52608 13.304 3.16529C13.2734 2.79056 13.2076 2.44609 13.0428 2.12253C12.7871 1.62076 12.3792 1.21282 11.8774 0.957154C11.5539 0.792293 11.2094 0.726584 10.8347 0.695967C10.4739 0.666489 10.0309 0.666496 9.4943 0.666504Z" fill="#444CE7"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/common/multi-path-retrieval.svg b/app/components/base/icons/assets/public/common/multi-path-retrieval.svg
new file mode 100644
index 0000000..cdfaa2e
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/multi-path-retrieval.svg
@@ -0,0 +1,19 @@
+<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_13429_43710)">
+<rect width="36" height="36" rx="8" fill="#FFF6ED"/>
+<path opacity="0.7" d="M22.25 28C22.25 29.7949 20.7949 31.25 19 31.25C17.2051 31.25 15.75 29.7949 15.75 28C15.75 26.2051 17.2051 24.75 19 24.75C20.7949 24.75 22.25 26.2051 22.25 28Z" stroke="#FB6514" stroke-width="1.5"/>
+<path d="M19 12C21.2091 12 23 10.2091 23 8C23 5.79086 21.2091 4 19 4C16.7909 4 15 5.79086 15 8C15 10.2091 16.7909 12 19 12Z" fill="#FB6514"/>
+<path d="M15 22C17.2091 22 19 20.2091 19 18C19 15.7909 17.2091 14 15 14C12.7909 14 11 15.7909 11 18C11 20.2091 12.7909 22 15 22Z" fill="#FB6514"/>
+<path d="M36 23C38.7614 23 41 20.7614 41 18C41 15.2386 38.7614 13 36 13C33.2386 13 31 15.2386 31 18C31 20.7614 33.2386 23 36 23Z" fill="#FB6514"/>
+<path d="M0 18H10" stroke="#FB6514" stroke-width="1.5"/>
+<path d="M20 18L30 18" stroke="#FB6514" stroke-width="1.5"/>
+<path d="M0.00112438 15C0.00112438 15 -5.64364 15 0.851673 15C7.34699 15 7.84654 8 14 8" stroke="#FB6514" stroke-width="1.5"/>
+<path d="M23.75 9.28125C26.5688 10.1847 27.699 13.2045 30.625 15.0312" stroke="#FB6514" stroke-width="1.5"/>
+<path opacity="0.7" d="M-0.000543833 21C-0.000543833 21 -5.57819 21 0.893635 21C7.36546 21 7.8688 28 14 28" stroke="#FB6514" stroke-width="1.5"/>
+</g>
+<defs>
+<clipPath id="clip0_13429_43710">
+<rect width="36" height="36" rx="8" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/common/n-to-1-retrieval.svg b/app/components/base/icons/assets/public/common/n-to-1-retrieval.svg
new file mode 100644
index 0000000..8862829
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/n-to-1-retrieval.svg
@@ -0,0 +1,18 @@
+<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_13429_43700)">
+<rect width="36" height="36" rx="8" fill="#EEF4FF"/>
+<path opacity="0.7" d="M23.25 28C23.25 29.7949 21.7949 31.25 20 31.25C18.2051 31.25 16.75 29.7949 16.75 28C16.75 26.2051 18.2051 24.75 20 24.75C21.7949 24.75 23.25 26.2051 23.25 28Z" stroke="#444CE7" stroke-width="1.5"/>
+<path opacity="0.7" d="M23.25 8C23.25 9.79493 21.7949 11.25 20 11.25C18.2051 11.25 16.75 9.79493 16.75 8C16.75 6.20507 18.2051 4.75 20 4.75C21.7949 4.75 23.25 6.20507 23.25 8Z" stroke="#444CE7" stroke-width="1.5"/>
+<path d="M16 22C18.2091 22 20 20.2091 20 18C20 15.7909 18.2091 14 16 14C13.7909 14 12 15.7909 12 18C12 20.2091 13.7909 22 16 22Z" fill="#444CE7"/>
+<path d="M36 23C38.7614 23 41 20.7614 41 18C41 15.2386 38.7614 13 36 13C33.2386 13 31 15.2386 31 18C31 20.7614 33.2386 23 36 23Z" fill="#444CE7"/>
+<path d="M0 18L11 18" stroke="#444CE7" stroke-width="1.5"/>
+<path d="M21 18L30 18" stroke="#444CE7" stroke-width="1.5"/>
+<path opacity="0.7" d="M-0.00160408 15C-0.00160408 15 -6.00089 15 1.12411 15C8.24911 15 8.24908 8.25 14.9991 8.25" stroke="#444CE7" stroke-width="1.5"/>
+<path opacity="0.7" d="M0.000488281 21C0.000488281 21 -5.92692 21 1.17228 21C8.27148 21 8.27423 27.75 14.9998 27.75" stroke="#444CE7" stroke-width="1.5"/>
+</g>
+<defs>
+<clipPath id="clip0_13429_43700">
+<rect width="36" height="36" rx="8" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/common/notion.svg b/app/components/base/icons/assets/public/common/notion.svg
new file mode 100644
index 0000000..eeda894
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/notion.svg
@@ -0,0 +1,12 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_5364_42310)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3.5725 18.2611L1.4229 15.5832C0.905706 14.9389 0.625 14.1466 0.625 13.3312V3.63437C0.625 2.4129 1.60224 1.39936 2.86295 1.31328L12.8326 0.632614C13.5569 0.583164 14.2768 0.775682 14.8717 1.17794L18.3745 3.5462C19.0015 3.97012 19.375 4.66312 19.375 5.40266V16.427C19.375 17.6223 18.4141 18.6121 17.1798 18.688L6.11458 19.3692C5.12958 19.4298 4.17749 19.0148 3.5725 18.2611Z" fill="white"/>
+<path d="M7.03006 8.48663V8.35968C7.03006 8.03787 7.28779 7.77098 7.61997 7.7488L10.0396 7.58726L13.3857 12.5146V8.19003L12.5244 8.07522V8.01492C12.5244 7.68933 12.788 7.42068 13.1244 7.40344L15.326 7.29066V7.60749C15.326 7.75622 15.2154 7.88343 15.0638 7.90907L14.534 7.99868V15.0022L13.8691 15.2309C13.3136 15.4219 12.6952 15.2174 12.3772 14.7376L9.12879 9.83568V14.5143L10.1287 14.7056L10.1147 14.7984C10.0711 15.0889 9.82028 15.3086 9.51687 15.3221L7.03006 15.4328C6.99718 15.1204 7.23132 14.8409 7.55431 14.807L7.88143 14.7726V8.53447L7.03006 8.48663Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.9218 1.85418L2.95217 2.53485C2.35499 2.57562 1.89209 3.05572 1.89209 3.63431V13.3311C1.89209 13.8748 2.07923 14.4029 2.42402 14.8325L4.57362 17.5104C4.92117 17.9433 5.46812 18.1817 6.03397 18.1469L17.0991 17.4658C17.6663 17.4309 18.1078 16.9761 18.1078 16.4269V5.4026C18.1078 5.06281 17.9362 4.74441 17.6481 4.54963L14.1453 2.18137C13.7883 1.94002 13.3564 1.82451 12.9218 1.85418ZM3.44654 3.78556C3.30788 3.6829 3.37387 3.46903 3.54806 3.45654L12.9889 2.77938C13.2897 2.75781 13.5886 2.84064 13.8318 3.01299L15.7261 4.35502C15.798 4.40597 15.7642 4.51596 15.6752 4.5208L5.67742 5.06454C5.37485 5.081 5.0762 4.99211 4.83563 4.814L3.44654 3.78556ZM5.20848 6.76913C5.20848 6.44433 5.47088 6.17604 5.80642 6.15777L16.3769 5.5821C16.7039 5.56429 16.9792 5.81577 16.9792 6.13232V15.6782C16.9792 16.0024 16.7177 16.2705 16.3829 16.2895L5.8793 16.8871C5.51537 16.9079 5.20848 16.6282 5.20848 16.2759V6.76913Z" fill="black"/>
+</g>
+<defs>
+<clipPath id="clip0_5364_42310">
+<rect width="20" height="20" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/common/soc2.svg b/app/components/base/icons/assets/public/common/soc2.svg
new file mode 100644
index 0000000..226d99c
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/soc2.svg
@@ -0,0 +1,103 @@
+<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Group 7">
+<path id="Vector" d="M14 28C21.732 28 28 21.732 28 14C28 6.26801 21.732 0 14 0C6.26801 0 0 6.26801 0 14C0 21.732 6.26801 28 14 28Z" fill="url(#paint0_linear_6186_11887)"/>
+<path id="Vector_2" d="M13.9999 24.8636C19.9997 24.8636 24.8636 19.9997 24.8636 13.9999C24.8636 8.00006 19.9997 3.13623 13.9999 3.13623C8.00006 3.13623 3.13623 8.00006 3.13623 13.9999C3.13623 19.9997 8.00006 24.8636 13.9999 24.8636Z" fill="url(#paint1_linear_6186_11887)"/>
+<g id="Group">
+<path id="Vector_3" d="M5.43048 23.2492C5.46819 23.2107 5.48424 23.1666 5.47862 23.1177C5.473 23.0687 5.44412 22.9997 5.39197 22.909C5.33901 22.8192 5.30772 22.7462 5.29809 22.69C5.28365 22.6106 5.30291 22.5432 5.35586 22.4878C5.40721 22.4341 5.4714 22.4124 5.54762 22.4212C5.62384 22.43 5.69605 22.4678 5.76425 22.5344C5.81079 22.5793 5.84368 22.6282 5.86294 22.6812C5.8822 22.7341 5.88621 22.7871 5.87578 22.8384C5.86535 22.8898 5.84048 22.9355 5.80277 22.9748L5.74339 22.9171C5.78993 22.8689 5.80999 22.8152 5.80597 22.755C5.80116 22.6948 5.77147 22.6379 5.71692 22.5841C5.66316 22.5327 5.6094 22.5031 5.55484 22.4966C5.50028 22.4902 5.45455 22.5055 5.41684 22.544C5.38234 22.5793 5.3687 22.6226 5.37512 22.6724C5.38154 22.7221 5.40802 22.7863 5.45455 22.8641C5.50028 22.9419 5.53077 23.0053 5.54521 23.0551C5.55966 23.1048 5.56287 23.1497 5.55404 23.1915C5.54522 23.2332 5.52435 23.2709 5.49066 23.3054C5.4377 23.3608 5.37271 23.3832 5.29649 23.3736C5.22027 23.364 5.14645 23.3247 5.07424 23.2557C5.0253 23.2083 4.98839 23.1554 4.96432 23.0984C4.94025 23.0414 4.93303 22.9861 4.94186 22.9339C4.95148 22.8818 4.97555 22.8352 5.01487 22.7943L5.07424 22.8513C5.0269 22.9002 5.00765 22.9572 5.01647 23.0214C5.0261 23.0856 5.0606 23.1465 5.12158 23.2059C5.17614 23.2581 5.2315 23.2885 5.28686 23.2966C5.34303 23.3046 5.39036 23.2885 5.42888 23.2492H5.43048Z" fill="white"/>
+<path id="Vector_4" d="M6.31617 23.7556C6.2584 23.8238 6.19662 23.8744 6.12923 23.9065C6.06183 23.9386 5.99524 23.9498 5.92784 23.941C5.86044 23.9321 5.79786 23.9033 5.74009 23.8551C5.65344 23.7821 5.60931 23.6922 5.60771 23.5855C5.6061 23.4788 5.65023 23.3721 5.73849 23.267L5.80268 23.19C5.85964 23.1226 5.92223 23.072 5.98962 23.0399C6.05702 23.0078 6.12522 22.9958 6.19261 23.0046C6.26001 23.0135 6.32259 23.0415 6.37956 23.0897C6.43652 23.1378 6.47584 23.194 6.4967 23.2582C6.51756 23.3224 6.51836 23.3898 6.49991 23.4604C6.48145 23.531 6.44455 23.6 6.38999 23.6666L6.31537 23.7556H6.31617ZM6.32099 23.6224C6.39641 23.5326 6.43492 23.4459 6.43652 23.3609C6.43893 23.2758 6.40443 23.2044 6.33382 23.145C6.26482 23.0873 6.1886 23.0664 6.10436 23.0825C6.02091 23.0993 5.94068 23.1531 5.86365 23.2437L5.79866 23.3216C5.72485 23.4098 5.68634 23.4965 5.68393 23.5823C5.68152 23.6682 5.71522 23.7404 5.78583 23.7998C5.85724 23.8591 5.93426 23.8808 6.0161 23.8631C6.09874 23.8455 6.17817 23.7917 6.25439 23.7003L6.32018 23.6216L6.32099 23.6224Z" fill="white"/>
+<path id="Vector_5" d="M6.97267 24.3966C6.90367 24.4728 6.82825 24.5153 6.74641 24.5226C6.66457 24.5306 6.58113 24.5041 6.49769 24.4439C6.43912 24.4022 6.3982 24.3501 6.37413 24.2883C6.35006 24.2265 6.34524 24.1599 6.35969 24.0893C6.37413 24.0187 6.40542 23.9481 6.45516 23.8791L6.52898 23.7772C6.57953 23.7074 6.63649 23.6536 6.69988 23.6175C6.76326 23.5814 6.82905 23.5646 6.89565 23.5686C6.96304 23.5726 7.02643 23.5959 7.0866 23.6392C7.17085 23.7002 7.2214 23.7708 7.23744 23.8518C7.25349 23.9328 7.23664 24.0155 7.1869 24.1021L7.1195 24.054C7.19973 23.908 7.17486 23.7892 7.04649 23.6961C6.97508 23.6448 6.89886 23.6304 6.81782 23.6536C6.73678 23.6769 6.66217 23.7347 6.59477 23.8293L6.52497 23.9256C6.45918 24.0163 6.42788 24.1037 6.43029 24.188C6.4327 24.2722 6.4688 24.3388 6.53941 24.3902C6.60921 24.4407 6.6734 24.4616 6.73277 24.4536C6.79215 24.4455 6.84991 24.411 6.90608 24.3509L6.97347 24.399L6.97267 24.3966Z" fill="white"/>
+<path id="Vector_6" d="M7.31909 24.9735L7.65768 24.4119L7.55578 24.3501L7.58948 24.2939L7.69138 24.3557L7.73631 24.2811C7.77482 24.2177 7.81975 24.1792 7.87271 24.1648C7.92566 24.1503 7.98022 24.1607 8.03799 24.1952C8.06366 24.2105 8.08613 24.2289 8.10458 24.249L8.06527 24.3028C8.04922 24.2867 8.02996 24.2723 8.0075 24.2586C7.96979 24.2362 7.93368 24.2297 7.89838 24.241C7.86308 24.2522 7.83259 24.2787 7.80691 24.322L7.76038 24.399L7.90801 24.4881L7.87431 24.5443L7.72668 24.4552L7.38809 25.0168L7.31989 24.9751L7.31909 24.9735Z" fill="white"/>
+<path id="Vector_7" d="M7.82238 24.8435C7.85528 24.7825 7.8962 24.7336 7.94675 24.6975C7.99649 24.6614 8.05105 24.6413 8.10882 24.6373C8.16659 24.6333 8.22275 24.6461 8.27811 24.6758C8.36236 24.7216 8.41531 24.7874 8.43617 24.8756C8.45703 24.9631 8.44099 25.0561 8.38803 25.154L8.38001 25.1685C8.34711 25.2302 8.30539 25.2792 8.25565 25.3153C8.2059 25.3514 8.15214 25.3715 8.09438 25.3755C8.03661 25.3787 7.98044 25.3658 7.92589 25.3361C7.84164 25.2912 7.78949 25.2246 7.76863 25.1372C7.74777 25.0497 7.76381 24.9566 7.81597 24.8588L7.82319 24.8443L7.82238 24.8435ZM7.88256 24.9013C7.84164 24.9775 7.828 25.0505 7.84084 25.1203C7.85367 25.1901 7.89219 25.2423 7.95637 25.2768C8.01976 25.3105 8.08395 25.3137 8.14974 25.2864C8.21553 25.2591 8.26929 25.2054 8.31261 25.1251L8.31983 25.1115C8.34631 25.0634 8.36075 25.0136 8.36476 24.9639C8.36878 24.9141 8.35995 24.8692 8.33909 24.8291C8.31823 24.7898 8.28694 24.7585 8.24522 24.736C8.18263 24.7023 8.11845 24.6991 8.05265 24.7272C7.98686 24.7553 7.9323 24.809 7.88978 24.8884L7.88256 24.9013Z" fill="white"/>
+<path id="Vector_8" d="M8.97134 25.1115C8.9577 25.101 8.94166 25.0922 8.92481 25.0842C8.87988 25.0625 8.83575 25.0577 8.79242 25.0673C8.7491 25.0778 8.70978 25.1034 8.67368 25.1452L8.46106 25.5929L8.38965 25.5592L8.69855 24.9069L8.76915 24.9406L8.72101 25.0449C8.79563 24.9855 8.87506 24.9767 8.95931 25.016C8.97937 25.0256 8.99381 25.036 9.00344 25.0465L8.97054 25.1115H8.97134Z" fill="white"/>
+<path id="Vector_9" d="M9.77199 25.8825C9.79124 25.832 9.78883 25.7854 9.76476 25.7429C9.74069 25.7004 9.68614 25.6474 9.60269 25.5857C9.51925 25.5239 9.46148 25.4685 9.43019 25.4212C9.38526 25.3538 9.37643 25.284 9.40371 25.2126C9.43019 25.1436 9.47994 25.0978 9.55375 25.0762C9.62757 25.0545 9.7086 25.0609 9.79766 25.0946C9.85784 25.1179 9.90758 25.15 9.94609 25.1909C9.98461 25.2326 10.0095 25.2784 10.0199 25.3305C10.0303 25.3819 10.0255 25.4332 10.0063 25.4846L9.92924 25.4549C9.95251 25.3931 9.95091 25.3345 9.92283 25.2808C9.89474 25.227 9.845 25.1861 9.77359 25.1596C9.70459 25.1331 9.64281 25.1275 9.58986 25.1428C9.5369 25.158 9.5008 25.1909 9.48234 25.2407C9.46469 25.2872 9.4687 25.3313 9.49518 25.3746C9.52085 25.418 9.5706 25.4661 9.64361 25.5191C9.71663 25.572 9.76958 25.6186 9.80247 25.6587C9.83537 25.6988 9.85623 25.7389 9.86426 25.7806C9.87228 25.8224 9.86827 25.8649 9.85142 25.9106C9.82414 25.982 9.77359 26.0286 9.70058 26.0502C9.62676 26.0719 9.54332 26.0647 9.45025 26.0294C9.38606 26.0053 9.3315 25.9716 9.28737 25.9283C9.24244 25.8849 9.21436 25.8376 9.20233 25.7862C9.19029 25.7349 9.1943 25.6819 9.21436 25.629L9.29139 25.6579C9.26732 25.7221 9.27213 25.7814 9.30583 25.8368C9.33953 25.8922 9.39569 25.9347 9.47512 25.9652C9.54573 25.9916 9.60831 25.9981 9.66287 25.9828C9.71743 25.9676 9.75433 25.9347 9.77439 25.8833L9.77199 25.8825Z" fill="white"/>
+<path id="Vector_10" d="M10.2131 26.2917C10.1545 26.2733 10.1064 26.2428 10.0679 26.1995C10.0294 26.1561 10.0053 26.104 9.99485 26.0446C9.98442 25.9844 9.98924 25.9226 10.0093 25.8585L10.0181 25.8312C10.039 25.7646 10.0703 25.7092 10.112 25.6643C10.1537 25.6194 10.2027 25.5889 10.258 25.5728C10.3134 25.5568 10.3679 25.5568 10.4209 25.5728C10.5043 25.5985 10.5621 25.6482 10.5934 25.7205C10.6247 25.7927 10.6247 25.8785 10.5942 25.9772L10.5806 26.0197L10.0887 25.8673L10.0839 25.8817C10.0598 25.9596 10.0623 26.0318 10.0903 26.0976C10.1192 26.1633 10.1674 26.2067 10.2356 26.2283C10.2765 26.2412 10.315 26.2444 10.3503 26.2396C10.3856 26.2348 10.4217 26.2195 10.4578 26.1946L10.4939 26.246C10.4129 26.3094 10.319 26.3246 10.2123 26.2917H10.2131ZM10.4008 25.6378C10.3439 25.6202 10.2885 25.6258 10.2364 25.6563C10.1842 25.686 10.1425 25.7349 10.112 25.8031L10.5252 25.9315L10.5276 25.9234C10.5461 25.8569 10.5437 25.7967 10.5212 25.7437C10.4987 25.6908 10.4578 25.6555 10.4008 25.6378Z" fill="white"/>
+<path id="Vector_11" d="M11.1407 25.856C11.1254 25.8488 11.1078 25.8424 11.0893 25.8384C11.0412 25.8255 10.997 25.8287 10.9561 25.8472C10.916 25.8657 10.8823 25.8985 10.8542 25.9459L10.7299 26.4257L10.6528 26.4056L10.8334 25.7068L10.9088 25.726L10.8815 25.8376C10.9441 25.7654 11.0203 25.7413 11.1102 25.7646C11.1318 25.7702 11.1479 25.7774 11.1591 25.7862L11.139 25.856H11.1407Z" fill="white"/>
+<path id="Vector_12" d="M11.3831 26.4659L11.7233 25.9123L11.8036 25.9292L11.392 26.5807L11.3286 26.5678L11.2114 25.8064L11.2917 25.8232L11.3831 26.4667V26.4659Z" fill="white"/>
+<path id="Vector_13" d="M11.895 26.6737L11.8164 26.66L11.936 25.9484L12.0146 25.962L11.895 26.6737ZM11.9568 25.7406C11.9592 25.7261 11.9664 25.7141 11.9777 25.7053C11.9889 25.6964 12.0034 25.694 12.0194 25.6964C12.0362 25.6996 12.0483 25.7069 12.0563 25.7181C12.0643 25.7301 12.0675 25.743 12.0651 25.7582C12.0627 25.7727 12.0555 25.7847 12.0443 25.7927C12.033 25.8007 12.0186 25.804 12.0017 25.8007C11.9849 25.7983 11.9729 25.7911 11.9648 25.7791C11.9568 25.767 11.9544 25.7542 11.9568 25.7398V25.7406Z" fill="white"/>
+<path id="Vector_14" d="M12.4061 26.6929C12.4615 26.7002 12.5096 26.6905 12.5505 26.664C12.5915 26.6376 12.6171 26.5999 12.626 26.5509L12.7022 26.5605C12.6942 26.6039 12.6757 26.6424 12.646 26.6745C12.6163 26.7074 12.5794 26.7314 12.5353 26.7459C12.4912 26.7603 12.4454 26.7651 12.3973 26.7595C12.3034 26.7475 12.2328 26.7058 12.1863 26.6336C12.1398 26.5613 12.1229 26.4699 12.1373 26.36L12.1406 26.3359C12.1494 26.2653 12.1694 26.2043 12.2015 26.153C12.2328 26.1016 12.2737 26.0647 12.3235 26.0406C12.3732 26.0166 12.4294 26.0085 12.4912 26.0166C12.5698 26.0262 12.6316 26.0583 12.6765 26.1112C12.7214 26.1642 12.7407 26.2292 12.7351 26.3062L12.6589 26.2966C12.6621 26.2404 12.6476 26.1923 12.6155 26.153C12.5826 26.1136 12.5385 26.0912 12.4823 26.084C12.4109 26.0751 12.3524 26.0936 12.3058 26.1401C12.2601 26.1867 12.2312 26.2565 12.2192 26.3495L12.216 26.3728C12.2047 26.4643 12.216 26.5381 12.2481 26.5942C12.281 26.6504 12.3339 26.6833 12.4053 26.6921L12.4061 26.6929Z" fill="white"/>
+<path id="Vector_15" d="M13.1466 26.8301C13.0856 26.8261 13.0311 26.8068 12.9837 26.7739C12.9364 26.7402 12.9011 26.6961 12.877 26.6399C12.8529 26.5846 12.8433 26.5228 12.8481 26.4562L12.8497 26.4273C12.8545 26.3583 12.8722 26.2965 12.9027 26.2428C12.9332 26.189 12.9733 26.1481 13.0238 26.12C13.0744 26.0919 13.1265 26.0791 13.1827 26.0831C13.2702 26.0887 13.3376 26.1232 13.3849 26.1866C13.4322 26.25 13.4523 26.3326 13.4451 26.4361L13.4419 26.4811L12.9284 26.4458V26.461C12.9219 26.5429 12.9404 26.6119 12.9837 26.6696C13.027 26.7274 13.084 26.7587 13.1546 26.7635C13.1971 26.7667 13.2357 26.7611 13.2694 26.7483C13.3031 26.7354 13.3343 26.7122 13.3632 26.6801L13.4106 26.721C13.3464 26.802 13.2581 26.8381 13.1474 26.8309L13.1466 26.8301ZM13.1779 26.1505C13.1177 26.1465 13.0664 26.165 13.0222 26.2059C12.9781 26.2468 12.9492 26.3046 12.9356 26.3776L13.3672 26.4073V26.3984C13.3704 26.3294 13.3544 26.2717 13.3199 26.2251C13.2854 26.1794 13.2381 26.1537 13.1779 26.1497V26.1505Z" fill="white"/>
+<path id="Vector_16" d="M14.6863 26.3993C14.6887 26.4884 14.6751 26.5678 14.6454 26.636C14.6165 26.7042 14.5732 26.7571 14.517 26.7949C14.4608 26.8326 14.395 26.8526 14.3196 26.8542C14.2065 26.8566 14.1134 26.8189 14.042 26.7395C13.9706 26.6601 13.9329 26.5517 13.9297 26.4137L13.9273 26.3135C13.9249 26.2252 13.9385 26.1466 13.9682 26.0776C13.9979 26.0086 14.0412 25.9548 14.0974 25.9171C14.1535 25.8794 14.2193 25.8593 14.2939 25.8569C14.3686 25.8553 14.4352 25.8714 14.4929 25.9059C14.5507 25.9404 14.5964 25.9901 14.6293 26.0551C14.6622 26.1201 14.6799 26.1963 14.6839 26.283L14.6871 26.3993H14.6863ZM14.602 26.2958C14.5988 26.1787 14.5707 26.088 14.5162 26.023C14.4616 25.958 14.3886 25.9267 14.2963 25.9291C14.2065 25.9315 14.1351 25.966 14.0829 26.0342C14.0308 26.1024 14.0067 26.1955 14.0091 26.3143L14.0115 26.4154C14.0147 26.5301 14.0436 26.6207 14.0982 26.6873C14.1535 26.7531 14.2265 26.7852 14.318 26.7828C14.4111 26.7804 14.4825 26.7459 14.533 26.6777C14.5836 26.6095 14.6069 26.5164 14.6044 26.3985L14.602 26.2958Z" fill="white"/>
+<path id="Vector_17" d="M15.1989 26.1353C15.182 26.1337 15.1636 26.1337 15.1443 26.1353C15.0946 26.1393 15.0536 26.1562 15.0216 26.1866C14.9895 26.2171 14.9678 26.2597 14.9582 26.3134L14.9983 26.8077L14.9189 26.8141L14.8611 26.0952L14.9389 26.0888L14.9493 26.2027C14.9846 26.1144 15.0488 26.0663 15.1419 26.0591C15.1644 26.0575 15.182 26.0591 15.1949 26.0639L15.1989 26.1361V26.1353Z" fill="white"/>
+<path id="Vector_18" d="M15.3144 26.4129C15.3 26.3005 15.3136 26.2091 15.3545 26.1369C15.3955 26.0646 15.4588 26.0237 15.5439 26.0125C15.641 25.9997 15.7204 26.0293 15.7814 26.0999L15.7718 25.9964L15.8456 25.9868L15.9362 26.6881C15.9483 26.7803 15.9314 26.8565 15.8873 26.9167C15.8424 26.9769 15.7766 27.013 15.6883 27.0242C15.6386 27.0307 15.5896 27.0258 15.5415 27.009C15.4933 26.9921 15.454 26.9673 15.4235 26.9336L15.4621 26.8798C15.527 26.9416 15.5976 26.9673 15.6755 26.9568C15.7413 26.948 15.791 26.9223 15.8223 26.8782C15.8544 26.8341 15.8664 26.7779 15.8592 26.7081L15.8472 26.6183C15.8055 26.6953 15.7365 26.7402 15.6394 26.753C15.5567 26.7635 15.4853 26.7394 15.4268 26.68C15.3682 26.6207 15.3313 26.534 15.3168 26.4217L15.3152 26.4113L15.3144 26.4129ZM15.3963 26.4161C15.4083 26.5075 15.4356 26.5773 15.4789 26.6247C15.5222 26.6728 15.5776 26.6921 15.6442 26.684C15.7413 26.6712 15.8047 26.6191 15.8343 26.526L15.791 26.193C15.7661 26.1497 15.7357 26.1184 15.6971 26.0983C15.6594 26.0791 15.6161 26.0719 15.5672 26.0783C15.5006 26.0871 15.4524 26.12 15.4219 26.177C15.3914 26.2339 15.3834 26.3134 15.3963 26.4153V26.4161Z" fill="white"/>
+<path id="Vector_19" d="M16.6271 26.5773C16.615 26.5565 16.6038 26.5244 16.5934 26.4811C16.5725 26.522 16.5428 26.5565 16.5043 26.5838C16.4658 26.611 16.4225 26.6295 16.3743 26.6391C16.3061 26.652 16.2476 26.6439 16.1978 26.6142C16.1481 26.5846 16.1184 26.5404 16.1071 26.4827C16.0935 26.4137 16.112 26.3535 16.1617 26.3021C16.2115 26.2508 16.2877 26.2155 16.3904 26.1954L16.5324 26.1681L16.5171 26.0879C16.5075 26.0374 16.4842 26.0005 16.4473 25.9772C16.4104 25.9539 16.3623 25.9483 16.3021 25.9595C16.2476 25.97 16.205 25.9924 16.1745 26.0277C16.1441 26.0622 16.1328 26.1 16.14 26.1393L16.0614 26.1537C16.051 26.0975 16.067 26.0438 16.112 25.9924C16.1561 25.9411 16.2171 25.9082 16.2933 25.8938C16.3719 25.8785 16.4385 25.8865 16.4915 25.917C16.5444 25.9475 16.5789 25.9981 16.5934 26.0687L16.6576 26.404C16.6704 26.4722 16.688 26.5228 16.7089 26.5541L16.7105 26.5621L16.6271 26.5781V26.5773ZM16.3695 26.5685C16.4217 26.5581 16.4666 26.5364 16.5027 26.5035C16.5388 26.4706 16.5629 26.4305 16.5733 26.3848L16.5436 26.2291L16.4032 26.2564C16.3254 26.2725 16.2668 26.2981 16.2283 26.3342C16.1898 26.3703 16.1745 26.4129 16.1842 26.461C16.1922 26.5011 16.2131 26.5308 16.2476 26.5517C16.2821 26.5725 16.323 26.5781 16.3703 26.5685H16.3695Z" fill="white"/>
+<path id="Vector_20" d="M16.8277 25.7934L16.8606 25.9122C16.8759 25.8624 16.8999 25.8215 16.9336 25.7886C16.9673 25.7557 17.0074 25.7333 17.0548 25.7212C17.1294 25.702 17.1912 25.7092 17.2385 25.7421C17.2859 25.775 17.3204 25.8336 17.3428 25.9178L17.46 26.3767L17.3829 26.3968L17.265 25.9379C17.2489 25.8753 17.2233 25.8328 17.1896 25.8087C17.1559 25.7846 17.1101 25.7798 17.0532 25.7951C17.005 25.8071 16.9665 25.8328 16.9376 25.8721C16.9088 25.9114 16.8919 25.9587 16.8871 26.0141L17.0099 26.4931L16.9328 26.5131L16.7539 25.8143L16.8277 25.7951V25.7934Z" fill="white"/>
+<path id="Vector_21" d="M17.4094 25.4204C17.4054 25.406 17.4062 25.3923 17.4126 25.3795C17.4191 25.3667 17.4303 25.3578 17.4463 25.353C17.4624 25.3482 17.4768 25.349 17.4897 25.3562C17.5025 25.3634 17.5105 25.3739 17.5153 25.3883C17.5194 25.4028 17.5186 25.4164 17.5121 25.4284C17.5057 25.4413 17.4937 25.4501 17.4776 25.4549C17.4616 25.4597 17.4471 25.4589 17.4351 25.4517C17.4231 25.4445 17.4142 25.434 17.4102 25.4196L17.4094 25.4204ZM17.7689 26.2837L17.6927 26.307L17.4832 25.6162L17.5595 25.5929L17.7689 26.2837Z" fill="white"/>
+<path id="Vector_22" d="M18.0281 26.1313L18.471 25.9772L18.4935 26.0406L17.9575 26.2267L17.9382 26.1714L18.1565 25.4669L17.7561 25.6057L17.7336 25.5399L18.2295 25.3674L18.2495 25.4244L18.0297 26.1297L18.0281 26.1313Z" fill="white"/>
+<path id="Vector_23" d="M19.0799 25.8031C19.0639 25.7854 19.0462 25.7558 19.027 25.7156C19.0149 25.7598 18.9925 25.7999 18.9604 25.8344C18.9283 25.8689 18.889 25.8962 18.844 25.9146C18.7799 25.9411 18.7205 25.9443 18.6659 25.925C18.6114 25.9058 18.5728 25.8689 18.5504 25.8143C18.5239 25.7493 18.5295 25.6868 18.568 25.6266C18.6065 25.5664 18.6739 25.5167 18.7702 25.4765L18.9042 25.4212L18.8729 25.345C18.8529 25.2976 18.8232 25.2655 18.7823 25.2511C18.7413 25.2366 18.6932 25.2398 18.637 25.2631C18.5857 25.284 18.5488 25.3153 18.5255 25.3554C18.503 25.3955 18.499 25.434 18.5143 25.4709L18.4397 25.5006C18.418 25.4477 18.4236 25.3915 18.4565 25.3321C18.4902 25.2727 18.5424 25.2286 18.6146 25.1989C18.6892 25.1684 18.755 25.1628 18.8135 25.1821C18.8721 25.2013 18.9154 25.2447 18.9443 25.3105L19.0743 25.6258C19.1008 25.69 19.1281 25.7357 19.1545 25.7622L19.1578 25.7694L19.0791 25.8023L19.0799 25.8031ZM18.8264 25.8456C18.8761 25.8256 18.9146 25.7951 18.9435 25.755C18.9724 25.7148 18.9877 25.6715 18.9885 25.6242L18.9283 25.4773L18.7967 25.5319C18.7237 25.5632 18.6715 25.6001 18.641 25.6434C18.6106 25.6868 18.6041 25.7309 18.6234 25.7766C18.6386 25.8143 18.6659 25.8392 18.7036 25.8528C18.7413 25.8657 18.7831 25.8633 18.8272 25.8448L18.8264 25.8456Z" fill="white"/>
+<path id="Vector_24" d="M19.083 24.8058L19.1616 24.9727L19.2964 24.9093L19.3245 24.9687L19.1897 25.032L19.3943 25.4677C19.4112 25.5038 19.4304 25.5279 19.4521 25.5391C19.4737 25.5504 19.4994 25.5496 19.5299 25.5351C19.5419 25.5295 19.5604 25.5183 19.5853 25.5014L19.6157 25.5584C19.5997 25.5744 19.5756 25.5897 19.5435 25.6049C19.4938 25.6282 19.4513 25.6306 19.4152 25.6129C19.3791 25.5945 19.3478 25.5576 19.3213 25.5022L19.1167 25.0665L18.9963 25.1227L18.9683 25.0633L19.0886 25.0072L19.01 24.8403L19.0822 24.8066L19.083 24.8058Z" fill="white"/>
+<path id="Vector_25" d="M19.3438 24.6526C19.3374 24.639 19.3358 24.6254 19.3398 24.6117C19.3438 24.5981 19.3535 24.5876 19.3687 24.5796C19.384 24.5716 19.3984 24.5708 19.412 24.5756C19.4257 24.5804 19.4361 24.5893 19.4425 24.6029C19.449 24.6165 19.4506 24.6294 19.4465 24.643C19.4425 24.6566 19.4329 24.6671 19.4177 24.6751C19.4024 24.6831 19.388 24.6839 19.3751 24.6799C19.3623 24.6759 19.3519 24.6663 19.3446 24.6526H19.3438ZM19.8493 25.4389L19.7779 25.475L19.4506 24.8316L19.522 24.7955L19.8493 25.4389Z" fill="white"/>
+<path id="Vector_26" d="M19.8461 25.0264C19.8115 24.9663 19.7931 24.9053 19.7891 24.8435C19.7851 24.7817 19.7971 24.7256 19.8244 24.6742C19.8517 24.6229 19.8926 24.5819 19.9471 24.5515C20.0306 24.5041 20.1148 24.4953 20.1999 24.525C20.2849 24.5547 20.3547 24.6172 20.4093 24.7143L20.4173 24.7288C20.4518 24.7897 20.4711 24.8507 20.4751 24.9125C20.4791 24.9743 20.4671 25.0304 20.4398 25.081C20.4125 25.1315 20.3708 25.1717 20.3162 25.2029C20.2328 25.2503 20.1485 25.2591 20.0635 25.2294C19.9784 25.2005 19.9086 25.1372 19.8533 25.0401L19.8452 25.0264H19.8461ZM19.9271 25.0064C19.9696 25.0818 20.0242 25.1323 20.09 25.158C20.1558 25.1837 20.2207 25.1797 20.2841 25.1436C20.3467 25.1083 20.3844 25.0553 20.3957 24.9855C20.4069 24.9157 20.3908 24.8411 20.3459 24.7617L20.3387 24.748C20.3114 24.6999 20.2777 24.6614 20.2376 24.6317C20.1975 24.602 20.155 24.5851 20.11 24.5811C20.0659 24.5771 20.0226 24.5876 19.9808 24.6108C19.9191 24.6461 19.8822 24.6983 19.8701 24.7697C19.8581 24.8403 19.8749 24.9149 19.9191 24.9935L19.9263 25.0064H19.9271Z" fill="white"/>
+<path id="Vector_27" d="M20.4318 24.2803L20.5016 24.3822C20.5 24.3301 20.5096 24.2835 20.5313 24.2418C20.5521 24.2001 20.5834 24.1664 20.6244 24.1391C20.6893 24.0966 20.7495 24.0838 20.8049 24.0998C20.8602 24.1159 20.9116 24.16 20.9597 24.233L21.2173 24.6302L21.1507 24.6735L20.8923 24.2755C20.857 24.2218 20.8193 24.1889 20.7792 24.1768C20.7391 24.1648 20.695 24.1752 20.6452 24.2073C20.6035 24.2346 20.5754 24.2707 20.561 24.3172C20.5465 24.3638 20.5449 24.4143 20.5586 24.4681L20.8281 24.8829L20.7616 24.9262L20.3684 24.3213L20.4318 24.2795V24.2803Z" fill="white"/>
+<path id="Vector_28" d="M21.6546 24.0886C21.6313 24.0565 21.5993 24.0404 21.5599 24.0404C21.5198 24.0404 21.4701 24.0532 21.4107 24.0805C21.3513 24.1078 21.3016 24.1247 21.2631 24.1311C21.2246 24.1383 21.1901 24.1359 21.1612 24.1263C21.1323 24.1166 21.1074 24.0966 21.0858 24.0677C21.0521 24.022 21.0432 23.9698 21.0593 23.912C21.0753 23.8543 21.1138 23.8029 21.1732 23.7588C21.2382 23.7115 21.3016 23.689 21.3642 23.6922C21.4267 23.6954 21.4773 23.7227 21.515 23.774L21.4508 23.8214C21.4259 23.7877 21.3906 23.7692 21.3457 23.7676C21.3008 23.766 21.2567 23.7813 21.2133 23.8133C21.1708 23.8446 21.1443 23.8791 21.1323 23.9168C21.1203 23.9546 21.1259 23.9883 21.1475 24.0187C21.1692 24.0476 21.1965 24.0621 21.2294 24.0629C21.2623 24.0629 21.312 24.0492 21.3778 24.0212C21.4436 23.9931 21.4966 23.9762 21.5359 23.9706C21.5752 23.965 21.6089 23.9674 21.6386 23.9786C21.6675 23.9899 21.6931 24.0099 21.7156 24.0404C21.7517 24.0894 21.7605 24.1431 21.7429 24.2017C21.7252 24.2603 21.6843 24.3132 21.6201 24.3597C21.5527 24.4095 21.4853 24.4336 21.4195 24.432C21.3529 24.4303 21.3016 24.4039 21.2647 24.3541L21.3289 24.3068C21.3594 24.3429 21.3963 24.3605 21.4412 24.3597C21.4861 24.3589 21.5319 24.3413 21.58 24.306C21.6249 24.2731 21.6538 24.2362 21.6666 24.1969C21.6795 24.1575 21.6755 24.1214 21.653 24.0918L21.6546 24.0886Z" fill="white"/>
+<path id="Vector_29" d="M22.7023 23.6914L22.6518 23.7363L21.8848 22.8778L21.9353 22.8329L22.7023 23.6914Z" fill="white"/>
+<path id="Vector_30" d="M23.418 22.3659C23.3868 22.337 23.3523 22.3258 23.3145 22.3322C23.2776 22.3386 23.2239 22.3627 23.1533 22.4044C23.0827 22.4461 23.0217 22.4742 22.9687 22.4886C22.8684 22.5159 22.785 22.4999 22.7192 22.4397C22.6614 22.3867 22.6358 22.3193 22.6414 22.2383C22.647 22.1573 22.6847 22.0786 22.7529 22.004C22.7986 21.9543 22.8484 21.9182 22.9029 21.8957C22.9567 21.8732 23.0113 21.8668 23.0658 21.8756C23.1204 21.8845 23.1677 21.9077 23.2094 21.9454L23.0955 22.069C23.0586 22.0345 23.0185 22.0193 22.9752 22.0241C22.9326 22.0281 22.8909 22.0522 22.8516 22.0955C22.8147 22.1364 22.7938 22.1757 22.7906 22.2142C22.7874 22.2527 22.801 22.2864 22.8323 22.3145C22.8588 22.3386 22.8917 22.3466 22.931 22.3386C22.9711 22.3306 23.0241 22.3057 23.0923 22.2656C23.1597 22.2255 23.2199 22.1974 23.272 22.1829C23.3242 22.1685 23.3707 22.1661 23.4124 22.1757C23.4541 22.1853 23.4935 22.2062 23.5304 22.2399C23.5897 22.2945 23.6162 22.3611 23.6098 22.4389C23.6034 22.5167 23.5641 22.5953 23.4919 22.6732C23.4445 22.7253 23.3916 22.7638 23.3322 22.7895C23.2736 22.8152 23.2159 22.8248 23.1597 22.8176C23.1035 22.8104 23.0538 22.7871 23.0089 22.7454L23.1228 22.621C23.1637 22.6579 23.207 22.674 23.2544 22.6675C23.3009 22.6611 23.3474 22.633 23.394 22.5825C23.4333 22.5392 23.455 22.4991 23.4574 22.4605C23.4598 22.4228 23.4469 22.3907 23.418 22.3643V22.3659Z" fill="white"/>
+<path id="Vector_31" d="M24.0366 22.0386C23.9724 22.1188 23.8946 22.1629 23.8039 22.1718C23.7133 22.1806 23.6266 22.1517 23.5424 22.0843L23.5271 22.0715C23.471 22.0265 23.43 21.9752 23.4028 21.9182C23.3763 21.8612 23.3659 21.8027 23.3731 21.7441C23.3803 21.6855 23.4028 21.6318 23.4413 21.5836C23.5031 21.5074 23.5753 21.4681 23.6571 21.4657C23.7389 21.4633 23.8256 21.4978 23.9147 21.57L23.9652 21.6109L23.6691 21.9776C23.7189 22.0113 23.7678 22.0249 23.8168 22.0201C23.8657 22.0145 23.9066 21.9912 23.9403 21.9503C23.9869 21.8925 24.0013 21.8267 23.9845 21.7529L24.104 21.7369C24.1193 21.7866 24.1217 21.8372 24.1096 21.8901C24.0976 21.9423 24.0735 21.992 24.0358 22.0386H24.0366ZM23.5432 21.6655C23.5151 21.7 23.5047 21.7377 23.5119 21.7786C23.5191 21.8195 23.5416 21.8604 23.5801 21.9014L23.7742 21.6607L23.7646 21.6534C23.7205 21.6221 23.6788 21.6077 23.6419 21.6101C23.6042 21.6125 23.5713 21.631 23.5432 21.6663V21.6655Z" fill="white"/>
+<path id="Vector_32" d="M24.0584 21.0357C24.0432 21.0509 24.0287 21.0678 24.0151 21.0862C23.9718 21.1464 23.9653 21.2034 23.9958 21.2579L24.3946 21.5484L24.2991 21.6791L23.7158 21.2547L23.8065 21.1295L23.8739 21.1737C23.8466 21.1055 23.853 21.0429 23.8939 20.9867C23.9076 20.9683 23.9212 20.9546 23.9349 20.9458L24.0576 21.0357H24.0584Z" fill="white"/>
+<path id="Vector_33" d="M24.5717 20.9305L24.2243 20.5197L24.3166 20.3801L24.7827 20.9851L24.7057 21.103L23.9644 20.9177L24.0566 20.7773L24.5733 20.9313L24.5717 20.9305Z" fill="white"/>
+<path id="Vector_34" d="M24.2029 20.1997C24.1812 20.1868 24.1676 20.1692 24.1619 20.1475C24.1555 20.1258 24.1603 20.1018 24.1756 20.0769C24.1908 20.052 24.2093 20.0368 24.2318 20.0312C24.2542 20.0255 24.2759 20.0296 24.2975 20.0424C24.3184 20.0552 24.332 20.0721 24.3377 20.0945C24.3433 20.117 24.3385 20.1403 24.324 20.1652C24.3088 20.19 24.2903 20.2053 24.2687 20.2109C24.247 20.2157 24.2253 20.2125 24.2045 20.1997H24.2029ZM25.071 20.5182L24.9876 20.657L24.3681 20.2863L24.4516 20.1475L25.071 20.5182Z" fill="white"/>
+<path id="Vector_35" d="M25.2146 20.0271C25.2339 19.9918 25.2395 19.9565 25.2315 19.922C25.2235 19.8875 25.205 19.861 25.1745 19.8426L25.2475 19.7086C25.286 19.7318 25.3165 19.7639 25.3382 19.8056C25.3599 19.8474 25.3703 19.8931 25.3687 19.9436C25.3671 19.9942 25.3542 20.0423 25.3294 20.0881C25.2812 20.1771 25.2146 20.2317 25.1288 20.2525C25.0429 20.2734 24.9499 20.2566 24.8488 20.202L24.8343 20.194C24.738 20.1418 24.6747 20.0744 24.6442 19.991C24.6137 19.9075 24.6233 19.8217 24.6715 19.7326C24.7124 19.6572 24.7677 19.6075 24.8375 19.5842C24.9073 19.5601 24.9788 19.5665 25.0518 19.6035L24.9788 19.7374C24.9418 19.719 24.9049 19.7158 24.8688 19.7262C24.8327 19.7366 24.8054 19.7599 24.7854 19.796C24.7605 19.8426 24.7581 19.8867 24.7782 19.93C24.7982 19.9733 24.8416 20.0134 24.9098 20.0504L24.933 20.0624C25.002 20.0993 25.0598 20.1153 25.1071 20.1081C25.1545 20.1009 25.1906 20.0744 25.2162 20.0279L25.2146 20.0271Z" fill="white"/>
+<path id="Vector_36" d="M25.6743 19.398C25.6309 19.4911 25.5659 19.5529 25.4809 19.5834C25.3959 19.6139 25.3036 19.6066 25.2065 19.5609L25.188 19.5521C25.1231 19.5216 25.0701 19.4815 25.0308 19.4325C24.9915 19.3836 24.9674 19.329 24.9602 19.2705C24.953 19.2119 24.9618 19.1541 24.9883 19.098C25.03 19.0089 25.0902 18.9535 25.1696 18.9311C25.249 18.9086 25.3405 18.9222 25.4448 18.9704L25.5042 18.9977L25.3052 19.4253C25.3614 19.4462 25.4127 19.4478 25.4584 19.4309C25.505 19.4141 25.5387 19.3812 25.5611 19.3338C25.5924 19.2664 25.5908 19.199 25.5563 19.1316L25.6686 19.0875C25.6951 19.1316 25.7096 19.1814 25.7104 19.2352C25.7112 19.2889 25.6991 19.3427 25.6743 19.3972V19.398ZM25.1054 19.1541C25.087 19.1942 25.0853 19.2335 25.1022 19.2713C25.119 19.309 25.1511 19.3435 25.1977 19.374L25.3285 19.0939L25.3172 19.0891C25.2667 19.0691 25.2234 19.0651 25.1872 19.0763C25.1511 19.0875 25.1239 19.1132 25.1046 19.1541H25.1054Z" fill="white"/>
+<path id="Vector_37" d="M25.8155 17.7453C25.9054 17.7774 25.9784 17.8199 26.0354 17.8753C26.0923 17.9306 26.1284 17.9932 26.1445 18.063C26.1605 18.1328 26.1549 18.2059 26.1284 18.2813C26.102 18.3551 26.061 18.4153 26.0041 18.4602C25.9471 18.5051 25.8797 18.5324 25.8019 18.5404C25.7232 18.5485 25.6406 18.5372 25.5532 18.5067L25.5018 18.4883C25.4127 18.457 25.3389 18.4129 25.282 18.3575C25.225 18.3013 25.1881 18.2387 25.172 18.1681C25.156 18.0975 25.1616 18.0253 25.1881 17.9507C25.2146 17.8761 25.2555 17.8159 25.3116 17.771C25.3678 17.7261 25.4352 17.6996 25.5138 17.6924C25.5925 17.6843 25.6759 17.6964 25.7658 17.7277L25.8163 17.7453H25.8155ZM25.712 17.8873C25.6109 17.8512 25.5259 17.8432 25.4585 17.8625C25.3911 17.8817 25.3445 17.9266 25.3197 17.9972C25.2956 18.0662 25.3036 18.1296 25.3437 18.1874C25.3839 18.2452 25.4529 18.2917 25.5515 18.3278L25.6045 18.3463C25.7048 18.3816 25.7898 18.3896 25.8588 18.3695C25.9278 18.3495 25.9744 18.3053 25.9993 18.2355C26.0241 18.1649 26.0161 18.1015 25.976 18.0446C25.9359 17.9876 25.8637 17.9411 25.761 17.905L25.7128 17.8881L25.712 17.8873Z" fill="white"/>
+<path id="Vector_38" d="M25.8541 17.1956C25.8444 17.2149 25.8372 17.2357 25.8308 17.2574C25.8099 17.3288 25.8236 17.385 25.8709 17.4251L26.3451 17.5615L26.3002 17.7171L25.6069 17.5173L25.6495 17.3689L25.7281 17.3874C25.6783 17.332 25.6639 17.2718 25.6832 17.2052C25.6896 17.1828 25.6976 17.1651 25.708 17.1531L25.8541 17.1956Z" fill="white"/>
+<path id="Vector_39" d="M26.0747 17.182C25.9656 17.1563 25.8846 17.1106 25.8316 17.044C25.7787 16.9774 25.7618 16.902 25.7819 16.8169C25.8003 16.7367 25.8437 16.6805 25.9102 16.6477L25.8412 16.6236L25.8749 16.4816L26.5561 16.6412C26.6484 16.6629 26.7142 16.7086 26.7543 16.7784C26.7944 16.8482 26.8024 16.9317 26.78 17.0296C26.7679 17.0809 26.7455 17.1291 26.7126 17.1732C26.6797 17.2173 26.6428 17.2478 26.6019 17.2655L26.5248 17.1684C26.5938 17.1331 26.6364 17.0801 26.6532 17.0095C26.6652 16.9574 26.6612 16.9124 26.6396 16.8755C26.6179 16.8386 26.5802 16.8137 26.5248 16.8009L26.4775 16.7897C26.5176 16.8466 26.5289 16.9132 26.5112 16.9894C26.4919 17.0713 26.4438 17.1315 26.366 17.1684C26.2881 17.2053 26.1919 17.2101 26.0763 17.1828L26.0747 17.182ZM26.1253 17.028C26.1959 17.0448 26.2545 17.0432 26.3018 17.0239C26.3491 17.0047 26.3788 16.9694 26.3908 16.918C26.4061 16.8547 26.3892 16.8009 26.3419 16.7576L26.033 16.6854C25.9728 16.703 25.9351 16.7431 25.9199 16.8065C25.9078 16.8587 25.9191 16.9036 25.9536 16.9421C25.9881 16.9806 26.045 17.0095 26.1253 17.028Z" fill="white"/>
+<path id="Vector_40" d="M26.6877 16.0219C26.6733 16.0267 26.65 16.0291 26.6179 16.0291C26.662 16.0892 26.6781 16.1558 26.6661 16.2297C26.654 16.3011 26.6235 16.3556 26.5754 16.3941C26.5273 16.4326 26.4727 16.4463 26.4125 16.4359C26.3371 16.423 26.2833 16.3853 26.252 16.3219C26.2208 16.2585 26.2143 16.1751 26.232 16.07L26.2488 15.9721L26.2023 15.9641C26.1654 15.9577 26.1341 15.9633 26.1084 15.9801C26.0828 15.997 26.0667 16.0267 26.0595 16.0684C26.0531 16.1045 26.0571 16.1358 26.0715 16.1623C26.086 16.1887 26.1068 16.204 26.1349 16.2088L26.1076 16.3685C26.0683 16.362 26.0346 16.3428 26.0049 16.3115C25.9752 16.2802 25.9544 16.2401 25.9431 16.1927C25.9311 16.1446 25.9303 16.0941 25.9399 16.0387C25.9544 15.9553 25.9865 15.8927 26.0362 15.8502C26.0868 15.8076 26.1493 15.7924 26.2256 15.8036L26.5465 15.8582C26.6107 15.8694 26.6628 15.8686 26.7046 15.8574L26.7158 15.859L26.6885 16.0219H26.6877ZM26.5433 16.1783C26.5489 16.147 26.5457 16.1157 26.5353 16.0852C26.5248 16.0547 26.508 16.0307 26.4839 16.0122L26.3499 15.9898L26.3355 16.0756C26.3259 16.135 26.3283 16.1807 26.3435 16.2144C26.3588 16.2481 26.386 16.2674 26.4237 16.2738C26.4542 16.2786 26.4807 16.273 26.5024 16.2553C26.524 16.2377 26.5377 16.212 26.5433 16.1783Z" fill="white"/>
+<path id="Vector_41" d="M26.0384 15.453L26.1219 15.457C26.0633 15.3968 26.0392 15.3238 26.0481 15.2379C26.0641 15.0887 26.158 15.0213 26.3289 15.0374L26.8031 15.0879L26.7862 15.2492L26.3217 15.1994C26.2759 15.1946 26.2414 15.201 26.2174 15.2179C26.1933 15.2355 26.1788 15.266 26.174 15.3109C26.1668 15.3759 26.1909 15.4273 26.247 15.4658L26.7573 15.5204L26.7405 15.6816L26.0232 15.6046L26.0392 15.453H26.0384Z" fill="white"/>
+<path id="Vector_42" d="M25.9078 14.8416C25.883 14.84 25.8629 14.8312 25.8477 14.8143C25.8324 14.7975 25.8252 14.7742 25.8276 14.7453C25.8292 14.7165 25.8388 14.694 25.8565 14.6787C25.8741 14.6635 25.895 14.6571 25.9199 14.6587C25.9439 14.6603 25.964 14.6691 25.9792 14.6868C25.9945 14.7036 26.0009 14.7269 25.9993 14.7566C25.9977 14.7855 25.9881 14.8079 25.9712 14.8224C25.9544 14.8368 25.9335 14.844 25.9086 14.8424L25.9078 14.8416ZM26.8257 14.7261L26.8161 14.8882L26.0956 14.8432L26.1052 14.6812L26.8257 14.7261Z" fill="white"/>
+<path id="Vector_43" d="M26.7116 14.3489L26.7196 13.9646L26.8488 13.967L26.8368 14.5527L26.7309 14.5503L26.2535 14.1748L26.2463 14.5343L26.1155 14.5319L26.1267 13.967L26.2294 13.9694L26.7116 14.3497V14.3489Z" fill="white"/>
+<path id="Vector_44" d="M26.8312 13.3741C26.8176 13.3813 26.7951 13.3885 26.7646 13.395C26.82 13.4447 26.8497 13.5065 26.8521 13.5811C26.8545 13.6533 26.8361 13.7135 26.7967 13.7608C26.7574 13.8082 26.7069 13.833 26.6459 13.8354C26.5689 13.8386 26.5087 13.8122 26.4662 13.756C26.4229 13.7006 26.3996 13.6196 26.3956 13.5137L26.3916 13.4142L26.3442 13.4158C26.3065 13.4174 26.2776 13.4287 26.256 13.4503C26.2343 13.472 26.2247 13.5041 26.2255 13.5466C26.2271 13.5835 26.2375 13.6132 26.2568 13.6365C26.276 13.6597 26.3001 13.6702 26.3282 13.6694L26.3338 13.8314C26.2945 13.833 26.2568 13.821 26.2215 13.7961C26.1862 13.7712 26.1581 13.7367 26.1364 13.6918C26.1156 13.6477 26.1035 13.5971 26.1019 13.5418C26.0987 13.4575 26.1172 13.3893 26.1581 13.3372C26.199 13.285 26.2576 13.2578 26.3338 13.2529L26.6587 13.2409C26.7237 13.2385 26.7751 13.2273 26.8128 13.208H26.824L26.8304 13.3725L26.8312 13.3741ZM26.7213 13.5562C26.7205 13.5241 26.7117 13.4944 26.6948 13.4672C26.678 13.4399 26.6563 13.419 26.6299 13.4062L26.4943 13.411L26.4975 13.4985C26.4999 13.5586 26.5119 13.6028 26.5336 13.6324C26.5552 13.6621 26.5857 13.6758 26.6242 13.6742C26.6555 13.6734 26.6796 13.6621 26.6973 13.6405C26.7149 13.6188 26.7229 13.5915 26.7221 13.5562H26.7213Z" fill="white"/>
+<path id="Vector_45" d="M25.8997 12.9119L26.0746 12.8967L26.0641 12.7699L26.1837 12.7595L26.1941 12.8862L26.5953 12.8517C26.6226 12.8493 26.6418 12.8421 26.6531 12.8301C26.6643 12.818 26.6691 12.798 26.6667 12.7707C26.6651 12.7522 26.6611 12.7338 26.6555 12.7145L26.7806 12.7041C26.7943 12.7402 26.8023 12.7747 26.8047 12.8092C26.8151 12.9336 26.7517 13.001 26.6153 13.013L26.2078 13.0475L26.2182 13.1654L26.0986 13.1759L26.0882 13.0579L25.9133 13.0732L25.8997 12.9119Z" fill="white"/>
+<path id="Vector_46" d="M25.8638 12.672C25.8389 12.6752 25.8172 12.6696 25.7996 12.656C25.7819 12.6423 25.7707 12.6207 25.7675 12.5918C25.7643 12.5629 25.7699 12.5388 25.7843 12.5212C25.7988 12.5035 25.818 12.4931 25.8429 12.4899C25.867 12.4867 25.8886 12.4923 25.9063 12.5067C25.9239 12.5212 25.9352 12.542 25.9384 12.5717C25.9416 12.6014 25.9368 12.6239 25.9223 12.6415C25.9079 12.6592 25.8886 12.6696 25.8646 12.672H25.8638ZM26.7463 12.3944L26.7656 12.5557L26.0491 12.6407L26.0298 12.4795L26.7463 12.3944Z" fill="white"/>
+<path id="Vector_47" d="M26.365 12.2814C26.2952 12.2926 26.2302 12.2894 26.17 12.2709C26.1098 12.2525 26.0601 12.2212 26.0216 12.1755C25.9831 12.1305 25.959 12.0752 25.9478 12.0102C25.9317 11.9139 25.9502 11.8312 26.0015 11.7606C26.0537 11.6908 26.1299 11.6443 26.2318 11.6226L26.2695 11.6154C26.3401 11.6042 26.4043 11.6066 26.4645 11.625C26.5246 11.6427 26.5736 11.6748 26.6121 11.7197C26.6506 11.7647 26.6755 11.8208 26.6859 11.8866C26.7028 11.9869 26.6827 12.0728 26.6257 12.1442C26.5688 12.2156 26.4845 12.2605 26.373 12.279L26.365 12.2806V12.2814ZM26.3521 12.1193C26.4251 12.1073 26.4805 12.0824 26.5166 12.0455C26.5535 12.0086 26.5672 11.9628 26.5575 11.9091C26.5487 11.8553 26.5206 11.8168 26.4733 11.7935C26.426 11.7703 26.3618 11.7655 26.2807 11.7791C26.2085 11.7911 26.154 11.816 26.1171 11.8537C26.0801 11.8914 26.0657 11.9372 26.0745 11.9901C26.0834 12.0423 26.1106 12.08 26.1572 12.104C26.2037 12.1281 26.2679 12.1329 26.3505 12.1193H26.3521Z" fill="white"/>
+<path id="Vector_48" d="M25.8461 11.4036L25.9263 11.3803C25.8517 11.3426 25.8044 11.2816 25.7851 11.1974C25.7514 11.0513 25.818 10.9575 25.9849 10.9157L26.4494 10.8082L26.4855 10.9663L26.0298 11.0714C25.9849 11.0818 25.9544 11.0987 25.9375 11.1235C25.9207 11.1476 25.9175 11.1821 25.9271 11.2254C25.9416 11.2888 25.9817 11.3297 26.0467 11.3474L26.5473 11.2319L26.5842 11.3899L25.8814 11.552L25.8469 11.4036H25.8461Z" fill="white"/>
+<path id="Vector_49" d="M26.0946 10.2811C26.0665 10.2891 26.0489 10.3068 26.0416 10.3341C26.0336 10.3613 26.032 10.4031 26.0368 10.4592C26.0416 10.5154 26.04 10.5635 26.0336 10.6044C26.0192 10.6935 25.9758 10.7481 25.9052 10.7689C25.8459 10.7866 25.7881 10.7761 25.7335 10.7376C25.679 10.6991 25.6397 10.6414 25.6164 10.5635C25.5923 10.4809 25.5923 10.4079 25.6188 10.3445C25.6445 10.2811 25.6902 10.2402 25.7552 10.2209L25.8009 10.3766C25.7712 10.3854 25.7496 10.4039 25.7359 10.4319C25.7223 10.46 25.7215 10.4921 25.7319 10.529C25.7424 10.5635 25.7584 10.5884 25.7801 10.6052C25.8025 10.6221 25.8266 10.6269 25.8531 10.6189C25.8772 10.6117 25.8924 10.5964 25.8996 10.5724C25.9068 10.5483 25.9084 10.5042 25.9036 10.4392C25.8988 10.3742 25.9012 10.322 25.9093 10.2811C25.9173 10.241 25.9325 10.2089 25.9534 10.184C25.9742 10.1591 26.0031 10.1415 26.0408 10.1311C26.1034 10.1126 26.1612 10.1238 26.2149 10.164C26.2687 10.2041 26.308 10.2659 26.3329 10.3493C26.3497 10.4063 26.3545 10.4592 26.3465 10.5098C26.3393 10.5603 26.3208 10.6028 26.2928 10.6381C26.2639 10.6734 26.2294 10.6975 26.1877 10.7095L26.1427 10.5587C26.1788 10.5459 26.2029 10.5234 26.2149 10.4921C26.227 10.4608 26.227 10.4239 26.2149 10.3814C26.2029 10.3405 26.1861 10.3116 26.1644 10.2947C26.1427 10.2779 26.1187 10.2731 26.0938 10.2811H26.0946Z" fill="white"/>
+</g>
+<g id="Group_2">
+<g id="Group_3">
+<path id="Vector_50" d="M8.9457 10.9173H6.97035L6.52184 12.1393H6.13672L7.78312 7.78821H8.13294L9.77933 12.1393H9.39662L8.9457 10.9173ZM7.08428 10.6068H8.82937L7.95642 8.23672L7.08348 10.6068H7.08428Z" fill="white"/>
+<path id="Vector_51" d="M10.8064 12.1401H10.439V7.78906H10.8064V12.1401Z" fill="white"/>
+<path id="Vector_52" d="M15.0067 10.7833C14.9569 11.2415 14.7933 11.5921 14.5149 11.8352C14.2364 12.0783 13.8666 12.1995 13.4044 12.1995C13.0819 12.1995 12.7962 12.1184 12.5483 11.9572C12.3004 11.7959 12.1086 11.5672 11.973 11.2712C11.8375 10.9751 11.7685 10.6373 11.7668 10.2562V9.69135C11.7668 9.30462 11.8342 8.96202 11.9698 8.66355C12.1054 8.36508 12.3004 8.13401 12.5539 7.97194C12.8083 7.80987 13.1003 7.72803 13.4309 7.72803C13.8971 7.72803 14.2653 7.85319 14.5349 8.10432C14.8045 8.35546 14.9618 8.70287 15.0059 9.14736H14.6352C14.5437 8.40841 14.1418 8.03853 13.4309 8.03853C13.0361 8.03853 12.7224 8.18616 12.4881 8.48142C12.2539 8.77668 12.1367 9.18427 12.1367 9.70499V10.2377C12.1367 10.74 12.2507 11.1412 12.4785 11.4396C12.7064 11.7389 13.0153 11.8882 13.4036 11.8882C13.7919 11.8882 14.0776 11.7959 14.2733 11.6113C14.4683 11.4268 14.5895 11.1508 14.6352 10.7817H15.0059L15.0067 10.7833Z" fill="white"/>
+<path id="Vector_53" d="M16.2061 10.3678V12.1401H15.8386V7.78906H17.3205C17.7731 7.78906 18.1301 7.9046 18.3917 8.13567C18.654 8.36675 18.7848 8.68447 18.7848 9.08885C18.7848 9.49323 18.6588 9.81256 18.4069 10.0348C18.155 10.2571 17.7899 10.3678 17.3117 10.3678H16.2061ZM16.2061 10.0573H17.3205C17.6768 10.0573 17.9488 9.97222 18.1365 9.80293C18.3235 9.63364 18.4173 9.39695 18.4173 9.09366C18.4173 8.79038 18.3243 8.55209 18.1381 8.37397C17.952 8.19505 17.6872 8.10438 17.3446 8.10037H16.2061V10.0581V10.0573Z" fill="white"/>
+<path id="Vector_54" d="M21.4823 10.9173H19.507L19.0585 12.1393H18.6733L20.3197 7.78821H20.6696L22.316 12.1393H21.9332L21.4823 10.9173ZM19.6201 10.6068H21.3652L20.4922 8.23672L19.6193 10.6068H19.6201Z" fill="white"/>
+<path id="Vector_55" d="M11.4289 18.1368C11.4289 17.8961 11.3438 17.7051 11.1745 17.5647C11.0052 17.4243 10.6955 17.2911 10.2454 17.1643C9.79532 17.0376 9.46636 16.8996 9.25936 16.7503C8.9641 16.5393 8.81727 16.2625 8.81727 15.9199C8.81727 15.5773 8.95447 15.3165 9.22807 15.1087C9.50167 14.9009 9.85229 14.7966 10.2783 14.7966C10.5672 14.7966 10.8255 14.8528 11.0542 14.9643C11.2821 15.0758 11.4594 15.2315 11.5845 15.4305C11.7097 15.6295 11.7731 15.8517 11.7731 16.0972H11.4024C11.4024 15.7996 11.3005 15.5605 11.0975 15.3791C10.8945 15.1978 10.6217 15.1079 10.2783 15.1079C9.93493 15.1079 9.68059 15.1826 9.48321 15.331C9.28584 15.4794 9.18715 15.6736 9.18715 15.9135C9.18715 16.1349 9.27541 16.3155 9.45272 16.4551C9.63004 16.5947 9.91407 16.7182 10.304 16.8249C10.6947 16.9317 10.99 17.0424 11.1914 17.1571C11.3928 17.2718 11.5444 17.4082 11.6455 17.5679C11.7474 17.7276 11.798 17.9153 11.798 18.1328C11.798 18.4754 11.6608 18.7506 11.3872 18.9576C11.1136 19.1646 10.7525 19.2681 10.304 19.2681C9.99751 19.2681 9.71589 19.2135 9.45994 19.1036C9.204 18.9937 9.00983 18.8404 8.87745 18.643C8.74506 18.4457 8.67847 18.2194 8.67847 17.9651H9.04594C9.04594 18.2716 9.16067 18.5139 9.38934 18.6912C9.618 18.8685 9.92289 18.9568 10.304 18.9568C10.6426 18.9568 10.9146 18.8821 11.12 18.7329C11.3254 18.5837 11.4281 18.3855 11.4281 18.1384L11.4289 18.1368Z" fill="white"/>
+<path id="Vector_56" d="M15.7455 17.267C15.7455 17.6673 15.6765 18.0188 15.5377 18.3221C15.3989 18.6245 15.2015 18.858 14.9448 19.0217C14.688 19.1854 14.3911 19.2664 14.0542 19.2664C13.5463 19.2664 13.1355 19.0843 12.8234 18.7208C12.5105 18.3574 12.354 17.8663 12.354 17.2493V16.8008C12.354 16.4045 12.4246 16.053 12.565 15.7473C12.7054 15.4417 12.9044 15.2066 13.1612 15.0421C13.4179 14.8776 13.714 14.7958 14.0485 14.7958C14.3831 14.7958 14.6784 14.8768 14.9343 15.0381C15.1903 15.1994 15.3876 15.4272 15.5273 15.7225C15.6669 16.0177 15.7391 16.3587 15.7455 16.7479V17.2678V17.267ZM15.378 16.7944C15.378 16.2705 15.2593 15.8597 15.0226 15.5628C14.7851 15.2659 14.4609 15.1175 14.0485 15.1175C13.6361 15.1175 13.3216 15.2667 13.0817 15.5644C12.8418 15.8621 12.7215 16.2785 12.7215 16.8121V17.2662C12.7215 17.7821 12.841 18.1913 13.0801 18.4929C13.3192 18.7946 13.6442 18.9455 14.0542 18.9455C14.4642 18.9455 14.7955 18.7962 15.0282 18.4986C15.2617 18.2009 15.378 17.7861 15.378 17.2541V16.7936V16.7944Z" fill="white"/>
+<path id="Vector_57" d="M19.6922 17.8495C19.6425 18.3076 19.4788 18.6583 19.2004 18.9014C18.922 19.1445 18.5521 19.2656 18.09 19.2656C17.7674 19.2656 17.4818 19.1846 17.2339 19.0233C16.9859 18.862 16.7942 18.6334 16.6586 18.3373C16.523 18.0413 16.454 17.7035 16.4524 17.3224V16.7575C16.4524 16.3708 16.5198 16.0282 16.6554 15.7297C16.791 15.4312 16.9859 15.2002 17.2395 15.0381C17.4938 14.876 17.7859 14.7942 18.1164 14.7942C18.5826 14.7942 18.9509 14.9194 19.2205 15.1705C19.49 15.4216 19.6473 15.769 19.6914 16.2135H19.3208C19.2293 15.4746 18.8273 15.1047 18.1164 15.1047C17.7217 15.1047 17.408 15.2523 17.1737 15.5476C16.9394 15.8428 16.8223 16.2504 16.8223 16.7712V17.3039C16.8223 17.8062 16.9362 18.2073 17.1641 18.5058C17.3919 18.8051 17.7008 18.9543 18.0892 18.9543C18.4775 18.9543 18.7631 18.862 18.9589 18.6775C19.1539 18.493 19.275 18.217 19.3208 17.8479H19.6914L19.6922 17.8495Z" fill="white"/>
+</g>
+<path id="Vector_58" d="M6.00195 13.5538H22.5871" stroke="white" stroke-width="0.111926" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<g id="Group_4">
+<path id="Vector_59" d="M8.72524 21.7257C8.71722 21.7089 8.71 21.68 8.70518 21.6374C8.63859 21.7064 8.55916 21.7409 8.46609 21.7409C8.38345 21.7409 8.31525 21.7177 8.26229 21.6711C8.20934 21.6246 8.18286 21.5652 8.18286 21.493C8.18286 21.4056 8.21576 21.3382 8.28235 21.2892C8.34895 21.2411 8.44202 21.217 8.56237 21.217H8.70197V21.1512C8.70197 21.1015 8.68673 21.0614 8.65704 21.0317C8.62736 21.002 8.58323 20.9868 8.52466 20.9868C8.47331 20.9868 8.43078 20.9996 8.39628 21.0253C8.36178 21.0509 8.34413 21.0822 8.34413 21.1191H8.19971C8.19971 21.0774 8.21496 21.0365 8.24464 20.998C8.27433 20.9587 8.31444 20.9282 8.36579 20.9057C8.41634 20.8833 8.47251 20.8712 8.53348 20.8712C8.63057 20.8712 8.70599 20.8953 8.76055 20.9434C8.8151 20.9916 8.84399 21.0582 8.84559 21.1432V21.5291C8.84559 21.6062 8.85522 21.6671 8.87528 21.7129V21.7249H8.72444L8.72524 21.7257ZM8.48695 21.6166C8.53188 21.6166 8.5744 21.6046 8.61452 21.5821C8.65464 21.5588 8.68432 21.5283 8.70197 21.4914V21.3189H8.58965C8.41393 21.3189 8.32568 21.3703 8.32568 21.473C8.32568 21.5179 8.34092 21.5532 8.37061 21.5781C8.4003 21.6037 8.43881 21.6158 8.48615 21.6158L8.48695 21.6166Z" fill="white"/>
+<path id="Vector_60" d="M9.03174 20.6642C9.03174 20.6409 9.03896 20.6209 9.0534 20.6056C9.06784 20.5904 9.0887 20.5815 9.11679 20.5815C9.14487 20.5815 9.16573 20.5896 9.18017 20.6056C9.19461 20.6217 9.20183 20.6409 9.20183 20.6642C9.20183 20.6875 9.19461 20.7067 9.18017 20.722C9.16573 20.7372 9.14487 20.7452 9.11679 20.7452C9.0887 20.7452 9.06784 20.7372 9.0534 20.722C9.03896 20.7067 9.03174 20.6866 9.03174 20.6642ZM9.18659 21.7257H9.04297V20.8864H9.18659V21.7257Z" fill="white"/>
+<path id="Vector_61" d="M9.71276 21.6246C9.76411 21.6246 9.80824 21.6094 9.84675 21.5781C9.88526 21.5468 9.90612 21.5083 9.91013 21.4618H10.0457C10.0433 21.5099 10.0265 21.5556 9.99598 21.599C9.96549 21.6423 9.92457 21.6768 9.87403 21.7025C9.82348 21.7281 9.76892 21.741 9.71276 21.741C9.59882 21.741 9.50736 21.7025 9.43996 21.6262C9.37257 21.55 9.33887 21.4457 9.33887 21.3133V21.2893C9.33887 21.2074 9.35411 21.1352 9.3838 21.071C9.41348 21.0076 9.45681 20.9579 9.51297 20.9226C9.56914 20.8873 9.63573 20.8696 9.71195 20.8696C9.80583 20.8696 9.88446 20.8977 9.94624 20.9539C10.0088 21.01 10.0417 21.0831 10.0457 21.1737H9.91013C9.90612 21.1192 9.88526 21.075 9.84835 21.0397C9.81144 21.0052 9.76571 20.9876 9.71115 20.9876C9.63814 20.9876 9.58198 21.0141 9.54186 21.0662C9.50174 21.1184 9.48168 21.1946 9.48168 21.2941V21.3213C9.48168 21.4184 9.50174 21.4922 9.54106 21.5444C9.58117 21.5965 9.63814 21.623 9.71195 21.623L9.71276 21.6246Z" fill="white"/>
+<path id="Vector_62" d="M10.877 21.3156C10.877 21.4432 10.8481 21.5459 10.7895 21.6245C10.731 21.7024 10.6523 21.7417 10.552 21.7417C10.4518 21.7417 10.3699 21.7096 10.3113 21.6446V22.049H10.1677V20.8872H10.2985L10.3057 20.9803C10.3643 20.9081 10.4453 20.8719 10.5488 20.8719C10.6523 20.8719 10.7294 20.9097 10.7879 20.9859C10.8465 21.0621 10.8762 21.168 10.8762 21.3028V21.3156H10.877ZM10.7334 21.2996C10.7334 21.2049 10.7133 21.1303 10.6732 21.0757C10.6331 21.0212 10.5777 20.9939 10.5071 20.9939C10.4205 20.9939 10.3555 21.0324 10.3113 21.1094V21.5106C10.3547 21.5868 10.4197 21.6253 10.5087 21.6253C10.5777 21.6253 10.6323 21.5981 10.6724 21.5435C10.7133 21.4889 10.7334 21.4079 10.7334 21.3004V21.2996Z" fill="white"/>
+<path id="Vector_63" d="M11.5373 21.7257C11.5292 21.7089 11.522 21.68 11.5172 21.6374C11.4506 21.7064 11.3712 21.7409 11.2781 21.7409C11.1955 21.7409 11.1273 21.7177 11.0743 21.6711C11.0214 21.6246 10.9949 21.5652 10.9949 21.493C10.9949 21.4056 11.0278 21.3382 11.0944 21.2892C11.161 21.2411 11.254 21.217 11.3744 21.217H11.514V21.1512C11.514 21.1015 11.4987 21.0614 11.4691 21.0317C11.4394 21.002 11.3952 20.9868 11.3367 20.9868C11.2853 20.9868 11.2428 20.9996 11.2083 21.0253C11.1738 21.0509 11.1561 21.0822 11.1561 21.1191H11.0117C11.0117 21.0774 11.027 21.0365 11.0567 20.998C11.0863 20.9587 11.1265 20.9282 11.1778 20.9057C11.2284 20.8833 11.2845 20.8712 11.3455 20.8712C11.4426 20.8712 11.518 20.8953 11.5726 20.9434C11.6271 20.9916 11.656 21.0582 11.6576 21.1432V21.5291C11.6576 21.6062 11.6672 21.6671 11.6873 21.7129V21.7249H11.5365L11.5373 21.7257ZM11.299 21.6166C11.3439 21.6166 11.3864 21.6046 11.4265 21.5821C11.4666 21.5588 11.4963 21.5283 11.514 21.4914V21.3189H11.4017C11.2259 21.3189 11.1377 21.3703 11.1377 21.473C11.1377 21.5179 11.1529 21.5532 11.1826 21.5781C11.2123 21.6037 11.2508 21.6158 11.2982 21.6158L11.299 21.6166Z" fill="white"/>
+<path id="Vector_64" d="M11.8462 21.6511C11.8462 21.6262 11.8534 21.6054 11.8687 21.5893C11.8839 21.5733 11.9056 21.5645 11.9353 21.5645C11.9649 21.5645 11.9874 21.5725 12.0026 21.5893C12.0179 21.6062 12.0259 21.6262 12.0259 21.6511C12.0259 21.676 12.0179 21.6944 12.0026 21.7105C11.9874 21.7265 11.9649 21.7346 11.9353 21.7346C11.9056 21.7346 11.8839 21.7265 11.8687 21.7105C11.8534 21.6944 11.8462 21.6744 11.8462 21.6511Z" fill="white"/>
+<path id="Vector_65" d="M12.1841 21.2988C12.1841 21.217 12.2001 21.1423 12.2322 21.0773C12.2643 21.0124 12.3092 20.961 12.367 20.9257C12.4248 20.8904 12.4906 20.8719 12.5644 20.8719C12.6783 20.8719 12.7714 20.9113 12.842 20.9907C12.9126 21.0701 12.9479 21.1752 12.9479 21.306V21.3164C12.9479 21.3983 12.9327 21.4713 12.9014 21.5363C12.8701 21.6013 12.8252 21.6518 12.7674 21.6879C12.7088 21.724 12.6422 21.7425 12.5668 21.7425C12.4529 21.7425 12.3606 21.7032 12.29 21.6237C12.2194 21.5443 12.1841 21.44 12.1841 21.31V21.2996V21.2988ZM12.3277 21.3156C12.3277 21.4087 12.3494 21.4833 12.3927 21.5395C12.436 21.5957 12.4938 21.6237 12.566 21.6237C12.6382 21.6237 12.6968 21.5949 12.7393 21.5379C12.7818 21.4809 12.8035 21.4007 12.8035 21.298C12.8035 21.2057 12.7818 21.1311 12.7377 21.0741C12.6944 21.0172 12.6358 20.9883 12.5636 20.9883C12.4914 20.9883 12.436 21.0164 12.3919 21.0725C12.3478 21.1287 12.3269 21.2097 12.3269 21.3148L12.3277 21.3156Z" fill="white"/>
+<path id="Vector_66" d="M13.4936 21.0156C13.472 21.0124 13.4487 21.01 13.423 21.01C13.3292 21.01 13.265 21.0501 13.2313 21.1304V21.7257H13.0876V20.8865H13.2273L13.2297 20.9835C13.277 20.9089 13.3436 20.8712 13.4294 20.8712C13.4575 20.8712 13.4784 20.8744 13.4928 20.8824V21.0156H13.4936Z" fill="white"/>
+<path id="Vector_67" d="M13.5361 21.2996C13.5361 21.1688 13.5666 21.0645 13.6268 20.9875C13.687 20.9105 13.7672 20.8719 13.8675 20.8719C13.9678 20.8719 14.0496 20.9081 14.1074 20.9803L14.1146 20.8872H14.2454V21.7064C14.2454 21.8147 14.2133 21.9005 14.1491 21.9631C14.0849 22.0257 13.9983 22.057 13.89 22.057C13.8298 22.057 13.7704 22.0442 13.7126 22.0185C13.6549 21.9928 13.6107 21.9575 13.5803 21.9126L13.6549 21.8267C13.7167 21.903 13.7913 21.9407 13.8803 21.9407C13.9501 21.9407 14.0047 21.9206 14.0432 21.8821C14.0825 21.8428 14.1018 21.7874 14.1018 21.716V21.6438C14.044 21.7104 13.9662 21.7433 13.8667 21.7433C13.7672 21.7433 13.6894 21.704 13.6284 21.6245C13.5674 21.5451 13.5369 21.4376 13.5369 21.3012L13.5361 21.2996ZM13.6806 21.3156C13.6806 21.4103 13.6998 21.4849 13.7391 21.5387C13.7776 21.5924 13.8322 21.6197 13.902 21.6197C13.9927 21.6197 14.0593 21.5788 14.101 21.4962V21.1135C14.0568 21.0332 13.9911 20.9931 13.9036 20.9931C13.8338 20.9931 13.7792 21.0204 13.7399 21.0749C13.7006 21.1295 13.6814 21.2097 13.6814 21.3164L13.6806 21.3156Z" fill="white"/>
+<path id="Vector_68" d="M14.4505 21.8228H14.3269L14.7987 20.5968H14.9214L14.4505 21.8228Z" fill="white"/>
+<path id="Vector_69" d="M15.5251 21.5035C15.5251 21.4649 15.5107 21.4345 15.481 21.4128C15.4521 21.3911 15.4008 21.3727 15.3286 21.3574C15.2556 21.3422 15.1986 21.3229 15.1553 21.3013C15.1127 21.2796 15.0815 21.2539 15.0606 21.2234C15.0405 21.1938 15.0301 21.1577 15.0301 21.1167C15.0301 21.0477 15.059 20.99 15.1176 20.9426C15.1761 20.8953 15.2499 20.8712 15.3406 20.8712C15.4361 20.8712 15.5131 20.8961 15.5717 20.945C15.6311 20.994 15.6607 21.0574 15.6607 21.1336H15.5163C15.5163 21.0943 15.4995 21.0606 15.4666 21.0317C15.4337 21.0028 15.3912 20.9892 15.3406 20.9892C15.2901 20.9892 15.2475 21.0004 15.2179 21.0237C15.1882 21.0461 15.1737 21.0758 15.1737 21.1127C15.1737 21.1472 15.1874 21.1737 15.2146 21.1913C15.2419 21.209 15.2917 21.2258 15.3631 21.2419C15.4345 21.2579 15.4931 21.2772 15.5372 21.2997C15.5813 21.3221 15.6142 21.3486 15.6359 21.3799C15.6575 21.4112 15.668 21.4489 15.668 21.4946C15.668 21.5692 15.6383 21.6294 15.5781 21.6752C15.5179 21.7201 15.4401 21.7434 15.3446 21.7434C15.2772 21.7434 15.2179 21.7313 15.1665 21.7081C15.1152 21.684 15.0742 21.6511 15.0453 21.6086C15.0165 21.566 15.0012 21.5195 15.0012 21.4698H15.1448C15.1472 21.5179 15.1665 21.5556 15.2026 21.5845C15.2387 21.6134 15.2861 21.627 15.3446 21.627C15.3992 21.627 15.4425 21.6158 15.4754 21.5941C15.5083 21.5725 15.5243 21.5428 15.5243 21.5059L15.5251 21.5035Z" fill="white"/>
+<path id="Vector_70" d="M15.7778 21.2988C15.7778 21.217 15.7939 21.1423 15.826 21.0773C15.8581 21.0124 15.903 20.961 15.9608 20.9257C16.0185 20.8904 16.0843 20.8719 16.1581 20.8719C16.2721 20.8719 16.3651 20.9113 16.4358 20.9907C16.5064 21.0701 16.5417 21.1752 16.5417 21.306V21.3164C16.5417 21.3983 16.5264 21.4713 16.4951 21.5363C16.4638 21.6013 16.4189 21.6518 16.3611 21.6879C16.3026 21.724 16.236 21.7425 16.1605 21.7425C16.0466 21.7425 15.9543 21.7032 15.8837 21.6237C15.8131 21.5443 15.7778 21.44 15.7778 21.31V21.2996V21.2988ZM15.9223 21.3156C15.9223 21.4087 15.9439 21.4833 15.9872 21.5395C16.0306 21.5957 16.0883 21.6237 16.1605 21.6237C16.2328 21.6237 16.2913 21.5949 16.3339 21.5379C16.3764 21.4809 16.398 21.4007 16.398 21.298C16.398 21.2057 16.3764 21.1311 16.3322 21.0741C16.2889 21.0172 16.2304 20.9883 16.1581 20.9883C16.0859 20.9883 16.0306 21.0164 15.9864 21.0725C15.9423 21.1287 15.9215 21.2097 15.9215 21.3148L15.9223 21.3156Z" fill="white"/>
+<path id="Vector_71" d="M17.0182 21.6246C17.0695 21.6246 17.1137 21.6094 17.1522 21.5781C17.1907 21.5468 17.2115 21.5083 17.2156 21.4618H17.3511C17.3487 21.5099 17.3319 21.5556 17.3014 21.599C17.2709 21.6423 17.23 21.6768 17.1794 21.7025C17.1289 21.7281 17.0743 21.741 17.0182 21.741C16.9042 21.741 16.8128 21.7025 16.7454 21.6262C16.678 21.55 16.6443 21.4457 16.6443 21.3133V21.2893C16.6443 21.2074 16.6595 21.1352 16.6892 21.071C16.7189 21.0076 16.7622 20.9579 16.8184 20.9226C16.8746 20.8873 16.9412 20.8696 17.0174 20.8696C17.1112 20.8696 17.1899 20.8977 17.2517 20.9539C17.3142 21.01 17.3471 21.0831 17.3511 21.1737H17.2156C17.2115 21.1192 17.1907 21.075 17.1538 21.0397C17.1169 21.0052 17.0711 20.9876 17.0166 20.9876C16.9436 20.9876 16.8874 21.0141 16.8473 21.0662C16.8072 21.1184 16.7871 21.1946 16.7871 21.2941V21.3213C16.7871 21.4184 16.8072 21.4922 16.8465 21.5444C16.8866 21.5965 16.9436 21.623 17.0174 21.623L17.0182 21.6246Z" fill="white"/>
+<path id="Vector_72" d="M18.0637 21.3469H18.2202V21.4641H18.0637V21.7264H17.9193V21.4641H17.405V21.3798L17.9105 20.5975H18.0629V21.3477L18.0637 21.3469ZM17.5687 21.3469H17.9201V20.7933L17.9033 20.8246L17.5687 21.3469Z" fill="white"/>
+<path id="Vector_73" d="M18.814 21.5035C18.814 21.4649 18.7995 21.4345 18.7698 21.4128C18.7402 21.3911 18.6896 21.3727 18.6174 21.3574C18.5444 21.3422 18.4874 21.3229 18.4441 21.3013C18.4016 21.2796 18.3703 21.2539 18.3494 21.2234C18.3294 21.1938 18.3189 21.1577 18.3189 21.1167C18.3189 21.0477 18.3478 20.99 18.4064 20.9426C18.4649 20.8953 18.5388 20.8712 18.6294 20.8712C18.7249 20.8712 18.8019 20.8961 18.8605 20.945C18.9199 20.994 18.9496 21.0574 18.9496 21.1336H18.8051C18.8051 21.0943 18.7883 21.0606 18.7554 21.0317C18.7217 21.0036 18.68 20.9892 18.6294 20.9892C18.5789 20.9892 18.5364 21.0004 18.5067 21.0237C18.477 21.0461 18.4625 21.0758 18.4625 21.1127C18.4625 21.1472 18.4762 21.1737 18.5035 21.1913C18.5307 21.209 18.5805 21.2258 18.6519 21.2419C18.7233 21.2579 18.7819 21.2772 18.826 21.2997C18.8701 21.3221 18.903 21.3486 18.9247 21.3799C18.9464 21.4112 18.9568 21.4489 18.9568 21.4946C18.9568 21.5692 18.9271 21.6294 18.8669 21.6752C18.8067 21.7201 18.7289 21.7434 18.6334 21.7434C18.566 21.7434 18.5067 21.7313 18.4553 21.7081C18.404 21.684 18.3631 21.6511 18.3342 21.6086C18.3053 21.566 18.29 21.5195 18.29 21.4698H18.4337C18.4361 21.5179 18.4553 21.5556 18.4914 21.5845C18.5275 21.6126 18.5749 21.627 18.6334 21.627C18.688 21.627 18.7313 21.6158 18.7642 21.5941C18.7971 21.5725 18.8132 21.5428 18.8132 21.5059L18.814 21.5035Z" fill="white"/>
+<path id="Vector_74" d="M19.0664 21.2988C19.0664 21.217 19.0825 21.1423 19.1145 21.0773C19.1466 21.0116 19.1916 20.961 19.2493 20.9257C19.3071 20.8904 19.3729 20.8719 19.4467 20.8719C19.5606 20.8719 19.6537 20.9113 19.7243 20.9907C19.7949 21.0701 19.8302 21.1752 19.8302 21.306V21.3164C19.8302 21.3983 19.815 21.4713 19.7837 21.5363C19.7524 21.6013 19.7075 21.6518 19.6497 21.6879C19.5911 21.724 19.5245 21.7425 19.4491 21.7425C19.3352 21.7425 19.2429 21.7032 19.1723 21.6237C19.1017 21.5443 19.0664 21.44 19.0664 21.31V21.2996V21.2988ZM19.21 21.3156C19.21 21.4087 19.2317 21.4833 19.275 21.5395C19.3183 21.5957 19.3761 21.6237 19.4483 21.6237C19.5205 21.6237 19.5791 21.5949 19.6216 21.5379C19.665 21.4809 19.6858 21.4007 19.6858 21.298C19.6858 21.2057 19.6641 21.1311 19.62 21.0741C19.5767 21.0172 19.5181 20.9883 19.4459 20.9883C19.3737 20.9883 19.3183 21.0164 19.2742 21.0725C19.2301 21.1287 19.2092 21.2097 19.2092 21.3148L19.21 21.3156Z" fill="white"/>
+</g>
+<path id="Vector_75" d="M25.8569 25.0298V25.1269H25.67V25.6147H25.5536V25.1269H25.3667V25.0298H25.8569ZM26.4892 25.6147L26.4675 25.2713C26.4651 25.2264 26.4651 25.1702 26.4635 25.1076H26.4571C26.4418 25.159 26.425 25.228 26.4073 25.2817L26.3022 25.6059H26.1819L26.0768 25.2729C26.0663 25.228 26.0487 25.159 26.0358 25.1076H26.0294C26.0294 25.1614 26.027 25.2175 26.0254 25.2713L26.0038 25.6147H25.8922L25.9356 25.0306H26.1097L26.2108 25.3162C26.2236 25.3612 26.234 25.4045 26.2493 25.4647H26.2517C26.2669 25.4109 26.2798 25.3612 26.2926 25.3186L26.3937 25.0306H26.5614L26.6063 25.6147H26.49H26.4892Z" fill="#231F20"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_6186_11887" x1="28" y1="14" x2="0" y2="14" gradientUnits="userSpaceOnUse">
+<stop stop-color="#2161AD"/>
+<stop offset="0.18" stop-color="#1F69B3"/>
+<stop offset="0.47" stop-color="#1C82C4"/>
+<stop offset="0.84" stop-color="#16A9E1"/>
+<stop offset="1" stop-color="#14BDEF"/>
+</linearGradient>
+<linearGradient id="paint1_linear_6186_11887" x1="3.13623" y1="13.9999" x2="24.8636" y2="13.9999" gradientUnits="userSpaceOnUse">
+<stop stop-color="#2161AD"/>
+<stop offset="0.18" stop-color="#1F69B3"/>
+<stop offset="0.47" stop-color="#1C82C4"/>
+<stop offset="0.84" stop-color="#16A9E1"/>
+<stop offset="1" stop-color="#14BDEF"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/common/sparkles-soft.svg b/app/components/base/icons/assets/public/common/sparkles-soft.svg
new file mode 100644
index 0000000..37f3072
--- /dev/null
+++ b/app/components/base/icons/assets/public/common/sparkles-soft.svg
@@ -0,0 +1,6 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="sparkles-soft">
+<path id="Vector" opacity="0.5" d="M10.9963 1.36798C10.9839 1.25339 10.8909 1.16677 10.7802 1.16666C10.6695 1.16654 10.5763 1.25295 10.5636 1.36752C10.5045 1.90085 10.3525 2.26673 10.1143 2.5149C9.87599 2.76307 9.52476 2.92145 9.01275 2.98296C8.90277 2.99618 8.81983 3.09324 8.81995 3.20856C8.82006 3.32388 8.90322 3.42076 9.0132 3.43373C9.51653 3.49312 9.87583 3.65148 10.1201 3.90135C10.3631 4.14986 10.518 4.51523 10.563 5.04321C10.573 5.16035 10.6673 5.25012 10.7802 5.24999C10.8931 5.24986 10.9872 5.15987 10.9969 5.0427C11.0401 4.52364 11.1949 4.15004 11.4394 3.89528C11.684 3.64052 12.0426 3.47926 12.5409 3.43433C12.6534 3.42419 12.7398 3.32619 12.7399 3.20858C12.7401 3.09097 12.6539 2.99277 12.5414 2.98236C12.0346 2.93546 11.6838 2.77407 11.4452 2.52098C11.2054 2.2665 11.0533 1.89229 10.9963 1.36798Z" fill="#F5F8FF"/>
+<path id="Vector_2" d="M7.13646 2.85102C7.10442 2.55638 6.8653 2.33365 6.5806 2.33334C6.29595 2.33304 6.05633 2.55526 6.02374 2.84984C5.87186 4.22127 5.48089 5.1621 4.86827 5.80025C4.25565 6.43838 3.35245 6.84566 2.03587 7.00386C1.75307 7.03781 1.53975 7.28742 1.54004 7.58393C1.54033 7.88049 1.75415 8.12958 2.03701 8.16294C3.33132 8.31566 4.25509 8.72289 4.88328 9.36543C5.50807 10.0045 5.90647 10.9439 6.02222 12.3016C6.04793 12.6029 6.29035 12.8337 6.58066 12.8333C6.87102 12.833 7.11294 12.6016 7.13797 12.3003C7.24885 10.9656 7.64695 10.0049 8.27583 9.34979C8.90477 8.69471 9.82698 8.28002 11.1083 8.16452C11.3976 8.13844 11.6197 7.88644 11.62 7.58399C11.6204 7.28159 11.3988 7.02906 11.1096 7.00229C9.8062 6.88171 8.90432 6.46673 8.29084 5.81589C7.674 5.16152 7.28306 4.19926 7.13646 2.85102Z" fill="#F5F8FF"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/education/triangle.svg b/app/components/base/icons/assets/public/education/triangle.svg
new file mode 100644
index 0000000..e52c5c5
--- /dev/null
+++ b/app/components/base/icons/assets/public/education/triangle.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="22" viewBox="0 0 16 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path id="Rectangle 979" d="M0 0H16L9.91493 16.7339C8.76529 19.8955 5.76063 22 2.39658 22H0V0Z" fill="white"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/files/csv.svg b/app/components/base/icons/assets/public/files/csv.svg
new file mode 100644
index 0000000..b108404
--- /dev/null
+++ b/app/components/base/icons/assets/public/files/csv.svg
@@ -0,0 +1,24 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="File Icons/csv">
+<g id="sharp" filter="url(#filter0_d_6816_769)">
+<path d="M4 7.73398C4 5.49377 4 4.37367 4.43597 3.51802C4.81947 2.76537 5.43139 2.15345 6.18404 1.76996C7.03969 1.33398 8.15979 1.33398 10.4 1.33398H18.6667L28 10.6673V24.2673C28 26.5075 28 27.6276 27.564 28.4833C27.1805 29.2359 26.5686 29.8478 25.816 30.2313C24.9603 30.6673 23.8402 30.6673 21.6 30.6673H10.4C8.15979 30.6673 7.03969 30.6673 6.18404 30.2313C5.43139 29.8478 4.81947 29.2359 4.43597 28.4833C4 27.6276 4 26.5075 4 24.2673V7.73398Z" fill="#169951"/>
+</g>
+<g id="CSV" opacity="0.96">
+<path d="M13.0846 21.8908C12.8419 23.3562 11.8246 24.0562 10.5646 24.0562C9.78992 24.0562 9.20192 23.7948 8.71659 23.3095C8.01659 22.6095 8.04459 21.6762 8.04459 20.6775C8.04459 19.6788 8.01659 18.7455 8.71659 18.0455C9.20192 17.5602 9.78992 17.2988 10.5646 17.2988C11.8246 17.2988 12.8419 17.9988 13.0846 19.4642H11.4233C11.3206 19.0908 11.1153 18.7548 10.5739 18.7548C10.2753 18.7548 10.0513 18.8762 9.92992 19.0348C9.78059 19.2308 9.67792 19.4642 9.67792 20.6775C9.67792 21.8908 9.78059 22.1242 9.92992 22.3202C10.0513 22.4788 10.2753 22.6002 10.5739 22.6002C11.1153 22.6002 11.3206 22.2642 11.4233 21.8908H13.0846Z" fill="white"/>
+<path d="M18.4081 21.9655C18.4081 23.3188 17.2414 24.0562 15.8414 24.0562C14.8241 24.0562 13.9934 23.8695 13.3214 23.1788L14.3668 22.1335C14.7121 22.4788 15.3188 22.6002 15.8508 22.6002C16.4948 22.6002 16.8028 22.3855 16.8028 22.0028C16.8028 21.8442 16.7654 21.7135 16.6721 21.6108C16.5881 21.5268 16.4481 21.4615 16.2334 21.4335L15.4308 21.3215C14.8428 21.2375 14.3948 21.0415 14.0961 20.7335C13.7881 20.4162 13.6388 19.9682 13.6388 19.3988C13.6388 18.1855 14.5534 17.2988 16.0654 17.2988C17.0174 17.2988 17.7361 17.5228 18.3054 18.0922L17.2788 19.1188C16.8588 18.6988 16.3081 18.7268 16.0188 18.7268C15.4494 18.7268 15.2161 19.0535 15.2161 19.3428C15.2161 19.4268 15.2441 19.5482 15.3468 19.6508C15.4308 19.7348 15.5708 19.8188 15.8041 19.8468L16.6068 19.9588C17.2041 20.0428 17.6334 20.2295 17.9134 20.5095C18.2681 20.8548 18.4081 21.3495 18.4081 21.9655Z" fill="white"/>
+<path d="M24.4166 17.3548L22.214 24.0002H21.0006L18.8073 17.3548H20.4966L21.6166 21.0695L22.718 17.3548H24.4166Z" fill="white"/>
+</g>
+<path id="bevel" opacity="0.5" d="M18.6667 1.33398L28.0001 10.6673H21.3334C19.8607 10.6673 18.6667 9.47341 18.6667 8.00065V1.33398Z" fill="white"/>
+</g>
+<defs>
+<filter id="filter0_d_6816_769" x="2" y="0.333984" width="28" height="33.334" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6816_769"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6816_769" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/files/doc.svg b/app/components/base/icons/assets/public/files/doc.svg
new file mode 100644
index 0000000..9a8aef5
--- /dev/null
+++ b/app/components/base/icons/assets/public/files/doc.svg
@@ -0,0 +1,22 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_17194_49206)">
+<path d="M4 7.73301C4 5.4928 4 4.37269 4.43597 3.51705C4.81947 2.7644 5.43139 2.15248 6.18404 1.76898C7.03969 1.33301 8.15979 1.33301 10.4 1.33301H18.6667L28 10.6663V24.2663C28 26.5066 28 27.6267 27.564 28.4823C27.1805 29.2349 26.5686 29.8469 25.816 30.2304C24.9603 30.6663 23.8402 30.6663 21.6 30.6663H10.4C8.15979 30.6663 7.03969 30.6663 6.18404 30.2304C5.43139 29.8469 4.81947 29.2349 4.43597 28.4823C4 27.6267 4 26.5066 4 24.2663V7.73301Z" fill="#2349A9"/>
+</g>
+<path opacity="0.5" d="M18.6665 1.33301L27.9998 10.6663H21.3332C19.8604 10.6663 18.6665 9.47243 18.6665 7.99967V1.33301Z" fill="white"/>
+<g opacity="0.96">
+<path d="M13.6329 21.4112C13.6329 22.2603 13.7059 22.9501 13.0326 23.5793C12.6351 23.9508 12.0754 24.11 11.4751 24.11H9.3335V18.7125H11.4751C12.0754 18.7125 12.6351 18.8717 13.0326 19.2431C13.7059 19.8723 13.6329 20.5622 13.6329 21.4112ZM12.2133 21.4112C12.2133 20.5015 12.1727 20.3499 12.0591 20.1983C11.9293 20.0164 11.7347 19.8951 11.3777 19.8951H10.7531V22.9274H11.3777C11.7347 22.9274 11.9293 22.8061 12.0591 22.6242C12.1727 22.4725 12.2133 22.3285 12.2133 21.4112Z" fill="white"/>
+<path d="M18.8275 21.4112C18.8275 22.2224 18.8519 22.9805 18.2435 23.549C17.8217 23.9432 17.3349 24.1555 16.6292 24.1555C15.9234 24.1555 15.4367 23.9432 15.0149 23.549C14.4065 22.9805 14.4308 22.2224 14.4308 21.4112C14.4308 20.6001 14.4065 19.842 15.0149 19.2735C15.4367 18.8793 15.9234 18.667 16.6292 18.667C17.3349 18.667 17.8217 18.8793 18.2435 19.2735C18.8519 19.842 18.8275 20.6001 18.8275 21.4112ZM17.4079 21.4112C17.4079 20.4257 17.3268 20.2438 17.197 20.0846C17.0916 19.9557 16.8888 19.8496 16.6292 19.8496C16.3696 19.8496 16.1668 19.9557 16.0613 20.0846C15.9316 20.2438 15.8504 20.4257 15.8504 21.4112C15.8504 22.3967 15.9316 22.5711 16.0613 22.7303C16.1668 22.8592 16.3696 22.9729 16.6292 22.9729C16.8888 22.9729 17.0916 22.8592 17.197 22.7303C17.3268 22.5711 17.4079 22.3967 17.4079 21.4112Z" fill="white"/>
+<path d="M24.0002 22.3967C23.7893 23.5869 22.905 24.1555 21.8099 24.1555C21.1366 24.1555 20.6256 23.9432 20.2037 23.549C19.5953 22.9805 19.6197 22.2224 19.6197 21.4112C19.6197 20.6001 19.5953 19.842 20.2037 19.2735C20.6256 18.8793 21.1366 18.667 21.8099 18.667C22.905 18.667 23.7893 19.2356 24.0002 20.4257H22.5562C22.467 20.1225 22.2885 19.8496 21.818 19.8496C21.5584 19.8496 21.3638 19.9481 21.2583 20.077C21.1285 20.2362 21.0393 20.4257 21.0393 21.4112C21.0393 22.3967 21.1285 22.5863 21.2583 22.7455C21.3638 22.8743 21.5584 22.9729 21.818 22.9729C22.2885 22.9729 22.467 22.7 22.5562 22.3967H24.0002Z" fill="white"/>
+</g>
+<defs>
+<filter id="filter0_d_17194_49206" x="2" y="0.333008" width="28" height="33.333" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_17194_49206"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_17194_49206" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/files/docx.svg b/app/components/base/icons/assets/public/files/docx.svg
new file mode 100644
index 0000000..5f8fa51
--- /dev/null
+++ b/app/components/base/icons/assets/public/files/docx.svg
@@ -0,0 +1,23 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_10291_62253)">
+<path d="M4 7.73301C4 5.4928 4 4.37269 4.43597 3.51705C4.81947 2.7644 5.43139 2.15248 6.18404 1.76898C7.03969 1.33301 8.15979 1.33301 10.4 1.33301H18.6667L28 10.6663V24.2663C28 26.5065 28 27.6267 27.564 28.4823C27.1805 29.2349 26.5686 29.8469 25.816 30.2304C24.9603 30.6663 23.8402 30.6663 21.6 30.6663H10.4C8.15979 30.6663 7.03969 30.6663 6.18404 30.2304C5.43139 29.8469 4.81947 29.2349 4.43597 28.4823C4 27.6267 4 26.5065 4 24.2663V7.73301Z" fill="#2349A9"/>
+</g>
+<path opacity="0.5" d="M18.6665 1.33301L27.9998 10.6663H21.3332C19.8604 10.6663 18.6665 9.47243 18.6665 7.99967V1.33301Z" fill="white"/>
+<g opacity="0.96">
+<path d="M10.8443 21.3337C10.8443 22.1587 10.9153 22.8291 10.261 23.4405C9.87477 23.8014 9.33086 23.9561 8.74754 23.9561H6.6665V18.7112H8.74754C9.33086 18.7112 9.87477 18.8659 10.261 19.2268C10.9153 19.8383 10.8443 20.5086 10.8443 21.3337ZM9.46487 21.3337C9.46487 20.4497 9.42545 20.3024 9.31509 20.155C9.18897 19.9782 8.99979 19.8604 8.65295 19.8604H8.04598V22.807H8.65295C8.99979 22.807 9.18897 22.6891 9.31509 22.5123C9.42545 22.365 9.46487 22.225 9.46487 21.3337Z" fill="white"/>
+<path d="M15.8922 21.3337C15.8922 22.1219 15.9158 22.8585 15.3246 23.411C14.9147 23.7941 14.4418 24.0003 13.756 24.0003C13.0702 24.0003 12.5972 23.7941 12.1873 23.411C11.5961 22.8585 11.6197 22.1219 11.6197 21.3337C11.6197 20.5454 11.5961 19.8088 12.1873 19.2563C12.5972 18.8733 13.0702 18.667 13.756 18.667C14.4418 18.667 14.9147 18.8733 15.3246 19.2563C15.9158 19.8088 15.8922 20.5454 15.8922 21.3337ZM14.5127 21.3337C14.5127 20.376 14.4339 20.1992 14.3077 20.0445C14.2053 19.9193 14.0082 19.8162 13.756 19.8162C13.5037 19.8162 13.3066 19.9193 13.2042 20.0445C13.078 20.1992 12.9992 20.376 12.9992 21.3337C12.9992 22.2913 13.078 22.4607 13.2042 22.6154C13.3066 22.7407 13.5037 22.8512 13.756 22.8512C14.0082 22.8512 14.2053 22.7407 14.3077 22.6154C14.4339 22.4607 14.5127 22.2913 14.5127 21.3337Z" fill="white"/>
+<path d="M20.9186 22.2913C20.7136 23.4478 19.8544 24.0003 18.7902 24.0003C18.136 24.0003 17.6394 23.7941 17.2295 23.411C16.6383 22.8585 16.6619 22.1219 16.6619 21.3337C16.6619 20.5454 16.6383 19.8088 17.2295 19.2563C17.6394 18.8733 18.136 18.667 18.7902 18.667C19.8544 18.667 20.7136 19.2195 20.9186 20.376H19.5154C19.4287 20.0814 19.2553 19.8162 18.7981 19.8162C18.5459 19.8162 18.3567 19.9119 18.2542 20.0372C18.1281 20.1919 18.0414 20.376 18.0414 21.3337C18.0414 22.2913 18.1281 22.4755 18.2542 22.6302C18.3567 22.7554 18.5459 22.8512 18.7981 22.8512C19.2553 22.8512 19.4287 22.586 19.5154 22.2913H20.9186Z" fill="white"/>
+<path d="M25.9998 23.9561H24.4233L23.501 22.3429L22.5787 23.9561H21.0022L22.7522 21.2674L21.1126 18.7112H22.6812L23.501 20.1919L24.3208 18.7112H25.8895L24.2499 21.2674L25.9998 23.9561Z" fill="white"/>
+</g>
+<defs>
+<filter id="filter0_d_10291_62253" x="2" y="0.333008" width="28" height="33.333" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_10291_62253"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_10291_62253" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/files/html.svg b/app/components/base/icons/assets/public/files/html.svg
new file mode 100644
index 0000000..f4db500
--- /dev/null
+++ b/app/components/base/icons/assets/public/files/html.svg
@@ -0,0 +1,23 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3055_14424)">
+<path d="M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z" fill="#EC5B27"/>
+</g>
+<g opacity="0.96">
+<path d="M10.2704 24.0002V18.3042H8.87042V20.4962H7.38242V18.3042H5.98242V24.0002H7.38242V21.7442H8.87042V24.0002H10.2704Z" fill="white"/>
+<path d="M15.2839 19.5522V18.3042H11.0839V19.5522H12.4839V24.0002H13.8839V19.5522H15.2839Z" fill="white"/>
+<path d="M21.4116 24.0002V18.3042H20.0356L18.7556 20.8162L17.4756 18.3042H16.0996V24.0002H17.4996V21.2722L18.3076 22.6802H19.2036L20.0116 21.2722V24.0002H21.4116Z" fill="white"/>
+<path d="M26.3525 24.0002V22.7522H23.9605V18.3042H22.5605V24.0002H26.3525Z" fill="white"/>
+</g>
+<path opacity="0.5" d="M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3055_14424" x="2" y="0.333496" width="28" height="33.3335" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3055_14424"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3055_14424" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/files/json.svg b/app/components/base/icons/assets/public/files/json.svg
new file mode 100644
index 0000000..0876828
--- /dev/null
+++ b/app/components/base/icons/assets/public/files/json.svg
@@ -0,0 +1,23 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3055_14428)">
+<path d="M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z" fill="#2D2D2E"/>
+</g>
+<g opacity="0.96">
+<path d="M9.83907 22.0479V18.3039H8.43907V22.0159C8.43907 22.5599 8.12707 22.7999 7.69507 22.7999C7.38307 22.7999 7.23907 22.6879 7.06307 22.5119L6.14307 23.4239C6.60707 23.8879 7.03107 24.0479 7.69507 24.0479C8.76707 24.0479 9.83907 23.3999 9.83907 22.0479Z" fill="white"/>
+<path d="M14.7321 22.2559C14.7321 21.7279 14.6121 21.3039 14.3081 21.0079C14.0681 20.7679 13.7001 20.6079 13.1881 20.5359L12.5001 20.4399C12.3001 20.4159 12.1801 20.3439 12.1081 20.2719C12.0201 20.1839 11.9961 20.0799 11.9961 20.0079C11.9961 19.7599 12.1961 19.4799 12.6841 19.4799C12.9321 19.4799 13.4041 19.4559 13.7641 19.8159L14.6441 18.9359C14.1561 18.4479 13.5401 18.2559 12.7241 18.2559C11.4281 18.2559 10.6441 19.0159 10.6441 20.0559C10.6441 20.5439 10.7721 20.9279 11.0361 21.1999C11.2921 21.4639 11.6761 21.6319 12.1801 21.7039L12.8681 21.7999C13.0521 21.8239 13.1721 21.8799 13.2441 21.9519C13.3241 22.0399 13.3561 22.1519 13.3561 22.2879C13.3561 22.6159 13.0921 22.7999 12.5401 22.7999C12.0841 22.7999 11.5641 22.6959 11.2681 22.3999L10.3721 23.2959C10.9481 23.8879 11.6601 24.0479 12.5321 24.0479C13.7321 24.0479 14.7321 23.4159 14.7321 22.2559Z" fill="white"/>
+<path d="M19.8023 21.1519C19.8023 20.2959 19.8263 19.4959 19.2263 18.8959C18.8103 18.4799 18.3303 18.2559 17.6343 18.2559C16.9383 18.2559 16.4583 18.4799 16.0423 18.8959C15.4423 19.4959 15.4663 20.2959 15.4663 21.1519C15.4663 22.0079 15.4423 22.8079 16.0423 23.4079C16.4583 23.8239 16.9383 24.0479 17.6343 24.0479C18.3303 24.0479 18.8103 23.8239 19.2263 23.4079C19.8263 22.8079 19.8023 22.0079 19.8023 21.1519ZM18.4023 21.1519C18.4023 22.1919 18.3223 22.3759 18.1943 22.5439C18.0903 22.6799 17.8903 22.7999 17.6343 22.7999C17.3783 22.7999 17.1783 22.6799 17.0743 22.5439C16.9463 22.3759 16.8663 22.1919 16.8663 21.1519C16.8663 20.1119 16.9463 19.9199 17.0743 19.7519C17.1783 19.6159 17.3783 19.5039 17.6343 19.5039C17.8903 19.5039 18.0903 19.6159 18.1943 19.7519C18.3223 19.9199 18.4023 20.1119 18.4023 21.1519Z" fill="white"/>
+<path d="M25.2154 23.9999V18.3039H23.8154V21.1679L21.9914 18.3039H20.7674V23.9999H22.1674V21.1359L23.9914 23.9999H25.2154Z" fill="white"/>
+</g>
+<path opacity="0.5" d="M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3055_14428" x="2" y="0.333496" width="28" height="33.3335" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3055_14428"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3055_14428" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/files/md.svg b/app/components/base/icons/assets/public/files/md.svg
new file mode 100644
index 0000000..d730b5a
--- /dev/null
+++ b/app/components/base/icons/assets/public/files/md.svg
@@ -0,0 +1,18 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3777_37339)">
+<path d="M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z" fill="#309BEC"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M21.9904 25.3335H10.0096C9.45202 25.3335 9 24.9138 9 24.396V18.271C9 17.7532 9.45202 17.3335 10.0096 17.3335H21.9904C22.548 17.3335 23 17.7532 23 18.271V24.396C23 24.9138 22.548 25.3335 21.9904 25.3335ZM12.3654 23.4585V21.021L13.7115 22.5835L15.0577 21.021V23.4585H16.4038V19.2085H15.0577L13.7115 20.771L12.3654 19.2085H11.0192V23.4585H12.3654ZM20.0385 21.3335H21.3846L19.3654 23.521L17.3462 21.3335H18.6923V19.2085H20.0385V21.3335Z" fill="white"/>
+<path opacity="0.5" d="M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3777_37339" x="2" y="0.333496" width="28" height="33.3335" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3777_37339"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3777_37339" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/files/pdf.svg b/app/components/base/icons/assets/public/files/pdf.svg
new file mode 100644
index 0000000..bc63229
--- /dev/null
+++ b/app/components/base/icons/assets/public/files/pdf.svg
@@ -0,0 +1,22 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3055_14420)">
+<path d="M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z" fill="#DD3633"/>
+</g>
+<g opacity="0.96">
+<path d="M13.2801 20.1362C13.2801 19.2002 12.6001 18.3042 11.3361 18.3042H9.08008V24.0002H10.4801V21.9682H11.3361C12.6001 21.9682 13.2801 21.0722 13.2801 20.1362ZM11.8801 20.1362C11.8801 20.4322 11.6561 20.7122 11.2721 20.7122H10.4801V19.5602H11.2721C11.6561 19.5602 11.8801 19.8402 11.8801 20.1362Z" fill="white"/>
+<path d="M18.3357 21.1522C18.3357 20.2562 18.4077 19.5282 17.7437 18.8642C17.3517 18.4722 16.7997 18.3042 16.2077 18.3042H14.0957V24.0002H16.2077C16.7997 24.0002 17.3517 23.8322 17.7437 23.4402C18.4077 22.7762 18.3357 22.0482 18.3357 21.1522ZM16.9357 21.1522C16.9357 22.1202 16.8957 22.2722 16.7837 22.4322C16.6557 22.6242 16.4637 22.7522 16.1117 22.7522H15.4957V19.5522H16.1117C16.4637 19.5522 16.6557 19.6802 16.7837 19.8722C16.8957 20.0322 16.9357 20.1922 16.9357 21.1522Z" fill="white"/>
+<path d="M23.1786 19.5522V18.3042H19.3066V24.0002H20.7066V21.8002H22.8186V20.5522H20.7066V19.5522H23.1786Z" fill="white"/>
+</g>
+<path opacity="0.5" d="M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3055_14420" x="2" y="0.333496" width="28" height="33.3335" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3055_14420"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3055_14420" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/files/txt.svg b/app/components/base/icons/assets/public/files/txt.svg
new file mode 100644
index 0000000..d1b6a8c
--- /dev/null
+++ b/app/components/base/icons/assets/public/files/txt.svg
@@ -0,0 +1,23 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3055_14432)">
+<path d="M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z" fill="#E3E5E8"/>
+<path d="M4.25 7.73349C4.25 6.60926 4.25019 5.78113 4.30367 5.12666C4.3569 4.47511 4.46169 4.01774 4.65873 3.63103C5.01825 2.92542 5.59193 2.35175 6.29754 1.99222C6.68424 1.79518 7.14162 1.6904 7.79317 1.63716C8.44763 1.58369 9.27577 1.5835 10.4 1.5835H18.5631L27.75 10.7704V24.2668C27.75 25.3911 27.7498 26.2192 27.6963 26.8737C27.6431 27.5252 27.5383 27.9826 27.3413 28.3693C26.9817 29.0749 26.4081 29.6486 25.7025 30.0081C25.3158 30.2051 24.8584 30.3099 24.2068 30.3632C23.5524 30.4166 22.7242 30.4168 21.6 30.4168H10.4C9.27577 30.4168 8.44763 30.4166 7.79317 30.3632C7.14162 30.3099 6.68424 30.2051 6.29754 30.0081C5.59193 29.6486 5.01825 29.0749 4.65873 28.3693C4.46169 27.9826 4.3569 27.5252 4.30367 26.8737C4.25019 26.2192 4.25 25.3911 4.25 24.2668V7.73349Z" stroke="black" stroke-opacity="0.03" stroke-width="0.5"/>
+</g>
+<g opacity="0.96">
+<path d="M13.2254 19.5522V18.3042H9.02539V19.5522H10.4254V24.0002H11.8254V19.5522H13.2254Z" fill="#667085"/>
+<path d="M18.5371 24.0002L16.7611 21.0802L18.4251 18.3042H16.8331L16.0011 19.9122L15.1691 18.3042H13.5771L15.2411 21.0802L13.4651 24.0002H15.0651L16.0011 22.2482L16.9371 24.0002H18.5371Z" fill="#667085"/>
+<path d="M22.9754 19.5522V18.3042H18.7754V19.5522H20.1754V24.0002H21.5754V19.5522H22.9754Z" fill="#667085"/>
+</g>
+<path opacity="0.5" d="M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3055_14432" x="2" y="0.333496" width="28" height="33.3335" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3055_14432"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3055_14432" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/files/unknown.svg b/app/components/base/icons/assets/public/files/unknown.svg
new file mode 100644
index 0000000..6daa243
--- /dev/null
+++ b/app/components/base/icons/assets/public/files/unknown.svg
@@ -0,0 +1,23 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3055_14436)">
+<path d="M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z" fill="#E3E5E8"/>
+<path d="M4.25 7.73349C4.25 6.60926 4.25019 5.78113 4.30367 5.12666C4.3569 4.47511 4.46169 4.01774 4.65873 3.63103C5.01825 2.92542 5.59193 2.35175 6.29754 1.99222C6.68424 1.79518 7.14162 1.6904 7.79317 1.63716C8.44763 1.58369 9.27577 1.5835 10.4 1.5835H18.5631L27.75 10.7704V24.2668C27.75 25.3911 27.7498 26.2192 27.6963 26.8737C27.6431 27.5252 27.5383 27.9826 27.3413 28.3693C26.9817 29.0749 26.4081 29.6486 25.7025 30.0081C25.3158 30.2051 24.8584 30.3099 24.2068 30.3632C23.5524 30.4166 22.7242 30.4168 21.6 30.4168H10.4C9.27577 30.4168 8.44763 30.4166 7.79317 30.3632C7.14162 30.3099 6.68424 30.2051 6.29754 30.0081C5.59193 29.6486 5.01825 29.0749 4.65873 28.3693C4.46169 27.9826 4.3569 27.5252 4.30367 26.8737C4.25019 26.2192 4.25 25.3911 4.25 24.2668V7.73349Z" stroke="black" stroke-opacity="0.03" stroke-width="0.5"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M15.9998 23.1992C15.8014 23.1992 15.6039 23.1968 15.4077 23.1924V24.0549C15.4077 24.3819 15.6728 24.647 15.9998 24.647C16.3268 24.647 16.592 24.3819 16.592 24.0549V23.1924C16.3957 23.1968 16.1983 23.1992 15.9998 23.1992Z" fill="#98A2B3"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.0984 22.8838L11.757 23.8593C11.649 24.168 11.8117 24.5058 12.1203 24.6138C12.185 24.6364 12.251 24.6472 12.3159 24.6472C12.5605 24.6472 12.7894 24.4944 12.8747 24.2505L13.2936 23.0534C12.8807 23.0073 12.481 22.9506 12.0984 22.8838Z" fill="#98A2B3"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M20.2431 23.8593L19.9018 22.8838C19.5192 22.9506 19.1195 23.0073 18.7065 23.0534L19.1254 24.2505C19.2108 24.4944 19.4396 24.6472 19.6843 24.6472C19.7491 24.6472 19.8151 24.6364 19.8798 24.6138C20.1885 24.5058 20.3511 24.168 20.2431 23.8593Z" fill="#98A2B3"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M20.1624 17.2634C20.2697 17.6416 20.3254 18.0369 20.3254 18.4409C20.3254 18.9087 20.05 19.3327 19.6226 19.5228C19.5564 19.5522 17.9801 20.2436 16.0359 20.2436C14.0917 20.2436 12.5153 19.5522 12.4492 19.5228C12.0218 19.3327 11.7464 18.9086 11.7464 18.4409C11.7464 18.0312 11.8037 17.6305 11.914 17.2476C10.3343 17.5645 8.5 18.2009 8.5 19.4464C8.5 20.2859 9.32512 20.9477 10.9525 21.4134C11.4194 21.547 11.9381 21.66 12.4949 21.7506C12.8783 21.813 13.28 21.8648 13.6953 21.9056C14.2455 21.9597 14.8197 21.9942 15.4079 22.0082C15.6039 22.0128 15.8013 22.0153 16 22.0153C16.1987 22.0153 16.3962 22.0128 16.5921 22.0082C17.1803 21.9943 17.7545 21.9596 18.3047 21.9056C18.72 21.8648 19.1217 21.8131 19.5051 21.7506C20.062 21.66 20.5807 21.547 21.0476 21.4134C22.6749 20.9477 23.5 20.2859 23.5 19.4464C23.5 18.2187 21.7108 17.5833 20.1624 17.2634Z" fill="#98A2B3"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M18.8441 17.1144C18.7585 16.9335 18.6559 16.7622 18.5384 16.6025C18.4174 16.4382 18.2809 16.286 18.1307 16.1486C17.5784 15.6437 16.8433 15.3354 16.036 15.3354C15.2318 15.3354 14.499 15.6411 13.9476 16.1426C13.7974 16.2791 13.6609 16.4303 13.5399 16.5937C13.4217 16.753 13.3185 16.924 13.2322 17.1048C13.039 17.5095 12.9307 17.9624 12.9307 18.4407C12.9307 18.4407 14.321 19.0592 16.036 19.0592C17.751 19.0592 19.1412 18.4407 19.1412 18.4407C19.1412 17.9662 19.0344 17.5167 18.8441 17.1144Z" fill="#98A2B3"/>
+<path opacity="0.5" d="M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3055_14436" x="2" y="0.333496" width="28" height="33.3335" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3055_14436"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3055_14436" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/files/xlsx.svg b/app/components/base/icons/assets/public/files/xlsx.svg
new file mode 100644
index 0000000..2cdf42c
--- /dev/null
+++ b/app/components/base/icons/assets/public/files/xlsx.svg
@@ -0,0 +1,18 @@
+<svg width="24" height="26" viewBox="0 0 24 26" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_5938_927)">
+<path d="M3 5.8C3 4.11984 3 3.27976 3.32698 2.63803C3.6146 2.07354 4.07354 1.6146 4.63803 1.32698C5.27976 1 6.11984 1 7.8 1H14L21 8V18.2C21 19.8802 21 20.7202 20.673 21.362C20.3854 21.9265 19.9265 22.3854 19.362 22.673C18.7202 23 17.8802 23 16.2 23H7.8C6.11984 23 5.27976 23 4.63803 22.673C4.07354 22.3854 3.6146 21.9265 3.32698 21.362C3 20.7202 3 19.8802 3 18.2V5.8Z" fill="#169951"/>
+</g>
+<path opacity="0.5" d="M14 1L21 8H16C14.8954 8 14 7.10457 14 6V1Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M17 12C17.5523 12 18 12.4477 18 13V18C18 18.5523 17.5523 19 17 19H7C6.44772 19 6 18.5523 6 18V13C6 12.4477 6.44772 12 7 12H17ZM11.5 13H7L7 15H11.5V13ZM12.5 18H17V16H12.5V18ZM11.5 16V18H7L7 16H11.5ZM12.5 15H17V13H12.5V15Z" fill="white" fill-opacity="0.96"/>
+<defs>
+<filter id="filter0_d_5938_927" x="1" y="0" width="22" height="26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5938_927"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5938_927" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/files/yaml.svg b/app/components/base/icons/assets/public/files/yaml.svg
new file mode 100644
index 0000000..c7c3f54
--- /dev/null
+++ b/app/components/base/icons/assets/public/files/yaml.svg
@@ -0,0 +1 @@
+<svg fill="none" height="26" viewBox="0 0 24 26" width="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><filter id="a" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="26" width="22" x="1" y="0"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" result="hardAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="1"/><feGaussianBlur stdDeviation="1"/><feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/><feBlend in2="BackgroundImageFix" mode="normal" result="effect1_dropShadow_7605_8828"/><feBlend in="SourceGraphic" in2="effect1_dropShadow_7605_8828" mode="normal" result="shape"/></filter><g filter="url(#a)"><path d="m3 5.8c0-1.68016 0-2.52024.32698-3.16197.28762-.56449.74656-1.02343 1.31105-1.31105.64173-.32698 1.48181-.32698 3.16197-.32698h6.2l7 7v10.2c0 1.6802 0 2.5202-.327 3.162-.2876.5645-.7465 1.0234-1.311 1.311-.6418.327-1.4818.327-3.162.327h-8.4c-1.68016 0-2.52024 0-3.16197-.327-.56449-.2876-1.02343-.7465-1.31105-1.311-.32698-.6418-.32698-1.4818-.32698-3.162z" fill="#e8eaed"/><path d="m16.2 22.75h-8.4c-.8442 0-1.46232-.0002-1.95004-.04-.48479-.0397-.81868-.1172-1.09843-.2597-.51745-.2637-.93815-.6844-1.2018-1.2018-.14254-.2798-.22008-.6137-.25969-1.0985-.03985-.4877-.04004-1.1058-.04004-1.95v-12.4c0-.8442.00019-1.46232.04004-1.95004.03961-.48479.11715-.81868.25969-1.09843.26365-.51745.68435-.93815 1.2018-1.2018.27975-.14254.61364-.22008 1.09843-.25969.48772-.03985 1.10584-.04004 1.95004-.04004h6.0964l6.8536 6.85355v10.09645c0 .8442-.0002 1.4623-.04 1.95-.0397.4848-.1172.8187-.2597 1.0985-.2637.5174-.6844.9381-1.2018 1.2018-.2798.1425-.6137.22-1.0985.2597-.4877.0398-1.1058.04-1.95.04z" stroke="#000" stroke-opacity=".03" stroke-width=".5"/></g><path d="m14 1 7 7h-5c-1.1046 0-2-.89543-2-2z" fill="#fff" opacity=".5"/><path d="m11.5264 9-2.15191 3.2267v2.0455h-1.31897v-2.0455l-2.05552-3.2267h1.48242l1.30707 2.0776 1.31781-2.0776z" fill="#000"/><path d="m13.7426 13.1121h-2.3874l-.4855 1.1724h-1.0572l2.2355-5.27223h1.0813l2.1448 5.27223h-1.1297zm-.3966-1.0526-.7318-1.9348-.8165 1.9348z" fill="#cb171e"/><g fill="#000"><path d="m8.05469 14.8635v5.1673h1.10866v-3.5643l1.16025 2.3957h.8727l1.1999-2.4799v3.6474h1.0636v-5.1662h-1.4522l-1.2885 2.3369-1.22722-2.3369z"/><path d="m17.9994 18.9079h-2.7272v-4.0456h-1.1296v5.1451h3.8568z"/></g></svg>
\ No newline at end of file
diff --git a/app/components/base/icons/assets/public/knowledge/chunk.svg b/app/components/base/icons/assets/public/knowledge/chunk.svg
new file mode 100644
index 0000000..1dc0494
--- /dev/null
+++ b/app/components/base/icons/assets/public/knowledge/chunk.svg
@@ -0,0 +1,13 @@
+<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Group">
+<path id="Vector" d="M2.5 10H0V7.5H2.5V10Z" fill="#676F83"/>
+<path id="Vector_2" d="M6.25 6.25H3.75V3.75H6.25V6.25Z" fill="#676F83"/>
+<path id="Vector_3" d="M2.5 6.25H0V3.75H2.5V6.25Z" fill="#676F83"/>
+<path id="Vector_4" d="M6.25 2.5H3.75V0H6.25V2.5Z" fill="#676F83"/>
+<path id="Vector_5" d="M2.5 2.5H0V0H2.5V2.5Z" fill="#676F83"/>
+<path id="Vector_6" d="M10 2.5H7.5V0H10V2.5Z" fill="#676F83"/>
+<path id="Vector_7" d="M9.58342 7.91663H7.91675V9.58329H9.58342V7.91663Z" fill="#676F83"/>
+<path id="Vector_8" d="M9.58342 4.16663H7.91675V5.83329H9.58342V4.16663Z" fill="#676F83"/>
+<path id="Vector_9" d="M5.83341 7.91663H4.16675V9.58329H5.83341V7.91663Z" fill="#676F83"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/knowledge/collapse.svg b/app/components/base/icons/assets/public/knowledge/collapse.svg
new file mode 100644
index 0000000..b54e046
--- /dev/null
+++ b/app/components/base/icons/assets/public/knowledge/collapse.svg
@@ -0,0 +1,9 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon L">
+<g id="Vector">
+<path d="M2.66602 11.3333H0.666016L3.33268 8.66667L5.99935 11.3333H3.99935L3.99935 14H2.66602L2.66602 11.3333Z" fill="#354052"/>
+<path d="M2.66602 4.66667L2.66602 2L3.99935 2L3.99935 4.66667L5.99935 4.66667L3.33268 7.33333L0.666016 4.66667L2.66602 4.66667Z" fill="#354052"/>
+<path d="M7.33268 2.66667H13.9993V4H7.33268V2.66667ZM7.33268 12H13.9993V13.3333H7.33268V12ZM5.99935 7.33333H13.9993V8.66667H5.99935V7.33333Z" fill="#354052"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/knowledge/general-type.svg b/app/components/base/icons/assets/public/knowledge/general-type.svg
new file mode 100644
index 0000000..779df5f
--- /dev/null
+++ b/app/components/base/icons/assets/public/knowledge/general-type.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon L">
+<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M6 0.5C6.27615 0.5 6.5 0.72386 6.5 1V1.52755C6.95855 1.57831 7.3967 1.69804 7.80355 1.87619L8.067 1.41997C8.20505 1.18083 8.51085 1.09889 8.75 1.23696C8.98915 1.37503 9.07105 1.68082 8.933 1.91998L8.6692 2.37685C9.033 2.64523 9.3548 2.96707 9.6232 3.33084L10.0801 3.06703C10.3193 2.92896 10.6251 3.0109 10.7632 3.25005C10.9012 3.4892 10.8193 3.79499 10.5801 3.93306L10.1238 4.19649C10.302 4.60333 10.4218 5.0415 10.4725 5.50005H11C11.2761 5.50005 11.5 5.7239 11.5 6.00005C11.5 6.2762 11.2761 6.50005 11 6.50005H10.4725C10.4218 6.9586 10.302 7.3968 10.1238 7.80365L10.5801 8.0671C10.8193 8.20515 10.9012 8.51095 10.7632 8.7501C10.6251 8.98925 10.3193 9.0712 10.0801 8.9331L9.6232 8.6693C9.3548 9.03305 9.03295 9.3549 8.6692 9.62325L8.933 10.0802C9.07105 10.3193 8.98915 10.6251 8.75 10.7632C8.51085 10.9012 8.20505 10.8193 8.067 10.5802L7.80355 10.1239C7.3967 10.3021 6.95855 10.4218 6.5 10.4726V11C6.5 11.2761 6.27615 11.5 6 11.5C5.72385 11.5 5.5 11.2761 5.5 11V10.4726C5.04145 10.4218 4.60328 10.3021 4.19644 10.1239L3.933 10.5802C3.79493 10.8194 3.48914 10.9013 3.24999 10.7633C3.01084 10.6252 2.92891 10.3194 3.06698 10.0802L3.3308 9.62325C2.96702 9.3549 2.64517 9.03305 2.37678 8.66925L1.91986 8.93305C1.68071 9.07115 1.37492 8.9892 1.23685 8.75005C1.09878 8.5109 1.18072 8.2051 1.41986 8.06705L1.87612 7.8036C1.69797 7.39675 1.57824 6.9586 1.52749 6.50005L0.999975 6.5C0.723835 6.5 0.499987 6.2761 0.5 6C0.500015 5.72385 0.72388 5.5 1.00003 5.5L1.5275 5.50005C1.57825 5.0415 1.69796 4.60335 1.87611 4.19652L1.41987 3.93312C1.18072 3.79504 1.09878 3.48925 1.23685 3.2501C1.37492 3.01095 1.68071 2.92901 1.91985 3.06709L2.37675 3.33086C2.64514 2.96708 2.967 2.64524 3.33078 2.37684L3.06698 1.91992C2.92891 1.68077 3.01084 1.37498 3.24999 1.23691C3.48914 1.09884 3.79493 1.18077 3.933 1.41992L4.19642 1.87619C4.60327 1.69803 5.04145 1.57831 5.5 1.52755V1C5.5 0.72386 5.72385 0.5 6 0.5ZM3.83484 3.24991C3.48643 3.52463 3.19141 3.86415 2.96808 4.25014C2.67048 4.7645 2.49999 5.3616 2.49999 6.00005C2.49999 6.6385 2.67048 7.2356 2.96809 7.75C3.19142 8.13595 3.48645 8.4755 3.83486 8.7502L4.8599 6.97475C4.63581 6.71285 4.49999 6.37245 4.49999 6.00005C4.49999 5.62765 4.63581 5.28725 4.8599 5.02535L3.83484 3.24991ZM5.7258 4.52514L4.70041 2.74911C5.10185 2.58847 5.5402 2.50005 6 2.50005C6.63845 2.50005 7.23555 2.67054 7.74995 2.96816C8.28125 3.27557 8.7245 3.71882 9.0319 4.25012C9.2503 4.62764 9.4003 5.04975 9.4646 5.50005H7.41465C7.2087 4.91745 6.6531 4.50005 6 4.50005C5.9065 4.50005 5.8148 4.50865 5.7258 4.52514ZM7.41465 6.50005C7.2087 7.08265 6.6531 7.50005 6 7.50005C5.9065 7.50005 5.8148 7.49145 5.7258 7.47495L4.70043 9.251C5.10185 9.41165 5.5402 9.50005 6 9.50005C6.63845 9.50005 7.23555 9.32955 7.7499 9.03195C8.2812 8.72455 8.72445 8.2813 9.03185 7.75C9.2503 7.3725 9.4003 6.95035 9.4646 6.50005H7.41465Z" fill="#676F83"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/knowledge/layout-right-2-line-mod.svg b/app/components/base/icons/assets/public/knowledge/layout-right-2-line-mod.svg
new file mode 100644
index 0000000..188f9b5
--- /dev/null
+++ b/app/components/base/icons/assets/public/knowledge/layout-right-2-line-mod.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon L">
+<path id="Vector" d="M14.0002 2C14.3684 2 14.6668 2.29848 14.6668 2.66667V13.3333C14.6668 13.7015 14.3684 14 14.0002 14H2.00016C1.63198 14 1.3335 13.7015 1.3335 13.3333V2.66667C1.3335 2.29848 1.63198 2 2.00016 2H14.0002ZM13.3335 3.33333H2.66683V12.6667H13.3335V3.33333ZM14.0002 2.66667V13.3333H10.0002V2.66667H14.0002Z" fill="#354052"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/knowledge/parent-child-type.svg b/app/components/base/icons/assets/public/knowledge/parent-child-type.svg
new file mode 100644
index 0000000..bc596b6
--- /dev/null
+++ b/app/components/base/icons/assets/public/knowledge/parent-child-type.svg
@@ -0,0 +1,7 @@
+<svg width="10" height="11" viewBox="0 0 10 11" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Group">
+<path id="Vector" d="M2.70833 3.87501C3.51375 3.87501 4.16666 3.22209 4.16666 2.41668C4.16666 1.61126 3.51375 0.958344 2.70833 0.958344C1.90292 0.958344 1.25 1.61126 1.25 2.41668C1.25 3.22209 1.90292 3.87501 2.70833 3.87501Z" fill="#676F83"/>
+<path id="Vector_2" d="M7.29158 3.87501C8.097 3.87501 8.74992 3.22209 8.74992 2.41668C8.74992 1.61126 8.097 0.958344 7.29158 0.958344C6.48617 0.958344 5.83325 1.61126 5.83325 2.41668C5.83325 3.22209 6.48617 3.87501 7.29158 3.87501Z" fill="#676F83"/>
+<path id="Vector_3" d="M7.29167 4.70835C6.83771 4.70886 6.39118 4.82363 5.99324 5.04208C5.59529 5.26053 5.25874 5.57563 5.01459 5.95835C5.34482 5.9622 5.66011 6.09658 5.89159 6.33215C6.12306 6.56771 6.25191 6.8853 6.24998 7.21555C6.24805 7.5458 6.11551 7.86187 5.8813 8.09472C5.6471 8.32756 5.33026 8.45826 5 8.45826C4.66975 8.45826 4.35291 8.32756 4.1187 8.09472C3.8845 7.86187 3.75195 7.5458 3.75003 7.21555C3.7481 6.8853 3.87695 6.56771 4.10842 6.33215C4.3399 6.09658 4.65519 5.9622 4.98542 5.95835C4.67086 5.46415 4.20432 5.08546 3.656 4.87926C3.10767 4.67306 2.50721 4.6505 1.94496 4.81497C1.3827 4.97944 0.889064 5.32205 0.538306 5.79125C0.187547 6.26045 -0.00135882 6.83086 7.35834e-06 7.41668V10.125C7.35834e-06 10.2355 0.043906 10.3415 0.122046 10.4196C0.200186 10.4978 0.306167 10.5417 0.416674 10.5417H3.33334V9.50001L1.83334 8.37501C1.78957 8.34218 1.75269 8.30105 1.72481 8.25397C1.69693 8.20688 1.6786 8.15477 1.67086 8.1006C1.65523 7.99121 1.6837 7.88008 1.75001 7.79168C1.81631 7.70327 1.91502 7.64483 2.02441 7.6292C2.13381 7.61357 2.24493 7.64204 2.33334 7.70835L3.88875 8.87501H6.11125L7.66667 7.70835C7.75507 7.64204 7.8662 7.61357 7.97559 7.6292C8.08499 7.64483 8.1837 7.70327 8.25 7.79168C8.31631 7.88008 8.34478 7.99121 8.32915 8.1006C8.31352 8.21 8.25507 8.30871 8.16667 8.37501L6.66667 9.50001V10.5417H9.58333C9.69384 10.5417 9.79982 10.4978 9.87796 10.4196C9.9561 10.3415 10 10.2355 10 10.125V7.41668C9.99912 6.69866 9.71349 6.01029 9.20577 5.50257C8.69805 4.99485 8.00969 4.70923 7.29167 4.70835Z" fill="#676F83"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/knowledge/selection-mod.svg b/app/components/base/icons/assets/public/knowledge/selection-mod.svg
new file mode 100644
index 0000000..ae3c9c5
--- /dev/null
+++ b/app/components/base/icons/assets/public/knowledge/selection-mod.svg
@@ -0,0 +1,13 @@
+<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Group">
+<path id="Vector" d="M2.5 10H0V7.5H2.5V10Z" fill="#676F83"/>
+<path id="Vector_2" d="M6.25 6.25H3.75V3.75H6.25V6.25Z" fill="#676F83"/>
+<path id="Vector_3" d="M2.5 6.25H0V3.75H2.5V6.25Z" fill="#676F83"/>
+<path id="Vector_4" d="M6.25 2.5H3.75V0H6.25V2.5Z" fill="#676F83"/>
+<path id="Vector_5" d="M2.5 2.5H0V0H2.5V2.5Z" fill="#676F83"/>
+<path id="Vector_6" d="M10 2.5H7.5V0H10V2.5Z" fill="#676F83"/>
+<path id="Vector_7" d="M9.58332 7.91663H7.91666V9.58329H9.58332V7.91663Z" fill="#676F83"/>
+<path id="Vector_8" d="M9.58332 4.16663H7.91666V5.83329H9.58332V4.16663Z" fill="#676F83"/>
+<path id="Vector_9" d="M5.83332 7.91663H4.16666V9.58329H5.83332V7.91663Z" fill="#676F83"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/Anthropic-dark.svg b/app/components/base/icons/assets/public/llm/Anthropic-dark.svg
new file mode 100644
index 0000000..57abb73
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/Anthropic-dark.svg
@@ -0,0 +1,186 @@
+<svg width="90" height="10" viewBox="0 0 90 10" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Anthropic" clip-path="url(#clip0_5981_49007)">
+<g id="Clip path group">
+<mask id="mask0_5981_49007" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_2">
+<path id="Vector" d="M89.375 -0.00195312H0V9.99805H89.375V-0.00195312Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask0_5981_49007)">
+<g id="Group">
+<g id="Clip path group_2">
+<mask id="mask1_5981_49007" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_4">
+<path id="Vector_2" d="M0 -0.00390625H89.375V9.99609H0V-0.00390625Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask1_5981_49007)">
+<g id="Group_2">
+<g id="Clip path group_3">
+<mask id="mask2_5981_49007" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_12">
+<path id="Vector_3" d="M0 -0.00585938H89.375V9.99414H0V-0.00585938Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask2_5981_49007)">
+<g id="Group_3">
+<g id="Clip path group_4">
+<mask id="mask3_5981_49007" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_89">
+<path id="Vector_4" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask3_5981_49007)">
+<g id="Group_4">
+<g id="Group_5">
+<g id="Group_6">
+<path id="Vector_5" d="M18.1273 6.92438L13.7773 0.15625H11.4297V9.82501H13.4321V3.05688L17.7821 9.82501H20.1297V0.15625H18.1273V6.92438Z" fill="black" fill-opacity="0.95"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_5">
+<mask id="mask4_5981_49007" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_80">
+<path id="Vector_6" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask4_5981_49007)">
+<g id="Group_7">
+<g id="Group_8">
+<g id="Group_9">
+<path id="Vector_7" d="M21.7969 2.02094H25.0423V9.82501H27.1139V2.02094H30.3594V0.15625H21.7969V2.02094Z" fill="black" fill-opacity="0.95"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_6">
+<mask id="mask5_5981_49007" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_71">
+<path id="Vector_8" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask5_5981_49007)">
+<g id="Group_10">
+<g id="Group_11">
+<g id="Group_12">
+<path id="Vector_9" d="M38.6442 4.00994H34.0871V0.15625H32.0156V9.82501H34.0871V5.87463H38.6442V9.82501H40.7156V0.15625H38.6442V4.00994Z" fill="black" fill-opacity="0.95"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_7">
+<mask id="mask6_5981_49007" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_62">
+<path id="Vector_10" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask6_5981_49007)">
+<g id="Group_13">
+<g id="Group_14">
+<g id="Group_15">
+<path id="Vector_11" d="M45.3376 2.02094H47.893C48.9152 2.02094 49.4539 2.39387 49.4539 3.09831C49.4539 3.80275 48.9152 4.17569 47.893 4.17569H45.3376V2.02094ZM51.5259 3.09831C51.5259 1.27506 50.186 0.15625 47.9897 0.15625H43.2656V9.82501H45.3376V6.04037H47.6443L49.7164 9.82501H52.0094L49.715 5.75211C50.8666 5.30941 51.5259 4.37721 51.5259 3.09831Z" fill="black" fill-opacity="0.95"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_8">
+<mask id="mask7_5981_49007" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_53">
+<path id="Vector_12" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask7_5981_49007)">
+<g id="Group_16">
+<g id="Group_17">
+<g id="Group_18">
+<path id="Vector_13" d="M57.8732 8.05653C56.2438 8.05653 55.2496 6.89631 55.2496 5.00404C55.2496 3.08416 56.2438 1.92394 57.8732 1.92394C59.4887 1.92394 60.4691 3.08416 60.4691 5.00404C60.4691 6.89631 59.4887 8.05653 57.8732 8.05653ZM57.8732 -0.00976562C55.0839 -0.00976562 53.1094 2.06206 53.1094 5.00404C53.1094 7.91841 55.0839 9.99023 57.8732 9.99023C60.6486 9.99023 62.6094 7.91841 62.6094 5.00404C62.6094 2.06206 60.6486 -0.00976562 57.8732 -0.00976562Z" fill="black" fill-opacity="0.95"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_9">
+<mask id="mask8_5981_49007" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_44">
+<path id="Vector_14" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask8_5981_49007)">
+<g id="Group_19">
+<g id="Group_20">
+<g id="Group_21">
+<path id="Vector_15" d="M69.1794 4.45194H66.6233V2.02094H69.1794C70.2019 2.02094 70.7407 2.43532 70.7407 3.23644C70.7407 4.03756 70.2019 4.45194 69.1794 4.45194ZM69.2762 0.15625H64.5508V9.82501H66.6233V6.31662H69.2762C71.473 6.31662 72.8133 5.15637 72.8133 3.23644C72.8133 1.3165 71.473 0.15625 69.2762 0.15625Z" fill="black" fill-opacity="0.95"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_10">
+<mask id="mask9_5981_49007" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_35">
+<path id="Vector_16" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask9_5981_49007)">
+<g id="Group_22">
+<g id="Group_23">
+<g id="Group_24">
+<path id="Vector_17" d="M86.8413 6.57863C86.4823 7.51786 85.7642 8.05653 84.7837 8.05653C83.1542 8.05653 82.16 6.89631 82.16 5.00404C82.16 3.08416 83.1542 1.92394 84.7837 1.92394C85.7642 1.92394 86.4823 2.46261 86.8413 3.40183H89.0369C88.4984 1.33002 86.8827 -0.00976562 84.7837 -0.00976562C81.9942 -0.00976562 80.0195 2.06206 80.0195 5.00404C80.0195 7.91841 81.9942 9.99023 84.7837 9.99023C86.8965 9.99023 88.5122 8.63664 89.0508 6.57863H86.8413Z" fill="black" fill-opacity="0.95"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_11">
+<mask id="mask10_5981_49007" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_26">
+<path id="Vector_18" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask10_5981_49007)">
+<g id="Group_25">
+<g id="Group_26">
+<g id="Group_27">
+<path id="Vector_19" d="M73.6484 0.15625L77.5033 9.82501H79.6172L75.7624 0.15625H73.6484Z" fill="black" fill-opacity="0.95"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_12">
+<mask id="mask11_5981_49007" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_17">
+<path id="Vector_20" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask11_5981_49007)">
+<g id="Group_28">
+<g id="Group_29">
+<g id="Group_30">
+<path id="Vector_21" d="M3.64038 5.99893L4.95938 2.60106L6.27838 5.99893H3.64038ZM3.85422 0.15625L0 9.82501H2.15505L2.9433 7.79456H6.97558L7.76371 9.82501H9.91875L6.06453 0.15625H3.85422Z" fill="black" fill-opacity="0.95"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+<defs>
+<clipPath id="clip0_5981_49007">
+<rect width="89.375" height="10" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/Anthropic-light.svg b/app/components/base/icons/assets/public/llm/Anthropic-light.svg
new file mode 100644
index 0000000..3e587cc
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/Anthropic-light.svg
@@ -0,0 +1,186 @@
+<svg width="90" height="10" viewBox="0 0 90 10" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Anthropic" clip-path="url(#clip0_5981_52010)">
+<g id="Clip path group">
+<mask id="mask0_5981_52010" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_2">
+<path id="Vector" d="M89.375 -0.00195312H0V9.99805H89.375V-0.00195312Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask0_5981_52010)">
+<g id="Group">
+<g id="Clip path group_2">
+<mask id="mask1_5981_52010" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_4">
+<path id="Vector_2" d="M0 -0.00390625H89.375V9.99609H0V-0.00390625Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask1_5981_52010)">
+<g id="Group_2">
+<g id="Clip path group_3">
+<mask id="mask2_5981_52010" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_12">
+<path id="Vector_3" d="M0 -0.00585938H89.375V9.99414H0V-0.00585938Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask2_5981_52010)">
+<g id="Group_3">
+<g id="Clip path group_4">
+<mask id="mask3_5981_52010" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_89">
+<path id="Vector_4" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask3_5981_52010)">
+<g id="Group_4">
+<g id="Group_5">
+<g id="Group_6">
+<path id="Vector_5" d="M18.1273 6.92438L13.7773 0.15625H11.4297V9.82501H13.4321V3.05688L17.7821 9.82501H20.1297V0.15625H18.1273V6.92438Z" fill="white" fill-opacity="0.8"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_5">
+<mask id="mask4_5981_52010" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_80">
+<path id="Vector_6" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask4_5981_52010)">
+<g id="Group_7">
+<g id="Group_8">
+<g id="Group_9">
+<path id="Vector_7" d="M21.7969 2.02094H25.0423V9.82501H27.1139V2.02094H30.3594V0.15625H21.7969V2.02094Z" fill="white" fill-opacity="0.8"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_6">
+<mask id="mask5_5981_52010" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_71">
+<path id="Vector_8" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask5_5981_52010)">
+<g id="Group_10">
+<g id="Group_11">
+<g id="Group_12">
+<path id="Vector_9" d="M38.6442 4.00994H34.0871V0.15625H32.0156V9.82501H34.0871V5.87463H38.6442V9.82501H40.7156V0.15625H38.6442V4.00994Z" fill="white" fill-opacity="0.8"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_7">
+<mask id="mask6_5981_52010" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_62">
+<path id="Vector_10" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask6_5981_52010)">
+<g id="Group_13">
+<g id="Group_14">
+<g id="Group_15">
+<path id="Vector_11" d="M45.3376 2.02094H47.893C48.9152 2.02094 49.4539 2.39387 49.4539 3.09831C49.4539 3.80275 48.9152 4.17569 47.893 4.17569H45.3376V2.02094ZM51.5259 3.09831C51.5259 1.27506 50.186 0.15625 47.9897 0.15625H43.2656V9.82501H45.3376V6.04037H47.6443L49.7164 9.82501H52.0094L49.715 5.75211C50.8666 5.30941 51.5259 4.37721 51.5259 3.09831Z" fill="white" fill-opacity="0.8"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_8">
+<mask id="mask7_5981_52010" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_53">
+<path id="Vector_12" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask7_5981_52010)">
+<g id="Group_16">
+<g id="Group_17">
+<g id="Group_18">
+<path id="Vector_13" d="M57.8732 8.05653C56.2438 8.05653 55.2496 6.89631 55.2496 5.00404C55.2496 3.08416 56.2438 1.92394 57.8732 1.92394C59.4887 1.92394 60.4691 3.08416 60.4691 5.00404C60.4691 6.89631 59.4887 8.05653 57.8732 8.05653ZM57.8732 -0.00976562C55.0839 -0.00976562 53.1094 2.06206 53.1094 5.00404C53.1094 7.91841 55.0839 9.99023 57.8732 9.99023C60.6486 9.99023 62.6094 7.91841 62.6094 5.00404C62.6094 2.06206 60.6486 -0.00976562 57.8732 -0.00976562Z" fill="white" fill-opacity="0.8"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_9">
+<mask id="mask8_5981_52010" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_44">
+<path id="Vector_14" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask8_5981_52010)">
+<g id="Group_19">
+<g id="Group_20">
+<g id="Group_21">
+<path id="Vector_15" d="M69.1794 4.45194H66.6233V2.02094H69.1794C70.2019 2.02094 70.7407 2.43532 70.7407 3.23644C70.7407 4.03756 70.2019 4.45194 69.1794 4.45194ZM69.2762 0.15625H64.5508V9.82501H66.6233V6.31662H69.2762C71.473 6.31662 72.8133 5.15637 72.8133 3.23644C72.8133 1.3165 71.473 0.15625 69.2762 0.15625Z" fill="white" fill-opacity="0.8"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_10">
+<mask id="mask9_5981_52010" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_35">
+<path id="Vector_16" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask9_5981_52010)">
+<g id="Group_22">
+<g id="Group_23">
+<g id="Group_24">
+<path id="Vector_17" d="M86.8413 6.57863C86.4823 7.51786 85.7642 8.05653 84.7837 8.05653C83.1542 8.05653 82.16 6.89631 82.16 5.00404C82.16 3.08416 83.1542 1.92394 84.7837 1.92394C85.7642 1.92394 86.4823 2.46261 86.8413 3.40183H89.0369C88.4984 1.33002 86.8827 -0.00976562 84.7837 -0.00976562C81.9942 -0.00976562 80.0195 2.06206 80.0195 5.00404C80.0195 7.91841 81.9942 9.99023 84.7837 9.99023C86.8965 9.99023 88.5122 8.63664 89.0508 6.57863H86.8413Z" fill="white" fill-opacity="0.8"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_11">
+<mask id="mask10_5981_52010" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_26">
+<path id="Vector_18" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask10_5981_52010)">
+<g id="Group_25">
+<g id="Group_26">
+<g id="Group_27">
+<path id="Vector_19" d="M73.6484 0.15625L77.5033 9.82501H79.6172L75.7624 0.15625H73.6484Z" fill="white" fill-opacity="0.8"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<g id="Clip path group_12">
+<mask id="mask11_5981_52010" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="90" height="11">
+<g id="__lottie_element_17">
+<path id="Vector_20" d="M0 -0.0078125H89.375V9.99219H0V-0.0078125Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask11_5981_52010)">
+<g id="Group_28">
+<g id="Group_29">
+<g id="Group_30">
+<path id="Vector_21" d="M3.64038 5.99893L4.95938 2.60106L6.27838 5.99893H3.64038ZM3.85422 0.15625L0 9.82501H2.15505L2.9433 7.79456H6.97558L7.76371 9.82501H9.91875L6.06453 0.15625H3.85422Z" fill="white" fill-opacity="0.8"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+<defs>
+<clipPath id="clip0_5981_52010">
+<rect width="89.375" height="10" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/anthropic-text.svg b/app/components/base/icons/assets/public/llm/anthropic-text.svg
new file mode 100644
index 0000000..cace17d
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/anthropic-text.svg
@@ -0,0 +1,78 @@
+<svg width="90" height="20" viewBox="0 0 90 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_8587_60274)">
+<mask id="mask0_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M89.375 4.99805H0V14.998H89.375V4.99805Z" fill="white"/>
+</mask>
+<g mask="url(#mask0_8587_60274)">
+<mask id="mask1_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99609H89.375V14.9961H0V4.99609Z" fill="white"/>
+</mask>
+<g mask="url(#mask1_8587_60274)">
+<mask id="mask2_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99414H89.375V14.9941H0V4.99414Z" fill="white"/>
+</mask>
+<g mask="url(#mask2_8587_60274)">
+<mask id="mask3_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask3_8587_60274)">
+<path d="M18.1273 11.9244L13.7773 5.15625H11.4297V14.825H13.4321V8.05688L17.7821 14.825H20.1297V5.15625H18.1273V11.9244Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask4_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask4_8587_60274)">
+<path d="M21.7969 7.02094H25.0423V14.825H27.1139V7.02094H30.3594V5.15625H21.7969V7.02094Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask5_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask5_8587_60274)">
+<path d="M38.6442 9.00994H34.0871V5.15625H32.0156V14.825H34.0871V10.8746H38.6442V14.825H40.7156V5.15625H38.6442V9.00994Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask6_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask6_8587_60274)">
+<path d="M45.3376 7.02094H47.893C48.9152 7.02094 49.4539 7.39387 49.4539 8.09831C49.4539 8.80275 48.9152 9.17569 47.893 9.17569H45.3376V7.02094ZM51.5259 8.09831C51.5259 6.27506 50.186 5.15625 47.9897 5.15625H43.2656V14.825H45.3376V11.0404H47.6443L49.7164 14.825H52.0094L49.715 10.7521C50.8666 10.3094 51.5259 9.37721 51.5259 8.09831Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask7_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask7_8587_60274)">
+<path d="M57.8732 13.0565C56.2438 13.0565 55.2496 11.8963 55.2496 10.004C55.2496 8.08416 56.2438 6.92394 57.8732 6.92394C59.4887 6.92394 60.4691 8.08416 60.4691 10.004C60.4691 11.8963 59.4887 13.0565 57.8732 13.0565ZM57.8732 4.99023C55.0839 4.99023 53.1094 7.06206 53.1094 10.004C53.1094 12.9184 55.0839 14.9902 57.8732 14.9902C60.6486 14.9902 62.6094 12.9184 62.6094 10.004C62.6094 7.06206 60.6486 4.99023 57.8732 4.99023Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask8_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask8_8587_60274)">
+<path d="M69.1794 9.45194H66.6233V7.02094H69.1794C70.2019 7.02094 70.7407 7.43532 70.7407 8.23644C70.7407 9.03756 70.2019 9.45194 69.1794 9.45194ZM69.2762 5.15625H64.5508V14.825H66.6233V11.3166H69.2762C71.473 11.3166 72.8133 10.1564 72.8133 8.23644C72.8133 6.3165 71.473 5.15625 69.2762 5.15625Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask9_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask9_8587_60274)">
+<path d="M86.8413 11.5786C86.4823 12.5179 85.7642 13.0565 84.7837 13.0565C83.1542 13.0565 82.16 11.8963 82.16 10.004C82.16 8.08416 83.1542 6.92394 84.7837 6.92394C85.7642 6.92394 86.4823 7.46261 86.8413 8.40183H89.0369C88.4984 6.33002 86.8827 4.99023 84.7837 4.99023C81.9942 4.99023 80.0195 7.06206 80.0195 10.004C80.0195 12.9184 81.9942 14.9902 84.7837 14.9902C86.8965 14.9902 88.5122 13.6366 89.0508 11.5786H86.8413Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask10_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask10_8587_60274)">
+<path d="M73.6484 5.15625L77.5033 14.825H79.6172L75.7624 5.15625H73.6484Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask11_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask11_8587_60274)">
+<path d="M3.64038 10.9989L4.95938 7.60106L6.27838 10.9989H3.64038ZM3.85422 5.15625L0 14.825H2.15505L2.9433 12.7946H6.97558L7.76371 14.825H9.91875L6.06453 5.15625H3.85422Z" fill="black" fill-opacity="0.92"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<defs>
+<clipPath id="clip0_8587_60274">
+<rect width="89.375" height="10" fill="white" transform="translate(0 5)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/anthropic.svg b/app/components/base/icons/assets/public/llm/anthropic.svg
new file mode 100644
index 0000000..d852f04
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/anthropic.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="6" fill="#CA9F7B"/>
+<path d="M15.3843 6.43481H12.9687L17.3739 17.5652H19.7896L15.3843 6.43481ZM8.40522 6.43481L4 17.5652H6.4633L7.36417 15.2279H11.9729L12.8737 17.5652H15.337L10.9318 6.43481H8.40522ZM8.16104 13.1607L9.66852 9.24907L11.176 13.1607H8.16104Z" fill="#191918"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/azure-openai-service-text.svg b/app/components/base/icons/assets/public/llm/azure-openai-service-text.svg
new file mode 100644
index 0000000..7485c44
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/azure-openai-service-text.svg
@@ -0,0 +1,25 @@
+<svg width="212" height="24" viewBox="0 0 212 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="2" y="1.5" width="10" height="10" fill="#EF4F21"/>
+<rect x="2" y="12.5" width="10" height="10" fill="#03A4EE"/>
+<rect x="13" y="1.5" width="10" height="10" fill="#7EB903"/>
+<rect x="13" y="12.5" width="10" height="10" fill="#FBB604"/>
+<path d="M52.276 10.0045C52.7751 8.50639 52.6033 6.86529 51.8051 5.50264C50.6048 3.41259 48.1917 2.33732 45.835 2.84333C44.7866 1.66218 43.2803 0.990477 41.7011 1.0001C39.2922 0.994602 37.1548 2.54563 36.4137 4.83781C34.8661 5.15475 33.5304 6.12346 32.7487 7.49643C31.5394 9.58097 31.8151 12.2087 33.4307 13.9962C32.9316 15.4943 33.1034 17.1354 33.9016 18.498C35.1019 20.5881 37.515 21.6634 39.8717 21.1573C40.9195 22.3385 42.4264 23.0102 44.0056 22.9999C46.4159 23.0061 48.554 21.4537 49.2951 19.1594C50.8426 18.8425 52.1784 17.8738 52.9601 16.5008C54.168 14.4163 53.8916 11.7906 52.2767 10.0031L52.276 10.0045ZM44.007 21.5623C43.0424 21.5637 42.1081 21.2261 41.3677 20.608C41.4014 20.5901 41.4598 20.5578 41.4976 20.5345L45.8783 18.0044C46.1024 17.8772 46.2399 17.6386 46.2385 17.3808V11.2049L48.0899 12.274C48.1099 12.2836 48.1229 12.3028 48.1257 12.3248V17.4393C48.1229 19.7136 46.2812 21.5575 44.007 21.5623ZM35.1494 17.7789C34.6661 16.9443 34.4921 15.9659 34.6578 15.0165C34.6901 15.0357 34.7472 15.0708 34.7878 15.0942L39.1684 17.6242C39.3905 17.7541 39.6655 17.7541 39.8882 17.6242L45.2362 14.5359V16.6741C45.2376 16.6961 45.2272 16.7174 45.2101 16.7311L40.782 19.288C38.8096 20.4238 36.2906 19.7486 35.1501 17.7789H35.1494ZM33.9965 8.21626C34.4777 7.38024 35.2374 6.74085 36.1421 6.40878C36.1421 6.44659 36.1401 6.51328 36.1401 6.56003V11.6208C36.1387 11.878 36.2762 12.1165 36.4996 12.2437L41.8476 15.3313L39.9962 16.4004C39.9776 16.4128 39.9542 16.4149 39.9336 16.4059L35.5048 13.847C33.5365 12.7071 32.8614 10.1887 33.9958 8.21694L33.9965 8.21626ZM49.2078 11.7563L43.8598 8.66795L45.7112 7.59956C45.7298 7.58718 45.7532 7.58512 45.7738 7.59406L50.2026 10.1509C52.1743 11.2901 52.8501 13.8126 51.7109 15.7844C51.229 16.6191 50.47 17.2584 49.566 17.5912V12.3792C49.568 12.122 49.4312 11.8841 49.2085 11.7563H49.2078ZM51.0502 8.98284C51.0179 8.9629 50.9609 8.92852 50.9203 8.90515L46.5397 6.37509C46.3176 6.24515 46.0426 6.24515 45.8199 6.37509L40.4719 9.46341V7.32524C40.4705 7.30324 40.4808 7.28192 40.498 7.26817L44.9261 4.71337C46.8985 3.57553 49.4202 4.25273 50.5573 6.2259C51.0379 7.05917 51.2118 8.03475 51.0489 8.98284H51.0502ZM39.4654 12.7937L37.6133 11.7246C37.5934 11.715 37.5803 11.6958 37.5776 11.6738V6.55935C37.579 4.2823 39.4262 2.43701 41.7032 2.43838C42.6664 2.43838 43.5986 2.77664 44.339 3.39265C44.3053 3.41053 44.2476 3.44284 44.2091 3.46622L39.8284 5.99627C39.6043 6.12346 39.4668 6.36134 39.4682 6.61916L39.4654 12.7924V12.7937ZM40.4712 10.6253L42.8534 9.24959L45.2355 10.6246V13.3754L42.8534 14.7504L40.4712 13.3754V10.6253Z" fill="black"/>
+<path d="M64.0195 17.0001H62.0508L65.6353 6.81824H67.9123L71.5018 17.0001H69.533L66.8136 8.90631H66.734L64.0195 17.0001ZM64.0842 13.0079H69.4535V14.4894H64.0842V13.0079Z" fill="#1D2939"/>
+<path d="M72.6639 17.0001V15.8566L76.6014 10.9198V10.8552H72.7931V9.36369H78.8038V10.5917L75.0552 15.4439V15.5086H78.9331V17.0001H72.6639Z" fill="#1D2939"/>
+<path d="M85.4918 13.7884V9.36369H87.2915V17.0001H85.5465V15.6428H85.467C85.2946 16.0704 85.0112 16.42 84.6168 16.6918C84.2257 16.9636 83.7435 17.0995 83.1701 17.0995C82.6696 17.0995 82.2272 16.9885 81.8427 16.7664C81.4615 16.541 81.1632 16.2145 80.9478 15.787C80.7324 15.3561 80.6246 14.8358 80.6246 14.2259V9.36369H82.4244V13.9475C82.4244 14.4314 82.5569 14.8159 82.8221 15.1009C83.0872 15.3859 83.4352 15.5285 83.8661 15.5285C84.1313 15.5285 84.3881 15.4638 84.6367 15.3346C84.8853 15.2053 85.0891 15.0131 85.2482 14.7579C85.4106 14.4993 85.4918 14.1762 85.4918 13.7884Z" fill="#1D2939"/>
+<path d="M89.1422 17.0001V9.36369H90.8873V10.6364H90.9668C91.106 10.1956 91.3446 9.85588 91.6827 9.61724C92.0241 9.37529 92.4135 9.25432 92.851 9.25432C92.9505 9.25432 93.0615 9.25929 93.1841 9.26923C93.3101 9.27586 93.4145 9.28746 93.4973 9.30403V10.9596C93.4211 10.9331 93.3001 10.9099 93.1344 10.89C92.972 10.8668 92.8146 10.8552 92.6621 10.8552C92.334 10.8552 92.039 10.9264 91.7772 11.0689C91.5186 11.2082 91.3148 11.402 91.1657 11.6506C91.0165 11.8992 90.9419 12.1859 90.9419 12.5107V17.0001H89.1422Z" fill="#1D2939"/>
+<path d="M97.7592 17.1492C96.9936 17.1492 96.3324 16.9901 95.7756 16.6719C95.2221 16.3504 94.7962 15.8964 94.4979 15.3097C94.1996 14.7198 94.0504 14.0254 94.0504 13.2266C94.0504 12.4411 94.1996 11.7517 94.4979 11.1584C94.7995 10.5618 95.2204 10.0978 95.7607 9.76639C96.3009 9.43164 96.9356 9.26426 97.6648 9.26426C98.1354 9.26426 98.5795 9.34049 98.9972 9.49295C99.4181 9.6421 99.7893 9.87411 100.111 10.189C100.436 10.5038 100.691 10.9049 100.876 11.3921C101.062 11.876 101.155 12.4527 101.155 13.1222V13.6741H94.8956V12.461H99.4297C99.4264 12.1163 99.3518 11.8097 99.206 11.5412C99.0601 11.2695 98.8563 11.0557 98.5945 10.8999C98.3359 10.7441 98.0343 10.6662 97.6896 10.6662C97.3217 10.6662 96.9986 10.7557 96.7202 10.9347C96.4418 11.1104 96.2247 11.3424 96.0689 11.6307C95.9164 11.9158 95.8385 12.229 95.8352 12.5704V13.6293C95.8352 14.0734 95.9164 14.4546 96.0788 14.7728C96.2412 15.0877 96.4683 15.3296 96.7599 15.4986C97.0516 15.6644 97.393 15.7472 97.7841 15.7472C98.0459 15.7472 98.2829 15.7108 98.495 15.6378C98.7071 15.5616 98.8911 15.4506 99.0469 15.3047C99.2027 15.1589 99.3203 14.9783 99.3999 14.7628L101.08 14.9518C100.974 15.3959 100.772 15.7837 100.474 16.1151C100.179 16.4432 99.8009 16.6984 99.3402 16.8807C98.8795 17.0597 98.3525 17.1492 97.7592 17.1492Z" fill="#1D2939"/>
+<path d="M115.328 11.9091C115.328 13.0062 115.122 13.9458 114.711 14.728C114.303 15.5069 113.747 16.1035 113.041 16.5178C112.338 16.9321 111.541 17.1393 110.649 17.1393C109.758 17.1393 108.959 16.9321 108.253 16.5178C107.55 16.1002 106.994 15.5019 106.583 14.7231C106.175 13.9409 105.971 13.0029 105.971 11.9091C105.971 10.8121 106.175 9.87411 106.583 9.09523C106.994 8.31303 107.55 7.71478 108.253 7.30048C108.959 6.88618 109.758 6.67903 110.649 6.67903C111.541 6.67903 112.338 6.88618 113.041 7.30048C113.747 7.71478 114.303 8.31303 114.711 9.09523C115.122 9.87411 115.328 10.8121 115.328 11.9091ZM113.473 11.9091C113.473 11.1369 113.352 10.4856 113.11 9.95531C112.872 9.42169 112.54 9.019 112.116 8.74721C111.692 8.47212 111.203 8.33457 110.649 8.33457C110.096 8.33457 109.607 8.47212 109.183 8.74721C108.758 9.019 108.425 9.42169 108.183 9.95531C107.945 10.4856 107.825 11.1369 107.825 11.9091C107.825 12.6814 107.945 13.3343 108.183 13.868C108.425 14.3983 108.758 14.801 109.183 15.076C109.607 15.3478 110.096 15.4837 110.649 15.4837C111.203 15.4837 111.692 15.3478 112.116 15.076C112.54 14.801 112.872 14.3983 113.11 13.868C113.352 13.3343 113.473 12.6814 113.473 11.9091Z" fill="#1D2939"/>
+<path d="M116.992 19.8637V9.36369H118.762V10.6265H118.866C118.959 10.4409 119.09 10.2437 119.259 10.0349C119.428 9.82274 119.657 9.6421 119.945 9.49295C120.233 9.34049 120.601 9.26426 121.049 9.26426C121.639 9.26426 122.171 9.41507 122.645 9.71667C123.122 10.015 123.5 10.4574 123.778 11.0441C124.06 11.6274 124.201 12.3433 124.201 13.1918C124.201 14.0304 124.063 14.743 123.788 15.3296C123.513 15.9162 123.138 16.3637 122.664 16.6719C122.19 16.9802 121.654 17.1343 121.054 17.1343C120.616 17.1343 120.253 17.0614 119.965 16.9155C119.676 16.7697 119.444 16.594 119.269 16.3885C119.096 16.1797 118.962 15.9825 118.866 15.7969H118.792V19.8637H116.992ZM118.757 13.1819C118.757 13.6757 118.826 14.1082 118.966 14.4795C119.108 14.8507 119.312 15.1407 119.577 15.3495C119.846 15.555 120.17 15.6577 120.551 15.6577C120.949 15.6577 121.282 15.5517 121.551 15.3395C121.819 15.1241 122.021 14.8308 122.157 14.4596C122.297 14.085 122.366 13.6591 122.366 13.1819C122.366 12.7079 122.298 12.287 122.162 11.9191C122.026 11.5512 121.824 11.2628 121.556 11.054C121.287 10.8452 120.953 10.7408 120.551 10.7408C120.167 10.7408 119.841 10.8419 119.572 11.0441C119.304 11.2463 119.1 11.5296 118.961 11.8942C118.825 12.2588 118.757 12.688 118.757 13.1819Z" fill="#1D2939"/>
+<path d="M129.123 17.1492C128.357 17.1492 127.696 16.9901 127.139 16.6719C126.585 16.3504 126.159 15.8964 125.861 15.3097C125.563 14.7198 125.414 14.0254 125.414 13.2266C125.414 12.4411 125.563 11.7517 125.861 11.1584C126.163 10.5618 126.584 10.0978 127.124 9.76639C127.664 9.43164 128.299 9.26426 129.028 9.26426C129.499 9.26426 129.943 9.34049 130.36 9.49295C130.781 9.6421 131.153 9.87411 131.474 10.189C131.799 10.5038 132.054 10.9049 132.24 11.3921C132.425 11.876 132.518 12.4527 132.518 13.1222V13.6741H126.259V12.461H130.793C130.79 12.1163 130.715 11.8097 130.569 11.5412C130.423 11.2695 130.22 11.0557 129.958 10.8999C129.699 10.7441 129.398 10.6662 129.053 10.6662C128.685 10.6662 128.362 10.7557 128.083 10.9347C127.805 11.1104 127.588 11.3424 127.432 11.6307C127.28 11.9158 127.202 12.229 127.199 12.5704V13.6293C127.199 14.0734 127.28 14.4546 127.442 14.7728C127.605 15.0877 127.832 15.3296 128.123 15.4986C128.415 15.6644 128.756 15.7472 129.147 15.7472C129.409 15.7472 129.646 15.7108 129.858 15.6378C130.07 15.5616 130.254 15.4506 130.41 15.3047C130.566 15.1589 130.684 14.9783 130.763 14.7628L132.444 14.9518C132.337 15.3959 132.135 15.7837 131.837 16.1151C131.542 16.4432 131.164 16.6984 130.703 16.8807C130.243 17.0597 129.716 17.1492 129.123 17.1492Z" fill="#1D2939"/>
+<path d="M135.84 12.5256V17.0001H134.041V9.36369H135.761V10.6613H135.85C136.026 10.2337 136.306 9.894 136.691 9.6421C137.078 9.39021 137.557 9.26426 138.127 9.26426C138.654 9.26426 139.113 9.37695 139.504 9.60233C139.899 9.82771 140.204 10.1542 140.419 10.5817C140.638 11.0093 140.746 11.528 140.742 12.1378V17.0001H138.943V12.4162C138.943 11.9058 138.81 11.5064 138.545 11.2181C138.283 10.9297 137.92 10.7856 137.456 10.7856C137.141 10.7856 136.861 10.8552 136.616 10.9944C136.374 11.1303 136.183 11.3275 136.044 11.586C135.908 11.8445 135.84 12.1577 135.84 12.5256Z" fill="#1D2939"/>
+<path d="M143.959 17.0001H141.99L145.575 6.81824H147.852L151.441 17.0001H149.472L146.753 8.90631H146.673L143.959 17.0001ZM144.024 13.0079H149.393V14.4894H144.024V13.0079Z" fill="#1D2939"/>
+<path d="M154.627 6.81824V17.0001H152.782V6.81824H154.627Z" fill="#1D2939"/>
+<path d="M165.63 9.61724C165.584 9.18306 165.388 8.84499 165.044 8.60304C164.702 8.36109 164.258 8.24011 163.711 8.24011C163.327 8.24011 162.997 8.29811 162.722 8.41412C162.447 8.53012 162.236 8.68756 162.09 8.88642C161.945 9.08528 161.87 9.31232 161.867 9.56753C161.867 9.77965 161.915 9.9636 162.011 10.1194C162.11 10.2752 162.244 10.4077 162.414 10.5171C162.583 10.6232 162.77 10.7127 162.975 10.7856C163.181 10.8585 163.388 10.9198 163.597 10.9695L164.551 11.2082C164.936 11.2976 165.305 11.4186 165.66 11.5711C166.018 11.7235 166.338 11.9158 166.619 12.1478C166.905 12.3798 167.13 12.6599 167.296 12.988C167.461 13.3161 167.544 13.7006 167.544 14.1414C167.544 14.738 167.392 15.2633 167.087 15.7174C166.782 16.1681 166.341 16.5211 165.764 16.7763C165.191 17.0282 164.497 17.1542 163.681 17.1542C162.889 17.1542 162.201 17.0315 161.618 16.7863C161.038 16.541 160.584 16.1831 160.256 15.7124C159.931 15.2418 159.755 14.6684 159.729 13.9922H161.544C161.57 14.3469 161.679 14.6419 161.872 14.8772C162.064 15.1125 162.314 15.2882 162.622 15.4042C162.934 15.5202 163.282 15.5782 163.666 15.5782C164.067 15.5782 164.419 15.5185 164.72 15.3992C165.025 15.2766 165.264 15.1075 165.436 14.8921C165.609 14.6734 165.696 14.4181 165.7 14.1265C165.696 13.8613 165.619 13.6426 165.466 13.4702C165.314 13.2946 165.1 13.1487 164.825 13.0327C164.553 12.9134 164.235 12.8073 163.87 12.7145L162.712 12.4162C161.873 12.2008 161.21 11.8743 160.723 11.4368C160.239 10.996 159.997 10.411 159.997 9.68187C159.997 9.08197 160.16 8.55664 160.485 8.10588C160.813 7.65512 161.258 7.30545 161.822 7.05687C162.385 6.80498 163.023 6.67903 163.736 6.67903C164.459 6.67903 165.092 6.80498 165.635 7.05687C166.182 7.30545 166.611 7.65181 166.923 8.09594C167.234 8.53675 167.395 9.04385 167.405 9.61724H165.63Z" fill="#1D2939"/>
+<path d="M172.49 17.1492C171.724 17.1492 171.063 16.9901 170.506 16.6719C169.953 16.3504 169.527 15.8964 169.228 15.3097C168.93 14.7198 168.781 14.0254 168.781 13.2266C168.781 12.4411 168.93 11.7517 169.228 11.1584C169.53 10.5618 169.951 10.0978 170.491 9.76639C171.031 9.43164 171.666 9.26426 172.395 9.26426C172.866 9.26426 173.31 9.34049 173.728 9.49295C174.149 9.6421 174.52 9.87411 174.841 10.189C175.166 10.5038 175.421 10.9049 175.607 11.3921C175.792 11.876 175.885 12.4527 175.885 13.1222V13.6741H169.626V12.461H174.16C174.157 12.1163 174.082 11.8097 173.936 11.5412C173.791 11.2695 173.587 11.0557 173.325 10.8999C173.066 10.7441 172.765 10.6662 172.42 10.6662C172.052 10.6662 171.729 10.7557 171.451 10.9347C171.172 11.1104 170.955 11.3424 170.799 11.6307C170.647 11.9158 170.569 12.229 170.566 12.5704V13.6293C170.566 14.0734 170.647 14.4546 170.809 14.7728C170.972 15.0877 171.199 15.3296 171.49 15.4986C171.782 15.6644 172.123 15.7472 172.515 15.7472C172.776 15.7472 173.013 15.7108 173.225 15.6378C173.438 15.5616 173.622 15.4506 173.777 15.3047C173.933 15.1589 174.051 14.9783 174.13 14.7628L175.811 14.9518C175.705 15.3959 175.502 15.7837 175.204 16.1151C174.909 16.4432 174.531 16.6984 174.071 16.8807C173.61 17.0597 173.083 17.1492 172.49 17.1492Z" fill="#1D2939"/>
+<path d="M177.408 17.0001V9.36369H179.153V10.6364H179.232C179.372 10.1956 179.61 9.85588 179.948 9.61724C180.29 9.37529 180.679 9.25432 181.117 9.25432C181.216 9.25432 181.327 9.25929 181.45 9.26923C181.576 9.27586 181.68 9.28746 181.763 9.30403V10.9596C181.687 10.9331 181.566 10.9099 181.4 10.89C181.238 10.8668 181.08 10.8552 180.928 10.8552C180.6 10.8552 180.305 10.9264 180.043 11.0689C179.784 11.2082 179.58 11.402 179.431 11.6506C179.282 11.8992 179.208 12.1859 179.208 12.5107V17.0001H177.408Z" fill="#1D2939"/>
+<path d="M190.012 9.36369L187.293 17.0001H185.304L182.585 9.36369H184.504L186.259 15.0363H186.338L188.098 9.36369H190.012Z" fill="#1D2939"/>
+<path d="M191.257 17.0001V9.36369H193.057V17.0001H191.257ZM192.162 8.27989C191.877 8.27989 191.632 8.18542 191.426 7.9965C191.221 7.80427 191.118 7.57392 191.118 7.30545C191.118 7.03367 191.221 6.80332 191.426 6.6144C191.632 6.42217 191.877 6.32605 192.162 6.32605C192.451 6.32605 192.696 6.42217 192.898 6.6144C193.104 6.80332 193.206 7.03367 193.206 7.30545C193.206 7.57392 193.104 7.80427 192.898 7.9965C192.696 8.18542 192.451 8.27989 192.162 8.27989Z" fill="#1D2939"/>
+<path d="M198.239 17.1492C197.477 17.1492 196.822 16.9818 196.275 16.6471C195.731 16.3123 195.312 15.85 195.017 15.26C194.726 14.6667 194.58 13.984 194.58 13.2117C194.58 12.4361 194.729 11.7517 195.027 11.1584C195.325 10.5618 195.746 10.0978 196.29 9.76639C196.837 9.43164 197.483 9.26426 198.229 9.26426C198.849 9.26426 199.397 9.37861 199.874 9.6073C200.355 9.83268 200.738 10.1525 201.023 10.5668C201.308 10.9778 201.47 11.4584 201.51 12.0086H199.79C199.72 11.6407 199.555 11.3341 199.293 11.0888C199.034 10.8403 198.688 10.716 198.254 10.716C197.886 10.716 197.563 10.8154 197.284 11.0143C197.006 11.2098 196.789 11.4915 196.633 11.8594C196.481 12.2273 196.404 12.6681 196.404 13.1819C196.404 13.7022 196.481 14.1497 196.633 14.5242C196.785 14.8954 196.999 15.1821 197.274 15.3843C197.553 15.5832 197.879 15.6826 198.254 15.6826C198.519 15.6826 198.756 15.6329 198.965 15.5334C199.177 15.4307 199.354 15.2832 199.497 15.091C199.639 14.8987 199.737 14.6651 199.79 14.39H201.51C201.467 14.9302 201.308 15.4091 201.033 15.8268C200.758 16.2411 200.383 16.5659 199.909 16.8012C199.435 17.0332 198.878 17.1492 198.239 17.1492Z" fill="#1D2939"/>
+<path d="M206.369 17.1492C205.603 17.1492 204.942 16.9901 204.385 16.6719C203.831 16.3504 203.406 15.8964 203.107 15.3097C202.809 14.7198 202.66 14.0254 202.66 13.2266C202.66 12.4411 202.809 11.7517 203.107 11.1584C203.409 10.5618 203.83 10.0978 204.37 9.76639C204.91 9.43164 205.545 9.26426 206.274 9.26426C206.745 9.26426 207.189 9.34049 207.607 9.49295C208.027 9.6421 208.399 9.87411 208.72 10.189C209.045 10.5038 209.3 10.9049 209.486 11.3921C209.671 11.876 209.764 12.4527 209.764 13.1222V13.6741H203.505V12.461H208.039C208.036 12.1163 207.961 11.8097 207.815 11.5412C207.67 11.2695 207.466 11.0557 207.204 10.8999C206.945 10.7441 206.644 10.6662 206.299 10.6662C205.931 10.6662 205.608 10.7557 205.33 10.9347C205.051 11.1104 204.834 11.3424 204.678 11.6307C204.526 11.9158 204.448 12.229 204.445 12.5704V13.6293C204.445 14.0734 204.526 14.4546 204.688 14.7728C204.851 15.0877 205.078 15.3296 205.369 15.4986C205.661 15.6644 206.002 15.7472 206.393 15.7472C206.655 15.7472 206.892 15.7108 207.104 15.6378C207.317 15.5616 207.5 15.4506 207.656 15.3047C207.812 15.1589 207.93 14.9783 208.009 14.7628L209.69 14.9518C209.584 15.3959 209.381 15.7837 209.083 16.1151C208.788 16.4432 208.41 16.6984 207.95 16.8807C207.489 17.0597 206.962 17.1492 206.369 17.1492Z" fill="#1D2939"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/azure-openai-service.svg b/app/components/base/icons/assets/public/llm/azure-openai-service.svg
new file mode 100644
index 0000000..6a541fc
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/azure-openai-service.svg
@@ -0,0 +1,7 @@
+<svg width="56" height="24" viewBox="0 0 56 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="2" y="1.5" width="10" height="10" fill="#EF4F21"/>
+<rect x="2" y="12.5" width="10" height="10" fill="#03A4EE"/>
+<rect x="13" y="1.5" width="10" height="10" fill="#7EB903"/>
+<rect x="13" y="12.5" width="10" height="10" fill="#FBB604"/>
+<path d="M52.276 10.0045C52.7751 8.50639 52.6033 6.86529 51.8051 5.50264C50.6048 3.41259 48.1917 2.33732 45.835 2.84333C44.7866 1.66218 43.2803 0.990477 41.7011 1.0001C39.2922 0.994602 37.1548 2.54563 36.4137 4.83781C34.8661 5.15475 33.5304 6.12346 32.7487 7.49643C31.5394 9.58097 31.8151 12.2087 33.4307 13.9962C32.9316 15.4943 33.1034 17.1354 33.9016 18.498C35.1019 20.5881 37.515 21.6634 39.8717 21.1573C40.9195 22.3385 42.4264 23.0102 44.0056 22.9999C46.4159 23.0061 48.554 21.4537 49.2951 19.1594C50.8426 18.8425 52.1784 17.8738 52.9601 16.5008C54.168 14.4163 53.8916 11.7906 52.2767 10.0031L52.276 10.0045ZM44.007 21.5623C43.0424 21.5637 42.1081 21.2261 41.3677 20.608C41.4014 20.5901 41.4598 20.5578 41.4976 20.5345L45.8783 18.0044C46.1024 17.8772 46.2399 17.6386 46.2385 17.3808V11.2049L48.0899 12.274C48.1099 12.2836 48.1229 12.3028 48.1257 12.3248V17.4393C48.1229 19.7136 46.2812 21.5575 44.007 21.5623ZM35.1494 17.7789C34.6661 16.9443 34.4921 15.9659 34.6578 15.0165C34.6901 15.0357 34.7472 15.0708 34.7878 15.0942L39.1684 17.6242C39.3905 17.7541 39.6655 17.7541 39.8882 17.6242L45.2362 14.5359V16.6741C45.2376 16.6961 45.2272 16.7174 45.2101 16.7311L40.782 19.288C38.8096 20.4238 36.2906 19.7486 35.1501 17.7789H35.1494ZM33.9965 8.21626C34.4777 7.38024 35.2374 6.74085 36.1421 6.40878C36.1421 6.44659 36.1401 6.51328 36.1401 6.56003V11.6208C36.1387 11.878 36.2762 12.1165 36.4996 12.2437L41.8476 15.3313L39.9962 16.4004C39.9776 16.4128 39.9542 16.4149 39.9336 16.4059L35.5048 13.847C33.5365 12.7071 32.8614 10.1887 33.9958 8.21694L33.9965 8.21626ZM49.2078 11.7563L43.8598 8.66795L45.7112 7.59956C45.7298 7.58718 45.7532 7.58512 45.7738 7.59406L50.2026 10.1509C52.1743 11.2901 52.8501 13.8126 51.7109 15.7844C51.229 16.6191 50.47 17.2584 49.566 17.5912V12.3792C49.568 12.122 49.4312 11.8841 49.2085 11.7563H49.2078ZM51.0502 8.98284C51.0179 8.9629 50.9609 8.92852 50.9203 8.90515L46.5397 6.37509C46.3176 6.24515 46.0426 6.24515 45.8199 6.37509L40.4719 9.46341V7.32524C40.4705 7.30324 40.4808 7.28192 40.498 7.26817L44.9261 4.71337C46.8985 3.57553 49.4202 4.25273 50.5573 6.2259C51.0379 7.05917 51.2118 8.03475 51.0489 8.98284H51.0502ZM39.4654 12.7937L37.6133 11.7246C37.5934 11.715 37.5803 11.6958 37.5776 11.6738V6.55935C37.579 4.2823 39.4262 2.43701 41.7032 2.43838C42.6664 2.43838 43.5986 2.77664 44.339 3.39265C44.3053 3.41053 44.2476 3.44284 44.2091 3.46622L39.8284 5.99627C39.6043 6.12346 39.4668 6.36134 39.4682 6.61916L39.4654 12.7924V12.7937ZM40.4712 10.6253L42.8534 9.24959L45.2355 10.6246V13.3754L42.8534 14.7504L40.4712 13.3754V10.6253Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/azureai-text.svg b/app/components/base/icons/assets/public/llm/azureai-text.svg
new file mode 100644
index 0000000..0bbbeee
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/azureai-text.svg
@@ -0,0 +1,30 @@
+<svg width="92" height="24" viewBox="0 0 92 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M9.63655 2.50023H15.6036L9.40921 20.8535C9.34555 21.0421 9.22434 21.206 9.06266 21.3221C8.90097 21.4382 8.70695 21.5006 8.5079 21.5007H3.86407C3.71326 21.5007 3.56461 21.4648 3.43042 21.396C3.29623 21.3271 3.18036 21.2273 3.09239 21.1048C3.00442 20.9823 2.94689 20.8406 2.92454 20.6915C2.9022 20.5424 2.91569 20.39 2.9639 20.2471L8.73501 3.1474C8.79864 2.95872 8.91987 2.79477 9.0816 2.67863C9.24334 2.56249 9.43743 2.50024 9.63655 2.50023Z" fill="url(#paint0_linear_8587_60561)"/>
+<path d="M18.307 14.8105H8.84467C8.7567 14.8104 8.67074 14.8368 8.59799 14.8863C8.52524 14.9358 8.46906 15.006 8.43679 15.0878C8.40451 15.1697 8.39763 15.2593 8.41704 15.3451C8.43645 15.4309 8.48125 15.5089 8.54561 15.5689L14.6259 21.2439C14.8029 21.4091 15.036 21.5009 15.2781 21.5008H20.636L18.307 14.8105Z" fill="#0078D4"/>
+<path d="M9.63533 2.50001C9.43405 2.49923 9.23778 2.56284 9.07521 2.68154C8.91265 2.80024 8.79229 2.96781 8.73173 3.15978L2.96979 20.2313C2.91834 20.3747 2.90219 20.5284 2.9227 20.6794C2.94321 20.8304 2.99979 20.9742 3.08764 21.0987C3.17549 21.2232 3.29203 21.3247 3.42741 21.3946C3.56278 21.4646 3.71301 21.5009 3.86538 21.5004H8.62906C8.80648 21.4687 8.97231 21.3905 9.1096 21.2738C9.2469 21.157 9.35074 21.0059 9.41052 20.8359L10.5596 17.4495L14.6639 21.2777C14.8359 21.42 15.0517 21.4986 15.2749 21.5004H20.6129L18.2717 14.8102L11.4469 14.8118L15.6239 2.50001H9.63533Z" fill="url(#paint1_linear_8587_60561)"/>
+<path d="M17.2574 3.14625C17.1938 2.95788 17.0728 2.7942 16.9113 2.67826C16.7498 2.56233 16.556 2.49998 16.3572 2.5H9.70703C9.90582 2.50001 10.0996 2.56237 10.2611 2.67831C10.4226 2.79424 10.5436 2.9579 10.6072 3.14625L16.3785 20.2467C16.4268 20.3896 16.4403 20.542 16.418 20.6911C16.3957 20.8403 16.3381 20.9821 16.2502 21.1046C16.1622 21.2271 16.0463 21.327 15.9121 21.3959C15.7779 21.4647 15.6292 21.5007 15.4784 21.5007H22.1288C22.2796 21.5006 22.4283 21.4647 22.5624 21.3958C22.6966 21.3269 22.8125 21.2271 22.9004 21.1045C22.9884 20.982 23.0459 20.8403 23.0682 20.6911C23.0905 20.5419 23.077 20.3896 23.0287 20.2467L17.2574 3.14625Z" fill="url(#paint2_linear_8587_60561)"/>
+<path d="M34.312 17.0001H32.3433L35.9278 6.81824H38.2048L41.7943 17.0001H39.8255L37.106 8.90631H37.0265L34.312 17.0001ZM34.3766 13.0079H39.746V14.4894H34.3766V13.0079Z" fill="#1D2939"/>
+<path d="M42.9564 17.0001V15.8566L46.8939 10.9198V10.8552H43.0856V9.36369H49.0963V10.5917L45.3477 15.4439V15.5086H49.2255V17.0001H42.9564Z" fill="#1D2939"/>
+<path d="M55.7843 13.7884V9.36369H57.584V17.0001H55.839V15.6428H55.7595C55.5871 16.0704 55.3037 16.42 54.9093 16.6918C54.5182 16.9636 54.036 17.0995 53.4626 17.0995C52.9621 17.0995 52.5196 16.9885 52.1352 16.7664C51.754 16.541 51.4557 16.2145 51.2403 15.787C51.0248 15.3561 50.9171 14.8358 50.9171 14.2259V9.36369H52.7168V13.9475C52.7168 14.4314 52.8494 14.8159 53.1146 15.1009C53.3797 15.3859 53.7277 15.5285 54.1586 15.5285C54.4238 15.5285 54.6806 15.4638 54.9292 15.3346C55.1778 15.2053 55.3816 15.0131 55.5407 14.7579C55.7031 14.4993 55.7843 14.1762 55.7843 13.7884Z" fill="#1D2939"/>
+<path d="M59.4347 17.0001V9.36369H61.1797V10.6364H61.2593C61.3985 10.1956 61.6371 9.85588 61.9752 9.61724C62.3166 9.37529 62.706 9.25432 63.1435 9.25432C63.2429 9.25432 63.354 9.25929 63.4766 9.26923C63.6026 9.27586 63.707 9.28746 63.7898 9.30403V10.9596C63.7136 10.9331 63.5926 10.9099 63.4269 10.89C63.2645 10.8668 63.1071 10.8552 62.9546 10.8552C62.6265 10.8552 62.3315 10.9264 62.0696 11.0689C61.8111 11.2082 61.6073 11.402 61.4581 11.6506C61.309 11.8992 61.2344 12.1859 61.2344 12.5107V17.0001H59.4347Z" fill="#1D2939"/>
+<path d="M68.0517 17.1492C67.2861 17.1492 66.6249 16.9901 66.068 16.6719C65.5145 16.3504 65.0886 15.8964 64.7903 15.3097C64.4921 14.7198 64.3429 14.0254 64.3429 13.2266C64.3429 12.4411 64.4921 11.7517 64.7903 11.1584C65.092 10.5618 65.5129 10.0978 66.0531 9.76639C66.5934 9.43164 67.2281 9.26426 67.9573 9.26426C68.4279 9.26426 68.872 9.34049 69.2896 9.49295C69.7106 9.6421 70.0818 9.87411 70.4033 10.189C70.7281 10.5038 70.9833 10.9049 71.1689 11.3921C71.3545 11.876 71.4473 12.4527 71.4473 13.1222V13.6741H65.1881V12.461H69.7222C69.7189 12.1163 69.6443 11.8097 69.4984 11.5412C69.3526 11.2695 69.1488 11.0557 68.8869 10.8999C68.6284 10.7441 68.3268 10.6662 67.9821 10.6662C67.6142 10.6662 67.2911 10.7557 67.0126 10.9347C66.7342 11.1104 66.5171 11.3424 66.3614 11.6307C66.2089 11.9158 66.131 12.229 66.1277 12.5704V13.6293C66.1277 14.0734 66.2089 14.4546 66.3713 14.7728C66.5337 15.0877 66.7608 15.3296 67.0524 15.4986C67.3441 15.6644 67.6855 15.7472 68.0766 15.7472C68.3384 15.7472 68.5754 15.7108 68.7875 15.6378C68.9996 15.5616 69.1836 15.4506 69.3394 15.3047C69.4951 15.1589 69.6128 14.9783 69.6923 14.7628L71.3727 14.9518C71.2667 15.3959 71.0645 15.7837 70.7662 16.1151C70.4712 16.4432 70.0934 16.6984 69.6327 16.8807C69.172 17.0597 68.645 17.1492 68.0517 17.1492Z" fill="#1D2939"/>
+<path d="M77.8296 17.0001H75.8608L79.4454 6.81824H81.7223L85.3118 17.0001H83.3431L80.6236 8.90631H80.5441L77.8296 17.0001ZM77.8942 13.0079H83.2635V14.4894H77.8942V13.0079Z" fill="#1D2939"/>
+<path d="M88.4974 6.81824V17.0001H86.6529V6.81824H88.4974Z" fill="#1D2939"/>
+<defs>
+<linearGradient id="paint0_linear_8587_60561" x1="11.8113" y1="3.90823" x2="5.61444" y2="22.2154" gradientUnits="userSpaceOnUse">
+<stop stop-color="#114A8B"/>
+<stop offset="1" stop-color="#0669BC"/>
+</linearGradient>
+<linearGradient id="paint1_linear_8587_60561" x1="13.7459" y1="12.4397" x2="12.3125" y2="12.9243" gradientUnits="userSpaceOnUse">
+<stop stop-opacity="0.3"/>
+<stop offset="0.071" stop-opacity="0.2"/>
+<stop offset="0.321" stop-opacity="0.1"/>
+<stop offset="0.623" stop-opacity="0.05"/>
+<stop offset="1" stop-opacity="0"/>
+</linearGradient>
+<linearGradient id="paint2_linear_8587_60561" x1="12.9582" y1="3.37404" x2="19.7606" y2="21.4968" gradientUnits="userSpaceOnUse">
+<stop stop-color="#3CCBF4"/>
+<stop offset="1" stop-color="#2892DF"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/azureai.svg b/app/components/base/icons/assets/public/llm/azureai.svg
new file mode 100644
index 0000000..93c9b59
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/azureai.svg
@@ -0,0 +1,23 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8.41642 1.13526H14.9266L8.16839 21.1596C8.09893 21.3654 7.96669 21.5442 7.79029 21.6708C7.61389 21.7975 7.4022 21.8657 7.18504 21.8657H2.11851C1.95397 21.8657 1.79179 21.8266 1.64539 21.7515C1.49898 21.6764 1.37257 21.5675 1.27659 21.4338C1.18062 21.3002 1.11784 21.1456 1.09347 20.9829C1.06909 20.8201 1.08381 20.6539 1.13641 20.498L7.43281 1.84135C7.50224 1.6355 7.6345 1.45662 7.81096 1.3299C7.98742 1.20319 8.19918 1.13527 8.41642 1.13526Z" fill="url(#paint0_linear_8587_60253)"/>
+<path d="M17.8761 14.5664H7.55255C7.45657 14.5663 7.36278 14.5951 7.28341 14.6491C7.20403 14.703 7.14275 14.7796 7.10754 14.8689C7.07232 14.9582 7.06482 15.056 7.08599 15.1496C7.10717 15.2433 7.15605 15.3283 7.22626 15.3938L13.86 21.5856C14.0531 21.7657 14.3074 21.8659 14.5715 21.8659H20.4171L17.8761 14.5664Z" fill="#0078D4"/>
+<path d="M8.41509 1.13502C8.19548 1.13417 7.98136 1.20358 7.80399 1.33308C7.62663 1.46259 7.49532 1.64542 7.42924 1.85486L1.14283 20.4808C1.0867 20.6373 1.06907 20.805 1.09145 20.9697C1.11383 21.1344 1.17556 21.2913 1.2714 21.4272C1.36725 21.563 1.4944 21.6737 1.6421 21.75C1.7898 21.8263 1.9537 21.8659 2.11994 21.8655H7.31723C7.5108 21.8309 7.69172 21.7455 7.84151 21.6181C7.9913 21.4907 8.10459 21.3259 8.16982 21.1404L9.42345 17.4456L13.9014 21.6224C14.0891 21.7776 14.3245 21.8635 14.568 21.8655H20.3918L17.8376 14.566L10.3916 14.5678L14.9488 1.13502H8.41509Z" fill="url(#paint1_linear_8587_60253)"/>
+<path d="M16.7308 1.8401C16.6614 1.63458 16.5294 1.456 16.3532 1.3295C16.177 1.20301 15.9656 1.13498 15.7487 1.13501H8.49316C8.71005 1.13502 8.92147 1.20306 9.09765 1.32955C9.27383 1.45604 9.4059 1.6346 9.47527 1.8401L15.7719 20.4975C15.8246 20.6535 15.8393 20.8197 15.815 20.9825C15.7906 21.1452 15.7278 21.2999 15.6319 21.4336C15.5359 21.5673 15.4095 21.6762 15.263 21.7514C15.1166 21.8265 14.9544 21.8657 14.7898 21.8657H22.0456C22.2101 21.8657 22.3723 21.8264 22.5187 21.7513C22.6651 21.6761 22.7915 21.5672 22.8875 21.4335C22.9834 21.2998 23.0461 21.1452 23.0705 20.9824C23.0948 20.8197 23.0801 20.6534 23.0274 20.4975L16.7308 1.8401Z" fill="url(#paint2_linear_8587_60253)"/>
+<defs>
+<linearGradient id="paint0_linear_8587_60253" x1="10.7892" y1="2.67146" x2="4.0279" y2="22.6454" gradientUnits="userSpaceOnUse">
+<stop stop-color="#114A8B"/>
+<stop offset="1" stop-color="#0669BC"/>
+</linearGradient>
+<linearGradient id="paint1_linear_8587_60253" x1="12.8998" y1="11.9797" x2="11.3359" y2="12.5085" gradientUnits="userSpaceOnUse">
+<stop stop-opacity="0.3"/>
+<stop offset="0.071" stop-opacity="0.2"/>
+<stop offset="0.321" stop-opacity="0.1"/>
+<stop offset="0.623" stop-opacity="0.05"/>
+<stop offset="1" stop-opacity="0"/>
+</linearGradient>
+<linearGradient id="paint2_linear_8587_60253" x1="12.0403" y1="2.08863" x2="19.4621" y2="21.8613" gradientUnits="userSpaceOnUse">
+<stop stop-color="#3CCBF4"/>
+<stop offset="1" stop-color="#2892DF"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/baichuan-text.svg b/app/components/base/icons/assets/public/llm/baichuan-text.svg
new file mode 100644
index 0000000..7ff6b5a
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/baichuan-text.svg
@@ -0,0 +1,19 @@
+<svg width="130" height="24" viewBox="0 0 130 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.58154 1.7793H6.52779L4.34655 6.20409V17.7335L1.91602 22.2206H7.21333L9.58154 17.7335V1.7793ZM11.5761 1.7793H16.8111V22.2206H11.5761V1.7793ZM23.9166 1.7793H18.6816V6.01712H23.9166V1.7793ZM23.9166 7.38818H18.6816V22.2206H23.9166V7.38818Z" fill="url(#paint0_radial_11622_96091)"/>
+<path d="M129.722 6.83203V18H127.482V6.83203H129.722Z" fill="#FF6A34"/>
+<path d="M123.196 15.872H118.748L118.012 18H115.66L119.676 6.81604H122.284L126.3 18H123.932L123.196 15.872ZM122.588 14.08L120.972 9.40804L119.356 14.08H122.588Z" fill="#FF6A34"/>
+<path d="M110.962 18H108.722L103.65 10.336V18H101.41V6.81598H103.65L108.722 14.496V6.81598H110.962V18Z" fill="#FF6A34"/>
+<path d="M97.1258 15.872H92.6778L91.9418 18H89.5898L93.6058 6.81604H96.2138L100.23 18H97.8618L97.1258 15.872ZM96.5178 14.08L94.9018 9.40804L93.2858 14.08H96.5178Z" fill="#FF6A34"/>
+<path d="M81.6482 6.83203V13.744C81.6482 14.5014 81.8455 15.0827 82.2402 15.488C82.6349 15.8827 83.1895 16.08 83.9042 16.08C84.6295 16.08 85.1895 15.8827 85.5842 15.488C85.9789 15.0827 86.1762 14.5014 86.1762 13.744V6.83203H88.4322V13.728C88.4322 14.6774 88.2242 15.4827 87.8082 16.144C87.4029 16.7947 86.8535 17.2854 86.1602 17.616C85.4775 17.9467 84.7149 18.112 83.8722 18.112C83.0402 18.112 82.2829 17.9467 81.6002 17.616C80.9282 17.2854 80.3949 16.7947 80.0002 16.144C79.6055 15.4827 79.4082 14.6774 79.4082 13.728V6.83203H81.6482Z" fill="#FF6A34"/>
+<path d="M77.557 6.83203V18H75.317V13.248H70.533V18H68.293V6.83203H70.533V11.424H75.317V6.83203H77.557Z" fill="#FF6A34"/>
+<path d="M55.7871 12.4C55.7871 11.3013 56.0324 10.32 56.5231 9.45599C57.0244 8.58132 57.7018 7.90399 58.5551 7.42399C59.4191 6.93332 60.3844 6.68799 61.4511 6.68799C62.6991 6.68799 63.7924 7.00799 64.7311 7.64799C65.6698 8.28799 66.3258 9.17332 66.6991 10.304H64.1231C63.8671 9.77065 63.5044 9.37065 63.0351 9.10399C62.5764 8.83732 62.0431 8.70399 61.4351 8.70399C60.7844 8.70399 60.2031 8.85865 59.6911 9.16799C59.1898 9.46665 58.7951 9.89332 58.5071 10.448C58.2298 11.0027 58.0911 11.6533 58.0911 12.4C58.0911 13.136 58.2298 13.7867 58.5071 14.352C58.7951 14.9067 59.1898 15.3387 59.6911 15.648C60.2031 15.9467 60.7844 16.096 61.4351 16.096C62.0431 16.096 62.5764 15.9627 63.0351 15.696C63.5044 15.4187 63.8671 15.0133 64.1231 14.48H66.6991C66.3258 15.6213 65.6698 16.512 64.7311 17.152C63.8031 17.7813 62.7098 18.096 61.4511 18.096C60.3844 18.096 59.4191 17.856 58.5551 17.376C57.7018 16.8853 57.0244 16.208 56.5231 15.344C56.0324 14.48 55.7871 13.4987 55.7871 12.4Z" fill="#FF6A34"/>
+<path d="M54.4373 6.83203V18H52.1973V6.83203H54.4373Z" fill="#FF6A34"/>
+<path d="M47.913 15.872H43.465L42.729 18H40.377L44.393 6.81598H47.001L51.017 18H48.649L47.913 15.872ZM47.305 14.08L45.689 9.40798L44.073 14.08H47.305Z" fill="#FF6A34"/>
+<path d="M37.4395 12.272C38.0688 12.3893 38.5862 12.704 38.9915 13.216C39.3968 13.728 39.5995 14.3146 39.5995 14.976C39.5995 15.5733 39.4502 16.1013 39.1515 16.56C38.8635 17.008 38.4422 17.36 37.8875 17.616C37.3328 17.872 36.6768 18 35.9195 18H31.1035V6.83197H35.7115C36.4688 6.83197 37.1195 6.95464 37.6635 7.19997C38.2182 7.4453 38.6342 7.78664 38.9115 8.22397C39.1995 8.6613 39.3435 9.1573 39.3435 9.71197C39.3435 10.3626 39.1675 10.9066 38.8155 11.344C38.4742 11.7813 38.0155 12.0906 37.4395 12.272ZM33.3435 11.44H35.3915C35.9248 11.44 36.3355 11.3226 36.6235 11.088C36.9115 10.8426 37.0555 10.496 37.0555 10.048C37.0555 9.59997 36.9115 9.2533 36.6235 9.00797C36.3355 8.76264 35.9248 8.63997 35.3915 8.63997H33.3435V11.44ZM35.5995 16.176C36.1435 16.176 36.5648 16.048 36.8635 15.792C37.1728 15.536 37.3275 15.1733 37.3275 14.704C37.3275 14.224 37.1675 13.8506 36.8475 13.584C36.5275 13.3066 36.0955 13.168 35.5515 13.168H33.3435V16.176H35.5995Z" fill="#FF6A34"/>
+<defs>
+<radialGradient id="paint0_radial_11622_96091" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(6.5 5.5) rotate(45) scale(20.5061 22.0704)">
+<stop stop-color="#FEBD3F"/>
+<stop offset="0.77608" stop-color="#FF6933"/>
+</radialGradient>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/baichuan.svg b/app/components/base/icons/assets/public/llm/baichuan.svg
new file mode 100644
index 0000000..4ddcd26
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/baichuan.svg
@@ -0,0 +1,11 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Baichuan">
+<path id="Union" fill-rule="evenodd" clip-rule="evenodd" d="M8.58154 1.7793H5.52779L3.34655 6.20409V17.7335L0.916016 22.2206H6.21333L8.58154 17.7335V1.7793ZM10.5761 1.7793H15.8111V22.2206H10.5761V1.7793ZM22.9166 1.7793H17.6816V6.01712H22.9166V1.7793ZM22.9166 7.38818H17.6816V22.2206H22.9166V7.38818Z" fill="url(#paint0_radial_11622_96084)"/>
+</g>
+<defs>
+<radialGradient id="paint0_radial_11622_96084" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(5.5 5.5) rotate(45) scale(20.5061 22.0704)">
+<stop stop-color="#FEBD3F"/>
+<stop offset="0.77608" stop-color="#FF6933"/>
+</radialGradient>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/chatglm-text.svg b/app/components/base/icons/assets/public/llm/chatglm-text.svg
new file mode 100644
index 0000000..dc7924c
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/chatglm-text.svg
@@ -0,0 +1,16 @@
+<svg width="100" height="24" viewBox="0 0 100 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M56.5415 9.49683C56.3371 9.38235 56.1222 9.28491 55.8984 9.20565C55.4497 9.04653 54.9672 8.95911 54.4654 8.95911C52.0893 8.95911 50.1562 10.9044 50.1562 13.2955C50.1562 15.6867 52.0893 17.6313 54.4654 17.6313C54.9672 17.6313 55.4497 17.5438 55.8984 17.3847C55.9178 17.3778 55.9378 17.3703 55.9572 17.3627C57.2065 16.8986 58.1845 15.8659 58.582 14.5785V12.0125C58.2489 10.9333 57.5083 10.0333 56.5415 9.49683ZM55.9578 13.9446C55.9397 13.986 55.9197 14.0269 55.8991 14.0665C55.6247 14.5804 55.0854 14.9307 54.466 14.9307C53.5698 14.9307 52.8411 14.1973 52.8411 13.2955C52.8411 12.3936 53.5698 11.6603 54.466 11.6603C55.0854 11.6603 55.6241 12.01 55.8991 12.5244C55.9203 12.5647 55.9403 12.6049 55.9578 12.6471C56.0434 12.8458 56.0909 13.0653 56.0909 13.2955C56.0909 13.5257 56.0434 13.7452 55.9578 13.9446Z" fill="#1A2029"/>
+<path d="M58.6419 9.49683V17.596H55.959V13.9445C56.0446 13.7458 56.0921 13.5256 56.0921 13.2955C56.0921 13.0653 56.0446 12.8458 55.959 12.6471V9.49683H58.6419Z" fill="#1A2029"/>
+<path d="M63.4475 7.46912H60.7637V17.6142H63.4475V7.46912Z" fill="#1A2029"/>
+<path d="M64.8417 9.49683H59.3789V12.1974H64.3659C64.3587 12.0773 64.3545 11.9559 64.3545 11.8339C64.3545 11.0031 64.5285 10.2125 64.8417 9.49683Z" fill="#1A2029"/>
+<path d="M35.3555 14.908C34.2412 14.908 33.2644 14.3087 32.7257 13.4137C32.4444 12.947 32.2832 12.3999 32.2832 11.8163C32.2832 11.2326 32.4444 10.6849 32.7257 10.2188C33.2644 9.32448 34.2412 8.72448 35.3555 8.72448C36.4699 8.72448 37.4461 9.32388 37.9847 10.2188L40.2809 8.82324C39.2716 7.14714 37.441 6.02454 35.3555 6.02454C33.27 6.02454 31.4388 7.14714 30.4296 8.82324C29.9027 9.69744 29.5996 10.7219 29.5996 11.8169C29.5996 12.9118 29.9027 13.9363 30.4296 14.8105C31.4388 16.4866 33.2694 17.6092 35.3555 17.6092C37.4417 17.6092 39.2716 16.4866 40.2809 14.8105L37.9847 13.415C37.4461 14.3093 36.4692 14.9093 35.3555 14.9093V14.908Z" fill="#1A2029"/>
+<path d="M79.4097 14.9232H85.1781V17.6237H77.5179V17.6124H76.7265V6.04407H79.4097V14.9232ZM96.7581 6.04971H93.8625L91.4631 10.1371L89.0631 6.04971H86.0763V17.6181H88.7601V10.5352L91.4637 15.1389L94.0749 10.6918V17.6181H96.7581V6.12141V6.04971ZM70.7661 13.2169H73.1445V13.9779C72.5841 14.581 71.7867 14.959 70.9023 14.959C70.0179 14.959 69.2121 14.5773 68.6511 13.9691C68.5089 13.815 68.3811 13.6458 68.2725 13.4647C67.9911 12.998 67.8297 12.4509 67.8297 11.8672C67.8297 11.2836 67.9911 10.7358 68.2725 10.2697C68.8113 9.37545 69.7881 8.77545 70.9023 8.77545C71.7087 8.77545 72.4425 9.08931 72.9909 9.60249L74.8881 7.69311C73.8537 6.69123 72.4479 6.07491 70.9023 6.07491C68.8161 6.07491 66.9855 7.19751 65.9763 8.87355C65.4495 9.74775 65.1465 10.7723 65.1465 11.8672C65.1465 12.9622 65.4495 13.9867 65.9763 14.8609C66.1983 15.2288 66.4587 15.5703 66.7539 15.8791C67.8027 16.9765 69.2751 17.6596 70.9029 17.6596C72.9885 17.6596 74.8191 16.537 75.8283 14.8609V10.5175H70.7661V13.2181V13.2169Z" fill="#1A2029"/>
+<path d="M49.4752 12.5477V17.6174H46.7954V13.1156C46.7954 12.2603 46.106 11.5666 45.2561 11.5666C44.4061 11.5666 43.7168 12.2597 43.7168 13.1156V17.6174H41.0332V6H43.7168V9.8811C44.3343 9.3333 45.1473 9.00186 46.0373 9.00942C47.9484 9.02514 49.4752 10.6244 49.4752 12.5477Z" fill="#1A2029"/>
+<mask id="mask0_8587_60467" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="2" y="1" width="23" height="22">
+<path d="M24.8 1.80005H2V22.2H24.8V1.80005Z" fill="white"/>
+</mask>
+<g mask="url(#mask0_8587_60467)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M4.86378 14.2544C4.86378 12.8981 5.67438 11.5371 7.25923 10.4634C8.83827 9.39369 11.0864 8.69373 13.6282 8.69373C16.17 8.69373 18.4182 9.39369 19.9972 10.4634C20.7966 11.005 21.399 11.6196 21.7998 12.27C22.2873 11.3803 22.4969 10.4351 22.3835 9.49257C22.3759 9.42933 22.3824 9.36771 22.4005 9.31065C22.0758 9.01857 21.7259 8.74629 21.3558 8.49561C19.3272 7.12131 16.5915 6.30969 13.6282 6.30969C10.665 6.30969 7.92918 7.12131 5.90058 8.49561C3.8778 9.86595 2.45703 11.8813 2.45703 14.2544C2.45703 16.6275 3.8778 18.6429 5.90058 20.0132C7.92918 21.3875 10.665 22.1991 13.6282 22.1991C16.5915 22.1991 19.3272 21.3875 21.3558 20.0132C23.3786 18.6429 24.7994 16.6275 24.7994 14.2544C24.7994 12.7455 24.225 11.3813 23.2868 10.2356C23.2377 11.2918 22.8621 12.3073 22.238 13.2301C22.3409 13.5687 22.3926 13.9117 22.3926 14.2544C22.3926 15.6107 21.582 16.9718 19.9972 18.0454C18.4182 19.1151 16.17 19.8151 13.6282 19.8151C11.0864 19.8151 8.83827 19.1151 7.25923 18.0454C5.67438 16.9718 4.86378 15.6107 4.86378 14.2544Z" fill="#3762FF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M4.84445 11.4838C4.20239 13.2886 4.35368 14.9157 5.18868 16.0839C6.02368 17.2521 7.52281 17.9339 9.45459 17.9334C11.3826 17.933 13.6296 17.24 15.6939 15.7923C17.7581 14.3445 19.1643 12.4753 19.8052 10.674C20.4473 8.86925 20.2959 7.24211 19.461 6.07397C18.626 4.90576 17.1269 4.22394 15.1951 4.22436C13.267 4.22479 11.0201 4.91779 8.95575 6.36557C6.89152 7.81337 5.48529 9.68255 4.84445 11.4838ZM2.53559 10.6778C3.36374 8.35007 5.11254 6.08981 7.54117 4.3865C9.96981 2.68317 12.7029 1.8 15.1945 1.79944C17.6825 1.79889 20.0426 2.69125 21.4589 4.67268C22.8752 6.65411 22.941 9.15569 22.1141 11.48C21.2859 13.8077 19.5371 16.068 17.1085 17.7713C14.6798 19.4747 11.9468 20.3579 9.45513 20.3584C6.9672 20.3589 4.60706 19.4666 3.19075 17.4851C1.77445 15.5037 1.70868 13.0022 2.53559 10.6778Z" fill="#1041F3"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/chatglm.svg b/app/components/base/icons/assets/public/llm/chatglm.svg
new file mode 100644
index 0000000..cb04297
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/chatglm.svg
@@ -0,0 +1,9 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<mask id="mask0_8587_60212" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="1" y="2" width="23" height="21">
+<path d="M23.8 2H1V22.4H23.8V2Z" fill="white"/>
+</mask>
+<g mask="url(#mask0_8587_60212)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3.86378 14.4544C3.86378 13.0981 4.67438 11.737 6.25923 10.6634C7.83827 9.59364 10.0864 8.89368 12.6282 8.89368C15.17 8.89368 17.4182 9.59364 18.9972 10.6634C19.7966 11.2049 20.399 11.8196 20.7998 12.4699C21.2873 11.5802 21.4969 10.6351 21.3835 9.69252C21.3759 9.62928 21.3824 9.56766 21.4005 9.5106C21.0758 9.21852 20.7259 8.94624 20.3558 8.69556C18.3272 7.32126 15.5915 6.50964 12.6282 6.50964C9.66497 6.50964 6.92918 7.32126 4.90058 8.69556C2.8778 10.0659 1.45703 12.0812 1.45703 14.4544C1.45703 16.8275 2.8778 18.8428 4.90058 20.2132C6.92918 21.5875 9.66497 22.3991 12.6282 22.3991C15.5915 22.3991 18.3272 21.5875 20.3558 20.2132C22.3786 18.8428 23.7994 16.8275 23.7994 14.4544C23.7994 12.9455 23.225 11.5813 22.2868 10.4355C22.2377 11.4917 21.8621 12.5072 21.238 13.43C21.3409 13.7686 21.3926 14.1116 21.3926 14.4544C21.3926 15.8107 20.582 17.1717 18.9972 18.2453C17.4182 19.3151 15.17 20.015 12.6282 20.015C10.0864 20.015 7.83827 19.3151 6.25923 18.2453C4.67438 17.1717 3.86378 15.8107 3.86378 14.4544Z" fill="#3762FF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3.84445 11.6838C3.20239 13.4885 3.35368 15.1156 4.18868 16.2838C5.02368 17.452 6.52281 18.1339 8.45459 18.1334C10.3826 18.133 12.6296 17.44 14.6939 15.9922C16.7581 14.5444 18.1643 12.6753 18.8052 10.8739C19.4473 9.0692 19.2959 7.44206 18.461 6.27392C17.626 5.10572 16.1269 4.42389 14.1951 4.42431C12.267 4.42475 10.0201 5.11774 7.95575 6.56552C5.89152 8.01332 4.48529 9.8825 3.84445 11.6838ZM1.53559 10.8778C2.36374 8.55002 4.11254 6.28976 6.54117 4.58645C8.96981 2.88312 11.7029 1.99995 14.1945 1.99939C16.6825 1.99884 19.0426 2.8912 20.4589 4.87263C21.8752 6.85406 21.941 9.35564 21.1141 11.6799C20.2859 14.0077 18.5371 16.2679 16.1085 17.9713C13.6798 19.6746 10.9468 20.5578 8.45513 20.5584C5.9672 20.5589 3.60706 19.6665 2.19075 17.6851C0.774446 15.7036 0.708677 13.2021 1.53559 10.8778Z" fill="#1041F3"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/cohere-text.svg b/app/components/base/icons/assets/public/llm/cohere-text.svg
new file mode 100644
index 0000000..9c17689
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/cohere-text.svg
@@ -0,0 +1,11 @@
+<svg width="120" height="24" viewBox="0 0 120 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M34.4917 21.9129C37.4378 21.9129 40.0162 20.4398 41.0355 17.4656C41.2334 16.8701 40.9496 16.4743 40.384 16.4743H39.2787C38.7689 16.4743 38.4292 16.7002 38.2013 17.1818C37.3239 18.9108 36.1047 19.5324 34.5757 19.5324C31.8553 19.5324 30.1844 17.6335 30.1844 14.4616C30.1844 11.2896 31.9133 9.39083 34.5177 9.39083C36.1046 9.39083 37.4079 10.0704 38.2293 11.6854C38.4852 12.1671 38.795 12.3929 39.3067 12.3929H40.412C40.9776 12.3929 41.2614 12.0251 41.0635 11.4855C39.8742 8.25556 37.2099 7.01035 34.4917 7.01035C30.3843 7.01035 27.3242 10.0424 27.3242 14.4616C27.3242 18.8808 30.2424 21.9129 34.4917 21.9129ZM108.627 13.1584C108.995 10.75 110.638 9.24892 112.876 9.24892C115.115 9.24892 116.786 10.7779 116.983 13.1584H108.627ZM112.99 21.9129C115.596 21.9129 118.203 20.6956 119.478 17.9474C119.79 17.2958 119.506 16.8421 118.94 16.8421H117.892C117.383 16.8421 117.071 17.0679 116.816 17.5216C115.966 19.0227 114.493 19.6463 112.992 19.6463C110.414 19.6463 108.743 17.8894 108.545 15.0292H118.943C119.508 15.0292 119.878 14.7174 119.878 14.1219C119.764 9.67465 116.876 7.01235 112.88 7.01235C108.885 7.01235 105.713 9.90251 105.713 14.4636C105.713 19.0247 108.801 21.9148 112.994 21.9148L112.99 21.9129ZM96.5025 14.8313H97.4378C98.0035 14.8313 98.3152 14.5196 98.4012 13.9239C98.9409 10.0964 101.182 9.5887 103.564 9.70264C104.074 9.72661 104.491 9.33487 104.491 8.82319V7.94575C104.491 7.38012 104.208 7.03833 103.642 7.01035C101.533 6.9304 99.6525 7.65393 98.5651 9.70264C98.5052 9.81455 98.3373 9.78458 98.3233 9.65866L98.1474 8.11365C98.0915 7.54801 97.7796 7.26418 97.212 7.26418H92.9347C92.435 7.26418 92.0272 7.66993 92.0272 8.17161V8.6533C92.0272 9.15298 92.433 9.56072 92.9347 9.56072H94.6916C95.1912 9.56072 95.599 9.96646 95.599 10.4681V13.9239C95.599 14.4236 96.0048 14.8313 96.5064 14.8313H96.5025ZM92.6788 21.631H101.545C102.111 21.631 102.453 21.2913 102.453 20.7236V20.2418C102.453 19.6762 102.113 19.3345 101.545 19.3345H99.2787C98.7131 19.3345 98.3712 18.9947 98.3712 18.4271V16.8681C98.3712 16.3024 98.0315 15.9606 97.4638 15.9606H96.5005C95.9348 15.9606 95.593 16.3004 95.593 16.8681V18.4271C95.593 18.9927 95.2532 19.3345 94.6856 19.3345H92.6749C92.1092 19.3345 91.7674 19.6743 91.7674 20.2418V20.7236C91.7674 21.2893 92.1073 21.631 92.6749 21.631H92.6788ZM78.9955 13.1604C79.3633 10.752 81.0062 9.25092 83.2449 9.25092C85.4834 9.25092 87.1544 10.7799 87.3522 13.1604H78.9955ZM83.3587 21.9148C85.9651 21.9148 88.5714 20.6977 89.8466 17.9493C90.1585 17.2978 89.8746 16.844 89.309 16.844H88.2617C87.7519 16.844 87.4402 17.0699 87.1844 17.5236C86.3349 19.0247 84.8618 19.6482 83.3607 19.6482C80.7824 19.6482 79.1115 17.8914 78.9136 15.0313H89.311C89.8766 15.0313 90.2464 14.7194 90.2464 14.1238C90.1324 9.67665 87.2443 7.01434 83.2488 7.01434C79.2533 7.01434 76.0814 9.9045 76.0814 14.4656C76.0814 19.0266 79.1694 21.9168 83.3628 21.9168L83.3587 21.9148ZM50.5835 21.9148C54.8329 21.9148 57.8649 18.7708 57.8649 14.4636C57.8649 10.1563 54.8329 7.01235 50.5835 7.01235C46.3342 7.01235 43.3022 10.2143 43.3022 14.4636C43.3022 15.455 43.472 16.5602 43.9816 17.7775C44.2375 18.3731 44.7192 18.4571 45.2289 18.0892L46.0504 17.4936C46.4761 17.1818 46.588 16.8141 46.4461 16.2765C46.2202 15.5689 46.1623 14.9453 46.1623 14.4076C46.1623 11.4335 47.9472 9.39283 50.5815 9.39283C53.2159 9.39283 55.0007 11.4035 55.0007 14.4636C55.0007 17.5236 53.2439 19.5344 50.6375 19.5344C49.7301 19.5344 48.8806 19.3645 47.8612 18.5989C47.4355 18.2592 47.0397 18.2032 46.586 18.5429L45.9624 18.9967C45.4527 19.3645 45.3968 19.8741 45.8764 20.2718C47.3496 21.4611 49.0485 21.9148 50.5795 21.9148H50.5835ZM61.4606 21.631H62.3961C62.8957 21.631 63.3035 21.2252 63.3035 20.7236V13.9539C63.3035 11.0937 64.8324 9.39283 67.213 9.39283C69.3656 9.39283 70.6128 10.8099 70.6128 13.4163V20.7255C70.6128 21.2252 71.0186 21.633 71.5203 21.633H72.4836C72.9833 21.633 73.391 21.2272 73.391 20.7255V12.9625C73.391 9.13899 71.4363 7.01434 68.1224 7.01434C65.8659 7.01434 64.5327 7.93776 63.5373 9.22294C63.4613 9.32088 63.3075 9.26691 63.3075 9.14499V2.99092C63.3014 2.48924 62.8957 2.0835 62.3961 2.0835H61.4606C60.9609 2.0835 60.5532 2.48924 60.5532 2.99092V20.7236C60.5532 21.2232 60.959 21.631 61.4606 21.631Z" fill="#39594D"/>
+<mask id="mask0_13223_52628" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="1" y="2" width="20" height="20">
+<path d="M20.8354 2.08319H1.00195V21.9165H20.8354V2.08319Z" fill="white"/>
+</mask>
+<g mask="url(#mask0_13223_52628)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.42768 13.8921C7.96151 13.8921 9.02342 13.8628 10.4912 13.2585C12.2017 12.5542 15.6047 11.2758 18.0597 9.96274C19.7765 9.04432 20.5291 7.82964 20.5291 6.19387C20.5291 3.92362 18.6887 2.08319 16.4185 2.08319H6.90643C3.64547 2.08319 1.00195 4.72669 1.00195 7.98763C1.00195 11.2486 3.47706 13.8921 7.42768 13.8921Z" fill="#39594D"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.03711 17.958C9.03711 16.3596 9.99942 14.9184 11.4758 14.3057L14.4713 13.0625C17.5013 11.805 20.8364 14.0316 20.8364 17.3123C20.8364 19.8539 18.7755 21.9141 16.2338 21.9134L12.9906 21.9126C10.807 21.912 9.03711 20.1417 9.03711 17.958Z" fill="#D18EE2"/>
+<path d="M4.40571 14.6705C2.5259 14.6705 1.00195 16.1943 1.00195 18.0741V18.515C1.00195 20.3947 2.52584 21.9186 4.40565 21.9186C6.28547 21.9186 7.80941 20.3947 7.80941 18.515V18.0741C7.80941 16.1943 6.28552 14.6705 4.40571 14.6705Z" fill="#FF7759"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/cohere.svg b/app/components/base/icons/assets/public/llm/cohere.svg
new file mode 100644
index 0000000..28fe96d
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/cohere.svg
@@ -0,0 +1,16 @@
+<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Clip path group">
+<mask id="mask0_13224_9519" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="22" height="22">
+<g id="clip0_2207_90691">
+<path id="Vector" d="M21.5 0.5H0.5V21.5H21.5V0.5Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask0_13224_9519)">
+<g id="Group">
+<path id="Vector_2" fill-rule="evenodd" clip-rule="evenodd" d="M7.30367 13.0035C7.8689 13.0035 8.99327 12.9725 10.5474 12.3326C12.3585 11.587 15.9617 10.2334 18.561 8.84305C20.3788 7.8706 21.1757 6.58448 21.1757 4.85248C21.1757 2.44869 19.2271 0.5 16.8233 0.5H6.75176C3.299 0.5 0.5 3.299 0.5 6.75176C0.5 10.2045 3.12069 13.0035 7.30367 13.0035Z" fill="#39594D"/>
+<path id="Vector_3" fill-rule="evenodd" clip-rule="evenodd" d="M9.00732 17.3086C9.00732 15.6162 10.0262 14.0902 11.5894 13.4414L14.7612 12.1251C17.9694 10.7936 21.5006 13.1513 21.5006 16.6249C21.5006 19.316 19.3185 21.4974 16.6273 21.4967L13.1933 21.4958C10.8813 21.4952 9.00732 19.6207 9.00732 17.3086Z" fill="#D18EE2"/>
+<path id="Vector_4" d="M4.10396 13.8277C2.11358 13.8277 0.5 15.4411 0.5 17.4315V17.8984C0.5 19.8887 2.11352 21.5022 4.1039 21.5022C6.09428 21.5022 7.70785 19.8887 7.70785 17.8984V17.4315C7.70785 15.4411 6.09434 13.8277 4.10396 13.8277Z" fill="#FF7759"/>
+</g>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/gpt-3.svg b/app/components/base/icons/assets/public/llm/gpt-3.svg
new file mode 100644
index 0000000..514215f
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/gpt-3.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="6" fill="#19C37D"/>
+<path d="M19.6451 11.6028C19.8209 11.995 19.9325 12.4142 19.9781 12.8419C20.0221 13.2696 20.0001 13.7024 19.9088 14.1234C19.8192 14.5443 19.6637 14.9484 19.4473 15.3203C19.3053 15.5688 19.1379 15.8021 18.9452 16.0168C18.7542 16.2298 18.5412 16.4225 18.3096 16.5916C18.0763 16.7606 17.8278 16.9027 17.564 17.0193C17.302 17.1343 17.0281 17.2222 16.7475 17.2796C16.6156 17.6888 16.4195 18.0759 16.1659 18.4242C15.914 18.7724 15.6081 19.0784 15.2598 19.3303C14.9115 19.5839 14.5261 19.78 14.117 19.9118C13.7079 20.0454 13.2802 20.1113 12.8491 20.1113C12.5634 20.113 12.276 20.0826 11.9953 20.0251C11.7164 19.9659 11.4425 19.8763 11.1805 19.7597C10.9184 19.643 10.6699 19.4977 10.4383 19.3286C10.2084 19.1595 9.99541 18.9651 9.80606 18.7504C9.38342 18.8417 8.95064 18.8637 8.52293 18.8197C8.09522 18.7741 7.67596 18.6625 7.28206 18.4867C6.88985 18.3126 6.52638 18.0759 6.20687 17.7868C5.88735 17.4977 5.61517 17.1596 5.40047 16.7877C5.25677 16.5392 5.13843 16.2771 5.04883 16.005C4.95924 15.7328 4.90007 15.4522 4.86964 15.1665C4.83921 14.8824 4.8409 14.595 4.87133 14.3093C4.90176 14.0253 4.96431 13.7447 5.05391 13.4725C4.76651 13.153 4.52983 12.7895 4.35402 12.3973C4.17989 12.0034 4.06662 11.5859 4.02267 11.1581C3.97702 10.7304 4.00069 10.2976 4.09029 9.8767C4.17989 9.45575 4.33542 9.05171 4.55181 8.67978C4.69382 8.43127 4.86118 8.19628 5.05222 7.98327C5.24325 7.77026 5.45795 7.57754 5.68956 7.40848C5.92116 7.23943 6.17136 7.09573 6.4334 6.98077C6.69713 6.86412 6.971 6.77791 7.25163 6.72043C7.38349 6.30962 7.5796 5.92417 7.83149 5.57592C8.08508 5.22766 8.39107 4.92167 8.73932 4.66809C9.08758 4.4162 9.47302 4.22009 9.88214 4.08654C10.2913 3.95467 10.719 3.88705 11.1501 3.88874C11.4358 3.88705 11.7232 3.91579 12.0038 3.97496C12.2844 4.03413 12.5583 4.12204 12.8203 4.23869C13.0824 4.35703 13.3309 4.50072 13.5625 4.66978C13.7941 4.84053 14.0071 5.03325 14.1964 5.24795C14.6174 5.15835 15.0502 5.13637 15.4779 5.18033C15.9056 5.22428 16.3232 5.33755 16.7171 5.51168C17.1093 5.6875 17.4727 5.92248 17.7923 6.21157C18.1118 6.49896 18.384 6.83538 18.5987 7.209C18.7423 7.45582 18.8607 7.71786 18.9503 7.99173C19.0399 8.26391 19.1007 8.54454 19.1295 8.83024C19.1599 9.11595 19.1599 9.40334 19.1278 9.68905C19.0974 9.97475 19.0348 10.2554 18.9452 10.5276C19.2343 10.8471 19.4693 11.2089 19.6451 11.6028ZM14.0122 18.8197C14.3807 18.6676 14.7154 18.4428 14.9978 18.1604C15.2801 17.8781 15.5049 17.5434 15.6571 17.1731C15.8092 16.8046 15.8887 16.409 15.8887 16.01V12.2401C15.8876 12.2367 15.8864 12.2328 15.8853 12.2283C15.8842 12.2249 15.8825 12.2215 15.8802 12.2181C15.878 12.2147 15.8752 12.2119 15.8718 12.2097C15.8684 12.2063 15.865 12.204 15.8616 12.2029L14.4974 11.4151V15.9695C14.4974 16.0151 14.4906 16.0624 14.4788 16.1064C14.4669 16.152 14.45 16.1943 14.4264 16.2349C14.4027 16.2755 14.3756 16.3126 14.3418 16.3448C14.309 16.3775 14.272 16.4059 14.2319 16.4293L11.0013 18.294C10.9742 18.3109 10.9286 18.3346 10.9049 18.3481C11.0385 18.4613 11.1839 18.5611 11.336 18.649C11.4899 18.7369 11.6488 18.8113 11.8144 18.8722C11.9801 18.9313 12.1509 18.977 12.3233 19.0074C12.4974 19.0378 12.6732 19.053 12.8491 19.053C13.248 19.053 13.6436 18.9736 14.0122 18.8197ZM6.31844 16.2602C6.51962 16.6068 6.78504 16.9077 7.10117 17.1512C7.419 17.3946 7.77908 17.5721 8.16453 17.6752C8.54998 17.7784 8.95233 17.8054 9.34792 17.753C9.74351 17.7006 10.1239 17.5721 10.4705 17.3726L13.7366 15.4877L13.7451 15.4792C13.7473 15.477 13.749 15.4736 13.7501 15.4691C13.7524 15.4657 13.7541 15.4623 13.7552 15.4589V13.8698L9.81283 16.1504C9.77225 16.174 9.72999 16.1909 9.68603 16.2045C9.64039 16.2163 9.59474 16.2214 9.54741 16.2214C9.50176 16.2214 9.45612 16.2163 9.41047 16.2045C9.36652 16.1909 9.32256 16.174 9.28199 16.1504L6.05133 14.284C6.0226 14.2671 5.98033 14.2417 5.95666 14.2265C5.92623 14.4006 5.91102 14.5764 5.91102 14.7523C5.91102 14.9281 5.92792 15.1039 5.95835 15.278C5.98878 15.4505 6.03612 15.6212 6.09529 15.7869C6.15615 15.9526 6.23053 16.1115 6.31844 16.2636V16.2602ZM5.46978 9.21062C5.2703 9.55718 5.14182 9.93925 5.08941 10.3348C5.037 10.7304 5.06405 11.1311 5.16717 11.5182C5.2703 11.9037 5.44781 12.2638 5.69125 12.5816C5.93469 12.8977 6.2373 13.1631 6.58217 13.3626L9.84664 15.2493C9.85002 15.2504 9.85396 15.2515 9.85847 15.2527H9.8703C9.87481 15.2527 9.87876 15.2515 9.88214 15.2493C9.88552 15.2482 9.8889 15.2465 9.89228 15.2442L11.2616 14.453L7.31925 12.1775C7.28037 12.1539 7.24318 12.1251 7.20937 12.093C7.17661 12.0602 7.1482 12.0232 7.12484 11.9831C7.10286 11.9426 7.08427 11.9003 7.07243 11.8547C7.0606 11.8107 7.05384 11.7651 7.05553 11.7177V7.87846C6.88985 7.93932 6.72925 8.0137 6.5771 8.10161C6.42495 8.19121 6.28125 8.29265 6.14601 8.40591C6.01245 8.51918 5.88735 8.64428 5.77408 8.77953C5.66082 8.91308 5.56107 9.05847 5.47316 9.21062H5.46978ZM16.6832 11.8208C16.7238 11.8445 16.761 11.8716 16.7948 11.9054C16.8269 11.9375 16.8557 11.9747 16.8794 12.0153C16.9013 12.0558 16.9199 12.0998 16.9318 12.1437C16.9419 12.1894 16.9487 12.235 16.947 12.2824V16.1216C17.4896 15.9221 17.963 15.5722 18.3129 15.1124C18.6646 14.6525 18.8759 14.1031 18.9249 13.5283C18.974 12.9535 18.859 12.3753 18.5919 11.8631C18.3248 11.3509 17.9174 10.9248 17.417 10.6374L14.1525 8.75079C14.1491 8.74966 14.1452 8.74853 14.1407 8.74741H14.1288C14.1254 8.74853 14.1215 8.74966 14.117 8.75079C14.1136 8.75191 14.1102 8.7536 14.1068 8.75586L12.7443 9.54366L16.6866 11.8208H16.6832ZM18.0441 9.77526H18.0425V9.77695L18.0441 9.77526ZM18.0425 9.77357C18.1405 9.20555 18.0746 8.62061 17.8514 8.08809C17.63 7.55556 17.2597 7.09742 16.7864 6.76607C16.313 6.43641 15.7551 6.24707 15.1787 6.22171C14.6005 6.19804 14.0291 6.33836 13.5287 6.62575L10.2642 8.51073C10.2608 8.51298 10.258 8.5158 10.2558 8.51918L10.249 8.52932C10.2479 8.5327 10.2467 8.53665 10.2456 8.54116C10.2445 8.54454 10.2439 8.54848 10.2439 8.55299V10.1286L14.1863 7.85141C14.2269 7.82774 14.2708 7.81084 14.3148 7.79731C14.3604 7.78548 14.4061 7.78041 14.4517 7.78041C14.499 7.78041 14.5447 7.78548 14.5903 7.79731C14.6343 7.81084 14.6766 7.82774 14.7171 7.85141L17.9478 9.71778C17.9765 9.73469 18.0188 9.75836 18.0425 9.77357ZM9.50007 8.02892C9.50007 7.98327 9.50683 7.93763 9.51867 7.89198C9.5305 7.84803 9.54741 7.80407 9.57108 7.7635C9.59474 7.72462 9.62179 7.68743 9.6556 7.65361C9.68772 7.62149 9.72492 7.59275 9.76549 7.57078L12.9961 5.70609C13.0266 5.6875 13.0688 5.66383 13.0925 5.65199C12.6496 5.28176 12.1086 5.04508 11.5355 4.97239C10.9624 4.89801 10.3809 4.9893 9.85847 5.23443C9.3344 5.47956 8.89147 5.87008 8.5821 6.35696C8.27273 6.84553 8.10874 7.41017 8.10874 7.98834V11.7583C8.10987 11.7628 8.111 11.7667 8.11212 11.7701C8.11325 11.7735 8.11494 11.7769 8.1172 11.7803C8.11945 11.7836 8.12227 11.787 8.12565 11.7904C8.1279 11.7927 8.13128 11.7949 8.13579 11.7972L9.50007 12.585V8.02892ZM10.2405 13.011L11.997 14.0253L13.7535 13.011V10.984L11.9987 9.96968L10.2422 10.984L10.2405 13.011Z" fill="white"/>
+<rect x="0.5" y="0.5" width="23" height="23" rx="5.5" stroke="black" stroke-opacity="0.05"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/gpt-4.svg b/app/components/base/icons/assets/public/llm/gpt-4.svg
new file mode 100644
index 0000000..63abb1e
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/gpt-4.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="6" fill="#AB68FF"/>
+<path d="M19.6451 11.6028C19.8209 11.995 19.9325 12.4142 19.9781 12.8419C20.0221 13.2696 20.0001 13.7024 19.9088 14.1234C19.8192 14.5443 19.6637 14.9484 19.4473 15.3203C19.3053 15.5688 19.1379 15.8021 18.9452 16.0168C18.7542 16.2298 18.5412 16.4225 18.3096 16.5916C18.0763 16.7606 17.8278 16.9027 17.564 17.0193C17.302 17.1343 17.0281 17.2222 16.7475 17.2796C16.6156 17.6888 16.4195 18.0759 16.1659 18.4242C15.914 18.7724 15.6081 19.0784 15.2598 19.3303C14.9115 19.5839 14.5261 19.78 14.117 19.9118C13.7079 20.0454 13.2802 20.1113 12.8491 20.1113C12.5634 20.113 12.276 20.0826 11.9953 20.0251C11.7164 19.9659 11.4425 19.8763 11.1805 19.7597C10.9184 19.643 10.6699 19.4977 10.4383 19.3286C10.2084 19.1595 9.99541 18.9651 9.80606 18.7504C9.38342 18.8417 8.95064 18.8637 8.52293 18.8197C8.09522 18.7741 7.67596 18.6625 7.28206 18.4867C6.88985 18.3126 6.52638 18.0759 6.20687 17.7868C5.88735 17.4977 5.61517 17.1596 5.40047 16.7877C5.25677 16.5392 5.13843 16.2771 5.04883 16.005C4.95924 15.7328 4.90007 15.4522 4.86964 15.1665C4.83921 14.8824 4.8409 14.595 4.87133 14.3093C4.90176 14.0253 4.96431 13.7447 5.05391 13.4725C4.76651 13.153 4.52983 12.7895 4.35402 12.3973C4.17989 12.0034 4.06662 11.5859 4.02267 11.1581C3.97702 10.7304 4.00069 10.2976 4.09029 9.8767C4.17989 9.45575 4.33542 9.05171 4.55181 8.67978C4.69382 8.43127 4.86118 8.19628 5.05222 7.98327C5.24325 7.77026 5.45795 7.57754 5.68956 7.40848C5.92116 7.23943 6.17136 7.09573 6.4334 6.98077C6.69713 6.86412 6.971 6.77791 7.25163 6.72043C7.38349 6.30962 7.5796 5.92417 7.83149 5.57592C8.08508 5.22766 8.39107 4.92167 8.73932 4.66809C9.08758 4.4162 9.47302 4.22009 9.88214 4.08654C10.2913 3.95467 10.719 3.88705 11.1501 3.88874C11.4358 3.88705 11.7232 3.91579 12.0038 3.97496C12.2844 4.03413 12.5583 4.12204 12.8203 4.23869C13.0824 4.35703 13.3309 4.50072 13.5625 4.66978C13.7941 4.84053 14.0071 5.03325 14.1964 5.24795C14.6174 5.15835 15.0502 5.13637 15.4779 5.18033C15.9056 5.22428 16.3232 5.33755 16.7171 5.51168C17.1093 5.6875 17.4727 5.92248 17.7923 6.21157C18.1118 6.49896 18.384 6.83538 18.5987 7.209C18.7423 7.45582 18.8607 7.71786 18.9503 7.99173C19.0399 8.26391 19.1007 8.54454 19.1295 8.83024C19.1599 9.11595 19.1599 9.40334 19.1278 9.68905C19.0974 9.97475 19.0348 10.2554 18.9452 10.5276C19.2343 10.8471 19.4693 11.2089 19.6451 11.6028ZM14.0122 18.8197C14.3807 18.6676 14.7154 18.4428 14.9978 18.1604C15.2801 17.8781 15.5049 17.5434 15.6571 17.1731C15.8092 16.8046 15.8887 16.409 15.8887 16.01V12.2401C15.8876 12.2367 15.8864 12.2328 15.8853 12.2283C15.8842 12.2249 15.8825 12.2215 15.8802 12.2181C15.878 12.2147 15.8752 12.2119 15.8718 12.2097C15.8684 12.2063 15.865 12.204 15.8616 12.2029L14.4974 11.4151V15.9695C14.4974 16.0151 14.4906 16.0624 14.4788 16.1064C14.4669 16.152 14.45 16.1943 14.4264 16.2349C14.4027 16.2755 14.3756 16.3126 14.3418 16.3448C14.309 16.3775 14.272 16.4059 14.2319 16.4293L11.0013 18.294C10.9742 18.3109 10.9286 18.3346 10.9049 18.3481C11.0385 18.4613 11.1839 18.5611 11.336 18.649C11.4899 18.7369 11.6488 18.8113 11.8144 18.8722C11.9801 18.9313 12.1509 18.977 12.3233 19.0074C12.4974 19.0378 12.6732 19.053 12.8491 19.053C13.248 19.053 13.6436 18.9736 14.0122 18.8197ZM6.31844 16.2602C6.51962 16.6068 6.78504 16.9077 7.10117 17.1512C7.419 17.3946 7.77908 17.5721 8.16453 17.6752C8.54998 17.7784 8.95233 17.8054 9.34792 17.753C9.74351 17.7006 10.1239 17.5721 10.4705 17.3726L13.7366 15.4877L13.7451 15.4792C13.7473 15.477 13.749 15.4736 13.7501 15.4691C13.7524 15.4657 13.7541 15.4623 13.7552 15.4589V13.8698L9.81283 16.1504C9.77225 16.174 9.72999 16.1909 9.68603 16.2045C9.64039 16.2163 9.59474 16.2214 9.54741 16.2214C9.50176 16.2214 9.45612 16.2163 9.41047 16.2045C9.36652 16.1909 9.32256 16.174 9.28199 16.1504L6.05133 14.284C6.0226 14.2671 5.98033 14.2417 5.95666 14.2265C5.92623 14.4006 5.91102 14.5764 5.91102 14.7523C5.91102 14.9281 5.92792 15.1039 5.95835 15.278C5.98878 15.4505 6.03612 15.6212 6.09529 15.7869C6.15615 15.9526 6.23053 16.1115 6.31844 16.2636V16.2602ZM5.46978 9.21062C5.2703 9.55718 5.14182 9.93925 5.08941 10.3348C5.037 10.7304 5.06405 11.1311 5.16717 11.5182C5.2703 11.9037 5.44781 12.2638 5.69125 12.5816C5.93469 12.8977 6.2373 13.1631 6.58217 13.3626L9.84664 15.2493C9.85002 15.2504 9.85396 15.2515 9.85847 15.2527H9.8703C9.87481 15.2527 9.87876 15.2515 9.88214 15.2493C9.88552 15.2482 9.8889 15.2465 9.89228 15.2442L11.2616 14.453L7.31925 12.1775C7.28037 12.1539 7.24318 12.1251 7.20937 12.093C7.17661 12.0602 7.1482 12.0232 7.12484 11.9831C7.10286 11.9426 7.08427 11.9003 7.07243 11.8547C7.0606 11.8107 7.05384 11.7651 7.05553 11.7177V7.87846C6.88985 7.93932 6.72925 8.0137 6.5771 8.10161C6.42495 8.19121 6.28125 8.29265 6.14601 8.40591C6.01245 8.51918 5.88735 8.64428 5.77408 8.77953C5.66082 8.91308 5.56107 9.05847 5.47316 9.21062H5.46978ZM16.6832 11.8208C16.7238 11.8445 16.761 11.8716 16.7948 11.9054C16.8269 11.9375 16.8557 11.9747 16.8794 12.0153C16.9013 12.0558 16.9199 12.0998 16.9318 12.1437C16.9419 12.1894 16.9487 12.235 16.947 12.2824V16.1216C17.4896 15.9221 17.963 15.5722 18.3129 15.1124C18.6646 14.6525 18.8759 14.1031 18.9249 13.5283C18.974 12.9535 18.859 12.3753 18.5919 11.8631C18.3248 11.3509 17.9174 10.9248 17.417 10.6374L14.1525 8.75079C14.1491 8.74966 14.1452 8.74853 14.1407 8.74741H14.1288C14.1254 8.74853 14.1215 8.74966 14.117 8.75079C14.1136 8.75191 14.1102 8.7536 14.1068 8.75586L12.7443 9.54366L16.6866 11.8208H16.6832ZM18.0441 9.77526H18.0425V9.77695L18.0441 9.77526ZM18.0425 9.77357C18.1405 9.20555 18.0746 8.62061 17.8514 8.08809C17.63 7.55556 17.2597 7.09742 16.7864 6.76607C16.313 6.43641 15.7551 6.24707 15.1787 6.22171C14.6005 6.19804 14.0291 6.33836 13.5287 6.62575L10.2642 8.51073C10.2608 8.51298 10.258 8.5158 10.2558 8.51918L10.249 8.52932C10.2479 8.5327 10.2467 8.53665 10.2456 8.54116C10.2445 8.54454 10.2439 8.54848 10.2439 8.55299V10.1286L14.1863 7.85141C14.2269 7.82774 14.2708 7.81084 14.3148 7.79731C14.3604 7.78548 14.4061 7.78041 14.4517 7.78041C14.499 7.78041 14.5447 7.78548 14.5903 7.79731C14.6343 7.81084 14.6766 7.82774 14.7171 7.85141L17.9478 9.71778C17.9765 9.73469 18.0188 9.75836 18.0425 9.77357ZM9.50007 8.02892C9.50007 7.98327 9.50683 7.93763 9.51867 7.89198C9.5305 7.84803 9.54741 7.80407 9.57108 7.7635C9.59474 7.72462 9.62179 7.68743 9.6556 7.65361C9.68772 7.62149 9.72492 7.59275 9.76549 7.57078L12.9961 5.70609C13.0266 5.6875 13.0688 5.66383 13.0925 5.65199C12.6496 5.28176 12.1086 5.04508 11.5355 4.97239C10.9624 4.89801 10.3809 4.9893 9.85847 5.23443C9.3344 5.47956 8.89147 5.87008 8.5821 6.35696C8.27273 6.84553 8.10874 7.41017 8.10874 7.98834V11.7583C8.10987 11.7628 8.111 11.7667 8.11212 11.7701C8.11325 11.7735 8.11494 11.7769 8.1172 11.7803C8.11945 11.7836 8.12227 11.787 8.12565 11.7904C8.1279 11.7927 8.13128 11.7949 8.13579 11.7972L9.50007 12.585V8.02892ZM10.2405 13.011L11.997 14.0253L13.7535 13.011V10.984L11.9987 9.96968L10.2422 10.984L10.2405 13.011Z" fill="white"/>
+<rect x="0.5" y="0.5" width="23" height="23" rx="5.5" stroke="black" stroke-opacity="0.05"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/huggingface-text-hub.svg b/app/components/base/icons/assets/public/llm/huggingface-text-hub.svg
new file mode 100644
index 0000000..a6b85be
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/huggingface-text-hub.svg
@@ -0,0 +1,45 @@
+<svg width="151" height="24" viewBox="0 0 151 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_8587_60397)">
+<g clip-path="url(#clip1_8587_60397)">
+<path d="M12.9267 20.2062C17.7747 20.2062 21.7049 16.2761 21.7049 11.428C21.7049 6.57993 17.7747 2.64978 12.9267 2.64978C8.07858 2.64978 4.14844 6.57993 4.14844 11.428C4.14844 16.2761 8.07858 20.2062 12.9267 20.2062Z" fill="#FFD21E"/>
+<path d="M21.7075 11.4326C21.7075 6.58451 17.7774 2.65436 12.9293 2.65436C8.08123 2.65436 4.15108 6.58451 4.15108 11.4326C4.15108 16.2807 8.08123 20.2108 12.9293 20.2108C17.7774 20.2108 21.7075 16.2807 21.7075 11.4326ZM3.14062 11.4326C3.14062 6.02647 7.52316 1.64392 12.9293 1.64392C18.3354 1.64392 22.718 6.02647 22.718 11.4326C22.718 16.8387 18.3354 21.2213 12.9293 21.2213C7.52316 21.2213 3.14062 16.8387 3.14062 11.4326Z" fill="#FF9D0B"/>
+<path d="M15.7803 9.03703C16.1022 9.1507 16.2303 9.81254 16.5555 9.6396C17.1714 9.31212 17.4052 8.54734 17.0777 7.93142C16.7503 7.31553 15.9855 7.08172 15.3696 7.4092C14.7536 7.73669 14.5198 8.50147 14.8473 9.11738C15.0019 9.40809 15.4925 8.9354 15.7803 9.03703Z" fill="#3A3B45"/>
+<path d="M9.83227 9.03703C9.51034 9.1507 9.38227 9.81254 9.05706 9.6396C8.44114 9.31212 8.20733 8.54734 8.53481 7.93142C8.8623 7.31553 9.62708 7.08172 10.243 7.4092C10.8589 7.73669 11.0927 8.50147 10.7652 9.11738C10.6107 9.40809 10.12 8.9354 9.83227 9.03703Z" fill="#3A3B45"/>
+<path d="M12.866 15.1044C15.3487 15.1044 16.1499 12.8908 16.1499 11.7541C16.1499 11.1633 15.7528 11.3492 15.1167 11.6641C14.5289 11.9551 13.7371 12.3563 12.866 12.3563C11.0523 12.3563 9.58203 10.6173 9.58203 11.7541C9.58203 12.8908 10.3832 15.1044 12.866 15.1044Z" fill="#3A3B45"/>
+<mask id="mask0_8587_60397" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="9" y="11" width="8" height="5">
+<path d="M12.8543 15.1005C15.337 15.1005 16.1382 12.8869 16.1382 11.7502C16.1382 11.1594 15.7411 11.3453 15.105 11.6602C14.5172 11.9512 13.7253 12.3524 12.8543 12.3524C11.0406 12.3524 9.57031 10.6134 9.57031 11.7502C9.57031 12.8869 10.3715 15.1005 12.8543 15.1005Z" fill="white"/>
+</mask>
+<g mask="url(#mask0_8587_60397)">
+<path d="M12.9175 17.6824C14.1274 17.6824 15.1083 16.7016 15.1083 15.4916C15.1083 14.5491 14.5133 13.7457 13.6783 13.4364C13.6476 13.425 13.6166 13.4143 13.5852 13.4043C13.3747 13.337 13.1503 14.0606 12.9175 14.0606C12.6999 14.0606 12.4897 13.3324 12.2913 13.3915C11.3864 13.6609 10.7266 14.4991 10.7266 15.4916C10.7266 16.7016 11.7075 17.6824 12.9175 17.6824Z" fill="#F94040"/>
+</g>
+<path d="M18.8679 10.2273C19.3213 10.2273 19.6888 9.85972 19.6888 9.40631C19.6888 8.9529 19.3213 8.58533 18.8679 8.58533C18.4144 8.58533 18.0469 8.9529 18.0469 9.40631C18.0469 9.85972 18.4144 10.2273 18.8679 10.2273Z" fill="#FF9D0B"/>
+<path d="M7.11786 10.2273C7.57127 10.2273 7.93885 9.85972 7.93885 9.40631C7.93885 8.9529 7.57127 8.58533 7.11786 8.58533C6.66442 8.58533 6.29688 8.9529 6.29688 9.40631C6.29688 9.85972 6.66442 10.2273 7.11786 10.2273Z" fill="#FF9D0B"/>
+<path d="M5.4272 13.0092C5.01822 13.0092 4.6527 13.1771 4.39781 13.4818C4.24018 13.6705 4.07548 13.9746 4.06209 14.4301C3.89057 14.3808 3.72561 14.3533 3.57152 14.3533C3.17997 14.3533 2.82632 14.5033 2.57623 14.7759C2.25491 15.1258 2.11219 15.5557 2.17433 15.9859C2.20389 16.1908 2.27234 16.3744 2.37465 16.5444C2.15892 16.719 2.00003 16.962 1.92323 17.2543C1.86311 17.4834 1.80148 17.9606 2.1233 18.4522C2.10284 18.4842 2.08364 18.5176 2.06571 18.5517C1.87221 18.919 1.85983 19.334 2.03059 19.7205C2.28952 20.3063 2.93292 20.7678 4.18233 21.2632C4.95962 21.5714 5.67072 21.7684 5.67703 21.7702C6.70465 22.0367 7.63401 22.1721 8.43858 22.1721C9.91736 22.1721 10.9761 21.7192 11.5854 20.8259C12.566 19.3876 12.4258 18.072 11.1569 16.8039C10.4547 16.1021 9.98784 15.0674 9.89058 14.8403C9.69456 14.1679 9.1762 13.4204 8.31454 13.4204C8.24205 13.4204 8.16854 13.4262 8.09629 13.4376C7.71889 13.4969 7.38898 13.7142 7.15329 14.0411C6.89891 13.7248 6.65186 13.4732 6.4283 13.3312C6.09132 13.1175 5.75459 13.0092 5.4272 13.0092ZM5.4272 14.0196C5.55603 14.0196 5.71341 14.0744 5.88695 14.1846C6.42577 14.5263 7.46552 16.3136 7.8462 17.0087C7.97377 17.2417 8.19178 17.3402 8.38805 17.3402C8.77758 17.3402 9.08172 16.9529 8.42367 16.4608C7.4342 15.7204 7.78128 14.5102 8.25366 14.4356C8.27438 14.4324 8.29484 14.4308 8.31454 14.4308C8.74398 14.4308 8.93344 15.171 8.93344 15.171C8.93344 15.171 9.48868 16.5654 10.4425 17.5185C11.3964 18.4719 11.4457 19.237 10.7505 20.2566C10.2763 20.9517 9.36869 21.1617 8.43858 21.1617C7.47386 21.1617 6.48488 20.9358 5.93066 20.7921C5.90337 20.785 2.53279 19.8329 2.9597 19.0226C3.03144 18.8864 3.14966 18.8318 3.29845 18.8318C3.89966 18.8318 4.99322 19.7266 5.46332 19.7266C5.56841 19.7266 5.64243 19.6819 5.67274 19.5727C5.87306 18.8541 2.62701 18.5519 2.90059 17.5109C2.94884 17.3268 3.07969 17.252 3.26359 17.2523C4.05805 17.2523 5.84047 18.6495 6.21408 18.6495C6.24263 18.6495 6.26309 18.6411 6.27421 18.6234C6.46139 18.3213 6.35883 18.1104 5.03944 17.3119C3.72006 16.5131 2.79398 16.0327 3.32068 15.4592C3.38131 15.393 3.46719 15.3637 3.57152 15.3637C4.37255 15.364 6.26511 17.0863 6.26511 17.0863C6.26511 17.0863 6.77589 17.6175 7.08483 17.6175C7.15582 17.6175 7.21619 17.5895 7.25711 17.5203C7.47613 17.151 5.22284 15.4433 5.09578 14.7388C5.00964 14.2613 5.15615 14.0196 5.4272 14.0196Z" fill="#FF9D0B"/>
+<path d="M10.7569 20.2539C11.4521 19.2344 11.4028 18.4692 10.4489 17.5159C9.49509 16.5628 8.93985 15.1684 8.93985 15.1684C8.93985 15.1684 8.73245 14.3585 8.26007 14.433C7.78769 14.5075 7.44085 15.7178 8.43033 16.4582C9.41981 17.1984 8.2333 17.7013 7.85261 17.0061C7.47193 16.3109 6.43243 14.5237 5.89336 14.1819C5.35454 13.8402 4.97512 14.0316 5.10218 14.7362C5.22925 15.4407 7.48279 17.1483 7.26352 17.5179C7.04426 17.8872 6.27152 17.0837 6.27152 17.0837C6.27152 17.0837 3.85353 14.8832 3.32707 15.4566C2.80063 16.03 3.72646 16.5105 5.04585 17.3093C6.36549 18.1078 6.4678 18.3187 6.28061 18.6208C6.09317 18.9229 3.18056 16.4673 2.90698 17.5083C2.63365 18.5493 5.87947 18.8514 5.67915 19.5701C5.47883 20.2891 3.39275 18.2098 2.96609 19.0199C2.53918 19.8303 5.90978 20.7824 5.93706 20.7895C7.02582 21.0719 9.79089 21.6703 10.7569 20.2539Z" fill="#FFD21E"/>
+<path d="M20.5549 13.0092C20.9639 13.0092 21.3294 13.1771 21.5843 13.4818C21.7419 13.6705 21.9066 13.9746 21.92 14.4301C22.0915 14.3808 22.2565 14.3533 22.4106 14.3533C22.8021 14.3533 23.1558 14.5033 23.4058 14.7759C23.7272 15.1258 23.8699 15.5557 23.8078 15.9859C23.7782 16.1908 23.7097 16.3744 23.6074 16.5444C23.8232 16.719 23.9821 16.962 24.0588 17.2543C24.119 17.4834 24.1806 17.9606 23.8588 18.4522C23.8792 18.4842 23.8984 18.5176 23.9164 18.5517C24.1099 18.919 24.1223 19.334 23.9515 19.7205C23.6926 20.3063 23.0492 20.7678 21.7997 21.2632C21.0225 21.5714 20.3114 21.7684 20.305 21.7702C19.2774 22.0367 18.3481 22.1721 17.5435 22.1721C16.0647 22.1721 15.006 21.7192 14.3967 20.8259C13.4161 19.3876 13.5563 18.072 14.8252 16.8039C15.5274 16.1021 15.9942 15.0674 16.0915 14.8403C16.2875 14.1679 16.8059 13.4204 17.6675 13.4204C17.74 13.4204 17.8135 13.4262 17.8858 13.4376C18.2632 13.4969 18.5931 13.7142 18.8288 14.0411C19.0832 13.7248 19.3302 13.4732 19.5538 13.3312C19.8908 13.1175 20.2275 13.0092 20.5549 13.0092ZM20.5549 14.0196C20.4261 14.0196 20.2687 14.0744 20.0951 14.1846C19.5563 14.5263 18.5166 16.3136 18.1359 17.0087C18.0083 17.2417 17.7903 17.3402 17.594 17.3402C17.2045 17.3402 16.9004 16.9529 17.5584 16.4608C18.5479 15.7204 18.2008 14.5102 17.7284 14.4356C17.7077 14.4324 17.6872 14.4308 17.6675 14.4308C17.2381 14.4308 17.0486 15.171 17.0486 15.171C17.0486 15.171 16.4934 16.5654 15.5395 17.5185C14.5857 18.4719 14.5364 19.237 15.2316 20.2566C15.7058 20.9517 16.6134 21.1617 17.5435 21.1617C18.5082 21.1617 19.4972 20.9358 20.0514 20.7921C20.0787 20.785 23.4493 19.8329 23.0224 19.0226C22.9506 18.8864 22.8324 18.8318 22.6836 18.8318C22.0824 18.8318 20.9889 19.7266 20.5188 19.7266C20.4137 19.7266 20.3397 19.6819 20.3093 19.5727C20.109 18.8541 23.3551 18.5519 23.0815 17.5109C23.0332 17.3268 22.9024 17.252 22.7185 17.2523C21.924 17.2523 20.1416 18.6495 19.768 18.6495C19.7395 18.6495 19.719 18.6411 19.7079 18.6234C19.5207 18.3213 19.6233 18.1104 20.9426 17.3119C22.262 16.5131 23.1881 16.0327 22.6614 15.4592C22.6008 15.393 22.5149 15.3637 22.4106 15.3637C21.6095 15.364 19.717 17.0863 19.717 17.0863C19.717 17.0863 19.2062 17.6175 18.8972 17.6175C18.8263 17.6175 18.7659 17.5895 18.725 17.5203C18.506 17.151 20.7592 15.4433 20.8863 14.7388C20.9724 14.2613 20.8259 14.0196 20.5549 14.0196Z" fill="#FF9D0B"/>
+<path d="M15.2334 20.2539C14.5382 19.2344 14.5875 18.4692 15.5414 17.5159C16.4952 16.5628 17.0505 15.1684 17.0505 15.1684C17.0505 15.1684 17.2578 14.3585 17.7302 14.433C18.2026 14.5075 18.5494 15.7178 17.56 16.4582C16.5705 17.1984 17.757 17.7013 18.1377 17.0061C18.5184 16.3109 19.5579 14.5237 20.0969 14.1819C20.6358 13.8402 21.0152 14.0316 20.8881 14.7362C20.7611 15.4407 18.5075 17.1483 18.7268 17.5179C18.946 17.8872 19.7188 17.0837 19.7188 17.0837C19.7188 17.0837 22.1368 14.8832 22.6632 15.4566C23.1897 16.03 22.2638 16.5105 20.9445 17.3093C19.6248 18.1078 19.5225 18.3187 19.7097 18.6208C19.8971 18.9229 22.8097 16.4673 23.0833 17.5083C23.3566 18.5493 20.1108 18.8514 20.3112 19.5701C20.5115 20.2891 22.5975 18.2098 23.0242 19.0199C23.4511 19.8303 20.0805 20.7824 20.0532 20.7895C18.9645 21.0719 16.1994 21.6703 15.2334 20.2539Z" fill="#FFD21E"/>
+</g>
+<path d="M34.1509 17V7.22003H36.3559V10.985H39.7309V7.22003H41.9509V17H39.7309V12.92H36.3559V17H34.1509Z" fill="#1D2939"/>
+<path d="M46.3133 17.18C45.5033 17.18 44.9133 16.915 44.5433 16.385C44.1833 15.845 44.0033 15.11 44.0033 14.18V9.56003H46.2083V13.895C46.2083 14.425 46.2833 14.795 46.4333 15.005C46.5833 15.205 46.8183 15.305 47.1383 15.305C47.4183 15.305 47.6533 15.24 47.8433 15.11C48.0333 14.98 48.2383 14.77 48.4583 14.48V9.56003H50.6633V17H48.8633L48.6983 15.965H48.6533C48.3433 16.335 48.0033 16.63 47.6333 16.85C47.2633 17.07 46.8233 17.18 46.3133 17.18Z" fill="#1D2939"/>
+<path d="M55.2587 20.165C54.6787 20.165 54.1537 20.1 53.6837 19.97C53.2137 19.84 52.8387 19.635 52.5587 19.355C52.2787 19.075 52.1387 18.715 52.1387 18.275C52.1387 17.675 52.4937 17.175 53.2037 16.775V16.715C53.0137 16.585 52.8487 16.42 52.7087 16.22C52.5787 16.02 52.5137 15.765 52.5137 15.455C52.5137 15.185 52.5937 14.925 52.7537 14.675C52.9137 14.425 53.1137 14.22 53.3537 14.06V14C53.0937 13.82 52.8587 13.56 52.6487 13.22C52.4487 12.88 52.3487 12.495 52.3487 12.065C52.3487 11.465 52.4937 10.97 52.7837 10.58C53.0737 10.18 53.4537 9.88003 53.9237 9.68003C54.3937 9.48003 54.8937 9.38003 55.4237 9.38003C55.8637 9.38003 56.2487 9.44003 56.5787 9.56003H59.2937V11.165H58.1087C58.1787 11.275 58.2337 11.415 58.2737 11.585C58.3237 11.755 58.3487 11.94 58.3487 12.14C58.3487 12.71 58.2187 13.18 57.9587 13.55C57.6987 13.92 57.3487 14.195 56.9087 14.375C56.4687 14.555 55.9737 14.645 55.4237 14.645C55.1337 14.645 54.8337 14.595 54.5237 14.495C54.3437 14.645 54.2537 14.83 54.2537 15.05C54.2537 15.24 54.3387 15.38 54.5087 15.47C54.6787 15.56 54.9687 15.605 55.3787 15.605H56.5787C57.4987 15.605 58.1987 15.755 58.6787 16.055C59.1687 16.345 59.4137 16.825 59.4137 17.495C59.4137 18.005 59.2437 18.46 58.9037 18.86C58.5637 19.27 58.0837 19.59 57.4637 19.82C56.8437 20.05 56.1087 20.165 55.2587 20.165ZM55.4237 13.31C55.7137 13.31 55.9537 13.205 56.1437 12.995C56.3437 12.785 56.4437 12.475 56.4437 12.065C56.4437 11.675 56.3437 11.38 56.1437 11.18C55.9537 10.97 55.7137 10.865 55.4237 10.865C55.1337 10.865 54.8887 10.965 54.6887 11.165C54.4987 11.365 54.4037 11.665 54.4037 12.065C54.4037 12.475 54.4987 12.785 54.6887 12.995C54.8887 13.205 55.1337 13.31 55.4237 13.31ZM55.6037 18.785C56.1037 18.785 56.5137 18.695 56.8337 18.515C57.1537 18.335 57.3137 18.12 57.3137 17.87C57.3137 17.64 57.2137 17.485 57.0137 17.405C56.8237 17.325 56.5437 17.285 56.1737 17.285H55.4087C55.1587 17.285 54.9487 17.275 54.7787 17.255C54.6187 17.245 54.4787 17.225 54.3587 17.195C54.0887 17.435 53.9537 17.68 53.9537 17.93C53.9537 18.21 54.1037 18.42 54.4037 18.56C54.7137 18.71 55.1137 18.785 55.6037 18.785Z" fill="#1D2939"/>
+<path d="M63.2714 20.165C62.6914 20.165 62.1664 20.1 61.6964 19.97C61.2264 19.84 60.8514 19.635 60.5714 19.355C60.2914 19.075 60.1514 18.715 60.1514 18.275C60.1514 17.675 60.5064 17.175 61.2164 16.775V16.715C61.0264 16.585 60.8614 16.42 60.7214 16.22C60.5914 16.02 60.5264 15.765 60.5264 15.455C60.5264 15.185 60.6064 14.925 60.7664 14.675C60.9264 14.425 61.1264 14.22 61.3664 14.06V14C61.1064 13.82 60.8714 13.56 60.6614 13.22C60.4614 12.88 60.3614 12.495 60.3614 12.065C60.3614 11.465 60.5064 10.97 60.7964 10.58C61.0864 10.18 61.4664 9.88003 61.9364 9.68003C62.4064 9.48003 62.9064 9.38003 63.4364 9.38003C63.8764 9.38003 64.2614 9.44003 64.5914 9.56003H67.3064V11.165H66.1214C66.1914 11.275 66.2464 11.415 66.2864 11.585C66.3364 11.755 66.3614 11.94 66.3614 12.14C66.3614 12.71 66.2314 13.18 65.9714 13.55C65.7114 13.92 65.3614 14.195 64.9214 14.375C64.4814 14.555 63.9864 14.645 63.4364 14.645C63.1464 14.645 62.8464 14.595 62.5364 14.495C62.3564 14.645 62.2664 14.83 62.2664 15.05C62.2664 15.24 62.3514 15.38 62.5214 15.47C62.6914 15.56 62.9814 15.605 63.3914 15.605H64.5914C65.5114 15.605 66.2114 15.755 66.6914 16.055C67.1814 16.345 67.4264 16.825 67.4264 17.495C67.4264 18.005 67.2564 18.46 66.9164 18.86C66.5764 19.27 66.0964 19.59 65.4764 19.82C64.8564 20.05 64.1214 20.165 63.2714 20.165ZM63.4364 13.31C63.7264 13.31 63.9664 13.205 64.1564 12.995C64.3564 12.785 64.4564 12.475 64.4564 12.065C64.4564 11.675 64.3564 11.38 64.1564 11.18C63.9664 10.97 63.7264 10.865 63.4364 10.865C63.1464 10.865 62.9014 10.965 62.7014 11.165C62.5114 11.365 62.4164 11.665 62.4164 12.065C62.4164 12.475 62.5114 12.785 62.7014 12.995C62.9014 13.205 63.1464 13.31 63.4364 13.31ZM63.6164 18.785C64.1164 18.785 64.5264 18.695 64.8464 18.515C65.1664 18.335 65.3264 18.12 65.3264 17.87C65.3264 17.64 65.2264 17.485 65.0264 17.405C64.8364 17.325 64.5564 17.285 64.1864 17.285H63.4214C63.1714 17.285 62.9614 17.275 62.7914 17.255C62.6314 17.245 62.4914 17.225 62.3714 17.195C62.1014 17.435 61.9664 17.68 61.9664 17.93C61.9664 18.21 62.1164 18.42 62.4164 18.56C62.7264 18.71 63.1264 18.785 63.6164 18.785Z" fill="#1D2939"/>
+<path d="M68.6291 17V9.56003H70.8341V17H68.6291ZM69.7241 8.46503C69.3541 8.46503 69.0541 8.36003 68.8241 8.15003C68.5941 7.94003 68.4791 7.66003 68.4791 7.31003C68.4791 6.96003 68.5941 6.68003 68.8241 6.47003C69.0541 6.26003 69.3541 6.15503 69.7241 6.15503C70.0941 6.15503 70.3941 6.26003 70.6241 6.47003C70.8541 6.68003 70.9691 6.96003 70.9691 7.31003C70.9691 7.66003 70.8541 7.94003 70.6241 8.15003C70.3941 8.36003 70.0941 8.46503 69.7241 8.46503Z" fill="#1D2939"/>
+<path d="M72.7746 17V9.56003H74.5746L74.7246 10.505H74.7846C75.1046 10.205 75.4546 9.94503 75.8346 9.72503C76.2246 9.49503 76.6696 9.38003 77.1696 9.38003C77.9796 9.38003 78.5646 9.65003 78.9246 10.19C79.2946 10.72 79.4796 11.45 79.4796 12.38V17H77.2746V12.665C77.2746 12.125 77.1996 11.755 77.0496 11.555C76.9096 11.355 76.6796 11.255 76.3596 11.255C76.0796 11.255 75.8396 11.32 75.6396 11.45C75.4396 11.57 75.2196 11.745 74.9796 11.975V17H72.7746Z" fill="#1D2939"/>
+<path d="M84.0136 20.165C83.4336 20.165 82.9086 20.1 82.4386 19.97C81.9686 19.84 81.5936 19.635 81.3136 19.355C81.0336 19.075 80.8936 18.715 80.8936 18.275C80.8936 17.675 81.2486 17.175 81.9586 16.775V16.715C81.7686 16.585 81.6036 16.42 81.4636 16.22C81.3336 16.02 81.2686 15.765 81.2686 15.455C81.2686 15.185 81.3486 14.925 81.5086 14.675C81.6686 14.425 81.8686 14.22 82.1086 14.06V14C81.8486 13.82 81.6136 13.56 81.4036 13.22C81.2036 12.88 81.1036 12.495 81.1036 12.065C81.1036 11.465 81.2486 10.97 81.5386 10.58C81.8286 10.18 82.2086 9.88003 82.6786 9.68003C83.1486 9.48003 83.6486 9.38003 84.1786 9.38003C84.6186 9.38003 85.0036 9.44003 85.3336 9.56003H88.0486V11.165H86.8636C86.9336 11.275 86.9886 11.415 87.0286 11.585C87.0786 11.755 87.1036 11.94 87.1036 12.14C87.1036 12.71 86.9736 13.18 86.7136 13.55C86.4536 13.92 86.1036 14.195 85.6636 14.375C85.2236 14.555 84.7286 14.645 84.1786 14.645C83.8886 14.645 83.5886 14.595 83.2786 14.495C83.0986 14.645 83.0086 14.83 83.0086 15.05C83.0086 15.24 83.0936 15.38 83.2636 15.47C83.4336 15.56 83.7236 15.605 84.1336 15.605H85.3336C86.2536 15.605 86.9536 15.755 87.4336 16.055C87.9236 16.345 88.1686 16.825 88.1686 17.495C88.1686 18.005 87.9986 18.46 87.6586 18.86C87.3186 19.27 86.8386 19.59 86.2186 19.82C85.5986 20.05 84.8636 20.165 84.0136 20.165ZM84.1786 13.31C84.4686 13.31 84.7086 13.205 84.8986 12.995C85.0986 12.785 85.1986 12.475 85.1986 12.065C85.1986 11.675 85.0986 11.38 84.8986 11.18C84.7086 10.97 84.4686 10.865 84.1786 10.865C83.8886 10.865 83.6436 10.965 83.4436 11.165C83.2536 11.365 83.1586 11.665 83.1586 12.065C83.1586 12.475 83.2536 12.785 83.4436 12.995C83.6436 13.205 83.8886 13.31 84.1786 13.31ZM84.3586 18.785C84.8586 18.785 85.2686 18.695 85.5886 18.515C85.9086 18.335 86.0686 18.12 86.0686 17.87C86.0686 17.64 85.9686 17.485 85.7686 17.405C85.5786 17.325 85.2986 17.285 84.9286 17.285H84.1636C83.9136 17.285 83.7036 17.275 83.5336 17.255C83.3736 17.245 83.2336 17.225 83.1136 17.195C82.8436 17.435 82.7086 17.68 82.7086 17.93C82.7086 18.21 82.8586 18.42 83.1586 18.56C83.4686 18.71 83.8686 18.785 84.3586 18.785Z" fill="#1D2939"/>
+<path d="M92.5542 17V7.22003H98.7192V9.08003H94.7592V11.345H98.1492V13.205H94.7592V17H92.5542Z" fill="#1D2939"/>
+<path d="M101.544 17.18C100.864 17.18 100.324 16.965 99.9241 16.535C99.5241 16.095 99.3241 15.56 99.3241 14.93C99.3241 14.15 99.6541 13.54 100.314 13.1C100.974 12.66 102.039 12.365 103.509 12.215C103.489 11.885 103.389 11.625 103.209 11.435C103.039 11.235 102.749 11.135 102.339 11.135C102.029 11.135 101.714 11.195 101.394 11.315C101.074 11.435 100.734 11.6 100.374 11.81L99.5791 10.355C100.049 10.065 100.549 9.83003 101.079 9.65003C101.619 9.47003 102.179 9.38003 102.759 9.38003C103.709 9.38003 104.439 9.65503 104.949 10.205C105.459 10.755 105.714 11.6 105.714 12.74V17H103.914L103.764 16.235H103.704C103.394 16.515 103.059 16.745 102.699 16.925C102.349 17.095 101.964 17.18 101.544 17.18ZM102.294 15.47C102.544 15.47 102.759 15.415 102.939 15.305C103.129 15.185 103.319 15.03 103.509 14.84V13.535C102.729 13.635 102.189 13.795 101.889 14.015C101.589 14.225 101.439 14.475 101.439 14.765C101.439 15.005 101.514 15.185 101.664 15.305C101.824 15.415 102.034 15.47 102.294 15.47Z" fill="#1D2939"/>
+<path d="M110.819 17.18C110.129 17.18 109.504 17.03 108.944 16.73C108.394 16.42 107.954 15.975 107.624 15.395C107.304 14.805 107.144 14.1 107.144 13.28C107.144 12.45 107.324 11.745 107.684 11.165C108.044 10.585 108.519 10.145 109.109 9.84503C109.699 9.53503 110.334 9.38003 111.014 9.38003C111.474 9.38003 111.879 9.45503 112.229 9.60503C112.589 9.75503 112.909 9.94503 113.189 10.175L112.154 11.6C111.804 11.31 111.469 11.165 111.149 11.165C110.619 11.165 110.194 11.355 109.874 11.735C109.564 12.115 109.409 12.63 109.409 13.28C109.409 13.92 109.564 14.435 109.874 14.825C110.194 15.205 110.594 15.395 111.074 15.395C111.314 15.395 111.549 15.345 111.779 15.245C112.009 15.135 112.219 15.005 112.409 14.855L113.279 16.295C112.909 16.615 112.509 16.845 112.079 16.985C111.649 17.115 111.229 17.18 110.819 17.18Z" fill="#1D2939"/>
+<path d="M117.486 17.18C116.776 17.18 116.136 17.025 115.566 16.715C114.996 16.405 114.546 15.96 114.216 15.38C113.886 14.8 113.721 14.1 113.721 13.28C113.721 12.47 113.886 11.775 114.216 11.195C114.556 10.615 114.996 10.17 115.536 9.86003C116.076 9.54003 116.641 9.38003 117.231 9.38003C117.941 9.38003 118.526 9.54003 118.986 9.86003C119.456 10.17 119.806 10.595 120.036 11.135C120.276 11.665 120.396 12.27 120.396 12.95C120.396 13.14 120.386 13.33 120.366 13.52C120.346 13.7 120.326 13.835 120.306 13.925H115.851C115.951 14.465 116.176 14.865 116.526 15.125C116.876 15.375 117.296 15.5 117.786 15.5C118.316 15.5 118.851 15.335 119.391 15.005L120.126 16.34C119.746 16.6 119.321 16.805 118.851 16.955C118.381 17.105 117.926 17.18 117.486 17.18ZM115.836 12.47H118.521C118.521 12.06 118.421 11.725 118.221 11.465C118.031 11.195 117.716 11.06 117.276 11.06C116.936 11.06 116.631 11.18 116.361 11.42C116.091 11.65 115.916 12 115.836 12.47Z" fill="#1D2939"/>
+<path d="M125.103 17V7.22003H127.308V10.985H130.683V7.22003H132.903V17H130.683V12.92H127.308V17H125.103Z" fill="#1D2939"/>
+<path d="M137.265 17.18C136.455 17.18 135.865 16.915 135.495 16.385C135.135 15.845 134.955 15.11 134.955 14.18V9.56003H137.16V13.895C137.16 14.425 137.235 14.795 137.385 15.005C137.535 15.205 137.77 15.305 138.09 15.305C138.37 15.305 138.605 15.24 138.795 15.11C138.985 14.98 139.19 14.77 139.41 14.48V9.56003H141.615V17H139.815L139.65 15.965H139.605C139.295 16.335 138.955 16.63 138.585 16.85C138.215 17.07 137.775 17.18 137.265 17.18Z" fill="#1D2939"/>
+<path d="M147.456 17.18C147.126 17.18 146.791 17.1 146.451 16.94C146.121 16.77 145.811 16.525 145.521 16.205H145.461L145.281 17H143.556V6.48503H145.761V9.06503L145.701 10.205C145.991 9.94503 146.306 9.74503 146.646 9.60503C146.986 9.45503 147.326 9.38003 147.666 9.38003C148.266 9.38003 148.786 9.53503 149.226 9.84503C149.666 10.155 150.001 10.595 150.231 11.165C150.471 11.725 150.591 12.385 150.591 13.145C150.591 13.995 150.441 14.725 150.141 15.335C149.841 15.935 149.451 16.395 148.971 16.715C148.501 17.025 147.996 17.18 147.456 17.18ZM146.946 15.38C147.326 15.38 147.651 15.205 147.921 14.855C148.191 14.505 148.326 13.95 148.326 13.19C148.326 11.85 147.896 11.18 147.036 11.18C146.596 11.18 146.171 11.405 145.761 11.855V14.9C145.961 15.08 146.161 15.205 146.361 15.275C146.561 15.345 146.756 15.38 146.946 15.38Z" fill="#1D2939"/>
+</g>
+<defs>
+<clipPath id="clip0_8587_60397">
+<rect x="0.998047" width="150" height="24" rx="6" fill="white"/>
+</clipPath>
+<clipPath id="clip1_8587_60397">
+<rect width="23.998" height="22.2298" fill="white" transform="translate(0.998047 0.885132)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/huggingface-text.svg b/app/components/base/icons/assets/public/llm/huggingface-text.svg
new file mode 100644
index 0000000..70135a0
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/huggingface-text.svg
@@ -0,0 +1,42 @@
+<svg width="120" height="24" viewBox="0 0 120 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_8587_60377)">
+<g clip-path="url(#clip1_8587_60377)">
+<path d="M11.9286 20.2062C16.7767 20.2062 20.7069 16.2761 20.7069 11.428C20.7069 6.57993 16.7767 2.64978 11.9286 2.64978C7.08054 2.64978 3.15039 6.57993 3.15039 11.428C3.15039 16.2761 7.08054 20.2062 11.9286 20.2062Z" fill="#FFD21E"/>
+<path d="M20.7095 11.4326C20.7095 6.58451 16.7793 2.65436 11.9313 2.65436C7.08318 2.65436 3.15303 6.58451 3.15303 11.4326C3.15303 16.2807 7.08318 20.2108 11.9313 20.2108C16.7793 20.2108 20.7095 16.2807 20.7095 11.4326ZM2.14258 11.4326C2.14258 6.02647 6.52511 1.64392 11.9313 1.64392C17.3374 1.64392 21.7199 6.02647 21.7199 11.4326C21.7199 16.8387 17.3374 21.2213 11.9313 21.2213C6.52511 21.2213 2.14258 16.8387 2.14258 11.4326Z" fill="#FF9D0B"/>
+<path d="M14.7822 9.03703C15.1041 9.1507 15.2322 9.81254 15.5574 9.6396C16.1734 9.31212 16.4072 8.54734 16.0797 7.93142C15.7522 7.31553 14.9874 7.08172 14.3715 7.4092C13.7556 7.73669 13.5218 8.50147 13.8493 9.11738C14.0038 9.40809 14.4944 8.9354 14.7822 9.03703Z" fill="#3A3B45"/>
+<path d="M8.83422 9.03703C8.5123 9.1507 8.38422 9.81254 8.05901 9.6396C7.4431 9.31212 7.20928 8.54734 7.53676 7.93142C7.86425 7.31553 8.62903 7.08172 9.24494 7.4092C9.86086 7.73669 10.0947 8.50147 9.76719 9.11738C9.61262 9.40809 9.122 8.9354 8.83422 9.03703Z" fill="#3A3B45"/>
+<path d="M11.8679 15.1044C14.3507 15.1044 15.1519 12.8908 15.1519 11.7541C15.1519 11.1633 14.7547 11.3492 14.1187 11.6641C13.5309 11.9551 12.739 12.3563 11.8679 12.3563C10.0543 12.3563 8.58398 10.6173 8.58398 11.7541C8.58398 12.8908 9.38514 15.1044 11.8679 15.1044Z" fill="#3A3B45"/>
+<mask id="mask0_8587_60377" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="8" y="11" width="8" height="5">
+<path d="M11.8562 15.1005C14.339 15.1005 15.1402 12.8869 15.1402 11.7502C15.1402 11.1594 14.743 11.3453 14.1069 11.6602C13.5191 11.9512 12.7273 12.3524 11.8562 12.3524C10.0425 12.3524 8.57227 10.6134 8.57227 11.7502C8.57227 12.8869 9.37342 15.1005 11.8562 15.1005Z" fill="white"/>
+</mask>
+<g mask="url(#mask0_8587_60377)">
+<path d="M11.9194 17.6824C13.1294 17.6824 14.1103 16.7016 14.1103 15.4916C14.1103 14.5491 13.5152 13.7457 12.6803 13.4364C12.6496 13.425 12.6185 13.4143 12.5872 13.4043C12.3766 13.337 12.1523 14.0606 11.9194 14.0606C11.7018 14.0606 11.4917 13.3324 11.2933 13.3915C10.3884 13.6609 9.72852 14.4991 9.72852 15.4916C9.72852 16.7016 10.7094 17.6824 11.9194 17.6824Z" fill="#F94040"/>
+</g>
+<path d="M17.8698 10.2273C18.3232 10.2273 18.6908 9.85972 18.6908 9.40631C18.6908 8.9529 18.3232 8.58533 17.8698 8.58533C17.4164 8.58533 17.0488 8.9529 17.0488 9.40631C17.0488 9.85972 17.4164 10.2273 17.8698 10.2273Z" fill="#FF9D0B"/>
+<path d="M6.11981 10.2273C6.57323 10.2273 6.9408 9.85972 6.9408 9.40631C6.9408 8.9529 6.57323 8.58533 6.11981 8.58533C5.66638 8.58533 5.29883 8.9529 5.29883 9.40631C5.29883 9.85972 5.66638 10.2273 6.11981 10.2273Z" fill="#FF9D0B"/>
+<path d="M4.42915 13.0092C4.02018 13.0092 3.65465 13.1771 3.39976 13.4818C3.24214 13.6705 3.07743 13.9746 3.06404 14.4301C2.89252 14.3808 2.72757 14.3533 2.57347 14.3533C2.18193 14.3533 1.82827 14.5033 1.57819 14.7759C1.25687 15.1258 1.11414 15.5557 1.17628 15.9859C1.20584 16.1908 1.2743 16.3744 1.3766 16.5444C1.16087 16.719 1.00198 16.962 0.925188 17.2543C0.865067 17.4834 0.803429 17.9606 1.12526 18.4522C1.10479 18.4842 1.0856 18.5176 1.06766 18.5517C0.874161 18.919 0.861783 19.334 1.03255 19.7205C1.29147 20.3063 1.93487 20.7678 3.18429 21.2632C3.96157 21.5714 4.67267 21.7684 4.67899 21.7702C5.70661 22.0367 6.63596 22.1721 7.44053 22.1721C8.91931 22.1721 9.97801 21.7192 10.5873 20.8259C11.5679 19.3876 11.4277 18.072 10.1589 16.8039C9.45662 16.1021 8.98979 15.0674 8.89254 14.8403C8.69651 14.1679 8.17815 13.4204 7.3165 13.4204C7.244 13.4204 7.17049 13.4262 7.09824 13.4376C6.72084 13.4969 6.39093 13.7142 6.15525 14.0411C5.90087 13.7248 5.65381 13.4732 5.43025 13.3312C5.09327 13.1175 4.75654 13.0092 4.42915 13.0092ZM4.42915 14.0196C4.55799 14.0196 4.71536 14.0744 4.88891 14.1846C5.42773 14.5263 6.46747 16.3136 6.84816 17.0087C6.97573 17.2417 7.19373 17.3402 7.39001 17.3402C7.77953 17.3402 8.08368 16.9529 7.42563 16.4608C6.43615 15.7204 6.78324 14.5102 7.25562 14.4356C7.27633 14.4324 7.29679 14.4308 7.3165 14.4308C7.74594 14.4308 7.93539 15.171 7.93539 15.171C7.93539 15.171 8.49063 16.5654 9.44449 17.5185C10.3984 18.4719 10.4476 19.237 9.75243 20.2566C9.27828 20.9517 8.37064 21.1617 7.44053 21.1617C6.47581 21.1617 5.48684 20.9358 4.93261 20.7921C4.90533 20.785 1.53474 19.8329 1.96165 19.0226C2.03339 18.8864 2.15161 18.8318 2.3004 18.8318C2.90162 18.8318 3.99517 19.7266 4.46528 19.7266C4.57036 19.7266 4.64438 19.6819 4.67469 19.5727C4.87501 18.8541 1.62896 18.5519 1.90254 17.5109C1.95079 17.3268 2.08164 17.252 2.26554 17.2523C3.06 17.2523 4.84243 18.6495 5.21604 18.6495C5.24458 18.6495 5.26504 18.6411 5.27616 18.6234C5.46334 18.3213 5.36078 18.1104 4.0414 17.3119C2.72201 16.5131 1.79594 16.0327 2.32263 15.4592C2.38326 15.393 2.46915 15.3637 2.57347 15.3637C3.3745 15.364 5.26706 17.0863 5.26706 17.0863C5.26706 17.0863 5.77784 17.6175 6.08679 17.6175C6.15777 17.6175 6.21814 17.5895 6.25907 17.5203C6.47808 17.151 4.22479 15.4433 4.09773 14.7388C4.01159 14.2613 4.1581 14.0196 4.42915 14.0196Z" fill="#FF9D0B"/>
+<path d="M9.75883 20.2539C10.454 19.2344 10.4048 18.4692 9.4509 17.5159C8.49704 16.5628 7.9418 15.1684 7.9418 15.1684C7.9418 15.1684 7.73441 14.3585 7.26203 14.433C6.78964 14.5075 6.44281 15.7178 7.43228 16.4582C8.42176 17.1984 7.23525 17.7013 6.85456 17.0061C6.47388 16.3109 5.43438 14.5237 4.89531 14.1819C4.35649 13.8402 3.97707 14.0316 4.10414 14.7362C4.2312 15.4407 6.48474 17.1483 6.26547 17.5179C6.04621 17.8872 5.27347 17.0837 5.27347 17.0837C5.27347 17.0837 2.85548 14.8832 2.32903 15.4566C1.80258 16.03 2.72842 16.5105 4.0478 17.3093C5.36744 18.1078 5.46975 18.3187 5.28257 18.6208C5.09513 18.9229 2.18251 16.4673 1.90893 17.5083C1.63561 18.5493 4.88142 18.8514 4.6811 19.5701C4.48078 20.2891 2.3947 18.2098 1.96804 19.0199C1.54113 19.8303 4.91173 20.7824 4.93901 20.7895C6.02777 21.0719 8.79285 21.6703 9.75883 20.2539Z" fill="#FFD21E"/>
+<path d="M19.5568 13.0092C19.9658 13.0092 20.3313 13.1771 20.5862 13.4818C20.7439 13.6705 20.9086 13.9746 20.9219 14.4301C21.0935 14.3808 21.2584 14.3533 21.4125 14.3533C21.8041 14.3533 22.1577 14.5033 22.4078 14.7759C22.7291 15.1258 22.8718 15.5557 22.8097 15.9859C22.7802 16.1908 22.7117 16.3744 22.6094 16.5444C22.8251 16.719 22.984 16.962 23.0608 17.2543C23.1209 17.4834 23.1826 17.9606 22.8607 18.4522C22.8812 18.4842 22.9004 18.5176 22.9183 18.5517C23.1118 18.919 23.1242 19.334 22.9534 19.7205C22.6945 20.3063 22.0511 20.7678 20.8017 21.2632C20.0244 21.5714 19.3133 21.7684 19.307 21.7702C18.2794 22.0367 17.35 22.1721 16.5455 22.1721C15.0667 22.1721 14.008 21.7192 13.3987 20.8259C12.418 19.3876 12.5582 18.072 13.8271 16.8039C14.5294 16.1021 14.9962 15.0674 15.0935 14.8403C15.2895 14.1679 15.8078 13.4204 16.6695 13.4204C16.742 13.4204 16.8155 13.4262 16.8877 13.4376C17.2651 13.4969 17.5951 13.7142 17.8307 14.0411C18.0851 13.7248 18.3322 13.4732 18.5557 13.3312C18.8927 13.1175 19.2295 13.0092 19.5568 13.0092ZM19.5568 14.0196C19.428 14.0196 19.2706 14.0744 19.0971 14.1846C18.5583 14.5263 17.5185 16.3136 17.1378 17.0087C17.0103 17.2417 16.7923 17.3402 16.596 17.3402C16.2065 17.3402 15.9023 16.9529 16.5604 16.4608C17.5498 15.7204 17.2028 14.5102 16.7304 14.4356C16.7097 14.4324 16.6892 14.4308 16.6695 14.4308C16.2401 14.4308 16.0506 15.171 16.0506 15.171C16.0506 15.171 15.4954 16.5654 14.5415 17.5185C13.5876 18.4719 13.5384 19.237 14.2336 20.2566C14.7077 20.9517 15.6153 21.1617 16.5455 21.1617C17.5102 21.1617 18.4992 20.9358 19.0534 20.7921C19.0807 20.785 22.4513 19.8329 22.0243 19.0226C21.9526 18.8864 21.8344 18.8318 21.6856 18.8318C21.0844 18.8318 19.9908 19.7266 19.5207 19.7266C19.4156 19.7266 19.3416 19.6819 19.3113 19.5727C19.111 18.8541 22.357 18.5519 22.0835 17.5109C22.0352 17.3268 21.9043 17.252 21.7204 17.2523C20.926 17.2523 19.1436 18.6495 18.77 18.6495C18.7414 18.6495 18.7209 18.6411 18.7098 18.6234C18.5226 18.3213 18.6252 18.1104 19.9446 17.3119C21.264 16.5131 22.1901 16.0327 21.6634 15.4592C21.6027 15.393 21.5168 15.3637 21.4125 15.3637C20.6115 15.364 18.7189 17.0863 18.7189 17.0863C18.7189 17.0863 18.2081 17.6175 17.8992 17.6175C17.8282 17.6175 17.7678 17.5895 17.7269 17.5203C17.5079 17.151 19.7612 15.4433 19.8883 14.7388C19.9744 14.2613 19.8279 14.0196 19.5568 14.0196Z" fill="#FF9D0B"/>
+<path d="M14.2354 20.2539C13.5402 19.2344 13.5895 18.4692 14.5433 17.5159C15.4972 16.5628 16.0524 15.1684 16.0524 15.1684C16.0524 15.1684 16.2598 14.3585 16.7322 14.433C17.2046 14.5075 17.5514 15.7178 16.5619 16.4582C15.5724 17.1984 16.759 17.7013 17.1396 17.0061C17.5203 16.3109 18.5598 14.5237 19.0989 14.1819C19.6377 13.8402 20.0171 14.0316 19.8901 14.7362C19.763 15.4407 17.5095 17.1483 17.7287 17.5179C17.948 17.8872 18.7207 17.0837 18.7207 17.0837C18.7207 17.0837 21.1387 14.8832 21.6652 15.4566C22.1916 16.03 21.2658 16.5105 19.9464 17.3093C18.6268 18.1078 18.5245 18.3187 18.7116 18.6208C18.8991 18.9229 21.8117 16.4673 22.0853 17.5083C22.3586 18.5493 19.1128 18.8514 19.3131 19.5701C19.5134 20.2891 21.5995 18.2098 22.0262 19.0199C22.4531 19.8303 19.0825 20.7824 19.0552 20.7895C17.9664 21.0719 15.2014 21.6703 14.2354 20.2539Z" fill="#FFD21E"/>
+</g>
+<path d="M33.1528 17V7.22003H35.3578V10.985H38.7328V7.22003H40.9528V17H38.7328V12.92H35.3578V17H33.1528Z" fill="#1D2939"/>
+<path d="M45.3153 17.18C44.5053 17.18 43.9153 16.915 43.5453 16.385C43.1853 15.845 43.0053 15.11 43.0053 14.18V9.56003H45.2103V13.895C45.2103 14.425 45.2853 14.795 45.4353 15.005C45.5853 15.205 45.8203 15.305 46.1403 15.305C46.4203 15.305 46.6553 15.24 46.8453 15.11C47.0353 14.98 47.2403 14.77 47.4603 14.48V9.56003H49.6653V17H47.8653L47.7003 15.965H47.6553C47.3453 16.335 47.0053 16.63 46.6353 16.85C46.2653 17.07 45.8253 17.18 45.3153 17.18Z" fill="#1D2939"/>
+<path d="M54.2606 20.165C53.6806 20.165 53.1556 20.1 52.6856 19.97C52.2156 19.84 51.8406 19.635 51.5606 19.355C51.2806 19.075 51.1406 18.715 51.1406 18.275C51.1406 17.675 51.4956 17.175 52.2056 16.775V16.715C52.0156 16.585 51.8506 16.42 51.7106 16.22C51.5806 16.02 51.5156 15.765 51.5156 15.455C51.5156 15.185 51.5956 14.925 51.7556 14.675C51.9156 14.425 52.1156 14.22 52.3556 14.06V14C52.0956 13.82 51.8606 13.56 51.6506 13.22C51.4506 12.88 51.3506 12.495 51.3506 12.065C51.3506 11.465 51.4956 10.97 51.7856 10.58C52.0756 10.18 52.4556 9.88003 52.9256 9.68003C53.3956 9.48003 53.8956 9.38003 54.4256 9.38003C54.8656 9.38003 55.2506 9.44003 55.5806 9.56003H58.2956V11.165H57.1106C57.1806 11.275 57.2356 11.415 57.2756 11.585C57.3256 11.755 57.3506 11.94 57.3506 12.14C57.3506 12.71 57.2206 13.18 56.9606 13.55C56.7006 13.92 56.3506 14.195 55.9106 14.375C55.4706 14.555 54.9756 14.645 54.4256 14.645C54.1356 14.645 53.8356 14.595 53.5256 14.495C53.3456 14.645 53.2556 14.83 53.2556 15.05C53.2556 15.24 53.3406 15.38 53.5106 15.47C53.6806 15.56 53.9706 15.605 54.3806 15.605H55.5806C56.5006 15.605 57.2006 15.755 57.6806 16.055C58.1706 16.345 58.4156 16.825 58.4156 17.495C58.4156 18.005 58.2456 18.46 57.9056 18.86C57.5656 19.27 57.0856 19.59 56.4656 19.82C55.8456 20.05 55.1106 20.165 54.2606 20.165ZM54.4256 13.31C54.7156 13.31 54.9556 13.205 55.1456 12.995C55.3456 12.785 55.4456 12.475 55.4456 12.065C55.4456 11.675 55.3456 11.38 55.1456 11.18C54.9556 10.97 54.7156 10.865 54.4256 10.865C54.1356 10.865 53.8906 10.965 53.6906 11.165C53.5006 11.365 53.4056 11.665 53.4056 12.065C53.4056 12.475 53.5006 12.785 53.6906 12.995C53.8906 13.205 54.1356 13.31 54.4256 13.31ZM54.6056 18.785C55.1056 18.785 55.5156 18.695 55.8356 18.515C56.1556 18.335 56.3156 18.12 56.3156 17.87C56.3156 17.64 56.2156 17.485 56.0156 17.405C55.8256 17.325 55.5456 17.285 55.1756 17.285H54.4106C54.1606 17.285 53.9506 17.275 53.7806 17.255C53.6206 17.245 53.4806 17.225 53.3606 17.195C53.0906 17.435 52.9556 17.68 52.9556 17.93C52.9556 18.21 53.1056 18.42 53.4056 18.56C53.7156 18.71 54.1156 18.785 54.6056 18.785Z" fill="#1D2939"/>
+<path d="M62.2733 20.165C61.6933 20.165 61.1683 20.1 60.6983 19.97C60.2283 19.84 59.8533 19.635 59.5733 19.355C59.2933 19.075 59.1533 18.715 59.1533 18.275C59.1533 17.675 59.5083 17.175 60.2183 16.775V16.715C60.0283 16.585 59.8633 16.42 59.7233 16.22C59.5933 16.02 59.5283 15.765 59.5283 15.455C59.5283 15.185 59.6083 14.925 59.7683 14.675C59.9283 14.425 60.1283 14.22 60.3683 14.06V14C60.1083 13.82 59.8733 13.56 59.6633 13.22C59.4633 12.88 59.3633 12.495 59.3633 12.065C59.3633 11.465 59.5083 10.97 59.7983 10.58C60.0883 10.18 60.4683 9.88003 60.9383 9.68003C61.4083 9.48003 61.9083 9.38003 62.4383 9.38003C62.8783 9.38003 63.2633 9.44003 63.5933 9.56003H66.3083V11.165H65.1233C65.1933 11.275 65.2483 11.415 65.2883 11.585C65.3383 11.755 65.3633 11.94 65.3633 12.14C65.3633 12.71 65.2333 13.18 64.9733 13.55C64.7133 13.92 64.3633 14.195 63.9233 14.375C63.4833 14.555 62.9883 14.645 62.4383 14.645C62.1483 14.645 61.8483 14.595 61.5383 14.495C61.3583 14.645 61.2683 14.83 61.2683 15.05C61.2683 15.24 61.3533 15.38 61.5233 15.47C61.6933 15.56 61.9833 15.605 62.3933 15.605H63.5933C64.5133 15.605 65.2133 15.755 65.6933 16.055C66.1833 16.345 66.4283 16.825 66.4283 17.495C66.4283 18.005 66.2583 18.46 65.9183 18.86C65.5783 19.27 65.0983 19.59 64.4783 19.82C63.8583 20.05 63.1233 20.165 62.2733 20.165ZM62.4383 13.31C62.7283 13.31 62.9683 13.205 63.1583 12.995C63.3583 12.785 63.4583 12.475 63.4583 12.065C63.4583 11.675 63.3583 11.38 63.1583 11.18C62.9683 10.97 62.7283 10.865 62.4383 10.865C62.1483 10.865 61.9033 10.965 61.7033 11.165C61.5133 11.365 61.4183 11.665 61.4183 12.065C61.4183 12.475 61.5133 12.785 61.7033 12.995C61.9033 13.205 62.1483 13.31 62.4383 13.31ZM62.6183 18.785C63.1183 18.785 63.5283 18.695 63.8483 18.515C64.1683 18.335 64.3283 18.12 64.3283 17.87C64.3283 17.64 64.2283 17.485 64.0283 17.405C63.8383 17.325 63.5583 17.285 63.1883 17.285H62.4233C62.1733 17.285 61.9633 17.275 61.7933 17.255C61.6333 17.245 61.4933 17.225 61.3733 17.195C61.1033 17.435 60.9683 17.68 60.9683 17.93C60.9683 18.21 61.1183 18.42 61.4183 18.56C61.7283 18.71 62.1283 18.785 62.6183 18.785Z" fill="#1D2939"/>
+<path d="M67.631 17V9.56003H69.836V17H67.631ZM68.726 8.46503C68.356 8.46503 68.056 8.36003 67.826 8.15003C67.596 7.94003 67.481 7.66003 67.481 7.31003C67.481 6.96003 67.596 6.68003 67.826 6.47003C68.056 6.26003 68.356 6.15503 68.726 6.15503C69.096 6.15503 69.396 6.26003 69.626 6.47003C69.856 6.68003 69.971 6.96003 69.971 7.31003C69.971 7.66003 69.856 7.94003 69.626 8.15003C69.396 8.36003 69.096 8.46503 68.726 8.46503Z" fill="#1D2939"/>
+<path d="M71.7765 17V9.56003H73.5765L73.7265 10.505H73.7865C74.1065 10.205 74.4565 9.94503 74.8365 9.72503C75.2265 9.49503 75.6715 9.38003 76.1715 9.38003C76.9815 9.38003 77.5665 9.65003 77.9265 10.19C78.2965 10.72 78.4815 11.45 78.4815 12.38V17H76.2765V12.665C76.2765 12.125 76.2015 11.755 76.0515 11.555C75.9115 11.355 75.6815 11.255 75.3615 11.255C75.0815 11.255 74.8415 11.32 74.6415 11.45C74.4415 11.57 74.2215 11.745 73.9815 11.975V17H71.7765Z" fill="#1D2939"/>
+<path d="M83.0155 20.165C82.4355 20.165 81.9105 20.1 81.4405 19.97C80.9705 19.84 80.5955 19.635 80.3155 19.355C80.0355 19.075 79.8955 18.715 79.8955 18.275C79.8955 17.675 80.2505 17.175 80.9605 16.775V16.715C80.7705 16.585 80.6055 16.42 80.4655 16.22C80.3355 16.02 80.2705 15.765 80.2705 15.455C80.2705 15.185 80.3505 14.925 80.5105 14.675C80.6705 14.425 80.8705 14.22 81.1105 14.06V14C80.8505 13.82 80.6155 13.56 80.4055 13.22C80.2055 12.88 80.1055 12.495 80.1055 12.065C80.1055 11.465 80.2505 10.97 80.5405 10.58C80.8305 10.18 81.2105 9.88003 81.6805 9.68003C82.1505 9.48003 82.6505 9.38003 83.1805 9.38003C83.6205 9.38003 84.0055 9.44003 84.3355 9.56003H87.0505V11.165H85.8655C85.9355 11.275 85.9905 11.415 86.0305 11.585C86.0805 11.755 86.1055 11.94 86.1055 12.14C86.1055 12.71 85.9755 13.18 85.7155 13.55C85.4555 13.92 85.1055 14.195 84.6655 14.375C84.2255 14.555 83.7305 14.645 83.1805 14.645C82.8905 14.645 82.5905 14.595 82.2805 14.495C82.1005 14.645 82.0105 14.83 82.0105 15.05C82.0105 15.24 82.0955 15.38 82.2655 15.47C82.4355 15.56 82.7255 15.605 83.1355 15.605H84.3355C85.2555 15.605 85.9555 15.755 86.4355 16.055C86.9255 16.345 87.1705 16.825 87.1705 17.495C87.1705 18.005 87.0005 18.46 86.6605 18.86C86.3205 19.27 85.8405 19.59 85.2205 19.82C84.6005 20.05 83.8655 20.165 83.0155 20.165ZM83.1805 13.31C83.4705 13.31 83.7105 13.205 83.9005 12.995C84.1005 12.785 84.2005 12.475 84.2005 12.065C84.2005 11.675 84.1005 11.38 83.9005 11.18C83.7105 10.97 83.4705 10.865 83.1805 10.865C82.8905 10.865 82.6455 10.965 82.4455 11.165C82.2555 11.365 82.1605 11.665 82.1605 12.065C82.1605 12.475 82.2555 12.785 82.4455 12.995C82.6455 13.205 82.8905 13.31 83.1805 13.31ZM83.3605 18.785C83.8605 18.785 84.2705 18.695 84.5905 18.515C84.9105 18.335 85.0705 18.12 85.0705 17.87C85.0705 17.64 84.9705 17.485 84.7705 17.405C84.5805 17.325 84.3005 17.285 83.9305 17.285H83.1655C82.9155 17.285 82.7055 17.275 82.5355 17.255C82.3755 17.245 82.2355 17.225 82.1155 17.195C81.8455 17.435 81.7105 17.68 81.7105 17.93C81.7105 18.21 81.8605 18.42 82.1605 18.56C82.4705 18.71 82.8705 18.785 83.3605 18.785Z" fill="#1D2939"/>
+<path d="M91.5562 17V7.22003H97.7212V9.08003H93.7612V11.345H97.1512V13.205H93.7612V17H91.5562Z" fill="#1D2939"/>
+<path d="M100.546 17.18C99.8661 17.18 99.3261 16.965 98.9261 16.535C98.5261 16.095 98.3261 15.56 98.3261 14.93C98.3261 14.15 98.6561 13.54 99.3161 13.1C99.9761 12.66 101.041 12.365 102.511 12.215C102.491 11.885 102.391 11.625 102.211 11.435C102.041 11.235 101.751 11.135 101.341 11.135C101.031 11.135 100.716 11.195 100.396 11.315C100.076 11.435 99.7361 11.6 99.3761 11.81L98.5811 10.355C99.0511 10.065 99.5511 9.83003 100.081 9.65003C100.621 9.47003 101.181 9.38003 101.761 9.38003C102.711 9.38003 103.441 9.65503 103.951 10.205C104.461 10.755 104.716 11.6 104.716 12.74V17H102.916L102.766 16.235H102.706C102.396 16.515 102.061 16.745 101.701 16.925C101.351 17.095 100.966 17.18 100.546 17.18ZM101.296 15.47C101.546 15.47 101.761 15.415 101.941 15.305C102.131 15.185 102.321 15.03 102.511 14.84V13.535C101.731 13.635 101.191 13.795 100.891 14.015C100.591 14.225 100.441 14.475 100.441 14.765C100.441 15.005 100.516 15.185 100.666 15.305C100.826 15.415 101.036 15.47 101.296 15.47Z" fill="#1D2939"/>
+<path d="M109.821 17.18C109.131 17.18 108.506 17.03 107.946 16.73C107.396 16.42 106.956 15.975 106.626 15.395C106.306 14.805 106.146 14.1 106.146 13.28C106.146 12.45 106.326 11.745 106.686 11.165C107.046 10.585 107.521 10.145 108.111 9.84503C108.701 9.53503 109.336 9.38003 110.016 9.38003C110.476 9.38003 110.881 9.45503 111.231 9.60503C111.591 9.75503 111.911 9.94503 112.191 10.175L111.156 11.6C110.806 11.31 110.471 11.165 110.151 11.165C109.621 11.165 109.196 11.355 108.876 11.735C108.566 12.115 108.411 12.63 108.411 13.28C108.411 13.92 108.566 14.435 108.876 14.825C109.196 15.205 109.596 15.395 110.076 15.395C110.316 15.395 110.551 15.345 110.781 15.245C111.011 15.135 111.221 15.005 111.411 14.855L112.281 16.295C111.911 16.615 111.511 16.845 111.081 16.985C110.651 17.115 110.231 17.18 109.821 17.18Z" fill="#1D2939"/>
+<path d="M116.488 17.18C115.778 17.18 115.138 17.025 114.568 16.715C113.998 16.405 113.548 15.96 113.218 15.38C112.888 14.8 112.723 14.1 112.723 13.28C112.723 12.47 112.888 11.775 113.218 11.195C113.558 10.615 113.998 10.17 114.538 9.86003C115.078 9.54003 115.643 9.38003 116.233 9.38003C116.943 9.38003 117.528 9.54003 117.988 9.86003C118.458 10.17 118.808 10.595 119.038 11.135C119.278 11.665 119.398 12.27 119.398 12.95C119.398 13.14 119.388 13.33 119.368 13.52C119.348 13.7 119.328 13.835 119.308 13.925H114.853C114.953 14.465 115.178 14.865 115.528 15.125C115.878 15.375 116.298 15.5 116.788 15.5C117.318 15.5 117.853 15.335 118.393 15.005L119.128 16.34C118.748 16.6 118.323 16.805 117.853 16.955C117.383 17.105 116.928 17.18 116.488 17.18ZM114.838 12.47H117.523C117.523 12.06 117.423 11.725 117.223 11.465C117.033 11.195 116.718 11.06 116.278 11.06C115.938 11.06 115.633 11.18 115.363 11.42C115.093 11.65 114.918 12 114.838 12.47Z" fill="#1D2939"/>
+</g>
+<defs>
+<clipPath id="clip0_8587_60377">
+<rect width="119.998" height="24" rx="6" fill="white"/>
+</clipPath>
+<clipPath id="clip1_8587_60377">
+<rect width="23.998" height="22.2298" fill="white" transform="translate(0 0.885132)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/huggingface.svg b/app/components/base/icons/assets/public/llm/huggingface.svg
new file mode 100644
index 0000000..5a444f1
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/huggingface.svg
@@ -0,0 +1,19 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M11.9286 20.2062C16.7767 20.2062 20.7069 16.2761 20.7069 11.428C20.7069 6.57993 16.7767 2.64978 11.9286 2.64978C7.08054 2.64978 3.15039 6.57993 3.15039 11.428C3.15039 16.2761 7.08054 20.2062 11.9286 20.2062Z" fill="#FFD21E"/>
+<path d="M20.7095 11.4326C20.7095 6.58451 16.7793 2.65436 11.9313 2.65436C7.08318 2.65436 3.15303 6.58451 3.15303 11.4326C3.15303 16.2807 7.08318 20.2108 11.9313 20.2108C16.7793 20.2108 20.7095 16.2807 20.7095 11.4326ZM2.14258 11.4326C2.14258 6.02647 6.52511 1.64392 11.9313 1.64392C17.3374 1.64392 21.7199 6.02647 21.7199 11.4326C21.7199 16.8387 17.3374 21.2213 11.9313 21.2213C6.52511 21.2213 2.14258 16.8387 2.14258 11.4326Z" fill="#FF9D0B"/>
+<path d="M14.7822 9.03703C15.1041 9.1507 15.2322 9.81254 15.5574 9.6396C16.1734 9.31212 16.4072 8.54734 16.0797 7.93142C15.7522 7.31553 14.9874 7.08172 14.3715 7.4092C13.7556 7.73669 13.5218 8.50147 13.8493 9.11738C14.0038 9.40809 14.4944 8.9354 14.7822 9.03703Z" fill="#3A3B45"/>
+<path d="M8.83422 9.03703C8.5123 9.1507 8.38422 9.81254 8.05901 9.6396C7.4431 9.31212 7.20928 8.54734 7.53676 7.93142C7.86425 7.31553 8.62903 7.08172 9.24494 7.4092C9.86086 7.73669 10.0947 8.50147 9.76719 9.11738C9.61262 9.40809 9.122 8.9354 8.83422 9.03703Z" fill="#3A3B45"/>
+<path d="M11.8679 15.1044C14.3507 15.1044 15.1519 12.8908 15.1519 11.7541C15.1519 11.1633 14.7547 11.3492 14.1187 11.6641C13.5309 11.9551 12.739 12.3563 11.8679 12.3563C10.0543 12.3563 8.58398 10.6173 8.58398 11.7541C8.58398 12.8908 9.38514 15.1044 11.8679 15.1044Z" fill="#3A3B45"/>
+<mask id="mask0_8587_60183" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="8" y="11" width="8" height="5">
+<path d="M11.8562 15.1005C14.339 15.1005 15.1402 12.8869 15.1402 11.7502C15.1402 11.1594 14.743 11.3453 14.1069 11.6602C13.5191 11.9512 12.7273 12.3524 11.8562 12.3524C10.0425 12.3524 8.57227 10.6134 8.57227 11.7502C8.57227 12.8869 9.37342 15.1005 11.8562 15.1005Z" fill="white"/>
+</mask>
+<g mask="url(#mask0_8587_60183)">
+<path d="M11.9194 17.6824C13.1294 17.6824 14.1103 16.7016 14.1103 15.4916C14.1103 14.5491 13.5152 13.7457 12.6803 13.4364C12.6496 13.425 12.6185 13.4143 12.5872 13.4043C12.3766 13.337 12.1523 14.0606 11.9194 14.0606C11.7018 14.0606 11.4917 13.3324 11.2933 13.3915C10.3884 13.6609 9.72852 14.4991 9.72852 15.4916C9.72852 16.7016 10.7094 17.6824 11.9194 17.6824Z" fill="#F94040"/>
+</g>
+<path d="M17.8698 10.2273C18.3232 10.2273 18.6908 9.85972 18.6908 9.40631C18.6908 8.9529 18.3232 8.58533 17.8698 8.58533C17.4164 8.58533 17.0488 8.9529 17.0488 9.40631C17.0488 9.85972 17.4164 10.2273 17.8698 10.2273Z" fill="#FF9D0B"/>
+<path d="M6.11981 10.2273C6.57323 10.2273 6.9408 9.85972 6.9408 9.40631C6.9408 8.9529 6.57323 8.58533 6.11981 8.58533C5.66638 8.58533 5.29883 8.9529 5.29883 9.40631C5.29883 9.85972 5.66638 10.2273 6.11981 10.2273Z" fill="#FF9D0B"/>
+<path d="M4.42915 13.0092C4.02018 13.0092 3.65465 13.1771 3.39976 13.4818C3.24214 13.6705 3.07743 13.9746 3.06404 14.4301C2.89252 14.3808 2.72757 14.3533 2.57347 14.3533C2.18193 14.3533 1.82827 14.5033 1.57819 14.7759C1.25687 15.1258 1.11414 15.5557 1.17628 15.9859C1.20584 16.1908 1.2743 16.3744 1.3766 16.5444C1.16087 16.719 1.00198 16.962 0.925188 17.2543C0.865067 17.4834 0.803429 17.9606 1.12526 18.4522C1.10479 18.4842 1.0856 18.5176 1.06766 18.5517C0.874161 18.919 0.861783 19.334 1.03255 19.7205C1.29147 20.3063 1.93487 20.7678 3.18429 21.2632C3.96157 21.5714 4.67267 21.7684 4.67899 21.7702C5.70661 22.0367 6.63596 22.1721 7.44053 22.1721C8.91931 22.1721 9.97801 21.7192 10.5873 20.8259C11.5679 19.3876 11.4277 18.072 10.1589 16.8039C9.45662 16.1021 8.98979 15.0674 8.89254 14.8403C8.69651 14.1679 8.17815 13.4204 7.3165 13.4204C7.244 13.4204 7.17049 13.4262 7.09824 13.4376C6.72084 13.4969 6.39093 13.7142 6.15525 14.0411C5.90087 13.7248 5.65381 13.4732 5.43025 13.3312C5.09327 13.1175 4.75654 13.0092 4.42915 13.0092ZM4.42915 14.0196C4.55799 14.0196 4.71536 14.0744 4.88891 14.1846C5.42773 14.5263 6.46747 16.3136 6.84816 17.0087C6.97573 17.2417 7.19373 17.3402 7.39001 17.3402C7.77953 17.3402 8.08368 16.9529 7.42563 16.4608C6.43615 15.7204 6.78324 14.5102 7.25562 14.4356C7.27633 14.4324 7.29679 14.4308 7.3165 14.4308C7.74594 14.4308 7.93539 15.171 7.93539 15.171C7.93539 15.171 8.49063 16.5654 9.44449 17.5185C10.3984 18.4719 10.4476 19.237 9.75243 20.2566C9.27828 20.9517 8.37064 21.1617 7.44053 21.1617C6.47581 21.1617 5.48684 20.9358 4.93261 20.7921C4.90533 20.785 1.53474 19.8329 1.96165 19.0226C2.03339 18.8864 2.15161 18.8318 2.3004 18.8318C2.90162 18.8318 3.99517 19.7266 4.46528 19.7266C4.57036 19.7266 4.64438 19.6819 4.67469 19.5727C4.87501 18.8541 1.62896 18.5519 1.90254 17.5109C1.95079 17.3268 2.08164 17.252 2.26554 17.2523C3.06 17.2523 4.84243 18.6495 5.21604 18.6495C5.24458 18.6495 5.26504 18.6411 5.27616 18.6234C5.46334 18.3213 5.36078 18.1104 4.0414 17.3119C2.72201 16.5131 1.79594 16.0327 2.32263 15.4592C2.38326 15.393 2.46915 15.3637 2.57347 15.3637C3.3745 15.364 5.26706 17.0863 5.26706 17.0863C5.26706 17.0863 5.77784 17.6175 6.08679 17.6175C6.15777 17.6175 6.21814 17.5895 6.25907 17.5203C6.47808 17.151 4.22479 15.4433 4.09773 14.7388C4.01159 14.2613 4.1581 14.0196 4.42915 14.0196Z" fill="#FF9D0B"/>
+<path d="M9.75883 20.2539C10.454 19.2344 10.4048 18.4692 9.4509 17.5159C8.49704 16.5628 7.9418 15.1684 7.9418 15.1684C7.9418 15.1684 7.73441 14.3585 7.26203 14.433C6.78964 14.5075 6.44281 15.7178 7.43228 16.4582C8.42176 17.1984 7.23525 17.7013 6.85456 17.0061C6.47388 16.3109 5.43438 14.5237 4.89531 14.1819C4.35649 13.8402 3.97707 14.0316 4.10414 14.7362C4.2312 15.4407 6.48474 17.1483 6.26547 17.5179C6.04621 17.8872 5.27347 17.0837 5.27347 17.0837C5.27347 17.0837 2.85548 14.8832 2.32903 15.4566C1.80258 16.03 2.72842 16.5105 4.0478 17.3093C5.36744 18.1078 5.46975 18.3187 5.28257 18.6208C5.09513 18.9229 2.18251 16.4673 1.90893 17.5083C1.63561 18.5493 4.88142 18.8514 4.6811 19.5701C4.48078 20.2891 2.3947 18.2098 1.96804 19.0199C1.54113 19.8303 4.91173 20.7824 4.93901 20.7895C6.02777 21.0719 8.79285 21.6703 9.75883 20.2539Z" fill="#FFD21E"/>
+<path d="M19.5568 13.0092C19.9658 13.0092 20.3313 13.1771 20.5862 13.4818C20.7439 13.6705 20.9086 13.9746 20.9219 14.4301C21.0935 14.3808 21.2584 14.3533 21.4125 14.3533C21.8041 14.3533 22.1577 14.5033 22.4078 14.7759C22.7291 15.1258 22.8718 15.5557 22.8097 15.9859C22.7802 16.1908 22.7117 16.3744 22.6094 16.5444C22.8251 16.719 22.984 16.962 23.0608 17.2543C23.1209 17.4834 23.1826 17.9606 22.8607 18.4522C22.8812 18.4842 22.9004 18.5176 22.9183 18.5517C23.1118 18.919 23.1242 19.334 22.9534 19.7205C22.6945 20.3063 22.0511 20.7678 20.8017 21.2632C20.0244 21.5714 19.3133 21.7684 19.307 21.7702C18.2794 22.0367 17.35 22.1721 16.5455 22.1721C15.0667 22.1721 14.008 21.7192 13.3987 20.8259C12.418 19.3876 12.5582 18.072 13.8271 16.8039C14.5294 16.1021 14.9962 15.0674 15.0935 14.8403C15.2895 14.1679 15.8078 13.4204 16.6695 13.4204C16.742 13.4204 16.8155 13.4262 16.8877 13.4376C17.2651 13.4969 17.5951 13.7142 17.8307 14.0411C18.0851 13.7248 18.3322 13.4732 18.5557 13.3312C18.8927 13.1175 19.2295 13.0092 19.5568 13.0092ZM19.5568 14.0196C19.428 14.0196 19.2706 14.0744 19.0971 14.1846C18.5583 14.5263 17.5185 16.3136 17.1378 17.0087C17.0103 17.2417 16.7923 17.3402 16.596 17.3402C16.2065 17.3402 15.9023 16.9529 16.5604 16.4608C17.5498 15.7204 17.2028 14.5102 16.7304 14.4356C16.7097 14.4324 16.6892 14.4308 16.6695 14.4308C16.2401 14.4308 16.0506 15.171 16.0506 15.171C16.0506 15.171 15.4954 16.5654 14.5415 17.5185C13.5876 18.4719 13.5384 19.237 14.2336 20.2566C14.7077 20.9517 15.6153 21.1617 16.5455 21.1617C17.5102 21.1617 18.4992 20.9358 19.0534 20.7921C19.0807 20.785 22.4513 19.8329 22.0243 19.0226C21.9526 18.8864 21.8344 18.8318 21.6856 18.8318C21.0844 18.8318 19.9908 19.7266 19.5207 19.7266C19.4156 19.7266 19.3416 19.6819 19.3113 19.5727C19.111 18.8541 22.357 18.5519 22.0835 17.5109C22.0352 17.3268 21.9043 17.252 21.7204 17.2523C20.926 17.2523 19.1436 18.6495 18.77 18.6495C18.7414 18.6495 18.7209 18.6411 18.7098 18.6234C18.5226 18.3213 18.6252 18.1104 19.9446 17.3119C21.264 16.5131 22.1901 16.0327 21.6634 15.4592C21.6027 15.393 21.5168 15.3637 21.4125 15.3637C20.6115 15.364 18.7189 17.0863 18.7189 17.0863C18.7189 17.0863 18.2081 17.6175 17.8992 17.6175C17.8282 17.6175 17.7678 17.5895 17.7269 17.5203C17.5079 17.151 19.7612 15.4433 19.8883 14.7388C19.9744 14.2613 19.8279 14.0196 19.5568 14.0196Z" fill="#FF9D0B"/>
+<path d="M14.2354 20.2539C13.5402 19.2344 13.5895 18.4692 14.5433 17.5159C15.4972 16.5628 16.0524 15.1684 16.0524 15.1684C16.0524 15.1684 16.2598 14.3585 16.7322 14.433C17.2046 14.5075 17.5514 15.7178 16.5619 16.4582C15.5724 17.1984 16.759 17.7013 17.1396 17.0061C17.5203 16.3109 18.5598 14.5237 19.0989 14.1819C19.6377 13.8402 20.0171 14.0316 19.8901 14.7362C19.763 15.4407 17.5095 17.1483 17.7287 17.5179C17.948 17.8872 18.7207 17.0837 18.7207 17.0837C18.7207 17.0837 21.1387 14.8832 21.6652 15.4566C22.1916 16.03 21.2658 16.5105 19.9464 17.3093C18.6268 18.1078 18.5245 18.3187 18.7116 18.6208C18.8991 18.9229 21.8117 16.4673 22.0853 17.5083C22.3586 18.5493 19.1128 18.8514 19.3131 19.5701C19.5134 20.2891 21.5995 18.2098 22.0262 19.0199C22.4531 19.8303 19.0825 20.7824 19.0552 20.7895C17.9664 21.0719 15.2014 21.6703 14.2354 20.2539Z" fill="#FFD21E"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/iflytek-spark-text-cn.svg b/app/components/base/icons/assets/public/llm/iflytek-spark-text-cn.svg
new file mode 100644
index 0000000..71d8521
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/iflytek-spark-text-cn.svg
@@ -0,0 +1,11 @@
+<svg width="84" height="24" viewBox="0 0 84 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M34.8763 7.49212H33.1466V11.557H34.4438V13.0273H33.1466V18.7137H31.1574V13.0489H29.752V11.5786H31.179V7.49212H29.8384V6.02185H36.952C37.2547 6.02185 37.4925 6.25969 37.4925 6.56239V17.33H38.4438L37.7736 18.7354L35.4817 18.757L35.4601 8.11915C35.4817 7.7732 35.2222 7.49212 34.8763 7.49212Z" fill="#2B2B2D"/>
+<path d="M26.1832 11.8599H25.3184V10.3896H27.6102C27.9129 10.3896 28.1508 10.6275 28.1508 10.9302L28.1724 17.3086H29.2319L28.5832 18.7356H26.7238C26.4211 18.7356 26.1832 18.4978 26.1832 18.1951V11.8599Z" fill="#2B2B2D"/>
+<path d="M28.1724 6.02185H25.3184V7.55699H28.1724V6.02185Z" fill="#2B2B2D"/>
+<path d="M50.1495 6.02162L45.5873 10.0865H48.6792L52.8306 6.02162H50.1495ZM49.09 11.773H46.1279L49.5873 15.5135H52.5495L49.09 11.773ZM43.4468 17.3514C43.2522 17.3514 43.1225 17.1784 43.1657 16.9838L45.89 6.69189C45.9765 6.34595 45.7171 6 45.3711 6H40.1387V7.44865H43.036C43.3171 7.44865 43.5333 7.72973 43.4468 7.98919L40.7873 18.0216C40.7008 18.3676 40.9603 18.7135 41.3062 18.7135H51.7927L52.5927 17.3297H43.4468V17.3514Z" fill="#2B2B2D"/>
+<path d="M62.2792 16.465H67.1224V15.3406H62.2792V14.2379H67.1224V13.1569H62.2792V12.2271H67.1224V10.4974V6.56227C67.1224 6.25957 66.8845 6.02173 66.5818 6.02173H55.5332V11.665C55.5332 11.9677 55.771 12.2055 56.0737 12.2055H57.0035L55.5332 14.2379H60.1602V15.3406H55.5548V16.465L60.1602 16.4433V17.3515H55.5548V18.7352H67.1008V17.3515H62.2575V16.465H62.2792ZM57.6305 9.78389H63.7927L64.3981 8.61632H57.6305V7.31903H65.0035V10.8866H57.6305V9.78389ZM60.1602 13.1352H58.3224L59.0359 12.2055H60.1602V13.1352Z" fill="#2B2B2D"/>
+<path d="M71.549 6.02173H69.4733L71.0085 12.2271H73.0842L71.549 6.02173ZM79.6788 6.02173L78.1436 12.2488H80.2409L81.776 6.02173H79.6788ZM76.6517 12.3136V6.02173H74.5112V12.3136L69.3652 18.7569H71.9814L75.6355 14.2379L79.3112 18.7785L81.949 18.7569L76.6517 12.3136Z" fill="#2B2B2D"/>
+<path d="M20.8854 16.4979C20.5611 17.6438 20.0206 18.6817 19.3287 19.5898C18.2908 20.8871 14.7233 20.8871 12.5827 20.3249C10.2692 19.6979 8.60434 18.2492 8.47461 18.1411C9.38272 18.8546 10.5287 19.2654 11.7827 19.2654C14.7881 19.2654 17.2097 16.8006 17.2097 13.7735C17.2097 12.8654 16.9935 12.0222 16.6043 11.2654C16.5827 11.2222 16.626 11.179 16.6476 11.2006C18.3557 11.4817 21.7503 13.0817 20.8854 16.4979Z" fill="#2751D0"/>
+<path d="M21.2102 12.6705C21.2102 12.7353 21.1454 12.7569 21.1021 12.6921C20.3021 10.984 18.8967 10.465 17.2102 10.0759C15.9346 9.79478 15.0913 9.36235 14.7238 9.16775C14.6373 9.12451 14.5724 9.05964 14.4859 9.0164C11.8264 7.39478 11.7832 4.60559 11.7832 4.60559V0.562346C11.7832 0.519102 11.8481 0.497481 11.8697 0.519102L18.1616 6.70289L18.6373 7.15694C20.021 8.62721 20.9724 10.5515 21.2102 12.6705Z" fill="#D82F20"/>
+<path d="M19.3286 19.5894C17.5989 21.8596 14.8745 23.3515 11.8043 23.3515C6.57182 23.3515 2.33398 19.0704 2.33398 13.7948C2.33398 11.2218 3.32858 8.90828 4.97182 7.17855L5.4475 6.70288L9.5556 2.65964C9.59885 2.61639 9.66371 2.65964 9.64209 2.70288C9.57723 2.98396 9.46912 3.63261 9.53398 4.49747C9.62047 5.51369 9.9448 6.87585 10.8961 8.38937C11.4799 9.34072 12.3232 10.3353 13.4907 11.3731C13.6205 11.5029 13.7718 11.611 13.9232 11.7407C14.4421 12.2813 14.7448 12.9948 14.7448 13.7948C14.7448 15.4164 13.4259 16.7353 11.8259 16.7353C11.134 16.7353 10.507 16.4975 10.0097 16.0867C9.96642 16.0434 10.0097 15.9786 10.0529 16.0002C10.161 16.0218 10.2691 16.0434 10.3772 16.0434C10.9394 16.0434 11.4151 15.5894 11.4151 15.0056C11.4151 14.6596 11.2421 14.3353 10.9826 14.1623C10.2907 13.6002 9.70695 13.0596 9.20966 12.5191C8.51777 11.7623 7.99885 11.0272 7.63128 10.3137C6.87453 11.265 6.39885 12.4542 6.39885 13.7731C6.39885 15.5461 7.22047 17.1245 8.51777 18.1191C8.6475 18.2272 10.3124 19.6759 12.6259 20.3029C14.7232 20.9083 18.2907 20.8867 19.3286 19.5894Z" fill="#69C5F4"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/iflytek-spark-text.svg b/app/components/base/icons/assets/public/llm/iflytek-spark-text.svg
new file mode 100644
index 0000000..521c68c
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/iflytek-spark-text.svg
@@ -0,0 +1,24 @@
+<svg width="150" height="24" viewBox="0 0 150 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_8587_60507)">
+<path d="M19.6552 16.7993C19.3116 18.0034 18.7389 19.0938 18.0059 20.048C16.9063 21.4111 13.1266 21.4111 10.8588 20.8204C8.40766 20.1616 6.64379 18.6395 6.50635 18.5259C7.46846 19.2756 8.68255 19.7072 10.0112 19.7072C13.1953 19.7072 15.7609 17.1174 15.7609 13.9368C15.7609 12.9826 15.5319 12.0966 15.1195 11.3015C15.0966 11.2561 15.1424 11.2106 15.1653 11.2333C16.975 11.5287 20.5715 13.2098 19.6552 16.7993Z" fill="#2751D0"/>
+<path d="M19.9994 12.7773C19.9994 12.8454 19.9306 12.8682 19.8848 12.8C19.0372 11.0053 17.5483 10.46 15.7615 10.0511C14.4099 9.75577 13.5166 9.3014 13.1271 9.09694C13.0355 9.0515 12.9668 8.98335 12.8751 8.93791C10.0575 7.23404 10.0117 4.30339 10.0117 4.30339V0.0550813C10.0117 0.00964486 10.0804 -0.0130733 10.1034 0.0096449L16.7694 6.50706L17.2734 6.98414C18.7394 8.52898 19.7474 10.5509 19.9994 12.7773Z" fill="#D82F20"/>
+<path d="M18.0052 20.0462C16.1726 22.4316 13.2863 23.9992 10.0334 23.9992C4.48985 23.9992 0 19.501 0 13.9577C0 11.2543 1.05374 8.8234 2.7947 7.00594L3.29866 6.50614L7.65107 2.25783C7.69688 2.2124 7.7656 2.25783 7.7427 2.30327C7.67397 2.59861 7.55944 3.28015 7.62816 4.18888C7.71979 5.25664 8.06341 6.68789 9.07133 8.27817C9.68983 9.27777 10.5832 10.3228 11.8202 11.4133C11.9577 11.5496 12.118 11.6632 12.2784 11.7995C12.8281 12.3674 13.1488 13.1171 13.1488 13.9577C13.1488 15.6616 11.7515 17.0474 10.0563 17.0474C9.32331 17.0474 8.659 16.7975 8.13213 16.3659C8.08631 16.3204 8.13212 16.2523 8.17794 16.275C8.29247 16.2977 8.40701 16.3204 8.52155 16.3204C9.11714 16.3204 9.62111 15.8433 9.62111 15.2299C9.62111 14.8665 9.43785 14.5257 9.16296 14.3439C8.42992 13.7533 7.81142 13.1853 7.28455 12.6173C6.55151 11.8222 6.00174 11.0498 5.61231 10.3001C4.81055 11.2997 4.30659 12.5492 4.30659 13.935C4.30659 15.7979 5.17707 17.4563 6.55152 18.5014C6.68896 18.615 8.45283 20.1371 10.9039 20.7959C13.1259 21.432 16.9057 21.4093 18.0052 20.0462Z" fill="#69C5F4"/>
+<path d="M27 10.0997V16.3997H29.008V10.0997H27ZM27 7.89966V9.29966H29.008V7.89966H27Z" fill="#2B2B2D"/>
+<path d="M39.1482 9.09927V7.49927H31.0156V16.2993H33.2245V12.8993H38.8469V11.2993H33.2245V9.09927H39.1482Z" fill="#2B2B2D"/>
+<path d="M43.367 14.6993V7.49927H41.1582V16.2993H48.2867V14.6993H43.367Z" fill="#2B2B2D"/>
+<path d="M55.2168 7.60083L52.6064 11.3008L49.9959 7.60083H47.2852L51.502 13.1008V16.4008H53.7108V13.1008L57.9277 7.60083H55.2168Z" fill="#2B2B2D"/>
+<path d="M58.9316 7.60083V9.20083H62.2449V16.4008H64.4537V9.20083H67.6666V7.60083H58.9316Z" fill="#2B2B2D"/>
+<path d="M71.8827 14.7993V12.6993H77.7059V11.0993H71.8827V9.09927H77.9067V7.49927H69.6738V16.2993H78.1075V14.6993H71.8827V14.7993Z" fill="#2B2B2D"/>
+<path d="M85.1353 11.3008L89.4526 7.60083H86.6413L82.3241 11.4008V7.60083H80.1152V16.4008H82.3241V13.8008L83.6293 12.7008L87.0429 16.5008H89.9546L85.1353 11.3008Z" fill="#2B2B2D"/>
+<path d="M103.167 11.4C102.866 11.3 102.564 11.2001 101.962 11.1001C101.36 11.0001 99.7532 10.8001 99.1508 10.6001C98.7492 10.5001 98.448 10.3 98.448 9.80005C98.448 8.90005 99.6528 8.80005 99.6528 8.80005C99.954 8.80005 100.255 8.80005 100.356 8.80005C101.159 8.80005 102.163 8.90005 102.665 9.60005C102.765 9.70005 102.765 9.70005 102.866 9.90005L104.974 9.40005C104.773 9.10005 104.673 8.90005 104.372 8.60005C103.97 8.20005 103.468 8.00005 103.267 7.90005C102.665 7.60005 101.862 7.30005 100.356 7.30005C98.7492 7.30005 97.8456 7.70005 97.3436 8.10005C97.0423 8.30005 96.2392 8.90005 96.2392 10.1001C96.2392 11.4001 97.2431 12.0001 97.6447 12.2001C98.3476 12.5001 99.2512 12.7 100.858 12.9C101.661 13 102.263 13.1 102.464 13.3C102.665 13.4 102.765 13.6 102.765 13.9C102.765 14.3 102.464 14.6001 102.364 14.7001C101.761 15.1001 100.657 15.1001 100.556 15.1001C99.452 15.1001 98.1468 14.8001 97.6447 13.7001L95.6367 14.2001C95.7371 14.3001 95.7371 14.4001 95.8375 14.6001C95.9379 14.8001 96.2392 15.3001 96.7412 15.6001C97.0424 15.8001 97.2432 15.9001 97.3436 16.0001C97.946 16.3001 98.8496 16.7001 100.456 16.7001C100.757 16.7001 101.058 16.7001 101.36 16.7001C101.862 16.7001 102.364 16.6 102.765 16.4C104.572 15.8 104.874 14.6 104.874 13.8C104.974 12.1 103.669 11.6 103.167 11.4Z" fill="#2B2B2D"/>
+<path d="M115.318 8.80083C114.816 8.00083 114.012 7.70083 113.109 7.60083C112.908 7.60083 112.607 7.60083 112.406 7.60083H106.984V16.4008H109.193V13.1008H112.306C113.109 13.1008 114.012 13.1008 114.615 12.7008C114.916 12.5008 115.117 12.3008 115.217 12.2008C115.418 12.0008 115.518 11.8008 115.518 11.7008C115.719 11.2008 115.719 10.6008 115.719 10.4008C115.719 9.50083 115.518 9.00083 115.318 8.80083ZM112.908 11.4008C112.607 11.5008 112.205 11.5008 111.804 11.5008H109.093V9.10083H112.205C112.506 9.10083 112.607 9.10083 112.707 9.20083C113.41 9.40083 113.41 10.2008 113.41 10.4008C113.51 10.5008 113.51 11.1008 112.908 11.4008Z" fill="#2B2B2D"/>
+<path d="M122.345 7.60083H119.936L115.719 16.4008H118.128L118.831 14.7008H123.349L124.052 16.4008H126.562L122.345 7.60083ZM119.634 13.1008L121.241 9.70083L122.747 13.1008H119.634Z" fill="#2B2B2D"/>
+<path d="M134.594 12.6993C135.498 12.4993 136.301 12.2993 136.703 11.3993C136.904 10.8993 136.904 10.4993 136.904 10.1993C136.904 8.99926 136.301 8.09926 135.097 7.69926C134.695 7.59926 134.394 7.49927 133.59 7.49927H127.566V16.2993H129.775V12.7993H132.285L134.594 16.2993H137.205L134.594 12.6993ZM133.892 11.1993C133.691 11.1993 133.39 11.1993 133.39 11.1993H129.876V9.09927H133.39C133.791 9.09927 134.293 9.09927 134.594 9.49927C134.795 9.69927 134.795 10.0993 134.795 10.1993C134.695 10.8993 134.193 11.1993 133.892 11.1993Z" fill="#2B2B2D"/>
+<path d="M144.335 11.3008L148.653 7.60083H145.841L141.524 11.4008V7.60083H139.215V16.4008H141.424V13.8008L142.729 12.7008L146.143 16.5008H149.054L144.335 11.3008Z" fill="#2B2B2D"/>
+</g>
+<defs>
+<clipPath id="clip0_8587_60507">
+<rect width="150" height="24" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/iflytek-spark.svg b/app/components/base/icons/assets/public/llm/iflytek-spark.svg
new file mode 100644
index 0000000..ef0a913
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/iflytek-spark.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M21.6547 16.7993C21.3111 18.0034 20.7384 19.0938 20.0054 20.048C18.9058 21.4111 15.1261 21.4111 12.8583 20.8204C10.4072 20.1616 8.6433 18.6395 8.50586 18.5259C9.46797 19.2756 10.6821 19.7072 12.0107 19.7072C15.1948 19.7072 17.7605 17.1174 17.7605 13.9368C17.7605 12.9826 17.5314 12.0966 17.119 11.3015C17.0961 11.2561 17.1419 11.2106 17.1649 11.2333C18.9745 11.5287 22.571 13.2098 21.6547 16.7993Z" fill="#2751D0"/>
+<path d="M21.9994 12.7773C21.9994 12.8454 21.9306 12.8682 21.8848 12.8C21.0372 11.0053 19.5483 10.46 17.7615 10.0511C16.4099 9.75577 15.5166 9.3014 15.1271 9.09694C15.0355 9.0515 14.9668 8.98335 14.8751 8.93791C12.0575 7.23404 12.0117 4.30339 12.0117 4.30339V0.0550813C12.0117 0.00964486 12.0804 -0.0130733 12.1034 0.0096449L18.7694 6.50706L19.2734 6.98414C20.7394 8.52898 21.7474 10.5509 21.9994 12.7773Z" fill="#D82F20"/>
+<path d="M20.0052 20.0462C18.1726 22.4316 15.2863 23.9992 12.0334 23.9992C6.48985 23.9992 2 19.501 2 13.9577C2 11.2543 3.05374 8.8234 4.7947 7.00594L5.29866 6.50614L9.65107 2.25783C9.69688 2.2124 9.7656 2.25783 9.7427 2.30327C9.67397 2.59861 9.55944 3.28015 9.62816 4.18888C9.71979 5.25664 10.0634 6.68789 11.0713 8.27817C11.6898 9.27777 12.5832 10.3228 13.8202 11.4133C13.9577 11.5496 14.118 11.6632 14.2784 11.7995C14.8281 12.3674 15.1488 13.1171 15.1488 13.9577C15.1488 15.6616 13.7515 17.0474 12.0563 17.0474C11.3233 17.0474 10.659 16.7975 10.1321 16.3659C10.0863 16.3204 10.1321 16.2523 10.1779 16.275C10.2925 16.2977 10.407 16.3204 10.5215 16.3204C11.1171 16.3204 11.6211 15.8433 11.6211 15.2299C11.6211 14.8665 11.4378 14.5257 11.163 14.3439C10.4299 13.7533 9.81142 13.1853 9.28455 12.6173C8.55151 11.8222 8.00174 11.0498 7.61231 10.3001C6.81055 11.2997 6.30659 12.5492 6.30659 13.935C6.30659 15.7979 7.17707 17.4563 8.55152 18.5014C8.68896 18.615 10.4528 20.1371 12.9039 20.7959C15.1259 21.432 18.9057 21.4093 20.0052 20.0462Z" fill="#69C5F4"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/jina-text.svg b/app/components/base/icons/assets/public/llm/jina-text.svg
new file mode 100644
index 0000000..6a241fc
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/jina-text.svg
@@ -0,0 +1,12 @@
+<svg width="58" height="24" viewBox="0 0 58 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_13814_61529)">
+<path d="M4.47132 23.952C6.49932 23.952 8.14332 22.308 8.14332 20.28C8.14332 18.252 6.49932 16.608 4.47132 16.608C2.44332 16.608 0.799316 18.252 0.799316 20.28C0.799316 22.308 2.44332 23.952 4.47132 23.952Z" fill="#EB6161"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M16.0387 8.71204C16.5187 8.71204 16.9027 9.09604 16.9027 9.57604L16.8547 16.608C16.8547 20.616 13.6387 23.88 9.63074 23.952H9.51074V16.632H9.53474L9.55874 9.60004C9.55874 9.12004 9.94274 8.73604 10.4227 8.73604H16.0387V8.71204ZM27.3187 8.71204C27.7987 8.71204 28.1827 9.09604 28.1827 9.57604V19.416C28.1827 19.896 27.7987 20.28 27.3187 20.28H21.7027C21.2227 20.28 20.8387 19.896 20.8387 19.416V9.57604C20.8387 9.09604 21.2227 8.71204 21.7027 8.71204H27.3187ZM36.1507 8.68804H36.2707C39.8707 8.73604 42.7987 11.64 42.8947 15.24V19.392C42.8947 19.872 42.5107 20.256 42.0307 20.256H32.9587C32.4787 20.256 32.0947 19.872 32.0947 19.392V9.55204C32.0947 9.07204 32.4787 8.68804 32.9587 8.68804H36.1507ZM51.0067 20.16C47.9827 19.968 45.5587 17.448 45.5587 14.376C45.5587 11.184 48.1507 8.59204 51.3427 8.59204C54.4147 8.59204 56.9347 10.992 57.1267 14.04V19.296C57.1267 19.776 56.7427 20.16 56.2627 20.16H51.0067Z" fill="#009191"/>
+<path d="M24.4987 7.344C26.5267 7.344 28.1707 5.7 28.1707 3.672C28.1707 1.644 26.5267 0 24.4987 0C22.4707 0 20.8267 1.644 20.8267 3.672C20.8267 5.7 22.4707 7.344 24.4987 7.344Z" fill="#FBCB67"/>
+</g>
+<defs>
+<clipPath id="clip0_13814_61529">
+<rect width="56.4" height="24" fill="white" transform="translate(0.800781)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/jina.svg b/app/components/base/icons/assets/public/llm/jina.svg
new file mode 100644
index 0000000..2e1b00f
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/jina.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M6.56053 21.4486C9.07925 21.4486 11.1211 19.4068 11.1211 16.8882C11.1211 14.3696 9.07925 12.3279 6.56053 12.3279C4.04182 12.3279 2 14.3696 2 16.8882C2 19.4068 4.04182 21.4486 6.56053 21.4486Z" fill="#EB6161"/>
+<path d="M22.0002 3.59467L21.9406 12.3279C21.9406 17.3055 17.9464 21.3591 12.9685 21.4485L12.8789 12.3577L12.8791 3.62447C12.8791 3.02835 13.356 2.55145 13.9522 2.55145H20.9271C21.5233 2.55145 22.0002 2.99854 22.0002 3.59467Z" fill="#009191"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/localai-text.svg b/app/components/base/icons/assets/public/llm/localai-text.svg
new file mode 100644
index 0000000..251a37f
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/localai-text.svg
@@ -0,0 +1,22 @@
+<svg width="90" height="24" viewBox="0 0 90 24" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g clip-path="url(#clip0_10164_6324)">
+<rect width="24" height="24" rx="4" fill="#1E0122"/>
+<rect width="24" height="24" fill="url(#pattern0)"/>
+</g>
+<path d="M33.0242 16.528H36.7842V18H31.2002V6.88003H33.0242V16.528Z" fill="#1C2B33"/>
+<path d="M41.8136 18.144C40.9816 18.144 40.2296 17.9574 39.5576 17.584C38.8856 17.2 38.3576 16.6667 37.9736 15.984C37.5896 15.2907 37.3976 14.4907 37.3976 13.584C37.3976 12.688 37.5949 11.8934 37.9896 11.2C38.3842 10.5067 38.9229 9.97337 39.6056 9.60003C40.2882 9.2267 41.0509 9.04003 41.8936 9.04003C42.7362 9.04003 43.4989 9.2267 44.1816 9.60003C44.8642 9.97337 45.4029 10.5067 45.7976 11.2C46.1922 11.8934 46.3896 12.688 46.3896 13.584C46.3896 14.48 46.1869 15.2747 45.7816 15.968C45.3762 16.6614 44.8216 17.2 44.1176 17.584C43.4242 17.9574 42.6562 18.144 41.8136 18.144ZM41.8136 16.56C42.2829 16.56 42.7202 16.448 43.1256 16.224C43.5416 16 43.8776 15.664 44.1336 15.216C44.3896 14.768 44.5176 14.224 44.5176 13.584C44.5176 12.944 44.3949 12.4054 44.1496 11.968C43.9042 11.52 43.5789 11.184 43.1736 10.96C42.7682 10.736 42.3309 10.624 41.8616 10.624C41.3922 10.624 40.9549 10.736 40.5496 10.96C40.1549 11.184 39.8402 11.52 39.6056 11.968C39.3709 12.4054 39.2536 12.944 39.2536 13.584C39.2536 14.5334 39.4936 15.2694 39.9736 15.792C40.4642 16.304 41.0776 16.56 41.8136 16.56Z" fill="#1C2B33"/>
+<path d="M47.2647 13.584C47.2647 12.6774 47.446 11.8827 47.8087 11.2C48.182 10.5067 48.694 9.97337 49.3447 9.60003C49.9954 9.2267 50.742 9.04003 51.5847 9.04003C52.6514 9.04003 53.5314 9.29603 54.2247 9.80803C54.9287 10.3094 55.4034 11.0294 55.6487 11.968H53.6807C53.5207 11.5307 53.2647 11.1894 52.9127 10.944C52.5607 10.6987 52.118 10.576 51.5847 10.576C50.838 10.576 50.2407 10.8427 49.7927 11.376C49.3554 11.8987 49.1367 12.6347 49.1367 13.584C49.1367 14.5334 49.3554 15.2747 49.7927 15.808C50.2407 16.3414 50.838 16.608 51.5847 16.608C52.6407 16.608 53.3394 16.144 53.6807 15.216H55.6487C55.3927 16.112 54.9127 16.8267 54.2087 17.36C53.5047 17.8827 52.63 18.144 51.5847 18.144C50.742 18.144 49.9954 17.9574 49.3447 17.584C48.694 17.2 48.182 16.6667 47.8087 15.984C47.446 15.2907 47.2647 14.4907 47.2647 13.584Z" fill="#1C2B33"/>
+<path d="M56.5384 13.552C56.5384 12.6667 56.7198 11.8827 57.0824 11.2C57.4558 10.5174 57.9571 9.98937 58.5864 9.61603C59.2264 9.23203 59.9304 9.04003 60.6984 9.04003C61.3918 9.04003 61.9944 9.1787 62.5064 9.45603C63.0291 9.7227 63.4451 10.0587 63.7544 10.464V9.18403H65.5944V18H63.7544V16.688C63.4451 17.104 63.0238 17.4507 62.4904 17.728C61.9571 18.0054 61.3491 18.144 60.6664 18.144C59.9091 18.144 59.2158 17.952 58.5864 17.568C57.9571 17.1734 57.4558 16.6294 57.0824 15.936C56.7198 15.232 56.5384 14.4374 56.5384 13.552ZM63.7544 13.584C63.7544 12.976 63.6264 12.448 63.3704 12C63.1251 11.552 62.7998 11.2107 62.3944 10.976C61.9891 10.7414 61.5518 10.624 61.0824 10.624C60.6131 10.624 60.1758 10.7414 59.7704 10.976C59.3651 11.2 59.0344 11.536 58.7784 11.984C58.5331 12.4214 58.4104 12.944 58.4104 13.552C58.4104 14.16 58.5331 14.6934 58.7784 15.152C59.0344 15.6107 59.3651 15.9627 59.7704 16.208C60.1864 16.4427 60.6238 16.56 61.0824 16.56C61.5518 16.56 61.9891 16.4427 62.3944 16.208C62.7998 15.9734 63.1251 15.632 63.3704 15.184C63.6264 14.7254 63.7544 14.192 63.7544 13.584Z" fill="#1C2B33"/>
+<path d="M69.4942 6.16003V18H67.6702V6.16003H69.4942Z" fill="#1C2B33"/>
+<path d="M78.2729 15.728H73.6169L72.8169 18H70.9129L74.8969 6.86403H77.0089L80.9929 18H79.0729L78.2729 15.728ZM77.7609 14.24L75.9529 9.07203L74.1289 14.24H77.7609Z" fill="#1C2B33"/>
+<path d="M84.2292 6.88003V18H82.4052V6.88003H84.2292Z" fill="#1C2B33"/>
+<defs>
+<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_10164_6324" transform="scale(0.00390625)"/>
+</pattern>
+<clipPath id="clip0_10164_6324">
+<rect width="24" height="24" rx="4" fill="white"/>
+</clipPath>
+<image id="image0_10164_6324" width="256" height="256" xlink:href="data:image/jpeg;base64,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"/>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/localai.svg b/app/components/base/icons/assets/public/llm/localai.svg
new file mode 100644
index 0000000..9dc6e62
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/localai.svg
@@ -0,0 +1,15 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g clip-path="url(#clip0_10164_6300)">
+<rect width="24" height="24" rx="4" fill="#1C0120"/>
+<rect width="24" height="24" fill="url(#pattern0)"/>
+</g>
+<defs>
+<pattern id="pattern0" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_10164_6300" transform="scale(0.00390625)"/>
+</pattern>
+<clipPath id="clip0_10164_6300">
+<rect width="24" height="24" rx="4" fill="white"/>
+</clipPath>
+<image id="image0_10164_6300" width="256" height="256" xlink:href="data:image/jpeg;base64,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"/>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/microsoft.svg b/app/components/base/icons/assets/public/llm/microsoft.svg
new file mode 100644
index 0000000..df1f54f
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/microsoft.svg
@@ -0,0 +1,8 @@
+<svg width="21" height="22" viewBox="0 0 21 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Microsoft">
+<rect id="Rectangle 1010" y="0.5" width="10" height="10" fill="#EF4F21"/>
+<rect id="Rectangle 1012" y="11.5" width="10" height="10" fill="#03A4EE"/>
+<rect id="Rectangle 1011" x="11" y="0.5" width="10" height="10" fill="#7EB903"/>
+<rect id="Rectangle 1013" x="11" y="11.5" width="10" height="10" fill="#FBB604"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/openai-black.svg b/app/components/base/icons/assets/public/llm/openai-black.svg
new file mode 100644
index 0000000..c8fb1c5
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/openai-black.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="6" fill="black"/>
+<path d="M19.7758 11.5959C19.9546 11.9948 20.0681 12.4213 20.1145 12.8563C20.1592 13.2913 20.1369 13.7315 20.044 14.1596C19.9529 14.5878 19.7947 14.9987 19.5746 15.377C19.4302 15.6298 19.2599 15.867 19.0639 16.0854C18.8696 16.3021 18.653 16.4981 18.4174 16.67C18.1801 16.842 17.9274 16.9864 17.6591 17.105C17.3926 17.222 17.1141 17.3114 16.8286 17.3698C16.6945 17.7859 16.4951 18.1797 16.2371 18.5339C15.9809 18.8881 15.6697 19.1993 15.3155 19.4555C14.9613 19.7134 14.5693 19.9129 14.1532 20.047C13.7371 20.1829 13.302 20.2499 12.8636 20.2499C12.573 20.2516 12.2807 20.2207 11.9953 20.1622C11.7116 20.102 11.433 20.0109 11.1665 19.8923C10.9 19.7736 10.6472 19.6258 10.4116 19.4538C10.1778 19.2819 9.96115 19.0841 9.76857 18.8658C9.33871 18.9586 8.89853 18.981 8.46351 18.9363C8.02849 18.8898 7.60207 18.7763 7.20143 18.5975C6.80252 18.4204 6.43284 18.1797 6.10786 17.8857C5.78289 17.5916 5.50606 17.2478 5.28769 16.8695C5.14153 16.6167 5.02117 16.3502 4.93004 16.0734C4.83891 15.7965 4.77873 15.5111 4.74778 15.2205C4.71683 14.9317 4.71855 14.6393 4.7495 14.3488C4.78045 14.0599 4.84407 13.7745 4.9352 13.4976C4.64289 13.1727 4.40217 12.803 4.22335 12.4041C4.04624 12.0034 3.93104 11.5787 3.88634 11.1437C3.83991 10.7087 3.86398 10.2685 3.95511 9.84036C4.04624 9.41222 4.20443 9.00127 4.42452 8.62299C4.56896 8.37023 4.73918 8.13123 4.93348 7.91458C5.12778 7.69793 5.34615 7.50191 5.58171 7.32997C5.81728 7.15802 6.07176 7.01187 6.33827 6.89495C6.6065 6.7763 6.88506 6.68861 7.17048 6.63015C7.3046 6.21232 7.50406 5.82029 7.76026 5.46608C8.01817 5.11188 8.32939 4.80066 8.6836 4.54274C9.03781 4.28654 9.42984 4.08708 9.84595 3.95125C10.2621 3.81713 10.6971 3.74835 11.1355 3.75007C11.4261 3.74835 11.7184 3.77758 12.0039 3.83776C12.2893 3.89794 12.5678 3.98736 12.8344 4.106C13.1009 4.22636 13.3536 4.37251 13.5892 4.54446C13.8248 4.71812 14.0414 4.91414 14.234 5.13251C14.6621 5.04138 15.1023 5.01903 15.5373 5.06373C15.9723 5.10844 16.3971 5.22364 16.7977 5.40074C17.1966 5.57957 17.5663 5.81857 17.8913 6.1126C18.2162 6.4049 18.4931 6.74707 18.7114 7.12707C18.8576 7.37811 18.9779 7.64463 19.0691 7.92318C19.1602 8.20001 19.2221 8.48544 19.2513 8.77602C19.2823 9.06661 19.2823 9.35892 19.2496 9.64951C19.2187 9.94009 19.155 10.2255 19.0639 10.5024C19.3579 10.8273 19.5969 11.1953 19.7758 11.5959ZM14.0466 18.9363C14.4214 18.7815 14.7619 18.5528 15.049 18.2657C15.3362 17.9785 15.5648 17.6381 15.7196 17.2615C15.8743 16.8867 15.9552 16.4843 15.9552 16.0785V12.2442C15.954 12.2407 15.9529 12.2367 15.9517 12.2321C15.9506 12.2287 15.9488 12.2252 15.9466 12.2218C15.9443 12.2184 15.9414 12.2155 15.938 12.2132C15.9345 12.2098 15.9311 12.2075 15.9276 12.2063L14.54 11.4051V16.0373C14.54 16.0837 14.5332 16.1318 14.5211 16.1765C14.5091 16.223 14.4919 16.2659 14.4678 16.3072C14.4438 16.3485 14.4162 16.3863 14.3819 16.419C14.3484 16.4523 14.3109 16.4812 14.2701 16.505L10.9842 18.4015C10.9567 18.4187 10.9103 18.4428 10.8862 18.4565C11.0221 18.5717 11.1699 18.6732 11.3247 18.7626C11.4811 18.852 11.6428 18.9277 11.8113 18.9896C11.9798 19.0497 12.1535 19.0962 12.3288 19.1271C12.5059 19.1581 12.6848 19.1735 12.8636 19.1735C13.2694 19.1735 13.6717 19.0927 14.0466 18.9363ZM6.22135 16.333C6.42596 16.6855 6.69592 16.9916 7.01745 17.2392C7.34071 17.4868 7.70695 17.6673 8.09899 17.7722C8.49102 17.8771 8.90025 17.9046 9.3026 17.8513C9.70495 17.798 10.0918 17.6673 10.4443 17.4644L13.7663 15.5472L13.7749 15.5386C13.7772 15.5363 13.7789 15.5329 13.78 15.5283C13.7823 15.5249 13.7841 15.5214 13.7852 15.518V13.9017L9.77545 16.2212C9.73418 16.2453 9.6912 16.2625 9.64649 16.2763C9.60007 16.2883 9.55364 16.2935 9.5055 16.2935C9.45907 16.2935 9.41265 16.2883 9.36622 16.2763C9.32152 16.2625 9.27681 16.2453 9.23554 16.2212L5.94967 14.323C5.92044 14.3058 5.87746 14.28 5.85339 14.2645C5.82244 14.4416 5.80696 14.6204 5.80696 14.7993C5.80696 14.9781 5.82415 15.1569 5.85511 15.334C5.88605 15.5094 5.9342 15.6831 5.99438 15.8516C6.05628 16.0201 6.13194 16.1817 6.22135 16.3364V16.333ZM5.35818 9.1629C5.15529 9.51539 5.02461 9.90398 4.97131 10.3063C4.918 10.7087 4.94552 11.1162 5.0504 11.51C5.15529 11.902 5.33583 12.2682 5.58343 12.5915C5.83103 12.913 6.13881 13.183 6.48958 13.3859L9.80984 15.3048C9.81328 15.3059 9.81729 15.3071 9.82188 15.3082H9.83391C9.8385 15.3082 9.84251 15.3071 9.84595 15.3048C9.84939 15.3036 9.85283 15.3019 9.85627 15.2996L11.249 14.4949L7.23926 12.1805C7.19971 12.1565 7.16189 12.1272 7.1275 12.0946C7.09418 12.0611 7.06529 12.0236 7.04153 11.9828C7.01917 11.9415 7.00026 11.8985 6.98822 11.8521C6.97619 11.8074 6.96931 11.761 6.97103 11.7128V7.80797C6.80252 7.86987 6.63917 7.94553 6.48442 8.03494C6.32967 8.12607 6.18352 8.22924 6.04596 8.34444C5.91013 8.45965 5.78289 8.58688 5.66769 8.72444C5.55248 8.86028 5.45103 9.00815 5.36162 9.1629H5.35818ZM16.7633 11.8177C16.8046 11.8418 16.8424 11.8693 16.8768 11.9037C16.9094 11.9364 16.9387 11.9742 16.9628 12.0155C16.9851 12.0567 17.004 12.1014 17.0161 12.1461C17.0264 12.1926 17.0332 12.239 17.0315 12.2871V16.192C17.5835 15.9891 18.0649 15.6332 18.4208 15.1655C18.7785 14.6978 18.9934 14.139 19.0433 13.5544C19.0931 12.9698 18.9762 12.3817 18.7046 11.8607C18.4329 11.3397 18.0185 10.9064 17.5095 10.6141L14.1893 8.69521C14.1858 8.69406 14.1818 8.69292 14.1772 8.69177H14.1652C14.1618 8.69292 14.1578 8.69406 14.1532 8.69521C14.1497 8.69636 14.1463 8.69808 14.1429 8.70037L12.757 9.50163L16.7667 11.8177H16.7633ZM18.1475 9.7372H18.1457V9.73892L18.1475 9.7372ZM18.1457 9.73548C18.2455 9.15774 18.1784 8.56281 17.9514 8.02119C17.7262 7.47956 17.3496 7.01359 16.8682 6.67658C16.3867 6.34128 15.8193 6.1487 15.233 6.12291C14.6449 6.09884 14.0638 6.24155 13.5548 6.53386L10.2345 8.45105C10.2311 8.45334 10.2282 8.45621 10.2259 8.45965L10.2191 8.46996C10.2179 8.4734 10.2168 8.47741 10.2156 8.482C10.2145 8.48544 10.2139 8.48945 10.2139 8.49403V10.0966L14.2237 7.78046C14.2649 7.75639 14.3096 7.7392 14.3543 7.72544C14.4008 7.7134 14.4472 7.70825 14.4936 7.70825C14.5418 7.70825 14.5882 7.7134 14.6346 7.72544C14.6793 7.7392 14.7223 7.75639 14.7636 7.78046L18.0494 9.67874C18.0787 9.69593 18.1217 9.72 18.1457 9.73548ZM9.45735 7.96101C9.45735 7.91458 9.46423 7.86816 9.47627 7.82173C9.4883 7.77702 9.5055 7.73232 9.52957 7.69105C9.55364 7.6515 9.58115 7.61368 9.61554 7.57929C9.64821 7.54662 9.68604 7.51739 9.72731 7.49503L13.0132 5.59848C13.0441 5.57957 13.0871 5.55549 13.1112 5.54346C12.6607 5.1669 12.1105 4.92618 11.5276 4.85224C10.9447 4.77658 10.3532 4.86943 9.82188 5.11875C9.28885 5.36807 8.83835 5.76527 8.52369 6.26047C8.20903 6.75739 8.04224 7.33169 8.04224 7.91974V11.7541C8.04339 11.7587 8.04454 11.7627 8.04568 11.7661C8.04683 11.7696 8.04855 11.773 8.05084 11.7765C8.05313 11.7799 8.056 11.7833 8.05944 11.7868C8.06173 11.7891 8.06517 11.7914 8.06976 11.7937L9.45735 12.5949V7.96101ZM10.2105 13.0282L11.997 14.0599L13.7835 13.0282V10.9666L11.9987 9.93493L10.2122 10.9666L10.2105 13.0282Z" fill="white"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/openai-blue.svg b/app/components/base/icons/assets/public/llm/openai-blue.svg
new file mode 100644
index 0000000..ccd75ec
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/openai-blue.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="6" fill="#03A4EE"/>
+<path d="M19.7758 11.5959C19.9546 11.9948 20.0681 12.4213 20.1145 12.8563C20.1592 13.2913 20.1369 13.7315 20.044 14.1596C19.9529 14.5878 19.7947 14.9987 19.5746 15.377C19.4302 15.6298 19.2599 15.867 19.0639 16.0854C18.8696 16.3021 18.653 16.4981 18.4174 16.67C18.1801 16.842 17.9274 16.9864 17.6591 17.105C17.3926 17.222 17.1141 17.3114 16.8286 17.3698C16.6945 17.7859 16.4951 18.1797 16.2371 18.5339C15.9809 18.8881 15.6697 19.1993 15.3155 19.4555C14.9613 19.7134 14.5693 19.9129 14.1532 20.047C13.7371 20.1829 13.302 20.2499 12.8636 20.2499C12.573 20.2516 12.2807 20.2207 11.9953 20.1622C11.7116 20.102 11.433 20.0109 11.1665 19.8923C10.9 19.7736 10.6472 19.6258 10.4116 19.4538C10.1778 19.2819 9.96115 19.0841 9.76857 18.8658C9.33871 18.9586 8.89853 18.981 8.46351 18.9363C8.02849 18.8898 7.60207 18.7763 7.20143 18.5975C6.80252 18.4204 6.43284 18.1797 6.10786 17.8857C5.78289 17.5916 5.50606 17.2478 5.28769 16.8695C5.14153 16.6167 5.02117 16.3502 4.93004 16.0734C4.83891 15.7965 4.77873 15.5111 4.74778 15.2205C4.71683 14.9317 4.71855 14.6393 4.7495 14.3488C4.78045 14.0599 4.84407 13.7745 4.9352 13.4976C4.64289 13.1727 4.40217 12.803 4.22335 12.4041C4.04624 12.0034 3.93104 11.5787 3.88634 11.1437C3.83991 10.7087 3.86398 10.2685 3.95511 9.84036C4.04624 9.41222 4.20443 9.00127 4.42452 8.62299C4.56896 8.37023 4.73918 8.13123 4.93348 7.91458C5.12778 7.69793 5.34615 7.50191 5.58171 7.32997C5.81728 7.15802 6.07176 7.01187 6.33827 6.89495C6.6065 6.7763 6.88506 6.68861 7.17048 6.63015C7.3046 6.21232 7.50406 5.82029 7.76026 5.46608C8.01817 5.11188 8.32939 4.80066 8.6836 4.54274C9.03781 4.28654 9.42984 4.08708 9.84595 3.95125C10.2621 3.81713 10.6971 3.74835 11.1355 3.75007C11.4261 3.74835 11.7184 3.77758 12.0039 3.83776C12.2893 3.89794 12.5678 3.98736 12.8344 4.106C13.1009 4.22636 13.3536 4.37251 13.5892 4.54446C13.8248 4.71812 14.0414 4.91414 14.234 5.13251C14.6621 5.04138 15.1023 5.01903 15.5373 5.06373C15.9723 5.10844 16.3971 5.22364 16.7977 5.40074C17.1966 5.57957 17.5663 5.81857 17.8913 6.1126C18.2162 6.4049 18.4931 6.74707 18.7114 7.12707C18.8576 7.37811 18.9779 7.64463 19.0691 7.92318C19.1602 8.20001 19.2221 8.48544 19.2513 8.77602C19.2823 9.06661 19.2823 9.35892 19.2496 9.64951C19.2187 9.94009 19.155 10.2255 19.0639 10.5024C19.3579 10.8273 19.5969 11.1953 19.7758 11.5959ZM14.0466 18.9363C14.4214 18.7815 14.7619 18.5528 15.049 18.2657C15.3362 17.9785 15.5648 17.6381 15.7196 17.2615C15.8743 16.8867 15.9552 16.4843 15.9552 16.0785V12.2442C15.954 12.2407 15.9529 12.2367 15.9517 12.2321C15.9506 12.2287 15.9488 12.2252 15.9466 12.2218C15.9443 12.2184 15.9414 12.2155 15.938 12.2132C15.9345 12.2098 15.9311 12.2075 15.9276 12.2063L14.54 11.4051V16.0373C14.54 16.0837 14.5332 16.1318 14.5211 16.1765C14.5091 16.223 14.4919 16.2659 14.4678 16.3072C14.4438 16.3485 14.4162 16.3863 14.3819 16.419C14.3484 16.4523 14.3109 16.4812 14.2701 16.505L10.9842 18.4015C10.9567 18.4187 10.9103 18.4428 10.8862 18.4565C11.0221 18.5717 11.1699 18.6732 11.3247 18.7626C11.4811 18.852 11.6428 18.9277 11.8113 18.9896C11.9798 19.0497 12.1535 19.0962 12.3288 19.1271C12.5059 19.1581 12.6848 19.1735 12.8636 19.1735C13.2694 19.1735 13.6717 19.0927 14.0466 18.9363ZM6.22135 16.333C6.42596 16.6855 6.69592 16.9916 7.01745 17.2392C7.34071 17.4868 7.70695 17.6673 8.09899 17.7722C8.49102 17.8771 8.90025 17.9046 9.3026 17.8513C9.70495 17.798 10.0918 17.6673 10.4443 17.4644L13.7663 15.5472L13.7749 15.5386C13.7772 15.5363 13.7789 15.5329 13.78 15.5283C13.7823 15.5249 13.7841 15.5214 13.7852 15.518V13.9017L9.77545 16.2212C9.73418 16.2453 9.6912 16.2625 9.64649 16.2763C9.60007 16.2883 9.55364 16.2935 9.5055 16.2935C9.45907 16.2935 9.41265 16.2883 9.36622 16.2763C9.32152 16.2625 9.27681 16.2453 9.23554 16.2212L5.94967 14.323C5.92044 14.3058 5.87746 14.28 5.85339 14.2645C5.82244 14.4416 5.80696 14.6204 5.80696 14.7993C5.80696 14.9781 5.82415 15.1569 5.85511 15.334C5.88605 15.5094 5.9342 15.6831 5.99438 15.8516C6.05628 16.0201 6.13194 16.1817 6.22135 16.3364V16.333ZM5.35818 9.1629C5.15529 9.51539 5.02461 9.90398 4.97131 10.3063C4.918 10.7087 4.94552 11.1162 5.0504 11.51C5.15529 11.902 5.33583 12.2682 5.58343 12.5915C5.83103 12.913 6.13881 13.183 6.48958 13.3859L9.80984 15.3048C9.81328 15.3059 9.81729 15.3071 9.82188 15.3082H9.83391C9.8385 15.3082 9.84251 15.3071 9.84595 15.3048C9.84939 15.3036 9.85283 15.3019 9.85627 15.2996L11.249 14.4949L7.23926 12.1805C7.19971 12.1565 7.16189 12.1272 7.1275 12.0946C7.09418 12.0611 7.06529 12.0236 7.04153 11.9828C7.01917 11.9415 7.00026 11.8985 6.98822 11.8521C6.97619 11.8074 6.96931 11.761 6.97103 11.7128V7.80797C6.80252 7.86987 6.63917 7.94553 6.48442 8.03494C6.32967 8.12607 6.18352 8.22924 6.04596 8.34444C5.91013 8.45965 5.78289 8.58688 5.66769 8.72444C5.55248 8.86028 5.45103 9.00815 5.36162 9.1629H5.35818ZM16.7633 11.8177C16.8046 11.8418 16.8424 11.8693 16.8768 11.9037C16.9094 11.9364 16.9387 11.9742 16.9628 12.0155C16.9851 12.0567 17.004 12.1014 17.0161 12.1461C17.0264 12.1926 17.0332 12.239 17.0315 12.2871V16.192C17.5835 15.9891 18.0649 15.6332 18.4208 15.1655C18.7785 14.6978 18.9934 14.139 19.0433 13.5544C19.0931 12.9698 18.9762 12.3817 18.7046 11.8607C18.4329 11.3397 18.0185 10.9064 17.5095 10.6141L14.1893 8.69521C14.1858 8.69406 14.1818 8.69292 14.1772 8.69177H14.1652C14.1618 8.69292 14.1578 8.69406 14.1532 8.69521C14.1497 8.69636 14.1463 8.69808 14.1429 8.70037L12.757 9.50163L16.7667 11.8177H16.7633ZM18.1475 9.7372H18.1457V9.73892L18.1475 9.7372ZM18.1457 9.73548C18.2455 9.15774 18.1784 8.56281 17.9514 8.02119C17.7262 7.47956 17.3496 7.01359 16.8682 6.67658C16.3867 6.34128 15.8193 6.1487 15.233 6.12291C14.6449 6.09884 14.0638 6.24155 13.5548 6.53386L10.2345 8.45105C10.2311 8.45334 10.2282 8.45621 10.2259 8.45965L10.2191 8.46996C10.2179 8.4734 10.2168 8.47741 10.2156 8.482C10.2145 8.48544 10.2139 8.48945 10.2139 8.49403V10.0966L14.2237 7.78046C14.2649 7.75639 14.3096 7.7392 14.3543 7.72544C14.4008 7.7134 14.4472 7.70825 14.4936 7.70825C14.5418 7.70825 14.5882 7.7134 14.6346 7.72544C14.6793 7.7392 14.7223 7.75639 14.7636 7.78046L18.0494 9.67874C18.0787 9.69593 18.1217 9.72 18.1457 9.73548ZM9.45735 7.96101C9.45735 7.91458 9.46423 7.86816 9.47627 7.82173C9.4883 7.77702 9.5055 7.73232 9.52957 7.69105C9.55364 7.6515 9.58115 7.61368 9.61554 7.57929C9.64821 7.54662 9.68604 7.51739 9.72731 7.49503L13.0132 5.59848C13.0441 5.57957 13.0871 5.55549 13.1112 5.54346C12.6607 5.1669 12.1105 4.92618 11.5276 4.85224C10.9447 4.77658 10.3532 4.86943 9.82188 5.11875C9.28885 5.36807 8.83835 5.76527 8.52369 6.26047C8.20903 6.75739 8.04224 7.33169 8.04224 7.91974V11.7541C8.04339 11.7587 8.04454 11.7627 8.04568 11.7661C8.04683 11.7696 8.04855 11.773 8.05084 11.7765C8.05313 11.7799 8.056 11.7833 8.05944 11.7868C8.06173 11.7891 8.06517 11.7914 8.06976 11.7937L9.45735 12.5949V7.96101ZM10.2105 13.0282L11.997 14.0599L13.7835 13.0282V10.9666L11.9987 9.93493L10.2122 10.9666L10.2105 13.0282Z" fill="white"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/openai-green.svg b/app/components/base/icons/assets/public/llm/openai-green.svg
new file mode 100644
index 0000000..70686f9
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/openai-green.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="6" fill="#19C37D"/>
+<path d="M19.7758 11.5959C19.9546 11.9948 20.0681 12.4213 20.1145 12.8563C20.1592 13.2913 20.1369 13.7315 20.044 14.1596C19.9529 14.5878 19.7947 14.9987 19.5746 15.377C19.4302 15.6298 19.2599 15.867 19.0639 16.0854C18.8696 16.3021 18.653 16.4981 18.4174 16.67C18.1801 16.842 17.9274 16.9864 17.6591 17.105C17.3926 17.222 17.1141 17.3114 16.8286 17.3698C16.6945 17.7859 16.4951 18.1797 16.2371 18.5339C15.9809 18.8881 15.6697 19.1993 15.3155 19.4555C14.9613 19.7134 14.5693 19.9129 14.1532 20.047C13.7371 20.1829 13.302 20.2499 12.8636 20.2499C12.573 20.2516 12.2807 20.2207 11.9953 20.1622C11.7116 20.102 11.433 20.0109 11.1665 19.8923C10.9 19.7736 10.6472 19.6258 10.4116 19.4538C10.1778 19.2819 9.96115 19.0841 9.76857 18.8658C9.33871 18.9586 8.89853 18.981 8.46351 18.9363C8.02849 18.8898 7.60207 18.7763 7.20143 18.5975C6.80252 18.4204 6.43284 18.1797 6.10786 17.8857C5.78289 17.5916 5.50606 17.2478 5.28769 16.8695C5.14153 16.6167 5.02117 16.3502 4.93004 16.0734C4.83891 15.7965 4.77873 15.5111 4.74778 15.2205C4.71683 14.9317 4.71855 14.6393 4.7495 14.3488C4.78045 14.0599 4.84407 13.7745 4.9352 13.4976C4.64289 13.1727 4.40217 12.803 4.22335 12.4041C4.04624 12.0034 3.93104 11.5787 3.88634 11.1437C3.83991 10.7087 3.86398 10.2685 3.95511 9.84036C4.04624 9.41222 4.20443 9.00127 4.42452 8.62299C4.56896 8.37023 4.73918 8.13123 4.93348 7.91458C5.12778 7.69793 5.34615 7.50191 5.58171 7.32997C5.81728 7.15802 6.07176 7.01187 6.33827 6.89495C6.6065 6.7763 6.88506 6.68861 7.17048 6.63015C7.3046 6.21232 7.50406 5.82029 7.76026 5.46608C8.01817 5.11188 8.32939 4.80066 8.6836 4.54274C9.03781 4.28654 9.42984 4.08708 9.84595 3.95125C10.2621 3.81713 10.6971 3.74835 11.1355 3.75007C11.4261 3.74835 11.7184 3.77758 12.0039 3.83776C12.2893 3.89794 12.5678 3.98736 12.8344 4.106C13.1009 4.22636 13.3536 4.37251 13.5892 4.54446C13.8248 4.71812 14.0414 4.91414 14.234 5.13251C14.6621 5.04138 15.1023 5.01903 15.5373 5.06373C15.9723 5.10844 16.3971 5.22364 16.7977 5.40074C17.1966 5.57957 17.5663 5.81857 17.8913 6.1126C18.2162 6.4049 18.4931 6.74707 18.7114 7.12707C18.8576 7.37811 18.9779 7.64463 19.0691 7.92318C19.1602 8.20001 19.2221 8.48544 19.2513 8.77602C19.2823 9.06661 19.2823 9.35892 19.2496 9.64951C19.2187 9.94009 19.155 10.2255 19.0639 10.5024C19.3579 10.8273 19.5969 11.1953 19.7758 11.5959ZM14.0466 18.9363C14.4214 18.7815 14.7619 18.5528 15.049 18.2657C15.3362 17.9785 15.5648 17.6381 15.7196 17.2615C15.8743 16.8867 15.9552 16.4843 15.9552 16.0785V12.2442C15.954 12.2407 15.9529 12.2367 15.9517 12.2321C15.9506 12.2287 15.9488 12.2252 15.9466 12.2218C15.9443 12.2184 15.9414 12.2155 15.938 12.2132C15.9345 12.2098 15.9311 12.2075 15.9276 12.2063L14.54 11.4051V16.0373C14.54 16.0837 14.5332 16.1318 14.5211 16.1765C14.5091 16.223 14.4919 16.2659 14.4678 16.3072C14.4438 16.3485 14.4162 16.3863 14.3819 16.419C14.3484 16.4523 14.3109 16.4812 14.2701 16.505L10.9842 18.4015C10.9567 18.4187 10.9103 18.4428 10.8862 18.4565C11.0221 18.5717 11.1699 18.6732 11.3247 18.7626C11.4811 18.852 11.6428 18.9277 11.8113 18.9896C11.9798 19.0497 12.1535 19.0962 12.3288 19.1271C12.5059 19.1581 12.6848 19.1735 12.8636 19.1735C13.2694 19.1735 13.6717 19.0927 14.0466 18.9363ZM6.22135 16.333C6.42596 16.6855 6.69592 16.9916 7.01745 17.2392C7.34071 17.4868 7.70695 17.6673 8.09899 17.7722C8.49102 17.8771 8.90025 17.9046 9.3026 17.8513C9.70495 17.798 10.0918 17.6673 10.4443 17.4644L13.7663 15.5472L13.7749 15.5386C13.7772 15.5363 13.7789 15.5329 13.78 15.5283C13.7823 15.5249 13.7841 15.5214 13.7852 15.518V13.9017L9.77545 16.2212C9.73418 16.2453 9.6912 16.2625 9.64649 16.2763C9.60007 16.2883 9.55364 16.2935 9.5055 16.2935C9.45907 16.2935 9.41265 16.2883 9.36622 16.2763C9.32152 16.2625 9.27681 16.2453 9.23554 16.2212L5.94967 14.323C5.92044 14.3058 5.87746 14.28 5.85339 14.2645C5.82244 14.4416 5.80696 14.6204 5.80696 14.7993C5.80696 14.9781 5.82415 15.1569 5.85511 15.334C5.88605 15.5094 5.9342 15.6831 5.99438 15.8516C6.05628 16.0201 6.13194 16.1817 6.22135 16.3364V16.333ZM5.35818 9.1629C5.15529 9.51539 5.02461 9.90398 4.97131 10.3063C4.918 10.7087 4.94552 11.1162 5.0504 11.51C5.15529 11.902 5.33583 12.2682 5.58343 12.5915C5.83103 12.913 6.13881 13.183 6.48958 13.3859L9.80984 15.3048C9.81328 15.3059 9.81729 15.3071 9.82188 15.3082H9.83391C9.8385 15.3082 9.84251 15.3071 9.84595 15.3048C9.84939 15.3036 9.85283 15.3019 9.85627 15.2996L11.249 14.4949L7.23926 12.1805C7.19971 12.1565 7.16189 12.1272 7.1275 12.0946C7.09418 12.0611 7.06529 12.0236 7.04153 11.9828C7.01917 11.9415 7.00026 11.8985 6.98822 11.8521C6.97619 11.8074 6.96931 11.761 6.97103 11.7128V7.80797C6.80252 7.86987 6.63917 7.94553 6.48442 8.03494C6.32967 8.12607 6.18352 8.22924 6.04596 8.34444C5.91013 8.45965 5.78289 8.58688 5.66769 8.72444C5.55248 8.86028 5.45103 9.00815 5.36162 9.1629H5.35818ZM16.7633 11.8177C16.8046 11.8418 16.8424 11.8693 16.8768 11.9037C16.9094 11.9364 16.9387 11.9742 16.9628 12.0155C16.9851 12.0567 17.004 12.1014 17.0161 12.1461C17.0264 12.1926 17.0332 12.239 17.0315 12.2871V16.192C17.5835 15.9891 18.0649 15.6332 18.4208 15.1655C18.7785 14.6978 18.9934 14.139 19.0433 13.5544C19.0931 12.9698 18.9762 12.3817 18.7046 11.8607C18.4329 11.3397 18.0185 10.9064 17.5095 10.6141L14.1893 8.69521C14.1858 8.69406 14.1818 8.69292 14.1772 8.69177H14.1652C14.1618 8.69292 14.1578 8.69406 14.1532 8.69521C14.1497 8.69636 14.1463 8.69808 14.1429 8.70037L12.757 9.50163L16.7667 11.8177H16.7633ZM18.1475 9.7372H18.1457V9.73892L18.1475 9.7372ZM18.1457 9.73548C18.2455 9.15774 18.1784 8.56281 17.9514 8.02119C17.7262 7.47956 17.3496 7.01359 16.8682 6.67658C16.3867 6.34128 15.8193 6.1487 15.233 6.12291C14.6449 6.09884 14.0638 6.24155 13.5548 6.53386L10.2345 8.45105C10.2311 8.45334 10.2282 8.45621 10.2259 8.45965L10.2191 8.46996C10.2179 8.4734 10.2168 8.47741 10.2156 8.482C10.2145 8.48544 10.2139 8.48945 10.2139 8.49403V10.0966L14.2237 7.78046C14.2649 7.75639 14.3096 7.7392 14.3543 7.72544C14.4008 7.7134 14.4472 7.70825 14.4936 7.70825C14.5418 7.70825 14.5882 7.7134 14.6346 7.72544C14.6793 7.7392 14.7223 7.75639 14.7636 7.78046L18.0494 9.67874C18.0787 9.69593 18.1217 9.72 18.1457 9.73548ZM9.45735 7.96101C9.45735 7.91458 9.46423 7.86816 9.47627 7.82173C9.4883 7.77702 9.5055 7.73232 9.52957 7.69105C9.55364 7.6515 9.58115 7.61368 9.61554 7.57929C9.64821 7.54662 9.68604 7.51739 9.72731 7.49503L13.0132 5.59848C13.0441 5.57957 13.0871 5.55549 13.1112 5.54346C12.6607 5.1669 12.1105 4.92618 11.5276 4.85224C10.9447 4.77658 10.3532 4.86943 9.82188 5.11875C9.28885 5.36807 8.83835 5.76527 8.52369 6.26047C8.20903 6.75739 8.04224 7.33169 8.04224 7.91974V11.7541C8.04339 11.7587 8.04454 11.7627 8.04568 11.7661C8.04683 11.7696 8.04855 11.773 8.05084 11.7765C8.05313 11.7799 8.056 11.7833 8.05944 11.7868C8.06173 11.7891 8.06517 11.7914 8.06976 11.7937L9.45735 12.5949V7.96101ZM10.2105 13.0282L11.997 14.0599L13.7835 13.0282V10.9666L11.9987 9.93493L10.2122 10.9666L10.2105 13.0282Z" fill="white"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/openai-text.svg b/app/components/base/icons/assets/public/llm/openai-text.svg
new file mode 100644
index 0000000..be38813
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/openai-text.svg
@@ -0,0 +1,8 @@
+<svg width="52" height="20" viewBox="0 0 52 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0.00390625 8.70054C0.00390625 12.058 2.16008 14.399 5.14793 14.399C8.13577 14.399 10.2919 12.058 10.2919 8.70054C10.2919 5.34307 8.13577 3.00208 5.14793 3.00208C2.16008 3.00208 0.00390625 5.34307 0.00390625 8.70054ZM8.32058 8.70054C8.32058 11.1031 7.01148 12.6587 5.14793 12.6587C3.28437 12.6587 1.97527 11.1031 1.97527 8.70054C1.97527 6.29794 3.28437 4.74242 5.14793 4.74242C7.01148 4.74242 8.32058 6.29794 8.32058 8.70054Z" fill="black" fill-opacity="0.92"/>
+<path d="M15.8456 14.3975C18.1096 14.3975 19.4033 12.4877 19.4033 10.1929C19.4033 7.89816 18.1096 5.9884 15.8456 5.9884C14.7983 5.9884 14.0283 6.40424 13.52 7.00489V6.14242H11.6719V17.0003H13.52V13.381C14.0283 13.9817 14.7983 14.3975 15.8456 14.3975ZM13.4738 9.96193C13.4738 8.4372 14.3363 7.60554 15.476 7.60554C16.8159 7.60554 17.5398 8.65282 17.5398 10.1929C17.5398 11.7331 16.8159 12.7804 15.476 12.7804C14.3363 12.7804 13.4738 11.9333 13.4738 10.4394V9.96193Z" fill="black" fill-opacity="0.92"/>
+<path d="M24.4039 14.3975C26.021 14.3975 27.2993 13.5504 27.8692 12.1335L26.2828 11.5329C26.0364 12.3645 25.3126 12.8266 24.4039 12.8266C23.218 12.8266 22.3863 11.9795 22.2477 10.5934H27.9154V9.97733C27.9154 7.75955 26.6679 5.9884 24.3269 5.9884C21.9859 5.9884 20.4766 7.82115 20.4766 10.1929C20.4766 12.6879 22.0937 14.3975 24.4039 14.3975ZM24.3115 7.54393C25.482 7.54393 26.0364 8.31399 26.0518 9.20727H22.3401C22.6173 8.11378 23.3566 7.54393 24.3115 7.54393Z" fill="black" fill-opacity="0.92"/>
+<path d="M29.3008 14.2281H31.1489V9.48449C31.1489 8.32939 31.996 7.71334 32.8277 7.71334C33.8442 7.71334 34.2446 8.4372 34.2446 9.43828V14.2281H36.0927V8.89924C36.0927 7.1589 35.0763 5.9884 33.3821 5.9884C32.3348 5.9884 31.611 6.46584 31.1489 7.00489V6.14242H29.3008V14.2281Z" fill="black" fill-opacity="0.92"/>
+<path d="M41.5095 3.172L37.3203 14.2301H39.2763L40.2157 11.7043H44.9901L45.945 14.2301H47.9318L43.7426 3.172H41.5095ZM42.5875 5.35898L44.3433 9.97935H40.8626L42.5875 5.35898Z" fill="black" fill-opacity="0.92"/>
+<path d="M51.1042 3.20325H49.1328V14.2613H51.1042V3.20325Z" fill="black" fill-opacity="0.92"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/openai-transparent.svg b/app/components/base/icons/assets/public/llm/openai-transparent.svg
new file mode 100644
index 0000000..fe041ba
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/openai-transparent.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M21.276 10.0045C21.7751 8.50639 21.6033 6.86529 20.8051 5.50264C19.6048 3.41259 17.1917 2.33732 14.835 2.84333C13.7866 1.66218 12.2803 0.990477 10.7011 1.0001C8.29218 0.994602 6.15478 2.54563 5.41367 4.83781C3.86614 5.15475 2.53036 6.12346 1.74869 7.49643C0.539398 9.58097 0.81508 12.2087 2.43067 13.9962C1.93156 15.4943 2.10343 17.1354 2.9016 18.498C4.10195 20.5881 6.51502 21.6634 8.87173 21.1573C9.91945 22.3385 11.4264 23.0102 13.0056 22.9999C15.4159 23.0061 17.554 21.4537 18.2951 19.1594C19.8426 18.8425 21.1784 17.8738 21.9601 16.5008C23.168 14.4163 22.8916 11.7906 21.2767 10.0031L21.276 10.0045ZM13.007 21.5623C12.0424 21.5637 11.1081 21.2261 10.3677 20.608C10.4014 20.5901 10.4598 20.5578 10.4976 20.5345L14.8783 18.0044C15.1024 17.8772 15.2399 17.6386 15.2385 17.3808V11.2049L17.0899 12.274C17.1099 12.2836 17.1229 12.3028 17.1257 12.3248V17.4393C17.1229 19.7136 15.2812 21.5575 13.007 21.5623ZM4.14939 17.7789C3.66608 16.9443 3.49215 15.9659 3.65783 15.0165C3.69015 15.0357 3.74721 15.0708 3.78777 15.0942L8.16843 17.6242C8.39049 17.7541 8.66548 17.7541 8.88823 17.6242L14.2362 14.5359V16.6741C14.2376 16.6961 14.2272 16.7174 14.2101 16.7311L9.78196 19.288C7.80956 20.4238 5.29061 19.7486 4.15007 17.7789H4.14939ZM2.99647 8.21626C3.47771 7.38024 4.23738 6.74085 5.14212 6.40878C5.14212 6.44659 5.14005 6.51328 5.14005 6.56003V11.6208C5.13868 11.878 5.27618 12.1165 5.49961 12.2437L10.8476 15.3313L8.99616 16.4004C8.9776 16.4128 8.95422 16.4149 8.9336 16.4059L4.50482 13.847C2.53654 12.7071 1.86143 10.1887 2.99578 8.21694L2.99647 8.21626ZM18.2078 11.7563L12.8598 8.66795L14.7112 7.59956C14.7298 7.58718 14.7532 7.58512 14.7738 7.59406L19.2026 10.1509C21.1743 11.2901 21.8501 13.8126 20.7109 15.7844C20.229 16.6191 19.47 17.2584 18.566 17.5912V12.3792C18.568 12.122 18.4312 11.8841 18.2085 11.7563H18.2078ZM20.0502 8.98284C20.0179 8.9629 19.9609 8.92852 19.9203 8.90515L15.5397 6.37509C15.3176 6.24515 15.0426 6.24515 14.8199 6.37509L9.4719 9.46341V7.32524C9.47053 7.30324 9.48084 7.28192 9.49803 7.26817L13.9261 4.71337C15.8985 3.57553 18.4202 4.25273 19.5573 6.2259C20.0379 7.05917 20.2118 8.03475 20.0489 8.98284H20.0502ZM8.46542 12.7937L6.61334 11.7246C6.5934 11.715 6.58034 11.6958 6.57759 11.6738V6.55935C6.57896 4.2823 8.42624 2.43701 10.7032 2.43838C11.6664 2.43838 12.5986 2.77664 13.339 3.39265C13.3053 3.41053 13.2476 3.44284 13.2091 3.46622L8.82841 5.99627C8.60429 6.12346 8.4668 6.36134 8.46817 6.61916L8.46542 12.7924V12.7937ZM9.47121 10.6253L11.8534 9.24959L14.2355 10.6246V13.3754L11.8534 14.7504L9.47121 13.3754V10.6253Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/openai-violet.svg b/app/components/base/icons/assets/public/llm/openai-violet.svg
new file mode 100644
index 0000000..342fb41
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/openai-violet.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="6" fill="#AB68FF"/>
+<path d="M19.7758 11.5959C19.9546 11.9948 20.0681 12.4213 20.1145 12.8563C20.1592 13.2913 20.1369 13.7315 20.044 14.1596C19.9529 14.5878 19.7947 14.9987 19.5746 15.377C19.4302 15.6298 19.2599 15.867 19.0639 16.0854C18.8696 16.3021 18.653 16.4981 18.4174 16.67C18.1801 16.842 17.9274 16.9864 17.6591 17.105C17.3926 17.222 17.1141 17.3114 16.8286 17.3698C16.6945 17.7859 16.4951 18.1797 16.2371 18.5339C15.9809 18.8881 15.6697 19.1993 15.3155 19.4555C14.9613 19.7134 14.5693 19.9129 14.1532 20.047C13.7371 20.1829 13.302 20.2499 12.8636 20.2499C12.573 20.2516 12.2807 20.2207 11.9953 20.1622C11.7116 20.102 11.433 20.0109 11.1665 19.8923C10.9 19.7736 10.6472 19.6258 10.4116 19.4538C10.1778 19.2819 9.96115 19.0841 9.76857 18.8658C9.33871 18.9586 8.89853 18.981 8.46351 18.9363C8.02849 18.8898 7.60207 18.7763 7.20143 18.5975C6.80252 18.4204 6.43284 18.1797 6.10786 17.8857C5.78289 17.5916 5.50606 17.2478 5.28769 16.8695C5.14153 16.6167 5.02117 16.3502 4.93004 16.0734C4.83891 15.7965 4.77873 15.5111 4.74778 15.2205C4.71683 14.9317 4.71855 14.6393 4.7495 14.3488C4.78045 14.0599 4.84407 13.7745 4.9352 13.4976C4.64289 13.1727 4.40217 12.803 4.22335 12.4041C4.04624 12.0034 3.93104 11.5787 3.88634 11.1437C3.83991 10.7087 3.86398 10.2685 3.95511 9.84036C4.04624 9.41222 4.20443 9.00127 4.42452 8.62299C4.56896 8.37023 4.73918 8.13123 4.93348 7.91458C5.12778 7.69793 5.34615 7.50191 5.58171 7.32997C5.81728 7.15802 6.07176 7.01187 6.33827 6.89495C6.6065 6.7763 6.88506 6.68861 7.17048 6.63015C7.3046 6.21232 7.50406 5.82029 7.76026 5.46608C8.01817 5.11188 8.32939 4.80066 8.6836 4.54274C9.03781 4.28654 9.42984 4.08708 9.84595 3.95125C10.2621 3.81713 10.6971 3.74835 11.1355 3.75007C11.4261 3.74835 11.7184 3.77758 12.0039 3.83776C12.2893 3.89794 12.5678 3.98736 12.8344 4.106C13.1009 4.22636 13.3536 4.37251 13.5892 4.54446C13.8248 4.71812 14.0414 4.91414 14.234 5.13251C14.6621 5.04138 15.1023 5.01903 15.5373 5.06373C15.9723 5.10844 16.3971 5.22364 16.7977 5.40074C17.1966 5.57957 17.5663 5.81857 17.8913 6.1126C18.2162 6.4049 18.4931 6.74707 18.7114 7.12707C18.8576 7.37811 18.9779 7.64463 19.0691 7.92318C19.1602 8.20001 19.2221 8.48544 19.2513 8.77602C19.2823 9.06661 19.2823 9.35892 19.2496 9.64951C19.2187 9.94009 19.155 10.2255 19.0639 10.5024C19.3579 10.8273 19.5969 11.1953 19.7758 11.5959ZM14.0466 18.9363C14.4214 18.7815 14.7619 18.5528 15.049 18.2657C15.3362 17.9785 15.5648 17.6381 15.7196 17.2615C15.8743 16.8867 15.9552 16.4843 15.9552 16.0785V12.2442C15.954 12.2407 15.9529 12.2367 15.9517 12.2321C15.9506 12.2287 15.9488 12.2252 15.9466 12.2218C15.9443 12.2184 15.9414 12.2155 15.938 12.2132C15.9345 12.2098 15.9311 12.2075 15.9276 12.2063L14.54 11.4051V16.0373C14.54 16.0837 14.5332 16.1318 14.5211 16.1765C14.5091 16.223 14.4919 16.2659 14.4678 16.3072C14.4438 16.3485 14.4162 16.3863 14.3819 16.419C14.3484 16.4523 14.3109 16.4812 14.2701 16.505L10.9842 18.4015C10.9567 18.4187 10.9103 18.4428 10.8862 18.4565C11.0221 18.5717 11.1699 18.6732 11.3247 18.7626C11.4811 18.852 11.6428 18.9277 11.8113 18.9896C11.9798 19.0497 12.1535 19.0962 12.3288 19.1271C12.5059 19.1581 12.6848 19.1735 12.8636 19.1735C13.2694 19.1735 13.6717 19.0927 14.0466 18.9363ZM6.22135 16.333C6.42596 16.6855 6.69592 16.9916 7.01745 17.2392C7.34071 17.4868 7.70695 17.6673 8.09899 17.7722C8.49102 17.8771 8.90025 17.9046 9.3026 17.8513C9.70495 17.798 10.0918 17.6673 10.4443 17.4644L13.7663 15.5472L13.7749 15.5386C13.7772 15.5363 13.7789 15.5329 13.78 15.5283C13.7823 15.5249 13.7841 15.5214 13.7852 15.518V13.9017L9.77545 16.2212C9.73418 16.2453 9.6912 16.2625 9.64649 16.2763C9.60007 16.2883 9.55364 16.2935 9.5055 16.2935C9.45907 16.2935 9.41265 16.2883 9.36622 16.2763C9.32152 16.2625 9.27681 16.2453 9.23554 16.2212L5.94967 14.323C5.92044 14.3058 5.87746 14.28 5.85339 14.2645C5.82244 14.4416 5.80696 14.6204 5.80696 14.7993C5.80696 14.9781 5.82415 15.1569 5.85511 15.334C5.88605 15.5094 5.9342 15.6831 5.99438 15.8516C6.05628 16.0201 6.13194 16.1817 6.22135 16.3364V16.333ZM5.35818 9.1629C5.15529 9.51539 5.02461 9.90398 4.97131 10.3063C4.918 10.7087 4.94552 11.1162 5.0504 11.51C5.15529 11.902 5.33583 12.2682 5.58343 12.5915C5.83103 12.913 6.13881 13.183 6.48958 13.3859L9.80984 15.3048C9.81328 15.3059 9.81729 15.3071 9.82188 15.3082H9.83391C9.8385 15.3082 9.84251 15.3071 9.84595 15.3048C9.84939 15.3036 9.85283 15.3019 9.85627 15.2996L11.249 14.4949L7.23926 12.1805C7.19971 12.1565 7.16189 12.1272 7.1275 12.0946C7.09418 12.0611 7.06529 12.0236 7.04153 11.9828C7.01917 11.9415 7.00026 11.8985 6.98822 11.8521C6.97619 11.8074 6.96931 11.761 6.97103 11.7128V7.80797C6.80252 7.86987 6.63917 7.94553 6.48442 8.03494C6.32967 8.12607 6.18352 8.22924 6.04596 8.34444C5.91013 8.45965 5.78289 8.58688 5.66769 8.72444C5.55248 8.86028 5.45103 9.00815 5.36162 9.1629H5.35818ZM16.7633 11.8177C16.8046 11.8418 16.8424 11.8693 16.8768 11.9037C16.9094 11.9364 16.9387 11.9742 16.9628 12.0155C16.9851 12.0567 17.004 12.1014 17.0161 12.1461C17.0264 12.1926 17.0332 12.239 17.0315 12.2871V16.192C17.5835 15.9891 18.0649 15.6332 18.4208 15.1655C18.7785 14.6978 18.9934 14.139 19.0433 13.5544C19.0931 12.9698 18.9762 12.3817 18.7046 11.8607C18.4329 11.3397 18.0185 10.9064 17.5095 10.6141L14.1893 8.69521C14.1858 8.69406 14.1818 8.69292 14.1772 8.69177H14.1652C14.1618 8.69292 14.1578 8.69406 14.1532 8.69521C14.1497 8.69636 14.1463 8.69808 14.1429 8.70037L12.757 9.50163L16.7667 11.8177H16.7633ZM18.1475 9.7372H18.1457V9.73892L18.1475 9.7372ZM18.1457 9.73548C18.2455 9.15774 18.1784 8.56281 17.9514 8.02119C17.7262 7.47956 17.3496 7.01359 16.8682 6.67658C16.3867 6.34128 15.8193 6.1487 15.233 6.12291C14.6449 6.09884 14.0638 6.24155 13.5548 6.53386L10.2345 8.45105C10.2311 8.45334 10.2282 8.45621 10.2259 8.45965L10.2191 8.46996C10.2179 8.4734 10.2168 8.47741 10.2156 8.482C10.2145 8.48544 10.2139 8.48945 10.2139 8.49403V10.0966L14.2237 7.78046C14.2649 7.75639 14.3096 7.7392 14.3543 7.72544C14.4008 7.7134 14.4472 7.70825 14.4936 7.70825C14.5418 7.70825 14.5882 7.7134 14.6346 7.72544C14.6793 7.7392 14.7223 7.75639 14.7636 7.78046L18.0494 9.67874C18.0787 9.69593 18.1217 9.72 18.1457 9.73548ZM9.45735 7.96101C9.45735 7.91458 9.46423 7.86816 9.47627 7.82173C9.4883 7.77702 9.5055 7.73232 9.52957 7.69105C9.55364 7.6515 9.58115 7.61368 9.61554 7.57929C9.64821 7.54662 9.68604 7.51739 9.72731 7.49503L13.0132 5.59848C13.0441 5.57957 13.0871 5.55549 13.1112 5.54346C12.6607 5.1669 12.1105 4.92618 11.5276 4.85224C10.9447 4.77658 10.3532 4.86943 9.82188 5.11875C9.28885 5.36807 8.83835 5.76527 8.52369 6.26047C8.20903 6.75739 8.04224 7.33169 8.04224 7.91974V11.7541C8.04339 11.7587 8.04454 11.7627 8.04568 11.7661C8.04683 11.7696 8.04855 11.773 8.05084 11.7765C8.05313 11.7799 8.056 11.7833 8.05944 11.7868C8.06173 11.7891 8.06517 11.7914 8.06976 11.7937L9.45735 12.5949V7.96101ZM10.2105 13.0282L11.997 14.0599L13.7835 13.0282V10.9666L11.9987 9.93493L10.2122 10.9666L10.2105 13.0282Z" fill="white"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/openllm-text.svg b/app/components/base/icons/assets/public/llm/openllm-text.svg
new file mode 100644
index 0000000..59bb579
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/openllm-text.svg
@@ -0,0 +1,19 @@
+<svg width="92" height="25" viewBox="0 0 92 25" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_9850_26886)">
+<path d="M24.9181 1.27026C24.8737 1.12859 24.813 0.994621 24.7379 0.871257C24.6473 0.721871 24.5355 0.586942 24.4073 0.470325C24.3861 0.451049 24.3639 0.431773 24.3417 0.413462C24.1856 0.284315 24.0073 0.181191 23.8136 0.109871C23.6199 0.0385512 23.4107 0 23.1929 0H6.99952C6.96289 0 6.92627 0.00192756 6.88965 0.00385512C6.87905 0.00385512 6.86748 0.00578268 6.85688 0.00674646C6.83086 0.00867402 6.80387 0.0115654 6.77785 0.0144567C6.76628 0.0154205 6.75568 0.017348 6.74508 0.0183118C6.71424 0.0231307 6.6834 0.0279496 6.65256 0.0337323C6.64774 0.0337323 6.64388 0.0356599 6.63906 0.0356599C6.60437 0.0424063 6.56967 0.0510803 6.53594 0.0597543C6.5263 0.0626457 6.51666 0.065537 6.50703 0.0674646C6.48197 0.074211 6.45691 0.0819213 6.43185 0.0905953C6.42125 0.0944504 6.41065 0.0973418 6.40101 0.101197C6.37403 0.110835 6.34704 0.120472 6.32102 0.132038C6.31524 0.134929 6.30849 0.136857 6.30271 0.139748C6.2709 0.153241 6.2391 0.167698 6.20729 0.183118C6.19958 0.186973 6.19187 0.190828 6.18416 0.194684C6.16007 0.207213 6.13694 0.219742 6.11381 0.232271C6.10417 0.23709 6.09549 0.242873 6.08586 0.247691C6.06273 0.261184 6.0396 0.275641 6.01646 0.291062C6.00972 0.294917 6.00297 0.299736 5.99719 0.303591C5.96828 0.322866 5.94033 0.343106 5.91238 0.363345C5.90659 0.3672 5.90177 0.372019 5.89696 0.375874C5.87479 0.393222 5.85262 0.41057 5.83142 0.428882C5.82371 0.435628 5.816 0.442375 5.80829 0.449121C5.78805 0.466469 5.76877 0.484781 5.7495 0.503093C5.74372 0.508876 5.73697 0.514658 5.73119 0.520441C5.72058 0.531043 5.70998 0.541644 5.70035 0.552246C5.70035 0.552246 5.70035 0.551282 5.70131 0.550318L1.45008 4.37942C1.16191 4.66759 1 5.05792 1 5.4656V22.5592C1 23.4073 1.68717 24.0955 2.53626 24.0955H19.6298C20.0375 24.0955 20.4278 23.9335 20.716 23.6454L24.5383 19.2072C24.6077 19.1291 24.6714 19.0453 24.7263 18.9566C24.7282 18.9537 24.7301 18.9498 24.7321 18.9469C24.7427 18.9296 24.7523 18.9123 24.7629 18.8949C24.7668 18.8882 24.7706 18.8814 24.7745 18.8747C24.7831 18.8583 24.7918 18.8429 24.8005 18.8265C24.8053 18.8178 24.8101 18.8091 24.814 18.7995C24.8217 18.7841 24.8284 18.7686 24.8362 18.7532C24.841 18.7426 24.8458 18.733 24.8497 18.7224C24.8564 18.7079 24.8622 18.6925 24.8689 18.6771C24.8737 18.6655 24.8786 18.654 24.8824 18.6424C24.8882 18.6279 24.893 18.6135 24.8988 18.5981C24.9036 18.5855 24.9075 18.573 24.9113 18.5605C24.9162 18.546 24.921 18.5316 24.9248 18.5171C24.9287 18.5036 24.9325 18.4901 24.9364 18.4766C24.9402 18.4631 24.9441 18.4487 24.947 18.4342C24.9508 18.4198 24.9537 18.4053 24.9566 18.3908C24.9595 18.3774 24.9624 18.3639 24.9653 18.3504C24.9682 18.3349 24.9711 18.3195 24.974 18.3041C24.9759 18.2906 24.9788 18.2781 24.9807 18.2646C24.9836 18.2482 24.9855 18.2309 24.9875 18.2145C24.9894 18.2019 24.9904 18.1904 24.9923 18.1779C24.9942 18.1586 24.9952 18.1393 24.9971 18.12C24.9971 18.1094 24.999 18.0998 24.999 18.0892C25.001 18.0593 25.001 18.0294 25.001 17.9996V1.80709C25.001 1.62011 24.972 1.43989 24.92 1.27026H24.9181ZM23.1929 0.541644C23.4107 0.541644 23.616 0.597543 23.7953 0.694885C23.8849 0.744038 23.9678 0.802829 24.043 0.871257C24.0584 0.88475 24.0728 0.899207 24.0873 0.9127C24.1162 0.941613 24.1432 0.97149 24.1692 1.00233C24.1952 1.03317 24.2193 1.06594 24.2425 1.09967C24.3793 1.30207 24.4584 1.54494 24.4584 1.80612V17.9996C24.4584 18.0362 24.4564 18.0718 24.4535 18.1075C24.4535 18.1114 24.4535 18.1162 24.4535 18.12C24.4506 18.1538 24.4458 18.1875 24.44 18.2203C24.44 18.2251 24.4381 18.2299 24.4372 18.2357C24.4304 18.2684 24.4237 18.3012 24.415 18.333C24.414 18.3369 24.4131 18.3407 24.4121 18.3446C24.4025 18.3783 24.3919 18.4111 24.3803 18.4429C24.3803 18.4439 24.3803 18.4448 24.3793 18.4458C24.3408 18.5489 24.2887 18.6443 24.2251 18.733V18.7349C24.203 18.7638 24.1808 18.7927 24.1577 18.8197C24.1432 18.8361 24.1287 18.8525 24.1133 18.8689C24.1133 18.8689 24.1133 18.8689 24.1124 18.8698C24.0979 18.8853 24.0825 18.9007 24.0671 18.9151C24.0671 18.9151 24.0661 18.9161 24.0651 18.9171C24.0497 18.9315 24.0333 18.946 24.0169 18.9604C24.0169 18.9604 24.0169 18.9604 24.016 18.9614C23.9312 19.0337 23.8377 19.0944 23.7355 19.1426C23.7336 19.1436 23.7317 19.1445 23.7288 19.1455C23.7114 19.1532 23.6941 19.1609 23.6758 19.1686C23.6709 19.1705 23.6661 19.1725 23.6613 19.1744C23.6459 19.1802 23.6305 19.186 23.615 19.1917C23.6083 19.1937 23.6025 19.1956 23.5958 19.1985C23.5813 19.2033 23.5669 19.2081 23.5524 19.212C23.5447 19.2139 23.5379 19.2158 23.5302 19.2178C23.5167 19.2216 23.5023 19.2255 23.4888 19.2284C23.4811 19.2303 23.4734 19.2322 23.4657 19.2342C23.4522 19.237 23.4377 19.2399 23.4242 19.2428C23.4165 19.2448 23.4078 19.2457 23.4001 19.2476C23.3857 19.2496 23.3712 19.2515 23.3568 19.2534C23.349 19.2544 23.3413 19.2554 23.3327 19.2563C23.3172 19.2582 23.3009 19.2592 23.2845 19.2602C23.2777 19.2602 23.271 19.2611 23.2642 19.2621C23.2411 19.2631 23.2189 19.264 23.1958 19.264H6.99952C6.65063 19.264 6.33451 19.1224 6.10513 18.893C6.04827 18.8361 5.99622 18.7735 5.95093 18.706C5.8372 18.5373 5.76299 18.3407 5.74082 18.1287C5.73697 18.0863 5.73408 18.0429 5.73408 17.9996V1.80709C5.73408 1.78299 5.73408 1.75986 5.736 1.73673C5.736 1.72902 5.73697 1.72227 5.73793 1.71456C5.7389 1.69818 5.74082 1.68276 5.74179 1.66638C5.74179 1.6577 5.74372 1.64999 5.74468 1.64132C5.74661 1.62686 5.74853 1.61144 5.75143 1.59698C5.75239 1.58831 5.75432 1.5806 5.75624 1.57192C5.75914 1.55747 5.76203 1.54205 5.76588 1.52759C5.76781 1.51988 5.76974 1.51217 5.7707 1.50446C5.77456 1.48808 5.77938 1.47169 5.78419 1.45531C5.78612 1.44952 5.78709 1.44374 5.78901 1.43892C5.80251 1.39459 5.81889 1.35122 5.83624 1.30881C5.83624 1.30881 5.83624 1.30689 5.8372 1.30689C5.84588 1.28665 5.85551 1.26641 5.86515 1.24713C5.86708 1.24424 5.86804 1.24038 5.86997 1.23749C5.87864 1.22015 5.88828 1.2028 5.89792 1.18641C5.89985 1.18256 5.90177 1.17967 5.9037 1.17678C5.91334 1.15943 5.92394 1.14304 5.93454 1.12666C5.93647 1.12377 5.93743 1.12184 5.93936 1.11895C5.95189 1.10064 5.96442 1.08232 5.97695 1.06401C6.04634 0.969563 6.12826 0.883786 6.22079 0.811503C6.30078 0.748857 6.38752 0.695849 6.48101 0.654406C6.48293 0.654406 6.48486 0.652479 6.48679 0.651515C6.51666 0.638022 6.54751 0.626457 6.57835 0.614892C6.58027 0.614892 6.58317 0.612964 6.58509 0.612964C6.64678 0.591761 6.71038 0.575377 6.77496 0.562847C6.77978 0.562847 6.7846 0.56092 6.79038 0.559956C6.82122 0.555137 6.85206 0.551282 6.88386 0.548391C6.88965 0.548391 6.89543 0.548391 6.90025 0.547427C6.93302 0.544536 6.96579 0.543572 6.99855 0.543572H23.192L23.1929 0.541644Z" fill="black"/>
+<path d="M17.2794 11.0016C17.8867 11.0016 18.379 10.5093 18.379 9.90192C18.379 9.29459 17.8867 8.80225 17.2794 8.80225C16.672 8.80225 16.1797 9.29459 16.1797 9.90192C16.1797 10.5093 16.672 11.0016 17.2794 11.0016Z" fill="black"/>
+<path d="M12.9219 11.0016C13.5293 11.0016 14.0216 10.5093 14.0216 9.90192C14.0216 9.29459 13.5293 8.80225 12.9219 8.80225C12.3146 8.80225 11.8223 9.29459 11.8223 9.90192C11.8223 10.5093 12.3146 11.0016 12.9219 11.0016Z" fill="black"/>
+</g>
+<path d="M36.4876 17.098C35.5822 17.098 34.7469 16.888 33.9816 16.468C33.2256 16.0387 32.6236 15.446 32.1756 14.69C31.7369 13.9247 31.5176 13.066 31.5176 12.114C31.5176 11.162 31.7369 10.308 32.1756 9.55204C32.6236 8.79604 33.2256 8.20804 33.9816 7.78804C34.7469 7.35871 35.5822 7.14404 36.4876 7.14404C37.4022 7.14404 38.2376 7.35871 38.9936 7.78804C39.7589 8.20804 40.3609 8.79604 40.7996 9.55204C41.2382 10.308 41.4576 11.162 41.4576 12.114C41.4576 13.066 41.2382 13.9247 40.7996 14.69C40.3609 15.446 39.7589 16.0387 38.9936 16.468C38.2376 16.888 37.4022 17.098 36.4876 17.098ZM36.4876 15.712C37.1316 15.712 37.7056 15.5674 38.2096 15.278C38.7136 14.9794 39.1056 14.5594 39.3856 14.018C39.6749 13.4674 39.8196 12.8327 39.8196 12.114C39.8196 11.3954 39.6749 10.7654 39.3856 10.224C39.1056 9.68271 38.7136 9.26738 38.2096 8.97804C37.7056 8.68871 37.1316 8.54404 36.4876 8.54404C35.8436 8.54404 35.2696 8.68871 34.7656 8.97804C34.2616 9.26738 33.8649 9.68271 33.5756 10.224C33.2956 10.7654 33.1556 11.3954 33.1556 12.114C33.1556 12.8327 33.2956 13.4674 33.5756 14.018C33.8649 14.5594 34.2616 14.9794 34.7656 15.278C35.2696 15.5674 35.8436 15.712 36.4876 15.712Z" fill="#1D2939"/>
+<path d="M44.3441 10.42C44.6148 10.0654 44.9834 9.76671 45.4501 9.52404C45.9168 9.28138 46.4441 9.16004 47.0321 9.16004C47.7041 9.16004 48.3154 9.32804 48.8661 9.66404C49.4261 9.99071 49.8648 10.4527 50.1821 11.05C50.4994 11.6474 50.6581 12.3334 50.6581 13.108C50.6581 13.8827 50.4994 14.578 50.1821 15.194C49.8648 15.8007 49.4261 16.2767 48.8661 16.622C48.3154 16.958 47.7041 17.126 47.0321 17.126C46.4441 17.126 45.9214 17.0094 45.4641 16.776C45.0068 16.5334 44.6334 16.2347 44.3441 15.88V20.668H42.7481V9.28604H44.3441V10.42ZM49.0341 13.108C49.0341 12.576 48.9221 12.1187 48.6981 11.736C48.4834 11.344 48.1941 11.05 47.8301 10.854C47.4754 10.6487 47.0928 10.546 46.6821 10.546C46.2808 10.546 45.8981 10.6487 45.5341 10.854C45.1794 11.0594 44.8901 11.358 44.6661 11.75C44.4514 12.142 44.3441 12.604 44.3441 13.136C44.3441 13.668 44.4514 14.1347 44.6661 14.536C44.8901 14.928 45.1794 15.2267 45.5341 15.432C45.8981 15.6374 46.2808 15.74 46.6821 15.74C47.0928 15.74 47.4754 15.6374 47.8301 15.432C48.1941 15.2174 48.4834 14.9094 48.6981 14.508C48.9221 14.1067 49.0341 13.64 49.0341 13.108Z" fill="#1D2939"/>
+<path d="M59.0264 12.954C59.0264 13.2434 59.0077 13.5047 58.9704 13.738H53.0764C53.123 14.354 53.3517 14.8487 53.7624 15.222C54.173 15.5954 54.677 15.782 55.2744 15.782C56.133 15.782 56.7397 15.4227 57.0944 14.704H58.8164C58.583 15.4134 58.1584 15.9967 57.5424 16.454C56.9357 16.902 56.1797 17.126 55.2744 17.126C54.537 17.126 53.8744 16.9627 53.2864 16.636C52.7077 16.3 52.2504 15.8334 51.9144 15.236C51.5877 14.6294 51.4244 13.9294 51.4244 13.136C51.4244 12.3427 51.583 11.6474 51.9004 11.05C52.227 10.4434 52.6797 9.97671 53.2584 9.65004C53.8464 9.32338 54.5184 9.16004 55.2744 9.16004C56.0024 9.16004 56.651 9.31871 57.2204 9.63604C57.7897 9.95338 58.233 10.4014 58.5504 10.98C58.8677 11.5494 59.0264 12.2074 59.0264 12.954ZM57.3604 12.45C57.351 11.862 57.141 11.3907 56.7304 11.036C56.3197 10.6814 55.811 10.504 55.2044 10.504C54.6537 10.504 54.1824 10.6814 53.7904 11.036C53.3984 11.3814 53.165 11.8527 53.0904 12.45H57.3604Z" fill="#1D2939"/>
+<path d="M64.209 9.16004C64.8157 9.16004 65.357 9.28604 65.833 9.53804C66.3183 9.79004 66.6963 10.1634 66.967 10.658C67.2377 11.1527 67.373 11.75 67.373 12.45V17H65.791V12.688C65.791 11.9974 65.6183 11.47 65.273 11.106C64.9277 10.7327 64.4563 10.546 63.859 10.546C63.2617 10.546 62.7857 10.7327 62.431 11.106C62.0857 11.47 61.913 11.9974 61.913 12.688V17H60.317V9.28604H61.913V10.168C62.1743 9.85071 62.5057 9.60338 62.907 9.42604C63.3177 9.24871 63.7517 9.16004 64.209 9.16004Z" fill="#1D2939"/>
+<path d="M70.7248 15.712H74.0148V17H69.1288V7.27004H70.7248V15.712Z" fill="#1D2939"/>
+<path d="M76.6655 15.712H79.9555V17H75.0695V7.27004H76.6655V15.712Z" fill="#1D2939"/>
+<path d="M91.2582 7.27004V17H89.6622V10.336L86.6942 17H85.5882L82.6062 10.336V17H81.0102V7.27004H82.7322L86.1482 14.9L89.5502 7.27004H91.2582Z" fill="#1D2939"/>
+<defs>
+<clipPath id="clip0_9850_26886">
+<rect width="24" height="24.0945" fill="white" transform="translate(1)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/openllm.svg b/app/components/base/icons/assets/public/llm/openllm.svg
new file mode 100644
index 0000000..d25d627
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/openllm.svg
@@ -0,0 +1,12 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Camada_2" clip-path="url(#clip0_9866_5923)">
+<path id="Vector" d="M23.9181 1.27026C23.8737 1.12859 23.813 0.994621 23.7379 0.871257C23.6473 0.721871 23.5355 0.586942 23.4073 0.470325C23.3861 0.451049 23.3639 0.431773 23.3417 0.413462C23.1856 0.284315 23.0073 0.181191 22.8136 0.109871C22.6199 0.0385512 22.4107 0 22.1929 0H5.99952C5.96289 0 5.92627 0.00192756 5.88965 0.00385512C5.87905 0.00385512 5.86748 0.00578268 5.85688 0.00674646C5.83086 0.00867402 5.80387 0.0115654 5.77785 0.0144567C5.76628 0.0154205 5.75568 0.017348 5.74508 0.0183118C5.71424 0.0231307 5.6834 0.0279496 5.65256 0.0337323C5.64774 0.0337323 5.64388 0.0356599 5.63906 0.0356599C5.60437 0.0424063 5.56967 0.0510803 5.53594 0.0597543C5.5263 0.0626457 5.51666 0.065537 5.50703 0.0674646C5.48197 0.074211 5.45691 0.0819213 5.43185 0.0905953C5.42125 0.0944504 5.41065 0.0973418 5.40101 0.101197C5.37403 0.110835 5.34704 0.120472 5.32102 0.132038C5.31524 0.134929 5.30849 0.136857 5.30271 0.139748C5.2709 0.153241 5.2391 0.167698 5.20729 0.183118C5.19958 0.186973 5.19187 0.190828 5.18416 0.194684C5.16007 0.207213 5.13694 0.219742 5.11381 0.232271C5.10417 0.23709 5.09549 0.242873 5.08586 0.247691C5.06273 0.261184 5.0396 0.275641 5.01646 0.291062C5.00972 0.294917 5.00297 0.299736 4.99719 0.303591C4.96828 0.322866 4.94033 0.343106 4.91238 0.363345C4.90659 0.3672 4.90177 0.372019 4.89696 0.375874C4.87479 0.393222 4.85262 0.41057 4.83142 0.428882C4.82371 0.435628 4.816 0.442375 4.80829 0.449121C4.78805 0.466469 4.76877 0.484781 4.7495 0.503093C4.74372 0.508876 4.73697 0.514658 4.73119 0.520441C4.72058 0.531043 4.70998 0.541644 4.70035 0.552246C4.70035 0.552246 4.70035 0.551282 4.70131 0.550318L0.450084 4.37942C0.161915 4.66759 0 5.05792 0 5.4656V22.5592C0 23.4073 0.687174 24.0955 1.53626 24.0955H18.6298C19.0375 24.0955 19.4278 23.9335 19.716 23.6454L23.5383 19.2072C23.6077 19.1291 23.6714 19.0453 23.7263 18.9566C23.7282 18.9537 23.7301 18.9498 23.7321 18.9469C23.7427 18.9296 23.7523 18.9123 23.7629 18.8949C23.7668 18.8882 23.7706 18.8814 23.7745 18.8747C23.7831 18.8583 23.7918 18.8429 23.8005 18.8265C23.8053 18.8178 23.8101 18.8091 23.814 18.7995C23.8217 18.7841 23.8284 18.7686 23.8362 18.7532C23.841 18.7426 23.8458 18.733 23.8497 18.7224C23.8564 18.7079 23.8622 18.6925 23.8689 18.6771C23.8737 18.6655 23.8786 18.654 23.8824 18.6424C23.8882 18.6279 23.893 18.6135 23.8988 18.5981C23.9036 18.5855 23.9075 18.573 23.9113 18.5605C23.9162 18.546 23.921 18.5316 23.9248 18.5171C23.9287 18.5036 23.9325 18.4901 23.9364 18.4766C23.9402 18.4631 23.9441 18.4487 23.947 18.4342C23.9508 18.4198 23.9537 18.4053 23.9566 18.3908C23.9595 18.3774 23.9624 18.3639 23.9653 18.3504C23.9682 18.3349 23.9711 18.3195 23.974 18.3041C23.9759 18.2906 23.9788 18.2781 23.9807 18.2646C23.9836 18.2482 23.9855 18.2309 23.9875 18.2145C23.9894 18.2019 23.9904 18.1904 23.9923 18.1779C23.9942 18.1586 23.9952 18.1393 23.9971 18.12C23.9971 18.1094 23.999 18.0998 23.999 18.0892C24.001 18.0593 24.001 18.0294 24.001 17.9996V1.80709C24.001 1.62011 23.972 1.43989 23.92 1.27026H23.9181ZM22.1929 0.541644C22.4107 0.541644 22.616 0.597543 22.7953 0.694885C22.8849 0.744038 22.9678 0.802829 23.043 0.871257C23.0584 0.88475 23.0728 0.899207 23.0873 0.9127C23.1162 0.941613 23.1432 0.97149 23.1692 1.00233C23.1952 1.03317 23.2193 1.06594 23.2425 1.09967C23.3793 1.30207 23.4584 1.54494 23.4584 1.80612V17.9996C23.4584 18.0362 23.4564 18.0718 23.4535 18.1075C23.4535 18.1114 23.4535 18.1162 23.4535 18.12C23.4506 18.1538 23.4458 18.1875 23.44 18.2203C23.44 18.2251 23.4381 18.2299 23.4372 18.2357C23.4304 18.2684 23.4237 18.3012 23.415 18.333C23.414 18.3369 23.4131 18.3407 23.4121 18.3446C23.4025 18.3783 23.3919 18.4111 23.3803 18.4429C23.3803 18.4439 23.3803 18.4448 23.3793 18.4458C23.3408 18.5489 23.2887 18.6443 23.2251 18.733V18.7349C23.203 18.7638 23.1808 18.7927 23.1577 18.8197C23.1432 18.8361 23.1287 18.8525 23.1133 18.8689C23.1133 18.8689 23.1133 18.8689 23.1124 18.8698C23.0979 18.8853 23.0825 18.9007 23.0671 18.9151C23.0671 18.9151 23.0661 18.9161 23.0651 18.9171C23.0497 18.9315 23.0333 18.946 23.0169 18.9604C23.0169 18.9604 23.0169 18.9604 23.016 18.9614C22.9312 19.0337 22.8377 19.0944 22.7355 19.1426C22.7336 19.1436 22.7317 19.1445 22.7288 19.1455C22.7114 19.1532 22.6941 19.1609 22.6758 19.1686C22.6709 19.1705 22.6661 19.1725 22.6613 19.1744C22.6459 19.1802 22.6305 19.186 22.615 19.1917C22.6083 19.1937 22.6025 19.1956 22.5958 19.1985C22.5813 19.2033 22.5669 19.2081 22.5524 19.212C22.5447 19.2139 22.5379 19.2158 22.5302 19.2178C22.5167 19.2216 22.5023 19.2255 22.4888 19.2284C22.4811 19.2303 22.4734 19.2322 22.4657 19.2342C22.4522 19.237 22.4377 19.2399 22.4242 19.2428C22.4165 19.2448 22.4078 19.2457 22.4001 19.2476C22.3857 19.2496 22.3712 19.2515 22.3568 19.2534C22.349 19.2544 22.3413 19.2554 22.3327 19.2563C22.3172 19.2582 22.3009 19.2592 22.2845 19.2602C22.2777 19.2602 22.271 19.2611 22.2642 19.2621C22.2411 19.2631 22.2189 19.264 22.1958 19.264H5.99952C5.65063 19.264 5.33451 19.1224 5.10513 18.893C5.04827 18.8361 4.99622 18.7735 4.95093 18.706C4.8372 18.5373 4.76299 18.3407 4.74082 18.1287C4.73697 18.0863 4.73408 18.0429 4.73408 17.9996V1.80709C4.73408 1.78299 4.73408 1.75986 4.736 1.73673C4.736 1.72902 4.73697 1.72227 4.73793 1.71456C4.7389 1.69818 4.74082 1.68276 4.74179 1.66638C4.74179 1.6577 4.74372 1.64999 4.74468 1.64132C4.74661 1.62686 4.74853 1.61144 4.75143 1.59698C4.75239 1.58831 4.75432 1.5806 4.75624 1.57192C4.75914 1.55747 4.76203 1.54205 4.76588 1.52759C4.76781 1.51988 4.76974 1.51217 4.7707 1.50446C4.77456 1.48808 4.77938 1.47169 4.78419 1.45531C4.78612 1.44952 4.78709 1.44374 4.78901 1.43892C4.80251 1.39459 4.81889 1.35122 4.83624 1.30881C4.83624 1.30881 4.83624 1.30689 4.8372 1.30689C4.84588 1.28665 4.85551 1.26641 4.86515 1.24713C4.86708 1.24424 4.86804 1.24038 4.86997 1.23749C4.87864 1.22015 4.88828 1.2028 4.89792 1.18641C4.89985 1.18256 4.90177 1.17967 4.9037 1.17678C4.91334 1.15943 4.92394 1.14304 4.93454 1.12666C4.93647 1.12377 4.93743 1.12184 4.93936 1.11895C4.95189 1.10064 4.96442 1.08232 4.97695 1.06401C5.04634 0.969563 5.12826 0.883786 5.22079 0.811503C5.30078 0.748857 5.38752 0.695849 5.48101 0.654406C5.48293 0.654406 5.48486 0.652479 5.48679 0.651515C5.51666 0.638022 5.54751 0.626457 5.57835 0.614892C5.58027 0.614892 5.58317 0.612964 5.58509 0.612964C5.64678 0.591761 5.71038 0.575377 5.77496 0.562847C5.77978 0.562847 5.7846 0.56092 5.79038 0.559956C5.82122 0.555137 5.85206 0.551282 5.88386 0.548391C5.88965 0.548391 5.89543 0.548391 5.90025 0.547427C5.93302 0.544536 5.96579 0.543572 5.99855 0.543572H22.192L22.1929 0.541644Z" fill="black"/>
+<path id="Vector_2" d="M16.2794 11.0016C16.8867 11.0016 17.379 10.5093 17.379 9.90192C17.379 9.29459 16.8867 8.80225 16.2794 8.80225C15.672 8.80225 15.1797 9.29459 15.1797 9.90192C15.1797 10.5093 15.672 11.0016 16.2794 11.0016Z" fill="black"/>
+<path id="Vector_3" d="M11.9219 11.0016C12.5293 11.0016 13.0216 10.5093 13.0216 9.90192C13.0216 9.29459 12.5293 8.80225 11.9219 8.80225C11.3146 8.80225 10.8223 9.29459 10.8223 9.90192C10.8223 10.5093 11.3146 11.0016 11.9219 11.0016Z" fill="black"/>
+</g>
+<defs>
+<clipPath id="clip0_9866_5923">
+<rect width="24" height="24.0945" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/replicate-text.svg b/app/components/base/icons/assets/public/llm/replicate-text.svg
new file mode 100644
index 0000000..63c0947
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/replicate-text.svg
@@ -0,0 +1,13 @@
+<svg width="92" height="24" viewBox="0 0 92 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M18.4933 2V3.79H6.005V17.9017H4V2H18.4933Z" fill="black"/>
+<path d="M18.4974 5.39453V7.18453H9.79573V17.9012H7.78906V5.39453H18.4974Z" fill="black"/>
+<path d="M18.4936 8.77734V10.5773H13.577V17.9007H11.5703V8.77734H18.4936Z" fill="black"/>
+<path d="M24.2014 8.60156C26.588 8.60156 28.593 10.1849 28.593 13.1282C28.593 13.3232 28.593 13.4882 28.573 13.7866H21.403C21.4964 15.2782 22.6997 16.2649 24.2114 16.2649C25.4864 16.2649 26.3414 15.6782 26.813 14.8766L28.3464 15.9666C27.523 17.2632 26.1047 18.0849 24.1914 18.0849C21.4247 18.0849 19.4297 16.1199 19.4297 13.3432C19.4397 10.6582 21.4347 8.60156 24.203 8.60156M21.508 12.3149H26.5797C26.363 10.9982 25.3047 10.2882 24.1314 10.2882C22.958 10.2882 21.7764 10.9666 21.508 12.3149Z" fill="black"/>
+<path d="M30.6328 8.77656H32.6378V9.9999C33.1528 9.2699 34.2628 8.60156 35.5695 8.60156C38.0695 8.60156 39.9611 10.7316 39.9611 13.3432C39.9611 15.9549 38.0678 18.0849 35.5695 18.0849C34.2528 18.0849 33.1411 17.4066 32.6378 16.6749V21.7049H30.6328V8.77656ZM35.2095 10.4216C33.5845 10.4216 32.4728 11.6966 32.4728 13.3432C32.4728 14.9899 33.5845 16.2649 35.2095 16.2649C36.8345 16.2649 37.9245 14.9899 37.9245 13.3432C37.9245 11.6966 36.8128 10.4216 35.2095 10.4216Z" fill="black"/>
+<path d="M44.0128 4.2207H42.0078V17.8907H44.0128V4.2207Z" fill="black"/>
+<path d="M47.7139 6.79443C46.9839 6.79443 46.3672 6.19776 46.3672 5.44776C46.3672 4.69776 46.9839 4.12109 47.7139 4.12109C48.4439 4.12109 49.0405 4.72776 49.0405 5.44776C49.0405 6.19943 48.4639 6.79443 47.7139 6.79443ZM46.7155 8.77943H48.7205V17.8928H46.7155V8.77943Z" fill="black"/>
+<path d="M55.5711 18.0771C52.8345 18.0771 50.7578 16.0304 50.7578 13.3354C50.7578 10.6404 52.8361 8.59375 55.5711 8.59375C57.4528 8.59375 59.0378 9.60208 59.8195 11.1137L58.0711 12.0604C57.6295 11.1354 56.7445 10.4554 55.5711 10.4554C53.9461 10.4554 52.8045 11.7104 52.8045 13.3354C52.8045 14.9604 53.9561 16.2154 55.5711 16.2154C56.7328 16.2154 57.6278 15.5371 58.0711 14.6104L59.8195 15.5571C59.0378 17.0787 57.4428 18.0771 55.5711 18.0771Z" fill="black"/>
+<path d="M65.3995 8.60156C66.7161 8.60156 67.8061 9.2799 68.3211 9.9999V8.77656H70.3261V17.8899H68.3211V16.6666C67.8061 17.3966 66.7161 18.0766 65.3995 18.0766C62.8995 18.0766 61.0078 15.9466 61.0078 13.3349C61.0078 10.7232 62.9011 8.60323 65.3995 8.60323M65.7695 10.4232C64.1445 10.4232 63.0545 11.6982 63.0545 13.3449C63.0545 14.9916 64.1445 16.2666 65.7695 16.2666C67.3945 16.2666 68.4845 14.9916 68.4845 13.3449C68.4845 11.6982 67.3845 10.4232 65.7695 10.4232Z" fill="black"/>
+<path d="M73.7627 17.9033V10.57H71.8594V8.78H73.7627V6.25H75.7694V8.78H79.2244V10.57H75.7694V16.1033H79.2244V17.9033H73.7627Z" fill="black"/>
+<path d="M84.9435 8.60156C87.3302 8.60156 89.3352 10.1849 89.3352 13.1282C89.3352 13.3232 89.3352 13.4882 89.3152 13.7866H82.1452C82.2385 15.2782 83.4419 16.2649 84.9535 16.2649C86.2285 16.2649 87.0835 15.6782 87.5552 14.8766L89.0885 15.9666C88.2652 17.2632 86.8469 18.0849 84.9335 18.0849C82.1669 18.0849 80.1719 16.1199 80.1719 13.3432C80.1919 10.6582 82.1769 8.60156 84.9452 8.60156M82.2502 12.3149H87.3219C87.1052 10.9982 86.0469 10.2882 84.8735 10.2882C83.7002 10.2882 82.5285 10.9666 82.2502 12.3149Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/replicate.svg b/app/components/base/icons/assets/public/llm/replicate.svg
new file mode 100644
index 0000000..527316e
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/replicate.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="6" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M19.9961 4V5.79H7.93621V19.9017H6V4H19.9961ZM20 7.39453V9.18453H11.5969V19.9012H9.65906V7.39453H20ZM19.9964 12.5773V10.7773H13.3106V19.9007H15.2484V12.5773H19.9964Z" fill="white"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/xorbits-inference-text.svg b/app/components/base/icons/assets/public/llm/xorbits-inference-text.svg
new file mode 100644
index 0000000..8109176
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/xorbits-inference-text.svg
@@ -0,0 +1,42 @@
+<svg width="152" height="24" viewBox="0 0 152 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="xorbits 1" clip-path="url(#clip0_9866_6170)">
+<path id="Vector" d="M8.00391 12.3124C8.69334 13.0754 9.47526 13.7494 10.3316 14.3188C11.0667 14.8105 11.8509 15.2245 12.6716 15.5541C14.1617 14.1465 15.3959 12.4907 16.3192 10.6606L21.7051 0L12.3133 7.38353C10.5832 8.74456 9.12178 10.416 8.00391 12.3124Z" fill="url(#paint0_linear_9866_6170)"/>
+<path id="Vector_2" d="M7.23504 18.9512C6.56092 18.5012 5.92386 18.0265 5.3221 17.5394L2.06445 24L7.91975 19.3959C7.69034 19.2494 7.46092 19.103 7.23504 18.9512Z" fill="url(#paint1_linear_9866_6170)"/>
+<path id="Vector_3" d="M19.3161 8.57474C21.0808 10.9147 21.5961 13.5159 20.3996 15.3053C18.6526 17.9189 13.9161 17.8183 9.82024 15.0812C5.72435 12.3441 3.82024 8.0065 5.56729 5.39297C6.76377 3.60356 9.36318 3.0865 12.2008 3.81886C7.29318 1.73474 2.62376 1.94121 0.813177 4.64474C-1.45976 8.04709 1.64435 14.1177 7.74494 18.1889C13.8455 22.26 20.6361 22.8124 22.9091 19.4118C24.7179 16.703 23.1173 12.3106 19.3161 8.57474Z" fill="url(#paint2_linear_9866_6170)"/>
+<g id="Xorbits Inference">
+<path d="M35.5162 12.142L38.5402 17H36.7482L34.5502 13.472L32.4922 17H30.7142L33.7382 12.142L30.7002 7.27002H32.4922L34.7042 10.826L36.7762 7.27002H38.5542L35.5162 12.142Z" fill="#1D2939"/>
+<path d="M43.3584 17.126C42.6304 17.126 41.9724 16.9627 41.3844 16.636C40.7964 16.3 40.3344 15.8334 39.9984 15.236C39.6624 14.6294 39.4944 13.9293 39.4944 13.136C39.4944 12.352 39.6671 11.6567 40.0124 11.05C40.3577 10.4434 40.8291 9.97668 41.4264 9.65002C42.0237 9.32335 42.6911 9.16002 43.4284 9.16002C44.1657 9.16002 44.8331 9.32335 45.4304 9.65002C46.0277 9.97668 46.4991 10.4434 46.8444 11.05C47.1897 11.6567 47.3624 12.352 47.3624 13.136C47.3624 13.92 47.185 14.6154 46.8304 15.222C46.4757 15.8287 45.9904 16.3 45.3744 16.636C44.7677 16.9627 44.0957 17.126 43.3584 17.126ZM43.3584 15.74C43.769 15.74 44.1517 15.642 44.5064 15.446C44.8704 15.25 45.1644 14.956 45.3884 14.564C45.6124 14.172 45.7244 13.696 45.7244 13.136C45.7244 12.576 45.6171 12.1047 45.4024 11.722C45.1877 11.33 44.9031 11.036 44.5484 10.84C44.1937 10.644 43.8111 10.546 43.4004 10.546C42.9897 10.546 42.607 10.644 42.2524 10.84C41.9071 11.036 41.6317 11.33 41.4264 11.722C41.221 12.1047 41.1184 12.576 41.1184 13.136C41.1184 13.9667 41.3284 14.6107 41.7484 15.068C42.1777 15.516 42.7144 15.74 43.3584 15.74Z" fill="#1D2939"/>
+<path d="M50.2561 10.406C50.4895 10.014 50.7974 9.71068 51.1801 9.49602C51.5721 9.27202 52.0341 9.16002 52.5661 9.16002V10.812H52.1601C51.5348 10.812 51.0588 10.9707 50.7321 11.288C50.4148 11.6054 50.2561 12.156 50.2561 12.94V17H48.6601V9.28602H50.2561V10.406Z" fill="#1D2939"/>
+<path d="M55.3492 10.434C55.6198 10.0607 55.9885 9.75735 56.4552 9.52402C56.9312 9.28135 57.4585 9.16002 58.0372 9.16002C58.7185 9.16002 59.3345 9.32335 59.8852 9.65002C60.4358 9.97668 60.8698 10.4434 61.1872 11.05C61.5045 11.6473 61.6632 12.3333 61.6632 13.108C61.6632 13.8827 61.5045 14.578 61.1872 15.194C60.8698 15.8007 60.4312 16.2767 59.8712 16.622C59.3205 16.958 58.7092 17.126 58.0372 17.126C57.4398 17.126 56.9078 17.0093 56.4412 16.776C55.9838 16.5427 55.6198 16.244 55.3492 15.88V17H53.7532V6.64002H55.3492V10.434ZM60.0392 13.108C60.0392 12.576 59.9272 12.1187 59.7032 11.736C59.4885 11.344 59.1992 11.05 58.8352 10.854C58.4805 10.6487 58.0978 10.546 57.6872 10.546C57.2858 10.546 56.9032 10.6487 56.5392 10.854C56.1845 11.0594 55.8952 11.358 55.6712 11.75C55.4565 12.142 55.3492 12.604 55.3492 13.136C55.3492 13.668 55.4565 14.1347 55.6712 14.536C55.8952 14.928 56.1845 15.2267 56.5392 15.432C56.9032 15.6374 57.2858 15.74 57.6872 15.74C58.0978 15.74 58.4805 15.6374 58.8352 15.432C59.1992 15.2174 59.4885 14.9093 59.7032 14.508C59.9272 14.1067 60.0392 13.64 60.0392 13.108Z" fill="#1D2939"/>
+<path d="M63.7734 8.26402C63.4841 8.26402 63.2414 8.16602 63.0454 7.97002C62.8494 7.77402 62.7514 7.53135 62.7514 7.24202C62.7514 6.95268 62.8494 6.71002 63.0454 6.51402C63.2414 6.31802 63.4841 6.22002 63.7734 6.22002C64.0534 6.22002 64.2914 6.31802 64.4874 6.51402C64.6834 6.71002 64.7814 6.95268 64.7814 7.24202C64.7814 7.53135 64.6834 7.77402 64.4874 7.97002C64.2914 8.16602 64.0534 8.26402 63.7734 8.26402ZM64.5574 9.28602V17H62.9614V9.28602H64.5574Z" fill="#1D2939"/>
+<path d="M68.2348 10.588V14.858C68.2348 15.1474 68.3002 15.3573 68.4309 15.488C68.5709 15.6093 68.8042 15.67 69.1308 15.67H70.1109V17H68.8508C68.1322 17 67.5815 16.832 67.1988 16.496C66.8162 16.16 66.6248 15.614 66.6248 14.858V10.588H65.7148V9.28602H66.6248V7.36802H68.2348V9.28602H70.1109V10.588H68.2348Z" fill="#1D2939"/>
+<path d="M74.1018 17.126C73.4952 17.126 72.9492 17.0187 72.4638 16.804C71.9878 16.58 71.6098 16.2813 71.3298 15.908C71.0498 15.5253 70.9005 15.1007 70.8818 14.634H72.5338C72.5618 14.9607 72.7158 15.236 72.9958 15.46C73.2852 15.6747 73.6445 15.782 74.0738 15.782C74.5218 15.782 74.8672 15.698 75.1098 15.53C75.3618 15.3527 75.4878 15.1287 75.4878 14.858C75.4878 14.5687 75.3478 14.354 75.0678 14.214C74.7972 14.074 74.3632 13.92 73.7658 13.752C73.1872 13.5933 72.7158 13.4394 72.3518 13.29C71.9878 13.1407 71.6705 12.912 71.3998 12.604C71.1385 12.296 71.0078 11.89 71.0078 11.386C71.0078 10.9753 71.1292 10.602 71.3718 10.266C71.6145 9.92068 71.9598 9.65002 72.4078 9.45402C72.8652 9.25802 73.3878 9.16002 73.9758 9.16002C74.8532 9.16002 75.5578 9.38402 76.0898 9.83202C76.6312 10.2707 76.9205 10.8727 76.9578 11.638H75.3618C75.3338 11.2927 75.1938 11.0173 74.9418 10.812C74.6898 10.6067 74.3492 10.504 73.9198 10.504C73.4998 10.504 73.1778 10.5833 72.9538 10.742C72.7298 10.9007 72.6178 11.1107 72.6178 11.372C72.6178 11.5773 72.6925 11.75 72.8418 11.89C72.9912 12.03 73.1732 12.142 73.3878 12.226C73.6025 12.3007 73.9198 12.3987 74.3398 12.52C74.8998 12.6693 75.3572 12.8233 75.7118 12.982C76.0758 13.1314 76.3885 13.3554 76.6498 13.654C76.9112 13.9527 77.0465 14.3493 77.0558 14.844C77.0558 15.2827 76.9345 15.6747 76.6918 16.02C76.4492 16.3654 76.1038 16.636 75.6558 16.832C75.2172 17.028 74.6992 17.126 74.1018 17.126Z" fill="#1D2939"/>
+<path d="M83.4531 7.27002V17H81.8571V7.27002H83.4531Z" fill="#1D2939"/>
+<path d="M89.1605 9.16002C89.7671 9.16002 90.3085 9.28602 90.7845 9.53802C91.2698 9.79002 91.6478 10.1633 91.9185 10.658C92.1891 11.1527 92.3245 11.75 92.3245 12.45V17H90.7425V12.688C90.7425 11.9973 90.5698 11.47 90.2245 11.106C89.8791 10.7327 89.4078 10.546 88.8105 10.546C88.2131 10.546 87.7371 10.7327 87.3825 11.106C87.0371 11.47 86.8645 11.9973 86.8645 12.688V17H85.2685V9.28602H86.8645V10.168C87.1258 9.85068 87.4571 9.60335 87.8585 9.42602C88.2691 9.24868 88.7031 9.16002 89.1605 9.16002Z" fill="#1D2939"/>
+<path d="M97.3143 10.588H95.8863V17H94.2763V10.588H93.3663V9.28602H94.2763V8.74002C94.2763 7.85335 94.5096 7.20935 94.9763 6.80802C95.4523 6.39735 96.1943 6.19202 97.2023 6.19202V7.52202C96.7169 7.52202 96.3763 7.61535 96.1803 7.80202C95.9843 7.97935 95.8863 8.29202 95.8863 8.74002V9.28602H97.3143V10.588Z" fill="#1D2939"/>
+<path d="M105.519 12.954C105.519 13.2433 105.5 13.5047 105.463 13.738H99.5687C99.6154 14.354 99.844 14.8487 100.255 15.222C100.665 15.5954 101.169 15.782 101.767 15.782C102.625 15.782 103.232 15.4227 103.587 14.704H105.309C105.075 15.4133 104.651 15.9967 104.035 16.454C103.428 16.902 102.672 17.126 101.767 17.126C101.029 17.126 100.367 16.9627 99.7787 16.636C99.2 16.3 98.7427 15.8334 98.4067 15.236C98.08 14.6294 97.9167 13.9293 97.9167 13.136C97.9167 12.3427 98.0754 11.6473 98.3927 11.05C98.7194 10.4434 99.172 9.97668 99.7507 9.65002C100.339 9.32335 101.011 9.16002 101.767 9.16002C102.495 9.16002 103.143 9.31868 103.713 9.63602C104.282 9.95335 104.725 10.4014 105.043 10.98C105.36 11.5493 105.519 12.2073 105.519 12.954ZM103.853 12.45C103.843 11.862 103.633 11.3907 103.223 11.036C102.812 10.6813 102.303 10.504 101.697 10.504C101.146 10.504 100.675 10.6813 100.283 11.036C99.8907 11.3813 99.6574 11.8527 99.5827 12.45H103.853Z" fill="#1D2939"/>
+<path d="M108.405 10.406C108.639 10.014 108.947 9.71068 109.329 9.49602C109.721 9.27202 110.183 9.16002 110.715 9.16002V10.812H110.309C109.684 10.812 109.208 10.9707 108.881 11.288C108.564 11.6054 108.405 12.156 108.405 12.94V17H106.809V9.28602H108.405V10.406Z" fill="#1D2939"/>
+<path d="M118.972 12.954C118.972 13.2433 118.954 13.5047 118.916 13.738H113.022C113.069 14.354 113.298 14.8487 113.708 15.222C114.119 15.5954 114.623 15.782 115.22 15.782C116.079 15.782 116.686 15.4227 117.04 14.704H118.762C118.529 15.4133 118.104 15.9967 117.488 16.454C116.882 16.902 116.126 17.126 115.22 17.126C114.483 17.126 113.82 16.9627 113.232 16.636C112.654 16.3 112.196 15.8334 111.86 15.236C111.534 14.6294 111.37 13.9293 111.37 13.136C111.37 12.3427 111.529 11.6473 111.846 11.05C112.173 10.4434 112.626 9.97668 113.204 9.65002C113.792 9.32335 114.464 9.16002 115.22 9.16002C115.948 9.16002 116.597 9.31868 117.166 9.63602C117.736 9.95335 118.179 10.4014 118.496 10.98C118.814 11.5493 118.972 12.2073 118.972 12.954ZM117.306 12.45C117.297 11.862 117.087 11.3907 116.676 11.036C116.266 10.6813 115.757 10.504 115.15 10.504C114.6 10.504 114.128 10.6813 113.736 11.036C113.344 11.3813 113.111 11.8527 113.036 12.45H117.306Z" fill="#1D2939"/>
+<path d="M124.155 9.16002C124.762 9.16002 125.303 9.28602 125.779 9.53802C126.264 9.79002 126.642 10.1633 126.913 10.658C127.184 11.1527 127.319 11.75 127.319 12.45V17H125.737V12.688C125.737 11.9973 125.564 11.47 125.219 11.106C124.874 10.7327 124.402 10.546 123.805 10.546C123.208 10.546 122.732 10.7327 122.377 11.106C122.032 11.47 121.859 11.9973 121.859 12.688V17H120.263V9.28602H121.859V10.168C122.12 9.85068 122.452 9.60335 122.853 9.42602C123.264 9.24868 123.698 9.16002 124.155 9.16002Z" fill="#1D2939"/>
+<path d="M128.543 13.136C128.543 12.3427 128.701 11.6473 129.019 11.05C129.345 10.4434 129.793 9.97668 130.363 9.65002C130.932 9.32335 131.585 9.16002 132.323 9.16002C133.256 9.16002 134.026 9.38402 134.633 9.83202C135.249 10.2707 135.664 10.9007 135.879 11.722H134.157C134.017 11.3394 133.793 11.0407 133.485 10.826C133.177 10.6113 132.789 10.504 132.323 10.504C131.669 10.504 131.147 10.7373 130.755 11.204C130.372 11.6613 130.181 12.3053 130.181 13.136C130.181 13.9667 130.372 14.6153 130.755 15.082C131.147 15.5487 131.669 15.782 132.323 15.782C133.247 15.782 133.858 15.376 134.157 14.564H135.879C135.655 15.348 135.235 15.9733 134.619 16.44C134.003 16.8973 133.237 17.126 132.323 17.126C131.585 17.126 130.932 16.9627 130.363 16.636C129.793 16.3 129.345 15.8334 129.019 15.236C128.701 14.6294 128.543 13.9293 128.543 13.136Z" fill="#1D2939"/>
+<path d="M144.259 12.954C144.259 13.2433 144.241 13.5047 144.203 13.738H138.309C138.356 14.354 138.585 14.8487 138.995 15.222C139.406 15.5954 139.91 15.782 140.507 15.782C141.366 15.782 141.973 15.4227 142.327 14.704H144.049C143.816 15.4133 143.391 15.9967 142.775 16.454C142.169 16.902 141.413 17.126 140.507 17.126C139.77 17.126 139.107 16.9627 138.519 16.636C137.941 16.3 137.483 15.8334 137.147 15.236C136.821 14.6294 136.657 13.9293 136.657 13.136C136.657 12.3427 136.816 11.6473 137.133 11.05C137.46 10.4434 137.913 9.97668 138.491 9.65002C139.079 9.32335 139.751 9.16002 140.507 9.16002C141.235 9.16002 141.884 9.31868 142.453 9.63602C143.023 9.95335 143.466 10.4014 143.783 10.98C144.101 11.5493 144.259 12.2073 144.259 12.954ZM142.593 12.45C142.584 11.862 142.374 11.3907 141.963 11.036C141.553 10.6813 141.044 10.504 140.437 10.504C139.887 10.504 139.415 10.6813 139.023 11.036C138.631 11.3813 138.398 11.8527 138.323 12.45H142.593Z" fill="#1D2939"/>
+</g>
+</g>
+<defs>
+<linearGradient id="paint0_linear_9866_6170" x1="2.15214" y1="24.3018" x2="21.2921" y2="0.0988218" gradientUnits="userSpaceOnUse">
+<stop stop-color="#E9A85E"/>
+<stop offset="1" stop-color="#F52B76"/>
+</linearGradient>
+<linearGradient id="paint1_linear_9866_6170" x1="2.06269" y1="24.2294" x2="21.2027" y2="0.028252" gradientUnits="userSpaceOnUse">
+<stop stop-color="#E9A85E"/>
+<stop offset="1" stop-color="#F52B76"/>
+</linearGradient>
+<linearGradient id="paint2_linear_9866_6170" x1="-0.613606" y1="3.843" x2="21.4449" y2="18.7258" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6A0CF5"/>
+<stop offset="1" stop-color="#AB66F3"/>
+</linearGradient>
+<clipPath id="clip0_9866_6170">
+<rect width="152" height="24" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/xorbits-inference.svg b/app/components/base/icons/assets/public/llm/xorbits-inference.svg
new file mode 100644
index 0000000..f5c5f75
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/xorbits-inference.svg
@@ -0,0 +1,24 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Xorbits Square" clip-path="url(#clip0_9850_26870)">
+<path id="Vector" d="M8.00391 12.3124C8.69334 13.0754 9.47526 13.7494 10.3316 14.3188C11.0667 14.8105 11.8509 15.2245 12.6716 15.5541C14.1617 14.1465 15.3959 12.4907 16.3192 10.6606L21.7051 0L12.3133 7.38353C10.5832 8.74456 9.12178 10.416 8.00391 12.3124Z" fill="url(#paint0_linear_9850_26870)"/>
+<path id="Vector_2" d="M7.23504 18.9512C6.56092 18.5012 5.92386 18.0265 5.3221 17.5394L2.06445 24L7.91975 19.3959C7.69034 19.2494 7.46092 19.103 7.23504 18.9512Z" fill="url(#paint1_linear_9850_26870)"/>
+<path id="Vector_3" d="M19.3161 8.57474C21.0808 10.9147 21.5961 13.5159 20.3996 15.3053C18.6526 17.9189 13.9161 17.8183 9.82024 15.0812C5.72435 12.3441 3.82024 8.0065 5.56729 5.39297C6.76377 3.60356 9.36318 3.0865 12.2008 3.81886C7.29318 1.73474 2.62376 1.94121 0.813177 4.64474C-1.45976 8.04709 1.64435 14.1177 7.74494 18.1889C13.8455 22.26 20.6361 22.8124 22.9091 19.4118C24.7179 16.703 23.1173 12.3106 19.3161 8.57474Z" fill="url(#paint2_linear_9850_26870)"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_9850_26870" x1="2.15214" y1="24.3018" x2="21.2921" y2="0.0988218" gradientUnits="userSpaceOnUse">
+<stop stop-color="#E9A85E"/>
+<stop offset="1" stop-color="#F52B76"/>
+</linearGradient>
+<linearGradient id="paint1_linear_9850_26870" x1="2.06269" y1="24.2294" x2="21.2027" y2="0.028252" gradientUnits="userSpaceOnUse">
+<stop stop-color="#E9A85E"/>
+<stop offset="1" stop-color="#F52B76"/>
+</linearGradient>
+<linearGradient id="paint2_linear_9850_26870" x1="-0.613606" y1="3.843" x2="21.4449" y2="18.7258" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6A0CF5"/>
+<stop offset="1" stop-color="#AB66F3"/>
+</linearGradient>
+<clipPath id="clip0_9850_26870">
+<rect width="24" height="24" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/zhipuai-text-cn.svg b/app/components/base/icons/assets/public/llm/zhipuai-text-cn.svg
new file mode 100644
index 0000000..067ea2c
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/zhipuai-text-cn.svg
@@ -0,0 +1,8 @@
+<svg width="86" height="32" viewBox="0 0 86 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="shape">
+<path d="M85.3919 8.94111H83.2742V22.4705H85.3919V8.94111ZM76.9919 8.94111L74.8272 22.4705H76.7801L77.0154 20.9411L77.133 20.2117C77.1566 20.0705 77.3448 19.9529 77.5566 19.9529H79.3919C79.6036 19.9529 79.7919 20.0705 79.8154 20.2117L79.933 20.9411L80.1683 22.4705H82.3095L80.1213 8.94111H76.9919ZM79.2742 18.3529H77.6507C77.533 18.3529 77.4389 18.2352 77.4389 18.1176L78.1683 12.2117C78.1919 12.047 78.3095 11.9293 78.4507 11.9293C78.5919 11.9293 78.7095 12.047 78.733 12.2117L79.4625 18.1176C79.486 18.2588 79.3919 18.3529 79.2742 18.3529ZM15.2742 31.3176C15.086 31.3176 14.9448 31.4588 14.9448 31.647C14.9448 31.8352 15.086 31.9764 15.2742 31.9764C15.4624 31.9764 15.6036 31.8352 15.6036 31.647C15.6036 31.4588 15.4624 31.3176 15.2742 31.3176ZM19.133 11.6705C19.7321 11.6705 20.3067 11.4325 20.7303 11.0089C21.1539 10.5853 21.3919 10.0108 21.3919 9.4117C21.3919 8.81262 21.1539 8.23808 20.7303 7.81447C20.3067 7.39086 19.7321 7.15288 19.133 7.15288C18.534 7.15288 17.9594 7.39086 17.5358 7.81447C17.1122 8.23808 16.8742 8.81262 16.8742 9.4117C16.8742 10.0108 17.1122 10.5853 17.5358 11.0089C17.9594 11.4325 18.534 11.6705 19.133 11.6705ZM24.5601 17.6752C24.7699 17.4655 24.9363 17.2165 25.0498 16.9424C25.1633 16.6683 25.2218 16.3746 25.2218 16.0779C25.2218 15.7813 25.1633 15.4875 25.0498 15.2135C24.9363 14.9394 24.7699 14.6904 24.5601 14.4806C24.1365 14.057 23.5619 13.8191 22.9628 13.8191C22.3638 13.8191 21.7892 14.0571 21.3656 14.4808C20.942 14.9044 20.7041 15.4789 20.7041 16.078C20.7041 16.6771 20.9421 17.2516 21.3657 17.6752C21.5755 17.885 21.8245 18.0514 22.0985 18.165C22.3726 18.2785 22.6663 18.337 22.9629 18.337C23.2596 18.337 23.5533 18.2785 23.8273 18.165C24.1014 18.0514 24.3504 17.885 24.5601 17.6752ZM9.69233 16.9369C9.9216 16.3834 9.9216 15.7614 9.69232 15.2079C9.46304 14.6544 9.02327 14.2146 8.46974 13.9853C7.91622 13.7561 7.29429 13.7561 6.74077 13.9854C6.18725 14.2146 5.74749 14.6544 5.51821 15.2079C5.28894 15.7615 5.28895 16.3834 5.51823 16.9369C5.74751 17.4904 6.18728 17.9302 6.7408 18.1595C7.01488 18.273 7.30863 18.3314 7.60529 18.3314C7.90195 18.3314 8.1957 18.273 8.46977 18.1595C9.02329 17.9302 9.46306 17.4904 9.69233 16.9369ZM24.9683 11.8823C25.1506 11.8823 25.3312 11.8464 25.4996 11.7766C25.668 11.7069 25.8211 11.6046 25.95 11.4757C26.0789 11.3468 26.1811 11.1937 26.2509 11.0253C26.3207 10.8569 26.3566 10.6764 26.3566 10.4941C26.3566 10.3117 26.3207 10.1312 26.2509 9.9628C26.1811 9.79437 26.0789 9.64133 25.95 9.51242C25.8211 9.38351 25.668 9.28126 25.4996 9.21149C25.3312 9.14173 25.1506 9.10582 24.9683 9.10582C24.6001 9.10582 24.247 9.25208 23.9867 9.51242C23.7264 9.77277 23.5801 10.1259 23.5801 10.4941C23.5801 10.8622 23.7264 11.2153 23.9867 11.4757C24.247 11.736 24.6001 11.8823 24.9683 11.8823ZM15.5904 6.24605C15.77 6.20622 15.9398 6.13112 16.0901 6.02511C16.2403 5.9191 16.368 5.78429 16.4658 5.62851C16.5635 5.47273 16.6293 5.29909 16.6593 5.11766C16.6894 4.93624 16.6831 4.75065 16.6408 4.57168C16.5986 4.39271 16.5212 4.22392 16.4131 4.07512C16.3051 3.92631 16.1685 3.80046 16.0114 3.70486C15.8543 3.60926 15.6798 3.54583 15.498 3.51824C15.3162 3.49066 15.1307 3.49947 14.9523 3.54417C14.5984 3.63287 14.2936 3.85737 14.1039 4.1691C13.9142 4.48083 13.8548 4.85472 13.9387 5.20986C14.0226 5.565 14.2429 5.87284 14.552 6.06676C14.8612 6.26068 15.2342 6.32509 15.5904 6.24605ZM5.60362 11.8823C5.78593 11.8823 5.96645 11.8464 6.13488 11.7766C6.30331 11.7069 6.45635 11.6046 6.58526 11.4757C6.71417 11.3468 6.81642 11.1937 6.88619 11.0253C6.95595 10.8569 6.99186 10.6764 6.99186 10.4941C6.99186 10.3117 6.95595 10.1312 6.88619 9.9628C6.81642 9.79437 6.71417 9.64133 6.58526 9.51242C6.45635 9.38351 6.30331 9.28126 6.13488 9.21149C5.96645 9.14173 5.78593 9.10582 5.60362 9.10582C5.23544 9.10582 4.88234 9.25208 4.62199 9.51242C4.36165 9.77277 4.21539 10.1259 4.21539 10.4941C4.21539 10.8622 4.36165 11.2153 4.62199 11.4757C4.88234 11.736 5.23544 11.8823 5.60362 11.8823ZM6.58904 22.6493C6.71795 22.5204 6.82021 22.3674 6.88997 22.199C6.95974 22.0305 6.99565 21.85 6.99565 21.6677C6.99565 21.4854 6.95974 21.3049 6.88997 21.1364C6.82021 20.968 6.71795 20.815 6.58904 20.6861C6.46012 20.5571 6.30708 20.4549 6.13865 20.3851C5.97022 20.3154 5.7897 20.2794 5.60739 20.2794C5.42508 20.2794 5.24456 20.3154 5.07613 20.3851C4.90769 20.4549 4.75465 20.5571 4.62574 20.6861C4.36539 20.9464 4.21913 21.2995 4.21913 21.6677C4.21913 22.0359 4.36539 22.389 4.62574 22.6493C4.88609 22.9097 5.2392 23.056 5.60739 23.056C5.97558 23.056 6.32869 22.9097 6.58904 22.6493ZM15.5919 28.5983C15.7693 28.5564 15.9367 28.48 16.0846 28.3734C16.2324 28.2668 16.3579 28.1321 16.4537 27.977C16.5495 27.8219 16.6138 27.6495 16.643 27.4696C16.6722 27.2896 16.6656 27.1057 16.6237 26.9283C16.5818 26.7509 16.5054 26.5835 16.3988 26.4356C16.2922 26.2877 16.1575 26.1623 16.0025 26.0665C15.8474 25.9707 15.675 25.9063 15.495 25.8771C15.3151 25.848 15.1312 25.8545 14.9537 25.8964C14.7742 25.9362 14.6044 26.0113 14.4541 26.1174C14.3039 26.2234 14.1762 26.3582 14.0784 26.514C13.9807 26.6697 13.9149 26.8434 13.8849 27.0248C13.8548 27.2062 13.8611 27.3918 13.9034 27.5708C13.9456 27.7497 14.023 27.9185 14.1311 28.0673C14.2391 28.2162 14.3757 28.342 14.5328 28.4376C14.6898 28.5332 14.8644 28.5966 15.0462 28.6242C15.228 28.6518 15.4135 28.643 15.5919 28.5983ZM25.2848 22.9973C25.4634 22.9566 25.6322 22.881 25.7815 22.7747C25.9307 22.6684 26.0574 22.5337 26.1543 22.3782C26.2512 22.2227 26.3164 22.0496 26.3461 21.8688C26.3758 21.6881 26.3694 21.5032 26.3273 21.3249C26.2853 21.1466 26.2083 20.9784 26.1009 20.83C25.9935 20.6815 25.8578 20.5559 25.7015 20.4601C25.5453 20.3644 25.3717 20.3006 25.1907 20.2723C25.0097 20.244 24.8249 20.2518 24.6469 20.2952C24.291 20.3821 23.9839 20.6062 23.7925 20.9185C23.6011 21.2309 23.541 21.6063 23.6251 21.9628C23.7093 22.3193 23.931 22.6281 24.2419 22.8219C24.5528 23.0157 24.9276 23.0788 25.2848 22.9973ZM22.286 4.82347C22.7566 4.82347 23.133 4.447 23.133 3.97641C23.133 3.50582 22.7566 3.12935 22.286 3.12935C21.8154 3.12935 21.4389 3.50582 21.4389 3.97641C21.4389 4.447 21.8154 4.82347 22.286 4.82347ZM8.28598 4.82347C8.75657 4.82347 9.13304 4.447 9.13304 3.97641C9.13304 3.50582 8.75657 3.12935 8.28598 3.12935C7.81539 3.12935 7.43892 3.50582 7.43892 3.97641C7.43892 4.447 7.81539 4.82347 8.28598 4.82347ZM1.29774 15.2235C0.827154 15.2235 0.450684 15.5999 0.450684 16.0705C0.450684 16.5411 0.827154 16.9176 1.29774 16.9176C1.76833 16.9176 2.1448 16.5411 2.1448 16.0705C2.16833 15.5999 1.76833 15.2235 1.29774 15.2235ZM8.28598 27.3176C7.81539 27.3176 7.43892 27.6941 7.43892 28.1646C7.43892 28.6352 7.81539 29.0117 8.28598 29.0117C8.75657 29.0117 9.13304 28.6352 9.13304 28.1646C9.13304 27.6941 8.75657 27.3176 8.28598 27.3176ZM22.286 27.3411C21.8154 27.3411 21.4389 27.7176 21.4389 28.1882C21.4389 28.6588 21.8154 29.0352 22.286 29.0352C22.7566 29.0352 23.133 28.6588 23.133 28.1882C23.133 27.7176 22.7566 27.3411 22.286 27.3411ZM29.2742 15.2235C28.8036 15.2235 28.4272 15.5999 28.4272 16.0705C28.4272 16.5411 28.8036 16.9176 29.2742 16.9176C29.7448 16.9176 30.1213 16.5411 30.1213 16.0705C30.1213 15.5999 29.7448 15.2235 29.2742 15.2235ZM28.7566 8.6117C28.9448 8.6117 29.086 8.47053 29.086 8.28229C29.086 8.09405 28.9448 7.95288 28.7566 7.95288C28.5683 7.95288 28.4272 8.09405 28.4272 8.28229C28.4272 8.47053 28.5919 8.6117 28.7566 8.6117ZM15.2742 0.846995C15.4624 0.846995 15.6036 0.705819 15.6036 0.517583C15.6036 0.329348 15.4624 0.188171 15.2742 0.188171C15.086 0.188171 14.9448 0.329348 14.9448 0.517583C14.9448 0.705819 15.1095 0.846995 15.2742 0.846995ZM1.81539 8.6117C2.00362 8.6117 2.1448 8.47053 2.1448 8.28229C2.1448 8.09405 2.00362 7.95288 1.81539 7.95288C1.62715 7.95288 1.48598 8.09405 1.48598 8.28229C1.48598 8.47053 1.62715 8.6117 1.81539 8.6117ZM1.81539 23.5293C1.62715 23.5293 1.48598 23.6705 1.48598 23.8588C1.48598 24.047 1.62715 24.1882 1.81539 24.1882C2.00362 24.1882 2.1448 24.047 2.1448 23.8588C2.1448 23.6705 1.9801 23.5293 1.81539 23.5293ZM28.7801 23.5058C28.5919 23.5058 28.4507 23.647 28.4507 23.8352C28.4507 24.0235 28.5919 24.1646 28.7801 24.1646C28.9683 24.1646 29.1095 24.0235 29.1095 23.8352C29.1095 23.6705 28.9683 23.5058 28.7801 23.5058Z" fill="#3859FF"/>
+<path d="M19.8154 20.5882C18.8036 20.2588 17.7683 20.6823 17.2272 21.5293L17.2036 21.5764C16.686 22.447 15.6507 22.9176 14.6389 22.6117C14.0742 22.4235 13.6272 22.047 13.3448 21.5529C13.2977 21.4117 13.2742 21.2705 13.2742 21.1058C13.2272 20.1411 13.9801 19.3176 14.9448 19.2941H15.1801C16.9683 19.3646 18.4507 17.9764 18.5213 16.2117C18.5919 14.4235 17.2036 12.9411 15.4389 12.8705H14.9448C13.9801 12.8235 13.2977 12.0705 13.3448 11.1293C13.3448 10.8941 13.3919 10.6823 13.486 10.4705L13.5095 10.3999C13.5566 10.2823 13.5801 10.2352 13.6272 10.1176C14.0036 8.91758 13.3448 7.67052 12.1448 7.29405C10.9683 6.94111 9.69774 7.57641 9.32127 8.75288C8.9448 9.90582 9.5801 11.1529 10.733 11.5529C10.9213 11.6235 11.0389 11.647 11.2036 11.6705L11.2977 11.6941C12.2154 11.7882 12.9213 12.5176 12.8977 13.4588C12.8742 13.7882 12.7801 14.1176 12.5919 14.3764C12.286 14.847 12.1213 15.3882 12.0977 15.9764C12.0742 16.6588 12.2624 17.3176 12.5919 17.8352C12.7801 18.0941 12.8742 18.3999 12.8977 18.7529C12.9448 19.6941 12.3095 20.4235 11.3919 20.5176H11.3683C11.2272 20.5176 11.086 20.5411 10.9683 20.5646C9.72127 20.847 8.99186 22.0705 9.27421 23.2705C9.55657 24.4941 10.7801 25.2235 11.9566 24.9646C12.5919 24.8235 13.086 24.447 13.3919 23.9529C13.9095 23.0588 14.9919 22.6352 16.0272 22.9646C16.5919 23.1293 16.9683 23.4823 17.2507 23.9293L17.2742 23.9764C17.5095 24.3529 17.9566 24.7529 18.4977 24.9176C19.7213 25.2705 20.9213 24.6117 21.2977 23.4588C21.6742 22.2117 20.9683 20.9646 19.8154 20.5882ZM70.2625 16.2588C70.537 16.2588 70.8004 16.1497 70.9945 15.9555C71.1887 15.7614 71.2977 15.498 71.2977 15.2235C71.2977 14.9489 71.1887 14.6856 70.9945 14.4914C70.8004 14.2972 70.537 14.1882 70.2625 14.1882C69.9879 14.1882 69.7245 14.2972 69.5304 14.4914C69.3362 14.6856 69.2272 14.9489 69.2272 15.2235C69.2272 15.498 69.3362 15.7614 69.5304 15.9555C69.7245 16.1497 69.9879 16.2588 70.2625 16.2588ZM43.8624 15.5293C43.7213 15.4588 43.5095 15.2941 43.2036 15.1058C42.3801 14.5411 41.7448 14.1176 41.3448 13.8117H43.9095V12.5882H41.5095C41.5566 12.4705 41.5566 11.2941 41.5566 10.9646C41.5801 10.6823 41.6036 10.447 41.6036 10.2823H43.5095V9.05876H39.5801C39.7683 8.72935 39.9095 8.37641 40.0272 7.95288L38.7095 7.83523C38.3801 8.89405 37.8154 9.8117 37.0154 10.5882C37.3448 10.9176 37.533 11.1293 37.6036 11.2705C37.7213 11.3882 37.7919 11.5058 37.886 11.5764C38.333 11.1293 38.6624 10.7058 38.9213 10.2823H40.2389C40.2389 10.7764 40.1919 12.1646 40.1213 12.5646H37.133V13.7882H39.8625C39.5095 14.6352 38.5448 15.3882 37.0389 15.9999C37.3213 16.3999 37.6036 16.8235 37.8625 17.2941C38.1448 17.0823 38.4507 16.9176 38.733 16.7999V23.5293H40.1448V22.847H47.0625V23.5293H48.5213V16.7529H43.086L43.8624 15.5293ZM38.8036 16.7293C39.7919 16.1176 40.4272 15.4823 40.7566 14.847C40.8977 14.9176 41.086 15.0823 41.2977 15.2705C42.0507 15.8823 42.6625 16.3764 43.086 16.7293H38.8036ZM47.0625 21.7646H40.1448V20.4235H47.0625V21.7646ZM47.0625 19.3176H40.1448V18.0235H47.0625V19.3176Z" fill="#3859FF"/>
+<path d="M44.4507 15.6941H49.5095V8.94111H44.4507V15.6941ZM45.7683 10.3058H48.2154V14.4235H45.7683V10.3058ZM54.4742 11.3882L55.7213 10.5411C55.0389 9.55288 54.4507 8.79994 53.9801 8.2117L52.8977 8.94111C53.0389 9.17641 53.2507 9.52935 53.5566 9.97641C54.0036 10.6352 54.3095 11.1058 54.4742 11.3882ZM64.0272 13.9764C64.1448 13.8588 64.286 13.647 64.4742 13.3646C64.8742 12.847 65.1566 12.447 65.2977 12.2117L64.3095 11.5293C64.0977 11.9058 63.6742 12.4705 63.0625 13.247L64.0272 13.9764ZM58.4507 13.247C58.3095 13.0352 58.0977 12.7529 57.7919 12.3999C57.5095 11.9999 57.2742 11.7176 57.133 11.5529L56.2154 12.2352C56.7566 12.9646 57.1801 13.5529 57.4624 13.9999L58.4507 13.247ZM55.2977 20.2823C55.1801 20.3999 55.1095 20.4941 55.086 20.5176V13.9293H52.5213V15.4588H53.6742V20.8941C53.6742 21.4352 53.5566 21.8117 53.2977 22.047L54.1683 23.3882C54.686 22.7058 55.4624 21.8823 56.4977 20.9411C56.3801 20.2117 56.3095 19.647 56.2154 19.2235C56.0507 19.4823 55.7448 19.8352 55.2977 20.2823ZM54.1683 23.4117V23.3882L54.1448 23.4117H54.1683ZM57.0389 23.5764H58.4036V22.9646H63.0389V23.5764H64.4507V17.0352H57.0389V23.5764ZM58.4036 18.2588H63.0389V19.5529H58.4036V18.2588ZM58.4036 20.5882H63.0389V21.8117H58.4036V20.5882Z" fill="#3859FF"/>
+<path d="M65.3213 10.7999V9.647H62.9213C63.2742 9.08229 63.5095 8.72935 63.5801 8.6117C63.6977 8.39994 63.7683 8.25876 63.8625 8.18817L62.4977 7.88229C62.1683 8.49405 61.8154 9.08229 61.4154 9.647H60.0977C59.9566 9.4117 59.7213 9.03523 59.3919 8.54111C59.2036 8.25876 59.0625 8.02347 58.9448 7.85876L57.6272 8.16464C57.8154 8.39994 58.1213 8.89405 58.5448 9.62347H56.2625V10.7764H58.8272V14.7764H55.7683V15.9293H65.6742V14.7764H62.5213V10.7999H65.3213ZM61.3448 14.7764H60.0977V10.7764H61.3448V14.7764Z" fill="#3859FF"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/zhipuai-text.svg b/app/components/base/icons/assets/public/llm/zhipuai-text.svg
new file mode 100644
index 0000000..d324999
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/zhipuai-text.svg
@@ -0,0 +1,6 @@
+<svg width="89" height="32" viewBox="0 0 89 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="shape">
+<path d="M88.8045 8.82998H86.7123V22.4497H88.8045V8.82998ZM80.5485 8.82998L78.4158 22.4497H80.3339L80.5589 20.9156L80.6709 20.1853C80.6916 20.0394 80.8751 19.9142 81.0793 19.9142H82.8855C83.0897 19.9142 83.2732 20.029 83.2939 20.1853L83.4059 20.9156L83.6299 22.4497H85.7429L83.6102 8.82998H80.5485ZM82.7838 18.2963H81.181C81.1522 18.2968 81.1237 18.2909 81.0975 18.279C81.0713 18.2671 81.0481 18.2495 81.0295 18.2275C81.0109 18.2056 80.9975 18.1797 80.9902 18.1519C80.9828 18.1241 80.9818 18.095 80.9871 18.0667L81.7024 12.1175C81.7212 11.95 81.8436 11.8352 81.9772 11.8352C82.109 11.8352 82.2426 11.95 82.253 12.1175L82.9673 18.0657C82.9767 18.1919 82.8855 18.2963 82.7735 18.2963H82.7838ZM14.8563 31.3316C14.7706 31.3519 14.6961 31.4046 14.6485 31.4787C14.6009 31.5528 14.584 31.6425 14.6012 31.7288C14.6417 31.9057 14.8158 32.0309 14.989 31.9895C15.0746 31.9695 15.1491 31.9169 15.1967 31.843C15.2443 31.769 15.2613 31.6795 15.244 31.5933C15.2036 31.4154 15.0295 31.2902 14.8563 31.3316ZM19.6337 11.3693C20.7471 10.8544 21.2412 9.51233 20.7368 8.37257C20.2323 7.23374 18.9203 6.72739 17.8059 7.24316C16.6925 7.75986 16.1975 9.10198 16.7019 10.2408C17.2064 11.3806 18.5184 11.885 19.6337 11.3693ZM23.1245 18.1712C24.2963 17.8107 24.9598 16.5476 24.6078 15.3504C24.2549 14.1523 23.02 13.4737 21.8483 13.8342C20.6775 14.1947 20.013 15.4577 20.3659 16.6559C20.7189 17.853 21.9537 18.5316 23.1245 18.1712ZM5.89628 14.2982C5.45885 14.7037 5.19533 15.2628 5.16094 15.8583C5.12655 16.4537 5.32396 17.0394 5.71181 17.4926C5.90262 17.7129 6.13553 17.8928 6.39686 18.0219C6.6582 18.1509 6.94268 18.2264 7.23361 18.2439C7.52453 18.2615 7.81602 18.2207 8.09096 18.124C8.36591 18.0273 8.61875 17.8766 8.83463 17.6808C9.27207 17.2753 9.53559 16.7162 9.56998 16.1208C9.60437 15.5253 9.40695 14.9396 9.0191 14.4864C8.8283 14.2661 8.59539 14.0862 8.33405 13.9571C8.07272 13.8281 7.78823 13.7526 7.49731 13.7351C7.20639 13.7175 6.91489 13.7583 6.63995 13.855C6.36501 13.9517 6.11217 14.1024 5.89628 14.2982ZM25.3579 11.4182C25.9189 10.9062 25.9697 10.0196 25.4699 9.44551C25.3521 9.30917 25.2082 9.19782 25.0467 9.11802C24.8852 9.03822 24.7093 8.99159 24.5295 8.98088C24.3496 8.97018 24.1694 8.99562 23.9996 9.0557C23.8297 9.11578 23.6736 9.20928 23.5405 9.33068C23.27 9.581 23.1072 9.92649 23.0863 10.2944C23.0654 10.6624 23.1881 11.0241 23.4285 11.3034C23.9292 11.8775 24.796 11.9293 25.3579 11.4182ZM14.9278 6.15798C15.6826 6.15798 16.2953 5.53116 16.2953 4.75939C16.2953 3.98763 15.6836 3.3608 14.9278 3.3608C14.172 3.3608 13.5603 3.98669 13.5603 4.75939C13.5603 5.53116 14.172 6.15798 14.9278 6.15798ZM5.40687 11.773C6.16169 11.773 6.77346 11.1472 6.77346 10.3744C6.77346 9.60268 6.16169 8.97586 5.40593 8.97586C4.65111 8.97586 4.0384 9.60174 4.0384 10.3744C4.0384 11.1462 4.65111 11.773 5.40687 11.773ZM4.48734 20.5815C4.21673 20.8317 4.05374 21.1771 4.03268 21.5451C4.01161 21.913 4.13411 22.2748 4.3744 22.5542C4.87511 23.1283 5.74287 23.181 6.30381 22.669C6.86569 22.158 6.91558 21.2704 6.41675 20.6963C6.29897 20.56 6.15507 20.4486 5.99354 20.3688C5.83201 20.289 5.65613 20.2424 5.47628 20.2317C5.29643 20.221 5.11626 20.2464 4.94641 20.3065C4.77656 20.3666 4.62046 20.4601 4.48734 20.5815ZM14.9278 28.6493C15.6826 28.6493 16.2953 28.0234 16.2953 27.2507C16.2953 26.4789 15.6836 25.8521 14.9278 25.8521C14.172 25.8521 13.5603 26.4789 13.5603 27.2507C13.5603 28.0234 14.172 28.6493 14.9278 28.6493ZM24.4591 23.0135C25.2149 23.0135 25.8266 22.3876 25.8266 21.6149C25.8266 20.8432 25.2149 20.2163 24.4591 20.2163C23.7043 20.2163 23.0916 20.8422 23.0916 21.6149C23.0916 22.3867 23.7033 23.0135 24.4591 23.0135ZM21.7645 4.68692C21.8768 4.69378 21.9894 4.67794 22.0955 4.64035C22.2015 4.60275 22.2989 4.54416 22.3819 4.46809C22.4648 4.39202 22.5315 4.30001 22.5781 4.19757C22.6247 4.09514 22.6502 3.98436 22.653 3.87186C22.6618 3.75964 22.6481 3.64679 22.6126 3.53995C22.5771 3.43312 22.5206 3.33448 22.4464 3.24983C22.3722 3.16518 22.2818 3.09625 22.1805 3.0471C22.0793 2.99794 21.9692 2.96956 21.8568 2.96363C21.7446 2.9569 21.6322 2.9728 21.5263 3.0104C21.4204 3.048 21.3232 3.10652 21.2404 3.18248C21.1575 3.25845 21.0909 3.35029 21.0443 3.45256C20.9977 3.55482 20.9722 3.66541 20.9692 3.77774C20.9604 3.88997 20.9741 4.00282 21.0096 4.10965C21.0451 4.21648 21.1016 4.31513 21.1758 4.39978C21.25 4.48442 21.3404 4.55335 21.4417 4.60251C21.543 4.65166 21.6521 4.68099 21.7645 4.68692ZM7.5904 4.5401C7.68271 4.60167 7.78644 4.6441 7.89544 4.66485C8.00445 4.68561 8.11651 4.68427 8.22499 4.66093C8.33347 4.63758 8.43616 4.5927 8.52697 4.52894C8.61779 4.46518 8.69489 4.38384 8.75369 4.28974C8.8757 4.09858 8.91838 3.8674 8.87269 3.64527C8.827 3.42315 8.69653 3.22758 8.50899 3.1001C8.41664 3.03837 8.31284 2.99582 8.20374 2.97499C8.09464 2.95415 7.98246 2.95544 7.87387 2.9788C7.76528 3.00215 7.66248 3.04708 7.57159 3.11092C7.4807 3.17477 7.40356 3.25622 7.34475 3.35045C7.22275 3.54161 7.18006 3.7728 7.22575 3.99492C7.27144 4.21704 7.40285 4.41261 7.5904 4.5401ZM0.803576 15.2281C0.384753 15.4361 0.221929 15.9584 0.426164 16.3857C0.474224 16.4863 0.541877 16.5762 0.625154 16.6502C0.708432 16.7242 0.805655 16.7809 0.911121 16.8168C1.01659 16.8528 1.12817 16.8673 1.23932 16.8595C1.35047 16.8518 1.45895 16.8219 1.5584 16.7716C1.97722 16.5636 2.14005 16.0413 1.93581 15.614C1.88775 15.5136 1.82013 15.4238 1.73693 15.3498C1.65372 15.2759 1.55659 15.2193 1.45124 15.1833C1.34588 15.1474 1.23442 15.1329 1.12337 15.1405C1.01232 15.1482 0.902978 15.178 0.803576 15.2281ZM8.10052 27.3241C7.98827 27.3172 7.87579 27.333 7.76979 27.3706C7.66378 27.4081 7.56642 27.4666 7.48351 27.5426C7.40059 27.6186 7.33383 27.7105 7.28719 27.8128C7.24055 27.9151 7.215 28.0258 7.21205 28.1382C7.20322 28.2504 7.21695 28.3633 7.25243 28.4701C7.28791 28.577 7.34442 28.6756 7.41863 28.7602C7.49284 28.8449 7.58324 28.9138 7.68451 28.963C7.78578 29.0121 7.89587 29.0405 8.00828 29.0464C8.12045 29.0532 8.23283 29.0373 8.33873 28.9997C8.44462 28.9621 8.54187 28.9035 8.62468 28.8276C8.70749 28.7516 8.77417 28.6598 8.82075 28.5575C8.86733 28.4553 8.89286 28.3447 8.89581 28.2323C8.90464 28.1202 8.89094 28.0074 8.85551 27.9006C8.82009 27.7939 8.76367 27.6953 8.68956 27.6106C8.61545 27.526 8.52515 27.457 8.42399 27.4078C8.32283 27.3586 8.21285 27.3301 8.10052 27.3241ZM22.2756 27.47C22.1832 27.4085 22.0795 27.3662 21.9705 27.3455C21.8615 27.3248 21.7495 27.3262 21.6411 27.3495C21.5326 27.3729 21.43 27.4177 21.3391 27.4814C21.2483 27.5451 21.1712 27.6263 21.1123 27.7203C20.99 27.9116 20.9471 28.143 20.9928 28.3653C21.0385 28.5877 21.1692 28.7834 21.357 28.9109C21.4494 28.9725 21.5531 29.0148 21.6622 29.0355C21.7712 29.0562 21.8833 29.0548 21.9918 29.0313C22.1003 29.0079 22.2029 28.9629 22.2937 28.8991C22.3845 28.8352 22.4615 28.7538 22.5203 28.6596C22.6423 28.4685 22.685 28.2373 22.6393 28.0152C22.5936 27.793 22.4631 27.5975 22.2756 27.47ZM29.1433 15.2799C29.051 15.2184 28.9473 15.1761 28.8383 15.1554C28.7293 15.1347 28.6173 15.1361 28.5088 15.1594C28.4004 15.1828 28.2977 15.2276 28.2069 15.2913C28.1161 15.355 28.0389 15.4362 27.98 15.5302C27.858 15.7214 27.8154 15.9526 27.861 16.1747C27.9067 16.3968 28.0372 16.5924 28.2248 16.7199C28.3171 16.7816 28.4209 16.8241 28.53 16.845C28.6391 16.8658 28.7513 16.8645 28.8599 16.8412C28.9685 16.8178 29.0713 16.7729 29.1621 16.709C29.253 16.6452 29.3302 16.5637 29.389 16.4695C29.511 16.2783 29.5537 16.0472 29.508 15.825C29.4623 15.6029 29.3309 15.4073 29.1433 15.2799ZM28.4092 8.4121C28.4723 8.35188 28.5104 8.27016 28.516 8.18315C28.5215 8.09614 28.4942 8.01022 28.4393 7.94245C28.382 7.87833 28.3018 7.83918 28.216 7.83338C28.1302 7.82757 28.0455 7.85557 27.98 7.91139C27.917 7.9716 27.8789 8.05333 27.8733 8.14034C27.8677 8.22734 27.8951 8.31326 27.9499 8.38104C28.0073 8.44516 28.0874 8.48431 28.1732 8.49011C28.2591 8.49591 28.3438 8.46791 28.4092 8.4121ZM14.988 0.668097C15.0739 0.648054 15.1486 0.595414 15.1964 0.521299C15.2442 0.447185 15.2613 0.357402 15.244 0.270921C15.2036 0.0939798 15.0295 -0.0311966 14.8563 0.0102151C14.7708 0.0304659 14.6965 0.0830504 14.6489 0.156931C14.6013 0.230811 14.5843 0.320241 14.6012 0.40645C14.6417 0.584333 14.8149 0.709509 14.988 0.668097ZM1.56875 8.48551C1.74193 8.54763 1.9264 8.44315 1.98758 8.27657C2.0149 8.19261 2.00894 8.10137 1.97093 8.02168C1.93293 7.94199 1.86578 7.87994 1.78334 7.84833C1.60922 7.78621 1.42569 7.89068 1.36452 8.05727C1.3372 8.14123 1.34315 8.23247 1.38116 8.31216C1.41916 8.39185 1.48632 8.4539 1.56875 8.48551ZM1.4464 23.5763C1.38294 23.6365 1.3445 23.7183 1.33874 23.8055C1.33299 23.8928 1.36034 23.979 1.41534 24.0469C1.47268 24.111 1.55284 24.1502 1.63866 24.156C1.72449 24.1618 1.80918 24.1338 1.87463 24.078C1.93783 24.0179 1.9761 23.9362 1.98186 23.8492C1.98761 23.7622 1.96042 23.6762 1.90569 23.6083C1.84835 23.5442 1.7682 23.5051 1.68237 23.4993C1.59655 23.4935 1.51185 23.5205 1.4464 23.5763ZM28.2963 23.5039C28.1231 23.4417 27.9396 23.5462 27.8784 23.7128C27.8511 23.7968 27.857 23.888 27.895 23.9677C27.933 24.0474 28.0002 24.1094 28.0826 24.141C28.2558 24.2032 28.4403 24.0987 28.5005 23.9321C28.5279 23.8483 28.5221 23.7571 28.4842 23.6774C28.4464 23.5978 28.3785 23.5356 28.2963 23.5039Z" fill="#3859FF"/>
+<path d="M19.3866 20.5504C18.918 20.3949 18.4104 20.4031 17.947 20.5738C17.4836 20.7444 17.0919 21.0674 16.836 21.4897L16.8153 21.5311C16.3052 22.4186 15.2944 22.8883 14.2949 22.5645C13.7534 22.3884 13.3002 22.011 13.029 21.5104C12.986 21.364 12.9585 21.2135 12.9471 21.0614C12.9066 20.092 13.6313 19.277 14.58 19.2252H14.805C16.5499 19.2977 18.0295 17.9094 18.101 16.1146C18.1725 14.3198 16.8153 12.8167 15.06 12.7433H14.58C13.6313 12.7019 12.9678 11.9499 13.0083 10.9795C13.0083 10.7499 13.0497 10.5203 13.141 10.3217L13.1617 10.2595C13.205 10.1646 13.2427 10.0672 13.2746 9.96778C13.6417 8.76684 12.9885 7.49343 11.8252 7.1179C10.6713 6.75272 9.42616 7.38896 9.04875 8.60025C8.68169 9.76919 9.29345 11.021 10.4266 11.4285C10.6102 11.4906 10.7222 11.5123 10.8963 11.5433H10.9876C11.8864 11.6468 12.5904 12.3885 12.5593 13.3278C12.5499 13.6723 12.437 13.9857 12.2638 14.2464C11.9614 14.7295 11.7925 15.2842 11.7744 15.8539C11.7439 16.5152 11.9146 17.1701 12.2638 17.7325C12.437 17.9932 12.549 18.3066 12.5593 18.6511C12.6007 19.5904 11.988 20.3311 11.0902 20.4252H11.0695C10.9377 20.4252 10.7843 20.4563 10.661 20.477C9.43745 20.7593 8.71275 21.98 8.98757 23.2017C9.26333 24.4327 10.4671 25.1527 11.6106 24.892C11.9023 24.8289 12.1778 24.7064 12.42 24.5321C12.6622 24.3579 12.866 24.1357 13.0186 23.8793C13.2694 23.4422 13.6626 23.1044 14.1324 22.9221C14.6022 22.7399 15.1203 22.7243 15.6003 22.8779C16.1415 23.0548 16.5292 23.389 16.805 23.8586L16.8351 23.9113C17.0704 24.2972 17.5193 24.6944 18.0492 24.8506C19.2539 25.2158 20.4379 24.5475 20.8163 23.3786C21.2031 22.1579 20.5095 20.8939 19.3866 20.5297V20.5504ZM75.0064 14.1005C74.4454 14.1005 73.9862 14.5701 73.9862 15.1443C73.9862 15.7184 74.4454 16.188 75.0064 16.188C75.5673 16.188 76.0266 15.7174 76.0266 15.1433C76.0286 14.87 75.9225 14.607 75.7314 14.4117C75.5403 14.2163 75.2797 14.1045 75.0064 14.1005ZM38.1029 10.7395H41.4506C41.5214 10.7415 41.5886 10.7709 41.6381 10.8214C41.6876 10.872 41.7156 10.9398 41.716 11.0106C41.716 11.0426 41.716 11.084 41.6963 11.1047L37.9203 20.3941V22.2831H43.972V20.3631H40.4407C40.3698 20.3611 40.3025 20.3316 40.2529 20.2809C40.2034 20.2301 40.1756 20.162 40.1753 20.0911C40.1753 20.06 40.1753 20.028 40.196 19.997L43.972 10.7075V8.82049H38.1029V10.7395ZM49.6153 14.3198C49.6149 14.3906 49.5869 14.4584 49.5374 14.509C49.4879 14.5595 49.4207 14.5889 49.3499 14.5908H47.524C47.4887 14.5908 47.4536 14.5838 47.421 14.5701C47.3884 14.5564 47.3588 14.5364 47.334 14.5112C47.3092 14.4859 47.2897 14.456 47.2766 14.4232C47.2635 14.3903 47.2571 14.3552 47.2577 14.3198V8.81861H45.1862V22.2821H47.2577V16.7819C47.2578 16.7127 47.2842 16.6461 47.3315 16.5956C47.3789 16.5451 47.4437 16.5144 47.5127 16.5099H49.3396C49.4826 16.5099 49.5946 16.636 49.5946 16.7819V22.2821H51.6972V8.81861H49.5946V14.3188L49.6153 14.3198ZM55.2887 8.81861H53.2182V22.2831H55.2887V8.81861ZM59.8412 8.81861H56.7899V22.2831H58.8605V17.2214H59.8412C61.9127 17.2214 62.9226 16.0525 62.9226 13.8915V12.1381C62.9226 9.98849 61.9127 8.80825 59.8412 8.80825V8.81861ZM60.8511 14.0271C60.8511 14.9871 60.4934 15.3005 59.8412 15.3005H59.1259C59.0907 15.3002 59.0559 15.293 59.0235 15.2792C58.9911 15.2654 58.9617 15.2454 58.9371 15.2202C58.9125 15.1949 58.8932 15.1651 58.8802 15.1324C58.8672 15.0996 58.8608 15.0646 58.8615 15.0294V11.0106C58.8619 10.9398 58.8899 10.872 58.9394 10.8214C58.9889 10.7709 59.0561 10.7415 59.1269 10.7395H59.8412C60.4944 10.7395 60.8511 11.0426 60.8511 12.013V14.0271ZM67.9946 19.2035C67.9946 20.1635 67.5767 20.509 66.9236 20.509C66.2704 20.509 65.8525 20.1645 65.8525 19.2035V8.81955H63.78V19.069C63.78 21.2186 64.8313 22.4497 66.8624 22.4497C68.8934 22.4497 69.9447 21.2186 69.9447 19.068V8.81861H67.9852V19.2035H67.9946Z" fill="#3859FF"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/llm/zhipuai.svg b/app/components/base/icons/assets/public/llm/zhipuai.svg
new file mode 100644
index 0000000..016f97d
--- /dev/null
+++ b/app/components/base/icons/assets/public/llm/zhipuai.svg
@@ -0,0 +1,8 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="ZHIPU Square">
+<g id="shape">
+<path d="M11.8923 23.4987C11.8281 23.5139 11.7722 23.5535 11.7365 23.609C11.7008 23.6646 11.6881 23.7319 11.701 23.7966C11.7314 23.9293 11.862 24.0232 11.9919 23.9921C12.0561 23.9771 12.1119 23.9377 12.1476 23.8823C12.1833 23.8268 12.1961 23.7596 12.1832 23.695C12.1528 23.5616 12.0222 23.4677 11.8923 23.4987ZM15.4754 8.52697C16.3105 8.14085 16.681 7.13426 16.3027 6.27944C15.9243 5.42532 14.9403 5.04556 14.1046 5.43238C13.2695 5.81991 12.8982 6.8265 13.2766 7.68062C13.6549 8.53544 14.6389 8.91379 15.4754 8.52697ZM18.0935 13.6284C18.9723 13.358 19.47 12.4107 19.206 11.5129C18.9413 10.6143 18.0152 10.1053 17.1363 10.3757C16.2582 10.646 15.7599 11.5933 16.0246 12.4919C16.2893 13.3898 17.2154 13.8987 18.0935 13.6284ZM5.17233 10.7237C4.84426 11.0278 4.64662 11.4471 4.62083 11.8937C4.59503 12.3403 4.74309 12.7796 5.03398 13.1194C5.17709 13.2847 5.35177 13.4196 5.54777 13.5164C5.74377 13.6132 5.95713 13.6698 6.17533 13.683C6.39352 13.6961 6.61214 13.6655 6.81835 13.593C7.02455 13.5205 7.21418 13.4075 7.3761 13.2606C7.70417 12.9565 7.90182 12.5372 7.92761 12.0906C7.9534 11.644 7.80534 11.2047 7.51445 10.8649C7.37135 10.6996 7.19666 10.5647 7.00066 10.4679C6.80466 10.3711 6.5913 10.3145 6.37311 10.3013C6.15491 10.2882 5.93629 10.3188 5.73009 10.3913C5.52388 10.4638 5.33425 10.5768 5.17233 10.7237ZM19.7686 8.56368C20.1893 8.17968 20.2274 7.51473 19.8526 7.08415C19.7642 6.98189 19.6563 6.89838 19.5352 6.83853C19.414 6.77868 19.2821 6.74371 19.1472 6.73568C19.0123 6.72765 18.8772 6.74673 18.7498 6.79179C18.6224 6.83685 18.5054 6.90698 18.4055 6.99803C18.2027 7.18577 18.0805 7.44488 18.0649 7.72084C18.0492 7.99679 18.1412 8.26806 18.3215 8.47756C18.697 8.90815 19.3472 8.94697 19.7686 8.56368ZM11.946 4.6185C12.5121 4.6185 12.9716 4.14838 12.9716 3.56956C12.9716 2.99074 12.5128 2.52062 11.946 2.52062C11.3792 2.52062 10.9203 2.99003 10.9203 3.56956C10.9203 4.14838 11.3792 4.6185 11.946 4.6185ZM4.80527 8.82979C5.37139 8.82979 5.83022 8.36038 5.83022 7.78085C5.83022 7.20203 5.37139 6.73191 4.80457 6.73191C4.23845 6.73191 3.77892 7.20132 3.77892 7.78085C3.77892 8.35968 4.23845 8.82979 4.80527 8.82979ZM4.11563 15.4361C3.91267 15.6238 3.79043 15.8829 3.77463 16.1588C3.75883 16.4348 3.85071 16.7061 4.03092 16.9157C4.40645 17.3463 5.05727 17.3858 5.47798 17.0018C5.89939 16.6185 5.9368 15.9529 5.56269 15.5223C5.47435 15.42 5.36642 15.3365 5.24528 15.2766C5.12413 15.2168 4.99222 15.1818 4.85733 15.1738C4.72245 15.1658 4.58732 15.1848 4.45993 15.2299C4.33254 15.275 4.21547 15.3451 4.11563 15.4361ZM11.946 21.487C12.5121 21.487 12.9716 21.0176 12.9716 20.438C12.9716 19.8592 12.5128 19.3891 11.946 19.3891C11.3792 19.3891 10.9203 19.8592 10.9203 20.438C10.9203 21.0176 11.3792 21.487 11.946 21.487ZM19.0945 17.2601C19.6613 17.2601 20.1201 16.7907 20.1201 16.2112C20.1201 15.6324 19.6613 15.1623 19.0945 15.1623C18.5283 15.1623 18.0688 15.6317 18.0688 16.2112C18.0688 16.79 18.5276 17.2601 19.0945 17.2601ZM17.0735 3.51521C17.1578 3.52035 17.2422 3.50847 17.3217 3.48028C17.4013 3.45208 17.4743 3.40814 17.5365 3.35108C17.5987 3.29403 17.6488 3.22503 17.6837 3.1482C17.7186 3.07137 17.7377 2.98829 17.7399 2.90391C17.7465 2.81974 17.7362 2.7351 17.7096 2.65498C17.683 2.57486 17.6406 2.50087 17.5849 2.43739C17.5293 2.3739 17.4615 2.3222 17.3855 2.28534C17.3096 2.24847 17.227 2.22719 17.1427 2.22274C17.0586 2.21769 16.9743 2.22962 16.8949 2.25782C16.8154 2.28602 16.7425 2.32991 16.6804 2.38688C16.6183 2.44385 16.5683 2.51273 16.5333 2.58943C16.4984 2.66613 16.4793 2.74907 16.477 2.83332C16.4704 2.91749 16.4807 3.00213 16.5073 3.08225C16.5339 3.16238 16.5763 3.23636 16.632 3.29985C16.6876 3.36333 16.7554 3.41503 16.8314 3.4519C16.9073 3.48876 16.9892 3.51075 17.0735 3.51521ZM6.44292 3.40509C6.51215 3.45127 6.58995 3.48309 6.6717 3.49865C6.75346 3.51422 6.8375 3.51322 6.91886 3.49571C7.00022 3.4782 7.07724 3.44454 7.14535 3.39672C7.21347 3.3489 7.27129 3.2879 7.31539 3.21732C7.40689 3.07395 7.43891 2.90056 7.40464 2.73397C7.37038 2.56738 7.27252 2.4207 7.13186 2.32509C7.06261 2.27879 6.98475 2.24688 6.90293 2.23126C6.8211 2.21563 6.73697 2.2166 6.65552 2.23411C6.57408 2.25163 6.49698 2.28532 6.42882 2.33321C6.36065 2.38109 6.30279 2.44218 6.25869 2.51285C6.16718 2.65622 6.13517 2.82961 6.16944 2.9962C6.2037 3.1628 6.30226 3.30947 6.44292 3.40509ZM1.3528 11.4211C1.03869 11.5771 0.916569 11.9689 1.06975 12.2893C1.10579 12.3647 1.15653 12.4322 1.21899 12.4877C1.28145 12.5432 1.35436 12.5857 1.43346 12.6126C1.51256 12.6396 1.59625 12.6505 1.67961 12.6447C1.76298 12.6388 1.84434 12.6164 1.91892 12.5787C2.23304 12.4227 2.35516 12.031 2.20198 11.7105C2.16593 11.6352 2.11522 11.5678 2.05282 11.5124C1.99041 11.4569 1.91757 11.4145 1.83855 11.3875C1.75954 11.3606 1.67594 11.3497 1.59265 11.3554C1.50936 11.3612 1.42736 11.3835 1.3528 11.4211ZM6.82551 20.4931C6.74132 20.4879 6.65697 20.4998 6.57746 20.528C6.49796 20.5561 6.42494 20.6 6.36275 20.657C6.30057 20.7139 6.25049 20.7829 6.21551 20.8596C6.18054 20.9364 6.16137 21.0194 6.15916 21.1037C6.15254 21.1878 6.16284 21.2725 6.18945 21.3526C6.21606 21.4327 6.25844 21.5067 6.3141 21.5702C6.36975 21.6337 6.43755 21.6854 6.51351 21.7222C6.58946 21.7591 6.67202 21.7804 6.75633 21.7849C6.84046 21.7899 6.92475 21.778 7.00417 21.7498C7.08359 21.7216 7.15652 21.6777 7.21863 21.6207C7.28074 21.5637 7.33075 21.4949 7.36568 21.4182C7.40062 21.3415 7.41976 21.2585 7.42198 21.1743C7.4286 21.0902 7.41832 21.0056 7.39176 20.9255C7.36519 20.8454 7.32287 20.7715 7.26729 20.708C7.21171 20.6445 7.14399 20.5928 7.06812 20.5559C6.99225 20.519 6.90976 20.4976 6.82551 20.4931ZM17.4568 20.6025C17.3875 20.5564 17.3097 20.5247 17.228 20.5092C17.1463 20.4937 17.0623 20.4947 16.9809 20.5122C16.8996 20.5297 16.8226 20.5633 16.7545 20.6111C16.6864 20.6588 16.6285 20.7198 16.5843 20.7903C16.4926 20.9337 16.4605 21.1072 16.4947 21.274C16.529 21.4408 16.627 21.5876 16.7679 21.6832C16.8371 21.7294 16.915 21.7611 16.9968 21.7766C17.0785 21.7922 17.1626 21.7911 17.244 21.7735C17.3253 21.7559 17.4023 21.7222 17.4704 21.6743C17.5385 21.6264 17.5963 21.5654 17.6403 21.4947C17.7318 21.3514 17.7639 21.178 17.7296 21.0114C17.6953 20.8448 17.5975 20.6981 17.4568 20.6025ZM22.6076 11.4599C22.5384 11.4138 22.4606 11.3821 22.3788 11.3666C22.2971 11.3511 22.2131 11.3521 22.1318 11.3696C22.0504 11.3871 21.9734 11.4207 21.9053 11.4685C21.8372 11.5162 21.7793 11.5772 21.7352 11.6477C21.6437 11.791 21.6116 11.9644 21.6459 12.131C21.6802 12.2976 21.778 12.4443 21.9187 12.5399C21.9879 12.5862 22.0658 12.6181 22.1476 12.6337C22.2295 12.6494 22.3136 12.6484 22.395 12.6309C22.4765 12.6134 22.5536 12.5797 22.6217 12.5318C22.6899 12.4839 22.7478 12.4228 22.7919 12.3521C22.8834 12.2088 22.9154 12.0354 22.8811 11.8688C22.8468 11.7022 22.7483 11.5555 22.6076 11.4599ZM22.057 6.30909C22.1043 6.26393 22.1329 6.20263 22.1371 6.13738C22.1413 6.07212 22.1208 6.00768 22.0796 5.95685C22.0366 5.90876 21.9765 5.8794 21.9121 5.87505C21.8478 5.8707 21.7842 5.8917 21.7352 5.93356C21.6879 5.97872 21.6593 6.04001 21.6551 6.10527C21.6509 6.17052 21.6714 6.23496 21.7126 6.28579C21.7556 6.33388 21.8157 6.36325 21.8801 6.3676C21.9444 6.37195 22.0079 6.35095 22.057 6.30909ZM11.9912 0.501088C12.0556 0.486056 12.1116 0.446576 12.1474 0.39099C12.1832 0.335404 12.1961 0.268066 12.1832 0.203206C12.1528 0.0705002 12.0222 -0.0233822 11.8923 0.00767661C11.8282 0.0228647 11.7725 0.0623031 11.7368 0.117713C11.7011 0.173123 11.6883 0.240196 11.701 0.304853C11.7314 0.438265 11.8613 0.532147 11.9912 0.501088ZM1.92669 6.36415C2.05657 6.41073 2.19492 6.33238 2.2408 6.20744C2.2613 6.14447 2.25683 6.07605 2.22832 6.01628C2.19982 5.95651 2.14945 5.90997 2.08763 5.88626C1.95704 5.83968 1.81939 5.91803 1.77351 6.04297C1.75302 6.10594 1.75749 6.17437 1.78599 6.23413C1.8145 6.2939 1.86486 6.34044 1.92669 6.36415ZM1.83492 17.6823C1.78733 17.7274 1.7585 17.7887 1.75418 17.8542C1.74986 17.9196 1.77038 17.9842 1.81163 18.0352C1.85464 18.0833 1.91475 18.1127 1.97912 18.117C2.04349 18.1214 2.10701 18.1004 2.1561 18.0585C2.20349 18.0134 2.2322 17.9522 2.23651 17.8869C2.24083 17.8217 2.22044 17.7572 2.17939 17.7063C2.13638 17.6582 2.07627 17.6288 2.0119 17.6245C1.94753 17.6201 1.88401 17.6404 1.83492 17.6823ZM21.9723 17.6279C21.8425 17.5813 21.7048 17.6597 21.6589 17.7846C21.6384 17.8476 21.6429 17.916 21.6714 17.9758C21.6999 18.0355 21.7503 18.0821 21.8121 18.1058C21.942 18.1524 22.0803 18.074 22.1255 17.9491C22.146 17.8862 22.1417 17.8179 22.1133 17.7581C22.0849 17.6983 22.034 17.6518 21.9723 17.6279Z" fill="#3859FF"/>
+<path d="M15.2901 15.4128C14.9386 15.2962 14.5579 15.3024 14.2104 15.4304C13.8628 15.5583 13.5691 15.8005 13.3772 16.1173L13.3616 16.1483C12.979 16.814 12.2209 17.1662 11.4713 16.9234C11.0652 16.7913 10.7253 16.5083 10.5219 16.1328C10.4896 16.023 10.469 15.9102 10.4604 15.7961C10.4301 15.069 10.9736 14.4577 11.6852 14.4189H11.8539C13.1626 14.4733 14.2722 13.4321 14.3259 12.086C14.3795 10.7399 13.3616 9.61256 12.0452 9.5575H11.6852C10.9736 9.52644 10.476 8.96244 10.5063 8.23468C10.5063 8.06244 10.5374 7.89021 10.6059 7.74126L10.6214 7.69468C10.6539 7.62345 10.6821 7.55038 10.7061 7.47585C10.9814 6.57515 10.4915 5.62009 9.61904 5.33844C8.75362 5.06456 7.81974 5.54174 7.53668 6.45021C7.26139 7.32691 7.72021 8.26574 8.57009 8.57138C8.70774 8.61797 8.79174 8.63421 8.92233 8.6575H8.9908C9.66492 8.73515 10.1929 9.29138 10.1696 9.99585C10.1626 10.2542 10.0779 10.4893 9.94798 10.6848C9.72118 11.0472 9.59453 11.4632 9.58092 11.8904C9.55808 12.3864 9.68605 12.8776 9.94798 13.2994C10.0779 13.4949 10.1619 13.73 10.1696 13.9883C10.2007 14.6928 9.74115 15.2483 9.06774 15.3189H9.05221C8.95339 15.3189 8.83833 15.3422 8.74586 15.3577C7.82821 15.5695 7.28468 16.485 7.4908 17.4013C7.69762 18.3246 8.60045 18.8646 9.45809 18.669C9.67681 18.6217 9.88344 18.5298 10.0651 18.3991C10.2468 18.2685 10.3996 18.1018 10.5141 17.9095C10.7022 17.5817 10.997 17.3283 11.3494 17.1916C11.7018 17.0549 12.0904 17.0432 12.4503 17.1584C12.8562 17.2911 13.147 17.5417 13.3539 17.894L13.3764 17.9335C13.5529 18.2229 13.8896 18.5208 14.287 18.638C15.1906 18.9119 16.0786 18.4107 16.3623 17.534C16.6524 16.6184 16.1322 15.6704 15.2901 15.3973V15.4128Z" fill="#3859FF"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/model/checked.svg b/app/components/base/icons/assets/public/model/checked.svg
new file mode 100644
index 0000000..a355703
--- /dev/null
+++ b/app/components/base/icons/assets/public/model/checked.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M13.3332 4L5.99984 11.3333L2.6665 8" stroke="#155EEF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/other/Icon-3-dots.svg b/app/components/base/icons/assets/public/other/Icon-3-dots.svg
new file mode 100644
index 0000000..fee9b18
--- /dev/null
+++ b/app/components/base/icons/assets/public/other/Icon-3-dots.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5 6.5V5M8.93934 7.56066L10 6.5M10.0103 11.5H11.5103" stroke="#667085" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/other/default-tool-icon.svg b/app/components/base/icons/assets/public/other/default-tool-icon.svg
new file mode 100644
index 0000000..2c501c1
--- /dev/null
+++ b/app/components/base/icons/assets/public/other/default-tool-icon.svg
@@ -0,0 +1,9 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g opacity="0.5">
+<rect width="24" height="24" rx="6" fill="#E5E7EB"/>
+<rect x="0.25" y="0.25" width="23.5" height="23.5" rx="5.75" stroke="black" stroke-opacity="0.05" stroke-width="0.5"/>
+<path d="M11.8876 5.30588C11.9601 5.26959 12.019 5.21074 12.0553 5.13817L12.414 4.4208C12.5522 4.1444 12.9466 4.1444 13.0848 4.4208L13.4435 5.13817C13.4797 5.21074 13.5386 5.26959 13.6112 5.30588L14.3285 5.66457C14.6049 5.80276 14.6049 6.19719 14.3285 6.33539L13.6112 6.69407C13.5386 6.73036 13.4797 6.78921 13.4435 6.86178L13.0848 7.57916C12.9466 7.85555 12.5522 7.85555 12.414 7.57916L12.0553 6.86178C12.019 6.78921 11.9601 6.73036 11.8876 6.69407L11.1702 6.33539C10.8938 6.19719 10.8938 5.80276 11.1702 5.66457L11.8876 5.30588Z" fill="#667085"/>
+<path d="M7.88756 6.55588C7.96013 6.51959 8.01898 6.46074 8.05527 6.38817L8.28895 5.9208C8.42715 5.6444 8.82158 5.6444 8.95978 5.9208L9.19346 6.38817C9.22975 6.46074 9.2886 6.51959 9.36117 6.55588L9.82854 6.78956C10.1049 6.92776 10.1049 7.32219 9.82854 7.46039L9.36117 7.69407C9.2886 7.73036 9.22975 7.78921 9.19346 7.86178L8.95978 8.32915C8.82158 8.60555 8.42715 8.60555 8.28895 8.32915L8.05527 7.86178C8.01898 7.78921 7.96013 7.73036 7.88756 7.69407L7.42019 7.46039C7.14379 7.32219 7.14379 6.92776 7.42019 6.78957L7.88756 6.55588Z" fill="#667085"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M17.9417 5.91012C18.1985 6.08504 18.2648 6.43496 18.0899 6.6917L16.0062 9.74998H17.4375C17.7482 9.74998 18 10.0018 18 10.3125V18.1875C18 18.9124 17.4124 19.5 16.6875 19.5H7.3125C6.58763 19.5 6 18.9123 6 18.1875V10.3125C6 10.0018 6.25184 9.74998 6.5625 9.74998H14.6449L17.1601 6.05826C17.3351 5.80152 17.685 5.7352 17.9417 5.91012ZM10.3125 12.75C10.0018 12.75 9.75 13.0018 9.75 13.3125C9.75 13.6231 10.0018 13.875 10.3125 13.875H13.6875C13.9982 13.875 14.25 13.6231 14.25 13.3125C14.25 13.0018 13.9982 12.75 13.6875 12.75H10.3125Z" fill="#667085"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/other/message-3-fill.svg b/app/components/base/icons/assets/public/other/message-3-fill.svg
new file mode 100644
index 0000000..95c41f9
--- /dev/null
+++ b/app/components/base/icons/assets/public/other/message-3-fill.svg
@@ -0,0 +1,23 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="message-3-fill">
+<g id="Vector" filter="url(#filter0_d_1071_49501)">
+<path d="M2 8.99374C2 5.68349 4.67654 3 8.00066 3H15.9993C19.3134 3 22 5.69478 22 8.99374V21H8.00066C4.68659 21 2 18.3052 2 15.0063V8.99374ZM14 11V13H16V11H14ZM8 11V13H10V11H8Z" fill="url(#paint0_linear_1071_49501)"/>
+</g>
+</g>
+<defs>
+<filter id="filter0_d_1071_49501" x="1.5" y="2.75" width="21" height="19" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="0.25"/>
+<feGaussianBlur stdDeviation="0.25"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1071_49501"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1071_49501" result="shape"/>
+</filter>
+<linearGradient id="paint0_linear_1071_49501" x1="12" y1="3" x2="12" y2="21" gradientUnits="userSpaceOnUse">
+<stop stop-color="#296DFF"/>
+<stop offset="1" stop-color="#0BA5EC"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/other/row-struct.svg b/app/components/base/icons/assets/public/other/row-struct.svg
new file mode 100644
index 0000000..ba275ff
--- /dev/null
+++ b/app/components/base/icons/assets/public/other/row-struct.svg
@@ -0,0 +1,5 @@
+<svg width="624" height="48" viewBox="0 0 624 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="8" y="7" width="16" height="16" rx="5" fill="#F2F4F7"/>
+<rect x="32" y="10" width="233" height="10" rx="3" fill="#EAECF0"/>
+<rect x="32" y="31" width="345" height="6" rx="3" fill="#F2F4F7"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/plugins/google.svg b/app/components/base/icons/assets/public/plugins/google.svg
new file mode 100644
index 0000000..ac232b4
--- /dev/null
+++ b/app/components/base/icons/assets/public/plugins/google.svg
@@ -0,0 +1,6 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M22.501 12.2331C22.501 11.3698 22.4296 10.7398 22.2748 10.0864H12.2153V13.983H18.12C18.001 14.9514 17.3582 16.4097 15.9296 17.3897L15.9096 17.5202L19.0902 19.9349L19.3106 19.9564C21.3343 18.1247 22.501 15.4297 22.501 12.2331Z" fill="#4285F4"/>
+<path d="M12.2147 22.5001C15.1075 22.5001 17.5361 21.5667 19.3099 19.9567L15.929 17.39C15.0242 18.0083 13.8099 18.44 12.2147 18.44C9.38142 18.44 6.97669 16.6083 6.11947 14.0767L5.99382 14.0871L2.68656 16.5955L2.64331 16.7133C4.40519 20.1433 8.02423 22.5001 12.2147 22.5001Z" fill="#34A853"/>
+<path d="M6.11997 14.0765C5.89379 13.4232 5.76289 12.7231 5.76289 11.9998C5.76289 11.2764 5.89379 10.5765 6.10807 9.92313L6.10208 9.78398L2.75337 7.23535L2.64381 7.28642C1.91765 8.70977 1.50098 10.3081 1.50098 11.9998C1.50098 13.6915 1.91765 15.2897 2.64381 16.7131L6.11997 14.0765Z" fill="#FBBC05"/>
+<path d="M12.2148 5.55997C14.2267 5.55997 15.5838 6.41163 16.3576 7.12335L19.3814 4.23C17.5243 2.53834 15.1076 1.5 12.2148 1.5C8.02426 1.5 4.4052 3.85665 2.64331 7.28662L6.10759 9.92332C6.97672 7.39166 9.38146 5.55997 12.2148 5.55997Z" fill="#EB4335"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/plugins/partner-dark.svg b/app/components/base/icons/assets/public/plugins/partner-dark.svg
new file mode 100644
index 0000000..edb71d6
--- /dev/null
+++ b/app/components/base/icons/assets/public/plugins/partner-dark.svg
@@ -0,0 +1,58 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Partner">
+<mask id="mask0_6296_109592" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="1" y="0" width="18" height="20">
+<g id="Mask">
+<path d="M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z" fill="#932F19"/>
+<path d="M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z" fill="url(#paint0_linear_6296_109592)" fill-opacity="0.9"/>
+<path d="M7.47222 1.78016C8.45993 1.20991 8.90155 0.958665 9.36471 0.860217C9.78356 0.771189 10.2164 0.771189 10.6353 0.860217C11.0984 0.958665 11.5401 1.20991 12.5278 1.78016L15.8547 3.70096C16.8424 4.27121 17.2808 4.52805 17.5976 4.87994C17.8842 5.19815 18.1006 5.57304 18.2329 5.98028C18.3792 6.43061 18.3825 6.9387 18.3825 8.0792V11.9208C18.3825 13.0613 18.3792 13.5694 18.2329 14.0197C18.1006 14.427 17.8842 14.8018 17.5976 15.1201C17.2808 15.4719 16.8424 15.7288 15.8547 16.299L12.5278 18.2198C11.5401 18.7901 11.0984 19.0413 10.6353 19.1398C10.2164 19.2288 9.78356 19.2288 9.36471 19.1398C8.90155 19.0413 8.45993 18.7901 7.47222 18.2198L4.1453 16.299C3.1576 15.7288 2.7192 15.4719 2.40236 15.1201C2.11584 14.8018 1.89939 14.427 1.76707 14.0197C1.62075 13.5694 1.61752 13.0613 1.61752 11.9208V8.0792C1.61752 6.9387 1.62075 6.43061 1.76707 5.98028C1.89939 5.57304 2.11584 5.19815 2.40236 4.87994C2.7192 4.52805 3.1576 4.27121 4.1453 3.70096L7.47222 1.78016Z" stroke="url(#paint1_linear_6296_109592)" stroke-opacity="0.8" stroke-width="0.555556"/>
+</g>
+</mask>
+<g mask="url(#mask0_6296_109592)">
+<g id="badge-bg">
+<path d="M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z" fill="#932F19"/>
+<path d="M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z" fill="url(#paint2_linear_6296_109592)" fill-opacity="0.9"/>
+<path d="M7.58333 1.97261C8.58402 1.39487 8.99036 1.16698 9.41092 1.07758C9.7993 0.99503 10.2007 0.99503 10.5891 1.07758C11.0096 1.16698 11.416 1.39487 12.4167 1.97261L15.7436 3.89341C16.7443 4.47116 17.1448 4.70911 17.4325 5.02863C17.6982 5.3237 17.8989 5.67133 18.0216 6.04895C18.1544 6.45786 18.1603 6.92371 18.1603 8.0792V11.9208C18.1603 13.0763 18.1544 13.5421 18.0216 13.951C17.8989 14.3287 17.6982 14.6763 17.4325 14.9714C17.1448 15.2909 16.7443 15.5288 15.7436 16.1066L12.4167 18.0274C11.416 18.6051 11.0096 18.833 10.5891 18.9224C10.2007 19.005 9.7993 19.005 9.41092 18.9224C8.99036 18.833 8.58402 18.6051 7.58333 18.0274L4.25641 16.1066C3.25572 15.5288 2.8552 15.2909 2.5675 14.9714C2.30182 14.6763 2.10112 14.3287 1.97842 13.951C1.84556 13.5421 1.83975 13.0763 1.83975 11.9208V8.0792C1.83975 6.92371 1.84556 6.45786 1.97842 6.04895C2.10112 5.67133 2.30182 5.3237 2.5675 5.02863C2.8552 4.70911 3.25572 4.47116 4.25641 3.89341L7.58333 1.97261Z" stroke="url(#paint3_linear_6296_109592)" stroke-opacity="0.8"/>
+</g>
+<g id="handshake" filter="url(#filter0_d_6296_109592)">
+<path d="M11.0969 9.64841C10.895 9.44642 10.5675 9.44642 10.3656 9.64841L9.99991 10.0141C9.59596 10.418 8.94109 10.418 8.53717 10.0141C8.13325 9.61015 8.13325 8.95527 8.53717 8.55135L11.4491 5.63868C12.5371 5.39255 13.7238 5.69302 14.5709 6.54011C15.8221 7.79128 15.8807 9.78339 14.7469 11.104L13.6567 12.2081L11.0969 9.64841ZM5.42889 6.54011C6.55286 5.41614 8.27475 5.25452 9.57067 6.05524L7.80581 7.81999C6.99797 8.62783 6.99797 9.9376 7.80581 10.7454C8.58917 11.5288 9.8445 11.5525 10.6564 10.8167L10.7313 10.7454L12.9253 12.9395L10.7313 15.1336C10.3273 15.5375 9.67245 15.5375 9.26855 15.1336L5.42889 11.2939C4.11615 9.9812 4.11615 7.85284 5.42889 6.54011Z" fill="url(#paint4_linear_6296_109592)" shape-rendering="crispEdges"/>
+</g>
+<path id="highlight" opacity="0.5" d="M0 0H15.5556L5.26663 20H0V0Z" fill="url(#paint5_linear_6296_109592)"/>
+</g>
+</g>
+<defs>
+<filter id="filter0_d_6296_109592" x="3.94434" y="5.30556" width="12.1111" height="10.881" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="0.25"/>
+<feGaussianBlur stdDeviation="0.25"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6296_109592"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6296_109592" result="shape"/>
+</filter>
+<linearGradient id="paint0_linear_6296_109592" x1="0" y1="0" x2="22.6412" y2="1.78551" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FF692E"/>
+<stop offset="1" stop-color="#E04F16"/>
+</linearGradient>
+<linearGradient id="paint1_linear_6296_109592" x1="8.55422" y1="-1.28187e-07" x2="19.7802" y2="12.7346" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.2"/>
+<stop offset="1" stop-color="#FF4405"/>
+</linearGradient>
+<linearGradient id="paint2_linear_6296_109592" x1="0" y1="0" x2="22.6412" y2="1.78551" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FF692E"/>
+<stop offset="1" stop-color="#E04F16"/>
+</linearGradient>
+<linearGradient id="paint3_linear_6296_109592" x1="8.55422" y1="-1.28187e-07" x2="19.7802" y2="12.7346" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.2"/>
+<stop offset="1" stop-color="#FF4405"/>
+</linearGradient>
+<linearGradient id="paint4_linear_6296_109592" x1="9.99989" y1="5.55556" x2="9.99989" y2="15.4365" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.95"/>
+<stop offset="1" stop-color="white" stop-opacity="0.8"/>
+</linearGradient>
+<linearGradient id="paint5_linear_6296_109592" x1="-4.78632" y1="4.375" x2="16.2164" y2="10.4" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.12"/>
+<stop offset="1" stop-color="white" stop-opacity="0.2"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/plugins/partner-light.svg b/app/components/base/icons/assets/public/plugins/partner-light.svg
new file mode 100644
index 0000000..a4ae934
--- /dev/null
+++ b/app/components/base/icons/assets/public/plugins/partner-light.svg
@@ -0,0 +1,58 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Partner">
+<mask id="mask0_6291_109635" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="1" y="0" width="18" height="20">
+<g id="Mask">
+<path d="M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z" fill="#F9DBAF"/>
+<path d="M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z" fill="url(#paint0_linear_6291_109635)" fill-opacity="0.9"/>
+<path d="M7.47222 1.78016C8.45993 1.20991 8.90155 0.958665 9.36471 0.860217C9.78356 0.771189 10.2164 0.771189 10.6353 0.860217C11.0984 0.958665 11.5401 1.20991 12.5278 1.78016L15.8547 3.70096C16.8424 4.27121 17.2808 4.52805 17.5976 4.87994C17.8842 5.19815 18.1006 5.57304 18.2329 5.98028C18.3792 6.43061 18.3825 6.9387 18.3825 8.0792V11.9208C18.3825 13.0613 18.3792 13.5694 18.2329 14.0197C18.1006 14.427 17.8842 14.8018 17.5976 15.1201C17.2808 15.4719 16.8424 15.7288 15.8547 16.299L12.5278 18.2198C11.5401 18.7901 11.0984 19.0413 10.6353 19.1398C10.2164 19.2288 9.78356 19.2288 9.36471 19.1398C8.90155 19.0413 8.45993 18.7901 7.47222 18.2198L4.1453 16.299C3.1576 15.7288 2.7192 15.4719 2.40236 15.1201C2.11584 14.8018 1.89939 14.427 1.76707 14.0197C1.62075 13.5694 1.61752 13.0613 1.61752 11.9208V8.0792C1.61752 6.9387 1.62075 6.43061 1.76707 5.98028C1.89939 5.57304 2.11584 5.19815 2.40236 4.87994C2.7192 4.52805 3.1576 4.27121 4.1453 3.70096L7.47222 1.78016Z" stroke="url(#paint1_linear_6291_109635)" stroke-opacity="0.8" stroke-width="0.555556"/>
+</g>
+</mask>
+<g mask="url(#mask0_6291_109635)">
+<g id="badge-bg">
+<path d="M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z" fill="#F9DBAF"/>
+<path d="M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z" fill="url(#paint2_linear_6291_109635)" fill-opacity="0.9"/>
+<path d="M7.58333 1.97261C8.58402 1.39487 8.99036 1.16698 9.41092 1.07758C9.7993 0.99503 10.2007 0.99503 10.5891 1.07758C11.0096 1.16698 11.416 1.39487 12.4167 1.97261L15.7436 3.89341C16.7443 4.47116 17.1448 4.70911 17.4325 5.02863C17.6982 5.3237 17.8989 5.67133 18.0216 6.04895C18.1544 6.45786 18.1603 6.92371 18.1603 8.0792V11.9208C18.1603 13.0763 18.1544 13.5421 18.0216 13.951C17.8989 14.3287 17.6982 14.6763 17.4325 14.9714C17.1448 15.2909 16.7443 15.5288 15.7436 16.1066L12.4167 18.0274C11.416 18.6051 11.0096 18.833 10.5891 18.9224C10.2007 19.005 9.7993 19.005 9.41092 18.9224C8.99036 18.833 8.58402 18.6051 7.58333 18.0274L4.25641 16.1066C3.25572 15.5288 2.8552 15.2909 2.5675 14.9714C2.30182 14.6763 2.10112 14.3287 1.97842 13.951C1.84556 13.5421 1.83975 13.0763 1.83975 11.9208V8.0792C1.83975 6.92371 1.84556 6.45786 1.97842 6.04895C2.10112 5.67133 2.30182 5.3237 2.5675 5.02863C2.8552 4.70911 3.25572 4.47116 4.25641 3.89341L7.58333 1.97261Z" stroke="url(#paint3_linear_6291_109635)" stroke-opacity="0.8"/>
+</g>
+<g id="handshake" filter="url(#filter0_d_6291_109635)">
+<path d="M11.0969 9.64852C10.895 9.44652 10.5675 9.44652 10.3656 9.64852L9.99991 10.0142C9.59596 10.4181 8.94109 10.4181 8.53717 10.0142C8.13325 9.61025 8.13325 8.95537 8.53717 8.55146L11.4491 5.63879C12.5371 5.39265 13.7238 5.69313 14.5709 6.54022C15.8221 7.79139 15.8807 9.7835 14.7469 11.1041L13.6567 12.2083L11.0969 9.64852ZM5.42889 6.54022C6.55286 5.41625 8.27475 5.25463 9.57067 6.05534L7.80581 7.8201C6.99797 8.62794 6.99797 9.93771 7.80581 10.7456C8.58917 11.5289 9.8445 11.5526 10.6564 10.8168L10.7313 10.7456L12.9253 12.9396L10.7313 15.1337C10.3273 15.5376 9.67245 15.5376 9.26855 15.1337L5.42889 11.294C4.11615 9.98131 4.11615 7.85295 5.42889 6.54022Z" fill="url(#paint4_linear_6291_109635)" shape-rendering="crispEdges"/>
+</g>
+<path id="highlight" opacity="0.5" d="M0 0H15.5556L5.26663 20H0V0Z" fill="url(#paint5_linear_6291_109635)"/>
+</g>
+</g>
+<defs>
+<filter id="filter0_d_6291_109635" x="3.94434" y="5.30566" width="12.1111" height="10.8809" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="0.25"/>
+<feGaussianBlur stdDeviation="0.25"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6291_109635"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6291_109635" result="shape"/>
+</filter>
+<linearGradient id="paint0_linear_6291_109635" x1="0" y1="0" x2="22.6412" y2="1.78551" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FF692E"/>
+<stop offset="1" stop-color="#E04F16"/>
+</linearGradient>
+<linearGradient id="paint1_linear_6291_109635" x1="8.55422" y1="-1.28187e-07" x2="19.7802" y2="12.7346" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.95"/>
+<stop offset="1" stop-color="#E62E05"/>
+</linearGradient>
+<linearGradient id="paint2_linear_6291_109635" x1="0" y1="0" x2="22.6412" y2="1.78551" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FF692E"/>
+<stop offset="1" stop-color="#E04F16"/>
+</linearGradient>
+<linearGradient id="paint3_linear_6291_109635" x1="8.55422" y1="-1.28187e-07" x2="19.7802" y2="12.7346" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.95"/>
+<stop offset="1" stop-color="#E62E05"/>
+</linearGradient>
+<linearGradient id="paint4_linear_6291_109635" x1="9.99989" y1="5.55566" x2="9.99989" y2="15.4366" gradientUnits="userSpaceOnUse">
+<stop stop-color="white"/>
+<stop offset="1" stop-color="white" stop-opacity="0.9"/>
+</linearGradient>
+<linearGradient id="paint5_linear_6291_109635" x1="-4.78632" y1="4.375" x2="16.2164" y2="10.4" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.12"/>
+<stop offset="1" stop-color="white" stop-opacity="0.3"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/plugins/verified-dark.svg b/app/components/base/icons/assets/public/plugins/verified-dark.svg
new file mode 100644
index 0000000..aae1193
--- /dev/null
+++ b/app/components/base/icons/assets/public/plugins/verified-dark.svg
@@ -0,0 +1,58 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Verified">
+<mask id="mask0_6296_109593" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="20" height="20">
+<g id="Mask">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.08817 1.62521C9.14394 0.569383 10.8558 0.569374 11.9116 1.62521L12.8128 2.52641C12.9819 2.69542 13.2111 2.79037 13.4501 2.79037H14.5059C15.9991 2.79037 17.2095 4.00082 17.2095 5.49398V6.54981C17.2095 6.78882 17.3045 7.01805 17.4735 7.18706L18.3747 8.08826C19.4305 9.1441 19.4305 10.8559 18.3747 11.9118L17.4735 12.813C17.3045 12.982 17.2095 13.2112 17.2095 13.4502V14.506C17.2095 15.9992 15.9991 17.2096 14.5059 17.2096H13.4501C13.2111 17.2096 12.9819 17.3046 12.8128 17.4736L11.9116 18.3748C10.8558 19.4306 9.14403 19.4306 8.08817 18.3748L7.18696 17.4736C7.01795 17.3046 6.78873 17.2096 6.54972 17.2096H5.49389C4.00072 17.2096 2.79028 15.9992 2.79028 14.506V13.4502C2.79028 13.2112 2.69533 12.982 2.52632 12.813L1.62513 11.9118C0.569295 10.8559 0.569295 9.1441 1.62512 8.08826L2.52632 7.18706C2.69533 7.01806 2.79028 6.78882 2.79028 6.54981V5.49398C2.79028 4.00082 4.00072 2.79037 5.49389 2.79037H6.54972C6.78873 2.79037 7.01795 2.69542 7.18696 2.52641L8.08817 1.62521Z" fill="#003DC1"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.08817 1.62521C9.14394 0.569383 10.8558 0.569374 11.9116 1.62521L12.8128 2.52641C12.9819 2.69542 13.2111 2.79037 13.4501 2.79037H14.5059C15.9991 2.79037 17.2095 4.00082 17.2095 5.49398V6.54981C17.2095 6.78882 17.3045 7.01805 17.4735 7.18706L18.3747 8.08826C19.4305 9.1441 19.4305 10.8559 18.3747 11.9118L17.4735 12.813C17.3045 12.982 17.2095 13.2112 17.2095 13.4502V14.506C17.2095 15.9992 15.9991 17.2096 14.5059 17.2096H13.4501C13.2111 17.2096 12.9819 17.3046 12.8128 17.4736L11.9116 18.3748C10.8558 19.4306 9.14403 19.4306 8.08817 18.3748L7.18696 17.4736C7.01795 17.3046 6.78873 17.2096 6.54972 17.2096H5.49389C4.00072 17.2096 2.79028 15.9992 2.79028 14.506V13.4502C2.79028 13.2112 2.69533 12.982 2.52632 12.813L1.62513 11.9118C0.569295 10.8559 0.569295 9.1441 1.62512 8.08826L2.52632 7.18706C2.69533 7.01806 2.79028 6.78882 2.79028 6.54981V5.49398C2.79028 4.00082 4.00072 2.79037 5.49389 2.79037H6.54972C6.78873 2.79037 7.01795 2.69542 7.18696 2.52641L8.08817 1.62521Z" fill="url(#paint0_linear_6296_109593)" fill-opacity="0.9"/>
+<path d="M8.27881 1.81585L8.27881 1.81585C9.2293 0.865317 10.7704 0.865301 11.721 1.81585L12.6222 2.71705L12.6222 2.71709C12.8418 2.9366 13.1395 3.05997 13.4501 3.05997H14.5059C15.8502 3.05997 16.9399 4.14972 16.9399 5.49398V6.54981C16.9399 6.86036 17.0633 7.15813 17.2828 7.37768L17.2829 7.3777L18.1841 8.2789L18.3747 8.08826L18.1841 8.27891C19.1346 9.22945 19.1346 10.7706 18.1841 11.7211L17.2829 12.6224C17.0633 12.8419 16.9399 13.1397 16.9399 13.4502V14.506C16.9399 15.8503 15.8502 16.94 14.5059 16.94H13.4501C13.1395 16.94 12.8418 17.0634 12.6222 17.2829L12.6222 17.2829L11.721 18.1841C10.7704 19.1347 9.22939 19.1347 8.27881 18.1841L7.37761 17.2829L7.37759 17.2829C7.15804 17.0634 6.86027 16.94 6.54972 16.94H5.49389C4.14962 16.94 3.05989 15.8503 3.05989 14.506V13.4502C3.05989 13.1398 2.93655 12.8419 2.71696 12.6224C2.71696 12.6223 2.71695 12.6223 2.71694 12.6223L1.81577 11.7211C0.865224 10.7706 0.865226 9.22945 1.81576 8.2789L2.71696 7.3777C2.71696 7.3777 2.71696 7.3777 2.71696 7.3777C2.93654 7.15813 3.05989 6.86033 3.05989 6.54981V5.49398C3.05989 4.14972 4.14963 3.05997 5.49389 3.05997H6.54972C6.86024 3.05997 7.15803 2.93662 7.3776 2.71706L7.37761 2.71705L8.27881 1.81585Z" stroke="url(#paint1_linear_6296_109593)" stroke-opacity="0.8" stroke-width="0.539216"/>
+</g>
+</mask>
+<g mask="url(#mask0_6296_109593)">
+<g id="badge-bg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.08817 1.62521C9.14394 0.569383 10.8558 0.569374 11.9116 1.62521L12.8128 2.52641C12.9819 2.69542 13.2111 2.79037 13.4501 2.79037H14.5059C15.9991 2.79037 17.2095 4.00082 17.2095 5.49398V6.54981C17.2095 6.78882 17.3045 7.01805 17.4735 7.18706L18.3747 8.08826C19.4305 9.1441 19.4305 10.8559 18.3747 11.9118L17.4735 12.813C17.3045 12.982 17.2095 13.2112 17.2095 13.4502V14.506C17.2095 15.9992 15.9991 17.2096 14.5059 17.2096H13.4501C13.2111 17.2096 12.9819 17.3046 12.8128 17.4736L11.9116 18.3748C10.8558 19.4306 9.14403 19.4306 8.08817 18.3748L7.18696 17.4736C7.01795 17.3046 6.78873 17.2096 6.54972 17.2096H5.49389C4.00072 17.2096 2.79028 15.9992 2.79028 14.506V13.4502C2.79028 13.2112 2.69533 12.982 2.52632 12.813L1.62513 11.9118C0.569295 10.8559 0.569295 9.1441 1.62512 8.08826L2.52632 7.18706C2.69533 7.01806 2.79028 6.78882 2.79028 6.54981V5.49398C2.79028 4.00082 4.00072 2.79037 5.49389 2.79037H6.54972C6.78873 2.79037 7.01795 2.69542 7.18696 2.52641L8.08817 1.62521Z" fill="#003DC1"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.08817 1.62521C9.14394 0.569383 10.8558 0.569374 11.9116 1.62521L12.8128 2.52641C12.9819 2.69542 13.2111 2.79037 13.4501 2.79037H14.5059C15.9991 2.79037 17.2095 4.00082 17.2095 5.49398V6.54981C17.2095 6.78882 17.3045 7.01805 17.4735 7.18706L18.3747 8.08826C19.4305 9.1441 19.4305 10.8559 18.3747 11.9118L17.4735 12.813C17.3045 12.982 17.2095 13.2112 17.2095 13.4502V14.506C17.2095 15.9992 15.9991 17.2096 14.5059 17.2096H13.4501C13.2111 17.2096 12.9819 17.3046 12.8128 17.4736L11.9116 18.3748C10.8558 19.4306 9.14403 19.4306 8.08817 18.3748L7.18696 17.4736C7.01795 17.3046 6.78873 17.2096 6.54972 17.2096H5.49389C4.00072 17.2096 2.79028 15.9992 2.79028 14.506V13.4502C2.79028 13.2112 2.69533 12.982 2.52632 12.813L1.62513 11.9118C0.569295 10.8559 0.569295 9.1441 1.62512 8.08826L2.52632 7.18706C2.69533 7.01806 2.79028 6.78882 2.79028 6.54981V5.49398C2.79028 4.00082 4.00072 2.79037 5.49389 2.79037H6.54972C6.78873 2.79037 7.01795 2.69542 7.18696 2.52641L8.08817 1.62521Z" fill="url(#paint2_linear_6296_109593)" fill-opacity="0.9"/>
+<path d="M8.44172 1.97876L8.44173 1.97875C9.30224 1.11821 10.6975 1.11818 11.5581 1.97876L12.4593 2.87997L12.4593 2.88003C12.7221 3.1427 13.0784 3.29037 13.4501 3.29037H14.5059C15.723 3.29037 16.7095 4.27696 16.7095 5.49398V6.54981C16.7095 6.92148 16.8572 7.27785 17.1199 7.54057L17.1199 7.54061L18.0211 8.44182L18.3747 8.08826L18.0211 8.44182C18.8817 9.30239 18.8817 10.6976 18.0211 11.5582L17.1199 12.4594C16.8572 12.7222 16.7095 13.0786 16.7095 13.4502V14.506C16.7095 15.7231 15.723 16.7096 14.5059 16.7096H13.4501C13.0784 16.7096 12.7221 16.8573 12.4594 17.1199L12.4593 17.12L11.5581 18.0212C10.6975 18.8818 9.30233 18.8818 8.44172 18.0212L7.54052 17.12L7.54048 17.12C7.27775 16.8573 6.92139 16.7096 6.54972 16.7096H5.49389C4.27686 16.7096 3.29028 15.7231 3.29028 14.506V13.4502C3.29028 13.0787 3.14267 12.7222 2.87984 12.4594L1.97868 11.5582C1.11811 10.6976 1.11811 9.30238 1.97867 8.44181L2.87986 7.54062C2.87987 7.54062 2.87987 7.54061 2.87987 7.54061C3.14266 7.27784 3.29028 6.92143 3.29028 6.54981V5.49398C3.29028 4.27696 4.27687 3.29037 5.49389 3.29037H6.54972C6.92135 3.29037 7.27774 3.14273 7.54051 2.87998L7.54052 2.87997L8.44172 1.97876Z" stroke="url(#paint3_linear_6296_109593)" stroke-opacity="0.8"/>
+</g>
+<g id="check" filter="url(#filter0_d_6296_109593)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M13.4219 6.98132C13.8732 7.28924 13.9829 7.89545 13.667 8.33533L10.04 13.3858C9.87754 13.612 9.62408 13.7602 9.34287 13.7934C9.06166 13.8266 8.77923 13.7417 8.56605 13.5599L6.49346 11.7923C6.0789 11.4387 6.03689 10.8245 6.39963 10.4204C6.76238 10.0163 7.39252 9.97533 7.80709 10.3289L9.04316 11.3831L12.0328 7.22026C12.3487 6.78038 12.9706 6.6734 13.4219 6.98132Z" fill="url(#paint4_linear_6296_109593)" shape-rendering="crispEdges"/>
+</g>
+<path id="highlight" opacity="0.5" d="M0 0H15.5556L5.26663 20H0V0Z" fill="url(#paint5_linear_6296_109593)"/>
+</g>
+</g>
+<defs>
+<filter id="filter0_d_6296_109593" x="5.65283" y="6.55549" width="8.69458" height="7.995" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="0.25"/>
+<feGaussianBlur stdDeviation="0.25"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6296_109593"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6296_109593" result="shape"/>
+</filter>
+<linearGradient id="paint0_linear_6296_109593" x1="16.302" y1="19.1667" x2="-0.37184" y2="14.8201" gradientUnits="userSpaceOnUse">
+<stop stop-color="#296DFF"/>
+<stop offset="1" stop-color="#5289FF"/>
+</linearGradient>
+<linearGradient id="paint1_linear_6296_109593" x1="8.67462" y1="0.833336" x2="18.9651" y2="12.5067" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.2"/>
+<stop offset="1" stop-color="#296DFF"/>
+</linearGradient>
+<linearGradient id="paint2_linear_6296_109593" x1="16.302" y1="19.1667" x2="-0.37184" y2="14.8201" gradientUnits="userSpaceOnUse">
+<stop stop-color="#296DFF"/>
+<stop offset="1" stop-color="#5289FF"/>
+</linearGradient>
+<linearGradient id="paint3_linear_6296_109593" x1="8.67462" y1="0.833336" x2="18.9651" y2="12.5067" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.2"/>
+<stop offset="1" stop-color="#296DFF"/>
+</linearGradient>
+<linearGradient id="paint4_linear_6296_109593" x1="10.0001" y1="6.80549" x2="10.0001" y2="13.8005" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.95"/>
+<stop offset="1" stop-color="white" stop-opacity="0.8"/>
+</linearGradient>
+<linearGradient id="paint5_linear_6296_109593" x1="-4.78632" y1="4.375" x2="16.2164" y2="10.4" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.12"/>
+<stop offset="1" stop-color="white" stop-opacity="0.2"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/plugins/verified-light.svg b/app/components/base/icons/assets/public/plugins/verified-light.svg
new file mode 100644
index 0000000..c55f67f
--- /dev/null
+++ b/app/components/base/icons/assets/public/plugins/verified-light.svg
@@ -0,0 +1,58 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Verified">
+<mask id="mask0_6295_120949" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="20" height="20">
+<g id="Mask">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.08817 1.62512C9.14394 0.569299 10.8558 0.56929 11.9116 1.62512L12.8128 2.52633C12.9819 2.69533 13.2111 2.79028 13.4501 2.79028H14.5059C15.9991 2.79028 17.2095 4.00074 17.2095 5.4939V6.54972C17.2095 6.78874 17.3045 7.01796 17.4735 7.18697L18.3747 8.08818C19.4305 9.14401 19.4305 10.8559 18.3747 11.9117L17.4735 12.8129C17.3045 12.9819 17.2095 13.2112 17.2095 13.4502V14.5059C17.2095 15.9991 15.9991 17.2095 14.5059 17.2095H13.4501C13.2111 17.2095 12.9819 17.3045 12.8128 17.4735L11.9116 18.3747C10.8558 19.4305 9.14403 19.4305 8.08817 18.3747L7.18696 17.4735C7.01795 17.3045 6.78873 17.2095 6.54972 17.2095H5.49389C4.00072 17.2095 2.79028 15.9991 2.79028 14.5059V13.4502C2.79028 13.2112 2.69533 12.9819 2.52632 12.8129L1.62513 11.9117C0.569295 10.8559 0.569295 9.14401 1.62512 8.08818L2.52632 7.18697C2.69533 7.01797 2.79028 6.78874 2.79028 6.54972V5.4939C2.79028 4.00074 4.00072 2.79028 5.49389 2.79028H6.54972C6.78873 2.79028 7.01795 2.69533 7.18696 2.52633L8.08817 1.62512Z" fill="#B2CAFF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.08817 1.62512C9.14394 0.569299 10.8558 0.56929 11.9116 1.62512L12.8128 2.52633C12.9819 2.69533 13.2111 2.79028 13.4501 2.79028H14.5059C15.9991 2.79028 17.2095 4.00074 17.2095 5.4939V6.54972C17.2095 6.78874 17.3045 7.01796 17.4735 7.18697L18.3747 8.08818C19.4305 9.14401 19.4305 10.8559 18.3747 11.9117L17.4735 12.8129C17.3045 12.9819 17.2095 13.2112 17.2095 13.4502V14.5059C17.2095 15.9991 15.9991 17.2095 14.5059 17.2095H13.4501C13.2111 17.2095 12.9819 17.3045 12.8128 17.4735L11.9116 18.3747C10.8558 19.4305 9.14403 19.4305 8.08817 18.3747L7.18696 17.4735C7.01795 17.3045 6.78873 17.2095 6.54972 17.2095H5.49389C4.00072 17.2095 2.79028 15.9991 2.79028 14.5059V13.4502C2.79028 13.2112 2.69533 12.9819 2.52632 12.8129L1.62513 11.9117C0.569295 10.8559 0.569295 9.14401 1.62512 8.08818L2.52632 7.18697C2.69533 7.01797 2.79028 6.78874 2.79028 6.54972V5.4939C2.79028 4.00074 4.00072 2.79028 5.49389 2.79028H6.54972C6.78873 2.79028 7.01795 2.69533 7.18696 2.52633L8.08817 1.62512Z" fill="url(#paint0_linear_6295_120949)" fill-opacity="0.9"/>
+<path d="M8.27881 1.81577L8.27881 1.81576C9.2293 0.865233 10.7704 0.865217 11.721 1.81577L12.6222 2.71697L12.6222 2.71701C12.8418 2.93652 13.1395 3.05989 13.4501 3.05989H14.5059C15.8502 3.05989 16.9399 4.14963 16.9399 5.4939V6.54972C16.9399 6.86027 17.0633 7.15805 17.2828 7.3776L17.2829 7.37762L18.1841 8.27882L18.3747 8.08818L18.1841 8.27882C19.1346 9.22937 19.1346 10.7705 18.1841 11.7211L17.2829 12.6223C17.0633 12.8418 16.9399 13.1396 16.9399 13.4502V14.5059C16.9399 15.8502 15.8502 16.9399 14.5059 16.9399H13.4501C13.1395 16.9399 12.8418 17.0633 12.6222 17.2828L12.6222 17.2829L11.721 18.1841C10.7704 19.1346 9.22939 19.1346 8.27881 18.1841L7.37761 17.2829L7.37759 17.2828C7.15804 17.0633 6.86027 16.9399 6.54972 16.9399H5.49389C4.14962 16.9399 3.05989 15.8502 3.05989 14.5059V13.4502C3.05989 13.1397 2.93655 12.8418 2.71696 12.6223C2.71696 12.6223 2.71695 12.6223 2.71694 12.6222L1.81577 11.7211C0.865224 10.7705 0.865226 9.22936 1.81576 8.27882L2.71696 7.37762C2.71696 7.37762 2.71696 7.37762 2.71696 7.37762C2.93654 7.15805 3.05989 6.86024 3.05989 6.54972V5.4939C3.05989 4.14964 4.14963 3.05989 5.49389 3.05989H6.54972C6.86024 3.05989 7.15803 2.93653 7.3776 2.71698L7.37761 2.71697L8.27881 1.81577Z" stroke="url(#paint1_linear_6295_120949)" stroke-opacity="0.8" stroke-width="0.539216"/>
+</g>
+</mask>
+<g mask="url(#mask0_6295_120949)">
+<g id="badge-bg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.08817 1.62512C9.14394 0.569299 10.8558 0.56929 11.9116 1.62512L12.8128 2.52633C12.9819 2.69533 13.2111 2.79028 13.4501 2.79028H14.5059C15.9991 2.79028 17.2095 4.00074 17.2095 5.4939V6.54972C17.2095 6.78874 17.3045 7.01796 17.4735 7.18697L18.3747 8.08818C19.4305 9.14401 19.4305 10.8559 18.3747 11.9117L17.4735 12.8129C17.3045 12.9819 17.2095 13.2112 17.2095 13.4502V14.5059C17.2095 15.9991 15.9991 17.2095 14.5059 17.2095H13.4501C13.2111 17.2095 12.9819 17.3045 12.8128 17.4735L11.9116 18.3747C10.8558 19.4305 9.14403 19.4305 8.08817 18.3747L7.18696 17.4735C7.01795 17.3045 6.78873 17.2095 6.54972 17.2095H5.49389C4.00072 17.2095 2.79028 15.9991 2.79028 14.5059V13.4502C2.79028 13.2112 2.69533 12.9819 2.52632 12.8129L1.62513 11.9117C0.569295 10.8559 0.569295 9.14401 1.62512 8.08818L2.52632 7.18697C2.69533 7.01797 2.79028 6.78874 2.79028 6.54972V5.4939C2.79028 4.00074 4.00072 2.79028 5.49389 2.79028H6.54972C6.78873 2.79028 7.01795 2.69533 7.18696 2.52633L8.08817 1.62512Z" fill="#B2CAFF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.08817 1.62512C9.14394 0.569299 10.8558 0.56929 11.9116 1.62512L12.8128 2.52633C12.9819 2.69533 13.2111 2.79028 13.4501 2.79028H14.5059C15.9991 2.79028 17.2095 4.00074 17.2095 5.4939V6.54972C17.2095 6.78874 17.3045 7.01796 17.4735 7.18697L18.3747 8.08818C19.4305 9.14401 19.4305 10.8559 18.3747 11.9117L17.4735 12.8129C17.3045 12.9819 17.2095 13.2112 17.2095 13.4502V14.5059C17.2095 15.9991 15.9991 17.2095 14.5059 17.2095H13.4501C13.2111 17.2095 12.9819 17.3045 12.8128 17.4735L11.9116 18.3747C10.8558 19.4305 9.14403 19.4305 8.08817 18.3747L7.18696 17.4735C7.01795 17.3045 6.78873 17.2095 6.54972 17.2095H5.49389C4.00072 17.2095 2.79028 15.9991 2.79028 14.5059V13.4502C2.79028 13.2112 2.69533 12.9819 2.52632 12.8129L1.62513 11.9117C0.569295 10.8559 0.569295 9.14401 1.62512 8.08818L2.52632 7.18697C2.69533 7.01797 2.79028 6.78874 2.79028 6.54972V5.4939C2.79028 4.00074 4.00072 2.79028 5.49389 2.79028H6.54972C6.78873 2.79028 7.01795 2.69533 7.18696 2.52633L8.08817 1.62512Z" fill="url(#paint2_linear_6295_120949)" fill-opacity="0.9"/>
+<path d="M8.44172 1.97868L8.44173 1.97867C9.30224 1.11812 10.6975 1.1181 11.5581 1.97868L12.4593 2.87988L12.4593 2.87995C12.7221 3.14262 13.0784 3.29028 13.4501 3.29028H14.5059C15.723 3.29028 16.7095 4.27687 16.7095 5.4939V6.54972C16.7095 6.9214 16.8572 7.27776 17.1199 7.54049L17.1199 7.54053L18.0211 8.44173L18.3747 8.08818L18.0211 8.44174C18.8817 9.3023 18.8817 10.6976 18.0211 11.5582L17.1199 12.4594C16.8572 12.7221 16.7095 13.0785 16.7095 13.4502V14.5059C16.7095 15.723 15.723 16.7095 14.5059 16.7095H13.4501C13.0784 16.7095 12.7221 16.8573 12.4594 17.1198L12.4593 17.1199L11.5581 18.0211C10.6975 18.8817 9.30233 18.8817 8.44172 18.0211L7.54052 17.1199L7.54048 17.1199C7.27775 16.8572 6.92139 16.7095 6.54972 16.7095H5.49389C4.27686 16.7095 3.29028 15.723 3.29028 14.5059V13.4502C3.29028 13.0786 3.14267 12.7221 2.87984 12.4593L1.97868 11.5582C1.11811 10.6976 1.11811 9.3023 1.97867 8.44173L2.87986 7.54054C2.87987 7.54053 2.87987 7.54053 2.87987 7.54053C3.14266 7.27775 3.29028 6.92134 3.29028 6.54972V5.4939C3.29028 4.27688 4.27687 3.29028 5.49389 3.29028H6.54972C6.92135 3.29028 7.27774 3.14265 7.54051 2.87989L7.54052 2.87988L8.44172 1.97868Z" stroke="url(#paint3_linear_6295_120949)" stroke-opacity="0.8"/>
+</g>
+<g id="check" filter="url(#filter0_d_6295_120949)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M13.4219 6.98125C13.8732 7.28917 13.9829 7.89538 13.667 8.33526L10.04 13.3857C9.87754 13.6119 9.62408 13.7601 9.34287 13.7933C9.06166 13.8266 8.77923 13.7417 8.56605 13.5599L6.49346 11.7922C6.0789 11.4386 6.03689 10.8244 6.39963 10.4203C6.76238 10.0162 7.39252 9.97526 7.80709 10.3288L9.04316 11.3831L12.0328 7.22019C12.3487 6.78031 12.9706 6.67333 13.4219 6.98125Z" fill="url(#paint4_linear_6295_120949)" shape-rendering="crispEdges"/>
+</g>
+<path id="highlight" opacity="0.5" d="M0 0H15.5556L5.26663 20H0V0Z" fill="url(#paint5_linear_6295_120949)"/>
+</g>
+</g>
+<defs>
+<filter id="filter0_d_6295_120949" x="5.65283" y="6.55542" width="8.69458" height="7.99512" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="0.25"/>
+<feGaussianBlur stdDeviation="0.25"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6295_120949"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6295_120949" result="shape"/>
+</filter>
+<linearGradient id="paint0_linear_6295_120949" x1="16.302" y1="19.1666" x2="-0.37184" y2="14.82" gradientUnits="userSpaceOnUse">
+<stop stop-color="#155AEF"/>
+<stop offset="1" stop-color="#5289FF"/>
+</linearGradient>
+<linearGradient id="paint1_linear_6295_120949" x1="8.67462" y1="0.833252" x2="18.9651" y2="12.5066" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.95"/>
+<stop offset="1" stop-color="#155AEF"/>
+</linearGradient>
+<linearGradient id="paint2_linear_6295_120949" x1="16.302" y1="19.1666" x2="-0.37184" y2="14.82" gradientUnits="userSpaceOnUse">
+<stop stop-color="#155AEF"/>
+<stop offset="1" stop-color="#5289FF"/>
+</linearGradient>
+<linearGradient id="paint3_linear_6295_120949" x1="8.67462" y1="0.833252" x2="18.9651" y2="12.5066" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.95"/>
+<stop offset="1" stop-color="#155AEF"/>
+</linearGradient>
+<linearGradient id="paint4_linear_6295_120949" x1="10.0001" y1="6.80542" x2="10.0001" y2="13.8004" gradientUnits="userSpaceOnUse">
+<stop stop-color="white"/>
+<stop offset="1" stop-color="white" stop-opacity="0.9"/>
+</linearGradient>
+<linearGradient id="paint5_linear_6295_120949" x1="-4.78632" y1="4.375" x2="16.2164" y2="10.4" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.12"/>
+<stop offset="1" stop-color="white" stop-opacity="0.3"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/plugins/web-reader.svg b/app/components/base/icons/assets/public/plugins/web-reader.svg
new file mode 100644
index 0000000..61fbf69
--- /dev/null
+++ b/app/components/base/icons/assets/public/plugins/web-reader.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.59235 3.32566C10.3587 3.11341 11.1661 3 12 3C13.962 3 15.7773 3.62779 17.2561 4.69345C16.4693 5.21349 15.8824 5.77819 15.4756 6.38193C14.854 7.30445 14.6947 8.25844 14.8234 9.12887C14.9484 9.97416 15.3366 10.696 15.7446 11.2301C16.1402 11.7479 16.6256 12.181 17.0531 12.3946C18.1294 12.9327 19.3714 13.2022 20.2999 13.341C21.1399 13.4667 22.9206 13.8871 22.9865 12.5492C22.9955 12.3672 23 12.1841 23 12C23 5.92487 18.0751 1 12 1C5.92487 1 1 5.92487 1 12C1 18.0751 5.92487 23 12 23C12.1841 23 12.3672 22.9955 12.5492 22.9865C13.1008 22.9593 13.526 22.4902 13.4988 21.9385C13.4716 21.3869 13.0024 20.9618 12.4508 20.9889C12.3015 20.9963 12.1512 21 12 21C8.49063 21 5.45038 18.9914 3.96619 16.0611L4.93474 15.502L8.50745 16.1706C9.43309 16.3439 10.2876 15.6313 10.2834 14.6896L10.2694 11.5365L12.0952 8.41051C12.3911 7.90404 12.3646 7.27161 12.0274 6.79167L9.59235 3.32566Z" fill="#444CE7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M13.9456 12.6561C13.5777 12.5165 13.1621 12.6057 12.8839 12.884C12.6056 13.1623 12.5164 13.5778 12.656 13.9458L15.8228 22.2945C15.969 22.68 16.3367 22.9362 16.7489 22.9399C17.1611 22.9435 17.5333 22.6938 17.6863 22.3111L19.007 19.0071L22.311 17.6865C22.6937 17.5334 22.9434 17.1612 22.9397 16.749C22.9361 16.3368 22.6799 15.9691 22.2944 15.8229L13.9456 12.6561Z" fill="#444CE7"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/plugins/wikipedia.svg b/app/components/base/icons/assets/public/plugins/wikipedia.svg
new file mode 100644
index 0000000..a2f10d9
--- /dev/null
+++ b/app/components/base/icons/assets/public/plugins/wikipedia.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M23.8431 5.0001H19.2179H19.0609V5.15706V5.66001V5.81696H19.2179H19.5393C19.9131 5.81696 20.2502 6.00882 20.4411 6.33021C20.632 6.65161 20.6392 7.0394 20.4603 7.36765L15.3174 16.8077L12.9751 11.2238L15.1813 7.17527C15.6379 6.33743 16.5143 5.81696 17.4684 5.81696H17.5726H17.7296V5.66001V5.15706V5.0001H17.5726H12.9474H12.7905V5.15706V5.66001V5.81696H12.9474H13.2688C13.6426 5.81696 13.9797 6.00882 14.1706 6.33021C14.3615 6.65161 14.3687 7.0394 14.1899 7.36765L12.5896 10.305L11.1634 6.9051C11.0601 6.65867 11.0856 6.38965 11.2336 6.16714C11.3816 5.94462 11.6197 5.81696 11.887 5.81696H12.2526H12.4095V5.66001V5.15706V5.0001H12.2526H6.72092H6.56396V5.15706V5.66001V5.81696H6.72092H6.79699C7.88821 5.81696 8.866 6.46719 9.28817 7.47344L11.3954 12.497L9.04698 16.8077L4.89304 6.9051C4.78966 6.65867 4.81525 6.38965 4.9632 6.16714C5.11116 5.94462 5.34932 5.81696 5.61657 5.81696H6.17832H6.33527V5.66001V5.15706V5.0001H6.17832H0.156957H0V5.15706V5.66001V5.81696H0.156957H0.52654C1.61776 5.81696 2.59561 6.46719 3.01772 7.47344L7.80628 18.889C7.89004 19.0887 8.08425 19.2177 8.30111 19.2177C8.50014 19.2177 8.67588 19.1131 8.77125 18.9381L9.39589 17.7918L11.7807 13.4155L14.0767 18.889C14.1604 19.0886 14.3547 19.2176 14.5715 19.2176C14.7705 19.2176 14.9463 19.1131 15.0417 18.938L15.6663 17.7917L21.4517 7.17517C21.9083 6.33733 22.7847 5.81686 23.7388 5.81686H23.843H24V5.6599V5.15696V5H23.8431V5.0001Z" fill="#222A30"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/thought/data-set.svg b/app/components/base/icons/assets/public/thought/data-set.svg
new file mode 100644
index 0000000..bdee170
--- /dev/null
+++ b/app/components/base/icons/assets/public/thought/data-set.svg
@@ -0,0 +1,10 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_7847_32895)">
+<path d="M10.5 2.5C10.5 3.32843 8.48528 4 6 4C3.51472 4 1.5 3.32843 1.5 2.5M10.5 2.5C10.5 1.67157 8.48528 1 6 1C3.51472 1 1.5 1.67157 1.5 2.5M10.5 2.5V9.5C10.5 10.33 8.5 11 6 11C3.5 11 1.5 10.33 1.5 9.5V2.5M10.5 6C10.5 6.83 8.5 7.5 6 7.5C3.5 7.5 1.5 6.83 1.5 6" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_7847_32895">
+<rect width="12" height="12" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/thought/loading.svg b/app/components/base/icons/assets/public/thought/loading.svg
new file mode 100644
index 0000000..c666e17
--- /dev/null
+++ b/app/components/base/icons/assets/public/thought/loading.svg
@@ -0,0 +1,10 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_7998_4025)">
+<path d="M6 1.125V2.375M6 9V11M2.875 6H1.125M10.625 6H9.875M9.22855 9.22855L8.875 8.875M9.33211 2.70789L8.625 3.415M2.46079 9.53921L3.875 8.125M2.56434 2.60434L3.625 3.665" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_7998_4025">
+<rect width="12" height="12" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/thought/search.svg b/app/components/base/icons/assets/public/thought/search.svg
new file mode 100644
index 0000000..314b04d
--- /dev/null
+++ b/app/components/base/icons/assets/public/thought/search.svg
@@ -0,0 +1,10 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_7847_32899)">
+<path d="M10.5 10.5L8.75005 8.75M10 5.75C10 8.09721 8.09721 10 5.75 10C3.40279 10 1.5 8.09721 1.5 5.75C1.5 3.40279 3.40279 1.5 5.75 1.5C8.09721 1.5 10 3.40279 10 5.75Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_7847_32899">
+<rect width="12" height="12" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/thought/thought-list.svg b/app/components/base/icons/assets/public/thought/thought-list.svg
new file mode 100644
index 0000000..b8e17f0
--- /dev/null
+++ b/app/components/base/icons/assets/public/thought/thought-list.svg
@@ -0,0 +1,8 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M4 6C4 5.72386 4.22386 5.5 4.5 5.5L10.5 5.5C10.7761 5.5 11 5.72386 11 6C11 6.27614 10.7761 6.5 10.5 6.5L4.5 6.5C4.22386 6.5 4 6.27614 4 6Z" fill="#667085"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M4 3C4 2.72386 4.22386 2.5 4.5 2.5L10.5 2.5C10.7761 2.5 11 2.72386 11 3C11 3.27614 10.7761 3.5 10.5 3.5L4.5 3.5C4.22386 3.5 4 3.27614 4 3Z" fill="#667085"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M4 9C4 8.72386 4.22386 8.5 4.5 8.5L10.5 8.5C10.7761 8.5 11 8.72386 11 9C11 9.27614 10.7761 9.5 10.5 9.5L4.5 9.5C4.22386 9.5 4 9.27614 4 9Z" fill="#667085"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1 6C1 5.44772 1.44772 5 2 5C2.55228 5 3 5.44772 3 6C3 6.55228 2.55228 7 2 7C1.44772 7 1 6.55228 1 6Z" fill="#667085"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1 3C1 2.44772 1.44772 2 2 2C2.55228 2 3 2.44772 3 3C3 3.55228 2.55228 4 2 4C1.44772 4 1 3.55228 1 3Z" fill="#667085"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1 9C1 8.44772 1.44772 8 2 8C2.55228 8 3 8.44772 3 9C3 9.55228 2.55228 10 2 10C1.44772 10 1 9.55228 1 9Z" fill="#667085"/>
+</svg>
diff --git a/app/components/base/icons/assets/public/thought/web-reader.svg b/app/components/base/icons/assets/public/thought/web-reader.svg
new file mode 100644
index 0000000..1c2291e
--- /dev/null
+++ b/app/components/base/icons/assets/public/thought/web-reader.svg
@@ -0,0 +1,10 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_7847_32887)">
+<path d="M4.5 1.75V1M2.53033 2.53033L2 2M2.53033 6.5L2 7.03033M6.5 2.53033L7.03033 2M1.75 4.5H1M7.93224 8.09479L6.68637 10.4085C6.54404 10.6728 6.47287 10.805 6.38725 10.8384C6.31295 10.8674 6.22926 10.8592 6.16199 10.8164C6.08447 10.767 6.04028 10.6235 5.95191 10.3366L4.22259 4.72263C4.1504 4.48825 4.1143 4.37107 4.14335 4.29192C4.16865 4.22298 4.22298 4.16865 4.29192 4.14335C4.37107 4.1143 4.48825 4.1504 4.72262 4.2226L10.3366 5.95192C10.6235 6.0403 10.767 6.08449 10.8164 6.16201C10.8592 6.22928 10.8674 6.31297 10.8384 6.38727C10.805 6.47289 10.6728 6.54406 10.4085 6.68639L8.09479 7.93224C8.05551 7.95339 8.03587 7.96396 8.01868 7.97755C8.00341 7.98961 7.98961 8.00341 7.97755 8.01868C7.96396 8.03587 7.95339 8.05551 7.93224 8.09479Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_7847_32887">
+<rect width="12" height="12" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/tracing/langfuse-icon-big.svg b/app/components/base/icons/assets/public/tracing/langfuse-icon-big.svg
new file mode 100644
index 0000000..6ce0c27
--- /dev/null
+++ b/app/components/base/icons/assets/public/tracing/langfuse-icon-big.svg
@@ -0,0 +1,32 @@
+<svg width="111" height="24" viewBox="0 0 111 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Clip path group">
+<mask id="mask0_20135_18315" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="144" height="24">
+<g id="clip0_823_291">
+<path id="Vector" d="M143.36 0H0V24H143.36V0Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask0_20135_18315)">
+<g id="Group">
+<path id="Vector_2" d="M31.9258 17.3144V5.5896H33.5612V15.7456H39.5908V17.3144H31.9258ZM41.5502 11.1713C41.8806 9.47033 43.3343 8.36391 45.1845 8.36391C47.3155 8.36391 48.7197 9.60244 48.7197 12.03V15.3492C48.7197 15.729 48.8849 15.8942 49.2483 15.8942H49.6283V17.3144H49.1657C48.1085 17.3144 47.4807 16.7529 47.3155 15.9768C46.9852 16.7859 45.9609 17.5125 44.5898 17.5125C42.8222 17.5125 41.4016 16.5878 41.4016 15.019C41.4016 13.2024 42.7396 12.6905 44.755 12.3107L47.1173 11.8483C47.1008 10.5107 46.3409 9.85015 45.168 9.85015C44.1768 9.85015 43.45 10.4446 43.2517 11.2868L41.5502 11.1713ZM43.0865 14.9859C43.1031 15.5969 43.6317 16.1089 44.7881 16.1089C46.1096 16.1089 47.1503 15.1841 47.1503 13.6153V13.2355L45.2671 13.5657C44.0447 13.7804 43.0865 13.8795 43.0865 14.9859ZM51.8189 8.56208H53.2892L53.3387 10.0318C53.8013 8.90887 54.7759 8.36391 55.9488 8.36391C57.8981 8.36391 58.8563 9.80061 58.8563 11.6832V17.3144H57.2539V12.096C57.2539 10.5437 56.7418 9.73455 55.5358 9.73455C54.2638 9.73455 53.4213 10.5437 53.4213 12.096V17.3144H51.8189V8.56208ZM64.8465 16.852C62.6824 16.852 61.1461 15.118 61.1461 12.6575C61.1461 10.1144 62.6824 8.36391 64.8465 8.36391C66.0193 8.36391 67.0436 8.99143 67.44 9.89969L67.4565 8.56208H68.9929V16.3566C68.9763 18.7511 67.4565 19.9896 65.1108 19.9896C63.1945 19.9896 61.8069 18.9823 61.3939 17.463L63.0789 17.3474C63.4258 18.107 64.1031 18.5529 65.1108 18.5529C66.5315 18.5529 67.3739 17.9089 67.3905 16.7034V15.3988C66.9444 16.241 65.8872 16.852 64.8465 16.852ZM62.8311 12.641C62.8311 14.2924 63.7066 15.4483 65.1438 15.4483C66.548 15.4483 67.407 14.2924 67.4235 12.641C67.4565 11.0061 66.581 9.85015 65.1438 9.85015C63.7066 9.85015 62.8311 11.0061 62.8311 12.641ZM73.4961 8.18226C73.4961 6.56391 74.3055 5.5896 76.0897 5.5896H78.5015V7.00978H76.0566C75.495 7.00978 75.0985 7.43914 75.0985 8.14923V9.12354H78.3859V10.5437H75.0985V17.3144H73.4961V10.5437H71.1999V9.12354H73.4961V8.18226ZM88.3571 17.3144H86.8373L86.8207 15.8942C86.3582 16.9841 85.4001 17.5125 84.2767 17.5125C82.3605 17.5125 81.4189 16.0758 81.4189 14.1933V8.56208H83.0212V13.7804C83.0212 15.3327 83.5334 16.1419 84.6897 16.1419C85.9287 16.1419 86.7547 15.3327 86.7547 13.7804V8.56208H88.3571V17.3144ZM96.7925 11.3034C96.6108 10.3786 95.7518 9.85015 94.7275 9.85015C93.885 9.85015 93.1086 10.263 93.1251 11.0722C93.1251 11.9474 94.1824 12.1456 95.1571 12.3933C96.8255 12.8061 98.494 13.4171 98.494 15.052C98.494 16.7694 96.842 17.5125 95.0249 17.5125C92.9765 17.5125 91.308 16.3566 91.1758 14.5401L92.8608 14.441C93.026 15.4153 93.9016 16.0263 95.0249 16.0263C95.9004 16.0263 96.809 15.7951 96.809 14.9694C96.809 14.1107 95.7022 13.9621 94.7275 13.7309C93.0756 13.3346 91.4402 12.7235 91.4402 11.1382C91.4402 9.37125 93.026 8.36391 94.8762 8.36391C96.7264 8.36391 98.1636 9.47033 98.4444 11.2043L96.7925 11.3034ZM100.817 12.9382C100.817 10.1474 102.419 8.36391 104.88 8.36391C106.846 8.36391 108.63 9.63547 108.763 12.7896V13.4006H102.518C102.65 15.052 103.493 16.0263 104.88 16.0263C105.756 16.0263 106.549 15.5144 106.929 14.6391L108.63 14.7878C108.135 16.4557 106.632 17.5125 104.88 17.5125C102.419 17.5125 100.817 15.729 100.817 12.9382ZM102.568 12.1125H107.011C106.78 10.4446 105.872 9.85015 104.88 9.85015C103.608 9.85015 102.799 10.6924 102.568 12.1125Z" fill="black"/>
+<g id="Clip path group_2">
+<mask id="mask1_20135_18315" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="25" height="26">
+<g id="clip1_823_291">
+<path id="Vector_3" d="M24.5471 -0.0771484H0.308594V24.1529H24.5471V-0.0771484Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask1_20135_18315)">
+<g id="Group_2">
+<path id="Vector_4" d="M21.9423 16.8532C20.8746 18.2972 19.2396 19.2605 17.3946 19.4012C17.3372 19.4051 17.2797 19.4092 17.2215 19.4124C15.0582 19.5201 13.424 18.5334 12.3404 17.6174C10.4229 16.6027 8.92256 16.3471 8.04475 16.1261C7.4064 15.9654 6.84782 15.644 6.60842 15.4833C6.39617 15.3572 5.96925 15.0647 5.65086 14.5191C5.29416 13.9077 5.27342 13.3235 5.279 13.0752C5.46493 13.0504 5.70512 13.023 5.98601 13.0054C6.21582 12.9909 6.43845 12.9853 6.68823 12.9844C8.62571 12.982 10.1283 13.0768 11.2215 13.5622C11.8128 13.8241 12.361 14.1728 12.8493 14.5979C13.4774 15.1459 14.7613 16.012 16.3437 15.7164C16.5448 15.6786 16.7379 15.6287 16.9239 15.5677C17.4935 15.4857 18.4679 15.4198 19.6154 15.7243C20.7046 16.0136 21.4882 16.5134 21.9423 16.8532Z" fill="#0A60B5" stroke="black" stroke-width="2.56" stroke-miterlimit="10"/>
+<path id="Vector_5" d="M21.8003 6.90944C21.319 6.28602 20.7339 5.69669 20.043 5.29456C19.3066 4.86626 18.367 4.49744 17.2306 4.3975C14.4541 4.15321 12.5557 5.69273 12.2099 5.98382C11.7796 6.38753 10.0582 7.81602 7.98609 8.60917C7.62509 8.73768 6.93016 9.0414 6.31253 9.71961C5.82401 10.2557 5.58492 10.8046 5.46777 11.1457C5.71483 11.1798 5.96985 11.2044 6.23284 11.2194C8.2419 11.3313 9.96813 11.3424 11.0974 10.7896C11.8433 10.4247 12.4976 9.90517 13.0618 9.29681C14.0787 8.19987 15.5618 7.71051 16.9118 8.04605C17.5318 8.13247 18.6117 8.19833 19.8605 7.81602C20.7228 7.55189 21.3652 7.21957 21.8003 6.90944Z" fill="#0A60B5" stroke="black" stroke-width="2.56" stroke-miterlimit="10"/>
+<path id="Vector_6" d="M2.95884 7.37229C2.1886 6.97653 1.58732 6.52001 1.17721 6.16263C0.947963 5.96275 0.591797 6.12665 0.591797 6.43206V8.92893C0.591797 9.03766 0.640978 9.14079 0.725063 9.20796L1.74835 10.1922C1.80229 9.79638 1.9181 9.25834 2.17829 8.66347C2.4234 8.10227 2.71769 7.67288 2.95884 7.37229Z" fill="#0A60B5" stroke="black" stroke-width="2.56" stroke-miterlimit="10"/>
+<path id="Vector_7" d="M19.4326 12.9446C19.5497 12.584 19.6146 12.2056 19.6243 11.8201C19.6323 11.5156 19.597 11.4018 19.5441 11.1069C20.0886 11.0155 20.7686 10.8664 21.3886 10.7061C22.0438 10.537 22.5282 10.3406 23.0727 10.145C23.1521 10.5257 23.2355 10.7109 23.2644 10.993C23.2916 11.2591 23.3085 11.5348 23.3132 11.8201C23.3277 12.7066 23.2194 13.5105 23.0526 14.215C22.5394 13.9488 21.9299 13.6732 21.2282 13.4311C20.5754 13.2051 19.9683 13.0512 19.4326 12.9446Z" fill="#0A60B5" stroke="black" stroke-width="2.56" stroke-miterlimit="10"/>
+<path id="Vector_8" d="M1.15342 18.2166C0.918616 18.3871 0.591797 18.2191 0.591797 17.927V14.8605C0.591797 14.7676 0.627493 14.6796 0.689366 14.614C0.720303 14.5812 0.748859 14.5628 0.761552 14.5556L1.77532 14.1204C1.84988 14.5268 1.97284 15.0133 2.17829 15.5429C2.41864 16.1621 2.7042 16.6637 2.95884 17.0454C2.35676 17.4358 1.75469 17.8263 1.15342 18.2166Z" fill="#0A60B5" stroke="black" stroke-width="2.56" stroke-miterlimit="10"/>
+<path id="Vector_9" fill-rule="evenodd" clip-rule="evenodd" d="M7.68233 4.81872C9.70993 4.71818 11.2261 5.56713 12.0077 6.13451C11.4161 6.65689 9.81509 7.91742 7.92157 8.64547C7.79386 8.69117 7.62441 8.7588 7.43136 8.85733C6.06118 9.53194 5.24643 10.8764 5.21006 12.3127C5.20395 12.5545 5.21629 12.7953 5.24827 13.032C5.24481 13.0325 5.24136 13.033 5.23794 13.0334C5.23236 13.2797 5.2531 13.8593 5.60958 14.4661C5.9278 15.0073 6.35446 15.2975 6.5666 15.4227C6.67187 15.4928 6.83891 15.5939 7.04732 15.6986C7.29214 15.829 7.56361 15.9383 7.86305 16.0229C7.90892 16.0362 7.95532 16.0488 8.00211 16.0605C8.11111 16.0877 8.22985 16.1159 8.35794 16.1463C9.26137 16.3607 10.6303 16.6854 12.3087 17.5673C12.4783 17.7095 12.6609 17.8529 12.8568 17.993C12.7973 18.0463 12.7472 18.0927 12.7067 18.1309C12.3606 18.4235 10.4609 19.9709 7.68233 19.7254C6.5451 19.625 5.60404 19.2542 4.86793 18.8238C3.62779 18.0991 2.69071 16.9526 2.17951 15.6109C1.85014 14.7459 1.56303 13.6274 1.5423 12.3111C1.52395 11.187 1.70419 10.1969 1.94983 9.37575C2.70188 6.86682 4.89504 5.0268 7.5093 4.82989L7.50941 4.82988C7.5668 4.82589 7.62418 4.82191 7.68233 4.81872ZM21.8835 16.7762C21.4284 16.4391 20.6476 15.947 19.5661 15.6619C18.4192 15.3597 17.4455 15.4251 16.8761 15.5064C16.6902 15.567 16.4972 15.6164 16.2963 15.6539C14.7148 15.9473 13.4316 15.0879 12.8039 14.5442C12.6819 14.4387 12.5561 14.338 12.4269 14.2422C12.8493 13.871 13.3137 13.5508 13.82 13.3021C14.9501 12.7473 16.6775 12.7584 18.6881 12.87C21.4586 13.0247 23.3726 14.3441 24.1367 14.95C24.222 15.0177 24.2707 15.1198 24.2707 15.2282V17.718C24.2707 18.0233 23.9125 18.1867 23.682 17.9867C23.2692 17.6292 22.6618 17.1721 21.8835 16.7762ZM13.0009 9.33672C12.8193 9.5334 12.6283 9.72087 12.4279 9.89693C12.8159 10.1847 13.2353 10.4283 13.6788 10.6234C14.7715 11.1049 16.2732 11.199 18.2095 11.1966C21.0495 11.1926 23.1406 10.1235 24.1 9.54153C24.206 9.47696 24.2707 9.36218 24.2707 9.23781V6.182C24.2707 5.89101 23.9421 5.72359 23.706 5.8934C23.1472 6.29546 22.3162 6.80863 21.2445 7.21229C20.8586 7.43971 20.3776 7.6719 19.8046 7.84826C18.5548 8.23249 17.4742 8.16632 16.8538 8.07944C15.5028 7.74222 14.0186 8.2341 13.0009 9.33672Z" fill="#E11312"/>
+<path id="Vector_10" d="M12.0069 6.13459L12.21 6.36447L12.4968 6.11122L12.1871 5.88642L12.0069 6.13459ZM7.68154 4.8188L7.66636 4.51247L7.66557 4.51251L7.66477 4.51255L7.68154 4.8188ZM7.92078 8.64555L8.0241 8.9344L8.02755 8.93317L8.03092 8.93187L7.92078 8.64555ZM7.43056 8.85741L7.56612 9.13253L7.56811 9.13161L7.57008 9.13062L7.43056 8.85741ZM5.24747 13.0321L5.28765 13.3361L5.59271 13.2959L5.55152 12.991L5.24747 13.0321ZM5.23715 13.0335L5.1967 12.7295L4.93636 12.764L4.93041 13.0265L5.23715 13.0335ZM6.56581 15.4228L6.736 15.1676L6.729 15.1629L6.72175 15.1587L6.56581 15.4228ZM7.04653 15.6987L7.19079 15.428L7.18759 15.4263L7.18433 15.4247L7.04653 15.6987ZM7.86225 16.023L7.94762 15.7285L7.9467 15.7282L7.94571 15.7279L7.86225 16.023ZM12.3079 17.5673L12.5052 17.3324L12.4799 17.3112L12.4506 17.2958L12.3079 17.5673ZM12.856 17.9931L13.0606 18.2216L13.3458 17.9664L13.0346 17.7437L12.856 17.9931ZM12.7059 18.131L12.904 18.3652L12.9105 18.3598L12.9165 18.3541L12.7059 18.131ZM4.86713 18.8239L5.02207 18.5591L5.02197 18.559L4.86713 18.8239ZM1.5415 12.3112L1.84828 12.3064L1.84827 12.3062L1.5415 12.3112ZM1.94903 9.37583L1.65512 9.28773L1.65507 9.28796L1.94903 9.37583ZM7.5085 4.82997L7.48794 4.52395L7.48669 4.52403L7.48544 4.52413L7.5085 4.82997ZM7.50862 4.82996L7.52918 5.13598L7.52987 5.13593L7.50862 4.82996ZM19.5653 15.662L19.6435 15.3654H19.6435L19.5653 15.662ZM21.8827 16.7763L21.7001 17.0227L21.7207 17.038L21.7436 17.0496L21.8827 16.7763ZM16.8753 15.5065L16.8319 15.2028L16.8055 15.2066L16.7801 15.2149L16.8753 15.5065ZM16.2955 15.654L16.3515 15.9555H16.3517L16.2955 15.654ZM12.8031 14.5443L13.0041 14.3125L13.0038 14.3122L12.8031 14.5443ZM12.4261 14.2422L12.2236 14.0119L11.9383 14.2625L12.2434 14.4886L12.4261 14.2422ZM18.6873 12.8701L18.7044 12.5638H18.7042L18.6873 12.8701ZM24.1359 14.95L24.3267 14.7099L24.3266 14.7098L24.1359 14.95ZM23.6813 17.9868L23.8824 17.7552L23.8821 17.7549L23.6813 17.9868ZM12.4271 9.89701L12.2246 9.66667L11.9394 9.91717L12.2444 10.1434L12.4271 9.89701ZM13.678 10.6234L13.8018 10.3428L13.8016 10.3427L13.678 10.6234ZM18.2087 11.1967L18.2091 11.5034H18.2092L18.2087 11.1967ZM24.0992 9.54161L24.2584 9.80384L24.2588 9.80361L24.0992 9.54161ZM21.2437 7.21237L21.1355 6.92536L21.1107 6.9347L21.088 6.94815L21.2437 7.21237ZM16.853 8.07952L16.7786 8.37711L16.7943 8.38102L16.8104 8.38324L16.853 8.07952ZM12.1871 5.88642C11.3742 5.29623 9.7896 4.40718 7.66636 4.51247L7.69672 5.12514C9.62867 5.02934 11.0765 5.83819 11.8266 6.38275L12.1871 5.88642ZM8.03092 8.93187C9.97246 8.18534 11.605 6.89867 12.21 6.36447L11.8038 5.90471C11.2255 6.41528 9.65613 7.64973 7.81063 8.35932L8.03092 8.93187ZM7.57008 9.13062C7.74904 9.03922 7.90597 8.97657 8.0241 8.9344L7.81746 8.35679C7.68016 8.40586 7.49818 8.47855 7.29104 8.58429L7.57008 9.13062ZM5.51598 12.3205C5.54953 10.9957 6.30059 9.75569 7.56612 9.13253L7.29499 8.5823C5.82017 9.30843 4.94173 10.7573 4.90255 12.3051L5.51598 12.3205ZM5.55152 12.991C5.52184 12.7713 5.51027 12.5468 5.51598 12.3205L4.90255 12.3051C4.89604 12.5623 4.90915 12.8196 4.94341 13.0731L5.55152 12.991ZM5.27759 13.3375C5.28094 13.3371 5.28429 13.3366 5.28765 13.3361L5.20729 12.728C5.20373 12.7285 5.2002 12.729 5.1967 12.7295L5.27759 13.3375ZM5.87334 14.3108C5.55756 13.7734 5.53893 13.2588 5.54388 13.0404L4.93041 13.0265C4.92419 13.3008 4.94703 13.9455 5.34423 14.6215L5.87334 14.3108ZM6.72175 15.1587C6.53331 15.0475 6.15501 14.7899 5.87331 14.3107L5.34423 14.6215C5.69895 15.2249 6.17402 15.5477 6.40985 15.6869L6.72175 15.1587ZM7.18433 15.4247C6.98719 15.3256 6.83096 15.2309 6.736 15.1676L6.39562 15.678C6.51119 15.755 6.68904 15.8623 6.90873 15.9728L7.18433 15.4247ZM7.94571 15.7279C7.66622 15.6489 7.41526 15.5476 7.19079 15.428L6.90227 15.9694C7.16743 16.1106 7.4594 16.2279 7.7788 16.3182L7.94571 15.7279ZM8.07572 15.763C8.03277 15.7523 7.99004 15.7407 7.94762 15.7285L7.7768 16.3176C7.8262 16.3319 7.87621 16.3455 7.92691 16.3581L8.07572 15.763ZM8.42802 15.8479C8.29947 15.8174 8.18257 15.7897 8.07572 15.763L7.92691 16.3581C8.03798 16.3859 8.15864 16.4145 8.28627 16.4448L8.42802 15.8479ZM12.4506 17.2958C10.7369 16.3954 9.3372 16.0636 8.42802 15.8479L8.28627 16.4448C9.18402 16.6578 10.522 16.9755 12.1651 17.8389L12.4506 17.2958ZM13.0346 17.7437C12.8458 17.6086 12.6693 17.4702 12.5052 17.3324L12.1107 17.8023C12.2855 17.949 12.4745 18.0973 12.6774 18.2425L13.0346 17.7437ZM12.9165 18.3541C12.9555 18.3173 13.0035 18.2727 13.0606 18.2216L12.6514 17.7646C12.5895 17.8199 12.5373 17.8684 12.4953 17.908L12.9165 18.3541ZM7.65454 20.031C10.5596 20.2878 12.5414 18.6718 12.904 18.3652L12.5078 17.8968C12.1782 18.1755 10.3606 19.6543 7.70861 19.42L7.65454 20.031ZM4.7122 19.0885C5.48062 19.538 6.46494 19.9259 7.65455 20.0311L7.70861 19.42C6.62375 19.3242 5.72585 18.9707 5.02207 18.5591L4.7122 19.0885ZM1.89197 15.7201C2.42664 17.1235 3.4083 18.3266 4.71229 19.0886L5.02197 18.559C3.84569 17.8717 2.95318 16.7819 2.46543 15.5018L1.89197 15.7201ZM1.23472 12.316C1.25612 13.6744 1.55244 14.8284 1.89197 15.7201L2.46546 15.5019C2.14624 14.6635 1.86835 13.5804 1.84828 12.3064L1.23472 12.316ZM1.65507 9.28796C1.40184 10.1345 1.21579 11.1561 1.23472 12.3163L1.84827 12.3062C1.83052 11.2181 2.00495 10.2594 2.24298 9.4637L1.65507 9.28796ZM7.48544 4.52413C4.73874 4.73102 2.44195 6.66285 1.65512 9.28773L2.24293 9.46385C2.96021 7.07095 5.04976 5.32275 7.53155 5.13581L7.48544 4.52413ZM7.48805 4.52394L7.48794 4.52395L7.52906 5.13599L7.52918 5.13598L7.48805 4.52394ZM7.66477 4.51255C7.60399 4.51588 7.54439 4.52003 7.48736 4.52399L7.52987 5.13593C7.58761 5.13192 7.64276 5.1281 7.69834 5.12505L7.66477 4.51255ZM19.4871 15.9585C20.5195 16.2307 21.2651 16.7006 21.7001 17.0227L22.0654 16.5298C21.5901 16.1778 20.7741 15.6634 19.6435 15.3654L19.4871 15.9585ZM16.9186 15.8101C17.4624 15.7325 18.3923 15.6701 19.4871 15.9585L19.6435 15.3654C18.4447 15.0495 17.427 15.1179 16.8319 15.2028L16.9186 15.8101ZM16.3517 15.9555C16.5658 15.9156 16.7717 15.8629 16.9704 15.7981L16.7801 15.2149C16.6071 15.2713 16.4271 15.3174 16.2392 15.3524L16.3517 15.9555ZM12.6023 14.776C13.2517 15.3386 14.6295 16.275 16.3515 15.9555L16.2395 15.3524C14.7985 15.6197 13.6099 14.8372 13.0041 14.3125L12.6023 14.776ZM12.2434 14.4886C12.3665 14.5799 12.4863 14.6758 12.6025 14.7763L13.0038 14.3122C12.876 14.2017 12.7442 14.0962 12.6089 13.9959L12.2434 14.4886ZM13.6839 13.0269C13.1508 13.2889 12.6639 13.625 12.2236 14.0119L12.6286 14.4726C13.033 14.1173 13.4752 13.8129 13.9546 13.5774L13.6839 13.0269ZM18.7042 12.5638C17.6973 12.5079 16.7474 12.4763 15.9035 12.5301C15.0621 12.5838 14.3014 12.7237 13.6839 13.0269L13.9546 13.5774C14.4672 13.3258 15.1352 13.1938 15.9426 13.1423C16.7477 13.0909 17.6667 13.1206 18.6702 13.1763L18.7042 12.5638ZM24.3266 14.7098C23.5387 14.085 21.5647 12.7236 18.7044 12.5638L18.6702 13.1763C21.3509 13.3259 23.2049 14.6033 23.9452 15.1903L24.3266 14.7098ZM24.5767 15.2283C24.5767 15.0273 24.4861 14.8365 24.3267 14.7099L23.945 15.1902C23.9563 15.1992 23.9631 15.2124 23.9631 15.2283H24.5767ZM24.5767 17.7181V15.2283H23.9631V17.7181H24.5767ZM23.4801 18.2183C23.9096 18.5912 24.5767 18.2859 24.5767 17.7181H23.9631C23.9631 17.7326 23.9593 17.7405 23.9559 17.7456C23.9516 17.7519 23.9445 17.7584 23.9345 17.7629C23.9246 17.7675 23.915 17.7685 23.9076 17.7677C23.9016 17.7669 23.8933 17.7646 23.8824 17.7552L23.4801 18.2183ZM21.7436 17.0496C22.4948 17.4318 23.0817 17.8734 23.4804 18.2186L23.8821 17.7549C23.4551 17.3852 22.8272 16.9126 22.0218 16.5029L21.7436 17.0496ZM12.6296 10.1274C12.8386 9.94385 13.0372 9.74886 13.2256 9.54483L12.7747 9.1287C12.5998 9.31809 12.4165 9.49805 12.2246 9.66667L12.6296 10.1274ZM13.8016 10.3427C13.379 10.1569 12.9795 9.92476 12.6099 9.65072L12.2444 10.1434C12.6507 10.4448 13.0899 10.6999 13.5545 10.9042L13.8016 10.3427ZM18.2083 10.89C16.2651 10.8924 14.8268 10.7946 13.8018 10.3428L13.5543 10.9041C14.7145 11.4154 16.2797 11.5058 18.2091 11.5034L18.2083 10.89ZM23.94 9.27945C23.0063 9.84586 20.971 10.8861 18.2083 10.89L18.2092 11.5034C21.1263 11.4993 23.2733 10.4014 24.2584 9.80384L23.94 9.27945ZM23.9631 9.23789C23.9631 9.25522 23.9542 9.27078 23.9396 9.27968L24.2588 9.80361C24.4563 9.68338 24.5767 9.4693 24.5767 9.23789H23.9631ZM23.9631 6.18208V9.23789H24.5767V6.18208H23.9631ZM23.8844 6.14243C23.9185 6.11792 23.9631 6.14225 23.9631 6.18208H24.5767C24.5767 5.63993 23.9641 5.32941 23.526 5.64453L23.8844 6.14243ZM21.3519 7.49938C22.4546 7.08404 23.3093 6.55621 23.8844 6.14243L23.526 5.64453C22.9834 6.03488 22.1762 6.53338 21.1355 6.92536L21.3519 7.49938ZM19.894 8.14148C20.4934 7.95707 20.9962 7.71423 21.3995 7.4766L21.088 6.94815C20.7192 7.16536 20.2602 7.38697 19.7135 7.55519L19.894 8.14148ZM16.8104 8.38324C17.4579 8.47395 18.5872 8.54334 19.894 8.14148L19.7136 7.55517C18.5209 7.92187 17.4889 7.85892 16.8955 7.7758L16.8104 8.38324ZM13.2256 9.54483C14.1759 8.5152 15.5483 8.07001 16.7786 8.37711L16.9273 7.78194C15.4556 7.41459 13.8597 7.95323 12.7746 9.12877L13.2256 9.54483Z" fill="black"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/tracing/langfuse-icon.svg b/app/components/base/icons/assets/public/tracing/langfuse-icon.svg
new file mode 100644
index 0000000..fe10082
--- /dev/null
+++ b/app/components/base/icons/assets/public/tracing/langfuse-icon.svg
@@ -0,0 +1,32 @@
+<svg width="74" height="16" viewBox="0 0 74 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Clip path group">
+<mask id="mask0_20135_12984" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="96" height="16">
+<g id="clip0_823_291">
+<path id="Vector" d="M95.5733 0H0V16H95.5733V0Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask0_20135_12984)">
+<g id="Group">
+<path id="Vector_2" d="M21.2832 11.5431V3.72656H22.3735V10.4972H26.3932V11.5431H21.2832ZM27.6995 7.44766C27.9198 6.31372 28.8889 5.5761 30.1224 5.5761C31.543 5.5761 32.4791 6.40179 32.4791 8.02014V10.233C32.4791 10.4862 32.5893 10.5963 32.8316 10.5963H33.0849V11.5431H32.7765C32.0717 11.5431 31.6532 11.1688 31.543 10.6513C31.3228 11.1908 30.64 11.6752 29.7259 11.6752C28.5475 11.6752 27.6004 11.0587 27.6004 10.0128C27.6004 8.80179 28.4924 8.46051 29.836 8.2073L31.4109 7.89904C31.3999 7.0073 30.8933 6.56693 30.1114 6.56693C29.4506 6.56693 28.966 6.96326 28.8338 7.52473L27.6995 7.44766ZM28.7237 9.99078C28.7347 10.3981 29.0871 10.7394 29.8581 10.7394C30.7391 10.7394 31.4329 10.1229 31.4329 9.07702V8.82381L30.1774 9.04399C29.3625 9.18711 28.7237 9.25317 28.7237 9.99078ZM34.5453 5.70821H35.5255L35.5585 6.68803C35.8669 5.93941 36.5166 5.5761 37.2986 5.5761C38.5981 5.5761 39.2369 6.5339 39.2369 7.78895V11.5431H38.1686V8.06418C38.1686 7.02931 37.8272 6.48987 37.0232 6.48987C36.1752 6.48987 35.6136 7.02931 35.6136 8.06418V11.5431H34.5453V5.70821ZM43.2303 11.2348C41.7876 11.2348 40.7634 10.0789 40.7634 8.43849C40.7634 6.74308 41.7876 5.5761 43.2303 5.5761C44.0122 5.5761 44.6951 5.99445 44.9594 6.59996L44.9704 5.70821H45.9946V10.9045C45.9836 12.5009 44.9704 13.3266 43.4065 13.3266C42.129 13.3266 41.2039 12.655 40.9286 11.6422L42.0519 11.5651C42.2832 12.0715 42.7347 12.3688 43.4065 12.3688C44.3536 12.3688 44.9153 11.9394 44.9263 11.1357V10.266C44.629 10.8275 43.9241 11.2348 43.2303 11.2348ZM41.8867 8.42748C41.8867 9.5284 42.4704 10.299 43.4286 10.299C44.3647 10.299 44.9373 9.5284 44.9483 8.42748C44.9704 7.33757 44.3867 6.56693 43.4286 6.56693C42.4704 6.56693 41.8867 7.33757 41.8867 8.42748ZM48.9967 5.455C48.9967 4.3761 49.5364 3.72656 50.7258 3.72656H52.3337V4.67335H50.7038C50.3293 4.67335 50.065 4.95959 50.065 5.43298V6.08253H52.2566V7.02931H50.065V11.5431H48.9967V7.02931H47.4659V6.08253H48.9967V5.455ZM58.9041 11.5431H57.8909L57.8798 10.5963C57.5715 11.3229 56.9327 11.6752 56.1838 11.6752C54.9063 11.6752 54.2786 10.7174 54.2786 9.46234V5.70821H55.3468V9.18711C55.3468 10.222 55.6883 10.7614 56.4592 10.7614C57.2851 10.7614 57.8358 10.222 57.8358 9.18711V5.70821H58.9041V11.5431ZM64.5277 7.53574C64.4065 6.91922 63.8338 6.56693 63.151 6.56693C62.5894 6.56693 62.0718 6.84216 62.0828 7.38161C62.0828 7.9651 62.7876 8.09721 63.4374 8.26234C64.5497 8.53757 65.662 8.94491 65.662 10.0348C65.662 11.1798 64.5607 11.6752 63.3493 11.6752C61.9837 11.6752 60.8713 10.9045 60.7832 9.69354L61.9066 9.62748C62.0167 10.277 62.6004 10.6844 63.3493 10.6844C63.933 10.6844 64.5387 10.5302 64.5387 9.97977C64.5387 9.4073 63.8008 9.30821 63.151 9.15409C62.0497 8.88987 60.9594 8.48253 60.9594 7.42565C60.9594 6.24766 62.0167 5.5761 63.2502 5.5761C64.4836 5.5761 65.4417 6.31372 65.629 7.46968L64.5277 7.53574ZM67.2104 8.62565C67.2104 6.76509 68.2787 5.5761 69.9196 5.5761C71.2302 5.5761 72.4196 6.42381 72.5077 8.52656V8.9339H68.3448C68.4329 10.0348 68.9945 10.6844 69.9196 10.6844C70.5033 10.6844 71.032 10.3431 71.2853 9.75959L72.4196 9.85867C72.0892 10.9706 71.087 11.6752 69.9196 11.6752C68.2787 11.6752 67.2104 10.4862 67.2104 8.62565ZM68.3778 8.07519H71.3403C71.1861 6.96326 70.5804 6.56693 69.9196 6.56693C69.0716 6.56693 68.532 7.1284 68.3778 8.07519Z" fill="black"/>
+<g id="Clip path group_2">
+<mask id="mask1_20135_12984" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="-1" width="17" height="18">
+<g id="clip1_823_291">
+<path id="Vector_3" d="M16.3621 -0.0512695H0.203125V16.1021H16.3621V-0.0512695Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask1_20135_12984)">
+<g id="Group_2">
+<path id="Vector_4" d="M14.6259 11.2357C13.9141 12.1984 12.8241 12.8406 11.5941 12.9344C11.5558 12.937 11.5175 12.9397 11.4787 12.9419C10.0365 13.0136 8.94706 12.3558 8.22466 11.7452C6.94631 11.0687 5.94609 10.8983 5.36089 10.751C4.93532 10.6438 4.56293 10.4296 4.40334 10.3225C4.26183 10.2384 3.97722 10.0434 3.76496 9.67965C3.52716 9.27204 3.51333 8.88257 3.51706 8.71705C3.641 8.70048 3.80113 8.68224 3.98839 8.67048C4.1416 8.66082 4.29002 8.65709 4.45654 8.65652C5.74819 8.65494 6.7499 8.71812 7.47874 9.0417C7.87295 9.21632 8.23842 9.4488 8.56395 9.73215C8.98265 10.0975 9.83862 10.6749 10.8935 10.4778C11.0276 10.4526 11.1563 10.4194 11.2803 10.3787C11.6601 10.3241 12.3097 10.2801 13.0747 10.4831C13.8008 10.676 14.3232 11.0092 14.6259 11.2357Z" fill="#0A60B5" stroke="black" stroke-width="1.70667" stroke-miterlimit="10"/>
+<path id="Vector_5" d="M14.53 4.60662C14.2091 4.19101 13.819 3.79812 13.3584 3.53003C12.8675 3.2445 12.2411 2.99862 11.4835 2.93199C9.63248 2.76913 8.36691 3.79548 8.13634 3.98954C7.84947 4.25868 6.70187 5.21101 5.32048 5.73977C5.07981 5.82545 4.61653 6.02793 4.20477 6.48007C3.87909 6.83749 3.7197 7.20339 3.6416 7.43076C3.80631 7.45351 3.97632 7.46992 4.15164 7.47994C5.49102 7.55452 6.64184 7.56193 7.39466 7.19337C7.89196 6.95015 8.32815 6.60377 8.70431 6.1982C9.38222 5.4669 10.3709 5.14067 11.271 5.36436C11.6843 5.42197 12.4042 5.46588 13.2368 5.21101C13.8116 5.03492 14.2399 4.81337 14.53 4.60662Z" fill="#0A60B5" stroke="black" stroke-width="1.70667" stroke-miterlimit="10"/>
+<path id="Vector_6" d="M1.96963 4.91518C1.45614 4.65135 1.05528 4.347 0.781876 4.10874C0.629046 3.97549 0.391602 4.08476 0.391602 4.28837V5.95295C0.391602 6.02543 0.424389 6.09419 0.480445 6.13896L1.16264 6.79512C1.19859 6.53125 1.2758 6.17255 1.44926 5.77597C1.61267 5.40184 1.80886 5.11558 1.96963 4.91518Z" fill="#0A60B5" stroke="black" stroke-width="1.70667" stroke-miterlimit="10"/>
+<path id="Vector_7" d="M12.9521 8.63005C13.0302 8.38964 13.0735 8.13742 13.0799 7.8804C13.0853 7.67736 13.0617 7.6015 13.0264 7.4049C13.3895 7.34397 13.8428 7.24459 14.2561 7.1377C14.6929 7.02499 15.0158 6.89407 15.3789 6.76367C15.4318 7.01747 15.4874 7.14092 15.5067 7.32899C15.5248 7.50642 15.5361 7.69019 15.5392 7.8804C15.5489 8.47138 15.4767 9.0073 15.3655 9.47698C15.0233 9.29954 14.617 9.11577 14.1492 8.95439C13.714 8.8037 13.3093 8.70115 12.9521 8.63005Z" fill="#0A60B5" stroke="black" stroke-width="1.70667" stroke-miterlimit="10"/>
+<path id="Vector_8" d="M0.766014 12.1447C0.609481 12.2583 0.391602 12.1463 0.391602 11.9516V9.90721C0.391602 9.84531 0.415399 9.78667 0.456648 9.74292C0.477272 9.72104 0.49631 9.70877 0.504771 9.70397L1.18061 9.41382C1.23032 9.6848 1.3123 10.0091 1.44926 10.3622C1.6095 10.775 1.79987 11.1094 1.96963 11.3638C1.56825 11.6241 1.16686 11.8844 0.766014 12.1447Z" fill="#0A60B5" stroke="black" stroke-width="1.70667" stroke-miterlimit="10"/>
+<path id="Vector_9" fill-rule="evenodd" clip-rule="evenodd" d="M5.11863 3.21273C6.47036 3.1457 7.48116 3.71166 8.00219 4.08992C7.60778 4.43817 6.54047 5.27853 5.27812 5.76389C5.19298 5.79436 5.08001 5.83945 4.95131 5.90513C4.03786 6.35487 3.49469 7.25118 3.47044 8.20872C3.46637 8.3699 3.4746 8.53046 3.49592 8.68826C3.49361 8.68857 3.49131 8.68888 3.48903 8.68918C3.48531 8.85338 3.49914 9.23978 3.73679 9.64428C3.94894 10.0051 4.23338 10.1986 4.37481 10.282C4.44499 10.3288 4.55634 10.3962 4.69529 10.466C4.8585 10.5529 5.03948 10.6258 5.2391 10.6822C5.26968 10.6911 5.30062 10.6995 5.33181 10.7072C5.40448 10.7254 5.48364 10.7442 5.56903 10.7644C6.17131 10.9074 7.08394 11.1238 8.20285 11.7118C8.31591 11.8066 8.43766 11.9022 8.56827 11.9956C8.52858 12.0311 8.49519 12.0621 8.46819 12.0875C8.23747 12.2826 6.97098 13.3142 5.11863 13.1505C4.36047 13.0836 3.73309 12.8364 3.24236 12.5494C2.4156 12.0663 1.79088 11.302 1.45008 10.4075C1.2305 9.83086 1.03909 9.08515 1.02527 8.20765C1.01304 7.45826 1.1332 6.79817 1.29696 6.25074C1.79833 4.57812 3.26043 3.35145 5.00327 3.22017L5.00335 3.22016C5.0416 3.21751 5.07986 3.21485 5.11863 3.21273ZM14.5861 11.1844C14.2827 10.9597 13.7622 10.6316 13.0411 10.4415C12.2766 10.2401 11.6274 10.2837 11.2478 10.3378C11.1239 10.3782 10.9952 10.4112 10.8613 10.4362C9.80694 10.6318 8.95148 10.0588 8.53303 9.69637C8.45168 9.62603 8.36781 9.55891 8.28165 9.49501C8.56326 9.2476 8.87288 9.03413 9.21043 8.8683C9.96382 8.49841 11.1154 8.50582 12.4558 8.58025C14.3028 8.68336 15.5788 9.56295 16.0882 9.96688C16.145 10.0121 16.1775 10.0801 16.1775 10.1524V11.8123C16.1775 12.0158 15.9388 12.1247 15.7851 11.9914C15.5098 11.7531 15.1049 11.4483 14.5861 11.1844ZM8.66435 6.22472C8.54326 6.35584 8.41593 6.48083 8.28237 6.59819C8.54101 6.79004 8.82057 6.95244 9.11629 7.08249C9.84473 7.40351 10.8459 7.46623 12.1367 7.46465C14.0301 7.46199 15.4241 6.74925 16.0637 6.36126C16.1344 6.31822 16.1775 6.2417 16.1775 6.15878V4.12158C16.1775 3.92758 15.9585 3.81597 15.8011 3.92917C15.4285 4.19722 14.8745 4.53933 14.1601 4.80844C13.9028 4.96005 13.5822 5.11485 13.2001 5.23242C12.367 5.48857 11.6466 5.44446 11.2329 5.38654C10.3323 5.16172 9.34277 5.48964 8.66435 6.22472Z" fill="#E11312"/>
+<path id="Vector_10" d="M8.00166 4.09005L8.13707 4.2433L8.32826 4.07447L8.12183 3.92461L8.00166 4.09005ZM5.11809 3.21286L5.10798 3.00864L5.10745 3.00866L5.10692 3.0087L5.11809 3.21286ZM5.27759 5.76403L5.34647 5.95659L5.34877 5.95577L5.35102 5.9549L5.27759 5.76403ZM4.95078 5.90527L5.04115 6.08868L5.04247 6.08807L5.04379 6.0874L4.95078 5.90527ZM3.49538 8.6884L3.52217 8.89108L3.72555 8.86425L3.69809 8.661L3.49538 8.6884ZM3.4885 8.68932L3.46154 8.48664L3.28798 8.50969L3.28401 8.68467L3.4885 8.68932ZM4.37427 10.2822L4.48774 10.112L4.48307 10.1089L4.47824 10.1061L4.37427 10.2822ZM4.69475 10.4661L4.79093 10.2857L4.78879 10.2845L4.78663 10.2834L4.69475 10.4661ZM5.23857 10.6823L5.29549 10.486L5.29487 10.4858L5.29421 10.4856L5.23857 10.6823ZM8.20232 11.7119L8.33384 11.5553L8.31701 11.5412L8.29748 11.5309L8.20232 11.7119ZM8.56773 11.9957L8.70411 12.1481L8.89429 11.978L8.68678 11.8295L8.56773 11.9957ZM8.46766 12.0877L8.59975 12.2438L8.60404 12.2402L8.60808 12.2364L8.46766 12.0877ZM3.24183 12.5496L3.34511 12.3731L3.34505 12.373L3.24183 12.5496ZM1.02474 8.20779L1.22926 8.20456L1.22925 8.20446L1.02474 8.20779ZM1.29642 6.25088L1.10049 6.19214L1.10045 6.1923L1.29642 6.25088ZM5.00274 3.2203L4.98903 3.01629L4.9882 3.01635L4.98737 3.01641L5.00274 3.2203ZM5.00281 3.2203L5.01652 3.42431L5.01698 3.42428L5.00281 3.2203ZM13.0406 10.4417L13.0928 10.2439H13.0927L13.0406 10.4417ZM14.5855 11.1845L14.4638 11.3488L14.4775 11.359L14.4928 11.3667L14.5855 11.1845ZM11.2473 10.338L11.2183 10.1356L11.2007 10.1381L11.1838 10.1436L11.2473 10.338ZM10.8607 10.4363L10.8981 10.6373H10.8982L10.8607 10.4363ZM8.5325 9.6965L8.66648 9.54197L8.66627 9.54177L8.5325 9.6965ZM8.28112 9.49515L8.14612 9.34159L7.95594 9.50864L8.15931 9.65939L8.28112 9.49515ZM12.4553 8.58039L12.4667 8.37622H12.4666L12.4553 8.58039ZM16.0877 9.96702L16.2149 9.80692L16.2148 9.80687L16.0877 9.96702ZM15.7846 11.9915L15.9187 11.8371L15.9185 11.8369L15.7846 11.9915ZM8.28183 6.59833L8.14678 6.44477L7.95666 6.61177L8.15998 6.76257L8.28183 6.59833ZM9.11576 7.08262L9.19829 6.89553L9.19814 6.89548L9.11576 7.08262ZM12.1362 7.46478L12.1365 7.66925H12.1365L12.1362 7.46478ZM16.0632 6.3614L16.1693 6.53622L16.1696 6.53607L16.0632 6.3614ZM14.1596 4.80857L14.0874 4.61723L14.0709 4.62346L14.0557 4.63242L14.1596 4.80857ZM11.2324 5.38667L11.1828 5.58506L11.1933 5.58767L11.204 5.58915L11.2324 5.38667ZM8.12183 3.92461C7.57989 3.53114 6.52347 2.93845 5.10798 3.00864L5.12822 3.41708C6.41618 3.35322 7.38138 3.89245 7.88144 4.25549L8.12183 3.92461ZM5.35102 5.9549C6.64538 5.45722 7.73371 4.59944 8.13707 4.2433L7.86625 3.9368C7.48074 4.27718 6.43449 5.10015 5.20416 5.5732L5.35102 5.9549ZM5.04379 6.0874C5.16309 6.02647 5.26772 5.98471 5.34647 5.95659L5.20871 5.57152C5.11717 5.60423 4.99585 5.65269 4.85776 5.72318L5.04379 6.0874ZM3.67439 8.21402C3.69676 7.3308 4.19746 6.50412 5.04115 6.08868L4.8604 5.72186C3.87719 6.20595 3.29156 7.17188 3.26543 8.2037L3.67439 8.21402ZM3.69809 8.661C3.6783 8.51455 3.67058 8.36487 3.67439 8.21402L3.26543 8.2037C3.2611 8.3752 3.26984 8.5467 3.29268 8.71575L3.69809 8.661ZM3.51546 8.892C3.5177 8.8917 3.51993 8.89139 3.52217 8.89108L3.4686 8.48566C3.46623 8.48597 3.46387 8.48633 3.46154 8.48664L3.51546 8.892ZM3.91263 9.54085C3.70211 9.18256 3.68969 8.83956 3.69299 8.69392L3.28401 8.68467C3.27987 8.86752 3.29509 9.29732 3.55989 9.74798L3.91263 9.54085ZM4.47824 10.1061C4.35261 10.032 4.10041 9.86028 3.91261 9.54079L3.55989 9.74798C3.79637 10.1503 4.11309 10.3655 4.2703 10.4583L4.47824 10.1061ZM4.78663 10.2834C4.6552 10.2174 4.55104 10.1543 4.48774 10.112L4.26081 10.4523C4.33787 10.5037 4.45643 10.5752 4.60289 10.6488L4.78663 10.2834ZM5.29421 10.4856C5.10788 10.4329 4.94058 10.3654 4.79093 10.2857L4.59858 10.6466C4.77536 10.7407 4.97 10.819 5.18294 10.8791L5.29421 10.4856ZM5.38088 10.509C5.35225 10.5019 5.32376 10.4941 5.29549 10.486L5.18161 10.8787C5.21454 10.8883 5.24788 10.8973 5.28168 10.9058L5.38088 10.509ZM5.61575 10.5656C5.53005 10.5453 5.45212 10.5268 5.38088 10.509L5.28168 10.9058C5.35572 10.9243 5.43616 10.9433 5.52125 10.9635L5.61575 10.5656ZM8.29748 11.5309C7.155 10.9306 6.22187 10.7094 5.61575 10.5656L5.52125 10.9635C6.11975 11.1055 7.01177 11.3174 8.10715 11.8929L8.29748 11.5309ZM8.68678 11.8295C8.56093 11.7394 8.44327 11.6471 8.33384 11.5553L8.07085 11.8685C8.18744 11.9664 8.31338 12.0652 8.44864 12.162L8.68678 11.8295ZM8.60808 12.2364C8.63406 12.2119 8.66607 12.1821 8.70411 12.1481L8.4313 11.8434C8.39004 11.8803 8.35526 11.9126 8.32724 11.939L8.60808 12.2364ZM5.10009 13.3543C7.03682 13.5255 8.35798 12.4482 8.59975 12.2438L8.33558 11.9315C8.11585 12.1173 6.90412 13.1032 5.13615 12.947L5.10009 13.3543ZM3.13854 12.726C3.65082 13.0256 4.30703 13.2843 5.10011 13.3544L5.13615 12.947C4.4129 12.8831 3.8143 12.6475 3.34511 12.3731L3.13854 12.726ZM1.25838 10.4804C1.61483 11.416 2.26927 12.2181 3.1386 12.7261L3.34505 12.373C2.56087 11.9148 1.96586 11.1883 1.64069 10.3349L1.25838 10.4804ZM0.820219 8.21101C0.834481 9.11662 1.03203 9.88594 1.25838 10.4804L1.64071 10.3349C1.4279 9.77599 1.24263 9.05395 1.22926 8.20456L0.820219 8.21101ZM1.10045 6.1923C0.93163 6.75664 0.807599 7.43774 0.820219 8.21116L1.22925 8.20446C1.21742 7.47904 1.3337 6.83991 1.49239 6.30946L1.10045 6.1923ZM4.98737 3.01641C3.15623 3.15434 1.62504 4.44222 1.10049 6.19214L1.49236 6.30956C1.97055 4.7143 3.36357 3.54883 5.0181 3.4242L4.98737 3.01641ZM4.9891 3.01629L4.98903 3.01629L5.01644 3.42432L5.01652 3.42431L4.9891 3.01629ZM5.10692 3.0087C5.0664 3.01091 5.02666 3.01368 4.98864 3.01632L5.01698 3.42428C5.05547 3.42161 5.09225 3.41906 5.12929 3.41703L5.10692 3.0087ZM12.9885 10.6393C13.6767 10.8208 14.1738 11.134 14.4638 11.3488L14.7073 11.0202C14.3904 10.7855 13.8465 10.4426 13.0928 10.2439L12.9885 10.6393ZM11.2762 10.5404C11.6387 10.4886 12.2586 10.4471 12.9885 10.6393L13.0927 10.2439C12.2935 10.0333 11.6151 10.0789 11.2183 10.1356L11.2762 10.5404ZM10.8982 10.6373C11.0409 10.6107 11.1782 10.5756 11.3107 10.5324L11.1838 10.1436C11.0685 10.1812 10.9485 10.2119 10.8232 10.2353L10.8982 10.6373ZM8.39858 9.85098C8.83155 10.2261 9.75005 10.8503 10.8981 10.6373L10.8234 10.2353C9.86276 10.4135 9.07035 9.89182 8.66648 9.54197L8.39858 9.85098ZM8.15931 9.65939C8.24138 9.72027 8.32126 9.78422 8.39873 9.85118L8.66627 9.54177C8.58108 9.46816 8.49323 9.39782 8.40297 9.3309L8.15931 9.65939ZM9.1197 8.68492C8.76425 8.85959 8.43969 9.08364 8.14612 9.34159L8.41617 9.64876C8.68576 9.41187 8.98056 9.20894 9.30011 9.05195L9.1197 8.68492ZM12.4666 8.37622C11.7952 8.33895 11.162 8.31784 10.5994 8.35373C10.0385 8.38951 9.53134 8.4828 9.1197 8.68492L9.30011 9.05195C9.64185 8.88418 10.0872 8.79621 10.6255 8.76186C11.1622 8.72761 11.7749 8.74739 12.4439 8.78455L12.4666 8.37622ZM16.2148 9.80687C15.6896 9.39035 14.3735 8.4827 12.4667 8.37622L12.4438 8.78455C14.231 8.88428 15.467 9.73586 15.9605 10.1272L16.2148 9.80687ZM16.3815 10.1525C16.3815 10.0185 16.3211 9.89131 16.2149 9.80692L15.9604 10.1271C15.9679 10.1331 15.9724 10.1419 15.9724 10.1525H16.3815ZM16.3815 11.8124V10.1525H15.9724V11.8124H16.3815ZM15.6504 12.1459C15.9368 12.3945 16.3815 12.1909 16.3815 11.8124H15.9724C15.9724 11.822 15.9699 11.8273 15.9676 11.8307C15.9648 11.8349 15.9601 11.8393 15.9534 11.8423C15.9468 11.8453 15.9404 11.846 15.9355 11.8455C15.9315 11.8449 15.926 11.8434 15.9187 11.8371L15.6504 12.1459ZM14.4928 11.3667C14.9936 11.6215 15.3848 11.916 15.6507 12.1461L15.9185 11.8369C15.6338 11.5905 15.2152 11.2754 14.6783 11.0023L14.4928 11.3667ZM8.41683 6.75194C8.55613 6.62956 8.68852 6.49957 8.81416 6.36354L8.51353 6.08612C8.39694 6.21239 8.27472 6.33236 8.14678 6.44477L8.41683 6.75194ZM9.19814 6.89548C8.91638 6.77157 8.65006 6.61683 8.40369 6.43414L8.15998 6.76257C8.43089 6.96352 8.7237 7.13359 9.03343 7.26982L9.19814 6.89548ZM12.136 7.26031C10.8405 7.26189 9.88163 7.19672 9.19829 6.89553L9.03328 7.26972C9.80676 7.61062 10.8502 7.67084 12.1365 7.66925L12.136 7.26031ZM15.9571 6.18662C15.3346 6.56423 13.9777 7.2577 12.136 7.26031L12.1365 7.66925C14.0813 7.66655 15.5126 6.93458 16.1693 6.53622L15.9571 6.18662ZM15.9724 6.15892C15.9724 6.17047 15.9666 6.18085 15.9568 6.18678L16.1696 6.53607C16.3012 6.45591 16.3815 6.31319 16.3815 6.15892H15.9724ZM15.9724 4.12171V6.15892H16.3815V4.12171H15.9724ZM15.92 4.09528C15.9427 4.07894 15.9724 4.09516 15.9724 4.12171H16.3815C16.3815 3.76028 15.9731 3.55327 15.6811 3.76334L15.92 4.09528ZM14.2317 4.99991C14.9668 4.72302 15.5366 4.37113 15.92 4.09528L15.6811 3.76334C15.3193 4.02358 14.7812 4.35591 14.0874 4.61723L14.2317 4.99991ZM13.2597 5.42798C13.6594 5.30504 13.9946 5.14315 14.2634 4.98473L14.0557 4.63242C13.8099 4.77723 13.5039 4.92497 13.1394 5.03712L13.2597 5.42798ZM11.204 5.58915C11.6356 5.64963 12.3885 5.69589 13.2597 5.42798L13.1395 5.03711C12.3443 5.28157 11.6564 5.23961 11.2608 5.18419L11.204 5.58915ZM8.81416 6.36354C9.44768 5.67713 10.3626 5.38033 11.1828 5.58506L11.2819 5.18828C10.3008 4.94339 9.23685 5.30248 8.51348 6.08617L8.81416 6.36354Z" fill="black"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/tracing/langsmith-icon-big.svg b/app/components/base/icons/assets/public/tracing/langsmith-icon-big.svg
new file mode 100644
index 0000000..95e1ff4
--- /dev/null
+++ b/app/components/base/icons/assets/public/tracing/langsmith-icon-big.svg
@@ -0,0 +1,24 @@
+<svg width="124" height="20" viewBox="0 0 124 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Clip path group">
+<mask id="mask0_20135_18175" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="124" height="20">
+<g id="a">
+<path id="Vector" d="M123.825 0.399902H0.200195V19.5999H123.825V0.399902Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask0_20135_18175)">
+<g id="Group">
+<path id="Vector_2" d="M45.54 4.18408V15.827H53.561V14.069H47.361V4.18408H45.54Z" fill="#1C3C3C"/>
+<path id="Vector_3" d="M57.8358 6.94629C56.0878 6.94629 54.7807 7.76575 54.25 9.19423C54.2162 9.28562 54.1141 9.56133 54.1141 9.56133L55.6124 10.5305L55.8159 9.99986C56.1631 9.09515 56.8051 8.67352 57.8358 8.67352C58.8664 8.67352 59.4563 9.17349 59.4455 10.1581C59.4455 10.198 59.4424 10.3186 59.4424 10.3186C59.4424 10.3186 58.0785 10.5398 57.5163 10.6588C55.1178 11.1657 54.1133 12.0811 54.1133 13.5787C54.1133 14.3767 54.5564 15.2407 55.3651 15.7253C55.8505 16.0156 56.4841 16.1254 57.1837 16.1254C57.6438 16.1254 58.0908 16.0571 58.5047 15.9311C59.4455 15.6185 59.7082 15.0041 59.7082 15.0041V15.8075H61.2664V10.0644C61.2664 8.11211 59.9839 6.94629 57.8358 6.94629ZM59.4517 13.0749C59.4517 13.6786 58.7942 14.5288 57.2629 14.5288C56.8305 14.5288 56.524 14.4143 56.3197 14.2438C56.0463 14.0157 55.9565 13.6878 55.9941 13.3983C56.0102 13.2723 56.0863 13.0012 56.3681 12.7662C56.6561 12.5258 57.1653 12.3538 57.9517 12.1825C58.5984 12.042 59.4524 11.8868 59.4524 11.8868V13.0757L59.4517 13.0749Z" fill="#1C3C3C"/>
+<path id="Vector_4" d="M67.0275 6.94657C66.8109 6.94657 66.5997 6.96193 66.3946 6.99034C64.9992 7.20001 64.5906 7.90887 64.5906 7.90887L64.5921 7.20001H62.8457V15.8093H64.6666V11.0339C64.6666 9.41108 65.8501 8.67226 66.9499 8.67226C68.1388 8.67226 68.7163 9.31124 68.7163 10.6268V15.8093H70.5372V10.3765C70.5372 8.25985 69.1925 6.9458 67.0282 6.9458L67.0275 6.94657Z" fill="#1C3C3C"/>
+<path id="Vector_5" d="M78.1373 7.19359V8.08063C78.1373 8.08063 77.6911 6.94629 75.6611 6.94629C73.139 6.94629 71.5723 8.68658 71.5723 11.489C71.5723 13.0703 72.0776 14.3152 72.9693 15.1017C73.6628 15.713 74.589 16.0264 75.6918 16.0479C76.4591 16.0624 76.9559 15.8536 77.2664 15.6562C77.8623 15.2768 78.0835 14.9166 78.0835 14.9166C78.0835 14.9166 78.0582 15.1984 78.0121 15.5801C77.9791 15.8566 77.9169 16.0509 77.9169 16.0509C77.6396 17.0378 76.8285 17.6084 75.6457 17.6084C74.463 17.6084 73.7465 17.2191 73.6044 16.4518L71.8342 16.9802C72.1398 18.4548 73.5238 19.3349 75.5359 19.3349C76.9037 19.3349 77.976 18.9632 78.7233 18.229C79.4767 17.4886 79.8591 16.4219 79.8591 15.0579V7.19282H78.1373V7.19359ZM78.0229 11.5666C78.0229 13.29 77.1811 14.3191 75.7709 14.3191C74.2603 14.3191 73.394 13.2869 73.394 11.4882C73.394 9.68959 74.2603 8.67275 75.7709 8.67275C77.1473 8.67275 78.0098 9.69726 78.0229 11.3469V11.5666Z" fill="#1C3C3C"/>
+<path id="Vector_6" d="M90.532 14.0495C90.7777 13.6033 90.9022 13.0772 90.9022 12.4851C90.9022 11.893 90.7969 11.4383 90.5888 11.0704C90.3807 10.701 90.1119 10.3992 89.7909 10.1727C89.4675 9.94455 89.1258 9.76484 88.7771 9.63735C88.4269 9.50987 88.1051 9.40695 87.8217 9.33246L85.7427 8.75262C85.4801 8.68273 85.2174 8.59441 84.9609 8.48919C84.7021 8.38321 84.4817 8.23652 84.3073 8.05298C84.1292 7.86635 84.0385 7.62367 84.0385 7.32952C84.0385 7.02079 84.1437 6.74661 84.3503 6.51467C84.5554 6.28504 84.8288 6.10687 85.1637 5.98475C85.4962 5.86264 85.8625 5.80351 86.2527 5.80888C86.6536 5.81963 87.0368 5.90181 87.3909 6.05387C87.7464 6.20594 88.0521 6.43019 88.2994 6.7205C88.5398 7.00312 88.7064 7.34719 88.7955 7.74424L90.8054 7.3948C90.6341 6.70667 90.3423 6.10994 89.9368 5.62149C89.5236 5.12383 89.0029 4.73829 88.3885 4.4764C87.7733 4.21375 87.0629 4.07781 86.2765 4.07243C85.5023 4.06706 84.7858 4.19071 84.1522 4.44031C83.5201 4.68914 83.011 5.06853 82.6385 5.56773C82.2668 6.06616 82.0778 6.69131 82.0778 7.42552C82.0778 7.92779 82.1615 8.35403 82.3274 8.69349C82.4933 9.03371 82.7099 9.31634 82.9702 9.53522C83.2321 9.75487 83.5132 9.92843 83.8066 10.0529C84.1023 10.178 84.3811 10.2794 84.636 10.3531L87.6328 11.2394C87.8493 11.3047 88.0429 11.383 88.208 11.4721C88.3747 11.562 88.5129 11.6633 88.6197 11.7732C88.7272 11.8838 88.8101 12.0113 88.8654 12.1526C88.9207 12.2939 88.9484 12.449 88.9484 12.6134C88.9484 12.9812 88.8301 13.2969 88.5958 13.5496C88.3647 13.7999 88.0598 13.9935 87.6904 14.1232C87.3225 14.253 86.9254 14.3191 86.5092 14.3191C85.8065 14.3191 85.1767 14.1271 84.6383 13.7485C84.1077 13.3752 83.749 12.8422 83.5724 12.1648L81.6309 12.4598C81.7507 13.1909 82.0264 13.8322 82.4503 14.3652C82.8819 14.9081 83.441 15.3313 84.1107 15.6224C84.782 15.9142 85.5484 16.0624 86.3871 16.0624C86.9769 16.0624 87.5491 15.9872 88.089 15.8382C88.6273 15.69 89.1127 15.4642 89.5313 15.167C89.9491 14.8713 90.2855 14.4942 90.5304 14.048L90.532 14.0495Z" fill="#1C3C3C"/>
+<path id="Vector_7" d="M100.071 8.84108C100.322 8.69747 100.611 8.62451 100.928 8.62451C101.441 8.62451 101.855 8.79654 102.156 9.13676C102.457 9.47545 102.61 9.94931 102.61 10.5476V15.7462H104.474V10.0607C104.474 9.14368 104.218 8.39334 103.715 7.83116C103.212 7.27052 102.477 6.9856 101.532 6.9856C100.961 6.9856 100.436 7.11308 99.9714 7.36422C99.536 7.6 99.1789 7.9287 98.9116 8.34035L98.8763 8.39488L98.8455 8.33804C98.6343 7.9479 98.3348 7.62918 97.9547 7.3911C97.5253 7.1223 96.9831 6.9856 96.3442 6.9856C95.7628 6.9856 95.2306 7.11462 94.7636 7.36806C94.405 7.56236 94.0985 7.81657 93.8528 8.12224L93.7844 8.20748V7.2014H92.1455V15.7462H94.0263V10.4762C94.0263 9.93164 94.1799 9.48236 94.4833 9.14137C94.7874 8.79884 95.1968 8.62528 95.7006 8.62528C96.2044 8.62528 96.636 8.79884 96.9378 9.14137C97.2381 9.48236 97.3902 9.9639 97.3902 10.5714V15.7462H99.2464V10.4762C99.2464 10.0937 99.3209 9.75884 99.4684 9.48006C99.6166 9.20051 99.8194 8.98624 100.071 8.84185L100.071 8.84108Z" fill="#1C3C3C"/>
+<path id="Vector_8" d="M110.408 13.5589C110.418 13.9429 110.522 14.3254 110.717 14.694C110.938 15.0972 111.265 15.3967 111.689 15.5834C112.118 15.7707 112.61 15.8729 113.153 15.8859C113.689 15.899 114.243 15.8537 114.801 15.7515V14.201C114.276 14.2762 113.8 14.2962 113.387 14.2593C112.951 14.2209 112.63 14.0328 112.431 13.701C112.325 13.5305 112.269 13.307 112.26 13.0382C112.252 12.7748 112.248 12.466 112.248 12.1189V8.56844H114.801V7.12307H112.248V4.19775H110.392V7.12307H108.812V8.56844H110.392V12.2318C110.392 12.7249 110.397 13.1718 110.408 13.5597V13.5589Z" fill="#1C3C3C"/>
+<path id="Vector_9" d="M120.316 6.93339C120.116 6.93339 119.922 6.94645 119.733 6.97103C118.359 7.1853 117.955 7.88495 117.955 7.88495V7.67989H117.955V4.1709H116.134V15.7977H117.955V11.0222C117.955 9.38869 119.138 8.64527 120.238 8.64527C121.427 8.64527 122.004 9.28424 122.004 10.5998V15.7977H123.825V10.3495C123.825 8.27509 122.448 6.93416 120.316 6.93416L120.316 6.93339Z" fill="#1C3C3C"/>
+<path id="Vector_10" d="M107.589 7.19922H105.777V15.8162H107.589V7.19922Z" fill="#1C3C3C"/>
+<path id="Vector_11" d="M106.682 6.55761C107.334 6.55761 107.863 6.02913 107.863 5.37719C107.863 4.72527 107.334 4.19678 106.682 4.19678C106.03 4.19678 105.502 4.72527 105.502 5.37719C105.502 6.02913 106.03 6.55761 106.682 6.55761Z" fill="#1C3C3C"/>
+<path id="Vector_12" d="M22.3912 15.1309C22.286 15.306 21.9696 15.3175 21.7 15.1555C21.5618 15.0725 21.455 14.9581 21.3997 14.8337C21.349 14.7208 21.3483 14.614 21.3966 14.5334C21.4519 14.4412 21.5664 14.3944 21.7015 14.3944C21.8229 14.3944 21.9611 14.432 22.0886 14.5088C22.3582 14.6709 22.4972 14.9558 22.392 15.1309H22.3912ZM37.9908 9.9999C37.9908 15.293 33.6839 19.5999 28.3908 19.5999H9.81289C4.51983 19.5999 0.212891 15.2937 0.212891 9.9999C0.212891 4.70608 4.51983 0.399902 9.81289 0.399902H28.3908C33.6846 0.399902 37.9908 4.70685 37.9908 9.9999ZM18.714 14.8145C18.8653 14.6309 18.1664 14.1141 18.0236 13.9244C17.7333 13.6095 17.7317 13.1564 17.5359 12.7885C17.0567 11.678 16.506 10.5759 15.7357 9.63587C14.9216 8.60752 13.9171 7.75657 13.0347 6.7912C12.3795 6.11766 12.2044 5.15843 11.6261 4.43421C10.829 3.25686 8.30838 2.93584 7.93897 4.59856C7.94051 4.65078 7.92438 4.68381 7.87906 4.71683C7.67477 4.86505 7.49276 5.03478 7.33992 5.23984C6.96591 5.76054 6.90831 6.64374 7.37525 7.11145C7.39061 6.86493 7.39906 6.63222 7.59413 6.45558C7.9551 6.76585 8.50037 6.87491 8.91893 6.64374C9.8436 7.96393 9.6132 9.79024 10.3474 11.2126C10.5502 11.549 10.7545 11.8923 11.0148 12.1872C11.226 12.5159 11.9556 12.9037 11.9986 13.2078C12.0063 13.7301 11.9449 14.3007 12.2874 14.7377C12.4487 15.0649 12.0524 15.3936 11.7329 15.3529C11.3182 15.4097 10.8121 15.0741 10.4488 15.2807C10.3205 15.4197 10.0694 15.2661 9.9588 15.4588C9.9204 15.5587 9.71304 15.6992 9.83669 15.7952C9.97416 15.6908 10.1017 15.5817 10.2867 15.6439C10.2591 15.7945 10.3781 15.816 10.4726 15.8597C10.4695 15.9619 10.4096 16.0663 10.488 16.1531C10.5793 16.061 10.6339 15.9304 10.779 15.892C11.2613 16.5348 11.7521 15.2415 12.7958 15.8236C12.5838 15.8137 12.3957 15.8398 12.2528 16.0141C12.2175 16.0533 12.1875 16.0994 12.2497 16.15C12.8127 15.7868 12.8096 16.2745 13.1752 16.1247C13.4563 15.978 13.7358 15.7945 14.0699 15.8467C13.745 15.9404 13.732 16.2015 13.5415 16.4219C13.5093 16.4557 13.4939 16.4941 13.5315 16.5502C14.2058 16.4933 14.2611 16.2691 14.8057 15.9941C15.2119 15.7461 15.6167 16.3474 15.9684 16.0049C16.046 15.9304 16.152 15.9557 16.248 15.9458C16.1251 15.2907 14.7742 16.0656 14.7957 15.187C15.2304 14.8913 15.1305 14.3253 15.1597 13.8683C15.6597 14.1456 16.2157 14.3068 16.7057 14.5718C16.953 14.9712 17.3408 15.4988 17.8577 15.4642C17.8715 15.4243 17.8838 15.389 17.8984 15.3483C18.0551 15.3751 18.2563 15.4788 18.3423 15.2807C18.5765 15.5257 18.9206 15.5134 19.227 15.4504C19.4536 15.2661 18.8008 15.0034 18.7132 14.8137L18.714 14.8145ZM25.722 11.7187L24.6944 10.3317C23.7974 11.3577 23.1984 11.8577 23.1876 11.8669C23.1822 11.8723 22.6101 12.4291 22.0886 12.9068C21.5771 13.3753 21.1731 13.7462 20.9673 14.1517C20.9105 14.2638 20.7868 14.677 20.9604 15.0902C21.094 15.4097 21.3667 15.637 21.7714 15.766C21.8928 15.8044 22.0087 15.8213 22.1193 15.8213C22.8482 15.8213 23.3266 15.0902 23.3297 15.0841C23.3358 15.0756 23.9556 14.1901 24.7106 13.0719C24.9617 12.7002 25.2489 12.307 25.722 11.7179V11.7187ZM30.5535 14.9128C30.5535 14.7085 30.479 14.5111 30.3438 14.3583L30.2163 14.2139C29.446 13.3407 27.4684 11.0989 26.6989 10.228C25.7328 9.13437 24.6522 7.74045 24.5623 7.62371L24.4325 7.35491V6.88182C24.4325 6.70825 24.398 6.53853 24.3312 6.37878L24.0562 5.72598C24.0524 5.71677 24.0508 5.70601 24.0524 5.69603L24.0631 5.60541C24.0647 5.59081 24.0716 5.57776 24.0831 5.56777C24.2974 5.37885 25.0946 4.76598 26.3287 4.81744C26.49 4.82435 26.5184 4.73603 26.523 4.6984C26.5453 4.51715 26.1314 4.30365 25.7458 4.22454C25.2159 4.11625 23.8074 3.82902 22.6807 4.56861L22.6723 4.57475C21.9442 5.18301 21.359 5.64765 21.3529 5.65225L21.3398 5.66531C21.3314 5.67529 21.1255 5.92182 21.1755 6.23593C21.2077 6.44022 21.1017 6.51318 21.0956 6.51702C21.0894 6.52086 20.9451 6.61149 20.7961 6.50934C20.6156 6.37417 20.3022 6.60611 20.2385 6.6568L19.7654 7.06384L19.7562 7.07305C19.7477 7.08304 19.545 7.32035 19.8161 7.70128C20.0503 8.03075 20.1333 8.14057 20.3368 8.39401C20.5434 8.65053 20.9159 8.97539 20.9358 8.99229C20.9451 8.99997 21.1724 9.172 21.4857 8.93238C21.743 8.73501 21.9496 8.55683 21.9496 8.55683C21.9665 8.54301 22.1155 8.42013 22.1224 8.23888C22.1247 8.18665 22.1224 8.14134 22.1224 8.09987C22.1186 7.97238 22.1178 7.93475 22.2138 7.87331C22.2599 7.87331 22.4012 7.92477 22.5225 7.98621C22.5356 7.99389 22.8389 8.16438 23.1147 8.15209C23.2882 8.17513 23.4802 8.37251 23.5463 8.45315C23.5524 8.45929 24.1392 9.07523 24.9655 10.1558C25.123 10.3609 25.7013 11.1312 25.8595 11.3462C26.1237 11.7056 26.5238 12.2494 26.9539 12.8354C27.6988 13.8499 28.5344 14.9873 28.9138 15.4988C29.0398 15.6685 29.2233 15.7837 29.4307 15.8236L29.5712 15.8505C29.625 15.8605 29.6787 15.8659 29.7325 15.8659C29.9813 15.8659 30.2171 15.7568 30.373 15.5633L30.3815 15.5525C30.4936 15.4105 30.555 15.2284 30.555 15.0411V14.9128H30.5535ZM31.2147 5.80355L31.0512 5.63997C31.0035 5.59235 30.9367 5.56393 30.8691 5.56931C30.8016 5.57238 30.7378 5.6031 30.694 5.65533L29.6649 6.87261C29.6357 6.90717 29.5943 6.92867 29.5497 6.93328L29.1834 6.97014C29.1365 6.97475 29.0897 6.96016 29.0536 6.93021L28.4684 6.43485C28.4307 6.40259 28.4085 6.35651 28.4069 6.30736L28.3985 6.01398C28.397 5.97174 28.4115 5.93027 28.4384 5.89801L29.4391 4.69225C29.5144 4.60163 29.5136 4.4703 29.4376 4.37968L29.337 4.26064C29.2709 4.18307 29.1619 4.15465 29.0667 4.19075C28.8301 4.28061 28.2341 4.51331 27.8033 4.74678C27.1943 5.07549 26.7711 5.59696 26.6981 6.10768C26.6444 6.48169 26.6666 7.0984 26.6851 7.43248C26.692 7.56381 26.6628 7.69513 26.5991 7.81264C26.5207 7.95856 26.3825 8.19203 26.1721 8.47312C26.0645 8.62134 25.997 8.67587 25.904 8.78569L27.0361 10.1166C27.3087 9.79869 27.5475 9.55753 27.7557 9.32483C28.1358 8.90166 28.2541 8.89782 28.5705 8.88707C28.7656 8.88016 29.0329 8.87171 29.456 8.76573C30.6111 8.47696 30.9767 7.22665 30.992 7.17136L31.2793 6.03549C31.3 5.95331 31.2754 5.86422 31.2155 5.80432L31.2147 5.80355ZM13.4524 13.7324C13.328 14.2178 13.2873 15.0449 12.656 15.0687C12.6038 15.349 12.8503 15.4542 13.0738 15.3644C13.2958 15.2622 13.401 15.445 13.4755 15.627C13.818 15.677 14.3249 15.5126 14.3441 15.1071C13.8326 14.8122 13.6744 14.2516 13.4517 13.7324H13.4524Z" fill="#1C3C3C"/>
+</g>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/tracing/langsmith-icon.svg b/app/components/base/icons/assets/public/tracing/langsmith-icon.svg
new file mode 100644
index 0000000..8efa791
--- /dev/null
+++ b/app/components/base/icons/assets/public/tracing/langsmith-icon.svg
@@ -0,0 +1,24 @@
+<svg width="84" height="14" viewBox="0 0 84 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Clip path group">
+<mask id="mask0_20135_16592" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="84" height="14">
+<g id="a">
+<path id="Vector" d="M83.2164 0.600098H0.799805V13.4001H83.2164V0.600098Z" fill="white"/>
+</g>
+</mask>
+<g mask="url(#mask0_20135_16592)">
+<g id="Group">
+<path id="Vector_2" d="M31.0264 3.12256V10.8845H36.3737V9.71251H32.2403V3.12256H31.0264Z" fill="#1C3C3C"/>
+<path id="Vector_3" d="M39.2238 4.96436C38.0585 4.96436 37.1871 5.51066 36.8333 6.46298C36.8108 6.52391 36.7427 6.70772 36.7427 6.70772L37.7416 7.35386L37.8773 7.00007C38.1087 6.39693 38.5367 6.11584 39.2238 6.11584C39.911 6.11584 40.3042 6.44916 40.297 7.10554C40.297 7.13216 40.295 7.21255 40.295 7.21255C40.295 7.21255 39.3856 7.36 39.0109 7.43936C37.4119 7.77728 36.7422 8.38759 36.7422 9.38599C36.7422 9.91796 37.0376 10.494 37.5767 10.817C37.9003 11.0106 38.3227 11.0838 38.7892 11.0838C39.0959 11.0838 39.3938 11.0382 39.6698 10.9542C40.297 10.7459 40.4721 10.3363 40.4721 10.3363V10.8718H41.511V7.04308C41.511 5.74157 40.6559 4.96436 39.2238 4.96436ZM40.3011 9.05012C40.3011 9.45255 39.8628 10.0193 38.8419 10.0193C38.5536 10.0193 38.3494 9.94304 38.2132 9.82938C38.0309 9.67732 37.971 9.45869 37.9961 9.26567C38.0068 9.1817 38.0575 9.00096 38.2454 8.84429C38.4374 8.68404 38.7769 8.56935 39.3012 8.45517C39.7323 8.36148 40.3016 8.25805 40.3016 8.25805V9.05063L40.3011 9.05012Z" fill="#1C3C3C"/>
+<path id="Vector_4" d="M45.3523 4.96438C45.2079 4.96438 45.0671 4.97462 44.9304 4.99356C44.0001 5.13334 43.7277 5.60591 43.7277 5.60591L43.7287 5.13334H42.5645V10.8729H43.7784V7.68924C43.7784 6.60739 44.5674 6.11484 45.3006 6.11484C46.0932 6.11484 46.4782 6.54083 46.4782 7.41788V10.8729H47.6921V7.25097C47.6921 5.8399 46.7956 4.96387 45.3528 4.96387L45.3523 4.96438Z" fill="#1C3C3C"/>
+<path id="Vector_5" d="M52.7575 5.12922V5.72058C52.7575 5.72058 52.4601 4.96436 51.1067 4.96436C49.4253 4.96436 48.3809 6.12455 48.3809 7.99284C48.3809 9.04704 48.7178 9.877 49.3122 10.4013C49.7745 10.8088 50.392 11.0177 51.1272 11.0321C51.6387 11.0418 51.97 10.9025 52.1769 10.7709C52.5742 10.518 52.7217 10.2779 52.7217 10.2779C52.7217 10.2779 52.7048 10.4658 52.6741 10.7203C52.6521 10.9046 52.6106 11.0341 52.6106 11.0341C52.4258 11.692 51.885 12.0725 51.0965 12.0725C50.308 12.0725 49.8303 11.8129 49.7356 11.3014L48.5555 11.6536C48.7592 12.6367 49.6819 13.2234 51.0233 13.2234C51.9352 13.2234 52.65 12.9756 53.1482 12.4861C53.6505 11.9926 53.9054 11.2814 53.9054 10.3721V5.12871H52.7575V5.12922ZM52.6813 8.04455C52.6813 9.19348 52.1201 9.87956 51.18 9.87956C50.1729 9.87956 49.5953 9.19143 49.5953 7.99232C49.5953 6.79322 50.1729 6.11533 51.18 6.11533C52.0976 6.11533 52.6725 6.79834 52.6813 7.89812V8.04455Z" fill="#1C3C3C"/>
+<path id="Vector_6" d="M61.022 9.69984C61.1858 9.40237 61.2688 9.05165 61.2688 8.65689C61.2688 8.26214 61.1986 7.95904 61.0599 7.71379C60.9211 7.46752 60.7419 7.2663 60.5279 7.11526C60.3123 6.9632 60.0845 6.84339 59.852 6.7584C59.6186 6.67341 59.404 6.6048 59.2151 6.55513L57.8291 6.16857C57.654 6.12198 57.4789 6.0631 57.3079 5.99296C57.1354 5.9223 56.9884 5.82451 56.8722 5.70215C56.7534 5.57773 56.693 5.41594 56.693 5.21984C56.693 5.01402 56.7632 4.83124 56.9009 4.67661C57.0376 4.52352 57.2199 4.40474 57.4431 4.32333C57.6648 4.24192 57.909 4.2025 58.1691 4.20608C58.4364 4.21325 58.6919 4.26804 58.9279 4.36941C59.1649 4.47079 59.3687 4.62029 59.5336 4.81383C59.6938 5.00224 59.8049 5.23162 59.8643 5.49632L61.2042 5.26336C61.0901 4.80461 60.8955 4.40679 60.6252 4.08116C60.3497 3.74938 60.0026 3.49236 59.593 3.31776C59.1829 3.14266 58.7093 3.05204 58.185 3.04845C57.6689 3.04487 57.1912 3.1273 56.7688 3.2937C56.3474 3.45959 56.008 3.71252 55.7596 4.04532C55.5118 4.3776 55.3859 4.79437 55.3859 5.28384C55.3859 5.61869 55.4417 5.90285 55.5523 6.12916C55.6629 6.35597 55.8072 6.54439 55.9808 6.69031C56.1554 6.83674 56.3428 6.95245 56.5384 7.0354C56.7355 7.11885 56.9214 7.18644 57.0913 7.23559L59.0892 7.82644C59.2335 7.86996 59.3626 7.92218 59.4727 7.98157C59.5838 8.04148 59.6759 8.10906 59.7471 8.18228C59.8188 8.256 59.8741 8.341 59.9109 8.4352C59.9478 8.52941 59.9662 8.63284 59.9662 8.7424C59.9662 8.98765 59.8874 9.19808 59.7312 9.36653C59.5771 9.53344 59.3738 9.66247 59.1276 9.749C58.8823 9.83552 58.6176 9.87956 58.3401 9.87956C57.8716 9.87956 57.4518 9.75156 57.0929 9.49914C56.7391 9.25031 56.5 8.89498 56.3822 8.4434L55.0879 8.64C55.1678 9.12743 55.3516 9.55495 55.6342 9.91028C55.9219 10.2723 56.2947 10.5544 56.7411 10.7484C57.1886 10.943 57.6996 11.0418 58.2587 11.0418C58.6519 11.0418 59.0334 10.9916 59.3933 10.8923C59.7522 10.7935 60.0758 10.6429 60.3548 10.4448C60.6334 10.2477 60.8576 9.99629 61.0209 9.69882L61.022 9.69984Z" fill="#1C3C3C"/>
+<path id="Vector_7" d="M67.38 6.22747C67.5479 6.13173 67.7405 6.08309 67.9514 6.08309C68.2939 6.08309 68.5699 6.19777 68.7706 6.42459C68.9708 6.65038 69.0727 6.96629 69.0727 7.36513V10.8309H70.3158V7.04053C70.3158 6.4292 70.1453 5.92897 69.8094 5.55419C69.4741 5.18043 68.9846 4.99048 68.3543 4.99048C67.9734 4.99048 67.6237 5.07547 67.314 5.24289C67.0237 5.40008 66.7856 5.61921 66.6074 5.89365L66.5838 5.93L66.5634 5.89211C66.4226 5.63201 66.2229 5.41953 65.9694 5.26081C65.6832 5.08161 65.3218 4.99048 64.8958 4.99048C64.5082 4.99048 64.1534 5.07649 63.8421 5.24545C63.603 5.37499 63.3987 5.54446 63.2349 5.74824L63.1893 5.80507V5.13435H62.0967V10.8309H63.3506V7.31752C63.3506 6.95451 63.453 6.65499 63.6552 6.42766C63.858 6.19931 64.1309 6.0836 64.4667 6.0836C64.8026 6.0836 65.0903 6.19931 65.2916 6.42766C65.4918 6.65499 65.5931 6.97601 65.5931 7.38101V10.8309H66.8306V7.31752C66.8306 7.06254 66.8803 6.83931 66.9786 6.65345C67.0774 6.46709 67.2126 6.32424 67.3805 6.22798L67.38 6.22747Z" fill="#1C3C3C"/>
+<path id="Vector_8" d="M74.2724 9.3726C74.2796 9.6286 74.3487 9.88358 74.4787 10.1293C74.6257 10.3981 74.8438 10.5978 75.1269 10.7222C75.4126 10.8472 75.7408 10.9153 76.1028 10.924C76.4597 10.9327 76.8293 10.9025 77.2016 10.8344V9.80064C76.8514 9.85081 76.5339 9.86412 76.2585 9.83955C75.9682 9.81395 75.7541 9.68851 75.621 9.46732C75.5509 9.35366 75.513 9.20467 75.5074 9.02547C75.5022 8.84985 75.4992 8.64403 75.4992 8.4126V6.04563H77.2016V5.08204H75.4992V3.13184H74.2617V5.08204H73.209V6.04563H74.2617V8.48787C74.2617 8.81657 74.2652 9.11456 74.2724 9.37312V9.3726Z" fill="#1C3C3C"/>
+<path id="Vector_9" d="M80.8767 4.95543C80.7436 4.95543 80.6141 4.96414 80.4881 4.98052C79.5726 5.12337 79.3033 5.5898 79.3033 5.5898V5.4531H79.3028V3.11377H78.0889V10.8649H79.3028V7.68132C79.3028 6.5923 80.0918 6.09668 80.825 6.09668C81.6176 6.09668 82.0026 6.52267 82.0026 7.39972V10.8649H83.2165V7.23281C83.2165 5.8499 82.298 4.95595 80.8772 4.95595L80.8767 4.95543Z" fill="#1C3C3C"/>
+<path id="Vector_10" d="M72.3934 5.13281H71.1855V10.8775H72.3934V5.13281Z" fill="#1C3C3C"/>
+<path id="Vector_11" d="M71.7889 4.70524C72.2236 4.70524 72.5758 4.35291 72.5758 3.91829C72.5758 3.48368 72.2236 3.13135 71.7889 3.13135C71.3542 3.13135 71.002 3.48368 71.002 3.91829C71.002 4.35291 71.3542 4.70524 71.7889 4.70524Z" fill="#1C3C3C"/>
+<path id="Vector_12" d="M15.5941 10.4208C15.524 10.5375 15.313 10.5452 15.1333 10.4372C15.0412 10.3819 14.97 10.3056 14.9331 10.2226C14.8993 10.1474 14.8988 10.0762 14.9311 10.0224C14.968 9.96099 15.0442 9.92976 15.1344 9.92976C15.2152 9.92976 15.3074 9.95485 15.3924 10.0061C15.5721 10.1141 15.6648 10.304 15.5946 10.4208H15.5941ZM25.9939 7.0001C25.9939 10.5288 23.1226 13.4001 19.5939 13.4001H7.20859C3.67989 13.4001 0.808594 10.5293 0.808594 7.0001C0.808594 3.47088 3.67989 0.600098 7.20859 0.600098H19.5939C23.1231 0.600098 25.9939 3.47139 25.9939 7.0001ZM13.1427 10.2098C13.2435 10.0875 12.7776 9.74288 12.6824 9.61642C12.4888 9.4065 12.4878 9.10442 12.3573 8.85917C12.0378 8.11882 11.6707 7.3841 11.1571 6.75741C10.6144 6.07184 9.94472 5.50455 9.35643 4.86096C8.9197 4.41194 8.80296 3.77245 8.41743 3.28963C7.88597 2.50474 6.20559 2.29072 5.95931 3.3992C5.96034 3.43402 5.94959 3.45603 5.91937 3.47805C5.78318 3.57687 5.66184 3.69002 5.55995 3.82672C5.3106 4.17386 5.2722 4.76266 5.5835 5.07447C5.59374 4.91011 5.59937 4.75498 5.72942 4.63722C5.97007 4.84407 6.33358 4.91677 6.61262 4.76266C7.22907 5.64279 7.07547 6.86032 7.56494 7.80855C7.70011 8.0328 7.8363 8.26167 8.00987 8.45827C8.15067 8.67741 8.63707 8.93597 8.66574 9.13872C8.67086 9.48688 8.6299 9.8673 8.85825 10.1586C8.96577 10.3767 8.70158 10.5959 8.48859 10.5687C8.21211 10.6066 7.8747 10.3829 7.63252 10.5206C7.54702 10.6133 7.3796 10.5109 7.30587 10.6394C7.28027 10.706 7.14203 10.7997 7.22446 10.8637C7.31611 10.794 7.4011 10.7213 7.52449 10.7628C7.50606 10.8631 7.58542 10.8775 7.6484 10.9067C7.64635 10.9748 7.60641 11.0444 7.65864 11.1022C7.71956 11.0408 7.75592 10.9538 7.85268 10.9282C8.17422 11.3567 8.50139 10.4945 9.1972 10.8826C9.05588 10.8759 8.93044 10.8933 8.83521 11.0096C8.81166 11.0357 8.79169 11.0664 8.83316 11.1002C9.20846 10.858 9.20641 11.1831 9.45012 11.0833C9.63752 10.9855 9.82388 10.8631 10.0466 10.898C9.83003 10.9604 9.82132 11.1345 9.69435 11.2814C9.67284 11.304 9.6626 11.3296 9.68769 11.3669C10.1372 11.3291 10.1741 11.1796 10.5371 10.9963C10.8079 10.8309 11.0778 11.2318 11.3123 11.0034C11.364 10.9538 11.4346 10.9707 11.4986 10.964C11.4167 10.5273 10.5161 11.0439 10.5304 10.4581C10.8202 10.261 10.7537 9.88368 10.7731 9.57904C11.1064 9.76387 11.4771 9.87139 11.8038 10.048C11.9687 10.3143 12.2272 10.666 12.5718 10.643C12.581 10.6164 12.5892 10.5928 12.5989 10.5657C12.7034 10.5836 12.8375 10.6527 12.8949 10.5206C13.051 10.6839 13.2804 10.6757 13.4847 10.6338C13.6357 10.5109 13.2005 10.3358 13.1422 10.2093L13.1427 10.2098ZM17.8147 8.14595L17.1296 7.22128C16.5316 7.90531 16.1322 8.23863 16.1251 8.24477C16.1215 8.24835 15.74 8.61955 15.3924 8.93802C15.0514 9.25034 14.7821 9.49763 14.6449 9.76797C14.607 9.84272 14.5246 10.1182 14.6403 10.3936C14.7294 10.6066 14.9111 10.7582 15.1809 10.8442C15.2618 10.8698 15.3392 10.8811 15.4129 10.8811C15.8988 10.8811 16.2177 10.3936 16.2198 10.3895C16.2239 10.3839 16.6371 9.79357 17.1404 9.0481C17.3078 8.80029 17.4993 8.53815 17.8147 8.14544V8.14595ZM21.0357 10.2754C21.0357 10.1392 20.986 10.0076 20.8959 9.9057L20.8109 9.80944C20.2974 9.2273 18.979 7.73277 18.4659 7.15216C17.8218 6.42307 17.1015 5.49379 17.0416 5.41597L16.955 5.23677V4.92138C16.955 4.80567 16.932 4.69251 16.8874 4.58602L16.7041 4.15082C16.7016 4.14467 16.7006 4.13751 16.7016 4.13085L16.7088 4.07043C16.7098 4.06071 16.7144 4.052 16.7221 4.04535C16.8649 3.91939 17.3964 3.51082 18.2192 3.54512C18.3267 3.54973 18.3456 3.49085 18.3487 3.46576C18.3635 3.34493 18.0876 3.20259 17.8305 3.14986C17.4773 3.07767 16.5383 2.88618 15.7872 3.37923L15.7815 3.38333C15.2961 3.78883 14.906 4.09859 14.9019 4.10167L14.8932 4.11037C14.8876 4.11703 14.7504 4.28138 14.7836 4.49079C14.8051 4.62698 14.7345 4.67562 14.7304 4.67818C14.7263 4.68074 14.63 4.74115 14.5307 4.67306C14.4104 4.58295 14.2015 4.73757 14.159 4.77136L13.8436 5.04272L13.8375 5.04887C13.8318 5.05552 13.6967 5.21373 13.8774 5.46768C14.0336 5.68733 14.0888 5.76055 14.2245 5.92951C14.3623 6.10051 14.6106 6.31709 14.6239 6.32835C14.63 6.33347 14.7816 6.44816 14.9905 6.28842C15.162 6.15683 15.2997 6.03805 15.2997 6.03805C15.311 6.02883 15.4103 5.94691 15.4149 5.82608C15.4165 5.79127 15.4149 5.76106 15.4149 5.73341C15.4124 5.64842 15.4119 5.62333 15.4759 5.58237C15.5066 5.58237 15.6008 5.61667 15.6817 5.65763C15.6904 5.66275 15.8926 5.77642 16.0764 5.76823C16.1921 5.78359 16.3201 5.91517 16.3642 5.96893C16.3683 5.97303 16.7594 6.38365 17.3104 7.10403C17.4153 7.24074 17.8008 7.75427 17.9063 7.89763C18.0824 8.13725 18.3492 8.49975 18.6359 8.8904C19.1326 9.56675 19.6896 10.325 19.9425 10.666C20.0265 10.7792 20.1489 10.856 20.2871 10.8826L20.3808 10.9005C20.4167 10.9072 20.4525 10.9108 20.4883 10.9108C20.6542 10.9108 20.8114 10.8381 20.9153 10.709L20.921 10.7019C20.9957 10.6071 21.0367 10.4858 21.0367 10.3609V10.2754H21.0357ZM21.4765 4.20253L21.3674 4.09347C21.3357 4.06173 21.2912 4.04279 21.2461 4.04637C21.201 4.04842 21.1585 4.0689 21.1294 4.10371L20.4433 4.91523C20.4238 4.93827 20.3962 4.95261 20.3665 4.95568L20.1223 4.98026C20.091 4.98333 20.0598 4.9736 20.0357 4.95363L19.6456 4.62339C19.6205 4.60189 19.6056 4.57117 19.6046 4.5384L19.599 4.34282C19.598 4.31466 19.6077 4.28701 19.6256 4.26551L20.2928 3.46167C20.3429 3.40125 20.3424 3.3137 20.2917 3.25328L20.2247 3.17392C20.1806 3.12221 20.1079 3.10327 20.0444 3.12733C19.8867 3.18723 19.4894 3.34237 19.2022 3.49802C18.7962 3.71715 18.5141 4.0648 18.4654 4.40528C18.4296 4.65463 18.4444 5.06576 18.4567 5.28848C18.4613 5.37603 18.4419 5.46359 18.3994 5.54192C18.3472 5.6392 18.255 5.79485 18.1147 5.98224C18.043 6.08106 17.998 6.11741 17.936 6.19063L18.6907 7.07792C18.8725 6.86595 19.0317 6.70519 19.1704 6.55005C19.4239 6.26794 19.5027 6.26538 19.7137 6.25821C19.8437 6.2536 20.0219 6.24797 20.304 6.17731C21.0741 5.9848 21.3178 5.15127 21.328 5.1144L21.5195 4.35715C21.5333 4.30237 21.5169 4.24298 21.477 4.20304L21.4765 4.20253ZM9.63496 9.48842C9.55202 9.812 9.52488 10.3634 9.10402 10.3793C9.0692 10.5662 9.23355 10.6363 9.38255 10.5764C9.53051 10.5083 9.60066 10.6302 9.65032 10.7515C9.87867 10.7848 10.2166 10.6752 10.2294 10.4049C9.8884 10.2083 9.78293 9.83453 9.63445 9.48842H9.63496Z" fill="#1C3C3C"/>
+</g>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/tracing/opik-icon-big.svg b/app/components/base/icons/assets/public/tracing/opik-icon-big.svg
new file mode 100644
index 0000000..99aa2da
--- /dev/null
+++ b/app/components/base/icons/assets/public/tracing/opik-icon-big.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   width="70.700851"
+   height="24"
+   viewBox="0 0 70.700851 24"
+   fill="none"
+   version="1.1"
+   id="svg6"
+   sodipodi:docname="opik-icon-big.svg"
+   inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview6"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:zoom="18.615088"
+     inkscape:cx="36.314629"
+     inkscape:cy="18.989972"
+     inkscape:window-width="2560"
+     inkscape:window-height="1371"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg6" />
+  <rect
+     width="70.700851"
+     height="24"
+     fill="#ffffff"
+     id="rect1"
+     x="0"
+     y="0"
+     style="stroke-width:0.0683761;fill:none" />
+  <path
+     fill-rule="evenodd"
+     clip-rule="evenodd"
+     d="M 14.463316,5.8949744 C 11.191179,4.456547 7.3065299,5.9932444 5.8118769,9.3932308 4.3172308,12.793231 5.8113846,16.694496 9.0834872,18.132923 c 1.3197948,0.580171 2.7316238,0.676855 4.0492308,0.364923 0.567179,-0.13429 1.135863,0.216684 1.270085,0.783863 0.134291,0.56718 -0.216615,1.135864 -0.783863,1.270154 C 11.873983,20.964923 9.9916581,20.83788 8.2340513,20.065231 3.8540444,18.139761 1.9338872,12.969778 3.8795692,8.5437949 5.8252581,4.1177778 10.932786,2.0372103 15.312752,3.9626667 c 2.672342,1.1747624 4.432069,3.564376 4.952137,6.2470423 0.110974,0.57224 -0.262974,1.126017 -0.835214,1.236992 -0.572171,0.110906 -1.126017,-0.263043 -1.236923,-0.835282 C 17.796308,8.5668376 16.46359,6.7742906 14.463316,5.8949744 Z M 18.01388,17.557812 c 0.20424,0.856752 -0.324786,1.716786 -1.181538,1.921026 -0.856752,0.204171 -1.716855,-0.324787 -1.921026,-1.181539 -0.204239,-0.856752 0.324787,-1.716855 1.181539,-1.921025 0.856752,-0.20424 1.716854,0.324786 1.921025,1.181538 z m 1.329368,-1.216547 c 1.144615,-0.272821 1.85135,-1.42188 1.57853,-2.566427 -0.272821,-1.144616 -1.421881,-1.851351 -2.566428,-1.57853 -1.144615,0.27282 -1.85135,1.421812 -1.578529,2.566427 0.27282,1.144615 1.42188,1.85135 2.566427,1.57853 z"
+     fill="url(#paint0_linear_3874_31725)"
+     id="path1"
+     style="fill:url(#paint0_linear_3874_31725);stroke-width:0.0683761" />
+  <path
+     d="m 31.039658,17.805538 c -1.082803,0 -2.046769,-0.231042 -2.891897,-0.693196 -0.84506,-0.475419 -1.511932,-1.122462 -2.000479,-1.941128 -0.488615,-0.818667 -0.732855,-1.749607 -0.732855,-2.792821 0,-1.056342 0.24424,-1.987282 0.732855,-2.7928204 0.488547,-0.8186666 1.155419,-1.4590769 2.000479,-1.9212991 0.845128,-0.4621538 1.809094,-0.6931966 2.891897,-0.6931966 1.096,0 2.06653,0.2310428 2.911658,0.6931966 0.858257,0.4622222 1.525128,1.096 2.000479,1.9015385 0.488615,0.80547 0.732855,1.742974 0.732855,2.812581 0,1.043214 -0.24424,1.974154 -0.732855,2.792821 -0.475351,0.818666 -1.142222,1.465709 -2.000479,1.941128 -0.845128,0.462154 -1.815658,0.693196 -2.911658,0.693196 z m 0,-2.119316 c 0.607385,0 1.148786,-0.132102 1.624137,-0.396171 0.475419,-0.264068 0.845128,-0.647042 1.109196,-1.148786 0.277334,-0.501812 0.416,-1.089436 0.416,-1.762872 0,-0.686632 -0.138666,-1.274256 -0.416,-1.762803 -0.264068,-0.501812 -0.633777,-0.8847182 -1.109196,-1.148855 -0.475351,-0.2640683 -1.01012,-0.3961025 -1.604376,-0.3961025 -0.607385,0 -1.148787,0.1320342 -1.624137,0.3961025 -0.462222,0.2641368 -0.831932,0.647043 -1.109265,1.148855 -0.277265,0.488547 -0.415932,1.076171 -0.415932,1.762803 0,0.673436 0.138667,1.26106 0.415932,1.762872 0.277333,0.501744 0.647043,0.884718 1.109265,1.148786 0.47535,0.264069 1.01012,0.396171 1.604376,0.396171 z"
+     fill="#3a3a3a"
+     id="path2"
+     style="stroke-width:0.0683761" />
+  <path
+     d="m 44.915145,17.805538 c -0.858256,0 -1.643966,-0.198017 -2.35706,-0.594188 -0.699829,-0.396171 -1.261059,-0.990359 -1.683555,-1.782632 -0.409368,-0.805539 -0.614017,-1.822291 -0.614017,-3.050325 0,-1.241231 0.198017,-2.257983 0.594188,-3.0503246 0.409367,-0.7922735 0.963966,-1.3798975 1.663795,-1.7628034 0.699829,-0.396171 1.498735,-0.5941881 2.396649,-0.5941881 1.043214,0 1.960958,0.2244787 2.753231,0.6734359 0.80547,0.4489573 1.439316,1.076171 1.90147,1.881641 0.475351,0.8055382 0.713026,1.7562392 0.713026,2.8522392 0,1.096 -0.237675,2.053333 -0.713026,2.872069 -0.462154,0.80547 -1.096,1.432683 -1.90147,1.881641 -0.792273,0.448957 -1.710017,0.673435 -2.753231,0.673435 z m -4.714598,3.703932 c -0.634188,0 -1.148308,-0.514051 -1.148308,-1.148239 V 8.2381538 c 0,-0.634188 0.51412,-1.1482393 1.148308,-1.1482393 h 0.06044 c 0.634188,0 1.148308,0.5140513 1.148308,1.1482393 v 1.3474188 l -0.07925,2.8126494 0.198086,2.812581 v 5.150428 c 0,0.634188 -0.51412,1.148239 -1.148308,1.148239 z m 4.437333,-5.823248 c 0.594188,0 1.122394,-0.132102 1.584547,-0.396171 0.475351,-0.264068 0.851693,-0.647042 1.129026,-1.148786 0.277265,-0.501812 0.415932,-1.089436 0.415932,-1.762872 0,-0.686632 -0.138667,-1.274256 -0.415932,-1.762803 C 47.07412,10.113778 46.697778,9.7308718 46.222427,9.466735 45.760274,9.2026667 45.232068,9.0706325 44.63788,9.0706325 c -0.594256,0 -1.129025,0.1320342 -1.604376,0.3961025 -0.475419,0.2641368 -0.85176,0.647043 -1.129025,1.148855 -0.277334,0.488547 -0.415932,1.076171 -0.415932,1.762803 0,0.673436 0.138598,1.26106 0.415932,1.762872 0.277265,0.501744 0.653606,0.884718 1.129025,1.148786 0.475351,0.264069 1.01012,0.396171 1.604376,0.396171 z"
+     fill="#3a3a3a"
+     id="path3"
+     style="stroke-width:0.0683761" />
+  <path
+     d="m 53.779282,17.66694 c -0.634188,0 -1.148308,-0.514119 -1.148308,-1.148308 V 8.2381538 c 0,-0.634188 0.51412,-1.1482393 1.148308,-1.1482393 h 0.179282 c 0.634188,0 1.148308,0.5140513 1.148308,1.1482393 v 8.2804782 c 0,0.634189 -0.51412,1.148308 -1.148308,1.148308 z m 0.09956,-12.3200819 c -0.462154,0 -0.845129,-0.1452513 -1.148855,-0.4357607 -0.290462,-0.2905025 -0.435692,-0.6404307 -0.435692,-1.0497777 0,-0.4225505 0.14523,-0.7724787 0.435692,-1.0497778 0.303726,-0.2905026 0.686701,-0.4357607 1.148855,-0.4357607 0.462153,0 0.838495,0.138653 1.129025,0.4159521 0.303658,0.2640958 0.455522,0.6008205 0.455522,1.0101676 0,0.4357538 -0.145231,0.8054906 -0.435761,1.1091965 -0.290462,0.2905094 -0.673436,0.4357607 -1.148786,0.4357607 z"
+     fill="#3a3a3a"
+     id="path4"
+     style="stroke-width:0.0683761" />
+  <path
+     d="m 60.376821,15.30988 0.05942,-3.109743 5.22106,-4.8280344 c 0.196169,-0.1814701 0.453537,-0.2821881 0.72075,-0.2821881 v 0 c 0.944752,0 1.41894,1.141265 0.752274,1.8107351 l -2.891077,2.9033164 -1.307282,1.089436 z m -0.872069,2.35706 c -0.634188,0 -1.148239,-0.514119 -1.148239,-1.148308 V 4.1182838 c 0,-0.6341812 0.514051,-1.1482872 1.148239,-1.1482872 h 0.179351 c 0.634188,0 1.148307,0.514106 1.148307,1.1482872 V 16.518632 c 0,0.634189 -0.514119,1.148308 -1.148307,1.148308 z m 7.382017,0 c -0.346598,0 -0.674666,-0.156581 -0.892718,-0.426051 l -3.517675,-4.347487 1.564786,-1.980718 3.848206,4.89641 c 0.592,0.753368 0.05538,1.857846 -0.902838,1.857846 z"
+     fill="#3a3a3a"
+     id="path5"
+     style="stroke-width:0.0683761" />
+  <defs
+     id="defs6">
+    <linearGradient
+       id="paint0_linear_3874_31725"
+       x1="258.13101"
+       y1="269.78299"
+       x2="88.645203"
+       y2="75.4571"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.06837607)">
+      <stop
+         stop-color="#FB9341"
+         id="stop5" />
+      <stop
+         offset="1"
+         stop-color="#E30D3E"
+         id="stop6" />
+    </linearGradient>
+  </defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/tracing/opik-icon.svg b/app/components/base/icons/assets/public/tracing/opik-icon.svg
new file mode 100644
index 0000000..fb49254
--- /dev/null
+++ b/app/components/base/icons/assets/public/tracing/opik-icon.svg
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   width="47.133904"
+   height="16"
+   viewBox="0 0 47.133904 16"
+   fill="none"
+   version="1.1"
+   id="svg6"
+   sodipodi:docname="opik-icon.svg"
+   inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview6"
+     pagecolor="#b95d5d"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:zoom="18.615087"
+     inkscape:cx="34.541874"
+     inkscape:cy="18.882533"
+     inkscape:window-width="2560"
+     inkscape:window-height="1371"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg6" />
+  <rect
+     width="47.119099"
+     height="15.98219"
+     fill="#ffffff"
+     id="rect1"
+     x="0"
+     y="0"
+     style="stroke-width:0.0455515;fill:none"
+     inkscape:label="rect1" />
+  <path
+     fill-rule="evenodd"
+     clip-rule="evenodd"
+     d="M 9.6391824,3.9256084 C 7.4584431,2.9677242 4.8694901,3.9910489 3.8733677,6.2551834 2.8772499,8.519327 3.8730396,11.117275 6.0537561,12.075159 c 0.8795869,0.38635 1.8205107,0.450735 2.6986394,0.243012 0.3780009,-0.08943 0.7570043,0.144295 0.8464576,0.521993 0.089499,0.377699 -0.1443649,0.7564 -0.5224113,0.845827 C 7.9135024,13.961058 6.6590133,13.876457 5.4876434,13.361931 2.568556,12.079712 1.2888532,8.636894 2.5855671,5.6895232 3.8822857,2.7421295 7.286235,1.3566284 10.205295,2.6388372 11.986296,3.4211403 13.15908,5.0124429 13.505682,6.7988966 13.579642,7.1799648 13.330421,7.548739 12.949049,7.6226396 12.567721,7.6964947 12.198606,7.447473 12.124692,7.0664048 11.860478,5.7048679 10.972279,4.5111667 9.6391824,3.9256084 Z m 2.3662996,7.7665706 c 0.136116,0.570532 -0.216457,1.14325 -0.787445,1.279258 -0.570989,0.135962 -1.14421,-0.216283 -1.2802814,-0.786816 -0.1361171,-0.570532 0.2164564,-1.143295 0.7874454,-1.279258 0.570987,-0.136008 1.14421,0.216283 1.280281,0.786816 z m 0.885967,-0.810128 c 0.762836,-0.181679 1.233846,-0.9468664 1.052022,-1.7090479 -0.181824,-0.7622275 -0.947622,-1.2328598 -1.710414,-1.0511819 -0.762838,0.1816779 -1.233846,0.9468196 -1.052023,1.7090471 0.181823,0.7622277 0.947623,1.2328597 1.710415,1.0511827 z"
+     fill="url(#paint0_linear_3874_31725)"
+     id="path1"
+     style="fill:url(#paint0_linear_3874_31725);stroke-width:0.0455515" />
+  <path
+     d="m 20.686606,11.857146 c -0.721642,0 -1.364084,-0.153857 -1.927326,-0.461616 -0.563197,-0.316594 -1.007638,-0.747475 -1.333234,-1.292646 -0.325641,-0.54517 -0.488416,-1.165106 -0.488416,-1.8598076 0,-0.703444 0.162775,-1.32338 0.488416,-1.8598079 0.325596,-0.5451702 0.770037,-0.9716351 1.333234,-1.2794403 0.563242,-0.3077596 1.205684,-0.4616167 1.927326,-0.4616167 0.730437,0 1.377254,0.1538571 1.940495,0.4616167 0.571992,0.3078052 1.016434,0.7298533 1.333234,1.2662813 0.325641,0.5363823 0.488417,1.1606894 0.488417,1.8729669 0,0.6947016 -0.162776,1.3146376 -0.488417,1.8598076 -0.3168,0.545171 -0.761242,0.976052 -1.333234,1.292646 -0.563241,0.307759 -1.210058,0.461616 -1.940495,0.461616 z m 0,-1.411304 c 0.404796,0 0.765617,-0.08797 1.082418,-0.263821 0.316846,-0.17585 0.563242,-0.4308815 0.739232,-0.7650049 0.184831,-0.3341689 0.277246,-0.7254822 0.277246,-1.1739397 0,-0.4572454 -0.09241,-0.8485586 -0.277246,-1.1738941 C 22.332266,6.7350133 22.08587,6.4800268 21.769024,6.3041317 21.452223,6.1282821 21.095822,6.0403572 20.699776,6.0403572 c -0.404796,0 -0.765617,0.087925 -1.082418,0.2637745 -0.308051,0.1758951 -0.554446,0.4308816 -0.739277,0.7650506 -0.184786,0.3253355 -0.277201,0.7166487 -0.277201,1.1738941 0,0.4484575 0.09241,0.8397708 0.277201,1.1739397 0.184831,0.3341234 0.431226,0.5891549 0.739277,0.7650049 0.316801,0.17585 0.673201,0.263821 1.069248,0.263821 z"
+     fill="#3a3a3a"
+     id="path2"
+     style="stroke-width:0.0455515" />
+  <path
+     d="m 29.934026,11.857146 c -0.571992,0 -1.095634,-0.131865 -1.57088,-0.395684 -0.466407,-0.26382 -0.840442,-0.659504 -1.122018,-1.1871 -0.272826,-0.5364272 -0.409217,-1.2135074 -0.409217,-2.0312856 0,-0.826566 0.131971,-1.5036463 0.396002,-2.0312862 0.272826,-0.5275944 0.642442,-0.9189077 1.108848,-1.1738942 0.466406,-0.26382 0.998843,-0.3956845 1.597265,-0.3956845 0.695257,0 1.306893,0.1494859 1.83491,0.4484576 0.536811,0.2989717 0.959243,0.7166486 1.267248,1.253031 0.316801,0.5364279 0.475202,1.169523 0.475202,1.8993763 0,0.7298534 -0.158401,1.3673652 -0.475202,1.9125806 -0.308005,0.536383 -0.730437,0.95406 -1.267248,1.253031 -0.528017,0.298972 -1.139653,0.448458 -1.83491,0.448458 z m -3.142079,2.466539 c -0.422659,0 -0.765298,-0.342319 -0.765298,-0.764641 V 5.4859892 c 0,-0.4223213 0.342639,-0.7646408 0.765298,-0.7646408 h 0.04028 c 0.42266,0 0.765299,0.3423195 0.765299,0.7646408 v 0.8972793 l -0.05281,1.8730126 0.132016,1.8729669 v 3.429796 c 0,0.422322 -0.342639,0.764641 -0.765298,0.764641 z m 2.957293,-3.877843 c 0.396001,0 0.748027,-0.08797 1.056033,-0.263821 0.316801,-0.17585 0.567616,-0.4308815 0.752447,-0.7650049 0.184786,-0.3341689 0.277201,-0.7254822 0.277201,-1.1739397 0,-0.4572454 -0.09241,-0.8485586 -0.277201,-1.1738941 C 31.372889,6.7350133 31.122074,6.4800268 30.805273,6.3041317 30.497267,6.1282821 30.145241,6.0403572 29.74924,6.0403572 c -0.396046,0 -0.752447,0.087925 -1.069248,0.2637745 -0.316846,0.1758951 -0.567662,0.4308816 -0.752447,0.7650506 -0.184831,0.3253355 -0.277201,0.7166487 -0.277201,1.1738941 0,0.4484575 0.09237,0.8397708 0.277201,1.1739397 0.184785,0.3341234 0.435601,0.5891549 0.752447,0.7650049 0.316801,0.17585 0.673202,0.263821 1.069248,0.263821 z"
+     fill="#3a3a3a"
+     id="path3"
+     style="stroke-width:0.0455515" />
+  <path
+     d="m 35.841594,11.76485 c -0.422659,0 -0.765298,-0.342365 -0.765298,-0.764686 V 5.4859892 c 0,-0.4223213 0.342639,-0.7646408 0.765298,-0.7646408 h 0.119484 c 0.422659,0 0.765298,0.3423195 0.765298,0.7646408 v 5.5141748 c 0,0.422321 -0.342639,0.764686 -0.765298,0.764686 z m 0.06635,-8.2042457 c -0.308006,0 -0.563241,-0.096726 -0.765662,-0.2901837 -0.19358,-0.1934528 -0.290371,-0.4264787 -0.290371,-0.6990729 0,-0.2813867 0.0968,-0.5144125 0.290371,-0.6990728 0.202421,-0.1934528 0.457656,-0.2901838 0.765662,-0.2901838 0.308006,0 0.558822,0.092332 0.752448,0.2769928 0.202375,0.1758678 0.303585,0.4001011 0.303585,0.6726954 0,0.2901792 -0.0968,0.536396 -0.290415,0.7386413 -0.19358,0.1934573 -0.448817,0.2901837 -0.765618,0.2901837 z"
+     fill="#3a3a3a"
+     id="path4"
+     style="stroke-width:0.0455515" />
+  <path
+     d="m 40.238571,10.195226 0.0396,-2.0708549 3.479613,-3.2151067 c 0.130739,-0.1208454 0.302264,-0.187916 0.480351,-0.187916 v 0 c 0.629636,0 0.945662,0.7599964 0.501357,1.2058131 l -1.926779,1.9333896 -0.871247,0.7254822 z m -0.581195,1.569624 c -0.42266,0 -0.765253,-0.342365 -0.765253,-0.764686 V 2.7424664 c 0,-0.4223168 0.342593,-0.7646726 0.765253,-0.7646726 h 0.119528 c 0.42266,0 0.765298,0.3423558 0.765298,0.7646726 v 8.2576976 c 0,0.422321 -0.342638,0.764686 -0.765298,0.764686 z m 4.919799,0 c -0.230994,0 -0.449637,-0.104271 -0.594959,-0.283718 l -2.34438,-2.8950987 1.042863,-1.3190088 2.564664,3.2606405 c 0.394542,0.501685 0.03692,1.237185 -0.601702,1.237185 z"
+     fill="#3a3a3a"
+     id="path5"
+     style="stroke-width:0.0455515" />
+  <defs
+     id="defs6">
+    <linearGradient
+       id="paint0_linear_3874_31725"
+       x1="258.13101"
+       y1="269.78299"
+       x2="88.645203"
+       y2="75.4571"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.04556973,0.04553331)">
+      <stop
+         stop-color="#FB9341"
+         id="stop5" />
+      <stop
+         offset="1"
+         stop-color="#E30D3E"
+         id="stop6" />
+    </linearGradient>
+  </defs>
+</svg>
diff --git a/app/components/base/icons/assets/public/tracing/tracing-icon.svg b/app/components/base/icons/assets/public/tracing/tracing-icon.svg
new file mode 100644
index 0000000..b58357f
--- /dev/null
+++ b/app/components/base/icons/assets/public/tracing/tracing-icon.svg
@@ -0,0 +1,6 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="analytics-fill">
+<path id="Vector" opacity="0.6" d="M5 2.5C3.61929 2.5 2.5 3.61929 2.5 5V9.16667H6.15164C6.78293 9.16667 7.36003 9.52333 7.64235 10.088L8.33333 11.4699L10.9213 6.29399C11.0625 6.01167 11.351 5.83333 11.6667 5.83333C11.9823 5.83333 12.2708 6.01167 12.412 6.29399L13.8483 9.16667H17.5V5C17.5 3.61929 16.3807 2.5 15 2.5H5Z" fill="white"/>
+<path id="Vector_2" d="M2.5 14.9999C2.5 16.3807 3.61929 17.4999 5 17.4999H15C16.3807 17.4999 17.5 16.3807 17.5 14.9999V10.8333H13.8483C13.2171 10.8333 12.64 10.4766 12.3577 9.91195L11.6667 8.53003L9.07867 13.7059C8.9375 13.9883 8.649 14.1666 8.33333 14.1666C8.01769 14.1666 7.72913 13.9883 7.58798 13.7059L6.15164 10.8333H2.5V14.9999Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/tracing/weave-icon-big.svg b/app/components/base/icons/assets/public/tracing/weave-icon-big.svg
new file mode 100644
index 0000000..9b1f9a8
--- /dev/null
+++ b/app/components/base/icons/assets/public/tracing/weave-icon-big.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="124px" height="16px" viewBox="0 0 120 16" version="1.1">
+<g id="surface1">
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 20.847656 3.292969 C 20.875 3.292969 20.902344 3.292969 20.933594 3.292969 C 20.949219 3.292969 20.964844 3.292969 20.980469 3.292969 C 21.035156 3.292969 21.089844 3.292969 21.140625 3.292969 C 21.179688 3.292969 21.21875 3.292969 21.253906 3.292969 C 21.359375 3.292969 21.464844 3.292969 21.566406 3.292969 C 21.675781 3.292969 21.78125 3.292969 21.890625 3.292969 C 22.097656 3.292969 22.300781 3.292969 22.507812 3.292969 C 22.738281 3.292969 22.972656 3.292969 23.207031 3.296875 C 23.6875 3.296875 24.167969 3.296875 24.648438 3.296875 C 24.648438 3.519531 24.648438 3.742188 24.648438 3.96875 C 24.113281 4.042969 24.113281 4.042969 23.566406 4.113281 C 23.667969 4.496094 23.769531 4.882812 23.867188 5.265625 C 23.878906 5.308594 23.878906 5.308594 23.890625 5.351562 C 24.128906 6.269531 24.371094 7.183594 24.609375 8.097656 C 24.675781 8.339844 24.738281 8.582031 24.800781 8.824219 C 24.816406 8.878906 24.832031 8.933594 24.84375 8.992188 C 24.867188 9.078125 24.890625 9.167969 24.914062 9.257812 C 24.921875 9.289062 24.933594 9.320312 24.941406 9.355469 C 24.953125 9.398438 24.964844 9.441406 24.976562 9.484375 C 24.984375 9.523438 24.984375 9.523438 24.996094 9.558594 C 25.007812 9.625 25.007812 9.625 25.007812 9.71875 C 25.023438 9.71875 25.039062 9.71875 25.054688 9.71875 C 25.058594 9.707031 25.058594 9.695312 25.0625 9.679688 C 25.097656 9.492188 25.152344 9.3125 25.210938 9.128906 C 25.222656 9.097656 25.234375 9.0625 25.246094 9.027344 C 25.269531 8.953125 25.292969 8.882812 25.316406 8.808594 C 25.355469 8.691406 25.390625 8.574219 25.429688 8.457031 C 25.464844 8.339844 25.503906 8.21875 25.542969 8.097656 C 25.660156 7.738281 25.773438 7.375 25.890625 7.011719 C 25.902344 6.96875 25.917969 6.921875 25.933594 6.875 C 26.226562 5.945312 26.519531 5.019531 26.808594 4.089844 C 26.785156 4.089844 26.765625 4.089844 26.742188 4.085938 C 26.507812 4.074219 26.273438 4.046875 26.042969 4.015625 C 26.007812 4.011719 25.972656 4.007812 25.933594 4.003906 C 25.851562 3.992188 25.765625 3.980469 25.679688 3.96875 C 25.679688 3.746094 25.679688 3.523438 25.679688 3.296875 C 26.175781 3.296875 26.667969 3.296875 27.160156 3.296875 C 27.390625 3.292969 27.621094 3.292969 27.851562 3.292969 C 28.050781 3.292969 28.25 3.292969 28.449219 3.292969 C 28.554688 3.292969 28.660156 3.292969 28.765625 3.292969 C 28.867188 3.292969 28.964844 3.292969 29.066406 3.292969 C 29.101562 3.292969 29.140625 3.292969 29.175781 3.292969 C 29.226562 3.292969 29.273438 3.292969 29.324219 3.292969 C 29.367188 3.292969 29.367188 3.292969 29.410156 3.292969 C 29.472656 3.296875 29.472656 3.296875 29.496094 3.320312 C 29.5 3.367188 29.5 3.417969 29.5 3.464844 C 29.5 3.492188 29.5 3.515625 29.5 3.542969 C 29.496094 3.59375 29.496094 3.59375 29.496094 3.648438 C 29.496094 3.753906 29.496094 3.859375 29.496094 3.96875 C 29.09375 4.015625 28.6875 4.066406 28.273438 4.113281 C 28.679688 5.460938 28.679688 5.460938 29.089844 6.808594 C 29.105469 6.859375 29.121094 6.910156 29.136719 6.960938 C 29.234375 7.292969 29.335938 7.625 29.4375 7.960938 C 29.484375 8.113281 29.53125 8.265625 29.578125 8.417969 C 29.605469 8.507812 29.632812 8.597656 29.660156 8.691406 C 29.878906 9.40625 29.878906 9.40625 29.976562 9.746094 C 30.027344 9.664062 30.046875 9.601562 30.070312 9.507812 C 30.078125 9.484375 30.078125 9.484375 30.085938 9.457031 C 30.101562 9.402344 30.117188 9.34375 30.132812 9.289062 C 30.144531 9.25 30.152344 9.207031 30.164062 9.167969 C 30.1875 9.082031 30.214844 8.992188 30.238281 8.90625 C 30.292969 8.691406 30.351562 8.480469 30.410156 8.269531 C 30.433594 8.191406 30.453125 8.117188 30.472656 8.042969 C 30.621094 7.5 30.769531 6.960938 30.921875 6.421875 C 30.949219 6.324219 30.976562 6.226562 31 6.128906 C 31.066406 5.902344 31.128906 5.675781 31.191406 5.449219 C 31.230469 5.308594 31.269531 5.164062 31.308594 5.023438 C 31.335938 4.925781 31.363281 4.828125 31.390625 4.734375 C 31.402344 4.6875 31.414062 4.640625 31.429688 4.59375 C 31.445312 4.53125 31.464844 4.46875 31.480469 4.40625 C 31.488281 4.386719 31.492188 4.367188 31.496094 4.347656 C 31.515625 4.277344 31.535156 4.207031 31.558594 4.136719 C 31.210938 4.074219 30.855469 4.023438 30.503906 3.96875 C 30.503906 3.746094 30.503906 3.523438 30.503906 3.296875 C 30.878906 3.296875 31.253906 3.296875 31.628906 3.296875 C 31.804688 3.292969 31.976562 3.292969 32.152344 3.292969 C 32.304688 3.292969 32.457031 3.292969 32.605469 3.292969 C 32.6875 3.292969 32.769531 3.292969 32.847656 3.292969 C 32.9375 3.292969 33.027344 3.292969 33.117188 3.292969 C 33.144531 3.292969 33.171875 3.292969 33.199219 3.292969 C 33.222656 3.292969 33.246094 3.292969 33.273438 3.292969 C 33.304688 3.292969 33.304688 3.292969 33.335938 3.292969 C 33.382812 3.296875 33.382812 3.296875 33.40625 3.320312 C 33.410156 3.367188 33.410156 3.414062 33.410156 3.460938 C 33.410156 3.488281 33.410156 3.515625 33.410156 3.542969 C 33.410156 3.574219 33.410156 3.605469 33.410156 3.632812 C 33.410156 3.664062 33.410156 3.695312 33.410156 3.726562 C 33.410156 3.796875 33.410156 3.871094 33.40625 3.945312 C 33.292969 3.964844 33.175781 3.984375 33.0625 4.007812 C 33.023438 4.011719 32.984375 4.019531 32.945312 4.027344 C 32.738281 4.0625 32.535156 4.097656 32.328125 4.113281 C 32.320312 4.144531 32.320312 4.144531 32.3125 4.179688 C 32.238281 4.480469 32.15625 4.78125 32.070312 5.082031 C 32.058594 5.128906 32.042969 5.171875 32.03125 5.21875 C 31.875 5.78125 31.714844 6.347656 31.550781 6.910156 C 31.375 7.535156 31.195312 8.160156 31.019531 8.785156 C 30.992188 8.871094 30.96875 8.957031 30.945312 9.042969 C 30.835938 9.433594 30.722656 9.820312 30.613281 10.210938 C 30.566406 10.378906 30.519531 10.542969 30.472656 10.707031 C 30.445312 10.804688 30.417969 10.902344 30.390625 11 C 30.277344 11.390625 30.167969 11.785156 30.046875 12.175781 C 29.730469 12.175781 29.414062 12.175781 29.089844 12.175781 C 29.03125 12.003906 29.03125 12.003906 28.976562 11.832031 C 28.925781 11.675781 28.878906 11.523438 28.828125 11.367188 C 28.820312 11.347656 28.8125 11.328125 28.808594 11.304688 C 28.632812 10.769531 28.460938 10.230469 28.285156 9.695312 C 28.144531 9.273438 28.007812 8.847656 27.875 8.425781 C 27.695312 7.867188 27.515625 7.308594 27.332031 6.753906 C 27.304688 6.679688 27.28125 6.605469 27.257812 6.53125 C 27.238281 6.476562 27.222656 6.425781 27.207031 6.375 C 27.046875 5.894531 27.046875 5.894531 27.046875 5.796875 C 27.03125 5.796875 27.015625 5.796875 27 5.796875 C 26.996094 5.8125 26.996094 5.828125 26.992188 5.84375 C 26.964844 5.988281 26.925781 6.132812 26.882812 6.273438 C 26.875 6.296875 26.867188 6.316406 26.859375 6.339844 C 26.84375 6.390625 26.828125 6.4375 26.8125 6.488281 C 26.769531 6.625 26.726562 6.761719 26.683594 6.898438 C 26.675781 6.929688 26.664062 6.957031 26.65625 6.988281 C 26.546875 7.328125 26.445312 7.667969 26.339844 8.007812 C 26.316406 8.078125 26.296875 8.144531 26.273438 8.214844 C 26.230469 8.355469 26.1875 8.496094 26.144531 8.636719 C 26.074219 8.863281 26.007812 9.089844 25.9375 9.3125 C 25.933594 9.328125 25.925781 9.347656 25.921875 9.363281 C 25.894531 9.449219 25.871094 9.535156 25.84375 9.617188 C 25.796875 9.769531 25.75 9.921875 25.703125 10.074219 C 25.675781 10.15625 25.652344 10.242188 25.625 10.328125 C 25.613281 10.363281 25.605469 10.394531 25.59375 10.429688 C 25.414062 11.011719 25.234375 11.59375 25.054688 12.175781 C 24.738281 12.175781 24.421875 12.175781 24.097656 12.175781 C 23.816406 11.230469 23.535156 10.285156 23.261719 9.339844 C 23.253906 9.320312 23.25 9.304688 23.246094 9.285156 C 23.195312 9.117188 23.144531 8.949219 23.097656 8.78125 C 22.960938 8.3125 22.824219 7.84375 22.6875 7.375 C 22.664062 7.304688 22.644531 7.234375 22.625 7.164062 C 22.414062 6.449219 22.207031 5.738281 22 5.027344 C 21.976562 4.953125 21.953125 4.878906 21.933594 4.804688 C 21.898438 4.683594 21.859375 4.5625 21.824219 4.441406 C 21.820312 4.421875 21.8125 4.402344 21.808594 4.382812 C 21.796875 4.347656 21.785156 4.3125 21.777344 4.28125 C 21.753906 4.203125 21.742188 4.148438 21.742188 4.066406 C 21.726562 4.066406 21.710938 4.0625 21.691406 4.0625 C 21.382812 4.042969 21.070312 4.003906 20.761719 3.96875 C 20.757812 3.863281 20.757812 3.753906 20.757812 3.648438 C 20.757812 3.617188 20.757812 3.585938 20.757812 3.554688 C 20.757812 3.523438 20.757812 3.496094 20.757812 3.464844 C 20.757812 3.4375 20.757812 3.410156 20.757812 3.382812 C 20.761719 3.296875 20.761719 3.296875 20.847656 3.292969 Z M 20.847656 3.292969 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 82.488281 3.25 C 83.046875 3.246094 83.605469 3.246094 84.167969 3.246094 C 84.425781 3.246094 84.6875 3.246094 84.945312 3.246094 C 85.171875 3.242188 85.398438 3.242188 85.625 3.242188 C 85.746094 3.242188 85.867188 3.242188 85.984375 3.242188 C 88.15625 3.238281 88.15625 3.238281 88.894531 3.898438 C 88.914062 3.914062 88.9375 3.929688 88.957031 3.945312 C 89.191406 4.144531 89.363281 4.402344 89.472656 4.691406 C 89.480469 4.714844 89.492188 4.742188 89.5 4.765625 C 89.65625 5.25 89.601562 5.785156 89.382812 6.234375 C 89.117188 6.753906 88.695312 7.078125 88.152344 7.265625 C 87.984375 7.320312 87.816406 7.367188 87.648438 7.410156 C 87.664062 7.414062 87.679688 7.417969 87.699219 7.421875 C 88.523438 7.605469 89.300781 7.851562 89.78125 8.597656 C 90.0625 9.0625 90.125 9.636719 90.003906 10.164062 C 89.808594 10.804688 89.363281 11.304688 88.78125 11.621094 C 88.324219 11.863281 87.820312 11.988281 87.3125 12.054688 C 87.28125 12.058594 87.253906 12.0625 87.222656 12.066406 C 86.777344 12.121094 86.332031 12.109375 85.882812 12.105469 C 85.765625 12.105469 85.644531 12.105469 85.523438 12.105469 C 85.300781 12.105469 85.074219 12.105469 84.847656 12.105469 C 84.589844 12.105469 84.332031 12.105469 84.074219 12.105469 C 83.546875 12.105469 83.015625 12.101562 82.488281 12.101562 C 82.488281 11.878906 82.488281 11.65625 82.488281 11.429688 C 82.859375 11.390625 83.234375 11.347656 83.617188 11.308594 C 83.617188 8.910156 83.617188 6.511719 83.617188 4.042969 C 83.488281 4.035156 83.363281 4.027344 83.230469 4.019531 C 83.117188 4.007812 83.003906 3.996094 82.890625 3.980469 C 82.863281 3.980469 82.832031 3.976562 82.804688 3.972656 C 82.695312 3.960938 82.59375 3.949219 82.488281 3.921875 C 82.488281 3.699219 82.488281 3.476562 82.488281 3.25 Z M 85.390625 3.96875 C 85.390625 4.242188 85.386719 4.515625 85.382812 4.785156 C 85.382812 4.914062 85.378906 5.039062 85.378906 5.164062 C 85.371094 5.824219 85.367188 6.484375 85.367188 7.144531 C 86.488281 7.183594 86.488281 7.183594 87.457031 6.691406 C 87.796875 6.320312 87.859375 5.832031 87.847656 5.351562 C 87.832031 4.992188 87.71875 4.644531 87.460938 4.378906 C 87 3.96875 86.363281 3.964844 85.78125 3.96875 C 85.742188 3.96875 85.703125 3.96875 85.667969 3.96875 C 85.574219 3.96875 85.484375 3.96875 85.390625 3.96875 Z M 85.390625 7.84375 C 85.390625 9.003906 85.390625 10.160156 85.390625 11.355469 C 86.28125 11.386719 86.28125 11.386719 87.152344 11.21875 C 87.171875 11.214844 87.1875 11.207031 87.207031 11.199219 C 87.578125 11.066406 87.886719 10.824219 88.066406 10.46875 C 88.28125 9.988281 88.289062 9.417969 88.125 8.921875 C 87.960938 8.492188 87.664062 8.234375 87.257812 8.046875 C 86.664062 7.804688 86.023438 7.84375 85.390625 7.84375 Z M 85.390625 7.84375 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 76.167969 3.476562 C 76.367188 3.671875 76.507812 3.917969 76.585938 4.1875 C 76.589844 4.203125 76.59375 4.222656 76.601562 4.242188 C 76.707031 4.675781 76.621094 5.144531 76.414062 5.53125 C 76.34375 5.644531 76.265625 5.746094 76.175781 5.847656 C 76.15625 5.867188 76.136719 5.886719 76.117188 5.910156 C 75.71875 6.332031 75.199219 6.617188 74.6875 6.882812 C 74.707031 6.902344 74.726562 6.921875 74.746094 6.941406 C 74.972656 7.191406 74.972656 7.191406 75.066406 7.296875 C 75.140625 7.382812 75.21875 7.464844 75.300781 7.542969 C 75.351562 7.59375 75.394531 7.640625 75.4375 7.695312 C 75.527344 7.796875 75.621094 7.894531 75.714844 7.992188 C 76.089844 8.394531 76.089844 8.394531 76.253906 8.585938 C 76.351562 8.695312 76.449219 8.800781 76.546875 8.90625 C 76.621094 8.980469 76.691406 9.058594 76.761719 9.136719 C 76.773438 9.152344 76.789062 9.164062 76.800781 9.179688 C 76.824219 9.207031 76.851562 9.234375 76.875 9.261719 C 76.933594 9.324219 76.992188 9.382812 77.0625 9.429688 C 77.070312 9.410156 77.070312 9.410156 77.082031 9.386719 C 77.113281 9.304688 77.152344 9.230469 77.195312 9.15625 C 77.5625 8.476562 77.800781 7.753906 77.976562 7 C 77.953125 7 77.933594 6.996094 77.910156 6.996094 C 77.707031 6.96875 77.5 6.9375 77.296875 6.902344 C 77.273438 6.898438 77.25 6.894531 77.222656 6.890625 C 77.050781 6.859375 77.050781 6.859375 76.96875 6.832031 C 76.960938 6.328125 76.960938 6.328125 77.015625 6.160156 C 77.949219 6.160156 78.886719 6.160156 79.847656 6.160156 C 79.847656 6.367188 79.847656 6.574219 79.847656 6.785156 C 79.53125 6.839844 79.214844 6.894531 78.886719 6.953125 C 78.859375 7.046875 78.832031 7.140625 78.804688 7.234375 C 78.539062 8.09375 78.164062 9.035156 77.601562 9.746094 C 77.5625 9.792969 77.5625 9.792969 77.566406 9.851562 C 77.601562 9.933594 77.648438 9.980469 77.714844 10.039062 C 77.792969 10.113281 77.867188 10.1875 77.9375 10.269531 C 78.027344 10.375 78.125 10.46875 78.222656 10.566406 C 78.308594 10.65625 78.390625 10.742188 78.472656 10.839844 C 78.539062 10.914062 78.601562 10.933594 78.695312 10.949219 C 78.71875 10.953125 78.746094 10.957031 78.769531 10.960938 C 78.796875 10.964844 78.824219 10.96875 78.851562 10.972656 C 78.875 10.980469 78.902344 10.984375 78.933594 10.988281 C 79.019531 11.003906 79.105469 11.019531 79.191406 11.03125 C 79.277344 11.046875 79.363281 11.0625 79.449219 11.078125 C 79.503906 11.085938 79.558594 11.097656 79.613281 11.105469 C 79.648438 11.113281 79.648438 11.113281 79.6875 11.117188 C 79.707031 11.121094 79.730469 11.125 79.75 11.128906 C 79.800781 11.140625 79.800781 11.140625 79.824219 11.164062 C 79.820312 11.421875 79.785156 11.679688 79.753906 11.933594 C 79.691406 11.949219 79.632812 11.964844 79.570312 11.980469 C 79.546875 11.984375 79.546875 11.984375 79.519531 11.992188 C 79.214844 12.066406 78.910156 12.085938 78.597656 12.085938 C 78.539062 12.085938 78.484375 12.085938 78.425781 12.085938 C 77.847656 12.089844 77.332031 11.917969 76.894531 11.523438 C 76.855469 11.484375 76.816406 11.445312 76.777344 11.40625 C 76.71875 11.347656 76.660156 11.296875 76.601562 11.242188 C 76.578125 11.21875 76.578125 11.21875 76.554688 11.195312 C 76.515625 11.160156 76.476562 11.125 76.441406 11.089844 C 76.429688 11.101562 76.417969 11.109375 76.410156 11.117188 C 76.140625 11.351562 75.859375 11.554688 75.542969 11.71875 C 75.511719 11.738281 75.476562 11.757812 75.445312 11.777344 C 75.3125 11.847656 75.179688 11.894531 75.039062 11.9375 C 75.011719 11.945312 75.011719 11.945312 74.984375 11.953125 C 74.632812 12.058594 74.269531 12.089844 73.90625 12.085938 C 73.84375 12.085938 73.785156 12.085938 73.722656 12.089844 C 72.941406 12.089844 72.222656 11.824219 71.652344 11.28125 C 71.203125 10.820312 71.023438 10.246094 71.03125 9.609375 C 71.042969 9.058594 71.230469 8.546875 71.59375 8.132812 C 71.609375 8.113281 71.625 8.09375 71.644531 8.070312 C 71.980469 7.683594 72.398438 7.421875 72.839844 7.171875 C 72.871094 7.152344 72.902344 7.132812 72.9375 7.113281 C 72.960938 7.101562 72.984375 7.085938 73.007812 7.074219 C 72.996094 7.0625 72.988281 7.050781 72.976562 7.042969 C 72.398438 6.425781 72.09375 5.613281 72.113281 4.773438 C 72.128906 4.371094 72.257812 3.988281 72.527344 3.679688 C 72.542969 3.660156 72.558594 3.644531 72.570312 3.625 C 72.917969 3.210938 73.496094 2.996094 74.015625 2.933594 C 74.050781 2.929688 74.050781 2.929688 74.082031 2.925781 C 74.804688 2.847656 75.621094 2.964844 76.167969 3.476562 Z M 73.671875 3.796875 C 73.433594 4.113281 73.414062 4.4375 73.457031 4.820312 C 73.550781 5.460938 73.921875 5.9375 74.328125 6.425781 C 74.398438 6.390625 74.449219 6.355469 74.503906 6.300781 C 74.527344 6.28125 74.527344 6.28125 74.550781 6.257812 C 74.566406 6.242188 74.582031 6.226562 74.597656 6.210938 C 74.613281 6.191406 74.628906 6.175781 74.644531 6.160156 C 74.773438 6.03125 74.890625 5.894531 75 5.75 C 75.019531 5.726562 75.035156 5.699219 75.054688 5.675781 C 75.335938 5.292969 75.5 4.859375 75.457031 4.378906 C 75.40625 4.078125 75.289062 3.820312 75.035156 3.636719 C 74.59375 3.363281 74.03125 3.410156 73.671875 3.796875 Z M 73.046875 7.828125 C 72.664062 8.226562 72.519531 8.789062 72.519531 9.332031 C 72.53125 9.800781 72.71875 10.257812 73.039062 10.601562 C 73.46875 10.996094 73.980469 11.140625 74.550781 11.125 C 74.960938 11.105469 75.339844 11.003906 75.703125 10.8125 C 75.71875 10.804688 75.738281 10.796875 75.753906 10.785156 C 75.84375 10.738281 75.90625 10.699219 75.960938 10.609375 C 75.949219 10.601562 75.941406 10.589844 75.933594 10.582031 C 75.460938 10.074219 75.460938 10.074219 75.25 9.8125 C 75.1875 9.738281 75.125 9.664062 75.0625 9.59375 C 74.972656 9.484375 74.882812 9.375 74.796875 9.265625 C 74.695312 9.132812 74.589844 9.003906 74.480469 8.878906 C 74.390625 8.773438 74.304688 8.667969 74.214844 8.5625 C 74.152344 8.484375 74.085938 8.40625 74.019531 8.328125 C 73.921875 8.214844 73.828125 8.101562 73.734375 7.984375 C 73.726562 7.96875 73.714844 7.957031 73.703125 7.941406 C 73.683594 7.914062 73.660156 7.886719 73.640625 7.859375 C 73.589844 7.792969 73.539062 7.730469 73.488281 7.667969 C 73.460938 7.632812 73.460938 7.632812 73.433594 7.601562 C 73.414062 7.578125 73.414062 7.578125 73.390625 7.554688 C 73.265625 7.554688 73.132812 7.742188 73.046875 7.828125 Z M 73.046875 7.828125 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 49.992188 5.535156 C 50.101562 5.609375 50.101562 5.609375 50.136719 5.679688 C 50.136719 5.746094 50.140625 5.8125 50.140625 5.882812 C 50.140625 5.914062 50.140625 5.914062 50.140625 5.941406 C 50.140625 5.984375 50.140625 6.027344 50.140625 6.070312 C 50.140625 6.136719 50.140625 6.203125 50.140625 6.269531 C 50.140625 6.308594 50.140625 6.351562 50.140625 6.390625 C 50.140625 6.410156 50.140625 6.429688 50.140625 6.453125 C 50.140625 6.589844 50.140625 6.589844 50.113281 6.617188 C 50.074219 6.617188 50.035156 6.621094 49.996094 6.621094 C 49.972656 6.621094 49.949219 6.621094 49.921875 6.621094 C 49.894531 6.621094 49.871094 6.617188 49.84375 6.617188 C 49.816406 6.617188 49.789062 6.617188 49.757812 6.617188 C 49.671875 6.617188 49.585938 6.617188 49.5 6.617188 C 49.441406 6.617188 49.378906 6.617188 49.320312 6.617188 C 49.175781 6.617188 49.03125 6.617188 48.886719 6.617188 C 48.898438 6.640625 48.90625 6.660156 48.917969 6.683594 C 48.929688 6.714844 48.945312 6.746094 48.957031 6.773438 C 48.964844 6.789062 48.96875 6.804688 48.976562 6.820312 C 49.203125 7.339844 49.195312 8 48.988281 8.523438 C 48.75 9.0625 48.355469 9.457031 47.804688 9.671875 C 47.066406 9.941406 46.210938 9.941406 45.457031 9.746094 C 45.277344 10.003906 45.214844 10.273438 45.238281 10.585938 C 45.269531 10.699219 45.316406 10.761719 45.402344 10.835938 C 45.617188 10.945312 45.851562 10.949219 46.089844 10.949219 C 46.113281 10.953125 46.132812 10.953125 46.15625 10.953125 C 46.203125 10.953125 46.25 10.953125 46.292969 10.953125 C 46.367188 10.953125 46.441406 10.953125 46.515625 10.953125 C 46.726562 10.953125 46.9375 10.957031 47.144531 10.957031 C 47.273438 10.957031 47.402344 10.957031 47.53125 10.960938 C 47.582031 10.960938 47.628906 10.960938 47.675781 10.960938 C 48.324219 10.960938 49.039062 11.019531 49.53125 11.492188 C 49.546875 11.511719 49.566406 11.53125 49.585938 11.550781 C 49.601562 11.566406 49.617188 11.582031 49.636719 11.597656 C 49.957031 11.929688 50.0625 12.394531 50.066406 12.84375 C 50.054688 13.351562 49.847656 13.800781 49.511719 14.171875 C 49.496094 14.191406 49.480469 14.207031 49.460938 14.226562 C 48.8125 14.921875 47.769531 15.179688 46.855469 15.210938 C 45.890625 15.234375 44.761719 15.230469 44.015625 14.523438 C 43.738281 14.222656 43.660156 13.886719 43.671875 13.488281 C 43.679688 13.363281 43.699219 13.253906 43.753906 13.136719 C 43.761719 13.117188 43.769531 13.09375 43.78125 13.074219 C 43.996094 12.644531 44.386719 12.410156 44.785156 12.175781 C 44.765625 12.167969 44.746094 12.160156 44.730469 12.152344 C 44.398438 11.996094 44.222656 11.808594 44.089844 11.476562 C 43.988281 11.136719 44.070312 10.757812 44.222656 10.453125 C 44.421875 10.109375 44.695312 9.824219 44.976562 9.550781 C 44.960938 9.542969 44.945312 9.53125 44.925781 9.523438 C 44.757812 9.417969 44.613281 9.304688 44.472656 9.167969 C 44.457031 9.152344 44.441406 9.136719 44.425781 9.121094 C 44.214844 8.902344 44.085938 8.597656 44.015625 8.300781 C 44.011719 8.28125 44.003906 8.257812 44 8.238281 C 43.882812 7.675781 43.964844 7.042969 44.277344 6.558594 C 44.621094 6.070312 45.09375 5.773438 45.671875 5.628906 C 45.6875 5.625 45.703125 5.621094 45.71875 5.617188 C 46.25 5.492188 46.917969 5.496094 47.449219 5.628906 C 47.464844 5.632812 47.480469 5.636719 47.496094 5.640625 C 47.6875 5.691406 47.867188 5.761719 48.046875 5.84375 C 48.0625 5.851562 48.078125 5.859375 48.09375 5.867188 C 48.164062 5.902344 48.226562 5.933594 48.289062 5.980469 C 48.390625 6.066406 48.390625 6.066406 48.515625 6.082031 C 48.582031 6.0625 48.644531 6.035156 48.707031 6.003906 C 48.730469 5.996094 48.753906 5.984375 48.78125 5.976562 C 48.855469 5.941406 48.929688 5.910156 49.003906 5.875 C 49.054688 5.851562 49.101562 5.832031 49.152344 5.808594 C 49.320312 5.738281 49.488281 5.664062 49.652344 5.585938 C 49.679688 5.574219 49.703125 5.566406 49.730469 5.554688 C 49.75 5.542969 49.769531 5.535156 49.789062 5.523438 C 49.867188 5.503906 49.917969 5.515625 49.992188 5.535156 Z M 45.835938 6.507812 C 45.472656 6.984375 45.421875 7.597656 45.492188 8.175781 C 45.550781 8.542969 45.6875 8.890625 45.980469 9.132812 C 46.207031 9.285156 46.46875 9.3125 46.734375 9.277344 C 47.015625 9.21875 47.210938 9.089844 47.375 8.855469 C 47.683594 8.375 47.742188 7.746094 47.640625 7.191406 C 47.5625 6.859375 47.402344 6.507812 47.117188 6.308594 C 46.703125 6.074219 46.152344 6.148438 45.835938 6.507812 Z M 45.238281 12.367188 C 44.957031 12.734375 44.867188 13.113281 44.902344 13.570312 C 44.957031 13.84375 45.09375 14.058594 45.316406 14.226562 C 45.613281 14.417969 46.015625 14.496094 46.367188 14.507812 C 46.394531 14.507812 46.394531 14.507812 46.417969 14.507812 C 47.132812 14.527344 47.90625 14.457031 48.453125 13.945312 C 48.652344 13.738281 48.710938 13.515625 48.703125 13.230469 C 48.683594 12.992188 48.570312 12.800781 48.394531 12.644531 C 48.113281 12.441406 47.726562 12.449219 47.398438 12.449219 C 47.355469 12.449219 47.3125 12.449219 47.269531 12.449219 C 47.15625 12.449219 47.046875 12.449219 46.933594 12.449219 C 46.753906 12.449219 46.574219 12.445312 46.394531 12.445312 C 46.332031 12.445312 46.269531 12.445312 46.210938 12.445312 C 45.882812 12.445312 45.5625 12.414062 45.238281 12.367188 Z M 45.238281 12.367188 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 53.039062 2.382812 C 53.0625 2.390625 53.0625 2.390625 53.085938 2.398438 C 53.140625 2.429688 53.171875 2.453125 53.207031 2.503906 C 53.230469 2.617188 53.21875 2.730469 53.214844 2.84375 C 53.210938 2.878906 53.210938 2.914062 53.210938 2.953125 C 53.207031 3.027344 53.203125 3.105469 53.199219 3.183594 C 53.191406 3.371094 53.183594 3.558594 53.179688 3.746094 C 53.175781 3.792969 53.175781 3.835938 53.175781 3.882812 C 53.15625 4.441406 53.15625 5 53.15625 5.5625 C 53.15625 5.640625 53.15625 5.71875 53.15625 5.792969 C 53.15625 6.085938 53.160156 6.375 53.160156 6.664062 C 53.179688 6.644531 53.195312 6.625 53.214844 6.605469 C 53.238281 6.578125 53.261719 6.550781 53.285156 6.523438 C 53.296875 6.511719 53.3125 6.5 53.324219 6.484375 C 53.78125 5.984375 54.445312 5.601562 55.128906 5.550781 C 55.640625 5.535156 56.128906 5.578125 56.527344 5.929688 C 56.566406 5.964844 56.601562 6 56.640625 6.039062 C 56.664062 6.0625 56.664062 6.0625 56.691406 6.089844 C 57.246094 6.660156 57.203125 7.570312 57.203125 8.304688 C 57.203125 8.414062 57.203125 8.523438 57.207031 8.632812 C 57.207031 8.839844 57.207031 9.042969 57.207031 9.25 C 57.207031 9.484375 57.210938 9.722656 57.210938 9.957031 C 57.210938 10.4375 57.214844 10.921875 57.214844 11.40625 C 57.246094 11.410156 57.246094 11.410156 57.28125 11.414062 C 57.308594 11.417969 57.335938 11.421875 57.363281 11.425781 C 57.40625 11.433594 57.40625 11.433594 57.445312 11.441406 C 57.558594 11.457031 57.671875 11.480469 57.785156 11.503906 C 57.808594 11.507812 57.828125 11.511719 57.851562 11.515625 C 57.878906 11.519531 57.878906 11.519531 57.910156 11.527344 C 57.929688 11.53125 57.949219 11.535156 57.964844 11.539062 C 58.007812 11.550781 58.007812 11.550781 58.03125 11.574219 C 58.035156 11.613281 58.035156 11.65625 58.035156 11.695312 C 58.035156 11.71875 58.035156 11.746094 58.035156 11.769531 C 58.035156 11.796875 58.035156 11.824219 58.035156 11.851562 C 58.035156 11.875 58.035156 11.902344 58.035156 11.929688 C 58.035156 11.964844 58.035156 11.964844 58.035156 12.003906 C 58.035156 12.027344 58.035156 12.050781 58.035156 12.074219 C 58.03125 12.125 58.03125 12.125 58.007812 12.148438 C 57.964844 12.152344 57.921875 12.152344 57.882812 12.152344 C 57.839844 12.152344 57.839844 12.152344 57.796875 12.152344 C 57.769531 12.152344 57.738281 12.152344 57.707031 12.152344 C 57.675781 12.152344 57.640625 12.152344 57.609375 12.152344 C 57.523438 12.152344 57.433594 12.152344 57.347656 12.152344 C 57.257812 12.152344 57.164062 12.152344 57.074219 12.152344 C 56.917969 12.152344 56.765625 12.152344 56.613281 12.152344 C 56.433594 12.152344 56.257812 12.152344 56.082031 12.152344 C 55.929688 12.152344 55.777344 12.152344 55.625 12.152344 C 55.53125 12.152344 55.441406 12.152344 55.351562 12.152344 C 55.265625 12.152344 55.179688 12.152344 55.09375 12.152344 C 55.046875 12.152344 55 12.152344 54.953125 12.152344 C 54.925781 12.152344 54.898438 12.152344 54.871094 12.152344 C 54.847656 12.152344 54.824219 12.152344 54.796875 12.152344 C 54.742188 12.148438 54.742188 12.148438 54.71875 12.125 C 54.71875 12.085938 54.71875 12.042969 54.71875 12.003906 C 54.71875 11.976562 54.71875 11.953125 54.71875 11.925781 C 54.71875 11.902344 54.71875 11.875 54.71875 11.847656 C 54.71875 11.820312 54.71875 11.796875 54.71875 11.769531 C 54.71875 11.703125 54.71875 11.636719 54.71875 11.574219 C 54.8125 11.53125 54.902344 11.507812 55.003906 11.488281 C 55.03125 11.480469 55.0625 11.476562 55.09375 11.46875 C 55.113281 11.464844 55.128906 11.460938 55.144531 11.460938 C 55.191406 11.449219 55.242188 11.441406 55.289062 11.429688 C 55.527344 11.378906 55.527344 11.378906 55.585938 11.378906 C 55.582031 10.90625 55.582031 10.433594 55.578125 9.960938 C 55.578125 9.742188 55.578125 9.523438 55.574219 9.304688 C 55.574219 9.109375 55.574219 8.917969 55.574219 8.726562 C 55.574219 8.625 55.570312 8.527344 55.570312 8.425781 C 55.570312 8.328125 55.570312 8.234375 55.570312 8.136719 C 55.570312 8.101562 55.570312 8.066406 55.570312 8.03125 C 55.570312 7.664062 55.554688 7.199219 55.289062 6.917969 C 55.054688 6.722656 54.742188 6.746094 54.457031 6.761719 C 54.101562 6.800781 53.738281 7.007812 53.464844 7.234375 C 53.425781 7.265625 53.425781 7.265625 53.371094 7.300781 C 53.273438 7.371094 53.214844 7.421875 53.1875 7.539062 C 53.179688 7.640625 53.179688 7.742188 53.183594 7.84375 C 53.183594 7.882812 53.183594 7.921875 53.183594 7.960938 C 53.183594 8.066406 53.183594 8.167969 53.1875 8.273438 C 53.1875 8.386719 53.1875 8.496094 53.1875 8.605469 C 53.1875 8.8125 53.191406 9.023438 53.191406 9.230469 C 53.195312 9.46875 53.195312 9.703125 53.195312 9.941406 C 53.199219 10.429688 53.203125 10.917969 53.207031 11.40625 C 53.238281 11.410156 53.238281 11.410156 53.265625 11.414062 C 53.351562 11.429688 53.4375 11.445312 53.523438 11.464844 C 53.554688 11.46875 53.585938 11.472656 53.613281 11.480469 C 53.644531 11.484375 53.671875 11.492188 53.703125 11.496094 C 53.730469 11.5 53.753906 11.507812 53.78125 11.511719 C 53.847656 11.523438 53.910156 11.535156 53.976562 11.550781 C 53.976562 11.746094 53.976562 11.945312 53.976562 12.148438 C 52.890625 12.148438 51.804688 12.148438 50.6875 12.148438 C 50.6875 11.953125 50.6875 11.753906 50.6875 11.550781 C 50.964844 11.492188 51.242188 11.4375 51.527344 11.378906 C 51.542969 11.160156 51.554688 10.945312 51.554688 10.722656 C 51.554688 10.691406 51.554688 10.660156 51.554688 10.628906 C 51.554688 10.546875 51.558594 10.464844 51.558594 10.378906 C 51.558594 10.289062 51.558594 10.199219 51.558594 10.109375 C 51.558594 9.953125 51.558594 9.796875 51.558594 9.640625 C 51.558594 9.414062 51.558594 9.1875 51.5625 8.960938 C 51.5625 8.59375 51.5625 8.230469 51.5625 7.863281 C 51.566406 7.507812 51.566406 7.152344 51.566406 6.792969 C 51.566406 6.773438 51.566406 6.75 51.566406 6.726562 C 51.566406 6.617188 51.566406 6.507812 51.566406 6.398438 C 51.570312 5.484375 51.574219 4.570312 51.574219 3.65625 C 51.554688 3.65625 51.535156 3.652344 51.515625 3.652344 C 51.476562 3.648438 51.476562 3.648438 51.4375 3.644531 C 51.414062 3.644531 51.386719 3.640625 51.359375 3.640625 C 51.277344 3.632812 51.195312 3.621094 51.113281 3.609375 C 51.082031 3.605469 51.054688 3.601562 51.023438 3.597656 C 50.996094 3.59375 50.964844 3.589844 50.933594 3.582031 C 50.902344 3.578125 50.871094 3.574219 50.839844 3.570312 C 50.765625 3.558594 50.691406 3.546875 50.617188 3.535156 C 50.617188 3.347656 50.617188 3.15625 50.617188 2.960938 C 50.910156 2.875 51.207031 2.796875 51.5 2.722656 C 51.523438 2.714844 51.542969 2.710938 51.5625 2.707031 C 51.671875 2.679688 51.777344 2.652344 51.886719 2.625 C 51.972656 2.601562 52.0625 2.578125 52.152344 2.554688 C 52.257812 2.527344 52.367188 2.5 52.472656 2.472656 C 52.515625 2.460938 52.554688 2.453125 52.597656 2.441406 C 52.652344 2.425781 52.710938 2.410156 52.765625 2.398438 C 52.78125 2.394531 52.800781 2.386719 52.816406 2.382812 C 52.898438 2.363281 52.960938 2.351562 53.039062 2.382812 Z M 53.039062 2.382812 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 99.691406 6.011719 C 100.109375 6.40625 100.234375 7.003906 100.273438 7.554688 C 100.277344 7.667969 100.277344 7.785156 100.277344 7.898438 C 100.277344 7.933594 100.277344 7.964844 100.277344 8 C 100.277344 8.074219 100.277344 8.144531 100.277344 8.21875 C 100.277344 8.332031 100.277344 8.445312 100.277344 8.558594 C 100.28125 8.886719 100.28125 9.210938 100.28125 9.535156 C 100.28125 9.714844 100.28125 9.894531 100.285156 10.074219 C 100.285156 10.171875 100.285156 10.265625 100.285156 10.359375 C 100.285156 10.449219 100.285156 10.539062 100.285156 10.628906 C 100.285156 10.675781 100.285156 10.726562 100.285156 10.773438 C 100.289062 10.964844 100.292969 11.167969 100.417969 11.320312 C 100.53125 11.378906 100.636719 11.398438 100.757812 11.367188 C 100.898438 11.308594 101.003906 11.21875 101.113281 11.117188 C 101.226562 11.199219 101.339844 11.289062 101.449219 11.378906 C 101.394531 11.527344 101.300781 11.640625 101.207031 11.765625 C 101.179688 11.804688 101.179688 11.804688 101.152344 11.84375 C 100.859375 12.152344 100.476562 12.265625 100.058594 12.277344 C 99.699219 12.269531 99.332031 12.164062 99.066406 11.910156 C 98.933594 11.757812 98.761719 11.519531 98.761719 11.308594 C 98.582031 11.449219 98.582031 11.449219 98.417969 11.605469 C 98.289062 11.738281 98.140625 11.847656 97.992188 11.957031 C 97.96875 11.972656 97.949219 11.992188 97.925781 12.007812 C 97.488281 12.3125 96.855469 12.339844 96.34375 12.25 C 95.917969 12.15625 95.527344 11.929688 95.28125 11.558594 C 95.035156 11.136719 94.964844 10.617188 95.082031 10.140625 C 95.289062 9.527344 95.746094 9.175781 96.300781 8.894531 C 96.941406 8.582031 97.644531 8.375 98.328125 8.179688 C 98.34375 8.175781 98.359375 8.171875 98.375 8.167969 C 98.472656 8.140625 98.566406 8.113281 98.664062 8.085938 C 98.695312 7.195312 98.695312 7.195312 98.328125 6.425781 C 98.121094 6.230469 97.828125 6.203125 97.558594 6.203125 C 97.53125 6.203125 97.53125 6.203125 97.503906 6.203125 C 97.339844 6.207031 97.171875 6.21875 97.007812 6.230469 C 97.003906 6.257812 97.003906 6.289062 97 6.316406 C 96.984375 6.46875 96.957031 6.617188 96.925781 6.765625 C 96.917969 6.816406 96.910156 6.863281 96.902344 6.910156 C 96.832031 7.273438 96.738281 7.585938 96.425781 7.808594 C 96.191406 7.933594 95.945312 7.933594 95.6875 7.867188 C 95.515625 7.808594 95.40625 7.707031 95.320312 7.546875 C 95.234375 7.347656 95.238281 7.183594 95.308594 6.980469 C 95.316406 6.957031 95.316406 6.957031 95.324219 6.929688 C 95.421875 6.644531 95.574219 6.441406 95.785156 6.230469 C 95.800781 6.214844 95.816406 6.195312 95.835938 6.179688 C 96.734375 5.308594 98.742188 5.21875 99.691406 6.011719 Z M 98.394531 8.742188 C 98.292969 8.777344 98.1875 8.8125 98.082031 8.847656 C 97.574219 9.007812 97.011719 9.230469 96.746094 9.722656 C 96.582031 10.042969 96.554688 10.355469 96.648438 10.703125 C 96.71875 10.914062 96.816406 11.042969 97.011719 11.152344 C 97.296875 11.292969 97.609375 11.304688 97.910156 11.199219 C 98.058594 11.132812 98.207031 11.050781 98.34375 10.960938 C 98.398438 10.921875 98.398438 10.921875 98.46875 10.890625 C 98.558594 10.839844 98.644531 10.789062 98.679688 10.683594 C 98.703125 10.542969 98.695312 10.402344 98.691406 10.257812 C 98.6875 10.214844 98.6875 10.167969 98.6875 10.121094 C 98.6875 10 98.683594 9.878906 98.683594 9.757812 C 98.679688 9.636719 98.679688 9.511719 98.675781 9.386719 C 98.675781 9.144531 98.667969 8.902344 98.664062 8.660156 C 98.578125 8.660156 98.476562 8.714844 98.394531 8.742188 Z M 98.394531 8.742188 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 38.035156 6.242188 C 38.207031 6.40625 38.332031 6.578125 38.449219 6.785156 C 38.460938 6.808594 38.460938 6.808594 38.472656 6.832031 C 38.835938 7.472656 38.875 8.257812 38.761719 8.972656 C 38.734375 9 38.734375 9 38.671875 9 C 38.625 9 38.625 9 38.578125 9 C 38.5625 9 38.546875 9 38.53125 9 C 38.472656 9 38.417969 9 38.363281 9 C 38.324219 9 38.285156 9 38.242188 9 C 38.136719 9 38.027344 9 37.917969 9 C 37.804688 9 37.695312 9 37.582031 9 C 37.367188 9 37.152344 9 36.9375 9 C 36.695312 9 36.453125 9 36.207031 9 C 35.707031 9 35.207031 9 34.703125 9 C 34.714844 9.089844 34.726562 9.183594 34.738281 9.273438 C 34.742188 9.300781 34.742188 9.328125 34.746094 9.351562 C 34.8125 9.898438 35.007812 10.441406 35.4375 10.808594 C 35.933594 11.1875 36.476562 11.269531 37.089844 11.203125 C 37.539062 11.128906 37.90625 10.847656 38.222656 10.535156 C 38.347656 10.417969 38.347656 10.417969 38.425781 10.417969 C 38.464844 10.445312 38.464844 10.445312 38.503906 10.488281 C 38.589844 10.585938 38.683594 10.671875 38.785156 10.753906 C 38.679688 11.046875 38.46875 11.28125 38.257812 11.5 C 38.242188 11.519531 38.222656 11.535156 38.207031 11.554688 C 37.792969 12 37.171875 12.246094 36.574219 12.320312 C 36.554688 12.320312 36.535156 12.324219 36.515625 12.328125 C 35.640625 12.425781 34.773438 12.210938 34.074219 11.671875 C 33.421875 11.125 33.078125 10.363281 32.976562 9.527344 C 32.972656 9.496094 32.972656 9.496094 32.96875 9.460938 C 32.871094 8.5 33.074219 7.515625 33.675781 6.746094 C 33.707031 6.710938 33.738281 6.675781 33.769531 6.640625 C 33.78125 6.621094 33.796875 6.605469 33.8125 6.585938 C 34.316406 5.988281 35.136719 5.640625 35.902344 5.566406 C 36.699219 5.511719 37.429688 5.699219 38.035156 6.242188 Z M 35.226562 6.652344 C 34.949219 7.007812 34.820312 7.386719 34.746094 7.824219 C 34.742188 7.851562 34.738281 7.875 34.734375 7.898438 C 34.730469 7.921875 34.726562 7.949219 34.722656 7.972656 C 34.71875 7.992188 34.714844 8.015625 34.710938 8.035156 C 34.703125 8.097656 34.703125 8.15625 34.703125 8.222656 C 34.703125 8.242188 34.703125 8.261719 34.703125 8.28125 C 34.703125 8.292969 34.703125 8.308594 34.703125 8.324219 C 34.972656 8.328125 35.242188 8.328125 35.507812 8.328125 C 35.632812 8.328125 35.757812 8.328125 35.882812 8.332031 C 36.003906 8.332031 36.125 8.332031 36.246094 8.332031 C 36.289062 8.332031 36.335938 8.332031 36.382812 8.332031 C 36.445312 8.332031 36.511719 8.332031 36.574219 8.332031 C 36.59375 8.332031 36.613281 8.332031 36.632812 8.332031 C 36.800781 8.332031 36.964844 8.304688 37.085938 8.183594 C 37.273438 7.9375 37.277344 7.609375 37.246094 7.3125 C 37.195312 6.96875 37.015625 6.636719 36.730469 6.425781 C 36.226562 6.113281 35.617188 6.195312 35.226562 6.652344 Z M 35.226562 6.652344 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 112.726562 6.085938 C 112.90625 6.242188 113.058594 6.414062 113.183594 6.617188 C 113.199219 6.636719 113.210938 6.65625 113.226562 6.679688 C 113.628906 7.320312 113.699219 8.167969 113.566406 8.902344 C 113.523438 8.945312 113.449219 8.929688 113.386719 8.929688 C 113.371094 8.929688 113.355469 8.929688 113.339844 8.929688 C 113.28125 8.929688 113.226562 8.929688 113.171875 8.929688 C 113.132812 8.929688 113.089844 8.933594 113.050781 8.933594 C 112.945312 8.933594 112.835938 8.933594 112.726562 8.933594 C 112.613281 8.933594 112.5 8.933594 112.386719 8.933594 C 112.175781 8.9375 111.960938 8.9375 111.746094 8.9375 C 111.503906 8.941406 111.257812 8.941406 111.015625 8.941406 C 110.515625 8.945312 110.011719 8.949219 109.511719 8.949219 C 109.519531 9.023438 109.527344 9.097656 109.535156 9.171875 C 109.535156 9.191406 109.539062 9.210938 109.539062 9.230469 C 109.554688 9.378906 109.578125 9.523438 109.613281 9.667969 C 109.621094 9.6875 109.625 9.710938 109.628906 9.730469 C 109.703125 10.011719 109.808594 10.261719 109.992188 10.488281 C 110.003906 10.507812 110.019531 10.527344 110.035156 10.542969 C 110.320312 10.898438 110.765625 11.117188 111.214844 11.164062 C 111.839844 11.203125 112.339844 11.078125 112.820312 10.671875 C 112.9375 10.570312 113.050781 10.457031 113.160156 10.347656 C 113.230469 10.378906 113.28125 10.414062 113.339844 10.46875 C 113.355469 10.480469 113.367188 10.496094 113.382812 10.507812 C 113.398438 10.523438 113.414062 10.539062 113.429688 10.554688 C 113.445312 10.566406 113.460938 10.582031 113.476562 10.597656 C 113.515625 10.632812 113.554688 10.671875 113.59375 10.707031 C 113.324219 11.316406 112.769531 11.816406 112.15625 12.066406 C 112.054688 12.105469 111.953125 12.136719 111.847656 12.171875 C 111.832031 12.175781 111.816406 12.179688 111.800781 12.183594 C 111.507812 12.265625 111.214844 12.28125 110.914062 12.28125 C 110.898438 12.28125 110.878906 12.28125 110.859375 12.28125 C 110.554688 12.277344 110.261719 12.257812 109.96875 12.175781 C 109.941406 12.167969 109.941406 12.167969 109.914062 12.160156 C 109.203125 11.953125 108.628906 11.503906 108.238281 10.875 C 108.230469 10.859375 108.222656 10.847656 108.210938 10.832031 C 107.699219 9.980469 107.648438 8.855469 107.878906 7.90625 C 108.074219 7.136719 108.570312 6.417969 109.253906 6 C 110.304688 5.378906 111.75 5.261719 112.726562 6.085938 Z M 110.105469 6.496094 C 109.710938 6.9375 109.507812 7.546875 109.511719 8.136719 C 109.511719 8.160156 109.511719 8.179688 109.511719 8.203125 C 109.511719 8.21875 109.511719 8.234375 109.511719 8.253906 C 109.78125 8.253906 110.050781 8.253906 110.316406 8.257812 C 110.441406 8.257812 110.566406 8.257812 110.691406 8.257812 C 110.8125 8.257812 110.933594 8.257812 111.054688 8.257812 C 111.097656 8.257812 111.144531 8.261719 111.191406 8.261719 C 111.253906 8.261719 111.320312 8.261719 111.382812 8.261719 C 111.402344 8.261719 111.421875 8.261719 111.441406 8.261719 C 111.59375 8.261719 111.746094 8.234375 111.871094 8.140625 C 112.082031 7.886719 112.078125 7.605469 112.054688 7.289062 C 112.011719 6.949219 111.867188 6.6875 111.625 6.449219 C 111.609375 6.433594 111.59375 6.417969 111.582031 6.40625 C 111.164062 6.015625 110.496094 6.121094 110.105469 6.496094 Z M 110.105469 6.496094 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 119.207031 6.039062 C 119.210938 6.308594 119.203125 6.578125 119.1875 6.847656 C 119.183594 6.910156 119.183594 6.972656 119.179688 7.035156 C 119.175781 7.078125 119.175781 7.117188 119.171875 7.160156 C 119.171875 7.175781 119.171875 7.195312 119.171875 7.214844 C 119.164062 7.308594 119.152344 7.390625 119.136719 7.484375 C 118.835938 7.484375 118.535156 7.484375 118.222656 7.484375 C 118.207031 7.40625 118.191406 7.328125 118.171875 7.246094 C 118.15625 7.171875 118.140625 7.097656 118.121094 7.023438 C 118.109375 6.96875 118.101562 6.917969 118.089844 6.867188 C 118.070312 6.792969 118.054688 6.714844 118.039062 6.640625 C 118.035156 6.617188 118.027344 6.59375 118.023438 6.570312 C 118.019531 6.550781 118.015625 6.527344 118.007812 6.503906 C 118.003906 6.484375 118 6.464844 117.996094 6.445312 C 117.984375 6.398438 117.984375 6.398438 117.960938 6.351562 C 117.902344 6.332031 117.847656 6.316406 117.789062 6.300781 C 117.765625 6.296875 117.765625 6.296875 117.738281 6.289062 C 117.339844 6.1875 116.835938 6.167969 116.464844 6.375 C 116.296875 6.480469 116.203125 6.609375 116.128906 6.789062 C 116.082031 7.042969 116.105469 7.261719 116.234375 7.484375 C 116.496094 7.828125 117.082031 7.953125 117.46875 8.070312 C 118.183594 8.289062 118.960938 8.597656 119.359375 9.277344 C 119.578125 9.714844 119.621094 10.257812 119.496094 10.734375 C 119.316406 11.277344 118.957031 11.703125 118.449219 11.964844 C 117.460938 12.445312 116.246094 12.394531 115.222656 12.054688 C 115.007812 11.972656 114.804688 11.867188 114.601562 11.765625 C 114.570312 11.234375 114.574219 10.707031 114.574219 10.175781 C 114.886719 10.175781 115.195312 10.175781 115.511719 10.175781 C 115.539062 10.304688 115.539062 10.304688 115.5625 10.433594 C 115.582031 10.515625 115.597656 10.597656 115.613281 10.679688 C 115.625 10.734375 115.636719 10.792969 115.648438 10.847656 C 115.664062 10.929688 115.679688 11.011719 115.695312 11.09375 C 115.703125 11.121094 115.707031 11.144531 115.710938 11.171875 C 115.71875 11.195312 115.722656 11.21875 115.726562 11.242188 C 115.730469 11.261719 115.734375 11.285156 115.738281 11.304688 C 115.75 11.355469 115.75 11.355469 115.777344 11.40625 C 116.324219 11.617188 117.03125 11.667969 117.578125 11.4375 C 117.800781 11.332031 117.949219 11.207031 118.039062 10.972656 C 118.089844 10.761719 118.082031 10.527344 117.992188 10.328125 C 117.910156 10.191406 117.820312 10.105469 117.6875 10.023438 C 117.664062 10.003906 117.636719 9.988281 117.609375 9.972656 C 117.265625 9.769531 116.875 9.65625 116.496094 9.527344 C 116.066406 9.386719 115.683594 9.222656 115.320312 8.949219 C 115.296875 8.933594 115.273438 8.917969 115.25 8.898438 C 115.226562 8.875 115.226562 8.875 115.199219 8.855469 C 115.199219 8.839844 115.199219 8.824219 115.199219 8.804688 C 115.1875 8.800781 115.171875 8.796875 115.160156 8.789062 C 114.933594 8.65625 114.792969 8.285156 114.726562 8.046875 C 114.605469 7.507812 114.6875 6.964844 114.984375 6.496094 C 115.347656 5.957031 115.902344 5.671875 116.523438 5.542969 C 117.460938 5.367188 118.386719 5.574219 119.207031 6.039062 Z M 119.207031 6.039062 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 67.945312 6.109375 C 67.96875 6.136719 67.96875 6.136719 67.96875 6.1875 C 67.96875 6.210938 67.96875 6.234375 67.964844 6.257812 C 67.964844 6.285156 67.964844 6.3125 67.964844 6.339844 C 67.960938 6.367188 67.960938 6.398438 67.960938 6.425781 C 67.960938 6.457031 67.957031 6.484375 67.957031 6.515625 C 67.941406 6.863281 67.917969 7.207031 67.894531 7.554688 C 67.59375 7.554688 67.292969 7.554688 66.984375 7.554688 C 66.921875 7.3125 66.863281 7.070312 66.808594 6.828125 C 66.804688 6.796875 66.796875 6.769531 66.789062 6.742188 C 66.785156 6.714844 66.777344 6.6875 66.773438 6.660156 C 66.765625 6.632812 66.761719 6.609375 66.753906 6.585938 C 66.742188 6.519531 66.742188 6.519531 66.742188 6.425781 C 66.707031 6.414062 66.667969 6.402344 66.628906 6.390625 C 66.605469 6.386719 66.585938 6.378906 66.5625 6.371094 C 66.355469 6.320312 66.15625 6.296875 65.941406 6.296875 C 65.917969 6.296875 65.894531 6.296875 65.871094 6.296875 C 65.5625 6.300781 65.296875 6.351562 65.0625 6.566406 C 64.894531 6.742188 64.859375 6.90625 64.863281 7.148438 C 64.867188 7.285156 64.890625 7.390625 64.96875 7.507812 C 64.976562 7.519531 64.984375 7.535156 64.996094 7.550781 C 65.261719 7.921875 65.914062 8.0625 66.328125 8.179688 C 67.054688 8.390625 67.703125 8.726562 68.089844 9.40625 C 68.214844 9.648438 68.289062 9.90625 68.304688 10.175781 C 68.304688 10.199219 68.304688 10.21875 68.308594 10.242188 C 68.324219 10.753906 68.15625 11.1875 67.824219 11.574219 C 67.808594 11.589844 67.796875 11.605469 67.78125 11.621094 C 67.28125 12.164062 66.515625 12.347656 65.808594 12.390625 C 65.144531 12.414062 64.535156 12.34375 63.910156 12.117188 C 63.886719 12.109375 63.886719 12.109375 63.859375 12.097656 C 63.675781 12.03125 63.507812 11.929688 63.335938 11.835938 C 63.335938 11.632812 63.335938 11.429688 63.335938 11.226562 C 63.335938 11.132812 63.335938 11.039062 63.335938 10.945312 C 63.332031 10.851562 63.332031 10.761719 63.332031 10.671875 C 63.332031 10.636719 63.332031 10.601562 63.332031 10.566406 C 63.332031 10.515625 63.332031 10.46875 63.332031 10.421875 C 63.332031 10.390625 63.332031 10.363281 63.332031 10.335938 C 63.335938 10.273438 63.335938 10.273438 63.359375 10.25 C 63.421875 10.246094 63.484375 10.246094 63.550781 10.246094 C 63.570312 10.246094 63.585938 10.246094 63.605469 10.246094 C 63.648438 10.246094 63.6875 10.246094 63.726562 10.246094 C 63.789062 10.246094 63.851562 10.246094 63.914062 10.246094 C 63.953125 10.246094 63.992188 10.246094 64.03125 10.246094 C 64.050781 10.246094 64.066406 10.246094 64.085938 10.246094 C 64.21875 10.246094 64.21875 10.246094 64.273438 10.273438 C 64.285156 10.316406 64.285156 10.316406 64.296875 10.375 C 64.300781 10.394531 64.304688 10.414062 64.308594 10.4375 C 64.316406 10.460938 64.320312 10.484375 64.324219 10.507812 C 64.328125 10.53125 64.332031 10.554688 64.339844 10.578125 C 64.347656 10.628906 64.359375 10.679688 64.367188 10.730469 C 64.382812 10.808594 64.398438 10.882812 64.414062 10.960938 C 64.421875 11.007812 64.433594 11.058594 64.441406 11.105469 C 64.445312 11.128906 64.453125 11.152344 64.457031 11.175781 C 64.476562 11.285156 64.492188 11.386719 64.488281 11.5 C 64.53125 11.511719 64.53125 11.511719 64.578125 11.519531 C 64.691406 11.546875 64.804688 11.574219 64.921875 11.605469 C 65.117188 11.648438 65.308594 11.648438 65.507812 11.652344 C 65.539062 11.652344 65.570312 11.652344 65.601562 11.652344 C 65.964844 11.652344 66.320312 11.59375 66.605469 11.359375 C 66.761719 11.199219 66.820312 11.003906 66.828125 10.789062 C 66.820312 10.566406 66.761719 10.382812 66.601562 10.226562 C 66.214844 9.933594 65.765625 9.789062 65.3125 9.640625 C 64.621094 9.414062 63.949219 9.125 63.59375 8.445312 C 63.378906 8 63.375 7.464844 63.53125 6.996094 C 63.761719 6.410156 64.183594 6.027344 64.753906 5.773438 C 65.792969 5.351562 66.988281 5.59375 67.945312 6.109375 Z M 67.945312 6.109375 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 105.941406 5.769531 C 105.960938 5.777344 105.976562 5.785156 105.996094 5.792969 C 106.1875 5.867188 106.351562 5.964844 106.535156 6.0625 C 106.511719 6.539062 106.488281 7.015625 106.464844 7.507812 C 106.164062 7.507812 105.863281 7.507812 105.550781 7.507812 C 105.445312 7.101562 105.445312 7.101562 105.410156 6.941406 C 105.40625 6.925781 105.402344 6.910156 105.398438 6.890625 C 105.386719 6.839844 105.375 6.789062 105.367188 6.738281 C 105.359375 6.703125 105.351562 6.667969 105.34375 6.632812 C 105.324219 6.546875 105.304688 6.460938 105.289062 6.375 C 105.234375 6.359375 105.183594 6.34375 105.128906 6.328125 C 105.097656 6.320312 105.070312 6.3125 105.039062 6.304688 C 104.859375 6.253906 104.6875 6.25 104.503906 6.25 C 104.464844 6.25 104.464844 6.25 104.421875 6.25 C 104.136719 6.246094 103.90625 6.3125 103.664062 6.464844 C 103.507812 6.621094 103.417969 6.816406 103.414062 7.042969 C 103.425781 7.25 103.492188 7.433594 103.632812 7.585938 C 103.976562 7.886719 104.484375 8.003906 104.910156 8.132812 C 105.628906 8.351562 106.285156 8.667969 106.667969 9.355469 C 106.878906 9.800781 106.9375 10.371094 106.785156 10.84375 C 106.554688 11.417969 106.144531 11.8125 105.585938 12.070312 C 104.601562 12.488281 103.335938 12.402344 102.359375 12.007812 C 102.203125 11.9375 102.046875 11.859375 101.902344 11.765625 C 101.894531 11.699219 101.894531 11.699219 101.894531 11.617188 C 101.894531 11.585938 101.894531 11.554688 101.890625 11.523438 C 101.890625 11.488281 101.890625 11.453125 101.890625 11.417969 C 101.890625 11.382812 101.890625 11.347656 101.890625 11.3125 C 101.890625 11.222656 101.886719 11.128906 101.886719 11.039062 C 101.886719 10.925781 101.886719 10.816406 101.882812 10.707031 C 101.882812 10.539062 101.882812 10.371094 101.878906 10.203125 C 102.1875 10.203125 102.496094 10.203125 102.816406 10.203125 C 102.871094 10.363281 102.871094 10.363281 102.886719 10.449219 C 102.890625 10.46875 102.894531 10.488281 102.898438 10.507812 C 102.902344 10.527344 102.90625 10.546875 102.910156 10.566406 C 102.914062 10.585938 102.917969 10.609375 102.921875 10.628906 C 102.933594 10.671875 102.941406 10.71875 102.949219 10.761719 C 102.964844 10.828125 102.976562 10.894531 102.988281 10.960938 C 103 11.003906 103.007812 11.046875 103.015625 11.089844 C 103.019531 11.109375 103.023438 11.132812 103.027344 11.152344 C 103.046875 11.246094 103.0625 11.332031 103.054688 11.429688 C 103.699219 11.59375 104.421875 11.726562 105.03125 11.386719 C 105.21875 11.265625 105.316406 11.125 105.375 10.914062 C 105.402344 10.691406 105.378906 10.496094 105.273438 10.292969 C 104.921875 9.867188 104.363281 9.730469 103.859375 9.5625 C 103.1875 9.339844 102.511719 9.058594 102.167969 8.398438 C 101.949219 7.929688 101.9375 7.414062 102.097656 6.929688 C 102.101562 6.90625 102.109375 6.886719 102.117188 6.863281 C 102.269531 6.417969 102.628906 6.066406 103.03125 5.847656 C 103.054688 5.832031 103.078125 5.820312 103.101562 5.808594 C 103.382812 5.65625 103.699219 5.574219 104.015625 5.535156 C 104.035156 5.53125 104.054688 5.527344 104.074219 5.527344 C 104.714844 5.449219 105.34375 5.535156 105.941406 5.769531 Z M 105.941406 5.769531 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 59.953125 3.921875 C 60.316406 3.921875 60.679688 3.921875 61.054688 3.921875 C 61.058594 4.292969 61.054688 4.667969 61.046875 5.039062 C 61.042969 5.066406 61.042969 5.066406 61.042969 5.09375 C 61.042969 5.144531 61.042969 5.195312 61.039062 5.246094 C 61.039062 5.277344 61.039062 5.304688 61.035156 5.335938 C 61.03125 5.472656 61.019531 5.613281 61.007812 5.75 C 61.53125 5.75 62.054688 5.75 62.59375 5.75 C 62.59375 6.035156 62.59375 6.320312 62.59375 6.617188 C 62.0625 6.617188 61.53125 6.617188 60.984375 6.617188 C 60.984375 7.128906 60.988281 7.644531 60.988281 8.160156 C 60.992188 8.398438 60.992188 8.636719 60.992188 8.875 C 60.992188 9.082031 60.992188 9.292969 60.996094 9.5 C 60.996094 9.609375 60.996094 9.71875 60.996094 9.832031 C 60.996094 9.933594 60.996094 10.039062 60.996094 10.140625 C 60.996094 10.179688 60.996094 10.21875 60.996094 10.253906 C 60.992188 10.765625 60.992188 10.765625 61.199219 11.210938 C 61.34375 11.347656 61.507812 11.40625 61.703125 11.40625 C 61.941406 11.371094 62.144531 11.289062 62.355469 11.175781 C 62.457031 11.125 62.457031 11.125 62.519531 11.117188 C 62.558594 11.140625 62.558594 11.140625 62.597656 11.183594 C 62.613281 11.195312 62.625 11.210938 62.640625 11.226562 C 62.652344 11.238281 62.667969 11.253906 62.683594 11.269531 C 62.695312 11.285156 62.710938 11.300781 62.726562 11.316406 C 62.761719 11.351562 62.796875 11.390625 62.832031 11.429688 C 62.785156 11.5625 62.707031 11.65625 62.617188 11.765625 C 62.605469 11.78125 62.59375 11.792969 62.578125 11.808594 C 62.375 12.03125 62.085938 12.183594 61.800781 12.269531 C 61.777344 12.277344 61.75 12.285156 61.726562 12.292969 C 61.511719 12.347656 61.296875 12.351562 61.078125 12.351562 C 61.046875 12.351562 61.019531 12.351562 60.988281 12.351562 C 60.523438 12.351562 60.085938 12.210938 59.730469 11.898438 C 59.542969 11.699219 59.425781 11.40625 59.375 11.140625 C 59.371094 11.117188 59.367188 11.097656 59.363281 11.074219 C 59.351562 10.988281 59.347656 10.902344 59.347656 10.8125 C 59.347656 10.792969 59.347656 10.777344 59.347656 10.757812 C 59.347656 10.695312 59.347656 10.636719 59.347656 10.578125 C 59.347656 10.535156 59.347656 10.492188 59.347656 10.449219 C 59.347656 10.332031 59.347656 10.214844 59.347656 10.097656 C 59.351562 9.972656 59.351562 9.851562 59.351562 9.730469 C 59.351562 9.496094 59.351562 9.265625 59.351562 9.035156 C 59.351562 8.769531 59.351562 8.507812 59.351562 8.242188 C 59.351562 7.703125 59.351562 7.160156 59.351562 6.617188 C 59.035156 6.617188 58.71875 6.617188 58.390625 6.617188 C 58.390625 6.371094 58.390625 6.125 58.390625 5.871094 C 58.914062 5.800781 58.914062 5.800781 59.449219 5.726562 C 59.480469 5.601562 59.515625 5.476562 59.550781 5.351562 C 59.574219 5.269531 59.59375 5.191406 59.617188 5.113281 C 59.652344 4.988281 59.6875 4.863281 59.722656 4.738281 C 59.75 4.640625 59.777344 4.539062 59.804688 4.4375 C 59.816406 4.398438 59.824219 4.359375 59.835938 4.324219 C 59.851562 4.269531 59.867188 4.214844 59.882812 4.160156 C 59.886719 4.144531 59.890625 4.128906 59.894531 4.113281 C 59.914062 4.046875 59.929688 3.984375 59.953125 3.921875 Z M 59.953125 3.921875 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 93.351562 5.554688 C 93.40625 5.59375 93.429688 5.617188 93.445312 5.679688 C 93.449219 5.75 93.445312 5.8125 93.441406 5.878906 C 93.441406 5.90625 93.441406 5.929688 93.441406 5.957031 C 93.4375 6.015625 93.4375 6.070312 93.433594 6.128906 C 93.429688 6.273438 93.425781 6.417969 93.421875 6.5625 C 93.417969 6.617188 93.417969 6.671875 93.417969 6.726562 C 93.402344 7.175781 93.40625 7.625 93.40625 8.074219 C 93.40625 8.195312 93.40625 8.3125 93.40625 8.429688 C 93.40625 8.644531 93.40625 8.859375 93.40625 9.074219 C 93.40625 9.320312 93.40625 9.570312 93.40625 9.816406 C 93.40625 10.320312 93.40625 10.828125 93.40625 11.332031 C 93.425781 11.335938 93.449219 11.339844 93.46875 11.34375 C 93.542969 11.355469 93.613281 11.371094 93.6875 11.382812 C 93.734375 11.390625 93.785156 11.398438 93.832031 11.40625 C 93.859375 11.414062 93.890625 11.417969 93.921875 11.425781 C 93.949219 11.429688 93.976562 11.433594 94.003906 11.4375 C 94.070312 11.449219 94.136719 11.464844 94.199219 11.476562 C 94.199219 11.675781 94.199219 11.875 94.199219 12.078125 C 93.105469 12.078125 92.015625 12.078125 90.886719 12.078125 C 90.886719 11.878906 90.886719 11.679688 90.886719 11.476562 C 90.988281 11.457031 91.085938 11.433594 91.1875 11.414062 C 91.222656 11.40625 91.253906 11.402344 91.289062 11.394531 C 91.339844 11.382812 91.386719 11.375 91.4375 11.363281 C 91.480469 11.355469 91.480469 11.355469 91.527344 11.34375 C 91.601562 11.332031 91.675781 11.332031 91.753906 11.332031 C 91.753906 10.894531 91.753906 10.457031 91.753906 10.023438 C 91.753906 9.820312 91.753906 9.617188 91.753906 9.414062 C 91.753906 9.234375 91.753906 9.058594 91.753906 8.882812 C 91.753906 8.789062 91.753906 8.695312 91.753906 8.601562 C 91.753906 8.066406 91.746094 7.535156 91.726562 7 C 91.683594 6.996094 91.683594 6.996094 91.636719 6.988281 C 91.539062 6.976562 91.4375 6.964844 91.339844 6.953125 C 91.296875 6.945312 91.25 6.941406 91.207031 6.933594 C 91.144531 6.925781 91.082031 6.917969 91.019531 6.910156 C 90.988281 6.90625 90.988281 6.90625 90.957031 6.902344 C 90.820312 6.882812 90.820312 6.882812 90.792969 6.855469 C 90.789062 6.816406 90.789062 6.777344 90.789062 6.738281 C 90.789062 6.714844 90.789062 6.691406 90.789062 6.667969 C 90.789062 6.640625 90.789062 6.617188 90.789062 6.589844 C 90.789062 6.566406 90.789062 6.539062 90.789062 6.515625 C 90.792969 6.453125 90.792969 6.390625 90.792969 6.328125 C 90.96875 6.253906 91.148438 6.1875 91.328125 6.125 C 91.355469 6.117188 91.382812 6.105469 91.414062 6.097656 C 91.503906 6.066406 91.59375 6.03125 91.683594 6 C 91.808594 5.957031 91.929688 5.914062 92.054688 5.871094 C 92.070312 5.867188 92.085938 5.859375 92.101562 5.855469 C 92.285156 5.792969 92.46875 5.726562 92.652344 5.660156 C 92.667969 5.652344 92.6875 5.644531 92.703125 5.640625 C 92.78125 5.609375 92.859375 5.582031 92.9375 5.554688 C 92.976562 5.539062 92.976562 5.539062 93.019531 5.523438 C 93.050781 5.511719 93.050781 5.511719 93.082031 5.5 C 93.1875 5.476562 93.261719 5.503906 93.351562 5.554688 Z M 93.351562 5.554688 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 42.214844 5.652344 C 42.214844 7.542969 42.214844 9.433594 42.214844 11.378906 C 42.535156 11.441406 42.535156 11.441406 42.863281 11.5 C 42.917969 11.515625 42.976562 11.53125 43.03125 11.550781 C 43.03125 11.738281 43.03125 11.929688 43.03125 12.125 C 41.929688 12.125 40.832031 12.125 39.695312 12.125 C 39.695312 11.9375 39.695312 11.746094 39.695312 11.550781 C 39.875 11.5 40.054688 11.460938 40.234375 11.425781 C 40.265625 11.417969 40.265625 11.417969 40.296875 11.410156 C 40.316406 11.40625 40.335938 11.402344 40.355469 11.398438 C 40.375 11.394531 40.394531 11.390625 40.410156 11.386719 C 40.46875 11.378906 40.523438 11.378906 40.585938 11.378906 C 40.582031 10.886719 40.578125 10.390625 40.574219 9.898438 C 40.574219 9.667969 40.574219 9.4375 40.570312 9.207031 C 40.570312 9.007812 40.570312 8.808594 40.570312 8.605469 C 40.566406 8.5 40.566406 8.394531 40.566406 8.289062 C 40.566406 8.191406 40.566406 8.089844 40.566406 7.988281 C 40.566406 7.953125 40.566406 7.917969 40.566406 7.878906 C 40.5625 7.683594 40.558594 7.488281 40.550781 7.292969 C 40.546875 7.273438 40.546875 7.253906 40.546875 7.234375 C 40.542969 7.140625 40.542969 7.140625 40.511719 7.050781 C 40.445312 7.035156 40.378906 7.027344 40.308594 7.019531 C 40.289062 7.015625 40.269531 7.011719 40.25 7.011719 C 40.183594 7.003906 40.121094 6.996094 40.054688 6.988281 C 40.011719 6.980469 39.96875 6.976562 39.921875 6.96875 C 39.816406 6.957031 39.707031 6.941406 39.601562 6.929688 C 39.601562 6.746094 39.601562 6.5625 39.601562 6.375 C 39.964844 6.242188 40.328125 6.109375 40.695312 5.980469 C 40.777344 5.953125 40.859375 5.921875 40.945312 5.894531 C 41 5.875 41.054688 5.855469 41.109375 5.835938 C 41.246094 5.789062 41.386719 5.738281 41.523438 5.6875 C 41.550781 5.675781 41.578125 5.667969 41.605469 5.65625 C 41.660156 5.636719 41.710938 5.617188 41.761719 5.597656 C 41.785156 5.589844 41.808594 5.578125 41.835938 5.570312 C 41.863281 5.558594 41.863281 5.558594 41.894531 5.546875 C 42.027344 5.515625 42.09375 5.585938 42.214844 5.652344 Z M 42.214844 5.652344 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 8.640625 9.261719 C 8.972656 9.519531 9.191406 9.859375 9.277344 10.273438 C 9.328125 10.675781 9.265625 11.089844 9.019531 11.421875 C 8.734375 11.769531 8.371094 12.007812 7.917969 12.058594 C 7.476562 12.09375 7.078125 11.957031 6.742188 11.667969 C 6.71875 11.648438 6.71875 11.648438 6.695312 11.628906 C 6.421875 11.378906 6.261719 10.992188 6.234375 10.628906 C 6.226562 10.179688 6.355469 9.789062 6.664062 9.457031 C 7.191406 8.921875 8.019531 8.84375 8.640625 9.261719 Z M 8.640625 9.261719 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 2.855469 4.089844 C 2.941406 4.15625 3.019531 4.230469 3.097656 4.308594 C 3.113281 4.324219 3.128906 4.339844 3.148438 4.359375 C 3.414062 4.640625 3.542969 5.027344 3.539062 5.410156 C 3.519531 5.851562 3.332031 6.21875 3.015625 6.527344 C 2.707031 6.792969 2.304688 6.921875 1.898438 6.898438 C 1.578125 6.871094 1.308594 6.769531 1.054688 6.570312 C 1.03125 6.546875 1.03125 6.546875 1.003906 6.527344 C 0.699219 6.277344 0.527344 5.898438 0.484375 5.511719 C 0.453125 5.121094 0.558594 4.730469 0.804688 4.425781 C 1.003906 4.191406 1.226562 4.03125 1.511719 3.921875 C 1.53125 3.914062 1.550781 3.90625 1.570312 3.898438 C 1.988281 3.757812 2.496094 3.84375 2.855469 4.089844 Z M 2.855469 4.089844 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 2.960938 11.683594 C 3.269531 11.949219 3.492188 12.316406 3.53125 12.726562 C 3.558594 13.152344 3.449219 13.550781 3.171875 13.878906 C 2.875 14.203125 2.519531 14.375 2.082031 14.417969 C 1.671875 14.433594 1.28125 14.28125 0.972656 14.011719 C 0.660156 13.714844 0.488281 13.324219 0.476562 12.890625 C 0.480469 12.53125 0.59375 12.214844 0.816406 11.933594 C 0.828125 11.917969 0.839844 11.902344 0.851562 11.882812 C 1.078125 11.597656 1.433594 11.421875 1.785156 11.363281 C 2.207031 11.316406 2.628906 11.417969 2.960938 11.683594 Z M 2.960938 11.683594 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 14.449219 4.167969 C 14.507812 4.222656 14.5625 4.273438 14.617188 4.332031 C 14.628906 4.34375 14.640625 4.355469 14.65625 4.367188 C 14.914062 4.632812 15.015625 5.023438 15.03125 5.378906 C 15.019531 5.734375 14.902344 6.046875 14.6875 6.328125 C 14.675781 6.34375 14.664062 6.359375 14.652344 6.378906 C 14.410156 6.679688 14.042969 6.851562 13.664062 6.898438 C 13.242188 6.925781 12.84375 6.816406 12.523438 6.535156 C 12.484375 6.5 12.445312 6.460938 12.40625 6.425781 C 12.394531 6.410156 12.378906 6.394531 12.363281 6.378906 C 12.085938 6.089844 11.988281 5.707031 11.992188 5.316406 C 12.003906 4.914062 12.167969 4.53125 12.457031 4.25 C 13.023438 3.75 13.847656 3.714844 14.449219 4.167969 Z M 14.449219 4.167969 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 42.046875 2.648438 C 42.253906 2.816406 42.375 3.03125 42.40625 3.296875 C 42.433594 3.558594 42.351562 3.808594 42.191406 4.019531 C 42.007812 4.214844 41.785156 4.351562 41.507812 4.363281 C 41.46875 4.363281 41.429688 4.363281 41.390625 4.363281 C 41.371094 4.363281 41.351562 4.363281 41.332031 4.363281 C 41.058594 4.355469 40.832031 4.273438 40.625 4.089844 C 40.476562 3.933594 40.359375 3.734375 40.34375 3.511719 C 40.34375 3.496094 40.339844 3.480469 40.339844 3.460938 C 40.328125 3.230469 40.390625 2.992188 40.542969 2.8125 C 40.554688 2.796875 40.570312 2.78125 40.585938 2.765625 C 40.597656 2.75 40.613281 2.734375 40.632812 2.714844 C 41.019531 2.339844 41.621094 2.332031 42.046875 2.648438 Z M 42.046875 2.648438 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 93.210938 2.566406 C 93.453125 2.757812 93.570312 2.96875 93.609375 3.273438 C 93.621094 3.53125 93.550781 3.773438 93.378906 3.972656 C 93.367188 3.988281 93.351562 4.003906 93.335938 4.019531 C 93.316406 4.039062 93.316406 4.039062 93.296875 4.058594 C 93.066406 4.28125 92.78125 4.316406 92.476562 4.3125 C 92.355469 4.308594 92.25 4.285156 92.136719 4.234375 C 92.117188 4.226562 92.101562 4.21875 92.082031 4.210938 C 91.871094 4.105469 91.703125 3.9375 91.605469 3.722656 C 91.515625 3.449219 91.515625 3.171875 91.632812 2.90625 C 91.773438 2.652344 92 2.484375 92.277344 2.402344 C 92.605469 2.324219 92.933594 2.375 93.210938 2.566406 Z M 93.210938 2.566406 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 8.320312 5.960938 C 8.539062 6.117188 8.664062 6.320312 8.726562 6.582031 C 8.769531 6.839844 8.710938 7.089844 8.574219 7.3125 C 8.410156 7.535156 8.207031 7.65625 7.945312 7.722656 C 7.621094 7.753906 7.355469 7.6875 7.105469 7.484375 C 6.921875 7.3125 6.8125 7.078125 6.792969 6.832031 C 6.789062 6.535156 6.871094 6.28125 7.078125 6.0625 C 7.4375 5.738281 7.914062 5.710938 8.320312 5.960938 Z M 8.320312 5.960938 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.431373%,73.725492%,19.607843%);fill-opacity:1;" d="M 14.09375 0.820312 C 14.289062 0.96875 14.421875 1.179688 14.472656 1.417969 C 14.5 1.714844 14.464844 1.980469 14.273438 2.214844 C 14.082031 2.421875 13.890625 2.558594 13.605469 2.582031 C 13.320312 2.585938 13.078125 2.535156 12.863281 2.332031 C 12.660156 2.128906 12.550781 1.910156 12.542969 1.621094 C 12.546875 1.332031 12.644531 1.117188 12.839844 0.910156 C 13.199219 0.574219 13.6875 0.5625 14.09375 0.820312 Z M 14.09375 0.820312 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 2.574219 0.808594 C 2.769531 0.972656 2.925781 1.164062 2.976562 1.417969 C 2.996094 1.71875 2.972656 1.976562 2.777344 2.214844 C 2.585938 2.421875 2.394531 2.558594 2.109375 2.582031 C 1.824219 2.585938 1.582031 2.53125 1.367188 2.332031 C 1.226562 2.195312 1.136719 2.066406 1.078125 1.875 C 1.074219 1.863281 1.070312 1.847656 1.066406 1.832031 C 1.015625 1.570312 1.054688 1.3125 1.195312 1.089844 C 1.515625 0.644531 2.101562 0.484375 2.574219 0.808594 Z M 2.574219 0.808594 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 2.550781 8.316406 C 2.582031 8.34375 2.609375 8.371094 2.640625 8.398438 C 2.65625 8.414062 2.671875 8.429688 2.691406 8.445312 C 2.878906 8.640625 2.960938 8.847656 2.964844 9.121094 C 2.960938 9.398438 2.882812 9.613281 2.6875 9.816406 C 2.5 9.996094 2.257812 10.109375 1.992188 10.105469 C 1.695312 10.085938 1.449219 9.972656 1.246094 9.753906 C 1.074219 9.535156 1.003906 9.277344 1.03125 9 C 1.089844 8.710938 1.214844 8.484375 1.453125 8.3125 C 1.789062 8.105469 2.222656 8.085938 2.550781 8.316406 Z M 2.550781 8.316406 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 14.058594 8.34375 C 14.269531 8.496094 14.425781 8.714844 14.472656 8.972656 C 14.496094 9.300781 14.441406 9.542969 14.238281 9.804688 C 14.148438 9.90625 14.042969 9.972656 13.921875 10.03125 C 13.894531 10.046875 13.894531 10.046875 13.867188 10.058594 C 13.660156 10.144531 13.386719 10.136719 13.175781 10.066406 C 12.929688 9.960938 12.714844 9.769531 12.613281 9.519531 C 12.601562 9.484375 12.585938 9.445312 12.574219 9.40625 C 12.570312 9.390625 12.566406 9.378906 12.5625 9.363281 C 12.511719 9.109375 12.550781 8.855469 12.679688 8.632812 C 12.824219 8.421875 13.003906 8.277344 13.246094 8.203125 C 13.261719 8.199219 13.277344 8.195312 13.292969 8.191406 C 13.570312 8.136719 13.820312 8.195312 14.058594 8.34375 Z M 14.058594 8.34375 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 8.375 13.523438 C 8.605469 13.730469 8.71875 13.984375 8.742188 14.289062 C 8.734375 14.554688 8.621094 14.789062 8.445312 14.984375 C 8.25 15.164062 7.996094 15.25 7.734375 15.253906 C 7.46875 15.242188 7.25 15.136719 7.0625 14.953125 C 6.863281 14.730469 6.789062 14.488281 6.792969 14.195312 C 6.832031 13.894531 6.964844 13.664062 7.199219 13.472656 C 7.582031 13.230469 8.015625 13.25 8.375 13.523438 Z M 8.375 13.523438 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 14.027344 12.066406 C 14.25 12.234375 14.421875 12.449219 14.472656 12.726562 C 14.492188 13.019531 14.464844 13.269531 14.273438 13.5 C 14.089844 13.699219 13.886719 13.84375 13.609375 13.863281 C 13.3125 13.867188 13.058594 13.800781 12.832031 13.589844 C 12.730469 13.480469 12.65625 13.371094 12.601562 13.234375 C 12.589844 13.207031 12.582031 13.183594 12.570312 13.15625 C 12.519531 12.886719 12.539062 12.625 12.679688 12.386719 C 12.984375 11.945312 13.558594 11.765625 14.027344 12.066406 Z M 14.027344 12.066406 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 8.269531 2.203125 C 8.492188 2.371094 8.652344 2.574219 8.703125 2.855469 C 8.738281 3.113281 8.695312 3.371094 8.535156 3.582031 C 8.355469 3.796875 8.136719 3.949219 7.851562 3.976562 C 7.539062 3.988281 7.289062 3.894531 7.054688 3.679688 C 6.851562 3.449219 6.796875 3.222656 6.808594 2.914062 C 6.824219 2.671875 6.929688 2.480469 7.105469 2.308594 C 7.445312 2.039062 7.886719 1.964844 8.269531 2.203125 Z M 8.269531 2.203125 "/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/public/tracing/weave-icon.svg b/app/components/base/icons/assets/public/tracing/weave-icon.svg
new file mode 100644
index 0000000..62e6067
--- /dev/null
+++ b/app/components/base/icons/assets/public/tracing/weave-icon.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="120px" height="16px" viewBox="0 0 120 16" version="1.1">
+<g id="surface1">
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 20.847656 3.292969 C 20.875 3.292969 20.902344 3.292969 20.933594 3.292969 C 20.949219 3.292969 20.964844 3.292969 20.980469 3.292969 C 21.035156 3.292969 21.089844 3.292969 21.140625 3.292969 C 21.179688 3.292969 21.21875 3.292969 21.253906 3.292969 C 21.359375 3.292969 21.464844 3.292969 21.566406 3.292969 C 21.675781 3.292969 21.78125 3.292969 21.890625 3.292969 C 22.097656 3.292969 22.300781 3.292969 22.507812 3.292969 C 22.738281 3.292969 22.972656 3.292969 23.207031 3.296875 C 23.6875 3.296875 24.167969 3.296875 24.648438 3.296875 C 24.648438 3.519531 24.648438 3.742188 24.648438 3.96875 C 24.113281 4.042969 24.113281 4.042969 23.566406 4.113281 C 23.667969 4.496094 23.769531 4.882812 23.867188 5.265625 C 23.878906 5.308594 23.878906 5.308594 23.890625 5.351562 C 24.128906 6.269531 24.371094 7.183594 24.609375 8.097656 C 24.675781 8.339844 24.738281 8.582031 24.800781 8.824219 C 24.816406 8.878906 24.832031 8.933594 24.84375 8.992188 C 24.867188 9.078125 24.890625 9.167969 24.914062 9.257812 C 24.921875 9.289062 24.933594 9.320312 24.941406 9.355469 C 24.953125 9.398438 24.964844 9.441406 24.976562 9.484375 C 24.984375 9.523438 24.984375 9.523438 24.996094 9.558594 C 25.007812 9.625 25.007812 9.625 25.007812 9.71875 C 25.023438 9.71875 25.039062 9.71875 25.054688 9.71875 C 25.058594 9.707031 25.058594 9.695312 25.0625 9.679688 C 25.097656 9.492188 25.152344 9.3125 25.210938 9.128906 C 25.222656 9.097656 25.234375 9.0625 25.246094 9.027344 C 25.269531 8.953125 25.292969 8.882812 25.316406 8.808594 C 25.355469 8.691406 25.390625 8.574219 25.429688 8.457031 C 25.464844 8.339844 25.503906 8.21875 25.542969 8.097656 C 25.660156 7.738281 25.773438 7.375 25.890625 7.011719 C 25.902344 6.96875 25.917969 6.921875 25.933594 6.875 C 26.226562 5.945312 26.519531 5.019531 26.808594 4.089844 C 26.785156 4.089844 26.765625 4.089844 26.742188 4.085938 C 26.507812 4.074219 26.273438 4.046875 26.042969 4.015625 C 26.007812 4.011719 25.972656 4.007812 25.933594 4.003906 C 25.851562 3.992188 25.765625 3.980469 25.679688 3.96875 C 25.679688 3.746094 25.679688 3.523438 25.679688 3.296875 C 26.175781 3.296875 26.667969 3.296875 27.160156 3.296875 C 27.390625 3.292969 27.621094 3.292969 27.851562 3.292969 C 28.050781 3.292969 28.25 3.292969 28.449219 3.292969 C 28.554688 3.292969 28.660156 3.292969 28.765625 3.292969 C 28.867188 3.292969 28.964844 3.292969 29.066406 3.292969 C 29.101562 3.292969 29.140625 3.292969 29.175781 3.292969 C 29.226562 3.292969 29.273438 3.292969 29.324219 3.292969 C 29.367188 3.292969 29.367188 3.292969 29.410156 3.292969 C 29.472656 3.296875 29.472656 3.296875 29.496094 3.320312 C 29.5 3.367188 29.5 3.417969 29.5 3.464844 C 29.5 3.492188 29.5 3.515625 29.5 3.542969 C 29.496094 3.59375 29.496094 3.59375 29.496094 3.648438 C 29.496094 3.753906 29.496094 3.859375 29.496094 3.96875 C 29.09375 4.015625 28.6875 4.066406 28.273438 4.113281 C 28.679688 5.460938 28.679688 5.460938 29.089844 6.808594 C 29.105469 6.859375 29.121094 6.910156 29.136719 6.960938 C 29.234375 7.292969 29.335938 7.625 29.4375 7.960938 C 29.484375 8.113281 29.53125 8.265625 29.578125 8.417969 C 29.605469 8.507812 29.632812 8.597656 29.660156 8.691406 C 29.878906 9.40625 29.878906 9.40625 29.976562 9.746094 C 30.027344 9.664062 30.046875 9.601562 30.070312 9.507812 C 30.078125 9.484375 30.078125 9.484375 30.085938 9.457031 C 30.101562 9.402344 30.117188 9.34375 30.132812 9.289062 C 30.144531 9.25 30.152344 9.207031 30.164062 9.167969 C 30.1875 9.082031 30.214844 8.992188 30.238281 8.90625 C 30.292969 8.691406 30.351562 8.480469 30.410156 8.269531 C 30.433594 8.191406 30.453125 8.117188 30.472656 8.042969 C 30.621094 7.5 30.769531 6.960938 30.921875 6.421875 C 30.949219 6.324219 30.976562 6.226562 31 6.128906 C 31.066406 5.902344 31.128906 5.675781 31.191406 5.449219 C 31.230469 5.308594 31.269531 5.164062 31.308594 5.023438 C 31.335938 4.925781 31.363281 4.828125 31.390625 4.734375 C 31.402344 4.6875 31.414062 4.640625 31.429688 4.59375 C 31.445312 4.53125 31.464844 4.46875 31.480469 4.40625 C 31.488281 4.386719 31.492188 4.367188 31.496094 4.347656 C 31.515625 4.277344 31.535156 4.207031 31.558594 4.136719 C 31.210938 4.074219 30.855469 4.023438 30.503906 3.96875 C 30.503906 3.746094 30.503906 3.523438 30.503906 3.296875 C 30.878906 3.296875 31.253906 3.296875 31.628906 3.296875 C 31.804688 3.292969 31.976562 3.292969 32.152344 3.292969 C 32.304688 3.292969 32.457031 3.292969 32.605469 3.292969 C 32.6875 3.292969 32.769531 3.292969 32.847656 3.292969 C 32.9375 3.292969 33.027344 3.292969 33.117188 3.292969 C 33.144531 3.292969 33.171875 3.292969 33.199219 3.292969 C 33.222656 3.292969 33.246094 3.292969 33.273438 3.292969 C 33.304688 3.292969 33.304688 3.292969 33.335938 3.292969 C 33.382812 3.296875 33.382812 3.296875 33.40625 3.320312 C 33.410156 3.367188 33.410156 3.414062 33.410156 3.460938 C 33.410156 3.488281 33.410156 3.515625 33.410156 3.542969 C 33.410156 3.574219 33.410156 3.605469 33.410156 3.632812 C 33.410156 3.664062 33.410156 3.695312 33.410156 3.726562 C 33.410156 3.796875 33.410156 3.871094 33.40625 3.945312 C 33.292969 3.964844 33.175781 3.984375 33.0625 4.007812 C 33.023438 4.011719 32.984375 4.019531 32.945312 4.027344 C 32.738281 4.0625 32.535156 4.097656 32.328125 4.113281 C 32.320312 4.144531 32.320312 4.144531 32.3125 4.179688 C 32.238281 4.480469 32.15625 4.78125 32.070312 5.082031 C 32.058594 5.128906 32.042969 5.171875 32.03125 5.21875 C 31.875 5.78125 31.714844 6.347656 31.550781 6.910156 C 31.375 7.535156 31.195312 8.160156 31.019531 8.785156 C 30.992188 8.871094 30.96875 8.957031 30.945312 9.042969 C 30.835938 9.433594 30.722656 9.820312 30.613281 10.210938 C 30.566406 10.378906 30.519531 10.542969 30.472656 10.707031 C 30.445312 10.804688 30.417969 10.902344 30.390625 11 C 30.277344 11.390625 30.167969 11.785156 30.046875 12.175781 C 29.730469 12.175781 29.414062 12.175781 29.089844 12.175781 C 29.03125 12.003906 29.03125 12.003906 28.976562 11.832031 C 28.925781 11.675781 28.878906 11.523438 28.828125 11.367188 C 28.820312 11.347656 28.8125 11.328125 28.808594 11.304688 C 28.632812 10.769531 28.460938 10.230469 28.285156 9.695312 C 28.144531 9.273438 28.007812 8.847656 27.875 8.425781 C 27.695312 7.867188 27.515625 7.308594 27.332031 6.753906 C 27.304688 6.679688 27.28125 6.605469 27.257812 6.53125 C 27.238281 6.476562 27.222656 6.425781 27.207031 6.375 C 27.046875 5.894531 27.046875 5.894531 27.046875 5.796875 C 27.03125 5.796875 27.015625 5.796875 27 5.796875 C 26.996094 5.8125 26.996094 5.828125 26.992188 5.84375 C 26.964844 5.988281 26.925781 6.132812 26.882812 6.273438 C 26.875 6.296875 26.867188 6.316406 26.859375 6.339844 C 26.84375 6.390625 26.828125 6.4375 26.8125 6.488281 C 26.769531 6.625 26.726562 6.761719 26.683594 6.898438 C 26.675781 6.929688 26.664062 6.957031 26.65625 6.988281 C 26.546875 7.328125 26.445312 7.667969 26.339844 8.007812 C 26.316406 8.078125 26.296875 8.144531 26.273438 8.214844 C 26.230469 8.355469 26.1875 8.496094 26.144531 8.636719 C 26.074219 8.863281 26.007812 9.089844 25.9375 9.3125 C 25.933594 9.328125 25.925781 9.347656 25.921875 9.363281 C 25.894531 9.449219 25.871094 9.535156 25.84375 9.617188 C 25.796875 9.769531 25.75 9.921875 25.703125 10.074219 C 25.675781 10.15625 25.652344 10.242188 25.625 10.328125 C 25.613281 10.363281 25.605469 10.394531 25.59375 10.429688 C 25.414062 11.011719 25.234375 11.59375 25.054688 12.175781 C 24.738281 12.175781 24.421875 12.175781 24.097656 12.175781 C 23.816406 11.230469 23.535156 10.285156 23.261719 9.339844 C 23.253906 9.320312 23.25 9.304688 23.246094 9.285156 C 23.195312 9.117188 23.144531 8.949219 23.097656 8.78125 C 22.960938 8.3125 22.824219 7.84375 22.6875 7.375 C 22.664062 7.304688 22.644531 7.234375 22.625 7.164062 C 22.414062 6.449219 22.207031 5.738281 22 5.027344 C 21.976562 4.953125 21.953125 4.878906 21.933594 4.804688 C 21.898438 4.683594 21.859375 4.5625 21.824219 4.441406 C 21.820312 4.421875 21.8125 4.402344 21.808594 4.382812 C 21.796875 4.347656 21.785156 4.3125 21.777344 4.28125 C 21.753906 4.203125 21.742188 4.148438 21.742188 4.066406 C 21.726562 4.066406 21.710938 4.0625 21.691406 4.0625 C 21.382812 4.042969 21.070312 4.003906 20.761719 3.96875 C 20.757812 3.863281 20.757812 3.753906 20.757812 3.648438 C 20.757812 3.617188 20.757812 3.585938 20.757812 3.554688 C 20.757812 3.523438 20.757812 3.496094 20.757812 3.464844 C 20.757812 3.4375 20.757812 3.410156 20.757812 3.382812 C 20.761719 3.296875 20.761719 3.296875 20.847656 3.292969 Z M 20.847656 3.292969 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 82.488281 3.25 C 83.046875 3.246094 83.605469 3.246094 84.167969 3.246094 C 84.425781 3.246094 84.6875 3.246094 84.945312 3.246094 C 85.171875 3.242188 85.398438 3.242188 85.625 3.242188 C 85.746094 3.242188 85.867188 3.242188 85.984375 3.242188 C 88.15625 3.238281 88.15625 3.238281 88.894531 3.898438 C 88.914062 3.914062 88.9375 3.929688 88.957031 3.945312 C 89.191406 4.144531 89.363281 4.402344 89.472656 4.691406 C 89.480469 4.714844 89.492188 4.742188 89.5 4.765625 C 89.65625 5.25 89.601562 5.785156 89.382812 6.234375 C 89.117188 6.753906 88.695312 7.078125 88.152344 7.265625 C 87.984375 7.320312 87.816406 7.367188 87.648438 7.410156 C 87.664062 7.414062 87.679688 7.417969 87.699219 7.421875 C 88.523438 7.605469 89.300781 7.851562 89.78125 8.597656 C 90.0625 9.0625 90.125 9.636719 90.003906 10.164062 C 89.808594 10.804688 89.363281 11.304688 88.78125 11.621094 C 88.324219 11.863281 87.820312 11.988281 87.3125 12.054688 C 87.28125 12.058594 87.253906 12.0625 87.222656 12.066406 C 86.777344 12.121094 86.332031 12.109375 85.882812 12.105469 C 85.765625 12.105469 85.644531 12.105469 85.523438 12.105469 C 85.300781 12.105469 85.074219 12.105469 84.847656 12.105469 C 84.589844 12.105469 84.332031 12.105469 84.074219 12.105469 C 83.546875 12.105469 83.015625 12.101562 82.488281 12.101562 C 82.488281 11.878906 82.488281 11.65625 82.488281 11.429688 C 82.859375 11.390625 83.234375 11.347656 83.617188 11.308594 C 83.617188 8.910156 83.617188 6.511719 83.617188 4.042969 C 83.488281 4.035156 83.363281 4.027344 83.230469 4.019531 C 83.117188 4.007812 83.003906 3.996094 82.890625 3.980469 C 82.863281 3.980469 82.832031 3.976562 82.804688 3.972656 C 82.695312 3.960938 82.59375 3.949219 82.488281 3.921875 C 82.488281 3.699219 82.488281 3.476562 82.488281 3.25 Z M 85.390625 3.96875 C 85.390625 4.242188 85.386719 4.515625 85.382812 4.785156 C 85.382812 4.914062 85.378906 5.039062 85.378906 5.164062 C 85.371094 5.824219 85.367188 6.484375 85.367188 7.144531 C 86.488281 7.183594 86.488281 7.183594 87.457031 6.691406 C 87.796875 6.320312 87.859375 5.832031 87.847656 5.351562 C 87.832031 4.992188 87.71875 4.644531 87.460938 4.378906 C 87 3.96875 86.363281 3.964844 85.78125 3.96875 C 85.742188 3.96875 85.703125 3.96875 85.667969 3.96875 C 85.574219 3.96875 85.484375 3.96875 85.390625 3.96875 Z M 85.390625 7.84375 C 85.390625 9.003906 85.390625 10.160156 85.390625 11.355469 C 86.28125 11.386719 86.28125 11.386719 87.152344 11.21875 C 87.171875 11.214844 87.1875 11.207031 87.207031 11.199219 C 87.578125 11.066406 87.886719 10.824219 88.066406 10.46875 C 88.28125 9.988281 88.289062 9.417969 88.125 8.921875 C 87.960938 8.492188 87.664062 8.234375 87.257812 8.046875 C 86.664062 7.804688 86.023438 7.84375 85.390625 7.84375 Z M 85.390625 7.84375 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 76.167969 3.476562 C 76.367188 3.671875 76.507812 3.917969 76.585938 4.1875 C 76.589844 4.203125 76.59375 4.222656 76.601562 4.242188 C 76.707031 4.675781 76.621094 5.144531 76.414062 5.53125 C 76.34375 5.644531 76.265625 5.746094 76.175781 5.847656 C 76.15625 5.867188 76.136719 5.886719 76.117188 5.910156 C 75.71875 6.332031 75.199219 6.617188 74.6875 6.882812 C 74.707031 6.902344 74.726562 6.921875 74.746094 6.941406 C 74.972656 7.191406 74.972656 7.191406 75.066406 7.296875 C 75.140625 7.382812 75.21875 7.464844 75.300781 7.542969 C 75.351562 7.59375 75.394531 7.640625 75.4375 7.695312 C 75.527344 7.796875 75.621094 7.894531 75.714844 7.992188 C 76.089844 8.394531 76.089844 8.394531 76.253906 8.585938 C 76.351562 8.695312 76.449219 8.800781 76.546875 8.90625 C 76.621094 8.980469 76.691406 9.058594 76.761719 9.136719 C 76.773438 9.152344 76.789062 9.164062 76.800781 9.179688 C 76.824219 9.207031 76.851562 9.234375 76.875 9.261719 C 76.933594 9.324219 76.992188 9.382812 77.0625 9.429688 C 77.070312 9.410156 77.070312 9.410156 77.082031 9.386719 C 77.113281 9.304688 77.152344 9.230469 77.195312 9.15625 C 77.5625 8.476562 77.800781 7.753906 77.976562 7 C 77.953125 7 77.933594 6.996094 77.910156 6.996094 C 77.707031 6.96875 77.5 6.9375 77.296875 6.902344 C 77.273438 6.898438 77.25 6.894531 77.222656 6.890625 C 77.050781 6.859375 77.050781 6.859375 76.96875 6.832031 C 76.960938 6.328125 76.960938 6.328125 77.015625 6.160156 C 77.949219 6.160156 78.886719 6.160156 79.847656 6.160156 C 79.847656 6.367188 79.847656 6.574219 79.847656 6.785156 C 79.53125 6.839844 79.214844 6.894531 78.886719 6.953125 C 78.859375 7.046875 78.832031 7.140625 78.804688 7.234375 C 78.539062 8.09375 78.164062 9.035156 77.601562 9.746094 C 77.5625 9.792969 77.5625 9.792969 77.566406 9.851562 C 77.601562 9.933594 77.648438 9.980469 77.714844 10.039062 C 77.792969 10.113281 77.867188 10.1875 77.9375 10.269531 C 78.027344 10.375 78.125 10.46875 78.222656 10.566406 C 78.308594 10.65625 78.390625 10.742188 78.472656 10.839844 C 78.539062 10.914062 78.601562 10.933594 78.695312 10.949219 C 78.71875 10.953125 78.746094 10.957031 78.769531 10.960938 C 78.796875 10.964844 78.824219 10.96875 78.851562 10.972656 C 78.875 10.980469 78.902344 10.984375 78.933594 10.988281 C 79.019531 11.003906 79.105469 11.019531 79.191406 11.03125 C 79.277344 11.046875 79.363281 11.0625 79.449219 11.078125 C 79.503906 11.085938 79.558594 11.097656 79.613281 11.105469 C 79.648438 11.113281 79.648438 11.113281 79.6875 11.117188 C 79.707031 11.121094 79.730469 11.125 79.75 11.128906 C 79.800781 11.140625 79.800781 11.140625 79.824219 11.164062 C 79.820312 11.421875 79.785156 11.679688 79.753906 11.933594 C 79.691406 11.949219 79.632812 11.964844 79.570312 11.980469 C 79.546875 11.984375 79.546875 11.984375 79.519531 11.992188 C 79.214844 12.066406 78.910156 12.085938 78.597656 12.085938 C 78.539062 12.085938 78.484375 12.085938 78.425781 12.085938 C 77.847656 12.089844 77.332031 11.917969 76.894531 11.523438 C 76.855469 11.484375 76.816406 11.445312 76.777344 11.40625 C 76.71875 11.347656 76.660156 11.296875 76.601562 11.242188 C 76.578125 11.21875 76.578125 11.21875 76.554688 11.195312 C 76.515625 11.160156 76.476562 11.125 76.441406 11.089844 C 76.429688 11.101562 76.417969 11.109375 76.410156 11.117188 C 76.140625 11.351562 75.859375 11.554688 75.542969 11.71875 C 75.511719 11.738281 75.476562 11.757812 75.445312 11.777344 C 75.3125 11.847656 75.179688 11.894531 75.039062 11.9375 C 75.011719 11.945312 75.011719 11.945312 74.984375 11.953125 C 74.632812 12.058594 74.269531 12.089844 73.90625 12.085938 C 73.84375 12.085938 73.785156 12.085938 73.722656 12.089844 C 72.941406 12.089844 72.222656 11.824219 71.652344 11.28125 C 71.203125 10.820312 71.023438 10.246094 71.03125 9.609375 C 71.042969 9.058594 71.230469 8.546875 71.59375 8.132812 C 71.609375 8.113281 71.625 8.09375 71.644531 8.070312 C 71.980469 7.683594 72.398438 7.421875 72.839844 7.171875 C 72.871094 7.152344 72.902344 7.132812 72.9375 7.113281 C 72.960938 7.101562 72.984375 7.085938 73.007812 7.074219 C 72.996094 7.0625 72.988281 7.050781 72.976562 7.042969 C 72.398438 6.425781 72.09375 5.613281 72.113281 4.773438 C 72.128906 4.371094 72.257812 3.988281 72.527344 3.679688 C 72.542969 3.660156 72.558594 3.644531 72.570312 3.625 C 72.917969 3.210938 73.496094 2.996094 74.015625 2.933594 C 74.050781 2.929688 74.050781 2.929688 74.082031 2.925781 C 74.804688 2.847656 75.621094 2.964844 76.167969 3.476562 Z M 73.671875 3.796875 C 73.433594 4.113281 73.414062 4.4375 73.457031 4.820312 C 73.550781 5.460938 73.921875 5.9375 74.328125 6.425781 C 74.398438 6.390625 74.449219 6.355469 74.503906 6.300781 C 74.527344 6.28125 74.527344 6.28125 74.550781 6.257812 C 74.566406 6.242188 74.582031 6.226562 74.597656 6.210938 C 74.613281 6.191406 74.628906 6.175781 74.644531 6.160156 C 74.773438 6.03125 74.890625 5.894531 75 5.75 C 75.019531 5.726562 75.035156 5.699219 75.054688 5.675781 C 75.335938 5.292969 75.5 4.859375 75.457031 4.378906 C 75.40625 4.078125 75.289062 3.820312 75.035156 3.636719 C 74.59375 3.363281 74.03125 3.410156 73.671875 3.796875 Z M 73.046875 7.828125 C 72.664062 8.226562 72.519531 8.789062 72.519531 9.332031 C 72.53125 9.800781 72.71875 10.257812 73.039062 10.601562 C 73.46875 10.996094 73.980469 11.140625 74.550781 11.125 C 74.960938 11.105469 75.339844 11.003906 75.703125 10.8125 C 75.71875 10.804688 75.738281 10.796875 75.753906 10.785156 C 75.84375 10.738281 75.90625 10.699219 75.960938 10.609375 C 75.949219 10.601562 75.941406 10.589844 75.933594 10.582031 C 75.460938 10.074219 75.460938 10.074219 75.25 9.8125 C 75.1875 9.738281 75.125 9.664062 75.0625 9.59375 C 74.972656 9.484375 74.882812 9.375 74.796875 9.265625 C 74.695312 9.132812 74.589844 9.003906 74.480469 8.878906 C 74.390625 8.773438 74.304688 8.667969 74.214844 8.5625 C 74.152344 8.484375 74.085938 8.40625 74.019531 8.328125 C 73.921875 8.214844 73.828125 8.101562 73.734375 7.984375 C 73.726562 7.96875 73.714844 7.957031 73.703125 7.941406 C 73.683594 7.914062 73.660156 7.886719 73.640625 7.859375 C 73.589844 7.792969 73.539062 7.730469 73.488281 7.667969 C 73.460938 7.632812 73.460938 7.632812 73.433594 7.601562 C 73.414062 7.578125 73.414062 7.578125 73.390625 7.554688 C 73.265625 7.554688 73.132812 7.742188 73.046875 7.828125 Z M 73.046875 7.828125 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 49.992188 5.535156 C 50.101562 5.609375 50.101562 5.609375 50.136719 5.679688 C 50.136719 5.746094 50.140625 5.8125 50.140625 5.882812 C 50.140625 5.914062 50.140625 5.914062 50.140625 5.941406 C 50.140625 5.984375 50.140625 6.027344 50.140625 6.070312 C 50.140625 6.136719 50.140625 6.203125 50.140625 6.269531 C 50.140625 6.308594 50.140625 6.351562 50.140625 6.390625 C 50.140625 6.410156 50.140625 6.429688 50.140625 6.453125 C 50.140625 6.589844 50.140625 6.589844 50.113281 6.617188 C 50.074219 6.617188 50.035156 6.621094 49.996094 6.621094 C 49.972656 6.621094 49.949219 6.621094 49.921875 6.621094 C 49.894531 6.621094 49.871094 6.617188 49.84375 6.617188 C 49.816406 6.617188 49.789062 6.617188 49.757812 6.617188 C 49.671875 6.617188 49.585938 6.617188 49.5 6.617188 C 49.441406 6.617188 49.378906 6.617188 49.320312 6.617188 C 49.175781 6.617188 49.03125 6.617188 48.886719 6.617188 C 48.898438 6.640625 48.90625 6.660156 48.917969 6.683594 C 48.929688 6.714844 48.945312 6.746094 48.957031 6.773438 C 48.964844 6.789062 48.96875 6.804688 48.976562 6.820312 C 49.203125 7.339844 49.195312 8 48.988281 8.523438 C 48.75 9.0625 48.355469 9.457031 47.804688 9.671875 C 47.066406 9.941406 46.210938 9.941406 45.457031 9.746094 C 45.277344 10.003906 45.214844 10.273438 45.238281 10.585938 C 45.269531 10.699219 45.316406 10.761719 45.402344 10.835938 C 45.617188 10.945312 45.851562 10.949219 46.089844 10.949219 C 46.113281 10.953125 46.132812 10.953125 46.15625 10.953125 C 46.203125 10.953125 46.25 10.953125 46.292969 10.953125 C 46.367188 10.953125 46.441406 10.953125 46.515625 10.953125 C 46.726562 10.953125 46.9375 10.957031 47.144531 10.957031 C 47.273438 10.957031 47.402344 10.957031 47.53125 10.960938 C 47.582031 10.960938 47.628906 10.960938 47.675781 10.960938 C 48.324219 10.960938 49.039062 11.019531 49.53125 11.492188 C 49.546875 11.511719 49.566406 11.53125 49.585938 11.550781 C 49.601562 11.566406 49.617188 11.582031 49.636719 11.597656 C 49.957031 11.929688 50.0625 12.394531 50.066406 12.84375 C 50.054688 13.351562 49.847656 13.800781 49.511719 14.171875 C 49.496094 14.191406 49.480469 14.207031 49.460938 14.226562 C 48.8125 14.921875 47.769531 15.179688 46.855469 15.210938 C 45.890625 15.234375 44.761719 15.230469 44.015625 14.523438 C 43.738281 14.222656 43.660156 13.886719 43.671875 13.488281 C 43.679688 13.363281 43.699219 13.253906 43.753906 13.136719 C 43.761719 13.117188 43.769531 13.09375 43.78125 13.074219 C 43.996094 12.644531 44.386719 12.410156 44.785156 12.175781 C 44.765625 12.167969 44.746094 12.160156 44.730469 12.152344 C 44.398438 11.996094 44.222656 11.808594 44.089844 11.476562 C 43.988281 11.136719 44.070312 10.757812 44.222656 10.453125 C 44.421875 10.109375 44.695312 9.824219 44.976562 9.550781 C 44.960938 9.542969 44.945312 9.53125 44.925781 9.523438 C 44.757812 9.417969 44.613281 9.304688 44.472656 9.167969 C 44.457031 9.152344 44.441406 9.136719 44.425781 9.121094 C 44.214844 8.902344 44.085938 8.597656 44.015625 8.300781 C 44.011719 8.28125 44.003906 8.257812 44 8.238281 C 43.882812 7.675781 43.964844 7.042969 44.277344 6.558594 C 44.621094 6.070312 45.09375 5.773438 45.671875 5.628906 C 45.6875 5.625 45.703125 5.621094 45.71875 5.617188 C 46.25 5.492188 46.917969 5.496094 47.449219 5.628906 C 47.464844 5.632812 47.480469 5.636719 47.496094 5.640625 C 47.6875 5.691406 47.867188 5.761719 48.046875 5.84375 C 48.0625 5.851562 48.078125 5.859375 48.09375 5.867188 C 48.164062 5.902344 48.226562 5.933594 48.289062 5.980469 C 48.390625 6.066406 48.390625 6.066406 48.515625 6.082031 C 48.582031 6.0625 48.644531 6.035156 48.707031 6.003906 C 48.730469 5.996094 48.753906 5.984375 48.78125 5.976562 C 48.855469 5.941406 48.929688 5.910156 49.003906 5.875 C 49.054688 5.851562 49.101562 5.832031 49.152344 5.808594 C 49.320312 5.738281 49.488281 5.664062 49.652344 5.585938 C 49.679688 5.574219 49.703125 5.566406 49.730469 5.554688 C 49.75 5.542969 49.769531 5.535156 49.789062 5.523438 C 49.867188 5.503906 49.917969 5.515625 49.992188 5.535156 Z M 45.835938 6.507812 C 45.472656 6.984375 45.421875 7.597656 45.492188 8.175781 C 45.550781 8.542969 45.6875 8.890625 45.980469 9.132812 C 46.207031 9.285156 46.46875 9.3125 46.734375 9.277344 C 47.015625 9.21875 47.210938 9.089844 47.375 8.855469 C 47.683594 8.375 47.742188 7.746094 47.640625 7.191406 C 47.5625 6.859375 47.402344 6.507812 47.117188 6.308594 C 46.703125 6.074219 46.152344 6.148438 45.835938 6.507812 Z M 45.238281 12.367188 C 44.957031 12.734375 44.867188 13.113281 44.902344 13.570312 C 44.957031 13.84375 45.09375 14.058594 45.316406 14.226562 C 45.613281 14.417969 46.015625 14.496094 46.367188 14.507812 C 46.394531 14.507812 46.394531 14.507812 46.417969 14.507812 C 47.132812 14.527344 47.90625 14.457031 48.453125 13.945312 C 48.652344 13.738281 48.710938 13.515625 48.703125 13.230469 C 48.683594 12.992188 48.570312 12.800781 48.394531 12.644531 C 48.113281 12.441406 47.726562 12.449219 47.398438 12.449219 C 47.355469 12.449219 47.3125 12.449219 47.269531 12.449219 C 47.15625 12.449219 47.046875 12.449219 46.933594 12.449219 C 46.753906 12.449219 46.574219 12.445312 46.394531 12.445312 C 46.332031 12.445312 46.269531 12.445312 46.210938 12.445312 C 45.882812 12.445312 45.5625 12.414062 45.238281 12.367188 Z M 45.238281 12.367188 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 53.039062 2.382812 C 53.0625 2.390625 53.0625 2.390625 53.085938 2.398438 C 53.140625 2.429688 53.171875 2.453125 53.207031 2.503906 C 53.230469 2.617188 53.21875 2.730469 53.214844 2.84375 C 53.210938 2.878906 53.210938 2.914062 53.210938 2.953125 C 53.207031 3.027344 53.203125 3.105469 53.199219 3.183594 C 53.191406 3.371094 53.183594 3.558594 53.179688 3.746094 C 53.175781 3.792969 53.175781 3.835938 53.175781 3.882812 C 53.15625 4.441406 53.15625 5 53.15625 5.5625 C 53.15625 5.640625 53.15625 5.71875 53.15625 5.792969 C 53.15625 6.085938 53.160156 6.375 53.160156 6.664062 C 53.179688 6.644531 53.195312 6.625 53.214844 6.605469 C 53.238281 6.578125 53.261719 6.550781 53.285156 6.523438 C 53.296875 6.511719 53.3125 6.5 53.324219 6.484375 C 53.78125 5.984375 54.445312 5.601562 55.128906 5.550781 C 55.640625 5.535156 56.128906 5.578125 56.527344 5.929688 C 56.566406 5.964844 56.601562 6 56.640625 6.039062 C 56.664062 6.0625 56.664062 6.0625 56.691406 6.089844 C 57.246094 6.660156 57.203125 7.570312 57.203125 8.304688 C 57.203125 8.414062 57.203125 8.523438 57.207031 8.632812 C 57.207031 8.839844 57.207031 9.042969 57.207031 9.25 C 57.207031 9.484375 57.210938 9.722656 57.210938 9.957031 C 57.210938 10.4375 57.214844 10.921875 57.214844 11.40625 C 57.246094 11.410156 57.246094 11.410156 57.28125 11.414062 C 57.308594 11.417969 57.335938 11.421875 57.363281 11.425781 C 57.40625 11.433594 57.40625 11.433594 57.445312 11.441406 C 57.558594 11.457031 57.671875 11.480469 57.785156 11.503906 C 57.808594 11.507812 57.828125 11.511719 57.851562 11.515625 C 57.878906 11.519531 57.878906 11.519531 57.910156 11.527344 C 57.929688 11.53125 57.949219 11.535156 57.964844 11.539062 C 58.007812 11.550781 58.007812 11.550781 58.03125 11.574219 C 58.035156 11.613281 58.035156 11.65625 58.035156 11.695312 C 58.035156 11.71875 58.035156 11.746094 58.035156 11.769531 C 58.035156 11.796875 58.035156 11.824219 58.035156 11.851562 C 58.035156 11.875 58.035156 11.902344 58.035156 11.929688 C 58.035156 11.964844 58.035156 11.964844 58.035156 12.003906 C 58.035156 12.027344 58.035156 12.050781 58.035156 12.074219 C 58.03125 12.125 58.03125 12.125 58.007812 12.148438 C 57.964844 12.152344 57.921875 12.152344 57.882812 12.152344 C 57.839844 12.152344 57.839844 12.152344 57.796875 12.152344 C 57.769531 12.152344 57.738281 12.152344 57.707031 12.152344 C 57.675781 12.152344 57.640625 12.152344 57.609375 12.152344 C 57.523438 12.152344 57.433594 12.152344 57.347656 12.152344 C 57.257812 12.152344 57.164062 12.152344 57.074219 12.152344 C 56.917969 12.152344 56.765625 12.152344 56.613281 12.152344 C 56.433594 12.152344 56.257812 12.152344 56.082031 12.152344 C 55.929688 12.152344 55.777344 12.152344 55.625 12.152344 C 55.53125 12.152344 55.441406 12.152344 55.351562 12.152344 C 55.265625 12.152344 55.179688 12.152344 55.09375 12.152344 C 55.046875 12.152344 55 12.152344 54.953125 12.152344 C 54.925781 12.152344 54.898438 12.152344 54.871094 12.152344 C 54.847656 12.152344 54.824219 12.152344 54.796875 12.152344 C 54.742188 12.148438 54.742188 12.148438 54.71875 12.125 C 54.71875 12.085938 54.71875 12.042969 54.71875 12.003906 C 54.71875 11.976562 54.71875 11.953125 54.71875 11.925781 C 54.71875 11.902344 54.71875 11.875 54.71875 11.847656 C 54.71875 11.820312 54.71875 11.796875 54.71875 11.769531 C 54.71875 11.703125 54.71875 11.636719 54.71875 11.574219 C 54.8125 11.53125 54.902344 11.507812 55.003906 11.488281 C 55.03125 11.480469 55.0625 11.476562 55.09375 11.46875 C 55.113281 11.464844 55.128906 11.460938 55.144531 11.460938 C 55.191406 11.449219 55.242188 11.441406 55.289062 11.429688 C 55.527344 11.378906 55.527344 11.378906 55.585938 11.378906 C 55.582031 10.90625 55.582031 10.433594 55.578125 9.960938 C 55.578125 9.742188 55.578125 9.523438 55.574219 9.304688 C 55.574219 9.109375 55.574219 8.917969 55.574219 8.726562 C 55.574219 8.625 55.570312 8.527344 55.570312 8.425781 C 55.570312 8.328125 55.570312 8.234375 55.570312 8.136719 C 55.570312 8.101562 55.570312 8.066406 55.570312 8.03125 C 55.570312 7.664062 55.554688 7.199219 55.289062 6.917969 C 55.054688 6.722656 54.742188 6.746094 54.457031 6.761719 C 54.101562 6.800781 53.738281 7.007812 53.464844 7.234375 C 53.425781 7.265625 53.425781 7.265625 53.371094 7.300781 C 53.273438 7.371094 53.214844 7.421875 53.1875 7.539062 C 53.179688 7.640625 53.179688 7.742188 53.183594 7.84375 C 53.183594 7.882812 53.183594 7.921875 53.183594 7.960938 C 53.183594 8.066406 53.183594 8.167969 53.1875 8.273438 C 53.1875 8.386719 53.1875 8.496094 53.1875 8.605469 C 53.1875 8.8125 53.191406 9.023438 53.191406 9.230469 C 53.195312 9.46875 53.195312 9.703125 53.195312 9.941406 C 53.199219 10.429688 53.203125 10.917969 53.207031 11.40625 C 53.238281 11.410156 53.238281 11.410156 53.265625 11.414062 C 53.351562 11.429688 53.4375 11.445312 53.523438 11.464844 C 53.554688 11.46875 53.585938 11.472656 53.613281 11.480469 C 53.644531 11.484375 53.671875 11.492188 53.703125 11.496094 C 53.730469 11.5 53.753906 11.507812 53.78125 11.511719 C 53.847656 11.523438 53.910156 11.535156 53.976562 11.550781 C 53.976562 11.746094 53.976562 11.945312 53.976562 12.148438 C 52.890625 12.148438 51.804688 12.148438 50.6875 12.148438 C 50.6875 11.953125 50.6875 11.753906 50.6875 11.550781 C 50.964844 11.492188 51.242188 11.4375 51.527344 11.378906 C 51.542969 11.160156 51.554688 10.945312 51.554688 10.722656 C 51.554688 10.691406 51.554688 10.660156 51.554688 10.628906 C 51.554688 10.546875 51.558594 10.464844 51.558594 10.378906 C 51.558594 10.289062 51.558594 10.199219 51.558594 10.109375 C 51.558594 9.953125 51.558594 9.796875 51.558594 9.640625 C 51.558594 9.414062 51.558594 9.1875 51.5625 8.960938 C 51.5625 8.59375 51.5625 8.230469 51.5625 7.863281 C 51.566406 7.507812 51.566406 7.152344 51.566406 6.792969 C 51.566406 6.773438 51.566406 6.75 51.566406 6.726562 C 51.566406 6.617188 51.566406 6.507812 51.566406 6.398438 C 51.570312 5.484375 51.574219 4.570312 51.574219 3.65625 C 51.554688 3.65625 51.535156 3.652344 51.515625 3.652344 C 51.476562 3.648438 51.476562 3.648438 51.4375 3.644531 C 51.414062 3.644531 51.386719 3.640625 51.359375 3.640625 C 51.277344 3.632812 51.195312 3.621094 51.113281 3.609375 C 51.082031 3.605469 51.054688 3.601562 51.023438 3.597656 C 50.996094 3.59375 50.964844 3.589844 50.933594 3.582031 C 50.902344 3.578125 50.871094 3.574219 50.839844 3.570312 C 50.765625 3.558594 50.691406 3.546875 50.617188 3.535156 C 50.617188 3.347656 50.617188 3.15625 50.617188 2.960938 C 50.910156 2.875 51.207031 2.796875 51.5 2.722656 C 51.523438 2.714844 51.542969 2.710938 51.5625 2.707031 C 51.671875 2.679688 51.777344 2.652344 51.886719 2.625 C 51.972656 2.601562 52.0625 2.578125 52.152344 2.554688 C 52.257812 2.527344 52.367188 2.5 52.472656 2.472656 C 52.515625 2.460938 52.554688 2.453125 52.597656 2.441406 C 52.652344 2.425781 52.710938 2.410156 52.765625 2.398438 C 52.78125 2.394531 52.800781 2.386719 52.816406 2.382812 C 52.898438 2.363281 52.960938 2.351562 53.039062 2.382812 Z M 53.039062 2.382812 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 99.691406 6.011719 C 100.109375 6.40625 100.234375 7.003906 100.273438 7.554688 C 100.277344 7.667969 100.277344 7.785156 100.277344 7.898438 C 100.277344 7.933594 100.277344 7.964844 100.277344 8 C 100.277344 8.074219 100.277344 8.144531 100.277344 8.21875 C 100.277344 8.332031 100.277344 8.445312 100.277344 8.558594 C 100.28125 8.886719 100.28125 9.210938 100.28125 9.535156 C 100.28125 9.714844 100.28125 9.894531 100.285156 10.074219 C 100.285156 10.171875 100.285156 10.265625 100.285156 10.359375 C 100.285156 10.449219 100.285156 10.539062 100.285156 10.628906 C 100.285156 10.675781 100.285156 10.726562 100.285156 10.773438 C 100.289062 10.964844 100.292969 11.167969 100.417969 11.320312 C 100.53125 11.378906 100.636719 11.398438 100.757812 11.367188 C 100.898438 11.308594 101.003906 11.21875 101.113281 11.117188 C 101.226562 11.199219 101.339844 11.289062 101.449219 11.378906 C 101.394531 11.527344 101.300781 11.640625 101.207031 11.765625 C 101.179688 11.804688 101.179688 11.804688 101.152344 11.84375 C 100.859375 12.152344 100.476562 12.265625 100.058594 12.277344 C 99.699219 12.269531 99.332031 12.164062 99.066406 11.910156 C 98.933594 11.757812 98.761719 11.519531 98.761719 11.308594 C 98.582031 11.449219 98.582031 11.449219 98.417969 11.605469 C 98.289062 11.738281 98.140625 11.847656 97.992188 11.957031 C 97.96875 11.972656 97.949219 11.992188 97.925781 12.007812 C 97.488281 12.3125 96.855469 12.339844 96.34375 12.25 C 95.917969 12.15625 95.527344 11.929688 95.28125 11.558594 C 95.035156 11.136719 94.964844 10.617188 95.082031 10.140625 C 95.289062 9.527344 95.746094 9.175781 96.300781 8.894531 C 96.941406 8.582031 97.644531 8.375 98.328125 8.179688 C 98.34375 8.175781 98.359375 8.171875 98.375 8.167969 C 98.472656 8.140625 98.566406 8.113281 98.664062 8.085938 C 98.695312 7.195312 98.695312 7.195312 98.328125 6.425781 C 98.121094 6.230469 97.828125 6.203125 97.558594 6.203125 C 97.53125 6.203125 97.53125 6.203125 97.503906 6.203125 C 97.339844 6.207031 97.171875 6.21875 97.007812 6.230469 C 97.003906 6.257812 97.003906 6.289062 97 6.316406 C 96.984375 6.46875 96.957031 6.617188 96.925781 6.765625 C 96.917969 6.816406 96.910156 6.863281 96.902344 6.910156 C 96.832031 7.273438 96.738281 7.585938 96.425781 7.808594 C 96.191406 7.933594 95.945312 7.933594 95.6875 7.867188 C 95.515625 7.808594 95.40625 7.707031 95.320312 7.546875 C 95.234375 7.347656 95.238281 7.183594 95.308594 6.980469 C 95.316406 6.957031 95.316406 6.957031 95.324219 6.929688 C 95.421875 6.644531 95.574219 6.441406 95.785156 6.230469 C 95.800781 6.214844 95.816406 6.195312 95.835938 6.179688 C 96.734375 5.308594 98.742188 5.21875 99.691406 6.011719 Z M 98.394531 8.742188 C 98.292969 8.777344 98.1875 8.8125 98.082031 8.847656 C 97.574219 9.007812 97.011719 9.230469 96.746094 9.722656 C 96.582031 10.042969 96.554688 10.355469 96.648438 10.703125 C 96.71875 10.914062 96.816406 11.042969 97.011719 11.152344 C 97.296875 11.292969 97.609375 11.304688 97.910156 11.199219 C 98.058594 11.132812 98.207031 11.050781 98.34375 10.960938 C 98.398438 10.921875 98.398438 10.921875 98.46875 10.890625 C 98.558594 10.839844 98.644531 10.789062 98.679688 10.683594 C 98.703125 10.542969 98.695312 10.402344 98.691406 10.257812 C 98.6875 10.214844 98.6875 10.167969 98.6875 10.121094 C 98.6875 10 98.683594 9.878906 98.683594 9.757812 C 98.679688 9.636719 98.679688 9.511719 98.675781 9.386719 C 98.675781 9.144531 98.667969 8.902344 98.664062 8.660156 C 98.578125 8.660156 98.476562 8.714844 98.394531 8.742188 Z M 98.394531 8.742188 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 38.035156 6.242188 C 38.207031 6.40625 38.332031 6.578125 38.449219 6.785156 C 38.460938 6.808594 38.460938 6.808594 38.472656 6.832031 C 38.835938 7.472656 38.875 8.257812 38.761719 8.972656 C 38.734375 9 38.734375 9 38.671875 9 C 38.625 9 38.625 9 38.578125 9 C 38.5625 9 38.546875 9 38.53125 9 C 38.472656 9 38.417969 9 38.363281 9 C 38.324219 9 38.285156 9 38.242188 9 C 38.136719 9 38.027344 9 37.917969 9 C 37.804688 9 37.695312 9 37.582031 9 C 37.367188 9 37.152344 9 36.9375 9 C 36.695312 9 36.453125 9 36.207031 9 C 35.707031 9 35.207031 9 34.703125 9 C 34.714844 9.089844 34.726562 9.183594 34.738281 9.273438 C 34.742188 9.300781 34.742188 9.328125 34.746094 9.351562 C 34.8125 9.898438 35.007812 10.441406 35.4375 10.808594 C 35.933594 11.1875 36.476562 11.269531 37.089844 11.203125 C 37.539062 11.128906 37.90625 10.847656 38.222656 10.535156 C 38.347656 10.417969 38.347656 10.417969 38.425781 10.417969 C 38.464844 10.445312 38.464844 10.445312 38.503906 10.488281 C 38.589844 10.585938 38.683594 10.671875 38.785156 10.753906 C 38.679688 11.046875 38.46875 11.28125 38.257812 11.5 C 38.242188 11.519531 38.222656 11.535156 38.207031 11.554688 C 37.792969 12 37.171875 12.246094 36.574219 12.320312 C 36.554688 12.320312 36.535156 12.324219 36.515625 12.328125 C 35.640625 12.425781 34.773438 12.210938 34.074219 11.671875 C 33.421875 11.125 33.078125 10.363281 32.976562 9.527344 C 32.972656 9.496094 32.972656 9.496094 32.96875 9.460938 C 32.871094 8.5 33.074219 7.515625 33.675781 6.746094 C 33.707031 6.710938 33.738281 6.675781 33.769531 6.640625 C 33.78125 6.621094 33.796875 6.605469 33.8125 6.585938 C 34.316406 5.988281 35.136719 5.640625 35.902344 5.566406 C 36.699219 5.511719 37.429688 5.699219 38.035156 6.242188 Z M 35.226562 6.652344 C 34.949219 7.007812 34.820312 7.386719 34.746094 7.824219 C 34.742188 7.851562 34.738281 7.875 34.734375 7.898438 C 34.730469 7.921875 34.726562 7.949219 34.722656 7.972656 C 34.71875 7.992188 34.714844 8.015625 34.710938 8.035156 C 34.703125 8.097656 34.703125 8.15625 34.703125 8.222656 C 34.703125 8.242188 34.703125 8.261719 34.703125 8.28125 C 34.703125 8.292969 34.703125 8.308594 34.703125 8.324219 C 34.972656 8.328125 35.242188 8.328125 35.507812 8.328125 C 35.632812 8.328125 35.757812 8.328125 35.882812 8.332031 C 36.003906 8.332031 36.125 8.332031 36.246094 8.332031 C 36.289062 8.332031 36.335938 8.332031 36.382812 8.332031 C 36.445312 8.332031 36.511719 8.332031 36.574219 8.332031 C 36.59375 8.332031 36.613281 8.332031 36.632812 8.332031 C 36.800781 8.332031 36.964844 8.304688 37.085938 8.183594 C 37.273438 7.9375 37.277344 7.609375 37.246094 7.3125 C 37.195312 6.96875 37.015625 6.636719 36.730469 6.425781 C 36.226562 6.113281 35.617188 6.195312 35.226562 6.652344 Z M 35.226562 6.652344 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 112.726562 6.085938 C 112.90625 6.242188 113.058594 6.414062 113.183594 6.617188 C 113.199219 6.636719 113.210938 6.65625 113.226562 6.679688 C 113.628906 7.320312 113.699219 8.167969 113.566406 8.902344 C 113.523438 8.945312 113.449219 8.929688 113.386719 8.929688 C 113.371094 8.929688 113.355469 8.929688 113.339844 8.929688 C 113.28125 8.929688 113.226562 8.929688 113.171875 8.929688 C 113.132812 8.929688 113.089844 8.933594 113.050781 8.933594 C 112.945312 8.933594 112.835938 8.933594 112.726562 8.933594 C 112.613281 8.933594 112.5 8.933594 112.386719 8.933594 C 112.175781 8.9375 111.960938 8.9375 111.746094 8.9375 C 111.503906 8.941406 111.257812 8.941406 111.015625 8.941406 C 110.515625 8.945312 110.011719 8.949219 109.511719 8.949219 C 109.519531 9.023438 109.527344 9.097656 109.535156 9.171875 C 109.535156 9.191406 109.539062 9.210938 109.539062 9.230469 C 109.554688 9.378906 109.578125 9.523438 109.613281 9.667969 C 109.621094 9.6875 109.625 9.710938 109.628906 9.730469 C 109.703125 10.011719 109.808594 10.261719 109.992188 10.488281 C 110.003906 10.507812 110.019531 10.527344 110.035156 10.542969 C 110.320312 10.898438 110.765625 11.117188 111.214844 11.164062 C 111.839844 11.203125 112.339844 11.078125 112.820312 10.671875 C 112.9375 10.570312 113.050781 10.457031 113.160156 10.347656 C 113.230469 10.378906 113.28125 10.414062 113.339844 10.46875 C 113.355469 10.480469 113.367188 10.496094 113.382812 10.507812 C 113.398438 10.523438 113.414062 10.539062 113.429688 10.554688 C 113.445312 10.566406 113.460938 10.582031 113.476562 10.597656 C 113.515625 10.632812 113.554688 10.671875 113.59375 10.707031 C 113.324219 11.316406 112.769531 11.816406 112.15625 12.066406 C 112.054688 12.105469 111.953125 12.136719 111.847656 12.171875 C 111.832031 12.175781 111.816406 12.179688 111.800781 12.183594 C 111.507812 12.265625 111.214844 12.28125 110.914062 12.28125 C 110.898438 12.28125 110.878906 12.28125 110.859375 12.28125 C 110.554688 12.277344 110.261719 12.257812 109.96875 12.175781 C 109.941406 12.167969 109.941406 12.167969 109.914062 12.160156 C 109.203125 11.953125 108.628906 11.503906 108.238281 10.875 C 108.230469 10.859375 108.222656 10.847656 108.210938 10.832031 C 107.699219 9.980469 107.648438 8.855469 107.878906 7.90625 C 108.074219 7.136719 108.570312 6.417969 109.253906 6 C 110.304688 5.378906 111.75 5.261719 112.726562 6.085938 Z M 110.105469 6.496094 C 109.710938 6.9375 109.507812 7.546875 109.511719 8.136719 C 109.511719 8.160156 109.511719 8.179688 109.511719 8.203125 C 109.511719 8.21875 109.511719 8.234375 109.511719 8.253906 C 109.78125 8.253906 110.050781 8.253906 110.316406 8.257812 C 110.441406 8.257812 110.566406 8.257812 110.691406 8.257812 C 110.8125 8.257812 110.933594 8.257812 111.054688 8.257812 C 111.097656 8.257812 111.144531 8.261719 111.191406 8.261719 C 111.253906 8.261719 111.320312 8.261719 111.382812 8.261719 C 111.402344 8.261719 111.421875 8.261719 111.441406 8.261719 C 111.59375 8.261719 111.746094 8.234375 111.871094 8.140625 C 112.082031 7.886719 112.078125 7.605469 112.054688 7.289062 C 112.011719 6.949219 111.867188 6.6875 111.625 6.449219 C 111.609375 6.433594 111.59375 6.417969 111.582031 6.40625 C 111.164062 6.015625 110.496094 6.121094 110.105469 6.496094 Z M 110.105469 6.496094 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 119.207031 6.039062 C 119.210938 6.308594 119.203125 6.578125 119.1875 6.847656 C 119.183594 6.910156 119.183594 6.972656 119.179688 7.035156 C 119.175781 7.078125 119.175781 7.117188 119.171875 7.160156 C 119.171875 7.175781 119.171875 7.195312 119.171875 7.214844 C 119.164062 7.308594 119.152344 7.390625 119.136719 7.484375 C 118.835938 7.484375 118.535156 7.484375 118.222656 7.484375 C 118.207031 7.40625 118.191406 7.328125 118.171875 7.246094 C 118.15625 7.171875 118.140625 7.097656 118.121094 7.023438 C 118.109375 6.96875 118.101562 6.917969 118.089844 6.867188 C 118.070312 6.792969 118.054688 6.714844 118.039062 6.640625 C 118.035156 6.617188 118.027344 6.59375 118.023438 6.570312 C 118.019531 6.550781 118.015625 6.527344 118.007812 6.503906 C 118.003906 6.484375 118 6.464844 117.996094 6.445312 C 117.984375 6.398438 117.984375 6.398438 117.960938 6.351562 C 117.902344 6.332031 117.847656 6.316406 117.789062 6.300781 C 117.765625 6.296875 117.765625 6.296875 117.738281 6.289062 C 117.339844 6.1875 116.835938 6.167969 116.464844 6.375 C 116.296875 6.480469 116.203125 6.609375 116.128906 6.789062 C 116.082031 7.042969 116.105469 7.261719 116.234375 7.484375 C 116.496094 7.828125 117.082031 7.953125 117.46875 8.070312 C 118.183594 8.289062 118.960938 8.597656 119.359375 9.277344 C 119.578125 9.714844 119.621094 10.257812 119.496094 10.734375 C 119.316406 11.277344 118.957031 11.703125 118.449219 11.964844 C 117.460938 12.445312 116.246094 12.394531 115.222656 12.054688 C 115.007812 11.972656 114.804688 11.867188 114.601562 11.765625 C 114.570312 11.234375 114.574219 10.707031 114.574219 10.175781 C 114.886719 10.175781 115.195312 10.175781 115.511719 10.175781 C 115.539062 10.304688 115.539062 10.304688 115.5625 10.433594 C 115.582031 10.515625 115.597656 10.597656 115.613281 10.679688 C 115.625 10.734375 115.636719 10.792969 115.648438 10.847656 C 115.664062 10.929688 115.679688 11.011719 115.695312 11.09375 C 115.703125 11.121094 115.707031 11.144531 115.710938 11.171875 C 115.71875 11.195312 115.722656 11.21875 115.726562 11.242188 C 115.730469 11.261719 115.734375 11.285156 115.738281 11.304688 C 115.75 11.355469 115.75 11.355469 115.777344 11.40625 C 116.324219 11.617188 117.03125 11.667969 117.578125 11.4375 C 117.800781 11.332031 117.949219 11.207031 118.039062 10.972656 C 118.089844 10.761719 118.082031 10.527344 117.992188 10.328125 C 117.910156 10.191406 117.820312 10.105469 117.6875 10.023438 C 117.664062 10.003906 117.636719 9.988281 117.609375 9.972656 C 117.265625 9.769531 116.875 9.65625 116.496094 9.527344 C 116.066406 9.386719 115.683594 9.222656 115.320312 8.949219 C 115.296875 8.933594 115.273438 8.917969 115.25 8.898438 C 115.226562 8.875 115.226562 8.875 115.199219 8.855469 C 115.199219 8.839844 115.199219 8.824219 115.199219 8.804688 C 115.1875 8.800781 115.171875 8.796875 115.160156 8.789062 C 114.933594 8.65625 114.792969 8.285156 114.726562 8.046875 C 114.605469 7.507812 114.6875 6.964844 114.984375 6.496094 C 115.347656 5.957031 115.902344 5.671875 116.523438 5.542969 C 117.460938 5.367188 118.386719 5.574219 119.207031 6.039062 Z M 119.207031 6.039062 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 67.945312 6.109375 C 67.96875 6.136719 67.96875 6.136719 67.96875 6.1875 C 67.96875 6.210938 67.96875 6.234375 67.964844 6.257812 C 67.964844 6.285156 67.964844 6.3125 67.964844 6.339844 C 67.960938 6.367188 67.960938 6.398438 67.960938 6.425781 C 67.960938 6.457031 67.957031 6.484375 67.957031 6.515625 C 67.941406 6.863281 67.917969 7.207031 67.894531 7.554688 C 67.59375 7.554688 67.292969 7.554688 66.984375 7.554688 C 66.921875 7.3125 66.863281 7.070312 66.808594 6.828125 C 66.804688 6.796875 66.796875 6.769531 66.789062 6.742188 C 66.785156 6.714844 66.777344 6.6875 66.773438 6.660156 C 66.765625 6.632812 66.761719 6.609375 66.753906 6.585938 C 66.742188 6.519531 66.742188 6.519531 66.742188 6.425781 C 66.707031 6.414062 66.667969 6.402344 66.628906 6.390625 C 66.605469 6.386719 66.585938 6.378906 66.5625 6.371094 C 66.355469 6.320312 66.15625 6.296875 65.941406 6.296875 C 65.917969 6.296875 65.894531 6.296875 65.871094 6.296875 C 65.5625 6.300781 65.296875 6.351562 65.0625 6.566406 C 64.894531 6.742188 64.859375 6.90625 64.863281 7.148438 C 64.867188 7.285156 64.890625 7.390625 64.96875 7.507812 C 64.976562 7.519531 64.984375 7.535156 64.996094 7.550781 C 65.261719 7.921875 65.914062 8.0625 66.328125 8.179688 C 67.054688 8.390625 67.703125 8.726562 68.089844 9.40625 C 68.214844 9.648438 68.289062 9.90625 68.304688 10.175781 C 68.304688 10.199219 68.304688 10.21875 68.308594 10.242188 C 68.324219 10.753906 68.15625 11.1875 67.824219 11.574219 C 67.808594 11.589844 67.796875 11.605469 67.78125 11.621094 C 67.28125 12.164062 66.515625 12.347656 65.808594 12.390625 C 65.144531 12.414062 64.535156 12.34375 63.910156 12.117188 C 63.886719 12.109375 63.886719 12.109375 63.859375 12.097656 C 63.675781 12.03125 63.507812 11.929688 63.335938 11.835938 C 63.335938 11.632812 63.335938 11.429688 63.335938 11.226562 C 63.335938 11.132812 63.335938 11.039062 63.335938 10.945312 C 63.332031 10.851562 63.332031 10.761719 63.332031 10.671875 C 63.332031 10.636719 63.332031 10.601562 63.332031 10.566406 C 63.332031 10.515625 63.332031 10.46875 63.332031 10.421875 C 63.332031 10.390625 63.332031 10.363281 63.332031 10.335938 C 63.335938 10.273438 63.335938 10.273438 63.359375 10.25 C 63.421875 10.246094 63.484375 10.246094 63.550781 10.246094 C 63.570312 10.246094 63.585938 10.246094 63.605469 10.246094 C 63.648438 10.246094 63.6875 10.246094 63.726562 10.246094 C 63.789062 10.246094 63.851562 10.246094 63.914062 10.246094 C 63.953125 10.246094 63.992188 10.246094 64.03125 10.246094 C 64.050781 10.246094 64.066406 10.246094 64.085938 10.246094 C 64.21875 10.246094 64.21875 10.246094 64.273438 10.273438 C 64.285156 10.316406 64.285156 10.316406 64.296875 10.375 C 64.300781 10.394531 64.304688 10.414062 64.308594 10.4375 C 64.316406 10.460938 64.320312 10.484375 64.324219 10.507812 C 64.328125 10.53125 64.332031 10.554688 64.339844 10.578125 C 64.347656 10.628906 64.359375 10.679688 64.367188 10.730469 C 64.382812 10.808594 64.398438 10.882812 64.414062 10.960938 C 64.421875 11.007812 64.433594 11.058594 64.441406 11.105469 C 64.445312 11.128906 64.453125 11.152344 64.457031 11.175781 C 64.476562 11.285156 64.492188 11.386719 64.488281 11.5 C 64.53125 11.511719 64.53125 11.511719 64.578125 11.519531 C 64.691406 11.546875 64.804688 11.574219 64.921875 11.605469 C 65.117188 11.648438 65.308594 11.648438 65.507812 11.652344 C 65.539062 11.652344 65.570312 11.652344 65.601562 11.652344 C 65.964844 11.652344 66.320312 11.59375 66.605469 11.359375 C 66.761719 11.199219 66.820312 11.003906 66.828125 10.789062 C 66.820312 10.566406 66.761719 10.382812 66.601562 10.226562 C 66.214844 9.933594 65.765625 9.789062 65.3125 9.640625 C 64.621094 9.414062 63.949219 9.125 63.59375 8.445312 C 63.378906 8 63.375 7.464844 63.53125 6.996094 C 63.761719 6.410156 64.183594 6.027344 64.753906 5.773438 C 65.792969 5.351562 66.988281 5.59375 67.945312 6.109375 Z M 67.945312 6.109375 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 105.941406 5.769531 C 105.960938 5.777344 105.976562 5.785156 105.996094 5.792969 C 106.1875 5.867188 106.351562 5.964844 106.535156 6.0625 C 106.511719 6.539062 106.488281 7.015625 106.464844 7.507812 C 106.164062 7.507812 105.863281 7.507812 105.550781 7.507812 C 105.445312 7.101562 105.445312 7.101562 105.410156 6.941406 C 105.40625 6.925781 105.402344 6.910156 105.398438 6.890625 C 105.386719 6.839844 105.375 6.789062 105.367188 6.738281 C 105.359375 6.703125 105.351562 6.667969 105.34375 6.632812 C 105.324219 6.546875 105.304688 6.460938 105.289062 6.375 C 105.234375 6.359375 105.183594 6.34375 105.128906 6.328125 C 105.097656 6.320312 105.070312 6.3125 105.039062 6.304688 C 104.859375 6.253906 104.6875 6.25 104.503906 6.25 C 104.464844 6.25 104.464844 6.25 104.421875 6.25 C 104.136719 6.246094 103.90625 6.3125 103.664062 6.464844 C 103.507812 6.621094 103.417969 6.816406 103.414062 7.042969 C 103.425781 7.25 103.492188 7.433594 103.632812 7.585938 C 103.976562 7.886719 104.484375 8.003906 104.910156 8.132812 C 105.628906 8.351562 106.285156 8.667969 106.667969 9.355469 C 106.878906 9.800781 106.9375 10.371094 106.785156 10.84375 C 106.554688 11.417969 106.144531 11.8125 105.585938 12.070312 C 104.601562 12.488281 103.335938 12.402344 102.359375 12.007812 C 102.203125 11.9375 102.046875 11.859375 101.902344 11.765625 C 101.894531 11.699219 101.894531 11.699219 101.894531 11.617188 C 101.894531 11.585938 101.894531 11.554688 101.890625 11.523438 C 101.890625 11.488281 101.890625 11.453125 101.890625 11.417969 C 101.890625 11.382812 101.890625 11.347656 101.890625 11.3125 C 101.890625 11.222656 101.886719 11.128906 101.886719 11.039062 C 101.886719 10.925781 101.886719 10.816406 101.882812 10.707031 C 101.882812 10.539062 101.882812 10.371094 101.878906 10.203125 C 102.1875 10.203125 102.496094 10.203125 102.816406 10.203125 C 102.871094 10.363281 102.871094 10.363281 102.886719 10.449219 C 102.890625 10.46875 102.894531 10.488281 102.898438 10.507812 C 102.902344 10.527344 102.90625 10.546875 102.910156 10.566406 C 102.914062 10.585938 102.917969 10.609375 102.921875 10.628906 C 102.933594 10.671875 102.941406 10.71875 102.949219 10.761719 C 102.964844 10.828125 102.976562 10.894531 102.988281 10.960938 C 103 11.003906 103.007812 11.046875 103.015625 11.089844 C 103.019531 11.109375 103.023438 11.132812 103.027344 11.152344 C 103.046875 11.246094 103.0625 11.332031 103.054688 11.429688 C 103.699219 11.59375 104.421875 11.726562 105.03125 11.386719 C 105.21875 11.265625 105.316406 11.125 105.375 10.914062 C 105.402344 10.691406 105.378906 10.496094 105.273438 10.292969 C 104.921875 9.867188 104.363281 9.730469 103.859375 9.5625 C 103.1875 9.339844 102.511719 9.058594 102.167969 8.398438 C 101.949219 7.929688 101.9375 7.414062 102.097656 6.929688 C 102.101562 6.90625 102.109375 6.886719 102.117188 6.863281 C 102.269531 6.417969 102.628906 6.066406 103.03125 5.847656 C 103.054688 5.832031 103.078125 5.820312 103.101562 5.808594 C 103.382812 5.65625 103.699219 5.574219 104.015625 5.535156 C 104.035156 5.53125 104.054688 5.527344 104.074219 5.527344 C 104.714844 5.449219 105.34375 5.535156 105.941406 5.769531 Z M 105.941406 5.769531 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 59.953125 3.921875 C 60.316406 3.921875 60.679688 3.921875 61.054688 3.921875 C 61.058594 4.292969 61.054688 4.667969 61.046875 5.039062 C 61.042969 5.066406 61.042969 5.066406 61.042969 5.09375 C 61.042969 5.144531 61.042969 5.195312 61.039062 5.246094 C 61.039062 5.277344 61.039062 5.304688 61.035156 5.335938 C 61.03125 5.472656 61.019531 5.613281 61.007812 5.75 C 61.53125 5.75 62.054688 5.75 62.59375 5.75 C 62.59375 6.035156 62.59375 6.320312 62.59375 6.617188 C 62.0625 6.617188 61.53125 6.617188 60.984375 6.617188 C 60.984375 7.128906 60.988281 7.644531 60.988281 8.160156 C 60.992188 8.398438 60.992188 8.636719 60.992188 8.875 C 60.992188 9.082031 60.992188 9.292969 60.996094 9.5 C 60.996094 9.609375 60.996094 9.71875 60.996094 9.832031 C 60.996094 9.933594 60.996094 10.039062 60.996094 10.140625 C 60.996094 10.179688 60.996094 10.21875 60.996094 10.253906 C 60.992188 10.765625 60.992188 10.765625 61.199219 11.210938 C 61.34375 11.347656 61.507812 11.40625 61.703125 11.40625 C 61.941406 11.371094 62.144531 11.289062 62.355469 11.175781 C 62.457031 11.125 62.457031 11.125 62.519531 11.117188 C 62.558594 11.140625 62.558594 11.140625 62.597656 11.183594 C 62.613281 11.195312 62.625 11.210938 62.640625 11.226562 C 62.652344 11.238281 62.667969 11.253906 62.683594 11.269531 C 62.695312 11.285156 62.710938 11.300781 62.726562 11.316406 C 62.761719 11.351562 62.796875 11.390625 62.832031 11.429688 C 62.785156 11.5625 62.707031 11.65625 62.617188 11.765625 C 62.605469 11.78125 62.59375 11.792969 62.578125 11.808594 C 62.375 12.03125 62.085938 12.183594 61.800781 12.269531 C 61.777344 12.277344 61.75 12.285156 61.726562 12.292969 C 61.511719 12.347656 61.296875 12.351562 61.078125 12.351562 C 61.046875 12.351562 61.019531 12.351562 60.988281 12.351562 C 60.523438 12.351562 60.085938 12.210938 59.730469 11.898438 C 59.542969 11.699219 59.425781 11.40625 59.375 11.140625 C 59.371094 11.117188 59.367188 11.097656 59.363281 11.074219 C 59.351562 10.988281 59.347656 10.902344 59.347656 10.8125 C 59.347656 10.792969 59.347656 10.777344 59.347656 10.757812 C 59.347656 10.695312 59.347656 10.636719 59.347656 10.578125 C 59.347656 10.535156 59.347656 10.492188 59.347656 10.449219 C 59.347656 10.332031 59.347656 10.214844 59.347656 10.097656 C 59.351562 9.972656 59.351562 9.851562 59.351562 9.730469 C 59.351562 9.496094 59.351562 9.265625 59.351562 9.035156 C 59.351562 8.769531 59.351562 8.507812 59.351562 8.242188 C 59.351562 7.703125 59.351562 7.160156 59.351562 6.617188 C 59.035156 6.617188 58.71875 6.617188 58.390625 6.617188 C 58.390625 6.371094 58.390625 6.125 58.390625 5.871094 C 58.914062 5.800781 58.914062 5.800781 59.449219 5.726562 C 59.480469 5.601562 59.515625 5.476562 59.550781 5.351562 C 59.574219 5.269531 59.59375 5.191406 59.617188 5.113281 C 59.652344 4.988281 59.6875 4.863281 59.722656 4.738281 C 59.75 4.640625 59.777344 4.539062 59.804688 4.4375 C 59.816406 4.398438 59.824219 4.359375 59.835938 4.324219 C 59.851562 4.269531 59.867188 4.214844 59.882812 4.160156 C 59.886719 4.144531 59.890625 4.128906 59.894531 4.113281 C 59.914062 4.046875 59.929688 3.984375 59.953125 3.921875 Z M 59.953125 3.921875 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 93.351562 5.554688 C 93.40625 5.59375 93.429688 5.617188 93.445312 5.679688 C 93.449219 5.75 93.445312 5.8125 93.441406 5.878906 C 93.441406 5.90625 93.441406 5.929688 93.441406 5.957031 C 93.4375 6.015625 93.4375 6.070312 93.433594 6.128906 C 93.429688 6.273438 93.425781 6.417969 93.421875 6.5625 C 93.417969 6.617188 93.417969 6.671875 93.417969 6.726562 C 93.402344 7.175781 93.40625 7.625 93.40625 8.074219 C 93.40625 8.195312 93.40625 8.3125 93.40625 8.429688 C 93.40625 8.644531 93.40625 8.859375 93.40625 9.074219 C 93.40625 9.320312 93.40625 9.570312 93.40625 9.816406 C 93.40625 10.320312 93.40625 10.828125 93.40625 11.332031 C 93.425781 11.335938 93.449219 11.339844 93.46875 11.34375 C 93.542969 11.355469 93.613281 11.371094 93.6875 11.382812 C 93.734375 11.390625 93.785156 11.398438 93.832031 11.40625 C 93.859375 11.414062 93.890625 11.417969 93.921875 11.425781 C 93.949219 11.429688 93.976562 11.433594 94.003906 11.4375 C 94.070312 11.449219 94.136719 11.464844 94.199219 11.476562 C 94.199219 11.675781 94.199219 11.875 94.199219 12.078125 C 93.105469 12.078125 92.015625 12.078125 90.886719 12.078125 C 90.886719 11.878906 90.886719 11.679688 90.886719 11.476562 C 90.988281 11.457031 91.085938 11.433594 91.1875 11.414062 C 91.222656 11.40625 91.253906 11.402344 91.289062 11.394531 C 91.339844 11.382812 91.386719 11.375 91.4375 11.363281 C 91.480469 11.355469 91.480469 11.355469 91.527344 11.34375 C 91.601562 11.332031 91.675781 11.332031 91.753906 11.332031 C 91.753906 10.894531 91.753906 10.457031 91.753906 10.023438 C 91.753906 9.820312 91.753906 9.617188 91.753906 9.414062 C 91.753906 9.234375 91.753906 9.058594 91.753906 8.882812 C 91.753906 8.789062 91.753906 8.695312 91.753906 8.601562 C 91.753906 8.066406 91.746094 7.535156 91.726562 7 C 91.683594 6.996094 91.683594 6.996094 91.636719 6.988281 C 91.539062 6.976562 91.4375 6.964844 91.339844 6.953125 C 91.296875 6.945312 91.25 6.941406 91.207031 6.933594 C 91.144531 6.925781 91.082031 6.917969 91.019531 6.910156 C 90.988281 6.90625 90.988281 6.90625 90.957031 6.902344 C 90.820312 6.882812 90.820312 6.882812 90.792969 6.855469 C 90.789062 6.816406 90.789062 6.777344 90.789062 6.738281 C 90.789062 6.714844 90.789062 6.691406 90.789062 6.667969 C 90.789062 6.640625 90.789062 6.617188 90.789062 6.589844 C 90.789062 6.566406 90.789062 6.539062 90.789062 6.515625 C 90.792969 6.453125 90.792969 6.390625 90.792969 6.328125 C 90.96875 6.253906 91.148438 6.1875 91.328125 6.125 C 91.355469 6.117188 91.382812 6.105469 91.414062 6.097656 C 91.503906 6.066406 91.59375 6.03125 91.683594 6 C 91.808594 5.957031 91.929688 5.914062 92.054688 5.871094 C 92.070312 5.867188 92.085938 5.859375 92.101562 5.855469 C 92.285156 5.792969 92.46875 5.726562 92.652344 5.660156 C 92.667969 5.652344 92.6875 5.644531 92.703125 5.640625 C 92.78125 5.609375 92.859375 5.582031 92.9375 5.554688 C 92.976562 5.539062 92.976562 5.539062 93.019531 5.523438 C 93.050781 5.511719 93.050781 5.511719 93.082031 5.5 C 93.1875 5.476562 93.261719 5.503906 93.351562 5.554688 Z M 93.351562 5.554688 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 42.214844 5.652344 C 42.214844 7.542969 42.214844 9.433594 42.214844 11.378906 C 42.535156 11.441406 42.535156 11.441406 42.863281 11.5 C 42.917969 11.515625 42.976562 11.53125 43.03125 11.550781 C 43.03125 11.738281 43.03125 11.929688 43.03125 12.125 C 41.929688 12.125 40.832031 12.125 39.695312 12.125 C 39.695312 11.9375 39.695312 11.746094 39.695312 11.550781 C 39.875 11.5 40.054688 11.460938 40.234375 11.425781 C 40.265625 11.417969 40.265625 11.417969 40.296875 11.410156 C 40.316406 11.40625 40.335938 11.402344 40.355469 11.398438 C 40.375 11.394531 40.394531 11.390625 40.410156 11.386719 C 40.46875 11.378906 40.523438 11.378906 40.585938 11.378906 C 40.582031 10.886719 40.578125 10.390625 40.574219 9.898438 C 40.574219 9.667969 40.574219 9.4375 40.570312 9.207031 C 40.570312 9.007812 40.570312 8.808594 40.570312 8.605469 C 40.566406 8.5 40.566406 8.394531 40.566406 8.289062 C 40.566406 8.191406 40.566406 8.089844 40.566406 7.988281 C 40.566406 7.953125 40.566406 7.917969 40.566406 7.878906 C 40.5625 7.683594 40.558594 7.488281 40.550781 7.292969 C 40.546875 7.273438 40.546875 7.253906 40.546875 7.234375 C 40.542969 7.140625 40.542969 7.140625 40.511719 7.050781 C 40.445312 7.035156 40.378906 7.027344 40.308594 7.019531 C 40.289062 7.015625 40.269531 7.011719 40.25 7.011719 C 40.183594 7.003906 40.121094 6.996094 40.054688 6.988281 C 40.011719 6.980469 39.96875 6.976562 39.921875 6.96875 C 39.816406 6.957031 39.707031 6.941406 39.601562 6.929688 C 39.601562 6.746094 39.601562 6.5625 39.601562 6.375 C 39.964844 6.242188 40.328125 6.109375 40.695312 5.980469 C 40.777344 5.953125 40.859375 5.921875 40.945312 5.894531 C 41 5.875 41.054688 5.855469 41.109375 5.835938 C 41.246094 5.789062 41.386719 5.738281 41.523438 5.6875 C 41.550781 5.675781 41.578125 5.667969 41.605469 5.65625 C 41.660156 5.636719 41.710938 5.617188 41.761719 5.597656 C 41.785156 5.589844 41.808594 5.578125 41.835938 5.570312 C 41.863281 5.558594 41.863281 5.558594 41.894531 5.546875 C 42.027344 5.515625 42.09375 5.585938 42.214844 5.652344 Z M 42.214844 5.652344 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 8.640625 9.261719 C 8.972656 9.519531 9.191406 9.859375 9.277344 10.273438 C 9.328125 10.675781 9.265625 11.089844 9.019531 11.421875 C 8.734375 11.769531 8.371094 12.007812 7.917969 12.058594 C 7.476562 12.09375 7.078125 11.957031 6.742188 11.667969 C 6.71875 11.648438 6.71875 11.648438 6.695312 11.628906 C 6.421875 11.378906 6.261719 10.992188 6.234375 10.628906 C 6.226562 10.179688 6.355469 9.789062 6.664062 9.457031 C 7.191406 8.921875 8.019531 8.84375 8.640625 9.261719 Z M 8.640625 9.261719 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 2.855469 4.089844 C 2.941406 4.15625 3.019531 4.230469 3.097656 4.308594 C 3.113281 4.324219 3.128906 4.339844 3.148438 4.359375 C 3.414062 4.640625 3.542969 5.027344 3.539062 5.410156 C 3.519531 5.851562 3.332031 6.21875 3.015625 6.527344 C 2.707031 6.792969 2.304688 6.921875 1.898438 6.898438 C 1.578125 6.871094 1.308594 6.769531 1.054688 6.570312 C 1.03125 6.546875 1.03125 6.546875 1.003906 6.527344 C 0.699219 6.277344 0.527344 5.898438 0.484375 5.511719 C 0.453125 5.121094 0.558594 4.730469 0.804688 4.425781 C 1.003906 4.191406 1.226562 4.03125 1.511719 3.921875 C 1.53125 3.914062 1.550781 3.90625 1.570312 3.898438 C 1.988281 3.757812 2.496094 3.84375 2.855469 4.089844 Z M 2.855469 4.089844 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 2.960938 11.683594 C 3.269531 11.949219 3.492188 12.316406 3.53125 12.726562 C 3.558594 13.152344 3.449219 13.550781 3.171875 13.878906 C 2.875 14.203125 2.519531 14.375 2.082031 14.417969 C 1.671875 14.433594 1.28125 14.28125 0.972656 14.011719 C 0.660156 13.714844 0.488281 13.324219 0.476562 12.890625 C 0.480469 12.53125 0.59375 12.214844 0.816406 11.933594 C 0.828125 11.917969 0.839844 11.902344 0.851562 11.882812 C 1.078125 11.597656 1.433594 11.421875 1.785156 11.363281 C 2.207031 11.316406 2.628906 11.417969 2.960938 11.683594 Z M 2.960938 11.683594 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 14.449219 4.167969 C 14.507812 4.222656 14.5625 4.273438 14.617188 4.332031 C 14.628906 4.34375 14.640625 4.355469 14.65625 4.367188 C 14.914062 4.632812 15.015625 5.023438 15.03125 5.378906 C 15.019531 5.734375 14.902344 6.046875 14.6875 6.328125 C 14.675781 6.34375 14.664062 6.359375 14.652344 6.378906 C 14.410156 6.679688 14.042969 6.851562 13.664062 6.898438 C 13.242188 6.925781 12.84375 6.816406 12.523438 6.535156 C 12.484375 6.5 12.445312 6.460938 12.40625 6.425781 C 12.394531 6.410156 12.378906 6.394531 12.363281 6.378906 C 12.085938 6.089844 11.988281 5.707031 11.992188 5.316406 C 12.003906 4.914062 12.167969 4.53125 12.457031 4.25 C 13.023438 3.75 13.847656 3.714844 14.449219 4.167969 Z M 14.449219 4.167969 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 42.046875 2.648438 C 42.253906 2.816406 42.375 3.03125 42.40625 3.296875 C 42.433594 3.558594 42.351562 3.808594 42.191406 4.019531 C 42.007812 4.214844 41.785156 4.351562 41.507812 4.363281 C 41.46875 4.363281 41.429688 4.363281 41.390625 4.363281 C 41.371094 4.363281 41.351562 4.363281 41.332031 4.363281 C 41.058594 4.355469 40.832031 4.273438 40.625 4.089844 C 40.476562 3.933594 40.359375 3.734375 40.34375 3.511719 C 40.34375 3.496094 40.339844 3.480469 40.339844 3.460938 C 40.328125 3.230469 40.390625 2.992188 40.542969 2.8125 C 40.554688 2.796875 40.570312 2.78125 40.585938 2.765625 C 40.597656 2.75 40.613281 2.734375 40.632812 2.714844 C 41.019531 2.339844 41.621094 2.332031 42.046875 2.648438 Z M 42.046875 2.648438 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;" d="M 93.210938 2.566406 C 93.453125 2.757812 93.570312 2.96875 93.609375 3.273438 C 93.621094 3.53125 93.550781 3.773438 93.378906 3.972656 C 93.367188 3.988281 93.351562 4.003906 93.335938 4.019531 C 93.316406 4.039062 93.316406 4.039062 93.296875 4.058594 C 93.066406 4.28125 92.78125 4.316406 92.476562 4.3125 C 92.355469 4.308594 92.25 4.285156 92.136719 4.234375 C 92.117188 4.226562 92.101562 4.21875 92.082031 4.210938 C 91.871094 4.105469 91.703125 3.9375 91.605469 3.722656 C 91.515625 3.449219 91.515625 3.171875 91.632812 2.90625 C 91.773438 2.652344 92 2.484375 92.277344 2.402344 C 92.605469 2.324219 92.933594 2.375 93.210938 2.566406 Z M 93.210938 2.566406 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 8.320312 5.960938 C 8.539062 6.117188 8.664062 6.320312 8.726562 6.582031 C 8.769531 6.839844 8.710938 7.089844 8.574219 7.3125 C 8.410156 7.535156 8.207031 7.65625 7.945312 7.722656 C 7.621094 7.753906 7.355469 7.6875 7.105469 7.484375 C 6.921875 7.3125 6.8125 7.078125 6.792969 6.832031 C 6.789062 6.535156 6.871094 6.28125 7.078125 6.0625 C 7.4375 5.738281 7.914062 5.710938 8.320312 5.960938 Z M 8.320312 5.960938 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.431373%,73.725492%,19.607843%);fill-opacity:1;" d="M 14.09375 0.820312 C 14.289062 0.96875 14.421875 1.179688 14.472656 1.417969 C 14.5 1.714844 14.464844 1.980469 14.273438 2.214844 C 14.082031 2.421875 13.890625 2.558594 13.605469 2.582031 C 13.320312 2.585938 13.078125 2.535156 12.863281 2.332031 C 12.660156 2.128906 12.550781 1.910156 12.542969 1.621094 C 12.546875 1.332031 12.644531 1.117188 12.839844 0.910156 C 13.199219 0.574219 13.6875 0.5625 14.09375 0.820312 Z M 14.09375 0.820312 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 2.574219 0.808594 C 2.769531 0.972656 2.925781 1.164062 2.976562 1.417969 C 2.996094 1.71875 2.972656 1.976562 2.777344 2.214844 C 2.585938 2.421875 2.394531 2.558594 2.109375 2.582031 C 1.824219 2.585938 1.582031 2.53125 1.367188 2.332031 C 1.226562 2.195312 1.136719 2.066406 1.078125 1.875 C 1.074219 1.863281 1.070312 1.847656 1.066406 1.832031 C 1.015625 1.570312 1.054688 1.3125 1.195312 1.089844 C 1.515625 0.644531 2.101562 0.484375 2.574219 0.808594 Z M 2.574219 0.808594 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 2.550781 8.316406 C 2.582031 8.34375 2.609375 8.371094 2.640625 8.398438 C 2.65625 8.414062 2.671875 8.429688 2.691406 8.445312 C 2.878906 8.640625 2.960938 8.847656 2.964844 9.121094 C 2.960938 9.398438 2.882812 9.613281 2.6875 9.816406 C 2.5 9.996094 2.257812 10.109375 1.992188 10.105469 C 1.695312 10.085938 1.449219 9.972656 1.246094 9.753906 C 1.074219 9.535156 1.003906 9.277344 1.03125 9 C 1.089844 8.710938 1.214844 8.484375 1.453125 8.3125 C 1.789062 8.105469 2.222656 8.085938 2.550781 8.316406 Z M 2.550781 8.316406 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 14.058594 8.34375 C 14.269531 8.496094 14.425781 8.714844 14.472656 8.972656 C 14.496094 9.300781 14.441406 9.542969 14.238281 9.804688 C 14.148438 9.90625 14.042969 9.972656 13.921875 10.03125 C 13.894531 10.046875 13.894531 10.046875 13.867188 10.058594 C 13.660156 10.144531 13.386719 10.136719 13.175781 10.066406 C 12.929688 9.960938 12.714844 9.769531 12.613281 9.519531 C 12.601562 9.484375 12.585938 9.445312 12.574219 9.40625 C 12.570312 9.390625 12.566406 9.378906 12.5625 9.363281 C 12.511719 9.109375 12.550781 8.855469 12.679688 8.632812 C 12.824219 8.421875 13.003906 8.277344 13.246094 8.203125 C 13.261719 8.199219 13.277344 8.195312 13.292969 8.191406 C 13.570312 8.136719 13.820312 8.195312 14.058594 8.34375 Z M 14.058594 8.34375 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 8.375 13.523438 C 8.605469 13.730469 8.71875 13.984375 8.742188 14.289062 C 8.734375 14.554688 8.621094 14.789062 8.445312 14.984375 C 8.25 15.164062 7.996094 15.25 7.734375 15.253906 C 7.46875 15.242188 7.25 15.136719 7.0625 14.953125 C 6.863281 14.730469 6.789062 14.488281 6.792969 14.195312 C 6.832031 13.894531 6.964844 13.664062 7.199219 13.472656 C 7.582031 13.230469 8.015625 13.25 8.375 13.523438 Z M 8.375 13.523438 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 14.027344 12.066406 C 14.25 12.234375 14.421875 12.449219 14.472656 12.726562 C 14.492188 13.019531 14.464844 13.269531 14.273438 13.5 C 14.089844 13.699219 13.886719 13.84375 13.609375 13.863281 C 13.3125 13.867188 13.058594 13.800781 12.832031 13.589844 C 12.730469 13.480469 12.65625 13.371094 12.601562 13.234375 C 12.589844 13.207031 12.582031 13.183594 12.570312 13.15625 C 12.519531 12.886719 12.539062 12.625 12.679688 12.386719 C 12.984375 11.945312 13.558594 11.765625 14.027344 12.066406 Z M 14.027344 12.066406 "/>
+<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;" d="M 8.269531 2.203125 C 8.492188 2.371094 8.652344 2.574219 8.703125 2.855469 C 8.738281 3.113281 8.695312 3.371094 8.535156 3.582031 C 8.355469 3.796875 8.136719 3.949219 7.851562 3.976562 C 7.539062 3.988281 7.289062 3.894531 7.054688 3.679688 C 6.851562 3.449219 6.796875 3.222656 6.808594 2.914062 C 6.824219 2.671875 6.929688 2.480469 7.105469 2.308594 C 7.445312 2.039062 7.886719 1.964844 8.269531 2.203125 Z M 8.269531 2.203125 "/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/features/citations.svg b/app/components/base/icons/assets/vender/features/citations.svg
new file mode 100644
index 0000000..4ee12a7
--- /dev/null
+++ b/app/components/base/icons/assets/vender/features/citations.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M1 12C1 5.92487 5.92487 1 12 1C18.0751 1 23 5.92487 23 12C23 18.0751 18.0751 23 12 23C5.92487 23 1 18.0751 1 12ZM7 11.9702V14.958H11.0356V11.2339H8.8125C8.78418 10.8185 8.85498 10.4173 9.0249 10.0303C9.35531 9.29395 10.002 8.77474 10.9648 8.47266V7C9.67155 7.25488 8.68506 7.79297 8.00537 8.61426C7.33512 9.43555 7 10.5542 7 11.9702ZM15.0391 10.0586C15.3695 9.29395 16.0114 8.7653 16.9648 8.47266V7C15.7093 7.25488 14.7323 7.78825 14.0337 8.6001C13.3446 9.41195 13 10.5353 13 11.9702V14.958H17.0356V11.2339H14.8125C14.7747 10.8563 14.8503 10.4645 15.0391 10.0586Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/features/content-moderation.svg b/app/components/base/icons/assets/vender/features/content-moderation.svg
new file mode 100644
index 0000000..e84dd4c
--- /dev/null
+++ b/app/components/base/icons/assets/vender/features/content-moderation.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.16146 3H16.8385C17.3657 2.99998 17.8205 2.99997 18.195 3.03057C18.5904 3.06287 18.9836 3.13419 19.362 3.32698C19.9265 3.6146 20.3854 4.07354 20.673 4.63803C20.8658 5.01641 20.9371 5.40963 20.9694 5.80497C21 6.17954 21 6.6343 21 7.16144V16.8386C21 17.3657 21 17.8205 20.9694 18.195C20.9371 18.5904 20.8658 18.9836 20.673 19.362C20.3854 19.9265 19.9265 20.3854 19.362 20.673C18.9836 20.8658 18.5904 20.9371 18.195 20.9694C17.8205 21 17.3657 21 16.8386 21H7.16144C6.6343 21 6.17954 21 5.80497 20.9694C5.40963 20.9371 5.01641 20.8658 4.63803 20.673C4.07354 20.3854 3.6146 19.9265 3.32698 19.362C3.13419 18.9836 3.06287 18.5904 3.03057 18.195C2.99997 17.8205 2.99998 17.3657 3 16.8386V7.16145C2.99998 6.63432 2.99997 6.17954 3.03057 5.80497C3.06287 5.40963 3.13419 5.01641 3.32698 4.63803C3.6146 4.07354 4.07354 3.6146 4.63803 3.32698C5.01641 3.13419 5.40963 3.06287 5.80497 3.03057C6.17954 2.99997 6.63432 2.99998 7.16146 3ZM17 9C17 8.44772 16.5523 8 16 8C15.4477 8 15 8.44772 15 9V15C15 15.5523 15.4477 16 16 16C16.5523 16 17 15.5523 17 15V9ZM9 12C9 12.5523 8.55229 13 8 13C7.44772 13 7 12.5523 7 12C7 11.4477 7.44772 11 8 11C8.55229 11 9 11.4477 9 12ZM12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/features/document.svg b/app/components/base/icons/assets/vender/features/document.svg
new file mode 100644
index 0000000..dca0e91
--- /dev/null
+++ b/app/components/base/icons/assets/vender/features/document.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+<path d="M20 22H4C3.44772 22 3 21.5523 3 21V3C3 2.44772 3.44772 2 4 2H20C20.5523 2 21 2.44772 21 3V21C21 21.5523 20.5523 22 20 22ZM7 6V10H11V6H7ZM7 12V14H17V12H7ZM7 16V18H17V16H7ZM13 7V9H17V7H13Z"></path>
+</svg>
\ No newline at end of file
diff --git a/app/components/base/icons/assets/vender/features/folder-upload.svg b/app/components/base/icons/assets/vender/features/folder-upload.svg
new file mode 100644
index 0000000..b94ea94
--- /dev/null
+++ b/app/components/base/icons/assets/vender/features/folder-upload.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2 6C2 4.34315 3.34315 3 5 3H8.92963C9.93269 3 10.8694 3.5013 11.4258 4.3359L12.5352 6H19C20.6569 6 22 7.34315 22 9V17C22 18.6569 20.6569 20 19 20H13V15.4142L13.7929 16.2071C14.1834 16.5976 14.8166 16.5976 15.2071 16.2071C15.5976 15.8166 15.5976 15.1834 15.2071 14.7929L12.7071 12.2929C12.3166 11.9024 11.6834 11.9024 11.2929 12.2929L8.79289 14.7929C8.40237 15.1834 8.40237 15.8166 8.79289 16.2071C9.18342 16.5976 9.81658 16.5976 10.2071 16.2071L11 15.4142V20H5C3.34315 20 2 18.6569 2 17V6Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/features/love-message.svg b/app/components/base/icons/assets/vender/features/love-message.svg
new file mode 100644
index 0000000..9dc0f6f
--- /dev/null
+++ b/app/components/base/icons/assets/vender/features/love-message.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M22 11.3333C22 6.73833 17.5142 3 12 3C6.48583 3 2 6.73833 2 11.3333C2 15.9283 6.48583 19.6667 11.9825 19.6667C12.8404 19.6814 13.6965 19.5839 14.5292 19.3767L19.1858 21.2725C19.2857 21.3127 19.3924 21.3333 19.5 21.3333C19.6175 21.3334 19.7337 21.3086 19.8409 21.2606C19.9481 21.2126 20.044 21.1425 20.1222 21.0548C20.2004 20.9672 20.2592 20.8639 20.2948 20.7519C20.3303 20.64 20.3417 20.5217 20.3283 20.405L19.8742 16.4733C21.1944 15.0821 21.9518 13.2507 22 11.3333ZM15.3917 12.0533L12.0317 15.47C12.0231 15.4784 12.0116 15.4831 11.9996 15.4831C11.9876 15.4831 11.9761 15.4784 11.9675 15.47L8.60917 12.0533C8.18149 11.6398 7.91983 11.0841 7.87347 10.491C7.82712 9.89789 7.99927 9.30831 8.3575 8.83333C8.57837 8.56064 8.85996 8.3434 9.17978 8.19896C9.49959 8.05451 9.84875 7.98687 10.1994 8.00145C10.55 8.01603 10.8923 8.11241 11.199 8.2829C11.5058 8.45339 11.7684 8.69325 11.9658 8.98333C11.9695 8.98883 11.9744 8.99335 11.9803 8.99647C11.9861 8.99959 11.9926 9.00122 11.9992 9.00122C12.0058 9.00122 12.0123 8.99959 12.0181 8.99647C12.0239 8.99335 12.0289 8.98883 12.0325 8.98333C12.23 8.69325 12.4926 8.45339 12.7993 8.2829C13.106 8.11241 13.4484 8.01603 13.799 8.00145C14.1496 7.98687 14.4987 8.05451 14.8186 8.19896C15.1384 8.3434 15.42 8.56064 15.6408 8.83333C15.9997 9.30788 16.1725 9.89736 16.1266 10.4906C16.0807 11.0838 15.8193 11.6397 15.3917 12.0533Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/features/message-fast.svg b/app/components/base/icons/assets/vender/features/message-fast.svg
new file mode 100644
index 0000000..66a206f
--- /dev/null
+++ b/app/components/base/icons/assets/vender/features/message-fast.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M16.2414 2H7.7588C6.95383 1.99999 6.28946 1.99998 5.74827 2.04419C5.18617 2.09012 4.66947 2.18868 4.18413 2.43598C3.43149 2.81947 2.81956 3.43139 2.43607 4.18404C2.18878 4.66937 2.09022 5.18608 2.04429 5.74818C2.00007 6.28937 2.00008 6.95373 2.0001 7.7587L2.00005 14.1376C1.99962 14.933 1.9993 15.5236 2.13639 16.0353C2.50626 17.4156 3.58445 18.4938 4.96482 18.8637C5.27229 18.9461 5.60829 18.9789 6.0001 18.9918L6.00009 20.371C6.00005 20.6062 6 20.846 6.01785 21.0425C6.03492 21.2305 6.08012 21.5852 6.32778 21.8955C6.61276 22.2525 7.0449 22.4602 7.50172 22.4597C7.8987 22.4593 8.20394 22.273 8.36137 22.1689C8.52597 22.06 8.7132 21.9102 8.89688 21.7632L11.31 19.8327C11.8286 19.4178 11.9826 19.3007 12.1425 19.219C12.303 19.137 12.4738 19.0771 12.6504 19.0408C12.8263 19.0047 13.0197 19 13.6838 19H16.2414C17.0464 19 17.7107 19 18.2519 18.9558C18.814 18.9099 19.3307 18.8113 19.8161 18.564C20.5687 18.1805 21.1806 17.5686 21.5641 16.816C21.8114 16.3306 21.91 15.8139 21.9559 15.2518C22.0001 14.7106 22.0001 14.0463 22.0001 13.2413V7.75868C22.0001 6.95372 22.0001 6.28936 21.9559 5.74818C21.91 5.18608 21.8114 4.66937 21.5641 4.18404C21.1806 3.43139 20.5687 2.81947 19.8161 2.43598C19.3307 2.18868 18.814 2.09012 18.2519 2.04419C17.7107 1.99998 17.0464 1.99999 16.2414 2ZM12.681 5.5349C12.8938 5.61898 13.0218 5.83714 12.9916 6.06386L12.5688 9.23501L14.48 9.23501C14.5899 9.23498 14.7038 9.23496 14.7979 9.24356C14.8905 9.25203 15.0589 9.27446 15.2095 9.39066C15.3851 9.52617 15.4913 9.73269 15.4996 9.95432C15.5066 10.1444 15.427 10.2945 15.38 10.3747C15.3324 10.4563 15.2661 10.549 15.2022 10.6384L11.9072 15.2514C11.7743 15.4375 11.5317 15.5092 11.319 15.4251C11.1063 15.341 10.9782 15.1229 11.0084 14.8961L11.4312 11.725L9.52004 11.725C9.41011 11.725 9.29618 11.725 9.20206 11.7164C9.10948 11.708 8.94106 11.6855 8.79051 11.5693C8.61493 11.4338 8.50866 11.2273 8.50044 11.0057C8.49339 10.8156 8.57303 10.6655 8.61996 10.5853C8.66766 10.5037 8.7339 10.411 8.79781 10.3216L12.0928 5.70858C12.2257 5.52246 12.4683 5.45083 12.681 5.5349Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/features/microphone-01.svg b/app/components/base/icons/assets/vender/features/microphone-01.svg
new file mode 100644
index 0000000..ebd4115
--- /dev/null
+++ b/app/components/base/icons/assets/vender/features/microphone-01.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12 1C9.79086 1 8 2.79086 8 5V12C8 14.2091 9.79086 16 12 16C14.2091 16 16 14.2091 16 12V5C16 2.79086 14.2091 1 12 1Z" fill="black"/>
+<path d="M6 10C6 9.44771 5.55228 9 5 9C4.44772 9 4 9.44771 4 10V12C4 16.0803 7.05466 19.4471 11.0019 19.9383C11.0006 19.9587 11 19.9793 11 20V21H8C7.44772 21 7 21.4477 7 22C7 22.5523 7.44772 23 8 23H16C16.5523 23 17 22.5523 17 22C17 21.4477 16.5523 21 16 21H13V20C13 19.9793 12.9994 19.9587 12.9981 19.9383C16.9453 19.4471 20 16.0803 20 12V10C20 9.44771 19.5523 9 19 9C18.4477 9 18 9.44771 18 10V12C18 15.3137 15.3137 18 12 18C8.68629 18 6 15.3137 6 12V10Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/features/text-to-audio.svg b/app/components/base/icons/assets/vender/features/text-to-audio.svg
new file mode 100644
index 0000000..89d2d40
--- /dev/null
+++ b/app/components/base/icons/assets/vender/features/text-to-audio.svg
@@ -0,0 +1,8 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1 5.02263C1 3.90973 1.90219 3.00754 3.01509 3.00754H9.06035C10.1733 3.00754 11.0754 3.90973 11.0754 5.02263C11.0754 5.57908 10.6243 6.03017 10.0679 6.03017C9.51144 6.03017 9.06035 5.57908 9.06035 5.02263H7.04526V12.0754C7.60171 12.0754 8.0528 12.5265 8.0528 13.083C8.0528 13.6394 7.60171 14.0905 7.04526 14.0905H5.03017C4.47372 14.0905 4.02263 13.6394 4.02263 13.083C4.02263 12.5265 4.47372 12.0754 5.03017 12.0754V5.02263H3.01509C3.01509 5.57908 2.56399 6.03017 2.00754 6.03017C1.45109 6.03017 1 5.57908 1 5.02263Z" fill="black"/>
+<path d="M19.9883 2.15888C19.8823 1.94704 19.58 1.94704 19.4741 2.15888C18.8148 3.47752 18.6898 3.6025 17.3712 4.26182C17.1593 4.36774 17.1593 4.67004 17.3712 4.77596C18.6898 5.43528 18.8148 5.56026 19.4741 6.8789C19.58 7.09074 19.8823 7.09074 19.9883 6.8789C20.6476 5.56026 20.7726 5.43528 22.0912 4.77596C22.303 4.67004 22.303 4.36774 22.0912 4.26182C20.7726 3.6025 20.6476 3.47752 19.9883 2.15888Z" fill="black"/>
+<path d="M14.4561 4.17977C14.3463 3.96019 14.033 3.96019 13.9232 4.17977C13.4339 5.15833 13.3178 5.27443 12.3393 5.76371C12.1197 5.8735 12.1197 6.18685 12.3393 6.29664C13.3178 6.78592 13.4339 6.90202 13.9232 7.88058C14.033 8.10016 14.3463 8.10016 14.4561 7.88058C14.9454 6.90202 15.0615 6.78592 16.0401 6.29664C16.2596 6.18685 16.2596 5.8735 16.0401 5.76371C15.0615 5.27443 14.9454 5.15833 14.4561 4.17977Z" fill="black"/>
+<path d="M4.78347 16.2645C4.67755 16.0527 4.37525 16.0526 4.26933 16.2645C3.61002 17.5831 3.48505 17.7081 2.16642 18.3674C1.95458 18.4733 1.95458 18.7756 2.16642 18.8815C3.48505 19.5408 3.61002 19.6658 4.26933 20.9844C4.37525 21.1963 4.67755 21.1963 4.78347 20.9844C5.44278 19.6658 5.56776 19.5408 6.88638 18.8815C7.09822 18.7756 7.09822 18.4733 6.88638 18.3674C5.56776 17.7081 5.44278 17.5831 4.78347 16.2645Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M21.1611 12.97C21.4558 12.7644 21.8613 12.8367 22.0668 13.1313C22.655 13.9746 23 15.0008 23 16.1056C23 17.2105 22.655 18.2367 22.0668 19.0799C21.8613 19.3745 21.4558 19.4468 21.1611 19.2413C20.8664 19.0357 20.7942 18.6302 20.9997 18.3355C21.4405 17.7036 21.699 16.9358 21.699 16.1056C21.699 15.2755 21.4405 14.5076 20.9997 13.8757C20.7942 13.581 20.8664 13.1755 21.1611 12.97Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M18.2666 10.0664C18.578 10.0419 18.8823 10.1679 19.0852 10.4054C19.2668 10.6181 19.2957 10.8739 19.3067 10.9981C19.319 11.1373 19.319 11.3102 19.319 11.4861C19.319 11.4942 19.319 11.5022 19.319 11.5103L19.319 20.7312C19.319 20.9071 19.319 21.0799 19.3067 21.2191C19.2957 21.3433 19.2668 21.5991 19.0852 21.8118C18.8823 22.0493 18.578 22.1754 18.2666 22.1509C17.9878 22.1289 17.7865 21.9684 17.6909 21.8884C17.5838 21.7987 17.4615 21.6764 17.3372 21.552L15.2607 19.4756C15.2004 19.4153 15.1702 19.3853 15.1474 19.3645L15.1457 19.3629L15.1433 19.3628C15.1124 19.3614 15.0699 19.3612 14.9847 19.3612L13.8338 19.3612C13.6696 19.3613 13.5097 19.3613 13.3743 19.3502C13.2256 19.3381 13.0502 19.3094 12.8736 19.2194C12.6288 19.0947 12.4297 18.8957 12.305 18.6509C12.215 18.4743 12.1864 18.2988 12.1742 18.1501C12.1632 18.0147 12.1632 17.8548 12.1632 17.6906L12.1632 14.5474C12.1632 14.5404 12.1632 14.5335 12.1632 14.5266C12.1632 14.3624 12.1632 14.2025 12.1742 14.0671C12.1864 13.9184 12.215 13.743 12.305 13.5664C12.4297 13.3216 12.6288 13.1225 12.8736 12.9978C13.0502 12.9078 13.2256 12.8792 13.3743 12.867C13.5097 12.856 13.6696 12.856 13.8338 12.856C13.8407 12.856 13.8476 12.856 13.8546 12.856H14.9847C15.0699 12.856 15.1124 12.8558 15.1433 12.8544L15.1457 12.8543L15.1474 12.8528C15.1702 12.8319 15.2004 12.8019 15.2607 12.7417L17.32 10.6823C17.3258 10.6766 17.3315 10.6709 17.3372 10.6652C17.4615 10.5408 17.5838 10.4185 17.6909 10.3288C17.7865 10.2488 17.9878 10.0883 18.2666 10.0664Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/features/virtual-assistant.svg b/app/components/base/icons/assets/vender/features/virtual-assistant.svg
new file mode 100644
index 0000000..f4b2101
--- /dev/null
+++ b/app/components/base/icons/assets/vender/features/virtual-assistant.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M21.1667 7.16667H18.6667V13C18.6667 13.663 18.4033 14.2989 17.9344 14.7678C17.4656 15.2366 16.8297 15.5 16.1667 15.5H11.5L8.5 18H14.095L17.9792 21.2367C18.0549 21.3004 18.151 21.3347 18.25 21.3333C18.311 21.3332 18.3713 21.3198 18.4267 21.2942C18.4984 21.2606 18.5591 21.2072 18.6016 21.1404C18.6441 21.0735 18.6667 20.9959 18.6667 20.9167V18H21.1667C21.3877 18 21.5996 17.9122 21.7559 17.7559C21.9122 17.5996 22 17.3877 22 17.1667V8C22 7.77899 21.9122 7.56703 21.7559 7.41074C21.5996 7.25446 21.3877 7.16667 21.1667 7.16667Z" fill="black"/>
+<path d="M16.1667 3H2.83333C2.61232 3 2.40036 3.0878 2.24408 3.24408C2.0878 3.40036 2 3.61232 2 3.83333V13C2 13.221 2.0878 13.433 2.24408 13.5893C2.40036 13.7455 2.61232 13.8333 2.83333 13.8333H5.33333V17.5833C5.33331 17.6626 5.35587 17.7402 5.39838 17.807C5.44089 17.8739 5.50158 17.9272 5.57333 17.9608C5.6287 17.9865 5.68897 17.9999 5.75 18C5.84753 18.0004 5.94204 17.9661 6.01667 17.9033L10.9008 13.8333H16.1667C16.3877 13.8333 16.5996 13.7455 16.7559 13.5893C16.9122 13.433 17 13.221 17 13V3.83333C17 3.61232 16.9122 3.40036 16.7559 3.24408C16.5996 3.0878 16.3877 3 16.1667 3Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/features/vision.svg b/app/components/base/icons/assets/vender/features/vision.svg
new file mode 100644
index 0000000..1c4c86c
--- /dev/null
+++ b/app/components/base/icons/assets/vender/features/vision.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M22.357 10.5831C19.7908 6.27233 15.952 3.99997 12.0002 4C8.04853 4.00003 4.20967 6.27243 1.64354 10.5832C1.12403 11.4559 1.12403 12.5442 1.64354 13.4169C4.20968 17.7277 8.04854 20 12.0003 20C15.952 20 19.7908 17.7276 22.357 13.4168C22.8765 12.5441 22.8765 11.4558 22.357 10.5831ZM11.5528 8.89443L10.7412 10.5176C10.6928 10.6144 10.6144 10.6928 10.5176 10.7412L8.89443 11.5528C8.5259 11.737 8.5259 12.263 8.89443 12.4472L10.5176 13.2588C10.6144 13.3072 10.6928 13.3856 10.7412 13.4824L11.5528 15.1056C11.737 15.4741 12.263 15.4741 12.4472 15.1056L13.2588 13.4824C13.3072 13.3856 13.3856 13.3072 13.4824 13.2588L15.1056 12.4472C15.4741 12.263 15.4741 11.737 15.1056 11.5528L13.4824 10.7412C13.3856 10.6928 13.3072 10.6144 13.2588 10.5176L12.4472 8.89443C12.263 8.5259 11.737 8.5259 11.5528 8.89443Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/alertsAndFeedback/alert-triangle.svg b/app/components/base/icons/assets/vender/line/alertsAndFeedback/alert-triangle.svg
new file mode 100644
index 0000000..05f15c9
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/alertsAndFeedback/alert-triangle.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="alert-triangle">
+<path id="Icon" d="M7.99977 5.33314V7.99981M7.99977 10.6665H8.00644M6.85977 1.90648L1.2131 11.3331C1.09668 11.5348 1.03508 11.7633 1.03443 11.9962C1.03378 12.229 1.0941 12.4579 1.20939 12.6602C1.32468 12.8624 1.49092 13.031 1.69157 13.149C1.89223 13.2671 2.1203 13.3306 2.3531 13.3331H13.6464C13.8792 13.3306 14.1073 13.2671 14.308 13.149C14.5086 13.031 14.6749 12.8624 14.7902 12.6602C14.9054 12.4579 14.9658 12.229 14.9651 11.9962C14.9645 11.7633 14.9029 11.5348 14.7864 11.3331L9.13977 1.90648C9.02092 1.71055 8.85358 1.54856 8.6539 1.43613C8.45422 1.32371 8.22893 1.26465 7.99977 1.26465C7.77061 1.26465 7.54532 1.32371 7.34564 1.43613C7.14596 1.54856 6.97862 1.71055 6.85977 1.90648Z" stroke="#F79009" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/alertsAndFeedback/thumbs-down.svg b/app/components/base/icons/assets/vender/line/alertsAndFeedback/thumbs-down.svg
new file mode 100644
index 0000000..5435445
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/alertsAndFeedback/thumbs-down.svg
@@ -0,0 +1,10 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon" clip-path="url(#clip0_17340_934)">
+<path id="Icon_2" d="M11.3333 1.33398V8.66732M14.6666 6.53398V3.46732C14.6666 2.72058 14.6666 2.34721 14.5213 2.062C14.3935 1.81111 14.1895 1.60714 13.9386 1.47931C13.6534 1.33398 13.28 1.33398 12.5333 1.33398H5.41196C4.43764 1.33398 3.95048 1.33398 3.55701 1.51227C3.21022 1.66941 2.91549 1.92227 2.70745 2.24113C2.4714 2.60291 2.39732 3.08441 2.24917 4.0474L1.90045 6.31407C1.70505 7.58419 1.60735 8.21926 1.79582 8.7134C1.96125 9.14711 2.27239 9.50978 2.6759 9.73923C3.13564 10.0007 3.77818 10.0007 5.06324 10.0007H5.59995C5.97332 10.0007 6.16001 10.0007 6.30261 10.0733C6.42806 10.1372 6.53004 10.2392 6.59396 10.3647C6.66662 10.5073 6.66662 10.6939 6.66662 11.0673V13.0234C6.66662 13.9313 7.40262 14.6673 8.31051 14.6673C8.52706 14.6673 8.7233 14.5398 8.81125 14.3419L11.0518 9.30077C11.1537 9.07148 11.2046 8.95684 11.2852 8.87278C11.3563 8.79847 11.4438 8.74165 11.5406 8.70678C11.6501 8.66732 11.7756 8.66732 12.0265 8.66732H12.5333C13.28 8.66732 13.6534 8.66732 13.9386 8.52199C14.1895 8.39416 14.3935 8.19019 14.5213 7.93931C14.6666 7.65409 14.6666 7.28072 14.6666 6.53398Z" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_17340_934">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/alertsAndFeedback/thumbs-up.svg b/app/components/base/icons/assets/vender/line/alertsAndFeedback/thumbs-up.svg
new file mode 100644
index 0000000..797213f
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/alertsAndFeedback/thumbs-up.svg
@@ -0,0 +1,10 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon" clip-path="url(#clip0_17340_931)">
+<path id="Icon_2" d="M4.66671 14.6673V7.33398M1.33337 8.66732V13.334C1.33337 14.0704 1.93033 14.6673 2.66671 14.6673H11.6175C12.6047 14.6673 13.4442 13.9471 13.5943 12.9714L14.3122 8.30477C14.4986 7.09325 13.5613 6.00065 12.3355 6.00065H10C9.63185 6.00065 9.33337 5.70217 9.33337 5.33398V2.97788C9.33337 2.06998 8.59738 1.33398 7.68948 1.33398C7.47293 1.33398 7.27669 1.46151 7.18875 1.6594L4.84267 6.93808C4.73567 7.17883 4.49692 7.33398 4.23346 7.33398H2.66671C1.93033 7.33398 1.33337 7.93094 1.33337 8.66732Z" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_17340_931">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/arrows/arrow-narrow-left.svg b/app/components/base/icons/assets/vender/line/arrows/arrow-narrow-left.svg
new file mode 100644
index 0000000..1e75ead
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/arrows/arrow-narrow-left.svg
@@ -0,0 +1,3 @@
+<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M13.3625 8H2.6958M2.6958 8L6.6958 12M2.6958 8L6.6958 4" stroke="#155EEF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/arrows/arrow-up-right.svg b/app/components/base/icons/assets/vender/line/arrows/arrow-up-right.svg
new file mode 100644
index 0000000..43a151c
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/arrows/arrow-up-right.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="arrow-up-right">
+<path id="Icon" d="M4.08325 9.91665L9.91659 4.08331M9.91659 4.08331H4.08325M9.91659 4.08331V9.91665" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/arrows/chevron-down-double.svg b/app/components/base/icons/assets/vender/line/arrows/chevron-down-double.svg
new file mode 100644
index 0000000..bb77f89
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/arrows/chevron-down-double.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="13" viewBox="0 0 12 13" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="chevron-down-double">
+<path id="Icon" d="M3.5 7L6 9.5L8.5 7M3.5 3.5L6 6L8.5 3.5" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/arrows/chevron-right.svg b/app/components/base/icons/assets/vender/line/arrows/chevron-right.svg
new file mode 100644
index 0000000..4a46879
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/arrows/chevron-right.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="chevron-right">
+<path id="Icon" d="M5.25 10.5L8.75 7L5.25 3.5" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/arrows/chevron-selector-vertical.svg b/app/components/base/icons/assets/vender/line/arrows/chevron-selector-vertical.svg
new file mode 100644
index 0000000..342d6bb
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/arrows/chevron-selector-vertical.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7 15L12 20L17 15M7 9L12 4L17 9" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/arrows/refresh-ccw-01.svg b/app/components/base/icons/assets/vender/line/arrows/refresh-ccw-01.svg
new file mode 100644
index 0000000..706c677
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/arrows/refresh-ccw-01.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2 10C2 10 4.00498 7.26822 5.63384 5.63824C7.26269 4.00827 9.5136 3 12 3C16.9706 3 21 7.02944 21 12C21 16.9706 16.9706 21 12 21C7.89691 21 4.43511 18.2543 3.35177 14.5M2 10V4M2 10H8" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/arrows/refresh-cw-05.svg b/app/components/base/icons/assets/vender/line/arrows/refresh-cw-05.svg
new file mode 100644
index 0000000..795077a
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/arrows/refresh-cw-05.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.69773 13.1783C7.29715 13.8879 9.20212 13.8494 10.8334 12.9075C13.5438 11.3427 14.4724 7.87704 12.9076 5.16672L12.7409 4.87804M3.09233 10.8335C1.52752 8.12314 2.45615 4.65746 5.16647 3.09265C6.7978 2.15081 8.70277 2.11227 10.3022 2.82185M1.66226 10.8892L3.48363 11.3773L3.97166 9.5559M12.0284 6.44393L12.5164 4.62256L14.3378 5.1106" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/arrows/reverse-left.svg b/app/components/base/icons/assets/vender/line/arrows/reverse-left.svg
new file mode 100644
index 0000000..34313b1
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/arrows/reverse-left.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon">
+<path id="Icon_2" d="M2.66699 4.66667H9.33366C11.5428 4.66667 13.3337 6.45753 13.3337 8.66667C13.3337 10.8758 11.5428 12.6667 9.33366 12.6667H2.66699M2.66699 4.66667L5.33366 2M2.66699 4.66667L5.33366 7.33333" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/communication/ai-text.svg b/app/components/base/icons/assets/vender/line/communication/ai-text.svg
new file mode 100644
index 0000000..709ede7
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/communication/ai-text.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="ai-text">
+<path id="Vector" d="M2.33301 10.5H4.08301M2.33301 7H5.24967M2.33301 3.5H11.6663M9.91634 5.83333L10.7913 7.875L12.833 8.75L10.7913 9.625L9.91634 11.6667L9.04134 9.625L6.99967 8.75L9.04134 7.875L9.91634 5.83333Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/communication/chat-bot-slim.svg b/app/components/base/icons/assets/vender/line/communication/chat-bot-slim.svg
new file mode 100644
index 0000000..daceae7
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/communication/chat-bot-slim.svg
@@ -0,0 +1,9 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="chat-bot">
+<g id="Vector">
+<path d="M13.0909 11.2727C14.0951 11.2727 14.9091 10.4587 14.9091 9.45455C14.9091 8.45039 14.0951 7.63636 13.0909 7.63636C12.0868 7.63636 11.2727 8.45039 11.2727 9.45455C11.2727 10.4587 12.0868 11.2727 13.0909 11.2727Z" fill="#D0D5DD"/>
+<path d="M20.3636 22.1818H7.63636C5.62727 22.1818 4 23.8091 4 25.8182V40.3636C4 42.3727 5.62727 44 7.63636 44H33.0909C35.1 44 36.7273 42.3727 36.7273 40.3636V25.8182M13.0909 15.9998V11.2727M13.0909 11.2727C14.0951 11.2727 14.9091 10.4587 14.9091 9.45455C14.9091 8.45039 14.0951 7.63636 13.0909 7.63636C12.0868 7.63636 11.2727 8.45039 11.2727 9.45455C11.2727 10.4587 12.0868 11.2727 13.0909 11.2727ZM27.6364 5.81818C27.6364 4.81455 28.4509 4 29.4545 4H42.1818C43.1855 4 44 4.81455 44 5.81818V14.9091C44 15.9127 43.1855 16.7273 42.1818 16.7273H33.0909L27.6364 20.3636V5.81818Z" stroke="#D0D5DD" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<path id="Vector_2" d="M15.7275 30.364C15.7275 31.3179 14.9542 32.0913 14.0002 32.0913C13.0463 32.0913 12.2729 31.3179 12.2729 30.364C12.2729 29.41 13.0463 28.6367 14.0002 28.6367C14.9542 28.6367 15.7275 29.41 15.7275 30.364ZM28.4548 30.364C28.4548 31.3179 27.6814 32.0913 26.7275 32.0913C25.7735 32.0913 25.0002 31.3179 25.0002 30.364C25.0002 29.41 25.7735 28.6367 26.7275 28.6367C27.6814 28.6367 28.4548 29.41 28.4548 30.364Z" fill="#D0D5DD" stroke="#D0D5DD" stroke-width="2"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/communication/chat-bot.svg b/app/components/base/icons/assets/vender/line/communication/chat-bot.svg
new file mode 100644
index 0000000..ef29114
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/communication/chat-bot.svg
@@ -0,0 +1,14 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon" clip-path="url(#clip0_3167_27725)">
+<path id="Vector" d="M5.93972 6.47002H2.2276C1.64161 6.47002 1.16699 6.94464 1.16699 7.53063V11.7731C1.16699 12.359 1.64161 12.8337 2.2276 12.8337H9.65184C10.2378 12.8337 10.7124 12.359 10.7124 11.7731V7.53063M3.81851 4.66693V3.2882M3.81851 3.2882C4.11139 3.2882 4.34881 3.05078 4.34881 2.7579C4.34881 2.46502 4.11139 2.2276 3.81851 2.2276C3.52563 2.2276 3.2882 2.46502 3.2882 2.7579C3.2882 3.05078 3.52563 3.2882 3.81851 3.2882ZM8.06093 1.6973C8.06093 1.40457 8.29851 1.16699 8.59123 1.16699H12.3034C12.5961 1.16699 12.8337 1.40457 12.8337 1.6973V4.34881C12.8337 4.64154 12.5961 4.87911 12.3034 4.87911H9.65184L8.06093 5.93972V1.6973Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<g id="Vector_2">
+<path d="M4.08354 9.65146C4.52286 9.65146 4.87899 9.29532 4.87899 8.856C4.87899 8.41668 4.52286 8.06055 4.08354 8.06055C3.64422 8.06055 3.28809 8.41668 3.28809 8.856C3.28809 9.29532 3.64422 9.65146 4.08354 9.65146Z" fill="#344054"/>
+<path d="M7.79566 9.65146C8.23498 9.65146 8.59112 9.29532 8.59112 8.856C8.59112 8.41668 8.23498 8.06055 7.79566 8.06055C7.35634 8.06055 7.00021 8.41668 7.00021 8.856C7.00021 9.29532 7.35634 9.65146 7.79566 9.65146Z" fill="#344054"/>
+</g>
+</g>
+<defs>
+<clipPath id="clip0_3167_27725">
+<rect width="14" height="14" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/communication/cute-robot.svg b/app/components/base/icons/assets/vender/line/communication/cute-robot.svg
new file mode 100644
index 0000000..8273dc8
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/communication/cute-robot.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="cute-robot">
+<path id="Vector" d="M6.99967 2.33366H4.08301C3.43868 2.33366 2.91634 2.85599 2.91634 3.50033V6.41699C2.91634 7.06134 3.43868 7.58366 4.08301 7.58366H9.91634C10.5607 7.58366 11.083 7.06134 11.083 6.41699V3.50033C11.083 2.85599 10.5607 2.33366 9.91634 2.33366H6.99967ZM6.99967 2.33366V1.16699M3.49967 8.75033L2.33301 9.91699M3.49967 8.75033C3.49967 10.6833 5.06668 12.2503 6.99967 12.2503C8.93267 12.2503 10.4997 10.6833 10.4997 8.75033M3.49967 8.75033V7.58366M10.4997 8.75033L11.6663 9.91699M10.4997 8.75033V7.58366M5.24967 4.66699V5.25033M8.74967 4.66699V5.25033" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/communication/message-check-remove.svg b/app/components/base/icons/assets/vender/line/communication/message-check-remove.svg
new file mode 100644
index 0000000..ea0c2d5
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/communication/message-check-remove.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="message-check-remove">
+<path id="Vector" d="M15.2 2.99994H7.8C6.11984 2.99994 5.27976 2.99994 4.63803 3.32693C4.07354 3.61455 3.6146 4.07349 3.32698 4.63797C3 5.27971 3 6.11979 3 7.79994V13.9999C3 14.9299 3 15.3949 3.10222 15.7764C3.37962 16.8117 4.18827 17.6203 5.22354 17.8977C5.60504 17.9999 6.07003 17.9999 7 17.9999V20.3354C7 20.8683 7 21.1347 7.10923 21.2716C7.20422 21.3906 7.34827 21.4598 7.50054 21.4596C7.67563 21.4594 7.88367 21.293 8.29976 20.9601L10.6852 19.0518C11.1725 18.6619 11.4162 18.467 11.6875 18.3284C11.9282 18.2054 12.1844 18.1155 12.4492 18.0612C12.7477 17.9999 13.0597 17.9999 13.6837 17.9999H16.2C17.8802 17.9999 18.7202 17.9999 19.362 17.673C19.9265 17.3853 20.3854 16.9264 20.673 16.3619C21 15.7202 21 14.8801 21 13.1999V8.79994M12.3333 13.4999L14 10.4999H10L11.6667 7.49994M19.2322 4.76771L21 2.99994M21 2.99994L22.7678 1.23218M21 2.99994L19.2322 1.23218M21 2.99994L22.7678 4.76771" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/communication/message-fast-plus.svg b/app/components/base/icons/assets/vender/line/communication/message-fast-plus.svg
new file mode 100644
index 0000000..4d399f0
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/communication/message-fast-plus.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M15.2 3H7.8C6.11984 3 5.27976 3 4.63803 3.32698C4.07354 3.6146 3.6146 4.07354 3.32698 4.63803C3 5.27976 3 6.11984 3 7.8V14C3 14.93 3 15.395 3.10222 15.7765C3.37962 16.8117 4.18827 17.6204 5.22354 17.8978C5.60504 18 6.07003 18 7 18V20.3355C7 20.8684 7 21.1348 7.10923 21.2716C7.20422 21.3906 7.34827 21.4599 7.50054 21.4597C7.67563 21.4595 7.88367 21.2931 8.29976 20.9602L10.6852 19.0518C11.1725 18.662 11.4162 18.4671 11.6875 18.3285C11.9282 18.2055 12.1844 18.1156 12.4492 18.0613C12.7477 18 13.0597 18 13.6837 18H16.2C17.8802 18 18.7202 18 19.362 17.673C19.9265 17.3854 20.3854 16.9265 20.673 16.362C21 15.7202 21 14.8802 21 13.2V8.8M12.3333 13.5L14 10.5H10L11.6667 7.5M21 5V3M21 3V1M21 3H19M21 3H23" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/development/artificial-brain.svg b/app/components/base/icons/assets/vender/line/development/artificial-brain.svg
new file mode 100644
index 0000000..f06d706
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/development/artificial-brain.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M17.4542 11.9996H11.9999V13.8177M17.4542 11.9996C17.4542 13.0037 18.2682 13.8177 19.2724 13.8177C20.2765 13.8177 21.0905 13.0037 21.0905 11.9996C21.0905 10.9955 20.2765 10.1815 19.2724 10.1815C18.2682 10.1815 17.4542 10.9955 17.4542 11.9996ZM6.54554 12.9087C5.318 12.9012 4.14258 12.4115 3.27293 11.5451M6.54554 12.9087C6.53904 13.471 6.71172 14.0207 7.03861 14.4783C7.36549 14.936 7.82958 15.2776 8.36365 15.4539M6.54554 12.9087C6.54223 12.5292 6.62185 12.1534 6.77888 11.808C6.9359 11.4625 7.16652 11.1556 7.45459 10.9086M3.27293 11.5451C2.8848 11.7842 2.56415 12.1184 2.34142 12.5161C2.1187 12.9139 2.00125 13.3619 2.00022 13.8177C1.99583 14.2518 2.10201 14.6799 2.30876 15.0616C2.51552 15.4433 2.81603 15.766 3.182 15.9995C3.00399 16.4639 2.91159 16.9567 2.90928 17.454C2.90333 18.0525 3.01683 18.6463 3.24315 19.2004C3.46946 19.7546 3.80404 20.258 4.2273 20.6813C4.65056 21.1045 5.154 21.4391 5.70815 21.6654C6.2623 21.8917 6.85603 22.0052 7.45458 21.9993C8.05314 22.0052 8.64686 21.8917 9.20101 21.6654C9.75516 21.4391 10.2586 21.1045 10.6819 20.6813C11.1051 20.258 11.4397 19.7546 11.666 19.2004C11.8923 18.6463 12.0058 18.0525 11.9999 17.454V16.5449H14.7271L16.1688 17.9867M3.27293 11.5451C2.44984 10.6912 1.9931 9.54938 2.00022 8.36339C1.99427 7.76484 2.10777 7.17111 2.33409 6.61696C2.5604 6.06281 2.89498 5.55937 3.31824 5.13611C3.7415 4.71285 4.24494 4.37827 4.79909 4.15195C5.35324 3.92564 5.94697 3.81214 6.54552 3.81809H6.72733C6.90356 3.28402 7.24525 2.81993 7.70289 2.49304C8.16052 2.16616 8.71035 1.99346 9.2727 1.99997C9.63267 1.99331 9.99029 2.0593 10.3242 2.19399C10.6581 2.32869 10.9614 2.52933 11.2159 2.78391C11.4705 3.03849 11.6712 3.34179 11.8059 3.67567C11.9406 4.00956 12.0065 4.36718 11.9999 4.72715M16.1688 6.0126L14.7271 7.45437H11.9999V9.27249M19.2724 19.2721C19.2724 20.2762 18.4584 21.0902 17.4542 21.0902C16.4501 21.0902 15.6361 20.2762 15.6361 19.2721C15.6361 18.268 16.4501 17.454 17.4542 17.454C18.4584 17.454 19.2724 18.268 19.2724 19.2721ZM19.2724 4.72714C19.2724 5.73126 18.4584 6.54526 17.4542 6.54526C16.4501 6.54526 15.6361 5.73126 15.6361 4.72714C15.6361 3.72302 16.4501 2.90902 17.4542 2.90902C18.4584 2.90902 19.2724 3.72302 19.2724 4.72714Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/development/bar-chart-square-02.svg b/app/components/base/icons/assets/vender/line/development/bar-chart-square-02.svg
new file mode 100644
index 0000000..f421104
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/development/bar-chart-square-02.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="bar-chart-square-02">
+<path id="Icon" d="M5.33333 10V11.3333M8 7.33333V11.3333M10.6667 4.66667V11.3333M5.2 14H10.8C11.9201 14 12.4802 14 12.908 13.782C13.2843 13.5903 13.5903 13.2843 13.782 12.908C14 12.4802 14 11.9201 14 10.8V5.2C14 4.0799 14 3.51984 13.782 3.09202C13.5903 2.71569 13.2843 2.40973 12.908 2.21799C12.4802 2 11.9201 2 10.8 2H5.2C4.0799 2 3.51984 2 3.09202 2.21799C2.71569 2.40973 2.40973 2.71569 2.21799 3.09202C2 3.51984 2 4.0799 2 5.2V10.8C2 11.9201 2 12.4802 2.21799 12.908C2.40973 13.2843 2.71569 13.5903 3.09202 13.782C3.51984 14 4.0799 14 5.2 14Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/development/brackets-x.svg b/app/components/base/icons/assets/vender/line/development/brackets-x.svg
new file mode 100644
index 0000000..cd3daec
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/development/brackets-x.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M18.5708 20C19.8328 20 20.8568 18.977 20.8568 17.714V13.143L21.9998 12L20.8568 10.857V6.286C20.8568 5.023 19.8338 4 18.5708 4M5.429 4C4.166 4 3.143 5.023 3.143 6.286V10.857L2 12L3.143 13.143V17.714C3.143 18.977 4.166 20 5.429 20M15 9L9 15M9 9L15 15" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/development/code-browser.svg b/app/components/base/icons/assets/vender/line/development/code-browser.svg
new file mode 100644
index 0000000..1a960fe
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/development/code-browser.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="code-browser">
+<path id="Icon" d="M22 9H2M14 17.5L16.5 15L14 12.5M10 12.5L7.5 15L10 17.5M2 7.8L2 16.2C2 17.8802 2 18.7202 2.32698 19.362C2.6146 19.9265 3.07354 20.3854 3.63803 20.673C4.27976 21 5.11984 21 6.8 21H17.2C18.8802 21 19.7202 21 20.362 20.673C20.9265 20.3854 21.3854 19.9265 21.673 19.362C22 18.7202 22 17.8802 22 16.2V7.8C22 6.11984 22 5.27977 21.673 4.63803C21.3854 4.07354 20.9265 3.6146 20.362 3.32698C19.7202 3 18.8802 3 17.2 3L6.8 3C5.11984 3 4.27976 3 3.63803 3.32698C3.07354 3.6146 2.6146 4.07354 2.32698 4.63803C2 5.27976 2 6.11984 2 7.8Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/development/container.svg b/app/components/base/icons/assets/vender/line/development/container.svg
new file mode 100644
index 0000000..657ede2
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/development/container.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M13.6666 4.85185L7.99998 8M7.99998 8L2.33331 4.85185M7.99998 8L8 14.3333M14 10.7057V5.29431C14 5.06588 14 4.95167 13.9663 4.8498C13.9366 4.75969 13.8879 4.67696 13.8236 4.60717C13.7509 4.52828 13.651 4.47281 13.4514 4.36188L8.51802 1.62114C8.32895 1.5161 8.23442 1.46358 8.1343 1.44299C8.0457 1.42477 7.95431 1.42477 7.8657 1.44299C7.76559 1.46358 7.67105 1.5161 7.48198 1.62114L2.54865 4.36188C2.34896 4.47281 2.24912 4.52828 2.17642 4.60717C2.11211 4.67697 2.06343 4.75969 2.03366 4.84981C2 4.95167 2 5.06588 2 5.29431V10.7057C2 10.9341 2 11.0484 2.03366 11.1502C2.06343 11.2403 2.11211 11.3231 2.17642 11.3929C2.24912 11.4718 2.34897 11.5272 2.54865 11.6382L7.48198 14.3789C7.67105 14.4839 7.76559 14.5365 7.8657 14.557C7.95431 14.5753 8.0457 14.5753 8.1343 14.557C8.23442 14.5365 8.32895 14.4839 8.51802 14.3789L13.4514 11.6382C13.651 11.5272 13.7509 11.4718 13.8236 11.3929C13.8879 11.3231 13.9366 11.2403 13.9663 11.1502C14 11.0484 14 10.9341 14 10.7057Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/development/database-01.svg b/app/components/base/icons/assets/vender/line/development/database-01.svg
new file mode 100644
index 0000000..087f5be
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/development/database-01.svg
@@ -0,0 +1,3 @@
+<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M14.5 3.33337C14.5 4.43794 11.8137 5.33337 8.5 5.33337C5.18629 5.33337 2.5 4.43794 2.5 3.33337M14.5 3.33337C14.5 2.2288 11.8137 1.33337 8.5 1.33337C5.18629 1.33337 2.5 2.2288 2.5 3.33337M14.5 3.33337V12.6667C14.5 13.7734 11.8333 14.6667 8.5 14.6667C5.16667 14.6667 2.5 13.7734 2.5 12.6667V3.33337M14.5 8.00004C14.5 9.10671 11.8333 10 8.5 10C5.16667 10 2.5 9.10671 2.5 8.00004" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/development/database-03.svg b/app/components/base/icons/assets/vender/line/development/database-03.svg
new file mode 100644
index 0000000..a2c11b4
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/development/database-03.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M9.33333 13.3333C9.33333 14.0696 8.73638 14.6666 8 14.6666C7.26362 14.6666 6.66667 14.0696 6.66667 13.3333M9.33333 13.3333C9.33333 12.5969 8.73638 11.9999 8 11.9999M9.33333 13.3333H14M6.66667 13.3333C6.66667 12.5969 7.26362 11.9999 8 11.9999M6.66667 13.3333H2M8 11.9999V9.33325M14 3.33325C14 4.43782 11.3137 5.33325 8 5.33325C4.68629 5.33325 2 4.43782 2 3.33325M14 3.33325C14 2.22868 11.3137 1.33325 8 1.33325C4.68629 1.33325 2 2.22868 2 3.33325M14 3.33325V7.33325C14 8.43992 11.3333 9.33325 8 9.33325M2 3.33325V7.33325C2 8.43992 4.66667 9.33325 8 9.33325" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/development/file-heart-02.svg b/app/components/base/icons/assets/vender/line/development/file-heart-02.svg
new file mode 100644
index 0000000..5761099
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/development/file-heart-02.svg
@@ -0,0 +1,6 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="file-heart-02">
+<path id="Icon" d="M13.5709 13.9883C13.5108 14.3786 13.175 14.6666 12.7802 14.6666H9.19984C8.90529 14.6666 8.6665 14.4279 8.6665 14.1333V12.2666C8.6665 11.9721 8.90529 11.7333 9.19984 11.7333H9.82654C9.93192 11.7333 10.0274 11.6713 10.0702 11.5749L11.0087 9.46348C11.0438 9.38432 11.1223 9.33331 11.2089 9.33331C11.5721 9.33331 11.8665 9.62771 11.8665 9.99087V10.9333C11.8665 11.0806 11.9859 11.2 12.1332 11.2H13.0673C13.5577 11.2 13.9326 11.637 13.858 12.1216L13.5709 13.9883Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path id="Vector" d="M13.3332 6.66665V4.53331C13.3332 3.41321 13.3332 2.85316 13.1152 2.42533C12.9234 2.04901 12.6175 1.74305 12.2412 1.5513C11.8133 1.33331 11.2533 1.33331 10.1332 1.33331H5.8665C4.7464 1.33331 4.18635 1.33331 3.75852 1.5513C3.3822 1.74305 3.07624 2.04901 2.88449 2.42533C2.6665 2.85316 2.6665 3.41321 2.6665 4.53331V11.3333C2.6665 11.9533 2.6665 12.2633 2.73465 12.5176C2.91959 13.2078 3.45868 13.7469 4.14887 13.9318C4.4032 14 4.71319 14 5.33317 14M8.33317 7.33331H5.33317M5.99984 9.99998H5.33317M10.6665 4.66665H5.33317" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/development/git-branch-01.svg b/app/components/base/icons/assets/vender/line/development/git-branch-01.svg
new file mode 100644
index 0000000..1f4c7d2
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/development/git-branch-01.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="git-branch-01">
+<path id="Icon" d="M2 2V8.8C2 9.92011 2 10.4802 2.21799 10.908C2.40973 11.2843 2.71569 11.5903 3.09202 11.782C3.51984 12 4.0799 12 5.2 12H10M10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12ZM2 5.33333L10 5.33333M10 5.33333C10 6.4379 10.8954 7.33333 12 7.33333C13.1046 7.33333 14 6.4379 14 5.33333C14 4.22876 13.1046 3.33333 12 3.33333C10.8954 3.33333 10 4.22876 10 5.33333Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/development/prompt-engineering.svg b/app/components/base/icons/assets/vender/line/development/prompt-engineering.svg
new file mode 100644
index 0000000..ef027e3
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/development/prompt-engineering.svg
@@ -0,0 +1,7 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="prompt-engineering">
+<path id="Icon" d="M14 6V5.2C14 4.0799 14 3.51984 13.782 3.09202C13.5903 2.7157 13.2843 2.40974 12.908 2.21799C12.4802 2 11.9201 2 10.8 2H5.2C4.0799 2 3.51984 2 3.09202 2.21799C2.7157 2.40973 2.40973 2.7157 2.21799 3.09202C2 3.51984 2 4.0799 2 5.2V10.8C2 11.9201 2 12.4802 2.21799 12.908C2.40973 13.2843 2.71569 13.5903 3.09202 13.782C3.51984 14 4.07989 14 5.2 14H6" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path id="Vector" d="M4.6665 4.66669H4.67317M6.6665 4.66669H6.67317M8.6665 4.66669H8.67317" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path id="Icon_2" d="M11.3333 8L11.5343 8.80399C11.7036 9.48123 11.7883 9.81985 11.9646 10.0954C12.1206 10.3391 12.3275 10.5461 12.5713 10.7021C12.8468 10.8784 13.1854 10.963 13.8627 11.1323L14.6667 11.3333L13.8627 11.5343C13.1854 11.7036 12.8468 11.7883 12.5713 11.9646C12.3275 12.1206 12.1206 12.3275 11.9646 12.5713C11.7883 12.8468 11.7036 13.1854 11.5343 13.8627L11.3333 14.6667L11.1323 13.8627C10.963 13.1854 10.8784 12.8468 10.7021 12.5713C10.5461 12.3275 10.3391 12.1206 10.0954 11.9646C9.81985 11.7883 9.48123 11.7036 8.80399 11.5343L8 11.3333L8.80399 11.1323C9.48123 10.963 9.81985 10.8784 10.0954 10.7021C10.3391 10.5461 10.5461 10.3391 10.7021 10.0954C10.8784 9.81985 10.963 9.48123 11.1323 8.80399L11.3333 8Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/development/puzzle-piece-01.svg b/app/components/base/icons/assets/vender/line/development/puzzle-piece-01.svg
new file mode 100644
index 0000000..2498711
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/development/puzzle-piece-01.svg
@@ -0,0 +1,10 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="puzzle-piece-01" clip-path="url(#clip0_6770_9698)">
+<path id="Icon" d="M4.99992 3.00004C4.99992 2.07957 5.74611 1.33337 6.66659 1.33337C7.58706 1.33337 8.33325 2.07957 8.33325 3.00004V4.00004H8.99992C9.9318 4.00004 10.3977 4.00004 10.7653 4.15228C11.2553 4.35527 11.6447 4.74462 11.8477 5.23467C11.9999 5.60222 11.9999 6.06816 11.9999 7.00004H12.9999C13.9204 7.00004 14.6666 7.74623 14.6666 8.66671C14.6666 9.58718 13.9204 10.3334 12.9999 10.3334H11.9999V11.4667C11.9999 12.5868 11.9999 13.1469 11.7819 13.5747C11.5902 13.951 11.2842 14.257 10.9079 14.4487C10.4801 14.6667 9.92002 14.6667 8.79992 14.6667H8.33325V13.5C8.33325 12.6716 7.66168 12 6.83325 12C6.00483 12 5.33325 12.6716 5.33325 13.5V14.6667H4.53325C3.41315 14.6667 2.85309 14.6667 2.42527 14.4487C2.04895 14.257 1.74299 13.951 1.55124 13.5747C1.33325 13.1469 1.33325 12.5868 1.33325 11.4667V10.3334H2.33325C3.25373 10.3334 3.99992 9.58718 3.99992 8.66671C3.99992 7.74623 3.25373 7.00004 2.33325 7.00004H1.33325C1.33325 6.06816 1.33325 5.60222 1.48549 5.23467C1.68848 4.74462 2.07783 4.35527 2.56789 4.15228C2.93543 4.00004 3.40137 4.00004 4.33325 4.00004H4.99992V3.00004Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_6770_9698">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/development/terminal-square.svg b/app/components/base/icons/assets/vender/line/development/terminal-square.svg
new file mode 100644
index 0000000..89bb153
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/development/terminal-square.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="terminal-square">
+<path id="Icon" d="M7 15L10 12L7 9M13 15H17M7.8 21H16.2C17.8802 21 18.7202 21 19.362 20.673C19.9265 20.3854 20.3854 19.9265 20.673 19.362C21 18.7202 21 17.8802 21 16.2V7.8C21 6.11984 21 5.27976 20.673 4.63803C20.3854 4.07354 19.9265 3.6146 19.362 3.32698C18.7202 3 17.8802 3 16.2 3H7.8C6.11984 3 5.27976 3 4.63803 3.32698C4.07354 3.6146 3.6146 4.07354 3.32698 4.63803C3 5.27976 3 6.11984 3 7.8V16.2C3 17.8802 3 18.7202 3.32698 19.362C3.6146 19.9265 4.07354 20.3854 4.63803 20.673C5.27976 21 6.11984 21 7.8 21Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/development/variable.svg b/app/components/base/icons/assets/vender/line/development/variable.svg
new file mode 100644
index 0000000..65c0552
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/development/variable.svg
@@ -0,0 +1,9 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="variable">
+<g id="Solid">
+<path d="M13.8686 1.70487C13.7055 1.37481 13.3056 1.23952 12.9756 1.40268C12.6455 1.56585 12.5102 1.9657 12.6734 2.29576C13.5225 4.01329 14.0003 5.94969 14.0003 8.00031C14.0003 10.0509 13.5225 11.9873 12.6734 13.7049C12.5102 14.0349 12.6455 14.4348 12.9756 14.5979C13.3056 14.7611 13.7055 14.6258 13.8686 14.2958C14.8066 12.3984 15.3336 10.2602 15.3336 8.00031C15.3336 5.74041 14.8066 3.60221 13.8686 1.70487Z" fill="#2970FF"/>
+<path d="M3.32724 2.29576C3.49041 1.9657 3.35511 1.56585 3.02506 1.40268C2.695 1.23952 2.29515 1.37481 2.13198 1.70487C1.19401 3.60221 0.666992 5.74041 0.666992 8.00031C0.666992 10.2602 1.19401 12.3984 2.13198 14.2958C2.29515 14.6258 2.695 14.7611 3.02506 14.5979C3.35511 14.4348 3.49041 14.0349 3.32724 13.7049C2.47815 11.9873 2.00033 10.0509 2.00033 8.00031C2.00033 5.94969 2.47815 4.01329 3.32724 2.29576Z" fill="#2970FF"/>
+<path d="M9.33274 5.84142C9.74245 5.36093 10.3415 5.0835 10.973 5.0835H11.0328C11.4009 5.0835 11.6994 5.38197 11.6994 5.75016C11.6994 6.11835 11.4009 6.41683 11.0328 6.41683H10.973C10.7333 6.41683 10.5046 6.52209 10.3473 6.70653L8.78729 8.53612L9.28122 10.2739C9.29182 10.3112 9.32425 10.3335 9.35733 10.3335H10.2867C10.6549 10.3335 10.9534 10.632 10.9534 11.0002C10.9534 11.3684 10.6549 11.6668 10.2867 11.6668H9.35733C8.72419 11.6668 8.17111 11.2451 7.99868 10.6385L7.74768 9.75536L6.7641 10.9089C6.35439 11.3894 5.75537 11.6668 5.12387 11.6668H5.06409C4.6959 11.6668 4.39742 11.3684 4.39742 11.0002C4.39742 10.632 4.6959 10.3335 5.06409 10.3335H5.12387C5.36357 10.3335 5.59225 10.2282 5.74952 10.0438L7.30963 8.21412L6.81573 6.47639C6.80513 6.43909 6.7727 6.41683 6.73962 6.41683H5.81022C5.44203 6.41683 5.14355 6.11835 5.14355 5.75016C5.14355 5.38197 5.44203 5.0835 5.81022 5.0835H6.73962C7.37276 5.0835 7.92584 5.5052 8.09826 6.11186L8.34924 6.99487L9.33274 5.84142Z" fill="#2970FF"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/development/webhooks.svg b/app/components/base/icons/assets/vender/line/development/webhooks.svg
new file mode 100644
index 0000000..e1f693f
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/development/webhooks.svg
@@ -0,0 +1,12 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="webhooks">
+<g id="Vector">
+<path d="M12.0007 11.9999C12.5529 11.9999 13.0007 11.5522 13.0007 10.9999C13.0007 10.4476 12.5529 9.99993 12.0007 9.99993C11.4484 9.99993 11.0007 10.4476 11.0007 10.9999C11.0007 11.5522 11.4484 11.9999 12.0007 11.9999Z" fill="#155EEF"/>
+<path d="M8.00065 5.49993C8.55294 5.49993 9.00065 5.05222 9.00065 4.49993C9.00065 3.94765 8.55294 3.49993 8.00065 3.49993C7.44837 3.49993 7.00065 3.94765 7.00065 4.49993C7.00065 5.05222 7.44837 5.49993 8.00065 5.49993Z" fill="#155EEF"/>
+<path d="M4.00065 11.9999C4.55294 11.9999 5.00065 11.5522 5.00065 10.9999C5.00065 10.4476 4.55294 9.99993 4.00065 9.99993C3.44837 9.99993 3.00065 10.4476 3.00065 10.9999C3.00065 11.5522 3.44837 11.9999 4.00065 11.9999Z" fill="#155EEF"/>
+<path d="M2.40065 8.9666C2.6952 9.18751 2.7549 9.60538 2.53398 9.89993C2.35969 10.1323 2.24311 10.4028 2.19386 10.6891C2.14461 10.9754 2.16409 11.2693 2.25071 11.5466C2.33733 11.8239 2.48859 12.0766 2.69205 12.2839C2.8955 12.4913 3.14531 12.6473 3.4209 12.7392C3.69649 12.831 3.98996 12.8561 4.27713 12.8123C4.56431 12.7685 4.83696 12.6571 5.07262 12.4872C5.30828 12.3174 5.50021 12.0939 5.63258 11.8353C5.76495 11.5768 5.83398 11.2904 5.83398 10.9999C5.83398 10.6317 6.13246 10.3333 6.50065 10.3333H12.0007C12.3688 10.3333 12.6673 10.6317 12.6673 10.9999C12.6673 11.3681 12.3688 11.6666 12.0007 11.6666H7.09635C7.03846 11.9354 6.94561 12.1965 6.81944 12.4429C6.5908 12.8896 6.25929 13.2755 5.85223 13.5689C5.44518 13.8623 4.97424 14.0547 4.47821 14.1304C3.98219 14.2061 3.47528 14.1628 2.99926 14.0041C2.52325 13.8454 2.09175 13.5759 1.74033 13.2178C1.38891 12.8596 1.12763 12.4231 0.978025 11.9441C0.828415 11.4652 0.794759 10.9575 0.879828 10.463C0.964898 9.96855 1.16626 9.50134 1.46732 9.09993C1.68823 8.80538 2.1061 8.74568 2.40065 8.9666Z" fill="#155EEF"/>
+<path d="M7.22821 1.43134C7.70981 1.31005 8.21318 1.30373 8.69767 1.41291C9.18216 1.52208 9.63418 1.74367 10.0172 2.05979C10.4003 2.37591 10.7036 2.77769 10.9027 3.23268C11.0503 3.56999 10.8965 3.96309 10.5592 4.11069C10.2218 4.25828 9.82874 4.10449 9.68115 3.76718C9.56589 3.50377 9.39028 3.27116 9.16852 3.08814C8.94676 2.90512 8.68507 2.77683 8.40458 2.71363C8.12408 2.65042 7.83265 2.65408 7.55383 2.7243C7.27501 2.79452 7.01662 2.92933 6.79952 3.11785C6.58242 3.30637 6.41271 3.54331 6.30409 3.80953C6.19547 4.07575 6.15099 4.36379 6.17424 4.65038C6.19749 4.93696 6.28782 5.21406 6.43794 5.45929C6.58806 5.70452 6.79375 5.911 7.0384 6.06206C7.35127 6.25524 7.44865 6.66527 7.25605 6.9785L4.56855 11.3491C4.37569 11.6628 3.96509 11.7607 3.65145 11.5678C3.33781 11.375 3.2399 10.9644 3.43276 10.6507L5.80875 6.7867C5.61374 6.59953 5.44284 6.38752 5.30076 6.15541C5.04146 5.73184 4.88544 5.25321 4.84527 4.7582C4.80511 4.26319 4.88194 3.76567 5.06956 3.30584C5.25717 2.846 5.55031 2.43674 5.9253 2.11111C6.30029 1.78549 6.74661 1.55262 7.22821 1.43134Z" fill="#155EEF"/>
+<path d="M7.65145 3.93204C7.96509 3.73918 8.37569 3.83709 8.56855 4.15073L10.944 8.01384C11.1917 7.9264 11.4501 7.86984 11.7135 7.84608C12.2008 7.80211 12.6917 7.87167 13.1476 8.04931C13.6036 8.22695 14.0121 8.50783 14.3413 8.86991C14.6704 9.23199 14.9111 9.66542 15.0446 10.1362C15.1781 10.6069 15.2006 11.1022 15.1105 11.5832C15.0204 12.0641 14.82 12.5176 14.5252 12.9081C14.2303 13.2986 13.849 13.6155 13.4111 13.8338C12.9732 14.0522 12.4907 14.1661 12.0014 14.1666C11.6332 14.167 11.3344 13.8688 11.334 13.5006C11.3336 13.1324 11.6318 12.8337 12 12.8333C12.2832 12.833 12.5626 12.767 12.8161 12.6406C13.0696 12.5142 13.2904 12.3308 13.4611 12.1047C13.6318 11.8786 13.7478 11.616 13.8 11.3376C13.8522 11.0592 13.8391 10.7724 13.7618 10.4999C13.6846 10.2273 13.5452 9.97639 13.3546 9.76676C13.1641 9.55714 12.9276 9.39452 12.6636 9.29168C12.3996 9.18884 12.1154 9.14856 11.8333 9.17402C11.5511 9.19947 11.2787 9.28996 11.0375 9.43839C10.8868 9.53104 10.7056 9.56006 10.5336 9.51905C10.3616 9.47805 10.2129 9.37039 10.1203 9.21975L7.43276 4.84913C7.2399 4.53549 7.33781 4.12489 7.65145 3.93204Z" fill="#155EEF"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/editor/align-left.svg b/app/components/base/icons/assets/vender/line/editor/align-left.svg
new file mode 100644
index 0000000..086ff82
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/editor/align-left.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="align-left">
+<path id="Icon" d="M16 10H3M20 6H3M20 14H3M16 18H3" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/editor/bezier-curve-03.svg b/app/components/base/icons/assets/vender/line/editor/bezier-curve-03.svg
new file mode 100644
index 0000000..56befa3
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/editor/bezier-curve-03.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="bezier-curve-03">
+<path id="Icon" d="M5.42857 3.5L2.57143 8.5M3 9.5H8.9999M9.42857 8.5L6.57143 3.5M1.8 10.5H2.2C2.48003 10.5 2.62004 10.5 2.727 10.4455C2.82108 10.3976 2.89757 10.3211 2.9455 10.227C3 10.12 3 9.98003 3 9.7V9.3C3 9.01997 3 8.87996 2.9455 8.773C2.89757 8.67892 2.82108 8.60243 2.727 8.5545C2.62004 8.5 2.48003 8.5 2.2 8.5H1.8C1.51997 8.5 1.37996 8.5 1.273 8.5545C1.17892 8.60243 1.10243 8.67892 1.0545 8.773C1 8.87996 1 9.01997 1 9.3V9.7C1 9.98003 1 10.12 1.0545 10.227C1.10243 10.3211 1.17892 10.3976 1.273 10.4455C1.37996 10.5 1.51997 10.5 1.8 10.5ZM9.8 10.5H10.2C10.48 10.5 10.62 10.5 10.727 10.4455C10.8211 10.3976 10.8976 10.3211 10.9455 10.227C11 10.12 11 9.98003 11 9.7V9.3C11 9.01997 11 8.87996 10.9455 8.773C10.8976 8.67892 10.8211 8.60243 10.727 8.5545C10.62 8.5 10.48 8.5 10.2 8.5H9.8C9.51997 8.5 9.37996 8.5 9.273 8.5545C9.17892 8.60243 9.10243 8.67892 9.0545 8.773C9 8.87996 9 9.01997 9 9.3V9.7C9 9.98003 9 10.12 9.0545 10.227C9.10243 10.3211 9.17892 10.3976 9.273 10.4455C9.37996 10.5 9.51997 10.5 9.8 10.5ZM5.8 3.5H6.2C6.48003 3.5 6.62004 3.5 6.727 3.4455C6.82108 3.39757 6.89757 3.32108 6.9455 3.227C7 3.12004 7 2.98003 7 2.7V2.3C7 2.01997 7 1.87996 6.9455 1.773C6.89757 1.67892 6.82108 1.60243 6.727 1.5545C6.62004 1.5 6.48003 1.5 6.2 1.5H5.8C5.51997 1.5 5.37996 1.5 5.273 1.5545C5.17892 1.60243 5.10243 1.67892 5.0545 1.773C5 1.87996 5 2.01997 5 2.3V2.7C5 2.98003 5 3.12004 5.0545 3.227C5.10243 3.32108 5.17892 3.39757 5.273 3.4455C5.37996 3.5 5.51997 3.5 5.8 3.5Z" stroke="#667085" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/editor/collapse.svg b/app/components/base/icons/assets/vender/line/editor/collapse.svg
new file mode 100644
index 0000000..b54e046
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/editor/collapse.svg
@@ -0,0 +1,9 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon L">
+<g id="Vector">
+<path d="M2.66602 11.3333H0.666016L3.33268 8.66667L5.99935 11.3333H3.99935L3.99935 14H2.66602L2.66602 11.3333Z" fill="#354052"/>
+<path d="M2.66602 4.66667L2.66602 2L3.99935 2L3.99935 4.66667L5.99935 4.66667L3.33268 7.33333L0.666016 4.66667L2.66602 4.66667Z" fill="#354052"/>
+<path d="M7.33268 2.66667H13.9993V4H7.33268V2.66667ZM7.33268 12H13.9993V13.3333H7.33268V12ZM5.99935 7.33333H13.9993V8.66667H5.99935V7.33333Z" fill="#354052"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/editor/colors.svg b/app/components/base/icons/assets/vender/line/editor/colors.svg
new file mode 100644
index 0000000..685c175
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/editor/colors.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="colors">
+<path id="Icon" d="M12 20.4722C13.0615 21.4223 14.4633 22 16 22C19.3137 22 22 19.3137 22 16C22 13.2331 20.1271 10.9036 17.5798 10.2102M6.42018 10.2102C3.87293 10.9036 2 13.2331 2 16C2 19.3137 4.68629 22 8 22C11.3137 22 14 19.3137 14 16C14 15.2195 13.851 14.4738 13.5798 13.7898M18 8C18 11.3137 15.3137 14 12 14C8.68629 14 6 11.3137 6 8C6 4.68629 8.68629 2 12 2C15.3137 2 18 4.68629 18 8Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/editor/image-indent-left.svg b/app/components/base/icons/assets/vender/line/editor/image-indent-left.svg
new file mode 100644
index 0000000..8419f7b
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/editor/image-indent-left.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="image-indent-left">
+<path id="Icon" d="M21 9.25H15M21 4H3M21 14.75H15M21 20H3M4.6 16H9.4C9.96005 16 10.2401 16 10.454 15.891C10.6422 15.7951 10.7951 15.6422 10.891 15.454C11 15.2401 11 14.9601 11 14.4V9.6C11 9.03995 11 8.75992 10.891 8.54601C10.7951 8.35785 10.6422 8.20487 10.454 8.10899C10.2401 8 9.96005 8 9.4 8H4.6C4.03995 8 3.75992 8 3.54601 8.10899C3.35785 8.20487 3.20487 8.35785 3.10899 8.54601C3 8.75992 3 9.03995 3 9.6V14.4C3 14.9601 3 15.2401 3.10899 15.454C3.20487 15.6422 3.35785 15.7951 3.54601 15.891C3.75992 16 4.03995 16 4.6 16Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/editor/left-indent-02.svg b/app/components/base/icons/assets/vender/line/editor/left-indent-02.svg
new file mode 100644
index 0000000..25cecb2
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/editor/left-indent-02.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M21 9.24995H12M21 3.99995L12 3.99995M21 14.75H3M21 20H3M4.28 2.95995L8.14667 5.85995C8.43616 6.07707 8.5809 6.18563 8.63266 6.31872C8.678 6.43529 8.678 6.56462 8.63266 6.68119C8.5809 6.81427 8.43616 6.92283 8.14667 7.13995L4.28 10.04C3.86802 10.3489 3.66203 10.5034 3.48961 10.4998C3.33956 10.4967 3.19885 10.4264 3.10632 10.3082C3 10.1724 3 9.91493 3 9.39995V3.59995C3 3.08498 3 2.82749 3.10632 2.6917C3.19885 2.57354 3.33956 2.50318 3.48961 2.50006C3.66203 2.49648 3.86802 2.65097 4.28 2.95995Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/editor/letter-spacing-01.svg b/app/components/base/icons/assets/vender/line/editor/letter-spacing-01.svg
new file mode 100644
index 0000000..4f0c99e
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/editor/letter-spacing-01.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="letter-spacing-01">
+<path id="Icon" d="M9 13L15 13M7 17L11.2717 7.60225C11.5031 7.09323 11.6188 6.83872 11.7791 6.75976C11.9184 6.69115 12.0816 6.69115 12.2209 6.75976C12.3812 6.83872 12.4969 7.09323 12.7283 7.60225L17 17M21 3V21M3 3L3 21" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/editor/type-square.svg b/app/components/base/icons/assets/vender/line/editor/type-square.svg
new file mode 100644
index 0000000..3a8fce2
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/editor/type-square.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="type-square">
+<path id="Icon" d="M4 3.5H8M6 3.5V8.5M3.9 10.5H8.1C8.94008 10.5 9.36012 10.5 9.68099 10.3365C9.96323 10.1927 10.1927 9.96323 10.3365 9.68099C10.5 9.36012 10.5 8.94008 10.5 8.1V3.9C10.5 3.05992 10.5 2.63988 10.3365 2.31901C10.1927 2.03677 9.96323 1.8073 9.68099 1.66349C9.36012 1.5 8.94008 1.5 8.1 1.5H3.9C3.05992 1.5 2.63988 1.5 2.31901 1.66349C2.03677 1.8073 1.8073 2.03677 1.66349 2.31901C1.5 2.63988 1.5 3.05992 1.5 3.9V8.1C1.5 8.94008 1.5 9.36012 1.66349 9.68099C1.8073 9.96323 2.03677 10.1927 2.31901 10.3365C2.63988 10.5 3.05992 10.5 3.9 10.5Z" stroke="#667085" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/education/book-open-01.svg b/app/components/base/icons/assets/vender/line/education/book-open-01.svg
new file mode 100644
index 0000000..c1809ba
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/education/book-open-01.svg
@@ -0,0 +1,6 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="book-open-01">
+<path id="Fill" opacity="0.12" d="M1 3.1C1 2.53995 1 2.25992 1.10899 2.04601C1.20487 1.85785 1.35785 1.70487 1.54601 1.60899C1.75992 1.5 2.03995 1.5 2.6 1.5H2.8C3.9201 1.5 4.48016 1.5 4.90798 1.71799C5.28431 1.90973 5.59027 2.21569 5.78201 2.59202C6 3.01984 6 3.5799 6 4.7V10.5L5.94997 10.425C5.60265 9.90398 5.42899 9.64349 5.19955 9.45491C4.99643 9.28796 4.76238 9.1627 4.5108 9.0863C4.22663 9 3.91355 9 3.28741 9H2.6C2.03995 9 1.75992 9 1.54601 8.89101C1.35785 8.79513 1.20487 8.64215 1.10899 8.45399C1 8.24008 1 7.96005 1 7.4V3.1Z" fill="#667085"/>
+<path id="Icon" d="M6 10.5L5.94997 10.425C5.60265 9.90398 5.42899 9.64349 5.19955 9.45491C4.99643 9.28796 4.76238 9.1627 4.5108 9.0863C4.22663 9 3.91355 9 3.28741 9H2.6C2.03995 9 1.75992 9 1.54601 8.89101C1.35785 8.79513 1.20487 8.64215 1.10899 8.45399C1 8.24008 1 7.96005 1 7.4V3.1C1 2.53995 1 2.25992 1.10899 2.04601C1.20487 1.85785 1.35785 1.70487 1.54601 1.60899C1.75992 1.5 2.03995 1.5 2.6 1.5H2.8C3.9201 1.5 4.48016 1.5 4.90798 1.71799C5.28431 1.90973 5.59027 2.21569 5.78201 2.59202C6 3.01984 6 3.5799 6 4.7M6 10.5V4.7M6 10.5L6.05003 10.425C6.39735 9.90398 6.57101 9.64349 6.80045 9.45491C7.00357 9.28796 7.23762 9.1627 7.4892 9.0863C7.77337 9 8.08645 9 8.71259 9H9.4C9.96005 9 10.2401 9 10.454 8.89101C10.6422 8.79513 10.7951 8.64215 10.891 8.45399C11 8.24008 11 7.96005 11 7.4V3.1C11 2.53995 11 2.25992 10.891 2.04601C10.7951 1.85785 10.6422 1.70487 10.454 1.60899C10.2401 1.5 9.96005 1.5 9.4 1.5H9.2C8.07989 1.5 7.51984 1.5 7.09202 1.71799C6.71569 1.90973 6.40973 2.21569 6.21799 2.59202C6 3.01984 6 3.5799 6 4.7" stroke="#667085" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/files/clipboard-check.svg b/app/components/base/icons/assets/vender/line/files/clipboard-check.svg
new file mode 100644
index 0000000..48c70ed
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/files/clipboard-check.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M16 4C16.93 4 17.395 4 17.7765 4.10222C18.8117 4.37962 19.6204 5.18827 19.8978 6.22354C20 6.60504 20 7.07003 20 8V17.2C20 18.8802 20 19.7202 19.673 20.362C19.3854 20.9265 18.9265 21.3854 18.362 21.673C17.7202 22 16.8802 22 15.2 22H8.8C7.11984 22 6.27976 22 5.63803 21.673C5.07354 21.3854 4.6146 20.9265 4.32698 20.362C4 19.7202 4 18.8802 4 17.2V8C4 7.07003 4 6.60504 4.10222 6.22354C4.37962 5.18827 5.18827 4.37962 6.22354 4.10222C6.60504 4 7.07003 4 8 4M9 15L11 17L15.5 12.5M9.6 6H14.4C14.9601 6 15.2401 6 15.454 5.89101C15.6422 5.79513 15.7951 5.64215 15.891 5.45399C16 5.24008 16 4.96005 16 4.4V3.6C16 3.03995 16 2.75992 15.891 2.54601C15.7951 2.35785 15.6422 2.20487 15.454 2.10899C15.2401 2 14.9601 2 14.4 2H9.6C9.03995 2 8.75992 2 8.54601 2.10899C8.35785 2.20487 8.20487 2.35785 8.10899 2.54601C8 2.75992 8 3.03995 8 3.6V4.4C8 4.96005 8 5.24008 8.10899 5.45399C8.20487 5.64215 8.35785 5.79513 8.54601 5.89101C8.75992 6 9.03995 6 9.6 6Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/files/clipboard.svg b/app/components/base/icons/assets/vender/line/files/clipboard.svg
new file mode 100644
index 0000000..8abaaa9
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/files/clipboard.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M16 4C16.93 4 17.395 4 17.7765 4.10222C18.8117 4.37962 19.6204 5.18827 19.8978 6.22354C20 6.60504 20 7.07003 20 8V17.2C20 18.8802 20 19.7202 19.673 20.362C19.3854 20.9265 18.9265 21.3854 18.362 21.673C17.7202 22 16.8802 22 15.2 22H8.8C7.11984 22 6.27976 22 5.63803 21.673C5.07354 21.3854 4.6146 20.9265 4.32698 20.362C4 19.7202 4 18.8802 4 17.2V8C4 7.07003 4 6.60504 4.10222 6.22354C4.37962 5.18827 5.18827 4.37962 6.22354 4.10222C6.60504 4 7.07003 4 8 4M9.6 6H14.4C14.9601 6 15.2401 6 15.454 5.89101C15.6422 5.79513 15.7951 5.64215 15.891 5.45399C16 5.24008 16 4.96005 16 4.4V3.6C16 3.03995 16 2.75992 15.891 2.54601C15.7951 2.35785 15.6422 2.20487 15.454 2.10899C15.2401 2 14.9601 2 14.4 2H9.6C9.03995 2 8.75992 2 8.54601 2.10899C8.35785 2.20487 8.20487 2.35785 8.10899 2.54601C8 2.75992 8 3.03995 8 3.6V4.4C8 4.96005 8 5.24008 8.10899 5.45399C8.20487 5.64215 8.35785 5.79513 8.54601 5.89101C8.75992 6 9.03995 6 9.6 6Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/files/file-02.svg b/app/components/base/icons/assets/vender/line/files/file-02.svg
new file mode 100644
index 0000000..b6d34bf
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/files/file-02.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon">
+<path id="Icon_2" d="M9.33366 7.3335H5.33366M6.66699 10.0002H5.33366M10.667 4.66683H5.33366M13.3337 4.5335V11.4668C13.3337 12.5869 13.3337 13.147 13.1157 13.5748C12.9239 13.9511 12.618 14.2571 12.2416 14.4488C11.8138 14.6668 11.2538 14.6668 10.1337 14.6668H5.86699C4.74689 14.6668 4.18683 14.6668 3.75901 14.4488C3.38269 14.2571 3.07673 13.9511 2.88498 13.5748C2.66699 13.147 2.66699 12.5869 2.66699 11.4668V4.5335C2.66699 3.41339 2.66699 2.85334 2.88498 2.42552C3.07673 2.04919 3.38269 1.74323 3.75901 1.55148C4.18683 1.3335 4.74689 1.3335 5.86699 1.3335H10.1337C11.2538 1.3335 11.8138 1.3335 12.2416 1.55148C12.618 1.74323 12.9239 2.04919 13.1157 2.42552C13.3337 2.85334 13.3337 3.41339 13.3337 4.5335Z" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/files/file-arrow-01.svg b/app/components/base/icons/assets/vender/line/files/file-arrow-01.svg
new file mode 100644
index 0000000..e8db342
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/files/file-arrow-01.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="file-arrow-01">
+<path id="Vector" d="M3.33333 12.333C3.33333 12.6426 3.33333 12.7974 3.35044 12.9274C3.4686 13.8249 4.17481 14.5311 5.07228 14.6492C5.20225 14.6663 5.35705 14.6663 5.66667 14.6663H10.8C11.9201 14.6663 12.4802 14.6663 12.908 14.4484C13.2843 14.2566 13.5903 13.9506 13.782 13.5743C14 13.1465 14 12.5864 14 11.4663V6.65849C14 6.16931 14 5.92472 13.9447 5.69454C13.8957 5.49047 13.8149 5.29538 13.7053 5.11644C13.5816 4.91461 13.4086 4.74165 13.0627 4.39575L10.9373 2.27027C10.5914 1.92436 10.4184 1.75141 10.2166 1.62773C10.0376 1.51807 9.84254 1.43726 9.63846 1.38827C9.40829 1.33301 9.1637 1.33301 8.67452 1.33301H5.66667C5.35705 1.33301 5.20225 1.33301 5.07228 1.35012C4.17481 1.46827 3.4686 2.17449 3.35044 3.07196M5.33333 5.99967L7.33333 7.99967M7.33333 7.99967L5.33333 9.99967M7.33333 7.99967H2" stroke="#475467" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/files/file-check-02.svg b/app/components/base/icons/assets/vender/line/files/file-check-02.svg
new file mode 100644
index 0000000..931593c
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/files/file-check-02.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="file-check-02">
+<path id="Icon" d="M13.3337 8.33301V4.53301C13.3337 3.4129 13.3337 2.85285 13.1157 2.42503C12.9239 2.0487 12.618 1.74274 12.2416 1.55099C11.8138 1.33301 11.2538 1.33301 10.1337 1.33301H5.86699C4.74689 1.33301 4.18683 1.33301 3.75901 1.55099C3.38269 1.74274 3.07673 2.0487 2.88498 2.42503C2.66699 2.85285 2.66699 3.4129 2.66699 4.53301V11.4663C2.66699 12.5864 2.66699 13.1465 2.88498 13.5743C3.07673 13.9506 3.38269 14.2566 3.75901 14.4484C4.18683 14.6663 4.74689 14.6663 5.86699 14.6663H8.00033M9.33366 7.33301H5.33366M6.66699 9.99967H5.33366M10.667 4.66634H5.33366M9.66699 12.6663L11.0003 13.9997L14.0003 10.9997" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/files/file-download-02.svg b/app/components/base/icons/assets/vender/line/files/file-download-02.svg
new file mode 100644
index 0000000..e96132b
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/files/file-download-02.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M20 12.5V6.8C20 5.11984 20 4.27976 19.673 3.63803C19.3854 3.07354 18.9265 2.6146 18.362 2.32698C17.7202 2 16.8802 2 15.2 2H8.8C7.11984 2 6.27976 2 5.63803 2.32698C5.07354 2.6146 4.6146 3.07354 4.32698 3.63803C4 4.27976 4 5.11984 4 6.8V17.2C4 18.8802 4 19.7202 4.32698 20.362C4.6146 20.9265 5.07354 21.3854 5.63803 21.673C6.27976 22 7.1198 22 8.79986 22H12.5M14 11H8M10 15H8M16 7H8M15 19L18 22M18 22L21 19M18 22V16" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/files/file-plus-01.svg b/app/components/base/icons/assets/vender/line/files/file-plus-01.svg
new file mode 100644
index 0000000..e312cd9
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/files/file-plus-01.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="file-plus-01">
+<path id="Icon" d="M13.3332 6.99967V4.53301C13.3332 3.4129 13.3332 2.85285 13.1152 2.42503C12.9234 2.0487 12.6175 1.74274 12.2412 1.55099C11.8133 1.33301 11.2533 1.33301 10.1332 1.33301H5.8665C4.7464 1.33301 4.18635 1.33301 3.75852 1.55099C3.3822 1.74274 3.07624 2.0487 2.88449 2.42503C2.6665 2.85285 2.6665 3.4129 2.6665 4.53301V11.4663C2.6665 12.5864 2.6665 13.1465 2.88449 13.5743C3.07624 13.9506 3.3822 14.2566 3.75852 14.4484C4.18635 14.6663 4.7464 14.6663 5.8665 14.6663H7.99984M11.9998 13.9997V9.99967M9.99984 11.9997H13.9998" stroke="#475467" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/files/file-plus-02.svg b/app/components/base/icons/assets/vender/line/files/file-plus-02.svg
new file mode 100644
index 0000000..aab093a
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/files/file-plus-02.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M13.3333 6.99992V4.53325C13.3333 3.41315 13.3333 2.85309 13.1153 2.42527C12.9236 2.04895 12.6176 1.74299 12.2413 1.55124C11.8135 1.33325 11.2534 1.33325 10.1333 1.33325H5.86666C4.74655 1.33325 4.1865 1.33325 3.75868 1.55124C3.38235 1.74299 3.07639 2.04895 2.88464 2.42527C2.66666 2.85309 2.66666 3.41315 2.66666 4.53325V11.4666C2.66666 12.5867 2.66666 13.1467 2.88464 13.5746C3.07639 13.9509 3.38235 14.2569 3.75868 14.4486C4.1865 14.6666 4.74655 14.6666 5.86666 14.6666H7.99999M9.33332 7.33325H5.33332M6.66666 9.99992H5.33332M10.6667 4.66659H5.33332M12 13.9999V9.99992M9.99999 11.9999H14" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/files/file-text.svg b/app/components/base/icons/assets/vender/line/files/file-text.svg
new file mode 100644
index 0000000..25760e5
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/files/file-text.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="file-text">
+<path id="Icon" d="M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8M14 2L20 8M14 2V8H20M16 13H8M16 17H8M10 9H8" stroke="#101828" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/files/file-upload.svg b/app/components/base/icons/assets/vender/line/files/file-upload.svg
new file mode 100644
index 0000000..e8b7095
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/files/file-upload.svg
@@ -0,0 +1,6 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="file-upload">
+<path id="Icon" d="M20 10.5V6.8C20 5.11984 20 4.27976 19.673 3.63803C19.3854 3.07354 18.9265 2.6146 18.362 2.32698C17.7202 2 16.8802 2 15.2 2H8.8C7.11984 2 6.27976 2 5.63803 2.32698C5.07354 2.6146 4.6146 3.07354 4.32698 3.63803C4 4.27976 4 5.11984 4 6.8V17.2C4 18.8802 4 19.7202 4.32698 20.362C4.6146 20.9265 5.07354 21.3854 5.63803 21.673C6.27976 22 7.11984 22 8.8 22H12M14 11H8M10 15H8M16 7H8" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+<path id="Icon_2" d="M15 18L18 15M18 15L21 18M18 15L18 21" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/files/folder.svg b/app/components/base/icons/assets/vender/line/files/folder.svg
new file mode 100644
index 0000000..248708b
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/files/folder.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="folder">
+<path id="Icon" d="M12.8327 11.0833C12.8327 11.3928 12.7098 11.6895 12.491 11.9083C12.2722 12.1271 11.9754 12.25 11.666 12.25H2.33268C2.02326 12.25 1.72652 12.1271 1.50772 11.9083C1.28893 11.6895 1.16602 11.3928 1.16602 11.0833V2.91667C1.16602 2.60725 1.28893 2.3105 1.50772 2.09171C1.72652 1.87292 2.02326 1.75 2.33268 1.75H5.24935L6.41602 3.5H11.666C11.9754 3.5 12.2722 3.62292 12.491 3.84171C12.7098 4.0605 12.8327 4.35725 12.8327 4.66667V11.0833Z" stroke="#344054" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/financeAndECommerce/balance.svg b/app/components/base/icons/assets/vender/line/financeAndECommerce/balance.svg
new file mode 100644
index 0000000..428967a
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/financeAndECommerce/balance.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12 3V20M12 20H6.99999M12 20H17M2.99999 6H7.52785C7.83834 6 8.14457 5.92771 8.42228 5.78885L9.5777 5.21115C9.85541 5.07229 10.1616 5 10.4721 5H13.5279C13.8384 5 14.1446 5.07229 14.4223 5.21115L15.5777 5.78885C15.8554 5.92771 16.1616 6 16.4721 6H21M5.49999 6L3.02043 13.4387C2.71807 14.3458 3.08918 15.3834 4.0053 15.657C5.0117 15.9577 5.98828 15.9577 6.99468 15.657C7.9108 15.3834 8.28191 14.3457 7.97955 13.4387L5.49999 6ZM18.5 6L16.0204 13.4387C15.7181 14.3458 16.0892 15.3834 17.0053 15.657C18.0117 15.9577 18.9883 15.9577 19.9947 15.657C20.9108 15.3834 21.2819 14.3457 20.9796 13.4387L18.5 6Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/financeAndECommerce/coins-stacked-01.svg b/app/components/base/icons/assets/vender/line/financeAndECommerce/coins-stacked-01.svg
new file mode 100644
index 0000000..00f371a
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/financeAndECommerce/coins-stacked-01.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="coins-stacked-01">
+<path id="Icon" d="M12 17C12 19.7614 14.2386 22 17 22C19.7614 22 22 19.7614 22 17C22 14.2386 19.7614 12 17 12C14.2386 12 12 14.2386 12 17ZM12 17C12 15.8742 12.3721 14.8353 13 13.9995V5M12 17C12 17.8254 12.2 18.604 12.5541 19.2901C11.7117 20.0018 9.76584 20.5 7.5 20.5C4.46243 20.5 2 19.6046 2 18.5V5M13 5C13 6.10457 10.5376 7 7.5 7C4.46243 7 2 6.10457 2 5M13 5C13 3.89543 10.5376 3 7.5 3C4.46243 3 2 3.89543 2 5M2 14C2 15.1046 4.46243 16 7.5 16C9.689 16 11.5793 15.535 12.4646 14.8618M13 9.5C13 10.6046 10.5376 11.5 7.5 11.5C4.46243 11.5 2 10.6046 2 9.5" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/financeAndECommerce/gold-coin.svg b/app/components/base/icons/assets/vender/line/financeAndECommerce/gold-coin.svg
new file mode 100644
index 0000000..798e5d0
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/financeAndECommerce/gold-coin.svg
@@ -0,0 +1,16 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_7056_1808)">
+<path d="M8.00003 4.82855L8.93639 6.72613L11.0303 7.03037L9.51518 8.50734L9.87276 10.5928L8.00003 9.60795L6.1273 10.5928L6.48488 8.50734L4.96973 7.03037L7.06367 6.72613L8.00003 4.82855Z" stroke="#344054" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M8.00016 14.6666C11.6821 14.6666 14.6668 11.6819 14.6668 7.99998C14.6668 4.31808 11.6821 1.33331 8.00016 1.33331C4.31826 1.33331 1.3335 4.31808 1.3335 7.99998C1.3335 11.6819 4.31826 14.6666 8.00016 14.6666Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M8.0001 12.8485C8.33482 12.8485 8.60616 12.5771 8.60616 12.2424C8.60616 11.9077 8.33482 11.6364 8.0001 11.6364C7.66539 11.6364 7.39404 11.9077 7.39404 12.2424C7.39404 12.5771 7.66539 12.8485 8.0001 12.8485Z" fill="#344054"/>
+<path d="M12.0348 9.91702C12.3695 9.91702 12.6408 9.64567 12.6408 9.31096C12.6408 8.97624 12.3695 8.7049 12.0348 8.7049C11.7001 8.7049 11.4287 8.97624 11.4287 9.31096C11.4287 9.64567 11.7001 9.91702 12.0348 9.91702Z" fill="#344054"/>
+<path d="M10.4933 5.17391C10.828 5.17391 11.0993 4.90257 11.0993 4.56785C11.0993 4.23313 10.828 3.96179 10.4933 3.96179C10.1585 3.96179 9.88721 4.23313 9.88721 4.56785C9.88721 4.90257 10.1585 5.17391 10.4933 5.17391Z" fill="#344054"/>
+<path d="M5.50645 5.17391C5.84117 5.17391 6.11251 4.90257 6.11251 4.56785C6.11251 4.23313 5.84117 3.96179 5.50645 3.96179C5.17173 3.96179 4.90039 4.23313 4.90039 4.56785C4.90039 4.90257 5.17173 5.17391 5.50645 5.17391Z" fill="#344054"/>
+<path d="M3.96544 9.91702C4.30015 9.91702 4.5715 9.64567 4.5715 9.31096C4.5715 8.97624 4.30015 8.7049 3.96544 8.7049C3.63072 8.7049 3.35938 8.97624 3.35938 9.31096C3.35938 9.64567 3.63072 9.91702 3.96544 9.91702Z" fill="#344054"/>
+</g>
+<defs>
+<clipPath id="clip0_7056_1808">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/financeAndECommerce/receipt-list.svg b/app/components/base/icons/assets/vender/line/financeAndECommerce/receipt-list.svg
new file mode 100644
index 0000000..2f7caeb
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/financeAndECommerce/receipt-list.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7.55556 8.33333H12M15.5556 8.33333H16.4444M7.55556 11.8889H12M15.5556 11.8889H16.4444M7.55556 15.4444H12M15.5556 15.4444H16.4444M20 21.6667V5C20 3.89543 19.1046 3 18 3H6C4.89543 3 4 3.89543 4 5V21.6667L6.66667 19.8889L9.33333 21.6667L12 19.8889L14.6667 21.6667L17.3333 19.8889L20 21.6667Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/financeAndECommerce/tag-01.svg b/app/components/base/icons/assets/vender/line/financeAndECommerce/tag-01.svg
new file mode 100644
index 0000000..286322d
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/financeAndECommerce/tag-01.svg
@@ -0,0 +1,10 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon" clip-path="url(#clip0_17795_9693)">
+<path id="Icon_2" d="M4.66699 4.6665H4.67283M1.16699 3.03317L1.16699 5.6433C1.16699 5.92866 1.16699 6.07134 1.19923 6.20561C1.22781 6.32465 1.27495 6.43845 1.33891 6.54284C1.41106 6.66057 1.51195 6.76146 1.71373 6.96324L6.18709 11.4366C6.88012 12.1296 7.22664 12.4761 7.62621 12.606C7.97769 12.7202 8.35629 12.7202 8.70777 12.606C9.10735 12.4761 9.45386 12.1296 10.1469 11.4366L11.4371 10.1464C12.1301 9.45337 12.4766 9.10686 12.6065 8.70728C12.7207 8.35581 12.7207 7.9772 12.6065 7.62572C12.4766 7.22615 12.1301 6.87963 11.4371 6.1866L6.96372 1.71324C6.76195 1.51146 6.66106 1.41057 6.54332 1.33842C6.43894 1.27446 6.32514 1.22732 6.20609 1.19874C6.07183 1.1665 5.92915 1.1665 5.64379 1.1665L3.03366 1.1665C2.38026 1.1665 2.05357 1.1665 1.804 1.29366C1.58448 1.40552 1.406 1.58399 1.29415 1.80352C1.16699 2.05308 1.16699 2.37978 1.16699 3.03317ZM4.95866 4.6665C4.95866 4.82759 4.82808 4.95817 4.66699 4.95817C4.50591 4.95817 4.37533 4.82759 4.37533 4.6665C4.37533 4.50542 4.50591 4.37484 4.66699 4.37484C4.82808 4.37484 4.95866 4.50542 4.95866 4.6665Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_17795_9693">
+<rect width="14" height="14" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/financeAndECommerce/tag-03.svg b/app/components/base/icons/assets/vender/line/financeAndECommerce/tag-03.svg
new file mode 100644
index 0000000..a8eeebf
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/financeAndECommerce/tag-03.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="tag-03">
+<path id="Icon" d="M14 7.3335L8.93726 2.27075C8.59135 1.92485 8.4184 1.7519 8.21657 1.62822C8.03762 1.51856 7.84254 1.43775 7.63846 1.38876C7.40829 1.3335 7.16369 1.3335 6.67452 1.3335L4 1.3335M2 5.80016L2 7.11651C2 7.44263 2 7.60569 2.03684 7.75914C2.0695 7.89519 2.12337 8.02525 2.19648 8.14454C2.27894 8.2791 2.39424 8.3944 2.62484 8.625L7.82484 13.825C8.35286 14.353 8.61687 14.617 8.92131 14.716C9.1891 14.803 9.47757 14.803 9.74536 14.716C10.0498 14.617 10.3138 14.353 10.8418 13.825L12.4915 12.1753C13.0195 11.6473 13.2835 11.3833 13.3825 11.0789C13.4695 10.8111 13.4695 10.5226 13.3825 10.2548C13.2835 9.95037 13.0195 9.68636 12.4915 9.15834L7.62484 4.29167C7.39424 4.06107 7.27894 3.94577 7.14438 3.86331C7.02508 3.7902 6.89502 3.73633 6.75898 3.70367C6.60553 3.66683 6.44247 3.66683 6.11634 3.66683H4.13333C3.3866 3.66683 3.01323 3.66683 2.72801 3.81215C2.47713 3.93999 2.27316 4.14396 2.14532 4.39484C2 4.68006 2 5.05343 2 5.80016Z" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/at-sign.svg b/app/components/base/icons/assets/vender/line/general/at-sign.svg
new file mode 100644
index 0000000..c88c4ee
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/at-sign.svg
@@ -0,0 +1,10 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="at-sign" clip-path="url(#clip0_8902_1909)">
+<path id="Icon" d="M10.6666 5.33333V8.66666C10.6666 9.19709 10.8773 9.7058 11.2524 10.0809C11.6275 10.4559 12.1362 10.6667 12.6666 10.6667C13.197 10.6667 13.7057 10.4559 14.0808 10.0809C14.4559 9.7058 14.6666 9.19709 14.6666 8.66666V7.99999C14.6665 6.49535 14.1574 5.03498 13.2221 3.85635C12.2868 2.67772 10.9803 1.85014 9.51502 1.50819C8.04974 1.16624 6.51188 1.33002 5.15149 1.9729C3.7911 2.61579 2.68819 3.69996 2.0221 5.04914C1.356 6.39832 1.1659 7.93315 1.4827 9.40407C1.7995 10.875 2.60458 12.1955 3.76701 13.1508C4.92945 14.1062 6.38088 14.6402 7.8853 14.6661C9.38973 14.692 10.8587 14.2082 12.0533 13.2933M10.6666 7.99999C10.6666 9.47275 9.47269 10.6667 7.99993 10.6667C6.52717 10.6667 5.33326 9.47275 5.33326 7.99999C5.33326 6.52723 6.52717 5.33333 7.99993 5.33333C9.47269 5.33333 10.6666 6.52723 10.6666 7.99999Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_8902_1909">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/bookmark.svg b/app/components/base/icons/assets/vender/line/general/bookmark.svg
new file mode 100644
index 0000000..576abcd
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/bookmark.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5 7.8C5 6.11984 5 5.27976 5.32698 4.63803C5.6146 4.07354 6.07354 3.6146 6.63803 3.32698C7.27976 3 8.11984 3 9.8 3H14.2C15.8802 3 16.7202 3 17.362 3.32698C17.9265 3.6146 18.3854 4.07354 18.673 4.63803C19 5.27976 19 6.11984 19 7.8V21L12 17L5 21V7.8Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/check-done-01.svg b/app/components/base/icons/assets/vender/line/general/check-done-01.svg
new file mode 100644
index 0000000..6603f3d
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/check-done-01.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="check-done-01">
+<path id="Icon" d="M6 15L8 17L12.5 12.5M8 8V5.2C8 4.0799 8 3.51984 8.21799 3.09202C8.40973 2.71569 8.71569 2.40973 9.09202 2.21799C9.51984 2 10.0799 2 11.2 2H18.8C19.9201 2 20.4802 2 20.908 2.21799C21.2843 2.40973 21.5903 2.71569 21.782 3.09202C22 3.51984 22 4.0799 22 5.2V12.8C22 13.9201 22 14.4802 21.782 14.908C21.5903 15.2843 21.2843 15.5903 20.908 15.782C20.4802 16 19.9201 16 18.8 16H16M5.2 22H12.8C13.9201 22 14.4802 22 14.908 21.782C15.2843 21.5903 15.5903 21.2843 15.782 20.908C16 20.4802 16 19.9201 16 18.8V11.2C16 10.0799 16 9.51984 15.782 9.09202C15.5903 8.71569 15.2843 8.40973 14.908 8.21799C14.4802 8 13.9201 8 12.8 8H5.2C4.0799 8 3.51984 8 3.09202 8.21799C2.71569 8.40973 2.40973 8.71569 2.21799 9.09202C2 9.51984 2 10.0799 2 11.2V18.8C2 19.9201 2 20.4802 2.21799 20.908C2.40973 21.2843 2.71569 21.5903 3.09202 21.782C3.51984 22 4.07989 22 5.2 22Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/check.svg b/app/components/base/icons/assets/vender/line/general/check.svg
new file mode 100644
index 0000000..4fe24c8
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/check.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="check">
+<path id="Icon" d="M13.3334 4L6.00008 11.3333L2.66675 8" stroke="#155EEF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/checklist-square.svg b/app/components/base/icons/assets/vender/line/general/checklist-square.svg
new file mode 100644
index 0000000..8fdddfa
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/checklist-square.svg
@@ -0,0 +1,5 @@
+<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="checklist-square">
+<path id="Vector" d="M9.7823 11.9146C9.32278 11.6082 8.70191 11.7324 8.39554 12.1919C8.08918 12.6514 8.21333 13.2723 8.67285 13.5787L9.7823 11.9146ZM10.9151 13.8717L10.3603 14.7037C10.8019 14.9982 11.3966 14.8963 11.7151 14.4717L10.9151 13.8717ZM14.5226 10.7284C14.8539 10.2865 14.7644 9.65973 14.3225 9.32836C13.8807 8.99699 13.2539 9.08653 12.9225 9.52836L14.5226 10.7284ZM19.3333 11C18.781 11 18.3333 11.4477 18.3333 12C18.3333 12.5523 18.781 13 19.3333 13V11ZM22 13C22.5523 13 23 12.5523 23 12C23 11.4477 22.5523 11 22 11V13ZM19.3333 19C18.781 19 18.3333 19.4477 18.3333 20C18.3333 20.5523 18.781 21 19.3333 21V19ZM22 21C22.5523 21 23 20.5523 23 20C23 19.4477 22.5523 19 22 19V21ZM9.86913 19.9163C9.4096 19.6099 8.78873 19.7341 8.48238 20.1937C8.17602 20.6532 8.3002 21.274 8.75973 21.5804L9.86913 19.9163ZM11.0019 21.8734L10.4472 22.7054C10.8888 22.9998 11.4835 22.8979 11.8019 22.4734L11.0019 21.8734ZM14.6094 18.7301C14.9408 18.2883 14.8512 17.6615 14.4094 17.3301C13.9676 16.9987 13.3408 17.0883 13.0094 17.5301L14.6094 18.7301ZM6.18404 27.564L5.73005 28.455H5.73005L6.18404 27.564ZM4.43597 25.816L3.54497 26.27H3.54497L4.43597 25.816ZM27.564 25.816L28.455 26.27L27.564 25.816ZM25.816 27.564L26.27 28.455L25.816 27.564ZM25.816 4.43597L26.27 3.54497V3.54497L25.816 4.43597ZM27.564 6.18404L28.455 5.73005V5.73005L27.564 6.18404ZM6.18404 4.43597L5.73005 3.54497L6.18404 4.43597ZM4.43597 6.18404L3.54497 5.73005L4.43597 6.18404ZM8.67285 13.5787L10.3603 14.7037L11.4698 13.0397L9.7823 11.9146L8.67285 13.5787ZM11.7151 14.4717L14.5226 10.7284L12.9225 9.52836L10.1151 13.2717L11.7151 14.4717ZM19.3333 13H22V11H19.3333V13ZM19.3333 21H22V19H19.3333V21ZM8.75973 21.5804L10.4472 22.7054L11.5566 21.0413L9.86913 19.9163L8.75973 21.5804ZM11.8019 22.4734L14.6094 18.7301L13.0094 17.5301L10.2019 21.2733L11.8019 22.4734ZM10.4 5H21.6V3H10.4V5ZM27 10.4V21.6H29V10.4H27ZM21.6 27H10.4V29H21.6V27ZM5 21.6V10.4H3V21.6H5ZM10.4 27C9.26339 27 8.47108 26.9992 7.85424 26.9488C7.24907 26.8994 6.90138 26.8072 6.63803 26.673L5.73005 28.455C6.32234 28.7568 6.96253 28.8826 7.69138 28.9422C8.40855 29.0008 9.2964 29 10.4 29V27ZM3 21.6C3 22.7036 2.99922 23.5914 3.05782 24.3086C3.11737 25.0375 3.24318 25.6777 3.54497 26.27L5.32698 25.362C5.19279 25.0986 5.10062 24.7509 5.05118 24.1458C5.00078 23.5289 5 22.7366 5 21.6H3ZM6.63803 26.673C6.07354 26.3854 5.6146 25.9265 5.32698 25.362L3.54497 26.27C4.02433 27.2108 4.78924 27.9757 5.73005 28.455L6.63803 26.673ZM27 21.6C27 22.7366 26.9992 23.5289 26.9488 24.1458C26.8994 24.7509 26.8072 25.0986 26.673 25.362L28.455 26.27C28.7568 25.6777 28.8826 25.0375 28.9422 24.3086C29.0008 23.5914 29 22.7036 29 21.6H27ZM21.6 29C22.7036 29 23.5914 29.0008 24.3086 28.9422C25.0375 28.8826 25.6777 28.7568 26.27 28.455L25.362 26.673C25.0986 26.8072 24.7509 26.8994 24.1458 26.9488C23.5289 26.9992 22.7366 27 21.6 27V29ZM26.673 25.362C26.3854 25.9265 25.9265 26.3854 25.362 26.673L26.27 28.455C27.2108 27.9757 27.9757 27.2108 28.455 26.27L26.673 25.362ZM21.6 5C22.7366 5 23.5289 5.00078 24.1458 5.05118C24.7509 5.10062 25.0986 5.19279 25.362 5.32698L26.27 3.54497C25.6777 3.24318 25.0375 3.11737 24.3086 3.05782C23.5914 2.99922 22.7036 3 21.6 3V5ZM29 10.4C29 9.2964 29.0008 8.40855 28.9422 7.69138C28.8826 6.96253 28.7568 6.32234 28.455 5.73005L26.673 6.63803C26.8072 6.90138 26.8994 7.24907 26.9488 7.85424C26.9992 8.47108 27 9.26339 27 10.4H29ZM25.362 5.32698C25.9265 5.6146 26.3854 6.07354 26.673 6.63803L28.455 5.73005C27.9757 4.78924 27.2108 4.02433 26.27 3.54497L25.362 5.32698ZM10.4 3C9.2964 3 8.40855 2.99922 7.69138 3.05782C6.96253 3.11737 6.32234 3.24318 5.73005 3.54497L6.63803 5.32698C6.90138 5.19279 7.24907 5.10062 7.85424 5.05118C8.47108 5.00078 9.26339 5 10.4 5V3ZM5 10.4C5 9.26339 5.00078 8.47108 5.05118 7.85424C5.10062 7.24907 5.19279 6.90138 5.32698 6.63803L3.54497 5.73005C3.24318 6.32234 3.11737 6.96253 3.05782 7.69138C2.99922 8.40855 3 9.2964 3 10.4H5ZM5.73005 3.54497C4.78924 4.02433 4.02433 4.78924 3.54497 5.73005L5.32698 6.63803C5.6146 6.07354 6.07354 5.6146 6.63803 5.32698L5.73005 3.54497Z" fill="#D0D5DD"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/dots-grid.svg b/app/components/base/icons/assets/vender/line/general/dots-grid.svg
new file mode 100644
index 0000000..b572f6a
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/dots-grid.svg
@@ -0,0 +1,15 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon">
+<g id="Solid">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.83333 2.91667C5.83333 2.27233 6.35567 1.75 7 1.75C7.64433 1.75 8.16667 2.27233 8.16667 2.91667C8.16667 3.561 7.64433 4.08333 7 4.08333C6.35567 4.08333 5.83333 3.561 5.83333 2.91667Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.83333 7C5.83333 6.35567 6.35567 5.83333 7 5.83333C7.64433 5.83333 8.16667 6.35567 8.16667 7C8.16667 7.64433 7.64433 8.16667 7 8.16667C6.35567 8.16667 5.83333 7.64433 5.83333 7Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.83333 11.0833C5.83333 10.439 6.35567 9.91667 7 9.91667C7.64433 9.91667 8.16667 10.439 8.16667 11.0833C8.16667 11.7277 7.64433 12.25 7 12.25C6.35567 12.25 5.83333 11.7277 5.83333 11.0833Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.91667 2.91667C9.91667 2.27233 10.439 1.75 11.0833 1.75C11.7277 1.75 12.25 2.27233 12.25 2.91667C12.25 3.561 11.7277 4.08333 11.0833 4.08333C10.439 4.08333 9.91667 3.561 9.91667 2.91667Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.91667 7C9.91667 6.35567 10.439 5.83333 11.0833 5.83333C11.7277 5.83333 12.25 6.35567 12.25 7C12.25 7.64433 11.7277 8.16667 11.0833 8.16667C10.439 8.16667 9.91667 7.64433 9.91667 7Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.91667 11.0833C9.91667 10.439 10.439 9.91667 11.0833 9.91667C11.7277 9.91667 12.25 10.439 12.25 11.0833C12.25 11.7277 11.7277 12.25 11.0833 12.25C10.439 12.25 9.91667 11.7277 9.91667 11.0833Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.75 2.91667C1.75 2.27233 2.27233 1.75 2.91667 1.75C3.561 1.75 4.08333 2.27233 4.08333 2.91667C4.08333 3.561 3.561 4.08333 2.91667 4.08333C2.27233 4.08333 1.75 3.561 1.75 2.91667Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.75 7C1.75 6.35567 2.27233 5.83333 2.91667 5.83333C3.561 5.83333 4.08333 6.35567 4.08333 7C4.08333 7.64433 3.561 8.16667 2.91667 8.16667C2.27233 8.16667 1.75 7.64433 1.75 7Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.75 11.0833C1.75 10.439 2.27233 9.91667 2.91667 9.91667C3.561 9.91667 4.08333 10.439 4.08333 11.0833C4.08333 11.7277 3.561 12.25 2.91667 12.25C2.27233 12.25 1.75 11.7277 1.75 11.0833Z" fill="#155EEF"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/edit-02.svg b/app/components/base/icons/assets/vender/line/general/edit-02.svg
new file mode 100644
index 0000000..6a209c8
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/edit-02.svg
@@ -0,0 +1,10 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Left Icon" clip-path="url(#clip0_12284_22440)">
+<path id="Icon" d="M10.5007 5.83319L8.16733 3.49985M1.45898 12.5415L3.4332 12.3222C3.6744 12.2954 3.795 12.282 3.90773 12.2455C4.00774 12.2131 4.10291 12.1673 4.19067 12.1095C4.28958 12.0443 4.37539 11.9585 4.54699 11.7868L12.2507 4.08319C12.895 3.43885 12.895 2.39418 12.2507 1.74985C11.6063 1.10552 10.5617 1.10552 9.91733 1.74985L2.21366 9.45351C2.04205 9.62512 1.95625 9.71092 1.89102 9.80983C1.83315 9.89759 1.78741 9.99277 1.75503 10.0928C1.71854 10.2055 1.70514 10.3261 1.67834 10.5673L1.45898 12.5415Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_12284_22440">
+<rect width="14" height="14" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/edit-04.svg b/app/components/base/icons/assets/vender/line/general/edit-04.svg
new file mode 100644
index 0000000..9318930
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/edit-04.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M21 18L19.9999 19.094C19.4695 19.6741 18.7502 20 18.0002 20C17.2501 20 16.5308 19.6741 16.0004 19.094C15.4693 18.5151 14.75 18.1901 14.0002 18.1901C13.2504 18.1901 12.5312 18.5151 12 19.094M3.00003 20H4.67457C5.16376 20 5.40835 20 5.63852 19.9447C5.84259 19.8957 6.03768 19.8149 6.21663 19.7053C6.41846 19.5816 6.59141 19.4086 6.93732 19.0627L19.5001 6.49998C20.3285 5.67156 20.3285 4.32841 19.5001 3.49998C18.6716 2.67156 17.3285 2.67156 16.5001 3.49998L3.93729 16.0627C3.59139 16.4086 3.41843 16.5816 3.29475 16.7834C3.18509 16.9624 3.10428 17.1574 3.05529 17.3615C3.00003 17.5917 3.00003 17.8363 3.00003 18.3255V20Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/edit-05.svg b/app/components/base/icons/assets/vender/line/general/edit-05.svg
new file mode 100644
index 0000000..4328c4b
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/edit-05.svg
@@ -0,0 +1,10 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="edit-05" clip-path="url(#clip0_17249_52683)">
+<path id="Icon" d="M7.33325 2.66617H4.53325C3.41315 2.66617 2.85309 2.66617 2.42527 2.88415C2.04895 3.0759 1.74299 3.38186 1.55124 3.75819C1.33325 4.18601 1.33325 4.74606 1.33325 5.86617V11.4662C1.33325 12.5863 1.33325 13.1463 1.55124 13.5741C1.74299 13.9505 2.04895 14.2564 2.42527 14.4482C2.85309 14.6662 3.41315 14.6662 4.53325 14.6662H10.1333C11.2534 14.6662 11.8134 14.6662 12.2412 14.4482C12.6176 14.2564 12.9235 13.9505 13.1153 13.5741C13.3333 13.1463 13.3333 12.5863 13.3333 11.4662V8.66617M5.33323 10.6662H6.4496C6.77572 10.6662 6.93878 10.6662 7.09223 10.6293C7.22828 10.5967 7.35834 10.5428 7.47763 10.4697C7.61219 10.3872 7.72749 10.2719 7.95809 10.0413L14.3333 3.66617C14.8855 3.11388 14.8855 2.21845 14.3333 1.66617C13.781 1.11388 12.8855 1.11388 12.3333 1.66617L5.95808 8.04133C5.72747 8.27193 5.61217 8.38723 5.52971 8.52179C5.45661 8.64108 5.40274 8.77114 5.37007 8.90719C5.33323 9.06064 5.33323 9.2237 5.33323 9.54982V10.6662Z" stroke="#155EEF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_17249_52683">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/hash-02.svg b/app/components/base/icons/assets/vender/line/general/hash-02.svg
new file mode 100644
index 0000000..bc7a9dd
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/hash-02.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="hash-02">
+<path id="Icon" d="M4.74999 1.5L3.24999 10.5M8.74998 1.5L7.24998 10.5M10.25 4H1.75M9.75 8H1.25" stroke="#98A2B3" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/info-circle.svg b/app/components/base/icons/assets/vender/line/general/info-circle.svg
new file mode 100644
index 0000000..1c0e19c
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/info-circle.svg
@@ -0,0 +1,10 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="info-circle" clip-path="url(#clip0_7880_62014)">
+<path id="Icon" d="M6 8V6M6 4H6.005M11 6C11 8.76142 8.76142 11 6 11C3.23858 11 1 8.76142 1 6C1 3.23858 3.23858 1 6 1C8.76142 1 11 3.23858 11 6Z" stroke="#98A2B3" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_7880_62014">
+<rect width="12" height="12" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/link-03.svg b/app/components/base/icons/assets/vender/line/general/link-03.svg
new file mode 100644
index 0000000..7749dab
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/link-03.svg
@@ -0,0 +1,8 @@
+<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="link-03">
+<g id="Solid">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.01569 1.83378C9.7701 1.10515 10.7805 0.701975 11.8293 0.711089C12.8781 0.720202 13.8813 1.14088 14.623 1.88251C15.3646 2.62414 15.7853 3.62739 15.7944 4.67618C15.8035 5.72497 15.4003 6.73538 14.6717 7.48979L14.6636 7.49805L12.6637 9.49796C12.2581 9.90362 11.7701 10.2173 11.2327 10.4178C10.6953 10.6183 10.1211 10.7008 9.54897 10.6598C8.97686 10.6189 8.42025 10.4553 7.91689 10.1803C7.41354 9.90531 6.97522 9.52527 6.63165 9.06596C6.41112 8.77113 6.47134 8.35334 6.76618 8.1328C7.06101 7.91226 7.4788 7.97249 7.69934 8.26732C7.92838 8.57353 8.2206 8.82689 8.55617 9.01023C8.89174 9.19356 9.26281 9.30259 9.64422 9.3299C10.0256 9.35722 10.4085 9.30219 10.7667 9.16854C11.125 9.0349 11.4503 8.82576 11.7207 8.55532L13.7164 6.55956C14.1998 6.05705 14.4672 5.38513 14.4611 4.68777C14.455 3.98857 14.1746 3.31974 13.6802 2.82532C13.1857 2.3309 12.5169 2.05045 11.8177 2.04437C11.12 2.03831 10.4478 2.30591 9.94526 2.78967L8.80219 3.92609C8.54108 4.18568 8.11898 4.18445 7.85939 3.92334C7.5998 3.66223 7.60103 3.24012 7.86214 2.98053L9.0088 1.84053L9.01569 1.83378Z" fill="#667085"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.76493 5.58217C6.30234 5.3817 6.87657 5.29915 7.44869 5.34012C8.0208 5.3811 8.57741 5.54463 9.08077 5.81964C9.58412 6.09465 10.0224 6.47469 10.366 6.93399C10.5865 7.22882 10.5263 7.64662 10.2315 7.86715C9.93665 8.08769 9.51886 8.02746 9.29832 7.73263C9.06928 7.42643 8.77706 7.17307 8.44149 6.98973C8.10592 6.80639 7.73485 6.69737 7.35344 6.67005C6.97203 6.64274 6.58921 6.69777 6.23094 6.83141C5.87266 6.96506 5.54733 7.17419 5.27699 7.44463L3.28123 9.44039C2.79787 9.94291 2.5305 10.6148 2.53656 11.3122C2.54263 12.0114 2.82309 12.6802 3.31751 13.1746C3.81193 13.6691 4.48076 13.9495 5.17995 13.9556C5.87732 13.9616 6.54923 13.6943 7.05174 13.2109L8.18743 12.0752C8.44777 11.8149 8.86988 11.8149 9.13023 12.0752C9.39058 12.3356 9.39058 12.7577 9.13023 13.018L7.99023 14.158L7.98197 14.1662C7.22756 14.8948 6.21715 15.298 5.16837 15.2889C4.11958 15.2798 3.11633 14.8591 2.3747 14.1174C1.63307 13.3758 1.21239 12.3726 1.20328 11.3238C1.19416 10.275 1.59734 9.26458 2.32597 8.51017L2.33409 8.50191L4.33401 6.50199C4.33398 6.50202 4.33404 6.50196 4.33401 6.50199C4.7395 6.09638 5.22756 5.78262 5.76493 5.58217Z" fill="#667085"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/link-external-02.svg b/app/components/base/icons/assets/vender/line/general/link-external-02.svg
new file mode 100644
index 0000000..71936fb
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/link-external-02.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="link-external-02">
+<path id="Icon" d="M10.5 4.5L10.5 1.5M10.5 1.5H7.49999M10.5 1.5L6 6M5 1.5H3.9C3.05992 1.5 2.63988 1.5 2.31901 1.66349C2.03677 1.8073 1.8073 2.03677 1.66349 2.31901C1.5 2.63988 1.5 3.05992 1.5 3.9V8.1C1.5 8.94008 1.5 9.36012 1.66349 9.68099C1.8073 9.96323 2.03677 10.1927 2.31901 10.3365C2.63988 10.5 3.05992 10.5 3.9 10.5H8.1C8.94008 10.5 9.36012 10.5 9.68099 10.3365C9.96323 10.1927 10.1927 9.96323 10.3365 9.68099C10.5 9.36012 10.5 8.94008 10.5 8.1V7" stroke="#155EEF" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/log-in-04.svg b/app/components/base/icons/assets/vender/line/general/log-in-04.svg
new file mode 100644
index 0000000..f18c50c
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/log-in-04.svg
@@ -0,0 +1,8 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="log-in-04">
+<g id="Solid">
+<path d="M8.00016 1.99984C5.78015 1.99984 3.84088 3.20518 2.80244 5.00032C2.61808 5.31903 2.21026 5.42794 1.89155 5.24357C1.57285 5.05921 1.46394 4.65139 1.6483 4.33269C2.91526 2.14249 5.28495 0.666504 8.00016 0.666504C12.0502 0.666504 15.3335 3.94975 15.3335 7.99984C15.3335 12.0499 12.0502 15.3332 8.00016 15.3332C5.28495 15.3332 2.91526 13.8572 1.6483 11.667C1.46394 11.3483 1.57285 10.9405 1.89155 10.7561C2.21026 10.5717 2.61808 10.6806 2.80244 10.9994C3.84088 12.7945 5.78015 13.9998 8.00016 13.9998C11.3139 13.9998 14.0002 11.3135 14.0002 7.99984C14.0002 4.68613 11.3139 1.99984 8.00016 1.99984Z" fill="#344054"/>
+<path d="M7.52876 4.86177C7.78911 4.60142 8.21122 4.60142 8.47157 4.86177L11.1382 7.52843C11.3986 7.78878 11.3986 8.21089 11.1382 8.47124L8.47157 11.1379C8.21122 11.3983 7.78911 11.3983 7.52876 11.1379C7.26841 10.8776 7.26841 10.4554 7.52876 10.1951L9.05735 8.6665H2.00016C1.63197 8.6665 1.3335 8.36803 1.3335 7.99984C1.3335 7.63165 1.63197 7.33317 2.00016 7.33317H9.05735L7.52876 5.80457C7.26841 5.54423 7.26841 5.12212 7.52876 4.86177Z" fill="#344054"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/log-out-01.svg b/app/components/base/icons/assets/vender/line/general/log-out-01.svg
new file mode 100644
index 0000000..f1789d7
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/log-out-01.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="log-out-01">
+<path id="Icon" d="M9.33333 9.91667L12.25 7M12.25 7L9.33333 4.08333M12.25 7H5.25M5.25 1.75H4.55C3.56991 1.75 3.07986 1.75 2.70552 1.94074C2.37623 2.10852 2.10852 2.37623 1.94074 2.70552C1.75 3.07986 1.75 3.56991 1.75 4.55V9.45C1.75 10.4301 1.75 10.9201 1.94074 11.2945C2.10852 11.6238 2.37623 11.8915 2.70552 12.0593C3.07986 12.25 3.56991 12.25 4.55 12.25H5.25" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/log-out-04.svg b/app/components/base/icons/assets/vender/line/general/log-out-04.svg
new file mode 100644
index 0000000..317023e
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/log-out-04.svg
@@ -0,0 +1,8 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="log-out-04">
+<g id="Solid">
+<path d="M0.666504 8.00016C0.666504 4.3422 3.52829 1.3335 7.11095 1.3335C8.28872 1.3335 9.3935 1.66091 10.3431 2.23137C10.6588 2.42097 10.7609 2.83053 10.5713 3.14615C10.3817 3.46177 9.97216 3.56394 9.65654 3.37434C8.90651 2.92378 8.03794 2.66683 7.11095 2.66683C4.31165 2.66683 1.99984 5.03071 1.99984 8.00016C1.99984 10.9696 4.31165 13.3335 7.11095 13.3335C8.03794 13.3335 8.90651 13.0765 9.65654 12.626C9.97216 12.4364 10.3817 12.5386 10.5713 12.8542C10.7609 13.1698 10.6588 13.5794 10.3431 13.769C9.3935 14.3394 8.28872 14.6668 7.11095 14.6668C3.52829 14.6668 0.666504 11.6581 0.666504 8.00016Z" fill="#98A2B3"/>
+<path d="M11.5284 4.86209C11.7888 4.60174 12.2109 4.60174 12.4712 4.86209L15.1379 7.52876C15.3983 7.78911 15.3983 8.21122 15.1379 8.47157L12.4712 11.1382C12.2109 11.3986 11.7888 11.3986 11.5284 11.1382C11.2681 10.8779 11.2681 10.4558 11.5284 10.1954L13.057 8.66683H5.99984C5.63165 8.66683 5.33317 8.36835 5.33317 8.00016C5.33317 7.63197 5.63165 7.3335 5.99984 7.3335H13.057L11.5284 5.8049C11.2681 5.54455 11.2681 5.12244 11.5284 4.86209Z" fill="#98A2B3"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/menu-01.svg b/app/components/base/icons/assets/vender/line/general/menu-01.svg
new file mode 100644
index 0000000..d540518
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/menu-01.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="menu-01">
+<path id="Icon" d="M2 8H14M2 4H14M2 12H14" stroke="#344054" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/pin-01.svg b/app/components/base/icons/assets/vender/line/general/pin-01.svg
new file mode 100644
index 0000000..314a582
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/pin-01.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="pin-01">
+<path id="Icon" d="M8.00037 10.0007L8.00037 14.6673M5.3337 4.87274V6.29315C5.3337 6.43183 5.3337 6.50117 5.32009 6.56749C5.30801 6.62633 5.28804 6.68327 5.26071 6.73677C5.22991 6.79706 5.18659 6.8512 5.09996 6.95949L4.05344 8.26764C3.60962 8.82242 3.3877 9.09982 3.38745 9.33326C3.38723 9.53629 3.47954 9.72835 3.63822 9.85501C3.82067 10.0007 4.1759 10.0007 4.88637 10.0007H11.1144C11.8248 10.0007 12.1801 10.0007 12.3625 9.85501C12.5212 9.72835 12.6135 9.53629 12.6133 9.33326C12.613 9.09982 12.3911 8.82242 11.9473 8.26764L10.9008 6.95949C10.8141 6.8512 10.7708 6.79706 10.74 6.73677C10.7127 6.68327 10.6927 6.62633 10.6806 6.56749C10.667 6.50117 10.667 6.43183 10.667 6.29315V4.87274C10.667 4.79599 10.667 4.75761 10.6714 4.71977C10.6752 4.68615 10.6816 4.65287 10.6905 4.62023C10.7006 4.58348 10.7148 4.54785 10.7433 4.47659L11.4152 2.7968C11.6113 2.30674 11.7093 2.06171 11.6684 1.86502C11.6327 1.693 11.5305 1.54206 11.384 1.44499C11.2166 1.33398 10.9527 1.33398 10.4249 1.33398H5.57587C5.04806 1.33398 4.78416 1.33398 4.61671 1.44499C4.47027 1.54206 4.36808 1.693 4.33233 1.86502C4.29146 2.06171 4.38947 2.30674 4.58549 2.7968L5.25741 4.47659C5.28591 4.54785 5.30017 4.58348 5.31019 4.62023C5.3191 4.65287 5.32551 4.68615 5.32936 4.71977C5.3337 4.75761 5.3337 4.79599 5.3337 4.87274Z" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/pin-02.svg b/app/components/base/icons/assets/vender/line/general/pin-02.svg
new file mode 100644
index 0000000..023e6e4
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/pin-02.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8.3767 15.6163L2.71985 21.2732M11.6944 6.64181L10.1335 8.2027C10.0062 8.33003 9.94252 8.39369 9.86999 8.44427C9.80561 8.48917 9.73616 8.52634 9.66309 8.555C9.58077 8.58729 9.49249 8.60495 9.31592 8.64026L5.65145 9.37315C4.69915 9.56361 4.223 9.65884 4.00024 9.9099C3.80617 10.1286 3.71755 10.4213 3.75771 10.7109C3.8038 11.0434 4.14715 11.3867 4.83387 12.0735L11.9196 19.1592C12.6063 19.8459 12.9497 20.1893 13.2821 20.2354C13.5718 20.2755 13.8645 20.1869 14.0832 19.9928C14.3342 19.7701 14.4294 19.2939 14.6199 18.3416L15.3528 14.6771C15.3881 14.5006 15.4058 14.4123 15.4381 14.33C15.4667 14.2569 15.5039 14.1875 15.5488 14.1231C15.5994 14.0505 15.663 13.9869 15.7904 13.8596L17.3512 12.2987C17.4326 12.2173 17.4734 12.1766 17.5181 12.141C17.5578 12.1095 17.5999 12.081 17.644 12.0558C17.6936 12.0274 17.7465 12.0048 17.8523 11.9594L20.3467 10.8904C21.0744 10.5785 21.4383 10.4226 21.6035 10.1706C21.7481 9.95025 21.7998 9.68175 21.7474 9.42348C21.6875 9.12813 21.4076 8.84822 20.8478 8.28839L15.7047 3.14526C15.1448 2.58543 14.8649 2.30552 14.5696 2.24565C14.3113 2.19329 14.0428 2.245 13.8225 2.38953C13.5705 2.55481 13.4145 2.91866 13.1027 3.64636L12.0337 6.14071C11.9883 6.24653 11.9656 6.29944 11.9373 6.34905C11.9121 6.39313 11.8836 6.43522 11.852 6.47496C11.8165 6.51971 11.7758 6.56041 11.6944 6.64181Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/plus-02.svg b/app/components/base/icons/assets/vender/line/general/plus-02.svg
new file mode 100644
index 0000000..4358325
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/plus-02.svg
@@ -0,0 +1,5 @@
+<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="plus">
+<path id="Icon" d="M5.00004 2.08325V7.91659M2.08337 4.99992H7.91671" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/refresh.svg b/app/components/base/icons/assets/vender/line/general/refresh.svg
new file mode 100644
index 0000000..05cf986
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/refresh.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M5.46257 4.43262C7.21556 2.91688 9.5007 2 12 2C17.5228 2 22 6.47715 22 12C22 14.1361 21.3302 16.1158 20.1892 17.7406L17 12H20C20 7.58172 16.4183 4 12 4C9.84982 4 7.89777 4.84827 6.46023 6.22842L5.46257 4.43262ZM18.5374 19.5674C16.7844 21.0831 14.4993 22 12 22C6.47715 22 2 17.5228 2 12C2 9.86386 2.66979 7.88416 3.8108 6.25944L7 12H4C4 16.4183 7.58172 20 12 20C14.1502 20 16.1022 19.1517 17.5398 17.7716L18.5374 19.5674Z"></path></svg>
\ No newline at end of file
diff --git a/app/components/base/icons/assets/vender/line/general/settings-01.svg b/app/components/base/icons/assets/vender/line/general/settings-01.svg
new file mode 100644
index 0000000..db8cbd1
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/settings-01.svg
@@ -0,0 +1,13 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Left Icon" clip-path="url(#clip0_11961_30603)">
+<g id="Icon">
+<path d="M6.99935 8.74984C7.96585 8.74984 8.74935 7.96634 8.74935 6.99984C8.74935 6.03334 7.96585 5.24984 6.99935 5.24984C6.03285 5.24984 5.24935 6.03334 5.24935 6.99984C5.24935 7.96634 6.03285 8.74984 6.99935 8.74984Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M10.9236 8.59075C10.853 8.75069 10.8319 8.92812 10.8631 9.10015C10.8943 9.27218 10.9763 9.43092 11.0986 9.5559L11.1304 9.58772C11.229 9.68622 11.3073 9.80319 11.3606 9.93195C11.414 10.0607 11.4415 10.1987 11.4415 10.3381C11.4415 10.4775 11.414 10.6155 11.3606 10.7442C11.3073 10.873 11.229 10.99 11.1304 11.0885C11.0319 11.1871 10.9149 11.2653 10.7862 11.3187C10.6574 11.3721 10.5194 11.3995 10.38 11.3995C10.2407 11.3995 10.1026 11.3721 9.97388 11.3187C9.84513 11.2653 9.72815 11.1871 9.62965 11.0885L9.59783 11.0567C9.47285 10.9344 9.31411 10.8524 9.14209 10.8212C8.97006 10.79 8.79263 10.8111 8.63268 10.8817C8.47583 10.9489 8.34207 11.0605 8.24785 11.2028C8.15362 11.345 8.10306 11.5118 8.10238 11.6824V11.7726C8.10238 12.0539 7.99064 12.3236 7.79173 12.5225C7.59283 12.7214 7.32306 12.8332 7.04177 12.8332C6.76048 12.8332 6.49071 12.7214 6.29181 12.5225C6.09291 12.3236 5.98117 12.0539 5.98117 11.7726V11.7248C5.97706 11.5493 5.92025 11.3791 5.8181 11.2363C5.71596 11.0935 5.57322 10.9847 5.40844 10.9241C5.24849 10.8535 5.07106 10.8324 4.89904 10.8636C4.72701 10.8948 4.56827 10.9768 4.44329 11.0991L4.41147 11.1309C4.31297 11.2295 4.196 11.3077 4.06724 11.3611C3.93848 11.4145 3.80047 11.442 3.66109 11.442C3.52171 11.442 3.3837 11.4145 3.25494 11.3611C3.12619 11.3077 3.00921 11.2295 2.91071 11.1309C2.8121 11.0324 2.73387 10.9154 2.6805 10.7867C2.62712 10.6579 2.59965 10.5199 2.59965 10.3805C2.59965 10.2411 2.62712 10.1031 2.6805 9.97437C2.73387 9.84561 2.8121 9.72864 2.91071 9.63014L2.94253 9.59832C3.06479 9.47334 3.1468 9.3146 3.17799 9.14257C3.20918 8.97055 3.18812 8.79312 3.11753 8.63317C3.05031 8.47632 2.93869 8.34256 2.79641 8.24833C2.65414 8.15411 2.48742 8.10355 2.31677 8.10287H2.22662C1.94533 8.10287 1.67556 7.99112 1.47666 7.79222C1.27776 7.59332 1.16602 7.32355 1.16602 7.04226C1.16602 6.76097 1.27776 6.4912 1.47666 6.2923C1.67556 6.0934 1.94533 5.98166 2.22662 5.98166H2.27435C2.44988 5.97755 2.62011 5.92073 2.76292 5.81859C2.90572 5.71645 3.0145 5.57371 3.07511 5.40893C3.1457 5.24898 3.16676 5.07155 3.13556 4.89953C3.10437 4.7275 3.02236 4.56876 2.90011 4.44378L2.86829 4.41196C2.76968 4.31346 2.69145 4.19648 2.63807 4.06773C2.5847 3.93897 2.55723 3.80096 2.55723 3.66158C2.55723 3.5222 2.5847 3.38419 2.63807 3.25543C2.69145 3.12668 2.76968 3.0097 2.86829 2.9112C2.96679 2.81259 3.08376 2.73436 3.21252 2.68099C3.34127 2.62761 3.47929 2.60014 3.61867 2.60014C3.75805 2.60014 3.89606 2.62761 4.02482 2.68099C4.15357 2.73436 4.27054 2.81259 4.36905 2.9112L4.40086 2.94302C4.52585 3.06527 4.68458 3.14728 4.85661 3.17848C5.02864 3.20967 5.20607 3.18861 5.36602 3.11802H5.40844C5.56529 3.0508 5.69906 2.93918 5.79328 2.7969C5.8875 2.65463 5.93806 2.48791 5.93874 2.31726V2.22711C5.93874 1.94582 6.05049 1.67605 6.24939 1.47715C6.44829 1.27825 6.71806 1.1665 6.99935 1.1665C7.28064 1.1665 7.55041 1.27825 7.74931 1.47715C7.94821 1.67605 8.05995 1.94582 8.05995 2.22711V2.27484C8.06064 2.44548 8.1112 2.6122 8.20542 2.75448C8.29964 2.89675 8.43341 3.00837 8.59026 3.07559C8.75021 3.14619 8.92763 3.16724 9.09966 3.13605C9.27169 3.10486 9.43043 3.02285 9.55541 2.90059L9.58723 2.86878C9.68573 2.77017 9.8027 2.69194 9.93146 2.63856C10.0602 2.58519 10.1982 2.55772 10.3376 2.55772C10.477 2.55772 10.615 2.58519 10.7438 2.63856C10.8725 2.69194 10.9895 2.77017 11.088 2.86878C11.1866 2.96728 11.2648 3.08425 11.3182 3.21301C11.3716 3.34176 11.399 3.47978 11.399 3.61916C11.399 3.75854 11.3716 3.89655 11.3182 4.0253C11.2648 4.15406 11.1866 4.27103 11.088 4.36953L11.0562 4.40135C10.9339 4.52633 10.8519 4.68507 10.8207 4.8571C10.7895 5.02913 10.8106 5.20656 10.8812 5.3665V5.40893C10.9484 5.56578 11.06 5.69954 11.2023 5.79377C11.3446 5.88799 11.5113 5.93855 11.6819 5.93923H11.7721C12.0534 5.93923 12.3231 6.05097 12.522 6.24988C12.7209 6.44878 12.8327 6.71855 12.8327 6.99984C12.8327 7.28113 12.7209 7.5509 12.522 7.7498C12.3231 7.9487 12.0534 8.06044 11.7721 8.06044H11.7243C11.5537 8.06112 11.387 8.11169 11.2447 8.20591C11.1024 8.30013 10.9908 8.4339 10.9236 8.59075Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</g>
+<defs>
+<clipPath id="clip0_11961_30603">
+<rect width="14" height="14" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/settings-04.svg b/app/components/base/icons/assets/vender/line/general/settings-04.svg
new file mode 100644
index 0000000..176fe3a
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/settings-04.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Left Icon">
+<path id="Icon" d="M1.75 4.6665L8.75 4.6665M8.75 4.6665C8.75 5.633 9.5335 6.4165 10.5 6.4165C11.4665 6.4165 12.25 5.633 12.25 4.6665C12.25 3.70001 11.4665 2.9165 10.5 2.9165C9.5335 2.9165 8.75 3.70001 8.75 4.6665ZM5.25 9.33317L12.25 9.33317M5.25 9.33317C5.25 10.2997 4.4665 11.0832 3.5 11.0832C2.5335 11.0832 1.75 10.2997 1.75 9.33317C1.75 8.36667 2.5335 7.58317 3.5 7.58317C4.4665 7.58317 5.25 8.36667 5.25 9.33317Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/target-04.svg b/app/components/base/icons/assets/vender/line/general/target-04.svg
new file mode 100644
index 0000000..2e2f1ff
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/target-04.svg
@@ -0,0 +1,10 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Left Icon" clip-path="url(#clip0_10386_42171)">
+<path id="Icon" d="M7.99998 4V2.5L9.49998 1L9.99998 2L11 2.5L9.49998 4H7.99998ZM7.99998 4L5.99999 5.99997M11 6C11 8.76142 8.76142 11 6 11C3.23858 11 1 8.76142 1 6C1 3.23858 3.23858 1 6 1M8.5 6C8.5 7.38071 7.38071 8.5 6 8.5C4.61929 8.5 3.5 7.38071 3.5 6C3.5 4.61929 4.61929 3.5 6 3.5" stroke="#667085" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_10386_42171">
+<rect width="12" height="12" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/upload-03.svg b/app/components/base/icons/assets/vender/line/general/upload-03.svg
new file mode 100644
index 0000000..3b4228b
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/upload-03.svg
@@ -0,0 +1,10 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Left Icon" clip-path="url(#clip0_12728_40636)">
+<path id="Icon" d="M10.6654 8.00016L7.9987 5.3335M7.9987 5.3335L5.33203 8.00016M7.9987 5.3335V10.6668M14.6654 8.00016C14.6654 11.6821 11.6806 14.6668 7.9987 14.6668C4.3168 14.6668 1.33203 11.6821 1.33203 8.00016C1.33203 4.31826 4.3168 1.3335 7.9987 1.3335C11.6806 1.3335 14.6654 4.31826 14.6654 8.00016Z" stroke="#155EEF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_12728_40636">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/upload-cloud-01.svg b/app/components/base/icons/assets/vender/line/general/upload-cloud-01.svg
new file mode 100644
index 0000000..c85fd5e
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/upload-cloud-01.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.4" d="M4 16.2422C2.79401 15.435 2 14.0602 2 12.5C2 10.1564 3.79151 8.23129 6.07974 8.01937C6.54781 5.17213 9.02024 3 12 3C14.9798 3 17.4522 5.17213 17.9203 8.01937C20.2085 8.23129 22 10.1564 22 12.5C22 14.0602 21.206 15.435 20 16.2422" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M8 16L12 12M12 12L16 16M12 12L12 21" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/general/x.svg b/app/components/base/icons/assets/vender/line/general/x.svg
new file mode 100644
index 0000000..04815e5
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/general/x.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="x">
+<path id="Icon" d="M11.3334 4.66663L4.66675 11.3333M4.66675 4.66663L11.3334 11.3333" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/images/image-plus.svg b/app/components/base/icons/assets/vender/line/images/image-plus.svg
new file mode 100644
index 0000000..affaf19
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/images/image-plus.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="image-plus">
+<path id="Icon" d="M8.33333 2.00016H5.2C4.0799 2.00016 3.51984 2.00016 3.09202 2.21815C2.71569 2.4099 2.40973 2.71586 2.21799 3.09218C2 3.52001 2 4.08006 2 5.20016V10.8002C2 11.9203 2 12.4803 2.21799 12.9081C2.40973 13.2845 2.71569 13.5904 3.09202 13.7822C3.51984 14.0002 4.07989 14.0002 5.2 14.0002H11.3333C11.9533 14.0002 12.2633 14.0002 12.5176 13.932C13.2078 13.7471 13.7469 13.208 13.9319 12.5178C14 12.2635 14 11.9535 14 11.3335M12.6667 5.3335V1.3335M10.6667 3.3335H14.6667M7 5.66683C7 6.40321 6.40305 7.00016 5.66667 7.00016C4.93029 7.00016 4.33333 6.40321 4.33333 5.66683C4.33333 4.93045 4.93029 4.3335 5.66667 4.3335C6.40305 4.3335 7 4.93045 7 5.66683ZM9.99336 7.94559L4.3541 13.0722C4.03691 13.3605 3.87831 13.5047 3.86429 13.6296C3.85213 13.7379 3.89364 13.8453 3.97546 13.9172C4.06985 14.0002 4.28419 14.0002 4.71286 14.0002H10.9707C11.9301 14.0002 12.4098 14.0002 12.7866 13.839C13.2596 13.6366 13.6365 13.2598 13.8388 12.7868C14 12.41 14 11.9303 14 10.9708C14 10.648 14 10.4866 13.9647 10.3363C13.9204 10.1474 13.8353 9.9704 13.7155 9.81776C13.6202 9.6963 13.4941 9.59546 13.242 9.3938L11.3772 7.90194C11.1249 7.7001 10.9988 7.59919 10.8599 7.56357C10.7374 7.53218 10.6086 7.53624 10.4884 7.57529C10.352 7.61959 10.2324 7.72826 9.99336 7.94559Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/layout/align-left-01.svg b/app/components/base/icons/assets/vender/line/layout/align-left-01.svg
new file mode 100644
index 0000000..70b6627
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/layout/align-left-01.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="align-left-01">
+<path id="Icon" d="M3 3V21M21 12H7M7 12L14 19M7 12L14 5" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/layout/align-right-01.svg b/app/components/base/icons/assets/vender/line/layout/align-right-01.svg
new file mode 100644
index 0000000..1e711ea
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/layout/align-right-01.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="align-right-01">
+<path id="Icon" d="M21 21V3M3 12H17M17 12L10 5M17 12L10 19" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/layout/grid-01.svg b/app/components/base/icons/assets/vender/line/layout/grid-01.svg
new file mode 100644
index 0000000..9970181
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/layout/grid-01.svg
@@ -0,0 +1,10 @@
+<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="grid-01">
+<g id="Icon">
+<path d="M6.1 2H3.56667C3.1933 2 3.00661 2 2.86401 2.07266C2.73856 2.13658 2.63658 2.23856 2.57266 2.36401C2.5 2.50661 2.5 2.6933 2.5 3.06667V5.6C2.5 5.97337 2.5 6.16005 2.57266 6.30266C2.63658 6.4281 2.73856 6.53009 2.86401 6.594C3.00661 6.66667 3.1933 6.66667 3.56667 6.66667H6.1C6.47337 6.66667 6.66005 6.66667 6.80266 6.594C6.9281 6.53009 7.03009 6.4281 7.094 6.30266C7.16667 6.16005 7.16667 5.97337 7.16667 5.6V3.06667C7.16667 2.6933 7.16667 2.50661 7.094 2.36401C7.03009 2.23856 6.9281 2.13658 6.80266 2.07266C6.66005 2 6.47337 2 6.1 2Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M13.4333 2H10.9C10.5266 2 10.3399 2 10.1973 2.07266C10.0719 2.13658 9.96991 2.23856 9.906 2.36401C9.83333 2.50661 9.83333 2.6933 9.83333 3.06667V5.6C9.83333 5.97337 9.83333 6.16005 9.906 6.30266C9.96991 6.4281 10.0719 6.53009 10.1973 6.594C10.3399 6.66667 10.5266 6.66667 10.9 6.66667H13.4333C13.8067 6.66667 13.9934 6.66667 14.136 6.594C14.2614 6.53009 14.3634 6.4281 14.4273 6.30266C14.5 6.16005 14.5 5.97337 14.5 5.6V3.06667C14.5 2.6933 14.5 2.50661 14.4273 2.36401C14.3634 2.23856 14.2614 2.13658 14.136 2.07266C13.9934 2 13.8067 2 13.4333 2Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M13.4333 9.33333H10.9C10.5266 9.33333 10.3399 9.33333 10.1973 9.406C10.0719 9.46991 9.96991 9.5719 9.906 9.69734C9.83333 9.83995 9.83333 10.0266 9.83333 10.4V12.9333C9.83333 13.3067 9.83333 13.4934 9.906 13.636C9.96991 13.7614 10.0719 13.8634 10.1973 13.9273C10.3399 14 10.5266 14 10.9 14H13.4333C13.8067 14 13.9934 14 14.136 13.9273C14.2614 13.8634 14.3634 13.7614 14.4273 13.636C14.5 13.4934 14.5 13.3067 14.5 12.9333V10.4C14.5 10.0266 14.5 9.83995 14.4273 9.69734C14.3634 9.5719 14.2614 9.46991 14.136 9.406C13.9934 9.33333 13.8067 9.33333 13.4333 9.33333Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M6.1 9.33333H3.56667C3.1933 9.33333 3.00661 9.33333 2.86401 9.406C2.73856 9.46991 2.63658 9.5719 2.57266 9.69734C2.5 9.83995 2.5 10.0266 2.5 10.4V12.9333C2.5 13.3067 2.5 13.4934 2.57266 13.636C2.63658 13.7614 2.73856 13.8634 2.86401 13.9273C3.00661 14 3.1933 14 3.56667 14H6.1C6.47337 14 6.66005 14 6.80266 13.9273C6.9281 13.8634 7.03009 13.7614 7.094 13.636C7.16667 13.4934 7.16667 13.3067 7.16667 12.9333V10.4C7.16667 10.0266 7.16667 9.83995 7.094 9.69734C7.03009 9.5719 6.9281 9.46991 6.80266 9.406C6.66005 9.33333 6.47337 9.33333 6.1 9.33333Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/layout/layout-grid-02.svg b/app/components/base/icons/assets/vender/line/layout/layout-grid-02.svg
new file mode 100644
index 0000000..7a39660
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/layout/layout-grid-02.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M3 9H21M3 15H21M12 3V21M7.8 3H16.2C17.8802 3 18.7202 3 19.362 3.32698C19.9265 3.6146 20.3854 4.07354 20.673 4.63803C21 5.27976 21 6.11984 21 7.8V16.2C21 17.8802 21 18.7202 20.673 19.362C20.3854 19.9265 19.9265 20.3854 19.362 20.673C18.7202 21 17.8802 21 16.2 21H7.8C6.11984 21 5.27976 21 4.63803 20.673C4.07354 20.3854 3.6146 19.9265 3.32698 19.362C3 18.7202 3 17.8802 3 16.2V7.8C3 6.11984 3 5.27976 3.32698 4.63803C3.6146 4.07354 4.07354 3.6146 4.63803 3.32698C5.27976 3 6.11984 3 7.8 3Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/mapsAndTravel/globe-01.svg b/app/components/base/icons/assets/vender/line/mapsAndTravel/globe-01.svg
new file mode 100644
index 0000000..88898bb
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/mapsAndTravel/globe-01.svg
@@ -0,0 +1,10 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="globe-01" clip-path="url(#clip0_8902_1914)">
+<path id="Icon" d="M1.33325 7.99998H14.6666M1.33325 7.99998C1.33325 11.6819 4.31802 14.6666 7.99992 14.6666M1.33325 7.99998C1.33325 4.31808 4.31802 1.33331 7.99992 1.33331M14.6666 7.99998C14.6666 11.6819 11.6818 14.6666 7.99992 14.6666M14.6666 7.99998C14.6666 4.31808 11.6818 1.33331 7.99992 1.33331M7.99992 1.33331C9.66744 3.15888 10.6151 5.528 10.6666 7.99998C10.6151 10.472 9.66744 12.8411 7.99992 14.6666M7.99992 1.33331C6.3324 3.15888 5.38475 5.528 5.33325 7.99998C5.38475 10.472 6.3324 12.8411 7.99992 14.6666" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_8902_1914">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/mapsAndTravel/route.svg b/app/components/base/icons/assets/vender/line/mapsAndTravel/route.svg
new file mode 100644
index 0000000..b1543cc
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/mapsAndTravel/route.svg
@@ -0,0 +1,10 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="route" clip-path="url(#clip0_3167_28693)">
+<path id="Icon" d="M6.70866 2.91699H6.96206C8.73962 2.91699 9.6284 2.91699 9.96578 3.23624C10.2574 3.51221 10.3867 3.91874 10.3079 4.31245C10.2168 4.76792 9.49122 5.28116 8.03999 6.30763L5.66899 7.98468C4.21777 9.01116 3.49215 9.5244 3.40106 9.97987C3.32233 10.3736 3.45157 10.7801 3.7432 11.0561C4.08059 11.3753 4.96937 11.3753 6.74693 11.3753H7.29199M4.66699 2.91699C4.66699 3.88349 3.88349 4.66699 2.91699 4.66699C1.95049 4.66699 1.16699 3.88349 1.16699 2.91699C1.16699 1.95049 1.95049 1.16699 2.91699 1.16699C3.88349 1.16699 4.66699 1.95049 4.66699 2.91699ZM12.8337 11.0837C12.8337 12.0502 12.0502 12.8337 11.0837 12.8337C10.1172 12.8337 9.33366 12.0502 9.33366 11.0837C9.33366 10.1172 10.1172 9.33366 11.0837 9.33366C12.0502 9.33366 12.8337 10.1172 12.8337 11.0837Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_3167_28693">
+<rect width="14" height="14" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/mediaAndDevices/microphone-01.svg b/app/components/base/icons/assets/vender/line/mediaAndDevices/microphone-01.svg
new file mode 100644
index 0000000..46d6818
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/mediaAndDevices/microphone-01.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="microphone-01">
+<path id="Icon" d="M12.6666 6.66732V8.00065C12.6666 10.578 10.5772 12.6673 7.99992 12.6673M3.33325 6.66732V8.00065C3.33325 10.578 5.42259 12.6673 7.99992 12.6673M7.99992 12.6673V14.6673M5.33325 14.6673H10.6666M7.99992 10.0007C6.89535 10.0007 5.99992 9.10522 5.99992 8.00065V3.33398C5.99992 2.22941 6.89535 1.33398 7.99992 1.33398C9.10449 1.33398 9.99992 2.22941 9.99992 3.33398V8.00065C9.99992 9.10522 9.10449 10.0007 7.99992 10.0007Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/mediaAndDevices/play-circle.svg b/app/components/base/icons/assets/vender/line/mediaAndDevices/play-circle.svg
new file mode 100644
index 0000000..9ef6c7b
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/mediaAndDevices/play-circle.svg
@@ -0,0 +1,13 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="play-circle" clip-path="url(#clip0_3607_26538)">
+<g id="Icon">
+<path d="M7.99992 14.6666C11.6818 14.6666 14.6666 11.6819 14.6666 7.99998C14.6666 4.31808 11.6818 1.33331 7.99992 1.33331C4.31802 1.33331 1.33325 4.31808 1.33325 7.99998C1.33325 11.6819 4.31802 14.6666 7.99992 14.6666Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M6.66659 5.33331L10.6666 7.99998L6.66659 10.6666V5.33331Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</g>
+<defs>
+<clipPath id="clip0_3607_26538">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/mediaAndDevices/sliders-h.svg b/app/components/base/icons/assets/vender/line/mediaAndDevices/sliders-h.svg
new file mode 100644
index 0000000..453aa8a
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/mediaAndDevices/sliders-h.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M3 5H9M9 5C9 6.10457 9.89543 7 11 7C12.1046 7 13 6.10457 13 5C13 3.89543 12.1046 3 11 3C9.89543 3 9 3.89543 9 5ZM17 5L21 5M3 12H9M17 12H21M17 12C17 10.8954 16.1046 10 15 10C13.8954 10 13 10.8954 13 12C13 13.1046 13.8954 14 15 14C16.1046 14 17 13.1046 17 12ZM3 19H7M7 19C7 20.1046 7.89543 21 9 21C10.1046 21 11 20.1046 11 19C11 17.8954 10.1046 17 9 17C7.89543 17 7 17.8954 7 19ZM15 19H21" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/mediaAndDevices/speaker.svg b/app/components/base/icons/assets/vender/line/mediaAndDevices/speaker.svg
new file mode 100644
index 0000000..f769c7e
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/mediaAndDevices/speaker.svg
@@ -0,0 +1,15 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_109_6694)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.86666C0 2.05664 0.656649 1.39999 1.46667 1.39999H5.86667C6.67668 1.39999 7.33333 2.05664 7.33333 2.86666C7.33333 3.27167 7.00501 3.59999 6.6 3.59999C6.19499 3.59999 5.86667 3.27167 5.86667 2.86666H4.4V7.99999C4.80501 7.99999 5.13333 8.32831 5.13333 8.73332C5.13333 9.13833 4.80501 9.46666 4.4 9.46666H2.93333C2.52832 9.46666 2.2 9.13833 2.2 8.73332C2.2 8.32831 2.52832 7.99999 2.93333 7.99999V2.86666H1.46667C1.46667 3.27167 1.13834 3.59999 0.733333 3.59999C0.328324 3.59999 0 3.27167 0 2.86666Z" fill="#444CE7"/>
+<path d="M13.8205 0.782296C13.7434 0.62811 13.5233 0.62811 13.4462 0.782296C12.9664 1.74206 12.8754 1.83302 11.9156 2.3129C11.7615 2.39 11.7615 2.61003 11.9156 2.68712C12.8754 3.167 12.9664 3.25797 13.4462 4.21773C13.5233 4.37191 13.7434 4.37191 13.8205 4.21773C14.3003 3.25797 14.3913 3.167 15.3511 2.68712C15.5053 2.61003 15.5053 2.39 15.3511 2.3129C14.3913 1.83302 14.3003 1.74206 13.8205 0.782296Z" fill="#444CE7"/>
+<path d="M9.79394 2.25319C9.71404 2.09337 9.48596 2.09337 9.40605 2.25319C9.04994 2.96543 8.96544 3.04993 8.2532 3.40605C8.09338 3.48595 8.09338 3.71402 8.2532 3.79393C8.96544 4.15005 9.04994 4.23455 9.40606 4.94679C9.48596 5.10661 9.71404 5.10661 9.79394 4.94679C10.1501 4.23455 10.2346 4.15005 10.9468 3.79393C11.1066 3.71402 11.1066 3.48595 10.9468 3.40605C10.2346 3.04993 10.1501 2.96543 9.79394 2.25319Z" fill="#444CE7"/>
+<path d="M2.75377 11.049C2.67668 10.8948 2.45665 10.8948 2.37956 11.049C1.89969 12.0087 1.80872 12.0997 0.848971 12.5796C0.694788 12.6566 0.694787 12.8767 0.848971 12.9538C1.80872 13.4336 1.89969 13.5246 2.37956 14.4844C2.45665 14.6385 2.67668 14.6385 2.75377 14.4844C3.23365 13.5246 3.32461 13.4336 4.28436 12.9538C4.43855 12.8767 4.43855 12.6566 4.28436 12.5796C3.32461 12.0997 3.23365 12.0087 2.75377 11.049Z" fill="#444CE7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M14.6741 8.65106C14.8886 8.50146 15.1837 8.55405 15.3333 8.76853C15.7614 9.38226 16.0125 10.1292 16.0125 10.9333C16.0125 11.7375 15.7614 12.4844 15.3333 13.0981C15.1837 13.3126 14.8886 13.3652 14.6741 13.2156C14.4596 13.066 14.407 12.7708 14.5567 12.5564C14.8775 12.0964 15.0656 11.5375 15.0656 10.9333C15.0656 10.3291 14.8775 9.77025 14.5567 9.31028C14.407 9.09581 14.4596 8.80066 14.6741 8.65106Z" fill="#444CE7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.5674 6.53771C12.794 6.51987 13.0155 6.61161 13.1632 6.78449C13.2954 6.93929 13.3164 7.12549 13.3244 7.21587C13.3334 7.31718 13.3334 7.44301 13.3333 7.57103C13.3333 7.57691 13.3333 7.58278 13.3333 7.58866L13.3333 14.3C13.3334 14.428 13.3334 14.5539 13.3244 14.6552C13.3164 14.7455 13.2954 14.9317 13.1632 15.0865C13.0155 15.2594 12.794 15.3512 12.5674 15.3333C12.3644 15.3173 12.2179 15.2005 12.1484 15.1423C12.0704 15.077 11.9814 14.988 11.8909 14.8975L10.3795 13.3861C10.3357 13.3423 10.3137 13.3205 10.2971 13.3053L10.2958 13.3041L10.2941 13.3041C10.2716 13.303 10.2407 13.3029 10.1787 13.3029L9.34101 13.3029C9.22151 13.3029 9.10513 13.3029 9.00657 13.2949C8.89833 13.286 8.77062 13.2652 8.6421 13.1997C8.46392 13.1089 8.31906 12.964 8.22827 12.7859C8.16279 12.6574 8.14192 12.5296 8.13308 12.4214C8.12503 12.3228 8.12504 12.2065 8.12505 12.087V9.79916C8.12505 9.79413 8.12505 9.78909 8.12505 9.78406C8.12504 9.66456 8.12503 9.54819 8.13308 9.44963C8.14192 9.34139 8.16279 9.21368 8.22827 9.08517C8.31906 8.90699 8.46392 8.76212 8.6421 8.67133C8.77062 8.60585 8.89833 8.58498 9.00657 8.57614C9.10512 8.56809 9.2215 8.5681 9.341 8.56812C9.34603 8.56812 9.35106 8.56812 9.3561 8.56812H10.1787C10.2407 8.56812 10.2716 8.56801 10.2941 8.56698L10.2958 8.5669L10.2971 8.56575C10.3137 8.55058 10.3357 8.52877 10.3795 8.48491L11.8784 6.98602C11.8826 6.98186 11.8867 6.97771 11.8909 6.97355C11.9814 6.88302 12.0704 6.79403 12.1484 6.72874C12.2179 6.67049 12.3644 6.55368 12.5674 6.53771Z" fill="#444CE7"/>
+</g>
+<defs>
+<clipPath id="clip0_109_6694">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/mediaAndDevices/stop-circle.svg b/app/components/base/icons/assets/vender/line/mediaAndDevices/stop-circle.svg
new file mode 100644
index 0000000..7a7983a
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/mediaAndDevices/stop-circle.svg
@@ -0,0 +1,8 @@
+<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon">
+<g id="Icon_2">
+<path d="M8.49967 14.6663C12.1816 14.6663 15.1663 11.6816 15.1663 7.99967C15.1663 4.31778 12.1816 1.33301 8.49967 1.33301C4.81778 1.33301 1.83301 4.31778 1.83301 7.99967C1.83301 11.6816 4.81778 14.6663 8.49967 14.6663Z" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M10.4997 5.99967H6.49967V9.99967H10.4997V5.99967Z" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/mediaAndDevices/stop.svg b/app/components/base/icons/assets/vender/line/mediaAndDevices/stop.svg
new file mode 100644
index 0000000..c6ec6d4
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/mediaAndDevices/stop.svg
@@ -0,0 +1,10 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon" clip-path="url(#clip0_467_1645)">
+<path id="Icon_2" d="M1.5 3.9C1.5 3.05992 1.5 2.63988 1.66349 2.31901C1.8073 2.03677 2.03677 1.8073 2.31901 1.66349C2.63988 1.5 3.05992 1.5 3.9 1.5H8.1C8.94008 1.5 9.36012 1.5 9.68099 1.66349C9.96323 1.8073 10.1927 2.03677 10.3365 2.31901C10.5 2.63988 10.5 3.05992 10.5 3.9V8.1C10.5 8.94008 10.5 9.36012 10.3365 9.68099C10.1927 9.96323 9.96323 10.1927 9.68099 10.3365C9.36012 10.5 8.94008 10.5 8.1 10.5H3.9C3.05992 10.5 2.63988 10.5 2.31901 10.3365C2.03677 10.1927 1.8073 9.96323 1.66349 9.68099C1.5 9.36012 1.5 8.94008 1.5 8.1V3.9Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_467_1645">
+<rect width="12" height="12" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/others/apps-02.svg b/app/components/base/icons/assets/vender/line/others/apps-02.svg
new file mode 100644
index 0000000..8e1fec9
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/others/apps-02.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="apps-2-line">
+<path id="Vector" d="M4.66602 7.6665C3.00916 7.6665 1.66602 6.32336 1.66602 4.6665C1.66602 3.00965 3.00916 1.6665 4.66602 1.6665C6.32287 1.6665 7.66602 3.00965 7.66602 4.6665C7.66602 6.32336 6.32287 7.6665 4.66602 7.6665ZM4.66602 14.3332C3.00916 14.3332 1.66602 12.99 1.66602 11.3332C1.66602 9.6763 3.00916 8.33317 4.66602 8.33317C6.32287 8.33317 7.66602 9.6763 7.66602 11.3332C7.66602 12.99 6.32287 14.3332 4.66602 14.3332ZM11.3327 7.6665C9.67582 7.6665 8.33268 6.32336 8.33268 4.6665C8.33268 3.00965 9.67582 1.6665 11.3327 1.6665C12.9895 1.6665 14.3327 3.00965 14.3327 4.6665C14.3327 6.32336 12.9895 7.6665 11.3327 7.6665ZM11.3327 14.3332C9.67582 14.3332 8.33268 12.99 8.33268 11.3332C8.33268 9.6763 9.67582 8.33317 11.3327 8.33317C12.9895 8.33317 14.3327 9.6763 14.3327 11.3332C14.3327 12.99 12.9895 14.3332 11.3327 14.3332ZM4.66602 6.33317C5.58649 6.33317 6.33268 5.58698 6.33268 4.6665C6.33268 3.74603 5.58649 2.99984 4.66602 2.99984C3.74554 2.99984 2.99935 3.74603 2.99935 4.6665C2.99935 5.58698 3.74554 6.33317 4.66602 6.33317ZM4.66602 12.9998C5.58649 12.9998 6.33268 12.2536 6.33268 11.3332C6.33268 10.4127 5.58649 9.6665 4.66602 9.6665C3.74554 9.6665 2.99935 10.4127 2.99935 11.3332C2.99935 12.2536 3.74554 12.9998 4.66602 12.9998ZM11.3327 6.33317C12.2531 6.33317 12.9993 5.58698 12.9993 4.6665C12.9993 3.74603 12.2531 2.99984 11.3327 2.99984C10.4122 2.99984 9.66602 3.74603 9.66602 4.6665C9.66602 5.58698 10.4122 6.33317 11.3327 6.33317ZM11.3327 12.9998C12.2531 12.9998 12.9993 12.2536 12.9993 11.3332C12.9993 10.4127 12.2531 9.6665 11.3327 9.6665C10.4122 9.6665 9.66602 10.4127 9.66602 11.3332C9.66602 12.2536 10.4122 12.9998 11.3327 12.9998Z" fill="#155EEF"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/others/bubble-x.svg b/app/components/base/icons/assets/vender/line/others/bubble-x.svg
new file mode 100644
index 0000000..6e4df5b
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/others/bubble-x.svg
@@ -0,0 +1,8 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon L">
+<g id="Vector">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3.33463 3.33333C2.96643 3.33333 2.66796 3.63181 2.66796 4V10.6667C2.66796 11.0349 2.96643 11.3333 3.33463 11.3333H4.66796C5.03615 11.3333 5.33463 11.6318 5.33463 12V12.8225L7.65833 11.4283C7.76194 11.3662 7.8805 11.3333 8.00132 11.3333H12.0013C12.3695 11.3333 12.668 11.0349 12.668 10.6667C12.668 10.2985 12.9665 10 13.3347 10C13.7028 10 14.0013 10.2985 14.0013 10.6667C14.0013 11.7713 13.1058 12.6667 12.0013 12.6667H8.18598L5.01095 14.5717C4.805 14.6952 4.5485 14.6985 4.33949 14.5801C4.13049 14.4618 4.00129 14.2402 4.00129 14V12.6667H3.33463C2.23006 12.6667 1.33463 11.7713 1.33463 10.6667V4C1.33463 2.89543 2.23006 2 3.33463 2H6.66798C7.03617 2 7.33464 2.29848 7.33464 2.66667C7.33464 3.03486 7.03617 3.33333 6.66798 3.33333H3.33463Z" fill="#354052"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.74113 2.66667C8.74113 2.29848 9.03961 2 9.4078 2H10.331C10.9721 2 11.5177 2.43571 11.6859 3.04075L11.933 3.93004L12.8986 2.77189C13.3045 2.28508 13.9018 2 14.536 2H14.5954C14.9636 2 15.2621 2.29848 15.2621 2.66667C15.2621 3.03486 14.9636 3.33333 14.5954 3.33333H14.536C14.3048 3.33333 14.08 3.43702 13.9227 3.6257L12.367 5.49165L12.8609 7.2689C12.8746 7.31803 12.9105 7.33333 12.9312 7.33333H13.8543C14.2225 7.33333 14.521 7.63181 14.521 8C14.521 8.36819 14.2225 8.66667 13.8543 8.66667H12.9312C12.29 8.66667 11.7444 8.23095 11.5763 7.62591L11.3291 6.73654L10.3634 7.89478C9.95758 8.38159 9.36022 8.66667 8.72604 8.66667H8.66666C8.29847 8.66667 7.99999 8.36819 7.99999 8C7.99999 7.63181 8.29847 7.33333 8.66666 7.33333H8.72604C8.95723 7.33333 9.18204 7.22965 9.33935 7.04096L10.8951 5.17493L10.4012 3.39777C10.3876 3.34863 10.3516 3.33333 10.331 3.33333H9.4078C9.03961 3.33333 8.74113 3.03486 8.74113 2.66667Z" fill="#354052"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/others/colors.svg b/app/components/base/icons/assets/vender/line/others/colors.svg
new file mode 100644
index 0000000..3173ef4
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/others/colors.svg
@@ -0,0 +1,10 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="colors" clip-path="url(#clip0_18499_53582)">
+<path id="Icon" d="M7.00032 11.9422C7.61954 12.4964 8.43724 12.8334 9.33366 12.8334C11.2667 12.8334 12.8337 11.2664 12.8337 9.33342C12.8337 7.71938 11.7411 6.36051 10.2552 5.95602M3.74543 5.95601C2.25954 6.3605 1.16699 7.71937 1.16699 9.33341C1.16699 11.2664 2.734 12.8334 4.66699 12.8334C6.59999 12.8334 8.16699 11.2664 8.16699 9.33341C8.16699 8.87813 8.08006 8.44314 7.92189 8.04415M10.5003 4.66675C10.5003 6.59974 8.93332 8.16675 7.00033 8.16675C5.06733 8.16675 3.50033 6.59974 3.50033 4.66675C3.50033 2.73375 5.06733 1.16675 7.00033 1.16675C8.93332 1.16675 10.5003 2.73375 10.5003 4.66675Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_18499_53582">
+<rect width="14" height="14" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/others/drag-handle.svg b/app/components/base/icons/assets/vender/line/others/drag-handle.svg
new file mode 100644
index 0000000..773953e
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/others/drag-handle.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Drag Handle">
+<path id="drag-handle" fill-rule="evenodd" clip-rule="evenodd" d="M6 5C6.55228 5 7 4.55228 7 4C7 3.44772 6.55228 3 6 3C5.44772 3 5 3.44772 5 4C5 4.55228 5.44772 5 6 5ZM6 9C6.55228 9 7 8.55228 7 8C7 7.44772 6.55228 7 6 7C5.44772 7 5 7.44772 5 8C5 8.55228 5.44772 9 6 9ZM11 4C11 4.55228 10.5523 5 10 5C9.44772 5 9 4.55228 9 4C9 3.44772 9.44772 3 10 3C10.5523 3 11 3.44772 11 4ZM10 9C10.5523 9 11 8.55228 11 8C11 7.44772 10.5523 7 10 7C9.44772 7 9 7.44772 9 8C9 8.55228 9.44772 9 10 9ZM7 12C7 12.5523 6.55228 13 6 13C5.44772 13 5 12.5523 5 12C5 11.4477 5.44772 11 6 11C6.55228 11 7 11.4477 7 12ZM10 13C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11C9.44772 11 9 11.4477 9 12C9 12.5523 9.44772 13 10 13Z" fill="#98A2B3"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/others/env.svg b/app/components/base/icons/assets/vender/line/others/env.svg
new file mode 100644
index 0000000..b183d40
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/others/env.svg
@@ -0,0 +1,11 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="env">
+<g id="Vector">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.33325 3.33325C1.33325 2.22868 2.22868 1.33325 3.33325 1.33325H12.6666C13.7712 1.33325 14.6666 2.22869 14.6666 3.33325V3.66659C14.6666 4.03478 14.3681 4.33325 13.9999 4.33325C13.6317 4.33325 13.3333 4.03478 13.3333 3.66659V3.33325C13.3333 2.96506 13.0348 2.66659 12.6666 2.66659H3.33325C2.96506 2.66659 2.66659 2.96506 2.66659 3.33325V3.66659C2.66659 4.03478 2.36811 4.33325 1.99992 4.33325C1.63173 4.33325 1.33325 4.03478 1.33325 3.66659V3.33325Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M14.6666 12.6666C14.6666 13.7712 13.7712 14.6666 12.6666 14.6666L3.33325 14.6666C2.22866 14.6666 1.33325 13.7711 1.33325 12.6666L1.33325 12.3333C1.33325 11.9651 1.63173 11.6666 1.99992 11.6666C2.36811 11.6666 2.66659 11.9651 2.66659 12.3333V12.6666C2.66659 13.0348 2.96505 13.3333 3.33325 13.3333L12.6666 13.3333C13.0348 13.3333 13.3333 13.0348 13.3333 12.6666V12.3333C13.3333 11.9651 13.6317 11.6666 13.9999 11.6666C14.3681 11.6666 14.6666 11.9651 14.6666 12.3333V12.6666Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.33325 5.99992C1.33325 5.63173 1.63173 5.33325 1.99992 5.33325H4.33325C4.70144 5.33325 4.99992 5.63173 4.99992 5.99992C4.99992 6.36811 4.70144 6.66658 4.33325 6.66658H2.66659V7.33325H3.99992C4.36811 7.33325 4.66659 7.63173 4.66659 7.99992C4.66659 8.36811 4.36811 8.66658 3.99992 8.66658H2.66659V9.33325H4.33325C4.70144 9.33325 4.99992 9.63173 4.99992 9.99992C4.99992 10.3681 4.70144 10.6666 4.33325 10.6666H1.99992C1.63173 10.6666 1.33325 10.3681 1.33325 9.99992V5.99992Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M6.4734 5.36186C6.75457 5.27673 7.05833 5.38568 7.22129 5.63012L8.66659 7.79807V5.99992C8.66659 5.63173 8.96506 5.33325 9.33325 5.33325C9.70144 5.33325 9.99992 5.63173 9.99992 5.99992V9.99992C9.99992 10.2937 9.80761 10.5528 9.52644 10.638C9.24527 10.7231 8.94151 10.6142 8.77855 10.3697L7.33325 8.20177V9.99992C7.33325 10.3681 7.03478 10.6666 6.66659 10.6666C6.2984 10.6666 5.99992 10.3681 5.99992 9.99992V5.99992C5.99992 5.70614 6.19222 5.44699 6.4734 5.36186Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M11.0768 5.38453C11.4167 5.24292 11.807 5.40364 11.9486 5.74351L12.9999 8.26658L14.0512 5.74351C14.1928 5.40364 14.5831 5.24292 14.923 5.38453C15.2629 5.52614 15.4236 5.91646 15.282 6.25633L13.6153 10.2563C13.5118 10.5048 13.2691 10.6666 12.9999 10.6666C12.7308 10.6666 12.488 10.5048 12.3845 10.2563L10.7179 6.25633C10.5763 5.91646 10.737 5.52614 11.0768 5.38453Z" fill="black"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/others/exchange-02.svg b/app/components/base/icons/assets/vender/line/others/exchange-02.svg
new file mode 100644
index 0000000..45d2770
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/others/exchange-02.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M4.66602 14.3334C3.00916 14.3334 1.66602 12.9903 1.66602 11.3334C1.66602 9.67655 3.00916 8.33342 4.66602 8.33342C6.32287 8.33342 7.66602 9.67655 7.66602 11.3334C7.66602 12.9903 6.32287 14.3334 4.66602 14.3334ZM11.3327 7.66675C9.67582 7.66675 8.33268 6.3236 8.33268 4.66675C8.33268 3.00989 9.67582 1.66675 11.3327 1.66675C12.9895 1.66675 14.3327 3.00989 14.3327 4.66675C14.3327 6.3236 12.9895 7.66675 11.3327 7.66675ZM4.66602 13.0001C5.58649 13.0001 6.33268 12.2539 6.33268 11.3334C6.33268 10.4129 5.58649 9.66675 4.66602 9.66675C3.74554 9.66675 2.99935 10.4129 2.99935 11.3334C2.99935 12.2539 3.74554 13.0001 4.66602 13.0001ZM11.3327 6.33342C12.2531 6.33342 12.9993 5.58722 12.9993 4.66675C12.9993 3.74627 12.2531 3.00008 11.3327 3.00008C10.4122 3.00008 9.66602 3.74627 9.66602 4.66675C9.66602 5.58722 10.4122 6.33342 11.3327 6.33342ZM1.99935 5.33341C1.99935 3.49247 3.49174 2.00008 5.33268 2.00008H7.33268V3.33341H5.33268C4.22812 3.33341 3.33268 4.22885 3.33268 5.33341V7.33342H1.99935V5.33341ZM13.9993 8.66675H12.666V10.6667C12.666 11.7713 11.7706 12.6667 10.666 12.6667H8.66602V14.0001H10.666C12.5069 14.0001 13.9993 12.5077 13.9993 10.6667V8.66675Z" fill="#344054"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/others/file-code.svg b/app/components/base/icons/assets/vender/line/others/file-code.svg
new file mode 100644
index 0000000..eb77033
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/others/file-code.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10 2.66659H3.33333V13.3333H12.6667V5.33325H10V2.66659ZM2 1.99445C2 1.62929 2.29833 1.33325 2.66567 1.33325H10.6667L13.9998 4.66658L14 13.9949C14 14.3659 13.7034 14.6666 13.3377 14.6666H2.66227C2.29651 14.6666 2 14.3631 2 14.0054V1.99445ZM11.7713 7.99992L9.4142 10.3569L8.4714 9.41412L9.8856 7.99992L8.4714 6.58571L9.4142 5.6429L11.7713 7.99992ZM4.22877 7.99992L6.58579 5.6429L7.5286 6.58571L6.11438 7.99992L7.5286 9.41412L6.58579 10.3569L4.22877 7.99992Z" fill="#344054"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/others/global-variable.svg b/app/components/base/icons/assets/vender/line/others/global-variable.svg
new file mode 100644
index 0000000..e7bdacc
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/others/global-variable.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M6.23814 1.33333H9.76188C10.4844 1.33332 11.0672 1.33332 11.5391 1.37187C12.025 1.41157 12.4518 1.49545 12.8466 1.69664C13.4739 2.01622 13.9838 2.52615 14.3034 3.15336C14.5046 3.54822 14.5884 3.97501 14.6281 4.46091C14.6667 4.93283 14.6667 5.51559 14.6667 6.23811V9.76188C14.6667 10.4844 14.6667 11.0672 14.6281 11.5391C14.5884 12.025 14.5046 12.4518 14.3034 12.8466C13.9838 13.4738 13.4739 13.9838 12.8466 14.3033C12.4518 14.5045 12.025 14.5884 11.5391 14.6281C11.0672 14.6667 10.4844 14.6667 9.7619 14.6667H6.23812C5.51561 14.6667 4.93284 14.6667 4.46093 14.6281C3.97503 14.5884 3.54824 14.5045 3.15338 14.3033C2.52617 13.9838 2.01623 13.4738 1.69666 12.8466C1.49546 12.4518 1.41159 12.025 1.37189 11.5391C1.33333 11.0672 1.33334 10.4844 1.33334 9.76187V6.23812C1.33334 5.5156 1.33333 4.93283 1.37189 4.46091C1.41159 3.97501 1.49546 3.54822 1.69666 3.15336C2.01623 2.52615 2.52617 2.01622 3.15338 1.69664C3.54824 1.49545 3.97503 1.41157 4.46093 1.37187C4.93285 1.33332 5.51561 1.33332 6.23814 1.33333ZM4.5695 2.70078C4.16606 2.73374 3.93427 2.79519 3.7587 2.88465C3.38237 3.0764 3.07641 3.38236 2.88466 3.75868C2.79521 3.93425 2.73376 4.16604 2.70079 4.56949C2.6672 4.98072 2.66668 5.50892 2.66668 6.26666V9.73333C2.66668 10.4911 2.6672 11.0193 2.70079 11.4305C2.73376 11.8339 2.79521 12.0657 2.88466 12.2413C3.07641 12.6176 3.38237 12.9236 3.7587 13.1153C3.93427 13.2048 4.16606 13.2662 4.5695 13.2992C4.98073 13.3328 5.50894 13.3333 6.26668 13.3333H9.73334C10.4911 13.3333 11.0193 13.3328 11.4305 13.2992C11.834 13.2662 12.0658 13.2048 12.2413 13.1153C12.6176 12.9236 12.9236 12.6176 13.1154 12.2413C13.2048 12.0657 13.2663 11.8339 13.2992 11.4305C13.3328 11.0193 13.3333 10.4911 13.3333 9.73333V6.26666C13.3333 5.50892 13.3328 4.98072 13.2992 4.56949C13.2663 4.16604 13.2048 3.93425 13.1154 3.75868C12.9236 3.38236 12.6176 3.0764 12.2413 2.88465C12.0658 2.79519 11.834 2.73374 11.4305 2.70078C11.0193 2.66718 10.4911 2.66666 9.73334 2.66666H6.26668C5.50894 2.66666 4.98073 2.66718 4.5695 2.70078ZM5.08339 5.33333C5.08339 4.96514 5.38187 4.66666 5.75006 4.66666H6.68433C7.324 4.66666 7.87606 5.09677 8.04724 5.70542L8.30138 6.60902L9.2915 5.43554C9.7018 4.94926 10.3035 4.66666 10.9399 4.66666H11C11.3682 4.66666 11.6667 4.96514 11.6667 5.33333C11.6667 5.70152 11.3682 5.99999 11 5.99999H10.9399C10.7005 5.99999 10.4702 6.10616 10.3106 6.29537L8.73751 8.15972L9.23641 9.93357C9.24921 9.97909 9.28574 10 9.31579 10H10.2501C10.6182 10 10.9167 10.2985 10.9167 10.6667C10.9167 11.0349 10.6182 11.3333 10.2501 11.3333H9.31579C8.67612 11.3333 8.12406 10.9032 7.95288 10.2946L7.69871 9.39088L6.70852 10.5644C6.29822 11.0507 5.6965 11.3333 5.06011 11.3333H5.00001C4.63182 11.3333 4.33334 11.0349 4.33334 10.6667C4.33334 10.2985 4.63182 10 5.00001 10H5.06011C5.29949 10 5.52982 9.89383 5.68946 9.70462L7.26258 7.84019L6.76371 6.06642C6.75091 6.0209 6.71438 5.99999 6.68433 5.99999H5.75006C5.38187 5.99999 5.08339 5.70152 5.08339 5.33333Z" fill="#354052"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/others/icon-3-dots.svg b/app/components/base/icons/assets/vender/line/others/icon-3-dots.svg
new file mode 100644
index 0000000..bba4285
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/others/icon-3-dots.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon-3-dots">
+<path id="Icon" d="M5 6.5V5M8.93934 7.56066L10 6.5M10.0103 11.5H11.5103" stroke="#374151" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/others/long-arrow-left.svg b/app/components/base/icons/assets/vender/line/others/long-arrow-left.svg
new file mode 100644
index 0000000..7320664
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/others/long-arrow-left.svg
@@ -0,0 +1,3 @@
+<svg width="21" height="8" viewBox="0 0 21 8" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0.646446 3.64645C0.451185 3.84171 0.451185 4.15829 0.646446 4.35355L3.82843 7.53553C4.02369 7.7308 4.34027 7.7308 4.53553 7.53553C4.7308 7.34027 4.7308 7.02369 4.53553 6.82843L1.70711 4L4.53553 1.17157C4.7308 0.976311 4.7308 0.659728 4.53553 0.464466C4.34027 0.269204 4.02369 0.269204 3.82843 0.464466L0.646446 3.64645ZM21 3.5L1 3.5V4.5L21 4.5V3.5Z" fill="#101828" fill-opacity="0.3"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/others/long-arrow-right.svg b/app/components/base/icons/assets/vender/line/others/long-arrow-right.svg
new file mode 100644
index 0000000..733785a
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/others/long-arrow-right.svg
@@ -0,0 +1,3 @@
+<svg width="26" height="8" viewBox="0 0 26 8" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M25.3536 4.35355C25.5488 4.15829 25.5488 3.84171 25.3536 3.64644L22.1716 0.464465C21.9763 0.269202 21.6597 0.269202 21.4645 0.464465C21.2692 0.659727 21.2692 0.976309 21.4645 1.17157L24.2929 4L21.4645 6.82843C21.2692 7.02369 21.2692 7.34027 21.4645 7.53553C21.6597 7.73079 21.9763 7.73079 22.1716 7.53553L25.3536 4.35355ZM3.59058e-08 4.5L25 4.5L25 3.5L-3.59058e-08 3.5L3.59058e-08 4.5Z" fill="#101828" fill-opacity="0.3"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/others/tools.svg b/app/components/base/icons/assets/vender/line/others/tools.svg
new file mode 100644
index 0000000..a10f539
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/others/tools.svg
@@ -0,0 +1,14 @@
+<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Tools" clip-path="url(#clip0_5381_39479)">
+<path id="vector" d="M13.4375 14.4375V6.8125H2.5625V14.4375C2.5625 14.9898 3.01022 15.4375 3.5625 15.4375H12.4375C12.9898 15.4375 13.4375 14.9898 13.4375 14.4375Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path id="vector_2" d="M13.6254 2.875L11.1738 6.47327" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path id="vector_3" d="M6.3125 9.8125H9.6875" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path id="vector_4" d="M8.63355 1.88044L8.75 1.64754L8.86645 1.88044C8.97531 2.09816 9.15184 2.27469 9.36956 2.38355L9.60246 2.5L9.36956 2.61645C9.15184 2.72531 8.97531 2.90184 8.86645 3.11956L8.75 3.35246L8.63355 3.11956C8.52469 2.90184 8.34816 2.72531 8.13044 2.61645L7.89754 2.5L8.13044 2.38355C8.34816 2.27469 8.52469 2.09816 8.63355 1.88044Z" stroke="#344054" stroke-width="1.25" stroke-linecap="square" stroke-linejoin="round"/>
+<path id="vector_5" d="M4.625 3.14754L4.61865 3.16025C4.51946 3.35862 4.35862 3.51946 4.16025 3.61865L4.14754 3.625L4.16025 3.63135C4.35862 3.73054 4.51946 3.89138 4.61865 4.08975L4.625 4.10246L4.63135 4.08975C4.73054 3.89138 4.89138 3.73054 5.08975 3.63135L5.10246 3.625L5.08975 3.61865C4.89138 3.51946 4.73054 3.35862 4.63135 3.16025L4.625 3.14754ZM4.625 3.14754L4.63135 3.16025L4.625 3.14754Z" stroke="#344054" stroke-width="1.25" stroke-linecap="square" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_5381_39479">
+<rect width="16" height="16" fill="white" transform="translate(0 0.5)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/shapes/cube-outline.svg b/app/components/base/icons/assets/vender/line/shapes/cube-outline.svg
new file mode 100644
index 0000000..eebcef3
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/shapes/cube-outline.svg
@@ -0,0 +1,13 @@
+<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="cube-outline">
+<g id="Solid">
+<path d="M8.26865 1.29003C8.09143 1.25358 7.90866 1.25358 7.73144 1.29003C7.52659 1.33216 7.3435 1.43471 7.19794 1.51624L7.15826 1.53841L6.17628 2.08395C5.85443 2.26276 5.73846 2.66863 5.91727 2.99049C6.09608 3.31234 6.50195 3.4283 6.82381 3.24949L7.80579 2.70395C7.90681 2.64782 7.95839 2.61946 7.99686 2.60091L8.00004 2.59938L8.00323 2.60091C8.0417 2.61946 8.09327 2.64782 8.1943 2.70395L9.17628 3.24949C9.49814 3.4283 9.90401 3.31234 10.0828 2.99048C10.2616 2.66863 10.1457 2.26276 9.82381 2.08395L8.84183 1.53841L8.80215 1.51624C8.65659 1.43471 8.4735 1.33216 8.26865 1.29003Z" fill="#155EEF"/>
+<path d="M12.8238 3.75062C12.5019 3.57181 12.0961 3.68777 11.9173 4.00963C11.7385 4.33148 11.8544 4.73735 12.1763 4.91616L12.6272 5.16668L12.1763 5.41719C11.8545 5.596 11.7385 6.00186 11.9173 6.32372C12.0961 6.64558 12.502 6.76154 12.8238 6.58273L13.3334 6.29966V6.83339C13.3334 7.20158 13.6319 7.50006 14 7.50006C14.3682 7.50006 14.6667 7.20158 14.6667 6.83339V5.79435L14.6668 5.74627C14.6673 5.62441 14.6678 5.48084 14.6452 5.33482C14.6869 5.17472 14.6696 4.99892 14.5829 4.84286C14.4904 4.6764 14.3371 4.56501 14.1662 4.52099C14.0496 4.43038 13.9239 4.36116 13.8173 4.3024L13.7752 4.27915L12.8238 3.75062Z" fill="#155EEF"/>
+<path d="M3.8238 4.91616C4.14566 4.73735 4.26162 4.33148 4.08281 4.00963C3.90401 3.68777 3.49814 3.57181 3.17628 3.75062L2.22493 4.27915L2.18284 4.3024C2.07615 4.36116 1.95045 4.4304 1.83382 4.52102C1.66295 4.56506 1.50977 4.67643 1.41731 4.84286C1.33065 4.99886 1.31323 5.17459 1.35493 5.33464C1.33229 5.48072 1.33281 5.62436 1.33326 5.74627L1.33338 5.79435V6.83339C1.33338 7.20158 1.63185 7.50006 2.00004 7.50006C2.36823 7.50006 2.66671 7.20158 2.66671 6.83339V6.29961L3.17632 6.58273C3.49817 6.76154 3.90404 6.64558 4.08285 6.32372C4.26166 6.00186 4.1457 5.596 3.82384 5.41719L3.3729 5.16666L3.8238 4.91616Z" fill="#155EEF"/>
+<path d="M2.66671 10.1667C2.66671 9.79853 2.36823 9.50006 2.00004 9.50006C1.63185 9.50006 1.33338 9.79853 1.33338 10.1667V11.2058L1.33326 11.2538C1.33262 11.4298 1.33181 11.6509 1.40069 11.8594C1.46024 12.0397 1.55759 12.2051 1.68622 12.3447C1.835 12.5061 2.02873 12.6128 2.18281 12.6977L2.22493 12.721L3.17628 13.2495C3.49814 13.4283 3.90401 13.3123 4.08281 12.9905C4.26162 12.6686 4.14566 12.2628 3.8238 12.084L2.87245 11.5554C2.76582 11.4962 2.71137 11.4656 2.67318 11.4413L2.66995 11.4392L2.66971 11.4354C2.66699 11.3902 2.66671 11.3277 2.66671 11.2058V10.1667Z" fill="#155EEF"/>
+<path d="M14.6667 10.1667C14.6667 9.79853 14.3682 9.50006 14 9.50006C13.6319 9.50006 13.3334 9.79853 13.3334 10.1667V11.2058C13.3334 11.3277 13.3331 11.3902 13.3304 11.4354L13.3301 11.4392L13.3269 11.4413C13.2887 11.4656 13.2343 11.4962 13.1276 11.5554L12.1763 12.084C11.8544 12.2628 11.7385 12.6686 11.9173 12.9905C12.0961 13.3123 12.5019 13.4283 12.8238 13.2495L13.7752 12.721L13.8172 12.6977C13.9713 12.6128 14.1651 12.5061 14.3139 12.3447C14.4425 12.2051 14.5398 12.0397 14.5994 11.8594C14.6683 11.6509 14.6675 11.4298 14.6668 11.2538L14.6667 11.2058V10.1667Z" fill="#155EEF"/>
+<path d="M6.82381 13.7506C6.50195 13.5718 6.09608 13.6878 5.91727 14.0096C5.73846 14.3315 5.85443 14.7374 6.17628 14.9162L7.15826 15.4617L7.19793 15.4839C7.29819 15.54 7.41625 15.6061 7.54696 15.6556C7.66589 15.7659 7.82512 15.8333 8.00008 15.8333C8.17507 15.8333 8.33431 15.7659 8.45324 15.6556C8.58391 15.6061 8.70193 15.54 8.80215 15.4839L8.84183 15.4617L9.82381 14.9162C10.1457 14.7374 10.2616 14.3315 10.0828 14.0096C9.90401 13.6878 9.49814 13.5718 9.17628 13.7506L8.66675 14.0337V13.5C8.66675 13.1318 8.36827 12.8333 8.00008 12.8333C7.63189 12.8333 7.33341 13.1318 7.33341 13.5V14.0337L6.82381 13.7506Z" fill="#155EEF"/>
+<path d="M6.82384 7.08385C6.50199 6.90505 6.09612 7.02101 5.91731 7.34286C5.7385 7.66472 5.85446 8.07059 6.17632 8.2494L7.33341 8.89223V10.1666C7.33341 10.5348 7.63189 10.8333 8.00008 10.8333C8.36827 10.8333 8.66675 10.5348 8.66675 10.1666V8.89223L9.82384 8.2494C10.1457 8.07059 10.2617 7.66472 10.0829 7.34286C9.90404 7.02101 9.49817 6.90505 9.17632 7.08385L8.00008 7.73732L6.82384 7.08385Z" fill="#155EEF"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/time/clock-fast-forward.svg b/app/components/base/icons/assets/vender/line/time/clock-fast-forward.svg
new file mode 100644
index 0000000..5e499f5
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/time/clock-fast-forward.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M22.7 11.5L20.7005 13.5L18.7 11.5M20.9451 13C20.9814 12.6717 21 12.338 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21C14.8273 21 17.35 19.6963 19 17.6573M12 7V12L15 14" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/time/clock-play-slim.svg b/app/components/base/icons/assets/vender/line/time/clock-play-slim.svg
new file mode 100644
index 0000000..be884b4
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/time/clock-play-slim.svg
@@ -0,0 +1,5 @@
+<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon">
+<path id="Vector" d="M29.2673 17.3332C29.3109 16.8946 29.3332 16.4498 29.3332 15.9998C29.3332 8.63604 23.3636 2.6665 15.9998 2.6665C8.63604 2.6665 2.6665 8.63604 2.6665 15.9998C2.6665 23.3636 8.63604 29.3332 15.9998 29.3332C16.2234 29.3332 16.4457 29.3277 16.6665 29.3168C16.8902 29.3058 17.1125 29.2892 17.3332 29.2673M15.9998 7.99984V15.9998L10.8458 18.5102M23.7065 19.9464L28.8621 23.8131C29.2481 24.1026 29.441 24.2473 29.5101 24.4248C29.5705 24.5802 29.5705 24.7527 29.5101 24.9081C29.441 25.0855 29.2481 25.2303 28.8621 25.5198L23.7065 29.3864C23.1572 29.7984 22.8825 30.0044 22.6526 29.9996C22.4526 29.9955 22.265 29.9017 22.1416 29.7441C21.9998 29.5631 21.9998 29.2197 21.9998 28.5331V20.7998C21.9998 20.1131 21.9998 19.7698 22.1416 19.5888C22.265 19.4312 22.4526 19.3374 22.6526 19.3333C22.8825 19.3285 23.1572 19.5345 23.7065 19.9464Z" stroke="#D0D5DD" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/time/clock-play.svg b/app/components/base/icons/assets/vender/line/time/clock-play.svg
new file mode 100644
index 0000000..e6c79b1
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/time/clock-play.svg
@@ -0,0 +1,10 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon" clip-path="url(#clip0_635_10941)">
+<path id="Vector" d="M14.6334 8.66683C14.6552 8.44756 14.6663 8.22516 14.6663 8.00016C14.6663 4.31826 11.6816 1.3335 7.99967 1.3335C4.31778 1.3335 1.33301 4.31826 1.33301 8.00016C1.33301 11.6821 4.31778 14.6668 7.99967 14.6668C8.11145 14.6668 8.22258 14.6641 8.33301 14.6586C8.44487 14.6531 8.556 14.6449 8.66634 14.6339M7.99967 4.00016V8.00016L5.42265 9.25534M11.853 9.97346L14.4308 11.9068C14.6238 12.0515 14.7203 12.1239 14.7548 12.2126C14.785 12.2904 14.785 12.3766 14.7548 12.4543C14.7203 12.543 14.6238 12.6154 14.4308 12.7601L11.853 14.6935C11.5784 14.8995 11.441 15.0024 11.3261 15.0001C11.226 14.998 11.1322 14.9511 11.0706 14.8723C10.9997 14.7818 10.9997 14.6101 10.9997 14.2668V10.4001C10.9997 10.0568 10.9997 9.88516 11.0706 9.79463C11.1322 9.71585 11.226 9.66895 11.3261 9.66687C11.441 9.66448 11.5784 9.76747 11.853 9.97346Z" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_635_10941">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/time/clock-refresh.svg b/app/components/base/icons/assets/vender/line/time/clock-refresh.svg
new file mode 100644
index 0000000..9cef4e7
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/time/clock-refresh.svg
@@ -0,0 +1,9 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="clock-refresh">
+<g id="Solid">
+<path d="M9.76984 2.8375L9.71551 3.04027C8.27602 1.22839 5.68891 0.69459 3.62457 1.88644C2.25681 2.67611 1.43067 4.04369 1.27558 5.50073C1.24636 5.77532 1.44526 6.02161 1.71985 6.05084C1.99444 6.08007 2.24074 5.88116 2.26997 5.60657C2.39268 4.4537 3.04533 3.37556 4.12456 2.75247C5.7025 1.84145 7.66731 2.20754 8.82211 3.53002L8.65016 3.48395C8.38343 3.41248 8.10926 3.57077 8.03779 3.8375C7.96632 4.10424 8.12461 4.37841 8.39134 4.44988L9.75737 4.8159C10.0241 4.88737 10.2983 4.72908 10.3697 4.46235L10.7358 3.09632C10.8072 2.82959 10.6489 2.55542 10.3822 2.48395C10.1155 2.41248 9.84131 2.57077 9.76984 2.8375Z" fill="#667085"/>
+<path d="M10.2792 5.94921C10.5538 5.97844 10.7527 6.22473 10.7235 6.49932C10.5684 7.95635 9.74225 9.32394 8.3745 10.1136C6.31011 11.3055 3.72295 10.7716 2.28347 8.95968L2.22918 9.1623C2.15771 9.42903 1.88354 9.58732 1.61681 9.51585C1.35008 9.44438 1.19178 9.17021 1.26325 8.90348L1.62928 7.53746C1.70075 7.27072 1.97492 7.11243 2.24165 7.1839L3.60768 7.54993C3.87441 7.6214 4.0327 7.89557 3.96123 8.1623C3.88976 8.42903 3.61559 8.58732 3.34886 8.51585L3.17668 8.46972C4.33144 9.79246 6.29644 10.1587 7.8745 9.24758C8.95373 8.62449 9.60638 7.54634 9.72909 6.39348C9.75832 6.11889 10.0046 5.91998 10.2792 5.94921Z" fill="#667085"/>
+<path d="M6.49954 3.74997C6.49954 3.47382 6.27568 3.24997 5.99954 3.24997C5.7234 3.24997 5.49954 3.47382 5.49954 3.74997V5.99997C5.49954 6.1756 5.59169 6.33835 5.74229 6.42871L6.99229 7.17871C7.22908 7.32079 7.53621 7.244 7.67828 7.00721C7.82036 6.77042 7.74358 6.46329 7.50679 6.32122L6.49954 5.71687V3.74997Z" fill="#667085"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/users/user-01.svg b/app/components/base/icons/assets/vender/line/users/user-01.svg
new file mode 100644
index 0000000..3217c92
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/users/user-01.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="user-01">
+<path id="Icon" d="M13.3334 14C13.3334 13.0696 13.3334 12.6044 13.2186 12.2259C12.9601 11.3736 12.2931 10.7067 11.4408 10.4482C11.0623 10.3333 10.5971 10.3333 9.66675 10.3333H6.33342C5.40304 10.3333 4.93785 10.3333 4.55932 10.4482C3.70705 10.7067 3.04011 11.3736 2.78157 12.2259C2.66675 12.6044 2.66675 13.0696 2.66675 14M11.0001 5C11.0001 6.65685 9.65694 8 8.00008 8C6.34323 8 5.00008 6.65685 5.00008 5C5.00008 3.34315 6.34323 2 8.00008 2C9.65694 2 11.0001 3.34315 11.0001 5Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/users/users-01.svg b/app/components/base/icons/assets/vender/line/users/users-01.svg
new file mode 100644
index 0000000..665534b
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/users/users-01.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="users-01">
+<path id="Icon" d="M14.6666 14V12.6667C14.6666 11.4241 13.8167 10.38 12.6666 10.084M10.3333 2.19384C11.3105 2.58943 11.9999 3.54754 11.9999 4.66667C11.9999 5.78579 11.3105 6.7439 10.3333 7.13949M11.3333 14C11.3333 12.7575 11.3333 12.1362 11.1303 11.6462C10.8596 10.9928 10.3405 10.4736 9.68707 10.203C9.19702 10 8.57576 10 7.33325 10H5.33325C4.09074 10 3.46949 10 2.97943 10.203C2.32602 10.4736 1.80689 10.9928 1.53624 11.6462C1.33325 12.1362 1.33325 12.7575 1.33325 14M8.99992 4.66667C8.99992 6.13943 7.80601 7.33333 6.33325 7.33333C4.86049 7.33333 3.66659 6.13943 3.66659 4.66667C3.66659 3.19391 4.86049 2 6.33325 2C7.80601 2 8.99992 3.19391 8.99992 4.66667Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/line/weather/stars-02.svg b/app/components/base/icons/assets/vender/line/weather/stars-02.svg
new file mode 100644
index 0000000..324aa94
--- /dev/null
+++ b/app/components/base/icons/assets/vender/line/weather/stars-02.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M4.5 22V17M4.5 7V2M2 4.5H7M2 19.5H7M13 3L11.2658 7.50886C10.9838 8.24209 10.8428 8.60871 10.6235 8.91709C10.4292 9.1904 10.1904 9.42919 9.91709 9.62353C9.60871 9.8428 9.24209 9.98381 8.50886 10.2658L4 12L8.50886 13.7342C9.24209 14.0162 9.60871 14.1572 9.91709 14.3765C10.1904 14.5708 10.4292 14.8096 10.6235 15.0829C10.8428 15.3913 10.9838 15.7579 11.2658 16.4911L13 21L14.7342 16.4911C15.0162 15.7579 15.1572 15.3913 15.3765 15.0829C15.5708 14.8096 15.8096 14.5708 16.0829 14.3765C16.3913 14.1572 16.7579 14.0162 17.4911 13.7342L22 12L17.4911 10.2658C16.7579 9.98381 16.3913 9.8428 16.0829 9.62353C15.8096 9.42919 15.5708 9.1904 15.3765 8.91709C15.1572 8.60871 15.0162 8.24209 14.7342 7.50886L13 3Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/other/anthropic-text.svg b/app/components/base/icons/assets/vender/other/anthropic-text.svg
new file mode 100644
index 0000000..cace17d
--- /dev/null
+++ b/app/components/base/icons/assets/vender/other/anthropic-text.svg
@@ -0,0 +1,78 @@
+<svg width="90" height="20" viewBox="0 0 90 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_8587_60274)">
+<mask id="mask0_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M89.375 4.99805H0V14.998H89.375V4.99805Z" fill="white"/>
+</mask>
+<g mask="url(#mask0_8587_60274)">
+<mask id="mask1_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99609H89.375V14.9961H0V4.99609Z" fill="white"/>
+</mask>
+<g mask="url(#mask1_8587_60274)">
+<mask id="mask2_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99414H89.375V14.9941H0V4.99414Z" fill="white"/>
+</mask>
+<g mask="url(#mask2_8587_60274)">
+<mask id="mask3_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask3_8587_60274)">
+<path d="M18.1273 11.9244L13.7773 5.15625H11.4297V14.825H13.4321V8.05688L17.7821 14.825H20.1297V5.15625H18.1273V11.9244Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask4_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask4_8587_60274)">
+<path d="M21.7969 7.02094H25.0423V14.825H27.1139V7.02094H30.3594V5.15625H21.7969V7.02094Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask5_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask5_8587_60274)">
+<path d="M38.6442 9.00994H34.0871V5.15625H32.0156V14.825H34.0871V10.8746H38.6442V14.825H40.7156V5.15625H38.6442V9.00994Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask6_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask6_8587_60274)">
+<path d="M45.3376 7.02094H47.893C48.9152 7.02094 49.4539 7.39387 49.4539 8.09831C49.4539 8.80275 48.9152 9.17569 47.893 9.17569H45.3376V7.02094ZM51.5259 8.09831C51.5259 6.27506 50.186 5.15625 47.9897 5.15625H43.2656V14.825H45.3376V11.0404H47.6443L49.7164 14.825H52.0094L49.715 10.7521C50.8666 10.3094 51.5259 9.37721 51.5259 8.09831Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask7_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask7_8587_60274)">
+<path d="M57.8732 13.0565C56.2438 13.0565 55.2496 11.8963 55.2496 10.004C55.2496 8.08416 56.2438 6.92394 57.8732 6.92394C59.4887 6.92394 60.4691 8.08416 60.4691 10.004C60.4691 11.8963 59.4887 13.0565 57.8732 13.0565ZM57.8732 4.99023C55.0839 4.99023 53.1094 7.06206 53.1094 10.004C53.1094 12.9184 55.0839 14.9902 57.8732 14.9902C60.6486 14.9902 62.6094 12.9184 62.6094 10.004C62.6094 7.06206 60.6486 4.99023 57.8732 4.99023Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask8_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask8_8587_60274)">
+<path d="M69.1794 9.45194H66.6233V7.02094H69.1794C70.2019 7.02094 70.7407 7.43532 70.7407 8.23644C70.7407 9.03756 70.2019 9.45194 69.1794 9.45194ZM69.2762 5.15625H64.5508V14.825H66.6233V11.3166H69.2762C71.473 11.3166 72.8133 10.1564 72.8133 8.23644C72.8133 6.3165 71.473 5.15625 69.2762 5.15625Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask9_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask9_8587_60274)">
+<path d="M86.8413 11.5786C86.4823 12.5179 85.7642 13.0565 84.7837 13.0565C83.1542 13.0565 82.16 11.8963 82.16 10.004C82.16 8.08416 83.1542 6.92394 84.7837 6.92394C85.7642 6.92394 86.4823 7.46261 86.8413 8.40183H89.0369C88.4984 6.33002 86.8827 4.99023 84.7837 4.99023C81.9942 4.99023 80.0195 7.06206 80.0195 10.004C80.0195 12.9184 81.9942 14.9902 84.7837 14.9902C86.8965 14.9902 88.5122 13.6366 89.0508 11.5786H86.8413Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask10_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask10_8587_60274)">
+<path d="M73.6484 5.15625L77.5033 14.825H79.6172L75.7624 5.15625H73.6484Z" fill="black" fill-opacity="0.92"/>
+</g>
+<mask id="mask11_8587_60274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="4" width="90" height="11">
+<path d="M0 4.99219H89.375V14.9922H0V4.99219Z" fill="white"/>
+</mask>
+<g mask="url(#mask11_8587_60274)">
+<path d="M3.64038 10.9989L4.95938 7.60106L6.27838 10.9989H3.64038ZM3.85422 5.15625L0 14.825H2.15505L2.9433 12.7946H6.97558L7.76371 14.825H9.91875L6.06453 5.15625H3.85422Z" fill="black" fill-opacity="0.92"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<defs>
+<clipPath id="clip0_8587_60274">
+<rect width="89.375" height="10" fill="white" transform="translate(0 5)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/other/generator.svg b/app/components/base/icons/assets/vender/other/generator.svg
new file mode 100644
index 0000000..a38efb5
--- /dev/null
+++ b/app/components/base/icons/assets/vender/other/generator.svg
@@ -0,0 +1,4 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.5" d="M10.5402 2.95679L10.5402 2.95685C10.4455 3.05146 10.3424 3.13459 10.2314 3.2072C10.3429 3.27923 10.4468 3.36165 10.5422 3.45535L10.5402 2.95679ZM10.5402 2.95679C10.6348 2.86217 10.718 2.75907 10.7906 2.64807C10.8626 2.75955 10.945 2.86339 11.0387 2.95881L11.0388 2.95888C11.1304 3.05224 11.2302 3.13482 11.3377 3.20717C11.2297 3.27895 11.1292 3.36081 11.0367 3.45327L11.0366 3.45333C10.9442 3.5458 10.8623 3.64635 10.7905 3.75431M10.5402 2.95679L10.7905 3.75431M10.7905 3.75431C10.7182 3.64686 10.6356 3.54707 10.5422 3.45538L10.7905 3.75431Z" stroke="#155EEF" stroke-width="1.25"/>
+<path d="M6.99659 2.85105C6.96323 2.55641 6.71414 2.33368 6.41758 2.33337C6.12107 2.33307 5.87146 2.55529 5.83751 2.84987C5.67932 4.2213 5.27205 5.16213 4.6339 5.80028C3.99575 6.43841 3.05492 6.84569 1.68349 7.00389C1.3889 7.03784 1.16669 7.28745 1.16699 7.58396C1.1673 7.88052 1.39002 8.12961 1.68467 8.16297C3.03291 8.31569 3.99517 8.72292 4.64954 9.36546C5.30035 10.0045 5.71535 10.944 5.83593 12.3017C5.86271 12.6029 6.11523 12.8337 6.41763 12.8334C6.72009 12.833 6.97209 12.6016 6.99817 12.3003C7.11367 10.9656 7.52836 10.005 8.18344 9.34982C8.83858 8.69474 9.79922 8.28005 11.1339 8.16455C11.4352 8.13847 11.6666 7.88647 11.667 7.58402C11.6673 7.28162 11.4365 7.02909 11.1353 7.00232C9.77758 6.88174 8.83812 6.46676 8.19908 5.81592C7.55653 5.16155 7.14931 4.19929 6.99659 2.85105Z" fill="#155EEF"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/other/group.svg b/app/components/base/icons/assets/vender/other/group.svg
new file mode 100644
index 0000000..90f1e6b
--- /dev/null
+++ b/app/components/base/icons/assets/vender/other/group.svg
@@ -0,0 +1,8 @@
+<svg width="14" height="16" viewBox="0 0 14 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Group">
+<path id="Vector" d="M5.6475 8.0115L0.333496 5.05884V11.3335C0.333491 11.4524 0.365258 11.569 0.425506 11.6715C0.485754 11.7739 0.572294 11.8584 0.676163 11.9162L6.3335 15.0588V9.17684C6.33344 8.93907 6.26981 8.70565 6.14919 8.50075C6.02857 8.29586 5.85536 8.12694 5.6475 8.0115Z" fill="#354052"/>
+<path id="Vector_2" d="M7.66699 9.17684V15.0588L13.3243 11.9162C13.4282 11.8584 13.5147 11.7739 13.575 11.6715C13.6352 11.569 13.667 11.4524 13.667 11.3335V5.05884L8.35299 8.0115C8.14513 8.12694 7.97192 8.29586 7.8513 8.50075C7.73068 8.70565 7.66705 8.93907 7.66699 9.17684Z" fill="#676F83"/>
+<path id="Vector_3" d="M10.1913 2.34351C9.804 3.33351 8.588 4.00017 7 4.00017C5.412 4.00017 4.196 3.33351 3.80867 2.34351L1 3.90417L6.35267 6.87817C6.5507 6.98815 6.77348 7.04586 7 7.04586C7.22652 7.04586 7.4493 6.98815 7.64733 6.87817L13 3.90417L10.1913 2.34351Z" fill="#676F83"/>
+<path id="Vector_4" d="M7 2.66675C8.10457 2.66675 9 2.21903 9 1.66675C9 1.11446 8.10457 0.666748 7 0.666748C5.89543 0.666748 5 1.11446 5 1.66675C5 2.21903 5.89543 2.66675 7 2.66675Z" fill="#354052"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/other/openai.svg b/app/components/base/icons/assets/vender/other/openai.svg
new file mode 100644
index 0000000..5a9a93b
--- /dev/null
+++ b/app/components/base/icons/assets/vender/other/openai.svg
@@ -0,0 +1,9 @@
+<svg width="80" height="22" viewBox="0 0 80 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M25.1152 10.5767C25.1152 14.1738 27.4253 16.6818 30.6264 16.6818C33.8274 16.6818 36.1375 14.1738 36.1375 10.5767C36.1375 6.97961 33.8274 4.47156 30.6264 4.47156C27.4253 4.47156 25.1152 6.97961 25.1152 10.5767ZM34.0254 10.5767C34.0254 13.1507 32.6229 14.8173 30.6264 14.8173C28.6298 14.8173 27.2273 13.1507 27.2273 10.5767C27.2273 8.00263 28.6298 6.3361 30.6264 6.3361C32.6229 6.3361 34.0254 8.00263 34.0254 10.5767Z" fill="black"/>
+<path d="M42.0868 16.6819C44.5124 16.6819 45.8984 14.6358 45.8984 12.1773C45.8984 9.71871 44.5124 7.67267 42.0868 7.67267C40.9648 7.67267 40.1398 8.11818 39.5953 8.76169V7.83767H37.6152V19.4704H39.5953V15.5928C40.1398 16.2364 40.9648 16.6819 42.0868 16.6819ZM39.5458 11.9298C39.5458 10.2962 40.4698 9.40521 41.6908 9.40521C43.1264 9.40521 43.9019 10.5272 43.9019 12.1773C43.9019 13.8273 43.1264 14.9493 41.6908 14.9493C40.4698 14.9493 39.5458 14.0418 39.5458 12.4413V11.9298Z" fill="black"/>
+<path d="M51.2545 16.6819C52.987 16.6819 54.3565 15.7743 54.967 14.2563L53.2675 13.6128C53.0035 14.5038 52.228 14.9988 51.2545 14.9988C49.9839 14.9988 49.0929 14.0913 48.9444 12.6063H55.0165V11.9463C55.0165 9.57021 53.68 7.67267 51.172 7.67267C48.6639 7.67267 47.0469 9.63621 47.0469 12.1773C47.0469 14.8503 48.7794 16.6819 51.2545 16.6819ZM51.1555 9.3392C52.4095 9.3392 53.0035 10.1642 53.02 11.1212H49.0434C49.3404 9.94972 50.1324 9.3392 51.1555 9.3392Z" fill="black"/>
+<path d="M56.5039 16.5004H58.484V11.4182C58.484 10.1807 59.3915 9.52071 60.2825 9.52071C61.3715 9.52071 61.8005 10.2962 61.8005 11.3687V16.5004H63.7806V10.7912C63.7806 8.9267 62.6915 7.67267 60.8765 7.67267C59.7545 7.67267 58.979 8.18418 58.484 8.76169V7.83767H56.5039V16.5004Z" fill="black"/>
+<path d="M69.5799 4.65308L65.0918 16.5003H67.1873L68.1939 13.7943H73.309L74.332 16.5003H76.4605L71.9724 4.65308H69.5799ZM70.7349 6.99613L72.616 11.9462H68.8869L70.7349 6.99613Z" fill="black"/>
+<path d="M79.8581 4.6875H77.7461V16.5348H79.8581V4.6875Z" fill="black"/>
+<path d="M20.2769 9.00436C20.776 7.50627 20.6041 5.86517 19.8059 4.50251C18.6055 2.41247 16.1924 1.3372 13.8356 1.84321C12.7871 0.662057 11.2808 -0.00964523 9.70154 -2.00271e-05C7.29248 -0.00552014 5.155 1.54551 4.41386 3.83769C2.86626 4.15463 1.53042 5.12334 0.748717 6.49631C-0.460621 8.58085 -0.184928 11.2085 1.43073 12.9961C0.931596 14.4942 1.10348 16.1353 1.90168 17.4979C3.10208 19.588 5.51526 20.6632 7.87206 20.1572C8.91983 21.3384 10.4269 22.0101 12.0061 21.9998C14.4165 22.006 16.5547 20.4535 17.2958 18.1593C18.8434 17.8424 20.1793 16.8737 20.961 15.5007C22.1689 13.4161 21.8925 10.7905 20.2776 9.00298L20.2769 9.00436ZM12.0075 20.5622C11.0429 20.5635 10.1085 20.226 9.36809 19.6079C9.40178 19.59 9.46022 19.5577 9.49803 19.5343L13.8789 17.0043C14.103 16.8771 14.2405 16.6385 14.2391 16.3807V10.2048L16.0906 11.2738C16.1105 11.2835 16.1236 11.3027 16.1264 11.3247V16.4391C16.1236 18.7134 14.2818 20.5574 12.0075 20.5622ZM3.14952 16.7788C2.6662 15.9441 2.49225 14.9658 2.65795 14.0163C2.69026 14.0356 2.74732 14.0707 2.78789 14.094L7.16873 16.6241C7.3908 16.754 7.6658 16.754 7.88856 16.6241L13.2367 13.5358V15.6739C13.2381 15.6959 13.2278 15.7173 13.2106 15.731L8.78233 18.2879C6.80985 19.4236 4.29079 18.7485 3.15021 16.7788H3.14952ZM1.99656 7.21613C2.47782 6.38012 3.23752 5.74073 4.14229 5.40866C4.14229 5.44647 4.14023 5.51316 4.14023 5.55991V10.6207C4.13885 10.8778 4.27636 11.1164 4.4998 11.2436L9.84798 14.3312L7.9965 15.4003C7.97794 15.4127 7.95456 15.4147 7.93393 15.4058L3.50496 12.8469C1.53661 11.707 0.86147 9.18861 1.99587 7.21682L1.99656 7.21613ZM17.2085 10.7561L11.8603 7.66783L13.7118 6.59943C13.7304 6.58706 13.7537 6.585 13.7744 6.59393L18.2033 9.1508C20.1751 10.29 20.851 12.8125 19.7118 14.7843C19.2298 15.6189 18.4708 16.2583 17.5667 16.5911V11.379C17.5688 11.1219 17.432 10.884 17.2092 10.7561H17.2085ZM19.0511 7.98271C19.0187 7.96278 18.9617 7.9284 18.9211 7.90502L14.5403 5.37497C14.3182 5.24503 14.0432 5.24503 13.8204 5.37497L8.47226 8.46329V6.32512C8.47088 6.30311 8.4812 6.2818 8.49838 6.26805L12.9267 3.71325C14.8991 2.57541 17.4209 3.25261 18.5581 5.22578C19.0387 6.05905 19.2126 7.03463 19.0497 7.98271H19.0511ZM7.46574 11.7936L5.61357 10.7245C5.59363 10.7149 5.58057 10.6956 5.57782 10.6736V5.55922C5.5792 3.28218 7.42655 1.43689 9.7036 1.43826C10.6668 1.43826 11.5991 1.77652 12.3395 2.39253C12.3058 2.41041 12.2481 2.44272 12.2096 2.46609L7.82874 4.99615C7.60461 5.12334 7.46711 5.36122 7.46849 5.61904L7.46574 11.7922V11.7936ZM8.47157 9.62519L10.8538 8.24947L13.236 9.6245V12.3752L10.8538 13.7503L8.47157 12.3752V9.62519Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/other/replay-line.svg b/app/components/base/icons/assets/vender/other/replay-line.svg
new file mode 100644
index 0000000..c220747
--- /dev/null
+++ b/app/components/base/icons/assets/vender/other/replay-line.svg
@@ -0,0 +1,5 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Retry">
+<path id="Vector" d="M9.99996 1.66669C14.6023 1.66669 18.3333 5.39765 18.3333 10C18.3333 14.6024 14.6023 18.3334 9.99996 18.3334C5.39758 18.3334 1.66663 14.6024 1.66663 10H3.33329C3.33329 13.6819 6.31806 16.6667 9.99996 16.6667C13.6819 16.6667 16.6666 13.6819 16.6666 10C16.6666 6.31812 13.6819 3.33335 9.99996 3.33335C7.70848 3.33335 5.68702 4.48947 4.48705 6.25022L6.66663 6.25002V7.91669H1.66663V2.91669H3.33329L3.3332 4.99934C4.85358 2.97565 7.2739 1.66669 9.99996 1.66669Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/plugin/box-sparkle-fill.svg b/app/components/base/icons/assets/vender/plugin/box-sparkle-fill.svg
new file mode 100644
index 0000000..3ec651f
--- /dev/null
+++ b/app/components/base/icons/assets/vender/plugin/box-sparkle-fill.svg
@@ -0,0 +1,9 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon">
+<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M11.3891 2.41987C11.6635 2.58871 11.749 2.94802 11.5802 3.22239L10.3324 5.25H11.0833C11.4055 5.25 11.6667 5.51117 11.6667 5.83334V11.6667C11.6667 12.311 11.1444 12.8333 10.5 12.8333H3.50001C2.85568 12.8333 2.33334 12.311 2.33334 11.6667V5.83334C2.33334 5.51117 2.59451 5.25 2.91668 5.25H8.96252L10.5865 2.61094C10.7554 2.33657 11.1147 2.25102 11.3891 2.41987ZM5.83334 7.58334C5.51118 7.58334 5.25001 7.84449 5.25001 8.16667C5.25001 8.48884 5.51118 8.75 5.83334 8.75H8.16668C8.48885 8.75 8.75001 8.48884 8.75001 8.16667C8.75001 7.84449 8.48885 7.58334 8.16668 7.58334H5.83334Z" fill="#676F83"/>
+<g id="Vector_2" opacity="0.5">
+<path d="M6.91257 1.79347C6.96898 1.76525 7.01477 1.71948 7.043 1.66303L7.32195 1.10508C7.42946 0.890105 7.73623 0.890105 7.84374 1.10508L8.12269 1.66303C8.15093 1.71948 8.19672 1.76525 8.25313 1.79347L8.81108 2.07245C9.0261 2.17994 9.0261 2.48672 8.81108 2.5942L8.25313 2.87318C8.19672 2.9014 8.15093 2.94717 8.12269 3.00362L7.84374 3.56158C7.73623 3.77655 7.42946 3.77655 7.32195 3.56158L7.043 3.00362C7.01477 2.94717 6.96898 2.9014 6.91257 2.87318L6.35461 2.5942C6.13965 2.48672 6.13965 2.17994 6.35461 2.07245L6.91257 1.79347Z" fill="#676F83"/>
+<path d="M3.80145 2.7657C3.85789 2.73748 3.90366 2.69171 3.93189 2.63526L4.11364 2.27174C4.22113 2.05677 4.5279 2.05677 4.63539 2.27174L4.81715 2.63526C4.84537 2.6917 4.89114 2.73748 4.94759 2.7657L5.3111 2.94745C5.52607 3.05494 5.52607 3.36172 5.3111 3.4692L4.94759 3.65096C4.89114 3.67919 4.84537 3.72495 4.81715 3.7814L4.63539 4.14491C4.5279 4.35988 4.22113 4.35988 4.11364 4.14491L3.93189 3.7814C3.90366 3.72495 3.85789 3.67919 3.80145 3.65096L3.43793 3.4692C3.22296 3.36172 3.22296 3.05494 3.43793 2.94745L3.80145 2.7657Z" fill="#676F83"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/plugin/left-corner.svg b/app/components/base/icons/assets/vender/plugin/left-corner.svg
new file mode 100644
index 0000000..9b360e4
--- /dev/null
+++ b/app/components/base/icons/assets/vender/plugin/left-corner.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="20" viewBox="0 0 13 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path id="Shape" d="M0 0H13V20C9.98017 20 7.26458 18.1615 6.14305 15.3576L0 0Z" fill="#F9FAFB"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/FinanceAndECommerce/gold-coin.svg b/app/components/base/icons/assets/vender/solid/FinanceAndECommerce/gold-coin.svg
new file mode 100644
index 0000000..b3830db
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/FinanceAndECommerce/gold-coin.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12 1C9.82441 1 7.69767 1.64514 5.88873 2.85383C4.07979 4.06253 2.66989 5.7805 1.83733 7.79048C1.00477 9.80047 0.786929 12.0122 1.21137 14.146C1.6358 16.2798 2.68345 18.2398 4.22183 19.7782C5.76021 21.3166 7.72022 22.3642 9.85401 22.7886C11.9878 23.2131 14.1995 22.9952 16.2095 22.1627C18.2195 21.3301 19.9375 19.9202 21.1462 18.1113C22.3549 16.3023 23 14.1756 23 12C23 9.08262 21.8411 6.28473 19.7782 4.22183C17.7153 2.15893 14.9174 1 12 1ZM15.0296 6.26992L16.1076 4.78675C16.1784 4.6893 16.2677 4.60675 16.3703 4.54381C16.473 4.48087 16.5871 4.43877 16.7061 4.41992C16.825 4.40106 16.9465 4.40582 17.0636 4.43393C17.1807 4.46203 17.2912 4.51293 17.3886 4.58371C17.4861 4.65449 17.5686 4.74377 17.6316 4.84646C17.6945 4.94915 17.7366 5.06322 17.7555 5.18218C17.7743 5.30113 17.7696 5.42264 17.7415 5.53975C17.7134 5.65687 17.6625 5.7673 17.5917 5.86475L16.5137 7.34792C16.3707 7.54472 16.1554 7.67667 15.9152 7.71475C15.675 7.75283 15.4294 7.69391 15.2326 7.55096C15.0358 7.40801 14.9039 7.19273 14.8658 6.95249C14.8277 6.71225 14.8866 6.46672 15.0296 6.26992ZM6.61184 4.58417C6.70931 4.51294 6.81989 4.46167 6.93722 4.4333C7.05456 4.40493 7.17635 4.40002 7.29559 4.41884C7.41484 4.43766 7.52919 4.47985 7.63208 4.54299C7.73497 4.60613 7.82438 4.68897 7.89517 4.78675L8.97501 6.26992C9.11796 6.46733 9.17663 6.71344 9.13813 6.95411C9.09962 7.19478 8.96708 7.4103 8.76967 7.55325C8.57226 7.6962 8.32615 7.75488 8.08548 7.71637C7.84481 7.67786 7.62929 7.54533 7.48634 7.34792L6.40834 5.86475C6.33759 5.76731 6.28673 5.65689 6.25867 5.5398C6.23061 5.4227 6.22589 5.30122 6.24479 5.1823C6.26368 5.06338 6.30583 4.94935 6.36881 4.84672C6.43179 4.74409 6.51437 4.65487 6.61184 4.58417ZM6.18101 14.8508L4.43934 15.4173C4.32353 15.4604 4.2002 15.4797 4.07677 15.4739C3.95333 15.4681 3.83234 15.4375 3.72106 15.3837C3.60978 15.33 3.51051 15.2544 3.42922 15.1613C3.34793 15.0682 3.28629 14.9597 3.24801 14.8422C3.20973 14.7247 3.19561 14.6007 3.20648 14.4776C3.21735 14.3545 3.253 14.2349 3.31128 14.1259C3.36955 14.017 3.44926 13.9209 3.54561 13.8435C3.64195 13.7662 3.75295 13.7091 3.87192 13.6757L5.61359 13.1092C5.72952 13.0656 5.85308 13.046 5.9768 13.0515C6.10053 13.057 6.22185 13.0875 6.33345 13.1412C6.44505 13.1949 6.54461 13.2707 6.62613 13.3639C6.70764 13.4572 6.76941 13.566 6.80772 13.6837C6.84603 13.8015 6.86007 13.9258 6.84901 14.0492C6.83794 14.1725 6.802 14.2923 6.74334 14.4014C6.68468 14.5105 6.60453 14.6065 6.50773 14.6838C6.41092 14.761 6.30038 14.8179 6.18101 14.8508ZM12.9167 20.25C12.9167 20.4931 12.8201 20.7263 12.6482 20.8982C12.4763 21.0701 12.2431 21.1667 12 21.1667C11.7569 21.1667 11.5237 21.0701 11.3518 20.8982C11.1799 20.7263 11.0833 20.4931 11.0833 20.25V18.4167C11.0833 18.1736 11.1799 17.9404 11.3518 17.7685C11.5237 17.5966 11.7569 17.5 12 17.5C12.2431 17.5 12.4763 17.5966 12.6482 17.7685C12.8201 17.9404 12.9167 18.1736 12.9167 18.4167V20.25ZM12 14.9333L8.54967 16.7483L9.20876 12.9066L6.4175 10.1859L10.2748 9.62583L12 6.13333L13.7252 9.62583L17.5825 10.1859L14.7913 12.9066L15.4503 16.7483L12 14.9333ZM19.5625 15.4192L17.8208 14.8527C17.7015 14.8197 17.59 14.7629 17.4932 14.6856C17.3964 14.6084 17.3162 14.5123 17.2576 14.4032C17.1989 14.2942 17.163 14.1743 17.1519 14.051C17.1409 13.9276 17.1549 13.8033 17.1932 13.6856C17.2315 13.5678 17.2933 13.459 17.3748 13.3658C17.4563 13.2725 17.5559 13.1968 17.6675 13.1431C17.7791 13.0894 17.9004 13.0588 18.0241 13.0533C18.1479 13.0478 18.2714 13.0674 18.3873 13.111L20.129 13.6775C20.248 13.7109 20.359 13.768 20.4553 13.8454C20.5517 13.9227 20.6314 14.0188 20.6897 14.1278C20.7479 14.2367 20.7836 14.3563 20.7944 14.4794C20.8053 14.6025 20.7912 14.7265 20.7529 14.844C20.7146 14.9615 20.653 15.0701 20.5717 15.1631C20.4904 15.2562 20.3911 15.3319 20.2799 15.3856C20.1686 15.4393 20.0476 15.47 19.9242 15.4757C19.8007 15.4815 19.6783 15.4623 19.5625 15.4192Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/FinanceAndECommerce/scales-02.svg b/app/components/base/icons/assets/vender/solid/FinanceAndECommerce/scales-02.svg
new file mode 100644
index 0000000..8ebaef5
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/FinanceAndECommerce/scales-02.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8.64494 5.5L4 5.50001C3.44772 5.50001 3 5.05229 3 4.50001C3 3.94772 3.44771 3.50001 4 3.50001L8.64494 3.5C9.07521 2.05426 10.4145 1 12 1C13.5855 1 14.9248 2.05426 15.3551 3.5L20 3.5C20.5523 3.5 21 3.94772 21 4.5C21 5.05229 20.5523 5.5 20 5.5L15.3551 5.5C15.0191 6.62889 14.1289 7.51909 13 7.85506V20H20C20.5523 20 21 20.4477 21 21C21 21.5523 20.5523 22 20 22L4 22C3.44772 22 3 21.5523 3 21C3 20.4477 3.44772 20 4 20H11V7.85506C9.87111 7.51909 8.98091 6.62889 8.64494 5.5Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.49998 7C5.83892 7 6.15479 7.17168 6.33914 7.4561L9.34294 12.0905C9.5058 12.3416 9.65261 12.5678 9.77323 12.9247C9.82544 13.0792 9.86232 13.2714 9.88454 13.4092C9.90677 13.5471 9.93212 13.7411 9.93109 13.9042C9.9302 14.0459 9.92522 14.1726 9.90862 14.2966C9.89198 14.421 9.86633 14.5189 9.85041 14.5797L9.84797 14.5891C9.33962 16.5355 7.60137 18 5.49998 18C3.3986 18 1.66034 16.5355 1.152 14.5891L1.14959 14.5798C1.13367 14.5191 1.108 14.421 1.09135 14.2966C1.07475 14.1726 1.06977 14.0459 1.06888 13.9042C1.06785 13.7411 1.0932 13.5471 1.11542 13.4092C1.13765 13.2714 1.17453 13.0792 1.22674 12.9247C1.34736 12.5678 1.49417 12.3416 1.65703 12.0905L4.66083 7.4561C4.84518 7.17168 5.16105 7 5.49998 7ZM5.49998 9.83859L4.09907 12H6.9009L5.49998 9.83859Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M19.3391 7.4561C19.1548 7.17168 18.8389 7 18.5 7C18.161 7 17.8452 7.17168 17.6608 7.4561L14.657 12.0905C14.4942 12.3416 14.3474 12.5678 14.2267 12.9247C14.1745 13.0792 14.1376 13.2714 14.1154 13.4092C14.0932 13.5471 14.0679 13.7411 14.0689 13.9042C14.0698 14.0459 14.0748 14.1726 14.0914 14.2966C14.108 14.421 14.1337 14.519 14.1496 14.5798L14.152 14.5891C14.6603 16.5355 16.3986 18 18.5 18C20.6014 18 22.3396 16.5355 22.848 14.5891L22.8504 14.5798C22.8663 14.5191 22.892 14.421 22.9086 14.2966C22.9252 14.1726 22.9302 14.0459 22.9311 13.9042C22.9321 13.7411 22.9068 13.5471 22.8845 13.4092C22.8623 13.2714 22.8254 13.0792 22.7732 12.9247C22.6526 12.5678 22.5058 12.3416 22.3429 12.0905L19.3391 7.4561ZM17.0991 12L18.5 9.83859L19.9009 12H17.0991Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/alertsAndFeedback/alert-triangle.svg b/app/components/base/icons/assets/vender/solid/alertsAndFeedback/alert-triangle.svg
new file mode 100644
index 0000000..d740738
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/alertsAndFeedback/alert-triangle.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="alert-triangle">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M6.40616 0.834185C6.14751 0.719172 5.85222 0.719172 5.59356 0.834185C5.3938 0.923011 5.26403 1.07947 5.17373 1.20696C5.08495 1.3323 4.9899 1.49651 4.88536 1.67711L0.751783 8.81693C0.646828 8.99818 0.551451 9.16289 0.486781 9.30268C0.421056 9.44475 0.349754 9.63572 0.372478 9.85369C0.401884 10.1357 0.549654 10.392 0.779012 10.5588C0.956259 10.6877 1.15726 10.7217 1.31314 10.736C1.46651 10.75 1.65684 10.75 1.86628 10.75H10.1334C10.3429 10.75 10.5332 10.75 10.6866 10.736C10.8425 10.7217 11.0435 10.6877 11.2207 10.5588C11.4501 10.392 11.5978 10.1357 11.6272 9.85369C11.65 9.63572 11.5787 9.44475 11.5129 9.30268C11.4483 9.1629 11.3529 8.9982 11.248 8.81697L7.11436 1.67709C7.00983 1.49651 6.91477 1.3323 6.82599 1.20696C6.73569 1.07947 6.60593 0.923011 6.40616 0.834185ZM6.49988 4.5C6.49988 4.22386 6.27602 4 5.99988 4C5.72374 4 5.49988 4.22386 5.49988 4.5V6.5C5.49988 6.77614 5.72374 7 5.99988 7C6.27602 7 6.49988 6.77614 6.49988 6.5V4.5ZM5.99988 8C5.72374 8 5.49988 8.22386 5.49988 8.5C5.49988 8.77614 5.72374 9 5.99988 9H6.00488C6.28102 9 6.50488 8.77614 6.50488 8.5C6.50488 8.22386 6.28102 8 6.00488 8H5.99988Z" fill="#F79009"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/arrows/chevron-down.svg b/app/components/base/icons/assets/vender/solid/arrows/chevron-down.svg
new file mode 100644
index 0000000..c766447
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/arrows/chevron-down.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="chevron-down">
+<path id="Icon" d="M6 9L12 15L18 9" stroke="#101828" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/arrows/high-priority.svg b/app/components/base/icons/assets/vender/solid/arrows/high-priority.svg
new file mode 100644
index 0000000..cfb965c
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/arrows/high-priority.svg
@@ -0,0 +1,6 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M9.01488 2.54553C8.91549 2.45869 8.79321 2.40229 8.66264 2.38306C8.53206 2.36384 8.39872 2.38261 8.27852 2.43712C8.15833 2.49164 8.05636 2.5796 7.98481 2.6905C7.91325 2.8014 7.87513 2.93055 7.875 3.06253V6.50003C6.05164 6.50003 4.30295 7.22436 3.01364 8.51367C1.72433 9.80299 1 11.5517 1 13.375C1 15.1984 1.72433 16.9471 3.01364 18.2364C4.30295 19.5257 6.05164 20.25 7.875 20.25H12C12.3647 20.25 12.7144 20.1052 12.9723 19.8473C13.2301 19.5894 13.375 19.2397 13.375 18.875C13.375 18.5104 13.2301 18.1606 12.9723 17.9028C12.7144 17.6449 12.3647 17.5 12 17.5H7.875C6.78098 17.5 5.73177 17.0654 4.95818 16.2919C4.1846 15.5183 3.75 14.4691 3.75 13.375C3.75 12.281 4.1846 11.2318 4.95818 10.4582C5.73177 9.68463 6.78098 9.25003 7.875 9.25003V12.6875C7.87513 12.8195 7.91325 12.9487 7.98481 13.0596C8.05636 13.1705 8.15833 13.2584 8.27852 13.3129C8.39872 13.3675 8.53206 13.3862 8.66264 13.367C8.79321 13.3478 8.91549 13.2914 9.01488 13.2045L14.5149 8.39203C14.5885 8.32751 14.6475 8.24801 14.6879 8.15885C14.7283 8.06969 14.7492 7.97292 14.7492 7.87503C14.7492 7.77714 14.7283 7.68038 14.6879 7.59122C14.6475 7.50206 14.5885 7.42256 14.5149 7.35803L9.01488 2.54553Z" fill="#212121"/>
+<path d="M21.625 17.5H17.5C17.1353 17.5 16.7856 17.6449 16.5277 17.9028C16.2699 18.1606 16.125 18.5104 16.125 18.875C16.125 19.2397 16.2699 19.5894 16.5277 19.8473C16.7856 20.1052 17.1353 20.25 17.5 20.25H21.625C21.9897 20.25 22.3394 20.1052 22.5973 19.8473C22.8551 19.5894 23 19.2397 23 18.875C23 18.5104 22.8551 18.1606 22.5973 17.9028C22.3394 17.6449 21.9897 17.5 21.625 17.5Z" fill="#212121"/>
+<path d="M21.625 12H17.5C17.1353 12 16.7856 12.1449 16.5277 12.4028C16.2699 12.6606 16.125 13.0104 16.125 13.375C16.125 13.7397 16.2699 14.0894 16.5277 14.3473C16.7856 14.6052 17.1353 14.75 17.5 14.75H21.625C21.9897 14.75 22.3394 14.6052 22.5973 14.3473C22.8551 14.0894 23 13.7397 23 13.375C23 13.0104 22.8551 12.6606 22.5973 12.4028C22.3394 12.1449 21.9897 12 21.625 12Z" fill="#212121"/>
+<path d="M17.5 9.25003H21.625C21.9897 9.25003 22.3394 9.10517 22.5973 8.8473C22.8551 8.58944 23 8.23971 23 7.87503C23 7.51036 22.8551 7.16062 22.5973 6.90276C22.3394 6.6449 21.9897 6.50003 21.625 6.50003H17.5C17.1353 6.50003 16.7856 6.6449 16.5277 6.90276C16.2699 7.16062 16.125 7.51036 16.125 7.87503C16.125 8.23971 16.2699 8.58944 16.5277 8.8473C16.7856 9.10517 17.1353 9.25003 17.5 9.25003Z" fill="#212121"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/communication/ai-text.svg b/app/components/base/icons/assets/vender/solid/communication/ai-text.svg
new file mode 100644
index 0000000..dcda2ef
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/communication/ai-text.svg
@@ -0,0 +1,6 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M4 5C3.44772 5 3 5.44772 3 6C3 6.55228 3.44772 7 4 7H20C20.5523 7 21 6.55228 21 6C21 5.44772 20.5523 5 20 5H4Z" fill="black"/>
+<path d="M17.9191 9.60608C17.7616 9.2384 17.4 9 17 9C16.6 9 16.2384 9.2384 16.0809 9.60608L14.7384 12.7384L11.6061 14.0809C11.2384 14.2384 11 14.6 11 15C11 15.4 11.2384 15.7616 11.6061 15.9191L14.7384 17.2616L16.0809 20.3939C16.2384 20.7616 16.6 21 17 21C17.4 21 17.7616 20.7616 17.9191 20.3939L19.2616 17.2616L22.3939 15.9191C22.7616 15.7616 23 15.4 23 15C23 14.6 22.7616 14.2384 22.3939 14.0809L19.2616 12.7384L17.9191 9.60608Z" fill="black"/>
+<path d="M4 11C3.44772 11 3 11.4477 3 12C3 12.5523 3.44772 13 4 13H9C9.55228 13 10 12.5523 10 12C10 11.4477 9.55228 11 9 11H4Z" fill="black"/>
+<path d="M4 17C3.44772 17 3 17.4477 3 18C3 18.5523 3.44772 19 4 19H7C7.55228 19 8 18.5523 8 18C8 17.4477 7.55228 17 7 17H4Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/communication/bubble-text-mod.svg b/app/components/base/icons/assets/vender/solid/communication/bubble-text-mod.svg
new file mode 100644
index 0000000..7a37245
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/communication/bubble-text-mod.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2 9C2 5.68629 4.68629 3 8 3H16C19.3137 3 22 5.68629 22 9V15C22 18.3137 19.3137 21 16 21H3C2.44772 21 2 20.5523 2 20V9ZM9 9C8.44772 9 8 9.44772 8 10C8 10.5523 8.44772 11 9 11H15C15.5523 11 16 10.5523 16 10C16 9.44772 15.5523 9 15 9H9ZM9 13C8.44772 13 8 13.4477 8 14C8 14.5523 8.44772 15 9 15H12C12.5523 15 13 14.5523 13 14C13 13.4477 12.5523 13 12 13H9Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/communication/chat-bot.svg b/app/components/base/icons/assets/vender/solid/communication/chat-bot.svg
new file mode 100644
index 0000000..53ee1bb
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/communication/chat-bot.svg
@@ -0,0 +1,7 @@
+<svg width="13" height="12" viewBox="0 0 13 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="chat-bot">
+<path id="Vector" d="M4.20913 2.76912L4.09542 2.83543L3.98172 2.76912C3.90566 2.72476 3.86328 2.64979 3.86328 2.57101C3.86328 2.44347 3.96789 2.33887 4.09542 2.33887C4.22296 2.33887 4.32757 2.44347 4.32757 2.57101C4.32757 2.64979 4.28519 2.72476 4.20913 2.76912Z" fill="#1570EF" stroke="#1570EF" stroke-width="1.25"/>
+<path id="Vector_2" d="M10.0174 6.00058C10.0123 5.98686 10.0097 5.97229 10.0046 5.95858C9.81684 5.48158 9.35398 5.14258 8.81056 5.14258H8.66784L7.52484 5.99972C7.33713 6.14029 7.11556 6.21444 6.88284 6.21444C6.29184 6.21444 5.81056 5.73358 5.81056 5.14258H2.81013C2.10127 5.14258 1.52441 5.71944 1.52441 6.42829V9.85686C1.52441 10.5657 2.10127 11.1426 2.81013 11.1426H8.81013C9.51899 11.1426 10.0958 10.5657 10.0958 9.85686V6.42829C10.0958 6.34386 10.0868 6.26158 10.071 6.18186C10.0586 6.11886 10.0384 6.05972 10.0174 6.00058ZM3.88156 8.57115C3.52713 8.57115 3.2387 8.28272 3.2387 7.92829C3.2387 7.57386 3.52713 7.28544 3.88156 7.28544C4.23599 7.28544 4.52441 7.57386 4.52441 7.92829C4.52441 8.28272 4.23599 8.57115 3.88156 8.57115ZM7.7387 8.57115C7.38427 8.57115 7.09584 8.28272 7.09584 7.92829C7.09584 7.57386 7.38427 7.28544 7.7387 7.28544C8.09313 7.28544 8.38156 7.57386 8.38156 7.92829C8.38156 8.28272 8.09313 8.57115 7.7387 8.57115Z" fill="#1570EF"/>
+<path id="Vector_3" d="M6.66699 5.14314V1.71456C6.66699 1.24099 7.05056 0.857422 7.52413 0.857422H10.9527C11.4263 0.857422 11.8098 1.24099 11.8098 1.71456V3.42885C11.8098 3.90242 11.4263 4.28599 10.9527 4.28599H8.38128L7.00985 5.31456C6.86842 5.42042 6.66699 5.31971 6.66699 5.14314Z" fill="#1570EF"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/communication/cute-robot.svg b/app/components/base/icons/assets/vender/solid/communication/cute-robot.svg
new file mode 100644
index 0000000..8fa74ce
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/communication/cute-robot.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="cute-robot">
+<path id="Icon" fill-rule="evenodd" clip-rule="evenodd" d="M12 1C12.5523 1 13 1.44772 13 2V3H17C18.6569 3 20 4.34315 20 6V11C20 11.8885 19.6138 12.6868 19 13.2361V14.5858L20.7071 16.2929C21.0976 16.6834 21.0976 17.3166 20.7071 17.7071C20.3166 18.0976 19.6834 18.0976 19.2929 17.7071L18.681 17.0952C17.7905 19.9377 15.1361 22 12 22C8.8639 22 6.20948 19.9377 5.31897 17.0952L4.70711 17.7071C4.31658 18.0976 3.68342 18.0976 3.29289 17.7071C2.90237 17.3166 2.90237 16.6834 3.29289 16.2929L5 14.5858V13.2361C4.38625 12.6868 4 11.8885 4 11V6C4 4.34315 5.34315 3 7 3H11V2C11 1.44772 11.4477 1 12 1ZM7 5C6.44772 5 6 5.44772 6 6V11C6 11.5523 6.44772 12 7 12H17C17.5523 12 18 11.5523 18 11V6C18 5.44772 17.5523 5 17 5H7ZM9 7C9.55228 7 10 7.44772 10 8V9C10 9.55228 9.55228 10 9 10C8.44772 10 8 9.55228 8 9V8C8 7.44772 8.44772 7 9 7ZM15 7C15.5523 7 16 7.44772 16 8V9C16 9.55228 15.5523 10 15 10C14.4477 10 14 9.55228 14 9V8C14 7.44772 14.4477 7 15 7Z" fill="black"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/communication/edit-list.svg b/app/components/base/icons/assets/vender/solid/communication/edit-list.svg
new file mode 100644
index 0000000..e6fdc2d
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/communication/edit-list.svg
@@ -0,0 +1,6 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M3.00195 4C3.00195 3.44772 3.44967 3 4.00195 3H20.002C20.5542 3 21.002 3.44772 21.002 4C21.002 4.55228 20.5542 5 20.002 5H4.00195C3.44967 5 3.00195 4.55228 3.00195 4Z" fill="black"/>
+<path d="M3.00195 8C3.00195 7.44772 3.44967 7 4.00195 7H10.502C11.0542 7 11.502 7.44772 11.502 8C11.502 8.55228 11.0542 9 10.502 9H4.00195C3.44967 9 3.00195 8.55228 3.00195 8Z" fill="black"/>
+<path d="M4 11C3.44772 11 3 11.4477 3 12C3 12.5523 3.44772 13 4 13H7.0022C7.55448 13 8.0022 12.5523 8.0022 12C8.0022 11.4477 7.55448 11 7.0022 11H4Z" fill="black"/>
+<path d="M19.2584 8.70705C18.0868 7.53548 16.1873 7.53547 15.0158 8.70705L7.29485 16.428C7.10731 16.6155 7.00195 16.8699 7.00195 17.1351V20.9999C7.00195 21.5522 7.44967 21.9999 8.00195 21.9999H11.8668C12.132 21.9999 12.3864 21.8946 12.5739 21.7071L20.2948 13.9861C21.4664 12.8146 21.4664 10.9151 20.2948 9.74349L19.2584 8.70705Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/communication/list-sparkle.svg b/app/components/base/icons/assets/vender/solid/communication/list-sparkle.svg
new file mode 100644
index 0000000..dcda2ef
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/communication/list-sparkle.svg
@@ -0,0 +1,6 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M4 5C3.44772 5 3 5.44772 3 6C3 6.55228 3.44772 7 4 7H20C20.5523 7 21 6.55228 21 6C21 5.44772 20.5523 5 20 5H4Z" fill="black"/>
+<path d="M17.9191 9.60608C17.7616 9.2384 17.4 9 17 9C16.6 9 16.2384 9.2384 16.0809 9.60608L14.7384 12.7384L11.6061 14.0809C11.2384 14.2384 11 14.6 11 15C11 15.4 11.2384 15.7616 11.6061 15.9191L14.7384 17.2616L16.0809 20.3939C16.2384 20.7616 16.6 21 17 21C17.4 21 17.7616 20.7616 17.9191 20.3939L19.2616 17.2616L22.3939 15.9191C22.7616 15.7616 23 15.4 23 15C23 14.6 22.7616 14.2384 22.3939 14.0809L19.2616 12.7384L17.9191 9.60608Z" fill="black"/>
+<path d="M4 11C3.44772 11 3 11.4477 3 12C3 12.5523 3.44772 13 4 13H9C9.55228 13 10 12.5523 10 12C10 11.4477 9.55228 11 9 11H4Z" fill="black"/>
+<path d="M4 17C3.44772 17 3 17.4477 3 18C3 18.5523 3.44772 19 4 19H7C7.55228 19 8 18.5523 8 18C8 17.4477 7.55228 17 7 17H4Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/communication/logic.svg b/app/components/base/icons/assets/vender/solid/communication/logic.svg
new file mode 100644
index 0000000..4c019e3
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/communication/logic.svg
@@ -0,0 +1,8 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="logic">
+<g id="Vector">
+<path d="M12.9089 11.9999C13.913 11.9999 14.727 11.186 14.727 10.1819C14.727 9.17775 13.913 8.36376 12.9089 8.36376C11.9048 8.36376 11.0908 9.17775 11.0908 10.1819C11.0908 11.186 11.9048 11.9999 12.9089 11.9999Z" fill="black"/>
+<path d="M12.2871 1.11229C9.95219 1.3228 7.78275 2.40696 6.21264 4.14796C4.64254 5.88897 3.78749 8.15849 3.81849 10.5027V10.8763L2.09676 14.3207C2.04261 14.4277 2.01016 14.5444 2.00129 14.6639C1.99241 14.7835 2.00729 14.9037 2.04506 15.0175C2.08283 15.1313 2.14275 15.2366 2.22136 15.3271C2.29997 15.4177 2.39573 15.4918 2.50311 15.5452L3.81849 16.1979V18.3632C3.81849 19.0865 4.10581 19.7802 4.61725 20.2916C5.12869 20.803 5.82234 21.0904 6.54562 21.0904H9.27276V22.9084H19.2722V16.6606C20.5995 15.3604 21.496 13.6844 21.8409 11.8588C22.1858 10.0331 21.9625 8.14562 21.2012 6.45084C20.4398 4.75606 19.1769 3.33556 17.583 2.38094C15.989 1.42633 14.1406 0.983541 12.2871 1.11229ZM17.4542 11.0909H16.416C16.3316 11.4163 16.2016 11.7282 16.0297 12.0172L16.7651 12.7526C16.8519 12.8365 16.9212 12.9368 16.9688 13.0477C17.0165 13.1586 17.0415 13.2779 17.0426 13.3986C17.0436 13.5193 17.0206 13.639 16.9749 13.7507C16.9292 13.8624 16.8617 13.9639 16.7764 14.0493C16.691 14.1346 16.5895 14.2021 16.4778 14.2478C16.3661 14.2935 16.2464 14.3165 16.1257 14.3155C16.005 14.3144 15.8857 14.2893 15.7748 14.2417C15.6639 14.1941 15.5636 14.1248 15.4797 14.038L14.7443 13.3026C14.4553 13.4745 14.1434 13.6045 13.818 13.6889V14.727C13.818 14.9681 13.7222 15.1994 13.5517 15.3698C13.3812 15.5403 13.15 15.6361 12.9089 15.6361C12.6678 15.6361 12.4366 15.5403 12.2661 15.3698C12.0957 15.1994 11.9999 14.9681 11.9999 14.727V13.6889C11.6744 13.6045 11.3625 13.4745 11.0736 13.3026L10.3382 14.038C10.1667 14.2036 9.93708 14.2952 9.69873 14.2931C9.46038 14.2911 9.23239 14.1955 9.06384 14.0269C8.8953 13.8584 8.79969 13.6304 8.79762 13.392C8.79555 13.1537 8.88718 12.924 9.05277 12.7526L9.78818 12.0172C9.61629 11.7282 9.48622 11.4163 9.40184 11.0909H8.36371C8.12262 11.0909 7.8914 10.9951 7.72092 10.8246C7.55044 10.6541 7.45467 10.4229 7.45467 10.1818C7.45467 9.94073 7.55044 9.70951 7.72092 9.53903C7.8914 9.36855 8.12262 9.27278 8.36371 9.27278H9.40184C9.48622 8.94731 9.61629 8.63544 9.78818 8.34647L9.05277 7.61105C8.88718 7.4396 8.79555 7.20997 8.79762 6.97163C8.79969 6.73328 8.8953 6.50528 9.06384 6.33673C9.23239 6.16819 9.46038 6.07259 9.69873 6.07052C9.93708 6.06844 10.1667 6.16007 10.3382 6.32566L11.0736 7.06108C11.3625 6.88918 11.6744 6.75911 11.9999 6.67473V5.63661C11.9999 5.39551 12.0957 5.16429 12.2661 4.99381C12.4366 4.82334 12.6678 4.72756 12.9089 4.72756C13.15 4.72756 13.3812 4.82334 13.5517 4.99381C13.7222 5.16429 13.818 5.39551 13.818 5.63661V6.67473C14.1434 6.75911 14.4553 6.88918 14.7443 7.06108L15.4797 6.32566C15.5636 6.23884 15.6639 6.16958 15.7748 6.12194C15.8857 6.0743 16.005 6.04922 16.1257 6.04817C16.2464 6.04713 16.3661 6.07013 16.4778 6.11583C16.5895 6.16154 16.691 6.22904 16.7764 6.31439C16.8617 6.39975 16.9292 6.50124 16.9749 6.61296C17.0206 6.72468 17.0436 6.84438 17.0426 6.96508C17.0415 7.08578 17.0165 7.20507 16.9688 7.31598C16.9212 7.42688 16.8519 7.52719 16.7651 7.61105L16.0297 8.34647C16.2016 8.63544 16.3316 8.94731 16.416 9.27278H17.4542C17.6952 9.27278 17.9265 9.36855 18.0969 9.53903C18.2674 9.70951 18.3632 9.94073 18.3632 10.1818C18.3632 10.4229 18.2674 10.6541 18.0969 10.8246C17.9265 10.9951 17.6952 11.0909 17.4542 11.0909Z" fill="black"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/communication/message-dots-circle.svg b/app/components/base/icons/assets/vender/solid/communication/message-dots-circle.svg
new file mode 100644
index 0000000..18ccff8
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/communication/message-dots-circle.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="message-dots-circle">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M12 2C6.47715 2 2 6.47715 2 12C2 13.3283 2.25952 14.5985 2.73156 15.7608C2.77419 15.8658 2.79872 15.9264 2.81552 15.9711L2.82063 15.9849L2.82 15.9897C2.815 16.0266 2.80672 16.0769 2.79071 16.173L2.19294 19.7596C2.16612 19.9202 2.13611 20.0999 2.12433 20.256C2.11148 20.4261 2.10701 20.6969 2.22973 20.983C2.38144 21.3367 2.6633 21.6186 3.017 21.7703C3.30312 21.893 3.57386 21.8885 3.74404 21.8757C3.90013 21.8639 4.07985 21.8339 4.24049 21.8071L7.82705 21.2093C7.92309 21.1933 7.97339 21.185 8.0103 21.18L8.01505 21.1794L8.02887 21.1845C8.07362 21.2013 8.13423 21.2258 8.23921 21.2684C9.4015 21.7405 10.6717 22 12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2ZM6 12C6 11.1716 6.67157 10.5 7.5 10.5C8.32843 10.5 9 11.1716 9 12C9 12.8284 8.32843 13.5 7.5 13.5C6.67157 13.5 6 12.8284 6 12ZM10.5 12C10.5 11.1716 11.1716 10.5 12 10.5C12.8284 10.5 13.5 11.1716 13.5 12C13.5 12.8284 12.8284 13.5 12 13.5C11.1716 13.5 10.5 12.8284 10.5 12ZM16.5 10.5C15.6716 10.5 15 11.1716 15 12C15 12.8284 15.6716 13.5 16.5 13.5C17.3284 13.5 18 12.8284 18 12C18 11.1716 17.3284 10.5 16.5 10.5Z" fill="black"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/communication/message-fast.svg b/app/components/base/icons/assets/vender/solid/communication/message-fast.svg
new file mode 100644
index 0000000..66a206f
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/communication/message-fast.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M16.2414 2H7.7588C6.95383 1.99999 6.28946 1.99998 5.74827 2.04419C5.18617 2.09012 4.66947 2.18868 4.18413 2.43598C3.43149 2.81947 2.81956 3.43139 2.43607 4.18404C2.18878 4.66937 2.09022 5.18608 2.04429 5.74818C2.00007 6.28937 2.00008 6.95373 2.0001 7.7587L2.00005 14.1376C1.99962 14.933 1.9993 15.5236 2.13639 16.0353C2.50626 17.4156 3.58445 18.4938 4.96482 18.8637C5.27229 18.9461 5.60829 18.9789 6.0001 18.9918L6.00009 20.371C6.00005 20.6062 6 20.846 6.01785 21.0425C6.03492 21.2305 6.08012 21.5852 6.32778 21.8955C6.61276 22.2525 7.0449 22.4602 7.50172 22.4597C7.8987 22.4593 8.20394 22.273 8.36137 22.1689C8.52597 22.06 8.7132 21.9102 8.89688 21.7632L11.31 19.8327C11.8286 19.4178 11.9826 19.3007 12.1425 19.219C12.303 19.137 12.4738 19.0771 12.6504 19.0408C12.8263 19.0047 13.0197 19 13.6838 19H16.2414C17.0464 19 17.7107 19 18.2519 18.9558C18.814 18.9099 19.3307 18.8113 19.8161 18.564C20.5687 18.1805 21.1806 17.5686 21.5641 16.816C21.8114 16.3306 21.91 15.8139 21.9559 15.2518C22.0001 14.7106 22.0001 14.0463 22.0001 13.2413V7.75868C22.0001 6.95372 22.0001 6.28936 21.9559 5.74818C21.91 5.18608 21.8114 4.66937 21.5641 4.18404C21.1806 3.43139 20.5687 2.81947 19.8161 2.43598C19.3307 2.18868 18.814 2.09012 18.2519 2.04419C17.7107 1.99998 17.0464 1.99999 16.2414 2ZM12.681 5.5349C12.8938 5.61898 13.0218 5.83714 12.9916 6.06386L12.5688 9.23501L14.48 9.23501C14.5899 9.23498 14.7038 9.23496 14.7979 9.24356C14.8905 9.25203 15.0589 9.27446 15.2095 9.39066C15.3851 9.52617 15.4913 9.73269 15.4996 9.95432C15.5066 10.1444 15.427 10.2945 15.38 10.3747C15.3324 10.4563 15.2661 10.549 15.2022 10.6384L11.9072 15.2514C11.7743 15.4375 11.5317 15.5092 11.319 15.4251C11.1063 15.341 10.9782 15.1229 11.0084 14.8961L11.4312 11.725L9.52004 11.725C9.41011 11.725 9.29618 11.725 9.20206 11.7164C9.10948 11.708 8.94106 11.6855 8.79051 11.5693C8.61493 11.4338 8.50866 11.2273 8.50044 11.0057C8.49339 10.8156 8.57303 10.6655 8.61996 10.5853C8.66766 10.5037 8.7339 10.411 8.79781 10.3216L12.0928 5.70858C12.2257 5.52246 12.4683 5.45083 12.681 5.5349Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/communication/message-heart-circle.svg b/app/components/base/icons/assets/vender/solid/communication/message-heart-circle.svg
new file mode 100644
index 0000000..306ed02
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/communication/message-heart-circle.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="message-heart-circle">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M8.33334 1.3335C4.83554 1.3335 2.00001 4.16903 2.00001 7.66683C2.00001 8.3735 2.116 9.05444 2.33051 9.69084C2.36824 9.80278 2.39045 9.86902 2.40488 9.91786L2.40961 9.93431L2.40711 9.93952C2.38997 9.97486 2.36451 10.0223 2.31687 10.1105L1.21562 12.1489C1.14736 12.2751 1.07614 12.4069 1.02717 12.5214C0.978485 12.6353 0.89963 12.8442 0.93843 13.0919C0.983911 13.3822 1.15477 13.6378 1.40562 13.7908C1.61963 13.9213 1.84282 13.9283 1.96665 13.9269C2.09123 13.9254 2.24018 13.91 2.38296 13.8952L5.8196 13.54C5.87464 13.5343 5.90342 13.5314 5.92449 13.5297L5.92721 13.5295L5.93545 13.5325C5.96135 13.5418 5.99648 13.5553 6.05711 13.5786C6.76441 13.8511 7.53226 14.0002 8.33334 14.0002C11.8311 14.0002 14.6667 11.1646 14.6667 7.66683C14.6667 4.16903 11.8311 1.3335 8.33334 1.3335ZM5.97972 5.72165C6.73124 5.08746 7.73145 5.27376 8.33126 5.96633C8.93106 5.27376 9.91836 5.09414 10.6828 5.72165C11.4472 6.34916 11.5401 7.41616 10.9499 8.16621C10.5843 8.63089 9.66661 9.4796 9.02123 10.0581C8.78417 10.2706 8.66564 10.3769 8.52339 10.4197C8.40136 10.4564 8.26116 10.4564 8.13913 10.4197C7.99688 10.3769 7.87835 10.2706 7.64128 10.0581C6.9959 9.4796 6.0782 8.63089 5.71257 8.16621C5.1224 7.41616 5.22821 6.35583 5.97972 5.72165Z" fill="#DD2590"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/communication/message-smile-square.svg b/app/components/base/icons/assets/vender/solid/communication/message-smile-square.svg
new file mode 100644
index 0000000..105541f
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/communication/message-smile-square.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="message-smile-square">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M10.8273 1.33337H5.17221C4.63556 1.33337 4.19265 1.33336 3.83185 1.36284C3.45712 1.39345 3.11265 1.45916 2.7891 1.62402C2.28733 1.87969 1.87938 2.28763 1.62372 2.7894C1.45886 3.11296 1.39315 3.45743 1.36253 3.83216C1.33306 4.19295 1.33306 4.63586 1.33307 5.17251L1.33304 9.42509C1.33275 9.95535 1.33254 10.3491 1.42394 10.6902C1.67052 11.6105 2.38931 12.3293 3.30955 12.5758C3.51453 12.6308 3.73853 12.6526 3.99974 12.6612L3.99974 13.5807C3.99971 13.7375 3.99967 13.8974 4.01157 14.0284C4.02296 14.1537 4.05309 14.3902 4.2182 14.597C4.40818 14.835 4.69628 14.9735 5.00082 14.9732C5.26547 14.9729 5.46897 14.8487 5.57392 14.7793C5.68366 14.7067 5.80847 14.6068 5.93093 14.5088L7.53968 13.2218C7.8854 12.9453 7.98804 12.8672 8.0947 12.8127C8.20168 12.758 8.31556 12.7181 8.43324 12.6939C8.55057 12.6699 8.6795 12.6667 9.12224 12.6667H10.8273C11.3639 12.6667 11.8068 12.6667 12.1676 12.6372C12.5424 12.6066 12.8868 12.5409 13.2104 12.3761C13.7121 12.1204 14.1201 11.7124 14.3758 11.2107C14.5406 10.8871 14.6063 10.5427 14.6369 10.1679C14.6664 9.80713 14.6664 9.36423 14.6664 8.82759V5.17249C14.6664 4.63585 14.6664 4.19295 14.6369 3.83216C14.6063 3.45743 14.5406 3.11296 14.3758 2.7894C14.1201 2.28763 13.7121 1.87969 13.2104 1.62402C12.8868 1.45916 12.5424 1.39345 12.1676 1.36284C11.8068 1.33336 11.3639 1.33337 10.8273 1.33337ZM8.99479 5.00004C8.99479 4.44776 9.44251 4.00004 9.99479 4.00004C10.5471 4.00004 10.9948 4.44776 10.9948 5.00004C10.9948 5.55233 10.5471 6.00004 9.99479 6.00004C9.44251 6.00004 8.99479 5.55233 8.99479 5.00004ZM4.92813 7.80008C5.22175 7.57986 5.63792 7.63849 5.85937 7.93064C5.90047 7.98307 5.94569 8.03241 5.99175 8.08048C6.08995 8.18295 6.23751 8.32196 6.42858 8.46092C6.81329 8.74071 7.34515 9.00008 7.9948 9.00008C8.64444 9.00008 9.17631 8.74071 9.56102 8.46092C9.75209 8.32196 9.89965 8.18295 9.99785 8.08048C10.0439 8.03242 10.0891 7.98306 10.1302 7.93064C10.3517 7.63849 10.7678 7.57986 11.0615 7.80008C11.356 8.02099 11.4157 8.43886 11.1948 8.73341C11.1965 8.73124 11.1925 8.73622 11.1857 8.74479C11.1695 8.76522 11.137 8.8061 11.1259 8.81929C11.0868 8.86587 11.0315 8.92896 10.9605 9.00302C10.8191 9.15055 10.6125 9.34486 10.3452 9.53924C9.81328 9.92612 9.01182 10.3334 7.9948 10.3334C6.97778 10.3334 6.17631 9.92612 5.64435 9.53924C5.37709 9.34486 5.17048 9.15055 5.0291 9.00302C4.95813 8.92896 4.9028 8.86587 4.8637 8.81929C4.84413 8.79597 4.82856 8.77671 4.81707 8.76219C4.58678 8.46467 4.61774 8.03288 4.92813 7.80008ZM5.99479 4.00004C5.44251 4.00004 4.99479 4.44776 4.99479 5.00004C4.99479 5.55233 5.44251 6.00004 5.99479 6.00004C6.54708 6.00004 6.99479 5.55233 6.99479 5.00004C6.99479 4.44776 6.54708 4.00004 5.99479 4.00004Z" fill="#06AED4"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/communication/send-03.svg b/app/components/base/icons/assets/vender/solid/communication/send-03.svg
new file mode 100644
index 0000000..c2e8f1f
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/communication/send-03.svg
@@ -0,0 +1,5 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="send-03">
+<path id="Solid" d="M18.4385 10.5535C18.6111 10.2043 18.6111 9.79465 18.4385 9.44548C18.2865 9.13803 18.0197 8.97682 17.8815 8.89905C17.7327 8.81532 17.542 8.72955 17.3519 8.64403L3.36539 2.35014C3.17087 2.26257 2.97694 2.17526 2.81335 2.11859C2.66315 2.06656 2.36076 1.97151 2.02596 2.06467C1.64761 2.16994 1.34073 2.4469 1.19734 2.81251C1.07045 3.13604 1.13411 3.44656 1.17051 3.60129C1.21017 3.76983 1.27721 3.9717 1.34445 4.17418L2.69818 8.25278C2.80718 8.58118 2.86168 8.74537 2.96302 8.86678C3.05252 8.97399 3.16752 9.05699 3.29746 9.10816C3.44462 9.1661 3.61762 9.1661 3.96363 9.1661H10.0001C10.4603 9.1661 10.8334 9.53919 10.8334 9.99943C10.8334 10.4597 10.4603 10.8328 10.0001 10.8328H3.97939C3.63425 10.8328 3.46168 10.8328 3.3148 10.8905C3.18508 10.9414 3.07022 11.0241 2.98072 11.1309C2.87937 11.2519 2.82459 11.4155 2.71502 11.7428L1.3504 15.8191C1.28243 16.0221 1.21472 16.2242 1.17455 16.3929C1.13773 16.5476 1.07301 16.8587 1.19956 17.1831C1.34245 17.5493 1.64936 17.827 2.02806 17.9327C2.36342 18.0263 2.6665 17.9309 2.81674 17.8789C2.98066 17.8221 3.17507 17.7346 3.37023 17.6467L17.3518 11.355C17.542 11.2695 17.7327 11.1837 17.8815 11.0999C18.0197 11.0222 18.2865 10.861 18.4385 10.5535Z" fill="#D0D5DD"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/development/api-connection-mod.svg b/app/components/base/icons/assets/vender/solid/development/api-connection-mod.svg
new file mode 100644
index 0000000..9e4b0c8
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/development/api-connection-mod.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon L">
+<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M7.99996 3.33333C5.42263 3.33333 3.33329 5.42267 3.33329 8C3.33329 10.5773 5.42263 12.6667 7.99996 12.6667C9.72643 12.6667 11.2348 11.7295 12.0427 10.3329C12.227 10.0141 12.6349 9.90523 12.9536 10.0896C13.2723 10.274 13.3812 10.6818 13.1968 11.0005C12.1604 12.7921 10.2216 14 7.99996 14C4.91159 14 2.36821 11.6666 2.03658 8.66667H1.33329C0.965103 8.66667 0.666626 8.36819 0.666626 8C0.666626 7.63181 0.965103 7.33333 1.33329 7.33333H2.03658C2.36821 4.33337 4.91159 2 7.99996 2C10.2216 2 12.1604 3.20785 13.1968 4.99952C13.3812 5.31823 13.2723 5.72605 12.9536 5.91041C12.6349 6.09477 12.227 5.98585 12.0427 5.66714C11.2348 4.27054 9.72643 3.33333 7.99996 3.33333ZM7.99996 6C6.89539 6 5.99996 6.89543 5.99996 8C5.99996 9.10455 6.89539 10 7.99996 10C9.1045 10 9.99996 9.10454 9.99996 8C9.99996 6.89543 9.10451 6 7.99996 6ZM4.66663 8C4.66663 6.15905 6.15901 4.66667 7.99996 4.66667C9.61257 4.66667 10.9578 5.81184 11.2666 7.33333H14.6666C15.0348 7.33333 15.3333 7.63181 15.3333 8C15.3333 8.36819 15.0348 8.66667 14.6666 8.66667H11.2666C10.9578 10.1881 9.61257 11.3333 7.99996 11.3333C6.159 11.3333 4.66663 9.84092 4.66663 8Z" fill="#354052"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/development/api-connection.svg b/app/components/base/icons/assets/vender/solid/development/api-connection.svg
new file mode 100644
index 0000000..5eddeeb
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/development/api-connection.svg
@@ -0,0 +1,8 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="api-connection">
+<g id="vector">
+<path d="M4.36364 11.8182C4.36364 7.60073 7.78255 4.18182 12 4.18182C14.8252 4.18182 17.2934 5.71543 18.6154 8.00079C18.9171 8.52231 19.5844 8.70053 20.106 8.39884C20.6275 8.09716 20.8057 7.42982 20.504 6.9083C18.8081 3.97648 15.6355 2 12 2C6.9463 2 2.78441 5.81824 2.24174 10.7273H1.09091C0.488417 10.7273 0 11.2157 0 11.8182C0 12.4207 0.488417 12.9091 1.09091 12.9091H2.24174C2.78441 17.8181 6.9463 21.6364 12 21.6364C15.6355 21.6364 18.8081 19.6599 20.504 16.7281C20.8057 16.2065 20.6275 15.5392 20.106 15.2375C19.5844 14.9358 18.9171 15.1141 18.6154 15.6356C17.2934 17.9209 14.8252 19.4545 12 19.4545C7.78255 19.4545 4.36364 16.0356 4.36364 11.8182Z" fill="black"/>
+<path d="M12 6.36364C8.98754 6.36364 6.54545 8.80572 6.54545 11.8182C6.54545 14.8306 8.98754 17.2727 12 17.2727C14.6389 17.2727 16.84 15.3988 17.3454 12.9091H22.9091C23.5116 12.9091 24 12.4207 24 11.8182C24 11.2157 23.5116 10.7273 22.9091 10.7273H17.3454C16.84 8.23756 14.6389 6.36364 12 6.36364Z" fill="black"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/development/bar-chart-square-02.svg b/app/components/base/icons/assets/vender/solid/development/bar-chart-square-02.svg
new file mode 100644
index 0000000..517d119
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/development/bar-chart-square-02.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="bar-chart-square-02">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M11.8925 1.33331H4.1078C3.75638 1.3333 3.45319 1.33329 3.20348 1.35369C2.93992 1.37523 2.67777 1.42277 2.42552 1.5513C2.04919 1.74305 1.74323 2.04901 1.55148 2.42533C1.42296 2.67759 1.37541 2.93973 1.35388 3.2033C1.33348 3.453 1.33349 3.75617 1.3335 4.10759V11.8923C1.33349 12.2438 1.33348 12.547 1.35388 12.7967C1.37541 13.0602 1.42296 13.3224 1.55148 13.5746C1.74323 13.951 2.04919 14.2569 2.42552 14.4487C2.67777 14.5772 2.93992 14.6247 3.20348 14.6463C3.45319 14.6667 3.75636 14.6667 4.10779 14.6666H11.8925C12.244 14.6667 12.5471 14.6667 12.7969 14.6463C13.0604 14.6247 13.3226 14.5772 13.5748 14.4487C13.9511 14.2569 14.2571 13.951 14.4488 13.5746C14.5774 13.3224 14.6249 13.0602 14.6465 12.7967C14.6669 12.547 14.6668 12.2438 14.6668 11.8924V4.1076C14.6668 3.75618 14.6669 3.45301 14.6465 3.2033C14.6249 2.93973 14.5774 2.67759 14.4488 2.42533C14.2571 2.04901 13.9511 1.74305 13.5748 1.5513C13.3226 1.42277 13.0604 1.37523 12.7969 1.35369C12.5471 1.33329 12.2439 1.3333 11.8925 1.33331ZM11.3335 4.66665C11.3335 4.29846 11.035 3.99998 10.6668 3.99998C10.2986 3.99998 10.0002 4.29846 10.0002 4.66665V11.3333C10.0002 11.7015 10.2986 12 10.6668 12C11.035 12 11.3335 11.7015 11.3335 11.3333V4.66665ZM8.00016 6.66665C8.36835 6.66665 8.66683 6.96512 8.66683 7.33331V11.3333C8.66683 11.7015 8.36835 12 8.00016 12C7.63197 12 7.3335 11.7015 7.3335 11.3333V7.33331C7.3335 6.96512 7.63197 6.66665 8.00016 6.66665ZM5.3335 9.33331C5.70169 9.33331 6.00016 9.63179 6.00016 9.99998V11.3333C6.00016 11.7015 5.70169 12 5.3335 12C4.96531 12 4.66683 11.7015 4.66683 11.3333V9.99998C4.66683 9.63179 4.96531 9.33331 5.3335 9.33331Z" fill="#155EEF"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/development/container.svg b/app/components/base/icons/assets/vender/solid/development/container.svg
new file mode 100644
index 0000000..e5f1da9
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/development/container.svg
@@ -0,0 +1,5 @@
+<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8.29782 0.790031C8.12061 0.753584 7.93783 0.753584 7.76062 0.790031C7.55577 0.832161 7.37268 0.934712 7.22712 1.01624L7.18744 1.03841C6.01215 1.69134 4.02394 2.79644 2.90301 3.41952C2.63085 3.5708 2.49477 3.64644 2.44929 3.74641C2.40965 3.83357 2.4094 3.93356 2.4486 4.02091C2.49357 4.12111 2.62938 4.19751 2.90101 4.3503L7.76772 7.08785C7.8631 7.1415 7.91079 7.16832 7.96135 7.17884C8.0061 7.18814 8.05229 7.18814 8.09703 7.17884C8.1476 7.16832 8.19529 7.1415 8.29067 7.08785L13.1574 4.35029C13.429 4.1975 13.5649 4.12111 13.6098 4.02091C13.649 3.93355 13.6488 3.83356 13.6091 3.74641C13.5637 3.64644 13.4276 3.57079 13.1554 3.41951C12.0345 2.79644 10.0463 1.69134 8.871 1.03841L8.83132 1.01624C8.68576 0.934713 8.50267 0.832161 8.29782 0.790031Z" fill="#155EEF"/>
+<path d="M14.6932 5.92676C14.6929 5.62787 14.6928 5.47842 14.6297 5.39117C14.5748 5.31504 14.4902 5.26564 14.3969 5.25511C14.2899 5.24305 14.1594 5.31646 13.8984 5.46329L8.96774 8.23679C8.86877 8.29246 8.81928 8.3203 8.78326 8.35968C8.75139 8.39452 8.72729 8.43573 8.71254 8.48059C8.69588 8.53129 8.69588 8.58807 8.69588 8.70163V14.1518C8.69588 14.4499 8.69588 14.599 8.75856 14.6862C8.81326 14.7623 8.89744 14.8118 8.9905 14.8227C9.09716 14.8352 9.22706 14.763 9.48688 14.6188C10.5978 14.0019 12.6169 12.8807 13.8043 12.221L13.8464 12.1977C14.0005 12.1128 14.1943 12.0061 14.343 11.8447C14.4717 11.7051 14.569 11.5397 14.6286 11.3594C14.6975 11.1509 14.6966 10.9298 14.696 10.7538L14.6959 10.7058C14.6959 9.39704 14.6942 7.17087 14.6932 5.92676Z" fill="#155EEF"/>
+<path d="M6.57155 14.6187C6.83137 14.763 6.96128 14.8352 7.06793 14.8227C7.16099 14.8118 7.24518 14.7623 7.29987 14.6862C7.36255 14.599 7.36255 14.4499 7.36255 14.1518V8.70166C7.36255 8.5881 7.36255 8.53132 7.34589 8.48062C7.33114 8.43576 7.30704 8.39455 7.27517 8.35971C7.23915 8.32033 7.18966 8.29249 7.09069 8.23682L2.16004 5.4633C1.89902 5.31648 1.76851 5.24306 1.66154 5.25513C1.56823 5.26565 1.48367 5.31506 1.42869 5.39118C1.36566 5.47844 1.36553 5.62789 1.36528 5.92678C1.36424 7.17088 1.36255 9.39704 1.36255 10.7058L1.36243 10.7538C1.36179 10.9298 1.36099 11.1509 1.42986 11.3594C1.48941 11.5397 1.58676 11.7051 1.71539 11.8447C1.86417 12.0061 2.0579 12.1128 2.21199 12.1977L2.2541 12.221C3.44156 12.8807 5.46065 14.0019 6.57155 14.6187Z" fill="#155EEF"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/development/database-02.svg b/app/components/base/icons/assets/vender/solid/development/database-02.svg
new file mode 100644
index 0000000..85b6b4c
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/development/database-02.svg
@@ -0,0 +1,5 @@
+<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M15.1956 4.66669V3.33335C15.1956 2.76539 14.8497 2.33041 14.4701 2.03126C14.083 1.72618 13.5641 1.48059 12.9824 1.28668C11.812 0.896551 10.2375 0.666687 8.52897 0.666687C6.8204 0.666687 5.24591 0.896551 4.07551 1.28668C3.4938 1.48059 2.97495 1.72618 2.58783 2.03126C2.20823 2.33041 1.8623 2.76539 1.8623 3.33335V4.66669C1.8623 5.23294 2.20443 5.66805 2.58368 5.96857C2.96958 6.27436 3.48705 6.52014 4.06786 6.71405C5.23637 7.10415 6.81113 7.33335 8.52897 7.33335C10.2468 7.33335 11.8216 7.10415 12.9901 6.71405C13.5709 6.52014 14.0884 6.27436 14.4743 5.96857C14.8535 5.66805 15.1956 5.23294 15.1956 4.66669ZM3.19564 3.33353C3.19564 3.33353 3.19576 3.33725 3.19767 3.34355C3.19994 3.35098 3.20552 3.36565 3.21902 3.38764C3.24732 3.43374 3.30502 3.50304 3.41313 3.58824C3.63325 3.76171 3.99308 3.94709 4.49715 4.11511C5.49832 4.44884 6.92383 4.66669 8.52897 4.66669C10.1341 4.66669 11.5596 4.44884 12.5608 4.11511C13.0649 3.94709 13.4247 3.76171 13.6448 3.58824C13.7529 3.50304 13.8106 3.43374 13.8389 3.38764C13.8524 3.36565 13.858 3.35098 13.8603 3.34355C13.8622 3.33716 13.8623 3.33335 13.8623 3.33335C13.8623 3.33335 13.8624 3.33006 13.8603 3.32316C13.858 3.31573 13.8524 3.30105 13.8389 3.27907C13.8106 3.23297 13.7529 3.16367 13.6448 3.07847C13.4247 2.905 13.0649 2.71962 12.5608 2.5516C11.5596 2.21787 10.1341 2.00002 8.52897 2.00002C6.92383 2.00002 5.49832 2.21787 4.49715 2.5516C3.99308 2.71962 3.63325 2.905 3.41313 3.07847C3.30502 3.16367 3.24732 3.23297 3.21902 3.27907C3.20552 3.30105 3.19994 3.31573 3.19767 3.32316C3.19563 3.32988 3.19564 3.33353 3.19564 3.33353Z" fill="#155EEF"/>
+<path d="M14.9234 7.00002C14.8447 7.00002 14.7705 7.03473 14.7155 7.09102C14.6407 7.16749 14.5613 7.23785 14.4802 7.30206C14.0939 7.60785 13.5759 7.85363 12.9945 8.04753C11.8249 8.43764 10.2485 8.66684 8.52896 8.66684C6.8094 8.66684 5.23307 8.43764 4.06339 8.04753C3.48201 7.85363 2.96401 7.60785 2.57773 7.30206C2.49661 7.23784 2.41719 7.16749 2.34244 7.09101C2.28743 7.03473 2.21322 7.00002 2.13452 7.00002C1.98418 7.00002 1.8623 7.12189 1.8623 7.27223V8.66669C1.8623 9.23294 2.20443 9.66805 2.58368 9.96857C2.96958 10.2744 3.48705 10.5201 4.06786 10.714C5.23637 11.1041 6.81113 11.3334 8.52897 11.3334C10.2468 11.3334 11.8216 11.1041 12.9901 10.714C13.5709 10.5201 14.0884 10.2744 14.4743 9.96857C14.8535 9.66805 15.1956 9.23294 15.1956 8.66669V7.27224C15.1956 7.1219 15.0738 7.00002 14.9234 7.00002Z" fill="#155EEF"/>
+<path d="M14.9234 11C14.8447 11 14.7705 11.0347 14.7155 11.091C14.6407 11.1675 14.5613 11.2378 14.4802 11.3021C14.0939 11.6079 13.5759 11.8536 12.9945 12.0475C11.8249 12.4376 10.2485 12.6668 8.52896 12.6668C6.8094 12.6668 5.23307 12.4376 4.06339 12.0475C3.48201 11.8536 2.96401 11.6079 2.57773 11.3021C2.49661 11.2378 2.41719 11.1675 2.34244 11.091C2.28743 11.0347 2.21322 11 2.13452 11C1.98418 11 1.8623 11.1219 1.8623 11.2722V12.6667C1.8623 13.2329 2.20443 13.668 2.58368 13.9686C2.96958 14.2744 3.48705 14.5201 4.06786 14.714C5.23637 15.1041 6.81113 15.3334 8.52897 15.3334C10.2468 15.3334 11.8216 15.1041 12.9901 14.714C13.5709 14.5201 14.0884 14.2744 14.4743 13.9686C14.8535 13.668 15.1956 13.2329 15.1956 12.6667V11.2722C15.1956 11.1219 15.0738 11 14.9234 11Z" fill="#155EEF"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/development/database-03.svg b/app/components/base/icons/assets/vender/solid/development/database-03.svg
new file mode 100644
index 0000000..461b2c0
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/development/database-03.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.66659 9.98845C10.1231 9.93732 11.4455 9.71981 12.461 9.38077C13.0418 9.18687 13.5593 8.94109 13.9452 8.6353C14.3245 8.33478 14.6666 7.89967 14.6666 7.33341V3.33341C14.6666 2.76545 14.3207 2.33047 13.9411 2.03132C13.5539 1.72624 13.0351 1.48065 12.4534 1.28675C11.283 0.896612 9.70849 0.666748 7.99992 0.666748C6.29135 0.666748 4.71686 0.896612 3.54646 1.28675C2.96474 1.48065 2.44589 1.72624 2.05878 2.03132C1.67918 2.33047 1.33325 2.76545 1.33325 3.33341V7.33341C1.33325 7.89967 1.67538 8.33478 2.05463 8.6353C2.44053 8.94109 2.958 9.18687 3.53881 9.38077C4.55435 9.71981 5.87675 9.93732 7.33325 9.98845V11.4472C6.76498 11.6481 6.31458 12.0985 6.11372 12.6667H1.99992C1.63173 12.6667 1.33325 12.9652 1.33325 13.3334C1.33325 13.7016 1.63173 14.0001 1.99992 14.0001H6.11372C6.38828 14.7769 7.12911 15.3334 7.99992 15.3334C8.87073 15.3334 9.61156 14.7769 9.88612 14.0001H13.9999C14.3681 14.0001 14.6666 13.7016 14.6666 13.3334C14.6666 12.9652 14.3681 12.6667 13.9999 12.6667H9.88612C9.68526 12.0985 9.23486 11.6481 8.66659 11.4472V9.98845ZM2.66659 3.33337C2.66659 3.33337 2.66657 3.32994 2.66862 3.32322C2.67089 3.31579 2.67647 3.30111 2.68997 3.27913C2.71827 3.23303 2.77597 3.16373 2.88408 3.07853C3.1042 2.90506 3.46403 2.71968 3.9681 2.55166C4.96927 2.21793 6.39478 2.00008 7.99992 2.00008C9.60506 2.00008 11.0306 2.21793 12.0317 2.55166C12.5358 2.71968 12.8956 2.90506 13.1158 3.07853C13.2239 3.16373 13.2816 3.23303 13.3099 3.27913C13.3234 3.30111 13.329 3.31579 13.3312 3.32322C13.3333 3.32994 13.3333 3.33337 13.3333 3.33337C13.3333 3.33337 13.3332 3.33722 13.3312 3.34361C13.329 3.35104 13.3234 3.36572 13.3099 3.3877C13.2816 3.4338 13.2239 3.5031 13.1158 3.5883C12.8956 3.76177 12.5358 3.94715 12.0317 4.11517C11.0306 4.4489 9.60506 4.66675 7.99992 4.66675C6.39478 4.66675 4.96927 4.4489 3.9681 4.11517C3.46403 3.94715 3.1042 3.76177 2.88408 3.5883C2.77597 3.5031 2.71827 3.4338 2.68997 3.3877C2.67647 3.36572 2.67089 3.35104 2.66862 3.34361C2.6667 3.33731 2.66659 3.33337 2.66659 3.33337Z" fill="#155EEF"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/development/file-heart-02.svg b/app/components/base/icons/assets/vender/solid/development/file-heart-02.svg
new file mode 100644
index 0000000..fa778b9
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/development/file-heart-02.svg
@@ -0,0 +1,6 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="file-heart-02">
+<path id="Subtract" fill-rule="evenodd" clip-rule="evenodd" d="M5.8392 0.666687H10.1609C10.6976 0.666679 11.1405 0.666673 11.5013 0.696151C11.876 0.726767 12.2205 0.792477 12.544 0.957337C13.0458 1.213 13.4538 1.62095 13.7094 2.12271C13.8743 2.44627 13.94 2.79074 13.9706 3.16547C14.0001 3.52626 14.0001 3.96917 14.0001 4.50581V10.0803C13.7558 9.96135 13.4846 9.88753 13.1964 9.87049C13.1342 8.82702 12.2682 8.00002 11.2091 8.00002C10.5956 8.00002 10.0396 8.36134 9.7904 8.922L9.13298 10.4012C8.13309 10.4365 7.33333 11.2582 7.33333 12.2667V14.1334C7.33333 14.3187 7.36034 14.4977 7.41064 14.6667L5.24168 14.6667C4.71142 14.667 4.31765 14.6672 3.97655 14.5758C3.0563 14.3292 2.33751 13.6104 2.09093 12.6902C1.99953 12.3491 1.99974 11.9553 2.00003 11.4251L2.00006 4.50582C2.00006 3.96918 2.00005 3.52627 2.02953 3.16547C2.06014 2.79074 2.12585 2.44627 2.29071 2.12271C2.54638 1.62095 2.95432 1.213 3.45609 0.957337C3.77965 0.792477 4.12412 0.726767 4.49885 0.696151C4.85964 0.666673 5.30256 0.666679 5.8392 0.666687ZM4.66667 4.66669C4.66667 4.2985 4.96514 4.00002 5.33333 4.00002H10.6667C11.0349 4.00002 11.3333 4.2985 11.3333 4.66669C11.3333 5.03488 11.0349 5.33335 10.6667 5.33335H5.33333C4.96514 5.33335 4.66667 5.03488 4.66667 4.66669ZM4.66667 7.33335C4.66667 6.96516 4.96514 6.66669 5.33333 6.66669H8.33333C8.70152 6.66669 9 6.96516 9 7.33335C9 7.70154 8.70152 8.00002 8.33333 8.00002H5.33333C4.96514 8.00002 4.66667 7.70154 4.66667 7.33335ZM4.66667 10C4.66667 9.63183 4.96514 9.33335 5.33333 9.33335H6C6.36819 9.33335 6.66667 9.63183 6.66667 10C6.66667 10.3682 6.36819 10.6667 6 10.6667H5.33333C4.96514 10.6667 4.66667 10.3682 4.66667 10Z" fill="#155EEF"/>
+<path id="Icon (Stroke)" fill-rule="evenodd" clip-rule="evenodd" d="M10.7044 9.32812C10.7931 9.12859 10.9909 9 11.2093 9C11.7565 9 12.2002 9.44364 12.2002 9.99089V10.8667H13.0677C13.7623 10.8667 14.2934 11.4858 14.1878 12.1723L13.9006 14.039C13.8156 14.5919 13.3399 15 12.7805 15H9.20016C8.72152 15 8.3335 14.612 8.3335 14.1333V12.2667C8.3335 11.788 8.72152 11.4 9.20016 11.4H9.78354L10.7044 9.32812Z" fill="#155EEF"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/development/pattern-recognition.svg b/app/components/base/icons/assets/vender/solid/development/pattern-recognition.svg
new file mode 100644
index 0000000..f026dff
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/development/pattern-recognition.svg
@@ -0,0 +1,11 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M4.72727 22C4.18787 22 3.66058 21.84 3.21208 21.5404C2.76359 21.2407 2.41402 20.8148 2.2076 20.3164C2.00118 19.8181 1.94717 19.2697 2.05241 18.7407C2.15764 18.2116 2.41739 17.7257 2.7988 17.3443C3.18022 16.9628 3.66617 16.7031 4.19521 16.5979C4.72425 16.4926 5.27261 16.5466 5.77096 16.7531C6.2693 16.9595 6.69524 17.309 6.99492 17.7575C7.2946 18.206 7.45455 18.7333 7.45455 19.2727C7.45455 19.996 7.16721 20.6897 6.65575 21.2012C6.14429 21.7127 5.45059 22 4.72727 22Z" fill="#212121"/>
+<path d="M12 9.27273C11.4606 9.27273 10.9333 9.43268 10.4848 9.73236C10.0363 10.032 9.68675 10.458 9.48033 10.9563C9.27391 11.4547 9.2199 12.003 9.32513 12.5321C9.43036 13.0611 9.69011 13.5471 10.0715 13.9285C10.4529 14.3099 10.9389 14.5696 11.4679 14.6749C11.997 14.7801 12.5453 14.7261 13.0437 14.5197C13.542 14.3133 13.968 13.9637 14.2676 13.5152C14.5673 13.0667 14.7273 12.5394 14.7273 12C14.7273 11.2767 14.4399 10.583 13.9285 10.0715C13.417 9.56006 12.7233 9.27273 12 9.27273Z" fill="#212121"/>
+<path d="M4.72727 2C4.18787 2 3.66058 2.15995 3.21208 2.45963C2.76358 2.7593 2.41402 3.18525 2.2076 3.68359C2.00118 4.18193 1.94717 4.7303 2.05241 5.25934C2.15764 5.78838 2.41738 6.27433 2.7988 6.65575C3.18022 7.03716 3.66617 7.29691 4.19521 7.40214C4.72425 7.50737 5.27261 7.45336 5.77096 7.24694C6.2693 7.04052 6.69524 6.69096 6.99492 6.24246C7.29459 5.79397 7.45455 5.26668 7.45455 4.72727C7.45455 4.00395 7.16721 3.31026 6.65575 2.7988C6.14428 2.28734 5.45059 2 4.72727 2Z" fill="#212121"/>
+<path d="M19.2727 2C18.7333 2 18.206 2.15995 17.7575 2.45963C17.309 2.75931 16.9595 3.18525 16.7531 3.68359C16.5466 4.18194 16.4926 4.7303 16.5979 5.25934C16.7031 5.78838 16.9628 6.27433 17.3443 6.65575C17.7257 7.03716 18.2116 7.29691 18.7407 7.40214C19.2697 7.50737 19.8181 7.45337 20.3164 7.24694C20.8148 7.04052 21.2407 6.69096 21.5404 6.24247C21.84 5.79397 22 5.26668 22 4.72727C22 4.00396 21.7127 3.31026 21.2012 2.7988C20.6897 2.28734 19.996 2 19.2727 2Z" fill="#212121"/>
+<path d="M19.2727 16.5455C18.7333 16.5455 18.206 16.7054 17.7575 17.0051C17.309 17.3048 16.9595 17.7307 16.7531 18.229C16.5466 18.7274 16.4926 19.2758 16.5979 19.8048C16.7031 20.3338 16.9628 20.8198 17.3443 21.2012C17.7257 21.5826 18.2116 21.8424 18.7407 21.9476C19.2697 22.0528 19.8181 21.9988 20.3164 21.7924C20.8148 21.586 21.2407 21.2364 21.5404 20.7879C21.84 20.3394 22 19.8121 22 19.2727C22 18.5494 21.7127 17.8557 21.2012 17.3443C20.6897 16.8328 19.996 16.5455 19.2727 16.5455Z" fill="#212121"/>
+<path d="M7.45455 9.27273H2V14.7273H7.45455V9.27273Z" fill="#212121"/>
+<path d="M22 9.27273H16.5455V14.7273H22V9.27273Z" fill="#212121"/>
+<path d="M14.7273 2H9.27273V7.45455H14.7273V2Z" fill="#212121"/>
+<path d="M14.7273 16.5455H9.27273V22H14.7273V16.5455Z" fill="#212121"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/development/prompt-engineering.svg b/app/components/base/icons/assets/vender/solid/development/prompt-engineering.svg
new file mode 100644
index 0000000..65915e3
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/development/prompt-engineering.svg
@@ -0,0 +1,8 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="prompt-engineering">
+<g id="Vector">
+<path d="M5.17263 1.33331H10.8277C11.3643 1.33331 11.8073 1.3333 12.168 1.36278C12.5428 1.39339 12.8872 1.4591 13.2108 1.62396C13.7126 1.87963 14.1205 2.28758 14.3762 2.78934C14.541 3.1129 14.6068 3.45737 14.6374 3.8321C14.6668 4.19289 14.6668 4.63579 14.6668 5.17243V9.61535L14.2671 9.51541C13.9093 9.42597 13.7127 9.37607 13.5686 9.33055C13.506 9.31079 13.4738 9.2979 13.4609 9.29232C13.427 9.26909 13.3977 9.23979 13.3745 9.2059C13.3689 9.19304 13.356 9.16081 13.3363 9.09826C13.2907 8.95416 13.2408 8.7575 13.1514 8.39975L12.9504 7.59575C12.7649 6.85381 12.0983 6.33331 11.3335 6.33331C10.5687 6.33331 9.90208 6.85381 9.71659 7.59576L9.51559 8.39975C9.42616 8.7575 9.37626 8.95416 9.33074 9.09826C9.31097 9.16081 9.29808 9.19303 9.29251 9.2059C9.26927 9.23979 9.23997 9.26909 9.20609 9.29232C9.19322 9.2979 9.16099 9.31079 9.09844 9.33055C8.95434 9.37607 8.75769 9.42597 8.39993 9.51541L7.59594 9.71641C6.85399 9.9019 6.3335 10.5685 6.3335 11.3333C6.3335 12.0981 6.85399 12.7647 7.59594 12.9502L8.39993 13.1512C8.75769 13.2407 8.95434 13.2906 9.09844 13.3361C9.16099 13.3558 9.19322 13.3687 9.20609 13.3743C9.23997 13.3975 9.26927 13.4268 9.29251 13.4607C9.29808 13.4736 9.31098 13.5058 9.33074 13.5684C9.37626 13.7125 9.42616 13.9091 9.51559 14.2669L9.61553 14.6666H5.17268C4.63601 14.6667 4.19309 14.6667 3.83228 14.6372C3.45755 14.6066 3.11308 14.5409 2.78952 14.376C2.28776 14.1203 1.87981 13.7124 1.62415 13.2106C1.45929 12.8871 1.39358 12.5426 1.36296 12.1679C1.33348 11.8071 1.33349 11.3642 1.3335 10.8275V5.17245C1.33349 4.63581 1.33348 4.19289 1.36296 3.8321C1.39358 3.45737 1.45929 3.1129 1.62415 2.78934C1.87981 2.28757 2.28776 1.87963 2.78952 1.62396C3.11308 1.4591 3.45755 1.39339 3.83228 1.36278C4.19307 1.3333 4.636 1.33331 5.17263 1.33331ZM4.66683 3.99998C4.29864 3.99998 4.00016 4.29846 4.00016 4.66665C4.00016 5.03484 4.29864 5.33331 4.66683 5.33331H4.6735C5.04169 5.33331 5.34016 5.03484 5.34016 4.66665C5.34016 4.29846 5.04169 3.99998 4.6735 3.99998H4.66683ZM6.66683 3.99998C6.29864 3.99998 6.00016 4.29846 6.00016 4.66665C6.00016 5.03484 6.29864 5.33331 6.66683 5.33331H6.6735C7.04169 5.33331 7.34016 5.03484 7.34016 4.66665C7.34016 4.29846 7.04169 3.99998 6.6735 3.99998H6.66683ZM8.66683 3.99998C8.29864 3.99998 8.00016 4.29846 8.00016 4.66665C8.00016 5.03484 8.29864 5.33331 8.66683 5.33331H8.6735C9.04169 5.33331 9.34016 5.03484 9.34016 4.66665C9.34016 4.29846 9.04169 3.99998 8.6735 3.99998H8.66683Z" fill="#155EEF"/>
+<path d="M11.3335 7.49998C11.5629 7.49998 11.7629 7.65613 11.8186 7.87871L12.0196 8.68271C12.1974 9.39402 12.2642 9.63563 12.3859 9.82588C12.5029 10.0087 12.6581 10.1639 12.8409 10.2809C13.0312 10.4026 13.2728 10.4694 13.9841 10.6472L14.7881 10.8482C15.0107 10.9039 15.1668 11.1039 15.1668 11.3333C15.1668 11.5627 15.0107 11.7627 14.7881 11.8184L13.9841 12.0194C13.2728 12.1972 13.0312 12.264 12.8409 12.3857C12.6581 12.5027 12.5029 12.658 12.3859 12.8407C12.2642 13.031 12.1974 13.2726 12.0196 13.9839L11.8186 14.7879C11.7629 15.0105 11.5629 15.1666 11.3335 15.1666C11.1041 15.1666 10.9041 15.0105 10.8484 14.7879L10.6474 13.9839C10.4696 13.2726 10.4028 13.031 10.2811 12.8407C10.1641 12.658 10.0089 12.5027 9.82606 12.3857C9.63581 12.264 9.39421 12.1972 8.68289 12.0194L7.8789 11.8184C7.65631 11.7627 7.50016 11.5627 7.50016 11.3333C7.50016 11.1039 7.65631 10.9039 7.8789 10.8482L8.68289 10.6472C9.39421 10.4694 9.63581 10.4026 9.82606 10.2809C10.0089 10.1639 10.1641 10.0087 10.2811 9.82588C10.4028 9.63563 10.4696 9.39402 10.6474 8.6827L10.8484 7.87871C10.9041 7.65613 11.1041 7.49998 11.3335 7.49998Z" fill="#155EEF"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/development/puzzle-piece-01.svg b/app/components/base/icons/assets/vender/solid/development/puzzle-piece-01.svg
new file mode 100644
index 0000000..c2efc73
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/development/puzzle-piece-01.svg
@@ -0,0 +1,5 @@
+<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="puzzle-piece-01">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M4.83333 2.99999C4.83333 1.71133 5.878 0.666656 7.16667 0.666656C8.45533 0.666656 9.5 1.71133 9.5 2.99999V3.33332L9.52285 3.33332C9.96938 3.33332 10.338 3.33331 10.6397 3.3539C10.9525 3.37525 11.2419 3.42093 11.5205 3.53631C12.1739 3.80696 12.693 4.32609 12.9637 4.9795C13.0791 5.25804 13.1247 5.54744 13.1461 5.8603C13.1558 6.0027 13.1609 6.15998 13.1636 6.33332H13.5C14.7887 6.33332 15.8333 7.37799 15.8333 8.66666C15.8333 9.95532 14.7887 11 13.5 11H13.1667V11.4942C13.1667 12.0308 13.1667 12.4737 13.1372 12.8345C13.1066 13.2093 13.0409 13.5537 12.876 13.8773C12.6204 14.3791 12.2124 14.787 11.7106 15.0427C11.3871 15.2075 11.0426 15.2732 10.6679 15.3039C10.3071 15.3333 9.86419 15.3333 9.32755 15.3333H8.83333C8.46514 15.3333 8.16667 15.0348 8.16667 14.6667V13.5C8.16667 13.0398 7.79357 12.6667 7.33333 12.6667C6.8731 12.6667 6.5 13.0398 6.5 13.5V14.6667C6.5 15.0348 6.20152 15.3333 5.83333 15.3333H5.00578C4.46914 15.3333 4.02624 15.3333 3.66545 15.3039C3.29072 15.2732 2.94625 15.2075 2.62269 15.0427C2.12093 14.787 1.71298 14.3791 1.45732 13.8773C1.29246 13.5537 1.22675 13.2093 1.19613 12.8345C1.16665 12.4737 1.16666 12.0308 1.16667 11.4942L1.16667 10.3333C1.16667 9.96513 1.46514 9.66666 1.83333 9.66666H2.83333C3.38562 9.66666 3.83333 9.21894 3.83333 8.66666C3.83333 8.11437 3.38562 7.66666 2.83333 7.66666H1.83333C1.46514 7.66666 1.16667 7.36818 1.16667 6.99999L1.16667 6.97715C1.16666 6.53062 1.16666 6.16204 1.18724 5.8603C1.20859 5.54744 1.25428 5.25804 1.36965 4.9795C1.64031 4.32609 2.15944 3.80696 2.81284 3.53631C3.09139 3.42093 3.38078 3.37525 3.69364 3.3539C3.99538 3.33331 4.36396 3.33332 4.81048 3.33332L4.83333 3.33332L4.83333 2.99999Z" fill="#155EEF"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/development/semantic.svg b/app/components/base/icons/assets/vender/solid/development/semantic.svg
new file mode 100644
index 0000000..9b30e1c
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/development/semantic.svg
@@ -0,0 +1,6 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M16.5833 12.945C16.4856 13.3276 16.2038 14.272 15.7382 15.7784H17.4432C17.0038 14.3674 16.7569 13.5692 16.7025 13.3841C16.6493 13.1998 16.609 13.0532 16.5833 12.945Z" fill="#212121"/>
+<path d="M21.1667 9.33333H12C11.5138 9.33333 11.0475 9.52649 10.7036 9.87031C10.3598 10.2141 10.1667 10.6804 10.1667 11.1667V19.4167C10.1667 19.9029 10.3598 20.3692 10.7036 20.713C11.0475 21.0568 11.5138 21.25 12 21.25H17.5L21.1667 24V21.25C21.6529 21.25 22.1192 21.0568 22.463 20.713C22.8068 20.3692 23 19.9029 23 19.4167V11.1667C23 10.6804 22.8068 10.2141 22.463 9.87031C22.1192 9.52649 21.6529 9.33333 21.1667 9.33333ZM18.2507 18.5L17.775 16.9417H15.3917L14.9159 18.5H13.4208L15.7308 11.9293H17.4267L19.7458 18.5H18.2507Z" fill="#212121"/>
+<path d="M12 2H2.83333C2.3471 2 1.88079 2.19315 1.53697 2.53697C1.19315 2.88079 1 3.3471 1 3.83333V12.0833C1 12.5696 1.19315 13.0359 1.53697 13.3797C1.88079 13.7235 2.3471 13.9167 2.83333 13.9167V16.6667L6.5 13.9167H9.25V11.1667C9.25381 11.0459 9.26606 10.9255 9.28667 10.8064C8.64229 10.5527 8.0315 10.2208 7.468 9.81825C6.5802 10.4316 5.59355 10.8877 4.55117 11.1667C4.394 10.6965 4.15573 10.2575 3.84717 9.86958C4.76378 9.70375 5.64426 9.37861 6.44867 8.90892C6.07755 8.50417 5.75993 8.05346 5.50358 7.56783C5.29175 7.16889 5.12217 6.74892 4.99758 6.31475C4.56583 6.31475 4.3165 6.32942 3.94983 6.35875V5.03233C4.30266 5.0703 4.65741 5.08744 5.01225 5.08367H6.63292V4.64367C6.63379 4.48979 6.61904 4.33623 6.58892 4.18533H8.05833C8.02877 4.33229 8.01403 4.48185 8.01433 4.63175V5.07908H9.756C10.1108 5.08303 10.4656 5.06589 10.8184 5.02775V6.35875C10.4958 6.32942 10.2098 6.31475 9.778 6.31475C9.67623 6.80565 9.51074 7.28115 9.28575 7.72917C9.06864 8.16083 8.79489 8.56159 8.47175 8.92083C8.89523 9.17057 9.34617 9.37051 9.81558 9.51667C10.0695 9.17655 10.399 8.90012 10.7781 8.70922C11.1573 8.51831 11.5755 8.41816 12 8.41667H13.8333V3.83333C13.8333 3.3471 13.6402 2.88079 13.2964 2.53697C12.9525 2.19315 12.4862 2 12 2Z" fill="#212121"/>
+<path d="M7.43133 8.0885C7.87722 7.58102 8.19195 6.97201 8.348 6.31475H6.40833C6.59708 6.98164 6.94861 7.59116 7.43133 8.0885Z" fill="#212121"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/development/terminal-square.svg b/app/components/base/icons/assets/vender/solid/development/terminal-square.svg
new file mode 100644
index 0000000..ccab5f6
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/development/terminal-square.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="terminal-square">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M8.91927 1H3.08073C2.81716 0.999992 2.58977 0.999984 2.40249 1.01529C2.20481 1.03144 2.00821 1.06709 1.81902 1.16349C1.53677 1.3073 1.3073 1.53677 1.16349 1.81902C1.06709 2.00821 1.03144 2.20481 1.01529 2.40249C0.999984 2.58977 0.999992 2.81714 1 3.08071V8.91927C0.999992 9.18284 0.999984 9.41023 1.01529 9.59752C1.03144 9.79519 1.06709 9.9918 1.16349 10.181C1.3073 10.4632 1.53677 10.6927 1.81902 10.8365C2.00821 10.9329 2.20481 10.9686 2.40249 10.9847C2.58977 11 2.81715 11 3.08072 11H8.91928C9.18285 11 9.41023 11 9.59752 10.9847C9.79519 10.9686 9.9918 10.9329 10.181 10.8365C10.4632 10.6927 10.6927 10.4632 10.8365 10.181C10.9329 9.9918 10.9686 9.79519 10.9847 9.59752C11 9.41023 11 9.18285 11 8.91928V3.08072C11 2.81715 11 2.58977 10.9847 2.40249C10.9686 2.20481 10.9329 2.00821 10.8365 1.81902C10.6927 1.53677 10.4632 1.3073 10.181 1.16349C9.9918 1.06709 9.79519 1.03144 9.59752 1.01529C9.41023 0.999984 9.18284 0.999992 8.91927 1ZM3.85355 4.14645C3.65829 3.95118 3.34171 3.95118 3.14645 4.14645C2.95118 4.34171 2.95118 4.65829 3.14645 4.85355L4.29289 6L3.14645 7.14645C2.95118 7.34171 2.95118 7.65829 3.14645 7.85355C3.34171 8.04882 3.65829 8.04882 3.85355 7.85355L5.35355 6.35355C5.54882 6.15829 5.54882 5.84171 5.35355 5.64645L3.85355 4.14645ZM6.5 7C6.22386 7 6 7.22386 6 7.5C6 7.77614 6.22386 8 6.5 8H8.5C8.77614 8 9 7.77614 9 7.5C9 7.22386 8.77614 7 8.5 7H6.5Z" fill="#B54708"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/development/variable-02.svg b/app/components/base/icons/assets/vender/solid/development/variable-02.svg
new file mode 100644
index 0000000..75ad244
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/development/variable-02.svg
@@ -0,0 +1,9 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="variable-02">
+<g id="Vector">
+<path d="M13.9986 8.76189C14.6132 8.04115 15.5117 7.625 16.459 7.625H16.5486C17.1009 7.625 17.5486 8.07272 17.5486 8.625C17.5486 9.17728 17.1009 9.625 16.5486 9.625H16.459C16.0994 9.625 15.7564 9.78289 15.5205 10.0595L13.1804 12.8039L13.9213 15.4107C13.9372 15.4666 13.9859 15.5 14.0355 15.5H15.4296C15.9819 15.5 16.4296 15.9477 16.4296 16.5C16.4296 17.0523 15.9819 17.5 15.4296 17.5H14.0355C13.0858 17.5 12.2562 16.8674 11.9975 15.9575L11.621 14.6328L10.1457 16.3631C9.5311 17.0839 8.63257 17.5 7.68532 17.5H7.59564C7.04336 17.5 6.59564 17.0523 6.59564 16.5C6.59564 15.9477 7.04336 15.5 7.59564 15.5H7.68532C8.04487 15.5 8.38789 15.3421 8.62379 15.0655L10.964 12.3209L10.2231 9.71433C10.2072 9.65839 10.1586 9.625 10.1089 9.625H8.71484C8.16256 9.625 7.71484 9.17728 7.71484 8.625C7.71484 8.07272 8.16256 7.625 8.71484 7.625H10.1089C11.0586 7.625 11.8883 8.25756 12.1469 9.16754L12.5234 10.4921L13.9986 8.76189Z" fill="black"/>
+<path d="M5.429 3C3.61372 3 2.143 4.47071 2.143 6.286V10.4428L1.29289 11.2929C1.10536 11.4804 1 11.7348 1 12C1 12.2652 1.10536 12.5196 1.29289 12.7071L2.143 13.5572V17.714C2.143 19.5293 3.61372 21 5.429 21C5.98128 21 6.429 20.5523 6.429 20C6.429 19.4477 5.98128 19 5.429 19C4.71828 19 4.143 18.4247 4.143 17.714V13.143C4.143 12.8778 4.03764 12.6234 3.85011 12.4359L3.41421 12L3.85011 11.5641C4.03764 11.3766 4.143 11.1222 4.143 10.857V6.286C4.143 5.57528 4.71828 5 5.429 5C5.98128 5 6.429 4.55228 6.429 4C6.429 3.44772 5.98128 3 5.429 3Z" fill="black"/>
+<path d="M18.5708 3C18.0185 3 17.5708 3.44772 17.5708 4C17.5708 4.55228 18.0185 5 18.5708 5C19.2815 5 19.8568 5.57529 19.8568 6.286V10.857C19.8568 11.1222 19.9622 11.3766 20.1497 11.5641L20.5856 12L20.1497 12.4359C19.9622 12.6234 19.8568 12.8778 19.8568 13.143V17.714C19.8568 18.4244 19.2808 19 18.5708 19C18.0185 19 17.5708 19.4477 17.5708 20C17.5708 20.5523 18.0185 21 18.5708 21C20.3848 21 21.8568 19.5296 21.8568 17.714V13.5572L22.7069 12.7071C23.0974 12.3166 23.0974 11.6834 22.7069 11.2929L21.8568 10.4428V6.286C21.8568 4.47071 20.3861 3 18.5708 3Z" fill="black"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/editor/brush-01.svg b/app/components/base/icons/assets/vender/solid/editor/brush-01.svg
new file mode 100644
index 0000000..c58c071
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/editor/brush-01.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M17.264 2.20765C18.5274 1.0378 20.4895 1.07552 21.707 2.29307C22.9246 3.51061 22.9623 5.47268 21.7924 6.73612L15.4019 13.638C15.008 14.0634 14.811 14.2761 14.579 14.3585C14.3751 14.4309 14.1531 14.4352 13.9465 14.3707C13.7115 14.2973 13.5065 14.0923 13.0965 13.6823L10.3178 10.9036C9.9078 10.4936 9.7028 10.2886 9.62943 10.0536C9.56493 9.84699 9.5692 9.62504 9.6416 9.42107C9.72395 9.18906 9.93667 8.9921 10.3621 8.59817L17.264 2.20765Z" fill="black"/>
+<path d="M8.76212 12.1763C8.35165 11.7659 8.14641 11.5606 7.9013 11.4888C7.7037 11.4308 7.43858 11.4436 7.24747 11.5203C7.01041 11.6154 6.86226 11.7953 6.56595 12.1551C6.46827 12.2737 6.37864 12.398 6.30066 12.53C6.03001 12.9883 5.8908 13.5013 5.88405 14.0163C4.608 13.9077 3.29445 14.3416 2.31799 15.318C1.28682 16.3492 1.34471 17.8002 1.38417 18.7893L1.38921 18.9154C1.43381 20.027 1.46675 20.848 1.11009 21.5439C0.951191 21.8539 0.965076 22.2242 1.14673 22.5215C1.32839 22.8187 1.65165 23 2 23C2.27235 23 2.58299 23.0081 2.91511 23.0167C3.66655 23.0362 4.52805 23.0586 5.30424 22.9968C6.44876 22.9057 7.7418 22.6221 8.68195 21.682C9.65838 20.7056 10.0923 19.3921 9.98366 18.1161C10.4987 18.1093 11.0118 17.9701 11.4701 17.6994C11.6021 17.6215 11.7264 17.5318 11.845 17.4341C12.2048 17.1378 12.3847 16.9897 12.4798 16.7526C12.5565 16.5615 12.5693 16.2964 12.5113 16.0988C12.4395 15.8537 12.2342 15.6484 11.8238 15.238L8.76212 12.1763Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/editor/citations.svg b/app/components/base/icons/assets/vender/solid/editor/citations.svg
new file mode 100644
index 0000000..5405495
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/editor/citations.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="citations">
+<path id="Subtract" d="M0.666992 7.99996C0.666992 3.94987 3.95024 0.666626 8.00033 0.666626C12.0504 0.666626 15.3337 3.94987 15.3337 7.99996C15.3337 12.05 12.0504 15.3333 8.00033 15.3333C3.95024 15.3333 0.666992 12.05 0.666992 7.99996ZM4.66699 7.9801V9.97196H7.35742V7.48922H5.87533C5.85644 7.21231 5.90365 6.94484 6.01693 6.68681C6.2372 6.19592 6.66829 5.84979 7.31022 5.6484V4.66663C6.44803 4.83655 5.79036 5.19527 5.33724 5.7428C4.89041 6.29032 4.66699 7.03609 4.66699 7.9801ZM10.0264 6.70569C10.2466 6.19592 10.6746 5.84349 11.3102 5.6484V4.66663C10.4732 4.83655 9.82183 5.19212 9.35612 5.73336C8.8967 6.27459 8.66699 7.02351 8.66699 7.9801V9.97196H11.3574V7.48922H9.87533C9.85015 7.23748 9.9005 6.9763 10.0264 6.70569Z" fill="#FD853A"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/editor/colors.svg b/app/components/base/icons/assets/vender/solid/editor/colors.svg
new file mode 100644
index 0000000..b01556c
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/editor/colors.svg
@@ -0,0 +1,9 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="colors">
+<g id="Solid">
+<path d="M13.4494 13.2298C12.9854 13.3409 12.5002 13.3999 12 13.3999C10.2804 13.3999 8.72326 12.6997 7.59953 11.5677C6.4872 10.4471 5.8 8.90382 5.8 7.20007C5.8 3.77586 8.57584 1 12 1C15.4241 1 18.2 3.77586 18.2 7.20007C18.2 8.44569 17.8327 9.60551 17.2005 10.5771C16.3665 11.8588 15.0715 12.8131 13.5506 13.2047C13.517 13.2133 13.4833 13.2217 13.4494 13.2298Z" fill="black"/>
+<path d="M15.1476 14.7743C16.6646 14.1431 17.9513 13.0695 18.8465 11.7146C19.0004 11.4817 19.0773 11.3652 19.1762 11.3066C19.2615 11.2561 19.3659 11.2312 19.4648 11.2379C19.5795 11.2457 19.6773 11.3015 19.8728 11.4133C21.7413 12.4817 23 14.4946 23 16.7999C23 20.2241 20.2242 23 16.8 23C15.9123 23 15.0689 22.8139 14.3059 22.4782C14.0549 22.3678 13.9294 22.3126 13.8502 22.2049C13.7822 22.1126 13.7468 21.9922 13.7539 21.8777C13.7622 21.7444 13.8565 21.6018 14.045 21.3167C14.8373 20.1184 15.3234 18.6997 15.3917 17.1723C15.3969 17.0566 15.3996 16.9402 15.4 16.8233L15.4 16.7999C15.4 16.1888 15.333 15.5926 15.2057 15.0185C15.1876 14.9366 15.1682 14.8552 15.1476 14.7743Z" fill="black"/>
+<path d="M4.12723 11.4133C4.32273 11.3015 4.42049 11.2457 4.53516 11.2379C4.63414 11.2312 4.73848 11.2561 4.82382 11.3066C4.92269 11.3652 4.99964 11.4817 5.15355 11.7146C6.62074 13.9352 9.13929 15.4001 12 15.4001C12.4146 15.4001 12.822 15.3694 13.2201 15.31L13.2263 15.3357C13.3398 15.8045 13.4 16.2947 13.4 16.7999L13.4 16.8214C13.3997 16.9056 13.3977 16.9895 13.3941 17.0728C13.2513 20.3704 10.5327 23 7.2 23C3.77584 23 1 20.2241 1 16.7999C1 14.4946 2.25869 12.4817 4.12723 11.4133Z" fill="black"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/editor/paragraph.svg b/app/components/base/icons/assets/vender/solid/editor/paragraph.svg
new file mode 100644
index 0000000..be8afce
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/editor/paragraph.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2 6.5C2 5.67157 2.67157 5 3.5 5H20.5C21.3284 5 22 5.67157 22 6.5C22 7.32843 21.3284 8 20.5 8H3.5C2.67157 8 2 7.32843 2 6.5Z" fill="black"/>
+<path d="M2 12.5C2 11.6716 2.67157 11 3.5 11H20.5C21.3284 11 22 11.6716 22 12.5C22 13.3284 21.3284 14 20.5 14H3.5C2.67157 14 2 13.3284 2 12.5Z" fill="black"/>
+<path d="M2 18.5C2 17.6716 2.67157 17 3.5 17H12.5C13.3284 17 14 17.6716 14 18.5C14 19.3284 13.3284 20 12.5 20H3.5C2.67157 20 2 19.3284 2 18.5Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/editor/type-square.svg b/app/components/base/icons/assets/vender/solid/editor/type-square.svg
new file mode 100644
index 0000000..6e402f8
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/editor/type-square.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.7587 2H16.2413C17.0463 1.99999 17.7106 1.99998 18.2518 2.0442C18.8139 2.09012 19.3306 2.18868 19.816 2.43598C20.5686 2.81947 21.1805 3.43139 21.564 4.18404C21.8113 4.66938 21.9099 5.18608 21.9558 5.74818C22 6.28937 22 6.95372 22 7.75868V16.2413C22 17.0463 22 17.7106 21.9558 18.2518C21.9099 18.8139 21.8113 19.3306 21.564 19.816C21.1805 20.5686 20.5686 21.1805 19.816 21.564C19.3306 21.8113 18.8139 21.9099 18.2518 21.9558C17.7106 22 17.0463 22 16.2413 22H7.75868C6.95372 22 6.28937 22 5.74818 21.9558C5.18608 21.9099 4.66938 21.8113 4.18404 21.564C3.43139 21.1805 2.81947 20.5686 2.43598 19.816C2.18868 19.3306 2.09012 18.8139 2.0442 18.2518C1.99998 17.7106 1.99999 17.0463 2 16.2413V7.75869C1.99999 6.95373 1.99998 6.28936 2.0442 5.74818C2.09012 5.18608 2.18868 4.66938 2.43598 4.18404C2.81947 3.43139 3.43139 2.81947 4.18404 2.43598C4.66938 2.18868 5.18608 2.09012 5.74818 2.0442C6.28936 1.99998 6.95375 1.99999 7.7587 2ZM7 7C7 6.44772 7.44772 6 8 6H16C16.5523 6 17 6.44772 17 7C17 7.55229 16.5523 8 16 8H13V17C13 17.5523 12.5523 18 12 18C11.4477 18 11 17.5523 11 17V8H8C7.44772 8 7 7.55229 7 7Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/education/beaker-02.svg b/app/components/base/icons/assets/vender/solid/education/beaker-02.svg
new file mode 100644
index 0000000..2809cc8
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/education/beaker-02.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="beaker-02">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M4.13856 0.500003H7.8617C7.92126 0.49998 7.99238 0.499953 8.05504 0.505073C8.12765 0.511005 8.23165 0.526227 8.34062 0.581751C8.48174 0.653656 8.59648 0.768392 8.66838 0.909513C8.72391 1.01849 8.73913 1.12248 8.74506 1.19509C8.75018 1.25775 8.75015 1.32888 8.75013 1.38844V2.61157C8.75015 2.67113 8.75018 2.74226 8.74506 2.80492C8.73913 2.87753 8.72391 2.98153 8.66838 3.0905C8.59648 3.23162 8.48174 3.34636 8.34062 3.41826C8.23165 3.47379 8.12765 3.48901 8.05504 3.49494C8.03725 3.49639 8.01877 3.49743 8.00006 3.49817V5.2506C8.00006 5.55312 8.00408 5.61265 8.01723 5.66153C8.03245 5.71807 8.05747 5.7715 8.09117 5.81939C8.1203 5.86078 8.16346 5.90197 8.39586 6.09564L10.2807 7.66627C10.4566 7.81255 10.6116 7.94145 10.7267 8.10509C10.8278 8.24875 10.9029 8.40904 10.9486 8.57867C11.0005 8.7719 11.0003 8.97351 11.0001 9.2023C11.0001 9.39886 11.0002 9.59542 11.0002 9.79198C11.0003 9.98232 11.0005 10.1463 10.9713 10.2927C10.853 10.8877 10.3878 11.3529 9.7928 11.4712C9.64637 11.5003 9.48246 11.5002 9.29211 11.5001H2.70822C2.51787 11.5002 2.35396 11.5003 2.20753 11.4712C1.98473 11.4269 1.78014 11.334 1.60515 11.2038C1.42854 11.0725 1.28221 10.9034 1.17753 10.7077C1.10892 10.5796 1.05831 10.4401 1.02899 10.2927C0.999862 10.1463 0.999992 9.98233 1.00014 9.79199C1.00014 9.59542 1.00006 9.39886 1.00003 9.20229C0.999794 8.97351 0.999584 8.7719 1.05157 8.57867C1.09721 8.40904 1.17229 8.24875 1.27338 8.10509C1.38855 7.94145 1.54356 7.81255 1.71947 7.66627L3.60427 6.09564C3.83667 5.90197 3.87983 5.86078 3.90896 5.81939C3.94266 5.7715 3.96768 5.71807 3.9829 5.66153C3.99605 5.61265 4.00006 5.55312 4.00006 5.2506V3.49817C3.9814 3.49743 3.96297 3.49639 3.94521 3.49494C3.8726 3.48901 3.76861 3.47379 3.65964 3.41826C3.51851 3.34636 3.40378 3.23162 3.33187 3.0905C3.27635 2.98153 3.26113 2.87753 3.25519 2.80492C3.25008 2.74226 3.2501 2.67113 3.25013 2.61158V1.38844C3.2501 1.32888 3.25008 1.25775 3.25519 1.19509C3.26113 1.12248 3.27635 1.01849 3.33187 0.909513C3.40378 0.768392 3.51851 0.653656 3.65964 0.581751C3.76861 0.526227 3.8726 0.511005 3.94521 0.505073C4.00787 0.499953 4.079 0.49998 4.13856 0.500003ZM9.11909 8.00004H2.88104L4.28066 6.83373C4.45657 6.68745 4.61158 6.55855 4.72675 6.39491C4.82784 6.25125 4.90292 6.09096 4.94856 5.92133C5.00054 5.7281 5.00033 5.52649 5.0001 5.29771L5.00006 3.50001H7.00006L7.00003 5.29771C6.99979 5.52649 6.99958 5.7281 7.05157 5.92133C7.09721 6.09096 7.17229 6.25125 7.27338 6.39491C7.38855 6.55855 7.54356 6.68745 7.71947 6.83373L9.11909 8.00004Z" fill="#0E7090"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/education/bubble-text.svg b/app/components/base/icons/assets/vender/solid/education/bubble-text.svg
new file mode 100644
index 0000000..c97b784
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/education/bubble-text.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="bubble-text">
+<path id="vector" fill-rule="evenodd" clip-rule="evenodd" d="M2 9C2 5.68629 4.68629 3 8 3H16C19.3137 3 22 5.68629 22 9V15C22 18.3137 19.3137 21 16 21H3C2.44772 21 2 20.5523 2 20V9ZM9 9C8.44772 9 8 9.44772 8 10C8 10.5523 8.44772 11 9 11H15C15.5523 11 16 10.5523 16 10C16 9.44772 15.5523 9 15 9H9ZM9 13C8.44772 13 8 13.4477 8 14C8 14.5523 8.44772 15 9 15H12C12.5523 15 13 14.5523 13 14C13 13.4477 12.5523 13 12 13H9Z" fill="black"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/education/heart-02.svg b/app/components/base/icons/assets/vender/solid/education/heart-02.svg
new file mode 100644
index 0000000..d1d4ad1
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/education/heart-02.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12.5836 3.8721C12.3615 3.99329 12.1665 4.11496 12 4.22818C11.8335 4.11496 11.6385 3.99329 11.4164 3.8721C10.6185 3.4369 9.45449 3 8 3C6.48169 3 4.96498 3.60857 3.83296 4.81606C2.69616 6.02865 2 7.78592 2 10C2 13.3448 4.37277 16.1023 6.58187 17.9272C7.71336 18.8619 8.86688 19.6065 9.7917 20.1203C10.2539 20.377 10.6687 20.5816 11.004 20.7253C11.1707 20.7967 11.3289 20.858 11.4705 20.9033C11.5784 20.9378 11.7841 21 12 21C12.2159 21 12.4216 20.9378 12.5295 20.9033C12.6711 20.858 12.8293 20.7967 12.996 20.7253C13.3313 20.5816 13.7461 20.377 14.2083 20.1203C15.1331 19.6065 16.2866 18.8619 17.4181 17.9272C19.6272 16.1023 22 13.3448 22 10C22 7.78592 21.3038 6.02865 20.167 4.81606C19.035 3.60857 17.5183 3 16 3C14.5455 3 13.3815 3.4369 12.5836 3.8721Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/education/unblur.svg b/app/components/base/icons/assets/vender/solid/education/unblur.svg
new file mode 100644
index 0000000..498c2a0
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/education/unblur.svg
@@ -0,0 +1,19 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="unblur">
+<g id="vector">
+<path d="M9.5 6.25C9.5 6.80228 9.05228 7.25 8.5 7.25C7.94772 7.25 7.5 6.80228 7.5 6.25C7.5 5.69772 7.94772 5.25 8.5 5.25C9.05228 5.25 9.5 5.69772 9.5 6.25Z" fill="black"/>
+<path d="M6 6.25C6 6.80228 5.55228 7.25 5 7.25C4.44772 7.25 4 6.80228 4 6.25C4 5.69772 4.44772 5.25 5 5.25C5.55228 5.25 6 5.69772 6 6.25Z" fill="black"/>
+<path d="M9.5 17.75C9.5 18.3023 9.05228 18.75 8.5 18.75C7.94772 18.75 7.5 18.3023 7.5 17.75C7.5 17.1977 7.94772 16.75 8.5 16.75C9.05228 16.75 9.5 17.1977 9.5 17.75Z" fill="black"/>
+<path d="M9.25 3.25C9.25 3.66421 8.91421 4 8.5 4C8.08579 4 7.75 3.66421 7.75 3.25C7.75 2.83579 8.08579 2.5 8.5 2.5C8.91421 2.5 9.25 2.83579 9.25 3.25Z" fill="black"/>
+<path d="M3 10C3 10.4142 2.66421 10.75 2.25 10.75C1.83579 10.75 1.5 10.4142 1.5 10C1.5 9.58579 1.83579 9.25 2.25 9.25C2.66421 9.25 3 9.58579 3 10Z" fill="black"/>
+<path d="M3 14C3 14.4142 2.66421 14.75 2.25 14.75C1.83579 14.75 1.5 14.4142 1.5 14C1.5 13.5858 1.83579 13.25 2.25 13.25C2.66421 13.25 3 13.5858 3 14Z" fill="black"/>
+<path d="M9.25 20.75C9.25 21.1642 8.91421 21.5 8.5 21.5C8.08579 21.5 7.75 21.1642 7.75 20.75C7.75 20.3358 8.08579 20 8.5 20C8.91421 20 9.25 20.3358 9.25 20.75Z" fill="black"/>
+<path d="M10 10C10 10.8284 9.32843 11.5 8.5 11.5C7.67157 11.5 7 10.8284 7 10C7 9.17157 7.67157 8.5 8.5 8.5C9.32843 8.5 10 9.17157 10 10Z" fill="black"/>
+<path d="M10 14C10 14.8284 9.32843 15.5 8.5 15.5C7.67157 15.5 7 14.8284 7 14C7 13.1716 7.67157 12.5 8.5 12.5C9.32843 12.5 10 13.1716 10 14Z" fill="black"/>
+<path d="M6 10C6 10.5523 5.55228 11 5 11C4.44772 11 4 10.5523 4 10C4 9.44772 4.44772 9 5 9C5.55228 9 6 9.44772 6 10Z" fill="black"/>
+<path d="M6 14C6 14.5523 5.55228 15 5 15C4.44772 15 4 14.5523 4 14C4 13.4477 4.44772 13 5 13C5.55228 13 6 13.4477 6 14Z" fill="black"/>
+<path d="M6 17.75C6 18.3023 5.55228 18.75 5 18.75C4.44772 18.75 4 18.3023 4 17.75C4 17.1977 4.44772 16.75 5 16.75C5.55228 16.75 6 17.1977 6 17.75Z" fill="black"/>
+<path d="M12 2C11.4477 2 11 2.44772 11 3V21C11 21.5523 11.4477 22 12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2Z" fill="black"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/files/file-05.svg b/app/components/base/icons/assets/vender/solid/files/file-05.svg
new file mode 100644
index 0000000..950b55e
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/files/file-05.svg
@@ -0,0 +1,8 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="file-05">
+<g id="Solid">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.66667 1.34356C8.66667 1.32602 8.66667 1.31725 8.66591 1.30135C8.65018 0.972168 8.3607 0.682824 8.03151 0.667251C8.01562 0.666499 8.0104 0.666501 8.00001 0.666504H5.8391C5.30248 0.666497 4.85957 0.666491 4.49878 0.695968C4.12405 0.726585 3.77958 0.792295 3.45603 0.957155C2.95426 1.21282 2.54631 1.62077 2.29065 2.12253C2.12579 2.44609 2.06008 2.79056 2.02946 3.16529C1.99999 3.52608 1.99999 3.96899 2 4.50562V11.494C1.99999 12.0307 1.99999 12.4736 2.02946 12.8344C2.06008 13.2091 2.12579 13.5536 2.29065 13.8771C2.54631 14.3789 2.95426 14.7869 3.45603 15.0425C3.77958 15.2074 4.12405 15.2731 4.49878 15.3037C4.85958 15.3332 5.30248 15.3332 5.83912 15.3332H10.1609C10.6975 15.3332 11.1404 15.3332 11.5012 15.3037C11.8759 15.2731 12.2204 15.2074 12.544 15.0425C13.0457 14.7869 13.4537 14.3789 13.7093 13.8771C13.8742 13.5536 13.9399 13.2091 13.9705 12.8344C14 12.4736 14 12.0307 14 11.4941V6.66646C14 6.65611 14 6.65093 13.9993 6.63505C13.9837 6.30583 13.6943 6.01631 13.3651 6.0006C13.3492 5.99985 13.3405 5.99985 13.323 5.99985L10.3787 5.99985C10.2105 5.99987 10.0466 5.99989 9.90785 5.98855C9.75545 5.9761 9.57563 5.94672 9.39468 5.85452C9.1438 5.72669 8.93983 5.52272 8.81199 5.27183C8.7198 5.09088 8.69042 4.91106 8.67797 4.75867C8.66663 4.61989 8.66665 4.45603 8.66667 4.28778L8.66667 1.34356ZM5.33333 8.6665C4.96514 8.6665 4.66667 8.96498 4.66667 9.33317C4.66667 9.70136 4.96514 9.99984 5.33333 9.99984H10.6667C11.0349 9.99984 11.3333 9.70136 11.3333 9.33317C11.3333 8.96498 11.0349 8.6665 10.6667 8.6665H5.33333ZM5.33333 11.3332C4.96514 11.3332 4.66667 11.6316 4.66667 11.9998C4.66667 12.368 4.96514 12.6665 5.33333 12.6665H9.33333C9.70152 12.6665 10 12.368 10 11.9998C10 11.6316 9.70152 11.3332 9.33333 11.3332H5.33333Z" fill="#6938EF"/>
+<path d="M12.6053 4.6665C12.8011 4.6665 12.8989 4.6665 12.9791 4.61735C13.0923 4.54794 13.16 4.3844 13.129 4.25526C13.107 4.16382 13.0432 4.10006 12.9155 3.97253L10.694 1.75098C10.5664 1.62333 10.5027 1.5595 10.4112 1.53752C10.2821 1.50648 10.1186 1.57417 10.0492 1.6874C10 1.76757 10 1.86545 10 2.0612L10 4.13315C10 4.31982 10 4.41316 10.0363 4.48446C10.0683 4.54718 10.1193 4.59818 10.182 4.63014C10.2533 4.66647 10.3466 4.66647 10.5333 4.66647L12.6053 4.6665Z" fill="#6938EF"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/files/file-search-02.svg b/app/components/base/icons/assets/vender/solid/files/file-search-02.svg
new file mode 100644
index 0000000..ceae7dd
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/files/file-search-02.svg
@@ -0,0 +1,8 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="file-search-02">
+<g id="Solid">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.1609 0.666748H5.83913C5.3025 0.66674 4.85958 0.666734 4.49878 0.696212C4.12405 0.726828 3.77958 0.792538 3.45603 0.957399C2.95426 1.21306 2.54631 1.62101 2.29065 2.12277C2.12579 2.44633 2.06008 2.7908 2.02946 3.16553C1.99999 3.52632 1.99999 3.96924 2 4.50587V11.4943C1.99999 12.0309 1.99999 12.4738 2.02946 12.8346C2.06008 13.2094 2.12579 13.5538 2.29065 13.8774C2.54631 14.3792 2.95426 14.7871 3.45603 15.0428C3.77958 15.2076 4.12405 15.2733 4.49878 15.304C4.85958 15.3334 5.30248 15.3334 5.83912 15.3334H7.75554C8.22798 15.3334 8.4642 15.3334 8.55219 15.2689C8.64172 15.2033 8.67645 15.1421 8.68693 15.0316C8.69724 14.9229 8.55693 14.6879 8.27632 14.2177C7.88913 13.5689 7.66667 12.8105 7.66667 12.0001C7.66667 9.60685 9.60677 7.66675 12 7.66675C12.4106 7.66675 12.8078 7.72385 13.1842 7.83055C13.5061 7.92177 13.667 7.96739 13.7581 7.94138C13.847 7.91602 13.9015 7.87486 13.9501 7.79623C14 7.71563 14 7.56892 14 7.27549V4.50587C14 3.96923 14 3.52633 13.9705 3.16553C13.9399 2.7908 13.8742 2.44633 13.7093 2.12277C13.4537 1.62101 13.0457 1.21306 12.544 0.957399C12.2204 0.792538 11.8759 0.726828 11.5012 0.696212C11.1404 0.666734 10.6975 0.66674 10.1609 0.666748ZM4.66667 3.33342C4.29848 3.33342 4 3.63189 4 4.00008C4 4.36827 4.29848 4.66675 4.66667 4.66675H10.6667C11.0349 4.66675 11.3333 4.36827 11.3333 4.00008C11.3333 3.63189 11.0349 3.33342 10.6667 3.33342H4.66667ZM4 6.66675C4 6.29856 4.29848 6.00008 4.66667 6.00008H8.66667C9.03486 6.00008 9.33333 6.29856 9.33333 6.66675C9.33333 7.03494 9.03486 7.33342 8.66667 7.33342H4.66667C4.29848 7.33342 4 7.03494 4 6.66675ZM4 9.33342C4 8.96523 4.29848 8.66675 4.66667 8.66675H6C6.36819 8.66675 6.66667 8.96523 6.66667 9.33342C6.66667 9.7016 6.36819 10.0001 6 10.0001H4.66667C4.29848 10.0001 4 9.7016 4 9.33342Z" fill="#039855"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9 12.0001C9 10.3432 10.3431 9.00008 12 9.00008C13.6569 9.00008 15 10.3432 15 12.0001C15 12.5871 14.8314 13.1348 14.54 13.5972L15.1381 14.1953C15.3984 14.4557 15.3984 14.8778 15.1381 15.1382C14.8777 15.3985 14.4556 15.3985 14.1953 15.1382L13.5972 14.54C13.1347 14.8315 12.587 15.0001 12 15.0001C10.3431 15.0001 9 13.6569 9 12.0001ZM12 10.3334C11.0795 10.3334 10.3333 11.0796 10.3333 12.0001C10.3333 12.9206 11.0795 13.6667 12 13.6667C12.9205 13.6667 13.6667 12.9206 13.6667 12.0001C13.6667 11.0796 12.9205 10.3334 12 10.3334Z" fill="#039855"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/files/file-zip.svg b/app/components/base/icons/assets/vender/solid/files/file-zip.svg
new file mode 100644
index 0000000..213606a
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/files/file-zip.svg
@@ -0,0 +1,6 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon">
+<path id="Vector" d="M3.99999 1.33325H7.99999V5.33325C7.99999 6.06963 8.59692 6.66659 9.33332 6.66659H13.3333V13.3333C13.3333 14.0697 12.7364 14.6666 12 14.6666H6.66666V13.3333H7.99999V11.9999H6.66666V10.6666H7.99999V9.33325H6.66666V7.99992H5.33332V9.33325H6.66666V10.6666H5.33332V11.9999H6.66666V13.3333H5.33332V14.6666H3.99999C3.26361 14.6666 2.66666 14.0697 2.66666 13.3333V2.66659C2.66666 1.93021 3.26361 1.33325 3.99999 1.33325Z" fill="#676F83"/>
+<path id="Vector_2" opacity="0.5" d="M12.9428 4.99993C13.0415 5.09868 13.1232 5.21133 13.1859 5.33327H9.33334V1.48071C9.45528 1.54338 9.56794 1.62504 9.66668 1.72379L12.9428 4.99993Z" fill="#676F83"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/files/folder.svg b/app/components/base/icons/assets/vender/solid/files/folder.svg
new file mode 100644
index 0000000..8334887
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/files/folder.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M0.666993 4.10794C0.666981 3.75652 0.666972 3.45333 0.687374 3.20362C0.708908 2.94006 0.756452 2.67791 0.884981 2.42566C1.07673 2.04933 1.38269 1.74337 1.75901 1.55163C2.01127 1.4231 2.27341 1.37555 2.53698 1.35402C2.78669 1.33362 3.08986 1.33363 3.4413 1.33364L6.0981 1.33357C6.4938 1.33304 6.84179 1.33258 7.16176 1.44295C7.44201 1.53961 7.69726 1.69737 7.90905 1.9048C8.15086 2.14164 8.30607 2.45309 8.48257 2.80725L9.07895 4.00016H11.4945C12.0312 4.00015 12.4741 4.00015 12.8349 4.02963C13.2096 4.06024 13.5541 4.12595 13.8776 4.29081C14.3794 4.54648 14.7873 4.95442 15.043 5.45619C15.2079 5.77975 15.2736 6.12421 15.3042 6.49895C15.3337 6.85974 15.3337 7.30264 15.3337 7.83928V10.8277C15.3337 11.3644 15.3337 11.8073 15.3042 12.168C15.2736 12.5428 15.2079 12.8872 15.043 13.2108C14.7873 13.7126 14.3794 14.1205 13.8776 14.3762C13.5541 14.541 13.2096 14.6068 12.8349 14.6374C12.4741 14.6668 12.0312 14.6668 11.4945 14.6668H4.50614C3.9695 14.6668 3.52657 14.6668 3.16578 14.6374C2.79104 14.6068 2.44658 14.541 2.12302 14.3762C1.62125 14.1205 1.2133 13.7126 0.957643 13.2108C0.792782 12.8872 0.727073 12.5428 0.696456 12.168C0.666978 11.8073 0.666985 11.3643 0.666993 10.8277V4.10794ZM6.01519 2.66697C6.54213 2.66697 6.64658 2.67567 6.727 2.70341C6.82041 2.73563 6.9055 2.78822 6.97609 2.85736C7.03687 2.91688 7.09136 3.00642 7.32701 3.47773L7.58823 4.00016L2.00038 4.00016C2.00067 3.69017 2.00271 3.47827 2.01628 3.3122C2.03108 3.13109 2.05619 3.06394 2.07299 3.03098C2.13691 2.90554 2.23889 2.80355 2.36433 2.73964C2.3973 2.72284 2.46444 2.69772 2.64555 2.68292C2.83444 2.66749 3.08263 2.66697 3.46699 2.66697H6.01519Z" fill="#444CE7"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/answer-triangle.svg b/app/components/base/icons/assets/vender/solid/general/answer-triangle.svg
new file mode 100644
index 0000000..134856c
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/answer-triangle.svg
@@ -0,0 +1,3 @@
+<svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path id="Rectangle 1" d="M1.03647 1.5547C0.59343 0.890144 1.06982 0 1.86852 0H8V12L1.03647 1.5547Z" fill="#F2F4F7"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/arrow-down-round-fill.svg b/app/components/base/icons/assets/vender/solid/general/arrow-down-round-fill.svg
new file mode 100644
index 0000000..9566fcc
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/arrow-down-round-fill.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="arrow-down-round-fill">
+<path id="Vector" d="M6.02913 6.23572C5.08582 6.23572 4.56482 7.33027 5.15967 8.06239L7.13093 10.4885C7.57922 11.0403 8.42149 11.0403 8.86986 10.4885L10.8411 8.06239C11.4359 7.33027 10.9149 6.23572 9.97158 6.23572H6.02913Z" fill="#101828"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/check-circle.svg b/app/components/base/icons/assets/vender/solid/general/check-circle.svg
new file mode 100644
index 0000000..33d0bec
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/check-circle.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="check-circle">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M8 0.666626C3.94992 0.666626 0.666672 3.94987 0.666672 7.99996C0.666672 12.05 3.94992 15.3333 8 15.3333C12.0501 15.3333 15.3333 12.05 15.3333 7.99996C15.3333 3.94987 12.0501 0.666626 8 0.666626ZM11.4714 6.47136C11.7318 6.21101 11.7318 5.7889 11.4714 5.52855C11.2111 5.26821 10.7889 5.26821 10.5286 5.52855L7 9.05715L5.47141 7.52855C5.21106 7.2682 4.78895 7.2682 4.5286 7.52855C4.26825 7.7889 4.26825 8.21101 4.5286 8.47136L6.5286 10.4714C6.78895 10.7317 7.21106 10.7317 7.47141 10.4714L11.4714 6.47136Z" fill="#039855"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/check-done-01.svg b/app/components/base/icons/assets/vender/solid/general/check-done-01.svg
new file mode 100644
index 0000000..7e3cd54
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/check-done-01.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.8385 7H5.16146C4.63433 6.99998 4.17954 6.99997 3.80497 7.03057C3.40963 7.06287 3.01641 7.13419 2.63803 7.32698C2.07354 7.6146 1.6146 8.07354 1.32698 8.63803C1.13419 9.01641 1.06287 9.40963 1.03057 9.80497C0.999969 10.1795 0.999984 10.6343 1 11.1614V18.8385C0.999984 19.3657 0.999969 19.8205 1.03057 20.195C1.06287 20.5904 1.13419 20.9836 1.32698 21.362C1.6146 21.9265 2.07354 22.3854 2.63803 22.673C3.01641 22.8658 3.40963 22.9371 3.80497 22.9694C4.17952 23 4.63425 23 5.16136 23H12.8385C13.3656 23 13.8205 23 14.195 22.9694C14.5904 22.9371 14.9836 22.8658 15.362 22.673C15.9265 22.3854 16.3854 21.9265 16.673 21.362C16.8658 20.9836 16.9371 20.5904 16.9694 20.195C17 19.8205 17 19.3657 17 18.8385V11.1615C17 10.6343 17 10.1796 16.9694 9.80497C16.9371 9.40963 16.8658 9.01641 16.673 8.63803C16.3854 8.07354 15.9265 7.6146 15.362 7.32698C14.9836 7.13419 14.5904 7.06287 14.195 7.03057C13.8205 6.99997 13.3657 6.99998 12.8385 7ZM13.2071 13.2071C13.5976 12.8166 13.5976 12.1834 13.2071 11.7929C12.8166 11.4024 12.1834 11.4024 11.7929 11.7929L8 15.5858L6.70711 14.2929C6.31658 13.9024 5.68342 13.9024 5.29289 14.2929C4.90237 14.6834 4.90237 15.3166 5.29289 15.7071L7.29289 17.7071C7.68342 18.0976 8.31658 18.0976 8.70711 17.7071L13.2071 13.2071Z" fill="black"/>
+<path d="M18.8385 1H11.1615C10.6343 0.999984 10.1795 0.999969 9.80497 1.03057C9.40963 1.06287 9.01641 1.13419 8.63803 1.32698C8.07354 1.6146 7.6146 2.07354 7.32698 2.63803C7.13419 3.01641 7.06287 3.40963 7.03057 3.80497C7.00314 4.14076 7.00031 4.54098 7.00003 5.00003L12.8809 5.00001C13.3695 4.9999 13.8993 4.99977 14.3579 5.03724C14.8769 5.07964 15.5626 5.1846 16.2699 5.54499C17.2108 6.02436 17.9757 6.78926 18.455 7.73007C18.8154 8.43739 18.9204 9.12311 18.9628 9.64213C19.0003 10.1007 19.0001 10.6305 19 11.1192L19 17C19.459 16.9997 19.8593 16.9969 20.195 16.9694C20.5904 16.9371 20.9836 16.8658 21.362 16.673C21.9265 16.3854 22.3854 15.9265 22.673 15.362C22.8658 14.9836 22.9371 14.5904 22.9694 14.195C23 13.8205 23 13.3658 23 12.8386V5.16148C23 4.63437 23 4.17952 22.9694 3.80497C22.9371 3.40963 22.8658 3.01641 22.673 2.63803C22.3854 2.07354 21.9265 1.6146 21.362 1.32698C20.9836 1.13419 20.5904 1.06287 20.195 1.03057C19.8205 0.999969 19.3657 0.999984 18.8385 1Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/download-02.svg b/app/components/base/icons/assets/vender/solid/general/download-02.svg
new file mode 100644
index 0000000..0ad6d8b
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/download-02.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M21 21H3M18 11L12 17M12 17L6 11M12 17V3" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/edit-03.svg b/app/components/base/icons/assets/vender/solid/general/edit-03.svg
new file mode 100644
index 0000000..f547765
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/edit-03.svg
@@ -0,0 +1,8 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="edit-03">
+<g id="Solid">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.50004 10.0001C5.50004 9.72398 5.7239 9.50012 6.00004 9.50012H10.5C10.7762 9.50012 11 9.72398 11 10.0001C11 10.2763 10.7762 10.5001 10.5 10.5001H6.00004C5.7239 10.5001 5.50004 10.2763 5.50004 10.0001Z" fill="#98A2B3"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.89651 1.39656C8.50599 0.787085 9.49414 0.787084 10.1036 1.39656C10.7131 2.00604 10.7131 2.99419 10.1036 3.60367L3.82225 9.88504C3.81235 9.89494 3.80254 9.90476 3.79281 9.91451C3.64909 10.0585 3.52237 10.1855 3.3696 10.2791C3.23539 10.3613 3.08907 10.4219 2.93602 10.4587C2.7618 10.5005 2.58242 10.5003 2.37897 10.5001C2.3652 10.5001 2.35132 10.5001 2.33732 10.5001H1.50005C1.22391 10.5001 1.00005 10.2763 1.00005 10.0001V9.16286C1.00005 9.14886 1.00004 9.13497 1.00003 9.1212C0.999836 8.91776 0.999669 8.73838 1.0415 8.56416C1.07824 8.4111 1.13885 8.26479 1.22109 8.13058C1.31471 7.97781 1.44166 7.85109 1.58566 7.70736C1.5954 7.69764 1.60523 7.68783 1.61513 7.67793L7.89651 1.39656Z" fill="#98A2B3"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/edit-04.svg b/app/components/base/icons/assets/vender/solid/general/edit-04.svg
new file mode 100644
index 0000000..805e39a
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/edit-04.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M21.6747 17.2619C22.0824 17.6345 22.1107 18.2671 21.7381 18.6747L20.738 19.7687C20.0284 20.5448 19.0458 21 18.0002 21C16.9549 21 15.9726 20.5452 15.2631 19.7696C14.9112 19.3863 14.4549 19.1901 14.0002 19.1901C13.5454 19.1901 13.0889 19.3864 12.7369 19.7701C12.3635 20.177 11.7309 20.2043 11.324 19.8309C10.917 19.4575 10.8898 18.8249 11.2632 18.418C11.9735 17.6438 12.9555 17.1901 14.0002 17.1901C15.045 17.1901 16.0269 17.6438 16.7373 18.418L16.7384 18.4192C17.0897 18.8034 17.5458 19 18.0002 19C18.4545 19 18.9106 18.8034 19.2618 18.4193L20.2619 17.3253C20.6346 16.9177 21.2671 16.8893 21.6747 17.2619Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M15.793 2.79287C17.0119 1.57393 18.9882 1.57392 20.2072 2.79287C21.4261 4.01183 21.4261 5.98814 20.2072 7.20709L7.64443 19.7698C7.62463 19.7896 7.60502 19.8093 7.58556 19.8288C7.29811 20.1168 7.04467 20.3707 6.73914 20.5579C6.47072 20.7224 6.17809 20.8436 5.87198 20.9171C5.52353 21.0007 5.16478 21.0004 4.75788 21C4.73034 21 4.70258 21 4.67458 21H3.00004C2.44776 21 2.00004 20.5523 2.00004 20V18.3255C2.00004 18.2975 2.00001 18.2697 1.99999 18.2422C1.99961 17.8353 1.99928 17.4765 2.08293 17.1281C2.15642 16.822 2.27763 16.5293 2.44212 16.2609C2.62936 15.9554 2.88327 15.7019 3.17125 15.4145C3.19075 15.395 3.2104 15.3754 3.23019 15.3556L15.793 2.79287Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/eye.svg b/app/components/base/icons/assets/vender/solid/general/eye.svg
new file mode 100644
index 0000000..f75b90a
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/eye.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10 12C10 10.8954 10.8954 10 12 10C13.1046 10 14 10.8954 14 12C14 13.1046 13.1046 14 12 14C10.8954 14 10 13.1046 10 12Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12 4C9.13833 4 6.80535 5.26472 5.07675 6.70743C3.3505 8.14818 2.16697 9.81429 1.57422 10.7528L1.55014 10.7908C1.43252 10.976 1.27981 11.2164 1.2026 11.5532C1.14027 11.8251 1.14027 12.1749 1.2026 12.4468C1.2798 12.7836 1.43252 13.024 1.55014 13.2092L1.57423 13.2472C2.16697 14.1857 3.3505 15.8518 5.07675 17.2926C6.80535 18.7353 9.13833 20 12 20C14.8617 20 17.1947 18.7353 18.9233 17.2926C20.6495 15.8518 21.833 14.1857 22.4258 13.2472L22.4499 13.2092C22.5675 13.024 22.7202 12.7837 22.7974 12.4468C22.8597 12.1749 22.8597 11.8251 22.7974 11.5532C22.7202 11.2163 22.5675 10.976 22.4499 10.7908L22.4258 10.7528C21.833 9.81429 20.6495 8.14818 18.9233 6.70743C17.1947 5.26472 14.8617 4 12 4ZM12 8C9.79086 8 8 9.79086 8 12C8 14.2091 9.79086 16 12 16C14.2091 16 16 14.2091 16 12C16 9.79086 14.2091 8 12 8Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/github.svg b/app/components/base/icons/assets/vender/solid/general/github.svg
new file mode 100644
index 0000000..c7b203d
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/github.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon">
+<path id="Vector" d="M8 1C4.1325 1 1 4.1325 1 8C1 11.0975 3.00375 13.7137 5.78625 14.6413C6.13625 14.7025 6.2675 14.4925 6.2675 14.3088C6.2675 14.1425 6.25875 13.5913 6.25875 13.005C4.5 13.3288 4.045 12.5763 3.905 12.1825C3.82625 11.9812 3.485 11.36 3.1875 11.1937C2.9425 11.0625 2.5925 10.7387 3.17875 10.73C3.73 10.7212 4.12375 11.2375 4.255 11.4475C4.885 12.5062 5.89125 12.2088 6.29375 12.025C6.355 11.57 6.53875 11.2638 6.74 11.0887C5.1825 10.9137 3.555 10.31 3.555 7.6325C3.555 6.87125 3.82625 6.24125 4.2725 5.75125C4.2025 5.57625 3.9575 4.85875 4.3425 3.89625C4.3425 3.89625 4.92875 3.7125 6.2675 4.61375C6.8275 4.45625 7.4225 4.3775 8.0175 4.3775C8.6125 4.3775 9.2075 4.45625 9.7675 4.61375C11.1063 3.70375 11.6925 3.89625 11.6925 3.89625C12.0775 4.85875 11.8325 5.57625 11.7625 5.75125C12.2087 6.24125 12.48 6.8625 12.48 7.6325C12.48 10.3187 10.8438 10.9137 9.28625 11.0887C9.54 11.3075 9.75875 11.7275 9.75875 12.3837C9.75875 13.32 9.75 14.0725 9.75 14.3088C9.75 14.4925 9.88125 14.7113 10.2312 14.6413C11.6209 14.1721 12.8284 13.279 13.6839 12.0877C14.5393 10.8963 14.9996 9.46668 15 8C15 4.1325 11.8675 1 8 1Z" fill="#676F83"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/message-clock-circle.svg b/app/components/base/icons/assets/vender/solid/general/message-clock-circle.svg
new file mode 100644
index 0000000..307e070
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/message-clock-circle.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="message-clock-circle">
+<path id="Solid" d="M1.33301 8.00016C1.33301 4.31826 4.31778 1.3335 7.99967 1.3335C11.6816 1.3335 14.6663 4.31826 14.6663 8.00016C14.6663 11.6821 11.6816 14.6668 7.99967 14.6668C7.11413 14.6668 6.26734 14.4938 5.49248 14.1791C5.42249 14.1507 5.38209 14.1344 5.35225 14.1231L5.34304 14.1197L5.33987 14.1202C5.31527 14.1235 5.28173 14.129 5.21771 14.1397L2.82667 14.5382C2.71958 14.5561 2.59976 14.5761 2.4957 14.5839C2.38225 14.5925 2.20175 14.5955 2.01101 14.5137C1.77521 14.4125 1.5873 14.2246 1.48616 13.9888C1.40435 13.7981 1.40733 13.6176 1.41589 13.5041C1.42375 13.4001 1.44375 13.2803 1.46163 13.1732L1.86015 10.7821C1.87082 10.7181 1.87634 10.6846 1.87967 10.66L1.8801 10.6568L1.87669 10.6476C1.86549 10.6178 1.84914 10.5773 1.82071 10.5074C1.50602 9.7325 1.33301 8.88571 1.33301 8.00016ZM7.99967 5.3335C7.99967 4.96531 7.7012 4.66683 7.33301 4.66683C6.96482 4.66683 6.66634 4.96531 6.66634 5.3335V8.66683C6.66634 9.03502 6.96482 9.3335 7.33301 9.3335H10.6663C11.0345 9.3335 11.333 9.03502 11.333 8.66683C11.333 8.29864 11.0345 8.00016 10.6663 8.00016H7.99967V5.3335Z" fill="#DD2590"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/plus-circle.svg b/app/components/base/icons/assets/vender/solid/general/plus-circle.svg
new file mode 100644
index 0000000..b169bd1
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/plus-circle.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="plus-circle">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M12 1C5.92487 1 1 5.92487 1 12C1 18.0751 5.92487 23 12 23C18.0751 23 23 18.0751 23 12C23 5.92487 18.0751 1 12 1ZM12 7C12.5523 7 13 7.44772 13 8V11H16C16.5523 11 17 11.4477 17 12C17 12.5523 16.5523 13 16 13H13V16C13 16.5523 12.5523 17 12 17C11.4477 17 11 16.5523 11 16V13H8C7.44772 13 7 12.5523 7 12C7 11.4477 7.44772 11 8 11H11V8C11 7.44772 11.4477 7 12 7Z" fill="black"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/question-triangle.svg b/app/components/base/icons/assets/vender/solid/general/question-triangle.svg
new file mode 100644
index 0000000..52039ea
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/question-triangle.svg
@@ -0,0 +1,6 @@
+<svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Rectangle 2">
+<path d="M6.96353 1.5547C7.40657 0.890144 6.93018 0 6.13148 0H0V12L6.96353 1.5547Z" fill="white"/>
+<path d="M6.96353 1.5547C7.40657 0.890144 6.93018 0 6.13148 0H0V12L6.96353 1.5547Z" fill="#D1E9FF" fill-opacity="0.5"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/search-md.svg b/app/components/base/icons/assets/vender/solid/general/search-md.svg
new file mode 100644
index 0000000..31ce7be
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/search-md.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="search-md">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M11 2C6.02944 2 2 6.02944 2 11C2 15.9706 6.02944 20 11 20C13.125 20 15.078 19.2635 16.6177 18.0319L20.2929 21.7071C20.6834 22.0976 21.3166 22.0976 21.7071 21.7071C22.0976 21.3166 22.0976 20.6834 21.7071 20.2929L18.0319 16.6177C19.2635 15.078 20 13.125 20 11C20 6.02944 15.9706 2 11 2ZM4 11C4 7.13401 7.13401 4 11 4C14.866 4 18 7.13401 18 11C18 14.866 14.866 18 11 18C7.13401 18 4 14.866 4 11Z" fill="black"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/target-04.svg b/app/components/base/icons/assets/vender/solid/general/target-04.svg
new file mode 100644
index 0000000..c43124e
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/target-04.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M19.1601 1.01292C19.4774 1.06441 19.7506 1.26529 19.8944 1.5528L20.7453 3.25466L22.4472 4.10558C22.7347 4.24934 22.9355 4.52254 22.987 4.83983C23.0385 5.15712 22.9343 5.47982 22.707 5.70712L19.707 8.70712C19.5195 8.89466 19.2652 9.00001 18.9999 9.00001H16.4142L12.7071 12.7071C12.3166 13.0976 11.6834 13.0976 11.2929 12.7071C10.9024 12.3166 10.9024 11.6834 11.2929 11.2929L14.9999 7.58585V5.00001C14.9999 4.7348 15.1053 4.48044 15.2928 4.29291L18.2928 1.29291C18.5201 1.06561 18.8428 0.961435 19.1601 1.01292Z" fill="black"/>
+<path d="M3 12C3 7.02944 7.02944 3 12 3C12.5523 3 13 2.55228 13 2C13 1.44772 12.5523 1 12 1C5.92487 1 1 5.92487 1 12C1 18.0751 5.92487 23 12 23C18.0751 23 23 18.0751 23 12C23 11.4477 22.5523 11 22 11C21.4477 11 21 11.4477 21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12Z" fill="black"/>
+<path d="M8 12C8 9.79086 9.79086 8 12 8C12.5523 8 13 7.55228 13 7C13 6.44772 12.5523 6 12 6C8.68629 6 6 8.68629 6 12C6 15.3137 8.68629 18 12 18C15.3137 18 18 15.3137 18 12C18 11.4477 17.5523 11 17 11C16.4477 11 16 11.4477 16 12C16 14.2091 14.2091 16 12 16C9.79086 16 8 14.2091 8 12Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/tool-03.svg b/app/components/base/icons/assets/vender/solid/general/tool-03.svg
new file mode 100644
index 0000000..96d4686
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/tool-03.svg
@@ -0,0 +1,9 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="tool-03">
+<g id="Vector">
+<path d="M5.10516 6.61092L6.45642 5.41856C6.43816 5.25959 6.43018 5.09961 6.43253 4.93962V4.9285L2.91826 1.41365C2.89245 1.38778 2.86179 1.36725 2.82804 1.35325C2.79429 1.33924 2.75811 1.33203 2.72157 1.33203C2.68503 1.33203 2.64884 1.33924 2.61509 1.35325C2.58134 1.36725 2.55069 1.38778 2.52488 1.41365L1.41365 2.52489C1.38778 2.5507 1.36725 2.58135 1.35325 2.6151C1.33924 2.64885 1.33203 2.68504 1.33203 2.72158C1.33203 2.75812 1.33924 2.7943 1.35325 2.82806C1.36725 2.86181 1.38778 2.89246 1.41365 2.91827L5.10516 6.61092Z" fill="#444CE7"/>
+<path d="M12.5043 9.33348C12.3512 9.3848 12.1956 9.42819 12.0381 9.46349L11.9748 9.47461C11.7112 9.51388 11.4451 9.53375 11.1786 9.53406C10.9848 9.53389 10.7912 9.52314 10.5985 9.50183L8.58942 11.7604L10.8297 14.0007C11.0335 14.2097 11.2767 14.3763 11.5452 14.4907C11.8138 14.6052 12.1024 14.6652 12.3943 14.6674H12.4176C12.8604 14.6643 13.2924 14.5307 13.6596 14.2832C14.0268 14.0356 14.3128 13.6853 14.4818 13.276C14.6508 12.8667 14.6952 12.4167 14.6096 11.9822C14.524 11.5478 14.3122 11.1483 14.0006 10.8337L12.5043 9.33348Z" fill="#444CE7"/>
+<path d="M14.4606 3.79227C14.4443 3.74889 14.4174 3.71027 14.3823 3.67995C14.3472 3.64963 14.3051 3.62857 14.2599 3.61868C14.2146 3.6088 14.1675 3.6104 14.123 3.62335C14.0785 3.6363 14.0379 3.66018 14.005 3.69282L12.4132 5.27745L10.7224 3.5928L12.3132 2.00929C12.3454 1.97739 12.3692 1.93802 12.3825 1.89468C12.3957 1.85134 12.3981 1.80539 12.3893 1.76092C12.3805 1.7159 12.3606 1.67376 12.3315 1.63828C12.3024 1.60279 12.265 1.57506 12.2226 1.55757C11.7685 1.35982 11.2688 1.29063 10.778 1.35754C9.88338 1.43541 9.05173 1.8501 8.45122 2.51777C7.8507 3.18544 7.52615 4.05624 7.54319 4.95408C7.53907 5.24983 7.58317 5.54428 7.67376 5.82584L2.09204 10.7442C1.64427 11.1439 1.3735 11.7051 1.33923 12.3043C1.30495 12.9036 1.50997 13.4919 1.90924 13.9401L1.95703 13.9924C2.35812 14.411 2.90891 14.6533 3.4885 14.6662C4.06809 14.6791 4.62913 14.4616 5.04848 14.0613C5.11213 14.0008 5.17189 13.9364 5.22739 13.8685L10.1801 8.30058C10.7141 8.43272 11.2688 8.45821 11.8126 8.37559C12.4502 8.24485 13.04 7.9423 13.5182 7.50065C13.9964 7.05899 14.3447 6.49503 14.5256 5.86974C14.7321 5.18882 14.7092 4.45895 14.4606 3.79227Z" fill="#444CE7"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/x-circle.svg b/app/components/base/icons/assets/vender/solid/general/x-circle.svg
new file mode 100644
index 0000000..5acbe5f
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/x-circle.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M8.00008 0.666016C3.94999 0.666016 0.666748 3.94926 0.666748 7.99935C0.666748 12.0494 3.94999 15.3327 8.00008 15.3327C12.0502 15.3327 15.3334 12.0494 15.3334 7.99935C15.3334 3.94926 12.0502 0.666016 8.00008 0.666016ZM10.4715 5.52794C10.7318 5.78829 10.7318 6.2104 10.4715 6.47075L8.94289 7.99935L10.4715 9.52794C10.7318 9.78829 10.7318 10.2104 10.4715 10.4708C10.2111 10.7311 9.78903 10.7311 9.52868 10.4708L8.00008 8.94216L6.47149 10.4708C6.21114 10.7311 5.78903 10.7311 5.52868 10.4708C5.26833 10.2104 5.26833 9.78829 5.52868 9.52794L7.05727 7.99935L5.52868 6.47075C5.26833 6.2104 5.26833 5.78829 5.52868 5.52794C5.78903 5.26759 6.21114 5.26759 6.47149 5.52794L8.00008 7.05654L9.52868 5.52794C9.78903 5.26759 10.2111 5.26759 10.4715 5.52794Z" fill="#98A2B3"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/zap-fast.svg b/app/components/base/icons/assets/vender/solid/general/zap-fast.svg
new file mode 100644
index 0000000..d2dc5ec
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/zap-fast.svg
@@ -0,0 +1,10 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="zap-fast">
+<g id="Solid">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.25 8.75004C1.25 8.4739 1.47386 8.25004 1.75 8.25004H4.5C4.77614 8.25004 5 8.4739 5 8.75004C5 9.02618 4.77614 9.25004 4.5 9.25004H1.75C1.47386 9.25004 1.25 9.02618 1.25 8.75004Z" fill="#3538CD"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.5 6.00004C0.5 5.7239 0.723858 5.50004 1 5.50004H3.25C3.52614 5.50004 3.75 5.7239 3.75 6.00004C3.75 6.27618 3.52614 6.50004 3.25 6.50004H1C0.723858 6.50004 0.5 6.27618 0.5 6.00004Z" fill="#3538CD"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 3.25004C1.5 2.9739 1.72386 2.75004 2 2.75004H4.5C4.77614 2.75004 5 2.9739 5 3.25004C5 3.52618 4.77614 3.75004 4.5 3.75004H2C1.72386 3.75004 1.5 3.52618 1.5 3.25004Z" fill="#3538CD"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.68379 1.03505C8.89736 1.11946 9.02596 1.33849 8.99561 1.56612L8.57109 4.75004H10.4727C10.4785 4.75004 10.4842 4.75004 10.49 4.75004C10.6003 4.75002 10.7147 4.74999 10.8092 4.75863C10.9022 4.76713 11.0713 4.78965 11.2224 4.90631C11.3987 5.04237 11.5054 5.24972 11.5137 5.47225C11.5208 5.66306 11.4408 5.81376 11.3937 5.89434C11.3458 5.97625 11.2793 6.06932 11.2151 6.15912C11.2118 6.16381 11.2084 6.16849 11.2051 6.17316L7.90687 10.7907C7.77339 10.9775 7.52978 11.0495 7.31621 10.965C7.10264 10.8806 6.97404 10.6616 7.00439 10.434L7.42891 7.25004H5.52728C5.52154 7.25004 5.51579 7.25004 5.51003 7.25004C5.39966 7.25007 5.28526 7.25009 5.19077 7.24145C5.09782 7.23296 4.92871 7.21044 4.77755 7.09377C4.60127 6.95771 4.49456 6.75036 4.48631 6.52783C4.47924 6.33702 4.5592 6.18632 4.60631 6.10575C4.65421 6.02383 4.72072 5.93076 4.78489 5.84097C4.78824 5.83628 4.79158 5.8316 4.79492 5.82693L8.09313 1.20942C8.22661 1.02255 8.47022 0.950633 8.68379 1.03505Z" fill="#3538CD"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/general/zap-narrow.svg b/app/components/base/icons/assets/vender/solid/general/zap-narrow.svg
new file mode 100644
index 0000000..1d7a8ba
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/general/zap-narrow.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="zap-narrow">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M6.69792 1.03505C6.91148 1.11946 7.04009 1.33849 7.00974 1.56612L6.58522 4.75004H8.48685C8.49259 4.75004 8.49834 4.75004 8.5041 4.75004C8.61447 4.75002 8.72887 4.74999 8.82336 4.75863C8.91631 4.76713 9.08541 4.78965 9.23657 4.90631C9.41286 5.04237 9.51956 5.24972 9.52781 5.47225C9.53489 5.66306 9.45493 5.81376 9.40781 5.89434C9.35992 5.97625 9.29341 6.06932 9.22924 6.15912C9.22589 6.16381 9.22255 6.16849 9.21921 6.17316L5.92099 10.7907C5.78752 10.9775 5.54391 11.0495 5.33034 10.965C5.11677 10.8806 4.98816 10.6616 5.01851 10.434L5.44304 7.25004H3.5414C3.53567 7.25004 3.52992 7.25004 3.52416 7.25004C3.41378 7.25007 3.29939 7.25009 3.2049 7.24145C3.11194 7.23296 2.94284 7.21044 2.79168 7.09377C2.6154 6.95771 2.50869 6.75036 2.50044 6.52783C2.49336 6.33702 2.57333 6.18632 2.62044 6.10575C2.66833 6.02383 2.73484 5.93076 2.79901 5.84097C2.80236 5.83628 2.80571 5.8316 2.80904 5.82693L6.10726 1.20942C6.24074 1.02255 6.48435 0.950633 6.69792 1.03505Z" fill="#3538CD"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/layout/grid-01.svg b/app/components/base/icons/assets/vender/solid/layout/grid-01.svg
new file mode 100644
index 0000000..1ffbf44
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/layout/grid-01.svg
@@ -0,0 +1,10 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="grid-01">
+<g id="Solid">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3.04545 1.33338C3.90407 1.33348 4.76437 1.33348 5.62131 1.33338C5.78956 1.33336 5.95343 1.33334 6.0922 1.34467C6.24459 1.35713 6.42442 1.3865 6.60536 1.4787C6.85625 1.60653 7.06022 1.81051 7.18805 2.06139C7.28025 2.24234 7.30963 2.42216 7.32208 2.57456C7.33342 2.71333 7.3334 2.8772 7.33338 3.04546V5.6213C7.3334 5.78956 7.33342 5.95342 7.32208 6.0922C7.30963 6.24459 7.28025 6.42442 7.18805 6.60536C7.06022 6.85625 6.85625 7.06022 6.60536 7.18805C6.42442 7.28025 6.24459 7.30963 6.0922 7.32208C5.95342 7.33342 5.78956 7.3334 5.6213 7.33338H3.04546C2.8772 7.3334 2.71333 7.33342 2.57456 7.32208C2.42216 7.30963 2.24234 7.28025 2.06139 7.18805C1.81051 7.06022 1.60653 6.85625 1.4787 6.60536C1.3865 6.42442 1.35713 6.24459 1.34467 6.0922C1.33334 5.95343 1.33336 5.78956 1.33338 5.62131C1.33338 5.61423 1.33338 5.60714 1.33338 5.60004V3.06671C1.33338 3.05962 1.33338 3.05253 1.33338 3.04545C1.33336 2.87719 1.33334 2.71333 1.34467 2.57456C1.35713 2.42216 1.3865 2.24234 1.4787 2.06139C1.60653 1.81051 1.81051 1.60653 2.06139 1.4787C2.24234 1.3865 2.42216 1.35713 2.57456 1.34467C2.71333 1.33334 2.87719 1.33336 3.04545 1.33338Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3.04545 8.66671C3.90407 8.66682 4.76437 8.66682 5.62131 8.66671C5.78956 8.66669 5.95343 8.66667 6.0922 8.67801C6.24459 8.69046 6.42442 8.71984 6.60536 8.81204C6.85625 8.93987 7.06022 9.14384 7.18805 9.39472C7.28025 9.57567 7.30963 9.7555 7.32208 9.90789C7.33342 10.0467 7.3334 10.2105 7.33338 10.3788V12.9546C7.3334 13.1229 7.33342 13.2868 7.32208 13.4255C7.30963 13.5779 7.28025 13.7577 7.18805 13.9387C7.06022 14.1896 6.85625 14.3936 6.60536 14.5214C6.42442 14.6136 6.24459 14.643 6.0922 14.6554C5.95342 14.6668 5.78956 14.6667 5.6213 14.6667H3.04546C2.8772 14.6667 2.71333 14.6668 2.57456 14.6554C2.42216 14.643 2.24234 14.6136 2.06139 14.5214C1.81051 14.3936 1.60653 14.1896 1.4787 13.9387C1.3865 13.7577 1.35713 13.5779 1.34467 13.4255C1.33334 13.2868 1.33336 13.1229 1.33338 12.9546C1.33338 12.9476 1.33338 12.9405 1.33338 12.9334V10.4C1.33338 10.3929 1.33338 10.3859 1.33338 10.3788C1.33336 10.2105 1.33334 10.0467 1.34467 9.90789C1.35713 9.7555 1.3865 9.57567 1.4787 9.39472C1.60653 9.14384 1.81051 8.93987 2.06139 8.81204C2.24234 8.71984 2.42216 8.69046 2.57456 8.67801C2.71333 8.66667 2.87719 8.66669 3.04545 8.66671Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.3788 1.33338C11.2374 1.33348 12.0977 1.33348 12.9546 1.33338C13.1229 1.33336 13.2868 1.33334 13.4255 1.34467C13.5779 1.35713 13.7577 1.3865 13.9387 1.4787C14.1896 1.60653 14.3936 1.81051 14.5214 2.06139C14.6136 2.24234 14.643 2.42216 14.6554 2.57456C14.6668 2.71333 14.6667 2.8772 14.6667 3.04546V5.6213C14.6667 5.78956 14.6668 5.95342 14.6554 6.0922C14.643 6.24459 14.6136 6.42442 14.5214 6.60536C14.3936 6.85625 14.1896 7.06022 13.9387 7.18805C13.7577 7.28025 13.5779 7.30963 13.4255 7.32208C13.2868 7.33342 13.1229 7.3334 12.9546 7.33338H10.3788C10.2105 7.3334 10.0467 7.33342 9.90789 7.32208C9.7555 7.30963 9.57567 7.28025 9.39472 7.18805C9.14384 7.06022 8.93987 6.85625 8.81204 6.60536C8.71984 6.42442 8.69046 6.24459 8.67801 6.0922C8.66667 5.95343 8.66669 5.78956 8.66671 5.62131C8.66671 5.61423 8.66671 5.60714 8.66671 5.60004V3.06671C8.66671 3.05962 8.66671 3.05253 8.66671 3.04545C8.66669 2.87719 8.66667 2.71333 8.67801 2.57456C8.69046 2.42216 8.71984 2.24234 8.81204 2.06139C8.93987 1.81051 9.14384 1.60653 9.39472 1.4787C9.57567 1.3865 9.7555 1.35713 9.90789 1.34467C10.0467 1.33334 10.2105 1.33336 10.3788 1.33338Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.3788 8.66671C11.2374 8.66682 12.0977 8.66682 12.9546 8.66671C13.1229 8.66669 13.2868 8.66667 13.4255 8.67801C13.5779 8.69046 13.7577 8.71984 13.9387 8.81204C14.1896 8.93987 14.3936 9.14384 14.5214 9.39472C14.6136 9.57567 14.643 9.7555 14.6554 9.90789C14.6668 10.0467 14.6667 10.2105 14.6667 10.3788V12.9546C14.6667 13.1229 14.6668 13.2868 14.6554 13.4255C14.643 13.5779 14.6136 13.7577 14.5214 13.9387C14.3936 14.1896 14.1896 14.3936 13.9387 14.5214C13.7577 14.6136 13.5779 14.643 13.4255 14.6554C13.2868 14.6668 13.1229 14.6667 12.9546 14.6667H10.3788C10.2105 14.6667 10.0467 14.6668 9.90789 14.6554C9.7555 14.643 9.57567 14.6136 9.39472 14.5214C9.14384 14.3936 8.93987 14.1896 8.81204 13.9387C8.71984 13.7577 8.69046 13.5779 8.67801 13.4255C8.66667 13.2868 8.66669 13.1229 8.66671 12.9546C8.66671 12.9476 8.66671 12.9405 8.66671 12.9334V10.4C8.66671 10.3929 8.66671 10.3859 8.66671 10.3788C8.66669 10.2105 8.66667 10.0467 8.67801 9.90789C8.69046 9.7555 8.71984 9.57567 8.81204 9.39472C8.93987 9.14384 9.14384 8.93987 9.39472 8.81204C9.57567 8.71984 9.7555 8.69046 9.90789 8.67801C10.0467 8.66667 10.2105 8.66669 10.3788 8.66671Z" fill="#155EEF"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/mapsAndTravel/globe-06.svg b/app/components/base/icons/assets/vender/solid/mapsAndTravel/globe-06.svg
new file mode 100644
index 0000000..45f3778
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/mapsAndTravel/globe-06.svg
@@ -0,0 +1,8 @@
+<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon">
+<g id="Solid">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M6.39498 2.71706C6.90587 2.57557 7.44415 2.49996 8.00008 2.49996C9.30806 2.49996 10.5183 2.91849 11.5041 3.62893C10.9796 3.97562 10.5883 4.35208 10.3171 4.75458C9.90275 5.36959 9.79654 6.00558 9.88236 6.58587C9.96571 7.1494 10.2245 7.63066 10.4965 7.98669C10.7602 8.33189 11.0838 8.6206 11.3688 8.76305C12.0863 9.12177 12.9143 9.30141 13.5334 9.39399C14.0933 9.47774 15.2805 9.75802 15.3244 8.86608C15.3304 8.74474 15.3334 8.62267 15.3334 8.49996C15.3334 4.44987 12.0502 1.16663 8.00008 1.16663C3.94999 1.16663 0.666748 4.44987 0.666748 8.49996C0.666748 12.55 3.94999 15.8333 8.00008 15.8333C8.1228 15.8333 8.24486 15.8303 8.3662 15.8243C8.73395 15.8062 9.01738 15.4934 8.99927 15.1256C8.98117 14.7579 8.66837 14.4745 8.30063 14.4926C8.20111 14.4975 8.10091 14.5 8.00008 14.5C5.6605 14.5 3.63367 13.1609 2.6442 11.2074L3.28991 10.8346L5.67171 11.2804C6.28881 11.3959 6.85846 10.9208 6.85566 10.293L6.84632 8.19093L8.06357 6.10697C8.26079 5.76932 8.24312 5.3477 8.01833 5.02774L6.39498 2.71706Z" fill="#1570EF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.29718 8.93736C9.05189 8.84432 8.77484 8.90379 8.58934 9.08929C8.40383 9.27479 8.34437 9.55184 8.43741 9.79713L10.5486 15.363C10.6461 15.6199 10.8912 15.7908 11.166 15.7932C11.4408 15.7956 11.689 15.6292 11.791 15.374L12.6714 13.1714L14.874 12.2909C15.1292 12.1889 15.2957 11.9408 15.2932 11.666C15.2908 11.3912 15.12 11.146 14.863 11.0486L9.29718 8.93736Z" fill="#1570EF"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/mapsAndTravel/route.svg b/app/components/base/icons/assets/vender/solid/mapsAndTravel/route.svg
new file mode 100644
index 0000000..b647dfc
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/mapsAndTravel/route.svg
@@ -0,0 +1,7 @@
+<svg width="13" height="12" viewBox="0 0 13 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="route-sep">
+<path id="Icon" d="M6.08303 2.5H6.30023C7.82386 2.5 8.58567 2.5 8.87485 2.77364C9.12483 3.01018 9.23561 3.35864 9.16812 3.69611C9.09004 4.08651 8.46809 4.52643 7.22418 5.40627L5.19189 6.84373C3.94799 7.72357 3.32603 8.16349 3.24795 8.55389C3.18046 8.89136 3.29124 9.23982 3.54122 9.47636C3.8304 9.75 4.59221 9.75 6.11584 9.75H6.58303" stroke="#F79009" stroke-linecap="round" stroke-linejoin="round"/>
+<path id="Icon_2" d="M2.83301 4C3.66143 4 4.33301 3.32843 4.33301 2.5C4.33301 1.67157 3.66143 1 2.83301 1C2.00458 1 1.33301 1.67157 1.33301 2.5C1.33301 3.32843 2.00458 4 2.83301 4Z" fill="#F79009"/>
+<path id="Icon_3" d="M9.83301 11C10.6614 11 11.333 10.3284 11.333 9.5C11.333 8.67157 10.6614 8 9.83301 8C9.00458 8 8.33301 8.67157 8.33301 9.5C8.33301 10.3284 9.00458 11 9.83301 11Z" fill="#F79009"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/mediaAndDevices/audio-support-icon.svg b/app/components/base/icons/assets/vender/solid/mediaAndDevices/audio-support-icon.svg
new file mode 100644
index 0000000..cad145c
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/mediaAndDevices/audio-support-icon.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none">
+  <path d="M10.3567 3.56405L10.2334 3.84689C10.1432 4.05396 9.8568 4.05396 9.76655 3.84689L9.6433 3.56405C9.42355 3.05973 9.02775 2.6582 8.53385 2.43854L8.154 2.26961C7.94865 2.17826 7.94865 1.8794 8.154 1.78806L8.5126 1.62857C9.0192 1.40325 9.4221 0.986865 9.63805 0.465414L9.76465 0.159767C9.8529 -0.0532556 10.1471 -0.0532556 10.2353 0.159767L10.3619 0.465414C10.5779 0.986865 10.9808 1.40325 11.4874 1.62857L11.846 1.78806C12.0514 1.8794 12.0514 2.17826 11.846 2.26961L11.4662 2.43854C10.9723 2.6582 10.5764 3.05973 10.3567 3.56405ZM4.25 3H3.25V9H4.25V3ZM2 5H1V7H2V5ZM6.5 1H5.5V11H6.5V1ZM8.75 4H7.75V9H8.75V4ZM11 5H10V7H11V5Z" fill="#676F83"/>
+</svg>
\ No newline at end of file
diff --git a/app/components/base/icons/assets/vender/solid/mediaAndDevices/document-support-icon.svg b/app/components/base/icons/assets/vender/solid/mediaAndDevices/document-support-icon.svg
new file mode 100644
index 0000000..d7c0978
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/mediaAndDevices/document-support-icon.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none">
+  <path d="M10.5 4V10.4966C10.5 10.7751 10.2776 11 10.0033 11H1.9967C1.72248 11 1.5 10.778 1.5 10.5041V1.4959C1.5 1.22766 1.72435 1 2.00111 1H7.4984L10.5 4ZM9.5 4.5H7V2H2.5V10H9.5V4.5ZM4 3.5H5.5V4.5H4V3.5ZM4 5.5H8V6.5H4V5.5ZM4 7.5H8V8.5H4V7.5Z" fill="#676F83"/>
+</svg>
\ No newline at end of file
diff --git a/app/components/base/icons/assets/vender/solid/mediaAndDevices/magic-box.svg b/app/components/base/icons/assets/vender/solid/mediaAndDevices/magic-box.svg
new file mode 100644
index 0000000..855ac45
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/mediaAndDevices/magic-box.svg
@@ -0,0 +1,9 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="box-sparkle, magic box">
+<g id="Icon">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.76205 2.07424C9.99723 2.21897 10.0706 2.52694 9.92583 2.76212L8.85632 4.50007H9.5C9.77614 4.50007 10 4.72393 10 5.00007V9.00007C10 10.1046 9.10457 11.0001 8 11.0001H4C2.89543 11.0001 2 10.1046 2 9.00007V5.00007C2 4.72393 2.22386 4.50007 2.5 4.50007H7.68214L9.07417 2.23802C9.2189 2.00284 9.52687 1.92952 9.76205 2.07424ZM5 6.50007C4.72386 6.50007 4.5 6.72393 4.5 7.00007C4.5 7.27621 4.72386 7.50007 5 7.50007H7C7.27614 7.50007 7.5 7.27621 7.5 7.00007C7.5 6.72393 7.27614 6.50007 7 6.50007H5Z" fill="#667085"/>
+<path d="M5.92504 1.53733C5.97342 1.51314 6.01265 1.47391 6.03684 1.42553L6.27597 0.947279C6.3681 0.763016 6.63105 0.763017 6.72318 0.947279L6.96231 1.42553C6.9865 1.47391 7.02573 1.51314 7.07411 1.53733L7.55236 1.77646C7.73663 1.86859 7.73663 2.13154 7.55236 2.22367L7.07411 2.4628C7.02573 2.48699 6.9865 2.52622 6.96231 2.5746L6.72318 3.05285C6.63105 3.23711 6.3681 3.23711 6.27597 3.05285L6.03684 2.5746C6.01265 2.52622 5.97342 2.48699 5.92504 2.4628L5.44679 2.22367C5.26253 2.13154 5.26253 1.86859 5.44679 1.77646L5.92504 1.53733Z" fill="#667085"/>
+<path d="M3.25837 2.37067C3.30676 2.34648 3.34599 2.30724 3.37018 2.25886L3.52597 1.94728C3.6181 1.76302 3.88105 1.76302 3.97318 1.94728L4.12898 2.25886C4.15317 2.30724 4.1924 2.34648 4.24078 2.37067L4.55236 2.52646C4.73662 2.61859 4.73663 2.88154 4.55236 2.97367L4.24078 3.12946C4.1924 3.15365 4.15317 3.19289 4.12898 3.24127L3.97318 3.55285C3.88105 3.73711 3.6181 3.73711 3.52597 3.55285L3.37018 3.24127C3.34599 3.19289 3.30676 3.15365 3.25837 3.12946L2.94679 2.97367C2.76253 2.88154 2.76253 2.61859 2.94679 2.52646L3.25837 2.37067Z" fill="#667085"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/mediaAndDevices/magic-eyes.svg b/app/components/base/icons/assets/vender/solid/mediaAndDevices/magic-eyes.svg
new file mode 100644
index 0000000..d56a375
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/mediaAndDevices/magic-eyes.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="eye-sparkle, magic eyes">
+<path id="Icon" fill-rule="evenodd" clip-rule="evenodd" d="M11.0338 5.05688C9.75366 3.05335 7.90203 1.99999 6.00017 2C4.09831 2.00001 2.24669 3.05341 0.966566 5.05693C0.599687 5.63113 0.599686 6.36892 0.966566 6.94312C2.24669 8.94665 4.09832 10 6.00018 10C7.90204 9.99999 9.75366 8.94659 11.0338 6.94307C11.4007 6.36887 11.4007 5.63108 11.0338 5.05688ZM5.77639 4.44721L5.3706 5.2588C5.34641 5.30718 5.30718 5.34641 5.2588 5.3706L4.44721 5.77639C4.26295 5.86852 4.26295 6.13148 4.44721 6.22361L5.2588 6.6294C5.30718 6.65359 5.34641 6.69282 5.3706 6.7412L5.77639 7.55279C5.86852 7.73705 6.13148 7.73705 6.22361 7.55279L6.6294 6.7412C6.65359 6.69282 6.69282 6.65359 6.7412 6.6294L7.55279 6.22361C7.73705 6.13148 7.73705 5.86852 7.55279 5.77639L6.7412 5.3706C6.69282 5.34641 6.65359 5.30718 6.6294 5.2588L6.22361 4.44721C6.13148 4.26295 5.86852 4.26295 5.77639 4.44721Z" fill="#667085"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/mediaAndDevices/magic-wand.svg b/app/components/base/icons/assets/vender/solid/mediaAndDevices/magic-wand.svg
new file mode 100644
index 0000000..ea4ccb1
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/mediaAndDevices/magic-wand.svg
@@ -0,0 +1,10 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="magic-wand-2, magic stick, star">
+<g id="Icon">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.27056 1.77151C8.811 1.23107 9.68723 1.23107 10.2277 1.77151C10.7681 2.31195 10.7681 3.18818 10.2277 3.72862L3.72767 10.2286C3.18723 10.7691 2.31101 10.7691 1.77056 10.2286C1.23012 9.68818 1.23012 8.81195 1.77056 8.27151L8.27056 1.77151ZM9.52056 2.47862C9.37065 2.3287 9.12759 2.3287 8.97767 2.47862L8.08122 3.37506L8.62412 3.91796L9.52056 3.02151C9.67048 2.87159 9.67048 2.62853 9.52056 2.47862Z" fill="#667085"/>
+<path d="M4.92504 1.03733C4.97342 1.01314 5.01265 0.973911 5.03684 0.92553L5.27597 0.447279C5.3681 0.263016 5.63105 0.263017 5.72318 0.447279L5.96231 0.92553C5.9865 0.973911 6.02573 1.01314 6.07411 1.03733L6.55236 1.27646C6.73663 1.36859 6.73663 1.63154 6.55236 1.72367L6.07411 1.9628C6.02573 1.98699 5.9865 2.02622 5.96231 2.0746L5.72318 2.55285C5.63105 2.73711 5.3681 2.73711 5.27597 2.55285L5.03684 2.0746C5.01265 2.02622 4.97342 1.98699 4.92504 1.9628L4.44679 1.72367C4.26253 1.63154 4.26253 1.36859 4.44679 1.27646L4.92504 1.03733Z" fill="#667085"/>
+<path d="M9.42504 6.53733C9.47342 6.51314 9.51265 6.47391 9.53684 6.42553L9.77597 5.94728C9.8681 5.76302 10.1311 5.76302 10.2232 5.94728L10.4623 6.42553C10.4865 6.47391 10.5257 6.51314 10.5741 6.53733L11.0524 6.77646C11.2366 6.86859 11.2366 7.13154 11.0524 7.22367L10.5741 7.4628C10.5257 7.48699 10.4865 7.52622 10.4623 7.5746L10.2232 8.05285C10.1311 8.23711 9.8681 8.23711 9.77597 8.05285L9.53684 7.5746C9.51265 7.52622 9.47342 7.48699 9.42504 7.4628L8.94679 7.22367C8.76253 7.13154 8.76253 6.86859 8.94679 6.77646L9.42504 6.53733Z" fill="#667085"/>
+<path d="M2.42504 3.53733C2.47342 3.51314 2.51265 3.47391 2.53684 3.42553L2.77597 2.94728C2.8681 2.76302 3.13105 2.76302 3.22318 2.94728L3.46231 3.42553C3.4865 3.47391 3.52573 3.51314 3.57411 3.53733L4.05236 3.77646C4.23663 3.86859 4.23663 4.13154 4.05236 4.22367L3.57411 4.4628C3.52573 4.48699 3.4865 4.52622 3.46231 4.5746L3.22318 5.05285C3.13105 5.23711 2.8681 5.23711 2.77597 5.05285L2.53684 4.5746C2.51265 4.52622 2.47342 4.48699 2.42504 4.4628L1.94679 4.22367C1.76253 4.13154 1.76253 3.86859 1.94679 3.77646L2.42504 3.53733Z" fill="#667085"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/mediaAndDevices/microphone-01.svg b/app/components/base/icons/assets/vender/solid/mediaAndDevices/microphone-01.svg
new file mode 100644
index 0000000..8727719
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/mediaAndDevices/microphone-01.svg
@@ -0,0 +1,8 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="microphone-01">
+<g id="Solid">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.00008 0.666016C6.52732 0.666016 5.33341 1.85992 5.33341 3.33268V7.99935C5.33341 9.47211 6.52732 10.666 8.00008 10.666C9.47284 10.666 10.6667 9.47211 10.6667 7.99935V3.33268C10.6667 1.85992 9.47284 0.666016 8.00008 0.666016Z" fill="#155EEF"/>
+<path d="M4.00008 6.66602C4.00008 6.29783 3.7016 5.99935 3.33341 5.99935C2.96522 5.99935 2.66675 6.29783 2.66675 6.66602V7.99935C2.66675 10.7195 4.70319 12.9641 7.33466 13.2916C7.33384 13.3052 7.33341 13.3189 7.33341 13.3327V13.9993H5.33341C4.96522 13.9993 4.66675 14.2978 4.66675 14.666C4.66675 15.0342 4.96522 15.3327 5.33341 15.3327H10.6667C11.0349 15.3327 11.3334 15.0342 11.3334 14.666C11.3334 14.2978 11.0349 13.9993 10.6667 13.9993H8.66675V13.3327C8.66675 13.3189 8.66633 13.3052 8.6655 13.2916C11.297 12.9641 13.3334 10.7195 13.3334 7.99935V6.66602C13.3334 6.29783 13.0349 5.99935 12.6667 5.99935C12.2986 5.99935 12.0001 6.29783 12.0001 6.66602V7.99935C12.0001 10.2085 10.2092 11.9993 8.00008 11.9993C5.79094 11.9993 4.00008 10.2085 4.00008 7.99935V6.66602Z" fill="#155EEF"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/mediaAndDevices/play.svg b/app/components/base/icons/assets/vender/solid/mediaAndDevices/play.svg
new file mode 100644
index 0000000..545e407
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/mediaAndDevices/play.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="play">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M4.00312 1.40109C4.0091 1.40508 4.0151 1.40907 4.02111 1.41309L9.29548 4.92933C9.44809 5.03105 9.58959 5.12537 9.69827 5.21301C9.81168 5.30448 9.94538 5.43132 10.0223 5.61687C10.124 5.86212 10.124 6.13775 10.0223 6.38301C9.94538 6.56856 9.81168 6.6954 9.69827 6.78686C9.5896 6.8745 9.44811 6.96881 9.2955 7.07053L4.00314 10.5988C3.8166 10.7232 3.64886 10.835 3.50652 10.9121C3.36409 10.9893 3.16859 11.0775 2.9404 11.0639C2.64852 11.0465 2.3789 10.9022 2.20249 10.669C2.06458 10.4867 2.02952 10.2751 2.01474 10.1138C1.99997 9.95254 1.99999 9.75094 2 9.52674L2 2.49475C2 2.48752 2 2.48031 2 2.47313C1.99999 2.24893 1.99997 2.04733 2.01474 1.88612C2.02952 1.72479 2.06458 1.5132 2.20249 1.33089C2.3789 1.0977 2.64852 0.953401 2.9404 0.935973C3.16859 0.922349 3.36409 1.01055 3.50652 1.08774C3.64885 1.16488 3.81659 1.27672 4.00312 1.40109Z" fill="#155EEF"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/mediaAndDevices/robot.svg b/app/components/base/icons/assets/vender/solid/mediaAndDevices/robot.svg
new file mode 100644
index 0000000..72d8ddf
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/mediaAndDevices/robot.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="robot, bot">
+<path id="Icon" fill-rule="evenodd" clip-rule="evenodd" d="M6 0.5C6.27614 0.5 6.5 0.723858 6.5 1V1.5H8.5C9.32843 1.5 10 2.17157 10 3V5.5C10 5.94425 9.80688 6.34339 9.5 6.61805V7.29289L10.3536 8.14645C10.5488 8.34171 10.5488 8.65829 10.3536 8.85355C10.1583 9.04882 9.84171 9.04882 9.64645 8.85355L9.34052 8.54762C8.89526 9.96884 7.56805 11 6 11C4.43195 11 3.10474 9.96884 2.65948 8.54762L2.35355 8.85355C2.15829 9.04882 1.84171 9.04882 1.64645 8.85355C1.45118 8.65829 1.45118 8.34171 1.64645 8.14645L2.5 7.29289V6.61805C2.19313 6.34339 2 5.94425 2 5.5V3C2 2.17157 2.67157 1.5 3.5 1.5H5.5V1C5.5 0.723858 5.72386 0.5 6 0.5ZM3.5 2.5C3.22386 2.5 3 2.72386 3 3V5.5C3 5.77614 3.22386 6 3.5 6H8.5C8.77614 6 9 5.77614 9 5.5V3C9 2.72386 8.77614 2.5 8.5 2.5H3.5ZM4.5 3.5C4.77614 3.5 5 3.72386 5 4V4.5C5 4.77614 4.77614 5 4.5 5C4.22386 5 4 4.77614 4 4.5V4C4 3.72386 4.22386 3.5 4.5 3.5ZM7.5 3.5C7.77614 3.5 8 3.72386 8 4V4.5C8 4.77614 7.77614 5 7.5 5C7.22386 5 7 4.77614 7 4.5V4C7 3.72386 7.22386 3.5 7.5 3.5Z" fill="#667085"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/mediaAndDevices/sliders-02.svg b/app/components/base/icons/assets/vender/solid/mediaAndDevices/sliders-02.svg
new file mode 100644
index 0000000..42ff057
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/mediaAndDevices/sliders-02.svg
@@ -0,0 +1,8 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5 2C5.55228 2 6 2.44772 6 3V7C6 7.55228 5.55228 8 5 8C4.44772 8 4 7.55228 4 7V3C4 2.44772 4.44772 2 5 2Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M6 15.8293C7.16519 15.4175 8 14.3062 8 13C8 11.3431 6.65685 10 5 10C3.34315 10 2 11.3431 2 13C2 14.3062 2.83481 15.4175 4 15.8293L4 21C4 21.5523 4.44772 22 5 22C5.55229 22 6 21.5523 6 21L6 15.8293Z" fill="black"/>
+<path d="M13 15C13 14.4477 12.5523 14 12 14C11.4477 14 11 14.4477 11 15V21C11 21.5523 11.4477 22 12 22C12.5523 22 13 21.5523 13 21V15Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12 2C12.5523 2 13 2.44772 13 3V6.17071C14.1652 6.58254 15 7.69378 15 9C15 10.6569 13.6569 12 12 12C10.3431 12 9 10.6569 9 9C9 7.69378 9.83481 6.58254 11 6.17071V3C11 2.44772 11.4477 2 12 2Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M22 15C22 16.3062 21.1652 17.4175 20 17.8293V21C20 21.5523 19.5523 22 19 22C18.4477 22 18 21.5523 18 21V17.8293C16.8348 17.4175 16 16.3062 16 15C16 13.3431 17.3431 12 19 12C20.6569 12 22 13.3431 22 15Z" fill="black"/>
+<path d="M19 2C19.5523 2 20 2.44772 20 3V9C20 9.55228 19.5523 10 19 10C18.4477 10 18 9.55228 18 9V3C18 2.44772 18.4477 2 19 2Z" fill="black"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/mediaAndDevices/speaker.svg b/app/components/base/icons/assets/vender/solid/mediaAndDevices/speaker.svg
new file mode 100644
index 0000000..f769c7e
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/mediaAndDevices/speaker.svg
@@ -0,0 +1,15 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_109_6694)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.86666C0 2.05664 0.656649 1.39999 1.46667 1.39999H5.86667C6.67668 1.39999 7.33333 2.05664 7.33333 2.86666C7.33333 3.27167 7.00501 3.59999 6.6 3.59999C6.19499 3.59999 5.86667 3.27167 5.86667 2.86666H4.4V7.99999C4.80501 7.99999 5.13333 8.32831 5.13333 8.73332C5.13333 9.13833 4.80501 9.46666 4.4 9.46666H2.93333C2.52832 9.46666 2.2 9.13833 2.2 8.73332C2.2 8.32831 2.52832 7.99999 2.93333 7.99999V2.86666H1.46667C1.46667 3.27167 1.13834 3.59999 0.733333 3.59999C0.328324 3.59999 0 3.27167 0 2.86666Z" fill="#444CE7"/>
+<path d="M13.8205 0.782296C13.7434 0.62811 13.5233 0.62811 13.4462 0.782296C12.9664 1.74206 12.8754 1.83302 11.9156 2.3129C11.7615 2.39 11.7615 2.61003 11.9156 2.68712C12.8754 3.167 12.9664 3.25797 13.4462 4.21773C13.5233 4.37191 13.7434 4.37191 13.8205 4.21773C14.3003 3.25797 14.3913 3.167 15.3511 2.68712C15.5053 2.61003 15.5053 2.39 15.3511 2.3129C14.3913 1.83302 14.3003 1.74206 13.8205 0.782296Z" fill="#444CE7"/>
+<path d="M9.79394 2.25319C9.71404 2.09337 9.48596 2.09337 9.40605 2.25319C9.04994 2.96543 8.96544 3.04993 8.2532 3.40605C8.09338 3.48595 8.09338 3.71402 8.2532 3.79393C8.96544 4.15005 9.04994 4.23455 9.40606 4.94679C9.48596 5.10661 9.71404 5.10661 9.79394 4.94679C10.1501 4.23455 10.2346 4.15005 10.9468 3.79393C11.1066 3.71402 11.1066 3.48595 10.9468 3.40605C10.2346 3.04993 10.1501 2.96543 9.79394 2.25319Z" fill="#444CE7"/>
+<path d="M2.75377 11.049C2.67668 10.8948 2.45665 10.8948 2.37956 11.049C1.89969 12.0087 1.80872 12.0997 0.848971 12.5796C0.694788 12.6566 0.694787 12.8767 0.848971 12.9538C1.80872 13.4336 1.89969 13.5246 2.37956 14.4844C2.45665 14.6385 2.67668 14.6385 2.75377 14.4844C3.23365 13.5246 3.32461 13.4336 4.28436 12.9538C4.43855 12.8767 4.43855 12.6566 4.28436 12.5796C3.32461 12.0997 3.23365 12.0087 2.75377 11.049Z" fill="#444CE7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M14.6741 8.65106C14.8886 8.50146 15.1837 8.55405 15.3333 8.76853C15.7614 9.38226 16.0125 10.1292 16.0125 10.9333C16.0125 11.7375 15.7614 12.4844 15.3333 13.0981C15.1837 13.3126 14.8886 13.3652 14.6741 13.2156C14.4596 13.066 14.407 12.7708 14.5567 12.5564C14.8775 12.0964 15.0656 11.5375 15.0656 10.9333C15.0656 10.3291 14.8775 9.77025 14.5567 9.31028C14.407 9.09581 14.4596 8.80066 14.6741 8.65106Z" fill="#444CE7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.5674 6.53771C12.794 6.51987 13.0155 6.61161 13.1632 6.78449C13.2954 6.93929 13.3164 7.12549 13.3244 7.21587C13.3334 7.31718 13.3334 7.44301 13.3333 7.57103C13.3333 7.57691 13.3333 7.58278 13.3333 7.58866L13.3333 14.3C13.3334 14.428 13.3334 14.5539 13.3244 14.6552C13.3164 14.7455 13.2954 14.9317 13.1632 15.0865C13.0155 15.2594 12.794 15.3512 12.5674 15.3333C12.3644 15.3173 12.2179 15.2005 12.1484 15.1423C12.0704 15.077 11.9814 14.988 11.8909 14.8975L10.3795 13.3861C10.3357 13.3423 10.3137 13.3205 10.2971 13.3053L10.2958 13.3041L10.2941 13.3041C10.2716 13.303 10.2407 13.3029 10.1787 13.3029L9.34101 13.3029C9.22151 13.3029 9.10513 13.3029 9.00657 13.2949C8.89833 13.286 8.77062 13.2652 8.6421 13.1997C8.46392 13.1089 8.31906 12.964 8.22827 12.7859C8.16279 12.6574 8.14192 12.5296 8.13308 12.4214C8.12503 12.3228 8.12504 12.2065 8.12505 12.087V9.79916C8.12505 9.79413 8.12505 9.78909 8.12505 9.78406C8.12504 9.66456 8.12503 9.54819 8.13308 9.44963C8.14192 9.34139 8.16279 9.21368 8.22827 9.08517C8.31906 8.90699 8.46392 8.76212 8.6421 8.67133C8.77062 8.60585 8.89833 8.58498 9.00657 8.57614C9.10512 8.56809 9.2215 8.5681 9.341 8.56812C9.34603 8.56812 9.35106 8.56812 9.3561 8.56812H10.1787C10.2407 8.56812 10.2716 8.56801 10.2941 8.56698L10.2958 8.5669L10.2971 8.56575C10.3137 8.55058 10.3357 8.52877 10.3795 8.48491L11.8784 6.98602C11.8826 6.98186 11.8867 6.97771 11.8909 6.97355C11.9814 6.88302 12.0704 6.79403 12.1484 6.72874C12.2179 6.67049 12.3644 6.55368 12.5674 6.53771Z" fill="#444CE7"/>
+</g>
+<defs>
+<clipPath id="clip0_109_6694">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/mediaAndDevices/stop-circle.svg b/app/components/base/icons/assets/vender/solid/mediaAndDevices/stop-circle.svg
new file mode 100644
index 0000000..3009a52
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/mediaAndDevices/stop-circle.svg
@@ -0,0 +1,5 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="stop-circle">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M9.99992 0.833984C4.93731 0.833984 0.833252 4.93804 0.833252 10.0007C0.833252 15.0633 4.93731 19.1673 9.99992 19.1673C15.0625 19.1673 19.1666 15.0633 19.1666 10.0007C19.1666 4.93804 15.0625 0.833984 9.99992 0.833984ZM6.75741 7.12232C6.66658 7.30058 6.66658 7.53394 6.66658 8.00065V12.0006C6.66658 12.4674 6.66658 12.7007 6.75741 12.879C6.83731 13.0358 6.96479 13.1633 7.12159 13.2432C7.29985 13.334 7.53321 13.334 7.99992 13.334H11.9999C12.4666 13.334 12.7 13.334 12.8782 13.2432C13.035 13.1633 13.1625 13.0358 13.2424 12.879C13.3333 12.7007 13.3333 12.4674 13.3333 12.0006V8.00065C13.3333 7.53394 13.3333 7.30058 13.2424 7.12232C13.1625 6.96552 13.035 6.83804 12.8782 6.75814C12.7 6.66732 12.4666 6.66732 11.9999 6.66732H7.99992C7.53321 6.66732 7.29985 6.66732 7.12159 6.75814C6.96479 6.83804 6.83731 6.96552 6.75741 7.12232Z" fill="#155EEF"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/mediaAndDevices/video-support-icon.svg b/app/components/base/icons/assets/vender/solid/mediaAndDevices/video-support-icon.svg
new file mode 100644
index 0000000..f87aa02
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/mediaAndDevices/video-support-icon.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none">
+  <path d="M10.2334 4.3469L10.3567 4.06406C10.5764 3.55974 10.9723 3.15821 11.4662 2.93854L11.846 2.76961C12.0514 2.67827 12.0514 2.37941 11.846 2.28806L11.4874 2.12857C10.9808 1.90326 10.5779 1.48687 10.3619 0.965415L10.2353 0.659765C10.1471 0.446745 9.8529 0.446745 9.76465 0.659765L9.63805 0.965415C9.4221 1.48687 9.0192 1.90326 8.5126 2.12857L8.154 2.28806C7.94865 2.37941 7.94865 2.67827 8.154 2.76961L8.53385 2.93854C9.02775 3.15821 9.42355 3.55974 9.6433 4.06406L9.76655 4.3469C9.8568 4.55396 10.1432 4.55396 10.2334 4.3469ZM1.4959 1.5H7V2.5H4V9.5H8V4.5H9V5.5H10H11V10.0033C11 10.2776 10.7723 10.5 10.5041 10.5H1.4959C1.22203 10.5 1 10.2775 1 10.0033V1.9967C1 1.72238 1.22766 1.5 1.4959 1.5ZM2 2.5V3.5H3V2.5H2ZM2 4.5V5.5H3V4.5H2ZM2 6.5V7.5H3V6.5H2ZM9 6.5V7.5H10V6.5H9ZM2 8.5V9.5H3V8.5H2ZM9 8.5V9.5H10V8.5H9Z" fill="#676F83"/>
+</svg>
\ No newline at end of file
diff --git a/app/components/base/icons/assets/vender/solid/security/lock-01.svg b/app/components/base/icons/assets/vender/solid/security/lock-01.svg
new file mode 100644
index 0000000..9ca6d8e
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/security/lock-01.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="lock-01">
+<path id="Solid" fill-rule="evenodd" clip-rule="evenodd" d="M3 4C3 2.34315 4.34315 1 6 1C7.65685 1 9 2.34315 9 4V4.57516C9.1413 4.60613 9.27693 4.65121 9.40798 4.71799C9.78431 4.90973 10.0903 5.2157 10.282 5.59202C10.4057 5.83469 10.4549 6.09304 10.4779 6.37409C10.5 6.64468 10.5 6.97686 10.5 7.37934V8.12066C10.5 8.52314 10.5 8.85532 10.4779 9.12591C10.4549 9.40696 10.4057 9.66531 10.282 9.90798C10.0903 10.2843 9.78431 10.5903 9.40798 10.782C9.16531 10.9057 8.90696 10.9549 8.62591 10.9779C8.35531 11 8.02313 11 7.62064 11H4.37936C3.97687 11 3.64469 11 3.37409 10.9779C3.09304 10.9549 2.83469 10.9057 2.59202 10.782C2.2157 10.5903 1.90973 10.2843 1.71799 9.90798C1.59434 9.66531 1.54506 9.40696 1.5221 9.12591C1.49999 8.85532 1.49999 8.52314 1.5 8.12066V7.37934C1.49999 6.97687 1.49999 6.64468 1.5221 6.37409C1.54506 6.09304 1.59434 5.83469 1.71799 5.59202C1.90973 5.2157 2.2157 4.90973 2.59202 4.71799C2.72307 4.65121 2.8587 4.60613 3 4.57516V4ZM8 4V4.50081H4V4C4 2.89543 4.89543 2 6 2C7.10457 2 8 2.89543 8 4ZM6.5 7.25C6.5 6.97386 6.27614 6.75 6 6.75C5.72386 6.75 5.5 6.97386 5.5 7.25V8.25C5.5 8.52614 5.72386 8.75 6 8.75C6.27614 8.75 6.5 8.52614 6.5 8.25V7.25Z" fill="#667085"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/shapes/corner.svg b/app/components/base/icons/assets/vender/solid/shapes/corner.svg
new file mode 100644
index 0000000..9b360e4
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/shapes/corner.svg
@@ -0,0 +1,3 @@
+<svg width="13" height="20" viewBox="0 0 13 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path id="Shape" d="M0 0H13V20C9.98017 20 7.26458 18.1615 6.14305 15.3576L0 0Z" fill="#F9FAFB"/>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/shapes/star-04.svg b/app/components/base/icons/assets/vender/solid/shapes/star-04.svg
new file mode 100644
index 0000000..5dc88ab
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/shapes/star-04.svg
@@ -0,0 +1,5 @@
+<svg width="11" height="10" viewBox="0 0 11 10" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="star-04">
+<path id="Solid" d="M5.88897 0.683596C5.82708 0.522683 5.67249 0.416504 5.50008 0.416504C5.32768 0.416504 5.17308 0.522683 5.11119 0.683596L4.27287 2.86321C4.1477 3.18865 4.10837 3.28243 4.05457 3.35809C4.00059 3.43401 3.93426 3.50034 3.85834 3.55433C3.78267 3.60813 3.68889 3.64746 3.36346 3.77263L1.18384 4.61094C1.02293 4.67283 0.916748 4.82743 0.916748 4.99984C0.916748 5.17224 1.02293 5.32684 1.18384 5.38873L3.36346 6.22705C3.68889 6.35221 3.78267 6.39155 3.85834 6.44535C3.93426 6.49933 4.00059 6.56566 4.05457 6.64158C4.10837 6.71724 4.1477 6.81102 4.27287 7.13646L5.11119 9.31608C5.17308 9.47699 5.32768 9.58317 5.50008 9.58317C5.67249 9.58317 5.82709 9.47699 5.88898 9.31608L6.72729 7.13646C6.85246 6.81102 6.89179 6.71724 6.94559 6.64158C6.99957 6.56566 7.06591 6.49933 7.14183 6.44535C7.21749 6.39155 7.31127 6.35221 7.6367 6.22705L9.81632 5.38873C9.97723 5.32684 10.0834 5.17224 10.0834 4.99984C10.0834 4.82743 9.97723 4.67283 9.81632 4.61094L7.6367 3.77263C7.31127 3.64746 7.21749 3.60813 7.14183 3.55433C7.06591 3.50034 6.99957 3.43401 6.94559 3.35809C6.89179 3.28243 6.85246 3.18865 6.72729 2.86321L5.88897 0.683596Z" fill="#667085"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/shapes/star-06.svg b/app/components/base/icons/assets/vender/solid/shapes/star-06.svg
new file mode 100644
index 0000000..be9a77b
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/shapes/star-06.svg
@@ -0,0 +1,9 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="star-06">
+<g id="Solid">
+<path d="M3.66675 1.33268C3.66675 0.964492 3.36827 0.666016 3.00008 0.666016C2.63189 0.666016 2.33341 0.964492 2.33341 1.33268V2.33268H1.33341C0.965225 2.33268 0.666748 2.63116 0.666748 2.99935C0.666748 3.36754 0.965225 3.66602 1.33341 3.66602H2.33341V4.66602C2.33341 5.0342 2.63189 5.33268 3.00008 5.33268C3.36827 5.33268 3.66675 5.0342 3.66675 4.66602V3.66602H4.66675C5.03494 3.66602 5.33341 3.36754 5.33341 2.99935C5.33341 2.63116 5.03494 2.33268 4.66675 2.33268H3.66675V1.33268Z" fill="#444CE7"/>
+<path d="M3.66675 11.3327C3.66675 10.9645 3.36827 10.666 3.00008 10.666C2.63189 10.666 2.33341 10.9645 2.33341 11.3327V12.3327H1.33341C0.965225 12.3327 0.666748 12.6312 0.666748 12.9993C0.666748 13.3675 0.965225 13.666 1.33341 13.666H2.33341V14.666C2.33341 15.0342 2.63189 15.3327 3.00008 15.3327C3.36827 15.3327 3.66675 15.0342 3.66675 14.666V13.666H4.66675C5.03494 13.666 5.33341 13.3675 5.33341 12.9993C5.33341 12.6312 5.03494 12.3327 4.66675 12.3327H3.66675V11.3327Z" fill="#444CE7"/>
+<path d="M9.28898 1.76003C9.18995 1.50257 8.94259 1.33268 8.66675 1.33268C8.3909 1.33268 8.14354 1.50257 8.04452 1.76003L6.8884 4.76594C6.68813 5.28663 6.6252 5.43668 6.53912 5.55774C6.45274 5.67921 6.34661 5.78534 6.22514 5.87172C6.10408 5.9578 5.95403 6.02073 5.43334 6.221L2.42743 7.37712C2.16997 7.47614 2.00008 7.7235 2.00008 7.99935C2.00008 8.2752 2.16997 8.52256 2.42743 8.62158L5.43334 9.7777C5.95403 9.97797 6.10408 10.0409 6.22514 10.127C6.34661 10.2134 6.45274 10.3195 6.53912 10.441C6.6252 10.562 6.68813 10.7121 6.8884 11.2328L8.04452 14.2387C8.14354 14.4961 8.3909 14.666 8.66675 14.666C8.9426 14.666 9.18995 14.4961 9.28898 14.2387L10.4451 11.2328C10.6454 10.7121 10.7083 10.562 10.7944 10.441C10.8808 10.3195 10.9869 10.2134 11.1084 10.127C11.2294 10.0409 11.3795 9.97797 11.9002 9.7777L14.9061 8.62158C15.1635 8.52256 15.3334 8.2752 15.3334 7.99935C15.3334 7.7235 15.1635 7.47614 14.9061 7.37712L11.9002 6.221C11.3795 6.02073 11.2294 5.9578 11.1084 5.87172C10.9869 5.78534 10.8808 5.67921 10.7944 5.55774C10.7083 5.43668 10.6454 5.28663 10.4451 4.76594L9.28898 1.76003Z" fill="#444CE7"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/users/user-01.svg b/app/components/base/icons/assets/vender/solid/users/user-01.svg
new file mode 100644
index 0000000..139e1cc
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/users/user-01.svg
@@ -0,0 +1,8 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="user-01">
+<g id="Solid">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.85731 9.66669C7.28575 9.66701 8.71419 9.66701 10.1426 9.66669C10.6271 9.66659 10.9572 9.66652 11.2455 9.71735C12.6255 9.96068 13.706 11.0412 13.9493 12.4212C14.0002 12.7095 14.0001 13.0396 14 13.524C14 13.6296 14.0032 13.7359 13.9848 13.8404C13.9118 14.2544 13.5876 14.5785 13.1736 14.6515C13.0828 14.6675 12.9872 14.667 12.9396 14.6668C9.64686 14.6491 6.35308 14.6491 3.06031 14.6668C3.01274 14.667 2.9171 14.6675 2.82632 14.6515C2.41231 14.5785 2.08816 14.2544 2.01516 13.8404C1.99675 13.7359 1.99998 13.6296 1.99996 13.524C1.99985 13.0396 1.99978 12.7095 2.05061 12.4212C2.29395 11.0412 3.37444 9.96068 4.75447 9.71735C5.04275 9.66652 5.37286 9.66659 5.85731 9.66669Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M4.3333 5.00004C4.3333 2.975 5.97493 1.33337 7.99997 1.33337C10.025 1.33337 11.6666 2.975 11.6666 5.00004C11.6666 7.02508 10.025 8.66671 7.99997 8.66671C5.97493 8.66671 4.3333 7.02508 4.3333 5.00004Z" fill="#155EEF"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/users/user-edit-02.svg b/app/components/base/icons/assets/vender/solid/users/user-edit-02.svg
new file mode 100644
index 0000000..02a89f2
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/users/user-edit-02.svg
@@ -0,0 +1,14 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="user-edit 2" clip-path="url(#clip0_10419_49994)">
+<g id="Group">
+<path id="Vector" d="M5.83333 6.41667C7.60525 6.41667 9.04167 4.98025 9.04167 3.20833C9.04167 1.43642 7.60525 0 5.83333 0C4.06142 0 2.625 1.43642 2.625 3.20833C2.625 4.98025 4.06142 6.41667 5.83333 6.41667Z" fill="#FD853A"/>
+<path id="Vector_2" d="M5.90917 13.2465L6.78417 10.6221C6.85533 10.4086 6.97725 10.2114 7.1365 10.0522L8.79083 8.39783C7.92225 7.88391 6.91308 7.5835 5.83333 7.5835C2.61683 7.5835 0 10.2003 0 13.4168C0 13.7394 0.261333 14.0002 0.583333 14.0002H5.86717C5.817 13.7546 5.82575 13.4962 5.90917 13.2465Z" fill="#FD853A"/>
+<path id="Vector_3" d="M13.5524 7.44766C12.9562 6.85208 11.9856 6.85208 11.39 7.44766L7.96057 10.8771C7.92849 10.9092 7.90457 10.9482 7.88999 10.9908L7.01499 13.6158C6.97999 13.7208 7.0074 13.8363 7.08557 13.9145C7.14099 13.9705 7.21565 13.9997 7.29207 13.9997C7.32299 13.9997 7.3539 13.9944 7.38424 13.9851L10.0092 13.1101C10.0524 13.0961 10.0915 13.0716 10.123 13.0395L13.5524 9.61008C14.148 9.0145 14.148 8.04383 13.5524 7.44766Z" fill="#FD853A"/>
+</g>
+</g>
+<defs>
+<clipPath id="clip0_10419_49994">
+<rect width="14" height="14" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/users/users-01.svg b/app/components/base/icons/assets/vender/solid/users/users-01.svg
new file mode 100644
index 0000000..0028619
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/users/users-01.svg
@@ -0,0 +1,10 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="users-01">
+<g id="Solid">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.0211 9.91782C12.1128 9.56125 12.4763 9.34659 12.8329 9.43837C14.2704 9.80837 15.3334 11.1125 15.3334 12.6666V14C15.3334 14.3682 15.0349 14.6666 14.6667 14.6666C14.2985 14.6666 14 14.3682 14 14V12.6666C14 11.7356 13.3633 10.9517 12.5005 10.7296C12.1439 10.6378 11.9293 10.2744 12.0211 9.91782Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.7154 1.94368C9.85355 1.60239 10.2422 1.43771 10.5835 1.57586C11.8039 2.06985 12.6667 3.26669 12.6667 4.66665C12.6667 6.0666 11.8039 7.26344 10.5835 7.75743C10.2422 7.89558 9.85355 7.73091 9.7154 7.38962C9.57725 7.04833 9.74193 6.65967 10.0832 6.52152C10.8174 6.22432 11.3334 5.50494 11.3334 4.66665C11.3334 3.82835 10.8174 3.10897 10.0832 2.81178C9.74193 2.67363 9.57725 2.28496 9.7154 1.94368Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M4.78598 9.33329C5.81757 9.33363 6.84915 9.33363 7.88073 9.33329C8.60781 9.33305 9.10395 9.33289 9.52942 9.44689C10.6797 9.75512 11.5782 10.6536 11.8864 11.8039C12.0399 12.3768 11.9955 12.989 12.0001 13.576C12.0007 13.6473 12.0019 13.7915 11.966 13.9255C11.8735 14.2706 11.6039 14.5401 11.2588 14.6326C11.1248 14.6685 10.9807 14.6673 10.9094 14.6668C7.85941 14.6424 4.80731 14.6424 1.7573 14.6668C1.68602 14.6673 1.54188 14.6685 1.40787 14.6326C1.06278 14.5401 0.793233 14.2706 0.700765 13.9255C0.664858 13.7915 0.666007 13.6473 0.666575 13.576C0.671243 12.9905 0.627014 12.3759 0.780272 11.8039C1.0885 10.6536 1.98699 9.75512 3.13729 9.44689C3.56277 9.33289 4.05891 9.33305 4.78598 9.33329Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3.00002 4.66665C3.00002 2.8257 4.49241 1.33331 6.33336 1.33331C8.17431 1.33331 9.66669 2.8257 9.66669 4.66665C9.66669 6.5076 8.17431 7.99998 6.33336 7.99998C4.49241 7.99998 3.00002 6.5076 3.00002 4.66665Z" fill="#155EEF"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/solid/users/users-plus.svg b/app/components/base/icons/assets/vender/solid/users/users-plus.svg
new file mode 100644
index 0000000..36c82d1
--- /dev/null
+++ b/app/components/base/icons/assets/vender/solid/users/users-plus.svg
@@ -0,0 +1,10 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="users-plus">
+<g id="Solid">
+<path d="M20 15C20 14.4477 19.5523 14 19 14C18.4477 14 18 14.4477 18 15V17H16C15.4477 17 15 17.4477 15 18C15 18.5523 15.4477 19 16 19H18V21C18 21.5523 18.4477 22 19 22C19.5523 22 20 21.5523 20 21V19H22C22.5523 19 23 18.5523 23 18C23 17.4477 22.5523 17 22 17H20V15Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.181 14.1635C12.4632 14.3073 12.6927 14.5368 12.8365 14.819C12.9896 15.1194 13.0001 15.4476 13 15.7769C13 15.7847 13 15.7924 13 15.8C13 17.2744 12.9995 18.7488 13 20.2231C13.0001 20.3422 13.0001 20.4845 12.9899 20.6098C12.978 20.755 12.9476 20.963 12.8365 21.181C12.6927 21.4632 12.4632 21.6927 12.181 21.8365C11.963 21.9476 11.7551 21.978 11.6098 21.9899C11.4845 22.0001 11.3423 22.0001 11.2231 22C8.4077 21.999 5.59226 21.999 2.77682 22C2.65755 22.0001 2.51498 22.0001 2.38936 21.9898C2.24364 21.9778 2.03523 21.9472 1.81695 21.8356C1.53435 21.6911 1.30428 21.46 1.16109 21.1767C1.05079 20.9585 1.02087 20.7506 1.0095 20.6046C0.999737 20.4791 1.00044 20.3369 1.00103 20.2185C1.00619 19.1792 0.975203 18.0653 1.38061 17.0866C1.88808 15.8614 2.86145 14.8881 4.08659 14.3806C4.59629 14.1695 5.13457 14.0819 5.74331 14.0404C6.33532 14 7.06273 14 7.96449 14C9.05071 14 10.1369 14.0004 11.2231 14C11.5524 13.9999 11.8806 14.0104 12.181 14.1635Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M14.5731 2.91554C14.7803 2.40361 15.3633 2.1566 15.8752 2.36382C17.7058 3.10481 19 4.90006 19 7C19 9.09994 17.7058 10.8952 15.8752 11.6362C15.3633 11.8434 14.7803 11.5964 14.5731 11.0845C14.3658 10.5725 14.6129 9.98953 15.1248 9.7823C16.2261 9.33652 17 8.25744 17 7C17 5.74256 16.2261 4.66348 15.1248 4.2177C14.6129 4.01047 14.3658 3.42748 14.5731 2.91554Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M4.50001 7C4.50001 4.23858 6.73858 2 9.50001 2C12.2614 2 14.5 4.23858 14.5 7C14.5 9.76142 12.2614 12 9.50001 12C6.73858 12 4.50001 9.76142 4.50001 7Z" fill="black"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/agent.svg b/app/components/base/icons/assets/vender/workflow/agent.svg
new file mode 100644
index 0000000..f30c0b4
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/agent.svg
@@ -0,0 +1,8 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="agent">
+<g id="Vector">
+<path d="M14.7401 5.80454C14.5765 4.77996 14.1638 3.79808 13.5306 2.97273C12.8973 2.14738 12.0648 1.48568 11.1185 1.06589C10.1722 0.646098 9.12632 0.461106 8.08751 0.546487C7.05582 0.624753 6.04548 0.966277 5.17744 1.53548C4.3094 2.09758 3.58366 2.88024 3.09272 3.79808C2.59466 4.70881 2.33852 5.7405 2.33852 6.7793V7.22756L1.25703 9.3692C1.04357 9.80322 1.22145 10.3368 1.65547 10.5574L2.3314 10.8989V12.3006C2.3314 12.82 2.53063 13.3038 2.90061 13.6738C3.2706 14.0367 3.75442 14.243 4.27382 14.243H6.01702V14.7624C6.01702 15.1538 6.3372 15.4739 6.72853 15.4739C7.11986 15.4739 7.44004 15.1538 7.44004 14.7624V13.7094C7.44004 13.2185 7.04159 12.82 6.55065 12.82H4.27382C4.13864 12.82 4.00345 12.7631 3.91095 12.6706C3.81846 12.5781 3.76154 12.4429 3.76154 12.3077V10.5716C3.76154 10.2301 3.56943 9.92417 3.2706 9.77476L2.77254 9.52573L3.66904 7.73984C3.72596 7.61889 3.76154 7.4837 3.76154 7.34851V6.77219C3.76154 5.96818 3.96076 5.17129 4.34498 4.4669C4.72919 3.76251 5.28417 3.15772 5.9601 2.7237C6.63603 2.28968 7.41158 2.02643 8.20847 1.96239C9.00536 1.89835 9.81648 2.04066 10.5493 2.36795C11.2822 2.69524 11.9225 3.20042 12.4135 3.84077C12.8973 4.47402 13.2246 5.23533 13.3456 6.02511C13.4665 6.81488 13.3954 7.63312 13.125 8.38731C12.8617 9.12017 12.4206 9.78187 11.8585 10.3084C11.6735 10.4792 11.5668 10.7139 11.5668 10.9701V14.7624C11.5668 15.1538 11.887 15.4739 12.2783 15.4739C12.6696 15.4739 12.9898 15.1538 12.9898 14.7624V11.1978C13.6515 10.5432 14.1567 9.73918 14.4697 8.87114C14.8184 7.89637 14.918 6.83623 14.7615 5.81165L14.7401 5.80454Z" fill="white"/>
+<path d="M10.8055 7.99599C10.8909 7.83234 10.962 7.66158 11.0189 7.4837H11.6522C12.0435 7.4837 12.3637 7.16352 12.3637 6.77219C12.3637 6.38086 12.0435 6.06068 11.6522 6.06068H11.0189C10.9691 5.8828 10.898 5.71204 10.8055 5.54839L11.2537 5.10014C11.5312 4.82266 11.5312 4.3744 11.2537 4.09692C10.9762 3.81943 10.528 3.81943 10.2505 4.09692L9.80225 4.54517C9.6386 4.45267 9.46784 4.38863 9.28996 4.33171V3.69847C9.28996 3.30714 8.96978 2.98696 8.57845 2.98696C8.18712 2.98696 7.86694 3.30714 7.86694 3.69847V4.33171C7.68907 4.38152 7.5183 4.45267 7.35466 4.54517L6.90641 4.09692C6.62892 3.81943 6.18067 3.81943 5.90318 4.09692C5.62569 4.3744 5.62569 4.82266 5.90318 5.10014L6.35143 5.54839C6.26605 5.71204 6.1949 5.8828 6.13798 6.06068H5.50473C5.1134 6.06068 4.79323 6.38086 4.79323 6.77219C4.79323 7.16352 5.1134 7.4837 5.50473 7.4837H6.13798C6.18778 7.66158 6.25893 7.83234 6.35143 7.99599L5.90318 8.44424C5.62569 8.72172 5.62569 9.16997 5.90318 9.44746C6.04548 9.58976 6.22336 9.6538 6.40835 9.6538C6.59334 9.6538 6.77122 9.58265 6.91352 9.44746L7.36177 8.99921C7.52542 9.08459 7.69618 9.15574 7.87406 9.21267V9.84591C7.87406 10.2372 8.19424 10.5574 8.58557 10.5574C8.9769 10.5574 9.29708 10.2372 9.29708 9.84591V9.21267C9.47496 9.16286 9.64572 9.09171 9.80936 8.99921L10.2576 9.44746C10.3999 9.58976 10.5778 9.6538 10.7628 9.6538C10.9478 9.6538 11.1257 9.58265 11.268 9.44746C11.5454 9.16997 11.5454 8.72172 11.268 8.44424L10.8197 7.99599H10.8055ZM7.44004 6.77219C7.44004 6.14606 7.94521 5.64089 8.57134 5.64089C9.19747 5.64089 9.70264 6.14606 9.70264 6.77219C9.70264 7.39832 9.19747 7.90349 8.57134 7.90349C7.94521 7.90349 7.44004 7.39832 7.44004 6.77219Z" fill="white"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/answer.svg b/app/components/base/icons/assets/vender/workflow/answer.svg
new file mode 100644
index 0000000..7767ce1
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/answer.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="icons/answer">
+<path id="Vector (Stroke)" fill-rule="evenodd" clip-rule="evenodd" d="M3.50114 1.67701L10.5011 1.677C11.5079 1.677 12.3241 2.49311 12.3241 3.49992V9.35414C12.3241 10.3609 11.5079 11.177 10.5012 11.1771H8.9954L7.41734 12.4845C7.17339 12.6866 6.81987 12.6856 6.57708 12.4821L5.02026 11.1771H3.50114C2.49436 11.1771 1.67822 10.3608 1.67822 9.35414V3.49993C1.67822 2.49316 2.49437 1.67701 3.50114 1.67701ZM10.5011 2.9895L3.50114 2.98951C3.21924 2.98951 2.99072 3.21803 2.99072 3.49993V9.35414C2.99072 9.63601 3.21926 9.86455 3.50114 9.86455H5.04675C5.33794 9.86455 5.61984 9.96705 5.84302 10.1541L7.00112 11.1249L8.17831 10.1496C8.40069 9.96537 8.68041 9.86455 8.96916 9.86455H10.5011C10.5011 9.86455 10.5011 9.86455 10.5011 9.86455C10.783 9.8645 11.0116 9.63592 11.0116 9.35414V3.49992C11.0116 3.21806 10.7831 2.9895 10.5011 2.9895ZM9.06809 4.93171C9.32437 5.18799 9.32437 5.60351 9.06809 5.85979L7.02642 7.90146C6.77014 8.15774 6.35464 8.15774 6.09835 7.90146L5.22333 7.02646C4.96704 6.77019 4.96704 6.35467 5.22332 6.09839C5.4796 5.8421 5.89511 5.8421 6.15139 6.09837L6.56238 6.50935L8.14001 4.93171C8.3963 4.67543 8.81181 4.67543 9.06809 4.93171Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/assigner.svg b/app/components/base/icons/assets/vender/workflow/assigner.svg
new file mode 100644
index 0000000..b37fbce
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/assigner.svg
@@ -0,0 +1,9 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="variable assigner">
+<g id="Vector">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.71438 4.42875C1.71438 3.22516 2.68954 2.25 3.89313 2.25C4.30734 2.25 4.64313 2.58579 4.64313 3C4.64313 3.41421 4.30734 3.75 3.89313 3.75C3.51796 3.75 3.21438 4.05359 3.21438 4.42875V7.28563C3.21438 7.48454 3.13536 7.6753 2.9947 7.81596L2.81066 8L2.9947 8.18404C3.13536 8.3247 3.21438 8.51546 3.21438 8.71437V11.5713C3.21438 11.9464 3.51796 12.25 3.89313 12.25C4.30734 12.25 4.64313 12.5858 4.64313 13C4.64313 13.4142 4.30734 13.75 3.89313 13.75C2.68954 13.75 1.71438 12.7748 1.71438 11.5713V9.02503L1.21967 8.53033C1.07902 8.38968 1 8.19891 1 8C1 7.80109 1.07902 7.61032 1.21967 7.46967L1.71438 6.97497V4.42875ZM11.3568 3C11.3568 2.58579 11.6925 2.25 12.1068 2.25C13.3103 2.25 14.2855 3.22516 14.2855 4.42875V6.97497L14.7802 7.46967C14.9209 7.61032 14.9999 7.80109 14.9999 8C14.9999 8.19891 14.9209 8.38968 14.7802 8.53033L14.2855 9.02503V11.5713C14.2855 12.7751 13.3095 13.75 12.1068 13.75C11.6925 13.75 11.3568 13.4142 11.3568 13C11.3568 12.5858 11.6925 12.25 12.1068 12.25C12.4815 12.25 12.7855 11.9462 12.7855 11.5713V8.71437C12.7855 8.51546 12.8645 8.3247 13.0052 8.18404L13.1892 8L13.0052 7.81596C12.8645 7.6753 12.7855 7.48454 12.7855 7.28563V4.42875C12.7855 4.05359 12.4819 3.75 12.1068 3.75C11.6925 3.75 11.3568 3.41421 11.3568 3Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.25 6C5.25 5.58579 5.58579 5.25 6 5.25H10C10.4142 5.25 10.75 5.58579 10.75 6C10.75 6.41421 10.4142 6.75 10 6.75H6C5.58579 6.75 5.25 6.41421 5.25 6Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.25 10C5.25 9.58579 5.58579 9.25 6 9.25H10C10.4142 9.25 10.75 9.58579 10.75 10C10.75 10.4142 10.4142 10.75 10 10.75H6C5.58579 10.75 5.25 10.4142 5.25 10Z" fill="white"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/code.svg b/app/components/base/icons/assets/vender/workflow/code.svg
new file mode 100644
index 0000000..4d4b6cb
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/code.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="icons/code">
+<path id="Vector (Stroke)" fill-rule="evenodd" clip-rule="evenodd" d="M8.32593 1.69675C8.67754 1.78466 8.89132 2.14096 8.80342 2.49257L6.47009 11.8259C6.38218 12.1775 6.02588 12.3913 5.67427 12.3034C5.32265 12.2155 5.10887 11.8592 5.19678 11.5076L7.53011 2.17424C7.61801 1.82263 7.97431 1.60885 8.32593 1.69675ZM3.96414 4.20273C4.22042 4.45901 4.22042 4.87453 3.96413 5.13081L2.45578 6.63914C2.45577 6.63915 2.45578 6.63914 2.45578 6.63914C2.25645 6.83851 2.25643 7.16168 2.45575 7.36103C2.45574 7.36103 2.45576 7.36104 2.45575 7.36103L3.96413 8.86936C4.22041 9.12564 4.22042 9.54115 3.96414 9.79744C3.70787 10.0537 3.29235 10.0537 3.03607 9.79745L1.52769 8.28913C0.815811 7.57721 0.815803 6.42302 1.52766 5.7111L3.03606 4.20272C3.29234 3.94644 3.70786 3.94644 3.96414 4.20273ZM10.0361 4.20273C10.2923 3.94644 10.7078 3.94644 10.9641 4.20272L12.4725 5.71108C13.1843 6.423 13.1844 7.57717 12.4725 8.28909L10.9641 9.79745C10.7078 10.0537 10.2923 10.0537 10.036 9.79744C9.77977 9.54115 9.77978 9.12564 10.0361 8.86936L11.5444 7.36107C11.7437 7.16172 11.7438 6.83854 11.5444 6.63917C11.5444 6.63915 11.5445 6.63918 11.5444 6.63917L10.0361 5.13081C9.77978 4.87453 9.77978 4.45901 10.0361 4.20273Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/docs-extractor.svg b/app/components/base/icons/assets/vender/workflow/docs-extractor.svg
new file mode 100644
index 0000000..5b85003
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/docs-extractor.svg
@@ -0,0 +1,9 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="docs-extractor">
+<g id="Vector">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.66663 3.33325C2.66663 2.22869 3.56206 1.33325 4.66663 1.33325H12.6666C13.0348 1.33325 13.3333 1.63173 13.3333 1.99992V13.9999C13.3333 14.3681 13.0348 14.6666 12.6666 14.6666H4.66663C3.56206 14.6666 2.66663 13.7712 2.66663 12.6666V3.33325ZM3.99996 10.7804V3.33325C3.99996 2.96507 4.29844 2.66659 4.66663 2.66659H12V10.6666H4.66663C4.43287 10.6666 4.20848 10.7067 3.99996 10.7804ZM12 11.9999H4.66663C4.29844 11.9999 3.99996 12.2984 3.99996 12.6666C3.99996 13.0348 4.29844 13.3333 4.66663 13.3333H12V11.9999Z" fill="white"/>
+<path d="M8.12296 4.9385C8.18749 4.90624 8.23983 4.85394 8.27203 4.78942L8.70203 3.92954C8.82483 3.68385 9.17543 3.68385 9.29829 3.92954L9.72823 4.78942C9.76049 4.85394 9.81276 4.90624 9.87729 4.9385L10.7372 5.36844C10.9829 5.49128 10.9829 5.84189 10.7372 5.96473L9.87729 6.39467C9.81276 6.42692 9.76049 6.47923 9.72823 6.54375L9.29829 7.40365C9.17543 7.64932 8.82483 7.64932 8.70203 7.40365L8.27203 6.54375C8.23983 6.47923 8.18749 6.42692 8.12296 6.39467L7.26309 5.96473C7.01743 5.84189 7.01743 5.49128 7.26309 5.36844L8.12296 4.9385Z" fill="white"/>
+<path d="M5.71829 7.80752C5.757 7.78819 5.78838 7.75678 5.80773 7.71805L6.15459 7.02438C6.22829 6.87692 6.43865 6.87692 6.51236 7.02438L6.85923 7.71805C6.87856 7.75678 6.90996 7.78819 6.94863 7.80752L7.64236 8.15439C7.78976 8.22805 7.78976 8.43845 7.64236 8.51212L6.94863 8.85898C6.90996 8.87832 6.87856 8.90972 6.85923 8.94845L6.51236 9.64212C6.43865 9.78959 6.22829 9.78959 6.15459 9.64212L5.80773 8.94845C5.78838 8.90972 5.757 8.87832 5.71829 8.85898L5.02458 8.51212C4.87717 8.43845 4.87717 8.22805 5.02458 8.15439L5.71829 7.80752Z" fill="white"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/end.svg b/app/components/base/icons/assets/vender/workflow/end.svg
new file mode 100644
index 0000000..388803a
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/end.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="icons/end">
+<path id="Vector (Stroke)" fill-rule="evenodd" clip-rule="evenodd" d="M6.67315 1.18094C6.87691 1.0639 7.12769 1.06475 7.33067 1.18315L10.8307 3.22481C11.0323 3.34242 11.1562 3.55826 11.1562 3.79167C11.1562 4.02507 11.0323 4.24091 10.8307 4.35852L7.65625 6.21026V9.91667C7.65625 10.2791 7.36244 10.5729 7 10.5729C6.63756 10.5729 6.34375 10.2791 6.34375 9.91667V5.84577C6.34361 5.83788 6.34361 5.83 6.34375 5.82213V1.75C6.34375 1.51502 6.46939 1.29797 6.67315 1.18094ZM7.65625 4.69078L9.19758 3.79167L7.65625 2.89256V4.69078ZM5.31099 8.25466C5.37977 8.61051 5.14704 8.95473 4.79119 9.0235C3.97285 9.18165 3.32667 9.41764 2.90374 9.67762C2.45323 9.95454 2.40625 10.1564 2.40625 10.2086C2.40625 10.2448 2.42254 10.3508 2.60674 10.5202C2.79151 10.6901 3.09509 10.8732 3.52555 11.0406C4.38229 11.3738 5.61047 11.594 7 11.594C8.38954 11.594 9.61773 11.3738 10.4745 11.0406C10.9049 10.8732 11.2085 10.6901 11.3933 10.5202C11.5775 10.3508 11.5938 10.2448 11.5938 10.2086C11.5938 10.1564 11.5468 9.95454 11.0963 9.67762C10.6733 9.41764 10.0271 9.18165 9.20881 9.0235C8.85296 8.95473 8.62023 8.61051 8.68901 8.25465C8.75778 7.8988 9.102 7.66608 9.45786 7.73485C10.3682 7.91077 11.1803 8.18867 11.7836 8.55947C12.3592 8.91331 12.9062 9.45912 12.9062 10.2086C12.9062 10.7361 12.6287 11.1672 12.2816 11.4864C11.935 11.805 11.4698 12.0618 10.9502 12.2639C9.90679 12.6696 8.50997 12.9065 7 12.9065C5.49004 12.9065 4.09322 12.6696 3.04983 12.2639C2.53023 12.0618 2.06497 11.805 1.7184 11.4864C1.37128 11.1672 1.09375 10.7361 1.09375 10.2086C1.09375 9.45913 1.64077 8.91332 2.21642 8.55947C2.81966 8.18867 3.63181 7.91077 4.54215 7.73485C4.898 7.66608 5.24222 7.8988 5.31099 8.25466Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/home.svg b/app/components/base/icons/assets/vender/workflow/home.svg
new file mode 100644
index 0000000..f7c6988
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/home.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="icons/home">
+<path id="Icon (Stroke)" fill-rule="evenodd" clip-rule="evenodd" d="M6.99999 2.44562C6.97241 2.46663 6.94086 2.49116 6.90151 2.52177L3.43971 5.21428C3.17896 5.41708 3.15115 5.44593 3.13396 5.46918C3.10759 5.50483 3.08794 5.545 3.07599 5.58771C3.0682 5.61555 3.0625 5.65522 3.0625 5.98554V9.67837C3.0625 9.97506 3.06301 10.1581 3.07422 10.2954C3.08463 10.4228 3.10101 10.4541 3.10219 10.4563C3.13714 10.5249 3.19296 10.5808 3.26156 10.6157C3.2638 10.6169 3.29514 10.6333 3.42254 10.6437C3.55984 10.6549 3.74289 10.6555 4.03958 10.6555H4.8125V7.53462C4.8125 7.52831 4.81249 7.52199 4.81249 7.51565C4.81247 7.38933 4.81245 7.25834 4.82163 7.14594C4.8319 7.02025 4.85685 6.86124 4.93966 6.69872C5.05151 6.4792 5.22998 6.30072 5.44951 6.18886C5.61203 6.10605 5.77104 6.08111 5.89673 6.07084C6.00913 6.06166 6.14012 6.06168 6.26644 6.0617C6.27278 6.0617 6.2791 6.06171 6.28541 6.06171H7.71458C7.72089 6.06171 7.72721 6.0617 7.73355 6.0617C7.85987 6.06168 7.99086 6.06166 8.10326 6.07084C8.22896 6.08111 8.38796 6.10605 8.55049 6.18886C8.77001 6.30072 8.94849 6.4792 9.06034 6.69872C9.14315 6.86124 9.16809 7.02025 9.17836 7.14594C9.18755 7.25834 9.18752 7.38933 9.1875 7.51565C9.1875 7.52199 9.1875 7.52831 9.1875 7.53462V10.6555H9.96041C10.2571 10.6555 10.4402 10.6549 10.5775 10.6437C10.7049 10.6333 10.7361 10.6169 10.7383 10.6158C10.8069 10.5808 10.8628 10.525 10.8978 10.4564C10.8989 10.4541 10.9154 10.4228 10.9258 10.2954C10.937 10.1581 10.9375 9.97506 10.9375 9.67837V5.98554C10.9375 5.65522 10.9318 5.61555 10.924 5.58771C10.912 5.545 10.8924 5.50483 10.866 5.46918C10.8488 5.44593 10.821 5.41708 10.5603 5.21428L7.09848 2.52177C7.05913 2.49116 7.02757 2.46663 6.99999 2.44562ZM9.98433 11.968C10.2497 11.968 10.4871 11.968 10.6843 11.9519C10.8951 11.9346 11.1172 11.8958 11.3343 11.7852C11.6499 11.6244 11.9064 11.3678 12.0672 11.0523C12.1778 10.8351 12.2167 10.6131 12.2339 10.4023C12.25 10.205 12.25 9.96764 12.25 9.70225L12.25 5.98554C12.25 5.9671 12.25 5.94866 12.2501 5.93025C12.2504 5.69307 12.2508 5.45861 12.1879 5.23392C12.1329 5.03748 12.0426 4.85272 11.9213 4.68871C11.7825 4.50112 11.5972 4.35747 11.4098 4.21216C11.3952 4.20087 11.3806 4.18958 11.3661 4.17826L7.90428 1.48574C7.89214 1.4763 7.87933 1.46621 7.86587 1.4556C7.73357 1.35131 7.53852 1.19755 7.3049 1.1343C7.10523 1.08023 6.89477 1.08023 6.69509 1.1343C6.46148 1.19755 6.26642 1.35131 6.13412 1.4556C6.12066 1.46621 6.10785 1.4763 6.09571 1.48574L2.63391 4.17826C2.61935 4.18958 2.60478 4.20088 2.59022 4.21216C2.40278 4.35747 2.21747 4.50112 2.07873 4.68871C1.95742 4.85271 1.86706 5.03748 1.81207 5.23392C1.74918 5.4586 1.74956 5.69307 1.74994 5.93024C1.74997 5.94866 1.75 5.96709 1.75 5.98554L1.75 9.70227C1.74998 9.96765 1.74997 10.205 1.76608 10.4023C1.78331 10.6131 1.82216 10.8351 1.93279 11.0523C2.09357 11.3678 2.35014 11.6244 2.6657 11.7852C2.88282 11.8958 3.10485 11.9346 3.31566 11.9519C3.5129 11.968 3.75029 11.968 4.01566 11.968H9.98433ZM7.875 10.6555V7.53462C7.875 7.47093 7.87498 7.41945 7.87447 7.37473C7.82975 7.37422 7.77828 7.37421 7.71458 7.37421H6.28541C6.22172 7.37421 6.17024 7.37422 6.12553 7.37473C6.12501 7.41945 6.125 7.47093 6.125 7.53462V10.6555H7.875Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/http.svg b/app/components/base/icons/assets/vender/workflow/http.svg
new file mode 100644
index 0000000..de832d9
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/http.svg
@@ -0,0 +1,10 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="icons/http">
+<g id="Vector">
+<path d="M13.0968 4.66675H10.8387V9.18288H11.7419V7.82804H13.0968C13.3362 7.82772 13.5658 7.73245 13.7351 7.56313C13.9044 7.39382 13.9997 7.16426 14 6.92481V5.56997C13.9997 5.33051 13.9045 5.10093 13.7351 4.9316C13.5658 4.76227 13.3362 4.66702 13.0968 4.66675ZM11.7419 6.92481V5.56997H13.0968L13.0972 6.92481H11.7419Z" fill="white"/>
+<path d="M4.06452 5.56997H4.96774V9.18288H5.87097V5.56997H6.77419V4.66675H4.06452V5.56997Z" fill="white"/>
+<path d="M9.93548 4.66675H7.22581V5.56997H8.12903V9.18288H9.03226V5.56997H9.93548V4.66675Z" fill="white"/>
+<path d="M2.25806 4.66675V6.4732H0.903226V4.66675H0V9.18288H0.903226V7.37643H2.25806V9.18288H3.16129V4.66675H2.25806Z" fill="white"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/if-else.svg b/app/components/base/icons/assets/vender/workflow/if-else.svg
new file mode 100644
index 0000000..2343da8
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/if-else.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="icons/if-else">
+<path id="Vector (Stroke)" fill-rule="evenodd" clip-rule="evenodd" d="M8.16667 2.98975C7.80423 2.98975 7.51042 2.69593 7.51042 2.3335C7.51042 1.97106 7.80423 1.67725 8.16667 1.67725H11.0833C11.4458 1.67725 11.7396 1.97106 11.7396 2.3335V5.25016C11.7396 5.6126 11.4458 5.90641 11.0833 5.90641C10.7209 5.90641 10.4271 5.6126 10.4271 5.25016V3.91782L7.34474 7.00016L10.4271 10.0825V8.75016C10.4271 8.38773 10.7209 8.09391 11.0833 8.09391C11.4458 8.09391 11.7396 8.38773 11.7396 8.75016V11.6668C11.7396 12.0293 11.4458 12.3231 11.0833 12.3231H8.16667C7.80423 12.3231 7.51042 12.0293 7.51042 11.6668C7.51042 11.3044 7.80423 11.0106 8.16667 11.0106H9.49901L6.14484 7.65641H1.75C1.38756 7.65641 1.09375 7.3626 1.09375 7.00016C1.09375 6.63773 1.38756 6.34391 1.75 6.34391H6.14484L9.49901 2.98975H8.16667Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/iteration-start.svg b/app/components/base/icons/assets/vender/workflow/iteration-start.svg
new file mode 100644
index 0000000..a1cc763
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/iteration-start.svg
@@ -0,0 +1,5 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="icons/block-start">
+<path id="Vector" d="M6.8498 1.72732C6.3379 1.3754 5.6621 1.3754 5.1502 1.72732L2.1502 3.78982C1.74317 4.06965 1.5 4.53193 1.5 5.02588V8.99983C1.5 9.82828 2.17158 10.4998 3 10.4998H4.25C4.52614 10.4998 4.75 10.276 4.75 9.99983V8.24983C4.75 7.55948 5.30965 6.99983 6 6.99983C6.69035 6.99983 7.25 7.55948 7.25 8.24983V9.99983C7.25 10.276 7.47385 10.4998 7.75 10.4998H9C9.82845 10.4998 10.5 9.82828 10.5 8.99983V5.02588C10.5 4.53193 10.2568 4.06965 9.8498 3.78982L6.8498 1.72732Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/iteration.svg b/app/components/base/icons/assets/vender/workflow/iteration.svg
new file mode 100644
index 0000000..2a74fac
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/iteration.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="icons/iteration">
+<path id="Vector" d="M6.82849 0.754349C6.6007 0.526545 6.23133 0.526545 6.00354 0.754349C5.77573 0.982158 5.77573 1.3515 6.00354 1.57931L6.82849 0.754349ZM8.16602 2.91683L8.57849 3.32931C8.80628 3.1015 8.80628 2.73216 8.57849 2.50435L8.16602 2.91683ZM6.00354 4.25435C5.77573 4.48216 5.77573 4.8515 6.00354 5.07931C6.23133 5.30711 6.6007 5.30711 6.82849 5.07931L6.00354 4.25435ZM7.99516 9.74597C8.22295 9.51818 8.22295 9.14881 7.99516 8.92102C7.76737 8.69323 7.398 8.69323 7.17021 8.92102L7.99516 9.74597ZM5.83268 11.0835L5.4202 10.671C5.1924 10.8988 5.1924 11.2682 5.4202 11.496L5.83268 11.0835ZM7.17021 13.246C7.398 13.4738 7.76737 13.4738 7.99516 13.246C8.22295 13.0182 8.22295 12.6488 7.99516 12.421L7.17021 13.246ZM11.4993 3.73414C11.2738 3.50404 10.9045 3.5003 10.6744 3.72578C10.4443 3.95127 10.4405 4.32059 10.6661 4.55069L11.4993 3.73414ZM7.58268 3.50016C7.90486 3.50016 8.16602 3.23899 8.16602 2.91683C8.16602 2.59467 7.90486 2.3335 7.58268 2.3335L7.58268 3.50016ZM2.49938 10.2662C2.72486 10.4963 3.09419 10.5 3.32429 10.2745C3.55439 10.0491 3.55814 9.6797 3.33266 9.44964L2.49938 10.2662ZM6.00354 1.57931L7.75354 3.32931L8.57849 2.50435L6.82849 0.754349L6.00354 1.57931ZM7.75354 2.50435L6.00354 4.25435L6.82849 5.07931L8.57849 3.32931L7.75354 2.50435ZM7.17021 8.92102L5.4202 10.671L6.24516 11.496L7.99516 9.74597L7.17021 8.92102ZM5.4202 11.496L7.17021 13.246L7.99516 12.421L6.24516 10.671L5.4202 11.496ZM8.16602 10.5002L6.41602 10.5002V11.6668L8.16602 11.6668V10.5002ZM11.666 7.00016C11.666 8.93316 10.099 10.5002 8.16602 10.5002V11.6668C10.7434 11.6668 12.8327 9.57751 12.8327 7.00016H11.666ZM12.8327 7.00016C12.8327 5.72882 12.3235 4.57524 11.4993 3.73414L10.6661 4.55069C11.2852 5.18256 11.666 6.0463 11.666 7.00016H12.8327ZM5.83268 3.50016H7.58268L7.58268 2.3335H5.83268L5.83268 3.50016ZM2.33268 7.00016C2.33268 5.06717 3.89968 3.50016 5.83268 3.50016L5.83268 2.3335C3.25535 2.3335 1.16602 4.42283 1.16602 7.00016H2.33268ZM1.16602 7.00016C1.16602 8.27148 1.67517 9.42508 2.49938 10.2662L3.33266 9.44964C2.71348 8.81777 2.33268 7.95403 2.33268 7.00016H1.16602Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/jinja.svg b/app/components/base/icons/assets/vender/workflow/jinja.svg
new file mode 100644
index 0000000..5b40f30
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/jinja.svg
@@ -0,0 +1,13 @@
+<svg width="24" height="12" viewBox="0 0 24 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Jinja Icon">
+<g id="Vector">
+<path d="M7.46013 5.99982C7.46013 4.87982 7.48013 3.92982 7.53013 3.16982V3.06982L6.13013 3.23982L6.15013 3.32982C6.29013 4.03982 6.36013 4.93982 6.36013 5.99982C6.36013 6.93982 6.33013 7.78982 6.28013 8.51982V8.60982H7.55013V8.51982C7.49013 7.72982 7.46013 6.87982 7.46013 5.99982Z" fill="#667085"/>
+<path d="M3.33016 1.31998C3.38016 2.31998 3.38016 5.13998 3.38016 7.00998V7.77998C3.38016 8.21998 3.35016 8.58998 3.28016 8.85998C3.22016 9.12998 3.11016 9.34998 2.96016 9.52998C2.82016 9.70998 2.62016 9.83998 2.37016 9.92998C2.12016 10.01 1.82016 10.06 1.49016 10.06C1.19016 10.06 0.900156 9.99998 0.620156 9.87998L0.520156 9.83998L0.410156 10.83L0.480156 10.85C0.800156 10.93 1.16016 10.97 1.56016 10.97C2.08016 10.97 2.53016 10.9 2.90016 10.77C3.28016 10.64 3.59016 10.43 3.83016 10.15C4.07016 9.87998 4.25016 9.52998 4.36016 9.13998C4.47016 8.74998 4.53016 8.23998 4.53016 7.64998C4.53016 6.78998 4.59016 3.54998 4.59016 3.17998C4.61016 2.47998 4.63016 1.86998 4.66016 1.31998V1.22998H3.33016V1.31998Z" fill="#667085"/>
+<path d="M7.08021 0.919922C6.82022 0.919922 6.60021 0.999922 6.45021 1.14992C6.30021 1.29992 6.22021 1.47992 6.22021 1.68992C6.22021 1.87992 6.28021 2.04992 6.41021 2.18992C6.54022 2.31992 6.73022 2.38992 6.96022 2.38992C7.23022 2.38992 7.44021 2.30992 7.59021 2.15992C7.74021 1.99992 7.81021 1.81992 7.81021 1.60992C7.81021 1.42992 7.74021 1.25992 7.61021 1.12992C7.48021 0.989922 7.30021 0.919922 7.08021 0.919922Z" fill="#667085"/>
+<path d="M15.6102 3.30981C15.7702 4.07981 15.8502 5.25981 15.8502 6.81981C15.8502 8.26981 15.7902 9.23981 15.6702 9.67981C15.5902 9.96981 15.3802 10.2598 15.0302 10.5198L14.9702 10.5698L15.3502 11.0998H15.4002C16.4302 10.8198 16.9602 10.0598 16.9602 8.83981C16.9602 8.64981 16.9502 8.30981 16.9202 7.80981C16.9002 7.31981 16.8902 6.90981 16.8902 6.59981C16.8902 5.44981 16.9202 4.28981 16.9902 3.15981V3.05981L15.5802 3.21981L15.6002 3.30981H15.6102Z" fill="#667085"/>
+<path d="M14.2901 5.77C14.2901 5.7 14.2901 5.56 14.3001 5.36C14.3001 5.15 14.3101 5.01 14.3101 4.94C14.3101 4.22 14.1101 3.71 13.7201 3.43C13.3401 3.15 12.8001 3 12.1101 3C11.4201 3 10.7901 3.24 10.2001 3.71L10.0901 3.06L8.8501 3.22L8.8701 3.31C9.0501 4.11 9.1401 4.95 9.1401 5.8C9.1401 6.36 9.1101 7.27 9.0401 8.52V8.61H10.3101V8.53C10.2901 7.07 10.2801 5.71 10.2801 4.49C10.7401 4.14 11.2501 3.96 11.7901 3.96C12.2401 3.96 12.5801 4.06 12.8201 4.26C13.0501 4.45 13.1701 4.82 13.1701 5.36C13.1701 6.5 13.1301 7.56 13.0401 8.53V8.62H14.3101V8.54C14.2901 7.35 14.2801 6.42 14.2801 5.79L14.2901 5.77Z" fill="#667085"/>
+<path d="M16.5302 0.919922C16.2702 0.919922 16.0502 0.999922 15.9002 1.14992C15.7502 1.29992 15.6702 1.47992 15.6702 1.68992C15.6702 1.87992 15.7302 2.04992 15.8602 2.18992C15.9902 2.31992 16.1802 2.38992 16.4102 2.38992C16.6702 2.38992 16.8902 2.30992 17.0302 2.15992C17.1802 1.99992 17.2502 1.81992 17.2502 1.60992C17.2502 1.42992 17.1802 1.25992 17.0502 1.12992C16.9202 0.989922 16.7402 0.919922 16.5202 0.919922H16.5302Z" fill="#667085"/>
+<path d="M23.1802 8.51001C23.0702 8.00001 23.0202 7.40001 23.0202 6.73001C23.0202 6.57001 23.0202 6.26001 23.0402 5.83001C23.0602 5.38001 23.0702 5.06001 23.0702 4.88001C23.0702 4.20001 22.8602 3.71001 22.4502 3.43001C22.0402 3.15001 21.4702 3.01001 20.7302 3.01001C19.9402 3.01001 19.2302 3.09001 18.6102 3.25001H18.5602L18.4302 4.20001L18.5502 4.17001C19.1602 4.03001 19.7802 3.96001 20.4102 3.96001C20.9302 3.96001 21.3202 4.03001 21.5702 4.18001C21.8102 4.31001 21.9302 4.59001 21.9302 5.01001C21.9302 5.09001 21.9302 5.16001 21.9302 5.23001C20.5102 5.25001 19.5602 5.44001 19.0302 5.79001C18.4802 6.15001 18.2002 6.63001 18.2002 7.23001C18.2002 7.72001 18.3802 8.10001 18.7402 8.36001C19.0902 8.62001 19.5102 8.75001 19.9902 8.75001C20.8202 8.75001 21.5002 8.55001 22.0102 8.17001C22.0102 8.30001 22.0402 8.44001 22.0802 8.58001L22.1002 8.64001L23.2202 8.60001L23.2002 8.50001L23.1802 8.51001ZM20.2802 6.18001C20.6502 6.08001 21.2002 6.03001 21.9102 6.03001C21.9102 6.45001 21.9202 6.92001 21.9402 7.42001C21.5602 7.69001 21.0502 7.83001 20.4302 7.83001C19.7002 7.83001 19.3502 7.61001 19.3502 7.16001C19.3502 6.68001 19.6602 6.36001 20.2802 6.18001Z" fill="#667085"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/knowledge-retrieval.svg b/app/components/base/icons/assets/vender/workflow/knowledge-retrieval.svg
new file mode 100644
index 0000000..e721f9d
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/knowledge-retrieval.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="icons/knowledge-retrieval">
+<path id="Vector (Stroke)" fill-rule="evenodd" clip-rule="evenodd" d="M3.78528 2.62834C3.78527 2.62834 3.78528 2.62834 3.78528 2.62834L8 3.56494L12.2147 2.62834C13.5158 2.33921 14.75 3.32924 14.75 4.66206V11.2637C14.75 12.2401 14.0718 13.0855 13.1187 13.2974L8.1627 14.3987C8.05554 14.4225 7.94446 14.4225 7.8373 14.3987L2.88139 13.2974C1.92824 13.0855 1.25 12.2401 1.25 11.2637V4.66206C1.25 3.32925 2.4842 2.33921 3.78528 2.62834ZM7.25 4.93487L3.45988 4.09262C3.09558 4.01166 2.75 4.28887 2.75 4.66206V11.2637C2.75 11.537 2.93986 11.7738 3.20679 11.8331C3.20678 11.8331 3.20681 11.8331 3.20679 11.8331L7.25 12.7316V4.93487ZM8.75 12.7316L12.7932 11.8331C13.0601 11.7738 13.25 11.537 13.25 11.2637V4.66206C13.25 4.28887 12.9044 4.01165 12.5401 4.09262L8.75 4.93487V12.7316Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/list-filter.svg b/app/components/base/icons/assets/vender/workflow/list-filter.svg
new file mode 100644
index 0000000..8b91e48
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/list-filter.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="filter">
+<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M2 4C2 2.89543 2.89543 2 4 2L12 2C13.1046 2 14 2.89544 14 4V4.78105C14 5.31148 13.7893 5.82019 13.4142 6.19528L10.1953 9.4142C10.0702 9.53925 10 9.70881 10 9.8856V12.8713C10 13.427 9.65528 13.9246 9.13482 14.1198C9.13479 14.1198 9.13476 14.1198 9.13473 14.1198L7.80153 14.6197C6.92984 14.9467 6 14.3022 6 13.3713L6 9.8856C6 9.70883 5.92978 9.53926 5.80474 9.4142C5.80473 9.4142 5.80473 9.4142 5.80472 9.41419L2.58579 6.19526L3.05004 5.73102L2.58579 6.19526C2.21071 5.82019 2 5.31148 2 4.78105V4ZM4 3.33333C3.63181 3.33333 3.33333 3.63181 3.33333 4L3.33333 4.78105C3.33333 4.95786 3.40357 5.12743 3.5286 5.25246L6.74754 8.47139L6.74756 8.47141C7.12262 8.84649 7.33333 9.35518 7.33333 9.8856L7.33333 13.3713L8.66665 12.8713L8.66667 12.8713L8.66667 9.8856C8.66667 9.35518 8.87737 8.84648 9.25246 8.4714L12.4714 5.25246L12.4714 5.25244C12.5964 5.12742 12.6667 4.95787 12.6667 4.78105V4C12.6667 3.6318 12.3682 3.33333 12 3.33333L4 3.33333Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/llm.svg b/app/components/base/icons/assets/vender/workflow/llm.svg
new file mode 100644
index 0000000..8a115cc
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/llm.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="icons/llm">
+<path id="Vector (Stroke)" fill-rule="evenodd" clip-rule="evenodd" d="M5.83333 2.40625C5.04971 2.40625 4.39011 2.94431 4.20689 3.67206C4.13982 3.93846 3.91391 4.1349 3.64078 4.16432C2.94692 4.23906 2.40625 4.82766 2.40625 5.54167C2.40625 5.92943 2.56471 6.27904 2.82212 6.53129C2.94807 6.65472 3.01905 6.82365 3.01905 7C3.01905 7.17635 2.94807 7.34528 2.82212 7.46871C2.56471 7.72096 2.40625 8.07057 2.40625 8.45833C2.40625 9.03652 2.76061 9.53347 3.26651 9.74092C3.45247 9.81717 3.59324 9.97444 3.64849 10.1677C3.8841 10.9917 4.64342 11.5938 5.54167 11.5938C5.82802 11.5938 6.09916 11.533 6.34375 11.4237V9.91667C6.34375 9.31258 5.85409 8.82292 5.25 8.82292C4.88756 8.82292 4.59375 8.5291 4.59375 8.16667C4.59375 7.80423 4.88756 7.51042 5.25 7.51042C5.64385 7.51042 6.0156 7.60503 6.34375 7.77278V2.48514C6.18319 2.43393 6.01183 2.40625 5.83333 2.40625ZM7.65625 2.48514V4.08333C7.65625 4.6874 8.14592 5.17708 8.75 5.17708C9.11244 5.17708 9.40625 5.4709 9.40625 5.83333C9.40625 6.19577 9.11244 6.48958 8.75 6.48958C8.35615 6.48958 7.9844 6.39496 7.65625 6.22722V11.4237C7.90087 11.533 8.17199 11.5938 8.45833 11.5938C9.35657 11.5938 10.1159 10.9917 10.3515 10.1677C10.4068 9.97444 10.5475 9.81717 10.7335 9.74092C11.2394 9.53347 11.5938 9.03652 11.5938 8.45833C11.5938 8.07056 11.4353 7.72096 11.1779 7.46871C11.0519 7.34528 10.981 7.17635 10.981 7C10.981 6.82365 11.0519 6.65472 11.1779 6.53129C11.4353 6.27904 11.5938 5.92944 11.5938 5.54167C11.5938 4.82766 11.0531 4.23906 10.3592 4.16432C10.0861 4.1349 9.86022 3.93847 9.79315 3.67208C9.6099 2.94432 8.95027 2.40625 8.16667 2.40625C7.98817 2.40625 7.81681 2.43393 7.65625 2.48514ZM7.00001 12.565C6.56031 12.7835 6.06472 12.9062 5.54167 12.9062C4.14996 12.9062 2.96198 12.0403 2.48457 10.8188C1.65595 10.3591 1.09375 9.47501 1.09375 8.45833C1.09375 7.9213 1.2511 7.42042 1.52161 7C1.2511 6.57958 1.09375 6.0787 1.09375 5.54167C1.09375 4.30153 1.93005 3.25742 3.06973 2.94157C3.51828 1.85715 4.586 1.09375 5.83333 1.09375C6.24643 1.09375 6.64104 1.17788 7 1.33013C7.35896 1.17788 7.75357 1.09375 8.16667 1.09375C9.41399 1.09375 10.4817 1.85716 10.9303 2.94157C12.0699 3.25742 12.9062 4.30153 12.9062 5.54167C12.9062 6.07869 12.7489 6.57958 12.4784 7C12.7489 7.42043 12.9062 7.92131 12.9062 8.45833C12.9062 9.47502 12.344 10.3591 11.5154 10.8188C11.038 12.0403 9.85003 12.9062 8.45833 12.9062C7.93526 12.9062 7.4397 12.7834 7.00001 12.565Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/loop-end.svg b/app/components/base/icons/assets/vender/workflow/loop-end.svg
new file mode 100644
index 0000000..cedacb9
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/loop-end.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="ongoing">
+<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M8 2.75C5.10051 2.75 2.75 5.10051 2.75 8C2.75 10.8995 5.1005 13.25 8 13.25C8.41421 13.25 8.75 13.5858 8.75 14C8.75 14.4142 8.41421 14.75 8 14.75C4.27208 14.75 1.25 11.7279 1.25 8C1.25 4.27208 4.27208 1.25 8 1.25C8.41421 1.25 8.75 1.58579 8.75 2C8.75 2.41421 8.41421 2.75 8 2.75ZM10.3508 2.42715C10.5582 2.06861 11.017 1.94608 11.3755 2.15349C11.9971 2.51301 12.5556 2.96859 13.0311 3.49984C13.3073 3.8085 13.281 4.28264 12.9724 4.55887C12.6637 4.8351 12.1896 4.80882 11.9133 4.50016C11.5429 4.08625 11.1079 3.73153 10.6245 3.4519C10.2659 3.2445 10.1434 2.7857 10.3508 2.42715ZM8.13634 5.46967C8.42923 5.17678 8.9041 5.17678 9.197 5.46967L11.197 7.46967C11.4899 7.76256 11.4899 8.23744 11.197 8.53033L9.197 10.5303C8.9041 10.8232 8.42923 10.8232 8.13634 10.5303C7.84344 10.2374 7.84344 9.76256 8.13634 9.46967L8.85601 8.75H5.33333C4.91912 8.75 4.58333 8.41421 4.58333 8C4.58333 7.58579 4.91912 7.25 5.33333 7.25H8.85601L8.13634 6.53033C7.84344 6.23744 7.84344 5.76256 8.13634 5.46967ZM13.7414 6.09691C14.1478 6.01676 14.5422 6.28123 14.6224 6.68762C14.7062 7.1128 14.75 7.55166 14.75 8C14.75 8.44834 14.7062 8.88721 14.6224 9.31234C14.5422 9.71872 14.1478 9.98318 13.7414 9.90302C13.335 9.82287 13.0706 9.42845 13.1507 9.02206C13.2158 8.69213 13.25 8.35046 13.25 8C13.25 7.64954 13.2158 7.30787 13.1507 6.97785C13.0706 6.57146 13.335 6.17705 13.7414 6.09691ZM12.9723 11.4411C13.281 11.7173 13.3073 12.1915 13.0311 12.5002C12.5556 13.0314 11.9971 13.487 11.3756 13.8465C11.017 14.0539 10.5582 13.9314 10.3508 13.5729C10.1434 13.2143 10.2659 12.7556 10.6244 12.5481C11.1079 12.2685 11.5429 11.9138 11.9133 11.4999C12.1895 11.1912 12.6637 11.1649 12.9723 11.4411Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/loop.svg b/app/components/base/icons/assets/vender/workflow/loop.svg
new file mode 100644
index 0000000..6692c4d
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/loop.svg
@@ -0,0 +1,5 @@
+<svg width="18" height="16" viewBox="0 0 18 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="loop">
+<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M2.02915 5.34506C3.50752 3.88498 5.9006 3.88498 7.37896 5.34506L8.99983 6.94588L10.6207 5.34506C12.0991 3.88499 14.4921 3.88498 15.9705 5.34506C17.454 6.81027 17.454 9.18971 15.9705 10.6549C14.4921 12.115 12.0991 12.115 10.6207 10.655L8.99983 9.05413L7.37896 10.655C5.9006 12.115 3.50753 12.115 2.02916 10.655C0.545627 9.18974 0.545611 6.81028 2.02915 5.34506ZM7.93251 8L6.32492 6.4123C5.4308 5.52924 3.97732 5.52923 3.08319 6.4123C2.19426 7.29026 2.19426 8.70975 3.0832 9.58772C3.97733 10.4708 5.4308 10.4707 6.32492 9.58771C6.32492 9.58772 6.32492 9.58771 6.32492 9.58771L7.93251 8ZM10.0671 8L11.6747 9.5877C11.6747 9.58769 11.6747 9.58771 11.6747 9.5877C12.5688 10.4707 14.0223 10.4707 14.9165 9.58773C15.8054 8.70975 15.8054 7.29024 14.9165 6.41229C14.0223 5.52923 12.5689 5.52924 11.6747 6.4123C11.6747 6.4123 11.6747 6.41229 11.6747 6.4123L10.0671 8Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/parameter-extractor.svg b/app/components/base/icons/assets/vender/workflow/parameter-extractor.svg
new file mode 100644
index 0000000..dc9418b
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/parameter-extractor.svg
@@ -0,0 +1,28 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="icons/parma-extractor">
+<path id="Vector" d="M7.58398 10.3543C7.58398 10.0322 7.84514 9.771 8.16732 9.771C8.48949 9.771 8.75065 10.0322 8.75065 10.3543C8.75065 10.6765 8.48949 10.9377 8.16732 10.9377C7.84514 10.9377 7.58398 10.6765 7.58398 10.3543Z" fill="white"/>
+<path id="Vector_2" d="M9.625 10.3543C9.625 10.0322 9.88616 9.771 10.2083 9.771C10.5305 9.771 10.7917 10.0322 10.7917 10.3543C10.7917 10.6765 10.5305 10.9377 10.2083 10.9377C9.88616 10.9377 9.625 10.6765 9.625 10.3543Z" fill="white"/>
+<path id="Vector_3" d="M7.58398 3.64583C7.58398 3.32366 7.84514 3.0625 8.16732 3.0625C8.48949 3.0625 8.75065 3.32366 8.75065 3.64583C8.75065 3.968 8.48949 4.22917 8.16732 4.22917C7.84514 4.22917 7.58398 3.968 7.58398 3.64583Z" fill="white"/>
+<path id="Vector_4" d="M7.72852 12.104C7.72852 11.8624 7.9244 11.6665 8.16602 11.6665C8.40763 11.6665 8.60352 11.8624 8.60352 12.104C8.60352 12.3456 8.40763 12.5415 8.16602 12.5415C7.9244 12.5415 7.72852 12.3456 7.72852 12.104Z" fill="white"/>
+<path id="Vector_5" d="M11.375 8.1665C11.375 7.92489 11.5709 7.729 11.8125 7.729C12.0541 7.729 12.25 7.92489 12.25 8.1665C12.25 8.40812 12.0541 8.604 11.8125 8.604C11.5709 8.604 11.375 8.40812 11.375 8.1665Z" fill="white"/>
+<path id="Vector_6" d="M11.375 5.8335C11.375 5.59187 11.5709 5.396 11.8125 5.396C12.0541 5.396 12.25 5.59187 12.25 5.8335C12.25 6.07511 12.0541 6.271 11.8125 6.271C11.5709 6.271 11.375 6.07511 11.375 5.8335Z" fill="white"/>
+<path id="Vector_7" d="M7.72852 1.896C7.72852 1.65437 7.9244 1.4585 8.16602 1.4585C8.40763 1.4585 8.60352 1.65437 8.60352 1.896C8.60352 2.13762 8.40763 2.3335 8.16602 2.3335C7.9244 2.3335 7.72852 2.13762 7.72852 1.896Z" fill="white"/>
+<path id="Vector_8" d="M7.29102 8.1665C7.29102 7.68327 7.68278 7.2915 8.16602 7.2915C8.64925 7.2915 9.04102 7.68327 9.04102 8.1665C9.04102 8.64974 8.64925 9.0415 8.16602 9.0415C7.68278 9.0415 7.29102 8.64974 7.29102 8.1665Z" fill="white"/>
+<path id="Vector_9" d="M7.29102 5.8335C7.29102 5.35025 7.68278 4.9585 8.16602 4.9585C8.64925 4.9585 9.04102 5.35025 9.04102 5.8335C9.04102 6.31673 8.64925 6.7085 8.16602 6.7085C7.68278 6.7085 7.29102 6.31673 7.29102 5.8335Z" fill="white"/>
+<path id="Vector_10" d="M9.625 8.16683C9.625 7.84465 9.88616 7.5835 10.2083 7.5835C10.5305 7.5835 10.7917 7.84465 10.7917 8.16683C10.7917 8.489 10.5305 8.75016 10.2083 8.75016C9.88616 8.75016 9.625 8.489 9.625 8.16683Z" fill="white"/>
+<path id="Vector_11" d="M9.625 5.83333C9.625 5.51116 9.88616 5.25 10.2083 5.25C10.5305 5.25 10.7917 5.51116 10.7917 5.83333C10.7917 6.15551 10.5305 6.41667 10.2083 6.41667C9.88616 6.41667 9.625 6.15551 9.625 5.83333Z" fill="white"/>
+<path id="Vector_12" d="M9.625 3.64583C9.625 3.32366 9.88616 3.0625 10.2083 3.0625C10.5305 3.0625 10.7917 3.32366 10.7917 3.64583C10.7917 3.968 10.5305 4.22917 10.2083 4.22917C9.88616 4.22917 9.625 3.968 9.625 3.64583Z" fill="white"/>
+<path id="Vector_13" d="M6.41667 3.64583C6.41667 3.968 6.15551 4.22917 5.83333 4.22917C5.51117 4.22917 5.25 3.968 5.25 3.64583C5.25 3.32367 5.51117 3.0625 5.83333 3.0625C6.15551 3.0625 6.41667 3.32367 6.41667 3.64583Z" fill="white"/>
+<path id="Vector_14" d="M4.37565 3.64583C4.37565 3.968 4.11448 4.22917 3.79232 4.22917C3.47015 4.22917 3.20898 3.968 3.20898 3.64583C3.20898 3.32367 3.47015 3.0625 3.79232 3.0625C4.11448 3.0625 4.37565 3.32367 4.37565 3.64583Z" fill="white"/>
+<path id="Vector_15" d="M6.41667 10.3543C6.41667 10.6765 6.15551 10.9377 5.83333 10.9377C5.51117 10.9377 5.25 10.6765 5.25 10.3543C5.25 10.0322 5.51117 9.771 5.83333 9.771C6.15551 9.771 6.41667 10.0322 6.41667 10.3543Z" fill="white"/>
+<path id="Vector_16" d="M6.27148 1.896C6.27148 2.13762 6.0756 2.3335 5.83398 2.3335C5.59236 2.3335 5.39648 2.13762 5.39648 1.896C5.39648 1.65437 5.59236 1.4585 5.83398 1.4585C6.0756 1.4585 6.27148 1.65437 6.27148 1.896Z" fill="white"/>
+<path id="Vector_17" d="M2.625 5.8335C2.625 6.07511 2.42912 6.271 2.1875 6.271C1.94588 6.271 1.75 6.07511 1.75 5.8335C1.75 5.59187 1.94588 5.396 2.1875 5.396C2.42912 5.396 2.625 5.59187 2.625 5.8335Z" fill="white"/>
+<path id="Vector_18" d="M2.625 8.1665C2.625 8.40812 2.42912 8.604 2.1875 8.604C1.94588 8.604 1.75 8.40812 1.75 8.1665C1.75 7.92489 1.94588 7.729 2.1875 7.729C2.42912 7.729 2.625 7.92489 2.625 8.1665Z" fill="white"/>
+<path id="Vector_19" d="M6.27148 12.104C6.27148 12.3456 6.0756 12.5415 5.83398 12.5415C5.59236 12.5415 5.39648 12.3456 5.39648 12.104C5.39648 11.8624 5.59236 11.6665 5.83398 11.6665C6.0756 11.6665 6.27148 11.8624 6.27148 12.104Z" fill="white"/>
+<path id="Vector_20" d="M6.70898 5.8335C6.70898 6.31673 6.31722 6.7085 5.83398 6.7085C5.35073 6.7085 4.95898 6.31673 4.95898 5.8335C4.95898 5.35025 5.35073 4.9585 5.83398 4.9585C6.31722 4.9585 6.70898 5.35025 6.70898 5.8335Z" fill="white"/>
+<path id="Vector_21" d="M6.70898 8.1665C6.70898 8.64974 6.31722 9.0415 5.83398 9.0415C5.35073 9.0415 4.95898 8.64974 4.95898 8.1665C4.95898 7.68327 5.35073 7.2915 5.83398 7.2915C6.31722 7.2915 6.70898 7.68327 6.70898 8.1665Z" fill="white"/>
+<path id="Vector_22" d="M4.37565 5.83333C4.37565 6.15551 4.11448 6.41667 3.79232 6.41667C3.47015 6.41667 3.20898 6.15551 3.20898 5.83333C3.20898 5.51117 3.47015 5.25 3.79232 5.25C4.11448 5.25 4.37565 5.51117 4.37565 5.83333Z" fill="white"/>
+<path id="Vector_23" d="M4.37565 8.16683C4.37565 8.489 4.11448 8.75016 3.79232 8.75016C3.47015 8.75016 3.20898 8.489 3.20898 8.16683C3.20898 7.84465 3.47015 7.5835 3.79232 7.5835C4.11448 7.5835 4.37565 7.84465 4.37565 8.16683Z" fill="white"/>
+<path id="Vector_24" d="M4.37565 10.3543C4.37565 10.6765 4.11448 10.9377 3.79232 10.9377C3.47015 10.9377 3.20898 10.6765 3.20898 10.3543C3.20898 10.0322 3.47015 9.771 3.79232 9.771C4.11448 9.771 4.37565 10.0322 4.37565 10.3543Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/question-classifier.svg b/app/components/base/icons/assets/vender/workflow/question-classifier.svg
new file mode 100644
index 0000000..6289cb9
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/question-classifier.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="icons/question-classifier">
+<path id="Vector (Stroke)" fill-rule="evenodd" clip-rule="evenodd" d="M6.34379 3.53597C6.34379 2.35003 7.45832 1.47985 8.60885 1.76749L10.9422 2.35082C11.7537 2.55369 12.323 3.28283 12.323 4.1193V9.88081C12.323 10.7173 11.7537 11.4464 10.9422 11.6493L8.60886 12.2326C7.45832 12.5203 6.34379 11.6501 6.34379 10.4641V3.53597ZM8.29052 3.0408C7.96836 2.96026 7.65629 3.20392 7.65629 3.53597V10.4641C7.65629 10.7962 7.96836 11.0399 8.29051 10.9593L10.6238 10.376C10.6238 10.376 10.6238 10.376 10.6238 10.376C10.8511 10.3192 11.0105 10.115 11.0105 9.88081V4.1193C11.0105 3.88509 10.851 3.68093 10.6239 3.62413L8.29052 3.0408ZM4.66671 2.26048C5.02914 2.26048 5.32296 2.5543 5.32296 2.91673V11.0834C5.32296 11.4458 5.02914 11.7397 4.66671 11.7397C4.30427 11.7397 4.01046 11.4458 4.01046 11.0834V2.91673C4.01046 2.5543 4.30427 2.26048 4.66671 2.26048ZM2.33337 2.84382C2.69581 2.84382 2.98962 3.13763 2.98962 3.50007V10.5001C2.98962 10.8625 2.69581 11.1563 2.33337 11.1563C1.97094 11.1563 1.67712 10.8625 1.67712 10.5001V3.50007C1.67712 3.13763 1.97094 2.84382 2.33337 2.84382Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/templating-transform.svg b/app/components/base/icons/assets/vender/workflow/templating-transform.svg
new file mode 100644
index 0000000..a7d88d6
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/templating-transform.svg
@@ -0,0 +1,19 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="icons/templating-transform">
+<g id="Vector">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M6.34375 1.75C6.34375 1.38756 6.63756 1.09375 7 1.09375C10.262 1.09375 12.9062 3.73807 12.9062 7C12.9062 10.262 10.262 12.9062 7 12.9062C6.63756 12.9062 6.34375 12.6124 6.34375 12.25V1.75Z" fill="white"/>
+<path d="M5.54167 3.64583C5.54167 3.968 5.2805 4.22917 4.95833 4.22917C4.63617 4.22917 4.375 3.968 4.375 3.64583C4.375 3.32367 4.63617 3.0625 4.95833 3.0625C5.2805 3.0625 5.54167 3.32367 5.54167 3.64583Z" fill="white"/>
+<path d="M3.5 3.64583C3.5 3.968 3.23883 4.22917 2.91667 4.22917C2.5945 4.22917 2.33333 3.968 2.33333 3.64583C2.33333 3.32367 2.5945 3.0625 2.91667 3.0625C3.23883 3.0625 3.5 3.32367 3.5 3.64583Z" fill="white"/>
+<path d="M5.54167 10.3542C5.54167 10.6763 5.2805 10.9375 4.95833 10.9375C4.63617 10.9375 4.375 10.6763 4.375 10.3542C4.375 10.032 4.63617 9.77083 4.95833 9.77083C5.2805 9.77083 5.54167 10.032 5.54167 10.3542Z" fill="white"/>
+<path d="M5.39583 1.89583C5.39583 2.13746 5.19996 2.33333 4.95833 2.33333C4.71671 2.33333 4.52083 2.13746 4.52083 1.89583C4.52083 1.65421 4.71671 1.45833 4.95833 1.45833C5.19996 1.45833 5.39583 1.65421 5.39583 1.89583Z" fill="white"/>
+<path d="M1.75 5.83333C1.75 6.07495 1.55412 6.27083 1.3125 6.27083C1.07088 6.27083 0.875 6.07495 0.875 5.83333C0.875 5.59171 1.07088 5.39583 1.3125 5.39583C1.55412 5.39583 1.75 5.59171 1.75 5.83333Z" fill="white"/>
+<path d="M1.75 8.16667C1.75 8.40828 1.55412 8.60417 1.3125 8.60417C1.07088 8.60417 0.875 8.40828 0.875 8.16667C0.875 7.92505 1.07088 7.72917 1.3125 7.72917C1.55412 7.72917 1.75 7.92505 1.75 8.16667Z" fill="white"/>
+<path d="M5.39583 12.1042C5.39583 12.3458 5.19996 12.5417 4.95833 12.5417C4.71671 12.5417 4.52083 12.3458 4.52083 12.1042C4.52083 11.8625 4.71671 11.6667 4.95833 11.6667C5.19996 11.6667 5.39583 11.8625 5.39583 12.1042Z" fill="white"/>
+<path d="M5.83333 5.83333C5.83333 6.31657 5.44158 6.70833 4.95833 6.70833C4.47508 6.70833 4.08333 6.31657 4.08333 5.83333C4.08333 5.35008 4.47508 4.95833 4.95833 4.95833C5.44158 4.95833 5.83333 5.35008 5.83333 5.83333Z" fill="white"/>
+<path d="M5.83333 8.16667C5.83333 8.6499 5.44158 9.04167 4.95833 9.04167C4.47508 9.04167 4.08333 8.6499 4.08333 8.16667C4.08333 7.68343 4.47508 7.29167 4.95833 7.29167C5.44158 7.29167 5.83333 7.68343 5.83333 8.16667Z" fill="white"/>
+<path d="M3.5 5.83333C3.5 6.15551 3.23883 6.41667 2.91667 6.41667C2.5945 6.41667 2.33333 6.15551 2.33333 5.83333C2.33333 5.51117 2.5945 5.25 2.91667 5.25C3.23883 5.25 3.5 5.51117 3.5 5.83333Z" fill="white"/>
+<path d="M3.5 8.16667C3.5 8.48884 3.23883 8.75 2.91667 8.75C2.5945 8.75 2.33333 8.48884 2.33333 8.16667C2.33333 7.84449 2.5945 7.58333 2.91667 7.58333C3.23883 7.58333 3.5 7.84449 3.5 8.16667Z" fill="white"/>
+<path d="M3.5 10.3542C3.5 10.6763 3.23883 10.9375 2.91667 10.9375C2.5945 10.9375 2.33333 10.6763 2.33333 10.3542C2.33333 10.032 2.5945 9.77083 2.91667 9.77083C3.23883 9.77083 3.5 10.032 3.5 10.3542Z" fill="white"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/base/icons/assets/vender/workflow/variable-x.svg b/app/components/base/icons/assets/vender/workflow/variable-x.svg
new file mode 100644
index 0000000..d87ea61
--- /dev/null
+++ b/app/components/base/icons/assets/vender/workflow/variable-x.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="icons/variable-x">
+<path id="Icon (Stroke)" fill-rule="evenodd" clip-rule="evenodd" d="M0.714375 3.42875C0.714375 2.22516 1.68954 1.25 2.89313 1.25C3.30734 1.25 3.64313 1.58579 3.64313 2C3.64313 2.41421 3.30734 2.75 2.89313 2.75C2.51796 2.75 2.21438 3.05359 2.21438 3.42875V6.28563C2.21438 6.48454 2.13536 6.6753 1.9947 6.81596L1.81066 7L1.9947 7.18404C2.13536 7.3247 2.21438 7.51546 2.21438 7.71437V10.5713C2.21438 10.9464 2.51796 11.25 2.89313 11.25C3.30734 11.25 3.64313 11.5858 3.64313 12C3.64313 12.4142 3.30734 12.75 2.89313 12.75C1.68954 12.75 0.714375 11.7748 0.714375 10.5713V8.02503L0.21967 7.53033C0.0790176 7.38968 0 7.19891 0 7C0 6.80109 0.0790176 6.61032 0.21967 6.46967L0.714375 5.97497V3.42875ZM10.3568 2C10.3568 1.58579 10.6925 1.25 11.1068 1.25C12.3103 1.25 13.2855 2.22516 13.2855 3.42875V5.97497L13.7802 6.46967C13.9209 6.61032 13.9999 6.80109 13.9999 7C13.9999 7.19891 13.9209 7.38968 13.7802 7.53033L13.2855 8.02503V10.5713C13.2855 11.7751 12.3095 12.75 11.1068 12.75C10.6925 12.75 10.3568 12.4142 10.3568 12C10.3568 11.5858 10.6925 11.25 11.1068 11.25C11.4815 11.25 11.7855 10.9462 11.7855 10.5713V7.71437C11.7855 7.51546 11.8645 7.3247 12.0052 7.18404L12.1892 7L12.0052 6.81596C11.8645 6.6753 11.7855 6.48454 11.7855 6.28563V3.42875C11.7855 3.05359 11.4819 2.75 11.1068 2.75C10.6925 2.75 10.3568 2.41421 10.3568 2ZM4.59467 4.59467C4.88756 4.30178 5.36244 4.30178 5.65533 4.59467L7 5.93934L8.34467 4.59467C8.63756 4.30178 9.11244 4.30178 9.40533 4.59467C9.69822 4.88756 9.69822 5.36244 9.40533 5.65533L8.06066 7L9.40533 8.34467C9.69822 8.63756 9.69822 9.11244 9.40533 9.40533C9.11244 9.69822 8.63756 9.69822 8.34467 9.40533L7 8.06066L5.65533 9.40533C5.36244 9.69822 4.88756 9.69822 4.59467 9.40533C4.30178 9.11244 4.30178 8.63756 4.59467 8.34467L5.93934 7L4.59467 5.65533C4.30178 5.36244 4.30178 4.88756 4.59467 4.59467Z" fill="white"/>
+</g>
+</svg>
diff --git a/app/components/base/icons/script.mjs b/app/components/base/icons/script.mjs
new file mode 100644
index 0000000..7f9d7b7
--- /dev/null
+++ b/app/components/base/icons/script.mjs
@@ -0,0 +1,174 @@
+import path from 'node:path'
+import { access, appendFile, mkdir, open, readdir, rm, writeFile } from 'node:fs/promises'
+import { fileURLToPath } from 'node:url'
+import { parseXml } from '@rgrove/parse-xml'
+import { camelCase, template } from 'lodash-es'
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url))
+
+const generateDir = async (currentPath) => {
+  try {
+    await mkdir(currentPath, { recursive: true })
+  }
+  catch (err) {
+    console.error(err.message)
+  }
+}
+const processSvgStructure = (svgStructure, replaceFillOrStrokeColor) => {
+  if (svgStructure?.children.length) {
+    svgStructure.children = svgStructure.children.filter(c => c.type !== 'text')
+
+    svgStructure.children.forEach((child) => {
+      if (child?.name === 'path' && replaceFillOrStrokeColor) {
+        if (child?.attributes?.stroke)
+          child.attributes.stroke = 'currentColor'
+
+        if (child?.attributes.fill)
+          child.attributes.fill = 'currentColor'
+      }
+      if (child?.children.length)
+        processSvgStructure(child, replaceFillOrStrokeColor)
+    })
+  }
+}
+const generateSvgComponent = async (fileHandle, entry, pathList, replaceFillOrStrokeColor) => {
+  const currentPath = path.resolve(__dirname, 'src', ...pathList.slice(2))
+
+  try {
+    await access(currentPath)
+  }
+  catch {
+    await generateDir(currentPath)
+  }
+
+  const svgString = await fileHandle.readFile({ encoding: 'utf8' })
+  const svgJson = parseXml(svgString).toJSON()
+  const svgStructure = svgJson.children[0]
+  processSvgStructure(svgStructure, replaceFillOrStrokeColor)
+  const prefixFileName = camelCase(entry.split('.')[0])
+  const fileName = prefixFileName.charAt(0).toUpperCase() + prefixFileName.slice(1)
+  const svgData = {
+    icon: svgStructure,
+    name: fileName,
+  }
+
+  const componentRender = template(`
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './<%= svgName %>.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = '<%= svgName %>'
+
+export default Icon
+`.trim())
+
+  await writeFile(path.resolve(currentPath, `${fileName}.json`), JSON.stringify(svgData, '', '\t'))
+  await writeFile(path.resolve(currentPath, `${fileName}.tsx`), `${componentRender({ svgName: fileName })}\n`)
+
+  const indexingRender = template(`
+export { default as <%= svgName %> } from './<%= svgName %>'
+`.trim())
+
+  await appendFile(path.resolve(currentPath, 'index.ts'), `${indexingRender({ svgName: fileName })}\n`)
+}
+
+const generateImageComponent = async (entry, pathList) => {
+  const currentPath = path.resolve(__dirname, 'src', ...pathList.slice(2))
+
+  try {
+    await access(currentPath)
+  }
+  catch {
+    await generateDir(currentPath)
+  }
+
+  const prefixFileName = camelCase(entry.split('.')[0])
+  const fileName = prefixFileName.charAt(0).toUpperCase() + prefixFileName.slice(1)
+
+  const componentCSSRender = template(`
+.wrapper {
+  display: inline-flex;
+  background: url(<%= assetPath %>) center center no-repeat;
+  background-size: contain;
+}
+`.trim())
+
+  await writeFile(path.resolve(currentPath, `${fileName}.module.css`), `${componentCSSRender({ assetPath: path.posix.join('~@/app/components/base/icons/assets', ...pathList.slice(2), entry) })}\n`)
+
+  const componentRender = template(`
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import cn from '@/utils/classnames'
+import s from './<%= fileName %>.module.css'
+
+const Icon = (
+  {
+    ref,
+    className,
+    ...restProps
+  }: React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement> & {
+    ref?: React.RefObject<HTMLSpanElement>;
+  },
+) => <span className={cn(s.wrapper, className)} {...restProps} ref={ref} />
+
+Icon.displayName = '<%= fileName %>'
+
+export default Icon
+`.trim())
+
+  await writeFile(path.resolve(currentPath, `${fileName}.tsx`), `${componentRender({ fileName })}\n`)
+
+  const indexingRender = template(`
+export { default as <%= fileName %> } from './<%= fileName %>'
+`.trim())
+
+  await appendFile(path.resolve(currentPath, 'index.ts'), `${indexingRender({ fileName })}\n`)
+}
+
+const walk = async (entry, pathList, replaceFillOrStrokeColor) => {
+  const currentPath = path.resolve(...pathList, entry)
+  let fileHandle
+
+  try {
+    fileHandle = await open(currentPath)
+    const stat = await fileHandle.stat()
+
+    if (stat.isDirectory()) {
+      const files = await readdir(currentPath)
+
+      for (const file of files)
+        await walk(file, [...pathList, entry], replaceFillOrStrokeColor)
+    }
+
+    if (stat.isFile() && /.+\.svg$/g.test(entry))
+      await generateSvgComponent(fileHandle, entry, pathList, replaceFillOrStrokeColor)
+
+    if (stat.isFile() && /.+\.png$/g.test(entry))
+      await generateImageComponent(entry, pathList)
+  }
+  finally {
+    fileHandle?.close()
+  }
+}
+
+(async () => {
+  await rm(path.resolve(__dirname, 'src'), { recursive: true, force: true })
+  await walk('public', [__dirname, 'assets'])
+  await walk('vender', [__dirname, 'assets'], true)
+  await walk('image', [__dirname, 'assets'])
+})()
diff --git a/app/components/base/icons/src/image/llm/BaichuanTextCn.module.css b/app/components/base/icons/src/image/llm/BaichuanTextCn.module.css
new file mode 100644
index 0000000..97ab9b2
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/BaichuanTextCn.module.css
@@ -0,0 +1,5 @@
+.wrapper {
+  display: inline-flex;
+  background: url(~@/app/components/base/icons/assets/image/llm/baichuan-text-cn.png) center center no-repeat;
+  background-size: contain;
+}
diff --git a/app/components/base/icons/src/image/llm/BaichuanTextCn.tsx b/app/components/base/icons/src/image/llm/BaichuanTextCn.tsx
new file mode 100644
index 0000000..be9a407
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/BaichuanTextCn.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import cn from '@/utils/classnames'
+import s from './BaichuanTextCn.module.css'
+
+const Icon = (
+  {
+    ref,
+    className,
+    ...restProps
+  }: React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement> & {
+    ref?: React.RefObject<HTMLSpanElement>;
+  },
+) => <span className={cn(s.wrapper, className)} {...restProps} ref={ref} />
+
+Icon.displayName = 'BaichuanTextCn'
+
+export default Icon
diff --git a/app/components/base/icons/src/image/llm/Minimax.module.css b/app/components/base/icons/src/image/llm/Minimax.module.css
new file mode 100644
index 0000000..551ecc3
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/Minimax.module.css
@@ -0,0 +1,5 @@
+.wrapper {
+  display: inline-flex;
+  background: url(~@/app/components/base/icons/assets/image/llm/minimax.png) center center no-repeat;
+  background-size: contain;
+}
diff --git a/app/components/base/icons/src/image/llm/Minimax.tsx b/app/components/base/icons/src/image/llm/Minimax.tsx
new file mode 100644
index 0000000..7df7e3f
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/Minimax.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import cn from '@/utils/classnames'
+import s from './Minimax.module.css'
+
+const Icon = (
+  {
+    ref,
+    className,
+    ...restProps
+  }: React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement> & {
+    ref?: React.RefObject<HTMLSpanElement>;
+  },
+) => <span className={cn(s.wrapper, className)} {...restProps} ref={ref} />
+
+Icon.displayName = 'Minimax'
+
+export default Icon
diff --git a/app/components/base/icons/src/image/llm/MinimaxText.module.css b/app/components/base/icons/src/image/llm/MinimaxText.module.css
new file mode 100644
index 0000000..a63be49
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/MinimaxText.module.css
@@ -0,0 +1,5 @@
+.wrapper {
+  display: inline-flex;
+  background: url(~@/app/components/base/icons/assets/image/llm/minimax-text.png) center center no-repeat;
+  background-size: contain;
+}
diff --git a/app/components/base/icons/src/image/llm/MinimaxText.tsx b/app/components/base/icons/src/image/llm/MinimaxText.tsx
new file mode 100644
index 0000000..840e8cb
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/MinimaxText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import cn from '@/utils/classnames'
+import s from './MinimaxText.module.css'
+
+const Icon = (
+  {
+    ref,
+    className,
+    ...restProps
+  }: React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement> & {
+    ref?: React.RefObject<HTMLSpanElement>;
+  },
+) => <span className={cn(s.wrapper, className)} {...restProps} ref={ref} />
+
+Icon.displayName = 'MinimaxText'
+
+export default Icon
diff --git a/app/components/base/icons/src/image/llm/Tongyi.module.css b/app/components/base/icons/src/image/llm/Tongyi.module.css
new file mode 100644
index 0000000..3ca4407
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/Tongyi.module.css
@@ -0,0 +1,5 @@
+.wrapper {
+  display: inline-flex;
+  background: url(~@/app/components/base/icons/assets/image/llm/tongyi.png) center center no-repeat;
+  background-size: contain;
+}
diff --git a/app/components/base/icons/src/image/llm/Tongyi.tsx b/app/components/base/icons/src/image/llm/Tongyi.tsx
new file mode 100644
index 0000000..2f62f1a
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/Tongyi.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import cn from '@/utils/classnames'
+import s from './Tongyi.module.css'
+
+const Icon = (
+  {
+    ref,
+    className,
+    ...restProps
+  }: React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement> & {
+    ref?: React.RefObject<HTMLSpanElement>;
+  },
+) => <span className={cn(s.wrapper, className)} {...restProps} ref={ref} />
+
+Icon.displayName = 'Tongyi'
+
+export default Icon
diff --git a/app/components/base/icons/src/image/llm/TongyiText.module.css b/app/components/base/icons/src/image/llm/TongyiText.module.css
new file mode 100644
index 0000000..f713671
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/TongyiText.module.css
@@ -0,0 +1,5 @@
+.wrapper {
+  display: inline-flex;
+  background: url(~@/app/components/base/icons/assets/image/llm/tongyi-text.png) center center no-repeat;
+  background-size: contain;
+}
diff --git a/app/components/base/icons/src/image/llm/TongyiText.tsx b/app/components/base/icons/src/image/llm/TongyiText.tsx
new file mode 100644
index 0000000..a52f63c
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/TongyiText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import cn from '@/utils/classnames'
+import s from './TongyiText.module.css'
+
+const Icon = (
+  {
+    ref,
+    className,
+    ...restProps
+  }: React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement> & {
+    ref?: React.RefObject<HTMLSpanElement>;
+  },
+) => <span className={cn(s.wrapper, className)} {...restProps} ref={ref} />
+
+Icon.displayName = 'TongyiText'
+
+export default Icon
diff --git a/app/components/base/icons/src/image/llm/TongyiTextCn.module.css b/app/components/base/icons/src/image/llm/TongyiTextCn.module.css
new file mode 100644
index 0000000..d07e6e8
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/TongyiTextCn.module.css
@@ -0,0 +1,5 @@
+.wrapper {
+  display: inline-flex;
+  background: url(~@/app/components/base/icons/assets/image/llm/tongyi-text-cn.png) center center no-repeat;
+  background-size: contain;
+}
diff --git a/app/components/base/icons/src/image/llm/TongyiTextCn.tsx b/app/components/base/icons/src/image/llm/TongyiTextCn.tsx
new file mode 100644
index 0000000..c982c73
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/TongyiTextCn.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import cn from '@/utils/classnames'
+import s from './TongyiTextCn.module.css'
+
+const Icon = (
+  {
+    ref,
+    className,
+    ...restProps
+  }: React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement> & {
+    ref?: React.RefObject<HTMLSpanElement>;
+  },
+) => <span className={cn(s.wrapper, className)} {...restProps} ref={ref} />
+
+Icon.displayName = 'TongyiTextCn'
+
+export default Icon
diff --git a/app/components/base/icons/src/image/llm/Wxyy.module.css b/app/components/base/icons/src/image/llm/Wxyy.module.css
new file mode 100644
index 0000000..44344a4
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/Wxyy.module.css
@@ -0,0 +1,5 @@
+.wrapper {
+  display: inline-flex;
+  background: url(~@/app/components/base/icons/assets/image/llm/wxyy.png) center center no-repeat;
+  background-size: contain;
+}
diff --git a/app/components/base/icons/src/image/llm/Wxyy.tsx b/app/components/base/icons/src/image/llm/Wxyy.tsx
new file mode 100644
index 0000000..a3c4948
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/Wxyy.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import cn from '@/utils/classnames'
+import s from './Wxyy.module.css'
+
+const Icon = (
+  {
+    ref,
+    className,
+    ...restProps
+  }: React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement> & {
+    ref?: React.RefObject<HTMLSpanElement>;
+  },
+) => <span className={cn(s.wrapper, className)} {...restProps} ref={ref} />
+
+Icon.displayName = 'Wxyy'
+
+export default Icon
diff --git a/app/components/base/icons/src/image/llm/WxyyText.module.css b/app/components/base/icons/src/image/llm/WxyyText.module.css
new file mode 100644
index 0000000..58a0c62
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/WxyyText.module.css
@@ -0,0 +1,5 @@
+.wrapper {
+  display: inline-flex;
+  background: url(~@/app/components/base/icons/assets/image/llm/wxyy-text.png) center center no-repeat;
+  background-size: contain;
+}
diff --git a/app/components/base/icons/src/image/llm/WxyyText.tsx b/app/components/base/icons/src/image/llm/WxyyText.tsx
new file mode 100644
index 0000000..e5dd6e8
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/WxyyText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import cn from '@/utils/classnames'
+import s from './WxyyText.module.css'
+
+const Icon = (
+  {
+    ref,
+    className,
+    ...restProps
+  }: React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement> & {
+    ref?: React.RefObject<HTMLSpanElement>;
+  },
+) => <span className={cn(s.wrapper, className)} {...restProps} ref={ref} />
+
+Icon.displayName = 'WxyyText'
+
+export default Icon
diff --git a/app/components/base/icons/src/image/llm/WxyyTextCn.module.css b/app/components/base/icons/src/image/llm/WxyyTextCn.module.css
new file mode 100644
index 0000000..fb5839a
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/WxyyTextCn.module.css
@@ -0,0 +1,5 @@
+.wrapper {
+  display: inline-flex;
+  background: url(~@/app/components/base/icons/assets/image/llm/wxyy-text-cn.png) center center no-repeat;
+  background-size: contain;
+}
diff --git a/app/components/base/icons/src/image/llm/WxyyTextCn.tsx b/app/components/base/icons/src/image/llm/WxyyTextCn.tsx
new file mode 100644
index 0000000..32108ad
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/WxyyTextCn.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import cn from '@/utils/classnames'
+import s from './WxyyTextCn.module.css'
+
+const Icon = (
+  {
+    ref,
+    className,
+    ...restProps
+  }: React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement> & {
+    ref?: React.RefObject<HTMLSpanElement>;
+  },
+) => <span className={cn(s.wrapper, className)} {...restProps} ref={ref} />
+
+Icon.displayName = 'WxyyTextCn'
+
+export default Icon
diff --git a/app/components/base/icons/src/image/llm/index.ts b/app/components/base/icons/src/image/llm/index.ts
new file mode 100644
index 0000000..3a4e64a
--- /dev/null
+++ b/app/components/base/icons/src/image/llm/index.ts
@@ -0,0 +1,9 @@
+export { default as BaichuanTextCn } from './BaichuanTextCn'
+export { default as MinimaxText } from './MinimaxText'
+export { default as Minimax } from './Minimax'
+export { default as TongyiTextCn } from './TongyiTextCn'
+export { default as TongyiText } from './TongyiText'
+export { default as Tongyi } from './Tongyi'
+export { default as WxyyTextCn } from './WxyyTextCn'
+export { default as WxyyText } from './WxyyText'
+export { default as Wxyy } from './Wxyy'
diff --git a/app/components/base/icons/src/public/avatar/Robot.json b/app/components/base/icons/src/public/avatar/Robot.json
new file mode 100644
index 0000000..8969a2a
--- /dev/null
+++ b/app/components/base/icons/src/public/avatar/Robot.json
@@ -0,0 +1,92 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg",
+			"xmlns:xlink": "http://www.w3.org/1999/xlink"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"width": "24",
+					"height": "24",
+					"rx": "12",
+					"fill": "#D5F5F6"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"x": "0.25",
+					"y": "0.25",
+					"width": "23.5",
+					"height": "23.5",
+					"rx": "11.75",
+					"stroke": "black",
+					"stroke-opacity": "0.05",
+					"stroke-width": "0.5"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M4 20.12H20V4.12H4V20.12Z",
+					"fill": "url(#pattern0)"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "pattern",
+						"attributes": {
+							"id": "pattern0",
+							"patternContentUnits": "objectBoundingBox",
+							"width": "1",
+							"height": "1"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "use",
+								"attributes": {
+									"xlink:href": "#image0_13843_72627",
+									"transform": "scale(0.00625)"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "image",
+						"attributes": {
+							"id": "image0_13843_72627",
+							"width": "160",
+							"height": "160",
+							"xlink:href": "data:image/png;base64,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"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Robot"
+}
diff --git a/app/components/base/icons/src/public/avatar/Robot.tsx b/app/components/base/icons/src/public/avatar/Robot.tsx
new file mode 100644
index 0000000..8bee6e2
--- /dev/null
+++ b/app/components/base/icons/src/public/avatar/Robot.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Robot.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Robot'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/avatar/User.json b/app/components/base/icons/src/public/avatar/User.json
new file mode 100644
index 0000000..4b9ad76
--- /dev/null
+++ b/app/components/base/icons/src/public/avatar/User.json
@@ -0,0 +1,89 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "512",
+			"height": "512",
+			"viewBox": "0 0 512 512",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_5968_39205)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "rect",
+						"attributes": {
+							"width": "512",
+							"height": "512",
+							"rx": "256",
+							"fill": "#B2DDFF"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "circle",
+						"attributes": {
+							"opacity": "0.68",
+							"cx": "256",
+							"cy": "196",
+							"r": "84",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "ellipse",
+						"attributes": {
+							"opacity": "0.68",
+							"cx": "256",
+							"cy": "583.5",
+							"rx": "266",
+							"ry": "274.5",
+							"fill": "white"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_5968_39205"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "512",
+									"height": "512",
+									"rx": "256",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "User"
+}
diff --git a/app/components/base/icons/src/public/avatar/User.tsx b/app/components/base/icons/src/public/avatar/User.tsx
new file mode 100644
index 0000000..c7af428
--- /dev/null
+++ b/app/components/base/icons/src/public/avatar/User.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './User.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'User'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/avatar/index.ts b/app/components/base/icons/src/public/avatar/index.ts
new file mode 100644
index 0000000..7355b6b
--- /dev/null
+++ b/app/components/base/icons/src/public/avatar/index.ts
@@ -0,0 +1,2 @@
+export { default as Robot } from './Robot'
+export { default as User } from './User'
diff --git a/app/components/base/icons/src/public/billing/ArCube1.json b/app/components/base/icons/src/public/billing/ArCube1.json
new file mode 100644
index 0000000..89d9786
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/ArCube1.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "28",
+			"height": "28",
+			"viewBox": "0 0 28 28",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M14.0002 14V23.9166M14.0002 14L5.25 9.07806M14.0002 14L22.4731 9.2338M23.625 9.95052V18.0493C23.625 18.8924 23.1703 19.6697 22.4356 20.0831L15.1439 24.1846C14.4336 24.5842 13.5663 24.5842 12.8561 24.1846L5.56439 20.0831C4.82967 19.6697 4.375 18.8924 4.375 18.0493V9.95052C4.375 9.10756 4.82967 8.33012 5.56439 7.91684L12.8561 3.81529C13.5663 3.41574 14.4336 3.41574 15.1439 3.81529L22.4356 7.91684C23.1703 8.33012 23.625 9.10756 23.625 9.95052Z",
+					"stroke": "#101828",
+					"stroke-width": "1.5",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "ArCube1"
+}
diff --git a/app/components/base/icons/src/public/billing/ArCube1.tsx b/app/components/base/icons/src/public/billing/ArCube1.tsx
new file mode 100644
index 0000000..dfd3c41
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/ArCube1.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ArCube1.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ArCube1'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/billing/Asterisk.json b/app/components/base/icons/src/public/billing/Asterisk.json
new file mode 100644
index 0000000..d4a2e91
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/Asterisk.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "28",
+			"height": "28",
+			"viewBox": "0 0 28 28",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "asterisk"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M14.0033 3.20837V24.7917M4.65747 8.60421L23.3492 19.3959M4.6586 19.3959L23.3503 8.60421",
+							"stroke": "#101828",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Asterisk"
+}
diff --git a/app/components/base/icons/src/public/billing/Asterisk.tsx b/app/components/base/icons/src/public/billing/Asterisk.tsx
new file mode 100644
index 0000000..71b778b
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/Asterisk.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Asterisk.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Asterisk'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/billing/AwsMarketplace.json b/app/components/base/icons/src/public/billing/AwsMarketplace.json
new file mode 100644
index 0000000..8aeb93f
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/AwsMarketplace.json
@@ -0,0 +1,179 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "126",
+			"height": "24",
+			"viewBox": "0 0 126 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_394_42756)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M47.3963 14.5593V8.71609C47.3963 8.14631 47.2869 7.73413 47.0682 7.45531C46.8494 7.1886 46.5091 7.04313 46.0473 7.04313C45.2209 7.04313 44.3824 7.29771 43.5438 7.80687C43.556 7.89173 43.556 7.97659 43.556 8.06145C43.556 8.14631 43.556 8.2433 43.556 8.32816V14.5351H41.8667V8.69184C41.8667 8.12207 41.7573 7.70989 41.5386 7.43106C41.3198 7.16436 40.9795 7.01888 40.5177 7.01888C39.6549 7.01888 38.8284 7.27346 38.0385 7.7705V14.523H36.3492V5.9157H37.759L37.9291 6.77642C39.0229 6.0248 40.0802 5.66112 41.1132 5.66112C42.1705 5.66112 42.8875 6.06117 43.2521 6.86128C44.3702 6.06117 45.5004 5.66112 46.6185 5.66112C47.3963 5.66112 48.004 5.87933 48.4172 6.32788C48.8425 6.7643 49.0491 7.39469 49.0491 8.20693V14.523H47.3963V14.5593Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M56.0492 14.5593L55.9156 13.6744C55.5023 14.0259 55.0527 14.2926 54.5666 14.4866C54.0683 14.6806 53.5822 14.7775 53.0961 14.7775C52.294 14.7775 51.6498 14.5472 51.1637 14.0865C50.6776 13.6259 50.4346 13.0197 50.4346 12.2439C50.4346 11.4195 50.7262 10.7527 51.3217 10.2678C51.9172 9.77078 52.7072 9.52832 53.7037 9.52832C54.36 9.52832 55.077 9.62531 55.8426 9.81927V8.70397C55.8426 8.09782 55.709 7.6614 55.4294 7.41894C55.1499 7.16436 54.6759 7.04313 54.0075 7.04313C53.0474 7.04313 52.0509 7.21285 51.0179 7.56441V6.37637C51.4311 6.15816 51.9294 6.00056 52.5127 5.87933C53.1082 5.7581 53.7037 5.69749 54.2992 5.69749C55.3808 5.69749 56.1708 5.9157 56.6812 6.36425C57.1916 6.81279 57.4468 7.49168 57.4468 8.41302V14.5593H56.0492ZM53.4971 13.5046C54.2627 13.5046 55.0527 13.2137 55.8426 12.6439V10.9103C55.2471 10.7649 54.6516 10.6921 54.044 10.6921C52.7679 10.6921 52.1238 11.1892 52.1238 12.1711C52.1238 12.5954 52.2453 12.9349 52.4763 13.1652C52.7193 13.3834 53.0596 13.5046 53.4971 13.5046Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M59.3792 14.5593V5.95207H60.7889L60.9712 7.22497C61.2872 6.88553 61.5788 6.61883 61.8584 6.43698C62.1379 6.25514 62.4053 6.10966 62.6969 6.0248C62.9764 5.93994 63.2924 5.89145 63.6206 5.89145C63.8393 5.89145 64.0702 5.90357 64.3133 5.93994V7.46743C63.9487 7.41894 63.6449 7.39469 63.3896 7.39469C62.4782 7.39469 61.7004 7.6614 61.0563 8.20693V14.5593H59.3792Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M65.3584 14.5593V2H67.0477V9.71017L70.7057 5.96419H72.7596L68.6762 10.0496L73.027 14.5593H70.9002L67.0355 10.486V14.5593H65.3584Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M74.5704 10.6194C74.5947 11.5892 74.8378 12.3166 75.2996 12.7773C75.7614 13.2379 76.4663 13.4683 77.4385 13.4683C78.3378 13.4683 79.2493 13.2985 80.1729 12.947V14.1472C79.3587 14.5836 78.3621 14.8139 77.1833 14.8139C75.7857 14.8139 74.7284 14.426 74.0235 13.6622C73.3065 12.8985 72.954 11.7589 72.954 10.2557C72.954 8.81307 73.3065 7.69776 74.0235 6.90978C74.7405 6.12179 75.7371 5.70961 77.0131 5.70961C78.0948 5.70961 78.9212 6.01268 79.4924 6.61883C80.0757 7.22497 80.3552 8.0857 80.3552 9.18888C80.3552 9.72229 80.3066 10.2072 80.2215 10.6315H74.5704V10.6194ZM76.9159 6.97039C76.1989 6.97039 75.6399 7.1886 75.251 7.60078C74.8499 8.02508 74.6312 8.65547 74.5704 9.49195H78.8118C78.824 9.40709 78.824 9.2495 78.824 9.05553C78.824 8.36452 78.666 7.84324 78.3379 7.49168C78.0219 7.15223 77.5479 6.97039 76.9159 6.97039Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M86.9421 14.3532C86.3831 14.5715 85.7511 14.6806 85.0584 14.6806C83.4421 14.6806 82.64 13.8804 82.64 12.2681V7.27346H81.0722V6.1824L82.6886 5.97631L82.9438 3.52749H84.3171V5.93994H86.8692V7.26134H84.3171V12.1832C84.3171 12.6075 84.4143 12.8985 84.5966 13.0682C84.7789 13.2379 85.107 13.3228 85.5567 13.3228C86.0185 13.3228 86.4803 13.2622 86.93 13.1531V14.3532H86.9421Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M88.0967 5.95207H89.5064L89.6644 6.83704C90.5273 6.0733 91.4874 5.69749 92.5447 5.69749C93.6506 5.69749 94.5135 6.09754 95.1454 6.89765C95.7774 7.69776 96.0933 8.7767 96.0933 10.1466C96.0933 11.5407 95.7531 12.656 95.0846 13.4925C94.4162 14.329 93.5291 14.7533 92.411 14.7533C91.3901 14.7533 90.5151 14.4139 89.7738 13.7471V18.0628H88.0967V5.95207ZM92.0585 7.05525C91.2564 7.05525 90.4908 7.30983 89.7738 7.83112V12.5712C90.5151 13.1167 91.2564 13.3834 92.0221 13.3834C93.5898 13.3834 94.3676 12.3287 94.3676 10.2315C94.3676 9.15251 94.1732 8.36453 93.7964 7.84324C93.4318 7.32196 92.8485 7.05525 92.0585 7.05525Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M100.711 14.4381C100.335 14.5715 99.9337 14.6442 99.484 14.6442C98.8885 14.6442 98.4267 14.4745 98.1107 14.1229C97.7948 13.7835 97.6368 13.2864 97.6368 12.6439V2H99.326V12.5348C99.326 12.7894 99.3746 12.9834 99.484 13.1046C99.5934 13.2258 99.7757 13.2864 100.019 13.2864C100.25 13.2864 100.481 13.2743 100.711 13.2379V14.4381Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M107.225 14.5593L107.092 13.6744C106.679 14.0259 106.229 14.2926 105.743 14.4866C105.245 14.6806 104.758 14.7775 104.272 14.7775C103.47 14.7775 102.826 14.5472 102.34 14.0865C101.854 13.6259 101.611 13.0197 101.611 12.2439C101.611 11.4195 101.902 10.7527 102.498 10.2678C103.093 9.77078 103.883 9.52832 104.88 9.52832C105.536 9.52832 106.253 9.62531 107.019 9.81927V8.70397C107.019 8.09782 106.885 7.6614 106.606 7.41894C106.326 7.16436 105.852 7.04313 105.184 7.04313C104.224 7.04313 103.227 7.21285 102.194 7.56441V6.37637C102.607 6.15816 103.106 6.00056 103.689 5.87933C104.284 5.7581 104.88 5.69749 105.475 5.69749C106.557 5.69749 107.347 5.9157 107.857 6.36425C108.368 6.81279 108.623 7.49168 108.623 8.41302V14.5593H107.225ZM104.673 13.5046C105.439 13.5046 106.229 13.2137 107.019 12.6439V10.9103C106.423 10.7649 105.828 10.6921 105.22 10.6921C103.944 10.6921 103.3 11.1892 103.3 12.1711C103.3 12.5954 103.422 12.9349 103.652 13.1652C103.896 13.3834 104.236 13.5046 104.673 13.5046Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M116.571 14.232C115.915 14.5715 115.149 14.7412 114.286 14.7412C112.95 14.7412 111.929 14.3532 111.212 13.5895C110.507 12.8258 110.142 11.7226 110.142 10.2678C110.142 8.82519 110.507 7.72201 111.236 6.93402C111.965 6.14603 112.998 5.7581 114.335 5.7581C115.101 5.7581 115.805 5.9157 116.474 6.23089V7.43106C115.83 7.22497 115.198 7.12799 114.566 7.12799C113.618 7.12799 112.925 7.37045 112.512 7.85536C112.087 8.34028 111.88 9.10402 111.88 10.1587V10.3769C111.88 11.4074 112.099 12.159 112.512 12.6439C112.937 13.1288 113.606 13.3713 114.529 13.3713C115.137 13.3713 115.805 13.2622 116.535 13.0318V14.232H116.571Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M118.965 10.6194C118.99 11.5892 119.233 12.3166 119.694 12.7773C120.156 13.2379 120.861 13.4683 121.833 13.4683C122.733 13.4683 123.644 13.2985 124.568 12.947V14.1472C123.754 14.5836 122.757 14.8139 121.578 14.8139C120.181 14.8139 119.123 14.426 118.418 13.6622C117.701 12.8985 117.349 11.7589 117.349 10.2557C117.349 8.81307 117.701 7.69776 118.418 6.90978C119.135 6.12179 120.132 5.70961 121.408 5.70961C122.49 5.70961 123.316 6.01268 123.887 6.61883C124.471 7.22497 124.75 8.0857 124.75 9.18888C124.75 9.72229 124.701 10.2072 124.616 10.6315H118.965V10.6194ZM121.311 6.97039C120.594 6.97039 120.035 7.1886 119.646 7.60078C119.245 8.02508 119.026 8.65547 118.965 9.49195H123.207C123.219 9.40709 123.219 9.2495 123.219 9.05553C123.219 8.36452 123.061 7.84324 122.733 7.49168C122.405 7.15223 121.931 6.97039 121.311 6.97039Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M27.0036 14.8139C26.4567 14.8139 25.922 14.7533 25.3994 14.6321C24.8768 14.5108 24.4758 14.3775 24.1962 14.2199C24.0261 14.1229 23.9167 14.0259 23.8803 13.9289C23.8317 13.832 23.8195 13.735 23.8195 13.638V13.1167C23.8195 12.8985 23.8924 12.7894 24.0504 12.7894C24.1112 12.7894 24.1719 12.8015 24.2449 12.8258C24.3056 12.85 24.4029 12.8864 24.5122 12.9349C24.8647 13.0925 25.2414 13.2137 25.6546 13.2985C26.0678 13.3834 26.481 13.4198 26.8942 13.4198C27.5505 13.4198 28.0487 13.3107 28.4133 13.0803C28.7658 12.85 28.9481 12.5227 28.9481 12.0984C28.9481 11.8074 28.8508 11.565 28.6686 11.371C28.4862 11.177 28.1338 10.9952 27.6234 10.8255L26.1164 10.3527C25.3508 10.1102 24.8039 9.75866 24.4515 9.29799C24.1112 8.83732 23.9289 8.34028 23.9289 7.79475C23.9289 7.35832 24.0261 6.97039 24.2084 6.64307C24.3907 6.31575 24.6459 6.0248 24.9497 5.79447C25.2536 5.56413 25.6182 5.38229 26.0313 5.26106C26.4446 5.13983 26.8821 5.07922 27.3439 5.07922C27.5748 5.07922 27.8057 5.09134 28.0487 5.12771C28.2797 5.16408 28.5106 5.20045 28.7172 5.24894C28.9238 5.29743 29.1304 5.34592 29.3127 5.40654C29.495 5.46715 29.6408 5.52777 29.7502 5.58838C29.896 5.67324 29.9932 5.7581 30.054 5.84296C30.1148 5.92782 30.1391 6.03693 30.1391 6.1824V6.66732C30.1391 6.88553 30.0661 6.99464 29.9082 6.99464C29.8231 6.99464 29.6894 6.95827 29.5071 6.87341C28.9116 6.6067 28.2432 6.47335 27.514 6.47335C26.9185 6.47335 26.4567 6.57033 26.1286 6.7643C25.8004 6.95827 25.6425 7.26134 25.6425 7.68564C25.6425 7.97659 25.7397 8.21905 25.9463 8.42514C26.1529 8.61911 26.5296 8.81307 27.0887 8.99492L28.5592 9.46771C29.3127 9.71017 29.8474 10.0375 30.1634 10.4618C30.4793 10.8861 30.6495 11.371 30.6495 11.9165C30.6495 12.3651 30.5644 12.7651 30.3821 13.1167C30.1998 13.4683 29.9446 13.7835 29.6286 14.038C29.3127 14.2926 28.9238 14.4866 28.4741 14.6199C28.0244 14.7412 27.5383 14.8139 27.0036 14.8139ZM13.6718 14.5351C13.4895 14.5351 13.3558 14.4987 13.2707 14.4381C13.1856 14.3775 13.1127 14.232 13.052 14.0259L10.6214 6.01268C10.5606 5.80659 10.5363 5.67324 10.5363 5.6005C10.5363 5.43078 10.6214 5.34592 10.7915 5.34592H11.8124C12.0068 5.34592 12.1405 5.38229 12.2256 5.4429C12.2985 5.50352 12.3714 5.64899 12.4322 5.85508L14.1822 12.7045L15.7742 5.85508C15.8228 5.64899 15.8836 5.51564 15.9687 5.4429C16.0538 5.38229 16.1874 5.34592 16.3819 5.34592H17.2204C17.4149 5.34592 17.5486 5.38229 17.6336 5.4429C17.7187 5.50352 17.7795 5.64899 17.8281 5.85508L19.4687 12.8015L21.2674 5.85508C21.3281 5.64899 21.4011 5.51564 21.474 5.4429C21.5469 5.38229 21.6927 5.34592 21.8872 5.34592H22.8473C23.0174 5.34592 23.1025 5.43078 23.1025 5.6005C23.1025 5.64899 23.0903 5.69749 23.0903 5.7581C23.0781 5.81871 23.0538 5.90357 23.0174 6.01268L20.5138 14.0259C20.4531 14.232 20.3802 14.3654 20.2951 14.4381C20.21 14.4987 20.0763 14.5351 19.894 14.5351H19.0069C18.8124 14.5351 18.6787 14.4987 18.5937 14.426C18.5086 14.3532 18.4478 14.2199 18.3992 14.0138L16.7829 7.3462L15.1787 14.0138C15.1301 14.2199 15.0693 14.3532 14.9842 14.426C14.8992 14.4987 14.7655 14.5351 14.571 14.5351H13.6718ZM5.32267 13.4077C5.66296 13.4077 6.0154 13.347 6.39214 13.2137C6.76888 13.0925 7.09701 12.8621 7.37653 12.5469C7.54667 12.353 7.6682 12.1347 7.72897 11.8802C7.78973 11.6377 7.82619 11.3346 7.82619 10.9831V10.5466C7.52237 10.4739 7.20639 10.4133 6.86611 10.3769C6.53797 10.3406 6.20984 10.3163 5.89387 10.3163C5.20114 10.3163 4.69072 10.4497 4.35044 10.7285C4.01015 11.0073 3.84001 11.4074 3.84001 11.9287C3.84001 12.4136 3.96154 12.7773 4.21675 13.0197C4.49627 13.2864 4.84871 13.4077 5.32267 13.4077ZM9.53976 11.8317C9.53976 12.2196 9.57622 12.5227 9.66129 12.753C9.73421 12.9834 9.85574 13.2258 10.0016 13.4925C10.0502 13.5774 10.0745 13.6501 10.0745 13.7228C10.0745 13.832 10.0137 13.9289 9.88005 14.0259L9.21163 14.4866C9.11441 14.5472 9.02934 14.5715 8.94427 14.5715C8.83489 14.5715 8.73767 14.523 8.64044 14.426C8.49461 14.2805 8.37308 14.1229 8.2637 13.9411C8.16647 13.7713 8.0571 13.5653 7.94772 13.3349C7.13347 14.2926 6.11262 14.7654 4.89732 14.7654C4.0223 14.7654 3.32959 14.523 2.83131 14.0259C2.32089 13.5289 2.06567 12.8621 2.06567 12.0378C2.06567 11.1528 2.38165 10.4497 3.01361 9.90413C3.64556 9.37073 4.49627 9.0919 5.55358 9.0919C5.90602 9.0919 6.27061 9.11614 6.64735 9.17676C7.02409 9.22525 7.42514 9.31011 7.83834 9.40709V8.64335C7.83834 7.85536 7.68036 7.30983 7.35222 6.98251C7.02409 6.66732 6.46506 6.4976 5.66296 6.4976C5.29837 6.4976 4.92163 6.54609 4.54488 6.63095C4.16814 6.71581 3.7914 6.83704 3.42681 6.98251C3.25667 7.05525 3.13514 7.10374 3.06222 7.11587C2.9893 7.12799 2.94069 7.14011 2.90423 7.14011C2.75839 7.14011 2.68548 7.031 2.68548 6.81279V6.30363C2.68548 6.13391 2.70978 6.01268 2.75839 5.93994C2.80701 5.86721 2.90423 5.79447 3.05007 5.72173C3.41466 5.53989 3.85216 5.38229 4.36259 5.24894C4.87301 5.11559 5.40775 5.05497 5.97894 5.05497C7.21854 5.05497 8.11786 5.3338 8.70121 5.90357C9.2724 6.46123 9.56407 7.30983 9.56407 8.44938V11.8317H9.53976Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M28.9723 19.8449C25.5573 22.3665 20.5989 23.7 16.3332 23.7C10.3539 23.7 4.97014 21.4936 0.886731 17.8204C0.570753 17.5294 0.850272 17.1415 1.23917 17.3597C5.63855 19.9177 11.0709 21.4451 16.6978 21.4451C20.4895 21.4451 24.658 20.6572 28.4862 19.0448C29.0573 18.8023 29.5313 19.4327 28.9723 19.8449Z",
+							"fill": "#FF9900"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M30.3942 18.2205C29.9567 17.6628 27.5018 17.9537 26.3958 18.0871C26.0677 18.1235 26.0069 17.8325 26.3108 17.6264C28.2674 16.2565 31.4758 16.6566 31.8525 17.1051C32.2293 17.5658 31.7553 20.7784 29.9202 22.3059C29.6407 22.5362 29.3733 22.415 29.4949 22.0998C29.9081 21.0815 30.8317 18.7902 30.3942 18.2205Z",
+							"fill": "#FF9900"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_394_42756"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "124.5",
+									"height": "24",
+									"fill": "white",
+									"transform": "translate(0.75)"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "AwsMarketplace"
+}
diff --git a/app/components/base/icons/src/public/billing/AwsMarketplace.tsx b/app/components/base/icons/src/public/billing/AwsMarketplace.tsx
new file mode 100644
index 0000000..7ea4e14
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/AwsMarketplace.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AwsMarketplace.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AwsMarketplace'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/billing/Azure.json b/app/components/base/icons/src/public/billing/Azure.json
new file mode 100644
index 0000000..fb6a9b9
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/Azure.json
@@ -0,0 +1,193 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "21",
+			"height": "20",
+			"viewBox": "0 0 21 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Group 5"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M7.08403 0.812966H12.8543L6.86419 18.5609C6.80263 18.7433 6.68542 18.9018 6.52907 19.0141C6.37271 19.1263 6.18509 19.1867 5.99261 19.1868H1.50193C1.35609 19.1868 1.21234 19.1521 1.08258 19.0855C0.952814 19.019 0.840765 18.9225 0.755699 18.804C0.670633 18.6855 0.614995 18.5485 0.593389 18.4043C0.571782 18.2601 0.584829 18.1128 0.631448 17.9746L6.21222 1.43879C6.27376 1.25634 6.39099 1.09779 6.54739 0.985482C6.70379 0.873171 6.89148 0.812976 7.08403 0.812966Z",
+							"fill": "url(#paint0_linear_644_3772)"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M15.469 12.7173H6.31874C6.23367 12.7173 6.15054 12.7428 6.08019 12.7906C6.00984 12.8384 5.95552 12.9063 5.92431 12.9855C5.8931 13.0646 5.88644 13.1513 5.90521 13.2343C5.92398 13.3173 5.96731 13.3927 6.02954 13.4506L11.9093 18.9386C12.0805 19.0983 12.3059 19.187 12.54 19.187H17.7212L15.469 12.7173Z",
+							"fill": "#0078D4"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_3",
+							"d": "M7.08432 0.813056C6.88967 0.812309 6.69988 0.873821 6.54267 0.988606C6.38547 1.10339 6.26908 1.26543 6.21052 1.45107L0.638609 17.9596C0.588854 18.0983 0.573233 18.2469 0.593069 18.3929C0.612904 18.5389 0.667613 18.678 0.752567 18.7984C0.83752 18.9188 0.950219 19.0169 1.08113 19.0845C1.21204 19.1522 1.35731 19.1873 1.50466 19.1869H6.11124C6.28281 19.1562 6.44316 19.0806 6.57593 18.9676C6.7087 18.8547 6.80911 18.7086 6.86692 18.5442L7.97807 15.2695L11.9471 18.9715C12.1134 19.109 12.3221 19.1851 12.5379 19.1869H17.6998L15.4359 12.7172L8.83614 12.7188L12.8754 0.813056H7.08432Z",
+							"fill": "url(#paint1_linear_644_3772)"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_4",
+							"d": "M14.4539 1.43799C14.3925 1.25583 14.2754 1.09755 14.1193 0.985434C13.9631 0.87332 13.7757 0.813027 13.5835 0.813049H7.15259C7.34482 0.81306 7.53221 0.873366 7.68837 0.985475C7.84453 1.09758 7.96159 1.25585 8.02307 1.43799L13.6041 17.9744C13.6507 18.1126 13.6638 18.26 13.6422 18.4042C13.6206 18.5485 13.565 18.6856 13.4799 18.8041C13.3949 18.9226 13.2828 19.0191 13.153 19.0857C13.0232 19.1523 12.8795 19.1871 12.7336 19.1871H19.1647C19.3105 19.187 19.4543 19.1523 19.584 19.0856C19.7138 19.019 19.8258 18.9225 19.9109 18.804C19.9959 18.6855 20.0515 18.5484 20.0731 18.4042C20.0947 18.2599 20.0816 18.1126 20.0349 17.9744L14.4539 1.43799Z",
+							"fill": "url(#paint2_linear_644_3772)"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint0_linear_644_3772",
+							"x1": "9.1871",
+							"y1": "2.17453",
+							"x2": "3.19457",
+							"y2": "19.878",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#114A8B"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#0669BC"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint1_linear_644_3772",
+							"x1": "11.0593",
+							"y1": "10.4249",
+							"x2": "9.67315",
+							"y2": "10.8936",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-opacity": "0.3"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.071",
+									"stop-opacity": "0.2"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.321",
+									"stop-opacity": "0.1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.623",
+									"stop-opacity": "0.05"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-opacity": "0"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint2_linear_644_3772",
+							"x1": "10.2966",
+							"y1": "1.65827",
+							"x2": "16.8746",
+							"y2": "19.1833",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#3CCBF4"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#2892DF"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Azure"
+}
diff --git a/app/components/base/icons/src/public/billing/Azure.tsx b/app/components/base/icons/src/public/billing/Azure.tsx
new file mode 100644
index 0000000..fe47611
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/Azure.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Azure.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Azure'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/billing/Buildings.json b/app/components/base/icons/src/public/billing/Buildings.json
new file mode 100644
index 0000000..62d22f9
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/Buildings.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "29",
+			"height": "28",
+			"viewBox": "0 0 29 28",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "buildings"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M5.04134 22.4583H17.2913M5.04134 22.4583V6.70833C5.04134 5.41967 6.08601 4.375 7.37467 4.375H14.958C16.2467 4.375 17.2913 5.41967 17.2913 6.70833V9.33333M5.04134 22.4583H2.70801M17.2913 22.4583V9.33333M17.2913 22.4583H24.2913M17.2913 9.33333H21.958C23.2467 9.33333 24.2913 10.378 24.2913 11.6667V22.4583M24.2913 22.4583H26.6247M12.6247 10.2083H9.70801M9.70801 14.875H12.6247",
+							"stroke": "white",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Buildings"
+}
diff --git a/app/components/base/icons/src/public/billing/Buildings.tsx b/app/components/base/icons/src/public/billing/Buildings.tsx
new file mode 100644
index 0000000..eaed4e8
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/Buildings.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Buildings.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Buildings'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/billing/Diamond.json b/app/components/base/icons/src/public/billing/Diamond.json
new file mode 100644
index 0000000..6717026
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/Diamond.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "29",
+			"height": "28",
+			"viewBox": "0 0 29 28",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "diamond"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M10.2499 9.04167L7.62486 11.6667L10.2499 14.2917M15.9831 22.8501L25.4978 13.3353C26.4164 12.4168 26.408 10.925 25.4791 10.017L20.3883 5.03988C19.9523 4.61365 19.3668 4.375 18.7571 4.375H9.90929C9.29958 4.375 8.71408 4.61365 8.27811 5.03988L3.18727 10.017C2.25844 10.925 2.25002 12.4168 3.16852 13.3353L12.6833 22.8501C13.5945 23.7613 15.0719 23.7613 15.9831 22.8501Z",
+							"stroke": "#DC6803",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Diamond"
+}
diff --git a/app/components/base/icons/src/public/billing/Diamond.tsx b/app/components/base/icons/src/public/billing/Diamond.tsx
new file mode 100644
index 0000000..18226e3
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/Diamond.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Diamond.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Diamond'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/billing/GoogleCloud.json b/app/components/base/icons/src/public/billing/GoogleCloud.json
new file mode 100644
index 0000000..0c55bda
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/GoogleCloud.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "22",
+			"height": "18",
+			"viewBox": "0 0 22 18",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Group 4"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M14.1587 5.40399H14.7992L16.6247 3.57855L16.7143 2.80353C15.6686 1.88054 14.4049 1.23936 13.0424 0.94058C11.68 0.641797 10.2639 0.695269 8.92788 1.09594C7.59187 1.49662 6.38006 2.23127 5.40691 3.2305C4.43376 4.22973 3.73142 5.46055 3.36621 6.80669C3.56957 6.72334 3.79485 6.70982 4.00672 6.76826L7.6576 6.16619C7.6576 6.16619 7.84334 5.85874 7.93942 5.87796C8.72169 5.01883 9.80276 4.4912 10.9613 4.40309C12.1199 4.31497 13.2683 4.67304 14.1715 5.40399H14.1587Z",
+							"fill": "#EA4335"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M19.225 6.80663C18.8055 5.2615 17.944 3.87244 16.7463 2.80988L14.1843 5.3719C14.7182 5.80819 15.1461 6.36003 15.4357 6.9858C15.7253 7.61158 15.869 8.29494 15.856 8.98435V9.43911C16.1554 9.43911 16.4519 9.49809 16.7286 9.61268C17.0052 9.72727 17.2566 9.89523 17.4683 10.107C17.6801 10.3187 17.848 10.5701 17.9626 10.8467C18.0772 11.1234 18.1362 11.4199 18.1362 11.7193C18.1362 12.0187 18.0772 12.3153 17.9626 12.5919C17.848 12.8685 17.6801 13.1199 17.4683 13.3316C17.2566 13.5434 17.0052 13.7113 16.7286 13.8259C16.4519 13.9405 16.1554 13.9995 15.856 13.9995H11.2956L10.8408 14.4607V17.1956L11.2956 17.6504H15.856C17.1295 17.6603 18.3723 17.2601 19.4007 16.5089C20.429 15.7577 21.1883 14.6954 21.5662 13.4792C21.944 12.2631 21.9204 10.9576 21.4988 9.75589C21.0771 8.55419 20.2799 7.52012 19.225 6.80663Z",
+							"fill": "#4285F4"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_3",
+							"d": "M6.72886 17.625H11.2893V13.9741H6.72886C6.40396 13.9741 6.08286 13.9042 5.78732 13.7692L5.14681 13.9677L3.30856 15.7932L3.14844 16.4337C4.17929 17.2121 5.43714 17.6306 6.72886 17.625Z",
+							"fill": "#34A853"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_4",
+							"d": "M6.7289 5.78196C5.49325 5.78934 4.29076 6.18247 3.28939 6.90643C2.28801 7.6304 1.53775 8.64904 1.1434 9.8201C0.749049 10.9912 0.730302 12.2561 1.08978 13.4384C1.44925 14.6206 2.16899 15.661 3.14848 16.4143L5.79377 13.7691C5.4576 13.6172 5.16331 13.386 4.93613 13.0954C4.70895 12.8048 4.55567 12.4634 4.48944 12.1005C4.42321 11.7376 4.446 11.3641 4.55587 11.0119C4.66574 10.6598 4.8594 10.3396 5.12024 10.0788C5.38107 9.81792 5.7013 9.62426 6.05343 9.51439C6.40557 9.40452 6.7791 9.38172 7.14198 9.44795C7.50487 9.51418 7.84626 9.66747 8.13688 9.89465C8.4275 10.1218 8.65867 10.4161 8.81055 10.7523L11.4558 8.10699C10.9006 7.38115 10.185 6.79357 9.36499 6.39023C8.54496 5.98688 7.64275 5.7787 6.7289 5.78196Z",
+							"fill": "#FBBC05"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "GoogleCloud"
+}
diff --git a/app/components/base/icons/src/public/billing/GoogleCloud.tsx b/app/components/base/icons/src/public/billing/GoogleCloud.tsx
new file mode 100644
index 0000000..6750a7c
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/GoogleCloud.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './GoogleCloud.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'GoogleCloud'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/billing/Group2.json b/app/components/base/icons/src/public/billing/Group2.json
new file mode 100644
index 0000000..8cc0896
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/Group2.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "29",
+			"height": "28",
+			"viewBox": "0 0 29 28",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M17.4942 15.3771C21.1508 13.8584 25.694 15.7846 27.1017 21.1559C27.4448 22.465 26.348 23.625 24.9948 23.625H19.6233M13.2066 8.16667C13.2066 10.2608 11.509 11.9583 9.41493 11.9583C7.32086 11.9583 5.62326 10.2608 5.62326 8.16667C5.62326 6.07258 7.32086 4.375 9.41493 4.375C11.509 4.375 13.2066 6.07258 13.2066 8.16667ZM23.7066 8.16667C23.7066 10.2608 22.009 11.9583 19.9149 11.9583C17.8209 11.9583 16.1232 10.2608 16.1232 8.16667C16.1232 6.07258 17.8209 4.375 19.9149 4.375C22.009 4.375 23.7066 6.07258 23.7066 8.16667ZM14.328 23.625H4.3352C2.98193 23.625 1.88599 22.4589 2.22976 21.15C4.42721 12.7833 14.2359 12.7833 16.4335 21.15C16.7772 22.4589 15.6813 23.625 14.328 23.625Z",
+					"stroke": "#444CE7",
+					"stroke-width": "1.5",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Group2"
+}
diff --git a/app/components/base/icons/src/public/billing/Group2.tsx b/app/components/base/icons/src/public/billing/Group2.tsx
new file mode 100644
index 0000000..792b454
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/Group2.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Group2.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Group2'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/billing/Keyframe.json b/app/components/base/icons/src/public/billing/Keyframe.json
new file mode 100644
index 0000000..ed0dcb4
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/Keyframe.json
@@ -0,0 +1,28 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "29",
+			"height": "28",
+			"viewBox": "0 0 29 28",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M15.9831 3.98321C15.072 3.072 13.5945 3.072 12.6833 3.98321L4.31648 12.35C3.40526 13.2612 3.40524 14.7386 4.31647 15.6499L12.6833 24.0167C13.5945 24.9279 15.072 24.9279 15.9831 24.0167L24.35 15.6499C25.2612 14.7386 25.2612 13.2612 24.35 12.35L15.9831 3.98321Z",
+					"stroke": "#155AEF",
+					"stroke-width": "1.5",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Keyframe"
+}
diff --git a/app/components/base/icons/src/public/billing/Keyframe.tsx b/app/components/base/icons/src/public/billing/Keyframe.tsx
new file mode 100644
index 0000000..a82aad9
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/Keyframe.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Keyframe.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Keyframe'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/billing/Sparkles.json b/app/components/base/icons/src/public/billing/Sparkles.json
new file mode 100644
index 0000000..5317b50
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/Sparkles.json
@@ -0,0 +1,95 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "600",
+			"height": "600",
+			"viewBox": "0 0 600 600",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg",
+			"xmlns:xlink": "http://www.w3.org/1999/xlink"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_1_382)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "rect",
+						"attributes": {
+							"width": "600",
+							"height": "600",
+							"fill": "url(#pattern999)"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "pattern",
+						"attributes": {
+							"id": "pattern999",
+							"patternContentUnits": "objectBoundingBox",
+							"width": "1",
+							"height": "1"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "use",
+								"attributes": {
+									"xlink:href": "#image0_1_382",
+									"transform": "scale(0.000976562)"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_1_382"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "600",
+									"height": "600",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "image",
+						"attributes": {
+							"id": "image0_1_382",
+							"width": "1024",
+							"height": "1024",
+							"xlink:href": "data:image/png;base64,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fAkQAMjX8WZvEUAAAQQQQGAaBfav3Va5+vLVF91w5YXXrzm15sZZI+3L0janXjw2vhMAt5ACBGmVfFs/rOzbPLX272rbdefa7XvWPdz30v+uuOFDI/YaJQIIIIBA/gQIAOTvmLPHCCCAAAIIIJABAQsGXLFq2TWXllf+9qr5yy9pFhCY6uaqwv/KWwd276zu2/rq4aPbt+/Zv5PW/qnqsRwCCCAw8wUIAMz8Y8weIoAAAggggEALCCggsOzs7s7fWL5w5col3ef2zJ69oFQsLzx/UVdn59GFC8NdGFzQ3//y4YHBWr3a/+bQ0NF9vzy+98jAO2/2vXzodVr5QynGEUAAAQRCAQIAoQbjCCCAAAIIIIAAAggggAACCMxQgeB5MzN0D9ktBBBAAAEEEEAAAQQQQAABBBAoEADgS4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCBAA4DuAAAIIIIAAAggggAACCCCAQA4ECADk4CCziwgggAACCCCAAAIIIIAAAggQAOA7gAACCOgv+e0AAABaSURBVCCAAAIIIIAAAggggEAOBAgA5OAgs4sIIIAAAggggAACCCCAAAIIEADgO4AAAggggAACCCCAAAIIIIBADgQIAOTgILOLCCCAAAIIIIAAAggggAACCPwfNaPiwKKqjBIAAAAASUVORK5CYII="
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Sparkles"
+}
diff --git a/app/components/base/icons/src/public/billing/Sparkles.tsx b/app/components/base/icons/src/public/billing/Sparkles.tsx
new file mode 100644
index 0000000..09fb779
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/Sparkles.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Sparkles.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Sparkles'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/billing/SparklesSoft.json b/app/components/base/icons/src/public/billing/SparklesSoft.json
new file mode 100644
index 0000000..b6a5a6d
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/SparklesSoft.json
@@ -0,0 +1,36 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "13",
+			"height": "13",
+			"viewBox": "0 0 13 13",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"opacity": "0.5",
+					"d": "M9.75878 1.67256C9.74813 1.57435 9.6684 1.5001 9.5735 1.5C9.47861 1.4999 9.39874 1.57397 9.38789 1.67217C9.33725 2.12931 9.20693 2.44292 9.00273 2.65564C8.79849 2.86835 8.49744 3.00411 8.05857 3.05683C7.9643 3.06816 7.89321 3.15136 7.89331 3.2502C7.89341 3.34905 7.96469 3.43208 8.05896 3.44321C8.49038 3.49411 8.79835 3.62984 9.00773 3.84402C9.216 4.05703 9.34877 4.3702 9.38736 4.82276C9.39595 4.92317 9.47673 5.00011 9.5735 5C9.67027 4.99988 9.75096 4.92276 9.75926 4.82232C9.79627 4.37742 9.92894 4.05719 10.1386 3.83882C10.3482 3.62045 10.6556 3.48223 11.0827 3.44372C11.1792 3.43503 11.2532 3.35103 11.2533 3.25022C11.2534 3.14942 11.1795 3.06524 11.0832 3.05632C10.6487 3.01612 10.3481 2.87779 10.1436 2.66085C9.93797 2.44273 9.80765 2.12197 9.75878 1.67256Z",
+					"fill": "#FCFCFD"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M6.45025 2.94373C6.42279 2.69117 6.21783 2.50026 5.9738 2.5C5.72982 2.49974 5.52443 2.69021 5.49649 2.94271C5.36631 4.11822 5.0312 4.92465 4.50609 5.47164C3.98098 6.0186 3.20681 6.3677 2.07832 6.5033C1.83592 6.5324 1.65307 6.74635 1.65332 7.0005C1.65357 7.2547 1.83684 7.4682 2.0793 7.4968C3.1887 7.6277 3.9805 7.97675 4.51896 8.5275C5.05449 9.07525 5.39598 9.8805 5.49519 11.0442C5.51722 11.3024 5.72502 11.5003 5.97385 11.5C6.22273 11.4997 6.43009 11.3014 6.45154 11.0431C6.54658 9.89905 6.88782 9.07565 7.42686 8.5141C7.96595 7.9526 8.75641 7.59715 9.8547 7.49815C10.1026 7.4758 10.293 7.2598 10.2933 7.00055C10.2936 6.74135 10.1037 6.5249 9.8558 6.50195C8.7386 6.3986 7.96556 6.0429 7.43972 5.48504C6.911 4.92415 6.57591 4.09936 6.45025 2.94373Z",
+					"fill": "#FCFCFD"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "SparklesSoft"
+}
diff --git a/app/components/base/icons/src/public/billing/SparklesSoft.tsx b/app/components/base/icons/src/public/billing/SparklesSoft.tsx
new file mode 100644
index 0000000..b3f94d0
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/SparklesSoft.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './SparklesSoft.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'SparklesSoft'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/billing/index.ts b/app/components/base/icons/src/public/billing/index.ts
new file mode 100644
index 0000000..9460acf
--- /dev/null
+++ b/app/components/base/icons/src/public/billing/index.ts
@@ -0,0 +1,11 @@
+export { default as ArCube1 } from './ArCube1'
+export { default as Asterisk } from './Asterisk'
+export { default as AwsMarketplace } from './AwsMarketplace'
+export { default as Azure } from './Azure'
+export { default as Buildings } from './Buildings'
+export { default as Diamond } from './Diamond'
+export { default as GoogleCloud } from './GoogleCloud'
+export { default as Group2 } from './Group2'
+export { default as Keyframe } from './Keyframe'
+export { default as SparklesSoft } from './SparklesSoft'
+export { default as Sparkles } from './Sparkles'
diff --git a/app/components/base/icons/src/public/common/D.json b/app/components/base/icons/src/public/common/D.json
new file mode 100644
index 0000000..ab4ed79
--- /dev/null
+++ b/app/components/base/icons/src/public/common/D.json
@@ -0,0 +1,125 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M2 1H7.94339C11.8094 1 14.9434 4.13401 14.9434 8C14.9434 11.866 11.8094 15 7.9434 15H2V1Z",
+					"fill": "white"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M2 1H7.94339C11.8094 1 14.9434 4.13401 14.9434 8C14.9434 11.866 11.8094 15 7.9434 15H2V1Z",
+					"fill": "url(#paint0_angular_19344_240446)"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M7.94336 8H8.20751V15H7.94336V8Z",
+					"fill": "url(#paint1_linear_19344_240446)"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "radialGradient",
+						"attributes": {
+							"id": "paint0_angular_19344_240446",
+							"cx": "0",
+							"cy": "0",
+							"r": "1",
+							"gradientUnits": "userSpaceOnUse",
+							"gradientTransform": "translate(7.9434 8) rotate(90) scale(8.75 8.75)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#001FC2"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.711334",
+									"stop-color": "#0667F8",
+									"stop-opacity": "0.2"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#155EEF",
+									"stop-opacity": "0"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint1_linear_19344_240446",
+							"x1": "8.06244",
+							"y1": "8.43754",
+							"x2": "7.93744",
+							"y2": "9.20317",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "D"
+}
diff --git a/app/components/base/icons/src/public/common/D.tsx b/app/components/base/icons/src/public/common/D.tsx
new file mode 100644
index 0000000..87aca80
--- /dev/null
+++ b/app/components/base/icons/src/public/common/D.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './D.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'D'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/DiagonalDividingLine.json b/app/components/base/icons/src/public/common/DiagonalDividingLine.json
new file mode 100644
index 0000000..a9e7cd7
--- /dev/null
+++ b/app/components/base/icons/src/public/common/DiagonalDividingLine.json
@@ -0,0 +1,28 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "7",
+			"height": "20",
+			"viewBox": "0 0 7 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"id": "Line 3",
+					"d": "M1 19.3544L5.94174 0.645657",
+					"stroke": "#EAECF0",
+					"stroke-linecap": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "DiagonalDividingLine"
+}
diff --git a/app/components/base/icons/src/public/common/DiagonalDividingLine.tsx b/app/components/base/icons/src/public/common/DiagonalDividingLine.tsx
new file mode 100644
index 0000000..ce95c2f
--- /dev/null
+++ b/app/components/base/icons/src/public/common/DiagonalDividingLine.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './DiagonalDividingLine.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'DiagonalDividingLine'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/Dify.json b/app/components/base/icons/src/public/common/Dify.json
new file mode 100644
index 0000000..a954b66
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Dify.json
@@ -0,0 +1,62 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "50",
+			"height": "26",
+			"viewBox": "0 0 50 26",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Dify"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M6.61784 2.064C8.37784 2.064 9.92184 2.408 11.2498 3.096C12.5938 3.784 13.6258 4.768 14.3458 6.048C15.0818 7.312 15.4498 8.784 15.4498 10.464C15.4498 12.144 15.0818 13.616 14.3458 14.88C13.6258 16.128 12.5938 17.096 11.2498 17.784C9.92184 18.472 8.37784 18.816 6.61784 18.816H0.761841V2.064H6.61784ZM6.49784 15.96C8.25784 15.96 9.61784 15.48 10.5778 14.52C11.5378 13.56 12.0178 12.208 12.0178 10.464C12.0178 8.72 11.5378 7.36 10.5778 6.384C9.61784 5.392 8.25784 4.896 6.49784 4.896H4.12184V15.96H6.49784Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M20.869 3.936C20.277 3.936 19.781 3.752 19.381 3.384C18.997 3 18.805 2.528 18.805 1.968C18.805 1.408 18.997 0.944 19.381 0.576C19.781 0.192 20.277 0 20.869 0C21.461 0 21.949 0.192 22.333 0.576C22.733 0.944 22.933 1.408 22.933 1.968C22.933 2.528 22.733 3 22.333 3.384C21.949 3.752 21.461 3.936 20.869 3.936ZM22.525 5.52V18.816H19.165V5.52H22.525Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M33.1407 8.28H30.8127V18.816H27.4047V8.28H25.8927V5.52H27.4047V4.848C27.4047 3.216 27.8687 2.016 28.7967 1.248C29.7247 0.48 31.1247 0.12 32.9967 0.168001V3C32.1807 2.984 31.6127 3.12 31.2927 3.408C30.9727 3.696 30.8127 4.216 30.8127 4.968V5.52H33.1407V8.28Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M49.2381 5.52L41.0061 25.104H37.4301L40.3101 18.48L34.9821 5.52H38.7501L42.1821 14.808L45.6621 5.52H49.2381Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Dify"
+}
diff --git a/app/components/base/icons/src/public/common/Dify.tsx b/app/components/base/icons/src/public/common/Dify.tsx
new file mode 100644
index 0000000..f53f47f
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Dify.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Dify.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Dify'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/Gdpr.json b/app/components/base/icons/src/public/common/Gdpr.json
new file mode 100644
index 0000000..1e030b5
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Gdpr.json
@@ -0,0 +1,340 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "23",
+			"height": "28",
+			"viewBox": "0 0 23 28",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Group"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Group_2"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector",
+									"d": "M11.0371 28L10.7001 27.8596C8.90271 27.1013 0 23.001 0 16.8786V4.32497L11.0371 0L22.0742 4.32497V16.8786C22.0742 23.001 13.1434 27.1013 11.3741 27.8596L11.0371 28ZM1.71314 5.47643V16.8786C1.71314 18.9569 3.11735 21.0632 5.86961 23.1414C7.89167 24.658 10.0822 25.7252 11.0652 26.1464C12.0481 25.6971 14.2387 24.658 16.2608 23.1414C19.013 21.0632 20.4173 18.9569 20.4173 16.8786V5.47643L11.0652 1.82548L1.71314 5.47643Z",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Group_3"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group_4"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_2",
+											"d": "M11.0371 0.898682V27.0732C12.666 26.3711 21.2317 22.4674 21.2317 16.8786C21.2317 10.672 21.2317 4.88664 21.2317 4.88664L11.0371 0.898682Z",
+											"fill": "#1611D3"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group_5"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_3",
+											"d": "M11.0371 0.898682V27.0732C9.40823 26.3711 0.842529 22.4674 0.842529 16.8786C0.842529 10.672 0.842529 4.88664 0.842529 4.88664L11.0371 0.898682Z",
+											"fill": "#0D00A0"
+										},
+										"children": []
+									}
+								]
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Group_6"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_4",
+									"d": "M7.1333 15.5306C7.04905 15.5867 6.93671 15.6429 6.82437 15.671C6.71204 15.7272 6.5997 15.7552 6.48736 15.7833C6.37503 15.8114 6.23461 15.8395 6.0661 15.8676C5.92568 15.8957 5.72909 15.8957 5.56058 15.8957C5.33591 15.8957 5.1674 15.8676 4.97081 15.8114C4.80231 15.7552 4.6338 15.671 4.52147 15.5867C4.40913 15.5025 4.26871 15.3621 4.18445 15.2216C4.07212 15.0812 4.01595 14.9408 3.9317 14.7723C3.84745 14.6038 3.81936 14.4353 3.79128 14.2668C3.76319 14.0983 3.73511 13.9017 3.73511 13.7332C3.73511 13.5366 3.76319 13.34 3.79128 13.1715C3.81936 12.9749 3.87553 12.8064 3.95978 12.6379C4.04403 12.4694 4.12829 12.329 4.24062 12.1885C4.35296 12.0481 4.4653 11.9358 4.60572 11.8235C4.74614 11.7111 4.91465 11.6549 5.08315 11.5988C5.25166 11.5426 5.44825 11.5145 5.64484 11.5145C5.75717 11.5145 5.84143 11.5145 5.92568 11.5145C6.00993 11.5145 6.09418 11.5426 6.15035 11.5426C6.2346 11.5426 6.29077 11.5707 6.34694 11.5988C6.40311 11.6269 6.48736 11.6549 6.54353 11.683C6.5997 11.7111 6.68395 11.7673 6.74012 11.8235C6.79629 11.8796 6.88054 11.9358 6.9648 11.992L6.57162 12.5256C6.48736 12.4413 6.40311 12.3571 6.31886 12.3009C6.23461 12.2447 6.15035 12.1885 6.09418 12.1605C6.00993 12.1324 5.92568 12.1043 5.84143 12.1043C5.75717 12.1043 5.67292 12.0762 5.56058 12.0762C5.39208 12.0762 5.22357 12.1043 5.08315 12.1885C4.94273 12.2728 4.83039 12.3851 4.74614 12.5256C4.66189 12.666 4.57764 12.8345 4.52147 13.003C4.4653 13.1715 4.43721 13.3962 4.43721 13.6208C4.43721 13.8455 4.4653 14.0702 4.49338 14.2668C4.52147 14.4634 4.60572 14.66 4.68997 14.8004C4.77422 14.9408 4.88656 15.0812 5.05507 15.1655C5.19549 15.2497 5.36399 15.3059 5.58867 15.3059C5.64484 15.3059 5.70101 15.3059 5.75717 15.3059C5.81334 15.3059 5.89759 15.3059 5.95376 15.2778C6.00993 15.2778 6.09418 15.2497 6.15035 15.2497C6.20652 15.2497 6.26269 15.2216 6.31886 15.2216V13.7894H7.04905V15.5306H7.1333Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_5",
+									"d": "M8.93074 11.5707C9.32391 11.5707 9.66093 11.6268 9.91368 11.7392C10.1945 11.8515 10.3911 11.9919 10.5877 12.1885C10.7562 12.3851 10.8685 12.5817 10.9528 12.8345C11.0371 13.0872 11.0651 13.34 11.0651 13.6208C11.0651 13.8174 11.0371 14.014 11.009 14.1825C10.9809 14.351 10.9247 14.5476 10.8685 14.7161C10.7843 14.8846 10.7 15.025 10.5877 15.1655C10.4754 15.3059 10.3349 15.4182 10.1664 15.5025C9.99794 15.5867 9.82943 15.671 9.60476 15.7271C9.38008 15.7833 9.15541 15.8114 8.87457 15.8114H7.83545V11.5988H8.93074V11.5707ZM8.62181 12.1324V15.2497H8.84648C9.04307 15.2497 9.23966 15.2216 9.43625 15.1374C9.60476 15.0812 9.77326 14.9689 9.8856 14.8285C10.026 14.688 10.1103 14.5195 10.1945 14.3229C10.2788 14.1263 10.3069 13.8736 10.3069 13.5927C10.3069 13.3962 10.2788 13.2276 10.2226 13.0311C10.1664 12.8626 10.0822 12.694 9.96985 12.5536C9.85752 12.4132 9.7171 12.3009 9.54859 12.2166C9.38008 12.1324 9.15541 12.0762 8.90265 12.0762H8.62181V12.1324Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_6",
+									"d": "M12.5537 14.1825V15.8114H11.8235V11.5988H13.0311C13.312 11.5988 13.5366 11.6268 13.7332 11.683C13.9298 11.7392 14.0983 11.8234 14.2106 11.9358C14.3511 12.0481 14.4353 12.1885 14.4915 12.3289C14.5477 12.4694 14.5757 12.6379 14.5757 12.8345C14.5757 12.8906 14.5757 12.9749 14.5477 13.0872C14.5196 13.1715 14.4915 13.2838 14.4634 13.3681C14.4072 13.4804 14.3511 13.5647 14.2668 13.6489C14.1826 13.7332 14.0983 13.8174 13.9579 13.9017C13.8175 13.9859 13.677 14.0421 13.5085 14.0983C13.34 14.1544 13.1434 14.1544 12.8907 14.1544H12.5537V14.1825ZM12.5537 13.6208H12.9188C13.0592 13.6208 13.1715 13.5927 13.2839 13.5647C13.3962 13.5366 13.4805 13.4804 13.5647 13.4242C13.649 13.3681 13.7051 13.2838 13.7613 13.1715C13.8175 13.0872 13.8175 12.9749 13.8175 12.8345C13.8175 12.7221 13.7894 12.6379 13.7613 12.5536C13.7332 12.4694 13.677 12.3851 13.6209 12.3289C13.5647 12.2728 13.4524 12.2166 13.34 12.1604C13.2277 12.1324 13.0873 12.1043 12.9188 12.1043H12.5537V13.6208Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_7",
+									"d": "M15.9519 15.8114H15.2217V11.5988H16.4293C16.7101 11.5988 16.9348 11.6268 17.1314 11.683C17.328 11.7392 17.4965 11.8234 17.6088 11.9077C17.7493 12.02 17.8335 12.1324 17.8897 12.2728C17.9459 12.4132 17.9739 12.5817 17.9739 12.7502C17.9739 12.8625 17.9459 13.003 17.9178 13.1153C17.8897 13.2276 17.8335 13.3681 17.7493 13.4804C17.665 13.5927 17.5808 13.7051 17.4403 13.7893C17.2999 13.8736 17.1595 13.9578 16.9629 14.014L18.2548 15.8114H17.4123L16.2889 14.0983C16.2327 14.0983 16.2046 14.0983 16.1485 14.0983C16.0923 14.0983 16.0361 14.0983 15.9519 14.0702V15.8114ZM15.9519 13.5085C16.008 13.5085 16.0642 13.5085 16.1204 13.5085C16.1765 13.5085 16.2327 13.5085 16.2889 13.5085C16.4293 13.5085 16.5697 13.4804 16.6821 13.4523C16.7944 13.4242 16.9067 13.3681 16.991 13.3119C17.0752 13.2557 17.1314 13.1715 17.1876 13.0872C17.2437 13.003 17.2437 12.8906 17.2437 12.7783C17.2437 12.666 17.2157 12.5536 17.1876 12.4694C17.1595 12.3851 17.1033 12.3289 17.0472 12.2728C16.991 12.2166 16.8787 12.1885 16.7663 12.1604C16.654 12.1324 16.4855 12.1324 16.317 12.1324H15.98V13.5085H15.9519Z",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Group_7"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group_8"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_8",
+											"d": "M11.0372 4.63391L11.3461 5.56069H12.301L11.5427 6.12238L11.8236 7.02107L11.0372 6.45939L10.2789 7.02107L10.5598 6.12238L9.80151 5.56069H10.7564L11.0372 4.63391Z",
+											"fill": "#F7BC37"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group_9"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_9",
+											"d": "M14.3231 5.53259L14.632 6.43129H15.5869L14.8005 6.99297L15.1095 7.91975L14.3231 7.35807L13.5648 7.91975L13.8457 6.99297L13.0593 6.43129H14.0423L14.3231 5.53259Z",
+											"fill": "#F7BC37"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group_10"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_10",
+											"d": "M17.0472 7.9198L17.3281 8.81849H18.2829L17.5247 9.38018L17.8055 10.307L17.0472 9.74528L16.2609 10.307L16.5698 9.38018L15.7834 8.81849H16.7383L17.0472 7.9198Z",
+											"fill": "#F7BC37"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group_11"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_11",
+											"d": "M11.0372 19.7714L11.3461 20.6981H12.301L11.5427 21.2598L11.8236 22.1585L11.0372 21.5968L10.2789 22.1585L10.5598 21.2598L9.80151 20.6981H10.7564L11.0372 19.7714Z",
+											"fill": "#F7BC37"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group_12"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_12",
+											"d": "M14.3231 18.985L14.632 19.8837H15.5869L14.8005 20.4454L15.1095 21.3721L14.3231 20.8105L13.5648 21.3721L13.8457 20.4454L13.0593 19.8837H14.0423L14.3231 18.985Z",
+											"fill": "#F7BC37"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group_13"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_13",
+											"d": "M17.0472 17.019L17.3281 17.9458H18.2829L17.5247 18.5075L17.8055 19.4062L17.0472 18.8445L16.2609 19.4062L16.5698 18.5075L15.7834 17.9458H16.7383L17.0472 17.019Z",
+											"fill": "#F7BC37"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group_14"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_14",
+											"d": "M7.77942 5.53259L7.47049 6.43129H6.51562L7.30199 6.99297L6.99306 7.91975L7.77942 7.35807L8.53769 7.91975L8.25685 6.99297L9.01512 6.43129H8.06026L7.77942 5.53259Z",
+											"fill": "#F7BC37"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group_15"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_15",
+											"d": "M5.05529 7.9198L4.77444 8.81849H3.81958L4.57785 9.38018L4.29701 10.307L5.05529 9.74528L5.84165 10.307L5.53272 9.38018L6.31908 8.81849H5.36421L5.05529 7.9198Z",
+											"fill": "#F7BC37"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group_16"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_16",
+											"d": "M7.77942 18.985L7.47049 19.8837H6.51562L7.30199 20.4454L6.99306 21.3721L7.77942 20.8105L8.53769 21.3721L8.25685 20.4454L9.01512 19.8837H8.06026L7.77942 18.985Z",
+											"fill": "#F7BC37"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group_17"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_17",
+											"d": "M5.05529 17.019L4.77444 17.9458H3.81958L4.57785 18.5075L4.29701 19.4062L5.05529 18.8445L5.84165 19.4062L5.53272 18.5075L6.31908 17.9458H5.36421L5.05529 17.019Z",
+											"fill": "#F7BC37"
+										},
+										"children": []
+									}
+								]
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Gdpr"
+}
diff --git a/app/components/base/icons/src/public/common/Gdpr.tsx b/app/components/base/icons/src/public/common/Gdpr.tsx
new file mode 100644
index 0000000..5141b57
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Gdpr.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Gdpr.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Gdpr'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/Github.json b/app/components/base/icons/src/public/common/Github.json
new file mode 100644
index 0000000..523bcd5
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Github.json
@@ -0,0 +1,36 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "18",
+			"height": "18",
+			"viewBox": "0 0 18 18",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "github"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M9 1.125C4.64906 1.125 1.125 4.64906 1.125 9C1.125 12.4847 3.37922 15.428 6.50953 16.4714C6.90328 16.5403 7.05094 16.3041 7.05094 16.0973C7.05094 15.9103 7.04109 15.2902 7.04109 14.6306C5.0625 14.9948 4.55062 14.1483 4.39312 13.7053C4.30453 13.4789 3.92063 12.78 3.58594 12.593C3.31031 12.4453 2.91656 12.0811 3.57609 12.0712C4.19625 12.0614 4.63922 12.6422 4.78688 12.8784C5.49563 14.0695 6.62766 13.7348 7.08047 13.5281C7.14938 13.0163 7.35609 12.6717 7.5825 12.4748C5.83031 12.278 3.99938 11.5987 3.99938 8.58656C3.99938 7.73016 4.30453 7.02141 4.80656 6.47016C4.72781 6.27328 4.45219 5.46609 4.88531 4.38328C4.88531 4.38328 5.54484 4.17656 7.05094 5.19047C7.68094 5.01328 8.35031 4.92469 9.01969 4.92469C9.68906 4.92469 10.3584 5.01328 10.9884 5.19047C12.4945 4.16672 13.1541 4.38328 13.1541 4.38328C13.5872 5.46609 13.3116 6.27328 13.2328 6.47016C13.7348 7.02141 14.04 7.72031 14.04 8.58656C14.04 11.6086 12.1992 12.278 10.447 12.4748C10.7325 12.7209 10.9786 13.1934 10.9786 13.9317C10.9786 14.985 10.9688 15.8316 10.9688 16.0973C10.9688 16.3041 11.1164 16.5502 11.5102 16.4714C13.0735 15.9436 14.432 14.9389 15.3943 13.5986C16.3567 12.2583 16.8746 10.65 16.875 9C16.875 4.64906 13.3509 1.125 9 1.125Z",
+							"fill": "#24292F"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Github"
+}
diff --git a/app/components/base/icons/src/public/common/Github.tsx b/app/components/base/icons/src/public/common/Github.tsx
new file mode 100644
index 0000000..9c6f418
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Github.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Github.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Github'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/Highlight.json b/app/components/base/icons/src/public/common/Highlight.json
new file mode 100644
index 0000000..055d9f7
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Highlight.json
@@ -0,0 +1,67 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"xmlns": "http://www.w3.org/2000/svg",
+			"width": "46",
+			"height": "24",
+			"viewBox": "0 0 46 24",
+			"fill": "none"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"opacity": "0.5",
+					"d": "M-6.5 8C-6.5 3.58172 -2.91828 0 1.5 0H45.5L33.0248 24H1.49999C-2.91829 24 -6.5 20.4183 -6.5 16V8Z",
+					"fill": "url(#paint0_linear_6333_42118)"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint0_linear_6333_42118",
+							"x1": "1.81679",
+							"y1": "5.47784e-07",
+							"x2": "101.257",
+							"y2": "30.3866",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.12"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "white",
+									"stop-opacity": "0.3"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Highlight"
+}
diff --git a/app/components/base/icons/src/public/common/Highlight.tsx b/app/components/base/icons/src/public/common/Highlight.tsx
new file mode 100644
index 0000000..261b589
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Highlight.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Highlight.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Highlight'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/Iso.json b/app/components/base/icons/src/public/common/Iso.json
new file mode 100644
index 0000000..50f0267
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Iso.json
@@ -0,0 +1,121 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"fill": "none",
+			"height": "64",
+			"viewBox": "0 0 64 64",
+			"width": "64",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "m8 9.82143c0-2.6628 2.2386-4.82143 5-4.82143h38c2.7614 0 5 2.15863 5 4.82143v44.35717c0 2.6628-2.2386 4.8214-5 4.8214h-38c-2.7614 0-5-2.1586-5-4.8214z",
+					"fill": "#2a3e92"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"fill": "#fff"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "m43.4424 46.9899v-1.84h3.08v7.31h-2.05v-5.47z"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "m36.5801 48.7c0-1.1467.2333-2.05.7-2.71.4666-.66 1.2-.99 2.2-.99s1.7333.33 2.2.99c.4733.66.71 1.5633.71 2.71 0 1.16-.2334 2.07-.7 2.73-.4667.66-1.2034.99-2.21.99-1.0067 0-1.7434-.33-2.21-.99-.46-.66-.69-1.57-.69-2.73zm3.87 0c0-.6-.0634-1.0567-.19-1.37-.1267-.32-.3867-.48-.78-.48-.3934 0-.6534.16-.78.48-.1267.3133-.19.77-.19 1.37 0 .6133.06 1.08.18 1.4.1266.3133.39.47.79.47s.66-.1567.78-.47c.1266-.32.19-.7867.19-1.4z"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "m29.5078 48.7c0-1.1467.2333-2.05.7-2.71s1.2-.99 2.2-.99 1.7333.33 2.2.99c.4733.66.71 1.5633.71 2.71 0 1.16-.2333 2.07-.7 2.73s-1.2033.99-2.21.99-1.7433-.33-2.21-.99c-.46-.66-.69-1.57-.69-2.73zm3.87 0c0-.6-.0633-1.0567-.19-1.37-.1267-.32-.3867-.48-.78-.48s-.6533.16-.78.48c-.1267.3133-.19.77-.19 1.37 0 .6133.06 1.08.18 1.4.1267.3133.39.47.79.47s.66-.1567.78-.47c.1267-.32.19-.7867.19-1.4z"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "m28.4533 46.6099-2.4 5.85h-2.01l2.42-5.62h-2.85v-1.68h4.84z"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "m17.52 50.89c.6467-.5067 1.1767-.9433 1.59-1.31s.76-.7433 1.04-1.13c.28-.3933.42-.7667.42-1.12 0-.2133-.05-.38-.15-.5-.0933-.12-.2333-.18-.42-.18-.1933 0-.3433.0833-.45.25-.1067.16-.1567.3967-.15.71h-1.9c.02-.5933.15-1.0833.39-1.47.24-.3933.5533-.68.94-.86.3867-.1867.8167-.28 1.29-.28.82 0 1.43.2033 1.83.61s.6.9333.6 1.58c0 .6933-.2333 1.3433-.7 1.95-.46.6067-1.0367 1.15-1.73 1.63h2.5v1.59h-5.1z"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"clip-rule": "evenodd",
+							"d": "m32.5672 11.0281c1.0059.0357 2.2045.2319 3.2746.5387 3.289.9417 6.1071 2.9857 8.1332 5.8894.1106.1605.2033.3103.2033.3317 0 .0286-.1605.0393-.5136.0393h-.5137l-.1641-.2319c-.453-.6278-1.3377-1.6123-1.9191-2.1296l-.2497-.2212-.61.1534c-1.0916.2676-2.2937.4852-3.4923.6314-.2711.0357-.4923.0749-.4923.0856 0 .0143.05.1855.1106.3782.1391.4601.3532 1.2306.3532 1.2877 0 .0357-.1106.0464-.4459.0464h-.4424l-.0606-.2069c-.0144-.0559-.0371-.1365-.0606-.22-.0229-.0816-.0466-.1661-.0643-.233-.1141-.3924-.2889-.9239-.3174-.956-.0143-.0179-.2497-.0143-.5208.0071-.2676.0214-1.0274.0571-1.6838.082-1.2592.0428-3.0321.0036-4.2164-.0963-.3032-.0249-.5636-.0357-.5778-.0214-.0286.0286-.2854.8312-.4067 1.2842l-.0963.3603h-.4388c-.4031 0-.4423-.0071-.4423-.0642 0-.0785.2033-.8347.3567-1.3234.0607-.1855.0963-.3496.0785-.3639-.0143-.0107-.1926-.0428-.3995-.0642-.9739-.1106-2.3865-.371-3.4673-.635l-.6671-.1641-.1891.1606c-.5743.4922-1.4982 1.5053-1.9726 2.1581l-.214.2961h-.5244c-.2925 0-.528-.0107-.528-.0214 0-.0464.5708-.8383.8918-1.245 1.3698-1.7158 3.0464-3.0642 5.0298-4.0451 1.5124-.7492 2.9893-1.1879 4.7265-1.4126.4387-.0571 1.6016-.1178 1.8727-.0999.0678.0035.3675.0178.66.0249zm-1.2702.8884c-.824.2818-1.6088 1.1736-2.3293 2.6468-.1641.3318-.3068.635-.3175.6671-.0179.0499.0107.0642.1641.0821.8846.0963 3.2033.1462 4.4661.0927 1.516-.0642 1.6587-.0749 1.6587-.1427 0-.0892-.5351-1.1629-.7634-1.5267-.4637-.7491-.9239-1.27-1.3947-1.5803-.4959-.321-.9988-.4031-1.484-.239zm-1.9937.139c-1.912.4031-3.4745 1.0487-5.1082 2.1189-.3996.2604-.528.371-.4281.371.0123 0 .1824.0368.3973.0833l.1093.0237c.8632.1962 2.6646.4922 3.2925.5422l.1355.0107.1498-.3567c.4352-1.0167 1.113-2.1261 1.6623-2.704.1213-.1284.1213-.1319.0393-.1284-.05.0036-.1605.0179-.2497.0393zm5.6573 1.2843c-.2069-.3318-.6135-.8918-.8597-1.1772l-.0035-.004c-.0584-.0664-.0945-.1073-.0853-.126.0148-.0301.1474-.0021.4938.0711l.0088.0018c1.673.3532 3.3567 1.0666 4.8764 2.069.2782.1819.5065.346.5065.3639 0 .0891-2.6576.5564-3.7812.667l-.2319.0214-.1248-.3103c-.1641-.4174-.5458-1.1665-.7991-1.5767z",
+							"fill-rule": "evenodd"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "m30.8906 19.1863c.5565.0678.8704.082 2.365.0927l1.7194.0143v3.849h-3.0642l-.0214-.8383-.214-.0856c-.6136-.2426-1.4376-.3746-2.3544-.3781-.9025 0-1.3091.0784-1.6979.3388-.3996.2605-.4566.792-.1249 1.1201.346.3496.7705.4602 2.6611.6956 1.6338.2069 2.2652.3389 3.0571.6493.3817.1498.8633.4316 1.1629.6849.4423.3674.8062.9738.9738 1.6159.1249.478.1606 1.3983.0714 1.887-.1534.8348-.4673 1.434-1.0416 1.9798-.6207.5922-1.4198.981-2.522 1.2271-1.2164.2747-2.9394.3175-4.6659.1213-.5922-.0642-.9346-.0785-2.3579-.0892l-1.6694-.0142v-3.8133h3.0677v.7847l.1391.0714c.4531.2283 1.3841.3959 2.3651.4173 1.6908.0428 2.4506-.2568 2.4542-.9702 0-.2783-.0785-.4281-.3139-.5922-.3425-.2426-.824-.3531-2.3615-.5493-1.8478-.239-2.579-.4067-3.3817-.7848-1.2806-.6064-1.912-1.5303-2.0404-2.9857-.0713-.7706.0535-1.4911.3567-2.1189.6814-1.4091 2.2402-2.2188 4.6552-2.4186.4851-.0392 2.1617.0143 2.7824.0892z"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"clip-rule": "evenodd",
+							"d": "m48.2307 20.9806c-.981-.9774-2.2474-1.5767-3.8383-1.8157-.3924-.0607-1.8371-.1035-2.1938-.0678-1.0631.1106-1.9228.3353-2.7182.7099-1.9049.9025-3.0892 2.579-3.3817 4.7907-.0607.4673-.0714 1.5945-.0179 2.0404.1356 1.1166.4745 2.0726 1.0238 2.9073.4531.6849 1.2913 1.4375 2.0797 1.8656 1.1665.635 2.7967.9524 4.3983.8597 3.0571-.1819 5.2295-1.6873 6.0678-4.2057.2461-.742.3496-1.4483.3496-2.39.0035-1.9655-.5743-3.4994-1.7693-4.6944zm-7.7841 3.6847c.214-1.5268.906-2.3722 2.0939-2.5541.2961-.0464.9132-.0179 1.2093.0499.5279.1284 1.0023.4566 1.2949.9025.4209.635.5957 1.4019.5957 2.6112-.0036 1.4732-.2533 2.3258-.874 2.9429-.4459.4495-.8561.6136-1.6088.6492-1.4447.0678-2.3187-.6635-2.6575-2.2259-.1071-.4994-.1356-1.78-.0535-2.3757z",
+							"fill-rule": "evenodd"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "m22.2402 22.5002h-2.069v6.4209h2.069v3.1748l-8.2224-.0178-.0107-1.5803-.0071-1.5767h2.069v-6.4209l-1.0238-.0071-1.0274-.0107-.0107-1.5803-.0071-1.5767h8.2402z"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"clip-rule": "evenodd",
+							"d": "m22.5684 35.9913c-.5601-.4852-1.5518-1.5874-2.0048-2.2295l-.1177-.1677h-.5315c-.4174 0-.528.0107-.5066.0428.4495.767 1.4769 2.0012 2.2973 2.7646 2.3865 2.2188 5.1367 3.503 8.4007 3.9239.6278.0785 2.547.0892 3.2105.0178 4.0202-.4459 7.6551-2.472 10.1165-5.6432.2747-.3532.7455-1.031.7455-1.0773 0-.0143-.2318-.0286-.5136-.0286h-.5101l-.3104.4067c-.1676.2247-.4816.6064-.6956.8525-.371.4174-1.1415 1.1843-1.3127 1.2985-.0713.0464-.132.0392-.6421-.0928-.9845-.2497-2.283-.4958-3.3282-.6278-.2461-.0285-.4958-.0642-.56-.0749l-.1142-.0178.0892-.2569c.0963-.2782.4067-1.3912.4067-1.4518 0-.025-.1499-.0357-.4495-.0285l-.4495.0107-.1177.428c-.0642.2355-.1712.5957-.239.8026l-.1213.3746h-.2318c-.1249 0-.5886-.025-1.0309-.0535-1.4091-.0928-4.4126-.0607-5.5648.0571l-.1998.0214-.1498-.4745-.0158-.053c-.0769-.2586-.1768-.5945-.2268-.7746l-.0963-.346h-.4388c-.3995 0-.4423.0072-.4423.0642 0 .0785.2105.8419.3567 1.3021.0607.1962.107.3567.0999.3602-.0071.0036-.2997.0428-.6528.0857-1.1415.1391-2.2473.3424-3.3639.6171l-.5814.1427zm7.698.0141c-.9631.0535-1.623.0927-1.6337.1034-.0286.0286.4209.9525.6563 1.3591.5066.8704 1.006 1.4554 1.5196 1.7907.3354.2176.5387.289.8704.3175.3246.025.5601-.0285.9239-.214.4103-.2105 1.0024-.8062 1.4055-1.4162.2675-.4031.931-1.6694.931-1.7764 0-.0571-.0749-.0678-.7669-.1142-.585-.0392-3.4352-.0749-3.9061-.0499zm-3.7032.3211c.3603-.0499.7027-.0963.7598-.1035.0606-.0107.1676-.0142.2425-.0107l.1356.0036.1712.3924c.4424 1.0166.9881 1.9156 1.566 2.5755.107.1249.1748.2247.1534.2247s-.264-.0463-.5386-.107c-1.327-.2782-2.654-.7812-3.874-1.4625-.4709-.2604-1.409-.8633-1.4732-.9418-.0286-.0356.0998-.0749.5778-.1783.7527-.1605 1.4233-.2747 2.2795-.3924zm9.2354.0962c-.132.3353-.5743 1.2129-.8062 1.5946-.2497.4137-.5529.8347-.8169 1.1379-.1105.1284-.1926.2354-.1855.2461.0393.0393 1.2521-.2532 1.9014-.4601 1.1664-.371 2.6361-1.0987 3.6991-1.83l.3139-.2176-.189-.0428c-.956-.2212-2.1011-.4281-3.0107-.5458-.3139-.0392-.6279-.0785-.6956-.0892-.0483-.0055-.0779-.0089-.101.0018-.0367.017-.057.0694-.1095.2051z",
+							"fill-rule": "evenodd"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Iso"
+}
diff --git a/app/components/base/icons/src/public/common/Iso.tsx b/app/components/base/icons/src/public/common/Iso.tsx
new file mode 100644
index 0000000..db4b515
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Iso.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Iso.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Iso'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/Line3.json b/app/components/base/icons/src/public/common/Line3.json
new file mode 100644
index 0000000..2beb66a
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Line3.json
@@ -0,0 +1,28 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "5",
+			"height": "12",
+			"viewBox": "0 0 5 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"id": "Line 3",
+					"d": "M1 11.3545L3.94174 0.645781",
+					"stroke": "#D0D5DD",
+					"stroke-linecap": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Line3"
+}
diff --git a/app/components/base/icons/src/public/common/Line3.tsx b/app/components/base/icons/src/public/common/Line3.tsx
new file mode 100644
index 0000000..a1fb899
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Line3.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Line3.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Line3'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/Lock.json b/app/components/base/icons/src/public/common/Lock.json
new file mode 100644
index 0000000..a5a1f4b
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Lock.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "lock"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M8 1.75C6.27411 1.75 4.875 3.14911 4.875 4.875V6.125C3.83947 6.125 3 6.96444 3 8V12.375C3 13.4106 3.83947 14.25 4.875 14.25H11.125C12.1606 14.25 13 13.4106 13 12.375V8C13 6.96444 12.1606 6.125 11.125 6.125V4.875C11.125 3.14911 9.72587 1.75 8 1.75ZM9.875 6.125V4.875C9.875 3.83947 9.03556 3 8 3C6.96444 3 6.125 3.83947 6.125 4.875V6.125H9.875ZM8 8.625C8.34519 8.625 8.625 8.90481 8.625 9.25V11.125C8.625 11.4702 8.34519 11.75 8 11.75C7.65481 11.75 7.375 11.4702 7.375 11.125V9.25C7.375 8.90481 7.65481 8.625 8 8.625Z",
+							"fill": "#155AEF"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Lock"
+}
diff --git a/app/components/base/icons/src/public/common/Lock.tsx b/app/components/base/icons/src/public/common/Lock.tsx
new file mode 100644
index 0000000..1fce8bb
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Lock.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Lock.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Lock'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/MessageChatSquare.json b/app/components/base/icons/src/public/common/MessageChatSquare.json
new file mode 100644
index 0000000..71cf6d0
--- /dev/null
+++ b/app/components/base/icons/src/public/common/MessageChatSquare.json
@@ -0,0 +1,37 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M8.77438 6.6665H12.5591C12.9105 6.66649 13.2137 6.66648 13.4634 6.68688C13.727 6.70842 13.9891 6.75596 14.2414 6.88449C14.6177 7.07624 14.9237 7.3822 15.1154 7.75852C15.244 8.01078 15.2915 8.27292 15.313 8.53649C15.3334 8.7862 15.3334 9.08938 15.3334 9.44082V11.2974C15.3334 11.5898 15.3334 11.8421 15.3192 12.0509C15.3042 12.2708 15.2712 12.4908 15.1812 12.7081C14.9782 13.1981 14.5888 13.5875 14.0988 13.7905C13.8815 13.8805 13.6616 13.9135 13.4417 13.9285C13.4068 13.9308 13.3707 13.9328 13.3334 13.9345V14.6665C13.3334 14.9147 13.1955 15.1424 12.9756 15.2573C12.7556 15.3723 12.49 15.3556 12.2862 15.2139L10.8353 14.2051C10.6118 14.0498 10.5666 14.0214 10.5238 14.0021C10.4746 13.9798 10.4228 13.9635 10.3696 13.9537C10.3235 13.9452 10.2702 13.9427 9.99803 13.9427H8.7744C8.42296 13.9427 8.11978 13.9427 7.87006 13.9223C7.6065 13.9008 7.34435 13.8532 7.0921 13.7247C6.71578 13.533 6.40981 13.227 6.21807 12.8507C6.08954 12.5984 6.04199 12.3363 6.02046 12.0727C6.00006 11.823 6.00007 11.5198 6.00008 11.1684V9.44081C6.00007 9.08938 6.00006 8.7862 6.02046 8.53649C6.04199 8.27292 6.08954 8.01078 6.21807 7.75852C6.40981 7.3822 6.71578 7.07624 7.0921 6.88449C7.34435 6.75596 7.6065 6.70842 7.87006 6.68688C8.11978 6.66648 8.42295 6.66649 8.77438 6.6665Z",
+					"fill": "#444CE7"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M9.4943 0.666504H4.5059C3.96926 0.666496 3.52635 0.666489 3.16555 0.695967C2.79082 0.726584 2.44635 0.792293 2.12279 0.957154C1.62103 1.21282 1.21308 1.62076 0.957417 2.12253C0.792557 2.44609 0.726847 2.79056 0.69623 3.16529C0.666752 3.52608 0.666759 3.96899 0.666768 4.50564L0.666758 7.6804C0.666669 7.97482 0.666603 8.19298 0.694924 8.38632C0.86568 9.55207 1.78121 10.4676 2.94695 10.6383C2.99461 10.6453 3.02432 10.6632 3.03714 10.6739L3.03714 11.7257C3.03711 11.9075 3.03708 12.0858 3.04976 12.2291C3.06103 12.3565 3.09053 12.6202 3.27795 12.8388C3.48686 13.0825 3.80005 13.2111 4.11993 13.1845C4.40689 13.1607 4.61323 12.9938 4.71072 12.9111C4.73849 12.8875 4.76726 12.8618 4.7968 12.8344C4.73509 12.594 4.70707 12.3709 4.69157 12.1813C4.66659 11.8756 4.66668 11.5224 4.66676 11.1966V9.41261C4.66668 9.08685 4.66659 8.73364 4.69157 8.42793C4.71984 8.08191 4.78981 7.62476 5.03008 7.15322C5.34965 6.52601 5.85959 6.01608 6.4868 5.6965C6.95834 5.45624 7.41549 5.38627 7.7615 5.358C8.06722 5.33302 8.42041 5.3331 8.74617 5.33318H12.5873C12.8311 5.33312 13.0903 5.33306 13.3334 5.3435V4.50562C13.3334 3.96898 13.3334 3.52608 13.304 3.16529C13.2734 2.79056 13.2076 2.44609 13.0428 2.12253C12.7871 1.62076 12.3792 1.21282 11.8774 0.957154C11.5539 0.792293 11.2094 0.726584 10.8347 0.695967C10.4739 0.666489 10.0309 0.666496 9.4943 0.666504Z",
+					"fill": "#444CE7"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "MessageChatSquare"
+}
diff --git a/app/components/base/icons/src/public/common/MessageChatSquare.tsx b/app/components/base/icons/src/public/common/MessageChatSquare.tsx
new file mode 100644
index 0000000..85ccc0b
--- /dev/null
+++ b/app/components/base/icons/src/public/common/MessageChatSquare.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './MessageChatSquare.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'MessageChatSquare'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/MultiPathRetrieval.json b/app/components/base/icons/src/public/common/MultiPathRetrieval.json
new file mode 100644
index 0000000..9d64eda
--- /dev/null
+++ b/app/components/base/icons/src/public/common/MultiPathRetrieval.json
@@ -0,0 +1,153 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "36",
+			"height": "36",
+			"viewBox": "0 0 36 36",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_13429_43710)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "rect",
+						"attributes": {
+							"width": "36",
+							"height": "36",
+							"rx": "8",
+							"fill": "#FFF6ED"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"opacity": "0.7",
+							"d": "M22.25 28C22.25 29.7949 20.7949 31.25 19 31.25C17.2051 31.25 15.75 29.7949 15.75 28C15.75 26.2051 17.2051 24.75 19 24.75C20.7949 24.75 22.25 26.2051 22.25 28Z",
+							"stroke": "#FB6514",
+							"stroke-width": "1.5"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M19 12C21.2091 12 23 10.2091 23 8C23 5.79086 21.2091 4 19 4C16.7909 4 15 5.79086 15 8C15 10.2091 16.7909 12 19 12Z",
+							"fill": "#FB6514"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M15 22C17.2091 22 19 20.2091 19 18C19 15.7909 17.2091 14 15 14C12.7909 14 11 15.7909 11 18C11 20.2091 12.7909 22 15 22Z",
+							"fill": "#FB6514"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M36 23C38.7614 23 41 20.7614 41 18C41 15.2386 38.7614 13 36 13C33.2386 13 31 15.2386 31 18C31 20.7614 33.2386 23 36 23Z",
+							"fill": "#FB6514"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M0 18H10",
+							"stroke": "#FB6514",
+							"stroke-width": "1.5"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M20 18L30 18",
+							"stroke": "#FB6514",
+							"stroke-width": "1.5"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M0.00112438 15C0.00112438 15 -5.64364 15 0.851673 15C7.34699 15 7.84654 8 14 8",
+							"stroke": "#FB6514",
+							"stroke-width": "1.5"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M23.75 9.28125C26.5688 10.1847 27.699 13.2045 30.625 15.0312",
+							"stroke": "#FB6514",
+							"stroke-width": "1.5"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"opacity": "0.7",
+							"d": "M-0.000543833 21C-0.000543833 21 -5.57819 21 0.893635 21C7.36546 21 7.8688 28 14 28",
+							"stroke": "#FB6514",
+							"stroke-width": "1.5"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_13429_43710"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "36",
+									"height": "36",
+									"rx": "8",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "MultiPathRetrieval"
+}
diff --git a/app/components/base/icons/src/public/common/MultiPathRetrieval.tsx b/app/components/base/icons/src/public/common/MultiPathRetrieval.tsx
new file mode 100644
index 0000000..a325900
--- /dev/null
+++ b/app/components/base/icons/src/public/common/MultiPathRetrieval.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './MultiPathRetrieval.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'MultiPathRetrieval'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/NTo1Retrieval.json b/app/components/base/icons/src/public/common/NTo1Retrieval.json
new file mode 100644
index 0000000..74ca345
--- /dev/null
+++ b/app/components/base/icons/src/public/common/NTo1Retrieval.json
@@ -0,0 +1,146 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "36",
+			"height": "36",
+			"viewBox": "0 0 36 36",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_13429_43700)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "rect",
+						"attributes": {
+							"width": "36",
+							"height": "36",
+							"rx": "8",
+							"fill": "#EEF4FF"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"opacity": "0.7",
+							"d": "M23.25 28C23.25 29.7949 21.7949 31.25 20 31.25C18.2051 31.25 16.75 29.7949 16.75 28C16.75 26.2051 18.2051 24.75 20 24.75C21.7949 24.75 23.25 26.2051 23.25 28Z",
+							"stroke": "#444CE7",
+							"stroke-width": "1.5"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"opacity": "0.7",
+							"d": "M23.25 8C23.25 9.79493 21.7949 11.25 20 11.25C18.2051 11.25 16.75 9.79493 16.75 8C16.75 6.20507 18.2051 4.75 20 4.75C21.7949 4.75 23.25 6.20507 23.25 8Z",
+							"stroke": "#444CE7",
+							"stroke-width": "1.5"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M16 22C18.2091 22 20 20.2091 20 18C20 15.7909 18.2091 14 16 14C13.7909 14 12 15.7909 12 18C12 20.2091 13.7909 22 16 22Z",
+							"fill": "#444CE7"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M36 23C38.7614 23 41 20.7614 41 18C41 15.2386 38.7614 13 36 13C33.2386 13 31 15.2386 31 18C31 20.7614 33.2386 23 36 23Z",
+							"fill": "#444CE7"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M0 18L11 18",
+							"stroke": "#444CE7",
+							"stroke-width": "1.5"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M21 18L30 18",
+							"stroke": "#444CE7",
+							"stroke-width": "1.5"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"opacity": "0.7",
+							"d": "M-0.00160408 15C-0.00160408 15 -6.00089 15 1.12411 15C8.24911 15 8.24908 8.25 14.9991 8.25",
+							"stroke": "#444CE7",
+							"stroke-width": "1.5"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"opacity": "0.7",
+							"d": "M0.000488281 21C0.000488281 21 -5.92692 21 1.17228 21C8.27148 21 8.27423 27.75 14.9998 27.75",
+							"stroke": "#444CE7",
+							"stroke-width": "1.5"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_13429_43700"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "36",
+									"height": "36",
+									"rx": "8",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "NTo1Retrieval"
+}
diff --git a/app/components/base/icons/src/public/common/NTo1Retrieval.tsx b/app/components/base/icons/src/public/common/NTo1Retrieval.tsx
new file mode 100644
index 0000000..1afa979
--- /dev/null
+++ b/app/components/base/icons/src/public/common/NTo1Retrieval.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './NTo1Retrieval.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'NTo1Retrieval'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/Notion.json b/app/components/base/icons/src/public/common/Notion.json
new file mode 100644
index 0000000..d27aeb8
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Notion.json
@@ -0,0 +1,83 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "20",
+			"height": "20",
+			"viewBox": "0 0 20 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_5364_42310)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M3.5725 18.2611L1.4229 15.5832C0.905706 14.9389 0.625 14.1466 0.625 13.3312V3.63437C0.625 2.4129 1.60224 1.39936 2.86295 1.31328L12.8326 0.632614C13.5569 0.583164 14.2768 0.775682 14.8717 1.17794L18.3745 3.5462C19.0015 3.97012 19.375 4.66312 19.375 5.40266V16.427C19.375 17.6223 18.4141 18.6121 17.1798 18.688L6.11458 19.3692C5.12958 19.4298 4.17749 19.0148 3.5725 18.2611Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M7.03006 8.48663V8.35968C7.03006 8.03787 7.28779 7.77098 7.61997 7.7488L10.0396 7.58726L13.3857 12.5146V8.19003L12.5244 8.07522V8.01492C12.5244 7.68933 12.788 7.42068 13.1244 7.40344L15.326 7.29066V7.60749C15.326 7.75622 15.2154 7.88343 15.0638 7.90907L14.534 7.99868V15.0022L13.8691 15.2309C13.3136 15.4219 12.6952 15.2174 12.3772 14.7376L9.12879 9.83568V14.5143L10.1287 14.7056L10.1147 14.7984C10.0711 15.0889 9.82028 15.3086 9.51687 15.3221L7.03006 15.4328C6.99718 15.1204 7.23132 14.8409 7.55431 14.807L7.88143 14.7726V8.53447L7.03006 8.48663Z",
+							"fill": "black"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M12.9218 1.85418L2.95217 2.53485C2.35499 2.57562 1.89209 3.05572 1.89209 3.63431V13.3311C1.89209 13.8748 2.07923 14.4029 2.42402 14.8325L4.57362 17.5104C4.92117 17.9433 5.46812 18.1817 6.03397 18.1469L17.0991 17.4658C17.6663 17.4309 18.1078 16.9761 18.1078 16.4269V5.4026C18.1078 5.06281 17.9362 4.74441 17.6481 4.54963L14.1453 2.18137C13.7883 1.94002 13.3564 1.82451 12.9218 1.85418ZM3.44654 3.78556C3.30788 3.6829 3.37387 3.46903 3.54806 3.45654L12.9889 2.77938C13.2897 2.75781 13.5886 2.84064 13.8318 3.01299L15.7261 4.35502C15.798 4.40597 15.7642 4.51596 15.6752 4.5208L5.67742 5.06454C5.37485 5.081 5.0762 4.99211 4.83563 4.814L3.44654 3.78556ZM5.20848 6.76913C5.20848 6.44433 5.47088 6.17604 5.80642 6.15777L16.3769 5.5821C16.7039 5.56429 16.9792 5.81577 16.9792 6.13232V15.6782C16.9792 16.0024 16.7177 16.2705 16.3829 16.2895L5.8793 16.8871C5.51537 16.9079 5.20848 16.6282 5.20848 16.2759V6.76913Z",
+							"fill": "black"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_5364_42310"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "20",
+									"height": "20",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Notion"
+}
diff --git a/app/components/base/icons/src/public/common/Notion.tsx b/app/components/base/icons/src/public/common/Notion.tsx
new file mode 100644
index 0000000..33b7c31
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Notion.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Notion.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Notion'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/Soc2.json b/app/components/base/icons/src/public/common/Soc2.json
new file mode 100644
index 0000000..38b9c5e
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Soc2.json
@@ -0,0 +1,938 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "28",
+			"height": "28",
+			"viewBox": "0 0 28 28",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Group 7"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M14 28C21.732 28 28 21.732 28 14C28 6.26801 21.732 0 14 0C6.26801 0 0 6.26801 0 14C0 21.732 6.26801 28 14 28Z",
+							"fill": "url(#paint0_linear_6186_11887)"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M13.9999 24.8636C19.9997 24.8636 24.8636 19.9997 24.8636 13.9999C24.8636 8.00006 19.9997 3.13623 13.9999 3.13623C8.00006 3.13623 3.13623 8.00006 3.13623 13.9999C3.13623 19.9997 8.00006 24.8636 13.9999 24.8636Z",
+							"fill": "url(#paint1_linear_6186_11887)"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Group"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_3",
+									"d": "M5.43048 23.2492C5.46819 23.2107 5.48424 23.1666 5.47862 23.1177C5.473 23.0687 5.44412 22.9997 5.39197 22.909C5.33901 22.8192 5.30772 22.7462 5.29809 22.69C5.28365 22.6106 5.30291 22.5432 5.35586 22.4878C5.40721 22.4341 5.4714 22.4124 5.54762 22.4212C5.62384 22.43 5.69605 22.4678 5.76425 22.5344C5.81079 22.5793 5.84368 22.6282 5.86294 22.6812C5.8822 22.7341 5.88621 22.7871 5.87578 22.8384C5.86535 22.8898 5.84048 22.9355 5.80277 22.9748L5.74339 22.9171C5.78993 22.8689 5.80999 22.8152 5.80597 22.755C5.80116 22.6948 5.77147 22.6379 5.71692 22.5841C5.66316 22.5327 5.6094 22.5031 5.55484 22.4966C5.50028 22.4902 5.45455 22.5055 5.41684 22.544C5.38234 22.5793 5.3687 22.6226 5.37512 22.6724C5.38154 22.7221 5.40802 22.7863 5.45455 22.8641C5.50028 22.9419 5.53077 23.0053 5.54521 23.0551C5.55966 23.1048 5.56287 23.1497 5.55404 23.1915C5.54522 23.2332 5.52435 23.2709 5.49066 23.3054C5.4377 23.3608 5.37271 23.3832 5.29649 23.3736C5.22027 23.364 5.14645 23.3247 5.07424 23.2557C5.0253 23.2083 4.98839 23.1554 4.96432 23.0984C4.94025 23.0414 4.93303 22.9861 4.94186 22.9339C4.95148 22.8818 4.97555 22.8352 5.01487 22.7943L5.07424 22.8513C5.0269 22.9002 5.00765 22.9572 5.01647 23.0214C5.0261 23.0856 5.0606 23.1465 5.12158 23.2059C5.17614 23.2581 5.2315 23.2885 5.28686 23.2966C5.34303 23.3046 5.39036 23.2885 5.42888 23.2492H5.43048Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_4",
+									"d": "M6.31617 23.7556C6.2584 23.8238 6.19662 23.8744 6.12923 23.9065C6.06183 23.9386 5.99524 23.9498 5.92784 23.941C5.86044 23.9321 5.79786 23.9033 5.74009 23.8551C5.65344 23.7821 5.60931 23.6922 5.60771 23.5855C5.6061 23.4788 5.65023 23.3721 5.73849 23.267L5.80268 23.19C5.85964 23.1226 5.92223 23.072 5.98962 23.0399C6.05702 23.0078 6.12522 22.9958 6.19261 23.0046C6.26001 23.0135 6.32259 23.0415 6.37956 23.0897C6.43652 23.1378 6.47584 23.194 6.4967 23.2582C6.51756 23.3224 6.51836 23.3898 6.49991 23.4604C6.48145 23.531 6.44455 23.6 6.38999 23.6666L6.31537 23.7556H6.31617ZM6.32099 23.6224C6.39641 23.5326 6.43492 23.4459 6.43652 23.3609C6.43893 23.2758 6.40443 23.2044 6.33382 23.145C6.26482 23.0873 6.1886 23.0664 6.10436 23.0825C6.02091 23.0993 5.94068 23.1531 5.86365 23.2437L5.79866 23.3216C5.72485 23.4098 5.68634 23.4965 5.68393 23.5823C5.68152 23.6682 5.71522 23.7404 5.78583 23.7998C5.85724 23.8591 5.93426 23.8808 6.0161 23.8631C6.09874 23.8455 6.17817 23.7917 6.25439 23.7003L6.32018 23.6216L6.32099 23.6224Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_5",
+									"d": "M6.97267 24.3966C6.90367 24.4728 6.82825 24.5153 6.74641 24.5226C6.66457 24.5306 6.58113 24.5041 6.49769 24.4439C6.43912 24.4022 6.3982 24.3501 6.37413 24.2883C6.35006 24.2265 6.34524 24.1599 6.35969 24.0893C6.37413 24.0187 6.40542 23.9481 6.45516 23.8791L6.52898 23.7772C6.57953 23.7074 6.63649 23.6536 6.69988 23.6175C6.76326 23.5814 6.82905 23.5646 6.89565 23.5686C6.96304 23.5726 7.02643 23.5959 7.0866 23.6392C7.17085 23.7002 7.2214 23.7708 7.23744 23.8518C7.25349 23.9328 7.23664 24.0155 7.1869 24.1021L7.1195 24.054C7.19973 23.908 7.17486 23.7892 7.04649 23.6961C6.97508 23.6448 6.89886 23.6304 6.81782 23.6536C6.73678 23.6769 6.66217 23.7347 6.59477 23.8293L6.52497 23.9256C6.45918 24.0163 6.42788 24.1037 6.43029 24.188C6.4327 24.2722 6.4688 24.3388 6.53941 24.3902C6.60921 24.4407 6.6734 24.4616 6.73277 24.4536C6.79215 24.4455 6.84991 24.411 6.90608 24.3509L6.97347 24.399L6.97267 24.3966Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_6",
+									"d": "M7.31909 24.9735L7.65768 24.4119L7.55578 24.3501L7.58948 24.2939L7.69138 24.3557L7.73631 24.2811C7.77482 24.2177 7.81975 24.1792 7.87271 24.1648C7.92566 24.1503 7.98022 24.1607 8.03799 24.1952C8.06366 24.2105 8.08613 24.2289 8.10458 24.249L8.06527 24.3028C8.04922 24.2867 8.02996 24.2723 8.0075 24.2586C7.96979 24.2362 7.93368 24.2297 7.89838 24.241C7.86308 24.2522 7.83259 24.2787 7.80691 24.322L7.76038 24.399L7.90801 24.4881L7.87431 24.5443L7.72668 24.4552L7.38809 25.0168L7.31989 24.9751L7.31909 24.9735Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_7",
+									"d": "M7.82238 24.8435C7.85528 24.7825 7.8962 24.7336 7.94675 24.6975C7.99649 24.6614 8.05105 24.6413 8.10882 24.6373C8.16659 24.6333 8.22275 24.6461 8.27811 24.6758C8.36236 24.7216 8.41531 24.7874 8.43617 24.8756C8.45703 24.9631 8.44099 25.0561 8.38803 25.154L8.38001 25.1685C8.34711 25.2302 8.30539 25.2792 8.25565 25.3153C8.2059 25.3514 8.15214 25.3715 8.09438 25.3755C8.03661 25.3787 7.98044 25.3658 7.92589 25.3361C7.84164 25.2912 7.78949 25.2246 7.76863 25.1372C7.74777 25.0497 7.76381 24.9566 7.81597 24.8588L7.82319 24.8443L7.82238 24.8435ZM7.88256 24.9013C7.84164 24.9775 7.828 25.0505 7.84084 25.1203C7.85367 25.1901 7.89219 25.2423 7.95637 25.2768C8.01976 25.3105 8.08395 25.3137 8.14974 25.2864C8.21553 25.2591 8.26929 25.2054 8.31261 25.1251L8.31983 25.1115C8.34631 25.0634 8.36075 25.0136 8.36476 24.9639C8.36878 24.9141 8.35995 24.8692 8.33909 24.8291C8.31823 24.7898 8.28694 24.7585 8.24522 24.736C8.18263 24.7023 8.11845 24.6991 8.05265 24.7272C7.98686 24.7553 7.9323 24.809 7.88978 24.8884L7.88256 24.9013Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_8",
+									"d": "M8.97134 25.1115C8.9577 25.101 8.94166 25.0922 8.92481 25.0842C8.87988 25.0625 8.83575 25.0577 8.79242 25.0673C8.7491 25.0778 8.70978 25.1034 8.67368 25.1452L8.46106 25.5929L8.38965 25.5592L8.69855 24.9069L8.76915 24.9406L8.72101 25.0449C8.79563 24.9855 8.87506 24.9767 8.95931 25.016C8.97937 25.0256 8.99381 25.036 9.00344 25.0465L8.97054 25.1115H8.97134Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_9",
+									"d": "M9.77199 25.8825C9.79124 25.832 9.78883 25.7854 9.76476 25.7429C9.74069 25.7004 9.68614 25.6474 9.60269 25.5857C9.51925 25.5239 9.46148 25.4685 9.43019 25.4212C9.38526 25.3538 9.37643 25.284 9.40371 25.2126C9.43019 25.1436 9.47994 25.0978 9.55375 25.0762C9.62757 25.0545 9.7086 25.0609 9.79766 25.0946C9.85784 25.1179 9.90758 25.15 9.94609 25.1909C9.98461 25.2326 10.0095 25.2784 10.0199 25.3305C10.0303 25.3819 10.0255 25.4332 10.0063 25.4846L9.92924 25.4549C9.95251 25.3931 9.95091 25.3345 9.92283 25.2808C9.89474 25.227 9.845 25.1861 9.77359 25.1596C9.70459 25.1331 9.64281 25.1275 9.58986 25.1428C9.5369 25.158 9.5008 25.1909 9.48234 25.2407C9.46469 25.2872 9.4687 25.3313 9.49518 25.3746C9.52085 25.418 9.5706 25.4661 9.64361 25.5191C9.71663 25.572 9.76958 25.6186 9.80247 25.6587C9.83537 25.6988 9.85623 25.7389 9.86426 25.7806C9.87228 25.8224 9.86827 25.8649 9.85142 25.9106C9.82414 25.982 9.77359 26.0286 9.70058 26.0502C9.62676 26.0719 9.54332 26.0647 9.45025 26.0294C9.38606 26.0053 9.3315 25.9716 9.28737 25.9283C9.24244 25.8849 9.21436 25.8376 9.20233 25.7862C9.19029 25.7349 9.1943 25.6819 9.21436 25.629L9.29139 25.6579C9.26732 25.7221 9.27213 25.7814 9.30583 25.8368C9.33953 25.8922 9.39569 25.9347 9.47512 25.9652C9.54573 25.9916 9.60831 25.9981 9.66287 25.9828C9.71743 25.9676 9.75433 25.9347 9.77439 25.8833L9.77199 25.8825Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_10",
+									"d": "M10.2131 26.2917C10.1545 26.2733 10.1064 26.2428 10.0679 26.1995C10.0294 26.1561 10.0053 26.104 9.99485 26.0446C9.98442 25.9844 9.98924 25.9226 10.0093 25.8585L10.0181 25.8312C10.039 25.7646 10.0703 25.7092 10.112 25.6643C10.1537 25.6194 10.2027 25.5889 10.258 25.5728C10.3134 25.5568 10.3679 25.5568 10.4209 25.5728C10.5043 25.5985 10.5621 25.6482 10.5934 25.7205C10.6247 25.7927 10.6247 25.8785 10.5942 25.9772L10.5806 26.0197L10.0887 25.8673L10.0839 25.8817C10.0598 25.9596 10.0623 26.0318 10.0903 26.0976C10.1192 26.1633 10.1674 26.2067 10.2356 26.2283C10.2765 26.2412 10.315 26.2444 10.3503 26.2396C10.3856 26.2348 10.4217 26.2195 10.4578 26.1946L10.4939 26.246C10.4129 26.3094 10.319 26.3246 10.2123 26.2917H10.2131ZM10.4008 25.6378C10.3439 25.6202 10.2885 25.6258 10.2364 25.6563C10.1842 25.686 10.1425 25.7349 10.112 25.8031L10.5252 25.9315L10.5276 25.9234C10.5461 25.8569 10.5437 25.7967 10.5212 25.7437C10.4987 25.6908 10.4578 25.6555 10.4008 25.6378Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_11",
+									"d": "M11.1407 25.856C11.1254 25.8488 11.1078 25.8424 11.0893 25.8384C11.0412 25.8255 10.997 25.8287 10.9561 25.8472C10.916 25.8657 10.8823 25.8985 10.8542 25.9459L10.7299 26.4257L10.6528 26.4056L10.8334 25.7068L10.9088 25.726L10.8815 25.8376C10.9441 25.7654 11.0203 25.7413 11.1102 25.7646C11.1318 25.7702 11.1479 25.7774 11.1591 25.7862L11.139 25.856H11.1407Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_12",
+									"d": "M11.3831 26.4659L11.7233 25.9123L11.8036 25.9292L11.392 26.5807L11.3286 26.5678L11.2114 25.8064L11.2917 25.8232L11.3831 26.4667V26.4659Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_13",
+									"d": "M11.895 26.6737L11.8164 26.66L11.936 25.9484L12.0146 25.962L11.895 26.6737ZM11.9568 25.7406C11.9592 25.7261 11.9664 25.7141 11.9777 25.7053C11.9889 25.6964 12.0034 25.694 12.0194 25.6964C12.0362 25.6996 12.0483 25.7069 12.0563 25.7181C12.0643 25.7301 12.0675 25.743 12.0651 25.7582C12.0627 25.7727 12.0555 25.7847 12.0443 25.7927C12.033 25.8007 12.0186 25.804 12.0017 25.8007C11.9849 25.7983 11.9729 25.7911 11.9648 25.7791C11.9568 25.767 11.9544 25.7542 11.9568 25.7398V25.7406Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_14",
+									"d": "M12.4061 26.6929C12.4615 26.7002 12.5096 26.6905 12.5505 26.664C12.5915 26.6376 12.6171 26.5999 12.626 26.5509L12.7022 26.5605C12.6942 26.6039 12.6757 26.6424 12.646 26.6745C12.6163 26.7074 12.5794 26.7314 12.5353 26.7459C12.4912 26.7603 12.4454 26.7651 12.3973 26.7595C12.3034 26.7475 12.2328 26.7058 12.1863 26.6336C12.1398 26.5613 12.1229 26.4699 12.1373 26.36L12.1406 26.3359C12.1494 26.2653 12.1694 26.2043 12.2015 26.153C12.2328 26.1016 12.2737 26.0647 12.3235 26.0406C12.3732 26.0166 12.4294 26.0085 12.4912 26.0166C12.5698 26.0262 12.6316 26.0583 12.6765 26.1112C12.7214 26.1642 12.7407 26.2292 12.7351 26.3062L12.6589 26.2966C12.6621 26.2404 12.6476 26.1923 12.6155 26.153C12.5826 26.1136 12.5385 26.0912 12.4823 26.084C12.4109 26.0751 12.3524 26.0936 12.3058 26.1401C12.2601 26.1867 12.2312 26.2565 12.2192 26.3495L12.216 26.3728C12.2047 26.4643 12.216 26.5381 12.2481 26.5942C12.281 26.6504 12.3339 26.6833 12.4053 26.6921L12.4061 26.6929Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_15",
+									"d": "M13.1466 26.8301C13.0856 26.8261 13.0311 26.8068 12.9837 26.7739C12.9364 26.7402 12.9011 26.6961 12.877 26.6399C12.8529 26.5846 12.8433 26.5228 12.8481 26.4562L12.8497 26.4273C12.8545 26.3583 12.8722 26.2965 12.9027 26.2428C12.9332 26.189 12.9733 26.1481 13.0238 26.12C13.0744 26.0919 13.1265 26.0791 13.1827 26.0831C13.2702 26.0887 13.3376 26.1232 13.3849 26.1866C13.4322 26.25 13.4523 26.3326 13.4451 26.4361L13.4419 26.4811L12.9284 26.4458V26.461C12.9219 26.5429 12.9404 26.6119 12.9837 26.6696C13.027 26.7274 13.084 26.7587 13.1546 26.7635C13.1971 26.7667 13.2357 26.7611 13.2694 26.7483C13.3031 26.7354 13.3343 26.7122 13.3632 26.6801L13.4106 26.721C13.3464 26.802 13.2581 26.8381 13.1474 26.8309L13.1466 26.8301ZM13.1779 26.1505C13.1177 26.1465 13.0664 26.165 13.0222 26.2059C12.9781 26.2468 12.9492 26.3046 12.9356 26.3776L13.3672 26.4073V26.3984C13.3704 26.3294 13.3544 26.2717 13.3199 26.2251C13.2854 26.1794 13.2381 26.1537 13.1779 26.1497V26.1505Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_16",
+									"d": "M14.6863 26.3993C14.6887 26.4884 14.6751 26.5678 14.6454 26.636C14.6165 26.7042 14.5732 26.7571 14.517 26.7949C14.4608 26.8326 14.395 26.8526 14.3196 26.8542C14.2065 26.8566 14.1134 26.8189 14.042 26.7395C13.9706 26.6601 13.9329 26.5517 13.9297 26.4137L13.9273 26.3135C13.9249 26.2252 13.9385 26.1466 13.9682 26.0776C13.9979 26.0086 14.0412 25.9548 14.0974 25.9171C14.1535 25.8794 14.2193 25.8593 14.2939 25.8569C14.3686 25.8553 14.4352 25.8714 14.4929 25.9059C14.5507 25.9404 14.5964 25.9901 14.6293 26.0551C14.6622 26.1201 14.6799 26.1963 14.6839 26.283L14.6871 26.3993H14.6863ZM14.602 26.2958C14.5988 26.1787 14.5707 26.088 14.5162 26.023C14.4616 25.958 14.3886 25.9267 14.2963 25.9291C14.2065 25.9315 14.1351 25.966 14.0829 26.0342C14.0308 26.1024 14.0067 26.1955 14.0091 26.3143L14.0115 26.4154C14.0147 26.5301 14.0436 26.6207 14.0982 26.6873C14.1535 26.7531 14.2265 26.7852 14.318 26.7828C14.4111 26.7804 14.4825 26.7459 14.533 26.6777C14.5836 26.6095 14.6069 26.5164 14.6044 26.3985L14.602 26.2958Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_17",
+									"d": "M15.1989 26.1353C15.182 26.1337 15.1636 26.1337 15.1443 26.1353C15.0946 26.1393 15.0536 26.1562 15.0216 26.1866C14.9895 26.2171 14.9678 26.2597 14.9582 26.3134L14.9983 26.8077L14.9189 26.8141L14.8611 26.0952L14.9389 26.0888L14.9493 26.2027C14.9846 26.1144 15.0488 26.0663 15.1419 26.0591C15.1644 26.0575 15.182 26.0591 15.1949 26.0639L15.1989 26.1361V26.1353Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_18",
+									"d": "M15.3144 26.4129C15.3 26.3005 15.3136 26.2091 15.3545 26.1369C15.3955 26.0646 15.4588 26.0237 15.5439 26.0125C15.641 25.9997 15.7204 26.0293 15.7814 26.0999L15.7718 25.9964L15.8456 25.9868L15.9362 26.6881C15.9483 26.7803 15.9314 26.8565 15.8873 26.9167C15.8424 26.9769 15.7766 27.013 15.6883 27.0242C15.6386 27.0307 15.5896 27.0258 15.5415 27.009C15.4933 26.9921 15.454 26.9673 15.4235 26.9336L15.4621 26.8798C15.527 26.9416 15.5976 26.9673 15.6755 26.9568C15.7413 26.948 15.791 26.9223 15.8223 26.8782C15.8544 26.8341 15.8664 26.7779 15.8592 26.7081L15.8472 26.6183C15.8055 26.6953 15.7365 26.7402 15.6394 26.753C15.5567 26.7635 15.4853 26.7394 15.4268 26.68C15.3682 26.6207 15.3313 26.534 15.3168 26.4217L15.3152 26.4113L15.3144 26.4129ZM15.3963 26.4161C15.4083 26.5075 15.4356 26.5773 15.4789 26.6247C15.5222 26.6728 15.5776 26.6921 15.6442 26.684C15.7413 26.6712 15.8047 26.6191 15.8343 26.526L15.791 26.193C15.7661 26.1497 15.7357 26.1184 15.6971 26.0983C15.6594 26.0791 15.6161 26.0719 15.5672 26.0783C15.5006 26.0871 15.4524 26.12 15.4219 26.177C15.3914 26.2339 15.3834 26.3134 15.3963 26.4153V26.4161Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_19",
+									"d": "M16.6271 26.5773C16.615 26.5565 16.6038 26.5244 16.5934 26.4811C16.5725 26.522 16.5428 26.5565 16.5043 26.5838C16.4658 26.611 16.4225 26.6295 16.3743 26.6391C16.3061 26.652 16.2476 26.6439 16.1978 26.6142C16.1481 26.5846 16.1184 26.5404 16.1071 26.4827C16.0935 26.4137 16.112 26.3535 16.1617 26.3021C16.2115 26.2508 16.2877 26.2155 16.3904 26.1954L16.5324 26.1681L16.5171 26.0879C16.5075 26.0374 16.4842 26.0005 16.4473 25.9772C16.4104 25.9539 16.3623 25.9483 16.3021 25.9595C16.2476 25.97 16.205 25.9924 16.1745 26.0277C16.1441 26.0622 16.1328 26.1 16.14 26.1393L16.0614 26.1537C16.051 26.0975 16.067 26.0438 16.112 25.9924C16.1561 25.9411 16.2171 25.9082 16.2933 25.8938C16.3719 25.8785 16.4385 25.8865 16.4915 25.917C16.5444 25.9475 16.5789 25.9981 16.5934 26.0687L16.6576 26.404C16.6704 26.4722 16.688 26.5228 16.7089 26.5541L16.7105 26.5621L16.6271 26.5781V26.5773ZM16.3695 26.5685C16.4217 26.5581 16.4666 26.5364 16.5027 26.5035C16.5388 26.4706 16.5629 26.4305 16.5733 26.3848L16.5436 26.2291L16.4032 26.2564C16.3254 26.2725 16.2668 26.2981 16.2283 26.3342C16.1898 26.3703 16.1745 26.4129 16.1842 26.461C16.1922 26.5011 16.2131 26.5308 16.2476 26.5517C16.2821 26.5725 16.323 26.5781 16.3703 26.5685H16.3695Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_20",
+									"d": "M16.8277 25.7934L16.8606 25.9122C16.8759 25.8624 16.8999 25.8215 16.9336 25.7886C16.9673 25.7557 17.0074 25.7333 17.0548 25.7212C17.1294 25.702 17.1912 25.7092 17.2385 25.7421C17.2859 25.775 17.3204 25.8336 17.3428 25.9178L17.46 26.3767L17.3829 26.3968L17.265 25.9379C17.2489 25.8753 17.2233 25.8328 17.1896 25.8087C17.1559 25.7846 17.1101 25.7798 17.0532 25.7951C17.005 25.8071 16.9665 25.8328 16.9376 25.8721C16.9088 25.9114 16.8919 25.9587 16.8871 26.0141L17.0099 26.4931L16.9328 26.5131L16.7539 25.8143L16.8277 25.7951V25.7934Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_21",
+									"d": "M17.4094 25.4204C17.4054 25.406 17.4062 25.3923 17.4126 25.3795C17.4191 25.3667 17.4303 25.3578 17.4463 25.353C17.4624 25.3482 17.4768 25.349 17.4897 25.3562C17.5025 25.3634 17.5105 25.3739 17.5153 25.3883C17.5194 25.4028 17.5186 25.4164 17.5121 25.4284C17.5057 25.4413 17.4937 25.4501 17.4776 25.4549C17.4616 25.4597 17.4471 25.4589 17.4351 25.4517C17.4231 25.4445 17.4142 25.434 17.4102 25.4196L17.4094 25.4204ZM17.7689 26.2837L17.6927 26.307L17.4832 25.6162L17.5595 25.5929L17.7689 26.2837Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_22",
+									"d": "M18.0281 26.1313L18.471 25.9772L18.4935 26.0406L17.9575 26.2267L17.9382 26.1714L18.1565 25.4669L17.7561 25.6057L17.7336 25.5399L18.2295 25.3674L18.2495 25.4244L18.0297 26.1297L18.0281 26.1313Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_23",
+									"d": "M19.0799 25.8031C19.0639 25.7854 19.0462 25.7558 19.027 25.7156C19.0149 25.7598 18.9925 25.7999 18.9604 25.8344C18.9283 25.8689 18.889 25.8962 18.844 25.9146C18.7799 25.9411 18.7205 25.9443 18.6659 25.925C18.6114 25.9058 18.5728 25.8689 18.5504 25.8143C18.5239 25.7493 18.5295 25.6868 18.568 25.6266C18.6065 25.5664 18.6739 25.5167 18.7702 25.4765L18.9042 25.4212L18.8729 25.345C18.8529 25.2976 18.8232 25.2655 18.7823 25.2511C18.7413 25.2366 18.6932 25.2398 18.637 25.2631C18.5857 25.284 18.5488 25.3153 18.5255 25.3554C18.503 25.3955 18.499 25.434 18.5143 25.4709L18.4397 25.5006C18.418 25.4477 18.4236 25.3915 18.4565 25.3321C18.4902 25.2727 18.5424 25.2286 18.6146 25.1989C18.6892 25.1684 18.755 25.1628 18.8135 25.1821C18.8721 25.2013 18.9154 25.2447 18.9443 25.3105L19.0743 25.6258C19.1008 25.69 19.1281 25.7357 19.1545 25.7622L19.1578 25.7694L19.0791 25.8023L19.0799 25.8031ZM18.8264 25.8456C18.8761 25.8256 18.9146 25.7951 18.9435 25.755C18.9724 25.7148 18.9877 25.6715 18.9885 25.6242L18.9283 25.4773L18.7967 25.5319C18.7237 25.5632 18.6715 25.6001 18.641 25.6434C18.6106 25.6868 18.6041 25.7309 18.6234 25.7766C18.6386 25.8143 18.6659 25.8392 18.7036 25.8528C18.7413 25.8657 18.7831 25.8633 18.8272 25.8448L18.8264 25.8456Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_24",
+									"d": "M19.083 24.8058L19.1616 24.9727L19.2964 24.9093L19.3245 24.9687L19.1897 25.032L19.3943 25.4677C19.4112 25.5038 19.4304 25.5279 19.4521 25.5391C19.4737 25.5504 19.4994 25.5496 19.5299 25.5351C19.5419 25.5295 19.5604 25.5183 19.5853 25.5014L19.6157 25.5584C19.5997 25.5744 19.5756 25.5897 19.5435 25.6049C19.4938 25.6282 19.4513 25.6306 19.4152 25.6129C19.3791 25.5945 19.3478 25.5576 19.3213 25.5022L19.1167 25.0665L18.9963 25.1227L18.9683 25.0633L19.0886 25.0072L19.01 24.8403L19.0822 24.8066L19.083 24.8058Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_25",
+									"d": "M19.3438 24.6526C19.3374 24.639 19.3358 24.6254 19.3398 24.6117C19.3438 24.5981 19.3535 24.5876 19.3687 24.5796C19.384 24.5716 19.3984 24.5708 19.412 24.5756C19.4257 24.5804 19.4361 24.5893 19.4425 24.6029C19.449 24.6165 19.4506 24.6294 19.4465 24.643C19.4425 24.6566 19.4329 24.6671 19.4177 24.6751C19.4024 24.6831 19.388 24.6839 19.3751 24.6799C19.3623 24.6759 19.3519 24.6663 19.3446 24.6526H19.3438ZM19.8493 25.4389L19.7779 25.475L19.4506 24.8316L19.522 24.7955L19.8493 25.4389Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_26",
+									"d": "M19.8461 25.0264C19.8115 24.9663 19.7931 24.9053 19.7891 24.8435C19.7851 24.7817 19.7971 24.7256 19.8244 24.6742C19.8517 24.6229 19.8926 24.5819 19.9471 24.5515C20.0306 24.5041 20.1148 24.4953 20.1999 24.525C20.2849 24.5547 20.3547 24.6172 20.4093 24.7143L20.4173 24.7288C20.4518 24.7897 20.4711 24.8507 20.4751 24.9125C20.4791 24.9743 20.4671 25.0304 20.4398 25.081C20.4125 25.1315 20.3708 25.1717 20.3162 25.2029C20.2328 25.2503 20.1485 25.2591 20.0635 25.2294C19.9784 25.2005 19.9086 25.1372 19.8533 25.0401L19.8452 25.0264H19.8461ZM19.9271 25.0064C19.9696 25.0818 20.0242 25.1323 20.09 25.158C20.1558 25.1837 20.2207 25.1797 20.2841 25.1436C20.3467 25.1083 20.3844 25.0553 20.3957 24.9855C20.4069 24.9157 20.3908 24.8411 20.3459 24.7617L20.3387 24.748C20.3114 24.6999 20.2777 24.6614 20.2376 24.6317C20.1975 24.602 20.155 24.5851 20.11 24.5811C20.0659 24.5771 20.0226 24.5876 19.9808 24.6108C19.9191 24.6461 19.8822 24.6983 19.8701 24.7697C19.8581 24.8403 19.8749 24.9149 19.9191 24.9935L19.9263 25.0064H19.9271Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_27",
+									"d": "M20.4318 24.2803L20.5016 24.3822C20.5 24.3301 20.5096 24.2835 20.5313 24.2418C20.5521 24.2001 20.5834 24.1664 20.6244 24.1391C20.6893 24.0966 20.7495 24.0838 20.8049 24.0998C20.8602 24.1159 20.9116 24.16 20.9597 24.233L21.2173 24.6302L21.1507 24.6735L20.8923 24.2755C20.857 24.2218 20.8193 24.1889 20.7792 24.1768C20.7391 24.1648 20.695 24.1752 20.6452 24.2073C20.6035 24.2346 20.5754 24.2707 20.561 24.3172C20.5465 24.3638 20.5449 24.4143 20.5586 24.4681L20.8281 24.8829L20.7616 24.9262L20.3684 24.3213L20.4318 24.2795V24.2803Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_28",
+									"d": "M21.6546 24.0886C21.6313 24.0565 21.5993 24.0404 21.5599 24.0404C21.5198 24.0404 21.4701 24.0532 21.4107 24.0805C21.3513 24.1078 21.3016 24.1247 21.2631 24.1311C21.2246 24.1383 21.1901 24.1359 21.1612 24.1263C21.1323 24.1166 21.1074 24.0966 21.0858 24.0677C21.0521 24.022 21.0432 23.9698 21.0593 23.912C21.0753 23.8543 21.1138 23.8029 21.1732 23.7588C21.2382 23.7115 21.3016 23.689 21.3642 23.6922C21.4267 23.6954 21.4773 23.7227 21.515 23.774L21.4508 23.8214C21.4259 23.7877 21.3906 23.7692 21.3457 23.7676C21.3008 23.766 21.2567 23.7813 21.2133 23.8133C21.1708 23.8446 21.1443 23.8791 21.1323 23.9168C21.1203 23.9546 21.1259 23.9883 21.1475 24.0187C21.1692 24.0476 21.1965 24.0621 21.2294 24.0629C21.2623 24.0629 21.312 24.0492 21.3778 24.0212C21.4436 23.9931 21.4966 23.9762 21.5359 23.9706C21.5752 23.965 21.6089 23.9674 21.6386 23.9786C21.6675 23.9899 21.6931 24.0099 21.7156 24.0404C21.7517 24.0894 21.7605 24.1431 21.7429 24.2017C21.7252 24.2603 21.6843 24.3132 21.6201 24.3597C21.5527 24.4095 21.4853 24.4336 21.4195 24.432C21.3529 24.4303 21.3016 24.4039 21.2647 24.3541L21.3289 24.3068C21.3594 24.3429 21.3963 24.3605 21.4412 24.3597C21.4861 24.3589 21.5319 24.3413 21.58 24.306C21.6249 24.2731 21.6538 24.2362 21.6666 24.1969C21.6795 24.1575 21.6755 24.1214 21.653 24.0918L21.6546 24.0886Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_29",
+									"d": "M22.7023 23.6914L22.6518 23.7363L21.8848 22.8778L21.9353 22.8329L22.7023 23.6914Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_30",
+									"d": "M23.418 22.3659C23.3868 22.337 23.3523 22.3258 23.3145 22.3322C23.2776 22.3386 23.2239 22.3627 23.1533 22.4044C23.0827 22.4461 23.0217 22.4742 22.9687 22.4886C22.8684 22.5159 22.785 22.4999 22.7192 22.4397C22.6614 22.3867 22.6358 22.3193 22.6414 22.2383C22.647 22.1573 22.6847 22.0786 22.7529 22.004C22.7986 21.9543 22.8484 21.9182 22.9029 21.8957C22.9567 21.8732 23.0113 21.8668 23.0658 21.8756C23.1204 21.8845 23.1677 21.9077 23.2094 21.9454L23.0955 22.069C23.0586 22.0345 23.0185 22.0193 22.9752 22.0241C22.9326 22.0281 22.8909 22.0522 22.8516 22.0955C22.8147 22.1364 22.7938 22.1757 22.7906 22.2142C22.7874 22.2527 22.801 22.2864 22.8323 22.3145C22.8588 22.3386 22.8917 22.3466 22.931 22.3386C22.9711 22.3306 23.0241 22.3057 23.0923 22.2656C23.1597 22.2255 23.2199 22.1974 23.272 22.1829C23.3242 22.1685 23.3707 22.1661 23.4124 22.1757C23.4541 22.1853 23.4935 22.2062 23.5304 22.2399C23.5897 22.2945 23.6162 22.3611 23.6098 22.4389C23.6034 22.5167 23.5641 22.5953 23.4919 22.6732C23.4445 22.7253 23.3916 22.7638 23.3322 22.7895C23.2736 22.8152 23.2159 22.8248 23.1597 22.8176C23.1035 22.8104 23.0538 22.7871 23.0089 22.7454L23.1228 22.621C23.1637 22.6579 23.207 22.674 23.2544 22.6675C23.3009 22.6611 23.3474 22.633 23.394 22.5825C23.4333 22.5392 23.455 22.4991 23.4574 22.4605C23.4598 22.4228 23.4469 22.3907 23.418 22.3643V22.3659Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_31",
+									"d": "M24.0366 22.0386C23.9724 22.1188 23.8946 22.1629 23.8039 22.1718C23.7133 22.1806 23.6266 22.1517 23.5424 22.0843L23.5271 22.0715C23.471 22.0265 23.43 21.9752 23.4028 21.9182C23.3763 21.8612 23.3659 21.8027 23.3731 21.7441C23.3803 21.6855 23.4028 21.6318 23.4413 21.5836C23.5031 21.5074 23.5753 21.4681 23.6571 21.4657C23.7389 21.4633 23.8256 21.4978 23.9147 21.57L23.9652 21.6109L23.6691 21.9776C23.7189 22.0113 23.7678 22.0249 23.8168 22.0201C23.8657 22.0145 23.9066 21.9912 23.9403 21.9503C23.9869 21.8925 24.0013 21.8267 23.9845 21.7529L24.104 21.7369C24.1193 21.7866 24.1217 21.8372 24.1096 21.8901C24.0976 21.9423 24.0735 21.992 24.0358 22.0386H24.0366ZM23.5432 21.6655C23.5151 21.7 23.5047 21.7377 23.5119 21.7786C23.5191 21.8195 23.5416 21.8604 23.5801 21.9014L23.7742 21.6607L23.7646 21.6534C23.7205 21.6221 23.6788 21.6077 23.6419 21.6101C23.6042 21.6125 23.5713 21.631 23.5432 21.6663V21.6655Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_32",
+									"d": "M24.0584 21.0357C24.0432 21.0509 24.0287 21.0678 24.0151 21.0862C23.9718 21.1464 23.9653 21.2034 23.9958 21.2579L24.3946 21.5484L24.2991 21.6791L23.7158 21.2547L23.8065 21.1295L23.8739 21.1737C23.8466 21.1055 23.853 21.0429 23.8939 20.9867C23.9076 20.9683 23.9212 20.9546 23.9349 20.9458L24.0576 21.0357H24.0584Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_33",
+									"d": "M24.5717 20.9305L24.2243 20.5197L24.3166 20.3801L24.7827 20.9851L24.7057 21.103L23.9644 20.9177L24.0566 20.7773L24.5733 20.9313L24.5717 20.9305Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_34",
+									"d": "M24.2029 20.1997C24.1812 20.1868 24.1676 20.1692 24.1619 20.1475C24.1555 20.1258 24.1603 20.1018 24.1756 20.0769C24.1908 20.052 24.2093 20.0368 24.2318 20.0312C24.2542 20.0255 24.2759 20.0296 24.2975 20.0424C24.3184 20.0552 24.332 20.0721 24.3377 20.0945C24.3433 20.117 24.3385 20.1403 24.324 20.1652C24.3088 20.19 24.2903 20.2053 24.2687 20.2109C24.247 20.2157 24.2253 20.2125 24.2045 20.1997H24.2029ZM25.071 20.5182L24.9876 20.657L24.3681 20.2863L24.4516 20.1475L25.071 20.5182Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_35",
+									"d": "M25.2146 20.0271C25.2339 19.9918 25.2395 19.9565 25.2315 19.922C25.2235 19.8875 25.205 19.861 25.1745 19.8426L25.2475 19.7086C25.286 19.7318 25.3165 19.7639 25.3382 19.8056C25.3599 19.8474 25.3703 19.8931 25.3687 19.9436C25.3671 19.9942 25.3542 20.0423 25.3294 20.0881C25.2812 20.1771 25.2146 20.2317 25.1288 20.2525C25.0429 20.2734 24.9499 20.2566 24.8488 20.202L24.8343 20.194C24.738 20.1418 24.6747 20.0744 24.6442 19.991C24.6137 19.9075 24.6233 19.8217 24.6715 19.7326C24.7124 19.6572 24.7677 19.6075 24.8375 19.5842C24.9073 19.5601 24.9788 19.5665 25.0518 19.6035L24.9788 19.7374C24.9418 19.719 24.9049 19.7158 24.8688 19.7262C24.8327 19.7366 24.8054 19.7599 24.7854 19.796C24.7605 19.8426 24.7581 19.8867 24.7782 19.93C24.7982 19.9733 24.8416 20.0134 24.9098 20.0504L24.933 20.0624C25.002 20.0993 25.0598 20.1153 25.1071 20.1081C25.1545 20.1009 25.1906 20.0744 25.2162 20.0279L25.2146 20.0271Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_36",
+									"d": "M25.6743 19.398C25.6309 19.4911 25.5659 19.5529 25.4809 19.5834C25.3959 19.6139 25.3036 19.6066 25.2065 19.5609L25.188 19.5521C25.1231 19.5216 25.0701 19.4815 25.0308 19.4325C24.9915 19.3836 24.9674 19.329 24.9602 19.2705C24.953 19.2119 24.9618 19.1541 24.9883 19.098C25.03 19.0089 25.0902 18.9535 25.1696 18.9311C25.249 18.9086 25.3405 18.9222 25.4448 18.9704L25.5042 18.9977L25.3052 19.4253C25.3614 19.4462 25.4127 19.4478 25.4584 19.4309C25.505 19.4141 25.5387 19.3812 25.5611 19.3338C25.5924 19.2664 25.5908 19.199 25.5563 19.1316L25.6686 19.0875C25.6951 19.1316 25.7096 19.1814 25.7104 19.2352C25.7112 19.2889 25.6991 19.3427 25.6743 19.3972V19.398ZM25.1054 19.1541C25.087 19.1942 25.0853 19.2335 25.1022 19.2713C25.119 19.309 25.1511 19.3435 25.1977 19.374L25.3285 19.0939L25.3172 19.0891C25.2667 19.0691 25.2234 19.0651 25.1872 19.0763C25.1511 19.0875 25.1239 19.1132 25.1046 19.1541H25.1054Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_37",
+									"d": "M25.8155 17.7453C25.9054 17.7774 25.9784 17.8199 26.0354 17.8753C26.0923 17.9306 26.1284 17.9932 26.1445 18.063C26.1605 18.1328 26.1549 18.2059 26.1284 18.2813C26.102 18.3551 26.061 18.4153 26.0041 18.4602C25.9471 18.5051 25.8797 18.5324 25.8019 18.5404C25.7232 18.5485 25.6406 18.5372 25.5532 18.5067L25.5018 18.4883C25.4127 18.457 25.3389 18.4129 25.282 18.3575C25.225 18.3013 25.1881 18.2387 25.172 18.1681C25.156 18.0975 25.1616 18.0253 25.1881 17.9507C25.2146 17.8761 25.2555 17.8159 25.3116 17.771C25.3678 17.7261 25.4352 17.6996 25.5138 17.6924C25.5925 17.6843 25.6759 17.6964 25.7658 17.7277L25.8163 17.7453H25.8155ZM25.712 17.8873C25.6109 17.8512 25.5259 17.8432 25.4585 17.8625C25.3911 17.8817 25.3445 17.9266 25.3197 17.9972C25.2956 18.0662 25.3036 18.1296 25.3437 18.1874C25.3839 18.2452 25.4529 18.2917 25.5515 18.3278L25.6045 18.3463C25.7048 18.3816 25.7898 18.3896 25.8588 18.3695C25.9278 18.3495 25.9744 18.3053 25.9993 18.2355C26.0241 18.1649 26.0161 18.1015 25.976 18.0446C25.9359 17.9876 25.8637 17.9411 25.761 17.905L25.7128 17.8881L25.712 17.8873Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_38",
+									"d": "M25.8541 17.1956C25.8444 17.2149 25.8372 17.2357 25.8308 17.2574C25.8099 17.3288 25.8236 17.385 25.8709 17.4251L26.3451 17.5615L26.3002 17.7171L25.6069 17.5173L25.6495 17.3689L25.7281 17.3874C25.6783 17.332 25.6639 17.2718 25.6832 17.2052C25.6896 17.1828 25.6976 17.1651 25.708 17.1531L25.8541 17.1956Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_39",
+									"d": "M26.0747 17.182C25.9656 17.1563 25.8846 17.1106 25.8316 17.044C25.7787 16.9774 25.7618 16.902 25.7819 16.8169C25.8003 16.7367 25.8437 16.6805 25.9102 16.6477L25.8412 16.6236L25.8749 16.4816L26.5561 16.6412C26.6484 16.6629 26.7142 16.7086 26.7543 16.7784C26.7944 16.8482 26.8024 16.9317 26.78 17.0296C26.7679 17.0809 26.7455 17.1291 26.7126 17.1732C26.6797 17.2173 26.6428 17.2478 26.6019 17.2655L26.5248 17.1684C26.5938 17.1331 26.6364 17.0801 26.6532 17.0095C26.6652 16.9574 26.6612 16.9124 26.6396 16.8755C26.6179 16.8386 26.5802 16.8137 26.5248 16.8009L26.4775 16.7897C26.5176 16.8466 26.5289 16.9132 26.5112 16.9894C26.4919 17.0713 26.4438 17.1315 26.366 17.1684C26.2881 17.2053 26.1919 17.2101 26.0763 17.1828L26.0747 17.182ZM26.1253 17.028C26.1959 17.0448 26.2545 17.0432 26.3018 17.0239C26.3491 17.0047 26.3788 16.9694 26.3908 16.918C26.4061 16.8547 26.3892 16.8009 26.3419 16.7576L26.033 16.6854C25.9728 16.703 25.9351 16.7431 25.9199 16.8065C25.9078 16.8587 25.9191 16.9036 25.9536 16.9421C25.9881 16.9806 26.045 17.0095 26.1253 17.028Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_40",
+									"d": "M26.6877 16.0219C26.6733 16.0267 26.65 16.0291 26.6179 16.0291C26.662 16.0892 26.6781 16.1558 26.6661 16.2297C26.654 16.3011 26.6235 16.3556 26.5754 16.3941C26.5273 16.4326 26.4727 16.4463 26.4125 16.4359C26.3371 16.423 26.2833 16.3853 26.252 16.3219C26.2208 16.2585 26.2143 16.1751 26.232 16.07L26.2488 15.9721L26.2023 15.9641C26.1654 15.9577 26.1341 15.9633 26.1084 15.9801C26.0828 15.997 26.0667 16.0267 26.0595 16.0684C26.0531 16.1045 26.0571 16.1358 26.0715 16.1623C26.086 16.1887 26.1068 16.204 26.1349 16.2088L26.1076 16.3685C26.0683 16.362 26.0346 16.3428 26.0049 16.3115C25.9752 16.2802 25.9544 16.2401 25.9431 16.1927C25.9311 16.1446 25.9303 16.0941 25.9399 16.0387C25.9544 15.9553 25.9865 15.8927 26.0362 15.8502C26.0868 15.8076 26.1493 15.7924 26.2256 15.8036L26.5465 15.8582C26.6107 15.8694 26.6628 15.8686 26.7046 15.8574L26.7158 15.859L26.6885 16.0219H26.6877ZM26.5433 16.1783C26.5489 16.147 26.5457 16.1157 26.5353 16.0852C26.5248 16.0547 26.508 16.0307 26.4839 16.0122L26.3499 15.9898L26.3355 16.0756C26.3259 16.135 26.3283 16.1807 26.3435 16.2144C26.3588 16.2481 26.386 16.2674 26.4237 16.2738C26.4542 16.2786 26.4807 16.273 26.5024 16.2553C26.524 16.2377 26.5377 16.212 26.5433 16.1783Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_41",
+									"d": "M26.0384 15.453L26.1219 15.457C26.0633 15.3968 26.0392 15.3238 26.0481 15.2379C26.0641 15.0887 26.158 15.0213 26.3289 15.0374L26.8031 15.0879L26.7862 15.2492L26.3217 15.1994C26.2759 15.1946 26.2414 15.201 26.2174 15.2179C26.1933 15.2355 26.1788 15.266 26.174 15.3109C26.1668 15.3759 26.1909 15.4273 26.247 15.4658L26.7573 15.5204L26.7405 15.6816L26.0232 15.6046L26.0392 15.453H26.0384Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_42",
+									"d": "M25.9078 14.8416C25.883 14.84 25.8629 14.8312 25.8477 14.8143C25.8324 14.7975 25.8252 14.7742 25.8276 14.7453C25.8292 14.7165 25.8388 14.694 25.8565 14.6787C25.8741 14.6635 25.895 14.6571 25.9199 14.6587C25.9439 14.6603 25.964 14.6691 25.9792 14.6868C25.9945 14.7036 26.0009 14.7269 25.9993 14.7566C25.9977 14.7855 25.9881 14.8079 25.9712 14.8224C25.9544 14.8368 25.9335 14.844 25.9086 14.8424L25.9078 14.8416ZM26.8257 14.7261L26.8161 14.8882L26.0956 14.8432L26.1052 14.6812L26.8257 14.7261Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_43",
+									"d": "M26.7116 14.3489L26.7196 13.9646L26.8488 13.967L26.8368 14.5527L26.7309 14.5503L26.2535 14.1748L26.2463 14.5343L26.1155 14.5319L26.1267 13.967L26.2294 13.9694L26.7116 14.3497V14.3489Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_44",
+									"d": "M26.8312 13.3741C26.8176 13.3813 26.7951 13.3885 26.7646 13.395C26.82 13.4447 26.8497 13.5065 26.8521 13.5811C26.8545 13.6533 26.8361 13.7135 26.7967 13.7608C26.7574 13.8082 26.7069 13.833 26.6459 13.8354C26.5689 13.8386 26.5087 13.8122 26.4662 13.756C26.4229 13.7006 26.3996 13.6196 26.3956 13.5137L26.3916 13.4142L26.3442 13.4158C26.3065 13.4174 26.2776 13.4287 26.256 13.4503C26.2343 13.472 26.2247 13.5041 26.2255 13.5466C26.2271 13.5835 26.2375 13.6132 26.2568 13.6365C26.276 13.6597 26.3001 13.6702 26.3282 13.6694L26.3338 13.8314C26.2945 13.833 26.2568 13.821 26.2215 13.7961C26.1862 13.7712 26.1581 13.7367 26.1364 13.6918C26.1156 13.6477 26.1035 13.5971 26.1019 13.5418C26.0987 13.4575 26.1172 13.3893 26.1581 13.3372C26.199 13.285 26.2576 13.2578 26.3338 13.2529L26.6587 13.2409C26.7237 13.2385 26.7751 13.2273 26.8128 13.208H26.824L26.8304 13.3725L26.8312 13.3741ZM26.7213 13.5562C26.7205 13.5241 26.7117 13.4944 26.6948 13.4672C26.678 13.4399 26.6563 13.419 26.6299 13.4062L26.4943 13.411L26.4975 13.4985C26.4999 13.5586 26.5119 13.6028 26.5336 13.6324C26.5552 13.6621 26.5857 13.6758 26.6242 13.6742C26.6555 13.6734 26.6796 13.6621 26.6973 13.6405C26.7149 13.6188 26.7229 13.5915 26.7221 13.5562H26.7213Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_45",
+									"d": "M25.8997 12.9119L26.0746 12.8967L26.0641 12.7699L26.1837 12.7595L26.1941 12.8862L26.5953 12.8517C26.6226 12.8493 26.6418 12.8421 26.6531 12.8301C26.6643 12.818 26.6691 12.798 26.6667 12.7707C26.6651 12.7522 26.6611 12.7338 26.6555 12.7145L26.7806 12.7041C26.7943 12.7402 26.8023 12.7747 26.8047 12.8092C26.8151 12.9336 26.7517 13.001 26.6153 13.013L26.2078 13.0475L26.2182 13.1654L26.0986 13.1759L26.0882 13.0579L25.9133 13.0732L25.8997 12.9119Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_46",
+									"d": "M25.8638 12.672C25.8389 12.6752 25.8172 12.6696 25.7996 12.656C25.7819 12.6423 25.7707 12.6207 25.7675 12.5918C25.7643 12.5629 25.7699 12.5388 25.7843 12.5212C25.7988 12.5035 25.818 12.4931 25.8429 12.4899C25.867 12.4867 25.8886 12.4923 25.9063 12.5067C25.9239 12.5212 25.9352 12.542 25.9384 12.5717C25.9416 12.6014 25.9368 12.6239 25.9223 12.6415C25.9079 12.6592 25.8886 12.6696 25.8646 12.672H25.8638ZM26.7463 12.3944L26.7656 12.5557L26.0491 12.6407L26.0298 12.4795L26.7463 12.3944Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_47",
+									"d": "M26.365 12.2814C26.2952 12.2926 26.2302 12.2894 26.17 12.2709C26.1098 12.2525 26.0601 12.2212 26.0216 12.1755C25.9831 12.1305 25.959 12.0752 25.9478 12.0102C25.9317 11.9139 25.9502 11.8312 26.0015 11.7606C26.0537 11.6908 26.1299 11.6443 26.2318 11.6226L26.2695 11.6154C26.3401 11.6042 26.4043 11.6066 26.4645 11.625C26.5246 11.6427 26.5736 11.6748 26.6121 11.7197C26.6506 11.7647 26.6755 11.8208 26.6859 11.8866C26.7028 11.9869 26.6827 12.0728 26.6257 12.1442C26.5688 12.2156 26.4845 12.2605 26.373 12.279L26.365 12.2806V12.2814ZM26.3521 12.1193C26.4251 12.1073 26.4805 12.0824 26.5166 12.0455C26.5535 12.0086 26.5672 11.9628 26.5575 11.9091C26.5487 11.8553 26.5206 11.8168 26.4733 11.7935C26.426 11.7703 26.3618 11.7655 26.2807 11.7791C26.2085 11.7911 26.154 11.816 26.1171 11.8537C26.0801 11.8914 26.0657 11.9372 26.0745 11.9901C26.0834 12.0423 26.1106 12.08 26.1572 12.104C26.2037 12.1281 26.2679 12.1329 26.3505 12.1193H26.3521Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_48",
+									"d": "M25.8461 11.4036L25.9263 11.3803C25.8517 11.3426 25.8044 11.2816 25.7851 11.1974C25.7514 11.0513 25.818 10.9575 25.9849 10.9157L26.4494 10.8082L26.4855 10.9663L26.0298 11.0714C25.9849 11.0818 25.9544 11.0987 25.9375 11.1235C25.9207 11.1476 25.9175 11.1821 25.9271 11.2254C25.9416 11.2888 25.9817 11.3297 26.0467 11.3474L26.5473 11.2319L26.5842 11.3899L25.8814 11.552L25.8469 11.4036H25.8461Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_49",
+									"d": "M26.0946 10.2811C26.0665 10.2891 26.0489 10.3068 26.0416 10.3341C26.0336 10.3613 26.032 10.4031 26.0368 10.4592C26.0416 10.5154 26.04 10.5635 26.0336 10.6044C26.0192 10.6935 25.9758 10.7481 25.9052 10.7689C25.8459 10.7866 25.7881 10.7761 25.7335 10.7376C25.679 10.6991 25.6397 10.6414 25.6164 10.5635C25.5923 10.4809 25.5923 10.4079 25.6188 10.3445C25.6445 10.2811 25.6902 10.2402 25.7552 10.2209L25.8009 10.3766C25.7712 10.3854 25.7496 10.4039 25.7359 10.4319C25.7223 10.46 25.7215 10.4921 25.7319 10.529C25.7424 10.5635 25.7584 10.5884 25.7801 10.6052C25.8025 10.6221 25.8266 10.6269 25.8531 10.6189C25.8772 10.6117 25.8924 10.5964 25.8996 10.5724C25.9068 10.5483 25.9084 10.5042 25.9036 10.4392C25.8988 10.3742 25.9012 10.322 25.9093 10.2811C25.9173 10.241 25.9325 10.2089 25.9534 10.184C25.9742 10.1591 26.0031 10.1415 26.0408 10.1311C26.1034 10.1126 26.1612 10.1238 26.2149 10.164C26.2687 10.2041 26.308 10.2659 26.3329 10.3493C26.3497 10.4063 26.3545 10.4592 26.3465 10.5098C26.3393 10.5603 26.3208 10.6028 26.2928 10.6381C26.2639 10.6734 26.2294 10.6975 26.1877 10.7095L26.1427 10.5587C26.1788 10.5459 26.2029 10.5234 26.2149 10.4921C26.227 10.4608 26.227 10.4239 26.2149 10.3814C26.2029 10.3405 26.1861 10.3116 26.1644 10.2947C26.1427 10.2779 26.1187 10.2731 26.0938 10.2811H26.0946Z",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Group_2"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group_3"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_50",
+											"d": "M8.9457 10.9173H6.97035L6.52184 12.1393H6.13672L7.78312 7.78821H8.13294L9.77933 12.1393H9.39662L8.9457 10.9173ZM7.08428 10.6068H8.82937L7.95642 8.23672L7.08348 10.6068H7.08428Z",
+											"fill": "white"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_51",
+											"d": "M10.8064 12.1401H10.439V7.78906H10.8064V12.1401Z",
+											"fill": "white"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_52",
+											"d": "M15.0067 10.7833C14.9569 11.2415 14.7933 11.5921 14.5149 11.8352C14.2364 12.0783 13.8666 12.1995 13.4044 12.1995C13.0819 12.1995 12.7962 12.1184 12.5483 11.9572C12.3004 11.7959 12.1086 11.5672 11.973 11.2712C11.8375 10.9751 11.7685 10.6373 11.7668 10.2562V9.69135C11.7668 9.30462 11.8342 8.96202 11.9698 8.66355C12.1054 8.36508 12.3004 8.13401 12.5539 7.97194C12.8083 7.80987 13.1003 7.72803 13.4309 7.72803C13.8971 7.72803 14.2653 7.85319 14.5349 8.10432C14.8045 8.35546 14.9618 8.70287 15.0059 9.14736H14.6352C14.5437 8.40841 14.1418 8.03853 13.4309 8.03853C13.0361 8.03853 12.7224 8.18616 12.4881 8.48142C12.2539 8.77668 12.1367 9.18427 12.1367 9.70499V10.2377C12.1367 10.74 12.2507 11.1412 12.4785 11.4396C12.7064 11.7389 13.0153 11.8882 13.4036 11.8882C13.7919 11.8882 14.0776 11.7959 14.2733 11.6113C14.4683 11.4268 14.5895 11.1508 14.6352 10.7817H15.0059L15.0067 10.7833Z",
+											"fill": "white"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_53",
+											"d": "M16.2061 10.3678V12.1401H15.8386V7.78906H17.3205C17.7731 7.78906 18.1301 7.9046 18.3917 8.13567C18.654 8.36675 18.7848 8.68447 18.7848 9.08885C18.7848 9.49323 18.6588 9.81256 18.4069 10.0348C18.155 10.2571 17.7899 10.3678 17.3117 10.3678H16.2061ZM16.2061 10.0573H17.3205C17.6768 10.0573 17.9488 9.97222 18.1365 9.80293C18.3235 9.63364 18.4173 9.39695 18.4173 9.09366C18.4173 8.79038 18.3243 8.55209 18.1381 8.37397C17.952 8.19505 17.6872 8.10438 17.3446 8.10037H16.2061V10.0581V10.0573Z",
+											"fill": "white"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_54",
+											"d": "M21.4823 10.9173H19.507L19.0585 12.1393H18.6733L20.3197 7.78821H20.6696L22.316 12.1393H21.9332L21.4823 10.9173ZM19.6201 10.6068H21.3652L20.4922 8.23672L19.6193 10.6068H19.6201Z",
+											"fill": "white"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_55",
+											"d": "M11.4289 18.1368C11.4289 17.8961 11.3438 17.7051 11.1745 17.5647C11.0052 17.4243 10.6955 17.2911 10.2454 17.1643C9.79532 17.0376 9.46636 16.8996 9.25936 16.7503C8.9641 16.5393 8.81727 16.2625 8.81727 15.9199C8.81727 15.5773 8.95447 15.3165 9.22807 15.1087C9.50167 14.9009 9.85229 14.7966 10.2783 14.7966C10.5672 14.7966 10.8255 14.8528 11.0542 14.9643C11.2821 15.0758 11.4594 15.2315 11.5845 15.4305C11.7097 15.6295 11.7731 15.8517 11.7731 16.0972H11.4024C11.4024 15.7996 11.3005 15.5605 11.0975 15.3791C10.8945 15.1978 10.6217 15.1079 10.2783 15.1079C9.93493 15.1079 9.68059 15.1826 9.48321 15.331C9.28584 15.4794 9.18715 15.6736 9.18715 15.9135C9.18715 16.1349 9.27541 16.3155 9.45272 16.4551C9.63004 16.5947 9.91407 16.7182 10.304 16.8249C10.6947 16.9317 10.99 17.0424 11.1914 17.1571C11.3928 17.2718 11.5444 17.4082 11.6455 17.5679C11.7474 17.7276 11.798 17.9153 11.798 18.1328C11.798 18.4754 11.6608 18.7506 11.3872 18.9576C11.1136 19.1646 10.7525 19.2681 10.304 19.2681C9.99751 19.2681 9.71589 19.2135 9.45994 19.1036C9.204 18.9937 9.00983 18.8404 8.87745 18.643C8.74506 18.4457 8.67847 18.2194 8.67847 17.9651H9.04594C9.04594 18.2716 9.16067 18.5139 9.38934 18.6912C9.618 18.8685 9.92289 18.9568 10.304 18.9568C10.6426 18.9568 10.9146 18.8821 11.12 18.7329C11.3254 18.5837 11.4281 18.3855 11.4281 18.1384L11.4289 18.1368Z",
+											"fill": "white"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_56",
+											"d": "M15.7455 17.267C15.7455 17.6673 15.6765 18.0188 15.5377 18.3221C15.3989 18.6245 15.2015 18.858 14.9448 19.0217C14.688 19.1854 14.3911 19.2664 14.0542 19.2664C13.5463 19.2664 13.1355 19.0843 12.8234 18.7208C12.5105 18.3574 12.354 17.8663 12.354 17.2493V16.8008C12.354 16.4045 12.4246 16.053 12.565 15.7473C12.7054 15.4417 12.9044 15.2066 13.1612 15.0421C13.4179 14.8776 13.714 14.7958 14.0485 14.7958C14.3831 14.7958 14.6784 14.8768 14.9343 15.0381C15.1903 15.1994 15.3876 15.4272 15.5273 15.7225C15.6669 16.0177 15.7391 16.3587 15.7455 16.7479V17.2678V17.267ZM15.378 16.7944C15.378 16.2705 15.2593 15.8597 15.0226 15.5628C14.7851 15.2659 14.4609 15.1175 14.0485 15.1175C13.6361 15.1175 13.3216 15.2667 13.0817 15.5644C12.8418 15.8621 12.7215 16.2785 12.7215 16.8121V17.2662C12.7215 17.7821 12.841 18.1913 13.0801 18.4929C13.3192 18.7946 13.6442 18.9455 14.0542 18.9455C14.4642 18.9455 14.7955 18.7962 15.0282 18.4986C15.2617 18.2009 15.378 17.7861 15.378 17.2541V16.7936V16.7944Z",
+											"fill": "white"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_57",
+											"d": "M19.6922 17.8495C19.6425 18.3076 19.4788 18.6583 19.2004 18.9014C18.922 19.1445 18.5521 19.2656 18.09 19.2656C17.7674 19.2656 17.4818 19.1846 17.2339 19.0233C16.9859 18.862 16.7942 18.6334 16.6586 18.3373C16.523 18.0413 16.454 17.7035 16.4524 17.3224V16.7575C16.4524 16.3708 16.5198 16.0282 16.6554 15.7297C16.791 15.4312 16.9859 15.2002 17.2395 15.0381C17.4938 14.876 17.7859 14.7942 18.1164 14.7942C18.5826 14.7942 18.9509 14.9194 19.2205 15.1705C19.49 15.4216 19.6473 15.769 19.6914 16.2135H19.3208C19.2293 15.4746 18.8273 15.1047 18.1164 15.1047C17.7217 15.1047 17.408 15.2523 17.1737 15.5476C16.9394 15.8428 16.8223 16.2504 16.8223 16.7712V17.3039C16.8223 17.8062 16.9362 18.2073 17.1641 18.5058C17.3919 18.8051 17.7008 18.9543 18.0892 18.9543C18.4775 18.9543 18.7631 18.862 18.9589 18.6775C19.1539 18.493 19.275 18.217 19.3208 17.8479H19.6914L19.6922 17.8495Z",
+											"fill": "white"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_58",
+									"d": "M6.00195 13.5538H22.5871",
+									"stroke": "white",
+									"stroke-width": "0.111926",
+									"stroke-linecap": "round",
+									"stroke-linejoin": "round"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Group_4"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_59",
+									"d": "M8.72524 21.7257C8.71722 21.7089 8.71 21.68 8.70518 21.6374C8.63859 21.7064 8.55916 21.7409 8.46609 21.7409C8.38345 21.7409 8.31525 21.7177 8.26229 21.6711C8.20934 21.6246 8.18286 21.5652 8.18286 21.493C8.18286 21.4056 8.21576 21.3382 8.28235 21.2892C8.34895 21.2411 8.44202 21.217 8.56237 21.217H8.70197V21.1512C8.70197 21.1015 8.68673 21.0614 8.65704 21.0317C8.62736 21.002 8.58323 20.9868 8.52466 20.9868C8.47331 20.9868 8.43078 20.9996 8.39628 21.0253C8.36178 21.0509 8.34413 21.0822 8.34413 21.1191H8.19971C8.19971 21.0774 8.21496 21.0365 8.24464 20.998C8.27433 20.9587 8.31444 20.9282 8.36579 20.9057C8.41634 20.8833 8.47251 20.8712 8.53348 20.8712C8.63057 20.8712 8.70599 20.8953 8.76055 20.9434C8.8151 20.9916 8.84399 21.0582 8.84559 21.1432V21.5291C8.84559 21.6062 8.85522 21.6671 8.87528 21.7129V21.7249H8.72444L8.72524 21.7257ZM8.48695 21.6166C8.53188 21.6166 8.5744 21.6046 8.61452 21.5821C8.65464 21.5588 8.68432 21.5283 8.70197 21.4914V21.3189H8.58965C8.41393 21.3189 8.32568 21.3703 8.32568 21.473C8.32568 21.5179 8.34092 21.5532 8.37061 21.5781C8.4003 21.6037 8.43881 21.6158 8.48615 21.6158L8.48695 21.6166Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_60",
+									"d": "M9.03174 20.6642C9.03174 20.6409 9.03896 20.6209 9.0534 20.6056C9.06784 20.5904 9.0887 20.5815 9.11679 20.5815C9.14487 20.5815 9.16573 20.5896 9.18017 20.6056C9.19461 20.6217 9.20183 20.6409 9.20183 20.6642C9.20183 20.6875 9.19461 20.7067 9.18017 20.722C9.16573 20.7372 9.14487 20.7452 9.11679 20.7452C9.0887 20.7452 9.06784 20.7372 9.0534 20.722C9.03896 20.7067 9.03174 20.6866 9.03174 20.6642ZM9.18659 21.7257H9.04297V20.8864H9.18659V21.7257Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_61",
+									"d": "M9.71276 21.6246C9.76411 21.6246 9.80824 21.6094 9.84675 21.5781C9.88526 21.5468 9.90612 21.5083 9.91013 21.4618H10.0457C10.0433 21.5099 10.0265 21.5556 9.99598 21.599C9.96549 21.6423 9.92457 21.6768 9.87403 21.7025C9.82348 21.7281 9.76892 21.741 9.71276 21.741C9.59882 21.741 9.50736 21.7025 9.43996 21.6262C9.37257 21.55 9.33887 21.4457 9.33887 21.3133V21.2893C9.33887 21.2074 9.35411 21.1352 9.3838 21.071C9.41348 21.0076 9.45681 20.9579 9.51297 20.9226C9.56914 20.8873 9.63573 20.8696 9.71195 20.8696C9.80583 20.8696 9.88446 20.8977 9.94624 20.9539C10.0088 21.01 10.0417 21.0831 10.0457 21.1737H9.91013C9.90612 21.1192 9.88526 21.075 9.84835 21.0397C9.81144 21.0052 9.76571 20.9876 9.71115 20.9876C9.63814 20.9876 9.58198 21.0141 9.54186 21.0662C9.50174 21.1184 9.48168 21.1946 9.48168 21.2941V21.3213C9.48168 21.4184 9.50174 21.4922 9.54106 21.5444C9.58117 21.5965 9.63814 21.623 9.71195 21.623L9.71276 21.6246Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_62",
+									"d": "M10.877 21.3156C10.877 21.4432 10.8481 21.5459 10.7895 21.6245C10.731 21.7024 10.6523 21.7417 10.552 21.7417C10.4518 21.7417 10.3699 21.7096 10.3113 21.6446V22.049H10.1677V20.8872H10.2985L10.3057 20.9803C10.3643 20.9081 10.4453 20.8719 10.5488 20.8719C10.6523 20.8719 10.7294 20.9097 10.7879 20.9859C10.8465 21.0621 10.8762 21.168 10.8762 21.3028V21.3156H10.877ZM10.7334 21.2996C10.7334 21.2049 10.7133 21.1303 10.6732 21.0757C10.6331 21.0212 10.5777 20.9939 10.5071 20.9939C10.4205 20.9939 10.3555 21.0324 10.3113 21.1094V21.5106C10.3547 21.5868 10.4197 21.6253 10.5087 21.6253C10.5777 21.6253 10.6323 21.5981 10.6724 21.5435C10.7133 21.4889 10.7334 21.4079 10.7334 21.3004V21.2996Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_63",
+									"d": "M11.5373 21.7257C11.5292 21.7089 11.522 21.68 11.5172 21.6374C11.4506 21.7064 11.3712 21.7409 11.2781 21.7409C11.1955 21.7409 11.1273 21.7177 11.0743 21.6711C11.0214 21.6246 10.9949 21.5652 10.9949 21.493C10.9949 21.4056 11.0278 21.3382 11.0944 21.2892C11.161 21.2411 11.254 21.217 11.3744 21.217H11.514V21.1512C11.514 21.1015 11.4987 21.0614 11.4691 21.0317C11.4394 21.002 11.3952 20.9868 11.3367 20.9868C11.2853 20.9868 11.2428 20.9996 11.2083 21.0253C11.1738 21.0509 11.1561 21.0822 11.1561 21.1191H11.0117C11.0117 21.0774 11.027 21.0365 11.0567 20.998C11.0863 20.9587 11.1265 20.9282 11.1778 20.9057C11.2284 20.8833 11.2845 20.8712 11.3455 20.8712C11.4426 20.8712 11.518 20.8953 11.5726 20.9434C11.6271 20.9916 11.656 21.0582 11.6576 21.1432V21.5291C11.6576 21.6062 11.6672 21.6671 11.6873 21.7129V21.7249H11.5365L11.5373 21.7257ZM11.299 21.6166C11.3439 21.6166 11.3864 21.6046 11.4265 21.5821C11.4666 21.5588 11.4963 21.5283 11.514 21.4914V21.3189H11.4017C11.2259 21.3189 11.1377 21.3703 11.1377 21.473C11.1377 21.5179 11.1529 21.5532 11.1826 21.5781C11.2123 21.6037 11.2508 21.6158 11.2982 21.6158L11.299 21.6166Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_64",
+									"d": "M11.8462 21.6511C11.8462 21.6262 11.8534 21.6054 11.8687 21.5893C11.8839 21.5733 11.9056 21.5645 11.9353 21.5645C11.9649 21.5645 11.9874 21.5725 12.0026 21.5893C12.0179 21.6062 12.0259 21.6262 12.0259 21.6511C12.0259 21.676 12.0179 21.6944 12.0026 21.7105C11.9874 21.7265 11.9649 21.7346 11.9353 21.7346C11.9056 21.7346 11.8839 21.7265 11.8687 21.7105C11.8534 21.6944 11.8462 21.6744 11.8462 21.6511Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_65",
+									"d": "M12.1841 21.2988C12.1841 21.217 12.2001 21.1423 12.2322 21.0773C12.2643 21.0124 12.3092 20.961 12.367 20.9257C12.4248 20.8904 12.4906 20.8719 12.5644 20.8719C12.6783 20.8719 12.7714 20.9113 12.842 20.9907C12.9126 21.0701 12.9479 21.1752 12.9479 21.306V21.3164C12.9479 21.3983 12.9327 21.4713 12.9014 21.5363C12.8701 21.6013 12.8252 21.6518 12.7674 21.6879C12.7088 21.724 12.6422 21.7425 12.5668 21.7425C12.4529 21.7425 12.3606 21.7032 12.29 21.6237C12.2194 21.5443 12.1841 21.44 12.1841 21.31V21.2996V21.2988ZM12.3277 21.3156C12.3277 21.4087 12.3494 21.4833 12.3927 21.5395C12.436 21.5957 12.4938 21.6237 12.566 21.6237C12.6382 21.6237 12.6968 21.5949 12.7393 21.5379C12.7818 21.4809 12.8035 21.4007 12.8035 21.298C12.8035 21.2057 12.7818 21.1311 12.7377 21.0741C12.6944 21.0172 12.6358 20.9883 12.5636 20.9883C12.4914 20.9883 12.436 21.0164 12.3919 21.0725C12.3478 21.1287 12.3269 21.2097 12.3269 21.3148L12.3277 21.3156Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_66",
+									"d": "M13.4936 21.0156C13.472 21.0124 13.4487 21.01 13.423 21.01C13.3292 21.01 13.265 21.0501 13.2313 21.1304V21.7257H13.0876V20.8865H13.2273L13.2297 20.9835C13.277 20.9089 13.3436 20.8712 13.4294 20.8712C13.4575 20.8712 13.4784 20.8744 13.4928 20.8824V21.0156H13.4936Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_67",
+									"d": "M13.5361 21.2996C13.5361 21.1688 13.5666 21.0645 13.6268 20.9875C13.687 20.9105 13.7672 20.8719 13.8675 20.8719C13.9678 20.8719 14.0496 20.9081 14.1074 20.9803L14.1146 20.8872H14.2454V21.7064C14.2454 21.8147 14.2133 21.9005 14.1491 21.9631C14.0849 22.0257 13.9983 22.057 13.89 22.057C13.8298 22.057 13.7704 22.0442 13.7126 22.0185C13.6549 21.9928 13.6107 21.9575 13.5803 21.9126L13.6549 21.8267C13.7167 21.903 13.7913 21.9407 13.8803 21.9407C13.9501 21.9407 14.0047 21.9206 14.0432 21.8821C14.0825 21.8428 14.1018 21.7874 14.1018 21.716V21.6438C14.044 21.7104 13.9662 21.7433 13.8667 21.7433C13.7672 21.7433 13.6894 21.704 13.6284 21.6245C13.5674 21.5451 13.5369 21.4376 13.5369 21.3012L13.5361 21.2996ZM13.6806 21.3156C13.6806 21.4103 13.6998 21.4849 13.7391 21.5387C13.7776 21.5924 13.8322 21.6197 13.902 21.6197C13.9927 21.6197 14.0593 21.5788 14.101 21.4962V21.1135C14.0568 21.0332 13.9911 20.9931 13.9036 20.9931C13.8338 20.9931 13.7792 21.0204 13.7399 21.0749C13.7006 21.1295 13.6814 21.2097 13.6814 21.3164L13.6806 21.3156Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_68",
+									"d": "M14.4505 21.8228H14.3269L14.7987 20.5968H14.9214L14.4505 21.8228Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_69",
+									"d": "M15.5251 21.5035C15.5251 21.4649 15.5107 21.4345 15.481 21.4128C15.4521 21.3911 15.4008 21.3727 15.3286 21.3574C15.2556 21.3422 15.1986 21.3229 15.1553 21.3013C15.1127 21.2796 15.0815 21.2539 15.0606 21.2234C15.0405 21.1938 15.0301 21.1577 15.0301 21.1167C15.0301 21.0477 15.059 20.99 15.1176 20.9426C15.1761 20.8953 15.2499 20.8712 15.3406 20.8712C15.4361 20.8712 15.5131 20.8961 15.5717 20.945C15.6311 20.994 15.6607 21.0574 15.6607 21.1336H15.5163C15.5163 21.0943 15.4995 21.0606 15.4666 21.0317C15.4337 21.0028 15.3912 20.9892 15.3406 20.9892C15.2901 20.9892 15.2475 21.0004 15.2179 21.0237C15.1882 21.0461 15.1737 21.0758 15.1737 21.1127C15.1737 21.1472 15.1874 21.1737 15.2146 21.1913C15.2419 21.209 15.2917 21.2258 15.3631 21.2419C15.4345 21.2579 15.4931 21.2772 15.5372 21.2997C15.5813 21.3221 15.6142 21.3486 15.6359 21.3799C15.6575 21.4112 15.668 21.4489 15.668 21.4946C15.668 21.5692 15.6383 21.6294 15.5781 21.6752C15.5179 21.7201 15.4401 21.7434 15.3446 21.7434C15.2772 21.7434 15.2179 21.7313 15.1665 21.7081C15.1152 21.684 15.0742 21.6511 15.0453 21.6086C15.0165 21.566 15.0012 21.5195 15.0012 21.4698H15.1448C15.1472 21.5179 15.1665 21.5556 15.2026 21.5845C15.2387 21.6134 15.2861 21.627 15.3446 21.627C15.3992 21.627 15.4425 21.6158 15.4754 21.5941C15.5083 21.5725 15.5243 21.5428 15.5243 21.5059L15.5251 21.5035Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_70",
+									"d": "M15.7778 21.2988C15.7778 21.217 15.7939 21.1423 15.826 21.0773C15.8581 21.0124 15.903 20.961 15.9608 20.9257C16.0185 20.8904 16.0843 20.8719 16.1581 20.8719C16.2721 20.8719 16.3651 20.9113 16.4358 20.9907C16.5064 21.0701 16.5417 21.1752 16.5417 21.306V21.3164C16.5417 21.3983 16.5264 21.4713 16.4951 21.5363C16.4638 21.6013 16.4189 21.6518 16.3611 21.6879C16.3026 21.724 16.236 21.7425 16.1605 21.7425C16.0466 21.7425 15.9543 21.7032 15.8837 21.6237C15.8131 21.5443 15.7778 21.44 15.7778 21.31V21.2996V21.2988ZM15.9223 21.3156C15.9223 21.4087 15.9439 21.4833 15.9872 21.5395C16.0306 21.5957 16.0883 21.6237 16.1605 21.6237C16.2328 21.6237 16.2913 21.5949 16.3339 21.5379C16.3764 21.4809 16.398 21.4007 16.398 21.298C16.398 21.2057 16.3764 21.1311 16.3322 21.0741C16.2889 21.0172 16.2304 20.9883 16.1581 20.9883C16.0859 20.9883 16.0306 21.0164 15.9864 21.0725C15.9423 21.1287 15.9215 21.2097 15.9215 21.3148L15.9223 21.3156Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_71",
+									"d": "M17.0182 21.6246C17.0695 21.6246 17.1137 21.6094 17.1522 21.5781C17.1907 21.5468 17.2115 21.5083 17.2156 21.4618H17.3511C17.3487 21.5099 17.3319 21.5556 17.3014 21.599C17.2709 21.6423 17.23 21.6768 17.1794 21.7025C17.1289 21.7281 17.0743 21.741 17.0182 21.741C16.9042 21.741 16.8128 21.7025 16.7454 21.6262C16.678 21.55 16.6443 21.4457 16.6443 21.3133V21.2893C16.6443 21.2074 16.6595 21.1352 16.6892 21.071C16.7189 21.0076 16.7622 20.9579 16.8184 20.9226C16.8746 20.8873 16.9412 20.8696 17.0174 20.8696C17.1112 20.8696 17.1899 20.8977 17.2517 20.9539C17.3142 21.01 17.3471 21.0831 17.3511 21.1737H17.2156C17.2115 21.1192 17.1907 21.075 17.1538 21.0397C17.1169 21.0052 17.0711 20.9876 17.0166 20.9876C16.9436 20.9876 16.8874 21.0141 16.8473 21.0662C16.8072 21.1184 16.7871 21.1946 16.7871 21.2941V21.3213C16.7871 21.4184 16.8072 21.4922 16.8465 21.5444C16.8866 21.5965 16.9436 21.623 17.0174 21.623L17.0182 21.6246Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_72",
+									"d": "M18.0637 21.3469H18.2202V21.4641H18.0637V21.7264H17.9193V21.4641H17.405V21.3798L17.9105 20.5975H18.0629V21.3477L18.0637 21.3469ZM17.5687 21.3469H17.9201V20.7933L17.9033 20.8246L17.5687 21.3469Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_73",
+									"d": "M18.814 21.5035C18.814 21.4649 18.7995 21.4345 18.7698 21.4128C18.7402 21.3911 18.6896 21.3727 18.6174 21.3574C18.5444 21.3422 18.4874 21.3229 18.4441 21.3013C18.4016 21.2796 18.3703 21.2539 18.3494 21.2234C18.3294 21.1938 18.3189 21.1577 18.3189 21.1167C18.3189 21.0477 18.3478 20.99 18.4064 20.9426C18.4649 20.8953 18.5388 20.8712 18.6294 20.8712C18.7249 20.8712 18.8019 20.8961 18.8605 20.945C18.9199 20.994 18.9496 21.0574 18.9496 21.1336H18.8051C18.8051 21.0943 18.7883 21.0606 18.7554 21.0317C18.7217 21.0036 18.68 20.9892 18.6294 20.9892C18.5789 20.9892 18.5364 21.0004 18.5067 21.0237C18.477 21.0461 18.4625 21.0758 18.4625 21.1127C18.4625 21.1472 18.4762 21.1737 18.5035 21.1913C18.5307 21.209 18.5805 21.2258 18.6519 21.2419C18.7233 21.2579 18.7819 21.2772 18.826 21.2997C18.8701 21.3221 18.903 21.3486 18.9247 21.3799C18.9464 21.4112 18.9568 21.4489 18.9568 21.4946C18.9568 21.5692 18.9271 21.6294 18.8669 21.6752C18.8067 21.7201 18.7289 21.7434 18.6334 21.7434C18.566 21.7434 18.5067 21.7313 18.4553 21.7081C18.404 21.684 18.3631 21.6511 18.3342 21.6086C18.3053 21.566 18.29 21.5195 18.29 21.4698H18.4337C18.4361 21.5179 18.4553 21.5556 18.4914 21.5845C18.5275 21.6126 18.5749 21.627 18.6334 21.627C18.688 21.627 18.7313 21.6158 18.7642 21.5941C18.7971 21.5725 18.8132 21.5428 18.8132 21.5059L18.814 21.5035Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_74",
+									"d": "M19.0664 21.2988C19.0664 21.217 19.0825 21.1423 19.1145 21.0773C19.1466 21.0116 19.1916 20.961 19.2493 20.9257C19.3071 20.8904 19.3729 20.8719 19.4467 20.8719C19.5606 20.8719 19.6537 20.9113 19.7243 20.9907C19.7949 21.0701 19.8302 21.1752 19.8302 21.306V21.3164C19.8302 21.3983 19.815 21.4713 19.7837 21.5363C19.7524 21.6013 19.7075 21.6518 19.6497 21.6879C19.5911 21.724 19.5245 21.7425 19.4491 21.7425C19.3352 21.7425 19.2429 21.7032 19.1723 21.6237C19.1017 21.5443 19.0664 21.44 19.0664 21.31V21.2996V21.2988ZM19.21 21.3156C19.21 21.4087 19.2317 21.4833 19.275 21.5395C19.3183 21.5957 19.3761 21.6237 19.4483 21.6237C19.5205 21.6237 19.5791 21.5949 19.6216 21.5379C19.665 21.4809 19.6858 21.4007 19.6858 21.298C19.6858 21.2057 19.6641 21.1311 19.62 21.0741C19.5767 21.0172 19.5181 20.9883 19.4459 20.9883C19.3737 20.9883 19.3183 21.0164 19.2742 21.0725C19.2301 21.1287 19.2092 21.2097 19.2092 21.3148L19.21 21.3156Z",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_75",
+							"d": "M25.8569 25.0298V25.1269H25.67V25.6147H25.5536V25.1269H25.3667V25.0298H25.8569ZM26.4892 25.6147L26.4675 25.2713C26.4651 25.2264 26.4651 25.1702 26.4635 25.1076H26.4571C26.4418 25.159 26.425 25.228 26.4073 25.2817L26.3022 25.6059H26.1819L26.0768 25.2729C26.0663 25.228 26.0487 25.159 26.0358 25.1076H26.0294C26.0294 25.1614 26.027 25.2175 26.0254 25.2713L26.0038 25.6147H25.8922L25.9356 25.0306H26.1097L26.2108 25.3162C26.2236 25.3612 26.234 25.4045 26.2493 25.4647H26.2517C26.2669 25.4109 26.2798 25.3612 26.2926 25.3186L26.3937 25.0306H26.5614L26.6063 25.6147H26.49H26.4892Z",
+							"fill": "#231F20"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint0_linear_6186_11887",
+							"x1": "28",
+							"y1": "14",
+							"x2": "0",
+							"y2": "14",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#2161AD"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.18",
+									"stop-color": "#1F69B3"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.47",
+									"stop-color": "#1C82C4"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.84",
+									"stop-color": "#16A9E1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#14BDEF"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint1_linear_6186_11887",
+							"x1": "3.13623",
+							"y1": "13.9999",
+							"x2": "24.8636",
+							"y2": "13.9999",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#2161AD"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.18",
+									"stop-color": "#1F69B3"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.47",
+									"stop-color": "#1C82C4"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.84",
+									"stop-color": "#16A9E1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#14BDEF"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Soc2"
+}
diff --git a/app/components/base/icons/src/public/common/Soc2.tsx b/app/components/base/icons/src/public/common/Soc2.tsx
new file mode 100644
index 0000000..b94d523
--- /dev/null
+++ b/app/components/base/icons/src/public/common/Soc2.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Soc2.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Soc2'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/SparklesSoft.json b/app/components/base/icons/src/public/common/SparklesSoft.json
new file mode 100644
index 0000000..11ac030
--- /dev/null
+++ b/app/components/base/icons/src/public/common/SparklesSoft.json
@@ -0,0 +1,47 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "sparkles-soft"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"opacity": "0.5",
+							"d": "M10.9963 1.36798C10.9839 1.25339 10.8909 1.16677 10.7802 1.16666C10.6695 1.16654 10.5763 1.25295 10.5636 1.36752C10.5045 1.90085 10.3525 2.26673 10.1143 2.5149C9.87599 2.76307 9.52476 2.92145 9.01275 2.98296C8.90277 2.99618 8.81983 3.09324 8.81995 3.20856C8.82006 3.32388 8.90322 3.42076 9.0132 3.43373C9.51653 3.49312 9.87583 3.65148 10.1201 3.90135C10.3631 4.14986 10.518 4.51523 10.563 5.04321C10.573 5.16035 10.6673 5.25012 10.7802 5.24999C10.8931 5.24986 10.9872 5.15987 10.9969 5.0427C11.0401 4.52364 11.1949 4.15004 11.4394 3.89528C11.684 3.64052 12.0426 3.47926 12.5409 3.43433C12.6534 3.42419 12.7398 3.32619 12.7399 3.20858C12.7401 3.09097 12.6539 2.99277 12.5414 2.98236C12.0346 2.93546 11.6838 2.77407 11.4452 2.52098C11.2054 2.2665 11.0533 1.89229 10.9963 1.36798Z",
+							"fill": "#F5F8FF"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M7.13646 2.85102C7.10442 2.55638 6.8653 2.33365 6.5806 2.33334C6.29595 2.33304 6.05633 2.55526 6.02374 2.84984C5.87186 4.22127 5.48089 5.1621 4.86827 5.80025C4.25565 6.43838 3.35245 6.84566 2.03587 7.00386C1.75307 7.03781 1.53975 7.28742 1.54004 7.58393C1.54033 7.88049 1.75415 8.12958 2.03701 8.16294C3.33132 8.31566 4.25509 8.72289 4.88328 9.36543C5.50807 10.0045 5.90647 10.9439 6.02222 12.3016C6.04793 12.6029 6.29035 12.8337 6.58066 12.8333C6.87102 12.833 7.11294 12.6016 7.13797 12.3003C7.24885 10.9656 7.64695 10.0049 8.27583 9.34979C8.90477 8.69471 9.82698 8.28002 11.1083 8.16452C11.3976 8.13844 11.6197 7.88644 11.62 7.58399C11.6204 7.28159 11.3988 7.02906 11.1096 7.00229C9.8062 6.88171 8.90432 6.46673 8.29084 5.81589C7.674 5.16152 7.28306 4.19926 7.13646 2.85102Z",
+							"fill": "#F5F8FF"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "SparklesSoft"
+}
diff --git a/app/components/base/icons/src/public/common/SparklesSoft.tsx b/app/components/base/icons/src/public/common/SparklesSoft.tsx
new file mode 100644
index 0000000..b3f94d0
--- /dev/null
+++ b/app/components/base/icons/src/public/common/SparklesSoft.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './SparklesSoft.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'SparklesSoft'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/common/index.ts b/app/components/base/icons/src/public/common/index.ts
new file mode 100644
index 0000000..dba789a
--- /dev/null
+++ b/app/components/base/icons/src/public/common/index.ts
@@ -0,0 +1,15 @@
+export { default as D } from './D'
+export { default as DiagonalDividingLine } from './DiagonalDividingLine'
+export { default as Dify } from './Dify'
+export { default as Gdpr } from './Gdpr'
+export { default as Github } from './Github'
+export { default as Highlight } from './Highlight'
+export { default as Iso } from './Iso'
+export { default as Line3 } from './Line3'
+export { default as Lock } from './Lock'
+export { default as MessageChatSquare } from './MessageChatSquare'
+export { default as MultiPathRetrieval } from './MultiPathRetrieval'
+export { default as NTo1Retrieval } from './NTo1Retrieval'
+export { default as Notion } from './Notion'
+export { default as Soc2 } from './Soc2'
+export { default as SparklesSoft } from './SparklesSoft'
diff --git a/app/components/base/icons/src/public/education/Triangle.json b/app/components/base/icons/src/public/education/Triangle.json
new file mode 100644
index 0000000..ab00049
--- /dev/null
+++ b/app/components/base/icons/src/public/education/Triangle.json
@@ -0,0 +1,27 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "22",
+			"viewBox": "0 0 16 22",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"id": "Rectangle 979",
+					"d": "M0 0H16L9.91493 16.7339C8.76529 19.8955 5.76063 22 2.39658 22H0V0Z",
+					"fill": "white"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Triangle"
+}
diff --git a/app/components/base/icons/src/public/education/Triangle.tsx b/app/components/base/icons/src/public/education/Triangle.tsx
new file mode 100644
index 0000000..85aa518
--- /dev/null
+++ b/app/components/base/icons/src/public/education/Triangle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Triangle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Triangle'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/education/index.ts b/app/components/base/icons/src/public/education/index.ts
new file mode 100644
index 0000000..de505db
--- /dev/null
+++ b/app/components/base/icons/src/public/education/index.ts
@@ -0,0 +1 @@
+export { default as Triangle } from './Triangle'
diff --git a/app/components/base/icons/src/public/files/Csv.json b/app/components/base/icons/src/public/files/Csv.json
new file mode 100644
index 0000000..533dcd7
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Csv.json
@@ -0,0 +1,181 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "32",
+			"height": "34",
+			"viewBox": "0 0 32 34",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "File Icons/csv"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "sharp",
+							"filter": "url(#filter0_d_6816_769)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M4 7.73398C4 5.49377 4 4.37367 4.43597 3.51802C4.81947 2.76537 5.43139 2.15345 6.18404 1.76996C7.03969 1.33398 8.15979 1.33398 10.4 1.33398H18.6667L28 10.6673V24.2673C28 26.5075 28 27.6276 27.564 28.4833C27.1805 29.2359 26.5686 29.8478 25.816 30.2313C24.9603 30.6673 23.8402 30.6673 21.6 30.6673H10.4C8.15979 30.6673 7.03969 30.6673 6.18404 30.2313C5.43139 29.8478 4.81947 29.2359 4.43597 28.4833C4 27.6276 4 26.5075 4 24.2673V7.73398Z",
+									"fill": "#169951"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "CSV",
+							"opacity": "0.96"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M13.0846 21.8908C12.8419 23.3562 11.8246 24.0562 10.5646 24.0562C9.78992 24.0562 9.20192 23.7948 8.71659 23.3095C8.01659 22.6095 8.04459 21.6762 8.04459 20.6775C8.04459 19.6788 8.01659 18.7455 8.71659 18.0455C9.20192 17.5602 9.78992 17.2988 10.5646 17.2988C11.8246 17.2988 12.8419 17.9988 13.0846 19.4642H11.4233C11.3206 19.0908 11.1153 18.7548 10.5739 18.7548C10.2753 18.7548 10.0513 18.8762 9.92992 19.0348C9.78059 19.2308 9.67792 19.4642 9.67792 20.6775C9.67792 21.8908 9.78059 22.1242 9.92992 22.3202C10.0513 22.4788 10.2753 22.6002 10.5739 22.6002C11.1153 22.6002 11.3206 22.2642 11.4233 21.8908H13.0846Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M18.4081 21.9655C18.4081 23.3188 17.2414 24.0562 15.8414 24.0562C14.8241 24.0562 13.9934 23.8695 13.3214 23.1788L14.3668 22.1335C14.7121 22.4788 15.3188 22.6002 15.8508 22.6002C16.4948 22.6002 16.8028 22.3855 16.8028 22.0028C16.8028 21.8442 16.7654 21.7135 16.6721 21.6108C16.5881 21.5268 16.4481 21.4615 16.2334 21.4335L15.4308 21.3215C14.8428 21.2375 14.3948 21.0415 14.0961 20.7335C13.7881 20.4162 13.6388 19.9682 13.6388 19.3988C13.6388 18.1855 14.5534 17.2988 16.0654 17.2988C17.0174 17.2988 17.7361 17.5228 18.3054 18.0922L17.2788 19.1188C16.8588 18.6988 16.3081 18.7268 16.0188 18.7268C15.4494 18.7268 15.2161 19.0535 15.2161 19.3428C15.2161 19.4268 15.2441 19.5482 15.3468 19.6508C15.4308 19.7348 15.5708 19.8188 15.8041 19.8468L16.6068 19.9588C17.2041 20.0428 17.6334 20.2295 17.9134 20.5095C18.2681 20.8548 18.4081 21.3495 18.4081 21.9655Z",
+									"fill": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M24.4166 17.3548L22.214 24.0002H21.0006L18.8073 17.3548H20.4966L21.6166 21.0695L22.718 17.3548H24.4166Z",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "bevel",
+							"opacity": "0.5",
+							"d": "M18.6667 1.33398L28.0001 10.6673H21.3334C19.8607 10.6673 18.6667 9.47341 18.6667 8.00065V1.33398Z",
+							"fill": "white"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_6816_769",
+							"x": "2",
+							"y": "0.333984",
+							"width": "28",
+							"height": "33.334",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_6816_769"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_6816_769",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Csv"
+}
diff --git a/app/components/base/icons/src/public/files/Csv.tsx b/app/components/base/icons/src/public/files/Csv.tsx
new file mode 100644
index 0000000..03ce2fb
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Csv.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Csv.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Csv'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/files/Doc.json b/app/components/base/icons/src/public/files/Doc.json
new file mode 100644
index 0000000..9d219ad
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Doc.json
@@ -0,0 +1,169 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "32",
+			"height": "34",
+			"viewBox": "0 0 32 34",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"filter": "url(#filter0_d_17194_49206)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M4 7.73301C4 5.4928 4 4.37269 4.43597 3.51705C4.81947 2.7644 5.43139 2.15248 6.18404 1.76898C7.03969 1.33301 8.15979 1.33301 10.4 1.33301H18.6667L28 10.6663V24.2663C28 26.5066 28 27.6267 27.564 28.4823C27.1805 29.2349 26.5686 29.8469 25.816 30.2304C24.9603 30.6663 23.8402 30.6663 21.6 30.6663H10.4C8.15979 30.6663 7.03969 30.6663 6.18404 30.2304C5.43139 29.8469 4.81947 29.2349 4.43597 28.4823C4 27.6267 4 26.5066 4 24.2663V7.73301Z",
+							"fill": "#2349A9"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"opacity": "0.5",
+					"d": "M18.6665 1.33301L27.9998 10.6663H21.3332C19.8604 10.6663 18.6665 9.47243 18.6665 7.99967V1.33301Z",
+					"fill": "white"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"opacity": "0.96"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M13.6329 21.4112C13.6329 22.2603 13.7059 22.9501 13.0326 23.5793C12.6351 23.9508 12.0754 24.11 11.4751 24.11H9.3335V18.7125H11.4751C12.0754 18.7125 12.6351 18.8717 13.0326 19.2431C13.7059 19.8723 13.6329 20.5622 13.6329 21.4112ZM12.2133 21.4112C12.2133 20.5015 12.1727 20.3499 12.0591 20.1983C11.9293 20.0164 11.7347 19.8951 11.3777 19.8951H10.7531V22.9274H11.3777C11.7347 22.9274 11.9293 22.8061 12.0591 22.6242C12.1727 22.4725 12.2133 22.3285 12.2133 21.4112Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M18.8275 21.4112C18.8275 22.2224 18.8519 22.9805 18.2435 23.549C17.8217 23.9432 17.3349 24.1555 16.6292 24.1555C15.9234 24.1555 15.4367 23.9432 15.0149 23.549C14.4065 22.9805 14.4308 22.2224 14.4308 21.4112C14.4308 20.6001 14.4065 19.842 15.0149 19.2735C15.4367 18.8793 15.9234 18.667 16.6292 18.667C17.3349 18.667 17.8217 18.8793 18.2435 19.2735C18.8519 19.842 18.8275 20.6001 18.8275 21.4112ZM17.4079 21.4112C17.4079 20.4257 17.3268 20.2438 17.197 20.0846C17.0916 19.9557 16.8888 19.8496 16.6292 19.8496C16.3696 19.8496 16.1668 19.9557 16.0613 20.0846C15.9316 20.2438 15.8504 20.4257 15.8504 21.4112C15.8504 22.3967 15.9316 22.5711 16.0613 22.7303C16.1668 22.8592 16.3696 22.9729 16.6292 22.9729C16.8888 22.9729 17.0916 22.8592 17.197 22.7303C17.3268 22.5711 17.4079 22.3967 17.4079 21.4112Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M24.0002 22.3967C23.7893 23.5869 22.905 24.1555 21.8099 24.1555C21.1366 24.1555 20.6256 23.9432 20.2037 23.549C19.5953 22.9805 19.6197 22.2224 19.6197 21.4112C19.6197 20.6001 19.5953 19.842 20.2037 19.2735C20.6256 18.8793 21.1366 18.667 21.8099 18.667C22.905 18.667 23.7893 19.2356 24.0002 20.4257H22.5562C22.467 20.1225 22.2885 19.8496 21.818 19.8496C21.5584 19.8496 21.3638 19.9481 21.2583 20.077C21.1285 20.2362 21.0393 20.4257 21.0393 21.4112C21.0393 22.3967 21.1285 22.5863 21.2583 22.7455C21.3638 22.8743 21.5584 22.9729 21.818 22.9729C22.2885 22.9729 22.467 22.7 22.5562 22.3967H24.0002Z",
+							"fill": "white"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_17194_49206",
+							"x": "2",
+							"y": "0.333008",
+							"width": "28",
+							"height": "33.333",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_17194_49206"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_17194_49206",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Doc"
+}
diff --git a/app/components/base/icons/src/public/files/Doc.tsx b/app/components/base/icons/src/public/files/Doc.tsx
new file mode 100644
index 0000000..e71773f
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Doc.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Doc.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Doc'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/files/Docx.json b/app/components/base/icons/src/public/files/Docx.json
new file mode 100644
index 0000000..ffa9ef8
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Docx.json
@@ -0,0 +1,178 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "32",
+			"height": "34",
+			"viewBox": "0 0 32 34",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"filter": "url(#filter0_d_10291_62253)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M4 7.73301C4 5.4928 4 4.37269 4.43597 3.51705C4.81947 2.7644 5.43139 2.15248 6.18404 1.76898C7.03969 1.33301 8.15979 1.33301 10.4 1.33301H18.6667L28 10.6663V24.2663C28 26.5065 28 27.6267 27.564 28.4823C27.1805 29.2349 26.5686 29.8469 25.816 30.2304C24.9603 30.6663 23.8402 30.6663 21.6 30.6663H10.4C8.15979 30.6663 7.03969 30.6663 6.18404 30.2304C5.43139 29.8469 4.81947 29.2349 4.43597 28.4823C4 27.6267 4 26.5065 4 24.2663V7.73301Z",
+							"fill": "#2349A9"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"opacity": "0.5",
+					"d": "M18.6665 1.33301L27.9998 10.6663H21.3332C19.8604 10.6663 18.6665 9.47243 18.6665 7.99967V1.33301Z",
+					"fill": "white"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"opacity": "0.96"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M10.8443 21.3337C10.8443 22.1587 10.9153 22.8291 10.261 23.4405C9.87477 23.8014 9.33086 23.9561 8.74754 23.9561H6.6665V18.7112H8.74754C9.33086 18.7112 9.87477 18.8659 10.261 19.2268C10.9153 19.8383 10.8443 20.5086 10.8443 21.3337ZM9.46487 21.3337C9.46487 20.4497 9.42545 20.3024 9.31509 20.155C9.18897 19.9782 8.99979 19.8604 8.65295 19.8604H8.04598V22.807H8.65295C8.99979 22.807 9.18897 22.6891 9.31509 22.5123C9.42545 22.365 9.46487 22.225 9.46487 21.3337Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M15.8922 21.3337C15.8922 22.1219 15.9158 22.8585 15.3246 23.411C14.9147 23.7941 14.4418 24.0003 13.756 24.0003C13.0702 24.0003 12.5972 23.7941 12.1873 23.411C11.5961 22.8585 11.6197 22.1219 11.6197 21.3337C11.6197 20.5454 11.5961 19.8088 12.1873 19.2563C12.5972 18.8733 13.0702 18.667 13.756 18.667C14.4418 18.667 14.9147 18.8733 15.3246 19.2563C15.9158 19.8088 15.8922 20.5454 15.8922 21.3337ZM14.5127 21.3337C14.5127 20.376 14.4339 20.1992 14.3077 20.0445C14.2053 19.9193 14.0082 19.8162 13.756 19.8162C13.5037 19.8162 13.3066 19.9193 13.2042 20.0445C13.078 20.1992 12.9992 20.376 12.9992 21.3337C12.9992 22.2913 13.078 22.4607 13.2042 22.6154C13.3066 22.7407 13.5037 22.8512 13.756 22.8512C14.0082 22.8512 14.2053 22.7407 14.3077 22.6154C14.4339 22.4607 14.5127 22.2913 14.5127 21.3337Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M20.9186 22.2913C20.7136 23.4478 19.8544 24.0003 18.7902 24.0003C18.136 24.0003 17.6394 23.7941 17.2295 23.411C16.6383 22.8585 16.6619 22.1219 16.6619 21.3337C16.6619 20.5454 16.6383 19.8088 17.2295 19.2563C17.6394 18.8733 18.136 18.667 18.7902 18.667C19.8544 18.667 20.7136 19.2195 20.9186 20.376H19.5154C19.4287 20.0814 19.2553 19.8162 18.7981 19.8162C18.5459 19.8162 18.3567 19.9119 18.2542 20.0372C18.1281 20.1919 18.0414 20.376 18.0414 21.3337C18.0414 22.2913 18.1281 22.4755 18.2542 22.6302C18.3567 22.7554 18.5459 22.8512 18.7981 22.8512C19.2553 22.8512 19.4287 22.586 19.5154 22.2913H20.9186Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M25.9998 23.9561H24.4233L23.501 22.3429L22.5787 23.9561H21.0022L22.7522 21.2674L21.1126 18.7112H22.6812L23.501 20.1919L24.3208 18.7112H25.8895L24.2499 21.2674L25.9998 23.9561Z",
+							"fill": "white"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_10291_62253",
+							"x": "2",
+							"y": "0.333008",
+							"width": "28",
+							"height": "33.333",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_10291_62253"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_10291_62253",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Docx"
+}
diff --git a/app/components/base/icons/src/public/files/Docx.tsx b/app/components/base/icons/src/public/files/Docx.tsx
new file mode 100644
index 0000000..25d5d06
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Docx.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Docx.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Docx'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/files/Html.json b/app/components/base/icons/src/public/files/Html.json
new file mode 100644
index 0000000..f267073
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Html.json
@@ -0,0 +1,178 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "32",
+			"height": "34",
+			"viewBox": "0 0 32 34",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"filter": "url(#filter0_d_3055_14424)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z",
+							"fill": "#EC5B27"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"opacity": "0.96"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M10.2704 24.0002V18.3042H8.87042V20.4962H7.38242V18.3042H5.98242V24.0002H7.38242V21.7442H8.87042V24.0002H10.2704Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M15.2839 19.5522V18.3042H11.0839V19.5522H12.4839V24.0002H13.8839V19.5522H15.2839Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M21.4116 24.0002V18.3042H20.0356L18.7556 20.8162L17.4756 18.3042H16.0996V24.0002H17.4996V21.2722L18.3076 22.6802H19.2036L20.0116 21.2722V24.0002H21.4116Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M26.3525 24.0002V22.7522H23.9605V18.3042H22.5605V24.0002H26.3525Z",
+							"fill": "white"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"opacity": "0.5",
+					"d": "M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z",
+					"fill": "white"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_3055_14424",
+							"x": "2",
+							"y": "0.333496",
+							"width": "28",
+							"height": "33.3335",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_3055_14424"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_3055_14424",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Html"
+}
diff --git a/app/components/base/icons/src/public/files/Html.tsx b/app/components/base/icons/src/public/files/Html.tsx
new file mode 100644
index 0000000..65b333d
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Html.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Html.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Html'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/files/Json.json b/app/components/base/icons/src/public/files/Json.json
new file mode 100644
index 0000000..0801fec
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Json.json
@@ -0,0 +1,178 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "32",
+			"height": "34",
+			"viewBox": "0 0 32 34",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"filter": "url(#filter0_d_3055_14428)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z",
+							"fill": "#2D2D2E"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"opacity": "0.96"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M9.83907 22.0479V18.3039H8.43907V22.0159C8.43907 22.5599 8.12707 22.7999 7.69507 22.7999C7.38307 22.7999 7.23907 22.6879 7.06307 22.5119L6.14307 23.4239C6.60707 23.8879 7.03107 24.0479 7.69507 24.0479C8.76707 24.0479 9.83907 23.3999 9.83907 22.0479Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M14.7321 22.2559C14.7321 21.7279 14.6121 21.3039 14.3081 21.0079C14.0681 20.7679 13.7001 20.6079 13.1881 20.5359L12.5001 20.4399C12.3001 20.4159 12.1801 20.3439 12.1081 20.2719C12.0201 20.1839 11.9961 20.0799 11.9961 20.0079C11.9961 19.7599 12.1961 19.4799 12.6841 19.4799C12.9321 19.4799 13.4041 19.4559 13.7641 19.8159L14.6441 18.9359C14.1561 18.4479 13.5401 18.2559 12.7241 18.2559C11.4281 18.2559 10.6441 19.0159 10.6441 20.0559C10.6441 20.5439 10.7721 20.9279 11.0361 21.1999C11.2921 21.4639 11.6761 21.6319 12.1801 21.7039L12.8681 21.7999C13.0521 21.8239 13.1721 21.8799 13.2441 21.9519C13.3241 22.0399 13.3561 22.1519 13.3561 22.2879C13.3561 22.6159 13.0921 22.7999 12.5401 22.7999C12.0841 22.7999 11.5641 22.6959 11.2681 22.3999L10.3721 23.2959C10.9481 23.8879 11.6601 24.0479 12.5321 24.0479C13.7321 24.0479 14.7321 23.4159 14.7321 22.2559Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M19.8023 21.1519C19.8023 20.2959 19.8263 19.4959 19.2263 18.8959C18.8103 18.4799 18.3303 18.2559 17.6343 18.2559C16.9383 18.2559 16.4583 18.4799 16.0423 18.8959C15.4423 19.4959 15.4663 20.2959 15.4663 21.1519C15.4663 22.0079 15.4423 22.8079 16.0423 23.4079C16.4583 23.8239 16.9383 24.0479 17.6343 24.0479C18.3303 24.0479 18.8103 23.8239 19.2263 23.4079C19.8263 22.8079 19.8023 22.0079 19.8023 21.1519ZM18.4023 21.1519C18.4023 22.1919 18.3223 22.3759 18.1943 22.5439C18.0903 22.6799 17.8903 22.7999 17.6343 22.7999C17.3783 22.7999 17.1783 22.6799 17.0743 22.5439C16.9463 22.3759 16.8663 22.1919 16.8663 21.1519C16.8663 20.1119 16.9463 19.9199 17.0743 19.7519C17.1783 19.6159 17.3783 19.5039 17.6343 19.5039C17.8903 19.5039 18.0903 19.6159 18.1943 19.7519C18.3223 19.9199 18.4023 20.1119 18.4023 21.1519Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M25.2154 23.9999V18.3039H23.8154V21.1679L21.9914 18.3039H20.7674V23.9999H22.1674V21.1359L23.9914 23.9999H25.2154Z",
+							"fill": "white"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"opacity": "0.5",
+					"d": "M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z",
+					"fill": "white"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_3055_14428",
+							"x": "2",
+							"y": "0.333496",
+							"width": "28",
+							"height": "33.3335",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_3055_14428"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_3055_14428",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Json"
+}
diff --git a/app/components/base/icons/src/public/files/Json.tsx b/app/components/base/icons/src/public/files/Json.tsx
new file mode 100644
index 0000000..90812be
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Json.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Json.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Json'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/files/Md.json b/app/components/base/icons/src/public/files/Md.json
new file mode 100644
index 0000000..4a3cb68
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Md.json
@@ -0,0 +1,144 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "32",
+			"height": "34",
+			"viewBox": "0 0 32 34",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"filter": "url(#filter0_d_3777_37339)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z",
+							"fill": "#309BEC"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M21.9904 25.3335H10.0096C9.45202 25.3335 9 24.9138 9 24.396V18.271C9 17.7532 9.45202 17.3335 10.0096 17.3335H21.9904C22.548 17.3335 23 17.7532 23 18.271V24.396C23 24.9138 22.548 25.3335 21.9904 25.3335ZM12.3654 23.4585V21.021L13.7115 22.5835L15.0577 21.021V23.4585H16.4038V19.2085H15.0577L13.7115 20.771L12.3654 19.2085H11.0192V23.4585H12.3654ZM20.0385 21.3335H21.3846L19.3654 23.521L17.3462 21.3335H18.6923V19.2085H20.0385V21.3335Z",
+					"fill": "white"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"opacity": "0.5",
+					"d": "M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z",
+					"fill": "white"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_3777_37339",
+							"x": "2",
+							"y": "0.333496",
+							"width": "28",
+							"height": "33.3335",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_3777_37339"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_3777_37339",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Md"
+}
diff --git a/app/components/base/icons/src/public/files/Md.tsx b/app/components/base/icons/src/public/files/Md.tsx
new file mode 100644
index 0000000..25d4205
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Md.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Md.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Md'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/files/Pdf.json b/app/components/base/icons/src/public/files/Pdf.json
new file mode 100644
index 0000000..7770f27
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Pdf.json
@@ -0,0 +1,169 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "32",
+			"height": "34",
+			"viewBox": "0 0 32 34",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"filter": "url(#filter0_d_3055_14420)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z",
+							"fill": "#DD3633"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"opacity": "0.96"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M13.2801 20.1362C13.2801 19.2002 12.6001 18.3042 11.3361 18.3042H9.08008V24.0002H10.4801V21.9682H11.3361C12.6001 21.9682 13.2801 21.0722 13.2801 20.1362ZM11.8801 20.1362C11.8801 20.4322 11.6561 20.7122 11.2721 20.7122H10.4801V19.5602H11.2721C11.6561 19.5602 11.8801 19.8402 11.8801 20.1362Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M18.3357 21.1522C18.3357 20.2562 18.4077 19.5282 17.7437 18.8642C17.3517 18.4722 16.7997 18.3042 16.2077 18.3042H14.0957V24.0002H16.2077C16.7997 24.0002 17.3517 23.8322 17.7437 23.4402C18.4077 22.7762 18.3357 22.0482 18.3357 21.1522ZM16.9357 21.1522C16.9357 22.1202 16.8957 22.2722 16.7837 22.4322C16.6557 22.6242 16.4637 22.7522 16.1117 22.7522H15.4957V19.5522H16.1117C16.4637 19.5522 16.6557 19.6802 16.7837 19.8722C16.8957 20.0322 16.9357 20.1922 16.9357 21.1522Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M23.1786 19.5522V18.3042H19.3066V24.0002H20.7066V21.8002H22.8186V20.5522H20.7066V19.5522H23.1786Z",
+							"fill": "white"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"opacity": "0.5",
+					"d": "M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z",
+					"fill": "white"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_3055_14420",
+							"x": "2",
+							"y": "0.333496",
+							"width": "28",
+							"height": "33.3335",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_3055_14420"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_3055_14420",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Pdf"
+}
diff --git a/app/components/base/icons/src/public/files/Pdf.tsx b/app/components/base/icons/src/public/files/Pdf.tsx
new file mode 100644
index 0000000..15444df
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Pdf.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Pdf.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Pdf'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/files/Txt.json b/app/components/base/icons/src/public/files/Txt.json
new file mode 100644
index 0000000..c689fc6
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Txt.json
@@ -0,0 +1,180 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "32",
+			"height": "34",
+			"viewBox": "0 0 32 34",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"filter": "url(#filter0_d_3055_14432)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z",
+							"fill": "#E3E5E8"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M4.25 7.73349C4.25 6.60926 4.25019 5.78113 4.30367 5.12666C4.3569 4.47511 4.46169 4.01774 4.65873 3.63103C5.01825 2.92542 5.59193 2.35175 6.29754 1.99222C6.68424 1.79518 7.14162 1.6904 7.79317 1.63716C8.44763 1.58369 9.27577 1.5835 10.4 1.5835H18.5631L27.75 10.7704V24.2668C27.75 25.3911 27.7498 26.2192 27.6963 26.8737C27.6431 27.5252 27.5383 27.9826 27.3413 28.3693C26.9817 29.0749 26.4081 29.6486 25.7025 30.0081C25.3158 30.2051 24.8584 30.3099 24.2068 30.3632C23.5524 30.4166 22.7242 30.4168 21.6 30.4168H10.4C9.27577 30.4168 8.44763 30.4166 7.79317 30.3632C7.14162 30.3099 6.68424 30.2051 6.29754 30.0081C5.59193 29.6486 5.01825 29.0749 4.65873 28.3693C4.46169 27.9826 4.3569 27.5252 4.30367 26.8737C4.25019 26.2192 4.25 25.3911 4.25 24.2668V7.73349Z",
+							"stroke": "black",
+							"stroke-opacity": "0.03",
+							"stroke-width": "0.5"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"opacity": "0.96"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M13.2254 19.5522V18.3042H9.02539V19.5522H10.4254V24.0002H11.8254V19.5522H13.2254Z",
+							"fill": "#667085"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M18.5371 24.0002L16.7611 21.0802L18.4251 18.3042H16.8331L16.0011 19.9122L15.1691 18.3042H13.5771L15.2411 21.0802L13.4651 24.0002H15.0651L16.0011 22.2482L16.9371 24.0002H18.5371Z",
+							"fill": "#667085"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M22.9754 19.5522V18.3042H18.7754V19.5522H20.1754V24.0002H21.5754V19.5522H22.9754Z",
+							"fill": "#667085"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"opacity": "0.5",
+					"d": "M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z",
+					"fill": "white"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_3055_14432",
+							"x": "2",
+							"y": "0.333496",
+							"width": "28",
+							"height": "33.3335",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_3055_14432"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_3055_14432",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Txt"
+}
diff --git a/app/components/base/icons/src/public/files/Txt.tsx b/app/components/base/icons/src/public/files/Txt.tsx
new file mode 100644
index 0000000..7b1f16c
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Txt.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Txt.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Txt'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/files/Unknown.json b/app/components/base/icons/src/public/files/Unknown.json
new file mode 100644
index 0000000..f1351e0
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Unknown.json
@@ -0,0 +1,199 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "32",
+			"height": "34",
+			"viewBox": "0 0 32 34",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"filter": "url(#filter0_d_3055_14436)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z",
+							"fill": "#E3E5E8"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M4.25 7.73349C4.25 6.60926 4.25019 5.78113 4.30367 5.12666C4.3569 4.47511 4.46169 4.01774 4.65873 3.63103C5.01825 2.92542 5.59193 2.35175 6.29754 1.99222C6.68424 1.79518 7.14162 1.6904 7.79317 1.63716C8.44763 1.58369 9.27577 1.5835 10.4 1.5835H18.5631L27.75 10.7704V24.2668C27.75 25.3911 27.7498 26.2192 27.6963 26.8737C27.6431 27.5252 27.5383 27.9826 27.3413 28.3693C26.9817 29.0749 26.4081 29.6486 25.7025 30.0081C25.3158 30.2051 24.8584 30.3099 24.2068 30.3632C23.5524 30.4166 22.7242 30.4168 21.6 30.4168H10.4C9.27577 30.4168 8.44763 30.4166 7.79317 30.3632C7.14162 30.3099 6.68424 30.2051 6.29754 30.0081C5.59193 29.6486 5.01825 29.0749 4.65873 28.3693C4.46169 27.9826 4.3569 27.5252 4.30367 26.8737C4.25019 26.2192 4.25 25.3911 4.25 24.2668V7.73349Z",
+							"stroke": "black",
+							"stroke-opacity": "0.03",
+							"stroke-width": "0.5"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M15.9998 23.1992C15.8014 23.1992 15.6039 23.1968 15.4077 23.1924V24.0549C15.4077 24.3819 15.6728 24.647 15.9998 24.647C16.3268 24.647 16.592 24.3819 16.592 24.0549V23.1924C16.3957 23.1968 16.1983 23.1992 15.9998 23.1992Z",
+					"fill": "#98A2B3"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M12.0984 22.8838L11.757 23.8593C11.649 24.168 11.8117 24.5058 12.1203 24.6138C12.185 24.6364 12.251 24.6472 12.3159 24.6472C12.5605 24.6472 12.7894 24.4944 12.8747 24.2505L13.2936 23.0534C12.8807 23.0073 12.481 22.9506 12.0984 22.8838Z",
+					"fill": "#98A2B3"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M20.2431 23.8593L19.9018 22.8838C19.5192 22.9506 19.1195 23.0073 18.7065 23.0534L19.1254 24.2505C19.2108 24.4944 19.4396 24.6472 19.6843 24.6472C19.7491 24.6472 19.8151 24.6364 19.8798 24.6138C20.1885 24.5058 20.3511 24.168 20.2431 23.8593Z",
+					"fill": "#98A2B3"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M20.1624 17.2634C20.2697 17.6416 20.3254 18.0369 20.3254 18.4409C20.3254 18.9087 20.05 19.3327 19.6226 19.5228C19.5564 19.5522 17.9801 20.2436 16.0359 20.2436C14.0917 20.2436 12.5153 19.5522 12.4492 19.5228C12.0218 19.3327 11.7464 18.9086 11.7464 18.4409C11.7464 18.0312 11.8037 17.6305 11.914 17.2476C10.3343 17.5645 8.5 18.2009 8.5 19.4464C8.5 20.2859 9.32512 20.9477 10.9525 21.4134C11.4194 21.547 11.9381 21.66 12.4949 21.7506C12.8783 21.813 13.28 21.8648 13.6953 21.9056C14.2455 21.9597 14.8197 21.9942 15.4079 22.0082C15.6039 22.0128 15.8013 22.0153 16 22.0153C16.1987 22.0153 16.3962 22.0128 16.5921 22.0082C17.1803 21.9943 17.7545 21.9596 18.3047 21.9056C18.72 21.8648 19.1217 21.8131 19.5051 21.7506C20.062 21.66 20.5807 21.547 21.0476 21.4134C22.6749 20.9477 23.5 20.2859 23.5 19.4464C23.5 18.2187 21.7108 17.5833 20.1624 17.2634Z",
+					"fill": "#98A2B3"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M18.8441 17.1144C18.7585 16.9335 18.6559 16.7622 18.5384 16.6025C18.4174 16.4382 18.2809 16.286 18.1307 16.1486C17.5784 15.6437 16.8433 15.3354 16.036 15.3354C15.2318 15.3354 14.499 15.6411 13.9476 16.1426C13.7974 16.2791 13.6609 16.4303 13.5399 16.5937C13.4217 16.753 13.3185 16.924 13.2322 17.1048C13.039 17.5095 12.9307 17.9624 12.9307 18.4407C12.9307 18.4407 14.321 19.0592 16.036 19.0592C17.751 19.0592 19.1412 18.4407 19.1412 18.4407C19.1412 17.9662 19.0344 17.5167 18.8441 17.1144Z",
+					"fill": "#98A2B3"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"opacity": "0.5",
+					"d": "M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z",
+					"fill": "white"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_3055_14436",
+							"x": "2",
+							"y": "0.333496",
+							"width": "28",
+							"height": "33.3335",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_3055_14436"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_3055_14436",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Unknown"
+}
diff --git a/app/components/base/icons/src/public/files/Unknown.tsx b/app/components/base/icons/src/public/files/Unknown.tsx
new file mode 100644
index 0000000..1b7c658
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Unknown.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Unknown.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Unknown'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/files/Xlsx.json b/app/components/base/icons/src/public/files/Xlsx.json
new file mode 100644
index 0000000..5f0e7a9
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Xlsx.json
@@ -0,0 +1,145 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "26",
+			"viewBox": "0 0 24 26",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"filter": "url(#filter0_d_5938_927)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M3 5.8C3 4.11984 3 3.27976 3.32698 2.63803C3.6146 2.07354 4.07354 1.6146 4.63803 1.32698C5.27976 1 6.11984 1 7.8 1H14L21 8V18.2C21 19.8802 21 20.7202 20.673 21.362C20.3854 21.9265 19.9265 22.3854 19.362 22.673C18.7202 23 17.8802 23 16.2 23H7.8C6.11984 23 5.27976 23 4.63803 22.673C4.07354 22.3854 3.6146 21.9265 3.32698 21.362C3 20.7202 3 19.8802 3 18.2V5.8Z",
+							"fill": "#169951"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"opacity": "0.5",
+					"d": "M14 1L21 8H16C14.8954 8 14 7.10457 14 6V1Z",
+					"fill": "white"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M17 12C17.5523 12 18 12.4477 18 13V18C18 18.5523 17.5523 19 17 19H7C6.44772 19 6 18.5523 6 18V13C6 12.4477 6.44772 12 7 12H17ZM11.5 13H7L7 15H11.5V13ZM12.5 18H17V16H12.5V18ZM11.5 16V18H7L7 16H11.5ZM12.5 15H17V13H12.5V15Z",
+					"fill": "white",
+					"fill-opacity": "0.96"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_5938_927",
+							"x": "1",
+							"y": "0",
+							"width": "22",
+							"height": "26",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_5938_927"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_5938_927",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Xlsx"
+}
diff --git a/app/components/base/icons/src/public/files/Xlsx.tsx b/app/components/base/icons/src/public/files/Xlsx.tsx
new file mode 100644
index 0000000..399570b
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Xlsx.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Xlsx.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Xlsx'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/files/Yaml.json b/app/components/base/icons/src/public/files/Yaml.json
new file mode 100644
index 0000000..aa05cb4
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Yaml.json
@@ -0,0 +1,181 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"fill": "none",
+			"height": "26",
+			"viewBox": "0 0 24 26",
+			"width": "24",
+			"xmlns": "http://www.w3.org/2000/svg",
+			"xmlns:xlink": "http://www.w3.org/1999/xlink"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "filter",
+				"attributes": {
+					"id": "a",
+					"color-interpolation-filters": "sRGB",
+					"filterUnits": "userSpaceOnUse",
+					"height": "26",
+					"width": "22",
+					"x": "1",
+					"y": "0"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "feFlood",
+						"attributes": {
+							"flood-opacity": "0",
+							"result": "BackgroundImageFix"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "feColorMatrix",
+						"attributes": {
+							"in": "SourceAlpha",
+							"result": "hardAlpha",
+							"type": "matrix",
+							"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "feOffset",
+						"attributes": {
+							"dy": "1"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "feGaussianBlur",
+						"attributes": {
+							"stdDeviation": "1"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "feColorMatrix",
+						"attributes": {
+							"type": "matrix",
+							"values": "0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "feBlend",
+						"attributes": {
+							"in2": "BackgroundImageFix",
+							"mode": "normal",
+							"result": "effect1_dropShadow_7605_8828"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "feBlend",
+						"attributes": {
+							"in": "SourceGraphic",
+							"in2": "effect1_dropShadow_7605_8828",
+							"mode": "normal",
+							"result": "shape"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"filter": "url(#a)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "m3 5.8c0-1.68016 0-2.52024.32698-3.16197.28762-.56449.74656-1.02343 1.31105-1.31105.64173-.32698 1.48181-.32698 3.16197-.32698h6.2l7 7v10.2c0 1.6802 0 2.5202-.327 3.162-.2876.5645-.7465 1.0234-1.311 1.311-.6418.327-1.4818.327-3.162.327h-8.4c-1.68016 0-2.52024 0-3.16197-.327-.56449-.2876-1.02343-.7465-1.31105-1.311-.32698-.6418-.32698-1.4818-.32698-3.162z",
+							"fill": "#e8eaed"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "m16.2 22.75h-8.4c-.8442 0-1.46232-.0002-1.95004-.04-.48479-.0397-.81868-.1172-1.09843-.2597-.51745-.2637-.93815-.6844-1.2018-1.2018-.14254-.2798-.22008-.6137-.25969-1.0985-.03985-.4877-.04004-1.1058-.04004-1.95v-12.4c0-.8442.00019-1.46232.04004-1.95004.03961-.48479.11715-.81868.25969-1.09843.26365-.51745.68435-.93815 1.2018-1.2018.27975-.14254.61364-.22008 1.09843-.25969.48772-.03985 1.10584-.04004 1.95004-.04004h6.0964l6.8536 6.85355v10.09645c0 .8442-.0002 1.4623-.04 1.95-.0397.4848-.1172.8187-.2597 1.0985-.2637.5174-.6844.9381-1.2018 1.2018-.2798.1425-.6137.22-1.0985.2597-.4877.0398-1.1058.04-1.95.04z",
+							"stroke": "#000",
+							"stroke-opacity": ".03",
+							"stroke-width": ".5"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "m14 1 7 7h-5c-1.1046 0-2-.89543-2-2z",
+					"fill": "#fff",
+					"opacity": ".5"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "m11.5264 9-2.15191 3.2267v2.0455h-1.31897v-2.0455l-2.05552-3.2267h1.48242l1.30707 2.0776 1.31781-2.0776z",
+					"fill": "#000"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "m13.7426 13.1121h-2.3874l-.4855 1.1724h-1.0572l2.2355-5.27223h1.0813l2.1448 5.27223h-1.1297zm-.3966-1.0526-.7318-1.9348-.8165 1.9348z",
+					"fill": "#cb171e"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"fill": "#000"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "m8.05469 14.8635v5.1673h1.10866v-3.5643l1.16025 2.3957h.8727l1.1999-2.4799v3.6474h1.0636v-5.1662h-1.4522l-1.2885 2.3369-1.22722-2.3369z"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "m17.9994 18.9079h-2.7272v-4.0456h-1.1296v5.1451h3.8568z"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Yaml"
+}
diff --git a/app/components/base/icons/src/public/files/Yaml.tsx b/app/components/base/icons/src/public/files/Yaml.tsx
new file mode 100644
index 0000000..5f95d27
--- /dev/null
+++ b/app/components/base/icons/src/public/files/Yaml.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Yaml.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Yaml'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/files/index.ts b/app/components/base/icons/src/public/files/index.ts
new file mode 100644
index 0000000..f38c28c
--- /dev/null
+++ b/app/components/base/icons/src/public/files/index.ts
@@ -0,0 +1,11 @@
+export { default as Csv } from './Csv'
+export { default as Doc } from './Doc'
+export { default as Docx } from './Docx'
+export { default as Html } from './Html'
+export { default as Json } from './Json'
+export { default as Md } from './Md'
+export { default as Pdf } from './Pdf'
+export { default as Txt } from './Txt'
+export { default as Unknown } from './Unknown'
+export { default as Xlsx } from './Xlsx'
+export { default as Yaml } from './Yaml'
diff --git a/app/components/base/icons/src/public/knowledge/Chunk.json b/app/components/base/icons/src/public/knowledge/Chunk.json
new file mode 100644
index 0000000..91e85f2
--- /dev/null
+++ b/app/components/base/icons/src/public/knowledge/Chunk.json
@@ -0,0 +1,116 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "10",
+			"height": "10",
+			"viewBox": "0 0 10 10",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Group"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M2.5 10H0V7.5H2.5V10Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M6.25 6.25H3.75V3.75H6.25V6.25Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_3",
+							"d": "M2.5 6.25H0V3.75H2.5V6.25Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_4",
+							"d": "M6.25 2.5H3.75V0H6.25V2.5Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_5",
+							"d": "M2.5 2.5H0V0H2.5V2.5Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_6",
+							"d": "M10 2.5H7.5V0H10V2.5Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_7",
+							"d": "M9.58342 7.91663H7.91675V9.58329H9.58342V7.91663Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_8",
+							"d": "M9.58342 4.16663H7.91675V5.83329H9.58342V4.16663Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_9",
+							"d": "M5.83341 7.91663H4.16675V9.58329H5.83341V7.91663Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Chunk"
+}
diff --git a/app/components/base/icons/src/public/knowledge/Chunk.tsx b/app/components/base/icons/src/public/knowledge/Chunk.tsx
new file mode 100644
index 0000000..a01bd1e
--- /dev/null
+++ b/app/components/base/icons/src/public/knowledge/Chunk.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Chunk.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Chunk'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/knowledge/Collapse.json b/app/components/base/icons/src/public/knowledge/Collapse.json
new file mode 100644
index 0000000..726b074
--- /dev/null
+++ b/app/components/base/icons/src/public/knowledge/Collapse.json
@@ -0,0 +1,62 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon L"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M2.66602 11.3333H0.666016L3.33268 8.66667L5.99935 11.3333H3.99935L3.99935 14H2.66602L2.66602 11.3333Z",
+									"fill": "#354052"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M2.66602 4.66667L2.66602 2L3.99935 2L3.99935 4.66667L5.99935 4.66667L3.33268 7.33333L0.666016 4.66667L2.66602 4.66667Z",
+									"fill": "#354052"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M7.33268 2.66667H13.9993V4H7.33268V2.66667ZM7.33268 12H13.9993V13.3333H7.33268V12ZM5.99935 7.33333H13.9993V8.66667H5.99935V7.33333Z",
+									"fill": "#354052"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Collapse"
+}
diff --git a/app/components/base/icons/src/public/knowledge/Collapse.tsx b/app/components/base/icons/src/public/knowledge/Collapse.tsx
new file mode 100644
index 0000000..6f43dde
--- /dev/null
+++ b/app/components/base/icons/src/public/knowledge/Collapse.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Collapse.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Collapse'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/knowledge/GeneralType.json b/app/components/base/icons/src/public/knowledge/GeneralType.json
new file mode 100644
index 0000000..5cbfb1a
--- /dev/null
+++ b/app/components/base/icons/src/public/knowledge/GeneralType.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon L"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M6 0.5C6.27615 0.5 6.5 0.72386 6.5 1V1.52755C6.95855 1.57831 7.3967 1.69804 7.80355 1.87619L8.067 1.41997C8.20505 1.18083 8.51085 1.09889 8.75 1.23696C8.98915 1.37503 9.07105 1.68082 8.933 1.91998L8.6692 2.37685C9.033 2.64523 9.3548 2.96707 9.6232 3.33084L10.0801 3.06703C10.3193 2.92896 10.6251 3.0109 10.7632 3.25005C10.9012 3.4892 10.8193 3.79499 10.5801 3.93306L10.1238 4.19649C10.302 4.60333 10.4218 5.0415 10.4725 5.50005H11C11.2761 5.50005 11.5 5.7239 11.5 6.00005C11.5 6.2762 11.2761 6.50005 11 6.50005H10.4725C10.4218 6.9586 10.302 7.3968 10.1238 7.80365L10.5801 8.0671C10.8193 8.20515 10.9012 8.51095 10.7632 8.7501C10.6251 8.98925 10.3193 9.0712 10.0801 8.9331L9.6232 8.6693C9.3548 9.03305 9.03295 9.3549 8.6692 9.62325L8.933 10.0802C9.07105 10.3193 8.98915 10.6251 8.75 10.7632C8.51085 10.9012 8.20505 10.8193 8.067 10.5802L7.80355 10.1239C7.3967 10.3021 6.95855 10.4218 6.5 10.4726V11C6.5 11.2761 6.27615 11.5 6 11.5C5.72385 11.5 5.5 11.2761 5.5 11V10.4726C5.04145 10.4218 4.60328 10.3021 4.19644 10.1239L3.933 10.5802C3.79493 10.8194 3.48914 10.9013 3.24999 10.7633C3.01084 10.6252 2.92891 10.3194 3.06698 10.0802L3.3308 9.62325C2.96702 9.3549 2.64517 9.03305 2.37678 8.66925L1.91986 8.93305C1.68071 9.07115 1.37492 8.9892 1.23685 8.75005C1.09878 8.5109 1.18072 8.2051 1.41986 8.06705L1.87612 7.8036C1.69797 7.39675 1.57824 6.9586 1.52749 6.50005L0.999975 6.5C0.723835 6.5 0.499987 6.2761 0.5 6C0.500015 5.72385 0.72388 5.5 1.00003 5.5L1.5275 5.50005C1.57825 5.0415 1.69796 4.60335 1.87611 4.19652L1.41987 3.93312C1.18072 3.79504 1.09878 3.48925 1.23685 3.2501C1.37492 3.01095 1.68071 2.92901 1.91985 3.06709L2.37675 3.33086C2.64514 2.96708 2.967 2.64524 3.33078 2.37684L3.06698 1.91992C2.92891 1.68077 3.01084 1.37498 3.24999 1.23691C3.48914 1.09884 3.79493 1.18077 3.933 1.41992L4.19642 1.87619C4.60327 1.69803 5.04145 1.57831 5.5 1.52755V1C5.5 0.72386 5.72385 0.5 6 0.5ZM3.83484 3.24991C3.48643 3.52463 3.19141 3.86415 2.96808 4.25014C2.67048 4.7645 2.49999 5.3616 2.49999 6.00005C2.49999 6.6385 2.67048 7.2356 2.96809 7.75C3.19142 8.13595 3.48645 8.4755 3.83486 8.7502L4.8599 6.97475C4.63581 6.71285 4.49999 6.37245 4.49999 6.00005C4.49999 5.62765 4.63581 5.28725 4.8599 5.02535L3.83484 3.24991ZM5.7258 4.52514L4.70041 2.74911C5.10185 2.58847 5.5402 2.50005 6 2.50005C6.63845 2.50005 7.23555 2.67054 7.74995 2.96816C8.28125 3.27557 8.7245 3.71882 9.0319 4.25012C9.2503 4.62764 9.4003 5.04975 9.4646 5.50005H7.41465C7.2087 4.91745 6.6531 4.50005 6 4.50005C5.9065 4.50005 5.8148 4.50865 5.7258 4.52514ZM7.41465 6.50005C7.2087 7.08265 6.6531 7.50005 6 7.50005C5.9065 7.50005 5.8148 7.49145 5.7258 7.47495L4.70043 9.251C5.10185 9.41165 5.5402 9.50005 6 9.50005C6.63845 9.50005 7.23555 9.32955 7.7499 9.03195C8.2812 8.72455 8.72445 8.2813 9.03185 7.75C9.2503 7.3725 9.4003 6.95035 9.4646 6.50005H7.41465Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "GeneralType"
+}
diff --git a/app/components/base/icons/src/public/knowledge/GeneralType.tsx b/app/components/base/icons/src/public/knowledge/GeneralType.tsx
new file mode 100644
index 0000000..29005b8
--- /dev/null
+++ b/app/components/base/icons/src/public/knowledge/GeneralType.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './GeneralType.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'GeneralType'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/knowledge/LayoutRight2LineMod.json b/app/components/base/icons/src/public/knowledge/LayoutRight2LineMod.json
new file mode 100644
index 0000000..194bec7
--- /dev/null
+++ b/app/components/base/icons/src/public/knowledge/LayoutRight2LineMod.json
@@ -0,0 +1,36 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon L"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M14.0002 2C14.3684 2 14.6668 2.29848 14.6668 2.66667V13.3333C14.6668 13.7015 14.3684 14 14.0002 14H2.00016C1.63198 14 1.3335 13.7015 1.3335 13.3333V2.66667C1.3335 2.29848 1.63198 2 2.00016 2H14.0002ZM13.3335 3.33333H2.66683V12.6667H13.3335V3.33333ZM14.0002 2.66667V13.3333H10.0002V2.66667H14.0002Z",
+							"fill": "#354052"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "LayoutRight2LineMod"
+}
diff --git a/app/components/base/icons/src/public/knowledge/LayoutRight2LineMod.tsx b/app/components/base/icons/src/public/knowledge/LayoutRight2LineMod.tsx
new file mode 100644
index 0000000..18327cd
--- /dev/null
+++ b/app/components/base/icons/src/public/knowledge/LayoutRight2LineMod.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LayoutRight2LineMod.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LayoutRight2LineMod'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/knowledge/ParentChildType.json b/app/components/base/icons/src/public/knowledge/ParentChildType.json
new file mode 100644
index 0000000..2d3270e
--- /dev/null
+++ b/app/components/base/icons/src/public/knowledge/ParentChildType.json
@@ -0,0 +1,56 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "10",
+			"height": "11",
+			"viewBox": "0 0 10 11",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Group"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M2.70833 3.87501C3.51375 3.87501 4.16666 3.22209 4.16666 2.41668C4.16666 1.61126 3.51375 0.958344 2.70833 0.958344C1.90292 0.958344 1.25 1.61126 1.25 2.41668C1.25 3.22209 1.90292 3.87501 2.70833 3.87501Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M7.29158 3.87501C8.097 3.87501 8.74992 3.22209 8.74992 2.41668C8.74992 1.61126 8.097 0.958344 7.29158 0.958344C6.48617 0.958344 5.83325 1.61126 5.83325 2.41668C5.83325 3.22209 6.48617 3.87501 7.29158 3.87501Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_3",
+							"d": "M7.29167 4.70835C6.83771 4.70886 6.39118 4.82363 5.99324 5.04208C5.59529 5.26053 5.25874 5.57563 5.01459 5.95835C5.34482 5.9622 5.66011 6.09658 5.89159 6.33215C6.12306 6.56771 6.25191 6.8853 6.24998 7.21555C6.24805 7.5458 6.11551 7.86187 5.8813 8.09472C5.6471 8.32756 5.33026 8.45826 5 8.45826C4.66975 8.45826 4.35291 8.32756 4.1187 8.09472C3.8845 7.86187 3.75195 7.5458 3.75003 7.21555C3.7481 6.8853 3.87695 6.56771 4.10842 6.33215C4.3399 6.09658 4.65519 5.9622 4.98542 5.95835C4.67086 5.46415 4.20432 5.08546 3.656 4.87926C3.10767 4.67306 2.50721 4.6505 1.94496 4.81497C1.3827 4.97944 0.889064 5.32205 0.538306 5.79125C0.187547 6.26045 -0.00135882 6.83086 7.35834e-06 7.41668V10.125C7.35834e-06 10.2355 0.043906 10.3415 0.122046 10.4196C0.200186 10.4978 0.306167 10.5417 0.416674 10.5417H3.33334V9.50001L1.83334 8.37501C1.78957 8.34218 1.75269 8.30105 1.72481 8.25397C1.69693 8.20688 1.6786 8.15477 1.67086 8.1006C1.65523 7.99121 1.6837 7.88008 1.75001 7.79168C1.81631 7.70327 1.91502 7.64483 2.02441 7.6292C2.13381 7.61357 2.24493 7.64204 2.33334 7.70835L3.88875 8.87501H6.11125L7.66667 7.70835C7.75507 7.64204 7.8662 7.61357 7.97559 7.6292C8.08499 7.64483 8.1837 7.70327 8.25 7.79168C8.31631 7.88008 8.34478 7.99121 8.32915 8.1006C8.31352 8.21 8.25507 8.30871 8.16667 8.37501L6.66667 9.50001V10.5417H9.58333C9.69384 10.5417 9.79982 10.4978 9.87796 10.4196C9.9561 10.3415 10 10.2355 10 10.125V7.41668C9.99912 6.69866 9.71349 6.01029 9.20577 5.50257C8.69805 4.99485 8.00969 4.70923 7.29167 4.70835Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ParentChildType"
+}
diff --git a/app/components/base/icons/src/public/knowledge/ParentChildType.tsx b/app/components/base/icons/src/public/knowledge/ParentChildType.tsx
new file mode 100644
index 0000000..1073150
--- /dev/null
+++ b/app/components/base/icons/src/public/knowledge/ParentChildType.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ParentChildType.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ParentChildType'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/knowledge/SelectionMod.json b/app/components/base/icons/src/public/knowledge/SelectionMod.json
new file mode 100644
index 0000000..c88e278
--- /dev/null
+++ b/app/components/base/icons/src/public/knowledge/SelectionMod.json
@@ -0,0 +1,116 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "10",
+			"height": "10",
+			"viewBox": "0 0 10 10",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Group"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M2.5 10H0V7.5H2.5V10Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M6.25 6.25H3.75V3.75H6.25V6.25Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_3",
+							"d": "M2.5 6.25H0V3.75H2.5V6.25Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_4",
+							"d": "M6.25 2.5H3.75V0H6.25V2.5Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_5",
+							"d": "M2.5 2.5H0V0H2.5V2.5Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_6",
+							"d": "M10 2.5H7.5V0H10V2.5Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_7",
+							"d": "M9.58332 7.91663H7.91666V9.58329H9.58332V7.91663Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_8",
+							"d": "M9.58332 4.16663H7.91666V5.83329H9.58332V4.16663Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_9",
+							"d": "M5.83332 7.91663H4.16666V9.58329H5.83332V7.91663Z",
+							"fill": "#676F83"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "SelectionMod"
+}
diff --git a/app/components/base/icons/src/public/knowledge/SelectionMod.tsx b/app/components/base/icons/src/public/knowledge/SelectionMod.tsx
new file mode 100644
index 0000000..a2d60fa
--- /dev/null
+++ b/app/components/base/icons/src/public/knowledge/SelectionMod.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './SelectionMod.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'SelectionMod'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/knowledge/index.ts b/app/components/base/icons/src/public/knowledge/index.ts
new file mode 100644
index 0000000..0af2cf3
--- /dev/null
+++ b/app/components/base/icons/src/public/knowledge/index.ts
@@ -0,0 +1,6 @@
+export { default as Chunk } from './Chunk'
+export { default as Collapse } from './Collapse'
+export { default as GeneralType } from './GeneralType'
+export { default as LayoutRight2LineMod } from './LayoutRight2LineMod'
+export { default as ParentChildType } from './ParentChildType'
+export { default as SelectionMod } from './SelectionMod'
diff --git a/app/components/base/icons/src/public/llm/Anthropic.json b/app/components/base/icons/src/public/llm/Anthropic.json
new file mode 100644
index 0000000..db33abd
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Anthropic.json
@@ -0,0 +1,37 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"width": "24",
+					"height": "24",
+					"rx": "6",
+					"fill": "#CA9F7B"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M15.3843 6.43481H12.9687L17.3739 17.5652H19.7896L15.3843 6.43481ZM8.40522 6.43481L4 17.5652H6.4633L7.36417 15.2279H11.9729L12.8737 17.5652H15.337L10.9318 6.43481H8.40522ZM8.16104 13.1607L9.66852 9.24907L11.176 13.1607H8.16104Z",
+					"fill": "#191918"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Anthropic"
+}
diff --git a/app/components/base/icons/src/public/llm/Anthropic.tsx b/app/components/base/icons/src/public/llm/Anthropic.tsx
new file mode 100644
index 0000000..f5de0f5
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Anthropic.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Anthropic.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Anthropic'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/AnthropicDark.json b/app/components/base/icons/src/public/llm/AnthropicDark.json
new file mode 100644
index 0000000..ca066c2
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/AnthropicDark.json
@@ -0,0 +1,1046 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "90",
+			"height": "10",
+			"viewBox": "0 0 90 10",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Anthropic",
+					"clip-path": "url(#clip0_5981_49007)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Clip path group"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "mask",
+								"attributes": {
+									"id": "mask0_5981_49007",
+									"style": "mask-type:luminance",
+									"maskUnits": "userSpaceOnUse",
+									"x": "0",
+									"y": "-1",
+									"width": "90",
+									"height": "11"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "g",
+										"attributes": {
+											"id": "__lottie_element_2"
+										},
+										"children": [
+											{
+												"type": "element",
+												"name": "path",
+												"attributes": {
+													"id": "Vector",
+													"d": "M89.375 -0.00195312H0V9.99805H89.375V-0.00195312Z",
+													"fill": "white"
+												},
+												"children": []
+											}
+										]
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"mask": "url(#mask0_5981_49007)"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "g",
+										"attributes": {
+											"id": "Group"
+										},
+										"children": [
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"id": "Clip path group_2"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "mask",
+														"attributes": {
+															"id": "mask1_5981_49007",
+															"style": "mask-type:luminance",
+															"maskUnits": "userSpaceOnUse",
+															"x": "0",
+															"y": "-1",
+															"width": "90",
+															"height": "11"
+														},
+														"children": [
+															{
+																"type": "element",
+																"name": "g",
+																"attributes": {
+																	"id": "__lottie_element_4"
+																},
+																"children": [
+																	{
+																		"type": "element",
+																		"name": "path",
+																		"attributes": {
+																			"id": "Vector_2",
+																			"d": "M0 -0.00390625H89.375V9.99609H0V-0.00390625Z",
+																			"fill": "white"
+																		},
+																		"children": []
+																	}
+																]
+															}
+														]
+													},
+													{
+														"type": "element",
+														"name": "g",
+														"attributes": {
+															"mask": "url(#mask1_5981_49007)"
+														},
+														"children": [
+															{
+																"type": "element",
+																"name": "g",
+																"attributes": {
+																	"id": "Group_2"
+																},
+																"children": [
+																	{
+																		"type": "element",
+																		"name": "g",
+																		"attributes": {
+																			"id": "Clip path group_3"
+																		},
+																		"children": [
+																			{
+																				"type": "element",
+																				"name": "mask",
+																				"attributes": {
+																					"id": "mask2_5981_49007",
+																					"style": "mask-type:luminance",
+																					"maskUnits": "userSpaceOnUse",
+																					"x": "0",
+																					"y": "-1",
+																					"width": "90",
+																					"height": "11"
+																				},
+																				"children": [
+																					{
+																						"type": "element",
+																						"name": "g",
+																						"attributes": {
+																							"id": "__lottie_element_12"
+																						},
+																						"children": [
+																							{
+																								"type": "element",
+																								"name": "path",
+																								"attributes": {
+																									"id": "Vector_3",
+																									"d": "M0 -0.00585938H89.375V9.99414H0V-0.00585938Z",
+																									"fill": "white"
+																								},
+																								"children": []
+																							}
+																						]
+																					}
+																				]
+																			},
+																			{
+																				"type": "element",
+																				"name": "g",
+																				"attributes": {
+																					"mask": "url(#mask2_5981_49007)"
+																				},
+																				"children": [
+																					{
+																						"type": "element",
+																						"name": "g",
+																						"attributes": {
+																							"id": "Group_3"
+																						},
+																						"children": [
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_4"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask3_5981_49007",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_89"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_4",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask3_5981_49007)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_4"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_5"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_6"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_5",
+																																			"d": "M18.1273 6.92438L13.7773 0.15625H11.4297V9.82501H13.4321V3.05688L17.7821 9.82501H20.1297V0.15625H18.1273V6.92438Z",
+																																			"fill": "black",
+																																			"fill-opacity": "0.95"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_5"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask4_5981_49007",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_80"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_6",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask4_5981_49007)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_7"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_8"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_9"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_7",
+																																			"d": "M21.7969 2.02094H25.0423V9.82501H27.1139V2.02094H30.3594V0.15625H21.7969V2.02094Z",
+																																			"fill": "black",
+																																			"fill-opacity": "0.95"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_6"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask5_5981_49007",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_71"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_8",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask5_5981_49007)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_10"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_11"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_12"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_9",
+																																			"d": "M38.6442 4.00994H34.0871V0.15625H32.0156V9.82501H34.0871V5.87463H38.6442V9.82501H40.7156V0.15625H38.6442V4.00994Z",
+																																			"fill": "black",
+																																			"fill-opacity": "0.95"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_7"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask6_5981_49007",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_62"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_10",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask6_5981_49007)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_13"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_14"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_15"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_11",
+																																			"d": "M45.3376 2.02094H47.893C48.9152 2.02094 49.4539 2.39387 49.4539 3.09831C49.4539 3.80275 48.9152 4.17569 47.893 4.17569H45.3376V2.02094ZM51.5259 3.09831C51.5259 1.27506 50.186 0.15625 47.9897 0.15625H43.2656V9.82501H45.3376V6.04037H47.6443L49.7164 9.82501H52.0094L49.715 5.75211C50.8666 5.30941 51.5259 4.37721 51.5259 3.09831Z",
+																																			"fill": "black",
+																																			"fill-opacity": "0.95"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_8"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask7_5981_49007",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_53"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_12",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask7_5981_49007)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_16"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_17"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_18"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_13",
+																																			"d": "M57.8732 8.05653C56.2438 8.05653 55.2496 6.89631 55.2496 5.00404C55.2496 3.08416 56.2438 1.92394 57.8732 1.92394C59.4887 1.92394 60.4691 3.08416 60.4691 5.00404C60.4691 6.89631 59.4887 8.05653 57.8732 8.05653ZM57.8732 -0.00976562C55.0839 -0.00976562 53.1094 2.06206 53.1094 5.00404C53.1094 7.91841 55.0839 9.99023 57.8732 9.99023C60.6486 9.99023 62.6094 7.91841 62.6094 5.00404C62.6094 2.06206 60.6486 -0.00976562 57.8732 -0.00976562Z",
+																																			"fill": "black",
+																																			"fill-opacity": "0.95"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_9"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask8_5981_49007",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_44"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_14",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask8_5981_49007)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_19"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_20"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_21"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_15",
+																																			"d": "M69.1794 4.45194H66.6233V2.02094H69.1794C70.2019 2.02094 70.7407 2.43532 70.7407 3.23644C70.7407 4.03756 70.2019 4.45194 69.1794 4.45194ZM69.2762 0.15625H64.5508V9.82501H66.6233V6.31662H69.2762C71.473 6.31662 72.8133 5.15637 72.8133 3.23644C72.8133 1.3165 71.473 0.15625 69.2762 0.15625Z",
+																																			"fill": "black",
+																																			"fill-opacity": "0.95"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_10"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask9_5981_49007",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_35"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_16",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask9_5981_49007)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_22"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_23"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_24"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_17",
+																																			"d": "M86.8413 6.57863C86.4823 7.51786 85.7642 8.05653 84.7837 8.05653C83.1542 8.05653 82.16 6.89631 82.16 5.00404C82.16 3.08416 83.1542 1.92394 84.7837 1.92394C85.7642 1.92394 86.4823 2.46261 86.8413 3.40183H89.0369C88.4984 1.33002 86.8827 -0.00976562 84.7837 -0.00976562C81.9942 -0.00976562 80.0195 2.06206 80.0195 5.00404C80.0195 7.91841 81.9942 9.99023 84.7837 9.99023C86.8965 9.99023 88.5122 8.63664 89.0508 6.57863H86.8413Z",
+																																			"fill": "black",
+																																			"fill-opacity": "0.95"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_11"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask10_5981_49007",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_26"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_18",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask10_5981_49007)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_25"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_26"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_27"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_19",
+																																			"d": "M73.6484 0.15625L77.5033 9.82501H79.6172L75.7624 0.15625H73.6484Z",
+																																			"fill": "black",
+																																			"fill-opacity": "0.95"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_12"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask11_5981_49007",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_17"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_20",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask11_5981_49007)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_28"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_29"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_30"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_21",
+																																			"d": "M3.64038 5.99893L4.95938 2.60106L6.27838 5.99893H3.64038ZM3.85422 0.15625L0 9.82501H2.15505L2.9433 7.79456H6.97558L7.76371 9.82501H9.91875L6.06453 0.15625H3.85422Z",
+																																			"fill": "black",
+																																			"fill-opacity": "0.95"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							}
+																						]
+																					}
+																				]
+																			}
+																		]
+																	}
+																]
+															}
+														]
+													}
+												]
+											}
+										]
+									}
+								]
+							}
+						]
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_5981_49007"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "89.375",
+									"height": "10",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "AnthropicDark"
+}
diff --git a/app/components/base/icons/src/public/llm/AnthropicDark.tsx b/app/components/base/icons/src/public/llm/AnthropicDark.tsx
new file mode 100644
index 0000000..d174400
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/AnthropicDark.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AnthropicDark.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AnthropicDark'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/AnthropicLight.json b/app/components/base/icons/src/public/llm/AnthropicLight.json
new file mode 100644
index 0000000..2d2b0aa
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/AnthropicLight.json
@@ -0,0 +1,1046 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "90",
+			"height": "10",
+			"viewBox": "0 0 90 10",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Anthropic",
+					"clip-path": "url(#clip0_5981_52010)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Clip path group"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "mask",
+								"attributes": {
+									"id": "mask0_5981_52010",
+									"style": "mask-type:luminance",
+									"maskUnits": "userSpaceOnUse",
+									"x": "0",
+									"y": "-1",
+									"width": "90",
+									"height": "11"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "g",
+										"attributes": {
+											"id": "__lottie_element_2"
+										},
+										"children": [
+											{
+												"type": "element",
+												"name": "path",
+												"attributes": {
+													"id": "Vector",
+													"d": "M89.375 -0.00195312H0V9.99805H89.375V-0.00195312Z",
+													"fill": "white"
+												},
+												"children": []
+											}
+										]
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"mask": "url(#mask0_5981_52010)"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "g",
+										"attributes": {
+											"id": "Group"
+										},
+										"children": [
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"id": "Clip path group_2"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "mask",
+														"attributes": {
+															"id": "mask1_5981_52010",
+															"style": "mask-type:luminance",
+															"maskUnits": "userSpaceOnUse",
+															"x": "0",
+															"y": "-1",
+															"width": "90",
+															"height": "11"
+														},
+														"children": [
+															{
+																"type": "element",
+																"name": "g",
+																"attributes": {
+																	"id": "__lottie_element_4"
+																},
+																"children": [
+																	{
+																		"type": "element",
+																		"name": "path",
+																		"attributes": {
+																			"id": "Vector_2",
+																			"d": "M0 -0.00390625H89.375V9.99609H0V-0.00390625Z",
+																			"fill": "white"
+																		},
+																		"children": []
+																	}
+																]
+															}
+														]
+													},
+													{
+														"type": "element",
+														"name": "g",
+														"attributes": {
+															"mask": "url(#mask1_5981_52010)"
+														},
+														"children": [
+															{
+																"type": "element",
+																"name": "g",
+																"attributes": {
+																	"id": "Group_2"
+																},
+																"children": [
+																	{
+																		"type": "element",
+																		"name": "g",
+																		"attributes": {
+																			"id": "Clip path group_3"
+																		},
+																		"children": [
+																			{
+																				"type": "element",
+																				"name": "mask",
+																				"attributes": {
+																					"id": "mask2_5981_52010",
+																					"style": "mask-type:luminance",
+																					"maskUnits": "userSpaceOnUse",
+																					"x": "0",
+																					"y": "-1",
+																					"width": "90",
+																					"height": "11"
+																				},
+																				"children": [
+																					{
+																						"type": "element",
+																						"name": "g",
+																						"attributes": {
+																							"id": "__lottie_element_12"
+																						},
+																						"children": [
+																							{
+																								"type": "element",
+																								"name": "path",
+																								"attributes": {
+																									"id": "Vector_3",
+																									"d": "M0 -0.00585938H89.375V9.99414H0V-0.00585938Z",
+																									"fill": "white"
+																								},
+																								"children": []
+																							}
+																						]
+																					}
+																				]
+																			},
+																			{
+																				"type": "element",
+																				"name": "g",
+																				"attributes": {
+																					"mask": "url(#mask2_5981_52010)"
+																				},
+																				"children": [
+																					{
+																						"type": "element",
+																						"name": "g",
+																						"attributes": {
+																							"id": "Group_3"
+																						},
+																						"children": [
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_4"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask3_5981_52010",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_89"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_4",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask3_5981_52010)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_4"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_5"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_6"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_5",
+																																			"d": "M18.1273 6.92438L13.7773 0.15625H11.4297V9.82501H13.4321V3.05688L17.7821 9.82501H20.1297V0.15625H18.1273V6.92438Z",
+																																			"fill": "white",
+																																			"fill-opacity": "0.8"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_5"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask4_5981_52010",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_80"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_6",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask4_5981_52010)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_7"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_8"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_9"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_7",
+																																			"d": "M21.7969 2.02094H25.0423V9.82501H27.1139V2.02094H30.3594V0.15625H21.7969V2.02094Z",
+																																			"fill": "white",
+																																			"fill-opacity": "0.8"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_6"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask5_5981_52010",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_71"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_8",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask5_5981_52010)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_10"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_11"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_12"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_9",
+																																			"d": "M38.6442 4.00994H34.0871V0.15625H32.0156V9.82501H34.0871V5.87463H38.6442V9.82501H40.7156V0.15625H38.6442V4.00994Z",
+																																			"fill": "white",
+																																			"fill-opacity": "0.8"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_7"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask6_5981_52010",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_62"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_10",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask6_5981_52010)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_13"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_14"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_15"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_11",
+																																			"d": "M45.3376 2.02094H47.893C48.9152 2.02094 49.4539 2.39387 49.4539 3.09831C49.4539 3.80275 48.9152 4.17569 47.893 4.17569H45.3376V2.02094ZM51.5259 3.09831C51.5259 1.27506 50.186 0.15625 47.9897 0.15625H43.2656V9.82501H45.3376V6.04037H47.6443L49.7164 9.82501H52.0094L49.715 5.75211C50.8666 5.30941 51.5259 4.37721 51.5259 3.09831Z",
+																																			"fill": "white",
+																																			"fill-opacity": "0.8"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_8"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask7_5981_52010",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_53"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_12",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask7_5981_52010)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_16"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_17"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_18"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_13",
+																																			"d": "M57.8732 8.05653C56.2438 8.05653 55.2496 6.89631 55.2496 5.00404C55.2496 3.08416 56.2438 1.92394 57.8732 1.92394C59.4887 1.92394 60.4691 3.08416 60.4691 5.00404C60.4691 6.89631 59.4887 8.05653 57.8732 8.05653ZM57.8732 -0.00976562C55.0839 -0.00976562 53.1094 2.06206 53.1094 5.00404C53.1094 7.91841 55.0839 9.99023 57.8732 9.99023C60.6486 9.99023 62.6094 7.91841 62.6094 5.00404C62.6094 2.06206 60.6486 -0.00976562 57.8732 -0.00976562Z",
+																																			"fill": "white",
+																																			"fill-opacity": "0.8"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_9"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask8_5981_52010",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_44"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_14",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask8_5981_52010)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_19"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_20"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_21"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_15",
+																																			"d": "M69.1794 4.45194H66.6233V2.02094H69.1794C70.2019 2.02094 70.7407 2.43532 70.7407 3.23644C70.7407 4.03756 70.2019 4.45194 69.1794 4.45194ZM69.2762 0.15625H64.5508V9.82501H66.6233V6.31662H69.2762C71.473 6.31662 72.8133 5.15637 72.8133 3.23644C72.8133 1.3165 71.473 0.15625 69.2762 0.15625Z",
+																																			"fill": "white",
+																																			"fill-opacity": "0.8"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_10"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask9_5981_52010",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_35"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_16",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask9_5981_52010)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_22"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_23"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_24"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_17",
+																																			"d": "M86.8413 6.57863C86.4823 7.51786 85.7642 8.05653 84.7837 8.05653C83.1542 8.05653 82.16 6.89631 82.16 5.00404C82.16 3.08416 83.1542 1.92394 84.7837 1.92394C85.7642 1.92394 86.4823 2.46261 86.8413 3.40183H89.0369C88.4984 1.33002 86.8827 -0.00976562 84.7837 -0.00976562C81.9942 -0.00976562 80.0195 2.06206 80.0195 5.00404C80.0195 7.91841 81.9942 9.99023 84.7837 9.99023C86.8965 9.99023 88.5122 8.63664 89.0508 6.57863H86.8413Z",
+																																			"fill": "white",
+																																			"fill-opacity": "0.8"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_11"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask10_5981_52010",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_26"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_18",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask10_5981_52010)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_25"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_26"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_27"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_19",
+																																			"d": "M73.6484 0.15625L77.5033 9.82501H79.6172L75.7624 0.15625H73.6484Z",
+																																			"fill": "white",
+																																			"fill-opacity": "0.8"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							},
+																							{
+																								"type": "element",
+																								"name": "g",
+																								"attributes": {
+																									"id": "Clip path group_12"
+																								},
+																								"children": [
+																									{
+																										"type": "element",
+																										"name": "mask",
+																										"attributes": {
+																											"id": "mask11_5981_52010",
+																											"style": "mask-type:luminance",
+																											"maskUnits": "userSpaceOnUse",
+																											"x": "0",
+																											"y": "-1",
+																											"width": "90",
+																											"height": "11"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "__lottie_element_17"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "path",
+																														"attributes": {
+																															"id": "Vector_20",
+																															"d": "M0 -0.0078125H89.375V9.99219H0V-0.0078125Z",
+																															"fill": "white"
+																														},
+																														"children": []
+																													}
+																												]
+																											}
+																										]
+																									},
+																									{
+																										"type": "element",
+																										"name": "g",
+																										"attributes": {
+																											"mask": "url(#mask11_5981_52010)"
+																										},
+																										"children": [
+																											{
+																												"type": "element",
+																												"name": "g",
+																												"attributes": {
+																													"id": "Group_28"
+																												},
+																												"children": [
+																													{
+																														"type": "element",
+																														"name": "g",
+																														"attributes": {
+																															"id": "Group_29"
+																														},
+																														"children": [
+																															{
+																																"type": "element",
+																																"name": "g",
+																																"attributes": {
+																																	"id": "Group_30"
+																																},
+																																"children": [
+																																	{
+																																		"type": "element",
+																																		"name": "path",
+																																		"attributes": {
+																																			"id": "Vector_21",
+																																			"d": "M3.64038 5.99893L4.95938 2.60106L6.27838 5.99893H3.64038ZM3.85422 0.15625L0 9.82501H2.15505L2.9433 7.79456H6.97558L7.76371 9.82501H9.91875L6.06453 0.15625H3.85422Z",
+																																			"fill": "white",
+																																			"fill-opacity": "0.8"
+																																		},
+																																		"children": []
+																																	}
+																																]
+																															}
+																														]
+																													}
+																												]
+																											}
+																										]
+																									}
+																								]
+																							}
+																						]
+																					}
+																				]
+																			}
+																		]
+																	}
+																]
+															}
+														]
+													}
+												]
+											}
+										]
+									}
+								]
+							}
+						]
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_5981_52010"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "89.375",
+									"height": "10",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "AnthropicLight"
+}
diff --git a/app/components/base/icons/src/public/llm/AnthropicLight.tsx b/app/components/base/icons/src/public/llm/AnthropicLight.tsx
new file mode 100644
index 0000000..0cacdf7
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/AnthropicLight.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AnthropicLight.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AnthropicLight'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/AnthropicText.json b/app/components/base/icons/src/public/llm/AnthropicText.json
new file mode 100644
index 0000000..7f89795
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/AnthropicText.json
@@ -0,0 +1,539 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "90",
+			"height": "20",
+			"viewBox": "0 0 90 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_8587_60274)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "mask",
+						"attributes": {
+							"id": "mask0_8587_60274",
+							"style": "mask-type:luminance",
+							"maskUnits": "userSpaceOnUse",
+							"x": "0",
+							"y": "4",
+							"width": "90",
+							"height": "11"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M89.375 4.99805H0V14.998H89.375V4.99805Z",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"mask": "url(#mask0_8587_60274)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "mask",
+								"attributes": {
+									"id": "mask1_8587_60274",
+									"style": "mask-type:luminance",
+									"maskUnits": "userSpaceOnUse",
+									"x": "0",
+									"y": "4",
+									"width": "90",
+									"height": "11"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M0 4.99609H89.375V14.9961H0V4.99609Z",
+											"fill": "white"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"mask": "url(#mask1_8587_60274)"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "mask",
+										"attributes": {
+											"id": "mask2_8587_60274",
+											"style": "mask-type:luminance",
+											"maskUnits": "userSpaceOnUse",
+											"x": "0",
+											"y": "4",
+											"width": "90",
+											"height": "11"
+										},
+										"children": [
+											{
+												"type": "element",
+												"name": "path",
+												"attributes": {
+													"d": "M0 4.99414H89.375V14.9941H0V4.99414Z",
+													"fill": "white"
+												},
+												"children": []
+											}
+										]
+									},
+									{
+										"type": "element",
+										"name": "g",
+										"attributes": {
+											"mask": "url(#mask2_8587_60274)"
+										},
+										"children": [
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask3_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "white"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask3_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M18.1273 11.9244L13.7773 5.15625H11.4297V14.825H13.4321V8.05688L17.7821 14.825H20.1297V5.15625H18.1273V11.9244Z",
+															"fill": "black",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask4_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "white"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask4_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M21.7969 7.02094H25.0423V14.825H27.1139V7.02094H30.3594V5.15625H21.7969V7.02094Z",
+															"fill": "black",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask5_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "white"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask5_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M38.6442 9.00994H34.0871V5.15625H32.0156V14.825H34.0871V10.8746H38.6442V14.825H40.7156V5.15625H38.6442V9.00994Z",
+															"fill": "black",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask6_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "white"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask6_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M45.3376 7.02094H47.893C48.9152 7.02094 49.4539 7.39387 49.4539 8.09831C49.4539 8.80275 48.9152 9.17569 47.893 9.17569H45.3376V7.02094ZM51.5259 8.09831C51.5259 6.27506 50.186 5.15625 47.9897 5.15625H43.2656V14.825H45.3376V11.0404H47.6443L49.7164 14.825H52.0094L49.715 10.7521C50.8666 10.3094 51.5259 9.37721 51.5259 8.09831Z",
+															"fill": "black",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask7_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "white"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask7_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M57.8732 13.0565C56.2438 13.0565 55.2496 11.8963 55.2496 10.004C55.2496 8.08416 56.2438 6.92394 57.8732 6.92394C59.4887 6.92394 60.4691 8.08416 60.4691 10.004C60.4691 11.8963 59.4887 13.0565 57.8732 13.0565ZM57.8732 4.99023C55.0839 4.99023 53.1094 7.06206 53.1094 10.004C53.1094 12.9184 55.0839 14.9902 57.8732 14.9902C60.6486 14.9902 62.6094 12.9184 62.6094 10.004C62.6094 7.06206 60.6486 4.99023 57.8732 4.99023Z",
+															"fill": "black",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask8_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "white"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask8_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M69.1794 9.45194H66.6233V7.02094H69.1794C70.2019 7.02094 70.7407 7.43532 70.7407 8.23644C70.7407 9.03756 70.2019 9.45194 69.1794 9.45194ZM69.2762 5.15625H64.5508V14.825H66.6233V11.3166H69.2762C71.473 11.3166 72.8133 10.1564 72.8133 8.23644C72.8133 6.3165 71.473 5.15625 69.2762 5.15625Z",
+															"fill": "black",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask9_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "white"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask9_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M86.8413 11.5786C86.4823 12.5179 85.7642 13.0565 84.7837 13.0565C83.1542 13.0565 82.16 11.8963 82.16 10.004C82.16 8.08416 83.1542 6.92394 84.7837 6.92394C85.7642 6.92394 86.4823 7.46261 86.8413 8.40183H89.0369C88.4984 6.33002 86.8827 4.99023 84.7837 4.99023C81.9942 4.99023 80.0195 7.06206 80.0195 10.004C80.0195 12.9184 81.9942 14.9902 84.7837 14.9902C86.8965 14.9902 88.5122 13.6366 89.0508 11.5786H86.8413Z",
+															"fill": "black",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask10_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "white"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask10_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M73.6484 5.15625L77.5033 14.825H79.6172L75.7624 5.15625H73.6484Z",
+															"fill": "black",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask11_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "white"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask11_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M3.64038 10.9989L4.95938 7.60106L6.27838 10.9989H3.64038ZM3.85422 5.15625L0 14.825H2.15505L2.9433 12.7946H6.97558L7.76371 14.825H9.91875L6.06453 5.15625H3.85422Z",
+															"fill": "black",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											}
+										]
+									}
+								]
+							}
+						]
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_8587_60274"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "89.375",
+									"height": "10",
+									"fill": "white",
+									"transform": "translate(0 5)"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "AnthropicText"
+}
diff --git a/app/components/base/icons/src/public/llm/AnthropicText.tsx b/app/components/base/icons/src/public/llm/AnthropicText.tsx
new file mode 100644
index 0000000..be9ebd3
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/AnthropicText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AnthropicText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AnthropicText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/AzureOpenaiService.json b/app/components/base/icons/src/public/llm/AzureOpenaiService.json
new file mode 100644
index 0000000..bf07b59
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/AzureOpenaiService.json
@@ -0,0 +1,74 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "56",
+			"height": "24",
+			"viewBox": "0 0 56 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"x": "2",
+					"y": "1.5",
+					"width": "10",
+					"height": "10",
+					"fill": "#EF4F21"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"x": "2",
+					"y": "12.5",
+					"width": "10",
+					"height": "10",
+					"fill": "#03A4EE"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"x": "13",
+					"y": "1.5",
+					"width": "10",
+					"height": "10",
+					"fill": "#7EB903"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"x": "13",
+					"y": "12.5",
+					"width": "10",
+					"height": "10",
+					"fill": "#FBB604"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M52.276 10.0045C52.7751 8.50639 52.6033 6.86529 51.8051 5.50264C50.6048 3.41259 48.1917 2.33732 45.835 2.84333C44.7866 1.66218 43.2803 0.990477 41.7011 1.0001C39.2922 0.994602 37.1548 2.54563 36.4137 4.83781C34.8661 5.15475 33.5304 6.12346 32.7487 7.49643C31.5394 9.58097 31.8151 12.2087 33.4307 13.9962C32.9316 15.4943 33.1034 17.1354 33.9016 18.498C35.1019 20.5881 37.515 21.6634 39.8717 21.1573C40.9195 22.3385 42.4264 23.0102 44.0056 22.9999C46.4159 23.0061 48.554 21.4537 49.2951 19.1594C50.8426 18.8425 52.1784 17.8738 52.9601 16.5008C54.168 14.4163 53.8916 11.7906 52.2767 10.0031L52.276 10.0045ZM44.007 21.5623C43.0424 21.5637 42.1081 21.2261 41.3677 20.608C41.4014 20.5901 41.4598 20.5578 41.4976 20.5345L45.8783 18.0044C46.1024 17.8772 46.2399 17.6386 46.2385 17.3808V11.2049L48.0899 12.274C48.1099 12.2836 48.1229 12.3028 48.1257 12.3248V17.4393C48.1229 19.7136 46.2812 21.5575 44.007 21.5623ZM35.1494 17.7789C34.6661 16.9443 34.4921 15.9659 34.6578 15.0165C34.6901 15.0357 34.7472 15.0708 34.7878 15.0942L39.1684 17.6242C39.3905 17.7541 39.6655 17.7541 39.8882 17.6242L45.2362 14.5359V16.6741C45.2376 16.6961 45.2272 16.7174 45.2101 16.7311L40.782 19.288C38.8096 20.4238 36.2906 19.7486 35.1501 17.7789H35.1494ZM33.9965 8.21626C34.4777 7.38024 35.2374 6.74085 36.1421 6.40878C36.1421 6.44659 36.1401 6.51328 36.1401 6.56003V11.6208C36.1387 11.878 36.2762 12.1165 36.4996 12.2437L41.8476 15.3313L39.9962 16.4004C39.9776 16.4128 39.9542 16.4149 39.9336 16.4059L35.5048 13.847C33.5365 12.7071 32.8614 10.1887 33.9958 8.21694L33.9965 8.21626ZM49.2078 11.7563L43.8598 8.66795L45.7112 7.59956C45.7298 7.58718 45.7532 7.58512 45.7738 7.59406L50.2026 10.1509C52.1743 11.2901 52.8501 13.8126 51.7109 15.7844C51.229 16.6191 50.47 17.2584 49.566 17.5912V12.3792C49.568 12.122 49.4312 11.8841 49.2085 11.7563H49.2078ZM51.0502 8.98284C51.0179 8.9629 50.9609 8.92852 50.9203 8.90515L46.5397 6.37509C46.3176 6.24515 46.0426 6.24515 45.8199 6.37509L40.4719 9.46341V7.32524C40.4705 7.30324 40.4808 7.28192 40.498 7.26817L44.9261 4.71337C46.8985 3.57553 49.4202 4.25273 50.5573 6.2259C51.0379 7.05917 51.2118 8.03475 51.0489 8.98284H51.0502ZM39.4654 12.7937L37.6133 11.7246C37.5934 11.715 37.5803 11.6958 37.5776 11.6738V6.55935C37.579 4.2823 39.4262 2.43701 41.7032 2.43838C42.6664 2.43838 43.5986 2.77664 44.339 3.39265C44.3053 3.41053 44.2476 3.44284 44.2091 3.46622L39.8284 5.99627C39.6043 6.12346 39.4668 6.36134 39.4682 6.61916L39.4654 12.7924V12.7937ZM40.4712 10.6253L42.8534 9.24959L45.2355 10.6246V13.3754L42.8534 14.7504L40.4712 13.3754V10.6253Z",
+					"fill": "black"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "AzureOpenaiService"
+}
diff --git a/app/components/base/icons/src/public/llm/AzureOpenaiService.tsx b/app/components/base/icons/src/public/llm/AzureOpenaiService.tsx
new file mode 100644
index 0000000..9a82df1
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/AzureOpenaiService.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AzureOpenaiService.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AzureOpenaiService'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/AzureOpenaiServiceText.json b/app/components/base/icons/src/public/llm/AzureOpenaiServiceText.json
new file mode 100644
index 0000000..f4342d7
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/AzureOpenaiServiceText.json
@@ -0,0 +1,236 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "212",
+			"height": "24",
+			"viewBox": "0 0 212 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"x": "2",
+					"y": "1.5",
+					"width": "10",
+					"height": "10",
+					"fill": "#EF4F21"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"x": "2",
+					"y": "12.5",
+					"width": "10",
+					"height": "10",
+					"fill": "#03A4EE"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"x": "13",
+					"y": "1.5",
+					"width": "10",
+					"height": "10",
+					"fill": "#7EB903"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"x": "13",
+					"y": "12.5",
+					"width": "10",
+					"height": "10",
+					"fill": "#FBB604"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M52.276 10.0045C52.7751 8.50639 52.6033 6.86529 51.8051 5.50264C50.6048 3.41259 48.1917 2.33732 45.835 2.84333C44.7866 1.66218 43.2803 0.990477 41.7011 1.0001C39.2922 0.994602 37.1548 2.54563 36.4137 4.83781C34.8661 5.15475 33.5304 6.12346 32.7487 7.49643C31.5394 9.58097 31.8151 12.2087 33.4307 13.9962C32.9316 15.4943 33.1034 17.1354 33.9016 18.498C35.1019 20.5881 37.515 21.6634 39.8717 21.1573C40.9195 22.3385 42.4264 23.0102 44.0056 22.9999C46.4159 23.0061 48.554 21.4537 49.2951 19.1594C50.8426 18.8425 52.1784 17.8738 52.9601 16.5008C54.168 14.4163 53.8916 11.7906 52.2767 10.0031L52.276 10.0045ZM44.007 21.5623C43.0424 21.5637 42.1081 21.2261 41.3677 20.608C41.4014 20.5901 41.4598 20.5578 41.4976 20.5345L45.8783 18.0044C46.1024 17.8772 46.2399 17.6386 46.2385 17.3808V11.2049L48.0899 12.274C48.1099 12.2836 48.1229 12.3028 48.1257 12.3248V17.4393C48.1229 19.7136 46.2812 21.5575 44.007 21.5623ZM35.1494 17.7789C34.6661 16.9443 34.4921 15.9659 34.6578 15.0165C34.6901 15.0357 34.7472 15.0708 34.7878 15.0942L39.1684 17.6242C39.3905 17.7541 39.6655 17.7541 39.8882 17.6242L45.2362 14.5359V16.6741C45.2376 16.6961 45.2272 16.7174 45.2101 16.7311L40.782 19.288C38.8096 20.4238 36.2906 19.7486 35.1501 17.7789H35.1494ZM33.9965 8.21626C34.4777 7.38024 35.2374 6.74085 36.1421 6.40878C36.1421 6.44659 36.1401 6.51328 36.1401 6.56003V11.6208C36.1387 11.878 36.2762 12.1165 36.4996 12.2437L41.8476 15.3313L39.9962 16.4004C39.9776 16.4128 39.9542 16.4149 39.9336 16.4059L35.5048 13.847C33.5365 12.7071 32.8614 10.1887 33.9958 8.21694L33.9965 8.21626ZM49.2078 11.7563L43.8598 8.66795L45.7112 7.59956C45.7298 7.58718 45.7532 7.58512 45.7738 7.59406L50.2026 10.1509C52.1743 11.2901 52.8501 13.8126 51.7109 15.7844C51.229 16.6191 50.47 17.2584 49.566 17.5912V12.3792C49.568 12.122 49.4312 11.8841 49.2085 11.7563H49.2078ZM51.0502 8.98284C51.0179 8.9629 50.9609 8.92852 50.9203 8.90515L46.5397 6.37509C46.3176 6.24515 46.0426 6.24515 45.8199 6.37509L40.4719 9.46341V7.32524C40.4705 7.30324 40.4808 7.28192 40.498 7.26817L44.9261 4.71337C46.8985 3.57553 49.4202 4.25273 50.5573 6.2259C51.0379 7.05917 51.2118 8.03475 51.0489 8.98284H51.0502ZM39.4654 12.7937L37.6133 11.7246C37.5934 11.715 37.5803 11.6958 37.5776 11.6738V6.55935C37.579 4.2823 39.4262 2.43701 41.7032 2.43838C42.6664 2.43838 43.5986 2.77664 44.339 3.39265C44.3053 3.41053 44.2476 3.44284 44.2091 3.46622L39.8284 5.99627C39.6043 6.12346 39.4668 6.36134 39.4682 6.61916L39.4654 12.7924V12.7937ZM40.4712 10.6253L42.8534 9.24959L45.2355 10.6246V13.3754L42.8534 14.7504L40.4712 13.3754V10.6253Z",
+					"fill": "black"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M64.0195 17.0001H62.0508L65.6353 6.81824H67.9123L71.5018 17.0001H69.533L66.8136 8.90631H66.734L64.0195 17.0001ZM64.0842 13.0079H69.4535V14.4894H64.0842V13.0079Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M72.6639 17.0001V15.8566L76.6014 10.9198V10.8552H72.7931V9.36369H78.8038V10.5917L75.0552 15.4439V15.5086H78.9331V17.0001H72.6639Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M85.4918 13.7884V9.36369H87.2915V17.0001H85.5465V15.6428H85.467C85.2946 16.0704 85.0112 16.42 84.6168 16.6918C84.2257 16.9636 83.7435 17.0995 83.1701 17.0995C82.6696 17.0995 82.2272 16.9885 81.8427 16.7664C81.4615 16.541 81.1632 16.2145 80.9478 15.787C80.7324 15.3561 80.6246 14.8358 80.6246 14.2259V9.36369H82.4244V13.9475C82.4244 14.4314 82.5569 14.8159 82.8221 15.1009C83.0872 15.3859 83.4352 15.5285 83.8661 15.5285C84.1313 15.5285 84.3881 15.4638 84.6367 15.3346C84.8853 15.2053 85.0891 15.0131 85.2482 14.7579C85.4106 14.4993 85.4918 14.1762 85.4918 13.7884Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M89.1422 17.0001V9.36369H90.8873V10.6364H90.9668C91.106 10.1956 91.3446 9.85588 91.6827 9.61724C92.0241 9.37529 92.4135 9.25432 92.851 9.25432C92.9505 9.25432 93.0615 9.25929 93.1841 9.26923C93.3101 9.27586 93.4145 9.28746 93.4973 9.30403V10.9596C93.4211 10.9331 93.3001 10.9099 93.1344 10.89C92.972 10.8668 92.8146 10.8552 92.6621 10.8552C92.334 10.8552 92.039 10.9264 91.7772 11.0689C91.5186 11.2082 91.3148 11.402 91.1657 11.6506C91.0165 11.8992 90.9419 12.1859 90.9419 12.5107V17.0001H89.1422Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M97.7592 17.1492C96.9936 17.1492 96.3324 16.9901 95.7756 16.6719C95.2221 16.3504 94.7962 15.8964 94.4979 15.3097C94.1996 14.7198 94.0504 14.0254 94.0504 13.2266C94.0504 12.4411 94.1996 11.7517 94.4979 11.1584C94.7995 10.5618 95.2204 10.0978 95.7607 9.76639C96.3009 9.43164 96.9356 9.26426 97.6648 9.26426C98.1354 9.26426 98.5795 9.34049 98.9972 9.49295C99.4181 9.6421 99.7893 9.87411 100.111 10.189C100.436 10.5038 100.691 10.9049 100.876 11.3921C101.062 11.876 101.155 12.4527 101.155 13.1222V13.6741H94.8956V12.461H99.4297C99.4264 12.1163 99.3518 11.8097 99.206 11.5412C99.0601 11.2695 98.8563 11.0557 98.5945 10.8999C98.3359 10.7441 98.0343 10.6662 97.6896 10.6662C97.3217 10.6662 96.9986 10.7557 96.7202 10.9347C96.4418 11.1104 96.2247 11.3424 96.0689 11.6307C95.9164 11.9158 95.8385 12.229 95.8352 12.5704V13.6293C95.8352 14.0734 95.9164 14.4546 96.0788 14.7728C96.2412 15.0877 96.4683 15.3296 96.7599 15.4986C97.0516 15.6644 97.393 15.7472 97.7841 15.7472C98.0459 15.7472 98.2829 15.7108 98.495 15.6378C98.7071 15.5616 98.8911 15.4506 99.0469 15.3047C99.2027 15.1589 99.3203 14.9783 99.3999 14.7628L101.08 14.9518C100.974 15.3959 100.772 15.7837 100.474 16.1151C100.179 16.4432 99.8009 16.6984 99.3402 16.8807C98.8795 17.0597 98.3525 17.1492 97.7592 17.1492Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M115.328 11.9091C115.328 13.0062 115.122 13.9458 114.711 14.728C114.303 15.5069 113.747 16.1035 113.041 16.5178C112.338 16.9321 111.541 17.1393 110.649 17.1393C109.758 17.1393 108.959 16.9321 108.253 16.5178C107.55 16.1002 106.994 15.5019 106.583 14.7231C106.175 13.9409 105.971 13.0029 105.971 11.9091C105.971 10.8121 106.175 9.87411 106.583 9.09523C106.994 8.31303 107.55 7.71478 108.253 7.30048C108.959 6.88618 109.758 6.67903 110.649 6.67903C111.541 6.67903 112.338 6.88618 113.041 7.30048C113.747 7.71478 114.303 8.31303 114.711 9.09523C115.122 9.87411 115.328 10.8121 115.328 11.9091ZM113.473 11.9091C113.473 11.1369 113.352 10.4856 113.11 9.95531C112.872 9.42169 112.54 9.019 112.116 8.74721C111.692 8.47212 111.203 8.33457 110.649 8.33457C110.096 8.33457 109.607 8.47212 109.183 8.74721C108.758 9.019 108.425 9.42169 108.183 9.95531C107.945 10.4856 107.825 11.1369 107.825 11.9091C107.825 12.6814 107.945 13.3343 108.183 13.868C108.425 14.3983 108.758 14.801 109.183 15.076C109.607 15.3478 110.096 15.4837 110.649 15.4837C111.203 15.4837 111.692 15.3478 112.116 15.076C112.54 14.801 112.872 14.3983 113.11 13.868C113.352 13.3343 113.473 12.6814 113.473 11.9091Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M116.992 19.8637V9.36369H118.762V10.6265H118.866C118.959 10.4409 119.09 10.2437 119.259 10.0349C119.428 9.82274 119.657 9.6421 119.945 9.49295C120.233 9.34049 120.601 9.26426 121.049 9.26426C121.639 9.26426 122.171 9.41507 122.645 9.71667C123.122 10.015 123.5 10.4574 123.778 11.0441C124.06 11.6274 124.201 12.3433 124.201 13.1918C124.201 14.0304 124.063 14.743 123.788 15.3296C123.513 15.9162 123.138 16.3637 122.664 16.6719C122.19 16.9802 121.654 17.1343 121.054 17.1343C120.616 17.1343 120.253 17.0614 119.965 16.9155C119.676 16.7697 119.444 16.594 119.269 16.3885C119.096 16.1797 118.962 15.9825 118.866 15.7969H118.792V19.8637H116.992ZM118.757 13.1819C118.757 13.6757 118.826 14.1082 118.966 14.4795C119.108 14.8507 119.312 15.1407 119.577 15.3495C119.846 15.555 120.17 15.6577 120.551 15.6577C120.949 15.6577 121.282 15.5517 121.551 15.3395C121.819 15.1241 122.021 14.8308 122.157 14.4596C122.297 14.085 122.366 13.6591 122.366 13.1819C122.366 12.7079 122.298 12.287 122.162 11.9191C122.026 11.5512 121.824 11.2628 121.556 11.054C121.287 10.8452 120.953 10.7408 120.551 10.7408C120.167 10.7408 119.841 10.8419 119.572 11.0441C119.304 11.2463 119.1 11.5296 118.961 11.8942C118.825 12.2588 118.757 12.688 118.757 13.1819Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M129.123 17.1492C128.357 17.1492 127.696 16.9901 127.139 16.6719C126.585 16.3504 126.159 15.8964 125.861 15.3097C125.563 14.7198 125.414 14.0254 125.414 13.2266C125.414 12.4411 125.563 11.7517 125.861 11.1584C126.163 10.5618 126.584 10.0978 127.124 9.76639C127.664 9.43164 128.299 9.26426 129.028 9.26426C129.499 9.26426 129.943 9.34049 130.36 9.49295C130.781 9.6421 131.153 9.87411 131.474 10.189C131.799 10.5038 132.054 10.9049 132.24 11.3921C132.425 11.876 132.518 12.4527 132.518 13.1222V13.6741H126.259V12.461H130.793C130.79 12.1163 130.715 11.8097 130.569 11.5412C130.423 11.2695 130.22 11.0557 129.958 10.8999C129.699 10.7441 129.398 10.6662 129.053 10.6662C128.685 10.6662 128.362 10.7557 128.083 10.9347C127.805 11.1104 127.588 11.3424 127.432 11.6307C127.28 11.9158 127.202 12.229 127.199 12.5704V13.6293C127.199 14.0734 127.28 14.4546 127.442 14.7728C127.605 15.0877 127.832 15.3296 128.123 15.4986C128.415 15.6644 128.756 15.7472 129.147 15.7472C129.409 15.7472 129.646 15.7108 129.858 15.6378C130.07 15.5616 130.254 15.4506 130.41 15.3047C130.566 15.1589 130.684 14.9783 130.763 14.7628L132.444 14.9518C132.337 15.3959 132.135 15.7837 131.837 16.1151C131.542 16.4432 131.164 16.6984 130.703 16.8807C130.243 17.0597 129.716 17.1492 129.123 17.1492Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M135.84 12.5256V17.0001H134.041V9.36369H135.761V10.6613H135.85C136.026 10.2337 136.306 9.894 136.691 9.6421C137.078 9.39021 137.557 9.26426 138.127 9.26426C138.654 9.26426 139.113 9.37695 139.504 9.60233C139.899 9.82771 140.204 10.1542 140.419 10.5817C140.638 11.0093 140.746 11.528 140.742 12.1378V17.0001H138.943V12.4162C138.943 11.9058 138.81 11.5064 138.545 11.2181C138.283 10.9297 137.92 10.7856 137.456 10.7856C137.141 10.7856 136.861 10.8552 136.616 10.9944C136.374 11.1303 136.183 11.3275 136.044 11.586C135.908 11.8445 135.84 12.1577 135.84 12.5256Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M143.959 17.0001H141.99L145.575 6.81824H147.852L151.441 17.0001H149.472L146.753 8.90631H146.673L143.959 17.0001ZM144.024 13.0079H149.393V14.4894H144.024V13.0079Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M154.627 6.81824V17.0001H152.782V6.81824H154.627Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M165.63 9.61724C165.584 9.18306 165.388 8.84499 165.044 8.60304C164.702 8.36109 164.258 8.24011 163.711 8.24011C163.327 8.24011 162.997 8.29811 162.722 8.41412C162.447 8.53012 162.236 8.68756 162.09 8.88642C161.945 9.08528 161.87 9.31232 161.867 9.56753C161.867 9.77965 161.915 9.9636 162.011 10.1194C162.11 10.2752 162.244 10.4077 162.414 10.5171C162.583 10.6232 162.77 10.7127 162.975 10.7856C163.181 10.8585 163.388 10.9198 163.597 10.9695L164.551 11.2082C164.936 11.2976 165.305 11.4186 165.66 11.5711C166.018 11.7235 166.338 11.9158 166.619 12.1478C166.905 12.3798 167.13 12.6599 167.296 12.988C167.461 13.3161 167.544 13.7006 167.544 14.1414C167.544 14.738 167.392 15.2633 167.087 15.7174C166.782 16.1681 166.341 16.5211 165.764 16.7763C165.191 17.0282 164.497 17.1542 163.681 17.1542C162.889 17.1542 162.201 17.0315 161.618 16.7863C161.038 16.541 160.584 16.1831 160.256 15.7124C159.931 15.2418 159.755 14.6684 159.729 13.9922H161.544C161.57 14.3469 161.679 14.6419 161.872 14.8772C162.064 15.1125 162.314 15.2882 162.622 15.4042C162.934 15.5202 163.282 15.5782 163.666 15.5782C164.067 15.5782 164.419 15.5185 164.72 15.3992C165.025 15.2766 165.264 15.1075 165.436 14.8921C165.609 14.6734 165.696 14.4181 165.7 14.1265C165.696 13.8613 165.619 13.6426 165.466 13.4702C165.314 13.2946 165.1 13.1487 164.825 13.0327C164.553 12.9134 164.235 12.8073 163.87 12.7145L162.712 12.4162C161.873 12.2008 161.21 11.8743 160.723 11.4368C160.239 10.996 159.997 10.411 159.997 9.68187C159.997 9.08197 160.16 8.55664 160.485 8.10588C160.813 7.65512 161.258 7.30545 161.822 7.05687C162.385 6.80498 163.023 6.67903 163.736 6.67903C164.459 6.67903 165.092 6.80498 165.635 7.05687C166.182 7.30545 166.611 7.65181 166.923 8.09594C167.234 8.53675 167.395 9.04385 167.405 9.61724H165.63Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M172.49 17.1492C171.724 17.1492 171.063 16.9901 170.506 16.6719C169.953 16.3504 169.527 15.8964 169.228 15.3097C168.93 14.7198 168.781 14.0254 168.781 13.2266C168.781 12.4411 168.93 11.7517 169.228 11.1584C169.53 10.5618 169.951 10.0978 170.491 9.76639C171.031 9.43164 171.666 9.26426 172.395 9.26426C172.866 9.26426 173.31 9.34049 173.728 9.49295C174.149 9.6421 174.52 9.87411 174.841 10.189C175.166 10.5038 175.421 10.9049 175.607 11.3921C175.792 11.876 175.885 12.4527 175.885 13.1222V13.6741H169.626V12.461H174.16C174.157 12.1163 174.082 11.8097 173.936 11.5412C173.791 11.2695 173.587 11.0557 173.325 10.8999C173.066 10.7441 172.765 10.6662 172.42 10.6662C172.052 10.6662 171.729 10.7557 171.451 10.9347C171.172 11.1104 170.955 11.3424 170.799 11.6307C170.647 11.9158 170.569 12.229 170.566 12.5704V13.6293C170.566 14.0734 170.647 14.4546 170.809 14.7728C170.972 15.0877 171.199 15.3296 171.49 15.4986C171.782 15.6644 172.123 15.7472 172.515 15.7472C172.776 15.7472 173.013 15.7108 173.225 15.6378C173.438 15.5616 173.622 15.4506 173.777 15.3047C173.933 15.1589 174.051 14.9783 174.13 14.7628L175.811 14.9518C175.705 15.3959 175.502 15.7837 175.204 16.1151C174.909 16.4432 174.531 16.6984 174.071 16.8807C173.61 17.0597 173.083 17.1492 172.49 17.1492Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M177.408 17.0001V9.36369H179.153V10.6364H179.232C179.372 10.1956 179.61 9.85588 179.948 9.61724C180.29 9.37529 180.679 9.25432 181.117 9.25432C181.216 9.25432 181.327 9.25929 181.45 9.26923C181.576 9.27586 181.68 9.28746 181.763 9.30403V10.9596C181.687 10.9331 181.566 10.9099 181.4 10.89C181.238 10.8668 181.08 10.8552 180.928 10.8552C180.6 10.8552 180.305 10.9264 180.043 11.0689C179.784 11.2082 179.58 11.402 179.431 11.6506C179.282 11.8992 179.208 12.1859 179.208 12.5107V17.0001H177.408Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M190.012 9.36369L187.293 17.0001H185.304L182.585 9.36369H184.504L186.259 15.0363H186.338L188.098 9.36369H190.012Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M191.257 17.0001V9.36369H193.057V17.0001H191.257ZM192.162 8.27989C191.877 8.27989 191.632 8.18542 191.426 7.9965C191.221 7.80427 191.118 7.57392 191.118 7.30545C191.118 7.03367 191.221 6.80332 191.426 6.6144C191.632 6.42217 191.877 6.32605 192.162 6.32605C192.451 6.32605 192.696 6.42217 192.898 6.6144C193.104 6.80332 193.206 7.03367 193.206 7.30545C193.206 7.57392 193.104 7.80427 192.898 7.9965C192.696 8.18542 192.451 8.27989 192.162 8.27989Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M198.239 17.1492C197.477 17.1492 196.822 16.9818 196.275 16.6471C195.731 16.3123 195.312 15.85 195.017 15.26C194.726 14.6667 194.58 13.984 194.58 13.2117C194.58 12.4361 194.729 11.7517 195.027 11.1584C195.325 10.5618 195.746 10.0978 196.29 9.76639C196.837 9.43164 197.483 9.26426 198.229 9.26426C198.849 9.26426 199.397 9.37861 199.874 9.6073C200.355 9.83268 200.738 10.1525 201.023 10.5668C201.308 10.9778 201.47 11.4584 201.51 12.0086H199.79C199.72 11.6407 199.555 11.3341 199.293 11.0888C199.034 10.8403 198.688 10.716 198.254 10.716C197.886 10.716 197.563 10.8154 197.284 11.0143C197.006 11.2098 196.789 11.4915 196.633 11.8594C196.481 12.2273 196.404 12.6681 196.404 13.1819C196.404 13.7022 196.481 14.1497 196.633 14.5242C196.785 14.8954 196.999 15.1821 197.274 15.3843C197.553 15.5832 197.879 15.6826 198.254 15.6826C198.519 15.6826 198.756 15.6329 198.965 15.5334C199.177 15.4307 199.354 15.2832 199.497 15.091C199.639 14.8987 199.737 14.6651 199.79 14.39H201.51C201.467 14.9302 201.308 15.4091 201.033 15.8268C200.758 16.2411 200.383 16.5659 199.909 16.8012C199.435 17.0332 198.878 17.1492 198.239 17.1492Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M206.369 17.1492C205.603 17.1492 204.942 16.9901 204.385 16.6719C203.831 16.3504 203.406 15.8964 203.107 15.3097C202.809 14.7198 202.66 14.0254 202.66 13.2266C202.66 12.4411 202.809 11.7517 203.107 11.1584C203.409 10.5618 203.83 10.0978 204.37 9.76639C204.91 9.43164 205.545 9.26426 206.274 9.26426C206.745 9.26426 207.189 9.34049 207.607 9.49295C208.027 9.6421 208.399 9.87411 208.72 10.189C209.045 10.5038 209.3 10.9049 209.486 11.3921C209.671 11.876 209.764 12.4527 209.764 13.1222V13.6741H203.505V12.461H208.039C208.036 12.1163 207.961 11.8097 207.815 11.5412C207.67 11.2695 207.466 11.0557 207.204 10.8999C206.945 10.7441 206.644 10.6662 206.299 10.6662C205.931 10.6662 205.608 10.7557 205.33 10.9347C205.051 11.1104 204.834 11.3424 204.678 11.6307C204.526 11.9158 204.448 12.229 204.445 12.5704V13.6293C204.445 14.0734 204.526 14.4546 204.688 14.7728C204.851 15.0877 205.078 15.3296 205.369 15.4986C205.661 15.6644 206.002 15.7472 206.393 15.7472C206.655 15.7472 206.892 15.7108 207.104 15.6378C207.317 15.5616 207.5 15.4506 207.656 15.3047C207.812 15.1589 207.93 14.9783 208.009 14.7628L209.69 14.9518C209.584 15.3959 209.381 15.7837 209.083 16.1151C208.788 16.4432 208.41 16.6984 207.95 16.8807C207.489 17.0597 206.962 17.1492 206.369 17.1492Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "AzureOpenaiServiceText"
+}
diff --git a/app/components/base/icons/src/public/llm/AzureOpenaiServiceText.tsx b/app/components/base/icons/src/public/llm/AzureOpenaiServiceText.tsx
new file mode 100644
index 0000000..f91189a
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/AzureOpenaiServiceText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AzureOpenaiServiceText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AzureOpenaiServiceText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/Azureai.json b/app/components/base/icons/src/public/llm/Azureai.json
new file mode 100644
index 0000000..004da32
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Azureai.json
@@ -0,0 +1,180 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M8.41642 1.13526H14.9266L8.16839 21.1596C8.09893 21.3654 7.96669 21.5442 7.79029 21.6708C7.61389 21.7975 7.4022 21.8657 7.18504 21.8657H2.11851C1.95397 21.8657 1.79179 21.8266 1.64539 21.7515C1.49898 21.6764 1.37257 21.5675 1.27659 21.4338C1.18062 21.3002 1.11784 21.1456 1.09347 20.9829C1.06909 20.8201 1.08381 20.6539 1.13641 20.498L7.43281 1.84135C7.50224 1.6355 7.6345 1.45662 7.81096 1.3299C7.98742 1.20319 8.19918 1.13527 8.41642 1.13526Z",
+					"fill": "url(#paint0_linear_8587_60253)"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M17.8761 14.5664H7.55255C7.45657 14.5663 7.36278 14.5951 7.28341 14.6491C7.20403 14.703 7.14275 14.7796 7.10754 14.8689C7.07232 14.9582 7.06482 15.056 7.08599 15.1496C7.10717 15.2433 7.15605 15.3283 7.22626 15.3938L13.86 21.5856C14.0531 21.7657 14.3074 21.8659 14.5715 21.8659H20.4171L17.8761 14.5664Z",
+					"fill": "#0078D4"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M8.41509 1.13502C8.19548 1.13417 7.98136 1.20358 7.80399 1.33308C7.62663 1.46259 7.49532 1.64542 7.42924 1.85486L1.14283 20.4808C1.0867 20.6373 1.06907 20.805 1.09145 20.9697C1.11383 21.1344 1.17556 21.2913 1.2714 21.4272C1.36725 21.563 1.4944 21.6737 1.6421 21.75C1.7898 21.8263 1.9537 21.8659 2.11994 21.8655H7.31723C7.5108 21.8309 7.69172 21.7455 7.84151 21.6181C7.9913 21.4907 8.10459 21.3259 8.16982 21.1404L9.42345 17.4456L13.9014 21.6224C14.0891 21.7776 14.3245 21.8635 14.568 21.8655H20.3918L17.8376 14.566L10.3916 14.5678L14.9488 1.13502H8.41509Z",
+					"fill": "url(#paint1_linear_8587_60253)"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M16.7308 1.8401C16.6614 1.63458 16.5294 1.456 16.3532 1.3295C16.177 1.20301 15.9656 1.13498 15.7487 1.13501H8.49316C8.71005 1.13502 8.92147 1.20306 9.09765 1.32955C9.27383 1.45604 9.4059 1.6346 9.47527 1.8401L15.7719 20.4975C15.8246 20.6535 15.8393 20.8197 15.815 20.9825C15.7906 21.1452 15.7278 21.2999 15.6319 21.4336C15.5359 21.5673 15.4095 21.6762 15.263 21.7514C15.1166 21.8265 14.9544 21.8657 14.7898 21.8657H22.0456C22.2101 21.8657 22.3723 21.8264 22.5187 21.7513C22.6651 21.6761 22.7915 21.5672 22.8875 21.4335C22.9834 21.2998 23.0461 21.1452 23.0705 20.9824C23.0948 20.8197 23.0801 20.6534 23.0274 20.4975L16.7308 1.8401Z",
+					"fill": "url(#paint2_linear_8587_60253)"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint0_linear_8587_60253",
+							"x1": "10.7892",
+							"y1": "2.67146",
+							"x2": "4.0279",
+							"y2": "22.6454",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#114A8B"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#0669BC"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint1_linear_8587_60253",
+							"x1": "12.8998",
+							"y1": "11.9797",
+							"x2": "11.3359",
+							"y2": "12.5085",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-opacity": "0.3"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.071",
+									"stop-opacity": "0.2"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.321",
+									"stop-opacity": "0.1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.623",
+									"stop-opacity": "0.05"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-opacity": "0"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint2_linear_8587_60253",
+							"x1": "12.0403",
+							"y1": "2.08863",
+							"x2": "19.4621",
+							"y2": "21.8613",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#3CCBF4"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#2892DF"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Azureai"
+}
diff --git a/app/components/base/icons/src/public/llm/Azureai.tsx b/app/components/base/icons/src/public/llm/Azureai.tsx
new file mode 100644
index 0000000..bf7f2da
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Azureai.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Azureai.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Azureai'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/AzureaiText.json b/app/components/base/icons/src/public/llm/AzureaiText.json
new file mode 100644
index 0000000..44976aa
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/AzureaiText.json
@@ -0,0 +1,243 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "92",
+			"height": "24",
+			"viewBox": "0 0 92 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M9.63655 2.50023H15.6036L9.40921 20.8535C9.34555 21.0421 9.22434 21.206 9.06266 21.3221C8.90097 21.4382 8.70695 21.5006 8.5079 21.5007H3.86407C3.71326 21.5007 3.56461 21.4648 3.43042 21.396C3.29623 21.3271 3.18036 21.2273 3.09239 21.1048C3.00442 20.9823 2.94689 20.8406 2.92454 20.6915C2.9022 20.5424 2.91569 20.39 2.9639 20.2471L8.73501 3.1474C8.79864 2.95872 8.91987 2.79477 9.0816 2.67863C9.24334 2.56249 9.43743 2.50024 9.63655 2.50023Z",
+					"fill": "url(#paint0_linear_8587_60561)"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M18.307 14.8105H8.84467C8.7567 14.8104 8.67074 14.8368 8.59799 14.8863C8.52524 14.9358 8.46906 15.006 8.43679 15.0878C8.40451 15.1697 8.39763 15.2593 8.41704 15.3451C8.43645 15.4309 8.48125 15.5089 8.54561 15.5689L14.6259 21.2439C14.8029 21.4091 15.036 21.5009 15.2781 21.5008H20.636L18.307 14.8105Z",
+					"fill": "#0078D4"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M9.63533 2.50001C9.43405 2.49923 9.23778 2.56284 9.07521 2.68154C8.91265 2.80024 8.79229 2.96781 8.73173 3.15978L2.96979 20.2313C2.91834 20.3747 2.90219 20.5284 2.9227 20.6794C2.94321 20.8304 2.99979 20.9742 3.08764 21.0987C3.17549 21.2232 3.29203 21.3247 3.42741 21.3946C3.56278 21.4646 3.71301 21.5009 3.86538 21.5004H8.62906C8.80648 21.4687 8.97231 21.3905 9.1096 21.2738C9.2469 21.157 9.35074 21.0059 9.41052 20.8359L10.5596 17.4495L14.6639 21.2777C14.8359 21.42 15.0517 21.4986 15.2749 21.5004H20.6129L18.2717 14.8102L11.4469 14.8118L15.6239 2.50001H9.63533Z",
+					"fill": "url(#paint1_linear_8587_60561)"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M17.2574 3.14625C17.1938 2.95788 17.0728 2.7942 16.9113 2.67826C16.7498 2.56233 16.556 2.49998 16.3572 2.5H9.70703C9.90582 2.50001 10.0996 2.56237 10.2611 2.67831C10.4226 2.79424 10.5436 2.9579 10.6072 3.14625L16.3785 20.2467C16.4268 20.3896 16.4403 20.542 16.418 20.6911C16.3957 20.8403 16.3381 20.9821 16.2502 21.1046C16.1622 21.2271 16.0463 21.327 15.9121 21.3959C15.7779 21.4647 15.6292 21.5007 15.4784 21.5007H22.1288C22.2796 21.5006 22.4283 21.4647 22.5624 21.3958C22.6966 21.3269 22.8125 21.2271 22.9004 21.1045C22.9884 20.982 23.0459 20.8403 23.0682 20.6911C23.0905 20.5419 23.077 20.3896 23.0287 20.2467L17.2574 3.14625Z",
+					"fill": "url(#paint2_linear_8587_60561)"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M34.312 17.0001H32.3433L35.9278 6.81824H38.2048L41.7943 17.0001H39.8255L37.106 8.90631H37.0265L34.312 17.0001ZM34.3766 13.0079H39.746V14.4894H34.3766V13.0079Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M42.9564 17.0001V15.8566L46.8939 10.9198V10.8552H43.0856V9.36369H49.0963V10.5917L45.3477 15.4439V15.5086H49.2255V17.0001H42.9564Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M55.7843 13.7884V9.36369H57.584V17.0001H55.839V15.6428H55.7595C55.5871 16.0704 55.3037 16.42 54.9093 16.6918C54.5182 16.9636 54.036 17.0995 53.4626 17.0995C52.9621 17.0995 52.5196 16.9885 52.1352 16.7664C51.754 16.541 51.4557 16.2145 51.2403 15.787C51.0248 15.3561 50.9171 14.8358 50.9171 14.2259V9.36369H52.7168V13.9475C52.7168 14.4314 52.8494 14.8159 53.1146 15.1009C53.3797 15.3859 53.7277 15.5285 54.1586 15.5285C54.4238 15.5285 54.6806 15.4638 54.9292 15.3346C55.1778 15.2053 55.3816 15.0131 55.5407 14.7579C55.7031 14.4993 55.7843 14.1762 55.7843 13.7884Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M59.4347 17.0001V9.36369H61.1797V10.6364H61.2593C61.3985 10.1956 61.6371 9.85588 61.9752 9.61724C62.3166 9.37529 62.706 9.25432 63.1435 9.25432C63.2429 9.25432 63.354 9.25929 63.4766 9.26923C63.6026 9.27586 63.707 9.28746 63.7898 9.30403V10.9596C63.7136 10.9331 63.5926 10.9099 63.4269 10.89C63.2645 10.8668 63.1071 10.8552 62.9546 10.8552C62.6265 10.8552 62.3315 10.9264 62.0696 11.0689C61.8111 11.2082 61.6073 11.402 61.4581 11.6506C61.309 11.8992 61.2344 12.1859 61.2344 12.5107V17.0001H59.4347Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M68.0517 17.1492C67.2861 17.1492 66.6249 16.9901 66.068 16.6719C65.5145 16.3504 65.0886 15.8964 64.7903 15.3097C64.4921 14.7198 64.3429 14.0254 64.3429 13.2266C64.3429 12.4411 64.4921 11.7517 64.7903 11.1584C65.092 10.5618 65.5129 10.0978 66.0531 9.76639C66.5934 9.43164 67.2281 9.26426 67.9573 9.26426C68.4279 9.26426 68.872 9.34049 69.2896 9.49295C69.7106 9.6421 70.0818 9.87411 70.4033 10.189C70.7281 10.5038 70.9833 10.9049 71.1689 11.3921C71.3545 11.876 71.4473 12.4527 71.4473 13.1222V13.6741H65.1881V12.461H69.7222C69.7189 12.1163 69.6443 11.8097 69.4984 11.5412C69.3526 11.2695 69.1488 11.0557 68.8869 10.8999C68.6284 10.7441 68.3268 10.6662 67.9821 10.6662C67.6142 10.6662 67.2911 10.7557 67.0126 10.9347C66.7342 11.1104 66.5171 11.3424 66.3614 11.6307C66.2089 11.9158 66.131 12.229 66.1277 12.5704V13.6293C66.1277 14.0734 66.2089 14.4546 66.3713 14.7728C66.5337 15.0877 66.7608 15.3296 67.0524 15.4986C67.3441 15.6644 67.6855 15.7472 68.0766 15.7472C68.3384 15.7472 68.5754 15.7108 68.7875 15.6378C68.9996 15.5616 69.1836 15.4506 69.3394 15.3047C69.4951 15.1589 69.6128 14.9783 69.6923 14.7628L71.3727 14.9518C71.2667 15.3959 71.0645 15.7837 70.7662 16.1151C70.4712 16.4432 70.0934 16.6984 69.6327 16.8807C69.172 17.0597 68.645 17.1492 68.0517 17.1492Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M77.8296 17.0001H75.8608L79.4454 6.81824H81.7223L85.3118 17.0001H83.3431L80.6236 8.90631H80.5441L77.8296 17.0001ZM77.8942 13.0079H83.2635V14.4894H77.8942V13.0079Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M88.4974 6.81824V17.0001H86.6529V6.81824H88.4974Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint0_linear_8587_60561",
+							"x1": "11.8113",
+							"y1": "3.90823",
+							"x2": "5.61444",
+							"y2": "22.2154",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#114A8B"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#0669BC"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint1_linear_8587_60561",
+							"x1": "13.7459",
+							"y1": "12.4397",
+							"x2": "12.3125",
+							"y2": "12.9243",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-opacity": "0.3"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.071",
+									"stop-opacity": "0.2"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.321",
+									"stop-opacity": "0.1"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.623",
+									"stop-opacity": "0.05"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-opacity": "0"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint2_linear_8587_60561",
+							"x1": "12.9582",
+							"y1": "3.37404",
+							"x2": "19.7606",
+							"y2": "21.4968",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#3CCBF4"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#2892DF"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "AzureaiText"
+}
diff --git a/app/components/base/icons/src/public/llm/AzureaiText.tsx b/app/components/base/icons/src/public/llm/AzureaiText.tsx
new file mode 100644
index 0000000..cd23769
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/AzureaiText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AzureaiText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AzureaiText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/Baichuan.json b/app/components/base/icons/src/public/llm/Baichuan.json
new file mode 100644
index 0000000..196fbad
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Baichuan.json
@@ -0,0 +1,76 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Baichuan"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Union",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M8.58154 1.7793H5.52779L3.34655 6.20409V17.7335L0.916016 22.2206H6.21333L8.58154 17.7335V1.7793ZM10.5761 1.7793H15.8111V22.2206H10.5761V1.7793ZM22.9166 1.7793H17.6816V6.01712H22.9166V1.7793ZM22.9166 7.38818H17.6816V22.2206H22.9166V7.38818Z",
+							"fill": "url(#paint0_radial_11622_96084)"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "radialGradient",
+						"attributes": {
+							"id": "paint0_radial_11622_96084",
+							"cx": "0",
+							"cy": "0",
+							"r": "1",
+							"gradientUnits": "userSpaceOnUse",
+							"gradientTransform": "translate(5.5 5.5) rotate(45) scale(20.5061 22.0704)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#FEBD3F"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.77608",
+									"stop-color": "#FF6933"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Baichuan"
+}
diff --git a/app/components/base/icons/src/public/llm/Baichuan.tsx b/app/components/base/icons/src/public/llm/Baichuan.tsx
new file mode 100644
index 0000000..363820b
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Baichuan.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Baichuan.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Baichuan'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/BaichuanText.json b/app/components/base/icons/src/public/llm/BaichuanText.json
new file mode 100644
index 0000000..c4dc1d1
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/BaichuanText.json
@@ -0,0 +1,156 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "130",
+			"height": "24",
+			"viewBox": "0 0 130 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M9.58154 1.7793H6.52779L4.34655 6.20409V17.7335L1.91602 22.2206H7.21333L9.58154 17.7335V1.7793ZM11.5761 1.7793H16.8111V22.2206H11.5761V1.7793ZM23.9166 1.7793H18.6816V6.01712H23.9166V1.7793ZM23.9166 7.38818H18.6816V22.2206H23.9166V7.38818Z",
+					"fill": "url(#paint0_radial_11622_96091)"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M129.722 6.83203V18H127.482V6.83203H129.722Z",
+					"fill": "#FF6A34"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M123.196 15.872H118.748L118.012 18H115.66L119.676 6.81604H122.284L126.3 18H123.932L123.196 15.872ZM122.588 14.08L120.972 9.40804L119.356 14.08H122.588Z",
+					"fill": "#FF6A34"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M110.962 18H108.722L103.65 10.336V18H101.41V6.81598H103.65L108.722 14.496V6.81598H110.962V18Z",
+					"fill": "#FF6A34"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M97.1258 15.872H92.6778L91.9418 18H89.5898L93.6058 6.81604H96.2138L100.23 18H97.8618L97.1258 15.872ZM96.5178 14.08L94.9018 9.40804L93.2858 14.08H96.5178Z",
+					"fill": "#FF6A34"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M81.6482 6.83203V13.744C81.6482 14.5014 81.8455 15.0827 82.2402 15.488C82.6349 15.8827 83.1895 16.08 83.9042 16.08C84.6295 16.08 85.1895 15.8827 85.5842 15.488C85.9789 15.0827 86.1762 14.5014 86.1762 13.744V6.83203H88.4322V13.728C88.4322 14.6774 88.2242 15.4827 87.8082 16.144C87.4029 16.7947 86.8535 17.2854 86.1602 17.616C85.4775 17.9467 84.7149 18.112 83.8722 18.112C83.0402 18.112 82.2829 17.9467 81.6002 17.616C80.9282 17.2854 80.3949 16.7947 80.0002 16.144C79.6055 15.4827 79.4082 14.6774 79.4082 13.728V6.83203H81.6482Z",
+					"fill": "#FF6A34"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M77.557 6.83203V18H75.317V13.248H70.533V18H68.293V6.83203H70.533V11.424H75.317V6.83203H77.557Z",
+					"fill": "#FF6A34"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M55.7871 12.4C55.7871 11.3013 56.0324 10.32 56.5231 9.45599C57.0244 8.58132 57.7018 7.90399 58.5551 7.42399C59.4191 6.93332 60.3844 6.68799 61.4511 6.68799C62.6991 6.68799 63.7924 7.00799 64.7311 7.64799C65.6698 8.28799 66.3258 9.17332 66.6991 10.304H64.1231C63.8671 9.77065 63.5044 9.37065 63.0351 9.10399C62.5764 8.83732 62.0431 8.70399 61.4351 8.70399C60.7844 8.70399 60.2031 8.85865 59.6911 9.16799C59.1898 9.46665 58.7951 9.89332 58.5071 10.448C58.2298 11.0027 58.0911 11.6533 58.0911 12.4C58.0911 13.136 58.2298 13.7867 58.5071 14.352C58.7951 14.9067 59.1898 15.3387 59.6911 15.648C60.2031 15.9467 60.7844 16.096 61.4351 16.096C62.0431 16.096 62.5764 15.9627 63.0351 15.696C63.5044 15.4187 63.8671 15.0133 64.1231 14.48H66.6991C66.3258 15.6213 65.6698 16.512 64.7311 17.152C63.8031 17.7813 62.7098 18.096 61.4511 18.096C60.3844 18.096 59.4191 17.856 58.5551 17.376C57.7018 16.8853 57.0244 16.208 56.5231 15.344C56.0324 14.48 55.7871 13.4987 55.7871 12.4Z",
+					"fill": "#FF6A34"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M54.4373 6.83203V18H52.1973V6.83203H54.4373Z",
+					"fill": "#FF6A34"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M47.913 15.872H43.465L42.729 18H40.377L44.393 6.81598H47.001L51.017 18H48.649L47.913 15.872ZM47.305 14.08L45.689 9.40798L44.073 14.08H47.305Z",
+					"fill": "#FF6A34"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M37.4395 12.272C38.0688 12.3893 38.5862 12.704 38.9915 13.216C39.3968 13.728 39.5995 14.3146 39.5995 14.976C39.5995 15.5733 39.4502 16.1013 39.1515 16.56C38.8635 17.008 38.4422 17.36 37.8875 17.616C37.3328 17.872 36.6768 18 35.9195 18H31.1035V6.83197H35.7115C36.4688 6.83197 37.1195 6.95464 37.6635 7.19997C38.2182 7.4453 38.6342 7.78664 38.9115 8.22397C39.1995 8.6613 39.3435 9.1573 39.3435 9.71197C39.3435 10.3626 39.1675 10.9066 38.8155 11.344C38.4742 11.7813 38.0155 12.0906 37.4395 12.272ZM33.3435 11.44H35.3915C35.9248 11.44 36.3355 11.3226 36.6235 11.088C36.9115 10.8426 37.0555 10.496 37.0555 10.048C37.0555 9.59997 36.9115 9.2533 36.6235 9.00797C36.3355 8.76264 35.9248 8.63997 35.3915 8.63997H33.3435V11.44ZM35.5995 16.176C36.1435 16.176 36.5648 16.048 36.8635 15.792C37.1728 15.536 37.3275 15.1733 37.3275 14.704C37.3275 14.224 37.1675 13.8506 36.8475 13.584C36.5275 13.3066 36.0955 13.168 35.5515 13.168H33.3435V16.176H35.5995Z",
+					"fill": "#FF6A34"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "radialGradient",
+						"attributes": {
+							"id": "paint0_radial_11622_96091",
+							"cx": "0",
+							"cy": "0",
+							"r": "1",
+							"gradientUnits": "userSpaceOnUse",
+							"gradientTransform": "translate(6.5 5.5) rotate(45) scale(20.5061 22.0704)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#FEBD3F"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "0.77608",
+									"stop-color": "#FF6933"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "BaichuanText"
+}
diff --git a/app/components/base/icons/src/public/llm/BaichuanText.tsx b/app/components/base/icons/src/public/llm/BaichuanText.tsx
new file mode 100644
index 0000000..37d6242
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/BaichuanText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './BaichuanText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'BaichuanText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/Chatglm.json b/app/components/base/icons/src/public/llm/Chatglm.json
new file mode 100644
index 0000000..c01787f
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Chatglm.json
@@ -0,0 +1,72 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "mask",
+				"attributes": {
+					"id": "mask0_8587_60212",
+					"style": "mask-type:luminance",
+					"maskUnits": "userSpaceOnUse",
+					"x": "1",
+					"y": "2",
+					"width": "23",
+					"height": "21"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M23.8 2H1V22.4H23.8V2Z",
+							"fill": "white"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"mask": "url(#mask0_8587_60212)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M3.86378 14.4544C3.86378 13.0981 4.67438 11.737 6.25923 10.6634C7.83827 9.59364 10.0864 8.89368 12.6282 8.89368C15.17 8.89368 17.4182 9.59364 18.9972 10.6634C19.7966 11.2049 20.399 11.8196 20.7998 12.4699C21.2873 11.5802 21.4969 10.6351 21.3835 9.69252C21.3759 9.62928 21.3824 9.56766 21.4005 9.5106C21.0758 9.21852 20.7259 8.94624 20.3558 8.69556C18.3272 7.32126 15.5915 6.50964 12.6282 6.50964C9.66497 6.50964 6.92918 7.32126 4.90058 8.69556C2.8778 10.0659 1.45703 12.0812 1.45703 14.4544C1.45703 16.8275 2.8778 18.8428 4.90058 20.2132C6.92918 21.5875 9.66497 22.3991 12.6282 22.3991C15.5915 22.3991 18.3272 21.5875 20.3558 20.2132C22.3786 18.8428 23.7994 16.8275 23.7994 14.4544C23.7994 12.9455 23.225 11.5813 22.2868 10.4355C22.2377 11.4917 21.8621 12.5072 21.238 13.43C21.3409 13.7686 21.3926 14.1116 21.3926 14.4544C21.3926 15.8107 20.582 17.1717 18.9972 18.2453C17.4182 19.3151 15.17 20.015 12.6282 20.015C10.0864 20.015 7.83827 19.3151 6.25923 18.2453C4.67438 17.1717 3.86378 15.8107 3.86378 14.4544Z",
+							"fill": "#3762FF"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M3.84445 11.6838C3.20239 13.4885 3.35368 15.1156 4.18868 16.2838C5.02368 17.452 6.52281 18.1339 8.45459 18.1334C10.3826 18.133 12.6296 17.44 14.6939 15.9922C16.7581 14.5444 18.1643 12.6753 18.8052 10.8739C19.4473 9.0692 19.2959 7.44206 18.461 6.27392C17.626 5.10572 16.1269 4.42389 14.1951 4.42431C12.267 4.42475 10.0201 5.11774 7.95575 6.56552C5.89152 8.01332 4.48529 9.8825 3.84445 11.6838ZM1.53559 10.8778C2.36374 8.55002 4.11254 6.28976 6.54117 4.58645C8.96981 2.88312 11.7029 1.99995 14.1945 1.99939C16.6825 1.99884 19.0426 2.8912 20.4589 4.87263C21.8752 6.85406 21.941 9.35564 21.1141 11.6799C20.2859 14.0077 18.5371 16.2679 16.1085 17.9713C13.6798 19.6746 10.9468 20.5578 8.45513 20.5584C5.9672 20.5589 3.60706 19.6665 2.19075 17.6851C0.774446 15.7036 0.708677 13.2021 1.53559 10.8778Z",
+							"fill": "#1041F3"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Chatglm"
+}
diff --git a/app/components/base/icons/src/public/llm/Chatglm.tsx b/app/components/base/icons/src/public/llm/Chatglm.tsx
new file mode 100644
index 0000000..742704f
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Chatglm.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Chatglm.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Chatglm'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/ChatglmText.json b/app/components/base/icons/src/public/llm/ChatglmText.json
new file mode 100644
index 0000000..1fe28ea
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/ChatglmText.json
@@ -0,0 +1,135 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "100",
+			"height": "24",
+			"viewBox": "0 0 100 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M56.5415 9.49683C56.3371 9.38235 56.1222 9.28491 55.8984 9.20565C55.4497 9.04653 54.9672 8.95911 54.4654 8.95911C52.0893 8.95911 50.1562 10.9044 50.1562 13.2955C50.1562 15.6867 52.0893 17.6313 54.4654 17.6313C54.9672 17.6313 55.4497 17.5438 55.8984 17.3847C55.9178 17.3778 55.9378 17.3703 55.9572 17.3627C57.2065 16.8986 58.1845 15.8659 58.582 14.5785V12.0125C58.2489 10.9333 57.5083 10.0333 56.5415 9.49683ZM55.9578 13.9446C55.9397 13.986 55.9197 14.0269 55.8991 14.0665C55.6247 14.5804 55.0854 14.9307 54.466 14.9307C53.5698 14.9307 52.8411 14.1973 52.8411 13.2955C52.8411 12.3936 53.5698 11.6603 54.466 11.6603C55.0854 11.6603 55.6241 12.01 55.8991 12.5244C55.9203 12.5647 55.9403 12.6049 55.9578 12.6471C56.0434 12.8458 56.0909 13.0653 56.0909 13.2955C56.0909 13.5257 56.0434 13.7452 55.9578 13.9446Z",
+					"fill": "#1A2029"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M58.6419 9.49683V17.596H55.959V13.9445C56.0446 13.7458 56.0921 13.5256 56.0921 13.2955C56.0921 13.0653 56.0446 12.8458 55.959 12.6471V9.49683H58.6419Z",
+					"fill": "#1A2029"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M63.4475 7.46912H60.7637V17.6142H63.4475V7.46912Z",
+					"fill": "#1A2029"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M64.8417 9.49683H59.3789V12.1974H64.3659C64.3587 12.0773 64.3545 11.9559 64.3545 11.8339C64.3545 11.0031 64.5285 10.2125 64.8417 9.49683Z",
+					"fill": "#1A2029"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M35.3555 14.908C34.2412 14.908 33.2644 14.3087 32.7257 13.4137C32.4444 12.947 32.2832 12.3999 32.2832 11.8163C32.2832 11.2326 32.4444 10.6849 32.7257 10.2188C33.2644 9.32448 34.2412 8.72448 35.3555 8.72448C36.4699 8.72448 37.4461 9.32388 37.9847 10.2188L40.2809 8.82324C39.2716 7.14714 37.441 6.02454 35.3555 6.02454C33.27 6.02454 31.4388 7.14714 30.4296 8.82324C29.9027 9.69744 29.5996 10.7219 29.5996 11.8169C29.5996 12.9118 29.9027 13.9363 30.4296 14.8105C31.4388 16.4866 33.2694 17.6092 35.3555 17.6092C37.4417 17.6092 39.2716 16.4866 40.2809 14.8105L37.9847 13.415C37.4461 14.3093 36.4692 14.9093 35.3555 14.9093V14.908Z",
+					"fill": "#1A2029"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M79.4097 14.9232H85.1781V17.6237H77.5179V17.6124H76.7265V6.04407H79.4097V14.9232ZM96.7581 6.04971H93.8625L91.4631 10.1371L89.0631 6.04971H86.0763V17.6181H88.7601V10.5352L91.4637 15.1389L94.0749 10.6918V17.6181H96.7581V6.12141V6.04971ZM70.7661 13.2169H73.1445V13.9779C72.5841 14.581 71.7867 14.959 70.9023 14.959C70.0179 14.959 69.2121 14.5773 68.6511 13.9691C68.5089 13.815 68.3811 13.6458 68.2725 13.4647C67.9911 12.998 67.8297 12.4509 67.8297 11.8672C67.8297 11.2836 67.9911 10.7358 68.2725 10.2697C68.8113 9.37545 69.7881 8.77545 70.9023 8.77545C71.7087 8.77545 72.4425 9.08931 72.9909 9.60249L74.8881 7.69311C73.8537 6.69123 72.4479 6.07491 70.9023 6.07491C68.8161 6.07491 66.9855 7.19751 65.9763 8.87355C65.4495 9.74775 65.1465 10.7723 65.1465 11.8672C65.1465 12.9622 65.4495 13.9867 65.9763 14.8609C66.1983 15.2288 66.4587 15.5703 66.7539 15.8791C67.8027 16.9765 69.2751 17.6596 70.9029 17.6596C72.9885 17.6596 74.8191 16.537 75.8283 14.8609V10.5175H70.7661V13.2181V13.2169Z",
+					"fill": "#1A2029"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M49.4752 12.5477V17.6174H46.7954V13.1156C46.7954 12.2603 46.106 11.5666 45.2561 11.5666C44.4061 11.5666 43.7168 12.2597 43.7168 13.1156V17.6174H41.0332V6H43.7168V9.8811C44.3343 9.3333 45.1473 9.00186 46.0373 9.00942C47.9484 9.02514 49.4752 10.6244 49.4752 12.5477Z",
+					"fill": "#1A2029"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "mask",
+				"attributes": {
+					"id": "mask0_8587_60467",
+					"style": "mask-type:luminance",
+					"maskUnits": "userSpaceOnUse",
+					"x": "2",
+					"y": "1",
+					"width": "23",
+					"height": "22"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M24.8 1.80005H2V22.2H24.8V1.80005Z",
+							"fill": "white"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"mask": "url(#mask0_8587_60467)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M4.86378 14.2544C4.86378 12.8981 5.67438 11.5371 7.25923 10.4634C8.83827 9.39369 11.0864 8.69373 13.6282 8.69373C16.17 8.69373 18.4182 9.39369 19.9972 10.4634C20.7966 11.005 21.399 11.6196 21.7998 12.27C22.2873 11.3803 22.4969 10.4351 22.3835 9.49257C22.3759 9.42933 22.3824 9.36771 22.4005 9.31065C22.0758 9.01857 21.7259 8.74629 21.3558 8.49561C19.3272 7.12131 16.5915 6.30969 13.6282 6.30969C10.665 6.30969 7.92918 7.12131 5.90058 8.49561C3.8778 9.86595 2.45703 11.8813 2.45703 14.2544C2.45703 16.6275 3.8778 18.6429 5.90058 20.0132C7.92918 21.3875 10.665 22.1991 13.6282 22.1991C16.5915 22.1991 19.3272 21.3875 21.3558 20.0132C23.3786 18.6429 24.7994 16.6275 24.7994 14.2544C24.7994 12.7455 24.225 11.3813 23.2868 10.2356C23.2377 11.2918 22.8621 12.3073 22.238 13.2301C22.3409 13.5687 22.3926 13.9117 22.3926 14.2544C22.3926 15.6107 21.582 16.9718 19.9972 18.0454C18.4182 19.1151 16.17 19.8151 13.6282 19.8151C11.0864 19.8151 8.83827 19.1151 7.25923 18.0454C5.67438 16.9718 4.86378 15.6107 4.86378 14.2544Z",
+							"fill": "#3762FF"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M4.84445 11.4838C4.20239 13.2886 4.35368 14.9157 5.18868 16.0839C6.02368 17.2521 7.52281 17.9339 9.45459 17.9334C11.3826 17.933 13.6296 17.24 15.6939 15.7923C17.7581 14.3445 19.1643 12.4753 19.8052 10.674C20.4473 8.86925 20.2959 7.24211 19.461 6.07397C18.626 4.90576 17.1269 4.22394 15.1951 4.22436C13.267 4.22479 11.0201 4.91779 8.95575 6.36557C6.89152 7.81337 5.48529 9.68255 4.84445 11.4838ZM2.53559 10.6778C3.36374 8.35007 5.11254 6.08981 7.54117 4.3865C9.96981 2.68317 12.7029 1.8 15.1945 1.79944C17.6825 1.79889 20.0426 2.69125 21.4589 4.67268C22.8752 6.65411 22.941 9.15569 22.1141 11.48C21.2859 13.8077 19.5371 16.068 17.1085 17.7713C14.6798 19.4747 11.9468 20.3579 9.45513 20.3584C6.9672 20.3589 4.60706 19.4666 3.19075 17.4851C1.77445 15.5037 1.70868 13.0022 2.53559 10.6778Z",
+							"fill": "#1041F3"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ChatglmText"
+}
diff --git a/app/components/base/icons/src/public/llm/ChatglmText.tsx b/app/components/base/icons/src/public/llm/ChatglmText.tsx
new file mode 100644
index 0000000..e97f3fa
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/ChatglmText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ChatglmText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ChatglmText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/Cohere.json b/app/components/base/icons/src/public/llm/Cohere.json
new file mode 100644
index 0000000..7062891
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Cohere.json
@@ -0,0 +1,112 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "22",
+			"height": "22",
+			"viewBox": "0 0 22 22",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Clip path group"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "mask",
+						"attributes": {
+							"id": "mask0_13224_9519",
+							"style": "mask-type:luminance",
+							"maskUnits": "userSpaceOnUse",
+							"x": "0",
+							"y": "0",
+							"width": "22",
+							"height": "22"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "clip0_2207_90691"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector",
+											"d": "M21.5 0.5H0.5V21.5H21.5V0.5Z",
+											"fill": "white"
+										},
+										"children": []
+									}
+								]
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"mask": "url(#mask0_13224_9519)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_2",
+											"fill-rule": "evenodd",
+											"clip-rule": "evenodd",
+											"d": "M7.30367 13.0035C7.8689 13.0035 8.99327 12.9725 10.5474 12.3326C12.3585 11.587 15.9617 10.2334 18.561 8.84305C20.3788 7.8706 21.1757 6.58448 21.1757 4.85248C21.1757 2.44869 19.2271 0.5 16.8233 0.5H6.75176C3.299 0.5 0.5 3.299 0.5 6.75176C0.5 10.2045 3.12069 13.0035 7.30367 13.0035Z",
+											"fill": "#39594D"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_3",
+											"fill-rule": "evenodd",
+											"clip-rule": "evenodd",
+											"d": "M9.00732 17.3086C9.00732 15.6162 10.0262 14.0902 11.5894 13.4414L14.7612 12.1251C17.9694 10.7936 21.5006 13.1513 21.5006 16.6249C21.5006 19.316 19.3185 21.4974 16.6273 21.4967L13.1933 21.4958C10.8813 21.4952 9.00732 19.6207 9.00732 17.3086Z",
+											"fill": "#D18EE2"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_4",
+											"d": "M4.10396 13.8277C2.11358 13.8277 0.5 15.4411 0.5 17.4315V17.8984C0.5 19.8887 2.11352 21.5022 4.1039 21.5022C6.09428 21.5022 7.70785 19.8887 7.70785 17.8984V17.4315C7.70785 15.4411 6.09434 13.8277 4.10396 13.8277Z",
+											"fill": "#FF7759"
+										},
+										"children": []
+									}
+								]
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Cohere"
+}
diff --git a/app/components/base/icons/src/public/llm/Cohere.tsx b/app/components/base/icons/src/public/llm/Cohere.tsx
new file mode 100644
index 0000000..1f16d1c
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Cohere.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Cohere.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Cohere'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/CohereText.json b/app/components/base/icons/src/public/llm/CohereText.json
new file mode 100644
index 0000000..89657cc
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/CohereText.json
@@ -0,0 +1,90 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "120",
+			"height": "24",
+			"viewBox": "0 0 120 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M34.4917 21.9129C37.4378 21.9129 40.0162 20.4398 41.0355 17.4656C41.2334 16.8701 40.9496 16.4743 40.384 16.4743H39.2787C38.7689 16.4743 38.4292 16.7002 38.2013 17.1818C37.3239 18.9108 36.1047 19.5324 34.5757 19.5324C31.8553 19.5324 30.1844 17.6335 30.1844 14.4616C30.1844 11.2896 31.9133 9.39083 34.5177 9.39083C36.1046 9.39083 37.4079 10.0704 38.2293 11.6854C38.4852 12.1671 38.795 12.3929 39.3067 12.3929H40.412C40.9776 12.3929 41.2614 12.0251 41.0635 11.4855C39.8742 8.25556 37.2099 7.01035 34.4917 7.01035C30.3843 7.01035 27.3242 10.0424 27.3242 14.4616C27.3242 18.8808 30.2424 21.9129 34.4917 21.9129ZM108.627 13.1584C108.995 10.75 110.638 9.24892 112.876 9.24892C115.115 9.24892 116.786 10.7779 116.983 13.1584H108.627ZM112.99 21.9129C115.596 21.9129 118.203 20.6956 119.478 17.9474C119.79 17.2958 119.506 16.8421 118.94 16.8421H117.892C117.383 16.8421 117.071 17.0679 116.816 17.5216C115.966 19.0227 114.493 19.6463 112.992 19.6463C110.414 19.6463 108.743 17.8894 108.545 15.0292H118.943C119.508 15.0292 119.878 14.7174 119.878 14.1219C119.764 9.67465 116.876 7.01235 112.88 7.01235C108.885 7.01235 105.713 9.90251 105.713 14.4636C105.713 19.0247 108.801 21.9148 112.994 21.9148L112.99 21.9129ZM96.5025 14.8313H97.4378C98.0035 14.8313 98.3152 14.5196 98.4012 13.9239C98.9409 10.0964 101.182 9.5887 103.564 9.70264C104.074 9.72661 104.491 9.33487 104.491 8.82319V7.94575C104.491 7.38012 104.208 7.03833 103.642 7.01035C101.533 6.9304 99.6525 7.65393 98.5651 9.70264C98.5052 9.81455 98.3373 9.78458 98.3233 9.65866L98.1474 8.11365C98.0915 7.54801 97.7796 7.26418 97.212 7.26418H92.9347C92.435 7.26418 92.0272 7.66993 92.0272 8.17161V8.6533C92.0272 9.15298 92.433 9.56072 92.9347 9.56072H94.6916C95.1912 9.56072 95.599 9.96646 95.599 10.4681V13.9239C95.599 14.4236 96.0048 14.8313 96.5064 14.8313H96.5025ZM92.6788 21.631H101.545C102.111 21.631 102.453 21.2913 102.453 20.7236V20.2418C102.453 19.6762 102.113 19.3345 101.545 19.3345H99.2787C98.7131 19.3345 98.3712 18.9947 98.3712 18.4271V16.8681C98.3712 16.3024 98.0315 15.9606 97.4638 15.9606H96.5005C95.9348 15.9606 95.593 16.3004 95.593 16.8681V18.4271C95.593 18.9927 95.2532 19.3345 94.6856 19.3345H92.6749C92.1092 19.3345 91.7674 19.6743 91.7674 20.2418V20.7236C91.7674 21.2893 92.1073 21.631 92.6749 21.631H92.6788ZM78.9955 13.1604C79.3633 10.752 81.0062 9.25092 83.2449 9.25092C85.4834 9.25092 87.1544 10.7799 87.3522 13.1604H78.9955ZM83.3587 21.9148C85.9651 21.9148 88.5714 20.6977 89.8466 17.9493C90.1585 17.2978 89.8746 16.844 89.309 16.844H88.2617C87.7519 16.844 87.4402 17.0699 87.1844 17.5236C86.3349 19.0247 84.8618 19.6482 83.3607 19.6482C80.7824 19.6482 79.1115 17.8914 78.9136 15.0313H89.311C89.8766 15.0313 90.2464 14.7194 90.2464 14.1238C90.1324 9.67665 87.2443 7.01434 83.2488 7.01434C79.2533 7.01434 76.0814 9.9045 76.0814 14.4656C76.0814 19.0266 79.1694 21.9168 83.3628 21.9168L83.3587 21.9148ZM50.5835 21.9148C54.8329 21.9148 57.8649 18.7708 57.8649 14.4636C57.8649 10.1563 54.8329 7.01235 50.5835 7.01235C46.3342 7.01235 43.3022 10.2143 43.3022 14.4636C43.3022 15.455 43.472 16.5602 43.9816 17.7775C44.2375 18.3731 44.7192 18.4571 45.2289 18.0892L46.0504 17.4936C46.4761 17.1818 46.588 16.8141 46.4461 16.2765C46.2202 15.5689 46.1623 14.9453 46.1623 14.4076C46.1623 11.4335 47.9472 9.39283 50.5815 9.39283C53.2159 9.39283 55.0007 11.4035 55.0007 14.4636C55.0007 17.5236 53.2439 19.5344 50.6375 19.5344C49.7301 19.5344 48.8806 19.3645 47.8612 18.5989C47.4355 18.2592 47.0397 18.2032 46.586 18.5429L45.9624 18.9967C45.4527 19.3645 45.3968 19.8741 45.8764 20.2718C47.3496 21.4611 49.0485 21.9148 50.5795 21.9148H50.5835ZM61.4606 21.631H62.3961C62.8957 21.631 63.3035 21.2252 63.3035 20.7236V13.9539C63.3035 11.0937 64.8324 9.39283 67.213 9.39283C69.3656 9.39283 70.6128 10.8099 70.6128 13.4163V20.7255C70.6128 21.2252 71.0186 21.633 71.5203 21.633H72.4836C72.9833 21.633 73.391 21.2272 73.391 20.7255V12.9625C73.391 9.13899 71.4363 7.01434 68.1224 7.01434C65.8659 7.01434 64.5327 7.93776 63.5373 9.22294C63.4613 9.32088 63.3075 9.26691 63.3075 9.14499V2.99092C63.3014 2.48924 62.8957 2.0835 62.3961 2.0835H61.4606C60.9609 2.0835 60.5532 2.48924 60.5532 2.99092V20.7236C60.5532 21.2232 60.959 21.631 61.4606 21.631Z",
+					"fill": "#39594D"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "mask",
+				"attributes": {
+					"id": "mask0_13223_52628",
+					"style": "mask-type:luminance",
+					"maskUnits": "userSpaceOnUse",
+					"x": "1",
+					"y": "2",
+					"width": "20",
+					"height": "20"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M20.8354 2.08319H1.00195V21.9165H20.8354V2.08319Z",
+							"fill": "white"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"mask": "url(#mask0_13223_52628)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M7.42768 13.8921C7.96151 13.8921 9.02342 13.8628 10.4912 13.2585C12.2017 12.5542 15.6047 11.2758 18.0597 9.96274C19.7765 9.04432 20.5291 7.82964 20.5291 6.19387C20.5291 3.92362 18.6887 2.08319 16.4185 2.08319H6.90643C3.64547 2.08319 1.00195 4.72669 1.00195 7.98763C1.00195 11.2486 3.47706 13.8921 7.42768 13.8921Z",
+							"fill": "#39594D"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M9.03711 17.958C9.03711 16.3596 9.99942 14.9184 11.4758 14.3057L14.4713 13.0625C17.5013 11.805 20.8364 14.0316 20.8364 17.3123C20.8364 19.8539 18.7755 21.9141 16.2338 21.9134L12.9906 21.9126C10.807 21.912 9.03711 20.1417 9.03711 17.958Z",
+							"fill": "#D18EE2"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M4.40571 14.6705C2.5259 14.6705 1.00195 16.1943 1.00195 18.0741V18.515C1.00195 20.3947 2.52584 21.9186 4.40565 21.9186C6.28547 21.9186 7.80941 20.3947 7.80941 18.515V18.0741C7.80941 16.1943 6.28552 14.6705 4.40571 14.6705Z",
+							"fill": "#FF7759"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "CohereText"
+}
diff --git a/app/components/base/icons/src/public/llm/CohereText.tsx b/app/components/base/icons/src/public/llm/CohereText.tsx
new file mode 100644
index 0000000..e6d5ceb
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/CohereText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './CohereText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'CohereText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/Gpt3.json b/app/components/base/icons/src/public/llm/Gpt3.json
new file mode 100644
index 0000000..383cb98
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Gpt3.json
@@ -0,0 +1,51 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"width": "24",
+					"height": "24",
+					"rx": "6",
+					"fill": "#19C37D"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M19.6451 11.6028C19.8209 11.995 19.9325 12.4142 19.9781 12.8419C20.0221 13.2696 20.0001 13.7024 19.9088 14.1234C19.8192 14.5443 19.6637 14.9484 19.4473 15.3203C19.3053 15.5688 19.1379 15.8021 18.9452 16.0168C18.7542 16.2298 18.5412 16.4225 18.3096 16.5916C18.0763 16.7606 17.8278 16.9027 17.564 17.0193C17.302 17.1343 17.0281 17.2222 16.7475 17.2796C16.6156 17.6888 16.4195 18.0759 16.1659 18.4242C15.914 18.7724 15.6081 19.0784 15.2598 19.3303C14.9115 19.5839 14.5261 19.78 14.117 19.9118C13.7079 20.0454 13.2802 20.1113 12.8491 20.1113C12.5634 20.113 12.276 20.0826 11.9953 20.0251C11.7164 19.9659 11.4425 19.8763 11.1805 19.7597C10.9184 19.643 10.6699 19.4977 10.4383 19.3286C10.2084 19.1595 9.99541 18.9651 9.80606 18.7504C9.38342 18.8417 8.95064 18.8637 8.52293 18.8197C8.09522 18.7741 7.67596 18.6625 7.28206 18.4867C6.88985 18.3126 6.52638 18.0759 6.20687 17.7868C5.88735 17.4977 5.61517 17.1596 5.40047 16.7877C5.25677 16.5392 5.13843 16.2771 5.04883 16.005C4.95924 15.7328 4.90007 15.4522 4.86964 15.1665C4.83921 14.8824 4.8409 14.595 4.87133 14.3093C4.90176 14.0253 4.96431 13.7447 5.05391 13.4725C4.76651 13.153 4.52983 12.7895 4.35402 12.3973C4.17989 12.0034 4.06662 11.5859 4.02267 11.1581C3.97702 10.7304 4.00069 10.2976 4.09029 9.8767C4.17989 9.45575 4.33542 9.05171 4.55181 8.67978C4.69382 8.43127 4.86118 8.19628 5.05222 7.98327C5.24325 7.77026 5.45795 7.57754 5.68956 7.40848C5.92116 7.23943 6.17136 7.09573 6.4334 6.98077C6.69713 6.86412 6.971 6.77791 7.25163 6.72043C7.38349 6.30962 7.5796 5.92417 7.83149 5.57592C8.08508 5.22766 8.39107 4.92167 8.73932 4.66809C9.08758 4.4162 9.47302 4.22009 9.88214 4.08654C10.2913 3.95467 10.719 3.88705 11.1501 3.88874C11.4358 3.88705 11.7232 3.91579 12.0038 3.97496C12.2844 4.03413 12.5583 4.12204 12.8203 4.23869C13.0824 4.35703 13.3309 4.50072 13.5625 4.66978C13.7941 4.84053 14.0071 5.03325 14.1964 5.24795C14.6174 5.15835 15.0502 5.13637 15.4779 5.18033C15.9056 5.22428 16.3232 5.33755 16.7171 5.51168C17.1093 5.6875 17.4727 5.92248 17.7923 6.21157C18.1118 6.49896 18.384 6.83538 18.5987 7.209C18.7423 7.45582 18.8607 7.71786 18.9503 7.99173C19.0399 8.26391 19.1007 8.54454 19.1295 8.83024C19.1599 9.11595 19.1599 9.40334 19.1278 9.68905C19.0974 9.97475 19.0348 10.2554 18.9452 10.5276C19.2343 10.8471 19.4693 11.2089 19.6451 11.6028ZM14.0122 18.8197C14.3807 18.6676 14.7154 18.4428 14.9978 18.1604C15.2801 17.8781 15.5049 17.5434 15.6571 17.1731C15.8092 16.8046 15.8887 16.409 15.8887 16.01V12.2401C15.8876 12.2367 15.8864 12.2328 15.8853 12.2283C15.8842 12.2249 15.8825 12.2215 15.8802 12.2181C15.878 12.2147 15.8752 12.2119 15.8718 12.2097C15.8684 12.2063 15.865 12.204 15.8616 12.2029L14.4974 11.4151V15.9695C14.4974 16.0151 14.4906 16.0624 14.4788 16.1064C14.4669 16.152 14.45 16.1943 14.4264 16.2349C14.4027 16.2755 14.3756 16.3126 14.3418 16.3448C14.309 16.3775 14.272 16.4059 14.2319 16.4293L11.0013 18.294C10.9742 18.3109 10.9286 18.3346 10.9049 18.3481C11.0385 18.4613 11.1839 18.5611 11.336 18.649C11.4899 18.7369 11.6488 18.8113 11.8144 18.8722C11.9801 18.9313 12.1509 18.977 12.3233 19.0074C12.4974 19.0378 12.6732 19.053 12.8491 19.053C13.248 19.053 13.6436 18.9736 14.0122 18.8197ZM6.31844 16.2602C6.51962 16.6068 6.78504 16.9077 7.10117 17.1512C7.419 17.3946 7.77908 17.5721 8.16453 17.6752C8.54998 17.7784 8.95233 17.8054 9.34792 17.753C9.74351 17.7006 10.1239 17.5721 10.4705 17.3726L13.7366 15.4877L13.7451 15.4792C13.7473 15.477 13.749 15.4736 13.7501 15.4691C13.7524 15.4657 13.7541 15.4623 13.7552 15.4589V13.8698L9.81283 16.1504C9.77225 16.174 9.72999 16.1909 9.68603 16.2045C9.64039 16.2163 9.59474 16.2214 9.54741 16.2214C9.50176 16.2214 9.45612 16.2163 9.41047 16.2045C9.36652 16.1909 9.32256 16.174 9.28199 16.1504L6.05133 14.284C6.0226 14.2671 5.98033 14.2417 5.95666 14.2265C5.92623 14.4006 5.91102 14.5764 5.91102 14.7523C5.91102 14.9281 5.92792 15.1039 5.95835 15.278C5.98878 15.4505 6.03612 15.6212 6.09529 15.7869C6.15615 15.9526 6.23053 16.1115 6.31844 16.2636V16.2602ZM5.46978 9.21062C5.2703 9.55718 5.14182 9.93925 5.08941 10.3348C5.037 10.7304 5.06405 11.1311 5.16717 11.5182C5.2703 11.9037 5.44781 12.2638 5.69125 12.5816C5.93469 12.8977 6.2373 13.1631 6.58217 13.3626L9.84664 15.2493C9.85002 15.2504 9.85396 15.2515 9.85847 15.2527H9.8703C9.87481 15.2527 9.87876 15.2515 9.88214 15.2493C9.88552 15.2482 9.8889 15.2465 9.89228 15.2442L11.2616 14.453L7.31925 12.1775C7.28037 12.1539 7.24318 12.1251 7.20937 12.093C7.17661 12.0602 7.1482 12.0232 7.12484 11.9831C7.10286 11.9426 7.08427 11.9003 7.07243 11.8547C7.0606 11.8107 7.05384 11.7651 7.05553 11.7177V7.87846C6.88985 7.93932 6.72925 8.0137 6.5771 8.10161C6.42495 8.19121 6.28125 8.29265 6.14601 8.40591C6.01245 8.51918 5.88735 8.64428 5.77408 8.77953C5.66082 8.91308 5.56107 9.05847 5.47316 9.21062H5.46978ZM16.6832 11.8208C16.7238 11.8445 16.761 11.8716 16.7948 11.9054C16.8269 11.9375 16.8557 11.9747 16.8794 12.0153C16.9013 12.0558 16.9199 12.0998 16.9318 12.1437C16.9419 12.1894 16.9487 12.235 16.947 12.2824V16.1216C17.4896 15.9221 17.963 15.5722 18.3129 15.1124C18.6646 14.6525 18.8759 14.1031 18.9249 13.5283C18.974 12.9535 18.859 12.3753 18.5919 11.8631C18.3248 11.3509 17.9174 10.9248 17.417 10.6374L14.1525 8.75079C14.1491 8.74966 14.1452 8.74853 14.1407 8.74741H14.1288C14.1254 8.74853 14.1215 8.74966 14.117 8.75079C14.1136 8.75191 14.1102 8.7536 14.1068 8.75586L12.7443 9.54366L16.6866 11.8208H16.6832ZM18.0441 9.77526H18.0425V9.77695L18.0441 9.77526ZM18.0425 9.77357C18.1405 9.20555 18.0746 8.62061 17.8514 8.08809C17.63 7.55556 17.2597 7.09742 16.7864 6.76607C16.313 6.43641 15.7551 6.24707 15.1787 6.22171C14.6005 6.19804 14.0291 6.33836 13.5287 6.62575L10.2642 8.51073C10.2608 8.51298 10.258 8.5158 10.2558 8.51918L10.249 8.52932C10.2479 8.5327 10.2467 8.53665 10.2456 8.54116C10.2445 8.54454 10.2439 8.54848 10.2439 8.55299V10.1286L14.1863 7.85141C14.2269 7.82774 14.2708 7.81084 14.3148 7.79731C14.3604 7.78548 14.4061 7.78041 14.4517 7.78041C14.499 7.78041 14.5447 7.78548 14.5903 7.79731C14.6343 7.81084 14.6766 7.82774 14.7171 7.85141L17.9478 9.71778C17.9765 9.73469 18.0188 9.75836 18.0425 9.77357ZM9.50007 8.02892C9.50007 7.98327 9.50683 7.93763 9.51867 7.89198C9.5305 7.84803 9.54741 7.80407 9.57108 7.7635C9.59474 7.72462 9.62179 7.68743 9.6556 7.65361C9.68772 7.62149 9.72492 7.59275 9.76549 7.57078L12.9961 5.70609C13.0266 5.6875 13.0688 5.66383 13.0925 5.65199C12.6496 5.28176 12.1086 5.04508 11.5355 4.97239C10.9624 4.89801 10.3809 4.9893 9.85847 5.23443C9.3344 5.47956 8.89147 5.87008 8.5821 6.35696C8.27273 6.84553 8.10874 7.41017 8.10874 7.98834V11.7583C8.10987 11.7628 8.111 11.7667 8.11212 11.7701C8.11325 11.7735 8.11494 11.7769 8.1172 11.7803C8.11945 11.7836 8.12227 11.787 8.12565 11.7904C8.1279 11.7927 8.13128 11.7949 8.13579 11.7972L9.50007 12.585V8.02892ZM10.2405 13.011L11.997 14.0253L13.7535 13.011V10.984L11.9987 9.96968L10.2422 10.984L10.2405 13.011Z",
+					"fill": "white"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"x": "0.5",
+					"y": "0.5",
+					"width": "23",
+					"height": "23",
+					"rx": "5.5",
+					"stroke": "black",
+					"stroke-opacity": "0.05"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Gpt3"
+}
diff --git a/app/components/base/icons/src/public/llm/Gpt3.tsx b/app/components/base/icons/src/public/llm/Gpt3.tsx
new file mode 100644
index 0000000..7926d50
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Gpt3.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Gpt3.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Gpt3'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/Gpt4.json b/app/components/base/icons/src/public/llm/Gpt4.json
new file mode 100644
index 0000000..b0d1941
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Gpt4.json
@@ -0,0 +1,51 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"width": "24",
+					"height": "24",
+					"rx": "6",
+					"fill": "#AB68FF"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M19.6451 11.6028C19.8209 11.995 19.9325 12.4142 19.9781 12.8419C20.0221 13.2696 20.0001 13.7024 19.9088 14.1234C19.8192 14.5443 19.6637 14.9484 19.4473 15.3203C19.3053 15.5688 19.1379 15.8021 18.9452 16.0168C18.7542 16.2298 18.5412 16.4225 18.3096 16.5916C18.0763 16.7606 17.8278 16.9027 17.564 17.0193C17.302 17.1343 17.0281 17.2222 16.7475 17.2796C16.6156 17.6888 16.4195 18.0759 16.1659 18.4242C15.914 18.7724 15.6081 19.0784 15.2598 19.3303C14.9115 19.5839 14.5261 19.78 14.117 19.9118C13.7079 20.0454 13.2802 20.1113 12.8491 20.1113C12.5634 20.113 12.276 20.0826 11.9953 20.0251C11.7164 19.9659 11.4425 19.8763 11.1805 19.7597C10.9184 19.643 10.6699 19.4977 10.4383 19.3286C10.2084 19.1595 9.99541 18.9651 9.80606 18.7504C9.38342 18.8417 8.95064 18.8637 8.52293 18.8197C8.09522 18.7741 7.67596 18.6625 7.28206 18.4867C6.88985 18.3126 6.52638 18.0759 6.20687 17.7868C5.88735 17.4977 5.61517 17.1596 5.40047 16.7877C5.25677 16.5392 5.13843 16.2771 5.04883 16.005C4.95924 15.7328 4.90007 15.4522 4.86964 15.1665C4.83921 14.8824 4.8409 14.595 4.87133 14.3093C4.90176 14.0253 4.96431 13.7447 5.05391 13.4725C4.76651 13.153 4.52983 12.7895 4.35402 12.3973C4.17989 12.0034 4.06662 11.5859 4.02267 11.1581C3.97702 10.7304 4.00069 10.2976 4.09029 9.8767C4.17989 9.45575 4.33542 9.05171 4.55181 8.67978C4.69382 8.43127 4.86118 8.19628 5.05222 7.98327C5.24325 7.77026 5.45795 7.57754 5.68956 7.40848C5.92116 7.23943 6.17136 7.09573 6.4334 6.98077C6.69713 6.86412 6.971 6.77791 7.25163 6.72043C7.38349 6.30962 7.5796 5.92417 7.83149 5.57592C8.08508 5.22766 8.39107 4.92167 8.73932 4.66809C9.08758 4.4162 9.47302 4.22009 9.88214 4.08654C10.2913 3.95467 10.719 3.88705 11.1501 3.88874C11.4358 3.88705 11.7232 3.91579 12.0038 3.97496C12.2844 4.03413 12.5583 4.12204 12.8203 4.23869C13.0824 4.35703 13.3309 4.50072 13.5625 4.66978C13.7941 4.84053 14.0071 5.03325 14.1964 5.24795C14.6174 5.15835 15.0502 5.13637 15.4779 5.18033C15.9056 5.22428 16.3232 5.33755 16.7171 5.51168C17.1093 5.6875 17.4727 5.92248 17.7923 6.21157C18.1118 6.49896 18.384 6.83538 18.5987 7.209C18.7423 7.45582 18.8607 7.71786 18.9503 7.99173C19.0399 8.26391 19.1007 8.54454 19.1295 8.83024C19.1599 9.11595 19.1599 9.40334 19.1278 9.68905C19.0974 9.97475 19.0348 10.2554 18.9452 10.5276C19.2343 10.8471 19.4693 11.2089 19.6451 11.6028ZM14.0122 18.8197C14.3807 18.6676 14.7154 18.4428 14.9978 18.1604C15.2801 17.8781 15.5049 17.5434 15.6571 17.1731C15.8092 16.8046 15.8887 16.409 15.8887 16.01V12.2401C15.8876 12.2367 15.8864 12.2328 15.8853 12.2283C15.8842 12.2249 15.8825 12.2215 15.8802 12.2181C15.878 12.2147 15.8752 12.2119 15.8718 12.2097C15.8684 12.2063 15.865 12.204 15.8616 12.2029L14.4974 11.4151V15.9695C14.4974 16.0151 14.4906 16.0624 14.4788 16.1064C14.4669 16.152 14.45 16.1943 14.4264 16.2349C14.4027 16.2755 14.3756 16.3126 14.3418 16.3448C14.309 16.3775 14.272 16.4059 14.2319 16.4293L11.0013 18.294C10.9742 18.3109 10.9286 18.3346 10.9049 18.3481C11.0385 18.4613 11.1839 18.5611 11.336 18.649C11.4899 18.7369 11.6488 18.8113 11.8144 18.8722C11.9801 18.9313 12.1509 18.977 12.3233 19.0074C12.4974 19.0378 12.6732 19.053 12.8491 19.053C13.248 19.053 13.6436 18.9736 14.0122 18.8197ZM6.31844 16.2602C6.51962 16.6068 6.78504 16.9077 7.10117 17.1512C7.419 17.3946 7.77908 17.5721 8.16453 17.6752C8.54998 17.7784 8.95233 17.8054 9.34792 17.753C9.74351 17.7006 10.1239 17.5721 10.4705 17.3726L13.7366 15.4877L13.7451 15.4792C13.7473 15.477 13.749 15.4736 13.7501 15.4691C13.7524 15.4657 13.7541 15.4623 13.7552 15.4589V13.8698L9.81283 16.1504C9.77225 16.174 9.72999 16.1909 9.68603 16.2045C9.64039 16.2163 9.59474 16.2214 9.54741 16.2214C9.50176 16.2214 9.45612 16.2163 9.41047 16.2045C9.36652 16.1909 9.32256 16.174 9.28199 16.1504L6.05133 14.284C6.0226 14.2671 5.98033 14.2417 5.95666 14.2265C5.92623 14.4006 5.91102 14.5764 5.91102 14.7523C5.91102 14.9281 5.92792 15.1039 5.95835 15.278C5.98878 15.4505 6.03612 15.6212 6.09529 15.7869C6.15615 15.9526 6.23053 16.1115 6.31844 16.2636V16.2602ZM5.46978 9.21062C5.2703 9.55718 5.14182 9.93925 5.08941 10.3348C5.037 10.7304 5.06405 11.1311 5.16717 11.5182C5.2703 11.9037 5.44781 12.2638 5.69125 12.5816C5.93469 12.8977 6.2373 13.1631 6.58217 13.3626L9.84664 15.2493C9.85002 15.2504 9.85396 15.2515 9.85847 15.2527H9.8703C9.87481 15.2527 9.87876 15.2515 9.88214 15.2493C9.88552 15.2482 9.8889 15.2465 9.89228 15.2442L11.2616 14.453L7.31925 12.1775C7.28037 12.1539 7.24318 12.1251 7.20937 12.093C7.17661 12.0602 7.1482 12.0232 7.12484 11.9831C7.10286 11.9426 7.08427 11.9003 7.07243 11.8547C7.0606 11.8107 7.05384 11.7651 7.05553 11.7177V7.87846C6.88985 7.93932 6.72925 8.0137 6.5771 8.10161C6.42495 8.19121 6.28125 8.29265 6.14601 8.40591C6.01245 8.51918 5.88735 8.64428 5.77408 8.77953C5.66082 8.91308 5.56107 9.05847 5.47316 9.21062H5.46978ZM16.6832 11.8208C16.7238 11.8445 16.761 11.8716 16.7948 11.9054C16.8269 11.9375 16.8557 11.9747 16.8794 12.0153C16.9013 12.0558 16.9199 12.0998 16.9318 12.1437C16.9419 12.1894 16.9487 12.235 16.947 12.2824V16.1216C17.4896 15.9221 17.963 15.5722 18.3129 15.1124C18.6646 14.6525 18.8759 14.1031 18.9249 13.5283C18.974 12.9535 18.859 12.3753 18.5919 11.8631C18.3248 11.3509 17.9174 10.9248 17.417 10.6374L14.1525 8.75079C14.1491 8.74966 14.1452 8.74853 14.1407 8.74741H14.1288C14.1254 8.74853 14.1215 8.74966 14.117 8.75079C14.1136 8.75191 14.1102 8.7536 14.1068 8.75586L12.7443 9.54366L16.6866 11.8208H16.6832ZM18.0441 9.77526H18.0425V9.77695L18.0441 9.77526ZM18.0425 9.77357C18.1405 9.20555 18.0746 8.62061 17.8514 8.08809C17.63 7.55556 17.2597 7.09742 16.7864 6.76607C16.313 6.43641 15.7551 6.24707 15.1787 6.22171C14.6005 6.19804 14.0291 6.33836 13.5287 6.62575L10.2642 8.51073C10.2608 8.51298 10.258 8.5158 10.2558 8.51918L10.249 8.52932C10.2479 8.5327 10.2467 8.53665 10.2456 8.54116C10.2445 8.54454 10.2439 8.54848 10.2439 8.55299V10.1286L14.1863 7.85141C14.2269 7.82774 14.2708 7.81084 14.3148 7.79731C14.3604 7.78548 14.4061 7.78041 14.4517 7.78041C14.499 7.78041 14.5447 7.78548 14.5903 7.79731C14.6343 7.81084 14.6766 7.82774 14.7171 7.85141L17.9478 9.71778C17.9765 9.73469 18.0188 9.75836 18.0425 9.77357ZM9.50007 8.02892C9.50007 7.98327 9.50683 7.93763 9.51867 7.89198C9.5305 7.84803 9.54741 7.80407 9.57108 7.7635C9.59474 7.72462 9.62179 7.68743 9.6556 7.65361C9.68772 7.62149 9.72492 7.59275 9.76549 7.57078L12.9961 5.70609C13.0266 5.6875 13.0688 5.66383 13.0925 5.65199C12.6496 5.28176 12.1086 5.04508 11.5355 4.97239C10.9624 4.89801 10.3809 4.9893 9.85847 5.23443C9.3344 5.47956 8.89147 5.87008 8.5821 6.35696C8.27273 6.84553 8.10874 7.41017 8.10874 7.98834V11.7583C8.10987 11.7628 8.111 11.7667 8.11212 11.7701C8.11325 11.7735 8.11494 11.7769 8.1172 11.7803C8.11945 11.7836 8.12227 11.787 8.12565 11.7904C8.1279 11.7927 8.13128 11.7949 8.13579 11.7972L9.50007 12.585V8.02892ZM10.2405 13.011L11.997 14.0253L13.7535 13.011V10.984L11.9987 9.96968L10.2422 10.984L10.2405 13.011Z",
+					"fill": "white"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"x": "0.5",
+					"y": "0.5",
+					"width": "23",
+					"height": "23",
+					"rx": "5.5",
+					"stroke": "black",
+					"stroke-opacity": "0.05"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Gpt4"
+}
diff --git a/app/components/base/icons/src/public/llm/Gpt4.tsx b/app/components/base/icons/src/public/llm/Gpt4.tsx
new file mode 100644
index 0000000..1fa170e
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Gpt4.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Gpt4.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Gpt4'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/Huggingface.json b/app/components/base/icons/src/public/llm/Huggingface.json
new file mode 100644
index 0000000..57e10e2
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Huggingface.json
@@ -0,0 +1,158 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M11.9286 20.2062C16.7767 20.2062 20.7069 16.2761 20.7069 11.428C20.7069 6.57993 16.7767 2.64978 11.9286 2.64978C7.08054 2.64978 3.15039 6.57993 3.15039 11.428C3.15039 16.2761 7.08054 20.2062 11.9286 20.2062Z",
+					"fill": "#FFD21E"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M20.7095 11.4326C20.7095 6.58451 16.7793 2.65436 11.9313 2.65436C7.08318 2.65436 3.15303 6.58451 3.15303 11.4326C3.15303 16.2807 7.08318 20.2108 11.9313 20.2108C16.7793 20.2108 20.7095 16.2807 20.7095 11.4326ZM2.14258 11.4326C2.14258 6.02647 6.52511 1.64392 11.9313 1.64392C17.3374 1.64392 21.7199 6.02647 21.7199 11.4326C21.7199 16.8387 17.3374 21.2213 11.9313 21.2213C6.52511 21.2213 2.14258 16.8387 2.14258 11.4326Z",
+					"fill": "#FF9D0B"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M14.7822 9.03703C15.1041 9.1507 15.2322 9.81254 15.5574 9.6396C16.1734 9.31212 16.4072 8.54734 16.0797 7.93142C15.7522 7.31553 14.9874 7.08172 14.3715 7.4092C13.7556 7.73669 13.5218 8.50147 13.8493 9.11738C14.0038 9.40809 14.4944 8.9354 14.7822 9.03703Z",
+					"fill": "#3A3B45"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M8.83422 9.03703C8.5123 9.1507 8.38422 9.81254 8.05901 9.6396C7.4431 9.31212 7.20928 8.54734 7.53676 7.93142C7.86425 7.31553 8.62903 7.08172 9.24494 7.4092C9.86086 7.73669 10.0947 8.50147 9.76719 9.11738C9.61262 9.40809 9.122 8.9354 8.83422 9.03703Z",
+					"fill": "#3A3B45"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M11.8679 15.1044C14.3507 15.1044 15.1519 12.8908 15.1519 11.7541C15.1519 11.1633 14.7547 11.3492 14.1187 11.6641C13.5309 11.9551 12.739 12.3563 11.8679 12.3563C10.0543 12.3563 8.58398 10.6173 8.58398 11.7541C8.58398 12.8908 9.38514 15.1044 11.8679 15.1044Z",
+					"fill": "#3A3B45"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "mask",
+				"attributes": {
+					"id": "mask0_8587_60183",
+					"style": "mask-type:alpha",
+					"maskUnits": "userSpaceOnUse",
+					"x": "8",
+					"y": "11",
+					"width": "8",
+					"height": "5"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M11.8562 15.1005C14.339 15.1005 15.1402 12.8869 15.1402 11.7502C15.1402 11.1594 14.743 11.3453 14.1069 11.6602C13.5191 11.9512 12.7273 12.3524 11.8562 12.3524C10.0425 12.3524 8.57227 10.6134 8.57227 11.7502C8.57227 12.8869 9.37342 15.1005 11.8562 15.1005Z",
+							"fill": "white"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"mask": "url(#mask0_8587_60183)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M11.9194 17.6824C13.1294 17.6824 14.1103 16.7016 14.1103 15.4916C14.1103 14.5491 13.5152 13.7457 12.6803 13.4364C12.6496 13.425 12.6185 13.4143 12.5872 13.4043C12.3766 13.337 12.1523 14.0606 11.9194 14.0606C11.7018 14.0606 11.4917 13.3324 11.2933 13.3915C10.3884 13.6609 9.72852 14.4991 9.72852 15.4916C9.72852 16.7016 10.7094 17.6824 11.9194 17.6824Z",
+							"fill": "#F94040"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M17.8698 10.2273C18.3232 10.2273 18.6908 9.85972 18.6908 9.40631C18.6908 8.9529 18.3232 8.58533 17.8698 8.58533C17.4164 8.58533 17.0488 8.9529 17.0488 9.40631C17.0488 9.85972 17.4164 10.2273 17.8698 10.2273Z",
+					"fill": "#FF9D0B"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M6.11981 10.2273C6.57323 10.2273 6.9408 9.85972 6.9408 9.40631C6.9408 8.9529 6.57323 8.58533 6.11981 8.58533C5.66638 8.58533 5.29883 8.9529 5.29883 9.40631C5.29883 9.85972 5.66638 10.2273 6.11981 10.2273Z",
+					"fill": "#FF9D0B"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M4.42915 13.0092C4.02018 13.0092 3.65465 13.1771 3.39976 13.4818C3.24214 13.6705 3.07743 13.9746 3.06404 14.4301C2.89252 14.3808 2.72757 14.3533 2.57347 14.3533C2.18193 14.3533 1.82827 14.5033 1.57819 14.7759C1.25687 15.1258 1.11414 15.5557 1.17628 15.9859C1.20584 16.1908 1.2743 16.3744 1.3766 16.5444C1.16087 16.719 1.00198 16.962 0.925188 17.2543C0.865067 17.4834 0.803429 17.9606 1.12526 18.4522C1.10479 18.4842 1.0856 18.5176 1.06766 18.5517C0.874161 18.919 0.861783 19.334 1.03255 19.7205C1.29147 20.3063 1.93487 20.7678 3.18429 21.2632C3.96157 21.5714 4.67267 21.7684 4.67899 21.7702C5.70661 22.0367 6.63596 22.1721 7.44053 22.1721C8.91931 22.1721 9.97801 21.7192 10.5873 20.8259C11.5679 19.3876 11.4277 18.072 10.1589 16.8039C9.45662 16.1021 8.98979 15.0674 8.89254 14.8403C8.69651 14.1679 8.17815 13.4204 7.3165 13.4204C7.244 13.4204 7.17049 13.4262 7.09824 13.4376C6.72084 13.4969 6.39093 13.7142 6.15525 14.0411C5.90087 13.7248 5.65381 13.4732 5.43025 13.3312C5.09327 13.1175 4.75654 13.0092 4.42915 13.0092ZM4.42915 14.0196C4.55799 14.0196 4.71536 14.0744 4.88891 14.1846C5.42773 14.5263 6.46747 16.3136 6.84816 17.0087C6.97573 17.2417 7.19373 17.3402 7.39001 17.3402C7.77953 17.3402 8.08368 16.9529 7.42563 16.4608C6.43615 15.7204 6.78324 14.5102 7.25562 14.4356C7.27633 14.4324 7.29679 14.4308 7.3165 14.4308C7.74594 14.4308 7.93539 15.171 7.93539 15.171C7.93539 15.171 8.49063 16.5654 9.44449 17.5185C10.3984 18.4719 10.4476 19.237 9.75243 20.2566C9.27828 20.9517 8.37064 21.1617 7.44053 21.1617C6.47581 21.1617 5.48684 20.9358 4.93261 20.7921C4.90533 20.785 1.53474 19.8329 1.96165 19.0226C2.03339 18.8864 2.15161 18.8318 2.3004 18.8318C2.90162 18.8318 3.99517 19.7266 4.46528 19.7266C4.57036 19.7266 4.64438 19.6819 4.67469 19.5727C4.87501 18.8541 1.62896 18.5519 1.90254 17.5109C1.95079 17.3268 2.08164 17.252 2.26554 17.2523C3.06 17.2523 4.84243 18.6495 5.21604 18.6495C5.24458 18.6495 5.26504 18.6411 5.27616 18.6234C5.46334 18.3213 5.36078 18.1104 4.0414 17.3119C2.72201 16.5131 1.79594 16.0327 2.32263 15.4592C2.38326 15.393 2.46915 15.3637 2.57347 15.3637C3.3745 15.364 5.26706 17.0863 5.26706 17.0863C5.26706 17.0863 5.77784 17.6175 6.08679 17.6175C6.15777 17.6175 6.21814 17.5895 6.25907 17.5203C6.47808 17.151 4.22479 15.4433 4.09773 14.7388C4.01159 14.2613 4.1581 14.0196 4.42915 14.0196Z",
+					"fill": "#FF9D0B"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M9.75883 20.2539C10.454 19.2344 10.4048 18.4692 9.4509 17.5159C8.49704 16.5628 7.9418 15.1684 7.9418 15.1684C7.9418 15.1684 7.73441 14.3585 7.26203 14.433C6.78964 14.5075 6.44281 15.7178 7.43228 16.4582C8.42176 17.1984 7.23525 17.7013 6.85456 17.0061C6.47388 16.3109 5.43438 14.5237 4.89531 14.1819C4.35649 13.8402 3.97707 14.0316 4.10414 14.7362C4.2312 15.4407 6.48474 17.1483 6.26547 17.5179C6.04621 17.8872 5.27347 17.0837 5.27347 17.0837C5.27347 17.0837 2.85548 14.8832 2.32903 15.4566C1.80258 16.03 2.72842 16.5105 4.0478 17.3093C5.36744 18.1078 5.46975 18.3187 5.28257 18.6208C5.09513 18.9229 2.18251 16.4673 1.90893 17.5083C1.63561 18.5493 4.88142 18.8514 4.6811 19.5701C4.48078 20.2891 2.3947 18.2098 1.96804 19.0199C1.54113 19.8303 4.91173 20.7824 4.93901 20.7895C6.02777 21.0719 8.79285 21.6703 9.75883 20.2539Z",
+					"fill": "#FFD21E"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M19.5568 13.0092C19.9658 13.0092 20.3313 13.1771 20.5862 13.4818C20.7439 13.6705 20.9086 13.9746 20.9219 14.4301C21.0935 14.3808 21.2584 14.3533 21.4125 14.3533C21.8041 14.3533 22.1577 14.5033 22.4078 14.7759C22.7291 15.1258 22.8718 15.5557 22.8097 15.9859C22.7802 16.1908 22.7117 16.3744 22.6094 16.5444C22.8251 16.719 22.984 16.962 23.0608 17.2543C23.1209 17.4834 23.1826 17.9606 22.8607 18.4522C22.8812 18.4842 22.9004 18.5176 22.9183 18.5517C23.1118 18.919 23.1242 19.334 22.9534 19.7205C22.6945 20.3063 22.0511 20.7678 20.8017 21.2632C20.0244 21.5714 19.3133 21.7684 19.307 21.7702C18.2794 22.0367 17.35 22.1721 16.5455 22.1721C15.0667 22.1721 14.008 21.7192 13.3987 20.8259C12.418 19.3876 12.5582 18.072 13.8271 16.8039C14.5294 16.1021 14.9962 15.0674 15.0935 14.8403C15.2895 14.1679 15.8078 13.4204 16.6695 13.4204C16.742 13.4204 16.8155 13.4262 16.8877 13.4376C17.2651 13.4969 17.5951 13.7142 17.8307 14.0411C18.0851 13.7248 18.3322 13.4732 18.5557 13.3312C18.8927 13.1175 19.2295 13.0092 19.5568 13.0092ZM19.5568 14.0196C19.428 14.0196 19.2706 14.0744 19.0971 14.1846C18.5583 14.5263 17.5185 16.3136 17.1378 17.0087C17.0103 17.2417 16.7923 17.3402 16.596 17.3402C16.2065 17.3402 15.9023 16.9529 16.5604 16.4608C17.5498 15.7204 17.2028 14.5102 16.7304 14.4356C16.7097 14.4324 16.6892 14.4308 16.6695 14.4308C16.2401 14.4308 16.0506 15.171 16.0506 15.171C16.0506 15.171 15.4954 16.5654 14.5415 17.5185C13.5876 18.4719 13.5384 19.237 14.2336 20.2566C14.7077 20.9517 15.6153 21.1617 16.5455 21.1617C17.5102 21.1617 18.4992 20.9358 19.0534 20.7921C19.0807 20.785 22.4513 19.8329 22.0243 19.0226C21.9526 18.8864 21.8344 18.8318 21.6856 18.8318C21.0844 18.8318 19.9908 19.7266 19.5207 19.7266C19.4156 19.7266 19.3416 19.6819 19.3113 19.5727C19.111 18.8541 22.357 18.5519 22.0835 17.5109C22.0352 17.3268 21.9043 17.252 21.7204 17.2523C20.926 17.2523 19.1436 18.6495 18.77 18.6495C18.7414 18.6495 18.7209 18.6411 18.7098 18.6234C18.5226 18.3213 18.6252 18.1104 19.9446 17.3119C21.264 16.5131 22.1901 16.0327 21.6634 15.4592C21.6027 15.393 21.5168 15.3637 21.4125 15.3637C20.6115 15.364 18.7189 17.0863 18.7189 17.0863C18.7189 17.0863 18.2081 17.6175 17.8992 17.6175C17.8282 17.6175 17.7678 17.5895 17.7269 17.5203C17.5079 17.151 19.7612 15.4433 19.8883 14.7388C19.9744 14.2613 19.8279 14.0196 19.5568 14.0196Z",
+					"fill": "#FF9D0B"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M14.2354 20.2539C13.5402 19.2344 13.5895 18.4692 14.5433 17.5159C15.4972 16.5628 16.0524 15.1684 16.0524 15.1684C16.0524 15.1684 16.2598 14.3585 16.7322 14.433C17.2046 14.5075 17.5514 15.7178 16.5619 16.4582C15.5724 17.1984 16.759 17.7013 17.1396 17.0061C17.5203 16.3109 18.5598 14.5237 19.0989 14.1819C19.6377 13.8402 20.0171 14.0316 19.8901 14.7362C19.763 15.4407 17.5095 17.1483 17.7287 17.5179C17.948 17.8872 18.7207 17.0837 18.7207 17.0837C18.7207 17.0837 21.1387 14.8832 21.6652 15.4566C22.1916 16.03 21.2658 16.5105 19.9464 17.3093C18.6268 18.1078 18.5245 18.3187 18.7116 18.6208C18.8991 18.9229 21.8117 16.4673 22.0853 17.5083C22.3586 18.5493 19.1128 18.8514 19.3131 19.5701C19.5134 20.2891 21.5995 18.2098 22.0262 19.0199C22.4531 19.8303 19.0825 20.7824 19.0552 20.7895C17.9664 21.0719 15.2014 21.6703 14.2354 20.2539Z",
+					"fill": "#FFD21E"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Huggingface"
+}
diff --git a/app/components/base/icons/src/public/llm/Huggingface.tsx b/app/components/base/icons/src/public/llm/Huggingface.tsx
new file mode 100644
index 0000000..1dcee18
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Huggingface.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Huggingface.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Huggingface'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/HuggingfaceText.json b/app/components/base/icons/src/public/llm/HuggingfaceText.json
new file mode 100644
index 0000000..d113e64
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/HuggingfaceText.json
@@ -0,0 +1,322 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "120",
+			"height": "24",
+			"viewBox": "0 0 120 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_8587_60377)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"clip-path": "url(#clip1_8587_60377)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M11.9286 20.2062C16.7767 20.2062 20.7069 16.2761 20.7069 11.428C20.7069 6.57993 16.7767 2.64978 11.9286 2.64978C7.08054 2.64978 3.15039 6.57993 3.15039 11.428C3.15039 16.2761 7.08054 20.2062 11.9286 20.2062Z",
+									"fill": "#FFD21E"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M20.7095 11.4326C20.7095 6.58451 16.7793 2.65436 11.9313 2.65436C7.08318 2.65436 3.15303 6.58451 3.15303 11.4326C3.15303 16.2807 7.08318 20.2108 11.9313 20.2108C16.7793 20.2108 20.7095 16.2807 20.7095 11.4326ZM2.14258 11.4326C2.14258 6.02647 6.52511 1.64392 11.9313 1.64392C17.3374 1.64392 21.7199 6.02647 21.7199 11.4326C21.7199 16.8387 17.3374 21.2213 11.9313 21.2213C6.52511 21.2213 2.14258 16.8387 2.14258 11.4326Z",
+									"fill": "#FF9D0B"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M14.7822 9.03703C15.1041 9.1507 15.2322 9.81254 15.5574 9.6396C16.1734 9.31212 16.4072 8.54734 16.0797 7.93142C15.7522 7.31553 14.9874 7.08172 14.3715 7.4092C13.7556 7.73669 13.5218 8.50147 13.8493 9.11738C14.0038 9.40809 14.4944 8.9354 14.7822 9.03703Z",
+									"fill": "#3A3B45"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M8.83422 9.03703C8.5123 9.1507 8.38422 9.81254 8.05901 9.6396C7.4431 9.31212 7.20928 8.54734 7.53676 7.93142C7.86425 7.31553 8.62903 7.08172 9.24494 7.4092C9.86086 7.73669 10.0947 8.50147 9.76719 9.11738C9.61262 9.40809 9.122 8.9354 8.83422 9.03703Z",
+									"fill": "#3A3B45"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M11.8679 15.1044C14.3507 15.1044 15.1519 12.8908 15.1519 11.7541C15.1519 11.1633 14.7547 11.3492 14.1187 11.6641C13.5309 11.9551 12.739 12.3563 11.8679 12.3563C10.0543 12.3563 8.58398 10.6173 8.58398 11.7541C8.58398 12.8908 9.38514 15.1044 11.8679 15.1044Z",
+									"fill": "#3A3B45"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "mask",
+								"attributes": {
+									"id": "mask0_8587_60377",
+									"style": "mask-type:alpha",
+									"maskUnits": "userSpaceOnUse",
+									"x": "8",
+									"y": "11",
+									"width": "8",
+									"height": "5"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M11.8562 15.1005C14.339 15.1005 15.1402 12.8869 15.1402 11.7502C15.1402 11.1594 14.743 11.3453 14.1069 11.6602C13.5191 11.9512 12.7273 12.3524 11.8562 12.3524C10.0425 12.3524 8.57227 10.6134 8.57227 11.7502C8.57227 12.8869 9.37342 15.1005 11.8562 15.1005Z",
+											"fill": "white"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"mask": "url(#mask0_8587_60377)"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M11.9194 17.6824C13.1294 17.6824 14.1103 16.7016 14.1103 15.4916C14.1103 14.5491 13.5152 13.7457 12.6803 13.4364C12.6496 13.425 12.6185 13.4143 12.5872 13.4043C12.3766 13.337 12.1523 14.0606 11.9194 14.0606C11.7018 14.0606 11.4917 13.3324 11.2933 13.3915C10.3884 13.6609 9.72852 14.4991 9.72852 15.4916C9.72852 16.7016 10.7094 17.6824 11.9194 17.6824Z",
+											"fill": "#F94040"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M17.8698 10.2273C18.3232 10.2273 18.6908 9.85972 18.6908 9.40631C18.6908 8.9529 18.3232 8.58533 17.8698 8.58533C17.4164 8.58533 17.0488 8.9529 17.0488 9.40631C17.0488 9.85972 17.4164 10.2273 17.8698 10.2273Z",
+									"fill": "#FF9D0B"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M6.11981 10.2273C6.57323 10.2273 6.9408 9.85972 6.9408 9.40631C6.9408 8.9529 6.57323 8.58533 6.11981 8.58533C5.66638 8.58533 5.29883 8.9529 5.29883 9.40631C5.29883 9.85972 5.66638 10.2273 6.11981 10.2273Z",
+									"fill": "#FF9D0B"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M4.42915 13.0092C4.02018 13.0092 3.65465 13.1771 3.39976 13.4818C3.24214 13.6705 3.07743 13.9746 3.06404 14.4301C2.89252 14.3808 2.72757 14.3533 2.57347 14.3533C2.18193 14.3533 1.82827 14.5033 1.57819 14.7759C1.25687 15.1258 1.11414 15.5557 1.17628 15.9859C1.20584 16.1908 1.2743 16.3744 1.3766 16.5444C1.16087 16.719 1.00198 16.962 0.925188 17.2543C0.865067 17.4834 0.803429 17.9606 1.12526 18.4522C1.10479 18.4842 1.0856 18.5176 1.06766 18.5517C0.874161 18.919 0.861783 19.334 1.03255 19.7205C1.29147 20.3063 1.93487 20.7678 3.18429 21.2632C3.96157 21.5714 4.67267 21.7684 4.67899 21.7702C5.70661 22.0367 6.63596 22.1721 7.44053 22.1721C8.91931 22.1721 9.97801 21.7192 10.5873 20.8259C11.5679 19.3876 11.4277 18.072 10.1589 16.8039C9.45662 16.1021 8.98979 15.0674 8.89254 14.8403C8.69651 14.1679 8.17815 13.4204 7.3165 13.4204C7.244 13.4204 7.17049 13.4262 7.09824 13.4376C6.72084 13.4969 6.39093 13.7142 6.15525 14.0411C5.90087 13.7248 5.65381 13.4732 5.43025 13.3312C5.09327 13.1175 4.75654 13.0092 4.42915 13.0092ZM4.42915 14.0196C4.55799 14.0196 4.71536 14.0744 4.88891 14.1846C5.42773 14.5263 6.46747 16.3136 6.84816 17.0087C6.97573 17.2417 7.19373 17.3402 7.39001 17.3402C7.77953 17.3402 8.08368 16.9529 7.42563 16.4608C6.43615 15.7204 6.78324 14.5102 7.25562 14.4356C7.27633 14.4324 7.29679 14.4308 7.3165 14.4308C7.74594 14.4308 7.93539 15.171 7.93539 15.171C7.93539 15.171 8.49063 16.5654 9.44449 17.5185C10.3984 18.4719 10.4476 19.237 9.75243 20.2566C9.27828 20.9517 8.37064 21.1617 7.44053 21.1617C6.47581 21.1617 5.48684 20.9358 4.93261 20.7921C4.90533 20.785 1.53474 19.8329 1.96165 19.0226C2.03339 18.8864 2.15161 18.8318 2.3004 18.8318C2.90162 18.8318 3.99517 19.7266 4.46528 19.7266C4.57036 19.7266 4.64438 19.6819 4.67469 19.5727C4.87501 18.8541 1.62896 18.5519 1.90254 17.5109C1.95079 17.3268 2.08164 17.252 2.26554 17.2523C3.06 17.2523 4.84243 18.6495 5.21604 18.6495C5.24458 18.6495 5.26504 18.6411 5.27616 18.6234C5.46334 18.3213 5.36078 18.1104 4.0414 17.3119C2.72201 16.5131 1.79594 16.0327 2.32263 15.4592C2.38326 15.393 2.46915 15.3637 2.57347 15.3637C3.3745 15.364 5.26706 17.0863 5.26706 17.0863C5.26706 17.0863 5.77784 17.6175 6.08679 17.6175C6.15777 17.6175 6.21814 17.5895 6.25907 17.5203C6.47808 17.151 4.22479 15.4433 4.09773 14.7388C4.01159 14.2613 4.1581 14.0196 4.42915 14.0196Z",
+									"fill": "#FF9D0B"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M9.75883 20.2539C10.454 19.2344 10.4048 18.4692 9.4509 17.5159C8.49704 16.5628 7.9418 15.1684 7.9418 15.1684C7.9418 15.1684 7.73441 14.3585 7.26203 14.433C6.78964 14.5075 6.44281 15.7178 7.43228 16.4582C8.42176 17.1984 7.23525 17.7013 6.85456 17.0061C6.47388 16.3109 5.43438 14.5237 4.89531 14.1819C4.35649 13.8402 3.97707 14.0316 4.10414 14.7362C4.2312 15.4407 6.48474 17.1483 6.26547 17.5179C6.04621 17.8872 5.27347 17.0837 5.27347 17.0837C5.27347 17.0837 2.85548 14.8832 2.32903 15.4566C1.80258 16.03 2.72842 16.5105 4.0478 17.3093C5.36744 18.1078 5.46975 18.3187 5.28257 18.6208C5.09513 18.9229 2.18251 16.4673 1.90893 17.5083C1.63561 18.5493 4.88142 18.8514 4.6811 19.5701C4.48078 20.2891 2.3947 18.2098 1.96804 19.0199C1.54113 19.8303 4.91173 20.7824 4.93901 20.7895C6.02777 21.0719 8.79285 21.6703 9.75883 20.2539Z",
+									"fill": "#FFD21E"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M19.5568 13.0092C19.9658 13.0092 20.3313 13.1771 20.5862 13.4818C20.7439 13.6705 20.9086 13.9746 20.9219 14.4301C21.0935 14.3808 21.2584 14.3533 21.4125 14.3533C21.8041 14.3533 22.1577 14.5033 22.4078 14.7759C22.7291 15.1258 22.8718 15.5557 22.8097 15.9859C22.7802 16.1908 22.7117 16.3744 22.6094 16.5444C22.8251 16.719 22.984 16.962 23.0608 17.2543C23.1209 17.4834 23.1826 17.9606 22.8607 18.4522C22.8812 18.4842 22.9004 18.5176 22.9183 18.5517C23.1118 18.919 23.1242 19.334 22.9534 19.7205C22.6945 20.3063 22.0511 20.7678 20.8017 21.2632C20.0244 21.5714 19.3133 21.7684 19.307 21.7702C18.2794 22.0367 17.35 22.1721 16.5455 22.1721C15.0667 22.1721 14.008 21.7192 13.3987 20.8259C12.418 19.3876 12.5582 18.072 13.8271 16.8039C14.5294 16.1021 14.9962 15.0674 15.0935 14.8403C15.2895 14.1679 15.8078 13.4204 16.6695 13.4204C16.742 13.4204 16.8155 13.4262 16.8877 13.4376C17.2651 13.4969 17.5951 13.7142 17.8307 14.0411C18.0851 13.7248 18.3322 13.4732 18.5557 13.3312C18.8927 13.1175 19.2295 13.0092 19.5568 13.0092ZM19.5568 14.0196C19.428 14.0196 19.2706 14.0744 19.0971 14.1846C18.5583 14.5263 17.5185 16.3136 17.1378 17.0087C17.0103 17.2417 16.7923 17.3402 16.596 17.3402C16.2065 17.3402 15.9023 16.9529 16.5604 16.4608C17.5498 15.7204 17.2028 14.5102 16.7304 14.4356C16.7097 14.4324 16.6892 14.4308 16.6695 14.4308C16.2401 14.4308 16.0506 15.171 16.0506 15.171C16.0506 15.171 15.4954 16.5654 14.5415 17.5185C13.5876 18.4719 13.5384 19.237 14.2336 20.2566C14.7077 20.9517 15.6153 21.1617 16.5455 21.1617C17.5102 21.1617 18.4992 20.9358 19.0534 20.7921C19.0807 20.785 22.4513 19.8329 22.0243 19.0226C21.9526 18.8864 21.8344 18.8318 21.6856 18.8318C21.0844 18.8318 19.9908 19.7266 19.5207 19.7266C19.4156 19.7266 19.3416 19.6819 19.3113 19.5727C19.111 18.8541 22.357 18.5519 22.0835 17.5109C22.0352 17.3268 21.9043 17.252 21.7204 17.2523C20.926 17.2523 19.1436 18.6495 18.77 18.6495C18.7414 18.6495 18.7209 18.6411 18.7098 18.6234C18.5226 18.3213 18.6252 18.1104 19.9446 17.3119C21.264 16.5131 22.1901 16.0327 21.6634 15.4592C21.6027 15.393 21.5168 15.3637 21.4125 15.3637C20.6115 15.364 18.7189 17.0863 18.7189 17.0863C18.7189 17.0863 18.2081 17.6175 17.8992 17.6175C17.8282 17.6175 17.7678 17.5895 17.7269 17.5203C17.5079 17.151 19.7612 15.4433 19.8883 14.7388C19.9744 14.2613 19.8279 14.0196 19.5568 14.0196Z",
+									"fill": "#FF9D0B"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M14.2354 20.2539C13.5402 19.2344 13.5895 18.4692 14.5433 17.5159C15.4972 16.5628 16.0524 15.1684 16.0524 15.1684C16.0524 15.1684 16.2598 14.3585 16.7322 14.433C17.2046 14.5075 17.5514 15.7178 16.5619 16.4582C15.5724 17.1984 16.759 17.7013 17.1396 17.0061C17.5203 16.3109 18.5598 14.5237 19.0989 14.1819C19.6377 13.8402 20.0171 14.0316 19.8901 14.7362C19.763 15.4407 17.5095 17.1483 17.7287 17.5179C17.948 17.8872 18.7207 17.0837 18.7207 17.0837C18.7207 17.0837 21.1387 14.8832 21.6652 15.4566C22.1916 16.03 21.2658 16.5105 19.9464 17.3093C18.6268 18.1078 18.5245 18.3187 18.7116 18.6208C18.8991 18.9229 21.8117 16.4673 22.0853 17.5083C22.3586 18.5493 19.1128 18.8514 19.3131 19.5701C19.5134 20.2891 21.5995 18.2098 22.0262 19.0199C22.4531 19.8303 19.0825 20.7824 19.0552 20.7895C17.9664 21.0719 15.2014 21.6703 14.2354 20.2539Z",
+									"fill": "#FFD21E"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M33.1528 17V7.22003H35.3578V10.985H38.7328V7.22003H40.9528V17H38.7328V12.92H35.3578V17H33.1528Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M45.3153 17.18C44.5053 17.18 43.9153 16.915 43.5453 16.385C43.1853 15.845 43.0053 15.11 43.0053 14.18V9.56003H45.2103V13.895C45.2103 14.425 45.2853 14.795 45.4353 15.005C45.5853 15.205 45.8203 15.305 46.1403 15.305C46.4203 15.305 46.6553 15.24 46.8453 15.11C47.0353 14.98 47.2403 14.77 47.4603 14.48V9.56003H49.6653V17H47.8653L47.7003 15.965H47.6553C47.3453 16.335 47.0053 16.63 46.6353 16.85C46.2653 17.07 45.8253 17.18 45.3153 17.18Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M54.2606 20.165C53.6806 20.165 53.1556 20.1 52.6856 19.97C52.2156 19.84 51.8406 19.635 51.5606 19.355C51.2806 19.075 51.1406 18.715 51.1406 18.275C51.1406 17.675 51.4956 17.175 52.2056 16.775V16.715C52.0156 16.585 51.8506 16.42 51.7106 16.22C51.5806 16.02 51.5156 15.765 51.5156 15.455C51.5156 15.185 51.5956 14.925 51.7556 14.675C51.9156 14.425 52.1156 14.22 52.3556 14.06V14C52.0956 13.82 51.8606 13.56 51.6506 13.22C51.4506 12.88 51.3506 12.495 51.3506 12.065C51.3506 11.465 51.4956 10.97 51.7856 10.58C52.0756 10.18 52.4556 9.88003 52.9256 9.68003C53.3956 9.48003 53.8956 9.38003 54.4256 9.38003C54.8656 9.38003 55.2506 9.44003 55.5806 9.56003H58.2956V11.165H57.1106C57.1806 11.275 57.2356 11.415 57.2756 11.585C57.3256 11.755 57.3506 11.94 57.3506 12.14C57.3506 12.71 57.2206 13.18 56.9606 13.55C56.7006 13.92 56.3506 14.195 55.9106 14.375C55.4706 14.555 54.9756 14.645 54.4256 14.645C54.1356 14.645 53.8356 14.595 53.5256 14.495C53.3456 14.645 53.2556 14.83 53.2556 15.05C53.2556 15.24 53.3406 15.38 53.5106 15.47C53.6806 15.56 53.9706 15.605 54.3806 15.605H55.5806C56.5006 15.605 57.2006 15.755 57.6806 16.055C58.1706 16.345 58.4156 16.825 58.4156 17.495C58.4156 18.005 58.2456 18.46 57.9056 18.86C57.5656 19.27 57.0856 19.59 56.4656 19.82C55.8456 20.05 55.1106 20.165 54.2606 20.165ZM54.4256 13.31C54.7156 13.31 54.9556 13.205 55.1456 12.995C55.3456 12.785 55.4456 12.475 55.4456 12.065C55.4456 11.675 55.3456 11.38 55.1456 11.18C54.9556 10.97 54.7156 10.865 54.4256 10.865C54.1356 10.865 53.8906 10.965 53.6906 11.165C53.5006 11.365 53.4056 11.665 53.4056 12.065C53.4056 12.475 53.5006 12.785 53.6906 12.995C53.8906 13.205 54.1356 13.31 54.4256 13.31ZM54.6056 18.785C55.1056 18.785 55.5156 18.695 55.8356 18.515C56.1556 18.335 56.3156 18.12 56.3156 17.87C56.3156 17.64 56.2156 17.485 56.0156 17.405C55.8256 17.325 55.5456 17.285 55.1756 17.285H54.4106C54.1606 17.285 53.9506 17.275 53.7806 17.255C53.6206 17.245 53.4806 17.225 53.3606 17.195C53.0906 17.435 52.9556 17.68 52.9556 17.93C52.9556 18.21 53.1056 18.42 53.4056 18.56C53.7156 18.71 54.1156 18.785 54.6056 18.785Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M62.2733 20.165C61.6933 20.165 61.1683 20.1 60.6983 19.97C60.2283 19.84 59.8533 19.635 59.5733 19.355C59.2933 19.075 59.1533 18.715 59.1533 18.275C59.1533 17.675 59.5083 17.175 60.2183 16.775V16.715C60.0283 16.585 59.8633 16.42 59.7233 16.22C59.5933 16.02 59.5283 15.765 59.5283 15.455C59.5283 15.185 59.6083 14.925 59.7683 14.675C59.9283 14.425 60.1283 14.22 60.3683 14.06V14C60.1083 13.82 59.8733 13.56 59.6633 13.22C59.4633 12.88 59.3633 12.495 59.3633 12.065C59.3633 11.465 59.5083 10.97 59.7983 10.58C60.0883 10.18 60.4683 9.88003 60.9383 9.68003C61.4083 9.48003 61.9083 9.38003 62.4383 9.38003C62.8783 9.38003 63.2633 9.44003 63.5933 9.56003H66.3083V11.165H65.1233C65.1933 11.275 65.2483 11.415 65.2883 11.585C65.3383 11.755 65.3633 11.94 65.3633 12.14C65.3633 12.71 65.2333 13.18 64.9733 13.55C64.7133 13.92 64.3633 14.195 63.9233 14.375C63.4833 14.555 62.9883 14.645 62.4383 14.645C62.1483 14.645 61.8483 14.595 61.5383 14.495C61.3583 14.645 61.2683 14.83 61.2683 15.05C61.2683 15.24 61.3533 15.38 61.5233 15.47C61.6933 15.56 61.9833 15.605 62.3933 15.605H63.5933C64.5133 15.605 65.2133 15.755 65.6933 16.055C66.1833 16.345 66.4283 16.825 66.4283 17.495C66.4283 18.005 66.2583 18.46 65.9183 18.86C65.5783 19.27 65.0983 19.59 64.4783 19.82C63.8583 20.05 63.1233 20.165 62.2733 20.165ZM62.4383 13.31C62.7283 13.31 62.9683 13.205 63.1583 12.995C63.3583 12.785 63.4583 12.475 63.4583 12.065C63.4583 11.675 63.3583 11.38 63.1583 11.18C62.9683 10.97 62.7283 10.865 62.4383 10.865C62.1483 10.865 61.9033 10.965 61.7033 11.165C61.5133 11.365 61.4183 11.665 61.4183 12.065C61.4183 12.475 61.5133 12.785 61.7033 12.995C61.9033 13.205 62.1483 13.31 62.4383 13.31ZM62.6183 18.785C63.1183 18.785 63.5283 18.695 63.8483 18.515C64.1683 18.335 64.3283 18.12 64.3283 17.87C64.3283 17.64 64.2283 17.485 64.0283 17.405C63.8383 17.325 63.5583 17.285 63.1883 17.285H62.4233C62.1733 17.285 61.9633 17.275 61.7933 17.255C61.6333 17.245 61.4933 17.225 61.3733 17.195C61.1033 17.435 60.9683 17.68 60.9683 17.93C60.9683 18.21 61.1183 18.42 61.4183 18.56C61.7283 18.71 62.1283 18.785 62.6183 18.785Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M67.631 17V9.56003H69.836V17H67.631ZM68.726 8.46503C68.356 8.46503 68.056 8.36003 67.826 8.15003C67.596 7.94003 67.481 7.66003 67.481 7.31003C67.481 6.96003 67.596 6.68003 67.826 6.47003C68.056 6.26003 68.356 6.15503 68.726 6.15503C69.096 6.15503 69.396 6.26003 69.626 6.47003C69.856 6.68003 69.971 6.96003 69.971 7.31003C69.971 7.66003 69.856 7.94003 69.626 8.15003C69.396 8.36003 69.096 8.46503 68.726 8.46503Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M71.7765 17V9.56003H73.5765L73.7265 10.505H73.7865C74.1065 10.205 74.4565 9.94503 74.8365 9.72503C75.2265 9.49503 75.6715 9.38003 76.1715 9.38003C76.9815 9.38003 77.5665 9.65003 77.9265 10.19C78.2965 10.72 78.4815 11.45 78.4815 12.38V17H76.2765V12.665C76.2765 12.125 76.2015 11.755 76.0515 11.555C75.9115 11.355 75.6815 11.255 75.3615 11.255C75.0815 11.255 74.8415 11.32 74.6415 11.45C74.4415 11.57 74.2215 11.745 73.9815 11.975V17H71.7765Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M83.0155 20.165C82.4355 20.165 81.9105 20.1 81.4405 19.97C80.9705 19.84 80.5955 19.635 80.3155 19.355C80.0355 19.075 79.8955 18.715 79.8955 18.275C79.8955 17.675 80.2505 17.175 80.9605 16.775V16.715C80.7705 16.585 80.6055 16.42 80.4655 16.22C80.3355 16.02 80.2705 15.765 80.2705 15.455C80.2705 15.185 80.3505 14.925 80.5105 14.675C80.6705 14.425 80.8705 14.22 81.1105 14.06V14C80.8505 13.82 80.6155 13.56 80.4055 13.22C80.2055 12.88 80.1055 12.495 80.1055 12.065C80.1055 11.465 80.2505 10.97 80.5405 10.58C80.8305 10.18 81.2105 9.88003 81.6805 9.68003C82.1505 9.48003 82.6505 9.38003 83.1805 9.38003C83.6205 9.38003 84.0055 9.44003 84.3355 9.56003H87.0505V11.165H85.8655C85.9355 11.275 85.9905 11.415 86.0305 11.585C86.0805 11.755 86.1055 11.94 86.1055 12.14C86.1055 12.71 85.9755 13.18 85.7155 13.55C85.4555 13.92 85.1055 14.195 84.6655 14.375C84.2255 14.555 83.7305 14.645 83.1805 14.645C82.8905 14.645 82.5905 14.595 82.2805 14.495C82.1005 14.645 82.0105 14.83 82.0105 15.05C82.0105 15.24 82.0955 15.38 82.2655 15.47C82.4355 15.56 82.7255 15.605 83.1355 15.605H84.3355C85.2555 15.605 85.9555 15.755 86.4355 16.055C86.9255 16.345 87.1705 16.825 87.1705 17.495C87.1705 18.005 87.0005 18.46 86.6605 18.86C86.3205 19.27 85.8405 19.59 85.2205 19.82C84.6005 20.05 83.8655 20.165 83.0155 20.165ZM83.1805 13.31C83.4705 13.31 83.7105 13.205 83.9005 12.995C84.1005 12.785 84.2005 12.475 84.2005 12.065C84.2005 11.675 84.1005 11.38 83.9005 11.18C83.7105 10.97 83.4705 10.865 83.1805 10.865C82.8905 10.865 82.6455 10.965 82.4455 11.165C82.2555 11.365 82.1605 11.665 82.1605 12.065C82.1605 12.475 82.2555 12.785 82.4455 12.995C82.6455 13.205 82.8905 13.31 83.1805 13.31ZM83.3605 18.785C83.8605 18.785 84.2705 18.695 84.5905 18.515C84.9105 18.335 85.0705 18.12 85.0705 17.87C85.0705 17.64 84.9705 17.485 84.7705 17.405C84.5805 17.325 84.3005 17.285 83.9305 17.285H83.1655C82.9155 17.285 82.7055 17.275 82.5355 17.255C82.3755 17.245 82.2355 17.225 82.1155 17.195C81.8455 17.435 81.7105 17.68 81.7105 17.93C81.7105 18.21 81.8605 18.42 82.1605 18.56C82.4705 18.71 82.8705 18.785 83.3605 18.785Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M91.5562 17V7.22003H97.7212V9.08003H93.7612V11.345H97.1512V13.205H93.7612V17H91.5562Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M100.546 17.18C99.8661 17.18 99.3261 16.965 98.9261 16.535C98.5261 16.095 98.3261 15.56 98.3261 14.93C98.3261 14.15 98.6561 13.54 99.3161 13.1C99.9761 12.66 101.041 12.365 102.511 12.215C102.491 11.885 102.391 11.625 102.211 11.435C102.041 11.235 101.751 11.135 101.341 11.135C101.031 11.135 100.716 11.195 100.396 11.315C100.076 11.435 99.7361 11.6 99.3761 11.81L98.5811 10.355C99.0511 10.065 99.5511 9.83003 100.081 9.65003C100.621 9.47003 101.181 9.38003 101.761 9.38003C102.711 9.38003 103.441 9.65503 103.951 10.205C104.461 10.755 104.716 11.6 104.716 12.74V17H102.916L102.766 16.235H102.706C102.396 16.515 102.061 16.745 101.701 16.925C101.351 17.095 100.966 17.18 100.546 17.18ZM101.296 15.47C101.546 15.47 101.761 15.415 101.941 15.305C102.131 15.185 102.321 15.03 102.511 14.84V13.535C101.731 13.635 101.191 13.795 100.891 14.015C100.591 14.225 100.441 14.475 100.441 14.765C100.441 15.005 100.516 15.185 100.666 15.305C100.826 15.415 101.036 15.47 101.296 15.47Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M109.821 17.18C109.131 17.18 108.506 17.03 107.946 16.73C107.396 16.42 106.956 15.975 106.626 15.395C106.306 14.805 106.146 14.1 106.146 13.28C106.146 12.45 106.326 11.745 106.686 11.165C107.046 10.585 107.521 10.145 108.111 9.84503C108.701 9.53503 109.336 9.38003 110.016 9.38003C110.476 9.38003 110.881 9.45503 111.231 9.60503C111.591 9.75503 111.911 9.94503 112.191 10.175L111.156 11.6C110.806 11.31 110.471 11.165 110.151 11.165C109.621 11.165 109.196 11.355 108.876 11.735C108.566 12.115 108.411 12.63 108.411 13.28C108.411 13.92 108.566 14.435 108.876 14.825C109.196 15.205 109.596 15.395 110.076 15.395C110.316 15.395 110.551 15.345 110.781 15.245C111.011 15.135 111.221 15.005 111.411 14.855L112.281 16.295C111.911 16.615 111.511 16.845 111.081 16.985C110.651 17.115 110.231 17.18 109.821 17.18Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M116.488 17.18C115.778 17.18 115.138 17.025 114.568 16.715C113.998 16.405 113.548 15.96 113.218 15.38C112.888 14.8 112.723 14.1 112.723 13.28C112.723 12.47 112.888 11.775 113.218 11.195C113.558 10.615 113.998 10.17 114.538 9.86003C115.078 9.54003 115.643 9.38003 116.233 9.38003C116.943 9.38003 117.528 9.54003 117.988 9.86003C118.458 10.17 118.808 10.595 119.038 11.135C119.278 11.665 119.398 12.27 119.398 12.95C119.398 13.14 119.388 13.33 119.368 13.52C119.348 13.7 119.328 13.835 119.308 13.925H114.853C114.953 14.465 115.178 14.865 115.528 15.125C115.878 15.375 116.298 15.5 116.788 15.5C117.318 15.5 117.853 15.335 118.393 15.005L119.128 16.34C118.748 16.6 118.323 16.805 117.853 16.955C117.383 17.105 116.928 17.18 116.488 17.18ZM114.838 12.47H117.523C117.523 12.06 117.423 11.725 117.223 11.465C117.033 11.195 116.718 11.06 116.278 11.06C115.938 11.06 115.633 11.18 115.363 11.42C115.093 11.65 114.918 12 114.838 12.47Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_8587_60377"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "119.998",
+									"height": "24",
+									"rx": "6",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip1_8587_60377"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "23.998",
+									"height": "22.2298",
+									"fill": "white",
+									"transform": "translate(0 0.885132)"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "HuggingfaceText"
+}
diff --git a/app/components/base/icons/src/public/llm/HuggingfaceText.tsx b/app/components/base/icons/src/public/llm/HuggingfaceText.tsx
new file mode 100644
index 0000000..961d63e
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/HuggingfaceText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './HuggingfaceText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'HuggingfaceText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/HuggingfaceTextHub.json b/app/components/base/icons/src/public/llm/HuggingfaceTextHub.json
new file mode 100644
index 0000000..0500abf
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/HuggingfaceTextHub.json
@@ -0,0 +1,350 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "151",
+			"height": "24",
+			"viewBox": "0 0 151 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_8587_60397)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"clip-path": "url(#clip1_8587_60397)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M12.9267 20.2062C17.7747 20.2062 21.7049 16.2761 21.7049 11.428C21.7049 6.57993 17.7747 2.64978 12.9267 2.64978C8.07858 2.64978 4.14844 6.57993 4.14844 11.428C4.14844 16.2761 8.07858 20.2062 12.9267 20.2062Z",
+									"fill": "#FFD21E"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M21.7075 11.4326C21.7075 6.58451 17.7774 2.65436 12.9293 2.65436C8.08123 2.65436 4.15108 6.58451 4.15108 11.4326C4.15108 16.2807 8.08123 20.2108 12.9293 20.2108C17.7774 20.2108 21.7075 16.2807 21.7075 11.4326ZM3.14062 11.4326C3.14062 6.02647 7.52316 1.64392 12.9293 1.64392C18.3354 1.64392 22.718 6.02647 22.718 11.4326C22.718 16.8387 18.3354 21.2213 12.9293 21.2213C7.52316 21.2213 3.14062 16.8387 3.14062 11.4326Z",
+									"fill": "#FF9D0B"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M15.7803 9.03703C16.1022 9.1507 16.2303 9.81254 16.5555 9.6396C17.1714 9.31212 17.4052 8.54734 17.0777 7.93142C16.7503 7.31553 15.9855 7.08172 15.3696 7.4092C14.7536 7.73669 14.5198 8.50147 14.8473 9.11738C15.0019 9.40809 15.4925 8.9354 15.7803 9.03703Z",
+									"fill": "#3A3B45"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M9.83227 9.03703C9.51034 9.1507 9.38227 9.81254 9.05706 9.6396C8.44114 9.31212 8.20733 8.54734 8.53481 7.93142C8.8623 7.31553 9.62708 7.08172 10.243 7.4092C10.8589 7.73669 11.0927 8.50147 10.7652 9.11738C10.6107 9.40809 10.12 8.9354 9.83227 9.03703Z",
+									"fill": "#3A3B45"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M12.866 15.1044C15.3487 15.1044 16.1499 12.8908 16.1499 11.7541C16.1499 11.1633 15.7528 11.3492 15.1167 11.6641C14.5289 11.9551 13.7371 12.3563 12.866 12.3563C11.0523 12.3563 9.58203 10.6173 9.58203 11.7541C9.58203 12.8908 10.3832 15.1044 12.866 15.1044Z",
+									"fill": "#3A3B45"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "mask",
+								"attributes": {
+									"id": "mask0_8587_60397",
+									"style": "mask-type:alpha",
+									"maskUnits": "userSpaceOnUse",
+									"x": "9",
+									"y": "11",
+									"width": "8",
+									"height": "5"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M12.8543 15.1005C15.337 15.1005 16.1382 12.8869 16.1382 11.7502C16.1382 11.1594 15.7411 11.3453 15.105 11.6602C14.5172 11.9512 13.7253 12.3524 12.8543 12.3524C11.0406 12.3524 9.57031 10.6134 9.57031 11.7502C9.57031 12.8869 10.3715 15.1005 12.8543 15.1005Z",
+											"fill": "white"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"mask": "url(#mask0_8587_60397)"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M12.9175 17.6824C14.1274 17.6824 15.1083 16.7016 15.1083 15.4916C15.1083 14.5491 14.5133 13.7457 13.6783 13.4364C13.6476 13.425 13.6166 13.4143 13.5852 13.4043C13.3747 13.337 13.1503 14.0606 12.9175 14.0606C12.6999 14.0606 12.4897 13.3324 12.2913 13.3915C11.3864 13.6609 10.7266 14.4991 10.7266 15.4916C10.7266 16.7016 11.7075 17.6824 12.9175 17.6824Z",
+											"fill": "#F94040"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M18.8679 10.2273C19.3213 10.2273 19.6888 9.85972 19.6888 9.40631C19.6888 8.9529 19.3213 8.58533 18.8679 8.58533C18.4144 8.58533 18.0469 8.9529 18.0469 9.40631C18.0469 9.85972 18.4144 10.2273 18.8679 10.2273Z",
+									"fill": "#FF9D0B"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M7.11786 10.2273C7.57127 10.2273 7.93885 9.85972 7.93885 9.40631C7.93885 8.9529 7.57127 8.58533 7.11786 8.58533C6.66442 8.58533 6.29688 8.9529 6.29688 9.40631C6.29688 9.85972 6.66442 10.2273 7.11786 10.2273Z",
+									"fill": "#FF9D0B"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M5.4272 13.0092C5.01822 13.0092 4.6527 13.1771 4.39781 13.4818C4.24018 13.6705 4.07548 13.9746 4.06209 14.4301C3.89057 14.3808 3.72561 14.3533 3.57152 14.3533C3.17997 14.3533 2.82632 14.5033 2.57623 14.7759C2.25491 15.1258 2.11219 15.5557 2.17433 15.9859C2.20389 16.1908 2.27234 16.3744 2.37465 16.5444C2.15892 16.719 2.00003 16.962 1.92323 17.2543C1.86311 17.4834 1.80148 17.9606 2.1233 18.4522C2.10284 18.4842 2.08364 18.5176 2.06571 18.5517C1.87221 18.919 1.85983 19.334 2.03059 19.7205C2.28952 20.3063 2.93292 20.7678 4.18233 21.2632C4.95962 21.5714 5.67072 21.7684 5.67703 21.7702C6.70465 22.0367 7.63401 22.1721 8.43858 22.1721C9.91736 22.1721 10.9761 21.7192 11.5854 20.8259C12.566 19.3876 12.4258 18.072 11.1569 16.8039C10.4547 16.1021 9.98784 15.0674 9.89058 14.8403C9.69456 14.1679 9.1762 13.4204 8.31454 13.4204C8.24205 13.4204 8.16854 13.4262 8.09629 13.4376C7.71889 13.4969 7.38898 13.7142 7.15329 14.0411C6.89891 13.7248 6.65186 13.4732 6.4283 13.3312C6.09132 13.1175 5.75459 13.0092 5.4272 13.0092ZM5.4272 14.0196C5.55603 14.0196 5.71341 14.0744 5.88695 14.1846C6.42577 14.5263 7.46552 16.3136 7.8462 17.0087C7.97377 17.2417 8.19178 17.3402 8.38805 17.3402C8.77758 17.3402 9.08172 16.9529 8.42367 16.4608C7.4342 15.7204 7.78128 14.5102 8.25366 14.4356C8.27438 14.4324 8.29484 14.4308 8.31454 14.4308C8.74398 14.4308 8.93344 15.171 8.93344 15.171C8.93344 15.171 9.48868 16.5654 10.4425 17.5185C11.3964 18.4719 11.4457 19.237 10.7505 20.2566C10.2763 20.9517 9.36869 21.1617 8.43858 21.1617C7.47386 21.1617 6.48488 20.9358 5.93066 20.7921C5.90337 20.785 2.53279 19.8329 2.9597 19.0226C3.03144 18.8864 3.14966 18.8318 3.29845 18.8318C3.89966 18.8318 4.99322 19.7266 5.46332 19.7266C5.56841 19.7266 5.64243 19.6819 5.67274 19.5727C5.87306 18.8541 2.62701 18.5519 2.90059 17.5109C2.94884 17.3268 3.07969 17.252 3.26359 17.2523C4.05805 17.2523 5.84047 18.6495 6.21408 18.6495C6.24263 18.6495 6.26309 18.6411 6.27421 18.6234C6.46139 18.3213 6.35883 18.1104 5.03944 17.3119C3.72006 16.5131 2.79398 16.0327 3.32068 15.4592C3.38131 15.393 3.46719 15.3637 3.57152 15.3637C4.37255 15.364 6.26511 17.0863 6.26511 17.0863C6.26511 17.0863 6.77589 17.6175 7.08483 17.6175C7.15582 17.6175 7.21619 17.5895 7.25711 17.5203C7.47613 17.151 5.22284 15.4433 5.09578 14.7388C5.00964 14.2613 5.15615 14.0196 5.4272 14.0196Z",
+									"fill": "#FF9D0B"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M10.7569 20.2539C11.4521 19.2344 11.4028 18.4692 10.4489 17.5159C9.49509 16.5628 8.93985 15.1684 8.93985 15.1684C8.93985 15.1684 8.73245 14.3585 8.26007 14.433C7.78769 14.5075 7.44085 15.7178 8.43033 16.4582C9.41981 17.1984 8.2333 17.7013 7.85261 17.0061C7.47193 16.3109 6.43243 14.5237 5.89336 14.1819C5.35454 13.8402 4.97512 14.0316 5.10218 14.7362C5.22925 15.4407 7.48279 17.1483 7.26352 17.5179C7.04426 17.8872 6.27152 17.0837 6.27152 17.0837C6.27152 17.0837 3.85353 14.8832 3.32707 15.4566C2.80063 16.03 3.72646 16.5105 5.04585 17.3093C6.36549 18.1078 6.4678 18.3187 6.28061 18.6208C6.09317 18.9229 3.18056 16.4673 2.90698 17.5083C2.63365 18.5493 5.87947 18.8514 5.67915 19.5701C5.47883 20.2891 3.39275 18.2098 2.96609 19.0199C2.53918 19.8303 5.90978 20.7824 5.93706 20.7895C7.02582 21.0719 9.79089 21.6703 10.7569 20.2539Z",
+									"fill": "#FFD21E"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M20.5549 13.0092C20.9639 13.0092 21.3294 13.1771 21.5843 13.4818C21.7419 13.6705 21.9066 13.9746 21.92 14.4301C22.0915 14.3808 22.2565 14.3533 22.4106 14.3533C22.8021 14.3533 23.1558 14.5033 23.4058 14.7759C23.7272 15.1258 23.8699 15.5557 23.8078 15.9859C23.7782 16.1908 23.7097 16.3744 23.6074 16.5444C23.8232 16.719 23.9821 16.962 24.0588 17.2543C24.119 17.4834 24.1806 17.9606 23.8588 18.4522C23.8792 18.4842 23.8984 18.5176 23.9164 18.5517C24.1099 18.919 24.1223 19.334 23.9515 19.7205C23.6926 20.3063 23.0492 20.7678 21.7997 21.2632C21.0225 21.5714 20.3114 21.7684 20.305 21.7702C19.2774 22.0367 18.3481 22.1721 17.5435 22.1721C16.0647 22.1721 15.006 21.7192 14.3967 20.8259C13.4161 19.3876 13.5563 18.072 14.8252 16.8039C15.5274 16.1021 15.9942 15.0674 16.0915 14.8403C16.2875 14.1679 16.8059 13.4204 17.6675 13.4204C17.74 13.4204 17.8135 13.4262 17.8858 13.4376C18.2632 13.4969 18.5931 13.7142 18.8288 14.0411C19.0832 13.7248 19.3302 13.4732 19.5538 13.3312C19.8908 13.1175 20.2275 13.0092 20.5549 13.0092ZM20.5549 14.0196C20.4261 14.0196 20.2687 14.0744 20.0951 14.1846C19.5563 14.5263 18.5166 16.3136 18.1359 17.0087C18.0083 17.2417 17.7903 17.3402 17.594 17.3402C17.2045 17.3402 16.9004 16.9529 17.5584 16.4608C18.5479 15.7204 18.2008 14.5102 17.7284 14.4356C17.7077 14.4324 17.6872 14.4308 17.6675 14.4308C17.2381 14.4308 17.0486 15.171 17.0486 15.171C17.0486 15.171 16.4934 16.5654 15.5395 17.5185C14.5857 18.4719 14.5364 19.237 15.2316 20.2566C15.7058 20.9517 16.6134 21.1617 17.5435 21.1617C18.5082 21.1617 19.4972 20.9358 20.0514 20.7921C20.0787 20.785 23.4493 19.8329 23.0224 19.0226C22.9506 18.8864 22.8324 18.8318 22.6836 18.8318C22.0824 18.8318 20.9889 19.7266 20.5188 19.7266C20.4137 19.7266 20.3397 19.6819 20.3093 19.5727C20.109 18.8541 23.3551 18.5519 23.0815 17.5109C23.0332 17.3268 22.9024 17.252 22.7185 17.2523C21.924 17.2523 20.1416 18.6495 19.768 18.6495C19.7395 18.6495 19.719 18.6411 19.7079 18.6234C19.5207 18.3213 19.6233 18.1104 20.9426 17.3119C22.262 16.5131 23.1881 16.0327 22.6614 15.4592C22.6008 15.393 22.5149 15.3637 22.4106 15.3637C21.6095 15.364 19.717 17.0863 19.717 17.0863C19.717 17.0863 19.2062 17.6175 18.8972 17.6175C18.8263 17.6175 18.7659 17.5895 18.725 17.5203C18.506 17.151 20.7592 15.4433 20.8863 14.7388C20.9724 14.2613 20.8259 14.0196 20.5549 14.0196Z",
+									"fill": "#FF9D0B"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M15.2334 20.2539C14.5382 19.2344 14.5875 18.4692 15.5414 17.5159C16.4952 16.5628 17.0505 15.1684 17.0505 15.1684C17.0505 15.1684 17.2578 14.3585 17.7302 14.433C18.2026 14.5075 18.5494 15.7178 17.56 16.4582C16.5705 17.1984 17.757 17.7013 18.1377 17.0061C18.5184 16.3109 19.5579 14.5237 20.0969 14.1819C20.6358 13.8402 21.0152 14.0316 20.8881 14.7362C20.7611 15.4407 18.5075 17.1483 18.7268 17.5179C18.946 17.8872 19.7188 17.0837 19.7188 17.0837C19.7188 17.0837 22.1368 14.8832 22.6632 15.4566C23.1897 16.03 22.2638 16.5105 20.9445 17.3093C19.6248 18.1078 19.5225 18.3187 19.7097 18.6208C19.8971 18.9229 22.8097 16.4673 23.0833 17.5083C23.3566 18.5493 20.1108 18.8514 20.3112 19.5701C20.5115 20.2891 22.5975 18.2098 23.0242 19.0199C23.4511 19.8303 20.0805 20.7824 20.0532 20.7895C18.9645 21.0719 16.1994 21.6703 15.2334 20.2539Z",
+									"fill": "#FFD21E"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M34.1509 17V7.22003H36.3559V10.985H39.7309V7.22003H41.9509V17H39.7309V12.92H36.3559V17H34.1509Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M46.3133 17.18C45.5033 17.18 44.9133 16.915 44.5433 16.385C44.1833 15.845 44.0033 15.11 44.0033 14.18V9.56003H46.2083V13.895C46.2083 14.425 46.2833 14.795 46.4333 15.005C46.5833 15.205 46.8183 15.305 47.1383 15.305C47.4183 15.305 47.6533 15.24 47.8433 15.11C48.0333 14.98 48.2383 14.77 48.4583 14.48V9.56003H50.6633V17H48.8633L48.6983 15.965H48.6533C48.3433 16.335 48.0033 16.63 47.6333 16.85C47.2633 17.07 46.8233 17.18 46.3133 17.18Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M55.2587 20.165C54.6787 20.165 54.1537 20.1 53.6837 19.97C53.2137 19.84 52.8387 19.635 52.5587 19.355C52.2787 19.075 52.1387 18.715 52.1387 18.275C52.1387 17.675 52.4937 17.175 53.2037 16.775V16.715C53.0137 16.585 52.8487 16.42 52.7087 16.22C52.5787 16.02 52.5137 15.765 52.5137 15.455C52.5137 15.185 52.5937 14.925 52.7537 14.675C52.9137 14.425 53.1137 14.22 53.3537 14.06V14C53.0937 13.82 52.8587 13.56 52.6487 13.22C52.4487 12.88 52.3487 12.495 52.3487 12.065C52.3487 11.465 52.4937 10.97 52.7837 10.58C53.0737 10.18 53.4537 9.88003 53.9237 9.68003C54.3937 9.48003 54.8937 9.38003 55.4237 9.38003C55.8637 9.38003 56.2487 9.44003 56.5787 9.56003H59.2937V11.165H58.1087C58.1787 11.275 58.2337 11.415 58.2737 11.585C58.3237 11.755 58.3487 11.94 58.3487 12.14C58.3487 12.71 58.2187 13.18 57.9587 13.55C57.6987 13.92 57.3487 14.195 56.9087 14.375C56.4687 14.555 55.9737 14.645 55.4237 14.645C55.1337 14.645 54.8337 14.595 54.5237 14.495C54.3437 14.645 54.2537 14.83 54.2537 15.05C54.2537 15.24 54.3387 15.38 54.5087 15.47C54.6787 15.56 54.9687 15.605 55.3787 15.605H56.5787C57.4987 15.605 58.1987 15.755 58.6787 16.055C59.1687 16.345 59.4137 16.825 59.4137 17.495C59.4137 18.005 59.2437 18.46 58.9037 18.86C58.5637 19.27 58.0837 19.59 57.4637 19.82C56.8437 20.05 56.1087 20.165 55.2587 20.165ZM55.4237 13.31C55.7137 13.31 55.9537 13.205 56.1437 12.995C56.3437 12.785 56.4437 12.475 56.4437 12.065C56.4437 11.675 56.3437 11.38 56.1437 11.18C55.9537 10.97 55.7137 10.865 55.4237 10.865C55.1337 10.865 54.8887 10.965 54.6887 11.165C54.4987 11.365 54.4037 11.665 54.4037 12.065C54.4037 12.475 54.4987 12.785 54.6887 12.995C54.8887 13.205 55.1337 13.31 55.4237 13.31ZM55.6037 18.785C56.1037 18.785 56.5137 18.695 56.8337 18.515C57.1537 18.335 57.3137 18.12 57.3137 17.87C57.3137 17.64 57.2137 17.485 57.0137 17.405C56.8237 17.325 56.5437 17.285 56.1737 17.285H55.4087C55.1587 17.285 54.9487 17.275 54.7787 17.255C54.6187 17.245 54.4787 17.225 54.3587 17.195C54.0887 17.435 53.9537 17.68 53.9537 17.93C53.9537 18.21 54.1037 18.42 54.4037 18.56C54.7137 18.71 55.1137 18.785 55.6037 18.785Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M63.2714 20.165C62.6914 20.165 62.1664 20.1 61.6964 19.97C61.2264 19.84 60.8514 19.635 60.5714 19.355C60.2914 19.075 60.1514 18.715 60.1514 18.275C60.1514 17.675 60.5064 17.175 61.2164 16.775V16.715C61.0264 16.585 60.8614 16.42 60.7214 16.22C60.5914 16.02 60.5264 15.765 60.5264 15.455C60.5264 15.185 60.6064 14.925 60.7664 14.675C60.9264 14.425 61.1264 14.22 61.3664 14.06V14C61.1064 13.82 60.8714 13.56 60.6614 13.22C60.4614 12.88 60.3614 12.495 60.3614 12.065C60.3614 11.465 60.5064 10.97 60.7964 10.58C61.0864 10.18 61.4664 9.88003 61.9364 9.68003C62.4064 9.48003 62.9064 9.38003 63.4364 9.38003C63.8764 9.38003 64.2614 9.44003 64.5914 9.56003H67.3064V11.165H66.1214C66.1914 11.275 66.2464 11.415 66.2864 11.585C66.3364 11.755 66.3614 11.94 66.3614 12.14C66.3614 12.71 66.2314 13.18 65.9714 13.55C65.7114 13.92 65.3614 14.195 64.9214 14.375C64.4814 14.555 63.9864 14.645 63.4364 14.645C63.1464 14.645 62.8464 14.595 62.5364 14.495C62.3564 14.645 62.2664 14.83 62.2664 15.05C62.2664 15.24 62.3514 15.38 62.5214 15.47C62.6914 15.56 62.9814 15.605 63.3914 15.605H64.5914C65.5114 15.605 66.2114 15.755 66.6914 16.055C67.1814 16.345 67.4264 16.825 67.4264 17.495C67.4264 18.005 67.2564 18.46 66.9164 18.86C66.5764 19.27 66.0964 19.59 65.4764 19.82C64.8564 20.05 64.1214 20.165 63.2714 20.165ZM63.4364 13.31C63.7264 13.31 63.9664 13.205 64.1564 12.995C64.3564 12.785 64.4564 12.475 64.4564 12.065C64.4564 11.675 64.3564 11.38 64.1564 11.18C63.9664 10.97 63.7264 10.865 63.4364 10.865C63.1464 10.865 62.9014 10.965 62.7014 11.165C62.5114 11.365 62.4164 11.665 62.4164 12.065C62.4164 12.475 62.5114 12.785 62.7014 12.995C62.9014 13.205 63.1464 13.31 63.4364 13.31ZM63.6164 18.785C64.1164 18.785 64.5264 18.695 64.8464 18.515C65.1664 18.335 65.3264 18.12 65.3264 17.87C65.3264 17.64 65.2264 17.485 65.0264 17.405C64.8364 17.325 64.5564 17.285 64.1864 17.285H63.4214C63.1714 17.285 62.9614 17.275 62.7914 17.255C62.6314 17.245 62.4914 17.225 62.3714 17.195C62.1014 17.435 61.9664 17.68 61.9664 17.93C61.9664 18.21 62.1164 18.42 62.4164 18.56C62.7264 18.71 63.1264 18.785 63.6164 18.785Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M68.6291 17V9.56003H70.8341V17H68.6291ZM69.7241 8.46503C69.3541 8.46503 69.0541 8.36003 68.8241 8.15003C68.5941 7.94003 68.4791 7.66003 68.4791 7.31003C68.4791 6.96003 68.5941 6.68003 68.8241 6.47003C69.0541 6.26003 69.3541 6.15503 69.7241 6.15503C70.0941 6.15503 70.3941 6.26003 70.6241 6.47003C70.8541 6.68003 70.9691 6.96003 70.9691 7.31003C70.9691 7.66003 70.8541 7.94003 70.6241 8.15003C70.3941 8.36003 70.0941 8.46503 69.7241 8.46503Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M72.7746 17V9.56003H74.5746L74.7246 10.505H74.7846C75.1046 10.205 75.4546 9.94503 75.8346 9.72503C76.2246 9.49503 76.6696 9.38003 77.1696 9.38003C77.9796 9.38003 78.5646 9.65003 78.9246 10.19C79.2946 10.72 79.4796 11.45 79.4796 12.38V17H77.2746V12.665C77.2746 12.125 77.1996 11.755 77.0496 11.555C76.9096 11.355 76.6796 11.255 76.3596 11.255C76.0796 11.255 75.8396 11.32 75.6396 11.45C75.4396 11.57 75.2196 11.745 74.9796 11.975V17H72.7746Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M84.0136 20.165C83.4336 20.165 82.9086 20.1 82.4386 19.97C81.9686 19.84 81.5936 19.635 81.3136 19.355C81.0336 19.075 80.8936 18.715 80.8936 18.275C80.8936 17.675 81.2486 17.175 81.9586 16.775V16.715C81.7686 16.585 81.6036 16.42 81.4636 16.22C81.3336 16.02 81.2686 15.765 81.2686 15.455C81.2686 15.185 81.3486 14.925 81.5086 14.675C81.6686 14.425 81.8686 14.22 82.1086 14.06V14C81.8486 13.82 81.6136 13.56 81.4036 13.22C81.2036 12.88 81.1036 12.495 81.1036 12.065C81.1036 11.465 81.2486 10.97 81.5386 10.58C81.8286 10.18 82.2086 9.88003 82.6786 9.68003C83.1486 9.48003 83.6486 9.38003 84.1786 9.38003C84.6186 9.38003 85.0036 9.44003 85.3336 9.56003H88.0486V11.165H86.8636C86.9336 11.275 86.9886 11.415 87.0286 11.585C87.0786 11.755 87.1036 11.94 87.1036 12.14C87.1036 12.71 86.9736 13.18 86.7136 13.55C86.4536 13.92 86.1036 14.195 85.6636 14.375C85.2236 14.555 84.7286 14.645 84.1786 14.645C83.8886 14.645 83.5886 14.595 83.2786 14.495C83.0986 14.645 83.0086 14.83 83.0086 15.05C83.0086 15.24 83.0936 15.38 83.2636 15.47C83.4336 15.56 83.7236 15.605 84.1336 15.605H85.3336C86.2536 15.605 86.9536 15.755 87.4336 16.055C87.9236 16.345 88.1686 16.825 88.1686 17.495C88.1686 18.005 87.9986 18.46 87.6586 18.86C87.3186 19.27 86.8386 19.59 86.2186 19.82C85.5986 20.05 84.8636 20.165 84.0136 20.165ZM84.1786 13.31C84.4686 13.31 84.7086 13.205 84.8986 12.995C85.0986 12.785 85.1986 12.475 85.1986 12.065C85.1986 11.675 85.0986 11.38 84.8986 11.18C84.7086 10.97 84.4686 10.865 84.1786 10.865C83.8886 10.865 83.6436 10.965 83.4436 11.165C83.2536 11.365 83.1586 11.665 83.1586 12.065C83.1586 12.475 83.2536 12.785 83.4436 12.995C83.6436 13.205 83.8886 13.31 84.1786 13.31ZM84.3586 18.785C84.8586 18.785 85.2686 18.695 85.5886 18.515C85.9086 18.335 86.0686 18.12 86.0686 17.87C86.0686 17.64 85.9686 17.485 85.7686 17.405C85.5786 17.325 85.2986 17.285 84.9286 17.285H84.1636C83.9136 17.285 83.7036 17.275 83.5336 17.255C83.3736 17.245 83.2336 17.225 83.1136 17.195C82.8436 17.435 82.7086 17.68 82.7086 17.93C82.7086 18.21 82.8586 18.42 83.1586 18.56C83.4686 18.71 83.8686 18.785 84.3586 18.785Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M92.5542 17V7.22003H98.7192V9.08003H94.7592V11.345H98.1492V13.205H94.7592V17H92.5542Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M101.544 17.18C100.864 17.18 100.324 16.965 99.9241 16.535C99.5241 16.095 99.3241 15.56 99.3241 14.93C99.3241 14.15 99.6541 13.54 100.314 13.1C100.974 12.66 102.039 12.365 103.509 12.215C103.489 11.885 103.389 11.625 103.209 11.435C103.039 11.235 102.749 11.135 102.339 11.135C102.029 11.135 101.714 11.195 101.394 11.315C101.074 11.435 100.734 11.6 100.374 11.81L99.5791 10.355C100.049 10.065 100.549 9.83003 101.079 9.65003C101.619 9.47003 102.179 9.38003 102.759 9.38003C103.709 9.38003 104.439 9.65503 104.949 10.205C105.459 10.755 105.714 11.6 105.714 12.74V17H103.914L103.764 16.235H103.704C103.394 16.515 103.059 16.745 102.699 16.925C102.349 17.095 101.964 17.18 101.544 17.18ZM102.294 15.47C102.544 15.47 102.759 15.415 102.939 15.305C103.129 15.185 103.319 15.03 103.509 14.84V13.535C102.729 13.635 102.189 13.795 101.889 14.015C101.589 14.225 101.439 14.475 101.439 14.765C101.439 15.005 101.514 15.185 101.664 15.305C101.824 15.415 102.034 15.47 102.294 15.47Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M110.819 17.18C110.129 17.18 109.504 17.03 108.944 16.73C108.394 16.42 107.954 15.975 107.624 15.395C107.304 14.805 107.144 14.1 107.144 13.28C107.144 12.45 107.324 11.745 107.684 11.165C108.044 10.585 108.519 10.145 109.109 9.84503C109.699 9.53503 110.334 9.38003 111.014 9.38003C111.474 9.38003 111.879 9.45503 112.229 9.60503C112.589 9.75503 112.909 9.94503 113.189 10.175L112.154 11.6C111.804 11.31 111.469 11.165 111.149 11.165C110.619 11.165 110.194 11.355 109.874 11.735C109.564 12.115 109.409 12.63 109.409 13.28C109.409 13.92 109.564 14.435 109.874 14.825C110.194 15.205 110.594 15.395 111.074 15.395C111.314 15.395 111.549 15.345 111.779 15.245C112.009 15.135 112.219 15.005 112.409 14.855L113.279 16.295C112.909 16.615 112.509 16.845 112.079 16.985C111.649 17.115 111.229 17.18 110.819 17.18Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M117.486 17.18C116.776 17.18 116.136 17.025 115.566 16.715C114.996 16.405 114.546 15.96 114.216 15.38C113.886 14.8 113.721 14.1 113.721 13.28C113.721 12.47 113.886 11.775 114.216 11.195C114.556 10.615 114.996 10.17 115.536 9.86003C116.076 9.54003 116.641 9.38003 117.231 9.38003C117.941 9.38003 118.526 9.54003 118.986 9.86003C119.456 10.17 119.806 10.595 120.036 11.135C120.276 11.665 120.396 12.27 120.396 12.95C120.396 13.14 120.386 13.33 120.366 13.52C120.346 13.7 120.326 13.835 120.306 13.925H115.851C115.951 14.465 116.176 14.865 116.526 15.125C116.876 15.375 117.296 15.5 117.786 15.5C118.316 15.5 118.851 15.335 119.391 15.005L120.126 16.34C119.746 16.6 119.321 16.805 118.851 16.955C118.381 17.105 117.926 17.18 117.486 17.18ZM115.836 12.47H118.521C118.521 12.06 118.421 11.725 118.221 11.465C118.031 11.195 117.716 11.06 117.276 11.06C116.936 11.06 116.631 11.18 116.361 11.42C116.091 11.65 115.916 12 115.836 12.47Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M125.103 17V7.22003H127.308V10.985H130.683V7.22003H132.903V17H130.683V12.92H127.308V17H125.103Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M137.265 17.18C136.455 17.18 135.865 16.915 135.495 16.385C135.135 15.845 134.955 15.11 134.955 14.18V9.56003H137.16V13.895C137.16 14.425 137.235 14.795 137.385 15.005C137.535 15.205 137.77 15.305 138.09 15.305C138.37 15.305 138.605 15.24 138.795 15.11C138.985 14.98 139.19 14.77 139.41 14.48V9.56003H141.615V17H139.815L139.65 15.965H139.605C139.295 16.335 138.955 16.63 138.585 16.85C138.215 17.07 137.775 17.18 137.265 17.18Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M147.456 17.18C147.126 17.18 146.791 17.1 146.451 16.94C146.121 16.77 145.811 16.525 145.521 16.205H145.461L145.281 17H143.556V6.48503H145.761V9.06503L145.701 10.205C145.991 9.94503 146.306 9.74503 146.646 9.60503C146.986 9.45503 147.326 9.38003 147.666 9.38003C148.266 9.38003 148.786 9.53503 149.226 9.84503C149.666 10.155 150.001 10.595 150.231 11.165C150.471 11.725 150.591 12.385 150.591 13.145C150.591 13.995 150.441 14.725 150.141 15.335C149.841 15.935 149.451 16.395 148.971 16.715C148.501 17.025 147.996 17.18 147.456 17.18ZM146.946 15.38C147.326 15.38 147.651 15.205 147.921 14.855C148.191 14.505 148.326 13.95 148.326 13.19C148.326 11.85 147.896 11.18 147.036 11.18C146.596 11.18 146.171 11.405 145.761 11.855V14.9C145.961 15.08 146.161 15.205 146.361 15.275C146.561 15.345 146.756 15.38 146.946 15.38Z",
+							"fill": "#1D2939"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_8587_60397"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"x": "0.998047",
+									"width": "150",
+									"height": "24",
+									"rx": "6",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip1_8587_60397"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "23.998",
+									"height": "22.2298",
+									"fill": "white",
+									"transform": "translate(0.998047 0.885132)"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "HuggingfaceTextHub"
+}
diff --git a/app/components/base/icons/src/public/llm/HuggingfaceTextHub.tsx b/app/components/base/icons/src/public/llm/HuggingfaceTextHub.tsx
new file mode 100644
index 0000000..47e3620
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/HuggingfaceTextHub.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './HuggingfaceTextHub.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'HuggingfaceTextHub'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/IflytekSpark.json b/app/components/base/icons/src/public/llm/IflytekSpark.json
new file mode 100644
index 0000000..1803b5f
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/IflytekSpark.json
@@ -0,0 +1,44 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M21.6547 16.7993C21.3111 18.0034 20.7384 19.0938 20.0054 20.048C18.9058 21.4111 15.1261 21.4111 12.8583 20.8204C10.4072 20.1616 8.6433 18.6395 8.50586 18.5259C9.46797 19.2756 10.6821 19.7072 12.0107 19.7072C15.1948 19.7072 17.7605 17.1174 17.7605 13.9368C17.7605 12.9826 17.5314 12.0966 17.119 11.3015C17.0961 11.2561 17.1419 11.2106 17.1649 11.2333C18.9745 11.5287 22.571 13.2098 21.6547 16.7993Z",
+					"fill": "#2751D0"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M21.9994 12.7773C21.9994 12.8454 21.9306 12.8682 21.8848 12.8C21.0372 11.0053 19.5483 10.46 17.7615 10.0511C16.4099 9.75577 15.5166 9.3014 15.1271 9.09694C15.0355 9.0515 14.9668 8.98335 14.8751 8.93791C12.0575 7.23404 12.0117 4.30339 12.0117 4.30339V0.0550813C12.0117 0.00964486 12.0804 -0.0130733 12.1034 0.0096449L18.7694 6.50706L19.2734 6.98414C20.7394 8.52898 21.7474 10.5509 21.9994 12.7773Z",
+					"fill": "#D82F20"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M20.0052 20.0462C18.1726 22.4316 15.2863 23.9992 12.0334 23.9992C6.48985 23.9992 2 19.501 2 13.9577C2 11.2543 3.05374 8.8234 4.7947 7.00594L5.29866 6.50614L9.65107 2.25783C9.69688 2.2124 9.7656 2.25783 9.7427 2.30327C9.67397 2.59861 9.55944 3.28015 9.62816 4.18888C9.71979 5.25664 10.0634 6.68789 11.0713 8.27817C11.6898 9.27777 12.5832 10.3228 13.8202 11.4133C13.9577 11.5496 14.118 11.6632 14.2784 11.7995C14.8281 12.3674 15.1488 13.1171 15.1488 13.9577C15.1488 15.6616 13.7515 17.0474 12.0563 17.0474C11.3233 17.0474 10.659 16.7975 10.1321 16.3659C10.0863 16.3204 10.1321 16.2523 10.1779 16.275C10.2925 16.2977 10.407 16.3204 10.5215 16.3204C11.1171 16.3204 11.6211 15.8433 11.6211 15.2299C11.6211 14.8665 11.4378 14.5257 11.163 14.3439C10.4299 13.7533 9.81142 13.1853 9.28455 12.6173C8.55151 11.8222 8.00174 11.0498 7.61231 10.3001C6.81055 11.2997 6.30659 12.5492 6.30659 13.935C6.30659 15.7979 7.17707 17.4563 8.55152 18.5014C8.68896 18.615 10.4528 20.1371 12.9039 20.7959C15.1259 21.432 18.9057 21.4093 20.0052 20.0462Z",
+					"fill": "#69C5F4"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "IflytekSpark"
+}
diff --git a/app/components/base/icons/src/public/llm/IflytekSpark.tsx b/app/components/base/icons/src/public/llm/IflytekSpark.tsx
new file mode 100644
index 0000000..a2573a3
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/IflytekSpark.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './IflytekSpark.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'IflytekSpark'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/IflytekSparkText.json b/app/components/base/icons/src/public/llm/IflytekSparkText.json
new file mode 100644
index 0000000..2b01c14
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/IflytekSparkText.json
@@ -0,0 +1,187 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "150",
+			"height": "24",
+			"viewBox": "0 0 150 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_8587_60507)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M19.6552 16.7993C19.3116 18.0034 18.7389 19.0938 18.0059 20.048C16.9063 21.4111 13.1266 21.4111 10.8588 20.8204C8.40766 20.1616 6.64379 18.6395 6.50635 18.5259C7.46846 19.2756 8.68255 19.7072 10.0112 19.7072C13.1953 19.7072 15.7609 17.1174 15.7609 13.9368C15.7609 12.9826 15.5319 12.0966 15.1195 11.3015C15.0966 11.2561 15.1424 11.2106 15.1653 11.2333C16.975 11.5287 20.5715 13.2098 19.6552 16.7993Z",
+							"fill": "#2751D0"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M19.9994 12.7773C19.9994 12.8454 19.9306 12.8682 19.8848 12.8C19.0372 11.0053 17.5483 10.46 15.7615 10.0511C14.4099 9.75577 13.5166 9.3014 13.1271 9.09694C13.0355 9.0515 12.9668 8.98335 12.8751 8.93791C10.0575 7.23404 10.0117 4.30339 10.0117 4.30339V0.0550813C10.0117 0.00964486 10.0804 -0.0130733 10.1034 0.0096449L16.7694 6.50706L17.2734 6.98414C18.7394 8.52898 19.7474 10.5509 19.9994 12.7773Z",
+							"fill": "#D82F20"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M18.0052 20.0462C16.1726 22.4316 13.2863 23.9992 10.0334 23.9992C4.48985 23.9992 0 19.501 0 13.9577C0 11.2543 1.05374 8.8234 2.7947 7.00594L3.29866 6.50614L7.65107 2.25783C7.69688 2.2124 7.7656 2.25783 7.7427 2.30327C7.67397 2.59861 7.55944 3.28015 7.62816 4.18888C7.71979 5.25664 8.06341 6.68789 9.07133 8.27817C9.68983 9.27777 10.5832 10.3228 11.8202 11.4133C11.9577 11.5496 12.118 11.6632 12.2784 11.7995C12.8281 12.3674 13.1488 13.1171 13.1488 13.9577C13.1488 15.6616 11.7515 17.0474 10.0563 17.0474C9.32331 17.0474 8.659 16.7975 8.13213 16.3659C8.08631 16.3204 8.13212 16.2523 8.17794 16.275C8.29247 16.2977 8.40701 16.3204 8.52155 16.3204C9.11714 16.3204 9.62111 15.8433 9.62111 15.2299C9.62111 14.8665 9.43785 14.5257 9.16296 14.3439C8.42992 13.7533 7.81142 13.1853 7.28455 12.6173C6.55151 11.8222 6.00174 11.0498 5.61231 10.3001C4.81055 11.2997 4.30659 12.5492 4.30659 13.935C4.30659 15.7979 5.17707 17.4563 6.55152 18.5014C6.68896 18.615 8.45283 20.1371 10.9039 20.7959C13.1259 21.432 16.9057 21.4093 18.0052 20.0462Z",
+							"fill": "#69C5F4"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M27 10.0997V16.3997H29.008V10.0997H27ZM27 7.89966V9.29966H29.008V7.89966H27Z",
+							"fill": "#2B2B2D"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M39.1482 9.09927V7.49927H31.0156V16.2993H33.2245V12.8993H38.8469V11.2993H33.2245V9.09927H39.1482Z",
+							"fill": "#2B2B2D"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M43.367 14.6993V7.49927H41.1582V16.2993H48.2867V14.6993H43.367Z",
+							"fill": "#2B2B2D"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M55.2168 7.60083L52.6064 11.3008L49.9959 7.60083H47.2852L51.502 13.1008V16.4008H53.7108V13.1008L57.9277 7.60083H55.2168Z",
+							"fill": "#2B2B2D"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M58.9316 7.60083V9.20083H62.2449V16.4008H64.4537V9.20083H67.6666V7.60083H58.9316Z",
+							"fill": "#2B2B2D"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M71.8827 14.7993V12.6993H77.7059V11.0993H71.8827V9.09927H77.9067V7.49927H69.6738V16.2993H78.1075V14.6993H71.8827V14.7993Z",
+							"fill": "#2B2B2D"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M85.1353 11.3008L89.4526 7.60083H86.6413L82.3241 11.4008V7.60083H80.1152V16.4008H82.3241V13.8008L83.6293 12.7008L87.0429 16.5008H89.9546L85.1353 11.3008Z",
+							"fill": "#2B2B2D"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M103.167 11.4C102.866 11.3 102.564 11.2001 101.962 11.1001C101.36 11.0001 99.7532 10.8001 99.1508 10.6001C98.7492 10.5001 98.448 10.3 98.448 9.80005C98.448 8.90005 99.6528 8.80005 99.6528 8.80005C99.954 8.80005 100.255 8.80005 100.356 8.80005C101.159 8.80005 102.163 8.90005 102.665 9.60005C102.765 9.70005 102.765 9.70005 102.866 9.90005L104.974 9.40005C104.773 9.10005 104.673 8.90005 104.372 8.60005C103.97 8.20005 103.468 8.00005 103.267 7.90005C102.665 7.60005 101.862 7.30005 100.356 7.30005C98.7492 7.30005 97.8456 7.70005 97.3436 8.10005C97.0423 8.30005 96.2392 8.90005 96.2392 10.1001C96.2392 11.4001 97.2431 12.0001 97.6447 12.2001C98.3476 12.5001 99.2512 12.7 100.858 12.9C101.661 13 102.263 13.1 102.464 13.3C102.665 13.4 102.765 13.6 102.765 13.9C102.765 14.3 102.464 14.6001 102.364 14.7001C101.761 15.1001 100.657 15.1001 100.556 15.1001C99.452 15.1001 98.1468 14.8001 97.6447 13.7001L95.6367 14.2001C95.7371 14.3001 95.7371 14.4001 95.8375 14.6001C95.9379 14.8001 96.2392 15.3001 96.7412 15.6001C97.0424 15.8001 97.2432 15.9001 97.3436 16.0001C97.946 16.3001 98.8496 16.7001 100.456 16.7001C100.757 16.7001 101.058 16.7001 101.36 16.7001C101.862 16.7001 102.364 16.6 102.765 16.4C104.572 15.8 104.874 14.6 104.874 13.8C104.974 12.1 103.669 11.6 103.167 11.4Z",
+							"fill": "#2B2B2D"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M115.318 8.80083C114.816 8.00083 114.012 7.70083 113.109 7.60083C112.908 7.60083 112.607 7.60083 112.406 7.60083H106.984V16.4008H109.193V13.1008H112.306C113.109 13.1008 114.012 13.1008 114.615 12.7008C114.916 12.5008 115.117 12.3008 115.217 12.2008C115.418 12.0008 115.518 11.8008 115.518 11.7008C115.719 11.2008 115.719 10.6008 115.719 10.4008C115.719 9.50083 115.518 9.00083 115.318 8.80083ZM112.908 11.4008C112.607 11.5008 112.205 11.5008 111.804 11.5008H109.093V9.10083H112.205C112.506 9.10083 112.607 9.10083 112.707 9.20083C113.41 9.40083 113.41 10.2008 113.41 10.4008C113.51 10.5008 113.51 11.1008 112.908 11.4008Z",
+							"fill": "#2B2B2D"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M122.345 7.60083H119.936L115.719 16.4008H118.128L118.831 14.7008H123.349L124.052 16.4008H126.562L122.345 7.60083ZM119.634 13.1008L121.241 9.70083L122.747 13.1008H119.634Z",
+							"fill": "#2B2B2D"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M134.594 12.6993C135.498 12.4993 136.301 12.2993 136.703 11.3993C136.904 10.8993 136.904 10.4993 136.904 10.1993C136.904 8.99926 136.301 8.09926 135.097 7.69926C134.695 7.59926 134.394 7.49927 133.59 7.49927H127.566V16.2993H129.775V12.7993H132.285L134.594 16.2993H137.205L134.594 12.6993ZM133.892 11.1993C133.691 11.1993 133.39 11.1993 133.39 11.1993H129.876V9.09927H133.39C133.791 9.09927 134.293 9.09927 134.594 9.49927C134.795 9.69927 134.795 10.0993 134.795 10.1993C134.695 10.8993 134.193 11.1993 133.892 11.1993Z",
+							"fill": "#2B2B2D"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M144.335 11.3008L148.653 7.60083H145.841L141.524 11.4008V7.60083H139.215V16.4008H141.424V13.8008L142.729 12.7008L146.143 16.5008H149.054L144.335 11.3008Z",
+							"fill": "#2B2B2D"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_8587_60507"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "150",
+									"height": "24",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "IflytekSparkText"
+}
diff --git a/app/components/base/icons/src/public/llm/IflytekSparkText.tsx b/app/components/base/icons/src/public/llm/IflytekSparkText.tsx
new file mode 100644
index 0000000..99abd56
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/IflytekSparkText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './IflytekSparkText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'IflytekSparkText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/IflytekSparkTextCn.json b/app/components/base/icons/src/public/llm/IflytekSparkTextCn.json
new file mode 100644
index 0000000..22d1411
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/IflytekSparkTextCn.json
@@ -0,0 +1,98 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "84",
+			"height": "24",
+			"viewBox": "0 0 84 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M34.8763 7.49212H33.1466V11.557H34.4438V13.0273H33.1466V18.7137H31.1574V13.0489H29.752V11.5786H31.179V7.49212H29.8384V6.02185H36.952C37.2547 6.02185 37.4925 6.25969 37.4925 6.56239V17.33H38.4438L37.7736 18.7354L35.4817 18.757L35.4601 8.11915C35.4817 7.7732 35.2222 7.49212 34.8763 7.49212Z",
+					"fill": "#2B2B2D"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M26.1832 11.8599H25.3184V10.3896H27.6102C27.9129 10.3896 28.1508 10.6275 28.1508 10.9302L28.1724 17.3086H29.2319L28.5832 18.7356H26.7238C26.4211 18.7356 26.1832 18.4978 26.1832 18.1951V11.8599Z",
+					"fill": "#2B2B2D"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M28.1724 6.02185H25.3184V7.55699H28.1724V6.02185Z",
+					"fill": "#2B2B2D"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M50.1495 6.02162L45.5873 10.0865H48.6792L52.8306 6.02162H50.1495ZM49.09 11.773H46.1279L49.5873 15.5135H52.5495L49.09 11.773ZM43.4468 17.3514C43.2522 17.3514 43.1225 17.1784 43.1657 16.9838L45.89 6.69189C45.9765 6.34595 45.7171 6 45.3711 6H40.1387V7.44865H43.036C43.3171 7.44865 43.5333 7.72973 43.4468 7.98919L40.7873 18.0216C40.7008 18.3676 40.9603 18.7135 41.3062 18.7135H51.7927L52.5927 17.3297H43.4468V17.3514Z",
+					"fill": "#2B2B2D"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M62.2792 16.465H67.1224V15.3406H62.2792V14.2379H67.1224V13.1569H62.2792V12.2271H67.1224V10.4974V6.56227C67.1224 6.25957 66.8845 6.02173 66.5818 6.02173H55.5332V11.665C55.5332 11.9677 55.771 12.2055 56.0737 12.2055H57.0035L55.5332 14.2379H60.1602V15.3406H55.5548V16.465L60.1602 16.4433V17.3515H55.5548V18.7352H67.1008V17.3515H62.2575V16.465H62.2792ZM57.6305 9.78389H63.7927L64.3981 8.61632H57.6305V7.31903H65.0035V10.8866H57.6305V9.78389ZM60.1602 13.1352H58.3224L59.0359 12.2055H60.1602V13.1352Z",
+					"fill": "#2B2B2D"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M71.549 6.02173H69.4733L71.0085 12.2271H73.0842L71.549 6.02173ZM79.6788 6.02173L78.1436 12.2488H80.2409L81.776 6.02173H79.6788ZM76.6517 12.3136V6.02173H74.5112V12.3136L69.3652 18.7569H71.9814L75.6355 14.2379L79.3112 18.7785L81.949 18.7569L76.6517 12.3136Z",
+					"fill": "#2B2B2D"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M20.8854 16.4979C20.5611 17.6438 20.0206 18.6817 19.3287 19.5898C18.2908 20.8871 14.7233 20.8871 12.5827 20.3249C10.2692 19.6979 8.60434 18.2492 8.47461 18.1411C9.38272 18.8546 10.5287 19.2654 11.7827 19.2654C14.7881 19.2654 17.2097 16.8006 17.2097 13.7735C17.2097 12.8654 16.9935 12.0222 16.6043 11.2654C16.5827 11.2222 16.626 11.179 16.6476 11.2006C18.3557 11.4817 21.7503 13.0817 20.8854 16.4979Z",
+					"fill": "#2751D0"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M21.2102 12.6705C21.2102 12.7353 21.1454 12.7569 21.1021 12.6921C20.3021 10.984 18.8967 10.465 17.2102 10.0759C15.9346 9.79478 15.0913 9.36235 14.7238 9.16775C14.6373 9.12451 14.5724 9.05964 14.4859 9.0164C11.8264 7.39478 11.7832 4.60559 11.7832 4.60559V0.562346C11.7832 0.519102 11.8481 0.497481 11.8697 0.519102L18.1616 6.70289L18.6373 7.15694C20.021 8.62721 20.9724 10.5515 21.2102 12.6705Z",
+					"fill": "#D82F20"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M19.3286 19.5894C17.5989 21.8596 14.8745 23.3515 11.8043 23.3515C6.57182 23.3515 2.33398 19.0704 2.33398 13.7948C2.33398 11.2218 3.32858 8.90828 4.97182 7.17855L5.4475 6.70288L9.5556 2.65964C9.59885 2.61639 9.66371 2.65964 9.64209 2.70288C9.57723 2.98396 9.46912 3.63261 9.53398 4.49747C9.62047 5.51369 9.9448 6.87585 10.8961 8.38937C11.4799 9.34072 12.3232 10.3353 13.4907 11.3731C13.6205 11.5029 13.7718 11.611 13.9232 11.7407C14.4421 12.2813 14.7448 12.9948 14.7448 13.7948C14.7448 15.4164 13.4259 16.7353 11.8259 16.7353C11.134 16.7353 10.507 16.4975 10.0097 16.0867C9.96642 16.0434 10.0097 15.9786 10.0529 16.0002C10.161 16.0218 10.2691 16.0434 10.3772 16.0434C10.9394 16.0434 11.4151 15.5894 11.4151 15.0056C11.4151 14.6596 11.2421 14.3353 10.9826 14.1623C10.2907 13.6002 9.70695 13.0596 9.20966 12.5191C8.51777 11.7623 7.99885 11.0272 7.63128 10.3137C6.87453 11.265 6.39885 12.4542 6.39885 13.7731C6.39885 15.5461 7.22047 17.1245 8.51777 18.1191C8.6475 18.2272 10.3124 19.6759 12.6259 20.3029C14.7232 20.9083 18.2907 20.8867 19.3286 19.5894Z",
+					"fill": "#69C5F4"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "IflytekSparkTextCn"
+}
diff --git a/app/components/base/icons/src/public/llm/IflytekSparkTextCn.tsx b/app/components/base/icons/src/public/llm/IflytekSparkTextCn.tsx
new file mode 100644
index 0000000..8f9d09e
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/IflytekSparkTextCn.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './IflytekSparkTextCn.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'IflytekSparkTextCn'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/Jina.json b/app/components/base/icons/src/public/llm/Jina.json
new file mode 100644
index 0000000..88d70a3
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Jina.json
@@ -0,0 +1,35 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M6.56053 21.4486C9.07925 21.4486 11.1211 19.4068 11.1211 16.8882C11.1211 14.3696 9.07925 12.3279 6.56053 12.3279C4.04182 12.3279 2 14.3696 2 16.8882C2 19.4068 4.04182 21.4486 6.56053 21.4486Z",
+					"fill": "#EB6161"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M22.0002 3.59467L21.9406 12.3279C21.9406 17.3055 17.9464 21.3591 12.9685 21.4485L12.8789 12.3577L12.8791 3.62447C12.8791 3.02835 13.356 2.55145 13.9522 2.55145H20.9271C21.5233 2.55145 22.0002 2.99854 22.0002 3.59467Z",
+					"fill": "#009191"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Jina"
+}
diff --git a/app/components/base/icons/src/public/llm/Jina.tsx b/app/components/base/icons/src/public/llm/Jina.tsx
new file mode 100644
index 0000000..6fe2403
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Jina.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Jina.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Jina'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/JinaText.json b/app/components/base/icons/src/public/llm/JinaText.json
new file mode 100644
index 0000000..08e76ef
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/JinaText.json
@@ -0,0 +1,82 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "58",
+			"height": "24",
+			"viewBox": "0 0 58 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_13814_61529)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M4.47132 23.952C6.49932 23.952 8.14332 22.308 8.14332 20.28C8.14332 18.252 6.49932 16.608 4.47132 16.608C2.44332 16.608 0.799316 18.252 0.799316 20.28C0.799316 22.308 2.44332 23.952 4.47132 23.952Z",
+							"fill": "#EB6161"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M16.0387 8.71204C16.5187 8.71204 16.9027 9.09604 16.9027 9.57604L16.8547 16.608C16.8547 20.616 13.6387 23.88 9.63074 23.952H9.51074V16.632H9.53474L9.55874 9.60004C9.55874 9.12004 9.94274 8.73604 10.4227 8.73604H16.0387V8.71204ZM27.3187 8.71204C27.7987 8.71204 28.1827 9.09604 28.1827 9.57604V19.416C28.1827 19.896 27.7987 20.28 27.3187 20.28H21.7027C21.2227 20.28 20.8387 19.896 20.8387 19.416V9.57604C20.8387 9.09604 21.2227 8.71204 21.7027 8.71204H27.3187ZM36.1507 8.68804H36.2707C39.8707 8.73604 42.7987 11.64 42.8947 15.24V19.392C42.8947 19.872 42.5107 20.256 42.0307 20.256H32.9587C32.4787 20.256 32.0947 19.872 32.0947 19.392V9.55204C32.0947 9.07204 32.4787 8.68804 32.9587 8.68804H36.1507ZM51.0067 20.16C47.9827 19.968 45.5587 17.448 45.5587 14.376C45.5587 11.184 48.1507 8.59204 51.3427 8.59204C54.4147 8.59204 56.9347 10.992 57.1267 14.04V19.296C57.1267 19.776 56.7427 20.16 56.2627 20.16H51.0067Z",
+							"fill": "#009191"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M24.4987 7.344C26.5267 7.344 28.1707 5.7 28.1707 3.672C28.1707 1.644 26.5267 0 24.4987 0C22.4707 0 20.8267 1.644 20.8267 3.672C20.8267 5.7 22.4707 7.344 24.4987 7.344Z",
+							"fill": "#FBCB67"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_13814_61529"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "56.4",
+									"height": "24",
+									"fill": "white",
+									"transform": "translate(0.800781)"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "JinaText"
+}
diff --git a/app/components/base/icons/src/public/llm/JinaText.tsx b/app/components/base/icons/src/public/llm/JinaText.tsx
new file mode 100644
index 0000000..e5514a5
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/JinaText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './JinaText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'JinaText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/Localai.json b/app/components/base/icons/src/public/llm/Localai.json
new file mode 100644
index 0000000..e0f8549
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Localai.json
@@ -0,0 +1,107 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg",
+			"xmlns:xlink": "http://www.w3.org/1999/xlink"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_10164_6300)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "rect",
+						"attributes": {
+							"width": "24",
+							"height": "24",
+							"rx": "4",
+							"fill": "#1C0120"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "rect",
+						"attributes": {
+							"width": "24",
+							"height": "24",
+							"fill": "url(#pattern0)"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "pattern",
+						"attributes": {
+							"id": "pattern0",
+							"patternContentUnits": "objectBoundingBox",
+							"width": "1",
+							"height": "1"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "use",
+								"attributes": {
+									"xlink:href": "#image0_10164_6300",
+									"transform": "scale(0.00390625)"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_10164_6300"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "24",
+									"height": "24",
+									"rx": "4",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "image",
+						"attributes": {
+							"id": "image0_10164_6300",
+							"width": "256",
+							"height": "256",
+							"xlink:href": "data:image/jpeg;base64,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"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Localai"
+}
diff --git a/app/components/base/icons/src/public/llm/Localai.tsx b/app/components/base/icons/src/public/llm/Localai.tsx
new file mode 100644
index 0000000..731f008
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Localai.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Localai.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Localai'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/LocalaiText.json b/app/components/base/icons/src/public/llm/LocalaiText.json
new file mode 100644
index 0000000..849f7ae
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/LocalaiText.json
@@ -0,0 +1,170 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "90",
+			"height": "24",
+			"viewBox": "0 0 90 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg",
+			"xmlns:xlink": "http://www.w3.org/1999/xlink"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_10164_6324)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "rect",
+						"attributes": {
+							"width": "24",
+							"height": "24",
+							"rx": "4",
+							"fill": "#1E0122"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "rect",
+						"attributes": {
+							"width": "24",
+							"height": "24",
+							"fill": "url(#pattern0)"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M33.0242 16.528H36.7842V18H31.2002V6.88003H33.0242V16.528Z",
+					"fill": "#1C2B33"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M41.8136 18.144C40.9816 18.144 40.2296 17.9574 39.5576 17.584C38.8856 17.2 38.3576 16.6667 37.9736 15.984C37.5896 15.2907 37.3976 14.4907 37.3976 13.584C37.3976 12.688 37.5949 11.8934 37.9896 11.2C38.3842 10.5067 38.9229 9.97337 39.6056 9.60003C40.2882 9.2267 41.0509 9.04003 41.8936 9.04003C42.7362 9.04003 43.4989 9.2267 44.1816 9.60003C44.8642 9.97337 45.4029 10.5067 45.7976 11.2C46.1922 11.8934 46.3896 12.688 46.3896 13.584C46.3896 14.48 46.1869 15.2747 45.7816 15.968C45.3762 16.6614 44.8216 17.2 44.1176 17.584C43.4242 17.9574 42.6562 18.144 41.8136 18.144ZM41.8136 16.56C42.2829 16.56 42.7202 16.448 43.1256 16.224C43.5416 16 43.8776 15.664 44.1336 15.216C44.3896 14.768 44.5176 14.224 44.5176 13.584C44.5176 12.944 44.3949 12.4054 44.1496 11.968C43.9042 11.52 43.5789 11.184 43.1736 10.96C42.7682 10.736 42.3309 10.624 41.8616 10.624C41.3922 10.624 40.9549 10.736 40.5496 10.96C40.1549 11.184 39.8402 11.52 39.6056 11.968C39.3709 12.4054 39.2536 12.944 39.2536 13.584C39.2536 14.5334 39.4936 15.2694 39.9736 15.792C40.4642 16.304 41.0776 16.56 41.8136 16.56Z",
+					"fill": "#1C2B33"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M47.2647 13.584C47.2647 12.6774 47.446 11.8827 47.8087 11.2C48.182 10.5067 48.694 9.97337 49.3447 9.60003C49.9954 9.2267 50.742 9.04003 51.5847 9.04003C52.6514 9.04003 53.5314 9.29603 54.2247 9.80803C54.9287 10.3094 55.4034 11.0294 55.6487 11.968H53.6807C53.5207 11.5307 53.2647 11.1894 52.9127 10.944C52.5607 10.6987 52.118 10.576 51.5847 10.576C50.838 10.576 50.2407 10.8427 49.7927 11.376C49.3554 11.8987 49.1367 12.6347 49.1367 13.584C49.1367 14.5334 49.3554 15.2747 49.7927 15.808C50.2407 16.3414 50.838 16.608 51.5847 16.608C52.6407 16.608 53.3394 16.144 53.6807 15.216H55.6487C55.3927 16.112 54.9127 16.8267 54.2087 17.36C53.5047 17.8827 52.63 18.144 51.5847 18.144C50.742 18.144 49.9954 17.9574 49.3447 17.584C48.694 17.2 48.182 16.6667 47.8087 15.984C47.446 15.2907 47.2647 14.4907 47.2647 13.584Z",
+					"fill": "#1C2B33"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M56.5384 13.552C56.5384 12.6667 56.7198 11.8827 57.0824 11.2C57.4558 10.5174 57.9571 9.98937 58.5864 9.61603C59.2264 9.23203 59.9304 9.04003 60.6984 9.04003C61.3918 9.04003 61.9944 9.1787 62.5064 9.45603C63.0291 9.7227 63.4451 10.0587 63.7544 10.464V9.18403H65.5944V18H63.7544V16.688C63.4451 17.104 63.0238 17.4507 62.4904 17.728C61.9571 18.0054 61.3491 18.144 60.6664 18.144C59.9091 18.144 59.2158 17.952 58.5864 17.568C57.9571 17.1734 57.4558 16.6294 57.0824 15.936C56.7198 15.232 56.5384 14.4374 56.5384 13.552ZM63.7544 13.584C63.7544 12.976 63.6264 12.448 63.3704 12C63.1251 11.552 62.7998 11.2107 62.3944 10.976C61.9891 10.7414 61.5518 10.624 61.0824 10.624C60.6131 10.624 60.1758 10.7414 59.7704 10.976C59.3651 11.2 59.0344 11.536 58.7784 11.984C58.5331 12.4214 58.4104 12.944 58.4104 13.552C58.4104 14.16 58.5331 14.6934 58.7784 15.152C59.0344 15.6107 59.3651 15.9627 59.7704 16.208C60.1864 16.4427 60.6238 16.56 61.0824 16.56C61.5518 16.56 61.9891 16.4427 62.3944 16.208C62.7998 15.9734 63.1251 15.632 63.3704 15.184C63.6264 14.7254 63.7544 14.192 63.7544 13.584Z",
+					"fill": "#1C2B33"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M69.4942 6.16003V18H67.6702V6.16003H69.4942Z",
+					"fill": "#1C2B33"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M78.2729 15.728H73.6169L72.8169 18H70.9129L74.8969 6.86403H77.0089L80.9929 18H79.0729L78.2729 15.728ZM77.7609 14.24L75.9529 9.07203L74.1289 14.24H77.7609Z",
+					"fill": "#1C2B33"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M84.2292 6.88003V18H82.4052V6.88003H84.2292Z",
+					"fill": "#1C2B33"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "pattern",
+						"attributes": {
+							"id": "pattern0",
+							"patternContentUnits": "objectBoundingBox",
+							"width": "1",
+							"height": "1"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "use",
+								"attributes": {
+									"xlink:href": "#image0_10164_6324",
+									"transform": "scale(0.00390625)"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_10164_6324"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "24",
+									"height": "24",
+									"rx": "4",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "image",
+						"attributes": {
+							"id": "image0_10164_6324",
+							"width": "256",
+							"height": "256",
+							"xlink:href": "data:image/jpeg;base64,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"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "LocalaiText"
+}
diff --git a/app/components/base/icons/src/public/llm/LocalaiText.tsx b/app/components/base/icons/src/public/llm/LocalaiText.tsx
new file mode 100644
index 0000000..aaea98a
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/LocalaiText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LocalaiText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LocalaiText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/Microsoft.json b/app/components/base/icons/src/public/llm/Microsoft.json
new file mode 100644
index 0000000..ab2c052
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Microsoft.json
@@ -0,0 +1,76 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "21",
+			"height": "22",
+			"viewBox": "0 0 21 22",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Microsoft"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "rect",
+						"attributes": {
+							"id": "Rectangle 1010",
+							"y": "0.5",
+							"width": "10",
+							"height": "10",
+							"fill": "#EF4F21"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "rect",
+						"attributes": {
+							"id": "Rectangle 1012",
+							"y": "11.5",
+							"width": "10",
+							"height": "10",
+							"fill": "#03A4EE"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "rect",
+						"attributes": {
+							"id": "Rectangle 1011",
+							"x": "11",
+							"y": "0.5",
+							"width": "10",
+							"height": "10",
+							"fill": "#7EB903"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "rect",
+						"attributes": {
+							"id": "Rectangle 1013",
+							"x": "11",
+							"y": "11.5",
+							"width": "10",
+							"height": "10",
+							"fill": "#FBB604"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Microsoft"
+}
diff --git a/app/components/base/icons/src/public/llm/Microsoft.tsx b/app/components/base/icons/src/public/llm/Microsoft.tsx
new file mode 100644
index 0000000..0b6e5dc
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Microsoft.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Microsoft.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Microsoft'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/OpenaiBlack.json b/app/components/base/icons/src/public/llm/OpenaiBlack.json
new file mode 100644
index 0000000..9f4a991
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/OpenaiBlack.json
@@ -0,0 +1,37 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"width": "24",
+					"height": "24",
+					"rx": "6",
+					"fill": "black"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M19.7758 11.5959C19.9546 11.9948 20.0681 12.4213 20.1145 12.8563C20.1592 13.2913 20.1369 13.7315 20.044 14.1596C19.9529 14.5878 19.7947 14.9987 19.5746 15.377C19.4302 15.6298 19.2599 15.867 19.0639 16.0854C18.8696 16.3021 18.653 16.4981 18.4174 16.67C18.1801 16.842 17.9274 16.9864 17.6591 17.105C17.3926 17.222 17.1141 17.3114 16.8286 17.3698C16.6945 17.7859 16.4951 18.1797 16.2371 18.5339C15.9809 18.8881 15.6697 19.1993 15.3155 19.4555C14.9613 19.7134 14.5693 19.9129 14.1532 20.047C13.7371 20.1829 13.302 20.2499 12.8636 20.2499C12.573 20.2516 12.2807 20.2207 11.9953 20.1622C11.7116 20.102 11.433 20.0109 11.1665 19.8923C10.9 19.7736 10.6472 19.6258 10.4116 19.4538C10.1778 19.2819 9.96115 19.0841 9.76857 18.8658C9.33871 18.9586 8.89853 18.981 8.46351 18.9363C8.02849 18.8898 7.60207 18.7763 7.20143 18.5975C6.80252 18.4204 6.43284 18.1797 6.10786 17.8857C5.78289 17.5916 5.50606 17.2478 5.28769 16.8695C5.14153 16.6167 5.02117 16.3502 4.93004 16.0734C4.83891 15.7965 4.77873 15.5111 4.74778 15.2205C4.71683 14.9317 4.71855 14.6393 4.7495 14.3488C4.78045 14.0599 4.84407 13.7745 4.9352 13.4976C4.64289 13.1727 4.40217 12.803 4.22335 12.4041C4.04624 12.0034 3.93104 11.5787 3.88634 11.1437C3.83991 10.7087 3.86398 10.2685 3.95511 9.84036C4.04624 9.41222 4.20443 9.00127 4.42452 8.62299C4.56896 8.37023 4.73918 8.13123 4.93348 7.91458C5.12778 7.69793 5.34615 7.50191 5.58171 7.32997C5.81728 7.15802 6.07176 7.01187 6.33827 6.89495C6.6065 6.7763 6.88506 6.68861 7.17048 6.63015C7.3046 6.21232 7.50406 5.82029 7.76026 5.46608C8.01817 5.11188 8.32939 4.80066 8.6836 4.54274C9.03781 4.28654 9.42984 4.08708 9.84595 3.95125C10.2621 3.81713 10.6971 3.74835 11.1355 3.75007C11.4261 3.74835 11.7184 3.77758 12.0039 3.83776C12.2893 3.89794 12.5678 3.98736 12.8344 4.106C13.1009 4.22636 13.3536 4.37251 13.5892 4.54446C13.8248 4.71812 14.0414 4.91414 14.234 5.13251C14.6621 5.04138 15.1023 5.01903 15.5373 5.06373C15.9723 5.10844 16.3971 5.22364 16.7977 5.40074C17.1966 5.57957 17.5663 5.81857 17.8913 6.1126C18.2162 6.4049 18.4931 6.74707 18.7114 7.12707C18.8576 7.37811 18.9779 7.64463 19.0691 7.92318C19.1602 8.20001 19.2221 8.48544 19.2513 8.77602C19.2823 9.06661 19.2823 9.35892 19.2496 9.64951C19.2187 9.94009 19.155 10.2255 19.0639 10.5024C19.3579 10.8273 19.5969 11.1953 19.7758 11.5959ZM14.0466 18.9363C14.4214 18.7815 14.7619 18.5528 15.049 18.2657C15.3362 17.9785 15.5648 17.6381 15.7196 17.2615C15.8743 16.8867 15.9552 16.4843 15.9552 16.0785V12.2442C15.954 12.2407 15.9529 12.2367 15.9517 12.2321C15.9506 12.2287 15.9488 12.2252 15.9466 12.2218C15.9443 12.2184 15.9414 12.2155 15.938 12.2132C15.9345 12.2098 15.9311 12.2075 15.9276 12.2063L14.54 11.4051V16.0373C14.54 16.0837 14.5332 16.1318 14.5211 16.1765C14.5091 16.223 14.4919 16.2659 14.4678 16.3072C14.4438 16.3485 14.4162 16.3863 14.3819 16.419C14.3484 16.4523 14.3109 16.4812 14.2701 16.505L10.9842 18.4015C10.9567 18.4187 10.9103 18.4428 10.8862 18.4565C11.0221 18.5717 11.1699 18.6732 11.3247 18.7626C11.4811 18.852 11.6428 18.9277 11.8113 18.9896C11.9798 19.0497 12.1535 19.0962 12.3288 19.1271C12.5059 19.1581 12.6848 19.1735 12.8636 19.1735C13.2694 19.1735 13.6717 19.0927 14.0466 18.9363ZM6.22135 16.333C6.42596 16.6855 6.69592 16.9916 7.01745 17.2392C7.34071 17.4868 7.70695 17.6673 8.09899 17.7722C8.49102 17.8771 8.90025 17.9046 9.3026 17.8513C9.70495 17.798 10.0918 17.6673 10.4443 17.4644L13.7663 15.5472L13.7749 15.5386C13.7772 15.5363 13.7789 15.5329 13.78 15.5283C13.7823 15.5249 13.7841 15.5214 13.7852 15.518V13.9017L9.77545 16.2212C9.73418 16.2453 9.6912 16.2625 9.64649 16.2763C9.60007 16.2883 9.55364 16.2935 9.5055 16.2935C9.45907 16.2935 9.41265 16.2883 9.36622 16.2763C9.32152 16.2625 9.27681 16.2453 9.23554 16.2212L5.94967 14.323C5.92044 14.3058 5.87746 14.28 5.85339 14.2645C5.82244 14.4416 5.80696 14.6204 5.80696 14.7993C5.80696 14.9781 5.82415 15.1569 5.85511 15.334C5.88605 15.5094 5.9342 15.6831 5.99438 15.8516C6.05628 16.0201 6.13194 16.1817 6.22135 16.3364V16.333ZM5.35818 9.1629C5.15529 9.51539 5.02461 9.90398 4.97131 10.3063C4.918 10.7087 4.94552 11.1162 5.0504 11.51C5.15529 11.902 5.33583 12.2682 5.58343 12.5915C5.83103 12.913 6.13881 13.183 6.48958 13.3859L9.80984 15.3048C9.81328 15.3059 9.81729 15.3071 9.82188 15.3082H9.83391C9.8385 15.3082 9.84251 15.3071 9.84595 15.3048C9.84939 15.3036 9.85283 15.3019 9.85627 15.2996L11.249 14.4949L7.23926 12.1805C7.19971 12.1565 7.16189 12.1272 7.1275 12.0946C7.09418 12.0611 7.06529 12.0236 7.04153 11.9828C7.01917 11.9415 7.00026 11.8985 6.98822 11.8521C6.97619 11.8074 6.96931 11.761 6.97103 11.7128V7.80797C6.80252 7.86987 6.63917 7.94553 6.48442 8.03494C6.32967 8.12607 6.18352 8.22924 6.04596 8.34444C5.91013 8.45965 5.78289 8.58688 5.66769 8.72444C5.55248 8.86028 5.45103 9.00815 5.36162 9.1629H5.35818ZM16.7633 11.8177C16.8046 11.8418 16.8424 11.8693 16.8768 11.9037C16.9094 11.9364 16.9387 11.9742 16.9628 12.0155C16.9851 12.0567 17.004 12.1014 17.0161 12.1461C17.0264 12.1926 17.0332 12.239 17.0315 12.2871V16.192C17.5835 15.9891 18.0649 15.6332 18.4208 15.1655C18.7785 14.6978 18.9934 14.139 19.0433 13.5544C19.0931 12.9698 18.9762 12.3817 18.7046 11.8607C18.4329 11.3397 18.0185 10.9064 17.5095 10.6141L14.1893 8.69521C14.1858 8.69406 14.1818 8.69292 14.1772 8.69177H14.1652C14.1618 8.69292 14.1578 8.69406 14.1532 8.69521C14.1497 8.69636 14.1463 8.69808 14.1429 8.70037L12.757 9.50163L16.7667 11.8177H16.7633ZM18.1475 9.7372H18.1457V9.73892L18.1475 9.7372ZM18.1457 9.73548C18.2455 9.15774 18.1784 8.56281 17.9514 8.02119C17.7262 7.47956 17.3496 7.01359 16.8682 6.67658C16.3867 6.34128 15.8193 6.1487 15.233 6.12291C14.6449 6.09884 14.0638 6.24155 13.5548 6.53386L10.2345 8.45105C10.2311 8.45334 10.2282 8.45621 10.2259 8.45965L10.2191 8.46996C10.2179 8.4734 10.2168 8.47741 10.2156 8.482C10.2145 8.48544 10.2139 8.48945 10.2139 8.49403V10.0966L14.2237 7.78046C14.2649 7.75639 14.3096 7.7392 14.3543 7.72544C14.4008 7.7134 14.4472 7.70825 14.4936 7.70825C14.5418 7.70825 14.5882 7.7134 14.6346 7.72544C14.6793 7.7392 14.7223 7.75639 14.7636 7.78046L18.0494 9.67874C18.0787 9.69593 18.1217 9.72 18.1457 9.73548ZM9.45735 7.96101C9.45735 7.91458 9.46423 7.86816 9.47627 7.82173C9.4883 7.77702 9.5055 7.73232 9.52957 7.69105C9.55364 7.6515 9.58115 7.61368 9.61554 7.57929C9.64821 7.54662 9.68604 7.51739 9.72731 7.49503L13.0132 5.59848C13.0441 5.57957 13.0871 5.55549 13.1112 5.54346C12.6607 5.1669 12.1105 4.92618 11.5276 4.85224C10.9447 4.77658 10.3532 4.86943 9.82188 5.11875C9.28885 5.36807 8.83835 5.76527 8.52369 6.26047C8.20903 6.75739 8.04224 7.33169 8.04224 7.91974V11.7541C8.04339 11.7587 8.04454 11.7627 8.04568 11.7661C8.04683 11.7696 8.04855 11.773 8.05084 11.7765C8.05313 11.7799 8.056 11.7833 8.05944 11.7868C8.06173 11.7891 8.06517 11.7914 8.06976 11.7937L9.45735 12.5949V7.96101ZM10.2105 13.0282L11.997 14.0599L13.7835 13.0282V10.9666L11.9987 9.93493L10.2122 10.9666L10.2105 13.0282Z",
+					"fill": "white"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "OpenaiBlack"
+}
diff --git a/app/components/base/icons/src/public/llm/OpenaiBlack.tsx b/app/components/base/icons/src/public/llm/OpenaiBlack.tsx
new file mode 100644
index 0000000..1b9e3ec
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/OpenaiBlack.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './OpenaiBlack.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'OpenaiBlack'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/OpenaiBlue.json b/app/components/base/icons/src/public/llm/OpenaiBlue.json
new file mode 100644
index 0000000..5c716f7
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/OpenaiBlue.json
@@ -0,0 +1,37 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"width": "24",
+					"height": "24",
+					"rx": "6",
+					"fill": "#03A4EE"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M19.7758 11.5959C19.9546 11.9948 20.0681 12.4213 20.1145 12.8563C20.1592 13.2913 20.1369 13.7315 20.044 14.1596C19.9529 14.5878 19.7947 14.9987 19.5746 15.377C19.4302 15.6298 19.2599 15.867 19.0639 16.0854C18.8696 16.3021 18.653 16.4981 18.4174 16.67C18.1801 16.842 17.9274 16.9864 17.6591 17.105C17.3926 17.222 17.1141 17.3114 16.8286 17.3698C16.6945 17.7859 16.4951 18.1797 16.2371 18.5339C15.9809 18.8881 15.6697 19.1993 15.3155 19.4555C14.9613 19.7134 14.5693 19.9129 14.1532 20.047C13.7371 20.1829 13.302 20.2499 12.8636 20.2499C12.573 20.2516 12.2807 20.2207 11.9953 20.1622C11.7116 20.102 11.433 20.0109 11.1665 19.8923C10.9 19.7736 10.6472 19.6258 10.4116 19.4538C10.1778 19.2819 9.96115 19.0841 9.76857 18.8658C9.33871 18.9586 8.89853 18.981 8.46351 18.9363C8.02849 18.8898 7.60207 18.7763 7.20143 18.5975C6.80252 18.4204 6.43284 18.1797 6.10786 17.8857C5.78289 17.5916 5.50606 17.2478 5.28769 16.8695C5.14153 16.6167 5.02117 16.3502 4.93004 16.0734C4.83891 15.7965 4.77873 15.5111 4.74778 15.2205C4.71683 14.9317 4.71855 14.6393 4.7495 14.3488C4.78045 14.0599 4.84407 13.7745 4.9352 13.4976C4.64289 13.1727 4.40217 12.803 4.22335 12.4041C4.04624 12.0034 3.93104 11.5787 3.88634 11.1437C3.83991 10.7087 3.86398 10.2685 3.95511 9.84036C4.04624 9.41222 4.20443 9.00127 4.42452 8.62299C4.56896 8.37023 4.73918 8.13123 4.93348 7.91458C5.12778 7.69793 5.34615 7.50191 5.58171 7.32997C5.81728 7.15802 6.07176 7.01187 6.33827 6.89495C6.6065 6.7763 6.88506 6.68861 7.17048 6.63015C7.3046 6.21232 7.50406 5.82029 7.76026 5.46608C8.01817 5.11188 8.32939 4.80066 8.6836 4.54274C9.03781 4.28654 9.42984 4.08708 9.84595 3.95125C10.2621 3.81713 10.6971 3.74835 11.1355 3.75007C11.4261 3.74835 11.7184 3.77758 12.0039 3.83776C12.2893 3.89794 12.5678 3.98736 12.8344 4.106C13.1009 4.22636 13.3536 4.37251 13.5892 4.54446C13.8248 4.71812 14.0414 4.91414 14.234 5.13251C14.6621 5.04138 15.1023 5.01903 15.5373 5.06373C15.9723 5.10844 16.3971 5.22364 16.7977 5.40074C17.1966 5.57957 17.5663 5.81857 17.8913 6.1126C18.2162 6.4049 18.4931 6.74707 18.7114 7.12707C18.8576 7.37811 18.9779 7.64463 19.0691 7.92318C19.1602 8.20001 19.2221 8.48544 19.2513 8.77602C19.2823 9.06661 19.2823 9.35892 19.2496 9.64951C19.2187 9.94009 19.155 10.2255 19.0639 10.5024C19.3579 10.8273 19.5969 11.1953 19.7758 11.5959ZM14.0466 18.9363C14.4214 18.7815 14.7619 18.5528 15.049 18.2657C15.3362 17.9785 15.5648 17.6381 15.7196 17.2615C15.8743 16.8867 15.9552 16.4843 15.9552 16.0785V12.2442C15.954 12.2407 15.9529 12.2367 15.9517 12.2321C15.9506 12.2287 15.9488 12.2252 15.9466 12.2218C15.9443 12.2184 15.9414 12.2155 15.938 12.2132C15.9345 12.2098 15.9311 12.2075 15.9276 12.2063L14.54 11.4051V16.0373C14.54 16.0837 14.5332 16.1318 14.5211 16.1765C14.5091 16.223 14.4919 16.2659 14.4678 16.3072C14.4438 16.3485 14.4162 16.3863 14.3819 16.419C14.3484 16.4523 14.3109 16.4812 14.2701 16.505L10.9842 18.4015C10.9567 18.4187 10.9103 18.4428 10.8862 18.4565C11.0221 18.5717 11.1699 18.6732 11.3247 18.7626C11.4811 18.852 11.6428 18.9277 11.8113 18.9896C11.9798 19.0497 12.1535 19.0962 12.3288 19.1271C12.5059 19.1581 12.6848 19.1735 12.8636 19.1735C13.2694 19.1735 13.6717 19.0927 14.0466 18.9363ZM6.22135 16.333C6.42596 16.6855 6.69592 16.9916 7.01745 17.2392C7.34071 17.4868 7.70695 17.6673 8.09899 17.7722C8.49102 17.8771 8.90025 17.9046 9.3026 17.8513C9.70495 17.798 10.0918 17.6673 10.4443 17.4644L13.7663 15.5472L13.7749 15.5386C13.7772 15.5363 13.7789 15.5329 13.78 15.5283C13.7823 15.5249 13.7841 15.5214 13.7852 15.518V13.9017L9.77545 16.2212C9.73418 16.2453 9.6912 16.2625 9.64649 16.2763C9.60007 16.2883 9.55364 16.2935 9.5055 16.2935C9.45907 16.2935 9.41265 16.2883 9.36622 16.2763C9.32152 16.2625 9.27681 16.2453 9.23554 16.2212L5.94967 14.323C5.92044 14.3058 5.87746 14.28 5.85339 14.2645C5.82244 14.4416 5.80696 14.6204 5.80696 14.7993C5.80696 14.9781 5.82415 15.1569 5.85511 15.334C5.88605 15.5094 5.9342 15.6831 5.99438 15.8516C6.05628 16.0201 6.13194 16.1817 6.22135 16.3364V16.333ZM5.35818 9.1629C5.15529 9.51539 5.02461 9.90398 4.97131 10.3063C4.918 10.7087 4.94552 11.1162 5.0504 11.51C5.15529 11.902 5.33583 12.2682 5.58343 12.5915C5.83103 12.913 6.13881 13.183 6.48958 13.3859L9.80984 15.3048C9.81328 15.3059 9.81729 15.3071 9.82188 15.3082H9.83391C9.8385 15.3082 9.84251 15.3071 9.84595 15.3048C9.84939 15.3036 9.85283 15.3019 9.85627 15.2996L11.249 14.4949L7.23926 12.1805C7.19971 12.1565 7.16189 12.1272 7.1275 12.0946C7.09418 12.0611 7.06529 12.0236 7.04153 11.9828C7.01917 11.9415 7.00026 11.8985 6.98822 11.8521C6.97619 11.8074 6.96931 11.761 6.97103 11.7128V7.80797C6.80252 7.86987 6.63917 7.94553 6.48442 8.03494C6.32967 8.12607 6.18352 8.22924 6.04596 8.34444C5.91013 8.45965 5.78289 8.58688 5.66769 8.72444C5.55248 8.86028 5.45103 9.00815 5.36162 9.1629H5.35818ZM16.7633 11.8177C16.8046 11.8418 16.8424 11.8693 16.8768 11.9037C16.9094 11.9364 16.9387 11.9742 16.9628 12.0155C16.9851 12.0567 17.004 12.1014 17.0161 12.1461C17.0264 12.1926 17.0332 12.239 17.0315 12.2871V16.192C17.5835 15.9891 18.0649 15.6332 18.4208 15.1655C18.7785 14.6978 18.9934 14.139 19.0433 13.5544C19.0931 12.9698 18.9762 12.3817 18.7046 11.8607C18.4329 11.3397 18.0185 10.9064 17.5095 10.6141L14.1893 8.69521C14.1858 8.69406 14.1818 8.69292 14.1772 8.69177H14.1652C14.1618 8.69292 14.1578 8.69406 14.1532 8.69521C14.1497 8.69636 14.1463 8.69808 14.1429 8.70037L12.757 9.50163L16.7667 11.8177H16.7633ZM18.1475 9.7372H18.1457V9.73892L18.1475 9.7372ZM18.1457 9.73548C18.2455 9.15774 18.1784 8.56281 17.9514 8.02119C17.7262 7.47956 17.3496 7.01359 16.8682 6.67658C16.3867 6.34128 15.8193 6.1487 15.233 6.12291C14.6449 6.09884 14.0638 6.24155 13.5548 6.53386L10.2345 8.45105C10.2311 8.45334 10.2282 8.45621 10.2259 8.45965L10.2191 8.46996C10.2179 8.4734 10.2168 8.47741 10.2156 8.482C10.2145 8.48544 10.2139 8.48945 10.2139 8.49403V10.0966L14.2237 7.78046C14.2649 7.75639 14.3096 7.7392 14.3543 7.72544C14.4008 7.7134 14.4472 7.70825 14.4936 7.70825C14.5418 7.70825 14.5882 7.7134 14.6346 7.72544C14.6793 7.7392 14.7223 7.75639 14.7636 7.78046L18.0494 9.67874C18.0787 9.69593 18.1217 9.72 18.1457 9.73548ZM9.45735 7.96101C9.45735 7.91458 9.46423 7.86816 9.47627 7.82173C9.4883 7.77702 9.5055 7.73232 9.52957 7.69105C9.55364 7.6515 9.58115 7.61368 9.61554 7.57929C9.64821 7.54662 9.68604 7.51739 9.72731 7.49503L13.0132 5.59848C13.0441 5.57957 13.0871 5.55549 13.1112 5.54346C12.6607 5.1669 12.1105 4.92618 11.5276 4.85224C10.9447 4.77658 10.3532 4.86943 9.82188 5.11875C9.28885 5.36807 8.83835 5.76527 8.52369 6.26047C8.20903 6.75739 8.04224 7.33169 8.04224 7.91974V11.7541C8.04339 11.7587 8.04454 11.7627 8.04568 11.7661C8.04683 11.7696 8.04855 11.773 8.05084 11.7765C8.05313 11.7799 8.056 11.7833 8.05944 11.7868C8.06173 11.7891 8.06517 11.7914 8.06976 11.7937L9.45735 12.5949V7.96101ZM10.2105 13.0282L11.997 14.0599L13.7835 13.0282V10.9666L11.9987 9.93493L10.2122 10.9666L10.2105 13.0282Z",
+					"fill": "white"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "OpenaiBlue"
+}
diff --git a/app/components/base/icons/src/public/llm/OpenaiBlue.tsx b/app/components/base/icons/src/public/llm/OpenaiBlue.tsx
new file mode 100644
index 0000000..3dc45a9
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/OpenaiBlue.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './OpenaiBlue.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'OpenaiBlue'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/OpenaiGreen.json b/app/components/base/icons/src/public/llm/OpenaiGreen.json
new file mode 100644
index 0000000..8980e85
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/OpenaiGreen.json
@@ -0,0 +1,37 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"width": "24",
+					"height": "24",
+					"rx": "6",
+					"fill": "#19C37D"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M19.7758 11.5959C19.9546 11.9948 20.0681 12.4213 20.1145 12.8563C20.1592 13.2913 20.1369 13.7315 20.044 14.1596C19.9529 14.5878 19.7947 14.9987 19.5746 15.377C19.4302 15.6298 19.2599 15.867 19.0639 16.0854C18.8696 16.3021 18.653 16.4981 18.4174 16.67C18.1801 16.842 17.9274 16.9864 17.6591 17.105C17.3926 17.222 17.1141 17.3114 16.8286 17.3698C16.6945 17.7859 16.4951 18.1797 16.2371 18.5339C15.9809 18.8881 15.6697 19.1993 15.3155 19.4555C14.9613 19.7134 14.5693 19.9129 14.1532 20.047C13.7371 20.1829 13.302 20.2499 12.8636 20.2499C12.573 20.2516 12.2807 20.2207 11.9953 20.1622C11.7116 20.102 11.433 20.0109 11.1665 19.8923C10.9 19.7736 10.6472 19.6258 10.4116 19.4538C10.1778 19.2819 9.96115 19.0841 9.76857 18.8658C9.33871 18.9586 8.89853 18.981 8.46351 18.9363C8.02849 18.8898 7.60207 18.7763 7.20143 18.5975C6.80252 18.4204 6.43284 18.1797 6.10786 17.8857C5.78289 17.5916 5.50606 17.2478 5.28769 16.8695C5.14153 16.6167 5.02117 16.3502 4.93004 16.0734C4.83891 15.7965 4.77873 15.5111 4.74778 15.2205C4.71683 14.9317 4.71855 14.6393 4.7495 14.3488C4.78045 14.0599 4.84407 13.7745 4.9352 13.4976C4.64289 13.1727 4.40217 12.803 4.22335 12.4041C4.04624 12.0034 3.93104 11.5787 3.88634 11.1437C3.83991 10.7087 3.86398 10.2685 3.95511 9.84036C4.04624 9.41222 4.20443 9.00127 4.42452 8.62299C4.56896 8.37023 4.73918 8.13123 4.93348 7.91458C5.12778 7.69793 5.34615 7.50191 5.58171 7.32997C5.81728 7.15802 6.07176 7.01187 6.33827 6.89495C6.6065 6.7763 6.88506 6.68861 7.17048 6.63015C7.3046 6.21232 7.50406 5.82029 7.76026 5.46608C8.01817 5.11188 8.32939 4.80066 8.6836 4.54274C9.03781 4.28654 9.42984 4.08708 9.84595 3.95125C10.2621 3.81713 10.6971 3.74835 11.1355 3.75007C11.4261 3.74835 11.7184 3.77758 12.0039 3.83776C12.2893 3.89794 12.5678 3.98736 12.8344 4.106C13.1009 4.22636 13.3536 4.37251 13.5892 4.54446C13.8248 4.71812 14.0414 4.91414 14.234 5.13251C14.6621 5.04138 15.1023 5.01903 15.5373 5.06373C15.9723 5.10844 16.3971 5.22364 16.7977 5.40074C17.1966 5.57957 17.5663 5.81857 17.8913 6.1126C18.2162 6.4049 18.4931 6.74707 18.7114 7.12707C18.8576 7.37811 18.9779 7.64463 19.0691 7.92318C19.1602 8.20001 19.2221 8.48544 19.2513 8.77602C19.2823 9.06661 19.2823 9.35892 19.2496 9.64951C19.2187 9.94009 19.155 10.2255 19.0639 10.5024C19.3579 10.8273 19.5969 11.1953 19.7758 11.5959ZM14.0466 18.9363C14.4214 18.7815 14.7619 18.5528 15.049 18.2657C15.3362 17.9785 15.5648 17.6381 15.7196 17.2615C15.8743 16.8867 15.9552 16.4843 15.9552 16.0785V12.2442C15.954 12.2407 15.9529 12.2367 15.9517 12.2321C15.9506 12.2287 15.9488 12.2252 15.9466 12.2218C15.9443 12.2184 15.9414 12.2155 15.938 12.2132C15.9345 12.2098 15.9311 12.2075 15.9276 12.2063L14.54 11.4051V16.0373C14.54 16.0837 14.5332 16.1318 14.5211 16.1765C14.5091 16.223 14.4919 16.2659 14.4678 16.3072C14.4438 16.3485 14.4162 16.3863 14.3819 16.419C14.3484 16.4523 14.3109 16.4812 14.2701 16.505L10.9842 18.4015C10.9567 18.4187 10.9103 18.4428 10.8862 18.4565C11.0221 18.5717 11.1699 18.6732 11.3247 18.7626C11.4811 18.852 11.6428 18.9277 11.8113 18.9896C11.9798 19.0497 12.1535 19.0962 12.3288 19.1271C12.5059 19.1581 12.6848 19.1735 12.8636 19.1735C13.2694 19.1735 13.6717 19.0927 14.0466 18.9363ZM6.22135 16.333C6.42596 16.6855 6.69592 16.9916 7.01745 17.2392C7.34071 17.4868 7.70695 17.6673 8.09899 17.7722C8.49102 17.8771 8.90025 17.9046 9.3026 17.8513C9.70495 17.798 10.0918 17.6673 10.4443 17.4644L13.7663 15.5472L13.7749 15.5386C13.7772 15.5363 13.7789 15.5329 13.78 15.5283C13.7823 15.5249 13.7841 15.5214 13.7852 15.518V13.9017L9.77545 16.2212C9.73418 16.2453 9.6912 16.2625 9.64649 16.2763C9.60007 16.2883 9.55364 16.2935 9.5055 16.2935C9.45907 16.2935 9.41265 16.2883 9.36622 16.2763C9.32152 16.2625 9.27681 16.2453 9.23554 16.2212L5.94967 14.323C5.92044 14.3058 5.87746 14.28 5.85339 14.2645C5.82244 14.4416 5.80696 14.6204 5.80696 14.7993C5.80696 14.9781 5.82415 15.1569 5.85511 15.334C5.88605 15.5094 5.9342 15.6831 5.99438 15.8516C6.05628 16.0201 6.13194 16.1817 6.22135 16.3364V16.333ZM5.35818 9.1629C5.15529 9.51539 5.02461 9.90398 4.97131 10.3063C4.918 10.7087 4.94552 11.1162 5.0504 11.51C5.15529 11.902 5.33583 12.2682 5.58343 12.5915C5.83103 12.913 6.13881 13.183 6.48958 13.3859L9.80984 15.3048C9.81328 15.3059 9.81729 15.3071 9.82188 15.3082H9.83391C9.8385 15.3082 9.84251 15.3071 9.84595 15.3048C9.84939 15.3036 9.85283 15.3019 9.85627 15.2996L11.249 14.4949L7.23926 12.1805C7.19971 12.1565 7.16189 12.1272 7.1275 12.0946C7.09418 12.0611 7.06529 12.0236 7.04153 11.9828C7.01917 11.9415 7.00026 11.8985 6.98822 11.8521C6.97619 11.8074 6.96931 11.761 6.97103 11.7128V7.80797C6.80252 7.86987 6.63917 7.94553 6.48442 8.03494C6.32967 8.12607 6.18352 8.22924 6.04596 8.34444C5.91013 8.45965 5.78289 8.58688 5.66769 8.72444C5.55248 8.86028 5.45103 9.00815 5.36162 9.1629H5.35818ZM16.7633 11.8177C16.8046 11.8418 16.8424 11.8693 16.8768 11.9037C16.9094 11.9364 16.9387 11.9742 16.9628 12.0155C16.9851 12.0567 17.004 12.1014 17.0161 12.1461C17.0264 12.1926 17.0332 12.239 17.0315 12.2871V16.192C17.5835 15.9891 18.0649 15.6332 18.4208 15.1655C18.7785 14.6978 18.9934 14.139 19.0433 13.5544C19.0931 12.9698 18.9762 12.3817 18.7046 11.8607C18.4329 11.3397 18.0185 10.9064 17.5095 10.6141L14.1893 8.69521C14.1858 8.69406 14.1818 8.69292 14.1772 8.69177H14.1652C14.1618 8.69292 14.1578 8.69406 14.1532 8.69521C14.1497 8.69636 14.1463 8.69808 14.1429 8.70037L12.757 9.50163L16.7667 11.8177H16.7633ZM18.1475 9.7372H18.1457V9.73892L18.1475 9.7372ZM18.1457 9.73548C18.2455 9.15774 18.1784 8.56281 17.9514 8.02119C17.7262 7.47956 17.3496 7.01359 16.8682 6.67658C16.3867 6.34128 15.8193 6.1487 15.233 6.12291C14.6449 6.09884 14.0638 6.24155 13.5548 6.53386L10.2345 8.45105C10.2311 8.45334 10.2282 8.45621 10.2259 8.45965L10.2191 8.46996C10.2179 8.4734 10.2168 8.47741 10.2156 8.482C10.2145 8.48544 10.2139 8.48945 10.2139 8.49403V10.0966L14.2237 7.78046C14.2649 7.75639 14.3096 7.7392 14.3543 7.72544C14.4008 7.7134 14.4472 7.70825 14.4936 7.70825C14.5418 7.70825 14.5882 7.7134 14.6346 7.72544C14.6793 7.7392 14.7223 7.75639 14.7636 7.78046L18.0494 9.67874C18.0787 9.69593 18.1217 9.72 18.1457 9.73548ZM9.45735 7.96101C9.45735 7.91458 9.46423 7.86816 9.47627 7.82173C9.4883 7.77702 9.5055 7.73232 9.52957 7.69105C9.55364 7.6515 9.58115 7.61368 9.61554 7.57929C9.64821 7.54662 9.68604 7.51739 9.72731 7.49503L13.0132 5.59848C13.0441 5.57957 13.0871 5.55549 13.1112 5.54346C12.6607 5.1669 12.1105 4.92618 11.5276 4.85224C10.9447 4.77658 10.3532 4.86943 9.82188 5.11875C9.28885 5.36807 8.83835 5.76527 8.52369 6.26047C8.20903 6.75739 8.04224 7.33169 8.04224 7.91974V11.7541C8.04339 11.7587 8.04454 11.7627 8.04568 11.7661C8.04683 11.7696 8.04855 11.773 8.05084 11.7765C8.05313 11.7799 8.056 11.7833 8.05944 11.7868C8.06173 11.7891 8.06517 11.7914 8.06976 11.7937L9.45735 12.5949V7.96101ZM10.2105 13.0282L11.997 14.0599L13.7835 13.0282V10.9666L11.9987 9.93493L10.2122 10.9666L10.2105 13.0282Z",
+					"fill": "white"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "OpenaiGreen"
+}
diff --git a/app/components/base/icons/src/public/llm/OpenaiGreen.tsx b/app/components/base/icons/src/public/llm/OpenaiGreen.tsx
new file mode 100644
index 0000000..36f967c
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/OpenaiGreen.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './OpenaiGreen.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'OpenaiGreen'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/OpenaiText.json b/app/components/base/icons/src/public/llm/OpenaiText.json
new file mode 100644
index 0000000..f5fc3de
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/OpenaiText.json
@@ -0,0 +1,77 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "52",
+			"height": "20",
+			"viewBox": "0 0 52 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M0.00390625 8.70054C0.00390625 12.058 2.16008 14.399 5.14793 14.399C8.13577 14.399 10.2919 12.058 10.2919 8.70054C10.2919 5.34307 8.13577 3.00208 5.14793 3.00208C2.16008 3.00208 0.00390625 5.34307 0.00390625 8.70054ZM8.32058 8.70054C8.32058 11.1031 7.01148 12.6587 5.14793 12.6587C3.28437 12.6587 1.97527 11.1031 1.97527 8.70054C1.97527 6.29794 3.28437 4.74242 5.14793 4.74242C7.01148 4.74242 8.32058 6.29794 8.32058 8.70054Z",
+					"fill": "black",
+					"fill-opacity": "0.92"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M15.8456 14.3975C18.1096 14.3975 19.4033 12.4877 19.4033 10.1929C19.4033 7.89816 18.1096 5.9884 15.8456 5.9884C14.7983 5.9884 14.0283 6.40424 13.52 7.00489V6.14242H11.6719V17.0003H13.52V13.381C14.0283 13.9817 14.7983 14.3975 15.8456 14.3975ZM13.4738 9.96193C13.4738 8.4372 14.3363 7.60554 15.476 7.60554C16.8159 7.60554 17.5398 8.65282 17.5398 10.1929C17.5398 11.7331 16.8159 12.7804 15.476 12.7804C14.3363 12.7804 13.4738 11.9333 13.4738 10.4394V9.96193Z",
+					"fill": "black",
+					"fill-opacity": "0.92"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M24.4039 14.3975C26.021 14.3975 27.2993 13.5504 27.8692 12.1335L26.2828 11.5329C26.0364 12.3645 25.3126 12.8266 24.4039 12.8266C23.218 12.8266 22.3863 11.9795 22.2477 10.5934H27.9154V9.97733C27.9154 7.75955 26.6679 5.9884 24.3269 5.9884C21.9859 5.9884 20.4766 7.82115 20.4766 10.1929C20.4766 12.6879 22.0937 14.3975 24.4039 14.3975ZM24.3115 7.54393C25.482 7.54393 26.0364 8.31399 26.0518 9.20727H22.3401C22.6173 8.11378 23.3566 7.54393 24.3115 7.54393Z",
+					"fill": "black",
+					"fill-opacity": "0.92"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M29.3008 14.2281H31.1489V9.48449C31.1489 8.32939 31.996 7.71334 32.8277 7.71334C33.8442 7.71334 34.2446 8.4372 34.2446 9.43828V14.2281H36.0927V8.89924C36.0927 7.1589 35.0763 5.9884 33.3821 5.9884C32.3348 5.9884 31.611 6.46584 31.1489 7.00489V6.14242H29.3008V14.2281Z",
+					"fill": "black",
+					"fill-opacity": "0.92"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M41.5095 3.172L37.3203 14.2301H39.2763L40.2157 11.7043H44.9901L45.945 14.2301H47.9318L43.7426 3.172H41.5095ZM42.5875 5.35898L44.3433 9.97935H40.8626L42.5875 5.35898Z",
+					"fill": "black",
+					"fill-opacity": "0.92"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M51.1042 3.20325H49.1328V14.2613H51.1042V3.20325Z",
+					"fill": "black",
+					"fill-opacity": "0.92"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "OpenaiText"
+}
diff --git a/app/components/base/icons/src/public/llm/OpenaiText.tsx b/app/components/base/icons/src/public/llm/OpenaiText.tsx
new file mode 100644
index 0000000..f07995d
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/OpenaiText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './OpenaiText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'OpenaiText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/OpenaiTransparent.json b/app/components/base/icons/src/public/llm/OpenaiTransparent.json
new file mode 100644
index 0000000..13b9cb4
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/OpenaiTransparent.json
@@ -0,0 +1,26 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M21.276 10.0045C21.7751 8.50639 21.6033 6.86529 20.8051 5.50264C19.6048 3.41259 17.1917 2.33732 14.835 2.84333C13.7866 1.66218 12.2803 0.990477 10.7011 1.0001C8.29218 0.994602 6.15478 2.54563 5.41367 4.83781C3.86614 5.15475 2.53036 6.12346 1.74869 7.49643C0.539398 9.58097 0.81508 12.2087 2.43067 13.9962C1.93156 15.4943 2.10343 17.1354 2.9016 18.498C4.10195 20.5881 6.51502 21.6634 8.87173 21.1573C9.91945 22.3385 11.4264 23.0102 13.0056 22.9999C15.4159 23.0061 17.554 21.4537 18.2951 19.1594C19.8426 18.8425 21.1784 17.8738 21.9601 16.5008C23.168 14.4163 22.8916 11.7906 21.2767 10.0031L21.276 10.0045ZM13.007 21.5623C12.0424 21.5637 11.1081 21.2261 10.3677 20.608C10.4014 20.5901 10.4598 20.5578 10.4976 20.5345L14.8783 18.0044C15.1024 17.8772 15.2399 17.6386 15.2385 17.3808V11.2049L17.0899 12.274C17.1099 12.2836 17.1229 12.3028 17.1257 12.3248V17.4393C17.1229 19.7136 15.2812 21.5575 13.007 21.5623ZM4.14939 17.7789C3.66608 16.9443 3.49215 15.9659 3.65783 15.0165C3.69015 15.0357 3.74721 15.0708 3.78777 15.0942L8.16843 17.6242C8.39049 17.7541 8.66548 17.7541 8.88823 17.6242L14.2362 14.5359V16.6741C14.2376 16.6961 14.2272 16.7174 14.2101 16.7311L9.78196 19.288C7.80956 20.4238 5.29061 19.7486 4.15007 17.7789H4.14939ZM2.99647 8.21626C3.47771 7.38024 4.23738 6.74085 5.14212 6.40878C5.14212 6.44659 5.14005 6.51328 5.14005 6.56003V11.6208C5.13868 11.878 5.27618 12.1165 5.49961 12.2437L10.8476 15.3313L8.99616 16.4004C8.9776 16.4128 8.95422 16.4149 8.9336 16.4059L4.50482 13.847C2.53654 12.7071 1.86143 10.1887 2.99578 8.21694L2.99647 8.21626ZM18.2078 11.7563L12.8598 8.66795L14.7112 7.59956C14.7298 7.58718 14.7532 7.58512 14.7738 7.59406L19.2026 10.1509C21.1743 11.2901 21.8501 13.8126 20.7109 15.7844C20.229 16.6191 19.47 17.2584 18.566 17.5912V12.3792C18.568 12.122 18.4312 11.8841 18.2085 11.7563H18.2078ZM20.0502 8.98284C20.0179 8.9629 19.9609 8.92852 19.9203 8.90515L15.5397 6.37509C15.3176 6.24515 15.0426 6.24515 14.8199 6.37509L9.4719 9.46341V7.32524C9.47053 7.30324 9.48084 7.28192 9.49803 7.26817L13.9261 4.71337C15.8985 3.57553 18.4202 4.25273 19.5573 6.2259C20.0379 7.05917 20.2118 8.03475 20.0489 8.98284H20.0502ZM8.46542 12.7937L6.61334 11.7246C6.5934 11.715 6.58034 11.6958 6.57759 11.6738V6.55935C6.57896 4.2823 8.42624 2.43701 10.7032 2.43838C11.6664 2.43838 12.5986 2.77664 13.339 3.39265C13.3053 3.41053 13.2476 3.44284 13.2091 3.46622L8.82841 5.99627C8.60429 6.12346 8.4668 6.36134 8.46817 6.61916L8.46542 12.7924V12.7937ZM9.47121 10.6253L11.8534 9.24959L14.2355 10.6246V13.3754L11.8534 14.7504L9.47121 13.3754V10.6253Z",
+					"fill": "black"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "OpenaiTransparent"
+}
diff --git a/app/components/base/icons/src/public/llm/OpenaiTransparent.tsx b/app/components/base/icons/src/public/llm/OpenaiTransparent.tsx
new file mode 100644
index 0000000..0a90287
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/OpenaiTransparent.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './OpenaiTransparent.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'OpenaiTransparent'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/OpenaiViolet.json b/app/components/base/icons/src/public/llm/OpenaiViolet.json
new file mode 100644
index 0000000..efff2fe
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/OpenaiViolet.json
@@ -0,0 +1,37 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"width": "24",
+					"height": "24",
+					"rx": "6",
+					"fill": "#AB68FF"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M19.7758 11.5959C19.9546 11.9948 20.0681 12.4213 20.1145 12.8563C20.1592 13.2913 20.1369 13.7315 20.044 14.1596C19.9529 14.5878 19.7947 14.9987 19.5746 15.377C19.4302 15.6298 19.2599 15.867 19.0639 16.0854C18.8696 16.3021 18.653 16.4981 18.4174 16.67C18.1801 16.842 17.9274 16.9864 17.6591 17.105C17.3926 17.222 17.1141 17.3114 16.8286 17.3698C16.6945 17.7859 16.4951 18.1797 16.2371 18.5339C15.9809 18.8881 15.6697 19.1993 15.3155 19.4555C14.9613 19.7134 14.5693 19.9129 14.1532 20.047C13.7371 20.1829 13.302 20.2499 12.8636 20.2499C12.573 20.2516 12.2807 20.2207 11.9953 20.1622C11.7116 20.102 11.433 20.0109 11.1665 19.8923C10.9 19.7736 10.6472 19.6258 10.4116 19.4538C10.1778 19.2819 9.96115 19.0841 9.76857 18.8658C9.33871 18.9586 8.89853 18.981 8.46351 18.9363C8.02849 18.8898 7.60207 18.7763 7.20143 18.5975C6.80252 18.4204 6.43284 18.1797 6.10786 17.8857C5.78289 17.5916 5.50606 17.2478 5.28769 16.8695C5.14153 16.6167 5.02117 16.3502 4.93004 16.0734C4.83891 15.7965 4.77873 15.5111 4.74778 15.2205C4.71683 14.9317 4.71855 14.6393 4.7495 14.3488C4.78045 14.0599 4.84407 13.7745 4.9352 13.4976C4.64289 13.1727 4.40217 12.803 4.22335 12.4041C4.04624 12.0034 3.93104 11.5787 3.88634 11.1437C3.83991 10.7087 3.86398 10.2685 3.95511 9.84036C4.04624 9.41222 4.20443 9.00127 4.42452 8.62299C4.56896 8.37023 4.73918 8.13123 4.93348 7.91458C5.12778 7.69793 5.34615 7.50191 5.58171 7.32997C5.81728 7.15802 6.07176 7.01187 6.33827 6.89495C6.6065 6.7763 6.88506 6.68861 7.17048 6.63015C7.3046 6.21232 7.50406 5.82029 7.76026 5.46608C8.01817 5.11188 8.32939 4.80066 8.6836 4.54274C9.03781 4.28654 9.42984 4.08708 9.84595 3.95125C10.2621 3.81713 10.6971 3.74835 11.1355 3.75007C11.4261 3.74835 11.7184 3.77758 12.0039 3.83776C12.2893 3.89794 12.5678 3.98736 12.8344 4.106C13.1009 4.22636 13.3536 4.37251 13.5892 4.54446C13.8248 4.71812 14.0414 4.91414 14.234 5.13251C14.6621 5.04138 15.1023 5.01903 15.5373 5.06373C15.9723 5.10844 16.3971 5.22364 16.7977 5.40074C17.1966 5.57957 17.5663 5.81857 17.8913 6.1126C18.2162 6.4049 18.4931 6.74707 18.7114 7.12707C18.8576 7.37811 18.9779 7.64463 19.0691 7.92318C19.1602 8.20001 19.2221 8.48544 19.2513 8.77602C19.2823 9.06661 19.2823 9.35892 19.2496 9.64951C19.2187 9.94009 19.155 10.2255 19.0639 10.5024C19.3579 10.8273 19.5969 11.1953 19.7758 11.5959ZM14.0466 18.9363C14.4214 18.7815 14.7619 18.5528 15.049 18.2657C15.3362 17.9785 15.5648 17.6381 15.7196 17.2615C15.8743 16.8867 15.9552 16.4843 15.9552 16.0785V12.2442C15.954 12.2407 15.9529 12.2367 15.9517 12.2321C15.9506 12.2287 15.9488 12.2252 15.9466 12.2218C15.9443 12.2184 15.9414 12.2155 15.938 12.2132C15.9345 12.2098 15.9311 12.2075 15.9276 12.2063L14.54 11.4051V16.0373C14.54 16.0837 14.5332 16.1318 14.5211 16.1765C14.5091 16.223 14.4919 16.2659 14.4678 16.3072C14.4438 16.3485 14.4162 16.3863 14.3819 16.419C14.3484 16.4523 14.3109 16.4812 14.2701 16.505L10.9842 18.4015C10.9567 18.4187 10.9103 18.4428 10.8862 18.4565C11.0221 18.5717 11.1699 18.6732 11.3247 18.7626C11.4811 18.852 11.6428 18.9277 11.8113 18.9896C11.9798 19.0497 12.1535 19.0962 12.3288 19.1271C12.5059 19.1581 12.6848 19.1735 12.8636 19.1735C13.2694 19.1735 13.6717 19.0927 14.0466 18.9363ZM6.22135 16.333C6.42596 16.6855 6.69592 16.9916 7.01745 17.2392C7.34071 17.4868 7.70695 17.6673 8.09899 17.7722C8.49102 17.8771 8.90025 17.9046 9.3026 17.8513C9.70495 17.798 10.0918 17.6673 10.4443 17.4644L13.7663 15.5472L13.7749 15.5386C13.7772 15.5363 13.7789 15.5329 13.78 15.5283C13.7823 15.5249 13.7841 15.5214 13.7852 15.518V13.9017L9.77545 16.2212C9.73418 16.2453 9.6912 16.2625 9.64649 16.2763C9.60007 16.2883 9.55364 16.2935 9.5055 16.2935C9.45907 16.2935 9.41265 16.2883 9.36622 16.2763C9.32152 16.2625 9.27681 16.2453 9.23554 16.2212L5.94967 14.323C5.92044 14.3058 5.87746 14.28 5.85339 14.2645C5.82244 14.4416 5.80696 14.6204 5.80696 14.7993C5.80696 14.9781 5.82415 15.1569 5.85511 15.334C5.88605 15.5094 5.9342 15.6831 5.99438 15.8516C6.05628 16.0201 6.13194 16.1817 6.22135 16.3364V16.333ZM5.35818 9.1629C5.15529 9.51539 5.02461 9.90398 4.97131 10.3063C4.918 10.7087 4.94552 11.1162 5.0504 11.51C5.15529 11.902 5.33583 12.2682 5.58343 12.5915C5.83103 12.913 6.13881 13.183 6.48958 13.3859L9.80984 15.3048C9.81328 15.3059 9.81729 15.3071 9.82188 15.3082H9.83391C9.8385 15.3082 9.84251 15.3071 9.84595 15.3048C9.84939 15.3036 9.85283 15.3019 9.85627 15.2996L11.249 14.4949L7.23926 12.1805C7.19971 12.1565 7.16189 12.1272 7.1275 12.0946C7.09418 12.0611 7.06529 12.0236 7.04153 11.9828C7.01917 11.9415 7.00026 11.8985 6.98822 11.8521C6.97619 11.8074 6.96931 11.761 6.97103 11.7128V7.80797C6.80252 7.86987 6.63917 7.94553 6.48442 8.03494C6.32967 8.12607 6.18352 8.22924 6.04596 8.34444C5.91013 8.45965 5.78289 8.58688 5.66769 8.72444C5.55248 8.86028 5.45103 9.00815 5.36162 9.1629H5.35818ZM16.7633 11.8177C16.8046 11.8418 16.8424 11.8693 16.8768 11.9037C16.9094 11.9364 16.9387 11.9742 16.9628 12.0155C16.9851 12.0567 17.004 12.1014 17.0161 12.1461C17.0264 12.1926 17.0332 12.239 17.0315 12.2871V16.192C17.5835 15.9891 18.0649 15.6332 18.4208 15.1655C18.7785 14.6978 18.9934 14.139 19.0433 13.5544C19.0931 12.9698 18.9762 12.3817 18.7046 11.8607C18.4329 11.3397 18.0185 10.9064 17.5095 10.6141L14.1893 8.69521C14.1858 8.69406 14.1818 8.69292 14.1772 8.69177H14.1652C14.1618 8.69292 14.1578 8.69406 14.1532 8.69521C14.1497 8.69636 14.1463 8.69808 14.1429 8.70037L12.757 9.50163L16.7667 11.8177H16.7633ZM18.1475 9.7372H18.1457V9.73892L18.1475 9.7372ZM18.1457 9.73548C18.2455 9.15774 18.1784 8.56281 17.9514 8.02119C17.7262 7.47956 17.3496 7.01359 16.8682 6.67658C16.3867 6.34128 15.8193 6.1487 15.233 6.12291C14.6449 6.09884 14.0638 6.24155 13.5548 6.53386L10.2345 8.45105C10.2311 8.45334 10.2282 8.45621 10.2259 8.45965L10.2191 8.46996C10.2179 8.4734 10.2168 8.47741 10.2156 8.482C10.2145 8.48544 10.2139 8.48945 10.2139 8.49403V10.0966L14.2237 7.78046C14.2649 7.75639 14.3096 7.7392 14.3543 7.72544C14.4008 7.7134 14.4472 7.70825 14.4936 7.70825C14.5418 7.70825 14.5882 7.7134 14.6346 7.72544C14.6793 7.7392 14.7223 7.75639 14.7636 7.78046L18.0494 9.67874C18.0787 9.69593 18.1217 9.72 18.1457 9.73548ZM9.45735 7.96101C9.45735 7.91458 9.46423 7.86816 9.47627 7.82173C9.4883 7.77702 9.5055 7.73232 9.52957 7.69105C9.55364 7.6515 9.58115 7.61368 9.61554 7.57929C9.64821 7.54662 9.68604 7.51739 9.72731 7.49503L13.0132 5.59848C13.0441 5.57957 13.0871 5.55549 13.1112 5.54346C12.6607 5.1669 12.1105 4.92618 11.5276 4.85224C10.9447 4.77658 10.3532 4.86943 9.82188 5.11875C9.28885 5.36807 8.83835 5.76527 8.52369 6.26047C8.20903 6.75739 8.04224 7.33169 8.04224 7.91974V11.7541C8.04339 11.7587 8.04454 11.7627 8.04568 11.7661C8.04683 11.7696 8.04855 11.773 8.05084 11.7765C8.05313 11.7799 8.056 11.7833 8.05944 11.7868C8.06173 11.7891 8.06517 11.7914 8.06976 11.7937L9.45735 12.5949V7.96101ZM10.2105 13.0282L11.997 14.0599L13.7835 13.0282V10.9666L11.9987 9.93493L10.2122 10.9666L10.2105 13.0282Z",
+					"fill": "white"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "OpenaiViolet"
+}
diff --git a/app/components/base/icons/src/public/llm/OpenaiViolet.tsx b/app/components/base/icons/src/public/llm/OpenaiViolet.tsx
new file mode 100644
index 0000000..03e2864
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/OpenaiViolet.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './OpenaiViolet.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'OpenaiViolet'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/Openllm.json b/app/components/base/icons/src/public/llm/Openllm.json
new file mode 100644
index 0000000..93eec11
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Openllm.json
@@ -0,0 +1,83 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Camada_2",
+					"clip-path": "url(#clip0_9866_5923)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M23.9181 1.27026C23.8737 1.12859 23.813 0.994621 23.7379 0.871257C23.6473 0.721871 23.5355 0.586942 23.4073 0.470325C23.3861 0.451049 23.3639 0.431773 23.3417 0.413462C23.1856 0.284315 23.0073 0.181191 22.8136 0.109871C22.6199 0.0385512 22.4107 0 22.1929 0H5.99952C5.96289 0 5.92627 0.00192756 5.88965 0.00385512C5.87905 0.00385512 5.86748 0.00578268 5.85688 0.00674646C5.83086 0.00867402 5.80387 0.0115654 5.77785 0.0144567C5.76628 0.0154205 5.75568 0.017348 5.74508 0.0183118C5.71424 0.0231307 5.6834 0.0279496 5.65256 0.0337323C5.64774 0.0337323 5.64388 0.0356599 5.63906 0.0356599C5.60437 0.0424063 5.56967 0.0510803 5.53594 0.0597543C5.5263 0.0626457 5.51666 0.065537 5.50703 0.0674646C5.48197 0.074211 5.45691 0.0819213 5.43185 0.0905953C5.42125 0.0944504 5.41065 0.0973418 5.40101 0.101197C5.37403 0.110835 5.34704 0.120472 5.32102 0.132038C5.31524 0.134929 5.30849 0.136857 5.30271 0.139748C5.2709 0.153241 5.2391 0.167698 5.20729 0.183118C5.19958 0.186973 5.19187 0.190828 5.18416 0.194684C5.16007 0.207213 5.13694 0.219742 5.11381 0.232271C5.10417 0.23709 5.09549 0.242873 5.08586 0.247691C5.06273 0.261184 5.0396 0.275641 5.01646 0.291062C5.00972 0.294917 5.00297 0.299736 4.99719 0.303591C4.96828 0.322866 4.94033 0.343106 4.91238 0.363345C4.90659 0.3672 4.90177 0.372019 4.89696 0.375874C4.87479 0.393222 4.85262 0.41057 4.83142 0.428882C4.82371 0.435628 4.816 0.442375 4.80829 0.449121C4.78805 0.466469 4.76877 0.484781 4.7495 0.503093C4.74372 0.508876 4.73697 0.514658 4.73119 0.520441C4.72058 0.531043 4.70998 0.541644 4.70035 0.552246C4.70035 0.552246 4.70035 0.551282 4.70131 0.550318L0.450084 4.37942C0.161915 4.66759 0 5.05792 0 5.4656V22.5592C0 23.4073 0.687174 24.0955 1.53626 24.0955H18.6298C19.0375 24.0955 19.4278 23.9335 19.716 23.6454L23.5383 19.2072C23.6077 19.1291 23.6714 19.0453 23.7263 18.9566C23.7282 18.9537 23.7301 18.9498 23.7321 18.9469C23.7427 18.9296 23.7523 18.9123 23.7629 18.8949C23.7668 18.8882 23.7706 18.8814 23.7745 18.8747C23.7831 18.8583 23.7918 18.8429 23.8005 18.8265C23.8053 18.8178 23.8101 18.8091 23.814 18.7995C23.8217 18.7841 23.8284 18.7686 23.8362 18.7532C23.841 18.7426 23.8458 18.733 23.8497 18.7224C23.8564 18.7079 23.8622 18.6925 23.8689 18.6771C23.8737 18.6655 23.8786 18.654 23.8824 18.6424C23.8882 18.6279 23.893 18.6135 23.8988 18.5981C23.9036 18.5855 23.9075 18.573 23.9113 18.5605C23.9162 18.546 23.921 18.5316 23.9248 18.5171C23.9287 18.5036 23.9325 18.4901 23.9364 18.4766C23.9402 18.4631 23.9441 18.4487 23.947 18.4342C23.9508 18.4198 23.9537 18.4053 23.9566 18.3908C23.9595 18.3774 23.9624 18.3639 23.9653 18.3504C23.9682 18.3349 23.9711 18.3195 23.974 18.3041C23.9759 18.2906 23.9788 18.2781 23.9807 18.2646C23.9836 18.2482 23.9855 18.2309 23.9875 18.2145C23.9894 18.2019 23.9904 18.1904 23.9923 18.1779C23.9942 18.1586 23.9952 18.1393 23.9971 18.12C23.9971 18.1094 23.999 18.0998 23.999 18.0892C24.001 18.0593 24.001 18.0294 24.001 17.9996V1.80709C24.001 1.62011 23.972 1.43989 23.92 1.27026H23.9181ZM22.1929 0.541644C22.4107 0.541644 22.616 0.597543 22.7953 0.694885C22.8849 0.744038 22.9678 0.802829 23.043 0.871257C23.0584 0.88475 23.0728 0.899207 23.0873 0.9127C23.1162 0.941613 23.1432 0.97149 23.1692 1.00233C23.1952 1.03317 23.2193 1.06594 23.2425 1.09967C23.3793 1.30207 23.4584 1.54494 23.4584 1.80612V17.9996C23.4584 18.0362 23.4564 18.0718 23.4535 18.1075C23.4535 18.1114 23.4535 18.1162 23.4535 18.12C23.4506 18.1538 23.4458 18.1875 23.44 18.2203C23.44 18.2251 23.4381 18.2299 23.4372 18.2357C23.4304 18.2684 23.4237 18.3012 23.415 18.333C23.414 18.3369 23.4131 18.3407 23.4121 18.3446C23.4025 18.3783 23.3919 18.4111 23.3803 18.4429C23.3803 18.4439 23.3803 18.4448 23.3793 18.4458C23.3408 18.5489 23.2887 18.6443 23.2251 18.733V18.7349C23.203 18.7638 23.1808 18.7927 23.1577 18.8197C23.1432 18.8361 23.1287 18.8525 23.1133 18.8689C23.1133 18.8689 23.1133 18.8689 23.1124 18.8698C23.0979 18.8853 23.0825 18.9007 23.0671 18.9151C23.0671 18.9151 23.0661 18.9161 23.0651 18.9171C23.0497 18.9315 23.0333 18.946 23.0169 18.9604C23.0169 18.9604 23.0169 18.9604 23.016 18.9614C22.9312 19.0337 22.8377 19.0944 22.7355 19.1426C22.7336 19.1436 22.7317 19.1445 22.7288 19.1455C22.7114 19.1532 22.6941 19.1609 22.6758 19.1686C22.6709 19.1705 22.6661 19.1725 22.6613 19.1744C22.6459 19.1802 22.6305 19.186 22.615 19.1917C22.6083 19.1937 22.6025 19.1956 22.5958 19.1985C22.5813 19.2033 22.5669 19.2081 22.5524 19.212C22.5447 19.2139 22.5379 19.2158 22.5302 19.2178C22.5167 19.2216 22.5023 19.2255 22.4888 19.2284C22.4811 19.2303 22.4734 19.2322 22.4657 19.2342C22.4522 19.237 22.4377 19.2399 22.4242 19.2428C22.4165 19.2448 22.4078 19.2457 22.4001 19.2476C22.3857 19.2496 22.3712 19.2515 22.3568 19.2534C22.349 19.2544 22.3413 19.2554 22.3327 19.2563C22.3172 19.2582 22.3009 19.2592 22.2845 19.2602C22.2777 19.2602 22.271 19.2611 22.2642 19.2621C22.2411 19.2631 22.2189 19.264 22.1958 19.264H5.99952C5.65063 19.264 5.33451 19.1224 5.10513 18.893C5.04827 18.8361 4.99622 18.7735 4.95093 18.706C4.8372 18.5373 4.76299 18.3407 4.74082 18.1287C4.73697 18.0863 4.73408 18.0429 4.73408 17.9996V1.80709C4.73408 1.78299 4.73408 1.75986 4.736 1.73673C4.736 1.72902 4.73697 1.72227 4.73793 1.71456C4.7389 1.69818 4.74082 1.68276 4.74179 1.66638C4.74179 1.6577 4.74372 1.64999 4.74468 1.64132C4.74661 1.62686 4.74853 1.61144 4.75143 1.59698C4.75239 1.58831 4.75432 1.5806 4.75624 1.57192C4.75914 1.55747 4.76203 1.54205 4.76588 1.52759C4.76781 1.51988 4.76974 1.51217 4.7707 1.50446C4.77456 1.48808 4.77938 1.47169 4.78419 1.45531C4.78612 1.44952 4.78709 1.44374 4.78901 1.43892C4.80251 1.39459 4.81889 1.35122 4.83624 1.30881C4.83624 1.30881 4.83624 1.30689 4.8372 1.30689C4.84588 1.28665 4.85551 1.26641 4.86515 1.24713C4.86708 1.24424 4.86804 1.24038 4.86997 1.23749C4.87864 1.22015 4.88828 1.2028 4.89792 1.18641C4.89985 1.18256 4.90177 1.17967 4.9037 1.17678C4.91334 1.15943 4.92394 1.14304 4.93454 1.12666C4.93647 1.12377 4.93743 1.12184 4.93936 1.11895C4.95189 1.10064 4.96442 1.08232 4.97695 1.06401C5.04634 0.969563 5.12826 0.883786 5.22079 0.811503C5.30078 0.748857 5.38752 0.695849 5.48101 0.654406C5.48293 0.654406 5.48486 0.652479 5.48679 0.651515C5.51666 0.638022 5.54751 0.626457 5.57835 0.614892C5.58027 0.614892 5.58317 0.612964 5.58509 0.612964C5.64678 0.591761 5.71038 0.575377 5.77496 0.562847C5.77978 0.562847 5.7846 0.56092 5.79038 0.559956C5.82122 0.555137 5.85206 0.551282 5.88386 0.548391C5.88965 0.548391 5.89543 0.548391 5.90025 0.547427C5.93302 0.544536 5.96579 0.543572 5.99855 0.543572H22.192L22.1929 0.541644Z",
+							"fill": "black"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M16.2794 11.0016C16.8867 11.0016 17.379 10.5093 17.379 9.90192C17.379 9.29459 16.8867 8.80225 16.2794 8.80225C15.672 8.80225 15.1797 9.29459 15.1797 9.90192C15.1797 10.5093 15.672 11.0016 16.2794 11.0016Z",
+							"fill": "black"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_3",
+							"d": "M11.9219 11.0016C12.5293 11.0016 13.0216 10.5093 13.0216 9.90192C13.0216 9.29459 12.5293 8.80225 11.9219 8.80225C11.3146 8.80225 10.8223 9.29459 10.8223 9.90192C10.8223 10.5093 11.3146 11.0016 11.9219 11.0016Z",
+							"fill": "black"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_9866_5923"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "24",
+									"height": "24.0945",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Openllm"
+}
diff --git a/app/components/base/icons/src/public/llm/Openllm.tsx b/app/components/base/icons/src/public/llm/Openllm.tsx
new file mode 100644
index 0000000..6497165
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Openllm.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Openllm.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Openllm'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/OpenllmText.json b/app/components/base/icons/src/public/llm/OpenllmText.json
new file mode 100644
index 0000000..d5705de
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/OpenllmText.json
@@ -0,0 +1,143 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "92",
+			"height": "25",
+			"viewBox": "0 0 92 25",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_9850_26886)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M24.9181 1.27026C24.8737 1.12859 24.813 0.994621 24.7379 0.871257C24.6473 0.721871 24.5355 0.586942 24.4073 0.470325C24.3861 0.451049 24.3639 0.431773 24.3417 0.413462C24.1856 0.284315 24.0073 0.181191 23.8136 0.109871C23.6199 0.0385512 23.4107 0 23.1929 0H6.99952C6.96289 0 6.92627 0.00192756 6.88965 0.00385512C6.87905 0.00385512 6.86748 0.00578268 6.85688 0.00674646C6.83086 0.00867402 6.80387 0.0115654 6.77785 0.0144567C6.76628 0.0154205 6.75568 0.017348 6.74508 0.0183118C6.71424 0.0231307 6.6834 0.0279496 6.65256 0.0337323C6.64774 0.0337323 6.64388 0.0356599 6.63906 0.0356599C6.60437 0.0424063 6.56967 0.0510803 6.53594 0.0597543C6.5263 0.0626457 6.51666 0.065537 6.50703 0.0674646C6.48197 0.074211 6.45691 0.0819213 6.43185 0.0905953C6.42125 0.0944504 6.41065 0.0973418 6.40101 0.101197C6.37403 0.110835 6.34704 0.120472 6.32102 0.132038C6.31524 0.134929 6.30849 0.136857 6.30271 0.139748C6.2709 0.153241 6.2391 0.167698 6.20729 0.183118C6.19958 0.186973 6.19187 0.190828 6.18416 0.194684C6.16007 0.207213 6.13694 0.219742 6.11381 0.232271C6.10417 0.23709 6.09549 0.242873 6.08586 0.247691C6.06273 0.261184 6.0396 0.275641 6.01646 0.291062C6.00972 0.294917 6.00297 0.299736 5.99719 0.303591C5.96828 0.322866 5.94033 0.343106 5.91238 0.363345C5.90659 0.3672 5.90177 0.372019 5.89696 0.375874C5.87479 0.393222 5.85262 0.41057 5.83142 0.428882C5.82371 0.435628 5.816 0.442375 5.80829 0.449121C5.78805 0.466469 5.76877 0.484781 5.7495 0.503093C5.74372 0.508876 5.73697 0.514658 5.73119 0.520441C5.72058 0.531043 5.70998 0.541644 5.70035 0.552246C5.70035 0.552246 5.70035 0.551282 5.70131 0.550318L1.45008 4.37942C1.16191 4.66759 1 5.05792 1 5.4656V22.5592C1 23.4073 1.68717 24.0955 2.53626 24.0955H19.6298C20.0375 24.0955 20.4278 23.9335 20.716 23.6454L24.5383 19.2072C24.6077 19.1291 24.6714 19.0453 24.7263 18.9566C24.7282 18.9537 24.7301 18.9498 24.7321 18.9469C24.7427 18.9296 24.7523 18.9123 24.7629 18.8949C24.7668 18.8882 24.7706 18.8814 24.7745 18.8747C24.7831 18.8583 24.7918 18.8429 24.8005 18.8265C24.8053 18.8178 24.8101 18.8091 24.814 18.7995C24.8217 18.7841 24.8284 18.7686 24.8362 18.7532C24.841 18.7426 24.8458 18.733 24.8497 18.7224C24.8564 18.7079 24.8622 18.6925 24.8689 18.6771C24.8737 18.6655 24.8786 18.654 24.8824 18.6424C24.8882 18.6279 24.893 18.6135 24.8988 18.5981C24.9036 18.5855 24.9075 18.573 24.9113 18.5605C24.9162 18.546 24.921 18.5316 24.9248 18.5171C24.9287 18.5036 24.9325 18.4901 24.9364 18.4766C24.9402 18.4631 24.9441 18.4487 24.947 18.4342C24.9508 18.4198 24.9537 18.4053 24.9566 18.3908C24.9595 18.3774 24.9624 18.3639 24.9653 18.3504C24.9682 18.3349 24.9711 18.3195 24.974 18.3041C24.9759 18.2906 24.9788 18.2781 24.9807 18.2646C24.9836 18.2482 24.9855 18.2309 24.9875 18.2145C24.9894 18.2019 24.9904 18.1904 24.9923 18.1779C24.9942 18.1586 24.9952 18.1393 24.9971 18.12C24.9971 18.1094 24.999 18.0998 24.999 18.0892C25.001 18.0593 25.001 18.0294 25.001 17.9996V1.80709C25.001 1.62011 24.972 1.43989 24.92 1.27026H24.9181ZM23.1929 0.541644C23.4107 0.541644 23.616 0.597543 23.7953 0.694885C23.8849 0.744038 23.9678 0.802829 24.043 0.871257C24.0584 0.88475 24.0728 0.899207 24.0873 0.9127C24.1162 0.941613 24.1432 0.97149 24.1692 1.00233C24.1952 1.03317 24.2193 1.06594 24.2425 1.09967C24.3793 1.30207 24.4584 1.54494 24.4584 1.80612V17.9996C24.4584 18.0362 24.4564 18.0718 24.4535 18.1075C24.4535 18.1114 24.4535 18.1162 24.4535 18.12C24.4506 18.1538 24.4458 18.1875 24.44 18.2203C24.44 18.2251 24.4381 18.2299 24.4372 18.2357C24.4304 18.2684 24.4237 18.3012 24.415 18.333C24.414 18.3369 24.4131 18.3407 24.4121 18.3446C24.4025 18.3783 24.3919 18.4111 24.3803 18.4429C24.3803 18.4439 24.3803 18.4448 24.3793 18.4458C24.3408 18.5489 24.2887 18.6443 24.2251 18.733V18.7349C24.203 18.7638 24.1808 18.7927 24.1577 18.8197C24.1432 18.8361 24.1287 18.8525 24.1133 18.8689C24.1133 18.8689 24.1133 18.8689 24.1124 18.8698C24.0979 18.8853 24.0825 18.9007 24.0671 18.9151C24.0671 18.9151 24.0661 18.9161 24.0651 18.9171C24.0497 18.9315 24.0333 18.946 24.0169 18.9604C24.0169 18.9604 24.0169 18.9604 24.016 18.9614C23.9312 19.0337 23.8377 19.0944 23.7355 19.1426C23.7336 19.1436 23.7317 19.1445 23.7288 19.1455C23.7114 19.1532 23.6941 19.1609 23.6758 19.1686C23.6709 19.1705 23.6661 19.1725 23.6613 19.1744C23.6459 19.1802 23.6305 19.186 23.615 19.1917C23.6083 19.1937 23.6025 19.1956 23.5958 19.1985C23.5813 19.2033 23.5669 19.2081 23.5524 19.212C23.5447 19.2139 23.5379 19.2158 23.5302 19.2178C23.5167 19.2216 23.5023 19.2255 23.4888 19.2284C23.4811 19.2303 23.4734 19.2322 23.4657 19.2342C23.4522 19.237 23.4377 19.2399 23.4242 19.2428C23.4165 19.2448 23.4078 19.2457 23.4001 19.2476C23.3857 19.2496 23.3712 19.2515 23.3568 19.2534C23.349 19.2544 23.3413 19.2554 23.3327 19.2563C23.3172 19.2582 23.3009 19.2592 23.2845 19.2602C23.2777 19.2602 23.271 19.2611 23.2642 19.2621C23.2411 19.2631 23.2189 19.264 23.1958 19.264H6.99952C6.65063 19.264 6.33451 19.1224 6.10513 18.893C6.04827 18.8361 5.99622 18.7735 5.95093 18.706C5.8372 18.5373 5.76299 18.3407 5.74082 18.1287C5.73697 18.0863 5.73408 18.0429 5.73408 17.9996V1.80709C5.73408 1.78299 5.73408 1.75986 5.736 1.73673C5.736 1.72902 5.73697 1.72227 5.73793 1.71456C5.7389 1.69818 5.74082 1.68276 5.74179 1.66638C5.74179 1.6577 5.74372 1.64999 5.74468 1.64132C5.74661 1.62686 5.74853 1.61144 5.75143 1.59698C5.75239 1.58831 5.75432 1.5806 5.75624 1.57192C5.75914 1.55747 5.76203 1.54205 5.76588 1.52759C5.76781 1.51988 5.76974 1.51217 5.7707 1.50446C5.77456 1.48808 5.77938 1.47169 5.78419 1.45531C5.78612 1.44952 5.78709 1.44374 5.78901 1.43892C5.80251 1.39459 5.81889 1.35122 5.83624 1.30881C5.83624 1.30881 5.83624 1.30689 5.8372 1.30689C5.84588 1.28665 5.85551 1.26641 5.86515 1.24713C5.86708 1.24424 5.86804 1.24038 5.86997 1.23749C5.87864 1.22015 5.88828 1.2028 5.89792 1.18641C5.89985 1.18256 5.90177 1.17967 5.9037 1.17678C5.91334 1.15943 5.92394 1.14304 5.93454 1.12666C5.93647 1.12377 5.93743 1.12184 5.93936 1.11895C5.95189 1.10064 5.96442 1.08232 5.97695 1.06401C6.04634 0.969563 6.12826 0.883786 6.22079 0.811503C6.30078 0.748857 6.38752 0.695849 6.48101 0.654406C6.48293 0.654406 6.48486 0.652479 6.48679 0.651515C6.51666 0.638022 6.54751 0.626457 6.57835 0.614892C6.58027 0.614892 6.58317 0.612964 6.58509 0.612964C6.64678 0.591761 6.71038 0.575377 6.77496 0.562847C6.77978 0.562847 6.7846 0.56092 6.79038 0.559956C6.82122 0.555137 6.85206 0.551282 6.88386 0.548391C6.88965 0.548391 6.89543 0.548391 6.90025 0.547427C6.93302 0.544536 6.96579 0.543572 6.99855 0.543572H23.192L23.1929 0.541644Z",
+							"fill": "black"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M17.2794 11.0016C17.8867 11.0016 18.379 10.5093 18.379 9.90192C18.379 9.29459 17.8867 8.80225 17.2794 8.80225C16.672 8.80225 16.1797 9.29459 16.1797 9.90192C16.1797 10.5093 16.672 11.0016 17.2794 11.0016Z",
+							"fill": "black"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M12.9219 11.0016C13.5293 11.0016 14.0216 10.5093 14.0216 9.90192C14.0216 9.29459 13.5293 8.80225 12.9219 8.80225C12.3146 8.80225 11.8223 9.29459 11.8223 9.90192C11.8223 10.5093 12.3146 11.0016 12.9219 11.0016Z",
+							"fill": "black"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M36.4876 17.098C35.5822 17.098 34.7469 16.888 33.9816 16.468C33.2256 16.0387 32.6236 15.446 32.1756 14.69C31.7369 13.9247 31.5176 13.066 31.5176 12.114C31.5176 11.162 31.7369 10.308 32.1756 9.55204C32.6236 8.79604 33.2256 8.20804 33.9816 7.78804C34.7469 7.35871 35.5822 7.14404 36.4876 7.14404C37.4022 7.14404 38.2376 7.35871 38.9936 7.78804C39.7589 8.20804 40.3609 8.79604 40.7996 9.55204C41.2382 10.308 41.4576 11.162 41.4576 12.114C41.4576 13.066 41.2382 13.9247 40.7996 14.69C40.3609 15.446 39.7589 16.0387 38.9936 16.468C38.2376 16.888 37.4022 17.098 36.4876 17.098ZM36.4876 15.712C37.1316 15.712 37.7056 15.5674 38.2096 15.278C38.7136 14.9794 39.1056 14.5594 39.3856 14.018C39.6749 13.4674 39.8196 12.8327 39.8196 12.114C39.8196 11.3954 39.6749 10.7654 39.3856 10.224C39.1056 9.68271 38.7136 9.26738 38.2096 8.97804C37.7056 8.68871 37.1316 8.54404 36.4876 8.54404C35.8436 8.54404 35.2696 8.68871 34.7656 8.97804C34.2616 9.26738 33.8649 9.68271 33.5756 10.224C33.2956 10.7654 33.1556 11.3954 33.1556 12.114C33.1556 12.8327 33.2956 13.4674 33.5756 14.018C33.8649 14.5594 34.2616 14.9794 34.7656 15.278C35.2696 15.5674 35.8436 15.712 36.4876 15.712Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M44.3441 10.42C44.6148 10.0654 44.9834 9.76671 45.4501 9.52404C45.9168 9.28138 46.4441 9.16004 47.0321 9.16004C47.7041 9.16004 48.3154 9.32804 48.8661 9.66404C49.4261 9.99071 49.8648 10.4527 50.1821 11.05C50.4994 11.6474 50.6581 12.3334 50.6581 13.108C50.6581 13.8827 50.4994 14.578 50.1821 15.194C49.8648 15.8007 49.4261 16.2767 48.8661 16.622C48.3154 16.958 47.7041 17.126 47.0321 17.126C46.4441 17.126 45.9214 17.0094 45.4641 16.776C45.0068 16.5334 44.6334 16.2347 44.3441 15.88V20.668H42.7481V9.28604H44.3441V10.42ZM49.0341 13.108C49.0341 12.576 48.9221 12.1187 48.6981 11.736C48.4834 11.344 48.1941 11.05 47.8301 10.854C47.4754 10.6487 47.0928 10.546 46.6821 10.546C46.2808 10.546 45.8981 10.6487 45.5341 10.854C45.1794 11.0594 44.8901 11.358 44.6661 11.75C44.4514 12.142 44.3441 12.604 44.3441 13.136C44.3441 13.668 44.4514 14.1347 44.6661 14.536C44.8901 14.928 45.1794 15.2267 45.5341 15.432C45.8981 15.6374 46.2808 15.74 46.6821 15.74C47.0928 15.74 47.4754 15.6374 47.8301 15.432C48.1941 15.2174 48.4834 14.9094 48.6981 14.508C48.9221 14.1067 49.0341 13.64 49.0341 13.108Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M59.0264 12.954C59.0264 13.2434 59.0077 13.5047 58.9704 13.738H53.0764C53.123 14.354 53.3517 14.8487 53.7624 15.222C54.173 15.5954 54.677 15.782 55.2744 15.782C56.133 15.782 56.7397 15.4227 57.0944 14.704H58.8164C58.583 15.4134 58.1584 15.9967 57.5424 16.454C56.9357 16.902 56.1797 17.126 55.2744 17.126C54.537 17.126 53.8744 16.9627 53.2864 16.636C52.7077 16.3 52.2504 15.8334 51.9144 15.236C51.5877 14.6294 51.4244 13.9294 51.4244 13.136C51.4244 12.3427 51.583 11.6474 51.9004 11.05C52.227 10.4434 52.6797 9.97671 53.2584 9.65004C53.8464 9.32338 54.5184 9.16004 55.2744 9.16004C56.0024 9.16004 56.651 9.31871 57.2204 9.63604C57.7897 9.95338 58.233 10.4014 58.5504 10.98C58.8677 11.5494 59.0264 12.2074 59.0264 12.954ZM57.3604 12.45C57.351 11.862 57.141 11.3907 56.7304 11.036C56.3197 10.6814 55.811 10.504 55.2044 10.504C54.6537 10.504 54.1824 10.6814 53.7904 11.036C53.3984 11.3814 53.165 11.8527 53.0904 12.45H57.3604Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M64.209 9.16004C64.8157 9.16004 65.357 9.28604 65.833 9.53804C66.3183 9.79004 66.6963 10.1634 66.967 10.658C67.2377 11.1527 67.373 11.75 67.373 12.45V17H65.791V12.688C65.791 11.9974 65.6183 11.47 65.273 11.106C64.9277 10.7327 64.4563 10.546 63.859 10.546C63.2617 10.546 62.7857 10.7327 62.431 11.106C62.0857 11.47 61.913 11.9974 61.913 12.688V17H60.317V9.28604H61.913V10.168C62.1743 9.85071 62.5057 9.60338 62.907 9.42604C63.3177 9.24871 63.7517 9.16004 64.209 9.16004Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M70.7248 15.712H74.0148V17H69.1288V7.27004H70.7248V15.712Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M76.6655 15.712H79.9555V17H75.0695V7.27004H76.6655V15.712Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M91.2582 7.27004V17H89.6622V10.336L86.6942 17H85.5882L82.6062 10.336V17H81.0102V7.27004H82.7322L86.1482 14.9L89.5502 7.27004H91.2582Z",
+					"fill": "#1D2939"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_9850_26886"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "24",
+									"height": "24.0945",
+									"fill": "white",
+									"transform": "translate(1)"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "OpenllmText"
+}
diff --git a/app/components/base/icons/src/public/llm/OpenllmText.tsx b/app/components/base/icons/src/public/llm/OpenllmText.tsx
new file mode 100644
index 0000000..d1b6f6b
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/OpenllmText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './OpenllmText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'OpenllmText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/Replicate.json b/app/components/base/icons/src/public/llm/Replicate.json
new file mode 100644
index 0000000..303c239
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Replicate.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"width": "24",
+					"height": "24",
+					"rx": "6",
+					"fill": "black"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M19.9961 4V5.79H7.93621V19.9017H6V4H19.9961ZM20 7.39453V9.18453H11.5969V19.9012H9.65906V7.39453H20ZM19.9964 12.5773V10.7773H13.3106V19.9007H15.2484V12.5773H19.9964Z",
+					"fill": "white"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Replicate"
+}
diff --git a/app/components/base/icons/src/public/llm/Replicate.tsx b/app/components/base/icons/src/public/llm/Replicate.tsx
new file mode 100644
index 0000000..237b68d
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Replicate.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Replicate.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Replicate'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/ReplicateText.json b/app/components/base/icons/src/public/llm/ReplicateText.json
new file mode 100644
index 0000000..b2d597c
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/ReplicateText.json
@@ -0,0 +1,116 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "92",
+			"height": "24",
+			"viewBox": "0 0 92 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M18.4933 2V3.79H6.005V17.9017H4V2H18.4933Z",
+					"fill": "black"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M18.4974 5.39453V7.18453H9.79573V17.9012H7.78906V5.39453H18.4974Z",
+					"fill": "black"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M18.4936 8.77734V10.5773H13.577V17.9007H11.5703V8.77734H18.4936Z",
+					"fill": "black"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M24.2014 8.60156C26.588 8.60156 28.593 10.1849 28.593 13.1282C28.593 13.3232 28.593 13.4882 28.573 13.7866H21.403C21.4964 15.2782 22.6997 16.2649 24.2114 16.2649C25.4864 16.2649 26.3414 15.6782 26.813 14.8766L28.3464 15.9666C27.523 17.2632 26.1047 18.0849 24.1914 18.0849C21.4247 18.0849 19.4297 16.1199 19.4297 13.3432C19.4397 10.6582 21.4347 8.60156 24.203 8.60156M21.508 12.3149H26.5797C26.363 10.9982 25.3047 10.2882 24.1314 10.2882C22.958 10.2882 21.7764 10.9666 21.508 12.3149Z",
+					"fill": "black"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M30.6328 8.77656H32.6378V9.9999C33.1528 9.2699 34.2628 8.60156 35.5695 8.60156C38.0695 8.60156 39.9611 10.7316 39.9611 13.3432C39.9611 15.9549 38.0678 18.0849 35.5695 18.0849C34.2528 18.0849 33.1411 17.4066 32.6378 16.6749V21.7049H30.6328V8.77656ZM35.2095 10.4216C33.5845 10.4216 32.4728 11.6966 32.4728 13.3432C32.4728 14.9899 33.5845 16.2649 35.2095 16.2649C36.8345 16.2649 37.9245 14.9899 37.9245 13.3432C37.9245 11.6966 36.8128 10.4216 35.2095 10.4216Z",
+					"fill": "black"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M44.0128 4.2207H42.0078V17.8907H44.0128V4.2207Z",
+					"fill": "black"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M47.7139 6.79443C46.9839 6.79443 46.3672 6.19776 46.3672 5.44776C46.3672 4.69776 46.9839 4.12109 47.7139 4.12109C48.4439 4.12109 49.0405 4.72776 49.0405 5.44776C49.0405 6.19943 48.4639 6.79443 47.7139 6.79443ZM46.7155 8.77943H48.7205V17.8928H46.7155V8.77943Z",
+					"fill": "black"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M55.5711 18.0771C52.8345 18.0771 50.7578 16.0304 50.7578 13.3354C50.7578 10.6404 52.8361 8.59375 55.5711 8.59375C57.4528 8.59375 59.0378 9.60208 59.8195 11.1137L58.0711 12.0604C57.6295 11.1354 56.7445 10.4554 55.5711 10.4554C53.9461 10.4554 52.8045 11.7104 52.8045 13.3354C52.8045 14.9604 53.9561 16.2154 55.5711 16.2154C56.7328 16.2154 57.6278 15.5371 58.0711 14.6104L59.8195 15.5571C59.0378 17.0787 57.4428 18.0771 55.5711 18.0771Z",
+					"fill": "black"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M65.3995 8.60156C66.7161 8.60156 67.8061 9.2799 68.3211 9.9999V8.77656H70.3261V17.8899H68.3211V16.6666C67.8061 17.3966 66.7161 18.0766 65.3995 18.0766C62.8995 18.0766 61.0078 15.9466 61.0078 13.3349C61.0078 10.7232 62.9011 8.60323 65.3995 8.60323M65.7695 10.4232C64.1445 10.4232 63.0545 11.6982 63.0545 13.3449C63.0545 14.9916 64.1445 16.2666 65.7695 16.2666C67.3945 16.2666 68.4845 14.9916 68.4845 13.3449C68.4845 11.6982 67.3845 10.4232 65.7695 10.4232Z",
+					"fill": "black"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M73.7627 17.9033V10.57H71.8594V8.78H73.7627V6.25H75.7694V8.78H79.2244V10.57H75.7694V16.1033H79.2244V17.9033H73.7627Z",
+					"fill": "black"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M84.9435 8.60156C87.3302 8.60156 89.3352 10.1849 89.3352 13.1282C89.3352 13.3232 89.3352 13.4882 89.3152 13.7866H82.1452C82.2385 15.2782 83.4419 16.2649 84.9535 16.2649C86.2285 16.2649 87.0835 15.6782 87.5552 14.8766L89.0885 15.9666C88.2652 17.2632 86.8469 18.0849 84.9335 18.0849C82.1669 18.0849 80.1719 16.1199 80.1719 13.3432C80.1919 10.6582 82.1769 8.60156 84.9452 8.60156M82.2502 12.3149H87.3219C87.1052 10.9982 86.0469 10.2882 84.8735 10.2882C83.7002 10.2882 82.5285 10.9666 82.2502 12.3149Z",
+					"fill": "black"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "ReplicateText"
+}
diff --git a/app/components/base/icons/src/public/llm/ReplicateText.tsx b/app/components/base/icons/src/public/llm/ReplicateText.tsx
new file mode 100644
index 0000000..667b7d5
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/ReplicateText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ReplicateText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ReplicateText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/XorbitsInference.json b/app/components/base/icons/src/public/llm/XorbitsInference.json
new file mode 100644
index 0000000..b2d3b1a
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/XorbitsInference.json
@@ -0,0 +1,176 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Xorbits Square",
+					"clip-path": "url(#clip0_9850_26870)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M8.00391 12.3124C8.69334 13.0754 9.47526 13.7494 10.3316 14.3188C11.0667 14.8105 11.8509 15.2245 12.6716 15.5541C14.1617 14.1465 15.3959 12.4907 16.3192 10.6606L21.7051 0L12.3133 7.38353C10.5832 8.74456 9.12178 10.416 8.00391 12.3124Z",
+							"fill": "url(#paint0_linear_9850_26870)"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M7.23504 18.9512C6.56092 18.5012 5.92386 18.0265 5.3221 17.5394L2.06445 24L7.91975 19.3959C7.69034 19.2494 7.46092 19.103 7.23504 18.9512Z",
+							"fill": "url(#paint1_linear_9850_26870)"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_3",
+							"d": "M19.3161 8.57474C21.0808 10.9147 21.5961 13.5159 20.3996 15.3053C18.6526 17.9189 13.9161 17.8183 9.82024 15.0812C5.72435 12.3441 3.82024 8.0065 5.56729 5.39297C6.76377 3.60356 9.36318 3.0865 12.2008 3.81886C7.29318 1.73474 2.62376 1.94121 0.813177 4.64474C-1.45976 8.04709 1.64435 14.1177 7.74494 18.1889C13.8455 22.26 20.6361 22.8124 22.9091 19.4118C24.7179 16.703 23.1173 12.3106 19.3161 8.57474Z",
+							"fill": "url(#paint2_linear_9850_26870)"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint0_linear_9850_26870",
+							"x1": "2.15214",
+							"y1": "24.3018",
+							"x2": "21.2921",
+							"y2": "0.0988218",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#E9A85E"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#F52B76"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint1_linear_9850_26870",
+							"x1": "2.06269",
+							"y1": "24.2294",
+							"x2": "21.2027",
+							"y2": "0.028252",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#E9A85E"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#F52B76"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint2_linear_9850_26870",
+							"x1": "-0.613606",
+							"y1": "3.843",
+							"x2": "21.4449",
+							"y2": "18.7258",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#6A0CF5"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#AB66F3"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_9850_26870"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "24",
+									"height": "24",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "XorbitsInference"
+}
diff --git a/app/components/base/icons/src/public/llm/XorbitsInference.tsx b/app/components/base/icons/src/public/llm/XorbitsInference.tsx
new file mode 100644
index 0000000..8316ce3
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/XorbitsInference.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './XorbitsInference.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'XorbitsInference'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/XorbitsInferenceText.json b/app/components/base/icons/src/public/llm/XorbitsInferenceText.json
new file mode 100644
index 0000000..967ee6d
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/XorbitsInferenceText.json
@@ -0,0 +1,329 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "152",
+			"height": "24",
+			"viewBox": "0 0 152 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "xorbits 1",
+					"clip-path": "url(#clip0_9866_6170)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M8.00391 12.3124C8.69334 13.0754 9.47526 13.7494 10.3316 14.3188C11.0667 14.8105 11.8509 15.2245 12.6716 15.5541C14.1617 14.1465 15.3959 12.4907 16.3192 10.6606L21.7051 0L12.3133 7.38353C10.5832 8.74456 9.12178 10.416 8.00391 12.3124Z",
+							"fill": "url(#paint0_linear_9866_6170)"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M7.23504 18.9512C6.56092 18.5012 5.92386 18.0265 5.3221 17.5394L2.06445 24L7.91975 19.3959C7.69034 19.2494 7.46092 19.103 7.23504 18.9512Z",
+							"fill": "url(#paint1_linear_9866_6170)"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_3",
+							"d": "M19.3161 8.57474C21.0808 10.9147 21.5961 13.5159 20.3996 15.3053C18.6526 17.9189 13.9161 17.8183 9.82024 15.0812C5.72435 12.3441 3.82024 8.0065 5.56729 5.39297C6.76377 3.60356 9.36318 3.0865 12.2008 3.81886C7.29318 1.73474 2.62376 1.94121 0.813177 4.64474C-1.45976 8.04709 1.64435 14.1177 7.74494 18.1889C13.8455 22.26 20.6361 22.8124 22.9091 19.4118C24.7179 16.703 23.1173 12.3106 19.3161 8.57474Z",
+							"fill": "url(#paint2_linear_9866_6170)"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Xorbits Inference"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M35.5162 12.142L38.5402 17H36.7482L34.5502 13.472L32.4922 17H30.7142L33.7382 12.142L30.7002 7.27002H32.4922L34.7042 10.826L36.7762 7.27002H38.5542L35.5162 12.142Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M43.3584 17.126C42.6304 17.126 41.9724 16.9627 41.3844 16.636C40.7964 16.3 40.3344 15.8334 39.9984 15.236C39.6624 14.6294 39.4944 13.9293 39.4944 13.136C39.4944 12.352 39.6671 11.6567 40.0124 11.05C40.3577 10.4434 40.8291 9.97668 41.4264 9.65002C42.0237 9.32335 42.6911 9.16002 43.4284 9.16002C44.1657 9.16002 44.8331 9.32335 45.4304 9.65002C46.0277 9.97668 46.4991 10.4434 46.8444 11.05C47.1897 11.6567 47.3624 12.352 47.3624 13.136C47.3624 13.92 47.185 14.6154 46.8304 15.222C46.4757 15.8287 45.9904 16.3 45.3744 16.636C44.7677 16.9627 44.0957 17.126 43.3584 17.126ZM43.3584 15.74C43.769 15.74 44.1517 15.642 44.5064 15.446C44.8704 15.25 45.1644 14.956 45.3884 14.564C45.6124 14.172 45.7244 13.696 45.7244 13.136C45.7244 12.576 45.6171 12.1047 45.4024 11.722C45.1877 11.33 44.9031 11.036 44.5484 10.84C44.1937 10.644 43.8111 10.546 43.4004 10.546C42.9897 10.546 42.607 10.644 42.2524 10.84C41.9071 11.036 41.6317 11.33 41.4264 11.722C41.221 12.1047 41.1184 12.576 41.1184 13.136C41.1184 13.9667 41.3284 14.6107 41.7484 15.068C42.1777 15.516 42.7144 15.74 43.3584 15.74Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M50.2561 10.406C50.4895 10.014 50.7974 9.71068 51.1801 9.49602C51.5721 9.27202 52.0341 9.16002 52.5661 9.16002V10.812H52.1601C51.5348 10.812 51.0588 10.9707 50.7321 11.288C50.4148 11.6054 50.2561 12.156 50.2561 12.94V17H48.6601V9.28602H50.2561V10.406Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M55.3492 10.434C55.6198 10.0607 55.9885 9.75735 56.4552 9.52402C56.9312 9.28135 57.4585 9.16002 58.0372 9.16002C58.7185 9.16002 59.3345 9.32335 59.8852 9.65002C60.4358 9.97668 60.8698 10.4434 61.1872 11.05C61.5045 11.6473 61.6632 12.3333 61.6632 13.108C61.6632 13.8827 61.5045 14.578 61.1872 15.194C60.8698 15.8007 60.4312 16.2767 59.8712 16.622C59.3205 16.958 58.7092 17.126 58.0372 17.126C57.4398 17.126 56.9078 17.0093 56.4412 16.776C55.9838 16.5427 55.6198 16.244 55.3492 15.88V17H53.7532V6.64002H55.3492V10.434ZM60.0392 13.108C60.0392 12.576 59.9272 12.1187 59.7032 11.736C59.4885 11.344 59.1992 11.05 58.8352 10.854C58.4805 10.6487 58.0978 10.546 57.6872 10.546C57.2858 10.546 56.9032 10.6487 56.5392 10.854C56.1845 11.0594 55.8952 11.358 55.6712 11.75C55.4565 12.142 55.3492 12.604 55.3492 13.136C55.3492 13.668 55.4565 14.1347 55.6712 14.536C55.8952 14.928 56.1845 15.2267 56.5392 15.432C56.9032 15.6374 57.2858 15.74 57.6872 15.74C58.0978 15.74 58.4805 15.6374 58.8352 15.432C59.1992 15.2174 59.4885 14.9093 59.7032 14.508C59.9272 14.1067 60.0392 13.64 60.0392 13.108Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M63.7734 8.26402C63.4841 8.26402 63.2414 8.16602 63.0454 7.97002C62.8494 7.77402 62.7514 7.53135 62.7514 7.24202C62.7514 6.95268 62.8494 6.71002 63.0454 6.51402C63.2414 6.31802 63.4841 6.22002 63.7734 6.22002C64.0534 6.22002 64.2914 6.31802 64.4874 6.51402C64.6834 6.71002 64.7814 6.95268 64.7814 7.24202C64.7814 7.53135 64.6834 7.77402 64.4874 7.97002C64.2914 8.16602 64.0534 8.26402 63.7734 8.26402ZM64.5574 9.28602V17H62.9614V9.28602H64.5574Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M68.2348 10.588V14.858C68.2348 15.1474 68.3002 15.3573 68.4309 15.488C68.5709 15.6093 68.8042 15.67 69.1308 15.67H70.1109V17H68.8508C68.1322 17 67.5815 16.832 67.1988 16.496C66.8162 16.16 66.6248 15.614 66.6248 14.858V10.588H65.7148V9.28602H66.6248V7.36802H68.2348V9.28602H70.1109V10.588H68.2348Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M74.1018 17.126C73.4952 17.126 72.9492 17.0187 72.4638 16.804C71.9878 16.58 71.6098 16.2813 71.3298 15.908C71.0498 15.5253 70.9005 15.1007 70.8818 14.634H72.5338C72.5618 14.9607 72.7158 15.236 72.9958 15.46C73.2852 15.6747 73.6445 15.782 74.0738 15.782C74.5218 15.782 74.8672 15.698 75.1098 15.53C75.3618 15.3527 75.4878 15.1287 75.4878 14.858C75.4878 14.5687 75.3478 14.354 75.0678 14.214C74.7972 14.074 74.3632 13.92 73.7658 13.752C73.1872 13.5933 72.7158 13.4394 72.3518 13.29C71.9878 13.1407 71.6705 12.912 71.3998 12.604C71.1385 12.296 71.0078 11.89 71.0078 11.386C71.0078 10.9753 71.1292 10.602 71.3718 10.266C71.6145 9.92068 71.9598 9.65002 72.4078 9.45402C72.8652 9.25802 73.3878 9.16002 73.9758 9.16002C74.8532 9.16002 75.5578 9.38402 76.0898 9.83202C76.6312 10.2707 76.9205 10.8727 76.9578 11.638H75.3618C75.3338 11.2927 75.1938 11.0173 74.9418 10.812C74.6898 10.6067 74.3492 10.504 73.9198 10.504C73.4998 10.504 73.1778 10.5833 72.9538 10.742C72.7298 10.9007 72.6178 11.1107 72.6178 11.372C72.6178 11.5773 72.6925 11.75 72.8418 11.89C72.9912 12.03 73.1732 12.142 73.3878 12.226C73.6025 12.3007 73.9198 12.3987 74.3398 12.52C74.8998 12.6693 75.3572 12.8233 75.7118 12.982C76.0758 13.1314 76.3885 13.3554 76.6498 13.654C76.9112 13.9527 77.0465 14.3493 77.0558 14.844C77.0558 15.2827 76.9345 15.6747 76.6918 16.02C76.4492 16.3654 76.1038 16.636 75.6558 16.832C75.2172 17.028 74.6992 17.126 74.1018 17.126Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M83.4531 7.27002V17H81.8571V7.27002H83.4531Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M89.1605 9.16002C89.7671 9.16002 90.3085 9.28602 90.7845 9.53802C91.2698 9.79002 91.6478 10.1633 91.9185 10.658C92.1891 11.1527 92.3245 11.75 92.3245 12.45V17H90.7425V12.688C90.7425 11.9973 90.5698 11.47 90.2245 11.106C89.8791 10.7327 89.4078 10.546 88.8105 10.546C88.2131 10.546 87.7371 10.7327 87.3825 11.106C87.0371 11.47 86.8645 11.9973 86.8645 12.688V17H85.2685V9.28602H86.8645V10.168C87.1258 9.85068 87.4571 9.60335 87.8585 9.42602C88.2691 9.24868 88.7031 9.16002 89.1605 9.16002Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M97.3143 10.588H95.8863V17H94.2763V10.588H93.3663V9.28602H94.2763V8.74002C94.2763 7.85335 94.5096 7.20935 94.9763 6.80802C95.4523 6.39735 96.1943 6.19202 97.2023 6.19202V7.52202C96.7169 7.52202 96.3763 7.61535 96.1803 7.80202C95.9843 7.97935 95.8863 8.29202 95.8863 8.74002V9.28602H97.3143V10.588Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M105.519 12.954C105.519 13.2433 105.5 13.5047 105.463 13.738H99.5687C99.6154 14.354 99.844 14.8487 100.255 15.222C100.665 15.5954 101.169 15.782 101.767 15.782C102.625 15.782 103.232 15.4227 103.587 14.704H105.309C105.075 15.4133 104.651 15.9967 104.035 16.454C103.428 16.902 102.672 17.126 101.767 17.126C101.029 17.126 100.367 16.9627 99.7787 16.636C99.2 16.3 98.7427 15.8334 98.4067 15.236C98.08 14.6294 97.9167 13.9293 97.9167 13.136C97.9167 12.3427 98.0754 11.6473 98.3927 11.05C98.7194 10.4434 99.172 9.97668 99.7507 9.65002C100.339 9.32335 101.011 9.16002 101.767 9.16002C102.495 9.16002 103.143 9.31868 103.713 9.63602C104.282 9.95335 104.725 10.4014 105.043 10.98C105.36 11.5493 105.519 12.2073 105.519 12.954ZM103.853 12.45C103.843 11.862 103.633 11.3907 103.223 11.036C102.812 10.6813 102.303 10.504 101.697 10.504C101.146 10.504 100.675 10.6813 100.283 11.036C99.8907 11.3813 99.6574 11.8527 99.5827 12.45H103.853Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M108.405 10.406C108.639 10.014 108.947 9.71068 109.329 9.49602C109.721 9.27202 110.183 9.16002 110.715 9.16002V10.812H110.309C109.684 10.812 109.208 10.9707 108.881 11.288C108.564 11.6054 108.405 12.156 108.405 12.94V17H106.809V9.28602H108.405V10.406Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M118.972 12.954C118.972 13.2433 118.954 13.5047 118.916 13.738H113.022C113.069 14.354 113.298 14.8487 113.708 15.222C114.119 15.5954 114.623 15.782 115.22 15.782C116.079 15.782 116.686 15.4227 117.04 14.704H118.762C118.529 15.4133 118.104 15.9967 117.488 16.454C116.882 16.902 116.126 17.126 115.22 17.126C114.483 17.126 113.82 16.9627 113.232 16.636C112.654 16.3 112.196 15.8334 111.86 15.236C111.534 14.6294 111.37 13.9293 111.37 13.136C111.37 12.3427 111.529 11.6473 111.846 11.05C112.173 10.4434 112.626 9.97668 113.204 9.65002C113.792 9.32335 114.464 9.16002 115.22 9.16002C115.948 9.16002 116.597 9.31868 117.166 9.63602C117.736 9.95335 118.179 10.4014 118.496 10.98C118.814 11.5493 118.972 12.2073 118.972 12.954ZM117.306 12.45C117.297 11.862 117.087 11.3907 116.676 11.036C116.266 10.6813 115.757 10.504 115.15 10.504C114.6 10.504 114.128 10.6813 113.736 11.036C113.344 11.3813 113.111 11.8527 113.036 12.45H117.306Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M124.155 9.16002C124.762 9.16002 125.303 9.28602 125.779 9.53802C126.264 9.79002 126.642 10.1633 126.913 10.658C127.184 11.1527 127.319 11.75 127.319 12.45V17H125.737V12.688C125.737 11.9973 125.564 11.47 125.219 11.106C124.874 10.7327 124.402 10.546 123.805 10.546C123.208 10.546 122.732 10.7327 122.377 11.106C122.032 11.47 121.859 11.9973 121.859 12.688V17H120.263V9.28602H121.859V10.168C122.12 9.85068 122.452 9.60335 122.853 9.42602C123.264 9.24868 123.698 9.16002 124.155 9.16002Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M128.543 13.136C128.543 12.3427 128.701 11.6473 129.019 11.05C129.345 10.4434 129.793 9.97668 130.363 9.65002C130.932 9.32335 131.585 9.16002 132.323 9.16002C133.256 9.16002 134.026 9.38402 134.633 9.83202C135.249 10.2707 135.664 10.9007 135.879 11.722H134.157C134.017 11.3394 133.793 11.0407 133.485 10.826C133.177 10.6113 132.789 10.504 132.323 10.504C131.669 10.504 131.147 10.7373 130.755 11.204C130.372 11.6613 130.181 12.3053 130.181 13.136C130.181 13.9667 130.372 14.6153 130.755 15.082C131.147 15.5487 131.669 15.782 132.323 15.782C133.247 15.782 133.858 15.376 134.157 14.564H135.879C135.655 15.348 135.235 15.9733 134.619 16.44C134.003 16.8973 133.237 17.126 132.323 17.126C131.585 17.126 130.932 16.9627 130.363 16.636C129.793 16.3 129.345 15.8334 129.019 15.236C128.701 14.6294 128.543 13.9293 128.543 13.136Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M144.259 12.954C144.259 13.2433 144.241 13.5047 144.203 13.738H138.309C138.356 14.354 138.585 14.8487 138.995 15.222C139.406 15.5954 139.91 15.782 140.507 15.782C141.366 15.782 141.973 15.4227 142.327 14.704H144.049C143.816 15.4133 143.391 15.9967 142.775 16.454C142.169 16.902 141.413 17.126 140.507 17.126C139.77 17.126 139.107 16.9627 138.519 16.636C137.941 16.3 137.483 15.8334 137.147 15.236C136.821 14.6294 136.657 13.9293 136.657 13.136C136.657 12.3427 136.816 11.6473 137.133 11.05C137.46 10.4434 137.913 9.97668 138.491 9.65002C139.079 9.32335 139.751 9.16002 140.507 9.16002C141.235 9.16002 141.884 9.31868 142.453 9.63602C143.023 9.95335 143.466 10.4014 143.783 10.98C144.101 11.5493 144.259 12.2073 144.259 12.954ZM142.593 12.45C142.584 11.862 142.374 11.3907 141.963 11.036C141.553 10.6813 141.044 10.504 140.437 10.504C139.887 10.504 139.415 10.6813 139.023 11.036C138.631 11.3813 138.398 11.8527 138.323 12.45H142.593Z",
+									"fill": "#1D2939"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint0_linear_9866_6170",
+							"x1": "2.15214",
+							"y1": "24.3018",
+							"x2": "21.2921",
+							"y2": "0.0988218",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#E9A85E"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#F52B76"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint1_linear_9866_6170",
+							"x1": "2.06269",
+							"y1": "24.2294",
+							"x2": "21.2027",
+							"y2": "0.028252",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#E9A85E"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#F52B76"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint2_linear_9866_6170",
+							"x1": "-0.613606",
+							"y1": "3.843",
+							"x2": "21.4449",
+							"y2": "18.7258",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#6A0CF5"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#AB66F3"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_9866_6170"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "152",
+									"height": "24",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "XorbitsInferenceText"
+}
diff --git a/app/components/base/icons/src/public/llm/XorbitsInferenceText.tsx b/app/components/base/icons/src/public/llm/XorbitsInferenceText.tsx
new file mode 100644
index 0000000..fb834e7
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/XorbitsInferenceText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './XorbitsInferenceText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'XorbitsInferenceText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/Zhipuai.json b/app/components/base/icons/src/public/llm/Zhipuai.json
new file mode 100644
index 0000000..8795568
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Zhipuai.json
@@ -0,0 +1,53 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "ZHIPU Square"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "shape"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M11.8923 23.4987C11.8281 23.5139 11.7722 23.5535 11.7365 23.609C11.7008 23.6646 11.6881 23.7319 11.701 23.7966C11.7314 23.9293 11.862 24.0232 11.9919 23.9921C12.0561 23.9771 12.1119 23.9377 12.1476 23.8823C12.1833 23.8268 12.1961 23.7596 12.1832 23.695C12.1528 23.5616 12.0222 23.4677 11.8923 23.4987ZM15.4754 8.52697C16.3105 8.14085 16.681 7.13426 16.3027 6.27944C15.9243 5.42532 14.9403 5.04556 14.1046 5.43238C13.2695 5.81991 12.8982 6.8265 13.2766 7.68062C13.6549 8.53544 14.6389 8.91379 15.4754 8.52697ZM18.0935 13.6284C18.9723 13.358 19.47 12.4107 19.206 11.5129C18.9413 10.6143 18.0152 10.1053 17.1363 10.3757C16.2582 10.646 15.7599 11.5933 16.0246 12.4919C16.2893 13.3898 17.2154 13.8987 18.0935 13.6284ZM5.17233 10.7237C4.84426 11.0278 4.64662 11.4471 4.62083 11.8937C4.59503 12.3403 4.74309 12.7796 5.03398 13.1194C5.17709 13.2847 5.35177 13.4196 5.54777 13.5164C5.74377 13.6132 5.95713 13.6698 6.17533 13.683C6.39352 13.6961 6.61214 13.6655 6.81835 13.593C7.02455 13.5205 7.21418 13.4075 7.3761 13.2606C7.70417 12.9565 7.90182 12.5372 7.92761 12.0906C7.9534 11.644 7.80534 11.2047 7.51445 10.8649C7.37135 10.6996 7.19666 10.5647 7.00066 10.4679C6.80466 10.3711 6.5913 10.3145 6.37311 10.3013C6.15491 10.2882 5.93629 10.3188 5.73009 10.3913C5.52388 10.4638 5.33425 10.5768 5.17233 10.7237ZM19.7686 8.56368C20.1893 8.17968 20.2274 7.51473 19.8526 7.08415C19.7642 6.98189 19.6563 6.89838 19.5352 6.83853C19.414 6.77868 19.2821 6.74371 19.1472 6.73568C19.0123 6.72765 18.8772 6.74673 18.7498 6.79179C18.6224 6.83685 18.5054 6.90698 18.4055 6.99803C18.2027 7.18577 18.0805 7.44488 18.0649 7.72084C18.0492 7.99679 18.1412 8.26806 18.3215 8.47756C18.697 8.90815 19.3472 8.94697 19.7686 8.56368ZM11.946 4.6185C12.5121 4.6185 12.9716 4.14838 12.9716 3.56956C12.9716 2.99074 12.5128 2.52062 11.946 2.52062C11.3792 2.52062 10.9203 2.99003 10.9203 3.56956C10.9203 4.14838 11.3792 4.6185 11.946 4.6185ZM4.80527 8.82979C5.37139 8.82979 5.83022 8.36038 5.83022 7.78085C5.83022 7.20203 5.37139 6.73191 4.80457 6.73191C4.23845 6.73191 3.77892 7.20132 3.77892 7.78085C3.77892 8.35968 4.23845 8.82979 4.80527 8.82979ZM4.11563 15.4361C3.91267 15.6238 3.79043 15.8829 3.77463 16.1588C3.75883 16.4348 3.85071 16.7061 4.03092 16.9157C4.40645 17.3463 5.05727 17.3858 5.47798 17.0018C5.89939 16.6185 5.9368 15.9529 5.56269 15.5223C5.47435 15.42 5.36642 15.3365 5.24528 15.2766C5.12413 15.2168 4.99222 15.1818 4.85733 15.1738C4.72245 15.1658 4.58732 15.1848 4.45993 15.2299C4.33254 15.275 4.21547 15.3451 4.11563 15.4361ZM11.946 21.487C12.5121 21.487 12.9716 21.0176 12.9716 20.438C12.9716 19.8592 12.5128 19.3891 11.946 19.3891C11.3792 19.3891 10.9203 19.8592 10.9203 20.438C10.9203 21.0176 11.3792 21.487 11.946 21.487ZM19.0945 17.2601C19.6613 17.2601 20.1201 16.7907 20.1201 16.2112C20.1201 15.6324 19.6613 15.1623 19.0945 15.1623C18.5283 15.1623 18.0688 15.6317 18.0688 16.2112C18.0688 16.79 18.5276 17.2601 19.0945 17.2601ZM17.0735 3.51521C17.1578 3.52035 17.2422 3.50847 17.3217 3.48028C17.4013 3.45208 17.4743 3.40814 17.5365 3.35108C17.5987 3.29403 17.6488 3.22503 17.6837 3.1482C17.7186 3.07137 17.7377 2.98829 17.7399 2.90391C17.7465 2.81974 17.7362 2.7351 17.7096 2.65498C17.683 2.57486 17.6406 2.50087 17.5849 2.43739C17.5293 2.3739 17.4615 2.3222 17.3855 2.28534C17.3096 2.24847 17.227 2.22719 17.1427 2.22274C17.0586 2.21769 16.9743 2.22962 16.8949 2.25782C16.8154 2.28602 16.7425 2.32991 16.6804 2.38688C16.6183 2.44385 16.5683 2.51273 16.5333 2.58943C16.4984 2.66613 16.4793 2.74907 16.477 2.83332C16.4704 2.91749 16.4807 3.00213 16.5073 3.08225C16.5339 3.16238 16.5763 3.23636 16.632 3.29985C16.6876 3.36333 16.7554 3.41503 16.8314 3.4519C16.9073 3.48876 16.9892 3.51075 17.0735 3.51521ZM6.44292 3.40509C6.51215 3.45127 6.58995 3.48309 6.6717 3.49865C6.75346 3.51422 6.8375 3.51322 6.91886 3.49571C7.00022 3.4782 7.07724 3.44454 7.14535 3.39672C7.21347 3.3489 7.27129 3.2879 7.31539 3.21732C7.40689 3.07395 7.43891 2.90056 7.40464 2.73397C7.37038 2.56738 7.27252 2.4207 7.13186 2.32509C7.06261 2.27879 6.98475 2.24688 6.90293 2.23126C6.8211 2.21563 6.73697 2.2166 6.65552 2.23411C6.57408 2.25163 6.49698 2.28532 6.42882 2.33321C6.36065 2.38109 6.30279 2.44218 6.25869 2.51285C6.16718 2.65622 6.13517 2.82961 6.16944 2.9962C6.2037 3.1628 6.30226 3.30947 6.44292 3.40509ZM1.3528 11.4211C1.03869 11.5771 0.916569 11.9689 1.06975 12.2893C1.10579 12.3647 1.15653 12.4322 1.21899 12.4877C1.28145 12.5432 1.35436 12.5857 1.43346 12.6126C1.51256 12.6396 1.59625 12.6505 1.67961 12.6447C1.76298 12.6388 1.84434 12.6164 1.91892 12.5787C2.23304 12.4227 2.35516 12.031 2.20198 11.7105C2.16593 11.6352 2.11522 11.5678 2.05282 11.5124C1.99041 11.4569 1.91757 11.4145 1.83855 11.3875C1.75954 11.3606 1.67594 11.3497 1.59265 11.3554C1.50936 11.3612 1.42736 11.3835 1.3528 11.4211ZM6.82551 20.4931C6.74132 20.4879 6.65697 20.4998 6.57746 20.528C6.49796 20.5561 6.42494 20.6 6.36275 20.657C6.30057 20.7139 6.25049 20.7829 6.21551 20.8596C6.18054 20.9364 6.16137 21.0194 6.15916 21.1037C6.15254 21.1878 6.16284 21.2725 6.18945 21.3526C6.21606 21.4327 6.25844 21.5067 6.3141 21.5702C6.36975 21.6337 6.43755 21.6854 6.51351 21.7222C6.58946 21.7591 6.67202 21.7804 6.75633 21.7849C6.84046 21.7899 6.92475 21.778 7.00417 21.7498C7.08359 21.7216 7.15652 21.6777 7.21863 21.6207C7.28074 21.5637 7.33075 21.4949 7.36568 21.4182C7.40062 21.3415 7.41976 21.2585 7.42198 21.1743C7.4286 21.0902 7.41832 21.0056 7.39176 20.9255C7.36519 20.8454 7.32287 20.7715 7.26729 20.708C7.21171 20.6445 7.14399 20.5928 7.06812 20.5559C6.99225 20.519 6.90976 20.4976 6.82551 20.4931ZM17.4568 20.6025C17.3875 20.5564 17.3097 20.5247 17.228 20.5092C17.1463 20.4937 17.0623 20.4947 16.9809 20.5122C16.8996 20.5297 16.8226 20.5633 16.7545 20.6111C16.6864 20.6588 16.6285 20.7198 16.5843 20.7903C16.4926 20.9337 16.4605 21.1072 16.4947 21.274C16.529 21.4408 16.627 21.5876 16.7679 21.6832C16.8371 21.7294 16.915 21.7611 16.9968 21.7766C17.0785 21.7922 17.1626 21.7911 17.244 21.7735C17.3253 21.7559 17.4023 21.7222 17.4704 21.6743C17.5385 21.6264 17.5963 21.5654 17.6403 21.4947C17.7318 21.3514 17.7639 21.178 17.7296 21.0114C17.6953 20.8448 17.5975 20.6981 17.4568 20.6025ZM22.6076 11.4599C22.5384 11.4138 22.4606 11.3821 22.3788 11.3666C22.2971 11.3511 22.2131 11.3521 22.1318 11.3696C22.0504 11.3871 21.9734 11.4207 21.9053 11.4685C21.8372 11.5162 21.7793 11.5772 21.7352 11.6477C21.6437 11.791 21.6116 11.9644 21.6459 12.131C21.6802 12.2976 21.778 12.4443 21.9187 12.5399C21.9879 12.5862 22.0658 12.6181 22.1476 12.6337C22.2295 12.6494 22.3136 12.6484 22.395 12.6309C22.4765 12.6134 22.5536 12.5797 22.6217 12.5318C22.6899 12.4839 22.7478 12.4228 22.7919 12.3521C22.8834 12.2088 22.9154 12.0354 22.8811 11.8688C22.8468 11.7022 22.7483 11.5555 22.6076 11.4599ZM22.057 6.30909C22.1043 6.26393 22.1329 6.20263 22.1371 6.13738C22.1413 6.07212 22.1208 6.00768 22.0796 5.95685C22.0366 5.90876 21.9765 5.8794 21.9121 5.87505C21.8478 5.8707 21.7842 5.8917 21.7352 5.93356C21.6879 5.97872 21.6593 6.04001 21.6551 6.10527C21.6509 6.17052 21.6714 6.23496 21.7126 6.28579C21.7556 6.33388 21.8157 6.36325 21.8801 6.3676C21.9444 6.37195 22.0079 6.35095 22.057 6.30909ZM11.9912 0.501088C12.0556 0.486056 12.1116 0.446576 12.1474 0.39099C12.1832 0.335404 12.1961 0.268066 12.1832 0.203206C12.1528 0.0705002 12.0222 -0.0233822 11.8923 0.00767661C11.8282 0.0228647 11.7725 0.0623031 11.7368 0.117713C11.7011 0.173123 11.6883 0.240196 11.701 0.304853C11.7314 0.438265 11.8613 0.532147 11.9912 0.501088ZM1.92669 6.36415C2.05657 6.41073 2.19492 6.33238 2.2408 6.20744C2.2613 6.14447 2.25683 6.07605 2.22832 6.01628C2.19982 5.95651 2.14945 5.90997 2.08763 5.88626C1.95704 5.83968 1.81939 5.91803 1.77351 6.04297C1.75302 6.10594 1.75749 6.17437 1.78599 6.23413C1.8145 6.2939 1.86486 6.34044 1.92669 6.36415ZM1.83492 17.6823C1.78733 17.7274 1.7585 17.7887 1.75418 17.8542C1.74986 17.9196 1.77038 17.9842 1.81163 18.0352C1.85464 18.0833 1.91475 18.1127 1.97912 18.117C2.04349 18.1214 2.10701 18.1004 2.1561 18.0585C2.20349 18.0134 2.2322 17.9522 2.23651 17.8869C2.24083 17.8217 2.22044 17.7572 2.17939 17.7063C2.13638 17.6582 2.07627 17.6288 2.0119 17.6245C1.94753 17.6201 1.88401 17.6404 1.83492 17.6823ZM21.9723 17.6279C21.8425 17.5813 21.7048 17.6597 21.6589 17.7846C21.6384 17.8476 21.6429 17.916 21.6714 17.9758C21.6999 18.0355 21.7503 18.0821 21.8121 18.1058C21.942 18.1524 22.0803 18.074 22.1255 17.9491C22.146 17.8862 22.1417 17.8179 22.1133 17.7581C22.0849 17.6983 22.034 17.6518 21.9723 17.6279Z",
+									"fill": "#3859FF"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M15.2901 15.4128C14.9386 15.2962 14.5579 15.3024 14.2104 15.4304C13.8628 15.5583 13.5691 15.8005 13.3772 16.1173L13.3616 16.1483C12.979 16.814 12.2209 17.1662 11.4713 16.9234C11.0652 16.7913 10.7253 16.5083 10.5219 16.1328C10.4896 16.023 10.469 15.9102 10.4604 15.7961C10.4301 15.069 10.9736 14.4577 11.6852 14.4189H11.8539C13.1626 14.4733 14.2722 13.4321 14.3259 12.086C14.3795 10.7399 13.3616 9.61256 12.0452 9.5575H11.6852C10.9736 9.52644 10.476 8.96244 10.5063 8.23468C10.5063 8.06244 10.5374 7.89021 10.6059 7.74126L10.6214 7.69468C10.6539 7.62345 10.6821 7.55038 10.7061 7.47585C10.9814 6.57515 10.4915 5.62009 9.61904 5.33844C8.75362 5.06456 7.81974 5.54174 7.53668 6.45021C7.26139 7.32691 7.72021 8.26574 8.57009 8.57138C8.70774 8.61797 8.79174 8.63421 8.92233 8.6575H8.9908C9.66492 8.73515 10.1929 9.29138 10.1696 9.99585C10.1626 10.2542 10.0779 10.4893 9.94798 10.6848C9.72118 11.0472 9.59453 11.4632 9.58092 11.8904C9.55808 12.3864 9.68605 12.8776 9.94798 13.2994C10.0779 13.4949 10.1619 13.73 10.1696 13.9883C10.2007 14.6928 9.74115 15.2483 9.06774 15.3189H9.05221C8.95339 15.3189 8.83833 15.3422 8.74586 15.3577C7.82821 15.5695 7.28468 16.485 7.4908 17.4013C7.69762 18.3246 8.60045 18.8646 9.45809 18.669C9.67681 18.6217 9.88344 18.5298 10.0651 18.3991C10.2468 18.2685 10.3996 18.1018 10.5141 17.9095C10.7022 17.5817 10.997 17.3283 11.3494 17.1916C11.7018 17.0549 12.0904 17.0432 12.4503 17.1584C12.8562 17.2911 13.147 17.5417 13.3539 17.894L13.3764 17.9335C13.5529 18.2229 13.8896 18.5208 14.287 18.638C15.1906 18.9119 16.0786 18.4107 16.3623 17.534C16.6524 16.6184 16.1322 15.6704 15.2901 15.3973V15.4128Z",
+									"fill": "#3859FF"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Zhipuai"
+}
diff --git a/app/components/base/icons/src/public/llm/Zhipuai.tsx b/app/components/base/icons/src/public/llm/Zhipuai.tsx
new file mode 100644
index 0000000..d06244b
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/Zhipuai.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Zhipuai.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Zhipuai'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/ZhipuaiText.json b/app/components/base/icons/src/public/llm/ZhipuaiText.json
new file mode 100644
index 0000000..12eb65a
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/ZhipuaiText.json
@@ -0,0 +1,44 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "89",
+			"height": "32",
+			"viewBox": "0 0 89 32",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "shape"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M88.8045 8.82998H86.7123V22.4497H88.8045V8.82998ZM80.5485 8.82998L78.4158 22.4497H80.3339L80.5589 20.9156L80.6709 20.1853C80.6916 20.0394 80.8751 19.9142 81.0793 19.9142H82.8855C83.0897 19.9142 83.2732 20.029 83.2939 20.1853L83.4059 20.9156L83.6299 22.4497H85.7429L83.6102 8.82998H80.5485ZM82.7838 18.2963H81.181C81.1522 18.2968 81.1237 18.2909 81.0975 18.279C81.0713 18.2671 81.0481 18.2495 81.0295 18.2275C81.0109 18.2056 80.9975 18.1797 80.9902 18.1519C80.9828 18.1241 80.9818 18.095 80.9871 18.0667L81.7024 12.1175C81.7212 11.95 81.8436 11.8352 81.9772 11.8352C82.109 11.8352 82.2426 11.95 82.253 12.1175L82.9673 18.0657C82.9767 18.1919 82.8855 18.2963 82.7735 18.2963H82.7838ZM14.8563 31.3316C14.7706 31.3519 14.6961 31.4046 14.6485 31.4787C14.6009 31.5528 14.584 31.6425 14.6012 31.7288C14.6417 31.9057 14.8158 32.0309 14.989 31.9895C15.0746 31.9695 15.1491 31.9169 15.1967 31.843C15.2443 31.769 15.2613 31.6795 15.244 31.5933C15.2036 31.4154 15.0295 31.2902 14.8563 31.3316ZM19.6337 11.3693C20.7471 10.8544 21.2412 9.51233 20.7368 8.37257C20.2323 7.23374 18.9203 6.72739 17.8059 7.24316C16.6925 7.75986 16.1975 9.10198 16.7019 10.2408C17.2064 11.3806 18.5184 11.885 19.6337 11.3693ZM23.1245 18.1712C24.2963 17.8107 24.9598 16.5476 24.6078 15.3504C24.2549 14.1523 23.02 13.4737 21.8483 13.8342C20.6775 14.1947 20.013 15.4577 20.3659 16.6559C20.7189 17.853 21.9537 18.5316 23.1245 18.1712ZM5.89628 14.2982C5.45885 14.7037 5.19533 15.2628 5.16094 15.8583C5.12655 16.4537 5.32396 17.0394 5.71181 17.4926C5.90262 17.7129 6.13553 17.8928 6.39686 18.0219C6.6582 18.1509 6.94268 18.2264 7.23361 18.2439C7.52453 18.2615 7.81602 18.2207 8.09096 18.124C8.36591 18.0273 8.61875 17.8766 8.83463 17.6808C9.27207 17.2753 9.53559 16.7162 9.56998 16.1208C9.60437 15.5253 9.40695 14.9396 9.0191 14.4864C8.8283 14.2661 8.59539 14.0862 8.33405 13.9571C8.07272 13.8281 7.78823 13.7526 7.49731 13.7351C7.20639 13.7175 6.91489 13.7583 6.63995 13.855C6.36501 13.9517 6.11217 14.1024 5.89628 14.2982ZM25.3579 11.4182C25.9189 10.9062 25.9697 10.0196 25.4699 9.44551C25.3521 9.30917 25.2082 9.19782 25.0467 9.11802C24.8852 9.03822 24.7093 8.99159 24.5295 8.98088C24.3496 8.97018 24.1694 8.99562 23.9996 9.0557C23.8297 9.11578 23.6736 9.20928 23.5405 9.33068C23.27 9.581 23.1072 9.92649 23.0863 10.2944C23.0654 10.6624 23.1881 11.0241 23.4285 11.3034C23.9292 11.8775 24.796 11.9293 25.3579 11.4182ZM14.9278 6.15798C15.6826 6.15798 16.2953 5.53116 16.2953 4.75939C16.2953 3.98763 15.6836 3.3608 14.9278 3.3608C14.172 3.3608 13.5603 3.98669 13.5603 4.75939C13.5603 5.53116 14.172 6.15798 14.9278 6.15798ZM5.40687 11.773C6.16169 11.773 6.77346 11.1472 6.77346 10.3744C6.77346 9.60268 6.16169 8.97586 5.40593 8.97586C4.65111 8.97586 4.0384 9.60174 4.0384 10.3744C4.0384 11.1462 4.65111 11.773 5.40687 11.773ZM4.48734 20.5815C4.21673 20.8317 4.05374 21.1771 4.03268 21.5451C4.01161 21.913 4.13411 22.2748 4.3744 22.5542C4.87511 23.1283 5.74287 23.181 6.30381 22.669C6.86569 22.158 6.91558 21.2704 6.41675 20.6963C6.29897 20.56 6.15507 20.4486 5.99354 20.3688C5.83201 20.289 5.65613 20.2424 5.47628 20.2317C5.29643 20.221 5.11626 20.2464 4.94641 20.3065C4.77656 20.3666 4.62046 20.4601 4.48734 20.5815ZM14.9278 28.6493C15.6826 28.6493 16.2953 28.0234 16.2953 27.2507C16.2953 26.4789 15.6836 25.8521 14.9278 25.8521C14.172 25.8521 13.5603 26.4789 13.5603 27.2507C13.5603 28.0234 14.172 28.6493 14.9278 28.6493ZM24.4591 23.0135C25.2149 23.0135 25.8266 22.3876 25.8266 21.6149C25.8266 20.8432 25.2149 20.2163 24.4591 20.2163C23.7043 20.2163 23.0916 20.8422 23.0916 21.6149C23.0916 22.3867 23.7033 23.0135 24.4591 23.0135ZM21.7645 4.68692C21.8768 4.69378 21.9894 4.67794 22.0955 4.64035C22.2015 4.60275 22.2989 4.54416 22.3819 4.46809C22.4648 4.39202 22.5315 4.30001 22.5781 4.19757C22.6247 4.09514 22.6502 3.98436 22.653 3.87186C22.6618 3.75964 22.6481 3.64679 22.6126 3.53995C22.5771 3.43312 22.5206 3.33448 22.4464 3.24983C22.3722 3.16518 22.2818 3.09625 22.1805 3.0471C22.0793 2.99794 21.9692 2.96956 21.8568 2.96363C21.7446 2.9569 21.6322 2.9728 21.5263 3.0104C21.4204 3.048 21.3232 3.10652 21.2404 3.18248C21.1575 3.25845 21.0909 3.35029 21.0443 3.45256C20.9977 3.55482 20.9722 3.66541 20.9692 3.77774C20.9604 3.88997 20.9741 4.00282 21.0096 4.10965C21.0451 4.21648 21.1016 4.31513 21.1758 4.39978C21.25 4.48442 21.3404 4.55335 21.4417 4.60251C21.543 4.65166 21.6521 4.68099 21.7645 4.68692ZM7.5904 4.5401C7.68271 4.60167 7.78644 4.6441 7.89544 4.66485C8.00445 4.68561 8.11651 4.68427 8.22499 4.66093C8.33347 4.63758 8.43616 4.5927 8.52697 4.52894C8.61779 4.46518 8.69489 4.38384 8.75369 4.28974C8.8757 4.09858 8.91838 3.8674 8.87269 3.64527C8.827 3.42315 8.69653 3.22758 8.50899 3.1001C8.41664 3.03837 8.31284 2.99582 8.20374 2.97499C8.09464 2.95415 7.98246 2.95544 7.87387 2.9788C7.76528 3.00215 7.66248 3.04708 7.57159 3.11092C7.4807 3.17477 7.40356 3.25622 7.34475 3.35045C7.22275 3.54161 7.18006 3.7728 7.22575 3.99492C7.27144 4.21704 7.40285 4.41261 7.5904 4.5401ZM0.803576 15.2281C0.384753 15.4361 0.221929 15.9584 0.426164 16.3857C0.474224 16.4863 0.541877 16.5762 0.625154 16.6502C0.708432 16.7242 0.805655 16.7809 0.911121 16.8168C1.01659 16.8528 1.12817 16.8673 1.23932 16.8595C1.35047 16.8518 1.45895 16.8219 1.5584 16.7716C1.97722 16.5636 2.14005 16.0413 1.93581 15.614C1.88775 15.5136 1.82013 15.4238 1.73693 15.3498C1.65372 15.2759 1.55659 15.2193 1.45124 15.1833C1.34588 15.1474 1.23442 15.1329 1.12337 15.1405C1.01232 15.1482 0.902978 15.178 0.803576 15.2281ZM8.10052 27.3241C7.98827 27.3172 7.87579 27.333 7.76979 27.3706C7.66378 27.4081 7.56642 27.4666 7.48351 27.5426C7.40059 27.6186 7.33383 27.7105 7.28719 27.8128C7.24055 27.9151 7.215 28.0258 7.21205 28.1382C7.20322 28.2504 7.21695 28.3633 7.25243 28.4701C7.28791 28.577 7.34442 28.6756 7.41863 28.7602C7.49284 28.8449 7.58324 28.9138 7.68451 28.963C7.78578 29.0121 7.89587 29.0405 8.00828 29.0464C8.12045 29.0532 8.23283 29.0373 8.33873 28.9997C8.44462 28.9621 8.54187 28.9035 8.62468 28.8276C8.70749 28.7516 8.77417 28.6598 8.82075 28.5575C8.86733 28.4553 8.89286 28.3447 8.89581 28.2323C8.90464 28.1202 8.89094 28.0074 8.85551 27.9006C8.82009 27.7939 8.76367 27.6953 8.68956 27.6106C8.61545 27.526 8.52515 27.457 8.42399 27.4078C8.32283 27.3586 8.21285 27.3301 8.10052 27.3241ZM22.2756 27.47C22.1832 27.4085 22.0795 27.3662 21.9705 27.3455C21.8615 27.3248 21.7495 27.3262 21.6411 27.3495C21.5326 27.3729 21.43 27.4177 21.3391 27.4814C21.2483 27.5451 21.1712 27.6263 21.1123 27.7203C20.99 27.9116 20.9471 28.143 20.9928 28.3653C21.0385 28.5877 21.1692 28.7834 21.357 28.9109C21.4494 28.9725 21.5531 29.0148 21.6622 29.0355C21.7712 29.0562 21.8833 29.0548 21.9918 29.0313C22.1003 29.0079 22.2029 28.9629 22.2937 28.8991C22.3845 28.8352 22.4615 28.7538 22.5203 28.6596C22.6423 28.4685 22.685 28.2373 22.6393 28.0152C22.5936 27.793 22.4631 27.5975 22.2756 27.47ZM29.1433 15.2799C29.051 15.2184 28.9473 15.1761 28.8383 15.1554C28.7293 15.1347 28.6173 15.1361 28.5088 15.1594C28.4004 15.1828 28.2977 15.2276 28.2069 15.2913C28.1161 15.355 28.0389 15.4362 27.98 15.5302C27.858 15.7214 27.8154 15.9526 27.861 16.1747C27.9067 16.3968 28.0372 16.5924 28.2248 16.7199C28.3171 16.7816 28.4209 16.8241 28.53 16.845C28.6391 16.8658 28.7513 16.8645 28.8599 16.8412C28.9685 16.8178 29.0713 16.7729 29.1621 16.709C29.253 16.6452 29.3302 16.5637 29.389 16.4695C29.511 16.2783 29.5537 16.0472 29.508 15.825C29.4623 15.6029 29.3309 15.4073 29.1433 15.2799ZM28.4092 8.4121C28.4723 8.35188 28.5104 8.27016 28.516 8.18315C28.5215 8.09614 28.4942 8.01022 28.4393 7.94245C28.382 7.87833 28.3018 7.83918 28.216 7.83338C28.1302 7.82757 28.0455 7.85557 27.98 7.91139C27.917 7.9716 27.8789 8.05333 27.8733 8.14034C27.8677 8.22734 27.8951 8.31326 27.9499 8.38104C28.0073 8.44516 28.0874 8.48431 28.1732 8.49011C28.2591 8.49591 28.3438 8.46791 28.4092 8.4121ZM14.988 0.668097C15.0739 0.648054 15.1486 0.595414 15.1964 0.521299C15.2442 0.447185 15.2613 0.357402 15.244 0.270921C15.2036 0.0939798 15.0295 -0.0311966 14.8563 0.0102151C14.7708 0.0304659 14.6965 0.0830504 14.6489 0.156931C14.6013 0.230811 14.5843 0.320241 14.6012 0.40645C14.6417 0.584333 14.8149 0.709509 14.988 0.668097ZM1.56875 8.48551C1.74193 8.54763 1.9264 8.44315 1.98758 8.27657C2.0149 8.19261 2.00894 8.10137 1.97093 8.02168C1.93293 7.94199 1.86578 7.87994 1.78334 7.84833C1.60922 7.78621 1.42569 7.89068 1.36452 8.05727C1.3372 8.14123 1.34315 8.23247 1.38116 8.31216C1.41916 8.39185 1.48632 8.4539 1.56875 8.48551ZM1.4464 23.5763C1.38294 23.6365 1.3445 23.7183 1.33874 23.8055C1.33299 23.8928 1.36034 23.979 1.41534 24.0469C1.47268 24.111 1.55284 24.1502 1.63866 24.156C1.72449 24.1618 1.80918 24.1338 1.87463 24.078C1.93783 24.0179 1.9761 23.9362 1.98186 23.8492C1.98761 23.7622 1.96042 23.6762 1.90569 23.6083C1.84835 23.5442 1.7682 23.5051 1.68237 23.4993C1.59655 23.4935 1.51185 23.5205 1.4464 23.5763ZM28.2963 23.5039C28.1231 23.4417 27.9396 23.5462 27.8784 23.7128C27.8511 23.7968 27.857 23.888 27.895 23.9677C27.933 24.0474 28.0002 24.1094 28.0826 24.141C28.2558 24.2032 28.4403 24.0987 28.5005 23.9321C28.5279 23.8483 28.5221 23.7571 28.4842 23.6774C28.4464 23.5978 28.3785 23.5356 28.2963 23.5039Z",
+							"fill": "#3859FF"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M19.3866 20.5504C18.918 20.3949 18.4104 20.4031 17.947 20.5738C17.4836 20.7444 17.0919 21.0674 16.836 21.4897L16.8153 21.5311C16.3052 22.4186 15.2944 22.8883 14.2949 22.5645C13.7534 22.3884 13.3002 22.011 13.029 21.5104C12.986 21.364 12.9585 21.2135 12.9471 21.0614C12.9066 20.092 13.6313 19.277 14.58 19.2252H14.805C16.5499 19.2977 18.0295 17.9094 18.101 16.1146C18.1725 14.3198 16.8153 12.8167 15.06 12.7433H14.58C13.6313 12.7019 12.9678 11.9499 13.0083 10.9795C13.0083 10.7499 13.0497 10.5203 13.141 10.3217L13.1617 10.2595C13.205 10.1646 13.2427 10.0672 13.2746 9.96778C13.6417 8.76684 12.9885 7.49343 11.8252 7.1179C10.6713 6.75272 9.42616 7.38896 9.04875 8.60025C8.68169 9.76919 9.29345 11.021 10.4266 11.4285C10.6102 11.4906 10.7222 11.5123 10.8963 11.5433H10.9876C11.8864 11.6468 12.5904 12.3885 12.5593 13.3278C12.5499 13.6723 12.437 13.9857 12.2638 14.2464C11.9614 14.7295 11.7925 15.2842 11.7744 15.8539C11.7439 16.5152 11.9146 17.1701 12.2638 17.7325C12.437 17.9932 12.549 18.3066 12.5593 18.6511C12.6007 19.5904 11.988 20.3311 11.0902 20.4252H11.0695C10.9377 20.4252 10.7843 20.4563 10.661 20.477C9.43745 20.7593 8.71275 21.98 8.98757 23.2017C9.26333 24.4327 10.4671 25.1527 11.6106 24.892C11.9023 24.8289 12.1778 24.7064 12.42 24.5321C12.6622 24.3579 12.866 24.1357 13.0186 23.8793C13.2694 23.4422 13.6626 23.1044 14.1324 22.9221C14.6022 22.7399 15.1203 22.7243 15.6003 22.8779C16.1415 23.0548 16.5292 23.389 16.805 23.8586L16.8351 23.9113C17.0704 24.2972 17.5193 24.6944 18.0492 24.8506C19.2539 25.2158 20.4379 24.5475 20.8163 23.3786C21.2031 22.1579 20.5095 20.8939 19.3866 20.5297V20.5504ZM75.0064 14.1005C74.4454 14.1005 73.9862 14.5701 73.9862 15.1443C73.9862 15.7184 74.4454 16.188 75.0064 16.188C75.5673 16.188 76.0266 15.7174 76.0266 15.1433C76.0286 14.87 75.9225 14.607 75.7314 14.4117C75.5403 14.2163 75.2797 14.1045 75.0064 14.1005ZM38.1029 10.7395H41.4506C41.5214 10.7415 41.5886 10.7709 41.6381 10.8214C41.6876 10.872 41.7156 10.9398 41.716 11.0106C41.716 11.0426 41.716 11.084 41.6963 11.1047L37.9203 20.3941V22.2831H43.972V20.3631H40.4407C40.3698 20.3611 40.3025 20.3316 40.2529 20.2809C40.2034 20.2301 40.1756 20.162 40.1753 20.0911C40.1753 20.06 40.1753 20.028 40.196 19.997L43.972 10.7075V8.82049H38.1029V10.7395ZM49.6153 14.3198C49.6149 14.3906 49.5869 14.4584 49.5374 14.509C49.4879 14.5595 49.4207 14.5889 49.3499 14.5908H47.524C47.4887 14.5908 47.4536 14.5838 47.421 14.5701C47.3884 14.5564 47.3588 14.5364 47.334 14.5112C47.3092 14.4859 47.2897 14.456 47.2766 14.4232C47.2635 14.3903 47.2571 14.3552 47.2577 14.3198V8.81861H45.1862V22.2821H47.2577V16.7819C47.2578 16.7127 47.2842 16.6461 47.3315 16.5956C47.3789 16.5451 47.4437 16.5144 47.5127 16.5099H49.3396C49.4826 16.5099 49.5946 16.636 49.5946 16.7819V22.2821H51.6972V8.81861H49.5946V14.3188L49.6153 14.3198ZM55.2887 8.81861H53.2182V22.2831H55.2887V8.81861ZM59.8412 8.81861H56.7899V22.2831H58.8605V17.2214H59.8412C61.9127 17.2214 62.9226 16.0525 62.9226 13.8915V12.1381C62.9226 9.98849 61.9127 8.80825 59.8412 8.80825V8.81861ZM60.8511 14.0271C60.8511 14.9871 60.4934 15.3005 59.8412 15.3005H59.1259C59.0907 15.3002 59.0559 15.293 59.0235 15.2792C58.9911 15.2654 58.9617 15.2454 58.9371 15.2202C58.9125 15.1949 58.8932 15.1651 58.8802 15.1324C58.8672 15.0996 58.8608 15.0646 58.8615 15.0294V11.0106C58.8619 10.9398 58.8899 10.872 58.9394 10.8214C58.9889 10.7709 59.0561 10.7415 59.1269 10.7395H59.8412C60.4944 10.7395 60.8511 11.0426 60.8511 12.013V14.0271ZM67.9946 19.2035C67.9946 20.1635 67.5767 20.509 66.9236 20.509C66.2704 20.509 65.8525 20.1645 65.8525 19.2035V8.81955H63.78V19.069C63.78 21.2186 64.8313 22.4497 66.8624 22.4497C68.8934 22.4497 69.9447 21.2186 69.9447 19.068V8.81861H67.9852V19.2035H67.9946Z",
+							"fill": "#3859FF"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ZhipuaiText"
+}
diff --git a/app/components/base/icons/src/public/llm/ZhipuaiText.tsx b/app/components/base/icons/src/public/llm/ZhipuaiText.tsx
new file mode 100644
index 0000000..600ca7c
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/ZhipuaiText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ZhipuaiText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ZhipuaiText'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/ZhipuaiTextCn.json b/app/components/base/icons/src/public/llm/ZhipuaiTextCn.json
new file mode 100644
index 0000000..c5b1755
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/ZhipuaiTextCn.json
@@ -0,0 +1,62 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "86",
+			"height": "32",
+			"viewBox": "0 0 86 32",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "shape"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M85.3919 8.94111H83.2742V22.4705H85.3919V8.94111ZM76.9919 8.94111L74.8272 22.4705H76.7801L77.0154 20.9411L77.133 20.2117C77.1566 20.0705 77.3448 19.9529 77.5566 19.9529H79.3919C79.6036 19.9529 79.7919 20.0705 79.8154 20.2117L79.933 20.9411L80.1683 22.4705H82.3095L80.1213 8.94111H76.9919ZM79.2742 18.3529H77.6507C77.533 18.3529 77.4389 18.2352 77.4389 18.1176L78.1683 12.2117C78.1919 12.047 78.3095 11.9293 78.4507 11.9293C78.5919 11.9293 78.7095 12.047 78.733 12.2117L79.4625 18.1176C79.486 18.2588 79.3919 18.3529 79.2742 18.3529ZM15.2742 31.3176C15.086 31.3176 14.9448 31.4588 14.9448 31.647C14.9448 31.8352 15.086 31.9764 15.2742 31.9764C15.4624 31.9764 15.6036 31.8352 15.6036 31.647C15.6036 31.4588 15.4624 31.3176 15.2742 31.3176ZM19.133 11.6705C19.7321 11.6705 20.3067 11.4325 20.7303 11.0089C21.1539 10.5853 21.3919 10.0108 21.3919 9.4117C21.3919 8.81262 21.1539 8.23808 20.7303 7.81447C20.3067 7.39086 19.7321 7.15288 19.133 7.15288C18.534 7.15288 17.9594 7.39086 17.5358 7.81447C17.1122 8.23808 16.8742 8.81262 16.8742 9.4117C16.8742 10.0108 17.1122 10.5853 17.5358 11.0089C17.9594 11.4325 18.534 11.6705 19.133 11.6705ZM24.5601 17.6752C24.7699 17.4655 24.9363 17.2165 25.0498 16.9424C25.1633 16.6683 25.2218 16.3746 25.2218 16.0779C25.2218 15.7813 25.1633 15.4875 25.0498 15.2135C24.9363 14.9394 24.7699 14.6904 24.5601 14.4806C24.1365 14.057 23.5619 13.8191 22.9628 13.8191C22.3638 13.8191 21.7892 14.0571 21.3656 14.4808C20.942 14.9044 20.7041 15.4789 20.7041 16.078C20.7041 16.6771 20.9421 17.2516 21.3657 17.6752C21.5755 17.885 21.8245 18.0514 22.0985 18.165C22.3726 18.2785 22.6663 18.337 22.9629 18.337C23.2596 18.337 23.5533 18.2785 23.8273 18.165C24.1014 18.0514 24.3504 17.885 24.5601 17.6752ZM9.69233 16.9369C9.9216 16.3834 9.9216 15.7614 9.69232 15.2079C9.46304 14.6544 9.02327 14.2146 8.46974 13.9853C7.91622 13.7561 7.29429 13.7561 6.74077 13.9854C6.18725 14.2146 5.74749 14.6544 5.51821 15.2079C5.28894 15.7615 5.28895 16.3834 5.51823 16.9369C5.74751 17.4904 6.18728 17.9302 6.7408 18.1595C7.01488 18.273 7.30863 18.3314 7.60529 18.3314C7.90195 18.3314 8.1957 18.273 8.46977 18.1595C9.02329 17.9302 9.46306 17.4904 9.69233 16.9369ZM24.9683 11.8823C25.1506 11.8823 25.3312 11.8464 25.4996 11.7766C25.668 11.7069 25.8211 11.6046 25.95 11.4757C26.0789 11.3468 26.1811 11.1937 26.2509 11.0253C26.3207 10.8569 26.3566 10.6764 26.3566 10.4941C26.3566 10.3117 26.3207 10.1312 26.2509 9.9628C26.1811 9.79437 26.0789 9.64133 25.95 9.51242C25.8211 9.38351 25.668 9.28126 25.4996 9.21149C25.3312 9.14173 25.1506 9.10582 24.9683 9.10582C24.6001 9.10582 24.247 9.25208 23.9867 9.51242C23.7264 9.77277 23.5801 10.1259 23.5801 10.4941C23.5801 10.8622 23.7264 11.2153 23.9867 11.4757C24.247 11.736 24.6001 11.8823 24.9683 11.8823ZM15.5904 6.24605C15.77 6.20622 15.9398 6.13112 16.0901 6.02511C16.2403 5.9191 16.368 5.78429 16.4658 5.62851C16.5635 5.47273 16.6293 5.29909 16.6593 5.11766C16.6894 4.93624 16.6831 4.75065 16.6408 4.57168C16.5986 4.39271 16.5212 4.22392 16.4131 4.07512C16.3051 3.92631 16.1685 3.80046 16.0114 3.70486C15.8543 3.60926 15.6798 3.54583 15.498 3.51824C15.3162 3.49066 15.1307 3.49947 14.9523 3.54417C14.5984 3.63287 14.2936 3.85737 14.1039 4.1691C13.9142 4.48083 13.8548 4.85472 13.9387 5.20986C14.0226 5.565 14.2429 5.87284 14.552 6.06676C14.8612 6.26068 15.2342 6.32509 15.5904 6.24605ZM5.60362 11.8823C5.78593 11.8823 5.96645 11.8464 6.13488 11.7766C6.30331 11.7069 6.45635 11.6046 6.58526 11.4757C6.71417 11.3468 6.81642 11.1937 6.88619 11.0253C6.95595 10.8569 6.99186 10.6764 6.99186 10.4941C6.99186 10.3117 6.95595 10.1312 6.88619 9.9628C6.81642 9.79437 6.71417 9.64133 6.58526 9.51242C6.45635 9.38351 6.30331 9.28126 6.13488 9.21149C5.96645 9.14173 5.78593 9.10582 5.60362 9.10582C5.23544 9.10582 4.88234 9.25208 4.62199 9.51242C4.36165 9.77277 4.21539 10.1259 4.21539 10.4941C4.21539 10.8622 4.36165 11.2153 4.62199 11.4757C4.88234 11.736 5.23544 11.8823 5.60362 11.8823ZM6.58904 22.6493C6.71795 22.5204 6.82021 22.3674 6.88997 22.199C6.95974 22.0305 6.99565 21.85 6.99565 21.6677C6.99565 21.4854 6.95974 21.3049 6.88997 21.1364C6.82021 20.968 6.71795 20.815 6.58904 20.6861C6.46012 20.5571 6.30708 20.4549 6.13865 20.3851C5.97022 20.3154 5.7897 20.2794 5.60739 20.2794C5.42508 20.2794 5.24456 20.3154 5.07613 20.3851C4.90769 20.4549 4.75465 20.5571 4.62574 20.6861C4.36539 20.9464 4.21913 21.2995 4.21913 21.6677C4.21913 22.0359 4.36539 22.389 4.62574 22.6493C4.88609 22.9097 5.2392 23.056 5.60739 23.056C5.97558 23.056 6.32869 22.9097 6.58904 22.6493ZM15.5919 28.5983C15.7693 28.5564 15.9367 28.48 16.0846 28.3734C16.2324 28.2668 16.3579 28.1321 16.4537 27.977C16.5495 27.8219 16.6138 27.6495 16.643 27.4696C16.6722 27.2896 16.6656 27.1057 16.6237 26.9283C16.5818 26.7509 16.5054 26.5835 16.3988 26.4356C16.2922 26.2877 16.1575 26.1623 16.0025 26.0665C15.8474 25.9707 15.675 25.9063 15.495 25.8771C15.3151 25.848 15.1312 25.8545 14.9537 25.8964C14.7742 25.9362 14.6044 26.0113 14.4541 26.1174C14.3039 26.2234 14.1762 26.3582 14.0784 26.514C13.9807 26.6697 13.9149 26.8434 13.8849 27.0248C13.8548 27.2062 13.8611 27.3918 13.9034 27.5708C13.9456 27.7497 14.023 27.9185 14.1311 28.0673C14.2391 28.2162 14.3757 28.342 14.5328 28.4376C14.6898 28.5332 14.8644 28.5966 15.0462 28.6242C15.228 28.6518 15.4135 28.643 15.5919 28.5983ZM25.2848 22.9973C25.4634 22.9566 25.6322 22.881 25.7815 22.7747C25.9307 22.6684 26.0574 22.5337 26.1543 22.3782C26.2512 22.2227 26.3164 22.0496 26.3461 21.8688C26.3758 21.6881 26.3694 21.5032 26.3273 21.3249C26.2853 21.1466 26.2083 20.9784 26.1009 20.83C25.9935 20.6815 25.8578 20.5559 25.7015 20.4601C25.5453 20.3644 25.3717 20.3006 25.1907 20.2723C25.0097 20.244 24.8249 20.2518 24.6469 20.2952C24.291 20.3821 23.9839 20.6062 23.7925 20.9185C23.6011 21.2309 23.541 21.6063 23.6251 21.9628C23.7093 22.3193 23.931 22.6281 24.2419 22.8219C24.5528 23.0157 24.9276 23.0788 25.2848 22.9973ZM22.286 4.82347C22.7566 4.82347 23.133 4.447 23.133 3.97641C23.133 3.50582 22.7566 3.12935 22.286 3.12935C21.8154 3.12935 21.4389 3.50582 21.4389 3.97641C21.4389 4.447 21.8154 4.82347 22.286 4.82347ZM8.28598 4.82347C8.75657 4.82347 9.13304 4.447 9.13304 3.97641C9.13304 3.50582 8.75657 3.12935 8.28598 3.12935C7.81539 3.12935 7.43892 3.50582 7.43892 3.97641C7.43892 4.447 7.81539 4.82347 8.28598 4.82347ZM1.29774 15.2235C0.827154 15.2235 0.450684 15.5999 0.450684 16.0705C0.450684 16.5411 0.827154 16.9176 1.29774 16.9176C1.76833 16.9176 2.1448 16.5411 2.1448 16.0705C2.16833 15.5999 1.76833 15.2235 1.29774 15.2235ZM8.28598 27.3176C7.81539 27.3176 7.43892 27.6941 7.43892 28.1646C7.43892 28.6352 7.81539 29.0117 8.28598 29.0117C8.75657 29.0117 9.13304 28.6352 9.13304 28.1646C9.13304 27.6941 8.75657 27.3176 8.28598 27.3176ZM22.286 27.3411C21.8154 27.3411 21.4389 27.7176 21.4389 28.1882C21.4389 28.6588 21.8154 29.0352 22.286 29.0352C22.7566 29.0352 23.133 28.6588 23.133 28.1882C23.133 27.7176 22.7566 27.3411 22.286 27.3411ZM29.2742 15.2235C28.8036 15.2235 28.4272 15.5999 28.4272 16.0705C28.4272 16.5411 28.8036 16.9176 29.2742 16.9176C29.7448 16.9176 30.1213 16.5411 30.1213 16.0705C30.1213 15.5999 29.7448 15.2235 29.2742 15.2235ZM28.7566 8.6117C28.9448 8.6117 29.086 8.47053 29.086 8.28229C29.086 8.09405 28.9448 7.95288 28.7566 7.95288C28.5683 7.95288 28.4272 8.09405 28.4272 8.28229C28.4272 8.47053 28.5919 8.6117 28.7566 8.6117ZM15.2742 0.846995C15.4624 0.846995 15.6036 0.705819 15.6036 0.517583C15.6036 0.329348 15.4624 0.188171 15.2742 0.188171C15.086 0.188171 14.9448 0.329348 14.9448 0.517583C14.9448 0.705819 15.1095 0.846995 15.2742 0.846995ZM1.81539 8.6117C2.00362 8.6117 2.1448 8.47053 2.1448 8.28229C2.1448 8.09405 2.00362 7.95288 1.81539 7.95288C1.62715 7.95288 1.48598 8.09405 1.48598 8.28229C1.48598 8.47053 1.62715 8.6117 1.81539 8.6117ZM1.81539 23.5293C1.62715 23.5293 1.48598 23.6705 1.48598 23.8588C1.48598 24.047 1.62715 24.1882 1.81539 24.1882C2.00362 24.1882 2.1448 24.047 2.1448 23.8588C2.1448 23.6705 1.9801 23.5293 1.81539 23.5293ZM28.7801 23.5058C28.5919 23.5058 28.4507 23.647 28.4507 23.8352C28.4507 24.0235 28.5919 24.1646 28.7801 24.1646C28.9683 24.1646 29.1095 24.0235 29.1095 23.8352C29.1095 23.6705 28.9683 23.5058 28.7801 23.5058Z",
+							"fill": "#3859FF"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M19.8154 20.5882C18.8036 20.2588 17.7683 20.6823 17.2272 21.5293L17.2036 21.5764C16.686 22.447 15.6507 22.9176 14.6389 22.6117C14.0742 22.4235 13.6272 22.047 13.3448 21.5529C13.2977 21.4117 13.2742 21.2705 13.2742 21.1058C13.2272 20.1411 13.9801 19.3176 14.9448 19.2941H15.1801C16.9683 19.3646 18.4507 17.9764 18.5213 16.2117C18.5919 14.4235 17.2036 12.9411 15.4389 12.8705H14.9448C13.9801 12.8235 13.2977 12.0705 13.3448 11.1293C13.3448 10.8941 13.3919 10.6823 13.486 10.4705L13.5095 10.3999C13.5566 10.2823 13.5801 10.2352 13.6272 10.1176C14.0036 8.91758 13.3448 7.67052 12.1448 7.29405C10.9683 6.94111 9.69774 7.57641 9.32127 8.75288C8.9448 9.90582 9.5801 11.1529 10.733 11.5529C10.9213 11.6235 11.0389 11.647 11.2036 11.6705L11.2977 11.6941C12.2154 11.7882 12.9213 12.5176 12.8977 13.4588C12.8742 13.7882 12.7801 14.1176 12.5919 14.3764C12.286 14.847 12.1213 15.3882 12.0977 15.9764C12.0742 16.6588 12.2624 17.3176 12.5919 17.8352C12.7801 18.0941 12.8742 18.3999 12.8977 18.7529C12.9448 19.6941 12.3095 20.4235 11.3919 20.5176H11.3683C11.2272 20.5176 11.086 20.5411 10.9683 20.5646C9.72127 20.847 8.99186 22.0705 9.27421 23.2705C9.55657 24.4941 10.7801 25.2235 11.9566 24.9646C12.5919 24.8235 13.086 24.447 13.3919 23.9529C13.9095 23.0588 14.9919 22.6352 16.0272 22.9646C16.5919 23.1293 16.9683 23.4823 17.2507 23.9293L17.2742 23.9764C17.5095 24.3529 17.9566 24.7529 18.4977 24.9176C19.7213 25.2705 20.9213 24.6117 21.2977 23.4588C21.6742 22.2117 20.9683 20.9646 19.8154 20.5882ZM70.2625 16.2588C70.537 16.2588 70.8004 16.1497 70.9945 15.9555C71.1887 15.7614 71.2977 15.498 71.2977 15.2235C71.2977 14.9489 71.1887 14.6856 70.9945 14.4914C70.8004 14.2972 70.537 14.1882 70.2625 14.1882C69.9879 14.1882 69.7245 14.2972 69.5304 14.4914C69.3362 14.6856 69.2272 14.9489 69.2272 15.2235C69.2272 15.498 69.3362 15.7614 69.5304 15.9555C69.7245 16.1497 69.9879 16.2588 70.2625 16.2588ZM43.8624 15.5293C43.7213 15.4588 43.5095 15.2941 43.2036 15.1058C42.3801 14.5411 41.7448 14.1176 41.3448 13.8117H43.9095V12.5882H41.5095C41.5566 12.4705 41.5566 11.2941 41.5566 10.9646C41.5801 10.6823 41.6036 10.447 41.6036 10.2823H43.5095V9.05876H39.5801C39.7683 8.72935 39.9095 8.37641 40.0272 7.95288L38.7095 7.83523C38.3801 8.89405 37.8154 9.8117 37.0154 10.5882C37.3448 10.9176 37.533 11.1293 37.6036 11.2705C37.7213 11.3882 37.7919 11.5058 37.886 11.5764C38.333 11.1293 38.6624 10.7058 38.9213 10.2823H40.2389C40.2389 10.7764 40.1919 12.1646 40.1213 12.5646H37.133V13.7882H39.8625C39.5095 14.6352 38.5448 15.3882 37.0389 15.9999C37.3213 16.3999 37.6036 16.8235 37.8625 17.2941C38.1448 17.0823 38.4507 16.9176 38.733 16.7999V23.5293H40.1448V22.847H47.0625V23.5293H48.5213V16.7529H43.086L43.8624 15.5293ZM38.8036 16.7293C39.7919 16.1176 40.4272 15.4823 40.7566 14.847C40.8977 14.9176 41.086 15.0823 41.2977 15.2705C42.0507 15.8823 42.6625 16.3764 43.086 16.7293H38.8036ZM47.0625 21.7646H40.1448V20.4235H47.0625V21.7646ZM47.0625 19.3176H40.1448V18.0235H47.0625V19.3176Z",
+							"fill": "#3859FF"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M44.4507 15.6941H49.5095V8.94111H44.4507V15.6941ZM45.7683 10.3058H48.2154V14.4235H45.7683V10.3058ZM54.4742 11.3882L55.7213 10.5411C55.0389 9.55288 54.4507 8.79994 53.9801 8.2117L52.8977 8.94111C53.0389 9.17641 53.2507 9.52935 53.5566 9.97641C54.0036 10.6352 54.3095 11.1058 54.4742 11.3882ZM64.0272 13.9764C64.1448 13.8588 64.286 13.647 64.4742 13.3646C64.8742 12.847 65.1566 12.447 65.2977 12.2117L64.3095 11.5293C64.0977 11.9058 63.6742 12.4705 63.0625 13.247L64.0272 13.9764ZM58.4507 13.247C58.3095 13.0352 58.0977 12.7529 57.7919 12.3999C57.5095 11.9999 57.2742 11.7176 57.133 11.5529L56.2154 12.2352C56.7566 12.9646 57.1801 13.5529 57.4624 13.9999L58.4507 13.247ZM55.2977 20.2823C55.1801 20.3999 55.1095 20.4941 55.086 20.5176V13.9293H52.5213V15.4588H53.6742V20.8941C53.6742 21.4352 53.5566 21.8117 53.2977 22.047L54.1683 23.3882C54.686 22.7058 55.4624 21.8823 56.4977 20.9411C56.3801 20.2117 56.3095 19.647 56.2154 19.2235C56.0507 19.4823 55.7448 19.8352 55.2977 20.2823ZM54.1683 23.4117V23.3882L54.1448 23.4117H54.1683ZM57.0389 23.5764H58.4036V22.9646H63.0389V23.5764H64.4507V17.0352H57.0389V23.5764ZM58.4036 18.2588H63.0389V19.5529H58.4036V18.2588ZM58.4036 20.5882H63.0389V21.8117H58.4036V20.5882Z",
+							"fill": "#3859FF"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M65.3213 10.7999V9.647H62.9213C63.2742 9.08229 63.5095 8.72935 63.5801 8.6117C63.6977 8.39994 63.7683 8.25876 63.8625 8.18817L62.4977 7.88229C62.1683 8.49405 61.8154 9.08229 61.4154 9.647H60.0977C59.9566 9.4117 59.7213 9.03523 59.3919 8.54111C59.2036 8.25876 59.0625 8.02347 58.9448 7.85876L57.6272 8.16464C57.8154 8.39994 58.1213 8.89405 58.5448 9.62347H56.2625V10.7764H58.8272V14.7764H55.7683V15.9293H65.6742V14.7764H62.5213V10.7999H65.3213ZM61.3448 14.7764H60.0977V10.7764H61.3448V14.7764Z",
+							"fill": "#3859FF"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ZhipuaiTextCn"
+}
diff --git a/app/components/base/icons/src/public/llm/ZhipuaiTextCn.tsx b/app/components/base/icons/src/public/llm/ZhipuaiTextCn.tsx
new file mode 100644
index 0000000..5311241
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/ZhipuaiTextCn.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ZhipuaiTextCn.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ZhipuaiTextCn'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/llm/index.ts b/app/components/base/icons/src/public/llm/index.ts
new file mode 100644
index 0000000..cc9b531
--- /dev/null
+++ b/app/components/base/icons/src/public/llm/index.ts
@@ -0,0 +1,42 @@
+export { default as AnthropicDark } from './AnthropicDark'
+export { default as AnthropicLight } from './AnthropicLight'
+export { default as AnthropicText } from './AnthropicText'
+export { default as Anthropic } from './Anthropic'
+export { default as AzureOpenaiServiceText } from './AzureOpenaiServiceText'
+export { default as AzureOpenaiService } from './AzureOpenaiService'
+export { default as AzureaiText } from './AzureaiText'
+export { default as Azureai } from './Azureai'
+export { default as BaichuanText } from './BaichuanText'
+export { default as Baichuan } from './Baichuan'
+export { default as ChatglmText } from './ChatglmText'
+export { default as Chatglm } from './Chatglm'
+export { default as CohereText } from './CohereText'
+export { default as Cohere } from './Cohere'
+export { default as Gpt3 } from './Gpt3'
+export { default as Gpt4 } from './Gpt4'
+export { default as HuggingfaceTextHub } from './HuggingfaceTextHub'
+export { default as HuggingfaceText } from './HuggingfaceText'
+export { default as Huggingface } from './Huggingface'
+export { default as IflytekSparkTextCn } from './IflytekSparkTextCn'
+export { default as IflytekSparkText } from './IflytekSparkText'
+export { default as IflytekSpark } from './IflytekSpark'
+export { default as JinaText } from './JinaText'
+export { default as Jina } from './Jina'
+export { default as LocalaiText } from './LocalaiText'
+export { default as Localai } from './Localai'
+export { default as Microsoft } from './Microsoft'
+export { default as OpenaiBlack } from './OpenaiBlack'
+export { default as OpenaiBlue } from './OpenaiBlue'
+export { default as OpenaiGreen } from './OpenaiGreen'
+export { default as OpenaiText } from './OpenaiText'
+export { default as OpenaiTransparent } from './OpenaiTransparent'
+export { default as OpenaiViolet } from './OpenaiViolet'
+export { default as OpenllmText } from './OpenllmText'
+export { default as Openllm } from './Openllm'
+export { default as ReplicateText } from './ReplicateText'
+export { default as Replicate } from './Replicate'
+export { default as XorbitsInferenceText } from './XorbitsInferenceText'
+export { default as XorbitsInference } from './XorbitsInference'
+export { default as ZhipuaiTextCn } from './ZhipuaiTextCn'
+export { default as ZhipuaiText } from './ZhipuaiText'
+export { default as Zhipuai } from './Zhipuai'
diff --git a/app/components/base/icons/src/public/model/Checked.json b/app/components/base/icons/src/public/model/Checked.json
new file mode 100644
index 0000000..7e96db7
--- /dev/null
+++ b/app/components/base/icons/src/public/model/Checked.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M13.3332 4L5.99984 11.3333L2.6665 8",
+					"stroke": "#155EEF",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Checked"
+}
diff --git a/app/components/base/icons/src/public/model/Checked.tsx b/app/components/base/icons/src/public/model/Checked.tsx
new file mode 100644
index 0000000..ec8b54f
--- /dev/null
+++ b/app/components/base/icons/src/public/model/Checked.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Checked.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Checked'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/model/index.ts b/app/components/base/icons/src/public/model/index.ts
new file mode 100644
index 0000000..719a6f0
--- /dev/null
+++ b/app/components/base/icons/src/public/model/index.ts
@@ -0,0 +1 @@
+export { default as Checked } from './Checked'
diff --git a/app/components/base/icons/src/public/other/DefaultToolIcon.json b/app/components/base/icons/src/public/other/DefaultToolIcon.json
new file mode 100644
index 0000000..32786d2
--- /dev/null
+++ b/app/components/base/icons/src/public/other/DefaultToolIcon.json
@@ -0,0 +1,81 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"opacity": "0.5"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "rect",
+						"attributes": {
+							"width": "24",
+							"height": "24",
+							"rx": "6",
+							"fill": "#E5E7EB"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "rect",
+						"attributes": {
+							"x": "0.25",
+							"y": "0.25",
+							"width": "23.5",
+							"height": "23.5",
+							"rx": "5.75",
+							"stroke": "black",
+							"stroke-opacity": "0.05",
+							"stroke-width": "0.5"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M11.8876 5.30588C11.9601 5.26959 12.019 5.21074 12.0553 5.13817L12.414 4.4208C12.5522 4.1444 12.9466 4.1444 13.0848 4.4208L13.4435 5.13817C13.4797 5.21074 13.5386 5.26959 13.6112 5.30588L14.3285 5.66457C14.6049 5.80276 14.6049 6.19719 14.3285 6.33539L13.6112 6.69407C13.5386 6.73036 13.4797 6.78921 13.4435 6.86178L13.0848 7.57916C12.9466 7.85555 12.5522 7.85555 12.414 7.57916L12.0553 6.86178C12.019 6.78921 11.9601 6.73036 11.8876 6.69407L11.1702 6.33539C10.8938 6.19719 10.8938 5.80276 11.1702 5.66457L11.8876 5.30588Z",
+							"fill": "#667085"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M7.88756 6.55588C7.96013 6.51959 8.01898 6.46074 8.05527 6.38817L8.28895 5.9208C8.42715 5.6444 8.82158 5.6444 8.95978 5.9208L9.19346 6.38817C9.22975 6.46074 9.2886 6.51959 9.36117 6.55588L9.82854 6.78956C10.1049 6.92776 10.1049 7.32219 9.82854 7.46039L9.36117 7.69407C9.2886 7.73036 9.22975 7.78921 9.19346 7.86178L8.95978 8.32915C8.82158 8.60555 8.42715 8.60555 8.28895 8.32915L8.05527 7.86178C8.01898 7.78921 7.96013 7.73036 7.88756 7.69407L7.42019 7.46039C7.14379 7.32219 7.14379 6.92776 7.42019 6.78957L7.88756 6.55588Z",
+							"fill": "#667085"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M17.9417 5.91012C18.1985 6.08504 18.2648 6.43496 18.0899 6.6917L16.0062 9.74998H17.4375C17.7482 9.74998 18 10.0018 18 10.3125V18.1875C18 18.9124 17.4124 19.5 16.6875 19.5H7.3125C6.58763 19.5 6 18.9123 6 18.1875V10.3125C6 10.0018 6.25184 9.74998 6.5625 9.74998H14.6449L17.1601 6.05826C17.3351 5.80152 17.685 5.7352 17.9417 5.91012ZM10.3125 12.75C10.0018 12.75 9.75 13.0018 9.75 13.3125C9.75 13.6231 10.0018 13.875 10.3125 13.875H13.6875C13.9982 13.875 14.25 13.6231 14.25 13.3125C14.25 13.0018 13.9982 12.75 13.6875 12.75H10.3125Z",
+							"fill": "#667085"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "DefaultToolIcon"
+}
diff --git a/app/components/base/icons/src/public/other/DefaultToolIcon.tsx b/app/components/base/icons/src/public/other/DefaultToolIcon.tsx
new file mode 100644
index 0000000..dd28b8a
--- /dev/null
+++ b/app/components/base/icons/src/public/other/DefaultToolIcon.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './DefaultToolIcon.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'DefaultToolIcon'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/other/Icon3Dots.json b/app/components/base/icons/src/public/other/Icon3Dots.json
new file mode 100644
index 0000000..b59b293
--- /dev/null
+++ b/app/components/base/icons/src/public/other/Icon3Dots.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M5 6.5V5M8.93934 7.56066L10 6.5M10.0103 11.5H11.5103",
+					"stroke": "#667085",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Icon3Dots"
+}
diff --git a/app/components/base/icons/src/public/other/Icon3Dots.tsx b/app/components/base/icons/src/public/other/Icon3Dots.tsx
new file mode 100644
index 0000000..bcc2cee
--- /dev/null
+++ b/app/components/base/icons/src/public/other/Icon3Dots.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Icon3Dots.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Icon3Dots'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/other/Message3Fill.json b/app/components/base/icons/src/public/other/Message3Fill.json
new file mode 100644
index 0000000..ae84890
--- /dev/null
+++ b/app/components/base/icons/src/public/other/Message3Fill.json
@@ -0,0 +1,173 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "message-3-fill"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector",
+							"filter": "url(#filter0_d_1071_49501)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M2 8.99374C2 5.68349 4.67654 3 8.00066 3H15.9993C19.3134 3 22 5.69478 22 8.99374V21H8.00066C4.68659 21 2 18.3052 2 15.0063V8.99374ZM14 11V13H16V11H14ZM8 11V13H10V11H8Z",
+									"fill": "url(#paint0_linear_1071_49501)"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_1071_49501",
+							"x": "1.5",
+							"y": "2.75",
+							"width": "21",
+							"height": "19",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "0.25"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "0.25"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feComposite",
+								"attributes": {
+									"in2": "hardAlpha",
+									"operator": "out"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_1071_49501"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_1071_49501",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint0_linear_1071_49501",
+							"x1": "12",
+							"y1": "3",
+							"x2": "12",
+							"y2": "21",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#296DFF"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#0BA5EC"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Message3Fill"
+}
diff --git a/app/components/base/icons/src/public/other/Message3Fill.tsx b/app/components/base/icons/src/public/other/Message3Fill.tsx
new file mode 100644
index 0000000..0411377
--- /dev/null
+++ b/app/components/base/icons/src/public/other/Message3Fill.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Message3Fill.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Message3Fill'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/other/RowStruct.json b/app/components/base/icons/src/public/other/RowStruct.json
new file mode 100644
index 0000000..49ef717
--- /dev/null
+++ b/app/components/base/icons/src/public/other/RowStruct.json
@@ -0,0 +1,56 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "624",
+			"height": "48",
+			"viewBox": "0 0 624 48",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"x": "8",
+					"y": "7",
+					"width": "16",
+					"height": "16",
+					"rx": "5",
+					"fill": "#F2F4F7"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"x": "32",
+					"y": "10",
+					"width": "233",
+					"height": "10",
+					"rx": "3",
+					"fill": "#EAECF0"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"x": "32",
+					"y": "31",
+					"width": "345",
+					"height": "6",
+					"rx": "3",
+					"fill": "#F2F4F7"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "RowStruct"
+}
diff --git a/app/components/base/icons/src/public/other/RowStruct.tsx b/app/components/base/icons/src/public/other/RowStruct.tsx
new file mode 100644
index 0000000..14487c8
--- /dev/null
+++ b/app/components/base/icons/src/public/other/RowStruct.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './RowStruct.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'RowStruct'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/other/index.ts b/app/components/base/icons/src/public/other/index.ts
new file mode 100644
index 0000000..a7558ca
--- /dev/null
+++ b/app/components/base/icons/src/public/other/index.ts
@@ -0,0 +1,4 @@
+export { default as Icon3Dots } from './Icon3Dots'
+export { default as DefaultToolIcon } from './DefaultToolIcon'
+export { default as Message3Fill } from './Message3Fill'
+export { default as RowStruct } from './RowStruct'
diff --git a/app/components/base/icons/src/public/plugins/Google.json b/app/components/base/icons/src/public/plugins/Google.json
new file mode 100644
index 0000000..198050e
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/Google.json
@@ -0,0 +1,53 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M22.501 12.2331C22.501 11.3698 22.4296 10.7398 22.2748 10.0864H12.2153V13.983H18.12C18.001 14.9514 17.3582 16.4097 15.9296 17.3897L15.9096 17.5202L19.0902 19.9349L19.3106 19.9564C21.3343 18.1247 22.501 15.4297 22.501 12.2331Z",
+					"fill": "#4285F4"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M12.2147 22.5001C15.1075 22.5001 17.5361 21.5667 19.3099 19.9567L15.929 17.39C15.0242 18.0083 13.8099 18.44 12.2147 18.44C9.38142 18.44 6.97669 16.6083 6.11947 14.0767L5.99382 14.0871L2.68656 16.5955L2.64331 16.7133C4.40519 20.1433 8.02423 22.5001 12.2147 22.5001Z",
+					"fill": "#34A853"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M6.11997 14.0765C5.89379 13.4232 5.76289 12.7231 5.76289 11.9998C5.76289 11.2764 5.89379 10.5765 6.10807 9.92313L6.10208 9.78398L2.75337 7.23535L2.64381 7.28642C1.91765 8.70977 1.50098 10.3081 1.50098 11.9998C1.50098 13.6915 1.91765 15.2897 2.64381 16.7131L6.11997 14.0765Z",
+					"fill": "#FBBC05"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M12.2148 5.55997C14.2267 5.55997 15.5838 6.41163 16.3576 7.12335L19.3814 4.23C17.5243 2.53834 15.1076 1.5 12.2148 1.5C8.02426 1.5 4.4052 3.85665 2.64331 7.28662L6.10759 9.92332C6.97672 7.39166 9.38146 5.55997 12.2148 5.55997Z",
+					"fill": "#EB4335"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Google"
+}
diff --git a/app/components/base/icons/src/public/plugins/Google.tsx b/app/components/base/icons/src/public/plugins/Google.tsx
new file mode 100644
index 0000000..7d8d667
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/Google.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Google.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Google'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/plugins/PartnerDark.json b/app/components/base/icons/src/public/plugins/PartnerDark.json
new file mode 100644
index 0000000..af3f208
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/PartnerDark.json
@@ -0,0 +1,447 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "20",
+			"height": "20",
+			"viewBox": "0 0 20 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Partner"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "mask",
+						"attributes": {
+							"id": "mask0_6296_109592",
+							"style": "mask-type:alpha",
+							"maskUnits": "userSpaceOnUse",
+							"x": "1",
+							"y": "0",
+							"width": "18",
+							"height": "20"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Mask"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z",
+											"fill": "#932F19"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z",
+											"fill": "url(#paint0_linear_6296_109592)",
+											"fill-opacity": "0.9"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M7.47222 1.78016C8.45993 1.20991 8.90155 0.958665 9.36471 0.860217C9.78356 0.771189 10.2164 0.771189 10.6353 0.860217C11.0984 0.958665 11.5401 1.20991 12.5278 1.78016L15.8547 3.70096C16.8424 4.27121 17.2808 4.52805 17.5976 4.87994C17.8842 5.19815 18.1006 5.57304 18.2329 5.98028C18.3792 6.43061 18.3825 6.9387 18.3825 8.0792V11.9208C18.3825 13.0613 18.3792 13.5694 18.2329 14.0197C18.1006 14.427 17.8842 14.8018 17.5976 15.1201C17.2808 15.4719 16.8424 15.7288 15.8547 16.299L12.5278 18.2198C11.5401 18.7901 11.0984 19.0413 10.6353 19.1398C10.2164 19.2288 9.78356 19.2288 9.36471 19.1398C8.90155 19.0413 8.45993 18.7901 7.47222 18.2198L4.1453 16.299C3.1576 15.7288 2.7192 15.4719 2.40236 15.1201C2.11584 14.8018 1.89939 14.427 1.76707 14.0197C1.62075 13.5694 1.61752 13.0613 1.61752 11.9208V8.0792C1.61752 6.9387 1.62075 6.43061 1.76707 5.98028C1.89939 5.57304 2.11584 5.19815 2.40236 4.87994C2.7192 4.52805 3.1576 4.27121 4.1453 3.70096L7.47222 1.78016Z",
+											"stroke": "url(#paint1_linear_6296_109592)",
+											"stroke-opacity": "0.8",
+											"stroke-width": "0.555556"
+										},
+										"children": []
+									}
+								]
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"mask": "url(#mask0_6296_109592)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "badge-bg"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z",
+											"fill": "#932F19"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z",
+											"fill": "url(#paint2_linear_6296_109592)",
+											"fill-opacity": "0.9"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M7.58333 1.97261C8.58402 1.39487 8.99036 1.16698 9.41092 1.07758C9.7993 0.99503 10.2007 0.99503 10.5891 1.07758C11.0096 1.16698 11.416 1.39487 12.4167 1.97261L15.7436 3.89341C16.7443 4.47116 17.1448 4.70911 17.4325 5.02863C17.6982 5.3237 17.8989 5.67133 18.0216 6.04895C18.1544 6.45786 18.1603 6.92371 18.1603 8.0792V11.9208C18.1603 13.0763 18.1544 13.5421 18.0216 13.951C17.8989 14.3287 17.6982 14.6763 17.4325 14.9714C17.1448 15.2909 16.7443 15.5288 15.7436 16.1066L12.4167 18.0274C11.416 18.6051 11.0096 18.833 10.5891 18.9224C10.2007 19.005 9.7993 19.005 9.41092 18.9224C8.99036 18.833 8.58402 18.6051 7.58333 18.0274L4.25641 16.1066C3.25572 15.5288 2.8552 15.2909 2.5675 14.9714C2.30182 14.6763 2.10112 14.3287 1.97842 13.951C1.84556 13.5421 1.83975 13.0763 1.83975 11.9208V8.0792C1.83975 6.92371 1.84556 6.45786 1.97842 6.04895C2.10112 5.67133 2.30182 5.3237 2.5675 5.02863C2.8552 4.70911 3.25572 4.47116 4.25641 3.89341L7.58333 1.97261Z",
+											"stroke": "url(#paint3_linear_6296_109592)",
+											"stroke-opacity": "0.8"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "handshake",
+									"filter": "url(#filter0_d_6296_109592)"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M11.0969 9.64841C10.895 9.44642 10.5675 9.44642 10.3656 9.64841L9.99991 10.0141C9.59596 10.418 8.94109 10.418 8.53717 10.0141C8.13325 9.61015 8.13325 8.95527 8.53717 8.55135L11.4491 5.63868C12.5371 5.39255 13.7238 5.69302 14.5709 6.54011C15.8221 7.79128 15.8807 9.78339 14.7469 11.104L13.6567 12.2081L11.0969 9.64841ZM5.42889 6.54011C6.55286 5.41614 8.27475 5.25452 9.57067 6.05524L7.80581 7.81999C6.99797 8.62783 6.99797 9.9376 7.80581 10.7454C8.58917 11.5288 9.8445 11.5525 10.6564 10.8167L10.7313 10.7454L12.9253 12.9395L10.7313 15.1336C10.3273 15.5375 9.67245 15.5375 9.26855 15.1336L5.42889 11.2939C4.11615 9.9812 4.11615 7.85284 5.42889 6.54011Z",
+											"fill": "url(#paint4_linear_6296_109592)",
+											"shape-rendering": "crispEdges"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "highlight",
+									"opacity": "0.5",
+									"d": "M0 0H15.5556L5.26663 20H0V0Z",
+									"fill": "url(#paint5_linear_6296_109592)"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_6296_109592",
+							"x": "3.94434",
+							"y": "5.30556",
+							"width": "12.1111",
+							"height": "10.881",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "0.25"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "0.25"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feComposite",
+								"attributes": {
+									"in2": "hardAlpha",
+									"operator": "out"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_6296_109592"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_6296_109592",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint0_linear_6296_109592",
+							"x1": "0",
+							"y1": "0",
+							"x2": "22.6412",
+							"y2": "1.78551",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#FF692E"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#E04F16"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint1_linear_6296_109592",
+							"x1": "8.55422",
+							"y1": "-1.28187e-07",
+							"x2": "19.7802",
+							"y2": "12.7346",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.2"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#FF4405"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint2_linear_6296_109592",
+							"x1": "0",
+							"y1": "0",
+							"x2": "22.6412",
+							"y2": "1.78551",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#FF692E"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#E04F16"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint3_linear_6296_109592",
+							"x1": "8.55422",
+							"y1": "-1.28187e-07",
+							"x2": "19.7802",
+							"y2": "12.7346",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.2"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#FF4405"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint4_linear_6296_109592",
+							"x1": "9.99989",
+							"y1": "5.55556",
+							"x2": "9.99989",
+							"y2": "15.4365",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.95"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "white",
+									"stop-opacity": "0.8"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint5_linear_6296_109592",
+							"x1": "-4.78632",
+							"y1": "4.375",
+							"x2": "16.2164",
+							"y2": "10.4",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.12"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "white",
+									"stop-opacity": "0.2"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "PartnerDark"
+}
diff --git a/app/components/base/icons/src/public/plugins/PartnerDark.tsx b/app/components/base/icons/src/public/plugins/PartnerDark.tsx
new file mode 100644
index 0000000..4277762
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/PartnerDark.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './PartnerDark.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'PartnerDark'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/plugins/PartnerLight.json b/app/components/base/icons/src/public/plugins/PartnerLight.json
new file mode 100644
index 0000000..3d7391b
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/PartnerLight.json
@@ -0,0 +1,446 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "20",
+			"height": "20",
+			"viewBox": "0 0 20 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Partner"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "mask",
+						"attributes": {
+							"id": "mask0_6291_109635",
+							"style": "mask-type:alpha",
+							"maskUnits": "userSpaceOnUse",
+							"x": "1",
+							"y": "0",
+							"width": "18",
+							"height": "20"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Mask"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z",
+											"fill": "#F9DBAF"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z",
+											"fill": "url(#paint0_linear_6291_109635)",
+											"fill-opacity": "0.9"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M7.47222 1.78016C8.45993 1.20991 8.90155 0.958665 9.36471 0.860217C9.78356 0.771189 10.2164 0.771189 10.6353 0.860217C11.0984 0.958665 11.5401 1.20991 12.5278 1.78016L15.8547 3.70096C16.8424 4.27121 17.2808 4.52805 17.5976 4.87994C17.8842 5.19815 18.1006 5.57304 18.2329 5.98028C18.3792 6.43061 18.3825 6.9387 18.3825 8.0792V11.9208C18.3825 13.0613 18.3792 13.5694 18.2329 14.0197C18.1006 14.427 17.8842 14.8018 17.5976 15.1201C17.2808 15.4719 16.8424 15.7288 15.8547 16.299L12.5278 18.2198C11.5401 18.7901 11.0984 19.0413 10.6353 19.1398C10.2164 19.2288 9.78356 19.2288 9.36471 19.1398C8.90155 19.0413 8.45993 18.7901 7.47222 18.2198L4.1453 16.299C3.1576 15.7288 2.7192 15.4719 2.40236 15.1201C2.11584 14.8018 1.89939 14.427 1.76707 14.0197C1.62075 13.5694 1.61752 13.0613 1.61752 11.9208V8.0792C1.61752 6.9387 1.62075 6.43061 1.76707 5.98028C1.89939 5.57304 2.11584 5.19815 2.40236 4.87994C2.7192 4.52805 3.1576 4.27121 4.1453 3.70096L7.47222 1.78016Z",
+											"stroke": "url(#paint1_linear_6291_109635)",
+											"stroke-opacity": "0.8",
+											"stroke-width": "0.555556"
+										},
+										"children": []
+									}
+								]
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"mask": "url(#mask0_6291_109635)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "badge-bg"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z",
+											"fill": "#F9DBAF"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M7.33333 1.5396C8.30481 0.978718 8.79055 0.698276 9.30696 0.58851C9.76388 0.491388 10.2361 0.491388 10.693 0.58851C11.2094 0.698276 11.6952 0.978718 12.6667 1.5396L15.9936 3.4604C16.9651 4.02128 17.4508 4.30172 17.8041 4.69407C18.1166 5.04121 18.3528 5.45018 18.4971 5.89444C18.6603 6.39655 18.6603 6.95744 18.6603 8.0792V11.9208C18.6603 13.0426 18.6603 13.6034 18.4971 14.1056C18.3528 14.5498 18.1166 14.9588 17.8041 15.3059C17.4508 15.6983 16.9651 15.9787 15.9936 16.5396L12.6667 18.4604C11.6952 19.0213 11.2094 19.3017 10.693 19.4115C10.2361 19.5086 9.76388 19.5086 9.30696 19.4115C8.79055 19.3017 8.30481 19.0213 7.33333 18.4604L4.00641 16.5396C3.03493 15.9787 2.5492 15.6983 2.19593 15.3059C1.88336 14.9588 1.64724 14.5498 1.50289 14.1056C1.33975 13.6034 1.33975 13.0426 1.33975 11.9208V8.0792C1.33975 6.95744 1.33975 6.39655 1.50289 5.89444C1.64724 5.45018 1.88336 5.04121 2.19593 4.69407C2.5492 4.30172 3.03493 4.02128 4.00641 3.4604L7.33333 1.5396Z",
+											"fill": "url(#paint2_linear_6291_109635)",
+											"fill-opacity": "0.9"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M7.58333 1.97261C8.58402 1.39487 8.99036 1.16698 9.41092 1.07758C9.7993 0.99503 10.2007 0.99503 10.5891 1.07758C11.0096 1.16698 11.416 1.39487 12.4167 1.97261L15.7436 3.89341C16.7443 4.47116 17.1448 4.70911 17.4325 5.02863C17.6982 5.3237 17.8989 5.67133 18.0216 6.04895C18.1544 6.45786 18.1603 6.92371 18.1603 8.0792V11.9208C18.1603 13.0763 18.1544 13.5421 18.0216 13.951C17.8989 14.3287 17.6982 14.6763 17.4325 14.9714C17.1448 15.2909 16.7443 15.5288 15.7436 16.1066L12.4167 18.0274C11.416 18.6051 11.0096 18.833 10.5891 18.9224C10.2007 19.005 9.7993 19.005 9.41092 18.9224C8.99036 18.833 8.58402 18.6051 7.58333 18.0274L4.25641 16.1066C3.25572 15.5288 2.8552 15.2909 2.5675 14.9714C2.30182 14.6763 2.10112 14.3287 1.97842 13.951C1.84556 13.5421 1.83975 13.0763 1.83975 11.9208V8.0792C1.83975 6.92371 1.84556 6.45786 1.97842 6.04895C2.10112 5.67133 2.30182 5.3237 2.5675 5.02863C2.8552 4.70911 3.25572 4.47116 4.25641 3.89341L7.58333 1.97261Z",
+											"stroke": "url(#paint3_linear_6291_109635)",
+											"stroke-opacity": "0.8"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "handshake",
+									"filter": "url(#filter0_d_6291_109635)"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M11.0969 9.64852C10.895 9.44652 10.5675 9.44652 10.3656 9.64852L9.99991 10.0142C9.59596 10.4181 8.94109 10.4181 8.53717 10.0142C8.13325 9.61025 8.13325 8.95537 8.53717 8.55146L11.4491 5.63879C12.5371 5.39265 13.7238 5.69313 14.5709 6.54022C15.8221 7.79139 15.8807 9.7835 14.7469 11.1041L13.6567 12.2083L11.0969 9.64852ZM5.42889 6.54022C6.55286 5.41625 8.27475 5.25463 9.57067 6.05534L7.80581 7.8201C6.99797 8.62794 6.99797 9.93771 7.80581 10.7456C8.58917 11.5289 9.8445 11.5526 10.6564 10.8168L10.7313 10.7456L12.9253 12.9396L10.7313 15.1337C10.3273 15.5376 9.67245 15.5376 9.26855 15.1337L5.42889 11.294C4.11615 9.98131 4.11615 7.85295 5.42889 6.54022Z",
+											"fill": "url(#paint4_linear_6291_109635)",
+											"shape-rendering": "crispEdges"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "highlight",
+									"opacity": "0.5",
+									"d": "M0 0H15.5556L5.26663 20H0V0Z",
+									"fill": "url(#paint5_linear_6291_109635)"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_6291_109635",
+							"x": "3.94434",
+							"y": "5.30566",
+							"width": "12.1111",
+							"height": "10.8809",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "0.25"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "0.25"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feComposite",
+								"attributes": {
+									"in2": "hardAlpha",
+									"operator": "out"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_6291_109635"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_6291_109635",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint0_linear_6291_109635",
+							"x1": "0",
+							"y1": "0",
+							"x2": "22.6412",
+							"y2": "1.78551",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#FF692E"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#E04F16"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint1_linear_6291_109635",
+							"x1": "8.55422",
+							"y1": "-1.28187e-07",
+							"x2": "19.7802",
+							"y2": "12.7346",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.95"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#E62E05"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint2_linear_6291_109635",
+							"x1": "0",
+							"y1": "0",
+							"x2": "22.6412",
+							"y2": "1.78551",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#FF692E"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#E04F16"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint3_linear_6291_109635",
+							"x1": "8.55422",
+							"y1": "-1.28187e-07",
+							"x2": "19.7802",
+							"y2": "12.7346",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.95"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#E62E05"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint4_linear_6291_109635",
+							"x1": "9.99989",
+							"y1": "5.55566",
+							"x2": "9.99989",
+							"y2": "15.4366",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "white",
+									"stop-opacity": "0.9"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint5_linear_6291_109635",
+							"x1": "-4.78632",
+							"y1": "4.375",
+							"x2": "16.2164",
+							"y2": "10.4",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.12"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "white",
+									"stop-opacity": "0.3"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "PartnerLight"
+}
diff --git a/app/components/base/icons/src/public/plugins/PartnerLight.tsx b/app/components/base/icons/src/public/plugins/PartnerLight.tsx
new file mode 100644
index 0000000..3591c96
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/PartnerLight.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './PartnerLight.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'PartnerLight'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/plugins/VerifiedDark.json b/app/components/base/icons/src/public/plugins/VerifiedDark.json
new file mode 100644
index 0000000..ed22826
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/VerifiedDark.json
@@ -0,0 +1,457 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "20",
+			"height": "20",
+			"viewBox": "0 0 20 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Verified"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "mask",
+						"attributes": {
+							"id": "mask0_6296_109593",
+							"style": "mask-type:alpha",
+							"maskUnits": "userSpaceOnUse",
+							"x": "0",
+							"y": "0",
+							"width": "20",
+							"height": "20"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Mask"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"fill-rule": "evenodd",
+											"clip-rule": "evenodd",
+											"d": "M8.08817 1.62521C9.14394 0.569383 10.8558 0.569374 11.9116 1.62521L12.8128 2.52641C12.9819 2.69542 13.2111 2.79037 13.4501 2.79037H14.5059C15.9991 2.79037 17.2095 4.00082 17.2095 5.49398V6.54981C17.2095 6.78882 17.3045 7.01805 17.4735 7.18706L18.3747 8.08826C19.4305 9.1441 19.4305 10.8559 18.3747 11.9118L17.4735 12.813C17.3045 12.982 17.2095 13.2112 17.2095 13.4502V14.506C17.2095 15.9992 15.9991 17.2096 14.5059 17.2096H13.4501C13.2111 17.2096 12.9819 17.3046 12.8128 17.4736L11.9116 18.3748C10.8558 19.4306 9.14403 19.4306 8.08817 18.3748L7.18696 17.4736C7.01795 17.3046 6.78873 17.2096 6.54972 17.2096H5.49389C4.00072 17.2096 2.79028 15.9992 2.79028 14.506V13.4502C2.79028 13.2112 2.69533 12.982 2.52632 12.813L1.62513 11.9118C0.569295 10.8559 0.569295 9.1441 1.62512 8.08826L2.52632 7.18706C2.69533 7.01806 2.79028 6.78882 2.79028 6.54981V5.49398C2.79028 4.00082 4.00072 2.79037 5.49389 2.79037H6.54972C6.78873 2.79037 7.01795 2.69542 7.18696 2.52641L8.08817 1.62521Z",
+											"fill": "#003DC1"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"fill-rule": "evenodd",
+											"clip-rule": "evenodd",
+											"d": "M8.08817 1.62521C9.14394 0.569383 10.8558 0.569374 11.9116 1.62521L12.8128 2.52641C12.9819 2.69542 13.2111 2.79037 13.4501 2.79037H14.5059C15.9991 2.79037 17.2095 4.00082 17.2095 5.49398V6.54981C17.2095 6.78882 17.3045 7.01805 17.4735 7.18706L18.3747 8.08826C19.4305 9.1441 19.4305 10.8559 18.3747 11.9118L17.4735 12.813C17.3045 12.982 17.2095 13.2112 17.2095 13.4502V14.506C17.2095 15.9992 15.9991 17.2096 14.5059 17.2096H13.4501C13.2111 17.2096 12.9819 17.3046 12.8128 17.4736L11.9116 18.3748C10.8558 19.4306 9.14403 19.4306 8.08817 18.3748L7.18696 17.4736C7.01795 17.3046 6.78873 17.2096 6.54972 17.2096H5.49389C4.00072 17.2096 2.79028 15.9992 2.79028 14.506V13.4502C2.79028 13.2112 2.69533 12.982 2.52632 12.813L1.62513 11.9118C0.569295 10.8559 0.569295 9.1441 1.62512 8.08826L2.52632 7.18706C2.69533 7.01806 2.79028 6.78882 2.79028 6.54981V5.49398C2.79028 4.00082 4.00072 2.79037 5.49389 2.79037H6.54972C6.78873 2.79037 7.01795 2.69542 7.18696 2.52641L8.08817 1.62521Z",
+											"fill": "url(#paint0_linear_6296_109593)",
+											"fill-opacity": "0.9"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M8.27881 1.81585L8.27881 1.81585C9.2293 0.865317 10.7704 0.865301 11.721 1.81585L12.6222 2.71705L12.6222 2.71709C12.8418 2.9366 13.1395 3.05997 13.4501 3.05997H14.5059C15.8502 3.05997 16.9399 4.14972 16.9399 5.49398V6.54981C16.9399 6.86036 17.0633 7.15813 17.2828 7.37768L17.2829 7.3777L18.1841 8.2789L18.3747 8.08826L18.1841 8.27891C19.1346 9.22945 19.1346 10.7706 18.1841 11.7211L17.2829 12.6224C17.0633 12.8419 16.9399 13.1397 16.9399 13.4502V14.506C16.9399 15.8503 15.8502 16.94 14.5059 16.94H13.4501C13.1395 16.94 12.8418 17.0634 12.6222 17.2829L12.6222 17.2829L11.721 18.1841C10.7704 19.1347 9.22939 19.1347 8.27881 18.1841L7.37761 17.2829L7.37759 17.2829C7.15804 17.0634 6.86027 16.94 6.54972 16.94H5.49389C4.14962 16.94 3.05989 15.8503 3.05989 14.506V13.4502C3.05989 13.1398 2.93655 12.8419 2.71696 12.6224C2.71696 12.6223 2.71695 12.6223 2.71694 12.6223L1.81577 11.7211C0.865224 10.7706 0.865226 9.22945 1.81576 8.2789L2.71696 7.3777C2.71696 7.3777 2.71696 7.3777 2.71696 7.3777C2.93654 7.15813 3.05989 6.86033 3.05989 6.54981V5.49398C3.05989 4.14972 4.14963 3.05997 5.49389 3.05997H6.54972C6.86024 3.05997 7.15803 2.93662 7.3776 2.71706L7.37761 2.71705L8.27881 1.81585Z",
+											"stroke": "url(#paint1_linear_6296_109593)",
+											"stroke-opacity": "0.8",
+											"stroke-width": "0.539216"
+										},
+										"children": []
+									}
+								]
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"mask": "url(#mask0_6296_109593)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "badge-bg"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"fill-rule": "evenodd",
+											"clip-rule": "evenodd",
+											"d": "M8.08817 1.62521C9.14394 0.569383 10.8558 0.569374 11.9116 1.62521L12.8128 2.52641C12.9819 2.69542 13.2111 2.79037 13.4501 2.79037H14.5059C15.9991 2.79037 17.2095 4.00082 17.2095 5.49398V6.54981C17.2095 6.78882 17.3045 7.01805 17.4735 7.18706L18.3747 8.08826C19.4305 9.1441 19.4305 10.8559 18.3747 11.9118L17.4735 12.813C17.3045 12.982 17.2095 13.2112 17.2095 13.4502V14.506C17.2095 15.9992 15.9991 17.2096 14.5059 17.2096H13.4501C13.2111 17.2096 12.9819 17.3046 12.8128 17.4736L11.9116 18.3748C10.8558 19.4306 9.14403 19.4306 8.08817 18.3748L7.18696 17.4736C7.01795 17.3046 6.78873 17.2096 6.54972 17.2096H5.49389C4.00072 17.2096 2.79028 15.9992 2.79028 14.506V13.4502C2.79028 13.2112 2.69533 12.982 2.52632 12.813L1.62513 11.9118C0.569295 10.8559 0.569295 9.1441 1.62512 8.08826L2.52632 7.18706C2.69533 7.01806 2.79028 6.78882 2.79028 6.54981V5.49398C2.79028 4.00082 4.00072 2.79037 5.49389 2.79037H6.54972C6.78873 2.79037 7.01795 2.69542 7.18696 2.52641L8.08817 1.62521Z",
+											"fill": "#003DC1"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"fill-rule": "evenodd",
+											"clip-rule": "evenodd",
+											"d": "M8.08817 1.62521C9.14394 0.569383 10.8558 0.569374 11.9116 1.62521L12.8128 2.52641C12.9819 2.69542 13.2111 2.79037 13.4501 2.79037H14.5059C15.9991 2.79037 17.2095 4.00082 17.2095 5.49398V6.54981C17.2095 6.78882 17.3045 7.01805 17.4735 7.18706L18.3747 8.08826C19.4305 9.1441 19.4305 10.8559 18.3747 11.9118L17.4735 12.813C17.3045 12.982 17.2095 13.2112 17.2095 13.4502V14.506C17.2095 15.9992 15.9991 17.2096 14.5059 17.2096H13.4501C13.2111 17.2096 12.9819 17.3046 12.8128 17.4736L11.9116 18.3748C10.8558 19.4306 9.14403 19.4306 8.08817 18.3748L7.18696 17.4736C7.01795 17.3046 6.78873 17.2096 6.54972 17.2096H5.49389C4.00072 17.2096 2.79028 15.9992 2.79028 14.506V13.4502C2.79028 13.2112 2.69533 12.982 2.52632 12.813L1.62513 11.9118C0.569295 10.8559 0.569295 9.1441 1.62512 8.08826L2.52632 7.18706C2.69533 7.01806 2.79028 6.78882 2.79028 6.54981V5.49398C2.79028 4.00082 4.00072 2.79037 5.49389 2.79037H6.54972C6.78873 2.79037 7.01795 2.69542 7.18696 2.52641L8.08817 1.62521Z",
+											"fill": "url(#paint2_linear_6296_109593)",
+											"fill-opacity": "0.9"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M8.44172 1.97876L8.44173 1.97875C9.30224 1.11821 10.6975 1.11818 11.5581 1.97876L12.4593 2.87997L12.4593 2.88003C12.7221 3.1427 13.0784 3.29037 13.4501 3.29037H14.5059C15.723 3.29037 16.7095 4.27696 16.7095 5.49398V6.54981C16.7095 6.92148 16.8572 7.27785 17.1199 7.54057L17.1199 7.54061L18.0211 8.44182L18.3747 8.08826L18.0211 8.44182C18.8817 9.30239 18.8817 10.6976 18.0211 11.5582L17.1199 12.4594C16.8572 12.7222 16.7095 13.0786 16.7095 13.4502V14.506C16.7095 15.7231 15.723 16.7096 14.5059 16.7096H13.4501C13.0784 16.7096 12.7221 16.8573 12.4594 17.1199L12.4593 17.12L11.5581 18.0212C10.6975 18.8818 9.30233 18.8818 8.44172 18.0212L7.54052 17.12L7.54048 17.12C7.27775 16.8573 6.92139 16.7096 6.54972 16.7096H5.49389C4.27686 16.7096 3.29028 15.7231 3.29028 14.506V13.4502C3.29028 13.0787 3.14267 12.7222 2.87984 12.4594L1.97868 11.5582C1.11811 10.6976 1.11811 9.30238 1.97867 8.44181L2.87986 7.54062C2.87987 7.54062 2.87987 7.54061 2.87987 7.54061C3.14266 7.27784 3.29028 6.92143 3.29028 6.54981V5.49398C3.29028 4.27696 4.27687 3.29037 5.49389 3.29037H6.54972C6.92135 3.29037 7.27774 3.14273 7.54051 2.87998L7.54052 2.87997L8.44172 1.97876Z",
+											"stroke": "url(#paint3_linear_6296_109593)",
+											"stroke-opacity": "0.8"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "check",
+									"filter": "url(#filter0_d_6296_109593)"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"fill-rule": "evenodd",
+											"clip-rule": "evenodd",
+											"d": "M13.4219 6.98132C13.8732 7.28924 13.9829 7.89545 13.667 8.33533L10.04 13.3858C9.87754 13.612 9.62408 13.7602 9.34287 13.7934C9.06166 13.8266 8.77923 13.7417 8.56605 13.5599L6.49346 11.7923C6.0789 11.4387 6.03689 10.8245 6.39963 10.4204C6.76238 10.0163 7.39252 9.97533 7.80709 10.3289L9.04316 11.3831L12.0328 7.22026C12.3487 6.78038 12.9706 6.6734 13.4219 6.98132Z",
+											"fill": "url(#paint4_linear_6296_109593)",
+											"shape-rendering": "crispEdges"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "highlight",
+									"opacity": "0.5",
+									"d": "M0 0H15.5556L5.26663 20H0V0Z",
+									"fill": "url(#paint5_linear_6296_109593)"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_6296_109593",
+							"x": "5.65283",
+							"y": "6.55549",
+							"width": "8.69458",
+							"height": "7.995",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "0.25"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "0.25"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feComposite",
+								"attributes": {
+									"in2": "hardAlpha",
+									"operator": "out"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_6296_109593"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_6296_109593",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint0_linear_6296_109593",
+							"x1": "16.302",
+							"y1": "19.1667",
+							"x2": "-0.37184",
+							"y2": "14.8201",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#296DFF"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#5289FF"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint1_linear_6296_109593",
+							"x1": "8.67462",
+							"y1": "0.833336",
+							"x2": "18.9651",
+							"y2": "12.5067",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.2"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#296DFF"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint2_linear_6296_109593",
+							"x1": "16.302",
+							"y1": "19.1667",
+							"x2": "-0.37184",
+							"y2": "14.8201",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#296DFF"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#5289FF"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint3_linear_6296_109593",
+							"x1": "8.67462",
+							"y1": "0.833336",
+							"x2": "18.9651",
+							"y2": "12.5067",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.2"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#296DFF"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint4_linear_6296_109593",
+							"x1": "10.0001",
+							"y1": "6.80549",
+							"x2": "10.0001",
+							"y2": "13.8005",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.95"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "white",
+									"stop-opacity": "0.8"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint5_linear_6296_109593",
+							"x1": "-4.78632",
+							"y1": "4.375",
+							"x2": "16.2164",
+							"y2": "10.4",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.12"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "white",
+									"stop-opacity": "0.2"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "VerifiedDark"
+}
diff --git a/app/components/base/icons/src/public/plugins/VerifiedDark.tsx b/app/components/base/icons/src/public/plugins/VerifiedDark.tsx
new file mode 100644
index 0000000..03d045d
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/VerifiedDark.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './VerifiedDark.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'VerifiedDark'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/plugins/VerifiedLight.json b/app/components/base/icons/src/public/plugins/VerifiedLight.json
new file mode 100644
index 0000000..b31fe65
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/VerifiedLight.json
@@ -0,0 +1,456 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "20",
+			"height": "20",
+			"viewBox": "0 0 20 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Verified"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "mask",
+						"attributes": {
+							"id": "mask0_6295_120949",
+							"style": "mask-type:alpha",
+							"maskUnits": "userSpaceOnUse",
+							"x": "0",
+							"y": "0",
+							"width": "20",
+							"height": "20"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Mask"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"fill-rule": "evenodd",
+											"clip-rule": "evenodd",
+											"d": "M8.08817 1.62512C9.14394 0.569299 10.8558 0.56929 11.9116 1.62512L12.8128 2.52633C12.9819 2.69533 13.2111 2.79028 13.4501 2.79028H14.5059C15.9991 2.79028 17.2095 4.00074 17.2095 5.4939V6.54972C17.2095 6.78874 17.3045 7.01796 17.4735 7.18697L18.3747 8.08818C19.4305 9.14401 19.4305 10.8559 18.3747 11.9117L17.4735 12.8129C17.3045 12.9819 17.2095 13.2112 17.2095 13.4502V14.5059C17.2095 15.9991 15.9991 17.2095 14.5059 17.2095H13.4501C13.2111 17.2095 12.9819 17.3045 12.8128 17.4735L11.9116 18.3747C10.8558 19.4305 9.14403 19.4305 8.08817 18.3747L7.18696 17.4735C7.01795 17.3045 6.78873 17.2095 6.54972 17.2095H5.49389C4.00072 17.2095 2.79028 15.9991 2.79028 14.5059V13.4502C2.79028 13.2112 2.69533 12.9819 2.52632 12.8129L1.62513 11.9117C0.569295 10.8559 0.569295 9.14401 1.62512 8.08818L2.52632 7.18697C2.69533 7.01797 2.79028 6.78874 2.79028 6.54972V5.4939C2.79028 4.00074 4.00072 2.79028 5.49389 2.79028H6.54972C6.78873 2.79028 7.01795 2.69533 7.18696 2.52633L8.08817 1.62512Z",
+											"fill": "#B2CAFF"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"fill-rule": "evenodd",
+											"clip-rule": "evenodd",
+											"d": "M8.08817 1.62512C9.14394 0.569299 10.8558 0.56929 11.9116 1.62512L12.8128 2.52633C12.9819 2.69533 13.2111 2.79028 13.4501 2.79028H14.5059C15.9991 2.79028 17.2095 4.00074 17.2095 5.4939V6.54972C17.2095 6.78874 17.3045 7.01796 17.4735 7.18697L18.3747 8.08818C19.4305 9.14401 19.4305 10.8559 18.3747 11.9117L17.4735 12.8129C17.3045 12.9819 17.2095 13.2112 17.2095 13.4502V14.5059C17.2095 15.9991 15.9991 17.2095 14.5059 17.2095H13.4501C13.2111 17.2095 12.9819 17.3045 12.8128 17.4735L11.9116 18.3747C10.8558 19.4305 9.14403 19.4305 8.08817 18.3747L7.18696 17.4735C7.01795 17.3045 6.78873 17.2095 6.54972 17.2095H5.49389C4.00072 17.2095 2.79028 15.9991 2.79028 14.5059V13.4502C2.79028 13.2112 2.69533 12.9819 2.52632 12.8129L1.62513 11.9117C0.569295 10.8559 0.569295 9.14401 1.62512 8.08818L2.52632 7.18697C2.69533 7.01797 2.79028 6.78874 2.79028 6.54972V5.4939C2.79028 4.00074 4.00072 2.79028 5.49389 2.79028H6.54972C6.78873 2.79028 7.01795 2.69533 7.18696 2.52633L8.08817 1.62512Z",
+											"fill": "url(#paint0_linear_6295_120949)",
+											"fill-opacity": "0.9"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M8.27881 1.81577L8.27881 1.81576C9.2293 0.865233 10.7704 0.865217 11.721 1.81577L12.6222 2.71697L12.6222 2.71701C12.8418 2.93652 13.1395 3.05989 13.4501 3.05989H14.5059C15.8502 3.05989 16.9399 4.14963 16.9399 5.4939V6.54972C16.9399 6.86027 17.0633 7.15805 17.2828 7.3776L17.2829 7.37762L18.1841 8.27882L18.3747 8.08818L18.1841 8.27882C19.1346 9.22937 19.1346 10.7705 18.1841 11.7211L17.2829 12.6223C17.0633 12.8418 16.9399 13.1396 16.9399 13.4502V14.5059C16.9399 15.8502 15.8502 16.9399 14.5059 16.9399H13.4501C13.1395 16.9399 12.8418 17.0633 12.6222 17.2828L12.6222 17.2829L11.721 18.1841C10.7704 19.1346 9.22939 19.1346 8.27881 18.1841L7.37761 17.2829L7.37759 17.2828C7.15804 17.0633 6.86027 16.9399 6.54972 16.9399H5.49389C4.14962 16.9399 3.05989 15.8502 3.05989 14.5059V13.4502C3.05989 13.1397 2.93655 12.8418 2.71696 12.6223C2.71696 12.6223 2.71695 12.6223 2.71694 12.6222L1.81577 11.7211C0.865224 10.7705 0.865226 9.22936 1.81576 8.27882L2.71696 7.37762C2.71696 7.37762 2.71696 7.37762 2.71696 7.37762C2.93654 7.15805 3.05989 6.86024 3.05989 6.54972V5.4939C3.05989 4.14964 4.14963 3.05989 5.49389 3.05989H6.54972C6.86024 3.05989 7.15803 2.93653 7.3776 2.71698L7.37761 2.71697L8.27881 1.81577Z",
+											"stroke": "url(#paint1_linear_6295_120949)",
+											"stroke-opacity": "0.8",
+											"stroke-width": "0.539216"
+										},
+										"children": []
+									}
+								]
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"mask": "url(#mask0_6295_120949)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "badge-bg"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"fill-rule": "evenodd",
+											"clip-rule": "evenodd",
+											"d": "M8.08817 1.62512C9.14394 0.569299 10.8558 0.56929 11.9116 1.62512L12.8128 2.52633C12.9819 2.69533 13.2111 2.79028 13.4501 2.79028H14.5059C15.9991 2.79028 17.2095 4.00074 17.2095 5.4939V6.54972C17.2095 6.78874 17.3045 7.01796 17.4735 7.18697L18.3747 8.08818C19.4305 9.14401 19.4305 10.8559 18.3747 11.9117L17.4735 12.8129C17.3045 12.9819 17.2095 13.2112 17.2095 13.4502V14.5059C17.2095 15.9991 15.9991 17.2095 14.5059 17.2095H13.4501C13.2111 17.2095 12.9819 17.3045 12.8128 17.4735L11.9116 18.3747C10.8558 19.4305 9.14403 19.4305 8.08817 18.3747L7.18696 17.4735C7.01795 17.3045 6.78873 17.2095 6.54972 17.2095H5.49389C4.00072 17.2095 2.79028 15.9991 2.79028 14.5059V13.4502C2.79028 13.2112 2.69533 12.9819 2.52632 12.8129L1.62513 11.9117C0.569295 10.8559 0.569295 9.14401 1.62512 8.08818L2.52632 7.18697C2.69533 7.01797 2.79028 6.78874 2.79028 6.54972V5.4939C2.79028 4.00074 4.00072 2.79028 5.49389 2.79028H6.54972C6.78873 2.79028 7.01795 2.69533 7.18696 2.52633L8.08817 1.62512Z",
+											"fill": "#B2CAFF"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"fill-rule": "evenodd",
+											"clip-rule": "evenodd",
+											"d": "M8.08817 1.62512C9.14394 0.569299 10.8558 0.56929 11.9116 1.62512L12.8128 2.52633C12.9819 2.69533 13.2111 2.79028 13.4501 2.79028H14.5059C15.9991 2.79028 17.2095 4.00074 17.2095 5.4939V6.54972C17.2095 6.78874 17.3045 7.01796 17.4735 7.18697L18.3747 8.08818C19.4305 9.14401 19.4305 10.8559 18.3747 11.9117L17.4735 12.8129C17.3045 12.9819 17.2095 13.2112 17.2095 13.4502V14.5059C17.2095 15.9991 15.9991 17.2095 14.5059 17.2095H13.4501C13.2111 17.2095 12.9819 17.3045 12.8128 17.4735L11.9116 18.3747C10.8558 19.4305 9.14403 19.4305 8.08817 18.3747L7.18696 17.4735C7.01795 17.3045 6.78873 17.2095 6.54972 17.2095H5.49389C4.00072 17.2095 2.79028 15.9991 2.79028 14.5059V13.4502C2.79028 13.2112 2.69533 12.9819 2.52632 12.8129L1.62513 11.9117C0.569295 10.8559 0.569295 9.14401 1.62512 8.08818L2.52632 7.18697C2.69533 7.01797 2.79028 6.78874 2.79028 6.54972V5.4939C2.79028 4.00074 4.00072 2.79028 5.49389 2.79028H6.54972C6.78873 2.79028 7.01795 2.69533 7.18696 2.52633L8.08817 1.62512Z",
+											"fill": "url(#paint2_linear_6295_120949)",
+											"fill-opacity": "0.9"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M8.44172 1.97868L8.44173 1.97867C9.30224 1.11812 10.6975 1.1181 11.5581 1.97868L12.4593 2.87988L12.4593 2.87995C12.7221 3.14262 13.0784 3.29028 13.4501 3.29028H14.5059C15.723 3.29028 16.7095 4.27687 16.7095 5.4939V6.54972C16.7095 6.9214 16.8572 7.27776 17.1199 7.54049L17.1199 7.54053L18.0211 8.44173L18.3747 8.08818L18.0211 8.44174C18.8817 9.3023 18.8817 10.6976 18.0211 11.5582L17.1199 12.4594C16.8572 12.7221 16.7095 13.0785 16.7095 13.4502V14.5059C16.7095 15.723 15.723 16.7095 14.5059 16.7095H13.4501C13.0784 16.7095 12.7221 16.8573 12.4594 17.1198L12.4593 17.1199L11.5581 18.0211C10.6975 18.8817 9.30233 18.8817 8.44172 18.0211L7.54052 17.1199L7.54048 17.1199C7.27775 16.8572 6.92139 16.7095 6.54972 16.7095H5.49389C4.27686 16.7095 3.29028 15.723 3.29028 14.5059V13.4502C3.29028 13.0786 3.14267 12.7221 2.87984 12.4593L1.97868 11.5582C1.11811 10.6976 1.11811 9.3023 1.97867 8.44173L2.87986 7.54054C2.87987 7.54053 2.87987 7.54053 2.87987 7.54053C3.14266 7.27775 3.29028 6.92134 3.29028 6.54972V5.4939C3.29028 4.27688 4.27687 3.29028 5.49389 3.29028H6.54972C6.92135 3.29028 7.27774 3.14265 7.54051 2.87989L7.54052 2.87988L8.44172 1.97868Z",
+											"stroke": "url(#paint3_linear_6295_120949)",
+											"stroke-opacity": "0.8"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "check",
+									"filter": "url(#filter0_d_6295_120949)"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"fill-rule": "evenodd",
+											"clip-rule": "evenodd",
+											"d": "M13.4219 6.98125C13.8732 7.28917 13.9829 7.89538 13.667 8.33526L10.04 13.3857C9.87754 13.6119 9.62408 13.7601 9.34287 13.7933C9.06166 13.8266 8.77923 13.7417 8.56605 13.5599L6.49346 11.7922C6.0789 11.4386 6.03689 10.8244 6.39963 10.4203C6.76238 10.0162 7.39252 9.97526 7.80709 10.3288L9.04316 11.3831L12.0328 7.22019C12.3487 6.78031 12.9706 6.67333 13.4219 6.98125Z",
+											"fill": "url(#paint4_linear_6295_120949)",
+											"shape-rendering": "crispEdges"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "highlight",
+									"opacity": "0.5",
+									"d": "M0 0H15.5556L5.26663 20H0V0Z",
+									"fill": "url(#paint5_linear_6295_120949)"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "filter",
+						"attributes": {
+							"id": "filter0_d_6295_120949",
+							"x": "5.65283",
+							"y": "6.55542",
+							"width": "8.69458",
+							"height": "7.99512",
+							"filterUnits": "userSpaceOnUse",
+							"color-interpolation-filters": "sRGB"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "feFlood",
+								"attributes": {
+									"flood-opacity": "0",
+									"result": "BackgroundImageFix"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"in": "SourceAlpha",
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
+									"result": "hardAlpha"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feOffset",
+								"attributes": {
+									"dy": "0.25"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feGaussianBlur",
+								"attributes": {
+									"stdDeviation": "0.25"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feComposite",
+								"attributes": {
+									"in2": "hardAlpha",
+									"operator": "out"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feColorMatrix",
+								"attributes": {
+									"type": "matrix",
+									"values": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in2": "BackgroundImageFix",
+									"result": "effect1_dropShadow_6295_120949"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "feBlend",
+								"attributes": {
+									"mode": "normal",
+									"in": "SourceGraphic",
+									"in2": "effect1_dropShadow_6295_120949",
+									"result": "shape"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint0_linear_6295_120949",
+							"x1": "16.302",
+							"y1": "19.1666",
+							"x2": "-0.37184",
+							"y2": "14.82",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#155AEF"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#5289FF"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint1_linear_6295_120949",
+							"x1": "8.67462",
+							"y1": "0.833252",
+							"x2": "18.9651",
+							"y2": "12.5066",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.95"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#155AEF"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint2_linear_6295_120949",
+							"x1": "16.302",
+							"y1": "19.1666",
+							"x2": "-0.37184",
+							"y2": "14.82",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#155AEF"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#5289FF"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint3_linear_6295_120949",
+							"x1": "8.67462",
+							"y1": "0.833252",
+							"x2": "18.9651",
+							"y2": "12.5066",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.95"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#155AEF"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint4_linear_6295_120949",
+							"x1": "10.0001",
+							"y1": "6.80542",
+							"x2": "10.0001",
+							"y2": "13.8004",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "white",
+									"stop-opacity": "0.9"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint5_linear_6295_120949",
+							"x1": "-4.78632",
+							"y1": "4.375",
+							"x2": "16.2164",
+							"y2": "10.4",
+							"gradientUnits": "userSpaceOnUse"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "white",
+									"stop-opacity": "0.12"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "white",
+									"stop-opacity": "0.3"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "VerifiedLight"
+}
diff --git a/app/components/base/icons/src/public/plugins/VerifiedLight.tsx b/app/components/base/icons/src/public/plugins/VerifiedLight.tsx
new file mode 100644
index 0000000..675a584
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/VerifiedLight.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './VerifiedLight.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'VerifiedLight'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/plugins/WebReader.json b/app/components/base/icons/src/public/plugins/WebReader.json
new file mode 100644
index 0000000..58c8283
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/WebReader.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M9.59235 3.32566C10.3587 3.11341 11.1661 3 12 3C13.962 3 15.7773 3.62779 17.2561 4.69345C16.4693 5.21349 15.8824 5.77819 15.4756 6.38193C14.854 7.30445 14.6947 8.25844 14.8234 9.12887C14.9484 9.97416 15.3366 10.696 15.7446 11.2301C16.1402 11.7479 16.6256 12.181 17.0531 12.3946C18.1294 12.9327 19.3714 13.2022 20.2999 13.341C21.1399 13.4667 22.9206 13.8871 22.9865 12.5492C22.9955 12.3672 23 12.1841 23 12C23 5.92487 18.0751 1 12 1C5.92487 1 1 5.92487 1 12C1 18.0751 5.92487 23 12 23C12.1841 23 12.3672 22.9955 12.5492 22.9865C13.1008 22.9593 13.526 22.4902 13.4988 21.9385C13.4716 21.3869 13.0024 20.9618 12.4508 20.9889C12.3015 20.9963 12.1512 21 12 21C8.49063 21 5.45038 18.9914 3.96619 16.0611L4.93474 15.502L8.50745 16.1706C9.43309 16.3439 10.2876 15.6313 10.2834 14.6896L10.2694 11.5365L12.0952 8.41051C12.3911 7.90404 12.3646 7.27161 12.0274 6.79167L9.59235 3.32566Z",
+					"fill": "#444CE7"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M13.9456 12.6561C13.5777 12.5165 13.1621 12.6057 12.8839 12.884C12.6056 13.1623 12.5164 13.5778 12.656 13.9458L15.8228 22.2945C15.969 22.68 16.3367 22.9362 16.7489 22.9399C17.1611 22.9435 17.5333 22.6938 17.6863 22.3111L19.007 19.0071L22.311 17.6865C22.6937 17.5334 22.9434 17.1612 22.9397 16.749C22.9361 16.3368 22.6799 15.9691 22.2944 15.8229L13.9456 12.6561Z",
+					"fill": "#444CE7"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "WebReader"
+}
diff --git a/app/components/base/icons/src/public/plugins/WebReader.tsx b/app/components/base/icons/src/public/plugins/WebReader.tsx
new file mode 100644
index 0000000..b23007d
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/WebReader.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './WebReader.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'WebReader'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/plugins/Wikipedia.json b/app/components/base/icons/src/public/plugins/Wikipedia.json
new file mode 100644
index 0000000..af2d505
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/Wikipedia.json
@@ -0,0 +1,26 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M23.8431 5.0001H19.2179H19.0609V5.15706V5.66001V5.81696H19.2179H19.5393C19.9131 5.81696 20.2502 6.00882 20.4411 6.33021C20.632 6.65161 20.6392 7.0394 20.4603 7.36765L15.3174 16.8077L12.9751 11.2238L15.1813 7.17527C15.6379 6.33743 16.5143 5.81696 17.4684 5.81696H17.5726H17.7296V5.66001V5.15706V5.0001H17.5726H12.9474H12.7905V5.15706V5.66001V5.81696H12.9474H13.2688C13.6426 5.81696 13.9797 6.00882 14.1706 6.33021C14.3615 6.65161 14.3687 7.0394 14.1899 7.36765L12.5896 10.305L11.1634 6.9051C11.0601 6.65867 11.0856 6.38965 11.2336 6.16714C11.3816 5.94462 11.6197 5.81696 11.887 5.81696H12.2526H12.4095V5.66001V5.15706V5.0001H12.2526H6.72092H6.56396V5.15706V5.66001V5.81696H6.72092H6.79699C7.88821 5.81696 8.866 6.46719 9.28817 7.47344L11.3954 12.497L9.04698 16.8077L4.89304 6.9051C4.78966 6.65867 4.81525 6.38965 4.9632 6.16714C5.11116 5.94462 5.34932 5.81696 5.61657 5.81696H6.17832H6.33527V5.66001V5.15706V5.0001H6.17832H0.156957H0V5.15706V5.66001V5.81696H0.156957H0.52654C1.61776 5.81696 2.59561 6.46719 3.01772 7.47344L7.80628 18.889C7.89004 19.0887 8.08425 19.2177 8.30111 19.2177C8.50014 19.2177 8.67588 19.1131 8.77125 18.9381L9.39589 17.7918L11.7807 13.4155L14.0767 18.889C14.1604 19.0886 14.3547 19.2176 14.5715 19.2176C14.7705 19.2176 14.9463 19.1131 15.0417 18.938L15.6663 17.7917L21.4517 7.17517C21.9083 6.33733 22.7847 5.81686 23.7388 5.81686H23.843H24V5.6599V5.15696V5H23.8431V5.0001Z",
+					"fill": "#222A30"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Wikipedia"
+}
diff --git a/app/components/base/icons/src/public/plugins/Wikipedia.tsx b/app/components/base/icons/src/public/plugins/Wikipedia.tsx
new file mode 100644
index 0000000..0477e9c
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/Wikipedia.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Wikipedia.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Wikipedia'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/plugins/index.ts b/app/components/base/icons/src/public/plugins/index.ts
new file mode 100644
index 0000000..87dc371
--- /dev/null
+++ b/app/components/base/icons/src/public/plugins/index.ts
@@ -0,0 +1,7 @@
+export { default as Google } from './Google'
+export { default as PartnerDark } from './PartnerDark'
+export { default as PartnerLight } from './PartnerLight'
+export { default as VerifiedDark } from './VerifiedDark'
+export { default as VerifiedLight } from './VerifiedLight'
+export { default as WebReader } from './WebReader'
+export { default as Wikipedia } from './Wikipedia'
diff --git a/app/components/base/icons/src/public/thought/DataSet.json b/app/components/base/icons/src/public/thought/DataSet.json
new file mode 100644
index 0000000..5be61da
--- /dev/null
+++ b/app/components/base/icons/src/public/thought/DataSet.json
@@ -0,0 +1,64 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_7847_32895)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M10.5 2.5C10.5 3.32843 8.48528 4 6 4C3.51472 4 1.5 3.32843 1.5 2.5M10.5 2.5C10.5 1.67157 8.48528 1 6 1C3.51472 1 1.5 1.67157 1.5 2.5M10.5 2.5V9.5C10.5 10.33 8.5 11 6 11C3.5 11 1.5 10.33 1.5 9.5V2.5M10.5 6C10.5 6.83 8.5 7.5 6 7.5C3.5 7.5 1.5 6.83 1.5 6",
+							"stroke": "#667085",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_7847_32895"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "12",
+									"height": "12",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "DataSet"
+}
diff --git a/app/components/base/icons/src/public/thought/DataSet.tsx b/app/components/base/icons/src/public/thought/DataSet.tsx
new file mode 100644
index 0000000..28c38c3
--- /dev/null
+++ b/app/components/base/icons/src/public/thought/DataSet.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './DataSet.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'DataSet'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/thought/Loading.json b/app/components/base/icons/src/public/thought/Loading.json
new file mode 100644
index 0000000..23e6866
--- /dev/null
+++ b/app/components/base/icons/src/public/thought/Loading.json
@@ -0,0 +1,64 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_7998_4025)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M6 1.125V2.375M6 9V11M2.875 6H1.125M10.625 6H9.875M9.22855 9.22855L8.875 8.875M9.33211 2.70789L8.625 3.415M2.46079 9.53921L3.875 8.125M2.56434 2.60434L3.625 3.665",
+							"stroke": "#667085",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_7998_4025"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "12",
+									"height": "12",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Loading"
+}
diff --git a/app/components/base/icons/src/public/thought/Loading.tsx b/app/components/base/icons/src/public/thought/Loading.tsx
new file mode 100644
index 0000000..11389b8
--- /dev/null
+++ b/app/components/base/icons/src/public/thought/Loading.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Loading.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Loading'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/thought/Search.json b/app/components/base/icons/src/public/thought/Search.json
new file mode 100644
index 0000000..1ad8876
--- /dev/null
+++ b/app/components/base/icons/src/public/thought/Search.json
@@ -0,0 +1,64 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_7847_32899)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M10.5 10.5L8.75005 8.75M10 5.75C10 8.09721 8.09721 10 5.75 10C3.40279 10 1.5 8.09721 1.5 5.75C1.5 3.40279 3.40279 1.5 5.75 1.5C8.09721 1.5 10 3.40279 10 5.75Z",
+							"stroke": "#667085",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_7847_32899"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "12",
+									"height": "12",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Search"
+}
diff --git a/app/components/base/icons/src/public/thought/Search.tsx b/app/components/base/icons/src/public/thought/Search.tsx
new file mode 100644
index 0000000..2f469d2
--- /dev/null
+++ b/app/components/base/icons/src/public/thought/Search.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Search.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Search'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/thought/ThoughtList.json b/app/components/base/icons/src/public/thought/ThoughtList.json
new file mode 100644
index 0000000..d5e13c3
--- /dev/null
+++ b/app/components/base/icons/src/public/thought/ThoughtList.json
@@ -0,0 +1,83 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M4 6C4 5.72386 4.22386 5.5 4.5 5.5L10.5 5.5C10.7761 5.5 11 5.72386 11 6C11 6.27614 10.7761 6.5 10.5 6.5L4.5 6.5C4.22386 6.5 4 6.27614 4 6Z",
+					"fill": "#667085"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M4 3C4 2.72386 4.22386 2.5 4.5 2.5L10.5 2.5C10.7761 2.5 11 2.72386 11 3C11 3.27614 10.7761 3.5 10.5 3.5L4.5 3.5C4.22386 3.5 4 3.27614 4 3Z",
+					"fill": "#667085"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M4 9C4 8.72386 4.22386 8.5 4.5 8.5L10.5 8.5C10.7761 8.5 11 8.72386 11 9C11 9.27614 10.7761 9.5 10.5 9.5L4.5 9.5C4.22386 9.5 4 9.27614 4 9Z",
+					"fill": "#667085"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M1 6C1 5.44772 1.44772 5 2 5C2.55228 5 3 5.44772 3 6C3 6.55228 2.55228 7 2 7C1.44772 7 1 6.55228 1 6Z",
+					"fill": "#667085"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M1 3C1 2.44772 1.44772 2 2 2C2.55228 2 3 2.44772 3 3C3 3.55228 2.55228 4 2 4C1.44772 4 1 3.55228 1 3Z",
+					"fill": "#667085"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M1 9C1 8.44772 1.44772 8 2 8C2.55228 8 3 8.44772 3 9C3 9.55228 2.55228 10 2 10C1.44772 10 1 9.55228 1 9Z",
+					"fill": "#667085"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "ThoughtList"
+}
diff --git a/app/components/base/icons/src/public/thought/ThoughtList.tsx b/app/components/base/icons/src/public/thought/ThoughtList.tsx
new file mode 100644
index 0000000..99b42ae
--- /dev/null
+++ b/app/components/base/icons/src/public/thought/ThoughtList.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ThoughtList.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ThoughtList'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/thought/WebReader.json b/app/components/base/icons/src/public/thought/WebReader.json
new file mode 100644
index 0000000..ba2bc48
--- /dev/null
+++ b/app/components/base/icons/src/public/thought/WebReader.json
@@ -0,0 +1,64 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_7847_32887)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M4.5 1.75V1M2.53033 2.53033L2 2M2.53033 6.5L2 7.03033M6.5 2.53033L7.03033 2M1.75 4.5H1M7.93224 8.09479L6.68637 10.4085C6.54404 10.6728 6.47287 10.805 6.38725 10.8384C6.31295 10.8674 6.22926 10.8592 6.16199 10.8164C6.08447 10.767 6.04028 10.6235 5.95191 10.3366L4.22259 4.72263C4.1504 4.48825 4.1143 4.37107 4.14335 4.29192C4.16865 4.22298 4.22298 4.16865 4.29192 4.14335C4.37107 4.1143 4.48825 4.1504 4.72262 4.2226L10.3366 5.95192C10.6235 6.0403 10.767 6.08449 10.8164 6.16201C10.8592 6.22928 10.8674 6.31297 10.8384 6.38727C10.805 6.47289 10.6728 6.54406 10.4085 6.68639L8.09479 7.93224C8.05551 7.95339 8.03587 7.96396 8.01868 7.97755C8.00341 7.98961 7.98961 8.00341 7.97755 8.01868C7.96396 8.03587 7.95339 8.05551 7.93224 8.09479Z",
+							"stroke": "#667085",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_7847_32887"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "12",
+									"height": "12",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "WebReader"
+}
diff --git a/app/components/base/icons/src/public/thought/WebReader.tsx b/app/components/base/icons/src/public/thought/WebReader.tsx
new file mode 100644
index 0000000..b23007d
--- /dev/null
+++ b/app/components/base/icons/src/public/thought/WebReader.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './WebReader.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'WebReader'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/thought/index.ts b/app/components/base/icons/src/public/thought/index.ts
new file mode 100644
index 0000000..8a45489
--- /dev/null
+++ b/app/components/base/icons/src/public/thought/index.ts
@@ -0,0 +1,5 @@
+export { default as DataSet } from './DataSet'
+export { default as Loading } from './Loading'
+export { default as Search } from './Search'
+export { default as ThoughtList } from './ThoughtList'
+export { default as WebReader } from './WebReader'
diff --git a/app/components/base/icons/src/public/tracing/LangfuseIcon.json b/app/components/base/icons/src/public/tracing/LangfuseIcon.json
new file mode 100644
index 0000000..c2c8a73
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/LangfuseIcon.json
@@ -0,0 +1,236 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "74",
+			"height": "16",
+			"viewBox": "0 0 74 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Clip path group"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "mask",
+						"attributes": {
+							"id": "mask0_20135_12984",
+							"style": "mask-type:luminance",
+							"maskUnits": "userSpaceOnUse",
+							"x": "0",
+							"y": "0",
+							"width": "96",
+							"height": "16"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "clip0_823_291"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector",
+											"d": "M95.5733 0H0V16H95.5733V0Z",
+											"fill": "white"
+										},
+										"children": []
+									}
+								]
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"mask": "url(#mask0_20135_12984)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_2",
+											"d": "M21.2832 11.5431V3.72656H22.3735V10.4972H26.3932V11.5431H21.2832ZM27.6995 7.44766C27.9198 6.31372 28.8889 5.5761 30.1224 5.5761C31.543 5.5761 32.4791 6.40179 32.4791 8.02014V10.233C32.4791 10.4862 32.5893 10.5963 32.8316 10.5963H33.0849V11.5431H32.7765C32.0717 11.5431 31.6532 11.1688 31.543 10.6513C31.3228 11.1908 30.64 11.6752 29.7259 11.6752C28.5475 11.6752 27.6004 11.0587 27.6004 10.0128C27.6004 8.80179 28.4924 8.46051 29.836 8.2073L31.4109 7.89904C31.3999 7.0073 30.8933 6.56693 30.1114 6.56693C29.4506 6.56693 28.966 6.96326 28.8338 7.52473L27.6995 7.44766ZM28.7237 9.99078C28.7347 10.3981 29.0871 10.7394 29.8581 10.7394C30.7391 10.7394 31.4329 10.1229 31.4329 9.07702V8.82381L30.1774 9.04399C29.3625 9.18711 28.7237 9.25317 28.7237 9.99078ZM34.5453 5.70821H35.5255L35.5585 6.68803C35.8669 5.93941 36.5166 5.5761 37.2986 5.5761C38.5981 5.5761 39.2369 6.5339 39.2369 7.78895V11.5431H38.1686V8.06418C38.1686 7.02931 37.8272 6.48987 37.0232 6.48987C36.1752 6.48987 35.6136 7.02931 35.6136 8.06418V11.5431H34.5453V5.70821ZM43.2303 11.2348C41.7876 11.2348 40.7634 10.0789 40.7634 8.43849C40.7634 6.74308 41.7876 5.5761 43.2303 5.5761C44.0122 5.5761 44.6951 5.99445 44.9594 6.59996L44.9704 5.70821H45.9946V10.9045C45.9836 12.5009 44.9704 13.3266 43.4065 13.3266C42.129 13.3266 41.2039 12.655 40.9286 11.6422L42.0519 11.5651C42.2832 12.0715 42.7347 12.3688 43.4065 12.3688C44.3536 12.3688 44.9153 11.9394 44.9263 11.1357V10.266C44.629 10.8275 43.9241 11.2348 43.2303 11.2348ZM41.8867 8.42748C41.8867 9.5284 42.4704 10.299 43.4286 10.299C44.3647 10.299 44.9373 9.5284 44.9483 8.42748C44.9704 7.33757 44.3867 6.56693 43.4286 6.56693C42.4704 6.56693 41.8867 7.33757 41.8867 8.42748ZM48.9967 5.455C48.9967 4.3761 49.5364 3.72656 50.7258 3.72656H52.3337V4.67335H50.7038C50.3293 4.67335 50.065 4.95959 50.065 5.43298V6.08253H52.2566V7.02931H50.065V11.5431H48.9967V7.02931H47.4659V6.08253H48.9967V5.455ZM58.9041 11.5431H57.8909L57.8798 10.5963C57.5715 11.3229 56.9327 11.6752 56.1838 11.6752C54.9063 11.6752 54.2786 10.7174 54.2786 9.46234V5.70821H55.3468V9.18711C55.3468 10.222 55.6883 10.7614 56.4592 10.7614C57.2851 10.7614 57.8358 10.222 57.8358 9.18711V5.70821H58.9041V11.5431ZM64.5277 7.53574C64.4065 6.91922 63.8338 6.56693 63.151 6.56693C62.5894 6.56693 62.0718 6.84216 62.0828 7.38161C62.0828 7.9651 62.7876 8.09721 63.4374 8.26234C64.5497 8.53757 65.662 8.94491 65.662 10.0348C65.662 11.1798 64.5607 11.6752 63.3493 11.6752C61.9837 11.6752 60.8713 10.9045 60.7832 9.69354L61.9066 9.62748C62.0167 10.277 62.6004 10.6844 63.3493 10.6844C63.933 10.6844 64.5387 10.5302 64.5387 9.97977C64.5387 9.4073 63.8008 9.30821 63.151 9.15409C62.0497 8.88987 60.9594 8.48253 60.9594 7.42565C60.9594 6.24766 62.0167 5.5761 63.2502 5.5761C64.4836 5.5761 65.4417 6.31372 65.629 7.46968L64.5277 7.53574ZM67.2104 8.62565C67.2104 6.76509 68.2787 5.5761 69.9196 5.5761C71.2302 5.5761 72.4196 6.42381 72.5077 8.52656V8.9339H68.3448C68.4329 10.0348 68.9945 10.6844 69.9196 10.6844C70.5033 10.6844 71.032 10.3431 71.2853 9.75959L72.4196 9.85867C72.0892 10.9706 71.087 11.6752 69.9196 11.6752C68.2787 11.6752 67.2104 10.4862 67.2104 8.62565ZM68.3778 8.07519H71.3403C71.1861 6.96326 70.5804 6.56693 69.9196 6.56693C69.0716 6.56693 68.532 7.1284 68.3778 8.07519Z",
+											"fill": "black"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "g",
+										"attributes": {
+											"id": "Clip path group_2"
+										},
+										"children": [
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask1_20135_12984",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "-1",
+													"width": "17",
+													"height": "18"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "g",
+														"attributes": {
+															"id": "clip1_823_291"
+														},
+														"children": [
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_3",
+																	"d": "M16.3621 -0.0512695H0.203125V16.1021H16.3621V-0.0512695Z",
+																	"fill": "white"
+																},
+																"children": []
+															}
+														]
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask1_20135_12984)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "g",
+														"attributes": {
+															"id": "Group_2"
+														},
+														"children": [
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_4",
+																	"d": "M14.6259 11.2357C13.9141 12.1984 12.8241 12.8406 11.5941 12.9344C11.5558 12.937 11.5175 12.9397 11.4787 12.9419C10.0365 13.0136 8.94706 12.3558 8.22466 11.7452C6.94631 11.0687 5.94609 10.8983 5.36089 10.751C4.93532 10.6438 4.56293 10.4296 4.40334 10.3225C4.26183 10.2384 3.97722 10.0434 3.76496 9.67965C3.52716 9.27204 3.51333 8.88257 3.51706 8.71705C3.641 8.70048 3.80113 8.68224 3.98839 8.67048C4.1416 8.66082 4.29002 8.65709 4.45654 8.65652C5.74819 8.65494 6.7499 8.71812 7.47874 9.0417C7.87295 9.21632 8.23842 9.4488 8.56395 9.73215C8.98265 10.0975 9.83862 10.6749 10.8935 10.4778C11.0276 10.4526 11.1563 10.4194 11.2803 10.3787C11.6601 10.3241 12.3097 10.2801 13.0747 10.4831C13.8008 10.676 14.3232 11.0092 14.6259 11.2357Z",
+																	"fill": "#0A60B5",
+																	"stroke": "black",
+																	"stroke-width": "1.70667",
+																	"stroke-miterlimit": "10"
+																},
+																"children": []
+															},
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_5",
+																	"d": "M14.53 4.60662C14.2091 4.19101 13.819 3.79812 13.3584 3.53003C12.8675 3.2445 12.2411 2.99862 11.4835 2.93199C9.63248 2.76913 8.36691 3.79548 8.13634 3.98954C7.84947 4.25868 6.70187 5.21101 5.32048 5.73977C5.07981 5.82545 4.61653 6.02793 4.20477 6.48007C3.87909 6.83749 3.7197 7.20339 3.6416 7.43076C3.80631 7.45351 3.97632 7.46992 4.15164 7.47994C5.49102 7.55452 6.64184 7.56193 7.39466 7.19337C7.89196 6.95015 8.32815 6.60377 8.70431 6.1982C9.38222 5.4669 10.3709 5.14067 11.271 5.36436C11.6843 5.42197 12.4042 5.46588 13.2368 5.21101C13.8116 5.03492 14.2399 4.81337 14.53 4.60662Z",
+																	"fill": "#0A60B5",
+																	"stroke": "black",
+																	"stroke-width": "1.70667",
+																	"stroke-miterlimit": "10"
+																},
+																"children": []
+															},
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_6",
+																	"d": "M1.96963 4.91518C1.45614 4.65135 1.05528 4.347 0.781876 4.10874C0.629046 3.97549 0.391602 4.08476 0.391602 4.28837V5.95295C0.391602 6.02543 0.424389 6.09419 0.480445 6.13896L1.16264 6.79512C1.19859 6.53125 1.2758 6.17255 1.44926 5.77597C1.61267 5.40184 1.80886 5.11558 1.96963 4.91518Z",
+																	"fill": "#0A60B5",
+																	"stroke": "black",
+																	"stroke-width": "1.70667",
+																	"stroke-miterlimit": "10"
+																},
+																"children": []
+															},
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_7",
+																	"d": "M12.9521 8.63005C13.0302 8.38964 13.0735 8.13742 13.0799 7.8804C13.0853 7.67736 13.0617 7.6015 13.0264 7.4049C13.3895 7.34397 13.8428 7.24459 14.2561 7.1377C14.6929 7.02499 15.0158 6.89407 15.3789 6.76367C15.4318 7.01747 15.4874 7.14092 15.5067 7.32899C15.5248 7.50642 15.5361 7.69019 15.5392 7.8804C15.5489 8.47138 15.4767 9.0073 15.3655 9.47698C15.0233 9.29954 14.617 9.11577 14.1492 8.95439C13.714 8.8037 13.3093 8.70115 12.9521 8.63005Z",
+																	"fill": "#0A60B5",
+																	"stroke": "black",
+																	"stroke-width": "1.70667",
+																	"stroke-miterlimit": "10"
+																},
+																"children": []
+															},
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_8",
+																	"d": "M0.766014 12.1447C0.609481 12.2583 0.391602 12.1463 0.391602 11.9516V9.90721C0.391602 9.84531 0.415399 9.78667 0.456648 9.74292C0.477272 9.72104 0.49631 9.70877 0.504771 9.70397L1.18061 9.41382C1.23032 9.6848 1.3123 10.0091 1.44926 10.3622C1.6095 10.775 1.79987 11.1094 1.96963 11.3638C1.56825 11.6241 1.16686 11.8844 0.766014 12.1447Z",
+																	"fill": "#0A60B5",
+																	"stroke": "black",
+																	"stroke-width": "1.70667",
+																	"stroke-miterlimit": "10"
+																},
+																"children": []
+															},
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_9",
+																	"fill-rule": "evenodd",
+																	"clip-rule": "evenodd",
+																	"d": "M5.11863 3.21273C6.47036 3.1457 7.48116 3.71166 8.00219 4.08992C7.60778 4.43817 6.54047 5.27853 5.27812 5.76389C5.19298 5.79436 5.08001 5.83945 4.95131 5.90513C4.03786 6.35487 3.49469 7.25118 3.47044 8.20872C3.46637 8.3699 3.4746 8.53046 3.49592 8.68826C3.49361 8.68857 3.49131 8.68888 3.48903 8.68918C3.48531 8.85338 3.49914 9.23978 3.73679 9.64428C3.94894 10.0051 4.23338 10.1986 4.37481 10.282C4.44499 10.3288 4.55634 10.3962 4.69529 10.466C4.8585 10.5529 5.03948 10.6258 5.2391 10.6822C5.26968 10.6911 5.30062 10.6995 5.33181 10.7072C5.40448 10.7254 5.48364 10.7442 5.56903 10.7644C6.17131 10.9074 7.08394 11.1238 8.20285 11.7118C8.31591 11.8066 8.43766 11.9022 8.56827 11.9956C8.52858 12.0311 8.49519 12.0621 8.46819 12.0875C8.23747 12.2826 6.97098 13.3142 5.11863 13.1505C4.36047 13.0836 3.73309 12.8364 3.24236 12.5494C2.4156 12.0663 1.79088 11.302 1.45008 10.4075C1.2305 9.83086 1.03909 9.08515 1.02527 8.20765C1.01304 7.45826 1.1332 6.79817 1.29696 6.25074C1.79833 4.57812 3.26043 3.35145 5.00327 3.22017L5.00335 3.22016C5.0416 3.21751 5.07986 3.21485 5.11863 3.21273ZM14.5861 11.1844C14.2827 10.9597 13.7622 10.6316 13.0411 10.4415C12.2766 10.2401 11.6274 10.2837 11.2478 10.3378C11.1239 10.3782 10.9952 10.4112 10.8613 10.4362C9.80694 10.6318 8.95148 10.0588 8.53303 9.69637C8.45168 9.62603 8.36781 9.55891 8.28165 9.49501C8.56326 9.2476 8.87288 9.03413 9.21043 8.8683C9.96382 8.49841 11.1154 8.50582 12.4558 8.58025C14.3028 8.68336 15.5788 9.56295 16.0882 9.96688C16.145 10.0121 16.1775 10.0801 16.1775 10.1524V11.8123C16.1775 12.0158 15.9388 12.1247 15.7851 11.9914C15.5098 11.7531 15.1049 11.4483 14.5861 11.1844ZM8.66435 6.22472C8.54326 6.35584 8.41593 6.48083 8.28237 6.59819C8.54101 6.79004 8.82057 6.95244 9.11629 7.08249C9.84473 7.40351 10.8459 7.46623 12.1367 7.46465C14.0301 7.46199 15.4241 6.74925 16.0637 6.36126C16.1344 6.31822 16.1775 6.2417 16.1775 6.15878V4.12158C16.1775 3.92758 15.9585 3.81597 15.8011 3.92917C15.4285 4.19722 14.8745 4.53933 14.1601 4.80844C13.9028 4.96005 13.5822 5.11485 13.2001 5.23242C12.367 5.48857 11.6466 5.44446 11.2329 5.38654C10.3323 5.16172 9.34277 5.48964 8.66435 6.22472Z",
+																	"fill": "#E11312"
+																},
+																"children": []
+															},
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_10",
+																	"d": "M8.00166 4.09005L8.13707 4.2433L8.32826 4.07447L8.12183 3.92461L8.00166 4.09005ZM5.11809 3.21286L5.10798 3.00864L5.10745 3.00866L5.10692 3.0087L5.11809 3.21286ZM5.27759 5.76403L5.34647 5.95659L5.34877 5.95577L5.35102 5.9549L5.27759 5.76403ZM4.95078 5.90527L5.04115 6.08868L5.04247 6.08807L5.04379 6.0874L4.95078 5.90527ZM3.49538 8.6884L3.52217 8.89108L3.72555 8.86425L3.69809 8.661L3.49538 8.6884ZM3.4885 8.68932L3.46154 8.48664L3.28798 8.50969L3.28401 8.68467L3.4885 8.68932ZM4.37427 10.2822L4.48774 10.112L4.48307 10.1089L4.47824 10.1061L4.37427 10.2822ZM4.69475 10.4661L4.79093 10.2857L4.78879 10.2845L4.78663 10.2834L4.69475 10.4661ZM5.23857 10.6823L5.29549 10.486L5.29487 10.4858L5.29421 10.4856L5.23857 10.6823ZM8.20232 11.7119L8.33384 11.5553L8.31701 11.5412L8.29748 11.5309L8.20232 11.7119ZM8.56773 11.9957L8.70411 12.1481L8.89429 11.978L8.68678 11.8295L8.56773 11.9957ZM8.46766 12.0877L8.59975 12.2438L8.60404 12.2402L8.60808 12.2364L8.46766 12.0877ZM3.24183 12.5496L3.34511 12.3731L3.34505 12.373L3.24183 12.5496ZM1.02474 8.20779L1.22926 8.20456L1.22925 8.20446L1.02474 8.20779ZM1.29642 6.25088L1.10049 6.19214L1.10045 6.1923L1.29642 6.25088ZM5.00274 3.2203L4.98903 3.01629L4.9882 3.01635L4.98737 3.01641L5.00274 3.2203ZM5.00281 3.2203L5.01652 3.42431L5.01698 3.42428L5.00281 3.2203ZM13.0406 10.4417L13.0928 10.2439H13.0927L13.0406 10.4417ZM14.5855 11.1845L14.4638 11.3488L14.4775 11.359L14.4928 11.3667L14.5855 11.1845ZM11.2473 10.338L11.2183 10.1356L11.2007 10.1381L11.1838 10.1436L11.2473 10.338ZM10.8607 10.4363L10.8981 10.6373H10.8982L10.8607 10.4363ZM8.5325 9.6965L8.66648 9.54197L8.66627 9.54177L8.5325 9.6965ZM8.28112 9.49515L8.14612 9.34159L7.95594 9.50864L8.15931 9.65939L8.28112 9.49515ZM12.4553 8.58039L12.4667 8.37622H12.4666L12.4553 8.58039ZM16.0877 9.96702L16.2149 9.80692L16.2148 9.80687L16.0877 9.96702ZM15.7846 11.9915L15.9187 11.8371L15.9185 11.8369L15.7846 11.9915ZM8.28183 6.59833L8.14678 6.44477L7.95666 6.61177L8.15998 6.76257L8.28183 6.59833ZM9.11576 7.08262L9.19829 6.89553L9.19814 6.89548L9.11576 7.08262ZM12.1362 7.46478L12.1365 7.66925H12.1365L12.1362 7.46478ZM16.0632 6.3614L16.1693 6.53622L16.1696 6.53607L16.0632 6.3614ZM14.1596 4.80857L14.0874 4.61723L14.0709 4.62346L14.0557 4.63242L14.1596 4.80857ZM11.2324 5.38667L11.1828 5.58506L11.1933 5.58767L11.204 5.58915L11.2324 5.38667ZM8.12183 3.92461C7.57989 3.53114 6.52347 2.93845 5.10798 3.00864L5.12822 3.41708C6.41618 3.35322 7.38138 3.89245 7.88144 4.25549L8.12183 3.92461ZM5.35102 5.9549C6.64538 5.45722 7.73371 4.59944 8.13707 4.2433L7.86625 3.9368C7.48074 4.27718 6.43449 5.10015 5.20416 5.5732L5.35102 5.9549ZM5.04379 6.0874C5.16309 6.02647 5.26772 5.98471 5.34647 5.95659L5.20871 5.57152C5.11717 5.60423 4.99585 5.65269 4.85776 5.72318L5.04379 6.0874ZM3.67439 8.21402C3.69676 7.3308 4.19746 6.50412 5.04115 6.08868L4.8604 5.72186C3.87719 6.20595 3.29156 7.17188 3.26543 8.2037L3.67439 8.21402ZM3.69809 8.661C3.6783 8.51455 3.67058 8.36487 3.67439 8.21402L3.26543 8.2037C3.2611 8.3752 3.26984 8.5467 3.29268 8.71575L3.69809 8.661ZM3.51546 8.892C3.5177 8.8917 3.51993 8.89139 3.52217 8.89108L3.4686 8.48566C3.46623 8.48597 3.46387 8.48633 3.46154 8.48664L3.51546 8.892ZM3.91263 9.54085C3.70211 9.18256 3.68969 8.83956 3.69299 8.69392L3.28401 8.68467C3.27987 8.86752 3.29509 9.29732 3.55989 9.74798L3.91263 9.54085ZM4.47824 10.1061C4.35261 10.032 4.10041 9.86028 3.91261 9.54079L3.55989 9.74798C3.79637 10.1503 4.11309 10.3655 4.2703 10.4583L4.47824 10.1061ZM4.78663 10.2834C4.6552 10.2174 4.55104 10.1543 4.48774 10.112L4.26081 10.4523C4.33787 10.5037 4.45643 10.5752 4.60289 10.6488L4.78663 10.2834ZM5.29421 10.4856C5.10788 10.4329 4.94058 10.3654 4.79093 10.2857L4.59858 10.6466C4.77536 10.7407 4.97 10.819 5.18294 10.8791L5.29421 10.4856ZM5.38088 10.509C5.35225 10.5019 5.32376 10.4941 5.29549 10.486L5.18161 10.8787C5.21454 10.8883 5.24788 10.8973 5.28168 10.9058L5.38088 10.509ZM5.61575 10.5656C5.53005 10.5453 5.45212 10.5268 5.38088 10.509L5.28168 10.9058C5.35572 10.9243 5.43616 10.9433 5.52125 10.9635L5.61575 10.5656ZM8.29748 11.5309C7.155 10.9306 6.22187 10.7094 5.61575 10.5656L5.52125 10.9635C6.11975 11.1055 7.01177 11.3174 8.10715 11.8929L8.29748 11.5309ZM8.68678 11.8295C8.56093 11.7394 8.44327 11.6471 8.33384 11.5553L8.07085 11.8685C8.18744 11.9664 8.31338 12.0652 8.44864 12.162L8.68678 11.8295ZM8.60808 12.2364C8.63406 12.2119 8.66607 12.1821 8.70411 12.1481L8.4313 11.8434C8.39004 11.8803 8.35526 11.9126 8.32724 11.939L8.60808 12.2364ZM5.10009 13.3543C7.03682 13.5255 8.35798 12.4482 8.59975 12.2438L8.33558 11.9315C8.11585 12.1173 6.90412 13.1032 5.13615 12.947L5.10009 13.3543ZM3.13854 12.726C3.65082 13.0256 4.30703 13.2843 5.10011 13.3544L5.13615 12.947C4.4129 12.8831 3.8143 12.6475 3.34511 12.3731L3.13854 12.726ZM1.25838 10.4804C1.61483 11.416 2.26927 12.2181 3.1386 12.7261L3.34505 12.373C2.56087 11.9148 1.96586 11.1883 1.64069 10.3349L1.25838 10.4804ZM0.820219 8.21101C0.834481 9.11662 1.03203 9.88594 1.25838 10.4804L1.64071 10.3349C1.4279 9.77599 1.24263 9.05395 1.22926 8.20456L0.820219 8.21101ZM1.10045 6.1923C0.93163 6.75664 0.807599 7.43774 0.820219 8.21116L1.22925 8.20446C1.21742 7.47904 1.3337 6.83991 1.49239 6.30946L1.10045 6.1923ZM4.98737 3.01641C3.15623 3.15434 1.62504 4.44222 1.10049 6.19214L1.49236 6.30956C1.97055 4.7143 3.36357 3.54883 5.0181 3.4242L4.98737 3.01641ZM4.9891 3.01629L4.98903 3.01629L5.01644 3.42432L5.01652 3.42431L4.9891 3.01629ZM5.10692 3.0087C5.0664 3.01091 5.02666 3.01368 4.98864 3.01632L5.01698 3.42428C5.05547 3.42161 5.09225 3.41906 5.12929 3.41703L5.10692 3.0087ZM12.9885 10.6393C13.6767 10.8208 14.1738 11.134 14.4638 11.3488L14.7073 11.0202C14.3904 10.7855 13.8465 10.4426 13.0928 10.2439L12.9885 10.6393ZM11.2762 10.5404C11.6387 10.4886 12.2586 10.4471 12.9885 10.6393L13.0927 10.2439C12.2935 10.0333 11.6151 10.0789 11.2183 10.1356L11.2762 10.5404ZM10.8982 10.6373C11.0409 10.6107 11.1782 10.5756 11.3107 10.5324L11.1838 10.1436C11.0685 10.1812 10.9485 10.2119 10.8232 10.2353L10.8982 10.6373ZM8.39858 9.85098C8.83155 10.2261 9.75005 10.8503 10.8981 10.6373L10.8234 10.2353C9.86276 10.4135 9.07035 9.89182 8.66648 9.54197L8.39858 9.85098ZM8.15931 9.65939C8.24138 9.72027 8.32126 9.78422 8.39873 9.85118L8.66627 9.54177C8.58108 9.46816 8.49323 9.39782 8.40297 9.3309L8.15931 9.65939ZM9.1197 8.68492C8.76425 8.85959 8.43969 9.08364 8.14612 9.34159L8.41617 9.64876C8.68576 9.41187 8.98056 9.20894 9.30011 9.05195L9.1197 8.68492ZM12.4666 8.37622C11.7952 8.33895 11.162 8.31784 10.5994 8.35373C10.0385 8.38951 9.53134 8.4828 9.1197 8.68492L9.30011 9.05195C9.64185 8.88418 10.0872 8.79621 10.6255 8.76186C11.1622 8.72761 11.7749 8.74739 12.4439 8.78455L12.4666 8.37622ZM16.2148 9.80687C15.6896 9.39035 14.3735 8.4827 12.4667 8.37622L12.4438 8.78455C14.231 8.88428 15.467 9.73586 15.9605 10.1272L16.2148 9.80687ZM16.3815 10.1525C16.3815 10.0185 16.3211 9.89131 16.2149 9.80692L15.9604 10.1271C15.9679 10.1331 15.9724 10.1419 15.9724 10.1525H16.3815ZM16.3815 11.8124V10.1525H15.9724V11.8124H16.3815ZM15.6504 12.1459C15.9368 12.3945 16.3815 12.1909 16.3815 11.8124H15.9724C15.9724 11.822 15.9699 11.8273 15.9676 11.8307C15.9648 11.8349 15.9601 11.8393 15.9534 11.8423C15.9468 11.8453 15.9404 11.846 15.9355 11.8455C15.9315 11.8449 15.926 11.8434 15.9187 11.8371L15.6504 12.1459ZM14.4928 11.3667C14.9936 11.6215 15.3848 11.916 15.6507 12.1461L15.9185 11.8369C15.6338 11.5905 15.2152 11.2754 14.6783 11.0023L14.4928 11.3667ZM8.41683 6.75194C8.55613 6.62956 8.68852 6.49957 8.81416 6.36354L8.51353 6.08612C8.39694 6.21239 8.27472 6.33236 8.14678 6.44477L8.41683 6.75194ZM9.19814 6.89548C8.91638 6.77157 8.65006 6.61683 8.40369 6.43414L8.15998 6.76257C8.43089 6.96352 8.7237 7.13359 9.03343 7.26982L9.19814 6.89548ZM12.136 7.26031C10.8405 7.26189 9.88163 7.19672 9.19829 6.89553L9.03328 7.26972C9.80676 7.61062 10.8502 7.67084 12.1365 7.66925L12.136 7.26031ZM15.9571 6.18662C15.3346 6.56423 13.9777 7.2577 12.136 7.26031L12.1365 7.66925C14.0813 7.66655 15.5126 6.93458 16.1693 6.53622L15.9571 6.18662ZM15.9724 6.15892C15.9724 6.17047 15.9666 6.18085 15.9568 6.18678L16.1696 6.53607C16.3012 6.45591 16.3815 6.31319 16.3815 6.15892H15.9724ZM15.9724 4.12171V6.15892H16.3815V4.12171H15.9724ZM15.92 4.09528C15.9427 4.07894 15.9724 4.09516 15.9724 4.12171H16.3815C16.3815 3.76028 15.9731 3.55327 15.6811 3.76334L15.92 4.09528ZM14.2317 4.99991C14.9668 4.72302 15.5366 4.37113 15.92 4.09528L15.6811 3.76334C15.3193 4.02358 14.7812 4.35591 14.0874 4.61723L14.2317 4.99991ZM13.2597 5.42798C13.6594 5.30504 13.9946 5.14315 14.2634 4.98473L14.0557 4.63242C13.8099 4.77723 13.5039 4.92497 13.1394 5.03712L13.2597 5.42798ZM11.204 5.58915C11.6356 5.64963 12.3885 5.69589 13.2597 5.42798L13.1395 5.03711C12.3443 5.28157 11.6564 5.23961 11.2608 5.18419L11.204 5.58915ZM8.81416 6.36354C9.44768 5.67713 10.3626 5.38033 11.1828 5.58506L11.2819 5.18828C10.3008 4.94339 9.23685 5.30248 8.51348 6.08617L8.81416 6.36354Z",
+																	"fill": "black"
+																},
+																"children": []
+															}
+														]
+													}
+												]
+											}
+										]
+									}
+								]
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "LangfuseIcon"
+}
diff --git a/app/components/base/icons/src/public/tracing/LangfuseIcon.tsx b/app/components/base/icons/src/public/tracing/LangfuseIcon.tsx
new file mode 100644
index 0000000..7f0f115
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/LangfuseIcon.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LangfuseIcon.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LangfuseIcon'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/tracing/LangfuseIconBig.json b/app/components/base/icons/src/public/tracing/LangfuseIconBig.json
new file mode 100644
index 0000000..8172de6
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/LangfuseIconBig.json
@@ -0,0 +1,236 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "111",
+			"height": "24",
+			"viewBox": "0 0 111 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Clip path group"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "mask",
+						"attributes": {
+							"id": "mask0_20135_18315",
+							"style": "mask-type:luminance",
+							"maskUnits": "userSpaceOnUse",
+							"x": "0",
+							"y": "0",
+							"width": "144",
+							"height": "24"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "clip0_823_291"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector",
+											"d": "M143.36 0H0V24H143.36V0Z",
+											"fill": "white"
+										},
+										"children": []
+									}
+								]
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"mask": "url(#mask0_20135_18315)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_2",
+											"d": "M31.9258 17.3144V5.5896H33.5612V15.7456H39.5908V17.3144H31.9258ZM41.5502 11.1713C41.8806 9.47033 43.3343 8.36391 45.1845 8.36391C47.3155 8.36391 48.7197 9.60244 48.7197 12.03V15.3492C48.7197 15.729 48.8849 15.8942 49.2483 15.8942H49.6283V17.3144H49.1657C48.1085 17.3144 47.4807 16.7529 47.3155 15.9768C46.9852 16.7859 45.9609 17.5125 44.5898 17.5125C42.8222 17.5125 41.4016 16.5878 41.4016 15.019C41.4016 13.2024 42.7396 12.6905 44.755 12.3107L47.1173 11.8483C47.1008 10.5107 46.3409 9.85015 45.168 9.85015C44.1768 9.85015 43.45 10.4446 43.2517 11.2868L41.5502 11.1713ZM43.0865 14.9859C43.1031 15.5969 43.6317 16.1089 44.7881 16.1089C46.1096 16.1089 47.1503 15.1841 47.1503 13.6153V13.2355L45.2671 13.5657C44.0447 13.7804 43.0865 13.8795 43.0865 14.9859ZM51.8189 8.56208H53.2892L53.3387 10.0318C53.8013 8.90887 54.7759 8.36391 55.9488 8.36391C57.8981 8.36391 58.8563 9.80061 58.8563 11.6832V17.3144H57.2539V12.096C57.2539 10.5437 56.7418 9.73455 55.5358 9.73455C54.2638 9.73455 53.4213 10.5437 53.4213 12.096V17.3144H51.8189V8.56208ZM64.8465 16.852C62.6824 16.852 61.1461 15.118 61.1461 12.6575C61.1461 10.1144 62.6824 8.36391 64.8465 8.36391C66.0193 8.36391 67.0436 8.99143 67.44 9.89969L67.4565 8.56208H68.9929V16.3566C68.9763 18.7511 67.4565 19.9896 65.1108 19.9896C63.1945 19.9896 61.8069 18.9823 61.3939 17.463L63.0789 17.3474C63.4258 18.107 64.1031 18.5529 65.1108 18.5529C66.5315 18.5529 67.3739 17.9089 67.3905 16.7034V15.3988C66.9444 16.241 65.8872 16.852 64.8465 16.852ZM62.8311 12.641C62.8311 14.2924 63.7066 15.4483 65.1438 15.4483C66.548 15.4483 67.407 14.2924 67.4235 12.641C67.4565 11.0061 66.581 9.85015 65.1438 9.85015C63.7066 9.85015 62.8311 11.0061 62.8311 12.641ZM73.4961 8.18226C73.4961 6.56391 74.3055 5.5896 76.0897 5.5896H78.5015V7.00978H76.0566C75.495 7.00978 75.0985 7.43914 75.0985 8.14923V9.12354H78.3859V10.5437H75.0985V17.3144H73.4961V10.5437H71.1999V9.12354H73.4961V8.18226ZM88.3571 17.3144H86.8373L86.8207 15.8942C86.3582 16.9841 85.4001 17.5125 84.2767 17.5125C82.3605 17.5125 81.4189 16.0758 81.4189 14.1933V8.56208H83.0212V13.7804C83.0212 15.3327 83.5334 16.1419 84.6897 16.1419C85.9287 16.1419 86.7547 15.3327 86.7547 13.7804V8.56208H88.3571V17.3144ZM96.7925 11.3034C96.6108 10.3786 95.7518 9.85015 94.7275 9.85015C93.885 9.85015 93.1086 10.263 93.1251 11.0722C93.1251 11.9474 94.1824 12.1456 95.1571 12.3933C96.8255 12.8061 98.494 13.4171 98.494 15.052C98.494 16.7694 96.842 17.5125 95.0249 17.5125C92.9765 17.5125 91.308 16.3566 91.1758 14.5401L92.8608 14.441C93.026 15.4153 93.9016 16.0263 95.0249 16.0263C95.9004 16.0263 96.809 15.7951 96.809 14.9694C96.809 14.1107 95.7022 13.9621 94.7275 13.7309C93.0756 13.3346 91.4402 12.7235 91.4402 11.1382C91.4402 9.37125 93.026 8.36391 94.8762 8.36391C96.7264 8.36391 98.1636 9.47033 98.4444 11.2043L96.7925 11.3034ZM100.817 12.9382C100.817 10.1474 102.419 8.36391 104.88 8.36391C106.846 8.36391 108.63 9.63547 108.763 12.7896V13.4006H102.518C102.65 15.052 103.493 16.0263 104.88 16.0263C105.756 16.0263 106.549 15.5144 106.929 14.6391L108.63 14.7878C108.135 16.4557 106.632 17.5125 104.88 17.5125C102.419 17.5125 100.817 15.729 100.817 12.9382ZM102.568 12.1125H107.011C106.78 10.4446 105.872 9.85015 104.88 9.85015C103.608 9.85015 102.799 10.6924 102.568 12.1125Z",
+											"fill": "black"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "g",
+										"attributes": {
+											"id": "Clip path group_2"
+										},
+										"children": [
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask1_20135_18315",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "-1",
+													"width": "25",
+													"height": "26"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "g",
+														"attributes": {
+															"id": "clip1_823_291"
+														},
+														"children": [
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_3",
+																	"d": "M24.5471 -0.0771484H0.308594V24.1529H24.5471V-0.0771484Z",
+																	"fill": "white"
+																},
+																"children": []
+															}
+														]
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask1_20135_18315)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "g",
+														"attributes": {
+															"id": "Group_2"
+														},
+														"children": [
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_4",
+																	"d": "M21.9423 16.8532C20.8746 18.2972 19.2396 19.2605 17.3946 19.4012C17.3372 19.4051 17.2797 19.4092 17.2215 19.4124C15.0582 19.5201 13.424 18.5334 12.3404 17.6174C10.4229 16.6027 8.92256 16.3471 8.04475 16.1261C7.4064 15.9654 6.84782 15.644 6.60842 15.4833C6.39617 15.3572 5.96925 15.0647 5.65086 14.5191C5.29416 13.9077 5.27342 13.3235 5.279 13.0752C5.46493 13.0504 5.70512 13.023 5.98601 13.0054C6.21582 12.9909 6.43845 12.9853 6.68823 12.9844C8.62571 12.982 10.1283 13.0768 11.2215 13.5622C11.8128 13.8241 12.361 14.1728 12.8493 14.5979C13.4774 15.1459 14.7613 16.012 16.3437 15.7164C16.5448 15.6786 16.7379 15.6287 16.9239 15.5677C17.4935 15.4857 18.4679 15.4198 19.6154 15.7243C20.7046 16.0136 21.4882 16.5134 21.9423 16.8532Z",
+																	"fill": "#0A60B5",
+																	"stroke": "black",
+																	"stroke-width": "2.56",
+																	"stroke-miterlimit": "10"
+																},
+																"children": []
+															},
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_5",
+																	"d": "M21.8003 6.90944C21.319 6.28602 20.7339 5.69669 20.043 5.29456C19.3066 4.86626 18.367 4.49744 17.2306 4.3975C14.4541 4.15321 12.5557 5.69273 12.2099 5.98382C11.7796 6.38753 10.0582 7.81602 7.98609 8.60917C7.62509 8.73768 6.93016 9.0414 6.31253 9.71961C5.82401 10.2557 5.58492 10.8046 5.46777 11.1457C5.71483 11.1798 5.96985 11.2044 6.23284 11.2194C8.2419 11.3313 9.96813 11.3424 11.0974 10.7896C11.8433 10.4247 12.4976 9.90517 13.0618 9.29681C14.0787 8.19987 15.5618 7.71051 16.9118 8.04605C17.5318 8.13247 18.6117 8.19833 19.8605 7.81602C20.7228 7.55189 21.3652 7.21957 21.8003 6.90944Z",
+																	"fill": "#0A60B5",
+																	"stroke": "black",
+																	"stroke-width": "2.56",
+																	"stroke-miterlimit": "10"
+																},
+																"children": []
+															},
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_6",
+																	"d": "M2.95884 7.37229C2.1886 6.97653 1.58732 6.52001 1.17721 6.16263C0.947963 5.96275 0.591797 6.12665 0.591797 6.43206V8.92893C0.591797 9.03766 0.640978 9.14079 0.725063 9.20796L1.74835 10.1922C1.80229 9.79638 1.9181 9.25834 2.17829 8.66347C2.4234 8.10227 2.71769 7.67288 2.95884 7.37229Z",
+																	"fill": "#0A60B5",
+																	"stroke": "black",
+																	"stroke-width": "2.56",
+																	"stroke-miterlimit": "10"
+																},
+																"children": []
+															},
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_7",
+																	"d": "M19.4326 12.9446C19.5497 12.584 19.6146 12.2056 19.6243 11.8201C19.6323 11.5156 19.597 11.4018 19.5441 11.1069C20.0886 11.0155 20.7686 10.8664 21.3886 10.7061C22.0438 10.537 22.5282 10.3406 23.0727 10.145C23.1521 10.5257 23.2355 10.7109 23.2644 10.993C23.2916 11.2591 23.3085 11.5348 23.3132 11.8201C23.3277 12.7066 23.2194 13.5105 23.0526 14.215C22.5394 13.9488 21.9299 13.6732 21.2282 13.4311C20.5754 13.2051 19.9683 13.0512 19.4326 12.9446Z",
+																	"fill": "#0A60B5",
+																	"stroke": "black",
+																	"stroke-width": "2.56",
+																	"stroke-miterlimit": "10"
+																},
+																"children": []
+															},
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_8",
+																	"d": "M1.15342 18.2166C0.918616 18.3871 0.591797 18.2191 0.591797 17.927V14.8605C0.591797 14.7676 0.627493 14.6796 0.689366 14.614C0.720303 14.5812 0.748859 14.5628 0.761552 14.5556L1.77532 14.1204C1.84988 14.5268 1.97284 15.0133 2.17829 15.5429C2.41864 16.1621 2.7042 16.6637 2.95884 17.0454C2.35676 17.4358 1.75469 17.8263 1.15342 18.2166Z",
+																	"fill": "#0A60B5",
+																	"stroke": "black",
+																	"stroke-width": "2.56",
+																	"stroke-miterlimit": "10"
+																},
+																"children": []
+															},
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_9",
+																	"fill-rule": "evenodd",
+																	"clip-rule": "evenodd",
+																	"d": "M7.68233 4.81872C9.70993 4.71818 11.2261 5.56713 12.0077 6.13451C11.4161 6.65689 9.81509 7.91742 7.92157 8.64547C7.79386 8.69117 7.62441 8.7588 7.43136 8.85733C6.06118 9.53194 5.24643 10.8764 5.21006 12.3127C5.20395 12.5545 5.21629 12.7953 5.24827 13.032C5.24481 13.0325 5.24136 13.033 5.23794 13.0334C5.23236 13.2797 5.2531 13.8593 5.60958 14.4661C5.9278 15.0073 6.35446 15.2975 6.5666 15.4227C6.67187 15.4928 6.83891 15.5939 7.04732 15.6986C7.29214 15.829 7.56361 15.9383 7.86305 16.0229C7.90892 16.0362 7.95532 16.0488 8.00211 16.0605C8.11111 16.0877 8.22985 16.1159 8.35794 16.1463C9.26137 16.3607 10.6303 16.6854 12.3087 17.5673C12.4783 17.7095 12.6609 17.8529 12.8568 17.993C12.7973 18.0463 12.7472 18.0927 12.7067 18.1309C12.3606 18.4235 10.4609 19.9709 7.68233 19.7254C6.5451 19.625 5.60404 19.2542 4.86793 18.8238C3.62779 18.0991 2.69071 16.9526 2.17951 15.6109C1.85014 14.7459 1.56303 13.6274 1.5423 12.3111C1.52395 11.187 1.70419 10.1969 1.94983 9.37575C2.70188 6.86682 4.89504 5.0268 7.5093 4.82989L7.50941 4.82988C7.5668 4.82589 7.62418 4.82191 7.68233 4.81872ZM21.8835 16.7762C21.4284 16.4391 20.6476 15.947 19.5661 15.6619C18.4192 15.3597 17.4455 15.4251 16.8761 15.5064C16.6902 15.567 16.4972 15.6164 16.2963 15.6539C14.7148 15.9473 13.4316 15.0879 12.8039 14.5442C12.6819 14.4387 12.5561 14.338 12.4269 14.2422C12.8493 13.871 13.3137 13.5508 13.82 13.3021C14.9501 12.7473 16.6775 12.7584 18.6881 12.87C21.4586 13.0247 23.3726 14.3441 24.1367 14.95C24.222 15.0177 24.2707 15.1198 24.2707 15.2282V17.718C24.2707 18.0233 23.9125 18.1867 23.682 17.9867C23.2692 17.6292 22.6618 17.1721 21.8835 16.7762ZM13.0009 9.33672C12.8193 9.5334 12.6283 9.72087 12.4279 9.89693C12.8159 10.1847 13.2353 10.4283 13.6788 10.6234C14.7715 11.1049 16.2732 11.199 18.2095 11.1966C21.0495 11.1926 23.1406 10.1235 24.1 9.54153C24.206 9.47696 24.2707 9.36218 24.2707 9.23781V6.182C24.2707 5.89101 23.9421 5.72359 23.706 5.8934C23.1472 6.29546 22.3162 6.80863 21.2445 7.21229C20.8586 7.43971 20.3776 7.6719 19.8046 7.84826C18.5548 8.23249 17.4742 8.16632 16.8538 8.07944C15.5028 7.74222 14.0186 8.2341 13.0009 9.33672Z",
+																	"fill": "#E11312"
+																},
+																"children": []
+															},
+															{
+																"type": "element",
+																"name": "path",
+																"attributes": {
+																	"id": "Vector_10",
+																	"d": "M12.0069 6.13459L12.21 6.36447L12.4968 6.11122L12.1871 5.88642L12.0069 6.13459ZM7.68154 4.8188L7.66636 4.51247L7.66557 4.51251L7.66477 4.51255L7.68154 4.8188ZM7.92078 8.64555L8.0241 8.9344L8.02755 8.93317L8.03092 8.93187L7.92078 8.64555ZM7.43056 8.85741L7.56612 9.13253L7.56811 9.13161L7.57008 9.13062L7.43056 8.85741ZM5.24747 13.0321L5.28765 13.3361L5.59271 13.2959L5.55152 12.991L5.24747 13.0321ZM5.23715 13.0335L5.1967 12.7295L4.93636 12.764L4.93041 13.0265L5.23715 13.0335ZM6.56581 15.4228L6.736 15.1676L6.729 15.1629L6.72175 15.1587L6.56581 15.4228ZM7.04653 15.6987L7.19079 15.428L7.18759 15.4263L7.18433 15.4247L7.04653 15.6987ZM7.86225 16.023L7.94762 15.7285L7.9467 15.7282L7.94571 15.7279L7.86225 16.023ZM12.3079 17.5673L12.5052 17.3324L12.4799 17.3112L12.4506 17.2958L12.3079 17.5673ZM12.856 17.9931L13.0606 18.2216L13.3458 17.9664L13.0346 17.7437L12.856 17.9931ZM12.7059 18.131L12.904 18.3652L12.9105 18.3598L12.9165 18.3541L12.7059 18.131ZM4.86713 18.8239L5.02207 18.5591L5.02197 18.559L4.86713 18.8239ZM1.5415 12.3112L1.84828 12.3064L1.84827 12.3062L1.5415 12.3112ZM1.94903 9.37583L1.65512 9.28773L1.65507 9.28796L1.94903 9.37583ZM7.5085 4.82997L7.48794 4.52395L7.48669 4.52403L7.48544 4.52413L7.5085 4.82997ZM7.50862 4.82996L7.52918 5.13598L7.52987 5.13593L7.50862 4.82996ZM19.5653 15.662L19.6435 15.3654H19.6435L19.5653 15.662ZM21.8827 16.7763L21.7001 17.0227L21.7207 17.038L21.7436 17.0496L21.8827 16.7763ZM16.8753 15.5065L16.8319 15.2028L16.8055 15.2066L16.7801 15.2149L16.8753 15.5065ZM16.2955 15.654L16.3515 15.9555H16.3517L16.2955 15.654ZM12.8031 14.5443L13.0041 14.3125L13.0038 14.3122L12.8031 14.5443ZM12.4261 14.2422L12.2236 14.0119L11.9383 14.2625L12.2434 14.4886L12.4261 14.2422ZM18.6873 12.8701L18.7044 12.5638H18.7042L18.6873 12.8701ZM24.1359 14.95L24.3267 14.7099L24.3266 14.7098L24.1359 14.95ZM23.6813 17.9868L23.8824 17.7552L23.8821 17.7549L23.6813 17.9868ZM12.4271 9.89701L12.2246 9.66667L11.9394 9.91717L12.2444 10.1434L12.4271 9.89701ZM13.678 10.6234L13.8018 10.3428L13.8016 10.3427L13.678 10.6234ZM18.2087 11.1967L18.2091 11.5034H18.2092L18.2087 11.1967ZM24.0992 9.54161L24.2584 9.80384L24.2588 9.80361L24.0992 9.54161ZM21.2437 7.21237L21.1355 6.92536L21.1107 6.9347L21.088 6.94815L21.2437 7.21237ZM16.853 8.07952L16.7786 8.37711L16.7943 8.38102L16.8104 8.38324L16.853 8.07952ZM12.1871 5.88642C11.3742 5.29623 9.7896 4.40718 7.66636 4.51247L7.69672 5.12514C9.62867 5.02934 11.0765 5.83819 11.8266 6.38275L12.1871 5.88642ZM8.03092 8.93187C9.97246 8.18534 11.605 6.89867 12.21 6.36447L11.8038 5.90471C11.2255 6.41528 9.65613 7.64973 7.81063 8.35932L8.03092 8.93187ZM7.57008 9.13062C7.74904 9.03922 7.90597 8.97657 8.0241 8.9344L7.81746 8.35679C7.68016 8.40586 7.49818 8.47855 7.29104 8.58429L7.57008 9.13062ZM5.51598 12.3205C5.54953 10.9957 6.30059 9.75569 7.56612 9.13253L7.29499 8.5823C5.82017 9.30843 4.94173 10.7573 4.90255 12.3051L5.51598 12.3205ZM5.55152 12.991C5.52184 12.7713 5.51027 12.5468 5.51598 12.3205L4.90255 12.3051C4.89604 12.5623 4.90915 12.8196 4.94341 13.0731L5.55152 12.991ZM5.27759 13.3375C5.28094 13.3371 5.28429 13.3366 5.28765 13.3361L5.20729 12.728C5.20373 12.7285 5.2002 12.729 5.1967 12.7295L5.27759 13.3375ZM5.87334 14.3108C5.55756 13.7734 5.53893 13.2588 5.54388 13.0404L4.93041 13.0265C4.92419 13.3008 4.94703 13.9455 5.34423 14.6215L5.87334 14.3108ZM6.72175 15.1587C6.53331 15.0475 6.15501 14.7899 5.87331 14.3107L5.34423 14.6215C5.69895 15.2249 6.17402 15.5477 6.40985 15.6869L6.72175 15.1587ZM7.18433 15.4247C6.98719 15.3256 6.83096 15.2309 6.736 15.1676L6.39562 15.678C6.51119 15.755 6.68904 15.8623 6.90873 15.9728L7.18433 15.4247ZM7.94571 15.7279C7.66622 15.6489 7.41526 15.5476 7.19079 15.428L6.90227 15.9694C7.16743 16.1106 7.4594 16.2279 7.7788 16.3182L7.94571 15.7279ZM8.07572 15.763C8.03277 15.7523 7.99004 15.7407 7.94762 15.7285L7.7768 16.3176C7.8262 16.3319 7.87621 16.3455 7.92691 16.3581L8.07572 15.763ZM8.42802 15.8479C8.29947 15.8174 8.18257 15.7897 8.07572 15.763L7.92691 16.3581C8.03798 16.3859 8.15864 16.4145 8.28627 16.4448L8.42802 15.8479ZM12.4506 17.2958C10.7369 16.3954 9.3372 16.0636 8.42802 15.8479L8.28627 16.4448C9.18402 16.6578 10.522 16.9755 12.1651 17.8389L12.4506 17.2958ZM13.0346 17.7437C12.8458 17.6086 12.6693 17.4702 12.5052 17.3324L12.1107 17.8023C12.2855 17.949 12.4745 18.0973 12.6774 18.2425L13.0346 17.7437ZM12.9165 18.3541C12.9555 18.3173 13.0035 18.2727 13.0606 18.2216L12.6514 17.7646C12.5895 17.8199 12.5373 17.8684 12.4953 17.908L12.9165 18.3541ZM7.65454 20.031C10.5596 20.2878 12.5414 18.6718 12.904 18.3652L12.5078 17.8968C12.1782 18.1755 10.3606 19.6543 7.70861 19.42L7.65454 20.031ZM4.7122 19.0885C5.48062 19.538 6.46494 19.9259 7.65455 20.0311L7.70861 19.42C6.62375 19.3242 5.72585 18.9707 5.02207 18.5591L4.7122 19.0885ZM1.89197 15.7201C2.42664 17.1235 3.4083 18.3266 4.71229 19.0886L5.02197 18.559C3.84569 17.8717 2.95318 16.7819 2.46543 15.5018L1.89197 15.7201ZM1.23472 12.316C1.25612 13.6744 1.55244 14.8284 1.89197 15.7201L2.46546 15.5019C2.14624 14.6635 1.86835 13.5804 1.84828 12.3064L1.23472 12.316ZM1.65507 9.28796C1.40184 10.1345 1.21579 11.1561 1.23472 12.3163L1.84827 12.3062C1.83052 11.2181 2.00495 10.2594 2.24298 9.4637L1.65507 9.28796ZM7.48544 4.52413C4.73874 4.73102 2.44195 6.66285 1.65512 9.28773L2.24293 9.46385C2.96021 7.07095 5.04976 5.32275 7.53155 5.13581L7.48544 4.52413ZM7.48805 4.52394L7.48794 4.52395L7.52906 5.13599L7.52918 5.13598L7.48805 4.52394ZM7.66477 4.51255C7.60399 4.51588 7.54439 4.52003 7.48736 4.52399L7.52987 5.13593C7.58761 5.13192 7.64276 5.1281 7.69834 5.12505L7.66477 4.51255ZM19.4871 15.9585C20.5195 16.2307 21.2651 16.7006 21.7001 17.0227L22.0654 16.5298C21.5901 16.1778 20.7741 15.6634 19.6435 15.3654L19.4871 15.9585ZM16.9186 15.8101C17.4624 15.7325 18.3923 15.6701 19.4871 15.9585L19.6435 15.3654C18.4447 15.0495 17.427 15.1179 16.8319 15.2028L16.9186 15.8101ZM16.3517 15.9555C16.5658 15.9156 16.7717 15.8629 16.9704 15.7981L16.7801 15.2149C16.6071 15.2713 16.4271 15.3174 16.2392 15.3524L16.3517 15.9555ZM12.6023 14.776C13.2517 15.3386 14.6295 16.275 16.3515 15.9555L16.2395 15.3524C14.7985 15.6197 13.6099 14.8372 13.0041 14.3125L12.6023 14.776ZM12.2434 14.4886C12.3665 14.5799 12.4863 14.6758 12.6025 14.7763L13.0038 14.3122C12.876 14.2017 12.7442 14.0962 12.6089 13.9959L12.2434 14.4886ZM13.6839 13.0269C13.1508 13.2889 12.6639 13.625 12.2236 14.0119L12.6286 14.4726C13.033 14.1173 13.4752 13.8129 13.9546 13.5774L13.6839 13.0269ZM18.7042 12.5638C17.6973 12.5079 16.7474 12.4763 15.9035 12.5301C15.0621 12.5838 14.3014 12.7237 13.6839 13.0269L13.9546 13.5774C14.4672 13.3258 15.1352 13.1938 15.9426 13.1423C16.7477 13.0909 17.6667 13.1206 18.6702 13.1763L18.7042 12.5638ZM24.3266 14.7098C23.5387 14.085 21.5647 12.7236 18.7044 12.5638L18.6702 13.1763C21.3509 13.3259 23.2049 14.6033 23.9452 15.1903L24.3266 14.7098ZM24.5767 15.2283C24.5767 15.0273 24.4861 14.8365 24.3267 14.7099L23.945 15.1902C23.9563 15.1992 23.9631 15.2124 23.9631 15.2283H24.5767ZM24.5767 17.7181V15.2283H23.9631V17.7181H24.5767ZM23.4801 18.2183C23.9096 18.5912 24.5767 18.2859 24.5767 17.7181H23.9631C23.9631 17.7326 23.9593 17.7405 23.9559 17.7456C23.9516 17.7519 23.9445 17.7584 23.9345 17.7629C23.9246 17.7675 23.915 17.7685 23.9076 17.7677C23.9016 17.7669 23.8933 17.7646 23.8824 17.7552L23.4801 18.2183ZM21.7436 17.0496C22.4948 17.4318 23.0817 17.8734 23.4804 18.2186L23.8821 17.7549C23.4551 17.3852 22.8272 16.9126 22.0218 16.5029L21.7436 17.0496ZM12.6296 10.1274C12.8386 9.94385 13.0372 9.74886 13.2256 9.54483L12.7747 9.1287C12.5998 9.31809 12.4165 9.49805 12.2246 9.66667L12.6296 10.1274ZM13.8016 10.3427C13.379 10.1569 12.9795 9.92476 12.6099 9.65072L12.2444 10.1434C12.6507 10.4448 13.0899 10.6999 13.5545 10.9042L13.8016 10.3427ZM18.2083 10.89C16.2651 10.8924 14.8268 10.7946 13.8018 10.3428L13.5543 10.9041C14.7145 11.4154 16.2797 11.5058 18.2091 11.5034L18.2083 10.89ZM23.94 9.27945C23.0063 9.84586 20.971 10.8861 18.2083 10.89L18.2092 11.5034C21.1263 11.4993 23.2733 10.4014 24.2584 9.80384L23.94 9.27945ZM23.9631 9.23789C23.9631 9.25522 23.9542 9.27078 23.9396 9.27968L24.2588 9.80361C24.4563 9.68338 24.5767 9.4693 24.5767 9.23789H23.9631ZM23.9631 6.18208V9.23789H24.5767V6.18208H23.9631ZM23.8844 6.14243C23.9185 6.11792 23.9631 6.14225 23.9631 6.18208H24.5767C24.5767 5.63993 23.9641 5.32941 23.526 5.64453L23.8844 6.14243ZM21.3519 7.49938C22.4546 7.08404 23.3093 6.55621 23.8844 6.14243L23.526 5.64453C22.9834 6.03488 22.1762 6.53338 21.1355 6.92536L21.3519 7.49938ZM19.894 8.14148C20.4934 7.95707 20.9962 7.71423 21.3995 7.4766L21.088 6.94815C20.7192 7.16536 20.2602 7.38697 19.7135 7.55519L19.894 8.14148ZM16.8104 8.38324C17.4579 8.47395 18.5872 8.54334 19.894 8.14148L19.7136 7.55517C18.5209 7.92187 17.4889 7.85892 16.8955 7.7758L16.8104 8.38324ZM13.2256 9.54483C14.1759 8.5152 15.5483 8.07001 16.7786 8.37711L16.9273 7.78194C15.4556 7.41459 13.8597 7.95323 12.7746 9.12877L13.2256 9.54483Z",
+																	"fill": "black"
+																},
+																"children": []
+															}
+														]
+													}
+												]
+											}
+										]
+									}
+								]
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "LangfuseIconBig"
+}
diff --git a/app/components/base/icons/src/public/tracing/LangfuseIconBig.tsx b/app/components/base/icons/src/public/tracing/LangfuseIconBig.tsx
new file mode 100644
index 0000000..69ac5aa
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/LangfuseIconBig.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LangfuseIconBig.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LangfuseIconBig'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/tracing/LangsmithIcon.json b/app/components/base/icons/src/public/tracing/LangsmithIcon.json
new file mode 100644
index 0000000..293c4bf
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/LangsmithIcon.json
@@ -0,0 +1,188 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "84",
+			"height": "14",
+			"viewBox": "0 0 84 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Clip path group"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "mask",
+						"attributes": {
+							"id": "mask0_20135_16592",
+							"style": "mask-type:luminance",
+							"maskUnits": "userSpaceOnUse",
+							"x": "0",
+							"y": "0",
+							"width": "84",
+							"height": "14"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "a"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector",
+											"d": "M83.2164 0.600098H0.799805V13.4001H83.2164V0.600098Z",
+											"fill": "white"
+										},
+										"children": []
+									}
+								]
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"mask": "url(#mask0_20135_16592)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_2",
+											"d": "M31.0264 3.12256V10.8845H36.3737V9.71251H32.2403V3.12256H31.0264Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_3",
+											"d": "M39.2238 4.96436C38.0585 4.96436 37.1871 5.51066 36.8333 6.46298C36.8108 6.52391 36.7427 6.70772 36.7427 6.70772L37.7416 7.35386L37.8773 7.00007C38.1087 6.39693 38.5367 6.11584 39.2238 6.11584C39.911 6.11584 40.3042 6.44916 40.297 7.10554C40.297 7.13216 40.295 7.21255 40.295 7.21255C40.295 7.21255 39.3856 7.36 39.0109 7.43936C37.4119 7.77728 36.7422 8.38759 36.7422 9.38599C36.7422 9.91796 37.0376 10.494 37.5767 10.817C37.9003 11.0106 38.3227 11.0838 38.7892 11.0838C39.0959 11.0838 39.3938 11.0382 39.6698 10.9542C40.297 10.7459 40.4721 10.3363 40.4721 10.3363V10.8718H41.511V7.04308C41.511 5.74157 40.6559 4.96436 39.2238 4.96436ZM40.3011 9.05012C40.3011 9.45255 39.8628 10.0193 38.8419 10.0193C38.5536 10.0193 38.3494 9.94304 38.2132 9.82938C38.0309 9.67732 37.971 9.45869 37.9961 9.26567C38.0068 9.1817 38.0575 9.00096 38.2454 8.84429C38.4374 8.68404 38.7769 8.56935 39.3012 8.45517C39.7323 8.36148 40.3016 8.25805 40.3016 8.25805V9.05063L40.3011 9.05012Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_4",
+											"d": "M45.3523 4.96438C45.2079 4.96438 45.0671 4.97462 44.9304 4.99356C44.0001 5.13334 43.7277 5.60591 43.7277 5.60591L43.7287 5.13334H42.5645V10.8729H43.7784V7.68924C43.7784 6.60739 44.5674 6.11484 45.3006 6.11484C46.0932 6.11484 46.4782 6.54083 46.4782 7.41788V10.8729H47.6921V7.25097C47.6921 5.8399 46.7956 4.96387 45.3528 4.96387L45.3523 4.96438Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_5",
+											"d": "M52.7575 5.12922V5.72058C52.7575 5.72058 52.4601 4.96436 51.1067 4.96436C49.4253 4.96436 48.3809 6.12455 48.3809 7.99284C48.3809 9.04704 48.7178 9.877 49.3122 10.4013C49.7745 10.8088 50.392 11.0177 51.1272 11.0321C51.6387 11.0418 51.97 10.9025 52.1769 10.7709C52.5742 10.518 52.7217 10.2779 52.7217 10.2779C52.7217 10.2779 52.7048 10.4658 52.6741 10.7203C52.6521 10.9046 52.6106 11.0341 52.6106 11.0341C52.4258 11.692 51.885 12.0725 51.0965 12.0725C50.308 12.0725 49.8303 11.8129 49.7356 11.3014L48.5555 11.6536C48.7592 12.6367 49.6819 13.2234 51.0233 13.2234C51.9352 13.2234 52.65 12.9756 53.1482 12.4861C53.6505 11.9926 53.9054 11.2814 53.9054 10.3721V5.12871H52.7575V5.12922ZM52.6813 8.04455C52.6813 9.19348 52.1201 9.87956 51.18 9.87956C50.1729 9.87956 49.5953 9.19143 49.5953 7.99232C49.5953 6.79322 50.1729 6.11533 51.18 6.11533C52.0976 6.11533 52.6725 6.79834 52.6813 7.89812V8.04455Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_6",
+											"d": "M61.022 9.69984C61.1858 9.40237 61.2688 9.05165 61.2688 8.65689C61.2688 8.26214 61.1986 7.95904 61.0599 7.71379C60.9211 7.46752 60.7419 7.2663 60.5279 7.11526C60.3123 6.9632 60.0845 6.84339 59.852 6.7584C59.6186 6.67341 59.404 6.6048 59.2151 6.55513L57.8291 6.16857C57.654 6.12198 57.4789 6.0631 57.3079 5.99296C57.1354 5.9223 56.9884 5.82451 56.8722 5.70215C56.7534 5.57773 56.693 5.41594 56.693 5.21984C56.693 5.01402 56.7632 4.83124 56.9009 4.67661C57.0376 4.52352 57.2199 4.40474 57.4431 4.32333C57.6648 4.24192 57.909 4.2025 58.1691 4.20608C58.4364 4.21325 58.6919 4.26804 58.9279 4.36941C59.1649 4.47079 59.3687 4.62029 59.5336 4.81383C59.6938 5.00224 59.8049 5.23162 59.8643 5.49632L61.2042 5.26336C61.0901 4.80461 60.8955 4.40679 60.6252 4.08116C60.3497 3.74938 60.0026 3.49236 59.593 3.31776C59.1829 3.14266 58.7093 3.05204 58.185 3.04845C57.6689 3.04487 57.1912 3.1273 56.7688 3.2937C56.3474 3.45959 56.008 3.71252 55.7596 4.04532C55.5118 4.3776 55.3859 4.79437 55.3859 5.28384C55.3859 5.61869 55.4417 5.90285 55.5523 6.12916C55.6629 6.35597 55.8072 6.54439 55.9808 6.69031C56.1554 6.83674 56.3428 6.95245 56.5384 7.0354C56.7355 7.11885 56.9214 7.18644 57.0913 7.23559L59.0892 7.82644C59.2335 7.86996 59.3626 7.92218 59.4727 7.98157C59.5838 8.04148 59.6759 8.10906 59.7471 8.18228C59.8188 8.256 59.8741 8.341 59.9109 8.4352C59.9478 8.52941 59.9662 8.63284 59.9662 8.7424C59.9662 8.98765 59.8874 9.19808 59.7312 9.36653C59.5771 9.53344 59.3738 9.66247 59.1276 9.749C58.8823 9.83552 58.6176 9.87956 58.3401 9.87956C57.8716 9.87956 57.4518 9.75156 57.0929 9.49914C56.7391 9.25031 56.5 8.89498 56.3822 8.4434L55.0879 8.64C55.1678 9.12743 55.3516 9.55495 55.6342 9.91028C55.9219 10.2723 56.2947 10.5544 56.7411 10.7484C57.1886 10.943 57.6996 11.0418 58.2587 11.0418C58.6519 11.0418 59.0334 10.9916 59.3933 10.8923C59.7522 10.7935 60.0758 10.6429 60.3548 10.4448C60.6334 10.2477 60.8576 9.99629 61.0209 9.69882L61.022 9.69984Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_7",
+											"d": "M67.38 6.22747C67.5479 6.13173 67.7405 6.08309 67.9514 6.08309C68.2939 6.08309 68.5699 6.19777 68.7706 6.42459C68.9708 6.65038 69.0727 6.96629 69.0727 7.36513V10.8309H70.3158V7.04053C70.3158 6.4292 70.1453 5.92897 69.8094 5.55419C69.4741 5.18043 68.9846 4.99048 68.3543 4.99048C67.9734 4.99048 67.6237 5.07547 67.314 5.24289C67.0237 5.40008 66.7856 5.61921 66.6074 5.89365L66.5838 5.93L66.5634 5.89211C66.4226 5.63201 66.2229 5.41953 65.9694 5.26081C65.6832 5.08161 65.3218 4.99048 64.8958 4.99048C64.5082 4.99048 64.1534 5.07649 63.8421 5.24545C63.603 5.37499 63.3987 5.54446 63.2349 5.74824L63.1893 5.80507V5.13435H62.0967V10.8309H63.3506V7.31752C63.3506 6.95451 63.453 6.65499 63.6552 6.42766C63.858 6.19931 64.1309 6.0836 64.4667 6.0836C64.8026 6.0836 65.0903 6.19931 65.2916 6.42766C65.4918 6.65499 65.5931 6.97601 65.5931 7.38101V10.8309H66.8306V7.31752C66.8306 7.06254 66.8803 6.83931 66.9786 6.65345C67.0774 6.46709 67.2126 6.32424 67.3805 6.22798L67.38 6.22747Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_8",
+											"d": "M74.2724 9.3726C74.2796 9.6286 74.3487 9.88358 74.4787 10.1293C74.6257 10.3981 74.8438 10.5978 75.1269 10.7222C75.4126 10.8472 75.7408 10.9153 76.1028 10.924C76.4597 10.9327 76.8293 10.9025 77.2016 10.8344V9.80064C76.8514 9.85081 76.5339 9.86412 76.2585 9.83955C75.9682 9.81395 75.7541 9.68851 75.621 9.46732C75.5509 9.35366 75.513 9.20467 75.5074 9.02547C75.5022 8.84985 75.4992 8.64403 75.4992 8.4126V6.04563H77.2016V5.08204H75.4992V3.13184H74.2617V5.08204H73.209V6.04563H74.2617V8.48787C74.2617 8.81657 74.2652 9.11456 74.2724 9.37312V9.3726Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_9",
+											"d": "M80.8767 4.95543C80.7436 4.95543 80.6141 4.96414 80.4881 4.98052C79.5726 5.12337 79.3033 5.5898 79.3033 5.5898V5.4531H79.3028V3.11377H78.0889V10.8649H79.3028V7.68132C79.3028 6.5923 80.0918 6.09668 80.825 6.09668C81.6176 6.09668 82.0026 6.52267 82.0026 7.39972V10.8649H83.2165V7.23281C83.2165 5.8499 82.298 4.95595 80.8772 4.95595L80.8767 4.95543Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_10",
+											"d": "M72.3934 5.13281H71.1855V10.8775H72.3934V5.13281Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_11",
+											"d": "M71.7889 4.70524C72.2236 4.70524 72.5758 4.35291 72.5758 3.91829C72.5758 3.48368 72.2236 3.13135 71.7889 3.13135C71.3542 3.13135 71.002 3.48368 71.002 3.91829C71.002 4.35291 71.3542 4.70524 71.7889 4.70524Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_12",
+											"d": "M15.5941 10.4208C15.524 10.5375 15.313 10.5452 15.1333 10.4372C15.0412 10.3819 14.97 10.3056 14.9331 10.2226C14.8993 10.1474 14.8988 10.0762 14.9311 10.0224C14.968 9.96099 15.0442 9.92976 15.1344 9.92976C15.2152 9.92976 15.3074 9.95485 15.3924 10.0061C15.5721 10.1141 15.6648 10.304 15.5946 10.4208H15.5941ZM25.9939 7.0001C25.9939 10.5288 23.1226 13.4001 19.5939 13.4001H7.20859C3.67989 13.4001 0.808594 10.5293 0.808594 7.0001C0.808594 3.47088 3.67989 0.600098 7.20859 0.600098H19.5939C23.1231 0.600098 25.9939 3.47139 25.9939 7.0001ZM13.1427 10.2098C13.2435 10.0875 12.7776 9.74288 12.6824 9.61642C12.4888 9.4065 12.4878 9.10442 12.3573 8.85917C12.0378 8.11882 11.6707 7.3841 11.1571 6.75741C10.6144 6.07184 9.94472 5.50455 9.35643 4.86096C8.9197 4.41194 8.80296 3.77245 8.41743 3.28963C7.88597 2.50474 6.20559 2.29072 5.95931 3.3992C5.96034 3.43402 5.94959 3.45603 5.91937 3.47805C5.78318 3.57687 5.66184 3.69002 5.55995 3.82672C5.3106 4.17386 5.2722 4.76266 5.5835 5.07447C5.59374 4.91011 5.59937 4.75498 5.72942 4.63722C5.97007 4.84407 6.33358 4.91677 6.61262 4.76266C7.22907 5.64279 7.07547 6.86032 7.56494 7.80855C7.70011 8.0328 7.8363 8.26167 8.00987 8.45827C8.15067 8.67741 8.63707 8.93597 8.66574 9.13872C8.67086 9.48688 8.6299 9.8673 8.85825 10.1586C8.96577 10.3767 8.70158 10.5959 8.48859 10.5687C8.21211 10.6066 7.8747 10.3829 7.63252 10.5206C7.54702 10.6133 7.3796 10.5109 7.30587 10.6394C7.28027 10.706 7.14203 10.7997 7.22446 10.8637C7.31611 10.794 7.4011 10.7213 7.52449 10.7628C7.50606 10.8631 7.58542 10.8775 7.6484 10.9067C7.64635 10.9748 7.60641 11.0444 7.65864 11.1022C7.71956 11.0408 7.75592 10.9538 7.85268 10.9282C8.17422 11.3567 8.50139 10.4945 9.1972 10.8826C9.05588 10.8759 8.93044 10.8933 8.83521 11.0096C8.81166 11.0357 8.79169 11.0664 8.83316 11.1002C9.20846 10.858 9.20641 11.1831 9.45012 11.0833C9.63752 10.9855 9.82388 10.8631 10.0466 10.898C9.83003 10.9604 9.82132 11.1345 9.69435 11.2814C9.67284 11.304 9.6626 11.3296 9.68769 11.3669C10.1372 11.3291 10.1741 11.1796 10.5371 10.9963C10.8079 10.8309 11.0778 11.2318 11.3123 11.0034C11.364 10.9538 11.4346 10.9707 11.4986 10.964C11.4167 10.5273 10.5161 11.0439 10.5304 10.4581C10.8202 10.261 10.7537 9.88368 10.7731 9.57904C11.1064 9.76387 11.4771 9.87139 11.8038 10.048C11.9687 10.3143 12.2272 10.666 12.5718 10.643C12.581 10.6164 12.5892 10.5928 12.5989 10.5657C12.7034 10.5836 12.8375 10.6527 12.8949 10.5206C13.051 10.6839 13.2804 10.6757 13.4847 10.6338C13.6357 10.5109 13.2005 10.3358 13.1422 10.2093L13.1427 10.2098ZM17.8147 8.14595L17.1296 7.22128C16.5316 7.90531 16.1322 8.23863 16.1251 8.24477C16.1215 8.24835 15.74 8.61955 15.3924 8.93802C15.0514 9.25034 14.7821 9.49763 14.6449 9.76797C14.607 9.84272 14.5246 10.1182 14.6403 10.3936C14.7294 10.6066 14.9111 10.7582 15.1809 10.8442C15.2618 10.8698 15.3392 10.8811 15.4129 10.8811C15.8988 10.8811 16.2177 10.3936 16.2198 10.3895C16.2239 10.3839 16.6371 9.79357 17.1404 9.0481C17.3078 8.80029 17.4993 8.53815 17.8147 8.14544V8.14595ZM21.0357 10.2754C21.0357 10.1392 20.986 10.0076 20.8959 9.9057L20.8109 9.80944C20.2974 9.2273 18.979 7.73277 18.4659 7.15216C17.8218 6.42307 17.1015 5.49379 17.0416 5.41597L16.955 5.23677V4.92138C16.955 4.80567 16.932 4.69251 16.8874 4.58602L16.7041 4.15082C16.7016 4.14467 16.7006 4.13751 16.7016 4.13085L16.7088 4.07043C16.7098 4.06071 16.7144 4.052 16.7221 4.04535C16.8649 3.91939 17.3964 3.51082 18.2192 3.54512C18.3267 3.54973 18.3456 3.49085 18.3487 3.46576C18.3635 3.34493 18.0876 3.20259 17.8305 3.14986C17.4773 3.07767 16.5383 2.88618 15.7872 3.37923L15.7815 3.38333C15.2961 3.78883 14.906 4.09859 14.9019 4.10167L14.8932 4.11037C14.8876 4.11703 14.7504 4.28138 14.7836 4.49079C14.8051 4.62698 14.7345 4.67562 14.7304 4.67818C14.7263 4.68074 14.63 4.74115 14.5307 4.67306C14.4104 4.58295 14.2015 4.73757 14.159 4.77136L13.8436 5.04272L13.8375 5.04887C13.8318 5.05552 13.6967 5.21373 13.8774 5.46768C14.0336 5.68733 14.0888 5.76055 14.2245 5.92951C14.3623 6.10051 14.6106 6.31709 14.6239 6.32835C14.63 6.33347 14.7816 6.44816 14.9905 6.28842C15.162 6.15683 15.2997 6.03805 15.2997 6.03805C15.311 6.02883 15.4103 5.94691 15.4149 5.82608C15.4165 5.79127 15.4149 5.76106 15.4149 5.73341C15.4124 5.64842 15.4119 5.62333 15.4759 5.58237C15.5066 5.58237 15.6008 5.61667 15.6817 5.65763C15.6904 5.66275 15.8926 5.77642 16.0764 5.76823C16.1921 5.78359 16.3201 5.91517 16.3642 5.96893C16.3683 5.97303 16.7594 6.38365 17.3104 7.10403C17.4153 7.24074 17.8008 7.75427 17.9063 7.89763C18.0824 8.13725 18.3492 8.49975 18.6359 8.8904C19.1326 9.56675 19.6896 10.325 19.9425 10.666C20.0265 10.7792 20.1489 10.856 20.2871 10.8826L20.3808 10.9005C20.4167 10.9072 20.4525 10.9108 20.4883 10.9108C20.6542 10.9108 20.8114 10.8381 20.9153 10.709L20.921 10.7019C20.9957 10.6071 21.0367 10.4858 21.0367 10.3609V10.2754H21.0357ZM21.4765 4.20253L21.3674 4.09347C21.3357 4.06173 21.2912 4.04279 21.2461 4.04637C21.201 4.04842 21.1585 4.0689 21.1294 4.10371L20.4433 4.91523C20.4238 4.93827 20.3962 4.95261 20.3665 4.95568L20.1223 4.98026C20.091 4.98333 20.0598 4.9736 20.0357 4.95363L19.6456 4.62339C19.6205 4.60189 19.6056 4.57117 19.6046 4.5384L19.599 4.34282C19.598 4.31466 19.6077 4.28701 19.6256 4.26551L20.2928 3.46167C20.3429 3.40125 20.3424 3.3137 20.2917 3.25328L20.2247 3.17392C20.1806 3.12221 20.1079 3.10327 20.0444 3.12733C19.8867 3.18723 19.4894 3.34237 19.2022 3.49802C18.7962 3.71715 18.5141 4.0648 18.4654 4.40528C18.4296 4.65463 18.4444 5.06576 18.4567 5.28848C18.4613 5.37603 18.4419 5.46359 18.3994 5.54192C18.3472 5.6392 18.255 5.79485 18.1147 5.98224C18.043 6.08106 17.998 6.11741 17.936 6.19063L18.6907 7.07792C18.8725 6.86595 19.0317 6.70519 19.1704 6.55005C19.4239 6.26794 19.5027 6.26538 19.7137 6.25821C19.8437 6.2536 20.0219 6.24797 20.304 6.17731C21.0741 5.9848 21.3178 5.15127 21.328 5.1144L21.5195 4.35715C21.5333 4.30237 21.5169 4.24298 21.477 4.20304L21.4765 4.20253ZM9.63496 9.48842C9.55202 9.812 9.52488 10.3634 9.10402 10.3793C9.0692 10.5662 9.23355 10.6363 9.38255 10.5764C9.53051 10.5083 9.60066 10.6302 9.65032 10.7515C9.87867 10.7848 10.2166 10.6752 10.2294 10.4049C9.8884 10.2083 9.78293 9.83453 9.63445 9.48842H9.63496Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									}
+								]
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "LangsmithIcon"
+}
diff --git a/app/components/base/icons/src/public/tracing/LangsmithIcon.tsx b/app/components/base/icons/src/public/tracing/LangsmithIcon.tsx
new file mode 100644
index 0000000..696442c
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/LangsmithIcon.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LangsmithIcon.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LangsmithIcon'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/tracing/LangsmithIconBig.json b/app/components/base/icons/src/public/tracing/LangsmithIconBig.json
new file mode 100644
index 0000000..18b1761
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/LangsmithIconBig.json
@@ -0,0 +1,188 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "124",
+			"height": "20",
+			"viewBox": "0 0 124 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Clip path group"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "mask",
+						"attributes": {
+							"id": "mask0_20135_18175",
+							"style": "mask-type:luminance",
+							"maskUnits": "userSpaceOnUse",
+							"x": "0",
+							"y": "0",
+							"width": "124",
+							"height": "20"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "a"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector",
+											"d": "M123.825 0.399902H0.200195V19.5999H123.825V0.399902Z",
+											"fill": "white"
+										},
+										"children": []
+									}
+								]
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"mask": "url(#mask0_20135_18175)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"id": "Group"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_2",
+											"d": "M45.54 4.18408V15.827H53.561V14.069H47.361V4.18408H45.54Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_3",
+											"d": "M57.8358 6.94629C56.0878 6.94629 54.7807 7.76575 54.25 9.19423C54.2162 9.28562 54.1141 9.56133 54.1141 9.56133L55.6124 10.5305L55.8159 9.99986C56.1631 9.09515 56.8051 8.67352 57.8358 8.67352C58.8664 8.67352 59.4563 9.17349 59.4455 10.1581C59.4455 10.198 59.4424 10.3186 59.4424 10.3186C59.4424 10.3186 58.0785 10.5398 57.5163 10.6588C55.1178 11.1657 54.1133 12.0811 54.1133 13.5787C54.1133 14.3767 54.5564 15.2407 55.3651 15.7253C55.8505 16.0156 56.4841 16.1254 57.1837 16.1254C57.6438 16.1254 58.0908 16.0571 58.5047 15.9311C59.4455 15.6185 59.7082 15.0041 59.7082 15.0041V15.8075H61.2664V10.0644C61.2664 8.11211 59.9839 6.94629 57.8358 6.94629ZM59.4517 13.0749C59.4517 13.6786 58.7942 14.5288 57.2629 14.5288C56.8305 14.5288 56.524 14.4143 56.3197 14.2438C56.0463 14.0157 55.9565 13.6878 55.9941 13.3983C56.0102 13.2723 56.0863 13.0012 56.3681 12.7662C56.6561 12.5258 57.1653 12.3538 57.9517 12.1825C58.5984 12.042 59.4524 11.8868 59.4524 11.8868V13.0757L59.4517 13.0749Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_4",
+											"d": "M67.0275 6.94657C66.8109 6.94657 66.5997 6.96193 66.3946 6.99034C64.9992 7.20001 64.5906 7.90887 64.5906 7.90887L64.5921 7.20001H62.8457V15.8093H64.6666V11.0339C64.6666 9.41108 65.8501 8.67226 66.9499 8.67226C68.1388 8.67226 68.7163 9.31124 68.7163 10.6268V15.8093H70.5372V10.3765C70.5372 8.25985 69.1925 6.9458 67.0282 6.9458L67.0275 6.94657Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_5",
+											"d": "M78.1373 7.19359V8.08063C78.1373 8.08063 77.6911 6.94629 75.6611 6.94629C73.139 6.94629 71.5723 8.68658 71.5723 11.489C71.5723 13.0703 72.0776 14.3152 72.9693 15.1017C73.6628 15.713 74.589 16.0264 75.6918 16.0479C76.4591 16.0624 76.9559 15.8536 77.2664 15.6562C77.8623 15.2768 78.0835 14.9166 78.0835 14.9166C78.0835 14.9166 78.0582 15.1984 78.0121 15.5801C77.9791 15.8566 77.9169 16.0509 77.9169 16.0509C77.6396 17.0378 76.8285 17.6084 75.6457 17.6084C74.463 17.6084 73.7465 17.2191 73.6044 16.4518L71.8342 16.9802C72.1398 18.4548 73.5238 19.3349 75.5359 19.3349C76.9037 19.3349 77.976 18.9632 78.7233 18.229C79.4767 17.4886 79.8591 16.4219 79.8591 15.0579V7.19282H78.1373V7.19359ZM78.0229 11.5666C78.0229 13.29 77.1811 14.3191 75.7709 14.3191C74.2603 14.3191 73.394 13.2869 73.394 11.4882C73.394 9.68959 74.2603 8.67275 75.7709 8.67275C77.1473 8.67275 78.0098 9.69726 78.0229 11.3469V11.5666Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_6",
+											"d": "M90.532 14.0495C90.7777 13.6033 90.9022 13.0772 90.9022 12.4851C90.9022 11.893 90.7969 11.4383 90.5888 11.0704C90.3807 10.701 90.1119 10.3992 89.7909 10.1727C89.4675 9.94455 89.1258 9.76484 88.7771 9.63735C88.4269 9.50987 88.1051 9.40695 87.8217 9.33246L85.7427 8.75262C85.4801 8.68273 85.2174 8.59441 84.9609 8.48919C84.7021 8.38321 84.4817 8.23652 84.3073 8.05298C84.1292 7.86635 84.0385 7.62367 84.0385 7.32952C84.0385 7.02079 84.1437 6.74661 84.3503 6.51467C84.5554 6.28504 84.8288 6.10687 85.1637 5.98475C85.4962 5.86264 85.8625 5.80351 86.2527 5.80888C86.6536 5.81963 87.0368 5.90181 87.3909 6.05387C87.7464 6.20594 88.0521 6.43019 88.2994 6.7205C88.5398 7.00312 88.7064 7.34719 88.7955 7.74424L90.8054 7.3948C90.6341 6.70667 90.3423 6.10994 89.9368 5.62149C89.5236 5.12383 89.0029 4.73829 88.3885 4.4764C87.7733 4.21375 87.0629 4.07781 86.2765 4.07243C85.5023 4.06706 84.7858 4.19071 84.1522 4.44031C83.5201 4.68914 83.011 5.06853 82.6385 5.56773C82.2668 6.06616 82.0778 6.69131 82.0778 7.42552C82.0778 7.92779 82.1615 8.35403 82.3274 8.69349C82.4933 9.03371 82.7099 9.31634 82.9702 9.53522C83.2321 9.75487 83.5132 9.92843 83.8066 10.0529C84.1023 10.178 84.3811 10.2794 84.636 10.3531L87.6328 11.2394C87.8493 11.3047 88.0429 11.383 88.208 11.4721C88.3747 11.562 88.5129 11.6633 88.6197 11.7732C88.7272 11.8838 88.8101 12.0113 88.8654 12.1526C88.9207 12.2939 88.9484 12.449 88.9484 12.6134C88.9484 12.9812 88.8301 13.2969 88.5958 13.5496C88.3647 13.7999 88.0598 13.9935 87.6904 14.1232C87.3225 14.253 86.9254 14.3191 86.5092 14.3191C85.8065 14.3191 85.1767 14.1271 84.6383 13.7485C84.1077 13.3752 83.749 12.8422 83.5724 12.1648L81.6309 12.4598C81.7507 13.1909 82.0264 13.8322 82.4503 14.3652C82.8819 14.9081 83.441 15.3313 84.1107 15.6224C84.782 15.9142 85.5484 16.0624 86.3871 16.0624C86.9769 16.0624 87.5491 15.9872 88.089 15.8382C88.6273 15.69 89.1127 15.4642 89.5313 15.167C89.9491 14.8713 90.2855 14.4942 90.5304 14.048L90.532 14.0495Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_7",
+											"d": "M100.071 8.84108C100.322 8.69747 100.611 8.62451 100.928 8.62451C101.441 8.62451 101.855 8.79654 102.156 9.13676C102.457 9.47545 102.61 9.94931 102.61 10.5476V15.7462H104.474V10.0607C104.474 9.14368 104.218 8.39334 103.715 7.83116C103.212 7.27052 102.477 6.9856 101.532 6.9856C100.961 6.9856 100.436 7.11308 99.9714 7.36422C99.536 7.6 99.1789 7.9287 98.9116 8.34035L98.8763 8.39488L98.8455 8.33804C98.6343 7.9479 98.3348 7.62918 97.9547 7.3911C97.5253 7.1223 96.9831 6.9856 96.3442 6.9856C95.7628 6.9856 95.2306 7.11462 94.7636 7.36806C94.405 7.56236 94.0985 7.81657 93.8528 8.12224L93.7844 8.20748V7.2014H92.1455V15.7462H94.0263V10.4762C94.0263 9.93164 94.1799 9.48236 94.4833 9.14137C94.7874 8.79884 95.1968 8.62528 95.7006 8.62528C96.2044 8.62528 96.636 8.79884 96.9378 9.14137C97.2381 9.48236 97.3902 9.9639 97.3902 10.5714V15.7462H99.2464V10.4762C99.2464 10.0937 99.3209 9.75884 99.4684 9.48006C99.6166 9.20051 99.8194 8.98624 100.071 8.84185L100.071 8.84108Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_8",
+											"d": "M110.408 13.5589C110.418 13.9429 110.522 14.3254 110.717 14.694C110.938 15.0972 111.265 15.3967 111.689 15.5834C112.118 15.7707 112.61 15.8729 113.153 15.8859C113.689 15.899 114.243 15.8537 114.801 15.7515V14.201C114.276 14.2762 113.8 14.2962 113.387 14.2593C112.951 14.2209 112.63 14.0328 112.431 13.701C112.325 13.5305 112.269 13.307 112.26 13.0382C112.252 12.7748 112.248 12.466 112.248 12.1189V8.56844H114.801V7.12307H112.248V4.19775H110.392V7.12307H108.812V8.56844H110.392V12.2318C110.392 12.7249 110.397 13.1718 110.408 13.5597V13.5589Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_9",
+											"d": "M120.316 6.93339C120.116 6.93339 119.922 6.94645 119.733 6.97103C118.359 7.1853 117.955 7.88495 117.955 7.88495V7.67989H117.955V4.1709H116.134V15.7977H117.955V11.0222C117.955 9.38869 119.138 8.64527 120.238 8.64527C121.427 8.64527 122.004 9.28424 122.004 10.5998V15.7977H123.825V10.3495C123.825 8.27509 122.448 6.93416 120.316 6.93416L120.316 6.93339Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_10",
+											"d": "M107.589 7.19922H105.777V15.8162H107.589V7.19922Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_11",
+											"d": "M106.682 6.55761C107.334 6.55761 107.863 6.02913 107.863 5.37719C107.863 4.72527 107.334 4.19678 106.682 4.19678C106.03 4.19678 105.502 4.72527 105.502 5.37719C105.502 6.02913 106.03 6.55761 106.682 6.55761Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									},
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"id": "Vector_12",
+											"d": "M22.3912 15.1309C22.286 15.306 21.9696 15.3175 21.7 15.1555C21.5618 15.0725 21.455 14.9581 21.3997 14.8337C21.349 14.7208 21.3483 14.614 21.3966 14.5334C21.4519 14.4412 21.5664 14.3944 21.7015 14.3944C21.8229 14.3944 21.9611 14.432 22.0886 14.5088C22.3582 14.6709 22.4972 14.9558 22.392 15.1309H22.3912ZM37.9908 9.9999C37.9908 15.293 33.6839 19.5999 28.3908 19.5999H9.81289C4.51983 19.5999 0.212891 15.2937 0.212891 9.9999C0.212891 4.70608 4.51983 0.399902 9.81289 0.399902H28.3908C33.6846 0.399902 37.9908 4.70685 37.9908 9.9999ZM18.714 14.8145C18.8653 14.6309 18.1664 14.1141 18.0236 13.9244C17.7333 13.6095 17.7317 13.1564 17.5359 12.7885C17.0567 11.678 16.506 10.5759 15.7357 9.63587C14.9216 8.60752 13.9171 7.75657 13.0347 6.7912C12.3795 6.11766 12.2044 5.15843 11.6261 4.43421C10.829 3.25686 8.30838 2.93584 7.93897 4.59856C7.94051 4.65078 7.92438 4.68381 7.87906 4.71683C7.67477 4.86505 7.49276 5.03478 7.33992 5.23984C6.96591 5.76054 6.90831 6.64374 7.37525 7.11145C7.39061 6.86493 7.39906 6.63222 7.59413 6.45558C7.9551 6.76585 8.50037 6.87491 8.91893 6.64374C9.8436 7.96393 9.6132 9.79024 10.3474 11.2126C10.5502 11.549 10.7545 11.8923 11.0148 12.1872C11.226 12.5159 11.9556 12.9037 11.9986 13.2078C12.0063 13.7301 11.9449 14.3007 12.2874 14.7377C12.4487 15.0649 12.0524 15.3936 11.7329 15.3529C11.3182 15.4097 10.8121 15.0741 10.4488 15.2807C10.3205 15.4197 10.0694 15.2661 9.9588 15.4588C9.9204 15.5587 9.71304 15.6992 9.83669 15.7952C9.97416 15.6908 10.1017 15.5817 10.2867 15.6439C10.2591 15.7945 10.3781 15.816 10.4726 15.8597C10.4695 15.9619 10.4096 16.0663 10.488 16.1531C10.5793 16.061 10.6339 15.9304 10.779 15.892C11.2613 16.5348 11.7521 15.2415 12.7958 15.8236C12.5838 15.8137 12.3957 15.8398 12.2528 16.0141C12.2175 16.0533 12.1875 16.0994 12.2497 16.15C12.8127 15.7868 12.8096 16.2745 13.1752 16.1247C13.4563 15.978 13.7358 15.7945 14.0699 15.8467C13.745 15.9404 13.732 16.2015 13.5415 16.4219C13.5093 16.4557 13.4939 16.4941 13.5315 16.5502C14.2058 16.4933 14.2611 16.2691 14.8057 15.9941C15.2119 15.7461 15.6167 16.3474 15.9684 16.0049C16.046 15.9304 16.152 15.9557 16.248 15.9458C16.1251 15.2907 14.7742 16.0656 14.7957 15.187C15.2304 14.8913 15.1305 14.3253 15.1597 13.8683C15.6597 14.1456 16.2157 14.3068 16.7057 14.5718C16.953 14.9712 17.3408 15.4988 17.8577 15.4642C17.8715 15.4243 17.8838 15.389 17.8984 15.3483C18.0551 15.3751 18.2563 15.4788 18.3423 15.2807C18.5765 15.5257 18.9206 15.5134 19.227 15.4504C19.4536 15.2661 18.8008 15.0034 18.7132 14.8137L18.714 14.8145ZM25.722 11.7187L24.6944 10.3317C23.7974 11.3577 23.1984 11.8577 23.1876 11.8669C23.1822 11.8723 22.6101 12.4291 22.0886 12.9068C21.5771 13.3753 21.1731 13.7462 20.9673 14.1517C20.9105 14.2638 20.7868 14.677 20.9604 15.0902C21.094 15.4097 21.3667 15.637 21.7714 15.766C21.8928 15.8044 22.0087 15.8213 22.1193 15.8213C22.8482 15.8213 23.3266 15.0902 23.3297 15.0841C23.3358 15.0756 23.9556 14.1901 24.7106 13.0719C24.9617 12.7002 25.2489 12.307 25.722 11.7179V11.7187ZM30.5535 14.9128C30.5535 14.7085 30.479 14.5111 30.3438 14.3583L30.2163 14.2139C29.446 13.3407 27.4684 11.0989 26.6989 10.228C25.7328 9.13437 24.6522 7.74045 24.5623 7.62371L24.4325 7.35491V6.88182C24.4325 6.70825 24.398 6.53853 24.3312 6.37878L24.0562 5.72598C24.0524 5.71677 24.0508 5.70601 24.0524 5.69603L24.0631 5.60541C24.0647 5.59081 24.0716 5.57776 24.0831 5.56777C24.2974 5.37885 25.0946 4.76598 26.3287 4.81744C26.49 4.82435 26.5184 4.73603 26.523 4.6984C26.5453 4.51715 26.1314 4.30365 25.7458 4.22454C25.2159 4.11625 23.8074 3.82902 22.6807 4.56861L22.6723 4.57475C21.9442 5.18301 21.359 5.64765 21.3529 5.65225L21.3398 5.66531C21.3314 5.67529 21.1255 5.92182 21.1755 6.23593C21.2077 6.44022 21.1017 6.51318 21.0956 6.51702C21.0894 6.52086 20.9451 6.61149 20.7961 6.50934C20.6156 6.37417 20.3022 6.60611 20.2385 6.6568L19.7654 7.06384L19.7562 7.07305C19.7477 7.08304 19.545 7.32035 19.8161 7.70128C20.0503 8.03075 20.1333 8.14057 20.3368 8.39401C20.5434 8.65053 20.9159 8.97539 20.9358 8.99229C20.9451 8.99997 21.1724 9.172 21.4857 8.93238C21.743 8.73501 21.9496 8.55683 21.9496 8.55683C21.9665 8.54301 22.1155 8.42013 22.1224 8.23888C22.1247 8.18665 22.1224 8.14134 22.1224 8.09987C22.1186 7.97238 22.1178 7.93475 22.2138 7.87331C22.2599 7.87331 22.4012 7.92477 22.5225 7.98621C22.5356 7.99389 22.8389 8.16438 23.1147 8.15209C23.2882 8.17513 23.4802 8.37251 23.5463 8.45315C23.5524 8.45929 24.1392 9.07523 24.9655 10.1558C25.123 10.3609 25.7013 11.1312 25.8595 11.3462C26.1237 11.7056 26.5238 12.2494 26.9539 12.8354C27.6988 13.8499 28.5344 14.9873 28.9138 15.4988C29.0398 15.6685 29.2233 15.7837 29.4307 15.8236L29.5712 15.8505C29.625 15.8605 29.6787 15.8659 29.7325 15.8659C29.9813 15.8659 30.2171 15.7568 30.373 15.5633L30.3815 15.5525C30.4936 15.4105 30.555 15.2284 30.555 15.0411V14.9128H30.5535ZM31.2147 5.80355L31.0512 5.63997C31.0035 5.59235 30.9367 5.56393 30.8691 5.56931C30.8016 5.57238 30.7378 5.6031 30.694 5.65533L29.6649 6.87261C29.6357 6.90717 29.5943 6.92867 29.5497 6.93328L29.1834 6.97014C29.1365 6.97475 29.0897 6.96016 29.0536 6.93021L28.4684 6.43485C28.4307 6.40259 28.4085 6.35651 28.4069 6.30736L28.3985 6.01398C28.397 5.97174 28.4115 5.93027 28.4384 5.89801L29.4391 4.69225C29.5144 4.60163 29.5136 4.4703 29.4376 4.37968L29.337 4.26064C29.2709 4.18307 29.1619 4.15465 29.0667 4.19075C28.8301 4.28061 28.2341 4.51331 27.8033 4.74678C27.1943 5.07549 26.7711 5.59696 26.6981 6.10768C26.6444 6.48169 26.6666 7.0984 26.6851 7.43248C26.692 7.56381 26.6628 7.69513 26.5991 7.81264C26.5207 7.95856 26.3825 8.19203 26.1721 8.47312C26.0645 8.62134 25.997 8.67587 25.904 8.78569L27.0361 10.1166C27.3087 9.79869 27.5475 9.55753 27.7557 9.32483C28.1358 8.90166 28.2541 8.89782 28.5705 8.88707C28.7656 8.88016 29.0329 8.87171 29.456 8.76573C30.6111 8.47696 30.9767 7.22665 30.992 7.17136L31.2793 6.03549C31.3 5.95331 31.2754 5.86422 31.2155 5.80432L31.2147 5.80355ZM13.4524 13.7324C13.328 14.2178 13.2873 15.0449 12.656 15.0687C12.6038 15.349 12.8503 15.4542 13.0738 15.3644C13.2958 15.2622 13.401 15.445 13.4755 15.627C13.818 15.677 14.3249 15.5126 14.3441 15.1071C13.8326 14.8122 13.6744 14.2516 13.4517 13.7324H13.4524Z",
+											"fill": "#1C3C3C"
+										},
+										"children": []
+									}
+								]
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "LangsmithIconBig"
+}
diff --git a/app/components/base/icons/src/public/tracing/LangsmithIconBig.tsx b/app/components/base/icons/src/public/tracing/LangsmithIconBig.tsx
new file mode 100644
index 0000000..2e652d5
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/LangsmithIconBig.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LangsmithIconBig.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LangsmithIconBig'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/tracing/OpikIcon.json b/app/components/base/icons/src/public/tracing/OpikIcon.json
new file mode 100644
index 0000000..c9f3ad7
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/OpikIcon.json
@@ -0,0 +1,163 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "47.133904",
+			"height": "16",
+			"viewBox": "0 0 47.133904 16",
+			"fill": "none",
+			"version": "1.1",
+			"id": "svg6",
+			"sodipodi:docname": "opik-icon.svg",
+			"inkscape:version": "1.3.2 (091e20ef0f, 2023-11-25)",
+			"xmlns:inkscape": "http://www.inkscape.org/namespaces/inkscape",
+			"xmlns:sodipodi": "http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd",
+			"xmlns": "http://www.w3.org/2000/svg",
+			"xmlns:svg": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "sodipodi:namedview",
+				"attributes": {
+					"id": "namedview6",
+					"pagecolor": "#b95d5d",
+					"bordercolor": "#666666",
+					"borderopacity": "1.0",
+					"inkscape:showpageshadow": "2",
+					"inkscape:pageopacity": "0.0",
+					"inkscape:pagecheckerboard": "0",
+					"inkscape:deskcolor": "#d1d1d1",
+					"inkscape:zoom": "18.615087",
+					"inkscape:cx": "34.541874",
+					"inkscape:cy": "18.882533",
+					"inkscape:window-width": "2560",
+					"inkscape:window-height": "1371",
+					"inkscape:window-x": "0",
+					"inkscape:window-y": "0",
+					"inkscape:window-maximized": "1",
+					"inkscape:current-layer": "svg6"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"width": "47.119099",
+					"height": "15.98219",
+					"fill": "#ffffff",
+					"id": "rect1",
+					"x": "0",
+					"y": "0",
+					"style": "stroke-width:0.0455515;fill:none",
+					"inkscape:label": "rect1"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M 9.6391824,3.9256084 C 7.4584431,2.9677242 4.8694901,3.9910489 3.8733677,6.2551834 2.8772499,8.519327 3.8730396,11.117275 6.0537561,12.075159 c 0.8795869,0.38635 1.8205107,0.450735 2.6986394,0.243012 0.3780009,-0.08943 0.7570043,0.144295 0.8464576,0.521993 0.089499,0.377699 -0.1443649,0.7564 -0.5224113,0.845827 C 7.9135024,13.961058 6.6590133,13.876457 5.4876434,13.361931 2.568556,12.079712 1.2888532,8.636894 2.5855671,5.6895232 3.8822857,2.7421295 7.286235,1.3566284 10.205295,2.6388372 11.986296,3.4211403 13.15908,5.0124429 13.505682,6.7988966 13.579642,7.1799648 13.330421,7.548739 12.949049,7.6226396 12.567721,7.6964947 12.198606,7.447473 12.124692,7.0664048 11.860478,5.7048679 10.972279,4.5111667 9.6391824,3.9256084 Z m 2.3662996,7.7665706 c 0.136116,0.570532 -0.216457,1.14325 -0.787445,1.279258 -0.570989,0.135962 -1.14421,-0.216283 -1.2802814,-0.786816 -0.1361171,-0.570532 0.2164564,-1.143295 0.7874454,-1.279258 0.570987,-0.136008 1.14421,0.216283 1.280281,0.786816 z m 0.885967,-0.810128 c 0.762836,-0.181679 1.233846,-0.9468664 1.052022,-1.7090479 -0.181824,-0.7622275 -0.947622,-1.2328598 -1.710414,-1.0511819 -0.762838,0.1816779 -1.233846,0.9468196 -1.052023,1.7090471 0.181823,0.7622277 0.947623,1.2328597 1.710415,1.0511827 z",
+					"fill": "url(#paint0_linear_3874_31725)",
+					"id": "path1",
+					"style": "fill:url(#paint0_linear_3874_31725);stroke-width:0.0455515"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "m 20.686606,11.857146 c -0.721642,0 -1.364084,-0.153857 -1.927326,-0.461616 -0.563197,-0.316594 -1.007638,-0.747475 -1.333234,-1.292646 -0.325641,-0.54517 -0.488416,-1.165106 -0.488416,-1.8598076 0,-0.703444 0.162775,-1.32338 0.488416,-1.8598079 0.325596,-0.5451702 0.770037,-0.9716351 1.333234,-1.2794403 0.563242,-0.3077596 1.205684,-0.4616167 1.927326,-0.4616167 0.730437,0 1.377254,0.1538571 1.940495,0.4616167 0.571992,0.3078052 1.016434,0.7298533 1.333234,1.2662813 0.325641,0.5363823 0.488417,1.1606894 0.488417,1.8729669 0,0.6947016 -0.162776,1.3146376 -0.488417,1.8598076 -0.3168,0.545171 -0.761242,0.976052 -1.333234,1.292646 -0.563241,0.307759 -1.210058,0.461616 -1.940495,0.461616 z m 0,-1.411304 c 0.404796,0 0.765617,-0.08797 1.082418,-0.263821 0.316846,-0.17585 0.563242,-0.4308815 0.739232,-0.7650049 0.184831,-0.3341689 0.277246,-0.7254822 0.277246,-1.1739397 0,-0.4572454 -0.09241,-0.8485586 -0.277246,-1.1738941 C 22.332266,6.7350133 22.08587,6.4800268 21.769024,6.3041317 21.452223,6.1282821 21.095822,6.0403572 20.699776,6.0403572 c -0.404796,0 -0.765617,0.087925 -1.082418,0.2637745 -0.308051,0.1758951 -0.554446,0.4308816 -0.739277,0.7650506 -0.184786,0.3253355 -0.277201,0.7166487 -0.277201,1.1738941 0,0.4484575 0.09241,0.8397708 0.277201,1.1739397 0.184831,0.3341234 0.431226,0.5891549 0.739277,0.7650049 0.316801,0.17585 0.673201,0.263821 1.069248,0.263821 z",
+					"fill": "#3a3a3a",
+					"id": "path2",
+					"style": "stroke-width:0.0455515"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "m 29.934026,11.857146 c -0.571992,0 -1.095634,-0.131865 -1.57088,-0.395684 -0.466407,-0.26382 -0.840442,-0.659504 -1.122018,-1.1871 -0.272826,-0.5364272 -0.409217,-1.2135074 -0.409217,-2.0312856 0,-0.826566 0.131971,-1.5036463 0.396002,-2.0312862 0.272826,-0.5275944 0.642442,-0.9189077 1.108848,-1.1738942 0.466406,-0.26382 0.998843,-0.3956845 1.597265,-0.3956845 0.695257,0 1.306893,0.1494859 1.83491,0.4484576 0.536811,0.2989717 0.959243,0.7166486 1.267248,1.253031 0.316801,0.5364279 0.475202,1.169523 0.475202,1.8993763 0,0.7298534 -0.158401,1.3673652 -0.475202,1.9125806 -0.308005,0.536383 -0.730437,0.95406 -1.267248,1.253031 -0.528017,0.298972 -1.139653,0.448458 -1.83491,0.448458 z m -3.142079,2.466539 c -0.422659,0 -0.765298,-0.342319 -0.765298,-0.764641 V 5.4859892 c 0,-0.4223213 0.342639,-0.7646408 0.765298,-0.7646408 h 0.04028 c 0.42266,0 0.765299,0.3423195 0.765299,0.7646408 v 0.8972793 l -0.05281,1.8730126 0.132016,1.8729669 v 3.429796 c 0,0.422322 -0.342639,0.764641 -0.765298,0.764641 z m 2.957293,-3.877843 c 0.396001,0 0.748027,-0.08797 1.056033,-0.263821 0.316801,-0.17585 0.567616,-0.4308815 0.752447,-0.7650049 0.184786,-0.3341689 0.277201,-0.7254822 0.277201,-1.1739397 0,-0.4572454 -0.09241,-0.8485586 -0.277201,-1.1738941 C 31.372889,6.7350133 31.122074,6.4800268 30.805273,6.3041317 30.497267,6.1282821 30.145241,6.0403572 29.74924,6.0403572 c -0.396046,0 -0.752447,0.087925 -1.069248,0.2637745 -0.316846,0.1758951 -0.567662,0.4308816 -0.752447,0.7650506 -0.184831,0.3253355 -0.277201,0.7166487 -0.277201,1.1738941 0,0.4484575 0.09237,0.8397708 0.277201,1.1739397 0.184785,0.3341234 0.435601,0.5891549 0.752447,0.7650049 0.316801,0.17585 0.673202,0.263821 1.069248,0.263821 z",
+					"fill": "#3a3a3a",
+					"id": "path3",
+					"style": "stroke-width:0.0455515"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "m 35.841594,11.76485 c -0.422659,0 -0.765298,-0.342365 -0.765298,-0.764686 V 5.4859892 c 0,-0.4223213 0.342639,-0.7646408 0.765298,-0.7646408 h 0.119484 c 0.422659,0 0.765298,0.3423195 0.765298,0.7646408 v 5.5141748 c 0,0.422321 -0.342639,0.764686 -0.765298,0.764686 z m 0.06635,-8.2042457 c -0.308006,0 -0.563241,-0.096726 -0.765662,-0.2901837 -0.19358,-0.1934528 -0.290371,-0.4264787 -0.290371,-0.6990729 0,-0.2813867 0.0968,-0.5144125 0.290371,-0.6990728 0.202421,-0.1934528 0.457656,-0.2901838 0.765662,-0.2901838 0.308006,0 0.558822,0.092332 0.752448,0.2769928 0.202375,0.1758678 0.303585,0.4001011 0.303585,0.6726954 0,0.2901792 -0.0968,0.536396 -0.290415,0.7386413 -0.19358,0.1934573 -0.448817,0.2901837 -0.765618,0.2901837 z",
+					"fill": "#3a3a3a",
+					"id": "path4",
+					"style": "stroke-width:0.0455515"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "m 40.238571,10.195226 0.0396,-2.0708549 3.479613,-3.2151067 c 0.130739,-0.1208454 0.302264,-0.187916 0.480351,-0.187916 v 0 c 0.629636,0 0.945662,0.7599964 0.501357,1.2058131 l -1.926779,1.9333896 -0.871247,0.7254822 z m -0.581195,1.569624 c -0.42266,0 -0.765253,-0.342365 -0.765253,-0.764686 V 2.7424664 c 0,-0.4223168 0.342593,-0.7646726 0.765253,-0.7646726 h 0.119528 c 0.42266,0 0.765298,0.3423558 0.765298,0.7646726 v 8.2576976 c 0,0.422321 -0.342638,0.764686 -0.765298,0.764686 z m 4.919799,0 c -0.230994,0 -0.449637,-0.104271 -0.594959,-0.283718 l -2.34438,-2.8950987 1.042863,-1.3190088 2.564664,3.2606405 c 0.394542,0.501685 0.03692,1.237185 -0.601702,1.237185 z",
+					"fill": "#3a3a3a",
+					"id": "path5",
+					"style": "stroke-width:0.0455515"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {
+					"id": "defs6"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint0_linear_3874_31725",
+							"x1": "258.13101",
+							"y1": "269.78299",
+							"x2": "88.645203",
+							"y2": "75.4571",
+							"gradientUnits": "userSpaceOnUse",
+							"gradientTransform": "scale(0.04556973,0.04553331)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#FB9341",
+									"id": "stop5"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#E30D3E",
+									"id": "stop6"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "OpikIcon"
+}
diff --git a/app/components/base/icons/src/public/tracing/OpikIcon.tsx b/app/components/base/icons/src/public/tracing/OpikIcon.tsx
new file mode 100644
index 0000000..9f114fb
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/OpikIcon.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './OpikIcon.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'OpikIcon'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/tracing/OpikIconBig.json b/app/components/base/icons/src/public/tracing/OpikIconBig.json
new file mode 100644
index 0000000..44e1e2c
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/OpikIconBig.json
@@ -0,0 +1,162 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "70.700851",
+			"height": "24",
+			"viewBox": "0 0 70.700851 24",
+			"fill": "none",
+			"version": "1.1",
+			"id": "svg6",
+			"sodipodi:docname": "opik-icon-big.svg",
+			"inkscape:version": "1.3.2 (091e20ef0f, 2023-11-25)",
+			"xmlns:inkscape": "http://www.inkscape.org/namespaces/inkscape",
+			"xmlns:sodipodi": "http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd",
+			"xmlns": "http://www.w3.org/2000/svg",
+			"xmlns:svg": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "sodipodi:namedview",
+				"attributes": {
+					"id": "namedview6",
+					"pagecolor": "#ffffff",
+					"bordercolor": "#666666",
+					"borderopacity": "1.0",
+					"inkscape:showpageshadow": "2",
+					"inkscape:pageopacity": "0.0",
+					"inkscape:pagecheckerboard": "0",
+					"inkscape:deskcolor": "#d1d1d1",
+					"inkscape:zoom": "18.615088",
+					"inkscape:cx": "36.314629",
+					"inkscape:cy": "18.989972",
+					"inkscape:window-width": "2560",
+					"inkscape:window-height": "1371",
+					"inkscape:window-x": "0",
+					"inkscape:window-y": "0",
+					"inkscape:window-maximized": "1",
+					"inkscape:current-layer": "svg6"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "rect",
+				"attributes": {
+					"width": "70.700851",
+					"height": "24",
+					"fill": "#ffffff",
+					"id": "rect1",
+					"x": "0",
+					"y": "0",
+					"style": "stroke-width:0.0683761;fill:none"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M 14.463316,5.8949744 C 11.191179,4.456547 7.3065299,5.9932444 5.8118769,9.3932308 4.3172308,12.793231 5.8113846,16.694496 9.0834872,18.132923 c 1.3197948,0.580171 2.7316238,0.676855 4.0492308,0.364923 0.567179,-0.13429 1.135863,0.216684 1.270085,0.783863 0.134291,0.56718 -0.216615,1.135864 -0.783863,1.270154 C 11.873983,20.964923 9.9916581,20.83788 8.2340513,20.065231 3.8540444,18.139761 1.9338872,12.969778 3.8795692,8.5437949 5.8252581,4.1177778 10.932786,2.0372103 15.312752,3.9626667 c 2.672342,1.1747624 4.432069,3.564376 4.952137,6.2470423 0.110974,0.57224 -0.262974,1.126017 -0.835214,1.236992 -0.572171,0.110906 -1.126017,-0.263043 -1.236923,-0.835282 C 17.796308,8.5668376 16.46359,6.7742906 14.463316,5.8949744 Z M 18.01388,17.557812 c 0.20424,0.856752 -0.324786,1.716786 -1.181538,1.921026 -0.856752,0.204171 -1.716855,-0.324787 -1.921026,-1.181539 -0.204239,-0.856752 0.324787,-1.716855 1.181539,-1.921025 0.856752,-0.20424 1.716854,0.324786 1.921025,1.181538 z m 1.329368,-1.216547 c 1.144615,-0.272821 1.85135,-1.42188 1.57853,-2.566427 -0.272821,-1.144616 -1.421881,-1.851351 -2.566428,-1.57853 -1.144615,0.27282 -1.85135,1.421812 -1.578529,2.566427 0.27282,1.144615 1.42188,1.85135 2.566427,1.57853 z",
+					"fill": "url(#paint0_linear_3874_31725)",
+					"id": "path1",
+					"style": "fill:url(#paint0_linear_3874_31725);stroke-width:0.0683761"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "m 31.039658,17.805538 c -1.082803,0 -2.046769,-0.231042 -2.891897,-0.693196 -0.84506,-0.475419 -1.511932,-1.122462 -2.000479,-1.941128 -0.488615,-0.818667 -0.732855,-1.749607 -0.732855,-2.792821 0,-1.056342 0.24424,-1.987282 0.732855,-2.7928204 0.488547,-0.8186666 1.155419,-1.4590769 2.000479,-1.9212991 0.845128,-0.4621538 1.809094,-0.6931966 2.891897,-0.6931966 1.096,0 2.06653,0.2310428 2.911658,0.6931966 0.858257,0.4622222 1.525128,1.096 2.000479,1.9015385 0.488615,0.80547 0.732855,1.742974 0.732855,2.812581 0,1.043214 -0.24424,1.974154 -0.732855,2.792821 -0.475351,0.818666 -1.142222,1.465709 -2.000479,1.941128 -0.845128,0.462154 -1.815658,0.693196 -2.911658,0.693196 z m 0,-2.119316 c 0.607385,0 1.148786,-0.132102 1.624137,-0.396171 0.475419,-0.264068 0.845128,-0.647042 1.109196,-1.148786 0.277334,-0.501812 0.416,-1.089436 0.416,-1.762872 0,-0.686632 -0.138666,-1.274256 -0.416,-1.762803 -0.264068,-0.501812 -0.633777,-0.8847182 -1.109196,-1.148855 -0.475351,-0.2640683 -1.01012,-0.3961025 -1.604376,-0.3961025 -0.607385,0 -1.148787,0.1320342 -1.624137,0.3961025 -0.462222,0.2641368 -0.831932,0.647043 -1.109265,1.148855 -0.277265,0.488547 -0.415932,1.076171 -0.415932,1.762803 0,0.673436 0.138667,1.26106 0.415932,1.762872 0.277333,0.501744 0.647043,0.884718 1.109265,1.148786 0.47535,0.264069 1.01012,0.396171 1.604376,0.396171 z",
+					"fill": "#3a3a3a",
+					"id": "path2",
+					"style": "stroke-width:0.0683761"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "m 44.915145,17.805538 c -0.858256,0 -1.643966,-0.198017 -2.35706,-0.594188 -0.699829,-0.396171 -1.261059,-0.990359 -1.683555,-1.782632 -0.409368,-0.805539 -0.614017,-1.822291 -0.614017,-3.050325 0,-1.241231 0.198017,-2.257983 0.594188,-3.0503246 0.409367,-0.7922735 0.963966,-1.3798975 1.663795,-1.7628034 0.699829,-0.396171 1.498735,-0.5941881 2.396649,-0.5941881 1.043214,0 1.960958,0.2244787 2.753231,0.6734359 0.80547,0.4489573 1.439316,1.076171 1.90147,1.881641 0.475351,0.8055382 0.713026,1.7562392 0.713026,2.8522392 0,1.096 -0.237675,2.053333 -0.713026,2.872069 -0.462154,0.80547 -1.096,1.432683 -1.90147,1.881641 -0.792273,0.448957 -1.710017,0.673435 -2.753231,0.673435 z m -4.714598,3.703932 c -0.634188,0 -1.148308,-0.514051 -1.148308,-1.148239 V 8.2381538 c 0,-0.634188 0.51412,-1.1482393 1.148308,-1.1482393 h 0.06044 c 0.634188,0 1.148308,0.5140513 1.148308,1.1482393 v 1.3474188 l -0.07925,2.8126494 0.198086,2.812581 v 5.150428 c 0,0.634188 -0.51412,1.148239 -1.148308,1.148239 z m 4.437333,-5.823248 c 0.594188,0 1.122394,-0.132102 1.584547,-0.396171 0.475351,-0.264068 0.851693,-0.647042 1.129026,-1.148786 0.277265,-0.501812 0.415932,-1.089436 0.415932,-1.762872 0,-0.686632 -0.138667,-1.274256 -0.415932,-1.762803 C 47.07412,10.113778 46.697778,9.7308718 46.222427,9.466735 45.760274,9.2026667 45.232068,9.0706325 44.63788,9.0706325 c -0.594256,0 -1.129025,0.1320342 -1.604376,0.3961025 -0.475419,0.2641368 -0.85176,0.647043 -1.129025,1.148855 -0.277334,0.488547 -0.415932,1.076171 -0.415932,1.762803 0,0.673436 0.138598,1.26106 0.415932,1.762872 0.277265,0.501744 0.653606,0.884718 1.129025,1.148786 0.475351,0.264069 1.01012,0.396171 1.604376,0.396171 z",
+					"fill": "#3a3a3a",
+					"id": "path3",
+					"style": "stroke-width:0.0683761"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "m 53.779282,17.66694 c -0.634188,0 -1.148308,-0.514119 -1.148308,-1.148308 V 8.2381538 c 0,-0.634188 0.51412,-1.1482393 1.148308,-1.1482393 h 0.179282 c 0.634188,0 1.148308,0.5140513 1.148308,1.1482393 v 8.2804782 c 0,0.634189 -0.51412,1.148308 -1.148308,1.148308 z m 0.09956,-12.3200819 c -0.462154,0 -0.845129,-0.1452513 -1.148855,-0.4357607 -0.290462,-0.2905025 -0.435692,-0.6404307 -0.435692,-1.0497777 0,-0.4225505 0.14523,-0.7724787 0.435692,-1.0497778 0.303726,-0.2905026 0.686701,-0.4357607 1.148855,-0.4357607 0.462153,0 0.838495,0.138653 1.129025,0.4159521 0.303658,0.2640958 0.455522,0.6008205 0.455522,1.0101676 0,0.4357538 -0.145231,0.8054906 -0.435761,1.1091965 -0.290462,0.2905094 -0.673436,0.4357607 -1.148786,0.4357607 z",
+					"fill": "#3a3a3a",
+					"id": "path4",
+					"style": "stroke-width:0.0683761"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "m 60.376821,15.30988 0.05942,-3.109743 5.22106,-4.8280344 c 0.196169,-0.1814701 0.453537,-0.2821881 0.72075,-0.2821881 v 0 c 0.944752,0 1.41894,1.141265 0.752274,1.8107351 l -2.891077,2.9033164 -1.307282,1.089436 z m -0.872069,2.35706 c -0.634188,0 -1.148239,-0.514119 -1.148239,-1.148308 V 4.1182838 c 0,-0.6341812 0.514051,-1.1482872 1.148239,-1.1482872 h 0.179351 c 0.634188,0 1.148307,0.514106 1.148307,1.1482872 V 16.518632 c 0,0.634189 -0.514119,1.148308 -1.148307,1.148308 z m 7.382017,0 c -0.346598,0 -0.674666,-0.156581 -0.892718,-0.426051 l -3.517675,-4.347487 1.564786,-1.980718 3.848206,4.89641 c 0.592,0.753368 0.05538,1.857846 -0.902838,1.857846 z",
+					"fill": "#3a3a3a",
+					"id": "path5",
+					"style": "stroke-width:0.0683761"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {
+					"id": "defs6"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "linearGradient",
+						"attributes": {
+							"id": "paint0_linear_3874_31725",
+							"x1": "258.13101",
+							"y1": "269.78299",
+							"x2": "88.645203",
+							"y2": "75.4571",
+							"gradientUnits": "userSpaceOnUse",
+							"gradientTransform": "scale(0.06837607)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"stop-color": "#FB9341",
+									"id": "stop5"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "stop",
+								"attributes": {
+									"offset": "1",
+									"stop-color": "#E30D3E",
+									"id": "stop6"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "OpikIconBig"
+}
diff --git a/app/components/base/icons/src/public/tracing/OpikIconBig.tsx b/app/components/base/icons/src/public/tracing/OpikIconBig.tsx
new file mode 100644
index 0000000..643312b
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/OpikIconBig.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './OpikIconBig.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'OpikIconBig'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/tracing/TracingIcon.json b/app/components/base/icons/src/public/tracing/TracingIcon.json
new file mode 100644
index 0000000..2157a08
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/TracingIcon.json
@@ -0,0 +1,47 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "20",
+			"height": "20",
+			"viewBox": "0 0 20 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "analytics-fill"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"opacity": "0.6",
+							"d": "M5 2.5C3.61929 2.5 2.5 3.61929 2.5 5V9.16667H6.15164C6.78293 9.16667 7.36003 9.52333 7.64235 10.088L8.33333 11.4699L10.9213 6.29399C11.0625 6.01167 11.351 5.83333 11.6667 5.83333C11.9823 5.83333 12.2708 6.01167 12.412 6.29399L13.8483 9.16667H17.5V5C17.5 3.61929 16.3807 2.5 15 2.5H5Z",
+							"fill": "white"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M2.5 14.9999C2.5 16.3807 3.61929 17.4999 5 17.4999H15C16.3807 17.4999 17.5 16.3807 17.5 14.9999V10.8333H13.8483C13.2171 10.8333 12.64 10.4766 12.3577 9.91195L11.6667 8.53003L9.07867 13.7059C8.9375 13.9883 8.649 14.1666 8.33333 14.1666C8.01769 14.1666 7.72913 13.9883 7.58798 13.7059L6.15164 10.8333H2.5V14.9999Z",
+							"fill": "white"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "TracingIcon"
+}
diff --git a/app/components/base/icons/src/public/tracing/TracingIcon.tsx b/app/components/base/icons/src/public/tracing/TracingIcon.tsx
new file mode 100644
index 0000000..1f1e8d3
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/TracingIcon.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './TracingIcon.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'TracingIcon'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/tracing/WeaveIcon.json b/app/components/base/icons/src/public/tracing/WeaveIcon.json
new file mode 100644
index 0000000..1a96e70
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/WeaveIcon.json
@@ -0,0 +1,279 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"xmlns": "http://www.w3.org/2000/svg",
+			"xmlns:xlink": "http://www.w3.org/1999/xlink",
+			"width": "120px",
+			"height": "16px",
+			"viewBox": "0 0 120 16",
+			"version": "1.1"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "surface1"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 20.847656 3.292969 C 20.875 3.292969 20.902344 3.292969 20.933594 3.292969 C 20.949219 3.292969 20.964844 3.292969 20.980469 3.292969 C 21.035156 3.292969 21.089844 3.292969 21.140625 3.292969 C 21.179688 3.292969 21.21875 3.292969 21.253906 3.292969 C 21.359375 3.292969 21.464844 3.292969 21.566406 3.292969 C 21.675781 3.292969 21.78125 3.292969 21.890625 3.292969 C 22.097656 3.292969 22.300781 3.292969 22.507812 3.292969 C 22.738281 3.292969 22.972656 3.292969 23.207031 3.296875 C 23.6875 3.296875 24.167969 3.296875 24.648438 3.296875 C 24.648438 3.519531 24.648438 3.742188 24.648438 3.96875 C 24.113281 4.042969 24.113281 4.042969 23.566406 4.113281 C 23.667969 4.496094 23.769531 4.882812 23.867188 5.265625 C 23.878906 5.308594 23.878906 5.308594 23.890625 5.351562 C 24.128906 6.269531 24.371094 7.183594 24.609375 8.097656 C 24.675781 8.339844 24.738281 8.582031 24.800781 8.824219 C 24.816406 8.878906 24.832031 8.933594 24.84375 8.992188 C 24.867188 9.078125 24.890625 9.167969 24.914062 9.257812 C 24.921875 9.289062 24.933594 9.320312 24.941406 9.355469 C 24.953125 9.398438 24.964844 9.441406 24.976562 9.484375 C 24.984375 9.523438 24.984375 9.523438 24.996094 9.558594 C 25.007812 9.625 25.007812 9.625 25.007812 9.71875 C 25.023438 9.71875 25.039062 9.71875 25.054688 9.71875 C 25.058594 9.707031 25.058594 9.695312 25.0625 9.679688 C 25.097656 9.492188 25.152344 9.3125 25.210938 9.128906 C 25.222656 9.097656 25.234375 9.0625 25.246094 9.027344 C 25.269531 8.953125 25.292969 8.882812 25.316406 8.808594 C 25.355469 8.691406 25.390625 8.574219 25.429688 8.457031 C 25.464844 8.339844 25.503906 8.21875 25.542969 8.097656 C 25.660156 7.738281 25.773438 7.375 25.890625 7.011719 C 25.902344 6.96875 25.917969 6.921875 25.933594 6.875 C 26.226562 5.945312 26.519531 5.019531 26.808594 4.089844 C 26.785156 4.089844 26.765625 4.089844 26.742188 4.085938 C 26.507812 4.074219 26.273438 4.046875 26.042969 4.015625 C 26.007812 4.011719 25.972656 4.007812 25.933594 4.003906 C 25.851562 3.992188 25.765625 3.980469 25.679688 3.96875 C 25.679688 3.746094 25.679688 3.523438 25.679688 3.296875 C 26.175781 3.296875 26.667969 3.296875 27.160156 3.296875 C 27.390625 3.292969 27.621094 3.292969 27.851562 3.292969 C 28.050781 3.292969 28.25 3.292969 28.449219 3.292969 C 28.554688 3.292969 28.660156 3.292969 28.765625 3.292969 C 28.867188 3.292969 28.964844 3.292969 29.066406 3.292969 C 29.101562 3.292969 29.140625 3.292969 29.175781 3.292969 C 29.226562 3.292969 29.273438 3.292969 29.324219 3.292969 C 29.367188 3.292969 29.367188 3.292969 29.410156 3.292969 C 29.472656 3.296875 29.472656 3.296875 29.496094 3.320312 C 29.5 3.367188 29.5 3.417969 29.5 3.464844 C 29.5 3.492188 29.5 3.515625 29.5 3.542969 C 29.496094 3.59375 29.496094 3.59375 29.496094 3.648438 C 29.496094 3.753906 29.496094 3.859375 29.496094 3.96875 C 29.09375 4.015625 28.6875 4.066406 28.273438 4.113281 C 28.679688 5.460938 28.679688 5.460938 29.089844 6.808594 C 29.105469 6.859375 29.121094 6.910156 29.136719 6.960938 C 29.234375 7.292969 29.335938 7.625 29.4375 7.960938 C 29.484375 8.113281 29.53125 8.265625 29.578125 8.417969 C 29.605469 8.507812 29.632812 8.597656 29.660156 8.691406 C 29.878906 9.40625 29.878906 9.40625 29.976562 9.746094 C 30.027344 9.664062 30.046875 9.601562 30.070312 9.507812 C 30.078125 9.484375 30.078125 9.484375 30.085938 9.457031 C 30.101562 9.402344 30.117188 9.34375 30.132812 9.289062 C 30.144531 9.25 30.152344 9.207031 30.164062 9.167969 C 30.1875 9.082031 30.214844 8.992188 30.238281 8.90625 C 30.292969 8.691406 30.351562 8.480469 30.410156 8.269531 C 30.433594 8.191406 30.453125 8.117188 30.472656 8.042969 C 30.621094 7.5 30.769531 6.960938 30.921875 6.421875 C 30.949219 6.324219 30.976562 6.226562 31 6.128906 C 31.066406 5.902344 31.128906 5.675781 31.191406 5.449219 C 31.230469 5.308594 31.269531 5.164062 31.308594 5.023438 C 31.335938 4.925781 31.363281 4.828125 31.390625 4.734375 C 31.402344 4.6875 31.414062 4.640625 31.429688 4.59375 C 31.445312 4.53125 31.464844 4.46875 31.480469 4.40625 C 31.488281 4.386719 31.492188 4.367188 31.496094 4.347656 C 31.515625 4.277344 31.535156 4.207031 31.558594 4.136719 C 31.210938 4.074219 30.855469 4.023438 30.503906 3.96875 C 30.503906 3.746094 30.503906 3.523438 30.503906 3.296875 C 30.878906 3.296875 31.253906 3.296875 31.628906 3.296875 C 31.804688 3.292969 31.976562 3.292969 32.152344 3.292969 C 32.304688 3.292969 32.457031 3.292969 32.605469 3.292969 C 32.6875 3.292969 32.769531 3.292969 32.847656 3.292969 C 32.9375 3.292969 33.027344 3.292969 33.117188 3.292969 C 33.144531 3.292969 33.171875 3.292969 33.199219 3.292969 C 33.222656 3.292969 33.246094 3.292969 33.273438 3.292969 C 33.304688 3.292969 33.304688 3.292969 33.335938 3.292969 C 33.382812 3.296875 33.382812 3.296875 33.40625 3.320312 C 33.410156 3.367188 33.410156 3.414062 33.410156 3.460938 C 33.410156 3.488281 33.410156 3.515625 33.410156 3.542969 C 33.410156 3.574219 33.410156 3.605469 33.410156 3.632812 C 33.410156 3.664062 33.410156 3.695312 33.410156 3.726562 C 33.410156 3.796875 33.410156 3.871094 33.40625 3.945312 C 33.292969 3.964844 33.175781 3.984375 33.0625 4.007812 C 33.023438 4.011719 32.984375 4.019531 32.945312 4.027344 C 32.738281 4.0625 32.535156 4.097656 32.328125 4.113281 C 32.320312 4.144531 32.320312 4.144531 32.3125 4.179688 C 32.238281 4.480469 32.15625 4.78125 32.070312 5.082031 C 32.058594 5.128906 32.042969 5.171875 32.03125 5.21875 C 31.875 5.78125 31.714844 6.347656 31.550781 6.910156 C 31.375 7.535156 31.195312 8.160156 31.019531 8.785156 C 30.992188 8.871094 30.96875 8.957031 30.945312 9.042969 C 30.835938 9.433594 30.722656 9.820312 30.613281 10.210938 C 30.566406 10.378906 30.519531 10.542969 30.472656 10.707031 C 30.445312 10.804688 30.417969 10.902344 30.390625 11 C 30.277344 11.390625 30.167969 11.785156 30.046875 12.175781 C 29.730469 12.175781 29.414062 12.175781 29.089844 12.175781 C 29.03125 12.003906 29.03125 12.003906 28.976562 11.832031 C 28.925781 11.675781 28.878906 11.523438 28.828125 11.367188 C 28.820312 11.347656 28.8125 11.328125 28.808594 11.304688 C 28.632812 10.769531 28.460938 10.230469 28.285156 9.695312 C 28.144531 9.273438 28.007812 8.847656 27.875 8.425781 C 27.695312 7.867188 27.515625 7.308594 27.332031 6.753906 C 27.304688 6.679688 27.28125 6.605469 27.257812 6.53125 C 27.238281 6.476562 27.222656 6.425781 27.207031 6.375 C 27.046875 5.894531 27.046875 5.894531 27.046875 5.796875 C 27.03125 5.796875 27.015625 5.796875 27 5.796875 C 26.996094 5.8125 26.996094 5.828125 26.992188 5.84375 C 26.964844 5.988281 26.925781 6.132812 26.882812 6.273438 C 26.875 6.296875 26.867188 6.316406 26.859375 6.339844 C 26.84375 6.390625 26.828125 6.4375 26.8125 6.488281 C 26.769531 6.625 26.726562 6.761719 26.683594 6.898438 C 26.675781 6.929688 26.664062 6.957031 26.65625 6.988281 C 26.546875 7.328125 26.445312 7.667969 26.339844 8.007812 C 26.316406 8.078125 26.296875 8.144531 26.273438 8.214844 C 26.230469 8.355469 26.1875 8.496094 26.144531 8.636719 C 26.074219 8.863281 26.007812 9.089844 25.9375 9.3125 C 25.933594 9.328125 25.925781 9.347656 25.921875 9.363281 C 25.894531 9.449219 25.871094 9.535156 25.84375 9.617188 C 25.796875 9.769531 25.75 9.921875 25.703125 10.074219 C 25.675781 10.15625 25.652344 10.242188 25.625 10.328125 C 25.613281 10.363281 25.605469 10.394531 25.59375 10.429688 C 25.414062 11.011719 25.234375 11.59375 25.054688 12.175781 C 24.738281 12.175781 24.421875 12.175781 24.097656 12.175781 C 23.816406 11.230469 23.535156 10.285156 23.261719 9.339844 C 23.253906 9.320312 23.25 9.304688 23.246094 9.285156 C 23.195312 9.117188 23.144531 8.949219 23.097656 8.78125 C 22.960938 8.3125 22.824219 7.84375 22.6875 7.375 C 22.664062 7.304688 22.644531 7.234375 22.625 7.164062 C 22.414062 6.449219 22.207031 5.738281 22 5.027344 C 21.976562 4.953125 21.953125 4.878906 21.933594 4.804688 C 21.898438 4.683594 21.859375 4.5625 21.824219 4.441406 C 21.820312 4.421875 21.8125 4.402344 21.808594 4.382812 C 21.796875 4.347656 21.785156 4.3125 21.777344 4.28125 C 21.753906 4.203125 21.742188 4.148438 21.742188 4.066406 C 21.726562 4.066406 21.710938 4.0625 21.691406 4.0625 C 21.382812 4.042969 21.070312 4.003906 20.761719 3.96875 C 20.757812 3.863281 20.757812 3.753906 20.757812 3.648438 C 20.757812 3.617188 20.757812 3.585938 20.757812 3.554688 C 20.757812 3.523438 20.757812 3.496094 20.757812 3.464844 C 20.757812 3.4375 20.757812 3.410156 20.757812 3.382812 C 20.761719 3.296875 20.761719 3.296875 20.847656 3.292969 Z M 20.847656 3.292969 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 82.488281 3.25 C 83.046875 3.246094 83.605469 3.246094 84.167969 3.246094 C 84.425781 3.246094 84.6875 3.246094 84.945312 3.246094 C 85.171875 3.242188 85.398438 3.242188 85.625 3.242188 C 85.746094 3.242188 85.867188 3.242188 85.984375 3.242188 C 88.15625 3.238281 88.15625 3.238281 88.894531 3.898438 C 88.914062 3.914062 88.9375 3.929688 88.957031 3.945312 C 89.191406 4.144531 89.363281 4.402344 89.472656 4.691406 C 89.480469 4.714844 89.492188 4.742188 89.5 4.765625 C 89.65625 5.25 89.601562 5.785156 89.382812 6.234375 C 89.117188 6.753906 88.695312 7.078125 88.152344 7.265625 C 87.984375 7.320312 87.816406 7.367188 87.648438 7.410156 C 87.664062 7.414062 87.679688 7.417969 87.699219 7.421875 C 88.523438 7.605469 89.300781 7.851562 89.78125 8.597656 C 90.0625 9.0625 90.125 9.636719 90.003906 10.164062 C 89.808594 10.804688 89.363281 11.304688 88.78125 11.621094 C 88.324219 11.863281 87.820312 11.988281 87.3125 12.054688 C 87.28125 12.058594 87.253906 12.0625 87.222656 12.066406 C 86.777344 12.121094 86.332031 12.109375 85.882812 12.105469 C 85.765625 12.105469 85.644531 12.105469 85.523438 12.105469 C 85.300781 12.105469 85.074219 12.105469 84.847656 12.105469 C 84.589844 12.105469 84.332031 12.105469 84.074219 12.105469 C 83.546875 12.105469 83.015625 12.101562 82.488281 12.101562 C 82.488281 11.878906 82.488281 11.65625 82.488281 11.429688 C 82.859375 11.390625 83.234375 11.347656 83.617188 11.308594 C 83.617188 8.910156 83.617188 6.511719 83.617188 4.042969 C 83.488281 4.035156 83.363281 4.027344 83.230469 4.019531 C 83.117188 4.007812 83.003906 3.996094 82.890625 3.980469 C 82.863281 3.980469 82.832031 3.976562 82.804688 3.972656 C 82.695312 3.960938 82.59375 3.949219 82.488281 3.921875 C 82.488281 3.699219 82.488281 3.476562 82.488281 3.25 Z M 85.390625 3.96875 C 85.390625 4.242188 85.386719 4.515625 85.382812 4.785156 C 85.382812 4.914062 85.378906 5.039062 85.378906 5.164062 C 85.371094 5.824219 85.367188 6.484375 85.367188 7.144531 C 86.488281 7.183594 86.488281 7.183594 87.457031 6.691406 C 87.796875 6.320312 87.859375 5.832031 87.847656 5.351562 C 87.832031 4.992188 87.71875 4.644531 87.460938 4.378906 C 87 3.96875 86.363281 3.964844 85.78125 3.96875 C 85.742188 3.96875 85.703125 3.96875 85.667969 3.96875 C 85.574219 3.96875 85.484375 3.96875 85.390625 3.96875 Z M 85.390625 7.84375 C 85.390625 9.003906 85.390625 10.160156 85.390625 11.355469 C 86.28125 11.386719 86.28125 11.386719 87.152344 11.21875 C 87.171875 11.214844 87.1875 11.207031 87.207031 11.199219 C 87.578125 11.066406 87.886719 10.824219 88.066406 10.46875 C 88.28125 9.988281 88.289062 9.417969 88.125 8.921875 C 87.960938 8.492188 87.664062 8.234375 87.257812 8.046875 C 86.664062 7.804688 86.023438 7.84375 85.390625 7.84375 Z M 85.390625 7.84375 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 76.167969 3.476562 C 76.367188 3.671875 76.507812 3.917969 76.585938 4.1875 C 76.589844 4.203125 76.59375 4.222656 76.601562 4.242188 C 76.707031 4.675781 76.621094 5.144531 76.414062 5.53125 C 76.34375 5.644531 76.265625 5.746094 76.175781 5.847656 C 76.15625 5.867188 76.136719 5.886719 76.117188 5.910156 C 75.71875 6.332031 75.199219 6.617188 74.6875 6.882812 C 74.707031 6.902344 74.726562 6.921875 74.746094 6.941406 C 74.972656 7.191406 74.972656 7.191406 75.066406 7.296875 C 75.140625 7.382812 75.21875 7.464844 75.300781 7.542969 C 75.351562 7.59375 75.394531 7.640625 75.4375 7.695312 C 75.527344 7.796875 75.621094 7.894531 75.714844 7.992188 C 76.089844 8.394531 76.089844 8.394531 76.253906 8.585938 C 76.351562 8.695312 76.449219 8.800781 76.546875 8.90625 C 76.621094 8.980469 76.691406 9.058594 76.761719 9.136719 C 76.773438 9.152344 76.789062 9.164062 76.800781 9.179688 C 76.824219 9.207031 76.851562 9.234375 76.875 9.261719 C 76.933594 9.324219 76.992188 9.382812 77.0625 9.429688 C 77.070312 9.410156 77.070312 9.410156 77.082031 9.386719 C 77.113281 9.304688 77.152344 9.230469 77.195312 9.15625 C 77.5625 8.476562 77.800781 7.753906 77.976562 7 C 77.953125 7 77.933594 6.996094 77.910156 6.996094 C 77.707031 6.96875 77.5 6.9375 77.296875 6.902344 C 77.273438 6.898438 77.25 6.894531 77.222656 6.890625 C 77.050781 6.859375 77.050781 6.859375 76.96875 6.832031 C 76.960938 6.328125 76.960938 6.328125 77.015625 6.160156 C 77.949219 6.160156 78.886719 6.160156 79.847656 6.160156 C 79.847656 6.367188 79.847656 6.574219 79.847656 6.785156 C 79.53125 6.839844 79.214844 6.894531 78.886719 6.953125 C 78.859375 7.046875 78.832031 7.140625 78.804688 7.234375 C 78.539062 8.09375 78.164062 9.035156 77.601562 9.746094 C 77.5625 9.792969 77.5625 9.792969 77.566406 9.851562 C 77.601562 9.933594 77.648438 9.980469 77.714844 10.039062 C 77.792969 10.113281 77.867188 10.1875 77.9375 10.269531 C 78.027344 10.375 78.125 10.46875 78.222656 10.566406 C 78.308594 10.65625 78.390625 10.742188 78.472656 10.839844 C 78.539062 10.914062 78.601562 10.933594 78.695312 10.949219 C 78.71875 10.953125 78.746094 10.957031 78.769531 10.960938 C 78.796875 10.964844 78.824219 10.96875 78.851562 10.972656 C 78.875 10.980469 78.902344 10.984375 78.933594 10.988281 C 79.019531 11.003906 79.105469 11.019531 79.191406 11.03125 C 79.277344 11.046875 79.363281 11.0625 79.449219 11.078125 C 79.503906 11.085938 79.558594 11.097656 79.613281 11.105469 C 79.648438 11.113281 79.648438 11.113281 79.6875 11.117188 C 79.707031 11.121094 79.730469 11.125 79.75 11.128906 C 79.800781 11.140625 79.800781 11.140625 79.824219 11.164062 C 79.820312 11.421875 79.785156 11.679688 79.753906 11.933594 C 79.691406 11.949219 79.632812 11.964844 79.570312 11.980469 C 79.546875 11.984375 79.546875 11.984375 79.519531 11.992188 C 79.214844 12.066406 78.910156 12.085938 78.597656 12.085938 C 78.539062 12.085938 78.484375 12.085938 78.425781 12.085938 C 77.847656 12.089844 77.332031 11.917969 76.894531 11.523438 C 76.855469 11.484375 76.816406 11.445312 76.777344 11.40625 C 76.71875 11.347656 76.660156 11.296875 76.601562 11.242188 C 76.578125 11.21875 76.578125 11.21875 76.554688 11.195312 C 76.515625 11.160156 76.476562 11.125 76.441406 11.089844 C 76.429688 11.101562 76.417969 11.109375 76.410156 11.117188 C 76.140625 11.351562 75.859375 11.554688 75.542969 11.71875 C 75.511719 11.738281 75.476562 11.757812 75.445312 11.777344 C 75.3125 11.847656 75.179688 11.894531 75.039062 11.9375 C 75.011719 11.945312 75.011719 11.945312 74.984375 11.953125 C 74.632812 12.058594 74.269531 12.089844 73.90625 12.085938 C 73.84375 12.085938 73.785156 12.085938 73.722656 12.089844 C 72.941406 12.089844 72.222656 11.824219 71.652344 11.28125 C 71.203125 10.820312 71.023438 10.246094 71.03125 9.609375 C 71.042969 9.058594 71.230469 8.546875 71.59375 8.132812 C 71.609375 8.113281 71.625 8.09375 71.644531 8.070312 C 71.980469 7.683594 72.398438 7.421875 72.839844 7.171875 C 72.871094 7.152344 72.902344 7.132812 72.9375 7.113281 C 72.960938 7.101562 72.984375 7.085938 73.007812 7.074219 C 72.996094 7.0625 72.988281 7.050781 72.976562 7.042969 C 72.398438 6.425781 72.09375 5.613281 72.113281 4.773438 C 72.128906 4.371094 72.257812 3.988281 72.527344 3.679688 C 72.542969 3.660156 72.558594 3.644531 72.570312 3.625 C 72.917969 3.210938 73.496094 2.996094 74.015625 2.933594 C 74.050781 2.929688 74.050781 2.929688 74.082031 2.925781 C 74.804688 2.847656 75.621094 2.964844 76.167969 3.476562 Z M 73.671875 3.796875 C 73.433594 4.113281 73.414062 4.4375 73.457031 4.820312 C 73.550781 5.460938 73.921875 5.9375 74.328125 6.425781 C 74.398438 6.390625 74.449219 6.355469 74.503906 6.300781 C 74.527344 6.28125 74.527344 6.28125 74.550781 6.257812 C 74.566406 6.242188 74.582031 6.226562 74.597656 6.210938 C 74.613281 6.191406 74.628906 6.175781 74.644531 6.160156 C 74.773438 6.03125 74.890625 5.894531 75 5.75 C 75.019531 5.726562 75.035156 5.699219 75.054688 5.675781 C 75.335938 5.292969 75.5 4.859375 75.457031 4.378906 C 75.40625 4.078125 75.289062 3.820312 75.035156 3.636719 C 74.59375 3.363281 74.03125 3.410156 73.671875 3.796875 Z M 73.046875 7.828125 C 72.664062 8.226562 72.519531 8.789062 72.519531 9.332031 C 72.53125 9.800781 72.71875 10.257812 73.039062 10.601562 C 73.46875 10.996094 73.980469 11.140625 74.550781 11.125 C 74.960938 11.105469 75.339844 11.003906 75.703125 10.8125 C 75.71875 10.804688 75.738281 10.796875 75.753906 10.785156 C 75.84375 10.738281 75.90625 10.699219 75.960938 10.609375 C 75.949219 10.601562 75.941406 10.589844 75.933594 10.582031 C 75.460938 10.074219 75.460938 10.074219 75.25 9.8125 C 75.1875 9.738281 75.125 9.664062 75.0625 9.59375 C 74.972656 9.484375 74.882812 9.375 74.796875 9.265625 C 74.695312 9.132812 74.589844 9.003906 74.480469 8.878906 C 74.390625 8.773438 74.304688 8.667969 74.214844 8.5625 C 74.152344 8.484375 74.085938 8.40625 74.019531 8.328125 C 73.921875 8.214844 73.828125 8.101562 73.734375 7.984375 C 73.726562 7.96875 73.714844 7.957031 73.703125 7.941406 C 73.683594 7.914062 73.660156 7.886719 73.640625 7.859375 C 73.589844 7.792969 73.539062 7.730469 73.488281 7.667969 C 73.460938 7.632812 73.460938 7.632812 73.433594 7.601562 C 73.414062 7.578125 73.414062 7.578125 73.390625 7.554688 C 73.265625 7.554688 73.132812 7.742188 73.046875 7.828125 Z M 73.046875 7.828125 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 49.992188 5.535156 C 50.101562 5.609375 50.101562 5.609375 50.136719 5.679688 C 50.136719 5.746094 50.140625 5.8125 50.140625 5.882812 C 50.140625 5.914062 50.140625 5.914062 50.140625 5.941406 C 50.140625 5.984375 50.140625 6.027344 50.140625 6.070312 C 50.140625 6.136719 50.140625 6.203125 50.140625 6.269531 C 50.140625 6.308594 50.140625 6.351562 50.140625 6.390625 C 50.140625 6.410156 50.140625 6.429688 50.140625 6.453125 C 50.140625 6.589844 50.140625 6.589844 50.113281 6.617188 C 50.074219 6.617188 50.035156 6.621094 49.996094 6.621094 C 49.972656 6.621094 49.949219 6.621094 49.921875 6.621094 C 49.894531 6.621094 49.871094 6.617188 49.84375 6.617188 C 49.816406 6.617188 49.789062 6.617188 49.757812 6.617188 C 49.671875 6.617188 49.585938 6.617188 49.5 6.617188 C 49.441406 6.617188 49.378906 6.617188 49.320312 6.617188 C 49.175781 6.617188 49.03125 6.617188 48.886719 6.617188 C 48.898438 6.640625 48.90625 6.660156 48.917969 6.683594 C 48.929688 6.714844 48.945312 6.746094 48.957031 6.773438 C 48.964844 6.789062 48.96875 6.804688 48.976562 6.820312 C 49.203125 7.339844 49.195312 8 48.988281 8.523438 C 48.75 9.0625 48.355469 9.457031 47.804688 9.671875 C 47.066406 9.941406 46.210938 9.941406 45.457031 9.746094 C 45.277344 10.003906 45.214844 10.273438 45.238281 10.585938 C 45.269531 10.699219 45.316406 10.761719 45.402344 10.835938 C 45.617188 10.945312 45.851562 10.949219 46.089844 10.949219 C 46.113281 10.953125 46.132812 10.953125 46.15625 10.953125 C 46.203125 10.953125 46.25 10.953125 46.292969 10.953125 C 46.367188 10.953125 46.441406 10.953125 46.515625 10.953125 C 46.726562 10.953125 46.9375 10.957031 47.144531 10.957031 C 47.273438 10.957031 47.402344 10.957031 47.53125 10.960938 C 47.582031 10.960938 47.628906 10.960938 47.675781 10.960938 C 48.324219 10.960938 49.039062 11.019531 49.53125 11.492188 C 49.546875 11.511719 49.566406 11.53125 49.585938 11.550781 C 49.601562 11.566406 49.617188 11.582031 49.636719 11.597656 C 49.957031 11.929688 50.0625 12.394531 50.066406 12.84375 C 50.054688 13.351562 49.847656 13.800781 49.511719 14.171875 C 49.496094 14.191406 49.480469 14.207031 49.460938 14.226562 C 48.8125 14.921875 47.769531 15.179688 46.855469 15.210938 C 45.890625 15.234375 44.761719 15.230469 44.015625 14.523438 C 43.738281 14.222656 43.660156 13.886719 43.671875 13.488281 C 43.679688 13.363281 43.699219 13.253906 43.753906 13.136719 C 43.761719 13.117188 43.769531 13.09375 43.78125 13.074219 C 43.996094 12.644531 44.386719 12.410156 44.785156 12.175781 C 44.765625 12.167969 44.746094 12.160156 44.730469 12.152344 C 44.398438 11.996094 44.222656 11.808594 44.089844 11.476562 C 43.988281 11.136719 44.070312 10.757812 44.222656 10.453125 C 44.421875 10.109375 44.695312 9.824219 44.976562 9.550781 C 44.960938 9.542969 44.945312 9.53125 44.925781 9.523438 C 44.757812 9.417969 44.613281 9.304688 44.472656 9.167969 C 44.457031 9.152344 44.441406 9.136719 44.425781 9.121094 C 44.214844 8.902344 44.085938 8.597656 44.015625 8.300781 C 44.011719 8.28125 44.003906 8.257812 44 8.238281 C 43.882812 7.675781 43.964844 7.042969 44.277344 6.558594 C 44.621094 6.070312 45.09375 5.773438 45.671875 5.628906 C 45.6875 5.625 45.703125 5.621094 45.71875 5.617188 C 46.25 5.492188 46.917969 5.496094 47.449219 5.628906 C 47.464844 5.632812 47.480469 5.636719 47.496094 5.640625 C 47.6875 5.691406 47.867188 5.761719 48.046875 5.84375 C 48.0625 5.851562 48.078125 5.859375 48.09375 5.867188 C 48.164062 5.902344 48.226562 5.933594 48.289062 5.980469 C 48.390625 6.066406 48.390625 6.066406 48.515625 6.082031 C 48.582031 6.0625 48.644531 6.035156 48.707031 6.003906 C 48.730469 5.996094 48.753906 5.984375 48.78125 5.976562 C 48.855469 5.941406 48.929688 5.910156 49.003906 5.875 C 49.054688 5.851562 49.101562 5.832031 49.152344 5.808594 C 49.320312 5.738281 49.488281 5.664062 49.652344 5.585938 C 49.679688 5.574219 49.703125 5.566406 49.730469 5.554688 C 49.75 5.542969 49.769531 5.535156 49.789062 5.523438 C 49.867188 5.503906 49.917969 5.515625 49.992188 5.535156 Z M 45.835938 6.507812 C 45.472656 6.984375 45.421875 7.597656 45.492188 8.175781 C 45.550781 8.542969 45.6875 8.890625 45.980469 9.132812 C 46.207031 9.285156 46.46875 9.3125 46.734375 9.277344 C 47.015625 9.21875 47.210938 9.089844 47.375 8.855469 C 47.683594 8.375 47.742188 7.746094 47.640625 7.191406 C 47.5625 6.859375 47.402344 6.507812 47.117188 6.308594 C 46.703125 6.074219 46.152344 6.148438 45.835938 6.507812 Z M 45.238281 12.367188 C 44.957031 12.734375 44.867188 13.113281 44.902344 13.570312 C 44.957031 13.84375 45.09375 14.058594 45.316406 14.226562 C 45.613281 14.417969 46.015625 14.496094 46.367188 14.507812 C 46.394531 14.507812 46.394531 14.507812 46.417969 14.507812 C 47.132812 14.527344 47.90625 14.457031 48.453125 13.945312 C 48.652344 13.738281 48.710938 13.515625 48.703125 13.230469 C 48.683594 12.992188 48.570312 12.800781 48.394531 12.644531 C 48.113281 12.441406 47.726562 12.449219 47.398438 12.449219 C 47.355469 12.449219 47.3125 12.449219 47.269531 12.449219 C 47.15625 12.449219 47.046875 12.449219 46.933594 12.449219 C 46.753906 12.449219 46.574219 12.445312 46.394531 12.445312 C 46.332031 12.445312 46.269531 12.445312 46.210938 12.445312 C 45.882812 12.445312 45.5625 12.414062 45.238281 12.367188 Z M 45.238281 12.367188 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 53.039062 2.382812 C 53.0625 2.390625 53.0625 2.390625 53.085938 2.398438 C 53.140625 2.429688 53.171875 2.453125 53.207031 2.503906 C 53.230469 2.617188 53.21875 2.730469 53.214844 2.84375 C 53.210938 2.878906 53.210938 2.914062 53.210938 2.953125 C 53.207031 3.027344 53.203125 3.105469 53.199219 3.183594 C 53.191406 3.371094 53.183594 3.558594 53.179688 3.746094 C 53.175781 3.792969 53.175781 3.835938 53.175781 3.882812 C 53.15625 4.441406 53.15625 5 53.15625 5.5625 C 53.15625 5.640625 53.15625 5.71875 53.15625 5.792969 C 53.15625 6.085938 53.160156 6.375 53.160156 6.664062 C 53.179688 6.644531 53.195312 6.625 53.214844 6.605469 C 53.238281 6.578125 53.261719 6.550781 53.285156 6.523438 C 53.296875 6.511719 53.3125 6.5 53.324219 6.484375 C 53.78125 5.984375 54.445312 5.601562 55.128906 5.550781 C 55.640625 5.535156 56.128906 5.578125 56.527344 5.929688 C 56.566406 5.964844 56.601562 6 56.640625 6.039062 C 56.664062 6.0625 56.664062 6.0625 56.691406 6.089844 C 57.246094 6.660156 57.203125 7.570312 57.203125 8.304688 C 57.203125 8.414062 57.203125 8.523438 57.207031 8.632812 C 57.207031 8.839844 57.207031 9.042969 57.207031 9.25 C 57.207031 9.484375 57.210938 9.722656 57.210938 9.957031 C 57.210938 10.4375 57.214844 10.921875 57.214844 11.40625 C 57.246094 11.410156 57.246094 11.410156 57.28125 11.414062 C 57.308594 11.417969 57.335938 11.421875 57.363281 11.425781 C 57.40625 11.433594 57.40625 11.433594 57.445312 11.441406 C 57.558594 11.457031 57.671875 11.480469 57.785156 11.503906 C 57.808594 11.507812 57.828125 11.511719 57.851562 11.515625 C 57.878906 11.519531 57.878906 11.519531 57.910156 11.527344 C 57.929688 11.53125 57.949219 11.535156 57.964844 11.539062 C 58.007812 11.550781 58.007812 11.550781 58.03125 11.574219 C 58.035156 11.613281 58.035156 11.65625 58.035156 11.695312 C 58.035156 11.71875 58.035156 11.746094 58.035156 11.769531 C 58.035156 11.796875 58.035156 11.824219 58.035156 11.851562 C 58.035156 11.875 58.035156 11.902344 58.035156 11.929688 C 58.035156 11.964844 58.035156 11.964844 58.035156 12.003906 C 58.035156 12.027344 58.035156 12.050781 58.035156 12.074219 C 58.03125 12.125 58.03125 12.125 58.007812 12.148438 C 57.964844 12.152344 57.921875 12.152344 57.882812 12.152344 C 57.839844 12.152344 57.839844 12.152344 57.796875 12.152344 C 57.769531 12.152344 57.738281 12.152344 57.707031 12.152344 C 57.675781 12.152344 57.640625 12.152344 57.609375 12.152344 C 57.523438 12.152344 57.433594 12.152344 57.347656 12.152344 C 57.257812 12.152344 57.164062 12.152344 57.074219 12.152344 C 56.917969 12.152344 56.765625 12.152344 56.613281 12.152344 C 56.433594 12.152344 56.257812 12.152344 56.082031 12.152344 C 55.929688 12.152344 55.777344 12.152344 55.625 12.152344 C 55.53125 12.152344 55.441406 12.152344 55.351562 12.152344 C 55.265625 12.152344 55.179688 12.152344 55.09375 12.152344 C 55.046875 12.152344 55 12.152344 54.953125 12.152344 C 54.925781 12.152344 54.898438 12.152344 54.871094 12.152344 C 54.847656 12.152344 54.824219 12.152344 54.796875 12.152344 C 54.742188 12.148438 54.742188 12.148438 54.71875 12.125 C 54.71875 12.085938 54.71875 12.042969 54.71875 12.003906 C 54.71875 11.976562 54.71875 11.953125 54.71875 11.925781 C 54.71875 11.902344 54.71875 11.875 54.71875 11.847656 C 54.71875 11.820312 54.71875 11.796875 54.71875 11.769531 C 54.71875 11.703125 54.71875 11.636719 54.71875 11.574219 C 54.8125 11.53125 54.902344 11.507812 55.003906 11.488281 C 55.03125 11.480469 55.0625 11.476562 55.09375 11.46875 C 55.113281 11.464844 55.128906 11.460938 55.144531 11.460938 C 55.191406 11.449219 55.242188 11.441406 55.289062 11.429688 C 55.527344 11.378906 55.527344 11.378906 55.585938 11.378906 C 55.582031 10.90625 55.582031 10.433594 55.578125 9.960938 C 55.578125 9.742188 55.578125 9.523438 55.574219 9.304688 C 55.574219 9.109375 55.574219 8.917969 55.574219 8.726562 C 55.574219 8.625 55.570312 8.527344 55.570312 8.425781 C 55.570312 8.328125 55.570312 8.234375 55.570312 8.136719 C 55.570312 8.101562 55.570312 8.066406 55.570312 8.03125 C 55.570312 7.664062 55.554688 7.199219 55.289062 6.917969 C 55.054688 6.722656 54.742188 6.746094 54.457031 6.761719 C 54.101562 6.800781 53.738281 7.007812 53.464844 7.234375 C 53.425781 7.265625 53.425781 7.265625 53.371094 7.300781 C 53.273438 7.371094 53.214844 7.421875 53.1875 7.539062 C 53.179688 7.640625 53.179688 7.742188 53.183594 7.84375 C 53.183594 7.882812 53.183594 7.921875 53.183594 7.960938 C 53.183594 8.066406 53.183594 8.167969 53.1875 8.273438 C 53.1875 8.386719 53.1875 8.496094 53.1875 8.605469 C 53.1875 8.8125 53.191406 9.023438 53.191406 9.230469 C 53.195312 9.46875 53.195312 9.703125 53.195312 9.941406 C 53.199219 10.429688 53.203125 10.917969 53.207031 11.40625 C 53.238281 11.410156 53.238281 11.410156 53.265625 11.414062 C 53.351562 11.429688 53.4375 11.445312 53.523438 11.464844 C 53.554688 11.46875 53.585938 11.472656 53.613281 11.480469 C 53.644531 11.484375 53.671875 11.492188 53.703125 11.496094 C 53.730469 11.5 53.753906 11.507812 53.78125 11.511719 C 53.847656 11.523438 53.910156 11.535156 53.976562 11.550781 C 53.976562 11.746094 53.976562 11.945312 53.976562 12.148438 C 52.890625 12.148438 51.804688 12.148438 50.6875 12.148438 C 50.6875 11.953125 50.6875 11.753906 50.6875 11.550781 C 50.964844 11.492188 51.242188 11.4375 51.527344 11.378906 C 51.542969 11.160156 51.554688 10.945312 51.554688 10.722656 C 51.554688 10.691406 51.554688 10.660156 51.554688 10.628906 C 51.554688 10.546875 51.558594 10.464844 51.558594 10.378906 C 51.558594 10.289062 51.558594 10.199219 51.558594 10.109375 C 51.558594 9.953125 51.558594 9.796875 51.558594 9.640625 C 51.558594 9.414062 51.558594 9.1875 51.5625 8.960938 C 51.5625 8.59375 51.5625 8.230469 51.5625 7.863281 C 51.566406 7.507812 51.566406 7.152344 51.566406 6.792969 C 51.566406 6.773438 51.566406 6.75 51.566406 6.726562 C 51.566406 6.617188 51.566406 6.507812 51.566406 6.398438 C 51.570312 5.484375 51.574219 4.570312 51.574219 3.65625 C 51.554688 3.65625 51.535156 3.652344 51.515625 3.652344 C 51.476562 3.648438 51.476562 3.648438 51.4375 3.644531 C 51.414062 3.644531 51.386719 3.640625 51.359375 3.640625 C 51.277344 3.632812 51.195312 3.621094 51.113281 3.609375 C 51.082031 3.605469 51.054688 3.601562 51.023438 3.597656 C 50.996094 3.59375 50.964844 3.589844 50.933594 3.582031 C 50.902344 3.578125 50.871094 3.574219 50.839844 3.570312 C 50.765625 3.558594 50.691406 3.546875 50.617188 3.535156 C 50.617188 3.347656 50.617188 3.15625 50.617188 2.960938 C 50.910156 2.875 51.207031 2.796875 51.5 2.722656 C 51.523438 2.714844 51.542969 2.710938 51.5625 2.707031 C 51.671875 2.679688 51.777344 2.652344 51.886719 2.625 C 51.972656 2.601562 52.0625 2.578125 52.152344 2.554688 C 52.257812 2.527344 52.367188 2.5 52.472656 2.472656 C 52.515625 2.460938 52.554688 2.453125 52.597656 2.441406 C 52.652344 2.425781 52.710938 2.410156 52.765625 2.398438 C 52.78125 2.394531 52.800781 2.386719 52.816406 2.382812 C 52.898438 2.363281 52.960938 2.351562 53.039062 2.382812 Z M 53.039062 2.382812 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 99.691406 6.011719 C 100.109375 6.40625 100.234375 7.003906 100.273438 7.554688 C 100.277344 7.667969 100.277344 7.785156 100.277344 7.898438 C 100.277344 7.933594 100.277344 7.964844 100.277344 8 C 100.277344 8.074219 100.277344 8.144531 100.277344 8.21875 C 100.277344 8.332031 100.277344 8.445312 100.277344 8.558594 C 100.28125 8.886719 100.28125 9.210938 100.28125 9.535156 C 100.28125 9.714844 100.28125 9.894531 100.285156 10.074219 C 100.285156 10.171875 100.285156 10.265625 100.285156 10.359375 C 100.285156 10.449219 100.285156 10.539062 100.285156 10.628906 C 100.285156 10.675781 100.285156 10.726562 100.285156 10.773438 C 100.289062 10.964844 100.292969 11.167969 100.417969 11.320312 C 100.53125 11.378906 100.636719 11.398438 100.757812 11.367188 C 100.898438 11.308594 101.003906 11.21875 101.113281 11.117188 C 101.226562 11.199219 101.339844 11.289062 101.449219 11.378906 C 101.394531 11.527344 101.300781 11.640625 101.207031 11.765625 C 101.179688 11.804688 101.179688 11.804688 101.152344 11.84375 C 100.859375 12.152344 100.476562 12.265625 100.058594 12.277344 C 99.699219 12.269531 99.332031 12.164062 99.066406 11.910156 C 98.933594 11.757812 98.761719 11.519531 98.761719 11.308594 C 98.582031 11.449219 98.582031 11.449219 98.417969 11.605469 C 98.289062 11.738281 98.140625 11.847656 97.992188 11.957031 C 97.96875 11.972656 97.949219 11.992188 97.925781 12.007812 C 97.488281 12.3125 96.855469 12.339844 96.34375 12.25 C 95.917969 12.15625 95.527344 11.929688 95.28125 11.558594 C 95.035156 11.136719 94.964844 10.617188 95.082031 10.140625 C 95.289062 9.527344 95.746094 9.175781 96.300781 8.894531 C 96.941406 8.582031 97.644531 8.375 98.328125 8.179688 C 98.34375 8.175781 98.359375 8.171875 98.375 8.167969 C 98.472656 8.140625 98.566406 8.113281 98.664062 8.085938 C 98.695312 7.195312 98.695312 7.195312 98.328125 6.425781 C 98.121094 6.230469 97.828125 6.203125 97.558594 6.203125 C 97.53125 6.203125 97.53125 6.203125 97.503906 6.203125 C 97.339844 6.207031 97.171875 6.21875 97.007812 6.230469 C 97.003906 6.257812 97.003906 6.289062 97 6.316406 C 96.984375 6.46875 96.957031 6.617188 96.925781 6.765625 C 96.917969 6.816406 96.910156 6.863281 96.902344 6.910156 C 96.832031 7.273438 96.738281 7.585938 96.425781 7.808594 C 96.191406 7.933594 95.945312 7.933594 95.6875 7.867188 C 95.515625 7.808594 95.40625 7.707031 95.320312 7.546875 C 95.234375 7.347656 95.238281 7.183594 95.308594 6.980469 C 95.316406 6.957031 95.316406 6.957031 95.324219 6.929688 C 95.421875 6.644531 95.574219 6.441406 95.785156 6.230469 C 95.800781 6.214844 95.816406 6.195312 95.835938 6.179688 C 96.734375 5.308594 98.742188 5.21875 99.691406 6.011719 Z M 98.394531 8.742188 C 98.292969 8.777344 98.1875 8.8125 98.082031 8.847656 C 97.574219 9.007812 97.011719 9.230469 96.746094 9.722656 C 96.582031 10.042969 96.554688 10.355469 96.648438 10.703125 C 96.71875 10.914062 96.816406 11.042969 97.011719 11.152344 C 97.296875 11.292969 97.609375 11.304688 97.910156 11.199219 C 98.058594 11.132812 98.207031 11.050781 98.34375 10.960938 C 98.398438 10.921875 98.398438 10.921875 98.46875 10.890625 C 98.558594 10.839844 98.644531 10.789062 98.679688 10.683594 C 98.703125 10.542969 98.695312 10.402344 98.691406 10.257812 C 98.6875 10.214844 98.6875 10.167969 98.6875 10.121094 C 98.6875 10 98.683594 9.878906 98.683594 9.757812 C 98.679688 9.636719 98.679688 9.511719 98.675781 9.386719 C 98.675781 9.144531 98.667969 8.902344 98.664062 8.660156 C 98.578125 8.660156 98.476562 8.714844 98.394531 8.742188 Z M 98.394531 8.742188 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 38.035156 6.242188 C 38.207031 6.40625 38.332031 6.578125 38.449219 6.785156 C 38.460938 6.808594 38.460938 6.808594 38.472656 6.832031 C 38.835938 7.472656 38.875 8.257812 38.761719 8.972656 C 38.734375 9 38.734375 9 38.671875 9 C 38.625 9 38.625 9 38.578125 9 C 38.5625 9 38.546875 9 38.53125 9 C 38.472656 9 38.417969 9 38.363281 9 C 38.324219 9 38.285156 9 38.242188 9 C 38.136719 9 38.027344 9 37.917969 9 C 37.804688 9 37.695312 9 37.582031 9 C 37.367188 9 37.152344 9 36.9375 9 C 36.695312 9 36.453125 9 36.207031 9 C 35.707031 9 35.207031 9 34.703125 9 C 34.714844 9.089844 34.726562 9.183594 34.738281 9.273438 C 34.742188 9.300781 34.742188 9.328125 34.746094 9.351562 C 34.8125 9.898438 35.007812 10.441406 35.4375 10.808594 C 35.933594 11.1875 36.476562 11.269531 37.089844 11.203125 C 37.539062 11.128906 37.90625 10.847656 38.222656 10.535156 C 38.347656 10.417969 38.347656 10.417969 38.425781 10.417969 C 38.464844 10.445312 38.464844 10.445312 38.503906 10.488281 C 38.589844 10.585938 38.683594 10.671875 38.785156 10.753906 C 38.679688 11.046875 38.46875 11.28125 38.257812 11.5 C 38.242188 11.519531 38.222656 11.535156 38.207031 11.554688 C 37.792969 12 37.171875 12.246094 36.574219 12.320312 C 36.554688 12.320312 36.535156 12.324219 36.515625 12.328125 C 35.640625 12.425781 34.773438 12.210938 34.074219 11.671875 C 33.421875 11.125 33.078125 10.363281 32.976562 9.527344 C 32.972656 9.496094 32.972656 9.496094 32.96875 9.460938 C 32.871094 8.5 33.074219 7.515625 33.675781 6.746094 C 33.707031 6.710938 33.738281 6.675781 33.769531 6.640625 C 33.78125 6.621094 33.796875 6.605469 33.8125 6.585938 C 34.316406 5.988281 35.136719 5.640625 35.902344 5.566406 C 36.699219 5.511719 37.429688 5.699219 38.035156 6.242188 Z M 35.226562 6.652344 C 34.949219 7.007812 34.820312 7.386719 34.746094 7.824219 C 34.742188 7.851562 34.738281 7.875 34.734375 7.898438 C 34.730469 7.921875 34.726562 7.949219 34.722656 7.972656 C 34.71875 7.992188 34.714844 8.015625 34.710938 8.035156 C 34.703125 8.097656 34.703125 8.15625 34.703125 8.222656 C 34.703125 8.242188 34.703125 8.261719 34.703125 8.28125 C 34.703125 8.292969 34.703125 8.308594 34.703125 8.324219 C 34.972656 8.328125 35.242188 8.328125 35.507812 8.328125 C 35.632812 8.328125 35.757812 8.328125 35.882812 8.332031 C 36.003906 8.332031 36.125 8.332031 36.246094 8.332031 C 36.289062 8.332031 36.335938 8.332031 36.382812 8.332031 C 36.445312 8.332031 36.511719 8.332031 36.574219 8.332031 C 36.59375 8.332031 36.613281 8.332031 36.632812 8.332031 C 36.800781 8.332031 36.964844 8.304688 37.085938 8.183594 C 37.273438 7.9375 37.277344 7.609375 37.246094 7.3125 C 37.195312 6.96875 37.015625 6.636719 36.730469 6.425781 C 36.226562 6.113281 35.617188 6.195312 35.226562 6.652344 Z M 35.226562 6.652344 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 112.726562 6.085938 C 112.90625 6.242188 113.058594 6.414062 113.183594 6.617188 C 113.199219 6.636719 113.210938 6.65625 113.226562 6.679688 C 113.628906 7.320312 113.699219 8.167969 113.566406 8.902344 C 113.523438 8.945312 113.449219 8.929688 113.386719 8.929688 C 113.371094 8.929688 113.355469 8.929688 113.339844 8.929688 C 113.28125 8.929688 113.226562 8.929688 113.171875 8.929688 C 113.132812 8.929688 113.089844 8.933594 113.050781 8.933594 C 112.945312 8.933594 112.835938 8.933594 112.726562 8.933594 C 112.613281 8.933594 112.5 8.933594 112.386719 8.933594 C 112.175781 8.9375 111.960938 8.9375 111.746094 8.9375 C 111.503906 8.941406 111.257812 8.941406 111.015625 8.941406 C 110.515625 8.945312 110.011719 8.949219 109.511719 8.949219 C 109.519531 9.023438 109.527344 9.097656 109.535156 9.171875 C 109.535156 9.191406 109.539062 9.210938 109.539062 9.230469 C 109.554688 9.378906 109.578125 9.523438 109.613281 9.667969 C 109.621094 9.6875 109.625 9.710938 109.628906 9.730469 C 109.703125 10.011719 109.808594 10.261719 109.992188 10.488281 C 110.003906 10.507812 110.019531 10.527344 110.035156 10.542969 C 110.320312 10.898438 110.765625 11.117188 111.214844 11.164062 C 111.839844 11.203125 112.339844 11.078125 112.820312 10.671875 C 112.9375 10.570312 113.050781 10.457031 113.160156 10.347656 C 113.230469 10.378906 113.28125 10.414062 113.339844 10.46875 C 113.355469 10.480469 113.367188 10.496094 113.382812 10.507812 C 113.398438 10.523438 113.414062 10.539062 113.429688 10.554688 C 113.445312 10.566406 113.460938 10.582031 113.476562 10.597656 C 113.515625 10.632812 113.554688 10.671875 113.59375 10.707031 C 113.324219 11.316406 112.769531 11.816406 112.15625 12.066406 C 112.054688 12.105469 111.953125 12.136719 111.847656 12.171875 C 111.832031 12.175781 111.816406 12.179688 111.800781 12.183594 C 111.507812 12.265625 111.214844 12.28125 110.914062 12.28125 C 110.898438 12.28125 110.878906 12.28125 110.859375 12.28125 C 110.554688 12.277344 110.261719 12.257812 109.96875 12.175781 C 109.941406 12.167969 109.941406 12.167969 109.914062 12.160156 C 109.203125 11.953125 108.628906 11.503906 108.238281 10.875 C 108.230469 10.859375 108.222656 10.847656 108.210938 10.832031 C 107.699219 9.980469 107.648438 8.855469 107.878906 7.90625 C 108.074219 7.136719 108.570312 6.417969 109.253906 6 C 110.304688 5.378906 111.75 5.261719 112.726562 6.085938 Z M 110.105469 6.496094 C 109.710938 6.9375 109.507812 7.546875 109.511719 8.136719 C 109.511719 8.160156 109.511719 8.179688 109.511719 8.203125 C 109.511719 8.21875 109.511719 8.234375 109.511719 8.253906 C 109.78125 8.253906 110.050781 8.253906 110.316406 8.257812 C 110.441406 8.257812 110.566406 8.257812 110.691406 8.257812 C 110.8125 8.257812 110.933594 8.257812 111.054688 8.257812 C 111.097656 8.257812 111.144531 8.261719 111.191406 8.261719 C 111.253906 8.261719 111.320312 8.261719 111.382812 8.261719 C 111.402344 8.261719 111.421875 8.261719 111.441406 8.261719 C 111.59375 8.261719 111.746094 8.234375 111.871094 8.140625 C 112.082031 7.886719 112.078125 7.605469 112.054688 7.289062 C 112.011719 6.949219 111.867188 6.6875 111.625 6.449219 C 111.609375 6.433594 111.59375 6.417969 111.582031 6.40625 C 111.164062 6.015625 110.496094 6.121094 110.105469 6.496094 Z M 110.105469 6.496094 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 119.207031 6.039062 C 119.210938 6.308594 119.203125 6.578125 119.1875 6.847656 C 119.183594 6.910156 119.183594 6.972656 119.179688 7.035156 C 119.175781 7.078125 119.175781 7.117188 119.171875 7.160156 C 119.171875 7.175781 119.171875 7.195312 119.171875 7.214844 C 119.164062 7.308594 119.152344 7.390625 119.136719 7.484375 C 118.835938 7.484375 118.535156 7.484375 118.222656 7.484375 C 118.207031 7.40625 118.191406 7.328125 118.171875 7.246094 C 118.15625 7.171875 118.140625 7.097656 118.121094 7.023438 C 118.109375 6.96875 118.101562 6.917969 118.089844 6.867188 C 118.070312 6.792969 118.054688 6.714844 118.039062 6.640625 C 118.035156 6.617188 118.027344 6.59375 118.023438 6.570312 C 118.019531 6.550781 118.015625 6.527344 118.007812 6.503906 C 118.003906 6.484375 118 6.464844 117.996094 6.445312 C 117.984375 6.398438 117.984375 6.398438 117.960938 6.351562 C 117.902344 6.332031 117.847656 6.316406 117.789062 6.300781 C 117.765625 6.296875 117.765625 6.296875 117.738281 6.289062 C 117.339844 6.1875 116.835938 6.167969 116.464844 6.375 C 116.296875 6.480469 116.203125 6.609375 116.128906 6.789062 C 116.082031 7.042969 116.105469 7.261719 116.234375 7.484375 C 116.496094 7.828125 117.082031 7.953125 117.46875 8.070312 C 118.183594 8.289062 118.960938 8.597656 119.359375 9.277344 C 119.578125 9.714844 119.621094 10.257812 119.496094 10.734375 C 119.316406 11.277344 118.957031 11.703125 118.449219 11.964844 C 117.460938 12.445312 116.246094 12.394531 115.222656 12.054688 C 115.007812 11.972656 114.804688 11.867188 114.601562 11.765625 C 114.570312 11.234375 114.574219 10.707031 114.574219 10.175781 C 114.886719 10.175781 115.195312 10.175781 115.511719 10.175781 C 115.539062 10.304688 115.539062 10.304688 115.5625 10.433594 C 115.582031 10.515625 115.597656 10.597656 115.613281 10.679688 C 115.625 10.734375 115.636719 10.792969 115.648438 10.847656 C 115.664062 10.929688 115.679688 11.011719 115.695312 11.09375 C 115.703125 11.121094 115.707031 11.144531 115.710938 11.171875 C 115.71875 11.195312 115.722656 11.21875 115.726562 11.242188 C 115.730469 11.261719 115.734375 11.285156 115.738281 11.304688 C 115.75 11.355469 115.75 11.355469 115.777344 11.40625 C 116.324219 11.617188 117.03125 11.667969 117.578125 11.4375 C 117.800781 11.332031 117.949219 11.207031 118.039062 10.972656 C 118.089844 10.761719 118.082031 10.527344 117.992188 10.328125 C 117.910156 10.191406 117.820312 10.105469 117.6875 10.023438 C 117.664062 10.003906 117.636719 9.988281 117.609375 9.972656 C 117.265625 9.769531 116.875 9.65625 116.496094 9.527344 C 116.066406 9.386719 115.683594 9.222656 115.320312 8.949219 C 115.296875 8.933594 115.273438 8.917969 115.25 8.898438 C 115.226562 8.875 115.226562 8.875 115.199219 8.855469 C 115.199219 8.839844 115.199219 8.824219 115.199219 8.804688 C 115.1875 8.800781 115.171875 8.796875 115.160156 8.789062 C 114.933594 8.65625 114.792969 8.285156 114.726562 8.046875 C 114.605469 7.507812 114.6875 6.964844 114.984375 6.496094 C 115.347656 5.957031 115.902344 5.671875 116.523438 5.542969 C 117.460938 5.367188 118.386719 5.574219 119.207031 6.039062 Z M 119.207031 6.039062 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 67.945312 6.109375 C 67.96875 6.136719 67.96875 6.136719 67.96875 6.1875 C 67.96875 6.210938 67.96875 6.234375 67.964844 6.257812 C 67.964844 6.285156 67.964844 6.3125 67.964844 6.339844 C 67.960938 6.367188 67.960938 6.398438 67.960938 6.425781 C 67.960938 6.457031 67.957031 6.484375 67.957031 6.515625 C 67.941406 6.863281 67.917969 7.207031 67.894531 7.554688 C 67.59375 7.554688 67.292969 7.554688 66.984375 7.554688 C 66.921875 7.3125 66.863281 7.070312 66.808594 6.828125 C 66.804688 6.796875 66.796875 6.769531 66.789062 6.742188 C 66.785156 6.714844 66.777344 6.6875 66.773438 6.660156 C 66.765625 6.632812 66.761719 6.609375 66.753906 6.585938 C 66.742188 6.519531 66.742188 6.519531 66.742188 6.425781 C 66.707031 6.414062 66.667969 6.402344 66.628906 6.390625 C 66.605469 6.386719 66.585938 6.378906 66.5625 6.371094 C 66.355469 6.320312 66.15625 6.296875 65.941406 6.296875 C 65.917969 6.296875 65.894531 6.296875 65.871094 6.296875 C 65.5625 6.300781 65.296875 6.351562 65.0625 6.566406 C 64.894531 6.742188 64.859375 6.90625 64.863281 7.148438 C 64.867188 7.285156 64.890625 7.390625 64.96875 7.507812 C 64.976562 7.519531 64.984375 7.535156 64.996094 7.550781 C 65.261719 7.921875 65.914062 8.0625 66.328125 8.179688 C 67.054688 8.390625 67.703125 8.726562 68.089844 9.40625 C 68.214844 9.648438 68.289062 9.90625 68.304688 10.175781 C 68.304688 10.199219 68.304688 10.21875 68.308594 10.242188 C 68.324219 10.753906 68.15625 11.1875 67.824219 11.574219 C 67.808594 11.589844 67.796875 11.605469 67.78125 11.621094 C 67.28125 12.164062 66.515625 12.347656 65.808594 12.390625 C 65.144531 12.414062 64.535156 12.34375 63.910156 12.117188 C 63.886719 12.109375 63.886719 12.109375 63.859375 12.097656 C 63.675781 12.03125 63.507812 11.929688 63.335938 11.835938 C 63.335938 11.632812 63.335938 11.429688 63.335938 11.226562 C 63.335938 11.132812 63.335938 11.039062 63.335938 10.945312 C 63.332031 10.851562 63.332031 10.761719 63.332031 10.671875 C 63.332031 10.636719 63.332031 10.601562 63.332031 10.566406 C 63.332031 10.515625 63.332031 10.46875 63.332031 10.421875 C 63.332031 10.390625 63.332031 10.363281 63.332031 10.335938 C 63.335938 10.273438 63.335938 10.273438 63.359375 10.25 C 63.421875 10.246094 63.484375 10.246094 63.550781 10.246094 C 63.570312 10.246094 63.585938 10.246094 63.605469 10.246094 C 63.648438 10.246094 63.6875 10.246094 63.726562 10.246094 C 63.789062 10.246094 63.851562 10.246094 63.914062 10.246094 C 63.953125 10.246094 63.992188 10.246094 64.03125 10.246094 C 64.050781 10.246094 64.066406 10.246094 64.085938 10.246094 C 64.21875 10.246094 64.21875 10.246094 64.273438 10.273438 C 64.285156 10.316406 64.285156 10.316406 64.296875 10.375 C 64.300781 10.394531 64.304688 10.414062 64.308594 10.4375 C 64.316406 10.460938 64.320312 10.484375 64.324219 10.507812 C 64.328125 10.53125 64.332031 10.554688 64.339844 10.578125 C 64.347656 10.628906 64.359375 10.679688 64.367188 10.730469 C 64.382812 10.808594 64.398438 10.882812 64.414062 10.960938 C 64.421875 11.007812 64.433594 11.058594 64.441406 11.105469 C 64.445312 11.128906 64.453125 11.152344 64.457031 11.175781 C 64.476562 11.285156 64.492188 11.386719 64.488281 11.5 C 64.53125 11.511719 64.53125 11.511719 64.578125 11.519531 C 64.691406 11.546875 64.804688 11.574219 64.921875 11.605469 C 65.117188 11.648438 65.308594 11.648438 65.507812 11.652344 C 65.539062 11.652344 65.570312 11.652344 65.601562 11.652344 C 65.964844 11.652344 66.320312 11.59375 66.605469 11.359375 C 66.761719 11.199219 66.820312 11.003906 66.828125 10.789062 C 66.820312 10.566406 66.761719 10.382812 66.601562 10.226562 C 66.214844 9.933594 65.765625 9.789062 65.3125 9.640625 C 64.621094 9.414062 63.949219 9.125 63.59375 8.445312 C 63.378906 8 63.375 7.464844 63.53125 6.996094 C 63.761719 6.410156 64.183594 6.027344 64.753906 5.773438 C 65.792969 5.351562 66.988281 5.59375 67.945312 6.109375 Z M 67.945312 6.109375 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 105.941406 5.769531 C 105.960938 5.777344 105.976562 5.785156 105.996094 5.792969 C 106.1875 5.867188 106.351562 5.964844 106.535156 6.0625 C 106.511719 6.539062 106.488281 7.015625 106.464844 7.507812 C 106.164062 7.507812 105.863281 7.507812 105.550781 7.507812 C 105.445312 7.101562 105.445312 7.101562 105.410156 6.941406 C 105.40625 6.925781 105.402344 6.910156 105.398438 6.890625 C 105.386719 6.839844 105.375 6.789062 105.367188 6.738281 C 105.359375 6.703125 105.351562 6.667969 105.34375 6.632812 C 105.324219 6.546875 105.304688 6.460938 105.289062 6.375 C 105.234375 6.359375 105.183594 6.34375 105.128906 6.328125 C 105.097656 6.320312 105.070312 6.3125 105.039062 6.304688 C 104.859375 6.253906 104.6875 6.25 104.503906 6.25 C 104.464844 6.25 104.464844 6.25 104.421875 6.25 C 104.136719 6.246094 103.90625 6.3125 103.664062 6.464844 C 103.507812 6.621094 103.417969 6.816406 103.414062 7.042969 C 103.425781 7.25 103.492188 7.433594 103.632812 7.585938 C 103.976562 7.886719 104.484375 8.003906 104.910156 8.132812 C 105.628906 8.351562 106.285156 8.667969 106.667969 9.355469 C 106.878906 9.800781 106.9375 10.371094 106.785156 10.84375 C 106.554688 11.417969 106.144531 11.8125 105.585938 12.070312 C 104.601562 12.488281 103.335938 12.402344 102.359375 12.007812 C 102.203125 11.9375 102.046875 11.859375 101.902344 11.765625 C 101.894531 11.699219 101.894531 11.699219 101.894531 11.617188 C 101.894531 11.585938 101.894531 11.554688 101.890625 11.523438 C 101.890625 11.488281 101.890625 11.453125 101.890625 11.417969 C 101.890625 11.382812 101.890625 11.347656 101.890625 11.3125 C 101.890625 11.222656 101.886719 11.128906 101.886719 11.039062 C 101.886719 10.925781 101.886719 10.816406 101.882812 10.707031 C 101.882812 10.539062 101.882812 10.371094 101.878906 10.203125 C 102.1875 10.203125 102.496094 10.203125 102.816406 10.203125 C 102.871094 10.363281 102.871094 10.363281 102.886719 10.449219 C 102.890625 10.46875 102.894531 10.488281 102.898438 10.507812 C 102.902344 10.527344 102.90625 10.546875 102.910156 10.566406 C 102.914062 10.585938 102.917969 10.609375 102.921875 10.628906 C 102.933594 10.671875 102.941406 10.71875 102.949219 10.761719 C 102.964844 10.828125 102.976562 10.894531 102.988281 10.960938 C 103 11.003906 103.007812 11.046875 103.015625 11.089844 C 103.019531 11.109375 103.023438 11.132812 103.027344 11.152344 C 103.046875 11.246094 103.0625 11.332031 103.054688 11.429688 C 103.699219 11.59375 104.421875 11.726562 105.03125 11.386719 C 105.21875 11.265625 105.316406 11.125 105.375 10.914062 C 105.402344 10.691406 105.378906 10.496094 105.273438 10.292969 C 104.921875 9.867188 104.363281 9.730469 103.859375 9.5625 C 103.1875 9.339844 102.511719 9.058594 102.167969 8.398438 C 101.949219 7.929688 101.9375 7.414062 102.097656 6.929688 C 102.101562 6.90625 102.109375 6.886719 102.117188 6.863281 C 102.269531 6.417969 102.628906 6.066406 103.03125 5.847656 C 103.054688 5.832031 103.078125 5.820312 103.101562 5.808594 C 103.382812 5.65625 103.699219 5.574219 104.015625 5.535156 C 104.035156 5.53125 104.054688 5.527344 104.074219 5.527344 C 104.714844 5.449219 105.34375 5.535156 105.941406 5.769531 Z M 105.941406 5.769531 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 59.953125 3.921875 C 60.316406 3.921875 60.679688 3.921875 61.054688 3.921875 C 61.058594 4.292969 61.054688 4.667969 61.046875 5.039062 C 61.042969 5.066406 61.042969 5.066406 61.042969 5.09375 C 61.042969 5.144531 61.042969 5.195312 61.039062 5.246094 C 61.039062 5.277344 61.039062 5.304688 61.035156 5.335938 C 61.03125 5.472656 61.019531 5.613281 61.007812 5.75 C 61.53125 5.75 62.054688 5.75 62.59375 5.75 C 62.59375 6.035156 62.59375 6.320312 62.59375 6.617188 C 62.0625 6.617188 61.53125 6.617188 60.984375 6.617188 C 60.984375 7.128906 60.988281 7.644531 60.988281 8.160156 C 60.992188 8.398438 60.992188 8.636719 60.992188 8.875 C 60.992188 9.082031 60.992188 9.292969 60.996094 9.5 C 60.996094 9.609375 60.996094 9.71875 60.996094 9.832031 C 60.996094 9.933594 60.996094 10.039062 60.996094 10.140625 C 60.996094 10.179688 60.996094 10.21875 60.996094 10.253906 C 60.992188 10.765625 60.992188 10.765625 61.199219 11.210938 C 61.34375 11.347656 61.507812 11.40625 61.703125 11.40625 C 61.941406 11.371094 62.144531 11.289062 62.355469 11.175781 C 62.457031 11.125 62.457031 11.125 62.519531 11.117188 C 62.558594 11.140625 62.558594 11.140625 62.597656 11.183594 C 62.613281 11.195312 62.625 11.210938 62.640625 11.226562 C 62.652344 11.238281 62.667969 11.253906 62.683594 11.269531 C 62.695312 11.285156 62.710938 11.300781 62.726562 11.316406 C 62.761719 11.351562 62.796875 11.390625 62.832031 11.429688 C 62.785156 11.5625 62.707031 11.65625 62.617188 11.765625 C 62.605469 11.78125 62.59375 11.792969 62.578125 11.808594 C 62.375 12.03125 62.085938 12.183594 61.800781 12.269531 C 61.777344 12.277344 61.75 12.285156 61.726562 12.292969 C 61.511719 12.347656 61.296875 12.351562 61.078125 12.351562 C 61.046875 12.351562 61.019531 12.351562 60.988281 12.351562 C 60.523438 12.351562 60.085938 12.210938 59.730469 11.898438 C 59.542969 11.699219 59.425781 11.40625 59.375 11.140625 C 59.371094 11.117188 59.367188 11.097656 59.363281 11.074219 C 59.351562 10.988281 59.347656 10.902344 59.347656 10.8125 C 59.347656 10.792969 59.347656 10.777344 59.347656 10.757812 C 59.347656 10.695312 59.347656 10.636719 59.347656 10.578125 C 59.347656 10.535156 59.347656 10.492188 59.347656 10.449219 C 59.347656 10.332031 59.347656 10.214844 59.347656 10.097656 C 59.351562 9.972656 59.351562 9.851562 59.351562 9.730469 C 59.351562 9.496094 59.351562 9.265625 59.351562 9.035156 C 59.351562 8.769531 59.351562 8.507812 59.351562 8.242188 C 59.351562 7.703125 59.351562 7.160156 59.351562 6.617188 C 59.035156 6.617188 58.71875 6.617188 58.390625 6.617188 C 58.390625 6.371094 58.390625 6.125 58.390625 5.871094 C 58.914062 5.800781 58.914062 5.800781 59.449219 5.726562 C 59.480469 5.601562 59.515625 5.476562 59.550781 5.351562 C 59.574219 5.269531 59.59375 5.191406 59.617188 5.113281 C 59.652344 4.988281 59.6875 4.863281 59.722656 4.738281 C 59.75 4.640625 59.777344 4.539062 59.804688 4.4375 C 59.816406 4.398438 59.824219 4.359375 59.835938 4.324219 C 59.851562 4.269531 59.867188 4.214844 59.882812 4.160156 C 59.886719 4.144531 59.890625 4.128906 59.894531 4.113281 C 59.914062 4.046875 59.929688 3.984375 59.953125 3.921875 Z M 59.953125 3.921875 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 93.351562 5.554688 C 93.40625 5.59375 93.429688 5.617188 93.445312 5.679688 C 93.449219 5.75 93.445312 5.8125 93.441406 5.878906 C 93.441406 5.90625 93.441406 5.929688 93.441406 5.957031 C 93.4375 6.015625 93.4375 6.070312 93.433594 6.128906 C 93.429688 6.273438 93.425781 6.417969 93.421875 6.5625 C 93.417969 6.617188 93.417969 6.671875 93.417969 6.726562 C 93.402344 7.175781 93.40625 7.625 93.40625 8.074219 C 93.40625 8.195312 93.40625 8.3125 93.40625 8.429688 C 93.40625 8.644531 93.40625 8.859375 93.40625 9.074219 C 93.40625 9.320312 93.40625 9.570312 93.40625 9.816406 C 93.40625 10.320312 93.40625 10.828125 93.40625 11.332031 C 93.425781 11.335938 93.449219 11.339844 93.46875 11.34375 C 93.542969 11.355469 93.613281 11.371094 93.6875 11.382812 C 93.734375 11.390625 93.785156 11.398438 93.832031 11.40625 C 93.859375 11.414062 93.890625 11.417969 93.921875 11.425781 C 93.949219 11.429688 93.976562 11.433594 94.003906 11.4375 C 94.070312 11.449219 94.136719 11.464844 94.199219 11.476562 C 94.199219 11.675781 94.199219 11.875 94.199219 12.078125 C 93.105469 12.078125 92.015625 12.078125 90.886719 12.078125 C 90.886719 11.878906 90.886719 11.679688 90.886719 11.476562 C 90.988281 11.457031 91.085938 11.433594 91.1875 11.414062 C 91.222656 11.40625 91.253906 11.402344 91.289062 11.394531 C 91.339844 11.382812 91.386719 11.375 91.4375 11.363281 C 91.480469 11.355469 91.480469 11.355469 91.527344 11.34375 C 91.601562 11.332031 91.675781 11.332031 91.753906 11.332031 C 91.753906 10.894531 91.753906 10.457031 91.753906 10.023438 C 91.753906 9.820312 91.753906 9.617188 91.753906 9.414062 C 91.753906 9.234375 91.753906 9.058594 91.753906 8.882812 C 91.753906 8.789062 91.753906 8.695312 91.753906 8.601562 C 91.753906 8.066406 91.746094 7.535156 91.726562 7 C 91.683594 6.996094 91.683594 6.996094 91.636719 6.988281 C 91.539062 6.976562 91.4375 6.964844 91.339844 6.953125 C 91.296875 6.945312 91.25 6.941406 91.207031 6.933594 C 91.144531 6.925781 91.082031 6.917969 91.019531 6.910156 C 90.988281 6.90625 90.988281 6.90625 90.957031 6.902344 C 90.820312 6.882812 90.820312 6.882812 90.792969 6.855469 C 90.789062 6.816406 90.789062 6.777344 90.789062 6.738281 C 90.789062 6.714844 90.789062 6.691406 90.789062 6.667969 C 90.789062 6.640625 90.789062 6.617188 90.789062 6.589844 C 90.789062 6.566406 90.789062 6.539062 90.789062 6.515625 C 90.792969 6.453125 90.792969 6.390625 90.792969 6.328125 C 90.96875 6.253906 91.148438 6.1875 91.328125 6.125 C 91.355469 6.117188 91.382812 6.105469 91.414062 6.097656 C 91.503906 6.066406 91.59375 6.03125 91.683594 6 C 91.808594 5.957031 91.929688 5.914062 92.054688 5.871094 C 92.070312 5.867188 92.085938 5.859375 92.101562 5.855469 C 92.285156 5.792969 92.46875 5.726562 92.652344 5.660156 C 92.667969 5.652344 92.6875 5.644531 92.703125 5.640625 C 92.78125 5.609375 92.859375 5.582031 92.9375 5.554688 C 92.976562 5.539062 92.976562 5.539062 93.019531 5.523438 C 93.050781 5.511719 93.050781 5.511719 93.082031 5.5 C 93.1875 5.476562 93.261719 5.503906 93.351562 5.554688 Z M 93.351562 5.554688 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 42.214844 5.652344 C 42.214844 7.542969 42.214844 9.433594 42.214844 11.378906 C 42.535156 11.441406 42.535156 11.441406 42.863281 11.5 C 42.917969 11.515625 42.976562 11.53125 43.03125 11.550781 C 43.03125 11.738281 43.03125 11.929688 43.03125 12.125 C 41.929688 12.125 40.832031 12.125 39.695312 12.125 C 39.695312 11.9375 39.695312 11.746094 39.695312 11.550781 C 39.875 11.5 40.054688 11.460938 40.234375 11.425781 C 40.265625 11.417969 40.265625 11.417969 40.296875 11.410156 C 40.316406 11.40625 40.335938 11.402344 40.355469 11.398438 C 40.375 11.394531 40.394531 11.390625 40.410156 11.386719 C 40.46875 11.378906 40.523438 11.378906 40.585938 11.378906 C 40.582031 10.886719 40.578125 10.390625 40.574219 9.898438 C 40.574219 9.667969 40.574219 9.4375 40.570312 9.207031 C 40.570312 9.007812 40.570312 8.808594 40.570312 8.605469 C 40.566406 8.5 40.566406 8.394531 40.566406 8.289062 C 40.566406 8.191406 40.566406 8.089844 40.566406 7.988281 C 40.566406 7.953125 40.566406 7.917969 40.566406 7.878906 C 40.5625 7.683594 40.558594 7.488281 40.550781 7.292969 C 40.546875 7.273438 40.546875 7.253906 40.546875 7.234375 C 40.542969 7.140625 40.542969 7.140625 40.511719 7.050781 C 40.445312 7.035156 40.378906 7.027344 40.308594 7.019531 C 40.289062 7.015625 40.269531 7.011719 40.25 7.011719 C 40.183594 7.003906 40.121094 6.996094 40.054688 6.988281 C 40.011719 6.980469 39.96875 6.976562 39.921875 6.96875 C 39.816406 6.957031 39.707031 6.941406 39.601562 6.929688 C 39.601562 6.746094 39.601562 6.5625 39.601562 6.375 C 39.964844 6.242188 40.328125 6.109375 40.695312 5.980469 C 40.777344 5.953125 40.859375 5.921875 40.945312 5.894531 C 41 5.875 41.054688 5.855469 41.109375 5.835938 C 41.246094 5.789062 41.386719 5.738281 41.523438 5.6875 C 41.550781 5.675781 41.578125 5.667969 41.605469 5.65625 C 41.660156 5.636719 41.710938 5.617188 41.761719 5.597656 C 41.785156 5.589844 41.808594 5.578125 41.835938 5.570312 C 41.863281 5.558594 41.863281 5.558594 41.894531 5.546875 C 42.027344 5.515625 42.09375 5.585938 42.214844 5.652344 Z M 42.214844 5.652344 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 8.640625 9.261719 C 8.972656 9.519531 9.191406 9.859375 9.277344 10.273438 C 9.328125 10.675781 9.265625 11.089844 9.019531 11.421875 C 8.734375 11.769531 8.371094 12.007812 7.917969 12.058594 C 7.476562 12.09375 7.078125 11.957031 6.742188 11.667969 C 6.71875 11.648438 6.71875 11.648438 6.695312 11.628906 C 6.421875 11.378906 6.261719 10.992188 6.234375 10.628906 C 6.226562 10.179688 6.355469 9.789062 6.664062 9.457031 C 7.191406 8.921875 8.019531 8.84375 8.640625 9.261719 Z M 8.640625 9.261719 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 2.855469 4.089844 C 2.941406 4.15625 3.019531 4.230469 3.097656 4.308594 C 3.113281 4.324219 3.128906 4.339844 3.148438 4.359375 C 3.414062 4.640625 3.542969 5.027344 3.539062 5.410156 C 3.519531 5.851562 3.332031 6.21875 3.015625 6.527344 C 2.707031 6.792969 2.304688 6.921875 1.898438 6.898438 C 1.578125 6.871094 1.308594 6.769531 1.054688 6.570312 C 1.03125 6.546875 1.03125 6.546875 1.003906 6.527344 C 0.699219 6.277344 0.527344 5.898438 0.484375 5.511719 C 0.453125 5.121094 0.558594 4.730469 0.804688 4.425781 C 1.003906 4.191406 1.226562 4.03125 1.511719 3.921875 C 1.53125 3.914062 1.550781 3.90625 1.570312 3.898438 C 1.988281 3.757812 2.496094 3.84375 2.855469 4.089844 Z M 2.855469 4.089844 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 2.960938 11.683594 C 3.269531 11.949219 3.492188 12.316406 3.53125 12.726562 C 3.558594 13.152344 3.449219 13.550781 3.171875 13.878906 C 2.875 14.203125 2.519531 14.375 2.082031 14.417969 C 1.671875 14.433594 1.28125 14.28125 0.972656 14.011719 C 0.660156 13.714844 0.488281 13.324219 0.476562 12.890625 C 0.480469 12.53125 0.59375 12.214844 0.816406 11.933594 C 0.828125 11.917969 0.839844 11.902344 0.851562 11.882812 C 1.078125 11.597656 1.433594 11.421875 1.785156 11.363281 C 2.207031 11.316406 2.628906 11.417969 2.960938 11.683594 Z M 2.960938 11.683594 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 14.449219 4.167969 C 14.507812 4.222656 14.5625 4.273438 14.617188 4.332031 C 14.628906 4.34375 14.640625 4.355469 14.65625 4.367188 C 14.914062 4.632812 15.015625 5.023438 15.03125 5.378906 C 15.019531 5.734375 14.902344 6.046875 14.6875 6.328125 C 14.675781 6.34375 14.664062 6.359375 14.652344 6.378906 C 14.410156 6.679688 14.042969 6.851562 13.664062 6.898438 C 13.242188 6.925781 12.84375 6.816406 12.523438 6.535156 C 12.484375 6.5 12.445312 6.460938 12.40625 6.425781 C 12.394531 6.410156 12.378906 6.394531 12.363281 6.378906 C 12.085938 6.089844 11.988281 5.707031 11.992188 5.316406 C 12.003906 4.914062 12.167969 4.53125 12.457031 4.25 C 13.023438 3.75 13.847656 3.714844 14.449219 4.167969 Z M 14.449219 4.167969 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 42.046875 2.648438 C 42.253906 2.816406 42.375 3.03125 42.40625 3.296875 C 42.433594 3.558594 42.351562 3.808594 42.191406 4.019531 C 42.007812 4.214844 41.785156 4.351562 41.507812 4.363281 C 41.46875 4.363281 41.429688 4.363281 41.390625 4.363281 C 41.371094 4.363281 41.351562 4.363281 41.332031 4.363281 C 41.058594 4.355469 40.832031 4.273438 40.625 4.089844 C 40.476562 3.933594 40.359375 3.734375 40.34375 3.511719 C 40.34375 3.496094 40.339844 3.480469 40.339844 3.460938 C 40.328125 3.230469 40.390625 2.992188 40.542969 2.8125 C 40.554688 2.796875 40.570312 2.78125 40.585938 2.765625 C 40.597656 2.75 40.613281 2.734375 40.632812 2.714844 C 41.019531 2.339844 41.621094 2.332031 42.046875 2.648438 Z M 42.046875 2.648438 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 93.210938 2.566406 C 93.453125 2.757812 93.570312 2.96875 93.609375 3.273438 C 93.621094 3.53125 93.550781 3.773438 93.378906 3.972656 C 93.367188 3.988281 93.351562 4.003906 93.335938 4.019531 C 93.316406 4.039062 93.316406 4.039062 93.296875 4.058594 C 93.066406 4.28125 92.78125 4.316406 92.476562 4.3125 C 92.355469 4.308594 92.25 4.285156 92.136719 4.234375 C 92.117188 4.226562 92.101562 4.21875 92.082031 4.210938 C 91.871094 4.105469 91.703125 3.9375 91.605469 3.722656 C 91.515625 3.449219 91.515625 3.171875 91.632812 2.90625 C 91.773438 2.652344 92 2.484375 92.277344 2.402344 C 92.605469 2.324219 92.933594 2.375 93.210938 2.566406 Z M 93.210938 2.566406 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 8.320312 5.960938 C 8.539062 6.117188 8.664062 6.320312 8.726562 6.582031 C 8.769531 6.839844 8.710938 7.089844 8.574219 7.3125 C 8.410156 7.535156 8.207031 7.65625 7.945312 7.722656 C 7.621094 7.753906 7.355469 7.6875 7.105469 7.484375 C 6.921875 7.3125 6.8125 7.078125 6.792969 6.832031 C 6.789062 6.535156 6.871094 6.28125 7.078125 6.0625 C 7.4375 5.738281 7.914062 5.710938 8.320312 5.960938 Z M 8.320312 5.960938 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.431373%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 14.09375 0.820312 C 14.289062 0.96875 14.421875 1.179688 14.472656 1.417969 C 14.5 1.714844 14.464844 1.980469 14.273438 2.214844 C 14.082031 2.421875 13.890625 2.558594 13.605469 2.582031 C 13.320312 2.585938 13.078125 2.535156 12.863281 2.332031 C 12.660156 2.128906 12.550781 1.910156 12.542969 1.621094 C 12.546875 1.332031 12.644531 1.117188 12.839844 0.910156 C 13.199219 0.574219 13.6875 0.5625 14.09375 0.820312 Z M 14.09375 0.820312 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 2.574219 0.808594 C 2.769531 0.972656 2.925781 1.164062 2.976562 1.417969 C 2.996094 1.71875 2.972656 1.976562 2.777344 2.214844 C 2.585938 2.421875 2.394531 2.558594 2.109375 2.582031 C 1.824219 2.585938 1.582031 2.53125 1.367188 2.332031 C 1.226562 2.195312 1.136719 2.066406 1.078125 1.875 C 1.074219 1.863281 1.070312 1.847656 1.066406 1.832031 C 1.015625 1.570312 1.054688 1.3125 1.195312 1.089844 C 1.515625 0.644531 2.101562 0.484375 2.574219 0.808594 Z M 2.574219 0.808594 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 2.550781 8.316406 C 2.582031 8.34375 2.609375 8.371094 2.640625 8.398438 C 2.65625 8.414062 2.671875 8.429688 2.691406 8.445312 C 2.878906 8.640625 2.960938 8.847656 2.964844 9.121094 C 2.960938 9.398438 2.882812 9.613281 2.6875 9.816406 C 2.5 9.996094 2.257812 10.109375 1.992188 10.105469 C 1.695312 10.085938 1.449219 9.972656 1.246094 9.753906 C 1.074219 9.535156 1.003906 9.277344 1.03125 9 C 1.089844 8.710938 1.214844 8.484375 1.453125 8.3125 C 1.789062 8.105469 2.222656 8.085938 2.550781 8.316406 Z M 2.550781 8.316406 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 14.058594 8.34375 C 14.269531 8.496094 14.425781 8.714844 14.472656 8.972656 C 14.496094 9.300781 14.441406 9.542969 14.238281 9.804688 C 14.148438 9.90625 14.042969 9.972656 13.921875 10.03125 C 13.894531 10.046875 13.894531 10.046875 13.867188 10.058594 C 13.660156 10.144531 13.386719 10.136719 13.175781 10.066406 C 12.929688 9.960938 12.714844 9.769531 12.613281 9.519531 C 12.601562 9.484375 12.585938 9.445312 12.574219 9.40625 C 12.570312 9.390625 12.566406 9.378906 12.5625 9.363281 C 12.511719 9.109375 12.550781 8.855469 12.679688 8.632812 C 12.824219 8.421875 13.003906 8.277344 13.246094 8.203125 C 13.261719 8.199219 13.277344 8.195312 13.292969 8.191406 C 13.570312 8.136719 13.820312 8.195312 14.058594 8.34375 Z M 14.058594 8.34375 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 8.375 13.523438 C 8.605469 13.730469 8.71875 13.984375 8.742188 14.289062 C 8.734375 14.554688 8.621094 14.789062 8.445312 14.984375 C 8.25 15.164062 7.996094 15.25 7.734375 15.253906 C 7.46875 15.242188 7.25 15.136719 7.0625 14.953125 C 6.863281 14.730469 6.789062 14.488281 6.792969 14.195312 C 6.832031 13.894531 6.964844 13.664062 7.199219 13.472656 C 7.582031 13.230469 8.015625 13.25 8.375 13.523438 Z M 8.375 13.523438 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 14.027344 12.066406 C 14.25 12.234375 14.421875 12.449219 14.472656 12.726562 C 14.492188 13.019531 14.464844 13.269531 14.273438 13.5 C 14.089844 13.699219 13.886719 13.84375 13.609375 13.863281 C 13.3125 13.867188 13.058594 13.800781 12.832031 13.589844 C 12.730469 13.480469 12.65625 13.371094 12.601562 13.234375 C 12.589844 13.207031 12.582031 13.183594 12.570312 13.15625 C 12.519531 12.886719 12.539062 12.625 12.679688 12.386719 C 12.984375 11.945312 13.558594 11.765625 14.027344 12.066406 Z M 14.027344 12.066406 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 8.269531 2.203125 C 8.492188 2.371094 8.652344 2.574219 8.703125 2.855469 C 8.738281 3.113281 8.695312 3.371094 8.535156 3.582031 C 8.355469 3.796875 8.136719 3.949219 7.851562 3.976562 C 7.539062 3.988281 7.289062 3.894531 7.054688 3.679688 C 6.851562 3.449219 6.796875 3.222656 6.808594 2.914062 C 6.824219 2.671875 6.929688 2.480469 7.105469 2.308594 C 7.445312 2.039062 7.886719 1.964844 8.269531 2.203125 Z M 8.269531 2.203125 "
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "WeaveIcon"
+}
diff --git a/app/components/base/icons/src/public/tracing/WeaveIcon.tsx b/app/components/base/icons/src/public/tracing/WeaveIcon.tsx
new file mode 100644
index 0000000..fd66bd7
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/WeaveIcon.tsx
@@ -0,0 +1,16 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './WeaveIcon.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconBaseProps, IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = React.forwardRef<React.MutableRefObject<SVGElement>, Omit<IconBaseProps, 'data'>>((
+  props,
+  ref,
+) => <IconBase {...props} ref={ref} data={data as IconData} />)
+
+Icon.displayName = 'WeaveIcon'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/tracing/WeaveIconBig.json b/app/components/base/icons/src/public/tracing/WeaveIconBig.json
new file mode 100644
index 0000000..5557e23
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/WeaveIconBig.json
@@ -0,0 +1,279 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"xmlns": "http://www.w3.org/2000/svg",
+			"xmlns:xlink": "http://www.w3.org/1999/xlink",
+			"width": "124px",
+			"height": "16px",
+			"viewBox": "0 0 120 16",
+			"version": "1.1"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "surface1"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 20.847656 3.292969 C 20.875 3.292969 20.902344 3.292969 20.933594 3.292969 C 20.949219 3.292969 20.964844 3.292969 20.980469 3.292969 C 21.035156 3.292969 21.089844 3.292969 21.140625 3.292969 C 21.179688 3.292969 21.21875 3.292969 21.253906 3.292969 C 21.359375 3.292969 21.464844 3.292969 21.566406 3.292969 C 21.675781 3.292969 21.78125 3.292969 21.890625 3.292969 C 22.097656 3.292969 22.300781 3.292969 22.507812 3.292969 C 22.738281 3.292969 22.972656 3.292969 23.207031 3.296875 C 23.6875 3.296875 24.167969 3.296875 24.648438 3.296875 C 24.648438 3.519531 24.648438 3.742188 24.648438 3.96875 C 24.113281 4.042969 24.113281 4.042969 23.566406 4.113281 C 23.667969 4.496094 23.769531 4.882812 23.867188 5.265625 C 23.878906 5.308594 23.878906 5.308594 23.890625 5.351562 C 24.128906 6.269531 24.371094 7.183594 24.609375 8.097656 C 24.675781 8.339844 24.738281 8.582031 24.800781 8.824219 C 24.816406 8.878906 24.832031 8.933594 24.84375 8.992188 C 24.867188 9.078125 24.890625 9.167969 24.914062 9.257812 C 24.921875 9.289062 24.933594 9.320312 24.941406 9.355469 C 24.953125 9.398438 24.964844 9.441406 24.976562 9.484375 C 24.984375 9.523438 24.984375 9.523438 24.996094 9.558594 C 25.007812 9.625 25.007812 9.625 25.007812 9.71875 C 25.023438 9.71875 25.039062 9.71875 25.054688 9.71875 C 25.058594 9.707031 25.058594 9.695312 25.0625 9.679688 C 25.097656 9.492188 25.152344 9.3125 25.210938 9.128906 C 25.222656 9.097656 25.234375 9.0625 25.246094 9.027344 C 25.269531 8.953125 25.292969 8.882812 25.316406 8.808594 C 25.355469 8.691406 25.390625 8.574219 25.429688 8.457031 C 25.464844 8.339844 25.503906 8.21875 25.542969 8.097656 C 25.660156 7.738281 25.773438 7.375 25.890625 7.011719 C 25.902344 6.96875 25.917969 6.921875 25.933594 6.875 C 26.226562 5.945312 26.519531 5.019531 26.808594 4.089844 C 26.785156 4.089844 26.765625 4.089844 26.742188 4.085938 C 26.507812 4.074219 26.273438 4.046875 26.042969 4.015625 C 26.007812 4.011719 25.972656 4.007812 25.933594 4.003906 C 25.851562 3.992188 25.765625 3.980469 25.679688 3.96875 C 25.679688 3.746094 25.679688 3.523438 25.679688 3.296875 C 26.175781 3.296875 26.667969 3.296875 27.160156 3.296875 C 27.390625 3.292969 27.621094 3.292969 27.851562 3.292969 C 28.050781 3.292969 28.25 3.292969 28.449219 3.292969 C 28.554688 3.292969 28.660156 3.292969 28.765625 3.292969 C 28.867188 3.292969 28.964844 3.292969 29.066406 3.292969 C 29.101562 3.292969 29.140625 3.292969 29.175781 3.292969 C 29.226562 3.292969 29.273438 3.292969 29.324219 3.292969 C 29.367188 3.292969 29.367188 3.292969 29.410156 3.292969 C 29.472656 3.296875 29.472656 3.296875 29.496094 3.320312 C 29.5 3.367188 29.5 3.417969 29.5 3.464844 C 29.5 3.492188 29.5 3.515625 29.5 3.542969 C 29.496094 3.59375 29.496094 3.59375 29.496094 3.648438 C 29.496094 3.753906 29.496094 3.859375 29.496094 3.96875 C 29.09375 4.015625 28.6875 4.066406 28.273438 4.113281 C 28.679688 5.460938 28.679688 5.460938 29.089844 6.808594 C 29.105469 6.859375 29.121094 6.910156 29.136719 6.960938 C 29.234375 7.292969 29.335938 7.625 29.4375 7.960938 C 29.484375 8.113281 29.53125 8.265625 29.578125 8.417969 C 29.605469 8.507812 29.632812 8.597656 29.660156 8.691406 C 29.878906 9.40625 29.878906 9.40625 29.976562 9.746094 C 30.027344 9.664062 30.046875 9.601562 30.070312 9.507812 C 30.078125 9.484375 30.078125 9.484375 30.085938 9.457031 C 30.101562 9.402344 30.117188 9.34375 30.132812 9.289062 C 30.144531 9.25 30.152344 9.207031 30.164062 9.167969 C 30.1875 9.082031 30.214844 8.992188 30.238281 8.90625 C 30.292969 8.691406 30.351562 8.480469 30.410156 8.269531 C 30.433594 8.191406 30.453125 8.117188 30.472656 8.042969 C 30.621094 7.5 30.769531 6.960938 30.921875 6.421875 C 30.949219 6.324219 30.976562 6.226562 31 6.128906 C 31.066406 5.902344 31.128906 5.675781 31.191406 5.449219 C 31.230469 5.308594 31.269531 5.164062 31.308594 5.023438 C 31.335938 4.925781 31.363281 4.828125 31.390625 4.734375 C 31.402344 4.6875 31.414062 4.640625 31.429688 4.59375 C 31.445312 4.53125 31.464844 4.46875 31.480469 4.40625 C 31.488281 4.386719 31.492188 4.367188 31.496094 4.347656 C 31.515625 4.277344 31.535156 4.207031 31.558594 4.136719 C 31.210938 4.074219 30.855469 4.023438 30.503906 3.96875 C 30.503906 3.746094 30.503906 3.523438 30.503906 3.296875 C 30.878906 3.296875 31.253906 3.296875 31.628906 3.296875 C 31.804688 3.292969 31.976562 3.292969 32.152344 3.292969 C 32.304688 3.292969 32.457031 3.292969 32.605469 3.292969 C 32.6875 3.292969 32.769531 3.292969 32.847656 3.292969 C 32.9375 3.292969 33.027344 3.292969 33.117188 3.292969 C 33.144531 3.292969 33.171875 3.292969 33.199219 3.292969 C 33.222656 3.292969 33.246094 3.292969 33.273438 3.292969 C 33.304688 3.292969 33.304688 3.292969 33.335938 3.292969 C 33.382812 3.296875 33.382812 3.296875 33.40625 3.320312 C 33.410156 3.367188 33.410156 3.414062 33.410156 3.460938 C 33.410156 3.488281 33.410156 3.515625 33.410156 3.542969 C 33.410156 3.574219 33.410156 3.605469 33.410156 3.632812 C 33.410156 3.664062 33.410156 3.695312 33.410156 3.726562 C 33.410156 3.796875 33.410156 3.871094 33.40625 3.945312 C 33.292969 3.964844 33.175781 3.984375 33.0625 4.007812 C 33.023438 4.011719 32.984375 4.019531 32.945312 4.027344 C 32.738281 4.0625 32.535156 4.097656 32.328125 4.113281 C 32.320312 4.144531 32.320312 4.144531 32.3125 4.179688 C 32.238281 4.480469 32.15625 4.78125 32.070312 5.082031 C 32.058594 5.128906 32.042969 5.171875 32.03125 5.21875 C 31.875 5.78125 31.714844 6.347656 31.550781 6.910156 C 31.375 7.535156 31.195312 8.160156 31.019531 8.785156 C 30.992188 8.871094 30.96875 8.957031 30.945312 9.042969 C 30.835938 9.433594 30.722656 9.820312 30.613281 10.210938 C 30.566406 10.378906 30.519531 10.542969 30.472656 10.707031 C 30.445312 10.804688 30.417969 10.902344 30.390625 11 C 30.277344 11.390625 30.167969 11.785156 30.046875 12.175781 C 29.730469 12.175781 29.414062 12.175781 29.089844 12.175781 C 29.03125 12.003906 29.03125 12.003906 28.976562 11.832031 C 28.925781 11.675781 28.878906 11.523438 28.828125 11.367188 C 28.820312 11.347656 28.8125 11.328125 28.808594 11.304688 C 28.632812 10.769531 28.460938 10.230469 28.285156 9.695312 C 28.144531 9.273438 28.007812 8.847656 27.875 8.425781 C 27.695312 7.867188 27.515625 7.308594 27.332031 6.753906 C 27.304688 6.679688 27.28125 6.605469 27.257812 6.53125 C 27.238281 6.476562 27.222656 6.425781 27.207031 6.375 C 27.046875 5.894531 27.046875 5.894531 27.046875 5.796875 C 27.03125 5.796875 27.015625 5.796875 27 5.796875 C 26.996094 5.8125 26.996094 5.828125 26.992188 5.84375 C 26.964844 5.988281 26.925781 6.132812 26.882812 6.273438 C 26.875 6.296875 26.867188 6.316406 26.859375 6.339844 C 26.84375 6.390625 26.828125 6.4375 26.8125 6.488281 C 26.769531 6.625 26.726562 6.761719 26.683594 6.898438 C 26.675781 6.929688 26.664062 6.957031 26.65625 6.988281 C 26.546875 7.328125 26.445312 7.667969 26.339844 8.007812 C 26.316406 8.078125 26.296875 8.144531 26.273438 8.214844 C 26.230469 8.355469 26.1875 8.496094 26.144531 8.636719 C 26.074219 8.863281 26.007812 9.089844 25.9375 9.3125 C 25.933594 9.328125 25.925781 9.347656 25.921875 9.363281 C 25.894531 9.449219 25.871094 9.535156 25.84375 9.617188 C 25.796875 9.769531 25.75 9.921875 25.703125 10.074219 C 25.675781 10.15625 25.652344 10.242188 25.625 10.328125 C 25.613281 10.363281 25.605469 10.394531 25.59375 10.429688 C 25.414062 11.011719 25.234375 11.59375 25.054688 12.175781 C 24.738281 12.175781 24.421875 12.175781 24.097656 12.175781 C 23.816406 11.230469 23.535156 10.285156 23.261719 9.339844 C 23.253906 9.320312 23.25 9.304688 23.246094 9.285156 C 23.195312 9.117188 23.144531 8.949219 23.097656 8.78125 C 22.960938 8.3125 22.824219 7.84375 22.6875 7.375 C 22.664062 7.304688 22.644531 7.234375 22.625 7.164062 C 22.414062 6.449219 22.207031 5.738281 22 5.027344 C 21.976562 4.953125 21.953125 4.878906 21.933594 4.804688 C 21.898438 4.683594 21.859375 4.5625 21.824219 4.441406 C 21.820312 4.421875 21.8125 4.402344 21.808594 4.382812 C 21.796875 4.347656 21.785156 4.3125 21.777344 4.28125 C 21.753906 4.203125 21.742188 4.148438 21.742188 4.066406 C 21.726562 4.066406 21.710938 4.0625 21.691406 4.0625 C 21.382812 4.042969 21.070312 4.003906 20.761719 3.96875 C 20.757812 3.863281 20.757812 3.753906 20.757812 3.648438 C 20.757812 3.617188 20.757812 3.585938 20.757812 3.554688 C 20.757812 3.523438 20.757812 3.496094 20.757812 3.464844 C 20.757812 3.4375 20.757812 3.410156 20.757812 3.382812 C 20.761719 3.296875 20.761719 3.296875 20.847656 3.292969 Z M 20.847656 3.292969 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 82.488281 3.25 C 83.046875 3.246094 83.605469 3.246094 84.167969 3.246094 C 84.425781 3.246094 84.6875 3.246094 84.945312 3.246094 C 85.171875 3.242188 85.398438 3.242188 85.625 3.242188 C 85.746094 3.242188 85.867188 3.242188 85.984375 3.242188 C 88.15625 3.238281 88.15625 3.238281 88.894531 3.898438 C 88.914062 3.914062 88.9375 3.929688 88.957031 3.945312 C 89.191406 4.144531 89.363281 4.402344 89.472656 4.691406 C 89.480469 4.714844 89.492188 4.742188 89.5 4.765625 C 89.65625 5.25 89.601562 5.785156 89.382812 6.234375 C 89.117188 6.753906 88.695312 7.078125 88.152344 7.265625 C 87.984375 7.320312 87.816406 7.367188 87.648438 7.410156 C 87.664062 7.414062 87.679688 7.417969 87.699219 7.421875 C 88.523438 7.605469 89.300781 7.851562 89.78125 8.597656 C 90.0625 9.0625 90.125 9.636719 90.003906 10.164062 C 89.808594 10.804688 89.363281 11.304688 88.78125 11.621094 C 88.324219 11.863281 87.820312 11.988281 87.3125 12.054688 C 87.28125 12.058594 87.253906 12.0625 87.222656 12.066406 C 86.777344 12.121094 86.332031 12.109375 85.882812 12.105469 C 85.765625 12.105469 85.644531 12.105469 85.523438 12.105469 C 85.300781 12.105469 85.074219 12.105469 84.847656 12.105469 C 84.589844 12.105469 84.332031 12.105469 84.074219 12.105469 C 83.546875 12.105469 83.015625 12.101562 82.488281 12.101562 C 82.488281 11.878906 82.488281 11.65625 82.488281 11.429688 C 82.859375 11.390625 83.234375 11.347656 83.617188 11.308594 C 83.617188 8.910156 83.617188 6.511719 83.617188 4.042969 C 83.488281 4.035156 83.363281 4.027344 83.230469 4.019531 C 83.117188 4.007812 83.003906 3.996094 82.890625 3.980469 C 82.863281 3.980469 82.832031 3.976562 82.804688 3.972656 C 82.695312 3.960938 82.59375 3.949219 82.488281 3.921875 C 82.488281 3.699219 82.488281 3.476562 82.488281 3.25 Z M 85.390625 3.96875 C 85.390625 4.242188 85.386719 4.515625 85.382812 4.785156 C 85.382812 4.914062 85.378906 5.039062 85.378906 5.164062 C 85.371094 5.824219 85.367188 6.484375 85.367188 7.144531 C 86.488281 7.183594 86.488281 7.183594 87.457031 6.691406 C 87.796875 6.320312 87.859375 5.832031 87.847656 5.351562 C 87.832031 4.992188 87.71875 4.644531 87.460938 4.378906 C 87 3.96875 86.363281 3.964844 85.78125 3.96875 C 85.742188 3.96875 85.703125 3.96875 85.667969 3.96875 C 85.574219 3.96875 85.484375 3.96875 85.390625 3.96875 Z M 85.390625 7.84375 C 85.390625 9.003906 85.390625 10.160156 85.390625 11.355469 C 86.28125 11.386719 86.28125 11.386719 87.152344 11.21875 C 87.171875 11.214844 87.1875 11.207031 87.207031 11.199219 C 87.578125 11.066406 87.886719 10.824219 88.066406 10.46875 C 88.28125 9.988281 88.289062 9.417969 88.125 8.921875 C 87.960938 8.492188 87.664062 8.234375 87.257812 8.046875 C 86.664062 7.804688 86.023438 7.84375 85.390625 7.84375 Z M 85.390625 7.84375 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 76.167969 3.476562 C 76.367188 3.671875 76.507812 3.917969 76.585938 4.1875 C 76.589844 4.203125 76.59375 4.222656 76.601562 4.242188 C 76.707031 4.675781 76.621094 5.144531 76.414062 5.53125 C 76.34375 5.644531 76.265625 5.746094 76.175781 5.847656 C 76.15625 5.867188 76.136719 5.886719 76.117188 5.910156 C 75.71875 6.332031 75.199219 6.617188 74.6875 6.882812 C 74.707031 6.902344 74.726562 6.921875 74.746094 6.941406 C 74.972656 7.191406 74.972656 7.191406 75.066406 7.296875 C 75.140625 7.382812 75.21875 7.464844 75.300781 7.542969 C 75.351562 7.59375 75.394531 7.640625 75.4375 7.695312 C 75.527344 7.796875 75.621094 7.894531 75.714844 7.992188 C 76.089844 8.394531 76.089844 8.394531 76.253906 8.585938 C 76.351562 8.695312 76.449219 8.800781 76.546875 8.90625 C 76.621094 8.980469 76.691406 9.058594 76.761719 9.136719 C 76.773438 9.152344 76.789062 9.164062 76.800781 9.179688 C 76.824219 9.207031 76.851562 9.234375 76.875 9.261719 C 76.933594 9.324219 76.992188 9.382812 77.0625 9.429688 C 77.070312 9.410156 77.070312 9.410156 77.082031 9.386719 C 77.113281 9.304688 77.152344 9.230469 77.195312 9.15625 C 77.5625 8.476562 77.800781 7.753906 77.976562 7 C 77.953125 7 77.933594 6.996094 77.910156 6.996094 C 77.707031 6.96875 77.5 6.9375 77.296875 6.902344 C 77.273438 6.898438 77.25 6.894531 77.222656 6.890625 C 77.050781 6.859375 77.050781 6.859375 76.96875 6.832031 C 76.960938 6.328125 76.960938 6.328125 77.015625 6.160156 C 77.949219 6.160156 78.886719 6.160156 79.847656 6.160156 C 79.847656 6.367188 79.847656 6.574219 79.847656 6.785156 C 79.53125 6.839844 79.214844 6.894531 78.886719 6.953125 C 78.859375 7.046875 78.832031 7.140625 78.804688 7.234375 C 78.539062 8.09375 78.164062 9.035156 77.601562 9.746094 C 77.5625 9.792969 77.5625 9.792969 77.566406 9.851562 C 77.601562 9.933594 77.648438 9.980469 77.714844 10.039062 C 77.792969 10.113281 77.867188 10.1875 77.9375 10.269531 C 78.027344 10.375 78.125 10.46875 78.222656 10.566406 C 78.308594 10.65625 78.390625 10.742188 78.472656 10.839844 C 78.539062 10.914062 78.601562 10.933594 78.695312 10.949219 C 78.71875 10.953125 78.746094 10.957031 78.769531 10.960938 C 78.796875 10.964844 78.824219 10.96875 78.851562 10.972656 C 78.875 10.980469 78.902344 10.984375 78.933594 10.988281 C 79.019531 11.003906 79.105469 11.019531 79.191406 11.03125 C 79.277344 11.046875 79.363281 11.0625 79.449219 11.078125 C 79.503906 11.085938 79.558594 11.097656 79.613281 11.105469 C 79.648438 11.113281 79.648438 11.113281 79.6875 11.117188 C 79.707031 11.121094 79.730469 11.125 79.75 11.128906 C 79.800781 11.140625 79.800781 11.140625 79.824219 11.164062 C 79.820312 11.421875 79.785156 11.679688 79.753906 11.933594 C 79.691406 11.949219 79.632812 11.964844 79.570312 11.980469 C 79.546875 11.984375 79.546875 11.984375 79.519531 11.992188 C 79.214844 12.066406 78.910156 12.085938 78.597656 12.085938 C 78.539062 12.085938 78.484375 12.085938 78.425781 12.085938 C 77.847656 12.089844 77.332031 11.917969 76.894531 11.523438 C 76.855469 11.484375 76.816406 11.445312 76.777344 11.40625 C 76.71875 11.347656 76.660156 11.296875 76.601562 11.242188 C 76.578125 11.21875 76.578125 11.21875 76.554688 11.195312 C 76.515625 11.160156 76.476562 11.125 76.441406 11.089844 C 76.429688 11.101562 76.417969 11.109375 76.410156 11.117188 C 76.140625 11.351562 75.859375 11.554688 75.542969 11.71875 C 75.511719 11.738281 75.476562 11.757812 75.445312 11.777344 C 75.3125 11.847656 75.179688 11.894531 75.039062 11.9375 C 75.011719 11.945312 75.011719 11.945312 74.984375 11.953125 C 74.632812 12.058594 74.269531 12.089844 73.90625 12.085938 C 73.84375 12.085938 73.785156 12.085938 73.722656 12.089844 C 72.941406 12.089844 72.222656 11.824219 71.652344 11.28125 C 71.203125 10.820312 71.023438 10.246094 71.03125 9.609375 C 71.042969 9.058594 71.230469 8.546875 71.59375 8.132812 C 71.609375 8.113281 71.625 8.09375 71.644531 8.070312 C 71.980469 7.683594 72.398438 7.421875 72.839844 7.171875 C 72.871094 7.152344 72.902344 7.132812 72.9375 7.113281 C 72.960938 7.101562 72.984375 7.085938 73.007812 7.074219 C 72.996094 7.0625 72.988281 7.050781 72.976562 7.042969 C 72.398438 6.425781 72.09375 5.613281 72.113281 4.773438 C 72.128906 4.371094 72.257812 3.988281 72.527344 3.679688 C 72.542969 3.660156 72.558594 3.644531 72.570312 3.625 C 72.917969 3.210938 73.496094 2.996094 74.015625 2.933594 C 74.050781 2.929688 74.050781 2.929688 74.082031 2.925781 C 74.804688 2.847656 75.621094 2.964844 76.167969 3.476562 Z M 73.671875 3.796875 C 73.433594 4.113281 73.414062 4.4375 73.457031 4.820312 C 73.550781 5.460938 73.921875 5.9375 74.328125 6.425781 C 74.398438 6.390625 74.449219 6.355469 74.503906 6.300781 C 74.527344 6.28125 74.527344 6.28125 74.550781 6.257812 C 74.566406 6.242188 74.582031 6.226562 74.597656 6.210938 C 74.613281 6.191406 74.628906 6.175781 74.644531 6.160156 C 74.773438 6.03125 74.890625 5.894531 75 5.75 C 75.019531 5.726562 75.035156 5.699219 75.054688 5.675781 C 75.335938 5.292969 75.5 4.859375 75.457031 4.378906 C 75.40625 4.078125 75.289062 3.820312 75.035156 3.636719 C 74.59375 3.363281 74.03125 3.410156 73.671875 3.796875 Z M 73.046875 7.828125 C 72.664062 8.226562 72.519531 8.789062 72.519531 9.332031 C 72.53125 9.800781 72.71875 10.257812 73.039062 10.601562 C 73.46875 10.996094 73.980469 11.140625 74.550781 11.125 C 74.960938 11.105469 75.339844 11.003906 75.703125 10.8125 C 75.71875 10.804688 75.738281 10.796875 75.753906 10.785156 C 75.84375 10.738281 75.90625 10.699219 75.960938 10.609375 C 75.949219 10.601562 75.941406 10.589844 75.933594 10.582031 C 75.460938 10.074219 75.460938 10.074219 75.25 9.8125 C 75.1875 9.738281 75.125 9.664062 75.0625 9.59375 C 74.972656 9.484375 74.882812 9.375 74.796875 9.265625 C 74.695312 9.132812 74.589844 9.003906 74.480469 8.878906 C 74.390625 8.773438 74.304688 8.667969 74.214844 8.5625 C 74.152344 8.484375 74.085938 8.40625 74.019531 8.328125 C 73.921875 8.214844 73.828125 8.101562 73.734375 7.984375 C 73.726562 7.96875 73.714844 7.957031 73.703125 7.941406 C 73.683594 7.914062 73.660156 7.886719 73.640625 7.859375 C 73.589844 7.792969 73.539062 7.730469 73.488281 7.667969 C 73.460938 7.632812 73.460938 7.632812 73.433594 7.601562 C 73.414062 7.578125 73.414062 7.578125 73.390625 7.554688 C 73.265625 7.554688 73.132812 7.742188 73.046875 7.828125 Z M 73.046875 7.828125 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 49.992188 5.535156 C 50.101562 5.609375 50.101562 5.609375 50.136719 5.679688 C 50.136719 5.746094 50.140625 5.8125 50.140625 5.882812 C 50.140625 5.914062 50.140625 5.914062 50.140625 5.941406 C 50.140625 5.984375 50.140625 6.027344 50.140625 6.070312 C 50.140625 6.136719 50.140625 6.203125 50.140625 6.269531 C 50.140625 6.308594 50.140625 6.351562 50.140625 6.390625 C 50.140625 6.410156 50.140625 6.429688 50.140625 6.453125 C 50.140625 6.589844 50.140625 6.589844 50.113281 6.617188 C 50.074219 6.617188 50.035156 6.621094 49.996094 6.621094 C 49.972656 6.621094 49.949219 6.621094 49.921875 6.621094 C 49.894531 6.621094 49.871094 6.617188 49.84375 6.617188 C 49.816406 6.617188 49.789062 6.617188 49.757812 6.617188 C 49.671875 6.617188 49.585938 6.617188 49.5 6.617188 C 49.441406 6.617188 49.378906 6.617188 49.320312 6.617188 C 49.175781 6.617188 49.03125 6.617188 48.886719 6.617188 C 48.898438 6.640625 48.90625 6.660156 48.917969 6.683594 C 48.929688 6.714844 48.945312 6.746094 48.957031 6.773438 C 48.964844 6.789062 48.96875 6.804688 48.976562 6.820312 C 49.203125 7.339844 49.195312 8 48.988281 8.523438 C 48.75 9.0625 48.355469 9.457031 47.804688 9.671875 C 47.066406 9.941406 46.210938 9.941406 45.457031 9.746094 C 45.277344 10.003906 45.214844 10.273438 45.238281 10.585938 C 45.269531 10.699219 45.316406 10.761719 45.402344 10.835938 C 45.617188 10.945312 45.851562 10.949219 46.089844 10.949219 C 46.113281 10.953125 46.132812 10.953125 46.15625 10.953125 C 46.203125 10.953125 46.25 10.953125 46.292969 10.953125 C 46.367188 10.953125 46.441406 10.953125 46.515625 10.953125 C 46.726562 10.953125 46.9375 10.957031 47.144531 10.957031 C 47.273438 10.957031 47.402344 10.957031 47.53125 10.960938 C 47.582031 10.960938 47.628906 10.960938 47.675781 10.960938 C 48.324219 10.960938 49.039062 11.019531 49.53125 11.492188 C 49.546875 11.511719 49.566406 11.53125 49.585938 11.550781 C 49.601562 11.566406 49.617188 11.582031 49.636719 11.597656 C 49.957031 11.929688 50.0625 12.394531 50.066406 12.84375 C 50.054688 13.351562 49.847656 13.800781 49.511719 14.171875 C 49.496094 14.191406 49.480469 14.207031 49.460938 14.226562 C 48.8125 14.921875 47.769531 15.179688 46.855469 15.210938 C 45.890625 15.234375 44.761719 15.230469 44.015625 14.523438 C 43.738281 14.222656 43.660156 13.886719 43.671875 13.488281 C 43.679688 13.363281 43.699219 13.253906 43.753906 13.136719 C 43.761719 13.117188 43.769531 13.09375 43.78125 13.074219 C 43.996094 12.644531 44.386719 12.410156 44.785156 12.175781 C 44.765625 12.167969 44.746094 12.160156 44.730469 12.152344 C 44.398438 11.996094 44.222656 11.808594 44.089844 11.476562 C 43.988281 11.136719 44.070312 10.757812 44.222656 10.453125 C 44.421875 10.109375 44.695312 9.824219 44.976562 9.550781 C 44.960938 9.542969 44.945312 9.53125 44.925781 9.523438 C 44.757812 9.417969 44.613281 9.304688 44.472656 9.167969 C 44.457031 9.152344 44.441406 9.136719 44.425781 9.121094 C 44.214844 8.902344 44.085938 8.597656 44.015625 8.300781 C 44.011719 8.28125 44.003906 8.257812 44 8.238281 C 43.882812 7.675781 43.964844 7.042969 44.277344 6.558594 C 44.621094 6.070312 45.09375 5.773438 45.671875 5.628906 C 45.6875 5.625 45.703125 5.621094 45.71875 5.617188 C 46.25 5.492188 46.917969 5.496094 47.449219 5.628906 C 47.464844 5.632812 47.480469 5.636719 47.496094 5.640625 C 47.6875 5.691406 47.867188 5.761719 48.046875 5.84375 C 48.0625 5.851562 48.078125 5.859375 48.09375 5.867188 C 48.164062 5.902344 48.226562 5.933594 48.289062 5.980469 C 48.390625 6.066406 48.390625 6.066406 48.515625 6.082031 C 48.582031 6.0625 48.644531 6.035156 48.707031 6.003906 C 48.730469 5.996094 48.753906 5.984375 48.78125 5.976562 C 48.855469 5.941406 48.929688 5.910156 49.003906 5.875 C 49.054688 5.851562 49.101562 5.832031 49.152344 5.808594 C 49.320312 5.738281 49.488281 5.664062 49.652344 5.585938 C 49.679688 5.574219 49.703125 5.566406 49.730469 5.554688 C 49.75 5.542969 49.769531 5.535156 49.789062 5.523438 C 49.867188 5.503906 49.917969 5.515625 49.992188 5.535156 Z M 45.835938 6.507812 C 45.472656 6.984375 45.421875 7.597656 45.492188 8.175781 C 45.550781 8.542969 45.6875 8.890625 45.980469 9.132812 C 46.207031 9.285156 46.46875 9.3125 46.734375 9.277344 C 47.015625 9.21875 47.210938 9.089844 47.375 8.855469 C 47.683594 8.375 47.742188 7.746094 47.640625 7.191406 C 47.5625 6.859375 47.402344 6.507812 47.117188 6.308594 C 46.703125 6.074219 46.152344 6.148438 45.835938 6.507812 Z M 45.238281 12.367188 C 44.957031 12.734375 44.867188 13.113281 44.902344 13.570312 C 44.957031 13.84375 45.09375 14.058594 45.316406 14.226562 C 45.613281 14.417969 46.015625 14.496094 46.367188 14.507812 C 46.394531 14.507812 46.394531 14.507812 46.417969 14.507812 C 47.132812 14.527344 47.90625 14.457031 48.453125 13.945312 C 48.652344 13.738281 48.710938 13.515625 48.703125 13.230469 C 48.683594 12.992188 48.570312 12.800781 48.394531 12.644531 C 48.113281 12.441406 47.726562 12.449219 47.398438 12.449219 C 47.355469 12.449219 47.3125 12.449219 47.269531 12.449219 C 47.15625 12.449219 47.046875 12.449219 46.933594 12.449219 C 46.753906 12.449219 46.574219 12.445312 46.394531 12.445312 C 46.332031 12.445312 46.269531 12.445312 46.210938 12.445312 C 45.882812 12.445312 45.5625 12.414062 45.238281 12.367188 Z M 45.238281 12.367188 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 53.039062 2.382812 C 53.0625 2.390625 53.0625 2.390625 53.085938 2.398438 C 53.140625 2.429688 53.171875 2.453125 53.207031 2.503906 C 53.230469 2.617188 53.21875 2.730469 53.214844 2.84375 C 53.210938 2.878906 53.210938 2.914062 53.210938 2.953125 C 53.207031 3.027344 53.203125 3.105469 53.199219 3.183594 C 53.191406 3.371094 53.183594 3.558594 53.179688 3.746094 C 53.175781 3.792969 53.175781 3.835938 53.175781 3.882812 C 53.15625 4.441406 53.15625 5 53.15625 5.5625 C 53.15625 5.640625 53.15625 5.71875 53.15625 5.792969 C 53.15625 6.085938 53.160156 6.375 53.160156 6.664062 C 53.179688 6.644531 53.195312 6.625 53.214844 6.605469 C 53.238281 6.578125 53.261719 6.550781 53.285156 6.523438 C 53.296875 6.511719 53.3125 6.5 53.324219 6.484375 C 53.78125 5.984375 54.445312 5.601562 55.128906 5.550781 C 55.640625 5.535156 56.128906 5.578125 56.527344 5.929688 C 56.566406 5.964844 56.601562 6 56.640625 6.039062 C 56.664062 6.0625 56.664062 6.0625 56.691406 6.089844 C 57.246094 6.660156 57.203125 7.570312 57.203125 8.304688 C 57.203125 8.414062 57.203125 8.523438 57.207031 8.632812 C 57.207031 8.839844 57.207031 9.042969 57.207031 9.25 C 57.207031 9.484375 57.210938 9.722656 57.210938 9.957031 C 57.210938 10.4375 57.214844 10.921875 57.214844 11.40625 C 57.246094 11.410156 57.246094 11.410156 57.28125 11.414062 C 57.308594 11.417969 57.335938 11.421875 57.363281 11.425781 C 57.40625 11.433594 57.40625 11.433594 57.445312 11.441406 C 57.558594 11.457031 57.671875 11.480469 57.785156 11.503906 C 57.808594 11.507812 57.828125 11.511719 57.851562 11.515625 C 57.878906 11.519531 57.878906 11.519531 57.910156 11.527344 C 57.929688 11.53125 57.949219 11.535156 57.964844 11.539062 C 58.007812 11.550781 58.007812 11.550781 58.03125 11.574219 C 58.035156 11.613281 58.035156 11.65625 58.035156 11.695312 C 58.035156 11.71875 58.035156 11.746094 58.035156 11.769531 C 58.035156 11.796875 58.035156 11.824219 58.035156 11.851562 C 58.035156 11.875 58.035156 11.902344 58.035156 11.929688 C 58.035156 11.964844 58.035156 11.964844 58.035156 12.003906 C 58.035156 12.027344 58.035156 12.050781 58.035156 12.074219 C 58.03125 12.125 58.03125 12.125 58.007812 12.148438 C 57.964844 12.152344 57.921875 12.152344 57.882812 12.152344 C 57.839844 12.152344 57.839844 12.152344 57.796875 12.152344 C 57.769531 12.152344 57.738281 12.152344 57.707031 12.152344 C 57.675781 12.152344 57.640625 12.152344 57.609375 12.152344 C 57.523438 12.152344 57.433594 12.152344 57.347656 12.152344 C 57.257812 12.152344 57.164062 12.152344 57.074219 12.152344 C 56.917969 12.152344 56.765625 12.152344 56.613281 12.152344 C 56.433594 12.152344 56.257812 12.152344 56.082031 12.152344 C 55.929688 12.152344 55.777344 12.152344 55.625 12.152344 C 55.53125 12.152344 55.441406 12.152344 55.351562 12.152344 C 55.265625 12.152344 55.179688 12.152344 55.09375 12.152344 C 55.046875 12.152344 55 12.152344 54.953125 12.152344 C 54.925781 12.152344 54.898438 12.152344 54.871094 12.152344 C 54.847656 12.152344 54.824219 12.152344 54.796875 12.152344 C 54.742188 12.148438 54.742188 12.148438 54.71875 12.125 C 54.71875 12.085938 54.71875 12.042969 54.71875 12.003906 C 54.71875 11.976562 54.71875 11.953125 54.71875 11.925781 C 54.71875 11.902344 54.71875 11.875 54.71875 11.847656 C 54.71875 11.820312 54.71875 11.796875 54.71875 11.769531 C 54.71875 11.703125 54.71875 11.636719 54.71875 11.574219 C 54.8125 11.53125 54.902344 11.507812 55.003906 11.488281 C 55.03125 11.480469 55.0625 11.476562 55.09375 11.46875 C 55.113281 11.464844 55.128906 11.460938 55.144531 11.460938 C 55.191406 11.449219 55.242188 11.441406 55.289062 11.429688 C 55.527344 11.378906 55.527344 11.378906 55.585938 11.378906 C 55.582031 10.90625 55.582031 10.433594 55.578125 9.960938 C 55.578125 9.742188 55.578125 9.523438 55.574219 9.304688 C 55.574219 9.109375 55.574219 8.917969 55.574219 8.726562 C 55.574219 8.625 55.570312 8.527344 55.570312 8.425781 C 55.570312 8.328125 55.570312 8.234375 55.570312 8.136719 C 55.570312 8.101562 55.570312 8.066406 55.570312 8.03125 C 55.570312 7.664062 55.554688 7.199219 55.289062 6.917969 C 55.054688 6.722656 54.742188 6.746094 54.457031 6.761719 C 54.101562 6.800781 53.738281 7.007812 53.464844 7.234375 C 53.425781 7.265625 53.425781 7.265625 53.371094 7.300781 C 53.273438 7.371094 53.214844 7.421875 53.1875 7.539062 C 53.179688 7.640625 53.179688 7.742188 53.183594 7.84375 C 53.183594 7.882812 53.183594 7.921875 53.183594 7.960938 C 53.183594 8.066406 53.183594 8.167969 53.1875 8.273438 C 53.1875 8.386719 53.1875 8.496094 53.1875 8.605469 C 53.1875 8.8125 53.191406 9.023438 53.191406 9.230469 C 53.195312 9.46875 53.195312 9.703125 53.195312 9.941406 C 53.199219 10.429688 53.203125 10.917969 53.207031 11.40625 C 53.238281 11.410156 53.238281 11.410156 53.265625 11.414062 C 53.351562 11.429688 53.4375 11.445312 53.523438 11.464844 C 53.554688 11.46875 53.585938 11.472656 53.613281 11.480469 C 53.644531 11.484375 53.671875 11.492188 53.703125 11.496094 C 53.730469 11.5 53.753906 11.507812 53.78125 11.511719 C 53.847656 11.523438 53.910156 11.535156 53.976562 11.550781 C 53.976562 11.746094 53.976562 11.945312 53.976562 12.148438 C 52.890625 12.148438 51.804688 12.148438 50.6875 12.148438 C 50.6875 11.953125 50.6875 11.753906 50.6875 11.550781 C 50.964844 11.492188 51.242188 11.4375 51.527344 11.378906 C 51.542969 11.160156 51.554688 10.945312 51.554688 10.722656 C 51.554688 10.691406 51.554688 10.660156 51.554688 10.628906 C 51.554688 10.546875 51.558594 10.464844 51.558594 10.378906 C 51.558594 10.289062 51.558594 10.199219 51.558594 10.109375 C 51.558594 9.953125 51.558594 9.796875 51.558594 9.640625 C 51.558594 9.414062 51.558594 9.1875 51.5625 8.960938 C 51.5625 8.59375 51.5625 8.230469 51.5625 7.863281 C 51.566406 7.507812 51.566406 7.152344 51.566406 6.792969 C 51.566406 6.773438 51.566406 6.75 51.566406 6.726562 C 51.566406 6.617188 51.566406 6.507812 51.566406 6.398438 C 51.570312 5.484375 51.574219 4.570312 51.574219 3.65625 C 51.554688 3.65625 51.535156 3.652344 51.515625 3.652344 C 51.476562 3.648438 51.476562 3.648438 51.4375 3.644531 C 51.414062 3.644531 51.386719 3.640625 51.359375 3.640625 C 51.277344 3.632812 51.195312 3.621094 51.113281 3.609375 C 51.082031 3.605469 51.054688 3.601562 51.023438 3.597656 C 50.996094 3.59375 50.964844 3.589844 50.933594 3.582031 C 50.902344 3.578125 50.871094 3.574219 50.839844 3.570312 C 50.765625 3.558594 50.691406 3.546875 50.617188 3.535156 C 50.617188 3.347656 50.617188 3.15625 50.617188 2.960938 C 50.910156 2.875 51.207031 2.796875 51.5 2.722656 C 51.523438 2.714844 51.542969 2.710938 51.5625 2.707031 C 51.671875 2.679688 51.777344 2.652344 51.886719 2.625 C 51.972656 2.601562 52.0625 2.578125 52.152344 2.554688 C 52.257812 2.527344 52.367188 2.5 52.472656 2.472656 C 52.515625 2.460938 52.554688 2.453125 52.597656 2.441406 C 52.652344 2.425781 52.710938 2.410156 52.765625 2.398438 C 52.78125 2.394531 52.800781 2.386719 52.816406 2.382812 C 52.898438 2.363281 52.960938 2.351562 53.039062 2.382812 Z M 53.039062 2.382812 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 99.691406 6.011719 C 100.109375 6.40625 100.234375 7.003906 100.273438 7.554688 C 100.277344 7.667969 100.277344 7.785156 100.277344 7.898438 C 100.277344 7.933594 100.277344 7.964844 100.277344 8 C 100.277344 8.074219 100.277344 8.144531 100.277344 8.21875 C 100.277344 8.332031 100.277344 8.445312 100.277344 8.558594 C 100.28125 8.886719 100.28125 9.210938 100.28125 9.535156 C 100.28125 9.714844 100.28125 9.894531 100.285156 10.074219 C 100.285156 10.171875 100.285156 10.265625 100.285156 10.359375 C 100.285156 10.449219 100.285156 10.539062 100.285156 10.628906 C 100.285156 10.675781 100.285156 10.726562 100.285156 10.773438 C 100.289062 10.964844 100.292969 11.167969 100.417969 11.320312 C 100.53125 11.378906 100.636719 11.398438 100.757812 11.367188 C 100.898438 11.308594 101.003906 11.21875 101.113281 11.117188 C 101.226562 11.199219 101.339844 11.289062 101.449219 11.378906 C 101.394531 11.527344 101.300781 11.640625 101.207031 11.765625 C 101.179688 11.804688 101.179688 11.804688 101.152344 11.84375 C 100.859375 12.152344 100.476562 12.265625 100.058594 12.277344 C 99.699219 12.269531 99.332031 12.164062 99.066406 11.910156 C 98.933594 11.757812 98.761719 11.519531 98.761719 11.308594 C 98.582031 11.449219 98.582031 11.449219 98.417969 11.605469 C 98.289062 11.738281 98.140625 11.847656 97.992188 11.957031 C 97.96875 11.972656 97.949219 11.992188 97.925781 12.007812 C 97.488281 12.3125 96.855469 12.339844 96.34375 12.25 C 95.917969 12.15625 95.527344 11.929688 95.28125 11.558594 C 95.035156 11.136719 94.964844 10.617188 95.082031 10.140625 C 95.289062 9.527344 95.746094 9.175781 96.300781 8.894531 C 96.941406 8.582031 97.644531 8.375 98.328125 8.179688 C 98.34375 8.175781 98.359375 8.171875 98.375 8.167969 C 98.472656 8.140625 98.566406 8.113281 98.664062 8.085938 C 98.695312 7.195312 98.695312 7.195312 98.328125 6.425781 C 98.121094 6.230469 97.828125 6.203125 97.558594 6.203125 C 97.53125 6.203125 97.53125 6.203125 97.503906 6.203125 C 97.339844 6.207031 97.171875 6.21875 97.007812 6.230469 C 97.003906 6.257812 97.003906 6.289062 97 6.316406 C 96.984375 6.46875 96.957031 6.617188 96.925781 6.765625 C 96.917969 6.816406 96.910156 6.863281 96.902344 6.910156 C 96.832031 7.273438 96.738281 7.585938 96.425781 7.808594 C 96.191406 7.933594 95.945312 7.933594 95.6875 7.867188 C 95.515625 7.808594 95.40625 7.707031 95.320312 7.546875 C 95.234375 7.347656 95.238281 7.183594 95.308594 6.980469 C 95.316406 6.957031 95.316406 6.957031 95.324219 6.929688 C 95.421875 6.644531 95.574219 6.441406 95.785156 6.230469 C 95.800781 6.214844 95.816406 6.195312 95.835938 6.179688 C 96.734375 5.308594 98.742188 5.21875 99.691406 6.011719 Z M 98.394531 8.742188 C 98.292969 8.777344 98.1875 8.8125 98.082031 8.847656 C 97.574219 9.007812 97.011719 9.230469 96.746094 9.722656 C 96.582031 10.042969 96.554688 10.355469 96.648438 10.703125 C 96.71875 10.914062 96.816406 11.042969 97.011719 11.152344 C 97.296875 11.292969 97.609375 11.304688 97.910156 11.199219 C 98.058594 11.132812 98.207031 11.050781 98.34375 10.960938 C 98.398438 10.921875 98.398438 10.921875 98.46875 10.890625 C 98.558594 10.839844 98.644531 10.789062 98.679688 10.683594 C 98.703125 10.542969 98.695312 10.402344 98.691406 10.257812 C 98.6875 10.214844 98.6875 10.167969 98.6875 10.121094 C 98.6875 10 98.683594 9.878906 98.683594 9.757812 C 98.679688 9.636719 98.679688 9.511719 98.675781 9.386719 C 98.675781 9.144531 98.667969 8.902344 98.664062 8.660156 C 98.578125 8.660156 98.476562 8.714844 98.394531 8.742188 Z M 98.394531 8.742188 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 38.035156 6.242188 C 38.207031 6.40625 38.332031 6.578125 38.449219 6.785156 C 38.460938 6.808594 38.460938 6.808594 38.472656 6.832031 C 38.835938 7.472656 38.875 8.257812 38.761719 8.972656 C 38.734375 9 38.734375 9 38.671875 9 C 38.625 9 38.625 9 38.578125 9 C 38.5625 9 38.546875 9 38.53125 9 C 38.472656 9 38.417969 9 38.363281 9 C 38.324219 9 38.285156 9 38.242188 9 C 38.136719 9 38.027344 9 37.917969 9 C 37.804688 9 37.695312 9 37.582031 9 C 37.367188 9 37.152344 9 36.9375 9 C 36.695312 9 36.453125 9 36.207031 9 C 35.707031 9 35.207031 9 34.703125 9 C 34.714844 9.089844 34.726562 9.183594 34.738281 9.273438 C 34.742188 9.300781 34.742188 9.328125 34.746094 9.351562 C 34.8125 9.898438 35.007812 10.441406 35.4375 10.808594 C 35.933594 11.1875 36.476562 11.269531 37.089844 11.203125 C 37.539062 11.128906 37.90625 10.847656 38.222656 10.535156 C 38.347656 10.417969 38.347656 10.417969 38.425781 10.417969 C 38.464844 10.445312 38.464844 10.445312 38.503906 10.488281 C 38.589844 10.585938 38.683594 10.671875 38.785156 10.753906 C 38.679688 11.046875 38.46875 11.28125 38.257812 11.5 C 38.242188 11.519531 38.222656 11.535156 38.207031 11.554688 C 37.792969 12 37.171875 12.246094 36.574219 12.320312 C 36.554688 12.320312 36.535156 12.324219 36.515625 12.328125 C 35.640625 12.425781 34.773438 12.210938 34.074219 11.671875 C 33.421875 11.125 33.078125 10.363281 32.976562 9.527344 C 32.972656 9.496094 32.972656 9.496094 32.96875 9.460938 C 32.871094 8.5 33.074219 7.515625 33.675781 6.746094 C 33.707031 6.710938 33.738281 6.675781 33.769531 6.640625 C 33.78125 6.621094 33.796875 6.605469 33.8125 6.585938 C 34.316406 5.988281 35.136719 5.640625 35.902344 5.566406 C 36.699219 5.511719 37.429688 5.699219 38.035156 6.242188 Z M 35.226562 6.652344 C 34.949219 7.007812 34.820312 7.386719 34.746094 7.824219 C 34.742188 7.851562 34.738281 7.875 34.734375 7.898438 C 34.730469 7.921875 34.726562 7.949219 34.722656 7.972656 C 34.71875 7.992188 34.714844 8.015625 34.710938 8.035156 C 34.703125 8.097656 34.703125 8.15625 34.703125 8.222656 C 34.703125 8.242188 34.703125 8.261719 34.703125 8.28125 C 34.703125 8.292969 34.703125 8.308594 34.703125 8.324219 C 34.972656 8.328125 35.242188 8.328125 35.507812 8.328125 C 35.632812 8.328125 35.757812 8.328125 35.882812 8.332031 C 36.003906 8.332031 36.125 8.332031 36.246094 8.332031 C 36.289062 8.332031 36.335938 8.332031 36.382812 8.332031 C 36.445312 8.332031 36.511719 8.332031 36.574219 8.332031 C 36.59375 8.332031 36.613281 8.332031 36.632812 8.332031 C 36.800781 8.332031 36.964844 8.304688 37.085938 8.183594 C 37.273438 7.9375 37.277344 7.609375 37.246094 7.3125 C 37.195312 6.96875 37.015625 6.636719 36.730469 6.425781 C 36.226562 6.113281 35.617188 6.195312 35.226562 6.652344 Z M 35.226562 6.652344 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 112.726562 6.085938 C 112.90625 6.242188 113.058594 6.414062 113.183594 6.617188 C 113.199219 6.636719 113.210938 6.65625 113.226562 6.679688 C 113.628906 7.320312 113.699219 8.167969 113.566406 8.902344 C 113.523438 8.945312 113.449219 8.929688 113.386719 8.929688 C 113.371094 8.929688 113.355469 8.929688 113.339844 8.929688 C 113.28125 8.929688 113.226562 8.929688 113.171875 8.929688 C 113.132812 8.929688 113.089844 8.933594 113.050781 8.933594 C 112.945312 8.933594 112.835938 8.933594 112.726562 8.933594 C 112.613281 8.933594 112.5 8.933594 112.386719 8.933594 C 112.175781 8.9375 111.960938 8.9375 111.746094 8.9375 C 111.503906 8.941406 111.257812 8.941406 111.015625 8.941406 C 110.515625 8.945312 110.011719 8.949219 109.511719 8.949219 C 109.519531 9.023438 109.527344 9.097656 109.535156 9.171875 C 109.535156 9.191406 109.539062 9.210938 109.539062 9.230469 C 109.554688 9.378906 109.578125 9.523438 109.613281 9.667969 C 109.621094 9.6875 109.625 9.710938 109.628906 9.730469 C 109.703125 10.011719 109.808594 10.261719 109.992188 10.488281 C 110.003906 10.507812 110.019531 10.527344 110.035156 10.542969 C 110.320312 10.898438 110.765625 11.117188 111.214844 11.164062 C 111.839844 11.203125 112.339844 11.078125 112.820312 10.671875 C 112.9375 10.570312 113.050781 10.457031 113.160156 10.347656 C 113.230469 10.378906 113.28125 10.414062 113.339844 10.46875 C 113.355469 10.480469 113.367188 10.496094 113.382812 10.507812 C 113.398438 10.523438 113.414062 10.539062 113.429688 10.554688 C 113.445312 10.566406 113.460938 10.582031 113.476562 10.597656 C 113.515625 10.632812 113.554688 10.671875 113.59375 10.707031 C 113.324219 11.316406 112.769531 11.816406 112.15625 12.066406 C 112.054688 12.105469 111.953125 12.136719 111.847656 12.171875 C 111.832031 12.175781 111.816406 12.179688 111.800781 12.183594 C 111.507812 12.265625 111.214844 12.28125 110.914062 12.28125 C 110.898438 12.28125 110.878906 12.28125 110.859375 12.28125 C 110.554688 12.277344 110.261719 12.257812 109.96875 12.175781 C 109.941406 12.167969 109.941406 12.167969 109.914062 12.160156 C 109.203125 11.953125 108.628906 11.503906 108.238281 10.875 C 108.230469 10.859375 108.222656 10.847656 108.210938 10.832031 C 107.699219 9.980469 107.648438 8.855469 107.878906 7.90625 C 108.074219 7.136719 108.570312 6.417969 109.253906 6 C 110.304688 5.378906 111.75 5.261719 112.726562 6.085938 Z M 110.105469 6.496094 C 109.710938 6.9375 109.507812 7.546875 109.511719 8.136719 C 109.511719 8.160156 109.511719 8.179688 109.511719 8.203125 C 109.511719 8.21875 109.511719 8.234375 109.511719 8.253906 C 109.78125 8.253906 110.050781 8.253906 110.316406 8.257812 C 110.441406 8.257812 110.566406 8.257812 110.691406 8.257812 C 110.8125 8.257812 110.933594 8.257812 111.054688 8.257812 C 111.097656 8.257812 111.144531 8.261719 111.191406 8.261719 C 111.253906 8.261719 111.320312 8.261719 111.382812 8.261719 C 111.402344 8.261719 111.421875 8.261719 111.441406 8.261719 C 111.59375 8.261719 111.746094 8.234375 111.871094 8.140625 C 112.082031 7.886719 112.078125 7.605469 112.054688 7.289062 C 112.011719 6.949219 111.867188 6.6875 111.625 6.449219 C 111.609375 6.433594 111.59375 6.417969 111.582031 6.40625 C 111.164062 6.015625 110.496094 6.121094 110.105469 6.496094 Z M 110.105469 6.496094 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 119.207031 6.039062 C 119.210938 6.308594 119.203125 6.578125 119.1875 6.847656 C 119.183594 6.910156 119.183594 6.972656 119.179688 7.035156 C 119.175781 7.078125 119.175781 7.117188 119.171875 7.160156 C 119.171875 7.175781 119.171875 7.195312 119.171875 7.214844 C 119.164062 7.308594 119.152344 7.390625 119.136719 7.484375 C 118.835938 7.484375 118.535156 7.484375 118.222656 7.484375 C 118.207031 7.40625 118.191406 7.328125 118.171875 7.246094 C 118.15625 7.171875 118.140625 7.097656 118.121094 7.023438 C 118.109375 6.96875 118.101562 6.917969 118.089844 6.867188 C 118.070312 6.792969 118.054688 6.714844 118.039062 6.640625 C 118.035156 6.617188 118.027344 6.59375 118.023438 6.570312 C 118.019531 6.550781 118.015625 6.527344 118.007812 6.503906 C 118.003906 6.484375 118 6.464844 117.996094 6.445312 C 117.984375 6.398438 117.984375 6.398438 117.960938 6.351562 C 117.902344 6.332031 117.847656 6.316406 117.789062 6.300781 C 117.765625 6.296875 117.765625 6.296875 117.738281 6.289062 C 117.339844 6.1875 116.835938 6.167969 116.464844 6.375 C 116.296875 6.480469 116.203125 6.609375 116.128906 6.789062 C 116.082031 7.042969 116.105469 7.261719 116.234375 7.484375 C 116.496094 7.828125 117.082031 7.953125 117.46875 8.070312 C 118.183594 8.289062 118.960938 8.597656 119.359375 9.277344 C 119.578125 9.714844 119.621094 10.257812 119.496094 10.734375 C 119.316406 11.277344 118.957031 11.703125 118.449219 11.964844 C 117.460938 12.445312 116.246094 12.394531 115.222656 12.054688 C 115.007812 11.972656 114.804688 11.867188 114.601562 11.765625 C 114.570312 11.234375 114.574219 10.707031 114.574219 10.175781 C 114.886719 10.175781 115.195312 10.175781 115.511719 10.175781 C 115.539062 10.304688 115.539062 10.304688 115.5625 10.433594 C 115.582031 10.515625 115.597656 10.597656 115.613281 10.679688 C 115.625 10.734375 115.636719 10.792969 115.648438 10.847656 C 115.664062 10.929688 115.679688 11.011719 115.695312 11.09375 C 115.703125 11.121094 115.707031 11.144531 115.710938 11.171875 C 115.71875 11.195312 115.722656 11.21875 115.726562 11.242188 C 115.730469 11.261719 115.734375 11.285156 115.738281 11.304688 C 115.75 11.355469 115.75 11.355469 115.777344 11.40625 C 116.324219 11.617188 117.03125 11.667969 117.578125 11.4375 C 117.800781 11.332031 117.949219 11.207031 118.039062 10.972656 C 118.089844 10.761719 118.082031 10.527344 117.992188 10.328125 C 117.910156 10.191406 117.820312 10.105469 117.6875 10.023438 C 117.664062 10.003906 117.636719 9.988281 117.609375 9.972656 C 117.265625 9.769531 116.875 9.65625 116.496094 9.527344 C 116.066406 9.386719 115.683594 9.222656 115.320312 8.949219 C 115.296875 8.933594 115.273438 8.917969 115.25 8.898438 C 115.226562 8.875 115.226562 8.875 115.199219 8.855469 C 115.199219 8.839844 115.199219 8.824219 115.199219 8.804688 C 115.1875 8.800781 115.171875 8.796875 115.160156 8.789062 C 114.933594 8.65625 114.792969 8.285156 114.726562 8.046875 C 114.605469 7.507812 114.6875 6.964844 114.984375 6.496094 C 115.347656 5.957031 115.902344 5.671875 116.523438 5.542969 C 117.460938 5.367188 118.386719 5.574219 119.207031 6.039062 Z M 119.207031 6.039062 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 67.945312 6.109375 C 67.96875 6.136719 67.96875 6.136719 67.96875 6.1875 C 67.96875 6.210938 67.96875 6.234375 67.964844 6.257812 C 67.964844 6.285156 67.964844 6.3125 67.964844 6.339844 C 67.960938 6.367188 67.960938 6.398438 67.960938 6.425781 C 67.960938 6.457031 67.957031 6.484375 67.957031 6.515625 C 67.941406 6.863281 67.917969 7.207031 67.894531 7.554688 C 67.59375 7.554688 67.292969 7.554688 66.984375 7.554688 C 66.921875 7.3125 66.863281 7.070312 66.808594 6.828125 C 66.804688 6.796875 66.796875 6.769531 66.789062 6.742188 C 66.785156 6.714844 66.777344 6.6875 66.773438 6.660156 C 66.765625 6.632812 66.761719 6.609375 66.753906 6.585938 C 66.742188 6.519531 66.742188 6.519531 66.742188 6.425781 C 66.707031 6.414062 66.667969 6.402344 66.628906 6.390625 C 66.605469 6.386719 66.585938 6.378906 66.5625 6.371094 C 66.355469 6.320312 66.15625 6.296875 65.941406 6.296875 C 65.917969 6.296875 65.894531 6.296875 65.871094 6.296875 C 65.5625 6.300781 65.296875 6.351562 65.0625 6.566406 C 64.894531 6.742188 64.859375 6.90625 64.863281 7.148438 C 64.867188 7.285156 64.890625 7.390625 64.96875 7.507812 C 64.976562 7.519531 64.984375 7.535156 64.996094 7.550781 C 65.261719 7.921875 65.914062 8.0625 66.328125 8.179688 C 67.054688 8.390625 67.703125 8.726562 68.089844 9.40625 C 68.214844 9.648438 68.289062 9.90625 68.304688 10.175781 C 68.304688 10.199219 68.304688 10.21875 68.308594 10.242188 C 68.324219 10.753906 68.15625 11.1875 67.824219 11.574219 C 67.808594 11.589844 67.796875 11.605469 67.78125 11.621094 C 67.28125 12.164062 66.515625 12.347656 65.808594 12.390625 C 65.144531 12.414062 64.535156 12.34375 63.910156 12.117188 C 63.886719 12.109375 63.886719 12.109375 63.859375 12.097656 C 63.675781 12.03125 63.507812 11.929688 63.335938 11.835938 C 63.335938 11.632812 63.335938 11.429688 63.335938 11.226562 C 63.335938 11.132812 63.335938 11.039062 63.335938 10.945312 C 63.332031 10.851562 63.332031 10.761719 63.332031 10.671875 C 63.332031 10.636719 63.332031 10.601562 63.332031 10.566406 C 63.332031 10.515625 63.332031 10.46875 63.332031 10.421875 C 63.332031 10.390625 63.332031 10.363281 63.332031 10.335938 C 63.335938 10.273438 63.335938 10.273438 63.359375 10.25 C 63.421875 10.246094 63.484375 10.246094 63.550781 10.246094 C 63.570312 10.246094 63.585938 10.246094 63.605469 10.246094 C 63.648438 10.246094 63.6875 10.246094 63.726562 10.246094 C 63.789062 10.246094 63.851562 10.246094 63.914062 10.246094 C 63.953125 10.246094 63.992188 10.246094 64.03125 10.246094 C 64.050781 10.246094 64.066406 10.246094 64.085938 10.246094 C 64.21875 10.246094 64.21875 10.246094 64.273438 10.273438 C 64.285156 10.316406 64.285156 10.316406 64.296875 10.375 C 64.300781 10.394531 64.304688 10.414062 64.308594 10.4375 C 64.316406 10.460938 64.320312 10.484375 64.324219 10.507812 C 64.328125 10.53125 64.332031 10.554688 64.339844 10.578125 C 64.347656 10.628906 64.359375 10.679688 64.367188 10.730469 C 64.382812 10.808594 64.398438 10.882812 64.414062 10.960938 C 64.421875 11.007812 64.433594 11.058594 64.441406 11.105469 C 64.445312 11.128906 64.453125 11.152344 64.457031 11.175781 C 64.476562 11.285156 64.492188 11.386719 64.488281 11.5 C 64.53125 11.511719 64.53125 11.511719 64.578125 11.519531 C 64.691406 11.546875 64.804688 11.574219 64.921875 11.605469 C 65.117188 11.648438 65.308594 11.648438 65.507812 11.652344 C 65.539062 11.652344 65.570312 11.652344 65.601562 11.652344 C 65.964844 11.652344 66.320312 11.59375 66.605469 11.359375 C 66.761719 11.199219 66.820312 11.003906 66.828125 10.789062 C 66.820312 10.566406 66.761719 10.382812 66.601562 10.226562 C 66.214844 9.933594 65.765625 9.789062 65.3125 9.640625 C 64.621094 9.414062 63.949219 9.125 63.59375 8.445312 C 63.378906 8 63.375 7.464844 63.53125 6.996094 C 63.761719 6.410156 64.183594 6.027344 64.753906 5.773438 C 65.792969 5.351562 66.988281 5.59375 67.945312 6.109375 Z M 67.945312 6.109375 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 105.941406 5.769531 C 105.960938 5.777344 105.976562 5.785156 105.996094 5.792969 C 106.1875 5.867188 106.351562 5.964844 106.535156 6.0625 C 106.511719 6.539062 106.488281 7.015625 106.464844 7.507812 C 106.164062 7.507812 105.863281 7.507812 105.550781 7.507812 C 105.445312 7.101562 105.445312 7.101562 105.410156 6.941406 C 105.40625 6.925781 105.402344 6.910156 105.398438 6.890625 C 105.386719 6.839844 105.375 6.789062 105.367188 6.738281 C 105.359375 6.703125 105.351562 6.667969 105.34375 6.632812 C 105.324219 6.546875 105.304688 6.460938 105.289062 6.375 C 105.234375 6.359375 105.183594 6.34375 105.128906 6.328125 C 105.097656 6.320312 105.070312 6.3125 105.039062 6.304688 C 104.859375 6.253906 104.6875 6.25 104.503906 6.25 C 104.464844 6.25 104.464844 6.25 104.421875 6.25 C 104.136719 6.246094 103.90625 6.3125 103.664062 6.464844 C 103.507812 6.621094 103.417969 6.816406 103.414062 7.042969 C 103.425781 7.25 103.492188 7.433594 103.632812 7.585938 C 103.976562 7.886719 104.484375 8.003906 104.910156 8.132812 C 105.628906 8.351562 106.285156 8.667969 106.667969 9.355469 C 106.878906 9.800781 106.9375 10.371094 106.785156 10.84375 C 106.554688 11.417969 106.144531 11.8125 105.585938 12.070312 C 104.601562 12.488281 103.335938 12.402344 102.359375 12.007812 C 102.203125 11.9375 102.046875 11.859375 101.902344 11.765625 C 101.894531 11.699219 101.894531 11.699219 101.894531 11.617188 C 101.894531 11.585938 101.894531 11.554688 101.890625 11.523438 C 101.890625 11.488281 101.890625 11.453125 101.890625 11.417969 C 101.890625 11.382812 101.890625 11.347656 101.890625 11.3125 C 101.890625 11.222656 101.886719 11.128906 101.886719 11.039062 C 101.886719 10.925781 101.886719 10.816406 101.882812 10.707031 C 101.882812 10.539062 101.882812 10.371094 101.878906 10.203125 C 102.1875 10.203125 102.496094 10.203125 102.816406 10.203125 C 102.871094 10.363281 102.871094 10.363281 102.886719 10.449219 C 102.890625 10.46875 102.894531 10.488281 102.898438 10.507812 C 102.902344 10.527344 102.90625 10.546875 102.910156 10.566406 C 102.914062 10.585938 102.917969 10.609375 102.921875 10.628906 C 102.933594 10.671875 102.941406 10.71875 102.949219 10.761719 C 102.964844 10.828125 102.976562 10.894531 102.988281 10.960938 C 103 11.003906 103.007812 11.046875 103.015625 11.089844 C 103.019531 11.109375 103.023438 11.132812 103.027344 11.152344 C 103.046875 11.246094 103.0625 11.332031 103.054688 11.429688 C 103.699219 11.59375 104.421875 11.726562 105.03125 11.386719 C 105.21875 11.265625 105.316406 11.125 105.375 10.914062 C 105.402344 10.691406 105.378906 10.496094 105.273438 10.292969 C 104.921875 9.867188 104.363281 9.730469 103.859375 9.5625 C 103.1875 9.339844 102.511719 9.058594 102.167969 8.398438 C 101.949219 7.929688 101.9375 7.414062 102.097656 6.929688 C 102.101562 6.90625 102.109375 6.886719 102.117188 6.863281 C 102.269531 6.417969 102.628906 6.066406 103.03125 5.847656 C 103.054688 5.832031 103.078125 5.820312 103.101562 5.808594 C 103.382812 5.65625 103.699219 5.574219 104.015625 5.535156 C 104.035156 5.53125 104.054688 5.527344 104.074219 5.527344 C 104.714844 5.449219 105.34375 5.535156 105.941406 5.769531 Z M 105.941406 5.769531 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 59.953125 3.921875 C 60.316406 3.921875 60.679688 3.921875 61.054688 3.921875 C 61.058594 4.292969 61.054688 4.667969 61.046875 5.039062 C 61.042969 5.066406 61.042969 5.066406 61.042969 5.09375 C 61.042969 5.144531 61.042969 5.195312 61.039062 5.246094 C 61.039062 5.277344 61.039062 5.304688 61.035156 5.335938 C 61.03125 5.472656 61.019531 5.613281 61.007812 5.75 C 61.53125 5.75 62.054688 5.75 62.59375 5.75 C 62.59375 6.035156 62.59375 6.320312 62.59375 6.617188 C 62.0625 6.617188 61.53125 6.617188 60.984375 6.617188 C 60.984375 7.128906 60.988281 7.644531 60.988281 8.160156 C 60.992188 8.398438 60.992188 8.636719 60.992188 8.875 C 60.992188 9.082031 60.992188 9.292969 60.996094 9.5 C 60.996094 9.609375 60.996094 9.71875 60.996094 9.832031 C 60.996094 9.933594 60.996094 10.039062 60.996094 10.140625 C 60.996094 10.179688 60.996094 10.21875 60.996094 10.253906 C 60.992188 10.765625 60.992188 10.765625 61.199219 11.210938 C 61.34375 11.347656 61.507812 11.40625 61.703125 11.40625 C 61.941406 11.371094 62.144531 11.289062 62.355469 11.175781 C 62.457031 11.125 62.457031 11.125 62.519531 11.117188 C 62.558594 11.140625 62.558594 11.140625 62.597656 11.183594 C 62.613281 11.195312 62.625 11.210938 62.640625 11.226562 C 62.652344 11.238281 62.667969 11.253906 62.683594 11.269531 C 62.695312 11.285156 62.710938 11.300781 62.726562 11.316406 C 62.761719 11.351562 62.796875 11.390625 62.832031 11.429688 C 62.785156 11.5625 62.707031 11.65625 62.617188 11.765625 C 62.605469 11.78125 62.59375 11.792969 62.578125 11.808594 C 62.375 12.03125 62.085938 12.183594 61.800781 12.269531 C 61.777344 12.277344 61.75 12.285156 61.726562 12.292969 C 61.511719 12.347656 61.296875 12.351562 61.078125 12.351562 C 61.046875 12.351562 61.019531 12.351562 60.988281 12.351562 C 60.523438 12.351562 60.085938 12.210938 59.730469 11.898438 C 59.542969 11.699219 59.425781 11.40625 59.375 11.140625 C 59.371094 11.117188 59.367188 11.097656 59.363281 11.074219 C 59.351562 10.988281 59.347656 10.902344 59.347656 10.8125 C 59.347656 10.792969 59.347656 10.777344 59.347656 10.757812 C 59.347656 10.695312 59.347656 10.636719 59.347656 10.578125 C 59.347656 10.535156 59.347656 10.492188 59.347656 10.449219 C 59.347656 10.332031 59.347656 10.214844 59.347656 10.097656 C 59.351562 9.972656 59.351562 9.851562 59.351562 9.730469 C 59.351562 9.496094 59.351562 9.265625 59.351562 9.035156 C 59.351562 8.769531 59.351562 8.507812 59.351562 8.242188 C 59.351562 7.703125 59.351562 7.160156 59.351562 6.617188 C 59.035156 6.617188 58.71875 6.617188 58.390625 6.617188 C 58.390625 6.371094 58.390625 6.125 58.390625 5.871094 C 58.914062 5.800781 58.914062 5.800781 59.449219 5.726562 C 59.480469 5.601562 59.515625 5.476562 59.550781 5.351562 C 59.574219 5.269531 59.59375 5.191406 59.617188 5.113281 C 59.652344 4.988281 59.6875 4.863281 59.722656 4.738281 C 59.75 4.640625 59.777344 4.539062 59.804688 4.4375 C 59.816406 4.398438 59.824219 4.359375 59.835938 4.324219 C 59.851562 4.269531 59.867188 4.214844 59.882812 4.160156 C 59.886719 4.144531 59.890625 4.128906 59.894531 4.113281 C 59.914062 4.046875 59.929688 3.984375 59.953125 3.921875 Z M 59.953125 3.921875 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 93.351562 5.554688 C 93.40625 5.59375 93.429688 5.617188 93.445312 5.679688 C 93.449219 5.75 93.445312 5.8125 93.441406 5.878906 C 93.441406 5.90625 93.441406 5.929688 93.441406 5.957031 C 93.4375 6.015625 93.4375 6.070312 93.433594 6.128906 C 93.429688 6.273438 93.425781 6.417969 93.421875 6.5625 C 93.417969 6.617188 93.417969 6.671875 93.417969 6.726562 C 93.402344 7.175781 93.40625 7.625 93.40625 8.074219 C 93.40625 8.195312 93.40625 8.3125 93.40625 8.429688 C 93.40625 8.644531 93.40625 8.859375 93.40625 9.074219 C 93.40625 9.320312 93.40625 9.570312 93.40625 9.816406 C 93.40625 10.320312 93.40625 10.828125 93.40625 11.332031 C 93.425781 11.335938 93.449219 11.339844 93.46875 11.34375 C 93.542969 11.355469 93.613281 11.371094 93.6875 11.382812 C 93.734375 11.390625 93.785156 11.398438 93.832031 11.40625 C 93.859375 11.414062 93.890625 11.417969 93.921875 11.425781 C 93.949219 11.429688 93.976562 11.433594 94.003906 11.4375 C 94.070312 11.449219 94.136719 11.464844 94.199219 11.476562 C 94.199219 11.675781 94.199219 11.875 94.199219 12.078125 C 93.105469 12.078125 92.015625 12.078125 90.886719 12.078125 C 90.886719 11.878906 90.886719 11.679688 90.886719 11.476562 C 90.988281 11.457031 91.085938 11.433594 91.1875 11.414062 C 91.222656 11.40625 91.253906 11.402344 91.289062 11.394531 C 91.339844 11.382812 91.386719 11.375 91.4375 11.363281 C 91.480469 11.355469 91.480469 11.355469 91.527344 11.34375 C 91.601562 11.332031 91.675781 11.332031 91.753906 11.332031 C 91.753906 10.894531 91.753906 10.457031 91.753906 10.023438 C 91.753906 9.820312 91.753906 9.617188 91.753906 9.414062 C 91.753906 9.234375 91.753906 9.058594 91.753906 8.882812 C 91.753906 8.789062 91.753906 8.695312 91.753906 8.601562 C 91.753906 8.066406 91.746094 7.535156 91.726562 7 C 91.683594 6.996094 91.683594 6.996094 91.636719 6.988281 C 91.539062 6.976562 91.4375 6.964844 91.339844 6.953125 C 91.296875 6.945312 91.25 6.941406 91.207031 6.933594 C 91.144531 6.925781 91.082031 6.917969 91.019531 6.910156 C 90.988281 6.90625 90.988281 6.90625 90.957031 6.902344 C 90.820312 6.882812 90.820312 6.882812 90.792969 6.855469 C 90.789062 6.816406 90.789062 6.777344 90.789062 6.738281 C 90.789062 6.714844 90.789062 6.691406 90.789062 6.667969 C 90.789062 6.640625 90.789062 6.617188 90.789062 6.589844 C 90.789062 6.566406 90.789062 6.539062 90.789062 6.515625 C 90.792969 6.453125 90.792969 6.390625 90.792969 6.328125 C 90.96875 6.253906 91.148438 6.1875 91.328125 6.125 C 91.355469 6.117188 91.382812 6.105469 91.414062 6.097656 C 91.503906 6.066406 91.59375 6.03125 91.683594 6 C 91.808594 5.957031 91.929688 5.914062 92.054688 5.871094 C 92.070312 5.867188 92.085938 5.859375 92.101562 5.855469 C 92.285156 5.792969 92.46875 5.726562 92.652344 5.660156 C 92.667969 5.652344 92.6875 5.644531 92.703125 5.640625 C 92.78125 5.609375 92.859375 5.582031 92.9375 5.554688 C 92.976562 5.539062 92.976562 5.539062 93.019531 5.523438 C 93.050781 5.511719 93.050781 5.511719 93.082031 5.5 C 93.1875 5.476562 93.261719 5.503906 93.351562 5.554688 Z M 93.351562 5.554688 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 42.214844 5.652344 C 42.214844 7.542969 42.214844 9.433594 42.214844 11.378906 C 42.535156 11.441406 42.535156 11.441406 42.863281 11.5 C 42.917969 11.515625 42.976562 11.53125 43.03125 11.550781 C 43.03125 11.738281 43.03125 11.929688 43.03125 12.125 C 41.929688 12.125 40.832031 12.125 39.695312 12.125 C 39.695312 11.9375 39.695312 11.746094 39.695312 11.550781 C 39.875 11.5 40.054688 11.460938 40.234375 11.425781 C 40.265625 11.417969 40.265625 11.417969 40.296875 11.410156 C 40.316406 11.40625 40.335938 11.402344 40.355469 11.398438 C 40.375 11.394531 40.394531 11.390625 40.410156 11.386719 C 40.46875 11.378906 40.523438 11.378906 40.585938 11.378906 C 40.582031 10.886719 40.578125 10.390625 40.574219 9.898438 C 40.574219 9.667969 40.574219 9.4375 40.570312 9.207031 C 40.570312 9.007812 40.570312 8.808594 40.570312 8.605469 C 40.566406 8.5 40.566406 8.394531 40.566406 8.289062 C 40.566406 8.191406 40.566406 8.089844 40.566406 7.988281 C 40.566406 7.953125 40.566406 7.917969 40.566406 7.878906 C 40.5625 7.683594 40.558594 7.488281 40.550781 7.292969 C 40.546875 7.273438 40.546875 7.253906 40.546875 7.234375 C 40.542969 7.140625 40.542969 7.140625 40.511719 7.050781 C 40.445312 7.035156 40.378906 7.027344 40.308594 7.019531 C 40.289062 7.015625 40.269531 7.011719 40.25 7.011719 C 40.183594 7.003906 40.121094 6.996094 40.054688 6.988281 C 40.011719 6.980469 39.96875 6.976562 39.921875 6.96875 C 39.816406 6.957031 39.707031 6.941406 39.601562 6.929688 C 39.601562 6.746094 39.601562 6.5625 39.601562 6.375 C 39.964844 6.242188 40.328125 6.109375 40.695312 5.980469 C 40.777344 5.953125 40.859375 5.921875 40.945312 5.894531 C 41 5.875 41.054688 5.855469 41.109375 5.835938 C 41.246094 5.789062 41.386719 5.738281 41.523438 5.6875 C 41.550781 5.675781 41.578125 5.667969 41.605469 5.65625 C 41.660156 5.636719 41.710938 5.617188 41.761719 5.597656 C 41.785156 5.589844 41.808594 5.578125 41.835938 5.570312 C 41.863281 5.558594 41.863281 5.558594 41.894531 5.546875 C 42.027344 5.515625 42.09375 5.585938 42.214844 5.652344 Z M 42.214844 5.652344 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 8.640625 9.261719 C 8.972656 9.519531 9.191406 9.859375 9.277344 10.273438 C 9.328125 10.675781 9.265625 11.089844 9.019531 11.421875 C 8.734375 11.769531 8.371094 12.007812 7.917969 12.058594 C 7.476562 12.09375 7.078125 11.957031 6.742188 11.667969 C 6.71875 11.648438 6.71875 11.648438 6.695312 11.628906 C 6.421875 11.378906 6.261719 10.992188 6.234375 10.628906 C 6.226562 10.179688 6.355469 9.789062 6.664062 9.457031 C 7.191406 8.921875 8.019531 8.84375 8.640625 9.261719 Z M 8.640625 9.261719 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 2.855469 4.089844 C 2.941406 4.15625 3.019531 4.230469 3.097656 4.308594 C 3.113281 4.324219 3.128906 4.339844 3.148438 4.359375 C 3.414062 4.640625 3.542969 5.027344 3.539062 5.410156 C 3.519531 5.851562 3.332031 6.21875 3.015625 6.527344 C 2.707031 6.792969 2.304688 6.921875 1.898438 6.898438 C 1.578125 6.871094 1.308594 6.769531 1.054688 6.570312 C 1.03125 6.546875 1.03125 6.546875 1.003906 6.527344 C 0.699219 6.277344 0.527344 5.898438 0.484375 5.511719 C 0.453125 5.121094 0.558594 4.730469 0.804688 4.425781 C 1.003906 4.191406 1.226562 4.03125 1.511719 3.921875 C 1.53125 3.914062 1.550781 3.90625 1.570312 3.898438 C 1.988281 3.757812 2.496094 3.84375 2.855469 4.089844 Z M 2.855469 4.089844 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 2.960938 11.683594 C 3.269531 11.949219 3.492188 12.316406 3.53125 12.726562 C 3.558594 13.152344 3.449219 13.550781 3.171875 13.878906 C 2.875 14.203125 2.519531 14.375 2.082031 14.417969 C 1.671875 14.433594 1.28125 14.28125 0.972656 14.011719 C 0.660156 13.714844 0.488281 13.324219 0.476562 12.890625 C 0.480469 12.53125 0.59375 12.214844 0.816406 11.933594 C 0.828125 11.917969 0.839844 11.902344 0.851562 11.882812 C 1.078125 11.597656 1.433594 11.421875 1.785156 11.363281 C 2.207031 11.316406 2.628906 11.417969 2.960938 11.683594 Z M 2.960938 11.683594 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 14.449219 4.167969 C 14.507812 4.222656 14.5625 4.273438 14.617188 4.332031 C 14.628906 4.34375 14.640625 4.355469 14.65625 4.367188 C 14.914062 4.632812 15.015625 5.023438 15.03125 5.378906 C 15.019531 5.734375 14.902344 6.046875 14.6875 6.328125 C 14.675781 6.34375 14.664062 6.359375 14.652344 6.378906 C 14.410156 6.679688 14.042969 6.851562 13.664062 6.898438 C 13.242188 6.925781 12.84375 6.816406 12.523438 6.535156 C 12.484375 6.5 12.445312 6.460938 12.40625 6.425781 C 12.394531 6.410156 12.378906 6.394531 12.363281 6.378906 C 12.085938 6.089844 11.988281 5.707031 11.992188 5.316406 C 12.003906 4.914062 12.167969 4.53125 12.457031 4.25 C 13.023438 3.75 13.847656 3.714844 14.449219 4.167969 Z M 14.449219 4.167969 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 42.046875 2.648438 C 42.253906 2.816406 42.375 3.03125 42.40625 3.296875 C 42.433594 3.558594 42.351562 3.808594 42.191406 4.019531 C 42.007812 4.214844 41.785156 4.351562 41.507812 4.363281 C 41.46875 4.363281 41.429688 4.363281 41.390625 4.363281 C 41.371094 4.363281 41.351562 4.363281 41.332031 4.363281 C 41.058594 4.355469 40.832031 4.273438 40.625 4.089844 C 40.476562 3.933594 40.359375 3.734375 40.34375 3.511719 C 40.34375 3.496094 40.339844 3.480469 40.339844 3.460938 C 40.328125 3.230469 40.390625 2.992188 40.542969 2.8125 C 40.554688 2.796875 40.570312 2.78125 40.585938 2.765625 C 40.597656 2.75 40.613281 2.734375 40.632812 2.714844 C 41.019531 2.339844 41.621094 2.332031 42.046875 2.648438 Z M 42.046875 2.648438 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,11.372549%,14.117648%);fill-opacity:1;",
+							"d": "M 93.210938 2.566406 C 93.453125 2.757812 93.570312 2.96875 93.609375 3.273438 C 93.621094 3.53125 93.550781 3.773438 93.378906 3.972656 C 93.367188 3.988281 93.351562 4.003906 93.335938 4.019531 C 93.316406 4.039062 93.316406 4.039062 93.296875 4.058594 C 93.066406 4.28125 92.78125 4.316406 92.476562 4.3125 C 92.355469 4.308594 92.25 4.285156 92.136719 4.234375 C 92.117188 4.226562 92.101562 4.21875 92.082031 4.210938 C 91.871094 4.105469 91.703125 3.9375 91.605469 3.722656 C 91.515625 3.449219 91.515625 3.171875 91.632812 2.90625 C 91.773438 2.652344 92 2.484375 92.277344 2.402344 C 92.605469 2.324219 92.933594 2.375 93.210938 2.566406 Z M 93.210938 2.566406 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 8.320312 5.960938 C 8.539062 6.117188 8.664062 6.320312 8.726562 6.582031 C 8.769531 6.839844 8.710938 7.089844 8.574219 7.3125 C 8.410156 7.535156 8.207031 7.65625 7.945312 7.722656 C 7.621094 7.753906 7.355469 7.6875 7.105469 7.484375 C 6.921875 7.3125 6.8125 7.078125 6.792969 6.832031 C 6.789062 6.535156 6.871094 6.28125 7.078125 6.0625 C 7.4375 5.738281 7.914062 5.710938 8.320312 5.960938 Z M 8.320312 5.960938 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.431373%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 14.09375 0.820312 C 14.289062 0.96875 14.421875 1.179688 14.472656 1.417969 C 14.5 1.714844 14.464844 1.980469 14.273438 2.214844 C 14.082031 2.421875 13.890625 2.558594 13.605469 2.582031 C 13.320312 2.585938 13.078125 2.535156 12.863281 2.332031 C 12.660156 2.128906 12.550781 1.910156 12.542969 1.621094 C 12.546875 1.332031 12.644531 1.117188 12.839844 0.910156 C 13.199219 0.574219 13.6875 0.5625 14.09375 0.820312 Z M 14.09375 0.820312 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 2.574219 0.808594 C 2.769531 0.972656 2.925781 1.164062 2.976562 1.417969 C 2.996094 1.71875 2.972656 1.976562 2.777344 2.214844 C 2.585938 2.421875 2.394531 2.558594 2.109375 2.582031 C 1.824219 2.585938 1.582031 2.53125 1.367188 2.332031 C 1.226562 2.195312 1.136719 2.066406 1.078125 1.875 C 1.074219 1.863281 1.070312 1.847656 1.066406 1.832031 C 1.015625 1.570312 1.054688 1.3125 1.195312 1.089844 C 1.515625 0.644531 2.101562 0.484375 2.574219 0.808594 Z M 2.574219 0.808594 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 2.550781 8.316406 C 2.582031 8.34375 2.609375 8.371094 2.640625 8.398438 C 2.65625 8.414062 2.671875 8.429688 2.691406 8.445312 C 2.878906 8.640625 2.960938 8.847656 2.964844 9.121094 C 2.960938 9.398438 2.882812 9.613281 2.6875 9.816406 C 2.5 9.996094 2.257812 10.109375 1.992188 10.105469 C 1.695312 10.085938 1.449219 9.972656 1.246094 9.753906 C 1.074219 9.535156 1.003906 9.277344 1.03125 9 C 1.089844 8.710938 1.214844 8.484375 1.453125 8.3125 C 1.789062 8.105469 2.222656 8.085938 2.550781 8.316406 Z M 2.550781 8.316406 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 14.058594 8.34375 C 14.269531 8.496094 14.425781 8.714844 14.472656 8.972656 C 14.496094 9.300781 14.441406 9.542969 14.238281 9.804688 C 14.148438 9.90625 14.042969 9.972656 13.921875 10.03125 C 13.894531 10.046875 13.894531 10.046875 13.867188 10.058594 C 13.660156 10.144531 13.386719 10.136719 13.175781 10.066406 C 12.929688 9.960938 12.714844 9.769531 12.613281 9.519531 C 12.601562 9.484375 12.585938 9.445312 12.574219 9.40625 C 12.570312 9.390625 12.566406 9.378906 12.5625 9.363281 C 12.511719 9.109375 12.550781 8.855469 12.679688 8.632812 C 12.824219 8.421875 13.003906 8.277344 13.246094 8.203125 C 13.261719 8.199219 13.277344 8.195312 13.292969 8.191406 C 13.570312 8.136719 13.820312 8.195312 14.058594 8.34375 Z M 14.058594 8.34375 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 8.375 13.523438 C 8.605469 13.730469 8.71875 13.984375 8.742188 14.289062 C 8.734375 14.554688 8.621094 14.789062 8.445312 14.984375 C 8.25 15.164062 7.996094 15.25 7.734375 15.253906 C 7.46875 15.242188 7.25 15.136719 7.0625 14.953125 C 6.863281 14.730469 6.789062 14.488281 6.792969 14.195312 C 6.832031 13.894531 6.964844 13.664062 7.199219 13.472656 C 7.582031 13.230469 8.015625 13.25 8.375 13.523438 Z M 8.375 13.523438 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 14.027344 12.066406 C 14.25 12.234375 14.421875 12.449219 14.472656 12.726562 C 14.492188 13.019531 14.464844 13.269531 14.273438 13.5 C 14.089844 13.699219 13.886719 13.84375 13.609375 13.863281 C 13.3125 13.867188 13.058594 13.800781 12.832031 13.589844 C 12.730469 13.480469 12.65625 13.371094 12.601562 13.234375 C 12.589844 13.207031 12.582031 13.183594 12.570312 13.15625 C 12.519531 12.886719 12.539062 12.625 12.679688 12.386719 C 12.984375 11.945312 13.558594 11.765625 14.027344 12.066406 Z M 14.027344 12.066406 "
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"style": " stroke:none;fill-rule:nonzero;fill:rgb(98.823529%,73.725492%,19.607843%);fill-opacity:1;",
+							"d": "M 8.269531 2.203125 C 8.492188 2.371094 8.652344 2.574219 8.703125 2.855469 C 8.738281 3.113281 8.695312 3.371094 8.535156 3.582031 C 8.355469 3.796875 8.136719 3.949219 7.851562 3.976562 C 7.539062 3.988281 7.289062 3.894531 7.054688 3.679688 C 6.851562 3.449219 6.796875 3.222656 6.808594 2.914062 C 6.824219 2.671875 6.929688 2.480469 7.105469 2.308594 C 7.445312 2.039062 7.886719 1.964844 8.269531 2.203125 Z M 8.269531 2.203125 "
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "WeaveIconBig"
+}
diff --git a/app/components/base/icons/src/public/tracing/WeaveIconBig.tsx b/app/components/base/icons/src/public/tracing/WeaveIconBig.tsx
new file mode 100644
index 0000000..1d2bb9f
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/WeaveIconBig.tsx
@@ -0,0 +1,16 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './WeaveIconBig.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconBaseProps, IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = React.forwardRef<React.MutableRefObject<SVGElement>, Omit<IconBaseProps, 'data'>>((
+  props,
+  ref,
+) => <IconBase {...props} ref={ref} data={data as IconData} />)
+
+Icon.displayName = 'WeaveIconBig'
+
+export default Icon
diff --git a/app/components/base/icons/src/public/tracing/index.ts b/app/components/base/icons/src/public/tracing/index.ts
new file mode 100644
index 0000000..36b59e4
--- /dev/null
+++ b/app/components/base/icons/src/public/tracing/index.ts
@@ -0,0 +1,9 @@
+export { default as LangfuseIconBig } from './LangfuseIconBig'
+export { default as LangfuseIcon } from './LangfuseIcon'
+export { default as LangsmithIconBig } from './LangsmithIconBig'
+export { default as LangsmithIcon } from './LangsmithIcon'
+export { default as OpikIconBig } from './OpikIconBig'
+export { default as OpikIcon } from './OpikIcon'
+export { default as TracingIcon } from './TracingIcon'
+export { default as WeaveIconBig } from './WeaveIconBig'
+export { default as WeaveIcon } from './WeaveIcon'
diff --git a/app/components/base/icons/src/vender/features/Citations.json b/app/components/base/icons/src/vender/features/Citations.json
new file mode 100644
index 0000000..1b0b625
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/Citations.json
@@ -0,0 +1,26 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M1 12C1 5.92487 5.92487 1 12 1C18.0751 1 23 5.92487 23 12C23 18.0751 18.0751 23 12 23C5.92487 23 1 18.0751 1 12ZM7 11.9702V14.958H11.0356V11.2339H8.8125C8.78418 10.8185 8.85498 10.4173 9.0249 10.0303C9.35531 9.29395 10.002 8.77474 10.9648 8.47266V7C9.67155 7.25488 8.68506 7.79297 8.00537 8.61426C7.33512 9.43555 7 10.5542 7 11.9702ZM15.0391 10.0586C15.3695 9.29395 16.0114 8.7653 16.9648 8.47266V7C15.7093 7.25488 14.7323 7.78825 14.0337 8.6001C13.3446 9.41195 13 10.5353 13 11.9702V14.958H17.0356V11.2339H14.8125C14.7747 10.8563 14.8503 10.4645 15.0391 10.0586Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Citations"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/features/Citations.tsx b/app/components/base/icons/src/vender/features/Citations.tsx
new file mode 100644
index 0000000..439aab6
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/Citations.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Citations.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Citations'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/features/ContentModeration.json b/app/components/base/icons/src/vender/features/ContentModeration.json
new file mode 100644
index 0000000..4f5c47a
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/ContentModeration.json
@@ -0,0 +1,28 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M7.16146 3H16.8385C17.3657 2.99998 17.8205 2.99997 18.195 3.03057C18.5904 3.06287 18.9836 3.13419 19.362 3.32698C19.9265 3.6146 20.3854 4.07354 20.673 4.63803C20.8658 5.01641 20.9371 5.40963 20.9694 5.80497C21 6.17954 21 6.6343 21 7.16144V16.8386C21 17.3657 21 17.8205 20.9694 18.195C20.9371 18.5904 20.8658 18.9836 20.673 19.362C20.3854 19.9265 19.9265 20.3854 19.362 20.673C18.9836 20.8658 18.5904 20.9371 18.195 20.9694C17.8205 21 17.3657 21 16.8386 21H7.16144C6.6343 21 6.17954 21 5.80497 20.9694C5.40963 20.9371 5.01641 20.8658 4.63803 20.673C4.07354 20.3854 3.6146 19.9265 3.32698 19.362C3.13419 18.9836 3.06287 18.5904 3.03057 18.195C2.99997 17.8205 2.99998 17.3657 3 16.8386V7.16145C2.99998 6.63432 2.99997 6.17954 3.03057 5.80497C3.06287 5.40963 3.13419 5.01641 3.32698 4.63803C3.6146 4.07354 4.07354 3.6146 4.63803 3.32698C5.01641 3.13419 5.40963 3.06287 5.80497 3.03057C6.17954 2.99997 6.63432 2.99998 7.16146 3ZM17 9C17 8.44772 16.5523 8 16 8C15.4477 8 15 8.44772 15 9V15C15 15.5523 15.4477 16 16 16C16.5523 16 17 15.5523 17 15V9ZM9 12C9 12.5523 8.55229 13 8 13C7.44772 13 7 12.5523 7 12C7 11.4477 7.44772 11 8 11C8.55229 11 9 11.4477 9 12ZM12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "ContentModeration"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/features/ContentModeration.tsx b/app/components/base/icons/src/vender/features/ContentModeration.tsx
new file mode 100644
index 0000000..baf9629
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/ContentModeration.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ContentModeration.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ContentModeration'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/features/Document.json b/app/components/base/icons/src/vender/features/Document.json
new file mode 100644
index 0000000..fdd08d5
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/Document.json
@@ -0,0 +1,23 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"xmlns": "http://www.w3.org/2000/svg",
+			"viewBox": "0 0 24 24",
+			"fill": "currentColor"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M20 22H4C3.44772 22 3 21.5523 3 21V3C3 2.44772 3.44772 2 4 2H20C20.5523 2 21 2.44772 21 3V21C21 21.5523 20.5523 22 20 22ZM7 6V10H11V6H7ZM7 12V14H17V12H7ZM7 16V18H17V16H7ZM13 7V9H17V7H13Z"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Document"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/features/Document.tsx b/app/components/base/icons/src/vender/features/Document.tsx
new file mode 100644
index 0000000..05c0180
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/Document.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Document.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Document'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/features/FolderUpload.json b/app/components/base/icons/src/vender/features/FolderUpload.json
new file mode 100644
index 0000000..2180127
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/FolderUpload.json
@@ -0,0 +1,26 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M2 6C2 4.34315 3.34315 3 5 3H8.92963C9.93269 3 10.8694 3.5013 11.4258 4.3359L12.5352 6H19C20.6569 6 22 7.34315 22 9V17C22 18.6569 20.6569 20 19 20H13V15.4142L13.7929 16.2071C14.1834 16.5976 14.8166 16.5976 15.2071 16.2071C15.5976 15.8166 15.5976 15.1834 15.2071 14.7929L12.7071 12.2929C12.3166 11.9024 11.6834 11.9024 11.2929 12.2929L8.79289 14.7929C8.40237 15.1834 8.40237 15.8166 8.79289 16.2071C9.18342 16.5976 9.81658 16.5976 10.2071 16.2071L11 15.4142V20H5C3.34315 20 2 18.6569 2 17V6Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "FolderUpload"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/features/FolderUpload.tsx b/app/components/base/icons/src/vender/features/FolderUpload.tsx
new file mode 100644
index 0000000..27b38ae
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/FolderUpload.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './FolderUpload.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'FolderUpload'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/features/LoveMessage.json b/app/components/base/icons/src/vender/features/LoveMessage.json
new file mode 100644
index 0000000..7dbc062
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/LoveMessage.json
@@ -0,0 +1,26 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M22 11.3333C22 6.73833 17.5142 3 12 3C6.48583 3 2 6.73833 2 11.3333C2 15.9283 6.48583 19.6667 11.9825 19.6667C12.8404 19.6814 13.6965 19.5839 14.5292 19.3767L19.1858 21.2725C19.2857 21.3127 19.3924 21.3333 19.5 21.3333C19.6175 21.3334 19.7337 21.3086 19.8409 21.2606C19.9481 21.2126 20.044 21.1425 20.1222 21.0548C20.2004 20.9672 20.2592 20.8639 20.2948 20.7519C20.3303 20.64 20.3417 20.5217 20.3283 20.405L19.8742 16.4733C21.1944 15.0821 21.9518 13.2507 22 11.3333ZM15.3917 12.0533L12.0317 15.47C12.0231 15.4784 12.0116 15.4831 11.9996 15.4831C11.9876 15.4831 11.9761 15.4784 11.9675 15.47L8.60917 12.0533C8.18149 11.6398 7.91983 11.0841 7.87347 10.491C7.82712 9.89789 7.99927 9.30831 8.3575 8.83333C8.57837 8.56064 8.85996 8.3434 9.17978 8.19896C9.49959 8.05451 9.84875 7.98687 10.1994 8.00145C10.55 8.01603 10.8923 8.11241 11.199 8.2829C11.5058 8.45339 11.7684 8.69325 11.9658 8.98333C11.9695 8.98883 11.9744 8.99335 11.9803 8.99647C11.9861 8.99959 11.9926 9.00122 11.9992 9.00122C12.0058 9.00122 12.0123 8.99959 12.0181 8.99647C12.0239 8.99335 12.0289 8.98883 12.0325 8.98333C12.23 8.69325 12.4926 8.45339 12.7993 8.2829C13.106 8.11241 13.4484 8.01603 13.799 8.00145C14.1496 7.98687 14.4987 8.05451 14.8186 8.19896C15.1384 8.3434 15.42 8.56064 15.6408 8.83333C15.9997 9.30788 16.1725 9.89736 16.1266 10.4906C16.0807 11.0838 15.8193 11.6397 15.3917 12.0533Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "LoveMessage"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/features/LoveMessage.tsx b/app/components/base/icons/src/vender/features/LoveMessage.tsx
new file mode 100644
index 0000000..c4cdcfd
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/LoveMessage.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LoveMessage.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LoveMessage'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/features/MessageFast.json b/app/components/base/icons/src/vender/features/MessageFast.json
new file mode 100644
index 0000000..4580398
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/MessageFast.json
@@ -0,0 +1,28 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M16.2414 2H7.7588C6.95383 1.99999 6.28946 1.99998 5.74827 2.04419C5.18617 2.09012 4.66947 2.18868 4.18413 2.43598C3.43149 2.81947 2.81956 3.43139 2.43607 4.18404C2.18878 4.66937 2.09022 5.18608 2.04429 5.74818C2.00007 6.28937 2.00008 6.95373 2.0001 7.7587L2.00005 14.1376C1.99962 14.933 1.9993 15.5236 2.13639 16.0353C2.50626 17.4156 3.58445 18.4938 4.96482 18.8637C5.27229 18.9461 5.60829 18.9789 6.0001 18.9918L6.00009 20.371C6.00005 20.6062 6 20.846 6.01785 21.0425C6.03492 21.2305 6.08012 21.5852 6.32778 21.8955C6.61276 22.2525 7.0449 22.4602 7.50172 22.4597C7.8987 22.4593 8.20394 22.273 8.36137 22.1689C8.52597 22.06 8.7132 21.9102 8.89688 21.7632L11.31 19.8327C11.8286 19.4178 11.9826 19.3007 12.1425 19.219C12.303 19.137 12.4738 19.0771 12.6504 19.0408C12.8263 19.0047 13.0197 19 13.6838 19H16.2414C17.0464 19 17.7107 19 18.2519 18.9558C18.814 18.9099 19.3307 18.8113 19.8161 18.564C20.5687 18.1805 21.1806 17.5686 21.5641 16.816C21.8114 16.3306 21.91 15.8139 21.9559 15.2518C22.0001 14.7106 22.0001 14.0463 22.0001 13.2413V7.75868C22.0001 6.95372 22.0001 6.28936 21.9559 5.74818C21.91 5.18608 21.8114 4.66937 21.5641 4.18404C21.1806 3.43139 20.5687 2.81947 19.8161 2.43598C19.3307 2.18868 18.814 2.09012 18.2519 2.04419C17.7107 1.99998 17.0464 1.99999 16.2414 2ZM12.681 5.5349C12.8938 5.61898 13.0218 5.83714 12.9916 6.06386L12.5688 9.23501L14.48 9.23501C14.5899 9.23498 14.7038 9.23496 14.7979 9.24356C14.8905 9.25203 15.0589 9.27446 15.2095 9.39066C15.3851 9.52617 15.4913 9.73269 15.4996 9.95432C15.5066 10.1444 15.427 10.2945 15.38 10.3747C15.3324 10.4563 15.2661 10.549 15.2022 10.6384L11.9072 15.2514C11.7743 15.4375 11.5317 15.5092 11.319 15.4251C11.1063 15.341 10.9782 15.1229 11.0084 14.8961L11.4312 11.725L9.52004 11.725C9.41011 11.725 9.29618 11.725 9.20206 11.7164C9.10948 11.708 8.94106 11.6855 8.79051 11.5693C8.61493 11.4338 8.50866 11.2273 8.50044 11.0057C8.49339 10.8156 8.57303 10.6655 8.61996 10.5853C8.66766 10.5037 8.7339 10.411 8.79781 10.3216L12.0928 5.70858C12.2257 5.52246 12.4683 5.45083 12.681 5.5349Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "MessageFast"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/features/MessageFast.tsx b/app/components/base/icons/src/vender/features/MessageFast.tsx
new file mode 100644
index 0000000..45a1e77
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/MessageFast.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './MessageFast.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'MessageFast'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/features/Microphone01.json b/app/components/base/icons/src/vender/features/Microphone01.json
new file mode 100644
index 0000000..a4ba1bc
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/Microphone01.json
@@ -0,0 +1,37 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M12 1C9.79086 1 8 2.79086 8 5V12C8 14.2091 9.79086 16 12 16C14.2091 16 16 14.2091 16 12V5C16 2.79086 14.2091 1 12 1Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M6 10C6 9.44771 5.55228 9 5 9C4.44772 9 4 9.44771 4 10V12C4 16.0803 7.05466 19.4471 11.0019 19.9383C11.0006 19.9587 11 19.9793 11 20V21H8C7.44772 21 7 21.4477 7 22C7 22.5523 7.44772 23 8 23H16C16.5523 23 17 22.5523 17 22C17 21.4477 16.5523 21 16 21H13V20C13 19.9793 12.9994 19.9587 12.9981 19.9383C16.9453 19.4471 20 16.0803 20 12V10C20 9.44771 19.5523 9 19 9C18.4477 9 18 9.44771 18 10V12C18 15.3137 15.3137 18 12 18C8.68629 18 6 15.3137 6 12V10Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Microphone01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/features/Microphone01.tsx b/app/components/base/icons/src/vender/features/Microphone01.tsx
new file mode 100644
index 0000000..37fb66a
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/Microphone01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Microphone01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Microphone01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/features/TextToAudio.json b/app/components/base/icons/src/vender/features/TextToAudio.json
new file mode 100644
index 0000000..1d824f7
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/TextToAudio.json
@@ -0,0 +1,77 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M1 5.02263C1 3.90973 1.90219 3.00754 3.01509 3.00754H9.06035C10.1733 3.00754 11.0754 3.90973 11.0754 5.02263C11.0754 5.57908 10.6243 6.03017 10.0679 6.03017C9.51144 6.03017 9.06035 5.57908 9.06035 5.02263H7.04526V12.0754C7.60171 12.0754 8.0528 12.5265 8.0528 13.083C8.0528 13.6394 7.60171 14.0905 7.04526 14.0905H5.03017C4.47372 14.0905 4.02263 13.6394 4.02263 13.083C4.02263 12.5265 4.47372 12.0754 5.03017 12.0754V5.02263H3.01509C3.01509 5.57908 2.56399 6.03017 2.00754 6.03017C1.45109 6.03017 1 5.57908 1 5.02263Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M19.9883 2.15888C19.8823 1.94704 19.58 1.94704 19.4741 2.15888C18.8148 3.47752 18.6898 3.6025 17.3712 4.26182C17.1593 4.36774 17.1593 4.67004 17.3712 4.77596C18.6898 5.43528 18.8148 5.56026 19.4741 6.8789C19.58 7.09074 19.8823 7.09074 19.9883 6.8789C20.6476 5.56026 20.7726 5.43528 22.0912 4.77596C22.303 4.67004 22.303 4.36774 22.0912 4.26182C20.7726 3.6025 20.6476 3.47752 19.9883 2.15888Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M14.4561 4.17977C14.3463 3.96019 14.033 3.96019 13.9232 4.17977C13.4339 5.15833 13.3178 5.27443 12.3393 5.76371C12.1197 5.8735 12.1197 6.18685 12.3393 6.29664C13.3178 6.78592 13.4339 6.90202 13.9232 7.88058C14.033 8.10016 14.3463 8.10016 14.4561 7.88058C14.9454 6.90202 15.0615 6.78592 16.0401 6.29664C16.2596 6.18685 16.2596 5.8735 16.0401 5.76371C15.0615 5.27443 14.9454 5.15833 14.4561 4.17977Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M4.78347 16.2645C4.67755 16.0527 4.37525 16.0526 4.26933 16.2645C3.61002 17.5831 3.48505 17.7081 2.16642 18.3674C1.95458 18.4733 1.95458 18.7756 2.16642 18.8815C3.48505 19.5408 3.61002 19.6658 4.26933 20.9844C4.37525 21.1963 4.67755 21.1963 4.78347 20.9844C5.44278 19.6658 5.56776 19.5408 6.88638 18.8815C7.09822 18.7756 7.09822 18.4733 6.88638 18.3674C5.56776 17.7081 5.44278 17.5831 4.78347 16.2645Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M21.1611 12.97C21.4558 12.7644 21.8613 12.8367 22.0668 13.1313C22.655 13.9746 23 15.0008 23 16.1056C23 17.2105 22.655 18.2367 22.0668 19.0799C21.8613 19.3745 21.4558 19.4468 21.1611 19.2413C20.8664 19.0357 20.7942 18.6302 20.9997 18.3355C21.4405 17.7036 21.699 16.9358 21.699 16.1056C21.699 15.2755 21.4405 14.5076 20.9997 13.8757C20.7942 13.581 20.8664 13.1755 21.1611 12.97Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M18.2666 10.0664C18.578 10.0419 18.8823 10.1679 19.0852 10.4054C19.2668 10.6181 19.2957 10.8739 19.3067 10.9981C19.319 11.1373 19.319 11.3102 19.319 11.4861C19.319 11.4942 19.319 11.5022 19.319 11.5103L19.319 20.7312C19.319 20.9071 19.319 21.0799 19.3067 21.2191C19.2957 21.3433 19.2668 21.5991 19.0852 21.8118C18.8823 22.0493 18.578 22.1754 18.2666 22.1509C17.9878 22.1289 17.7865 21.9684 17.6909 21.8884C17.5838 21.7987 17.4615 21.6764 17.3372 21.552L15.2607 19.4756C15.2004 19.4153 15.1702 19.3853 15.1474 19.3645L15.1457 19.3629L15.1433 19.3628C15.1124 19.3614 15.0699 19.3612 14.9847 19.3612L13.8338 19.3612C13.6696 19.3613 13.5097 19.3613 13.3743 19.3502C13.2256 19.3381 13.0502 19.3094 12.8736 19.2194C12.6288 19.0947 12.4297 18.8957 12.305 18.6509C12.215 18.4743 12.1864 18.2988 12.1742 18.1501C12.1632 18.0147 12.1632 17.8548 12.1632 17.6906L12.1632 14.5474C12.1632 14.5404 12.1632 14.5335 12.1632 14.5266C12.1632 14.3624 12.1632 14.2025 12.1742 14.0671C12.1864 13.9184 12.215 13.743 12.305 13.5664C12.4297 13.3216 12.6288 13.1225 12.8736 12.9978C13.0502 12.9078 13.2256 12.8792 13.3743 12.867C13.5097 12.856 13.6696 12.856 13.8338 12.856C13.8407 12.856 13.8476 12.856 13.8546 12.856H14.9847C15.0699 12.856 15.1124 12.8558 15.1433 12.8544L15.1457 12.8543L15.1474 12.8528C15.1702 12.8319 15.2004 12.8019 15.2607 12.7417L17.32 10.6823C17.3258 10.6766 17.3315 10.6709 17.3372 10.6652C17.4615 10.5408 17.5838 10.4185 17.6909 10.3288C17.7865 10.2488 17.9878 10.0883 18.2666 10.0664Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "TextToAudio"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/features/TextToAudio.tsx b/app/components/base/icons/src/vender/features/TextToAudio.tsx
new file mode 100644
index 0000000..1f94c10
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/TextToAudio.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './TextToAudio.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'TextToAudio'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/features/VirtualAssistant.json b/app/components/base/icons/src/vender/features/VirtualAssistant.json
new file mode 100644
index 0000000..b426eb4
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/VirtualAssistant.json
@@ -0,0 +1,35 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M21.1667 7.16667H18.6667V13C18.6667 13.663 18.4033 14.2989 17.9344 14.7678C17.4656 15.2366 16.8297 15.5 16.1667 15.5H11.5L8.5 18H14.095L17.9792 21.2367C18.0549 21.3004 18.151 21.3347 18.25 21.3333C18.311 21.3332 18.3713 21.3198 18.4267 21.2942C18.4984 21.2606 18.5591 21.2072 18.6016 21.1404C18.6441 21.0735 18.6667 20.9959 18.6667 20.9167V18H21.1667C21.3877 18 21.5996 17.9122 21.7559 17.7559C21.9122 17.5996 22 17.3877 22 17.1667V8C22 7.77899 21.9122 7.56703 21.7559 7.41074C21.5996 7.25446 21.3877 7.16667 21.1667 7.16667Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M16.1667 3H2.83333C2.61232 3 2.40036 3.0878 2.24408 3.24408C2.0878 3.40036 2 3.61232 2 3.83333V13C2 13.221 2.0878 13.433 2.24408 13.5893C2.40036 13.7455 2.61232 13.8333 2.83333 13.8333H5.33333V17.5833C5.33331 17.6626 5.35587 17.7402 5.39838 17.807C5.44089 17.8739 5.50158 17.9272 5.57333 17.9608C5.6287 17.9865 5.68897 17.9999 5.75 18C5.84753 18.0004 5.94204 17.9661 6.01667 17.9033L10.9008 13.8333H16.1667C16.3877 13.8333 16.5996 13.7455 16.7559 13.5893C16.9122 13.433 17 13.221 17 13V3.83333C17 3.61232 16.9122 3.40036 16.7559 3.24408C16.5996 3.0878 16.3877 3 16.1667 3Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "VirtualAssistant"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/features/VirtualAssistant.tsx b/app/components/base/icons/src/vender/features/VirtualAssistant.tsx
new file mode 100644
index 0000000..eeb64a1
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/VirtualAssistant.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './VirtualAssistant.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'VirtualAssistant'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/features/Vision.json b/app/components/base/icons/src/vender/features/Vision.json
new file mode 100644
index 0000000..e9b5b4d
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/Vision.json
@@ -0,0 +1,28 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M22.357 10.5831C19.7908 6.27233 15.952 3.99997 12.0002 4C8.04853 4.00003 4.20967 6.27243 1.64354 10.5832C1.12403 11.4559 1.12403 12.5442 1.64354 13.4169C4.20968 17.7277 8.04854 20 12.0003 20C15.952 20 19.7908 17.7276 22.357 13.4168C22.8765 12.5441 22.8765 11.4558 22.357 10.5831ZM11.5528 8.89443L10.7412 10.5176C10.6928 10.6144 10.6144 10.6928 10.5176 10.7412L8.89443 11.5528C8.5259 11.737 8.5259 12.263 8.89443 12.4472L10.5176 13.2588C10.6144 13.3072 10.6928 13.3856 10.7412 13.4824L11.5528 15.1056C11.737 15.4741 12.263 15.4741 12.4472 15.1056L13.2588 13.4824C13.3072 13.3856 13.3856 13.3072 13.4824 13.2588L15.1056 12.4472C15.4741 12.263 15.4741 11.737 15.1056 11.5528L13.4824 10.7412C13.3856 10.6928 13.3072 10.6144 13.2588 10.5176L12.4472 8.89443C12.263 8.5259 11.737 8.5259 11.5528 8.89443Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Vision"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/features/Vision.tsx b/app/components/base/icons/src/vender/features/Vision.tsx
new file mode 100644
index 0000000..7b6cbf6
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/Vision.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Vision.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Vision'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/features/index.ts b/app/components/base/icons/src/vender/features/index.ts
new file mode 100644
index 0000000..853cad8
--- /dev/null
+++ b/app/components/base/icons/src/vender/features/index.ts
@@ -0,0 +1,10 @@
+export { default as Citations } from './Citations'
+export { default as ContentModeration } from './ContentModeration'
+export { default as Document } from './Document'
+export { default as FolderUpload } from './FolderUpload'
+export { default as LoveMessage } from './LoveMessage'
+export { default as MessageFast } from './MessageFast'
+export { default as Microphone01 } from './Microphone01'
+export { default as TextToAudio } from './TextToAudio'
+export { default as VirtualAssistant } from './VirtualAssistant'
+export { default as Vision } from './Vision'
diff --git a/app/components/base/icons/src/vender/line/alertsAndFeedback/AlertTriangle.json b/app/components/base/icons/src/vender/line/alertsAndFeedback/AlertTriangle.json
new file mode 100644
index 0000000..a200e60
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/alertsAndFeedback/AlertTriangle.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "alert-triangle"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M7.99977 5.33314V7.99981M7.99977 10.6665H8.00644M6.85977 1.90648L1.2131 11.3331C1.09668 11.5348 1.03508 11.7633 1.03443 11.9962C1.03378 12.229 1.0941 12.4579 1.20939 12.6602C1.32468 12.8624 1.49092 13.031 1.69157 13.149C1.89223 13.2671 2.1203 13.3306 2.3531 13.3331H13.6464C13.8792 13.3306 14.1073 13.2671 14.308 13.149C14.5086 13.031 14.6749 12.8624 14.7902 12.6602C14.9054 12.4579 14.9658 12.229 14.9651 11.9962C14.9645 11.7633 14.9029 11.5348 14.7864 11.3331L9.13977 1.90648C9.02092 1.71055 8.85358 1.54856 8.6539 1.43613C8.45422 1.32371 8.22893 1.26465 7.99977 1.26465C7.77061 1.26465 7.54532 1.32371 7.34564 1.43613C7.14596 1.54856 6.97862 1.71055 6.85977 1.90648Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "AlertTriangle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/alertsAndFeedback/AlertTriangle.tsx b/app/components/base/icons/src/vender/line/alertsAndFeedback/AlertTriangle.tsx
new file mode 100644
index 0000000..cceacb9
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/alertsAndFeedback/AlertTriangle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AlertTriangle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AlertTriangle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsDown.json b/app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsDown.json
new file mode 100644
index 0000000..b9ccbef
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsDown.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon",
+					"clip-path": "url(#clip0_17340_934)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon_2",
+							"d": "M11.3333 1.33398V8.66732M14.6666 6.53398V3.46732C14.6666 2.72058 14.6666 2.34721 14.5213 2.062C14.3935 1.81111 14.1895 1.60714 13.9386 1.47931C13.6534 1.33398 13.28 1.33398 12.5333 1.33398H5.41196C4.43764 1.33398 3.95048 1.33398 3.55701 1.51227C3.21022 1.66941 2.91549 1.92227 2.70745 2.24113C2.4714 2.60291 2.39732 3.08441 2.24917 4.0474L1.90045 6.31407C1.70505 7.58419 1.60735 8.21926 1.79582 8.7134C1.96125 9.14711 2.27239 9.50978 2.6759 9.73923C3.13564 10.0007 3.77818 10.0007 5.06324 10.0007H5.59995C5.97332 10.0007 6.16001 10.0007 6.30261 10.0733C6.42806 10.1372 6.53004 10.2392 6.59396 10.3647C6.66662 10.5073 6.66662 10.6939 6.66662 11.0673V13.0234C6.66662 13.9313 7.40262 14.6673 8.31051 14.6673C8.52706 14.6673 8.7233 14.5398 8.81125 14.3419L11.0518 9.30077C11.1537 9.07148 11.2046 8.95684 11.2852 8.87278C11.3563 8.79847 11.4438 8.74165 11.5406 8.70678C11.6501 8.66732 11.7756 8.66732 12.0265 8.66732H12.5333C13.28 8.66732 13.6534 8.66732 13.9386 8.52199C14.1895 8.39416 14.3935 8.19019 14.5213 7.93931C14.6666 7.65409 14.6666 7.28072 14.6666 6.53398Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_17340_934"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "16",
+									"height": "16",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "ThumbsDown"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsDown.tsx b/app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsDown.tsx
new file mode 100644
index 0000000..f2efee6
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsDown.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ThumbsDown.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ThumbsDown'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsUp.json b/app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsUp.json
new file mode 100644
index 0000000..674516b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsUp.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon",
+					"clip-path": "url(#clip0_17340_931)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon_2",
+							"d": "M4.66671 14.6673V7.33398M1.33337 8.66732V13.334C1.33337 14.0704 1.93033 14.6673 2.66671 14.6673H11.6175C12.6047 14.6673 13.4442 13.9471 13.5943 12.9714L14.3122 8.30477C14.4986 7.09325 13.5613 6.00065 12.3355 6.00065H10C9.63185 6.00065 9.33337 5.70217 9.33337 5.33398V2.97788C9.33337 2.06998 8.59738 1.33398 7.68948 1.33398C7.47293 1.33398 7.27669 1.46151 7.18875 1.6594L4.84267 6.93808C4.73567 7.17883 4.49692 7.33398 4.23346 7.33398H2.66671C1.93033 7.33398 1.33337 7.93094 1.33337 8.66732Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_17340_931"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "16",
+									"height": "16",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "ThumbsUp"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsUp.tsx b/app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsUp.tsx
new file mode 100644
index 0000000..dadd80c
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/alertsAndFeedback/ThumbsUp.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ThumbsUp.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ThumbsUp'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/alertsAndFeedback/index.ts b/app/components/base/icons/src/vender/line/alertsAndFeedback/index.ts
new file mode 100644
index 0000000..f0a0faf
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/alertsAndFeedback/index.ts
@@ -0,0 +1,3 @@
+export { default as AlertTriangle } from './AlertTriangle'
+export { default as ThumbsDown } from './ThumbsDown'
+export { default as ThumbsUp } from './ThumbsUp'
diff --git a/app/components/base/icons/src/vender/line/arrows/ArrowNarrowLeft.json b/app/components/base/icons/src/vender/line/arrows/ArrowNarrowLeft.json
new file mode 100644
index 0000000..73d6708
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/ArrowNarrowLeft.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "17",
+			"height": "16",
+			"viewBox": "0 0 17 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M13.3625 8H2.6958M2.6958 8L6.6958 12M2.6958 8L6.6958 4",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "ArrowNarrowLeft"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/arrows/ArrowNarrowLeft.tsx b/app/components/base/icons/src/vender/line/arrows/ArrowNarrowLeft.tsx
new file mode 100644
index 0000000..1c3b82e
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/ArrowNarrowLeft.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ArrowNarrowLeft.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ArrowNarrowLeft'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/arrows/ArrowUpRight.json b/app/components/base/icons/src/vender/line/arrows/ArrowUpRight.json
new file mode 100644
index 0000000..9ab1e6e
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/ArrowUpRight.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "arrow-up-right"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M4.08325 9.91665L9.91659 4.08331M9.91659 4.08331H4.08325M9.91659 4.08331V9.91665",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ArrowUpRight"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/arrows/ArrowUpRight.tsx b/app/components/base/icons/src/vender/line/arrows/ArrowUpRight.tsx
new file mode 100644
index 0000000..6c3293f
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/ArrowUpRight.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ArrowUpRight.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ArrowUpRight'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/arrows/ChevronDownDouble.json b/app/components/base/icons/src/vender/line/arrows/ChevronDownDouble.json
new file mode 100644
index 0000000..cfae439
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/ChevronDownDouble.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "13",
+			"viewBox": "0 0 12 13",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "chevron-down-double"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M3.5 7L6 9.5L8.5 7M3.5 3.5L6 6L8.5 3.5",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ChevronDownDouble"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/arrows/ChevronDownDouble.tsx b/app/components/base/icons/src/vender/line/arrows/ChevronDownDouble.tsx
new file mode 100644
index 0000000..aa134fa
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/ChevronDownDouble.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ChevronDownDouble.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ChevronDownDouble'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/arrows/ChevronRight.json b/app/components/base/icons/src/vender/line/arrows/ChevronRight.json
new file mode 100644
index 0000000..c144e67
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/ChevronRight.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "chevron-right"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M5.25 10.5L8.75 7L5.25 3.5",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ChevronRight"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/arrows/ChevronRight.tsx b/app/components/base/icons/src/vender/line/arrows/ChevronRight.tsx
new file mode 100644
index 0000000..befecea
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/ChevronRight.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ChevronRight.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ChevronRight'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/arrows/ChevronSelectorVertical.json b/app/components/base/icons/src/vender/line/arrows/ChevronSelectorVertical.json
new file mode 100644
index 0000000..84da1f3
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/ChevronSelectorVertical.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M7 15L12 20L17 15M7 9L12 4L17 9",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "ChevronSelectorVertical"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/arrows/ChevronSelectorVertical.tsx b/app/components/base/icons/src/vender/line/arrows/ChevronSelectorVertical.tsx
new file mode 100644
index 0000000..7c19420
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/ChevronSelectorVertical.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ChevronSelectorVertical.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ChevronSelectorVertical'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/arrows/RefreshCcw01.json b/app/components/base/icons/src/vender/line/arrows/RefreshCcw01.json
new file mode 100644
index 0000000..30033b4
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/RefreshCcw01.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M2 10C2 10 4.00498 7.26822 5.63384 5.63824C7.26269 4.00827 9.5136 3 12 3C16.9706 3 21 7.02944 21 12C21 16.9706 16.9706 21 12 21C7.89691 21 4.43511 18.2543 3.35177 14.5M2 10V4M2 10H8",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "RefreshCcw01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/arrows/RefreshCcw01.tsx b/app/components/base/icons/src/vender/line/arrows/RefreshCcw01.tsx
new file mode 100644
index 0000000..f0caf73
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/RefreshCcw01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './RefreshCcw01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'RefreshCcw01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/arrows/RefreshCw05.json b/app/components/base/icons/src/vender/line/arrows/RefreshCw05.json
new file mode 100644
index 0000000..5468171
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/RefreshCw05.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M5.69773 13.1783C7.29715 13.8879 9.20212 13.8494 10.8334 12.9075C13.5438 11.3427 14.4724 7.87704 12.9076 5.16672L12.7409 4.87804M3.09233 10.8335C1.52752 8.12314 2.45615 4.65746 5.16647 3.09265C6.7978 2.15081 8.70277 2.11227 10.3022 2.82185M1.66226 10.8892L3.48363 11.3773L3.97166 9.5559M12.0284 6.44393L12.5164 4.62256L14.3378 5.1106",
+					"stroke": "currentColor",
+					"stroke-width": "1.5",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "RefreshCw05"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/arrows/RefreshCw05.tsx b/app/components/base/icons/src/vender/line/arrows/RefreshCw05.tsx
new file mode 100644
index 0000000..b426871
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/RefreshCw05.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './RefreshCw05.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'RefreshCw05'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/arrows/ReverseLeft.json b/app/components/base/icons/src/vender/line/arrows/ReverseLeft.json
new file mode 100644
index 0000000..48c6d1f
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/ReverseLeft.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon_2",
+							"d": "M2.66699 4.66667H9.33366C11.5428 4.66667 13.3337 6.45753 13.3337 8.66667C13.3337 10.8758 11.5428 12.6667 9.33366 12.6667H2.66699M2.66699 4.66667L5.33366 2M2.66699 4.66667L5.33366 7.33333",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ReverseLeft"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/arrows/ReverseLeft.tsx b/app/components/base/icons/src/vender/line/arrows/ReverseLeft.tsx
new file mode 100644
index 0000000..30a2e3a
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/ReverseLeft.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ReverseLeft.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ReverseLeft'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/arrows/index.ts b/app/components/base/icons/src/vender/line/arrows/index.ts
new file mode 100644
index 0000000..c329b36
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/arrows/index.ts
@@ -0,0 +1,8 @@
+export { default as ArrowNarrowLeft } from './ArrowNarrowLeft'
+export { default as ArrowUpRight } from './ArrowUpRight'
+export { default as ChevronDownDouble } from './ChevronDownDouble'
+export { default as ChevronRight } from './ChevronRight'
+export { default as ChevronSelectorVertical } from './ChevronSelectorVertical'
+export { default as RefreshCcw01 } from './RefreshCcw01'
+export { default as RefreshCw05 } from './RefreshCw05'
+export { default as ReverseLeft } from './ReverseLeft'
diff --git a/app/components/base/icons/src/vender/line/communication/AiText.json b/app/components/base/icons/src/vender/line/communication/AiText.json
new file mode 100644
index 0000000..0f5ff57
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/communication/AiText.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "ai-text"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M2.33301 10.5H4.08301M2.33301 7H5.24967M2.33301 3.5H11.6663M9.91634 5.83333L10.7913 7.875L12.833 8.75L10.7913 9.625L9.91634 11.6667L9.04134 9.625L6.99967 8.75L9.04134 7.875L9.91634 5.83333Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "AiText"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/communication/AiText.tsx b/app/components/base/icons/src/vender/line/communication/AiText.tsx
new file mode 100644
index 0000000..c1a6a24
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/communication/AiText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AiText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AiText'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/communication/ChatBot.json b/app/components/base/icons/src/vender/line/communication/ChatBot.json
new file mode 100644
index 0000000..69547f9
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/communication/ChatBot.json
@@ -0,0 +1,93 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon",
+					"clip-path": "url(#clip0_3167_27725)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M5.93972 6.47002H2.2276C1.64161 6.47002 1.16699 6.94464 1.16699 7.53063V11.7731C1.16699 12.359 1.64161 12.8337 2.2276 12.8337H9.65184C10.2378 12.8337 10.7124 12.359 10.7124 11.7731V7.53063M3.81851 4.66693V3.2882M3.81851 3.2882C4.11139 3.2882 4.34881 3.05078 4.34881 2.7579C4.34881 2.46502 4.11139 2.2276 3.81851 2.2276C3.52563 2.2276 3.2882 2.46502 3.2882 2.7579C3.2882 3.05078 3.52563 3.2882 3.81851 3.2882ZM8.06093 1.6973C8.06093 1.40457 8.29851 1.16699 8.59123 1.16699H12.3034C12.5961 1.16699 12.8337 1.40457 12.8337 1.6973V4.34881C12.8337 4.64154 12.5961 4.87911 12.3034 4.87911H9.65184L8.06093 5.93972V1.6973Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector_2"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M4.08354 9.65146C4.52286 9.65146 4.87899 9.29532 4.87899 8.856C4.87899 8.41668 4.52286 8.06055 4.08354 8.06055C3.64422 8.06055 3.28809 8.41668 3.28809 8.856C3.28809 9.29532 3.64422 9.65146 4.08354 9.65146Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M7.79566 9.65146C8.23498 9.65146 8.59112 9.29532 8.59112 8.856C8.59112 8.41668 8.23498 8.06055 7.79566 8.06055C7.35634 8.06055 7.00021 8.41668 7.00021 8.856C7.00021 9.29532 7.35634 9.65146 7.79566 9.65146Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_3167_27725"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "14",
+									"height": "14",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "ChatBot"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/communication/ChatBot.tsx b/app/components/base/icons/src/vender/line/communication/ChatBot.tsx
new file mode 100644
index 0000000..867ae31
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/communication/ChatBot.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ChatBot.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ChatBot'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/communication/ChatBotSlim.json b/app/components/base/icons/src/vender/line/communication/ChatBotSlim.json
new file mode 100644
index 0000000..07f6cda
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/communication/ChatBotSlim.json
@@ -0,0 +1,68 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "48",
+			"height": "48",
+			"viewBox": "0 0 48 48",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "chat-bot"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M13.0909 11.2727C14.0951 11.2727 14.9091 10.4587 14.9091 9.45455C14.9091 8.45039 14.0951 7.63636 13.0909 7.63636C12.0868 7.63636 11.2727 8.45039 11.2727 9.45455C11.2727 10.4587 12.0868 11.2727 13.0909 11.2727Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M20.3636 22.1818H7.63636C5.62727 22.1818 4 23.8091 4 25.8182V40.3636C4 42.3727 5.62727 44 7.63636 44H33.0909C35.1 44 36.7273 42.3727 36.7273 40.3636V25.8182M13.0909 15.9998V11.2727M13.0909 11.2727C14.0951 11.2727 14.9091 10.4587 14.9091 9.45455C14.9091 8.45039 14.0951 7.63636 13.0909 7.63636C12.0868 7.63636 11.2727 8.45039 11.2727 9.45455C11.2727 10.4587 12.0868 11.2727 13.0909 11.2727ZM27.6364 5.81818C27.6364 4.81455 28.4509 4 29.4545 4H42.1818C43.1855 4 44 4.81455 44 5.81818V14.9091C44 15.9127 43.1855 16.7273 42.1818 16.7273H33.0909L27.6364 20.3636V5.81818Z",
+									"stroke": "currentColor",
+									"stroke-width": "2",
+									"stroke-linecap": "round",
+									"stroke-linejoin": "round"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M15.7275 30.364C15.7275 31.3179 14.9542 32.0913 14.0002 32.0913C13.0463 32.0913 12.2729 31.3179 12.2729 30.364C12.2729 29.41 13.0463 28.6367 14.0002 28.6367C14.9542 28.6367 15.7275 29.41 15.7275 30.364ZM28.4548 30.364C28.4548 31.3179 27.6814 32.0913 26.7275 32.0913C25.7735 32.0913 25.0002 31.3179 25.0002 30.364C25.0002 29.41 25.7735 28.6367 26.7275 28.6367C27.6814 28.6367 28.4548 29.41 28.4548 30.364Z",
+							"fill": "currentColor",
+							"stroke": "currentColor",
+							"stroke-width": "2"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ChatBotSlim"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/communication/ChatBotSlim.tsx b/app/components/base/icons/src/vender/line/communication/ChatBotSlim.tsx
new file mode 100644
index 0000000..1950a42
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/communication/ChatBotSlim.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ChatBotSlim.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ChatBotSlim'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/communication/CuteRobot.json b/app/components/base/icons/src/vender/line/communication/CuteRobot.json
new file mode 100644
index 0000000..4ae74d2
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/communication/CuteRobot.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "cute-robot"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M6.99967 2.33366H4.08301C3.43868 2.33366 2.91634 2.85599 2.91634 3.50033V6.41699C2.91634 7.06134 3.43868 7.58366 4.08301 7.58366H9.91634C10.5607 7.58366 11.083 7.06134 11.083 6.41699V3.50033C11.083 2.85599 10.5607 2.33366 9.91634 2.33366H6.99967ZM6.99967 2.33366V1.16699M3.49967 8.75033L2.33301 9.91699M3.49967 8.75033C3.49967 10.6833 5.06668 12.2503 6.99967 12.2503C8.93267 12.2503 10.4997 10.6833 10.4997 8.75033M3.49967 8.75033V7.58366M10.4997 8.75033L11.6663 9.91699M10.4997 8.75033V7.58366M5.24967 4.66699V5.25033M8.74967 4.66699V5.25033",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "CuteRobot"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/communication/CuteRobot.tsx b/app/components/base/icons/src/vender/line/communication/CuteRobot.tsx
new file mode 100644
index 0000000..526bb77
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/communication/CuteRobot.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './CuteRobot.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'CuteRobot'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/communication/MessageCheckRemove.json b/app/components/base/icons/src/vender/line/communication/MessageCheckRemove.json
new file mode 100644
index 0000000..a536c9f
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/communication/MessageCheckRemove.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "message-check-remove"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M15.2 2.99994H7.8C6.11984 2.99994 5.27976 2.99994 4.63803 3.32693C4.07354 3.61455 3.6146 4.07349 3.32698 4.63797C3 5.27971 3 6.11979 3 7.79994V13.9999C3 14.9299 3 15.3949 3.10222 15.7764C3.37962 16.8117 4.18827 17.6203 5.22354 17.8977C5.60504 17.9999 6.07003 17.9999 7 17.9999V20.3354C7 20.8683 7 21.1347 7.10923 21.2716C7.20422 21.3906 7.34827 21.4598 7.50054 21.4596C7.67563 21.4594 7.88367 21.293 8.29976 20.9601L10.6852 19.0518C11.1725 18.6619 11.4162 18.467 11.6875 18.3284C11.9282 18.2054 12.1844 18.1155 12.4492 18.0612C12.7477 17.9999 13.0597 17.9999 13.6837 17.9999H16.2C17.8802 17.9999 18.7202 17.9999 19.362 17.673C19.9265 17.3853 20.3854 16.9264 20.673 16.3619C21 15.7202 21 14.8801 21 13.1999V8.79994M12.3333 13.4999L14 10.4999H10L11.6667 7.49994M19.2322 4.76771L21 2.99994M21 2.99994L22.7678 1.23218M21 2.99994L19.2322 1.23218M21 2.99994L22.7678 4.76771",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "MessageCheckRemove"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/communication/MessageCheckRemove.tsx b/app/components/base/icons/src/vender/line/communication/MessageCheckRemove.tsx
new file mode 100644
index 0000000..fac727b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/communication/MessageCheckRemove.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './MessageCheckRemove.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'MessageCheckRemove'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/communication/MessageFastPlus.json b/app/components/base/icons/src/vender/line/communication/MessageFastPlus.json
new file mode 100644
index 0000000..7d40cc7
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/communication/MessageFastPlus.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M15.2 3H7.8C6.11984 3 5.27976 3 4.63803 3.32698C4.07354 3.6146 3.6146 4.07354 3.32698 4.63803C3 5.27976 3 6.11984 3 7.8V14C3 14.93 3 15.395 3.10222 15.7765C3.37962 16.8117 4.18827 17.6204 5.22354 17.8978C5.60504 18 6.07003 18 7 18V20.3355C7 20.8684 7 21.1348 7.10923 21.2716C7.20422 21.3906 7.34827 21.4599 7.50054 21.4597C7.67563 21.4595 7.88367 21.2931 8.29976 20.9602L10.6852 19.0518C11.1725 18.662 11.4162 18.4671 11.6875 18.3285C11.9282 18.2055 12.1844 18.1156 12.4492 18.0613C12.7477 18 13.0597 18 13.6837 18H16.2C17.8802 18 18.7202 18 19.362 17.673C19.9265 17.3854 20.3854 16.9265 20.673 16.362C21 15.7202 21 14.8802 21 13.2V8.8M12.3333 13.5L14 10.5H10L11.6667 7.5M21 5V3M21 3V1M21 3H19M21 3H23",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "MessageFastPlus"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/communication/MessageFastPlus.tsx b/app/components/base/icons/src/vender/line/communication/MessageFastPlus.tsx
new file mode 100644
index 0000000..4446687
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/communication/MessageFastPlus.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './MessageFastPlus.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'MessageFastPlus'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/communication/index.ts b/app/components/base/icons/src/vender/line/communication/index.ts
new file mode 100644
index 0000000..3ab20e8
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/communication/index.ts
@@ -0,0 +1,6 @@
+export { default as AiText } from './AiText'
+export { default as ChatBotSlim } from './ChatBotSlim'
+export { default as ChatBot } from './ChatBot'
+export { default as CuteRobot } from './CuteRobot'
+export { default as MessageCheckRemove } from './MessageCheckRemove'
+export { default as MessageFastPlus } from './MessageFastPlus'
diff --git a/app/components/base/icons/src/vender/line/development/ArtificialBrain.json b/app/components/base/icons/src/vender/line/development/ArtificialBrain.json
new file mode 100644
index 0000000..7015ee2
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/ArtificialBrain.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M17.4542 11.9996H11.9999V13.8177M17.4542 11.9996C17.4542 13.0037 18.2682 13.8177 19.2724 13.8177C20.2765 13.8177 21.0905 13.0037 21.0905 11.9996C21.0905 10.9955 20.2765 10.1815 19.2724 10.1815C18.2682 10.1815 17.4542 10.9955 17.4542 11.9996ZM6.54554 12.9087C5.318 12.9012 4.14258 12.4115 3.27293 11.5451M6.54554 12.9087C6.53904 13.471 6.71172 14.0207 7.03861 14.4783C7.36549 14.936 7.82958 15.2776 8.36365 15.4539M6.54554 12.9087C6.54223 12.5292 6.62185 12.1534 6.77888 11.808C6.9359 11.4625 7.16652 11.1556 7.45459 10.9086M3.27293 11.5451C2.8848 11.7842 2.56415 12.1184 2.34142 12.5161C2.1187 12.9139 2.00125 13.3619 2.00022 13.8177C1.99583 14.2518 2.10201 14.6799 2.30876 15.0616C2.51552 15.4433 2.81603 15.766 3.182 15.9995C3.00399 16.4639 2.91159 16.9567 2.90928 17.454C2.90333 18.0525 3.01683 18.6463 3.24315 19.2004C3.46946 19.7546 3.80404 20.258 4.2273 20.6813C4.65056 21.1045 5.154 21.4391 5.70815 21.6654C6.2623 21.8917 6.85603 22.0052 7.45458 21.9993C8.05314 22.0052 8.64686 21.8917 9.20101 21.6654C9.75516 21.4391 10.2586 21.1045 10.6819 20.6813C11.1051 20.258 11.4397 19.7546 11.666 19.2004C11.8923 18.6463 12.0058 18.0525 11.9999 17.454V16.5449H14.7271L16.1688 17.9867M3.27293 11.5451C2.44984 10.6912 1.9931 9.54938 2.00022 8.36339C1.99427 7.76484 2.10777 7.17111 2.33409 6.61696C2.5604 6.06281 2.89498 5.55937 3.31824 5.13611C3.7415 4.71285 4.24494 4.37827 4.79909 4.15195C5.35324 3.92564 5.94697 3.81214 6.54552 3.81809H6.72733C6.90356 3.28402 7.24525 2.81993 7.70289 2.49304C8.16052 2.16616 8.71035 1.99346 9.2727 1.99997C9.63267 1.99331 9.99029 2.0593 10.3242 2.19399C10.6581 2.32869 10.9614 2.52933 11.2159 2.78391C11.4705 3.03849 11.6712 3.34179 11.8059 3.67567C11.9406 4.00956 12.0065 4.36718 11.9999 4.72715M16.1688 6.0126L14.7271 7.45437H11.9999V9.27249M19.2724 19.2721C19.2724 20.2762 18.4584 21.0902 17.4542 21.0902C16.4501 21.0902 15.6361 20.2762 15.6361 19.2721C15.6361 18.268 16.4501 17.454 17.4542 17.454C18.4584 17.454 19.2724 18.268 19.2724 19.2721ZM19.2724 4.72714C19.2724 5.73126 18.4584 6.54526 17.4542 6.54526C16.4501 6.54526 15.6361 5.73126 15.6361 4.72714C15.6361 3.72302 16.4501 2.90902 17.4542 2.90902C18.4584 2.90902 19.2724 3.72302 19.2724 4.72714Z",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "ArtificialBrain"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/development/ArtificialBrain.tsx b/app/components/base/icons/src/vender/line/development/ArtificialBrain.tsx
new file mode 100644
index 0000000..cefb404
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/ArtificialBrain.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ArtificialBrain.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ArtificialBrain'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/development/BarChartSquare02.json b/app/components/base/icons/src/vender/line/development/BarChartSquare02.json
new file mode 100644
index 0000000..5b695a7
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/BarChartSquare02.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "bar-chart-square-02"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M5.33333 10V11.3333M8 7.33333V11.3333M10.6667 4.66667V11.3333M5.2 14H10.8C11.9201 14 12.4802 14 12.908 13.782C13.2843 13.5903 13.5903 13.2843 13.782 12.908C14 12.4802 14 11.9201 14 10.8V5.2C14 4.0799 14 3.51984 13.782 3.09202C13.5903 2.71569 13.2843 2.40973 12.908 2.21799C12.4802 2 11.9201 2 10.8 2H5.2C4.0799 2 3.51984 2 3.09202 2.21799C2.71569 2.40973 2.40973 2.71569 2.21799 3.09202C2 3.51984 2 4.0799 2 5.2V10.8C2 11.9201 2 12.4802 2.21799 12.908C2.40973 13.2843 2.71569 13.5903 3.09202 13.782C3.51984 14 4.0799 14 5.2 14Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "BarChartSquare02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/development/BarChartSquare02.tsx b/app/components/base/icons/src/vender/line/development/BarChartSquare02.tsx
new file mode 100644
index 0000000..c8a3357
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/BarChartSquare02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './BarChartSquare02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'BarChartSquare02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/development/BracketsX.json b/app/components/base/icons/src/vender/line/development/BracketsX.json
new file mode 100644
index 0000000..08935cc
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/BracketsX.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M18.5708 20C19.8328 20 20.8568 18.977 20.8568 17.714V13.143L21.9998 12L20.8568 10.857V6.286C20.8568 5.023 19.8338 4 18.5708 4M5.429 4C4.166 4 3.143 5.023 3.143 6.286V10.857L2 12L3.143 13.143V17.714C3.143 18.977 4.166 20 5.429 20M15 9L9 15M9 9L15 15",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "BracketsX"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/development/BracketsX.tsx b/app/components/base/icons/src/vender/line/development/BracketsX.tsx
new file mode 100644
index 0000000..84cc1d2
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/BracketsX.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './BracketsX.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'BracketsX'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/development/CodeBrowser.json b/app/components/base/icons/src/vender/line/development/CodeBrowser.json
new file mode 100644
index 0000000..1d0254d
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/CodeBrowser.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "code-browser"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M22 9H2M14 17.5L16.5 15L14 12.5M10 12.5L7.5 15L10 17.5M2 7.8L2 16.2C2 17.8802 2 18.7202 2.32698 19.362C2.6146 19.9265 3.07354 20.3854 3.63803 20.673C4.27976 21 5.11984 21 6.8 21H17.2C18.8802 21 19.7202 21 20.362 20.673C20.9265 20.3854 21.3854 19.9265 21.673 19.362C22 18.7202 22 17.8802 22 16.2V7.8C22 6.11984 22 5.27977 21.673 4.63803C21.3854 4.07354 20.9265 3.6146 20.362 3.32698C19.7202 3 18.8802 3 17.2 3L6.8 3C5.11984 3 4.27976 3 3.63803 3.32698C3.07354 3.6146 2.6146 4.07354 2.32698 4.63803C2 5.27976 2 6.11984 2 7.8Z",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "CodeBrowser"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/development/CodeBrowser.tsx b/app/components/base/icons/src/vender/line/development/CodeBrowser.tsx
new file mode 100644
index 0000000..fd402ed
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/CodeBrowser.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './CodeBrowser.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'CodeBrowser'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/development/Container.json b/app/components/base/icons/src/vender/line/development/Container.json
new file mode 100644
index 0000000..3b15cd8
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/Container.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M13.6666 4.85185L7.99998 8M7.99998 8L2.33331 4.85185M7.99998 8L8 14.3333M14 10.7057V5.29431C14 5.06588 14 4.95167 13.9663 4.8498C13.9366 4.75969 13.8879 4.67696 13.8236 4.60717C13.7509 4.52828 13.651 4.47281 13.4514 4.36188L8.51802 1.62114C8.32895 1.5161 8.23442 1.46358 8.1343 1.44299C8.0457 1.42477 7.95431 1.42477 7.8657 1.44299C7.76559 1.46358 7.67105 1.5161 7.48198 1.62114L2.54865 4.36188C2.34896 4.47281 2.24912 4.52828 2.17642 4.60717C2.11211 4.67697 2.06343 4.75969 2.03366 4.84981C2 4.95167 2 5.06588 2 5.29431V10.7057C2 10.9341 2 11.0484 2.03366 11.1502C2.06343 11.2403 2.11211 11.3231 2.17642 11.3929C2.24912 11.4718 2.34897 11.5272 2.54865 11.6382L7.48198 14.3789C7.67105 14.4839 7.76559 14.5365 7.8657 14.557C7.95431 14.5753 8.0457 14.5753 8.1343 14.557C8.23442 14.5365 8.32895 14.4839 8.51802 14.3789L13.4514 11.6382C13.651 11.5272 13.7509 11.4718 13.8236 11.3929C13.8879 11.3231 13.9366 11.2403 13.9663 11.1502C14 11.0484 14 10.9341 14 10.7057Z",
+					"stroke": "currentColor",
+					"stroke-width": "1.25",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Container"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/development/Container.tsx b/app/components/base/icons/src/vender/line/development/Container.tsx
new file mode 100644
index 0000000..2aa777a
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/Container.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Container.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Container'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/development/Database01.json b/app/components/base/icons/src/vender/line/development/Database01.json
new file mode 100644
index 0000000..e25b3e7
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/Database01.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "17",
+			"height": "16",
+			"viewBox": "0 0 17 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M14.5 3.33337C14.5 4.43794 11.8137 5.33337 8.5 5.33337C5.18629 5.33337 2.5 4.43794 2.5 3.33337M14.5 3.33337C14.5 2.2288 11.8137 1.33337 8.5 1.33337C5.18629 1.33337 2.5 2.2288 2.5 3.33337M14.5 3.33337V12.6667C14.5 13.7734 11.8333 14.6667 8.5 14.6667C5.16667 14.6667 2.5 13.7734 2.5 12.6667V3.33337M14.5 8.00004C14.5 9.10671 11.8333 10 8.5 10C5.16667 10 2.5 9.10671 2.5 8.00004",
+					"stroke": "currentColor",
+					"stroke-width": "1.25",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Database01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/development/Database01.tsx b/app/components/base/icons/src/vender/line/development/Database01.tsx
new file mode 100644
index 0000000..55a67f8
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/Database01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Database01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Database01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/development/Database03.json b/app/components/base/icons/src/vender/line/development/Database03.json
new file mode 100644
index 0000000..5acf4bf
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/Database03.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M9.33333 13.3333C9.33333 14.0696 8.73638 14.6666 8 14.6666C7.26362 14.6666 6.66667 14.0696 6.66667 13.3333M9.33333 13.3333C9.33333 12.5969 8.73638 11.9999 8 11.9999M9.33333 13.3333H14M6.66667 13.3333C6.66667 12.5969 7.26362 11.9999 8 11.9999M6.66667 13.3333H2M8 11.9999V9.33325M14 3.33325C14 4.43782 11.3137 5.33325 8 5.33325C4.68629 5.33325 2 4.43782 2 3.33325M14 3.33325C14 2.22868 11.3137 1.33325 8 1.33325C4.68629 1.33325 2 2.22868 2 3.33325M14 3.33325V7.33325C14 8.43992 11.3333 9.33325 8 9.33325M2 3.33325V7.33325C2 8.43992 4.66667 9.33325 8 9.33325",
+					"stroke": "currentColor",
+					"stroke-width": "1.25",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Database03"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/development/Database03.tsx b/app/components/base/icons/src/vender/line/development/Database03.tsx
new file mode 100644
index 0000000..012294a
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/Database03.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Database03.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Database03'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/development/FileHeart02.json b/app/components/base/icons/src/vender/line/development/FileHeart02.json
new file mode 100644
index 0000000..ef9343d
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/FileHeart02.json
@@ -0,0 +1,52 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "file-heart-02"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M13.5709 13.9883C13.5108 14.3786 13.175 14.6666 12.7802 14.6666H9.19984C8.90529 14.6666 8.6665 14.4279 8.6665 14.1333V12.2666C8.6665 11.9721 8.90529 11.7333 9.19984 11.7333H9.82654C9.93192 11.7333 10.0274 11.6713 10.0702 11.5749L11.0087 9.46348C11.0438 9.38432 11.1223 9.33331 11.2089 9.33331C11.5721 9.33331 11.8665 9.62771 11.8665 9.99087V10.9333C11.8665 11.0806 11.9859 11.2 12.1332 11.2H13.0673C13.5577 11.2 13.9326 11.637 13.858 12.1216L13.5709 13.9883Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M13.3332 6.66665V4.53331C13.3332 3.41321 13.3332 2.85316 13.1152 2.42533C12.9234 2.04901 12.6175 1.74305 12.2412 1.5513C11.8133 1.33331 11.2533 1.33331 10.1332 1.33331H5.8665C4.7464 1.33331 4.18635 1.33331 3.75852 1.5513C3.3822 1.74305 3.07624 2.04901 2.88449 2.42533C2.6665 2.85316 2.6665 3.41321 2.6665 4.53331V11.3333C2.6665 11.9533 2.6665 12.2633 2.73465 12.5176C2.91959 13.2078 3.45868 13.7469 4.14887 13.9318C4.4032 14 4.71319 14 5.33317 14M8.33317 7.33331H5.33317M5.99984 9.99998H5.33317M10.6665 4.66665H5.33317",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "FileHeart02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/development/FileHeart02.tsx b/app/components/base/icons/src/vender/line/development/FileHeart02.tsx
new file mode 100644
index 0000000..e918e5e
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/FileHeart02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './FileHeart02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'FileHeart02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/development/GitBranch01.json b/app/components/base/icons/src/vender/line/development/GitBranch01.json
new file mode 100644
index 0000000..04205e5
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/GitBranch01.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "git-branch-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M2 2V8.8C2 9.92011 2 10.4802 2.21799 10.908C2.40973 11.2843 2.71569 11.5903 3.09202 11.782C3.51984 12 4.0799 12 5.2 12H10M10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12ZM2 5.33333L10 5.33333M10 5.33333C10 6.4379 10.8954 7.33333 12 7.33333C13.1046 7.33333 14 6.4379 14 5.33333C14 4.22876 13.1046 3.33333 12 3.33333C10.8954 3.33333 10 4.22876 10 5.33333Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "GitBranch01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/development/GitBranch01.tsx b/app/components/base/icons/src/vender/line/development/GitBranch01.tsx
new file mode 100644
index 0000000..15343eb
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/GitBranch01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './GitBranch01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'GitBranch01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/development/PromptEngineering.json b/app/components/base/icons/src/vender/line/development/PromptEngineering.json
new file mode 100644
index 0000000..c55bde8
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/PromptEngineering.json
@@ -0,0 +1,65 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "prompt-engineering"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M14 6V5.2C14 4.0799 14 3.51984 13.782 3.09202C13.5903 2.7157 13.2843 2.40974 12.908 2.21799C12.4802 2 11.9201 2 10.8 2H5.2C4.0799 2 3.51984 2 3.09202 2.21799C2.7157 2.40973 2.40973 2.7157 2.21799 3.09202C2 3.51984 2 4.0799 2 5.2V10.8C2 11.9201 2 12.4802 2.21799 12.908C2.40973 13.2843 2.71569 13.5903 3.09202 13.782C3.51984 14 4.07989 14 5.2 14H6",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M4.6665 4.66669H4.67317M6.6665 4.66669H6.67317M8.6665 4.66669H8.67317",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon_2",
+							"d": "M11.3333 8L11.5343 8.80399C11.7036 9.48123 11.7883 9.81985 11.9646 10.0954C12.1206 10.3391 12.3275 10.5461 12.5713 10.7021C12.8468 10.8784 13.1854 10.963 13.8627 11.1323L14.6667 11.3333L13.8627 11.5343C13.1854 11.7036 12.8468 11.7883 12.5713 11.9646C12.3275 12.1206 12.1206 12.3275 11.9646 12.5713C11.7883 12.8468 11.7036 13.1854 11.5343 13.8627L11.3333 14.6667L11.1323 13.8627C10.963 13.1854 10.8784 12.8468 10.7021 12.5713C10.5461 12.3275 10.3391 12.1206 10.0954 11.9646C9.81985 11.7883 9.48123 11.7036 8.80399 11.5343L8 11.3333L8.80399 11.1323C9.48123 10.963 9.81985 10.8784 10.0954 10.7021C10.3391 10.5461 10.5461 10.3391 10.7021 10.0954C10.8784 9.81985 10.963 9.48123 11.1323 8.80399L11.3333 8Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "PromptEngineering"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/development/PromptEngineering.tsx b/app/components/base/icons/src/vender/line/development/PromptEngineering.tsx
new file mode 100644
index 0000000..506e9fe
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/PromptEngineering.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './PromptEngineering.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'PromptEngineering'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/development/PuzzlePiece01.json b/app/components/base/icons/src/vender/line/development/PuzzlePiece01.json
new file mode 100644
index 0000000..ce06d61
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/PuzzlePiece01.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "puzzle-piece-01",
+					"clip-path": "url(#clip0_6770_9698)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M4.99992 3.00004C4.99992 2.07957 5.74611 1.33337 6.66659 1.33337C7.58706 1.33337 8.33325 2.07957 8.33325 3.00004V4.00004H8.99992C9.9318 4.00004 10.3977 4.00004 10.7653 4.15228C11.2553 4.35527 11.6447 4.74462 11.8477 5.23467C11.9999 5.60222 11.9999 6.06816 11.9999 7.00004H12.9999C13.9204 7.00004 14.6666 7.74623 14.6666 8.66671C14.6666 9.58718 13.9204 10.3334 12.9999 10.3334H11.9999V11.4667C11.9999 12.5868 11.9999 13.1469 11.7819 13.5747C11.5902 13.951 11.2842 14.257 10.9079 14.4487C10.4801 14.6667 9.92002 14.6667 8.79992 14.6667H8.33325V13.5C8.33325 12.6716 7.66168 12 6.83325 12C6.00483 12 5.33325 12.6716 5.33325 13.5V14.6667H4.53325C3.41315 14.6667 2.85309 14.6667 2.42527 14.4487C2.04895 14.257 1.74299 13.951 1.55124 13.5747C1.33325 13.1469 1.33325 12.5868 1.33325 11.4667V10.3334H2.33325C3.25373 10.3334 3.99992 9.58718 3.99992 8.66671C3.99992 7.74623 3.25373 7.00004 2.33325 7.00004H1.33325C1.33325 6.06816 1.33325 5.60222 1.48549 5.23467C1.68848 4.74462 2.07783 4.35527 2.56789 4.15228C2.93543 4.00004 3.40137 4.00004 4.33325 4.00004H4.99992V3.00004Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_6770_9698"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "16",
+									"height": "16",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "PuzzlePiece01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/development/PuzzlePiece01.tsx b/app/components/base/icons/src/vender/line/development/PuzzlePiece01.tsx
new file mode 100644
index 0000000..b62d37d
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/PuzzlePiece01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './PuzzlePiece01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'PuzzlePiece01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/development/TerminalSquare.json b/app/components/base/icons/src/vender/line/development/TerminalSquare.json
new file mode 100644
index 0000000..7a78b7b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/TerminalSquare.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "terminal-square"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M7 15L10 12L7 9M13 15H17M7.8 21H16.2C17.8802 21 18.7202 21 19.362 20.673C19.9265 20.3854 20.3854 19.9265 20.673 19.362C21 18.7202 21 17.8802 21 16.2V7.8C21 6.11984 21 5.27976 20.673 4.63803C20.3854 4.07354 19.9265 3.6146 19.362 3.32698C18.7202 3 17.8802 3 16.2 3H7.8C6.11984 3 5.27976 3 4.63803 3.32698C4.07354 3.6146 3.6146 4.07354 3.32698 4.63803C3 5.27976 3 6.11984 3 7.8V16.2C3 17.8802 3 18.7202 3.32698 19.362C3.6146 19.9265 4.07354 20.3854 4.63803 20.673C5.27976 21 6.11984 21 7.8 21Z",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "TerminalSquare"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/development/TerminalSquare.tsx b/app/components/base/icons/src/vender/line/development/TerminalSquare.tsx
new file mode 100644
index 0000000..38575b9
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/TerminalSquare.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './TerminalSquare.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'TerminalSquare'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/development/Variable.json b/app/components/base/icons/src/vender/line/development/Variable.json
new file mode 100644
index 0000000..b7545fe
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/Variable.json
@@ -0,0 +1,62 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "variable"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M13.8686 1.70487C13.7055 1.37481 13.3056 1.23952 12.9756 1.40268C12.6455 1.56585 12.5102 1.9657 12.6734 2.29576C13.5225 4.01329 14.0003 5.94969 14.0003 8.00031C14.0003 10.0509 13.5225 11.9873 12.6734 13.7049C12.5102 14.0349 12.6455 14.4348 12.9756 14.5979C13.3056 14.7611 13.7055 14.6258 13.8686 14.2958C14.8066 12.3984 15.3336 10.2602 15.3336 8.00031C15.3336 5.74041 14.8066 3.60221 13.8686 1.70487Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M3.32724 2.29576C3.49041 1.9657 3.35511 1.56585 3.02506 1.40268C2.695 1.23952 2.29515 1.37481 2.13198 1.70487C1.19401 3.60221 0.666992 5.74041 0.666992 8.00031C0.666992 10.2602 1.19401 12.3984 2.13198 14.2958C2.29515 14.6258 2.695 14.7611 3.02506 14.5979C3.35511 14.4348 3.49041 14.0349 3.32724 13.7049C2.47815 11.9873 2.00033 10.0509 2.00033 8.00031C2.00033 5.94969 2.47815 4.01329 3.32724 2.29576Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M9.33274 5.84142C9.74245 5.36093 10.3415 5.0835 10.973 5.0835H11.0328C11.4009 5.0835 11.6994 5.38197 11.6994 5.75016C11.6994 6.11835 11.4009 6.41683 11.0328 6.41683H10.973C10.7333 6.41683 10.5046 6.52209 10.3473 6.70653L8.78729 8.53612L9.28122 10.2739C9.29182 10.3112 9.32425 10.3335 9.35733 10.3335H10.2867C10.6549 10.3335 10.9534 10.632 10.9534 11.0002C10.9534 11.3684 10.6549 11.6668 10.2867 11.6668H9.35733C8.72419 11.6668 8.17111 11.2451 7.99868 10.6385L7.74768 9.75536L6.7641 10.9089C6.35439 11.3894 5.75537 11.6668 5.12387 11.6668H5.06409C4.6959 11.6668 4.39742 11.3684 4.39742 11.0002C4.39742 10.632 4.6959 10.3335 5.06409 10.3335H5.12387C5.36357 10.3335 5.59225 10.2282 5.74952 10.0438L7.30963 8.21412L6.81573 6.47639C6.80513 6.43909 6.7727 6.41683 6.73962 6.41683H5.81022C5.44203 6.41683 5.14355 6.11835 5.14355 5.75016C5.14355 5.38197 5.44203 5.0835 5.81022 5.0835H6.73962C7.37276 5.0835 7.92584 5.5052 8.09826 6.11186L8.34924 6.99487L9.33274 5.84142Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Variable"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/development/Variable.tsx b/app/components/base/icons/src/vender/line/development/Variable.tsx
new file mode 100644
index 0000000..3f2844a
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/Variable.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Variable.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Variable'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/development/Webhooks.json b/app/components/base/icons/src/vender/line/development/Webhooks.json
new file mode 100644
index 0000000..452194d
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/Webhooks.json
@@ -0,0 +1,89 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "webhooks"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M12.0007 11.9999C12.5529 11.9999 13.0007 11.5522 13.0007 10.9999C13.0007 10.4476 12.5529 9.99993 12.0007 9.99993C11.4484 9.99993 11.0007 10.4476 11.0007 10.9999C11.0007 11.5522 11.4484 11.9999 12.0007 11.9999Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M8.00065 5.49993C8.55294 5.49993 9.00065 5.05222 9.00065 4.49993C9.00065 3.94765 8.55294 3.49993 8.00065 3.49993C7.44837 3.49993 7.00065 3.94765 7.00065 4.49993C7.00065 5.05222 7.44837 5.49993 8.00065 5.49993Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M4.00065 11.9999C4.55294 11.9999 5.00065 11.5522 5.00065 10.9999C5.00065 10.4476 4.55294 9.99993 4.00065 9.99993C3.44837 9.99993 3.00065 10.4476 3.00065 10.9999C3.00065 11.5522 3.44837 11.9999 4.00065 11.9999Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M2.40065 8.9666C2.6952 9.18751 2.7549 9.60538 2.53398 9.89993C2.35969 10.1323 2.24311 10.4028 2.19386 10.6891C2.14461 10.9754 2.16409 11.2693 2.25071 11.5466C2.33733 11.8239 2.48859 12.0766 2.69205 12.2839C2.8955 12.4913 3.14531 12.6473 3.4209 12.7392C3.69649 12.831 3.98996 12.8561 4.27713 12.8123C4.56431 12.7685 4.83696 12.6571 5.07262 12.4872C5.30828 12.3174 5.50021 12.0939 5.63258 11.8353C5.76495 11.5768 5.83398 11.2904 5.83398 10.9999C5.83398 10.6317 6.13246 10.3333 6.50065 10.3333H12.0007C12.3688 10.3333 12.6673 10.6317 12.6673 10.9999C12.6673 11.3681 12.3688 11.6666 12.0007 11.6666H7.09635C7.03846 11.9354 6.94561 12.1965 6.81944 12.4429C6.5908 12.8896 6.25929 13.2755 5.85223 13.5689C5.44518 13.8623 4.97424 14.0547 4.47821 14.1304C3.98219 14.2061 3.47528 14.1628 2.99926 14.0041C2.52325 13.8454 2.09175 13.5759 1.74033 13.2178C1.38891 12.8596 1.12763 12.4231 0.978025 11.9441C0.828415 11.4652 0.794759 10.9575 0.879828 10.463C0.964898 9.96855 1.16626 9.50134 1.46732 9.09993C1.68823 8.80538 2.1061 8.74568 2.40065 8.9666Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M7.22821 1.43134C7.70981 1.31005 8.21318 1.30373 8.69767 1.41291C9.18216 1.52208 9.63418 1.74367 10.0172 2.05979C10.4003 2.37591 10.7036 2.77769 10.9027 3.23268C11.0503 3.56999 10.8965 3.96309 10.5592 4.11069C10.2218 4.25828 9.82874 4.10449 9.68115 3.76718C9.56589 3.50377 9.39028 3.27116 9.16852 3.08814C8.94676 2.90512 8.68507 2.77683 8.40458 2.71363C8.12408 2.65042 7.83265 2.65408 7.55383 2.7243C7.27501 2.79452 7.01662 2.92933 6.79952 3.11785C6.58242 3.30637 6.41271 3.54331 6.30409 3.80953C6.19547 4.07575 6.15099 4.36379 6.17424 4.65038C6.19749 4.93696 6.28782 5.21406 6.43794 5.45929C6.58806 5.70452 6.79375 5.911 7.0384 6.06206C7.35127 6.25524 7.44865 6.66527 7.25605 6.9785L4.56855 11.3491C4.37569 11.6628 3.96509 11.7607 3.65145 11.5678C3.33781 11.375 3.2399 10.9644 3.43276 10.6507L5.80875 6.7867C5.61374 6.59953 5.44284 6.38752 5.30076 6.15541C5.04146 5.73184 4.88544 5.25321 4.84527 4.7582C4.80511 4.26319 4.88194 3.76567 5.06956 3.30584C5.25717 2.846 5.55031 2.43674 5.9253 2.11111C6.30029 1.78549 6.74661 1.55262 7.22821 1.43134Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M7.65145 3.93204C7.96509 3.73918 8.37569 3.83709 8.56855 4.15073L10.944 8.01384C11.1917 7.9264 11.4501 7.86984 11.7135 7.84608C12.2008 7.80211 12.6917 7.87167 13.1476 8.04931C13.6036 8.22695 14.0121 8.50783 14.3413 8.86991C14.6704 9.23199 14.9111 9.66542 15.0446 10.1362C15.1781 10.6069 15.2006 11.1022 15.1105 11.5832C15.0204 12.0641 14.82 12.5176 14.5252 12.9081C14.2303 13.2986 13.849 13.6155 13.4111 13.8338C12.9732 14.0522 12.4907 14.1661 12.0014 14.1666C11.6332 14.167 11.3344 13.8688 11.334 13.5006C11.3336 13.1324 11.6318 12.8337 12 12.8333C12.2832 12.833 12.5626 12.767 12.8161 12.6406C13.0696 12.5142 13.2904 12.3308 13.4611 12.1047C13.6318 11.8786 13.7478 11.616 13.8 11.3376C13.8522 11.0592 13.8391 10.7724 13.7618 10.4999C13.6846 10.2273 13.5452 9.97639 13.3546 9.76676C13.1641 9.55714 12.9276 9.39452 12.6636 9.29168C12.3996 9.18884 12.1154 9.14856 11.8333 9.17402C11.5511 9.19947 11.2787 9.28996 11.0375 9.43839C10.8868 9.53104 10.7056 9.56006 10.5336 9.51905C10.3616 9.47805 10.2129 9.37039 10.1203 9.21975L7.43276 4.84913C7.2399 4.53549 7.33781 4.12489 7.65145 3.93204Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Webhooks"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/development/Webhooks.tsx b/app/components/base/icons/src/vender/line/development/Webhooks.tsx
new file mode 100644
index 0000000..61dc207
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/Webhooks.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Webhooks.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Webhooks'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/development/index.ts b/app/components/base/icons/src/vender/line/development/index.ts
new file mode 100644
index 0000000..93bb195
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/development/index.ts
@@ -0,0 +1,14 @@
+export { default as ArtificialBrain } from './ArtificialBrain'
+export { default as BarChartSquare02 } from './BarChartSquare02'
+export { default as BracketsX } from './BracketsX'
+export { default as CodeBrowser } from './CodeBrowser'
+export { default as Container } from './Container'
+export { default as Database01 } from './Database01'
+export { default as Database03 } from './Database03'
+export { default as FileHeart02 } from './FileHeart02'
+export { default as GitBranch01 } from './GitBranch01'
+export { default as PromptEngineering } from './PromptEngineering'
+export { default as PuzzlePiece01 } from './PuzzlePiece01'
+export { default as TerminalSquare } from './TerminalSquare'
+export { default as Variable } from './Variable'
+export { default as Webhooks } from './Webhooks'
diff --git a/app/components/base/icons/src/vender/line/editor/AlignLeft.json b/app/components/base/icons/src/vender/line/editor/AlignLeft.json
new file mode 100644
index 0000000..ae8b150
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/AlignLeft.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "align-left"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M16 10H3M20 6H3M20 14H3M16 18H3",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "AlignLeft"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/editor/AlignLeft.tsx b/app/components/base/icons/src/vender/line/editor/AlignLeft.tsx
new file mode 100644
index 0000000..6d8c83f
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/AlignLeft.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AlignLeft.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AlignLeft'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/editor/BezierCurve03.json b/app/components/base/icons/src/vender/line/editor/BezierCurve03.json
new file mode 100644
index 0000000..bc87f9b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/BezierCurve03.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "bezier-curve-03"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M5.42857 3.5L2.57143 8.5M3 9.5H8.9999M9.42857 8.5L6.57143 3.5M1.8 10.5H2.2C2.48003 10.5 2.62004 10.5 2.727 10.4455C2.82108 10.3976 2.89757 10.3211 2.9455 10.227C3 10.12 3 9.98003 3 9.7V9.3C3 9.01997 3 8.87996 2.9455 8.773C2.89757 8.67892 2.82108 8.60243 2.727 8.5545C2.62004 8.5 2.48003 8.5 2.2 8.5H1.8C1.51997 8.5 1.37996 8.5 1.273 8.5545C1.17892 8.60243 1.10243 8.67892 1.0545 8.773C1 8.87996 1 9.01997 1 9.3V9.7C1 9.98003 1 10.12 1.0545 10.227C1.10243 10.3211 1.17892 10.3976 1.273 10.4455C1.37996 10.5 1.51997 10.5 1.8 10.5ZM9.8 10.5H10.2C10.48 10.5 10.62 10.5 10.727 10.4455C10.8211 10.3976 10.8976 10.3211 10.9455 10.227C11 10.12 11 9.98003 11 9.7V9.3C11 9.01997 11 8.87996 10.9455 8.773C10.8976 8.67892 10.8211 8.60243 10.727 8.5545C10.62 8.5 10.48 8.5 10.2 8.5H9.8C9.51997 8.5 9.37996 8.5 9.273 8.5545C9.17892 8.60243 9.10243 8.67892 9.0545 8.773C9 8.87996 9 9.01997 9 9.3V9.7C9 9.98003 9 10.12 9.0545 10.227C9.10243 10.3211 9.17892 10.3976 9.273 10.4455C9.37996 10.5 9.51997 10.5 9.8 10.5ZM5.8 3.5H6.2C6.48003 3.5 6.62004 3.5 6.727 3.4455C6.82108 3.39757 6.89757 3.32108 6.9455 3.227C7 3.12004 7 2.98003 7 2.7V2.3C7 2.01997 7 1.87996 6.9455 1.773C6.89757 1.67892 6.82108 1.60243 6.727 1.5545C6.62004 1.5 6.48003 1.5 6.2 1.5H5.8C5.51997 1.5 5.37996 1.5 5.273 1.5545C5.17892 1.60243 5.10243 1.67892 5.0545 1.773C5 1.87996 5 2.01997 5 2.3V2.7C5 2.98003 5 3.12004 5.0545 3.227C5.10243 3.32108 5.17892 3.39757 5.273 3.4455C5.37996 3.5 5.51997 3.5 5.8 3.5Z",
+							"stroke": "currentColor",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "BezierCurve03"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/editor/BezierCurve03.tsx b/app/components/base/icons/src/vender/line/editor/BezierCurve03.tsx
new file mode 100644
index 0000000..5bea901
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/BezierCurve03.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './BezierCurve03.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'BezierCurve03'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/editor/Collapse.json b/app/components/base/icons/src/vender/line/editor/Collapse.json
new file mode 100644
index 0000000..5e3cf08
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/Collapse.json
@@ -0,0 +1,62 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon L"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M2.66602 11.3333H0.666016L3.33268 8.66667L5.99935 11.3333H3.99935L3.99935 14H2.66602L2.66602 11.3333Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M2.66602 4.66667L2.66602 2L3.99935 2L3.99935 4.66667L5.99935 4.66667L3.33268 7.33333L0.666016 4.66667L2.66602 4.66667Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M7.33268 2.66667H13.9993V4H7.33268V2.66667ZM7.33268 12H13.9993V13.3333H7.33268V12ZM5.99935 7.33333H13.9993V8.66667H5.99935V7.33333Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Collapse"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/editor/Collapse.tsx b/app/components/base/icons/src/vender/line/editor/Collapse.tsx
new file mode 100644
index 0000000..6f43dde
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/Collapse.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Collapse.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Collapse'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/editor/Colors.json b/app/components/base/icons/src/vender/line/editor/Colors.json
new file mode 100644
index 0000000..baee8ee
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/Colors.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "colors"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M12 20.4722C13.0615 21.4223 14.4633 22 16 22C19.3137 22 22 19.3137 22 16C22 13.2331 20.1271 10.9036 17.5798 10.2102M6.42018 10.2102C3.87293 10.9036 2 13.2331 2 16C2 19.3137 4.68629 22 8 22C11.3137 22 14 19.3137 14 16C14 15.2195 13.851 14.4738 13.5798 13.7898M18 8C18 11.3137 15.3137 14 12 14C8.68629 14 6 11.3137 6 8C6 4.68629 8.68629 2 12 2C15.3137 2 18 4.68629 18 8Z",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Colors"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/editor/Colors.tsx b/app/components/base/icons/src/vender/line/editor/Colors.tsx
new file mode 100644
index 0000000..bdfe6d1
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/Colors.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Colors.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Colors'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/editor/ImageIndentLeft.json b/app/components/base/icons/src/vender/line/editor/ImageIndentLeft.json
new file mode 100644
index 0000000..603696d
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/ImageIndentLeft.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "image-indent-left"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M21 9.25H15M21 4H3M21 14.75H15M21 20H3M4.6 16H9.4C9.96005 16 10.2401 16 10.454 15.891C10.6422 15.7951 10.7951 15.6422 10.891 15.454C11 15.2401 11 14.9601 11 14.4V9.6C11 9.03995 11 8.75992 10.891 8.54601C10.7951 8.35785 10.6422 8.20487 10.454 8.10899C10.2401 8 9.96005 8 9.4 8H4.6C4.03995 8 3.75992 8 3.54601 8.10899C3.35785 8.20487 3.20487 8.35785 3.10899 8.54601C3 8.75992 3 9.03995 3 9.6V14.4C3 14.9601 3 15.2401 3.10899 15.454C3.20487 15.6422 3.35785 15.7951 3.54601 15.891C3.75992 16 4.03995 16 4.6 16Z",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ImageIndentLeft"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/editor/ImageIndentLeft.tsx b/app/components/base/icons/src/vender/line/editor/ImageIndentLeft.tsx
new file mode 100644
index 0000000..957c12c
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/ImageIndentLeft.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ImageIndentLeft.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ImageIndentLeft'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/editor/LeftIndent02.json b/app/components/base/icons/src/vender/line/editor/LeftIndent02.json
new file mode 100644
index 0000000..447ae88
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/LeftIndent02.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M21 9.24995H12M21 3.99995L12 3.99995M21 14.75H3M21 20H3M4.28 2.95995L8.14667 5.85995C8.43616 6.07707 8.5809 6.18563 8.63266 6.31872C8.678 6.43529 8.678 6.56462 8.63266 6.68119C8.5809 6.81427 8.43616 6.92283 8.14667 7.13995L4.28 10.04C3.86802 10.3489 3.66203 10.5034 3.48961 10.4998C3.33956 10.4967 3.19885 10.4264 3.10632 10.3082C3 10.1724 3 9.91493 3 9.39995V3.59995C3 3.08498 3 2.82749 3.10632 2.6917C3.19885 2.57354 3.33956 2.50318 3.48961 2.50006C3.66203 2.49648 3.86802 2.65097 4.28 2.95995Z",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "LeftIndent02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/editor/LeftIndent02.tsx b/app/components/base/icons/src/vender/line/editor/LeftIndent02.tsx
new file mode 100644
index 0000000..96ae01c
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/LeftIndent02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LeftIndent02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LeftIndent02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/editor/LetterSpacing01.json b/app/components/base/icons/src/vender/line/editor/LetterSpacing01.json
new file mode 100644
index 0000000..98b3cd6
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/LetterSpacing01.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "letter-spacing-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M9 13L15 13M7 17L11.2717 7.60225C11.5031 7.09323 11.6188 6.83872 11.7791 6.75976C11.9184 6.69115 12.0816 6.69115 12.2209 6.75976C12.3812 6.83872 12.4969 7.09323 12.7283 7.60225L17 17M21 3V21M3 3L3 21",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "LetterSpacing01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/editor/LetterSpacing01.tsx b/app/components/base/icons/src/vender/line/editor/LetterSpacing01.tsx
new file mode 100644
index 0000000..e6bc4ce
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/LetterSpacing01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LetterSpacing01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LetterSpacing01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/editor/TypeSquare.json b/app/components/base/icons/src/vender/line/editor/TypeSquare.json
new file mode 100644
index 0000000..195b047
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/TypeSquare.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "type-square"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M4 3.5H8M6 3.5V8.5M3.9 10.5H8.1C8.94008 10.5 9.36012 10.5 9.68099 10.3365C9.96323 10.1927 10.1927 9.96323 10.3365 9.68099C10.5 9.36012 10.5 8.94008 10.5 8.1V3.9C10.5 3.05992 10.5 2.63988 10.3365 2.31901C10.1927 2.03677 9.96323 1.8073 9.68099 1.66349C9.36012 1.5 8.94008 1.5 8.1 1.5H3.9C3.05992 1.5 2.63988 1.5 2.31901 1.66349C2.03677 1.8073 1.8073 2.03677 1.66349 2.31901C1.5 2.63988 1.5 3.05992 1.5 3.9V8.1C1.5 8.94008 1.5 9.36012 1.66349 9.68099C1.8073 9.96323 2.03677 10.1927 2.31901 10.3365C2.63988 10.5 3.05992 10.5 3.9 10.5Z",
+							"stroke": "currentColor",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "TypeSquare"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/editor/TypeSquare.tsx b/app/components/base/icons/src/vender/line/editor/TypeSquare.tsx
new file mode 100644
index 0000000..5149e12
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/TypeSquare.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './TypeSquare.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'TypeSquare'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/editor/index.ts b/app/components/base/icons/src/vender/line/editor/index.ts
new file mode 100644
index 0000000..b31c42e
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/editor/index.ts
@@ -0,0 +1,8 @@
+export { default as AlignLeft } from './AlignLeft'
+export { default as BezierCurve03 } from './BezierCurve03'
+export { default as Collapse } from './Collapse'
+export { default as Colors } from './Colors'
+export { default as ImageIndentLeft } from './ImageIndentLeft'
+export { default as LeftIndent02 } from './LeftIndent02'
+export { default as LetterSpacing01 } from './LetterSpacing01'
+export { default as TypeSquare } from './TypeSquare'
diff --git a/app/components/base/icons/src/vender/line/education/BookOpen01.json b/app/components/base/icons/src/vender/line/education/BookOpen01.json
new file mode 100644
index 0000000..bfa7941
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/education/BookOpen01.json
@@ -0,0 +1,49 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "book-open-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Fill",
+							"opacity": "0.12",
+							"d": "M1 3.1C1 2.53995 1 2.25992 1.10899 2.04601C1.20487 1.85785 1.35785 1.70487 1.54601 1.60899C1.75992 1.5 2.03995 1.5 2.6 1.5H2.8C3.9201 1.5 4.48016 1.5 4.90798 1.71799C5.28431 1.90973 5.59027 2.21569 5.78201 2.59202C6 3.01984 6 3.5799 6 4.7V10.5L5.94997 10.425C5.60265 9.90398 5.42899 9.64349 5.19955 9.45491C4.99643 9.28796 4.76238 9.1627 4.5108 9.0863C4.22663 9 3.91355 9 3.28741 9H2.6C2.03995 9 1.75992 9 1.54601 8.89101C1.35785 8.79513 1.20487 8.64215 1.10899 8.45399C1 8.24008 1 7.96005 1 7.4V3.1Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M6 10.5L5.94997 10.425C5.60265 9.90398 5.42899 9.64349 5.19955 9.45491C4.99643 9.28796 4.76238 9.1627 4.5108 9.0863C4.22663 9 3.91355 9 3.28741 9H2.6C2.03995 9 1.75992 9 1.54601 8.89101C1.35785 8.79513 1.20487 8.64215 1.10899 8.45399C1 8.24008 1 7.96005 1 7.4V3.1C1 2.53995 1 2.25992 1.10899 2.04601C1.20487 1.85785 1.35785 1.70487 1.54601 1.60899C1.75992 1.5 2.03995 1.5 2.6 1.5H2.8C3.9201 1.5 4.48016 1.5 4.90798 1.71799C5.28431 1.90973 5.59027 2.21569 5.78201 2.59202C6 3.01984 6 3.5799 6 4.7M6 10.5V4.7M6 10.5L6.05003 10.425C6.39735 9.90398 6.57101 9.64349 6.80045 9.45491C7.00357 9.28796 7.23762 9.1627 7.4892 9.0863C7.77337 9 8.08645 9 8.71259 9H9.4C9.96005 9 10.2401 9 10.454 8.89101C10.6422 8.79513 10.7951 8.64215 10.891 8.45399C11 8.24008 11 7.96005 11 7.4V3.1C11 2.53995 11 2.25992 10.891 2.04601C10.7951 1.85785 10.6422 1.70487 10.454 1.60899C10.2401 1.5 9.96005 1.5 9.4 1.5H9.2C8.07989 1.5 7.51984 1.5 7.09202 1.71799C6.71569 1.90973 6.40973 2.21569 6.21799 2.59202C6 3.01984 6 3.5799 6 4.7",
+							"stroke": "currentColor",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "BookOpen01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/education/BookOpen01.tsx b/app/components/base/icons/src/vender/line/education/BookOpen01.tsx
new file mode 100644
index 0000000..b362119
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/education/BookOpen01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './BookOpen01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'BookOpen01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/education/index.ts b/app/components/base/icons/src/vender/line/education/index.ts
new file mode 100644
index 0000000..db44daf
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/education/index.ts
@@ -0,0 +1 @@
+export { default as BookOpen01 } from './BookOpen01'
diff --git a/app/components/base/icons/src/vender/line/files/Clipboard.json b/app/components/base/icons/src/vender/line/files/Clipboard.json
new file mode 100644
index 0000000..f256747
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/Clipboard.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M16 4C16.93 4 17.395 4 17.7765 4.10222C18.8117 4.37962 19.6204 5.18827 19.8978 6.22354C20 6.60504 20 7.07003 20 8V17.2C20 18.8802 20 19.7202 19.673 20.362C19.3854 20.9265 18.9265 21.3854 18.362 21.673C17.7202 22 16.8802 22 15.2 22H8.8C7.11984 22 6.27976 22 5.63803 21.673C5.07354 21.3854 4.6146 20.9265 4.32698 20.362C4 19.7202 4 18.8802 4 17.2V8C4 7.07003 4 6.60504 4.10222 6.22354C4.37962 5.18827 5.18827 4.37962 6.22354 4.10222C6.60504 4 7.07003 4 8 4M9.6 6H14.4C14.9601 6 15.2401 6 15.454 5.89101C15.6422 5.79513 15.7951 5.64215 15.891 5.45399C16 5.24008 16 4.96005 16 4.4V3.6C16 3.03995 16 2.75992 15.891 2.54601C15.7951 2.35785 15.6422 2.20487 15.454 2.10899C15.2401 2 14.9601 2 14.4 2H9.6C9.03995 2 8.75992 2 8.54601 2.10899C8.35785 2.20487 8.20487 2.35785 8.10899 2.54601C8 2.75992 8 3.03995 8 3.6V4.4C8 4.96005 8 5.24008 8.10899 5.45399C8.20487 5.64215 8.35785 5.79513 8.54601 5.89101C8.75992 6 9.03995 6 9.6 6Z",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Clipboard"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/files/Clipboard.tsx b/app/components/base/icons/src/vender/line/files/Clipboard.tsx
new file mode 100644
index 0000000..c49d15d
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/Clipboard.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Clipboard.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Clipboard'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/files/ClipboardCheck.json b/app/components/base/icons/src/vender/line/files/ClipboardCheck.json
new file mode 100644
index 0000000..273b115
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/ClipboardCheck.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M16 4C16.93 4 17.395 4 17.7765 4.10222C18.8117 4.37962 19.6204 5.18827 19.8978 6.22354C20 6.60504 20 7.07003 20 8V17.2C20 18.8802 20 19.7202 19.673 20.362C19.3854 20.9265 18.9265 21.3854 18.362 21.673C17.7202 22 16.8802 22 15.2 22H8.8C7.11984 22 6.27976 22 5.63803 21.673C5.07354 21.3854 4.6146 20.9265 4.32698 20.362C4 19.7202 4 18.8802 4 17.2V8C4 7.07003 4 6.60504 4.10222 6.22354C4.37962 5.18827 5.18827 4.37962 6.22354 4.10222C6.60504 4 7.07003 4 8 4M9 15L11 17L15.5 12.5M9.6 6H14.4C14.9601 6 15.2401 6 15.454 5.89101C15.6422 5.79513 15.7951 5.64215 15.891 5.45399C16 5.24008 16 4.96005 16 4.4V3.6C16 3.03995 16 2.75992 15.891 2.54601C15.7951 2.35785 15.6422 2.20487 15.454 2.10899C15.2401 2 14.9601 2 14.4 2H9.6C9.03995 2 8.75992 2 8.54601 2.10899C8.35785 2.20487 8.20487 2.35785 8.10899 2.54601C8 2.75992 8 3.03995 8 3.6V4.4C8 4.96005 8 5.24008 8.10899 5.45399C8.20487 5.64215 8.35785 5.79513 8.54601 5.89101C8.75992 6 9.03995 6 9.6 6Z",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "ClipboardCheck"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/files/ClipboardCheck.tsx b/app/components/base/icons/src/vender/line/files/ClipboardCheck.tsx
new file mode 100644
index 0000000..586b55e
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/ClipboardCheck.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ClipboardCheck.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ClipboardCheck'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/files/File02.json b/app/components/base/icons/src/vender/line/files/File02.json
new file mode 100644
index 0000000..110765a
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/File02.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon_2",
+							"d": "M9.33366 7.3335H5.33366M6.66699 10.0002H5.33366M10.667 4.66683H5.33366M13.3337 4.5335V11.4668C13.3337 12.5869 13.3337 13.147 13.1157 13.5748C12.9239 13.9511 12.618 14.2571 12.2416 14.4488C11.8138 14.6668 11.2538 14.6668 10.1337 14.6668H5.86699C4.74689 14.6668 4.18683 14.6668 3.75901 14.4488C3.38269 14.2571 3.07673 13.9511 2.88498 13.5748C2.66699 13.147 2.66699 12.5869 2.66699 11.4668V4.5335C2.66699 3.41339 2.66699 2.85334 2.88498 2.42552C3.07673 2.04919 3.38269 1.74323 3.75901 1.55148C4.18683 1.3335 4.74689 1.3335 5.86699 1.3335H10.1337C11.2538 1.3335 11.8138 1.3335 12.2416 1.55148C12.618 1.74323 12.9239 2.04919 13.1157 2.42552C13.3337 2.85334 13.3337 3.41339 13.3337 4.5335Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "File02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/files/File02.tsx b/app/components/base/icons/src/vender/line/files/File02.tsx
new file mode 100644
index 0000000..8c53308
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/File02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './File02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'File02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/files/FileArrow01.json b/app/components/base/icons/src/vender/line/files/FileArrow01.json
new file mode 100644
index 0000000..189f081
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/FileArrow01.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "file-arrow-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M3.33333 12.333C3.33333 12.6426 3.33333 12.7974 3.35044 12.9274C3.4686 13.8249 4.17481 14.5311 5.07228 14.6492C5.20225 14.6663 5.35705 14.6663 5.66667 14.6663H10.8C11.9201 14.6663 12.4802 14.6663 12.908 14.4484C13.2843 14.2566 13.5903 13.9506 13.782 13.5743C14 13.1465 14 12.5864 14 11.4663V6.65849C14 6.16931 14 5.92472 13.9447 5.69454C13.8957 5.49047 13.8149 5.29538 13.7053 5.11644C13.5816 4.91461 13.4086 4.74165 13.0627 4.39575L10.9373 2.27027C10.5914 1.92436 10.4184 1.75141 10.2166 1.62773C10.0376 1.51807 9.84254 1.43726 9.63846 1.38827C9.40829 1.33301 9.1637 1.33301 8.67452 1.33301H5.66667C5.35705 1.33301 5.20225 1.33301 5.07228 1.35012C4.17481 1.46827 3.4686 2.17449 3.35044 3.07196M5.33333 5.99967L7.33333 7.99967M7.33333 7.99967L5.33333 9.99967M7.33333 7.99967H2",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "FileArrow01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/files/FileArrow01.tsx b/app/components/base/icons/src/vender/line/files/FileArrow01.tsx
new file mode 100644
index 0000000..c0f4207
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/FileArrow01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './FileArrow01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'FileArrow01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/files/FileCheck02.json b/app/components/base/icons/src/vender/line/files/FileCheck02.json
new file mode 100644
index 0000000..9a2e063
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/FileCheck02.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "file-check-02"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M13.3337 8.33301V4.53301C13.3337 3.4129 13.3337 2.85285 13.1157 2.42503C12.9239 2.0487 12.618 1.74274 12.2416 1.55099C11.8138 1.33301 11.2538 1.33301 10.1337 1.33301H5.86699C4.74689 1.33301 4.18683 1.33301 3.75901 1.55099C3.38269 1.74274 3.07673 2.0487 2.88498 2.42503C2.66699 2.85285 2.66699 3.4129 2.66699 4.53301V11.4663C2.66699 12.5864 2.66699 13.1465 2.88498 13.5743C3.07673 13.9506 3.38269 14.2566 3.75901 14.4484C4.18683 14.6663 4.74689 14.6663 5.86699 14.6663H8.00033M9.33366 7.33301H5.33366M6.66699 9.99967H5.33366M10.667 4.66634H5.33366M9.66699 12.6663L11.0003 13.9997L14.0003 10.9997",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "FileCheck02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/files/FileCheck02.tsx b/app/components/base/icons/src/vender/line/files/FileCheck02.tsx
new file mode 100644
index 0000000..0bb51a3
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/FileCheck02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './FileCheck02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'FileCheck02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/files/FileDownload02.json b/app/components/base/icons/src/vender/line/files/FileDownload02.json
new file mode 100644
index 0000000..a0dccc2
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/FileDownload02.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M20 12.5V6.8C20 5.11984 20 4.27976 19.673 3.63803C19.3854 3.07354 18.9265 2.6146 18.362 2.32698C17.7202 2 16.8802 2 15.2 2H8.8C7.11984 2 6.27976 2 5.63803 2.32698C5.07354 2.6146 4.6146 3.07354 4.32698 3.63803C4 4.27976 4 5.11984 4 6.8V17.2C4 18.8802 4 19.7202 4.32698 20.362C4.6146 20.9265 5.07354 21.3854 5.63803 21.673C6.27976 22 7.1198 22 8.79986 22H12.5M14 11H8M10 15H8M16 7H8M15 19L18 22M18 22L21 19M18 22V16",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "FileDownload02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/files/FileDownload02.tsx b/app/components/base/icons/src/vender/line/files/FileDownload02.tsx
new file mode 100644
index 0000000..5dac794
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/FileDownload02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './FileDownload02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'FileDownload02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/files/FilePlus01.json b/app/components/base/icons/src/vender/line/files/FilePlus01.json
new file mode 100644
index 0000000..67d8784
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/FilePlus01.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "file-plus-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M13.3332 6.99967V4.53301C13.3332 3.4129 13.3332 2.85285 13.1152 2.42503C12.9234 2.0487 12.6175 1.74274 12.2412 1.55099C11.8133 1.33301 11.2533 1.33301 10.1332 1.33301H5.8665C4.7464 1.33301 4.18635 1.33301 3.75852 1.55099C3.3822 1.74274 3.07624 2.0487 2.88449 2.42503C2.6665 2.85285 2.6665 3.4129 2.6665 4.53301V11.4663C2.6665 12.5864 2.6665 13.1465 2.88449 13.5743C3.07624 13.9506 3.3822 14.2566 3.75852 14.4484C4.18635 14.6663 4.7464 14.6663 5.8665 14.6663H7.99984M11.9998 13.9997V9.99967M9.99984 11.9997H13.9998",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "FilePlus01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/files/FilePlus01.tsx b/app/components/base/icons/src/vender/line/files/FilePlus01.tsx
new file mode 100644
index 0000000..d33f4b5
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/FilePlus01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './FilePlus01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'FilePlus01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/files/FilePlus02.json b/app/components/base/icons/src/vender/line/files/FilePlus02.json
new file mode 100644
index 0000000..447b1e9
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/FilePlus02.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M13.3333 6.99992V4.53325C13.3333 3.41315 13.3333 2.85309 13.1153 2.42527C12.9236 2.04895 12.6176 1.74299 12.2413 1.55124C11.8135 1.33325 11.2534 1.33325 10.1333 1.33325H5.86666C4.74655 1.33325 4.1865 1.33325 3.75868 1.55124C3.38235 1.74299 3.07639 2.04895 2.88464 2.42527C2.66666 2.85309 2.66666 3.41315 2.66666 4.53325V11.4666C2.66666 12.5867 2.66666 13.1467 2.88464 13.5746C3.07639 13.9509 3.38235 14.2569 3.75868 14.4486C4.1865 14.6666 4.74655 14.6666 5.86666 14.6666H7.99999M9.33332 7.33325H5.33332M6.66666 9.99992H5.33332M10.6667 4.66659H5.33332M12 13.9999V9.99992M9.99999 11.9999H14",
+					"stroke": "currentColor",
+					"stroke-width": "1.5",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "FilePlus02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/files/FilePlus02.tsx b/app/components/base/icons/src/vender/line/files/FilePlus02.tsx
new file mode 100644
index 0000000..5405325
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/FilePlus02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './FilePlus02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'FilePlus02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/files/FileText.json b/app/components/base/icons/src/vender/line/files/FileText.json
new file mode 100644
index 0000000..536bc45
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/FileText.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "file-text"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8M14 2L20 8M14 2V8H20M16 13H8M16 17H8M10 9H8",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "FileText"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/files/FileText.tsx b/app/components/base/icons/src/vender/line/files/FileText.tsx
new file mode 100644
index 0000000..9c64082
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/FileText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './FileText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'FileText'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/files/FileUpload.json b/app/components/base/icons/src/vender/line/files/FileUpload.json
new file mode 100644
index 0000000..5dc2ec1
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/FileUpload.json
@@ -0,0 +1,52 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "file-upload"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M20 10.5V6.8C20 5.11984 20 4.27976 19.673 3.63803C19.3854 3.07354 18.9265 2.6146 18.362 2.32698C17.7202 2 16.8802 2 15.2 2H8.8C7.11984 2 6.27976 2 5.63803 2.32698C5.07354 2.6146 4.6146 3.07354 4.32698 3.63803C4 4.27976 4 5.11984 4 6.8V17.2C4 18.8802 4 19.7202 4.32698 20.362C4.6146 20.9265 5.07354 21.3854 5.63803 21.673C6.27976 22 7.11984 22 8.8 22H12M14 11H8M10 15H8M16 7H8",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon_2",
+							"d": "M15 18L18 15M18 15L21 18M18 15L18 21",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "FileUpload"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/files/FileUpload.tsx b/app/components/base/icons/src/vender/line/files/FileUpload.tsx
new file mode 100644
index 0000000..2e3143d
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/FileUpload.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './FileUpload.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'FileUpload'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/files/Folder.json b/app/components/base/icons/src/vender/line/files/Folder.json
new file mode 100644
index 0000000..6bbc438
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/Folder.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "folder"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M12.8327 11.0833C12.8327 11.3928 12.7098 11.6895 12.491 11.9083C12.2722 12.1271 11.9754 12.25 11.666 12.25H2.33268C2.02326 12.25 1.72652 12.1271 1.50772 11.9083C1.28893 11.6895 1.16602 11.3928 1.16602 11.0833V2.91667C1.16602 2.60725 1.28893 2.3105 1.50772 2.09171C1.72652 1.87292 2.02326 1.75 2.33268 1.75H5.24935L6.41602 3.5H11.666C11.9754 3.5 12.2722 3.62292 12.491 3.84171C12.7098 4.0605 12.8327 4.35725 12.8327 4.66667V11.0833Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Folder"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/files/Folder.tsx b/app/components/base/icons/src/vender/line/files/Folder.tsx
new file mode 100644
index 0000000..e7a3fdf
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/Folder.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Folder.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Folder'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/files/index.ts b/app/components/base/icons/src/vender/line/files/index.ts
new file mode 100644
index 0000000..4c0ddc2
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/files/index.ts
@@ -0,0 +1,11 @@
+export { default as ClipboardCheck } from './ClipboardCheck'
+export { default as Clipboard } from './Clipboard'
+export { default as File02 } from './File02'
+export { default as FileArrow01 } from './FileArrow01'
+export { default as FileCheck02 } from './FileCheck02'
+export { default as FileDownload02 } from './FileDownload02'
+export { default as FilePlus01 } from './FilePlus01'
+export { default as FilePlus02 } from './FilePlus02'
+export { default as FileText } from './FileText'
+export { default as FileUpload } from './FileUpload'
+export { default as Folder } from './Folder'
diff --git a/app/components/base/icons/src/vender/line/financeAndECommerce/Balance.json b/app/components/base/icons/src/vender/line/financeAndECommerce/Balance.json
new file mode 100644
index 0000000..c04fcda
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/financeAndECommerce/Balance.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M12 3V20M12 20H6.99999M12 20H17M2.99999 6H7.52785C7.83834 6 8.14457 5.92771 8.42228 5.78885L9.5777 5.21115C9.85541 5.07229 10.1616 5 10.4721 5H13.5279C13.8384 5 14.1446 5.07229 14.4223 5.21115L15.5777 5.78885C15.8554 5.92771 16.1616 6 16.4721 6H21M5.49999 6L3.02043 13.4387C2.71807 14.3458 3.08918 15.3834 4.0053 15.657C5.0117 15.9577 5.98828 15.9577 6.99468 15.657C7.9108 15.3834 8.28191 14.3457 7.97955 13.4387L5.49999 6ZM18.5 6L16.0204 13.4387C15.7181 14.3458 16.0892 15.3834 17.0053 15.657C18.0117 15.9577 18.9883 15.9577 19.9947 15.657C20.9108 15.3834 21.2819 14.3457 20.9796 13.4387L18.5 6Z",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Balance"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/financeAndECommerce/Balance.tsx b/app/components/base/icons/src/vender/line/financeAndECommerce/Balance.tsx
new file mode 100644
index 0000000..f2d4b1b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/financeAndECommerce/Balance.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Balance.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Balance'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/financeAndECommerce/CoinsStacked01.json b/app/components/base/icons/src/vender/line/financeAndECommerce/CoinsStacked01.json
new file mode 100644
index 0000000..8a97190
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/financeAndECommerce/CoinsStacked01.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "coins-stacked-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M12 17C12 19.7614 14.2386 22 17 22C19.7614 22 22 19.7614 22 17C22 14.2386 19.7614 12 17 12C14.2386 12 12 14.2386 12 17ZM12 17C12 15.8742 12.3721 14.8353 13 13.9995V5M12 17C12 17.8254 12.2 18.604 12.5541 19.2901C11.7117 20.0018 9.76584 20.5 7.5 20.5C4.46243 20.5 2 19.6046 2 18.5V5M13 5C13 6.10457 10.5376 7 7.5 7C4.46243 7 2 6.10457 2 5M13 5C13 3.89543 10.5376 3 7.5 3C4.46243 3 2 3.89543 2 5M2 14C2 15.1046 4.46243 16 7.5 16C9.689 16 11.5793 15.535 12.4646 14.8618M13 9.5C13 10.6046 10.5376 11.5 7.5 11.5C4.46243 11.5 2 10.6046 2 9.5",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "CoinsStacked01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/financeAndECommerce/CoinsStacked01.tsx b/app/components/base/icons/src/vender/line/financeAndECommerce/CoinsStacked01.tsx
new file mode 100644
index 0000000..7eb20ed
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/financeAndECommerce/CoinsStacked01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './CoinsStacked01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'CoinsStacked01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/financeAndECommerce/GoldCoin.json b/app/components/base/icons/src/vender/line/financeAndECommerce/GoldCoin.json
new file mode 100644
index 0000000..f10b5fa
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/financeAndECommerce/GoldCoin.json
@@ -0,0 +1,120 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_7056_1808)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M8.00003 4.82855L8.93639 6.72613L11.0303 7.03037L9.51518 8.50734L9.87276 10.5928L8.00003 9.60795L6.1273 10.5928L6.48488 8.50734L4.96973 7.03037L7.06367 6.72613L8.00003 4.82855Z",
+							"stroke": "currentColor",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M8.00016 14.6666C11.6821 14.6666 14.6668 11.6819 14.6668 7.99998C14.6668 4.31808 11.6821 1.33331 8.00016 1.33331C4.31826 1.33331 1.3335 4.31808 1.3335 7.99998C1.3335 11.6819 4.31826 14.6666 8.00016 14.6666Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M8.0001 12.8485C8.33482 12.8485 8.60616 12.5771 8.60616 12.2424C8.60616 11.9077 8.33482 11.6364 8.0001 11.6364C7.66539 11.6364 7.39404 11.9077 7.39404 12.2424C7.39404 12.5771 7.66539 12.8485 8.0001 12.8485Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M12.0348 9.91702C12.3695 9.91702 12.6408 9.64567 12.6408 9.31096C12.6408 8.97624 12.3695 8.7049 12.0348 8.7049C11.7001 8.7049 11.4287 8.97624 11.4287 9.31096C11.4287 9.64567 11.7001 9.91702 12.0348 9.91702Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M10.4933 5.17391C10.828 5.17391 11.0993 4.90257 11.0993 4.56785C11.0993 4.23313 10.828 3.96179 10.4933 3.96179C10.1585 3.96179 9.88721 4.23313 9.88721 4.56785C9.88721 4.90257 10.1585 5.17391 10.4933 5.17391Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M5.50645 5.17391C5.84117 5.17391 6.11251 4.90257 6.11251 4.56785C6.11251 4.23313 5.84117 3.96179 5.50645 3.96179C5.17173 3.96179 4.90039 4.23313 4.90039 4.56785C4.90039 4.90257 5.17173 5.17391 5.50645 5.17391Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M3.96544 9.91702C4.30015 9.91702 4.5715 9.64567 4.5715 9.31096C4.5715 8.97624 4.30015 8.7049 3.96544 8.7049C3.63072 8.7049 3.35938 8.97624 3.35938 9.31096C3.35938 9.64567 3.63072 9.91702 3.96544 9.91702Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_7056_1808"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "16",
+									"height": "16",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "GoldCoin"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/financeAndECommerce/GoldCoin.tsx b/app/components/base/icons/src/vender/line/financeAndECommerce/GoldCoin.tsx
new file mode 100644
index 0000000..d912a6b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/financeAndECommerce/GoldCoin.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './GoldCoin.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'GoldCoin'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/financeAndECommerce/ReceiptList.json b/app/components/base/icons/src/vender/line/financeAndECommerce/ReceiptList.json
new file mode 100644
index 0000000..8e9c070
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/financeAndECommerce/ReceiptList.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M7.55556 8.33333H12M15.5556 8.33333H16.4444M7.55556 11.8889H12M15.5556 11.8889H16.4444M7.55556 15.4444H12M15.5556 15.4444H16.4444M20 21.6667V5C20 3.89543 19.1046 3 18 3H6C4.89543 3 4 3.89543 4 5V21.6667L6.66667 19.8889L9.33333 21.6667L12 19.8889L14.6667 21.6667L17.3333 19.8889L20 21.6667Z",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "ReceiptList"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/financeAndECommerce/ReceiptList.tsx b/app/components/base/icons/src/vender/line/financeAndECommerce/ReceiptList.tsx
new file mode 100644
index 0000000..e96aced
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/financeAndECommerce/ReceiptList.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ReceiptList.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ReceiptList'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/financeAndECommerce/Tag01.json b/app/components/base/icons/src/vender/line/financeAndECommerce/Tag01.json
new file mode 100644
index 0000000..b6f838d
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/financeAndECommerce/Tag01.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon",
+					"clip-path": "url(#clip0_17795_9693)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon_2",
+							"d": "M4.66699 4.6665H4.67283M1.16699 3.03317L1.16699 5.6433C1.16699 5.92866 1.16699 6.07134 1.19923 6.20561C1.22781 6.32465 1.27495 6.43845 1.33891 6.54284C1.41106 6.66057 1.51195 6.76146 1.71373 6.96324L6.18709 11.4366C6.88012 12.1296 7.22664 12.4761 7.62621 12.606C7.97769 12.7202 8.35629 12.7202 8.70777 12.606C9.10735 12.4761 9.45386 12.1296 10.1469 11.4366L11.4371 10.1464C12.1301 9.45337 12.4766 9.10686 12.6065 8.70728C12.7207 8.35581 12.7207 7.9772 12.6065 7.62572C12.4766 7.22615 12.1301 6.87963 11.4371 6.1866L6.96372 1.71324C6.76195 1.51146 6.66106 1.41057 6.54332 1.33842C6.43894 1.27446 6.32514 1.22732 6.20609 1.19874C6.07183 1.1665 5.92915 1.1665 5.64379 1.1665L3.03366 1.1665C2.38026 1.1665 2.05357 1.1665 1.804 1.29366C1.58448 1.40552 1.406 1.58399 1.29415 1.80352C1.16699 2.05308 1.16699 2.37978 1.16699 3.03317ZM4.95866 4.6665C4.95866 4.82759 4.82808 4.95817 4.66699 4.95817C4.50591 4.95817 4.37533 4.82759 4.37533 4.6665C4.37533 4.50542 4.50591 4.37484 4.66699 4.37484C4.82808 4.37484 4.95866 4.50542 4.95866 4.6665Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_17795_9693"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "14",
+									"height": "14",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Tag01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/financeAndECommerce/Tag01.tsx b/app/components/base/icons/src/vender/line/financeAndECommerce/Tag01.tsx
new file mode 100644
index 0000000..c8b1ce2
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/financeAndECommerce/Tag01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Tag01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Tag01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/financeAndECommerce/Tag03.json b/app/components/base/icons/src/vender/line/financeAndECommerce/Tag03.json
new file mode 100644
index 0000000..ef0753b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/financeAndECommerce/Tag03.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "tag-03"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M14 7.3335L8.93726 2.27075C8.59135 1.92485 8.4184 1.7519 8.21657 1.62822C8.03762 1.51856 7.84254 1.43775 7.63846 1.38876C7.40829 1.3335 7.16369 1.3335 6.67452 1.3335L4 1.3335M2 5.80016L2 7.11651C2 7.44263 2 7.60569 2.03684 7.75914C2.0695 7.89519 2.12337 8.02525 2.19648 8.14454C2.27894 8.2791 2.39424 8.3944 2.62484 8.625L7.82484 13.825C8.35286 14.353 8.61687 14.617 8.92131 14.716C9.1891 14.803 9.47757 14.803 9.74536 14.716C10.0498 14.617 10.3138 14.353 10.8418 13.825L12.4915 12.1753C13.0195 11.6473 13.2835 11.3833 13.3825 11.0789C13.4695 10.8111 13.4695 10.5226 13.3825 10.2548C13.2835 9.95037 13.0195 9.68636 12.4915 9.15834L7.62484 4.29167C7.39424 4.06107 7.27894 3.94577 7.14438 3.86331C7.02508 3.7902 6.89502 3.73633 6.75898 3.70367C6.60553 3.66683 6.44247 3.66683 6.11634 3.66683H4.13333C3.3866 3.66683 3.01323 3.66683 2.72801 3.81215C2.47713 3.93999 2.27316 4.14396 2.14532 4.39484C2 4.68006 2 5.05343 2 5.80016Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Tag03"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/financeAndECommerce/Tag03.tsx b/app/components/base/icons/src/vender/line/financeAndECommerce/Tag03.tsx
new file mode 100644
index 0000000..c0ec1bb
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/financeAndECommerce/Tag03.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Tag03.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Tag03'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/financeAndECommerce/index.ts b/app/components/base/icons/src/vender/line/financeAndECommerce/index.ts
new file mode 100644
index 0000000..2223daa
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/financeAndECommerce/index.ts
@@ -0,0 +1,6 @@
+export { default as Balance } from './Balance'
+export { default as CoinsStacked01 } from './CoinsStacked01'
+export { default as GoldCoin } from './GoldCoin'
+export { default as ReceiptList } from './ReceiptList'
+export { default as Tag01 } from './Tag01'
+export { default as Tag03 } from './Tag03'
diff --git a/app/components/base/icons/src/vender/line/general/AtSign.json b/app/components/base/icons/src/vender/line/general/AtSign.json
new file mode 100644
index 0000000..0722d8f
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/AtSign.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "at-sign",
+					"clip-path": "url(#clip0_8902_1909)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M10.6666 5.33333V8.66666C10.6666 9.19709 10.8773 9.7058 11.2524 10.0809C11.6275 10.4559 12.1362 10.6667 12.6666 10.6667C13.197 10.6667 13.7057 10.4559 14.0808 10.0809C14.4559 9.7058 14.6666 9.19709 14.6666 8.66666V7.99999C14.6665 6.49535 14.1574 5.03498 13.2221 3.85635C12.2868 2.67772 10.9803 1.85014 9.51502 1.50819C8.04974 1.16624 6.51188 1.33002 5.15149 1.9729C3.7911 2.61579 2.68819 3.69996 2.0221 5.04914C1.356 6.39832 1.1659 7.93315 1.4827 9.40407C1.7995 10.875 2.60458 12.1955 3.76701 13.1508C4.92945 14.1062 6.38088 14.6402 7.8853 14.6661C9.38973 14.692 10.8587 14.2082 12.0533 13.2933M10.6666 7.99999C10.6666 9.47275 9.47269 10.6667 7.99993 10.6667C6.52717 10.6667 5.33326 9.47275 5.33326 7.99999C5.33326 6.52723 6.52717 5.33333 7.99993 5.33333C9.47269 5.33333 10.6666 6.52723 10.6666 7.99999Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_8902_1909"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "16",
+									"height": "16",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "AtSign"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/AtSign.tsx b/app/components/base/icons/src/vender/line/general/AtSign.tsx
new file mode 100644
index 0000000..44c972b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/AtSign.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AtSign.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AtSign'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Bookmark.json b/app/components/base/icons/src/vender/line/general/Bookmark.json
new file mode 100644
index 0000000..1b6e517
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Bookmark.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M5 7.8C5 6.11984 5 5.27976 5.32698 4.63803C5.6146 4.07354 6.07354 3.6146 6.63803 3.32698C7.27976 3 8.11984 3 9.8 3H14.2C15.8802 3 16.7202 3 17.362 3.32698C17.9265 3.6146 18.3854 4.07354 18.673 4.63803C19 5.27976 19 6.11984 19 7.8V21L12 17L5 21V7.8Z",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Bookmark"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Bookmark.tsx b/app/components/base/icons/src/vender/line/general/Bookmark.tsx
new file mode 100644
index 0000000..6708376
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Bookmark.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Bookmark.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Bookmark'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Check.json b/app/components/base/icons/src/vender/line/general/Check.json
new file mode 100644
index 0000000..eae3438
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Check.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "check"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M13.3334 4L6.00008 11.3333L2.66675 8",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Check"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Check.tsx b/app/components/base/icons/src/vender/line/general/Check.tsx
new file mode 100644
index 0000000..babd202
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Check.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Check.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Check'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/CheckDone01.json b/app/components/base/icons/src/vender/line/general/CheckDone01.json
new file mode 100644
index 0000000..85355f9
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/CheckDone01.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "check-done-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M6 15L8 17L12.5 12.5M8 8V5.2C8 4.0799 8 3.51984 8.21799 3.09202C8.40973 2.71569 8.71569 2.40973 9.09202 2.21799C9.51984 2 10.0799 2 11.2 2H18.8C19.9201 2 20.4802 2 20.908 2.21799C21.2843 2.40973 21.5903 2.71569 21.782 3.09202C22 3.51984 22 4.0799 22 5.2V12.8C22 13.9201 22 14.4802 21.782 14.908C21.5903 15.2843 21.2843 15.5903 20.908 15.782C20.4802 16 19.9201 16 18.8 16H16M5.2 22H12.8C13.9201 22 14.4802 22 14.908 21.782C15.2843 21.5903 15.5903 21.2843 15.782 20.908C16 20.4802 16 19.9201 16 18.8V11.2C16 10.0799 16 9.51984 15.782 9.09202C15.5903 8.71569 15.2843 8.40973 14.908 8.21799C14.4802 8 13.9201 8 12.8 8H5.2C4.0799 8 3.51984 8 3.09202 8.21799C2.71569 8.40973 2.40973 8.71569 2.21799 9.09202C2 9.51984 2 10.0799 2 11.2V18.8C2 19.9201 2 20.4802 2.21799 20.908C2.40973 21.2843 2.71569 21.5903 3.09202 21.782C3.51984 22 4.07989 22 5.2 22Z",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "CheckDone01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/CheckDone01.tsx b/app/components/base/icons/src/vender/line/general/CheckDone01.tsx
new file mode 100644
index 0000000..c7e7d80
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/CheckDone01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './CheckDone01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'CheckDone01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/ChecklistSquare.json b/app/components/base/icons/src/vender/line/general/ChecklistSquare.json
new file mode 100644
index 0000000..737c696
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/ChecklistSquare.json
@@ -0,0 +1,36 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "32",
+			"height": "32",
+			"viewBox": "0 0 32 32",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "checklist-square"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M9.7823 11.9146C9.32278 11.6082 8.70191 11.7324 8.39554 12.1919C8.08918 12.6514 8.21333 13.2723 8.67285 13.5787L9.7823 11.9146ZM10.9151 13.8717L10.3603 14.7037C10.8019 14.9982 11.3966 14.8963 11.7151 14.4717L10.9151 13.8717ZM14.5226 10.7284C14.8539 10.2865 14.7644 9.65973 14.3225 9.32836C13.8807 8.99699 13.2539 9.08653 12.9225 9.52836L14.5226 10.7284ZM19.3333 11C18.781 11 18.3333 11.4477 18.3333 12C18.3333 12.5523 18.781 13 19.3333 13V11ZM22 13C22.5523 13 23 12.5523 23 12C23 11.4477 22.5523 11 22 11V13ZM19.3333 19C18.781 19 18.3333 19.4477 18.3333 20C18.3333 20.5523 18.781 21 19.3333 21V19ZM22 21C22.5523 21 23 20.5523 23 20C23 19.4477 22.5523 19 22 19V21ZM9.86913 19.9163C9.4096 19.6099 8.78873 19.7341 8.48238 20.1937C8.17602 20.6532 8.3002 21.274 8.75973 21.5804L9.86913 19.9163ZM11.0019 21.8734L10.4472 22.7054C10.8888 22.9998 11.4835 22.8979 11.8019 22.4734L11.0019 21.8734ZM14.6094 18.7301C14.9408 18.2883 14.8512 17.6615 14.4094 17.3301C13.9676 16.9987 13.3408 17.0883 13.0094 17.5301L14.6094 18.7301ZM6.18404 27.564L5.73005 28.455H5.73005L6.18404 27.564ZM4.43597 25.816L3.54497 26.27H3.54497L4.43597 25.816ZM27.564 25.816L28.455 26.27L27.564 25.816ZM25.816 27.564L26.27 28.455L25.816 27.564ZM25.816 4.43597L26.27 3.54497V3.54497L25.816 4.43597ZM27.564 6.18404L28.455 5.73005V5.73005L27.564 6.18404ZM6.18404 4.43597L5.73005 3.54497L6.18404 4.43597ZM4.43597 6.18404L3.54497 5.73005L4.43597 6.18404ZM8.67285 13.5787L10.3603 14.7037L11.4698 13.0397L9.7823 11.9146L8.67285 13.5787ZM11.7151 14.4717L14.5226 10.7284L12.9225 9.52836L10.1151 13.2717L11.7151 14.4717ZM19.3333 13H22V11H19.3333V13ZM19.3333 21H22V19H19.3333V21ZM8.75973 21.5804L10.4472 22.7054L11.5566 21.0413L9.86913 19.9163L8.75973 21.5804ZM11.8019 22.4734L14.6094 18.7301L13.0094 17.5301L10.2019 21.2733L11.8019 22.4734ZM10.4 5H21.6V3H10.4V5ZM27 10.4V21.6H29V10.4H27ZM21.6 27H10.4V29H21.6V27ZM5 21.6V10.4H3V21.6H5ZM10.4 27C9.26339 27 8.47108 26.9992 7.85424 26.9488C7.24907 26.8994 6.90138 26.8072 6.63803 26.673L5.73005 28.455C6.32234 28.7568 6.96253 28.8826 7.69138 28.9422C8.40855 29.0008 9.2964 29 10.4 29V27ZM3 21.6C3 22.7036 2.99922 23.5914 3.05782 24.3086C3.11737 25.0375 3.24318 25.6777 3.54497 26.27L5.32698 25.362C5.19279 25.0986 5.10062 24.7509 5.05118 24.1458C5.00078 23.5289 5 22.7366 5 21.6H3ZM6.63803 26.673C6.07354 26.3854 5.6146 25.9265 5.32698 25.362L3.54497 26.27C4.02433 27.2108 4.78924 27.9757 5.73005 28.455L6.63803 26.673ZM27 21.6C27 22.7366 26.9992 23.5289 26.9488 24.1458C26.8994 24.7509 26.8072 25.0986 26.673 25.362L28.455 26.27C28.7568 25.6777 28.8826 25.0375 28.9422 24.3086C29.0008 23.5914 29 22.7036 29 21.6H27ZM21.6 29C22.7036 29 23.5914 29.0008 24.3086 28.9422C25.0375 28.8826 25.6777 28.7568 26.27 28.455L25.362 26.673C25.0986 26.8072 24.7509 26.8994 24.1458 26.9488C23.5289 26.9992 22.7366 27 21.6 27V29ZM26.673 25.362C26.3854 25.9265 25.9265 26.3854 25.362 26.673L26.27 28.455C27.2108 27.9757 27.9757 27.2108 28.455 26.27L26.673 25.362ZM21.6 5C22.7366 5 23.5289 5.00078 24.1458 5.05118C24.7509 5.10062 25.0986 5.19279 25.362 5.32698L26.27 3.54497C25.6777 3.24318 25.0375 3.11737 24.3086 3.05782C23.5914 2.99922 22.7036 3 21.6 3V5ZM29 10.4C29 9.2964 29.0008 8.40855 28.9422 7.69138C28.8826 6.96253 28.7568 6.32234 28.455 5.73005L26.673 6.63803C26.8072 6.90138 26.8994 7.24907 26.9488 7.85424C26.9992 8.47108 27 9.26339 27 10.4H29ZM25.362 5.32698C25.9265 5.6146 26.3854 6.07354 26.673 6.63803L28.455 5.73005C27.9757 4.78924 27.2108 4.02433 26.27 3.54497L25.362 5.32698ZM10.4 3C9.2964 3 8.40855 2.99922 7.69138 3.05782C6.96253 3.11737 6.32234 3.24318 5.73005 3.54497L6.63803 5.32698C6.90138 5.19279 7.24907 5.10062 7.85424 5.05118C8.47108 5.00078 9.26339 5 10.4 5V3ZM5 10.4C5 9.26339 5.00078 8.47108 5.05118 7.85424C5.10062 7.24907 5.19279 6.90138 5.32698 6.63803L3.54497 5.73005C3.24318 6.32234 3.11737 6.96253 3.05782 7.69138C2.99922 8.40855 3 9.2964 3 10.4H5ZM5.73005 3.54497C4.78924 4.02433 4.02433 4.78924 3.54497 5.73005L5.32698 6.63803C5.6146 6.07354 6.07354 5.6146 6.63803 5.32698L5.73005 3.54497Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ChecklistSquare"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/ChecklistSquare.tsx b/app/components/base/icons/src/vender/line/general/ChecklistSquare.tsx
new file mode 100644
index 0000000..8fb72f0
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/ChecklistSquare.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ChecklistSquare.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ChecklistSquare'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/DotsGrid.json b/app/components/base/icons/src/vender/line/general/DotsGrid.json
new file mode 100644
index 0000000..9aafed2
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/DotsGrid.json
@@ -0,0 +1,134 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M5.83333 2.91667C5.83333 2.27233 6.35567 1.75 7 1.75C7.64433 1.75 8.16667 2.27233 8.16667 2.91667C8.16667 3.561 7.64433 4.08333 7 4.08333C6.35567 4.08333 5.83333 3.561 5.83333 2.91667Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M5.83333 7C5.83333 6.35567 6.35567 5.83333 7 5.83333C7.64433 5.83333 8.16667 6.35567 8.16667 7C8.16667 7.64433 7.64433 8.16667 7 8.16667C6.35567 8.16667 5.83333 7.64433 5.83333 7Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M5.83333 11.0833C5.83333 10.439 6.35567 9.91667 7 9.91667C7.64433 9.91667 8.16667 10.439 8.16667 11.0833C8.16667 11.7277 7.64433 12.25 7 12.25C6.35567 12.25 5.83333 11.7277 5.83333 11.0833Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M9.91667 2.91667C9.91667 2.27233 10.439 1.75 11.0833 1.75C11.7277 1.75 12.25 2.27233 12.25 2.91667C12.25 3.561 11.7277 4.08333 11.0833 4.08333C10.439 4.08333 9.91667 3.561 9.91667 2.91667Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M9.91667 7C9.91667 6.35567 10.439 5.83333 11.0833 5.83333C11.7277 5.83333 12.25 6.35567 12.25 7C12.25 7.64433 11.7277 8.16667 11.0833 8.16667C10.439 8.16667 9.91667 7.64433 9.91667 7Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M9.91667 11.0833C9.91667 10.439 10.439 9.91667 11.0833 9.91667C11.7277 9.91667 12.25 10.439 12.25 11.0833C12.25 11.7277 11.7277 12.25 11.0833 12.25C10.439 12.25 9.91667 11.7277 9.91667 11.0833Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M1.75 2.91667C1.75 2.27233 2.27233 1.75 2.91667 1.75C3.561 1.75 4.08333 2.27233 4.08333 2.91667C4.08333 3.561 3.561 4.08333 2.91667 4.08333C2.27233 4.08333 1.75 3.561 1.75 2.91667Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M1.75 7C1.75 6.35567 2.27233 5.83333 2.91667 5.83333C3.561 5.83333 4.08333 6.35567 4.08333 7C4.08333 7.64433 3.561 8.16667 2.91667 8.16667C2.27233 8.16667 1.75 7.64433 1.75 7Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M1.75 11.0833C1.75 10.439 2.27233 9.91667 2.91667 9.91667C3.561 9.91667 4.08333 10.439 4.08333 11.0833C4.08333 11.7277 3.561 12.25 2.91667 12.25C2.27233 12.25 1.75 11.7277 1.75 11.0833Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "DotsGrid"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/DotsGrid.tsx b/app/components/base/icons/src/vender/line/general/DotsGrid.tsx
new file mode 100644
index 0000000..fb272fd
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/DotsGrid.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './DotsGrid.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'DotsGrid'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Edit02.json b/app/components/base/icons/src/vender/line/general/Edit02.json
new file mode 100644
index 0000000..38798fe
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Edit02.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Left Icon",
+					"clip-path": "url(#clip0_12284_22440)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M10.5007 5.83319L8.16733 3.49985M1.45898 12.5415L3.4332 12.3222C3.6744 12.2954 3.795 12.282 3.90773 12.2455C4.00774 12.2131 4.10291 12.1673 4.19067 12.1095C4.28958 12.0443 4.37539 11.9585 4.54699 11.7868L12.2507 4.08319C12.895 3.43885 12.895 2.39418 12.2507 1.74985C11.6063 1.10552 10.5617 1.10552 9.91733 1.74985L2.21366 9.45351C2.04205 9.62512 1.95625 9.71092 1.89102 9.80983C1.83315 9.89759 1.78741 9.99277 1.75503 10.0928C1.71854 10.2055 1.70514 10.3261 1.67834 10.5673L1.45898 12.5415Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_12284_22440"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "14",
+									"height": "14",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Edit02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Edit02.tsx b/app/components/base/icons/src/vender/line/general/Edit02.tsx
new file mode 100644
index 0000000..10ba0f5
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Edit02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Edit02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Edit02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Edit04.json b/app/components/base/icons/src/vender/line/general/Edit04.json
new file mode 100644
index 0000000..73f275b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Edit04.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M21 18L19.9999 19.094C19.4695 19.6741 18.7502 20 18.0002 20C17.2501 20 16.5308 19.6741 16.0004 19.094C15.4693 18.5151 14.75 18.1901 14.0002 18.1901C13.2504 18.1901 12.5312 18.5151 12 19.094M3.00003 20H4.67457C5.16376 20 5.40835 20 5.63852 19.9447C5.84259 19.8957 6.03768 19.8149 6.21663 19.7053C6.41846 19.5816 6.59141 19.4086 6.93732 19.0627L19.5001 6.49998C20.3285 5.67156 20.3285 4.32841 19.5001 3.49998C18.6716 2.67156 17.3285 2.67156 16.5001 3.49998L3.93729 16.0627C3.59139 16.4086 3.41843 16.5816 3.29475 16.7834C3.18509 16.9624 3.10428 17.1574 3.05529 17.3615C3.00003 17.5917 3.00003 17.8363 3.00003 18.3255V20Z",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Edit04"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Edit04.tsx b/app/components/base/icons/src/vender/line/general/Edit04.tsx
new file mode 100644
index 0000000..5e436c0
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Edit04.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Edit04.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Edit04'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Edit05.json b/app/components/base/icons/src/vender/line/general/Edit05.json
new file mode 100644
index 0000000..321336b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Edit05.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "edit-05",
+					"clip-path": "url(#clip0_17249_52683)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M7.33325 2.66617H4.53325C3.41315 2.66617 2.85309 2.66617 2.42527 2.88415C2.04895 3.0759 1.74299 3.38186 1.55124 3.75819C1.33325 4.18601 1.33325 4.74606 1.33325 5.86617V11.4662C1.33325 12.5863 1.33325 13.1463 1.55124 13.5741C1.74299 13.9505 2.04895 14.2564 2.42527 14.4482C2.85309 14.6662 3.41315 14.6662 4.53325 14.6662H10.1333C11.2534 14.6662 11.8134 14.6662 12.2412 14.4482C12.6176 14.2564 12.9235 13.9505 13.1153 13.5741C13.3333 13.1463 13.3333 12.5863 13.3333 11.4662V8.66617M5.33323 10.6662H6.4496C6.77572 10.6662 6.93878 10.6662 7.09223 10.6293C7.22828 10.5967 7.35834 10.5428 7.47763 10.4697C7.61219 10.3872 7.72749 10.2719 7.95809 10.0413L14.3333 3.66617C14.8855 3.11388 14.8855 2.21845 14.3333 1.66617C13.781 1.11388 12.8855 1.11388 12.3333 1.66617L5.95808 8.04133C5.72747 8.27193 5.61217 8.38723 5.52971 8.52179C5.45661 8.64108 5.40274 8.77114 5.37007 8.90719C5.33323 9.06064 5.33323 9.2237 5.33323 9.54982V10.6662Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_17249_52683"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "16",
+									"height": "16",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Edit05"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Edit05.tsx b/app/components/base/icons/src/vender/line/general/Edit05.tsx
new file mode 100644
index 0000000..f6904bb
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Edit05.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Edit05.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Edit05'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Hash02.json b/app/components/base/icons/src/vender/line/general/Hash02.json
new file mode 100644
index 0000000..41b639f
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Hash02.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "hash-02"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M4.74999 1.5L3.24999 10.5M8.74998 1.5L7.24998 10.5M10.25 4H1.75M9.75 8H1.25",
+							"stroke": "currentColor",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Hash02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Hash02.tsx b/app/components/base/icons/src/vender/line/general/Hash02.tsx
new file mode 100644
index 0000000..fa8bdfb
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Hash02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Hash02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Hash02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/InfoCircle.json b/app/components/base/icons/src/vender/line/general/InfoCircle.json
new file mode 100644
index 0000000..4017e85
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/InfoCircle.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "info-circle",
+					"clip-path": "url(#clip0_7880_62014)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M6 8V6M6 4H6.005M11 6C11 8.76142 8.76142 11 6 11C3.23858 11 1 8.76142 1 6C1 3.23858 3.23858 1 6 1C8.76142 1 11 3.23858 11 6Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_7880_62014"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "12",
+									"height": "12",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "InfoCircle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/InfoCircle.tsx b/app/components/base/icons/src/vender/line/general/InfoCircle.tsx
new file mode 100644
index 0000000..3f1d59a
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/InfoCircle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './InfoCircle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'InfoCircle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Link03.json b/app/components/base/icons/src/vender/line/general/Link03.json
new file mode 100644
index 0000000..ccd608f
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Link03.json
@@ -0,0 +1,57 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "17",
+			"height": "16",
+			"viewBox": "0 0 17 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "link-03"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M9.01569 1.83378C9.7701 1.10515 10.7805 0.701975 11.8293 0.711089C12.8781 0.720202 13.8813 1.14088 14.623 1.88251C15.3646 2.62414 15.7853 3.62739 15.7944 4.67618C15.8035 5.72497 15.4003 6.73538 14.6717 7.48979L14.6636 7.49805L12.6637 9.49796C12.2581 9.90362 11.7701 10.2173 11.2327 10.4178C10.6953 10.6183 10.1211 10.7008 9.54897 10.6598C8.97686 10.6189 8.42025 10.4553 7.91689 10.1803C7.41354 9.90531 6.97522 9.52527 6.63165 9.06596C6.41112 8.77113 6.47134 8.35334 6.76618 8.1328C7.06101 7.91226 7.4788 7.97249 7.69934 8.26732C7.92838 8.57353 8.2206 8.82689 8.55617 9.01023C8.89174 9.19356 9.26281 9.30259 9.64422 9.3299C10.0256 9.35722 10.4085 9.30219 10.7667 9.16854C11.125 9.0349 11.4503 8.82576 11.7207 8.55532L13.7164 6.55956C14.1998 6.05705 14.4672 5.38513 14.4611 4.68777C14.455 3.98857 14.1746 3.31974 13.6802 2.82532C13.1857 2.3309 12.5169 2.05045 11.8177 2.04437C11.12 2.03831 10.4478 2.30591 9.94526 2.78967L8.80219 3.92609C8.54108 4.18568 8.11898 4.18445 7.85939 3.92334C7.5998 3.66223 7.60103 3.24012 7.86214 2.98053L9.0088 1.84053L9.01569 1.83378Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M5.76493 5.58217C6.30234 5.3817 6.87657 5.29915 7.44869 5.34012C8.0208 5.3811 8.57741 5.54463 9.08077 5.81964C9.58412 6.09465 10.0224 6.47469 10.366 6.93399C10.5865 7.22882 10.5263 7.64662 10.2315 7.86715C9.93665 8.08769 9.51886 8.02746 9.29832 7.73263C9.06928 7.42643 8.77706 7.17307 8.44149 6.98973C8.10592 6.80639 7.73485 6.69737 7.35344 6.67005C6.97203 6.64274 6.58921 6.69777 6.23094 6.83141C5.87266 6.96506 5.54733 7.17419 5.27699 7.44463L3.28123 9.44039C2.79787 9.94291 2.5305 10.6148 2.53656 11.3122C2.54263 12.0114 2.82309 12.6802 3.31751 13.1746C3.81193 13.6691 4.48076 13.9495 5.17995 13.9556C5.87732 13.9616 6.54923 13.6943 7.05174 13.2109L8.18743 12.0752C8.44777 11.8149 8.86988 11.8149 9.13023 12.0752C9.39058 12.3356 9.39058 12.7577 9.13023 13.018L7.99023 14.158L7.98197 14.1662C7.22756 14.8948 6.21715 15.298 5.16837 15.2889C4.11958 15.2798 3.11633 14.8591 2.3747 14.1174C1.63307 13.3758 1.21239 12.3726 1.20328 11.3238C1.19416 10.275 1.59734 9.26458 2.32597 8.51017L2.33409 8.50191L4.33401 6.50199C4.33398 6.50202 4.33404 6.50196 4.33401 6.50199C4.7395 6.09638 5.22756 5.78262 5.76493 5.58217Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Link03"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Link03.tsx b/app/components/base/icons/src/vender/line/general/Link03.tsx
new file mode 100644
index 0000000..1a0c3e1
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Link03.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Link03.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Link03'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/LinkExternal02.json b/app/components/base/icons/src/vender/line/general/LinkExternal02.json
new file mode 100644
index 0000000..af44559
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/LinkExternal02.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "link-external-02"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M10.5 4.5L10.5 1.5M10.5 1.5H7.49999M10.5 1.5L6 6M5 1.5H3.9C3.05992 1.5 2.63988 1.5 2.31901 1.66349C2.03677 1.8073 1.8073 2.03677 1.66349 2.31901C1.5 2.63988 1.5 3.05992 1.5 3.9V8.1C1.5 8.94008 1.5 9.36012 1.66349 9.68099C1.8073 9.96323 2.03677 10.1927 2.31901 10.3365C2.63988 10.5 3.05992 10.5 3.9 10.5H8.1C8.94008 10.5 9.36012 10.5 9.68099 10.3365C9.96323 10.1927 10.1927 9.96323 10.3365 9.68099C10.5 9.36012 10.5 8.94008 10.5 8.1V7",
+							"stroke": "currentColor",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "LinkExternal02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/LinkExternal02.tsx b/app/components/base/icons/src/vender/line/general/LinkExternal02.tsx
new file mode 100644
index 0000000..58d502d
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/LinkExternal02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LinkExternal02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LinkExternal02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/LogIn04.json b/app/components/base/icons/src/vender/line/general/LogIn04.json
new file mode 100644
index 0000000..a8316e9
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/LogIn04.json
@@ -0,0 +1,53 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "log-in-04"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M8.00016 1.99984C5.78015 1.99984 3.84088 3.20518 2.80244 5.00032C2.61808 5.31903 2.21026 5.42794 1.89155 5.24357C1.57285 5.05921 1.46394 4.65139 1.6483 4.33269C2.91526 2.14249 5.28495 0.666504 8.00016 0.666504C12.0502 0.666504 15.3335 3.94975 15.3335 7.99984C15.3335 12.0499 12.0502 15.3332 8.00016 15.3332C5.28495 15.3332 2.91526 13.8572 1.6483 11.667C1.46394 11.3483 1.57285 10.9405 1.89155 10.7561C2.21026 10.5717 2.61808 10.6806 2.80244 10.9994C3.84088 12.7945 5.78015 13.9998 8.00016 13.9998C11.3139 13.9998 14.0002 11.3135 14.0002 7.99984C14.0002 4.68613 11.3139 1.99984 8.00016 1.99984Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M7.52876 4.86177C7.78911 4.60142 8.21122 4.60142 8.47157 4.86177L11.1382 7.52843C11.3986 7.78878 11.3986 8.21089 11.1382 8.47124L8.47157 11.1379C8.21122 11.3983 7.78911 11.3983 7.52876 11.1379C7.26841 10.8776 7.26841 10.4554 7.52876 10.1951L9.05735 8.6665H2.00016C1.63197 8.6665 1.3335 8.36803 1.3335 7.99984C1.3335 7.63165 1.63197 7.33317 2.00016 7.33317H9.05735L7.52876 5.80457C7.26841 5.54423 7.26841 5.12212 7.52876 4.86177Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "LogIn04"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/LogIn04.tsx b/app/components/base/icons/src/vender/line/general/LogIn04.tsx
new file mode 100644
index 0000000..6d2fbfc
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/LogIn04.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LogIn04.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LogIn04'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/LogOut01.json b/app/components/base/icons/src/vender/line/general/LogOut01.json
new file mode 100644
index 0000000..bd2cb3e
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/LogOut01.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "log-out-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M9.33333 9.91667L12.25 7M12.25 7L9.33333 4.08333M12.25 7H5.25M5.25 1.75H4.55C3.56991 1.75 3.07986 1.75 2.70552 1.94074C2.37623 2.10852 2.10852 2.37623 1.94074 2.70552C1.75 3.07986 1.75 3.56991 1.75 4.55V9.45C1.75 10.4301 1.75 10.9201 1.94074 11.2945C2.10852 11.6238 2.37623 11.8915 2.70552 12.0593C3.07986 12.25 3.56991 12.25 4.55 12.25H5.25",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "LogOut01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/LogOut01.tsx b/app/components/base/icons/src/vender/line/general/LogOut01.tsx
new file mode 100644
index 0000000..12b83b2
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/LogOut01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LogOut01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LogOut01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/LogOut04.json b/app/components/base/icons/src/vender/line/general/LogOut04.json
new file mode 100644
index 0000000..a19bedf
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/LogOut04.json
@@ -0,0 +1,53 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "log-out-04"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M0.666504 8.00016C0.666504 4.3422 3.52829 1.3335 7.11095 1.3335C8.28872 1.3335 9.3935 1.66091 10.3431 2.23137C10.6588 2.42097 10.7609 2.83053 10.5713 3.14615C10.3817 3.46177 9.97216 3.56394 9.65654 3.37434C8.90651 2.92378 8.03794 2.66683 7.11095 2.66683C4.31165 2.66683 1.99984 5.03071 1.99984 8.00016C1.99984 10.9696 4.31165 13.3335 7.11095 13.3335C8.03794 13.3335 8.90651 13.0765 9.65654 12.626C9.97216 12.4364 10.3817 12.5386 10.5713 12.8542C10.7609 13.1698 10.6588 13.5794 10.3431 13.769C9.3935 14.3394 8.28872 14.6668 7.11095 14.6668C3.52829 14.6668 0.666504 11.6581 0.666504 8.00016Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M11.5284 4.86209C11.7888 4.60174 12.2109 4.60174 12.4712 4.86209L15.1379 7.52876C15.3983 7.78911 15.3983 8.21122 15.1379 8.47157L12.4712 11.1382C12.2109 11.3986 11.7888 11.3986 11.5284 11.1382C11.2681 10.8779 11.2681 10.4558 11.5284 10.1954L13.057 8.66683H5.99984C5.63165 8.66683 5.33317 8.36835 5.33317 8.00016C5.33317 7.63197 5.63165 7.3335 5.99984 7.3335H13.057L11.5284 5.8049C11.2681 5.54455 11.2681 5.12244 11.5284 4.86209Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "LogOut04"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/LogOut04.tsx b/app/components/base/icons/src/vender/line/general/LogOut04.tsx
new file mode 100644
index 0000000..2a73cb4
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/LogOut04.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LogOut04.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LogOut04'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Menu01.json b/app/components/base/icons/src/vender/line/general/Menu01.json
new file mode 100644
index 0000000..5b32928
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Menu01.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "menu-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M2 8H14M2 4H14M2 12H14",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Menu01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Menu01.tsx b/app/components/base/icons/src/vender/line/general/Menu01.tsx
new file mode 100644
index 0000000..3ef0904
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Menu01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Menu01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Menu01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Pin01.json b/app/components/base/icons/src/vender/line/general/Pin01.json
new file mode 100644
index 0000000..b0e61a2
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Pin01.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "pin-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M8.00037 10.0007L8.00037 14.6673M5.3337 4.87274V6.29315C5.3337 6.43183 5.3337 6.50117 5.32009 6.56749C5.30801 6.62633 5.28804 6.68327 5.26071 6.73677C5.22991 6.79706 5.18659 6.8512 5.09996 6.95949L4.05344 8.26764C3.60962 8.82242 3.3877 9.09982 3.38745 9.33326C3.38723 9.53629 3.47954 9.72835 3.63822 9.85501C3.82067 10.0007 4.1759 10.0007 4.88637 10.0007H11.1144C11.8248 10.0007 12.1801 10.0007 12.3625 9.85501C12.5212 9.72835 12.6135 9.53629 12.6133 9.33326C12.613 9.09982 12.3911 8.82242 11.9473 8.26764L10.9008 6.95949C10.8141 6.8512 10.7708 6.79706 10.74 6.73677C10.7127 6.68327 10.6927 6.62633 10.6806 6.56749C10.667 6.50117 10.667 6.43183 10.667 6.29315V4.87274C10.667 4.79599 10.667 4.75761 10.6714 4.71977C10.6752 4.68615 10.6816 4.65287 10.6905 4.62023C10.7006 4.58348 10.7148 4.54785 10.7433 4.47659L11.4152 2.7968C11.6113 2.30674 11.7093 2.06171 11.6684 1.86502C11.6327 1.693 11.5305 1.54206 11.384 1.44499C11.2166 1.33398 10.9527 1.33398 10.4249 1.33398H5.57587C5.04806 1.33398 4.78416 1.33398 4.61671 1.44499C4.47027 1.54206 4.36808 1.693 4.33233 1.86502C4.29146 2.06171 4.38947 2.30674 4.58549 2.7968L5.25741 4.47659C5.28591 4.54785 5.30017 4.58348 5.31019 4.62023C5.3191 4.65287 5.32551 4.68615 5.32936 4.71977C5.3337 4.75761 5.3337 4.79599 5.3337 4.87274Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Pin01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Pin01.tsx b/app/components/base/icons/src/vender/line/general/Pin01.tsx
new file mode 100644
index 0000000..fc0aa4f
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Pin01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Pin01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Pin01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Pin02.json b/app/components/base/icons/src/vender/line/general/Pin02.json
new file mode 100644
index 0000000..c5b51a5
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Pin02.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M8.3767 15.6163L2.71985 21.2732M11.6944 6.64181L10.1335 8.2027C10.0062 8.33003 9.94252 8.39369 9.86999 8.44427C9.80561 8.48917 9.73616 8.52634 9.66309 8.555C9.58077 8.58729 9.49249 8.60495 9.31592 8.64026L5.65145 9.37315C4.69915 9.56361 4.223 9.65884 4.00024 9.9099C3.80617 10.1286 3.71755 10.4213 3.75771 10.7109C3.8038 11.0434 4.14715 11.3867 4.83387 12.0735L11.9196 19.1592C12.6063 19.8459 12.9497 20.1893 13.2821 20.2354C13.5718 20.2755 13.8645 20.1869 14.0832 19.9928C14.3342 19.7701 14.4294 19.2939 14.6199 18.3416L15.3528 14.6771C15.3881 14.5006 15.4058 14.4123 15.4381 14.33C15.4667 14.2569 15.5039 14.1875 15.5488 14.1231C15.5994 14.0505 15.663 13.9869 15.7904 13.8596L17.3512 12.2987C17.4326 12.2173 17.4734 12.1766 17.5181 12.141C17.5578 12.1095 17.5999 12.081 17.644 12.0558C17.6936 12.0274 17.7465 12.0048 17.8523 11.9594L20.3467 10.8904C21.0744 10.5785 21.4383 10.4226 21.6035 10.1706C21.7481 9.95025 21.7998 9.68175 21.7474 9.42348C21.6875 9.12813 21.4076 8.84822 20.8478 8.28839L15.7047 3.14526C15.1448 2.58543 14.8649 2.30552 14.5696 2.24565C14.3113 2.19329 14.0428 2.245 13.8225 2.38953C13.5705 2.55481 13.4145 2.91866 13.1027 3.64636L12.0337 6.14071C11.9883 6.24653 11.9656 6.29944 11.9373 6.34905C11.9121 6.39313 11.8836 6.43522 11.852 6.47496C11.8165 6.51971 11.7758 6.56041 11.6944 6.64181Z",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Pin02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Pin02.tsx b/app/components/base/icons/src/vender/line/general/Pin02.tsx
new file mode 100644
index 0000000..e1b1853
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Pin02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Pin02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Pin02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Plus02.json b/app/components/base/icons/src/vender/line/general/Plus02.json
new file mode 100644
index 0000000..8a9516f
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Plus02.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "10",
+			"height": "10",
+			"viewBox": "0 0 10 10",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "plus"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M5.00004 2.08325V7.91659M2.08337 4.99992H7.91671",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Plus02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Plus02.tsx b/app/components/base/icons/src/vender/line/general/Plus02.tsx
new file mode 100644
index 0000000..6e7920f
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Plus02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Plus02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Plus02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Refresh.json b/app/components/base/icons/src/vender/line/general/Refresh.json
new file mode 100644
index 0000000..128dcb7
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Refresh.json
@@ -0,0 +1,23 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"xmlns": "http://www.w3.org/2000/svg",
+			"viewBox": "0 0 24 24",
+			"fill": "currentColor"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M5.46257 4.43262C7.21556 2.91688 9.5007 2 12 2C17.5228 2 22 6.47715 22 12C22 14.1361 21.3302 16.1158 20.1892 17.7406L17 12H20C20 7.58172 16.4183 4 12 4C9.84982 4 7.89777 4.84827 6.46023 6.22842L5.46257 4.43262ZM18.5374 19.5674C16.7844 21.0831 14.4993 22 12 22C6.47715 22 2 17.5228 2 12C2 9.86386 2.66979 7.88416 3.8108 6.25944L7 12H4C4 16.4183 7.58172 20 12 20C14.1502 20 16.1022 19.1517 17.5398 17.7716L18.5374 19.5674Z"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Refresh"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Refresh.tsx b/app/components/base/icons/src/vender/line/general/Refresh.tsx
new file mode 100644
index 0000000..0d51f21
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Refresh.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Refresh.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Refresh'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Settings01.json b/app/components/base/icons/src/vender/line/general/Settings01.json
new file mode 100644
index 0000000..8734e9f
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Settings01.json
@@ -0,0 +1,86 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Left Icon",
+					"clip-path": "url(#clip0_11961_30603)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Icon"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M6.99935 8.74984C7.96585 8.74984 8.74935 7.96634 8.74935 6.99984C8.74935 6.03334 7.96585 5.24984 6.99935 5.24984C6.03285 5.24984 5.24935 6.03334 5.24935 6.99984C5.24935 7.96634 6.03285 8.74984 6.99935 8.74984Z",
+									"stroke": "currentColor",
+									"stroke-width": "1.25",
+									"stroke-linecap": "round",
+									"stroke-linejoin": "round"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M10.9236 8.59075C10.853 8.75069 10.8319 8.92812 10.8631 9.10015C10.8943 9.27218 10.9763 9.43092 11.0986 9.5559L11.1304 9.58772C11.229 9.68622 11.3073 9.80319 11.3606 9.93195C11.414 10.0607 11.4415 10.1987 11.4415 10.3381C11.4415 10.4775 11.414 10.6155 11.3606 10.7442C11.3073 10.873 11.229 10.99 11.1304 11.0885C11.0319 11.1871 10.9149 11.2653 10.7862 11.3187C10.6574 11.3721 10.5194 11.3995 10.38 11.3995C10.2407 11.3995 10.1026 11.3721 9.97388 11.3187C9.84513 11.2653 9.72815 11.1871 9.62965 11.0885L9.59783 11.0567C9.47285 10.9344 9.31411 10.8524 9.14209 10.8212C8.97006 10.79 8.79263 10.8111 8.63268 10.8817C8.47583 10.9489 8.34207 11.0605 8.24785 11.2028C8.15362 11.345 8.10306 11.5118 8.10238 11.6824V11.7726C8.10238 12.0539 7.99064 12.3236 7.79173 12.5225C7.59283 12.7214 7.32306 12.8332 7.04177 12.8332C6.76048 12.8332 6.49071 12.7214 6.29181 12.5225C6.09291 12.3236 5.98117 12.0539 5.98117 11.7726V11.7248C5.97706 11.5493 5.92025 11.3791 5.8181 11.2363C5.71596 11.0935 5.57322 10.9847 5.40844 10.9241C5.24849 10.8535 5.07106 10.8324 4.89904 10.8636C4.72701 10.8948 4.56827 10.9768 4.44329 11.0991L4.41147 11.1309C4.31297 11.2295 4.196 11.3077 4.06724 11.3611C3.93848 11.4145 3.80047 11.442 3.66109 11.442C3.52171 11.442 3.3837 11.4145 3.25494 11.3611C3.12619 11.3077 3.00921 11.2295 2.91071 11.1309C2.8121 11.0324 2.73387 10.9154 2.6805 10.7867C2.62712 10.6579 2.59965 10.5199 2.59965 10.3805C2.59965 10.2411 2.62712 10.1031 2.6805 9.97437C2.73387 9.84561 2.8121 9.72864 2.91071 9.63014L2.94253 9.59832C3.06479 9.47334 3.1468 9.3146 3.17799 9.14257C3.20918 8.97055 3.18812 8.79312 3.11753 8.63317C3.05031 8.47632 2.93869 8.34256 2.79641 8.24833C2.65414 8.15411 2.48742 8.10355 2.31677 8.10287H2.22662C1.94533 8.10287 1.67556 7.99112 1.47666 7.79222C1.27776 7.59332 1.16602 7.32355 1.16602 7.04226C1.16602 6.76097 1.27776 6.4912 1.47666 6.2923C1.67556 6.0934 1.94533 5.98166 2.22662 5.98166H2.27435C2.44988 5.97755 2.62011 5.92073 2.76292 5.81859C2.90572 5.71645 3.0145 5.57371 3.07511 5.40893C3.1457 5.24898 3.16676 5.07155 3.13556 4.89953C3.10437 4.7275 3.02236 4.56876 2.90011 4.44378L2.86829 4.41196C2.76968 4.31346 2.69145 4.19648 2.63807 4.06773C2.5847 3.93897 2.55723 3.80096 2.55723 3.66158C2.55723 3.5222 2.5847 3.38419 2.63807 3.25543C2.69145 3.12668 2.76968 3.0097 2.86829 2.9112C2.96679 2.81259 3.08376 2.73436 3.21252 2.68099C3.34127 2.62761 3.47929 2.60014 3.61867 2.60014C3.75805 2.60014 3.89606 2.62761 4.02482 2.68099C4.15357 2.73436 4.27054 2.81259 4.36905 2.9112L4.40086 2.94302C4.52585 3.06527 4.68458 3.14728 4.85661 3.17848C5.02864 3.20967 5.20607 3.18861 5.36602 3.11802H5.40844C5.56529 3.0508 5.69906 2.93918 5.79328 2.7969C5.8875 2.65463 5.93806 2.48791 5.93874 2.31726V2.22711C5.93874 1.94582 6.05049 1.67605 6.24939 1.47715C6.44829 1.27825 6.71806 1.1665 6.99935 1.1665C7.28064 1.1665 7.55041 1.27825 7.74931 1.47715C7.94821 1.67605 8.05995 1.94582 8.05995 2.22711V2.27484C8.06064 2.44548 8.1112 2.6122 8.20542 2.75448C8.29964 2.89675 8.43341 3.00837 8.59026 3.07559C8.75021 3.14619 8.92763 3.16724 9.09966 3.13605C9.27169 3.10486 9.43043 3.02285 9.55541 2.90059L9.58723 2.86878C9.68573 2.77017 9.8027 2.69194 9.93146 2.63856C10.0602 2.58519 10.1982 2.55772 10.3376 2.55772C10.477 2.55772 10.615 2.58519 10.7438 2.63856C10.8725 2.69194 10.9895 2.77017 11.088 2.86878C11.1866 2.96728 11.2648 3.08425 11.3182 3.21301C11.3716 3.34176 11.399 3.47978 11.399 3.61916C11.399 3.75854 11.3716 3.89655 11.3182 4.0253C11.2648 4.15406 11.1866 4.27103 11.088 4.36953L11.0562 4.40135C10.9339 4.52633 10.8519 4.68507 10.8207 4.8571C10.7895 5.02913 10.8106 5.20656 10.8812 5.3665V5.40893C10.9484 5.56578 11.06 5.69954 11.2023 5.79377C11.3446 5.88799 11.5113 5.93855 11.6819 5.93923H11.7721C12.0534 5.93923 12.3231 6.05097 12.522 6.24988C12.7209 6.44878 12.8327 6.71855 12.8327 6.99984C12.8327 7.28113 12.7209 7.5509 12.522 7.7498C12.3231 7.9487 12.0534 8.06044 11.7721 8.06044H11.7243C11.5537 8.06112 11.387 8.11169 11.2447 8.20591C11.1024 8.30013 10.9908 8.4339 10.9236 8.59075Z",
+									"stroke": "currentColor",
+									"stroke-width": "1.25",
+									"stroke-linecap": "round",
+									"stroke-linejoin": "round"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_11961_30603"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "14",
+									"height": "14",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Settings01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Settings01.tsx b/app/components/base/icons/src/vender/line/general/Settings01.tsx
new file mode 100644
index 0000000..77d4b7a
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Settings01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Settings01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Settings01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Settings04.json b/app/components/base/icons/src/vender/line/general/Settings04.json
new file mode 100644
index 0000000..e46a054
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Settings04.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Left Icon"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M1.75 4.6665L8.75 4.6665M8.75 4.6665C8.75 5.633 9.5335 6.4165 10.5 6.4165C11.4665 6.4165 12.25 5.633 12.25 4.6665C12.25 3.70001 11.4665 2.9165 10.5 2.9165C9.5335 2.9165 8.75 3.70001 8.75 4.6665ZM5.25 9.33317L12.25 9.33317M5.25 9.33317C5.25 10.2997 4.4665 11.0832 3.5 11.0832C2.5335 11.0832 1.75 10.2997 1.75 9.33317C1.75 8.36667 2.5335 7.58317 3.5 7.58317C4.4665 7.58317 5.25 8.36667 5.25 9.33317Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Settings04"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Settings04.tsx b/app/components/base/icons/src/vender/line/general/Settings04.tsx
new file mode 100644
index 0000000..cb475fa
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Settings04.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Settings04.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Settings04'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Target04.json b/app/components/base/icons/src/vender/line/general/Target04.json
new file mode 100644
index 0000000..5c07628
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Target04.json
@@ -0,0 +1,65 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Left Icon",
+					"clip-path": "url(#clip0_10386_42171)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M7.99998 4V2.5L9.49998 1L9.99998 2L11 2.5L9.49998 4H7.99998ZM7.99998 4L5.99999 5.99997M11 6C11 8.76142 8.76142 11 6 11C3.23858 11 1 8.76142 1 6C1 3.23858 3.23858 1 6 1M8.5 6C8.5 7.38071 7.38071 8.5 6 8.5C4.61929 8.5 3.5 7.38071 3.5 6C3.5 4.61929 4.61929 3.5 6 3.5",
+							"stroke": "currentColor",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_10386_42171"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "12",
+									"height": "12",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Target04"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Target04.tsx b/app/components/base/icons/src/vender/line/general/Target04.tsx
new file mode 100644
index 0000000..d2d04f9
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Target04.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Target04.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Target04'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/Upload03.json b/app/components/base/icons/src/vender/line/general/Upload03.json
new file mode 100644
index 0000000..c3490f3
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Upload03.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Left Icon",
+					"clip-path": "url(#clip0_12728_40636)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M10.6654 8.00016L7.9987 5.3335M7.9987 5.3335L5.33203 8.00016M7.9987 5.3335V10.6668M14.6654 8.00016C14.6654 11.6821 11.6806 14.6668 7.9987 14.6668C4.3168 14.6668 1.33203 11.6821 1.33203 8.00016C1.33203 4.31826 4.3168 1.3335 7.9987 1.3335C11.6806 1.3335 14.6654 4.31826 14.6654 8.00016Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_12728_40636"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "16",
+									"height": "16",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Upload03"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/Upload03.tsx b/app/components/base/icons/src/vender/line/general/Upload03.tsx
new file mode 100644
index 0000000..e62e5d7
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/Upload03.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Upload03.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Upload03'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/UploadCloud01.json b/app/components/base/icons/src/vender/line/general/UploadCloud01.json
new file mode 100644
index 0000000..03e448d
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/UploadCloud01.json
@@ -0,0 +1,42 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"opacity": "0.4",
+					"d": "M4 16.2422C2.79401 15.435 2 14.0602 2 12.5C2 10.1564 3.79151 8.23129 6.07974 8.01937C6.54781 5.17213 9.02024 3 12 3C14.9798 3 17.4522 5.17213 17.9203 8.01937C20.2085 8.23129 22 10.1564 22 12.5C22 14.0602 21.206 15.435 20 16.2422",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M8 16L12 12M12 12L16 16M12 12L12 21",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "UploadCloud01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/UploadCloud01.tsx b/app/components/base/icons/src/vender/line/general/UploadCloud01.tsx
new file mode 100644
index 0000000..413c36e
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/UploadCloud01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './UploadCloud01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'UploadCloud01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/X.json b/app/components/base/icons/src/vender/line/general/X.json
new file mode 100644
index 0000000..5c2fde5
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/X.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "x"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M11.3334 4.66663L4.66675 11.3333M4.66675 4.66663L11.3334 11.3333",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "X"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/general/X.tsx b/app/components/base/icons/src/vender/line/general/X.tsx
new file mode 100644
index 0000000..779f4cd
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/X.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './X.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'X'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/general/index.ts b/app/components/base/icons/src/vender/line/general/index.ts
new file mode 100644
index 0000000..b5c7a7b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/general/index.ts
@@ -0,0 +1,27 @@
+export { default as AtSign } from './AtSign'
+export { default as Bookmark } from './Bookmark'
+export { default as CheckDone01 } from './CheckDone01'
+export { default as Check } from './Check'
+export { default as ChecklistSquare } from './ChecklistSquare'
+export { default as DotsGrid } from './DotsGrid'
+export { default as Edit02 } from './Edit02'
+export { default as Edit04 } from './Edit04'
+export { default as Edit05 } from './Edit05'
+export { default as Hash02 } from './Hash02'
+export { default as InfoCircle } from './InfoCircle'
+export { default as Link03 } from './Link03'
+export { default as LinkExternal02 } from './LinkExternal02'
+export { default as LogIn04 } from './LogIn04'
+export { default as LogOut01 } from './LogOut01'
+export { default as LogOut04 } from './LogOut04'
+export { default as Menu01 } from './Menu01'
+export { default as Pin01 } from './Pin01'
+export { default as Pin02 } from './Pin02'
+export { default as Plus02 } from './Plus02'
+export { default as Refresh } from './Refresh'
+export { default as Settings01 } from './Settings01'
+export { default as Settings04 } from './Settings04'
+export { default as Target04 } from './Target04'
+export { default as Upload03 } from './Upload03'
+export { default as UploadCloud01 } from './UploadCloud01'
+export { default as X } from './X'
diff --git a/app/components/base/icons/src/vender/line/images/ImagePlus.json b/app/components/base/icons/src/vender/line/images/ImagePlus.json
new file mode 100644
index 0000000..127b046
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/images/ImagePlus.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "image-plus"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M8.33333 2.00016H5.2C4.0799 2.00016 3.51984 2.00016 3.09202 2.21815C2.71569 2.4099 2.40973 2.71586 2.21799 3.09218C2 3.52001 2 4.08006 2 5.20016V10.8002C2 11.9203 2 12.4803 2.21799 12.9081C2.40973 13.2845 2.71569 13.5904 3.09202 13.7822C3.51984 14.0002 4.07989 14.0002 5.2 14.0002H11.3333C11.9533 14.0002 12.2633 14.0002 12.5176 13.932C13.2078 13.7471 13.7469 13.208 13.9319 12.5178C14 12.2635 14 11.9535 14 11.3335M12.6667 5.3335V1.3335M10.6667 3.3335H14.6667M7 5.66683C7 6.40321 6.40305 7.00016 5.66667 7.00016C4.93029 7.00016 4.33333 6.40321 4.33333 5.66683C4.33333 4.93045 4.93029 4.3335 5.66667 4.3335C6.40305 4.3335 7 4.93045 7 5.66683ZM9.99336 7.94559L4.3541 13.0722C4.03691 13.3605 3.87831 13.5047 3.86429 13.6296C3.85213 13.7379 3.89364 13.8453 3.97546 13.9172C4.06985 14.0002 4.28419 14.0002 4.71286 14.0002H10.9707C11.9301 14.0002 12.4098 14.0002 12.7866 13.839C13.2596 13.6366 13.6365 13.2598 13.8388 12.7868C14 12.41 14 11.9303 14 10.9708C14 10.648 14 10.4866 13.9647 10.3363C13.9204 10.1474 13.8353 9.9704 13.7155 9.81776C13.6202 9.6963 13.4941 9.59546 13.242 9.3938L11.3772 7.90194C11.1249 7.7001 10.9988 7.59919 10.8599 7.56357C10.7374 7.53218 10.6086 7.53624 10.4884 7.57529C10.352 7.61959 10.2324 7.72826 9.99336 7.94559Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ImagePlus"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/images/ImagePlus.tsx b/app/components/base/icons/src/vender/line/images/ImagePlus.tsx
new file mode 100644
index 0000000..bd5a921
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/images/ImagePlus.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ImagePlus.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ImagePlus'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/images/index.ts b/app/components/base/icons/src/vender/line/images/index.ts
new file mode 100644
index 0000000..b61eda9
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/images/index.ts
@@ -0,0 +1 @@
+export { default as ImagePlus } from './ImagePlus'
diff --git a/app/components/base/icons/src/vender/line/layout/AlignLeft01.json b/app/components/base/icons/src/vender/line/layout/AlignLeft01.json
new file mode 100644
index 0000000..5ed5add
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/layout/AlignLeft01.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "align-left-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M3 3V21M21 12H7M7 12L14 19M7 12L14 5",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "AlignLeft01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/layout/AlignLeft01.tsx b/app/components/base/icons/src/vender/line/layout/AlignLeft01.tsx
new file mode 100644
index 0000000..0aad9be
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/layout/AlignLeft01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AlignLeft01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AlignLeft01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/layout/AlignRight01.json b/app/components/base/icons/src/vender/line/layout/AlignRight01.json
new file mode 100644
index 0000000..6690e6d
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/layout/AlignRight01.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "align-right-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M21 21V3M3 12H17M17 12L10 5M17 12L10 19",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "AlignRight01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/layout/AlignRight01.tsx b/app/components/base/icons/src/vender/line/layout/AlignRight01.tsx
new file mode 100644
index 0000000..486ba7b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/layout/AlignRight01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AlignRight01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AlignRight01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/layout/Grid01.json b/app/components/base/icons/src/vender/line/layout/Grid01.json
new file mode 100644
index 0000000..43a385c
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/layout/Grid01.json
@@ -0,0 +1,83 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "17",
+			"height": "16",
+			"viewBox": "0 0 17 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "grid-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Icon"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M6.1 2H3.56667C3.1933 2 3.00661 2 2.86401 2.07266C2.73856 2.13658 2.63658 2.23856 2.57266 2.36401C2.5 2.50661 2.5 2.6933 2.5 3.06667V5.6C2.5 5.97337 2.5 6.16005 2.57266 6.30266C2.63658 6.4281 2.73856 6.53009 2.86401 6.594C3.00661 6.66667 3.1933 6.66667 3.56667 6.66667H6.1C6.47337 6.66667 6.66005 6.66667 6.80266 6.594C6.9281 6.53009 7.03009 6.4281 7.094 6.30266C7.16667 6.16005 7.16667 5.97337 7.16667 5.6V3.06667C7.16667 2.6933 7.16667 2.50661 7.094 2.36401C7.03009 2.23856 6.9281 2.13658 6.80266 2.07266C6.66005 2 6.47337 2 6.1 2Z",
+									"stroke": "currentColor",
+									"stroke-width": "1.25",
+									"stroke-linecap": "round",
+									"stroke-linejoin": "round"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M13.4333 2H10.9C10.5266 2 10.3399 2 10.1973 2.07266C10.0719 2.13658 9.96991 2.23856 9.906 2.36401C9.83333 2.50661 9.83333 2.6933 9.83333 3.06667V5.6C9.83333 5.97337 9.83333 6.16005 9.906 6.30266C9.96991 6.4281 10.0719 6.53009 10.1973 6.594C10.3399 6.66667 10.5266 6.66667 10.9 6.66667H13.4333C13.8067 6.66667 13.9934 6.66667 14.136 6.594C14.2614 6.53009 14.3634 6.4281 14.4273 6.30266C14.5 6.16005 14.5 5.97337 14.5 5.6V3.06667C14.5 2.6933 14.5 2.50661 14.4273 2.36401C14.3634 2.23856 14.2614 2.13658 14.136 2.07266C13.9934 2 13.8067 2 13.4333 2Z",
+									"stroke": "currentColor",
+									"stroke-width": "1.25",
+									"stroke-linecap": "round",
+									"stroke-linejoin": "round"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M13.4333 9.33333H10.9C10.5266 9.33333 10.3399 9.33333 10.1973 9.406C10.0719 9.46991 9.96991 9.5719 9.906 9.69734C9.83333 9.83995 9.83333 10.0266 9.83333 10.4V12.9333C9.83333 13.3067 9.83333 13.4934 9.906 13.636C9.96991 13.7614 10.0719 13.8634 10.1973 13.9273C10.3399 14 10.5266 14 10.9 14H13.4333C13.8067 14 13.9934 14 14.136 13.9273C14.2614 13.8634 14.3634 13.7614 14.4273 13.636C14.5 13.4934 14.5 13.3067 14.5 12.9333V10.4C14.5 10.0266 14.5 9.83995 14.4273 9.69734C14.3634 9.5719 14.2614 9.46991 14.136 9.406C13.9934 9.33333 13.8067 9.33333 13.4333 9.33333Z",
+									"stroke": "currentColor",
+									"stroke-width": "1.25",
+									"stroke-linecap": "round",
+									"stroke-linejoin": "round"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M6.1 9.33333H3.56667C3.1933 9.33333 3.00661 9.33333 2.86401 9.406C2.73856 9.46991 2.63658 9.5719 2.57266 9.69734C2.5 9.83995 2.5 10.0266 2.5 10.4V12.9333C2.5 13.3067 2.5 13.4934 2.57266 13.636C2.63658 13.7614 2.73856 13.8634 2.86401 13.9273C3.00661 14 3.1933 14 3.56667 14H6.1C6.47337 14 6.66005 14 6.80266 13.9273C6.9281 13.8634 7.03009 13.7614 7.094 13.636C7.16667 13.4934 7.16667 13.3067 7.16667 12.9333V10.4C7.16667 10.0266 7.16667 9.83995 7.094 9.69734C7.03009 9.5719 6.9281 9.46991 6.80266 9.406C6.66005 9.33333 6.47337 9.33333 6.1 9.33333Z",
+									"stroke": "currentColor",
+									"stroke-width": "1.25",
+									"stroke-linecap": "round",
+									"stroke-linejoin": "round"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Grid01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/layout/Grid01.tsx b/app/components/base/icons/src/vender/line/layout/Grid01.tsx
new file mode 100644
index 0000000..5638f3c
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/layout/Grid01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Grid01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Grid01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/layout/LayoutGrid02.json b/app/components/base/icons/src/vender/line/layout/LayoutGrid02.json
new file mode 100644
index 0000000..d71e981
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/layout/LayoutGrid02.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M3 9H21M3 15H21M12 3V21M7.8 3H16.2C17.8802 3 18.7202 3 19.362 3.32698C19.9265 3.6146 20.3854 4.07354 20.673 4.63803C21 5.27976 21 6.11984 21 7.8V16.2C21 17.8802 21 18.7202 20.673 19.362C20.3854 19.9265 19.9265 20.3854 19.362 20.673C18.7202 21 17.8802 21 16.2 21H7.8C6.11984 21 5.27976 21 4.63803 20.673C4.07354 20.3854 3.6146 19.9265 3.32698 19.362C3 18.7202 3 17.8802 3 16.2V7.8C3 6.11984 3 5.27976 3.32698 4.63803C3.6146 4.07354 4.07354 3.6146 4.63803 3.32698C5.27976 3 6.11984 3 7.8 3Z",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "LayoutGrid02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/layout/LayoutGrid02.tsx b/app/components/base/icons/src/vender/line/layout/LayoutGrid02.tsx
new file mode 100644
index 0000000..f718a66
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/layout/LayoutGrid02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LayoutGrid02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LayoutGrid02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/layout/index.ts b/app/components/base/icons/src/vender/line/layout/index.ts
new file mode 100644
index 0000000..7c12b1f
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/layout/index.ts
@@ -0,0 +1,4 @@
+export { default as AlignLeft01 } from './AlignLeft01'
+export { default as AlignRight01 } from './AlignRight01'
+export { default as Grid01 } from './Grid01'
+export { default as LayoutGrid02 } from './LayoutGrid02'
diff --git a/app/components/base/icons/src/vender/line/mapsAndTravel/Globe01.json b/app/components/base/icons/src/vender/line/mapsAndTravel/Globe01.json
new file mode 100644
index 0000000..1e08966
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mapsAndTravel/Globe01.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "globe-01",
+					"clip-path": "url(#clip0_8902_1914)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M1.33325 7.99998H14.6666M1.33325 7.99998C1.33325 11.6819 4.31802 14.6666 7.99992 14.6666M1.33325 7.99998C1.33325 4.31808 4.31802 1.33331 7.99992 1.33331M14.6666 7.99998C14.6666 11.6819 11.6818 14.6666 7.99992 14.6666M14.6666 7.99998C14.6666 4.31808 11.6818 1.33331 7.99992 1.33331M7.99992 1.33331C9.66744 3.15888 10.6151 5.528 10.6666 7.99998C10.6151 10.472 9.66744 12.8411 7.99992 14.6666M7.99992 1.33331C6.3324 3.15888 5.38475 5.528 5.33325 7.99998C5.38475 10.472 6.3324 12.8411 7.99992 14.6666",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_8902_1914"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "16",
+									"height": "16",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Globe01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/mapsAndTravel/Globe01.tsx b/app/components/base/icons/src/vender/line/mapsAndTravel/Globe01.tsx
new file mode 100644
index 0000000..445fde6
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mapsAndTravel/Globe01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Globe01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Globe01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/mapsAndTravel/Route.json b/app/components/base/icons/src/vender/line/mapsAndTravel/Route.json
new file mode 100644
index 0000000..19cb837
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mapsAndTravel/Route.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "route",
+					"clip-path": "url(#clip0_3167_28693)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M6.70866 2.91699H6.96206C8.73962 2.91699 9.6284 2.91699 9.96578 3.23624C10.2574 3.51221 10.3867 3.91874 10.3079 4.31245C10.2168 4.76792 9.49122 5.28116 8.03999 6.30763L5.66899 7.98468C4.21777 9.01116 3.49215 9.5244 3.40106 9.97987C3.32233 10.3736 3.45157 10.7801 3.7432 11.0561C4.08059 11.3753 4.96937 11.3753 6.74693 11.3753H7.29199M4.66699 2.91699C4.66699 3.88349 3.88349 4.66699 2.91699 4.66699C1.95049 4.66699 1.16699 3.88349 1.16699 2.91699C1.16699 1.95049 1.95049 1.16699 2.91699 1.16699C3.88349 1.16699 4.66699 1.95049 4.66699 2.91699ZM12.8337 11.0837C12.8337 12.0502 12.0502 12.8337 11.0837 12.8337C10.1172 12.8337 9.33366 12.0502 9.33366 11.0837C9.33366 10.1172 10.1172 9.33366 11.0837 9.33366C12.0502 9.33366 12.8337 10.1172 12.8337 11.0837Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_3167_28693"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "14",
+									"height": "14",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Route"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/mapsAndTravel/Route.tsx b/app/components/base/icons/src/vender/line/mapsAndTravel/Route.tsx
new file mode 100644
index 0000000..f81fb61
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mapsAndTravel/Route.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Route.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Route'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/mapsAndTravel/index.ts b/app/components/base/icons/src/vender/line/mapsAndTravel/index.ts
new file mode 100644
index 0000000..8f3cf15
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mapsAndTravel/index.ts
@@ -0,0 +1,2 @@
+export { default as Globe01 } from './Globe01'
+export { default as Route } from './Route'
diff --git a/app/components/base/icons/src/vender/line/mediaAndDevices/Microphone01.json b/app/components/base/icons/src/vender/line/mediaAndDevices/Microphone01.json
new file mode 100644
index 0000000..8f273d0
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mediaAndDevices/Microphone01.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "microphone-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M12.6666 6.66732V8.00065C12.6666 10.578 10.5772 12.6673 7.99992 12.6673M3.33325 6.66732V8.00065C3.33325 10.578 5.42259 12.6673 7.99992 12.6673M7.99992 12.6673V14.6673M5.33325 14.6673H10.6666M7.99992 10.0007C6.89535 10.0007 5.99992 9.10522 5.99992 8.00065V3.33398C5.99992 2.22941 6.89535 1.33398 7.99992 1.33398C9.10449 1.33398 9.99992 2.22941 9.99992 3.33398V8.00065C9.99992 9.10522 9.10449 10.0007 7.99992 10.0007Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Microphone01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/mediaAndDevices/Microphone01.tsx b/app/components/base/icons/src/vender/line/mediaAndDevices/Microphone01.tsx
new file mode 100644
index 0000000..37fb66a
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mediaAndDevices/Microphone01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Microphone01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Microphone01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/mediaAndDevices/PlayCircle.json b/app/components/base/icons/src/vender/line/mediaAndDevices/PlayCircle.json
new file mode 100644
index 0000000..2785125
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mediaAndDevices/PlayCircle.json
@@ -0,0 +1,86 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "play-circle",
+					"clip-path": "url(#clip0_3607_26538)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Icon"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M7.99992 14.6666C11.6818 14.6666 14.6666 11.6819 14.6666 7.99998C14.6666 4.31808 11.6818 1.33331 7.99992 1.33331C4.31802 1.33331 1.33325 4.31808 1.33325 7.99998C1.33325 11.6819 4.31802 14.6666 7.99992 14.6666Z",
+									"stroke": "currentColor",
+									"stroke-width": "1.25",
+									"stroke-linecap": "round",
+									"stroke-linejoin": "round"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M6.66659 5.33331L10.6666 7.99998L6.66659 10.6666V5.33331Z",
+									"stroke": "currentColor",
+									"stroke-width": "1.25",
+									"stroke-linecap": "round",
+									"stroke-linejoin": "round"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_3607_26538"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "16",
+									"height": "16",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "PlayCircle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/mediaAndDevices/PlayCircle.tsx b/app/components/base/icons/src/vender/line/mediaAndDevices/PlayCircle.tsx
new file mode 100644
index 0000000..3298fe3
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mediaAndDevices/PlayCircle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './PlayCircle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'PlayCircle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/mediaAndDevices/SlidersH.json b/app/components/base/icons/src/vender/line/mediaAndDevices/SlidersH.json
new file mode 100644
index 0000000..fc138ee
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mediaAndDevices/SlidersH.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M3 5H9M9 5C9 6.10457 9.89543 7 11 7C12.1046 7 13 6.10457 13 5C13 3.89543 12.1046 3 11 3C9.89543 3 9 3.89543 9 5ZM17 5L21 5M3 12H9M17 12H21M17 12C17 10.8954 16.1046 10 15 10C13.8954 10 13 10.8954 13 12C13 13.1046 13.8954 14 15 14C16.1046 14 17 13.1046 17 12ZM3 19H7M7 19C7 20.1046 7.89543 21 9 21C10.1046 21 11 20.1046 11 19C11 17.8954 10.1046 17 9 17C7.89543 17 7 17.8954 7 19ZM15 19H21",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "SlidersH"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/mediaAndDevices/SlidersH.tsx b/app/components/base/icons/src/vender/line/mediaAndDevices/SlidersH.tsx
new file mode 100644
index 0000000..f5649c4
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mediaAndDevices/SlidersH.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './SlidersH.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'SlidersH'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/mediaAndDevices/Speaker.json b/app/components/base/icons/src/vender/line/mediaAndDevices/Speaker.json
new file mode 100644
index 0000000..3e5cbe1
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mediaAndDevices/Speaker.json
@@ -0,0 +1,112 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_109_6694)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M0 2.86666C0 2.05664 0.656649 1.39999 1.46667 1.39999H5.86667C6.67668 1.39999 7.33333 2.05664 7.33333 2.86666C7.33333 3.27167 7.00501 3.59999 6.6 3.59999C6.19499 3.59999 5.86667 3.27167 5.86667 2.86666H4.4V7.99999C4.80501 7.99999 5.13333 8.32831 5.13333 8.73332C5.13333 9.13833 4.80501 9.46666 4.4 9.46666H2.93333C2.52832 9.46666 2.2 9.13833 2.2 8.73332C2.2 8.32831 2.52832 7.99999 2.93333 7.99999V2.86666H1.46667C1.46667 3.27167 1.13834 3.59999 0.733333 3.59999C0.328324 3.59999 0 3.27167 0 2.86666Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M13.8205 0.782296C13.7434 0.62811 13.5233 0.62811 13.4462 0.782296C12.9664 1.74206 12.8754 1.83302 11.9156 2.3129C11.7615 2.39 11.7615 2.61003 11.9156 2.68712C12.8754 3.167 12.9664 3.25797 13.4462 4.21773C13.5233 4.37191 13.7434 4.37191 13.8205 4.21773C14.3003 3.25797 14.3913 3.167 15.3511 2.68712C15.5053 2.61003 15.5053 2.39 15.3511 2.3129C14.3913 1.83302 14.3003 1.74206 13.8205 0.782296Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M9.79394 2.25319C9.71404 2.09337 9.48596 2.09337 9.40605 2.25319C9.04994 2.96543 8.96544 3.04993 8.2532 3.40605C8.09338 3.48595 8.09338 3.71402 8.2532 3.79393C8.96544 4.15005 9.04994 4.23455 9.40606 4.94679C9.48596 5.10661 9.71404 5.10661 9.79394 4.94679C10.1501 4.23455 10.2346 4.15005 10.9468 3.79393C11.1066 3.71402 11.1066 3.48595 10.9468 3.40605C10.2346 3.04993 10.1501 2.96543 9.79394 2.25319Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M2.75377 11.049C2.67668 10.8948 2.45665 10.8948 2.37956 11.049C1.89969 12.0087 1.80872 12.0997 0.848971 12.5796C0.694788 12.6566 0.694787 12.8767 0.848971 12.9538C1.80872 13.4336 1.89969 13.5246 2.37956 14.4844C2.45665 14.6385 2.67668 14.6385 2.75377 14.4844C3.23365 13.5246 3.32461 13.4336 4.28436 12.9538C4.43855 12.8767 4.43855 12.6566 4.28436 12.5796C3.32461 12.0997 3.23365 12.0087 2.75377 11.049Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M14.6741 8.65106C14.8886 8.50146 15.1837 8.55405 15.3333 8.76853C15.7614 9.38226 16.0125 10.1292 16.0125 10.9333C16.0125 11.7375 15.7614 12.4844 15.3333 13.0981C15.1837 13.3126 14.8886 13.3652 14.6741 13.2156C14.4596 13.066 14.407 12.7708 14.5567 12.5564C14.8775 12.0964 15.0656 11.5375 15.0656 10.9333C15.0656 10.3291 14.8775 9.77025 14.5567 9.31028C14.407 9.09581 14.4596 8.80066 14.6741 8.65106Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M12.5674 6.53771C12.794 6.51987 13.0155 6.61161 13.1632 6.78449C13.2954 6.93929 13.3164 7.12549 13.3244 7.21587C13.3334 7.31718 13.3334 7.44301 13.3333 7.57103C13.3333 7.57691 13.3333 7.58278 13.3333 7.58866L13.3333 14.3C13.3334 14.428 13.3334 14.5539 13.3244 14.6552C13.3164 14.7455 13.2954 14.9317 13.1632 15.0865C13.0155 15.2594 12.794 15.3512 12.5674 15.3333C12.3644 15.3173 12.2179 15.2005 12.1484 15.1423C12.0704 15.077 11.9814 14.988 11.8909 14.8975L10.3795 13.3861C10.3357 13.3423 10.3137 13.3205 10.2971 13.3053L10.2958 13.3041L10.2941 13.3041C10.2716 13.303 10.2407 13.3029 10.1787 13.3029L9.34101 13.3029C9.22151 13.3029 9.10513 13.3029 9.00657 13.2949C8.89833 13.286 8.77062 13.2652 8.6421 13.1997C8.46392 13.1089 8.31906 12.964 8.22827 12.7859C8.16279 12.6574 8.14192 12.5296 8.13308 12.4214C8.12503 12.3228 8.12504 12.2065 8.12505 12.087V9.79916C8.12505 9.79413 8.12505 9.78909 8.12505 9.78406C8.12504 9.66456 8.12503 9.54819 8.13308 9.44963C8.14192 9.34139 8.16279 9.21368 8.22827 9.08517C8.31906 8.90699 8.46392 8.76212 8.6421 8.67133C8.77062 8.60585 8.89833 8.58498 9.00657 8.57614C9.10512 8.56809 9.2215 8.5681 9.341 8.56812C9.34603 8.56812 9.35106 8.56812 9.3561 8.56812H10.1787C10.2407 8.56812 10.2716 8.56801 10.2941 8.56698L10.2958 8.5669L10.2971 8.56575C10.3137 8.55058 10.3357 8.52877 10.3795 8.48491L11.8784 6.98602C11.8826 6.98186 11.8867 6.97771 11.8909 6.97355C11.9814 6.88302 12.0704 6.79403 12.1484 6.72874C12.2179 6.67049 12.3644 6.55368 12.5674 6.53771Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_109_6694"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "16",
+									"height": "16",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Speaker"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/mediaAndDevices/Speaker.tsx b/app/components/base/icons/src/vender/line/mediaAndDevices/Speaker.tsx
new file mode 100644
index 0000000..0cf9364
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mediaAndDevices/Speaker.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Speaker.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Speaker'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/mediaAndDevices/Stop.json b/app/components/base/icons/src/vender/line/mediaAndDevices/Stop.json
new file mode 100644
index 0000000..7d25397
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mediaAndDevices/Stop.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon",
+					"clip-path": "url(#clip0_467_1645)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon_2",
+							"d": "M1.5 3.9C1.5 3.05992 1.5 2.63988 1.66349 2.31901C1.8073 2.03677 2.03677 1.8073 2.31901 1.66349C2.63988 1.5 3.05992 1.5 3.9 1.5H8.1C8.94008 1.5 9.36012 1.5 9.68099 1.66349C9.96323 1.8073 10.1927 2.03677 10.3365 2.31901C10.5 2.63988 10.5 3.05992 10.5 3.9V8.1C10.5 8.94008 10.5 9.36012 10.3365 9.68099C10.1927 9.96323 9.96323 10.1927 9.68099 10.3365C9.36012 10.5 8.94008 10.5 8.1 10.5H3.9C3.05992 10.5 2.63988 10.5 2.31901 10.3365C2.03677 10.1927 1.8073 9.96323 1.66349 9.68099C1.5 9.36012 1.5 8.94008 1.5 8.1V3.9Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_467_1645"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "12",
+									"height": "12",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Stop"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/mediaAndDevices/Stop.tsx b/app/components/base/icons/src/vender/line/mediaAndDevices/Stop.tsx
new file mode 100644
index 0000000..3b5d84b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mediaAndDevices/Stop.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Stop.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Stop'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/mediaAndDevices/StopCircle.json b/app/components/base/icons/src/vender/line/mediaAndDevices/StopCircle.json
new file mode 100644
index 0000000..2d45601
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mediaAndDevices/StopCircle.json
@@ -0,0 +1,59 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "17",
+			"height": "16",
+			"viewBox": "0 0 17 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Icon_2"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M8.49967 14.6663C12.1816 14.6663 15.1663 11.6816 15.1663 7.99967C15.1663 4.31778 12.1816 1.33301 8.49967 1.33301C4.81778 1.33301 1.83301 4.31778 1.83301 7.99967C1.83301 11.6816 4.81778 14.6663 8.49967 14.6663Z",
+									"stroke": "currentColor",
+									"stroke-width": "1.5",
+									"stroke-linecap": "round",
+									"stroke-linejoin": "round"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M10.4997 5.99967H6.49967V9.99967H10.4997V5.99967Z",
+									"stroke": "currentColor",
+									"stroke-width": "1.5",
+									"stroke-linecap": "round",
+									"stroke-linejoin": "round"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "StopCircle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/mediaAndDevices/StopCircle.tsx b/app/components/base/icons/src/vender/line/mediaAndDevices/StopCircle.tsx
new file mode 100644
index 0000000..84430c3
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mediaAndDevices/StopCircle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './StopCircle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'StopCircle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/mediaAndDevices/index.ts b/app/components/base/icons/src/vender/line/mediaAndDevices/index.ts
new file mode 100644
index 0000000..662f0fa
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/mediaAndDevices/index.ts
@@ -0,0 +1,6 @@
+export { default as Microphone01 } from './Microphone01'
+export { default as PlayCircle } from './PlayCircle'
+export { default as SlidersH } from './SlidersH'
+export { default as Speaker } from './Speaker'
+export { default as StopCircle } from './StopCircle'
+export { default as Stop } from './Stop'
diff --git a/app/components/base/icons/src/vender/line/others/Apps02.json b/app/components/base/icons/src/vender/line/others/Apps02.json
new file mode 100644
index 0000000..2ff128f
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/Apps02.json
@@ -0,0 +1,36 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "apps-2-line"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M4.66602 7.6665C3.00916 7.6665 1.66602 6.32336 1.66602 4.6665C1.66602 3.00965 3.00916 1.6665 4.66602 1.6665C6.32287 1.6665 7.66602 3.00965 7.66602 4.6665C7.66602 6.32336 6.32287 7.6665 4.66602 7.6665ZM4.66602 14.3332C3.00916 14.3332 1.66602 12.99 1.66602 11.3332C1.66602 9.6763 3.00916 8.33317 4.66602 8.33317C6.32287 8.33317 7.66602 9.6763 7.66602 11.3332C7.66602 12.99 6.32287 14.3332 4.66602 14.3332ZM11.3327 7.6665C9.67582 7.6665 8.33268 6.32336 8.33268 4.6665C8.33268 3.00965 9.67582 1.6665 11.3327 1.6665C12.9895 1.6665 14.3327 3.00965 14.3327 4.6665C14.3327 6.32336 12.9895 7.6665 11.3327 7.6665ZM11.3327 14.3332C9.67582 14.3332 8.33268 12.99 8.33268 11.3332C8.33268 9.6763 9.67582 8.33317 11.3327 8.33317C12.9895 8.33317 14.3327 9.6763 14.3327 11.3332C14.3327 12.99 12.9895 14.3332 11.3327 14.3332ZM4.66602 6.33317C5.58649 6.33317 6.33268 5.58698 6.33268 4.6665C6.33268 3.74603 5.58649 2.99984 4.66602 2.99984C3.74554 2.99984 2.99935 3.74603 2.99935 4.6665C2.99935 5.58698 3.74554 6.33317 4.66602 6.33317ZM4.66602 12.9998C5.58649 12.9998 6.33268 12.2536 6.33268 11.3332C6.33268 10.4127 5.58649 9.6665 4.66602 9.6665C3.74554 9.6665 2.99935 10.4127 2.99935 11.3332C2.99935 12.2536 3.74554 12.9998 4.66602 12.9998ZM11.3327 6.33317C12.2531 6.33317 12.9993 5.58698 12.9993 4.6665C12.9993 3.74603 12.2531 2.99984 11.3327 2.99984C10.4122 2.99984 9.66602 3.74603 9.66602 4.6665C9.66602 5.58698 10.4122 6.33317 11.3327 6.33317ZM11.3327 12.9998C12.2531 12.9998 12.9993 12.2536 12.9993 11.3332C12.9993 10.4127 12.2531 9.6665 11.3327 9.6665C10.4122 9.6665 9.66602 10.4127 9.66602 11.3332C9.66602 12.2536 10.4122 12.9998 11.3327 12.9998Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Apps02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/others/Apps02.tsx b/app/components/base/icons/src/vender/line/others/Apps02.tsx
new file mode 100644
index 0000000..070cc28
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/Apps02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Apps02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Apps02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/others/BubbleX.json b/app/components/base/icons/src/vender/line/others/BubbleX.json
new file mode 100644
index 0000000..0cb5702
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/BubbleX.json
@@ -0,0 +1,57 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon L"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M3.33463 3.33333C2.96643 3.33333 2.66796 3.63181 2.66796 4V10.6667C2.66796 11.0349 2.96643 11.3333 3.33463 11.3333H4.66796C5.03615 11.3333 5.33463 11.6318 5.33463 12V12.8225L7.65833 11.4283C7.76194 11.3662 7.8805 11.3333 8.00132 11.3333H12.0013C12.3695 11.3333 12.668 11.0349 12.668 10.6667C12.668 10.2985 12.9665 10 13.3347 10C13.7028 10 14.0013 10.2985 14.0013 10.6667C14.0013 11.7713 13.1058 12.6667 12.0013 12.6667H8.18598L5.01095 14.5717C4.805 14.6952 4.5485 14.6985 4.33949 14.5801C4.13049 14.4618 4.00129 14.2402 4.00129 14V12.6667H3.33463C2.23006 12.6667 1.33463 11.7713 1.33463 10.6667V4C1.33463 2.89543 2.23006 2 3.33463 2H6.66798C7.03617 2 7.33464 2.29848 7.33464 2.66667C7.33464 3.03486 7.03617 3.33333 6.66798 3.33333H3.33463Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M8.74113 2.66667C8.74113 2.29848 9.03961 2 9.4078 2H10.331C10.9721 2 11.5177 2.43571 11.6859 3.04075L11.933 3.93004L12.8986 2.77189C13.3045 2.28508 13.9018 2 14.536 2H14.5954C14.9636 2 15.2621 2.29848 15.2621 2.66667C15.2621 3.03486 14.9636 3.33333 14.5954 3.33333H14.536C14.3048 3.33333 14.08 3.43702 13.9227 3.6257L12.367 5.49165L12.8609 7.2689C12.8746 7.31803 12.9105 7.33333 12.9312 7.33333H13.8543C14.2225 7.33333 14.521 7.63181 14.521 8C14.521 8.36819 14.2225 8.66667 13.8543 8.66667H12.9312C12.29 8.66667 11.7444 8.23095 11.5763 7.62591L11.3291 6.73654L10.3634 7.89478C9.95758 8.38159 9.36022 8.66667 8.72604 8.66667H8.66666C8.29847 8.66667 7.99999 8.36819 7.99999 8C7.99999 7.63181 8.29847 7.33333 8.66666 7.33333H8.72604C8.95723 7.33333 9.18204 7.22965 9.33935 7.04096L10.8951 5.17493L10.4012 3.39777C10.3876 3.34863 10.3516 3.33333 10.331 3.33333H9.4078C9.03961 3.33333 8.74113 3.03486 8.74113 2.66667Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "BubbleX"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/others/BubbleX.tsx b/app/components/base/icons/src/vender/line/others/BubbleX.tsx
new file mode 100644
index 0000000..80d4331
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/BubbleX.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './BubbleX.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'BubbleX'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/others/Colors.json b/app/components/base/icons/src/vender/line/others/Colors.json
new file mode 100644
index 0000000..b1832c2
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/Colors.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "colors",
+					"clip-path": "url(#clip0_18499_53582)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M7.00032 11.9422C7.61954 12.4964 8.43724 12.8334 9.33366 12.8334C11.2667 12.8334 12.8337 11.2664 12.8337 9.33342C12.8337 7.71938 11.7411 6.36051 10.2552 5.95602M3.74543 5.95601C2.25954 6.3605 1.16699 7.71937 1.16699 9.33341C1.16699 11.2664 2.734 12.8334 4.66699 12.8334C6.59999 12.8334 8.16699 11.2664 8.16699 9.33341C8.16699 8.87813 8.08006 8.44314 7.92189 8.04415M10.5003 4.66675C10.5003 6.59974 8.93332 8.16675 7.00033 8.16675C5.06733 8.16675 3.50033 6.59974 3.50033 4.66675C3.50033 2.73375 5.06733 1.16675 7.00033 1.16675C8.93332 1.16675 10.5003 2.73375 10.5003 4.66675Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_18499_53582"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "14",
+									"height": "14",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Colors"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/others/Colors.tsx b/app/components/base/icons/src/vender/line/others/Colors.tsx
new file mode 100644
index 0000000..bdfe6d1
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/Colors.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Colors.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Colors'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/others/DragHandle.json b/app/components/base/icons/src/vender/line/others/DragHandle.json
new file mode 100644
index 0000000..c1364af
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/DragHandle.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Drag Handle"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "drag-handle",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M6 5C6.55228 5 7 4.55228 7 4C7 3.44772 6.55228 3 6 3C5.44772 3 5 3.44772 5 4C5 4.55228 5.44772 5 6 5ZM6 9C6.55228 9 7 8.55228 7 8C7 7.44772 6.55228 7 6 7C5.44772 7 5 7.44772 5 8C5 8.55228 5.44772 9 6 9ZM11 4C11 4.55228 10.5523 5 10 5C9.44772 5 9 4.55228 9 4C9 3.44772 9.44772 3 10 3C10.5523 3 11 3.44772 11 4ZM10 9C10.5523 9 11 8.55228 11 8C11 7.44772 10.5523 7 10 7C9.44772 7 9 7.44772 9 8C9 8.55228 9.44772 9 10 9ZM7 12C7 12.5523 6.55228 13 6 13C5.44772 13 5 12.5523 5 12C5 11.4477 5.44772 11 6 11C6.55228 11 7 11.4477 7 12ZM10 13C10.5523 13 11 12.5523 11 12C11 11.4477 10.5523 11 10 11C9.44772 11 9 11.4477 9 12C9 12.5523 9.44772 13 10 13Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "DragHandle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/others/DragHandle.tsx b/app/components/base/icons/src/vender/line/others/DragHandle.tsx
new file mode 100644
index 0000000..495c29c
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/DragHandle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './DragHandle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'DragHandle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/others/Env.json b/app/components/base/icons/src/vender/line/others/Env.json
new file mode 100644
index 0000000..87a88ed
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/Env.json
@@ -0,0 +1,90 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "env"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M1.33325 3.33325C1.33325 2.22868 2.22868 1.33325 3.33325 1.33325H12.6666C13.7712 1.33325 14.6666 2.22869 14.6666 3.33325V3.66659C14.6666 4.03478 14.3681 4.33325 13.9999 4.33325C13.6317 4.33325 13.3333 4.03478 13.3333 3.66659V3.33325C13.3333 2.96506 13.0348 2.66659 12.6666 2.66659H3.33325C2.96506 2.66659 2.66659 2.96506 2.66659 3.33325V3.66659C2.66659 4.03478 2.36811 4.33325 1.99992 4.33325C1.63173 4.33325 1.33325 4.03478 1.33325 3.66659V3.33325Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M14.6666 12.6666C14.6666 13.7712 13.7712 14.6666 12.6666 14.6666L3.33325 14.6666C2.22866 14.6666 1.33325 13.7711 1.33325 12.6666L1.33325 12.3333C1.33325 11.9651 1.63173 11.6666 1.99992 11.6666C2.36811 11.6666 2.66659 11.9651 2.66659 12.3333V12.6666C2.66659 13.0348 2.96505 13.3333 3.33325 13.3333L12.6666 13.3333C13.0348 13.3333 13.3333 13.0348 13.3333 12.6666V12.3333C13.3333 11.9651 13.6317 11.6666 13.9999 11.6666C14.3681 11.6666 14.6666 11.9651 14.6666 12.3333V12.6666Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M1.33325 5.99992C1.33325 5.63173 1.63173 5.33325 1.99992 5.33325H4.33325C4.70144 5.33325 4.99992 5.63173 4.99992 5.99992C4.99992 6.36811 4.70144 6.66658 4.33325 6.66658H2.66659V7.33325H3.99992C4.36811 7.33325 4.66659 7.63173 4.66659 7.99992C4.66659 8.36811 4.36811 8.66658 3.99992 8.66658H2.66659V9.33325H4.33325C4.70144 9.33325 4.99992 9.63173 4.99992 9.99992C4.99992 10.3681 4.70144 10.6666 4.33325 10.6666H1.99992C1.63173 10.6666 1.33325 10.3681 1.33325 9.99992V5.99992Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M6.4734 5.36186C6.75457 5.27673 7.05833 5.38568 7.22129 5.63012L8.66659 7.79807V5.99992C8.66659 5.63173 8.96506 5.33325 9.33325 5.33325C9.70144 5.33325 9.99992 5.63173 9.99992 5.99992V9.99992C9.99992 10.2937 9.80761 10.5528 9.52644 10.638C9.24527 10.7231 8.94151 10.6142 8.77855 10.3697L7.33325 8.20177V9.99992C7.33325 10.3681 7.03478 10.6666 6.66659 10.6666C6.2984 10.6666 5.99992 10.3681 5.99992 9.99992V5.99992C5.99992 5.70614 6.19222 5.44699 6.4734 5.36186Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M11.0768 5.38453C11.4167 5.24292 11.807 5.40364 11.9486 5.74351L12.9999 8.26658L14.0512 5.74351C14.1928 5.40364 14.5831 5.24292 14.923 5.38453C15.2629 5.52614 15.4236 5.91646 15.282 6.25633L13.6153 10.2563C13.5118 10.5048 13.2691 10.6666 12.9999 10.6666C12.7308 10.6666 12.488 10.5048 12.3845 10.2563L10.7179 6.25633C10.5763 5.91646 10.737 5.52614 11.0768 5.38453Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Env"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/others/Env.tsx b/app/components/base/icons/src/vender/line/others/Env.tsx
new file mode 100644
index 0000000..fbfc3a7
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/Env.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Env.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Env'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/others/Exchange02.json b/app/components/base/icons/src/vender/line/others/Exchange02.json
new file mode 100644
index 0000000..808a9ff
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/Exchange02.json
@@ -0,0 +1,26 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M4.66602 14.3334C3.00916 14.3334 1.66602 12.9903 1.66602 11.3334C1.66602 9.67655 3.00916 8.33342 4.66602 8.33342C6.32287 8.33342 7.66602 9.67655 7.66602 11.3334C7.66602 12.9903 6.32287 14.3334 4.66602 14.3334ZM11.3327 7.66675C9.67582 7.66675 8.33268 6.3236 8.33268 4.66675C8.33268 3.00989 9.67582 1.66675 11.3327 1.66675C12.9895 1.66675 14.3327 3.00989 14.3327 4.66675C14.3327 6.3236 12.9895 7.66675 11.3327 7.66675ZM4.66602 13.0001C5.58649 13.0001 6.33268 12.2539 6.33268 11.3334C6.33268 10.4129 5.58649 9.66675 4.66602 9.66675C3.74554 9.66675 2.99935 10.4129 2.99935 11.3334C2.99935 12.2539 3.74554 13.0001 4.66602 13.0001ZM11.3327 6.33342C12.2531 6.33342 12.9993 5.58722 12.9993 4.66675C12.9993 3.74627 12.2531 3.00008 11.3327 3.00008C10.4122 3.00008 9.66602 3.74627 9.66602 4.66675C9.66602 5.58722 10.4122 6.33342 11.3327 6.33342ZM1.99935 5.33341C1.99935 3.49247 3.49174 2.00008 5.33268 2.00008H7.33268V3.33341H5.33268C4.22812 3.33341 3.33268 4.22885 3.33268 5.33341V7.33342H1.99935V5.33341ZM13.9993 8.66675H12.666V10.6667C12.666 11.7713 11.7706 12.6667 10.666 12.6667H8.66602V14.0001H10.666C12.5069 14.0001 13.9993 12.5077 13.9993 10.6667V8.66675Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Exchange02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/others/Exchange02.tsx b/app/components/base/icons/src/vender/line/others/Exchange02.tsx
new file mode 100644
index 0000000..782a3fc
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/Exchange02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Exchange02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Exchange02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/others/FileCode.json b/app/components/base/icons/src/vender/line/others/FileCode.json
new file mode 100644
index 0000000..41050a5
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/FileCode.json
@@ -0,0 +1,26 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M10 2.66659H3.33333V13.3333H12.6667V5.33325H10V2.66659ZM2 1.99445C2 1.62929 2.29833 1.33325 2.66567 1.33325H10.6667L13.9998 4.66658L14 13.9949C14 14.3659 13.7034 14.6666 13.3377 14.6666H2.66227C2.29651 14.6666 2 14.3631 2 14.0054V1.99445ZM11.7713 7.99992L9.4142 10.3569L8.4714 9.41412L9.8856 7.99992L8.4714 6.58571L9.4142 5.6429L11.7713 7.99992ZM4.22877 7.99992L6.58579 5.6429L7.5286 6.58571L6.11438 7.99992L7.5286 9.41412L6.58579 10.3569L4.22877 7.99992Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "FileCode"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/others/FileCode.tsx b/app/components/base/icons/src/vender/line/others/FileCode.tsx
new file mode 100644
index 0000000..10df81b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/FileCode.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './FileCode.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'FileCode'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/others/GlobalVariable.json b/app/components/base/icons/src/vender/line/others/GlobalVariable.json
new file mode 100644
index 0000000..d5fce59
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/GlobalVariable.json
@@ -0,0 +1,28 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M6.23814 1.33333H9.76188C10.4844 1.33332 11.0672 1.33332 11.5391 1.37187C12.025 1.41157 12.4518 1.49545 12.8466 1.69664C13.4739 2.01622 13.9838 2.52615 14.3034 3.15336C14.5046 3.54822 14.5884 3.97501 14.6281 4.46091C14.6667 4.93283 14.6667 5.51559 14.6667 6.23811V9.76188C14.6667 10.4844 14.6667 11.0672 14.6281 11.5391C14.5884 12.025 14.5046 12.4518 14.3034 12.8466C13.9838 13.4738 13.4739 13.9838 12.8466 14.3033C12.4518 14.5045 12.025 14.5884 11.5391 14.6281C11.0672 14.6667 10.4844 14.6667 9.7619 14.6667H6.23812C5.51561 14.6667 4.93284 14.6667 4.46093 14.6281C3.97503 14.5884 3.54824 14.5045 3.15338 14.3033C2.52617 13.9838 2.01623 13.4738 1.69666 12.8466C1.49546 12.4518 1.41159 12.025 1.37189 11.5391C1.33333 11.0672 1.33334 10.4844 1.33334 9.76187V6.23812C1.33334 5.5156 1.33333 4.93283 1.37189 4.46091C1.41159 3.97501 1.49546 3.54822 1.69666 3.15336C2.01623 2.52615 2.52617 2.01622 3.15338 1.69664C3.54824 1.49545 3.97503 1.41157 4.46093 1.37187C4.93285 1.33332 5.51561 1.33332 6.23814 1.33333ZM4.5695 2.70078C4.16606 2.73374 3.93427 2.79519 3.7587 2.88465C3.38237 3.0764 3.07641 3.38236 2.88466 3.75868C2.79521 3.93425 2.73376 4.16604 2.70079 4.56949C2.6672 4.98072 2.66668 5.50892 2.66668 6.26666V9.73333C2.66668 10.4911 2.6672 11.0193 2.70079 11.4305C2.73376 11.8339 2.79521 12.0657 2.88466 12.2413C3.07641 12.6176 3.38237 12.9236 3.7587 13.1153C3.93427 13.2048 4.16606 13.2662 4.5695 13.2992C4.98073 13.3328 5.50894 13.3333 6.26668 13.3333H9.73334C10.4911 13.3333 11.0193 13.3328 11.4305 13.2992C11.834 13.2662 12.0658 13.2048 12.2413 13.1153C12.6176 12.9236 12.9236 12.6176 13.1154 12.2413C13.2048 12.0657 13.2663 11.8339 13.2992 11.4305C13.3328 11.0193 13.3333 10.4911 13.3333 9.73333V6.26666C13.3333 5.50892 13.3328 4.98072 13.2992 4.56949C13.2663 4.16604 13.2048 3.93425 13.1154 3.75868C12.9236 3.38236 12.6176 3.0764 12.2413 2.88465C12.0658 2.79519 11.834 2.73374 11.4305 2.70078C11.0193 2.66718 10.4911 2.66666 9.73334 2.66666H6.26668C5.50894 2.66666 4.98073 2.66718 4.5695 2.70078ZM5.08339 5.33333C5.08339 4.96514 5.38187 4.66666 5.75006 4.66666H6.68433C7.324 4.66666 7.87606 5.09677 8.04724 5.70542L8.30138 6.60902L9.2915 5.43554C9.7018 4.94926 10.3035 4.66666 10.9399 4.66666H11C11.3682 4.66666 11.6667 4.96514 11.6667 5.33333C11.6667 5.70152 11.3682 5.99999 11 5.99999H10.9399C10.7005 5.99999 10.4702 6.10616 10.3106 6.29537L8.73751 8.15972L9.23641 9.93357C9.24921 9.97909 9.28574 10 9.31579 10H10.2501C10.6182 10 10.9167 10.2985 10.9167 10.6667C10.9167 11.0349 10.6182 11.3333 10.2501 11.3333H9.31579C8.67612 11.3333 8.12406 10.9032 7.95288 10.2946L7.69871 9.39088L6.70852 10.5644C6.29822 11.0507 5.6965 11.3333 5.06011 11.3333H5.00001C4.63182 11.3333 4.33334 11.0349 4.33334 10.6667C4.33334 10.2985 4.63182 10 5.00001 10H5.06011C5.29949 10 5.52982 9.89383 5.68946 9.70462L7.26258 7.84019L6.76371 6.06642C6.75091 6.0209 6.71438 5.99999 6.68433 5.99999H5.75006C5.38187 5.99999 5.08339 5.70152 5.08339 5.33333Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "GlobalVariable"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/others/GlobalVariable.tsx b/app/components/base/icons/src/vender/line/others/GlobalVariable.tsx
new file mode 100644
index 0000000..7758863
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/GlobalVariable.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './GlobalVariable.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'GlobalVariable'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/others/Icon3Dots.json b/app/components/base/icons/src/vender/line/others/Icon3Dots.json
new file mode 100644
index 0000000..0942222
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/Icon3Dots.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon-3-dots"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M5 6.5V5M8.93934 7.56066L10 6.5M10.0103 11.5H11.5103",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Icon3Dots"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/others/Icon3Dots.tsx b/app/components/base/icons/src/vender/line/others/Icon3Dots.tsx
new file mode 100644
index 0000000..bcc2cee
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/Icon3Dots.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Icon3Dots.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Icon3Dots'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/others/LongArrowLeft.json b/app/components/base/icons/src/vender/line/others/LongArrowLeft.json
new file mode 100644
index 0000000..d2646b1
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/LongArrowLeft.json
@@ -0,0 +1,27 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "21",
+			"height": "8",
+			"viewBox": "0 0 21 8",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M0.646446 3.64645C0.451185 3.84171 0.451185 4.15829 0.646446 4.35355L3.82843 7.53553C4.02369 7.7308 4.34027 7.7308 4.53553 7.53553C4.7308 7.34027 4.7308 7.02369 4.53553 6.82843L1.70711 4L4.53553 1.17157C4.7308 0.976311 4.7308 0.659728 4.53553 0.464466C4.34027 0.269204 4.02369 0.269204 3.82843 0.464466L0.646446 3.64645ZM21 3.5L1 3.5V4.5L21 4.5V3.5Z",
+					"fill": "currentColor",
+					"fill-opacity": "0.3"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "LongArrowLeft"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/others/LongArrowLeft.tsx b/app/components/base/icons/src/vender/line/others/LongArrowLeft.tsx
new file mode 100644
index 0000000..997201b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/LongArrowLeft.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LongArrowLeft.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LongArrowLeft'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/others/LongArrowRight.json b/app/components/base/icons/src/vender/line/others/LongArrowRight.json
new file mode 100644
index 0000000..7582b81
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/LongArrowRight.json
@@ -0,0 +1,27 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "26",
+			"height": "8",
+			"viewBox": "0 0 26 8",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M25.3536 4.35355C25.5488 4.15829 25.5488 3.84171 25.3536 3.64644L22.1716 0.464465C21.9763 0.269202 21.6597 0.269202 21.4645 0.464465C21.2692 0.659727 21.2692 0.976309 21.4645 1.17157L24.2929 4L21.4645 6.82843C21.2692 7.02369 21.2692 7.34027 21.4645 7.53553C21.6597 7.73079 21.9763 7.73079 22.1716 7.53553L25.3536 4.35355ZM3.59058e-08 4.5L25 4.5L25 3.5L-3.59058e-08 3.5L3.59058e-08 4.5Z",
+					"fill": "currentColor",
+					"fill-opacity": "0.3"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "LongArrowRight"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/others/LongArrowRight.tsx b/app/components/base/icons/src/vender/line/others/LongArrowRight.tsx
new file mode 100644
index 0000000..42732f9
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/LongArrowRight.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LongArrowRight.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LongArrowRight'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/others/Tools.json b/app/components/base/icons/src/vender/line/others/Tools.json
new file mode 100644
index 0000000..0ab6857
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/Tools.json
@@ -0,0 +1,119 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "17",
+			"viewBox": "0 0 16 17",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Tools",
+					"clip-path": "url(#clip0_5381_39479)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "vector",
+							"d": "M13.4375 14.4375V6.8125H2.5625V14.4375C2.5625 14.9898 3.01022 15.4375 3.5625 15.4375H12.4375C12.9898 15.4375 13.4375 14.9898 13.4375 14.4375Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "vector_2",
+							"d": "M13.6254 2.875L11.1738 6.47327",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "vector_3",
+							"d": "M6.3125 9.8125H9.6875",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "vector_4",
+							"d": "M8.63355 1.88044L8.75 1.64754L8.86645 1.88044C8.97531 2.09816 9.15184 2.27469 9.36956 2.38355L9.60246 2.5L9.36956 2.61645C9.15184 2.72531 8.97531 2.90184 8.86645 3.11956L8.75 3.35246L8.63355 3.11956C8.52469 2.90184 8.34816 2.72531 8.13044 2.61645L7.89754 2.5L8.13044 2.38355C8.34816 2.27469 8.52469 2.09816 8.63355 1.88044Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "square",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "vector_5",
+							"d": "M4.625 3.14754L4.61865 3.16025C4.51946 3.35862 4.35862 3.51946 4.16025 3.61865L4.14754 3.625L4.16025 3.63135C4.35862 3.73054 4.51946 3.89138 4.61865 4.08975L4.625 4.10246L4.63135 4.08975C4.73054 3.89138 4.89138 3.73054 5.08975 3.63135L5.10246 3.625L5.08975 3.61865C4.89138 3.51946 4.73054 3.35862 4.63135 3.16025L4.625 3.14754ZM4.625 3.14754L4.63135 3.16025L4.625 3.14754Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "square",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_5381_39479"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "16",
+									"height": "16",
+									"fill": "white",
+									"transform": "translate(0 0.5)"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Tools"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/others/Tools.tsx b/app/components/base/icons/src/vender/line/others/Tools.tsx
new file mode 100644
index 0000000..6d02329
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/Tools.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Tools.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Tools'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/others/index.ts b/app/components/base/icons/src/vender/line/others/index.ts
new file mode 100644
index 0000000..19d5f1e
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/others/index.ts
@@ -0,0 +1,12 @@
+export { default as Apps02 } from './Apps02'
+export { default as BubbleX } from './BubbleX'
+export { default as Colors } from './Colors'
+export { default as DragHandle } from './DragHandle'
+export { default as Env } from './Env'
+export { default as Exchange02 } from './Exchange02'
+export { default as FileCode } from './FileCode'
+export { default as GlobalVariable } from './GlobalVariable'
+export { default as Icon3Dots } from './Icon3Dots'
+export { default as LongArrowLeft } from './LongArrowLeft'
+export { default as LongArrowRight } from './LongArrowRight'
+export { default as Tools } from './Tools'
diff --git a/app/components/base/icons/src/vender/line/shapes/CubeOutline.json b/app/components/base/icons/src/vender/line/shapes/CubeOutline.json
new file mode 100644
index 0000000..4091004
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/shapes/CubeOutline.json
@@ -0,0 +1,98 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "17",
+			"viewBox": "0 0 16 17",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "cube-outline"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M8.26865 1.29003C8.09143 1.25358 7.90866 1.25358 7.73144 1.29003C7.52659 1.33216 7.3435 1.43471 7.19794 1.51624L7.15826 1.53841L6.17628 2.08395C5.85443 2.26276 5.73846 2.66863 5.91727 2.99049C6.09608 3.31234 6.50195 3.4283 6.82381 3.24949L7.80579 2.70395C7.90681 2.64782 7.95839 2.61946 7.99686 2.60091L8.00004 2.59938L8.00323 2.60091C8.0417 2.61946 8.09327 2.64782 8.1943 2.70395L9.17628 3.24949C9.49814 3.4283 9.90401 3.31234 10.0828 2.99048C10.2616 2.66863 10.1457 2.26276 9.82381 2.08395L8.84183 1.53841L8.80215 1.51624C8.65659 1.43471 8.4735 1.33216 8.26865 1.29003Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M12.8238 3.75062C12.5019 3.57181 12.0961 3.68777 11.9173 4.00963C11.7385 4.33148 11.8544 4.73735 12.1763 4.91616L12.6272 5.16668L12.1763 5.41719C11.8545 5.596 11.7385 6.00186 11.9173 6.32372C12.0961 6.64558 12.502 6.76154 12.8238 6.58273L13.3334 6.29966V6.83339C13.3334 7.20158 13.6319 7.50006 14 7.50006C14.3682 7.50006 14.6667 7.20158 14.6667 6.83339V5.79435L14.6668 5.74627C14.6673 5.62441 14.6678 5.48084 14.6452 5.33482C14.6869 5.17472 14.6696 4.99892 14.5829 4.84286C14.4904 4.6764 14.3371 4.56501 14.1662 4.52099C14.0496 4.43038 13.9239 4.36116 13.8173 4.3024L13.7752 4.27915L12.8238 3.75062Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M3.8238 4.91616C4.14566 4.73735 4.26162 4.33148 4.08281 4.00963C3.90401 3.68777 3.49814 3.57181 3.17628 3.75062L2.22493 4.27915L2.18284 4.3024C2.07615 4.36116 1.95045 4.4304 1.83382 4.52102C1.66295 4.56506 1.50977 4.67643 1.41731 4.84286C1.33065 4.99886 1.31323 5.17459 1.35493 5.33464C1.33229 5.48072 1.33281 5.62436 1.33326 5.74627L1.33338 5.79435V6.83339C1.33338 7.20158 1.63185 7.50006 2.00004 7.50006C2.36823 7.50006 2.66671 7.20158 2.66671 6.83339V6.29961L3.17632 6.58273C3.49817 6.76154 3.90404 6.64558 4.08285 6.32372C4.26166 6.00186 4.1457 5.596 3.82384 5.41719L3.3729 5.16666L3.8238 4.91616Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M2.66671 10.1667C2.66671 9.79853 2.36823 9.50006 2.00004 9.50006C1.63185 9.50006 1.33338 9.79853 1.33338 10.1667V11.2058L1.33326 11.2538C1.33262 11.4298 1.33181 11.6509 1.40069 11.8594C1.46024 12.0397 1.55759 12.2051 1.68622 12.3447C1.835 12.5061 2.02873 12.6128 2.18281 12.6977L2.22493 12.721L3.17628 13.2495C3.49814 13.4283 3.90401 13.3123 4.08281 12.9905C4.26162 12.6686 4.14566 12.2628 3.8238 12.084L2.87245 11.5554C2.76582 11.4962 2.71137 11.4656 2.67318 11.4413L2.66995 11.4392L2.66971 11.4354C2.66699 11.3902 2.66671 11.3277 2.66671 11.2058V10.1667Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M14.6667 10.1667C14.6667 9.79853 14.3682 9.50006 14 9.50006C13.6319 9.50006 13.3334 9.79853 13.3334 10.1667V11.2058C13.3334 11.3277 13.3331 11.3902 13.3304 11.4354L13.3301 11.4392L13.3269 11.4413C13.2887 11.4656 13.2343 11.4962 13.1276 11.5554L12.1763 12.084C11.8544 12.2628 11.7385 12.6686 11.9173 12.9905C12.0961 13.3123 12.5019 13.4283 12.8238 13.2495L13.7752 12.721L13.8172 12.6977C13.9713 12.6128 14.1651 12.5061 14.3139 12.3447C14.4425 12.2051 14.5398 12.0397 14.5994 11.8594C14.6683 11.6509 14.6675 11.4298 14.6668 11.2538L14.6667 11.2058V10.1667Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M6.82381 13.7506C6.50195 13.5718 6.09608 13.6878 5.91727 14.0096C5.73846 14.3315 5.85443 14.7374 6.17628 14.9162L7.15826 15.4617L7.19793 15.4839C7.29819 15.54 7.41625 15.6061 7.54696 15.6556C7.66589 15.7659 7.82512 15.8333 8.00008 15.8333C8.17507 15.8333 8.33431 15.7659 8.45324 15.6556C8.58391 15.6061 8.70193 15.54 8.80215 15.4839L8.84183 15.4617L9.82381 14.9162C10.1457 14.7374 10.2616 14.3315 10.0828 14.0096C9.90401 13.6878 9.49814 13.5718 9.17628 13.7506L8.66675 14.0337V13.5C8.66675 13.1318 8.36827 12.8333 8.00008 12.8333C7.63189 12.8333 7.33341 13.1318 7.33341 13.5V14.0337L6.82381 13.7506Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M6.82384 7.08385C6.50199 6.90505 6.09612 7.02101 5.91731 7.34286C5.7385 7.66472 5.85446 8.07059 6.17632 8.2494L7.33341 8.89223V10.1666C7.33341 10.5348 7.63189 10.8333 8.00008 10.8333C8.36827 10.8333 8.66675 10.5348 8.66675 10.1666V8.89223L9.82384 8.2494C10.1457 8.07059 10.2617 7.66472 10.0829 7.34286C9.90404 7.02101 9.49817 6.90505 9.17632 7.08385L8.00008 7.73732L6.82384 7.08385Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "CubeOutline"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/shapes/CubeOutline.tsx b/app/components/base/icons/src/vender/line/shapes/CubeOutline.tsx
new file mode 100644
index 0000000..40e0df2
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/shapes/CubeOutline.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './CubeOutline.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'CubeOutline'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/shapes/index.ts b/app/components/base/icons/src/vender/line/shapes/index.ts
new file mode 100644
index 0000000..daf43bc
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/shapes/index.ts
@@ -0,0 +1 @@
+export { default as CubeOutline } from './CubeOutline'
diff --git a/app/components/base/icons/src/vender/line/time/ClockFastForward.json b/app/components/base/icons/src/vender/line/time/ClockFastForward.json
new file mode 100644
index 0000000..26b7208
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/time/ClockFastForward.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M22.7 11.5L20.7005 13.5L18.7 11.5M20.9451 13C20.9814 12.6717 21 12.338 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21C14.8273 21 17.35 19.6963 19 17.6573M12 7V12L15 14",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "ClockFastForward"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/time/ClockFastForward.tsx b/app/components/base/icons/src/vender/line/time/ClockFastForward.tsx
new file mode 100644
index 0000000..e520c5a
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/time/ClockFastForward.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ClockFastForward.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ClockFastForward'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/time/ClockPlay.json b/app/components/base/icons/src/vender/line/time/ClockPlay.json
new file mode 100644
index 0000000..7d3cc48
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/time/ClockPlay.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon",
+					"clip-path": "url(#clip0_635_10941)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M14.6334 8.66683C14.6552 8.44756 14.6663 8.22516 14.6663 8.00016C14.6663 4.31826 11.6816 1.3335 7.99967 1.3335C4.31778 1.3335 1.33301 4.31826 1.33301 8.00016C1.33301 11.6821 4.31778 14.6668 7.99967 14.6668C8.11145 14.6668 8.22258 14.6641 8.33301 14.6586C8.44487 14.6531 8.556 14.6449 8.66634 14.6339M7.99967 4.00016V8.00016L5.42265 9.25534M11.853 9.97346L14.4308 11.9068C14.6238 12.0515 14.7203 12.1239 14.7548 12.2126C14.785 12.2904 14.785 12.3766 14.7548 12.4543C14.7203 12.543 14.6238 12.6154 14.4308 12.7601L11.853 14.6935C11.5784 14.8995 11.441 15.0024 11.3261 15.0001C11.226 14.998 11.1322 14.9511 11.0706 14.8723C10.9997 14.7818 10.9997 14.6101 10.9997 14.2668V10.4001C10.9997 10.0568 10.9997 9.88516 11.0706 9.79463C11.1322 9.71585 11.226 9.66895 11.3261 9.66687C11.441 9.66448 11.5784 9.76747 11.853 9.97346Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.5",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_635_10941"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "16",
+									"height": "16",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "ClockPlay"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/time/ClockPlay.tsx b/app/components/base/icons/src/vender/line/time/ClockPlay.tsx
new file mode 100644
index 0000000..a86756a
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/time/ClockPlay.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ClockPlay.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ClockPlay'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/time/ClockPlaySlim.json b/app/components/base/icons/src/vender/line/time/ClockPlaySlim.json
new file mode 100644
index 0000000..348694e
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/time/ClockPlaySlim.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "32",
+			"height": "32",
+			"viewBox": "0 0 32 32",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M29.2673 17.3332C29.3109 16.8946 29.3332 16.4498 29.3332 15.9998C29.3332 8.63604 23.3636 2.6665 15.9998 2.6665C8.63604 2.6665 2.6665 8.63604 2.6665 15.9998C2.6665 23.3636 8.63604 29.3332 15.9998 29.3332C16.2234 29.3332 16.4457 29.3277 16.6665 29.3168C16.8902 29.3058 17.1125 29.2892 17.3332 29.2673M15.9998 7.99984V15.9998L10.8458 18.5102M23.7065 19.9464L28.8621 23.8131C29.2481 24.1026 29.441 24.2473 29.5101 24.4248C29.5705 24.5802 29.5705 24.7527 29.5101 24.9081C29.441 25.0855 29.2481 25.2303 28.8621 25.5198L23.7065 29.3864C23.1572 29.7984 22.8825 30.0044 22.6526 29.9996C22.4526 29.9955 22.265 29.9017 22.1416 29.7441C21.9998 29.5631 21.9998 29.2197 21.9998 28.5331V20.7998C21.9998 20.1131 21.9998 19.7698 22.1416 19.5888C22.265 19.4312 22.4526 19.3374 22.6526 19.3333C22.8825 19.3285 23.1572 19.5345 23.7065 19.9464Z",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ClockPlaySlim"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/time/ClockPlaySlim.tsx b/app/components/base/icons/src/vender/line/time/ClockPlaySlim.tsx
new file mode 100644
index 0000000..47e917b
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/time/ClockPlaySlim.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ClockPlaySlim.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ClockPlaySlim'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/time/ClockRefresh.json b/app/components/base/icons/src/vender/line/time/ClockRefresh.json
new file mode 100644
index 0000000..925907a
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/time/ClockRefresh.json
@@ -0,0 +1,62 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "clock-refresh"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M9.76984 2.8375L9.71551 3.04027C8.27602 1.22839 5.68891 0.69459 3.62457 1.88644C2.25681 2.67611 1.43067 4.04369 1.27558 5.50073C1.24636 5.77532 1.44526 6.02161 1.71985 6.05084C1.99444 6.08007 2.24074 5.88116 2.26997 5.60657C2.39268 4.4537 3.04533 3.37556 4.12456 2.75247C5.7025 1.84145 7.66731 2.20754 8.82211 3.53002L8.65016 3.48395C8.38343 3.41248 8.10926 3.57077 8.03779 3.8375C7.96632 4.10424 8.12461 4.37841 8.39134 4.44988L9.75737 4.8159C10.0241 4.88737 10.2983 4.72908 10.3697 4.46235L10.7358 3.09632C10.8072 2.82959 10.6489 2.55542 10.3822 2.48395C10.1155 2.41248 9.84131 2.57077 9.76984 2.8375Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M10.2792 5.94921C10.5538 5.97844 10.7527 6.22473 10.7235 6.49932C10.5684 7.95635 9.74225 9.32394 8.3745 10.1136C6.31011 11.3055 3.72295 10.7716 2.28347 8.95968L2.22918 9.1623C2.15771 9.42903 1.88354 9.58732 1.61681 9.51585C1.35008 9.44438 1.19178 9.17021 1.26325 8.90348L1.62928 7.53746C1.70075 7.27072 1.97492 7.11243 2.24165 7.1839L3.60768 7.54993C3.87441 7.6214 4.0327 7.89557 3.96123 8.1623C3.88976 8.42903 3.61559 8.58732 3.34886 8.51585L3.17668 8.46972C4.33144 9.79246 6.29644 10.1587 7.8745 9.24758C8.95373 8.62449 9.60638 7.54634 9.72909 6.39348C9.75832 6.11889 10.0046 5.91998 10.2792 5.94921Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M6.49954 3.74997C6.49954 3.47382 6.27568 3.24997 5.99954 3.24997C5.7234 3.24997 5.49954 3.47382 5.49954 3.74997V5.99997C5.49954 6.1756 5.59169 6.33835 5.74229 6.42871L6.99229 7.17871C7.22908 7.32079 7.53621 7.244 7.67828 7.00721C7.82036 6.77042 7.74358 6.46329 7.50679 6.32122L6.49954 5.71687V3.74997Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "ClockRefresh"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/time/ClockRefresh.tsx b/app/components/base/icons/src/vender/line/time/ClockRefresh.tsx
new file mode 100644
index 0000000..31e3a9c
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/time/ClockRefresh.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ClockRefresh.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ClockRefresh'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/time/index.ts b/app/components/base/icons/src/vender/line/time/index.ts
new file mode 100644
index 0000000..8e6509e
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/time/index.ts
@@ -0,0 +1,4 @@
+export { default as ClockFastForward } from './ClockFastForward'
+export { default as ClockPlaySlim } from './ClockPlaySlim'
+export { default as ClockPlay } from './ClockPlay'
+export { default as ClockRefresh } from './ClockRefresh'
diff --git a/app/components/base/icons/src/vender/line/users/User01.json b/app/components/base/icons/src/vender/line/users/User01.json
new file mode 100644
index 0000000..5535303
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/users/User01.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "user-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M13.3334 14C13.3334 13.0696 13.3334 12.6044 13.2186 12.2259C12.9601 11.3736 12.2931 10.7067 11.4408 10.4482C11.0623 10.3333 10.5971 10.3333 9.66675 10.3333H6.33342C5.40304 10.3333 4.93785 10.3333 4.55932 10.4482C3.70705 10.7067 3.04011 11.3736 2.78157 12.2259C2.66675 12.6044 2.66675 13.0696 2.66675 14M11.0001 5C11.0001 6.65685 9.65694 8 8.00008 8C6.34323 8 5.00008 6.65685 5.00008 5C5.00008 3.34315 6.34323 2 8.00008 2C9.65694 2 11.0001 3.34315 11.0001 5Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "User01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/users/User01.tsx b/app/components/base/icons/src/vender/line/users/User01.tsx
new file mode 100644
index 0000000..24fd0df
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/users/User01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './User01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'User01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/users/Users01.json b/app/components/base/icons/src/vender/line/users/Users01.json
new file mode 100644
index 0000000..96dbeb3
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/users/Users01.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "users-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M14.6666 14V12.6667C14.6666 11.4241 13.8167 10.38 12.6666 10.084M10.3333 2.19384C11.3105 2.58943 11.9999 3.54754 11.9999 4.66667C11.9999 5.78579 11.3105 6.7439 10.3333 7.13949M11.3333 14C11.3333 12.7575 11.3333 12.1362 11.1303 11.6462C10.8596 10.9928 10.3405 10.4736 9.68707 10.203C9.19702 10 8.57576 10 7.33325 10H5.33325C4.09074 10 3.46949 10 2.97943 10.203C2.32602 10.4736 1.80689 10.9928 1.53624 11.6462C1.33325 12.1362 1.33325 12.7575 1.33325 14M8.99992 4.66667C8.99992 6.13943 7.80601 7.33333 6.33325 7.33333C4.86049 7.33333 3.66659 6.13943 3.66659 4.66667C3.66659 3.19391 4.86049 2 6.33325 2C7.80601 2 8.99992 3.19391 8.99992 4.66667Z",
+							"stroke": "currentColor",
+							"stroke-width": "1.25",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Users01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/users/Users01.tsx b/app/components/base/icons/src/vender/line/users/Users01.tsx
new file mode 100644
index 0000000..f26ff03
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/users/Users01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Users01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Users01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/users/index.ts b/app/components/base/icons/src/vender/line/users/index.ts
new file mode 100644
index 0000000..9f8a351
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/users/index.ts
@@ -0,0 +1,2 @@
+export { default as User01 } from './User01'
+export { default as Users01 } from './Users01'
diff --git a/app/components/base/icons/src/vender/line/weather/Stars02.json b/app/components/base/icons/src/vender/line/weather/Stars02.json
new file mode 100644
index 0000000..54f6a42
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/weather/Stars02.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M4.5 22V17M4.5 7V2M2 4.5H7M2 19.5H7M13 3L11.2658 7.50886C10.9838 8.24209 10.8428 8.60871 10.6235 8.91709C10.4292 9.1904 10.1904 9.42919 9.91709 9.62353C9.60871 9.8428 9.24209 9.98381 8.50886 10.2658L4 12L8.50886 13.7342C9.24209 14.0162 9.60871 14.1572 9.91709 14.3765C10.1904 14.5708 10.4292 14.8096 10.6235 15.0829C10.8428 15.3913 10.9838 15.7579 11.2658 16.4911L13 21L14.7342 16.4911C15.0162 15.7579 15.1572 15.3913 15.3765 15.0829C15.5708 14.8096 15.8096 14.5708 16.0829 14.3765C16.3913 14.1572 16.7579 14.0162 17.4911 13.7342L22 12L17.4911 10.2658C16.7579 9.98381 16.3913 9.8428 16.0829 9.62353C15.8096 9.42919 15.5708 9.1904 15.3765 8.91709C15.1572 8.60871 15.0162 8.24209 14.7342 7.50886L13 3Z",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Stars02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/line/weather/Stars02.tsx b/app/components/base/icons/src/vender/line/weather/Stars02.tsx
new file mode 100644
index 0000000..ad24f6c
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/weather/Stars02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Stars02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Stars02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/line/weather/index.ts b/app/components/base/icons/src/vender/line/weather/index.ts
new file mode 100644
index 0000000..1a68bce
--- /dev/null
+++ b/app/components/base/icons/src/vender/line/weather/index.ts
@@ -0,0 +1 @@
+export { default as Stars02 } from './Stars02'
diff --git a/app/components/base/icons/src/vender/other/AnthropicText.json b/app/components/base/icons/src/vender/other/AnthropicText.json
new file mode 100644
index 0000000..a65ef47
--- /dev/null
+++ b/app/components/base/icons/src/vender/other/AnthropicText.json
@@ -0,0 +1,539 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "90",
+			"height": "20",
+			"viewBox": "0 0 90 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_8587_60274)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "mask",
+						"attributes": {
+							"id": "mask0_8587_60274",
+							"style": "mask-type:luminance",
+							"maskUnits": "userSpaceOnUse",
+							"x": "0",
+							"y": "4",
+							"width": "90",
+							"height": "11"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M89.375 4.99805H0V14.998H89.375V4.99805Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"mask": "url(#mask0_8587_60274)"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "mask",
+								"attributes": {
+									"id": "mask1_8587_60274",
+									"style": "mask-type:luminance",
+									"maskUnits": "userSpaceOnUse",
+									"x": "0",
+									"y": "4",
+									"width": "90",
+									"height": "11"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "path",
+										"attributes": {
+											"d": "M0 4.99609H89.375V14.9961H0V4.99609Z",
+											"fill": "currentColor"
+										},
+										"children": []
+									}
+								]
+							},
+							{
+								"type": "element",
+								"name": "g",
+								"attributes": {
+									"mask": "url(#mask1_8587_60274)"
+								},
+								"children": [
+									{
+										"type": "element",
+										"name": "mask",
+										"attributes": {
+											"id": "mask2_8587_60274",
+											"style": "mask-type:luminance",
+											"maskUnits": "userSpaceOnUse",
+											"x": "0",
+											"y": "4",
+											"width": "90",
+											"height": "11"
+										},
+										"children": [
+											{
+												"type": "element",
+												"name": "path",
+												"attributes": {
+													"d": "M0 4.99414H89.375V14.9941H0V4.99414Z",
+													"fill": "currentColor"
+												},
+												"children": []
+											}
+										]
+									},
+									{
+										"type": "element",
+										"name": "g",
+										"attributes": {
+											"mask": "url(#mask2_8587_60274)"
+										},
+										"children": [
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask3_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "currentColor"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask3_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M18.1273 11.9244L13.7773 5.15625H11.4297V14.825H13.4321V8.05688L17.7821 14.825H20.1297V5.15625H18.1273V11.9244Z",
+															"fill": "currentColor",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask4_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "currentColor"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask4_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M21.7969 7.02094H25.0423V14.825H27.1139V7.02094H30.3594V5.15625H21.7969V7.02094Z",
+															"fill": "currentColor",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask5_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "currentColor"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask5_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M38.6442 9.00994H34.0871V5.15625H32.0156V14.825H34.0871V10.8746H38.6442V14.825H40.7156V5.15625H38.6442V9.00994Z",
+															"fill": "currentColor",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask6_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "currentColor"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask6_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M45.3376 7.02094H47.893C48.9152 7.02094 49.4539 7.39387 49.4539 8.09831C49.4539 8.80275 48.9152 9.17569 47.893 9.17569H45.3376V7.02094ZM51.5259 8.09831C51.5259 6.27506 50.186 5.15625 47.9897 5.15625H43.2656V14.825H45.3376V11.0404H47.6443L49.7164 14.825H52.0094L49.715 10.7521C50.8666 10.3094 51.5259 9.37721 51.5259 8.09831Z",
+															"fill": "currentColor",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask7_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "currentColor"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask7_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M57.8732 13.0565C56.2438 13.0565 55.2496 11.8963 55.2496 10.004C55.2496 8.08416 56.2438 6.92394 57.8732 6.92394C59.4887 6.92394 60.4691 8.08416 60.4691 10.004C60.4691 11.8963 59.4887 13.0565 57.8732 13.0565ZM57.8732 4.99023C55.0839 4.99023 53.1094 7.06206 53.1094 10.004C53.1094 12.9184 55.0839 14.9902 57.8732 14.9902C60.6486 14.9902 62.6094 12.9184 62.6094 10.004C62.6094 7.06206 60.6486 4.99023 57.8732 4.99023Z",
+															"fill": "currentColor",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask8_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "currentColor"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask8_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M69.1794 9.45194H66.6233V7.02094H69.1794C70.2019 7.02094 70.7407 7.43532 70.7407 8.23644C70.7407 9.03756 70.2019 9.45194 69.1794 9.45194ZM69.2762 5.15625H64.5508V14.825H66.6233V11.3166H69.2762C71.473 11.3166 72.8133 10.1564 72.8133 8.23644C72.8133 6.3165 71.473 5.15625 69.2762 5.15625Z",
+															"fill": "currentColor",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask9_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "currentColor"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask9_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M86.8413 11.5786C86.4823 12.5179 85.7642 13.0565 84.7837 13.0565C83.1542 13.0565 82.16 11.8963 82.16 10.004C82.16 8.08416 83.1542 6.92394 84.7837 6.92394C85.7642 6.92394 86.4823 7.46261 86.8413 8.40183H89.0369C88.4984 6.33002 86.8827 4.99023 84.7837 4.99023C81.9942 4.99023 80.0195 7.06206 80.0195 10.004C80.0195 12.9184 81.9942 14.9902 84.7837 14.9902C86.8965 14.9902 88.5122 13.6366 89.0508 11.5786H86.8413Z",
+															"fill": "currentColor",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask10_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "currentColor"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask10_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M73.6484 5.15625L77.5033 14.825H79.6172L75.7624 5.15625H73.6484Z",
+															"fill": "currentColor",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "mask",
+												"attributes": {
+													"id": "mask11_8587_60274",
+													"style": "mask-type:luminance",
+													"maskUnits": "userSpaceOnUse",
+													"x": "0",
+													"y": "4",
+													"width": "90",
+													"height": "11"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M0 4.99219H89.375V14.9922H0V4.99219Z",
+															"fill": "currentColor"
+														},
+														"children": []
+													}
+												]
+											},
+											{
+												"type": "element",
+												"name": "g",
+												"attributes": {
+													"mask": "url(#mask11_8587_60274)"
+												},
+												"children": [
+													{
+														"type": "element",
+														"name": "path",
+														"attributes": {
+															"d": "M3.64038 10.9989L4.95938 7.60106L6.27838 10.9989H3.64038ZM3.85422 5.15625L0 14.825H2.15505L2.9433 12.7946H6.97558L7.76371 14.825H9.91875L6.06453 5.15625H3.85422Z",
+															"fill": "currentColor",
+															"fill-opacity": "0.92"
+														},
+														"children": []
+													}
+												]
+											}
+										]
+									}
+								]
+							}
+						]
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_8587_60274"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "89.375",
+									"height": "10",
+									"fill": "white",
+									"transform": "translate(0 5)"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "AnthropicText"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/other/AnthropicText.tsx b/app/components/base/icons/src/vender/other/AnthropicText.tsx
new file mode 100644
index 0000000..be9ebd3
--- /dev/null
+++ b/app/components/base/icons/src/vender/other/AnthropicText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AnthropicText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AnthropicText'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/other/Generator.json b/app/components/base/icons/src/vender/other/Generator.json
new file mode 100644
index 0000000..3f24cfe
--- /dev/null
+++ b/app/components/base/icons/src/vender/other/Generator.json
@@ -0,0 +1,37 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"opacity": "0.5",
+					"d": "M10.5402 2.95679L10.5402 2.95685C10.4455 3.05146 10.3424 3.13459 10.2314 3.2072C10.3429 3.27923 10.4468 3.36165 10.5422 3.45535L10.5402 2.95679ZM10.5402 2.95679C10.6348 2.86217 10.718 2.75907 10.7906 2.64807C10.8626 2.75955 10.945 2.86339 11.0387 2.95881L11.0388 2.95888C11.1304 3.05224 11.2302 3.13482 11.3377 3.20717C11.2297 3.27895 11.1292 3.36081 11.0367 3.45327L11.0366 3.45333C10.9442 3.5458 10.8623 3.64635 10.7905 3.75431M10.5402 2.95679L10.7905 3.75431M10.7905 3.75431C10.7182 3.64686 10.6356 3.54707 10.5422 3.45538L10.7905 3.75431Z",
+					"stroke": "currentColor",
+					"stroke-width": "1.25"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M6.99659 2.85105C6.96323 2.55641 6.71414 2.33368 6.41758 2.33337C6.12107 2.33307 5.87146 2.55529 5.83751 2.84987C5.67932 4.2213 5.27205 5.16213 4.6339 5.80028C3.99575 6.43841 3.05492 6.84569 1.68349 7.00389C1.3889 7.03784 1.16669 7.28745 1.16699 7.58396C1.1673 7.88052 1.39002 8.12961 1.68467 8.16297C3.03291 8.31569 3.99517 8.72292 4.64954 9.36546C5.30035 10.0045 5.71535 10.944 5.83593 12.3017C5.86271 12.6029 6.11523 12.8337 6.41763 12.8334C6.72009 12.833 6.97209 12.6016 6.99817 12.3003C7.11367 10.9656 7.52836 10.005 8.18344 9.34982C8.83858 8.69474 9.79922 8.28005 11.1339 8.16455C11.4352 8.13847 11.6666 7.88647 11.667 7.58402C11.6673 7.28162 11.4365 7.02909 11.1353 7.00232C9.77758 6.88174 8.83812 6.46676 8.19908 5.81592C7.55653 5.16155 7.14931 4.19929 6.99659 2.85105Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Generator"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/other/Generator.tsx b/app/components/base/icons/src/vender/other/Generator.tsx
new file mode 100644
index 0000000..cba3904
--- /dev/null
+++ b/app/components/base/icons/src/vender/other/Generator.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Generator.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Generator'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/other/Group.json b/app/components/base/icons/src/vender/other/Group.json
new file mode 100644
index 0000000..078febb
--- /dev/null
+++ b/app/components/base/icons/src/vender/other/Group.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "16",
+			"viewBox": "0 0 14 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Group"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M5.6475 8.0115L0.333496 5.05884V11.3335C0.333491 11.4524 0.365258 11.569 0.425506 11.6715C0.485754 11.7739 0.572294 11.8584 0.676163 11.9162L6.3335 15.0588V9.17684C6.33344 8.93907 6.26981 8.70565 6.14919 8.50075C6.02857 8.29586 5.85536 8.12694 5.6475 8.0115Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M7.66699 9.17684V15.0588L13.3243 11.9162C13.4282 11.8584 13.5147 11.7739 13.575 11.6715C13.6352 11.569 13.667 11.4524 13.667 11.3335V5.05884L8.35299 8.0115C8.14513 8.12694 7.97192 8.29586 7.8513 8.50075C7.73068 8.70565 7.66705 8.93907 7.66699 9.17684Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_3",
+							"d": "M10.1913 2.34351C9.804 3.33351 8.588 4.00017 7 4.00017C5.412 4.00017 4.196 3.33351 3.80867 2.34351L1 3.90417L6.35267 6.87817C6.5507 6.98815 6.77348 7.04586 7 7.04586C7.22652 7.04586 7.4493 6.98815 7.64733 6.87817L13 3.90417L10.1913 2.34351Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_4",
+							"d": "M7 2.66675C8.10457 2.66675 9 2.21903 9 1.66675C9 1.11446 8.10457 0.666748 7 0.666748C5.89543 0.666748 5 1.11446 5 1.66675C5 2.21903 5.89543 2.66675 7 2.66675Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Group"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/other/Group.tsx b/app/components/base/icons/src/vender/other/Group.tsx
new file mode 100644
index 0000000..7b72300
--- /dev/null
+++ b/app/components/base/icons/src/vender/other/Group.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Group.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Group'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/other/Openai.json b/app/components/base/icons/src/vender/other/Openai.json
new file mode 100644
index 0000000..236f66f
--- /dev/null
+++ b/app/components/base/icons/src/vender/other/Openai.json
@@ -0,0 +1,80 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "80",
+			"height": "22",
+			"viewBox": "0 0 80 22",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M25.1152 10.5767C25.1152 14.1738 27.4253 16.6818 30.6264 16.6818C33.8274 16.6818 36.1375 14.1738 36.1375 10.5767C36.1375 6.97961 33.8274 4.47156 30.6264 4.47156C27.4253 4.47156 25.1152 6.97961 25.1152 10.5767ZM34.0254 10.5767C34.0254 13.1507 32.6229 14.8173 30.6264 14.8173C28.6298 14.8173 27.2273 13.1507 27.2273 10.5767C27.2273 8.00263 28.6298 6.3361 30.6264 6.3361C32.6229 6.3361 34.0254 8.00263 34.0254 10.5767Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M42.0868 16.6819C44.5124 16.6819 45.8984 14.6358 45.8984 12.1773C45.8984 9.71871 44.5124 7.67267 42.0868 7.67267C40.9648 7.67267 40.1398 8.11818 39.5953 8.76169V7.83767H37.6152V19.4704H39.5953V15.5928C40.1398 16.2364 40.9648 16.6819 42.0868 16.6819ZM39.5458 11.9298C39.5458 10.2962 40.4698 9.40521 41.6908 9.40521C43.1264 9.40521 43.9019 10.5272 43.9019 12.1773C43.9019 13.8273 43.1264 14.9493 41.6908 14.9493C40.4698 14.9493 39.5458 14.0418 39.5458 12.4413V11.9298Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M51.2545 16.6819C52.987 16.6819 54.3565 15.7743 54.967 14.2563L53.2675 13.6128C53.0035 14.5038 52.228 14.9988 51.2545 14.9988C49.9839 14.9988 49.0929 14.0913 48.9444 12.6063H55.0165V11.9463C55.0165 9.57021 53.68 7.67267 51.172 7.67267C48.6639 7.67267 47.0469 9.63621 47.0469 12.1773C47.0469 14.8503 48.7794 16.6819 51.2545 16.6819ZM51.1555 9.3392C52.4095 9.3392 53.0035 10.1642 53.02 11.1212H49.0434C49.3404 9.94972 50.1324 9.3392 51.1555 9.3392Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M56.5039 16.5004H58.484V11.4182C58.484 10.1807 59.3915 9.52071 60.2825 9.52071C61.3715 9.52071 61.8005 10.2962 61.8005 11.3687V16.5004H63.7806V10.7912C63.7806 8.9267 62.6915 7.67267 60.8765 7.67267C59.7545 7.67267 58.979 8.18418 58.484 8.76169V7.83767H56.5039V16.5004Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M69.5799 4.65308L65.0918 16.5003H67.1873L68.1939 13.7943H73.309L74.332 16.5003H76.4605L71.9724 4.65308H69.5799ZM70.7349 6.99613L72.616 11.9462H68.8869L70.7349 6.99613Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M79.8581 4.6875H77.7461V16.5348H79.8581V4.6875Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M20.2769 9.00436C20.776 7.50627 20.6041 5.86517 19.8059 4.50251C18.6055 2.41247 16.1924 1.3372 13.8356 1.84321C12.7871 0.662057 11.2808 -0.00964523 9.70154 -2.00271e-05C7.29248 -0.00552014 5.155 1.54551 4.41386 3.83769C2.86626 4.15463 1.53042 5.12334 0.748717 6.49631C-0.460621 8.58085 -0.184928 11.2085 1.43073 12.9961C0.931596 14.4942 1.10348 16.1353 1.90168 17.4979C3.10208 19.588 5.51526 20.6632 7.87206 20.1572C8.91983 21.3384 10.4269 22.0101 12.0061 21.9998C14.4165 22.006 16.5547 20.4535 17.2958 18.1593C18.8434 17.8424 20.1793 16.8737 20.961 15.5007C22.1689 13.4161 21.8925 10.7905 20.2776 9.00298L20.2769 9.00436ZM12.0075 20.5622C11.0429 20.5635 10.1085 20.226 9.36809 19.6079C9.40178 19.59 9.46022 19.5577 9.49803 19.5343L13.8789 17.0043C14.103 16.8771 14.2405 16.6385 14.2391 16.3807V10.2048L16.0906 11.2738C16.1105 11.2835 16.1236 11.3027 16.1264 11.3247V16.4391C16.1236 18.7134 14.2818 20.5574 12.0075 20.5622ZM3.14952 16.7788C2.6662 15.9441 2.49225 14.9658 2.65795 14.0163C2.69026 14.0356 2.74732 14.0707 2.78789 14.094L7.16873 16.6241C7.3908 16.754 7.6658 16.754 7.88856 16.6241L13.2367 13.5358V15.6739C13.2381 15.6959 13.2278 15.7173 13.2106 15.731L8.78233 18.2879C6.80985 19.4236 4.29079 18.7485 3.15021 16.7788H3.14952ZM1.99656 7.21613C2.47782 6.38012 3.23752 5.74073 4.14229 5.40866C4.14229 5.44647 4.14023 5.51316 4.14023 5.55991V10.6207C4.13885 10.8778 4.27636 11.1164 4.4998 11.2436L9.84798 14.3312L7.9965 15.4003C7.97794 15.4127 7.95456 15.4147 7.93393 15.4058L3.50496 12.8469C1.53661 11.707 0.86147 9.18861 1.99587 7.21682L1.99656 7.21613ZM17.2085 10.7561L11.8603 7.66783L13.7118 6.59943C13.7304 6.58706 13.7537 6.585 13.7744 6.59393L18.2033 9.1508C20.1751 10.29 20.851 12.8125 19.7118 14.7843C19.2298 15.6189 18.4708 16.2583 17.5667 16.5911V11.379C17.5688 11.1219 17.432 10.884 17.2092 10.7561H17.2085ZM19.0511 7.98271C19.0187 7.96278 18.9617 7.9284 18.9211 7.90502L14.5403 5.37497C14.3182 5.24503 14.0432 5.24503 13.8204 5.37497L8.47226 8.46329V6.32512C8.47088 6.30311 8.4812 6.2818 8.49838 6.26805L12.9267 3.71325C14.8991 2.57541 17.4209 3.25261 18.5581 5.22578C19.0387 6.05905 19.2126 7.03463 19.0497 7.98271H19.0511ZM7.46574 11.7936L5.61357 10.7245C5.59363 10.7149 5.58057 10.6956 5.57782 10.6736V5.55922C5.5792 3.28218 7.42655 1.43689 9.7036 1.43826C10.6668 1.43826 11.5991 1.77652 12.3395 2.39253C12.3058 2.41041 12.2481 2.44272 12.2096 2.46609L7.82874 4.99615C7.60461 5.12334 7.46711 5.36122 7.46849 5.61904L7.46574 11.7922V11.7936ZM8.47157 9.62519L10.8538 8.24947L13.236 9.6245V12.3752L10.8538 13.7503L8.47157 12.3752V9.62519Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Openai"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/other/Openai.tsx b/app/components/base/icons/src/vender/other/Openai.tsx
new file mode 100644
index 0000000..bcb7337
--- /dev/null
+++ b/app/components/base/icons/src/vender/other/Openai.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Openai.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Openai'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/other/ReplayLine.json b/app/components/base/icons/src/vender/other/ReplayLine.json
new file mode 100644
index 0000000..0fffbc9
--- /dev/null
+++ b/app/components/base/icons/src/vender/other/ReplayLine.json
@@ -0,0 +1,36 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "20",
+			"height": "20",
+			"viewBox": "0 0 20 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Retry"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M9.99996 1.66669C14.6023 1.66669 18.3333 5.39765 18.3333 10C18.3333 14.6024 14.6023 18.3334 9.99996 18.3334C5.39758 18.3334 1.66663 14.6024 1.66663 10H3.33329C3.33329 13.6819 6.31806 16.6667 9.99996 16.6667C13.6819 16.6667 16.6666 13.6819 16.6666 10C16.6666 6.31812 13.6819 3.33335 9.99996 3.33335C7.70848 3.33335 5.68702 4.48947 4.48705 6.25022L6.66663 6.25002V7.91669H1.66663V2.91669H3.33329L3.3332 4.99934C4.85358 2.97565 7.2739 1.66669 9.99996 1.66669Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ReplayLine"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/other/ReplayLine.tsx b/app/components/base/icons/src/vender/other/ReplayLine.tsx
new file mode 100644
index 0000000..29f7137
--- /dev/null
+++ b/app/components/base/icons/src/vender/other/ReplayLine.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ReplayLine.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ReplayLine'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/other/index.ts b/app/components/base/icons/src/vender/other/index.ts
new file mode 100644
index 0000000..8ddf5e7
--- /dev/null
+++ b/app/components/base/icons/src/vender/other/index.ts
@@ -0,0 +1,5 @@
+export { default as AnthropicText } from './AnthropicText'
+export { default as Generator } from './Generator'
+export { default as Group } from './Group'
+export { default as Openai } from './Openai'
+export { default as ReplayLine } from './ReplayLine'
diff --git a/app/components/base/icons/src/vender/plugin/BoxSparkleFill.json b/app/components/base/icons/src/vender/plugin/BoxSparkleFill.json
new file mode 100644
index 0000000..3733f98
--- /dev/null
+++ b/app/components/base/icons/src/vender/plugin/BoxSparkleFill.json
@@ -0,0 +1,66 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M11.3891 2.41987C11.6635 2.58871 11.749 2.94802 11.5802 3.22239L10.3324 5.25H11.0833C11.4055 5.25 11.6667 5.51117 11.6667 5.83334V11.6667C11.6667 12.311 11.1444 12.8333 10.5 12.8333H3.50001C2.85568 12.8333 2.33334 12.311 2.33334 11.6667V5.83334C2.33334 5.51117 2.59451 5.25 2.91668 5.25H8.96252L10.5865 2.61094C10.7554 2.33657 11.1147 2.25102 11.3891 2.41987ZM5.83334 7.58334C5.51118 7.58334 5.25001 7.84449 5.25001 8.16667C5.25001 8.48884 5.51118 8.75 5.83334 8.75H8.16668C8.48885 8.75 8.75001 8.48884 8.75001 8.16667C8.75001 7.84449 8.48885 7.58334 8.16668 7.58334H5.83334Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector_2",
+							"opacity": "0.5"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M6.91257 1.79347C6.96898 1.76525 7.01477 1.71948 7.043 1.66303L7.32195 1.10508C7.42946 0.890105 7.73623 0.890105 7.84374 1.10508L8.12269 1.66303C8.15093 1.71948 8.19672 1.76525 8.25313 1.79347L8.81108 2.07245C9.0261 2.17994 9.0261 2.48672 8.81108 2.5942L8.25313 2.87318C8.19672 2.9014 8.15093 2.94717 8.12269 3.00362L7.84374 3.56158C7.73623 3.77655 7.42946 3.77655 7.32195 3.56158L7.043 3.00362C7.01477 2.94717 6.96898 2.9014 6.91257 2.87318L6.35461 2.5942C6.13965 2.48672 6.13965 2.17994 6.35461 2.07245L6.91257 1.79347Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M3.80145 2.7657C3.85789 2.73748 3.90366 2.69171 3.93189 2.63526L4.11364 2.27174C4.22113 2.05677 4.5279 2.05677 4.63539 2.27174L4.81715 2.63526C4.84537 2.6917 4.89114 2.73748 4.94759 2.7657L5.3111 2.94745C5.52607 3.05494 5.52607 3.36172 5.3111 3.4692L4.94759 3.65096C4.89114 3.67919 4.84537 3.72495 4.81715 3.7814L4.63539 4.14491C4.5279 4.35988 4.22113 4.35988 4.11364 4.14491L3.93189 3.7814C3.90366 3.72495 3.85789 3.67919 3.80145 3.65096L3.43793 3.4692C3.22296 3.36172 3.22296 3.05494 3.43793 2.94745L3.80145 2.7657Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "BoxSparkleFill"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/plugin/BoxSparkleFill.tsx b/app/components/base/icons/src/vender/plugin/BoxSparkleFill.tsx
new file mode 100644
index 0000000..500f3e7
--- /dev/null
+++ b/app/components/base/icons/src/vender/plugin/BoxSparkleFill.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './BoxSparkleFill.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'BoxSparkleFill'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/plugin/LeftCorner.json b/app/components/base/icons/src/vender/plugin/LeftCorner.json
new file mode 100644
index 0000000..d4cd0cd
--- /dev/null
+++ b/app/components/base/icons/src/vender/plugin/LeftCorner.json
@@ -0,0 +1,27 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "13",
+			"height": "20",
+			"viewBox": "0 0 13 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"id": "Shape",
+					"d": "M0 0H13V20C9.98017 20 7.26458 18.1615 6.14305 15.3576L0 0Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "LeftCorner"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/plugin/LeftCorner.tsx b/app/components/base/icons/src/vender/plugin/LeftCorner.tsx
new file mode 100644
index 0000000..93b6827
--- /dev/null
+++ b/app/components/base/icons/src/vender/plugin/LeftCorner.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LeftCorner.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LeftCorner'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/plugin/index.ts b/app/components/base/icons/src/vender/plugin/index.ts
new file mode 100644
index 0000000..943c764
--- /dev/null
+++ b/app/components/base/icons/src/vender/plugin/index.ts
@@ -0,0 +1,2 @@
+export { default as BoxSparkleFill } from './BoxSparkleFill'
+export { default as LeftCorner } from './LeftCorner'
diff --git a/app/components/base/icons/src/vender/solid/FinanceAndECommerce/GoldCoin.json b/app/components/base/icons/src/vender/solid/FinanceAndECommerce/GoldCoin.json
new file mode 100644
index 0000000..dac0e56
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/FinanceAndECommerce/GoldCoin.json
@@ -0,0 +1,26 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M12 1C9.82441 1 7.69767 1.64514 5.88873 2.85383C4.07979 4.06253 2.66989 5.7805 1.83733 7.79048C1.00477 9.80047 0.786929 12.0122 1.21137 14.146C1.6358 16.2798 2.68345 18.2398 4.22183 19.7782C5.76021 21.3166 7.72022 22.3642 9.85401 22.7886C11.9878 23.2131 14.1995 22.9952 16.2095 22.1627C18.2195 21.3301 19.9375 19.9202 21.1462 18.1113C22.3549 16.3023 23 14.1756 23 12C23 9.08262 21.8411 6.28473 19.7782 4.22183C17.7153 2.15893 14.9174 1 12 1ZM15.0296 6.26992L16.1076 4.78675C16.1784 4.6893 16.2677 4.60675 16.3703 4.54381C16.473 4.48087 16.5871 4.43877 16.7061 4.41992C16.825 4.40106 16.9465 4.40582 17.0636 4.43393C17.1807 4.46203 17.2912 4.51293 17.3886 4.58371C17.4861 4.65449 17.5686 4.74377 17.6316 4.84646C17.6945 4.94915 17.7366 5.06322 17.7555 5.18218C17.7743 5.30113 17.7696 5.42264 17.7415 5.53975C17.7134 5.65687 17.6625 5.7673 17.5917 5.86475L16.5137 7.34792C16.3707 7.54472 16.1554 7.67667 15.9152 7.71475C15.675 7.75283 15.4294 7.69391 15.2326 7.55096C15.0358 7.40801 14.9039 7.19273 14.8658 6.95249C14.8277 6.71225 14.8866 6.46672 15.0296 6.26992ZM6.61184 4.58417C6.70931 4.51294 6.81989 4.46167 6.93722 4.4333C7.05456 4.40493 7.17635 4.40002 7.29559 4.41884C7.41484 4.43766 7.52919 4.47985 7.63208 4.54299C7.73497 4.60613 7.82438 4.68897 7.89517 4.78675L8.97501 6.26992C9.11796 6.46733 9.17663 6.71344 9.13813 6.95411C9.09962 7.19478 8.96708 7.4103 8.76967 7.55325C8.57226 7.6962 8.32615 7.75488 8.08548 7.71637C7.84481 7.67786 7.62929 7.54533 7.48634 7.34792L6.40834 5.86475C6.33759 5.76731 6.28673 5.65689 6.25867 5.5398C6.23061 5.4227 6.22589 5.30122 6.24479 5.1823C6.26368 5.06338 6.30583 4.94935 6.36881 4.84672C6.43179 4.74409 6.51437 4.65487 6.61184 4.58417ZM6.18101 14.8508L4.43934 15.4173C4.32353 15.4604 4.2002 15.4797 4.07677 15.4739C3.95333 15.4681 3.83234 15.4375 3.72106 15.3837C3.60978 15.33 3.51051 15.2544 3.42922 15.1613C3.34793 15.0682 3.28629 14.9597 3.24801 14.8422C3.20973 14.7247 3.19561 14.6007 3.20648 14.4776C3.21735 14.3545 3.253 14.2349 3.31128 14.1259C3.36955 14.017 3.44926 13.9209 3.54561 13.8435C3.64195 13.7662 3.75295 13.7091 3.87192 13.6757L5.61359 13.1092C5.72952 13.0656 5.85308 13.046 5.9768 13.0515C6.10053 13.057 6.22185 13.0875 6.33345 13.1412C6.44505 13.1949 6.54461 13.2707 6.62613 13.3639C6.70764 13.4572 6.76941 13.566 6.80772 13.6837C6.84603 13.8015 6.86007 13.9258 6.84901 14.0492C6.83794 14.1725 6.802 14.2923 6.74334 14.4014C6.68468 14.5105 6.60453 14.6065 6.50773 14.6838C6.41092 14.761 6.30038 14.8179 6.18101 14.8508ZM12.9167 20.25C12.9167 20.4931 12.8201 20.7263 12.6482 20.8982C12.4763 21.0701 12.2431 21.1667 12 21.1667C11.7569 21.1667 11.5237 21.0701 11.3518 20.8982C11.1799 20.7263 11.0833 20.4931 11.0833 20.25V18.4167C11.0833 18.1736 11.1799 17.9404 11.3518 17.7685C11.5237 17.5966 11.7569 17.5 12 17.5C12.2431 17.5 12.4763 17.5966 12.6482 17.7685C12.8201 17.9404 12.9167 18.1736 12.9167 18.4167V20.25ZM12 14.9333L8.54967 16.7483L9.20876 12.9066L6.4175 10.1859L10.2748 9.62583L12 6.13333L13.7252 9.62583L17.5825 10.1859L14.7913 12.9066L15.4503 16.7483L12 14.9333ZM19.5625 15.4192L17.8208 14.8527C17.7015 14.8197 17.59 14.7629 17.4932 14.6856C17.3964 14.6084 17.3162 14.5123 17.2576 14.4032C17.1989 14.2942 17.163 14.1743 17.1519 14.051C17.1409 13.9276 17.1549 13.8033 17.1932 13.6856C17.2315 13.5678 17.2933 13.459 17.3748 13.3658C17.4563 13.2725 17.5559 13.1968 17.6675 13.1431C17.7791 13.0894 17.9004 13.0588 18.0241 13.0533C18.1479 13.0478 18.2714 13.0674 18.3873 13.111L20.129 13.6775C20.248 13.7109 20.359 13.768 20.4553 13.8454C20.5517 13.9227 20.6314 14.0188 20.6897 14.1278C20.7479 14.2367 20.7836 14.3563 20.7944 14.4794C20.8053 14.6025 20.7912 14.7265 20.7529 14.844C20.7146 14.9615 20.653 15.0701 20.5717 15.1631C20.4904 15.2562 20.3911 15.3319 20.2799 15.3856C20.1686 15.4393 20.0476 15.47 19.9242 15.4757C19.8007 15.4815 19.6783 15.4623 19.5625 15.4192Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "GoldCoin"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/FinanceAndECommerce/GoldCoin.tsx b/app/components/base/icons/src/vender/solid/FinanceAndECommerce/GoldCoin.tsx
new file mode 100644
index 0000000..d912a6b
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/FinanceAndECommerce/GoldCoin.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './GoldCoin.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'GoldCoin'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/FinanceAndECommerce/Scales02.json b/app/components/base/icons/src/vender/solid/FinanceAndECommerce/Scales02.json
new file mode 100644
index 0000000..9a781bd
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/FinanceAndECommerce/Scales02.json
@@ -0,0 +1,48 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M8.64494 5.5L4 5.50001C3.44772 5.50001 3 5.05229 3 4.50001C3 3.94772 3.44771 3.50001 4 3.50001L8.64494 3.5C9.07521 2.05426 10.4145 1 12 1C13.5855 1 14.9248 2.05426 15.3551 3.5L20 3.5C20.5523 3.5 21 3.94772 21 4.5C21 5.05229 20.5523 5.5 20 5.5L15.3551 5.5C15.0191 6.62889 14.1289 7.51909 13 7.85506V20H20C20.5523 20 21 20.4477 21 21C21 21.5523 20.5523 22 20 22L4 22C3.44772 22 3 21.5523 3 21C3 20.4477 3.44772 20 4 20H11V7.85506C9.87111 7.51909 8.98091 6.62889 8.64494 5.5Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M5.49998 7C5.83892 7 6.15479 7.17168 6.33914 7.4561L9.34294 12.0905C9.5058 12.3416 9.65261 12.5678 9.77323 12.9247C9.82544 13.0792 9.86232 13.2714 9.88454 13.4092C9.90677 13.5471 9.93212 13.7411 9.93109 13.9042C9.9302 14.0459 9.92522 14.1726 9.90862 14.2966C9.89198 14.421 9.86633 14.5189 9.85041 14.5797L9.84797 14.5891C9.33962 16.5355 7.60137 18 5.49998 18C3.3986 18 1.66034 16.5355 1.152 14.5891L1.14959 14.5798C1.13367 14.5191 1.108 14.421 1.09135 14.2966C1.07475 14.1726 1.06977 14.0459 1.06888 13.9042C1.06785 13.7411 1.0932 13.5471 1.11542 13.4092C1.13765 13.2714 1.17453 13.0792 1.22674 12.9247C1.34736 12.5678 1.49417 12.3416 1.65703 12.0905L4.66083 7.4561C4.84518 7.17168 5.16105 7 5.49998 7ZM5.49998 9.83859L4.09907 12H6.9009L5.49998 9.83859Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M19.3391 7.4561C19.1548 7.17168 18.8389 7 18.5 7C18.161 7 17.8452 7.17168 17.6608 7.4561L14.657 12.0905C14.4942 12.3416 14.3474 12.5678 14.2267 12.9247C14.1745 13.0792 14.1376 13.2714 14.1154 13.4092C14.0932 13.5471 14.0679 13.7411 14.0689 13.9042C14.0698 14.0459 14.0748 14.1726 14.0914 14.2966C14.108 14.421 14.1337 14.519 14.1496 14.5798L14.152 14.5891C14.6603 16.5355 16.3986 18 18.5 18C20.6014 18 22.3396 16.5355 22.848 14.5891L22.8504 14.5798C22.8663 14.5191 22.892 14.421 22.9086 14.2966C22.9252 14.1726 22.9302 14.0459 22.9311 13.9042C22.9321 13.7411 22.9068 13.5471 22.8845 13.4092C22.8623 13.2714 22.8254 13.0792 22.7732 12.9247C22.6526 12.5678 22.5058 12.3416 22.3429 12.0905L19.3391 7.4561ZM17.0991 12L18.5 9.83859L19.9009 12H17.0991Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Scales02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/FinanceAndECommerce/Scales02.tsx b/app/components/base/icons/src/vender/solid/FinanceAndECommerce/Scales02.tsx
new file mode 100644
index 0000000..5a4ad8b
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/FinanceAndECommerce/Scales02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Scales02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Scales02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/FinanceAndECommerce/index.ts b/app/components/base/icons/src/vender/solid/FinanceAndECommerce/index.ts
new file mode 100644
index 0000000..777fe96
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/FinanceAndECommerce/index.ts
@@ -0,0 +1,2 @@
+export { default as GoldCoin } from './GoldCoin'
+export { default as Scales02 } from './Scales02'
diff --git a/app/components/base/icons/src/vender/solid/alertsAndFeedback/AlertTriangle.json b/app/components/base/icons/src/vender/solid/alertsAndFeedback/AlertTriangle.json
new file mode 100644
index 0000000..c73fbc5
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/alertsAndFeedback/AlertTriangle.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "alert-triangle"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M6.40616 0.834185C6.14751 0.719172 5.85222 0.719172 5.59356 0.834185C5.3938 0.923011 5.26403 1.07947 5.17373 1.20696C5.08495 1.3323 4.9899 1.49651 4.88536 1.67711L0.751783 8.81693C0.646828 8.99818 0.551451 9.16289 0.486781 9.30268C0.421056 9.44475 0.349754 9.63572 0.372478 9.85369C0.401884 10.1357 0.549654 10.392 0.779012 10.5588C0.956259 10.6877 1.15726 10.7217 1.31314 10.736C1.46651 10.75 1.65684 10.75 1.86628 10.75H10.1334C10.3429 10.75 10.5332 10.75 10.6866 10.736C10.8425 10.7217 11.0435 10.6877 11.2207 10.5588C11.4501 10.392 11.5978 10.1357 11.6272 9.85369C11.65 9.63572 11.5787 9.44475 11.5129 9.30268C11.4483 9.1629 11.3529 8.9982 11.248 8.81697L7.11436 1.67709C7.00983 1.49651 6.91477 1.3323 6.82599 1.20696C6.73569 1.07947 6.60593 0.923011 6.40616 0.834185ZM6.49988 4.5C6.49988 4.22386 6.27602 4 5.99988 4C5.72374 4 5.49988 4.22386 5.49988 4.5V6.5C5.49988 6.77614 5.72374 7 5.99988 7C6.27602 7 6.49988 6.77614 6.49988 6.5V4.5ZM5.99988 8C5.72374 8 5.49988 8.22386 5.49988 8.5C5.49988 8.77614 5.72374 9 5.99988 9H6.00488C6.28102 9 6.50488 8.77614 6.50488 8.5C6.50488 8.22386 6.28102 8 6.00488 8H5.99988Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "AlertTriangle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/alertsAndFeedback/AlertTriangle.tsx b/app/components/base/icons/src/vender/solid/alertsAndFeedback/AlertTriangle.tsx
new file mode 100644
index 0000000..cceacb9
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/alertsAndFeedback/AlertTriangle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AlertTriangle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AlertTriangle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/alertsAndFeedback/index.ts b/app/components/base/icons/src/vender/solid/alertsAndFeedback/index.ts
new file mode 100644
index 0000000..6ad90c1
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/alertsAndFeedback/index.ts
@@ -0,0 +1 @@
+export { default as AlertTriangle } from './AlertTriangle'
diff --git a/app/components/base/icons/src/vender/solid/arrows/ChevronDown.json b/app/components/base/icons/src/vender/solid/arrows/ChevronDown.json
new file mode 100644
index 0000000..ef9a33d
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/arrows/ChevronDown.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "chevron-down"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M6 9L12 15L18 9",
+							"stroke": "currentColor",
+							"stroke-width": "2",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ChevronDown"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/arrows/ChevronDown.tsx b/app/components/base/icons/src/vender/solid/arrows/ChevronDown.tsx
new file mode 100644
index 0000000..e08b7db
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/arrows/ChevronDown.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ChevronDown.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ChevronDown'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/arrows/HighPriority.json b/app/components/base/icons/src/vender/solid/arrows/HighPriority.json
new file mode 100644
index 0000000..6710fd8
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/arrows/HighPriority.json
@@ -0,0 +1,53 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M9.01488 2.54553C8.91549 2.45869 8.79321 2.40229 8.66264 2.38306C8.53206 2.36384 8.39872 2.38261 8.27852 2.43712C8.15833 2.49164 8.05636 2.5796 7.98481 2.6905C7.91325 2.8014 7.87513 2.93055 7.875 3.06253V6.50003C6.05164 6.50003 4.30295 7.22436 3.01364 8.51367C1.72433 9.80299 1 11.5517 1 13.375C1 15.1984 1.72433 16.9471 3.01364 18.2364C4.30295 19.5257 6.05164 20.25 7.875 20.25H12C12.3647 20.25 12.7144 20.1052 12.9723 19.8473C13.2301 19.5894 13.375 19.2397 13.375 18.875C13.375 18.5104 13.2301 18.1606 12.9723 17.9028C12.7144 17.6449 12.3647 17.5 12 17.5H7.875C6.78098 17.5 5.73177 17.0654 4.95818 16.2919C4.1846 15.5183 3.75 14.4691 3.75 13.375C3.75 12.281 4.1846 11.2318 4.95818 10.4582C5.73177 9.68463 6.78098 9.25003 7.875 9.25003V12.6875C7.87513 12.8195 7.91325 12.9487 7.98481 13.0596C8.05636 13.1705 8.15833 13.2584 8.27852 13.3129C8.39872 13.3675 8.53206 13.3862 8.66264 13.367C8.79321 13.3478 8.91549 13.2914 9.01488 13.2045L14.5149 8.39203C14.5885 8.32751 14.6475 8.24801 14.6879 8.15885C14.7283 8.06969 14.7492 7.97292 14.7492 7.87503C14.7492 7.77714 14.7283 7.68038 14.6879 7.59122C14.6475 7.50206 14.5885 7.42256 14.5149 7.35803L9.01488 2.54553Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M21.625 17.5H17.5C17.1353 17.5 16.7856 17.6449 16.5277 17.9028C16.2699 18.1606 16.125 18.5104 16.125 18.875C16.125 19.2397 16.2699 19.5894 16.5277 19.8473C16.7856 20.1052 17.1353 20.25 17.5 20.25H21.625C21.9897 20.25 22.3394 20.1052 22.5973 19.8473C22.8551 19.5894 23 19.2397 23 18.875C23 18.5104 22.8551 18.1606 22.5973 17.9028C22.3394 17.6449 21.9897 17.5 21.625 17.5Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M21.625 12H17.5C17.1353 12 16.7856 12.1449 16.5277 12.4028C16.2699 12.6606 16.125 13.0104 16.125 13.375C16.125 13.7397 16.2699 14.0894 16.5277 14.3473C16.7856 14.6052 17.1353 14.75 17.5 14.75H21.625C21.9897 14.75 22.3394 14.6052 22.5973 14.3473C22.8551 14.0894 23 13.7397 23 13.375C23 13.0104 22.8551 12.6606 22.5973 12.4028C22.3394 12.1449 21.9897 12 21.625 12Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M17.5 9.25003H21.625C21.9897 9.25003 22.3394 9.10517 22.5973 8.8473C22.8551 8.58944 23 8.23971 23 7.87503C23 7.51036 22.8551 7.16062 22.5973 6.90276C22.3394 6.6449 21.9897 6.50003 21.625 6.50003H17.5C17.1353 6.50003 16.7856 6.6449 16.5277 6.90276C16.2699 7.16062 16.125 7.51036 16.125 7.87503C16.125 8.23971 16.2699 8.58944 16.5277 8.8473C16.7856 9.10517 17.1353 9.25003 17.5 9.25003Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "HighPriority"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/arrows/HighPriority.tsx b/app/components/base/icons/src/vender/solid/arrows/HighPriority.tsx
new file mode 100644
index 0000000..4d25be2
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/arrows/HighPriority.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './HighPriority.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'HighPriority'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/arrows/index.ts b/app/components/base/icons/src/vender/solid/arrows/index.ts
new file mode 100644
index 0000000..468f0e5
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/arrows/index.ts
@@ -0,0 +1,2 @@
+export { default as ChevronDown } from './ChevronDown'
+export { default as HighPriority } from './HighPriority'
diff --git a/app/components/base/icons/src/vender/solid/communication/AiText.json b/app/components/base/icons/src/vender/solid/communication/AiText.json
new file mode 100644
index 0000000..c6e30fb
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/AiText.json
@@ -0,0 +1,53 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M4 5C3.44772 5 3 5.44772 3 6C3 6.55228 3.44772 7 4 7H20C20.5523 7 21 6.55228 21 6C21 5.44772 20.5523 5 20 5H4Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M17.9191 9.60608C17.7616 9.2384 17.4 9 17 9C16.6 9 16.2384 9.2384 16.0809 9.60608L14.7384 12.7384L11.6061 14.0809C11.2384 14.2384 11 14.6 11 15C11 15.4 11.2384 15.7616 11.6061 15.9191L14.7384 17.2616L16.0809 20.3939C16.2384 20.7616 16.6 21 17 21C17.4 21 17.7616 20.7616 17.9191 20.3939L19.2616 17.2616L22.3939 15.9191C22.7616 15.7616 23 15.4 23 15C23 14.6 22.7616 14.2384 22.3939 14.0809L19.2616 12.7384L17.9191 9.60608Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M4 11C3.44772 11 3 11.4477 3 12C3 12.5523 3.44772 13 4 13H9C9.55228 13 10 12.5523 10 12C10 11.4477 9.55228 11 9 11H4Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M4 17C3.44772 17 3 17.4477 3 18C3 18.5523 3.44772 19 4 19H7C7.55228 19 8 18.5523 8 18C8 17.4477 7.55228 17 7 17H4Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "AiText"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/communication/AiText.tsx b/app/components/base/icons/src/vender/solid/communication/AiText.tsx
new file mode 100644
index 0000000..c1a6a24
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/AiText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AiText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AiText'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/communication/BubbleTextMod.json b/app/components/base/icons/src/vender/solid/communication/BubbleTextMod.json
new file mode 100644
index 0000000..fceddcc
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/BubbleTextMod.json
@@ -0,0 +1,28 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M2 9C2 5.68629 4.68629 3 8 3H16C19.3137 3 22 5.68629 22 9V15C22 18.3137 19.3137 21 16 21H3C2.44772 21 2 20.5523 2 20V9ZM9 9C8.44772 9 8 9.44772 8 10C8 10.5523 8.44772 11 9 11H15C15.5523 11 16 10.5523 16 10C16 9.44772 15.5523 9 15 9H9ZM9 13C8.44772 13 8 13.4477 8 14C8 14.5523 8.44772 15 9 15H12C12.5523 15 13 14.5523 13 14C13 13.4477 12.5523 13 12 13H9Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "BubbleTextMod"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/communication/BubbleTextMod.tsx b/app/components/base/icons/src/vender/solid/communication/BubbleTextMod.tsx
new file mode 100644
index 0000000..da3ed73
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/BubbleTextMod.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './BubbleTextMod.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'BubbleTextMod'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/communication/ChatBot.json b/app/components/base/icons/src/vender/solid/communication/ChatBot.json
new file mode 100644
index 0000000..024b0ed
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/ChatBot.json
@@ -0,0 +1,58 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "13",
+			"height": "12",
+			"viewBox": "0 0 13 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "chat-bot"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M4.20913 2.76912L4.09542 2.83543L3.98172 2.76912C3.90566 2.72476 3.86328 2.64979 3.86328 2.57101C3.86328 2.44347 3.96789 2.33887 4.09542 2.33887C4.22296 2.33887 4.32757 2.44347 4.32757 2.57101C4.32757 2.64979 4.28519 2.72476 4.20913 2.76912Z",
+							"fill": "currentColor",
+							"stroke": "currentColor",
+							"stroke-width": "1.25"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M10.0174 6.00058C10.0123 5.98686 10.0097 5.97229 10.0046 5.95858C9.81684 5.48158 9.35398 5.14258 8.81056 5.14258H8.66784L7.52484 5.99972C7.33713 6.14029 7.11556 6.21444 6.88284 6.21444C6.29184 6.21444 5.81056 5.73358 5.81056 5.14258H2.81013C2.10127 5.14258 1.52441 5.71944 1.52441 6.42829V9.85686C1.52441 10.5657 2.10127 11.1426 2.81013 11.1426H8.81013C9.51899 11.1426 10.0958 10.5657 10.0958 9.85686V6.42829C10.0958 6.34386 10.0868 6.26158 10.071 6.18186C10.0586 6.11886 10.0384 6.05972 10.0174 6.00058ZM3.88156 8.57115C3.52713 8.57115 3.2387 8.28272 3.2387 7.92829C3.2387 7.57386 3.52713 7.28544 3.88156 7.28544C4.23599 7.28544 4.52441 7.57386 4.52441 7.92829C4.52441 8.28272 4.23599 8.57115 3.88156 8.57115ZM7.7387 8.57115C7.38427 8.57115 7.09584 8.28272 7.09584 7.92829C7.09584 7.57386 7.38427 7.28544 7.7387 7.28544C8.09313 7.28544 8.38156 7.57386 8.38156 7.92829C8.38156 8.28272 8.09313 8.57115 7.7387 8.57115Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_3",
+							"d": "M6.66699 5.14314V1.71456C6.66699 1.24099 7.05056 0.857422 7.52413 0.857422H10.9527C11.4263 0.857422 11.8098 1.24099 11.8098 1.71456V3.42885C11.8098 3.90242 11.4263 4.28599 10.9527 4.28599H8.38128L7.00985 5.31456C6.86842 5.42042 6.66699 5.31971 6.66699 5.14314Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ChatBot"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/communication/ChatBot.tsx b/app/components/base/icons/src/vender/solid/communication/ChatBot.tsx
new file mode 100644
index 0000000..867ae31
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/ChatBot.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ChatBot.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ChatBot'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/communication/CuteRobot.json b/app/components/base/icons/src/vender/solid/communication/CuteRobot.json
new file mode 100644
index 0000000..5b36575
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/CuteRobot.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "cute-robot"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M12 1C12.5523 1 13 1.44772 13 2V3H17C18.6569 3 20 4.34315 20 6V11C20 11.8885 19.6138 12.6868 19 13.2361V14.5858L20.7071 16.2929C21.0976 16.6834 21.0976 17.3166 20.7071 17.7071C20.3166 18.0976 19.6834 18.0976 19.2929 17.7071L18.681 17.0952C17.7905 19.9377 15.1361 22 12 22C8.8639 22 6.20948 19.9377 5.31897 17.0952L4.70711 17.7071C4.31658 18.0976 3.68342 18.0976 3.29289 17.7071C2.90237 17.3166 2.90237 16.6834 3.29289 16.2929L5 14.5858V13.2361C4.38625 12.6868 4 11.8885 4 11V6C4 4.34315 5.34315 3 7 3H11V2C11 1.44772 11.4477 1 12 1ZM7 5C6.44772 5 6 5.44772 6 6V11C6 11.5523 6.44772 12 7 12H17C17.5523 12 18 11.5523 18 11V6C18 5.44772 17.5523 5 17 5H7ZM9 7C9.55228 7 10 7.44772 10 8V9C10 9.55228 9.55228 10 9 10C8.44772 10 8 9.55228 8 9V8C8 7.44772 8.44772 7 9 7ZM15 7C15.5523 7 16 7.44772 16 8V9C16 9.55228 15.5523 10 15 10C14.4477 10 14 9.55228 14 9V8C14 7.44772 14.4477 7 15 7Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "CuteRobot"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/communication/CuteRobot.tsx b/app/components/base/icons/src/vender/solid/communication/CuteRobot.tsx
new file mode 100644
index 0000000..526bb77
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/CuteRobot.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './CuteRobot.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'CuteRobot'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/communication/EditList.json b/app/components/base/icons/src/vender/solid/communication/EditList.json
new file mode 100644
index 0000000..436f0be
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/EditList.json
@@ -0,0 +1,53 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M3.00195 4C3.00195 3.44772 3.44967 3 4.00195 3H20.002C20.5542 3 21.002 3.44772 21.002 4C21.002 4.55228 20.5542 5 20.002 5H4.00195C3.44967 5 3.00195 4.55228 3.00195 4Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M3.00195 8C3.00195 7.44772 3.44967 7 4.00195 7H10.502C11.0542 7 11.502 7.44772 11.502 8C11.502 8.55228 11.0542 9 10.502 9H4.00195C3.44967 9 3.00195 8.55228 3.00195 8Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M4 11C3.44772 11 3 11.4477 3 12C3 12.5523 3.44772 13 4 13H7.0022C7.55448 13 8.0022 12.5523 8.0022 12C8.0022 11.4477 7.55448 11 7.0022 11H4Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M19.2584 8.70705C18.0868 7.53548 16.1873 7.53547 15.0158 8.70705L7.29485 16.428C7.10731 16.6155 7.00195 16.8699 7.00195 17.1351V20.9999C7.00195 21.5522 7.44967 21.9999 8.00195 21.9999H11.8668C12.132 21.9999 12.3864 21.8946 12.5739 21.7071L20.2948 13.9861C21.4664 12.8146 21.4664 10.9151 20.2948 9.74349L19.2584 8.70705Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "EditList"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/communication/EditList.tsx b/app/components/base/icons/src/vender/solid/communication/EditList.tsx
new file mode 100644
index 0000000..09fce2c
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/EditList.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './EditList.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'EditList'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/communication/ListSparkle.json b/app/components/base/icons/src/vender/solid/communication/ListSparkle.json
new file mode 100644
index 0000000..2e348e4
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/ListSparkle.json
@@ -0,0 +1,53 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M4 5C3.44772 5 3 5.44772 3 6C3 6.55228 3.44772 7 4 7H20C20.5523 7 21 6.55228 21 6C21 5.44772 20.5523 5 20 5H4Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M17.9191 9.60608C17.7616 9.2384 17.4 9 17 9C16.6 9 16.2384 9.2384 16.0809 9.60608L14.7384 12.7384L11.6061 14.0809C11.2384 14.2384 11 14.6 11 15C11 15.4 11.2384 15.7616 11.6061 15.9191L14.7384 17.2616L16.0809 20.3939C16.2384 20.7616 16.6 21 17 21C17.4 21 17.7616 20.7616 17.9191 20.3939L19.2616 17.2616L22.3939 15.9191C22.7616 15.7616 23 15.4 23 15C23 14.6 22.7616 14.2384 22.3939 14.0809L19.2616 12.7384L17.9191 9.60608Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M4 11C3.44772 11 3 11.4477 3 12C3 12.5523 3.44772 13 4 13H9C9.55228 13 10 12.5523 10 12C10 11.4477 9.55228 11 9 11H4Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M4 17C3.44772 17 3 17.4477 3 18C3 18.5523 3.44772 19 4 19H7C7.55228 19 8 18.5523 8 18C8 17.4477 7.55228 17 7 17H4Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "ListSparkle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/communication/ListSparkle.tsx b/app/components/base/icons/src/vender/solid/communication/ListSparkle.tsx
new file mode 100644
index 0000000..b42b769
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/ListSparkle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ListSparkle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ListSparkle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/communication/Logic.json b/app/components/base/icons/src/vender/solid/communication/Logic.json
new file mode 100644
index 0000000..57f86f4
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/Logic.json
@@ -0,0 +1,53 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "logic"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M12.9089 11.9999C13.913 11.9999 14.727 11.186 14.727 10.1819C14.727 9.17775 13.913 8.36376 12.9089 8.36376C11.9048 8.36376 11.0908 9.17775 11.0908 10.1819C11.0908 11.186 11.9048 11.9999 12.9089 11.9999Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M12.2871 1.11229C9.95219 1.3228 7.78275 2.40696 6.21264 4.14796C4.64254 5.88897 3.78749 8.15849 3.81849 10.5027V10.8763L2.09676 14.3207C2.04261 14.4277 2.01016 14.5444 2.00129 14.6639C1.99241 14.7835 2.00729 14.9037 2.04506 15.0175C2.08283 15.1313 2.14275 15.2366 2.22136 15.3271C2.29997 15.4177 2.39573 15.4918 2.50311 15.5452L3.81849 16.1979V18.3632C3.81849 19.0865 4.10581 19.7802 4.61725 20.2916C5.12869 20.803 5.82234 21.0904 6.54562 21.0904H9.27276V22.9084H19.2722V16.6606C20.5995 15.3604 21.496 13.6844 21.8409 11.8588C22.1858 10.0331 21.9625 8.14562 21.2012 6.45084C20.4398 4.75606 19.1769 3.33556 17.583 2.38094C15.989 1.42633 14.1406 0.983541 12.2871 1.11229ZM17.4542 11.0909H16.416C16.3316 11.4163 16.2016 11.7282 16.0297 12.0172L16.7651 12.7526C16.8519 12.8365 16.9212 12.9368 16.9688 13.0477C17.0165 13.1586 17.0415 13.2779 17.0426 13.3986C17.0436 13.5193 17.0206 13.639 16.9749 13.7507C16.9292 13.8624 16.8617 13.9639 16.7764 14.0493C16.691 14.1346 16.5895 14.2021 16.4778 14.2478C16.3661 14.2935 16.2464 14.3165 16.1257 14.3155C16.005 14.3144 15.8857 14.2893 15.7748 14.2417C15.6639 14.1941 15.5636 14.1248 15.4797 14.038L14.7443 13.3026C14.4553 13.4745 14.1434 13.6045 13.818 13.6889V14.727C13.818 14.9681 13.7222 15.1994 13.5517 15.3698C13.3812 15.5403 13.15 15.6361 12.9089 15.6361C12.6678 15.6361 12.4366 15.5403 12.2661 15.3698C12.0957 15.1994 11.9999 14.9681 11.9999 14.727V13.6889C11.6744 13.6045 11.3625 13.4745 11.0736 13.3026L10.3382 14.038C10.1667 14.2036 9.93708 14.2952 9.69873 14.2931C9.46038 14.2911 9.23239 14.1955 9.06384 14.0269C8.8953 13.8584 8.79969 13.6304 8.79762 13.392C8.79555 13.1537 8.88718 12.924 9.05277 12.7526L9.78818 12.0172C9.61629 11.7282 9.48622 11.4163 9.40184 11.0909H8.36371C8.12262 11.0909 7.8914 10.9951 7.72092 10.8246C7.55044 10.6541 7.45467 10.4229 7.45467 10.1818C7.45467 9.94073 7.55044 9.70951 7.72092 9.53903C7.8914 9.36855 8.12262 9.27278 8.36371 9.27278H9.40184C9.48622 8.94731 9.61629 8.63544 9.78818 8.34647L9.05277 7.61105C8.88718 7.4396 8.79555 7.20997 8.79762 6.97163C8.79969 6.73328 8.8953 6.50528 9.06384 6.33673C9.23239 6.16819 9.46038 6.07259 9.69873 6.07052C9.93708 6.06844 10.1667 6.16007 10.3382 6.32566L11.0736 7.06108C11.3625 6.88918 11.6744 6.75911 11.9999 6.67473V5.63661C11.9999 5.39551 12.0957 5.16429 12.2661 4.99381C12.4366 4.82334 12.6678 4.72756 12.9089 4.72756C13.15 4.72756 13.3812 4.82334 13.5517 4.99381C13.7222 5.16429 13.818 5.39551 13.818 5.63661V6.67473C14.1434 6.75911 14.4553 6.88918 14.7443 7.06108L15.4797 6.32566C15.5636 6.23884 15.6639 6.16958 15.7748 6.12194C15.8857 6.0743 16.005 6.04922 16.1257 6.04817C16.2464 6.04713 16.3661 6.07013 16.4778 6.11583C16.5895 6.16154 16.691 6.22904 16.7764 6.31439C16.8617 6.39975 16.9292 6.50124 16.9749 6.61296C17.0206 6.72468 17.0436 6.84438 17.0426 6.96508C17.0415 7.08578 17.0165 7.20507 16.9688 7.31598C16.9212 7.42688 16.8519 7.52719 16.7651 7.61105L16.0297 8.34647C16.2016 8.63544 16.3316 8.94731 16.416 9.27278H17.4542C17.6952 9.27278 17.9265 9.36855 18.0969 9.53903C18.2674 9.70951 18.3632 9.94073 18.3632 10.1818C18.3632 10.4229 18.2674 10.6541 18.0969 10.8246C17.9265 10.9951 17.6952 11.0909 17.4542 11.0909Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Logic"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/communication/Logic.tsx b/app/components/base/icons/src/vender/solid/communication/Logic.tsx
new file mode 100644
index 0000000..695b341
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/Logic.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Logic.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Logic'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/communication/MessageDotsCircle.json b/app/components/base/icons/src/vender/solid/communication/MessageDotsCircle.json
new file mode 100644
index 0000000..dca92bf
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/MessageDotsCircle.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "message-dots-circle"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M12 2C6.47715 2 2 6.47715 2 12C2 13.3283 2.25952 14.5985 2.73156 15.7608C2.77419 15.8658 2.79872 15.9264 2.81552 15.9711L2.82063 15.9849L2.82 15.9897C2.815 16.0266 2.80672 16.0769 2.79071 16.173L2.19294 19.7596C2.16612 19.9202 2.13611 20.0999 2.12433 20.256C2.11148 20.4261 2.10701 20.6969 2.22973 20.983C2.38144 21.3367 2.6633 21.6186 3.017 21.7703C3.30312 21.893 3.57386 21.8885 3.74404 21.8757C3.90013 21.8639 4.07985 21.8339 4.24049 21.8071L7.82705 21.2093C7.92309 21.1933 7.97339 21.185 8.0103 21.18L8.01505 21.1794L8.02887 21.1845C8.07362 21.2013 8.13423 21.2258 8.23921 21.2684C9.4015 21.7405 10.6717 22 12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2ZM6 12C6 11.1716 6.67157 10.5 7.5 10.5C8.32843 10.5 9 11.1716 9 12C9 12.8284 8.32843 13.5 7.5 13.5C6.67157 13.5 6 12.8284 6 12ZM10.5 12C10.5 11.1716 11.1716 10.5 12 10.5C12.8284 10.5 13.5 11.1716 13.5 12C13.5 12.8284 12.8284 13.5 12 13.5C11.1716 13.5 10.5 12.8284 10.5 12ZM16.5 10.5C15.6716 10.5 15 11.1716 15 12C15 12.8284 15.6716 13.5 16.5 13.5C17.3284 13.5 18 12.8284 18 12C18 11.1716 17.3284 10.5 16.5 10.5Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "MessageDotsCircle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/communication/MessageDotsCircle.tsx b/app/components/base/icons/src/vender/solid/communication/MessageDotsCircle.tsx
new file mode 100644
index 0000000..08431ea
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/MessageDotsCircle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './MessageDotsCircle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'MessageDotsCircle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/communication/MessageFast.json b/app/components/base/icons/src/vender/solid/communication/MessageFast.json
new file mode 100644
index 0000000..4580398
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/MessageFast.json
@@ -0,0 +1,28 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M16.2414 2H7.7588C6.95383 1.99999 6.28946 1.99998 5.74827 2.04419C5.18617 2.09012 4.66947 2.18868 4.18413 2.43598C3.43149 2.81947 2.81956 3.43139 2.43607 4.18404C2.18878 4.66937 2.09022 5.18608 2.04429 5.74818C2.00007 6.28937 2.00008 6.95373 2.0001 7.7587L2.00005 14.1376C1.99962 14.933 1.9993 15.5236 2.13639 16.0353C2.50626 17.4156 3.58445 18.4938 4.96482 18.8637C5.27229 18.9461 5.60829 18.9789 6.0001 18.9918L6.00009 20.371C6.00005 20.6062 6 20.846 6.01785 21.0425C6.03492 21.2305 6.08012 21.5852 6.32778 21.8955C6.61276 22.2525 7.0449 22.4602 7.50172 22.4597C7.8987 22.4593 8.20394 22.273 8.36137 22.1689C8.52597 22.06 8.7132 21.9102 8.89688 21.7632L11.31 19.8327C11.8286 19.4178 11.9826 19.3007 12.1425 19.219C12.303 19.137 12.4738 19.0771 12.6504 19.0408C12.8263 19.0047 13.0197 19 13.6838 19H16.2414C17.0464 19 17.7107 19 18.2519 18.9558C18.814 18.9099 19.3307 18.8113 19.8161 18.564C20.5687 18.1805 21.1806 17.5686 21.5641 16.816C21.8114 16.3306 21.91 15.8139 21.9559 15.2518C22.0001 14.7106 22.0001 14.0463 22.0001 13.2413V7.75868C22.0001 6.95372 22.0001 6.28936 21.9559 5.74818C21.91 5.18608 21.8114 4.66937 21.5641 4.18404C21.1806 3.43139 20.5687 2.81947 19.8161 2.43598C19.3307 2.18868 18.814 2.09012 18.2519 2.04419C17.7107 1.99998 17.0464 1.99999 16.2414 2ZM12.681 5.5349C12.8938 5.61898 13.0218 5.83714 12.9916 6.06386L12.5688 9.23501L14.48 9.23501C14.5899 9.23498 14.7038 9.23496 14.7979 9.24356C14.8905 9.25203 15.0589 9.27446 15.2095 9.39066C15.3851 9.52617 15.4913 9.73269 15.4996 9.95432C15.5066 10.1444 15.427 10.2945 15.38 10.3747C15.3324 10.4563 15.2661 10.549 15.2022 10.6384L11.9072 15.2514C11.7743 15.4375 11.5317 15.5092 11.319 15.4251C11.1063 15.341 10.9782 15.1229 11.0084 14.8961L11.4312 11.725L9.52004 11.725C9.41011 11.725 9.29618 11.725 9.20206 11.7164C9.10948 11.708 8.94106 11.6855 8.79051 11.5693C8.61493 11.4338 8.50866 11.2273 8.50044 11.0057C8.49339 10.8156 8.57303 10.6655 8.61996 10.5853C8.66766 10.5037 8.7339 10.411 8.79781 10.3216L12.0928 5.70858C12.2257 5.52246 12.4683 5.45083 12.681 5.5349Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "MessageFast"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/communication/MessageFast.tsx b/app/components/base/icons/src/vender/solid/communication/MessageFast.tsx
new file mode 100644
index 0000000..45a1e77
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/MessageFast.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './MessageFast.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'MessageFast'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/communication/MessageHeartCircle.json b/app/components/base/icons/src/vender/solid/communication/MessageHeartCircle.json
new file mode 100644
index 0000000..84769ba
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/MessageHeartCircle.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "message-heart-circle"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M8.33334 1.3335C4.83554 1.3335 2.00001 4.16903 2.00001 7.66683C2.00001 8.3735 2.116 9.05444 2.33051 9.69084C2.36824 9.80278 2.39045 9.86902 2.40488 9.91786L2.40961 9.93431L2.40711 9.93952C2.38997 9.97486 2.36451 10.0223 2.31687 10.1105L1.21562 12.1489C1.14736 12.2751 1.07614 12.4069 1.02717 12.5214C0.978485 12.6353 0.89963 12.8442 0.93843 13.0919C0.983911 13.3822 1.15477 13.6378 1.40562 13.7908C1.61963 13.9213 1.84282 13.9283 1.96665 13.9269C2.09123 13.9254 2.24018 13.91 2.38296 13.8952L5.8196 13.54C5.87464 13.5343 5.90342 13.5314 5.92449 13.5297L5.92721 13.5295L5.93545 13.5325C5.96135 13.5418 5.99648 13.5553 6.05711 13.5786C6.76441 13.8511 7.53226 14.0002 8.33334 14.0002C11.8311 14.0002 14.6667 11.1646 14.6667 7.66683C14.6667 4.16903 11.8311 1.3335 8.33334 1.3335ZM5.97972 5.72165C6.73124 5.08746 7.73145 5.27376 8.33126 5.96633C8.93106 5.27376 9.91836 5.09414 10.6828 5.72165C11.4472 6.34916 11.5401 7.41616 10.9499 8.16621C10.5843 8.63089 9.66661 9.4796 9.02123 10.0581C8.78417 10.2706 8.66564 10.3769 8.52339 10.4197C8.40136 10.4564 8.26116 10.4564 8.13913 10.4197C7.99688 10.3769 7.87835 10.2706 7.64128 10.0581C6.9959 9.4796 6.0782 8.63089 5.71257 8.16621C5.1224 7.41616 5.22821 6.35583 5.97972 5.72165Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "MessageHeartCircle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/communication/MessageHeartCircle.tsx b/app/components/base/icons/src/vender/solid/communication/MessageHeartCircle.tsx
new file mode 100644
index 0000000..0894581
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/MessageHeartCircle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './MessageHeartCircle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'MessageHeartCircle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/communication/MessageSmileSquare.json b/app/components/base/icons/src/vender/solid/communication/MessageSmileSquare.json
new file mode 100644
index 0000000..7810d90
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/MessageSmileSquare.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "message-smile-square"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M10.8273 1.33337H5.17221C4.63556 1.33337 4.19265 1.33336 3.83185 1.36284C3.45712 1.39345 3.11265 1.45916 2.7891 1.62402C2.28733 1.87969 1.87938 2.28763 1.62372 2.7894C1.45886 3.11296 1.39315 3.45743 1.36253 3.83216C1.33306 4.19295 1.33306 4.63586 1.33307 5.17251L1.33304 9.42509C1.33275 9.95535 1.33254 10.3491 1.42394 10.6902C1.67052 11.6105 2.38931 12.3293 3.30955 12.5758C3.51453 12.6308 3.73853 12.6526 3.99974 12.6612L3.99974 13.5807C3.99971 13.7375 3.99967 13.8974 4.01157 14.0284C4.02296 14.1537 4.05309 14.3902 4.2182 14.597C4.40818 14.835 4.69628 14.9735 5.00082 14.9732C5.26547 14.9729 5.46897 14.8487 5.57392 14.7793C5.68366 14.7067 5.80847 14.6068 5.93093 14.5088L7.53968 13.2218C7.8854 12.9453 7.98804 12.8672 8.0947 12.8127C8.20168 12.758 8.31556 12.7181 8.43324 12.6939C8.55057 12.6699 8.6795 12.6667 9.12224 12.6667H10.8273C11.3639 12.6667 11.8068 12.6667 12.1676 12.6372C12.5424 12.6066 12.8868 12.5409 13.2104 12.3761C13.7121 12.1204 14.1201 11.7124 14.3758 11.2107C14.5406 10.8871 14.6063 10.5427 14.6369 10.1679C14.6664 9.80713 14.6664 9.36423 14.6664 8.82759V5.17249C14.6664 4.63585 14.6664 4.19295 14.6369 3.83216C14.6063 3.45743 14.5406 3.11296 14.3758 2.7894C14.1201 2.28763 13.7121 1.87969 13.2104 1.62402C12.8868 1.45916 12.5424 1.39345 12.1676 1.36284C11.8068 1.33336 11.3639 1.33337 10.8273 1.33337ZM8.99479 5.00004C8.99479 4.44776 9.44251 4.00004 9.99479 4.00004C10.5471 4.00004 10.9948 4.44776 10.9948 5.00004C10.9948 5.55233 10.5471 6.00004 9.99479 6.00004C9.44251 6.00004 8.99479 5.55233 8.99479 5.00004ZM4.92813 7.80008C5.22175 7.57986 5.63792 7.63849 5.85937 7.93064C5.90047 7.98307 5.94569 8.03241 5.99175 8.08048C6.08995 8.18295 6.23751 8.32196 6.42858 8.46092C6.81329 8.74071 7.34515 9.00008 7.9948 9.00008C8.64444 9.00008 9.17631 8.74071 9.56102 8.46092C9.75209 8.32196 9.89965 8.18295 9.99785 8.08048C10.0439 8.03242 10.0891 7.98306 10.1302 7.93064C10.3517 7.63849 10.7678 7.57986 11.0615 7.80008C11.356 8.02099 11.4157 8.43886 11.1948 8.73341C11.1965 8.73124 11.1925 8.73622 11.1857 8.74479C11.1695 8.76522 11.137 8.8061 11.1259 8.81929C11.0868 8.86587 11.0315 8.92896 10.9605 9.00302C10.8191 9.15055 10.6125 9.34486 10.3452 9.53924C9.81328 9.92612 9.01182 10.3334 7.9948 10.3334C6.97778 10.3334 6.17631 9.92612 5.64435 9.53924C5.37709 9.34486 5.17048 9.15055 5.0291 9.00302C4.95813 8.92896 4.9028 8.86587 4.8637 8.81929C4.84413 8.79597 4.82856 8.77671 4.81707 8.76219C4.58678 8.46467 4.61774 8.03288 4.92813 7.80008ZM5.99479 4.00004C5.44251 4.00004 4.99479 4.44776 4.99479 5.00004C4.99479 5.55233 5.44251 6.00004 5.99479 6.00004C6.54708 6.00004 6.99479 5.55233 6.99479 5.00004C6.99479 4.44776 6.54708 4.00004 5.99479 4.00004Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "MessageSmileSquare"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/communication/MessageSmileSquare.tsx b/app/components/base/icons/src/vender/solid/communication/MessageSmileSquare.tsx
new file mode 100644
index 0000000..ece3080
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/MessageSmileSquare.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './MessageSmileSquare.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'MessageSmileSquare'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/communication/Send03.json b/app/components/base/icons/src/vender/solid/communication/Send03.json
new file mode 100644
index 0000000..c6ff534
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/Send03.json
@@ -0,0 +1,36 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "20",
+			"height": "20",
+			"viewBox": "0 0 20 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "send-03"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"d": "M18.4385 10.5535C18.6111 10.2043 18.6111 9.79465 18.4385 9.44548C18.2865 9.13803 18.0197 8.97682 17.8815 8.89905C17.7327 8.81532 17.542 8.72955 17.3519 8.64403L3.36539 2.35014C3.17087 2.26257 2.97694 2.17526 2.81335 2.11859C2.66315 2.06656 2.36076 1.97151 2.02596 2.06467C1.64761 2.16994 1.34073 2.4469 1.19734 2.81251C1.07045 3.13604 1.13411 3.44656 1.17051 3.60129C1.21017 3.76983 1.27721 3.9717 1.34445 4.17418L2.69818 8.25278C2.80718 8.58118 2.86168 8.74537 2.96302 8.86678C3.05252 8.97399 3.16752 9.05699 3.29746 9.10816C3.44462 9.1661 3.61762 9.1661 3.96363 9.1661H10.0001C10.4603 9.1661 10.8334 9.53919 10.8334 9.99943C10.8334 10.4597 10.4603 10.8328 10.0001 10.8328H3.97939C3.63425 10.8328 3.46168 10.8328 3.3148 10.8905C3.18508 10.9414 3.07022 11.0241 2.98072 11.1309C2.87937 11.2519 2.82459 11.4155 2.71502 11.7428L1.3504 15.8191C1.28243 16.0221 1.21472 16.2242 1.17455 16.3929C1.13773 16.5476 1.07301 16.8587 1.19956 17.1831C1.34245 17.5493 1.64936 17.827 2.02806 17.9327C2.36342 18.0263 2.6665 17.9309 2.81674 17.8789C2.98066 17.8221 3.17507 17.7346 3.37023 17.6467L17.3518 11.355C17.542 11.2695 17.7327 11.1837 17.8815 11.0999C18.0197 11.0222 18.2865 10.861 18.4385 10.5535Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Send03"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/communication/Send03.tsx b/app/components/base/icons/src/vender/solid/communication/Send03.tsx
new file mode 100644
index 0000000..7e23d70
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/Send03.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Send03.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Send03'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/communication/index.ts b/app/components/base/icons/src/vender/solid/communication/index.ts
new file mode 100644
index 0000000..7d2a3a5
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/communication/index.ts
@@ -0,0 +1,12 @@
+export { default as AiText } from './AiText'
+export { default as BubbleTextMod } from './BubbleTextMod'
+export { default as ChatBot } from './ChatBot'
+export { default as CuteRobot } from './CuteRobot'
+export { default as EditList } from './EditList'
+export { default as ListSparkle } from './ListSparkle'
+export { default as Logic } from './Logic'
+export { default as MessageDotsCircle } from './MessageDotsCircle'
+export { default as MessageFast } from './MessageFast'
+export { default as MessageHeartCircle } from './MessageHeartCircle'
+export { default as MessageSmileSquare } from './MessageSmileSquare'
+export { default as Send03 } from './Send03'
diff --git a/app/components/base/icons/src/vender/solid/development/ApiConnection.json b/app/components/base/icons/src/vender/solid/development/ApiConnection.json
new file mode 100644
index 0000000..6aafba9
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/ApiConnection.json
@@ -0,0 +1,53 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "api-connection"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M4.36364 11.8182C4.36364 7.60073 7.78255 4.18182 12 4.18182C14.8252 4.18182 17.2934 5.71543 18.6154 8.00079C18.9171 8.52231 19.5844 8.70053 20.106 8.39884C20.6275 8.09716 20.8057 7.42982 20.504 6.9083C18.8081 3.97648 15.6355 2 12 2C6.9463 2 2.78441 5.81824 2.24174 10.7273H1.09091C0.488417 10.7273 0 11.2157 0 11.8182C0 12.4207 0.488417 12.9091 1.09091 12.9091H2.24174C2.78441 17.8181 6.9463 21.6364 12 21.6364C15.6355 21.6364 18.8081 19.6599 20.504 16.7281C20.8057 16.2065 20.6275 15.5392 20.106 15.2375C19.5844 14.9358 18.9171 15.1141 18.6154 15.6356C17.2934 17.9209 14.8252 19.4545 12 19.4545C7.78255 19.4545 4.36364 16.0356 4.36364 11.8182Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M12 6.36364C8.98754 6.36364 6.54545 8.80572 6.54545 11.8182C6.54545 14.8306 8.98754 17.2727 12 17.2727C14.6389 17.2727 16.84 15.3988 17.3454 12.9091H22.9091C23.5116 12.9091 24 12.4207 24 11.8182C24 11.2157 23.5116 10.7273 22.9091 10.7273H17.3454C16.84 8.23756 14.6389 6.36364 12 6.36364Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "ApiConnection"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/development/ApiConnection.tsx b/app/components/base/icons/src/vender/solid/development/ApiConnection.tsx
new file mode 100644
index 0000000..7001163
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/ApiConnection.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ApiConnection.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ApiConnection'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/development/ApiConnectionMod.json b/app/components/base/icons/src/vender/solid/development/ApiConnectionMod.json
new file mode 100644
index 0000000..e8ebcc7
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/ApiConnectionMod.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon L"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M7.99996 3.33333C5.42263 3.33333 3.33329 5.42267 3.33329 8C3.33329 10.5773 5.42263 12.6667 7.99996 12.6667C9.72643 12.6667 11.2348 11.7295 12.0427 10.3329C12.227 10.0141 12.6349 9.90523 12.9536 10.0896C13.2723 10.274 13.3812 10.6818 13.1968 11.0005C12.1604 12.7921 10.2216 14 7.99996 14C4.91159 14 2.36821 11.6666 2.03658 8.66667H1.33329C0.965103 8.66667 0.666626 8.36819 0.666626 8C0.666626 7.63181 0.965103 7.33333 1.33329 7.33333H2.03658C2.36821 4.33337 4.91159 2 7.99996 2C10.2216 2 12.1604 3.20785 13.1968 4.99952C13.3812 5.31823 13.2723 5.72605 12.9536 5.91041C12.6349 6.09477 12.227 5.98585 12.0427 5.66714C11.2348 4.27054 9.72643 3.33333 7.99996 3.33333ZM7.99996 6C6.89539 6 5.99996 6.89543 5.99996 8C5.99996 9.10455 6.89539 10 7.99996 10C9.1045 10 9.99996 9.10454 9.99996 8C9.99996 6.89543 9.10451 6 7.99996 6ZM4.66663 8C4.66663 6.15905 6.15901 4.66667 7.99996 4.66667C9.61257 4.66667 10.9578 5.81184 11.2666 7.33333H14.6666C15.0348 7.33333 15.3333 7.63181 15.3333 8C15.3333 8.36819 15.0348 8.66667 14.6666 8.66667H11.2666C10.9578 10.1881 9.61257 11.3333 7.99996 11.3333C6.159 11.3333 4.66663 9.84092 4.66663 8Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ApiConnectionMod"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/development/ApiConnectionMod.tsx b/app/components/base/icons/src/vender/solid/development/ApiConnectionMod.tsx
new file mode 100644
index 0000000..fb741f0
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/ApiConnectionMod.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ApiConnectionMod.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ApiConnectionMod'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/development/BarChartSquare02.json b/app/components/base/icons/src/vender/solid/development/BarChartSquare02.json
new file mode 100644
index 0000000..14b274e
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/BarChartSquare02.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "bar-chart-square-02"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M11.8925 1.33331H4.1078C3.75638 1.3333 3.45319 1.33329 3.20348 1.35369C2.93992 1.37523 2.67777 1.42277 2.42552 1.5513C2.04919 1.74305 1.74323 2.04901 1.55148 2.42533C1.42296 2.67759 1.37541 2.93973 1.35388 3.2033C1.33348 3.453 1.33349 3.75617 1.3335 4.10759V11.8923C1.33349 12.2438 1.33348 12.547 1.35388 12.7967C1.37541 13.0602 1.42296 13.3224 1.55148 13.5746C1.74323 13.951 2.04919 14.2569 2.42552 14.4487C2.67777 14.5772 2.93992 14.6247 3.20348 14.6463C3.45319 14.6667 3.75636 14.6667 4.10779 14.6666H11.8925C12.244 14.6667 12.5471 14.6667 12.7969 14.6463C13.0604 14.6247 13.3226 14.5772 13.5748 14.4487C13.9511 14.2569 14.2571 13.951 14.4488 13.5746C14.5774 13.3224 14.6249 13.0602 14.6465 12.7967C14.6669 12.547 14.6668 12.2438 14.6668 11.8924V4.1076C14.6668 3.75618 14.6669 3.45301 14.6465 3.2033C14.6249 2.93973 14.5774 2.67759 14.4488 2.42533C14.2571 2.04901 13.9511 1.74305 13.5748 1.5513C13.3226 1.42277 13.0604 1.37523 12.7969 1.35369C12.5471 1.33329 12.2439 1.3333 11.8925 1.33331ZM11.3335 4.66665C11.3335 4.29846 11.035 3.99998 10.6668 3.99998C10.2986 3.99998 10.0002 4.29846 10.0002 4.66665V11.3333C10.0002 11.7015 10.2986 12 10.6668 12C11.035 12 11.3335 11.7015 11.3335 11.3333V4.66665ZM8.00016 6.66665C8.36835 6.66665 8.66683 6.96512 8.66683 7.33331V11.3333C8.66683 11.7015 8.36835 12 8.00016 12C7.63197 12 7.3335 11.7015 7.3335 11.3333V7.33331C7.3335 6.96512 7.63197 6.66665 8.00016 6.66665ZM5.3335 9.33331C5.70169 9.33331 6.00016 9.63179 6.00016 9.99998V11.3333C6.00016 11.7015 5.70169 12 5.3335 12C4.96531 12 4.66683 11.7015 4.66683 11.3333V9.99998C4.66683 9.63179 4.96531 9.33331 5.3335 9.33331Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "BarChartSquare02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/development/BarChartSquare02.tsx b/app/components/base/icons/src/vender/solid/development/BarChartSquare02.tsx
new file mode 100644
index 0000000..c8a3357
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/BarChartSquare02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './BarChartSquare02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'BarChartSquare02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/development/Container.json b/app/components/base/icons/src/vender/solid/development/Container.json
new file mode 100644
index 0000000..c2c3701
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/Container.json
@@ -0,0 +1,44 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "17",
+			"height": "16",
+			"viewBox": "0 0 17 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M8.29782 0.790031C8.12061 0.753584 7.93783 0.753584 7.76062 0.790031C7.55577 0.832161 7.37268 0.934712 7.22712 1.01624L7.18744 1.03841C6.01215 1.69134 4.02394 2.79644 2.90301 3.41952C2.63085 3.5708 2.49477 3.64644 2.44929 3.74641C2.40965 3.83357 2.4094 3.93356 2.4486 4.02091C2.49357 4.12111 2.62938 4.19751 2.90101 4.3503L7.76772 7.08785C7.8631 7.1415 7.91079 7.16832 7.96135 7.17884C8.0061 7.18814 8.05229 7.18814 8.09703 7.17884C8.1476 7.16832 8.19529 7.1415 8.29067 7.08785L13.1574 4.35029C13.429 4.1975 13.5649 4.12111 13.6098 4.02091C13.649 3.93355 13.6488 3.83356 13.6091 3.74641C13.5637 3.64644 13.4276 3.57079 13.1554 3.41951C12.0345 2.79644 10.0463 1.69134 8.871 1.03841L8.83132 1.01624C8.68576 0.934713 8.50267 0.832161 8.29782 0.790031Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M14.6932 5.92676C14.6929 5.62787 14.6928 5.47842 14.6297 5.39117C14.5748 5.31504 14.4902 5.26564 14.3969 5.25511C14.2899 5.24305 14.1594 5.31646 13.8984 5.46329L8.96774 8.23679C8.86877 8.29246 8.81928 8.3203 8.78326 8.35968C8.75139 8.39452 8.72729 8.43573 8.71254 8.48059C8.69588 8.53129 8.69588 8.58807 8.69588 8.70163V14.1518C8.69588 14.4499 8.69588 14.599 8.75856 14.6862C8.81326 14.7623 8.89744 14.8118 8.9905 14.8227C9.09716 14.8352 9.22706 14.763 9.48688 14.6188C10.5978 14.0019 12.6169 12.8807 13.8043 12.221L13.8464 12.1977C14.0005 12.1128 14.1943 12.0061 14.343 11.8447C14.4717 11.7051 14.569 11.5397 14.6286 11.3594C14.6975 11.1509 14.6966 10.9298 14.696 10.7538L14.6959 10.7058C14.6959 9.39704 14.6942 7.17087 14.6932 5.92676Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M6.57155 14.6187C6.83137 14.763 6.96128 14.8352 7.06793 14.8227C7.16099 14.8118 7.24518 14.7623 7.29987 14.6862C7.36255 14.599 7.36255 14.4499 7.36255 14.1518V8.70166C7.36255 8.5881 7.36255 8.53132 7.34589 8.48062C7.33114 8.43576 7.30704 8.39455 7.27517 8.35971C7.23915 8.32033 7.18966 8.29249 7.09069 8.23682L2.16004 5.4633C1.89902 5.31648 1.76851 5.24306 1.66154 5.25513C1.56823 5.26565 1.48367 5.31506 1.42869 5.39118C1.36566 5.47844 1.36553 5.62789 1.36528 5.92678C1.36424 7.17088 1.36255 9.39704 1.36255 10.7058L1.36243 10.7538C1.36179 10.9298 1.36099 11.1509 1.42986 11.3594C1.48941 11.5397 1.58676 11.7051 1.71539 11.8447C1.86417 12.0061 2.0579 12.1128 2.21199 12.1977L2.2541 12.221C3.44156 12.8807 5.46065 14.0019 6.57155 14.6187Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Container"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/development/Container.tsx b/app/components/base/icons/src/vender/solid/development/Container.tsx
new file mode 100644
index 0000000..2aa777a
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/Container.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Container.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Container'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/development/Database02.json b/app/components/base/icons/src/vender/solid/development/Database02.json
new file mode 100644
index 0000000..a1c5230
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/Database02.json
@@ -0,0 +1,46 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "17",
+			"height": "16",
+			"viewBox": "0 0 17 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M15.1956 4.66669V3.33335C15.1956 2.76539 14.8497 2.33041 14.4701 2.03126C14.083 1.72618 13.5641 1.48059 12.9824 1.28668C11.812 0.896551 10.2375 0.666687 8.52897 0.666687C6.8204 0.666687 5.24591 0.896551 4.07551 1.28668C3.4938 1.48059 2.97495 1.72618 2.58783 2.03126C2.20823 2.33041 1.8623 2.76539 1.8623 3.33335V4.66669C1.8623 5.23294 2.20443 5.66805 2.58368 5.96857C2.96958 6.27436 3.48705 6.52014 4.06786 6.71405C5.23637 7.10415 6.81113 7.33335 8.52897 7.33335C10.2468 7.33335 11.8216 7.10415 12.9901 6.71405C13.5709 6.52014 14.0884 6.27436 14.4743 5.96857C14.8535 5.66805 15.1956 5.23294 15.1956 4.66669ZM3.19564 3.33353C3.19564 3.33353 3.19576 3.33725 3.19767 3.34355C3.19994 3.35098 3.20552 3.36565 3.21902 3.38764C3.24732 3.43374 3.30502 3.50304 3.41313 3.58824C3.63325 3.76171 3.99308 3.94709 4.49715 4.11511C5.49832 4.44884 6.92383 4.66669 8.52897 4.66669C10.1341 4.66669 11.5596 4.44884 12.5608 4.11511C13.0649 3.94709 13.4247 3.76171 13.6448 3.58824C13.7529 3.50304 13.8106 3.43374 13.8389 3.38764C13.8524 3.36565 13.858 3.35098 13.8603 3.34355C13.8622 3.33716 13.8623 3.33335 13.8623 3.33335C13.8623 3.33335 13.8624 3.33006 13.8603 3.32316C13.858 3.31573 13.8524 3.30105 13.8389 3.27907C13.8106 3.23297 13.7529 3.16367 13.6448 3.07847C13.4247 2.905 13.0649 2.71962 12.5608 2.5516C11.5596 2.21787 10.1341 2.00002 8.52897 2.00002C6.92383 2.00002 5.49832 2.21787 4.49715 2.5516C3.99308 2.71962 3.63325 2.905 3.41313 3.07847C3.30502 3.16367 3.24732 3.23297 3.21902 3.27907C3.20552 3.30105 3.19994 3.31573 3.19767 3.32316C3.19563 3.32988 3.19564 3.33353 3.19564 3.33353Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M14.9234 7.00002C14.8447 7.00002 14.7705 7.03473 14.7155 7.09102C14.6407 7.16749 14.5613 7.23785 14.4802 7.30206C14.0939 7.60785 13.5759 7.85363 12.9945 8.04753C11.8249 8.43764 10.2485 8.66684 8.52896 8.66684C6.8094 8.66684 5.23307 8.43764 4.06339 8.04753C3.48201 7.85363 2.96401 7.60785 2.57773 7.30206C2.49661 7.23784 2.41719 7.16749 2.34244 7.09101C2.28743 7.03473 2.21322 7.00002 2.13452 7.00002C1.98418 7.00002 1.8623 7.12189 1.8623 7.27223V8.66669C1.8623 9.23294 2.20443 9.66805 2.58368 9.96857C2.96958 10.2744 3.48705 10.5201 4.06786 10.714C5.23637 11.1041 6.81113 11.3334 8.52897 11.3334C10.2468 11.3334 11.8216 11.1041 12.9901 10.714C13.5709 10.5201 14.0884 10.2744 14.4743 9.96857C14.8535 9.66805 15.1956 9.23294 15.1956 8.66669V7.27224C15.1956 7.1219 15.0738 7.00002 14.9234 7.00002Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M14.9234 11C14.8447 11 14.7705 11.0347 14.7155 11.091C14.6407 11.1675 14.5613 11.2378 14.4802 11.3021C14.0939 11.6079 13.5759 11.8536 12.9945 12.0475C11.8249 12.4376 10.2485 12.6668 8.52896 12.6668C6.8094 12.6668 5.23307 12.4376 4.06339 12.0475C3.48201 11.8536 2.96401 11.6079 2.57773 11.3021C2.49661 11.2378 2.41719 11.1675 2.34244 11.091C2.28743 11.0347 2.21322 11 2.13452 11C1.98418 11 1.8623 11.1219 1.8623 11.2722V12.6667C1.8623 13.2329 2.20443 13.668 2.58368 13.9686C2.96958 14.2744 3.48705 14.5201 4.06786 14.714C5.23637 15.1041 6.81113 15.3334 8.52897 15.3334C10.2468 15.3334 11.8216 15.1041 12.9901 14.714C13.5709 14.5201 14.0884 14.2744 14.4743 13.9686C14.8535 13.668 15.1956 13.2329 15.1956 12.6667V11.2722C15.1956 11.1219 15.0738 11 14.9234 11Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Database02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/development/Database02.tsx b/app/components/base/icons/src/vender/solid/development/Database02.tsx
new file mode 100644
index 0000000..088a3ae
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/Database02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Database02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Database02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/development/Database03.json b/app/components/base/icons/src/vender/solid/development/Database03.json
new file mode 100644
index 0000000..fa0c7ce
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/Database03.json
@@ -0,0 +1,28 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M8.66659 9.98845C10.1231 9.93732 11.4455 9.71981 12.461 9.38077C13.0418 9.18687 13.5593 8.94109 13.9452 8.6353C14.3245 8.33478 14.6666 7.89967 14.6666 7.33341V3.33341C14.6666 2.76545 14.3207 2.33047 13.9411 2.03132C13.5539 1.72624 13.0351 1.48065 12.4534 1.28675C11.283 0.896612 9.70849 0.666748 7.99992 0.666748C6.29135 0.666748 4.71686 0.896612 3.54646 1.28675C2.96474 1.48065 2.44589 1.72624 2.05878 2.03132C1.67918 2.33047 1.33325 2.76545 1.33325 3.33341V7.33341C1.33325 7.89967 1.67538 8.33478 2.05463 8.6353C2.44053 8.94109 2.958 9.18687 3.53881 9.38077C4.55435 9.71981 5.87675 9.93732 7.33325 9.98845V11.4472C6.76498 11.6481 6.31458 12.0985 6.11372 12.6667H1.99992C1.63173 12.6667 1.33325 12.9652 1.33325 13.3334C1.33325 13.7016 1.63173 14.0001 1.99992 14.0001H6.11372C6.38828 14.7769 7.12911 15.3334 7.99992 15.3334C8.87073 15.3334 9.61156 14.7769 9.88612 14.0001H13.9999C14.3681 14.0001 14.6666 13.7016 14.6666 13.3334C14.6666 12.9652 14.3681 12.6667 13.9999 12.6667H9.88612C9.68526 12.0985 9.23486 11.6481 8.66659 11.4472V9.98845ZM2.66659 3.33337C2.66659 3.33337 2.66657 3.32994 2.66862 3.32322C2.67089 3.31579 2.67647 3.30111 2.68997 3.27913C2.71827 3.23303 2.77597 3.16373 2.88408 3.07853C3.1042 2.90506 3.46403 2.71968 3.9681 2.55166C4.96927 2.21793 6.39478 2.00008 7.99992 2.00008C9.60506 2.00008 11.0306 2.21793 12.0317 2.55166C12.5358 2.71968 12.8956 2.90506 13.1158 3.07853C13.2239 3.16373 13.2816 3.23303 13.3099 3.27913C13.3234 3.30111 13.329 3.31579 13.3312 3.32322C13.3333 3.32994 13.3333 3.33337 13.3333 3.33337C13.3333 3.33337 13.3332 3.33722 13.3312 3.34361C13.329 3.35104 13.3234 3.36572 13.3099 3.3877C13.2816 3.4338 13.2239 3.5031 13.1158 3.5883C12.8956 3.76177 12.5358 3.94715 12.0317 4.11517C11.0306 4.4489 9.60506 4.66675 7.99992 4.66675C6.39478 4.66675 4.96927 4.4489 3.9681 4.11517C3.46403 3.94715 3.1042 3.76177 2.88408 3.5883C2.77597 3.5031 2.71827 3.4338 2.68997 3.3877C2.67647 3.36572 2.67089 3.35104 2.66862 3.34361C2.6667 3.33731 2.66659 3.33337 2.66659 3.33337Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Database03"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/development/Database03.tsx b/app/components/base/icons/src/vender/solid/development/Database03.tsx
new file mode 100644
index 0000000..012294a
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/Database03.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Database03.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Database03'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/development/FileHeart02.json b/app/components/base/icons/src/vender/solid/development/FileHeart02.json
new file mode 100644
index 0000000..08df0f2
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/FileHeart02.json
@@ -0,0 +1,50 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "file-heart-02"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Subtract",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M5.8392 0.666687H10.1609C10.6976 0.666679 11.1405 0.666673 11.5013 0.696151C11.876 0.726767 12.2205 0.792477 12.544 0.957337C13.0458 1.213 13.4538 1.62095 13.7094 2.12271C13.8743 2.44627 13.94 2.79074 13.9706 3.16547C14.0001 3.52626 14.0001 3.96917 14.0001 4.50581V10.0803C13.7558 9.96135 13.4846 9.88753 13.1964 9.87049C13.1342 8.82702 12.2682 8.00002 11.2091 8.00002C10.5956 8.00002 10.0396 8.36134 9.7904 8.922L9.13298 10.4012C8.13309 10.4365 7.33333 11.2582 7.33333 12.2667V14.1334C7.33333 14.3187 7.36034 14.4977 7.41064 14.6667L5.24168 14.6667C4.71142 14.667 4.31765 14.6672 3.97655 14.5758C3.0563 14.3292 2.33751 13.6104 2.09093 12.6902C1.99953 12.3491 1.99974 11.9553 2.00003 11.4251L2.00006 4.50582C2.00006 3.96918 2.00005 3.52627 2.02953 3.16547C2.06014 2.79074 2.12585 2.44627 2.29071 2.12271C2.54638 1.62095 2.95432 1.213 3.45609 0.957337C3.77965 0.792477 4.12412 0.726767 4.49885 0.696151C4.85964 0.666673 5.30256 0.666679 5.8392 0.666687ZM4.66667 4.66669C4.66667 4.2985 4.96514 4.00002 5.33333 4.00002H10.6667C11.0349 4.00002 11.3333 4.2985 11.3333 4.66669C11.3333 5.03488 11.0349 5.33335 10.6667 5.33335H5.33333C4.96514 5.33335 4.66667 5.03488 4.66667 4.66669ZM4.66667 7.33335C4.66667 6.96516 4.96514 6.66669 5.33333 6.66669H8.33333C8.70152 6.66669 9 6.96516 9 7.33335C9 7.70154 8.70152 8.00002 8.33333 8.00002H5.33333C4.96514 8.00002 4.66667 7.70154 4.66667 7.33335ZM4.66667 10C4.66667 9.63183 4.96514 9.33335 5.33333 9.33335H6C6.36819 9.33335 6.66667 9.63183 6.66667 10C6.66667 10.3682 6.36819 10.6667 6 10.6667H5.33333C4.96514 10.6667 4.66667 10.3682 4.66667 10Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon (Stroke)",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M10.7044 9.32812C10.7931 9.12859 10.9909 9 11.2093 9C11.7565 9 12.2002 9.44364 12.2002 9.99089V10.8667H13.0677C13.7623 10.8667 14.2934 11.4858 14.1878 12.1723L13.9006 14.039C13.8156 14.5919 13.3399 15 12.7805 15H9.20016C8.72152 15 8.3335 14.612 8.3335 14.1333V12.2667C8.3335 11.788 8.72152 11.4 9.20016 11.4H9.78354L10.7044 9.32812Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "FileHeart02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/development/FileHeart02.tsx b/app/components/base/icons/src/vender/solid/development/FileHeart02.tsx
new file mode 100644
index 0000000..e918e5e
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/FileHeart02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './FileHeart02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'FileHeart02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/development/PatternRecognition.json b/app/components/base/icons/src/vender/solid/development/PatternRecognition.json
new file mode 100644
index 0000000..3d13c32
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/PatternRecognition.json
@@ -0,0 +1,98 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M4.72727 22C4.18787 22 3.66058 21.84 3.21208 21.5404C2.76359 21.2407 2.41402 20.8148 2.2076 20.3164C2.00118 19.8181 1.94717 19.2697 2.05241 18.7407C2.15764 18.2116 2.41739 17.7257 2.7988 17.3443C3.18022 16.9628 3.66617 16.7031 4.19521 16.5979C4.72425 16.4926 5.27261 16.5466 5.77096 16.7531C6.2693 16.9595 6.69524 17.309 6.99492 17.7575C7.2946 18.206 7.45455 18.7333 7.45455 19.2727C7.45455 19.996 7.16721 20.6897 6.65575 21.2012C6.14429 21.7127 5.45059 22 4.72727 22Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M12 9.27273C11.4606 9.27273 10.9333 9.43268 10.4848 9.73236C10.0363 10.032 9.68675 10.458 9.48033 10.9563C9.27391 11.4547 9.2199 12.003 9.32513 12.5321C9.43036 13.0611 9.69011 13.5471 10.0715 13.9285C10.4529 14.3099 10.9389 14.5696 11.4679 14.6749C11.997 14.7801 12.5453 14.7261 13.0437 14.5197C13.542 14.3133 13.968 13.9637 14.2676 13.5152C14.5673 13.0667 14.7273 12.5394 14.7273 12C14.7273 11.2767 14.4399 10.583 13.9285 10.0715C13.417 9.56006 12.7233 9.27273 12 9.27273Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M4.72727 2C4.18787 2 3.66058 2.15995 3.21208 2.45963C2.76358 2.7593 2.41402 3.18525 2.2076 3.68359C2.00118 4.18193 1.94717 4.7303 2.05241 5.25934C2.15764 5.78838 2.41738 6.27433 2.7988 6.65575C3.18022 7.03716 3.66617 7.29691 4.19521 7.40214C4.72425 7.50737 5.27261 7.45336 5.77096 7.24694C6.2693 7.04052 6.69524 6.69096 6.99492 6.24246C7.29459 5.79397 7.45455 5.26668 7.45455 4.72727C7.45455 4.00395 7.16721 3.31026 6.65575 2.7988C6.14428 2.28734 5.45059 2 4.72727 2Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M19.2727 2C18.7333 2 18.206 2.15995 17.7575 2.45963C17.309 2.75931 16.9595 3.18525 16.7531 3.68359C16.5466 4.18194 16.4926 4.7303 16.5979 5.25934C16.7031 5.78838 16.9628 6.27433 17.3443 6.65575C17.7257 7.03716 18.2116 7.29691 18.7407 7.40214C19.2697 7.50737 19.8181 7.45337 20.3164 7.24694C20.8148 7.04052 21.2407 6.69096 21.5404 6.24247C21.84 5.79397 22 5.26668 22 4.72727C22 4.00396 21.7127 3.31026 21.2012 2.7988C20.6897 2.28734 19.996 2 19.2727 2Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M19.2727 16.5455C18.7333 16.5455 18.206 16.7054 17.7575 17.0051C17.309 17.3048 16.9595 17.7307 16.7531 18.229C16.5466 18.7274 16.4926 19.2758 16.5979 19.8048C16.7031 20.3338 16.9628 20.8198 17.3443 21.2012C17.7257 21.5826 18.2116 21.8424 18.7407 21.9476C19.2697 22.0528 19.8181 21.9988 20.3164 21.7924C20.8148 21.586 21.2407 21.2364 21.5404 20.7879C21.84 20.3394 22 19.8121 22 19.2727C22 18.5494 21.7127 17.8557 21.2012 17.3443C20.6897 16.8328 19.996 16.5455 19.2727 16.5455Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M7.45455 9.27273H2V14.7273H7.45455V9.27273Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M22 9.27273H16.5455V14.7273H22V9.27273Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M14.7273 2H9.27273V7.45455H14.7273V2Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M14.7273 16.5455H9.27273V22H14.7273V16.5455Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "PatternRecognition"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/development/PatternRecognition.tsx b/app/components/base/icons/src/vender/solid/development/PatternRecognition.tsx
new file mode 100644
index 0000000..c1eb6ad
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/PatternRecognition.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './PatternRecognition.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'PatternRecognition'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/development/PromptEngineering.json b/app/components/base/icons/src/vender/solid/development/PromptEngineering.json
new file mode 100644
index 0000000..01fbac5
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/PromptEngineering.json
@@ -0,0 +1,53 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "prompt-engineering"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M5.17263 1.33331H10.8277C11.3643 1.33331 11.8073 1.3333 12.168 1.36278C12.5428 1.39339 12.8872 1.4591 13.2108 1.62396C13.7126 1.87963 14.1205 2.28758 14.3762 2.78934C14.541 3.1129 14.6068 3.45737 14.6374 3.8321C14.6668 4.19289 14.6668 4.63579 14.6668 5.17243V9.61535L14.2671 9.51541C13.9093 9.42597 13.7127 9.37607 13.5686 9.33055C13.506 9.31079 13.4738 9.2979 13.4609 9.29232C13.427 9.26909 13.3977 9.23979 13.3745 9.2059C13.3689 9.19304 13.356 9.16081 13.3363 9.09826C13.2907 8.95416 13.2408 8.7575 13.1514 8.39975L12.9504 7.59575C12.7649 6.85381 12.0983 6.33331 11.3335 6.33331C10.5687 6.33331 9.90208 6.85381 9.71659 7.59576L9.51559 8.39975C9.42616 8.7575 9.37626 8.95416 9.33074 9.09826C9.31097 9.16081 9.29808 9.19303 9.29251 9.2059C9.26927 9.23979 9.23997 9.26909 9.20609 9.29232C9.19322 9.2979 9.16099 9.31079 9.09844 9.33055C8.95434 9.37607 8.75769 9.42597 8.39993 9.51541L7.59594 9.71641C6.85399 9.9019 6.3335 10.5685 6.3335 11.3333C6.3335 12.0981 6.85399 12.7647 7.59594 12.9502L8.39993 13.1512C8.75769 13.2407 8.95434 13.2906 9.09844 13.3361C9.16099 13.3558 9.19322 13.3687 9.20609 13.3743C9.23997 13.3975 9.26927 13.4268 9.29251 13.4607C9.29808 13.4736 9.31098 13.5058 9.33074 13.5684C9.37626 13.7125 9.42616 13.9091 9.51559 14.2669L9.61553 14.6666H5.17268C4.63601 14.6667 4.19309 14.6667 3.83228 14.6372C3.45755 14.6066 3.11308 14.5409 2.78952 14.376C2.28776 14.1203 1.87981 13.7124 1.62415 13.2106C1.45929 12.8871 1.39358 12.5426 1.36296 12.1679C1.33348 11.8071 1.33349 11.3642 1.3335 10.8275V5.17245C1.33349 4.63581 1.33348 4.19289 1.36296 3.8321C1.39358 3.45737 1.45929 3.1129 1.62415 2.78934C1.87981 2.28757 2.28776 1.87963 2.78952 1.62396C3.11308 1.4591 3.45755 1.39339 3.83228 1.36278C4.19307 1.3333 4.636 1.33331 5.17263 1.33331ZM4.66683 3.99998C4.29864 3.99998 4.00016 4.29846 4.00016 4.66665C4.00016 5.03484 4.29864 5.33331 4.66683 5.33331H4.6735C5.04169 5.33331 5.34016 5.03484 5.34016 4.66665C5.34016 4.29846 5.04169 3.99998 4.6735 3.99998H4.66683ZM6.66683 3.99998C6.29864 3.99998 6.00016 4.29846 6.00016 4.66665C6.00016 5.03484 6.29864 5.33331 6.66683 5.33331H6.6735C7.04169 5.33331 7.34016 5.03484 7.34016 4.66665C7.34016 4.29846 7.04169 3.99998 6.6735 3.99998H6.66683ZM8.66683 3.99998C8.29864 3.99998 8.00016 4.29846 8.00016 4.66665C8.00016 5.03484 8.29864 5.33331 8.66683 5.33331H8.6735C9.04169 5.33331 9.34016 5.03484 9.34016 4.66665C9.34016 4.29846 9.04169 3.99998 8.6735 3.99998H8.66683Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M11.3335 7.49998C11.5629 7.49998 11.7629 7.65613 11.8186 7.87871L12.0196 8.68271C12.1974 9.39402 12.2642 9.63563 12.3859 9.82588C12.5029 10.0087 12.6581 10.1639 12.8409 10.2809C13.0312 10.4026 13.2728 10.4694 13.9841 10.6472L14.7881 10.8482C15.0107 10.9039 15.1668 11.1039 15.1668 11.3333C15.1668 11.5627 15.0107 11.7627 14.7881 11.8184L13.9841 12.0194C13.2728 12.1972 13.0312 12.264 12.8409 12.3857C12.6581 12.5027 12.5029 12.658 12.3859 12.8407C12.2642 13.031 12.1974 13.2726 12.0196 13.9839L11.8186 14.7879C11.7629 15.0105 11.5629 15.1666 11.3335 15.1666C11.1041 15.1666 10.9041 15.0105 10.8484 14.7879L10.6474 13.9839C10.4696 13.2726 10.4028 13.031 10.2811 12.8407C10.1641 12.658 10.0089 12.5027 9.82606 12.3857C9.63581 12.264 9.39421 12.1972 8.68289 12.0194L7.8789 11.8184C7.65631 11.7627 7.50016 11.5627 7.50016 11.3333C7.50016 11.1039 7.65631 10.9039 7.8789 10.8482L8.68289 10.6472C9.39421 10.4694 9.63581 10.4026 9.82606 10.2809C10.0089 10.1639 10.1641 10.0087 10.2811 9.82588C10.4028 9.63563 10.4696 9.39402 10.6474 8.6827L10.8484 7.87871C10.9041 7.65613 11.1041 7.49998 11.3335 7.49998Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "PromptEngineering"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/development/PromptEngineering.tsx b/app/components/base/icons/src/vender/solid/development/PromptEngineering.tsx
new file mode 100644
index 0000000..506e9fe
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/PromptEngineering.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './PromptEngineering.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'PromptEngineering'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/development/PuzzlePiece01.json b/app/components/base/icons/src/vender/solid/development/PuzzlePiece01.json
new file mode 100644
index 0000000..f4008c8
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/PuzzlePiece01.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "17",
+			"height": "16",
+			"viewBox": "0 0 17 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "puzzle-piece-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M4.83333 2.99999C4.83333 1.71133 5.878 0.666656 7.16667 0.666656C8.45533 0.666656 9.5 1.71133 9.5 2.99999V3.33332L9.52285 3.33332C9.96938 3.33332 10.338 3.33331 10.6397 3.3539C10.9525 3.37525 11.2419 3.42093 11.5205 3.53631C12.1739 3.80696 12.693 4.32609 12.9637 4.9795C13.0791 5.25804 13.1247 5.54744 13.1461 5.8603C13.1558 6.0027 13.1609 6.15998 13.1636 6.33332H13.5C14.7887 6.33332 15.8333 7.37799 15.8333 8.66666C15.8333 9.95532 14.7887 11 13.5 11H13.1667V11.4942C13.1667 12.0308 13.1667 12.4737 13.1372 12.8345C13.1066 13.2093 13.0409 13.5537 12.876 13.8773C12.6204 14.3791 12.2124 14.787 11.7106 15.0427C11.3871 15.2075 11.0426 15.2732 10.6679 15.3039C10.3071 15.3333 9.86419 15.3333 9.32755 15.3333H8.83333C8.46514 15.3333 8.16667 15.0348 8.16667 14.6667V13.5C8.16667 13.0398 7.79357 12.6667 7.33333 12.6667C6.8731 12.6667 6.5 13.0398 6.5 13.5V14.6667C6.5 15.0348 6.20152 15.3333 5.83333 15.3333H5.00578C4.46914 15.3333 4.02624 15.3333 3.66545 15.3039C3.29072 15.2732 2.94625 15.2075 2.62269 15.0427C2.12093 14.787 1.71298 14.3791 1.45732 13.8773C1.29246 13.5537 1.22675 13.2093 1.19613 12.8345C1.16665 12.4737 1.16666 12.0308 1.16667 11.4942L1.16667 10.3333C1.16667 9.96513 1.46514 9.66666 1.83333 9.66666H2.83333C3.38562 9.66666 3.83333 9.21894 3.83333 8.66666C3.83333 8.11437 3.38562 7.66666 2.83333 7.66666H1.83333C1.46514 7.66666 1.16667 7.36818 1.16667 6.99999L1.16667 6.97715C1.16666 6.53062 1.16666 6.16204 1.18724 5.8603C1.20859 5.54744 1.25428 5.25804 1.36965 4.9795C1.64031 4.32609 2.15944 3.80696 2.81284 3.53631C3.09139 3.42093 3.38078 3.37525 3.69364 3.3539C3.99538 3.33331 4.36396 3.33332 4.81048 3.33332L4.83333 3.33332L4.83333 2.99999Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "PuzzlePiece01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/development/PuzzlePiece01.tsx b/app/components/base/icons/src/vender/solid/development/PuzzlePiece01.tsx
new file mode 100644
index 0000000..b62d37d
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/PuzzlePiece01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './PuzzlePiece01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'PuzzlePiece01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/development/Semantic.json b/app/components/base/icons/src/vender/solid/development/Semantic.json
new file mode 100644
index 0000000..333b3fa
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/Semantic.json
@@ -0,0 +1,53 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M16.5833 12.945C16.4856 13.3276 16.2038 14.272 15.7382 15.7784H17.4432C17.0038 14.3674 16.7569 13.5692 16.7025 13.3841C16.6493 13.1998 16.609 13.0532 16.5833 12.945Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M21.1667 9.33333H12C11.5138 9.33333 11.0475 9.52649 10.7036 9.87031C10.3598 10.2141 10.1667 10.6804 10.1667 11.1667V19.4167C10.1667 19.9029 10.3598 20.3692 10.7036 20.713C11.0475 21.0568 11.5138 21.25 12 21.25H17.5L21.1667 24V21.25C21.6529 21.25 22.1192 21.0568 22.463 20.713C22.8068 20.3692 23 19.9029 23 19.4167V11.1667C23 10.6804 22.8068 10.2141 22.463 9.87031C22.1192 9.52649 21.6529 9.33333 21.1667 9.33333ZM18.2507 18.5L17.775 16.9417H15.3917L14.9159 18.5H13.4208L15.7308 11.9293H17.4267L19.7458 18.5H18.2507Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M12 2H2.83333C2.3471 2 1.88079 2.19315 1.53697 2.53697C1.19315 2.88079 1 3.3471 1 3.83333V12.0833C1 12.5696 1.19315 13.0359 1.53697 13.3797C1.88079 13.7235 2.3471 13.9167 2.83333 13.9167V16.6667L6.5 13.9167H9.25V11.1667C9.25381 11.0459 9.26606 10.9255 9.28667 10.8064C8.64229 10.5527 8.0315 10.2208 7.468 9.81825C6.5802 10.4316 5.59355 10.8877 4.55117 11.1667C4.394 10.6965 4.15573 10.2575 3.84717 9.86958C4.76378 9.70375 5.64426 9.37861 6.44867 8.90892C6.07755 8.50417 5.75993 8.05346 5.50358 7.56783C5.29175 7.16889 5.12217 6.74892 4.99758 6.31475C4.56583 6.31475 4.3165 6.32942 3.94983 6.35875V5.03233C4.30266 5.0703 4.65741 5.08744 5.01225 5.08367H6.63292V4.64367C6.63379 4.48979 6.61904 4.33623 6.58892 4.18533H8.05833C8.02877 4.33229 8.01403 4.48185 8.01433 4.63175V5.07908H9.756C10.1108 5.08303 10.4656 5.06589 10.8184 5.02775V6.35875C10.4958 6.32942 10.2098 6.31475 9.778 6.31475C9.67623 6.80565 9.51074 7.28115 9.28575 7.72917C9.06864 8.16083 8.79489 8.56159 8.47175 8.92083C8.89523 9.17057 9.34617 9.37051 9.81558 9.51667C10.0695 9.17655 10.399 8.90012 10.7781 8.70922C11.1573 8.51831 11.5755 8.41816 12 8.41667H13.8333V3.83333C13.8333 3.3471 13.6402 2.88079 13.2964 2.53697C12.9525 2.19315 12.4862 2 12 2Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M7.43133 8.0885C7.87722 7.58102 8.19195 6.97201 8.348 6.31475H6.40833C6.59708 6.98164 6.94861 7.59116 7.43133 8.0885Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Semantic"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/development/Semantic.tsx b/app/components/base/icons/src/vender/solid/development/Semantic.tsx
new file mode 100644
index 0000000..df01994
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/Semantic.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Semantic.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Semantic'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/development/TerminalSquare.json b/app/components/base/icons/src/vender/solid/development/TerminalSquare.json
new file mode 100644
index 0000000..7716cfd
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/TerminalSquare.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "terminal-square"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M8.91927 1H3.08073C2.81716 0.999992 2.58977 0.999984 2.40249 1.01529C2.20481 1.03144 2.00821 1.06709 1.81902 1.16349C1.53677 1.3073 1.3073 1.53677 1.16349 1.81902C1.06709 2.00821 1.03144 2.20481 1.01529 2.40249C0.999984 2.58977 0.999992 2.81714 1 3.08071V8.91927C0.999992 9.18284 0.999984 9.41023 1.01529 9.59752C1.03144 9.79519 1.06709 9.9918 1.16349 10.181C1.3073 10.4632 1.53677 10.6927 1.81902 10.8365C2.00821 10.9329 2.20481 10.9686 2.40249 10.9847C2.58977 11 2.81715 11 3.08072 11H8.91928C9.18285 11 9.41023 11 9.59752 10.9847C9.79519 10.9686 9.9918 10.9329 10.181 10.8365C10.4632 10.6927 10.6927 10.4632 10.8365 10.181C10.9329 9.9918 10.9686 9.79519 10.9847 9.59752C11 9.41023 11 9.18285 11 8.91928V3.08072C11 2.81715 11 2.58977 10.9847 2.40249C10.9686 2.20481 10.9329 2.00821 10.8365 1.81902C10.6927 1.53677 10.4632 1.3073 10.181 1.16349C9.9918 1.06709 9.79519 1.03144 9.59752 1.01529C9.41023 0.999984 9.18284 0.999992 8.91927 1ZM3.85355 4.14645C3.65829 3.95118 3.34171 3.95118 3.14645 4.14645C2.95118 4.34171 2.95118 4.65829 3.14645 4.85355L4.29289 6L3.14645 7.14645C2.95118 7.34171 2.95118 7.65829 3.14645 7.85355C3.34171 8.04882 3.65829 8.04882 3.85355 7.85355L5.35355 6.35355C5.54882 6.15829 5.54882 5.84171 5.35355 5.64645L3.85355 4.14645ZM6.5 7C6.22386 7 6 7.22386 6 7.5C6 7.77614 6.22386 8 6.5 8H8.5C8.77614 8 9 7.77614 9 7.5C9 7.22386 8.77614 7 8.5 7H6.5Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "TerminalSquare"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/development/TerminalSquare.tsx b/app/components/base/icons/src/vender/solid/development/TerminalSquare.tsx
new file mode 100644
index 0000000..38575b9
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/TerminalSquare.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './TerminalSquare.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'TerminalSquare'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/development/Variable02.json b/app/components/base/icons/src/vender/solid/development/Variable02.json
new file mode 100644
index 0000000..f506afd
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/Variable02.json
@@ -0,0 +1,62 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "variable-02"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M13.9986 8.76189C14.6132 8.04115 15.5117 7.625 16.459 7.625H16.5486C17.1009 7.625 17.5486 8.07272 17.5486 8.625C17.5486 9.17728 17.1009 9.625 16.5486 9.625H16.459C16.0994 9.625 15.7564 9.78289 15.5205 10.0595L13.1804 12.8039L13.9213 15.4107C13.9372 15.4666 13.9859 15.5 14.0355 15.5H15.4296C15.9819 15.5 16.4296 15.9477 16.4296 16.5C16.4296 17.0523 15.9819 17.5 15.4296 17.5H14.0355C13.0858 17.5 12.2562 16.8674 11.9975 15.9575L11.621 14.6328L10.1457 16.3631C9.5311 17.0839 8.63257 17.5 7.68532 17.5H7.59564C7.04336 17.5 6.59564 17.0523 6.59564 16.5C6.59564 15.9477 7.04336 15.5 7.59564 15.5H7.68532C8.04487 15.5 8.38789 15.3421 8.62379 15.0655L10.964 12.3209L10.2231 9.71433C10.2072 9.65839 10.1586 9.625 10.1089 9.625H8.71484C8.16256 9.625 7.71484 9.17728 7.71484 8.625C7.71484 8.07272 8.16256 7.625 8.71484 7.625H10.1089C11.0586 7.625 11.8883 8.25756 12.1469 9.16754L12.5234 10.4921L13.9986 8.76189Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M5.429 3C3.61372 3 2.143 4.47071 2.143 6.286V10.4428L1.29289 11.2929C1.10536 11.4804 1 11.7348 1 12C1 12.2652 1.10536 12.5196 1.29289 12.7071L2.143 13.5572V17.714C2.143 19.5293 3.61372 21 5.429 21C5.98128 21 6.429 20.5523 6.429 20C6.429 19.4477 5.98128 19 5.429 19C4.71828 19 4.143 18.4247 4.143 17.714V13.143C4.143 12.8778 4.03764 12.6234 3.85011 12.4359L3.41421 12L3.85011 11.5641C4.03764 11.3766 4.143 11.1222 4.143 10.857V6.286C4.143 5.57528 4.71828 5 5.429 5C5.98128 5 6.429 4.55228 6.429 4C6.429 3.44772 5.98128 3 5.429 3Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M18.5708 3C18.0185 3 17.5708 3.44772 17.5708 4C17.5708 4.55228 18.0185 5 18.5708 5C19.2815 5 19.8568 5.57529 19.8568 6.286V10.857C19.8568 11.1222 19.9622 11.3766 20.1497 11.5641L20.5856 12L20.1497 12.4359C19.9622 12.6234 19.8568 12.8778 19.8568 13.143V17.714C19.8568 18.4244 19.2808 19 18.5708 19C18.0185 19 17.5708 19.4477 17.5708 20C17.5708 20.5523 18.0185 21 18.5708 21C20.3848 21 21.8568 19.5296 21.8568 17.714V13.5572L22.7069 12.7071C23.0974 12.3166 23.0974 11.6834 22.7069 11.2929L21.8568 10.4428V6.286C21.8568 4.47071 20.3861 3 18.5708 3Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Variable02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/development/Variable02.tsx b/app/components/base/icons/src/vender/solid/development/Variable02.tsx
new file mode 100644
index 0000000..8ffaeaa
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/Variable02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Variable02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Variable02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/development/index.ts b/app/components/base/icons/src/vender/solid/development/index.ts
new file mode 100644
index 0000000..159a1cb
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/development/index.ts
@@ -0,0 +1,13 @@
+export { default as ApiConnectionMod } from './ApiConnectionMod'
+export { default as ApiConnection } from './ApiConnection'
+export { default as BarChartSquare02 } from './BarChartSquare02'
+export { default as Container } from './Container'
+export { default as Database02 } from './Database02'
+export { default as Database03 } from './Database03'
+export { default as FileHeart02 } from './FileHeart02'
+export { default as PatternRecognition } from './PatternRecognition'
+export { default as PromptEngineering } from './PromptEngineering'
+export { default as PuzzlePiece01 } from './PuzzlePiece01'
+export { default as Semantic } from './Semantic'
+export { default as TerminalSquare } from './TerminalSquare'
+export { default as Variable02 } from './Variable02'
diff --git a/app/components/base/icons/src/vender/solid/editor/Brush01.json b/app/components/base/icons/src/vender/solid/editor/Brush01.json
new file mode 100644
index 0000000..049e5f2
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/editor/Brush01.json
@@ -0,0 +1,35 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M17.264 2.20765C18.5274 1.0378 20.4895 1.07552 21.707 2.29307C22.9246 3.51061 22.9623 5.47268 21.7924 6.73612L15.4019 13.638C15.008 14.0634 14.811 14.2761 14.579 14.3585C14.3751 14.4309 14.1531 14.4352 13.9465 14.3707C13.7115 14.2973 13.5065 14.0923 13.0965 13.6823L10.3178 10.9036C9.9078 10.4936 9.7028 10.2886 9.62943 10.0536C9.56493 9.84699 9.5692 9.62504 9.6416 9.42107C9.72395 9.18906 9.93667 8.9921 10.3621 8.59817L17.264 2.20765Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M8.76212 12.1763C8.35165 11.7659 8.14641 11.5606 7.9013 11.4888C7.7037 11.4308 7.43858 11.4436 7.24747 11.5203C7.01041 11.6154 6.86226 11.7953 6.56595 12.1551C6.46827 12.2737 6.37864 12.398 6.30066 12.53C6.03001 12.9883 5.8908 13.5013 5.88405 14.0163C4.608 13.9077 3.29445 14.3416 2.31799 15.318C1.28682 16.3492 1.34471 17.8002 1.38417 18.7893L1.38921 18.9154C1.43381 20.027 1.46675 20.848 1.11009 21.5439C0.951191 21.8539 0.965076 22.2242 1.14673 22.5215C1.32839 22.8187 1.65165 23 2 23C2.27235 23 2.58299 23.0081 2.91511 23.0167C3.66655 23.0362 4.52805 23.0586 5.30424 22.9968C6.44876 22.9057 7.7418 22.6221 8.68195 21.682C9.65838 20.7056 10.0923 19.3921 9.98366 18.1161C10.4987 18.1093 11.0118 17.9701 11.4701 17.6994C11.6021 17.6215 11.7264 17.5318 11.845 17.4341C12.2048 17.1378 12.3847 16.9897 12.4798 16.7526C12.5565 16.5615 12.5693 16.2964 12.5113 16.0988C12.4395 15.8537 12.2342 15.6484 11.8238 15.238L8.76212 12.1763Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Brush01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/editor/Brush01.tsx b/app/components/base/icons/src/vender/solid/editor/Brush01.tsx
new file mode 100644
index 0000000..d76c5f1
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/editor/Brush01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Brush01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Brush01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/editor/Citations.json b/app/components/base/icons/src/vender/solid/editor/Citations.json
new file mode 100644
index 0000000..79d56b1
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/editor/Citations.json
@@ -0,0 +1,36 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "citations"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Subtract",
+							"d": "M0.666992 7.99996C0.666992 3.94987 3.95024 0.666626 8.00033 0.666626C12.0504 0.666626 15.3337 3.94987 15.3337 7.99996C15.3337 12.05 12.0504 15.3333 8.00033 15.3333C3.95024 15.3333 0.666992 12.05 0.666992 7.99996ZM4.66699 7.9801V9.97196H7.35742V7.48922H5.87533C5.85644 7.21231 5.90365 6.94484 6.01693 6.68681C6.2372 6.19592 6.66829 5.84979 7.31022 5.6484V4.66663C6.44803 4.83655 5.79036 5.19527 5.33724 5.7428C4.89041 6.29032 4.66699 7.03609 4.66699 7.9801ZM10.0264 6.70569C10.2466 6.19592 10.6746 5.84349 11.3102 5.6484V4.66663C10.4732 4.83655 9.82183 5.19212 9.35612 5.73336C8.8967 6.27459 8.66699 7.02351 8.66699 7.9801V9.97196H11.3574V7.48922H9.87533C9.85015 7.23748 9.9005 6.9763 10.0264 6.70569Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Citations"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/editor/Citations.tsx b/app/components/base/icons/src/vender/solid/editor/Citations.tsx
new file mode 100644
index 0000000..439aab6
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/editor/Citations.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Citations.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Citations'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/editor/Colors.json b/app/components/base/icons/src/vender/solid/editor/Colors.json
new file mode 100644
index 0000000..6e5dc69
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/editor/Colors.json
@@ -0,0 +1,62 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "colors"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M13.4494 13.2298C12.9854 13.3409 12.5002 13.3999 12 13.3999C10.2804 13.3999 8.72326 12.6997 7.59953 11.5677C6.4872 10.4471 5.8 8.90382 5.8 7.20007C5.8 3.77586 8.57584 1 12 1C15.4241 1 18.2 3.77586 18.2 7.20007C18.2 8.44569 17.8327 9.60551 17.2005 10.5771C16.3665 11.8588 15.0715 12.8131 13.5506 13.2047C13.517 13.2133 13.4833 13.2217 13.4494 13.2298Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M15.1476 14.7743C16.6646 14.1431 17.9513 13.0695 18.8465 11.7146C19.0004 11.4817 19.0773 11.3652 19.1762 11.3066C19.2615 11.2561 19.3659 11.2312 19.4648 11.2379C19.5795 11.2457 19.6773 11.3015 19.8728 11.4133C21.7413 12.4817 23 14.4946 23 16.7999C23 20.2241 20.2242 23 16.8 23C15.9123 23 15.0689 22.8139 14.3059 22.4782C14.0549 22.3678 13.9294 22.3126 13.8502 22.2049C13.7822 22.1126 13.7468 21.9922 13.7539 21.8777C13.7622 21.7444 13.8565 21.6018 14.045 21.3167C14.8373 20.1184 15.3234 18.6997 15.3917 17.1723C15.3969 17.0566 15.3996 16.9402 15.4 16.8233L15.4 16.7999C15.4 16.1888 15.333 15.5926 15.2057 15.0185C15.1876 14.9366 15.1682 14.8552 15.1476 14.7743Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M4.12723 11.4133C4.32273 11.3015 4.42049 11.2457 4.53516 11.2379C4.63414 11.2312 4.73848 11.2561 4.82382 11.3066C4.92269 11.3652 4.99964 11.4817 5.15355 11.7146C6.62074 13.9352 9.13929 15.4001 12 15.4001C12.4146 15.4001 12.822 15.3694 13.2201 15.31L13.2263 15.3357C13.3398 15.8045 13.4 16.2947 13.4 16.7999L13.4 16.8214C13.3997 16.9056 13.3977 16.9895 13.3941 17.0728C13.2513 20.3704 10.5327 23 7.2 23C3.77584 23 1 20.2241 1 16.7999C1 14.4946 2.25869 12.4817 4.12723 11.4133Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Colors"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/editor/Colors.tsx b/app/components/base/icons/src/vender/solid/editor/Colors.tsx
new file mode 100644
index 0000000..bdfe6d1
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/editor/Colors.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Colors.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Colors'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/editor/Paragraph.json b/app/components/base/icons/src/vender/solid/editor/Paragraph.json
new file mode 100644
index 0000000..a16f076
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/editor/Paragraph.json
@@ -0,0 +1,44 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M2 6.5C2 5.67157 2.67157 5 3.5 5H20.5C21.3284 5 22 5.67157 22 6.5C22 7.32843 21.3284 8 20.5 8H3.5C2.67157 8 2 7.32843 2 6.5Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M2 12.5C2 11.6716 2.67157 11 3.5 11H20.5C21.3284 11 22 11.6716 22 12.5C22 13.3284 21.3284 14 20.5 14H3.5C2.67157 14 2 13.3284 2 12.5Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M2 18.5C2 17.6716 2.67157 17 3.5 17H12.5C13.3284 17 14 17.6716 14 18.5C14 19.3284 13.3284 20 12.5 20H3.5C2.67157 20 2 19.3284 2 18.5Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Paragraph"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/editor/Paragraph.tsx b/app/components/base/icons/src/vender/solid/editor/Paragraph.tsx
new file mode 100644
index 0000000..548b383
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/editor/Paragraph.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Paragraph.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Paragraph'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/editor/TypeSquare.json b/app/components/base/icons/src/vender/solid/editor/TypeSquare.json
new file mode 100644
index 0000000..f901b07
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/editor/TypeSquare.json
@@ -0,0 +1,28 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M7.7587 2H16.2413C17.0463 1.99999 17.7106 1.99998 18.2518 2.0442C18.8139 2.09012 19.3306 2.18868 19.816 2.43598C20.5686 2.81947 21.1805 3.43139 21.564 4.18404C21.8113 4.66938 21.9099 5.18608 21.9558 5.74818C22 6.28937 22 6.95372 22 7.75868V16.2413C22 17.0463 22 17.7106 21.9558 18.2518C21.9099 18.8139 21.8113 19.3306 21.564 19.816C21.1805 20.5686 20.5686 21.1805 19.816 21.564C19.3306 21.8113 18.8139 21.9099 18.2518 21.9558C17.7106 22 17.0463 22 16.2413 22H7.75868C6.95372 22 6.28937 22 5.74818 21.9558C5.18608 21.9099 4.66938 21.8113 4.18404 21.564C3.43139 21.1805 2.81947 20.5686 2.43598 19.816C2.18868 19.3306 2.09012 18.8139 2.0442 18.2518C1.99998 17.7106 1.99999 17.0463 2 16.2413V7.75869C1.99999 6.95373 1.99998 6.28936 2.0442 5.74818C2.09012 5.18608 2.18868 4.66938 2.43598 4.18404C2.81947 3.43139 3.43139 2.81947 4.18404 2.43598C4.66938 2.18868 5.18608 2.09012 5.74818 2.0442C6.28936 1.99998 6.95375 1.99999 7.7587 2ZM7 7C7 6.44772 7.44772 6 8 6H16C16.5523 6 17 6.44772 17 7C17 7.55229 16.5523 8 16 8H13V17C13 17.5523 12.5523 18 12 18C11.4477 18 11 17.5523 11 17V8H8C7.44772 8 7 7.55229 7 7Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "TypeSquare"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/editor/TypeSquare.tsx b/app/components/base/icons/src/vender/solid/editor/TypeSquare.tsx
new file mode 100644
index 0000000..5149e12
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/editor/TypeSquare.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './TypeSquare.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'TypeSquare'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/editor/index.ts b/app/components/base/icons/src/vender/solid/editor/index.ts
new file mode 100644
index 0000000..6b1a0a1
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/editor/index.ts
@@ -0,0 +1,5 @@
+export { default as Brush01 } from './Brush01'
+export { default as Citations } from './Citations'
+export { default as Colors } from './Colors'
+export { default as Paragraph } from './Paragraph'
+export { default as TypeSquare } from './TypeSquare'
diff --git a/app/components/base/icons/src/vender/solid/education/Beaker02.json b/app/components/base/icons/src/vender/solid/education/Beaker02.json
new file mode 100644
index 0000000..2f78300
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/education/Beaker02.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "beaker-02"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M4.13856 0.500003H7.8617C7.92126 0.49998 7.99238 0.499953 8.05504 0.505073C8.12765 0.511005 8.23165 0.526227 8.34062 0.581751C8.48174 0.653656 8.59648 0.768392 8.66838 0.909513C8.72391 1.01849 8.73913 1.12248 8.74506 1.19509C8.75018 1.25775 8.75015 1.32888 8.75013 1.38844V2.61157C8.75015 2.67113 8.75018 2.74226 8.74506 2.80492C8.73913 2.87753 8.72391 2.98153 8.66838 3.0905C8.59648 3.23162 8.48174 3.34636 8.34062 3.41826C8.23165 3.47379 8.12765 3.48901 8.05504 3.49494C8.03725 3.49639 8.01877 3.49743 8.00006 3.49817V5.2506C8.00006 5.55312 8.00408 5.61265 8.01723 5.66153C8.03245 5.71807 8.05747 5.7715 8.09117 5.81939C8.1203 5.86078 8.16346 5.90197 8.39586 6.09564L10.2807 7.66627C10.4566 7.81255 10.6116 7.94145 10.7267 8.10509C10.8278 8.24875 10.9029 8.40904 10.9486 8.57867C11.0005 8.7719 11.0003 8.97351 11.0001 9.2023C11.0001 9.39886 11.0002 9.59542 11.0002 9.79198C11.0003 9.98232 11.0005 10.1463 10.9713 10.2927C10.853 10.8877 10.3878 11.3529 9.7928 11.4712C9.64637 11.5003 9.48246 11.5002 9.29211 11.5001H2.70822C2.51787 11.5002 2.35396 11.5003 2.20753 11.4712C1.98473 11.4269 1.78014 11.334 1.60515 11.2038C1.42854 11.0725 1.28221 10.9034 1.17753 10.7077C1.10892 10.5796 1.05831 10.4401 1.02899 10.2927C0.999862 10.1463 0.999992 9.98233 1.00014 9.79199C1.00014 9.59542 1.00006 9.39886 1.00003 9.20229C0.999794 8.97351 0.999584 8.7719 1.05157 8.57867C1.09721 8.40904 1.17229 8.24875 1.27338 8.10509C1.38855 7.94145 1.54356 7.81255 1.71947 7.66627L3.60427 6.09564C3.83667 5.90197 3.87983 5.86078 3.90896 5.81939C3.94266 5.7715 3.96768 5.71807 3.9829 5.66153C3.99605 5.61265 4.00006 5.55312 4.00006 5.2506V3.49817C3.9814 3.49743 3.96297 3.49639 3.94521 3.49494C3.8726 3.48901 3.76861 3.47379 3.65964 3.41826C3.51851 3.34636 3.40378 3.23162 3.33187 3.0905C3.27635 2.98153 3.26113 2.87753 3.25519 2.80492C3.25008 2.74226 3.2501 2.67113 3.25013 2.61158V1.38844C3.2501 1.32888 3.25008 1.25775 3.25519 1.19509C3.26113 1.12248 3.27635 1.01849 3.33187 0.909513C3.40378 0.768392 3.51851 0.653656 3.65964 0.581751C3.76861 0.526227 3.8726 0.511005 3.94521 0.505073C4.00787 0.499953 4.079 0.49998 4.13856 0.500003ZM9.11909 8.00004H2.88104L4.28066 6.83373C4.45657 6.68745 4.61158 6.55855 4.72675 6.39491C4.82784 6.25125 4.90292 6.09096 4.94856 5.92133C5.00054 5.7281 5.00033 5.52649 5.0001 5.29771L5.00006 3.50001H7.00006L7.00003 5.29771C6.99979 5.52649 6.99958 5.7281 7.05157 5.92133C7.09721 6.09096 7.17229 6.25125 7.27338 6.39491C7.38855 6.55855 7.54356 6.68745 7.71947 6.83373L9.11909 8.00004Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Beaker02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/education/Beaker02.tsx b/app/components/base/icons/src/vender/solid/education/Beaker02.tsx
new file mode 100644
index 0000000..6fd1a62
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/education/Beaker02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Beaker02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Beaker02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/education/BubbleText.json b/app/components/base/icons/src/vender/solid/education/BubbleText.json
new file mode 100644
index 0000000..999f0db
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/education/BubbleText.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "bubble-text"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "vector",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M2 9C2 5.68629 4.68629 3 8 3H16C19.3137 3 22 5.68629 22 9V15C22 18.3137 19.3137 21 16 21H3C2.44772 21 2 20.5523 2 20V9ZM9 9C8.44772 9 8 9.44772 8 10C8 10.5523 8.44772 11 9 11H15C15.5523 11 16 10.5523 16 10C16 9.44772 15.5523 9 15 9H9ZM9 13C8.44772 13 8 13.4477 8 14C8 14.5523 8.44772 15 9 15H12C12.5523 15 13 14.5523 13 14C13 13.4477 12.5523 13 12 13H9Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "BubbleText"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/education/BubbleText.tsx b/app/components/base/icons/src/vender/solid/education/BubbleText.tsx
new file mode 100644
index 0000000..9be36ec
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/education/BubbleText.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './BubbleText.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'BubbleText'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/education/Heart02.json b/app/components/base/icons/src/vender/solid/education/Heart02.json
new file mode 100644
index 0000000..8cecaae
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/education/Heart02.json
@@ -0,0 +1,26 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M12.5836 3.8721C12.3615 3.99329 12.1665 4.11496 12 4.22818C11.8335 4.11496 11.6385 3.99329 11.4164 3.8721C10.6185 3.4369 9.45449 3 8 3C6.48169 3 4.96498 3.60857 3.83296 4.81606C2.69616 6.02865 2 7.78592 2 10C2 13.3448 4.37277 16.1023 6.58187 17.9272C7.71336 18.8619 8.86688 19.6065 9.7917 20.1203C10.2539 20.377 10.6687 20.5816 11.004 20.7253C11.1707 20.7967 11.3289 20.858 11.4705 20.9033C11.5784 20.9378 11.7841 21 12 21C12.2159 21 12.4216 20.9378 12.5295 20.9033C12.6711 20.858 12.8293 20.7967 12.996 20.7253C13.3313 20.5816 13.7461 20.377 14.2083 20.1203C15.1331 19.6065 16.2866 18.8619 17.4181 17.9272C19.6272 16.1023 22 13.3448 22 10C22 7.78592 21.3038 6.02865 20.167 4.81606C19.035 3.60857 17.5183 3 16 3C14.5455 3 13.3815 3.4369 12.5836 3.8721Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Heart02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/education/Heart02.tsx b/app/components/base/icons/src/vender/solid/education/Heart02.tsx
new file mode 100644
index 0000000..ffe3a07
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/education/Heart02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Heart02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Heart02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/education/Unblur.json b/app/components/base/icons/src/vender/solid/education/Unblur.json
new file mode 100644
index 0000000..13b8bb3
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/education/Unblur.json
@@ -0,0 +1,152 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "unblur"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M9.5 6.25C9.5 6.80228 9.05228 7.25 8.5 7.25C7.94772 7.25 7.5 6.80228 7.5 6.25C7.5 5.69772 7.94772 5.25 8.5 5.25C9.05228 5.25 9.5 5.69772 9.5 6.25Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M6 6.25C6 6.80228 5.55228 7.25 5 7.25C4.44772 7.25 4 6.80228 4 6.25C4 5.69772 4.44772 5.25 5 5.25C5.55228 5.25 6 5.69772 6 6.25Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M9.5 17.75C9.5 18.3023 9.05228 18.75 8.5 18.75C7.94772 18.75 7.5 18.3023 7.5 17.75C7.5 17.1977 7.94772 16.75 8.5 16.75C9.05228 16.75 9.5 17.1977 9.5 17.75Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M9.25 3.25C9.25 3.66421 8.91421 4 8.5 4C8.08579 4 7.75 3.66421 7.75 3.25C7.75 2.83579 8.08579 2.5 8.5 2.5C8.91421 2.5 9.25 2.83579 9.25 3.25Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M3 10C3 10.4142 2.66421 10.75 2.25 10.75C1.83579 10.75 1.5 10.4142 1.5 10C1.5 9.58579 1.83579 9.25 2.25 9.25C2.66421 9.25 3 9.58579 3 10Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M3 14C3 14.4142 2.66421 14.75 2.25 14.75C1.83579 14.75 1.5 14.4142 1.5 14C1.5 13.5858 1.83579 13.25 2.25 13.25C2.66421 13.25 3 13.5858 3 14Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M9.25 20.75C9.25 21.1642 8.91421 21.5 8.5 21.5C8.08579 21.5 7.75 21.1642 7.75 20.75C7.75 20.3358 8.08579 20 8.5 20C8.91421 20 9.25 20.3358 9.25 20.75Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M10 10C10 10.8284 9.32843 11.5 8.5 11.5C7.67157 11.5 7 10.8284 7 10C7 9.17157 7.67157 8.5 8.5 8.5C9.32843 8.5 10 9.17157 10 10Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M10 14C10 14.8284 9.32843 15.5 8.5 15.5C7.67157 15.5 7 14.8284 7 14C7 13.1716 7.67157 12.5 8.5 12.5C9.32843 12.5 10 13.1716 10 14Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M6 10C6 10.5523 5.55228 11 5 11C4.44772 11 4 10.5523 4 10C4 9.44772 4.44772 9 5 9C5.55228 9 6 9.44772 6 10Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M6 14C6 14.5523 5.55228 15 5 15C4.44772 15 4 14.5523 4 14C4 13.4477 4.44772 13 5 13C5.55228 13 6 13.4477 6 14Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M6 17.75C6 18.3023 5.55228 18.75 5 18.75C4.44772 18.75 4 18.3023 4 17.75C4 17.1977 4.44772 16.75 5 16.75C5.55228 16.75 6 17.1977 6 17.75Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M12 2C11.4477 2 11 2.44772 11 3V21C11 21.5523 11.4477 22 12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Unblur"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/education/Unblur.tsx b/app/components/base/icons/src/vender/solid/education/Unblur.tsx
new file mode 100644
index 0000000..b994171
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/education/Unblur.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Unblur.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Unblur'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/education/index.ts b/app/components/base/icons/src/vender/solid/education/index.ts
new file mode 100644
index 0000000..2c8a3b6
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/education/index.ts
@@ -0,0 +1,4 @@
+export { default as Beaker02 } from './Beaker02'
+export { default as BubbleText } from './BubbleText'
+export { default as Heart02 } from './Heart02'
+export { default as Unblur } from './Unblur'
diff --git a/app/components/base/icons/src/vender/solid/files/File05.json b/app/components/base/icons/src/vender/solid/files/File05.json
new file mode 100644
index 0000000..17b9629
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/files/File05.json
@@ -0,0 +1,55 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "file-05"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M8.66667 1.34356C8.66667 1.32602 8.66667 1.31725 8.66591 1.30135C8.65018 0.972168 8.3607 0.682824 8.03151 0.667251C8.01562 0.666499 8.0104 0.666501 8.00001 0.666504H5.8391C5.30248 0.666497 4.85957 0.666491 4.49878 0.695968C4.12405 0.726585 3.77958 0.792295 3.45603 0.957155C2.95426 1.21282 2.54631 1.62077 2.29065 2.12253C2.12579 2.44609 2.06008 2.79056 2.02946 3.16529C1.99999 3.52608 1.99999 3.96899 2 4.50562V11.494C1.99999 12.0307 1.99999 12.4736 2.02946 12.8344C2.06008 13.2091 2.12579 13.5536 2.29065 13.8771C2.54631 14.3789 2.95426 14.7869 3.45603 15.0425C3.77958 15.2074 4.12405 15.2731 4.49878 15.3037C4.85958 15.3332 5.30248 15.3332 5.83912 15.3332H10.1609C10.6975 15.3332 11.1404 15.3332 11.5012 15.3037C11.8759 15.2731 12.2204 15.2074 12.544 15.0425C13.0457 14.7869 13.4537 14.3789 13.7093 13.8771C13.8742 13.5536 13.9399 13.2091 13.9705 12.8344C14 12.4736 14 12.0307 14 11.4941V6.66646C14 6.65611 14 6.65093 13.9993 6.63505C13.9837 6.30583 13.6943 6.01631 13.3651 6.0006C13.3492 5.99985 13.3405 5.99985 13.323 5.99985L10.3787 5.99985C10.2105 5.99987 10.0466 5.99989 9.90785 5.98855C9.75545 5.9761 9.57563 5.94672 9.39468 5.85452C9.1438 5.72669 8.93983 5.52272 8.81199 5.27183C8.7198 5.09088 8.69042 4.91106 8.67797 4.75867C8.66663 4.61989 8.66665 4.45603 8.66667 4.28778L8.66667 1.34356ZM5.33333 8.6665C4.96514 8.6665 4.66667 8.96498 4.66667 9.33317C4.66667 9.70136 4.96514 9.99984 5.33333 9.99984H10.6667C11.0349 9.99984 11.3333 9.70136 11.3333 9.33317C11.3333 8.96498 11.0349 8.6665 10.6667 8.6665H5.33333ZM5.33333 11.3332C4.96514 11.3332 4.66667 11.6316 4.66667 11.9998C4.66667 12.368 4.96514 12.6665 5.33333 12.6665H9.33333C9.70152 12.6665 10 12.368 10 11.9998C10 11.6316 9.70152 11.3332 9.33333 11.3332H5.33333Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M12.6053 4.6665C12.8011 4.6665 12.8989 4.6665 12.9791 4.61735C13.0923 4.54794 13.16 4.3844 13.129 4.25526C13.107 4.16382 13.0432 4.10006 12.9155 3.97253L10.694 1.75098C10.5664 1.62333 10.5027 1.5595 10.4112 1.53752C10.2821 1.50648 10.1186 1.57417 10.0492 1.6874C10 1.76757 10 1.86545 10 2.0612L10 4.13315C10 4.31982 10 4.41316 10.0363 4.48446C10.0683 4.54718 10.1193 4.59818 10.182 4.63014C10.2533 4.66647 10.3466 4.66647 10.5333 4.66647L12.6053 4.6665Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "File05"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/files/File05.tsx b/app/components/base/icons/src/vender/solid/files/File05.tsx
new file mode 100644
index 0000000..eda65c0
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/files/File05.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './File05.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'File05'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/files/FileSearch02.json b/app/components/base/icons/src/vender/solid/files/FileSearch02.json
new file mode 100644
index 0000000..7f8b0e8
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/files/FileSearch02.json
@@ -0,0 +1,57 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "file-search-02"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M10.1609 0.666748H5.83913C5.3025 0.66674 4.85958 0.666734 4.49878 0.696212C4.12405 0.726828 3.77958 0.792538 3.45603 0.957399C2.95426 1.21306 2.54631 1.62101 2.29065 2.12277C2.12579 2.44633 2.06008 2.7908 2.02946 3.16553C1.99999 3.52632 1.99999 3.96924 2 4.50587V11.4943C1.99999 12.0309 1.99999 12.4738 2.02946 12.8346C2.06008 13.2094 2.12579 13.5538 2.29065 13.8774C2.54631 14.3792 2.95426 14.7871 3.45603 15.0428C3.77958 15.2076 4.12405 15.2733 4.49878 15.304C4.85958 15.3334 5.30248 15.3334 5.83912 15.3334H7.75554C8.22798 15.3334 8.4642 15.3334 8.55219 15.2689C8.64172 15.2033 8.67645 15.1421 8.68693 15.0316C8.69724 14.9229 8.55693 14.6879 8.27632 14.2177C7.88913 13.5689 7.66667 12.8105 7.66667 12.0001C7.66667 9.60685 9.60677 7.66675 12 7.66675C12.4106 7.66675 12.8078 7.72385 13.1842 7.83055C13.5061 7.92177 13.667 7.96739 13.7581 7.94138C13.847 7.91602 13.9015 7.87486 13.9501 7.79623C14 7.71563 14 7.56892 14 7.27549V4.50587C14 3.96923 14 3.52633 13.9705 3.16553C13.9399 2.7908 13.8742 2.44633 13.7093 2.12277C13.4537 1.62101 13.0457 1.21306 12.544 0.957399C12.2204 0.792538 11.8759 0.726828 11.5012 0.696212C11.1404 0.666734 10.6975 0.66674 10.1609 0.666748ZM4.66667 3.33342C4.29848 3.33342 4 3.63189 4 4.00008C4 4.36827 4.29848 4.66675 4.66667 4.66675H10.6667C11.0349 4.66675 11.3333 4.36827 11.3333 4.00008C11.3333 3.63189 11.0349 3.33342 10.6667 3.33342H4.66667ZM4 6.66675C4 6.29856 4.29848 6.00008 4.66667 6.00008H8.66667C9.03486 6.00008 9.33333 6.29856 9.33333 6.66675C9.33333 7.03494 9.03486 7.33342 8.66667 7.33342H4.66667C4.29848 7.33342 4 7.03494 4 6.66675ZM4 9.33342C4 8.96523 4.29848 8.66675 4.66667 8.66675H6C6.36819 8.66675 6.66667 8.96523 6.66667 9.33342C6.66667 9.7016 6.36819 10.0001 6 10.0001H4.66667C4.29848 10.0001 4 9.7016 4 9.33342Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M9 12.0001C9 10.3432 10.3431 9.00008 12 9.00008C13.6569 9.00008 15 10.3432 15 12.0001C15 12.5871 14.8314 13.1348 14.54 13.5972L15.1381 14.1953C15.3984 14.4557 15.3984 14.8778 15.1381 15.1382C14.8777 15.3985 14.4556 15.3985 14.1953 15.1382L13.5972 14.54C13.1347 14.8315 12.587 15.0001 12 15.0001C10.3431 15.0001 9 13.6569 9 12.0001ZM12 10.3334C11.0795 10.3334 10.3333 11.0796 10.3333 12.0001C10.3333 12.9206 11.0795 13.6667 12 13.6667C12.9205 13.6667 13.6667 12.9206 13.6667 12.0001C13.6667 11.0796 12.9205 10.3334 12 10.3334Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "FileSearch02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/files/FileSearch02.tsx b/app/components/base/icons/src/vender/solid/files/FileSearch02.tsx
new file mode 100644
index 0000000..154ad45
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/files/FileSearch02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './FileSearch02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'FileSearch02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/files/FileZip.json b/app/components/base/icons/src/vender/solid/files/FileZip.json
new file mode 100644
index 0000000..11fe823
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/files/FileZip.json
@@ -0,0 +1,47 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M3.99999 1.33325H7.99999V5.33325C7.99999 6.06963 8.59692 6.66659 9.33332 6.66659H13.3333V13.3333C13.3333 14.0697 12.7364 14.6666 12 14.6666H6.66666V13.3333H7.99999V11.9999H6.66666V10.6666H7.99999V9.33325H6.66666V7.99992H5.33332V9.33325H6.66666V10.6666H5.33332V11.9999H6.66666V13.3333H5.33332V14.6666H3.99999C3.26361 14.6666 2.66666 14.0697 2.66666 13.3333V2.66659C2.66666 1.93021 3.26361 1.33325 3.99999 1.33325Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"opacity": "0.5",
+							"d": "M12.9428 4.99993C13.0415 5.09868 13.1232 5.21133 13.1859 5.33327H9.33334V1.48071C9.45528 1.54338 9.56794 1.62504 9.66668 1.72379L12.9428 4.99993Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "FileZip"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/files/FileZip.tsx b/app/components/base/icons/src/vender/solid/files/FileZip.tsx
new file mode 100644
index 0000000..fc22a3a
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/files/FileZip.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './FileZip.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'FileZip'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/files/Folder.json b/app/components/base/icons/src/vender/solid/files/Folder.json
new file mode 100644
index 0000000..4fc5e5f
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/files/Folder.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M0.666993 4.10794C0.666981 3.75652 0.666972 3.45333 0.687374 3.20362C0.708908 2.94006 0.756452 2.67791 0.884981 2.42566C1.07673 2.04933 1.38269 1.74337 1.75901 1.55163C2.01127 1.4231 2.27341 1.37555 2.53698 1.35402C2.78669 1.33362 3.08986 1.33363 3.4413 1.33364L6.0981 1.33357C6.4938 1.33304 6.84179 1.33258 7.16176 1.44295C7.44201 1.53961 7.69726 1.69737 7.90905 1.9048C8.15086 2.14164 8.30607 2.45309 8.48257 2.80725L9.07895 4.00016H11.4945C12.0312 4.00015 12.4741 4.00015 12.8349 4.02963C13.2096 4.06024 13.5541 4.12595 13.8776 4.29081C14.3794 4.54648 14.7873 4.95442 15.043 5.45619C15.2079 5.77975 15.2736 6.12421 15.3042 6.49895C15.3337 6.85974 15.3337 7.30264 15.3337 7.83928V10.8277C15.3337 11.3644 15.3337 11.8073 15.3042 12.168C15.2736 12.5428 15.2079 12.8872 15.043 13.2108C14.7873 13.7126 14.3794 14.1205 13.8776 14.3762C13.5541 14.541 13.2096 14.6068 12.8349 14.6374C12.4741 14.6668 12.0312 14.6668 11.4945 14.6668H4.50614C3.9695 14.6668 3.52657 14.6668 3.16578 14.6374C2.79104 14.6068 2.44658 14.541 2.12302 14.3762C1.62125 14.1205 1.2133 13.7126 0.957643 13.2108C0.792782 12.8872 0.727073 12.5428 0.696456 12.168C0.666978 11.8073 0.666985 11.3643 0.666993 10.8277V4.10794ZM6.01519 2.66697C6.54213 2.66697 6.64658 2.67567 6.727 2.70341C6.82041 2.73563 6.9055 2.78822 6.97609 2.85736C7.03687 2.91688 7.09136 3.00642 7.32701 3.47773L7.58823 4.00016L2.00038 4.00016C2.00067 3.69017 2.00271 3.47827 2.01628 3.3122C2.03108 3.13109 2.05619 3.06394 2.07299 3.03098C2.13691 2.90554 2.23889 2.80355 2.36433 2.73964C2.3973 2.72284 2.46444 2.69772 2.64555 2.68292C2.83444 2.66749 3.08263 2.66697 3.46699 2.66697H6.01519Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Folder"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/files/Folder.tsx b/app/components/base/icons/src/vender/solid/files/Folder.tsx
new file mode 100644
index 0000000..e7a3fdf
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/files/Folder.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Folder.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Folder'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/files/index.ts b/app/components/base/icons/src/vender/solid/files/index.ts
new file mode 100644
index 0000000..fa93cd6
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/files/index.ts
@@ -0,0 +1,4 @@
+export { default as File05 } from './File05'
+export { default as FileSearch02 } from './FileSearch02'
+export { default as FileZip } from './FileZip'
+export { default as Folder } from './Folder'
diff --git a/app/components/base/icons/src/vender/solid/general/AnswerTriangle.json b/app/components/base/icons/src/vender/solid/general/AnswerTriangle.json
new file mode 100644
index 0000000..a4b6283
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/AnswerTriangle.json
@@ -0,0 +1,27 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "8",
+			"height": "12",
+			"viewBox": "0 0 8 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"id": "Rectangle 1",
+					"d": "M1.03647 1.5547C0.59343 0.890144 1.06982 0 1.86852 0H8V12L1.03647 1.5547Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "AnswerTriangle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/AnswerTriangle.tsx b/app/components/base/icons/src/vender/solid/general/AnswerTriangle.tsx
new file mode 100644
index 0000000..956c328
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/AnswerTriangle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AnswerTriangle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AnswerTriangle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/ArrowDownRoundFill.json b/app/components/base/icons/src/vender/solid/general/ArrowDownRoundFill.json
new file mode 100644
index 0000000..4e7da3c
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/ArrowDownRoundFill.json
@@ -0,0 +1,36 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "arrow-down-round-fill"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M6.02913 6.23572C5.08582 6.23572 4.56482 7.33027 5.15967 8.06239L7.13093 10.4885C7.57922 11.0403 8.42149 11.0403 8.86986 10.4885L10.8411 8.06239C11.4359 7.33027 10.9149 6.23572 9.97158 6.23572H6.02913Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ArrowDownRoundFill"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/ArrowDownRoundFill.tsx b/app/components/base/icons/src/vender/solid/general/ArrowDownRoundFill.tsx
new file mode 100644
index 0000000..c766a72
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/ArrowDownRoundFill.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ArrowDownRoundFill.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ArrowDownRoundFill'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/CheckCircle.json b/app/components/base/icons/src/vender/solid/general/CheckCircle.json
new file mode 100644
index 0000000..1b567e8
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/CheckCircle.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "check-circle"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M8 0.666626C3.94992 0.666626 0.666672 3.94987 0.666672 7.99996C0.666672 12.05 3.94992 15.3333 8 15.3333C12.0501 15.3333 15.3333 12.05 15.3333 7.99996C15.3333 3.94987 12.0501 0.666626 8 0.666626ZM11.4714 6.47136C11.7318 6.21101 11.7318 5.7889 11.4714 5.52855C11.2111 5.26821 10.7889 5.26821 10.5286 5.52855L7 9.05715L5.47141 7.52855C5.21106 7.2682 4.78895 7.2682 4.5286 7.52855C4.26825 7.7889 4.26825 8.21101 4.5286 8.47136L6.5286 10.4714C6.78895 10.7317 7.21106 10.7317 7.47141 10.4714L11.4714 6.47136Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "CheckCircle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/CheckCircle.tsx b/app/components/base/icons/src/vender/solid/general/CheckCircle.tsx
new file mode 100644
index 0000000..2b34cd6
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/CheckCircle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './CheckCircle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'CheckCircle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/CheckDone01.json b/app/components/base/icons/src/vender/solid/general/CheckDone01.json
new file mode 100644
index 0000000..b4d5530
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/CheckDone01.json
@@ -0,0 +1,37 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M12.8385 7H5.16146C4.63433 6.99998 4.17954 6.99997 3.80497 7.03057C3.40963 7.06287 3.01641 7.13419 2.63803 7.32698C2.07354 7.6146 1.6146 8.07354 1.32698 8.63803C1.13419 9.01641 1.06287 9.40963 1.03057 9.80497C0.999969 10.1795 0.999984 10.6343 1 11.1614V18.8385C0.999984 19.3657 0.999969 19.8205 1.03057 20.195C1.06287 20.5904 1.13419 20.9836 1.32698 21.362C1.6146 21.9265 2.07354 22.3854 2.63803 22.673C3.01641 22.8658 3.40963 22.9371 3.80497 22.9694C4.17952 23 4.63425 23 5.16136 23H12.8385C13.3656 23 13.8205 23 14.195 22.9694C14.5904 22.9371 14.9836 22.8658 15.362 22.673C15.9265 22.3854 16.3854 21.9265 16.673 21.362C16.8658 20.9836 16.9371 20.5904 16.9694 20.195C17 19.8205 17 19.3657 17 18.8385V11.1615C17 10.6343 17 10.1796 16.9694 9.80497C16.9371 9.40963 16.8658 9.01641 16.673 8.63803C16.3854 8.07354 15.9265 7.6146 15.362 7.32698C14.9836 7.13419 14.5904 7.06287 14.195 7.03057C13.8205 6.99997 13.3657 6.99998 12.8385 7ZM13.2071 13.2071C13.5976 12.8166 13.5976 12.1834 13.2071 11.7929C12.8166 11.4024 12.1834 11.4024 11.7929 11.7929L8 15.5858L6.70711 14.2929C6.31658 13.9024 5.68342 13.9024 5.29289 14.2929C4.90237 14.6834 4.90237 15.3166 5.29289 15.7071L7.29289 17.7071C7.68342 18.0976 8.31658 18.0976 8.70711 17.7071L13.2071 13.2071Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M18.8385 1H11.1615C10.6343 0.999984 10.1795 0.999969 9.80497 1.03057C9.40963 1.06287 9.01641 1.13419 8.63803 1.32698C8.07354 1.6146 7.6146 2.07354 7.32698 2.63803C7.13419 3.01641 7.06287 3.40963 7.03057 3.80497C7.00314 4.14076 7.00031 4.54098 7.00003 5.00003L12.8809 5.00001C13.3695 4.9999 13.8993 4.99977 14.3579 5.03724C14.8769 5.07964 15.5626 5.1846 16.2699 5.54499C17.2108 6.02436 17.9757 6.78926 18.455 7.73007C18.8154 8.43739 18.9204 9.12311 18.9628 9.64213C19.0003 10.1007 19.0001 10.6305 19 11.1192L19 17C19.459 16.9997 19.8593 16.9969 20.195 16.9694C20.5904 16.9371 20.9836 16.8658 21.362 16.673C21.9265 16.3854 22.3854 15.9265 22.673 15.362C22.8658 14.9836 22.9371 14.5904 22.9694 14.195C23 13.8205 23 13.3658 23 12.8386V5.16148C23 4.63437 23 4.17952 22.9694 3.80497C22.9371 3.40963 22.8658 3.01641 22.673 2.63803C22.3854 2.07354 21.9265 1.6146 21.362 1.32698C20.9836 1.13419 20.5904 1.06287 20.195 1.03057C19.8205 0.999969 19.3657 0.999984 18.8385 1Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "CheckDone01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/CheckDone01.tsx b/app/components/base/icons/src/vender/solid/general/CheckDone01.tsx
new file mode 100644
index 0000000..c7e7d80
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/CheckDone01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './CheckDone01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'CheckDone01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/Download02.json b/app/components/base/icons/src/vender/solid/general/Download02.json
new file mode 100644
index 0000000..5854e64
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/Download02.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M21 21H3M18 11L12 17M12 17L6 11M12 17V3",
+					"stroke": "currentColor",
+					"stroke-width": "2",
+					"stroke-linecap": "round",
+					"stroke-linejoin": "round"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Download02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/Download02.tsx b/app/components/base/icons/src/vender/solid/general/Download02.tsx
new file mode 100644
index 0000000..aee2993
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/Download02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Download02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Download02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/Edit03.json b/app/components/base/icons/src/vender/solid/general/Edit03.json
new file mode 100644
index 0000000..f736ef5
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/Edit03.json
@@ -0,0 +1,57 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "edit-03"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M5.50004 10.0001C5.50004 9.72398 5.7239 9.50012 6.00004 9.50012H10.5C10.7762 9.50012 11 9.72398 11 10.0001C11 10.2763 10.7762 10.5001 10.5 10.5001H6.00004C5.7239 10.5001 5.50004 10.2763 5.50004 10.0001Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M7.89651 1.39656C8.50599 0.787085 9.49414 0.787084 10.1036 1.39656C10.7131 2.00604 10.7131 2.99419 10.1036 3.60367L3.82225 9.88504C3.81235 9.89494 3.80254 9.90476 3.79281 9.91451C3.64909 10.0585 3.52237 10.1855 3.3696 10.2791C3.23539 10.3613 3.08907 10.4219 2.93602 10.4587C2.7618 10.5005 2.58242 10.5003 2.37897 10.5001C2.3652 10.5001 2.35132 10.5001 2.33732 10.5001H1.50005C1.22391 10.5001 1.00005 10.2763 1.00005 10.0001V9.16286C1.00005 9.14886 1.00004 9.13497 1.00003 9.1212C0.999836 8.91776 0.999669 8.73838 1.0415 8.56416C1.07824 8.4111 1.13885 8.26479 1.22109 8.13058C1.31471 7.97781 1.44166 7.85109 1.58566 7.70736C1.5954 7.69764 1.60523 7.68783 1.61513 7.67793L7.89651 1.39656Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Edit03"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/Edit03.tsx b/app/components/base/icons/src/vender/solid/general/Edit03.tsx
new file mode 100644
index 0000000..837e597
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/Edit03.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Edit03.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Edit03'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/Edit04.json b/app/components/base/icons/src/vender/solid/general/Edit04.json
new file mode 100644
index 0000000..aa923c2
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/Edit04.json
@@ -0,0 +1,39 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M21.6747 17.2619C22.0824 17.6345 22.1107 18.2671 21.7381 18.6747L20.738 19.7687C20.0284 20.5448 19.0458 21 18.0002 21C16.9549 21 15.9726 20.5452 15.2631 19.7696C14.9112 19.3863 14.4549 19.1901 14.0002 19.1901C13.5454 19.1901 13.0889 19.3864 12.7369 19.7701C12.3635 20.177 11.7309 20.2043 11.324 19.8309C10.917 19.4575 10.8898 18.8249 11.2632 18.418C11.9735 17.6438 12.9555 17.1901 14.0002 17.1901C15.045 17.1901 16.0269 17.6438 16.7373 18.418L16.7384 18.4192C17.0897 18.8034 17.5458 19 18.0002 19C18.4545 19 18.9106 18.8034 19.2618 18.4193L20.2619 17.3253C20.6346 16.9177 21.2671 16.8893 21.6747 17.2619Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M15.793 2.79287C17.0119 1.57393 18.9882 1.57392 20.2072 2.79287C21.4261 4.01183 21.4261 5.98814 20.2072 7.20709L7.64443 19.7698C7.62463 19.7896 7.60502 19.8093 7.58556 19.8288C7.29811 20.1168 7.04467 20.3707 6.73914 20.5579C6.47072 20.7224 6.17809 20.8436 5.87198 20.9171C5.52353 21.0007 5.16478 21.0004 4.75788 21C4.73034 21 4.70258 21 4.67458 21H3.00004C2.44776 21 2.00004 20.5523 2.00004 20V18.3255C2.00004 18.2975 2.00001 18.2697 1.99999 18.2422C1.99961 17.8353 1.99928 17.4765 2.08293 17.1281C2.15642 16.822 2.27763 16.5293 2.44212 16.2609C2.62936 15.9554 2.88327 15.7019 3.17125 15.4145C3.19075 15.395 3.2104 15.3754 3.23019 15.3556L15.793 2.79287Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Edit04"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/Edit04.tsx b/app/components/base/icons/src/vender/solid/general/Edit04.tsx
new file mode 100644
index 0000000..5e436c0
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/Edit04.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Edit04.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Edit04'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/Eye.json b/app/components/base/icons/src/vender/solid/general/Eye.json
new file mode 100644
index 0000000..a7e6348
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/Eye.json
@@ -0,0 +1,37 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M10 12C10 10.8954 10.8954 10 12 10C13.1046 10 14 10.8954 14 12C14 13.1046 13.1046 14 12 14C10.8954 14 10 13.1046 10 12Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M12 4C9.13833 4 6.80535 5.26472 5.07675 6.70743C3.3505 8.14818 2.16697 9.81429 1.57422 10.7528L1.55014 10.7908C1.43252 10.976 1.27981 11.2164 1.2026 11.5532C1.14027 11.8251 1.14027 12.1749 1.2026 12.4468C1.2798 12.7836 1.43252 13.024 1.55014 13.2092L1.57423 13.2472C2.16697 14.1857 3.3505 15.8518 5.07675 17.2926C6.80535 18.7353 9.13833 20 12 20C14.8617 20 17.1947 18.7353 18.9233 17.2926C20.6495 15.8518 21.833 14.1857 22.4258 13.2472L22.4499 13.2092C22.5675 13.024 22.7202 12.7837 22.7974 12.4468C22.8597 12.1749 22.8597 11.8251 22.7974 11.5532C22.7202 11.2163 22.5675 10.976 22.4499 10.7908L22.4258 10.7528C21.833 9.81429 20.6495 8.14818 18.9233 6.70743C17.1947 5.26472 14.8617 4 12 4ZM12 8C9.79086 8 8 9.79086 8 12C8 14.2091 9.79086 16 12 16C14.2091 16 16 14.2091 16 12C16 9.79086 14.2091 8 12 8Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Eye"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/Eye.tsx b/app/components/base/icons/src/vender/solid/general/Eye.tsx
new file mode 100644
index 0000000..29d1ea9
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/Eye.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Eye.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Eye'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/Github.json b/app/components/base/icons/src/vender/solid/general/Github.json
new file mode 100644
index 0000000..46e6942
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/Github.json
@@ -0,0 +1,36 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M8 1C4.1325 1 1 4.1325 1 8C1 11.0975 3.00375 13.7137 5.78625 14.6413C6.13625 14.7025 6.2675 14.4925 6.2675 14.3088C6.2675 14.1425 6.25875 13.5913 6.25875 13.005C4.5 13.3288 4.045 12.5763 3.905 12.1825C3.82625 11.9812 3.485 11.36 3.1875 11.1937C2.9425 11.0625 2.5925 10.7387 3.17875 10.73C3.73 10.7212 4.12375 11.2375 4.255 11.4475C4.885 12.5062 5.89125 12.2088 6.29375 12.025C6.355 11.57 6.53875 11.2638 6.74 11.0887C5.1825 10.9137 3.555 10.31 3.555 7.6325C3.555 6.87125 3.82625 6.24125 4.2725 5.75125C4.2025 5.57625 3.9575 4.85875 4.3425 3.89625C4.3425 3.89625 4.92875 3.7125 6.2675 4.61375C6.8275 4.45625 7.4225 4.3775 8.0175 4.3775C8.6125 4.3775 9.2075 4.45625 9.7675 4.61375C11.1063 3.70375 11.6925 3.89625 11.6925 3.89625C12.0775 4.85875 11.8325 5.57625 11.7625 5.75125C12.2087 6.24125 12.48 6.8625 12.48 7.6325C12.48 10.3187 10.8438 10.9137 9.28625 11.0887C9.54 11.3075 9.75875 11.7275 9.75875 12.3837C9.75875 13.32 9.75 14.0725 9.75 14.3088C9.75 14.4925 9.88125 14.7113 10.2312 14.6413C11.6209 14.1721 12.8284 13.279 13.6839 12.0877C14.5393 10.8963 14.9996 9.46668 15 8C15 4.1325 11.8675 1 8 1Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Github"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/Github.tsx b/app/components/base/icons/src/vender/solid/general/Github.tsx
new file mode 100644
index 0000000..9c6f418
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/Github.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Github.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Github'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/MessageClockCircle.json b/app/components/base/icons/src/vender/solid/general/MessageClockCircle.json
new file mode 100644
index 0000000..4307f82
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/MessageClockCircle.json
@@ -0,0 +1,36 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "message-clock-circle"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"d": "M1.33301 8.00016C1.33301 4.31826 4.31778 1.3335 7.99967 1.3335C11.6816 1.3335 14.6663 4.31826 14.6663 8.00016C14.6663 11.6821 11.6816 14.6668 7.99967 14.6668C7.11413 14.6668 6.26734 14.4938 5.49248 14.1791C5.42249 14.1507 5.38209 14.1344 5.35225 14.1231L5.34304 14.1197L5.33987 14.1202C5.31527 14.1235 5.28173 14.129 5.21771 14.1397L2.82667 14.5382C2.71958 14.5561 2.59976 14.5761 2.4957 14.5839C2.38225 14.5925 2.20175 14.5955 2.01101 14.5137C1.77521 14.4125 1.5873 14.2246 1.48616 13.9888C1.40435 13.7981 1.40733 13.6176 1.41589 13.5041C1.42375 13.4001 1.44375 13.2803 1.46163 13.1732L1.86015 10.7821C1.87082 10.7181 1.87634 10.6846 1.87967 10.66L1.8801 10.6568L1.87669 10.6476C1.86549 10.6178 1.84914 10.5773 1.82071 10.5074C1.50602 9.7325 1.33301 8.88571 1.33301 8.00016ZM7.99967 5.3335C7.99967 4.96531 7.7012 4.66683 7.33301 4.66683C6.96482 4.66683 6.66634 4.96531 6.66634 5.3335V8.66683C6.66634 9.03502 6.96482 9.3335 7.33301 9.3335H10.6663C11.0345 9.3335 11.333 9.03502 11.333 8.66683C11.333 8.29864 11.0345 8.00016 10.6663 8.00016H7.99967V5.3335Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "MessageClockCircle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/MessageClockCircle.tsx b/app/components/base/icons/src/vender/solid/general/MessageClockCircle.tsx
new file mode 100644
index 0000000..dc1f17e
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/MessageClockCircle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './MessageClockCircle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'MessageClockCircle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/PlusCircle.json b/app/components/base/icons/src/vender/solid/general/PlusCircle.json
new file mode 100644
index 0000000..005a7ba
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/PlusCircle.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "plus-circle"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M12 1C5.92487 1 1 5.92487 1 12C1 18.0751 5.92487 23 12 23C18.0751 23 23 18.0751 23 12C23 5.92487 18.0751 1 12 1ZM12 7C12.5523 7 13 7.44772 13 8V11H16C16.5523 11 17 11.4477 17 12C17 12.5523 16.5523 13 16 13H13V16C13 16.5523 12.5523 17 12 17C11.4477 17 11 16.5523 11 16V13H8C7.44772 13 7 12.5523 7 12C7 11.4477 7.44772 11 8 11H11V8C11 7.44772 11.4477 7 12 7Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "PlusCircle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/PlusCircle.tsx b/app/components/base/icons/src/vender/solid/general/PlusCircle.tsx
new file mode 100644
index 0000000..142ad91
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/PlusCircle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './PlusCircle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'PlusCircle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/QuestionTriangle.json b/app/components/base/icons/src/vender/solid/general/QuestionTriangle.json
new file mode 100644
index 0000000..8830ee5
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/QuestionTriangle.json
@@ -0,0 +1,45 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "8",
+			"height": "12",
+			"viewBox": "0 0 8 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Rectangle 2"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M6.96353 1.5547C7.40657 0.890144 6.93018 0 6.13148 0H0V12L6.96353 1.5547Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M6.96353 1.5547C7.40657 0.890144 6.93018 0 6.13148 0H0V12L6.96353 1.5547Z",
+							"fill": "currentColor",
+							"fill-opacity": "0.5"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "QuestionTriangle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/QuestionTriangle.tsx b/app/components/base/icons/src/vender/solid/general/QuestionTriangle.tsx
new file mode 100644
index 0000000..85cc44f
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/QuestionTriangle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './QuestionTriangle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'QuestionTriangle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/SearchMd.json b/app/components/base/icons/src/vender/solid/general/SearchMd.json
new file mode 100644
index 0000000..808195f
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/SearchMd.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "search-md"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M11 2C6.02944 2 2 6.02944 2 11C2 15.9706 6.02944 20 11 20C13.125 20 15.078 19.2635 16.6177 18.0319L20.2929 21.7071C20.6834 22.0976 21.3166 22.0976 21.7071 21.7071C22.0976 21.3166 22.0976 20.6834 21.7071 20.2929L18.0319 16.6177C19.2635 15.078 20 13.125 20 11C20 6.02944 15.9706 2 11 2ZM4 11C4 7.13401 7.13401 4 11 4C14.866 4 18 7.13401 18 11C18 14.866 14.866 18 11 18C7.13401 18 4 14.866 4 11Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "SearchMd"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/SearchMd.tsx b/app/components/base/icons/src/vender/solid/general/SearchMd.tsx
new file mode 100644
index 0000000..295997c
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/SearchMd.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './SearchMd.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'SearchMd'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/Target04.json b/app/components/base/icons/src/vender/solid/general/Target04.json
new file mode 100644
index 0000000..6b22fab
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/Target04.json
@@ -0,0 +1,46 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M19.1601 1.01292C19.4774 1.06441 19.7506 1.26529 19.8944 1.5528L20.7453 3.25466L22.4472 4.10558C22.7347 4.24934 22.9355 4.52254 22.987 4.83983C23.0385 5.15712 22.9343 5.47982 22.707 5.70712L19.707 8.70712C19.5195 8.89466 19.2652 9.00001 18.9999 9.00001H16.4142L12.7071 12.7071C12.3166 13.0976 11.6834 13.0976 11.2929 12.7071C10.9024 12.3166 10.9024 11.6834 11.2929 11.2929L14.9999 7.58585V5.00001C14.9999 4.7348 15.1053 4.48044 15.2928 4.29291L18.2928 1.29291C18.5201 1.06561 18.8428 0.961435 19.1601 1.01292Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M3 12C3 7.02944 7.02944 3 12 3C12.5523 3 13 2.55228 13 2C13 1.44772 12.5523 1 12 1C5.92487 1 1 5.92487 1 12C1 18.0751 5.92487 23 12 23C18.0751 23 23 18.0751 23 12C23 11.4477 22.5523 11 22 11C21.4477 11 21 11.4477 21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M8 12C8 9.79086 9.79086 8 12 8C12.5523 8 13 7.55228 13 7C13 6.44772 12.5523 6 12 6C8.68629 6 6 8.68629 6 12C6 15.3137 8.68629 18 12 18C15.3137 18 18 15.3137 18 12C18 11.4477 17.5523 11 17 11C16.4477 11 16 11.4477 16 12C16 14.2091 14.2091 16 12 16C9.79086 16 8 14.2091 8 12Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Target04"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/Target04.tsx b/app/components/base/icons/src/vender/solid/general/Target04.tsx
new file mode 100644
index 0000000..d2d04f9
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/Target04.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Target04.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Target04'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/Tool03.json b/app/components/base/icons/src/vender/solid/general/Tool03.json
new file mode 100644
index 0000000..0a7f1ab
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/Tool03.json
@@ -0,0 +1,62 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "tool-03"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M5.10516 6.61092L6.45642 5.41856C6.43816 5.25959 6.43018 5.09961 6.43253 4.93962V4.9285L2.91826 1.41365C2.89245 1.38778 2.86179 1.36725 2.82804 1.35325C2.79429 1.33924 2.75811 1.33203 2.72157 1.33203C2.68503 1.33203 2.64884 1.33924 2.61509 1.35325C2.58134 1.36725 2.55069 1.38778 2.52488 1.41365L1.41365 2.52489C1.38778 2.5507 1.36725 2.58135 1.35325 2.6151C1.33924 2.64885 1.33203 2.68504 1.33203 2.72158C1.33203 2.75812 1.33924 2.7943 1.35325 2.82806C1.36725 2.86181 1.38778 2.89246 1.41365 2.91827L5.10516 6.61092Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M12.5043 9.33348C12.3512 9.3848 12.1956 9.42819 12.0381 9.46349L11.9748 9.47461C11.7112 9.51388 11.4451 9.53375 11.1786 9.53406C10.9848 9.53389 10.7912 9.52314 10.5985 9.50183L8.58942 11.7604L10.8297 14.0007C11.0335 14.2097 11.2767 14.3763 11.5452 14.4907C11.8138 14.6052 12.1024 14.6652 12.3943 14.6674H12.4176C12.8604 14.6643 13.2924 14.5307 13.6596 14.2832C14.0268 14.0356 14.3128 13.6853 14.4818 13.276C14.6508 12.8667 14.6952 12.4167 14.6096 11.9822C14.524 11.5478 14.3122 11.1483 14.0006 10.8337L12.5043 9.33348Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M14.4606 3.79227C14.4443 3.74889 14.4174 3.71027 14.3823 3.67995C14.3472 3.64963 14.3051 3.62857 14.2599 3.61868C14.2146 3.6088 14.1675 3.6104 14.123 3.62335C14.0785 3.6363 14.0379 3.66018 14.005 3.69282L12.4132 5.27745L10.7224 3.5928L12.3132 2.00929C12.3454 1.97739 12.3692 1.93802 12.3825 1.89468C12.3957 1.85134 12.3981 1.80539 12.3893 1.76092C12.3805 1.7159 12.3606 1.67376 12.3315 1.63828C12.3024 1.60279 12.265 1.57506 12.2226 1.55757C11.7685 1.35982 11.2688 1.29063 10.778 1.35754C9.88338 1.43541 9.05173 1.8501 8.45122 2.51777C7.8507 3.18544 7.52615 4.05624 7.54319 4.95408C7.53907 5.24983 7.58317 5.54428 7.67376 5.82584L2.09204 10.7442C1.64427 11.1439 1.3735 11.7051 1.33923 12.3043C1.30495 12.9036 1.50997 13.4919 1.90924 13.9401L1.95703 13.9924C2.35812 14.411 2.90891 14.6533 3.4885 14.6662C4.06809 14.6791 4.62913 14.4616 5.04848 14.0613C5.11213 14.0008 5.17189 13.9364 5.22739 13.8685L10.1801 8.30058C10.7141 8.43272 11.2688 8.45821 11.8126 8.37559C12.4502 8.24485 13.04 7.9423 13.5182 7.50065C13.9964 7.05899 14.3447 6.49503 14.5256 5.86974C14.7321 5.18882 14.7092 4.45895 14.4606 3.79227Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Tool03"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/Tool03.tsx b/app/components/base/icons/src/vender/solid/general/Tool03.tsx
new file mode 100644
index 0000000..fd60b8e
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/Tool03.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Tool03.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Tool03'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/XCircle.json b/app/components/base/icons/src/vender/solid/general/XCircle.json
new file mode 100644
index 0000000..dd269fa
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/XCircle.json
@@ -0,0 +1,29 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"id": "Solid",
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M8.00008 0.666016C3.94999 0.666016 0.666748 3.94926 0.666748 7.99935C0.666748 12.0494 3.94999 15.3327 8.00008 15.3327C12.0502 15.3327 15.3334 12.0494 15.3334 7.99935C15.3334 3.94926 12.0502 0.666016 8.00008 0.666016ZM10.4715 5.52794C10.7318 5.78829 10.7318 6.2104 10.4715 6.47075L8.94289 7.99935L10.4715 9.52794C10.7318 9.78829 10.7318 10.2104 10.4715 10.4708C10.2111 10.7311 9.78903 10.7311 9.52868 10.4708L8.00008 8.94216L6.47149 10.4708C6.21114 10.7311 5.78903 10.7311 5.52868 10.4708C5.26833 10.2104 5.26833 9.78829 5.52868 9.52794L7.05727 7.99935L5.52868 6.47075C5.26833 6.2104 5.26833 5.78829 5.52868 5.52794C5.78903 5.26759 6.21114 5.26759 6.47149 5.52794L8.00008 7.05654L9.52868 5.52794C9.78903 5.26759 10.2111 5.26759 10.4715 5.52794Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "XCircle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/XCircle.tsx b/app/components/base/icons/src/vender/solid/general/XCircle.tsx
new file mode 100644
index 0000000..b278a98
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/XCircle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './XCircle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'XCircle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/ZapFast.json b/app/components/base/icons/src/vender/solid/general/ZapFast.json
new file mode 100644
index 0000000..865a48e
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/ZapFast.json
@@ -0,0 +1,79 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "zap-fast"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M1.25 8.75004C1.25 8.4739 1.47386 8.25004 1.75 8.25004H4.5C4.77614 8.25004 5 8.4739 5 8.75004C5 9.02618 4.77614 9.25004 4.5 9.25004H1.75C1.47386 9.25004 1.25 9.02618 1.25 8.75004Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M0.5 6.00004C0.5 5.7239 0.723858 5.50004 1 5.50004H3.25C3.52614 5.50004 3.75 5.7239 3.75 6.00004C3.75 6.27618 3.52614 6.50004 3.25 6.50004H1C0.723858 6.50004 0.5 6.27618 0.5 6.00004Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M1.5 3.25004C1.5 2.9739 1.72386 2.75004 2 2.75004H4.5C4.77614 2.75004 5 2.9739 5 3.25004C5 3.52618 4.77614 3.75004 4.5 3.75004H2C1.72386 3.75004 1.5 3.52618 1.5 3.25004Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M8.68379 1.03505C8.89736 1.11946 9.02596 1.33849 8.99561 1.56612L8.57109 4.75004H10.4727C10.4785 4.75004 10.4842 4.75004 10.49 4.75004C10.6003 4.75002 10.7147 4.74999 10.8092 4.75863C10.9022 4.76713 11.0713 4.78965 11.2224 4.90631C11.3987 5.04237 11.5054 5.24972 11.5137 5.47225C11.5208 5.66306 11.4408 5.81376 11.3937 5.89434C11.3458 5.97625 11.2793 6.06932 11.2151 6.15912C11.2118 6.16381 11.2084 6.16849 11.2051 6.17316L7.90687 10.7907C7.77339 10.9775 7.52978 11.0495 7.31621 10.965C7.10264 10.8806 6.97404 10.6616 7.00439 10.434L7.42891 7.25004H5.52728C5.52154 7.25004 5.51579 7.25004 5.51003 7.25004C5.39966 7.25007 5.28526 7.25009 5.19077 7.24145C5.09782 7.23296 4.92871 7.21044 4.77755 7.09377C4.60127 6.95771 4.49456 6.75036 4.48631 6.52783C4.47924 6.33702 4.5592 6.18632 4.60631 6.10575C4.65421 6.02383 4.72072 5.93076 4.78489 5.84097C4.78824 5.83628 4.79158 5.8316 4.79492 5.82693L8.09313 1.20942C8.22661 1.02255 8.47022 0.950633 8.68379 1.03505Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "ZapFast"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/ZapFast.tsx b/app/components/base/icons/src/vender/solid/general/ZapFast.tsx
new file mode 100644
index 0000000..af7e8bd
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/ZapFast.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ZapFast.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ZapFast'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/ZapNarrow.json b/app/components/base/icons/src/vender/solid/general/ZapNarrow.json
new file mode 100644
index 0000000..740c823
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/ZapNarrow.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "zap-narrow"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M6.69792 1.03505C6.91148 1.11946 7.04009 1.33849 7.00974 1.56612L6.58522 4.75004H8.48685C8.49259 4.75004 8.49834 4.75004 8.5041 4.75004C8.61447 4.75002 8.72887 4.74999 8.82336 4.75863C8.91631 4.76713 9.08541 4.78965 9.23657 4.90631C9.41286 5.04237 9.51956 5.24972 9.52781 5.47225C9.53489 5.66306 9.45493 5.81376 9.40781 5.89434C9.35992 5.97625 9.29341 6.06932 9.22924 6.15912C9.22589 6.16381 9.22255 6.16849 9.21921 6.17316L5.92099 10.7907C5.78752 10.9775 5.54391 11.0495 5.33034 10.965C5.11677 10.8806 4.98816 10.6616 5.01851 10.434L5.44304 7.25004H3.5414C3.53567 7.25004 3.52992 7.25004 3.52416 7.25004C3.41378 7.25007 3.29939 7.25009 3.2049 7.24145C3.11194 7.23296 2.94284 7.21044 2.79168 7.09377C2.6154 6.95771 2.50869 6.75036 2.50044 6.52783C2.49336 6.33702 2.57333 6.18632 2.62044 6.10575C2.66833 6.02383 2.73484 5.93076 2.79901 5.84097C2.80236 5.83628 2.80571 5.8316 2.80904 5.82693L6.10726 1.20942C6.24074 1.02255 6.48435 0.950633 6.69792 1.03505Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ZapNarrow"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/general/ZapNarrow.tsx b/app/components/base/icons/src/vender/solid/general/ZapNarrow.tsx
new file mode 100644
index 0000000..5f2aa62
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/ZapNarrow.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ZapNarrow.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ZapNarrow'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/general/index.ts b/app/components/base/icons/src/vender/solid/general/index.ts
new file mode 100644
index 0000000..4c4dd9a
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/general/index.ts
@@ -0,0 +1,18 @@
+export { default as AnswerTriangle } from './AnswerTriangle'
+export { default as ArrowDownRoundFill } from './ArrowDownRoundFill'
+export { default as CheckCircle } from './CheckCircle'
+export { default as CheckDone01 } from './CheckDone01'
+export { default as Download02 } from './Download02'
+export { default as Edit03 } from './Edit03'
+export { default as Edit04 } from './Edit04'
+export { default as Eye } from './Eye'
+export { default as Github } from './Github'
+export { default as MessageClockCircle } from './MessageClockCircle'
+export { default as PlusCircle } from './PlusCircle'
+export { default as QuestionTriangle } from './QuestionTriangle'
+export { default as SearchMd } from './SearchMd'
+export { default as Target04 } from './Target04'
+export { default as Tool03 } from './Tool03'
+export { default as XCircle } from './XCircle'
+export { default as ZapFast } from './ZapFast'
+export { default as ZapNarrow } from './ZapNarrow'
diff --git a/app/components/base/icons/src/vender/solid/layout/Grid01.json b/app/components/base/icons/src/vender/solid/layout/Grid01.json
new file mode 100644
index 0000000..722cdec
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/layout/Grid01.json
@@ -0,0 +1,79 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "grid-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M3.04545 1.33338C3.90407 1.33348 4.76437 1.33348 5.62131 1.33338C5.78956 1.33336 5.95343 1.33334 6.0922 1.34467C6.24459 1.35713 6.42442 1.3865 6.60536 1.4787C6.85625 1.60653 7.06022 1.81051 7.18805 2.06139C7.28025 2.24234 7.30963 2.42216 7.32208 2.57456C7.33342 2.71333 7.3334 2.8772 7.33338 3.04546V5.6213C7.3334 5.78956 7.33342 5.95342 7.32208 6.0922C7.30963 6.24459 7.28025 6.42442 7.18805 6.60536C7.06022 6.85625 6.85625 7.06022 6.60536 7.18805C6.42442 7.28025 6.24459 7.30963 6.0922 7.32208C5.95342 7.33342 5.78956 7.3334 5.6213 7.33338H3.04546C2.8772 7.3334 2.71333 7.33342 2.57456 7.32208C2.42216 7.30963 2.24234 7.28025 2.06139 7.18805C1.81051 7.06022 1.60653 6.85625 1.4787 6.60536C1.3865 6.42442 1.35713 6.24459 1.34467 6.0922C1.33334 5.95343 1.33336 5.78956 1.33338 5.62131C1.33338 5.61423 1.33338 5.60714 1.33338 5.60004V3.06671C1.33338 3.05962 1.33338 3.05253 1.33338 3.04545C1.33336 2.87719 1.33334 2.71333 1.34467 2.57456C1.35713 2.42216 1.3865 2.24234 1.4787 2.06139C1.60653 1.81051 1.81051 1.60653 2.06139 1.4787C2.24234 1.3865 2.42216 1.35713 2.57456 1.34467C2.71333 1.33334 2.87719 1.33336 3.04545 1.33338Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M3.04545 8.66671C3.90407 8.66682 4.76437 8.66682 5.62131 8.66671C5.78956 8.66669 5.95343 8.66667 6.0922 8.67801C6.24459 8.69046 6.42442 8.71984 6.60536 8.81204C6.85625 8.93987 7.06022 9.14384 7.18805 9.39472C7.28025 9.57567 7.30963 9.7555 7.32208 9.90789C7.33342 10.0467 7.3334 10.2105 7.33338 10.3788V12.9546C7.3334 13.1229 7.33342 13.2868 7.32208 13.4255C7.30963 13.5779 7.28025 13.7577 7.18805 13.9387C7.06022 14.1896 6.85625 14.3936 6.60536 14.5214C6.42442 14.6136 6.24459 14.643 6.0922 14.6554C5.95342 14.6668 5.78956 14.6667 5.6213 14.6667H3.04546C2.8772 14.6667 2.71333 14.6668 2.57456 14.6554C2.42216 14.643 2.24234 14.6136 2.06139 14.5214C1.81051 14.3936 1.60653 14.1896 1.4787 13.9387C1.3865 13.7577 1.35713 13.5779 1.34467 13.4255C1.33334 13.2868 1.33336 13.1229 1.33338 12.9546C1.33338 12.9476 1.33338 12.9405 1.33338 12.9334V10.4C1.33338 10.3929 1.33338 10.3859 1.33338 10.3788C1.33336 10.2105 1.33334 10.0467 1.34467 9.90789C1.35713 9.7555 1.3865 9.57567 1.4787 9.39472C1.60653 9.14384 1.81051 8.93987 2.06139 8.81204C2.24234 8.71984 2.42216 8.69046 2.57456 8.67801C2.71333 8.66667 2.87719 8.66669 3.04545 8.66671Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M10.3788 1.33338C11.2374 1.33348 12.0977 1.33348 12.9546 1.33338C13.1229 1.33336 13.2868 1.33334 13.4255 1.34467C13.5779 1.35713 13.7577 1.3865 13.9387 1.4787C14.1896 1.60653 14.3936 1.81051 14.5214 2.06139C14.6136 2.24234 14.643 2.42216 14.6554 2.57456C14.6668 2.71333 14.6667 2.8772 14.6667 3.04546V5.6213C14.6667 5.78956 14.6668 5.95342 14.6554 6.0922C14.643 6.24459 14.6136 6.42442 14.5214 6.60536C14.3936 6.85625 14.1896 7.06022 13.9387 7.18805C13.7577 7.28025 13.5779 7.30963 13.4255 7.32208C13.2868 7.33342 13.1229 7.3334 12.9546 7.33338H10.3788C10.2105 7.3334 10.0467 7.33342 9.90789 7.32208C9.7555 7.30963 9.57567 7.28025 9.39472 7.18805C9.14384 7.06022 8.93987 6.85625 8.81204 6.60536C8.71984 6.42442 8.69046 6.24459 8.67801 6.0922C8.66667 5.95343 8.66669 5.78956 8.66671 5.62131C8.66671 5.61423 8.66671 5.60714 8.66671 5.60004V3.06671C8.66671 3.05962 8.66671 3.05253 8.66671 3.04545C8.66669 2.87719 8.66667 2.71333 8.67801 2.57456C8.69046 2.42216 8.71984 2.24234 8.81204 2.06139C8.93987 1.81051 9.14384 1.60653 9.39472 1.4787C9.57567 1.3865 9.7555 1.35713 9.90789 1.34467C10.0467 1.33334 10.2105 1.33336 10.3788 1.33338Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M10.3788 8.66671C11.2374 8.66682 12.0977 8.66682 12.9546 8.66671C13.1229 8.66669 13.2868 8.66667 13.4255 8.67801C13.5779 8.69046 13.7577 8.71984 13.9387 8.81204C14.1896 8.93987 14.3936 9.14384 14.5214 9.39472C14.6136 9.57567 14.643 9.7555 14.6554 9.90789C14.6668 10.0467 14.6667 10.2105 14.6667 10.3788V12.9546C14.6667 13.1229 14.6668 13.2868 14.6554 13.4255C14.643 13.5779 14.6136 13.7577 14.5214 13.9387C14.3936 14.1896 14.1896 14.3936 13.9387 14.5214C13.7577 14.6136 13.5779 14.643 13.4255 14.6554C13.2868 14.6668 13.1229 14.6667 12.9546 14.6667H10.3788C10.2105 14.6667 10.0467 14.6668 9.90789 14.6554C9.7555 14.643 9.57567 14.6136 9.39472 14.5214C9.14384 14.3936 8.93987 14.1896 8.81204 13.9387C8.71984 13.7577 8.69046 13.5779 8.67801 13.4255C8.66667 13.2868 8.66669 13.1229 8.66671 12.9546C8.66671 12.9476 8.66671 12.9405 8.66671 12.9334V10.4C8.66671 10.3929 8.66671 10.3859 8.66671 10.3788C8.66669 10.2105 8.66667 10.0467 8.67801 9.90789C8.69046 9.7555 8.71984 9.57567 8.81204 9.39472C8.93987 9.14384 9.14384 8.93987 9.39472 8.81204C9.57567 8.71984 9.7555 8.69046 9.90789 8.67801C10.0467 8.66667 10.2105 8.66669 10.3788 8.66671Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Grid01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/layout/Grid01.tsx b/app/components/base/icons/src/vender/solid/layout/Grid01.tsx
new file mode 100644
index 0000000..5638f3c
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/layout/Grid01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Grid01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Grid01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/layout/index.ts b/app/components/base/icons/src/vender/solid/layout/index.ts
new file mode 100644
index 0000000..73a2513
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/layout/index.ts
@@ -0,0 +1 @@
+export { default as Grid01 } from './Grid01'
diff --git a/app/components/base/icons/src/vender/solid/mapsAndTravel/Globe06.json b/app/components/base/icons/src/vender/solid/mapsAndTravel/Globe06.json
new file mode 100644
index 0000000..6cc565f
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mapsAndTravel/Globe06.json
@@ -0,0 +1,57 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "17",
+			"viewBox": "0 0 16 17",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Icon"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M6.39498 2.71706C6.90587 2.57557 7.44415 2.49996 8.00008 2.49996C9.30806 2.49996 10.5183 2.91849 11.5041 3.62893C10.9796 3.97562 10.5883 4.35208 10.3171 4.75458C9.90275 5.36959 9.79654 6.00558 9.88236 6.58587C9.96571 7.1494 10.2245 7.63066 10.4965 7.98669C10.7602 8.33189 11.0838 8.6206 11.3688 8.76305C12.0863 9.12177 12.9143 9.30141 13.5334 9.39399C14.0933 9.47774 15.2805 9.75802 15.3244 8.86608C15.3304 8.74474 15.3334 8.62267 15.3334 8.49996C15.3334 4.44987 12.0502 1.16663 8.00008 1.16663C3.94999 1.16663 0.666748 4.44987 0.666748 8.49996C0.666748 12.55 3.94999 15.8333 8.00008 15.8333C8.1228 15.8333 8.24486 15.8303 8.3662 15.8243C8.73395 15.8062 9.01738 15.4934 8.99927 15.1256C8.98117 14.7579 8.66837 14.4745 8.30063 14.4926C8.20111 14.4975 8.10091 14.5 8.00008 14.5C5.6605 14.5 3.63367 13.1609 2.6442 11.2074L3.28991 10.8346L5.67171 11.2804C6.28881 11.3959 6.85846 10.9208 6.85566 10.293L6.84632 8.19093L8.06357 6.10697C8.26079 5.76932 8.24312 5.3477 8.01833 5.02774L6.39498 2.71706Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M9.29718 8.93736C9.05189 8.84432 8.77484 8.90379 8.58934 9.08929C8.40383 9.27479 8.34437 9.55184 8.43741 9.79713L10.5486 15.363C10.6461 15.6199 10.8912 15.7908 11.166 15.7932C11.4408 15.7956 11.689 15.6292 11.791 15.374L12.6714 13.1714L14.874 12.2909C15.1292 12.1889 15.2957 11.9408 15.2932 11.666C15.2908 11.3912 15.12 11.146 14.863 11.0486L9.29718 8.93736Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Globe06"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/mapsAndTravel/Globe06.tsx b/app/components/base/icons/src/vender/solid/mapsAndTravel/Globe06.tsx
new file mode 100644
index 0000000..d961eed
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mapsAndTravel/Globe06.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Globe06.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Globe06'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/mapsAndTravel/Route.json b/app/components/base/icons/src/vender/solid/mapsAndTravel/Route.json
new file mode 100644
index 0000000..24d3f35
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mapsAndTravel/Route.json
@@ -0,0 +1,58 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "13",
+			"height": "12",
+			"viewBox": "0 0 13 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "route-sep"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"d": "M6.08303 2.5H6.30023C7.82386 2.5 8.58567 2.5 8.87485 2.77364C9.12483 3.01018 9.23561 3.35864 9.16812 3.69611C9.09004 4.08651 8.46809 4.52643 7.22418 5.40627L5.19189 6.84373C3.94799 7.72357 3.32603 8.16349 3.24795 8.55389C3.18046 8.89136 3.29124 9.23982 3.54122 9.47636C3.8304 9.75 4.59221 9.75 6.11584 9.75H6.58303",
+							"stroke": "currentColor",
+							"stroke-linecap": "round",
+							"stroke-linejoin": "round"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon_2",
+							"d": "M2.83301 4C3.66143 4 4.33301 3.32843 4.33301 2.5C4.33301 1.67157 3.66143 1 2.83301 1C2.00458 1 1.33301 1.67157 1.33301 2.5C1.33301 3.32843 2.00458 4 2.83301 4Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon_3",
+							"d": "M9.83301 11C10.6614 11 11.333 10.3284 11.333 9.5C11.333 8.67157 10.6614 8 9.83301 8C9.00458 8 8.33301 8.67157 8.33301 9.5C8.33301 10.3284 9.00458 11 9.83301 11Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Route"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/mapsAndTravel/Route.tsx b/app/components/base/icons/src/vender/solid/mapsAndTravel/Route.tsx
new file mode 100644
index 0000000..f81fb61
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mapsAndTravel/Route.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Route.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Route'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/mapsAndTravel/index.ts b/app/components/base/icons/src/vender/solid/mapsAndTravel/index.ts
new file mode 100644
index 0000000..0a0abda
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mapsAndTravel/index.ts
@@ -0,0 +1,2 @@
+export { default as Globe06 } from './Globe06'
+export { default as Route } from './Route'
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/AudioSupportIcon.json b/app/components/base/icons/src/vender/solid/mediaAndDevices/AudioSupportIcon.json
new file mode 100644
index 0000000..cd3006b
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/AudioSupportIcon.json
@@ -0,0 +1,26 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"xmlns": "http://www.w3.org/2000/svg",
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M10.3567 3.56405L10.2334 3.84689C10.1432 4.05396 9.8568 4.05396 9.76655 3.84689L9.6433 3.56405C9.42355 3.05973 9.02775 2.6582 8.53385 2.43854L8.154 2.26961C7.94865 2.17826 7.94865 1.8794 8.154 1.78806L8.5126 1.62857C9.0192 1.40325 9.4221 0.986865 9.63805 0.465414L9.76465 0.159767C9.8529 -0.0532556 10.1471 -0.0532556 10.2353 0.159767L10.3619 0.465414C10.5779 0.986865 10.9808 1.40325 11.4874 1.62857L11.846 1.78806C12.0514 1.8794 12.0514 2.17826 11.846 2.26961L11.4662 2.43854C10.9723 2.6582 10.5764 3.05973 10.3567 3.56405ZM4.25 3H3.25V9H4.25V3ZM2 5H1V7H2V5ZM6.5 1H5.5V11H6.5V1ZM8.75 4H7.75V9H8.75V4ZM11 5H10V7H11V5Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "AudioSupportIcon"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/AudioSupportIcon.tsx b/app/components/base/icons/src/vender/solid/mediaAndDevices/AudioSupportIcon.tsx
new file mode 100644
index 0000000..663866f
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/AudioSupportIcon.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './AudioSupportIcon.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'AudioSupportIcon'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/DocumentSupportIcon.json b/app/components/base/icons/src/vender/solid/mediaAndDevices/DocumentSupportIcon.json
new file mode 100644
index 0000000..49cb6a5
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/DocumentSupportIcon.json
@@ -0,0 +1,26 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"xmlns": "http://www.w3.org/2000/svg",
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M10.5 4V10.4966C10.5 10.7751 10.2776 11 10.0033 11H1.9967C1.72248 11 1.5 10.778 1.5 10.5041V1.4959C1.5 1.22766 1.72435 1 2.00111 1H7.4984L10.5 4ZM9.5 4.5H7V2H2.5V10H9.5V4.5ZM4 3.5H5.5V4.5H4V3.5ZM4 5.5H8V6.5H4V5.5ZM4 7.5H8V8.5H4V7.5Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "DocumentSupportIcon"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/DocumentSupportIcon.tsx b/app/components/base/icons/src/vender/solid/mediaAndDevices/DocumentSupportIcon.tsx
new file mode 100644
index 0000000..5bad91e
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/DocumentSupportIcon.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './DocumentSupportIcon.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'DocumentSupportIcon'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicBox.json b/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicBox.json
new file mode 100644
index 0000000..4668e9e
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicBox.json
@@ -0,0 +1,64 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "box-sparkle, magic box"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Icon"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M9.76205 2.07424C9.99723 2.21897 10.0706 2.52694 9.92583 2.76212L8.85632 4.50007H9.5C9.77614 4.50007 10 4.72393 10 5.00007V9.00007C10 10.1046 9.10457 11.0001 8 11.0001H4C2.89543 11.0001 2 10.1046 2 9.00007V5.00007C2 4.72393 2.22386 4.50007 2.5 4.50007H7.68214L9.07417 2.23802C9.2189 2.00284 9.52687 1.92952 9.76205 2.07424ZM5 6.50007C4.72386 6.50007 4.5 6.72393 4.5 7.00007C4.5 7.27621 4.72386 7.50007 5 7.50007H7C7.27614 7.50007 7.5 7.27621 7.5 7.00007C7.5 6.72393 7.27614 6.50007 7 6.50007H5Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M5.92504 1.53733C5.97342 1.51314 6.01265 1.47391 6.03684 1.42553L6.27597 0.947279C6.3681 0.763016 6.63105 0.763017 6.72318 0.947279L6.96231 1.42553C6.9865 1.47391 7.02573 1.51314 7.07411 1.53733L7.55236 1.77646C7.73663 1.86859 7.73663 2.13154 7.55236 2.22367L7.07411 2.4628C7.02573 2.48699 6.9865 2.52622 6.96231 2.5746L6.72318 3.05285C6.63105 3.23711 6.3681 3.23711 6.27597 3.05285L6.03684 2.5746C6.01265 2.52622 5.97342 2.48699 5.92504 2.4628L5.44679 2.22367C5.26253 2.13154 5.26253 1.86859 5.44679 1.77646L5.92504 1.53733Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M3.25837 2.37067C3.30676 2.34648 3.34599 2.30724 3.37018 2.25886L3.52597 1.94728C3.6181 1.76302 3.88105 1.76302 3.97318 1.94728L4.12898 2.25886C4.15317 2.30724 4.1924 2.34648 4.24078 2.37067L4.55236 2.52646C4.73662 2.61859 4.73663 2.88154 4.55236 2.97367L4.24078 3.12946C4.1924 3.15365 4.15317 3.19289 4.12898 3.24127L3.97318 3.55285C3.88105 3.73711 3.6181 3.73711 3.52597 3.55285L3.37018 3.24127C3.34599 3.19289 3.30676 3.15365 3.25837 3.12946L2.94679 2.97367C2.76253 2.88154 2.76253 2.61859 2.94679 2.52646L3.25837 2.37067Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "MagicBox"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicBox.tsx b/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicBox.tsx
new file mode 100644
index 0000000..0c38691
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicBox.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './MagicBox.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'MagicBox'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicEyes.json b/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicEyes.json
new file mode 100644
index 0000000..00e1696
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicEyes.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "eye-sparkle, magic eyes"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M11.0338 5.05688C9.75366 3.05335 7.90203 1.99999 6.00017 2C4.09831 2.00001 2.24669 3.05341 0.966566 5.05693C0.599687 5.63113 0.599686 6.36892 0.966566 6.94312C2.24669 8.94665 4.09832 10 6.00018 10C7.90204 9.99999 9.75366 8.94659 11.0338 6.94307C11.4007 6.36887 11.4007 5.63108 11.0338 5.05688ZM5.77639 4.44721L5.3706 5.2588C5.34641 5.30718 5.30718 5.34641 5.2588 5.3706L4.44721 5.77639C4.26295 5.86852 4.26295 6.13148 4.44721 6.22361L5.2588 6.6294C5.30718 6.65359 5.34641 6.69282 5.3706 6.7412L5.77639 7.55279C5.86852 7.73705 6.13148 7.73705 6.22361 7.55279L6.6294 6.7412C6.65359 6.69282 6.69282 6.65359 6.7412 6.6294L7.55279 6.22361C7.73705 6.13148 7.73705 5.86852 7.55279 5.77639L6.7412 5.3706C6.69282 5.34641 6.65359 5.30718 6.6294 5.2588L6.22361 4.44721C6.13148 4.26295 5.86852 4.26295 5.77639 4.44721Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "MagicEyes"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicEyes.tsx b/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicEyes.tsx
new file mode 100644
index 0000000..e7f7335
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicEyes.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './MagicEyes.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'MagicEyes'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicWand.json b/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicWand.json
new file mode 100644
index 0000000..bf13ab9
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicWand.json
@@ -0,0 +1,73 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "magic-wand-2, magic stick, star"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Icon"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M8.27056 1.77151C8.811 1.23107 9.68723 1.23107 10.2277 1.77151C10.7681 2.31195 10.7681 3.18818 10.2277 3.72862L3.72767 10.2286C3.18723 10.7691 2.31101 10.7691 1.77056 10.2286C1.23012 9.68818 1.23012 8.81195 1.77056 8.27151L8.27056 1.77151ZM9.52056 2.47862C9.37065 2.3287 9.12759 2.3287 8.97767 2.47862L8.08122 3.37506L8.62412 3.91796L9.52056 3.02151C9.67048 2.87159 9.67048 2.62853 9.52056 2.47862Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M4.92504 1.03733C4.97342 1.01314 5.01265 0.973911 5.03684 0.92553L5.27597 0.447279C5.3681 0.263016 5.63105 0.263017 5.72318 0.447279L5.96231 0.92553C5.9865 0.973911 6.02573 1.01314 6.07411 1.03733L6.55236 1.27646C6.73663 1.36859 6.73663 1.63154 6.55236 1.72367L6.07411 1.9628C6.02573 1.98699 5.9865 2.02622 5.96231 2.0746L5.72318 2.55285C5.63105 2.73711 5.3681 2.73711 5.27597 2.55285L5.03684 2.0746C5.01265 2.02622 4.97342 1.98699 4.92504 1.9628L4.44679 1.72367C4.26253 1.63154 4.26253 1.36859 4.44679 1.27646L4.92504 1.03733Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M9.42504 6.53733C9.47342 6.51314 9.51265 6.47391 9.53684 6.42553L9.77597 5.94728C9.8681 5.76302 10.1311 5.76302 10.2232 5.94728L10.4623 6.42553C10.4865 6.47391 10.5257 6.51314 10.5741 6.53733L11.0524 6.77646C11.2366 6.86859 11.2366 7.13154 11.0524 7.22367L10.5741 7.4628C10.5257 7.48699 10.4865 7.52622 10.4623 7.5746L10.2232 8.05285C10.1311 8.23711 9.8681 8.23711 9.77597 8.05285L9.53684 7.5746C9.51265 7.52622 9.47342 7.48699 9.42504 7.4628L8.94679 7.22367C8.76253 7.13154 8.76253 6.86859 8.94679 6.77646L9.42504 6.53733Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M2.42504 3.53733C2.47342 3.51314 2.51265 3.47391 2.53684 3.42553L2.77597 2.94728C2.8681 2.76302 3.13105 2.76302 3.22318 2.94728L3.46231 3.42553C3.4865 3.47391 3.52573 3.51314 3.57411 3.53733L4.05236 3.77646C4.23663 3.86859 4.23663 4.13154 4.05236 4.22367L3.57411 4.4628C3.52573 4.48699 3.4865 4.52622 3.46231 4.5746L3.22318 5.05285C3.13105 5.23711 2.8681 5.23711 2.77597 5.05285L2.53684 4.5746C2.51265 4.52622 2.47342 4.48699 2.42504 4.4628L1.94679 4.22367C1.76253 4.13154 1.76253 3.86859 1.94679 3.77646L2.42504 3.53733Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "MagicWand"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicWand.tsx b/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicWand.tsx
new file mode 100644
index 0000000..3eb6130
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/MagicWand.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './MagicWand.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'MagicWand'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/Microphone01.json b/app/components/base/icons/src/vender/solid/mediaAndDevices/Microphone01.json
new file mode 100644
index 0000000..36aad43
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/Microphone01.json
@@ -0,0 +1,55 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "microphone-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M8.00008 0.666016C6.52732 0.666016 5.33341 1.85992 5.33341 3.33268V7.99935C5.33341 9.47211 6.52732 10.666 8.00008 10.666C9.47284 10.666 10.6667 9.47211 10.6667 7.99935V3.33268C10.6667 1.85992 9.47284 0.666016 8.00008 0.666016Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M4.00008 6.66602C4.00008 6.29783 3.7016 5.99935 3.33341 5.99935C2.96522 5.99935 2.66675 6.29783 2.66675 6.66602V7.99935C2.66675 10.7195 4.70319 12.9641 7.33466 13.2916C7.33384 13.3052 7.33341 13.3189 7.33341 13.3327V13.9993H5.33341C4.96522 13.9993 4.66675 14.2978 4.66675 14.666C4.66675 15.0342 4.96522 15.3327 5.33341 15.3327H10.6667C11.0349 15.3327 11.3334 15.0342 11.3334 14.666C11.3334 14.2978 11.0349 13.9993 10.6667 13.9993H8.66675V13.3327C8.66675 13.3189 8.66633 13.3052 8.6655 13.2916C11.297 12.9641 13.3334 10.7195 13.3334 7.99935V6.66602C13.3334 6.29783 13.0349 5.99935 12.6667 5.99935C12.2986 5.99935 12.0001 6.29783 12.0001 6.66602V7.99935C12.0001 10.2085 10.2092 11.9993 8.00008 11.9993C5.79094 11.9993 4.00008 10.2085 4.00008 7.99935V6.66602Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Microphone01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/Microphone01.tsx b/app/components/base/icons/src/vender/solid/mediaAndDevices/Microphone01.tsx
new file mode 100644
index 0000000..37fb66a
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/Microphone01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Microphone01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Microphone01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/Play.json b/app/components/base/icons/src/vender/solid/mediaAndDevices/Play.json
new file mode 100644
index 0000000..b32d786
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/Play.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "play"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M4.00312 1.40109C4.0091 1.40508 4.0151 1.40907 4.02111 1.41309L9.29548 4.92933C9.44809 5.03105 9.58959 5.12537 9.69827 5.21301C9.81168 5.30448 9.94538 5.43132 10.0223 5.61687C10.124 5.86212 10.124 6.13775 10.0223 6.38301C9.94538 6.56856 9.81168 6.6954 9.69827 6.78686C9.5896 6.8745 9.44811 6.96881 9.2955 7.07053L4.00314 10.5988C3.8166 10.7232 3.64886 10.835 3.50652 10.9121C3.36409 10.9893 3.16859 11.0775 2.9404 11.0639C2.64852 11.0465 2.3789 10.9022 2.20249 10.669C2.06458 10.4867 2.02952 10.2751 2.01474 10.1138C1.99997 9.95254 1.99999 9.75094 2 9.52674L2 2.49475C2 2.48752 2 2.48031 2 2.47313C1.99999 2.24893 1.99997 2.04733 2.01474 1.88612C2.02952 1.72479 2.06458 1.5132 2.20249 1.33089C2.3789 1.0977 2.64852 0.953401 2.9404 0.935973C3.16859 0.922349 3.36409 1.01055 3.50652 1.08774C3.64885 1.16488 3.81659 1.27672 4.00312 1.40109Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Play"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/Play.tsx b/app/components/base/icons/src/vender/solid/mediaAndDevices/Play.tsx
new file mode 100644
index 0000000..b9e07c5
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/Play.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Play.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Play'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/Robot.json b/app/components/base/icons/src/vender/solid/mediaAndDevices/Robot.json
new file mode 100644
index 0000000..650ca36
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/Robot.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "robot, bot"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M6 0.5C6.27614 0.5 6.5 0.723858 6.5 1V1.5H8.5C9.32843 1.5 10 2.17157 10 3V5.5C10 5.94425 9.80688 6.34339 9.5 6.61805V7.29289L10.3536 8.14645C10.5488 8.34171 10.5488 8.65829 10.3536 8.85355C10.1583 9.04882 9.84171 9.04882 9.64645 8.85355L9.34052 8.54762C8.89526 9.96884 7.56805 11 6 11C4.43195 11 3.10474 9.96884 2.65948 8.54762L2.35355 8.85355C2.15829 9.04882 1.84171 9.04882 1.64645 8.85355C1.45118 8.65829 1.45118 8.34171 1.64645 8.14645L2.5 7.29289V6.61805C2.19313 6.34339 2 5.94425 2 5.5V3C2 2.17157 2.67157 1.5 3.5 1.5H5.5V1C5.5 0.723858 5.72386 0.5 6 0.5ZM3.5 2.5C3.22386 2.5 3 2.72386 3 3V5.5C3 5.77614 3.22386 6 3.5 6H8.5C8.77614 6 9 5.77614 9 5.5V3C9 2.72386 8.77614 2.5 8.5 2.5H3.5ZM4.5 3.5C4.77614 3.5 5 3.72386 5 4V4.5C5 4.77614 4.77614 5 4.5 5C4.22386 5 4 4.77614 4 4.5V4C4 3.72386 4.22386 3.5 4.5 3.5ZM7.5 3.5C7.77614 3.5 8 3.72386 8 4V4.5C8 4.77614 7.77614 5 7.5 5C7.22386 5 7 4.77614 7 4.5V4C7 3.72386 7.22386 3.5 7.5 3.5Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Robot"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/Robot.tsx b/app/components/base/icons/src/vender/solid/mediaAndDevices/Robot.tsx
new file mode 100644
index 0000000..8bee6e2
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/Robot.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Robot.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Robot'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/Sliders02.json b/app/components/base/icons/src/vender/solid/mediaAndDevices/Sliders02.json
new file mode 100644
index 0000000..d72b99a
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/Sliders02.json
@@ -0,0 +1,77 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M5 2C5.55228 2 6 2.44772 6 3V7C6 7.55228 5.55228 8 5 8C4.44772 8 4 7.55228 4 7V3C4 2.44772 4.44772 2 5 2Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M6 15.8293C7.16519 15.4175 8 14.3062 8 13C8 11.3431 6.65685 10 5 10C3.34315 10 2 11.3431 2 13C2 14.3062 2.83481 15.4175 4 15.8293L4 21C4 21.5523 4.44772 22 5 22C5.55229 22 6 21.5523 6 21L6 15.8293Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M13 15C13 14.4477 12.5523 14 12 14C11.4477 14 11 14.4477 11 15V21C11 21.5523 11.4477 22 12 22C12.5523 22 13 21.5523 13 21V15Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M12 2C12.5523 2 13 2.44772 13 3V6.17071C14.1652 6.58254 15 7.69378 15 9C15 10.6569 13.6569 12 12 12C10.3431 12 9 10.6569 9 9C9 7.69378 9.83481 6.58254 11 6.17071V3C11 2.44772 11.4477 2 12 2Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"fill-rule": "evenodd",
+					"clip-rule": "evenodd",
+					"d": "M22 15C22 16.3062 21.1652 17.4175 20 17.8293V21C20 21.5523 19.5523 22 19 22C18.4477 22 18 21.5523 18 21V17.8293C16.8348 17.4175 16 16.3062 16 15C16 13.3431 17.3431 12 19 12C20.6569 12 22 13.3431 22 15Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			},
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M19 2C19.5523 2 20 2.44772 20 3V9C20 9.55228 19.5523 10 19 10C18.4477 10 18 9.55228 18 9V3C18 2.44772 18.4477 2 19 2Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Sliders02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/Sliders02.tsx b/app/components/base/icons/src/vender/solid/mediaAndDevices/Sliders02.tsx
new file mode 100644
index 0000000..f1d05e7
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/Sliders02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Sliders02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Sliders02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/Speaker.json b/app/components/base/icons/src/vender/solid/mediaAndDevices/Speaker.json
new file mode 100644
index 0000000..3e5cbe1
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/Speaker.json
@@ -0,0 +1,112 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"clip-path": "url(#clip0_109_6694)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M0 2.86666C0 2.05664 0.656649 1.39999 1.46667 1.39999H5.86667C6.67668 1.39999 7.33333 2.05664 7.33333 2.86666C7.33333 3.27167 7.00501 3.59999 6.6 3.59999C6.19499 3.59999 5.86667 3.27167 5.86667 2.86666H4.4V7.99999C4.80501 7.99999 5.13333 8.32831 5.13333 8.73332C5.13333 9.13833 4.80501 9.46666 4.4 9.46666H2.93333C2.52832 9.46666 2.2 9.13833 2.2 8.73332C2.2 8.32831 2.52832 7.99999 2.93333 7.99999V2.86666H1.46667C1.46667 3.27167 1.13834 3.59999 0.733333 3.59999C0.328324 3.59999 0 3.27167 0 2.86666Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M13.8205 0.782296C13.7434 0.62811 13.5233 0.62811 13.4462 0.782296C12.9664 1.74206 12.8754 1.83302 11.9156 2.3129C11.7615 2.39 11.7615 2.61003 11.9156 2.68712C12.8754 3.167 12.9664 3.25797 13.4462 4.21773C13.5233 4.37191 13.7434 4.37191 13.8205 4.21773C14.3003 3.25797 14.3913 3.167 15.3511 2.68712C15.5053 2.61003 15.5053 2.39 15.3511 2.3129C14.3913 1.83302 14.3003 1.74206 13.8205 0.782296Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M9.79394 2.25319C9.71404 2.09337 9.48596 2.09337 9.40605 2.25319C9.04994 2.96543 8.96544 3.04993 8.2532 3.40605C8.09338 3.48595 8.09338 3.71402 8.2532 3.79393C8.96544 4.15005 9.04994 4.23455 9.40606 4.94679C9.48596 5.10661 9.71404 5.10661 9.79394 4.94679C10.1501 4.23455 10.2346 4.15005 10.9468 3.79393C11.1066 3.71402 11.1066 3.48595 10.9468 3.40605C10.2346 3.04993 10.1501 2.96543 9.79394 2.25319Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"d": "M2.75377 11.049C2.67668 10.8948 2.45665 10.8948 2.37956 11.049C1.89969 12.0087 1.80872 12.0997 0.848971 12.5796C0.694788 12.6566 0.694787 12.8767 0.848971 12.9538C1.80872 13.4336 1.89969 13.5246 2.37956 14.4844C2.45665 14.6385 2.67668 14.6385 2.75377 14.4844C3.23365 13.5246 3.32461 13.4336 4.28436 12.9538C4.43855 12.8767 4.43855 12.6566 4.28436 12.5796C3.32461 12.0997 3.23365 12.0087 2.75377 11.049Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M14.6741 8.65106C14.8886 8.50146 15.1837 8.55405 15.3333 8.76853C15.7614 9.38226 16.0125 10.1292 16.0125 10.9333C16.0125 11.7375 15.7614 12.4844 15.3333 13.0981C15.1837 13.3126 14.8886 13.3652 14.6741 13.2156C14.4596 13.066 14.407 12.7708 14.5567 12.5564C14.8775 12.0964 15.0656 11.5375 15.0656 10.9333C15.0656 10.3291 14.8775 9.77025 14.5567 9.31028C14.407 9.09581 14.4596 8.80066 14.6741 8.65106Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M12.5674 6.53771C12.794 6.51987 13.0155 6.61161 13.1632 6.78449C13.2954 6.93929 13.3164 7.12549 13.3244 7.21587C13.3334 7.31718 13.3334 7.44301 13.3333 7.57103C13.3333 7.57691 13.3333 7.58278 13.3333 7.58866L13.3333 14.3C13.3334 14.428 13.3334 14.5539 13.3244 14.6552C13.3164 14.7455 13.2954 14.9317 13.1632 15.0865C13.0155 15.2594 12.794 15.3512 12.5674 15.3333C12.3644 15.3173 12.2179 15.2005 12.1484 15.1423C12.0704 15.077 11.9814 14.988 11.8909 14.8975L10.3795 13.3861C10.3357 13.3423 10.3137 13.3205 10.2971 13.3053L10.2958 13.3041L10.2941 13.3041C10.2716 13.303 10.2407 13.3029 10.1787 13.3029L9.34101 13.3029C9.22151 13.3029 9.10513 13.3029 9.00657 13.2949C8.89833 13.286 8.77062 13.2652 8.6421 13.1997C8.46392 13.1089 8.31906 12.964 8.22827 12.7859C8.16279 12.6574 8.14192 12.5296 8.13308 12.4214C8.12503 12.3228 8.12504 12.2065 8.12505 12.087V9.79916C8.12505 9.79413 8.12505 9.78909 8.12505 9.78406C8.12504 9.66456 8.12503 9.54819 8.13308 9.44963C8.14192 9.34139 8.16279 9.21368 8.22827 9.08517C8.31906 8.90699 8.46392 8.76212 8.6421 8.67133C8.77062 8.60585 8.89833 8.58498 9.00657 8.57614C9.10512 8.56809 9.2215 8.5681 9.341 8.56812C9.34603 8.56812 9.35106 8.56812 9.3561 8.56812H10.1787C10.2407 8.56812 10.2716 8.56801 10.2941 8.56698L10.2958 8.5669L10.2971 8.56575C10.3137 8.55058 10.3357 8.52877 10.3795 8.48491L11.8784 6.98602C11.8826 6.98186 11.8867 6.97771 11.8909 6.97355C11.9814 6.88302 12.0704 6.79403 12.1484 6.72874C12.2179 6.67049 12.3644 6.55368 12.5674 6.53771Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_109_6694"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "16",
+									"height": "16",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Speaker"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/Speaker.tsx b/app/components/base/icons/src/vender/solid/mediaAndDevices/Speaker.tsx
new file mode 100644
index 0000000..0cf9364
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/Speaker.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Speaker.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Speaker'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/StopCircle.json b/app/components/base/icons/src/vender/solid/mediaAndDevices/StopCircle.json
new file mode 100644
index 0000000..67e02fc
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/StopCircle.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "20",
+			"height": "20",
+			"viewBox": "0 0 20 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "stop-circle"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M9.99992 0.833984C4.93731 0.833984 0.833252 4.93804 0.833252 10.0007C0.833252 15.0633 4.93731 19.1673 9.99992 19.1673C15.0625 19.1673 19.1666 15.0633 19.1666 10.0007C19.1666 4.93804 15.0625 0.833984 9.99992 0.833984ZM6.75741 7.12232C6.66658 7.30058 6.66658 7.53394 6.66658 8.00065V12.0006C6.66658 12.4674 6.66658 12.7007 6.75741 12.879C6.83731 13.0358 6.96479 13.1633 7.12159 13.2432C7.29985 13.334 7.53321 13.334 7.99992 13.334H11.9999C12.4666 13.334 12.7 13.334 12.8782 13.2432C13.035 13.1633 13.1625 13.0358 13.2424 12.879C13.3333 12.7007 13.3333 12.4674 13.3333 12.0006V8.00065C13.3333 7.53394 13.3333 7.30058 13.2424 7.12232C13.1625 6.96552 13.035 6.83804 12.8782 6.75814C12.7 6.66732 12.4666 6.66732 11.9999 6.66732H7.99992C7.53321 6.66732 7.29985 6.66732 7.12159 6.75814C6.96479 6.83804 6.83731 6.96552 6.75741 7.12232Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "StopCircle"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/StopCircle.tsx b/app/components/base/icons/src/vender/solid/mediaAndDevices/StopCircle.tsx
new file mode 100644
index 0000000..84430c3
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/StopCircle.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './StopCircle.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'StopCircle'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/VideoSupportIcon.json b/app/components/base/icons/src/vender/solid/mediaAndDevices/VideoSupportIcon.json
new file mode 100644
index 0000000..4bc6881
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/VideoSupportIcon.json
@@ -0,0 +1,26 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"xmlns": "http://www.w3.org/2000/svg",
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"d": "M10.2334 4.3469L10.3567 4.06406C10.5764 3.55974 10.9723 3.15821 11.4662 2.93854L11.846 2.76961C12.0514 2.67827 12.0514 2.37941 11.846 2.28806L11.4874 2.12857C10.9808 1.90326 10.5779 1.48687 10.3619 0.965415L10.2353 0.659765C10.1471 0.446745 9.8529 0.446745 9.76465 0.659765L9.63805 0.965415C9.4221 1.48687 9.0192 1.90326 8.5126 2.12857L8.154 2.28806C7.94865 2.37941 7.94865 2.67827 8.154 2.76961L8.53385 2.93854C9.02775 3.15821 9.42355 3.55974 9.6433 4.06406L9.76655 4.3469C9.8568 4.55396 10.1432 4.55396 10.2334 4.3469ZM1.4959 1.5H7V2.5H4V9.5H8V4.5H9V5.5H10H11V10.0033C11 10.2776 10.7723 10.5 10.5041 10.5H1.4959C1.22203 10.5 1 10.2775 1 10.0033V1.9967C1 1.72238 1.22766 1.5 1.4959 1.5ZM2 2.5V3.5H3V2.5H2ZM2 4.5V5.5H3V4.5H2ZM2 6.5V7.5H3V6.5H2ZM9 6.5V7.5H10V6.5H9ZM2 8.5V9.5H3V8.5H2ZM9 8.5V9.5H10V8.5H9Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "VideoSupportIcon"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/VideoSupportIcon.tsx b/app/components/base/icons/src/vender/solid/mediaAndDevices/VideoSupportIcon.tsx
new file mode 100644
index 0000000..4822f83
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/VideoSupportIcon.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './VideoSupportIcon.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'VideoSupportIcon'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/mediaAndDevices/index.ts b/app/components/base/icons/src/vender/solid/mediaAndDevices/index.ts
new file mode 100644
index 0000000..7c313fe
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/mediaAndDevices/index.ts
@@ -0,0 +1,12 @@
+export { default as AudioSupportIcon } from './AudioSupportIcon'
+export { default as DocumentSupportIcon } from './DocumentSupportIcon'
+export { default as MagicBox } from './MagicBox'
+export { default as MagicEyes } from './MagicEyes'
+export { default as MagicWand } from './MagicWand'
+export { default as Microphone01 } from './Microphone01'
+export { default as Play } from './Play'
+export { default as Robot } from './Robot'
+export { default as Sliders02 } from './Sliders02'
+export { default as Speaker } from './Speaker'
+export { default as StopCircle } from './StopCircle'
+export { default as VideoSupportIcon } from './VideoSupportIcon'
diff --git a/app/components/base/icons/src/vender/solid/security/Lock01.json b/app/components/base/icons/src/vender/solid/security/Lock01.json
new file mode 100644
index 0000000..aa01bc5
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/security/Lock01.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "lock-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M3 4C3 2.34315 4.34315 1 6 1C7.65685 1 9 2.34315 9 4V4.57516C9.1413 4.60613 9.27693 4.65121 9.40798 4.71799C9.78431 4.90973 10.0903 5.2157 10.282 5.59202C10.4057 5.83469 10.4549 6.09304 10.4779 6.37409C10.5 6.64468 10.5 6.97686 10.5 7.37934V8.12066C10.5 8.52314 10.5 8.85532 10.4779 9.12591C10.4549 9.40696 10.4057 9.66531 10.282 9.90798C10.0903 10.2843 9.78431 10.5903 9.40798 10.782C9.16531 10.9057 8.90696 10.9549 8.62591 10.9779C8.35531 11 8.02313 11 7.62064 11H4.37936C3.97687 11 3.64469 11 3.37409 10.9779C3.09304 10.9549 2.83469 10.9057 2.59202 10.782C2.2157 10.5903 1.90973 10.2843 1.71799 9.90798C1.59434 9.66531 1.54506 9.40696 1.5221 9.12591C1.49999 8.85532 1.49999 8.52314 1.5 8.12066V7.37934C1.49999 6.97687 1.49999 6.64468 1.5221 6.37409C1.54506 6.09304 1.59434 5.83469 1.71799 5.59202C1.90973 5.2157 2.2157 4.90973 2.59202 4.71799C2.72307 4.65121 2.8587 4.60613 3 4.57516V4ZM8 4V4.50081H4V4C4 2.89543 4.89543 2 6 2C7.10457 2 8 2.89543 8 4ZM6.5 7.25C6.5 6.97386 6.27614 6.75 6 6.75C5.72386 6.75 5.5 6.97386 5.5 7.25V8.25C5.5 8.52614 5.72386 8.75 6 8.75C6.27614 8.75 6.5 8.52614 6.5 8.25V7.25Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Lock01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/security/Lock01.tsx b/app/components/base/icons/src/vender/solid/security/Lock01.tsx
new file mode 100644
index 0000000..ea192d8
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/security/Lock01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Lock01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Lock01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/security/index.ts b/app/components/base/icons/src/vender/solid/security/index.ts
new file mode 100644
index 0000000..4879d82
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/security/index.ts
@@ -0,0 +1 @@
+export { default as Lock01 } from './Lock01'
diff --git a/app/components/base/icons/src/vender/solid/shapes/Corner.json b/app/components/base/icons/src/vender/solid/shapes/Corner.json
new file mode 100644
index 0000000..2f35483
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/shapes/Corner.json
@@ -0,0 +1,27 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "13",
+			"height": "20",
+			"viewBox": "0 0 13 20",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "path",
+				"attributes": {
+					"id": "Shape",
+					"d": "M0 0H13V20C9.98017 20 7.26458 18.1615 6.14305 15.3576L0 0Z",
+					"fill": "currentColor"
+				},
+				"children": []
+			}
+		]
+	},
+	"name": "Corner"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/shapes/Corner.tsx b/app/components/base/icons/src/vender/solid/shapes/Corner.tsx
new file mode 100644
index 0000000..6b02e92
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/shapes/Corner.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Corner.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Corner'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/shapes/Star04.json b/app/components/base/icons/src/vender/solid/shapes/Star04.json
new file mode 100644
index 0000000..5e5393a
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/shapes/Star04.json
@@ -0,0 +1,36 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "11",
+			"height": "10",
+			"viewBox": "0 0 11 10",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "star-04"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Solid",
+							"d": "M5.88897 0.683596C5.82708 0.522683 5.67249 0.416504 5.50008 0.416504C5.32768 0.416504 5.17308 0.522683 5.11119 0.683596L4.27287 2.86321C4.1477 3.18865 4.10837 3.28243 4.05457 3.35809C4.00059 3.43401 3.93426 3.50034 3.85834 3.55433C3.78267 3.60813 3.68889 3.64746 3.36346 3.77263L1.18384 4.61094C1.02293 4.67283 0.916748 4.82743 0.916748 4.99984C0.916748 5.17224 1.02293 5.32684 1.18384 5.38873L3.36346 6.22705C3.68889 6.35221 3.78267 6.39155 3.85834 6.44535C3.93426 6.49933 4.00059 6.56566 4.05457 6.64158C4.10837 6.71724 4.1477 6.81102 4.27287 7.13646L5.11119 9.31608C5.17308 9.47699 5.32768 9.58317 5.50008 9.58317C5.67249 9.58317 5.82709 9.47699 5.88898 9.31608L6.72729 7.13646C6.85246 6.81102 6.89179 6.71724 6.94559 6.64158C6.99957 6.56566 7.06591 6.49933 7.14183 6.44535C7.21749 6.39155 7.31127 6.35221 7.6367 6.22705L9.81632 5.38873C9.97723 5.32684 10.0834 5.17224 10.0834 4.99984C10.0834 4.82743 9.97723 4.67283 9.81632 4.61094L7.6367 3.77263C7.31127 3.64746 7.21749 3.60813 7.14183 3.55433C7.06591 3.50034 6.99957 3.43401 6.94559 3.35809C6.89179 3.28243 6.85246 3.18865 6.72729 2.86321L5.88897 0.683596Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Star04"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/shapes/Star04.tsx b/app/components/base/icons/src/vender/solid/shapes/Star04.tsx
new file mode 100644
index 0000000..eb699cd
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/shapes/Star04.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Star04.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Star04'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/shapes/Star06.json b/app/components/base/icons/src/vender/solid/shapes/Star06.json
new file mode 100644
index 0000000..0466602
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/shapes/Star06.json
@@ -0,0 +1,62 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "star-06"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M3.66675 1.33268C3.66675 0.964492 3.36827 0.666016 3.00008 0.666016C2.63189 0.666016 2.33341 0.964492 2.33341 1.33268V2.33268H1.33341C0.965225 2.33268 0.666748 2.63116 0.666748 2.99935C0.666748 3.36754 0.965225 3.66602 1.33341 3.66602H2.33341V4.66602C2.33341 5.0342 2.63189 5.33268 3.00008 5.33268C3.36827 5.33268 3.66675 5.0342 3.66675 4.66602V3.66602H4.66675C5.03494 3.66602 5.33341 3.36754 5.33341 2.99935C5.33341 2.63116 5.03494 2.33268 4.66675 2.33268H3.66675V1.33268Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M3.66675 11.3327C3.66675 10.9645 3.36827 10.666 3.00008 10.666C2.63189 10.666 2.33341 10.9645 2.33341 11.3327V12.3327H1.33341C0.965225 12.3327 0.666748 12.6312 0.666748 12.9993C0.666748 13.3675 0.965225 13.666 1.33341 13.666H2.33341V14.666C2.33341 15.0342 2.63189 15.3327 3.00008 15.3327C3.36827 15.3327 3.66675 15.0342 3.66675 14.666V13.666H4.66675C5.03494 13.666 5.33341 13.3675 5.33341 12.9993C5.33341 12.6312 5.03494 12.3327 4.66675 12.3327H3.66675V11.3327Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M9.28898 1.76003C9.18995 1.50257 8.94259 1.33268 8.66675 1.33268C8.3909 1.33268 8.14354 1.50257 8.04452 1.76003L6.8884 4.76594C6.68813 5.28663 6.6252 5.43668 6.53912 5.55774C6.45274 5.67921 6.34661 5.78534 6.22514 5.87172C6.10408 5.9578 5.95403 6.02073 5.43334 6.221L2.42743 7.37712C2.16997 7.47614 2.00008 7.7235 2.00008 7.99935C2.00008 8.2752 2.16997 8.52256 2.42743 8.62158L5.43334 9.7777C5.95403 9.97797 6.10408 10.0409 6.22514 10.127C6.34661 10.2134 6.45274 10.3195 6.53912 10.441C6.6252 10.562 6.68813 10.7121 6.8884 11.2328L8.04452 14.2387C8.14354 14.4961 8.3909 14.666 8.66675 14.666C8.9426 14.666 9.18995 14.4961 9.28898 14.2387L10.4451 11.2328C10.6454 10.7121 10.7083 10.562 10.7944 10.441C10.8808 10.3195 10.9869 10.2134 11.1084 10.127C11.2294 10.0409 11.3795 9.97797 11.9002 9.7777L14.9061 8.62158C15.1635 8.52256 15.3334 8.2752 15.3334 7.99935C15.3334 7.7235 15.1635 7.47614 14.9061 7.37712L11.9002 6.221C11.3795 6.02073 11.2294 5.9578 11.1084 5.87172C10.9869 5.78534 10.8808 5.67921 10.7944 5.55774C10.7083 5.43668 10.6454 5.28663 10.4451 4.76594L9.28898 1.76003Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Star06"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/shapes/Star06.tsx b/app/components/base/icons/src/vender/solid/shapes/Star06.tsx
new file mode 100644
index 0000000..9b320a6
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/shapes/Star06.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Star06.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Star06'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/shapes/index.ts b/app/components/base/icons/src/vender/solid/shapes/index.ts
new file mode 100644
index 0000000..2768e39
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/shapes/index.ts
@@ -0,0 +1,3 @@
+export { default as Corner } from './Corner'
+export { default as Star04 } from './Star04'
+export { default as Star06 } from './Star06'
diff --git a/app/components/base/icons/src/vender/solid/users/User01.json b/app/components/base/icons/src/vender/solid/users/User01.json
new file mode 100644
index 0000000..c9b8ea9
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/users/User01.json
@@ -0,0 +1,57 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "user-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M5.85731 9.66669C7.28575 9.66701 8.71419 9.66701 10.1426 9.66669C10.6271 9.66659 10.9572 9.66652 11.2455 9.71735C12.6255 9.96068 13.706 11.0412 13.9493 12.4212C14.0002 12.7095 14.0001 13.0396 14 13.524C14 13.6296 14.0032 13.7359 13.9848 13.8404C13.9118 14.2544 13.5876 14.5785 13.1736 14.6515C13.0828 14.6675 12.9872 14.667 12.9396 14.6668C9.64686 14.6491 6.35308 14.6491 3.06031 14.6668C3.01274 14.667 2.9171 14.6675 2.82632 14.6515C2.41231 14.5785 2.08816 14.2544 2.01516 13.8404C1.99675 13.7359 1.99998 13.6296 1.99996 13.524C1.99985 13.0396 1.99978 12.7095 2.05061 12.4212C2.29395 11.0412 3.37444 9.96068 4.75447 9.71735C5.04275 9.66652 5.37286 9.66659 5.85731 9.66669Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M4.3333 5.00004C4.3333 2.975 5.97493 1.33337 7.99997 1.33337C10.025 1.33337 11.6666 2.975 11.6666 5.00004C11.6666 7.02508 10.025 8.66671 7.99997 8.66671C5.97493 8.66671 4.3333 7.02508 4.3333 5.00004Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "User01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/users/User01.tsx b/app/components/base/icons/src/vender/solid/users/User01.tsx
new file mode 100644
index 0000000..24fd0df
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/users/User01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './User01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'User01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/users/UserEdit02.json b/app/components/base/icons/src/vender/solid/users/UserEdit02.json
new file mode 100644
index 0000000..f4451ea
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/users/UserEdit02.json
@@ -0,0 +1,92 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "user-edit 2",
+					"clip-path": "url(#clip0_10419_49994)"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Group"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector",
+									"d": "M5.83333 6.41667C7.60525 6.41667 9.04167 4.98025 9.04167 3.20833C9.04167 1.43642 7.60525 0 5.83333 0C4.06142 0 2.625 1.43642 2.625 3.20833C2.625 4.98025 4.06142 6.41667 5.83333 6.41667Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_2",
+									"d": "M5.90917 13.2465L6.78417 10.6221C6.85533 10.4086 6.97725 10.2114 7.1365 10.0522L8.79083 8.39783C7.92225 7.88391 6.91308 7.5835 5.83333 7.5835C2.61683 7.5835 0 10.2003 0 13.4168C0 13.7394 0.261333 14.0002 0.583333 14.0002H5.86717C5.817 13.7546 5.82575 13.4962 5.90917 13.2465Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"id": "Vector_3",
+									"d": "M13.5524 7.44766C12.9562 6.85208 11.9856 6.85208 11.39 7.44766L7.96057 10.8771C7.92849 10.9092 7.90457 10.9482 7.88999 10.9908L7.01499 13.6158C6.97999 13.7208 7.0074 13.8363 7.08557 13.9145C7.14099 13.9705 7.21565 13.9997 7.29207 13.9997C7.32299 13.9997 7.3539 13.9944 7.38424 13.9851L10.0092 13.1101C10.0524 13.0961 10.0915 13.0716 10.123 13.0395L13.5524 9.61008C14.148 9.0145 14.148 8.04383 13.5524 7.44766Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			},
+			{
+				"type": "element",
+				"name": "defs",
+				"attributes": {},
+				"children": [
+					{
+						"type": "element",
+						"name": "clipPath",
+						"attributes": {
+							"id": "clip0_10419_49994"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "rect",
+								"attributes": {
+									"width": "14",
+									"height": "14",
+									"fill": "white"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "UserEdit02"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/users/UserEdit02.tsx b/app/components/base/icons/src/vender/solid/users/UserEdit02.tsx
new file mode 100644
index 0000000..588b6ae
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/users/UserEdit02.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './UserEdit02.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'UserEdit02'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/users/Users01.json b/app/components/base/icons/src/vender/solid/users/Users01.json
new file mode 100644
index 0000000..c18d59a
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/users/Users01.json
@@ -0,0 +1,79 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "users-01"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M12.0211 9.91782C12.1128 9.56125 12.4763 9.34659 12.8329 9.43837C14.2704 9.80837 15.3334 11.1125 15.3334 12.6666V14C15.3334 14.3682 15.0349 14.6666 14.6667 14.6666C14.2985 14.6666 14 14.3682 14 14V12.6666C14 11.7356 13.3633 10.9517 12.5005 10.7296C12.1439 10.6378 11.9293 10.2744 12.0211 9.91782Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M9.7154 1.94368C9.85355 1.60239 10.2422 1.43771 10.5835 1.57586C11.8039 2.06985 12.6667 3.26669 12.6667 4.66665C12.6667 6.0666 11.8039 7.26344 10.5835 7.75743C10.2422 7.89558 9.85355 7.73091 9.7154 7.38962C9.57725 7.04833 9.74193 6.65967 10.0832 6.52152C10.8174 6.22432 11.3334 5.50494 11.3334 4.66665C11.3334 3.82835 10.8174 3.10897 10.0832 2.81178C9.74193 2.67363 9.57725 2.28496 9.7154 1.94368Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M4.78598 9.33329C5.81757 9.33363 6.84915 9.33363 7.88073 9.33329C8.60781 9.33305 9.10395 9.33289 9.52942 9.44689C10.6797 9.75512 11.5782 10.6536 11.8864 11.8039C12.0399 12.3768 11.9955 12.989 12.0001 13.576C12.0007 13.6473 12.0019 13.7915 11.966 13.9255C11.8735 14.2706 11.6039 14.5401 11.2588 14.6326C11.1248 14.6685 10.9807 14.6673 10.9094 14.6668C7.85941 14.6424 4.80731 14.6424 1.7573 14.6668C1.68602 14.6673 1.54188 14.6685 1.40787 14.6326C1.06278 14.5401 0.793233 14.2706 0.700765 13.9255C0.664858 13.7915 0.666007 13.6473 0.666575 13.576C0.671243 12.9905 0.627014 12.3759 0.780272 11.8039C1.0885 10.6536 1.98699 9.75512 3.13729 9.44689C3.56277 9.33289 4.05891 9.33305 4.78598 9.33329Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M3.00002 4.66665C3.00002 2.8257 4.49241 1.33331 6.33336 1.33331C8.17431 1.33331 9.66669 2.8257 9.66669 4.66665C9.66669 6.5076 8.17431 7.99998 6.33336 7.99998C4.49241 7.99998 3.00002 6.5076 3.00002 4.66665Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Users01"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/users/Users01.tsx b/app/components/base/icons/src/vender/solid/users/Users01.tsx
new file mode 100644
index 0000000..f26ff03
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/users/Users01.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Users01.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Users01'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/users/UsersPlus.json b/app/components/base/icons/src/vender/solid/users/UsersPlus.json
new file mode 100644
index 0000000..a70117f
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/users/UsersPlus.json
@@ -0,0 +1,77 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "24",
+			"viewBox": "0 0 24 24",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "users-plus"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Solid"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M20 15C20 14.4477 19.5523 14 19 14C18.4477 14 18 14.4477 18 15V17H16C15.4477 17 15 17.4477 15 18C15 18.5523 15.4477 19 16 19H18V21C18 21.5523 18.4477 22 19 22C19.5523 22 20 21.5523 20 21V19H22C22.5523 19 23 18.5523 23 18C23 17.4477 22.5523 17 22 17H20V15Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M12.181 14.1635C12.4632 14.3073 12.6927 14.5368 12.8365 14.819C12.9896 15.1194 13.0001 15.4476 13 15.7769C13 15.7847 13 15.7924 13 15.8C13 17.2744 12.9995 18.7488 13 20.2231C13.0001 20.3422 13.0001 20.4845 12.9899 20.6098C12.978 20.755 12.9476 20.963 12.8365 21.181C12.6927 21.4632 12.4632 21.6927 12.181 21.8365C11.963 21.9476 11.7551 21.978 11.6098 21.9899C11.4845 22.0001 11.3423 22.0001 11.2231 22C8.4077 21.999 5.59226 21.999 2.77682 22C2.65755 22.0001 2.51498 22.0001 2.38936 21.9898C2.24364 21.9778 2.03523 21.9472 1.81695 21.8356C1.53435 21.6911 1.30428 21.46 1.16109 21.1767C1.05079 20.9585 1.02087 20.7506 1.0095 20.6046C0.999737 20.4791 1.00044 20.3369 1.00103 20.2185C1.00619 19.1792 0.975203 18.0653 1.38061 17.0866C1.88808 15.8614 2.86145 14.8881 4.08659 14.3806C4.59629 14.1695 5.13457 14.0819 5.74331 14.0404C6.33532 14 7.06273 14 7.96449 14C9.05071 14 10.1369 14.0004 11.2231 14C11.5524 13.9999 11.8806 14.0104 12.181 14.1635Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M14.5731 2.91554C14.7803 2.40361 15.3633 2.1566 15.8752 2.36382C17.7058 3.10481 19 4.90006 19 7C19 9.09994 17.7058 10.8952 15.8752 11.6362C15.3633 11.8434 14.7803 11.5964 14.5731 11.0845C14.3658 10.5725 14.6129 9.98953 15.1248 9.7823C16.2261 9.33652 17 8.25744 17 7C17 5.74256 16.2261 4.66348 15.1248 4.2177C14.6129 4.01047 14.3658 3.42748 14.5731 2.91554Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M4.50001 7C4.50001 4.23858 6.73858 2 9.50001 2C12.2614 2 14.5 4.23858 14.5 7C14.5 9.76142 12.2614 12 9.50001 12C6.73858 12 4.50001 9.76142 4.50001 7Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "UsersPlus"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/solid/users/UsersPlus.tsx b/app/components/base/icons/src/vender/solid/users/UsersPlus.tsx
new file mode 100644
index 0000000..3594435
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/users/UsersPlus.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './UsersPlus.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'UsersPlus'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/solid/users/index.ts b/app/components/base/icons/src/vender/solid/users/index.ts
new file mode 100644
index 0000000..4c969bf
--- /dev/null
+++ b/app/components/base/icons/src/vender/solid/users/index.ts
@@ -0,0 +1,4 @@
+export { default as User01 } from './User01'
+export { default as UserEdit02 } from './UserEdit02'
+export { default as Users01 } from './Users01'
+export { default as UsersPlus } from './UsersPlus'
diff --git a/app/components/base/icons/src/vender/workflow/Agent.json b/app/components/base/icons/src/vender/workflow/Agent.json
new file mode 100644
index 0000000..e7ed193
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Agent.json
@@ -0,0 +1,53 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "agent"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M14.7401 5.80454C14.5765 4.77996 14.1638 3.79808 13.5306 2.97273C12.8973 2.14738 12.0648 1.48568 11.1185 1.06589C10.1722 0.646098 9.12632 0.461106 8.08751 0.546487C7.05582 0.624753 6.04548 0.966277 5.17744 1.53548C4.3094 2.09758 3.58366 2.88024 3.09272 3.79808C2.59466 4.70881 2.33852 5.7405 2.33852 6.7793V7.22756L1.25703 9.3692C1.04357 9.80322 1.22145 10.3368 1.65547 10.5574L2.3314 10.8989V12.3006C2.3314 12.82 2.53063 13.3038 2.90061 13.6738C3.2706 14.0367 3.75442 14.243 4.27382 14.243H6.01702V14.7624C6.01702 15.1538 6.3372 15.4739 6.72853 15.4739C7.11986 15.4739 7.44004 15.1538 7.44004 14.7624V13.7094C7.44004 13.2185 7.04159 12.82 6.55065 12.82H4.27382C4.13864 12.82 4.00345 12.7631 3.91095 12.6706C3.81846 12.5781 3.76154 12.4429 3.76154 12.3077V10.5716C3.76154 10.2301 3.56943 9.92417 3.2706 9.77476L2.77254 9.52573L3.66904 7.73984C3.72596 7.61889 3.76154 7.4837 3.76154 7.34851V6.77219C3.76154 5.96818 3.96076 5.17129 4.34498 4.4669C4.72919 3.76251 5.28417 3.15772 5.9601 2.7237C6.63603 2.28968 7.41158 2.02643 8.20847 1.96239C9.00536 1.89835 9.81648 2.04066 10.5493 2.36795C11.2822 2.69524 11.9225 3.20042 12.4135 3.84077C12.8973 4.47402 13.2246 5.23533 13.3456 6.02511C13.4665 6.81488 13.3954 7.63312 13.125 8.38731C12.8617 9.12017 12.4206 9.78187 11.8585 10.3084C11.6735 10.4792 11.5668 10.7139 11.5668 10.9701V14.7624C11.5668 15.1538 11.887 15.4739 12.2783 15.4739C12.6696 15.4739 12.9898 15.1538 12.9898 14.7624V11.1978C13.6515 10.5432 14.1567 9.73918 14.4697 8.87114C14.8184 7.89637 14.918 6.83623 14.7615 5.81165L14.7401 5.80454Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M10.8055 7.99599C10.8909 7.83234 10.962 7.66158 11.0189 7.4837H11.6522C12.0435 7.4837 12.3637 7.16352 12.3637 6.77219C12.3637 6.38086 12.0435 6.06068 11.6522 6.06068H11.0189C10.9691 5.8828 10.898 5.71204 10.8055 5.54839L11.2537 5.10014C11.5312 4.82266 11.5312 4.3744 11.2537 4.09692C10.9762 3.81943 10.528 3.81943 10.2505 4.09692L9.80225 4.54517C9.6386 4.45267 9.46784 4.38863 9.28996 4.33171V3.69847C9.28996 3.30714 8.96978 2.98696 8.57845 2.98696C8.18712 2.98696 7.86694 3.30714 7.86694 3.69847V4.33171C7.68907 4.38152 7.5183 4.45267 7.35466 4.54517L6.90641 4.09692C6.62892 3.81943 6.18067 3.81943 5.90318 4.09692C5.62569 4.3744 5.62569 4.82266 5.90318 5.10014L6.35143 5.54839C6.26605 5.71204 6.1949 5.8828 6.13798 6.06068H5.50473C5.1134 6.06068 4.79323 6.38086 4.79323 6.77219C4.79323 7.16352 5.1134 7.4837 5.50473 7.4837H6.13798C6.18778 7.66158 6.25893 7.83234 6.35143 7.99599L5.90318 8.44424C5.62569 8.72172 5.62569 9.16997 5.90318 9.44746C6.04548 9.58976 6.22336 9.6538 6.40835 9.6538C6.59334 9.6538 6.77122 9.58265 6.91352 9.44746L7.36177 8.99921C7.52542 9.08459 7.69618 9.15574 7.87406 9.21267V9.84591C7.87406 10.2372 8.19424 10.5574 8.58557 10.5574C8.9769 10.5574 9.29708 10.2372 9.29708 9.84591V9.21267C9.47496 9.16286 9.64572 9.09171 9.80936 8.99921L10.2576 9.44746C10.3999 9.58976 10.5778 9.6538 10.7628 9.6538C10.9478 9.6538 11.1257 9.58265 11.268 9.44746C11.5454 9.16997 11.5454 8.72172 11.268 8.44424L10.8197 7.99599H10.8055ZM7.44004 6.77219C7.44004 6.14606 7.94521 5.64089 8.57134 5.64089C9.19747 5.64089 9.70264 6.14606 9.70264 6.77219C9.70264 7.39832 9.19747 7.90349 8.57134 7.90349C7.94521 7.90349 7.44004 7.39832 7.44004 6.77219Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Agent"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/Agent.tsx b/app/components/base/icons/src/vender/workflow/Agent.tsx
new file mode 100644
index 0000000..58a2426
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Agent.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Agent.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Agent'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/Answer.json b/app/components/base/icons/src/vender/workflow/Answer.json
new file mode 100644
index 0000000..4f15b33
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Answer.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "icons/answer"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector (Stroke)",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M3.50114 1.67701L10.5011 1.677C11.5079 1.677 12.3241 2.49311 12.3241 3.49992V9.35414C12.3241 10.3609 11.5079 11.177 10.5012 11.1771H8.9954L7.41734 12.4845C7.17339 12.6866 6.81987 12.6856 6.57708 12.4821L5.02026 11.1771H3.50114C2.49436 11.1771 1.67822 10.3608 1.67822 9.35414V3.49993C1.67822 2.49316 2.49437 1.67701 3.50114 1.67701ZM10.5011 2.9895L3.50114 2.98951C3.21924 2.98951 2.99072 3.21803 2.99072 3.49993V9.35414C2.99072 9.63601 3.21926 9.86455 3.50114 9.86455H5.04675C5.33794 9.86455 5.61984 9.96705 5.84302 10.1541L7.00112 11.1249L8.17831 10.1496C8.40069 9.96537 8.68041 9.86455 8.96916 9.86455H10.5011C10.5011 9.86455 10.5011 9.86455 10.5011 9.86455C10.783 9.8645 11.0116 9.63592 11.0116 9.35414V3.49992C11.0116 3.21806 10.7831 2.9895 10.5011 2.9895ZM9.06809 4.93171C9.32437 5.18799 9.32437 5.60351 9.06809 5.85979L7.02642 7.90146C6.77014 8.15774 6.35464 8.15774 6.09835 7.90146L5.22333 7.02646C4.96704 6.77019 4.96704 6.35467 5.22332 6.09839C5.4796 5.8421 5.89511 5.8421 6.15139 6.09837L6.56238 6.50935L8.14001 4.93171C8.3963 4.67543 8.81181 4.67543 9.06809 4.93171Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Answer"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/Answer.tsx b/app/components/base/icons/src/vender/workflow/Answer.tsx
new file mode 100644
index 0000000..91bf788
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Answer.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Answer.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Answer'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/Assigner.json b/app/components/base/icons/src/vender/workflow/Assigner.json
new file mode 100644
index 0000000..7106e5a
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Assigner.json
@@ -0,0 +1,68 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "variable assigner"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M1.71438 4.42875C1.71438 3.22516 2.68954 2.25 3.89313 2.25C4.30734 2.25 4.64313 2.58579 4.64313 3C4.64313 3.41421 4.30734 3.75 3.89313 3.75C3.51796 3.75 3.21438 4.05359 3.21438 4.42875V7.28563C3.21438 7.48454 3.13536 7.6753 2.9947 7.81596L2.81066 8L2.9947 8.18404C3.13536 8.3247 3.21438 8.51546 3.21438 8.71437V11.5713C3.21438 11.9464 3.51796 12.25 3.89313 12.25C4.30734 12.25 4.64313 12.5858 4.64313 13C4.64313 13.4142 4.30734 13.75 3.89313 13.75C2.68954 13.75 1.71438 12.7748 1.71438 11.5713V9.02503L1.21967 8.53033C1.07902 8.38968 1 8.19891 1 8C1 7.80109 1.07902 7.61032 1.21967 7.46967L1.71438 6.97497V4.42875ZM11.3568 3C11.3568 2.58579 11.6925 2.25 12.1068 2.25C13.3103 2.25 14.2855 3.22516 14.2855 4.42875V6.97497L14.7802 7.46967C14.9209 7.61032 14.9999 7.80109 14.9999 8C14.9999 8.19891 14.9209 8.38968 14.7802 8.53033L14.2855 9.02503V11.5713C14.2855 12.7751 13.3095 13.75 12.1068 13.75C11.6925 13.75 11.3568 13.4142 11.3568 13C11.3568 12.5858 11.6925 12.25 12.1068 12.25C12.4815 12.25 12.7855 11.9462 12.7855 11.5713V8.71437C12.7855 8.51546 12.8645 8.3247 13.0052 8.18404L13.1892 8L13.0052 7.81596C12.8645 7.6753 12.7855 7.48454 12.7855 7.28563V4.42875C12.7855 4.05359 12.4819 3.75 12.1068 3.75C11.6925 3.75 11.3568 3.41421 11.3568 3Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M5.25 6C5.25 5.58579 5.58579 5.25 6 5.25H10C10.4142 5.25 10.75 5.58579 10.75 6C10.75 6.41421 10.4142 6.75 10 6.75H6C5.58579 6.75 5.25 6.41421 5.25 6Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M5.25 10C5.25 9.58579 5.58579 9.25 6 9.25H10C10.4142 9.25 10.75 9.58579 10.75 10C10.75 10.4142 10.4142 10.75 10 10.75H6C5.58579 10.75 5.25 10.4142 5.25 10Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Assigner"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/Assigner.tsx b/app/components/base/icons/src/vender/workflow/Assigner.tsx
new file mode 100644
index 0000000..c4d1382
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Assigner.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Assigner.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Assigner'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/Code.json b/app/components/base/icons/src/vender/workflow/Code.json
new file mode 100644
index 0000000..d94f12a
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Code.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "icons/code"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector (Stroke)",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M8.32593 1.69675C8.67754 1.78466 8.89132 2.14096 8.80342 2.49257L6.47009 11.8259C6.38218 12.1775 6.02588 12.3913 5.67427 12.3034C5.32265 12.2155 5.10887 11.8592 5.19678 11.5076L7.53011 2.17424C7.61801 1.82263 7.97431 1.60885 8.32593 1.69675ZM3.96414 4.20273C4.22042 4.45901 4.22042 4.87453 3.96413 5.13081L2.45578 6.63914C2.45577 6.63915 2.45578 6.63914 2.45578 6.63914C2.25645 6.83851 2.25643 7.16168 2.45575 7.36103C2.45574 7.36103 2.45576 7.36104 2.45575 7.36103L3.96413 8.86936C4.22041 9.12564 4.22042 9.54115 3.96414 9.79744C3.70787 10.0537 3.29235 10.0537 3.03607 9.79745L1.52769 8.28913C0.815811 7.57721 0.815803 6.42302 1.52766 5.7111L3.03606 4.20272C3.29234 3.94644 3.70786 3.94644 3.96414 4.20273ZM10.0361 4.20273C10.2923 3.94644 10.7078 3.94644 10.9641 4.20272L12.4725 5.71108C13.1843 6.423 13.1844 7.57717 12.4725 8.28909L10.9641 9.79745C10.7078 10.0537 10.2923 10.0537 10.036 9.79744C9.77977 9.54115 9.77978 9.12564 10.0361 8.86936L11.5444 7.36107C11.7437 7.16172 11.7438 6.83854 11.5444 6.63917C11.5444 6.63915 11.5445 6.63918 11.5444 6.63917L10.0361 5.13081C9.77978 4.87453 9.77978 4.45901 10.0361 4.20273Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Code"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/Code.tsx b/app/components/base/icons/src/vender/workflow/Code.tsx
new file mode 100644
index 0000000..1ec2e49
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Code.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Code.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Code'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/DocsExtractor.json b/app/components/base/icons/src/vender/workflow/DocsExtractor.json
new file mode 100644
index 0000000..5b45459
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/DocsExtractor.json
@@ -0,0 +1,64 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "docs-extractor"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M2.66663 3.33325C2.66663 2.22869 3.56206 1.33325 4.66663 1.33325H12.6666C13.0348 1.33325 13.3333 1.63173 13.3333 1.99992V13.9999C13.3333 14.3681 13.0348 14.6666 12.6666 14.6666H4.66663C3.56206 14.6666 2.66663 13.7712 2.66663 12.6666V3.33325ZM3.99996 10.7804V3.33325C3.99996 2.96507 4.29844 2.66659 4.66663 2.66659H12V10.6666H4.66663C4.43287 10.6666 4.20848 10.7067 3.99996 10.7804ZM12 11.9999H4.66663C4.29844 11.9999 3.99996 12.2984 3.99996 12.6666C3.99996 13.0348 4.29844 13.3333 4.66663 13.3333H12V11.9999Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M8.12296 4.9385C8.18749 4.90624 8.23983 4.85394 8.27203 4.78942L8.70203 3.92954C8.82483 3.68385 9.17543 3.68385 9.29829 3.92954L9.72823 4.78942C9.76049 4.85394 9.81276 4.90624 9.87729 4.9385L10.7372 5.36844C10.9829 5.49128 10.9829 5.84189 10.7372 5.96473L9.87729 6.39467C9.81276 6.42692 9.76049 6.47923 9.72823 6.54375L9.29829 7.40365C9.17543 7.64932 8.82483 7.64932 8.70203 7.40365L8.27203 6.54375C8.23983 6.47923 8.18749 6.42692 8.12296 6.39467L7.26309 5.96473C7.01743 5.84189 7.01743 5.49128 7.26309 5.36844L8.12296 4.9385Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M5.71829 7.80752C5.757 7.78819 5.78838 7.75678 5.80773 7.71805L6.15459 7.02438C6.22829 6.87692 6.43865 6.87692 6.51236 7.02438L6.85923 7.71805C6.87856 7.75678 6.90996 7.78819 6.94863 7.80752L7.64236 8.15439C7.78976 8.22805 7.78976 8.43845 7.64236 8.51212L6.94863 8.85898C6.90996 8.87832 6.87856 8.90972 6.85923 8.94845L6.51236 9.64212C6.43865 9.78959 6.22829 9.78959 6.15459 9.64212L5.80773 8.94845C5.78838 8.90972 5.757 8.87832 5.71829 8.85898L5.02458 8.51212C4.87717 8.43845 4.87717 8.22805 5.02458 8.15439L5.71829 7.80752Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "DocsExtractor"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/DocsExtractor.tsx b/app/components/base/icons/src/vender/workflow/DocsExtractor.tsx
new file mode 100644
index 0000000..838fb8a
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/DocsExtractor.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './DocsExtractor.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'DocsExtractor'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/End.json b/app/components/base/icons/src/vender/workflow/End.json
new file mode 100644
index 0000000..3e281cb
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/End.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "icons/end"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector (Stroke)",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M6.67315 1.18094C6.87691 1.0639 7.12769 1.06475 7.33067 1.18315L10.8307 3.22481C11.0323 3.34242 11.1562 3.55826 11.1562 3.79167C11.1562 4.02507 11.0323 4.24091 10.8307 4.35852L7.65625 6.21026V9.91667C7.65625 10.2791 7.36244 10.5729 7 10.5729C6.63756 10.5729 6.34375 10.2791 6.34375 9.91667V5.84577C6.34361 5.83788 6.34361 5.83 6.34375 5.82213V1.75C6.34375 1.51502 6.46939 1.29797 6.67315 1.18094ZM7.65625 4.69078L9.19758 3.79167L7.65625 2.89256V4.69078ZM5.31099 8.25466C5.37977 8.61051 5.14704 8.95473 4.79119 9.0235C3.97285 9.18165 3.32667 9.41764 2.90374 9.67762C2.45323 9.95454 2.40625 10.1564 2.40625 10.2086C2.40625 10.2448 2.42254 10.3508 2.60674 10.5202C2.79151 10.6901 3.09509 10.8732 3.52555 11.0406C4.38229 11.3738 5.61047 11.594 7 11.594C8.38954 11.594 9.61773 11.3738 10.4745 11.0406C10.9049 10.8732 11.2085 10.6901 11.3933 10.5202C11.5775 10.3508 11.5938 10.2448 11.5938 10.2086C11.5938 10.1564 11.5468 9.95454 11.0963 9.67762C10.6733 9.41764 10.0271 9.18165 9.20881 9.0235C8.85296 8.95473 8.62023 8.61051 8.68901 8.25465C8.75778 7.8988 9.102 7.66608 9.45786 7.73485C10.3682 7.91077 11.1803 8.18867 11.7836 8.55947C12.3592 8.91331 12.9062 9.45912 12.9062 10.2086C12.9062 10.7361 12.6287 11.1672 12.2816 11.4864C11.935 11.805 11.4698 12.0618 10.9502 12.2639C9.90679 12.6696 8.50997 12.9065 7 12.9065C5.49004 12.9065 4.09322 12.6696 3.04983 12.2639C2.53023 12.0618 2.06497 11.805 1.7184 11.4864C1.37128 11.1672 1.09375 10.7361 1.09375 10.2086C1.09375 9.45913 1.64077 8.91332 2.21642 8.55947C2.81966 8.18867 3.63181 7.91077 4.54215 7.73485C4.898 7.66608 5.24222 7.8988 5.31099 8.25466Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "End"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/End.tsx b/app/components/base/icons/src/vender/workflow/End.tsx
new file mode 100644
index 0000000..8d7f693
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/End.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './End.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'End'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/Home.json b/app/components/base/icons/src/vender/workflow/Home.json
new file mode 100644
index 0000000..fd3096f
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Home.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "icons/home"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon (Stroke)",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M6.99999 2.44562C6.97241 2.46663 6.94086 2.49116 6.90151 2.52177L3.43971 5.21428C3.17896 5.41708 3.15115 5.44593 3.13396 5.46918C3.10759 5.50483 3.08794 5.545 3.07599 5.58771C3.0682 5.61555 3.0625 5.65522 3.0625 5.98554V9.67837C3.0625 9.97506 3.06301 10.1581 3.07422 10.2954C3.08463 10.4228 3.10101 10.4541 3.10219 10.4563C3.13714 10.5249 3.19296 10.5808 3.26156 10.6157C3.2638 10.6169 3.29514 10.6333 3.42254 10.6437C3.55984 10.6549 3.74289 10.6555 4.03958 10.6555H4.8125V7.53462C4.8125 7.52831 4.81249 7.52199 4.81249 7.51565C4.81247 7.38933 4.81245 7.25834 4.82163 7.14594C4.8319 7.02025 4.85685 6.86124 4.93966 6.69872C5.05151 6.4792 5.22998 6.30072 5.44951 6.18886C5.61203 6.10605 5.77104 6.08111 5.89673 6.07084C6.00913 6.06166 6.14012 6.06168 6.26644 6.0617C6.27278 6.0617 6.2791 6.06171 6.28541 6.06171H7.71458C7.72089 6.06171 7.72721 6.0617 7.73355 6.0617C7.85987 6.06168 7.99086 6.06166 8.10326 6.07084C8.22896 6.08111 8.38796 6.10605 8.55049 6.18886C8.77001 6.30072 8.94849 6.4792 9.06034 6.69872C9.14315 6.86124 9.16809 7.02025 9.17836 7.14594C9.18755 7.25834 9.18752 7.38933 9.1875 7.51565C9.1875 7.52199 9.1875 7.52831 9.1875 7.53462V10.6555H9.96041C10.2571 10.6555 10.4402 10.6549 10.5775 10.6437C10.7049 10.6333 10.7361 10.6169 10.7383 10.6158C10.8069 10.5808 10.8628 10.525 10.8978 10.4564C10.8989 10.4541 10.9154 10.4228 10.9258 10.2954C10.937 10.1581 10.9375 9.97506 10.9375 9.67837V5.98554C10.9375 5.65522 10.9318 5.61555 10.924 5.58771C10.912 5.545 10.8924 5.50483 10.866 5.46918C10.8488 5.44593 10.821 5.41708 10.5603 5.21428L7.09848 2.52177C7.05913 2.49116 7.02757 2.46663 6.99999 2.44562ZM9.98433 11.968C10.2497 11.968 10.4871 11.968 10.6843 11.9519C10.8951 11.9346 11.1172 11.8958 11.3343 11.7852C11.6499 11.6244 11.9064 11.3678 12.0672 11.0523C12.1778 10.8351 12.2167 10.6131 12.2339 10.4023C12.25 10.205 12.25 9.96764 12.25 9.70225L12.25 5.98554C12.25 5.9671 12.25 5.94866 12.2501 5.93025C12.2504 5.69307 12.2508 5.45861 12.1879 5.23392C12.1329 5.03748 12.0426 4.85272 11.9213 4.68871C11.7825 4.50112 11.5972 4.35747 11.4098 4.21216C11.3952 4.20087 11.3806 4.18958 11.3661 4.17826L7.90428 1.48574C7.89214 1.4763 7.87933 1.46621 7.86587 1.4556C7.73357 1.35131 7.53852 1.19755 7.3049 1.1343C7.10523 1.08023 6.89477 1.08023 6.69509 1.1343C6.46148 1.19755 6.26642 1.35131 6.13412 1.4556C6.12066 1.46621 6.10785 1.4763 6.09571 1.48574L2.63391 4.17826C2.61935 4.18958 2.60478 4.20088 2.59022 4.21216C2.40278 4.35747 2.21747 4.50112 2.07873 4.68871C1.95742 4.85271 1.86706 5.03748 1.81207 5.23392C1.74918 5.4586 1.74956 5.69307 1.74994 5.93024C1.74997 5.94866 1.75 5.96709 1.75 5.98554L1.75 9.70227C1.74998 9.96765 1.74997 10.205 1.76608 10.4023C1.78331 10.6131 1.82216 10.8351 1.93279 11.0523C2.09357 11.3678 2.35014 11.6244 2.6657 11.7852C2.88282 11.8958 3.10485 11.9346 3.31566 11.9519C3.5129 11.968 3.75029 11.968 4.01566 11.968H9.98433ZM7.875 10.6555V7.53462C7.875 7.47093 7.87498 7.41945 7.87447 7.37473C7.82975 7.37422 7.77828 7.37421 7.71458 7.37421H6.28541C6.22172 7.37421 6.17024 7.37422 6.12553 7.37473C6.12501 7.41945 6.125 7.47093 6.125 7.53462V10.6555H7.875Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Home"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/Home.tsx b/app/components/base/icons/src/vender/workflow/Home.tsx
new file mode 100644
index 0000000..6210e6b
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Home.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Home.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Home'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/Http.json b/app/components/base/icons/src/vender/workflow/Http.json
new file mode 100644
index 0000000..53b5c3a
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Http.json
@@ -0,0 +1,71 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "icons/http"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M13.0968 4.66675H10.8387V9.18288H11.7419V7.82804H13.0968C13.3362 7.82772 13.5658 7.73245 13.7351 7.56313C13.9044 7.39382 13.9997 7.16426 14 6.92481V5.56997C13.9997 5.33051 13.9045 5.10093 13.7351 4.9316C13.5658 4.76227 13.3362 4.66702 13.0968 4.66675ZM11.7419 6.92481V5.56997H13.0968L13.0972 6.92481H11.7419Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M4.06452 5.56997H4.96774V9.18288H5.87097V5.56997H6.77419V4.66675H4.06452V5.56997Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M9.93548 4.66675H7.22581V5.56997H8.12903V9.18288H9.03226V5.56997H9.93548V4.66675Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M2.25806 4.66675V6.4732H0.903226V4.66675H0V9.18288H0.903226V7.37643H2.25806V9.18288H3.16129V4.66675H2.25806Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Http"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/Http.tsx b/app/components/base/icons/src/vender/workflow/Http.tsx
new file mode 100644
index 0000000..77f46bf
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Http.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Http.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Http'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/IfElse.json b/app/components/base/icons/src/vender/workflow/IfElse.json
new file mode 100644
index 0000000..0ff778b
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/IfElse.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "icons/if-else"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector (Stroke)",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M8.16667 2.98975C7.80423 2.98975 7.51042 2.69593 7.51042 2.3335C7.51042 1.97106 7.80423 1.67725 8.16667 1.67725H11.0833C11.4458 1.67725 11.7396 1.97106 11.7396 2.3335V5.25016C11.7396 5.6126 11.4458 5.90641 11.0833 5.90641C10.7209 5.90641 10.4271 5.6126 10.4271 5.25016V3.91782L7.34474 7.00016L10.4271 10.0825V8.75016C10.4271 8.38773 10.7209 8.09391 11.0833 8.09391C11.4458 8.09391 11.7396 8.38773 11.7396 8.75016V11.6668C11.7396 12.0293 11.4458 12.3231 11.0833 12.3231H8.16667C7.80423 12.3231 7.51042 12.0293 7.51042 11.6668C7.51042 11.3044 7.80423 11.0106 8.16667 11.0106H9.49901L6.14484 7.65641H1.75C1.38756 7.65641 1.09375 7.3626 1.09375 7.00016C1.09375 6.63773 1.38756 6.34391 1.75 6.34391H6.14484L9.49901 2.98975H8.16667Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "IfElse"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/IfElse.tsx b/app/components/base/icons/src/vender/workflow/IfElse.tsx
new file mode 100644
index 0000000..aed6635
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/IfElse.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './IfElse.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'IfElse'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/Iteration.json b/app/components/base/icons/src/vender/workflow/Iteration.json
new file mode 100644
index 0000000..ee5748d
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Iteration.json
@@ -0,0 +1,36 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "icons/iteration"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M6.82849 0.754349C6.6007 0.526545 6.23133 0.526545 6.00354 0.754349C5.77573 0.982158 5.77573 1.3515 6.00354 1.57931L6.82849 0.754349ZM8.16602 2.91683L8.57849 3.32931C8.80628 3.1015 8.80628 2.73216 8.57849 2.50435L8.16602 2.91683ZM6.00354 4.25435C5.77573 4.48216 5.77573 4.8515 6.00354 5.07931C6.23133 5.30711 6.6007 5.30711 6.82849 5.07931L6.00354 4.25435ZM7.99516 9.74597C8.22295 9.51818 8.22295 9.14881 7.99516 8.92102C7.76737 8.69323 7.398 8.69323 7.17021 8.92102L7.99516 9.74597ZM5.83268 11.0835L5.4202 10.671C5.1924 10.8988 5.1924 11.2682 5.4202 11.496L5.83268 11.0835ZM7.17021 13.246C7.398 13.4738 7.76737 13.4738 7.99516 13.246C8.22295 13.0182 8.22295 12.6488 7.99516 12.421L7.17021 13.246ZM11.4993 3.73414C11.2738 3.50404 10.9045 3.5003 10.6744 3.72578C10.4443 3.95127 10.4405 4.32059 10.6661 4.55069L11.4993 3.73414ZM7.58268 3.50016C7.90486 3.50016 8.16602 3.23899 8.16602 2.91683C8.16602 2.59467 7.90486 2.3335 7.58268 2.3335L7.58268 3.50016ZM2.49938 10.2662C2.72486 10.4963 3.09419 10.5 3.32429 10.2745C3.55439 10.0491 3.55814 9.6797 3.33266 9.44964L2.49938 10.2662ZM6.00354 1.57931L7.75354 3.32931L8.57849 2.50435L6.82849 0.754349L6.00354 1.57931ZM7.75354 2.50435L6.00354 4.25435L6.82849 5.07931L8.57849 3.32931L7.75354 2.50435ZM7.17021 8.92102L5.4202 10.671L6.24516 11.496L7.99516 9.74597L7.17021 8.92102ZM5.4202 11.496L7.17021 13.246L7.99516 12.421L6.24516 10.671L5.4202 11.496ZM8.16602 10.5002L6.41602 10.5002V11.6668L8.16602 11.6668V10.5002ZM11.666 7.00016C11.666 8.93316 10.099 10.5002 8.16602 10.5002V11.6668C10.7434 11.6668 12.8327 9.57751 12.8327 7.00016H11.666ZM12.8327 7.00016C12.8327 5.72882 12.3235 4.57524 11.4993 3.73414L10.6661 4.55069C11.2852 5.18256 11.666 6.0463 11.666 7.00016H12.8327ZM5.83268 3.50016H7.58268L7.58268 2.3335H5.83268L5.83268 3.50016ZM2.33268 7.00016C2.33268 5.06717 3.89968 3.50016 5.83268 3.50016L5.83268 2.3335C3.25535 2.3335 1.16602 4.42283 1.16602 7.00016H2.33268ZM1.16602 7.00016C1.16602 8.27148 1.67517 9.42508 2.49938 10.2662L3.33266 9.44964C2.71348 8.81777 2.33268 7.95403 2.33268 7.00016H1.16602Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Iteration"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/Iteration.tsx b/app/components/base/icons/src/vender/workflow/Iteration.tsx
new file mode 100644
index 0000000..5e2b2c9
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Iteration.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Iteration.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Iteration'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/IterationStart.json b/app/components/base/icons/src/vender/workflow/IterationStart.json
new file mode 100644
index 0000000..2941cdb
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/IterationStart.json
@@ -0,0 +1,36 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "12",
+			"height": "12",
+			"viewBox": "0 0 12 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "icons/block-start"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M6.8498 1.72732C6.3379 1.3754 5.6621 1.3754 5.1502 1.72732L2.1502 3.78982C1.74317 4.06965 1.5 4.53193 1.5 5.02588V8.99983C1.5 9.82828 2.17158 10.4998 3 10.4998H4.25C4.52614 10.4998 4.75 10.276 4.75 9.99983V8.24983C4.75 7.55948 5.30965 6.99983 6 6.99983C6.69035 6.99983 7.25 7.55948 7.25 8.24983V9.99983C7.25 10.276 7.47385 10.4998 7.75 10.4998H9C9.82845 10.4998 10.5 9.82828 10.5 8.99983V5.02588C10.5 4.53193 10.2568 4.06965 9.8498 3.78982L6.8498 1.72732Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "IterationStart"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/IterationStart.tsx b/app/components/base/icons/src/vender/workflow/IterationStart.tsx
new file mode 100644
index 0000000..939d696
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/IterationStart.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './IterationStart.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'IterationStart'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/Jinja.json b/app/components/base/icons/src/vender/workflow/Jinja.json
new file mode 100644
index 0000000..ba46cb9
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Jinja.json
@@ -0,0 +1,98 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "24",
+			"height": "12",
+			"viewBox": "0 0 24 12",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "Jinja Icon"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M7.46013 5.99982C7.46013 4.87982 7.48013 3.92982 7.53013 3.16982V3.06982L6.13013 3.23982L6.15013 3.32982C6.29013 4.03982 6.36013 4.93982 6.36013 5.99982C6.36013 6.93982 6.33013 7.78982 6.28013 8.51982V8.60982H7.55013V8.51982C7.49013 7.72982 7.46013 6.87982 7.46013 5.99982Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M3.33016 1.31998C3.38016 2.31998 3.38016 5.13998 3.38016 7.00998V7.77998C3.38016 8.21998 3.35016 8.58998 3.28016 8.85998C3.22016 9.12998 3.11016 9.34998 2.96016 9.52998C2.82016 9.70998 2.62016 9.83998 2.37016 9.92998C2.12016 10.01 1.82016 10.06 1.49016 10.06C1.19016 10.06 0.900156 9.99998 0.620156 9.87998L0.520156 9.83998L0.410156 10.83L0.480156 10.85C0.800156 10.93 1.16016 10.97 1.56016 10.97C2.08016 10.97 2.53016 10.9 2.90016 10.77C3.28016 10.64 3.59016 10.43 3.83016 10.15C4.07016 9.87998 4.25016 9.52998 4.36016 9.13998C4.47016 8.74998 4.53016 8.23998 4.53016 7.64998C4.53016 6.78998 4.59016 3.54998 4.59016 3.17998C4.61016 2.47998 4.63016 1.86998 4.66016 1.31998V1.22998H3.33016V1.31998Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M7.08021 0.919922C6.82022 0.919922 6.60021 0.999922 6.45021 1.14992C6.30021 1.29992 6.22021 1.47992 6.22021 1.68992C6.22021 1.87992 6.28021 2.04992 6.41021 2.18992C6.54022 2.31992 6.73022 2.38992 6.96022 2.38992C7.23022 2.38992 7.44021 2.30992 7.59021 2.15992C7.74021 1.99992 7.81021 1.81992 7.81021 1.60992C7.81021 1.42992 7.74021 1.25992 7.61021 1.12992C7.48021 0.989922 7.30021 0.919922 7.08021 0.919922Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M15.6102 3.30981C15.7702 4.07981 15.8502 5.25981 15.8502 6.81981C15.8502 8.26981 15.7902 9.23981 15.6702 9.67981C15.5902 9.96981 15.3802 10.2598 15.0302 10.5198L14.9702 10.5698L15.3502 11.0998H15.4002C16.4302 10.8198 16.9602 10.0598 16.9602 8.83981C16.9602 8.64981 16.9502 8.30981 16.9202 7.80981C16.9002 7.31981 16.8902 6.90981 16.8902 6.59981C16.8902 5.44981 16.9202 4.28981 16.9902 3.15981V3.05981L15.5802 3.21981L15.6002 3.30981H15.6102Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M14.2901 5.77C14.2901 5.7 14.2901 5.56 14.3001 5.36C14.3001 5.15 14.3101 5.01 14.3101 4.94C14.3101 4.22 14.1101 3.71 13.7201 3.43C13.3401 3.15 12.8001 3 12.1101 3C11.4201 3 10.7901 3.24 10.2001 3.71L10.0901 3.06L8.8501 3.22L8.8701 3.31C9.0501 4.11 9.1401 4.95 9.1401 5.8C9.1401 6.36 9.1101 7.27 9.0401 8.52V8.61H10.3101V8.53C10.2901 7.07 10.2801 5.71 10.2801 4.49C10.7401 4.14 11.2501 3.96 11.7901 3.96C12.2401 3.96 12.5801 4.06 12.8201 4.26C13.0501 4.45 13.1701 4.82 13.1701 5.36C13.1701 6.5 13.1301 7.56 13.0401 8.53V8.62H14.3101V8.54C14.2901 7.35 14.2801 6.42 14.2801 5.79L14.2901 5.77Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M16.5302 0.919922C16.2702 0.919922 16.0502 0.999922 15.9002 1.14992C15.7502 1.29992 15.6702 1.47992 15.6702 1.68992C15.6702 1.87992 15.7302 2.04992 15.8602 2.18992C15.9902 2.31992 16.1802 2.38992 16.4102 2.38992C16.6702 2.38992 16.8902 2.30992 17.0302 2.15992C17.1802 1.99992 17.2502 1.81992 17.2502 1.60992C17.2502 1.42992 17.1802 1.25992 17.0502 1.12992C16.9202 0.989922 16.7402 0.919922 16.5202 0.919922H16.5302Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M23.1802 8.51001C23.0702 8.00001 23.0202 7.40001 23.0202 6.73001C23.0202 6.57001 23.0202 6.26001 23.0402 5.83001C23.0602 5.38001 23.0702 5.06001 23.0702 4.88001C23.0702 4.20001 22.8602 3.71001 22.4502 3.43001C22.0402 3.15001 21.4702 3.01001 20.7302 3.01001C19.9402 3.01001 19.2302 3.09001 18.6102 3.25001H18.5602L18.4302 4.20001L18.5502 4.17001C19.1602 4.03001 19.7802 3.96001 20.4102 3.96001C20.9302 3.96001 21.3202 4.03001 21.5702 4.18001C21.8102 4.31001 21.9302 4.59001 21.9302 5.01001C21.9302 5.09001 21.9302 5.16001 21.9302 5.23001C20.5102 5.25001 19.5602 5.44001 19.0302 5.79001C18.4802 6.15001 18.2002 6.63001 18.2002 7.23001C18.2002 7.72001 18.3802 8.10001 18.7402 8.36001C19.0902 8.62001 19.5102 8.75001 19.9902 8.75001C20.8202 8.75001 21.5002 8.55001 22.0102 8.17001C22.0102 8.30001 22.0402 8.44001 22.0802 8.58001L22.1002 8.64001L23.2202 8.60001L23.2002 8.50001L23.1802 8.51001ZM20.2802 6.18001C20.6502 6.08001 21.2002 6.03001 21.9102 6.03001C21.9102 6.45001 21.9202 6.92001 21.9402 7.42001C21.5602 7.69001 21.0502 7.83001 20.4302 7.83001C19.7002 7.83001 19.3502 7.61001 19.3502 7.16001C19.3502 6.68001 19.6602 6.36001 20.2802 6.18001Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "Jinja"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/Jinja.tsx b/app/components/base/icons/src/vender/workflow/Jinja.tsx
new file mode 100644
index 0000000..67422f6
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Jinja.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Jinja.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Jinja'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/KnowledgeRetrieval.json b/app/components/base/icons/src/vender/workflow/KnowledgeRetrieval.json
new file mode 100644
index 0000000..4bdc83f
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/KnowledgeRetrieval.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "icons/knowledge-retrieval"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector (Stroke)",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M3.78528 2.62834C3.78527 2.62834 3.78528 2.62834 3.78528 2.62834L8 3.56494L12.2147 2.62834C13.5158 2.33921 14.75 3.32924 14.75 4.66206V11.2637C14.75 12.2401 14.0718 13.0855 13.1187 13.2974L8.1627 14.3987C8.05554 14.4225 7.94446 14.4225 7.8373 14.3987L2.88139 13.2974C1.92824 13.0855 1.25 12.2401 1.25 11.2637V4.66206C1.25 3.32925 2.4842 2.33921 3.78528 2.62834ZM7.25 4.93487L3.45988 4.09262C3.09558 4.01166 2.75 4.28887 2.75 4.66206V11.2637C2.75 11.537 2.93986 11.7738 3.20679 11.8331C3.20678 11.8331 3.20681 11.8331 3.20679 11.8331L7.25 12.7316V4.93487ZM8.75 12.7316L12.7932 11.8331C13.0601 11.7738 13.25 11.537 13.25 11.2637V4.66206C13.25 4.28887 12.9044 4.01165 12.5401 4.09262L8.75 4.93487V12.7316Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "KnowledgeRetrieval"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/KnowledgeRetrieval.tsx b/app/components/base/icons/src/vender/workflow/KnowledgeRetrieval.tsx
new file mode 100644
index 0000000..abe3f35
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/KnowledgeRetrieval.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './KnowledgeRetrieval.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'KnowledgeRetrieval'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/ListFilter.json b/app/components/base/icons/src/vender/workflow/ListFilter.json
new file mode 100644
index 0000000..568020f
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/ListFilter.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "filter"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M2 4C2 2.89543 2.89543 2 4 2L12 2C13.1046 2 14 2.89544 14 4V4.78105C14 5.31148 13.7893 5.82019 13.4142 6.19528L10.1953 9.4142C10.0702 9.53925 10 9.70881 10 9.8856V12.8713C10 13.427 9.65528 13.9246 9.13482 14.1198C9.13479 14.1198 9.13476 14.1198 9.13473 14.1198L7.80153 14.6197C6.92984 14.9467 6 14.3022 6 13.3713L6 9.8856C6 9.70883 5.92978 9.53926 5.80474 9.4142C5.80473 9.4142 5.80473 9.4142 5.80472 9.41419L2.58579 6.19526L3.05004 5.73102L2.58579 6.19526C2.21071 5.82019 2 5.31148 2 4.78105V4ZM4 3.33333C3.63181 3.33333 3.33333 3.63181 3.33333 4L3.33333 4.78105C3.33333 4.95786 3.40357 5.12743 3.5286 5.25246L6.74754 8.47139L6.74756 8.47141C7.12262 8.84649 7.33333 9.35518 7.33333 9.8856L7.33333 13.3713L8.66665 12.8713L8.66667 12.8713L8.66667 9.8856C8.66667 9.35518 8.87737 8.84648 9.25246 8.4714L12.4714 5.25246L12.4714 5.25244C12.5964 5.12742 12.6667 4.95787 12.6667 4.78105V4C12.6667 3.6318 12.3682 3.33333 12 3.33333L4 3.33333Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ListFilter"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/ListFilter.tsx b/app/components/base/icons/src/vender/workflow/ListFilter.tsx
new file mode 100644
index 0000000..4eb992a
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/ListFilter.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ListFilter.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ListFilter'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/Llm.json b/app/components/base/icons/src/vender/workflow/Llm.json
new file mode 100644
index 0000000..d900a67
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Llm.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "icons/llm"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector (Stroke)",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M5.83333 2.40625C5.04971 2.40625 4.39011 2.94431 4.20689 3.67206C4.13982 3.93846 3.91391 4.1349 3.64078 4.16432C2.94692 4.23906 2.40625 4.82766 2.40625 5.54167C2.40625 5.92943 2.56471 6.27904 2.82212 6.53129C2.94807 6.65472 3.01905 6.82365 3.01905 7C3.01905 7.17635 2.94807 7.34528 2.82212 7.46871C2.56471 7.72096 2.40625 8.07057 2.40625 8.45833C2.40625 9.03652 2.76061 9.53347 3.26651 9.74092C3.45247 9.81717 3.59324 9.97444 3.64849 10.1677C3.8841 10.9917 4.64342 11.5938 5.54167 11.5938C5.82802 11.5938 6.09916 11.533 6.34375 11.4237V9.91667C6.34375 9.31258 5.85409 8.82292 5.25 8.82292C4.88756 8.82292 4.59375 8.5291 4.59375 8.16667C4.59375 7.80423 4.88756 7.51042 5.25 7.51042C5.64385 7.51042 6.0156 7.60503 6.34375 7.77278V2.48514C6.18319 2.43393 6.01183 2.40625 5.83333 2.40625ZM7.65625 2.48514V4.08333C7.65625 4.6874 8.14592 5.17708 8.75 5.17708C9.11244 5.17708 9.40625 5.4709 9.40625 5.83333C9.40625 6.19577 9.11244 6.48958 8.75 6.48958C8.35615 6.48958 7.9844 6.39496 7.65625 6.22722V11.4237C7.90087 11.533 8.17199 11.5938 8.45833 11.5938C9.35657 11.5938 10.1159 10.9917 10.3515 10.1677C10.4068 9.97444 10.5475 9.81717 10.7335 9.74092C11.2394 9.53347 11.5938 9.03652 11.5938 8.45833C11.5938 8.07056 11.4353 7.72096 11.1779 7.46871C11.0519 7.34528 10.981 7.17635 10.981 7C10.981 6.82365 11.0519 6.65472 11.1779 6.53129C11.4353 6.27904 11.5938 5.92944 11.5938 5.54167C11.5938 4.82766 11.0531 4.23906 10.3592 4.16432C10.0861 4.1349 9.86022 3.93847 9.79315 3.67208C9.6099 2.94432 8.95027 2.40625 8.16667 2.40625C7.98817 2.40625 7.81681 2.43393 7.65625 2.48514ZM7.00001 12.565C6.56031 12.7835 6.06472 12.9062 5.54167 12.9062C4.14996 12.9062 2.96198 12.0403 2.48457 10.8188C1.65595 10.3591 1.09375 9.47501 1.09375 8.45833C1.09375 7.9213 1.2511 7.42042 1.52161 7C1.2511 6.57958 1.09375 6.0787 1.09375 5.54167C1.09375 4.30153 1.93005 3.25742 3.06973 2.94157C3.51828 1.85715 4.586 1.09375 5.83333 1.09375C6.24643 1.09375 6.64104 1.17788 7 1.33013C7.35896 1.17788 7.75357 1.09375 8.16667 1.09375C9.41399 1.09375 10.4817 1.85716 10.9303 2.94157C12.0699 3.25742 12.9062 4.30153 12.9062 5.54167C12.9062 6.07869 12.7489 6.57958 12.4784 7C12.7489 7.42043 12.9062 7.92131 12.9062 8.45833C12.9062 9.47502 12.344 10.3591 11.5154 10.8188C11.038 12.0403 9.85003 12.9062 8.45833 12.9062C7.93526 12.9062 7.4397 12.7834 7.00001 12.565Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Llm"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/Llm.tsx b/app/components/base/icons/src/vender/workflow/Llm.tsx
new file mode 100644
index 0000000..d72c5f2
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Llm.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Llm.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Llm'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/Loop.json b/app/components/base/icons/src/vender/workflow/Loop.json
new file mode 100644
index 0000000..65a70d8
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Loop.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "18",
+			"height": "16",
+			"viewBox": "0 0 18 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "loop"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M2.02915 5.34506C3.50752 3.88498 5.9006 3.88498 7.37896 5.34506L8.99983 6.94588L10.6207 5.34506C12.0991 3.88499 14.4921 3.88498 15.9705 5.34506C17.454 6.81027 17.454 9.18971 15.9705 10.6549C14.4921 12.115 12.0991 12.115 10.6207 10.655L8.99983 9.05413L7.37896 10.655C5.9006 12.115 3.50753 12.115 2.02916 10.655C0.545627 9.18974 0.545611 6.81028 2.02915 5.34506ZM7.93251 8L6.32492 6.4123C5.4308 5.52924 3.97732 5.52923 3.08319 6.4123C2.19426 7.29026 2.19426 8.70975 3.0832 9.58772C3.97733 10.4708 5.4308 10.4707 6.32492 9.58771C6.32492 9.58772 6.32492 9.58771 6.32492 9.58771L7.93251 8ZM10.0671 8L11.6747 9.5877C11.6747 9.58769 11.6747 9.58771 11.6747 9.5877C12.5688 10.4707 14.0223 10.4707 14.9165 9.58773C15.8054 8.70975 15.8054 7.29024 14.9165 6.41229C14.0223 5.52923 12.5689 5.52924 11.6747 6.4123C11.6747 6.4123 11.6747 6.41229 11.6747 6.4123L10.0671 8Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "Loop"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/Loop.tsx b/app/components/base/icons/src/vender/workflow/Loop.tsx
new file mode 100644
index 0000000..3ac3ffd
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/Loop.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './Loop.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'Loop'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/LoopEnd.json b/app/components/base/icons/src/vender/workflow/LoopEnd.json
new file mode 100644
index 0000000..1427dfd
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/LoopEnd.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "16",
+			"height": "16",
+			"viewBox": "0 0 16 16",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "ongoing"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M8 2.75C5.10051 2.75 2.75 5.10051 2.75 8C2.75 10.8995 5.1005 13.25 8 13.25C8.41421 13.25 8.75 13.5858 8.75 14C8.75 14.4142 8.41421 14.75 8 14.75C4.27208 14.75 1.25 11.7279 1.25 8C1.25 4.27208 4.27208 1.25 8 1.25C8.41421 1.25 8.75 1.58579 8.75 2C8.75 2.41421 8.41421 2.75 8 2.75ZM10.3508 2.42715C10.5582 2.06861 11.017 1.94608 11.3755 2.15349C11.9971 2.51301 12.5556 2.96859 13.0311 3.49984C13.3073 3.8085 13.281 4.28264 12.9724 4.55887C12.6637 4.8351 12.1896 4.80882 11.9133 4.50016C11.5429 4.08625 11.1079 3.73153 10.6245 3.4519C10.2659 3.2445 10.1434 2.7857 10.3508 2.42715ZM8.13634 5.46967C8.42923 5.17678 8.9041 5.17678 9.197 5.46967L11.197 7.46967C11.4899 7.76256 11.4899 8.23744 11.197 8.53033L9.197 10.5303C8.9041 10.8232 8.42923 10.8232 8.13634 10.5303C7.84344 10.2374 7.84344 9.76256 8.13634 9.46967L8.85601 8.75H5.33333C4.91912 8.75 4.58333 8.41421 4.58333 8C4.58333 7.58579 4.91912 7.25 5.33333 7.25H8.85601L8.13634 6.53033C7.84344 6.23744 7.84344 5.76256 8.13634 5.46967ZM13.7414 6.09691C14.1478 6.01676 14.5422 6.28123 14.6224 6.68762C14.7062 7.1128 14.75 7.55166 14.75 8C14.75 8.44834 14.7062 8.88721 14.6224 9.31234C14.5422 9.71872 14.1478 9.98318 13.7414 9.90302C13.335 9.82287 13.0706 9.42845 13.1507 9.02206C13.2158 8.69213 13.25 8.35046 13.25 8C13.25 7.64954 13.2158 7.30787 13.1507 6.97785C13.0706 6.57146 13.335 6.17705 13.7414 6.09691ZM12.9723 11.4411C13.281 11.7173 13.3073 12.1915 13.0311 12.5002C12.5556 13.0314 11.9971 13.487 11.3756 13.8465C11.017 14.0539 10.5582 13.9314 10.3508 13.5729C10.1434 13.2143 10.2659 12.7556 10.6244 12.5481C11.1079 12.2685 11.5429 11.9138 11.9133 11.4999C12.1895 11.1912 12.6637 11.1649 12.9723 11.4411Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "LoopEnd"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/LoopEnd.tsx b/app/components/base/icons/src/vender/workflow/LoopEnd.tsx
new file mode 100644
index 0000000..0b8f71d
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/LoopEnd.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './LoopEnd.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'LoopEnd'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/ParameterExtractor.json b/app/components/base/icons/src/vender/workflow/ParameterExtractor.json
new file mode 100644
index 0000000..7d4fa64
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/ParameterExtractor.json
@@ -0,0 +1,266 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "icons/parma-extractor"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector",
+							"d": "M7.58398 10.3543C7.58398 10.0322 7.84514 9.771 8.16732 9.771C8.48949 9.771 8.75065 10.0322 8.75065 10.3543C8.75065 10.6765 8.48949 10.9377 8.16732 10.9377C7.84514 10.9377 7.58398 10.6765 7.58398 10.3543Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_2",
+							"d": "M9.625 10.3543C9.625 10.0322 9.88616 9.771 10.2083 9.771C10.5305 9.771 10.7917 10.0322 10.7917 10.3543C10.7917 10.6765 10.5305 10.9377 10.2083 10.9377C9.88616 10.9377 9.625 10.6765 9.625 10.3543Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_3",
+							"d": "M7.58398 3.64583C7.58398 3.32366 7.84514 3.0625 8.16732 3.0625C8.48949 3.0625 8.75065 3.32366 8.75065 3.64583C8.75065 3.968 8.48949 4.22917 8.16732 4.22917C7.84514 4.22917 7.58398 3.968 7.58398 3.64583Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_4",
+							"d": "M7.72852 12.104C7.72852 11.8624 7.9244 11.6665 8.16602 11.6665C8.40763 11.6665 8.60352 11.8624 8.60352 12.104C8.60352 12.3456 8.40763 12.5415 8.16602 12.5415C7.9244 12.5415 7.72852 12.3456 7.72852 12.104Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_5",
+							"d": "M11.375 8.1665C11.375 7.92489 11.5709 7.729 11.8125 7.729C12.0541 7.729 12.25 7.92489 12.25 8.1665C12.25 8.40812 12.0541 8.604 11.8125 8.604C11.5709 8.604 11.375 8.40812 11.375 8.1665Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_6",
+							"d": "M11.375 5.8335C11.375 5.59187 11.5709 5.396 11.8125 5.396C12.0541 5.396 12.25 5.59187 12.25 5.8335C12.25 6.07511 12.0541 6.271 11.8125 6.271C11.5709 6.271 11.375 6.07511 11.375 5.8335Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_7",
+							"d": "M7.72852 1.896C7.72852 1.65437 7.9244 1.4585 8.16602 1.4585C8.40763 1.4585 8.60352 1.65437 8.60352 1.896C8.60352 2.13762 8.40763 2.3335 8.16602 2.3335C7.9244 2.3335 7.72852 2.13762 7.72852 1.896Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_8",
+							"d": "M7.29102 8.1665C7.29102 7.68327 7.68278 7.2915 8.16602 7.2915C8.64925 7.2915 9.04102 7.68327 9.04102 8.1665C9.04102 8.64974 8.64925 9.0415 8.16602 9.0415C7.68278 9.0415 7.29102 8.64974 7.29102 8.1665Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_9",
+							"d": "M7.29102 5.8335C7.29102 5.35025 7.68278 4.9585 8.16602 4.9585C8.64925 4.9585 9.04102 5.35025 9.04102 5.8335C9.04102 6.31673 8.64925 6.7085 8.16602 6.7085C7.68278 6.7085 7.29102 6.31673 7.29102 5.8335Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_10",
+							"d": "M9.625 8.16683C9.625 7.84465 9.88616 7.5835 10.2083 7.5835C10.5305 7.5835 10.7917 7.84465 10.7917 8.16683C10.7917 8.489 10.5305 8.75016 10.2083 8.75016C9.88616 8.75016 9.625 8.489 9.625 8.16683Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_11",
+							"d": "M9.625 5.83333C9.625 5.51116 9.88616 5.25 10.2083 5.25C10.5305 5.25 10.7917 5.51116 10.7917 5.83333C10.7917 6.15551 10.5305 6.41667 10.2083 6.41667C9.88616 6.41667 9.625 6.15551 9.625 5.83333Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_12",
+							"d": "M9.625 3.64583C9.625 3.32366 9.88616 3.0625 10.2083 3.0625C10.5305 3.0625 10.7917 3.32366 10.7917 3.64583C10.7917 3.968 10.5305 4.22917 10.2083 4.22917C9.88616 4.22917 9.625 3.968 9.625 3.64583Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_13",
+							"d": "M6.41667 3.64583C6.41667 3.968 6.15551 4.22917 5.83333 4.22917C5.51117 4.22917 5.25 3.968 5.25 3.64583C5.25 3.32367 5.51117 3.0625 5.83333 3.0625C6.15551 3.0625 6.41667 3.32367 6.41667 3.64583Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_14",
+							"d": "M4.37565 3.64583C4.37565 3.968 4.11448 4.22917 3.79232 4.22917C3.47015 4.22917 3.20898 3.968 3.20898 3.64583C3.20898 3.32367 3.47015 3.0625 3.79232 3.0625C4.11448 3.0625 4.37565 3.32367 4.37565 3.64583Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_15",
+							"d": "M6.41667 10.3543C6.41667 10.6765 6.15551 10.9377 5.83333 10.9377C5.51117 10.9377 5.25 10.6765 5.25 10.3543C5.25 10.0322 5.51117 9.771 5.83333 9.771C6.15551 9.771 6.41667 10.0322 6.41667 10.3543Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_16",
+							"d": "M6.27148 1.896C6.27148 2.13762 6.0756 2.3335 5.83398 2.3335C5.59236 2.3335 5.39648 2.13762 5.39648 1.896C5.39648 1.65437 5.59236 1.4585 5.83398 1.4585C6.0756 1.4585 6.27148 1.65437 6.27148 1.896Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_17",
+							"d": "M2.625 5.8335C2.625 6.07511 2.42912 6.271 2.1875 6.271C1.94588 6.271 1.75 6.07511 1.75 5.8335C1.75 5.59187 1.94588 5.396 2.1875 5.396C2.42912 5.396 2.625 5.59187 2.625 5.8335Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_18",
+							"d": "M2.625 8.1665C2.625 8.40812 2.42912 8.604 2.1875 8.604C1.94588 8.604 1.75 8.40812 1.75 8.1665C1.75 7.92489 1.94588 7.729 2.1875 7.729C2.42912 7.729 2.625 7.92489 2.625 8.1665Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_19",
+							"d": "M6.27148 12.104C6.27148 12.3456 6.0756 12.5415 5.83398 12.5415C5.59236 12.5415 5.39648 12.3456 5.39648 12.104C5.39648 11.8624 5.59236 11.6665 5.83398 11.6665C6.0756 11.6665 6.27148 11.8624 6.27148 12.104Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_20",
+							"d": "M6.70898 5.8335C6.70898 6.31673 6.31722 6.7085 5.83398 6.7085C5.35073 6.7085 4.95898 6.31673 4.95898 5.8335C4.95898 5.35025 5.35073 4.9585 5.83398 4.9585C6.31722 4.9585 6.70898 5.35025 6.70898 5.8335Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_21",
+							"d": "M6.70898 8.1665C6.70898 8.64974 6.31722 9.0415 5.83398 9.0415C5.35073 9.0415 4.95898 8.64974 4.95898 8.1665C4.95898 7.68327 5.35073 7.2915 5.83398 7.2915C6.31722 7.2915 6.70898 7.68327 6.70898 8.1665Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_22",
+							"d": "M4.37565 5.83333C4.37565 6.15551 4.11448 6.41667 3.79232 6.41667C3.47015 6.41667 3.20898 6.15551 3.20898 5.83333C3.20898 5.51117 3.47015 5.25 3.79232 5.25C4.11448 5.25 4.37565 5.51117 4.37565 5.83333Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_23",
+							"d": "M4.37565 8.16683C4.37565 8.489 4.11448 8.75016 3.79232 8.75016C3.47015 8.75016 3.20898 8.489 3.20898 8.16683C3.20898 7.84465 3.47015 7.5835 3.79232 7.5835C4.11448 7.5835 4.37565 7.84465 4.37565 8.16683Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					},
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector_24",
+							"d": "M4.37565 10.3543C4.37565 10.6765 4.11448 10.9377 3.79232 10.9377C3.47015 10.9377 3.20898 10.6765 3.20898 10.3543C3.20898 10.0322 3.47015 9.771 3.79232 9.771C4.11448 9.771 4.37565 10.0322 4.37565 10.3543Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "ParameterExtractor"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/ParameterExtractor.tsx b/app/components/base/icons/src/vender/workflow/ParameterExtractor.tsx
new file mode 100644
index 0000000..7066a74
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/ParameterExtractor.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './ParameterExtractor.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'ParameterExtractor'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/QuestionClassifier.json b/app/components/base/icons/src/vender/workflow/QuestionClassifier.json
new file mode 100644
index 0000000..a50ee6c
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/QuestionClassifier.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "icons/question-classifier"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Vector (Stroke)",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M6.34379 3.53597C6.34379 2.35003 7.45832 1.47985 8.60885 1.76749L10.9422 2.35082C11.7537 2.55369 12.323 3.28283 12.323 4.1193V9.88081C12.323 10.7173 11.7537 11.4464 10.9422 11.6493L8.60886 12.2326C7.45832 12.5203 6.34379 11.6501 6.34379 10.4641V3.53597ZM8.29052 3.0408C7.96836 2.96026 7.65629 3.20392 7.65629 3.53597V10.4641C7.65629 10.7962 7.96836 11.0399 8.29051 10.9593L10.6238 10.376C10.6238 10.376 10.6238 10.376 10.6238 10.376C10.8511 10.3192 11.0105 10.115 11.0105 9.88081V4.1193C11.0105 3.88509 10.851 3.68093 10.6239 3.62413L8.29052 3.0408ZM4.66671 2.26048C5.02914 2.26048 5.32296 2.5543 5.32296 2.91673V11.0834C5.32296 11.4458 5.02914 11.7397 4.66671 11.7397C4.30427 11.7397 4.01046 11.4458 4.01046 11.0834V2.91673C4.01046 2.5543 4.30427 2.26048 4.66671 2.26048ZM2.33337 2.84382C2.69581 2.84382 2.98962 3.13763 2.98962 3.50007V10.5001C2.98962 10.8625 2.69581 11.1563 2.33337 11.1563C1.97094 11.1563 1.67712 10.8625 1.67712 10.5001V3.50007C1.67712 3.13763 1.97094 2.84382 2.33337 2.84382Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "QuestionClassifier"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/QuestionClassifier.tsx b/app/components/base/icons/src/vender/workflow/QuestionClassifier.tsx
new file mode 100644
index 0000000..59b2bcc
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/QuestionClassifier.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './QuestionClassifier.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'QuestionClassifier'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/TemplatingTransform.json b/app/components/base/icons/src/vender/workflow/TemplatingTransform.json
new file mode 100644
index 0000000..69ee236
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/TemplatingTransform.json
@@ -0,0 +1,154 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "icons/templating-transform"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "g",
+						"attributes": {
+							"id": "Vector"
+						},
+						"children": [
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"fill-rule": "evenodd",
+									"clip-rule": "evenodd",
+									"d": "M6.34375 1.75C6.34375 1.38756 6.63756 1.09375 7 1.09375C10.262 1.09375 12.9062 3.73807 12.9062 7C12.9062 10.262 10.262 12.9062 7 12.9062C6.63756 12.9062 6.34375 12.6124 6.34375 12.25V1.75Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M5.54167 3.64583C5.54167 3.968 5.2805 4.22917 4.95833 4.22917C4.63617 4.22917 4.375 3.968 4.375 3.64583C4.375 3.32367 4.63617 3.0625 4.95833 3.0625C5.2805 3.0625 5.54167 3.32367 5.54167 3.64583Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M3.5 3.64583C3.5 3.968 3.23883 4.22917 2.91667 4.22917C2.5945 4.22917 2.33333 3.968 2.33333 3.64583C2.33333 3.32367 2.5945 3.0625 2.91667 3.0625C3.23883 3.0625 3.5 3.32367 3.5 3.64583Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M5.54167 10.3542C5.54167 10.6763 5.2805 10.9375 4.95833 10.9375C4.63617 10.9375 4.375 10.6763 4.375 10.3542C4.375 10.032 4.63617 9.77083 4.95833 9.77083C5.2805 9.77083 5.54167 10.032 5.54167 10.3542Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M5.39583 1.89583C5.39583 2.13746 5.19996 2.33333 4.95833 2.33333C4.71671 2.33333 4.52083 2.13746 4.52083 1.89583C4.52083 1.65421 4.71671 1.45833 4.95833 1.45833C5.19996 1.45833 5.39583 1.65421 5.39583 1.89583Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M1.75 5.83333C1.75 6.07495 1.55412 6.27083 1.3125 6.27083C1.07088 6.27083 0.875 6.07495 0.875 5.83333C0.875 5.59171 1.07088 5.39583 1.3125 5.39583C1.55412 5.39583 1.75 5.59171 1.75 5.83333Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M1.75 8.16667C1.75 8.40828 1.55412 8.60417 1.3125 8.60417C1.07088 8.60417 0.875 8.40828 0.875 8.16667C0.875 7.92505 1.07088 7.72917 1.3125 7.72917C1.55412 7.72917 1.75 7.92505 1.75 8.16667Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M5.39583 12.1042C5.39583 12.3458 5.19996 12.5417 4.95833 12.5417C4.71671 12.5417 4.52083 12.3458 4.52083 12.1042C4.52083 11.8625 4.71671 11.6667 4.95833 11.6667C5.19996 11.6667 5.39583 11.8625 5.39583 12.1042Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M5.83333 5.83333C5.83333 6.31657 5.44158 6.70833 4.95833 6.70833C4.47508 6.70833 4.08333 6.31657 4.08333 5.83333C4.08333 5.35008 4.47508 4.95833 4.95833 4.95833C5.44158 4.95833 5.83333 5.35008 5.83333 5.83333Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M5.83333 8.16667C5.83333 8.6499 5.44158 9.04167 4.95833 9.04167C4.47508 9.04167 4.08333 8.6499 4.08333 8.16667C4.08333 7.68343 4.47508 7.29167 4.95833 7.29167C5.44158 7.29167 5.83333 7.68343 5.83333 8.16667Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M3.5 5.83333C3.5 6.15551 3.23883 6.41667 2.91667 6.41667C2.5945 6.41667 2.33333 6.15551 2.33333 5.83333C2.33333 5.51117 2.5945 5.25 2.91667 5.25C3.23883 5.25 3.5 5.51117 3.5 5.83333Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M3.5 8.16667C3.5 8.48884 3.23883 8.75 2.91667 8.75C2.5945 8.75 2.33333 8.48884 2.33333 8.16667C2.33333 7.84449 2.5945 7.58333 2.91667 7.58333C3.23883 7.58333 3.5 7.84449 3.5 8.16667Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							},
+							{
+								"type": "element",
+								"name": "path",
+								"attributes": {
+									"d": "M3.5 10.3542C3.5 10.6763 3.23883 10.9375 2.91667 10.9375C2.5945 10.9375 2.33333 10.6763 2.33333 10.3542C2.33333 10.032 2.5945 9.77083 2.91667 9.77083C3.23883 9.77083 3.5 10.032 3.5 10.3542Z",
+									"fill": "currentColor"
+								},
+								"children": []
+							}
+						]
+					}
+				]
+			}
+		]
+	},
+	"name": "TemplatingTransform"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/TemplatingTransform.tsx b/app/components/base/icons/src/vender/workflow/TemplatingTransform.tsx
new file mode 100644
index 0000000..a4d1e50
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/TemplatingTransform.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './TemplatingTransform.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'TemplatingTransform'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/VariableX.json b/app/components/base/icons/src/vender/workflow/VariableX.json
new file mode 100644
index 0000000..1560684
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/VariableX.json
@@ -0,0 +1,38 @@
+{
+	"icon": {
+		"type": "element",
+		"isRootNode": true,
+		"name": "svg",
+		"attributes": {
+			"width": "14",
+			"height": "14",
+			"viewBox": "0 0 14 14",
+			"fill": "none",
+			"xmlns": "http://www.w3.org/2000/svg"
+		},
+		"children": [
+			{
+				"type": "element",
+				"name": "g",
+				"attributes": {
+					"id": "icons/variable-x"
+				},
+				"children": [
+					{
+						"type": "element",
+						"name": "path",
+						"attributes": {
+							"id": "Icon (Stroke)",
+							"fill-rule": "evenodd",
+							"clip-rule": "evenodd",
+							"d": "M0.714375 3.42875C0.714375 2.22516 1.68954 1.25 2.89313 1.25C3.30734 1.25 3.64313 1.58579 3.64313 2C3.64313 2.41421 3.30734 2.75 2.89313 2.75C2.51796 2.75 2.21438 3.05359 2.21438 3.42875V6.28563C2.21438 6.48454 2.13536 6.6753 1.9947 6.81596L1.81066 7L1.9947 7.18404C2.13536 7.3247 2.21438 7.51546 2.21438 7.71437V10.5713C2.21438 10.9464 2.51796 11.25 2.89313 11.25C3.30734 11.25 3.64313 11.5858 3.64313 12C3.64313 12.4142 3.30734 12.75 2.89313 12.75C1.68954 12.75 0.714375 11.7748 0.714375 10.5713V8.02503L0.21967 7.53033C0.0790176 7.38968 0 7.19891 0 7C0 6.80109 0.0790176 6.61032 0.21967 6.46967L0.714375 5.97497V3.42875ZM10.3568 2C10.3568 1.58579 10.6925 1.25 11.1068 1.25C12.3103 1.25 13.2855 2.22516 13.2855 3.42875V5.97497L13.7802 6.46967C13.9209 6.61032 13.9999 6.80109 13.9999 7C13.9999 7.19891 13.9209 7.38968 13.7802 7.53033L13.2855 8.02503V10.5713C13.2855 11.7751 12.3095 12.75 11.1068 12.75C10.6925 12.75 10.3568 12.4142 10.3568 12C10.3568 11.5858 10.6925 11.25 11.1068 11.25C11.4815 11.25 11.7855 10.9462 11.7855 10.5713V7.71437C11.7855 7.51546 11.8645 7.3247 12.0052 7.18404L12.1892 7L12.0052 6.81596C11.8645 6.6753 11.7855 6.48454 11.7855 6.28563V3.42875C11.7855 3.05359 11.4819 2.75 11.1068 2.75C10.6925 2.75 10.3568 2.41421 10.3568 2ZM4.59467 4.59467C4.88756 4.30178 5.36244 4.30178 5.65533 4.59467L7 5.93934L8.34467 4.59467C8.63756 4.30178 9.11244 4.30178 9.40533 4.59467C9.69822 4.88756 9.69822 5.36244 9.40533 5.65533L8.06066 7L9.40533 8.34467C9.69822 8.63756 9.69822 9.11244 9.40533 9.40533C9.11244 9.69822 8.63756 9.69822 8.34467 9.40533L7 8.06066L5.65533 9.40533C5.36244 9.69822 4.88756 9.69822 4.59467 9.40533C4.30178 9.11244 4.30178 8.63756 4.59467 8.34467L5.93934 7L4.59467 5.65533C4.30178 5.36244 4.30178 4.88756 4.59467 4.59467Z",
+							"fill": "currentColor"
+						},
+						"children": []
+					}
+				]
+			}
+		]
+	},
+	"name": "VariableX"
+}
\ No newline at end of file
diff --git a/app/components/base/icons/src/vender/workflow/VariableX.tsx b/app/components/base/icons/src/vender/workflow/VariableX.tsx
new file mode 100644
index 0000000..43ec10a
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/VariableX.tsx
@@ -0,0 +1,20 @@
+// GENERATE BY script
+// DON NOT EDIT IT MANUALLY
+
+import * as React from 'react'
+import data from './VariableX.json'
+import IconBase from '@/app/components/base/icons/IconBase'
+import type { IconData } from '@/app/components/base/icons/IconBase'
+
+const Icon = (
+  {
+    ref,
+    ...props
+  }: React.SVGProps<SVGSVGElement> & {
+    ref?: React.RefObject<React.MutableRefObject<HTMLOrSVGElement>>;
+  },
+) => <IconBase {...props} ref={ref} data={data as IconData} />
+
+Icon.displayName = 'VariableX'
+
+export default Icon
diff --git a/app/components/base/icons/src/vender/workflow/index.ts b/app/components/base/icons/src/vender/workflow/index.ts
new file mode 100644
index 0000000..7167b71
--- /dev/null
+++ b/app/components/base/icons/src/vender/workflow/index.ts
@@ -0,0 +1,21 @@
+export { default as Agent } from './Agent'
+export { default as Answer } from './Answer'
+export { default as Assigner } from './Assigner'
+export { default as Code } from './Code'
+export { default as DocsExtractor } from './DocsExtractor'
+export { default as End } from './End'
+export { default as Home } from './Home'
+export { default as Http } from './Http'
+export { default as IfElse } from './IfElse'
+export { default as IterationStart } from './IterationStart'
+export { default as Iteration } from './Iteration'
+export { default as Jinja } from './Jinja'
+export { default as KnowledgeRetrieval } from './KnowledgeRetrieval'
+export { default as ListFilter } from './ListFilter'
+export { default as Llm } from './Llm'
+export { default as LoopEnd } from './LoopEnd'
+export { default as Loop } from './Loop'
+export { default as ParameterExtractor } from './ParameterExtractor'
+export { default as QuestionClassifier } from './QuestionClassifier'
+export { default as TemplatingTransform } from './TemplatingTransform'
+export { default as VariableX } from './VariableX'
diff --git a/app/components/base/icons/utils.spec.ts b/app/components/base/icons/utils.spec.ts
new file mode 100644
index 0000000..bfa8e39
--- /dev/null
+++ b/app/components/base/icons/utils.spec.ts
@@ -0,0 +1,70 @@
+import type { AbstractNode } from './utils'
+import { generate, normalizeAttrs } from './utils'
+import { render } from '@testing-library/react'
+import '@testing-library/jest-dom'
+
+describe('generate icon base utils', () => {
+  describe('normalizeAttrs', () => {
+    it('should normalize class to className', () => {
+      const attrs = { class: 'test-class' }
+      const result = normalizeAttrs(attrs)
+      expect(result).toEqual({ className: 'test-class' })
+    })
+
+    it('should normalize style string to style object', () => {
+      const attrs = { style: 'color:red;font-size:14px;' }
+      const result = normalizeAttrs(attrs)
+      expect(result).toEqual({ style: { color: 'red', fontSize: '14px' } })
+    })
+
+    it('should handle attributes with dashes and colons', () => {
+      const attrs = { 'data-test': 'value', 'xlink:href': 'url' }
+      const result = normalizeAttrs(attrs)
+      expect(result).toEqual({ dataTest: 'value', xlinkHref: 'url' })
+    })
+  })
+
+  describe('generate', () => {
+    it('should generate React elements from AbstractNode', () => {
+      const node: AbstractNode = {
+        name: 'div',
+        attributes: { class: 'container' },
+        children: [
+          {
+            name: 'span',
+            attributes: { style: 'color:blue;' },
+            children: [],
+          },
+        ],
+      }
+
+      const { container } = render(generate(node, 'key'))
+      // to svg element
+      expect(container.firstChild).toHaveClass('container')
+      expect(container.querySelector('span')).toHaveStyle({ color: 'blue' })
+    })
+
+    // add not has children
+    it('should generate React elements without children', () => {
+      const node: AbstractNode = {
+        name: 'div',
+        attributes: { class: 'container' },
+      }
+      const { container } = render(generate(node, 'key'))
+      // to svg element
+      expect(container.firstChild).toHaveClass('container')
+    })
+
+    it('should merge rootProps when provided', () => {
+      const node: AbstractNode = {
+        name: 'div',
+        attributes: { class: 'container' },
+        children: [],
+      }
+
+      const rootProps = { id: 'root' }
+      const { container } = render(generate(node, 'key', rootProps))
+      expect(container.querySelector('div')).toHaveAttribute('id', 'root')
+    })
+  })
+})
diff --git a/app/components/base/icons/utils.ts b/app/components/base/icons/utils.ts
new file mode 100644
index 0000000..90d075f
--- /dev/null
+++ b/app/components/base/icons/utils.ts
@@ -0,0 +1,66 @@
+import React from 'react'
+
+export type AbstractNode = {
+  name: string
+  attributes: {
+    [key: string]: string
+  }
+  children?: AbstractNode[]
+}
+
+export type Attrs = {
+  [key: string]: string
+}
+
+export function normalizeAttrs(attrs: Attrs = {}): Attrs {
+  return Object.keys(attrs).reduce((acc: Attrs, key) => {
+    const val = attrs[key]
+    key = key.replace(/([-]\w)/g, (g: string) => g[1].toUpperCase())
+    key = key.replace(/([:]\w)/g, (g: string) => g[1].toUpperCase())
+    switch (key) {
+      case 'class':
+        acc.className = val
+        delete acc.class
+        break
+      case 'style':
+        (acc.style as any) = val.split(';').reduce((prev, next) => {
+          const pairs = next?.split(':')
+
+          if (pairs[0] && pairs[1]) {
+            const k = pairs[0].replace(/([-]\w)/g, (g: string) => g[1].toUpperCase())
+            prev[k] = pairs[1]
+          }
+
+          return prev
+        }, {} as Attrs)
+        break
+      default:
+        acc[key] = val
+    }
+    return acc
+  }, {})
+}
+
+export function generate(
+  node: AbstractNode,
+  key: string,
+  rootProps?: { [key: string]: any } | false,
+): any {
+  if (!rootProps) {
+    return React.createElement(
+      node.name,
+      { key, ...normalizeAttrs(node.attributes) },
+      (node.children || []).map((child, index) => generate(child, `${key}-${node.name}-${index}`)),
+    )
+  }
+
+  return React.createElement(
+    node.name,
+    {
+      key,
+      ...normalizeAttrs(node.attributes),
+      ...rootProps,
+    },
+    (node.children || []).map((child, index) => generate(child, `${key}-${node.name}-${index}`)),
+  )
+}
diff --git a/app/components/base/image-gallery/index.tsx b/app/components/base/image-gallery/index.tsx
new file mode 100644
index 0000000..0f9061f
--- /dev/null
+++ b/app/components/base/image-gallery/index.tsx
@@ -0,0 +1,84 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import s from './style.module.css'
+import cn from '@/utils/classnames'
+import ImagePreview from '@/app/components/base/image-uploader/image-preview'
+
+type Props = {
+  srcs: string[]
+}
+
+const getWidthStyle = (imgNum: number) => {
+  if (imgNum === 1) {
+    return {
+      maxWidth: '100%',
+    }
+  }
+
+  if (imgNum === 2 || imgNum === 4) {
+    return {
+      width: 'calc(50% - 4px)',
+    }
+  }
+
+  return {
+    width: 'calc(33.3333% - 5.3333px)',
+  }
+}
+
+const ImageGallery: FC<Props> = ({
+  srcs,
+}) => {
+  const [imagePreviewUrl, setImagePreviewUrl] = useState('')
+
+  const imgNum = srcs.length
+  const imgStyle = getWidthStyle(imgNum)
+  return (
+    <div className={cn(s[`img-${imgNum}`], 'flex flex-wrap')}>
+      {/* TODO: support preview */}
+      {srcs.map((src, index) => (
+
+        <img
+          key={index}
+          className={s.item}
+          style={imgStyle}
+          src={src}
+          alt=''
+          onClick={() => setImagePreviewUrl(src)}
+          onError={e => e.currentTarget.remove()}
+        />
+      ))}
+      {
+        imagePreviewUrl && (
+          <ImagePreview
+            url={imagePreviewUrl}
+            onCancel={() => setImagePreviewUrl('')} title={''} />
+        )
+      }
+    </div>
+  )
+}
+
+export default React.memo(ImageGallery)
+
+export const ImageGalleryTest = () => {
+  const imgGallerySrcs = (() => {
+    const srcs = []
+    for (let i = 0; i < 6; i++)
+      // srcs.push('https://placekitten.com/640/360')
+      // srcs.push('https://placekitten.com/360/640')
+      srcs.push('https://placekitten.com/360/360')
+
+    return srcs
+  })()
+  return (
+    <div className='space-y-2'>
+      {imgGallerySrcs.map((_, index) => (
+        <div key={index} className='rounded-lg bg-[#D1E9FF80] p-4 pb-2'>
+          <ImageGallery srcs={imgGallerySrcs.slice(0, index + 1)} />
+        </div>
+      ))}
+    </div>
+  )
+}
diff --git a/app/components/base/image-gallery/style.module.css b/app/components/base/image-gallery/style.module.css
new file mode 100644
index 0000000..2e4c62e
--- /dev/null
+++ b/app/components/base/image-gallery/style.module.css
@@ -0,0 +1,22 @@
+.item {
+  max-height: 200px;
+  margin-right: 8px;
+  margin-bottom: 8px;
+  object-fit: contain;
+  object-position: center;
+  border-radius: 8px;
+  cursor: pointer;
+}
+
+.item:nth-child(3n) {
+  margin-right: 0;
+}
+
+.img-2 .item:nth-child(2n),
+.img-4 .item:nth-child(2n) {
+  margin-right: 0;
+}
+
+.img-4 .item:nth-child(3n) {
+  margin-right: 8px;
+}
diff --git a/app/components/base/image-uploader/audio-preview.tsx b/app/components/base/image-uploader/audio-preview.tsx
new file mode 100644
index 0000000..d1f71f8
--- /dev/null
+++ b/app/components/base/image-uploader/audio-preview.tsx
@@ -0,0 +1,37 @@
+import type { FC } from 'react'
+import { createPortal } from 'react-dom'
+import { RiCloseLine } from '@remixicon/react'
+
+type AudioPreviewProps = {
+  url: string
+  title: string
+  onCancel: () => void
+}
+const AudioPreview: FC<AudioPreviewProps> = ({
+  url,
+  title,
+  onCancel,
+}) => {
+  return createPortal(
+    <div className='fixed inset-0 z-[1000] flex items-center justify-center bg-black/80 p-8' onClick={e => e.stopPropagation()}>
+      <div>
+        <audio controls title={title} autoPlay={false} preload="metadata">
+          <source
+            type="audio/mpeg"
+            src={url}
+            className='max-h-full max-w-full'
+          />
+        </audio>
+      </div>
+      <div
+        className='absolute right-6 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg bg-white/[0.08] backdrop-blur-[2px]'
+        onClick={onCancel}
+      >
+        <RiCloseLine className='h-4 w-4 text-gray-500'/>
+      </div>
+    </div>,
+    document.body,
+  )
+}
+
+export default AudioPreview
diff --git a/app/components/base/image-uploader/chat-image-uploader.tsx b/app/components/base/image-uploader/chat-image-uploader.tsx
new file mode 100644
index 0000000..401af2b
--- /dev/null
+++ b/app/components/base/image-uploader/chat-image-uploader.tsx
@@ -0,0 +1,159 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import Uploader from './uploader'
+import ImageLinkInput from './image-link-input'
+import cn from '@/utils/classnames'
+import { ImagePlus } from '@/app/components/base/icons/src/vender/line/images'
+import { TransferMethod } from '@/types/app'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { Upload03 } from '@/app/components/base/icons/src/vender/line/general'
+import type { ImageFile, VisionSettings } from '@/types/app'
+
+type UploadOnlyFromLocalProps = {
+  onUpload: (imageFile: ImageFile) => void
+  disabled?: boolean
+  limit?: number
+}
+const UploadOnlyFromLocal: FC<UploadOnlyFromLocalProps> = ({
+  onUpload,
+  disabled,
+  limit,
+}) => {
+  return (
+    <Uploader onUpload={onUpload} disabled={disabled} limit={limit}>
+      {hovering => (
+        <div
+          className={`
+            relative flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg
+            ${hovering && 'bg-gray-100'}
+          `}
+        >
+          <ImagePlus className="h-4 w-4 text-gray-500" />
+        </div>
+      )}
+    </Uploader>
+  )
+}
+
+type UploaderButtonProps = {
+  methods: VisionSettings['transfer_methods']
+  onUpload: (imageFile: ImageFile) => void
+  disabled?: boolean
+  limit?: number
+}
+const UploaderButton: FC<UploaderButtonProps> = ({
+  methods,
+  onUpload,
+  disabled,
+  limit,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const hasUploadFromLocal = methods.find(
+    method => method === TransferMethod.local_file,
+  )
+
+  const handleUpload = (imageFile: ImageFile) => {
+    onUpload(imageFile)
+  }
+
+  const closePopover = () => setOpen(false)
+
+  const handleToggle = () => {
+    if (disabled)
+      return
+
+    setOpen(v => !v)
+  }
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement="top-start"
+    >
+      <PortalToFollowElemTrigger onClick={handleToggle}>
+        <button
+          type="button"
+          disabled={disabled}
+          className="relative flex h-8 w-8 items-center justify-center rounded-lg enabled:hover:bg-gray-100 disabled:cursor-not-allowed"
+        >
+          <ImagePlus className="h-4 w-4 text-gray-500" />
+        </button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className="z-50">
+        <div className="w-[260px] rounded-lg border-[0.5px] border-gray-200 bg-white p-2 shadow-lg">
+          <ImageLinkInput onUpload={handleUpload} disabled={disabled} />
+          {hasUploadFromLocal && (
+            <>
+              <div className="mt-2 flex items-center px-2 text-xs font-medium text-gray-400">
+                <div className="mr-3 h-[1px] w-[93px] bg-gradient-to-l from-[#F3F4F6]" />
+                OR
+                <div className="ml-3 h-[1px] w-[93px] bg-gradient-to-r from-[#F3F4F6]" />
+              </div>
+              <Uploader
+                onUpload={handleUpload}
+                limit={limit}
+                closePopover={closePopover}
+              >
+                {hovering => (
+                  <div
+                    className={cn(
+                      'flex h-8 cursor-pointer items-center justify-center rounded-lg text-[13px] font-medium text-[#155EEF]',
+                      hovering && 'bg-primary-50',
+                    )}
+                  >
+                    <Upload03 className="mr-1 h-4 w-4" />
+                    {t('common.imageUploader.uploadFromComputer')}
+                  </div>
+                )}
+              </Uploader>
+            </>
+          )}
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+type ChatImageUploaderProps = {
+  settings: VisionSettings
+  onUpload: (imageFile: ImageFile) => void
+  disabled?: boolean
+}
+const ChatImageUploader: FC<ChatImageUploaderProps> = ({
+  settings,
+  onUpload,
+  disabled,
+}) => {
+  const onlyUploadLocal
+    = settings.transfer_methods.length === 1
+    && settings.transfer_methods[0] === TransferMethod.local_file
+
+  if (onlyUploadLocal) {
+    return (
+      <UploadOnlyFromLocal
+        onUpload={onUpload}
+        disabled={disabled}
+        limit={+settings.image_file_size_limit!}
+      />
+    )
+  }
+
+  return (
+    <UploaderButton
+      methods={settings.transfer_methods}
+      onUpload={onUpload}
+      disabled={disabled}
+      limit={+settings.image_file_size_limit!}
+    />
+  )
+}
+
+export default ChatImageUploader
diff --git a/app/components/base/image-uploader/hooks.ts b/app/components/base/image-uploader/hooks.ts
new file mode 100644
index 0000000..4107400
--- /dev/null
+++ b/app/components/base/image-uploader/hooks.ts
@@ -0,0 +1,270 @@
+import { useCallback, useMemo, useRef, useState } from 'react'
+import type { ClipboardEvent } from 'react'
+import { useParams } from 'next/navigation'
+import { useTranslation } from 'react-i18next'
+import { imageUpload } from './utils'
+import { useToastContext } from '@/app/components/base/toast'
+import { ALLOW_FILE_EXTENSIONS, TransferMethod } from '@/types/app'
+import type { ImageFile, VisionSettings } from '@/types/app'
+
+export const useImageFiles = () => {
+  const params = useParams()
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const [files, setFiles] = useState<ImageFile[]>([])
+  const filesRef = useRef<ImageFile[]>([])
+
+  const handleUpload = (imageFile: ImageFile) => {
+    const files = filesRef.current
+    const index = files.findIndex(file => file._id === imageFile._id)
+
+    if (index > -1) {
+      const currentFile = files[index]
+      const newFiles = [...files.slice(0, index), { ...currentFile, ...imageFile }, ...files.slice(index + 1)]
+      setFiles(newFiles)
+      filesRef.current = newFiles
+    }
+    else {
+      const newFiles = [...files, imageFile]
+      setFiles(newFiles)
+      filesRef.current = newFiles
+    }
+  }
+  const handleRemove = (imageFileId: string) => {
+    const files = filesRef.current
+    const index = files.findIndex(file => file._id === imageFileId)
+
+    if (index > -1) {
+      const currentFile = files[index]
+      const newFiles = [...files.slice(0, index), { ...currentFile, deleted: true }, ...files.slice(index + 1)]
+      setFiles(newFiles)
+      filesRef.current = newFiles
+    }
+  }
+  const handleImageLinkLoadError = (imageFileId: string) => {
+    const files = filesRef.current
+    const index = files.findIndex(file => file._id === imageFileId)
+
+    if (index > -1) {
+      const currentFile = files[index]
+      const newFiles = [...files.slice(0, index), { ...currentFile, progress: -1 }, ...files.slice(index + 1)]
+      filesRef.current = newFiles
+      setFiles(newFiles)
+    }
+  }
+  const handleImageLinkLoadSuccess = (imageFileId: string) => {
+    const files = filesRef.current
+    const index = files.findIndex(file => file._id === imageFileId)
+
+    if (index > -1) {
+      const currentImageFile = files[index]
+      const newFiles = [...files.slice(0, index), { ...currentImageFile, progress: 100 }, ...files.slice(index + 1)]
+      filesRef.current = newFiles
+      setFiles(newFiles)
+    }
+  }
+  const handleReUpload = (imageFileId: string) => {
+    const files = filesRef.current
+    const index = files.findIndex(file => file._id === imageFileId)
+
+    if (index > -1) {
+      const currentImageFile = files[index]
+      imageUpload({
+        file: currentImageFile.file!,
+        onProgressCallback: (progress) => {
+          const newFiles = [...files.slice(0, index), { ...currentImageFile, progress }, ...files.slice(index + 1)]
+          filesRef.current = newFiles
+          setFiles(newFiles)
+        },
+        onSuccessCallback: (res) => {
+          const newFiles = [...files.slice(0, index), { ...currentImageFile, fileId: res.id, progress: 100 }, ...files.slice(index + 1)]
+          filesRef.current = newFiles
+          setFiles(newFiles)
+        },
+        onErrorCallback: () => {
+          notify({ type: 'error', message: t('common.imageUploader.uploadFromComputerUploadError') })
+          const newFiles = [...files.slice(0, index), { ...currentImageFile, progress: -1 }, ...files.slice(index + 1)]
+          filesRef.current = newFiles
+          setFiles(newFiles)
+        },
+      }, !!params.token)
+    }
+  }
+
+  const handleClear = () => {
+    setFiles([])
+    filesRef.current = []
+  }
+
+  const filteredFiles = useMemo(() => {
+    return files.filter(file => !file.deleted)
+  }, [files])
+
+  return {
+    files: filteredFiles,
+    onUpload: handleUpload,
+    onRemove: handleRemove,
+    onImageLinkLoadError: handleImageLinkLoadError,
+    onImageLinkLoadSuccess: handleImageLinkLoadSuccess,
+    onReUpload: handleReUpload,
+    onClear: handleClear,
+  }
+}
+
+type useLocalUploaderProps = {
+  disabled?: boolean
+  limit?: number
+  onUpload: (imageFile: ImageFile) => void
+}
+
+export const useLocalFileUploader = ({ limit, disabled = false, onUpload }: useLocalUploaderProps) => {
+  const { notify } = useToastContext()
+  const params = useParams()
+  const { t } = useTranslation()
+
+  const handleLocalFileUpload = useCallback((file: File) => {
+    if (disabled) {
+      // TODO: leave some warnings?
+      return
+    }
+
+    if (!ALLOW_FILE_EXTENSIONS.includes(file.type.split('/')[1]))
+      return
+
+    if (limit && file.size > limit * 1024 * 1024) {
+      notify({ type: 'error', message: t('common.imageUploader.uploadFromComputerLimit', { size: limit }) })
+      return
+    }
+
+    const reader = new FileReader()
+    reader.addEventListener(
+      'load',
+      () => {
+        const imageFile = {
+          type: TransferMethod.local_file,
+          _id: `${Date.now()}`,
+          fileId: '',
+          file,
+          url: reader.result as string,
+          base64Url: reader.result as string,
+          progress: 0,
+        }
+        onUpload(imageFile)
+        imageUpload({
+          file: imageFile.file,
+          onProgressCallback: (progress) => {
+            onUpload({ ...imageFile, progress })
+          },
+          onSuccessCallback: (res) => {
+            onUpload({ ...imageFile, fileId: res.id, progress: 100 })
+          },
+          onErrorCallback: () => {
+            notify({ type: 'error', message: t('common.imageUploader.uploadFromComputerUploadError') })
+            onUpload({ ...imageFile, progress: -1 })
+          },
+        }, !!params.token)
+      },
+      false,
+    )
+    reader.addEventListener(
+      'error',
+      () => {
+        notify({ type: 'error', message: t('common.imageUploader.uploadFromComputerReadError') })
+      },
+      false,
+    )
+    reader.readAsDataURL(file)
+  }, [disabled, limit, notify, t, onUpload, params.token])
+
+  return { disabled, handleLocalFileUpload }
+}
+
+type useClipboardUploaderProps = {
+  files: ImageFile[]
+  visionConfig?: VisionSettings
+  onUpload: (imageFile: ImageFile) => void
+}
+
+export const useClipboardUploader = ({ visionConfig, onUpload, files }: useClipboardUploaderProps) => {
+  const allowLocalUpload = visionConfig?.transfer_methods?.includes(TransferMethod.local_file)
+  const disabled = useMemo(() =>
+    !visionConfig
+    || !visionConfig?.enabled
+    || !allowLocalUpload
+    || files.length >= visionConfig.number_limits!,
+  [allowLocalUpload, files.length, visionConfig])
+  const limit = useMemo(() => visionConfig ? +visionConfig.image_file_size_limit! : 0, [visionConfig])
+  const { handleLocalFileUpload } = useLocalFileUploader({ limit, onUpload, disabled })
+
+  const handleClipboardPaste = useCallback((e: ClipboardEvent<HTMLTextAreaElement>) => {
+    // reserve native text copy behavior
+    const file = e.clipboardData?.files[0]
+    // when copied file, prevent default action
+    if (file) {
+      e.preventDefault()
+      handleLocalFileUpload(file)
+    }
+  }, [handleLocalFileUpload])
+
+  return {
+    onPaste: handleClipboardPaste,
+  }
+}
+
+type useDraggableUploaderProps = {
+  files: ImageFile[]
+  visionConfig?: VisionSettings
+  onUpload: (imageFile: ImageFile) => void
+}
+
+export const useDraggableUploader = <T extends HTMLElement>({ visionConfig, onUpload, files }: useDraggableUploaderProps) => {
+  const allowLocalUpload = visionConfig?.transfer_methods?.includes(TransferMethod.local_file)
+  const disabled = useMemo(() =>
+    !visionConfig
+    || !visionConfig?.enabled
+    || !allowLocalUpload
+    || files.length >= visionConfig.number_limits!,
+  [allowLocalUpload, files.length, visionConfig])
+  const limit = useMemo(() => visionConfig ? +visionConfig.image_file_size_limit! : 0, [visionConfig])
+  const { handleLocalFileUpload } = useLocalFileUploader({ disabled, onUpload, limit })
+  const [isDragActive, setIsDragActive] = useState(false)
+
+  const handleDragEnter = useCallback((e: React.DragEvent<T>) => {
+    e.preventDefault()
+    e.stopPropagation()
+    if (!disabled)
+      setIsDragActive(true)
+  }, [disabled])
+
+  const handleDragOver = useCallback((e: React.DragEvent<T>) => {
+    e.preventDefault()
+    e.stopPropagation()
+  }, [])
+
+  const handleDragLeave = useCallback((e: React.DragEvent<T>) => {
+    e.preventDefault()
+    e.stopPropagation()
+    setIsDragActive(false)
+  }, [])
+
+  const handleDrop = useCallback((e: React.DragEvent<T>) => {
+    e.preventDefault()
+    e.stopPropagation()
+    setIsDragActive(false)
+
+    const file = e.dataTransfer.files[0]
+
+    if (!file)
+      return
+
+    handleLocalFileUpload(file)
+  }, [handleLocalFileUpload])
+
+  return {
+    onDragEnter: handleDragEnter,
+    onDragOver: handleDragOver,
+    onDragLeave: handleDragLeave,
+    onDrop: handleDrop,
+    isDragActive,
+  }
+}
diff --git a/app/components/base/image-uploader/image-link-input.tsx b/app/components/base/image-uploader/image-link-input.tsx
new file mode 100644
index 0000000..a767e0c
--- /dev/null
+++ b/app/components/base/image-uploader/image-link-input.tsx
@@ -0,0 +1,56 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import Button from '@/app/components/base/button'
+import type { ImageFile } from '@/types/app'
+import { TransferMethod } from '@/types/app'
+
+type ImageLinkInputProps = {
+  onUpload: (imageFile: ImageFile) => void
+  disabled?: boolean
+}
+const regex = /^(https?|ftp):\/\//
+const ImageLinkInput: FC<ImageLinkInputProps> = ({
+  onUpload,
+  disabled,
+}) => {
+  const { t } = useTranslation()
+  const [imageLink, setImageLink] = useState('')
+
+  const handleClick = () => {
+    if (disabled)
+      return
+
+    const imageFile = {
+      type: TransferMethod.remote_url,
+      _id: `${Date.now()}`,
+      fileId: '',
+      progress: regex.test(imageLink) ? 0 : -1,
+      url: imageLink,
+    }
+
+    onUpload(imageFile)
+  }
+
+  return (
+    <div className='flex h-8 items-center rounded-lg border border-components-panel-border bg-components-panel-bg pl-1.5 pr-1 shadow-xs'>
+      <input
+        type="text"
+        className='mr-0.5 h-[18px] grow appearance-none bg-transparent px-1 text-[13px] text-text-primary outline-none'
+        value={imageLink}
+        onChange={e => setImageLink(e.target.value)}
+        placeholder={t('common.imageUploader.pasteImageLinkInputPlaceholder') || ''}
+      />
+      <Button
+        variant='primary'
+        size='small'
+        disabled={!imageLink || disabled}
+        onClick={handleClick}
+      >
+        {t('common.operation.ok')}
+      </Button>
+    </div>
+  )
+}
+
+export default ImageLinkInput
diff --git a/app/components/base/image-uploader/image-list.tsx b/app/components/base/image-uploader/image-list.tsx
new file mode 100644
index 0000000..758ffe9
--- /dev/null
+++ b/app/components/base/image-uploader/image-list.tsx
@@ -0,0 +1,143 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiCloseLine,
+  RiLoader2Line,
+} from '@remixicon/react'
+import cn from '@/utils/classnames'
+import { RefreshCcw01 } from '@/app/components/base/icons/src/vender/line/arrows'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback'
+import Tooltip from '@/app/components/base/tooltip'
+import type { ImageFile } from '@/types/app'
+import { TransferMethod } from '@/types/app'
+import ImagePreview from '@/app/components/base/image-uploader/image-preview'
+
+type ImageListProps = {
+  list: ImageFile[]
+  readonly?: boolean
+  onRemove?: (imageFileId: string) => void
+  onReUpload?: (imageFileId: string) => void
+  onImageLinkLoadSuccess?: (imageFileId: string) => void
+  onImageLinkLoadError?: (imageFileId: string) => void
+}
+
+const ImageList: FC<ImageListProps> = ({
+  list,
+  readonly,
+  onRemove,
+  onReUpload,
+  onImageLinkLoadSuccess,
+  onImageLinkLoadError,
+}) => {
+  const { t } = useTranslation()
+  const [imagePreviewUrl, setImagePreviewUrl] = useState('')
+
+  const handleImageLinkLoadSuccess = (item: ImageFile) => {
+    if (
+      item.type === TransferMethod.remote_url
+      && onImageLinkLoadSuccess
+      && item.progress !== -1
+    )
+      onImageLinkLoadSuccess(item._id)
+  }
+  const handleImageLinkLoadError = (item: ImageFile) => {
+    if (item.type === TransferMethod.remote_url && onImageLinkLoadError)
+      onImageLinkLoadError(item._id)
+  }
+
+  return (
+    <div className="flex flex-wrap">
+      {list.map(item => (
+        <div
+          key={item._id}
+          className="group relative mr-1 rounded-lg border-[0.5px] border-black/5"
+        >
+          {item.type === TransferMethod.local_file && item.progress !== 100 && (
+            <>
+              <div
+                className="absolute inset-0 z-[1] flex items-center justify-center bg-black/30"
+                style={{ left: item.progress > -1 ? `${item.progress}%` : 0 }}
+              >
+                {item.progress === -1 && (
+                  <RefreshCcw01
+                    className="h-5 w-5 text-white"
+                    onClick={() => onReUpload && onReUpload(item._id)}
+                  />
+                )}
+              </div>
+              {item.progress > -1 && (
+                <span className="absolute left-[50%] top-[50%] z-[1] translate-x-[-50%] translate-y-[-50%] text-sm text-white mix-blend-lighten">
+                  {item.progress}%
+                </span>
+              )}
+            </>
+          )}
+          {item.type === TransferMethod.remote_url && item.progress !== 100 && (
+            <div
+              className={`
+                  absolute inset-0 z-[1] flex items-center justify-center rounded-lg border
+                  ${item.progress === -1
+              ? 'border-[#DC6803] bg-[#FEF0C7]'
+              : 'border-transparent bg-black/[0.16]'
+            }
+                `}
+            >
+              {item.progress > -1 && (
+                <RiLoader2Line className="h-5 w-5 animate-spin text-white" />
+              )}
+              {item.progress === -1 && (
+                <Tooltip
+                  popupContent={t('common.imageUploader.pasteImageLinkInvalid')}
+                >
+                  <AlertTriangle className="h-4 w-4 text-[#DC6803]" />
+                </Tooltip>
+              )}
+            </div>
+          )}
+          <img
+            className="h-16 w-16 cursor-pointer rounded-lg border-[0.5px] border-black/5 object-cover"
+            alt={item.file?.name}
+            onLoad={() => handleImageLinkLoadSuccess(item)}
+            onError={() => handleImageLinkLoadError(item)}
+            src={
+              item.type === TransferMethod.remote_url
+                ? item.url
+                : item.base64Url
+            }
+            onClick={() =>
+              item.progress === 100
+              && setImagePreviewUrl(
+                (item.type === TransferMethod.remote_url
+                  ? item.url
+                  : item.base64Url) as string,
+              )
+            }
+          />
+          {!readonly && (
+            <button
+              type="button"
+              className={cn(
+                'absolute -right-[9px] -top-[9px] z-10 h-[18px] w-[18px] items-center justify-center',
+                'rounded-2xl shadow-lg hover:bg-state-base-hover',
+                item.progress === -1 ? 'flex' : 'hidden group-hover:flex',
+              )}
+              onClick={() => onRemove && onRemove(item._id)}
+            >
+              <RiCloseLine className="h-3 w-3 text-text-tertiary" />
+            </button>
+          )}
+        </div>
+      ))}
+      {imagePreviewUrl && (
+        <ImagePreview
+          url={imagePreviewUrl}
+          onCancel={() => setImagePreviewUrl('')}
+          title=''
+        />
+      )}
+    </div>
+  )
+}
+
+export default ImageList
diff --git a/app/components/base/image-uploader/image-preview.tsx b/app/components/base/image-uploader/image-preview.tsx
new file mode 100644
index 0000000..e67edaa
--- /dev/null
+++ b/app/components/base/image-uploader/image-preview.tsx
@@ -0,0 +1,269 @@
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useRef, useState } from 'react'
+import { t } from 'i18next'
+import { createPortal } from 'react-dom'
+import { RiAddBoxLine, RiCloseLine, RiDownloadCloud2Line, RiFileCopyLine, RiZoomInLine, RiZoomOutLine } from '@remixicon/react'
+import { useHotkeys } from 'react-hotkeys-hook'
+import Tooltip from '@/app/components/base/tooltip'
+import Toast from '@/app/components/base/toast'
+import { noop } from 'lodash-es'
+
+type ImagePreviewProps = {
+  url: string
+  title: string
+  onCancel: () => void
+  onPrev?: () => void
+  onNext?: () => void
+}
+
+const isBase64 = (str: string): boolean => {
+  try {
+    return btoa(atob(str)) === str
+  }
+  catch (err) {
+    return false
+  }
+}
+
+const ImagePreview: FC<ImagePreviewProps> = ({
+  url,
+  title,
+  onCancel,
+  onPrev,
+  onNext,
+}) => {
+  const [scale, setScale] = useState(1)
+  const [position, setPosition] = useState({ x: 0, y: 0 })
+  const [isDragging, setIsDragging] = useState(false)
+  const imgRef = useRef<HTMLImageElement>(null)
+  const dragStartRef = useRef({ x: 0, y: 0 })
+  const [isCopied, setIsCopied] = useState(false)
+
+  const openInNewTab = () => {
+    // Open in a new window, considering the case when the page is inside an iframe
+    if (url.startsWith('http') || url.startsWith('https')) {
+      window.open(url, '_blank')
+    }
+    else if (url.startsWith('data:image')) {
+      // Base64 image
+      const win = window.open()
+      win?.document.write(`<img src="${url}" alt="${title}" />`)
+    }
+    else {
+      Toast.notify({
+        type: 'error',
+        message: `Unable to open image: ${url}`,
+      })
+    }
+  }
+
+  const downloadImage = () => {
+    // Open in a new window, considering the case when the page is inside an iframe
+    if (url.startsWith('http') || url.startsWith('https')) {
+      const a = document.createElement('a')
+      a.href = url
+      a.target = '_blank'
+      a.download = title
+      a.click()
+    }
+    else if (url.startsWith('data:image')) {
+      // Base64 image
+      const a = document.createElement('a')
+      a.href = url
+      a.target = '_blank'
+      a.download = title
+      a.click()
+    }
+    else {
+      Toast.notify({
+        type: 'error',
+        message: `Unable to open image: ${url}`,
+      })
+    }
+  }
+
+  const zoomIn = () => {
+    setScale(prevScale => Math.min(prevScale * 1.2, 15))
+  }
+
+  const zoomOut = () => {
+    setScale((prevScale) => {
+      const newScale = Math.max(prevScale / 1.2, 0.5)
+      if (newScale === 1)
+        setPosition({ x: 0, y: 0 }) // Reset position when fully zoomed out
+
+      return newScale
+    })
+  }
+
+  const imageBase64ToBlob = (base64: string, type = 'image/png'): Blob => {
+    const byteCharacters = atob(base64)
+    const byteArrays = []
+
+    for (let offset = 0; offset < byteCharacters.length; offset += 512) {
+      const slice = byteCharacters.slice(offset, offset + 512)
+      const byteNumbers = Array.from({ length: slice.length })
+      for (let i = 0; i < slice.length; i++)
+        byteNumbers[i] = slice.charCodeAt(i)
+
+      const byteArray = new Uint8Array(byteNumbers as any)
+      byteArrays.push(byteArray)
+    }
+
+    return new Blob(byteArrays, { type })
+  }
+
+  const imageCopy = useCallback(() => {
+    const shareImage = async () => {
+      try {
+        const base64Data = url.split(',')[1]
+        const blob = imageBase64ToBlob(base64Data, 'image/png')
+
+        await navigator.clipboard.write([
+          new ClipboardItem({
+            [blob.type]: blob,
+          }),
+        ])
+        setIsCopied(true)
+
+        Toast.notify({
+          type: 'success',
+          message: t('common.operation.imageCopied'),
+        })
+      }
+      catch (err) {
+        console.error('Failed to copy image:', err)
+
+        const link = document.createElement('a')
+        link.href = url
+        link.download = `${title}.png`
+        document.body.appendChild(link)
+        link.click()
+        document.body.removeChild(link)
+
+        Toast.notify({
+          type: 'info',
+          message: t('common.operation.imageDownloaded'),
+        })
+      }
+    }
+    shareImage()
+  }, [title, url])
+
+  const handleWheel = useCallback((e: React.WheelEvent<HTMLDivElement>) => {
+    if (e.deltaY < 0)
+      zoomIn()
+    else
+      zoomOut()
+  }, [])
+
+  const handleMouseDown = useCallback((e: React.MouseEvent<HTMLDivElement>) => {
+    if (scale > 1) {
+      setIsDragging(true)
+      dragStartRef.current = { x: e.clientX - position.x, y: e.clientY - position.y }
+    }
+  }, [scale, position])
+
+  const handleMouseMove = useCallback((e: React.MouseEvent<HTMLDivElement>) => {
+    if (isDragging && scale > 1) {
+      const deltaX = e.clientX - dragStartRef.current.x
+      const deltaY = e.clientY - dragStartRef.current.y
+
+      // Calculate boundaries
+      const imgRect = imgRef.current?.getBoundingClientRect()
+      const containerRect = imgRef.current?.parentElement?.getBoundingClientRect()
+
+      if (imgRect && containerRect) {
+        const maxX = (imgRect.width * scale - containerRect.width) / 2
+        const maxY = (imgRect.height * scale - containerRect.height) / 2
+
+        setPosition({
+          x: Math.max(-maxX, Math.min(maxX, deltaX)),
+          y: Math.max(-maxY, Math.min(maxY, deltaY)),
+        })
+      }
+    }
+  }, [isDragging, scale])
+
+  const handleMouseUp = useCallback(() => {
+    setIsDragging(false)
+  }, [])
+
+  useEffect(() => {
+    document.addEventListener('mouseup', handleMouseUp)
+    return () => {
+      document.removeEventListener('mouseup', handleMouseUp)
+    }
+  }, [handleMouseUp])
+
+  useHotkeys('esc', onCancel)
+  useHotkeys('up', zoomIn)
+  useHotkeys('down', zoomOut)
+  useHotkeys('left', onPrev || noop)
+  useHotkeys('right', onNext || noop)
+
+  return createPortal(
+    <div className='image-preview-container fixed inset-0 z-[1000] flex items-center justify-center bg-black/80 p-8'
+      onClick={e => e.stopPropagation()}
+      onWheel={handleWheel}
+      onMouseDown={handleMouseDown}
+      onMouseMove={handleMouseMove}
+      onMouseUp={handleMouseUp}
+      style={{ cursor: scale > 1 ? 'move' : 'default' }}
+      tabIndex={-1}>
+      { }
+      <img
+        ref={imgRef}
+        alt={title}
+        src={isBase64(url) ? `data:image/png;base64,${url}` : url}
+        className='max-h-full max-w-full'
+        style={{
+          transform: `scale(${scale}) translate(${position.x}px, ${position.y}px)`,
+          transition: isDragging ? 'none' : 'transform 0.2s ease-in-out',
+        }}
+      />
+      <Tooltip popupContent={t('common.operation.copyImage')}>
+        <div className='absolute right-48 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg'
+          onClick={imageCopy}>
+          {isCopied
+            ? <RiFileCopyLine className='h-4 w-4 text-green-500' />
+            : <RiFileCopyLine className='h-4 w-4 text-gray-500' />}
+        </div>
+      </Tooltip>
+      <Tooltip popupContent={t('common.operation.zoomOut')}>
+        <div className='absolute right-40 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg'
+          onClick={zoomOut}>
+          <RiZoomOutLine className='h-4 w-4 text-gray-500' />
+        </div>
+      </Tooltip>
+      <Tooltip popupContent={t('common.operation.zoomIn')}>
+        <div className='absolute right-32 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg'
+          onClick={zoomIn}>
+          <RiZoomInLine className='h-4 w-4 text-gray-500' />
+        </div>
+      </Tooltip>
+      <Tooltip popupContent={t('common.operation.download')}>
+        <div className='absolute right-24 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg'
+          onClick={downloadImage}>
+          <RiDownloadCloud2Line className='h-4 w-4 text-gray-500' />
+        </div>
+      </Tooltip>
+      <Tooltip popupContent={t('common.operation.openInNewTab')}>
+        <div className='absolute right-16 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg'
+          onClick={openInNewTab}>
+          <RiAddBoxLine className='h-4 w-4 text-gray-500' />
+        </div>
+      </Tooltip>
+      <Tooltip popupContent={t('common.operation.cancel')}>
+        <div
+          className='absolute right-6 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg bg-white/8 backdrop-blur-[2px]'
+          onClick={onCancel}>
+          <RiCloseLine className='h-4 w-4 text-gray-500' />
+        </div>
+      </Tooltip>
+    </div>,
+    document.body,
+  )
+}
+
+export default ImagePreview
diff --git a/app/components/base/image-uploader/text-generation-image-uploader.tsx b/app/components/base/image-uploader/text-generation-image-uploader.tsx
new file mode 100644
index 0000000..99aef56
--- /dev/null
+++ b/app/components/base/image-uploader/text-generation-image-uploader.tsx
@@ -0,0 +1,148 @@
+import type { FC } from 'react'
+import {
+  Fragment,
+  useEffect,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import Uploader from './uploader'
+import ImageLinkInput from './image-link-input'
+import ImageList from './image-list'
+import { useImageFiles } from './hooks'
+import { ImagePlus } from '@/app/components/base/icons/src/vender/line/images'
+import { Link03 } from '@/app/components/base/icons/src/vender/line/general'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import type { ImageFile, VisionSettings } from '@/types/app'
+import { TransferMethod } from '@/types/app'
+
+type PasteImageLinkButtonProps = {
+  onUpload: (imageFile: ImageFile) => void
+  disabled?: boolean
+}
+const PasteImageLinkButton: FC<PasteImageLinkButtonProps> = ({
+  onUpload,
+  disabled,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const handleUpload = (imageFile: ImageFile) => {
+    setOpen(false)
+    onUpload(imageFile)
+  }
+
+  const handleToggle = () => {
+    if (disabled)
+      return
+
+    setOpen(v => !v)
+  }
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='top-start'
+    >
+      <PortalToFollowElemTrigger onClick={handleToggle}>
+        <div className={`
+          relative flex h-8 items-center justify-center rounded-lg bg-components-button-tertiary-bg px-3 text-xs text-text-tertiary hover:bg-components-button-tertiary-bg-hover
+          ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}
+        `}>
+          <Link03 className='mr-2 h-4 w-4' />
+          {t('common.imageUploader.pasteImageLink')}
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-10'>
+        <div className='w-[320px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg p-2 shadow-lg'>
+          <ImageLinkInput onUpload={handleUpload} />
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+type TextGenerationImageUploaderProps = {
+  settings: VisionSettings
+  onFilesChange: (files: ImageFile[]) => void
+}
+const TextGenerationImageUploader: FC<TextGenerationImageUploaderProps> = ({
+  settings,
+  onFilesChange,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    files,
+    onUpload,
+    onRemove,
+    onImageLinkLoadError,
+    onImageLinkLoadSuccess,
+    onReUpload,
+  } = useImageFiles()
+
+  useEffect(() => {
+    onFilesChange(files)
+  }, [files])
+
+  const localUpload = (
+    <Uploader
+      onUpload={onUpload}
+      disabled={files.length >= settings.number_limits}
+      limit={+settings.image_file_size_limit!}
+    >
+      {
+        hovering => (
+          <div className={`
+            flex h-8 cursor-pointer items-center justify-center rounded-lg
+            bg-components-button-tertiary-bg px-3 text-xs text-text-tertiary
+            ${hovering && 'hover:bg-components-button-tertiary-bg-hover'}
+          `}>
+            <ImagePlus className='mr-2 h-4 w-4' />
+            {t('common.imageUploader.uploadFromComputer')}
+          </div>
+        )
+      }
+    </Uploader>
+  )
+
+  const urlUpload = (
+    <PasteImageLinkButton
+      onUpload={onUpload}
+      disabled={files.length >= settings.number_limits}
+    />
+  )
+
+  return (
+    <div>
+      <div className='mb-1'>
+        <ImageList
+          list={files}
+          onRemove={onRemove}
+          onReUpload={onReUpload}
+          onImageLinkLoadError={onImageLinkLoadError}
+          onImageLinkLoadSuccess={onImageLinkLoadSuccess}
+        />
+      </div>
+      <div className={`grid gap-1 ${settings.transfer_methods.length === 2 ? 'grid-cols-2' : 'grid-cols-1'}`}>
+        {
+          settings.transfer_methods.map((method) => {
+            if (method === TransferMethod.local_file)
+              return <Fragment key={TransferMethod.local_file}>{localUpload}</Fragment>
+
+            if (method === TransferMethod.remote_url)
+              return <Fragment key={TransferMethod.remote_url}>{urlUpload}</Fragment>
+
+            return null
+          })
+        }
+      </div>
+    </div>
+  )
+}
+
+export default TextGenerationImageUploader
diff --git a/app/components/base/image-uploader/uploader.tsx b/app/components/base/image-uploader/uploader.tsx
new file mode 100644
index 0000000..2f922ec
--- /dev/null
+++ b/app/components/base/image-uploader/uploader.tsx
@@ -0,0 +1,58 @@
+import type { ChangeEvent, FC } from 'react'
+import { useState } from 'react'
+import { useLocalFileUploader } from './hooks'
+import type { ImageFile } from '@/types/app'
+import { ALLOW_FILE_EXTENSIONS } from '@/types/app'
+
+type UploaderProps = {
+  children: (hovering: boolean) => React.JSX.Element
+  onUpload: (imageFile: ImageFile) => void
+  closePopover?: () => void
+  limit?: number
+  disabled?: boolean
+}
+
+const Uploader: FC<UploaderProps> = ({
+  children,
+  onUpload,
+  closePopover,
+  limit,
+  disabled,
+}) => {
+  const [hovering, setHovering] = useState(false)
+  const { handleLocalFileUpload } = useLocalFileUploader({
+    limit,
+    onUpload,
+    disabled,
+  })
+
+  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
+    const file = e.target.files?.[0]
+
+    if (!file)
+      return
+
+    handleLocalFileUpload(file)
+    closePopover?.()
+  }
+
+  return (
+    <div
+      className='relative'
+      onMouseEnter={() => setHovering(true)}
+      onMouseLeave={() => setHovering(false)}
+    >
+      {children(hovering)}
+      <input
+        className='absolute inset-0 block w-full cursor-pointer text-[0] opacity-0 disabled:cursor-not-allowed'
+        onClick={e => ((e.target as HTMLInputElement).value = '')}
+        type='file'
+        accept={ALLOW_FILE_EXTENSIONS.map(ext => `.${ext}`).join(',')}
+        onChange={handleChange}
+        disabled={disabled}
+      />
+    </div>
+  )
+}
+
+export default Uploader
diff --git a/app/components/base/image-uploader/utils.ts b/app/components/base/image-uploader/utils.ts
new file mode 100644
index 0000000..0c1ada7
--- /dev/null
+++ b/app/components/base/image-uploader/utils.ts
@@ -0,0 +1,36 @@
+import { upload } from '@/service/base'
+
+type ImageUploadParams = {
+  file: File
+  onProgressCallback: (progress: number) => void
+  onSuccessCallback: (res: { id: string }) => void
+  onErrorCallback: () => void
+}
+type ImageUpload = (v: ImageUploadParams, isPublic?: boolean, url?: string) => void
+export const imageUpload: ImageUpload = ({
+  file,
+  onProgressCallback,
+  onSuccessCallback,
+  onErrorCallback,
+}, isPublic, url) => {
+  const formData = new FormData()
+  formData.append('file', file)
+  const onProgress = (e: ProgressEvent) => {
+    if (e.lengthComputable) {
+      const percent = Math.floor(e.loaded / e.total * 100)
+      onProgressCallback(percent)
+    }
+  }
+
+  upload({
+    xhr: new XMLHttpRequest(),
+    data: formData,
+    onprogress: onProgress,
+  }, isPublic, url)
+    .then((res: { id: string }) => {
+      onSuccessCallback(res)
+    })
+    .catch(() => {
+      onErrorCallback()
+    })
+}
diff --git a/app/components/base/image-uploader/video-preview.tsx b/app/components/base/image-uploader/video-preview.tsx
new file mode 100644
index 0000000..09ca3d8
--- /dev/null
+++ b/app/components/base/image-uploader/video-preview.tsx
@@ -0,0 +1,37 @@
+import type { FC } from 'react'
+import { createPortal } from 'react-dom'
+import { RiCloseLine } from '@remixicon/react'
+
+type VideoPreviewProps = {
+  url: string
+  title: string
+  onCancel: () => void
+}
+const VideoPreview: FC<VideoPreviewProps> = ({
+  url,
+  title,
+  onCancel,
+}) => {
+  return createPortal(
+    <div className='fixed inset-0 z-[1000] flex items-center justify-center bg-black/80 p-8' onClick={e => e.stopPropagation()}>
+      <div>
+        <video controls title={title} autoPlay={false} preload="metadata">
+          <source
+            type="video/mp4"
+            src={url}
+            className='max-h-full max-w-full'
+          />
+        </video>
+      </div>
+      <div
+        className='absolute right-6 top-6 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg bg-white/[0.08] backdrop-blur-[2px]'
+        onClick={onCancel}
+      >
+        <RiCloseLine className='h-4 w-4 text-gray-500'/>
+      </div>
+    </div>,
+    document.body,
+  )
+}
+
+export default VideoPreview
diff --git a/app/components/base/input-number/index.spec.tsx b/app/components/base/input-number/index.spec.tsx
new file mode 100644
index 0000000..8dfd118
--- /dev/null
+++ b/app/components/base/input-number/index.spec.tsx
@@ -0,0 +1,97 @@
+import { fireEvent, render, screen } from '@testing-library/react'
+import { InputNumber } from './index'
+
+jest.mock('react-i18next', () => ({
+  useTranslation: () => ({
+    t: (key: string) => key,
+  }),
+}))
+
+describe('InputNumber Component', () => {
+  const defaultProps = {
+    onChange: jest.fn(),
+  }
+
+  afterEach(() => {
+    jest.clearAllMocks()
+  })
+
+  it('renders input with default values', () => {
+    render(<InputNumber {...defaultProps} />)
+    const input = screen.getByRole('textbox')
+    expect(input).toBeInTheDocument()
+  })
+
+  it('handles increment button click', () => {
+    render(<InputNumber {...defaultProps} value={5} />)
+    const incrementBtn = screen.getByRole('button', { name: /increment/i })
+
+    fireEvent.click(incrementBtn)
+    expect(defaultProps.onChange).toHaveBeenCalledWith(6)
+  })
+
+  it('handles decrement button click', () => {
+    render(<InputNumber {...defaultProps} value={5} />)
+    const decrementBtn = screen.getByRole('button', { name: /decrement/i })
+
+    fireEvent.click(decrementBtn)
+    expect(defaultProps.onChange).toHaveBeenCalledWith(4)
+  })
+
+  it('respects max value constraint', () => {
+    render(<InputNumber {...defaultProps} value={10} max={10} />)
+    const incrementBtn = screen.getByRole('button', { name: /increment/i })
+
+    fireEvent.click(incrementBtn)
+    expect(defaultProps.onChange).not.toHaveBeenCalled()
+  })
+
+  it('respects min value constraint', () => {
+    render(<InputNumber {...defaultProps} value={0} min={0} />)
+    const decrementBtn = screen.getByRole('button', { name: /decrement/i })
+
+    fireEvent.click(decrementBtn)
+    expect(defaultProps.onChange).not.toHaveBeenCalled()
+  })
+
+  it('handles direct input changes', () => {
+    render(<InputNumber {...defaultProps} />)
+    const input = screen.getByRole('textbox')
+
+    fireEvent.change(input, { target: { value: '42' } })
+    expect(defaultProps.onChange).toHaveBeenCalledWith(42)
+  })
+
+  it('handles empty input', () => {
+    render(<InputNumber {...defaultProps} value={0} />)
+    const input = screen.getByRole('textbox')
+
+    fireEvent.change(input, { target: { value: '' } })
+    expect(defaultProps.onChange).toHaveBeenCalledWith(undefined)
+  })
+
+  it('handles invalid input', () => {
+    render(<InputNumber {...defaultProps} />)
+    const input = screen.getByRole('textbox')
+
+    fireEvent.change(input, { target: { value: 'abc' } })
+    expect(defaultProps.onChange).not.toHaveBeenCalled()
+  })
+
+  it('displays unit when provided', () => {
+    const unit = 'px'
+    render(<InputNumber {...defaultProps} unit={unit} />)
+    expect(screen.getByText(unit)).toBeInTheDocument()
+  })
+
+  it('disables controls when disabled prop is true', () => {
+    render(<InputNumber {...defaultProps} disabled />)
+    const input = screen.getByRole('textbox')
+    const incrementBtn = screen.getByRole('button', { name: /increment/i })
+    const decrementBtn = screen.getByRole('button', { name: /decrement/i })
+
+    expect(input).toBeDisabled()
+    expect(incrementBtn).toBeDisabled()
+    expect(decrementBtn).toBeDisabled()
+  })
+})
diff --git a/app/components/base/input-number/index.tsx b/app/components/base/input-number/index.tsx
new file mode 100644
index 0000000..98efc94
--- /dev/null
+++ b/app/components/base/input-number/index.tsx
@@ -0,0 +1,114 @@
+import type { FC } from 'react'
+import { RiArrowDownSLine, RiArrowUpSLine } from '@remixicon/react'
+import Input, { type InputProps } from '../input'
+import classNames from '@/utils/classnames'
+
+export type InputNumberProps = {
+  unit?: string
+  value?: number
+  onChange: (value?: number) => void
+  amount?: number
+  size?: 'regular' | 'large'
+  max?: number
+  min?: number
+  defaultValue?: number
+  disabled?: boolean
+  wrapClassName?: string
+  controlWrapClassName?: string
+  controlClassName?: string
+} & Omit<InputProps, 'value' | 'onChange' | 'size' | 'min' | 'max' | 'defaultValue'>
+
+export const InputNumber: FC<InputNumberProps> = (props) => {
+  const { unit, className, onChange, amount = 1, value, size = 'regular', max, min, defaultValue, wrapClassName, controlWrapClassName, controlClassName, disabled, ...rest } = props
+
+  const isValidValue = (v: number) => {
+    if (typeof max === 'number' && v > max)
+      return false
+    return !(typeof min === 'number' && v < min)
+  }
+
+  const inc = () => {
+    if (disabled) return
+
+    if (value === undefined) {
+      onChange(defaultValue)
+      return
+    }
+    const newValue = value + amount
+    if (!isValidValue(newValue))
+      return
+    onChange(newValue)
+  }
+  const dec = () => {
+    if (disabled) return
+
+    if (value === undefined) {
+      onChange(defaultValue)
+      return
+    }
+    const newValue = value - amount
+    if (!isValidValue(newValue))
+      return
+    onChange(newValue)
+  }
+
+  return <div className={classNames('flex', wrapClassName)}>
+    <Input {...rest}
+      // disable default controller
+      type='text'
+      className={classNames('rounded-r-none', className)}
+      value={value}
+      max={max}
+      min={min}
+      disabled={disabled}
+      onChange={(e) => {
+        if (e.target.value === '')
+          onChange(undefined)
+
+        const parsed = Number(e.target.value)
+        if (Number.isNaN(parsed))
+          return
+
+        if (!isValidValue(parsed))
+          return
+        onChange(parsed)
+      }}
+      unit={unit}
+      size={size}
+    />
+    <div className={classNames(
+      'flex flex-col bg-components-input-bg-normal rounded-r-md border-l border-divider-subtle text-text-tertiary focus:shadow-xs',
+      disabled && 'opacity-50 cursor-not-allowed',
+      controlWrapClassName)}
+    >
+      <button
+        type='button'
+        onClick={inc}
+        disabled={disabled}
+        aria-label='increment'
+        className={classNames(
+          size === 'regular' ? 'pt-1' : 'pt-1.5',
+          'px-1.5 hover:bg-components-input-bg-hover',
+          disabled && 'cursor-not-allowed hover:bg-transparent',
+          controlClassName,
+        )}
+      >
+        <RiArrowUpSLine className='size-3' />
+      </button>
+      <button
+        type='button'
+        onClick={dec}
+        disabled={disabled}
+        aria-label='decrement'
+        className={classNames(
+          size === 'regular' ? 'pb-1' : 'pb-1.5',
+          'px-1.5 hover:bg-components-input-bg-hover',
+          disabled && 'cursor-not-allowed hover:bg-transparent',
+          controlClassName,
+        )}
+      >
+        <RiArrowDownSLine className='size-3' />
+      </button>
+    </div>
+  </div>
+}
diff --git a/app/components/base/input/index.spec.tsx b/app/components/base/input/index.spec.tsx
new file mode 100644
index 0000000..12dd9bc
--- /dev/null
+++ b/app/components/base/input/index.spec.tsx
@@ -0,0 +1,124 @@
+import React from 'react'
+import { fireEvent, render, screen } from '@testing-library/react'
+import '@testing-library/jest-dom'
+import Input, { inputVariants } from './index'
+
+// Mock the i18n hook
+jest.mock('react-i18next', () => ({
+  useTranslation: () => ({
+    t: (key: string) => {
+      const translations: Record<string, string> = {
+        'common.operation.search': 'Search',
+        'common.placeholder.input': 'Please input',
+      }
+      return translations[key] || ''
+    },
+  }),
+}))
+
+describe('Input component', () => {
+  describe('Variants', () => {
+    it('should return correct classes for regular size', () => {
+      const result = inputVariants({ size: 'regular' })
+      expect(result).toContain('px-3')
+      expect(result).toContain('radius-md')
+      expect(result).toContain('system-sm-regular')
+    })
+
+    it('should return correct classes for large size', () => {
+      const result = inputVariants({ size: 'large' })
+      expect(result).toContain('px-4')
+      expect(result).toContain('radius-lg')
+      expect(result).toContain('system-md-regular')
+    })
+
+    it('should use regular size as default', () => {
+      const result = inputVariants({})
+      expect(result).toContain('px-3')
+      expect(result).toContain('radius-md')
+      expect(result).toContain('system-sm-regular')
+    })
+  })
+
+  it('renders correctly with default props', () => {
+    render(<Input />)
+    const input = screen.getByPlaceholderText('Please input')
+    expect(input).toBeInTheDocument()
+    expect(input).not.toBeDisabled()
+    expect(input).not.toHaveClass('cursor-not-allowed')
+  })
+
+  it('shows left icon when showLeftIcon is true', () => {
+    render(<Input showLeftIcon />)
+    const searchIcon = document.querySelector('svg')
+    expect(searchIcon).toBeInTheDocument()
+    const input = screen.getByPlaceholderText('Search')
+    expect(input).toHaveClass('pl-[26px]')
+  })
+
+  it('shows clear icon when showClearIcon is true and has value', () => {
+    render(<Input showClearIcon value="test" />)
+    const clearIcon = document.querySelector('.group svg')
+    expect(clearIcon).toBeInTheDocument()
+    const input = screen.getByDisplayValue('test')
+    expect(input).toHaveClass('pr-[26px]')
+  })
+
+  it('does not show clear icon when disabled, even with value', () => {
+    render(<Input showClearIcon value="test" disabled />)
+    const clearIcon = document.querySelector('.group svg')
+    expect(clearIcon).not.toBeInTheDocument()
+  })
+
+  it('calls onClear when clear icon is clicked', () => {
+    const onClear = jest.fn()
+    render(<Input showClearIcon value="test" onClear={onClear} />)
+    const clearIconContainer = document.querySelector('.group')
+    fireEvent.click(clearIconContainer!)
+    expect(onClear).toHaveBeenCalledTimes(1)
+  })
+
+  it('shows warning icon when destructive is true', () => {
+    render(<Input destructive />)
+    const warningIcon = document.querySelector('svg')
+    expect(warningIcon).toBeInTheDocument()
+    const input = screen.getByPlaceholderText('Please input')
+    expect(input).toHaveClass('border-components-input-border-destructive')
+  })
+
+  it('applies disabled styles when disabled', () => {
+    render(<Input disabled />)
+    const input = screen.getByPlaceholderText('Please input')
+    expect(input).toBeDisabled()
+    expect(input).toHaveClass('cursor-not-allowed')
+    expect(input).toHaveClass('bg-components-input-bg-disabled')
+  })
+
+  it('displays custom unit when provided', () => {
+    render(<Input unit="km" />)
+    const unitElement = screen.getByText('km')
+    expect(unitElement).toBeInTheDocument()
+  })
+
+  it('applies custom className and style', () => {
+    const customClass = 'test-class'
+    const customStyle = { color: 'red' }
+    render(<Input className={customClass} styleCss={customStyle} />)
+    const input = screen.getByPlaceholderText('Please input')
+    expect(input).toHaveClass(customClass)
+    expect(input).toHaveStyle('color: red')
+  })
+
+  it('applies large size variant correctly', () => {
+    render(<Input size={'large' as any} />)
+    const input = screen.getByPlaceholderText('Please input')
+    expect(input.className).toContain(inputVariants({ size: 'large' }))
+  })
+
+  it('uses custom placeholder when provided', () => {
+    const placeholder = 'Custom placeholder'
+    render(<Input placeholder={placeholder} />)
+    const input = screen.getByPlaceholderText(placeholder)
+    expect(input).toBeInTheDocument()
+  })
+})
diff --git a/app/components/base/input/index.tsx b/app/components/base/input/index.tsx
new file mode 100644
index 0000000..30fd90a
--- /dev/null
+++ b/app/components/base/input/index.tsx
@@ -0,0 +1,97 @@
+import type { CSSProperties } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiCloseCircleFill, RiErrorWarningLine, RiSearchLine } from '@remixicon/react'
+import { type VariantProps, cva } from 'class-variance-authority'
+import cn from '@/utils/classnames'
+import { noop } from 'lodash-es'
+
+export const inputVariants = cva(
+  '',
+  {
+    variants: {
+      size: {
+        regular: 'px-3 radius-md system-sm-regular',
+        large: 'px-4 radius-lg system-md-regular',
+      },
+    },
+    defaultVariants: {
+      size: 'regular',
+    },
+  },
+)
+
+export type InputProps = {
+  showLeftIcon?: boolean
+  showClearIcon?: boolean
+  onClear?: () => void
+  disabled?: boolean
+  destructive?: boolean
+  wrapperClassName?: string
+  styleCss?: CSSProperties
+  unit?: string
+} & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> & VariantProps<typeof inputVariants>
+
+const Input = ({
+  size,
+  disabled,
+  destructive,
+  showLeftIcon,
+  showClearIcon,
+  onClear,
+  wrapperClassName,
+  className,
+  styleCss,
+  value,
+  placeholder,
+  onChange = noop,
+  unit,
+  ...props
+}: InputProps) => {
+  const { t } = useTranslation()
+  return (
+    <div className={cn('relative w-full', wrapperClassName)}>
+      {showLeftIcon && <RiSearchLine className={cn('absolute left-2 top-1/2 h-4 w-4 -translate-y-1/2 text-components-input-text-placeholder')} />}
+      <input
+        style={styleCss}
+        className={cn(
+          'w-full appearance-none border border-transparent bg-components-input-bg-normal py-[7px] text-components-input-text-filled caret-primary-600 outline-none placeholder:text-components-input-text-placeholder hover:border-components-input-border-hover hover:bg-components-input-bg-hover focus:border-components-input-border-active focus:bg-components-input-bg-active focus:shadow-xs',
+          inputVariants({ size }),
+          showLeftIcon && 'pl-[26px]',
+          showLeftIcon && size === 'large' && 'pl-7',
+          showClearIcon && value && 'pr-[26px]',
+          showClearIcon && value && size === 'large' && 'pr-7',
+          destructive && 'pr-[26px]',
+          destructive && size === 'large' && 'pr-7',
+          disabled && 'cursor-not-allowed border-transparent bg-components-input-bg-disabled text-components-input-text-filled-disabled hover:border-transparent hover:bg-components-input-bg-disabled',
+          destructive && 'border-components-input-border-destructive bg-components-input-bg-destructive text-components-input-text-filled hover:border-components-input-border-destructive hover:bg-components-input-bg-destructive focus:border-components-input-border-destructive focus:bg-components-input-bg-destructive',
+          className,
+        )}
+        placeholder={placeholder ?? (showLeftIcon
+          ? (t('common.operation.search') || '')
+          : (t('common.placeholder.input') || ''))}
+        value={value}
+        onChange={onChange}
+        disabled={disabled}
+        {...props}
+      />
+      {showClearIcon && value && !disabled && !destructive && (
+        <div className={cn('group absolute right-2 top-1/2 -translate-y-1/2 cursor-pointer p-[1px]')} onClick={onClear}>
+          <RiCloseCircleFill className='h-3.5 w-3.5 cursor-pointer text-text-quaternary group-hover:text-text-tertiary' />
+        </div>
+      )}
+      {destructive && (
+        <RiErrorWarningLine className='absolute right-2 top-1/2 h-4 w-4 -translate-y-1/2 text-text-destructive-secondary' />
+      )}
+      {
+        unit && (
+          <div className='system-sm-regular absolute right-2 top-1/2 -translate-y-1/2 text-text-tertiary'>
+            {unit}
+          </div>
+        )
+      }
+    </div>
+  )
+}
+
+export default Input
diff --git a/app/components/base/install-button/index.tsx b/app/components/base/install-button/index.tsx
new file mode 100644
index 0000000..0d9e953
--- /dev/null
+++ b/app/components/base/install-button/index.tsx
@@ -0,0 +1,27 @@
+import Button from '../button'
+import { RiInstallLine, RiLoader2Line } from '@remixicon/react'
+
+type InstallButtonProps = {
+  loading: boolean
+  onInstall: (e: React.MouseEvent) => void
+  t: any
+}
+
+const InstallButton = ({ loading, onInstall, t }: InstallButtonProps) => {
+  return (
+    <Button size='small' className='z-[100]' onClick={onInstall}>
+      <div className={`flex items-center justify-center gap-1 px-[3px]
+        ${loading ? 'text-components-button-secondary-text-disabled' : 'text-components-button-secondary-text'}
+        system-xs-medium`}
+      >
+        {loading ? t('workflow.nodes.agent.pluginInstaller.installing') : t('workflow.nodes.agent.pluginInstaller.install')}
+      </div>
+      {loading
+        ? <RiLoader2Line className='h-3.5 w-3.5 animate-spin text-text-quaternary' />
+        : <RiInstallLine className='h-3.5 w-3.5 text-text-secondary' />
+      }
+    </Button>
+  )
+}
+
+export default InstallButton
diff --git a/app/components/base/linked-apps-panel/index.tsx b/app/components/base/linked-apps-panel/index.tsx
new file mode 100644
index 0000000..4ee67c5
--- /dev/null
+++ b/app/components/base/linked-apps-panel/index.tsx
@@ -0,0 +1,62 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import Link from 'next/link'
+import { useTranslation } from 'react-i18next'
+import { RiArrowRightUpLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import AppIcon from '@/app/components/base/app-icon'
+import type { RelatedApp } from '@/models/datasets'
+
+type ILikedItemProps = {
+  appStatus?: boolean
+  detail: RelatedApp
+  isMobile: boolean
+}
+
+const appTypeMap = {
+  'chat': 'Chatbot',
+  'completion': 'Completion',
+  'agent-chat': 'Agent',
+  'advanced-chat': 'Chatflow',
+  'workflow': 'Workflow',
+}
+
+const LikedItem = ({
+  detail,
+  isMobile,
+}: ILikedItemProps) => {
+  return (
+    <Link className={cn('group/link-item flex h-8 w-full cursor-pointer items-center justify-between rounded-lg px-2 hover:bg-state-base-hover', isMobile && 'justify-center')} href={`/app/${detail?.id}/overview`}>
+      <div className='flex items-center'>
+        <div className={cn('relative h-6 w-6 rounded-md')}>
+          <AppIcon size='tiny' iconType={detail.icon_type} icon={detail.icon} background={detail.icon_background} imageUrl={detail.icon_url} />
+        </div>
+        {!isMobile && <div className={cn(' system-sm-medium ml-2 truncate text-text-primary')}>{detail?.name || '--'}</div>}
+      </div>
+      <div className='system-2xs-medium-uppercase shrink-0 text-text-tertiary group-hover/link-item:hidden'>{appTypeMap[detail.mode]}</div>
+      <RiArrowRightUpLine className='hidden h-4 w-4 text-text-tertiary group-hover/link-item:block' />
+    </Link>
+  )
+}
+
+type Props = {
+  relatedApps: RelatedApp[]
+  isMobile: boolean
+}
+
+const LinkedAppsPanel: FC<Props> = ({
+  relatedApps,
+  isMobile,
+}) => {
+  const { t } = useTranslation()
+  return (
+    <div className='w-[320px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg  backdrop-blur-[5px]'>
+      <div className='system-xs-medium-uppercase mb-0.5 mt-1 pl-2 text-text-tertiary'>{relatedApps.length || '--'} {t('common.datasetMenus.relatedApp')}</div>
+      {relatedApps.map((item, index) => (
+        <LikedItem key={index} detail={item} isMobile={isMobile} />
+      ))}
+    </div>
+  )
+}
+export default React.memo(LinkedAppsPanel)
diff --git a/app/components/base/list-empty/horizontal-line.tsx b/app/components/base/list-empty/horizontal-line.tsx
new file mode 100644
index 0000000..cb8edb8
--- /dev/null
+++ b/app/components/base/list-empty/horizontal-line.tsx
@@ -0,0 +1,21 @@
+type HorizontalLineProps = {
+  className?: string
+}
+const HorizontalLine = ({
+  className,
+}: HorizontalLineProps) => {
+  return (
+    <svg xmlns="http://www.w3.org/2000/svg" width="240" height="2" viewBox="0 0 240 2" fill="none" className={className}>
+      <path d="M0 1H240" stroke="url(#paint0_linear_8619_59125)"/>
+      <defs>
+        <linearGradient id="paint0_linear_8619_59125" x1="240" y1="9.99584" x2="3.95539e-05" y2="9.88094" gradientUnits="userSpaceOnUse">
+          <stop stopColor="white" stopOpacity="0.01"/>
+          <stop offset="0.9031" stopColor="#101828" stopOpacity="0.04"/>
+          <stop offset="1" stopColor="white" stopOpacity="0.01"/>
+        </linearGradient>
+      </defs>
+    </svg>
+  )
+}
+
+export default HorizontalLine
diff --git a/app/components/base/list-empty/index.tsx b/app/components/base/list-empty/index.tsx
new file mode 100644
index 0000000..db3eaff
--- /dev/null
+++ b/app/components/base/list-empty/index.tsx
@@ -0,0 +1,38 @@
+import type { ReactNode } from 'react'
+import React from 'react'
+import { Variable02 } from '../icons/src/vender/solid/development'
+import VerticalLine from './vertical-line'
+import HorizontalLine from './horizontal-line'
+
+type ListEmptyProps = {
+  title?: string
+  description?: ReactNode
+  icon?: ReactNode
+}
+
+const ListEmpty = ({
+  title,
+  description,
+  icon,
+}: ListEmptyProps) => {
+  return (
+    <div className='flex w-[320px] flex-col items-start gap-2 rounded-[10px] bg-workflow-process-bg p-4'>
+      <div className='flex h-10 w-10 items-center justify-center gap-2 rounded-[10px]'>
+        <div className='relative flex grow items-center justify-center gap-2 self-stretch rounded-[10px] border-[0.5px]
+          border-components-card-border bg-components-card-bg p-1 shadow-lg'>
+          {icon || <Variable02 className='h-5 w-5 shrink-0 text-text-accent' />}
+          <VerticalLine className='absolute -right-[1px] top-1/2 -translate-y-1/4'/>
+          <VerticalLine className='absolute -left-[1px] top-1/2 -translate-y-1/4'/>
+          <HorizontalLine className='absolute left-3/4 top-0 -translate-x-1/4 -translate-y-1/2'/>
+          <HorizontalLine className='absolute left-3/4 top-full -translate-x-1/4 -translate-y-1/2' />
+        </div>
+      </div>
+      <div className='flex flex-col items-start gap-1 self-stretch'>
+        <div className='system-sm-medium text-text-secondary'>{title}</div>
+        {description}
+      </div>
+    </div>
+  )
+}
+
+export default ListEmpty
diff --git a/app/components/base/list-empty/vertical-line.tsx b/app/components/base/list-empty/vertical-line.tsx
new file mode 100644
index 0000000..63e5744
--- /dev/null
+++ b/app/components/base/list-empty/vertical-line.tsx
@@ -0,0 +1,21 @@
+type VerticalLineProps = {
+  className?: string
+}
+const VerticalLine = ({
+  className,
+}: VerticalLineProps) => {
+  return (
+    <svg xmlns="http://www.w3.org/2000/svg" width="2" height="132" viewBox="0 0 2 132" fill="none" className={className}>
+      <path d="M1 0L1 132" stroke="url(#paint0_linear_8619_59128)"/>
+      <defs>
+        <linearGradient id="paint0_linear_8619_59128" x1="-7.99584" y1="132" x2="-7.96108" y2="6.4974e-07" gradientUnits="userSpaceOnUse">
+          <stop stopColor="white" stopOpacity="0.01"/>
+          <stop offset="0.877606" stopColor="#101828" stopOpacity="0.04"/>
+          <stop offset="1" stopColor="white" stopOpacity="0.01"/>
+        </linearGradient>
+      </defs>
+    </svg>
+  )
+}
+
+export default VerticalLine
diff --git a/app/components/base/loading/index.spec.tsx b/app/components/base/loading/index.spec.tsx
new file mode 100644
index 0000000..03e2cfb
--- /dev/null
+++ b/app/components/base/loading/index.spec.tsx
@@ -0,0 +1,29 @@
+import React from 'react'
+import { render } from '@testing-library/react'
+import '@testing-library/jest-dom'
+import Loading from './index'
+
+describe('Loading Component', () => {
+  it('renders correctly with default props', () => {
+    const { container } = render(<Loading />)
+    expect(container.firstChild).toHaveClass('flex w-full items-center justify-center')
+    expect(container.firstChild).not.toHaveClass('h-full')
+  })
+
+  it('renders correctly with area type', () => {
+    const { container } = render(<Loading type="area" />)
+    expect(container.firstChild).not.toHaveClass('h-full')
+  })
+
+  it('renders correctly with app type', () => {
+    const { container } = render(<Loading type='app' />)
+    expect(container.firstChild).toHaveClass('h-full')
+  })
+
+  it('contains SVG with spin-animation class', () => {
+    const { container } = render(<Loading />)
+
+    const svgElement = container.querySelector('svg')
+    expect(svgElement).toHaveClass('spin-animation')
+  })
+})
diff --git a/app/components/base/loading/index.tsx b/app/components/base/loading/index.tsx
new file mode 100644
index 0000000..2ae3310
--- /dev/null
+++ b/app/components/base/loading/index.tsx
@@ -0,0 +1,29 @@
+import React from 'react'
+
+import './style.css'
+type ILoadingProps = {
+  type?: 'area' | 'app'
+}
+const Loading = (
+  { type = 'area' }: ILoadingProps = { type: 'area' },
+) => {
+  return (
+    <div className={`flex w-full items-center justify-center ${type === 'app' ? 'h-full' : ''}`}>
+      <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" className='spin-animation'>
+        <g clipPath="url(#clip0_324_2488)">
+          <path d="M15 0H10C9.44772 0 9 0.447715 9 1V6C9 6.55228 9.44772 7 10 7H15C15.5523 7 16 6.55228 16 6V1C16 0.447715 15.5523 0 15 0Z" fill="#1C64F2" />
+          <path opacity="0.5" d="M15 9H10C9.44772 9 9 9.44772 9 10V15C9 15.5523 9.44772 16 10 16H15C15.5523 16 16 15.5523 16 15V10C16 9.44772 15.5523 9 15 9Z" fill="#1C64F2" />
+          <path opacity="0.1" d="M6 9H1C0.447715 9 0 9.44772 0 10V15C0 15.5523 0.447715 16 1 16H6C6.55228 16 7 15.5523 7 15V10C7 9.44772 6.55228 9 6 9Z" fill="#1C64F2" />
+          <path opacity="0.2" d="M6 0H1C0.447715 0 0 0.447715 0 1V6C0 6.55228 0.447715 7 1 7H6C6.55228 7 7 6.55228 7 6V1C7 0.447715 6.55228 0 6 0Z" fill="#1C64F2" />
+        </g>
+        <defs>
+          <clipPath id="clip0_324_2488">
+            <rect width="16" height="16" fill="white" />
+          </clipPath>
+        </defs>
+      </svg>
+
+    </div>
+  )
+}
+export default Loading
diff --git a/app/components/base/loading/style.css b/app/components/base/loading/style.css
new file mode 100644
index 0000000..276654a
--- /dev/null
+++ b/app/components/base/loading/style.css
@@ -0,0 +1,41 @@
+.spin-animation path {
+    animation: custom 2s linear infinite;
+}
+
+@keyframes custom {
+    0% {
+        opacity: 0;
+    }
+
+    25% {
+        opacity: 0.1;
+    }
+
+    50% {
+        opacity: 0.2;
+    }
+
+    75% {
+        opacity: 0.5;
+    }
+
+    100% {
+        opacity: 1;
+    }
+}
+
+.spin-animation path:nth-child(1) {
+    animation-delay: 0s;
+}
+
+.spin-animation path:nth-child(2) {
+    animation-delay: 0.5s;
+}
+
+.spin-animation path:nth-child(3) {
+    animation-delay: 1s;
+}
+
+.spin-animation path:nth-child(4) {
+    animation-delay: 2s;
+}
diff --git a/app/components/base/logo/dify-logo.tsx b/app/components/base/logo/dify-logo.tsx
new file mode 100644
index 0000000..ce59ba7
--- /dev/null
+++ b/app/components/base/logo/dify-logo.tsx
@@ -0,0 +1,45 @@
+'use client'
+import type { FC } from 'react'
+import { WEB_PREFIX } from '@/config'
+import classNames from '@/utils/classnames'
+import useTheme from '@/hooks/use-theme'
+
+export type LogoStyle = 'default' | 'monochromeWhite'
+
+export const logoPathMap: Record<LogoStyle, string> = {
+  default: '/logo/logo.svg',
+  monochromeWhite: '/logo/logo-monochrome-white.svg',
+}
+
+export type LogoSize = 'large' | 'medium' | 'small'
+
+export const logoSizeMap: Record<LogoSize, string> = {
+  large: 'w-16 h-7',
+  medium: 'w-12 h-[22px]',
+  small: 'w-9 h-4',
+}
+
+type DifyLogoProps = {
+  style?: LogoStyle
+  size?: LogoSize
+  className?: string
+}
+
+const DifyLogo: FC<DifyLogoProps> = ({
+  style = 'default',
+  size = 'medium',
+  className,
+}) => {
+  const { theme } = useTheme()
+  const themedStyle = (theme === 'dark' && style === 'default') ? 'monochromeWhite' : style
+
+  return (
+    <img
+      src={`${WEB_PREFIX}${logoPathMap[themedStyle]}`}
+      className={classNames('block object-contain', logoSizeMap[size], className)}
+      alt='Dify logo'
+    />
+  )
+}
+
+export default DifyLogo
diff --git a/app/components/base/logo/logo-embedded-chat-avatar.tsx b/app/components/base/logo/logo-embedded-chat-avatar.tsx
new file mode 100644
index 0000000..170a23b
--- /dev/null
+++ b/app/components/base/logo/logo-embedded-chat-avatar.tsx
@@ -0,0 +1,19 @@
+import type { FC } from 'react'
+import { WEB_PREFIX } from '@/config'
+
+type LogoEmbeddedChatAvatarProps = {
+  className?: string
+}
+const LogoEmbeddedChatAvatar: FC<LogoEmbeddedChatAvatarProps> = ({
+  className,
+}) => {
+  return (
+    <img
+      src={`${WEB_PREFIX}/logo/logo-embedded-chat-avatar.png`}
+      className={`block h-10 w-10 ${className}`}
+      alt='logo'
+    />
+  )
+}
+
+export default LogoEmbeddedChatAvatar
diff --git a/app/components/base/logo/logo-embedded-chat-header.tsx b/app/components/base/logo/logo-embedded-chat-header.tsx
new file mode 100644
index 0000000..012b659
--- /dev/null
+++ b/app/components/base/logo/logo-embedded-chat-header.tsx
@@ -0,0 +1,24 @@
+import classNames from '@/utils/classnames'
+import type { FC } from 'react'
+import { WEB_PREFIX } from '@/config'
+
+type LogoEmbeddedChatHeaderProps = {
+  className?: string
+}
+
+const LogoEmbeddedChatHeader: FC<LogoEmbeddedChatHeaderProps> = ({
+  className,
+}) => {
+  return <picture>
+    <source media="(resolution: 1x)" srcSet='/logo/logo-embedded-chat-header.png' />
+    <source media="(resolution: 2x)" srcSet='/logo/logo-embedded-chat-header@2x.png' />
+    <source media="(resolution: 3x)" srcSet='/logo/logo-embedded-chat-header@3x.png' />
+    <img
+      src={`${WEB_PREFIX}/logo/logo-embedded-chat-header.png`}
+      alt='logo'
+      className={classNames('block h-6 w-auto', className)}
+    />
+  </picture>
+}
+
+export default LogoEmbeddedChatHeader
diff --git a/app/components/base/markdown-blocks/button.tsx b/app/components/base/markdown-blocks/button.tsx
new file mode 100644
index 0000000..81a3f30
--- /dev/null
+++ b/app/components/base/markdown-blocks/button.tsx
@@ -0,0 +1,39 @@
+import { useChatContext } from '@/app/components/base/chat/chat/context'
+import Button from '@/app/components/base/button'
+import cn from '@/utils/classnames'
+
+const MarkdownButton = ({ node }: any) => {
+  const { onSend } = useChatContext()
+  const variant = node.properties.dataVariant
+  const message = node.properties.dataMessage
+  const link = node.properties.dataLink
+  const size = node.properties.dataSize
+
+  function is_valid_url(url: string): boolean {
+    try {
+      const parsed_url = new URL(url)
+      return ['http:', 'https:'].includes(parsed_url.protocol)
+    }
+    catch {
+      return false
+    }
+  }
+
+  return <Button
+    variant={variant}
+    size={size}
+    className={cn('!h-auto min-h-8 select-none whitespace-normal !px-3')}
+    onClick={() => {
+      if (is_valid_url(link)) {
+        window.open(link, '_blank')
+        return
+      }
+      onSend?.(message)
+    }}
+  >
+    <span className='text-[13px]'>{node.children[0]?.value || ''}</span>
+  </Button>
+}
+MarkdownButton.displayName = 'MarkdownButton'
+
+export default MarkdownButton
diff --git a/app/components/base/markdown-blocks/form.tsx b/app/components/base/markdown-blocks/form.tsx
new file mode 100644
index 0000000..ab7e7ce
--- /dev/null
+++ b/app/components/base/markdown-blocks/form.tsx
@@ -0,0 +1,238 @@
+import React, { useEffect, useState } from 'react'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import DatePicker from '@/app/components/base/date-and-time-picker/date-picker'
+import TimePicker from '@/app/components/base/date-and-time-picker/time-picker'
+import Checkbox from '@/app/components/base/checkbox'
+import Select from '@/app/components/base/select'
+import { useChatContext } from '@/app/components/base/chat/chat/context'
+
+enum DATA_FORMAT {
+  TEXT = 'text',
+  JSON = 'json',
+}
+enum SUPPORTED_TAGS {
+  LABEL = 'label',
+  INPUT = 'input',
+  TEXTAREA = 'textarea',
+  BUTTON = 'button',
+}
+enum SUPPORTED_TYPES {
+  TEXT = 'text',
+  PASSWORD = 'password',
+  EMAIL = 'email',
+  NUMBER = 'number',
+  DATE = 'date',
+  TIME = 'time',
+  DATETIME = 'datetime',
+  CHECKBOX = 'checkbox',
+  SELECT = 'select',
+}
+const MarkdownForm = ({ node }: any) => {
+  const { onSend } = useChatContext()
+
+  const [formValues, setFormValues] = useState<{ [key: string]: any }>({})
+
+  useEffect(() => {
+    const initialValues: { [key: string]: any } = {}
+    node.children.forEach((child: any) => {
+      if ([SUPPORTED_TAGS.INPUT, SUPPORTED_TAGS.TEXTAREA].includes(child.tagName))
+        initialValues[child.properties.name] = child.properties.value
+    })
+    setFormValues(initialValues)
+  }, [node.children])
+
+  const getFormValues = (children: any) => {
+    const values: { [key: string]: any } = {}
+    children.forEach((child: any) => {
+      if ([SUPPORTED_TAGS.INPUT, SUPPORTED_TAGS.TEXTAREA].includes(child.tagName))
+        values[child.properties.name] = formValues[child.properties.name]
+    })
+    return values
+  }
+
+  const onSubmit = (e: any) => {
+    e.preventDefault()
+    const format = node.properties.dataFormat || DATA_FORMAT.TEXT
+    const result = getFormValues(node.children)
+
+    if (format === DATA_FORMAT.JSON) {
+      onSend?.(JSON.stringify(result))
+    }
+    else {
+      const textResult = Object.entries(result)
+        .map(([key, value]) => `${key}: ${value}`)
+        .join('\n')
+      onSend?.(textResult)
+    }
+  }
+  return (
+    <form
+      autoComplete="off"
+      className='flex flex-col self-stretch'
+      onSubmit={(e: any) => {
+        e.preventDefault()
+        e.stopPropagation()
+      }}
+    >
+      {node.children.filter((i: any) => i.type === 'element').map((child: any, index: number) => {
+        if (child.tagName === SUPPORTED_TAGS.LABEL) {
+          return (
+            <label
+              key={index}
+              htmlFor={child.properties.for}
+              className="system-md-semibold my-2 text-text-secondary"
+            >
+              {child.children[0]?.value || ''}
+            </label>
+          )
+        }
+        if (child.tagName === SUPPORTED_TAGS.INPUT && Object.values(SUPPORTED_TYPES).includes(child.properties.type)) {
+          if (child.properties.type === SUPPORTED_TYPES.DATE || child.properties.type === SUPPORTED_TYPES.DATETIME) {
+            return (
+              <DatePicker
+                key={index}
+                value={formValues[child.properties.name]}
+                needTimePicker={child.properties.type === SUPPORTED_TYPES.DATETIME}
+                onChange={(date) => {
+                  setFormValues(prevValues => ({
+                    ...prevValues,
+                    [child.properties.name]: date,
+                  }))
+                }}
+                onClear={() => {
+                  setFormValues(prevValues => ({
+                    ...prevValues,
+                    [child.properties.name]: undefined,
+                  }))
+                }}
+              />
+            )
+          }
+          if (child.properties.type === SUPPORTED_TYPES.TIME) {
+            return (
+              <TimePicker
+                key={index}
+                value={formValues[child.properties.name]}
+                onChange={(time) => {
+                  setFormValues(prevValues => ({
+                    ...prevValues,
+                    [child.properties.name]: time,
+                  }))
+                }}
+                onClear={() => {
+                  setFormValues(prevValues => ({
+                    ...prevValues,
+                    [child.properties.name]: undefined,
+                  }))
+                }}
+              />
+            )
+          }
+          if (child.properties.type === SUPPORTED_TYPES.CHECKBOX) {
+            return (
+              <div className='mt-2 flex h-6 items-center space-x-2' key={index}>
+                <Checkbox
+                  key={index}
+                  checked={formValues[child.properties.name]}
+                  onCheck={() => {
+                    setFormValues(prevValues => ({
+                      ...prevValues,
+                      [child.properties.name]: !prevValues[child.properties.name],
+                    }))
+                  }}
+                />
+                <span>{child.properties.dataTip || child.properties['data-tip'] || ''}</span>
+              </div>
+            )
+          }
+          if (child.properties.type === SUPPORTED_TYPES.SELECT) {
+            return (
+              <Select
+                key={index}
+                allowSearch={false}
+                className="w-full"
+                items={(() => {
+                  let options = child.properties.dataOptions || child.properties['data-options'] || []
+                  if (typeof options === 'string') {
+                    try {
+                      options = JSON.parse(options)
+                    }
+                    catch (e) {
+                      console.error('Failed to parse options:', e)
+                      options = []
+                    }
+                  }
+                  return options.map((option: string) => ({
+                    name: option,
+                    value: option,
+                  }))
+                })()}
+                defaultValue={formValues[child.properties.name]}
+                onSelect={(item) => {
+                  setFormValues(prevValues => ({
+                    ...prevValues,
+                    [child.properties.name]: item.value,
+                  }))
+                }}
+              />
+            )
+          }
+
+          return (
+            <Input
+              key={index}
+              type={child.properties.type}
+              name={child.properties.name}
+              placeholder={child.properties.placeholder}
+              value={formValues[child.properties.name]}
+              onChange={(e) => {
+                setFormValues(prevValues => ({
+                  ...prevValues,
+                  [child.properties.name]: e.target.value,
+                }))
+              }}
+            />
+          )
+        }
+        if (child.tagName === SUPPORTED_TAGS.TEXTAREA) {
+          return (
+            <Textarea
+              key={index}
+              name={child.properties.name}
+              placeholder={child.properties.placeholder}
+              value={formValues[child.properties.name]}
+              onChange={(e) => {
+                setFormValues(prevValues => ({
+                  ...prevValues,
+                  [child.properties.name]: e.target.value,
+                }))
+              }}
+            />
+          )
+        }
+        if (child.tagName === SUPPORTED_TAGS.BUTTON) {
+          const variant = child.properties.dataVariant
+          const size = child.properties.dataSize
+
+          return (
+            <Button
+              variant={variant}
+              size={size}
+              className='mt-4'
+              key={index}
+              onClick={onSubmit}
+            >
+              <span className='text-[13px]'>{child.children[0]?.value || ''}</span>
+            </Button>
+          )
+        }
+
+        return <p key={index}>Unsupported tag: {child.tagName}</p>
+      })}
+    </form>
+  )
+}
+MarkdownForm.displayName = 'MarkdownForm'
+export default MarkdownForm
diff --git a/app/components/base/markdown-blocks/music.tsx b/app/components/base/markdown-blocks/music.tsx
new file mode 100644
index 0000000..7edd171
--- /dev/null
+++ b/app/components/base/markdown-blocks/music.tsx
@@ -0,0 +1,37 @@
+import abcjs from 'abcjs'
+import { useEffect, useRef } from 'react'
+import 'abcjs/abcjs-audio.css'
+
+const MarkdownMusic = ({ children }: { children: React.ReactNode }) => {
+  const containerRef = useRef<HTMLDivElement>(null)
+  const controlsRef = useRef<HTMLDivElement>(null)
+
+  useEffect(() => {
+    if (containerRef.current && controlsRef.current) {
+      if (typeof children === 'string') {
+        const visualObjs = abcjs.renderAbc(containerRef.current, children, {
+          add_classes: true, // Add classes to SVG elements for cursor tracking
+          responsive: 'resize', // Make notation responsive
+        })
+        const synthControl = new abcjs.synth.SynthController()
+        synthControl.load(controlsRef.current, {}, { displayPlay: true })
+        const synth = new abcjs.synth.CreateSynth()
+        const visualObj = visualObjs[0]
+        synth.init({ visualObj }).then(() => {
+          synthControl.setTune(visualObj, false)
+        })
+        containerRef.current.style.overflow = 'auto'
+      }
+    }
+  }, [children])
+
+  return (
+    <div style={{ minWidth: '100%', overflow: 'auto' }}>
+      <div ref={containerRef} />
+      <div ref={controlsRef} />
+    </div>
+  )
+}
+MarkdownMusic.displayName = 'MarkdownMusic'
+
+export default MarkdownMusic
diff --git a/app/components/base/markdown-blocks/think-block.tsx b/app/components/base/markdown-blocks/think-block.tsx
new file mode 100644
index 0000000..565582e
--- /dev/null
+++ b/app/components/base/markdown-blocks/think-block.tsx
@@ -0,0 +1,99 @@
+import React, { useEffect, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+
+const hasEndThink = (children: any): boolean => {
+  if (typeof children === 'string')
+    return children.includes('[ENDTHINKFLAG]')
+
+  if (Array.isArray(children))
+    return children.some(child => hasEndThink(child))
+
+  if (children?.props?.children)
+    return hasEndThink(children.props.children)
+
+  return false
+}
+
+const removeEndThink = (children: any): any => {
+  if (typeof children === 'string')
+    return children.replace('[ENDTHINKFLAG]', '')
+
+  if (Array.isArray(children))
+    return children.map(child => removeEndThink(child))
+
+  if (children?.props?.children) {
+    return React.cloneElement(
+      children,
+      {
+        ...children.props,
+        children: removeEndThink(children.props.children),
+      },
+    )
+  }
+
+  return children
+}
+
+const useThinkTimer = (children: any) => {
+  const [startTime] = useState(Date.now())
+  const [elapsedTime, setElapsedTime] = useState(0)
+  const [isComplete, setIsComplete] = useState(false)
+  const timerRef = useRef<NodeJS.Timeout>()
+
+  useEffect(() => {
+    if (isComplete) return
+
+    timerRef.current = setInterval(() => {
+      setElapsedTime(Math.floor((Date.now() - startTime) / 100) / 10)
+    }, 100)
+
+    return () => {
+      if (timerRef.current)
+        clearInterval(timerRef.current)
+    }
+  }, [startTime, isComplete])
+
+  useEffect(() => {
+    if (hasEndThink(children))
+      setIsComplete(true)
+  }, [children])
+
+  return { elapsedTime, isComplete }
+}
+
+export const ThinkBlock = ({ children, ...props }: any) => {
+  const { elapsedTime, isComplete } = useThinkTimer(children)
+  const displayContent = removeEndThink(children)
+  const { t } = useTranslation()
+
+  if (!(props['data-think'] ?? false))
+    return (<details {...props}>{children}</details>)
+
+  return (
+    <details {...(!isComplete && { open: true })} className="group">
+      <summary className="flex cursor-pointer select-none list-none items-center whitespace-nowrap pl-2 font-bold text-gray-500">
+        <div className="flex shrink-0 items-center">
+          <svg
+            className="mr-2 h-3 w-3 transition-transform duration-500 group-open:rotate-90"
+            fill="none"
+            stroke="currentColor"
+            viewBox="0 0 24 24"
+          >
+            <path
+              strokeLinecap="round"
+              strokeLinejoin="round"
+              strokeWidth={2}
+              d="M9 5l7 7-7 7"
+            />
+          </svg>
+          {isComplete ? `${t('common.chat.thought')}(${elapsedTime.toFixed(1)}s)` : `${t('common.chat.thinking')}(${elapsedTime.toFixed(1)}s)`}
+        </div>
+      </summary>
+      <div className="ml-2 border-l border-gray-300 bg-gray-50 p-3 text-gray-500">
+        {displayContent}
+      </div>
+    </details>
+  )
+}
+
+export default ThinkBlock
diff --git a/app/components/base/markdown.tsx b/app/components/base/markdown.tsx
new file mode 100644
index 0000000..bc6fe0e
--- /dev/null
+++ b/app/components/base/markdown.tsx
@@ -0,0 +1,355 @@
+import ReactMarkdown from 'react-markdown'
+import ReactEcharts from 'echarts-for-react'
+import 'katex/dist/katex.min.css'
+import RemarkMath from 'remark-math'
+import RemarkBreaks from 'remark-breaks'
+import RehypeKatex from 'rehype-katex'
+import RemarkGfm from 'remark-gfm'
+import RehypeRaw from 'rehype-raw'
+import SyntaxHighlighter from 'react-syntax-highlighter'
+import {
+  atelierHeathDark,
+  atelierHeathLight,
+} from 'react-syntax-highlighter/dist/esm/styles/hljs'
+import { Component, memo, useMemo, useRef, useState } from 'react'
+import { flow } from 'lodash-es'
+import ActionButton from '@/app/components/base/action-button'
+import CopyIcon from '@/app/components/base/copy-icon'
+import SVGBtn from '@/app/components/base/svg'
+import Flowchart from '@/app/components/base/mermaid'
+import ImageGallery from '@/app/components/base/image-gallery'
+import { useChatContext } from '@/app/components/base/chat/chat/context'
+import VideoGallery from '@/app/components/base/video-gallery'
+import AudioGallery from '@/app/components/base/audio-gallery'
+import MarkdownButton from '@/app/components/base/markdown-blocks/button'
+import MarkdownForm from '@/app/components/base/markdown-blocks/form'
+import MarkdownMusic from '@/app/components/base/markdown-blocks/music'
+import ThinkBlock from '@/app/components/base/markdown-blocks/think-block'
+import { Theme } from '@/types/app'
+import useTheme from '@/hooks/use-theme'
+import cn from '@/utils/classnames'
+import SVGRenderer from './svg-gallery'
+
+// Available language https://github.com/react-syntax-highlighter/react-syntax-highlighter/blob/master/AVAILABLE_LANGUAGES_HLJS.MD
+const capitalizationLanguageNameMap: Record<string, string> = {
+  sql: 'SQL',
+  javascript: 'JavaScript',
+  java: 'Java',
+  typescript: 'TypeScript',
+  vbscript: 'VBScript',
+  css: 'CSS',
+  html: 'HTML',
+  xml: 'XML',
+  php: 'PHP',
+  python: 'Python',
+  yaml: 'Yaml',
+  mermaid: 'Mermaid',
+  markdown: 'MarkDown',
+  makefile: 'MakeFile',
+  echarts: 'ECharts',
+  shell: 'Shell',
+  powershell: 'PowerShell',
+  json: 'JSON',
+  latex: 'Latex',
+  svg: 'SVG',
+  abc: 'ABC',
+}
+const getCorrectCapitalizationLanguageName = (language: string) => {
+  if (!language)
+    return 'Plain'
+
+  if (language in capitalizationLanguageNameMap)
+    return capitalizationLanguageNameMap[language]
+
+  return language.charAt(0).toUpperCase() + language.substring(1)
+}
+
+const preprocessLaTeX = (content: string) => {
+  if (typeof content !== 'string')
+    return content
+
+  const codeBlockRegex = /```[\s\S]*?```/g
+  const codeBlocks = content.match(codeBlockRegex) || []
+  let processedContent = content.replace(codeBlockRegex, 'CODE_BLOCK_PLACEHOLDER')
+
+  processedContent = flow([
+    (str: string) => str.replace(/\\\[(.*?)\\\]/g, (_, equation) => `$$${equation}$$`),
+    (str: string) => str.replace(/\\\[(.*?)\\\]/gs, (_, equation) => `$$${equation}$$`),
+    (str: string) => str.replace(/\\\((.*?)\\\)/g, (_, equation) => `$$${equation}$$`),
+    (str: string) => str.replace(/(^|[^\\])\$(.+?)\$/g, (_, prefix, equation) => `${prefix}$${equation}$`),
+  ])(processedContent)
+
+  codeBlocks.forEach((block) => {
+    processedContent = processedContent.replace('CODE_BLOCK_PLACEHOLDER', block)
+  })
+
+  return processedContent
+}
+
+const preprocessThinkTag = (content: string) => {
+  const thinkOpenTagRegex = /<think>\n/g
+  const thinkCloseTagRegex = /\n<\/think>/g
+  return flow([
+    (str: string) => str.replace(thinkOpenTagRegex, '<details data-think=true>\n'),
+    (str: string) => str.replace(thinkCloseTagRegex, '\n[ENDTHINKFLAG]</details>'),
+  ])(content)
+}
+
+export function PreCode(props: { children: any }) {
+  const ref = useRef<HTMLPreElement>(null)
+
+  return (
+    <pre ref={ref}>
+      <span
+        className="copy-code-button"
+      ></span>
+      {props.children}
+    </pre>
+  )
+}
+
+// **Add code block
+// Avoid error #185 (Maximum update depth exceeded.
+// This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate.
+// React limits the number of nested updates to prevent infinite loops.)
+// Reference A: https://reactjs.org/docs/error-decoder.html?invariant=185
+// Reference B1: https://react.dev/reference/react/memo
+// Reference B2: https://react.dev/reference/react/useMemo
+// ****
+// The original error that occurred in the streaming response during the conversation:
+// Error: Minified React error 185;
+// visit https://reactjs.org/docs/error-decoder.html?invariant=185 for the full message
+// or use the non-minified dev environment for full errors and additional helpful warnings.
+
+const CodeBlock: any = memo(({ inline, className, children = '', ...props }: any) => {
+  const { theme } = useTheme()
+  const [isSVG, setIsSVG] = useState(true)
+  const match = /language-(\w+)/.exec(className || '')
+  const language = match?.[1]
+  const languageShowName = getCorrectCapitalizationLanguageName(language || '')
+  const chartData = useMemo(() => {
+    const str = String(children).replace(/\n$/, '')
+    if (language === 'echarts') {
+      try {
+        return JSON.parse(str)
+      }
+      catch { }
+      try {
+        // eslint-disable-next-line no-new-func, sonarjs/code-eval
+        return new Function(`return ${str}`)()
+      }
+      catch { }
+    }
+    return JSON.parse('{"title":{"text":"ECharts error - Wrong option."}}')
+  }, [language, children])
+
+  const renderCodeContent = useMemo(() => {
+    const content = String(children).replace(/\n$/, '')
+    switch (language) {
+      case 'mermaid':
+        if (isSVG)
+          return <Flowchart PrimitiveCode={content} />
+        break
+      case 'echarts':
+        return (
+          <div style={{ minHeight: '350px', minWidth: '100%', overflowX: 'scroll' }}>
+            <ErrorBoundary>
+              <ReactEcharts option={chartData} style={{ minWidth: '700px' }} />
+            </ErrorBoundary>
+          </div>
+        )
+      case 'svg':
+        if (isSVG) {
+          return (
+            <ErrorBoundary>
+              <SVGRenderer content={content} />
+            </ErrorBoundary>
+          )
+        }
+        break
+      case 'abc':
+        return (
+          <ErrorBoundary>
+            <MarkdownMusic children={content} />
+          </ErrorBoundary>
+        )
+      default:
+        return (
+          <SyntaxHighlighter
+            {...props}
+            style={theme === Theme.light ? atelierHeathLight : atelierHeathDark}
+            customStyle={{
+              paddingLeft: 12,
+              borderBottomLeftRadius: '10px',
+              borderBottomRightRadius: '10px',
+              backgroundColor: 'var(--color-components-input-bg-normal)',
+            }}
+            language={match?.[1]}
+            showLineNumbers
+            PreTag="div"
+          >
+            {content}
+          </SyntaxHighlighter>
+        )
+    }
+  }, [children, language, isSVG, chartData, props, theme, match])
+
+  if (inline || !match)
+    return <code {...props} className={className}>{children}</code>
+
+  return (
+    <div className='relative'>
+      <div className='flex h-8 items-center justify-between rounded-t-[10px] border-b border-divider-subtle bg-components-input-bg-normal p-1 pl-3'>
+        <div className='system-xs-semibold-uppercase text-text-secondary'>{languageShowName}</div>
+        <div className='flex items-center gap-1'>
+          {(['mermaid', 'svg']).includes(language!) && <SVGBtn isSVG={isSVG} setIsSVG={setIsSVG} />}
+          <ActionButton>
+            <CopyIcon content={String(children).replace(/\n$/, '')} />
+          </ActionButton>
+        </div>
+      </div>
+      {renderCodeContent}
+    </div>
+  )
+})
+CodeBlock.displayName = 'CodeBlock'
+
+const VideoBlock: any = memo(({ node }: any) => {
+  const srcs = node.children.filter((child: any) => 'properties' in child).map((child: any) => (child as any).properties.src)
+  if (srcs.length === 0)
+    return null
+  return <VideoGallery key={srcs.join()} srcs={srcs} />
+})
+VideoBlock.displayName = 'VideoBlock'
+
+const AudioBlock: any = memo(({ node }: any) => {
+  const srcs = node.children.filter((child: any) => 'properties' in child).map((child: any) => (child as any).properties.src)
+  if (srcs.length === 0)
+    return null
+  return <AudioGallery key={srcs.join()} srcs={srcs} />
+})
+AudioBlock.displayName = 'AudioBlock'
+
+const ScriptBlock = memo(({ node }: any) => {
+  const scriptContent = node.children[0]?.value || ''
+  return `<script>${scriptContent}</script>`
+})
+ScriptBlock.displayName = 'ScriptBlock'
+
+const Paragraph = (paragraph: any) => {
+  const { node }: any = paragraph
+  const children_node = node.children
+  if (children_node && children_node[0] && 'tagName' in children_node[0] && children_node[0].tagName === 'img') {
+    return (
+      <div className="markdown-img-wrapper">
+        <ImageGallery srcs={[children_node[0].properties.src]} />
+        {
+          Array.isArray(paragraph.children) && paragraph.children.length > 1 && (
+            <div className="mt-2">{paragraph.children.slice(1)}</div>
+          )
+        }
+      </div>
+    )
+  }
+  return <p>{paragraph.children}</p>
+}
+
+const Img = ({ src }: any) => {
+  return <div className="markdown-img-wrapper"><ImageGallery srcs={[src]} /></div>
+}
+
+const Link = ({ node, children, ...props }: any) => {
+  if (node.properties?.href && node.properties.href?.toString().startsWith('abbr')) {
+    // eslint-disable-next-line react-hooks/rules-of-hooks
+    const { onSend } = useChatContext()
+    const hidden_text = decodeURIComponent(node.properties.href.toString().split('abbr:')[1])
+
+    return <abbr className="cursor-pointer underline !decoration-primary-700 decoration-dashed" onClick={() => onSend?.(hidden_text)} title={node.children[0]?.value || ''}>{node.children[0]?.value || ''}</abbr>
+  }
+  else {
+    return <a {...props} target="_blank" className="cursor-pointer underline !decoration-primary-700 decoration-dashed">{children || 'Download'}</a>
+  }
+}
+
+export function Markdown(props: { content: string; className?: string; customDisallowedElements?: string[] }) {
+  const latexContent = flow([
+    preprocessThinkTag,
+    preprocessLaTeX,
+  ])(props.content)
+
+  return (
+    <div className={cn('markdown-body', '!text-text-primary', props.className)}>
+      <ReactMarkdown
+        remarkPlugins={[
+          RemarkGfm,
+          [RemarkMath, { singleDollarTextMath: false }],
+          RemarkBreaks,
+        ]}
+        rehypePlugins={[
+          RehypeKatex,
+          RehypeRaw as any,
+          // The Rehype plug-in is used to remove the ref attribute of an element
+          () => {
+            return (tree) => {
+              const iterate = (node: any) => {
+                if (node.type === 'element' && node.properties?.ref)
+                  delete node.properties.ref
+
+                if (node.type === 'element' && !/^[a-z][a-z0-9]*$/i.test(node.tagName)) {
+                  node.type = 'text'
+                  node.value = `<${node.tagName}`
+                }
+
+                if (node.children)
+                  node.children.forEach(iterate)
+              }
+              tree.children.forEach(iterate)
+            }
+          },
+        ]}
+        disallowedElements={['iframe', 'head', 'html', 'meta', 'link', 'style', 'body', ...(props.customDisallowedElements || [])]}
+        components={{
+          code: CodeBlock,
+          img: Img,
+          video: VideoBlock,
+          audio: AudioBlock,
+          a: Link,
+          p: Paragraph,
+          button: MarkdownButton,
+          form: MarkdownForm,
+          script: ScriptBlock as any,
+          details: ThinkBlock,
+        }}
+      >
+        {/* Markdown detect has problem. */}
+        {latexContent}
+      </ReactMarkdown>
+    </div>
+  )
+}
+
+// **Add an ECharts runtime error handler
+// Avoid error #7832 (Crash when ECharts accesses undefined objects)
+// This can happen when a component attempts to access an undefined object that references an unregistered map, causing the program to crash.
+
+export default class ErrorBoundary extends Component {
+  constructor(props: any) {
+    super(props)
+    this.state = { hasError: false }
+  }
+
+  componentDidCatch(error: any, errorInfo: any) {
+    this.setState({ hasError: true })
+    console.error(error, errorInfo)
+  }
+
+  render() {
+    // eslint-disable-next-line ts/ban-ts-comment
+    // @ts-expect-error
+    if (this.state.hasError)
+      return <div>Oops! An error occurred. This could be due to an ECharts runtime error or invalid SVG content. <br />(see the browser console for more information)</div>
+    // eslint-disable-next-line ts/ban-ts-comment
+    // @ts-expect-error
+    return this.props.children
+  }
+}
diff --git a/app/components/base/mermaid/index.tsx b/app/components/base/mermaid/index.tsx
new file mode 100644
index 0000000..a484261
--- /dev/null
+++ b/app/components/base/mermaid/index.tsx
@@ -0,0 +1,590 @@
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import mermaid from 'mermaid'
+import { useTranslation } from 'react-i18next'
+import { ExclamationTriangleIcon } from '@heroicons/react/24/outline'
+import { MoonIcon, SunIcon } from '@heroicons/react/24/solid'
+import {
+  cleanUpSvgCode,
+  isMermaidCodeComplete,
+  prepareMermaidCode,
+  processSvgForTheme,
+  svgToBase64,
+  waitForDOMElement,
+} from './utils'
+import LoadingAnim from '@/app/components/base/chat/chat/loading-anim'
+import cn from '@/utils/classnames'
+import ImagePreview from '@/app/components/base/image-uploader/image-preview'
+import { Theme } from '@/types/app'
+
+// Global flags and cache for mermaid
+let isMermaidInitialized = false
+const diagramCache = new Map<string, string>()
+let mermaidAPI: any = null
+
+if (typeof window !== 'undefined')
+  mermaidAPI = mermaid.mermaidAPI
+
+// Theme configurations
+const THEMES = {
+  light: {
+    name: 'Light Theme',
+    background: '#ffffff',
+    primaryColor: '#ffffff',
+    primaryBorderColor: '#000000',
+    primaryTextColor: '#000000',
+    secondaryColor: '#ffffff',
+    tertiaryColor: '#ffffff',
+    nodeColors: [
+      { bg: '#f0f9ff', color: '#0369a1' },
+      { bg: '#f0fdf4', color: '#166534' },
+      { bg: '#fef2f2', color: '#b91c1c' },
+      { bg: '#faf5ff', color: '#7e22ce' },
+      { bg: '#fffbeb', color: '#b45309' },
+    ],
+    connectionColor: '#74a0e0',
+  },
+  dark: {
+    name: 'Dark Theme',
+    background: '#1e293b',
+    primaryColor: '#334155',
+    primaryBorderColor: '#94a3b8',
+    primaryTextColor: '#e2e8f0',
+    secondaryColor: '#475569',
+    tertiaryColor: '#334155',
+    nodeColors: [
+      { bg: '#164e63', color: '#e0f2fe' },
+      { bg: '#14532d', color: '#dcfce7' },
+      { bg: '#7f1d1d', color: '#fee2e2' },
+      { bg: '#581c87', color: '#f3e8ff' },
+      { bg: '#78350f', color: '#fef3c7' },
+    ],
+    connectionColor: '#60a5fa',
+  },
+}
+
+/**
+ * Initializes mermaid library with default configuration
+ */
+const initMermaid = () => {
+  if (typeof window !== 'undefined' && !isMermaidInitialized) {
+    try {
+      mermaid.initialize({
+        startOnLoad: false,
+        fontFamily: 'sans-serif',
+        securityLevel: 'loose',
+        flowchart: {
+          htmlLabels: true,
+          useMaxWidth: true,
+          diagramPadding: 10,
+          curve: 'basis',
+          nodeSpacing: 50,
+          rankSpacing: 70,
+        },
+        gantt: {
+          titleTopMargin: 25,
+          barHeight: 20,
+          barGap: 4,
+          topPadding: 50,
+          leftPadding: 75,
+          gridLineStartPadding: 35,
+          fontSize: 11,
+          numberSectionStyles: 4,
+          axisFormat: '%Y-%m-%d',
+        },
+        maxTextSize: 50000,
+      })
+      isMermaidInitialized = true
+    }
+    catch (error) {
+      console.error('Mermaid initialization error:', error)
+      return null
+    }
+  }
+  return isMermaidInitialized
+}
+
+const Flowchart = React.forwardRef((props: {
+  PrimitiveCode: string
+  theme?: 'light' | 'dark'
+}, ref) => {
+  const { t } = useTranslation()
+  const [svgCode, setSvgCode] = useState<string | null>(null)
+  const [look, setLook] = useState<'classic' | 'handDrawn'>('classic')
+  const [isInitialized, setIsInitialized] = useState(false)
+  const [currentTheme, setCurrentTheme] = useState<'light' | 'dark'>(props.theme || 'light')
+  const containerRef = useRef<HTMLDivElement>(null)
+  const chartId = useRef(`mermaid-chart-${Math.random().toString(36).substr(2, 9)}`).current
+  const [isLoading, setIsLoading] = useState(true)
+  const renderTimeoutRef = useRef<NodeJS.Timeout>()
+  const [errMsg, setErrMsg] = useState('')
+  const [imagePreviewUrl, setImagePreviewUrl] = useState('')
+  const [isCodeComplete, setIsCodeComplete] = useState(false)
+  const codeCompletionCheckRef = useRef<NodeJS.Timeout>()
+
+  // Create cache key from code, style and theme
+  const cacheKey = useMemo(() => {
+    return `${props.PrimitiveCode}-${look}-${currentTheme}`
+  }, [props.PrimitiveCode, look, currentTheme])
+
+  /**
+   * Renders Mermaid chart
+   */
+  const renderMermaidChart = async (code: string, style: 'classic' | 'handDrawn') => {
+    if (style === 'handDrawn') {
+      // Special handling for hand-drawn style
+      if (containerRef.current)
+        containerRef.current.innerHTML = `<div id="${chartId}"></div>`
+      await new Promise(resolve => setTimeout(resolve, 30))
+
+      if (typeof window !== 'undefined' && mermaidAPI) {
+        // Prefer using mermaidAPI directly for hand-drawn style
+        return await mermaidAPI.render(chartId, code)
+      }
+      else {
+        // Fall back to standard rendering if mermaidAPI is not available
+        const { svg } = await mermaid.render(chartId, code)
+        return { svg }
+      }
+    }
+    else {
+      // Standard rendering for classic style - using the extracted waitForDOMElement function
+      const renderWithRetry = async () => {
+        if (containerRef.current)
+          containerRef.current.innerHTML = `<div id="${chartId}"></div>`
+        await new Promise(resolve => setTimeout(resolve, 30))
+        const { svg } = await mermaid.render(chartId, code)
+        return { svg }
+      }
+      return await waitForDOMElement(renderWithRetry)
+    }
+  }
+
+  /**
+   * Handle rendering errors
+   */
+  const handleRenderError = (error: any) => {
+    console.error('Mermaid rendering error:', error)
+    const errorMsg = (error as Error).message
+
+    if (errorMsg.includes('getAttribute')) {
+      diagramCache.clear()
+      mermaid.initialize({
+        startOnLoad: false,
+        securityLevel: 'loose',
+      })
+    }
+    else {
+      setErrMsg(`Rendering chart failed, please refresh and try again ${look === 'handDrawn' ? 'Or try using classic mode' : ''}`)
+    }
+
+    if (look === 'handDrawn') {
+      try {
+        // Clear possible cache issues
+        diagramCache.delete(`${props.PrimitiveCode}-handDrawn-${currentTheme}`)
+
+        // Reset mermaid configuration
+        mermaid.initialize({
+          startOnLoad: false,
+          securityLevel: 'loose',
+          theme: 'default',
+          maxTextSize: 50000,
+        })
+
+        // Try rendering with standard mode
+        setLook('classic')
+        setErrMsg('Hand-drawn mode is not supported for this diagram. Switched to classic mode.')
+
+        // Delay error clearing
+        setTimeout(() => {
+          if (containerRef.current) {
+            // Try rendering again with standard mode, but can't call renderFlowchart directly due to circular dependency
+            // Instead set state to trigger re-render
+            setIsCodeComplete(true) // This will trigger useEffect re-render
+          }
+        }, 500)
+      }
+      catch (e) {
+        console.error('Reset after handDrawn error failed:', e)
+      }
+    }
+
+    setIsLoading(false)
+  }
+
+  // Initialize mermaid
+  useEffect(() => {
+    const api = initMermaid()
+    if (api)
+      setIsInitialized(true)
+  }, [])
+
+  // Update theme when prop changes
+  useEffect(() => {
+    if (props.theme)
+      setCurrentTheme(props.theme)
+  }, [props.theme])
+
+  // Validate mermaid code and check for completeness
+  useEffect(() => {
+    if (codeCompletionCheckRef.current)
+      clearTimeout(codeCompletionCheckRef.current)
+
+    // Reset code complete status when code changes
+    setIsCodeComplete(false)
+
+    // If no code or code is extremely short, don't proceed
+    if (!props.PrimitiveCode || props.PrimitiveCode.length < 10)
+      return
+
+    // Check if code already in cache - if so we know it's valid
+    if (diagramCache.has(cacheKey)) {
+      setIsCodeComplete(true)
+      return
+    }
+
+    // Initial check using the extracted isMermaidCodeComplete function
+    const isComplete = isMermaidCodeComplete(props.PrimitiveCode)
+    if (isComplete) {
+      setIsCodeComplete(true)
+      return
+    }
+
+    // Set a delay to check again in case code is still being generated
+    codeCompletionCheckRef.current = setTimeout(() => {
+      setIsCodeComplete(isMermaidCodeComplete(props.PrimitiveCode))
+    }, 300)
+
+    return () => {
+      if (codeCompletionCheckRef.current)
+        clearTimeout(codeCompletionCheckRef.current)
+    }
+  }, [props.PrimitiveCode, cacheKey])
+
+  /**
+   * Renders flowchart based on provided code
+   */
+  const renderFlowchart = useCallback(async (primitiveCode: string) => {
+    if (!isInitialized || !containerRef.current) {
+      setIsLoading(false)
+      setErrMsg(!isInitialized ? 'Mermaid initialization failed' : 'Container element not found')
+      return
+    }
+
+    // Don't render if code is not complete yet
+    if (!isCodeComplete) {
+      setIsLoading(true)
+      return
+    }
+
+    // Return cached result if available
+    if (diagramCache.has(cacheKey)) {
+      setSvgCode(diagramCache.get(cacheKey) || null)
+      setIsLoading(false)
+      return
+    }
+
+    setIsLoading(true)
+    setErrMsg('')
+
+    try {
+      let finalCode: string
+
+      // Check if it's a gantt chart
+      const isGanttChart = primitiveCode.trim().startsWith('gantt')
+
+      if (isGanttChart) {
+        // For gantt charts, ensure each task is on its own line
+        // and preserve exact whitespace/format
+        finalCode = primitiveCode.trim()
+      }
+      else {
+        // Step 1: Clean and prepare Mermaid code using the extracted prepareMermaidCode function
+        finalCode = prepareMermaidCode(primitiveCode, look)
+      }
+
+      // Step 2: Render chart
+      const svgGraph = await renderMermaidChart(finalCode, look)
+
+      // Step 3: Apply theme to SVG using the extracted processSvgForTheme function
+      const processedSvg = processSvgForTheme(
+        svgGraph.svg,
+        currentTheme === Theme.dark,
+        look === 'handDrawn',
+        THEMES,
+      )
+
+      // Step 4: Clean SVG code and convert to base64 using the extracted functions
+      const cleanedSvg = cleanUpSvgCode(processedSvg)
+      const base64Svg = await svgToBase64(cleanedSvg)
+
+      if (base64Svg && typeof base64Svg === 'string') {
+        diagramCache.set(cacheKey, base64Svg)
+        setSvgCode(base64Svg)
+      }
+
+      setIsLoading(false)
+    }
+    catch (error) {
+      // Error handling
+      handleRenderError(error)
+    }
+  }, [chartId, isInitialized, cacheKey, isCodeComplete, look, currentTheme, t])
+
+  /**
+   * Configure mermaid based on selected style and theme
+   */
+  const configureMermaid = useCallback(() => {
+    if (typeof window !== 'undefined' && isInitialized) {
+      const themeVars = THEMES[currentTheme]
+      const config: any = {
+        startOnLoad: false,
+        securityLevel: 'loose',
+        fontFamily: 'sans-serif',
+        maxTextSize: 50000,
+        gantt: {
+          titleTopMargin: 25,
+          barHeight: 20,
+          barGap: 4,
+          topPadding: 50,
+          leftPadding: 75,
+          gridLineStartPadding: 35,
+          fontSize: 11,
+          numberSectionStyles: 4,
+          axisFormat: '%Y-%m-%d',
+        },
+      }
+
+      if (look === 'classic') {
+        config.theme = currentTheme === 'dark' ? 'dark' : 'neutral'
+        config.flowchart = {
+          htmlLabels: true,
+          useMaxWidth: true,
+          diagramPadding: 12,
+          nodeSpacing: 60,
+          rankSpacing: 80,
+          curve: 'linear',
+          ranker: 'tight-tree',
+        }
+      }
+      else {
+        config.theme = 'default'
+        config.themeCSS = `
+          .node rect { fill-opacity: 0.85; }
+          .edgePath .path { stroke-width: 1.5px; }
+          .label { font-family: 'sans-serif'; }
+          .edgeLabel { font-family: 'sans-serif'; }
+          .cluster rect { rx: 5px; ry: 5px; }
+        `
+        config.themeVariables = {
+          fontSize: '14px',
+          fontFamily: 'sans-serif',
+        }
+        config.flowchart = {
+          htmlLabels: true,
+          useMaxWidth: true,
+          diagramPadding: 10,
+          nodeSpacing: 40,
+          rankSpacing: 60,
+          curve: 'basis',
+        }
+        config.themeVariables.primaryBorderColor = currentTheme === 'dark' ? THEMES.dark.connectionColor : THEMES.light.connectionColor
+      }
+
+      if (currentTheme === 'dark' && !config.themeVariables) {
+        config.themeVariables = {
+          background: themeVars.background,
+          primaryColor: themeVars.primaryColor,
+          primaryBorderColor: themeVars.primaryBorderColor,
+          primaryTextColor: themeVars.primaryTextColor,
+          secondaryColor: themeVars.secondaryColor,
+          tertiaryColor: themeVars.tertiaryColor,
+          fontFamily: 'sans-serif',
+        }
+      }
+
+      try {
+        mermaid.initialize(config)
+        return true
+      }
+      catch (error) {
+        console.error('Config error:', error)
+        return false
+      }
+    }
+    return false
+  }, [currentTheme, isInitialized, look])
+
+  // Effect for theme and style configuration
+  useEffect(() => {
+    if (diagramCache.has(cacheKey)) {
+      setSvgCode(diagramCache.get(cacheKey) || null)
+      setIsLoading(false)
+      return
+    }
+
+    if (configureMermaid() && containerRef.current && isCodeComplete)
+      renderFlowchart(props.PrimitiveCode)
+  }, [look, props.PrimitiveCode, renderFlowchart, isInitialized, cacheKey, currentTheme, isCodeComplete, configureMermaid])
+
+  // Effect for rendering with debounce
+  useEffect(() => {
+    if (diagramCache.has(cacheKey)) {
+      setSvgCode(diagramCache.get(cacheKey) || null)
+      setIsLoading(false)
+      return
+    }
+
+    if (renderTimeoutRef.current)
+      clearTimeout(renderTimeoutRef.current)
+
+    if (isCodeComplete) {
+      renderTimeoutRef.current = setTimeout(() => {
+        if (isInitialized)
+          renderFlowchart(props.PrimitiveCode)
+      }, 300)
+    }
+    else {
+      setIsLoading(true)
+    }
+
+    return () => {
+      if (renderTimeoutRef.current)
+        clearTimeout(renderTimeoutRef.current)
+    }
+  }, [props.PrimitiveCode, renderFlowchart, isInitialized, cacheKey, isCodeComplete])
+
+  // Cleanup on unmount
+  useEffect(() => {
+    return () => {
+      if (containerRef.current)
+        containerRef.current.innerHTML = ''
+      if (renderTimeoutRef.current)
+        clearTimeout(renderTimeoutRef.current)
+      if (codeCompletionCheckRef.current)
+        clearTimeout(codeCompletionCheckRef.current)
+    }
+  }, [])
+
+  const toggleTheme = () => {
+    setCurrentTheme(prevTheme => prevTheme === 'light' ? Theme.dark : Theme.light)
+    diagramCache.clear()
+  }
+
+  // Style classes for theme-dependent elements
+  const themeClasses = {
+    container: cn('relative', {
+      'bg-white': currentTheme === Theme.light,
+      'bg-slate-900': currentTheme === Theme.dark,
+    }),
+    mermaidDiv: cn('mermaid relative h-auto w-full cursor-pointer', {
+      'bg-white': currentTheme === Theme.light,
+      'bg-slate-900': currentTheme === Theme.dark,
+    }),
+    errorMessage: cn('px-[26px] py-4', {
+      'text-red-500': currentTheme === Theme.light,
+      'text-red-400': currentTheme === Theme.dark,
+    }),
+    errorIcon: cn('h-6 w-6', {
+      'text-red-500': currentTheme === Theme.light,
+      'text-red-400': currentTheme === Theme.dark,
+    }),
+    segmented: cn('msh-segmented msh-segmented-sm css-23bs09 css-var-r1', {
+      'text-gray-700': currentTheme === Theme.light,
+      'text-gray-300': currentTheme === Theme.dark,
+    }),
+    themeToggle: cn('flex h-10 w-10 items-center justify-center rounded-full shadow-md backdrop-blur-sm transition-all duration-300', {
+      'bg-white/80 hover:bg-white hover:shadow-lg text-gray-700 border border-gray-200': currentTheme === Theme.light,
+      'bg-slate-800/80 hover:bg-slate-700 hover:shadow-lg text-yellow-300 border border-slate-600': currentTheme === Theme.dark,
+    }),
+  }
+
+  // Style classes for look options
+  const getLookButtonClass = (lookType: 'classic' | 'handDrawn') => {
+    return cn(
+      'system-sm-medium mb-4 flex h-8 w-[calc((100%-8px)/2)] cursor-pointer items-center justify-center rounded-lg border border-components-option-card-option-border bg-components-option-card-option-bg text-text-secondary',
+      look === lookType && 'border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg text-text-primary',
+      currentTheme === Theme.dark && 'border-slate-600 bg-slate-800 text-slate-300',
+      look === lookType && currentTheme === Theme.dark && 'border-blue-500 bg-slate-700 text-white',
+    )
+  }
+
+  return (
+    <div ref={ref as React.RefObject<HTMLDivElement>} className={themeClasses.container}>
+      <div className={themeClasses.segmented}>
+        <div className="msh-segmented-group">
+          <label className="msh-segmented-item m-2 flex w-[200px] items-center space-x-1">
+            <div
+              key='classic'
+              className={getLookButtonClass('classic')}
+              onClick={() => setLook('classic')}
+            >
+              <div className="msh-segmented-item-label">{t('app.mermaid.classic')}</div>
+            </div>
+            <div
+              key='handDrawn'
+              className={getLookButtonClass('handDrawn')}
+              onClick={() => setLook('handDrawn')}
+            >
+              <div className="msh-segmented-item-label">{t('app.mermaid.handDrawn')}</div>
+            </div>
+          </label>
+        </div>
+      </div>
+
+      <div ref={containerRef} style={{ position: 'absolute', visibility: 'hidden', height: 0, overflow: 'hidden' }} />
+
+      {isLoading && !svgCode && (
+        <div className='px-[26px] py-4'>
+          <LoadingAnim type='text'/>
+          {!isCodeComplete && (
+            <div className="mt-2 text-sm text-gray-500">
+              {t('common.wait_for_completion', 'Waiting for diagram code to complete...')}
+            </div>
+          )}
+        </div>
+      )}
+
+      {svgCode && (
+        <div className={themeClasses.mermaidDiv} style={{ objectFit: 'cover' }} onClick={() => setImagePreviewUrl(svgCode)}>
+          <div className="absolute bottom-2 left-2 z-[100]">
+            <button
+              onClick={(e) => {
+                e.stopPropagation()
+                toggleTheme()
+              }}
+              className={themeClasses.themeToggle}
+              title={(currentTheme === Theme.light ? t('app.theme.switchDark') : t('app.theme.switchLight')) || ''}
+              style={{ transform: 'translate3d(0, 0, 0)' }}
+            >
+              {currentTheme === Theme.light ? <MoonIcon className="h-5 w-5" /> : <SunIcon className="h-5 w-5" />}
+            </button>
+          </div>
+
+          <img
+            src={svgCode}
+            alt="mermaid_chart"
+            style={{ maxWidth: '100%' }}
+            onError={() => { setErrMsg('Chart rendering failed, please refresh and retry') }}
+          />
+        </div>
+      )}
+
+      {errMsg && (
+        <div className={themeClasses.errorMessage}>
+          <div className="flex items-center">
+            <ExclamationTriangleIcon className={themeClasses.errorIcon}/>
+            <span className="ml-2">{errMsg}</span>
+          </div>
+        </div>
+      )}
+
+      {imagePreviewUrl && (
+        <ImagePreview title='mermaid_chart' url={imagePreviewUrl} onCancel={() => setImagePreviewUrl('')} />
+      )}
+    </div>
+  )
+})
+
+Flowchart.displayName = 'Flowchart'
+
+export default Flowchart
diff --git a/app/components/base/mermaid/utils.spec.ts b/app/components/base/mermaid/utils.spec.ts
new file mode 100644
index 0000000..6ea7f17
--- /dev/null
+++ b/app/components/base/mermaid/utils.spec.ts
@@ -0,0 +1,8 @@
+import { cleanUpSvgCode } from './utils'
+
+describe('cleanUpSvgCode', () => {
+  it('replaces old-style <br> tags with the new style', () => {
+    const result = cleanUpSvgCode('<br>test<br>')
+    expect(result).toEqual('<br/>test<br/>')
+  })
+})
diff --git a/app/components/base/mermaid/utils.ts b/app/components/base/mermaid/utils.ts
new file mode 100644
index 0000000..7d94150
--- /dev/null
+++ b/app/components/base/mermaid/utils.ts
@@ -0,0 +1,232 @@
+export function cleanUpSvgCode(svgCode: string): string {
+  return svgCode.replaceAll('<br>', '<br/>')
+}
+
+/**
+ * Preprocesses mermaid code to fix common syntax issues
+ */
+export function preprocessMermaidCode(code: string): string {
+  if (!code || typeof code !== 'string')
+    return ''
+
+  // First check if this is a gantt chart
+  if (code.trim().startsWith('gantt')) {
+    // For gantt charts, we need to ensure each task is on its own line
+    // Split the code into lines and process each line separately
+    const lines = code.split('\n').map(line => line.trim())
+    return lines.join('\n')
+  }
+
+  return code
+    // Replace English colons with Chinese colons in section nodes to avoid parsing issues
+    .replace(/section\s+([^:]+):/g, (match, sectionName) => `section ${sectionName}锛歚)
+    // Fix common syntax issues
+    .replace(/fifopacket/g, 'rect')
+    // Clean up empty lines and extra spaces
+    .trim()
+}
+
+/**
+ * Prepares mermaid code based on selected style
+ */
+export function prepareMermaidCode(code: string, style: 'classic' | 'handDrawn'): string {
+  let finalCode = preprocessMermaidCode(code)
+
+  // Special handling for gantt charts
+  if (finalCode.trim().startsWith('gantt')) {
+    // For gantt charts, preserve the structure exactly as is
+    return finalCode
+  }
+
+  if (style === 'handDrawn') {
+    finalCode = finalCode
+      // Remove style definitions that interfere with hand-drawn style
+      .replace(/style\s+[^\n]+/g, '')
+      .replace(/linkStyle\s+[^\n]+/g, '')
+      .replace(/^flowchart/, 'graph')
+      // Remove any styles that might interfere with hand-drawn style
+      .replace(/class="[^"]*"/g, '')
+      .replace(/fill="[^"]*"/g, '')
+      .replace(/stroke="[^"]*"/g, '')
+
+    // Ensure hand-drawn style charts always start with graph
+    if (!finalCode.startsWith('graph') && !finalCode.startsWith('flowchart'))
+      finalCode = `graph TD\n${finalCode}`
+  }
+
+  return finalCode
+}
+
+/**
+ * Converts SVG to base64 string for image rendering
+ */
+export function svgToBase64(svgGraph: string): Promise<string> {
+  if (!svgGraph)
+    return Promise.resolve('')
+
+  try {
+    // Ensure SVG has correct XML declaration
+    if (!svgGraph.includes('<?xml'))
+      svgGraph = `<?xml version="1.0" encoding="UTF-8"?>${svgGraph}`
+
+    const blob = new Blob([new TextEncoder().encode(svgGraph)], { type: 'image/svg+xml;charset=utf-8' })
+    return new Promise((resolve, reject) => {
+      const reader = new FileReader()
+      reader.onloadend = () => resolve(reader.result as string)
+      reader.onerror = reject
+      reader.readAsDataURL(blob)
+    })
+  }
+  catch (error) {
+    console.error('Error converting SVG to base64:', error)
+    return Promise.resolve('')
+  }
+}
+
+/**
+ * Processes SVG for theme styling
+ */
+export function processSvgForTheme(
+  svg: string,
+  isDark: boolean,
+  isHandDrawn: boolean,
+  themes: {
+    light: any
+    dark: any
+  },
+): string {
+  let processedSvg = svg
+
+  if (isDark) {
+    processedSvg = processedSvg
+      .replace(/style="fill: ?#000000"/g, 'style="fill: #e2e8f0"')
+      .replace(/style="stroke: ?#000000"/g, 'style="stroke: #94a3b8"')
+      .replace(/<rect [^>]*fill="#ffffff"/g, '<rect $& fill="#1e293b"')
+
+    if (isHandDrawn) {
+      processedSvg = processedSvg
+        .replace(/fill="#[a-fA-F0-9]{6}"/g, `fill="${themes.dark.nodeColors[0].bg}"`)
+        .replace(/stroke="#[a-fA-F0-9]{6}"/g, `stroke="${themes.dark.connectionColor}"`)
+        .replace(/stroke-width="1"/g, 'stroke-width="1.5"')
+    }
+    else {
+      let i = 0
+      themes.dark.nodeColors.forEach(() => {
+        const regex = /fill="#[a-fA-F0-9]{6}"[^>]*class="node-[^"]*"/g
+        processedSvg = processedSvg.replace(regex, (match: string) => {
+          const colorIndex = i % themes.dark.nodeColors.length
+          i++
+          return match.replace(/fill="#[a-fA-F0-9]{6}"/, `fill="${themes.dark.nodeColors[colorIndex].bg}"`)
+        })
+      })
+
+      processedSvg = processedSvg
+        .replace(/<path [^>]*stroke="#[a-fA-F0-9]{6}"/g,
+          `<path stroke="${themes.dark.connectionColor}" stroke-width="1.5"`)
+        .replace(/<(line|polyline) [^>]*stroke="#[a-fA-F0-9]{6}"/g,
+          `<$1 stroke="${themes.dark.connectionColor}" stroke-width="1.5"`)
+    }
+  }
+  else {
+    if (isHandDrawn) {
+      processedSvg = processedSvg
+        .replace(/fill="#[a-fA-F0-9]{6}"/g, `fill="${themes.light.nodeColors[0].bg}"`)
+        .replace(/stroke="#[a-fA-F0-9]{6}"/g, `stroke="${themes.light.connectionColor}"`)
+        .replace(/stroke-width="1"/g, 'stroke-width="1.5"')
+    }
+    else {
+      themes.light.nodeColors.forEach(() => {
+        const regex = /fill="#[a-fA-F0-9]{6}"[^>]*class="node-[^"]*"/g
+        let i = 0
+        processedSvg = processedSvg.replace(regex, (match: string) => {
+          const colorIndex = i % themes.light.nodeColors.length
+          i++
+          return match.replace(/fill="#[a-fA-F0-9]{6}"/, `fill="${themes.light.nodeColors[colorIndex].bg}"`)
+        })
+      })
+
+      processedSvg = processedSvg
+        .replace(/<path [^>]*stroke="#[a-fA-F0-9]{6}"/g,
+          `<path stroke="${themes.light.connectionColor}"`)
+        .replace(/<(line|polyline) [^>]*stroke="#[a-fA-F0-9]{6}"/g,
+          `<$1 stroke="${themes.light.connectionColor}"`)
+    }
+  }
+
+  return processedSvg
+}
+
+/**
+ * Checks if mermaid code is complete and valid
+ */
+export function isMermaidCodeComplete(code: string): boolean {
+  if (!code || code.trim().length === 0)
+    return false
+
+  try {
+    const trimmedCode = code.trim()
+
+    // Special handling for gantt charts
+    if (trimmedCode.startsWith('gantt')) {
+      // For gantt charts, check if it has at least a title and one task
+      const lines = trimmedCode.split('\n').filter(line => line.trim().length > 0)
+      return lines.length >= 3
+    }
+
+    // Check for basic syntax structure
+    const hasValidStart = /^(graph|flowchart|sequenceDiagram|classDiagram|classDef|class|stateDiagram|gantt|pie|er|journey|requirementDiagram)/.test(trimmedCode)
+
+    // Check for balanced brackets and parentheses
+    const isBalanced = (() => {
+      const stack = []
+      const pairs = { '{': '}', '[': ']', '(': ')' }
+
+      for (const char of trimmedCode) {
+        if (char in pairs) {
+          stack.push(char)
+        }
+        else if (Object.values(pairs).includes(char)) {
+          const last = stack.pop()
+          if (pairs[last as keyof typeof pairs] !== char)
+            return false
+        }
+      }
+
+      return stack.length === 0
+    })()
+
+    // Check for common syntax errors
+    const hasNoSyntaxErrors = !trimmedCode.includes('undefined')
+                           && !trimmedCode.includes('[object Object]')
+                           && trimmedCode.split('\n').every(line =>
+                             !(line.includes('-->') && !line.match(/\S+\s*-->\s*\S+/)))
+
+    return hasValidStart && isBalanced && hasNoSyntaxErrors
+  }
+  catch (error) {
+    console.debug('Mermaid code validation error:', error)
+    return false
+  }
+}
+
+/**
+ * Helper to wait for DOM element with retry mechanism
+ */
+export function waitForDOMElement(callback: () => Promise<any>, maxAttempts = 3, delay = 100): Promise<any> {
+  return new Promise((resolve, reject) => {
+    let attempts = 0
+    const tryRender = async () => {
+      try {
+        resolve(await callback())
+      }
+      catch (error) {
+        attempts++
+        if (attempts < maxAttempts)
+          setTimeout(tryRender, delay)
+        else
+          reject(error)
+      }
+    }
+    tryRender()
+  })
+}
diff --git a/app/components/base/message-log-modal/index.tsx b/app/components/base/message-log-modal/index.tsx
new file mode 100644
index 0000000..d5ff818
--- /dev/null
+++ b/app/components/base/message-log-modal/index.tsx
@@ -0,0 +1,71 @@
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useEffect, useRef, useState } from 'react'
+import { useClickAway } from 'ahooks'
+import { RiCloseLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import type { IChatItem } from '@/app/components/base/chat/chat/type'
+import Run from '@/app/components/workflow/run'
+
+type MessageLogModalProps = {
+  currentLogItem?: IChatItem
+  defaultTab?: string
+  width: number
+  fixedWidth?: boolean
+  onCancel: () => void
+}
+const MessageLogModal: FC<MessageLogModalProps> = ({
+  currentLogItem,
+  defaultTab = 'DETAIL',
+  width,
+  fixedWidth,
+  onCancel,
+}) => {
+  const { t } = useTranslation()
+  const ref = useRef(null)
+  const [mounted, setMounted] = useState(false)
+
+  useClickAway(() => {
+    if (mounted)
+      onCancel()
+  }, ref)
+
+  useEffect(() => {
+    setMounted(true)
+  }, [])
+
+  if (!currentLogItem || !currentLogItem.workflow_run_id)
+    return null
+
+  return (
+    <div
+      className={cn('relative z-10 flex flex-col rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg pt-3 shadow-xl')}
+      style={{
+        width: fixedWidth ? width : 480,
+        ...(!fixedWidth
+          ? {
+            position: 'fixed',
+            top: 56 + 8,
+            left: 8 + (width - 480),
+            bottom: 16,
+          }
+          : {
+            marginRight: 8,
+          }),
+      }}
+      ref={ref}
+    >
+      <h1 className='system-xl-semibold shrink-0 px-4 py-1 text-text-primary'>{t('appLog.runDetail.title')}</h1>
+      <span className='absolute right-3 top-4 z-20 cursor-pointer p-1' onClick={onCancel}>
+        <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+      </span>
+      <Run
+        hideResult
+        activeTab={defaultTab as any}
+        runID={currentLogItem.workflow_run_id}
+      />
+    </div>
+  )
+}
+
+export default MessageLogModal
diff --git a/app/components/base/modal-like-wrap/index.tsx b/app/components/base/modal-like-wrap/index.tsx
new file mode 100644
index 0000000..cf18ef1
--- /dev/null
+++ b/app/components/base/modal-like-wrap/index.tsx
@@ -0,0 +1,58 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+import { useTranslation } from 'react-i18next'
+import Button from '../button'
+import { RiCloseLine } from '@remixicon/react'
+
+type Props = {
+  title: string
+  className?: string
+  beforeHeader?: React.ReactNode
+  onClose: () => void
+  hideCloseBtn?: boolean
+  onConfirm: () => void
+  children: React.ReactNode
+}
+
+const ModalLikeWrap: FC<Props> = ({
+  title,
+  className,
+  beforeHeader,
+  children,
+  onClose,
+  hideCloseBtn,
+  onConfirm,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className={cn('w-[320px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg px-3 pb-4 pt-3.5 shadow-xl', className)}>
+      {beforeHeader || null}
+      <div className='mb-1 flex h-6 items-center justify-between'>
+        <div className='system-xl-semibold text-text-primary'>{title}</div>
+        {!hideCloseBtn && (
+          <div
+            className='cursor-pointer p-1.5 text-text-tertiary'
+            onClick={onClose}
+          >
+            <RiCloseLine className='size-4' />
+          </div>
+        )}
+      </div>
+      <div className='mt-2'>{children}</div>
+      <div className='mt-4 flex justify-end'>
+        <Button
+          className='mr-2'
+          onClick={onClose}>{t('common.operation.cancel')}</Button>
+        <Button
+          onClick={onConfirm}
+          variant='primary'
+        >{t('common.operation.save')}</Button>
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(ModalLikeWrap)
diff --git a/app/components/base/modal/index.css b/app/components/base/modal/index.css
new file mode 100644
index 0000000..3787da2
--- /dev/null
+++ b/app/components/base/modal/index.css
@@ -0,0 +1,7 @@
+.modal-dialog {
+  @apply relative z-50;
+}
+
+.modal-panel {
+  @apply w-full max-w-[480px] transform rounded-2xl bg-components-panel-bg p-6 text-left align-middle shadow-xl transition-all;
+}
diff --git a/app/components/base/modal/index.tsx b/app/components/base/modal/index.tsx
new file mode 100644
index 0000000..dd60b00
--- /dev/null
+++ b/app/components/base/modal/index.tsx
@@ -0,0 +1,86 @@
+import { Dialog, DialogPanel, DialogTitle, Transition, TransitionChild } from '@headlessui/react'
+import { Fragment } from 'react'
+import { RiCloseLine } from '@remixicon/react'
+import classNames from '@/utils/classnames'
+import { noop } from 'lodash-es'
+// https://headlessui.com/react/dialog
+
+type IModal = {
+  className?: string
+  wrapperClassName?: string
+  isShow: boolean
+  onClose?: () => void
+  title?: React.ReactNode
+  description?: React.ReactNode
+  children?: React.ReactNode
+  closable?: boolean
+  overflowVisible?: boolean
+}
+
+export default function Modal({
+  className,
+  wrapperClassName,
+  isShow,
+  onClose = noop,
+  title,
+  description,
+  children,
+  closable = false,
+  overflowVisible = false,
+}: IModal) {
+  return (
+    <Transition appear show={isShow} as={Fragment}>
+      <Dialog as="div" className={classNames('relative z-[60]', wrapperClassName)} onClose={onClose}>
+        <TransitionChild>
+          <div className={classNames(
+            'fixed inset-0 bg-background-overlay',
+            'duration-300 ease-in data-[closed]:opacity-0',
+            'data-[enter]:opacity-100',
+            'data-[leave]:opacity-0',
+          )} />
+        </TransitionChild>
+
+        <div
+          className="fixed inset-0 overflow-y-auto"
+          onClick={(e) => {
+            e.preventDefault()
+            e.stopPropagation()
+          }}
+        >
+          <div className="flex min-h-full items-center justify-center p-4 text-center">
+            <TransitionChild>
+              <DialogPanel className={classNames(
+                'w-full max-w-[480px] transform rounded-2xl bg-components-panel-bg p-6 text-left align-middle shadow-xl transition-all',
+                overflowVisible ? 'overflow-visible' : 'overflow-hidden',
+                'duration-100 ease-in data-[closed]:opacity-0 data-[closed]:scale-95',
+                'data-[enter]:opacity-100 data-[enter]:scale-100',
+                'data-[leave]:opacity-0 data-[enter]:scale-95',
+                className,
+              )}>
+                {title && <DialogTitle
+                  as="h3"
+                  className="title-2xl-semi-bold text-text-primary"
+                >
+                  {title}
+                </DialogTitle>}
+                {description && <div className='body-md-regular mt-2 text-text-secondary'>
+                  {description}
+                </div>}
+                {closable
+                  && <div className='absolute right-6 top-6 z-10 flex h-5 w-5 items-center justify-center rounded-2xl hover:cursor-pointer hover:bg-state-base-hover'>
+                    <RiCloseLine className='h-4 w-4 text-text-tertiary' onClick={
+                      (e) => {
+                        e.stopPropagation()
+                        onClose()
+                      }
+                    } />
+                  </div>}
+                {children}
+              </DialogPanel>
+            </TransitionChild>
+          </div>
+        </div>
+      </Dialog>
+    </Transition>
+  )
+}
diff --git a/app/components/base/new-audio-button/index.tsx b/app/components/base/new-audio-button/index.tsx
new file mode 100644
index 0000000..107b53b
--- /dev/null
+++ b/app/components/base/new-audio-button/index.tsx
@@ -0,0 +1,99 @@
+'use client'
+import { useState } from 'react'
+import { useParams, usePathname } from 'next/navigation'
+import {
+  RiVolumeUpLine,
+} from '@remixicon/react'
+import { t } from 'i18next'
+import Tooltip from '@/app/components/base/tooltip'
+import { AudioPlayerManager } from '@/app/components/base/audio-btn/audio.player.manager'
+import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
+
+type AudioBtnProps = {
+  id?: string
+  voice?: string
+  value?: string
+}
+
+type AudioState = 'initial' | 'loading' | 'playing' | 'paused' | 'ended'
+
+const AudioBtn = ({
+  id,
+  voice,
+  value,
+}: AudioBtnProps) => {
+  const [audioState, setAudioState] = useState<AudioState>('initial')
+
+  const params = useParams()
+  const pathname = usePathname()
+  const audio_finished_call = (event: string): any => {
+    switch (event) {
+      case 'ended':
+        setAudioState('ended')
+        break
+      case 'paused':
+        setAudioState('ended')
+        break
+      case 'loaded':
+        setAudioState('loading')
+        break
+      case 'play':
+        setAudioState('playing')
+        break
+      case 'error':
+        setAudioState('ended')
+        break
+    }
+  }
+  let url = ''
+  let isPublic = false
+
+  if (params.token) {
+    url = '/text-to-audio'
+    isPublic = true
+  }
+  else if (params.appId) {
+    if (pathname.search('explore/installed') > -1)
+      url = `/installed-apps/${params.appId}/text-to-audio`
+    else
+      url = `/apps/${params.appId}/text-to-audio`
+  }
+  const handleToggle = async () => {
+    if (audioState === 'playing' || audioState === 'loading') {
+      setTimeout(() => setAudioState('paused'), 1)
+      AudioPlayerManager.getInstance().getAudioPlayer(url, isPublic, id, value, voice, audio_finished_call).pauseAudio()
+    }
+    else {
+      setTimeout(() => setAudioState('loading'), 1)
+      AudioPlayerManager.getInstance().getAudioPlayer(url, isPublic, id, value, voice, audio_finished_call).playAudio()
+    }
+  }
+
+  const tooltipContent = {
+    initial: t('appApi.play'),
+    ended: t('appApi.play'),
+    paused: t('appApi.pause'),
+    playing: t('appApi.playing'),
+    loading: t('appApi.loading'),
+  }[audioState]
+
+  return (
+    <Tooltip
+      popupContent={tooltipContent}
+    >
+      <ActionButton
+        state={
+          audioState === 'loading' || audioState === 'playing'
+            ? ActionButtonState.Active
+            : ActionButtonState.Default
+        }
+        onClick={handleToggle}
+        disabled={audioState === 'loading'}
+      >
+        <RiVolumeUpLine className='h-4 w-4' />
+      </ActionButton>
+    </Tooltip>
+  )
+}
+
+export default AudioBtn
diff --git a/app/components/base/notion-icon/index.tsx b/app/components/base/notion-icon/index.tsx
new file mode 100644
index 0000000..75fea8c
--- /dev/null
+++ b/app/components/base/notion-icon/index.tsx
@@ -0,0 +1,58 @@
+import { RiFileTextLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import type { DataSourceNotionPage } from '@/models/common'
+
+type IconTypes = 'workspace' | 'page'
+type NotionIconProps = {
+  type?: IconTypes
+  name?: string | null
+  className?: string
+  src?: string | null | DataSourceNotionPage['page_icon']
+}
+const NotionIcon = ({
+  type = 'workspace',
+  src,
+  name,
+  className,
+}: NotionIconProps) => {
+  if (type === 'workspace') {
+    if (typeof src === 'string') {
+      if (src.startsWith('https://') || src.startsWith('http://')) {
+        return (
+          <img
+            alt='workspace icon'
+            src={src}
+            className={cn('block h-5 w-5 object-cover', className)}
+          />
+        )
+      }
+      return (
+        <div className={cn('flex h-5 w-5 items-center justify-center', className)}>{src}</div>
+      )
+    }
+    return (
+      <div className={cn('flex h-5 w-5 items-center justify-center rounded bg-gray-200 text-xs font-medium text-gray-500', className)}>{name?.[0].toLocaleUpperCase()}</div>
+    )
+  }
+
+  if (typeof src === 'object' && src !== null) {
+    if (src?.type === 'url') {
+      return (
+        <img
+          alt='page icon'
+          src={src.url || ''}
+          className={cn('block h-5 w-5 object-cover', className)}
+        />
+      )
+    }
+    return (
+      <div className={cn('flex h-5 w-5 items-center justify-center', className)}>{src?.emoji}</div>
+    )
+  }
+
+  return (
+    <RiFileTextLine className={cn('h-5 w-5 text-text-tertiary', className)} />
+  )
+}
+
+export default NotionIcon
diff --git a/app/components/base/notion-page-selector/assets/clear.svg b/app/components/base/notion-page-selector/assets/clear.svg
new file mode 100644
index 0000000..3d1bbf5
--- /dev/null
+++ b/app/components/base/notion-page-selector/assets/clear.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8 2.5C4.96243 2.5 2.5 4.96243 2.5 8C2.5 11.0376 4.96243 13.5 8 13.5C11.0376 13.5 13.5 11.0376 13.5 8C13.5 4.96243 11.0376 2.5 8 2.5ZM9.85355 6.14645C10.0488 6.34171 10.0488 6.65829 9.85355 6.85355L8.70711 8L9.85355 9.14645C10.0488 9.34171 10.0488 9.65829 9.85355 9.85355C9.65829 10.0488 9.34171 10.0488 9.14645 9.85355L8 8.70711L6.85355 9.85355C6.65829 10.0488 6.34171 10.0488 6.14645 9.85355C5.95118 9.65829 5.95118 9.34171 6.14645 9.14645L7.29289 8L6.14645 6.85355C5.95118 6.65829 5.95118 6.34171 6.14645 6.14645C6.34171 5.95118 6.65829 5.95118 6.85355 6.14645L8 7.29289L9.14645 6.14645C9.34171 5.95118 9.65829 5.95118 9.85355 6.14645Z" fill="#98A2B3"/>
+</svg>
diff --git a/app/components/base/notion-page-selector/assets/down-arrow.svg b/app/components/base/notion-page-selector/assets/down-arrow.svg
new file mode 100644
index 0000000..0676e96
--- /dev/null
+++ b/app/components/base/notion-page-selector/assets/down-arrow.svg
@@ -0,0 +1,3 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M3 4.5L6 7.5L9 4.5" stroke="#344054" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/base/notion-page-selector/assets/notion-empty-page.svg b/app/components/base/notion-page-selector/assets/notion-empty-page.svg
new file mode 100644
index 0000000..7493621
--- /dev/null
+++ b/app/components/base/notion-page-selector/assets/notion-empty-page.svg
@@ -0,0 +1,3 @@
+<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.49939 19.1498H13.6897C15.3354 19.1498 16.1891 18.2807 16.1891 16.6273V9.6521C16.1891 8.58313 16.0507 8.09095 15.3816 7.41418L11.3441 3.30749C10.6981 2.65381 10.1675 2.5 9.20618 2.5H5.49939C3.85363 2.5 3 3.36902 3 5.02246V16.6273C3 18.2884 3.85363 19.1498 5.49939 19.1498ZM5.62243 17.6424C4.87646 17.6424 4.50732 17.2502 4.50732 16.5351V5.11475C4.50732 4.40722 4.87646 4.00732 5.62243 4.00732H8.89856V8.22168C8.89856 9.32142 9.44457 9.85205 10.5366 9.85205H14.6818V16.5351C14.6818 17.2502 14.3049 17.6424 13.5589 17.6424H5.62243ZM10.675 8.52929C10.3597 8.52929 10.229 8.39087 10.229 8.07556V4.21496L14.4741 8.52929H10.675Z" fill="#37352F" fill-opacity="0.45"/>
+</svg>
diff --git a/app/components/base/notion-page-selector/assets/notion-page.svg b/app/components/base/notion-page-selector/assets/notion-page.svg
new file mode 100644
index 0000000..237fc2e
--- /dev/null
+++ b/app/components/base/notion-page-selector/assets/notion-page.svg
@@ -0,0 +1,3 @@
+<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.49939 19.1498H13.6897C15.3354 19.1498 16.1891 18.2807 16.1891 16.6273V9.6521C16.1891 8.58313 16.0507 8.09095 15.3816 7.41418L11.3441 3.30749C10.6981 2.65381 10.1675 2.5 9.20618 2.5H5.49939C3.85363 2.5 3 3.36902 3 5.02246V16.6273C3 18.2884 3.85363 19.1498 5.49939 19.1498ZM5.62243 17.6424C4.87645 17.6424 4.50732 17.2502 4.50732 16.5351V5.11475C4.50732 4.40722 4.87645 4.00732 5.62243 4.00732H8.89856V8.22168C8.89856 9.32142 9.44457 9.85205 10.5366 9.85205H14.6818V16.5351C14.6818 17.2502 14.3049 17.6424 13.5589 17.6424H5.62243ZM10.675 8.52929C10.3597 8.52929 10.229 8.39087 10.229 8.07556V4.21496L14.4741 8.52929H10.675ZM12.3362 11.8746H6.70678C6.41454 11.8746 6.2069 12.09 6.2069 12.3591C6.2069 12.636 6.41454 12.8513 6.70678 12.8513H12.3362C12.613 12.8513 12.8207 12.636 12.8207 12.3591C12.8207 12.09 12.613 11.8746 12.3362 11.8746ZM12.3362 14.4587H6.70678C6.41454 14.4587 6.2069 14.674 6.2069 14.9509C6.2069 15.22 6.41454 15.4276 6.70678 15.4276H12.3362C12.613 15.4276 12.8207 15.22 12.8207 14.9509C12.8207 14.674 12.613 14.4587 12.3362 14.4587Z" fill="#37352F" fill-opacity="0.45"/>
+</svg>
diff --git a/app/components/base/notion-page-selector/assets/search.svg b/app/components/base/notion-page-selector/assets/search.svg
new file mode 100644
index 0000000..1d083d0
--- /dev/null
+++ b/app/components/base/notion-page-selector/assets/search.svg
@@ -0,0 +1,5 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Icon">
+<path id="Icon_2" d="M12.25 12.25L10.2084 10.2083M11.6667 6.70833C11.6667 9.44675 9.44675 11.6667 6.70833 11.6667C3.96992 11.6667 1.75 9.44675 1.75 6.70833C1.75 3.96992 3.96992 1.75 6.70833 1.75C9.44675 1.75 11.6667 3.96992 11.6667 6.70833Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+</svg>
diff --git a/app/components/base/notion-page-selector/assets/setting.svg b/app/components/base/notion-page-selector/assets/setting.svg
new file mode 100644
index 0000000..6d3ecf5
--- /dev/null
+++ b/app/components/base/notion-page-selector/assets/setting.svg
@@ -0,0 +1,11 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_5943_4745)">
+<path d="M6.99984 8.74984C7.96634 8.74984 8.74984 7.96634 8.74984 6.99984C8.74984 6.03334 7.96634 5.24984 6.99984 5.24984C6.03334 5.24984 5.24984 6.03334 5.24984 6.99984C5.24984 7.96634 6.03334 8.74984 6.99984 8.74984Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M10.9241 8.59075C10.8535 8.75069 10.8324 8.92812 10.8636 9.10015C10.8948 9.27218 10.9768 9.43092 11.0991 9.5559L11.1309 9.58772C11.2295 9.68622 11.3077 9.80319 11.3611 9.93195C11.4145 10.0607 11.442 10.1987 11.442 10.3381C11.442 10.4775 11.4145 10.6155 11.3611 10.7442C11.3077 10.873 11.2295 10.99 11.1309 11.0885C11.0324 11.1871 10.9154 11.2653 10.7867 11.3187C10.6579 11.3721 10.5199 11.3995 10.3805 11.3995C10.2411 11.3995 10.1031 11.3721 9.97437 11.3187C9.84561 11.2653 9.72864 11.1871 9.63014 11.0885L9.59832 11.0567C9.47334 10.9344 9.3146 10.8524 9.14257 10.8212C8.97055 10.79 8.79312 10.8111 8.63317 10.8817C8.47632 10.9489 8.34256 11.0605 8.24833 11.2028C8.15411 11.345 8.10355 11.5118 8.10287 11.6824V11.7726C8.10287 12.0539 7.99112 12.3236 7.79222 12.5225C7.59332 12.7214 7.32355 12.8332 7.04226 12.8332C6.76097 12.8332 6.4912 12.7214 6.2923 12.5225C6.0934 12.3236 5.98166 12.0539 5.98166 11.7726V11.7248C5.97755 11.5493 5.92073 11.3791 5.81859 11.2363C5.71645 11.0935 5.57371 10.9847 5.40893 10.9241C5.24898 10.8535 5.07155 10.8324 4.89953 10.8636C4.7275 10.8948 4.56876 10.9768 4.44378 11.0991L4.41196 11.1309C4.31346 11.2295 4.19648 11.3077 4.06773 11.3611C3.93897 11.4145 3.80096 11.442 3.66158 11.442C3.5222 11.442 3.38419 11.4145 3.25543 11.3611C3.12668 11.3077 3.0097 11.2295 2.9112 11.1309C2.81259 11.0324 2.73436 10.9154 2.68099 10.7867C2.62761 10.6579 2.60014 10.5199 2.60014 10.3805C2.60014 10.2411 2.62761 10.1031 2.68099 9.97437C2.73436 9.84561 2.81259 9.72864 2.9112 9.63014L2.94302 9.59832C3.06527 9.47334 3.14728 9.3146 3.17848 9.14257C3.20967 8.97055 3.18861 8.79312 3.11802 8.63317C3.0508 8.47632 2.93918 8.34256 2.7969 8.24833C2.65463 8.15411 2.48791 8.10355 2.31726 8.10287H2.22711C1.94582 8.10287 1.67605 7.99112 1.47715 7.79222C1.27825 7.59332 1.1665 7.32355 1.1665 7.04226C1.1665 6.76097 1.27825 6.4912 1.47715 6.2923C1.67605 6.0934 1.94582 5.98166 2.22711 5.98166H2.27484C2.45036 5.97755 2.6206 5.92073 2.7634 5.81859C2.90621 5.71645 3.01499 5.57371 3.07559 5.40893C3.14619 5.24898 3.16724 5.07155 3.13605 4.89953C3.10486 4.7275 3.02285 4.56876 2.90059 4.44378L2.86878 4.41196C2.77017 4.31346 2.69194 4.19648 2.63856 4.06773C2.58519 3.93897 2.55772 3.80096 2.55772 3.66158C2.55772 3.5222 2.58519 3.38419 2.63856 3.25543C2.69194 3.12668 2.77017 3.0097 2.86878 2.9112C2.96728 2.81259 3.08425 2.73436 3.21301 2.68099C3.34176 2.62761 3.47978 2.60014 3.61916 2.60014C3.75854 2.60014 3.89655 2.62761 4.0253 2.68099C4.15406 2.73436 4.27103 2.81259 4.36953 2.9112L4.40135 2.94302C4.52633 3.06527 4.68507 3.14728 4.8571 3.17848C5.02913 3.20967 5.20656 3.18861 5.3665 3.11802H5.40893C5.56578 3.0508 5.69954 2.93918 5.79377 2.7969C5.88799 2.65463 5.93855 2.48791 5.93923 2.31726V2.22711C5.93923 1.94582 6.05097 1.67605 6.24988 1.47715C6.44878 1.27825 6.71855 1.1665 6.99984 1.1665C7.28113 1.1665 7.5509 1.27825 7.7498 1.47715C7.9487 1.67605 8.06044 1.94582 8.06044 2.22711V2.27484C8.06112 2.44548 8.11169 2.6122 8.20591 2.75448C8.30013 2.89675 8.4339 3.00837 8.59075 3.07559C8.75069 3.14619 8.92812 3.16724 9.10015 3.13605C9.27218 3.10486 9.43092 3.02285 9.5559 2.90059L9.58772 2.86878C9.68622 2.77017 9.80319 2.69194 9.93195 2.63856C10.0607 2.58519 10.1987 2.55772 10.3381 2.55772C10.4775 2.55772 10.6155 2.58519 10.7442 2.63856C10.873 2.69194 10.99 2.77017 11.0885 2.86878C11.1871 2.96728 11.2653 3.08425 11.3187 3.21301C11.3721 3.34176 11.3995 3.47978 11.3995 3.61916C11.3995 3.75854 11.3721 3.89655 11.3187 4.0253C11.2653 4.15406 11.1871 4.27103 11.0885 4.36953L11.0567 4.40135C10.9344 4.52633 10.8524 4.68507 10.8212 4.8571C10.79 5.02913 10.8111 5.20656 10.8817 5.3665V5.40893C10.9489 5.56578 11.0605 5.69954 11.2028 5.79377C11.345 5.88799 11.5118 5.93855 11.6824 5.93923H11.7726C12.0539 5.93923 12.3236 6.05097 12.5225 6.24988C12.7214 6.44878 12.8332 6.71855 12.8332 6.99984C12.8332 7.28113 12.7214 7.5509 12.5225 7.7498C12.3236 7.9487 12.0539 8.06044 11.7726 8.06044H11.7248C11.5542 8.06112 11.3875 8.11169 11.2452 8.20591C11.1029 8.30013 10.9913 8.4339 10.9241 8.59075Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_5943_4745">
+<rect width="14" height="14" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/base/notion-page-selector/base.tsx b/app/components/base/notion-page-selector/base.tsx
new file mode 100644
index 0000000..7ee7587
--- /dev/null
+++ b/app/components/base/notion-page-selector/base.tsx
@@ -0,0 +1,136 @@
+import { useCallback, useEffect, useMemo, useState } from 'react'
+import useSWR from 'swr'
+import { RiEqualizer2Line } from '@remixicon/react'
+import WorkspaceSelector from './workspace-selector'
+import SearchInput from './search-input'
+import PageSelector from './page-selector'
+import { preImportNotionPages } from '@/service/datasets'
+import { NotionConnector } from '@/app/components/datasets/create/step-one'
+import type { DataSourceNotionPageMap, DataSourceNotionWorkspace, NotionPage } from '@/models/common'
+import { useModalContext } from '@/context/modal-context'
+
+type NotionPageSelectorProps = {
+  value?: string[]
+  onSelect: (selectedPages: NotionPage[]) => void
+  canPreview?: boolean
+  previewPageId?: string
+  onPreview?: (selectedPage: NotionPage) => void
+  datasetId?: string
+}
+
+const NotionPageSelector = ({
+  value,
+  onSelect,
+  canPreview,
+  previewPageId,
+  onPreview,
+  datasetId = '',
+}: NotionPageSelectorProps) => {
+  const { data, mutate } = useSWR({ url: '/notion/pre-import/pages', datasetId }, preImportNotionPages)
+  const [prevData, setPrevData] = useState(data)
+  const [searchValue, setSearchValue] = useState('')
+  const [currentWorkspaceId, setCurrentWorkspaceId] = useState('')
+  const { setShowAccountSettingModal } = useModalContext()
+
+  const notionWorkspaces = useMemo(() => {
+    return data?.notion_info || []
+  }, [data?.notion_info])
+  const firstWorkspaceId = notionWorkspaces[0]?.workspace_id
+  const currentWorkspace = notionWorkspaces.find(workspace => workspace.workspace_id === currentWorkspaceId)
+
+  const getPagesMapAndSelectedPagesId: [DataSourceNotionPageMap, Set<string>, Set<string>] = useMemo(() => {
+    const selectedPagesId = new Set<string>()
+    const boundPagesId = new Set<string>()
+    const pagesMap = notionWorkspaces.reduce((prev: DataSourceNotionPageMap, next: DataSourceNotionWorkspace) => {
+      next.pages.forEach((page) => {
+        if (page.is_bound) {
+          selectedPagesId.add(page.page_id)
+          boundPagesId.add(page.page_id)
+        }
+        prev[page.page_id] = {
+          ...page,
+          workspace_id: next.workspace_id,
+        }
+      })
+
+      return prev
+    }, {})
+    return [pagesMap, selectedPagesId, boundPagesId]
+  }, [notionWorkspaces])
+  const defaultSelectedPagesId = [...Array.from(getPagesMapAndSelectedPagesId[1]), ...(value || [])]
+  const [selectedPagesId, setSelectedPagesId] = useState<Set<string>>(new Set(defaultSelectedPagesId))
+
+  if (prevData !== data) {
+    setPrevData(data)
+    setSelectedPagesId(new Set(defaultSelectedPagesId))
+  }
+
+  const handleSearchValueChange = useCallback((value: string) => {
+    setSearchValue(value)
+  }, [])
+  const handleSelectWorkspace = useCallback((workspaceId: string) => {
+    setCurrentWorkspaceId(workspaceId)
+  }, [])
+  const handleSelectPages = (newSelectedPagesId: Set<string>) => {
+    const selectedPages = Array.from(newSelectedPagesId).map(pageId => getPagesMapAndSelectedPagesId[0][pageId])
+
+    setSelectedPagesId(new Set(Array.from(newSelectedPagesId)))
+    onSelect(selectedPages)
+  }
+  const handlePreviewPage = (previewPageId: string) => {
+    if (onPreview)
+      onPreview(getPagesMapAndSelectedPagesId[0][previewPageId])
+  }
+
+  useEffect(() => {
+    setCurrentWorkspaceId(firstWorkspaceId)
+  }, [firstWorkspaceId])
+
+  return (
+    <div className='rounded-xl border border-components-panel-border bg-background-default-subtle'>
+      {
+        data?.notion_info?.length
+          ? (
+            <>
+              <div className='flex h-12 items-center gap-x-2 rounded-t-xl border-b border-b-divider-regular bg-components-panel-bg p-2'>
+                <div className='flex grow items-center gap-x-1'>
+                  <WorkspaceSelector
+                    value={currentWorkspaceId || firstWorkspaceId}
+                    items={notionWorkspaces}
+                    onSelect={handleSelectWorkspace}
+                  />
+                  <div className='mx-1 h-3 w-[1px] bg-divider-regular' />
+                  <RiEqualizer2Line
+                    className='h-4 w-4 cursor-pointer text-text-tertiary'
+                    onClick={() => setShowAccountSettingModal({ payload: 'data-source', onCancelCallback: mutate })}
+                  />
+                </div>
+                <SearchInput
+                  value={searchValue}
+                  onChange={handleSearchValueChange}
+                />
+              </div>
+              <div className='overflow-hidden rounded-b-xl'>
+                <PageSelector
+                  value={selectedPagesId}
+                  disabledValue={getPagesMapAndSelectedPagesId[2]}
+                  searchValue={searchValue}
+                  list={currentWorkspace?.pages || []}
+                  pagesMap={getPagesMapAndSelectedPagesId[0]}
+                  onSelect={handleSelectPages}
+                  canPreview={canPreview}
+                  previewPageId={previewPageId}
+                  onPreview={handlePreviewPage}
+                />
+              </div>
+            </>
+          )
+          : (
+            <NotionConnector onSetting={() => setShowAccountSettingModal({ payload: 'data-source', onCancelCallback: mutate })} />
+          )
+      }
+    </div>
+  )
+}
+
+export default NotionPageSelector
diff --git a/app/components/base/notion-page-selector/index.tsx b/app/components/base/notion-page-selector/index.tsx
new file mode 100644
index 0000000..0a44c70
--- /dev/null
+++ b/app/components/base/notion-page-selector/index.tsx
@@ -0,0 +1,2 @@
+export { default as NotionPageSelectorModal } from './notion-page-selector-modal'
+export { default as NotionPageSelector } from './base'
diff --git a/app/components/base/notion-page-selector/notion-page-selector-modal/index.module.css b/app/components/base/notion-page-selector/notion-page-selector-modal/index.module.css
new file mode 100644
index 0000000..cd1f9c7
--- /dev/null
+++ b/app/components/base/notion-page-selector/notion-page-selector-modal/index.module.css
@@ -0,0 +1,28 @@
+.modal {
+  width: 600px !important;
+  max-width: 600px !important;
+  padding: 24px 32px !important;
+}
+
+.operate {
+  padding: 0 8px;
+  min-width: 96px;
+  height: 36px;
+  line-height: 36px;
+  text-align: center;
+  background-color: #ffffff;
+  box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05);
+  border-radius: 8px;
+  border: 0.5px solid #eaecf0;
+  font-size: 14px;
+  font-weight: 500;
+  color: #667085;
+  cursor: pointer;
+}
+
+.operate-save {
+  margin-left: 8px;
+  border-color: #155eef;
+  background-color: #155eef;
+  color: #ffffff;
+}
diff --git a/app/components/base/notion-page-selector/notion-page-selector-modal/index.tsx b/app/components/base/notion-page-selector/notion-page-selector-modal/index.tsx
new file mode 100644
index 0000000..22d2a16
--- /dev/null
+++ b/app/components/base/notion-page-selector/notion-page-selector-modal/index.tsx
@@ -0,0 +1,63 @@
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { XMarkIcon } from '@heroicons/react/24/outline'
+import NotionPageSelector from '../base'
+import s from './index.module.css'
+import type { NotionPage } from '@/models/common'
+import cn from '@/utils/classnames'
+import Modal from '@/app/components/base/modal'
+import { noop } from 'lodash-es'
+
+type NotionPageSelectorModalProps = {
+  isShow: boolean
+  onClose: () => void
+  onSave: (selectedPages: NotionPage[]) => void
+  datasetId: string
+}
+const NotionPageSelectorModal = ({
+  isShow,
+  onClose,
+  onSave,
+  datasetId,
+}: NotionPageSelectorModalProps) => {
+  const { t } = useTranslation()
+  const [selectedPages, setSelectedPages] = useState<NotionPage[]>([])
+
+  const handleClose = () => {
+    onClose()
+  }
+  const handleSelectPage = (newSelectedPages: NotionPage[]) => {
+    setSelectedPages(newSelectedPages)
+  }
+  const handleSave = () => {
+    onSave(selectedPages)
+  }
+
+  return (
+    <Modal
+      className={s.modal}
+      isShow={isShow}
+      onClose={noop}
+    >
+      <div className='mb-6 flex h-8 items-center justify-between'>
+        <div className='text-xl font-semibold text-gray-900'>{t('common.dataSource.notion.selector.addPages')}</div>
+        <div
+          className='-mr-2 flex h-8 w-8 cursor-pointer items-center justify-center'
+          onClick={handleClose}>
+          <XMarkIcon className='h-4 w-4' />
+        </div>
+      </div>
+      <NotionPageSelector
+        onSelect={handleSelectPage}
+        canPreview={false}
+        datasetId={datasetId}
+      />
+      <div className='mt-8 flex justify-end'>
+        <div className={s.operate} onClick={handleClose}>{t('common.operation.cancel')}</div>
+        <div className={cn(s.operate, s['operate-save'])} onClick={handleSave}>{t('common.operation.save')}</div>
+      </div>
+    </Modal>
+  )
+}
+
+export default NotionPageSelectorModal
diff --git a/app/components/base/notion-page-selector/page-selector/index.tsx b/app/components/base/notion-page-selector/page-selector/index.tsx
new file mode 100644
index 0000000..4989559
--- /dev/null
+++ b/app/components/base/notion-page-selector/page-selector/index.tsx
@@ -0,0 +1,320 @@
+import { memo, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { FixedSizeList as List, areEqual } from 'react-window'
+import type { ListChildComponentProps } from 'react-window'
+import { RiArrowDownSLine, RiArrowRightSLine } from '@remixicon/react'
+import Checkbox from '../../checkbox'
+import NotionIcon from '../../notion-icon'
+import cn from '@/utils/classnames'
+import type { DataSourceNotionPage, DataSourceNotionPageMap } from '@/models/common'
+
+type PageSelectorProps = {
+  value: Set<string>
+  disabledValue: Set<string>
+  searchValue: string
+  pagesMap: DataSourceNotionPageMap
+  list: DataSourceNotionPage[]
+  onSelect: (selectedPagesId: Set<string>) => void
+  canPreview?: boolean
+  previewPageId?: string
+  onPreview?: (selectedPageId: string) => void
+}
+type NotionPageTreeItem = {
+  children: Set<string>
+  descendants: Set<string>
+  depth: number
+  ancestors: string[]
+} & DataSourceNotionPage
+type NotionPageTreeMap = Record<string, NotionPageTreeItem>
+type NotionPageItem = {
+  expand: boolean
+  depth: number
+} & DataSourceNotionPage
+
+const recursivePushInParentDescendants = (
+  pagesMap: DataSourceNotionPageMap,
+  listTreeMap: NotionPageTreeMap,
+  current: NotionPageTreeItem,
+  leafItem: NotionPageTreeItem,
+) => {
+  const parentId = current.parent_id
+  const pageId = current.page_id
+
+  if (!parentId || !pageId)
+    return
+
+  if (parentId !== 'root' && pagesMap[parentId]) {
+    if (!listTreeMap[parentId]) {
+      const children = new Set([pageId])
+      const descendants = new Set([pageId, leafItem.page_id])
+      listTreeMap[parentId] = {
+        ...pagesMap[parentId],
+        children,
+        descendants,
+        depth: 0,
+        ancestors: [],
+      }
+    }
+    else {
+      listTreeMap[parentId].children.add(pageId)
+      listTreeMap[parentId].descendants.add(pageId)
+      listTreeMap[parentId].descendants.add(leafItem.page_id)
+    }
+    leafItem.depth++
+    leafItem.ancestors.unshift(listTreeMap[parentId].page_name)
+
+    if (listTreeMap[parentId].parent_id !== 'root')
+      recursivePushInParentDescendants(pagesMap, listTreeMap, listTreeMap[parentId], leafItem)
+  }
+}
+
+const ItemComponent = ({ index, style, data }: ListChildComponentProps<{
+  dataList: NotionPageItem[]
+  handleToggle: (index: number) => void
+  checkedIds: Set<string>
+  disabledCheckedIds: Set<string>
+  handleCheck: (index: number) => void
+  canPreview?: boolean
+  handlePreview: (index: number) => void
+  listMapWithChildrenAndDescendants: NotionPageTreeMap
+  searchValue: string
+  previewPageId: string
+  pagesMap: DataSourceNotionPageMap
+}>) => {
+  const { t } = useTranslation()
+  const { dataList, handleToggle, checkedIds, disabledCheckedIds, handleCheck, canPreview, handlePreview, listMapWithChildrenAndDescendants, searchValue, previewPageId, pagesMap } = data
+  const current = dataList[index]
+  const currentWithChildrenAndDescendants = listMapWithChildrenAndDescendants[current.page_id]
+  const hasChild = currentWithChildrenAndDescendants.descendants.size > 0
+  const ancestors = currentWithChildrenAndDescendants.ancestors
+  const breadCrumbs = ancestors.length ? [...ancestors, current.page_name] : [current.page_name]
+  const disabled = disabledCheckedIds.has(current.page_id)
+
+  const renderArrow = () => {
+    if (hasChild) {
+      return (
+        <div
+          className='mr-1 flex h-5 w-5 shrink-0 items-center justify-center rounded-md hover:bg-components-button-ghost-bg-hover'
+          style={{ marginLeft: current.depth * 8 }}
+          onClick={() => handleToggle(index)}
+        >
+          {
+            current.expand
+              ? <RiArrowDownSLine className='h-4 w-4 text-text-tertiary' />
+              : <RiArrowRightSLine className='h-4 w-4 text-text-tertiary' />
+          }
+        </div>
+      )
+    }
+    if (current.parent_id === 'root' || !pagesMap[current.parent_id]) {
+      return (
+        <div></div>
+      )
+    }
+    return (
+      <div className='mr-1 h-5 w-5 shrink-0' style={{ marginLeft: current.depth * 8 }} />
+    )
+  }
+
+  return (
+    <div
+      className={cn('group flex cursor-pointer items-center rounded-md pl-2 pr-[2px] hover:bg-state-base-hover',
+        previewPageId === current.page_id && 'bg-state-base-hover')}
+      style={{ ...style, top: style.top as number + 8, left: 8, right: 8, width: 'calc(100% - 16px)' }}
+    >
+      <Checkbox
+        className='mr-2 shrink-0'
+        checked={checkedIds.has(current.page_id)}
+        disabled={disabled}
+        onCheck={() => {
+          if (disabled)
+            return
+          handleCheck(index)
+        }}
+      />
+      {!searchValue && renderArrow()}
+      <NotionIcon
+        className='mr-1 shrink-0'
+        type='page'
+        src={current.page_icon}
+      />
+      <div
+        className='grow truncate text-[13px] font-medium leading-4 text-text-secondary'
+        title={current.page_name}
+      >
+        {current.page_name}
+      </div>
+      {
+        canPreview && (
+          <div
+            className='ml-1 hidden h-6 shrink-0 cursor-pointer items-center rounded-md border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-2 text-xs
+            font-medium leading-4 text-components-button-secondary-text shadow-xs shadow-shadow-shadow-3 backdrop-blur-[10px]
+            hover:border-components-button-secondary-border-hover hover:bg-components-button-secondary-bg-hover group-hover:flex'
+            onClick={() => handlePreview(index)}>
+            {t('common.dataSource.notion.selector.preview')}
+          </div>
+        )
+      }
+      {
+        searchValue && (
+          <div
+            className='ml-1 max-w-[120px] shrink-0 truncate text-xs text-text-quaternary'
+            title={breadCrumbs.join(' / ')}
+          >
+            {breadCrumbs.join(' / ')}
+          </div>
+        )
+      }
+    </div>
+  )
+}
+const Item = memo(ItemComponent, areEqual)
+
+const PageSelector = ({
+  value,
+  disabledValue,
+  searchValue,
+  pagesMap,
+  list,
+  onSelect,
+  canPreview = true,
+  previewPageId,
+  onPreview,
+}: PageSelectorProps) => {
+  const { t } = useTranslation()
+  const [prevDataList, setPrevDataList] = useState(list)
+  const [dataList, setDataList] = useState<NotionPageItem[]>([])
+  const [localPreviewPageId, setLocalPreviewPageId] = useState('')
+  if (prevDataList !== list) {
+    setPrevDataList(list)
+    setDataList(list.filter(item => item.parent_id === 'root' || !pagesMap[item.parent_id]).map((item) => {
+      return {
+        ...item,
+        expand: false,
+        depth: 0,
+      }
+    }))
+  }
+  const searchDataList = list.filter((item) => {
+    return item.page_name.includes(searchValue)
+  }).map((item) => {
+    return {
+      ...item,
+      expand: false,
+      depth: 0,
+    }
+  })
+  const currentDataList = searchValue ? searchDataList : dataList
+  const currentPreviewPageId = previewPageId === undefined ? localPreviewPageId : previewPageId
+
+  const listMapWithChildrenAndDescendants = useMemo(() => {
+    return list.reduce((prev: NotionPageTreeMap, next: DataSourceNotionPage) => {
+      const pageId = next.page_id
+      if (!prev[pageId])
+        prev[pageId] = { ...next, children: new Set(), descendants: new Set(), depth: 0, ancestors: [] }
+
+      recursivePushInParentDescendants(pagesMap, prev, prev[pageId], prev[pageId])
+      return prev
+    }, {})
+  }, [list, pagesMap])
+
+  const handleToggle = (index: number) => {
+    const current = dataList[index]
+    const pageId = current.page_id
+    const currentWithChildrenAndDescendants = listMapWithChildrenAndDescendants[pageId]
+    const descendantsIds = Array.from(currentWithChildrenAndDescendants.descendants)
+    const childrenIds = Array.from(currentWithChildrenAndDescendants.children)
+    let newDataList = []
+
+    if (current.expand) {
+      current.expand = false
+
+      newDataList = [...dataList.filter(item => !descendantsIds.includes(item.page_id))]
+    }
+    else {
+      current.expand = true
+
+      newDataList = [
+        ...dataList.slice(0, index + 1),
+        ...childrenIds.map(item => ({
+          ...pagesMap[item],
+          expand: false,
+          depth: listMapWithChildrenAndDescendants[item].depth,
+        })),
+        ...dataList.slice(index + 1)]
+    }
+    setDataList(newDataList)
+  }
+
+  const copyValue = new Set([...value])
+  const handleCheck = (index: number) => {
+    const current = currentDataList[index]
+    const pageId = current.page_id
+    const currentWithChildrenAndDescendants = listMapWithChildrenAndDescendants[pageId]
+
+    if (copyValue.has(pageId)) {
+      if (!searchValue) {
+        for (const item of currentWithChildrenAndDescendants.descendants)
+          copyValue.delete(item)
+      }
+
+      copyValue.delete(pageId)
+    }
+    else {
+      if (!searchValue) {
+        for (const item of currentWithChildrenAndDescendants.descendants)
+          copyValue.add(item)
+      }
+
+      copyValue.add(pageId)
+    }
+
+    onSelect(new Set([...copyValue]))
+  }
+
+  const handlePreview = (index: number) => {
+    const current = currentDataList[index]
+    const pageId = current.page_id
+
+    setLocalPreviewPageId(pageId)
+
+    if (onPreview)
+      onPreview(pageId)
+  }
+
+  if (!currentDataList.length) {
+    return (
+      <div className='flex h-[296px] items-center justify-center text-[13px] text-text-tertiary'>
+        {t('common.dataSource.notion.selector.noSearchResult')}
+      </div>
+    )
+  }
+
+  return (
+    <List
+      className='py-2'
+      height={296}
+      itemCount={currentDataList.length}
+      itemSize={28}
+      width='100%'
+      itemKey={(index, data) => data.dataList[index].page_id}
+      itemData={{
+        dataList: currentDataList,
+        handleToggle,
+        checkedIds: value,
+        disabledCheckedIds: disabledValue,
+        handleCheck,
+        canPreview,
+        handlePreview,
+        listMapWithChildrenAndDescendants,
+        searchValue,
+        previewPageId: currentPreviewPageId,
+        pagesMap,
+      }}
+    >
+      {Item}
+    </List>
+  )
+}
+
+export default PageSelector
diff --git a/app/components/base/notion-page-selector/search-input/index.tsx b/app/components/base/notion-page-selector/search-input/index.tsx
new file mode 100644
index 0000000..6bf819e
--- /dev/null
+++ b/app/components/base/notion-page-selector/search-input/index.tsx
@@ -0,0 +1,42 @@
+import { useCallback } from 'react'
+import type { ChangeEvent } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiCloseCircleFill, RiSearchLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+
+type SearchInputProps = {
+  value: string
+  onChange: (v: string) => void
+}
+const SearchInput = ({
+  value,
+  onChange,
+}: SearchInputProps) => {
+  const { t } = useTranslation()
+
+  const handleClear = useCallback(() => {
+    onChange('')
+  }, [onChange])
+
+  return (
+    <div className={cn('flex h-8 w-[200px] items-center rounded-lg bg-components-input-bg-normal p-2')}>
+      <RiSearchLine className={'mr-0.5 h-4 w-4 shrink-0 text-components-input-text-placeholder'} />
+      <input
+        className='min-w-0 grow appearance-none border-0 bg-transparent px-1 text-[13px] leading-[16px] text-components-input-text-filled outline-0 placeholder:text-components-input-text-placeholder'
+        value={value}
+        onChange={(e: ChangeEvent<HTMLInputElement>) => onChange(e.target.value)}
+        placeholder={t('common.dataSource.notion.selector.searchPages') || ''}
+      />
+      {
+        value && (
+          <RiCloseCircleFill
+            className={'h-4 w-4 shrink-0 cursor-pointer text-components-input-text-placeholder'}
+            onClick={handleClear}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default SearchInput
diff --git a/app/components/base/notion-page-selector/workspace-selector/index.tsx b/app/components/base/notion-page-selector/workspace-selector/index.tsx
new file mode 100644
index 0000000..2e7b57f
--- /dev/null
+++ b/app/components/base/notion-page-selector/workspace-selector/index.tsx
@@ -0,0 +1,80 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { Fragment } from 'react'
+import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react'
+import { RiArrowDownSLine } from '@remixicon/react'
+import NotionIcon from '../../notion-icon'
+import type { DataSourceNotionWorkspace } from '@/models/common'
+
+type WorkspaceSelectorProps = {
+  value: string
+  items: Omit<DataSourceNotionWorkspace, 'total'>[]
+  onSelect: (v: string) => void
+}
+export default function WorkspaceSelector({
+  value,
+  items,
+  onSelect,
+}: WorkspaceSelectorProps) {
+  const { t } = useTranslation()
+  const currentWorkspace = items.find(item => item.workspace_id === value)
+
+  return (
+    <Menu as="div" className="relative inline-block text-left">
+      {
+        ({ open }) => (
+          <>
+            <MenuButton className={`flex h-7 items-center justify-center rounded-md p-1 pr-2 hover:bg-state-base-hover ${open && 'bg-state-base-hover'} cursor-pointer`}>
+              <NotionIcon
+                className='mr-2'
+                src={currentWorkspace?.workspace_icon}
+                name={currentWorkspace?.workspace_name}
+              />
+              <div className='mr-1 w-[90px] truncate text-left text-sm font-medium text-text-secondary' title={currentWorkspace?.workspace_name}>{currentWorkspace?.workspace_name}</div>
+              {/* <div className='mr-1 px-1 h-[18px] bg-primary-50 rounded-lg text-xs font-medium text-text-accent'>{currentWorkspace?.pages.length}</div> */}
+              <RiArrowDownSLine className='h-4 w-4 text-text-secondary' />
+            </MenuButton>
+            <Transition
+              as={Fragment}
+              enter="transition ease-out duration-100"
+              enterFrom="transform opacity-0 scale-95"
+              enterTo="transform opacity-100 scale-100"
+              leave="transition ease-in duration-75"
+              leaveFrom="transform opacity-100 scale-100"
+              leaveTo="transform opacity-0 scale-95"
+            >
+              <MenuItems
+                className='absolute left-0 top-8 z-10 w-80
+                  origin-top-right rounded-lg border-[0.5px]
+                  border-components-panel-border bg-components-panel-bg-blur shadow-lg shadow-shadow-shadow-5 backdrop-blur-[5px]'
+              >
+                <div className="max-h-50 overflow-auto p-1">
+                  {
+                    items.map(item => (
+                      <MenuItem key={item.workspace_id}>
+                        <div
+                          className='flex h-9 cursor-pointer items-center rounded-lg px-3 hover:bg-state-base-hover'
+                          onClick={() => onSelect(item.workspace_id)}
+                        >
+                          <NotionIcon
+                            className='mr-2 shrink-0'
+                            src={item.workspace_icon}
+                            name={item.workspace_name}
+                          />
+                          <div className='system-sm-medium mr-2 grow truncate text-text-secondary' title={item.workspace_name}>{item.workspace_name}</div>
+                          <div className='system-xs-medium shrink-0 text-text-accent'>
+                            {item.pages.length} {t('common.dataSource.notion.selector.pageSelected')}
+                          </div>
+                        </div>
+                      </MenuItem>
+                    ))
+                  }
+                </div>
+              </MenuItems>
+            </Transition>
+          </>
+        )
+      }
+    </Menu>
+  )
+}
diff --git a/app/components/base/pagination/hook.ts b/app/components/base/pagination/hook.ts
new file mode 100644
index 0000000..32a2af8
--- /dev/null
+++ b/app/components/base/pagination/hook.ts
@@ -0,0 +1,95 @@
+import React, { useCallback } from 'react'
+import type { IPaginationProps, IUsePagination } from './type'
+
+const usePagination = ({
+  currentPage,
+  setCurrentPage,
+  truncableText = '...',
+  truncableClassName = '',
+  totalPages,
+  edgePageCount,
+  middlePagesSiblingCount,
+}: IPaginationProps): IUsePagination => {
+  const pages = new Array(totalPages)
+    .fill(0)
+    .map((_, i) => i + 1)
+
+  const hasPreviousPage = currentPage > 1
+  const hasNextPage = currentPage < totalPages
+
+  const isReachedToFirst = currentPage <= middlePagesSiblingCount
+  const isReachedToLast = currentPage + middlePagesSiblingCount >= totalPages
+
+  const middlePages = React.useMemo(() => {
+    const middlePageCount = middlePagesSiblingCount * 2 + 1
+    if (isReachedToFirst)
+      return pages.slice(0, middlePageCount)
+
+    if (isReachedToLast)
+      return pages.slice(-middlePageCount)
+
+    return pages.slice(
+      currentPage - middlePagesSiblingCount,
+      currentPage + middlePagesSiblingCount + 1,
+    )
+  }, [currentPage, isReachedToFirst, isReachedToLast, middlePagesSiblingCount, pages])
+
+  const getAllPreviousPages = useCallback(() => {
+    return pages.slice(0, middlePages[0] - 1)
+  }, [middlePages, pages])
+
+  const previousPages = React.useMemo(() => {
+    if (isReachedToFirst || getAllPreviousPages().length < 1)
+      return []
+
+    return pages
+      .slice(0, edgePageCount)
+      .filter(p => !middlePages.includes(p))
+  }, [edgePageCount, getAllPreviousPages, isReachedToFirst, middlePages, pages])
+
+  const getAllNextPages = React.useMemo(() => {
+    return pages.slice(
+      middlePages[middlePages.length - 1],
+      pages[pages.length],
+    )
+  }, [pages, middlePages])
+
+  const nextPages = React.useMemo(() => {
+    if (isReachedToLast)
+      return []
+
+    if (getAllNextPages.length < 1)
+      return []
+
+    return pages
+      .slice(pages.length - edgePageCount, pages.length)
+      .filter(p => !middlePages.includes(p))
+  }, [edgePageCount, getAllNextPages.length, isReachedToLast, middlePages, pages])
+
+  const isPreviousTruncable = React.useMemo(() => {
+    // Is truncable if first value of middlePage is larger than last value of previousPages
+    return middlePages[0] > previousPages[previousPages.length - 1] + 1
+  }, [previousPages, middlePages])
+
+  const isNextTruncable = React.useMemo(() => {
+    // Is truncable if last value of middlePage is larger than first value of previousPages
+    return middlePages[middlePages.length - 1] + 1 < nextPages[0]
+  }, [nextPages, middlePages])
+
+  return {
+    currentPage,
+    setCurrentPage,
+    truncableText,
+    truncableClassName,
+    pages,
+    hasPreviousPage,
+    hasNextPage,
+    previousPages,
+    isPreviousTruncable,
+    middlePages,
+    isNextTruncable,
+    nextPages,
+  }
+}
+
+export default usePagination
diff --git a/app/components/base/pagination/index.tsx b/app/components/base/pagination/index.tsx
new file mode 100644
index 0000000..8126f66
--- /dev/null
+++ b/app/components/base/pagination/index.tsx
@@ -0,0 +1,167 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowLeftLine, RiArrowRightLine } from '@remixicon/react'
+import { useDebounceFn } from 'ahooks'
+import { Pagination } from './pagination'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import cn from '@/utils/classnames'
+
+export type Props = {
+  className?: string
+  current: number
+  onChange: (cur: number) => void
+  total: number
+  limit?: number
+  onLimitChange?: (limit: number) => void
+}
+
+const CustomizedPagination: FC<Props> = ({
+  className,
+  current,
+  onChange,
+  total,
+  limit = 10,
+  onLimitChange,
+}) => {
+  const { t } = useTranslation()
+  const totalPages = Math.ceil(total / limit)
+  const inputRef = React.useRef<HTMLDivElement>(null)
+  const [showInput, setShowInput] = React.useState(false)
+  const [inputValue, setInputValue] = React.useState<string | number>(current + 1)
+  const [showPerPageTip, setShowPerPageTip] = React.useState(false)
+
+  const { run: handlePaging } = useDebounceFn((value: string) => {
+    if (Number.parseInt(value) > totalPages) {
+      setInputValue(totalPages)
+      onChange(totalPages - 1)
+      setShowInput(false)
+      return
+    }
+    if (Number.parseInt(value) < 1) {
+      setInputValue(1)
+      onChange(0)
+      setShowInput(false)
+      return
+    }
+    onChange(Number.parseInt(value) - 1)
+    setInputValue(Number.parseInt(value))
+    setShowInput(false)
+  }, { wait: 500 })
+
+  const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+    const value = e.target.value
+    if (!value)
+      return setInputValue('')
+    if (isNaN(Number.parseInt(value)))
+      return setInputValue('')
+    setInputValue(Number.parseInt(value))
+    handlePaging(value)
+  }
+
+  return (
+    <Pagination
+      className={cn('flex w-full select-none items-center px-6 py-3', className)}
+      currentPage={current}
+      edgePageCount={2}
+      middlePagesSiblingCount={1}
+      setCurrentPage={onChange}
+      totalPages={totalPages}
+      truncableClassName='flex items-center justify-center w-8 px-1 py-2 system-sm-medium text-text-tertiary'
+      truncableText='...'
+    >
+      <div className='flex items-center gap-0.5 rounded-[10px] bg-background-section-burn p-0.5'>
+        <Pagination.PrevButton
+          as={<div></div>}
+          disabled={current === 0}
+        >
+          <Button
+            variant='secondary'
+            className='h-7 w-7 px-1.5'
+            disabled={current === 0}
+          >
+            <RiArrowLeftLine className='h-4 w-4' />
+          </Button>
+        </Pagination.PrevButton>
+        {!showInput && (
+          <div
+            ref={inputRef}
+            className='flex items-center gap-0.5 rounded-lg px-2 py-1.5 hover:cursor-text hover:bg-state-base-hover-alt'
+            onClick={() => setShowInput(true)}
+          >
+            <div className='system-xs-medium text-text-secondary'>{current + 1}</div>
+            <div className='system-xs-medium text-text-quaternary'>/</div>
+            <div className='system-xs-medium text-text-secondary'>{totalPages}</div>
+          </div>
+        )}
+        {showInput && (
+          <Input
+            styleCss={{
+              height: '28px',
+              width: `${inputRef.current?.clientWidth}px`,
+            }}
+            placeholder=''
+            autoFocus
+            value={inputValue}
+            onChange={handleInputChange}
+            onBlur={() => setShowInput(false)}
+          />
+        )}
+        <Pagination.NextButton
+          as={<div></div>}
+          disabled={current === totalPages - 1}
+        >
+          <Button
+            variant='secondary'
+            className='h-7 w-7 px-1.5'
+            disabled={current === totalPages - 1}
+          >
+            <RiArrowRightLine className='h-4 w-4' />
+          </Button>
+        </Pagination.NextButton>
+      </div>
+      <div className={cn('flex grow list-none items-center justify-center gap-1')}>
+        <Pagination.PageButton
+          className='system-sm-medium flex min-w-8 cursor-pointer items-center justify-center rounded-lg px-1 py-2 hover:bg-components-button-ghost-bg-hover'
+          activeClassName='bg-components-button-tertiary-bg text-components-button-tertiary-text hover:bg-components-button-ghost-bg-hover'
+          inactiveClassName='text-text-tertiary'
+        />
+      </div>
+      {onLimitChange && (
+        <div className='flex shrink-0 items-center gap-2'>
+          <div className='system-2xs-regular-uppercase w-[51px] shrink-0 text-end text-text-tertiary'>{showPerPageTip ? t('common.pagination.perPage') : ''}</div>
+          <div
+            className='flex items-center gap-[1px] rounded-[10px] bg-components-segmented-control-bg-normal p-0.5'
+            onMouseEnter={() => setShowPerPageTip(true)}
+            onMouseLeave={() => setShowPerPageTip(false)}
+          >
+            <div
+              className={cn(
+                'system-sm-medium cursor-pointer rounded-lg border-[0.5px] border-transparent px-2.5 py-1.5 text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
+                limit === 10 && 'border-components-segmented-control-item-active-border bg-components-segmented-control-item-active-bg text-text-secondary shadow-xs hover:bg-components-segmented-control-item-active-bg',
+              )}
+              onClick={() => onLimitChange?.(10)}
+            >10</div>
+            <div
+              className={cn(
+                'system-sm-medium cursor-pointer rounded-lg border-[0.5px] border-transparent px-2.5 py-1.5 text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
+                limit === 25 && 'border-components-segmented-control-item-active-border bg-components-segmented-control-item-active-bg text-text-secondary shadow-xs hover:bg-components-segmented-control-item-active-bg',
+              )}
+              onClick={() => onLimitChange?.(25)}
+            >25</div>
+            <div
+              className={cn(
+                'system-sm-medium cursor-pointer rounded-lg border-[0.5px] border-transparent px-2.5 py-1.5 text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
+                limit === 50 && 'border-components-segmented-control-item-active-border bg-components-segmented-control-item-active-bg text-text-secondary shadow-xs hover:bg-components-segmented-control-item-active-bg',
+              )}
+              onClick={() => onLimitChange?.(50)}
+            >50</div>
+          </div>
+        </div>
+      )}
+    </Pagination>
+  )
+}
+
+export default CustomizedPagination
diff --git a/app/components/base/pagination/pagination.tsx b/app/components/base/pagination/pagination.tsx
new file mode 100644
index 0000000..ec8b035
--- /dev/null
+++ b/app/components/base/pagination/pagination.tsx
@@ -0,0 +1,190 @@
+import React from 'react'
+import clsx from 'clsx'
+import usePagination from './hook'
+import type {
+  ButtonProps,
+  IPagination,
+  IPaginationProps,
+  PageButtonProps,
+} from './type'
+import { noop } from 'lodash-es'
+
+const defaultState: IPagination = {
+  currentPage: 0,
+  setCurrentPage: noop,
+  truncableText: '...',
+  truncableClassName: '',
+  pages: [],
+  hasPreviousPage: false,
+  hasNextPage: false,
+  previousPages: [],
+  isPreviousTruncable: false,
+  middlePages: [],
+  isNextTruncable: false,
+  nextPages: [],
+}
+
+const PaginationContext: React.Context<IPagination> = React.createContext<IPagination>(defaultState)
+
+export const PrevButton = ({
+  className,
+  children,
+  dataTestId,
+  as = <button />,
+  ...buttonProps
+}: ButtonProps) => {
+  const pagination = React.useContext(PaginationContext)
+  const previous = () => {
+    if (pagination.currentPage + 1 > 1)
+      pagination.setCurrentPage(pagination.currentPage - 1)
+  }
+
+  const disabled = pagination.currentPage === 0
+
+  return (
+    <as.type
+      {...buttonProps}
+      {...as.props}
+      className={clsx(className, as.props.className)}
+      onClick={() => previous()}
+      tabIndex={disabled ? '-1' : 0}
+      disabled={disabled}
+      data-testid={dataTestId}
+      onKeyPress={(event: React.KeyboardEvent) => {
+        event.preventDefault()
+        if (event.key === 'Enter' && !disabled)
+          previous()
+      }}
+    >
+      {as.props.children ?? children}
+    </as.type>
+  )
+}
+
+export const NextButton = ({
+  className,
+  children,
+  dataTestId,
+  as = <button />,
+  ...buttonProps
+}: ButtonProps) => {
+  const pagination = React.useContext(PaginationContext)
+  const next = () => {
+    if (pagination.currentPage + 1 < pagination.pages.length)
+      pagination.setCurrentPage(pagination.currentPage + 1)
+  }
+
+  const disabled = pagination.currentPage === pagination.pages.length - 1
+
+  return (
+    <as.type
+      {...buttonProps}
+      {...as.props}
+      className={clsx(className, as.props.className)}
+      onClick={() => next()}
+      tabIndex={disabled ? '-1' : 0}
+      disabled={disabled}
+      data-testid={dataTestId}
+      onKeyPress={(event: React.KeyboardEvent) => {
+        event.preventDefault()
+        if (event.key === 'Enter' && !disabled)
+          next()
+      }}
+    >
+      {as.props.children ?? children}
+    </as.type>
+  )
+}
+
+type ITruncableElementProps = {
+  prev?: boolean
+}
+
+const TruncableElement = ({ prev }: ITruncableElementProps) => {
+  const pagination: IPagination = React.useContext(PaginationContext)
+
+  const {
+    isPreviousTruncable,
+    isNextTruncable,
+    truncableText,
+    truncableClassName,
+  } = pagination
+
+  return ((isPreviousTruncable && prev === true) || (isNextTruncable && !prev))
+    ? (
+      <li className={truncableClassName || undefined}>{truncableText}</li>
+    )
+    : null
+}
+
+export const PageButton = ({
+  as = <a />,
+  className,
+  dataTestIdActive,
+  dataTestIdInactive,
+  activeClassName,
+  inactiveClassName,
+  renderExtraProps,
+}: PageButtonProps) => {
+  const pagination: IPagination = React.useContext(PaginationContext)
+
+  const renderPageButton = (page: number) => (
+    <li key={page}>
+      <as.type
+        data-testid={
+          clsx({
+            [`${dataTestIdActive}`]:
+              dataTestIdActive && pagination.currentPage + 1 === page,
+            [`${dataTestIdInactive}-${page}`]:
+              dataTestIdActive && pagination.currentPage + 1 !== page,
+          }) || undefined
+        }
+        tabIndex={0}
+        onKeyPress={(event: React.KeyboardEvent) => {
+          if (event.key === 'Enter')
+            pagination.setCurrentPage(page - 1)
+        }}
+        onClick={() => pagination.setCurrentPage(page - 1)}
+        className={clsx(
+          className,
+          pagination.currentPage + 1 === page
+            ? activeClassName
+            : inactiveClassName,
+        )}
+        {...as.props}
+        {...(renderExtraProps ? renderExtraProps(page) : {})}
+      >
+        {page}
+      </as.type>
+    </li>
+  )
+
+  return (
+    <>
+      {pagination.previousPages.map(renderPageButton)}
+      <TruncableElement prev />
+      {pagination.middlePages.map(renderPageButton)}
+      <TruncableElement />
+      {pagination.nextPages.map(renderPageButton)}
+    </>
+  )
+}
+
+export const Pagination = ({
+  dataTestId,
+  ...paginationProps
+}: IPaginationProps & { dataTestId?: string }) => {
+  const pagination = usePagination(paginationProps)
+
+  return (
+    <PaginationContext.Provider value={pagination}>
+      <div className={paginationProps.className} data-testid={dataTestId}>
+        {paginationProps.children}
+      </div>
+    </PaginationContext.Provider>
+  )
+}
+
+Pagination.PrevButton = PrevButton
+Pagination.NextButton = NextButton
+Pagination.PageButton = PageButton
diff --git a/app/components/base/pagination/type.ts b/app/components/base/pagination/type.ts
new file mode 100644
index 0000000..c3744c0
--- /dev/null
+++ b/app/components/base/pagination/type.ts
@@ -0,0 +1,58 @@
+import type { ButtonHTMLAttributes } from 'react'
+
+type IBasePaginationProps = {
+  currentPage: number
+  setCurrentPage: (page: number) => void
+  truncableText?: string
+  truncableClassName?: string
+}
+
+type IPaginationProps = IBasePaginationProps & {
+  totalPages: number
+  edgePageCount: number
+  middlePagesSiblingCount: number
+  className?: string
+  children?: React.ReactNode
+}
+
+type IUsePagination = IBasePaginationProps & {
+  pages: number[]
+  hasPreviousPage: boolean
+  hasNextPage: boolean
+  previousPages: number[]
+  isPreviousTruncable: boolean
+  middlePages: number[]
+  isNextTruncable: boolean
+  nextPages: number[]
+}
+
+type IPagination = IUsePagination & {
+  setCurrentPage: (page: number) => void
+}
+
+type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {
+  as?: React.ReactNode
+  children?: string | React.ReactNode
+  className?: string
+  dataTestId?: string
+}
+
+type PageButtonProps = ButtonProps & {
+  /**
+   * Provide a custom ReactNode (e.g. Next/Link)
+   */
+  as?: React.ReactNode
+  activeClassName?: string
+  inactiveClassName?: string
+  dataTestIdActive?: string
+  dataTestIdInactive?: string
+  renderExtraProps?: (pageNum: number) => {}
+}
+
+export type {
+  IPaginationProps,
+  IUsePagination,
+  IPagination,
+  ButtonProps,
+  PageButtonProps,
+}
diff --git a/app/components/base/param-item/index.tsx b/app/components/base/param-item/index.tsx
new file mode 100644
index 0000000..03eb5a7
--- /dev/null
+++ b/app/components/base/param-item/index.tsx
@@ -0,0 +1,79 @@
+'use client'
+import type { FC } from 'react'
+import { InputNumber } from '../input-number'
+import Tooltip from '@/app/components/base/tooltip'
+import Slider from '@/app/components/base/slider'
+import Switch from '@/app/components/base/switch'
+
+type Props = {
+  className?: string
+  id: string
+  name: string
+  noTooltip?: boolean
+  tip?: string
+  value: number
+  enable: boolean
+  step?: number
+  min?: number
+  max: number
+  onChange: (key: string, value: number) => void
+  hasSwitch?: boolean
+  onSwitchChange?: (key: string, enable: boolean) => void
+}
+
+const ParamItem: FC<Props> = ({ className, id, name, noTooltip, tip, step = 0.1, min = 0, max, value, enable, onChange, hasSwitch, onSwitchChange }) => {
+  return (
+    <div className={className}>
+      <div className="flex items-center justify-between">
+        <div className="flex h-6 items-center">
+          {hasSwitch && (
+            <Switch
+              size='md'
+              className='mr-2'
+              defaultValue={enable}
+              onChange={async (val) => {
+                onSwitchChange?.(id, val)
+              }}
+            />
+          )}
+          <span className="system-sm-semibold mr-1 text-text-secondary">{name}</span>
+          {!noTooltip && (
+            <Tooltip
+              triggerClassName='w-4 h-4 shrink-0'
+              popupContent={<div className="w-[200px]">{tip}</div>}
+            />
+          )}
+        </div>
+      </div>
+      <div className="mt-1 flex items-center">
+        <div className="mr-3 flex shrink-0 items-center">
+          <InputNumber
+            disabled={!enable}
+            type="number"
+            min={min}
+            max={max}
+            step={step}
+            amount={step}
+            size='regular'
+            value={value}
+            onChange={(value) => {
+              onChange(id, value)
+            }}
+            className='w-[72px]'
+          />
+        </div>
+        <div className="flex grow items-center">
+          <Slider
+            className='w-full'
+            disabled={!enable}
+            value={max < 5 ? value * 100 : value}
+            min={min < 1 ? min * 100 : min}
+            max={max < 5 ? max * 100 : max}
+            onChange={value => onChange(id, value / (max < 5 ? 100 : 1))}
+          />
+        </div>
+      </div>
+    </div>
+  )
+}
+export default ParamItem
diff --git a/app/components/base/param-item/score-threshold-item.tsx b/app/components/base/param-item/score-threshold-item.tsx
new file mode 100644
index 0000000..b5557c8
--- /dev/null
+++ b/app/components/base/param-item/score-threshold-item.tsx
@@ -0,0 +1,54 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import ParamItem from '.'
+
+type Props = {
+  className?: string
+  value: number
+  onChange: (key: string, value: number) => void
+  enable: boolean
+  hasSwitch?: boolean
+  onSwitchChange?: (key: string, enable: boolean) => void
+}
+
+const VALUE_LIMIT = {
+  default: 0.7,
+  step: 0.01,
+  min: 0,
+  max: 1,
+}
+
+const key = 'score_threshold'
+const ScoreThresholdItem: FC<Props> = ({
+  className,
+  value,
+  enable,
+  onChange,
+  hasSwitch,
+  onSwitchChange,
+}) => {
+  const { t } = useTranslation()
+  const handleParamChange = (key: string, value: number) => {
+    let notOutRangeValue = Number.parseFloat(value.toFixed(2))
+    notOutRangeValue = Math.max(VALUE_LIMIT.min, notOutRangeValue)
+    notOutRangeValue = Math.min(VALUE_LIMIT.max, notOutRangeValue)
+    onChange(key, notOutRangeValue)
+  }
+  return (
+    <ParamItem
+      className={className}
+      id={key}
+      name={t(`appDebug.datasetConfig.${key}`)}
+      tip={t(`appDebug.datasetConfig.${key}Tip`) as string}
+      {...VALUE_LIMIT}
+      value={value}
+      enable={enable}
+      onChange={handleParamChange}
+      hasSwitch={hasSwitch}
+      onSwitchChange={onSwitchChange}
+    />
+  )
+}
+export default React.memo(ScoreThresholdItem)
diff --git a/app/components/base/param-item/top-k-item.tsx b/app/components/base/param-item/top-k-item.tsx
new file mode 100644
index 0000000..4c4c857
--- /dev/null
+++ b/app/components/base/param-item/top-k-item.tsx
@@ -0,0 +1,54 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import ParamItem from '.'
+
+type Props = {
+  className?: string
+  value: number
+  onChange: (key: string, value: number) => void
+  enable: boolean
+}
+
+const maxTopK = (() => {
+  const configValue = Number.parseInt(globalThis.document?.body?.getAttribute('data-public-top-k-max-value') || '', 10)
+  if (configValue && !isNaN(configValue))
+    return configValue
+  return 10
+})()
+const VALUE_LIMIT = {
+  default: 2,
+  step: 1,
+  min: 1,
+  max: maxTopK,
+}
+
+const key = 'top_k'
+const TopKItem: FC<Props> = ({
+  className,
+  value,
+  enable,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const handleParamChange = (key: string, value: number) => {
+    let notOutRangeValue = Number.parseFloat(value.toFixed(2))
+    notOutRangeValue = Math.max(VALUE_LIMIT.min, notOutRangeValue)
+    notOutRangeValue = Math.min(VALUE_LIMIT.max, notOutRangeValue)
+    onChange(key, notOutRangeValue)
+  }
+  return (
+    <ParamItem
+      className={className}
+      id={key}
+      name={t(`appDebug.datasetConfig.${key}`)}
+      tip={t(`appDebug.datasetConfig.${key}Tip`) as string}
+      {...VALUE_LIMIT}
+      value={value}
+      enable={enable}
+      onChange={handleParamChange}
+    />
+  )
+}
+export default React.memo(TopKItem)
diff --git a/app/components/base/popover/index.tsx b/app/components/base/popover/index.tsx
new file mode 100644
index 0000000..2a831e0
--- /dev/null
+++ b/app/components/base/popover/index.tsx
@@ -0,0 +1,120 @@
+import { Popover, PopoverButton, PopoverPanel, Transition } from '@headlessui/react'
+import { Fragment, cloneElement, useRef } from 'react'
+import cn from '@/utils/classnames'
+
+export type HtmlContentProps = {
+  onClose?: () => void
+  onClick?: () => void
+}
+
+type IPopover = {
+  className?: string
+  htmlContent: React.ReactNode
+  popupClassName?: string
+  trigger?: 'click' | 'hover'
+  position?: 'bottom' | 'br' | 'bl'
+  btnElement?: string | React.ReactNode
+  btnClassName?: string | ((open: boolean) => string)
+  manualClose?: boolean
+  disabled?: boolean
+}
+
+const timeoutDuration = 100
+
+export default function CustomPopover({
+  trigger = 'hover',
+  position = 'bottom',
+  htmlContent,
+  popupClassName,
+  btnElement,
+  className,
+  btnClassName,
+  manualClose,
+  disabled = false,
+}: IPopover) {
+  const buttonRef = useRef<HTMLButtonElement>(null)
+  const timeOutRef = useRef<number | null>(null)
+
+  const onMouseEnter = (isOpen: boolean) => {
+    timeOutRef.current && window.clearTimeout(timeOutRef.current)
+    !isOpen && buttonRef.current?.click()
+  }
+
+  const onMouseLeave = (isOpen: boolean) => {
+    timeOutRef.current = window.setTimeout(() => {
+      isOpen && buttonRef.current?.click()
+    }, timeoutDuration)
+  }
+
+  return (
+    <Popover className="relative">
+      {({ open }: { open: boolean }) => {
+        return (
+          <>
+            <div
+              {...(trigger !== 'hover'
+                ? {}
+                : {
+                  onMouseLeave: () => onMouseLeave(open),
+                  onMouseEnter: () => onMouseEnter(open),
+                })}
+            >
+              <PopoverButton
+                ref={buttonRef}
+                disabled={disabled}
+                className={cn(
+                  'group inline-flex items-center rounded-lg border border-components-button-secondary-border bg-components-button-secondary-bg px-3 py-2 text-base font-medium hover:border-components-button-secondary-border-hover hover:bg-components-button-secondary-bg-hover focus:outline-none',
+                  open && 'border-components-button-secondary-border bg-components-button-secondary-bg-hover',
+                  (btnClassName && typeof btnClassName === 'string') && btnClassName,
+                  (btnClassName && typeof btnClassName !== 'string') && btnClassName?.(open),
+                )}
+              >
+                {btnElement}
+              </PopoverButton>
+              <Transition as={Fragment}>
+                <PopoverPanel
+                  className={cn(
+                    'absolute z-10 mt-1 w-full max-w-sm px-4 sm:px-0 lg:max-w-3xl',
+                    position === 'bottom' && 'left-1/2 -translate-x-1/2',
+                    position === 'bl' && 'left-0',
+                    position === 'br' && 'right-0',
+                    className,
+                  )}
+                  {...(trigger !== 'hover'
+                    ? {}
+                    : {
+                      onMouseLeave: () => onMouseLeave(open),
+                      onMouseEnter: () => onMouseEnter(open),
+                    })
+                  }
+                >
+                  {({ close }) => (
+                    <div
+                      className={cn('w-fit min-w-[130px] overflow-hidden rounded-lg bg-components-panel-bg shadow-lg ring-1 ring-black/5', popupClassName)}
+                      {...(trigger !== 'hover'
+                        ? {}
+                        : {
+                          onMouseLeave: () => onMouseLeave(open),
+                          onMouseEnter: () => onMouseEnter(open),
+                        })
+                      }
+                    >
+                      {cloneElement(htmlContent as React.ReactElement, {
+                        onClose: () => onMouseLeave(open),
+                        ...(manualClose
+                          ? {
+                            onClick: close,
+                          }
+                          : {}),
+                      })}
+                    </div>
+                  )}
+                </PopoverPanel>
+              </Transition>
+            </div>
+          </>
+        )
+      }}
+    </Popover>
+  )
+}
diff --git a/app/components/base/portal-to-follow-elem/index.spec.tsx b/app/components/base/portal-to-follow-elem/index.spec.tsx
new file mode 100644
index 0000000..74790d7
--- /dev/null
+++ b/app/components/base/portal-to-follow-elem/index.spec.tsx
@@ -0,0 +1,121 @@
+import React from 'react'
+import { cleanup, fireEvent, render } from '@testing-library/react'
+import '@testing-library/jest-dom'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '.'
+
+afterEach(cleanup)
+
+describe('PortalToFollowElem', () => {
+  describe('Context and Provider', () => {
+    test('should throw error when using context outside provider', () => {
+      // Suppress console.error for this test
+      const originalError = console.error
+      console.error = jest.fn()
+
+      expect(() => {
+        render(
+          <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>,
+        )
+      }).toThrow('PortalToFollowElem components must be wrapped in <PortalToFollowElem />')
+
+      console.error = originalError
+    })
+
+    test('should not throw when used within provider', () => {
+      expect(() => {
+        render(
+          <PortalToFollowElem>
+            <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>
+          </PortalToFollowElem>,
+        )
+      }).not.toThrow()
+    })
+  })
+
+  describe('PortalToFollowElemTrigger', () => {
+    test('should render children correctly', () => {
+      const { getByText } = render(
+        <PortalToFollowElem>
+          <PortalToFollowElemTrigger>Trigger Text </PortalToFollowElemTrigger>
+        </PortalToFollowElem>,
+      )
+      expect(getByText('Trigger Text')).toBeInTheDocument()
+    })
+
+    test('should handle asChild prop correctly', () => {
+      const { getByRole } = render(
+        <PortalToFollowElem>
+          <PortalToFollowElemTrigger asChild >
+            <button>Button Trigger </button>
+          </PortalToFollowElemTrigger>
+        </PortalToFollowElem>,
+      )
+
+      expect(getByRole('button')).toHaveTextContent('Button Trigger')
+    })
+  })
+
+  describe('PortalToFollowElemContent', () => {
+    test('should not render content when closed', () => {
+      const { queryByText } = render(
+        <PortalToFollowElem open={false} >
+          <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>
+          <PortalToFollowElemContent > Popup Content </PortalToFollowElemContent>
+        </PortalToFollowElem>,
+      )
+
+      expect(queryByText('Popup Content')).not.toBeInTheDocument()
+    })
+
+    test('should render content when open', () => {
+      const { getByText } = render(
+        <PortalToFollowElem open={true} >
+          <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>
+          <PortalToFollowElemContent > Popup Content </PortalToFollowElemContent>
+        </PortalToFollowElem>,
+      )
+
+      expect(getByText('Popup Content')).toBeInTheDocument()
+    })
+  })
+
+  describe('Controlled behavior', () => {
+    test('should call onOpenChange when interaction happens', () => {
+      const handleOpenChange = jest.fn()
+
+      const { getByText } = render(
+        <PortalToFollowElem onOpenChange={handleOpenChange} >
+          <PortalToFollowElemTrigger>Hover Me </PortalToFollowElemTrigger>
+          <PortalToFollowElemContent > Content </PortalToFollowElemContent>
+        </PortalToFollowElem>,
+      )
+
+      fireEvent.mouseEnter(getByText('Hover Me'))
+      expect(handleOpenChange).toHaveBeenCalled()
+
+      fireEvent.mouseLeave(getByText('Hover Me'))
+      expect(handleOpenChange).toHaveBeenCalled()
+    })
+  })
+
+  describe('Configuration options', () => {
+    test('should accept placement prop', () => {
+      // Since we can't easily test actual positioning, we'll check if the prop is passed correctly
+      const useFloatingMock = jest.spyOn(require('@floating-ui/react'), 'useFloating')
+
+      render(
+        <PortalToFollowElem placement="top-start" >
+          <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>
+        </PortalToFollowElem>,
+      )
+
+      expect(useFloatingMock).toHaveBeenCalledWith(
+        expect.objectContaining({
+          placement: 'top-start',
+        }),
+      )
+
+      useFloatingMock.mockRestore()
+    })
+  })
+})
diff --git a/app/components/base/portal-to-follow-elem/index.tsx b/app/components/base/portal-to-follow-elem/index.tsx
new file mode 100644
index 0000000..1e2e198
--- /dev/null
+++ b/app/components/base/portal-to-follow-elem/index.tsx
@@ -0,0 +1,187 @@
+'use client'
+import React from 'react'
+import {
+  FloatingPortal,
+  autoUpdate,
+  flip,
+  offset,
+  shift,
+  size,
+  useDismiss,
+  useFloating,
+  useFocus,
+  useHover,
+  useInteractions,
+  useMergeRefs,
+  useRole,
+} from '@floating-ui/react'
+
+import type { OffsetOptions, Placement } from '@floating-ui/react'
+import cn from '@/utils/classnames'
+export type PortalToFollowElemOptions = {
+  /*
+  * top, bottom, left, right
+  * start, end. Default is middle
+  * combine: top-start, top-end
+  */
+  placement?: Placement
+  open?: boolean
+  offset?: number | OffsetOptions
+  onOpenChange?: (open: boolean) => void
+  triggerPopupSameWidth?: boolean
+}
+
+export function usePortalToFollowElem({
+  placement = 'bottom',
+  open,
+  offset: offsetValue = 0,
+  onOpenChange: setControlledOpen,
+  triggerPopupSameWidth,
+}: PortalToFollowElemOptions = {}) {
+  const setOpen = setControlledOpen
+
+  const data = useFloating({
+    placement,
+    open,
+    onOpenChange: setOpen,
+    whileElementsMounted: autoUpdate,
+    middleware: [
+      offset(offsetValue),
+      flip({
+        crossAxis: placement.includes('-'),
+        fallbackAxisSideDirection: 'start',
+        padding: 5,
+      }),
+      shift({ padding: 5 }),
+      size({
+        apply({ rects, elements }) {
+          if (triggerPopupSameWidth)
+            elements.floating.style.width = `${rects.reference.width}px`
+        },
+      }),
+    ],
+  })
+
+  const context = data.context
+
+  const hover = useHover(context, {
+    move: false,
+    enabled: open == null,
+  })
+  const focus = useFocus(context, {
+    enabled: open == null,
+  })
+  const dismiss = useDismiss(context)
+  const role = useRole(context, { role: 'tooltip' })
+
+  const interactions = useInteractions([hover, focus, dismiss, role])
+
+  return React.useMemo(
+    () => ({
+      open,
+      setOpen,
+      ...interactions,
+      ...data,
+    }),
+    [open, setOpen, interactions, data],
+  )
+}
+
+type ContextType = ReturnType<typeof usePortalToFollowElem> | null
+
+const PortalToFollowElemContext = React.createContext<ContextType>(null)
+
+export function usePortalToFollowElemContext() {
+  const context = React.useContext(PortalToFollowElemContext)
+
+  if (context == null)
+    throw new Error('PortalToFollowElem components must be wrapped in <PortalToFollowElem />')
+
+  return context
+}
+
+export function PortalToFollowElem({
+  children,
+  ...options
+}: { children: React.ReactNode } & PortalToFollowElemOptions) {
+  // This can accept any props as options, e.g. `placement`,
+  // or other positioning options.
+  const tooltip = usePortalToFollowElem(options)
+  return (
+    <PortalToFollowElemContext.Provider value={tooltip}>
+      {children}
+    </PortalToFollowElemContext.Provider>
+  )
+}
+
+export const PortalToFollowElemTrigger = (
+  {
+    ref: propRef,
+    children,
+    asChild = false,
+    ...props
+  }: React.HTMLProps<HTMLElement> & { ref?: React.RefObject<HTMLElement>, asChild?: boolean },
+) => {
+  const context = usePortalToFollowElemContext()
+  const childrenRef = (children as any).props?.ref
+  const ref = useMergeRefs([context.refs.setReference, propRef, childrenRef])
+
+  // `asChild` allows the user to pass any element as the anchor
+  if (asChild && React.isValidElement(children)) {
+    return React.cloneElement(
+      children,
+      context.getReferenceProps({
+        ref,
+        ...props,
+        ...children.props,
+        'data-state': context.open ? 'open' : 'closed',
+      }),
+    )
+  }
+
+  return (
+    <div
+      ref={ref}
+      className={cn('inline-block', props.className)}
+      // The user can style the trigger based on the state
+      data-state={context.open ? 'open' : 'closed'}
+      {...context.getReferenceProps(props)}
+    >
+      {children}
+    </div>
+  )
+}
+PortalToFollowElemTrigger.displayName = 'PortalToFollowElemTrigger'
+
+export const PortalToFollowElemContent = (
+  {
+    ref: propRef,
+    style,
+    ...props
+  }: React.HTMLProps<HTMLDivElement> & {
+    ref?: React.RefObject<HTMLDivElement>;
+  },
+) => {
+  const context = usePortalToFollowElemContext()
+  const ref = useMergeRefs([context.refs.setFloating, propRef])
+
+  if (!context.open)
+    return null
+
+  const body = document.body
+
+  return (
+    <FloatingPortal root={body}>
+      <div
+        ref={ref}
+        style={{
+          ...context.floatingStyles,
+          ...style,
+        }}
+        {...context.getFloatingProps(props)}
+      />
+    </FloatingPortal>
+  )
+}
+
+PortalToFollowElemContent.displayName = 'PortalToFollowElemContent'
diff --git a/app/components/base/premium-badge/index.css b/app/components/base/premium-badge/index.css
new file mode 100644
index 0000000..61031cd
--- /dev/null
+++ b/app/components/base/premium-badge/index.css
@@ -0,0 +1,56 @@
+@tailwind components;
+
+@layer components {
+  .premium-badge {
+    @apply shrink-0 relative inline-flex justify-center items-center rounded-md box-border border border-transparent text-white shadow-xs hover:shadow-lg bg-origin-border overflow-hidden transition-all duration-100 ease-out;
+    background-clip: padding-box, border-box;
+  }
+  .allowHover {
+    @apply cursor-pointer;
+  }
+
+  /* m is for the regular button */
+  .premium-badge-m {
+    @apply !p-1 h-6 w-auto
+  }
+
+  .premium-badge-s {
+    @apply border-[0.5px] !px-1 !py-[3px] h-[18px] w-auto
+  }
+
+  .premium-badge-blue {
+    @apply bg-util-colors-blue-blue-200;
+    background-image: linear-gradient(90deg, #5289ffe6 0%, #155aefe6 100%), linear-gradient(135deg, var(--color-premium-badge-border-highlight-color) 0%, #155aef 100%);
+  }
+  .premium-badge-blue.allowHover:hover {
+    @apply bg-util-colors-blue-blue-300;
+    background-image: linear-gradient(90deg, #296dffe6 0%, #004aebe6 100%), linear-gradient(135deg, var(--color-premium-badge-border-highlight-color) 0%, #00329e 100%);
+  }
+
+  .premium-badge-indigo {
+    @apply bg-util-colors-indigo-indigo-200;
+    background-image: linear-gradient(90deg, #8098f9e6 0%, #444ce7e6 100%), linear-gradient(135deg, var(--color-premium-badge-border-highlight-color) 0%, #6172f3 100%);
+  }
+  .premium-badge-indigo.allowHover:hover {
+    @apply bg-util-colors-indigo-indigo-300;
+    background-image: linear-gradient(90deg, #6172f3e6 0%, #2d31a6e6 100%), linear-gradient(135deg, var(--color-premium-badge-border-highlight-color) 0%, #2d31a6 100%);
+  }
+
+  .premium-badge-gray {
+    @apply bg-util-colors-gray-gray-200;
+    background-image: linear-gradient(90deg, #98a2b2e6 0%, #676f83e6 100%), linear-gradient(135deg, var(--color-premium-badge-border-highlight-color) 0%, #676f83 100%);
+  }
+  .premium-badge-gray.allowHover:hover {
+    @apply bg-util-colors-gray-gray-300;
+    background-image: linear-gradient(90deg, #676f83e6 0%, #354052e6 100%), linear-gradient(135deg, var(--color-premium-badge-border-highlight-color) 0%, #354052 100%);
+  }
+
+  .premium-badge-orange {
+    @apply bg-util-colors-orange-orange-200;
+    background-image: linear-gradient(90deg, #ff692ee6 0%, #e04f16e6 100%), linear-gradient(135deg, var(--color-premium-badge-border-highlight-color) 0%, #e62e05 100%);
+  }
+  .premium-badge-orange.allowHover:hover {
+    @apply bg-util-colors-orange-orange-300;
+    background-image: linear-gradient(90deg, #ff4405e6 0%, #b93815e6 100%), linear-gradient(135deg, var(--color-premium-badge-border-highlight-color) 0%, #e62e05 100%);
+  }
+}
diff --git a/app/components/base/premium-badge/index.tsx b/app/components/base/premium-badge/index.tsx
new file mode 100644
index 0000000..ce162d7
--- /dev/null
+++ b/app/components/base/premium-badge/index.tsx
@@ -0,0 +1,74 @@
+import type { CSSProperties, ReactNode } from 'react'
+import React from 'react'
+import { type VariantProps, cva } from 'class-variance-authority'
+import { Highlight } from '@/app/components/base/icons/src/public/common'
+import classNames from '@/utils/classnames'
+import './index.css'
+
+const PremiumBadgeVariants = cva(
+  'premium-badge',
+  {
+    variants: {
+      size: {
+        s: 'premium-badge-s',
+        m: 'premium-badge-m',
+      },
+      color: {
+        blue: 'premium-badge-blue',
+        indigo: 'premium-badge-indigo',
+        gray: 'premium-badge-gray',
+        orange: 'premium-badge-orange',
+      },
+      allowHover: {
+        true: 'allowHover',
+        false: '',
+      },
+    },
+    defaultVariants: {
+      size: 'm',
+      color: 'blue',
+      allowHover: false,
+    },
+  },
+)
+
+type PremiumBadgeProps = {
+  size?: 's' | 'm'
+  color?: 'blue' | 'indigo' | 'gray' | 'orange'
+  allowHover?: boolean
+  styleCss?: CSSProperties
+  children?: ReactNode
+} & React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof PremiumBadgeVariants>
+
+const PremiumBadge: React.FC<PremiumBadgeProps> = ({
+  className,
+  size,
+  color,
+  allowHover,
+  styleCss,
+  children,
+  ...props
+}) => {
+  return (
+    <div
+      className={classNames(
+        PremiumBadgeVariants({ size, color, allowHover, className }),
+        'relative text-nowrap',
+      )}
+      style={styleCss}
+      {...props}
+    >
+      {children}
+      <Highlight
+        className={classNames(
+          'absolute top-0 opacity-50 right-1/2 translate-x-[20%] transition-all duration-100 ease-out hover:opacity-80 hover:translate-x-[30%]',
+          size === 's' ? 'h-[18px] w-12' : 'h-6 w-12',
+        )}
+      />
+    </div>
+  )
+}
+PremiumBadge.displayName = 'PremiumBadge'
+
+export default PremiumBadge
+export { PremiumBadge, PremiumBadgeVariants }
diff --git a/app/components/base/progress-bar/index.tsx b/app/components/base/progress-bar/index.tsx
new file mode 100644
index 0000000..759c9ea
--- /dev/null
+++ b/app/components/base/progress-bar/index.tsx
@@ -0,0 +1,20 @@
+type ProgressBarProps = {
+  percent: number
+}
+const ProgressBar = ({
+  percent = 0,
+}: ProgressBarProps) => {
+  return (
+    <div className='flex items-center'>
+      <div className='mr-2 w-[100px] rounded-lg bg-gray-100'>
+        <div
+          className='h-1 rounded-lg bg-[#2970FF]'
+          style={{ width: `${percent}%` }}
+        />
+      </div>
+      <div className='text-xs font-medium text-gray-500'>{percent}%</div>
+    </div>
+  )
+}
+
+export default ProgressBar
diff --git a/app/components/base/progress-bar/progress-circle.tsx b/app/components/base/progress-bar/progress-circle.tsx
new file mode 100644
index 0000000..b9b280e
--- /dev/null
+++ b/app/components/base/progress-bar/progress-circle.tsx
@@ -0,0 +1,64 @@
+import { memo } from 'react'
+import cn from '@/utils/classnames'
+
+type ProgressCircleProps = {
+  className?: string
+  percentage?: number
+  size?: number
+  circleStrokeWidth?: number
+  circleStrokeColor?: string
+  circleFillColor?: string
+  sectorFillColor?: string
+}
+
+const ProgressCircle: React.FC<ProgressCircleProps> = ({
+  className,
+  percentage = 0,
+  size = 12,
+  circleStrokeWidth = 1,
+  circleStrokeColor = 'stroke-components-progress-brand-border',
+  circleFillColor = 'fill-components-progress-brand-bg',
+  sectorFillColor = 'fill-components-progress-brand-progress',
+}) => {
+  const radius = size / 2
+  const center = size / 2
+  const angle = (percentage / 101) * 360
+  const radians = (angle * Math.PI) / 180
+  const x = center + radius * Math.cos(radians - Math.PI / 2)
+  const y = center + radius * Math.sin(radians - Math.PI / 2)
+  const largeArcFlag = percentage > 50 ? 1 : 0
+
+  const pathData = `
+    M ${center},${center}
+    L ${center},${center - radius}
+    A ${radius},${radius} 0 ${largeArcFlag} 1 ${x},${y}
+    Z
+  `
+
+  return (
+    <svg
+      width={size + circleStrokeWidth}
+      height={size + circleStrokeWidth}
+      viewBox={`0 0 ${size + circleStrokeWidth} ${size + circleStrokeWidth}`}
+      className={className}
+    >
+      <circle
+        className={cn(
+          circleFillColor,
+          circleStrokeColor,
+        )}
+        cx={center + circleStrokeWidth / 2}
+        cy={center + circleStrokeWidth / 2}
+        r={radius}
+        strokeWidth={circleStrokeWidth}
+      />
+      <path
+        className={cn(sectorFillColor)}
+        d={pathData}
+        transform={`translate(${circleStrokeWidth / 2}, ${circleStrokeWidth / 2})`}
+      />
+    </svg>
+  )
+}
+
+export default memo(ProgressCircle)
diff --git a/app/components/base/prompt-editor/constants.tsx b/app/components/base/prompt-editor/constants.tsx
new file mode 100644
index 0000000..31fbc0a
--- /dev/null
+++ b/app/components/base/prompt-editor/constants.tsx
@@ -0,0 +1,58 @@
+import { SupportUploadFileTypes, type ValueSelector } from '../../workflow/types'
+
+export const CONTEXT_PLACEHOLDER_TEXT = '{{#context#}}'
+export const HISTORY_PLACEHOLDER_TEXT = '{{#histories#}}'
+export const QUERY_PLACEHOLDER_TEXT = '{{#query#}}'
+export const PRE_PROMPT_PLACEHOLDER_TEXT = '{{#pre_prompt#}}'
+export const UPDATE_DATASETS_EVENT_EMITTER = 'prompt-editor-context-block-update-datasets'
+export const UPDATE_HISTORY_EVENT_EMITTER = 'prompt-editor-history-block-update-role'
+
+export const checkHasContextBlock = (text: string) => {
+  if (!text)
+    return false
+  return text.includes(CONTEXT_PLACEHOLDER_TEXT)
+}
+
+export const checkHasHistoryBlock = (text: string) => {
+  if (!text)
+    return false
+  return text.includes(HISTORY_PLACEHOLDER_TEXT)
+}
+
+export const checkHasQueryBlock = (text: string) => {
+  if (!text)
+    return false
+  return text.includes(QUERY_PLACEHOLDER_TEXT)
+}
+
+/*
+* {{#1711617514996.name#}} => [1711617514996, name]
+* {{#1711617514996.sys.query#}} => [sys, query]
+*/
+export const getInputVars = (text: string): ValueSelector[] => {
+  if (!text)
+    return []
+
+  const allVars = text.match(/{{#([^#]*)#}}/g)
+  if (allVars && allVars?.length > 0) {
+    // {{#context#}}, {{#query#}} is not input vars
+    const inputVars = allVars
+      .filter(item => item.includes('.'))
+      .map((item) => {
+        const valueSelector = item.replace('{{#', '').replace('#}}', '').split('.')
+        if (valueSelector[1] === 'sys' && /^\d+$/.test(valueSelector[0]))
+          return valueSelector.slice(1)
+
+        return valueSelector
+      })
+    return inputVars
+  }
+  return []
+}
+
+export const FILE_EXTS: Record<string, string[]> = {
+  [SupportUploadFileTypes.image]: ['JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'],
+  [SupportUploadFileTypes.document]: ['TXT', 'MD', 'MDX', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOC', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'],
+  [SupportUploadFileTypes.audio]: ['MP3', 'M4A', 'WAV', 'AMR', 'MPGA'],
+  [SupportUploadFileTypes.video]: ['MP4', 'MOV', 'MPEG', 'WEBM'],
+}
diff --git a/app/components/base/prompt-editor/hooks.ts b/app/components/base/prompt-editor/hooks.ts
new file mode 100644
index 0000000..c9e4cc1
--- /dev/null
+++ b/app/components/base/prompt-editor/hooks.ts
@@ -0,0 +1,185 @@
+import {
+  useCallback,
+  useEffect,
+  useRef,
+  useState,
+} from 'react'
+import type { Dispatch, RefObject, SetStateAction } from 'react'
+import type {
+  Klass,
+  LexicalCommand,
+  LexicalEditor,
+  TextNode,
+} from 'lexical'
+import {
+  $getNodeByKey,
+  $getSelection,
+  $isDecoratorNode,
+  $isNodeSelection,
+  COMMAND_PRIORITY_LOW,
+  KEY_BACKSPACE_COMMAND,
+  KEY_DELETE_COMMAND,
+} from 'lexical'
+import type { EntityMatch } from '@lexical/text'
+import {
+  mergeRegister,
+} from '@lexical/utils'
+import { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import { $isContextBlockNode } from './plugins/context-block/node'
+import { DELETE_CONTEXT_BLOCK_COMMAND } from './plugins/context-block'
+import { $isHistoryBlockNode } from './plugins/history-block/node'
+import { DELETE_HISTORY_BLOCK_COMMAND } from './plugins/history-block'
+import { $isQueryBlockNode } from './plugins/query-block/node'
+import { DELETE_QUERY_BLOCK_COMMAND } from './plugins/query-block'
+import type { CustomTextNode } from './plugins/custom-text/node'
+import { registerLexicalTextEntity } from './utils'
+
+export type UseSelectOrDeleteHandler = (nodeKey: string, command?: LexicalCommand<undefined>) => [RefObject<HTMLDivElement>, boolean]
+export const useSelectOrDelete: UseSelectOrDeleteHandler = (nodeKey: string, command?: LexicalCommand<undefined>) => {
+  const ref = useRef<HTMLDivElement>(null)
+  const [editor] = useLexicalComposerContext()
+  const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey)
+
+  const handleDelete = useCallback(
+    (event: KeyboardEvent) => {
+      const selection = $getSelection()
+      const nodes = selection?.getNodes()
+      if (
+        !isSelected
+        && nodes?.length === 1
+        && (
+          ($isContextBlockNode(nodes[0]) && command === DELETE_CONTEXT_BLOCK_COMMAND)
+          || ($isHistoryBlockNode(nodes[0]) && command === DELETE_HISTORY_BLOCK_COMMAND)
+          || ($isQueryBlockNode(nodes[0]) && command === DELETE_QUERY_BLOCK_COMMAND)
+        )
+      )
+        editor.dispatchCommand(command, undefined)
+
+      if (isSelected && $isNodeSelection(selection)) {
+        event.preventDefault()
+        const node = $getNodeByKey(nodeKey)
+        if ($isDecoratorNode(node)) {
+          if (command)
+            editor.dispatchCommand(command, undefined)
+
+          node.remove()
+          return true
+        }
+      }
+
+      return false
+    },
+    [isSelected, nodeKey, command, editor],
+  )
+
+  const handleSelect = useCallback((e: MouseEvent) => {
+    e.stopPropagation()
+    clearSelection()
+    setSelected(true)
+  }, [setSelected, clearSelection])
+
+  useEffect(() => {
+    const ele = ref.current
+
+    if (ele)
+      ele.addEventListener('click', handleSelect)
+
+    return () => {
+      if (ele)
+        ele.removeEventListener('click', handleSelect)
+    }
+  }, [handleSelect])
+  useEffect(() => {
+    return mergeRegister(
+      editor.registerCommand(
+        KEY_DELETE_COMMAND,
+        handleDelete,
+        COMMAND_PRIORITY_LOW,
+      ),
+      editor.registerCommand(
+        KEY_BACKSPACE_COMMAND,
+        handleDelete,
+        COMMAND_PRIORITY_LOW,
+      ),
+    )
+  }, [editor, clearSelection, handleDelete])
+
+  return [ref, isSelected]
+}
+
+export type UseTriggerHandler = () => [RefObject<HTMLDivElement>, boolean, Dispatch<SetStateAction<boolean>>]
+export const useTrigger: UseTriggerHandler = () => {
+  const triggerRef = useRef<HTMLDivElement>(null)
+  const [open, setOpen] = useState(false)
+  const handleOpen = useCallback((e: MouseEvent) => {
+    e.stopPropagation()
+    setOpen(v => !v)
+  }, [])
+
+  useEffect(() => {
+    const trigger = triggerRef.current
+    if (trigger)
+      trigger.addEventListener('click', handleOpen)
+
+    return () => {
+      if (trigger)
+        trigger.removeEventListener('click', handleOpen)
+    }
+  }, [handleOpen])
+
+  return [triggerRef, open, setOpen]
+}
+
+export function useLexicalTextEntity<T extends TextNode>(
+  getMatch: (text: string) => null | EntityMatch,
+  targetNode: Klass<T>,
+  createNode: (textNode: CustomTextNode) => T,
+) {
+  const [editor] = useLexicalComposerContext()
+
+  useEffect(() => {
+    return mergeRegister(...registerLexicalTextEntity(editor, getMatch, targetNode, createNode))
+  }, [createNode, editor, getMatch, targetNode])
+}
+
+export type MenuTextMatch = {
+  leadOffset: number
+  matchingString: string
+  replaceableString: string
+}
+export type TriggerFn = (
+  text: string,
+  editor: LexicalEditor,
+) => MenuTextMatch | null
+export const PUNCTUATION = '\\.,\\+\\*\\?\\$\\@\\|#{}\\(\\)\\^\\-\\[\\]\\\\/!%\'"~=<>_:;'
+export function useBasicTypeaheadTriggerMatch(
+  trigger: string,
+  { minLength = 1, maxLength = 75 }: { minLength?: number; maxLength?: number },
+): TriggerFn {
+  return useCallback(
+    (text: string) => {
+      const validChars = `[${PUNCTUATION}\\s]`
+      const TypeaheadTriggerRegex = new RegExp(
+        '(.*)('
+          + `[${trigger}]`
+          + `((?:${validChars}){0,${maxLength}})`
+          + ')$',
+      )
+      const match = TypeaheadTriggerRegex.exec(text)
+      if (match !== null) {
+        const maybeLeadingWhitespace = match[1]
+        const matchingString = match[3]
+        if (matchingString.length >= minLength) {
+          return {
+            leadOffset: match.index + maybeLeadingWhitespace.length,
+            matchingString,
+            replaceableString: match[2],
+          }
+        }
+      }
+      return null
+    },
+    [maxLength, minLength, trigger],
+  )
+}
diff --git a/app/components/base/prompt-editor/index.tsx b/app/components/base/prompt-editor/index.tsx
new file mode 100644
index 0000000..94a65e4
--- /dev/null
+++ b/app/components/base/prompt-editor/index.tsx
@@ -0,0 +1,226 @@
+'use client'
+
+import type { FC } from 'react'
+import { useEffect } from 'react'
+import type {
+  EditorState,
+} from 'lexical'
+import {
+  $getRoot,
+  TextNode,
+} from 'lexical'
+import { CodeNode } from '@lexical/code'
+import { LexicalComposer } from '@lexical/react/LexicalComposer'
+import { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin'
+import { ContentEditable } from '@lexical/react/LexicalContentEditable'
+import { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary'
+import { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin'
+import { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin'
+// import TreeView from './plugins/tree-view'
+import Placeholder from './plugins/placeholder'
+import ComponentPickerBlock from './plugins/component-picker-block'
+import {
+  ContextBlock,
+  ContextBlockNode,
+  ContextBlockReplacementBlock,
+} from './plugins/context-block'
+import {
+  QueryBlock,
+  QueryBlockNode,
+  QueryBlockReplacementBlock,
+} from './plugins/query-block'
+import {
+  HistoryBlock,
+  HistoryBlockNode,
+  HistoryBlockReplacementBlock,
+} from './plugins/history-block'
+import {
+  WorkflowVariableBlock,
+  WorkflowVariableBlockNode,
+  WorkflowVariableBlockReplacementBlock,
+} from './plugins/workflow-variable-block'
+import VariableBlock from './plugins/variable-block'
+import VariableValueBlock from './plugins/variable-value-block'
+import { VariableValueBlockNode } from './plugins/variable-value-block/node'
+import { CustomTextNode } from './plugins/custom-text/node'
+import OnBlurBlock from './plugins/on-blur-or-focus-block'
+import UpdateBlock from './plugins/update-block'
+import { textToEditorState } from './utils'
+import type {
+  ContextBlockType,
+  ExternalToolBlockType,
+  HistoryBlockType,
+  QueryBlockType,
+  VariableBlockType,
+  WorkflowVariableBlockType,
+} from './types'
+import {
+  UPDATE_DATASETS_EVENT_EMITTER,
+  UPDATE_HISTORY_EVENT_EMITTER,
+} from './constants'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import cn from '@/utils/classnames'
+
+export type PromptEditorProps = {
+  instanceId?: string
+  compact?: boolean
+  className?: string
+  placeholder?: string
+  placeholderClassName?: string
+  style?: React.CSSProperties
+  value?: string
+  editable?: boolean
+  onChange?: (text: string) => void
+  onBlur?: () => void
+  onFocus?: () => void
+  contextBlock?: ContextBlockType
+  queryBlock?: QueryBlockType
+  historyBlock?: HistoryBlockType
+  variableBlock?: VariableBlockType
+  externalToolBlock?: ExternalToolBlockType
+  workflowVariableBlock?: WorkflowVariableBlockType
+  isSupportFileVar?: boolean
+}
+
+const PromptEditor: FC<PromptEditorProps> = ({
+  instanceId,
+  compact,
+  className,
+  placeholder,
+  placeholderClassName,
+  style,
+  value,
+  editable = true,
+  onChange,
+  onBlur,
+  onFocus,
+  contextBlock,
+  queryBlock,
+  historyBlock,
+  variableBlock,
+  externalToolBlock,
+  workflowVariableBlock,
+  isSupportFileVar,
+}) => {
+  const { eventEmitter } = useEventEmitterContextContext()
+  const initialConfig = {
+    namespace: 'prompt-editor',
+    nodes: [
+      CodeNode,
+      CustomTextNode,
+      {
+        replace: TextNode,
+        with: (node: TextNode) => new CustomTextNode(node.__text),
+      },
+      ContextBlockNode,
+      HistoryBlockNode,
+      QueryBlockNode,
+      WorkflowVariableBlockNode,
+      VariableValueBlockNode,
+    ],
+    editorState: textToEditorState(value || ''),
+    onError: (error: Error) => {
+      throw error
+    },
+  }
+
+  const handleEditorChange = (editorState: EditorState) => {
+    const text = editorState.read(() => {
+      return $getRoot().getChildren().map(p => p.getTextContent()).join('\n')
+    })
+    if (onChange)
+      onChange(text)
+  }
+
+  useEffect(() => {
+    eventEmitter?.emit({
+      type: UPDATE_DATASETS_EVENT_EMITTER,
+      payload: contextBlock?.datasets,
+    } as any)
+  }, [eventEmitter, contextBlock?.datasets])
+  useEffect(() => {
+    eventEmitter?.emit({
+      type: UPDATE_HISTORY_EVENT_EMITTER,
+      payload: historyBlock?.history,
+    } as any)
+  }, [eventEmitter, historyBlock?.history])
+
+  return (
+    <LexicalComposer initialConfig={{ ...initialConfig, editable }}>
+      <div className='relative min-h-5'>
+        <RichTextPlugin
+          contentEditable={<ContentEditable className={`${className} outline-none ${compact ? 'text-[13px] leading-5' : 'text-sm leading-6'} text-text-secondary`} style={style || {}} />}
+          placeholder={<Placeholder value={placeholder} className={cn('truncate', placeholderClassName)} compact={compact} />}
+          ErrorBoundary={LexicalErrorBoundary}
+        />
+        <ComponentPickerBlock
+          triggerString='/'
+          contextBlock={contextBlock}
+          historyBlock={historyBlock}
+          queryBlock={queryBlock}
+          variableBlock={variableBlock}
+          externalToolBlock={externalToolBlock}
+          workflowVariableBlock={workflowVariableBlock}
+          isSupportFileVar={isSupportFileVar}
+        />
+        <ComponentPickerBlock
+          triggerString='{'
+          contextBlock={contextBlock}
+          historyBlock={historyBlock}
+          queryBlock={queryBlock}
+          variableBlock={variableBlock}
+          externalToolBlock={externalToolBlock}
+          workflowVariableBlock={workflowVariableBlock}
+          isSupportFileVar={isSupportFileVar}
+        />
+        {
+          contextBlock?.show && (
+            <>
+              <ContextBlock {...contextBlock} />
+              <ContextBlockReplacementBlock {...contextBlock} />
+            </>
+          )
+        }
+        {
+          queryBlock?.show && (
+            <>
+              <QueryBlock {...queryBlock} />
+              <QueryBlockReplacementBlock />
+            </>
+          )
+        }
+        {
+          historyBlock?.show && (
+            <>
+              <HistoryBlock {...historyBlock} />
+              <HistoryBlockReplacementBlock {...historyBlock} />
+            </>
+          )
+        }
+        {
+          (variableBlock?.show || externalToolBlock?.show) && (
+            <>
+              <VariableBlock />
+              <VariableValueBlock />
+            </>
+          )
+        }
+        {
+          workflowVariableBlock?.show && (
+            <>
+              <WorkflowVariableBlock {...workflowVariableBlock} />
+              <WorkflowVariableBlockReplacementBlock {...workflowVariableBlock} />
+            </>
+          )
+        }
+        <OnChangePlugin onChange={handleEditorChange} />
+        <OnBlurBlock onBlur={onBlur} onFocus={onFocus} />
+        <UpdateBlock instanceId={instanceId} />
+        <HistoryPlugin />
+        {/* <TreeView /> */}
+      </div>
+    </LexicalComposer>
+  )
+}
+
+export default PromptEditor
diff --git a/app/components/base/prompt-editor/plugins/component-picker-block/hooks.tsx b/app/components/base/prompt-editor/plugins/component-picker-block/hooks.tsx
new file mode 100644
index 0000000..7332a0d
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/component-picker-block/hooks.tsx
@@ -0,0 +1,288 @@
+import { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { $insertNodes } from 'lexical'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import type {
+  ContextBlockType,
+  ExternalToolBlockType,
+  HistoryBlockType,
+  QueryBlockType,
+  VariableBlockType,
+  WorkflowVariableBlockType,
+} from '../../types'
+import { INSERT_CONTEXT_BLOCK_COMMAND } from '../context-block'
+import { INSERT_HISTORY_BLOCK_COMMAND } from '../history-block'
+import { INSERT_QUERY_BLOCK_COMMAND } from '../query-block'
+import { INSERT_VARIABLE_VALUE_BLOCK_COMMAND } from '../variable-block'
+import { $createCustomTextNode } from '../custom-text/node'
+import { PromptMenuItem } from './prompt-option'
+import { VariableMenuItem } from './variable-option'
+import { PickerBlockMenuOption } from './menu'
+import { File05 } from '@/app/components/base/icons/src/vender/solid/files'
+import {
+  MessageClockCircle,
+  Tool03,
+} from '@/app/components/base/icons/src/vender/solid/general'
+import { BracketsX } from '@/app/components/base/icons/src/vender/line/development'
+import { UserEdit02 } from '@/app/components/base/icons/src/vender/solid/users'
+import { ArrowUpRight } from '@/app/components/base/icons/src/vender/line/arrows'
+import AppIcon from '@/app/components/base/app-icon'
+
+export const usePromptOptions = (
+  contextBlock?: ContextBlockType,
+  queryBlock?: QueryBlockType,
+  historyBlock?: HistoryBlockType,
+) => {
+  const { t } = useTranslation()
+  const [editor] = useLexicalComposerContext()
+
+  const promptOptions: PickerBlockMenuOption[] = []
+  if (contextBlock?.show) {
+    promptOptions.push(new PickerBlockMenuOption({
+      key: t('common.promptEditor.context.item.title'),
+      group: 'prompt context',
+      render: ({ isSelected, onSelect, onSetHighlight }) => {
+        return <PromptMenuItem
+          title={t('common.promptEditor.context.item.title')}
+          icon={<File05 className='h-4 w-4 text-[#6938EF]' />}
+          disabled={!contextBlock.selectable}
+          isSelected={isSelected}
+          onClick={onSelect}
+          onMouseEnter={onSetHighlight}
+        />
+      },
+      onSelect: () => {
+        if (!contextBlock?.selectable)
+          return
+        editor.dispatchCommand(INSERT_CONTEXT_BLOCK_COMMAND, undefined)
+      },
+    }))
+  }
+
+  if (queryBlock?.show) {
+    promptOptions.push(
+      new PickerBlockMenuOption({
+        key: t('common.promptEditor.query.item.title'),
+        group: 'prompt query',
+        render: ({ isSelected, onSelect, onSetHighlight }) => {
+          return (
+            <PromptMenuItem
+              title={t('common.promptEditor.query.item.title')}
+              icon={<UserEdit02 className='h-4 w-4 text-[#FD853A]' />}
+              disabled={!queryBlock.selectable}
+              isSelected={isSelected}
+              onClick={onSelect}
+              onMouseEnter={onSetHighlight}
+            />
+          )
+        },
+        onSelect: () => {
+          if (!queryBlock?.selectable)
+            return
+          editor.dispatchCommand(INSERT_QUERY_BLOCK_COMMAND, undefined)
+        },
+      }),
+    )
+  }
+
+  if (historyBlock?.show) {
+    promptOptions.push(
+      new PickerBlockMenuOption({
+        key: t('common.promptEditor.history.item.title'),
+        group: 'prompt history',
+        render: ({ isSelected, onSelect, onSetHighlight }) => {
+          return (
+            <PromptMenuItem
+              title={t('common.promptEditor.history.item.title')}
+              icon={<MessageClockCircle className='h-4 w-4 text-[#DD2590]' />}
+              disabled={!historyBlock.selectable
+              }
+              isSelected={isSelected}
+              onClick={onSelect}
+              onMouseEnter={onSetHighlight}
+            />
+          )
+        },
+        onSelect: () => {
+          if (!historyBlock?.selectable)
+            return
+          editor.dispatchCommand(INSERT_HISTORY_BLOCK_COMMAND, undefined)
+        },
+      }),
+    )
+  }
+  return promptOptions
+}
+
+export const useVariableOptions = (
+  variableBlock?: VariableBlockType,
+  queryString?: string,
+): PickerBlockMenuOption[] => {
+  const { t } = useTranslation()
+  const [editor] = useLexicalComposerContext()
+
+  const options = useMemo(() => {
+    if (!variableBlock?.variables)
+      return []
+
+    const baseOptions = (variableBlock.variables).map((item) => {
+      return new PickerBlockMenuOption({
+        key: item.value,
+        group: 'prompt variable',
+        render: ({ queryString, isSelected, onSelect, onSetHighlight }) => {
+          return (
+            <VariableMenuItem
+              title={item.value}
+              icon={<BracketsX className='h-[14px] w-[14px] text-text-accent' />}
+              queryString={queryString}
+              isSelected={isSelected}
+              onClick={onSelect}
+              onMouseEnter={onSetHighlight}
+            />
+          )
+        },
+        onSelect: () => {
+          editor.dispatchCommand(INSERT_VARIABLE_VALUE_BLOCK_COMMAND, `{{${item.value}}}`)
+        },
+      })
+    })
+    if (!queryString)
+      return baseOptions
+
+    const regex = new RegExp(queryString, 'i')
+
+    return baseOptions.filter(option => regex.test(option.key))
+  }, [editor, queryString, variableBlock])
+
+  const addOption = useMemo(() => {
+    return new PickerBlockMenuOption({
+      key: t('common.promptEditor.variable.modal.add'),
+      group: 'prompt variable',
+      render: ({ queryString, isSelected, onSelect, onSetHighlight }) => {
+        return (
+          <VariableMenuItem
+            title={t('common.promptEditor.variable.modal.add')}
+            icon={<BracketsX className='h-[14px] w-[14px] text-text-accent' />}
+            queryString={queryString}
+            isSelected={isSelected}
+            onClick={onSelect}
+            onMouseEnter={onSetHighlight}
+          />
+        )
+      },
+      onSelect: () => {
+        editor.update(() => {
+          const prefixNode = $createCustomTextNode('{{')
+          const suffixNode = $createCustomTextNode('}}')
+          $insertNodes([prefixNode, suffixNode])
+          prefixNode.select()
+        })
+      },
+    })
+  }, [editor, t])
+
+  return useMemo(() => {
+    return variableBlock?.show ? [...options, addOption] : []
+  }, [options, addOption, variableBlock?.show])
+}
+
+export const useExternalToolOptions = (
+  externalToolBlockType?: ExternalToolBlockType,
+  queryString?: string,
+) => {
+  const { t } = useTranslation()
+  const [editor] = useLexicalComposerContext()
+
+  const options = useMemo(() => {
+    if (!externalToolBlockType?.externalTools)
+      return []
+    const baseToolOptions = (externalToolBlockType.externalTools).map((item) => {
+      return new PickerBlockMenuOption({
+        key: item.name,
+        group: 'external tool',
+        render: ({ queryString, isSelected, onSelect, onSetHighlight }) => {
+          return (
+            <VariableMenuItem
+              title={item.name}
+              icon={
+                <AppIcon
+                  className='!h-[14px] !w-[14px]'
+                  icon={item.icon}
+                  background={item.icon_background}
+                />
+              }
+              extraElement={<div className='text-xs text-text-tertiary'>{item.variableName}</div>}
+              queryString={queryString}
+              isSelected={isSelected}
+              onClick={onSelect}
+              onMouseEnter={onSetHighlight}
+            />
+          )
+        },
+        onSelect: () => {
+          editor.dispatchCommand(INSERT_VARIABLE_VALUE_BLOCK_COMMAND, `{{${item.variableName}}}`)
+        },
+      })
+    })
+    if (!queryString)
+      return baseToolOptions
+
+    const regex = new RegExp(queryString, 'i')
+
+    return baseToolOptions.filter(option => regex.test(option.key))
+  }, [editor, queryString, externalToolBlockType])
+
+  const addOption = useMemo(() => {
+    return new PickerBlockMenuOption({
+      key: t('common.promptEditor.variable.modal.addTool'),
+      group: 'external tool',
+      render: ({ queryString, isSelected, onSelect, onSetHighlight }) => {
+        return (
+          <VariableMenuItem
+            title={t('common.promptEditor.variable.modal.addTool')}
+            icon={<Tool03 className='h-[14px] w-[14px] text-text-accent' />}
+            extraElement={< ArrowUpRight className='h-3 w-3 text-text-tertiary' />}
+            queryString={queryString}
+            isSelected={isSelected}
+            onClick={onSelect}
+            onMouseEnter={onSetHighlight}
+          />
+        )
+      },
+      onSelect: () => {
+        externalToolBlockType?.onAddExternalTool?.()
+      },
+    })
+  }, [externalToolBlockType, t])
+
+  return useMemo(() => {
+    return externalToolBlockType?.show ? [...options, addOption] : []
+  }, [options, addOption, externalToolBlockType?.show])
+}
+
+export const useOptions = (
+  contextBlock?: ContextBlockType,
+  queryBlock?: QueryBlockType,
+  historyBlock?: HistoryBlockType,
+  variableBlock?: VariableBlockType,
+  externalToolBlockType?: ExternalToolBlockType,
+  workflowVariableBlockType?: WorkflowVariableBlockType,
+  queryString?: string,
+) => {
+  const promptOptions = usePromptOptions(contextBlock, queryBlock, historyBlock)
+  const variableOptions = useVariableOptions(variableBlock, queryString)
+  const externalToolOptions = useExternalToolOptions(externalToolBlockType, queryString)
+  const workflowVariableOptions = useMemo(() => {
+    if (!workflowVariableBlockType?.show)
+      return []
+
+    return workflowVariableBlockType.variables || []
+  }, [workflowVariableBlockType])
+
+  return useMemo(() => {
+    return {
+      workflowVariableOptions,
+      allFlattenOptions: [...promptOptions, ...variableOptions, ...externalToolOptions],
+    }
+  }, [promptOptions, variableOptions, externalToolOptions, workflowVariableOptions])
+}
diff --git a/app/components/base/prompt-editor/plugins/component-picker-block/index.tsx b/app/components/base/prompt-editor/plugins/component-picker-block/index.tsx
new file mode 100644
index 0000000..b43d2c8
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/component-picker-block/index.tsx
@@ -0,0 +1,227 @@
+import {
+  Fragment,
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import ReactDOM from 'react-dom'
+import {
+  flip,
+  offset,
+  shift,
+  useFloating,
+} from '@floating-ui/react'
+import type { TextNode } from 'lexical'
+import type { MenuRenderFn } from '@lexical/react/LexicalTypeaheadMenuPlugin'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import { LexicalTypeaheadMenuPlugin } from '@lexical/react/LexicalTypeaheadMenuPlugin'
+import type {
+  ContextBlockType,
+  ExternalToolBlockType,
+  HistoryBlockType,
+  QueryBlockType,
+  VariableBlockType,
+  WorkflowVariableBlockType,
+} from '../../types'
+import { useBasicTypeaheadTriggerMatch } from '../../hooks'
+import { INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND } from '../workflow-variable-block'
+import { INSERT_VARIABLE_VALUE_BLOCK_COMMAND } from '../variable-block'
+import { $splitNodeContainingQuery } from '../../utils'
+import { useOptions } from './hooks'
+import type { PickerBlockMenuOption } from './menu'
+import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { KEY_ESCAPE_COMMAND } from 'lexical'
+
+type ComponentPickerProps = {
+  triggerString: string
+  contextBlock?: ContextBlockType
+  queryBlock?: QueryBlockType
+  historyBlock?: HistoryBlockType
+  variableBlock?: VariableBlockType
+  externalToolBlock?: ExternalToolBlockType
+  workflowVariableBlock?: WorkflowVariableBlockType
+  isSupportFileVar?: boolean
+}
+const ComponentPicker = ({
+  triggerString,
+  contextBlock,
+  queryBlock,
+  historyBlock,
+  variableBlock,
+  externalToolBlock,
+  workflowVariableBlock,
+  isSupportFileVar,
+}: ComponentPickerProps) => {
+  const { eventEmitter } = useEventEmitterContextContext()
+  const { refs, floatingStyles, isPositioned } = useFloating({
+    placement: 'bottom-start',
+    middleware: [
+      offset(0), // fix hide cursor
+      shift({
+        padding: 8,
+      }),
+      flip(),
+    ],
+  })
+  const [editor] = useLexicalComposerContext()
+  const checkForTriggerMatch = useBasicTypeaheadTriggerMatch(triggerString, {
+    minLength: 0,
+    maxLength: 0,
+  })
+
+  const [queryString, setQueryString] = useState<string | null>(null)
+
+  eventEmitter?.useSubscription((v: any) => {
+    if (v.type === INSERT_VARIABLE_VALUE_BLOCK_COMMAND)
+      editor.dispatchCommand(INSERT_VARIABLE_VALUE_BLOCK_COMMAND, `{{${v.payload}}}`)
+  })
+
+  const {
+    allFlattenOptions,
+    workflowVariableOptions,
+  } = useOptions(
+    contextBlock,
+    queryBlock,
+    historyBlock,
+    variableBlock,
+    externalToolBlock,
+    workflowVariableBlock,
+  )
+
+  const onSelectOption = useCallback(
+    (
+      selectedOption: PickerBlockMenuOption,
+      nodeToRemove: TextNode | null,
+      closeMenu: () => void,
+    ) => {
+      editor.update(() => {
+        if (nodeToRemove && selectedOption?.key)
+          nodeToRemove.remove()
+
+        selectedOption.onSelectMenuOption()
+        closeMenu()
+      })
+    },
+    [editor],
+  )
+
+  const handleSelectWorkflowVariable = useCallback((variables: string[]) => {
+    editor.update(() => {
+      const needRemove = $splitNodeContainingQuery(checkForTriggerMatch(triggerString, editor)!)
+      if (needRemove)
+        needRemove.remove()
+    })
+
+    if (variables[1] === 'sys.query' || variables[1] === 'sys.files')
+      editor.dispatchCommand(INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND, [variables[1]])
+    else
+      editor.dispatchCommand(INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND, variables)
+  }, [editor, checkForTriggerMatch, triggerString])
+
+  const handleClose = useCallback(() => {
+    const escapeEvent = new KeyboardEvent('keydown', { key: 'Escape' })
+    editor.dispatchCommand(KEY_ESCAPE_COMMAND, escapeEvent)
+  }, [editor])
+
+  const renderMenu = useCallback<MenuRenderFn<PickerBlockMenuOption>>((
+    anchorElementRef,
+    { options, selectedIndex, selectOptionAndCleanUp, setHighlightedIndex },
+  ) => {
+    if (!(anchorElementRef.current && (allFlattenOptions.length || workflowVariableBlock?.show)))
+      return null
+
+    setTimeout(() => {
+      if (anchorElementRef.current)
+        refs.setReference(anchorElementRef.current)
+    }, 0)
+
+    return (
+      <>
+        {
+          ReactDOM.createPortal(
+            // The `LexicalMenu` will try to calculate the position of the floating menu based on the first child.
+            // Since we use floating ui, we need to wrap it with a div to prevent the position calculation being affected.
+            // See https://github.com/facebook/lexical/blob/ac97dfa9e14a73ea2d6934ff566282d7f758e8bb/packages/lexical-react/src/shared/LexicalMenu.ts#L493
+            <div className='h-0 w-0'>
+              <div
+                className='w-[260px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'
+                style={{
+                  ...floatingStyles,
+                  visibility: isPositioned ? 'visible' : 'hidden',
+                }}
+                ref={refs.setFloating}
+              >
+                {
+                  workflowVariableBlock?.show && (
+                    <div className='p-1'>
+                      <VarReferenceVars
+                        searchBoxClassName='mt-1'
+                        vars={workflowVariableOptions}
+                        onChange={(variables: string[]) => {
+                          handleSelectWorkflowVariable(variables)
+                        }}
+                        maxHeightClass='max-h-[34vh]'
+                        isSupportFileVar={isSupportFileVar}
+                        onClose={handleClose}
+                        onBlur={handleClose}
+                      />
+                    </div>
+                  )
+                }
+                {
+                  workflowVariableBlock?.show && !!options.length && (
+                    <div className='my-1 h-px w-full -translate-x-1 bg-divider-subtle'></div>
+                  )
+                }
+                <div>
+                  {
+                    options.map((option, index) => (
+                      <Fragment key={option.key}>
+                        {
+                          // Divider
+                          index !== 0 && options.at(index - 1)?.group !== option.group && (
+                            <div className='my-1 h-px w-full -translate-x-1 bg-divider-subtle'></div>
+                          )
+                        }
+                        {option.renderMenuOption({
+                          queryString,
+                          isSelected: selectedIndex === index,
+                          onSelect: () => {
+                            selectOptionAndCleanUp(option)
+                          },
+                          onSetHighlight: () => {
+                            setHighlightedIndex(index)
+                          },
+                        })}
+                      </Fragment>
+                    ))
+                  }
+                </div>
+              </div>
+            </div>,
+            anchorElementRef.current,
+          )
+        }
+      </>
+    )
+  }, [allFlattenOptions.length, workflowVariableBlock?.show, refs, isPositioned, floatingStyles, queryString, workflowVariableOptions, handleSelectWorkflowVariable, handleClose, isSupportFileVar])
+
+  return (
+    <LexicalTypeaheadMenuPlugin
+      options={allFlattenOptions}
+      onQueryChange={setQueryString}
+      onSelectOption={onSelectOption}
+      // The `translate` class is used to workaround the issue that the `typeahead-menu` menu is not positioned as expected.
+      // See also https://github.com/facebook/lexical/blob/772520509308e8ba7e4a82b6cd1996a78b3298d0/packages/lexical-react/src/shared/LexicalMenu.ts#L498
+      //
+      // We no need the position function of the `LexicalTypeaheadMenuPlugin`,
+      // so the reference anchor should be positioned based on the range of the trigger string, and the menu will be positioned by the floating ui.
+      anchorClassName='z-[999999] translate-y-[calc(-100%-3px)]'
+      menuRenderFn={renderMenu}
+      triggerFn={checkForTriggerMatch}
+    />
+  )
+}
+
+export default memo(ComponentPicker)
diff --git a/app/components/base/prompt-editor/plugins/component-picker-block/menu.tsx b/app/components/base/prompt-editor/plugins/component-picker-block/menu.tsx
new file mode 100644
index 0000000..679e604
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/component-picker-block/menu.tsx
@@ -0,0 +1,31 @@
+import { MenuOption } from '@lexical/react/LexicalTypeaheadMenuPlugin'
+import { Fragment } from 'react'
+
+/**
+ * Corresponds to the `MenuRenderFn` type from `@lexical/react/LexicalTypeaheadMenuPlugin`.
+ */
+type MenuOptionRenderProps = {
+  isSelected: boolean
+  onSelect: () => void
+  onSetHighlight: () => void
+  queryString: string | null
+}
+
+export class PickerBlockMenuOption extends MenuOption {
+  public group?: string
+
+  constructor(
+    private data: {
+      key: string
+      group?: string
+      onSelect?: () => void
+      render: (menuRenderProps: MenuOptionRenderProps) => React.JSX.Element
+    },
+  ) {
+    super(data.key)
+    this.group = data.group
+  }
+
+  public onSelectMenuOption = () => this.data.onSelect?.()
+  public renderMenuOption = (menuRenderProps: MenuOptionRenderProps) => <Fragment key={this.data.key}>{this.data.render(menuRenderProps)}</Fragment>
+}
diff --git a/app/components/base/prompt-editor/plugins/component-picker-block/prompt-option.tsx b/app/components/base/prompt-editor/plugins/component-picker-block/prompt-option.tsx
new file mode 100644
index 0000000..55be781
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/component-picker-block/prompt-option.tsx
@@ -0,0 +1,45 @@
+import { memo } from 'react'
+
+type PromptMenuItemMenuItemProps = {
+  icon: React.JSX.Element
+  title: string
+  disabled?: boolean
+  isSelected: boolean
+  onClick: () => void
+  onMouseEnter: () => void
+  setRefElement?: (element: HTMLDivElement) => void
+}
+export const PromptMenuItem = memo(({
+  icon,
+  title,
+  disabled,
+  isSelected,
+  onClick,
+  onMouseEnter,
+  setRefElement,
+}: PromptMenuItemMenuItemProps) => {
+  return (
+    <div
+      className={`
+        flex h-6 cursor-pointer items-center rounded-md px-3 hover:bg-state-base-hover
+        ${isSelected && !disabled && '!bg-state-base-hover'}
+        ${disabled ? 'cursor-not-allowed opacity-30' : 'cursor-pointer hover:bg-state-base-hover'}
+      `}
+      tabIndex={-1}
+      ref={setRefElement}
+      onMouseEnter={() => {
+        if (disabled)
+          return
+        onMouseEnter()
+      }}
+      onClick={() => {
+        if (disabled)
+          return
+        onClick()
+      }}>
+      {icon}
+      <div className='ml-1 text-[13px] text-text-secondary'>{title}</div>
+    </div>
+  )
+})
+PromptMenuItem.displayName = 'PromptMenuItem'
diff --git a/app/components/base/prompt-editor/plugins/component-picker-block/variable-option.tsx b/app/components/base/prompt-editor/plugins/component-picker-block/variable-option.tsx
new file mode 100644
index 0000000..20c0376
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/component-picker-block/variable-option.tsx
@@ -0,0 +1,60 @@
+import { memo } from 'react'
+
+type VariableMenuItemProps = {
+  title: string
+  icon?: React.JSX.Element
+  extraElement?: React.JSX.Element
+  isSelected: boolean
+  queryString: string | null
+  onClick: () => void
+  onMouseEnter: () => void
+  setRefElement?: (element: HTMLDivElement) => void
+}
+export const VariableMenuItem = memo(({
+  title,
+  icon,
+  extraElement,
+  isSelected,
+  queryString,
+  onClick,
+  onMouseEnter,
+  setRefElement,
+}: VariableMenuItemProps) => {
+  let before = title
+  let middle = ''
+  let after = ''
+
+  if (queryString) {
+    const regex = new RegExp(queryString, 'i')
+    const match = regex.exec(title)
+
+    if (match) {
+      before = title.substring(0, match.index)
+      middle = match[0]
+      after = title.substring(match.index + match[0].length)
+    }
+  }
+
+  return (
+    <div
+      className={`
+        flex h-6 cursor-pointer items-center rounded-md px-3 hover:bg-state-base-hover
+        ${isSelected && 'bg-state-base-hover'}
+      `}
+      tabIndex={-1}
+      ref={setRefElement}
+      onMouseEnter={onMouseEnter}
+      onClick={onClick}>
+      <div className='mr-2'>
+        {icon}
+      </div>
+      <div className='grow truncate text-[13px] text-text-secondary' title={title}>
+        {before}
+        <span className='text-text-accent'>{middle}</span>
+        {after}
+      </div>
+      {extraElement}
+    </div>
+  )
+})
+VariableMenuItem.displayName = 'VariableMenuItem'
diff --git a/app/components/base/prompt-editor/plugins/context-block/component.tsx b/app/components/base/prompt-editor/plugins/context-block/component.tsx
new file mode 100644
index 0000000..8396478
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/context-block/component.tsx
@@ -0,0 +1,104 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAddLine,
+} from '@remixicon/react'
+import { useSelectOrDelete, useTrigger } from '../../hooks'
+import { UPDATE_DATASETS_EVENT_EMITTER } from '../../constants'
+import type { Dataset } from './index'
+import { DELETE_CONTEXT_BLOCK_COMMAND } from './index'
+import { File05, Folder } from '@/app/components/base/icons/src/vender/solid/files'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+
+type ContextBlockComponentProps = {
+  nodeKey: string
+  datasets?: Dataset[]
+  onAddContext: () => void
+  canNotAddContext?: boolean
+}
+
+const ContextBlockComponent: FC<ContextBlockComponentProps> = ({
+  nodeKey,
+  datasets = [],
+  onAddContext,
+  canNotAddContext,
+}) => {
+  const { t } = useTranslation()
+  const [ref, isSelected] = useSelectOrDelete(nodeKey, DELETE_CONTEXT_BLOCK_COMMAND)
+  const [triggerRef, open, setOpen] = useTrigger()
+  const { eventEmitter } = useEventEmitterContextContext()
+  const [localDatasets, setLocalDatasets] = useState<Dataset[]>(datasets)
+
+  eventEmitter?.useSubscription((v: any) => {
+    if (v?.type === UPDATE_DATASETS_EVENT_EMITTER)
+      setLocalDatasets(v.payload)
+  })
+
+  return (
+    <div className={`
+      group inline-flex h-6 items-center rounded-[5px] border border-transparent bg-[#F4F3FF] pl-1 pr-0.5 text-[#6938EF] hover:bg-[#EBE9FE]
+      ${open ? 'bg-[#EBE9FE]' : 'bg-[#F4F3FF]'}
+      ${isSelected && '!border-[#9B8AFB]'}
+    `} ref={ref}>
+      <File05 className='mr-1 h-[14px] w-[14px]' />
+      <div className='mr-1 text-xs font-medium'>{t('common.promptEditor.context.item.title')}</div>
+      {!canNotAddContext && (
+        <PortalToFollowElem
+          open={open}
+          onOpenChange={setOpen}
+          placement='bottom-end'
+          offset={{
+            mainAxis: 3,
+            alignmentAxis: -147,
+          }}
+        >
+          <PortalToFollowElemTrigger ref={triggerRef}>
+            <div className={`
+            flex h-[18px] w-[18px] cursor-pointer items-center justify-center rounded text-[11px] font-semibold
+            ${open ? 'bg-[#6938EF] text-white' : 'bg-white/50 group-hover:bg-white group-hover:shadow-xs'}
+          `}>{localDatasets.length}</div>
+          </PortalToFollowElemTrigger>
+          <PortalToFollowElemContent style={{ zIndex: 100 }}>
+            <div className='w-[360px] rounded-xl bg-white shadow-lg'>
+              <div className='p-4'>
+                <div className='mb-2 text-xs font-medium text-gray-500'>
+                  {t('common.promptEditor.context.modal.title', { num: localDatasets.length })}
+                </div>
+                <div className='max-h-[270px] overflow-y-auto'>
+                  {
+                    localDatasets.map(dataset => (
+                      <div key={dataset.id} className='flex h-8 items-center'>
+                        <div className='mr-2 flex h-6 w-6 shrink-0 items-center justify-center rounded-md border-[0.5px] border-[#EAECF5] bg-[#F5F8FF]'>
+                          <Folder className='h-4 w-4 text-[#444CE7]' />
+                        </div>
+                        <div className='truncate text-sm text-gray-800' title=''>{dataset.name}</div>
+                      </div>
+                    ))
+                  }
+                </div>
+                <div className='flex h-8 cursor-pointer items-center text-[#155EEF]' onClick={onAddContext}>
+                  <div className='mr-2 flex h-6 w-6 shrink-0 items-center justify-center rounded-md border-[0.5px] border-gray-100'>
+                    <RiAddLine className='h-[14px] w-[14px]' />
+                  </div>
+                  <div className='text-[13px] font-medium' title=''>{t('common.promptEditor.context.modal.add')}</div>
+                </div>
+              </div>
+              <div className='rounded-b-xl border-t-[0.5px] border-gray-50 bg-gray-50 px-4 py-3 text-xs text-gray-500'>
+                {t('common.promptEditor.context.modal.footer')}
+              </div>
+            </div>
+          </PortalToFollowElemContent>
+        </PortalToFollowElem>
+      )}
+
+    </div>
+  )
+}
+
+export default ContextBlockComponent
diff --git a/app/components/base/prompt-editor/plugins/context-block/context-block-replacement-block.tsx b/app/components/base/prompt-editor/plugins/context-block/context-block-replacement-block.tsx
new file mode 100644
index 0000000..7d96827
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/context-block/context-block-replacement-block.tsx
@@ -0,0 +1,64 @@
+import {
+  memo,
+  useCallback,
+  useEffect,
+} from 'react'
+import { $applyNodeReplacement } from 'lexical'
+import { mergeRegister } from '@lexical/utils'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import { decoratorTransform } from '../../utils'
+import { CONTEXT_PLACEHOLDER_TEXT } from '../../constants'
+import type { ContextBlockType } from '../../types'
+import {
+  $createContextBlockNode,
+  ContextBlockNode,
+} from '../context-block/node'
+import { CustomTextNode } from '../custom-text/node'
+import { noop } from 'lodash-es'
+
+const REGEX = new RegExp(CONTEXT_PLACEHOLDER_TEXT)
+
+const ContextBlockReplacementBlock = ({
+  datasets = [],
+  onAddContext = noop,
+  onInsert,
+  canNotAddContext,
+}: ContextBlockType) => {
+  const [editor] = useLexicalComposerContext()
+
+  useEffect(() => {
+    if (!editor.hasNodes([ContextBlockNode]))
+      throw new Error('ContextBlockNodePlugin: ContextBlockNode not registered on editor')
+  }, [editor])
+
+  const createContextBlockNode = useCallback((): ContextBlockNode => {
+    if (onInsert)
+      onInsert()
+    return $applyNodeReplacement($createContextBlockNode(datasets, onAddContext, canNotAddContext))
+  }, [datasets, onAddContext, onInsert, canNotAddContext])
+
+  const getMatch = useCallback((text: string) => {
+    const matchArr = REGEX.exec(text)
+
+    if (matchArr === null)
+      return null
+
+    const startOffset = matchArr.index
+    const endOffset = startOffset + CONTEXT_PLACEHOLDER_TEXT.length
+    return {
+      end: endOffset,
+      start: startOffset,
+    }
+  }, [])
+
+  useEffect(() => {
+    REGEX.lastIndex = 0
+    return mergeRegister(
+      editor.registerNodeTransform(CustomTextNode, textNode => decoratorTransform(textNode, getMatch, createContextBlockNode)),
+    )
+  }, [])
+
+  return null
+}
+
+export default memo(ContextBlockReplacementBlock)
diff --git a/app/components/base/prompt-editor/plugins/context-block/index.tsx b/app/components/base/prompt-editor/plugins/context-block/index.tsx
new file mode 100644
index 0000000..c115065
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/context-block/index.tsx
@@ -0,0 +1,75 @@
+import {
+  memo,
+  useEffect,
+} from 'react'
+import {
+  $insertNodes,
+  COMMAND_PRIORITY_EDITOR,
+  createCommand,
+} from 'lexical'
+import { mergeRegister } from '@lexical/utils'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import type { ContextBlockType } from '../../types'
+import {
+  $createContextBlockNode,
+  ContextBlockNode,
+} from './node'
+import { noop } from 'lodash-es'
+
+export const INSERT_CONTEXT_BLOCK_COMMAND = createCommand('INSERT_CONTEXT_BLOCK_COMMAND')
+export const DELETE_CONTEXT_BLOCK_COMMAND = createCommand('DELETE_CONTEXT_BLOCK_COMMAND')
+
+export type Dataset = {
+  id: string
+  name: string
+  type: string
+}
+
+const ContextBlock = memo(({
+  datasets = [],
+  onAddContext = noop,
+  onInsert,
+  onDelete,
+  canNotAddContext,
+}: ContextBlockType) => {
+  const [editor] = useLexicalComposerContext()
+
+  useEffect(() => {
+    if (!editor.hasNodes([ContextBlockNode]))
+      throw new Error('ContextBlockPlugin: ContextBlock not registered on editor')
+
+    return mergeRegister(
+      editor.registerCommand(
+        INSERT_CONTEXT_BLOCK_COMMAND,
+        () => {
+          const contextBlockNode = $createContextBlockNode(datasets, onAddContext, canNotAddContext)
+
+          $insertNodes([contextBlockNode])
+
+          if (onInsert)
+            onInsert()
+
+          return true
+        },
+        COMMAND_PRIORITY_EDITOR,
+      ),
+      editor.registerCommand(
+        DELETE_CONTEXT_BLOCK_COMMAND,
+        () => {
+          if (onDelete)
+            onDelete()
+
+          return true
+        },
+        COMMAND_PRIORITY_EDITOR,
+      ),
+    )
+  }, [editor, datasets, onAddContext, onInsert, onDelete, canNotAddContext])
+
+  return null
+})
+ContextBlock.displayName = 'ContextBlock'
+
+export { ContextBlock }
+export { ContextBlockNode } from './node'
+export { default as ContextBlockReplacementBlock } from './context-block-replacement-block'
diff --git a/app/components/base/prompt-editor/plugins/context-block/node.tsx b/app/components/base/prompt-editor/plugins/context-block/node.tsx
new file mode 100644
index 0000000..227043c
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/context-block/node.tsx
@@ -0,0 +1,100 @@
+import type { LexicalNode, NodeKey, SerializedLexicalNode } from 'lexical'
+import { DecoratorNode } from 'lexical'
+import ContextBlockComponent from './component'
+import type { Dataset } from './index'
+
+export type SerializedNode = SerializedLexicalNode & { datasets: Dataset[]; onAddContext: () => void; canNotAddContext: boolean }
+
+export class ContextBlockNode extends DecoratorNode<React.JSX.Element> {
+  __datasets: Dataset[]
+  __onAddContext: () => void
+  __canNotAddContext: boolean
+
+  static getType(): string {
+    return 'context-block'
+  }
+
+  static clone(node: ContextBlockNode): ContextBlockNode {
+    return new ContextBlockNode(node.__datasets, node.__onAddContext, node.getKey(), node.__canNotAddContext)
+  }
+
+  isInline(): boolean {
+    return true
+  }
+
+  constructor(datasets: Dataset[], onAddContext: () => void, key?: NodeKey, canNotAddContext?: boolean) {
+    super(key)
+
+    this.__datasets = datasets
+    this.__onAddContext = onAddContext
+    this.__canNotAddContext = canNotAddContext || false
+  }
+
+  createDOM(): HTMLElement {
+    const div = document.createElement('div')
+    div.classList.add('inline-flex', 'items-center', 'align-middle')
+    return div
+  }
+
+  updateDOM(): false {
+    return false
+  }
+
+  decorate(): React.JSX.Element {
+    return (
+      <ContextBlockComponent
+        nodeKey={this.getKey()}
+        datasets={this.getDatasets()}
+        onAddContext={this.getOnAddContext()}
+        canNotAddContext={this.getCanNotAddContext()}
+      />
+    )
+  }
+
+  getDatasets(): Dataset[] {
+    const self = this.getLatest()
+
+    return self.__datasets
+  }
+
+  getOnAddContext(): () => void {
+    const self = this.getLatest()
+
+    return self.__onAddContext
+  }
+
+  getCanNotAddContext(): boolean {
+    const self = this.getLatest()
+
+    return self.__canNotAddContext
+  }
+
+  static importJSON(serializedNode: SerializedNode): ContextBlockNode {
+    const node = $createContextBlockNode(serializedNode.datasets, serializedNode.onAddContext, serializedNode.canNotAddContext)
+
+    return node
+  }
+
+  exportJSON(): SerializedNode {
+    return {
+      type: 'context-block',
+      version: 1,
+      datasets: this.getDatasets(),
+      onAddContext: this.getOnAddContext(),
+      canNotAddContext: this.getCanNotAddContext(),
+    }
+  }
+
+  getTextContent(): string {
+    return '{{#context#}}'
+  }
+}
+export function $createContextBlockNode(datasets: Dataset[], onAddContext: () => void, canNotAddContext?: boolean): ContextBlockNode {
+  return new ContextBlockNode(datasets, onAddContext, undefined, canNotAddContext)
+}
+
+export function $isContextBlockNode(
+  node: ContextBlockNode | LexicalNode | null | undefined,
+): boolean {
+  return node instanceof ContextBlockNode
+}
diff --git a/app/components/base/prompt-editor/plugins/custom-text/node.tsx b/app/components/base/prompt-editor/plugins/custom-text/node.tsx
new file mode 100644
index 0000000..49f4a05
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/custom-text/node.tsx
@@ -0,0 +1,52 @@
+import type { EditorConfig, SerializedTextNode } from 'lexical'
+import { $createTextNode, TextNode } from 'lexical'
+
+export class CustomTextNode extends TextNode {
+  static getType() {
+    return 'custom-text'
+  }
+
+  static clone(node: CustomTextNode) {
+    return new CustomTextNode(node.__text, node.__key)
+  }
+
+  // constructor(text: string, key?: NodeKey) {
+  //   super(text, key)
+  // }
+
+  createDOM(config: EditorConfig) {
+    const dom = super.createDOM(config)
+    dom.classList.add('align-middle')
+    return dom
+  }
+
+  static importJSON(serializedNode: SerializedTextNode): TextNode {
+    const node = $createTextNode(serializedNode.text)
+    node.setFormat(serializedNode.format)
+    node.setDetail(serializedNode.detail)
+    node.setMode(serializedNode.mode)
+    node.setStyle(serializedNode.style)
+    return node
+  }
+
+  exportJSON(): SerializedTextNode {
+    return {
+      detail: this.getDetail(),
+      format: this.getFormat(),
+      mode: this.getMode(),
+      style: this.getStyle(),
+      text: this.getTextContent(),
+      type: 'custom-text',
+      version: 1,
+    }
+  }
+
+  isSimpleText() {
+    return (
+      (this.__type === 'text' || this.__type === 'custom-text') && this.__mode === 0)
+  }
+}
+
+export function $createCustomTextNode(text: string): CustomTextNode {
+  return new CustomTextNode(text)
+}
diff --git a/app/components/base/prompt-editor/plugins/history-block/component.tsx b/app/components/base/prompt-editor/plugins/history-block/component.tsx
new file mode 100644
index 0000000..dc41413
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/history-block/component.tsx
@@ -0,0 +1,92 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiMoreFill,
+} from '@remixicon/react'
+import { useSelectOrDelete, useTrigger } from '../../hooks'
+import { UPDATE_HISTORY_EVENT_EMITTER } from '../../constants'
+import type { RoleName } from './index'
+import { DELETE_HISTORY_BLOCK_COMMAND } from './index'
+import { MessageClockCircle } from '@/app/components/base/icons/src/vender/solid/general'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+
+type HistoryBlockComponentProps = {
+  nodeKey: string
+  roleName?: RoleName
+  onEditRole: () => void
+}
+
+const HistoryBlockComponent: FC<HistoryBlockComponentProps> = ({
+  nodeKey,
+  roleName = { user: '', assistant: '' },
+  onEditRole,
+}) => {
+  const { t } = useTranslation()
+  const [ref, isSelected] = useSelectOrDelete(nodeKey, DELETE_HISTORY_BLOCK_COMMAND)
+  const [triggerRef, open, setOpen] = useTrigger()
+  const { eventEmitter } = useEventEmitterContextContext()
+  const [localRoleName, setLocalRoleName] = useState<RoleName>(roleName)
+
+  eventEmitter?.useSubscription((v: any) => {
+    if (v?.type === UPDATE_HISTORY_EVENT_EMITTER)
+      setLocalRoleName(v.payload)
+  })
+
+  return (
+    <div className={`
+      group inline-flex h-6 items-center rounded-[5px] border border-transparent pl-1 pr-0.5 text-[#DD2590] hover:bg-[#FCE7F6]
+      ${open ? 'bg-[#FCE7F6]' : 'bg-[#FDF2FA]'}
+      ${isSelected && '!border-[#F670C7]'}
+    `} ref={ref}>
+      <MessageClockCircle className='mr-1 h-[14px] w-[14px]' />
+      <div className='mr-1 text-xs font-medium'>{t('common.promptEditor.history.item.title')}</div>
+      <PortalToFollowElem
+        open={open}
+        onOpenChange={setOpen}
+        placement='top-end'
+        offset={{
+          mainAxis: 4,
+          alignmentAxis: -148,
+        }}
+      >
+        <PortalToFollowElemTrigger ref={triggerRef}>
+          <div className={`
+            flex h-[18px] w-[18px] cursor-pointer items-center justify-center rounded
+            ${open ? 'bg-[#DD2590] text-white' : 'bg-white/50 group-hover:bg-white group-hover:shadow-xs'}
+          `}>
+            <RiMoreFill className='h-3 w-3' />
+          </div>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent style={{ zIndex: 100 }}>
+          <div className='w-[360px] rounded-xl bg-white shadow-lg'>
+            <div className='p-4'>
+              <div className='mb-2 text-xs font-medium text-gray-500'>{t('common.promptEditor.history.modal.title')}</div>
+              <div className='flex items-center text-sm text-gray-700'>
+                <div className='mr-1 w-20 text-xs font-semibold'>{localRoleName?.user}</div>
+                {t('common.promptEditor.history.modal.user')}
+              </div>
+              <div className='flex items-center text-sm text-gray-700'>
+                <div className='mr-1 w-20 text-xs font-semibold'>{localRoleName?.assistant}</div>
+                {t('common.promptEditor.history.modal.assistant')}
+              </div>
+            </div>
+            <div
+              className='cursor-pointer rounded-b-xl border-t border-black/5 px-4 py-3 text-xs text-[#155EEF]'
+              onClick={onEditRole}
+            >
+              {t('common.promptEditor.history.modal.edit')}
+            </div>
+          </div>
+        </PortalToFollowElemContent>
+      </PortalToFollowElem>
+    </div>
+  )
+}
+
+export default HistoryBlockComponent
diff --git a/app/components/base/prompt-editor/plugins/history-block/history-block-replacement-block.tsx b/app/components/base/prompt-editor/plugins/history-block/history-block-replacement-block.tsx
new file mode 100644
index 0000000..7845903
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/history-block/history-block-replacement-block.tsx
@@ -0,0 +1,62 @@
+import {
+  useCallback,
+  useEffect,
+} from 'react'
+import { $applyNodeReplacement } from 'lexical'
+import { mergeRegister } from '@lexical/utils'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import { decoratorTransform } from '../../utils'
+import { HISTORY_PLACEHOLDER_TEXT } from '../../constants'
+import type { HistoryBlockType } from '../../types'
+import {
+  $createHistoryBlockNode,
+  HistoryBlockNode,
+} from '../history-block/node'
+import { CustomTextNode } from '../custom-text/node'
+import { noop } from 'lodash-es'
+
+const REGEX = new RegExp(HISTORY_PLACEHOLDER_TEXT)
+
+const HistoryBlockReplacementBlock = ({
+  history = { user: '', assistant: '' },
+  onEditRole = noop,
+  onInsert,
+}: HistoryBlockType) => {
+  const [editor] = useLexicalComposerContext()
+
+  useEffect(() => {
+    if (!editor.hasNodes([HistoryBlockNode]))
+      throw new Error('HistoryBlockNodePlugin: HistoryBlockNode not registered on editor')
+  }, [editor])
+
+  const createHistoryBlockNode = useCallback((): HistoryBlockNode => {
+    if (onInsert)
+      onInsert()
+    return $applyNodeReplacement($createHistoryBlockNode(history, onEditRole))
+  }, [history, onEditRole, onInsert])
+
+  const getMatch = useCallback((text: string) => {
+    const matchArr = REGEX.exec(text)
+
+    if (matchArr === null)
+      return null
+
+    const startOffset = matchArr.index
+    const endOffset = startOffset + HISTORY_PLACEHOLDER_TEXT.length
+    return {
+      end: endOffset,
+      start: startOffset,
+    }
+  }, [])
+
+  useEffect(() => {
+    REGEX.lastIndex = 0
+    return mergeRegister(
+      editor.registerNodeTransform(CustomTextNode, textNode => decoratorTransform(textNode, getMatch, createHistoryBlockNode)),
+    )
+  }, [])
+
+  return null
+}
+
+export default HistoryBlockReplacementBlock
diff --git a/app/components/base/prompt-editor/plugins/history-block/index.tsx b/app/components/base/prompt-editor/plugins/history-block/index.tsx
new file mode 100644
index 0000000..d51c986
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/history-block/index.tsx
@@ -0,0 +1,80 @@
+import {
+  memo,
+  useEffect,
+} from 'react'
+import {
+  $insertNodes,
+  COMMAND_PRIORITY_EDITOR,
+  createCommand,
+} from 'lexical'
+import { mergeRegister } from '@lexical/utils'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import type { HistoryBlockType } from '../../types'
+import {
+  $createHistoryBlockNode,
+  HistoryBlockNode,
+} from './node'
+import { noop } from 'lodash-es'
+
+export const INSERT_HISTORY_BLOCK_COMMAND = createCommand('INSERT_HISTORY_BLOCK_COMMAND')
+export const DELETE_HISTORY_BLOCK_COMMAND = createCommand('DELETE_HISTORY_BLOCK_COMMAND')
+
+export type RoleName = {
+  user: string
+  assistant: string
+}
+
+export type HistoryBlockProps = {
+  roleName: RoleName
+  onEditRole: () => void
+  onInsert?: () => void
+  onDelete?: () => void
+}
+
+const HistoryBlock = memo(({
+  history = { user: '', assistant: '' },
+  onEditRole = noop,
+  onInsert,
+  onDelete,
+}: HistoryBlockType) => {
+  const [editor] = useLexicalComposerContext()
+
+  useEffect(() => {
+    if (!editor.hasNodes([HistoryBlockNode]))
+      throw new Error('HistoryBlockPlugin: HistoryBlock not registered on editor')
+
+    return mergeRegister(
+      editor.registerCommand(
+        INSERT_HISTORY_BLOCK_COMMAND,
+        () => {
+          const historyBlockNode = $createHistoryBlockNode(history, onEditRole)
+
+          $insertNodes([historyBlockNode])
+
+          if (onInsert)
+            onInsert()
+
+          return true
+        },
+        COMMAND_PRIORITY_EDITOR,
+      ),
+      editor.registerCommand(
+        DELETE_HISTORY_BLOCK_COMMAND,
+        () => {
+          if (onDelete)
+            onDelete()
+
+          return true
+        },
+        COMMAND_PRIORITY_EDITOR,
+      ),
+    )
+  }, [editor, history, onEditRole, onInsert, onDelete])
+
+  return null
+})
+HistoryBlock.displayName = 'HistoryBlock'
+
+export { HistoryBlock }
+export { HistoryBlockNode } from './node'
+export { default as HistoryBlockReplacementBlock } from './history-block-replacement-block'
diff --git a/app/components/base/prompt-editor/plugins/history-block/node.tsx b/app/components/base/prompt-editor/plugins/history-block/node.tsx
new file mode 100644
index 0000000..1cb33fc
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/history-block/node.tsx
@@ -0,0 +1,90 @@
+import type { LexicalNode, NodeKey, SerializedLexicalNode } from 'lexical'
+import { DecoratorNode } from 'lexical'
+import HistoryBlockComponent from './component'
+import type { RoleName } from './index'
+
+export type SerializedNode = SerializedLexicalNode & { roleName: RoleName; onEditRole: () => void }
+
+export class HistoryBlockNode extends DecoratorNode<React.JSX.Element> {
+  __roleName: RoleName
+  __onEditRole: () => void
+
+  static getType(): string {
+    return 'history-block'
+  }
+
+  static clone(node: HistoryBlockNode): HistoryBlockNode {
+    return new HistoryBlockNode(node.__roleName, node.__onEditRole, node.__key)
+  }
+
+  constructor(roleName: RoleName, onEditRole: () => void, key?: NodeKey) {
+    super(key)
+
+    this.__roleName = roleName
+    this.__onEditRole = onEditRole
+  }
+
+  isInline(): boolean {
+    return true
+  }
+
+  createDOM(): HTMLElement {
+    const div = document.createElement('div')
+    div.classList.add('inline-flex', 'items-center', 'align-middle')
+    return div
+  }
+
+  updateDOM(): false {
+    return false
+  }
+
+  decorate(): React.JSX.Element {
+    return (
+      <HistoryBlockComponent
+        nodeKey={this.getKey()}
+        roleName={this.getRoleName()}
+        onEditRole={this.getOnEditRole()}
+      />
+    )
+  }
+
+  getRoleName(): RoleName {
+    const self = this.getLatest()
+
+    return self.__roleName
+  }
+
+  getOnEditRole(): () => void {
+    const self = this.getLatest()
+
+    return self.__onEditRole
+  }
+
+  static importJSON(serializedNode: SerializedNode): HistoryBlockNode {
+    const node = $createHistoryBlockNode(serializedNode.roleName, serializedNode.onEditRole)
+
+    return node
+  }
+
+  exportJSON(): SerializedNode {
+    return {
+      type: 'history-block',
+      version: 1,
+      roleName: this.getRoleName(),
+      onEditRole: this.getOnEditRole,
+    }
+  }
+
+  getTextContent(): string {
+    return '{{#histories#}}'
+  }
+}
+export function $createHistoryBlockNode(roleName: RoleName, onEditRole: () => void): HistoryBlockNode {
+  return new HistoryBlockNode(roleName, onEditRole)
+}
+
+export function $isHistoryBlockNode(
+  node: HistoryBlockNode | LexicalNode | null | undefined,
+): node is HistoryBlockNode {
+  return node instanceof HistoryBlockNode
+}
diff --git a/app/components/base/prompt-editor/plugins/on-blur-or-focus-block.tsx b/app/components/base/prompt-editor/plugins/on-blur-or-focus-block.tsx
new file mode 100644
index 0000000..246fd96
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/on-blur-or-focus-block.tsx
@@ -0,0 +1,69 @@
+import type { FC } from 'react'
+import { useEffect, useRef } from 'react'
+import {
+  BLUR_COMMAND,
+  COMMAND_PRIORITY_EDITOR,
+  FOCUS_COMMAND,
+  KEY_ESCAPE_COMMAND,
+} from 'lexical'
+import { mergeRegister } from '@lexical/utils'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import { CLEAR_HIDE_MENU_TIMEOUT } from './workflow-variable-block'
+
+type OnBlurBlockProps = {
+  onBlur?: () => void
+  onFocus?: () => void
+}
+const OnBlurBlock: FC<OnBlurBlockProps> = ({
+  onBlur,
+  onFocus,
+}) => {
+  const [editor] = useLexicalComposerContext()
+
+  const ref = useRef<any>(null)
+
+  useEffect(() => {
+    return mergeRegister(
+      editor.registerCommand(
+        CLEAR_HIDE_MENU_TIMEOUT,
+        () => {
+          if (ref.current) {
+            clearTimeout(ref.current)
+            ref.current = null
+          }
+          return true
+        },
+        COMMAND_PRIORITY_EDITOR,
+      ),
+      editor.registerCommand(
+        BLUR_COMMAND,
+        (event) => {
+          // Check if the clicked target element is var-search-input
+          const target = event?.relatedTarget as HTMLElement
+          if (!target?.classList?.contains('var-search-input')) {
+            ref.current = setTimeout(() => {
+              editor.dispatchCommand(KEY_ESCAPE_COMMAND, new KeyboardEvent('keydown', { key: 'Escape' }))
+            }, 200)
+            if (onBlur)
+              onBlur()
+          }
+          return true
+        },
+        COMMAND_PRIORITY_EDITOR,
+      ),
+      editor.registerCommand(
+        FOCUS_COMMAND,
+        () => {
+          if (onFocus)
+            onFocus()
+          return true
+        },
+        COMMAND_PRIORITY_EDITOR,
+      ),
+    )
+  }, [editor, onBlur, onFocus])
+
+  return null
+}
+
+export default OnBlurBlock
diff --git a/app/components/base/prompt-editor/plugins/placeholder.tsx b/app/components/base/prompt-editor/plugins/placeholder.tsx
new file mode 100644
index 0000000..8b86913
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/placeholder.tsx
@@ -0,0 +1,27 @@
+import { memo } from 'react'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+
+const Placeholder = ({
+  compact,
+  value,
+  className,
+}: {
+  compact?: boolean
+  value?: string
+  className?: string
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className={cn(
+      className,
+      'pointer-events-none absolute left-0 top-0 h-full w-full select-none text-sm text-components-input-text-placeholder',
+      compact ? 'text-[13px] leading-5' : 'text-sm leading-6',
+    )}>
+      {value || t('common.promptEditor.placeholder')}
+    </div>
+  )
+}
+
+export default memo(Placeholder)
diff --git a/app/components/base/prompt-editor/plugins/query-block/component.tsx b/app/components/base/prompt-editor/plugins/query-block/component.tsx
new file mode 100644
index 0000000..fa46334
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/query-block/component.tsx
@@ -0,0 +1,33 @@
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useSelectOrDelete } from '../../hooks'
+import { DELETE_QUERY_BLOCK_COMMAND } from './index'
+import { UserEdit02 } from '@/app/components/base/icons/src/vender/solid/users'
+
+type QueryBlockComponentProps = {
+  nodeKey: string
+}
+
+const QueryBlockComponent: FC<QueryBlockComponentProps> = ({
+  nodeKey,
+}) => {
+  const { t } = useTranslation()
+  const [ref, isSelected] = useSelectOrDelete(nodeKey, DELETE_QUERY_BLOCK_COMMAND)
+
+  return (
+    <div
+      className={`
+        inline-flex h-6 items-center rounded-[5px] border border-transparent bg-[#FFF6ED] pl-1 pr-0.5 hover:bg-[#FFEAD5]
+        ${isSelected && '!border-[#FD853A]'}
+      `}
+      ref={ref}
+    >
+      <UserEdit02 className='mr-1 h-[14px] w-[14px] text-[#FD853A]' />
+      <div className='text-xs font-medium text-[#EC4A0A] opacity-60'>{'{{'}</div>
+      <div className='text-xs font-medium text-[#EC4A0A]'>{t('common.promptEditor.query.item.title')}</div>
+      <div className='text-xs font-medium text-[#EC4A0A] opacity-60'>{'}}'}</div>
+    </div>
+  )
+}
+
+export default QueryBlockComponent
diff --git a/app/components/base/prompt-editor/plugins/query-block/index.tsx b/app/components/base/prompt-editor/plugins/query-block/index.tsx
new file mode 100644
index 0000000..0946153
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/query-block/index.tsx
@@ -0,0 +1,68 @@
+import {
+  memo,
+  useEffect,
+} from 'react'
+import {
+  $insertNodes,
+  COMMAND_PRIORITY_EDITOR,
+  createCommand,
+} from 'lexical'
+import { mergeRegister } from '@lexical/utils'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import type { QueryBlockType } from '../../types'
+import {
+  $createQueryBlockNode,
+  QueryBlockNode,
+} from './node'
+
+export const INSERT_QUERY_BLOCK_COMMAND = createCommand('INSERT_QUERY_BLOCK_COMMAND')
+export const DELETE_QUERY_BLOCK_COMMAND = createCommand('DELETE_QUERY_BLOCK_COMMAND')
+
+export type QueryBlockProps = {
+  onInsert?: () => void
+  onDelete?: () => void
+}
+const QueryBlock = memo(({
+  onInsert,
+  onDelete,
+}: QueryBlockType) => {
+  const [editor] = useLexicalComposerContext()
+
+  useEffect(() => {
+    if (!editor.hasNodes([QueryBlockNode]))
+      throw new Error('QueryBlockPlugin: QueryBlock not registered on editor')
+
+    return mergeRegister(
+      editor.registerCommand(
+        INSERT_QUERY_BLOCK_COMMAND,
+        () => {
+          const contextBlockNode = $createQueryBlockNode()
+
+          $insertNodes([contextBlockNode])
+          if (onInsert)
+            onInsert()
+
+          return true
+        },
+        COMMAND_PRIORITY_EDITOR,
+      ),
+      editor.registerCommand(
+        DELETE_QUERY_BLOCK_COMMAND,
+        () => {
+          if (onDelete)
+            onDelete()
+
+          return true
+        },
+        COMMAND_PRIORITY_EDITOR,
+      ),
+    )
+  }, [editor, onInsert, onDelete])
+
+  return null
+})
+QueryBlock.displayName = 'QueryBlock'
+
+export { QueryBlock }
+export { QueryBlockNode } from './node'
+export { default as QueryBlockReplacementBlock } from './query-block-replacement-block'
diff --git a/app/components/base/prompt-editor/plugins/query-block/node.tsx b/app/components/base/prompt-editor/plugins/query-block/node.tsx
new file mode 100644
index 0000000..fc56045
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/query-block/node.tsx
@@ -0,0 +1,59 @@
+import type { LexicalNode, SerializedLexicalNode } from 'lexical'
+import { DecoratorNode } from 'lexical'
+import QueryBlockComponent from './component'
+
+export type SerializedNode = SerializedLexicalNode
+
+export class QueryBlockNode extends DecoratorNode<React.JSX.Element> {
+  static getType(): string {
+    return 'query-block'
+  }
+
+  static clone(): QueryBlockNode {
+    return new QueryBlockNode()
+  }
+
+  isInline(): boolean {
+    return true
+  }
+
+  createDOM(): HTMLElement {
+    const div = document.createElement('div')
+    div.classList.add('inline-flex', 'items-center', 'align-middle')
+    return div
+  }
+
+  updateDOM(): false {
+    return false
+  }
+
+  decorate(): React.JSX.Element {
+    return <QueryBlockComponent nodeKey={this.getKey()} />
+  }
+
+  static importJSON(): QueryBlockNode {
+    const node = $createQueryBlockNode()
+
+    return node
+  }
+
+  exportJSON(): SerializedNode {
+    return {
+      type: 'query-block',
+      version: 1,
+    }
+  }
+
+  getTextContent(): string {
+    return '{{#query#}}'
+  }
+}
+export function $createQueryBlockNode(): QueryBlockNode {
+  return new QueryBlockNode()
+}
+
+export function $isQueryBlockNode(
+  node: QueryBlockNode | LexicalNode | null | undefined,
+): node is QueryBlockNode {
+  return node instanceof QueryBlockNode
+}
diff --git a/app/components/base/prompt-editor/plugins/query-block/query-block-replacement-block.tsx b/app/components/base/prompt-editor/plugins/query-block/query-block-replacement-block.tsx
new file mode 100644
index 0000000..484c661
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/query-block/query-block-replacement-block.tsx
@@ -0,0 +1,60 @@
+import {
+  memo,
+  useCallback,
+  useEffect,
+} from 'react'
+import { $applyNodeReplacement } from 'lexical'
+import { mergeRegister } from '@lexical/utils'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import { decoratorTransform } from '../../utils'
+import { QUERY_PLACEHOLDER_TEXT } from '../../constants'
+import type { QueryBlockType } from '../../types'
+import {
+  $createQueryBlockNode,
+  QueryBlockNode,
+} from '../query-block/node'
+import { CustomTextNode } from '../custom-text/node'
+
+const REGEX = new RegExp(QUERY_PLACEHOLDER_TEXT)
+
+const QueryBlockReplacementBlock = ({
+  onInsert,
+}: QueryBlockType) => {
+  const [editor] = useLexicalComposerContext()
+
+  useEffect(() => {
+    if (!editor.hasNodes([QueryBlockNode]))
+      throw new Error('QueryBlockNodePlugin: QueryBlockNode not registered on editor')
+  }, [editor])
+
+  const createQueryBlockNode = useCallback((): QueryBlockNode => {
+    if (onInsert)
+      onInsert()
+    return $applyNodeReplacement($createQueryBlockNode())
+  }, [onInsert])
+
+  const getMatch = useCallback((text: string) => {
+    const matchArr = REGEX.exec(text)
+
+    if (matchArr === null)
+      return null
+
+    const startOffset = matchArr.index
+    const endOffset = startOffset + QUERY_PLACEHOLDER_TEXT.length
+    return {
+      end: endOffset,
+      start: startOffset,
+    }
+  }, [])
+
+  useEffect(() => {
+    REGEX.lastIndex = 0
+    return mergeRegister(
+      editor.registerNodeTransform(CustomTextNode, textNode => decoratorTransform(textNode, getMatch, createQueryBlockNode)),
+    )
+  }, [])
+
+  return null
+}
+
+export default memo(QueryBlockReplacementBlock)
diff --git a/app/components/base/prompt-editor/plugins/tree-view.tsx b/app/components/base/prompt-editor/plugins/tree-view.tsx
new file mode 100644
index 0000000..29028cb
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/tree-view.tsx
@@ -0,0 +1,19 @@
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import { TreeView } from '@lexical/react/LexicalTreeView'
+
+const TreeViewPlugin = () => {
+  const [editor] = useLexicalComposerContext()
+  return (
+    <TreeView
+      viewClassName="tree-view-output"
+      treeTypeButtonClassName="debug-treetype-button"
+      timeTravelPanelClassName="debug-timetravel-panel"
+      timeTravelButtonClassName="debug-timetravel-button"
+      timeTravelPanelSliderClassName="debug-timetravel-panel-slider"
+      timeTravelPanelButtonClassName="debug-timetravel-panel-button"
+      editor={editor}
+    />
+  )
+}
+
+export default TreeViewPlugin
diff --git a/app/components/base/prompt-editor/plugins/update-block.tsx b/app/components/base/prompt-editor/plugins/update-block.tsx
new file mode 100644
index 0000000..89c9374
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/update-block.tsx
@@ -0,0 +1,42 @@
+import { $insertNodes } from 'lexical'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import { textToEditorState } from '../utils'
+import { CustomTextNode } from './custom-text/node'
+import { CLEAR_HIDE_MENU_TIMEOUT } from './workflow-variable-block'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+
+export const PROMPT_EDITOR_UPDATE_VALUE_BY_EVENT_EMITTER = 'PROMPT_EDITOR_UPDATE_VALUE_BY_EVENT_EMITTER'
+export const PROMPT_EDITOR_INSERT_QUICKLY = 'PROMPT_EDITOR_INSERT_QUICKLY'
+
+type UpdateBlockProps = {
+  instanceId?: string
+}
+const UpdateBlock = ({
+  instanceId,
+}: UpdateBlockProps) => {
+  const { eventEmitter } = useEventEmitterContextContext()
+  const [editor] = useLexicalComposerContext()
+
+  eventEmitter?.useSubscription((v: any) => {
+    if (v.type === PROMPT_EDITOR_UPDATE_VALUE_BY_EVENT_EMITTER && v.instanceId === instanceId) {
+      const editorState = editor.parseEditorState(textToEditorState(v.payload))
+      editor.setEditorState(editorState)
+    }
+  })
+
+  eventEmitter?.useSubscription((v: any) => {
+    if (v.type === PROMPT_EDITOR_INSERT_QUICKLY && v.instanceId === instanceId) {
+      editor.focus()
+      editor.update(() => {
+        const textNode = new CustomTextNode('/')
+        $insertNodes([textNode])
+
+        editor.dispatchCommand(CLEAR_HIDE_MENU_TIMEOUT, undefined)
+      })
+    }
+  })
+
+  return null
+}
+
+export default UpdateBlock
diff --git a/app/components/base/prompt-editor/plugins/variable-block/index.tsx b/app/components/base/prompt-editor/plugins/variable-block/index.tsx
new file mode 100644
index 0000000..3c995d5
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/variable-block/index.tsx
@@ -0,0 +1,45 @@
+import { useEffect } from 'react'
+import {
+  $insertNodes,
+  COMMAND_PRIORITY_EDITOR,
+  createCommand,
+} from 'lexical'
+import { mergeRegister } from '@lexical/utils'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import { CustomTextNode } from '../custom-text/node'
+
+export const INSERT_VARIABLE_BLOCK_COMMAND = createCommand('INSERT_VARIABLE_BLOCK_COMMAND')
+export const INSERT_VARIABLE_VALUE_BLOCK_COMMAND = createCommand('INSERT_VARIABLE_VALUE_BLOCK_COMMAND')
+
+const VariableBlock = () => {
+  const [editor] = useLexicalComposerContext()
+
+  useEffect(() => {
+    return mergeRegister(
+      editor.registerCommand(
+        INSERT_VARIABLE_BLOCK_COMMAND,
+        () => {
+          const textNode = new CustomTextNode('{')
+          $insertNodes([textNode])
+
+          return true
+        },
+        COMMAND_PRIORITY_EDITOR,
+      ),
+      editor.registerCommand(
+        INSERT_VARIABLE_VALUE_BLOCK_COMMAND,
+        (value: string) => {
+          const textNode = new CustomTextNode(value)
+          $insertNodes([textNode])
+
+          return true
+        },
+        COMMAND_PRIORITY_EDITOR,
+      ),
+    )
+  }, [editor])
+
+  return null
+}
+
+export default VariableBlock
diff --git a/app/components/base/prompt-editor/plugins/variable-value-block/index.tsx b/app/components/base/prompt-editor/plugins/variable-value-block/index.tsx
new file mode 100644
index 0000000..e93c0d7
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/variable-value-block/index.tsx
@@ -0,0 +1,52 @@
+import {
+  useCallback,
+  useEffect,
+} from 'react'
+import type { TextNode } from 'lexical'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import { useLexicalTextEntity } from '../../hooks'
+import {
+  $createVariableValueBlockNode,
+  VariableValueBlockNode,
+} from './node'
+import { getHashtagRegexString } from './utils'
+
+const REGEX = new RegExp(getHashtagRegexString(), 'i')
+
+const VariableValueBlock = () => {
+  const [editor] = useLexicalComposerContext()
+
+  useEffect(() => {
+    if (!editor.hasNodes([VariableValueBlockNode]))
+      throw new Error('VariableValueBlockPlugin: VariableValueNode not registered on editor')
+  }, [editor])
+
+  const createVariableValueBlockNode = useCallback((textNode: TextNode): VariableValueBlockNode => {
+    return $createVariableValueBlockNode(textNode.getTextContent())
+  }, [])
+
+  const getVariableValueMatch = useCallback((text: string) => {
+    const matchArr = REGEX.exec(text)
+
+    if (matchArr === null)
+      return null
+
+    const hashtagLength = matchArr[0].length
+    const startOffset = matchArr.index
+    const endOffset = startOffset + hashtagLength
+    return {
+      end: endOffset,
+      start: startOffset,
+    }
+  }, [])
+
+  useLexicalTextEntity<VariableValueBlockNode>(
+    getVariableValueMatch,
+    VariableValueBlockNode,
+    createVariableValueBlockNode,
+  )
+
+  return null
+}
+
+export default VariableValueBlock
diff --git a/app/components/base/prompt-editor/plugins/variable-value-block/node.tsx b/app/components/base/prompt-editor/plugins/variable-value-block/node.tsx
new file mode 100644
index 0000000..e83dd22
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/variable-value-block/node.tsx
@@ -0,0 +1,64 @@
+import type {
+  EditorConfig,
+  LexicalNode,
+  SerializedTextNode,
+} from 'lexical'
+import {
+  $applyNodeReplacement,
+  TextNode,
+} from 'lexical'
+
+export class VariableValueBlockNode extends TextNode {
+  static getType(): string {
+    return 'variable-value-block'
+  }
+
+  static clone(node: VariableValueBlockNode): VariableValueBlockNode {
+    return new VariableValueBlockNode(node.__text, node.__key)
+  }
+
+  // constructor(text: string, key?: NodeKey) {
+  //   super(text, key)
+  // }
+
+  createDOM(config: EditorConfig): HTMLElement {
+    const element = super.createDOM(config)
+    element.classList.add('inline-flex', 'items-center', 'px-0.5', 'h-[22px]', 'text-text-accent', 'rounded-[5px]', 'align-middle')
+    return element
+  }
+
+  static importJSON(serializedNode: SerializedTextNode): TextNode {
+    const node = $createVariableValueBlockNode(serializedNode.text)
+    node.setFormat(serializedNode.format)
+    node.setDetail(serializedNode.detail)
+    node.setMode(serializedNode.mode)
+    node.setStyle(serializedNode.style)
+    return node
+  }
+
+  exportJSON(): SerializedTextNode {
+    return {
+      detail: this.getDetail(),
+      format: this.getFormat(),
+      mode: this.getMode(),
+      style: this.getStyle(),
+      text: this.getTextContent(),
+      type: 'variable-value-block',
+      version: 1,
+    }
+  }
+
+  canInsertTextBefore(): boolean {
+    return false
+  }
+}
+
+export function $createVariableValueBlockNode(text = ''): VariableValueBlockNode {
+  return $applyNodeReplacement(new VariableValueBlockNode(text))
+}
+
+export function $isVariableValueNodeBlock(
+  node: LexicalNode | null | undefined,
+): node is VariableValueBlockNode {
+  return node instanceof VariableValueBlockNode
+}
diff --git a/app/components/base/prompt-editor/plugins/variable-value-block/utils.ts b/app/components/base/prompt-editor/plugins/variable-value-block/utils.ts
new file mode 100644
index 0000000..4d59d41
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/variable-value-block/utils.ts
@@ -0,0 +1,5 @@
+export function getHashtagRegexString(): string {
+  const hashtag = '\\{\\{[a-zA-Z_][a-zA-Z0-9_]{0,29}\\}\\}'
+
+  return hashtag
+}
diff --git a/app/components/base/prompt-editor/plugins/workflow-variable-block/component.tsx b/app/components/base/prompt-editor/plugins/workflow-variable-block/component.tsx
new file mode 100644
index 0000000..50ff296
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/workflow-variable-block/component.tsx
@@ -0,0 +1,169 @@
+import {
+  memo,
+  useEffect,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  COMMAND_PRIORITY_EDITOR,
+} from 'lexical'
+import { mergeRegister } from '@lexical/utils'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import {
+  RiErrorWarningFill,
+  RiMoreLine,
+} from '@remixicon/react'
+import { useSelectOrDelete } from '../../hooks'
+import type { WorkflowNodesMap } from './node'
+import { WorkflowVariableBlockNode } from './node'
+import {
+  DELETE_WORKFLOW_VARIABLE_BLOCK_COMMAND,
+  UPDATE_WORKFLOW_NODES_MAP,
+} from './index'
+import cn from '@/utils/classnames'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import { BubbleX, Env } from '@/app/components/base/icons/src/vender/line/others'
+import { VarBlockIcon } from '@/app/components/workflow/block-icon'
+import { Line3 } from '@/app/components/base/icons/src/public/common'
+import { isConversationVar, isENV, isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+import Tooltip from '@/app/components/base/tooltip'
+import { isExceptionVariable } from '@/app/components/workflow/utils'
+import VarFullPathPanel from '@/app/components/workflow/nodes/_base/components/variable/var-full-path-panel'
+import { Type } from '@/app/components/workflow/nodes/llm/types'
+import type { ValueSelector } from '@/app/components/workflow/types'
+
+type WorkflowVariableBlockComponentProps = {
+  nodeKey: string
+  variables: string[]
+  workflowNodesMap: WorkflowNodesMap
+  getVarType?: (payload: {
+    nodeId: string,
+    valueSelector: ValueSelector,
+  }) => Type
+}
+
+const WorkflowVariableBlockComponent = ({
+  nodeKey,
+  variables,
+  workflowNodesMap = {},
+  getVarType,
+}: WorkflowVariableBlockComponentProps) => {
+  const { t } = useTranslation()
+  const [editor] = useLexicalComposerContext()
+  const [ref, isSelected] = useSelectOrDelete(nodeKey, DELETE_WORKFLOW_VARIABLE_BLOCK_COMMAND)
+  const variablesLength = variables.length
+  const isShowAPart = variablesLength > 2
+  const varName = (
+    () => {
+      const isSystem = isSystemVar(variables)
+      const varName = variables[variablesLength - 1]
+      return `${isSystem ? 'sys.' : ''}${varName}`
+    }
+  )()
+  const [localWorkflowNodesMap, setLocalWorkflowNodesMap] = useState<WorkflowNodesMap>(workflowNodesMap)
+  const node = localWorkflowNodesMap![variables[0]]
+  const isEnv = isENV(variables)
+  const isChatVar = isConversationVar(variables)
+  const isException = isExceptionVariable(varName, node?.type)
+
+  useEffect(() => {
+    if (!editor.hasNodes([WorkflowVariableBlockNode]))
+      throw new Error('WorkflowVariableBlockPlugin: WorkflowVariableBlock not registered on editor')
+
+    return mergeRegister(
+      editor.registerCommand(
+        UPDATE_WORKFLOW_NODES_MAP,
+        (workflowNodesMap: WorkflowNodesMap) => {
+          setLocalWorkflowNodesMap(workflowNodesMap)
+
+          return true
+        },
+        COMMAND_PRIORITY_EDITOR,
+      ),
+    )
+  }, [editor])
+
+  const Item = (
+    <div
+      className={cn(
+        'group/wrap relative mx-0.5 flex h-[18px] select-none items-center rounded-[5px] border pl-0.5 pr-[3px] hover:border-state-accent-solid hover:bg-state-accent-hover',
+        isSelected ? ' border-state-accent-solid bg-state-accent-hover' : ' border-components-panel-border-subtle bg-components-badge-white-to-dark',
+        !node && !isEnv && !isChatVar && '!border-state-destructive-solid !bg-state-destructive-hover',
+      )}
+      ref={ref}
+    >
+      {!isEnv && !isChatVar && (
+        <div className='flex items-center'>
+          {
+            node?.type && (
+              <div className='p-[1px]'>
+                <VarBlockIcon
+                  className='!text-text-secondary'
+                  type={node?.type}
+                />
+              </div>
+            )
+          }
+          <div className='mx-0.5 max-w-[60px] shrink-0 truncate text-xs font-medium text-text-secondary' title={node?.title} style={{
+          }}>{node?.title}</div>
+          <Line3 className='mr-0.5 text-divider-deep'></Line3>
+        </div>
+      )}
+      {isShowAPart && (
+        <div className='flex items-center'>
+          <RiMoreLine className='h-3 w-3 text-text-secondary' />
+          <Line3 className='mr-0.5 text-divider-deep'></Line3>
+        </div>
+      )}
+
+      <div className='flex items-center text-text-accent'>
+        {!isEnv && !isChatVar && <Variable02 className={cn('h-3.5 w-3.5 shrink-0', isException && 'text-text-warning')} />}
+        {isEnv && <Env className='h-3.5 w-3.5 shrink-0 text-util-colors-violet-violet-600' />}
+        {isChatVar && <BubbleX className='h-3.5 w-3.5 text-util-colors-teal-teal-700' />}
+        <div className={cn(
+          'ml-0.5 shrink-0 truncate text-xs font-medium',
+          isEnv && 'text-util-colors-violet-violet-600',
+          isChatVar && 'text-util-colors-teal-teal-700',
+          isException && 'text-text-warning',
+        )} title={varName}>{varName}</div>
+        {
+          !node && !isEnv && !isChatVar && (
+            <RiErrorWarningFill className='ml-0.5 h-3 w-3 text-text-destructive' />
+          )
+        }
+      </div>
+    </div>
+  )
+
+  if (!node && !isEnv && !isChatVar) {
+    return (
+      <Tooltip popupContent={t('workflow.errorMsg.invalidVariable')}>
+        {Item}
+      </Tooltip>
+    )
+  }
+
+  if (!node)
+    return Item
+
+  return (
+    <Tooltip
+      noDecoration
+      popupContent={
+        <VarFullPathPanel
+          nodeName={node.title}
+          path={variables.slice(1)}
+          varType={getVarType ? getVarType({
+            nodeId: variables[0],
+            valueSelector: variables,
+          }) : Type.string}
+          nodeType={node?.type}
+        />}
+      disabled={!isShowAPart}
+    >
+      <div>{Item}</div>
+    </Tooltip>
+  )
+}
+
+export default memo(WorkflowVariableBlockComponent)
diff --git a/app/components/base/prompt-editor/plugins/workflow-variable-block/index.tsx b/app/components/base/prompt-editor/plugins/workflow-variable-block/index.tsx
new file mode 100644
index 0000000..479dce9
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/workflow-variable-block/index.tsx
@@ -0,0 +1,82 @@
+import {
+  memo,
+  useEffect,
+} from 'react'
+import {
+  $insertNodes,
+  COMMAND_PRIORITY_EDITOR,
+  createCommand,
+} from 'lexical'
+import { mergeRegister } from '@lexical/utils'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import type { GetVarType, WorkflowVariableBlockType } from '../../types'
+import {
+  $createWorkflowVariableBlockNode,
+  WorkflowVariableBlockNode,
+} from './node'
+import type { Node } from '@/app/components/workflow/types'
+
+export const INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND = createCommand('INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND')
+export const DELETE_WORKFLOW_VARIABLE_BLOCK_COMMAND = createCommand('DELETE_WORKFLOW_VARIABLE_BLOCK_COMMAND')
+export const CLEAR_HIDE_MENU_TIMEOUT = createCommand('CLEAR_HIDE_MENU_TIMEOUT')
+export const UPDATE_WORKFLOW_NODES_MAP = createCommand('UPDATE_WORKFLOW_NODES_MAP')
+
+export type WorkflowVariableBlockProps = {
+  getWorkflowNode: (nodeId: string) => Node
+  onInsert?: () => void
+  onDelete?: () => void
+  getVarType: GetVarType
+}
+const WorkflowVariableBlock = memo(({
+  workflowNodesMap,
+  onInsert,
+  onDelete,
+  getVarType,
+}: WorkflowVariableBlockType) => {
+  const [editor] = useLexicalComposerContext()
+
+  useEffect(() => {
+    editor.update(() => {
+      editor.dispatchCommand(UPDATE_WORKFLOW_NODES_MAP, workflowNodesMap)
+    })
+  }, [editor, workflowNodesMap])
+
+  useEffect(() => {
+    if (!editor.hasNodes([WorkflowVariableBlockNode]))
+      throw new Error('WorkflowVariableBlockPlugin: WorkflowVariableBlock not registered on editor')
+
+    return mergeRegister(
+      editor.registerCommand(
+        INSERT_WORKFLOW_VARIABLE_BLOCK_COMMAND,
+        (variables: string[]) => {
+          editor.dispatchCommand(CLEAR_HIDE_MENU_TIMEOUT, undefined)
+          const workflowVariableBlockNode = $createWorkflowVariableBlockNode(variables, workflowNodesMap, getVarType)
+
+          $insertNodes([workflowVariableBlockNode])
+          if (onInsert)
+            onInsert()
+
+          return true
+        },
+        COMMAND_PRIORITY_EDITOR,
+      ),
+      editor.registerCommand(
+        DELETE_WORKFLOW_VARIABLE_BLOCK_COMMAND,
+        () => {
+          if (onDelete)
+            onDelete()
+
+          return true
+        },
+        COMMAND_PRIORITY_EDITOR,
+      ),
+    )
+  }, [editor, onInsert, onDelete, workflowNodesMap, getVarType])
+
+  return null
+})
+WorkflowVariableBlock.displayName = 'WorkflowVariableBlock'
+
+export { WorkflowVariableBlock }
+export { WorkflowVariableBlockNode } from './node'
+export { default as WorkflowVariableBlockReplacementBlock } from './workflow-variable-block-replacement-block'
diff --git a/app/components/base/prompt-editor/plugins/workflow-variable-block/node.tsx b/app/components/base/prompt-editor/plugins/workflow-variable-block/node.tsx
new file mode 100644
index 0000000..dce636d
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/workflow-variable-block/node.tsx
@@ -0,0 +1,104 @@
+import type { LexicalNode, NodeKey, SerializedLexicalNode } from 'lexical'
+import { DecoratorNode } from 'lexical'
+import type { WorkflowVariableBlockType } from '../../types'
+import WorkflowVariableBlockComponent from './component'
+import type { GetVarType } from '../../types'
+
+export type WorkflowNodesMap = WorkflowVariableBlockType['workflowNodesMap']
+
+export type SerializedNode = SerializedLexicalNode & {
+  variables: string[]
+  workflowNodesMap: WorkflowNodesMap
+  getVarType?: GetVarType
+}
+
+export class WorkflowVariableBlockNode extends DecoratorNode<React.JSX.Element> {
+  __variables: string[]
+  __workflowNodesMap: WorkflowNodesMap
+  __getVarType?: GetVarType
+
+  static getType(): string {
+    return 'workflow-variable-block'
+  }
+
+  static clone(node: WorkflowVariableBlockNode): WorkflowVariableBlockNode {
+    return new WorkflowVariableBlockNode(node.__variables, node.__workflowNodesMap, node.__getVarType, node.__key)
+  }
+
+  isInline(): boolean {
+    return true
+  }
+
+  constructor(variables: string[], workflowNodesMap: WorkflowNodesMap, getVarType: any, key?: NodeKey) {
+    super(key)
+
+    this.__variables = variables
+    this.__workflowNodesMap = workflowNodesMap
+    this.__getVarType = getVarType
+  }
+
+  createDOM(): HTMLElement {
+    const div = document.createElement('div')
+    div.classList.add('inline-flex', 'items-center', 'align-middle')
+    return div
+  }
+
+  updateDOM(): false {
+    return false
+  }
+
+  decorate(): React.JSX.Element {
+    return (
+      <WorkflowVariableBlockComponent
+        nodeKey={this.getKey()}
+        variables={this.__variables}
+        workflowNodesMap={this.__workflowNodesMap}
+        getVarType={this.__getVarType!}
+      />
+    )
+  }
+
+  static importJSON(serializedNode: SerializedNode): WorkflowVariableBlockNode {
+    const node = $createWorkflowVariableBlockNode(serializedNode.variables, serializedNode.workflowNodesMap, serializedNode.getVarType)
+
+    return node
+  }
+
+  exportJSON(): SerializedNode {
+    return {
+      type: 'workflow-variable-block',
+      version: 1,
+      variables: this.getVariables(),
+      workflowNodesMap: this.getWorkflowNodesMap(),
+      getVarType: this.getVarType(),
+    }
+  }
+
+  getVariables(): string[] {
+    const self = this.getLatest()
+    return self.__variables
+  }
+
+  getWorkflowNodesMap(): WorkflowNodesMap {
+    const self = this.getLatest()
+    return self.__workflowNodesMap
+  }
+
+  getVarType(): any {
+    const self = this.getLatest()
+    return self.__getVarType
+  }
+
+  getTextContent(): string {
+    return `{{#${this.getVariables().join('.')}#}}`
+  }
+}
+export function $createWorkflowVariableBlockNode(variables: string[], workflowNodesMap: WorkflowNodesMap, getVarType?: GetVarType): WorkflowVariableBlockNode {
+  return new WorkflowVariableBlockNode(variables, workflowNodesMap, getVarType)
+}
+
+export function $isWorkflowVariableBlockNode(
+  node: WorkflowVariableBlockNode | LexicalNode | null | undefined,
+): node is WorkflowVariableBlockNode {
+  return node instanceof WorkflowVariableBlockNode
+}
diff --git a/app/components/base/prompt-editor/plugins/workflow-variable-block/workflow-variable-block-replacement-block.tsx b/app/components/base/prompt-editor/plugins/workflow-variable-block/workflow-variable-block-replacement-block.tsx
new file mode 100644
index 0000000..288008b
--- /dev/null
+++ b/app/components/base/prompt-editor/plugins/workflow-variable-block/workflow-variable-block-replacement-block.tsx
@@ -0,0 +1,66 @@
+import {
+  memo,
+  useCallback,
+  useEffect,
+} from 'react'
+import type { TextNode } from 'lexical'
+import { $applyNodeReplacement } from 'lexical'
+import { mergeRegister } from '@lexical/utils'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import { decoratorTransform } from '../../utils'
+import type { WorkflowVariableBlockType } from '../../types'
+import { CustomTextNode } from '../custom-text/node'
+import { $createWorkflowVariableBlockNode } from './node'
+import { WorkflowVariableBlockNode } from './index'
+import { VAR_REGEX as REGEX, resetReg } from '@/config'
+
+const WorkflowVariableBlockReplacementBlock = ({
+  workflowNodesMap,
+  getVarType,
+  onInsert,
+}: WorkflowVariableBlockType) => {
+  const [editor] = useLexicalComposerContext()
+
+  useEffect(() => {
+    if (!editor.hasNodes([WorkflowVariableBlockNode]))
+      throw new Error('WorkflowVariableBlockNodePlugin: WorkflowVariableBlockNode not registered on editor')
+  }, [editor])
+
+  const createWorkflowVariableBlockNode = useCallback((textNode: TextNode): WorkflowVariableBlockNode => {
+    if (onInsert)
+      onInsert()
+
+    const nodePathString = textNode.getTextContent().slice(3, -3)
+    return $applyNodeReplacement($createWorkflowVariableBlockNode(nodePathString.split('.'), workflowNodesMap, getVarType))
+  }, [onInsert, workflowNodesMap, getVarType])
+
+  const getMatch = useCallback((text: string) => {
+    const matchArr = REGEX.exec(text)
+
+    if (matchArr === null)
+      return null
+
+    const startOffset = matchArr.index
+    const endOffset = startOffset + matchArr[0].length
+    return {
+      end: endOffset,
+      start: startOffset,
+    }
+  }, [])
+
+  const transformListener = useCallback((textNode: CustomTextNode) => {
+    resetReg()
+    return decoratorTransform(textNode, getMatch, createWorkflowVariableBlockNode)
+  }, [createWorkflowVariableBlockNode, getMatch])
+
+  useEffect(() => {
+    resetReg()
+    return mergeRegister(
+      editor.registerNodeTransform(CustomTextNode, transformListener),
+    )
+  }, [])
+
+  return null
+}
+
+export default memo(WorkflowVariableBlockReplacementBlock)
diff --git a/app/components/base/prompt-editor/types.ts b/app/components/base/prompt-editor/types.ts
new file mode 100644
index 0000000..0f09fb2
--- /dev/null
+++ b/app/components/base/prompt-editor/types.ts
@@ -0,0 +1,77 @@
+import type { Type } from '../../workflow/nodes/llm/types'
+import type { Dataset } from './plugins/context-block'
+import type { RoleName } from './plugins/history-block'
+import type {
+  Node,
+  NodeOutPutVar,
+  ValueSelector,
+} from '@/app/components/workflow/types'
+
+export type Option = {
+  value: string
+  name: string
+}
+
+export type ExternalToolOption = {
+  name: string
+  variableName: string
+  icon?: string
+  icon_background?: string
+}
+
+export type ContextBlockType = {
+  show?: boolean
+  selectable?: boolean
+  datasets?: Dataset[]
+  canNotAddContext?: boolean
+  onAddContext?: () => void
+  onInsert?: () => void
+  onDelete?: () => void
+}
+
+export type QueryBlockType = {
+  show?: boolean
+  selectable?: boolean
+  onInsert?: () => void
+  onDelete?: () => void
+}
+
+export type HistoryBlockType = {
+  show?: boolean
+  selectable?: boolean
+  history?: RoleName
+  onInsert?: () => void
+  onDelete?: () => void
+  onEditRole?: () => void
+}
+
+export type VariableBlockType = {
+  show?: boolean
+  variables?: Option[]
+}
+
+export type ExternalToolBlockType = {
+  show?: boolean
+  externalTools?: ExternalToolOption[]
+  onAddExternalTool?: () => void
+}
+
+export type GetVarType = (payload: {
+  nodeId: string,
+  valueSelector: ValueSelector,
+}) => Type
+
+export type WorkflowVariableBlockType = {
+  show?: boolean
+  variables?: NodeOutPutVar[]
+  workflowNodesMap?: Record<string, Pick<Node['data'], 'title' | 'type'>>
+  onInsert?: () => void
+  onDelete?: () => void
+  getVarType?: GetVarType
+}
+
+export type MenuTextMatch = {
+  leadOffset: number
+  matchingString: string
+  replaceableString: string
+}
diff --git a/app/components/base/prompt-editor/utils.ts b/app/components/base/prompt-editor/utils.ts
new file mode 100644
index 0000000..4b2570e
--- /dev/null
+++ b/app/components/base/prompt-editor/utils.ts
@@ -0,0 +1,328 @@
+import { $isAtNodeEnd } from '@lexical/selection'
+import type {
+  ElementNode,
+  Klass,
+  LexicalEditor,
+  LexicalNode,
+  RangeSelection,
+  TextNode,
+} from 'lexical'
+import {
+  $createTextNode,
+  $getSelection,
+  $isRangeSelection,
+  $isTextNode,
+} from 'lexical'
+import type { EntityMatch } from '@lexical/text'
+import { CustomTextNode } from './plugins/custom-text/node'
+import type { MenuTextMatch } from './types'
+
+export function getSelectedNode(
+  selection: RangeSelection,
+): TextNode | ElementNode {
+  const anchor = selection.anchor
+  const focus = selection.focus
+  const anchorNode = selection.anchor.getNode()
+  const focusNode = selection.focus.getNode()
+  if (anchorNode === focusNode)
+    return anchorNode
+
+  const isBackward = selection.isBackward()
+  if (isBackward)
+    return $isAtNodeEnd(focus) ? anchorNode : focusNode
+  else
+    return $isAtNodeEnd(anchor) ? anchorNode : focusNode
+}
+
+export function registerLexicalTextEntity<T extends TextNode>(
+  editor: LexicalEditor,
+  getMatch: (text: string) => null | EntityMatch,
+  targetNode: Klass<T>,
+  createNode: (textNode: TextNode) => T,
+) {
+  const isTargetNode = (node: LexicalNode | null | undefined): node is T => {
+    return node instanceof targetNode
+  }
+
+  const replaceWithSimpleText = (node: TextNode): void => {
+    const textNode = $createTextNode(node.getTextContent())
+    textNode.setFormat(node.getFormat())
+    node.replace(textNode)
+  }
+
+  const getMode = (node: TextNode): number => {
+    return node.getLatest().__mode
+  }
+
+  const textNodeTransform = (node: TextNode) => {
+    if (!node.isSimpleText())
+      return
+
+    const prevSibling = node.getPreviousSibling()
+    let text = node.getTextContent()
+    let currentNode = node
+    let match
+
+    if ($isTextNode(prevSibling)) {
+      const previousText = prevSibling.getTextContent()
+      const combinedText = previousText + text
+      const prevMatch = getMatch(combinedText)
+
+      if (isTargetNode(prevSibling)) {
+        if (prevMatch === null || getMode(prevSibling) !== 0) {
+          replaceWithSimpleText(prevSibling)
+          return
+        }
+        else {
+          const diff = prevMatch.end - previousText.length
+
+          if (diff > 0) {
+            const concatText = text.slice(0, diff)
+            const newTextContent = previousText + concatText
+            prevSibling.select()
+            prevSibling.setTextContent(newTextContent)
+
+            if (diff === text.length) {
+              node.remove()
+            }
+            else {
+              const remainingText = text.slice(diff)
+              node.setTextContent(remainingText)
+            }
+
+            return
+          }
+        }
+      }
+      else if (prevMatch === null || prevMatch.start < previousText.length) {
+        return
+      }
+    }
+
+    while (true) {
+      match = getMatch(text)
+      let nextText = match === null ? '' : text.slice(match.end)
+      text = nextText
+
+      if (nextText === '') {
+        const nextSibling = currentNode.getNextSibling()
+
+        if ($isTextNode(nextSibling)) {
+          nextText = currentNode.getTextContent() + nextSibling.getTextContent()
+          const nextMatch = getMatch(nextText)
+
+          if (nextMatch === null) {
+            if (isTargetNode(nextSibling))
+              replaceWithSimpleText(nextSibling)
+            else
+              nextSibling.markDirty()
+
+            return
+          }
+          else if (nextMatch.start !== 0) {
+            return
+          }
+        }
+      }
+      else {
+        const nextMatch = getMatch(nextText)
+
+        if (nextMatch !== null && nextMatch.start === 0)
+          return
+      }
+
+      if (match === null)
+        return
+
+      if (match.start === 0 && $isTextNode(prevSibling) && prevSibling.isTextEntity())
+        continue
+
+      let nodeToReplace
+
+      if (match.start === 0)
+        [nodeToReplace, currentNode] = currentNode.splitText(match.end)
+      else
+        [, nodeToReplace, currentNode] = currentNode.splitText(match.start, match.end)
+
+      const replacementNode = createNode(nodeToReplace)
+      replacementNode.setFormat(nodeToReplace.getFormat())
+      nodeToReplace.replace(replacementNode)
+
+      if (currentNode == null)
+        return
+    }
+  }
+
+  const reverseNodeTransform = (node: T) => {
+    const text = node.getTextContent()
+    const match = getMatch(text)
+
+    if (match === null || match.start !== 0) {
+      replaceWithSimpleText(node)
+      return
+    }
+
+    if (text.length > match.end) {
+      // This will split out the rest of the text as simple text
+      node.splitText(match.end)
+      return
+    }
+
+    const prevSibling = node.getPreviousSibling()
+
+    if ($isTextNode(prevSibling) && prevSibling.isTextEntity()) {
+      replaceWithSimpleText(prevSibling)
+      replaceWithSimpleText(node)
+    }
+
+    const nextSibling = node.getNextSibling()
+
+    if ($isTextNode(nextSibling) && nextSibling.isTextEntity()) {
+      replaceWithSimpleText(nextSibling) // This may have already been converted in the previous block
+
+      if (isTargetNode(node))
+        replaceWithSimpleText(node)
+    }
+  }
+
+  const removePlainTextTransform = editor.registerNodeTransform(CustomTextNode, textNodeTransform)
+  const removeReverseNodeTransform = editor.registerNodeTransform(targetNode, reverseNodeTransform)
+  return [removePlainTextTransform, removeReverseNodeTransform]
+}
+
+export const decoratorTransform = (
+  node: CustomTextNode,
+  getMatch: (text: string) => null | EntityMatch,
+  createNode: (textNode: TextNode) => LexicalNode,
+) => {
+  if (!node.isSimpleText())
+    return
+
+  const prevSibling = node.getPreviousSibling()
+  let text = node.getTextContent()
+  let currentNode = node
+  let match
+
+  while (true) {
+    match = getMatch(text)
+    let nextText = match === null ? '' : text.slice(match.end)
+    text = nextText
+
+    if (nextText === '') {
+      const nextSibling = currentNode.getNextSibling()
+
+      if ($isTextNode(nextSibling)) {
+        nextText = currentNode.getTextContent() + nextSibling.getTextContent()
+        const nextMatch = getMatch(nextText)
+
+        if (nextMatch === null) {
+          nextSibling.markDirty()
+          return
+        }
+        else if (nextMatch.start !== 0) {
+          return
+        }
+      }
+    }
+    else {
+      const nextMatch = getMatch(nextText)
+
+      if (nextMatch !== null && nextMatch.start === 0)
+        return
+    }
+
+    if (match === null)
+      return
+
+    if (match.start === 0 && $isTextNode(prevSibling) && prevSibling.isTextEntity())
+      continue
+
+    let nodeToReplace
+
+    if (match.start === 0)
+      [nodeToReplace, currentNode] = currentNode.splitText(match.end)
+    else
+      [, nodeToReplace, currentNode] = currentNode.splitText(match.start, match.end)
+
+    const replacementNode = createNode(nodeToReplace)
+    nodeToReplace.replace(replacementNode)
+
+    if (currentNode == null)
+      return
+  }
+}
+
+function getFullMatchOffset(
+  documentText: string,
+  entryText: string,
+  offset: number,
+): number {
+  let triggerOffset = offset
+  for (let i = triggerOffset; i <= entryText.length; i++) {
+    if (documentText.substr(-i) === entryText.substr(0, i))
+      triggerOffset = i
+  }
+  return triggerOffset
+}
+
+export function $splitNodeContainingQuery(match: MenuTextMatch): TextNode | null {
+  const selection = $getSelection()
+  if (!$isRangeSelection(selection) || !selection.isCollapsed())
+    return null
+  const anchor = selection.anchor
+  if (anchor.type !== 'text')
+    return null
+  const anchorNode = anchor.getNode()
+  if (!anchorNode.isSimpleText())
+    return null
+  const selectionOffset = anchor.offset
+  const textContent = anchorNode.getTextContent().slice(0, selectionOffset)
+  const characterOffset = match.replaceableString.length
+  const queryOffset = getFullMatchOffset(
+    textContent,
+    match.matchingString,
+    characterOffset,
+  )
+  const startOffset = selectionOffset - queryOffset
+  if (startOffset < 0)
+    return null
+  let newNode
+  if (startOffset === 0)
+    [newNode] = anchorNode.splitText(selectionOffset)
+  else
+    [, newNode] = anchorNode.splitText(startOffset, selectionOffset)
+
+  return newNode
+}
+
+export function textToEditorState(text: string) {
+  const paragraph = text && (typeof text === 'string') ? text.split('\n') : ['']
+
+  return JSON.stringify({
+    root: {
+      children: paragraph.map((p) => {
+        return {
+          children: [{
+            detail: 0,
+            format: 0,
+            mode: 'normal',
+            style: '',
+            text: p,
+            type: 'custom-text',
+            version: 1,
+          }],
+          direction: 'ltr',
+          format: '',
+          indent: 0,
+          type: 'paragraph',
+          version: 1,
+        }
+      }),
+      direction: 'ltr',
+      format: '',
+      indent: 0,
+      type: 'root',
+      version: 1,
+    },
+  })
+}
diff --git a/app/components/base/prompt-log-modal/card.tsx b/app/components/base/prompt-log-modal/card.tsx
new file mode 100644
index 0000000..958a8fa
--- /dev/null
+++ b/app/components/base/prompt-log-modal/card.tsx
@@ -0,0 +1,42 @@
+import type { FC } from 'react'
+import { CopyFeedbackNew } from '@/app/components/base/copy-feedback'
+
+type CardProps = {
+  log: { role: string; text: string }[]
+}
+const Card: FC<CardProps> = ({
+  log,
+}) => {
+  return (
+    <>
+      {
+        log.length === 1 && (
+          <div className='px-4 py-2'>
+            <div className='whitespace-pre-line text-text-secondary'>
+              {log[0].text}
+            </div>
+          </div>
+        )
+      }
+      {
+        log.length > 1 && (
+          <div>
+            {
+              log.map((item, index) => (
+                <div key={index} className='group/card mb-2 rounded-xl px-4 pb-4 pt-2 last-of-type:mb-0 hover:bg-state-base-hover'>
+                  <div className='flex h-8 items-center justify-between'>
+                    <div className='font-semibold text-[#2D31A6]'>{item.role.toUpperCase()}</div>
+                    <CopyFeedbackNew className='hidden h-6 w-6 group-hover/card:block' content={item.text} />
+                  </div>
+                  <div className='whitespace-pre-line text-text-secondary'>{item.text}</div>
+                </div>
+              ))
+            }
+          </div>
+        )
+      }
+    </>
+  )
+}
+
+export default Card
diff --git a/app/components/base/prompt-log-modal/index.tsx b/app/components/base/prompt-log-modal/index.tsx
new file mode 100644
index 0000000..bd3097b
--- /dev/null
+++ b/app/components/base/prompt-log-modal/index.tsx
@@ -0,0 +1,72 @@
+import type { FC } from 'react'
+import { useEffect, useRef, useState } from 'react'
+import { useClickAway } from 'ahooks'
+import { RiCloseLine } from '@remixicon/react'
+import Card from './card'
+import { CopyFeedbackNew } from '@/app/components/base/copy-feedback'
+import type { IChatItem } from '@/app/components/base/chat/chat/type'
+
+type PromptLogModalProps = {
+  currentLogItem?: IChatItem
+  width: number
+  onCancel: () => void
+}
+const PromptLogModal: FC<PromptLogModalProps> = ({
+  currentLogItem,
+  width,
+  onCancel,
+}) => {
+  const ref = useRef(null)
+  const [mounted, setMounted] = useState(false)
+
+  useClickAway(() => {
+    if (mounted)
+      onCancel()
+  }, ref)
+
+  useEffect(() => {
+    setMounted(true)
+  }, [])
+
+  if (!currentLogItem || !currentLogItem.log)
+    return null
+
+  return (
+    <div
+      className='relative z-10 flex flex-col rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl'
+      style={{
+        width: 480,
+        position: 'fixed',
+        top: 56 + 8,
+        left: 8 + (width - 480),
+        bottom: 16,
+      }}
+      ref={ref}
+    >
+      <div className='flex h-14 shrink-0 items-center justify-between border-b border-divider-regular pl-6 pr-5'>
+        <div className='text-base font-semibold text-text-primary'>PROMPT LOG</div>
+        <div className='flex items-center'>
+          {
+            currentLogItem.log?.length === 1 && (
+              <>
+                <CopyFeedbackNew className='h-6 w-6' content={currentLogItem.log[0].text} />
+                <div className='mx-2.5 h-[14px] w-[1px] bg-divider-regular' />
+              </>
+            )
+          }
+          <div
+            onClick={onCancel}
+            className='flex h-6 w-6 cursor-pointer items-center justify-center'
+          >
+            <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+        </div>
+      </div>
+      <div className='grow overflow-y-auto p-2'>
+        <Card log={currentLogItem.log} />
+      </div>
+    </div>
+  )
+}
+
+export default PromptLogModal
diff --git a/app/components/base/qrcode/index.tsx b/app/components/base/qrcode/index.tsx
new file mode 100644
index 0000000..278176e
--- /dev/null
+++ b/app/components/base/qrcode/index.tsx
@@ -0,0 +1,80 @@
+'use client'
+import React, { useEffect, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiQrCodeLine,
+} from '@remixicon/react'
+import { QRCodeCanvas as QRCode } from 'qrcode.react'
+import ActionButton from '@/app/components/base/action-button'
+import Tooltip from '@/app/components/base/tooltip'
+
+type Props = {
+  content: string
+}
+
+const prefixEmbedded = 'appOverview.overview.appInfo.qrcode.title'
+
+const ShareQRCode = ({ content }: Props) => {
+  const { t } = useTranslation()
+  const [isShow, setIsShow] = useState<boolean>(false)
+  const qrCodeRef = useRef<HTMLDivElement>(null)
+
+  const toggleQRCode = (event: React.MouseEvent) => {
+    event.stopPropagation()
+    setIsShow(prev => !prev)
+  }
+
+  useEffect(() => {
+    const handleClickOutside = (event: MouseEvent) => {
+      if (qrCodeRef.current && !qrCodeRef.current.contains(event.target as Node))
+        setIsShow(false)
+    }
+
+    if (isShow)
+      document.addEventListener('click', handleClickOutside)
+
+    return () => {
+      document.removeEventListener('click', handleClickOutside)
+    }
+  }, [isShow])
+
+  const downloadQR = () => {
+    const canvas = document.getElementsByTagName('canvas')[0]
+    const link = document.createElement('a')
+    link.download = 'qrcode.png'
+    link.href = canvas.toDataURL()
+    link.click()
+  }
+
+  const handlePanelClick = (event: React.MouseEvent) => {
+    event.stopPropagation()
+  }
+
+  return (
+    <Tooltip
+      popupContent={t(`${prefixEmbedded}`) || ''}
+    >
+      <div className='relative h-6 w-6' onClick={toggleQRCode}>
+        <ActionButton>
+          <RiQrCodeLine className='h-4 w-4' />
+        </ActionButton>
+        {isShow && (
+          <div
+            ref={qrCodeRef}
+            className='absolute -right-8 top-8 z-10 flex w-[232px] flex-col items-center rounded-lg bg-components-panel-bg p-4 shadow-xs'
+            onClick={handlePanelClick}
+          >
+            <QRCode size={160} value={content} className='mb-2' />
+            <div className='system-xs-regular flex items-center'>
+              <div className='text-text-tertiary'>{t('appOverview.overview.appInfo.qrcode.scan')}</div>
+              <div className='text-text-tertiary'>路</div>
+              <div className='cursor-pointer text-text-accent-secondary' onClick={downloadQR}>{t('appOverview.overview.appInfo.qrcode.download')}</div>
+            </div>
+          </div>
+        )}
+      </div>
+    </Tooltip>
+  )
+}
+
+export default ShareQRCode
diff --git a/app/components/base/radio-card/index.tsx b/app/components/base/radio-card/index.tsx
new file mode 100644
index 0000000..4178972
--- /dev/null
+++ b/app/components/base/radio-card/index.tsx
@@ -0,0 +1,68 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+import { noop } from 'lodash-es'
+
+type Props = {
+  className?: string
+  icon: React.ReactNode
+  iconBgClassName?: string
+  title: React.ReactNode
+  description: string
+  noRadio?: boolean
+  isChosen?: boolean
+  onChosen?: () => void
+  chosenConfig?: React.ReactNode
+  chosenConfigWrapClassName?: string
+}
+
+const RadioCard: FC<Props> = ({
+  icon,
+  iconBgClassName = 'bg-[#F5F3FF]',
+  title,
+  description,
+  noRadio,
+  isChosen,
+  onChosen = noop,
+  chosenConfig,
+  chosenConfigWrapClassName,
+  className,
+}) => {
+  return (
+    <div
+      className={cn(
+        'relative cursor-pointer rounded-xl border-[0.5px] border-components-option-card-option-border bg-components-option-card-option-bg p-3',
+        isChosen && 'border-[1.5px] bg-components-option-card-option-selected-bg',
+        className,
+      )}
+    >
+      <div className='flex gap-x-2' onClick={onChosen}>
+        <div className={cn(iconBgClassName, 'flex size-8 shrink-0 items-center justify-center rounded-lg shadow-md')}>
+          {icon}
+        </div>
+        <div className='grow'>
+          <div className='system-sm-semibold mb-1 text-text-secondary'>{title}</div>
+          <div className='system-xs-regular text-text-tertiary'>{description}</div>
+        </div>
+        {!noRadio && (
+          <div className='absolute right-3 top-3'>
+            <div className={cn(
+              'h-4 w-4 rounded-full border border-components-radio-border bg-components-radio-bg shadow-xs',
+              isChosen && 'border-[5px] border-components-radio-border-checked',
+            )}></div>
+          </div>
+        )}
+      </div>
+      {((isChosen && chosenConfig) || noRadio) && (
+        <div className='mt-2 flex gap-x-2'>
+          <div className='size-8 shrink-0'></div>
+          <div className={cn(chosenConfigWrapClassName, 'grow')}>
+            {chosenConfig}
+          </div>
+        </div>
+      )}
+    </div>
+  )
+}
+export default React.memo(RadioCard)
diff --git a/app/components/base/radio-card/simple/index.tsx b/app/components/base/radio-card/simple/index.tsx
new file mode 100644
index 0000000..7bb5c0f
--- /dev/null
+++ b/app/components/base/radio-card/simple/index.tsx
@@ -0,0 +1,45 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import s from './style.module.css'
+import cn from '@/utils/classnames'
+
+type Props = {
+  className?: string
+  title: string | React.JSX.Element | null
+  description: string
+  isChosen: boolean
+  onChosen: () => void
+  chosenConfig?: React.ReactNode
+  icon?: React.JSX.Element
+  extra?: React.ReactNode
+}
+
+const RadioCard: FC<Props> = ({
+  title,
+  description,
+  isChosen,
+  onChosen,
+  icon,
+  extra,
+}) => {
+  return (
+    <div
+      className={cn(s.item, isChosen && s.active)}
+      onClick={onChosen}
+    >
+      <div className='flex px-3 py-2'>
+        {icon}
+        <div>
+          <div className='flex items-center justify-between'>
+            <div className='text-sm font-medium leading-5 text-gray-900'>{title}</div>
+            <div className={s.radio}></div>
+          </div>
+          <div className='text-xs font-normal leading-[18px] text-gray-500'>{description}</div>
+        </div>
+      </div>
+      {extra}
+    </div>
+  )
+}
+export default React.memo(RadioCard)
diff --git a/app/components/base/radio-card/simple/style.module.css b/app/components/base/radio-card/simple/style.module.css
new file mode 100644
index 0000000..93a0f43
--- /dev/null
+++ b/app/components/base/radio-card/simple/style.module.css
@@ -0,0 +1,25 @@
+.item {
+  @apply relative rounded-xl border border-gray-100 cursor-pointer;
+  background-color: #fcfcfd;
+}
+
+.item.active {
+  border-width: 1.5px;
+  border-color: #528BFF;
+  box-shadow: 0px 1px 3px rgba(16, 24, 40, 0.1), 0px 1px 2px rgba(16, 24, 40, 0.06);
+}
+
+.item:hover {
+  background-color: #ffffff;
+  border-color: #B2CCFF;
+  box-shadow: 0px 12px 16px -4px rgba(16, 24, 40, 0.08), 0px 4px 6px -2px rgba(16, 24, 40, 0.03);
+}
+
+.radio {
+  @apply w-4 h-4 border-[2px] border-gray-200 rounded-full;
+}
+
+.item.active .radio {
+  border-width: 5px;
+  border-color: #155EEF;
+}
diff --git a/app/components/base/radio/component/group/index.tsx b/app/components/base/radio/component/group/index.tsx
new file mode 100644
index 0000000..088aec7
--- /dev/null
+++ b/app/components/base/radio/component/group/index.tsx
@@ -0,0 +1,24 @@
+import type { ReactNode } from 'react'
+import RadioGroupContext from '../../context'
+import s from '../../style.module.css'
+import cn from '@/utils/classnames'
+
+export type TRadioGroupProps = {
+  children?: ReactNode | ReactNode[]
+  value?: string | number
+  className?: string
+  onChange?: (value: any) => void
+}
+
+export default function Group({ children, value, onChange, className = '' }: TRadioGroupProps): React.JSX.Element {
+  const onRadioChange = (value: any) => {
+    onChange?.(value)
+  }
+  return (
+    <div className={cn('flex items-center bg-gray-50', s.container, className)}>
+      <RadioGroupContext.Provider value={{ value, onChange: onRadioChange }}>
+        {children}
+      </RadioGroupContext.Provider>
+    </div>
+  )
+}
diff --git a/app/components/base/radio/component/radio/index.tsx b/app/components/base/radio/component/radio/index.tsx
new file mode 100644
index 0000000..eddc53d
--- /dev/null
+++ b/app/components/base/radio/component/radio/index.tsx
@@ -0,0 +1,63 @@
+import type { ReactNode } from 'react'
+import { useId } from 'react'
+import { useContext } from 'use-context-selector'
+import RadioGroupContext from '../../context'
+import s from '../../style.module.css'
+import cn from '@/utils/classnames'
+
+export type IRadioProps = {
+  className?: string
+  labelClassName?: string
+  children?: string | ReactNode
+  checked?: boolean
+  value?: string | number
+  disabled?: boolean
+  onChange?: (e?: IRadioProps['value']) => void
+}
+
+export default function Radio({
+  className = '',
+  labelClassName,
+  children = '',
+  checked,
+  value,
+  disabled,
+  onChange,
+}: IRadioProps): React.JSX.Element {
+  const groupContext = useContext(RadioGroupContext)
+  const labelId = useId()
+  const handleChange = (e: IRadioProps['value']) => {
+    if (disabled)
+      return
+
+    onChange?.(e)
+    groupContext?.onChange(e)
+  }
+
+  const isChecked = groupContext ? groupContext.value === value : checked
+  const divClassName = `
+    flex items-center py-1 relative
+    px-7 cursor-pointer hover:bg-gray-200 rounded
+  `
+
+  return (
+    <div className={cn(
+      s.label,
+      disabled ? s.disabled : '',
+      isChecked ? 'bg-white shadow' : '',
+      divClassName,
+      className)}
+    onClick={() => handleChange(value)}
+    >
+      {children && (
+        <label className={
+          cn(labelClassName, 'cursor-pointer text-sm')
+        }
+        id={labelId}
+        >
+          {children}
+        </label>
+      )}
+    </div>
+  )
+}
diff --git a/app/components/base/radio/context/index.tsx b/app/components/base/radio/context/index.tsx
new file mode 100644
index 0000000..10d1193
--- /dev/null
+++ b/app/components/base/radio/context/index.tsx
@@ -0,0 +1,6 @@
+'use client'
+
+import { createContext } from 'use-context-selector'
+
+const RadioGroupContext = createContext<any>(null)
+export default RadioGroupContext
diff --git a/app/components/base/radio/index.tsx b/app/components/base/radio/index.tsx
new file mode 100644
index 0000000..9aed850
--- /dev/null
+++ b/app/components/base/radio/index.tsx
@@ -0,0 +1,15 @@
+import type React from 'react'
+import type { IRadioProps } from './component/radio'
+import RadioComps from './component/radio'
+import Group from './component/group'
+
+type CompoundedComponent = {
+  Group: typeof Group
+} & React.ForwardRefExoticComponent<IRadioProps & React.RefAttributes<HTMLElement>>
+
+const Radio = RadioComps as CompoundedComponent
+/**
+ * Radio 缁勪欢鍑虹幇涓�鑸槸浠ヤ竴缁勭殑褰㈠紡鍑虹幇
+ */
+Radio.Group = Group
+export default Radio
diff --git a/app/components/base/radio/style.module.css b/app/components/base/radio/style.module.css
new file mode 100644
index 0000000..3e6bcdf
--- /dev/null
+++ b/app/components/base/radio/style.module.css
@@ -0,0 +1,13 @@
+.container {
+    padding: 4px;
+    border-radius: 4px;
+}
+
+.label {
+    position: relative;
+    margin-right: 3px;
+}
+
+.label:last-child {
+    margin-right: 0;
+}
diff --git a/app/components/base/radio/ui.tsx b/app/components/base/radio/ui.tsx
new file mode 100644
index 0000000..178262d
--- /dev/null
+++ b/app/components/base/radio/ui.tsx
@@ -0,0 +1,18 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+
+type Props = {
+  isChecked: boolean
+}
+
+const RadioUI: FC<Props> = ({
+  isChecked,
+}) => {
+  return (
+    <div className={cn(isChecked ? 'border-[5px] border-components-radio-border-checked' : 'border-[2px] border-components-radio-border', 'h-4 w-4  rounded-full')}>
+    </div>
+  )
+}
+export default React.memo(RadioUI)
diff --git a/app/components/base/search-input/index.tsx b/app/components/base/search-input/index.tsx
new file mode 100644
index 0000000..cf9bc1c
--- /dev/null
+++ b/app/components/base/search-input/index.tsx
@@ -0,0 +1,77 @@
+import type { FC } from 'react'
+import { useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiCloseCircleFill, RiSearchLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+
+type SearchInputProps = {
+  placeholder?: string
+  className?: string
+  value: string
+  onChange: (v: string) => void
+  white?: boolean
+}
+
+const SearchInput: FC<SearchInputProps> = ({
+  placeholder,
+  className,
+  value,
+  onChange,
+  white,
+}) => {
+  const { t } = useTranslation()
+  const [focus, setFocus] = useState<boolean>(false)
+  const isComposing = useRef<boolean>(false)
+  const [internalValue, setInternalValue] = useState<string>(value)
+
+  return (
+    <div className={cn(
+      'group flex h-8 items-center overflow-hidden rounded-lg border-none bg-components-input-bg-normal px-2 hover:bg-components-input-bg-hover',
+      focus && '!bg-components-input-bg-active',
+      white && '!border-gray-300 !bg-white shadow-xs hover:!border-gray-300 hover:!bg-white',
+      className,
+    )}>
+      <div className="pointer-events-none mr-1.5 flex h-4 w-4 shrink-0 items-center justify-center">
+        <RiSearchLine className="h-4 w-4 text-components-input-text-placeholder" aria-hidden="true" />
+      </div>
+      <input
+        type="text"
+        name="query"
+        className={cn(
+          'system-sm-regular caret-#295EFF block h-[18px] grow appearance-none border-0 bg-transparent text-components-input-text-filled outline-none placeholder:text-components-input-text-placeholder',
+          white && '!bg-white placeholder:!text-gray-400 hover:!bg-white group-hover:!bg-white',
+        )}
+        placeholder={placeholder || t('common.operation.search')!}
+        value={internalValue}
+        onChange={(e) => {
+          setInternalValue(e.target.value)
+          if (!isComposing.current)
+            onChange(e.target.value)
+        }}
+        onCompositionStart={() => {
+          isComposing.current = true
+        }}
+        onCompositionEnd={(e) => {
+          isComposing.current = false
+          onChange(e.data)
+        }}
+        onFocus={() => setFocus(true)}
+        onBlur={() => setFocus(false)}
+        autoComplete="off"
+      />
+      {value && (
+        <div
+          className='group/clear flex h-4 w-4 shrink-0 cursor-pointer items-center justify-center'
+          onClick={() => {
+            onChange('')
+            setInternalValue('')
+          }}
+        >
+          <RiCloseCircleFill className='h-4 w-4 text-text-quaternary group-hover/clear:text-text-tertiary' />
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default SearchInput
diff --git a/app/components/base/segmented-control/index.tsx b/app/components/base/segmented-control/index.tsx
new file mode 100644
index 0000000..bd921e4
--- /dev/null
+++ b/app/components/base/segmented-control/index.tsx
@@ -0,0 +1,68 @@
+import React from 'react'
+import classNames from '@/utils/classnames'
+import type { RemixiconComponentType } from '@remixicon/react'
+import Divider from '../divider'
+
+// Updated generic type to allow enum values
+type SegmentedControlProps<T extends string | number | symbol> = {
+  options: { Icon: RemixiconComponentType, text: string, value: T }[]
+  value: T
+  onChange: (value: T) => void
+  className?: string
+}
+
+export const SegmentedControl = <T extends string | number | symbol>({
+  options,
+  value,
+  onChange,
+  className,
+}: SegmentedControlProps<T>): JSX.Element => {
+  const selectedOptionIndex = options.findIndex(option => option.value === value)
+
+  return (
+    <div className={classNames(
+      'flex items-center rounded-lg bg-components-segmented-control-bg-normal gap-x-[1px] p-0.5',
+      className,
+    )}>
+      {options.map((option, index) => {
+        const { Icon } = option
+        const isSelected = index === selectedOptionIndex
+        const isNextSelected = index === selectedOptionIndex - 1
+        const isLast = index === options.length - 1
+        return (
+          <button
+            type='button'
+            key={String(option.value)}
+            className={classNames(
+              'flex items-center justify-center relative px-2 py-1 rounded-lg gap-x-0.5 group border-0.5 border-transparent',
+              isSelected
+                ? 'border-components-segmented-control-item-active-border bg-components-segmented-control-item-active-bg shadow-xs shadow-shadow-shadow-3'
+                : 'hover:bg-state-base-hover',
+            )}
+            onClick={() => onChange(option.value)}
+          >
+            <span className='flex h-5 w-5 items-center justify-center'>
+              <Icon className={classNames(
+                'w-4 h-4 text-text-tertiary',
+                isSelected ? 'text-text-accent-light-mode-only' : 'group-hover:text-text-secondary',
+              )} />
+            </span>
+            <span className={classNames(
+              'p-0.5 text-text-tertiary system-sm-medium',
+              isSelected ? 'text-text-accent-light-mode-only' : 'group-hover:text-text-secondary',
+            )}>
+              {option.text}
+            </span>
+            {!isLast && !isSelected && !isNextSelected && (
+              <div className='absolute right-[-1px] top-0 flex h-full items-center'>
+                <Divider type='vertical' className='mx-0 h-3.5' />
+              </div>
+            )}
+          </button>
+        )
+      })}
+    </div>
+  )
+}
+
+export default React.memo(SegmentedControl) as typeof SegmentedControl
diff --git a/app/components/base/select/index.tsx b/app/components/base/select/index.tsx
new file mode 100644
index 0000000..fa8730f
--- /dev/null
+++ b/app/components/base/select/index.tsx
@@ -0,0 +1,382 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import { Combobox, ComboboxButton, ComboboxInput, ComboboxOption, ComboboxOptions, Listbox, ListboxButton, ListboxOption, ListboxOptions } from '@headlessui/react'
+import { ChevronDownIcon, ChevronUpIcon, XMarkIcon } from '@heroicons/react/20/solid'
+import Badge from '../badge/index'
+import { RiCheckLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import classNames from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+
+const defaultItems = [
+  { value: 1, name: 'option1' },
+  { value: 2, name: 'option2' },
+  { value: 3, name: 'option3' },
+  { value: 4, name: 'option4' },
+  { value: 5, name: 'option5' },
+  { value: 6, name: 'option6' },
+  { value: 7, name: 'option7' },
+]
+
+export type Item = {
+  value: number | string
+  name: string
+} & Record<string, any>
+
+export type ISelectProps = {
+  className?: string
+  wrapperClassName?: string
+  renderTrigger?: (value: Item | null) => React.JSX.Element | null
+  items?: Item[]
+  defaultValue?: number | string
+  disabled?: boolean
+  onSelect: (value: Item) => void
+  allowSearch?: boolean
+  bgClassName?: string
+  placeholder?: string
+  overlayClassName?: string
+  optionWrapClassName?: string
+  optionClassName?: string
+  hideChecked?: boolean
+  notClearable?: boolean
+  renderOption?: ({
+    item,
+    selected,
+  }: {
+    item: Item
+    selected: boolean
+  }) => React.ReactNode
+}
+const Select: FC<ISelectProps> = ({
+  className,
+  items = defaultItems,
+  defaultValue = 1,
+  disabled = false,
+  onSelect,
+  allowSearch = true,
+  bgClassName = 'bg-components-input-bg-normal',
+  overlayClassName,
+  optionClassName,
+  renderOption,
+}) => {
+  const [query, setQuery] = useState('')
+  const [open, setOpen] = useState(false)
+
+  const [selectedItem, setSelectedItem] = useState<Item | null>(null)
+  useEffect(() => {
+    let defaultSelect = null
+    const existed = items.find((item: Item) => item.value === defaultValue)
+    if (existed)
+      defaultSelect = existed
+
+    setSelectedItem(defaultSelect)
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [defaultValue])
+
+  const filteredItems: Item[]
+    = query === ''
+      ? items
+      : items.filter((item) => {
+        return item.name.toLowerCase().includes(query.toLowerCase())
+      })
+
+  return (
+    <Combobox
+      as="div"
+      disabled={disabled}
+      value={selectedItem}
+      className={className}
+      onChange={(value: Item) => {
+        if (!disabled) {
+          setSelectedItem(value)
+          setOpen(false)
+          onSelect(value)
+        }
+      }}>
+      <div className={classNames('relative')}>
+        <div className='group text-text-secondary'>
+          {allowSearch
+            ? <ComboboxInput
+              className={`w-full rounded-lg border-0 ${bgClassName} py-1.5 pl-3 pr-10 shadow-sm focus-visible:bg-state-base-hover focus-visible:outline-none group-hover:bg-state-base-hover sm:text-sm sm:leading-6 ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`}
+              onChange={(event) => {
+                if (!disabled)
+                  setQuery(event.target.value)
+              }}
+              displayValue={(item: Item) => item?.name}
+            />
+            : <ComboboxButton onClick={
+              () => {
+                if (!disabled)
+                  setOpen(!open)
+              }
+            } className={classNames(`flex items-center h-9 w-full rounded-lg border-0 ${bgClassName} py-1.5 pl-3 pr-10 shadow-sm sm:text-sm sm:leading-6 focus-visible:outline-none focus-visible:bg-state-base-hover group-hover:bg-state-base-hover`, optionClassName)}>
+              <div className='w-0 grow truncate text-left' title={selectedItem?.name}>{selectedItem?.name}</div>
+            </ComboboxButton>}
+          <ComboboxButton className="absolute inset-y-0 right-0 flex items-center rounded-r-md px-2 focus:outline-none" onClick={
+            () => {
+              if (!disabled)
+                setOpen(!open)
+            }
+          }>
+            {open ? <ChevronUpIcon className="h-5 w-5" /> : <ChevronDownIcon className="h-5 w-5" />}
+          </ComboboxButton>
+        </div>
+
+        {(filteredItems.length > 0 && open) && (
+          <ComboboxOptions className={`absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md border-[0.5px] border-components-panel-border bg-components-panel-bg-blur px-1 py-1 text-base shadow-lg backdrop-blur-sm focus:outline-none sm:text-sm ${overlayClassName}`}>
+            {filteredItems.map((item: Item) => (
+              <ComboboxOption
+                key={item.value}
+                value={item}
+                className={({ active }: { active: boolean }) =>
+                  classNames(
+                    'relative cursor-default select-none py-2 pl-3 pr-9 rounded-lg hover:bg-state-base-hover text-text-secondary',
+                    active ? 'bg-state-base-hover' : '',
+                    optionClassName,
+                  )
+                }
+              >
+                {({ /* active, */ selected }) => (
+                  <>
+                    {renderOption
+                      ? renderOption({ item, selected })
+                      : (
+                        <>
+                          <span className={classNames('block', selected && 'font-normal')}>{item.name}</span>
+                          {selected && (
+                            <span
+                              className={classNames(
+                                'absolute inset-y-0 right-0 flex items-center pr-4 text-text-secondary',
+                              )}
+                            >
+                              <RiCheckLine className="h-4 w-4" aria-hidden="true" />
+                            </span>
+                          )}
+                        </>
+                      )}
+                  </>
+                )}
+              </ComboboxOption>
+            ))}
+          </ComboboxOptions>
+        )}
+      </div>
+    </Combobox >
+  )
+}
+
+const SimpleSelect: FC<ISelectProps> = ({
+  className,
+  wrapperClassName = '',
+  renderTrigger,
+  items = defaultItems,
+  defaultValue = 1,
+  disabled = false,
+  onSelect,
+  placeholder,
+  optionWrapClassName,
+  optionClassName,
+  hideChecked,
+  notClearable,
+  renderOption,
+}) => {
+  const { t } = useTranslation()
+  const localPlaceholder = placeholder || t('common.placeholder.select')
+
+  const [selectedItem, setSelectedItem] = useState<Item | null>(null)
+  useEffect(() => {
+    let defaultSelect = null
+    const existed = items.find((item: Item) => item.value === defaultValue)
+    if (existed)
+      defaultSelect = existed
+
+    setSelectedItem(defaultSelect)
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [defaultValue])
+
+  return (
+    <Listbox
+      value={selectedItem}
+      onChange={(value: Item) => {
+        if (!disabled) {
+          setSelectedItem(value)
+          onSelect(value)
+        }
+      }}
+    >
+      <div className={classNames('group/simple-select relative h-9', wrapperClassName)}>
+        {renderTrigger && <ListboxButton className='w-full'>{renderTrigger(selectedItem)}</ListboxButton>}
+        {!renderTrigger && (
+          <ListboxButton className={classNames(`flex items-center w-full h-full rounded-lg border-0 bg-components-input-bg-normal pl-3 pr-10 sm:text-sm sm:leading-6 focus-visible:outline-none focus-visible:bg-state-base-hover-alt group-hover/simple-select:bg-state-base-hover-alt ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}`, className)}>
+            <span className={classNames('block truncate text-left system-sm-regular text-components-input-text-filled', !selectedItem?.name && 'text-components-input-text-placeholder')}>{selectedItem?.name ?? localPlaceholder}</span>
+            <span className="absolute inset-y-0 right-0 flex items-center pr-2">
+              {(selectedItem && !notClearable)
+                ? (
+                  <XMarkIcon
+                    onClick={(e) => {
+                      e.stopPropagation()
+                      setSelectedItem(null)
+                      onSelect({ name: '', value: '' })
+                    }}
+                    className="h-4 w-4 cursor-pointer text-text-quaternary"
+                    aria-hidden="false"
+                  />
+                )
+                : (
+                  <ChevronDownIcon
+                    className="h-4 w-4 text-text-quaternary group-hover/simple-select:text-text-secondary"
+                    aria-hidden="true"
+                  />
+                )}
+            </span>
+          </ListboxButton>
+        )}
+
+        {!disabled && (
+          <ListboxOptions className={classNames('absolute z-10 mt-1 px-1 max-h-60 w-full overflow-auto rounded-xl bg-components-panel-bg-blur backdrop-blur-sm py-1 text-base shadow-lg border-components-panel-border border-[0.5px] focus:outline-none sm:text-sm', optionWrapClassName)}>
+            {items.map((item: Item) => (
+              <ListboxOption
+                key={item.value}
+                className={
+                  classNames(
+                    'relative cursor-pointer select-none py-2 pl-3 pr-9 rounded-lg hover:bg-state-base-hover text-text-secondary',
+                    optionClassName,
+                  )
+                }
+                value={item}
+                disabled={disabled}
+              >
+                {({ /* active, */ selected }) => (
+                  <>
+                    {renderOption
+                      ? renderOption({ item, selected })
+                      : (<>
+                        <span className={classNames('block', selected && 'font-normal')}>{item.name}</span>
+                        {selected && !hideChecked && (
+                          <span
+                            className={classNames(
+                              'absolute inset-y-0 right-0 flex items-center pr-4 text-text-accent',
+                            )}
+                          >
+                            <RiCheckLine className="h-4 w-4" aria-hidden="true" />
+                          </span>
+                        )}
+                      </>)}
+                  </>
+                )}
+              </ListboxOption>
+            ))}
+          </ListboxOptions>
+        )}
+      </div>
+    </Listbox>
+  )
+}
+
+type PortalSelectProps = {
+  value: string | number
+  onSelect: (value: Item) => void
+  items: Item[]
+  placeholder?: string
+  installedValue?: string | number
+  renderTrigger?: (value?: Item) => React.JSX.Element | null
+  triggerClassName?: string
+  triggerClassNameFn?: (open: boolean) => string
+  popupClassName?: string
+  popupInnerClassName?: string
+  readonly?: boolean
+  hideChecked?: boolean
+}
+const PortalSelect: FC<PortalSelectProps> = ({
+  value,
+  onSelect,
+  items,
+  placeholder,
+  installedValue,
+  renderTrigger,
+  triggerClassName,
+  triggerClassNameFn,
+  popupClassName,
+  popupInnerClassName,
+  readonly,
+  hideChecked,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const localPlaceholder = placeholder || t('common.placeholder.select')
+  const selectedItem = value ? items.find(item => item.value === value) : undefined
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <PortalToFollowElemTrigger onClick={() => !readonly && setOpen(v => !v)} className='w-full'>
+        {renderTrigger
+          ? renderTrigger(selectedItem)
+          : (
+            <div
+              className={classNames(`
+            group flex items-center justify-between px-2.5 h-9 rounded-lg border-0 bg-components-input-bg-normal hover:bg-state-base-hover-alt text-sm ${readonly ? 'cursor-not-allowed' : 'cursor-pointer'}
+          `, triggerClassName, triggerClassNameFn?.(open))}
+              title={selectedItem?.name}
+            >
+              <span
+                className={`
+              grow truncate
+              ${!selectedItem?.name && 'text-components-input-text-placeholder'}
+            `}
+              >
+                {selectedItem?.name ?? localPlaceholder}
+              </span>
+              <div className='mx-0.5'>{installedValue && selectedItem && selectedItem.value !== installedValue && <Badge>{installedValue} {'->'} {selectedItem.value} </Badge>}</div>
+              <ChevronDownIcon className='h-4 w-4 shrink-0 text-text-quaternary group-hover:text-text-secondary' />
+            </div>
+          )}
+
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className={`z-20 ${popupClassName}`}>
+        <div
+          className={classNames('px-1 py-1 max-h-60 overflow-auto rounded-md text-base shadow-lg border-components-panel-border bg-components-panel-bg border-[0.5px] focus:outline-none sm:text-sm', popupInnerClassName)}
+        >
+          {items.map((item: Item) => (
+            <div
+              key={item.value}
+              className={`
+                flex h-9 cursor-pointer items-center justify-between rounded-lg px-2.5 text-text-secondary hover:bg-state-base-hover
+                ${item.value === value && 'bg-state-base-hover'}
+              `}
+              title={item.name}
+              onClick={() => {
+                onSelect(item)
+                setOpen(false)
+              }}
+            >
+              <span
+                className='w-0 grow truncate'
+                title={item.name}
+              >
+                <span className='truncate'>{item.name}</span>
+                {item.value === installedValue && (
+                  <Badge uppercase={true} className='ml-1 shrink-0'>INSTALLED</Badge>
+                )}
+              </span>
+              {!hideChecked && item.value === value && (
+                <RiCheckLine className='h-4 w-4 shrink-0 text-text-accent' />
+              )}
+            </div>
+          ))}
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export { SimpleSelect, PortalSelect }
+export default React.memo(Select)
diff --git a/app/components/base/select/locale.tsx b/app/components/base/select/locale.tsx
new file mode 100644
index 0000000..8981f09
--- /dev/null
+++ b/app/components/base/select/locale.tsx
@@ -0,0 +1,61 @@
+'use client'
+import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react'
+import { Fragment } from 'react'
+import { GlobeAltIcon } from '@heroicons/react/24/outline'
+
+type ISelectProps = {
+  items: Array<{ value: string; name: string }>
+  value?: string
+  className?: string
+  onChange?: (value: string) => void
+}
+
+export default function Select({
+  items,
+  value,
+  onChange,
+}: ISelectProps) {
+  const item = items.filter(item => item.value === value)[0]
+
+  return (
+    <div className="w-56 text-right">
+      <Menu as="div" className="relative inline-block text-left">
+        <div>
+          <MenuButton className="h-[44px]justify-center inline-flex w-full items-center rounded-lg border border-components-button-secondary-border px-[10px] py-[6px] text-[13px] font-medium text-text-primary hover:bg-state-base-hover">
+            <GlobeAltIcon className="mr-1 h-5 w-5" aria-hidden="true" />
+            {item?.name}
+          </MenuButton>
+        </div>
+        <Transition
+          as={Fragment}
+          enter="transition ease-out duration-100"
+          enterFrom="transform opacity-0 scale-95"
+          enterTo="transform opacity-100 scale-100"
+          leave="transition ease-in duration-75"
+          leaveFrom="transform opacity-100 scale-100"
+          leaveTo="transform opacity-0 scale-95"
+        >
+          <MenuItems className="absolute right-0 z-10 mt-2 w-[200px] origin-top-right divide-y divide-divider-regular rounded-md bg-components-panel-bg shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none">
+            <div className="px-1 py-1 ">
+              {items.map((item) => {
+                return <MenuItem key={item.value}>
+                  <button
+                    className={'group flex w-full items-center rounded-lg px-3 py-2 text-sm text-text-secondary data-[active]:bg-state-base-hover'}
+                    onClick={(evt) => {
+                      evt.preventDefault()
+                      onChange && onChange(item.value)
+                    }}
+                  >
+                    {item.name}
+                  </button>
+                </MenuItem>
+              })}
+
+            </div>
+
+          </MenuItems>
+        </Transition>
+      </Menu>
+    </div>
+  )
+}
diff --git a/app/components/base/select/pure.tsx b/app/components/base/select/pure.tsx
new file mode 100644
index 0000000..81cc2fb
--- /dev/null
+++ b/app/components/base/select/pure.tsx
@@ -0,0 +1,157 @@
+import {
+  useCallback,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowDownSLine,
+  RiCheckLine,
+} from '@remixicon/react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import type {
+  PortalToFollowElemOptions,
+} from '@/app/components/base/portal-to-follow-elem'
+import cn from '@/utils/classnames'
+
+type Option = {
+  label: string
+  value: string
+}
+
+type PureSelectProps = {
+  options: Option[]
+  value?: string
+  onChange?: (value: string) => void
+  containerProps?: PortalToFollowElemOptions & {
+    open?: boolean
+    onOpenChange?: (open: boolean) => void
+  }
+  triggerProps?: {
+    className?: string
+  },
+  popupProps?: {
+    wrapperClassName?: string
+    className?: string
+    itemClassName?: string
+    title?: string
+  },
+}
+const PureSelect = ({
+  options,
+  value,
+  onChange,
+  containerProps,
+  triggerProps,
+  popupProps,
+}: PureSelectProps) => {
+  const { t } = useTranslation()
+  const {
+    open,
+    onOpenChange,
+    placement,
+    offset,
+  } = containerProps || {}
+  const {
+    className: triggerClassName,
+  } = triggerProps || {}
+  const {
+    wrapperClassName: popupWrapperClassName,
+    className: popupClassName,
+    itemClassName: popupItemClassName,
+    title: popupTitle,
+  } = popupProps || {}
+
+  const [localOpen, setLocalOpen] = useState(false)
+  const mergedOpen = open ?? localOpen
+
+  const handleOpenChange = useCallback((openValue: boolean) => {
+    onOpenChange?.(openValue)
+    setLocalOpen(openValue)
+  }, [onOpenChange])
+
+  const selectedOption = options.find(option => option.value === value)
+  const triggerText = selectedOption?.label || t('common.placeholder.select')
+
+  return (
+    <PortalToFollowElem
+      placement={placement || 'bottom-start'}
+      offset={offset || 4}
+      open={mergedOpen}
+      onOpenChange={handleOpenChange}
+    >
+      <PortalToFollowElemTrigger
+        onClick={() => handleOpenChange(!mergedOpen)}
+        asChild
+      >
+        <div
+          className={cn(
+            'system-sm-regular group flex h-8 cursor-pointer items-center rounded-lg bg-components-input-bg-normal px-2 text-components-input-text-filled hover:bg-state-base-hover-alt',
+            mergedOpen && 'bg-state-base-hover-alt',
+            triggerClassName,
+          )}
+        >
+          <div
+            className='grow'
+            title={triggerText}
+          >
+            {triggerText}
+          </div>
+          <RiArrowDownSLine
+            className={cn(
+              'h-4 w-4 shrink-0 text-text-quaternary group-hover:text-text-secondary',
+              mergedOpen && 'text-text-secondary',
+            )}
+          />
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className={cn(
+        'z-10',
+        popupWrapperClassName,
+      )}>
+        <div
+          className={cn(
+            'rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg',
+            popupClassName,
+          )}
+        >
+          {
+            popupTitle && (
+              <div className='system-xs-medium-uppercase flex h-[22px] items-center px-3 text-text-tertiary'>
+                {popupTitle}
+              </div>
+            )
+          }
+          {
+            options.map(option => (
+              <div
+                key={option.value}
+                className={cn(
+                  'system-sm-medium flex h-8 cursor-pointer items-center rounded-lg px-2 text-text-secondary hover:bg-state-base-hover',
+                  popupItemClassName,
+                )}
+                title={option.label}
+                onClick={() => {
+                  onChange?.(option.value)
+                  handleOpenChange(false)
+                }}
+              >
+                <div className='mr-1 grow truncate px-1'>
+                  {option.label}
+                </div>
+                {
+                  value === option.value && <RiCheckLine className='h-4 w-4 shrink-0 text-text-accent' />
+                }
+              </div>
+            ))
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default PureSelect
diff --git a/app/components/base/simple-pie-chart/index.module.css b/app/components/base/simple-pie-chart/index.module.css
new file mode 100644
index 0000000..827b18d
--- /dev/null
+++ b/app/components/base/simple-pie-chart/index.module.css
@@ -0,0 +1,4 @@
+.simplePieChart {
+  border-radius: 50%;
+  box-shadow: 0 0 5px -3px rgb(from var(--simple-pie-chart-color) r g b / 0.1), 0.5px 0.5px 3px 0 rgb(from var(--simple-pie-chart-color) r g b / 0.3);
+}
diff --git a/app/components/base/simple-pie-chart/index.tsx b/app/components/base/simple-pie-chart/index.tsx
new file mode 100644
index 0000000..4b987ab
--- /dev/null
+++ b/app/components/base/simple-pie-chart/index.tsx
@@ -0,0 +1,67 @@
+import type { CSSProperties } from 'react'
+import { memo, useMemo } from 'react'
+import ReactECharts from 'echarts-for-react'
+import type { EChartsOption } from 'echarts'
+import style from './index.module.css'
+import classNames from '@/utils/classnames'
+
+export type SimplePieChartProps = {
+  percentage?: number
+  fill?: string
+  stroke?: string
+  size?: number
+  animationDuration?: number
+  className?: string
+}
+
+const SimplePieChart = ({ percentage = 80, fill = '#fdb022', stroke = '#f79009', size = 12, animationDuration, className }: SimplePieChartProps) => {
+  const option: EChartsOption = useMemo(() => ({
+    series: [
+      {
+        type: 'pie',
+        radius: ['83%', '100%'],
+        animation: false,
+        data: [
+          { value: 100, itemStyle: { color: stroke } },
+        ],
+        emphasis: {
+          disabled: true,
+        },
+        labelLine: {
+          show: false,
+        },
+        cursor: 'default',
+      },
+      {
+        type: 'pie',
+        radius: '83%',
+        animationDuration: animationDuration ?? 600,
+        data: [
+          { value: percentage, itemStyle: { color: fill } },
+          { value: 100 - percentage, itemStyle: { color: '#fff' } },
+        ],
+        emphasis: {
+          disabled: true,
+        },
+        labelLine: {
+          show: false,
+        },
+        cursor: 'default',
+      },
+    ],
+  }), [stroke, fill, percentage, animationDuration])
+
+  return (
+    <ReactECharts
+      option={option}
+      className={classNames(style.simplePieChart, className)}
+      style={{
+        '--simple-pie-chart-color': fill,
+        'width': size,
+        'height': size,
+      } as CSSProperties}
+    />
+  )
+}
+
+export default memo(SimplePieChart)
diff --git a/app/components/base/skeleton/index.tsx b/app/components/base/skeleton/index.tsx
new file mode 100644
index 0000000..41edc26
--- /dev/null
+++ b/app/components/base/skeleton/index.tsx
@@ -0,0 +1,50 @@
+import type { ComponentProps, FC } from 'react'
+import classNames from '@/utils/classnames'
+
+type SkeletonProps = ComponentProps<'div'>
+
+export const SkeletonContainer: FC<SkeletonProps> = (props) => {
+  const { className, children, ...rest } = props
+  return (
+    <div className={classNames('flex flex-col gap-1', className)} {...rest}>
+      {children}
+    </div>
+  )
+}
+
+export const SkeletonRow: FC<SkeletonProps> = (props) => {
+  const { className, children, ...rest } = props
+  return (
+    <div className={classNames('flex items-center gap-2', className)} {...rest}>
+      {children}
+    </div>
+  )
+}
+
+export const SkeletonRectangle: FC<SkeletonProps> = (props) => {
+  const { className, children, ...rest } = props
+  return (
+    <div className={classNames('h-2 rounded-sm opacity-20 bg-text-quaternary my-1', className)} {...rest}>
+      {children}
+    </div>
+  )
+}
+
+export const SkeletonPoint: FC<SkeletonProps> = (props) => {
+  const { className, ...rest } = props
+  return (
+    <div className={classNames('text-text-quaternary text-xs font-medium', className)} {...rest}>路</div>
+  )
+}
+/** Usage
+ * <SkeletonContainer>
+ *  <SkeletonRow>
+ *    <SkeletonRectangle className="w-96" />
+ *    <SkeletonPoint />
+ *    <SkeletonRectangle className="w-96" />
+ *  </SkeletonRow>
+ *  <SkeletonRow>
+ *    <SkeletonRectangle className="w-96" />
+ *  </SkeletonRow>
+ * <SkeletonRow>
+ */
diff --git a/app/components/base/slider/index.tsx b/app/components/base/slider/index.tsx
new file mode 100644
index 0000000..2cfbf80
--- /dev/null
+++ b/app/components/base/slider/index.tsx
@@ -0,0 +1,41 @@
+import ReactSlider from 'react-slider'
+import cn from '@/utils/classnames'
+import './style.css'
+
+type ISliderProps = {
+  className?: string
+  thumbClassName?: string
+  trackClassName?: string
+  value: number
+  max?: number
+  min?: number
+  step?: number
+  disabled?: boolean
+  onChange: (value: number) => void
+}
+
+const Slider: React.FC<ISliderProps> = ({
+  className,
+  thumbClassName,
+  trackClassName,
+  max,
+  min,
+  step,
+  value,
+  disabled,
+  onChange,
+}) => {
+  return <ReactSlider
+    disabled={disabled}
+    value={isNaN(value) ? 0 : value}
+    min={min || 0}
+    max={max || 100}
+    step={step || 1}
+    className={cn('slider relative', className)}
+    thumbClassName={cn('absolute top-[-9px] h-5 w-2 rounded-[3px] border-[0.5px] border-components-slider-knob-border bg-components-slider-knob shadow-sm  focus:outline-none', !disabled && 'cursor-pointer', thumbClassName)}
+    trackClassName={cn('h-0.5 rounded-full', 'slider-track', trackClassName)}
+    onChange={onChange}
+  />
+}
+
+export default Slider
diff --git a/app/components/base/slider/style.css b/app/components/base/slider/style.css
new file mode 100644
index 0000000..5d87fb0
--- /dev/null
+++ b/app/components/base/slider/style.css
@@ -0,0 +1,11 @@
+.slider.disabled {
+    opacity: 0.6;
+}
+
+.slider-track {
+    background-color: var(--color-components-slider-range);
+}
+
+.slider-track-1 {
+    background-color: var(--color-components-slider-track);
+}
diff --git a/app/components/base/sort/index.tsx b/app/components/base/sort/index.tsx
new file mode 100644
index 0000000..af90233
--- /dev/null
+++ b/app/components/base/sort/index.tsx
@@ -0,0 +1,92 @@
+import type { FC } from 'react'
+import { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine, RiCheckLine, RiSortAsc, RiSortDesc } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+
+export type Item = {
+  value: number | string
+  name: string
+} & Record<string, any>
+
+type Props = {
+  order?: string
+  value: number | string
+  items: Item[]
+  onSelect: (item: any) => void
+}
+const Sort: FC<Props> = ({
+  order,
+  value,
+  items,
+  onSelect,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const triggerContent = useMemo(() => {
+    return items.find(item => item.value === value)?.name || ''
+  }, [items, value])
+
+  return (
+    <div className='inline-flex items-center'>
+      <PortalToFollowElem
+        open={open}
+        onOpenChange={setOpen}
+        placement='bottom-start'
+        offset={4}
+      >
+        <div className='relative'>
+          <PortalToFollowElemTrigger
+            onClick={() => setOpen(v => !v)}
+            className='block'
+          >
+            <div className={cn(
+              'flex cursor-pointer items-center rounded-l-lg bg-components-input-bg-normal px-2 py-1 hover:bg-state-base-hover-alt',
+              open && '!bg-state-base-hover-alt hover:bg-state-base-hover-alt',
+            )}>
+              <div className='flex items-center gap-0.5 p-1'>
+                <div className='system-sm-regular text-text-tertiary'>{t('appLog.filter.sortBy')}</div>
+                <div className={cn('system-sm-regular text-text-tertiary', !!value && 'text-text-secondary')}>
+                  {triggerContent}
+                </div>
+              </div>
+              <RiArrowDownSLine className='h-4 w-4 text-text-tertiary' />
+            </div>
+          </PortalToFollowElemTrigger>
+          <PortalToFollowElemContent className='z-[1002]'>
+            <div className='relative w-[240px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg'>
+              <div className='max-h-72 overflow-auto p-1'>
+                {items.map(item => (
+                  <div
+                    key={item.value}
+                    className='flex cursor-pointer items-center gap-2 rounded-lg px-2 py-[6px] pl-3 hover:bg-state-base-hover'
+                    onClick={() => {
+                      onSelect(`${order}${item.value}`)
+                      setOpen(false)
+                    }}
+                  >
+                    <div title={item.name} className='system-sm-medium grow truncate text-text-secondary'>{item.name}</div>
+                    {value === item.value && <RiCheckLine className='h-4 w-4 shrink-0 text-util-colors-blue-light-blue-light-600' />}
+                  </div>
+                ))}
+              </div>
+            </div>
+          </PortalToFollowElemContent>
+        </div>
+      </PortalToFollowElem>
+      <div className='ml-px cursor-pointer rounded-r-lg bg-components-button-tertiary-bg p-2 hover:bg-components-button-tertiary-bg-hover' onClick={() => onSelect(`${order ? '' : '-'}${value}`)}>
+        {!order && <RiSortAsc className='h-4 w-4 text-components-button-tertiary-text' />}
+        {order && <RiSortDesc className='h-4 w-4 text-components-button-tertiary-text' />}
+      </div>
+    </div>
+
+  )
+}
+
+export default Sort
diff --git a/app/components/base/spinner/index.spec.tsx b/app/components/base/spinner/index.spec.tsx
new file mode 100644
index 0000000..0c4f0f6
--- /dev/null
+++ b/app/components/base/spinner/index.spec.tsx
@@ -0,0 +1,49 @@
+import React from 'react'
+import { render } from '@testing-library/react'
+import '@testing-library/jest-dom'
+import Spinner from './index'
+
+describe('Spinner component', () => {
+  it('should render correctly when loading is true', () => {
+    const { container } = render(<Spinner loading={true} />)
+    const spinner = container.firstChild as HTMLElement
+
+    expect(spinner).toHaveClass('animate-spin')
+
+    // Check for accessibility text
+    const screenReaderText = spinner.querySelector('span')
+    expect(screenReaderText).toBeInTheDocument()
+    expect(screenReaderText).toHaveTextContent('Loading...')
+  })
+
+  it('should be hidden when loading is false', () => {
+    const { container } = render(<Spinner loading={false} />)
+    const spinner = container.firstChild as HTMLElement
+
+    expect(spinner).toHaveClass('hidden')
+  })
+
+  it('should render with custom className', () => {
+    const customClass = 'text-blue-500'
+    const { container } = render(<Spinner loading={true} className={customClass} />)
+    const spinner = container.firstChild as HTMLElement
+
+    expect(spinner).toHaveClass(customClass)
+  })
+
+  it('should render children correctly', () => {
+    const childText = 'Child content'
+    const { getByText } = render(
+      <Spinner loading={true}>{childText}</Spinner>,
+    )
+
+    expect(getByText(childText)).toBeInTheDocument()
+  })
+
+  it('should use default loading value (false) when not provided', () => {
+    const { container } = render(<Spinner />)
+    const spinner = container.firstChild as HTMLElement
+
+    expect(spinner).toHaveClass('hidden')
+  })
+})
diff --git a/app/components/base/spinner/index.tsx b/app/components/base/spinner/index.tsx
new file mode 100644
index 0000000..e1568c2
--- /dev/null
+++ b/app/components/base/spinner/index.tsx
@@ -0,0 +1,24 @@
+import type { FC } from 'react'
+import React from 'react'
+
+type Props = {
+  loading?: boolean
+  className?: string
+  children?: React.ReactNode | string
+}
+
+const Spinner: FC<Props> = ({ loading = false, children, className }) => {
+  return (
+    <div
+      className={`inline-block h-4 w-4 animate-spin rounded-full border-4 border-solid border-current border-r-transparent align-[-0.125em] text-gray-200 ${loading ? 'motion-reduce:animate-[spin_1.5s_linear_infinite]' : 'hidden'} ${className ?? ''}`}
+      role="status"
+    >
+      <span
+        className="!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]"
+      >Loading...</span>
+      {children}
+    </div>
+  )
+}
+
+export default Spinner
diff --git a/app/components/base/svg-gallery/index.tsx b/app/components/base/svg-gallery/index.tsx
new file mode 100644
index 0000000..94fc82c
--- /dev/null
+++ b/app/components/base/svg-gallery/index.tsx
@@ -0,0 +1,78 @@
+import { useEffect, useRef, useState } from 'react'
+import { SVG } from '@svgdotjs/svg.js'
+import ImagePreview from '@/app/components/base/image-uploader/image-preview'
+import DOMPurify from 'dompurify'
+
+export const SVGRenderer = ({ content }: { content: string }) => {
+  const svgRef = useRef<HTMLDivElement>(null)
+  const [imagePreview, setImagePreview] = useState('')
+  const [windowSize, setWindowSize] = useState({
+    width: typeof window !== 'undefined' ? window.innerWidth : 0,
+    height: typeof window !== 'undefined' ? window.innerHeight : 0,
+  })
+
+  const svgToDataURL = (svgElement: Element): string => {
+    const svgString = new XMLSerializer().serializeToString(svgElement)
+    const base64String = Buffer.from(svgString).toString('base64')
+    return `data:image/svg+xml;base64,${base64String}`
+  }
+
+  useEffect(() => {
+    const handleResize = () => {
+      setWindowSize({ width: window.innerWidth, height: window.innerHeight })
+    }
+
+    window.addEventListener('resize', handleResize)
+    return () => window.removeEventListener('resize', handleResize)
+  }, [])
+
+  useEffect(() => {
+    if (svgRef.current) {
+      try {
+        svgRef.current.innerHTML = ''
+        const draw = SVG().addTo(svgRef.current)
+
+        const parser = new DOMParser()
+        const svgDoc = parser.parseFromString(content, 'image/svg+xml')
+        const svgElement = svgDoc.documentElement
+
+        if (!(svgElement instanceof SVGElement))
+          throw new Error('Invalid SVG content')
+
+        const originalWidth = Number.parseInt(svgElement.getAttribute('width') || '400', 10)
+        const originalHeight = Number.parseInt(svgElement.getAttribute('height') || '600', 10)
+        draw.viewbox(0, 0, originalWidth, originalHeight)
+
+        svgRef.current.style.width = `${Math.min(originalWidth, 298)}px`
+
+        const rootElement = draw.svg(DOMPurify.sanitize(content))
+
+        rootElement.click(() => {
+          setImagePreview(svgToDataURL(svgElement as Element))
+        })
+      }
+      catch {
+        if (svgRef.current)
+          svgRef.current.innerHTML = '<span style="padding: 1rem;">Error rendering SVG. Wait for the image content to complete.</span>'
+      }
+    }
+  }, [content, windowSize])
+
+  return (
+    <>
+      <div ref={svgRef} style={{
+        maxHeight: '80vh',
+        display: 'flex',
+        justifyContent: 'center',
+        alignItems: 'center',
+        cursor: 'pointer',
+        wordBreak: 'break-word',
+        whiteSpace: 'normal',
+        margin: '0 auto',
+      }} />
+      {imagePreview && (<ImagePreview url={imagePreview} title='Preview' onCancel={() => setImagePreview('')} />)}
+    </>
+  )
+}
+
+export default SVGRenderer
diff --git a/app/components/base/svg/index.tsx b/app/components/base/svg/index.tsx
new file mode 100644
index 0000000..d29fd17
--- /dev/null
+++ b/app/components/base/svg/index.tsx
@@ -0,0 +1,22 @@
+import React from 'react'
+import s from './style.module.css'
+import ActionButton from '../action-button'
+import cn from '@/utils/classnames'
+
+type ISVGBtnProps = {
+  isSVG: boolean
+  setIsSVG: React.Dispatch<React.SetStateAction<boolean>>
+}
+
+const SVGBtn = ({
+  isSVG,
+  setIsSVG,
+}: ISVGBtnProps) => {
+  return (
+    <ActionButton onClick={() => { setIsSVG(prevIsSVG => !prevIsSVG) }}>
+      <div className={cn('h-4 w-4', isSVG ? s.svgIconed : s.svgIcon)}></div>
+    </ActionButton>
+  )
+}
+
+export default SVGBtn
diff --git a/app/components/base/svg/style.module.css b/app/components/base/svg/style.module.css
new file mode 100644
index 0000000..9258fe8
--- /dev/null
+++ b/app/components/base/svg/style.module.css
@@ -0,0 +1,11 @@
+.svgIcon {
+  background-image: url(~@/app/components/develop/secret-key/assets/svg.svg);
+  background-position: center;
+  background-repeat: no-repeat;
+}
+
+.svgIconed {
+  background-image: url(~@/app/components/develop/secret-key/assets/svged.svg);
+  background-position: center;
+  background-repeat: no-repeat;
+}
diff --git a/app/components/base/switch/index.tsx b/app/components/base/switch/index.tsx
new file mode 100644
index 0000000..1faf7c5
--- /dev/null
+++ b/app/components/base/switch/index.tsx
@@ -0,0 +1,87 @@
+'use client'
+import React, { useEffect, useState } from 'react'
+import { Switch as OriginalSwitch } from '@headlessui/react'
+import classNames from '@/utils/classnames'
+
+type SwitchProps = {
+  onChange?: (value: boolean) => void
+  size?: 'xs' | 'sm' | 'md' | 'lg' | 'l'
+  defaultValue?: boolean
+  disabled?: boolean
+  className?: string
+}
+
+const Switch = (
+  {
+    ref: propRef,
+    onChange,
+    size = 'md',
+    defaultValue = false,
+    disabled = false,
+    className,
+  }: SwitchProps & {
+    ref?: React.RefObject<HTMLButtonElement>;
+  },
+) => {
+  const [enabled, setEnabled] = useState(defaultValue)
+  useEffect(() => {
+    setEnabled(defaultValue)
+  }, [defaultValue])
+  const wrapStyle = {
+    lg: 'h-6 w-11',
+    l: 'h-5 w-9',
+    md: 'h-4 w-7',
+    sm: 'h-3 w-5',
+    xs: 'h-2.5 w-3.5',
+  }
+
+  const circleStyle = {
+    lg: 'h-5 w-5',
+    l: 'h-4 w-4',
+    md: 'h-3 w-3',
+    sm: 'h-2 w-2',
+    xs: 'h-1.5 w-1',
+  }
+
+  const translateLeft = {
+    lg: 'translate-x-5',
+    l: 'translate-x-4',
+    md: 'translate-x-3',
+    sm: 'translate-x-2',
+    xs: 'translate-x-1.5',
+  }
+  return (
+    <OriginalSwitch
+      ref={propRef}
+      checked={enabled}
+      onChange={(checked: boolean) => {
+        if (disabled)
+          return
+        setEnabled(checked)
+        onChange?.(checked)
+      }}
+      className={classNames(
+        wrapStyle[size],
+        enabled ? 'bg-components-toggle-bg' : 'bg-components-toggle-bg-unchecked',
+        'relative inline-flex  flex-shrink-0 cursor-pointer rounded-[5px] border-2 border-transparent transition-colors duration-200 ease-in-out',
+        disabled ? '!opacity-50 !cursor-not-allowed' : '',
+        size === 'xs' && 'rounded-sm',
+        className,
+      )}
+    >
+      <span
+        aria-hidden="true"
+        className={classNames(
+          circleStyle[size],
+          enabled ? translateLeft[size] : 'translate-x-0',
+          size === 'xs' && 'rounded-[1px]',
+          'pointer-events-none inline-block transform rounded-[3px] bg-components-toggle-knob shadow ring-0 transition duration-200 ease-in-out',
+        )}
+      />
+    </OriginalSwitch>
+  )
+}
+
+Switch.displayName = 'Switch'
+
+export default React.memo(Switch)
diff --git a/app/components/base/tab-header/index.tsx b/app/components/base/tab-header/index.tsx
new file mode 100644
index 0000000..36dfa8c
--- /dev/null
+++ b/app/components/base/tab-header/index.tsx
@@ -0,0 +1,50 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+
+type Item = {
+  id: string
+  name: string
+  isRight?: boolean
+  icon?: React.ReactNode
+  extra?: React.ReactNode
+}
+
+export type ITabHeaderProps = {
+  items: Item[]
+  value: string
+  onChange: (value: string) => void
+}
+
+const TabHeader: FC<ITabHeaderProps> = ({
+  items,
+  value,
+  onChange,
+}) => {
+  const renderItem = ({ id, name, icon, extra }: Item) => (
+    <div
+      key={id}
+      className={cn(
+        'system-md-semibold relative flex cursor-pointer items-center border-b-2 border-transparent pb-2 pt-2.5',
+        id === value ? 'border-components-tab-active text-text-primary' : 'text-text-tertiary',
+      )}
+      onClick={() => onChange(id)}
+    >
+      {icon || ''}
+      <div className='ml-2'>{name}</div>
+      {extra || ''}
+    </div>
+  )
+  return (
+    <div className='flex justify-between'>
+      <div className='flex space-x-4'>
+        {items.filter(item => !item.isRight).map(renderItem)}
+      </div>
+      <div className='flex space-x-4'>
+        {items.filter(item => item.isRight).map(renderItem)}
+      </div>
+    </div>
+  )
+}
+export default React.memo(TabHeader)
diff --git a/app/components/base/tab-slider-new/index.tsx b/app/components/base/tab-slider-new/index.tsx
new file mode 100644
index 0000000..fc0bc1c
--- /dev/null
+++ b/app/components/base/tab-slider-new/index.tsx
@@ -0,0 +1,40 @@
+import type { FC } from 'react'
+import cn from '@/utils/classnames'
+
+type Option = {
+  value: string
+  text: string
+  icon?: React.ReactNode
+}
+type TabSliderProps = {
+  className?: string
+  value: string
+  onChange: (v: string) => void
+  options: Option[]
+}
+const TabSliderNew: FC<TabSliderProps> = ({
+  className,
+  value,
+  onChange,
+  options,
+}) => {
+  return (
+    <div className={cn(className, 'relative flex')}>
+      {options.map(option => (
+        <div
+          key={option.value}
+          onClick={() => onChange(option.value)}
+          className={cn(
+            'mr-1 flex h-[32px] cursor-pointer items-center rounded-lg border-[0.5px] border-transparent px-3 py-[7px] text-[13px] font-medium leading-[18px] text-text-tertiary hover:bg-components-main-nav-nav-button-bg-active',
+            value === option.value && 'border-components-main-nav-nav-button-border bg-components-main-nav-nav-button-bg-active text-components-main-nav-nav-button-text-active shadow-xs',
+          )}
+        >
+          {option.icon}
+          {option.text}
+        </div>
+      ))}
+    </div>
+  )
+}
+
+export default TabSliderNew
diff --git a/app/components/base/tab-slider-plain/index.tsx b/app/components/base/tab-slider-plain/index.tsx
new file mode 100644
index 0000000..b9b3965
--- /dev/null
+++ b/app/components/base/tab-slider-plain/index.tsx
@@ -0,0 +1,78 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+
+type Option = {
+  value: string
+  text: string | React.JSX.Element
+}
+
+type ItemProps = {
+  className?: string
+  isActive: boolean
+  onClick: (v: string) => void
+  option: Option
+  smallItem?: boolean
+}
+const Item: FC<ItemProps> = ({
+  className,
+  isActive,
+  onClick,
+  option,
+  smallItem,
+}) => {
+  return (
+    <div
+      key={option.value}
+      className={cn(
+        'relative pb-2.5 ',
+        !isActive && 'cursor-pointer',
+        smallItem ? 'system-sm-semibold-uppercase' : 'system-xl-semibold',
+        className,
+      )}
+      onClick={() => !isActive && onClick(option.value)}
+    >
+      <div className={cn(isActive ? 'text-text-primary' : 'text-text-tertiary')}>{option.text}</div>
+      {isActive && (
+        <div className='absolute bottom-0 left-0 right-0 h-0.5 bg-util-colors-blue-brand-blue-brand-600'></div>
+      )}
+    </div>
+  )
+}
+
+type Props = {
+  className?: string
+  value: string
+  onChange: (v: string) => void
+  options: Option[]
+  noBorderBottom?: boolean
+  smallItem?: boolean
+  itemClassName?: string
+}
+
+const TabSlider: FC<Props> = ({
+  className,
+  value,
+  onChange,
+  options,
+  noBorderBottom,
+  itemClassName,
+  smallItem,
+}) => {
+  return (
+    <div className={cn(className, !noBorderBottom && 'border-b border-divider-subtle', 'flex  space-x-6')}>
+      {options.map(option => (
+        <Item
+          isActive={option.value === value}
+          option={option}
+          onClick={onChange}
+          key={option.value}
+          className={itemClassName}
+          smallItem={smallItem}
+        />
+      ))}
+    </div>
+  )
+}
+export default React.memo(TabSlider)
diff --git a/app/components/base/tab-slider/index.tsx b/app/components/base/tab-slider/index.tsx
new file mode 100644
index 0000000..fd6b876
--- /dev/null
+++ b/app/components/base/tab-slider/index.tsx
@@ -0,0 +1,87 @@
+import type { FC, ReactNode } from 'react'
+import { useEffect, useState } from 'react'
+import cn from '@/utils/classnames'
+import Badge, { BadgeState } from '@/app/components/base/badge/index'
+import { useInstalledPluginList } from '@/service/use-plugins'
+type Option = {
+  value: string
+  text: ReactNode
+}
+
+type TabSliderProps = {
+  className?: string
+  value: string
+  onChange: (v: string) => void
+  options: Option[]
+}
+
+const TabSlider: FC<TabSliderProps> = ({
+  className,
+  value,
+  onChange,
+  options,
+}) => {
+  const [activeIndex, setActiveIndex] = useState(options.findIndex(option => option.value === value))
+  const [sliderStyle, setSliderStyle] = useState({})
+  const { data: pluginList } = useInstalledPluginList()
+
+  const updateSliderStyle = (index: number) => {
+    const tabElement = document.getElementById(`tab-${index}`)
+    if (tabElement) {
+      const { offsetLeft, offsetWidth } = tabElement
+      setSliderStyle({
+        transform: `translateX(${offsetLeft}px)`,
+        width: `${offsetWidth}px`,
+      })
+    }
+  }
+
+  useEffect(() => {
+    const newIndex = options.findIndex(option => option.value === value)
+    setActiveIndex(newIndex)
+    updateSliderStyle(newIndex)
+  }, [value, options, pluginList])
+
+  return (
+    <div className={cn(className, 'relative inline-flex items-center justify-center rounded-[10px] bg-components-segmented-control-bg-normal p-0.5')}>
+      <div
+        className="shadows-shadow-xs absolute bottom-0.5 left-0 right-0 top-0.5 rounded-[10px] bg-components-panel-bg transition-transform duration-300 ease-in-out"
+        style={sliderStyle}
+      />
+      {options.map((option, index) => (
+        <div
+          id={`tab-${index}`}
+          key={option.value}
+          className={cn(
+            'relative z-10 flex cursor-pointer items-center justify-center gap-1 rounded-[10px] px-2.5 py-1.5 transition-colors duration-300 ease-in-out',
+            'system-md-semibold',
+            index === activeIndex
+              ? 'text-text-primary'
+              : 'text-text-tertiary',
+          )}
+          onClick={() => {
+            if (index !== activeIndex) {
+              onChange(option.value)
+              updateSliderStyle(index)
+            }
+          }}
+        >
+          {option.text}
+          {/* if no plugin installed, the badge won't show */}
+          {option.value === 'plugins'
+            && (pluginList?.plugins.length ?? 0) > 0
+            && <Badge
+              size='s'
+              uppercase={true}
+              state={BadgeState.Default}
+            >
+              {pluginList?.plugins.length}
+            </Badge>
+          }
+        </div>
+      ))}
+    </div>
+  )
+}
+
+export default TabSlider
diff --git a/app/components/base/tag-input/index.tsx b/app/components/base/tag-input/index.tsx
new file mode 100644
index 0000000..2be9c5f
--- /dev/null
+++ b/app/components/base/tag-input/index.tsx
@@ -0,0 +1,121 @@
+import { useState } from 'react'
+import type { ChangeEvent, FC, KeyboardEvent } from 'react'
+import { } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import AutosizeInput from 'react-18-input-autosize'
+import { RiAddLine, RiCloseLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import { useToastContext } from '@/app/components/base/toast'
+
+type TagInputProps = {
+  items: string[]
+  onChange: (items: string[]) => void
+  disableRemove?: boolean
+  disableAdd?: boolean
+  customizedConfirmKey?: 'Enter' | 'Tab'
+  isInWorkflow?: boolean
+  placeholder?: string
+}
+
+const TagInput: FC<TagInputProps> = ({
+  items,
+  onChange,
+  disableAdd,
+  disableRemove,
+  customizedConfirmKey = 'Enter',
+  isInWorkflow,
+  placeholder,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const [value, setValue] = useState('')
+  const [focused, setFocused] = useState(false)
+
+  const isSpecialMode = customizedConfirmKey === 'Tab'
+
+  const handleRemove = (index: number) => {
+    const copyItems = [...items]
+    copyItems.splice(index, 1)
+
+    onChange(copyItems)
+  }
+
+  const handleKeyDown = (e: KeyboardEvent) => {
+    if (isSpecialMode && e.key === 'Enter')
+      setValue(`${value}鈫礰)
+
+    if (e.key === customizedConfirmKey) {
+      if (isSpecialMode)
+        e.preventDefault()
+
+      const valueTrimmed = value.trim()
+      if (!valueTrimmed || (items.find(item => item === valueTrimmed)))
+        return
+
+      if (valueTrimmed.length > 20) {
+        notify({ type: 'error', message: t('datasetDocuments.segment.keywordError') })
+        return
+      }
+
+      onChange([...items, valueTrimmed])
+      setTimeout(() => {
+        setValue('')
+      })
+    }
+  }
+
+  const handleBlur = () => {
+    setValue('')
+    setFocused(false)
+  }
+
+  return (
+    <div className={cn('flex flex-wrap', !isInWorkflow && 'min-w-[200px]', isSpecialMode ? 'rounded-lg bg-components-input-bg-normal pb-1 pl-1' : '')}>
+      {
+        (items || []).map((item, index) => (
+          <div
+            key={item}
+            className={cn('system-xs-regular mr-1 mt-1 flex items-center rounded-md border border-divider-deep bg-components-badge-white-to-dark py-1 pl-1.5 pr-1 text-text-secondary')}
+          >
+            {item}
+            {
+              !disableRemove && (
+                <div className='flex h-4 w-4 cursor-pointer items-center justify-center' onClick={() => handleRemove(index)}>
+                  <RiCloseLine className='ml-0.5 h-3.5 w-3.5 text-text-tertiary' />
+                </div>
+              )
+            }
+          </div>
+        ))
+      }
+      {
+        !disableAdd && (
+          <div className={cn('group/tag-add mt-1 flex items-center gap-x-0.5', !isSpecialMode ? 'rounded-md border border-dashed border-divider-deep px-1.5' : '')}>
+            {!isSpecialMode && !focused && <RiAddLine className='h-3.5 w-3.5 text-text-placeholder group-hover/tag-add:text-text-secondary' />}
+            <AutosizeInput
+              inputClassName={cn('appearance-none caret-[#295EFF] outline-none placeholder:text-text-placeholder group-hover/tag-add:placeholder:text-text-secondary', isSpecialMode ? 'bg-transparent' : '')}
+              className={cn(
+                !isInWorkflow && 'max-w-[300px]',
+                isInWorkflow && 'max-w-[146px]',
+                `
+                system-xs-regular overflow-hidden rounded-md py-1
+                ${isSpecialMode && 'border border-transparent px-1.5'}
+                ${focused && isSpecialMode && 'border-dashed border-divider-deep'}
+              `)}
+              onFocus={() => setFocused(true)}
+              onBlur={handleBlur}
+              value={value}
+              onChange={(e: ChangeEvent<HTMLInputElement>) => {
+                setValue(e.target.value)
+              }}
+              onKeyDown={handleKeyDown}
+              placeholder={t(placeholder || (isSpecialMode ? 'common.model.params.stop_sequencesPlaceholder' : 'datasetDocuments.segment.addKeyWord'))}
+            />
+          </div>
+        )
+      }
+    </div>
+  )
+}
+
+export default TagInput
diff --git a/app/components/base/tag-management/constant.ts b/app/components/base/tag-management/constant.ts
new file mode 100644
index 0000000..3c60041
--- /dev/null
+++ b/app/components/base/tag-management/constant.ts
@@ -0,0 +1,6 @@
+export type Tag = {
+  id: string
+  name: string
+  type: string
+  binding_count: number
+}
diff --git a/app/components/base/tag-management/filter.tsx b/app/components/base/tag-management/filter.tsx
new file mode 100644
index 0000000..1ce56e8
--- /dev/null
+++ b/app/components/base/tag-management/filter.tsx
@@ -0,0 +1,147 @@
+import type { FC } from 'react'
+import { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useDebounceFn, useMount } from 'ahooks'
+import { RiArrowDownSLine } from '@remixicon/react'
+import { useStore as useTagStore } from './store'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Input from '@/app/components/base/input'
+import { Tag01, Tag03 } from '@/app/components/base/icons/src/vender/line/financeAndECommerce'
+import { Check } from '@/app/components/base/icons/src/vender/line/general'
+import { XCircle } from '@/app/components/base/icons/src/vender/solid/general'
+import type { Tag } from '@/app/components/base/tag-management/constant'
+
+import { fetchTagList } from '@/service/tag'
+
+type TagFilterProps = {
+  type: 'knowledge' | 'app'
+  value: string[]
+  onChange: (v: string[]) => void
+}
+const TagFilter: FC<TagFilterProps> = ({
+  type,
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const tagList = useTagStore(s => s.tagList)
+  const setTagList = useTagStore(s => s.setTagList)
+
+  const [keywords, setKeywords] = useState('')
+  const [searchKeywords, setSearchKeywords] = useState('')
+  const { run: handleSearch } = useDebounceFn(() => {
+    setSearchKeywords(keywords)
+  }, { wait: 500 })
+  const handleKeywordsChange = (value: string) => {
+    setKeywords(value)
+    handleSearch()
+  }
+
+  const filteredTagList = useMemo(() => {
+    return tagList.filter(tag => tag.type === type && tag.name.includes(searchKeywords))
+  }, [type, tagList, searchKeywords])
+
+  const currentTag = useMemo(() => {
+    return tagList.find(tag => tag.id === value[0])
+  }, [value, tagList])
+
+  const selectTag = (tag: Tag) => {
+    if (value.includes(tag.id))
+      onChange(value.filter(v => v !== tag.id))
+    else
+      onChange([...value, tag.id])
+  }
+
+  useMount(() => {
+    fetchTagList(type).then((res) => {
+      setTagList(res)
+    })
+  })
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <div className='relative'>
+        <PortalToFollowElemTrigger
+          onClick={() => setOpen(v => !v)}
+          className='block'
+        >
+          <div className={cn(
+            'flex h-8 cursor-pointer items-center gap-1 rounded-lg border-[0.5px] border-transparent bg-components-input-bg-normal px-2',
+            !open && !!value.length && 'shadow-xs',
+            open && !!value.length && 'shadow-xs',
+          )}>
+            <div className='p-[1px]'>
+              <Tag01 className='h-3.5 w-3.5 text-text-tertiary' />
+            </div>
+            <div className='text-[13px] leading-[18px] text-text-secondary'>
+              {!value.length && t('common.tag.placeholder')}
+              {!!value.length && currentTag?.name}
+            </div>
+            {value.length > 1 && (
+              <div className='text-xs font-medium leading-[18px] text-text-tertiary'>{`+${value.length - 1}`}</div>
+            )}
+            {!value.length && (
+              <div className='p-[1px]'>
+                <RiArrowDownSLine className='h-3.5 w-3.5 text-text-tertiary' />
+              </div>
+            )}
+            {!!value.length && (
+              <div className='group/clear cursor-pointer p-[1px]' onClick={(e) => {
+                e.stopPropagation()
+                onChange([])
+              }}>
+                <XCircle className='h-3.5 w-3.5 text-text-tertiary group-hover/clear:text-text-secondary' />
+              </div>
+            )}
+          </div>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[1002]'>
+          <div className='relative w-[240px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg backdrop-blur-[5px]'>
+            <div className='p-2'>
+              <Input
+                showLeftIcon
+                showClearIcon
+                value={keywords}
+                onChange={e => handleKeywordsChange(e.target.value)}
+                onClear={() => handleKeywordsChange('')}
+              />
+            </div>
+            <div className='max-h-72 overflow-auto p-1'>
+              {filteredTagList.map(tag => (
+                <div
+                  key={tag.id}
+                  className='flex cursor-pointer items-center gap-2 rounded-lg py-[6px] pl-3 pr-2 hover:bg-state-base-hover'
+                  onClick={() => selectTag(tag)}
+                >
+                  <div title={tag.name} className='grow truncate text-sm leading-5 text-text-tertiary'>{tag.name}</div>
+                  {value.includes(tag.id) && <Check className='h-4 w-4 shrink-0 text-text-secondary' />}
+                </div>
+              ))}
+              {!filteredTagList.length && (
+                <div className='flex flex-col items-center gap-1 p-3'>
+                  <Tag03 className='h-6 w-6 text-text-tertiary' />
+                  <div className='text-xs leading-[14px] text-text-tertiary'>{t('common.tag.noTag')}</div>
+                </div>
+              )}
+            </div>
+          </div>
+        </PortalToFollowElemContent>
+      </div>
+    </PortalToFollowElem>
+
+  )
+}
+
+export default TagFilter
diff --git a/app/components/base/tag-management/index.tsx b/app/components/base/tag-management/index.tsx
new file mode 100644
index 0000000..d3c509b
--- /dev/null
+++ b/app/components/base/tag-management/index.tsx
@@ -0,0 +1,92 @@
+'use client'
+
+import { useEffect, useState } from 'react'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import { useStore as useTagStore } from './store'
+import TagItemEditor from './tag-item-editor'
+import Modal from '@/app/components/base/modal'
+import { ToastContext } from '@/app/components/base/toast'
+import {
+  createTag,
+  fetchTagList,
+} from '@/service/tag'
+
+type TagManagementModalProps = {
+  type: 'knowledge' | 'app'
+  show: boolean
+}
+
+const TagManagementModal = ({ show, type }: TagManagementModalProps) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const tagList = useTagStore(s => s.tagList)
+  const setTagList = useTagStore(s => s.setTagList)
+  const setShowTagManagementModal = useTagStore(s => s.setShowTagManagementModal)
+
+  const getTagList = async (type: 'knowledge' | 'app') => {
+    const res = await fetchTagList(type)
+    setTagList(res)
+  }
+
+  const [pending, setPending] = useState<boolean>(false)
+  const [name, setName] = useState<string>('')
+  const createNewTag = async () => {
+    if (!name)
+      return
+    if (pending)
+      return
+    try {
+      setPending(true)
+      const newTag = await createTag(name, type)
+      notify({ type: 'success', message: t('common.tag.created') })
+      setTagList([
+        newTag,
+        ...tagList,
+      ])
+      setName('')
+      setPending(false)
+    }
+    catch {
+      notify({ type: 'error', message: t('common.tag.failed') })
+      setPending(false)
+    }
+  }
+
+  useEffect(() => {
+    getTagList(type)
+  }, [type])
+
+  return (
+    <Modal
+      className='!w-[600px] !max-w-[600px] rounded-xl px-8 py-6'
+      isShow={show}
+      onClose={() => setShowTagManagementModal(false)}
+    >
+      <div className='relative pb-2 text-xl font-semibold leading-[30px] text-text-primary'>{t('common.tag.manageTags')}</div>
+      <div className='absolute right-4 top-4 cursor-pointer p-2' onClick={() => setShowTagManagementModal(false)}>
+        <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+      </div>
+      <div className='mt-3 flex flex-wrap gap-2'>
+        <input
+          className='w-[100px] shrink-0 appearance-none rounded-lg border border-dashed border-divider-regular bg-transparent px-2 py-1 text-sm leading-5 text-text-secondary caret-primary-600  outline-none placeholder:text-text-quaternary focus:border-solid'
+          placeholder={t('common.tag.addNew') || ''}
+          autoFocus
+          value={name}
+          onChange={e => setName(e.target.value)}
+          onKeyDown={e => e.key === 'Enter' && !e.nativeEvent.isComposing && createNewTag()}
+          onBlur={createNewTag}
+        />
+        {tagList.map(tag => (
+          <TagItemEditor
+            key={tag.id}
+            tag={tag}
+          />
+        ))}
+      </div>
+    </Modal>
+  )
+}
+
+export default TagManagementModal
diff --git a/app/components/base/tag-management/selector.tsx b/app/components/base/tag-management/selector.tsx
new file mode 100644
index 0000000..2678be2
--- /dev/null
+++ b/app/components/base/tag-management/selector.tsx
@@ -0,0 +1,278 @@
+import type { FC } from 'react'
+import { useMemo, useState } from 'react'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import { useUnmount } from 'ahooks'
+import { RiAddLine } from '@remixicon/react'
+import { useStore as useTagStore } from './store'
+import cn from '@/utils/classnames'
+import type { HtmlContentProps } from '@/app/components/base/popover'
+import CustomPopover from '@/app/components/base/popover'
+import Divider from '@/app/components/base/divider'
+import Input from '@/app/components/base/input'
+import { Tag01, Tag03 } from '@/app/components/base/icons/src/vender/line/financeAndECommerce'
+import type { Tag } from '@/app/components/base/tag-management/constant'
+import Checkbox from '@/app/components/base/checkbox'
+import { bindTag, createTag, fetchTagList, unBindTag } from '@/service/tag'
+import { ToastContext } from '@/app/components/base/toast'
+import { noop } from 'lodash-es'
+
+type TagSelectorProps = {
+  targetID: string
+  isPopover?: boolean
+  position?: 'bl' | 'br'
+  type: 'knowledge' | 'app'
+  value: string[]
+  selectedTags: Tag[]
+  onCacheUpdate: (tags: Tag[]) => void
+  onChange?: () => void
+}
+
+type PanelProps = {
+  onCreate: () => void
+} & HtmlContentProps & TagSelectorProps
+
+const Panel = (props: PanelProps) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const { targetID, type, value, selectedTags, onCacheUpdate, onChange, onCreate } = props
+  const tagList = useTagStore(s => s.tagList)
+  const setTagList = useTagStore(s => s.setTagList)
+  const setShowTagManagementModal = useTagStore(s => s.setShowTagManagementModal)
+  const [selectedTagIDs, setSelectedTagIDs] = useState<string[]>(value)
+  const [keywords, setKeywords] = useState('')
+  const handleKeywordsChange = (value: string) => {
+    setKeywords(value)
+  }
+
+  const notExisted = useMemo(() => {
+    return tagList.every(tag => tag.type === type && tag.name !== keywords)
+  }, [type, tagList, keywords])
+  const filteredSelectedTagList = useMemo(() => {
+    return selectedTags.filter(tag => tag.name.includes(keywords))
+  }, [keywords, selectedTags])
+  const filteredTagList = useMemo(() => {
+    return tagList.filter(tag => tag.type === type && !value.includes(tag.id) && tag.name.includes(keywords))
+  }, [type, tagList, value, keywords])
+
+  const [creating, setCreating] = useState<boolean>(false)
+  const createNewTag = async () => {
+    if (!keywords)
+      return
+    if (creating)
+      return
+    try {
+      setCreating(true)
+      const newTag = await createTag(keywords, type)
+      notify({ type: 'success', message: t('common.tag.created') })
+      setTagList([
+        ...tagList,
+        newTag,
+      ])
+      setKeywords('')
+      setCreating(false)
+      onCreate()
+    }
+    catch {
+      notify({ type: 'error', message: t('common.tag.failed') })
+      setCreating(false)
+    }
+  }
+  const bind = async (tagIDs: string[]) => {
+    try {
+      await bindTag(tagIDs, targetID, type)
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+    }
+    catch {
+      notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+    }
+  }
+  const unbind = async (tagID: string) => {
+    try {
+      await unBindTag(tagID, targetID, type)
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+    }
+    catch {
+      notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+    }
+  }
+  const selectTag = (tag: Tag) => {
+    if (selectedTagIDs.includes(tag.id))
+      setSelectedTagIDs(selectedTagIDs.filter(v => v !== tag.id))
+    else
+      setSelectedTagIDs([...selectedTagIDs, tag.id])
+  }
+
+  const valueNotChanged = useMemo(() => {
+    return value.length === selectedTagIDs.length && value.every(v => selectedTagIDs.includes(v)) && selectedTagIDs.every(v => value.includes(v))
+  }, [value, selectedTagIDs])
+  const handleValueChange = () => {
+    const addTagIDs = selectedTagIDs.filter(v => !value.includes(v))
+    const removeTagIDs = value.filter(v => !selectedTagIDs.includes(v))
+    const selectedTags = tagList.filter(tag => selectedTagIDs.includes(tag.id))
+    onCacheUpdate(selectedTags)
+    Promise.all([
+      ...(addTagIDs.length ? [bind(addTagIDs)] : []),
+      ...[removeTagIDs.length ? removeTagIDs.map(tagID => unbind(tagID)) : []],
+    ]).finally(() => {
+      if (onChange)
+        onChange()
+    })
+  }
+  useUnmount(() => {
+    if (valueNotChanged)
+      return
+    handleValueChange()
+  })
+
+  return (
+    <div className='relative w-full rounded-lg border-[0.5px] border-components-panel-border bg-components-input-bg-hover'>
+      <div className='border-b-[0.5px] border-divider-regular p-2'>
+        <Input
+          showLeftIcon
+          showClearIcon
+          value={keywords}
+          placeholder={t('common.tag.selectorPlaceholder') || ''}
+          onChange={e => handleKeywordsChange(e.target.value)}
+          onClear={() => handleKeywordsChange('')}
+        />
+      </div>
+      {keywords && notExisted && (
+        <div className='p-1'>
+          <div className='flex cursor-pointer items-center gap-2 rounded-lg py-[6px] pl-3 pr-2 hover:bg-state-base-hover' onClick={createNewTag}>
+            <RiAddLine className='h-4 w-4 text-text-tertiary' />
+            <div className='grow truncate text-sm leading-5 text-text-secondary'>
+              {`${t('common.tag.create')} `}
+              <span className='font-medium'>{`"${keywords}"`}</span>
+            </div>
+          </div>
+        </div>
+      )}
+      {keywords && notExisted && filteredTagList.length > 0 && (
+        <Divider className='!my-0 !h-[1px]' />
+      )}
+      {(filteredTagList.length > 0 || filteredSelectedTagList.length > 0) && (
+        <div className='max-h-[172px] overflow-y-auto p-1'>
+          {filteredSelectedTagList.map(tag => (
+            <div
+              key={tag.id}
+              className='flex cursor-pointer items-center gap-2 rounded-lg py-[6px] pl-3 pr-2 hover:bg-state-base-hover'
+              onClick={() => selectTag(tag)}
+            >
+              <Checkbox
+                className='shrink-0'
+                checked={selectedTagIDs.includes(tag.id)}
+                onCheck={noop}
+              />
+              <div title={tag.name} className='grow truncate text-sm leading-5 text-text-secondary'>{tag.name}</div>
+            </div>
+          ))}
+          {filteredTagList.map(tag => (
+            <div
+              key={tag.id}
+              className='flex cursor-pointer items-center gap-2 rounded-lg py-[6px] pl-3 pr-2 hover:bg-state-base-hover'
+              onClick={() => selectTag(tag)}
+            >
+              <Checkbox
+                className='shrink-0'
+                checked={selectedTagIDs.includes(tag.id)}
+                onCheck={noop}
+              />
+              <div title={tag.name} className='grow truncate text-sm leading-5 text-text-secondary'>{tag.name}</div>
+            </div>
+          ))}
+        </div>
+      )}
+      {!keywords && !filteredTagList.length && !filteredSelectedTagList.length && (
+        <div className='p-1'>
+          <div className='flex flex-col items-center gap-1 p-3'>
+            <Tag03 className='h-6 w-6 text-text-quaternary' />
+            <div className='text-xs leading-[14px] text-text-tertiary'>{t('common.tag.noTag')}</div>
+          </div>
+        </div>
+      )}
+      <Divider className='!my-0 !h-[1px]' />
+      <div className='p-1'>
+        <div className='flex cursor-pointer items-center gap-2 rounded-lg py-[6px] pl-3 pr-2 hover:bg-state-base-hover' onClick={() => setShowTagManagementModal(true)}>
+          <Tag03 className='h-4 w-4 text-text-tertiary' />
+          <div className='grow truncate text-sm leading-5 text-text-secondary'>
+            {t('common.tag.manageTags')}
+          </div>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+const TagSelector: FC<TagSelectorProps> = ({
+  targetID,
+  isPopover = true,
+  position,
+  type,
+  value,
+  selectedTags,
+  onCacheUpdate,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  const tagList = useTagStore(s => s.tagList)
+  const setTagList = useTagStore(s => s.setTagList)
+
+  const getTagList = async () => {
+    const res = await fetchTagList(type)
+    setTagList(res)
+  }
+
+  const triggerContent = useMemo(() => {
+    if (selectedTags?.length)
+      return selectedTags.filter(selectedTag => tagList.find(tag => tag.id === selectedTag.id)).map(tag => tag.name).join(', ')
+    return ''
+  }, [selectedTags, tagList])
+
+  const Trigger = () => {
+    return (
+      <div className={cn(
+        'group/tip relative flex w-full cursor-pointer items-center gap-1 rounded-md px-2 py-[7px] hover:bg-state-base-hover',
+      )}>
+        <Tag01 className='h-3 w-3 shrink-0 text-components-input-text-placeholder' />
+        <div className='system-sm-regular grow truncate  text-start text-components-input-text-placeholder'>
+          {!triggerContent ? t('common.tag.addTag') : triggerContent}
+        </div>
+      </div>
+    )
+  }
+  return (
+    <>
+      {isPopover && (
+        <CustomPopover
+          htmlContent={
+            <Panel
+              type={type}
+              targetID={targetID}
+              value={value}
+              selectedTags={selectedTags}
+              onCacheUpdate={onCacheUpdate}
+              onChange={onChange}
+              onCreate={getTagList}
+            />
+          }
+          position={position}
+          trigger="click"
+          btnElement={<Trigger />}
+          btnClassName={open =>
+            cn(
+              open ? '!bg-state-base-hover !text-text-secondary' : '!bg-transparent',
+              '!w-full !border-0 !p-0 !text-text-tertiary hover:!bg-state-base-hover hover:!text-text-secondary',
+            )
+          }
+          popupClassName='!w-full !ring-0'
+          className={'!z-20 h-fit !w-full'}
+        />
+      )}
+    </>
+
+  )
+}
+
+export default TagSelector
diff --git a/app/components/base/tag-management/store.ts b/app/components/base/tag-management/store.ts
new file mode 100644
index 0000000..cb92ae9
--- /dev/null
+++ b/app/components/base/tag-management/store.ts
@@ -0,0 +1,19 @@
+import { create } from 'zustand'
+import type { Tag } from './constant'
+
+type State = {
+  tagList: Tag[]
+  showTagManagementModal: boolean
+}
+
+type Action = {
+  setTagList: (tagList?: Tag[]) => void
+  setShowTagManagementModal: (showTagManagementModal: boolean) => void
+}
+
+export const useStore = create<State & Action>(set => ({
+  tagList: [],
+  setTagList: tagList => set(() => ({ tagList })),
+  showTagManagementModal: false,
+  setShowTagManagementModal: showTagManagementModal => set(() => ({ showTagManagementModal })),
+}))
diff --git a/app/components/base/tag-management/tag-item-editor.tsx b/app/components/base/tag-management/tag-item-editor.tsx
new file mode 100644
index 0000000..3264979
--- /dev/null
+++ b/app/components/base/tag-management/tag-item-editor.tsx
@@ -0,0 +1,151 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import {
+  RiDeleteBinLine,
+  RiEditLine,
+} from '@remixicon/react'
+import { useDebounceFn } from 'ahooks'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import { useStore as useTagStore } from './store'
+import Confirm from '@/app/components/base/confirm'
+import cn from '@/utils/classnames'
+import type { Tag } from '@/app/components/base/tag-management/constant'
+import { ToastContext } from '@/app/components/base/toast'
+import {
+  deleteTag,
+  updateTag,
+} from '@/service/tag'
+
+type TagItemEditorProps = {
+  tag: Tag
+}
+const TagItemEditor: FC<TagItemEditorProps> = ({
+  tag,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const tagList = useTagStore(s => s.tagList)
+  const setTagList = useTagStore(s => s.setTagList)
+
+  const [isEditing, setIsEditing] = useState(false)
+  const [name, setName] = useState(tag.name)
+  const editTag = async (tagID: string, name: string) => {
+    if (name === tag.name) {
+      setIsEditing(false)
+      return
+    }
+    if (!name) {
+      notify({ type: 'error', message: 'tag name is empty' })
+      setName(tag.name)
+      setIsEditing(false)
+      return
+    }
+    try {
+      const newList = tagList.map((tag) => {
+        if (tag.id === tagID) {
+          return {
+            ...tag,
+            name,
+          }
+        }
+        return tag
+      })
+      setTagList([
+        ...newList,
+      ])
+      setIsEditing(false)
+      await updateTag(tagID, name)
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      setName(name)
+    }
+    catch {
+      notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+      setName(tag.name)
+      const recoverList = tagList.map((tag) => {
+        if (tag.id === tagID) {
+          return {
+            ...tag,
+            name: tag.name,
+          }
+        }
+        return tag
+      })
+      setTagList([
+        ...recoverList,
+      ])
+      setIsEditing(false)
+    }
+  }
+  const [showRemoveModal, setShowRemoveModal] = useState(false)
+  const [pending, setPending] = useState<boolean>(false)
+  const removeTag = async (tagID: string) => {
+    if (pending)
+      return
+    try {
+      setPending(true)
+      await deleteTag(tagID)
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      const newList = tagList.filter(tag => tag.id !== tagID)
+      setTagList([
+        ...newList,
+      ])
+      setPending(false)
+    }
+    catch {
+      notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+      setPending(false)
+    }
+  }
+  const { run: handleRemove } = useDebounceFn(() => {
+    removeTag(tag.id)
+  }, { wait: 200 })
+
+  return (
+    <>
+      <div className={cn('flex shrink-0 items-center gap-0.5 rounded-lg border border-components-panel-border py-1 pl-2 pr-1 text-sm leading-5 text-text-secondary')}>
+        {!isEditing && (
+          <>
+            <div className='text-sm leading-5 text-text-secondary'>
+              {tag.name}
+            </div>
+            <div className='leading-4.5 shrink-0 px-1 text-sm font-medium text-text-tertiary'>{tag.binding_count}</div>
+            <div className='group/edit shrink-0 cursor-pointer rounded-md p-1 hover:bg-state-base-hover' onClick={() => setIsEditing(true)}>
+              <RiEditLine className='h-3 w-3 text-text-tertiary group-hover/edit:text-text-secondary' />
+            </div>
+            <div className='group/remove shrink-0 cursor-pointer rounded-md p-1 hover:bg-state-base-hover' onClick={() => {
+              if (tag.binding_count)
+                setShowRemoveModal(true)
+              else
+                handleRemove()
+            }}>
+              <RiDeleteBinLine className='h-3 w-3 text-text-tertiary group-hover/remove:text-text-secondary' />
+            </div>
+          </>
+        )}
+        {isEditing && (
+          <input
+            className='shrink-0 appearance-none caret-primary-600 outline-none placeholder:text-text-quaternary'
+            autoFocus
+            value={name}
+            onChange={e => setName(e.target.value)}
+            onKeyDown={e => e.key === 'Enter' && editTag(tag.id, name)}
+            onBlur={() => editTag(tag.id, name)}
+          />
+        )}
+      </div>
+      <Confirm
+        title={`${t('common.tag.delete')} "${tag.name}"`}
+        isShow={showRemoveModal}
+        content={t('common.tag.deleteTip')}
+        onConfirm={() => {
+          handleRemove()
+          setShowRemoveModal(false)
+        }}
+        onCancel={() => setShowRemoveModal(false)}
+      />
+    </>
+  )
+}
+
+export default TagItemEditor
diff --git a/app/components/base/tag-management/tag-remove-modal.tsx b/app/components/base/tag-management/tag-remove-modal.tsx
new file mode 100644
index 0000000..85f1831
--- /dev/null
+++ b/app/components/base/tag-management/tag-remove-modal.tsx
@@ -0,0 +1,49 @@
+'use client'
+
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import Button from '@/app/components/base/button'
+import Modal from '@/app/components/base/modal'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback'
+import type { Tag } from '@/app/components/base/tag-management/constant'
+import { noop } from 'lodash-es'
+
+type TagRemoveModalProps = {
+  show: boolean
+  tag: Tag
+  onConfirm: () => void
+  onClose: () => void
+}
+
+const TagRemoveModal = ({ show, tag, onConfirm, onClose }: TagRemoveModalProps) => {
+  const { t } = useTranslation()
+
+  return (
+    <Modal
+      className={cn('w-[480px] max-w-[480px] p-8')}
+      isShow={show}
+      onClose={noop}
+    >
+      <div className='absolute right-4 top-4 cursor-pointer p-2' onClick={onClose}>
+        <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+      </div>
+      <div className='h-12 w-12 rounded-xl border-[0.5px] border-divider-regular bg-background-default-burn p-3 shadow-xl'>
+        <AlertTriangle className='h-6 w-6 text-[rgb(247,144,9)]' />
+      </div>
+      <div className='mt-3 text-xl font-semibold leading-[30px] text-text-primary'>
+        {`${t('common.tag.delete')} `}
+        <span>{`"${tag.name}"`}</span>
+      </div>
+      <div className='my-1 text-sm leading-5 text-text-tertiary'>
+        {t('common.tag.deleteTip')}
+      </div>
+      <div className='flex items-center justify-end pt-6'>
+        <Button className='mr-2' onClick={onClose}>{t('common.operation.cancel')}</Button>
+        <Button className='border-red-700' variant="warning" onClick={onConfirm}>{t('common.operation.delete')}</Button>
+      </div>
+    </Modal>
+  )
+}
+
+export default TagRemoveModal
diff --git a/app/components/base/tag/index.tsx b/app/components/base/tag/index.tsx
new file mode 100644
index 0000000..d7b9d3e
--- /dev/null
+++ b/app/components/base/tag/index.tsx
@@ -0,0 +1,42 @@
+import React from 'react'
+import classNames from '@/utils/classnames'
+
+export type ITagProps = {
+  children: string | React.ReactNode
+  color?: keyof typeof COLOR_MAP
+  className?: string
+  bordered?: boolean
+  hideBg?: boolean
+}
+
+const COLOR_MAP = {
+  green: {
+    text: 'text-green-800',
+    bg: 'bg-green-100',
+  },
+  yellow: {
+    text: 'text-yellow-800',
+    bg: 'bg-yellow-100',
+  },
+  red: {
+    text: 'text-red-800',
+    bg: 'bg-red-100',
+  },
+  gray: {
+    text: 'text-gray-800',
+    bg: 'bg-gray-100',
+  },
+}
+
+export default function Tag({ children, color = 'green', className = '', bordered = false, hideBg = false }: ITagProps) {
+  return (
+    <div className={
+      classNames('px-2.5 py-px text-xs leading-5 rounded-md inline-flex items-center flex-shrink-0',
+        COLOR_MAP[color] ? `${COLOR_MAP[color].text} ${COLOR_MAP[color].bg}` : '',
+        bordered ? 'border-[1px]' : '',
+        hideBg ? 'bg-opacity-0' : '',
+        className)} >
+      {children}
+    </div>
+  )
+}
diff --git a/app/components/base/text-generation/hooks.ts b/app/components/base/text-generation/hooks.ts
new file mode 100644
index 0000000..3d1bae9
--- /dev/null
+++ b/app/components/base/text-generation/hooks.ts
@@ -0,0 +1,61 @@
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useToastContext } from '@/app/components/base/toast'
+import { ssePost } from '@/service/base'
+
+export const useTextGeneration = () => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const [isResponding, setIsResponding] = useState(false)
+  const [completion, setCompletion] = useState('')
+  const [messageId, setMessageId] = useState<string | null>(null)
+
+  const handleSend = async (
+    url: string,
+    data: any,
+  ) => {
+    if (isResponding) {
+      notify({ type: 'info', message: t('appDebug.errorMessage.waitForResponse') })
+      return false
+    }
+
+    setIsResponding(true)
+    setCompletion('')
+    setMessageId('')
+    let res: string[] = []
+    ssePost(
+      url,
+      {
+        body: {
+          response_mode: 'streaming',
+          ...data,
+        },
+      },
+      {
+        onData: (data: string, _isFirstMessage: boolean, { messageId }) => {
+          res.push(data)
+          setCompletion(res.join(''))
+          setMessageId(messageId)
+        },
+        onMessageReplace: (messageReplace) => {
+          res = [messageReplace.answer]
+          setCompletion(res.join(''))
+        },
+        onCompleted() {
+          setIsResponding(false)
+        },
+        onError() {
+          setIsResponding(false)
+        },
+      })
+    return true
+  }
+
+  return {
+    completion,
+    isResponding,
+    setIsResponding,
+    handleSend,
+    messageId,
+  }
+}
diff --git a/app/components/base/text-generation/types.ts b/app/components/base/text-generation/types.ts
new file mode 100644
index 0000000..677a8e7
--- /dev/null
+++ b/app/components/base/text-generation/types.ts
@@ -0,0 +1,43 @@
+import type {
+  ModelConfig,
+  VisionFile,
+  VisionSettings,
+} from '@/types/app'
+import type { ExternalDataTool } from '@/models/common'
+export type { VisionFile } from '@/types/app'
+export { TransferMethod } from '@/types/app'
+
+export type UserInputForm = {
+  default: string
+  label: string
+  required: boolean
+  variable: string
+}
+
+export type UserInputFormTextInput = {
+  'text-input': UserInputForm & {
+    max_length: number
+  }
+}
+
+export type UserInputFormSelect = {
+  select: UserInputForm & {
+    options: string[]
+  }
+}
+
+export type UserInputFormParagraph = {
+  paragraph: UserInputForm
+}
+
+export type VisionConfig = VisionSettings
+
+export type EnableType = {
+  enabled: boolean
+}
+
+export type TextGenerationConfig = Omit<ModelConfig, 'model'> & {
+  external_data_tools: ExternalDataTool[]
+}
+
+export type OnSend = (message: string, files?: VisionFile[]) => void
diff --git a/app/components/base/textarea/index.tsx b/app/components/base/textarea/index.tsx
new file mode 100644
index 0000000..1e27451
--- /dev/null
+++ b/app/components/base/textarea/index.tsx
@@ -0,0 +1,54 @@
+import type { CSSProperties } from 'react'
+import React from 'react'
+import { type VariantProps, cva } from 'class-variance-authority'
+import cn from '@/utils/classnames'
+
+const textareaVariants = cva(
+  '',
+  {
+    variants: {
+      size: {
+        small: 'py-1 rounded-md system-xs-regular',
+        regular: 'px-3 rounded-md system-sm-regular',
+        large: 'px-4 rounded-lg system-md-regular',
+      },
+    },
+    defaultVariants: {
+      size: 'regular',
+    },
+  },
+)
+
+export type TextareaProps = {
+  value: string
+  disabled?: boolean
+  destructive?: boolean
+  styleCss?: CSSProperties
+} & React.TextareaHTMLAttributes<HTMLTextAreaElement> & VariantProps<typeof textareaVariants>
+
+const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
+  ({ className, value, onChange, disabled, size, destructive, styleCss, ...props }, ref) => {
+    return (
+      <textarea
+        ref={ref}
+        style={styleCss}
+        className={cn(
+          'min-h-20 w-full appearance-none border border-transparent bg-components-input-bg-normal p-2 text-components-input-text-filled caret-primary-600 outline-none placeholder:text-components-input-text-placeholder hover:border-components-input-border-hover hover:bg-components-input-bg-hover focus:border-components-input-border-active focus:bg-components-input-bg-active focus:shadow-xs',
+          textareaVariants({ size }),
+          disabled && 'cursor-not-allowed border-transparent bg-components-input-bg-disabled text-components-input-text-filled-disabled hover:border-transparent hover:bg-components-input-bg-disabled',
+          destructive && 'border-components-input-border-destructive bg-components-input-bg-destructive text-components-input-text-filled hover:border-components-input-border-destructive hover:bg-components-input-bg-destructive focus:border-components-input-border-destructive focus:bg-components-input-bg-destructive',
+          className,
+        )}
+        value={value}
+        onChange={onChange}
+        disabled={disabled}
+        {...props}
+      >
+      </textarea>
+    )
+  },
+)
+Textarea.displayName = 'Textarea'
+
+export default Textarea
+export { Textarea, textareaVariants }
diff --git a/app/components/base/theme-selector.tsx b/app/components/base/theme-selector.tsx
new file mode 100644
index 0000000..8dfe1d2
--- /dev/null
+++ b/app/components/base/theme-selector.tsx
@@ -0,0 +1,97 @@
+'use client'
+
+import { useState } from 'react'
+import {
+  RiCheckLine,
+  RiComputerLine,
+  RiMoonLine,
+  RiSunLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useTheme } from 'next-themes'
+import ActionButton from '@/app/components/base/action-button'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+
+export type Theme = 'light' | 'dark' | 'system'
+
+export default function ThemeSelector() {
+  const { t } = useTranslation()
+  const { theme, setTheme } = useTheme()
+  const [open, setOpen] = useState(false)
+
+  const handleThemeChange = (newTheme: Theme) => {
+    setTheme(newTheme)
+    setOpen(false)
+  }
+
+  const getCurrentIcon = () => {
+    switch (theme) {
+      case 'light': return <RiSunLine className='h-4 w-4 text-text-tertiary' />
+      case 'dark': return <RiMoonLine className='h-4 w-4 text-text-tertiary' />
+      default: return <RiComputerLine className='h-4 w-4 text-text-tertiary' />
+    }
+  }
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{ mainAxis: 6 }}
+    >
+      <PortalToFollowElemTrigger
+        onClick={() => setOpen(!open)}
+      >
+        <ActionButton
+          className={`h-8 w-8 p-[6px] ${open && 'bg-state-base-hover'}`}
+        >
+          {getCurrentIcon()}
+        </ActionButton>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[1000]'>
+        <div className='flex w-[144px] flex-col items-start rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
+          <button
+            className='flex w-full items-center gap-1 rounded-lg px-2 py-1.5 text-text-secondary hover:bg-state-base-hover'
+            onClick={() => handleThemeChange('light')}
+          >
+            <RiSunLine className='h-4 w-4 text-text-tertiary' />
+            <div className='flex grow items-center justify-start px-1'>
+              <span className='system-md-regular'>{t('common.theme.light')}</span>
+            </div>
+            {theme === 'light' && <div className='flex h-4 w-4 shrink-0 items-center justify-center'>
+              <RiCheckLine className='h-4 w-4 text-text-accent' />
+            </div>}
+          </button>
+          <button
+            className='flex w-full items-center gap-1 rounded-lg px-2 py-1.5 text-text-secondary hover:bg-state-base-hover'
+            onClick={() => handleThemeChange('dark')}
+          >
+            <RiMoonLine className='h-4 w-4 text-text-tertiary' />
+            <div className='flex grow items-center justify-start px-1'>
+              <span className='system-md-regular'>{t('common.theme.dark')}</span>
+            </div>
+            {theme === 'dark' && <div className='flex h-4 w-4 shrink-0 items-center justify-center'>
+              <RiCheckLine className='h-4 w-4 text-text-accent' />
+            </div>}
+          </button>
+          <button
+            className='flex w-full items-center gap-1 rounded-lg px-2 py-1.5 text-text-secondary hover:bg-state-base-hover'
+            onClick={() => handleThemeChange('system')}
+          >
+            <RiComputerLine className='h-4 w-4 text-text-tertiary' />
+            <div className='flex grow items-center justify-start px-1'>
+              <span className='system-md-regular'>{t('common.theme.auto')}</span>
+            </div>
+            {theme === 'system' && <div className='flex h-4 w-4 shrink-0 items-center justify-center'>
+              <RiCheckLine className='h-4 w-4 text-text-accent' />
+            </div>}
+          </button>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
diff --git a/app/components/base/theme-switcher.tsx b/app/components/base/theme-switcher.tsx
new file mode 100644
index 0000000..902d064
--- /dev/null
+++ b/app/components/base/theme-switcher.tsx
@@ -0,0 +1,58 @@
+'use client'
+import {
+  RiComputerLine,
+  RiMoonLine,
+  RiSunLine,
+} from '@remixicon/react'
+import { useTheme } from 'next-themes'
+import cn from '@/utils/classnames'
+
+export type Theme = 'light' | 'dark' | 'system'
+
+export default function ThemeSwitcher() {
+  const { theme, setTheme } = useTheme()
+
+  const handleThemeChange = (newTheme: Theme) => {
+    setTheme(newTheme)
+  }
+
+  return (
+    <div className='flex items-center rounded-[10px] bg-components-segmented-control-bg-normal p-0.5'>
+      <div
+        className={cn(
+          'rounded-lg px-2 py-1 text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
+          theme === 'system' && 'bg-components-segmented-control-item-active-bg text-text-accent-light-mode-only shadow-sm hover:bg-components-segmented-control-item-active-bg hover:text-text-accent-light-mode-only',
+        )}
+        onClick={() => handleThemeChange('system')}
+      >
+        <div className='p-0.5'>
+          <RiComputerLine className='h-4 w-4' />
+        </div>
+      </div>
+      <div className={cn('h-[14px] w-px bg-transparent', theme === 'dark' && 'bg-divider-regular')}></div>
+      <div
+        className={cn(
+          'rounded-lg px-2 py-1 text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
+          theme === 'light' && 'bg-components-segmented-control-item-active-bg text-text-accent-light-mode-only shadow-sm hover:bg-components-segmented-control-item-active-bg hover:text-text-accent-light-mode-only',
+        )}
+        onClick={() => handleThemeChange('light')}
+      >
+        <div className='p-0.5'>
+          <RiSunLine className='h-4 w-4' />
+        </div>
+      </div>
+      <div className={cn('h-[14px] w-px bg-transparent', theme === 'system' && 'bg-divider-regular')}></div>
+      <div
+        className={cn(
+          'rounded-lg px-2 py-1 text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
+          theme === 'dark' && 'bg-components-segmented-control-item-active-bg text-text-accent-light-mode-only shadow-sm hover:bg-components-segmented-control-item-active-bg hover:text-text-accent-light-mode-only',
+        )}
+        onClick={() => handleThemeChange('dark')}
+      >
+        <div className='p-0.5'>
+          <RiMoonLine className='h-4 w-4' />
+        </div>
+      </div>
+    </div>
+  )
+}
diff --git a/app/components/base/toast/index.spec.tsx b/app/components/base/toast/index.spec.tsx
new file mode 100644
index 0000000..2dac8d2
--- /dev/null
+++ b/app/components/base/toast/index.spec.tsx
@@ -0,0 +1,193 @@
+import type { ReactNode } from 'react'
+import React from 'react'
+import { act, render, screen, waitFor } from '@testing-library/react'
+import Toast, { ToastProvider, useToastContext } from '.'
+import '@testing-library/jest-dom'
+import { noop } from 'lodash-es'
+
+// Mock timers for testing timeouts
+jest.useFakeTimers()
+
+const TestComponent = () => {
+  const { notify, close } = useToastContext()
+
+  return (
+    <div>
+      <button onClick={() => notify({ message: 'Notification message', type: 'info' })}>
+        Show Toast
+      </button>
+      <button onClick={close}>Close Toast</button>
+    </div>
+  )
+}
+
+describe('Toast', () => {
+  describe('Toast Component', () => {
+    test('renders toast with correct type and message', () => {
+      render(
+        <ToastProvider>
+          <Toast type="success" message="Success message" />
+        </ToastProvider>,
+      )
+
+      expect(screen.getByText('Success message')).toBeInTheDocument()
+    })
+
+    test('renders with different types', () => {
+      const { rerender } = render(
+        <ToastProvider>
+          <Toast type="success" message="Success message" />
+        </ToastProvider>,
+      )
+
+      expect(document.querySelector('.text-text-success')).toBeInTheDocument()
+
+      rerender(
+        <ToastProvider>
+          <Toast type="error" message="Error message" />
+        </ToastProvider>,
+      )
+
+      expect(document.querySelector('.text-text-destructive')).toBeInTheDocument()
+    })
+
+    test('renders with custom component', () => {
+      render(
+        <ToastProvider>
+          <Toast
+            message="Message with custom component"
+            customComponent={<span data-testid="custom-component">Custom</span>}
+          />
+        </ToastProvider>,
+      )
+
+      expect(screen.getByTestId('custom-component')).toBeInTheDocument()
+    })
+
+    test('renders children content', () => {
+      render(
+        <ToastProvider>
+          <Toast message="Message with children">
+            <span>Additional information</span>
+          </Toast>
+        </ToastProvider>,
+      )
+
+      expect(screen.getByText('Additional information')).toBeInTheDocument()
+    })
+
+    test('does not render close button when close is undefined', () => {
+      // Create a modified context where close is undefined
+      const CustomToastContext = React.createContext({ notify: noop, close: undefined })
+
+      // Create a wrapper component using the custom context
+      const Wrapper = ({ children }: { children: ReactNode }) => (
+        <CustomToastContext.Provider value={{ notify: noop, close: undefined }}>
+          {children}
+        </CustomToastContext.Provider>
+      )
+
+      render(
+        <Wrapper>
+          <Toast message="No close button" type="info" />
+        </Wrapper>,
+      )
+
+      expect(screen.getByText('No close button')).toBeInTheDocument()
+      // Ensure the close button is not rendered
+      expect(document.querySelector('.h-4.w-4.shrink-0.text-text-tertiary')).not.toBeInTheDocument()
+    })
+  })
+
+  describe('ToastProvider and Context', () => {
+    test('shows and hides toast using context', async () => {
+      render(
+        <ToastProvider>
+          <TestComponent />
+        </ToastProvider>,
+      )
+
+      // No toast initially
+      expect(screen.queryByText('Notification message')).not.toBeInTheDocument()
+
+      // Show toast
+      act(() => {
+        screen.getByText('Show Toast').click()
+      })
+      expect(screen.getByText('Notification message')).toBeInTheDocument()
+
+      // Close toast
+      act(() => {
+        screen.getByText('Close Toast').click()
+      })
+      expect(screen.queryByText('Notification message')).not.toBeInTheDocument()
+    })
+
+    test('automatically hides toast after duration', async () => {
+      render(
+        <ToastProvider>
+          <TestComponent />
+        </ToastProvider>,
+      )
+
+      // Show toast
+      act(() => {
+        screen.getByText('Show Toast').click()
+      })
+      expect(screen.getByText('Notification message')).toBeInTheDocument()
+
+      // Fast-forward timer
+      act(() => {
+        jest.advanceTimersByTime(3000) // Default for info type is 3000ms
+      })
+
+      // Toast should be gone
+      await waitFor(() => {
+        expect(screen.queryByText('Notification message')).not.toBeInTheDocument()
+      })
+    })
+  })
+
+  describe('Toast.notify static method', () => {
+    test('creates and removes toast from DOM', async () => {
+      act(() => {
+        // Call the static method
+        Toast.notify({ message: 'Static notification', type: 'warning' })
+      })
+
+      // Toast should be in document
+      expect(screen.getByText('Static notification')).toBeInTheDocument()
+
+      // Fast-forward timer
+      act(() => {
+        jest.advanceTimersByTime(6000) // Default for warning type is 6000ms
+      })
+
+      // Toast should be removed
+      await waitFor(() => {
+        expect(screen.queryByText('Static notification')).not.toBeInTheDocument()
+      })
+    })
+
+    test('calls onClose callback after duration', async () => {
+      const onCloseMock = jest.fn()
+      act(() => {
+        Toast.notify({
+          message: 'Closing notification',
+          type: 'success',
+          onClose: onCloseMock,
+        })
+      })
+
+      // Fast-forward timer
+      act(() => {
+        jest.advanceTimersByTime(3000) // Default for success type is 3000ms
+      })
+
+      // onClose should be called
+      await waitFor(() => {
+        expect(onCloseMock).toHaveBeenCalled()
+      })
+    })
+  })
+})
diff --git a/app/components/base/toast/index.tsx b/app/components/base/toast/index.tsx
new file mode 100644
index 0000000..725c7af
--- /dev/null
+++ b/app/components/base/toast/index.tsx
@@ -0,0 +1,161 @@
+'use client'
+import type { ReactNode } from 'react'
+import React, { useEffect, useState } from 'react'
+import { createRoot } from 'react-dom/client'
+import {
+  RiAlertFill,
+  RiCheckboxCircleFill,
+  RiCloseLine,
+  RiErrorWarningFill,
+  RiInformation2Fill,
+} from '@remixicon/react'
+import { createContext, useContext } from 'use-context-selector'
+import ActionButton from '@/app/components/base/action-button'
+import classNames from '@/utils/classnames'
+import { noop } from 'lodash-es'
+
+export type IToastProps = {
+  type?: 'success' | 'error' | 'warning' | 'info'
+  size?: 'md' | 'sm'
+  duration?: number
+  message: string
+  children?: ReactNode
+  onClose?: () => void
+  className?: string
+  customComponent?: ReactNode
+}
+type IToastContext = {
+  notify: (props: IToastProps) => void
+  close: () => void
+}
+
+export const ToastContext = createContext<IToastContext>({} as IToastContext)
+export const useToastContext = () => useContext(ToastContext)
+const Toast = ({
+  type = 'info',
+  size = 'md',
+  message,
+  children,
+  className,
+  customComponent,
+}: IToastProps) => {
+  const { close } = useToastContext()
+  // sometimes message is react node array. Not handle it.
+  if (typeof message !== 'string')
+    return null
+
+  return <div className={classNames(
+    className,
+    'fixed w-[360px] rounded-xl my-4 mx-8 flex-grow z-[9999] overflow-hidden',
+    size === 'md' ? 'p-3' : 'p-2',
+    'border border-components-panel-border-subtle bg-components-panel-bg-blur shadow-sm',
+    'top-0',
+    'right-0',
+  )}>
+    <div className={`absolute inset-0 -z-10 opacity-40 ${
+      (type === 'success' && 'bg-toast-success-bg')
+      || (type === 'warning' && 'bg-toast-warning-bg')
+      || (type === 'error' && 'bg-toast-error-bg')
+      || (type === 'info' && 'bg-toast-info-bg')
+    }`}
+    />
+    <div className={`flex ${size === 'md' ? 'gap-1' : 'gap-0.5'}`}>
+      <div className={`flex items-center justify-center ${size === 'md' ? 'p-0.5' : 'p-1'}`}>
+        {type === 'success' && <RiCheckboxCircleFill className={`${size === 'md' ? 'h-5 w-5' : 'h-4 w-4'} text-text-success`} aria-hidden="true" />}
+        {type === 'error' && <RiErrorWarningFill className={`${size === 'md' ? 'h-5 w-5' : 'h-4 w-4'} text-text-destructive`} aria-hidden="true" />}
+        {type === 'warning' && <RiAlertFill className={`${size === 'md' ? 'h-5 w-5' : 'h-4 w-4'} text-text-warning-secondary`} aria-hidden="true" />}
+        {type === 'info' && <RiInformation2Fill className={`${size === 'md' ? 'h-5 w-5' : 'h-4 w-4'} text-text-accent`} aria-hidden="true" />}
+      </div>
+      <div className={`flex py-1 ${size === 'md' ? 'px-1' : 'px-0.5'} grow flex-col items-start gap-1`}>
+        <div className='flex items-center gap-1'>
+          <div className='system-sm-semibold text-text-primary [word-break:break-word]'>{message}</div>
+          {customComponent}
+        </div>
+        {children && <div className='system-xs-regular text-text-secondary'>
+          {children}
+        </div>
+        }
+      </div>
+      {close
+        && (<ActionButton className='z-[1000]' onClick={close}>
+          <RiCloseLine className='h-4 w-4 shrink-0 text-text-tertiary' />
+        </ActionButton>)
+      }
+    </div>
+  </div>
+}
+
+export const ToastProvider = ({
+  children,
+}: {
+  children: ReactNode
+}) => {
+  const placeholder: IToastProps = {
+    type: 'info',
+    message: 'Toast message',
+    duration: 6000,
+  }
+  const [params, setParams] = React.useState<IToastProps>(placeholder)
+  const defaultDuring = (params.type === 'success' || params.type === 'info') ? 3000 : 6000
+  const [mounted, setMounted] = useState(false)
+
+  useEffect(() => {
+    if (mounted) {
+      setTimeout(() => {
+        setMounted(false)
+      }, params.duration || defaultDuring)
+    }
+  }, [defaultDuring, mounted, params.duration])
+
+  return <ToastContext.Provider value={{
+    notify: (props) => {
+      setMounted(true)
+      setParams(props)
+    },
+    close: () => setMounted(false),
+  }}>
+    {mounted && <Toast {...params} />}
+    {children}
+  </ToastContext.Provider>
+}
+
+Toast.notify = ({
+  type,
+  size = 'md',
+  message,
+  duration,
+  className,
+  customComponent,
+  onClose,
+}: Pick<IToastProps, 'type' | 'size' | 'message' | 'duration' | 'className' | 'customComponent' | 'onClose'>) => {
+  const defaultDuring = (type === 'success' || type === 'info') ? 3000 : 6000
+  if (typeof window === 'object') {
+    const holder = document.createElement('div')
+    const root = createRoot(holder)
+
+    root.render(
+      <ToastContext.Provider value={{
+        notify: noop,
+        close: () => {
+          if (holder) {
+            root.unmount()
+            holder.remove()
+          }
+          onClose?.()
+        },
+      }}>
+        <Toast type={type} size={size} message={message} duration={duration} className={className} customComponent={customComponent} />
+      </ToastContext.Provider>,
+    )
+    document.body.appendChild(holder)
+    setTimeout(() => {
+      if (holder) {
+        root.unmount()
+        holder.remove()
+      }
+      onClose?.()
+    }, duration || defaultDuring)
+  }
+}
+
+export default Toast
diff --git a/app/components/base/toast/style.module.css b/app/components/base/toast/style.module.css
new file mode 100644
index 0000000..216ccf1
--- /dev/null
+++ b/app/components/base/toast/style.module.css
@@ -0,0 +1,44 @@
+.toast {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  position: fixed;
+  z-index: 99999999;
+  width: 1.84rem;
+  height: 1.80rem;
+  left: 50%;
+  top: 50%;
+  transform: translateX(-50%) translateY(-50%);
+  background: #000000;
+  box-shadow: 0 -.04rem .1rem 1px rgba(255, 255, 255, 0.1);
+  border-radius: .1rem .1rem .1rem .1rem;
+}
+
+.main {
+  width: 2rem;
+}
+
+.icon {
+  margin-bottom: .2rem;
+  height: .4rem;
+  background: center center no-repeat;
+  background-size: contain;
+}
+
+/* .success {
+  background-image: url('./icons/success.svg');
+}
+
+.warning {
+  background-image: url('./icons/warning.svg');
+}
+
+.error {
+  background-image: url('./icons/error.svg');
+} */
+
+.text {
+  text-align: center;
+  font-size: .2rem;
+  color: rgba(255, 255, 255, 0.86);
+}
diff --git a/app/components/base/tooltip/content.tsx b/app/components/base/tooltip/content.tsx
new file mode 100644
index 0000000..f30940a
--- /dev/null
+++ b/app/components/base/tooltip/content.tsx
@@ -0,0 +1,22 @@
+import type { FC, PropsWithChildren, ReactNode } from 'react'
+
+export type ToolTipContentProps = {
+  title?: ReactNode
+  action?: ReactNode
+} & PropsWithChildren
+
+export const ToolTipContent: FC<ToolTipContentProps> = ({
+  title,
+  action,
+  children,
+}) => {
+  return (
+    <div className='w-[180px]'>
+      {title && (
+        <div className='mb-1.5 font-semibold text-text-secondary'>{title}</div>
+      )}
+      <div className='mb-1.5 text-text-tertiary'>{children}</div>
+      {action && <div className='cursor-pointer text-text-accent'>{action}</div>}
+    </div>
+  )
+}
diff --git a/app/components/base/tooltip/index.spec.tsx b/app/components/base/tooltip/index.spec.tsx
new file mode 100644
index 0000000..1b9b7a0
--- /dev/null
+++ b/app/components/base/tooltip/index.spec.tsx
@@ -0,0 +1,116 @@
+import React from 'react'
+import { act, cleanup, fireEvent, render, screen } from '@testing-library/react'
+import '@testing-library/jest-dom'
+import Tooltip from './index'
+
+afterEach(cleanup)
+
+describe('Tooltip', () => {
+  describe('Rendering', () => {
+    test('should render default tooltip with question icon', () => {
+      const triggerClassName = 'custom-trigger'
+      const { container } = render(<Tooltip popupContent="Tooltip content" triggerClassName={triggerClassName} />)
+      const trigger = container.querySelector(`.${triggerClassName}`)
+      expect(trigger).not.toBeNull()
+      expect(trigger?.querySelector('svg')).not.toBeNull() // question icon
+    })
+
+    test('should render with custom children', () => {
+      const { getByText } = render(
+        <Tooltip popupContent="Tooltip content">
+          <button>Hover me</button>
+        </Tooltip>,
+      )
+      expect(getByText('Hover me').textContent).toBe('Hover me')
+    })
+  })
+
+  describe('Disabled state', () => {
+    test('should not show tooltip when disabled', () => {
+      const triggerClassName = 'custom-trigger'
+      const { container } = render(<Tooltip popupContent="Tooltip content" disabled triggerClassName={triggerClassName} />)
+      const trigger = container.querySelector(`.${triggerClassName}`)
+      act(() => {
+        fireEvent.mouseEnter(trigger!)
+      })
+      expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
+    })
+  })
+
+  describe('Trigger methods', () => {
+    test('should open on hover when triggerMethod is hover', () => {
+      const triggerClassName = 'custom-trigger'
+      const { container } = render(<Tooltip popupContent="Tooltip content" triggerClassName={triggerClassName} />)
+      const trigger = container.querySelector(`.${triggerClassName}`)
+      act(() => {
+        fireEvent.mouseEnter(trigger!)
+      })
+      expect(screen.queryByText('Tooltip content')).toBeInTheDocument()
+    })
+
+    test('should close on mouse leave when triggerMethod is hover', () => {
+      const triggerClassName = 'custom-trigger'
+      const { container } = render(<Tooltip popupContent="Tooltip content" triggerClassName={triggerClassName} />)
+      const trigger = container.querySelector(`.${triggerClassName}`)
+      act(() => {
+        fireEvent.mouseEnter(trigger!)
+        fireEvent.mouseLeave(trigger!)
+      })
+      expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
+    })
+
+    test('should toggle on click when triggerMethod is click', () => {
+      const triggerClassName = 'custom-trigger'
+      const { container } = render(<Tooltip popupContent="Tooltip content" triggerMethod="click" triggerClassName={triggerClassName} />)
+      const trigger = container.querySelector(`.${triggerClassName}`)
+      act(() => {
+        fireEvent.click(trigger!)
+      })
+      expect(screen.queryByText('Tooltip content')).toBeInTheDocument()
+    })
+
+    test('should not close immediately on mouse leave when needsDelay is true', () => {
+      const triggerClassName = 'custom-trigger'
+      const { container } = render(<Tooltip popupContent="Tooltip content" triggerMethod="hover" needsDelay triggerClassName={triggerClassName} />)
+      const trigger = container.querySelector(`.${triggerClassName}`)
+      act(() => {
+        fireEvent.mouseEnter(trigger!)
+        fireEvent.mouseLeave(trigger!)
+      })
+      expect(screen.queryByText('Tooltip content')).toBeInTheDocument()
+    })
+  })
+
+  describe('Styling and positioning', () => {
+    test('should apply custom trigger className', () => {
+      const triggerClassName = 'custom-trigger'
+      const { container } = render(<Tooltip popupContent="Tooltip content" triggerClassName={triggerClassName} />)
+      const trigger = container.querySelector(`.${triggerClassName}`)
+      expect(trigger?.className).toContain('custom-trigger')
+    })
+
+    test('should apply custom popup className', async () => {
+      const triggerClassName = 'custom-trigger'
+      const { container } = render(<Tooltip popupContent="Tooltip content" triggerClassName={triggerClassName} popupClassName="custom-popup" />)
+      const trigger = container.querySelector(`.${triggerClassName}`)
+      act(() => {
+        fireEvent.mouseEnter(trigger!)
+      })
+      expect((await screen.findByText('Tooltip content'))?.className).toContain('custom-popup')
+    })
+
+    test('should apply noDecoration when specified', async () => {
+      const triggerClassName = 'custom-trigger'
+      const { container } = render(<Tooltip
+        popupContent="Tooltip content"
+        triggerClassName={triggerClassName}
+        noDecoration
+      />)
+      const trigger = container.querySelector(`.${triggerClassName}`)
+      act(() => {
+        fireEvent.mouseEnter(trigger!)
+      })
+      expect((await screen.findByText('Tooltip content'))?.className).not.toContain('bg-components-panel-bg')
+    })
+  })
+})
diff --git a/app/components/base/tooltip/index.tsx b/app/components/base/tooltip/index.tsx
new file mode 100644
index 0000000..e6c4de3
--- /dev/null
+++ b/app/components/base/tooltip/index.tsx
@@ -0,0 +1,116 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useRef, useState } from 'react'
+import { useBoolean } from 'ahooks'
+import type { OffsetOptions, Placement } from '@floating-ui/react'
+import { RiQuestionLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+export type TooltipProps = {
+  position?: Placement
+  triggerMethod?: 'hover' | 'click'
+  triggerClassName?: string
+  triggerTestId?: string
+  disabled?: boolean
+  popupContent?: React.ReactNode
+  children?: React.ReactNode
+  popupClassName?: string
+  noDecoration?: boolean
+  offset?: OffsetOptions
+  needsDelay?: boolean
+  asChild?: boolean
+}
+
+const Tooltip: FC<TooltipProps> = ({
+  position = 'top',
+  triggerMethod = 'hover',
+  triggerClassName,
+  triggerTestId,
+  disabled = false,
+  popupContent,
+  children,
+  popupClassName,
+  noDecoration,
+  offset,
+  asChild = true,
+  needsDelay = false,
+}) => {
+  const [open, setOpen] = useState(false)
+  const [isHoverPopup, {
+    setTrue: setHoverPopup,
+    setFalse: setNotHoverPopup,
+  }] = useBoolean(false)
+
+  const isHoverPopupRef = useRef(isHoverPopup)
+  useEffect(() => {
+    isHoverPopupRef.current = isHoverPopup
+  }, [isHoverPopup])
+
+  const [isHoverTrigger, {
+    setTrue: setHoverTrigger,
+    setFalse: setNotHoverTrigger,
+  }] = useBoolean(false)
+
+  const isHoverTriggerRef = useRef(isHoverTrigger)
+  useEffect(() => {
+    isHoverTriggerRef.current = isHoverTrigger
+  }, [isHoverTrigger])
+
+  const handleLeave = (isTrigger: boolean) => {
+    if (isTrigger)
+      setNotHoverTrigger()
+
+    else
+      setNotHoverPopup()
+
+    // give time to move to the popup
+    if (needsDelay) {
+      setTimeout(() => {
+        if (!isHoverPopupRef.current && !isHoverTriggerRef.current)
+          setOpen(false)
+      }, 500)
+    }
+    else {
+      setOpen(false)
+    }
+  }
+
+  return (
+    <PortalToFollowElem
+      open={disabled ? false : open}
+      onOpenChange={setOpen}
+      placement={position}
+      offset={offset ?? 8}
+    >
+      <PortalToFollowElemTrigger
+        onClick={() => triggerMethod === 'click' && setOpen(v => !v)}
+        onMouseEnter={() => {
+          if (triggerMethod === 'hover') {
+            setHoverTrigger()
+            setOpen(true)
+          }
+        }}
+        onMouseLeave={() => triggerMethod === 'hover' && handleLeave(true)}
+        asChild={asChild}
+      >
+        {children || <div data-testid={triggerTestId} className={triggerClassName || 'h-3.5 w-3.5 shrink-0 p-[1px]'}><RiQuestionLine className='h-full w-full text-text-quaternary hover:text-text-tertiary' /></div>}
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent
+        className="z-[9999]"
+      >
+        {popupContent && (<div
+          className={cn(
+            !noDecoration && 'system-xs-regular relative break-words rounded-md bg-components-panel-bg px-3 py-2 text-text-tertiary shadow-lg',
+            popupClassName,
+          )}
+          onMouseEnter={() => triggerMethod === 'hover' && setHoverPopup()}
+          onMouseLeave={() => triggerMethod === 'hover' && handleLeave(false)}
+        >
+          {popupContent}
+        </div>)}
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default React.memo(Tooltip)
diff --git a/app/components/base/video-gallery/VideoPlayer.module.css b/app/components/base/video-gallery/VideoPlayer.module.css
new file mode 100644
index 0000000..04c4a36
--- /dev/null
+++ b/app/components/base/video-gallery/VideoPlayer.module.css
@@ -0,0 +1,188 @@
+.videoPlayer {
+  position: relative;
+  width: 100%;
+  max-width: 800px;
+  margin: 0 auto;
+  border-radius: 8px;
+  overflow: hidden;
+}
+
+.video {
+  width: 100%;
+  display: block;
+}
+
+.controls {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  justify-content: flex-end;
+  transition: opacity 0.3s ease;
+}
+
+.controls.hidden {
+  opacity: 0;
+}
+
+.controls.visible {
+  opacity: 1;
+}
+
+.overlay {
+  background: linear-gradient(to top, rgba(0, 0, 0, 0.7) 0%, transparent 100%);
+  padding: 20px;
+  display: flex;
+  flex-direction: column;
+}
+
+.progressBarContainer {
+  width: 100%;
+  margin-bottom: 10px;
+}
+
+.controlsContent {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.leftControls, .rightControls {
+  display: flex;
+  align-items: center;
+}
+
+.playPauseButton, .muteButton, .fullscreenButton {
+  background: none;
+  border: none;
+  color: white;
+  cursor: pointer;
+  padding: 4px;
+  margin-right: 10px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.playPauseButton:hover, .muteButton:hover, .fullscreenButton:hover {
+  background-color: rgba(255, 255, 255, 0.1);
+  border-radius: 50%;
+}
+
+.time {
+  color: white;
+  font-size: 14px;
+  margin-left: 8px;
+}
+
+.volumeControl {
+  display: flex;
+  align-items: center;
+  margin-right: 16px;
+}
+
+.volumeSlider {
+  width: 60px;
+  height: 4px;
+  background: rgba(255, 255, 255, 0.3);
+  border-radius: 2px;
+  cursor: pointer;
+  margin-left: 12px;
+  position: relative;
+}
+
+.volumeLevel {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 100%;
+  background: #ffffff;
+  border-radius: 2px;
+}
+
+.progressBar {
+  position: relative;
+  width: 100%;
+  height: 4px;
+  background: rgba(255, 255, 255, 0.3);
+  cursor: pointer;
+  border-radius: 2px;
+  overflow: visible;
+  transition: height 0.2s ease;
+}
+
+.progressBar:hover {
+  height: 6px;
+}
+
+.progress {
+  height: 100%;
+  background: #ffffff;
+  transition: width 0.1s ease-in-out;
+}
+
+.hoverTimeIndicator {
+  position: absolute;
+  bottom: 100%;
+  transform: translateX(-50%);
+  background-color: rgba(0, 0, 0, 0.7);
+  color: white;
+  padding: 4px 8px;
+  border-radius: 4px;
+  font-size: 12px;
+  pointer-events: none;
+  white-space: nowrap;
+  margin-bottom: 8px;
+}
+
+.hoverTimeIndicator::after {
+  content: '';
+  position: absolute;
+  top: 100%;
+  left: 50%;
+  margin-left: -4px;
+  border-width: 4px;
+  border-style: solid;
+  border-color: rgba(0, 0, 0, 0.7) transparent transparent transparent;
+}
+
+.controls.smallSize .controlsContent {
+  justify-content: space-between;
+}
+
+.controls.smallSize .leftControls,
+.controls.smallSize .rightControls {
+  flex: 0 0 auto;
+  display: flex;
+  align-items: center;
+}
+
+.controls.smallSize .rightControls {
+  justify-content: flex-end;
+}
+
+.controls.smallSize .progressBarContainer {
+  margin-bottom: 4px;
+}
+
+.controls.smallSize .playPauseButton,
+.controls.smallSize .muteButton,
+.controls.smallSize .fullscreenButton {
+  padding: 2px;
+  margin-right: 4px;
+}
+
+.controls.smallSize .playPauseButton svg,
+.controls.smallSize .muteButton svg,
+.controls.smallSize .fullscreenButton svg {
+  width: 16px;
+  height: 16px;
+}
+
+.controls.smallSize .muteButton {
+  order: -1;
+}
diff --git a/app/components/base/video-gallery/VideoPlayer.tsx b/app/components/base/video-gallery/VideoPlayer.tsx
new file mode 100644
index 0000000..d7c86a1
--- /dev/null
+++ b/app/components/base/video-gallery/VideoPlayer.tsx
@@ -0,0 +1,278 @@
+import React, { useCallback, useEffect, useRef, useState } from 'react'
+import styles from './VideoPlayer.module.css'
+
+type VideoPlayerProps = {
+  src: string
+}
+
+const PlayIcon = () => (
+  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M8 5V19L19 12L8 5Z" fill="currentColor"/>
+  </svg>
+)
+
+const PauseIcon = () => (
+  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M6 19H10V5H6V19ZM14 5V19H18V5H14Z" fill="currentColor"/>
+  </svg>
+)
+
+const MuteIcon = () => (
+  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M3 9V15H7L12 20V4L7 9H3ZM16.5 12C16.5 10.23 15.48 8.71 14 7.97V16.02C15.48 15.29 16.5 13.77 16.5 12ZM14 3.23V5.29C16.89 6.15 19 8.83 19 12C19 15.17 16.89 17.85 14 18.71V20.77C18.01 19.86 21 16.28 21 12C21 7.72 18.01 4.14 14 3.23Z" fill="currentColor"/>
+  </svg>
+)
+
+const UnmuteIcon = () => (
+  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M4.34 2.93L2.93 4.34L7.29 8.7L7 9H3V15H7L12 20V13.41L16.18 17.59C15.69 17.96 15.16 18.27 14.58 18.5V20.58C15.94 20.22 17.15 19.56 18.13 18.67L19.66 20.2L21.07 18.79L4.34 2.93ZM10 15.17L7.83 13H5V11H7.83L10 8.83V15.17ZM19 12C19 12.82 18.85 13.61 18.59 14.34L20.12 15.87C20.68 14.7 21 13.39 21 12C21 7.72 18.01 4.14 14 3.23V5.29C16.89 6.15 19 8.83 19 12ZM12 4L10.12 5.88L12 7.76V4ZM16.5 12C16.5 10.23 15.48 8.71 14 7.97V10.18L16.45 12.63C16.48 12.43 16.5 12.22 16.5 12Z" fill="currentColor"/>
+  </svg>
+)
+
+const FullscreenIcon = () => (
+  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M7 14H5V19H10V17H7V14ZM5 10H7V7H10V5H5V10ZM17 17H14V19H19V14H17V17ZM14 5V7H17V10H19V5H14Z" fill="currentColor"/>
+  </svg>
+)
+
+const VideoPlayer: React.FC<VideoPlayerProps> = ({ src }) => {
+  const [isPlaying, setIsPlaying] = useState(false)
+  const [currentTime, setCurrentTime] = useState(0)
+  const [duration, setDuration] = useState(0)
+  const [isMuted, setIsMuted] = useState(false)
+  const [volume, setVolume] = useState(1)
+  const [isDragging, setIsDragging] = useState(false)
+  const [isControlsVisible, setIsControlsVisible] = useState(true)
+  const [hoverTime, setHoverTime] = useState<number | null>(null)
+  const videoRef = useRef<HTMLVideoElement>(null)
+  const progressRef = useRef<HTMLDivElement>(null)
+  const volumeRef = useRef<HTMLDivElement>(null)
+  const controlsTimeoutRef = useRef<NodeJS.Timeout | null>(null)
+  const [isSmallSize, setIsSmallSize] = useState(false)
+  const containerRef = useRef<HTMLDivElement>(null)
+
+  useEffect(() => {
+    const video = videoRef.current
+    if (!video)
+      return
+
+    const setVideoData = () => {
+      setDuration(video.duration)
+      setVolume(video.volume)
+    }
+
+    const setVideoTime = () => {
+      setCurrentTime(video.currentTime)
+    }
+
+    const handleEnded = () => {
+      setIsPlaying(false)
+    }
+
+    video.addEventListener('loadedmetadata', setVideoData)
+    video.addEventListener('timeupdate', setVideoTime)
+    video.addEventListener('ended', handleEnded)
+
+    return () => {
+      video.removeEventListener('loadedmetadata', setVideoData)
+      video.removeEventListener('timeupdate', setVideoTime)
+      video.removeEventListener('ended', handleEnded)
+    }
+  }, [src])
+
+  useEffect(() => {
+    return () => {
+      if (controlsTimeoutRef.current)
+        clearTimeout(controlsTimeoutRef.current)
+    }
+  }, [])
+
+  const showControls = useCallback(() => {
+    setIsControlsVisible(true)
+    if (controlsTimeoutRef.current)
+      clearTimeout(controlsTimeoutRef.current)
+
+    controlsTimeoutRef.current = setTimeout(() => setIsControlsVisible(false), 3000)
+  }, [])
+
+  const togglePlayPause = useCallback(() => {
+    const video = videoRef.current
+    if (video) {
+      if (isPlaying)
+        video.pause()
+      else video.play().catch(error => console.error('Error playing video:', error))
+      setIsPlaying(!isPlaying)
+    }
+  }, [isPlaying])
+
+  const toggleMute = useCallback(() => {
+    const video = videoRef.current
+    if (video) {
+      const newMutedState = !video.muted
+      video.muted = newMutedState
+      setIsMuted(newMutedState)
+      setVolume(newMutedState ? 0 : (video.volume > 0 ? video.volume : 1))
+      video.volume = newMutedState ? 0 : (video.volume > 0 ? video.volume : 1)
+    }
+  }, [])
+
+  const toggleFullscreen = useCallback(() => {
+    const video = videoRef.current
+    if (video) {
+      if (document.fullscreenElement)
+        document.exitFullscreen()
+      else video.requestFullscreen()
+    }
+  }, [])
+
+  const formatTime = (time: number) => {
+    const minutes = Math.floor(time / 60)
+    const seconds = Math.floor(time % 60)
+    return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`
+  }
+
+  const updateVideoProgress = useCallback((clientX: number) => {
+    const progressBar = progressRef.current
+    const video = videoRef.current
+    if (progressBar && video) {
+      const rect = progressBar.getBoundingClientRect()
+      const pos = (clientX - rect.left) / rect.width
+      const newTime = pos * video.duration
+      if (newTime >= 0 && newTime <= video.duration) {
+        setHoverTime(newTime)
+        if (isDragging)
+          video.currentTime = newTime
+      }
+    }
+  }, [isDragging])
+
+  const handleMouseMove = useCallback((e: React.MouseEvent<HTMLDivElement>) => {
+    updateVideoProgress(e.clientX)
+  }, [updateVideoProgress])
+
+  const handleMouseLeave = useCallback(() => {
+    if (!isDragging)
+      setHoverTime(null)
+  }, [isDragging])
+
+  const handleMouseDown = useCallback((e: React.MouseEvent<HTMLDivElement>) => {
+    e.preventDefault()
+    setIsDragging(true)
+    updateVideoProgress(e.clientX)
+  }, [updateVideoProgress])
+
+  useEffect(() => {
+    const handleGlobalMouseMove = (e: MouseEvent) => {
+      if (isDragging)
+        updateVideoProgress(e.clientX)
+    }
+
+    const handleGlobalMouseUp = () => {
+      setIsDragging(false)
+      setHoverTime(null)
+    }
+
+    if (isDragging) {
+      document.addEventListener('mousemove', handleGlobalMouseMove)
+      document.addEventListener('mouseup', handleGlobalMouseUp)
+    }
+
+    return () => {
+      document.removeEventListener('mousemove', handleGlobalMouseMove)
+      document.removeEventListener('mouseup', handleGlobalMouseUp)
+    }
+  }, [isDragging, updateVideoProgress])
+
+  const checkSize = useCallback(() => {
+    if (containerRef.current)
+      setIsSmallSize(containerRef.current.offsetWidth < 400)
+  }, [])
+
+  useEffect(() => {
+    checkSize()
+    window.addEventListener('resize', checkSize)
+    return () => window.removeEventListener('resize', checkSize)
+  }, [checkSize])
+
+  const handleVolumeChange = useCallback((e: React.MouseEvent<HTMLDivElement>) => {
+    const volumeBar = volumeRef.current
+    const video = videoRef.current
+    if (volumeBar && video) {
+      const rect = volumeBar.getBoundingClientRect()
+      const newVolume = (e.clientX - rect.left) / rect.width
+      const clampedVolume = Math.max(0, Math.min(1, newVolume))
+      video.volume = clampedVolume
+      setVolume(clampedVolume)
+      setIsMuted(clampedVolume === 0)
+    }
+  }, [])
+
+  return (
+    <div ref={containerRef} className={styles.videoPlayer} onMouseMove={showControls} onMouseEnter={showControls}>
+      <video ref={videoRef} src={src} className={styles.video} />
+      <div className={`${styles.controls} ${isControlsVisible ? styles.visible : styles.hidden} ${isSmallSize ? styles.smallSize : ''}`}>
+        <div className={styles.overlay}>
+          <div className={styles.progressBarContainer}>
+            <div
+              ref={progressRef}
+              className={styles.progressBar}
+              onClick={handleMouseDown}
+              onMouseMove={handleMouseMove}
+              onMouseLeave={handleMouseLeave}
+              onMouseDown={handleMouseDown}
+            >
+              <div className={styles.progress} style={{ width: `${(currentTime / duration) * 100}%` }} />
+              {hoverTime !== null && (
+                <div
+                  className={styles.hoverTimeIndicator}
+                  style={{ left: `${(hoverTime / duration) * 100}%` }}
+                >
+                  {formatTime(hoverTime)}
+                </div>
+              )}
+            </div>
+          </div>
+          <div className={styles.controlsContent}>
+            <div className={styles.leftControls}>
+              <button className={styles.playPauseButton} onClick={togglePlayPause}>
+                {isPlaying ? <PauseIcon /> : <PlayIcon />}
+              </button>
+              {!isSmallSize && (<span className={styles.time}>{formatTime(currentTime)} / {formatTime(duration)}</span>)}
+            </div>
+            <div className={styles.rightControls}>
+              <button className={styles.muteButton} onClick={toggleMute}>
+                {isMuted ? <UnmuteIcon /> : <MuteIcon />}
+              </button>
+              {!isSmallSize && (
+                <div className={styles.volumeControl}>
+                  <div
+                    ref={volumeRef}
+                    className={styles.volumeSlider}
+                    onClick={handleVolumeChange}
+                    onMouseDown={(e) => {
+                      handleVolumeChange(e)
+                      const handleMouseMove = (e: MouseEvent) => handleVolumeChange(e as unknown as React.MouseEvent<HTMLDivElement>)
+                      const handleMouseUp = () => {
+                        document.removeEventListener('mousemove', handleMouseMove)
+                        document.removeEventListener('mouseup', handleMouseUp)
+                      }
+                      document.addEventListener('mousemove', handleMouseMove)
+                      document.addEventListener('mouseup', handleMouseUp)
+                    }}
+                  >
+                    <div className={styles.volumeLevel} style={{ width: `${volume * 100}%` }} />
+                  </div>
+                </div>
+              )}
+              <button className={styles.fullscreenButton} onClick={toggleFullscreen}>
+                <FullscreenIcon />
+              </button>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default VideoPlayer
diff --git a/app/components/base/video-gallery/index.tsx b/app/components/base/video-gallery/index.tsx
new file mode 100644
index 0000000..ae2fab8
--- /dev/null
+++ b/app/components/base/video-gallery/index.tsx
@@ -0,0 +1,12 @@
+import React from 'react'
+import VideoPlayer from './VideoPlayer'
+
+type Props = {
+  srcs: string[]
+}
+
+const VideoGallery: React.FC<Props> = ({ srcs }) => {
+  return (<><br/>{srcs.map((src, index) => (<React.Fragment key={`video_${index}`}><br/><VideoPlayer src={src}/></React.Fragment>))}</>)
+}
+
+export default React.memo(VideoGallery)
diff --git a/app/components/base/voice-input/index.module.css b/app/components/base/voice-input/index.module.css
new file mode 100644
index 0000000..8286f9d
--- /dev/null
+++ b/app/components/base/voice-input/index.module.css
@@ -0,0 +1,10 @@
+.wrapper {
+  background: linear-gradient(131deg, #2250F2 0%, #0EBCF3 100%);
+  box-shadow: 0px 4px 6px -2px rgba(16, 24, 40, 0.03), 0px 12px 16px -4px rgba(16, 24, 40, 0.08);
+}
+
+.convert {
+  background: linear-gradient(91.92deg, #104AE1 -1.74%, #0098EE 75.74%);
+  background-clip: text;
+  color: transparent;
+}
diff --git a/app/components/base/voice-input/index.tsx b/app/components/base/voice-input/index.tsx
new file mode 100644
index 0000000..5a5400a
--- /dev/null
+++ b/app/components/base/voice-input/index.tsx
@@ -0,0 +1,216 @@
+import { useCallback, useEffect, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useParams, usePathname } from 'next/navigation'
+import {
+  RiCloseLine,
+  RiLoader2Line,
+} from '@remixicon/react'
+import Recorder from 'js-audio-recorder'
+import { useRafInterval } from 'ahooks'
+import { convertToMp3 } from './utils'
+import s from './index.module.css'
+import cn from '@/utils/classnames'
+import { StopCircle } from '@/app/components/base/icons/src/vender/solid/mediaAndDevices'
+import { audioToText } from '@/service/share'
+
+type VoiceInputTypes = {
+  onConverted: (text: string) => void
+  onCancel: () => void
+  wordTimestamps?: string
+}
+
+const VoiceInput = ({
+  onCancel,
+  onConverted,
+  wordTimestamps,
+}: VoiceInputTypes) => {
+  const { t } = useTranslation()
+  const recorder = useRef(new Recorder({
+    sampleBits: 16,
+    sampleRate: 16000,
+    numChannels: 1,
+    compiling: false,
+  }))
+  const canvasRef = useRef<HTMLCanvasElement | null>(null)
+  const ctxRef = useRef<CanvasRenderingContext2D | null>(null)
+  const drawRecordId = useRef<number | null>(null)
+  const [originDuration, setOriginDuration] = useState(0)
+  const [startRecord, setStartRecord] = useState(false)
+  const [startConvert, setStartConvert] = useState(false)
+  const pathname = usePathname()
+  const params = useParams()
+  const clearInterval = useRafInterval(() => {
+    setOriginDuration(originDuration + 1)
+  }, 1000)
+
+  const drawRecord = useCallback(() => {
+    drawRecordId.current = requestAnimationFrame(drawRecord)
+    const canvas = canvasRef.current!
+    const ctx = ctxRef.current!
+    const dataUnit8Array = recorder.current.getRecordAnalyseData()
+    const dataArray = [].slice.call(dataUnit8Array)
+    const lineLength = Number.parseInt(`${canvas.width / 3}`)
+    const gap = Number.parseInt(`${1024 / lineLength}`)
+
+    ctx.clearRect(0, 0, canvas.width, canvas.height)
+    ctx.beginPath()
+    let x = 0
+    for (let i = 0; i < lineLength; i++) {
+      let v = dataArray.slice(i * gap, i * gap + gap).reduce((prev: number, next: number) => {
+        return prev + next
+      }, 0) / gap
+
+      if (v < 128)
+        v = 128
+      if (v > 178)
+        v = 178
+      const y = (v - 128) / 50 * canvas.height
+
+      ctx.moveTo(x, 16)
+      if (ctx.roundRect)
+        ctx.roundRect(x, 16 - y, 2, y, [1, 1, 0, 0])
+      else
+        ctx.rect(x, 16 - y, 2, y)
+      ctx.fill()
+      x += 3
+    }
+    ctx.closePath()
+  }, [])
+  const handleStopRecorder = useCallback(async () => {
+    clearInterval()
+    setStartRecord(false)
+    setStartConvert(true)
+    recorder.current.stop()
+    drawRecordId.current && cancelAnimationFrame(drawRecordId.current)
+    drawRecordId.current = null
+    const canvas = canvasRef.current!
+    const ctx = ctxRef.current!
+    ctx.clearRect(0, 0, canvas.width, canvas.height)
+    const mp3Blob = convertToMp3(recorder.current)
+    const mp3File = new File([mp3Blob], 'temp.mp3', { type: 'audio/mp3' })
+    const formData = new FormData()
+    formData.append('file', mp3File)
+    formData.append('word_timestamps', wordTimestamps || 'disabled')
+
+    let url = ''
+    let isPublic = false
+
+    if (params.token) {
+      url = '/audio-to-text'
+      isPublic = true
+    }
+    else if (params.appId) {
+      if (pathname.search('explore/installed') > -1)
+        url = `/installed-apps/${params.appId}/audio-to-text`
+      else
+        url = `/apps/${params.appId}/audio-to-text`
+    }
+
+    try {
+      const audioResponse = await audioToText(url, isPublic, formData)
+      onConverted(audioResponse.text)
+      onCancel()
+    }
+    catch {
+      onConverted('')
+      onCancel()
+    }
+  }, [clearInterval, onCancel, onConverted, params.appId, params.token, pathname, wordTimestamps])
+  const handleStartRecord = async () => {
+    try {
+      await recorder.current.start()
+      setStartRecord(true)
+      setStartConvert(false)
+
+      if (canvasRef.current && ctxRef.current)
+        drawRecord()
+    }
+    catch {
+      onCancel()
+    }
+  }
+
+  const initCanvas = () => {
+    const dpr = window.devicePixelRatio || 1
+    const canvas = document.getElementById('voice-input-record') as HTMLCanvasElement
+
+    if (canvas) {
+      const { width: cssWidth, height: cssHeight } = canvas.getBoundingClientRect()
+
+      canvas.width = dpr * cssWidth
+      canvas.height = dpr * cssHeight
+      canvasRef.current = canvas
+
+      const ctx = canvas.getContext('2d')
+      if (ctx) {
+        ctx.scale(dpr, dpr)
+        ctx.fillStyle = 'rgba(209, 224, 255, 1)'
+        ctxRef.current = ctx
+      }
+    }
+  }
+  if (originDuration >= 600 && startRecord)
+    handleStopRecorder()
+
+  useEffect(() => {
+    initCanvas()
+    handleStartRecord()
+    const recorderRef = recorder?.current
+    return () => {
+      recorderRef?.stop()
+    }
+  }, [])
+
+  const minutes = Number.parseInt(`${Number.parseInt(`${originDuration}`) / 60}`)
+  const seconds = Number.parseInt(`${originDuration}`) % 60
+
+  return (
+    <div className={cn(s.wrapper, 'absolute inset-0 rounded-xl')}>
+      <div className='absolute inset-[1.5px] flex items-center overflow-hidden rounded-[10.5px] bg-primary-25 py-[14px] pl-[14.5px] pr-[6.5px]'>
+        <canvas id='voice-input-record' className='absolute bottom-0 left-0 h-4 w-full' />
+        {
+          startConvert && <RiLoader2Line className='mr-2 h-4 w-4 animate-spin text-primary-700' />
+        }
+        <div className='grow'>
+          {
+            startRecord && (
+              <div className='text-sm text-gray-500'>
+                {t('common.voiceInput.speaking')}
+              </div>
+            )
+          }
+          {
+            startConvert && (
+              <div className={cn(s.convert, 'text-sm')}>
+                {t('common.voiceInput.converting')}
+              </div>
+            )
+          }
+        </div>
+        {
+          startRecord && (
+            <div
+              className='mr-1 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg  hover:bg-primary-100'
+              onClick={handleStopRecorder}
+            >
+              <StopCircle className='h-5 w-5 text-primary-600' />
+            </div>
+          )
+        }
+        {
+          startConvert && (
+            <div
+              className='mr-1 flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg  hover:bg-gray-200'
+              onClick={onCancel}
+            >
+              <RiCloseLine className='h-4 w-4 text-gray-500' />
+            </div>
+          )
+        }
+        <div className={`w-[45px] pl-1 text-xs font-medium ${originDuration > 500 ? 'text-[#F04438]' : 'text-gray-700'}`}>{`0${minutes.toFixed(0)}:${seconds >= 10 ? seconds : `0${seconds}`}`}</div>
+      </div>
+    </div>
+  )
+}
+
+export default VoiceInput
diff --git a/app/components/base/voice-input/utils.ts b/app/components/base/voice-input/utils.ts
new file mode 100644
index 0000000..70133f4
--- /dev/null
+++ b/app/components/base/voice-input/utils.ts
@@ -0,0 +1,47 @@
+import lamejs from 'lamejs'
+import MPEGMode from 'lamejs/src/js/MPEGMode'
+import Lame from 'lamejs/src/js/Lame'
+import BitStream from 'lamejs/src/js/BitStream'
+
+if (globalThis) {
+  (globalThis as any).MPEGMode = MPEGMode
+  ;(globalThis as any).Lame = Lame
+  ;(globalThis as any).BitStream = BitStream
+}
+
+export const convertToMp3 = (recorder: any) => {
+  const wav = lamejs.WavHeader.readHeader(recorder.getWAV())
+  const { channels, sampleRate } = wav
+  const mp3enc = new lamejs.Mp3Encoder(channels, sampleRate, 128)
+  const result = recorder.getChannelData()
+  const buffer = []
+
+  const leftData = result.left && new Int16Array(result.left.buffer, 0, result.left.byteLength / 2)
+  const rightData = result.right && new Int16Array(result.right.buffer, 0, result.right.byteLength / 2)
+  const remaining = leftData.length + (rightData ? rightData.length : 0)
+
+  const maxSamples = 1152
+  for (let i = 0; i < remaining; i += maxSamples) {
+    const left = leftData.subarray(i, i + maxSamples)
+    let right = null
+    let mp3buf = null
+
+    if (channels === 2) {
+      right = rightData.subarray(i, i + maxSamples)
+      mp3buf = mp3enc.encodeBuffer(left, right)
+    }
+    else {
+      mp3buf = mp3enc.encodeBuffer(left)
+    }
+
+    if (mp3buf.length > 0)
+      buffer.push(mp3buf)
+  }
+
+  const enc = mp3enc.flush()
+
+  if (enc.length > 0)
+    buffer.push(enc)
+
+  return new Blob(buffer, { type: 'audio/mp3' })
+}
diff --git a/app/components/base/with-input-validation/index.spec.tsx b/app/components/base/with-input-validation/index.spec.tsx
new file mode 100644
index 0000000..732a16d
--- /dev/null
+++ b/app/components/base/with-input-validation/index.spec.tsx
@@ -0,0 +1,41 @@
+import { render, screen } from '@testing-library/react'
+import '@testing-library/jest-dom'
+import { z } from 'zod'
+import withValidation from '.'
+import { noop } from 'lodash-es'
+
+describe('withValidation HOC', () => {
+  // schema for validation
+  const schema = z.object({ name: z.string() })
+  type Props = z.infer<typeof schema> & {
+    age: number
+  }
+
+  const TestComponent = ({ name, age }: Props) => (
+    <div>{name} - {age}</div>
+  )
+  const WrappedComponent = withValidation(TestComponent, schema)
+
+  beforeAll(() => {
+    jest.spyOn(console, 'error').mockImplementation(noop)
+  })
+
+  afterAll(() => {
+    jest.restoreAllMocks()
+  })
+
+  it('renders the component when validation passes', () => {
+    render(<WrappedComponent name='Valid Name' age={30} />)
+    expect(screen.getByText('Valid Name - 30')).toBeInTheDocument()
+  })
+
+  it('renders the component when props is invalid but not in schema ', () => {
+    render(<WrappedComponent name='Valid Name' age={'aaa' as any} />)
+    expect(screen.getByText('Valid Name - aaa')).toBeInTheDocument()
+  })
+
+  it('does not render the component when validation fails', () => {
+    render(<WrappedComponent name={123 as any} age={30} />)
+    expect(screen.queryByText('123 - 30')).toBeNull()
+  })
+})
diff --git a/app/components/base/with-input-validation/index.tsx b/app/components/base/with-input-validation/index.tsx
new file mode 100644
index 0000000..6036b79
--- /dev/null
+++ b/app/components/base/with-input-validation/index.tsx
@@ -0,0 +1,24 @@
+'use client'
+import React from 'react'
+import type { ZodSchema } from 'zod'
+
+function withValidation<T extends Record<string, unknown>, K extends keyof T>(
+  WrappedComponent: React.ComponentType<T>,
+  schema: ZodSchema<Pick<T, K>>,
+) {
+  return function EnsuredComponent(props: T) {
+    const partialProps = Object.fromEntries(
+      Object.entries(props).filter(([key]) => key in (schema._def as any).shape),
+    ) as Pick<T, K>
+
+    const checkRes = schema.safeParse(partialProps)
+    if (!checkRes.success) {
+      console.error(checkRes.error)
+      // Maybe there is a better way to handle this, like error logic placeholder
+      return null
+    }
+    return <WrappedComponent {...props} />
+  }
+}
+
+export default withValidation
diff --git a/app/components/billing/annotation-full/index.tsx b/app/components/billing/annotation-full/index.tsx
new file mode 100644
index 0000000..88ed5f1
--- /dev/null
+++ b/app/components/billing/annotation-full/index.tsx
@@ -0,0 +1,31 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import UpgradeBtn from '../upgrade-btn'
+import Usage from './usage'
+import s from './style.module.css'
+import cn from '@/utils/classnames'
+import GridMask from '@/app/components/base/grid-mask'
+
+const AnnotationFull: FC = () => {
+  const { t } = useTranslation()
+
+  return (
+    <GridMask wrapperClassName='rounded-lg' canvasClassName='rounded-lg' gradientClassName='rounded-lg'>
+      <div className='mt-6 flex cursor-pointer flex-col rounded-lg border-2 border-solid border-transparent px-3.5 py-4 shadow-md transition-all duration-200 ease-in-out'>
+        <div className='flex items-center justify-between'>
+          <div className={cn(s.textGradient, 'text-base font-semibold leading-[24px]')}>
+            <div>{t('billing.annotatedResponse.fullTipLine1')}</div>
+            <div>{t('billing.annotatedResponse.fullTipLine2')}</div>
+          </div>
+          <div className='flex'>
+            <UpgradeBtn loc={'annotation-create'} />
+          </div>
+        </div>
+        <Usage className='mt-4' />
+      </div>
+    </GridMask>
+  )
+}
+export default React.memo(AnnotationFull)
diff --git a/app/components/billing/annotation-full/modal.tsx b/app/components/billing/annotation-full/modal.tsx
new file mode 100644
index 0000000..324a4dc
--- /dev/null
+++ b/app/components/billing/annotation-full/modal.tsx
@@ -0,0 +1,47 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import UpgradeBtn from '../upgrade-btn'
+import Modal from '../../base/modal'
+import Usage from './usage'
+import s from './style.module.css'
+import cn from '@/utils/classnames'
+import GridMask from '@/app/components/base/grid-mask'
+
+type Props = {
+  show: boolean
+  onHide: () => void
+}
+const AnnotationFullModal: FC<Props> = ({
+  show,
+  onHide,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <Modal
+      isShow={show}
+      onClose={onHide}
+      closable
+      className='!p-0'
+    >
+      <GridMask wrapperClassName='rounded-lg' canvasClassName='rounded-lg' gradientClassName='rounded-lg'>
+        <div className='mt-6 flex cursor-pointer flex-col rounded-lg border-2 border-solid border-transparent px-7 py-6 shadow-md transition-all duration-200 ease-in-out'>
+          <div className='flex items-center justify-between'>
+            <div className={cn(s.textGradient, 'text-[18px] font-semibold leading-[27px]')}>
+              <div>{t('billing.annotatedResponse.fullTipLine1')}</div>
+              <div>{t('billing.annotatedResponse.fullTipLine2')}</div>
+            </div>
+
+          </div>
+          <Usage className='mt-4' />
+          <div className='mt-7 flex justify-end'>
+            <UpgradeBtn loc={'annotation-create'} />
+          </div>
+        </div>
+      </GridMask>
+    </Modal>
+  )
+}
+export default React.memo(AnnotationFullModal)
diff --git a/app/components/billing/annotation-full/style.module.css b/app/components/billing/annotation-full/style.module.css
new file mode 100644
index 0000000..15bedd8
--- /dev/null
+++ b/app/components/billing/annotation-full/style.module.css
@@ -0,0 +1,7 @@
+.textGradient {
+  background: linear-gradient(92deg, #2250F2 -29.55%, #0EBCF3 75.22%);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+  text-fill-color: transparent;
+}
diff --git a/app/components/billing/annotation-full/usage.tsx b/app/components/billing/annotation-full/usage.tsx
new file mode 100644
index 0000000..44a97de
--- /dev/null
+++ b/app/components/billing/annotation-full/usage.tsx
@@ -0,0 +1,32 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { MessageFastPlus } from '../../base/icons/src/vender/line/communication'
+import UsageInfo from '../usage-info'
+import { useProviderContext } from '@/context/provider-context'
+
+type Props = {
+  className?: string
+}
+
+const Usage: FC<Props> = ({
+  className,
+}) => {
+  const { t } = useTranslation()
+  const { plan } = useProviderContext()
+  const {
+    usage,
+    total,
+  } = plan
+  return (
+    <UsageInfo
+      className={className}
+      Icon={MessageFastPlus}
+      name={t('billing.annotatedResponse.quotaTitle')}
+      usage={usage.annotatedResponse}
+      total={total.annotatedResponse}
+    />
+  )
+}
+export default React.memo(Usage)
diff --git a/app/components/billing/apps-full-in-dialog/index.tsx b/app/components/billing/apps-full-in-dialog/index.tsx
new file mode 100644
index 0000000..b721b94
--- /dev/null
+++ b/app/components/billing/apps-full-in-dialog/index.tsx
@@ -0,0 +1,84 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import UpgradeBtn from '../upgrade-btn'
+import ProgressBar from '@/app/components/billing/progress-bar'
+import Button from '@/app/components/base/button'
+import { mailToSupport } from '@/app/components/header/utils/util'
+import { useProviderContext } from '@/context/provider-context'
+import { useAppContext } from '@/context/app-context'
+import { Plan } from '@/app/components/billing/type'
+import s from './style.module.css'
+import cn from '@/utils/classnames'
+
+const LOW = 50
+const MIDDLE = 80
+
+const AppsFull: FC<{ loc: string; className?: string; }> = ({
+  loc,
+  className,
+}) => {
+  const { t } = useTranslation()
+  const { plan } = useProviderContext()
+  const { userProfile, langeniusVersionInfo } = useAppContext()
+  const isTeam = plan.type === Plan.team
+  const usage = plan.usage.buildApps
+  const total = plan.total.buildApps
+  const percent = usage / total * 100
+  const color = (() => {
+    if (percent < LOW)
+      return 'bg-components-progress-bar-progress-solid'
+
+    if (percent < MIDDLE)
+      return 'bg-components-progress-warning-progress'
+
+    return 'bg-components-progress-error-progress'
+  })()
+  return (
+    <div className={cn(
+      'flex flex-col gap-3 rounded-xl border-[0.5px] border-components-panel-border-subtle bg-components-panel-on-panel-item-bg p-4 shadow-xs backdrop-blur-sm',
+      className,
+    )}>
+      <div className='flex justify-between'>
+        {!isTeam && (
+          <div>
+            <div className={cn('title-xl-semi-bold mb-1', s.textGradient)}>
+              {t('billing.apps.fullTip1')}
+            </div>
+            <div className='system-xs-regular text-text-tertiary'>{t('billing.apps.fullTip1des')}</div>
+          </div>
+        )}
+        {isTeam && (
+          <div>
+            <div className={cn('title-xl-semi-bold mb-1', s.textGradient)}>
+              {t('billing.apps.fullTip2')}
+            </div>
+            <div className='system-xs-regular text-text-tertiary'>{t('billing.apps.fullTip2des')}</div>
+          </div>
+        )}
+        {(plan.type === Plan.sandbox || plan.type === Plan.professional) && (
+          <UpgradeBtn isShort loc={loc} />
+        )}
+        {plan.type !== Plan.sandbox && plan.type !== Plan.professional && (
+          <Button variant='secondary-accent'>
+            <a target='_blank' rel='noopener noreferrer' href={mailToSupport(userProfile.email, plan.type, langeniusVersionInfo.current_version)}>
+              {t('billing.apps.contactUs')}
+            </a>
+          </Button>
+        )}
+      </div>
+      <div className='flex flex-col gap-2'>
+        <div className='system-xs-medium flex items-center justify-between text-text-secondary'>
+          <div>{t('billing.usagePage.buildApps')}</div>
+          <div>{usage}/{total}</div>
+        </div>
+        <ProgressBar
+          percent={percent}
+          color={color}
+        />
+      </div>
+    </div>
+  )
+}
+export default React.memo(AppsFull)
diff --git a/app/components/billing/apps-full-in-dialog/style.module.css b/app/components/billing/apps-full-in-dialog/style.module.css
new file mode 100644
index 0000000..1f68e66
--- /dev/null
+++ b/app/components/billing/apps-full-in-dialog/style.module.css
@@ -0,0 +1,7 @@
+.textGradient {
+  background: linear-gradient(92deg, #0EBCF3 -29.55%, #2250F2 75.22%);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+  text-fill-color: transparent;
+}
diff --git a/app/components/billing/billing-page/index.tsx b/app/components/billing/billing-page/index.tsx
new file mode 100644
index 0000000..43e80f4
--- /dev/null
+++ b/app/components/billing/billing-page/index.tsx
@@ -0,0 +1,40 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import useSWR from 'swr'
+import {
+  RiArrowRightUpLine,
+} from '@remixicon/react'
+import PlanComp from '../plan'
+import Divider from '@/app/components/base/divider'
+import { fetchBillingUrl } from '@/service/billing'
+import { useAppContext } from '@/context/app-context'
+import { useProviderContext } from '@/context/provider-context'
+
+const Billing: FC = () => {
+  const { t } = useTranslation()
+  const { isCurrentWorkspaceManager } = useAppContext()
+  const { enableBilling } = useProviderContext()
+  const { data: billingUrl } = useSWR(
+    (!enableBilling || !isCurrentWorkspaceManager) ? null : ['/billing/invoices'],
+    () => fetchBillingUrl().then(data => data.url),
+  )
+
+  return (
+    <div>
+      <PlanComp loc={'billing-page'} />
+      {enableBilling && isCurrentWorkspaceManager && billingUrl && (
+        <>
+          <Divider className='my-4' />
+          <a className='system-xs-medium flex cursor-pointer items-center text-text-accent-light-mode-only' href={billingUrl} target='_blank' rel='noopener noreferrer'>
+            <span className='pr-0.5'>{t('billing.viewBilling')}</span>
+            <RiArrowRightUpLine className='h-4 w-4' />
+          </a>
+        </>
+      )}
+    </div>
+  )
+}
+
+export default React.memo(Billing)
diff --git a/app/components/billing/config.ts b/app/components/billing/config.ts
new file mode 100644
index 0000000..1d5fbc7
--- /dev/null
+++ b/app/components/billing/config.ts
@@ -0,0 +1,86 @@
+import type { BasicPlan } from '@/app/components/billing/type'
+import { Plan, type PlanInfo, Priority } from '@/app/components/billing/type'
+
+const supportModelProviders = 'OpenAI/Anthropic/Llama2/Azure OpenAI/Hugging Face/Replicate'
+
+export const NUM_INFINITE = 99999999
+export const contractSales = 'contractSales'
+export const unAvailable = 'unAvailable'
+
+export const contactSalesUrl = 'https://vikgc6bnu1s.typeform.com/dify-business'
+export const getStartedWithCommunityUrl = 'https://github.com/langgenius/dify'
+export const getWithPremiumUrl = 'https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6'
+
+export const ALL_PLANS: Record<BasicPlan, PlanInfo> = {
+  sandbox: {
+    level: 1,
+    price: 0,
+    modelProviders: supportModelProviders,
+    teamWorkspace: 1,
+    teamMembers: 1,
+    buildApps: 5,
+    documents: 50,
+    vectorSpace: '50MB',
+    documentsUploadQuota: 0,
+    documentsRequestQuota: 10,
+    apiRateLimit: 5000,
+    documentProcessingPriority: Priority.standard,
+    messageRequest: 200,
+    annotatedResponse: 10,
+    logHistory: 30,
+  },
+  professional: {
+    level: 2,
+    price: 59,
+    modelProviders: supportModelProviders,
+    teamWorkspace: 1,
+    teamMembers: 3,
+    buildApps: 50,
+    documents: 500,
+    vectorSpace: '5GB',
+    documentsUploadQuota: 0,
+    documentsRequestQuota: 100,
+    apiRateLimit: NUM_INFINITE,
+    documentProcessingPriority: Priority.priority,
+    messageRequest: 5000,
+    annotatedResponse: 2000,
+    logHistory: NUM_INFINITE,
+  },
+  team: {
+    level: 3,
+    price: 159,
+    modelProviders: supportModelProviders,
+    teamWorkspace: 1,
+    teamMembers: 50,
+    buildApps: 200,
+    documents: 1000,
+    vectorSpace: '20GB',
+    documentsUploadQuota: 0,
+    documentsRequestQuota: 1000,
+    apiRateLimit: NUM_INFINITE,
+    documentProcessingPriority: Priority.topPriority,
+    messageRequest: 10000,
+    annotatedResponse: 5000,
+    logHistory: NUM_INFINITE,
+  },
+}
+
+export const defaultPlan = {
+  type: Plan.sandbox as BasicPlan,
+  usage: {
+    documents: 50,
+    vectorSpace: 1,
+    buildApps: 1,
+    teamMembers: 1,
+    annotatedResponse: 1,
+    documentsUploadQuota: 0,
+  },
+  total: {
+    documents: 50,
+    vectorSpace: 10,
+    buildApps: 10,
+    teamMembers: 1,
+    annotatedResponse: 10,
+    documentsUploadQuota: 0,
+  },
+}
diff --git a/app/components/billing/header-billing-btn/index.tsx b/app/components/billing/header-billing-btn/index.tsx
new file mode 100644
index 0000000..f34fa0b
--- /dev/null
+++ b/app/components/billing/header-billing-btn/index.tsx
@@ -0,0 +1,60 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import UpgradeBtn from '../upgrade-btn'
+import { Plan } from '../type'
+import cn from '@/utils/classnames'
+import { useProviderContext } from '@/context/provider-context'
+
+type Props = {
+  onClick?: () => void
+  isDisplayOnly?: boolean
+}
+
+const HeaderBillingBtn: FC<Props> = ({
+  onClick,
+  isDisplayOnly = false,
+}) => {
+  const { plan, enableBilling, isFetchedPlan } = useProviderContext()
+  const {
+    type,
+  } = plan
+
+  const name = (() => {
+    if (type === Plan.professional)
+      return 'pro'
+    return type
+  })()
+  const classNames = (() => {
+    if (type === Plan.professional)
+      return `border-[#E0F2FE] ${!isDisplayOnly ? 'hover:border-[#B9E6FE]' : ''} bg-[#E0F2FE] text-[#026AA2]`
+    if (type === Plan.team)
+      return `border-[#E0EAFF] ${!isDisplayOnly ? 'hover:border-[#C7D7FE]' : ''} bg-[#E0EAFF] text-[#3538CD]`
+    return ''
+  })()
+
+  if (!enableBilling || !isFetchedPlan)
+    return null
+
+  if (type === Plan.sandbox)
+    return <UpgradeBtn onClick={isDisplayOnly ? undefined : onClick} isShort />
+
+  const handleClick = () => {
+    if (!isDisplayOnly && onClick)
+      onClick()
+  }
+
+  return (
+    <div
+      onClick={handleClick}
+      className={cn(
+        classNames,
+        'flex h-[22px] items-center rounded-md border px-2 text-xs font-semibold uppercase',
+        isDisplayOnly ? 'cursor-default' : 'cursor-pointer',
+      )}
+    >
+      {name}
+    </div>
+  )
+}
+export default React.memo(HeaderBillingBtn)
diff --git a/app/components/billing/plan/index.tsx b/app/components/billing/plan/index.tsx
new file mode 100644
index 0000000..7badb36
--- /dev/null
+++ b/app/components/billing/plan/index.tsx
@@ -0,0 +1,137 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { useRouter } from 'next/navigation'
+import {
+  RiBook2Line,
+  RiBox3Line,
+  RiFileEditLine,
+  RiGraduationCapLine,
+  RiGroup3Line,
+  RiGroupLine,
+  RiSquareLine,
+} from '@remixicon/react'
+import { Plan, SelfHostedPlan } from '../type'
+import VectorSpaceInfo from '../usage-info/vector-space-info'
+import AppsInfo from '../usage-info/apps-info'
+import UpgradeBtn from '../upgrade-btn'
+import { useProviderContext } from '@/context/provider-context'
+import { useAppContext } from '@/context/app-context'
+import Button from '@/app/components/base/button'
+import UsageInfo from '@/app/components/billing/usage-info'
+import VerifyStateModal from '@/app/education-apply/verify-state-modal'
+import { EDUCATION_VERIFYING_LOCALSTORAGE_ITEM } from '@/app/education-apply/constants'
+import { useEducationVerify } from '@/service/use-education'
+import { useModalContextSelector } from '@/context/modal-context'
+
+type Props = {
+  loc: string
+}
+
+const PlanComp: FC<Props> = ({
+  loc,
+}) => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const { userProfile } = useAppContext()
+  const { plan, enableEducationPlan, isEducationAccount } = useProviderContext()
+  const {
+    type,
+  } = plan
+
+  const {
+    usage,
+    total,
+  } = plan
+
+  const [showModal, setShowModal] = React.useState(false)
+  const { mutateAsync } = useEducationVerify()
+  const setShowAccountSettingModal = useModalContextSelector(s => s.setShowAccountSettingModal)
+  const handleVerify = () => {
+    mutateAsync().then((res) => {
+      localStorage.removeItem(EDUCATION_VERIFYING_LOCALSTORAGE_ITEM)
+      router.push(`/education-apply?token=${res.token}`)
+      setShowAccountSettingModal(null)
+    }).catch(() => {
+      setShowModal(true)
+    })
+  }
+  return (
+    <div className='rounded-2xl border-[0.5px] border-effects-highlight-lightmode-off bg-background-section-burn'>
+      <div className='p-6 pb-2'>
+        {plan.type === Plan.sandbox && (
+          <RiBox3Line className='h-7 w-7 text-text-primary'/>
+        )}
+        {plan.type === Plan.professional && (
+          <RiSquareLine className='h-7 w-7 rotate-90 text-util-colors-blue-brand-blue-brand-600'/>
+        )}
+        {plan.type === Plan.team && (
+          <RiGroup3Line className='h-7 w-7 text-util-colors-indigo-indigo-600'/>
+        )}
+        {(plan.type as any) === SelfHostedPlan.enterprise && (
+          <RiGroup3Line className='h-7 w-7 text-util-colors-indigo-indigo-600'/>
+        )}
+        <div className='mt-1 flex items-center'>
+          <div className='grow'>
+            <div className='mb-1 flex items-center gap-1'>
+              <div className='system-md-semibold-uppercase text-text-primary'>{t(`billing.plans.${type}.name`)}</div>
+              <div className='system-2xs-medium-uppercase rounded-[5px] border border-divider-deep px-1 py-0.5 text-text-tertiary'>{t('billing.currentPlan')}</div>
+            </div>
+            <div className='system-xs-regular text-util-colors-gray-gray-600'>{t(`billing.plans.${type}.for`)}</div>
+          </div>
+          <div className='flex shrink-0 items-center gap-1'>
+            {enableEducationPlan && !isEducationAccount && (
+              <Button variant='ghost' onClick={handleVerify}>
+                <RiGraduationCapLine className='mr-1 h-4 w-4'/>
+                {t('education.toVerified')}
+              </Button>
+            )}
+            {(plan.type as any) !== SelfHostedPlan.enterprise && (
+              <UpgradeBtn
+                className='shrink-0'
+                isPlain={type === Plan.team}
+                isShort
+                loc={loc}
+              />
+            )}
+          </div>
+        </div>
+      </div>
+      {/* Plan detail */}
+      <div className='grid grid-cols-3 content-start gap-1 p-2'>
+        <AppsInfo />
+        <UsageInfo
+          Icon={RiGroupLine}
+          name={t('billing.usagePage.teamMembers')}
+          usage={usage.teamMembers}
+          total={total.teamMembers}
+        />
+        <UsageInfo
+          Icon={RiBook2Line}
+          name={t('billing.usagePage.documentsUploadQuota')}
+          usage={usage.documentsUploadQuota}
+          total={total.documentsUploadQuota}
+        />
+        <VectorSpaceInfo />
+        <UsageInfo
+          Icon={RiFileEditLine}
+          name={t('billing.usagePage.annotationQuota')}
+          usage={usage.annotatedResponse}
+          total={total.annotatedResponse}
+        />
+
+      </div>
+      <VerifyStateModal
+        showLink
+        email={userProfile.email}
+        isShow={showModal}
+        title={t('education.rejectTitle')}
+        content={t('education.rejectContent')}
+        onConfirm={() => setShowModal(false)}
+        onCancel={() => setShowModal(false)}
+      />
+    </div>
+  )
+}
+export default React.memo(PlanComp)
diff --git a/app/components/billing/pricing/index.tsx b/app/components/billing/pricing/index.tsx
new file mode 100644
index 0000000..0516794
--- /dev/null
+++ b/app/components/billing/pricing/index.tsx
@@ -0,0 +1,146 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { createPortal } from 'react-dom'
+import { useTranslation } from 'react-i18next'
+import { RiArrowRightUpLine, RiCloseLine, RiCloudFill, RiTerminalBoxFill } from '@remixicon/react'
+import Link from 'next/link'
+import { useKeyPress } from 'ahooks'
+import { Plan, SelfHostedPlan } from '../type'
+import TabSlider from '../../base/tab-slider'
+import SelectPlanRange, { PlanRange } from './select-plan-range'
+import PlanItem from './plan-item'
+import SelfHostedPlanItem from './self-hosted-plan-item'
+import { useProviderContext } from '@/context/provider-context'
+import GridMask from '@/app/components/base/grid-mask'
+import { useAppContext } from '@/context/app-context'
+import classNames from '@/utils/classnames'
+import { useGetPricingPageLanguage } from '@/context/i18n'
+
+type Props = {
+  onCancel: () => void
+}
+
+const Pricing: FC<Props> = ({
+  onCancel,
+}) => {
+  const { t } = useTranslation()
+  const { plan } = useProviderContext()
+  const { isCurrentWorkspaceManager } = useAppContext()
+  const canPay = isCurrentWorkspaceManager
+  const [planRange, setPlanRange] = React.useState<PlanRange>(PlanRange.monthly)
+
+  const [currentPlan, setCurrentPlan] = React.useState<string>('cloud')
+
+  useKeyPress(['esc'], onCancel)
+
+  const pricingPageLanguage = useGetPricingPageLanguage()
+  const pricingPageURL = pricingPageLanguage
+    ? `https://dify.ai/${pricingPageLanguage}/pricing#plans-and-features`
+    : 'https://dify.ai/pricing#plans-and-features'
+
+  return createPortal(
+    <div
+      className='fixed inset-0 bottom-0 left-0 right-0 top-0 z-[1000] bg-background-overlay-backdrop p-4 backdrop-blur-[6px]'
+      onClick={e => e.stopPropagation()}
+    >
+      <div className='relative h-full w-full overflow-auto rounded-2xl border border-effects-highlight bg-saas-background'>
+        <div
+          className='fixed right-7 top-7 z-[1001] flex h-9 w-9 cursor-pointer items-center justify-center rounded-[10px] bg-components-button-tertiary-bg hover:bg-components-button-tertiary-bg-hover'
+          onClick={onCancel}
+        >
+          <RiCloseLine className='size-5 text-components-button-tertiary-text' />
+        </div>
+        <GridMask wrapperClassName='w-full min-h-full' canvasClassName='min-h-full'>
+          <div className='flex flex-col items-center px-8 pb-7 pt-12'>
+            <div className='title-5xl-bold mb-2 text-text-primary'>
+              {t('billing.plansCommon.title')}
+            </div>
+            <div className='system-sm-regular text-text-secondary'>
+              <span>{t('billing.plansCommon.freeTrialTipPrefix')}</span>
+              <span className='text-gradient font-semibold'>{t('billing.plansCommon.freeTrialTip')}</span>
+              <span>{t('billing.plansCommon.freeTrialTipSuffix')}</span>
+            </div>
+          </div>
+          <div className='mx-auto w-[1152px]'>
+            <div className='flex h-[64px] items-center justify-between py-2'>
+              <TabSlider
+                value={currentPlan}
+                className='inline-flex'
+                options={[
+                  {
+                    value: 'cloud',
+                    text: <div className={
+                      classNames('inline-flex items-center system-md-semibold-uppercase text-text-secondary',
+                        currentPlan === 'cloud' && 'text-text-accent-light-mode-only')} >
+                      <RiCloudFill className='mr-2 size-4' />{t('billing.plansCommon.cloud')}</div>,
+                  },
+                  {
+                    value: 'self',
+                    text: <div className={
+                      classNames('inline-flex items-center system-md-semibold-uppercase text-text-secondary',
+                        currentPlan === 'self' && 'text-text-accent-light-mode-only')}>
+                      <RiTerminalBoxFill className='mr-2 size-4' />{t('billing.plansCommon.self')}</div>,
+                  }]}
+                onChange={v => setCurrentPlan(v)} />
+
+              {currentPlan === 'cloud' && <SelectPlanRange
+                value={planRange}
+                onChange={setPlanRange}
+              />}
+            </div>
+            <div className='pb-8 pt-3'>
+              <div className='flex flex-nowrap justify-center gap-x-4'>
+                {currentPlan === 'cloud' && <>
+                  <PlanItem
+                    currentPlan={plan.type}
+                    plan={Plan.sandbox}
+                    planRange={planRange}
+                    canPay={canPay}
+                  />
+                  <PlanItem
+                    currentPlan={plan.type}
+                    plan={Plan.professional}
+                    planRange={planRange}
+                    canPay={canPay}
+                  />
+                  <PlanItem
+                    currentPlan={plan.type}
+                    plan={Plan.team}
+                    planRange={planRange}
+                    canPay={canPay}
+                  />
+                </>}
+                {currentPlan === 'self' && <>
+                  <SelfHostedPlanItem
+                    plan={SelfHostedPlan.community}
+                    planRange={planRange}
+                    canPay={canPay}
+                  />
+                  <SelfHostedPlanItem
+                    plan={SelfHostedPlan.premium}
+                    planRange={planRange}
+                    canPay={canPay}
+                  />
+                  <SelfHostedPlanItem
+                    plan={SelfHostedPlan.enterprise}
+                    planRange={planRange}
+                    canPay={canPay}
+                  />
+                </>}
+              </div>
+            </div>
+          </div>
+          <div className='flex items-center justify-center py-4'>
+            <div className='flex items-center justify-center gap-x-0.5 rounded-lg px-3 py-2 text-components-button-secondary-accent-text hover:cursor-pointer hover:bg-state-accent-hover'>
+              <Link href={pricingPageURL} className='system-sm-medium'>{t('billing.plansCommon.comparePlanAndFeatures')}</Link>
+              <RiArrowRightUpLine className='size-4' />
+            </div>
+          </div>
+        </GridMask>
+      </div >
+    </div >,
+    document.body,
+  )
+}
+export default React.memo(Pricing)
diff --git a/app/components/billing/pricing/plan-item.tsx b/app/components/billing/pricing/plan-item.tsx
new file mode 100644
index 0000000..07af0ff
--- /dev/null
+++ b/app/components/billing/pricing/plan-item.tsx
@@ -0,0 +1,235 @@
+'use client'
+import type { FC, ReactNode } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiApps2Line, RiBook2Line, RiBrain2Line, RiChatAiLine, RiFileEditLine, RiFolder6Line, RiGroupLine, RiHardDrive3Line, RiHistoryLine, RiProgress3Line, RiQuestionLine, RiSeoLine, RiTerminalBoxLine } from '@remixicon/react'
+import type { BasicPlan } from '../type'
+import { Plan } from '../type'
+import { ALL_PLANS, NUM_INFINITE } from '../config'
+import Toast from '../../base/toast'
+import Tooltip from '../../base/tooltip'
+import Divider from '../../base/divider'
+import { ArCube1, Group2, Keyframe, SparklesSoft } from '../../base/icons/src/public/billing'
+import { PlanRange } from './select-plan-range'
+import cn from '@/utils/classnames'
+import { useAppContext } from '@/context/app-context'
+import { fetchSubscriptionUrls } from '@/service/billing'
+
+type Props = {
+  currentPlan: BasicPlan
+  plan: BasicPlan
+  planRange: PlanRange
+  canPay: boolean
+}
+
+const KeyValue = ({ icon, label, tooltip }: { icon: ReactNode; label: string; tooltip?: ReactNode }) => {
+  return (
+    <div className='flex text-text-tertiary'>
+      <div className='flex size-4 items-center justify-center'>
+        {icon}
+      </div>
+      <div className='system-sm-regular ml-2 mr-0.5 text-text-primary'>{label}</div>
+      {tooltip && (
+        <Tooltip
+          asChild
+          popupContent={tooltip}
+          popupClassName='w-[200px]'
+        >
+          <div className='flex size-4 items-center justify-center'>
+            <RiQuestionLine className='text-text-quaternary' />
+          </div>
+        </Tooltip>
+      )}
+    </div>
+  )
+}
+
+const priceClassName = 'leading-[125%] text-[28px] font-bold text-text-primary'
+const style = {
+  [Plan.sandbox]: {
+    icon: <ArCube1 className='size-7 text-text-primary' />,
+    description: 'text-util-colors-gray-gray-600',
+    btnStyle: 'bg-components-button-secondary-bg hover:bg-components-button-secondary-bg-hover border-[0.5px] border-components-button-secondary-border text-text-primary',
+    btnDisabledStyle: 'bg-components-button-secondary-bg-disabled hover:bg-components-button-secondary-bg-disabled border-components-button-secondary-border-disabled text-components-button-secondary-text-disabled',
+  },
+  [Plan.professional]: {
+    icon: <Keyframe className='size-7 text-util-colors-blue-brand-blue-brand-600' />,
+    description: 'text-util-colors-blue-brand-blue-brand-600',
+    btnStyle: 'bg-components-button-primary-bg hover:bg-components-button-primary-bg-hover border border-components-button-primary-border text-components-button-primary-text',
+    btnDisabledStyle: 'bg-components-button-primary-bg-disabled hover:bg-components-button-primary-bg-disabled border-components-button-primary-border-disabled text-components-button-primary-text-disabled',
+  },
+  [Plan.team]: {
+    icon: <Group2 className='size-7 text-util-colors-indigo-indigo-600' />,
+    description: 'text-util-colors-indigo-indigo-600',
+    btnStyle: 'bg-components-button-indigo-bg hover:bg-components-button-indigo-bg-hover border border-components-button-primary-border text-components-button-primary-text',
+    btnDisabledStyle: 'bg-components-button-indigo-bg-disabled hover:bg-components-button-indigo-bg-disabled border-components-button-indigo-border-disabled text-components-button-primary-text-disabled',
+  },
+}
+const PlanItem: FC<Props> = ({
+  plan,
+  currentPlan,
+  planRange,
+}) => {
+  const { t } = useTranslation()
+  const [loading, setLoading] = React.useState(false)
+  const i18nPrefix = `billing.plans.${plan}`
+  const isFreePlan = plan === Plan.sandbox
+  const isMostPopularPlan = plan === Plan.professional
+  const planInfo = ALL_PLANS[plan]
+  const isYear = planRange === PlanRange.yearly
+  const isCurrent = plan === currentPlan
+  const isPlanDisabled = planInfo.level <= ALL_PLANS[currentPlan].level
+  const { isCurrentWorkspaceManager } = useAppContext()
+
+  const btnText = (() => {
+    if (isCurrent)
+      return t('billing.plansCommon.currentPlan')
+
+    return ({
+      [Plan.sandbox]: t('billing.plansCommon.startForFree'),
+      [Plan.professional]: t('billing.plansCommon.getStarted'),
+      [Plan.team]: t('billing.plansCommon.getStarted'),
+    })[plan]
+  })()
+
+  const handleGetPayUrl = async () => {
+    if (loading)
+      return
+
+    if (isPlanDisabled)
+      return
+
+    if (isFreePlan)
+      return
+
+    // Only workspace manager can buy plan
+    if (!isCurrentWorkspaceManager) {
+      Toast.notify({
+        type: 'error',
+        message: t('billing.buyPermissionDeniedTip'),
+        className: 'z-[1001]',
+      })
+      return
+    }
+    setLoading(true)
+    try {
+      const res = await fetchSubscriptionUrls(plan, isYear ? 'year' : 'month')
+      // Adb Block additional tracking block the gtag, so we need to redirect directly
+      window.location.href = res.url
+    }
+    finally {
+      setLoading(false)
+    }
+  }
+  return (
+    <div className={cn('flex w-[373px] flex-col rounded-2xl border-[0.5px] border-effects-highlight-lightmode-off bg-background-section-burn p-6',
+      isMostPopularPlan ? 'border-effects-highlight shadow-lg backdrop-blur-[5px]' : 'hover:border-effects-highlight hover:shadow-lg hover:backdrop-blur-[5px]',
+    )}>
+      <div className='flex flex-col gap-y-1'>
+        {style[plan].icon}
+        <div className='flex items-center'>
+          <div className='grow text-lg font-semibold uppercase leading-[125%] text-text-primary'>{t(`${i18nPrefix}.name`)}</div>
+          {isMostPopularPlan && <div className='ml-1 flex shrink-0 items-center justify-center rounded-full border-[0.5px] bg-price-premium-badge-background px-1 py-[3px] text-components-premium-badge-grey-text-stop-0 shadow-xs'>
+            <div className='pl-0.5'>
+              <SparklesSoft className='size-3' />
+            </div>
+            <span className='system-2xs-semibold-uppercase bg-price-premium-text-background bg-clip-text px-0.5 text-transparent'>{t('billing.plansCommon.mostPopular')}</span>
+          </div>}
+        </div>
+        <div className={cn(style[plan].description, 'system-sm-regular')}>{t(`${i18nPrefix}.description`)}</div>
+      </div>
+      <div className='my-5'>
+        {/* Price */}
+        {isFreePlan && (
+          <div className={priceClassName}>{t('billing.plansCommon.free')}</div>
+        )}
+        {!isFreePlan && (
+          <div className='flex items-end'>
+            <div className={priceClassName}>${isYear ? planInfo.price * 10 : planInfo.price}</div>
+            <div className='ml-1 flex flex-col'>
+              {isYear && <div className='text-[14px] font-normal italic leading-[14px] text-text-warning'>{t('billing.plansCommon.save')}${planInfo.price * 2}</div>}
+              <div className='text-[14px] font-normal leading-normal text-text-tertiary'>
+                {t('billing.plansCommon.priceTip')}
+                {t(`billing.plansCommon.${!isYear ? 'month' : 'year'}`)}</div>
+            </div>
+          </div>
+        )}
+      </div>
+
+      <div
+        className={cn('flex h-[42px] items-center justify-center rounded-full px-5 py-3',
+          style[plan].btnStyle,
+          isPlanDisabled && style[plan].btnDisabledStyle,
+          isPlanDisabled ? 'cursor-not-allowed' : 'cursor-pointer')}
+        onClick={handleGetPayUrl}
+      >
+        {btnText}
+      </div>
+      <div className='mt-6 flex flex-col gap-y-3'>
+        <KeyValue
+          icon={<RiChatAiLine />}
+          label={isFreePlan
+            ? t('billing.plansCommon.messageRequest.title', { count: planInfo.messageRequest })
+            : t('billing.plansCommon.messageRequest.titlePerMonth', { count: planInfo.messageRequest })}
+          tooltip={t('billing.plansCommon.messageRequest.tooltip') as string}
+        />
+        <KeyValue
+          icon={<RiBrain2Line />}
+          label={t('billing.plansCommon.modelProviders')}
+        />
+        <KeyValue
+          icon={<RiFolder6Line />}
+          label={t('billing.plansCommon.teamWorkspace', { count: planInfo.teamWorkspace })}
+        />
+        <KeyValue
+          icon={<RiGroupLine />}
+          label={t('billing.plansCommon.teamMember', { count: planInfo.teamMembers })}
+        />
+        <KeyValue
+          icon={<RiApps2Line />}
+          label={t('billing.plansCommon.buildApps', { count: planInfo.buildApps })}
+        />
+        <Divider bgStyle='gradient' />
+        <KeyValue
+          icon={<RiBook2Line />}
+          label={t('billing.plansCommon.documents', { count: planInfo.documents })}
+          tooltip={t('billing.plansCommon.documentsTooltip') as string}
+        />
+        <KeyValue
+          icon={<RiHardDrive3Line />}
+          label={t('billing.plansCommon.vectorSpace', { size: planInfo.vectorSpace })}
+          tooltip={t('billing.plansCommon.vectorSpaceTooltip') as string}
+        />
+
+        <KeyValue
+          icon={<RiSeoLine />}
+          label={t('billing.plansCommon.documentsRequestQuota', { count: planInfo.documentsRequestQuota })}
+          tooltip={t('billing.plansCommon.documentsRequestQuotaTooltip')}
+        />
+        <KeyValue
+          icon={<RiTerminalBoxLine />}
+          label={
+            planInfo.apiRateLimit === NUM_INFINITE ? `${t('billing.plansCommon.unlimitedApiRate')}`
+              : `${t('billing.plansCommon.apiRateLimitUnit', { count: planInfo.apiRateLimit })} ${t('billing.plansCommon.apiRateLimit')}`
+          }
+          tooltip={planInfo.apiRateLimit === NUM_INFINITE ? null : t('billing.plansCommon.apiRateLimitTooltip') as string}
+        />
+        <KeyValue
+          icon={<RiProgress3Line />}
+          label={[t(`billing.plansCommon.priority.${planInfo.documentProcessingPriority}`), t('billing.plansCommon.documentProcessingPriority')].join('')}
+        />
+        <Divider bgStyle='gradient' />
+        <KeyValue
+          icon={<RiFileEditLine />}
+          label={t('billing.plansCommon.annotatedResponse.title', { count: planInfo.annotatedResponse })}
+          tooltip={t('billing.plansCommon.annotatedResponse.tooltip') as string}
+        />
+        <KeyValue
+          icon={<RiHistoryLine />}
+          label={t('billing.plansCommon.logsHistory', { days: planInfo.logHistory === NUM_INFINITE ? t('billing.plansCommon.unlimited') as string : `${planInfo.logHistory} ${t('billing.plansCommon.days')}` })}
+        />
+      </div>
+    </div>
+  )
+}
+export default React.memo(PlanItem)
diff --git a/app/components/billing/pricing/select-plan-range.tsx b/app/components/billing/pricing/select-plan-range.tsx
new file mode 100644
index 0000000..e7b06cb
--- /dev/null
+++ b/app/components/billing/pricing/select-plan-range.tsx
@@ -0,0 +1,54 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import Switch from '../../base/switch'
+export enum PlanRange {
+  monthly = 'monthly',
+  yearly = 'yearly',
+}
+
+type Props = {
+  value: PlanRange
+  onChange: (value: PlanRange) => void
+}
+
+const ArrowIcon = (
+  <svg xmlns="http://www.w3.org/2000/svg" width="22" height="29" viewBox="0 0 22 29" fill="none">
+    <g clipPath="url(#clip0_394_43518)">
+      <path d="M2.11312 1.64777C2.11312 1.64777 2.10178 1.64849 2.09045 1.6492C2.06211 1.65099 2.08478 1.64956 2.11312 1.64777ZM9.047 20.493C9.43106 19.9965 8.97268 19.2232 8.35639 19.2848C7.72208 19.4215 6.27243 20.3435 5.13995 20.8814C4.2724 21.3798 3.245 21.6892 2.54015 22.4221C1.87751 23.2831 2.70599 23.9706 3.47833 24.3088C4.73679 24.9578 6.00624 25.6004 7.25975 26.2611C8.4424 26.8807 9.57833 27.5715 10.7355 28.2383C10.9236 28.3345 11.1464 28.3489 11.3469 28.2794C11.9886 28.0796 12.0586 27.1137 11.4432 26.8282C9.83391 25.8485 8.17365 24.9631 6.50314 24.0955C8.93023 24.2384 11.3968 24.1058 13.5161 22.7945C16.6626 20.8097 19.0246 17.5714 20.2615 14.0854C22.0267 8.96164 18.9313 4.08153 13.9897 2.40722C10.5285 1.20289 6.76599 0.996166 3.14837 1.46306C2.50624 1.56611 2.68616 1.53201 2.10178 1.64849C2.12445 1.64706 2.14712 1.64563 2.16979 1.6442C2.01182 1.66553 1.86203 1.72618 1.75582 1.84666C1.48961 2.13654 1.58903 2.63096 1.9412 2.80222C2.19381 2.92854 2.4835 2.83063 2.74986 2.81385C3.7267 2.69541 4.70711 2.63364 5.69109 2.62853C8.30015 2.58932 10.5052 2.82021 13.2684 3.693C21.4149 6.65607 20.7135 14.2162 14.6733 20.0304C12.4961 22.2272 9.31209 22.8944 6.11128 22.4816C5.92391 22.4877 5.72342 22.4662 5.52257 22.439C6.35474 22.011 7.20002 21.6107 8.01305 21.1498C8.35227 20.935 8.81233 20.8321 9.05266 20.4926L9.047 20.493Z" fill="url(#paint0_linear_394_43518)" />
+    </g>
+    <defs>
+      <linearGradient id="paint0_linear_394_43518" x1="11" y1="-48.5001" x2="12.2401" y2="28.2518" gradientUnits="userSpaceOnUse">
+        <stop stopColor="#FDB022" />
+        <stop offset="1" stopColor="#F79009" />
+      </linearGradient>
+      <clipPath id="clip0_394_43518">
+        <rect width="19.1928" height="27.3696" fill="white" transform="translate(21.8271 27.6475) rotate(176.395)" />
+      </clipPath>
+    </defs>
+  </svg>
+)
+
+const SelectPlanRange: FC<Props> = ({
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='relative flex flex-col items-end pr-6'>
+      <div className='bg-premium-yearly-tip-text-background bg-clip-text text-sm italic text-transparent'>{t('billing.plansCommon.yearlyTip')}</div>
+      <div className='flex items-center py-1'>
+        <span className='mr-2 text-[13px]'>{t('billing.plansCommon.annualBilling')}</span>
+        <Switch size='l' defaultValue={value === PlanRange.yearly} onChange={(v) => {
+          onChange(v ? PlanRange.yearly : PlanRange.monthly)
+        }} />
+      </div>
+      <div className='absolute right-0 top-2'>
+        {ArrowIcon}
+      </div>
+    </div>
+  )
+}
+export default React.memo(SelectPlanRange)
diff --git a/app/components/billing/pricing/self-hosted-plan-item.tsx b/app/components/billing/pricing/self-hosted-plan-item.tsx
new file mode 100644
index 0000000..491fdfe
--- /dev/null
+++ b/app/components/billing/pricing/self-hosted-plan-item.tsx
@@ -0,0 +1,176 @@
+'use client'
+import type { FC, ReactNode } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowRightUpLine, RiBrain2Line, RiCheckLine, RiQuestionLine } from '@remixicon/react'
+import { SelfHostedPlan } from '../type'
+import { contactSalesUrl, getStartedWithCommunityUrl, getWithPremiumUrl } from '../config'
+import Toast from '../../base/toast'
+import Tooltip from '../../base/tooltip'
+import { Asterisk, AwsMarketplace, Azure, Buildings, Diamond, GoogleCloud } from '../../base/icons/src/public/billing'
+import type { PlanRange } from './select-plan-range'
+import cn from '@/utils/classnames'
+import { useAppContext } from '@/context/app-context'
+
+type Props = {
+  plan: SelfHostedPlan
+  planRange: PlanRange
+  canPay: boolean
+}
+
+const KeyValue = ({ label, tooltip, textColor, tooltipIconColor }: { icon: ReactNode; label: string; tooltip?: string; textColor: string; tooltipIconColor: string }) => {
+  return (
+    <div className={cn('flex', textColor)}>
+      <div className='flex size-4 items-center justify-center'>
+        <RiCheckLine />
+      </div>
+      <div className={cn('system-sm-regular ml-2 mr-0.5', textColor)}>{label}</div>
+      {tooltip && (
+        <Tooltip
+          asChild
+          popupContent={tooltip}
+          popupClassName='w-[200px]'
+        >
+          <div className='flex size-4 items-center justify-center'>
+            <RiQuestionLine className={cn(tooltipIconColor)} />
+          </div>
+        </Tooltip>
+      )}
+    </div>
+  )
+}
+
+const style = {
+  [SelfHostedPlan.community]: {
+    icon: <Asterisk className='size-7 text-text-primary' />,
+    title: 'text-text-primary',
+    price: 'text-text-primary',
+    priceTip: 'text-text-tertiary',
+    description: 'text-util-colors-gray-gray-600',
+    bg: 'border-effects-highlight-lightmode-off bg-background-section-burn',
+    btnStyle: 'bg-components-button-secondary-bg hover:bg-components-button-secondary-bg-hover border-[0.5px] border-components-button-secondary-border text-text-primary',
+    values: 'text-text-secondary',
+    tooltipIconColor: 'text-text-tertiary',
+  },
+  [SelfHostedPlan.premium]: {
+    icon: <Diamond className='size-7 text-text-warning' />,
+    title: 'text-text-primary',
+    price: 'text-text-primary',
+    priceTip: 'text-text-tertiary',
+    description: 'text-text-warning',
+    bg: 'border-effects-highlight bg-background-section-burn',
+    btnStyle: 'bg-third-party-aws hover:bg-third-party-aws-hover border border-components-button-primary-border text-text-primary-on-surface shadow-xs',
+    values: 'text-text-secondary',
+    tooltipIconColor: 'text-text-tertiary',
+  },
+  [SelfHostedPlan.enterprise]: {
+    icon: <Buildings className='size-7 text-text-primary-on-surface' />,
+    title: 'text-text-primary-on-surface',
+    price: 'text-text-primary-on-surface',
+    priceTip: 'text-text-primary-on-surface',
+    description: 'text-text-primary-on-surface',
+    bg: 'border-effects-highlight bg-[#155AEF] text-text-primary-on-surface',
+    btnStyle: 'bg-white bg-opacity-96 hover:opacity-85 border-[0.5px] border-components-button-secondary-border text-[#155AEF] shadow-xs',
+    values: 'text-text-primary-on-surface',
+    tooltipIconColor: 'text-text-primary-on-surface',
+  },
+}
+const SelfHostedPlanItem: FC<Props> = ({
+  plan,
+}) => {
+  const { t } = useTranslation()
+  const isFreePlan = plan === SelfHostedPlan.community
+  const isPremiumPlan = plan === SelfHostedPlan.premium
+  const i18nPrefix = `billing.plans.${plan}`
+  const isEnterprisePlan = plan === SelfHostedPlan.enterprise
+  const { isCurrentWorkspaceManager } = useAppContext()
+  const features = t(`${i18nPrefix}.features`, { returnObjects: true }) as string[]
+  const handleGetPayUrl = () => {
+    // Only workspace manager can buy plan
+    if (!isCurrentWorkspaceManager) {
+      Toast.notify({
+        type: 'error',
+        message: t('billing.buyPermissionDeniedTip'),
+        className: 'z-[1001]',
+      })
+      return
+    }
+    if (isFreePlan) {
+      window.location.href = getStartedWithCommunityUrl
+      return
+    }
+    if (isPremiumPlan) {
+      window.location.href = getWithPremiumUrl
+      return
+    }
+
+    if (isEnterprisePlan)
+      window.location.href = contactSalesUrl
+  }
+  return (
+    <div className={cn(`relative flex w-[374px] flex-col overflow-hidden rounded-2xl
+      border-[0.5px] hover:border-effects-highlight hover:shadow-lg hover:backdrop-blur-[5px]`, style[plan].bg)}>
+      <div>
+        <div className={cn(isEnterprisePlan ? 'z-1 absolute bottom-0 left-0 right-0 top-0 bg-price-enterprise-background' : '')} >
+        </div>
+        {isEnterprisePlan && <div className='z-15 absolute -left-[90px] -top-[104px] size-[341px] rounded-full bg-[#09328c] opacity-15 mix-blend-plus-darker blur-[80px]'></div>}
+        {isEnterprisePlan && <div className='z-15 absolute -bottom-[72px] -right-[40px] size-[341px] rounded-full bg-[#e2eafb] opacity-15 mix-blend-plus-darker blur-[80px]'></div>}
+      </div>
+      <div className='relative z-10 min-h-[559px] w-full p-6'>
+        <div className=' flex min-h-[108px] flex-col gap-y-1'>
+          {style[plan].icon}
+          <div className='flex items-center'>
+            <div className={cn('system-md-semibold uppercase leading-[125%]', style[plan].title)}>{t(`${i18nPrefix}.name`)}</div>
+          </div>
+          <div className={cn(style[plan].description, 'system-sm-regular')}>{t(`${i18nPrefix}.description`)}</div>
+        </div>
+        <div className='my-3'>
+          <div className='flex items-end'>
+            <div className={cn('shrink-0 text-[28px] font-bold leading-[125%]', style[plan].price)}>{t(`${i18nPrefix}.price`)}</div>
+            {!isFreePlan
+              && <span className={cn('ml-2 py-1 text-[14px] font-normal leading-normal', style[plan].priceTip)}>
+                {t(`${i18nPrefix}.priceTip`)}
+              </span>}
+          </div>
+        </div>
+
+        <div
+          className={cn('system-md-semibold flex h-[44px] cursor-pointer items-center justify-center rounded-full px-5 py-3',
+            style[plan].btnStyle)}
+          onClick={handleGetPayUrl}
+        >
+          {t(`${i18nPrefix}.btnText`)}
+          {isPremiumPlan
+            && <>
+              <div className='mx-1 pt-[6px]'>
+                <AwsMarketplace className='h-6' />
+              </div>
+              <RiArrowRightUpLine className='size-4' />
+            </>}
+        </div>
+        <div className={cn('system-sm-semibold mb-2 mt-6', style[plan].values)}>{t(`${i18nPrefix}.includesTitle`)}</div>
+        <div className='flex flex-col gap-y-3'>
+          {features.map(v =>
+            <KeyValue key={`${plan}-${v}`}
+              textColor={style[plan].values}
+              tooltipIconColor={style[plan].tooltipIconColor}
+              icon={<RiBrain2Line />}
+              label={v}
+            />)}
+        </div>
+        {isPremiumPlan && <div className='mt-[68px]'>
+          <div className='flex items-center gap-x-1'>
+            <div className='flex size-8 items-center justify-center rounded-lg border-[0.5px] border-components-panel-border-subtle bg-background-default shadow-xs'>
+              <Azure />
+            </div>
+            <div className='flex size-8 items-center justify-center rounded-lg border-[0.5px] border-components-panel-border-subtle bg-background-default shadow-xs'>
+              <GoogleCloud />
+            </div>
+          </div>
+          <span className={cn('system-xs-regular mt-2', style[plan].tooltipIconColor)}>{t('billing.plans.premium.comingSoon')}</span>
+        </div>}
+      </div>
+    </div>
+  )
+}
+export default React.memo(SelfHostedPlanItem)
diff --git a/app/components/billing/priority-label/index.tsx b/app/components/billing/priority-label/index.tsx
new file mode 100644
index 0000000..d63d7ba
--- /dev/null
+++ b/app/components/billing/priority-label/index.tsx
@@ -0,0 +1,65 @@
+import { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  DocumentProcessingPriority,
+  Plan,
+} from '../type'
+import cn from '@/utils/classnames'
+import { useProviderContext } from '@/context/provider-context'
+import {
+  ZapFast,
+  ZapNarrow,
+} from '@/app/components/base/icons/src/vender/solid/general'
+import Tooltip from '@/app/components/base/tooltip'
+
+type PriorityLabelProps = {
+  className?: string
+}
+
+const PriorityLabel = ({ className }: PriorityLabelProps) => {
+  const { t } = useTranslation()
+  const { plan } = useProviderContext()
+
+  const priority = useMemo(() => {
+    if (plan.type === Plan.sandbox)
+      return DocumentProcessingPriority.standard
+
+    if (plan.type === Plan.professional)
+      return DocumentProcessingPriority.priority
+
+    if (plan.type === Plan.team || plan.type === Plan.enterprise)
+      return DocumentProcessingPriority.topPriority
+  }, [plan])
+
+  return (
+    <Tooltip popupContent={
+      <div>
+        <div className='mb-1 text-xs font-semibold text-gray-700'>{`${t('billing.plansCommon.documentProcessingPriority')}: ${t(`billing.plansCommon.priority.${priority}`)}`}</div>
+        {
+          priority !== DocumentProcessingPriority.topPriority && (
+            <div className='text-xs text-gray-500'>{t('billing.plansCommon.documentProcessingPriorityTip')}</div>
+          )
+        }
+      </div>
+    }>
+      <span className={cn(`
+        ml-1 flex h-[18px] shrink-0 items-center rounded-[5px] border border-text-accent-secondary px-1
+        text-2xs font-medium text-text-accent-secondary
+      `, className)}>
+        {
+          plan.type === Plan.professional && (
+            <ZapNarrow className='mr-0.5 size-3' />
+          )
+        }
+        {
+          (plan.type === Plan.team || plan.type === Plan.enterprise) && (
+            <ZapFast className='mr-0.5 size-3' />
+          )
+        }
+        {t(`billing.plansCommon.priority.${priority}`)}
+      </span>
+    </Tooltip>
+  )
+}
+
+export default PriorityLabel
diff --git a/app/components/billing/progress-bar/index.tsx b/app/components/billing/progress-bar/index.tsx
new file mode 100644
index 0000000..6397b43
--- /dev/null
+++ b/app/components/billing/progress-bar/index.tsx
@@ -0,0 +1,24 @@
+import cn from '@/utils/classnames'
+
+type ProgressBarProps = {
+  percent: number
+  color: string
+}
+
+const ProgressBar = ({
+  percent = 0,
+  color = '#2970FF',
+}: ProgressBarProps) => {
+  return (
+    <div className='overflow-hidden rounded-[6px] bg-components-progress-bar-bg'>
+      <div
+        className={cn('h-1 rounded-[6px]', color)}
+        style={{
+          width: `${Math.min(percent, 100)}%`,
+        }}
+      />
+    </div>
+  )
+}
+
+export default ProgressBar
diff --git a/app/components/billing/type.ts b/app/components/billing/type.ts
new file mode 100644
index 0000000..2f5728c
--- /dev/null
+++ b/app/components/billing/type.ts
@@ -0,0 +1,107 @@
+export enum Plan {
+  sandbox = 'sandbox',
+  professional = 'professional',
+  team = 'team',
+  enterprise = 'enterprise',
+}
+export enum Priority {
+  standard = 'standard',
+  priority = 'priority',
+  topPriority = 'top-priority',
+}
+
+export type BasicPlan = Plan.sandbox | Plan.professional | Plan.team
+
+export type PlanInfo = {
+  level: number
+  price: number
+  modelProviders: string
+  teamWorkspace: number
+  teamMembers: number
+  buildApps: number
+  documents: number
+  vectorSpace: string
+  documentsUploadQuota: number
+  documentsRequestQuota: number
+  apiRateLimit: number
+  documentProcessingPriority: Priority
+  logHistory: number
+  messageRequest: number
+  annotatedResponse: number
+}
+
+export enum SelfHostedPlan {
+  community = 'community',
+  premium = 'premium',
+  enterprise = 'enterprise',
+}
+
+export type SelfHostedPlanInfo = {
+  level: number
+  price: number
+  modelProviders: string
+  teamWorkspace: number
+  teamMembers: number
+  buildApps: number
+  documents: number
+  vectorSpace: string
+  documentsRequestQuota: number
+  documentProcessingPriority: Priority
+  logHistory: number
+  messageRequest: number
+  annotatedResponse: number
+}
+
+export type UsagePlanInfo = Pick<PlanInfo, 'buildApps' | 'teamMembers' | 'annotatedResponse' | 'documentsUploadQuota'> & { vectorSpace: number }
+
+export enum DocumentProcessingPriority {
+  standard = 'standard',
+  priority = 'priority',
+  topPriority = 'top-priority',
+}
+
+export type CurrentPlanInfoBackend = {
+  billing: {
+    enabled: boolean
+    subscription: {
+      plan: BasicPlan
+    }
+  }
+  members: {
+    size: number
+    limit: number // total. 0 means unlimited
+  }
+  apps: {
+    size: number
+    limit: number // total. 0 means unlimited
+  }
+  vector_space: {
+    size: number
+    limit: number // total. 0 means unlimited
+  }
+  annotation_quota_limit: {
+    size: number
+    limit: number // total. 0 means unlimited
+  }
+  documents_upload_quota: {
+    size: number
+    limit: number // total. 0 means unlimited
+  }
+  docs_processing: DocumentProcessingPriority
+  can_replace_logo: boolean
+  model_load_balancing_enabled: boolean
+  dataset_operator_enabled: boolean
+  education: {
+    enabled: boolean
+    activated: boolean
+  }
+}
+
+export type SubscriptionItem = {
+  plan: Plan
+  url: string
+}
+
+export type SubscriptionUrlsBackend = {
+  url: string
+}
diff --git a/app/components/billing/upgrade-btn/index.tsx b/app/components/billing/upgrade-btn/index.tsx
new file mode 100644
index 0000000..45f4d44
--- /dev/null
+++ b/app/components/billing/upgrade-btn/index.tsx
@@ -0,0 +1,67 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import PremiumBadge from '../../base/premium-badge'
+import Button from '@/app/components/base/button'
+import { SparklesSoft } from '@/app/components/base/icons/src/public/common'
+import { useModalContext } from '@/context/modal-context'
+
+type Props = {
+  className?: string
+  isFull?: boolean
+  size?: 'md' | 'lg'
+  isPlain?: boolean
+  isShort?: boolean
+  onClick?: () => void
+  loc?: string
+}
+
+const UpgradeBtn: FC<Props> = ({
+  isPlain = false,
+  isShort = false,
+  onClick: _onClick,
+  loc,
+}) => {
+  const { t } = useTranslation()
+  const { setShowPricingModal } = useModalContext()
+  const handleClick = () => {
+    if (_onClick)
+      _onClick()
+    else
+      (setShowPricingModal as any)()
+  }
+  const onClick = () => {
+    handleClick()
+    if (loc && (window as any).gtag) {
+      (window as any).gtag('event', 'click_upgrade_btn', {
+        loc,
+      })
+    }
+  }
+
+  if (isPlain) {
+    return (
+      <Button onClick={onClick}>
+        {t('billing.upgradeBtn.plain')}
+      </Button>
+    )
+  }
+
+  return (
+    <PremiumBadge
+      size="m"
+      color="blue"
+      allowHover={true}
+      onClick={onClick}
+    >
+      <SparklesSoft className='flex h-3.5 w-3.5 items-center py-[1px] pl-[3px] text-components-premium-badge-indigo-text-stop-0' />
+      <div className='system-xs-medium'>
+        <span className='p-1'>
+          {t(`billing.upgradeBtn.${isShort ? 'encourageShort' : 'encourage'}`)}
+        </span>
+      </div>
+    </PremiumBadge>
+  )
+}
+export default React.memo(UpgradeBtn)
diff --git a/app/components/billing/upgrade-btn/style.module.css b/app/components/billing/upgrade-btn/style.module.css
new file mode 100644
index 0000000..ab8c30e
--- /dev/null
+++ b/app/components/billing/upgrade-btn/style.module.css
@@ -0,0 +1,9 @@
+.upgradeBtn {
+  background: linear-gradient(99deg, rgba(255, 255, 255, 0.12) 7.16%, rgba(255, 255, 255, 0.00) 85.47%), linear-gradient(280deg, #00B2FF 12.96%, #132BFF 90.95%);
+  box-shadow: 0px 2px 4px -2px rgba(16, 24, 40, 0.06), 0px 4px 8px -2px rgba(0, 162, 253, 0.12);
+
+}
+.upgradeBtn:hover {
+  background: linear-gradient(99deg, rgba(255, 255, 255, 0.12) 7.16%, rgba(255, 255, 255, 0.00) 85.47%), linear-gradient(280deg, #02C2FF 12.96%, #001AFF 90.95%);
+  box-shadow: 0px 4px 6px -2px rgba(16, 18, 40, 0.08), 0px 12px 16px -4px rgba(0, 209, 255, 0.08);
+}
diff --git a/app/components/billing/usage-info/apps-info.tsx b/app/components/billing/usage-info/apps-info.tsx
new file mode 100644
index 0000000..2601bbc
--- /dev/null
+++ b/app/components/billing/usage-info/apps-info.tsx
@@ -0,0 +1,34 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiApps2Line,
+} from '@remixicon/react'
+import UsageInfo from '../usage-info'
+import { useProviderContext } from '@/context/provider-context'
+
+type Props = {
+  className?: string
+}
+
+const AppsInfo: FC<Props> = ({
+  className,
+}) => {
+  const { t } = useTranslation()
+  const { plan } = useProviderContext()
+  const {
+    usage,
+    total,
+  } = plan
+  return (
+    <UsageInfo
+      className={className}
+      Icon={RiApps2Line}
+      name={t('billing.usagePage.buildApps')}
+      usage={usage.buildApps}
+      total={total.buildApps}
+    />
+  )
+}
+export default React.memo(AppsInfo)
diff --git a/app/components/billing/usage-info/index.tsx b/app/components/billing/usage-info/index.tsx
new file mode 100644
index 0000000..30b4bca
--- /dev/null
+++ b/app/components/billing/usage-info/index.tsx
@@ -0,0 +1,71 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import ProgressBar from '../progress-bar'
+import { NUM_INFINITE } from '../config'
+import Tooltip from '@/app/components/base/tooltip'
+import cn from '@/utils/classnames'
+
+type Props = {
+  className?: string
+  Icon: any
+  name: string
+  tooltip?: string
+  usage: number
+  total: number
+  unit?: string
+}
+
+const LOW = 50
+const MIDDLE = 80
+
+const UsageInfo: FC<Props> = ({
+  className,
+  Icon,
+  name,
+  tooltip,
+  usage,
+  total,
+  unit = '',
+}) => {
+  const { t } = useTranslation()
+
+  const percent = usage / total * 100
+  const color = (() => {
+    if (percent < LOW)
+      return 'bg-components-progress-bar-progress-solid'
+
+    if (percent < MIDDLE)
+      return 'bg-components-progress-warning-progress'
+
+    return 'bg-components-progress-error-progress'
+  })()
+  return (
+    <div className={cn('flex flex-col gap-2 rounded-xl bg-components-panel-bg p-4', className)}>
+      <Icon className='h-4 w-4 text-text-tertiary' />
+      <div className='flex items-center gap-1'>
+        <div className='system-xs-medium text-text-tertiary'>{name}</div>
+        {tooltip && (
+          <Tooltip
+            popupContent={
+              <div className='w-[180px]'>
+                {tooltip}
+              </div>
+            }
+          />
+        )}
+      </div>
+      <div className='system-md-semibold flex items-center gap-1  text-text-primary'>
+        {usage}
+        <div className='system-md-regular text-text-quaternary'>/</div>
+        <div>{total === NUM_INFINITE ? t('billing.plansCommon.unlimited') : `${total}${unit}`}</div>
+      </div>
+      <ProgressBar
+        percent={percent}
+        color={color}
+      />
+    </div>
+  )
+}
+export default React.memo(UsageInfo)
diff --git a/app/components/billing/usage-info/vector-space-info.tsx b/app/components/billing/usage-info/vector-space-info.tsx
new file mode 100644
index 0000000..e578280
--- /dev/null
+++ b/app/components/billing/usage-info/vector-space-info.tsx
@@ -0,0 +1,36 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import {
+  RiHardDrive3Line,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import UsageInfo from '../usage-info'
+import { useProviderContext } from '@/context/provider-context'
+
+type Props = {
+  className?: string
+}
+
+const VectorSpaceInfo: FC<Props> = ({
+  className,
+}) => {
+  const { t } = useTranslation()
+  const { plan } = useProviderContext()
+  const {
+    usage,
+    total,
+  } = plan
+  return (
+    <UsageInfo
+      className={className}
+      Icon={RiHardDrive3Line}
+      name={t('billing.usagePage.vectorSpace')}
+      tooltip={t('billing.usagePage.vectorSpaceTooltip') as string}
+      usage={usage.vectorSpace}
+      total={total.vectorSpace}
+      unit='MB'
+    />
+  )
+}
+export default React.memo(VectorSpaceInfo)
diff --git a/app/components/billing/utils/index.ts b/app/components/billing/utils/index.ts
new file mode 100644
index 0000000..111f02e
--- /dev/null
+++ b/app/components/billing/utils/index.ts
@@ -0,0 +1,29 @@
+import type { CurrentPlanInfoBackend } from '../type'
+import { NUM_INFINITE } from '@/app/components/billing/config'
+
+const parseLimit = (limit: number) => {
+  if (limit === 0)
+    return NUM_INFINITE
+
+  return limit
+}
+
+export const parseCurrentPlan = (data: CurrentPlanInfoBackend) => {
+  return {
+    type: data.billing.subscription.plan,
+    usage: {
+      vectorSpace: data.vector_space.size,
+      buildApps: data.apps?.size || 0,
+      teamMembers: data.members.size,
+      annotatedResponse: data.annotation_quota_limit.size,
+      documentsUploadQuota: data.documents_upload_quota.size,
+    },
+    total: {
+      vectorSpace: parseLimit(data.vector_space.limit),
+      buildApps: parseLimit(data.apps?.limit) || 0,
+      teamMembers: parseLimit(data.members.limit),
+      annotatedResponse: parseLimit(data.annotation_quota_limit.limit),
+      documentsUploadQuota: parseLimit(data.documents_upload_quota.limit),
+    },
+  }
+}
diff --git a/app/components/billing/vector-space-full/index.tsx b/app/components/billing/vector-space-full/index.tsx
new file mode 100644
index 0000000..58d9db0
--- /dev/null
+++ b/app/components/billing/vector-space-full/index.tsx
@@ -0,0 +1,29 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import UpgradeBtn from '../upgrade-btn'
+import VectorSpaceInfo from '../usage-info/vector-space-info'
+import s from './style.module.css'
+import cn from '@/utils/classnames'
+import GridMask from '@/app/components/base/grid-mask'
+
+const VectorSpaceFull: FC = () => {
+  const { t } = useTranslation()
+
+  return (
+    <GridMask wrapperClassName='border border-gray-200 rounded-xl' canvasClassName='rounded-xl' gradientClassName='rounded-xl'>
+      <div className='px-6 py-5'>
+        <div className='flex items-center justify-between'>
+          <div className={cn(s.textGradient, 'text-base font-semibold leading-[24px]')}>
+            <div>{t('billing.vectorSpace.fullTip')}</div>
+            <div>{t('billing.vectorSpace.fullSolution')}</div>
+          </div>
+          <UpgradeBtn loc='knowledge-add-file' />
+        </div>
+        <VectorSpaceInfo className='pt-4' />
+      </div>
+    </GridMask>
+  )
+}
+export default React.memo(VectorSpaceFull)
diff --git a/app/components/billing/vector-space-full/style.module.css b/app/components/billing/vector-space-full/style.module.css
new file mode 100644
index 0000000..15bedd8
--- /dev/null
+++ b/app/components/billing/vector-space-full/style.module.css
@@ -0,0 +1,7 @@
+.textGradient {
+  background: linear-gradient(92deg, #2250F2 -29.55%, #0EBCF3 75.22%);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+  text-fill-color: transparent;
+}
diff --git a/app/components/browser-initor.tsx b/app/components/browser-initor.tsx
new file mode 100644
index 0000000..f2f4b02
--- /dev/null
+++ b/app/components/browser-initor.tsx
@@ -0,0 +1,52 @@
+'use client'
+
+class StorageMock {
+  data: Record<string, string>
+
+  constructor() {
+    this.data = {} as Record<string, string>
+  }
+
+  setItem(name: string, value: string) {
+    this.data[name] = value
+  }
+
+  getItem(name: string) {
+    return this.data[name] || null
+  }
+
+  removeItem(name: string) {
+    delete this.data[name]
+  }
+
+  clear() {
+    this.data = {}
+  }
+}
+
+let localStorage, sessionStorage
+
+try {
+  localStorage = globalThis.localStorage
+  sessionStorage = globalThis.sessionStorage
+}
+catch {
+  localStorage = new StorageMock()
+  sessionStorage = new StorageMock()
+}
+
+Object.defineProperty(globalThis, 'localStorage', {
+  value: localStorage,
+})
+
+Object.defineProperty(globalThis, 'sessionStorage', {
+  value: sessionStorage,
+})
+
+const BrowserInitor = ({
+  children,
+}: { children: React.ReactNode }) => {
+  return children
+}
+
+export default BrowserInitor
diff --git a/app/components/custom/custom-page/index.tsx b/app/components/custom/custom-page/index.tsx
new file mode 100644
index 0000000..90ce16b
--- /dev/null
+++ b/app/components/custom/custom-page/index.tsx
@@ -0,0 +1,38 @@
+import { useTranslation } from 'react-i18next'
+import CustomWebAppBrand from '../custom-web-app-brand'
+import { useProviderContext } from '@/context/provider-context'
+import { Plan } from '@/app/components/billing/type'
+import { contactSalesUrl } from '@/app/components/billing/config'
+import { useModalContext } from '@/context/modal-context'
+
+const CustomPage = () => {
+  const { t } = useTranslation()
+  const { plan, enableBilling } = useProviderContext()
+  const { setShowPricingModal } = useModalContext()
+  const showBillingTip = enableBilling && plan.type === Plan.sandbox
+  const showContact = enableBilling && (plan.type === Plan.professional || plan.type === Plan.team)
+
+  return (
+    <div className='flex flex-col'>
+      {showBillingTip && (
+        <div className='mb-1 flex justify-between rounded-xl bg-gradient-to-r from-components-input-border-active-prompt-1 to-components-input-border-active-prompt-2 p-4 pl-6 shadow-lg backdrop-blur-sm'>
+          <div className='space-y-1 text-text-primary-on-surface'>
+            <div className='title-xl-semi-bold'>{t('custom.upgradeTip.title')}</div>
+            <div className='system-sm-regular'>{t('custom.upgradeTip.des')}</div>
+          </div>
+          <div className='system-md-semibold flex h-10 w-[120px] cursor-pointer items-center justify-center rounded-3xl bg-white text-text-accent shadow-xs hover:opacity-95' onClick={() => setShowPricingModal()}>{t('billing.upgradeBtn.encourageShort')}</div>
+        </div>
+      )}
+      <CustomWebAppBrand />
+      {showContact && (
+        <div className='absolute bottom-0 h-[50px] text-xs leading-[50px] text-text-quaternary'>
+          {t('custom.customize.prefix')}
+          <a className='text-text-accent' href={contactSalesUrl} target='_blank' rel='noopener noreferrer'>{t('custom.customize.contactUs')}</a>
+          {t('custom.customize.suffix')}
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default CustomPage
diff --git a/app/components/custom/custom-web-app-brand/index.tsx b/app/components/custom/custom-web-app-brand/index.tsx
new file mode 100644
index 0000000..444df98
--- /dev/null
+++ b/app/components/custom/custom-web-app-brand/index.tsx
@@ -0,0 +1,319 @@
+import type { ChangeEvent } from 'react'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiEditBoxLine,
+  RiEqualizer2Line,
+  RiExchange2Fill,
+  RiImageAddLine,
+  RiLayoutLeft2Line,
+  RiLoader2Line,
+  RiPlayLargeLine,
+} from '@remixicon/react'
+import DifyLogo from '@/app/components/base/logo/dify-logo'
+import Switch from '@/app/components/base/switch'
+import Button from '@/app/components/base/button'
+import Divider from '@/app/components/base/divider'
+import { useProviderContext } from '@/context/provider-context'
+import { Plan } from '@/app/components/billing/type'
+import { imageUpload } from '@/app/components/base/image-uploader/utils'
+import { useToastContext } from '@/app/components/base/toast'
+import { BubbleTextMod } from '@/app/components/base/icons/src/vender/solid/communication'
+import {
+  updateCurrentWorkspace,
+} from '@/service/common'
+import { useAppContext } from '@/context/app-context'
+import cn from '@/utils/classnames'
+
+const ALLOW_FILE_EXTENSIONS = ['svg', 'png']
+
+const CustomWebAppBrand = () => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const { plan, enableBilling } = useProviderContext()
+  const {
+    currentWorkspace,
+    mutateCurrentWorkspace,
+    isCurrentWorkspaceManager,
+  } = useAppContext()
+  const [fileId, setFileId] = useState('')
+  const [imgKey, setImgKey] = useState(Date.now())
+  const [uploadProgress, setUploadProgress] = useState(0)
+  const isSandbox = enableBilling && plan.type === Plan.sandbox
+  const uploading = uploadProgress > 0 && uploadProgress < 100
+  const webappLogo = currentWorkspace.custom_config?.replace_webapp_logo || ''
+  const webappBrandRemoved = currentWorkspace.custom_config?.remove_webapp_brand
+  const uploadDisabled = isSandbox || webappBrandRemoved || !isCurrentWorkspaceManager
+
+  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
+    const file = e.target.files?.[0]
+
+    if (!file)
+      return
+
+    if (file.size > 5 * 1024 * 1024) {
+      notify({ type: 'error', message: t('common.imageUploader.uploadFromComputerLimit', { size: 5 }) })
+      return
+    }
+
+    imageUpload({
+      file,
+      onProgressCallback: (progress) => {
+        setUploadProgress(progress)
+      },
+      onSuccessCallback: (res) => {
+        setUploadProgress(100)
+        setFileId(res.id)
+      },
+      onErrorCallback: () => {
+        notify({ type: 'error', message: t('common.imageUploader.uploadFromComputerUploadError') })
+        setUploadProgress(-1)
+      },
+    }, false, '/workspaces/custom-config/webapp-logo/upload')
+  }
+
+  const handleApply = async () => {
+    await updateCurrentWorkspace({
+      url: '/workspaces/custom-config',
+      body: {
+        remove_webapp_brand: webappBrandRemoved,
+        replace_webapp_logo: fileId,
+      },
+    })
+    mutateCurrentWorkspace()
+    setFileId('')
+    setImgKey(Date.now())
+  }
+
+  const handleRestore = async () => {
+    await updateCurrentWorkspace({
+      url: '/workspaces/custom-config',
+      body: {
+        remove_webapp_brand: false,
+        replace_webapp_logo: '',
+      },
+    })
+    mutateCurrentWorkspace()
+  }
+
+  const handleSwitch = async (checked: boolean) => {
+    await updateCurrentWorkspace({
+      url: '/workspaces/custom-config',
+      body: {
+        remove_webapp_brand: checked,
+      },
+    })
+    mutateCurrentWorkspace()
+  }
+
+  const handleCancel = () => {
+    setFileId('')
+    setUploadProgress(0)
+  }
+
+  return (
+    <div className='py-4'>
+      <div className='system-md-medium mb-2 flex items-center justify-between rounded-xl bg-background-section-burn p-4 text-text-primary'>
+        {t('custom.webapp.removeBrand')}
+        <Switch
+          size='l'
+          defaultValue={webappBrandRemoved}
+          disabled={isSandbox || !isCurrentWorkspaceManager}
+          onChange={handleSwitch}
+        />
+      </div>
+      <div className={cn('flex h-14 items-center justify-between rounded-xl bg-background-section-burn px-4', webappBrandRemoved && 'opacity-30')}>
+        <div>
+          <div className='system-md-medium text-text-primary'>{t('custom.webapp.changeLogo')}</div>
+          <div className='system-xs-regular text-text-tertiary'>{t('custom.webapp.changeLogoTip')}</div>
+        </div>
+        <div className='flex items-center'>
+          {(uploadDisabled || (!webappLogo && !webappBrandRemoved)) && (
+            <>
+              <Button
+                variant='ghost'
+                disabled={uploadDisabled || (!webappLogo && !webappBrandRemoved)}
+                onClick={handleRestore}
+              >
+                {t('custom.restore')}
+              </Button>
+              <div className='mx-2 h-5 w-[1px] bg-divider-regular'></div>
+            </>
+          )}
+          {
+            !uploading && (
+              <Button
+                className='relative mr-2'
+                disabled={uploadDisabled}
+              >
+                <RiImageAddLine className='mr-1 h-4 w-4' />
+                {
+                  (webappLogo || fileId)
+                    ? t('custom.change')
+                    : t('custom.upload')
+                }
+                <input
+                  className={cn('absolute inset-0 block w-full text-[0] opacity-0', uploadDisabled ? 'cursor-not-allowed' : 'cursor-pointer')}
+                  onClick={e => (e.target as HTMLInputElement).value = ''}
+                  type='file'
+                  accept={ALLOW_FILE_EXTENSIONS.map(ext => `.${ext}`).join(',')}
+                  onChange={handleChange}
+                  disabled={uploadDisabled}
+                />
+              </Button>
+            )
+          }
+          {
+            uploading && (
+              <Button
+                className='relative mr-2'
+                disabled={true}
+              >
+                <RiLoader2Line className='mr-1 h-4 w-4 animate-spin' />
+                {t('custom.uploading')}
+              </Button>
+            )
+          }
+          {
+            fileId && (
+              <>
+                <Button
+                  className='mr-2'
+                  onClick={handleCancel}
+                  disabled={webappBrandRemoved || !isCurrentWorkspaceManager}
+                >
+                  {t('common.operation.cancel')}
+                </Button>
+                <Button
+                  variant='primary'
+                  className='mr-2'
+                  onClick={handleApply}
+                  disabled={webappBrandRemoved || !isCurrentWorkspaceManager}
+                >
+                  {t('custom.apply')}
+                </Button>
+              </>
+            )
+          }
+        </div>
+      </div>
+      {uploadProgress === -1 && (
+        <div className='mt-2 text-xs text-[#D92D20]'>{t('custom.uploadedFail')}</div>
+      )}
+      <div className='mb-2 mt-5 flex items-center gap-2'>
+        <div className='system-xs-medium-uppercase shrink-0 text-text-tertiary'>{t('appOverview.overview.appInfo.preview')}</div>
+        <Divider bgStyle='gradient' className='grow' />
+      </div>
+      <div className='relative mb-2 flex items-center gap-3'>
+        {/* chat card */}
+        <div className='flex h-[320px] grow basis-1/2 overflow-hidden rounded-2xl border-[0.5px] border-components-panel-border-subtle bg-background-default-burn'>
+          <div className='flex h-full w-[232px] shrink-0 flex-col p-1 pr-0'>
+            <div className='flex items-center gap-3 p-3 pr-2'>
+              <div className={cn('inline-flex h-8 w-8 items-center justify-center rounded-lg border border-divider-regular', 'bg-components-icon-bg-blue-light-solid')}>
+                <BubbleTextMod className='h-4 w-4 text-components-avatar-shape-fill-stop-100' />
+              </div>
+              <div className='system-md-semibold grow text-text-secondary'>Chatflow App</div>
+              <div className='p-1.5'>
+                <RiLayoutLeft2Line className='h-4 w-4 text-text-tertiary' />
+              </div>
+            </div>
+            <div className='shrink-0 px-4 py-3'>
+              <Button variant='secondary-accent' className='w-full justify-center'>
+                <RiEditBoxLine className='mr-1 h-4 w-4' />
+                <div className='p-1 opacity-20'>
+                  <div className='h-2 w-[94px] rounded-sm bg-text-accent-light-mode-only'></div>
+                </div>
+              </Button>
+            </div>
+            <div className='grow px-3 pt-5'>
+              <div className='flex h-8 items-center px-3 py-1'>
+                <div className='h-2 w-14 rounded-sm bg-text-quaternary opacity-20'></div>
+              </div>
+              <div className='flex h-8 items-center px-3 py-1'>
+                <div className='h-2 w-[168px] rounded-sm bg-text-quaternary opacity-20'></div>
+              </div>
+              <div className='flex h-8 items-center px-3 py-1'>
+                <div className='h-2 w-[128px] rounded-sm bg-text-quaternary opacity-20'></div>
+              </div>
+            </div>
+            <div className='flex shrink-0 items-center justify-between p-3'>
+              <div className='p-1.5'>
+                <RiEqualizer2Line className='h-4 w-4 text-text-tertiary' />
+              </div>
+              <div className='flex items-center gap-1.5'>
+                {!webappBrandRemoved && (
+                  <>
+                    <div className='system-2xs-medium-uppercase text-text-tertiary'>POWERED BY</div>
+                    {webappLogo
+                      ? <img src={`${webappLogo}?hash=${imgKey}`} alt='logo' className='block h-5 w-auto' />
+                      : <DifyLogo size='small' />
+                    }
+                  </>
+                )}
+              </div>
+            </div>
+          </div>
+          <div className='flex w-[138px] grow flex-col justify-between p-2 pr-0'>
+            <div className='flex grow flex-col justify-between rounded-l-2xl border-[0.5px] border-r-0 border-components-panel-border-subtle bg-chatbot-bg pb-4 pl-[22px] pt-16'>
+              <div className='w-[720px] rounded-2xl border border-divider-subtle bg-chat-bubble-bg px-4 py-3'>
+                <div className='body-md-regular mb-1 text-text-primary'>Hello! How can I assist you today?</div>
+                <Button size='small'>
+                  <div className='h-2 w-[144px] rounded-sm bg-text-quaternary opacity-20'></div>
+                </Button>
+              </div>
+              <div className='body-lg-regular flex h-[52px] w-[578px] items-center rounded-xl border border-components-chat-input-border bg-components-panel-bg-blur pl-3.5 text-text-placeholder shadow-md backdrop-blur-sm'>Talk to Dify</div>
+            </div>
+          </div>
+        </div>
+        {/* workflow card */}
+        <div className='flex h-[320px] grow basis-1/2 flex-col overflow-hidden rounded-2xl border-[0.5px] border-components-panel-border-subtle bg-background-default-burn'>
+          <div className='w-full border-b-[0.5px] border-divider-subtle p-4 pb-0'>
+            <div className='mb-2 flex items-center gap-3'>
+              <div className={cn('inline-flex h-8 w-8 items-center justify-center rounded-lg border border-divider-regular', 'bg-components-icon-bg-indigo-solid')}>
+                <RiExchange2Fill className='h-4 w-4 text-components-avatar-shape-fill-stop-100' />
+              </div>
+              <div className='system-md-semibold grow text-text-secondary'>Workflow App</div>
+              <div className='p-1.5'>
+                <RiLayoutLeft2Line className='h-4 w-4 text-text-tertiary' />
+              </div>
+            </div>
+            <div className='flex items-center gap-4'>
+              <div className='system-md-semibold-uppercase flex h-10 shrink-0 items-center border-b-2 border-components-tab-active text-text-primary'>RUN ONCE</div>
+              <div className='system-md-semibold-uppercase flex h-10 grow items-center border-b-2 border-transparent text-text-tertiary'>RUN BATCH</div>
+            </div>
+          </div>
+          <div className='grow bg-components-panel-bg'>
+            <div className='p-4 pb-1'>
+              <div className='mb-1 py-2'>
+                <div className='h-2 w-20 rounded-sm bg-text-quaternary opacity-20'></div>
+              </div>
+              <div className='h-16 w-full rounded-lg bg-components-input-bg-normal '></div>
+            </div>
+            <div className='flex items-center justify-between px-4 py-3'>
+              <Button size='small'>
+                <div className='h-2 w-10 rounded-sm bg-text-quaternary opacity-20'></div>
+              </Button>
+              <Button variant='primary' size='small' disabled>
+                <RiPlayLargeLine className='mr-1 h-4 w-4' />
+                <span>Execute</span>
+              </Button>
+            </div>
+          </div>
+          <div className='flex h-12 shrink-0 items-center gap-1.5 bg-components-panel-bg p-4 pt-3'>
+            {!webappBrandRemoved && (
+              <>
+                <div className='system-2xs-medium-uppercase text-text-tertiary'>POWERED BY</div>
+                {webappLogo
+                  ? <img src={`${webappLogo}?hash=${imgKey}`} alt='logo' className='block h-5 w-auto' />
+                  : <DifyLogo size='small' />
+                }
+              </>
+            )}
+          </div>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default CustomWebAppBrand
diff --git a/app/components/custom/custom-web-app-brand/style.module.css b/app/components/custom/custom-web-app-brand/style.module.css
new file mode 100644
index 0000000..bdc7d7c
--- /dev/null
+++ b/app/components/custom/custom-web-app-brand/style.module.css
@@ -0,0 +1,3 @@
+.mask {
+  background: linear-gradient(273deg, rgba(255, 255, 255, 0.00) 51.75%, rgba(255, 255, 255, 0.80) 115.32%);
+}
diff --git a/app/components/custom/style.module.css b/app/components/custom/style.module.css
new file mode 100644
index 0000000..0a839f6
--- /dev/null
+++ b/app/components/custom/style.module.css
@@ -0,0 +1,6 @@
+.textGradient {
+  background: linear-gradient(92deg, #2250F2 -29.55%, #0EBCF3 75.22%);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+}
diff --git a/app/components/datasets/api/index.tsx b/app/components/datasets/api/index.tsx
new file mode 100644
index 0000000..3ca84c3
--- /dev/null
+++ b/app/components/datasets/api/index.tsx
@@ -0,0 +1,9 @@
+import React from 'react'
+
+const index = () => {
+  return (
+    <div>index</div>
+  )
+}
+
+export default index
diff --git a/app/components/datasets/chunk.tsx b/app/components/datasets/chunk.tsx
new file mode 100644
index 0000000..eb36c20
--- /dev/null
+++ b/app/components/datasets/chunk.tsx
@@ -0,0 +1,56 @@
+import type { FC, PropsWithChildren } from 'react'
+import { SelectionMod } from '../base/icons/src/public/knowledge'
+import type { QA } from '@/models/datasets'
+
+export type ChunkLabelProps = {
+  label: string
+  characterCount: number
+}
+
+export const ChunkLabel: FC<ChunkLabelProps> = (props) => {
+  const { label, characterCount } = props
+  return <div className='flex items-center text-xs font-medium text-text-tertiary'>
+    <SelectionMod className='size-[10px]' />
+    <p className='ml-0.5 flex gap-2'>
+      <span>
+        {label}
+      </span>
+      <span>
+        路
+      </span>
+      <span>
+        {`${characterCount} characters`}
+      </span>
+    </p>
+  </div>
+}
+
+export type ChunkContainerProps = ChunkLabelProps & PropsWithChildren
+
+export const ChunkContainer: FC<ChunkContainerProps> = (props) => {
+  const { label, characterCount, children } = props
+  return <div className='space-y-2'>
+    <ChunkLabel label={label} characterCount={characterCount} />
+    <div className='body-md-regular text-text-secondary'>
+      {children}
+    </div>
+  </div>
+}
+
+export type QAPreviewProps = {
+  qa: QA
+}
+
+export const QAPreview: FC<QAPreviewProps> = (props) => {
+  const { qa } = props
+  return <div className='flex flex-col gap-y-2'>
+    <div className='flex gap-x-1'>
+      <label className='shrink-0 text-[13px] font-medium leading-[20px] text-text-tertiary'>Q</label>
+      <p className='body-md-regular text-text-secondary'>{qa.question}</p>
+    </div>
+    <div className='flex gap-x-1'>
+      <label className='shrink-0 text-[13px] font-medium leading-[20px] text-text-tertiary'>A</label>
+      <p className='body-md-regular text-text-secondary'>{qa.answer}</p>
+    </div>
+  </div>
+}
diff --git a/app/components/datasets/common/check-rerank-model.ts b/app/components/datasets/common/check-rerank-model.ts
new file mode 100644
index 0000000..ccb8c45
--- /dev/null
+++ b/app/components/datasets/common/check-rerank-model.ts
@@ -0,0 +1,70 @@
+import { RETRIEVE_METHOD, type RetrievalConfig } from '@/types/app'
+import type {
+  DefaultModelResponse,
+  Model,
+} from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { RerankingModeEnum } from '@/models/datasets'
+
+export const isReRankModelSelected = ({
+  retrievalConfig,
+  rerankModelList,
+  indexMethod,
+}: {
+  retrievalConfig: RetrievalConfig
+  rerankModelList: Model[]
+  indexMethod?: string
+}) => {
+  const rerankModelSelected = (() => {
+    if (retrievalConfig.reranking_model?.reranking_model_name) {
+      const provider = rerankModelList.find(({ provider }) => provider === retrievalConfig.reranking_model?.reranking_provider_name)
+
+      return provider?.models.find(({ model }) => model === retrievalConfig.reranking_model?.reranking_model_name)
+    }
+
+    return false
+  })()
+
+  if (
+    indexMethod === 'high_quality'
+    && ([RETRIEVE_METHOD.semantic, RETRIEVE_METHOD.fullText].includes(retrievalConfig.search_method))
+    && retrievalConfig.reranking_enable
+    && !rerankModelSelected
+  )
+    return false
+
+  if (
+    indexMethod === 'high_quality'
+    && (retrievalConfig.search_method === RETRIEVE_METHOD.hybrid && retrievalConfig.reranking_mode !== RerankingModeEnum.WeightedScore)
+    && !rerankModelSelected
+  )
+    return false
+
+  return true
+}
+
+export const ensureRerankModelSelected = ({
+  rerankDefaultModel,
+  indexMethod,
+  retrievalConfig,
+}: {
+  rerankDefaultModel: DefaultModelResponse
+  retrievalConfig: RetrievalConfig
+  indexMethod?: string
+}) => {
+  const rerankModel = retrievalConfig.reranking_model?.reranking_model_name ? retrievalConfig.reranking_model : undefined
+  if (
+    indexMethod === 'high_quality'
+    && (retrievalConfig.reranking_enable || retrievalConfig.search_method === RETRIEVE_METHOD.hybrid)
+    && !rerankModel
+    && rerankDefaultModel
+  ) {
+    return {
+      ...retrievalConfig,
+      reranking_model: {
+        reranking_provider_name: rerankDefaultModel.provider.provider,
+        reranking_model_name: rerankDefaultModel.model,
+      },
+    }
+  }
+  return retrievalConfig
+}
diff --git a/app/components/datasets/common/chunking-mode-label.tsx b/app/components/datasets/common/chunking-mode-label.tsx
new file mode 100644
index 0000000..ced0f44
--- /dev/null
+++ b/app/components/datasets/common/chunking-mode-label.tsx
@@ -0,0 +1,29 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import Badge from '@/app/components/base/badge'
+import { GeneralType, ParentChildType } from '@/app/components/base/icons/src/public/knowledge'
+
+type Props = {
+  isGeneralMode: boolean
+  isQAMode: boolean
+}
+
+const ChunkingModeLabel: FC<Props> = ({
+  isGeneralMode,
+  isQAMode,
+}) => {
+  const { t } = useTranslation()
+  const TypeIcon = isGeneralMode ? GeneralType : ParentChildType
+
+  return (
+    <Badge>
+      <div className='flex h-full items-center space-x-0.5 text-text-tertiary'>
+        <TypeIcon className='h-3 w-3' />
+        <span className='system-2xs-medium-uppercase'>{isGeneralMode ? `${t('dataset.chunkingMode.general')}${isQAMode ? ' 路 QA' : ''}` : t('dataset.chunkingMode.parentChild')}</span>
+      </div>
+    </Badge>
+  )
+}
+export default React.memo(ChunkingModeLabel)
diff --git a/app/components/datasets/common/document-file-icon.tsx b/app/components/datasets/common/document-file-icon.tsx
new file mode 100644
index 0000000..5842cbb
--- /dev/null
+++ b/app/components/datasets/common/document-file-icon.tsx
@@ -0,0 +1,40 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import FileTypeIcon from '../../base/file-uploader/file-type-icon'
+import type { FileAppearanceType } from '@/app/components/base/file-uploader/types'
+import { FileAppearanceTypeEnum } from '@/app/components/base/file-uploader/types'
+
+const extendToFileTypeMap: { [key: string]: FileAppearanceType } = {
+  pdf: FileAppearanceTypeEnum.pdf,
+  json: FileAppearanceTypeEnum.document,
+  html: FileAppearanceTypeEnum.document,
+  txt: FileAppearanceTypeEnum.document,
+  markdown: FileAppearanceTypeEnum.markdown,
+  md: FileAppearanceTypeEnum.markdown,
+  xlsx: FileAppearanceTypeEnum.excel,
+  xls: FileAppearanceTypeEnum.excel,
+  csv: FileAppearanceTypeEnum.excel,
+  doc: FileAppearanceTypeEnum.word,
+  docx: FileAppearanceTypeEnum.word,
+}
+
+type Props = {
+  extension?: string
+  name?: string
+  size?: 'sm' | 'lg' | 'md'
+  className?: string
+}
+
+const DocumentFileIcon: FC<Props> = ({
+  extension,
+  name,
+  size = 'md',
+  className,
+}) => {
+  const localExtension = extension?.toLowerCase() || name?.split('.')?.pop()?.toLowerCase()
+  return (
+    <FileTypeIcon type={extendToFileTypeMap[localExtension!] || FileAppearanceTypeEnum.document} size={size} className={className} />
+  )
+}
+export default React.memo(DocumentFileIcon)
diff --git a/app/components/datasets/common/document-picker/document-list.tsx b/app/components/datasets/common/document-picker/document-list.tsx
new file mode 100644
index 0000000..5ac98b9
--- /dev/null
+++ b/app/components/datasets/common/document-picker/document-list.tsx
@@ -0,0 +1,42 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import FileIcon from '../document-file-icon'
+import cn from '@/utils/classnames'
+import type { DocumentItem } from '@/models/datasets'
+
+type Props = {
+  className?: string
+  list: DocumentItem[]
+  onChange: (value: DocumentItem) => void
+}
+
+const DocumentList: FC<Props> = ({
+  className,
+  list,
+  onChange,
+}) => {
+  const handleChange = useCallback((item: DocumentItem) => {
+    return () => onChange(item)
+  }, [onChange])
+
+  return (
+    <div className={cn(className)}>
+      {list.map((item) => {
+        const { id, name, extension } = item
+        return (
+          <div
+            key={id}
+            className='flex h-8 cursor-pointer items-center space-x-2 rounded-lg px-2 hover:bg-state-base-hover'
+            onClick={handleChange(item)}
+          >
+            <FileIcon name={item.name} extension={extension} size='md' />
+            <div className='truncate text-sm text-text-secondary'>{name}</div>
+          </div>
+        )
+      })}
+    </div>
+  )
+}
+
+export default React.memo(DocumentList)
diff --git a/app/components/datasets/common/document-picker/index.tsx b/app/components/datasets/common/document-picker/index.tsx
new file mode 100644
index 0000000..d1a6a37
--- /dev/null
+++ b/app/components/datasets/common/document-picker/index.tsx
@@ -0,0 +1,118 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useBoolean } from 'ahooks'
+import { RiArrowDownSLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import FileIcon from '../document-file-icon'
+import DocumentList from './document-list'
+import type { DocumentItem, ParentMode, SimpleDocumentDetail } from '@/models/datasets'
+import { ProcessMode } from '@/models/datasets'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import cn from '@/utils/classnames'
+import SearchInput from '@/app/components/base/search-input'
+import { GeneralType, ParentChildType } from '@/app/components/base/icons/src/public/knowledge'
+import { useDocumentList } from '@/service/knowledge/use-document'
+import Loading from '@/app/components/base/loading'
+
+type Props = {
+  datasetId: string
+  value: {
+    name?: string
+    extension?: string
+    processMode?: ProcessMode
+    parentMode?: ParentMode
+  }
+  onChange: (value: SimpleDocumentDetail) => void
+}
+
+const DocumentPicker: FC<Props> = ({
+  datasetId,
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const {
+    name,
+    extension,
+    processMode,
+    parentMode,
+  } = value
+  const [query, setQuery] = useState('')
+
+  const { data } = useDocumentList({
+    datasetId,
+    query: {
+      keyword: query,
+      page: 1,
+      limit: 20,
+    },
+  })
+  const documentsList = data?.data
+  const isParentChild = processMode === ProcessMode.parentChild
+  const TypeIcon = isParentChild ? ParentChildType : GeneralType
+
+  const [open, {
+    set: setOpen,
+    toggle: togglePopup,
+  }] = useBoolean(false)
+  const ArrowIcon = RiArrowDownSLine
+
+  const handleChange = useCallback(({ id }: DocumentItem) => {
+    onChange(documentsList?.find(item => item.id === id) as SimpleDocumentDetail)
+    setOpen(false)
+  }, [documentsList, onChange, setOpen])
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+    >
+      <PortalToFollowElemTrigger onClick={togglePopup}>
+        <div className={cn('ml-1 flex cursor-pointer select-none items-center rounded-lg px-2 py-0.5 hover:bg-state-base-hover', open && 'bg-state-base-hover')}>
+          <FileIcon name={name} extension={extension} size='lg' />
+          <div className='ml-1 mr-0.5 flex flex-col items-start'>
+            <div className='flex items-center space-x-0.5'>
+              <span className={cn('system-md-semibold text-text-primary')}> {name || '--'}</span>
+              <ArrowIcon className={'h-4 w-4 text-text-primary'} />
+            </div>
+            <div className='flex h-3 items-center space-x-0.5 text-text-tertiary'>
+              <TypeIcon className='h-3 w-3' />
+              <span className={cn('system-2xs-medium-uppercase', isParentChild && 'mt-0.5' /* to icon problem cause not ver align */)}>
+                {isParentChild ? t('dataset.chunkingMode.parentChild') : t('dataset.chunkingMode.general')}
+                {isParentChild && ` 路 ${!parentMode ? '--' : parentMode === 'paragraph' ? t('dataset.parentMode.paragraph') : t('dataset.parentMode.fullDoc')}`}
+              </span>
+            </div>
+          </div>
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[11]'>
+        <div className='w-[360px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 pt-2 shadow-lg backdrop-blur-[5px]'>
+          <SearchInput value={query} onChange={setQuery} className='mx-1' />
+          {documentsList
+            ? (
+              <DocumentList
+                className='mt-2'
+                list={documentsList.map(d => ({
+                  id: d.id,
+                  name: d.name,
+                  extension: d.data_source_detail_dict?.upload_file?.extension || '',
+                }))}
+                onChange={handleChange}
+              />
+            )
+            : (<div className='mt-2 flex h-[100px] w-[360px] items-center justify-center'>
+              <Loading />
+            </div>)}
+        </div>
+
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default React.memo(DocumentPicker)
diff --git a/app/components/datasets/common/document-picker/preview-document-picker.tsx b/app/components/datasets/common/document-picker/preview-document-picker.tsx
new file mode 100644
index 0000000..a6de0c3
--- /dev/null
+++ b/app/components/datasets/common/document-picker/preview-document-picker.tsx
@@ -0,0 +1,82 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useBoolean } from 'ahooks'
+import { RiArrowDownSLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import FileIcon from '../document-file-icon'
+import DocumentList from './document-list'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import cn from '@/utils/classnames'
+import Loading from '@/app/components/base/loading'
+import type { DocumentItem } from '@/models/datasets'
+
+type Props = {
+  className?: string
+  value: DocumentItem
+  files: DocumentItem[]
+  onChange: (value: DocumentItem) => void
+}
+
+const PreviewDocumentPicker: FC<Props> = ({
+  className,
+  value,
+  files,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const { name, extension } = value
+
+  const [open, {
+    set: setOpen,
+    toggle: togglePopup,
+  }] = useBoolean(false)
+  const ArrowIcon = RiArrowDownSLine
+
+  const handleChange = useCallback((item: DocumentItem) => {
+    onChange(item)
+    setOpen(false)
+  }, [onChange, setOpen])
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <PortalToFollowElemTrigger onClick={togglePopup}>
+        <div className={cn('flex h-6 select-none items-center rounded-md px-1 hover:bg-state-base-hover', open && 'bg-state-base-hover', className)}>
+          <FileIcon name={name} extension={extension} size='md' />
+          <div className='ml-1 flex flex-col items-start'>
+            <div className='flex items-center space-x-0.5'>
+              <span className={cn('system-md-semibold max-w-[200px] truncate text-text-primary')}> {name || '--'}</span>
+              <ArrowIcon className={'h-[18px] w-[18px] text-text-primary'} />
+            </div>
+          </div>
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[11]'>
+        <div className='w-[392px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg backdrop-blur-[5px]'>
+          {files?.length > 1 && <div className='system-xs-medium-uppercase flex h-8 items-center pl-2 text-text-tertiary'>{t('dataset.preprocessDocument', { num: files.length })}</div>}
+          {files?.length > 0
+            ? (
+              <DocumentList
+                list={files}
+                onChange={handleChange}
+              />
+            )
+            : (<div className='mt-2 flex h-[100px] w-[360px] items-center justify-center'>
+              <Loading />
+            </div>)}
+        </div>
+
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default React.memo(PreviewDocumentPicker)
diff --git a/app/components/datasets/common/document-status-with-action/auto-disabled-document.tsx b/app/components/datasets/common/document-status-with-action/auto-disabled-document.tsx
new file mode 100644
index 0000000..b687c00
--- /dev/null
+++ b/app/components/datasets/common/document-status-with-action/auto-disabled-document.tsx
@@ -0,0 +1,38 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import StatusWithAction from './status-with-action'
+import { useAutoDisabledDocuments, useDocumentEnable, useInvalidDisabledDocument } from '@/service/knowledge/use-document'
+import Toast from '@/app/components/base/toast'
+type Props = {
+  datasetId: string
+}
+
+const AutoDisabledDocument: FC<Props> = ({
+  datasetId,
+}) => {
+  const { t } = useTranslation()
+  const { data, isLoading } = useAutoDisabledDocuments(datasetId)
+  const invalidDisabledDocument = useInvalidDisabledDocument()
+  const documentIds = data?.document_ids
+  const hasDisabledDocument = documentIds && documentIds.length > 0
+  const { mutateAsync: enableDocument } = useDocumentEnable()
+  const handleEnableDocuments = useCallback(async () => {
+    await enableDocument({ datasetId, documentIds })
+    invalidDisabledDocument()
+    Toast.notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+  }, [])
+  if (!hasDisabledDocument || isLoading)
+    return null
+
+  return (
+    <StatusWithAction
+      type='info'
+      description={t('dataset.documentsDisabled', { num: documentIds?.length })}
+      actionText={t('dataset.enable')}
+      onAction={handleEnableDocuments}
+    />
+  )
+}
+export default React.memo(AutoDisabledDocument)
diff --git a/app/components/datasets/common/document-status-with-action/index-failed.tsx b/app/components/datasets/common/document-status-with-action/index-failed.tsx
new file mode 100644
index 0000000..802e3d8
--- /dev/null
+++ b/app/components/datasets/common/document-status-with-action/index-failed.tsx
@@ -0,0 +1,70 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useReducer } from 'react'
+import { useTranslation } from 'react-i18next'
+import useSWR from 'swr'
+import StatusWithAction from './status-with-action'
+import { getErrorDocs, retryErrorDocs } from '@/service/datasets'
+import type { IndexingStatusResponse } from '@/models/datasets'
+import { noop } from 'lodash-es'
+
+type Props = {
+  datasetId: string
+}
+type IIndexState = {
+  value: string
+}
+type ActionType = 'retry' | 'success' | 'error'
+
+type IAction = {
+  type: ActionType
+}
+const indexStateReducer = (state: IIndexState, action: IAction) => {
+  const actionMap = {
+    retry: 'retry',
+    success: 'success',
+    error: 'error',
+  }
+
+  return {
+    ...state,
+    value: actionMap[action.type] || state.value,
+  }
+}
+
+const RetryButton: FC<Props> = ({ datasetId }) => {
+  const { t } = useTranslation()
+  const [indexState, dispatch] = useReducer(indexStateReducer, { value: 'success' })
+  const { data: errorDocs, isLoading } = useSWR({ datasetId }, getErrorDocs)
+
+  const onRetryErrorDocs = async () => {
+    dispatch({ type: 'retry' })
+    const document_ids = errorDocs?.data.map((doc: IndexingStatusResponse) => doc.id) || []
+    const res = await retryErrorDocs({ datasetId, document_ids })
+    if (res.result === 'success')
+      dispatch({ type: 'success' })
+    else
+      dispatch({ type: 'error' })
+  }
+
+  useEffect(() => {
+    if (errorDocs?.total === 0)
+      dispatch({ type: 'success' })
+    else
+      dispatch({ type: 'error' })
+  }, [errorDocs?.total])
+
+  if (isLoading || indexState.value === 'success')
+    return null
+
+  return (
+    <StatusWithAction
+      type='warning'
+      description={`${errorDocs?.total} ${t('dataset.docsFailedNotice')}`}
+      actionText={t('dataset.retry')}
+      disabled={indexState.value === 'retry'}
+      onAction={indexState.value === 'error' ? onRetryErrorDocs : noop}
+    />
+  )
+}
+export default RetryButton
diff --git a/app/components/datasets/common/document-status-with-action/status-with-action.tsx b/app/components/datasets/common/document-status-with-action/status-with-action.tsx
new file mode 100644
index 0000000..0314b26
--- /dev/null
+++ b/app/components/datasets/common/document-status-with-action/status-with-action.tsx
@@ -0,0 +1,70 @@
+'use client'
+import { RiAlertFill, RiCheckboxCircleFill, RiErrorWarningFill, RiInformation2Fill } from '@remixicon/react'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+import Divider from '@/app/components/base/divider'
+
+type Status = 'success' | 'error' | 'warning' | 'info'
+type Props = {
+  type?: Status
+  description: string
+  actionText?: string
+  onAction?: () => void
+  disabled?: boolean
+}
+
+const IconMap = {
+  success: {
+    Icon: RiCheckboxCircleFill,
+    color: 'text-text-success',
+  },
+  error: {
+    Icon: RiErrorWarningFill,
+    color: 'text-text-destructive',
+  },
+  warning: {
+    Icon: RiAlertFill,
+    color: 'text-text-warning-secondary',
+  },
+  info: {
+    Icon: RiInformation2Fill,
+    color: 'text-text-accent',
+  },
+}
+
+const getIcon = (type: Status) => {
+  return IconMap[type]
+}
+
+const StatusAction: FC<Props> = ({
+  type = 'info',
+  description,
+  actionText,
+  onAction,
+  disabled,
+}) => {
+  const { Icon, color } = getIcon(type)
+  return (
+    <div className='relative flex h-[34px] items-center rounded-lg border border-components-panel-border bg-components-panel-bg-blur pl-2 pr-3 shadow-xs'>
+      <div className={
+        `absolute inset-0 rounded-lg opacity-40 ${(type === 'success' && 'bg-[linear-gradient(92deg,rgba(23,178,106,0.25)_0%,rgba(255,255,255,0.00)_100%)]')
+        || (type === 'warning' && 'bg-[linear-gradient(92deg,rgba(247,144,9,0.25)_0%,rgba(255,255,255,0.00)_100%)]')
+        || (type === 'error' && 'bg-[linear-gradient(92deg,rgba(240,68,56,0.25)_0%,rgba(255,255,255,0.00)_100%)]')
+        || (type === 'info' && 'bg-[linear-gradient(92deg,rgba(11,165,236,0.25)_0%,rgba(255,255,255,0.00)_100%)]')
+        }`}
+      />
+      <div className='relative z-10 flex h-full items-center space-x-2'>
+        <Icon className={cn('h-4 w-4', color)} />
+        <div className='text-[13px] font-normal text-text-secondary'>{description}</div>
+        {onAction && (
+          <>
+            <Divider type='vertical' className='!h-4' />
+            <div onClick={onAction} className={cn('cursor-pointer text-[13px] font-semibold text-text-accent', disabled && 'cursor-not-allowed text-text-disabled')}>{actionText}</div>
+          </>
+        )}
+      </div>
+    </div>
+  )
+}
+export default React.memo(StatusAction)
diff --git a/app/components/datasets/common/economical-retrieval-method-config/index.tsx b/app/components/datasets/common/economical-retrieval-method-config/index.tsx
new file mode 100644
index 0000000..17cb3ef
--- /dev/null
+++ b/app/components/datasets/common/economical-retrieval-method-config/index.tsx
@@ -0,0 +1,42 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import Image from 'next/image'
+import RetrievalParamConfig from '../retrieval-param-config'
+import { OptionCard } from '../../create/step-two/option-card'
+import { retrievalIcon } from '../../create/icons'
+import { RETRIEVE_METHOD } from '@/types/app'
+import type { RetrievalConfig } from '@/types/app'
+
+type Props = {
+  disabled?: boolean
+  value: RetrievalConfig
+  onChange: (value: RetrievalConfig) => void
+}
+
+const EconomicalRetrievalMethodConfig: FC<Props> = ({
+  disabled = false,
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='space-y-2'>
+      <OptionCard
+        disabled={disabled} icon={<Image className='h-4 w-4' src={retrievalIcon.vector} alt='' />}
+        title={t('dataset.retrieval.invertedIndex.title')}
+        description={t('dataset.retrieval.invertedIndex.description')} isActive
+        activeHeaderClassName='bg-dataset-option-card-purple-gradient'
+      >
+        <RetrievalParamConfig
+          type={RETRIEVE_METHOD.invertedIndex}
+          value={value}
+          onChange={onChange}
+        />
+      </OptionCard>
+    </div>
+  )
+}
+export default React.memo(EconomicalRetrievalMethodConfig)
diff --git a/app/components/datasets/common/retrieval-method-config/index.tsx b/app/components/datasets/common/retrieval-method-config/index.tsx
new file mode 100644
index 0000000..f979447
--- /dev/null
+++ b/app/components/datasets/common/retrieval-method-config/index.tsx
@@ -0,0 +1,157 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import Image from 'next/image'
+import RetrievalParamConfig from '../retrieval-param-config'
+import { OptionCard } from '../../create/step-two/option-card'
+import Effect from '../../create/assets/option-card-effect-purple.svg'
+import { retrievalIcon } from '../../create/icons'
+import type { RetrievalConfig } from '@/types/app'
+import { RETRIEVE_METHOD } from '@/types/app'
+import { useProviderContext } from '@/context/provider-context'
+import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import {
+  DEFAULT_WEIGHTED_SCORE,
+  RerankingModeEnum,
+  WeightedScoreEnum,
+} from '@/models/datasets'
+import Badge from '@/app/components/base/badge'
+
+type Props = {
+  disabled?: boolean
+  value: RetrievalConfig
+  onChange: (value: RetrievalConfig) => void
+}
+
+const RetrievalMethodConfig: FC<Props> = ({
+  disabled = false,
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const { supportRetrievalMethods } = useProviderContext()
+  const {
+    defaultModel: rerankDefaultModel,
+    currentModel: isRerankDefaultModelValid,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
+
+  const onSwitch = useCallback((retrieveMethod: RETRIEVE_METHOD) => {
+    if ([RETRIEVE_METHOD.semantic, RETRIEVE_METHOD.fullText].includes(retrieveMethod)) {
+      onChange({
+        ...value,
+        search_method: retrieveMethod,
+        ...(!value.reranking_model.reranking_model_name
+          ? {
+            reranking_model: {
+              reranking_provider_name: isRerankDefaultModelValid ? rerankDefaultModel?.provider?.provider ?? '' : '',
+              reranking_model_name: isRerankDefaultModelValid ? rerankDefaultModel?.model ?? '' : '',
+            },
+            reranking_enable: !!isRerankDefaultModelValid,
+          }
+          : {
+            reranking_enable: true,
+          }),
+      })
+    }
+    if (retrieveMethod === RETRIEVE_METHOD.hybrid) {
+      onChange({
+        ...value,
+        search_method: retrieveMethod,
+        ...(!value.reranking_model.reranking_model_name
+          ? {
+            reranking_model: {
+              reranking_provider_name: isRerankDefaultModelValid ? rerankDefaultModel?.provider?.provider ?? '' : '',
+              reranking_model_name: isRerankDefaultModelValid ? rerankDefaultModel?.model ?? '' : '',
+            },
+            reranking_enable: !!isRerankDefaultModelValid,
+            reranking_mode: isRerankDefaultModelValid ? RerankingModeEnum.RerankingModel : RerankingModeEnum.WeightedScore,
+          }
+          : {
+            reranking_enable: true,
+            reranking_mode: RerankingModeEnum.RerankingModel,
+          }),
+        ...(!value.weights
+          ? {
+            weights: {
+              weight_type: WeightedScoreEnum.Customized,
+              vector_setting: {
+                vector_weight: DEFAULT_WEIGHTED_SCORE.other.semantic,
+                embedding_provider_name: '',
+                embedding_model_name: '',
+              },
+              keyword_setting: {
+                keyword_weight: DEFAULT_WEIGHTED_SCORE.other.keyword,
+              },
+            },
+          }
+          : {}),
+      })
+    }
+  }, [value, rerankDefaultModel, isRerankDefaultModelValid, onChange])
+
+  return (
+    <div className='space-y-2'>
+      {supportRetrievalMethods.includes(RETRIEVE_METHOD.semantic) && (
+        <OptionCard disabled={disabled} icon={<Image className='h-4 w-4' src={retrievalIcon.vector} alt='' />}
+          title={t('dataset.retrieval.semantic_search.title')}
+          description={t('dataset.retrieval.semantic_search.description')}
+          isActive={
+            value.search_method === RETRIEVE_METHOD.semantic
+          }
+          onSwitched={() => onSwitch(RETRIEVE_METHOD.semantic)}
+          effectImg={Effect.src}
+          activeHeaderClassName='bg-dataset-option-card-purple-gradient'
+        >
+          <RetrievalParamConfig
+            type={RETRIEVE_METHOD.semantic}
+            value={value}
+            onChange={onChange}
+          />
+        </OptionCard>
+      )}
+      {supportRetrievalMethods.includes(RETRIEVE_METHOD.fullText) && (
+        <OptionCard disabled={disabled} icon={<Image className='h-4 w-4' src={retrievalIcon.fullText} alt='' />}
+          title={t('dataset.retrieval.full_text_search.title')}
+          description={t('dataset.retrieval.full_text_search.description')}
+          isActive={
+            value.search_method === RETRIEVE_METHOD.fullText
+          }
+          onSwitched={() => onSwitch(RETRIEVE_METHOD.fullText)}
+          effectImg={Effect.src}
+          activeHeaderClassName='bg-dataset-option-card-purple-gradient'
+        >
+          <RetrievalParamConfig
+            type={RETRIEVE_METHOD.fullText}
+            value={value}
+            onChange={onChange}
+          />
+        </OptionCard>
+      )}
+      {supportRetrievalMethods.includes(RETRIEVE_METHOD.hybrid) && (
+        <OptionCard disabled={disabled} icon={<Image className='h-4 w-4' src={retrievalIcon.hybrid} alt='' />}
+          title={
+            <div className='flex items-center space-x-1'>
+              <div>{t('dataset.retrieval.hybrid_search.title')}</div>
+              <Badge text={t('dataset.retrieval.hybrid_search.recommend')!} className='ml-1 h-[18px] border-text-accent-secondary text-text-accent-secondary' uppercase />
+            </div>
+          }
+          description={t('dataset.retrieval.hybrid_search.description')} isActive={
+            value.search_method === RETRIEVE_METHOD.hybrid
+          }
+          onSwitched={() => onSwitch(RETRIEVE_METHOD.hybrid)}
+          effectImg={Effect.src}
+          activeHeaderClassName='bg-dataset-option-card-purple-gradient'
+        >
+          <RetrievalParamConfig
+            type={RETRIEVE_METHOD.hybrid}
+            value={value}
+            onChange={onChange}
+          />
+        </OptionCard>
+      )}
+    </div>
+  )
+}
+export default React.memo(RetrievalMethodConfig)
diff --git a/app/components/datasets/common/retrieval-method-info/index.tsx b/app/components/datasets/common/retrieval-method-info/index.tsx
new file mode 100644
index 0000000..066cfd9
--- /dev/null
+++ b/app/components/datasets/common/retrieval-method-info/index.tsx
@@ -0,0 +1,64 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import Image from 'next/image'
+import { retrievalIcon } from '../../create/icons'
+import type { RetrievalConfig } from '@/types/app'
+import { RETRIEVE_METHOD } from '@/types/app'
+import RadioCard from '@/app/components/base/radio-card'
+
+type Props = {
+  value: RetrievalConfig
+}
+
+export const getIcon = (type: RETRIEVE_METHOD) => {
+  return ({
+    [RETRIEVE_METHOD.semantic]: retrievalIcon.vector,
+    [RETRIEVE_METHOD.fullText]: retrievalIcon.fullText,
+    [RETRIEVE_METHOD.hybrid]: retrievalIcon.hybrid,
+    [RETRIEVE_METHOD.invertedIndex]: retrievalIcon.vector,
+    [RETRIEVE_METHOD.keywordSearch]: retrievalIcon.vector,
+  })[type] || retrievalIcon.vector
+}
+
+const EconomicalRetrievalMethodConfig: FC<Props> = ({
+  // type,
+  value,
+}) => {
+  const { t } = useTranslation()
+  const type = value.search_method
+  const icon = <Image className='size-3.5 text-util-colors-purple-purple-600' src={getIcon(type)} alt='' />
+  return (
+    <div className='space-y-2'>
+      <RadioCard
+        icon={icon}
+        title={t(`dataset.retrieval.${type}.title`)}
+        description={t(`dataset.retrieval.${type}.description`)}
+        noRadio
+        chosenConfigWrapClassName='!pb-3'
+        chosenConfig={
+          <div className='flex flex-wrap text-xs font-normal leading-[18px]'>
+            {value.reranking_model.reranking_model_name && (
+              <div className='mr-8 flex space-x-1'>
+                <div className='text-gray-500'>{t('common.modelProvider.rerankModel.key')}</div>
+                <div className='font-medium text-gray-800'>{value.reranking_model.reranking_model_name}</div>
+              </div>
+            )}
+
+            <div className='mr-8 flex space-x-1'>
+              <div className='text-gray-500'>{t('appDebug.datasetConfig.top_k')}</div>
+              <div className='font-medium text-gray-800'>{value.top_k}</div>
+            </div>
+
+            <div className='mr-8 flex space-x-1'>
+              <div className='text-gray-500'>{t('appDebug.datasetConfig.score_threshold')}</div>
+              <div className='font-medium text-gray-800'>{value.score_threshold}</div>
+            </div>
+          </div>
+        }
+      />
+    </div>
+  )
+}
+export default React.memo(EconomicalRetrievalMethodConfig)
diff --git a/app/components/datasets/common/retrieval-param-config/index.tsx b/app/components/datasets/common/retrieval-param-config/index.tsx
new file mode 100644
index 0000000..97e0a7f
--- /dev/null
+++ b/app/components/datasets/common/retrieval-param-config/index.tsx
@@ -0,0 +1,295 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+
+import Image from 'next/image'
+import ProgressIndicator from '../../create/assets/progress-indicator.svg'
+import Reranking from '../../create/assets/rerank.svg'
+import cn from '@/utils/classnames'
+import TopKItem from '@/app/components/base/param-item/top-k-item'
+import ScoreThresholdItem from '@/app/components/base/param-item/score-threshold-item'
+import { RETRIEVE_METHOD } from '@/types/app'
+import Switch from '@/app/components/base/switch'
+import Tooltip from '@/app/components/base/tooltip'
+import type { RetrievalConfig } from '@/types/app'
+import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
+import { useCurrentProviderAndModel, useModelListAndDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import {
+  DEFAULT_WEIGHTED_SCORE,
+  RerankingModeEnum,
+  WeightedScoreEnum,
+} from '@/models/datasets'
+import WeightedScore from '@/app/components/app/configuration/dataset-config/params-config/weighted-score'
+import Toast from '@/app/components/base/toast'
+import RadioCard from '@/app/components/base/radio-card'
+
+type Props = {
+  type: RETRIEVE_METHOD
+  value: RetrievalConfig
+  onChange: (value: RetrievalConfig) => void
+}
+
+const RetrievalParamConfig: FC<Props> = ({
+  type,
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const canToggleRerankModalEnable = type !== RETRIEVE_METHOD.hybrid
+  const isEconomical = type === RETRIEVE_METHOD.invertedIndex
+  const isHybridSearch = type === RETRIEVE_METHOD.hybrid
+  const {
+    modelList: rerankModelList,
+  } = useModelListAndDefaultModel(ModelTypeEnum.rerank)
+
+  const {
+    currentModel,
+  } = useCurrentProviderAndModel(
+    rerankModelList,
+    {
+      provider: value.reranking_model?.reranking_provider_name ?? '',
+      model: value.reranking_model?.reranking_model_name ?? '',
+    },
+  )
+
+  const handleDisabledSwitchClick = useCallback((enable: boolean) => {
+    if (enable && !currentModel)
+      Toast.notify({ type: 'error', message: t('workflow.errorMsg.rerankModelRequired') })
+    onChange({
+      ...value,
+      reranking_enable: enable,
+    })
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [currentModel, onChange, value])
+
+  const rerankModel = useMemo(() => {
+    return {
+      provider_name: value.reranking_model.reranking_provider_name,
+      model_name: value.reranking_model.reranking_model_name,
+    }
+  }, [value.reranking_model])
+
+  const handleChangeRerankMode = (v: RerankingModeEnum) => {
+    if (v === value.reranking_mode)
+      return
+
+    const result = {
+      ...value,
+      reranking_mode: v,
+    }
+
+    if (!result.weights && v === RerankingModeEnum.WeightedScore) {
+      result.weights = {
+        weight_type: WeightedScoreEnum.Customized,
+        vector_setting: {
+          vector_weight: DEFAULT_WEIGHTED_SCORE.other.semantic,
+          embedding_provider_name: '',
+          embedding_model_name: '',
+        },
+        keyword_setting: {
+          keyword_weight: DEFAULT_WEIGHTED_SCORE.other.keyword,
+        },
+      }
+    }
+    if (v === RerankingModeEnum.RerankingModel && !currentModel)
+      Toast.notify({ type: 'error', message: t('workflow.errorMsg.rerankModelRequired') })
+    onChange(result)
+  }
+
+  const rerankingModeOptions = [
+    {
+      value: RerankingModeEnum.WeightedScore,
+      label: t('dataset.weightedScore.title'),
+      tips: t('dataset.weightedScore.description'),
+    },
+    {
+      value: RerankingModeEnum.RerankingModel,
+      label: t('common.modelProvider.rerankModel.key'),
+      tips: t('common.modelProvider.rerankModel.tip'),
+    },
+  ]
+
+  return (
+    <div>
+      {!isEconomical && !isHybridSearch && (
+        <div>
+          <div className='mb-2 flex items-center space-x-2'>
+            {canToggleRerankModalEnable && (
+              <Switch
+                size='md'
+                defaultValue={value.reranking_enable}
+                onChange={handleDisabledSwitchClick}
+              />
+            )}
+            <div className='flex items-center'>
+              <span className='system-sm-semibold mr-0.5 text-text-secondary'>{t('common.modelProvider.rerankModel.key')}</span>
+              <Tooltip
+                popupContent={
+                  <div className="w-[200px]">{t('common.modelProvider.rerankModel.tip')}</div>
+                }
+              />
+            </div>
+          </div>
+          {
+            value.reranking_enable && (
+              <ModelSelector
+                defaultModel={rerankModel && { provider: rerankModel.provider_name, model: rerankModel.model_name }}
+                modelList={rerankModelList}
+                onSelect={(v) => {
+                  onChange({
+                    ...value,
+                    reranking_model: {
+                      reranking_provider_name: v.provider,
+                      reranking_model_name: v.model,
+                    },
+                  })
+                }}
+              />
+            )
+          }
+        </div>
+      )}
+      {
+        !isHybridSearch && (
+          <div className={cn(!isEconomical && 'mt-4', 'space-between flex space-x-4')}>
+            <TopKItem
+              className='grow'
+              value={value.top_k}
+              onChange={(_key, v) => {
+                onChange({
+                  ...value,
+                  top_k: v,
+                })
+              }}
+              enable={true}
+            />
+            {(!isEconomical && !(value.search_method === RETRIEVE_METHOD.fullText && !value.reranking_enable)) && (
+              <ScoreThresholdItem
+                className='grow'
+                value={value.score_threshold}
+                onChange={(_key, v) => {
+                  onChange({
+                    ...value,
+                    score_threshold: v,
+                  })
+                }}
+                enable={value.score_threshold_enabled}
+                hasSwitch={true}
+                onSwitchChange={(_key, v) => {
+                  onChange({
+                    ...value,
+                    score_threshold_enabled: v,
+                  })
+                }}
+              />
+            )}
+          </div>
+        )
+      }
+      {
+        isHybridSearch && (
+          <>
+            <div className='mb-4 flex gap-2'>
+              {
+                rerankingModeOptions.map(option => (
+                  <RadioCard
+                    key={option.value}
+                    isChosen={value.reranking_mode === option.value}
+                    onChosen={() => handleChangeRerankMode(option.value)}
+                    icon={<Image src={
+                      option.value === RerankingModeEnum.WeightedScore
+                        ? ProgressIndicator
+                        : Reranking
+                    } alt=''/>}
+                    title={option.label}
+                    description={option.tips}
+                    className='flex-1'
+                  />
+                ))
+              }
+            </div>
+            {
+              value.reranking_mode === RerankingModeEnum.WeightedScore && (
+                <WeightedScore
+                  value={{
+                    value: [
+                      value.weights!.vector_setting.vector_weight,
+                      value.weights!.keyword_setting.keyword_weight,
+                    ],
+                  }}
+                  onChange={(v) => {
+                    onChange({
+                      ...value,
+                      weights: {
+                        ...value.weights!,
+                        vector_setting: {
+                          ...value.weights!.vector_setting,
+                          vector_weight: v.value[0],
+                        },
+                        keyword_setting: {
+                          ...value.weights!.keyword_setting,
+                          keyword_weight: v.value[1],
+                        },
+                      },
+                    })
+                  }}
+                />
+              )
+            }
+            {
+              value.reranking_mode !== RerankingModeEnum.WeightedScore && (
+                <ModelSelector
+                  defaultModel={rerankModel && { provider: rerankModel.provider_name, model: rerankModel.model_name }}
+                  modelList={rerankModelList}
+                  onSelect={(v) => {
+                    onChange({
+                      ...value,
+                      reranking_model: {
+                        reranking_provider_name: v.provider,
+                        reranking_model_name: v.model,
+                      },
+                    })
+                  }}
+                />
+              )
+            }
+            <div className={cn(!isEconomical && 'mt-4', 'space-between flex space-x-6')}>
+              <TopKItem
+                className='grow'
+                value={value.top_k}
+                onChange={(_key, v) => {
+                  onChange({
+                    ...value,
+                    top_k: v,
+                  })
+                }}
+                enable={true}
+              />
+              <ScoreThresholdItem
+                className='grow'
+                value={value.score_threshold}
+                onChange={(_key, v) => {
+                  onChange({
+                    ...value,
+                    score_threshold: v,
+                  })
+                }}
+                enable={value.score_threshold_enabled}
+                hasSwitch={true}
+                onSwitchChange={(_key, v) => {
+                  onChange({
+                    ...value,
+                    score_threshold_enabled: v,
+                  })
+                }}
+              />
+            </div>
+          </>
+        )
+      }
+    </div>
+  )
+}
+export default React.memo(RetrievalParamConfig)
diff --git a/app/components/datasets/create/assets/Icon-3-dots.svg b/app/components/datasets/create/assets/Icon-3-dots.svg
new file mode 100644
index 0000000..0955e5d
--- /dev/null
+++ b/app/components/datasets/create/assets/Icon-3-dots.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5 6.5V5M8.93934 7.56066L10 6.5M10.0103 11.5H11.5103" stroke="#374151" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/create/assets/Loading.svg b/app/components/datasets/create/assets/Loading.svg
new file mode 100644
index 0000000..9bce91e
--- /dev/null
+++ b/app/components/datasets/create/assets/Loading.svg
@@ -0,0 +1,16 @@
+<svg width="464" height="180" viewBox="0 0 464 180" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="464" height="180" rx="12" fill="#F9FAFB"/>
+<rect y="6" width="464" height="8" rx="3" fill="#EAECF0"/>
+<rect y="26" width="464" height="8" rx="3" fill="#EAECF0"/>
+<rect y="46" width="464" height="8" rx="3" fill="#EAECF0"/>
+<rect y="66" width="464" height="8" rx="3" fill="#EAECF0"/>
+<rect y="86" width="464" height="8" rx="3" fill="#EAECF0"/>
+<rect y="106" width="256" height="8" rx="3" fill="#EAECF0"/>
+<path d="M0 60H464V168C464 174.627 458.627 180 452 180H12C5.3726 180 0 174.627 0 168V60Z" fill="url(#paint0_linear_2131_10881)"/>
+<defs>
+<linearGradient id="paint0_linear_2131_10881" x1="232" y1="60" x2="232" y2="180" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FCFCFD" stop-opacity="0"/>
+<stop offset="0.741486" stop-color="#FCFCFD"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/alert-triangle.svg b/app/components/datasets/create/assets/alert-triangle.svg
new file mode 100644
index 0000000..5ba0731
--- /dev/null
+++ b/app/components/datasets/create/assets/alert-triangle.svg
@@ -0,0 +1,3 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M6.40616 0.834307C6.14751 0.719294 5.85222 0.719294 5.59356 0.834307C5.3938 0.923133 5.26403 1.07959 5.17373 1.20708C5.08495 1.33242 4.9899 1.49664 4.88536 1.67723L0.751783 8.81705C0.646828 8.9983 0.551451 9.16302 0.486781 9.3028C0.421056 9.44487 0.349754 9.63584 0.372478 9.85381C0.401884 10.1359 0.549654 10.3922 0.779012 10.5589C0.956259 10.6878 1.15726 10.7218 1.31314 10.7361C1.46651 10.7501 1.65684 10.7501 1.86628 10.7501H10.1334C10.3429 10.7501 10.5332 10.7501 10.6866 10.7361C10.8425 10.7218 11.0435 10.6878 11.2207 10.5589C11.4501 10.3922 11.5978 10.1359 11.6272 9.85381C11.65 9.63584 11.5787 9.44487 11.5129 9.3028C11.4483 9.16303 11.3529 8.99833 11.248 8.81709L7.11436 1.67722C7.00983 1.49663 6.91477 1.33242 6.82599 1.20708C6.73569 1.07959 6.60593 0.923133 6.40616 0.834307ZM6.49988 4.50012C6.49988 4.22398 6.27602 4.00012 5.99988 4.00012C5.72374 4.00012 5.49988 4.22398 5.49988 4.50012V6.50012C5.49988 6.77626 5.72374 7.00012 5.99988 7.00012C6.27602 7.00012 6.49988 6.77626 6.49988 6.50012V4.50012ZM5.99988 8.00012C5.72374 8.00012 5.49988 8.22398 5.49988 8.50012C5.49988 8.77626 5.72374 9.00012 5.99988 9.00012H6.00488C6.28102 9.00012 6.50488 8.77626 6.50488 8.50012C6.50488 8.22398 6.28102 8.00012 6.00488 8.00012H5.99988Z" fill="#F79009"/>
+</svg>
diff --git a/app/components/datasets/create/assets/annotation-info.svg b/app/components/datasets/create/assets/annotation-info.svg
new file mode 100644
index 0000000..2ffbc24
--- /dev/null
+++ b/app/components/datasets/create/assets/annotation-info.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M16.2413 2H7.7587C6.95374 1.99999 6.28937 1.99998 5.74818 2.04419C5.18608 2.09012 4.66937 2.18868 4.18404 2.43598C3.43139 2.81947 2.81947 3.43139 2.43598 4.18404C2.18868 4.66937 2.09012 5.18608 2.04419 5.74818C1.99998 6.28937 1.99999 6.95372 2 7.75869V13.5343C1.99999 14.2041 1.99999 14.7569 2.03087 15.2095C2.06289 15.6788 2.13142 16.1129 2.30448 16.5307C2.71046 17.5108 3.48916 18.2895 4.46927 18.6955C4.88708 18.8686 5.32118 18.9371 5.79046 18.9691C6.24307 19 6.79594 19 7.46573 19H7.5C8.03656 19 8.14307 19.0063 8.22975 19.0268C8.38085 19.0624 8.52156 19.1328 8.64075 19.2322C8.70913 19.2893 8.77806 19.3708 9.1 19.8L10.5769 21.7692C10.6703 21.8938 10.7758 22.0346 10.8774 22.1476C10.9894 22.2721 11.1756 22.4555 11.4563 22.5647C11.806 22.7007 12.194 22.7007 12.5437 22.5647C12.8244 22.4555 13.0106 22.2721 13.1226 22.1476C13.2242 22.0346 13.3297 21.8938 13.4231 21.7692L14.9 19.8C15.2219 19.3708 15.2909 19.2893 15.3593 19.2322C15.4784 19.1328 15.6192 19.0624 15.7702 19.0268C15.8569 19.0063 15.9634 19 16.5 19H16.5343C17.2041 19 17.7569 19 18.2095 18.9691C18.6788 18.9371 19.1129 18.8686 19.5307 18.6955C20.5108 18.2895 21.2895 17.5108 21.6955 16.5307C21.8686 16.1129 21.9371 15.6788 21.9691 15.2095C22 14.7569 22 14.2041 22 13.5343V7.75868C22 6.95372 22 6.28937 21.9558 5.74818C21.9099 5.18608 21.8113 4.66937 21.564 4.18404C21.1805 3.43139 20.5686 2.81947 19.816 2.43598C19.3306 2.18868 18.8139 2.09012 18.2518 2.04419C17.7106 1.99998 17.0463 1.99999 16.2413 2ZM12 6C11.4477 6 11 6.44772 11 7C11 7.55229 11.4477 8 12 8H12.01C12.5623 8 13.01 7.55229 13.01 7C13.01 6.44772 12.5623 6 12.01 6H12ZM13 10.5C13 9.94772 12.5523 9.5 12 9.5C11.4477 9.5 11 9.94772 11 10.5V14C11 14.5523 11.4477 15 12 15C12.5523 15 13 14.5523 13 14V10.5Z" fill="#155EEF"/>
+</svg>
diff --git a/app/components/datasets/create/assets/arrow-narrow-left.svg b/app/components/datasets/create/assets/arrow-narrow-left.svg
new file mode 100644
index 0000000..5c37df2
--- /dev/null
+++ b/app/components/datasets/create/assets/arrow-narrow-left.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M13.3332 8H2.6665M2.6665 8L6.6665 12M2.6665 8L6.6665 4" stroke="#155EEF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/create/assets/book-open-01.svg b/app/components/datasets/create/assets/book-open-01.svg
new file mode 100644
index 0000000..2f43afc
--- /dev/null
+++ b/app/components/datasets/create/assets/book-open-01.svg
@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.12" d="M1.33337 4.13333C1.33337 3.3866 1.33337 3.01323 1.4787 2.72801C1.60653 2.47713 1.8105 2.27316 2.06139 2.14532C2.3466 2 2.71997 2 3.46671 2H3.73337C5.22685 2 5.97358 2 6.54401 2.29065C7.04578 2.54631 7.45373 2.95426 7.70939 3.45603C8.00004 4.02646 8.00004 4.77319 8.00004 6.26667V14L7.93334 13.8999C7.47024 13.2053 7.2387 12.858 6.93277 12.6065C6.66195 12.3839 6.34988 12.2169 6.01444 12.1151C5.63554 12 5.21811 12 4.38326 12H3.46671C2.71997 12 2.3466 12 2.06139 11.8547C1.8105 11.7268 1.60653 11.5229 1.4787 11.272C1.33337 10.9868 1.33337 10.6134 1.33337 9.86667V4.13333Z" fill="#155EEF"/>
+<path d="M8.00004 14L7.93334 13.8999C7.47024 13.2053 7.2387 12.858 6.93278 12.6065C6.66195 12.3839 6.34988 12.2169 6.01444 12.1151C5.63554 12 5.21811 12 4.38326 12H3.46671C2.71997 12 2.3466 12 2.06139 11.8547C1.8105 11.7268 1.60653 11.5229 1.4787 11.272C1.33337 10.9868 1.33337 10.6134 1.33337 9.86667V4.13333C1.33337 3.3866 1.33337 3.01323 1.4787 2.72801C1.60653 2.47713 1.8105 2.27316 2.06139 2.14532C2.3466 2 2.71997 2 3.46671 2H3.73337C5.22685 2 5.97358 2 6.54402 2.29065C7.04578 2.54631 7.45373 2.95426 7.70939 3.45603C8.00004 4.02646 8.00004 4.77319 8.00004 6.26667M8.00004 14V6.26667M8.00004 14L8.06674 13.8999C8.52984 13.2053 8.76139 12.858 9.06731 12.6065C9.33814 12.3839 9.6502 12.2169 9.98564 12.1151C10.3645 12 10.782 12 11.6168 12H12.5334C13.2801 12 13.6535 12 13.9387 11.8547C14.1896 11.7268 14.3936 11.5229 14.5214 11.272C14.6667 10.9868 14.6667 10.6134 14.6667 9.86667V4.13333C14.6667 3.3866 14.6667 3.01323 14.5214 2.72801C14.3936 2.47713 14.1896 2.27316 13.9387 2.14532C13.6535 2 13.2801 2 12.5334 2H12.2667C10.7732 2 10.0265 2 9.45607 2.29065C8.9543 2.54631 8.54635 2.95426 8.29069 3.45603C8.00004 4.02646 8.00004 4.77319 8.00004 6.26667" stroke="#155EEF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/create/assets/check.svg b/app/components/datasets/create/assets/check.svg
new file mode 100644
index 0000000..ae91c47
--- /dev/null
+++ b/app/components/datasets/create/assets/check.svg
@@ -0,0 +1,3 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10 3L4.5 8.5L2 6" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/create/assets/close.svg b/app/components/datasets/create/assets/close.svg
new file mode 100644
index 0000000..7a8ef6b
--- /dev/null
+++ b/app/components/datasets/create/assets/close.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M12 4L4 12M4 4L12 12" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/create/assets/csv.svg b/app/components/datasets/create/assets/csv.svg
new file mode 100644
index 0000000..82a5efa
--- /dev/null
+++ b/app/components/datasets/create/assets/csv.svg
@@ -0,0 +1,22 @@
+<svg width="24" height="26" viewBox="0 0 24 26" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_5938_919)">
+<path d="M3 5.8C3 4.11984 3 3.27976 3.32698 2.63803C3.6146 2.07354 4.07354 1.6146 4.63803 1.32698C5.27976 1 6.11984 1 7.8 1H14L21 8V18.2C21 19.8802 21 20.7202 20.673 21.362C20.3854 21.9265 19.9265 22.3854 19.362 22.673C18.7202 23 17.8802 23 16.2 23H7.8C6.11984 23 5.27976 23 4.63803 22.673C4.07354 22.3854 3.6146 21.9265 3.32698 21.362C3 20.7202 3 19.8802 3 18.2V5.8Z" fill="#169951"/>
+</g>
+<g opacity="0.96">
+<path d="M9.81332 16.4181C9.63132 17.5171 8.86832 18.0421 7.92332 18.0421C7.34232 18.0421 6.90132 17.8461 6.53732 17.4821C6.01232 16.9571 6.03332 16.2571 6.03332 15.5081C6.03332 14.7591 6.01232 14.0591 6.53732 13.5341C6.90132 13.1701 7.34232 12.9741 7.92332 12.9741C8.86832 12.9741 9.63132 13.4991 9.81332 14.5981H8.56732C8.49032 14.3181 8.33632 14.0661 7.93032 14.0661C7.70632 14.0661 7.53832 14.1571 7.44732 14.2761C7.33532 14.4231 7.25832 14.5981 7.25832 15.5081C7.25832 16.4181 7.33532 16.5931 7.44732 16.7401C7.53832 16.8591 7.70632 16.9501 7.93032 16.9501C8.33632 16.9501 8.49032 16.6981 8.56732 16.4181H9.81332Z" fill="white"/>
+<path d="M13.8059 16.4741C13.8059 17.4891 12.9309 18.0421 11.8809 18.0421C11.1179 18.0421 10.4949 17.9021 9.99094 17.3841L10.7749 16.6001C11.0339 16.8591 11.4889 16.9501 11.8879 16.9501C12.3709 16.9501 12.6019 16.7891 12.6019 16.5021C12.6019 16.3831 12.5739 16.2851 12.5039 16.2081C12.4409 16.1451 12.3359 16.0961 12.1749 16.0751L11.5729 15.9911C11.1319 15.9281 10.7959 15.7811 10.5719 15.5501C10.3409 15.3121 10.2289 14.9761 10.2289 14.5491C10.2289 13.6391 10.9149 12.9741 12.0489 12.9741C12.7629 12.9741 13.3019 13.1421 13.7289 13.5691L12.9589 14.3391C12.6439 14.0241 12.2309 14.0451 12.0139 14.0451C11.5869 14.0451 11.4119 14.2901 11.4119 14.5071C11.4119 14.5701 11.4329 14.6611 11.5099 14.7381C11.5729 14.8011 11.6779 14.8641 11.8529 14.8851L12.4549 14.9691C12.9029 15.0321 13.2249 15.1721 13.4349 15.3821C13.7009 15.6411 13.8059 16.0121 13.8059 16.4741Z" fill="white"/>
+<path d="M18.3124 13.0161L16.6604 18.0001H15.7504L14.1054 13.0161H15.3724L16.2124 15.8021L17.0384 13.0161H18.3124Z" fill="white"/>
+</g>
+<path opacity="0.5" d="M14 1L21 8H16C14.8954 8 14 7.10457 14 6V1Z" fill="white"/>
+<defs>
+<filter id="filter0_d_5938_919" x="1" y="0" width="22" height="26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5938_919"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5938_919" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/doc.svg b/app/components/datasets/create/assets/doc.svg
new file mode 100644
index 0000000..9a8aef5
--- /dev/null
+++ b/app/components/datasets/create/assets/doc.svg
@@ -0,0 +1,22 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_17194_49206)">
+<path d="M4 7.73301C4 5.4928 4 4.37269 4.43597 3.51705C4.81947 2.7644 5.43139 2.15248 6.18404 1.76898C7.03969 1.33301 8.15979 1.33301 10.4 1.33301H18.6667L28 10.6663V24.2663C28 26.5066 28 27.6267 27.564 28.4823C27.1805 29.2349 26.5686 29.8469 25.816 30.2304C24.9603 30.6663 23.8402 30.6663 21.6 30.6663H10.4C8.15979 30.6663 7.03969 30.6663 6.18404 30.2304C5.43139 29.8469 4.81947 29.2349 4.43597 28.4823C4 27.6267 4 26.5066 4 24.2663V7.73301Z" fill="#2349A9"/>
+</g>
+<path opacity="0.5" d="M18.6665 1.33301L27.9998 10.6663H21.3332C19.8604 10.6663 18.6665 9.47243 18.6665 7.99967V1.33301Z" fill="white"/>
+<g opacity="0.96">
+<path d="M13.6329 21.4112C13.6329 22.2603 13.7059 22.9501 13.0326 23.5793C12.6351 23.9508 12.0754 24.11 11.4751 24.11H9.3335V18.7125H11.4751C12.0754 18.7125 12.6351 18.8717 13.0326 19.2431C13.7059 19.8723 13.6329 20.5622 13.6329 21.4112ZM12.2133 21.4112C12.2133 20.5015 12.1727 20.3499 12.0591 20.1983C11.9293 20.0164 11.7347 19.8951 11.3777 19.8951H10.7531V22.9274H11.3777C11.7347 22.9274 11.9293 22.8061 12.0591 22.6242C12.1727 22.4725 12.2133 22.3285 12.2133 21.4112Z" fill="white"/>
+<path d="M18.8275 21.4112C18.8275 22.2224 18.8519 22.9805 18.2435 23.549C17.8217 23.9432 17.3349 24.1555 16.6292 24.1555C15.9234 24.1555 15.4367 23.9432 15.0149 23.549C14.4065 22.9805 14.4308 22.2224 14.4308 21.4112C14.4308 20.6001 14.4065 19.842 15.0149 19.2735C15.4367 18.8793 15.9234 18.667 16.6292 18.667C17.3349 18.667 17.8217 18.8793 18.2435 19.2735C18.8519 19.842 18.8275 20.6001 18.8275 21.4112ZM17.4079 21.4112C17.4079 20.4257 17.3268 20.2438 17.197 20.0846C17.0916 19.9557 16.8888 19.8496 16.6292 19.8496C16.3696 19.8496 16.1668 19.9557 16.0613 20.0846C15.9316 20.2438 15.8504 20.4257 15.8504 21.4112C15.8504 22.3967 15.9316 22.5711 16.0613 22.7303C16.1668 22.8592 16.3696 22.9729 16.6292 22.9729C16.8888 22.9729 17.0916 22.8592 17.197 22.7303C17.3268 22.5711 17.4079 22.3967 17.4079 21.4112Z" fill="white"/>
+<path d="M24.0002 22.3967C23.7893 23.5869 22.905 24.1555 21.8099 24.1555C21.1366 24.1555 20.6256 23.9432 20.2037 23.549C19.5953 22.9805 19.6197 22.2224 19.6197 21.4112C19.6197 20.6001 19.5953 19.842 20.2037 19.2735C20.6256 18.8793 21.1366 18.667 21.8099 18.667C22.905 18.667 23.7893 19.2356 24.0002 20.4257H22.5562C22.467 20.1225 22.2885 19.8496 21.818 19.8496C21.5584 19.8496 21.3638 19.9481 21.2583 20.077C21.1285 20.2362 21.0393 20.4257 21.0393 21.4112C21.0393 22.3967 21.1285 22.5863 21.2583 22.7455C21.3638 22.8743 21.5584 22.9729 21.818 22.9729C22.2885 22.9729 22.467 22.7 22.5562 22.3967H24.0002Z" fill="white"/>
+</g>
+<defs>
+<filter id="filter0_d_17194_49206" x="2" y="0.333008" width="28" height="33.333" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_17194_49206"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_17194_49206" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/docx.svg b/app/components/datasets/create/assets/docx.svg
new file mode 100644
index 0000000..5f8fa51
--- /dev/null
+++ b/app/components/datasets/create/assets/docx.svg
@@ -0,0 +1,23 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_10291_62253)">
+<path d="M4 7.73301C4 5.4928 4 4.37269 4.43597 3.51705C4.81947 2.7644 5.43139 2.15248 6.18404 1.76898C7.03969 1.33301 8.15979 1.33301 10.4 1.33301H18.6667L28 10.6663V24.2663C28 26.5065 28 27.6267 27.564 28.4823C27.1805 29.2349 26.5686 29.8469 25.816 30.2304C24.9603 30.6663 23.8402 30.6663 21.6 30.6663H10.4C8.15979 30.6663 7.03969 30.6663 6.18404 30.2304C5.43139 29.8469 4.81947 29.2349 4.43597 28.4823C4 27.6267 4 26.5065 4 24.2663V7.73301Z" fill="#2349A9"/>
+</g>
+<path opacity="0.5" d="M18.6665 1.33301L27.9998 10.6663H21.3332C19.8604 10.6663 18.6665 9.47243 18.6665 7.99967V1.33301Z" fill="white"/>
+<g opacity="0.96">
+<path d="M10.8443 21.3337C10.8443 22.1587 10.9153 22.8291 10.261 23.4405C9.87477 23.8014 9.33086 23.9561 8.74754 23.9561H6.6665V18.7112H8.74754C9.33086 18.7112 9.87477 18.8659 10.261 19.2268C10.9153 19.8383 10.8443 20.5086 10.8443 21.3337ZM9.46487 21.3337C9.46487 20.4497 9.42545 20.3024 9.31509 20.155C9.18897 19.9782 8.99979 19.8604 8.65295 19.8604H8.04598V22.807H8.65295C8.99979 22.807 9.18897 22.6891 9.31509 22.5123C9.42545 22.365 9.46487 22.225 9.46487 21.3337Z" fill="white"/>
+<path d="M15.8922 21.3337C15.8922 22.1219 15.9158 22.8585 15.3246 23.411C14.9147 23.7941 14.4418 24.0003 13.756 24.0003C13.0702 24.0003 12.5972 23.7941 12.1873 23.411C11.5961 22.8585 11.6197 22.1219 11.6197 21.3337C11.6197 20.5454 11.5961 19.8088 12.1873 19.2563C12.5972 18.8733 13.0702 18.667 13.756 18.667C14.4418 18.667 14.9147 18.8733 15.3246 19.2563C15.9158 19.8088 15.8922 20.5454 15.8922 21.3337ZM14.5127 21.3337C14.5127 20.376 14.4339 20.1992 14.3077 20.0445C14.2053 19.9193 14.0082 19.8162 13.756 19.8162C13.5037 19.8162 13.3066 19.9193 13.2042 20.0445C13.078 20.1992 12.9992 20.376 12.9992 21.3337C12.9992 22.2913 13.078 22.4607 13.2042 22.6154C13.3066 22.7407 13.5037 22.8512 13.756 22.8512C14.0082 22.8512 14.2053 22.7407 14.3077 22.6154C14.4339 22.4607 14.5127 22.2913 14.5127 21.3337Z" fill="white"/>
+<path d="M20.9186 22.2913C20.7136 23.4478 19.8544 24.0003 18.7902 24.0003C18.136 24.0003 17.6394 23.7941 17.2295 23.411C16.6383 22.8585 16.6619 22.1219 16.6619 21.3337C16.6619 20.5454 16.6383 19.8088 17.2295 19.2563C17.6394 18.8733 18.136 18.667 18.7902 18.667C19.8544 18.667 20.7136 19.2195 20.9186 20.376H19.5154C19.4287 20.0814 19.2553 19.8162 18.7981 19.8162C18.5459 19.8162 18.3567 19.9119 18.2542 20.0372C18.1281 20.1919 18.0414 20.376 18.0414 21.3337C18.0414 22.2913 18.1281 22.4755 18.2542 22.6302C18.3567 22.7554 18.5459 22.8512 18.7981 22.8512C19.2553 22.8512 19.4287 22.586 19.5154 22.2913H20.9186Z" fill="white"/>
+<path d="M25.9998 23.9561H24.4233L23.501 22.3429L22.5787 23.9561H21.0022L22.7522 21.2674L21.1126 18.7112H22.6812L23.501 20.1919L24.3208 18.7112H25.8895L24.2499 21.2674L25.9998 23.9561Z" fill="white"/>
+</g>
+<defs>
+<filter id="filter0_d_10291_62253" x="2" y="0.333008" width="28" height="33.333" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_10291_62253"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_10291_62253" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/family-mod.svg b/app/components/datasets/create/assets/family-mod.svg
new file mode 100644
index 0000000..b1c4e6f
--- /dev/null
+++ b/app/components/datasets/create/assets/family-mod.svg
@@ -0,0 +1,6 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M6.18055 6.45828C7.52291 6.45828 8.61111 5.37008 8.61111 4.02772C8.61111 2.68536 7.52291 1.59717 6.18055 1.59717C4.8382 1.59717 3.75 2.68536 3.75 4.02772C3.75 5.37008 4.8382 6.45828 6.18055 6.45828Z" fill="#EF6820"/>
+    <path d="M13.8192 6.45828C15.1616 6.45828 16.2498 5.37008 16.2498 4.02772C16.2498 2.68536 15.1616 1.59717 13.8192 1.59717C12.4769 1.59717 11.3887 2.68536 11.3887 4.02772C11.3887 5.37008 12.4769 6.45828 13.8192 6.45828Z" fill="#EF6820"/>
+    <path d="M13.8193 7.84719C13.0627 7.84805 12.3185 8.03933 11.6552 8.40341C10.992 8.7675 10.4311 9.29267 10.0241 9.93053C10.5745 9.93695 11.1 10.1609 11.4858 10.5535C11.8716 10.9461 12.0864 11.4755 12.0831 12.0259C12.0799 12.5763 11.859 13.1031 11.4687 13.4911C11.0783 13.8792 10.5503 14.097 9.99984 14.097C9.44942 14.097 8.92135 13.8792 8.53101 13.4911C8.14066 13.1031 7.91976 12.5763 7.91655 12.0259C7.91334 11.4755 8.12808 10.9461 8.51387 10.5535C8.89966 10.1609 9.42515 9.93695 9.97554 9.93053C9.45127 9.10686 8.67371 8.47572 7.75983 8.13205C6.84596 7.78839 5.84519 7.75078 4.9081 8.0249C3.97101 8.29902 3.14828 8.87003 2.56368 9.65203C1.97908 10.434 1.66424 11.3847 1.66652 12.3611V16.875C1.66652 17.0591 1.73968 17.2358 1.86991 17.366C2.00015 17.4962 2.17678 17.5694 2.36096 17.5694H7.22207V15.8333L4.72207 13.9583C4.64911 13.9036 4.58765 13.835 4.54118 13.7566C4.49472 13.6781 4.46417 13.5912 4.45127 13.501C4.42522 13.3186 4.47267 13.1334 4.58318 12.9861C4.69369 12.8387 4.8582 12.7413 5.04053 12.7153C5.22285 12.6892 5.40806 12.7367 5.5554 12.8472L8.14776 14.7916H11.8519L14.4443 12.8472C14.5916 12.7367 14.7768 12.6892 14.9592 12.7153C15.1415 12.7413 15.306 12.8387 15.4165 12.9861C15.527 13.1334 15.5745 13.3186 15.5484 13.501C15.5224 13.6833 15.425 13.8478 15.2776 13.9583L12.7776 15.8333V17.5694H17.6387C17.8229 17.5694 17.9995 17.4962 18.1298 17.366C18.26 17.2358 18.3332 17.0591 18.3332 16.875V12.3611C18.3317 11.1644 17.8557 10.0171 17.0095 9.17091C16.1633 8.32471 15.016 7.84867 13.8193 7.84719Z" fill="#EF6820"/>
+    </svg>
+    
\ No newline at end of file
diff --git a/app/components/datasets/create/assets/file-list-3-fill.svg b/app/components/datasets/create/assets/file-list-3-fill.svg
new file mode 100644
index 0000000..a4e6c4d
--- /dev/null
+++ b/app/components/datasets/create/assets/file-list-3-fill.svg
@@ -0,0 +1,5 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="file-list-3-fill">
+<path id="Vector" d="M15.8332 18.3333H4.1665C2.7858 18.3333 1.6665 17.2141 1.6665 15.8333V2.50001C1.6665 2.03977 2.0396 1.66667 2.49984 1.66667H14.1665C14.6268 1.66667 14.9998 2.03977 14.9998 2.50001V12.5H18.3332V15.8333C18.3332 17.2141 17.2139 18.3333 15.8332 18.3333ZM14.9998 14.1667V15.8333C14.9998 16.2936 15.3729 16.6667 15.8332 16.6667C16.2934 16.6667 16.6665 16.2936 16.6665 15.8333V14.1667H14.9998ZM4.99984 5.83334V7.50001H11.6665V5.83334H4.99984ZM4.99984 9.16667V10.8333H11.6665V9.16667H4.99984ZM4.99984 12.5V14.1667H9.1665V12.5H4.99984Z" fill="#1570EF"/>
+</g>
+</svg>
diff --git a/app/components/datasets/create/assets/file.svg b/app/components/datasets/create/assets/file.svg
new file mode 100644
index 0000000..137086a
--- /dev/null
+++ b/app/components/datasets/create/assets/file.svg
@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.66667 1.34356C8.66667 1.32602 8.66667 1.31725 8.66591 1.30135C8.65018 0.972168 8.3607 0.682824 8.03151 0.667251C8.01562 0.666499 8.0104 0.666501 8.00001 0.666504H5.8391C5.30248 0.666497 4.85957 0.666491 4.49878 0.695968C4.12405 0.726585 3.77958 0.792295 3.45603 0.957155C2.95426 1.21282 2.54631 1.62077 2.29065 2.12253C2.12579 2.44609 2.06008 2.79056 2.02946 3.16529C1.99999 3.52608 1.99999 3.96899 2 4.50562V11.494C1.99999 12.0307 1.99999 12.4736 2.02946 12.8344C2.06008 13.2091 2.12579 13.5536 2.29065 13.8771C2.54631 14.3789 2.95426 14.7869 3.45603 15.0425C3.77958 15.2074 4.12405 15.2731 4.49878 15.3037C4.85958 15.3332 5.30248 15.3332 5.83912 15.3332H10.1609C10.6975 15.3332 11.1404 15.3332 11.5012 15.3037C11.8759 15.2731 12.2204 15.2074 12.544 15.0425C13.0457 14.7869 13.4537 14.3789 13.7093 13.8771C13.8742 13.5536 13.9399 13.2091 13.9705 12.8344C14 12.4736 14 12.0307 14 11.4941V6.66646C14 6.65611 14 6.65093 13.9993 6.63505C13.9837 6.30583 13.6943 6.01631 13.3651 6.0006C13.3492 5.99985 13.3405 5.99985 13.323 5.99985L10.3787 5.99985C10.2105 5.99987 10.0466 5.99989 9.90785 5.98855C9.75545 5.9761 9.57563 5.94672 9.39468 5.85452C9.1438 5.72669 8.93983 5.52272 8.81199 5.27183C8.7198 5.09088 8.69042 4.91106 8.67797 4.75867C8.66663 4.61989 8.66665 4.45603 8.66667 4.28778L8.66667 1.34356ZM5.33333 8.6665C4.96514 8.6665 4.66667 8.96498 4.66667 9.33317C4.66667 9.70136 4.96514 9.99984 5.33333 9.99984H10.6667C11.0349 9.99984 11.3333 9.70136 11.3333 9.33317C11.3333 8.96498 11.0349 8.6665 10.6667 8.6665H5.33333ZM5.33333 11.3332C4.96514 11.3332 4.66667 11.6316 4.66667 11.9998C4.66667 12.368 4.96514 12.6665 5.33333 12.6665H9.33333C9.70152 12.6665 10 12.368 10 11.9998C10 11.6316 9.70152 11.3332 9.33333 11.3332H5.33333Z" fill="#444CE7"/>
+<path d="M12.6053 4.6665C12.8011 4.6665 12.8989 4.6665 12.9791 4.61735C13.0923 4.54794 13.16 4.3844 13.129 4.25526C13.107 4.16382 13.0432 4.10006 12.9155 3.97253L10.694 1.75098C10.5664 1.62333 10.5027 1.5595 10.4112 1.53752C10.2821 1.50648 10.1186 1.57417 10.0492 1.6874C10 1.76757 10 1.86545 10 2.0612L10 4.13315C10 4.31982 10 4.41316 10.0363 4.48446C10.0683 4.54718 10.1193 4.59818 10.182 4.63014C10.2533 4.66647 10.3466 4.66647 10.5333 4.66647L12.6053 4.6665Z" fill="#444CE7"/>
+</svg>
diff --git a/app/components/datasets/create/assets/folder-plus.svg b/app/components/datasets/create/assets/folder-plus.svg
new file mode 100644
index 0000000..c63a58b
--- /dev/null
+++ b/app/components/datasets/create/assets/folder-plus.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8.66683 4.66667L7.92314 3.17928C7.7091 2.7512 7.60207 2.53715 7.44241 2.38078C7.30122 2.24249 7.13105 2.13732 6.94421 2.07287C6.73294 2 6.49363 2 6.01502 2H3.46683C2.72009 2 2.34672 2 2.06151 2.14532C1.81063 2.27316 1.60665 2.47713 1.47882 2.72801C1.3335 3.01323 1.3335 3.3866 1.3335 4.13333V4.66667M1.3335 4.66667H11.4668C12.5869 4.66667 13.147 4.66667 13.5748 4.88465C13.9511 5.0764 14.2571 5.38236 14.4488 5.75869C14.6668 6.18651 14.6668 6.74656 14.6668 7.86667V10.8C14.6668 11.9201 14.6668 12.4802 14.4488 12.908C14.2571 13.2843 13.9511 13.5903 13.5748 13.782C13.147 14 12.5869 14 11.4668 14H4.5335C3.41339 14 2.85334 14 2.42552 13.782C2.04919 13.5903 1.74323 13.2843 1.55148 12.908C1.3335 12.4802 1.3335 11.9201 1.3335 10.8V4.66667ZM8.00016 11.3333V7.33333M6.00016 9.33333H10.0002" stroke="#155EEF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/create/assets/gold.svg b/app/components/datasets/create/assets/gold.svg
new file mode 100644
index 0000000..b48ac0e
--- /dev/null
+++ b/app/components/datasets/create/assets/gold.svg
@@ -0,0 +1,4 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M9.99984 1.66663C8.35166 1.66663 6.7405 2.15537 5.37009 3.07105C3.99968 3.98672 2.93157 5.28821 2.30084 6.81093C1.67011 8.33365 1.50509 10.0092 1.82663 11.6257C2.14817 13.2422 2.94185 14.7271 4.10728 15.8925C5.27272 17.058 6.75758 17.8516 8.37409 18.1732C9.9906 18.4947 11.6662 18.3297 13.1889 17.699C14.7116 17.0682 16.0131 16.0001 16.9288 14.6297C17.8444 13.2593 18.3332 11.6481 18.3332 9.99996C18.3332 7.78982 17.4552 5.67021 15.8924 4.1074C14.3296 2.5446 12.21 1.66663 9.99984 1.66663ZM12.295 5.65899L13.1116 4.53538C13.1653 4.46155 13.2329 4.39901 13.3107 4.35133C13.3885 4.30365 13.4749 4.27175 13.565 4.25747C13.6551 4.24319 13.7472 4.24679 13.8359 4.26809C13.9246 4.28938 14.0083 4.32793 14.0821 4.38156C14.156 4.43518 14.2185 4.50282 14.2662 4.58061C14.3139 4.6584 14.3458 4.74482 14.36 4.83494C14.3743 4.92506 14.3707 5.01711 14.3494 5.10583C14.3281 5.19456 14.2896 5.27822 14.236 5.35204L13.4193 6.47565C13.311 6.62474 13.1479 6.72471 12.9659 6.75356C12.7839 6.7824 12.5979 6.73777 12.4488 6.62947C12.2997 6.52118 12.1997 6.35809 12.1709 6.17609C12.142 5.99408 12.1867 5.80808 12.295 5.65899ZM5.9179 4.3819C5.99174 4.32795 6.07551 4.28911 6.1644 4.26761C6.25329 4.24612 6.34556 4.2424 6.43589 4.25666C6.52623 4.27092 6.61286 4.30288 6.69081 4.35071C6.76875 4.39854 6.83649 4.4613 6.89012 4.53538L7.70817 5.65899C7.81647 5.80854 7.86092 5.99499 7.83175 6.17731C7.80258 6.35964 7.70217 6.52291 7.55262 6.63121C7.40307 6.73951 7.21662 6.78396 7.03429 6.75478C6.85196 6.72561 6.68869 6.62521 6.5804 6.47565L5.76373 5.35204C5.71013 5.27823 5.6716 5.19457 5.65034 5.10586C5.62908 5.01715 5.62551 4.92512 5.63983 4.83503C5.65414 4.74494 5.68607 4.65855 5.73378 4.5808C5.78149 4.50306 5.84406 4.43547 5.9179 4.3819ZM5.59151 12.1597L4.27206 12.5888C4.18433 12.6215 4.0909 12.6361 3.99739 12.6317C3.90388 12.6273 3.81222 12.6041 3.72791 12.5634C3.64361 12.5227 3.56841 12.4654 3.50682 12.3949C3.44524 12.3244 3.39854 12.2421 3.36954 12.1531C3.34055 12.0641 3.32984 11.9702 3.33808 11.8769C3.34631 11.7837 3.37332 11.693 3.41747 11.6105C3.46162 11.528 3.522 11.4552 3.59499 11.3966C3.66798 11.3379 3.75207 11.2947 3.8422 11.2694L5.16165 10.8402C5.24947 10.8072 5.34308 10.7924 5.43681 10.7965C5.53054 10.8007 5.62245 10.8238 5.707 10.8645C5.79154 10.9052 5.86697 10.9626 5.92872 11.0332C5.99047 11.1039 6.03727 11.1863 6.06629 11.2755C6.09531 11.3647 6.10595 11.4589 6.09757 11.5524C6.08919 11.6458 6.06195 11.7366 6.01752 11.8192C5.97308 11.9018 5.91236 11.9746 5.83902 12.0331C5.76568 12.0916 5.68194 12.1347 5.59151 12.1597ZM10.6943 16.25C10.6943 16.4341 10.6211 16.6108 10.4909 16.741C10.3607 16.8712 10.184 16.9444 9.99984 16.9444C9.81566 16.9444 9.63903 16.8712 9.50879 16.741C9.37856 16.6108 9.3054 16.4341 9.3054 16.25V14.8611C9.3054 14.6769 9.37856 14.5003 9.50879 14.37C9.63903 14.2398 9.81566 14.1666 9.99984 14.1666C10.184 14.1666 10.3607 14.2398 10.4909 14.37C10.6211 14.5003 10.6943 14.6769 10.6943 14.8611V16.25ZM9.99984 12.2222L7.38595 13.5972L7.88526 10.6868L5.77067 8.62565L8.6929 8.20135L9.99984 5.55551L11.3068 8.20135L14.229 8.62565L12.1144 10.6868L12.6137 13.5972L9.99984 12.2222ZM15.729 12.5902L14.4096 12.1611C14.3191 12.1361 14.2347 12.093 14.1614 12.0345C14.088 11.976 14.0273 11.9032 13.9829 11.8206C13.9384 11.738 13.9112 11.6472 13.9028 11.5537C13.8944 11.4603 13.9051 11.3661 13.9341 11.2769C13.9631 11.1877 14.0099 11.1053 14.0717 11.0346C14.1334 10.964 14.2088 10.9066 14.2934 10.8659C14.3779 10.8252 14.4698 10.8021 14.5636 10.7979C14.6573 10.7938 14.7509 10.8086 14.8387 10.8416L16.1582 11.2708C16.2483 11.2961 16.3324 11.3393 16.4054 11.398C16.4784 11.4566 16.5388 11.5293 16.5829 11.6119C16.6271 11.6944 16.6541 11.7851 16.6623 11.8783C16.6705 11.9716 16.6598 12.0655 16.6308 12.1545C16.6018 12.2435 16.5551 12.3258 16.4936 12.3963C16.432 12.4668 16.3568 12.5241 16.2725 12.5648C16.1882 12.6055 16.0965 12.6287 16.003 12.6331C15.9095 12.6375 15.8167 12.6229 15.729 12.5902Z" fill="#EF6820"/>
+    </svg>
+    
\ No newline at end of file
diff --git a/app/components/datasets/create/assets/html.svg b/app/components/datasets/create/assets/html.svg
new file mode 100644
index 0000000..f4db500
--- /dev/null
+++ b/app/components/datasets/create/assets/html.svg
@@ -0,0 +1,23 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3055_14424)">
+<path d="M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z" fill="#EC5B27"/>
+</g>
+<g opacity="0.96">
+<path d="M10.2704 24.0002V18.3042H8.87042V20.4962H7.38242V18.3042H5.98242V24.0002H7.38242V21.7442H8.87042V24.0002H10.2704Z" fill="white"/>
+<path d="M15.2839 19.5522V18.3042H11.0839V19.5522H12.4839V24.0002H13.8839V19.5522H15.2839Z" fill="white"/>
+<path d="M21.4116 24.0002V18.3042H20.0356L18.7556 20.8162L17.4756 18.3042H16.0996V24.0002H17.4996V21.2722L18.3076 22.6802H19.2036L20.0116 21.2722V24.0002H21.4116Z" fill="white"/>
+<path d="M26.3525 24.0002V22.7522H23.9605V18.3042H22.5605V24.0002H26.3525Z" fill="white"/>
+</g>
+<path opacity="0.5" d="M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3055_14424" x="2" y="0.333496" width="28" height="33.3335" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3055_14424"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3055_14424" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/jina.png b/app/components/datasets/create/assets/jina.png
new file mode 100644
index 0000000..b4beeaf
--- /dev/null
+++ b/app/components/datasets/create/assets/jina.png
Binary files differ
diff --git a/app/components/datasets/create/assets/json.svg b/app/components/datasets/create/assets/json.svg
new file mode 100644
index 0000000..0876828
--- /dev/null
+++ b/app/components/datasets/create/assets/json.svg
@@ -0,0 +1,23 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3055_14428)">
+<path d="M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z" fill="#2D2D2E"/>
+</g>
+<g opacity="0.96">
+<path d="M9.83907 22.0479V18.3039H8.43907V22.0159C8.43907 22.5599 8.12707 22.7999 7.69507 22.7999C7.38307 22.7999 7.23907 22.6879 7.06307 22.5119L6.14307 23.4239C6.60707 23.8879 7.03107 24.0479 7.69507 24.0479C8.76707 24.0479 9.83907 23.3999 9.83907 22.0479Z" fill="white"/>
+<path d="M14.7321 22.2559C14.7321 21.7279 14.6121 21.3039 14.3081 21.0079C14.0681 20.7679 13.7001 20.6079 13.1881 20.5359L12.5001 20.4399C12.3001 20.4159 12.1801 20.3439 12.1081 20.2719C12.0201 20.1839 11.9961 20.0799 11.9961 20.0079C11.9961 19.7599 12.1961 19.4799 12.6841 19.4799C12.9321 19.4799 13.4041 19.4559 13.7641 19.8159L14.6441 18.9359C14.1561 18.4479 13.5401 18.2559 12.7241 18.2559C11.4281 18.2559 10.6441 19.0159 10.6441 20.0559C10.6441 20.5439 10.7721 20.9279 11.0361 21.1999C11.2921 21.4639 11.6761 21.6319 12.1801 21.7039L12.8681 21.7999C13.0521 21.8239 13.1721 21.8799 13.2441 21.9519C13.3241 22.0399 13.3561 22.1519 13.3561 22.2879C13.3561 22.6159 13.0921 22.7999 12.5401 22.7999C12.0841 22.7999 11.5641 22.6959 11.2681 22.3999L10.3721 23.2959C10.9481 23.8879 11.6601 24.0479 12.5321 24.0479C13.7321 24.0479 14.7321 23.4159 14.7321 22.2559Z" fill="white"/>
+<path d="M19.8023 21.1519C19.8023 20.2959 19.8263 19.4959 19.2263 18.8959C18.8103 18.4799 18.3303 18.2559 17.6343 18.2559C16.9383 18.2559 16.4583 18.4799 16.0423 18.8959C15.4423 19.4959 15.4663 20.2959 15.4663 21.1519C15.4663 22.0079 15.4423 22.8079 16.0423 23.4079C16.4583 23.8239 16.9383 24.0479 17.6343 24.0479C18.3303 24.0479 18.8103 23.8239 19.2263 23.4079C19.8263 22.8079 19.8023 22.0079 19.8023 21.1519ZM18.4023 21.1519C18.4023 22.1919 18.3223 22.3759 18.1943 22.5439C18.0903 22.6799 17.8903 22.7999 17.6343 22.7999C17.3783 22.7999 17.1783 22.6799 17.0743 22.5439C16.9463 22.3759 16.8663 22.1919 16.8663 21.1519C16.8663 20.1119 16.9463 19.9199 17.0743 19.7519C17.1783 19.6159 17.3783 19.5039 17.6343 19.5039C17.8903 19.5039 18.0903 19.6159 18.1943 19.7519C18.3223 19.9199 18.4023 20.1119 18.4023 21.1519Z" fill="white"/>
+<path d="M25.2154 23.9999V18.3039H23.8154V21.1679L21.9914 18.3039H20.7674V23.9999H22.1674V21.1359L23.9914 23.9999H25.2154Z" fill="white"/>
+</g>
+<path opacity="0.5" d="M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3055_14428" x="2" y="0.333496" width="28" height="33.3335" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3055_14428"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3055_14428" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/md.svg b/app/components/datasets/create/assets/md.svg
new file mode 100644
index 0000000..d730b5a
--- /dev/null
+++ b/app/components/datasets/create/assets/md.svg
@@ -0,0 +1,18 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3777_37339)">
+<path d="M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z" fill="#309BEC"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M21.9904 25.3335H10.0096C9.45202 25.3335 9 24.9138 9 24.396V18.271C9 17.7532 9.45202 17.3335 10.0096 17.3335H21.9904C22.548 17.3335 23 17.7532 23 18.271V24.396C23 24.9138 22.548 25.3335 21.9904 25.3335ZM12.3654 23.4585V21.021L13.7115 22.5835L15.0577 21.021V23.4585H16.4038V19.2085H15.0577L13.7115 20.771L12.3654 19.2085H11.0192V23.4585H12.3654ZM20.0385 21.3335H21.3846L19.3654 23.521L17.3462 21.3335H18.6923V19.2085H20.0385V21.3335Z" fill="white"/>
+<path opacity="0.5" d="M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3777_37339" x="2" y="0.333496" width="28" height="33.3335" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3777_37339"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3777_37339" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/normal.svg b/app/components/datasets/create/assets/normal.svg
new file mode 100644
index 0000000..1d94adf
--- /dev/null
+++ b/app/components/datasets/create/assets/normal.svg
@@ -0,0 +1,4 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.75 4.5C6.7165 4.5 7.5 3.7165 7.5 2.75C7.5 1.7835 6.7165 1 5.75 1C4.7835 1 4 1.7835 4 2.75C4 3.7165 4.7835 4.5 5.75 4.5Z" fill="#444CE7"/>
+<path d="M3.48775 4.314C3.36842 4.14172 3.30875 4.05558 3.24448 4.02712C3.18679 4.00157 3.12605 3.99844 3.06603 4.01794C2.99918 4.03965 2.94661 4.10099 2.84146 4.22367C2.41951 4.71598 2.13172 5.32705 2.03543 6.00009H2C1.72386 6.00009 1.5 5.77623 1.5 5.50009C1.5 5.31565 1.59961 5.15388 1.75036 5.06668C1.98939 4.9284 2.07107 4.62254 1.9328 4.38351C1.79453 4.14448 1.48867 4.0628 1.24964 4.20107C0.802591 4.45967 0.5 4.94425 0.5 5.50009C0.5 6.32852 1.17157 7.00009 2 7.00009H2.03545C2.14342 7.75422 2.49192 8.43113 2.99997 8.94961L2.99997 10.1117C2.99994 10.1712 2.99992 10.2424 3.00504 10.305C3.01097 10.3776 3.02619 10.4816 3.08171 10.5906C3.15362 10.7317 3.26835 10.8465 3.40948 10.9184C3.51845 10.9739 3.62245 10.9891 3.69505 10.9951C3.7577 11.0002 3.82881 11.0001 3.88836 11.0001H4.86154C4.92109 11.0001 4.99224 11.0002 5.05488 10.9951C5.12749 10.9891 5.23149 10.9739 5.34046 10.9184C5.48158 10.8465 5.59632 10.7317 5.66822 10.5906C5.72375 10.4816 5.73897 10.3776 5.7449 10.305C5.75002 10.2424 5.75 10.1712 5.74997 10.1117L5.74997 10.0001H6.24998L6.24997 10.1115C6.24995 10.1711 6.24992 10.2422 6.25504 10.3048C6.26097 10.3775 6.2762 10.4815 6.33172 10.5904C6.40363 10.7315 6.51836 10.8463 6.65948 10.9182C6.76846 10.9737 6.87245 10.9889 6.94506 10.9949C7.0077 11 7.0788 11 7.13835 10.9999H8.11159C8.17113 11 8.24229 11 8.30493 10.9949C8.37753 10.9889 8.48153 10.9737 8.5905 10.9182C8.73162 10.8463 8.84636 10.7315 8.91827 10.5904C8.97379 10.4815 8.98901 10.3775 8.99494 10.3048C9.00006 10.2422 9.00004 10.1711 9.00001 10.1115L9.00001 9.66299C9.55312 9.40029 10.0258 8.99721 10.3726 8.49993L10.6116 8.49994C10.6711 8.49996 10.7423 8.49999 10.8049 8.49487C10.8775 8.48893 10.9815 8.47371 11.0905 8.41819C11.2316 8.34628 11.3464 8.23155 11.4183 8.09043C11.4738 7.98145 11.489 7.87746 11.4949 7.80485C11.5001 7.74221 11.5 7.67109 11.5 7.61154V5.88181C11.5 5.82509 11.5001 5.75735 11.4954 5.69761C11.49 5.62851 11.4763 5.5294 11.4257 5.42448C11.352 5.27143 11.2285 5.14794 11.0755 5.07422C10.9705 5.02369 10.8714 5.00992 10.8023 5.00454C10.7577 5.00106 10.7087 5.0002 10.6631 4.99999C10.4953 4.64662 10.2702 4.32616 10 4.05044L10 3.51615C10 3.43874 10.0001 3.35111 9.99335 3.27574C9.98593 3.19252 9.96656 3.06385 9.88754 2.93633C9.78902 2.77733 9.63465 2.66089 9.4547 2.60984C9.31038 2.56889 9.18134 2.58561 9.09929 2.60134C9.02497 2.61559 8.94073 2.63969 8.8663 2.66098L8.78839 2.68324C8.6859 2.71252 8.63465 2.72716 8.59861 2.75356C8.5638 2.77904 8.54252 2.80415 8.52309 2.84266C8.50297 2.88255 8.49603 2.94339 8.48215 3.06506C8.32585 4.43546 7.16224 5.5 5.75 5.5C4.81225 5.5 3.98413 5.03063 3.48775 4.314Z" fill="#444CE7"/>
+</svg>
diff --git a/app/components/datasets/create/assets/note-mod.svg b/app/components/datasets/create/assets/note-mod.svg
new file mode 100644
index 0000000..b9e81f6
--- /dev/null
+++ b/app/components/datasets/create/assets/note-mod.svg
@@ -0,0 +1,5 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="note-mod">
+<path id="Vector" d="M17.6387 3.05555H2.36095C1.97762 3.05555 1.6665 3.36666 1.6665 3.74999V16.25C1.6665 16.6333 1.97762 16.9444 2.36095 16.9444H17.6387C18.0221 16.9444 18.3332 16.6333 18.3332 16.25V3.74999C18.3332 3.36666 18.0221 3.05555 17.6387 3.05555ZM9.30539 14.1667H5.13873C4.75539 14.1667 4.44428 13.8555 4.44428 13.4722C4.44428 13.0889 4.75539 12.7778 5.13873 12.7778H9.30539C9.68873 12.7778 9.99984 13.0889 9.99984 13.4722C9.99984 13.8555 9.68873 14.1667 9.30539 14.1667ZM14.8609 10.6944H5.13873C4.75539 10.6944 4.44428 10.3833 4.44428 9.99999C4.44428 9.61666 4.75539 9.30555 5.13873 9.30555H14.8609C15.2443 9.30555 15.5554 9.61666 15.5554 9.99999C15.5554 10.3833 15.2443 10.6944 14.8609 10.6944ZM14.8609 7.22221H5.13873C4.75539 7.22221 4.44428 6.9111 4.44428 6.52777C4.44428 6.14443 4.75539 5.83332 5.13873 5.83332H14.8609C15.2443 5.83332 15.5554 6.14443 15.5554 6.52777C15.5554 6.9111 15.2443 7.22221 14.8609 7.22221Z" fill="#1570EF"/>
+</g>
+</svg>
diff --git a/app/components/datasets/create/assets/notion.svg b/app/components/datasets/create/assets/notion.svg
new file mode 100644
index 0000000..84a45b9
--- /dev/null
+++ b/app/components/datasets/create/assets/notion.svg
@@ -0,0 +1,12 @@
+<svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_2942_529)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3.90599 18.2611L1.75639 15.5832C1.2392 14.9389 0.958496 14.1466 0.958496 13.3312V3.63437C0.958496 2.4129 1.93574 1.39936 3.19644 1.31328L13.1661 0.632614C13.8904 0.583164 14.6103 0.775682 15.2052 1.17794L18.708 3.5462C19.335 3.97012 19.7085 4.66312 19.7085 5.40266V16.427C19.7085 17.6223 18.7476 18.6121 17.5133 18.688L6.44808 19.3692C5.46308 19.4298 4.51099 19.0148 3.90599 18.2611Z" fill="white"/>
+<path d="M7.36355 8.48663V8.35968C7.36355 8.03787 7.62129 7.77098 7.95347 7.7488L10.3731 7.58726L13.7191 12.5146V8.19003L12.8579 8.07522V8.01492C12.8579 7.68933 13.1215 7.42068 13.4579 7.40344L15.6595 7.29066V7.60749C15.6595 7.75622 15.5489 7.88343 15.3973 7.90907L14.8675 7.99868V15.0022L14.2026 15.2309C13.6471 15.4219 13.0287 15.2174 12.7107 14.7376L9.46228 9.83568V14.5143L10.4622 14.7056L10.4482 14.7984C10.4046 15.0889 10.1538 15.3086 9.85036 15.3221L7.36355 15.4328C7.33068 15.1204 7.56481 14.8409 7.88781 14.807L8.21492 14.7726V8.53447L7.36355 8.48663Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M13.2553 1.85418L3.28567 2.53485C2.68849 2.57562 2.22559 3.05572 2.22559 3.63431V13.3311C2.22559 13.8748 2.41272 14.4029 2.75752 14.8325L4.90712 17.5104C5.25467 17.9433 5.80161 18.1817 6.36747 18.1469L17.4326 17.4658C17.9998 17.4309 18.4413 16.9761 18.4413 16.4269V5.4026C18.4413 5.06281 18.2697 4.74441 17.9816 4.54963L14.4788 2.18137C14.1218 1.94002 13.6899 1.82451 13.2553 1.85418ZM3.78004 3.78556C3.64138 3.6829 3.70737 3.46903 3.88156 3.45654L13.3224 2.77938C13.6232 2.75781 13.9221 2.84064 14.1653 3.01299L16.0595 4.35502C16.1315 4.40597 16.0977 4.51596 16.0087 4.5208L6.01092 5.06454C5.70835 5.081 5.4097 4.99211 5.16913 4.814L3.78004 3.78556ZM5.54198 6.76913C5.54198 6.44433 5.80438 6.17604 6.13991 6.15777L16.7104 5.5821C17.0374 5.56429 17.3127 5.81577 17.3127 6.13232V15.6782C17.3127 16.0024 17.0512 16.2705 16.7164 16.2895L6.2128 16.8871C5.84887 16.9079 5.54198 16.6282 5.54198 16.2759V6.76913Z" fill="black"/>
+</g>
+<defs>
+<clipPath id="clip0_2942_529">
+<rect width="20" height="20" fill="white" transform="translate(0.333496)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/option-card-effect-blue.svg b/app/components/datasets/create/assets/option-card-effect-blue.svg
new file mode 100644
index 0000000..00a8afa
--- /dev/null
+++ b/app/components/datasets/create/assets/option-card-effect-blue.svg
@@ -0,0 +1,12 @@
+<svg width="220" height="220" viewBox="0 0 220 220" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Effect" opacity="0.8" filter="url(#filter0_f_1328_28605)">
+<circle cx="32" cy="32" r="28" fill="#444CE7"/>
+</g>
+<defs>
+<filter id="filter0_f_1328_28605" x="-156" y="-156" width="376" height="376" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feGaussianBlur stdDeviation="80" result="effect1_foregroundBlur_1328_28605"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/option-card-effect-orange.svg b/app/components/datasets/create/assets/option-card-effect-orange.svg
new file mode 100644
index 0000000..d833764
--- /dev/null
+++ b/app/components/datasets/create/assets/option-card-effect-orange.svg
@@ -0,0 +1,12 @@
+<svg width="220" height="220" viewBox="0 0 220 220" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Effect" opacity="0.8" filter="url(#filter0_f_481_16338)">
+<circle cx="32" cy="32" r="28" fill="#EF6820"/>
+</g>
+<defs>
+<filter id="filter0_f_481_16338" x="-156" y="-156" width="376" height="376" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feGaussianBlur stdDeviation="80" result="effect1_foregroundBlur_481_16338"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/option-card-effect-purple.svg b/app/components/datasets/create/assets/option-card-effect-purple.svg
new file mode 100644
index 0000000..a7857f8
--- /dev/null
+++ b/app/components/datasets/create/assets/option-card-effect-purple.svg
@@ -0,0 +1,12 @@
+<svg width="220" height="220" viewBox="0 0 220 220" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Effect" opacity="0.8" filter="url(#filter0_f_481_16453)">
+<circle cx="32" cy="32" r="28" fill="#6938EF"/>
+</g>
+<defs>
+<filter id="filter0_f_481_16453" x="-156" y="-156" width="376" height="376" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feGaussianBlur stdDeviation="80" result="effect1_foregroundBlur_481_16453"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/pattern-recognition-mod.svg b/app/components/datasets/create/assets/pattern-recognition-mod.svg
new file mode 100644
index 0000000..1083e88
--- /dev/null
+++ b/app/components/datasets/create/assets/pattern-recognition-mod.svg
@@ -0,0 +1,12 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M3.93923 18.3333C3.48973 18.3333 3.05032 18.2 2.67657 17.9503C2.30282 17.7006 2.01152 17.3456 1.83951 16.9303C1.66749 16.515 1.62248 16.0581 1.71017 15.6172C1.79787 15.1763 2.01432 14.7714 2.33217 14.4535C2.65002 14.1357 3.05498 13.9192 3.49584 13.8315C3.93671 13.7438 4.39368 13.7889 4.80897 13.9609C5.22425 14.1329 5.5792 14.4242 5.82894 14.7979C6.07867 15.1717 6.21196 15.6111 6.21196 16.0606C6.21196 16.6634 5.97251 17.2414 5.54629 17.6677C5.12007 18.0939 4.542 18.3333 3.93923 18.3333Z" fill="#6938EF"/>
+    <path d="M9.99978 7.72726C9.55028 7.72726 9.11087 7.86056 8.73712 8.11029C8.36337 8.36002 8.07207 8.71497 7.90005 9.13026C7.72804 9.54554 7.68303 10.0025 7.77072 10.4434C7.85842 10.8842 8.07487 11.2892 8.39272 11.6071C8.71056 11.9249 9.11553 12.1414 9.55639 12.229C9.99726 12.3167 10.4542 12.2717 10.8695 12.0997C11.2848 11.9277 11.6398 11.6364 11.8895 11.2627C12.1392 10.8889 12.2725 10.4495 12.2725 9.99999C12.2725 9.39723 12.0331 8.81915 11.6068 8.39293C11.1806 7.96671 10.6025 7.72726 9.99978 7.72726Z" fill="#6938EF"/>
+    <path d="M3.93923 1.66666C3.48973 1.66666 3.05032 1.79995 2.67657 2.04968C2.30282 2.29941 2.01152 2.65436 1.83951 3.06965C1.66749 3.48494 1.62248 3.9419 1.71017 4.38277C1.79787 4.82364 2.01432 5.2286 2.33217 5.54644C2.65002 5.86429 3.05498 6.08075 3.49585 6.16844C3.93671 6.25613 4.39368 6.21113 4.80897 6.03911C5.22425 5.86709 5.57921 5.57579 5.82894 5.20204C6.07867 4.8283 6.21196 4.38889 6.21196 3.93938C6.21196 3.33662 5.97251 2.75854 5.54629 2.33232C5.12007 1.9061 4.542 1.66666 3.93923 1.66666Z" fill="#6938EF"/>
+    <path d="M16.0603 1.66666C15.6108 1.66666 15.1714 1.79995 14.7977 2.04968C14.4239 2.29941 14.1326 2.65436 13.9606 3.06965C13.7886 3.48494 13.7436 3.9419 13.8313 4.38277C13.919 4.82364 14.1354 5.2286 14.4533 5.54644C14.7711 5.86429 15.1761 6.08075 15.6169 6.16844C16.0578 6.25613 16.5148 6.21113 16.9301 6.03911C17.3453 5.86709 17.7003 5.57579 17.95 5.20204C18.1998 4.8283 18.3331 4.38889 18.3331 3.93938C18.3331 3.33662 18.0936 2.75854 17.6674 2.33232C17.2412 1.9061 16.6631 1.66666 16.0603 1.66666Z" fill="#6938EF"/>
+    <path d="M16.0603 13.7879C15.6108 13.7879 15.1714 13.9212 14.7977 14.1709C14.4239 14.4206 14.1326 14.7756 13.9606 15.1909C13.7886 15.6062 13.7436 16.0631 13.8313 16.504C13.919 16.9449 14.1354 17.3498 14.4533 17.6677C14.7711 17.9855 15.1761 18.202 15.6169 18.2897C16.0578 18.3774 16.5148 18.3323 16.9301 18.1603C17.3453 17.9883 17.7003 17.697 17.95 17.3233C18.1998 16.9495 18.3331 16.5101 18.3331 16.0606C18.3331 15.4578 18.0936 14.8798 17.6674 14.4535C17.2412 14.0273 16.6631 13.7879 16.0603 13.7879Z" fill="#6938EF"/>
+    <path d="M6.21196 7.72726H1.6665V12.2727H6.21196V7.72726Z" fill="#6938EF"/>
+    <path d="M18.3331 7.72726H13.7876V12.2727H18.3331V7.72726Z" fill="#6938EF"/>
+    <path d="M12.2725 1.66666H7.72705V6.21211H12.2725V1.66666Z" fill="#6938EF"/>
+    <path d="M12.2725 13.7879H7.72705V18.3333H12.2725V13.7879Z" fill="#6938EF"/>
+    </svg>
+    
\ No newline at end of file
diff --git a/app/components/datasets/create/assets/pdf.svg b/app/components/datasets/create/assets/pdf.svg
new file mode 100644
index 0000000..bc63229
--- /dev/null
+++ b/app/components/datasets/create/assets/pdf.svg
@@ -0,0 +1,22 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3055_14420)">
+<path d="M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z" fill="#DD3633"/>
+</g>
+<g opacity="0.96">
+<path d="M13.2801 20.1362C13.2801 19.2002 12.6001 18.3042 11.3361 18.3042H9.08008V24.0002H10.4801V21.9682H11.3361C12.6001 21.9682 13.2801 21.0722 13.2801 20.1362ZM11.8801 20.1362C11.8801 20.4322 11.6561 20.7122 11.2721 20.7122H10.4801V19.5602H11.2721C11.6561 19.5602 11.8801 19.8402 11.8801 20.1362Z" fill="white"/>
+<path d="M18.3357 21.1522C18.3357 20.2562 18.4077 19.5282 17.7437 18.8642C17.3517 18.4722 16.7997 18.3042 16.2077 18.3042H14.0957V24.0002H16.2077C16.7997 24.0002 17.3517 23.8322 17.7437 23.4402C18.4077 22.7762 18.3357 22.0482 18.3357 21.1522ZM16.9357 21.1522C16.9357 22.1202 16.8957 22.2722 16.7837 22.4322C16.6557 22.6242 16.4637 22.7522 16.1117 22.7522H15.4957V19.5522H16.1117C16.4637 19.5522 16.6557 19.6802 16.7837 19.8722C16.8957 20.0322 16.9357 20.1922 16.9357 21.1522Z" fill="white"/>
+<path d="M23.1786 19.5522V18.3042H19.3066V24.0002H20.7066V21.8002H22.8186V20.5522H20.7066V19.5522H23.1786Z" fill="white"/>
+</g>
+<path opacity="0.5" d="M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3055_14420" x="2" y="0.333496" width="28" height="33.3335" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3055_14420"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3055_14420" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/piggy-bank-01.svg b/app/components/datasets/create/assets/piggy-bank-01.svg
new file mode 100644
index 0000000..f598586
--- /dev/null
+++ b/app/components/datasets/create/assets/piggy-bank-01.svg
@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7.66675 6.00004C8.95541 6.00004 10.0001 4.95537 10.0001 3.66671C10.0001 2.37804 8.95541 1.33337 7.66675 1.33337C6.37808 1.33337 5.33341 2.37804 5.33341 3.66671C5.33341 4.95537 6.37808 6.00004 7.66675 6.00004Z" fill="#444CE7"/>
+<path d="M4.65042 5.75205C4.49131 5.52233 4.41175 5.40747 4.32605 5.36953C4.24913 5.33547 4.16814 5.3313 4.08813 5.35729C3.99899 5.38624 3.92889 5.46803 3.78869 5.6316C3.22609 6.28801 2.84238 7.10277 2.71398 8.00016H2.66675C2.29856 8.00016 2.00008 7.70168 2.00008 7.33349C2.00008 7.08757 2.13289 6.87188 2.3339 6.75561C2.65261 6.57125 2.76151 6.16343 2.57715 5.84472C2.39279 5.52601 1.98497 5.4171 1.66626 5.60147C1.0702 5.94627 0.666748 6.59237 0.666748 7.33349C0.666748 8.43806 1.56218 9.33349 2.66675 9.33349H2.71402C2.85798 10.339 3.32264 11.2416 4.00004 11.9329L4.00004 13.4823C4.00001 13.5617 3.99997 13.6565 4.0068 13.7401C4.01471 13.8369 4.035 13.9756 4.10903 14.1209C4.20491 14.309 4.35789 14.462 4.54605 14.5579C4.69135 14.6319 4.83001 14.6522 4.92682 14.6601C5.01034 14.6669 5.10517 14.6669 5.18456 14.6669H6.48214C6.56153 14.6669 6.6564 14.6669 6.73993 14.6601C6.83674 14.6522 6.9754 14.6319 7.1207 14.5579C7.30886 14.462 7.46184 14.309 7.55771 14.1209C7.63175 13.9756 7.65204 13.8369 7.65995 13.7401C7.66678 13.6565 7.66674 13.5617 7.66671 13.4823L7.66671 13.3335H8.33338L8.33338 13.482C8.33335 13.5615 8.33331 13.6563 8.34014 13.7398C8.34805 13.8366 8.36834 13.9753 8.44238 14.1206C8.53825 14.3088 8.69123 14.4618 8.87939 14.5576C9.02469 14.6317 9.16335 14.652 9.26016 14.6599C9.34368 14.6667 9.43849 14.6667 9.51788 14.6666H10.8155C10.8949 14.6667 10.9898 14.6667 11.0733 14.6599C11.1701 14.652 11.3088 14.6317 11.4541 14.5576C11.6422 14.4618 11.7952 14.3088 11.8911 14.1206C11.9651 13.9753 11.9854 13.8366 11.9933 13.7398C12.0002 13.6563 12.0001 13.5615 12.0001 13.482L12.0001 12.884C12.7376 12.5338 13.3679 11.9963 13.8302 11.3333L14.1488 11.3333C14.2283 11.3333 14.3231 11.3334 14.4066 11.3265C14.5035 11.3186 14.6421 11.2983 14.7874 11.2243C14.9756 11.1284 15.1286 10.9754 15.2244 10.7873C15.2985 10.642 15.3188 10.5033 15.3267 10.4065C15.3335 10.323 15.3335 10.2282 15.3334 10.1488V7.84245C15.3335 7.76683 15.3335 7.67651 15.3273 7.59685C15.3201 7.50472 15.3017 7.37257 15.2344 7.23269C15.1361 7.02862 14.9714 6.86396 14.7674 6.76567C14.6275 6.6983 14.4953 6.67993 14.4032 6.67276C14.3437 6.66813 14.2783 6.66697 14.2175 6.66669C13.9938 6.19554 13.6937 5.76825 13.3334 5.40063L13.3334 4.68824C13.3335 4.58502 13.3335 4.46819 13.3245 4.36769C13.3147 4.25673 13.2888 4.08518 13.1835 3.91515C13.0521 3.70315 12.8463 3.54789 12.6064 3.47982C12.4139 3.42523 12.2419 3.44753 12.1325 3.4685C12.0334 3.48749 11.921 3.51963 11.8218 3.54801L11.7179 3.57769C11.5813 3.61674 11.513 3.63626 11.4649 3.67145C11.4185 3.70542 11.3901 3.73891 11.3642 3.79026C11.3374 3.84344 11.3281 3.92456 11.3096 4.08678C11.1012 5.91399 9.54973 7.33337 7.66675 7.33337C6.41642 7.33337 5.31225 6.70755 4.65042 5.75205Z" fill="#444CE7"/>
+</svg>
diff --git a/app/components/datasets/create/assets/piggy-bank-mod.svg b/app/components/datasets/create/assets/piggy-bank-mod.svg
new file mode 100644
index 0000000..b1120ad
--- /dev/null
+++ b/app/components/datasets/create/assets/piggy-bank-mod.svg
@@ -0,0 +1,7 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M7.91672 15.2028V17.9805H6.52783V15.2028H7.91672Z" fill="#444CE7"/>
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M14.1667 15.2028V17.9805H12.7778V15.2028H14.1667Z" fill="#444CE7"/>
+    <path d="M14.1666 2.0083C14.1666 3.54243 12.923 4.78608 11.3889 4.78608C9.85476 4.78608 8.61108 3.54243 8.61108 2.0083L14.1666 2.0083Z" fill="#444CE7"/>
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M5.8864 5.23918C6.9718 4.92907 8.12598 5.30791 8.81883 6.17498H13.1251C16.0015 6.17498 18.3334 8.50683 18.3334 11.3833C18.3334 14.2598 16.0015 16.5916 13.1251 16.5916H7.39252C6.14908 16.5916 4.97062 16.0363 4.1791 15.0773L3.32342 14.0407L1.66675 13.3448V9.93061L3.65692 9.40957L4.44453 8.40703V5.65114L5.8864 5.23918ZM8.61119 8.25831H14.1667V9.64721H8.61119V8.25831ZM6.52786 9.99443C6.52786 10.5697 6.06149 11.0361 5.48619 11.0361C4.91089 11.0361 4.44453 10.5697 4.44453 9.99443C4.44453 9.41915 4.91089 8.95276 5.48619 8.95276C6.06149 8.95276 6.52786 9.41915 6.52786 9.99443Z" fill="#444CE7"/>
+    </svg>
+    
\ No newline at end of file
diff --git a/app/components/datasets/create/assets/progress-indicator.svg b/app/components/datasets/create/assets/progress-indicator.svg
new file mode 100644
index 0000000..3c99713
--- /dev/null
+++ b/app/components/datasets/create/assets/progress-indicator.svg
@@ -0,0 +1,8 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="progress-indicator">
+<g id="Vector">
+<path d="M18.4029 10.7639H1.59738C1.17572 10.7639 0.833496 11.1061 0.833496 11.5278V16.1111C0.833496 16.5328 1.17572 16.875 1.59738 16.875H18.4029C18.8246 16.875 19.1668 16.5328 19.1668 16.1111V11.5278C19.1668 11.1061 18.8246 10.7639 18.4029 10.7639ZM17.6391 15.3472H10.0002V12.2917H17.6391V15.3472Z" fill="#1570EF"/>
+<path d="M9.716 7.58153C9.78933 7.66174 9.89169 7.70833 10.0002 7.70833C10.1086 7.70833 10.211 7.6625 10.2843 7.58153L13.7218 3.76208C13.8227 3.64979 13.8479 3.48937 13.7868 3.35111C13.7249 3.21361 13.5881 3.125 13.4377 3.125H6.56266C6.41218 3.125 6.27544 3.21361 6.21356 3.35111C6.15245 3.48937 6.17766 3.64979 6.2785 3.76208L9.716 7.58153Z" fill="#1570EF"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/datasets/create/assets/rerank.svg b/app/components/datasets/create/assets/rerank.svg
new file mode 100644
index 0000000..409b52e
--- /dev/null
+++ b/app/components/datasets/create/assets/rerank.svg
@@ -0,0 +1,13 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="rerank">
+<g id="Vector">
+<path d="M18.3333 4.58329C18.3333 5.73389 17.4005 6.66663 16.2499 6.66663C15.0993 6.66663 14.1666 5.73389 14.1666 4.58329C14.1666 3.4327 15.0993 2.49996 16.2499 2.49996C17.4005 2.49996 18.3333 3.4327 18.3333 4.58329Z" fill="#0E9384"/>
+<path d="M13.3333 15.4166C13.3333 16.5672 12.4005 17.5 11.2499 17.5C10.0993 17.5 9.16658 16.5672 9.16658 15.4166C9.16658 14.266 10.0993 13.3333 11.2499 13.3333C12.4005 13.3333 13.3333 14.266 13.3333 15.4166Z" fill="#0E9384"/>
+<path d="M12.0833 4.58329C12.0833 5.27365 11.5236 5.83329 10.8333 5.83329C10.1429 5.83329 9.58325 5.27365 9.58325 4.58329C9.58325 3.89294 10.1429 3.33329 10.8333 3.33329C11.5236 3.33329 12.0833 3.89294 12.0833 4.58329Z" fill="#0E9384"/>
+<path d="M17.4999 15.4166C17.4999 16.107 16.9403 16.6666 16.2499 16.6666C15.5596 16.6666 14.9999 16.107 14.9999 15.4166C14.9999 14.7263 15.5596 14.1666 16.2499 14.1666C16.9403 14.1666 17.4999 14.7263 17.4999 15.4166Z" fill="#0E9384"/>
+<path d="M7.49992 15.4166C7.49992 17.0275 6.19408 18.3333 4.58325 18.3333C2.97242 18.3333 1.66659 17.0275 1.66659 15.4166C1.66659 13.8058 2.97242 12.5 4.58325 12.5C6.19408 12.5 7.49992 13.8058 7.49992 15.4166Z" fill="#0E9384"/>
+<path d="M7.49992 4.58329C7.49992 6.19412 6.19408 7.49996 4.58325 7.49996C2.97242 7.49996 1.66659 6.19412 1.66659 4.58329C1.66659 2.97246 2.97242 1.66663 4.58325 1.66663C6.19408 1.66663 7.49992 2.97246 7.49992 4.58329Z" fill="#0E9384"/>
+<path d="M0.833252 9.99996C0.833252 9.53972 1.20635 9.16663 1.66659 9.16663H18.3333C18.7935 9.16663 19.1666 9.53972 19.1666 9.99996C19.1666 10.4602 18.7935 10.8333 18.3333 10.8333H1.66659C1.20635 10.8333 0.833252 10.4602 0.833252 9.99996Z" fill="#0E9384"/>
+</g>
+</g>
+</svg>
diff --git a/app/components/datasets/create/assets/research-mod.svg b/app/components/datasets/create/assets/research-mod.svg
new file mode 100644
index 0000000..1f0bb34
--- /dev/null
+++ b/app/components/datasets/create/assets/research-mod.svg
@@ -0,0 +1,6 @@
+<svg width="16" height="18" viewBox="0 0 16 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M13.6752 4.83333H9.91553V1.07361L13.6752 4.83333Z" fill="#6938EF"/>
+    <path d="M7.2003 13.8611H2.62391C2.53183 13.8611 2.44351 13.8245 2.37839 13.7594C2.31327 13.6943 2.27669 13.606 2.27669 13.5139V12.8195C2.27669 12.7274 2.31327 12.6391 2.37839 12.5739C2.44351 12.5088 2.53183 12.4722 2.62391 12.4722H7.2003C7.33176 11.6964 7.68097 10.9739 8.20725 10.3889H2.62391C2.53183 10.3889 2.44351 10.3523 2.37839 10.2872C2.31327 10.2221 2.27669 10.1338 2.27669 10.0417V9.34724C2.27669 9.25515 2.31327 9.16684 2.37839 9.10172C2.44351 9.0366 2.53183 9.00002 2.62391 9.00002H11.3045C12.3309 9.0003 13.3207 9.38137 14.0822 10.0695V6.22224H9.22114C9.03696 6.22224 8.86032 6.14908 8.73009 6.01884C8.59986 5.88861 8.52669 5.71198 8.52669 5.5278V0.666687H0.887804C0.703626 0.666687 0.526991 0.739851 0.396757 0.870085C0.266524 1.00032 0.193359 1.17695 0.193359 1.36113V16.6389C0.193359 16.8231 0.266524 16.9997 0.396757 17.13C0.526991 17.2602 0.703626 17.3334 0.887804 17.3334H10.61C9.73337 17.224 8.91945 16.8214 8.30046 16.1911C7.68146 15.5607 7.29375 14.7396 7.2003 13.8611ZM2.62391 5.5278H6.09614C6.18823 5.5278 6.27654 5.56438 6.34166 5.6295C6.40678 5.69461 6.44336 5.78293 6.44336 5.87502V6.56947C6.44336 6.66155 6.40678 6.74987 6.34166 6.81499C6.27654 6.88011 6.18823 6.91669 6.09614 6.91669H2.62391C2.53183 6.91669 2.44351 6.88011 2.37839 6.81499C2.31327 6.74987 2.27669 6.66155 2.27669 6.56947V5.87502C2.27669 5.78293 2.31327 5.69461 2.37839 5.6295C2.44351 5.56438 2.53183 5.5278 2.62391 5.5278Z" fill="#6938EF"/>
+    <path d="M15.2678 16.1479L13.6887 14.5688C13.9439 14.1455 14.08 13.661 14.0824 13.1667C14.0824 12.6173 13.9195 12.0802 13.6143 11.6234C13.309 11.1666 12.8752 10.8106 12.3676 10.6004C11.8601 10.3901 11.3016 10.3351 10.7627 10.4423C10.2239 10.5495 9.72893 10.814 9.34045 11.2025C8.95197 11.591 8.68741 12.0859 8.58023 12.6248C8.47305 13.1636 8.52806 13.7221 8.7383 14.2297C8.94855 14.7373 9.30458 15.1711 9.76138 15.4763C10.2182 15.7816 10.7552 15.9445 11.3046 15.9445C11.799 15.9421 12.2834 15.806 12.7067 15.5507L14.2859 17.1299C14.4169 17.2564 14.5923 17.3264 14.7744 17.3248C14.9564 17.3232 15.1306 17.2502 15.2594 17.1214C15.3881 16.9927 15.4612 16.8185 15.4627 16.6364C15.4643 16.4543 15.3943 16.2789 15.2678 16.1479ZM9.91575 13.1667C9.91575 12.892 9.9972 12.6235 10.1498 12.3951C10.3024 12.1667 10.5193 11.9887 10.7731 11.8835C11.0269 11.7784 11.3062 11.7509 11.5756 11.8045C11.845 11.8581 12.0925 11.9904 12.2867 12.1846C12.481 12.3788 12.6132 12.6263 12.6668 12.8957C12.7204 13.1652 12.6929 13.4444 12.5878 13.6982C12.4827 13.952 12.3047 14.1689 12.0763 14.3215C11.8479 14.4741 11.5793 14.5556 11.3046 14.5556C10.9363 14.5556 10.583 14.4093 10.3225 14.1488C10.0621 13.8883 9.91575 13.5351 9.91575 13.1667Z" fill="#6938EF"/>
+    </svg>
+    
\ No newline at end of file
diff --git a/app/components/datasets/create/assets/selection-mod.svg b/app/components/datasets/create/assets/selection-mod.svg
new file mode 100644
index 0000000..2d0dd3b
--- /dev/null
+++ b/app/components/datasets/create/assets/selection-mod.svg
@@ -0,0 +1,12 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M5.83317 18.3334H1.6665V14.1667H5.83317V18.3334Z" fill="#6938EF"/>
+    <path d="M12.0832 12.0834H7.9165V7.91669H12.0832V12.0834Z" fill="#6938EF"/>
+    <path d="M5.83317 12.0834H1.6665V7.91669H5.83317V12.0834Z" fill="#6938EF"/>
+    <path d="M12.0832 5.83335H7.9165V1.66669H12.0832V5.83335Z" fill="#6938EF"/>
+    <path d="M5.83317 5.83335H1.6665V1.66669H5.83317V5.83335Z" fill="#6938EF"/>
+    <path d="M18.3332 5.83335H14.1665V1.66669H18.3332V5.83335Z" fill="#6938EF"/>
+    <path d="M17.6386 14.8611H14.8608V17.6389H17.6386V14.8611Z" fill="#6938EF"/>
+    <path d="M17.6386 8.61115H14.8608V11.3889H17.6386V8.61115Z" fill="#6938EF"/>
+    <path d="M11.3886 14.8611H8.61084V17.6389H11.3886V14.8611Z" fill="#6938EF"/>
+    </svg>
+    
\ No newline at end of file
diff --git a/app/components/datasets/create/assets/setting-gear-mod.svg b/app/components/datasets/create/assets/setting-gear-mod.svg
new file mode 100644
index 0000000..c782caa
--- /dev/null
+++ b/app/components/datasets/create/assets/setting-gear-mod.svg
@@ -0,0 +1,4 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M10.0002 0.833374C10.4604 0.833374 10.8335 1.20647 10.8335 1.66671V2.54597C11.5977 2.63056 12.328 2.8301 13.0061 3.12703L13.4452 2.36666C13.6752 1.96808 14.1849 1.83152 14.5835 2.06164C14.9821 2.29176 15.1186 2.80142 14.8885 3.2L14.4488 3.96146C15.0552 4.40877 15.5915 4.94516 16.0388 5.55143L16.8003 5.11177C17.1989 4.88165 17.7086 5.01821 17.9387 5.41679C18.1688 5.81537 18.0322 6.32502 17.6337 6.55514L16.8732 6.99418C17.1702 7.67226 17.3697 8.40254 17.4543 9.16679H18.3335C18.7937 9.16679 19.1668 9.53987 19.1668 10.0001C19.1668 10.4604 18.7937 10.8335 18.3335 10.8335H17.4543C17.3697 11.5977 17.1702 12.328 16.8732 13.0061L17.6337 13.4452C18.0322 13.6753 18.1688 14.185 17.9387 14.5835C17.7086 14.9821 17.1989 15.1187 16.8003 14.8885L16.0388 14.4489C15.5915 15.0551 15.0551 15.5915 14.4488 16.0388L14.8885 16.8004C15.1186 17.1989 14.9821 17.7085 14.5835 17.9387C14.1849 18.1688 13.6752 18.0322 13.4452 17.6337L13.0061 16.8732C12.328 17.1701 11.5977 17.3697 10.8335 17.4543V18.3334C10.8335 18.7936 10.4604 19.1667 10.0002 19.1667C9.53991 19.1667 9.16683 18.7936 9.16683 18.3334V17.4543C8.40258 17.3697 7.6723 17.1701 6.99424 16.8732L6.55516 17.6337C6.32505 18.0323 5.81539 18.1689 5.41681 17.9388C5.01824 17.7086 4.88167 17.199 5.11179 16.8005L5.55149 16.0388C4.94519 15.5915 4.40878 15.0551 3.96145 14.4488L3.19993 14.8885C2.80135 15.1186 2.2917 14.982 2.06158 14.5835C1.83145 14.1849 1.96802 13.6752 2.3666 13.4451L3.12704 13.006C2.83011 12.328 2.63056 11.5977 2.54598 10.8335L1.66679 10.8334C1.20655 10.8334 0.833474 10.4602 0.833496 10C0.833521 9.53979 1.20663 9.16671 1.66687 9.16671L2.54599 9.16679C2.63058 8.40254 2.8301 7.67229 3.12701 6.99424L2.3666 6.55523C1.96802 6.32512 1.83145 5.81546 2.06157 5.41687C2.29169 5.0183 2.80135 4.88173 3.19992 5.11185L3.96142 5.55148C4.40874 4.94518 4.94515 4.40877 5.55145 3.96144L5.11179 3.19991C4.88167 2.80133 5.01823 2.29167 5.41681 2.06156C5.81539 1.83144 6.32505 1.968 6.55516 2.36657L6.9942 3.12702C7.67228 2.83009 8.40258 2.63055 9.16683 2.54597V1.66671C9.16683 1.20647 9.53991 0.833374 10.0002 0.833374ZM6.39156 5.41655C5.81089 5.87442 5.31917 6.44029 4.94695 7.08361C4.45095 7.94087 4.16681 8.93604 4.16681 10.0001C4.16681 11.0642 4.45096 12.0594 4.94698 12.9167C5.3192 13.56 5.81091 14.1259 6.39159 14.5837L8.1 11.6246C7.72651 11.1881 7.50015 10.6208 7.50015 10.0001C7.50015 9.37946 7.72651 8.81212 8.09999 8.37562L6.39156 5.41655ZM9.54316 7.54194L7.83418 4.5819C8.50325 4.31416 9.23383 4.16679 10.0002 4.16679C11.0642 4.16679 12.0594 4.45095 12.9167 4.94697C13.8022 5.45932 14.541 6.19807 15.0533 7.08357C15.4173 7.71277 15.6673 8.41629 15.7745 9.16679H12.3579C12.0147 8.19579 11.0887 7.50012 10.0002 7.50012C9.84433 7.50012 9.69149 7.51446 9.54316 7.54194ZM12.3579 10.8335C12.0147 11.8045 11.0887 12.5001 10.0002 12.5001C9.84433 12.5001 9.69149 12.4858 9.54316 12.4583L7.8342 15.4184C8.50325 15.6861 9.23383 15.8335 10.0002 15.8335C11.0642 15.8335 12.0594 15.5493 12.9167 15.0533C13.8022 14.541 14.5409 13.8022 15.0532 12.9167C15.4173 12.2875 15.6673 11.584 15.7745 10.8335H12.3579Z" fill="#444CE7"/>
+    </svg>
+    
\ No newline at end of file
diff --git a/app/components/datasets/create/assets/sliders-02.svg b/app/components/datasets/create/assets/sliders-02.svg
new file mode 100644
index 0000000..ed05e97
--- /dev/null
+++ b/app/components/datasets/create/assets/sliders-02.svg
@@ -0,0 +1,8 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M1.33325 12.6666C1.33325 12.2984 1.63173 12 1.99992 12H4.66659C5.03478 12 5.33325 12.2984 5.33325 12.6666C5.33325 13.0348 5.03478 13.3333 4.66659 13.3333H1.99992C1.63173 13.3333 1.33325 13.0348 1.33325 12.6666Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.5528 12C10.2782 11.2232 9.5374 10.6666 8.66659 10.6666C7.56202 10.6666 6.66659 11.5621 6.66659 12.6666C6.66659 13.7712 7.56202 14.6666 8.66659 14.6666C9.5374 14.6666 10.2782 14.1101 10.5528 13.3333L13.9999 13.3333C14.3681 13.3333 14.6666 13.0348 14.6666 12.6666C14.6666 12.2984 14.3681 12 13.9999 12L10.5528 12Z" fill="#155EEF"/>
+<path d="M9.99992 7.33329C9.63173 7.33329 9.33325 7.63177 9.33325 7.99996C9.33325 8.36815 9.63173 8.66663 9.99992 8.66663H13.9999C14.3681 8.66663 14.6666 8.36815 14.6666 7.99996C14.6666 7.63177 14.3681 7.33329 13.9999 7.33329H9.99992Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.33325 7.99996C1.33325 7.63177 1.63173 7.33329 1.99992 7.33329H4.11372C4.38828 6.5565 5.12911 5.99996 5.99992 5.99996C7.10449 5.99996 7.99992 6.89539 7.99992 7.99996C7.99992 9.10453 7.10449 9.99996 5.99992 9.99996C5.12911 9.99996 4.38828 9.44342 4.11372 8.66663H1.99992C1.63173 8.66663 1.33325 8.36815 1.33325 7.99996Z" fill="#155EEF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.99992 1.33329C10.8707 1.33329 11.6116 1.88983 11.8861 2.66663H13.9999C14.3681 2.66663 14.6666 2.9651 14.6666 3.33329C14.6666 3.70148 14.3681 3.99996 13.9999 3.99996H11.8861C11.6116 4.77675 10.8707 5.33329 9.99992 5.33329C8.89535 5.33329 7.99992 4.43786 7.99992 3.33329C7.99992 2.22872 8.89535 1.33329 9.99992 1.33329Z" fill="#155EEF"/>
+<path d="M1.33325 3.33329C1.33325 2.9651 1.63173 2.66663 1.99992 2.66663H5.99992C6.36811 2.66663 6.66659 2.9651 6.66659 3.33329C6.66659 3.70148 6.36811 3.99996 5.99992 3.99996H1.99992C1.63173 3.99996 1.33325 3.70148 1.33325 3.33329Z" fill="#155EEF"/>
+</svg>
diff --git a/app/components/datasets/create/assets/star-07.svg b/app/components/datasets/create/assets/star-07.svg
new file mode 100644
index 0000000..f043ae6
--- /dev/null
+++ b/app/components/datasets/create/assets/star-07.svg
@@ -0,0 +1,11 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8.00008 0.666626C8.36827 0.666626 8.66675 0.965103 8.66675 1.33329V2.66663C8.66675 3.03482 8.36827 3.33329 8.00008 3.33329C7.63189 3.33329 7.33341 3.03482 7.33341 2.66663V1.33329C7.33341 0.965103 7.63189 0.666626 8.00008 0.666626Z" fill="#FB6514"/>
+<path d="M3.75729 2.81452C3.49694 2.55418 3.07483 2.55418 2.81448 2.81452C2.55413 3.07487 2.55413 3.49698 2.81448 3.75733L3.75729 4.70014C4.01764 4.96049 4.43975 4.96049 4.7001 4.70014C4.96045 4.43979 4.96045 4.01768 4.7001 3.75733L3.75729 2.81452Z" fill="#FB6514"/>
+<path d="M0.666748 7.99996C0.666748 7.63177 0.965225 7.33329 1.33341 7.33329H2.66675C3.03494 7.33329 3.33341 7.63177 3.33341 7.99996C3.33341 8.36815 3.03494 8.66663 2.66675 8.66663H1.33341C0.965225 8.66663 0.666748 8.36815 0.666748 7.99996Z" fill="#FB6514"/>
+<path d="M13.3334 7.33329C12.9652 7.33329 12.6667 7.63177 12.6667 7.99996C12.6667 8.36815 12.9652 8.66663 13.3334 8.66663H14.6667C15.0349 8.66663 15.3334 8.36815 15.3334 7.99996C15.3334 7.63177 15.0349 7.33329 14.6667 7.33329H13.3334Z" fill="#FB6514"/>
+<path d="M12.2426 11.2997C11.9823 11.0394 11.5602 11.0394 11.2998 11.2997C11.0395 11.5601 11.0395 11.9822 11.2998 12.2425L12.2426 13.1853C12.503 13.4457 12.9251 13.4457 13.1855 13.1853C13.4458 12.925 13.4458 12.5029 13.1855 12.2425L12.2426 11.2997Z" fill="#FB6514"/>
+<path d="M13.1855 3.75733C13.4458 3.49698 13.4458 3.07487 13.1855 2.81452C12.9251 2.55418 12.503 2.55418 12.2426 2.81452L11.2998 3.75733C11.0395 4.01768 11.0395 4.43979 11.2998 4.70014C11.5602 4.96049 11.9823 4.96049 12.2426 4.70014L13.1855 3.75733Z" fill="#FB6514"/>
+<path d="M8.00008 12.6666C8.36827 12.6666 8.66675 12.9651 8.66675 13.3333V14.6666C8.66675 15.0348 8.36827 15.3333 8.00008 15.3333C7.63189 15.3333 7.33341 15.0348 7.33341 14.6666V13.3333C7.33341 12.9651 7.63189 12.6666 8.00008 12.6666Z" fill="#FB6514"/>
+<path d="M4.7001 12.2425C4.96045 11.9822 4.96045 11.5601 4.7001 11.2997C4.43975 11.0394 4.01764 11.0394 3.75729 11.2997L2.81448 12.2425C2.55413 12.5029 2.55413 12.925 2.81448 13.1853C3.07483 13.4457 3.49694 13.4457 3.75729 13.1853L4.7001 12.2425Z" fill="#FB6514"/>
+<path d="M8.59791 4.37154C8.48559 4.14401 8.25385 3.99996 8.0001 3.99996C7.74635 3.99996 7.51461 4.14401 7.4023 4.37154L6.52726 6.14427L4.57035 6.4303C4.31931 6.46699 4.11085 6.643 4.0326 6.88434C3.95435 7.12567 4.01987 7.39051 4.20161 7.56753L5.61709 8.9462L5.28303 10.8939C5.24013 11.1441 5.34296 11.3968 5.54828 11.546C5.7536 11.6951 6.02579 11.7148 6.2504 11.5967L8.0001 10.6765L9.7498 11.5967C9.97441 11.7148 10.2466 11.6951 10.4519 11.546C10.6572 11.3968 10.7601 11.1441 10.7172 10.8939L10.3831 8.9462L11.7986 7.56753C11.9803 7.39051 12.0458 7.12567 11.9676 6.88434C11.8893 6.643 11.6809 6.46699 11.4299 6.4303L9.47294 6.14427L8.59791 4.37154Z" fill="#FB6514"/>
+</svg>
diff --git a/app/components/datasets/create/assets/star.svg b/app/components/datasets/create/assets/star.svg
new file mode 100644
index 0000000..3ffda57
--- /dev/null
+++ b/app/components/datasets/create/assets/star.svg
@@ -0,0 +1,11 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M6 0.5C6.27614 0.5 6.5 0.723858 6.5 1V2C6.5 2.27614 6.27614 2.5 6 2.5C5.72386 2.5 5.5 2.27614 5.5 2V1C5.5 0.723858 5.72386 0.5 6 0.5Z" fill="#FB6514"/>
+<path d="M2.81791 2.11092C2.62265 1.91566 2.30606 1.91566 2.1108 2.11092C1.91554 2.30619 1.91554 2.62277 2.1108 2.81803L2.81791 3.52514C3.01317 3.7204 3.32975 3.7204 3.52502 3.52514C3.72028 3.32988 3.72028 3.01329 3.52502 2.81803L2.81791 2.11092Z" fill="#FB6514"/>
+<path d="M0.5 6C0.5 5.72386 0.723858 5.5 1 5.5H2C2.27614 5.5 2.5 5.72386 2.5 6C2.5 6.27614 2.27614 6.5 2 6.5H1C0.723858 6.5 0.5 6.27614 0.5 6Z" fill="#FB6514"/>
+<path d="M10 5.5C9.72386 5.5 9.5 5.72386 9.5 6C9.5 6.27614 9.72386 6.5 10 6.5H11C11.2761 6.5 11.5 6.27614 11.5 6C11.5 5.72386 11.2761 5.5 11 5.5H10Z" fill="#FB6514"/>
+<path d="M9.18192 8.47482C8.98666 8.27955 8.67008 8.27955 8.47482 8.47482C8.27955 8.67008 8.27955 8.98666 8.47482 9.18192L9.18192 9.88903C9.37718 10.0843 9.69377 10.0843 9.88903 9.88903C10.0843 9.69377 10.0843 9.37718 9.88903 9.18192L9.18192 8.47482Z" fill="#FB6514"/>
+<path d="M9.88903 2.81803C10.0843 2.62277 10.0843 2.30619 9.88903 2.11092C9.69377 1.91566 9.37718 1.91566 9.18192 2.11092L8.47482 2.81803C8.27955 3.01329 8.27955 3.32988 8.47482 3.52514C8.67008 3.7204 8.98666 3.7204 9.18192 3.52514L9.88903 2.81803Z" fill="#FB6514"/>
+<path d="M6 9.5C6.27614 9.5 6.5 9.72386 6.5 10V11C6.5 11.2761 6.27614 11.5 6 11.5C5.72386 11.5 5.5 11.2761 5.5 11V10C5.5 9.72386 5.72386 9.5 6 9.5Z" fill="#FB6514"/>
+<path d="M3.52502 9.18192C3.72028 8.98666 3.72028 8.67008 3.52502 8.47482C3.32975 8.27955 3.01317 8.27955 2.81791 8.47482L2.1108 9.18192C1.91554 9.37718 1.91554 9.69377 2.1108 9.88903C2.30606 10.0843 2.62265 10.0843 2.81791 9.88903L3.52502 9.18192Z" fill="#FB6514"/>
+<path d="M6.44837 3.27869C6.36413 3.10804 6.19032 3 6.00001 3C5.8097 3 5.6359 3.10804 5.55166 3.27869L4.89538 4.60823L3.4277 4.82276C3.23942 4.85028 3.08308 4.98228 3.02439 5.16328C2.9657 5.34429 3.01484 5.54291 3.15115 5.67568L4.21275 6.70968L3.96221 8.17048C3.93004 8.35807 4.00716 8.54766 4.16115 8.65953C4.31514 8.77139 4.51928 8.78613 4.68774 8.69754L6.00001 8.00742L7.31229 8.69754C7.48075 8.78613 7.68489 8.77139 7.83888 8.65953C7.99287 8.54766 8.06999 8.35807 8.03782 8.17048L7.78728 6.70968L8.84888 5.67568C8.98519 5.54291 9.03433 5.34429 8.97564 5.16328C8.91695 4.98228 8.76061 4.85028 8.57233 4.82276L7.10465 4.60823L6.44837 3.27869Z" fill="#FB6514"/>
+</svg>
diff --git a/app/components/datasets/create/assets/trash.svg b/app/components/datasets/create/assets/trash.svg
new file mode 100644
index 0000000..00c2989
--- /dev/null
+++ b/app/components/datasets/create/assets/trash.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M6 2H10M2 4H14M12.6667 4L12.1991 11.0129C12.129 12.065 12.0939 12.5911 11.8667 12.99C11.6666 13.3412 11.3648 13.6235 11.0011 13.7998C10.588 14 10.0607 14 9.00623 14H6.99377C5.93927 14 5.41202 14 4.99889 13.7998C4.63517 13.6235 4.33339 13.3412 4.13332 12.99C3.90607 12.5911 3.871 12.065 3.80086 11.0129L3.33333 4M6.66667 7V10.3333M9.33333 7V10.3333" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/create/assets/txt.svg b/app/components/datasets/create/assets/txt.svg
new file mode 100644
index 0000000..d1b6a8c
--- /dev/null
+++ b/app/components/datasets/create/assets/txt.svg
@@ -0,0 +1,23 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3055_14432)">
+<path d="M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z" fill="#E3E5E8"/>
+<path d="M4.25 7.73349C4.25 6.60926 4.25019 5.78113 4.30367 5.12666C4.3569 4.47511 4.46169 4.01774 4.65873 3.63103C5.01825 2.92542 5.59193 2.35175 6.29754 1.99222C6.68424 1.79518 7.14162 1.6904 7.79317 1.63716C8.44763 1.58369 9.27577 1.5835 10.4 1.5835H18.5631L27.75 10.7704V24.2668C27.75 25.3911 27.7498 26.2192 27.6963 26.8737C27.6431 27.5252 27.5383 27.9826 27.3413 28.3693C26.9817 29.0749 26.4081 29.6486 25.7025 30.0081C25.3158 30.2051 24.8584 30.3099 24.2068 30.3632C23.5524 30.4166 22.7242 30.4168 21.6 30.4168H10.4C9.27577 30.4168 8.44763 30.4166 7.79317 30.3632C7.14162 30.3099 6.68424 30.2051 6.29754 30.0081C5.59193 29.6486 5.01825 29.0749 4.65873 28.3693C4.46169 27.9826 4.3569 27.5252 4.30367 26.8737C4.25019 26.2192 4.25 25.3911 4.25 24.2668V7.73349Z" stroke="black" stroke-opacity="0.03" stroke-width="0.5"/>
+</g>
+<g opacity="0.96">
+<path d="M13.2254 19.5522V18.3042H9.02539V19.5522H10.4254V24.0002H11.8254V19.5522H13.2254Z" fill="#667085"/>
+<path d="M18.5371 24.0002L16.7611 21.0802L18.4251 18.3042H16.8331L16.0011 19.9122L15.1691 18.3042H13.5771L15.2411 21.0802L13.4651 24.0002H15.0651L16.0011 22.2482L16.9371 24.0002H18.5371Z" fill="#667085"/>
+<path d="M22.9754 19.5522V18.3042H18.7754V19.5522H20.1754V24.0002H21.5754V19.5522H22.9754Z" fill="#667085"/>
+</g>
+<path opacity="0.5" d="M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3055_14432" x="2" y="0.333496" width="28" height="33.3335" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3055_14432"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3055_14432" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/unknown.svg b/app/components/datasets/create/assets/unknown.svg
new file mode 100644
index 0000000..6daa243
--- /dev/null
+++ b/app/components/datasets/create/assets/unknown.svg
@@ -0,0 +1,23 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3055_14436)">
+<path d="M4 7.73349C4 5.49329 4 4.37318 4.43597 3.51753C4.81947 2.76489 5.43139 2.15296 6.18404 1.76947C7.03969 1.3335 8.15979 1.3335 10.4 1.3335H18.6667L28 10.6668V24.2668C28 26.507 28 27.6271 27.564 28.4828C27.1805 29.2354 26.5686 29.8474 25.816 30.2309C24.9603 30.6668 23.8402 30.6668 21.6 30.6668H10.4C8.15979 30.6668 7.03969 30.6668 6.18404 30.2309C5.43139 29.8474 4.81947 29.2354 4.43597 28.4828C4 27.6271 4 26.507 4 24.2668V7.73349Z" fill="#E3E5E8"/>
+<path d="M4.25 7.73349C4.25 6.60926 4.25019 5.78113 4.30367 5.12666C4.3569 4.47511 4.46169 4.01774 4.65873 3.63103C5.01825 2.92542 5.59193 2.35175 6.29754 1.99222C6.68424 1.79518 7.14162 1.6904 7.79317 1.63716C8.44763 1.58369 9.27577 1.5835 10.4 1.5835H18.5631L27.75 10.7704V24.2668C27.75 25.3911 27.7498 26.2192 27.6963 26.8737C27.6431 27.5252 27.5383 27.9826 27.3413 28.3693C26.9817 29.0749 26.4081 29.6486 25.7025 30.0081C25.3158 30.2051 24.8584 30.3099 24.2068 30.3632C23.5524 30.4166 22.7242 30.4168 21.6 30.4168H10.4C9.27577 30.4168 8.44763 30.4166 7.79317 30.3632C7.14162 30.3099 6.68424 30.2051 6.29754 30.0081C5.59193 29.6486 5.01825 29.0749 4.65873 28.3693C4.46169 27.9826 4.3569 27.5252 4.30367 26.8737C4.25019 26.2192 4.25 25.3911 4.25 24.2668V7.73349Z" stroke="black" stroke-opacity="0.03" stroke-width="0.5"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M15.9998 23.1992C15.8014 23.1992 15.6039 23.1968 15.4077 23.1924V24.0549C15.4077 24.3819 15.6728 24.647 15.9998 24.647C16.3268 24.647 16.592 24.3819 16.592 24.0549V23.1924C16.3957 23.1968 16.1983 23.1992 15.9998 23.1992Z" fill="#98A2B3"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.0984 22.8838L11.757 23.8593C11.649 24.168 11.8117 24.5058 12.1203 24.6138C12.185 24.6364 12.251 24.6472 12.3159 24.6472C12.5605 24.6472 12.7894 24.4944 12.8747 24.2505L13.2936 23.0534C12.8807 23.0073 12.481 22.9506 12.0984 22.8838Z" fill="#98A2B3"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M20.2431 23.8593L19.9018 22.8838C19.5192 22.9506 19.1195 23.0073 18.7065 23.0534L19.1254 24.2505C19.2108 24.4944 19.4396 24.6472 19.6843 24.6472C19.7491 24.6472 19.8151 24.6364 19.8798 24.6138C20.1885 24.5058 20.3511 24.168 20.2431 23.8593Z" fill="#98A2B3"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M20.1624 17.2634C20.2697 17.6416 20.3254 18.0369 20.3254 18.4409C20.3254 18.9087 20.05 19.3327 19.6226 19.5228C19.5564 19.5522 17.9801 20.2436 16.0359 20.2436C14.0917 20.2436 12.5153 19.5522 12.4492 19.5228C12.0218 19.3327 11.7464 18.9086 11.7464 18.4409C11.7464 18.0312 11.8037 17.6305 11.914 17.2476C10.3343 17.5645 8.5 18.2009 8.5 19.4464C8.5 20.2859 9.32512 20.9477 10.9525 21.4134C11.4194 21.547 11.9381 21.66 12.4949 21.7506C12.8783 21.813 13.28 21.8648 13.6953 21.9056C14.2455 21.9597 14.8197 21.9942 15.4079 22.0082C15.6039 22.0128 15.8013 22.0153 16 22.0153C16.1987 22.0153 16.3962 22.0128 16.5921 22.0082C17.1803 21.9943 17.7545 21.9596 18.3047 21.9056C18.72 21.8648 19.1217 21.8131 19.5051 21.7506C20.062 21.66 20.5807 21.547 21.0476 21.4134C22.6749 20.9477 23.5 20.2859 23.5 19.4464C23.5 18.2187 21.7108 17.5833 20.1624 17.2634Z" fill="#98A2B3"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M18.8441 17.1144C18.7585 16.9335 18.6559 16.7622 18.5384 16.6025C18.4174 16.4382 18.2809 16.286 18.1307 16.1486C17.5784 15.6437 16.8433 15.3354 16.036 15.3354C15.2318 15.3354 14.499 15.6411 13.9476 16.1426C13.7974 16.2791 13.6609 16.4303 13.5399 16.5937C13.4217 16.753 13.3185 16.924 13.2322 17.1048C13.039 17.5095 12.9307 17.9624 12.9307 18.4407C12.9307 18.4407 14.321 19.0592 16.036 19.0592C17.751 19.0592 19.1412 18.4407 19.1412 18.4407C19.1412 17.9662 19.0344 17.5167 18.8441 17.1144Z" fill="#98A2B3"/>
+<path opacity="0.5" d="M18.6665 1.3335L27.9998 10.6668H21.3332C19.8604 10.6668 18.6665 9.47292 18.6665 8.00016V1.3335Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3055_14436" x="2" y="0.333496" width="28" height="33.3335" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3055_14436"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3055_14436" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/upload-cloud-01.svg b/app/components/datasets/create/assets/upload-cloud-01.svg
new file mode 100644
index 0000000..4df53cf
--- /dev/null
+++ b/app/components/datasets/create/assets/upload-cloud-01.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.4" d="M4 16.2422C2.79401 15.435 2 14.0602 2 12.5C2 10.1564 3.79151 8.23129 6.07974 8.01937C6.54781 5.17213 9.02024 3 12 3C14.9798 3 17.4522 5.17213 17.9203 8.01937C20.2085 8.23129 22 10.1564 22 12.5C22 14.0602 21.206 15.435 20 16.2422" stroke="#344054" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M8 16L12 12M12 12L16 16M12 12L12 21" stroke="#344054" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/create/assets/watercrawl.svg b/app/components/datasets/create/assets/watercrawl.svg
new file mode 100644
index 0000000..bd4e6ba
--- /dev/null
+++ b/app/components/datasets/create/assets/watercrawl.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+    <path style="fill: rgb(0, 23, 87); stroke: rgb(13, 14, 52);" d="M 247.794 213.903 L 246.81 76.976 L 254.345 76.963 L 254.592 213.989 L 247.794 213.903 Z"/>
+    <ellipse style="fill: rgb(0, 23, 87); stroke: rgb(0, 23, 87);" cx="250.025" cy="43.859" rx="33.966" ry="33.906"/>
+    <path style="fill: rgb(30, 141, 166); stroke: rgb(30, 141, 166);" d="M 282.472 260.389 L 414.181 330.253 L 410.563 336.234 L 279.38 265.739 L 282.472 260.389 Z"/>
+    <path style="fill: rgb(15, 17, 57); stroke: rgb(13, 14, 52);" d="M 255.105 281.394 L 254.485 417.656 L 246.156 417.691 L 246.688 280.51 L 255.105 281.394 Z"/>
+    <path style="paint-order: fill; fill: rgb(30, 141, 166); stroke: rgb(30, 141, 166);" d="M 279.486 229.517 L 410.351 160.07 L 413.923 167.04 L 283.727 235.998 L 279.486 229.517 Z"/>
+    <path style="fill: rgb(15, 164, 161); stroke: rgb(15, 164, 161);" d="M 88.545 164.884 L 219.797 236.07 L 222.867 229.568 L 90.887 159.47 L 88.545 164.884 Z"/>
+    <path style="fill: rgb(15, 164, 161); stroke: rgb(15, 164, 161);" d="M 224.76 266.9 L 95.55 334.829 L 92.878 328.37 L 219.955 261.275 L 224.76 266.9 Z"/>
+    <ellipse style="paint-order: fill; fill: rgb(2, 181, 225); stroke: rgb(2, 181, 225);" cx="251.242" cy="247.466" rx="33.966" ry="33.906"/>
+    <path style="fill: rgb(13, 14, 52); stroke: rgb(13, 14, 52);" d="M 279.502 433.617 L 408.666 359.443 C 408.666 359.443 412.398 366.965 412.398 366.916 C 412.398 366.867 281.544 440.217 281.544 440.217 L 279.502 433.617 Z"/>
+    <path style="fill: rgb(13, 14, 52); stroke: rgb(13, 14, 52);" d="M 223.119 431.408 L 96.643 361.068 L 93.265 368.047 L 218.895 438.099 L 223.119 431.408 Z"/>
+    <ellipse style="fill: rgb(0, 23, 87); stroke: rgb(0, 23, 87);" cx="250.504" cy="451.168" rx="33.966" ry="33.906"/>
+    <path style="fill: rgb(90, 191, 187); stroke: rgb(90, 191, 187);" d="M 435.665 180.895 L 435.859 316.869 L 443.103 315.579 L 442.56 180.697 L 435.665 180.895 Z"/>
+    <ellipse style="fill: rgb(0, 23, 87); stroke: rgb(0, 23, 87);" cx="441.06" cy="349.665" rx="33.966" ry="33.906"/>
+    <ellipse style="fill: rgb(2, 181, 225); stroke: rgb(2, 181, 225);" cx="441.512" cy="147.767" rx="33.966" ry="33.906"/>
+    <path style="fill: rgb(84, 187, 181); stroke: rgb(84, 187, 181);" d="M 64.755 314.523 L 57.928 315.006 L 58.307 182.961 L 65.169 182.865 L 64.755 314.523 Z"/>
+    <ellipse style="fill: rgb(0, 23, 87); stroke: rgb(0, 23, 87);" cx="58.177" cy="149.757" rx="33.966" ry="33.906"/>
+    <ellipse style="fill: rgb(61, 224, 203); stroke: rgb(61, 224, 203);" cx="65.909" cy="348.17" rx="33.966" ry="33.906"/>
+</svg>
diff --git a/app/components/datasets/create/assets/web.svg b/app/components/datasets/create/assets/web.svg
new file mode 100644
index 0000000..a9bac51
--- /dev/null
+++ b/app/components/datasets/create/assets/web.svg
@@ -0,0 +1,4 @@
+<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.06124 2.21694C7.57213 2.07545 8.11041 1.99984 8.66634 1.99984C9.97432 1.99984 11.1845 2.41837 12.1704 3.12881C11.6459 3.4755 11.2546 3.85196 10.9834 4.25446C10.569 4.86947 10.4628 5.50546 10.5486 6.08575C10.632 6.64928 10.8907 7.13053 11.1627 7.48656C11.4265 7.83177 11.7501 8.12048 12.0351 8.26293C12.7526 8.62164 13.5806 8.80129 14.1996 8.89387C14.7596 8.97762 15.9468 9.2579 15.9907 8.36596C15.9967 8.24461 15.9997 8.12255 15.9997 7.99984C15.9997 3.94975 12.7164 0.666504 8.66634 0.666504C4.61625 0.666504 1.33301 3.94975 1.33301 7.99984C1.33301 12.0499 4.61625 15.3332 8.66634 15.3332C8.78906 15.3332 8.91112 15.3301 9.03246 15.3242C9.40021 15.3061 9.68364 14.9933 9.66553 14.6255C9.64743 14.2578 9.33463 13.9743 8.96689 13.9925C8.86737 13.9974 8.76717 13.9998 8.66634 13.9998C6.32676 13.9998 4.29993 12.6608 3.31046 10.7073L3.95617 10.3345L6.33797 10.7803C6.95507 10.8958 7.52471 10.4207 7.52192 9.79289L7.51258 7.69081L8.72983 5.60684C8.92705 5.2692 8.90938 4.84758 8.68459 4.52762L7.06124 2.21694Z" fill="#1570EF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.96344 8.43724C9.71815 8.3442 9.4411 8.40367 9.2556 8.58917C9.07009 8.77467 9.01063 9.05172 9.10367 9.29701L11.2149 14.8629C11.3123 15.1198 11.5575 15.2906 11.8323 15.2931C12.1071 15.2955 12.3552 15.1291 12.4572 14.8739L13.3377 12.6713L15.5403 11.7908C15.7955 11.6888 15.9619 11.4407 15.9595 11.1659C15.9571 10.891 15.7862 10.6459 15.5293 10.5484L9.96344 8.43724Z" fill="#1570EF"/>
+</svg>
diff --git a/app/components/datasets/create/assets/xlsx.svg b/app/components/datasets/create/assets/xlsx.svg
new file mode 100644
index 0000000..2cdf42c
--- /dev/null
+++ b/app/components/datasets/create/assets/xlsx.svg
@@ -0,0 +1,18 @@
+<svg width="24" height="26" viewBox="0 0 24 26" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_5938_927)">
+<path d="M3 5.8C3 4.11984 3 3.27976 3.32698 2.63803C3.6146 2.07354 4.07354 1.6146 4.63803 1.32698C5.27976 1 6.11984 1 7.8 1H14L21 8V18.2C21 19.8802 21 20.7202 20.673 21.362C20.3854 21.9265 19.9265 22.3854 19.362 22.673C18.7202 23 17.8802 23 16.2 23H7.8C6.11984 23 5.27976 23 4.63803 22.673C4.07354 22.3854 3.6146 21.9265 3.32698 21.362C3 20.7202 3 19.8802 3 18.2V5.8Z" fill="#169951"/>
+</g>
+<path opacity="0.5" d="M14 1L21 8H16C14.8954 8 14 7.10457 14 6V1Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M17 12C17.5523 12 18 12.4477 18 13V18C18 18.5523 17.5523 19 17 19H7C6.44772 19 6 18.5523 6 18V13C6 12.4477 6.44772 12 7 12H17ZM11.5 13H7L7 15H11.5V13ZM12.5 18H17V16H12.5V18ZM11.5 16V18H7L7 16H11.5ZM12.5 15H17V13H12.5V15Z" fill="white" fill-opacity="0.96"/>
+<defs>
+<filter id="filter0_d_5938_927" x="1" y="0" width="22" height="26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5938_927"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5938_927" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/app/components/datasets/create/assets/zap-fast.svg b/app/components/datasets/create/assets/zap-fast.svg
new file mode 100644
index 0000000..7c67cf9
--- /dev/null
+++ b/app/components/datasets/create/assets/zap-fast.svg
@@ -0,0 +1,6 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.66675 11.6666C1.66675 11.2985 1.96522 11 2.33341 11H6.00008C6.36827 11 6.66675 11.2985 6.66675 11.6666C6.66675 12.0348 6.36827 12.3333 6.00008 12.3333H2.33341C1.96522 12.3333 1.66675 12.0348 1.66675 11.6666Z" fill="#7839EE"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.666748 7.99997C0.666748 7.63178 0.965225 7.33331 1.33341 7.33331H4.33341C4.7016 7.33331 5.00008 7.63178 5.00008 7.99997C5.00008 8.36816 4.7016 8.66664 4.33341 8.66664H1.33341C0.965225 8.66664 0.666748 8.36816 0.666748 7.99997Z" fill="#7839EE"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.00008 4.33331C2.00008 3.96512 2.29856 3.66664 2.66675 3.66664H6.00008C6.36827 3.66664 6.66675 3.96512 6.66675 4.33331C6.66675 4.7015 6.36827 4.99997 6.00008 4.99997H2.66675C2.29856 4.99997 2.00008 4.7015 2.00008 4.33331Z" fill="#7839EE"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M11.5785 1.37998C11.8632 1.49253 12.0347 1.78458 11.9942 2.08808L11.4282 6.33331H13.9637C13.9714 6.33331 13.979 6.33331 13.9867 6.3333C14.1339 6.33327 14.2864 6.33324 14.4124 6.34476C14.5363 6.35609 14.7618 6.38612 14.9633 6.54167C15.1984 6.72308 15.3407 6.99955 15.3517 7.29625C15.3611 7.55067 15.2545 7.7516 15.1917 7.85904C15.1278 7.96825 15.0391 8.09234 14.9536 8.21207C14.9491 8.21833 14.9446 8.22457 14.9402 8.23079L10.5426 14.3875C10.3646 14.6366 10.0398 14.7325 9.75503 14.62C9.47027 14.5074 9.29879 14.2154 9.33926 13.9119L9.90529 9.66664H7.36978C7.36213 9.66664 7.35447 9.66664 7.34679 9.66664C7.19962 9.66668 7.0471 9.66671 6.92111 9.65519C6.79717 9.64386 6.5717 9.61383 6.37015 9.45828C6.13511 9.27687 5.99283 9.0004 5.98183 8.7037C5.9724 8.44928 6.07901 8.24835 6.14183 8.14091C6.20569 8.0317 6.29437 7.9076 6.37993 7.78787C6.3844 7.78162 6.38886 7.77538 6.3933 7.76915L10.7909 1.61248C10.9689 1.36332 11.2937 1.26743 11.5785 1.37998Z" fill="#7839EE"/>
+</svg>
diff --git a/app/components/datasets/create/embedding-process/index.module.css b/app/components/datasets/create/embedding-process/index.module.css
new file mode 100644
index 0000000..f2ab4d8
--- /dev/null
+++ b/app/components/datasets/create/embedding-process/index.module.css
@@ -0,0 +1,89 @@
+.progressContainer {
+  @apply relative pb-4 w-full;
+  border-bottom: 0.5px solid #EAECF0;
+}
+.sourceItem {
+  position: relative;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 4px;
+  padding: 0 4px;
+  height: 24px;
+  background: #EFF4FF;
+  border-radius: 6px;
+  overflow: hidden;
+}
+
+.sourceItem .info .name {
+  font-weight: 500;
+  font-size: 12px;
+  line-height: 18px;
+  color: #101828;
+}
+.sourceItem.success .info .name {
+  color: #05603A;
+}
+.sourceItem .percent {
+  font-weight: 500;
+  font-size: 12px;
+  line-height: 18px;
+  color: #344054;
+  z-index: 1;
+}
+.sourceItem .error {
+  color: #D92D20;
+}
+.sourceItem .success {
+  color: #05603A;
+}
+
+.commonIcon {
+  @apply w-3 h-3 mr-1 inline-block align-middle;
+}
+.highIcon {
+  mask-image: url(../assets/star.svg);
+  @apply bg-orange-500;
+}
+.economyIcon {
+  background-color: #444ce7;
+  mask-image: url(../assets/normal.svg);
+}
+.tokens {
+  @apply text-xs font-medium px-1;
+}
+.price {
+  color: #f79009;
+  @apply text-xs font-medium;
+}
+
+.unknownFileIcon {
+  background-image: url(../assets/unknown.svg);
+}
+.csv {
+  background-image: url(../assets/csv.svg);
+}
+.docx {
+  background-image: url(../assets/docx.svg);
+}
+.xlsx,
+.xls {
+  background-image: url(../assets/xlsx.svg);
+}
+.pdf {
+  background-image: url(../assets/pdf.svg);
+}
+.html,
+.htm {
+  background-image: url(../assets/html.svg);
+}
+.md,
+.markdown {
+  background-image: url(../assets/md.svg);
+}
+.txt {
+  background-image: url(../assets/txt.svg);
+}
+.json {
+  background-image: url(../assets/json.svg);
+}
diff --git a/app/components/datasets/create/embedding-process/index.tsx b/app/components/datasets/create/embedding-process/index.tsx
new file mode 100644
index 0000000..2890670
--- /dev/null
+++ b/app/components/datasets/create/embedding-process/index.tsx
@@ -0,0 +1,357 @@
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import useSWR from 'swr'
+import { useRouter } from 'next/navigation'
+import { useTranslation } from 'react-i18next'
+import { omit } from 'lodash-es'
+import { ArrowRightIcon } from '@heroicons/react/24/solid'
+import {
+  RiCheckboxCircleFill,
+  RiErrorWarningFill,
+  RiLoader2Fill,
+  RiTerminalBoxLine,
+} from '@remixicon/react'
+import Image from 'next/image'
+import { indexMethodIcon, retrievalIcon } from '../icons'
+import { IndexingType } from '../step-two'
+import DocumentFileIcon from '../../common/document-file-icon'
+import cn from '@/utils/classnames'
+import { FieldInfo } from '@/app/components/datasets/documents/detail/metadata'
+import Button from '@/app/components/base/button'
+import type { FullDocumentDetail, IndexingStatusResponse, ProcessRuleResponse } from '@/models/datasets'
+import { fetchIndexingStatusBatch as doFetchIndexingStatus, fetchProcessRule } from '@/service/datasets'
+import { DataSourceType, ProcessMode } from '@/models/datasets'
+import NotionIcon from '@/app/components/base/notion-icon'
+import PriorityLabel from '@/app/components/billing/priority-label'
+import { Plan } from '@/app/components/billing/type'
+import { ZapFast } from '@/app/components/base/icons/src/vender/solid/general'
+import UpgradeBtn from '@/app/components/billing/upgrade-btn'
+import { useProviderContext } from '@/context/provider-context'
+import { sleep } from '@/utils'
+import { RETRIEVE_METHOD } from '@/types/app'
+import Tooltip from '@/app/components/base/tooltip'
+import { useInvalidDocumentList } from '@/service/knowledge/use-document'
+
+type Props = {
+  datasetId: string
+  batchId: string
+  documents?: FullDocumentDetail[]
+  indexingType?: string
+  retrievalMethod?: string
+}
+
+const RuleDetail: FC<{
+  sourceData?: ProcessRuleResponse
+  indexingType?: string
+  retrievalMethod?: string
+}> = ({ sourceData, indexingType, retrievalMethod }) => {
+  const { t } = useTranslation()
+
+  const segmentationRuleMap = {
+    mode: t('datasetDocuments.embedding.mode'),
+    segmentLength: t('datasetDocuments.embedding.segmentLength'),
+    textCleaning: t('datasetDocuments.embedding.textCleaning'),
+  }
+
+  const getRuleName = (key: string) => {
+    if (key === 'remove_extra_spaces')
+      return t('datasetCreation.stepTwo.removeExtraSpaces')
+
+    if (key === 'remove_urls_emails')
+      return t('datasetCreation.stepTwo.removeUrlEmails')
+
+    if (key === 'remove_stopwords')
+      return t('datasetCreation.stepTwo.removeStopwords')
+  }
+
+  const isNumber = (value: unknown) => {
+    return typeof value === 'number'
+  }
+
+  const getValue = useCallback((field: string) => {
+    let value: string | number | undefined = '-'
+    const maxTokens = isNumber(sourceData?.rules?.segmentation?.max_tokens)
+      ? sourceData.rules.segmentation.max_tokens
+      : value
+    const childMaxTokens = isNumber(sourceData?.rules?.subchunk_segmentation?.max_tokens)
+      ? sourceData.rules.subchunk_segmentation.max_tokens
+      : value
+    switch (field) {
+      case 'mode':
+        value = !sourceData?.mode
+          ? value
+          : sourceData.mode === ProcessMode.general
+            ? (t('datasetDocuments.embedding.custom') as string)
+            : `${t('datasetDocuments.embedding.hierarchical')} 路 ${sourceData?.rules?.parent_mode === 'paragraph'
+              ? t('dataset.parentMode.paragraph')
+              : t('dataset.parentMode.fullDoc')}`
+        break
+      case 'segmentLength':
+        value = !sourceData?.mode
+          ? value
+          : sourceData.mode === ProcessMode.general
+            ? maxTokens
+            : `${t('datasetDocuments.embedding.parentMaxTokens')} ${maxTokens}; ${t('datasetDocuments.embedding.childMaxTokens')} ${childMaxTokens}`
+        break
+      default:
+        value = !sourceData?.mode
+          ? value
+          : sourceData?.rules?.pre_processing_rules?.filter(rule =>
+            rule.enabled).map(rule => getRuleName(rule.id)).join(',')
+        break
+    }
+    return value
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [sourceData])
+
+  return <div className='flex flex-col gap-1'>
+    {Object.keys(segmentationRuleMap).map((field) => {
+      return <FieldInfo
+        key={field}
+        label={segmentationRuleMap[field as keyof typeof segmentationRuleMap]}
+        displayedValue={String(getValue(field))}
+      />
+    })}
+    <FieldInfo
+      label={t('datasetCreation.stepTwo.indexMode')}
+      displayedValue={t(`datasetCreation.stepTwo.${indexingType === IndexingType.ECONOMICAL ? 'economical' : 'qualified'}`) as string}
+      valueIcon={
+        <Image
+          className='size-4'
+          src={
+            indexingType === IndexingType.ECONOMICAL
+              ? indexMethodIcon.economical
+              : indexMethodIcon.high_quality
+          }
+          alt=''
+        />
+      }
+    />
+    <FieldInfo
+      label={t('datasetSettings.form.retrievalSetting.title')}
+      // displayedValue={t(`datasetSettings.form.retrievalSetting.${retrievalMethod}`) as string}
+      displayedValue={t(`dataset.retrieval.${indexingType === IndexingType.ECONOMICAL ? 'invertedIndex' : retrievalMethod}.title`) as string}
+      valueIcon={
+        <Image
+          className='size-4'
+          src={
+            retrievalMethod === RETRIEVE_METHOD.fullText
+              ? retrievalIcon.fullText
+              : retrievalMethod === RETRIEVE_METHOD.hybrid
+                ? retrievalIcon.hybrid
+                : retrievalIcon.vector
+          }
+          alt=''
+        />
+      }
+    />
+  </div>
+}
+
+const EmbeddingProcess: FC<Props> = ({ datasetId, batchId, documents = [], indexingType, retrievalMethod }) => {
+  const { t } = useTranslation()
+  const { enableBilling, plan } = useProviderContext()
+
+  const getFirstDocument = documents[0]
+
+  const [indexingStatusBatchDetail, setIndexingStatusDetail] = useState<IndexingStatusResponse[]>([])
+  const fetchIndexingStatus = async () => {
+    const status = await doFetchIndexingStatus({ datasetId, batchId })
+    setIndexingStatusDetail(status.data)
+    return status.data
+  }
+
+  const [isStopQuery, setIsStopQuery] = useState(false)
+  const isStopQueryRef = useRef(isStopQuery)
+  useEffect(() => {
+    isStopQueryRef.current = isStopQuery
+  }, [isStopQuery])
+  const stopQueryStatus = () => {
+    setIsStopQuery(true)
+  }
+
+  const startQueryStatus = async () => {
+    if (isStopQueryRef.current)
+      return
+
+    try {
+      const indexingStatusBatchDetail = await fetchIndexingStatus()
+      const isCompleted = indexingStatusBatchDetail.every(indexingStatusDetail => ['completed', 'error', 'paused'].includes(indexingStatusDetail.indexing_status))
+      if (isCompleted) {
+        stopQueryStatus()
+        return
+      }
+      await sleep(2500)
+      await startQueryStatus()
+    }
+    catch {
+      await sleep(2500)
+      await startQueryStatus()
+    }
+  }
+
+  useEffect(() => {
+    setIsStopQuery(false)
+    startQueryStatus()
+    return () => {
+      stopQueryStatus()
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  // get rule
+  const { data: ruleDetail } = useSWR({
+    action: 'fetchProcessRule',
+    params: { documentId: getFirstDocument.id },
+  }, apiParams => fetchProcessRule(omit(apiParams, 'action')), {
+    revalidateOnFocus: false,
+  })
+
+  const router = useRouter()
+  const invalidDocumentList = useInvalidDocumentList()
+  const navToDocumentList = () => {
+    invalidDocumentList()
+    router.push(`/datasets/${datasetId}/documents`)
+  }
+  const navToApiDocs = () => {
+    router.push('/datasets?category=api')
+  }
+
+  const isEmbedding = useMemo(() => {
+    return indexingStatusBatchDetail.some(indexingStatusDetail => ['indexing', 'splitting', 'parsing', 'cleaning'].includes(indexingStatusDetail?.indexing_status || ''))
+  }, [indexingStatusBatchDetail])
+  const isEmbeddingCompleted = useMemo(() => {
+    return indexingStatusBatchDetail.every(indexingStatusDetail => ['completed', 'error', 'paused'].includes(indexingStatusDetail?.indexing_status || ''))
+  }, [indexingStatusBatchDetail])
+
+  const getSourceName = (id: string) => {
+    const doc = documents.find(document => document.id === id)
+    return doc?.name
+  }
+  const getFileType = (name?: string) => name?.split('.').pop() || 'txt'
+  const getSourcePercent = (detail: IndexingStatusResponse) => {
+    const completedCount = detail.completed_segments || 0
+    const totalCount = detail.total_segments || 0
+    if (totalCount === 0)
+      return 0
+    const percent = Math.round(completedCount * 100 / totalCount)
+    return percent > 100 ? 100 : percent
+  }
+  const getSourceType = (id: string) => {
+    const doc = documents.find(document => document.id === id)
+    return doc?.data_source_type as DataSourceType
+  }
+
+  const getIcon = (id: string) => {
+    const doc = documents.find(document => document.id === id)
+
+    return doc?.data_source_info.notion_page_icon
+  }
+  const isSourceEmbedding = (detail: IndexingStatusResponse) =>
+    ['indexing', 'splitting', 'parsing', 'cleaning', 'waiting'].includes(detail.indexing_status || '')
+
+  return (
+    <>
+      <div className="mb-3 flex h-5 items-center">
+        <div className="mr-2 flex items-center justify-between text-sm font-medium text-text-secondary">
+          {isEmbedding && <div className='flex items-center'>
+            <RiLoader2Fill className='mr-1 size-4 animate-spin text-text-secondary' />
+            {t('datasetDocuments.embedding.processing')}
+          </div>}
+          {isEmbeddingCompleted && t('datasetDocuments.embedding.completed')}
+        </div>
+      </div>
+      {
+        enableBilling && plan.type !== Plan.team && (
+          <div className='mb-3 flex h-14 items-center rounded-xl border-[0.5px] border-black/5 bg-white p-3 shadow-md'>
+            <div className='flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-[#FFF6ED]'>
+              <ZapFast className='h-4 w-4 text-[#FB6514]' />
+            </div>
+            <div className='mx-3 grow text-[13px] font-medium text-gray-700'>
+              {t('billing.plansCommon.documentProcessingPriorityUpgrade')}
+            </div>
+            <UpgradeBtn loc='knowledge-speed-up' />
+          </div>
+        )
+      }
+      <div className="flex flex-col gap-0.5 pb-2">
+        {indexingStatusBatchDetail.map(indexingStatusDetail => (
+          <div key={indexingStatusDetail.id} className={cn(
+            'relative h-[26px] overflow-hidden rounded-md bg-components-progress-bar-bg',
+            indexingStatusDetail.indexing_status === 'error' && 'bg-state-destructive-hover-alt',
+            // indexingStatusDetail.indexing_status === 'completed' && 's.success',
+          )}>
+            {isSourceEmbedding(indexingStatusDetail) && (
+              <div className="absolute left-0 top-0 h-full min-w-0.5 border-r-[2px] border-r-components-progress-bar-progress-highlight bg-components-progress-bar-progress" style={{ width: `${getSourcePercent(indexingStatusDetail)}%` }} />
+            )}
+            <div className="z-[1] flex h-full items-center gap-1 pl-[6px] pr-2">
+              {getSourceType(indexingStatusDetail.id) === DataSourceType.FILE && (
+                // <div className={cn(
+                //   'shrink-0 marker:size-4 bg-center bg-no-repeat bg-contain',
+                //   s[getFileType(getSourceName(indexingStatusDetail.id))] || s.unknownFileIcon,
+                // )} />
+                <DocumentFileIcon
+                  className="size-4 shrink-0"
+                  name={getSourceName(indexingStatusDetail.id)}
+                  extension={getFileType(getSourceName(indexingStatusDetail.id))}
+                />
+              )}
+              {getSourceType(indexingStatusDetail.id) === DataSourceType.NOTION && (
+                <NotionIcon
+                  className='shrink-0'
+                  type='page'
+                  src={getIcon(indexingStatusDetail.id)}
+                />
+              )}
+              <div className="flex w-0 grow items-center gap-1" title={getSourceName(indexingStatusDetail.id)}>
+                <div className="system-xs-medium truncate text-text-secondary">
+                  {getSourceName(indexingStatusDetail.id)}
+                </div>
+                {
+                  enableBilling && (
+                    <PriorityLabel className='ml-0' />
+                  )
+                }
+              </div>
+              {isSourceEmbedding(indexingStatusDetail) && (
+                <div className="shrink-0 text-xs text-text-secondary">{`${getSourcePercent(indexingStatusDetail)}%`}</div>
+              )}
+              {indexingStatusDetail.indexing_status === 'error' && (
+                <Tooltip
+                  popupClassName='px-4 py-[14px] max-w-60 text-sm leading-4 text-text-secondary border-[0.5px] border-components-panel-border rounded-xl'
+                  offset={4}
+                  popupContent={indexingStatusDetail.error}
+                >
+                  <span>
+                    <RiErrorWarningFill className='size-4 shrink-0 text-text-destructive' />
+                  </span>
+                </Tooltip>
+              )}
+              {indexingStatusDetail.indexing_status === 'completed' && (
+                <RiCheckboxCircleFill className='size-4 shrink-0 text-text-success' />
+              )}
+            </div>
+          </div>
+        ))}
+      </div>
+      <hr className="my-3 h-[1px] border-0 bg-divider-subtle" />
+      <RuleDetail
+        sourceData={ruleDetail}
+        indexingType={indexingType}
+        retrievalMethod={retrievalMethod}
+      />
+      <div className='my-10 flex items-center gap-2'>
+        <Button className='w-fit' onClick={navToApiDocs}>
+          <RiTerminalBoxLine className='mr-2 size-4' />
+          <span>Access the API</span>
+        </Button>
+        <Button className='w-fit' variant='primary' onClick={navToDocumentList}>
+          <span>{t('datasetCreation.stepThree.navTo')}</span>
+          <ArrowRightIcon className='ml-2 size-4 stroke-current stroke-1' />
+        </Button>
+      </div>
+    </>
+  )
+}
+
+export default EmbeddingProcess
diff --git a/app/components/datasets/create/empty-dataset-creation-modal/index.module.css b/app/components/datasets/create/empty-dataset-creation-modal/index.module.css
new file mode 100644
index 0000000..3131c9e
--- /dev/null
+++ b/app/components/datasets/create/empty-dataset-creation-modal/index.module.css
@@ -0,0 +1,35 @@
+.modal {
+  position: relative;
+}
+
+.modalHeader {
+  @apply flex items-center place-content-between h-8;
+}
+.modalHeader .title {
+  @apply grow text-text-primary;
+  font-weight: 600;
+  font-size: 20px;
+  line-height: 32px;
+}
+.modalHeader .close {
+  @apply shrink-0 h-4 w-4 bg-center bg-no-repeat cursor-pointer;
+  background-image: url(../assets/close.svg);
+  background-size: 16px;
+}
+
+.modal .tip {
+  @apply mt-1 mb-8 text-text-tertiary;
+  font-weight: 400;
+  font-size: 13px;
+  line-height: 18px;
+}
+
+.form {
+  @apply mb-8;
+}
+.form .label {
+  @apply mb-2 text-text-primary;
+  font-weight: 500;
+  font-size: 14px;
+  line-height: 20px;
+}
diff --git a/app/components/datasets/create/empty-dataset-creation-modal/index.tsx b/app/components/datasets/create/empty-dataset-creation-modal/index.tsx
new file mode 100644
index 0000000..f9a3584
--- /dev/null
+++ b/app/components/datasets/create/empty-dataset-creation-modal/index.tsx
@@ -0,0 +1,71 @@
+'use client'
+import React, { useState } from 'react'
+import { useRouter } from 'next/navigation'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import s from './index.module.css'
+import cn from '@/utils/classnames'
+import Modal from '@/app/components/base/modal'
+import Input from '@/app/components/base/input'
+import Button from '@/app/components/base/button'
+
+import { ToastContext } from '@/app/components/base/toast'
+import { createEmptyDataset } from '@/service/datasets'
+
+type IProps = {
+  show: boolean
+  onHide: () => void
+}
+
+const EmptyDatasetCreationModal = ({
+  show = false,
+  onHide,
+}: IProps) => {
+  const [inputValue, setInputValue] = useState('')
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const router = useRouter()
+
+  const submit = async () => {
+    if (!inputValue) {
+      notify({ type: 'error', message: t('datasetCreation.stepOne.modal.nameNotEmpty') })
+      return
+    }
+    if (inputValue.length > 40) {
+      notify({ type: 'error', message: t('datasetCreation.stepOne.modal.nameLengthInvalid') })
+      return
+    }
+    try {
+      const dataset = await createEmptyDataset({ name: inputValue })
+      onHide()
+      router.push(`/datasets/${dataset.id}/documents`)
+    }
+    catch {
+      notify({ type: 'error', message: t('datasetCreation.stepOne.modal.failed') })
+    }
+  }
+
+  return (
+    <Modal
+      isShow={show}
+      onClose={onHide}
+      className={cn(s.modal, '!max-w-[520px]', 'px-8')}
+    >
+      <div className={s.modalHeader}>
+        <div className={s.title}>{t('datasetCreation.stepOne.modal.title')}</div>
+        <span className={s.close} onClick={onHide} />
+      </div>
+      <div className={s.tip}>{t('datasetCreation.stepOne.modal.tip')}</div>
+      <div className={s.form}>
+        <div className={s.label}>{t('datasetCreation.stepOne.modal.input')}</div>
+        <Input value={inputValue} placeholder={t('datasetCreation.stepOne.modal.placeholder') || ''} onChange={e => setInputValue(e.target.value)} />
+      </div>
+      <div className='flex flex-row-reverse'>
+        <Button className='ml-2 w-24' variant='primary' onClick={submit}>{t('datasetCreation.stepOne.modal.confirmButton')}</Button>
+        <Button className='w-24' onClick={onHide}>{t('datasetCreation.stepOne.modal.cancelButton')}</Button>
+      </div>
+    </Modal>
+  )
+}
+
+export default EmptyDatasetCreationModal
diff --git a/app/components/datasets/create/file-preview/index.module.css b/app/components/datasets/create/file-preview/index.module.css
new file mode 100644
index 0000000..da139fa
--- /dev/null
+++ b/app/components/datasets/create/file-preview/index.module.css
@@ -0,0 +1,39 @@
+.filePreview {
+    @apply flex flex-col border-l border-components-panel-border shrink-0 bg-background-default-lighter;
+    width: 100%;
+  }
+
+  .previewHeader {
+    @apply border-b border-divider-subtle shrink-0;
+    margin: 42px 32px 0;
+    padding-bottom: 16px;
+  }
+
+  .previewHeader .title {
+    @apply flex justify-between items-center text-text-primary;
+  }
+
+  .previewHeader .fileName {
+    @apply text-text-tertiary;
+  }
+
+  .previewHeader .filetype {
+    @apply text-text-tertiary;
+  }
+
+  .previewContent {
+    @apply overflow-y-auto grow text-text-secondary;
+    padding: 20px 32px;
+  }
+
+  .previewContent .loading {
+    width: 100%;
+    height: 180px;
+    background: transparent center no-repeat url(../assets/Loading.svg);
+    background-size: contain;
+  }
+
+  .fileContent {
+    white-space: pre-line;
+    word-break: break-all;
+  }
diff --git a/app/components/datasets/create/file-preview/index.tsx b/app/components/datasets/create/file-preview/index.tsx
new file mode 100644
index 0000000..8a88834
--- /dev/null
+++ b/app/components/datasets/create/file-preview/index.tsx
@@ -0,0 +1,70 @@
+'use client'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { XMarkIcon } from '@heroicons/react/20/solid'
+import Loading from '@/app/components/base/loading'
+import s from './index.module.css'
+import cn from '@/utils/classnames'
+import type { CustomFile as File } from '@/models/datasets'
+import { fetchFilePreview } from '@/service/common'
+
+type IProps = {
+  file?: File
+  hidePreview: () => void
+}
+
+const FilePreview = ({
+  file,
+  hidePreview,
+}: IProps) => {
+  const { t } = useTranslation()
+  const [previewContent, setPreviewContent] = useState('')
+  const [loading, setLoading] = useState(true)
+
+  const getPreviewContent = async (fileID: string) => {
+    try {
+      const res = await fetchFilePreview({ fileID })
+      setPreviewContent(res.content)
+      setLoading(false)
+    }
+    catch { }
+  }
+
+  const getFileName = (currentFile?: File) => {
+    if (!currentFile)
+      return ''
+    const arr = currentFile.name.split('.')
+    return arr.slice(0, -1).join()
+  }
+
+  useEffect(() => {
+    if (file?.id) {
+      setLoading(true)
+      getPreviewContent(file.id)
+    }
+  }, [file])
+
+  return (
+    <div className={cn(s.filePreview, 'h-full')}>
+      <div className={cn(s.previewHeader)}>
+        <div className={cn(s.title, 'title-md-semi-bold')}>
+          <span>{t('datasetCreation.stepOne.filePreview')}</span>
+          <div className='flex h-6 w-6 cursor-pointer items-center justify-center' onClick={hidePreview}>
+            <XMarkIcon className='h-4 w-4'></XMarkIcon>
+          </div>
+        </div>
+        <div className={cn(s.fileName, 'system-xs-medium')}>
+          <span>{getFileName(file)}</span><span className={cn(s.filetype)}>.{file?.extension}</span>
+        </div>
+      </div>
+      <div className={cn(s.previewContent)}>
+        {loading && <Loading type='area' />}
+        {!loading && (
+          <div className={cn(s.fileContent, 'body-md-regular')}>{previewContent}</div>
+        )}
+      </div>
+    </div>
+  )
+}
+
+export default FilePreview
diff --git a/app/components/datasets/create/file-uploader/index.module.css b/app/components/datasets/create/file-uploader/index.module.css
new file mode 100644
index 0000000..7d29f2e
--- /dev/null
+++ b/app/components/datasets/create/file-uploader/index.module.css
@@ -0,0 +1,131 @@
+.file {
+  @apply box-border relative flex items-center justify-between;
+  padding: 8px 12px 8px 8px;
+  max-width: 640px;
+  height: 40px;
+  background: #ffffff;
+  border: 0.5px solid #EAECF0;
+  box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05);
+  border-radius: 8px;
+  overflow: hidden;
+  cursor: pointer;
+}
+
+.progressbar {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 100%;
+  background-color: #F2F4F7;
+}
+
+.file.uploading,
+.file.uploading:hover {
+  background: #FCFCFD;
+  border: 0.5px solid #EAECF0;
+}
+
+.file.active {
+  background: #F5F8FF;
+  border: 1px solid #D1E0FF;
+  box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05);
+}
+
+.file:hover {
+  background: #F5F8FF;
+  border: 1px solid #D1E0FF;
+  box-shadow: 0px 4px 8px -2px rgba(16, 24, 40, 0.1), 0px 2px 4px -2px rgba(16, 24, 40, 0.06);
+}
+
+.fileIcon {
+  @apply shrink-0 w-6 h-6 mr-2 bg-center bg-no-repeat;
+  background-image: url(../assets/unknown.svg);
+  background-size: 24px;
+}
+
+.fileIcon.csv {
+  background-image: url(../assets/csv.svg);
+}
+
+.fileIcon.doc {
+  background-image: url(../assets/doc.svg);
+}
+
+.fileIcon.docx {
+  background-image: url(../assets/docx.svg);
+}
+
+.fileIcon.xlsx,
+.fileIcon.xls {
+  background-image: url(../assets/xlsx.svg);
+}
+
+.fileIcon.pdf {
+  background-image: url(../assets/pdf.svg);
+}
+
+.fileIcon.html,
+.fileIcon.htm {
+  background-image: url(../assets/html.svg);
+}
+
+.fileIcon.md,
+.fileIcon.markdown {
+  background-image: url(../assets/md.svg);
+}
+
+.fileIcon.txt {
+  background-image: url(../assets/txt.svg);
+}
+
+.fileIcon.json {
+  background-image: url(../assets/json.svg);
+}
+
+.fileInfo {
+  @apply grow flex items-center;
+  z-index: 1;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.filename {
+  font-weight: 500;
+  font-size: 13px;
+  line-height: 18px;
+  color: #1D2939;
+}
+
+.size {
+  @apply ml-3;
+  font-weight: 400;
+  font-size: 12px;
+  line-height: 18px;
+  color: #667085;
+}
+
+.actionWrapper {
+  @apply flex items-center shrink-0;
+  z-index: 1;
+}
+
+.actionWrapper .percent {
+  font-weight: 400;
+  font-size: 13px;
+  line-height: 18px;
+  color: #344054;
+}
+
+.actionWrapper .remove {
+  display: none;
+  width: 24px;
+  height: 24px;
+  background: center no-repeat url(../assets/trash.svg);
+  background-size: 16px;
+  cursor: pointer;
+}
+
+.file:hover .actionWrapper .remove {
+  display: block;
+}
diff --git a/app/components/datasets/create/file-uploader/index.tsx b/app/components/datasets/create/file-uploader/index.tsx
new file mode 100644
index 0000000..5ed4b7d
--- /dev/null
+++ b/app/components/datasets/create/file-uploader/index.tsx
@@ -0,0 +1,381 @@
+'use client'
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import useSWR from 'swr'
+import { RiDeleteBinLine, RiUploadCloud2Line } from '@remixicon/react'
+import DocumentFileIcon from '../../common/document-file-icon'
+import cn from '@/utils/classnames'
+import type { CustomFile as File, FileItem } from '@/models/datasets'
+import { ToastContext } from '@/app/components/base/toast'
+import SimplePieChart from '@/app/components/base/simple-pie-chart'
+
+import { upload } from '@/service/base'
+import { fetchFileUploadConfig } from '@/service/common'
+import { fetchSupportFileTypes } from '@/service/datasets'
+import I18n from '@/context/i18n'
+import { LanguagesSupported } from '@/i18n/language'
+import { IS_CE_EDITION } from '@/config'
+import { Theme } from '@/types/app'
+import useTheme from '@/hooks/use-theme'
+
+const FILES_NUMBER_LIMIT = 20
+
+type IFileUploaderProps = {
+  fileList: FileItem[]
+  titleClassName?: string
+  prepareFileList: (files: FileItem[]) => void
+  onFileUpdate: (fileItem: FileItem, progress: number, list: FileItem[]) => void
+  onFileListUpdate?: (files: FileItem[]) => void
+  onPreview: (file: File) => void
+  notSupportBatchUpload?: boolean
+}
+
+const FileUploader = ({
+  fileList,
+  titleClassName,
+  prepareFileList,
+  onFileUpdate,
+  onFileListUpdate,
+  onPreview,
+  notSupportBatchUpload,
+}: IFileUploaderProps) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const { locale } = useContext(I18n)
+  const [dragging, setDragging] = useState(false)
+  const dropRef = useRef<HTMLDivElement>(null)
+  const dragRef = useRef<HTMLDivElement>(null)
+  const fileUploader = useRef<HTMLInputElement>(null)
+  const hideUpload = notSupportBatchUpload && fileList.length > 0
+
+  const { data: fileUploadConfigResponse } = useSWR({ url: '/files/upload' }, fetchFileUploadConfig)
+  const { data: supportFileTypesResponse } = useSWR({ url: '/files/support-type' }, fetchSupportFileTypes)
+  const supportTypes = supportFileTypesResponse?.allowed_extensions || []
+  const supportTypesShowNames = (() => {
+    const extensionMap: { [key: string]: string } = {
+      md: 'markdown',
+      pptx: 'pptx',
+      htm: 'html',
+      xlsx: 'xlsx',
+      docx: 'docx',
+    }
+
+    return [...supportTypes]
+      .map(item => extensionMap[item] || item) // map to standardized extension
+      .map(item => item.toLowerCase()) // convert to lower case
+      .filter((item, index, self) => self.indexOf(item) === index) // remove duplicates
+      .map(item => item.toUpperCase()) // convert to upper case
+      .join(locale !== LanguagesSupported[1] ? ', ' : '銆� ')
+  })()
+  const ACCEPTS = supportTypes.map((ext: string) => `.${ext}`)
+  const fileUploadConfig = useMemo(() => fileUploadConfigResponse ?? {
+    file_size_limit: 15,
+    batch_count_limit: 5,
+  }, [fileUploadConfigResponse])
+
+  const fileListRef = useRef<FileItem[]>([])
+
+  // utils
+  const getFileType = (currentFile: File) => {
+    if (!currentFile)
+      return ''
+
+    const arr = currentFile.name.split('.')
+    return arr[arr.length - 1]
+  }
+
+  const getFileSize = (size: number) => {
+    if (size / 1024 < 10)
+      return `${(size / 1024).toFixed(2)}KB`
+
+    return `${(size / 1024 / 1024).toFixed(2)}MB`
+  }
+
+  const isValid = useCallback((file: File) => {
+    const { size } = file
+    const ext = `.${getFileType(file)}`
+    const isValidType = ACCEPTS.includes(ext.toLowerCase())
+    if (!isValidType)
+      notify({ type: 'error', message: t('datasetCreation.stepOne.uploader.validation.typeError') })
+
+    const isValidSize = size <= fileUploadConfig.file_size_limit * 1024 * 1024
+    if (!isValidSize)
+      notify({ type: 'error', message: t('datasetCreation.stepOne.uploader.validation.size', { size: fileUploadConfig.file_size_limit }) })
+
+    return isValidType && isValidSize
+  }, [fileUploadConfig, notify, t, ACCEPTS])
+
+  const fileUpload = useCallback(async (fileItem: FileItem): Promise<FileItem> => {
+    const formData = new FormData()
+    formData.append('file', fileItem.file)
+    const onProgress = (e: ProgressEvent) => {
+      if (e.lengthComputable) {
+        const percent = Math.floor(e.loaded / e.total * 100)
+        onFileUpdate(fileItem, percent, fileListRef.current)
+      }
+    }
+
+    return upload({
+      xhr: new XMLHttpRequest(),
+      data: formData,
+      onprogress: onProgress,
+    }, false, undefined, '?source=datasets')
+      .then((res: File) => {
+        const completeFile = {
+          fileID: fileItem.fileID,
+          file: res,
+          progress: -1,
+        }
+        const index = fileListRef.current.findIndex(item => item.fileID === fileItem.fileID)
+        fileListRef.current[index] = completeFile
+        onFileUpdate(completeFile, 100, fileListRef.current)
+        return Promise.resolve({ ...completeFile })
+      })
+      .catch((e) => {
+        notify({ type: 'error', message: e?.response?.code === 'forbidden' ? e?.response?.message : t('datasetCreation.stepOne.uploader.failed') })
+        onFileUpdate(fileItem, -2, fileListRef.current)
+        return Promise.resolve({ ...fileItem })
+      })
+      .finally()
+  }, [fileListRef, notify, onFileUpdate, t])
+
+  const uploadBatchFiles = useCallback((bFiles: FileItem[]) => {
+    bFiles.forEach(bf => (bf.progress = 0))
+    return Promise.all(bFiles.map(fileUpload))
+  }, [fileUpload])
+
+  const uploadMultipleFiles = useCallback(async (files: FileItem[]) => {
+    const batchCountLimit = fileUploadConfig.batch_count_limit
+    const length = files.length
+    let start = 0
+    let end = 0
+
+    while (start < length) {
+      if (start + batchCountLimit > length)
+        end = length
+      else
+        end = start + batchCountLimit
+      const bFiles = files.slice(start, end)
+      await uploadBatchFiles(bFiles)
+      start = end
+    }
+  }, [fileUploadConfig, uploadBatchFiles])
+
+  const initialUpload = useCallback((files: File[]) => {
+    if (!files.length)
+      return false
+
+    if (files.length + fileList.length > FILES_NUMBER_LIMIT && !IS_CE_EDITION) {
+      notify({ type: 'error', message: t('datasetCreation.stepOne.uploader.validation.filesNumber', { filesNumber: FILES_NUMBER_LIMIT }) })
+      return false
+    }
+
+    const preparedFiles = files.map((file, index) => ({
+      fileID: `file${index}-${Date.now()}`,
+      file,
+      progress: -1,
+    }))
+    const newFiles = [...fileListRef.current, ...preparedFiles]
+    prepareFileList(newFiles)
+    fileListRef.current = newFiles
+    uploadMultipleFiles(preparedFiles)
+  }, [prepareFileList, uploadMultipleFiles, notify, t, fileList])
+
+  const handleDragEnter = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+    e.target !== dragRef.current && setDragging(true)
+  }
+  const handleDragOver = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+  }
+  const handleDragLeave = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+    e.target === dragRef.current && setDragging(false)
+  }
+  type FileWithPath = {
+    relativePath?: string
+  } & File
+  const traverseFileEntry = useCallback(
+    (entry: any, prefix = ''): Promise<FileWithPath[]> => {
+      return new Promise((resolve) => {
+        if (entry.isFile) {
+          entry.file((file: FileWithPath) => {
+            file.relativePath = `${prefix}${file.name}`
+            resolve([file])
+          })
+        }
+        else if (entry.isDirectory) {
+          const reader = entry.createReader()
+          const entries: any[] = []
+          const read = () => {
+            reader.readEntries(async (results: FileSystemEntry[]) => {
+              if (!results.length) {
+                const files = await Promise.all(
+                  entries.map(ent =>
+                    traverseFileEntry(ent, `${prefix}${entry.name}/`),
+                  ),
+                )
+                resolve(files.flat())
+              }
+              else {
+                entries.push(...results)
+                read()
+              }
+            })
+          }
+          read()
+        }
+        else {
+          resolve([])
+        }
+      })
+    },
+    [],
+  )
+
+  const handleDrop = useCallback(
+    async (e: DragEvent) => {
+      e.preventDefault()
+      e.stopPropagation()
+      setDragging(false)
+      if (!e.dataTransfer) return
+      const nested = await Promise.all(
+        Array.from(e.dataTransfer.items).map((it) => {
+          const entry = (it as any).webkitGetAsEntry?.()
+          if (entry) return traverseFileEntry(entry)
+          const f = it.getAsFile?.()
+          return f ? Promise.resolve([f]) : Promise.resolve([])
+        }),
+      )
+      let files = nested.flat()
+      if (notSupportBatchUpload) files = files.slice(0, 1)
+      const valid = files.filter(isValid)
+      initialUpload(valid)
+    },
+    [initialUpload, isValid, notSupportBatchUpload, traverseFileEntry],
+  )
+  const selectHandle = () => {
+    if (fileUploader.current)
+      fileUploader.current.click()
+  }
+
+  const removeFile = (fileID: string) => {
+    if (fileUploader.current)
+      fileUploader.current.value = ''
+
+    fileListRef.current = fileListRef.current.filter(item => item.fileID !== fileID)
+    onFileListUpdate?.([...fileListRef.current])
+  }
+  const fileChangeHandle = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
+    const files = [...(e.target.files ?? [])] as File[]
+    initialUpload(files.filter(isValid))
+  }, [isValid, initialUpload])
+
+  const { theme } = useTheme()
+  const chartColor = useMemo(() => theme === Theme.dark ? '#5289ff' : '#296dff', [theme])
+
+  useEffect(() => {
+    dropRef.current?.addEventListener('dragenter', handleDragEnter)
+    dropRef.current?.addEventListener('dragover', handleDragOver)
+    dropRef.current?.addEventListener('dragleave', handleDragLeave)
+    dropRef.current?.addEventListener('drop', handleDrop)
+    return () => {
+      dropRef.current?.removeEventListener('dragenter', handleDragEnter)
+      dropRef.current?.removeEventListener('dragover', handleDragOver)
+      dropRef.current?.removeEventListener('dragleave', handleDragLeave)
+      dropRef.current?.removeEventListener('drop', handleDrop)
+    }
+  }, [handleDrop])
+
+  return (
+    <div className="mb-5 w-[640px]">
+      {!hideUpload && (
+        <input
+          ref={fileUploader}
+          id="fileUploader"
+          className="hidden"
+          type="file"
+          multiple={!notSupportBatchUpload}
+          accept={ACCEPTS.join(',')}
+          onChange={fileChangeHandle}
+        />
+      )}
+
+      <div className={cn('mb-1 text-sm font-semibold leading-6 text-text-secondary', titleClassName)}>{t('datasetCreation.stepOne.uploader.title')}</div>
+
+      {!hideUpload && (
+        <div ref={dropRef} className={cn('relative mb-2 box-border flex min-h-20 max-w-[640px] flex-col items-center justify-center gap-1 rounded-xl border border-dashed border-components-dropzone-border bg-components-dropzone-bg px-4 py-3 text-xs leading-4 text-text-tertiary', dragging && 'border-components-dropzone-border-accent bg-components-dropzone-bg-accent')}>
+          <div className="flex min-h-5 items-center justify-center text-sm leading-4 text-text-secondary">
+            <RiUploadCloud2Line className='mr-2 size-5' />
+
+            <span>
+              {t('datasetCreation.stepOne.uploader.button')}
+              {supportTypes.length > 0 && (
+                <label className="ml-1 cursor-pointer text-text-accent" onClick={selectHandle}>{t('datasetCreation.stepOne.uploader.browse')}</label>
+              )}
+            </span>
+          </div>
+          <div>{t('datasetCreation.stepOne.uploader.tip', {
+            size: fileUploadConfig.file_size_limit,
+            supportTypes: supportTypesShowNames,
+          })}</div>
+          {dragging && <div ref={dragRef} className='absolute left-0 top-0 h-full w-full' />}
+        </div>
+      )}
+      <div className='max-w-[640px] cursor-default space-y-1'>
+
+        {fileList.map((fileItem, index) => (
+          <div
+            key={`${fileItem.fileID}-${index}`}
+            onClick={() => fileItem.file?.id && onPreview(fileItem.file)}
+            className={cn(
+              'flex h-12 max-w-[640px] items-center rounded-lg border border-components-panel-border bg-components-panel-on-panel-item-bg text-xs leading-3 text-text-tertiary shadow-xs',
+              // 'border-state-destructive-border bg-state-destructive-hover',
+            )}
+          >
+            <div className="flex w-12 shrink-0 items-center justify-center">
+              <DocumentFileIcon
+                className="size-6 shrink-0"
+                name={fileItem.file.name}
+                extension={getFileType(fileItem.file)}
+              />
+            </div>
+            <div className="flex shrink grow flex-col gap-0.5">
+              <div className='flex w-full'>
+                <div className="w-0 grow truncate text-sm leading-4 text-text-secondary">{fileItem.file.name}</div>
+              </div>
+              <div className="w-full truncate leading-3 text-text-tertiary">
+                <span className='uppercase'>{getFileType(fileItem.file)}</span>
+                <span className='px-1 text-text-quaternary'>路</span>
+                <span>{getFileSize(fileItem.file.size)}</span>
+                {/* <span className='px-1 text-text-quaternary'>路</span>
+                  <span>10k characters</span> */}
+              </div>
+            </div>
+            <div className="flex w-16 shrink-0 items-center justify-end gap-1 pr-3">
+              {/* <span className="flex justify-center items-center w-6 h-6 cursor-pointer">
+                  <RiErrorWarningFill className='size-4 text-text-warning' />
+                </span> */}
+              {(fileItem.progress < 100 && fileItem.progress >= 0) && (
+                // <div className={s.percent}>{`${fileItem.progress}%`}</div>
+                <SimplePieChart percentage={fileItem.progress} stroke={chartColor} fill={chartColor} animationDuration={0} />
+              )}
+              <span className="flex h-6 w-6 cursor-pointer items-center justify-center" onClick={(e) => {
+                e.stopPropagation()
+                removeFile(fileItem.fileID)
+              }}>
+                <RiDeleteBinLine className='size-4 text-text-tertiary' />
+              </span>
+            </div>
+          </div>
+        ))}
+      </div>
+    </div>
+  )
+}
+
+export default FileUploader
diff --git a/app/components/datasets/create/icons.ts b/app/components/datasets/create/icons.ts
new file mode 100644
index 0000000..80c4b6c
--- /dev/null
+++ b/app/components/datasets/create/icons.ts
@@ -0,0 +1,16 @@
+import GoldIcon from './assets/gold.svg'
+import Piggybank from './assets/piggy-bank-mod.svg'
+import Selection from './assets/selection-mod.svg'
+import Research from './assets/research-mod.svg'
+import PatternRecognition from './assets/pattern-recognition-mod.svg'
+
+export const indexMethodIcon = {
+  high_quality: GoldIcon,
+  economical: Piggybank,
+}
+
+export const retrievalIcon = {
+  vector: Selection,
+  fullText: Research,
+  hybrid: PatternRecognition,
+}
diff --git a/app/components/datasets/create/index.module.css b/app/components/datasets/create/index.module.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/components/datasets/create/index.module.css
diff --git a/app/components/datasets/create/index.tsx b/app/components/datasets/create/index.tsx
new file mode 100644
index 0000000..b1e4087
--- /dev/null
+++ b/app/components/datasets/create/index.tsx
@@ -0,0 +1,177 @@
+'use client'
+import React, { useCallback, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import AppUnavailable from '../../base/app-unavailable'
+import { ModelTypeEnum } from '../../header/account-setting/model-provider-page/declarations'
+import StepOne from './step-one'
+import StepTwo from './step-two'
+import StepThree from './step-three'
+import { TopBar } from './top-bar'
+import { DataSourceType } from '@/models/datasets'
+import type { CrawlOptions, CrawlResultItem, DataSet, FileItem, createDocumentResponse } from '@/models/datasets'
+import { fetchDataSource } from '@/service/common'
+import { fetchDatasetDetail } from '@/service/datasets'
+import { DataSourceProvider, type NotionPage } from '@/models/common'
+import { useModalContext } from '@/context/modal-context'
+import { useDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+
+type DatasetUpdateFormProps = {
+  datasetId?: string
+}
+
+const DEFAULT_CRAWL_OPTIONS: CrawlOptions = {
+  crawl_sub_pages: true,
+  only_main_content: true,
+  includes: '',
+  excludes: '',
+  limit: 10,
+  max_depth: '',
+  use_sitemap: true,
+}
+
+const DatasetUpdateForm = ({ datasetId }: DatasetUpdateFormProps) => {
+  const { t } = useTranslation()
+  const { setShowAccountSettingModal } = useModalContext()
+  const [hasConnection, setHasConnection] = useState(true)
+  const [dataSourceType, setDataSourceType] = useState<DataSourceType>(DataSourceType.FILE)
+  const [step, setStep] = useState(1)
+  const [indexingTypeCache, setIndexTypeCache] = useState('')
+  const [retrievalMethodCache, setRetrievalMethodCache] = useState('')
+  const [fileList, setFiles] = useState<FileItem[]>([])
+  const [result, setResult] = useState<createDocumentResponse | undefined>()
+  const [hasError, setHasError] = useState(false)
+  const { data: embeddingsDefaultModel } = useDefaultModel(ModelTypeEnum.textEmbedding)
+
+  const [notionPages, setNotionPages] = useState<NotionPage[]>([])
+  const updateNotionPages = (value: NotionPage[]) => {
+    setNotionPages(value)
+  }
+
+  const [websitePages, setWebsitePages] = useState<CrawlResultItem[]>([])
+  const [crawlOptions, setCrawlOptions] = useState<CrawlOptions>(DEFAULT_CRAWL_OPTIONS)
+
+  const updateFileList = (preparedFiles: FileItem[]) => {
+    setFiles(preparedFiles)
+  }
+  const [websiteCrawlProvider, setWebsiteCrawlProvider] = useState<DataSourceProvider>(DataSourceProvider.fireCrawl)
+  const [websiteCrawlJobId, setWebsiteCrawlJobId] = useState('')
+
+  const updateFile = (fileItem: FileItem, progress: number, list: FileItem[]) => {
+    const targetIndex = list.findIndex(file => file.fileID === fileItem.fileID)
+    list[targetIndex] = {
+      ...list[targetIndex],
+      progress,
+    }
+    setFiles([...list])
+    // use follow code would cause dirty list update problem
+    // const newList = list.map((file) => {
+    //   if (file.fileID === fileItem.fileID) {
+    //     return {
+    //       ...fileItem,
+    //       progress,
+    //     }
+    //   }
+    //   return file
+    // })
+    // setFiles(newList)
+  }
+  const updateIndexingTypeCache = (type: string) => {
+    setIndexTypeCache(type)
+  }
+  const updateResultCache = (res?: createDocumentResponse) => {
+    setResult(res)
+  }
+  const updateRetrievalMethodCache = (method: string) => {
+    setRetrievalMethodCache(method)
+  }
+
+  const nextStep = useCallback(() => {
+    setStep(step + 1)
+  }, [step, setStep])
+
+  const changeStep = useCallback((delta: number) => {
+    setStep(step + delta)
+  }, [step, setStep])
+
+  const checkNotionConnection = async () => {
+    const { data } = await fetchDataSource({ url: '/data-source/integrates' })
+    const hasConnection = data.filter(item => item.provider === 'notion') || []
+    setHasConnection(hasConnection.length > 0)
+  }
+
+  useEffect(() => {
+    checkNotionConnection()
+  }, [])
+
+  const [detail, setDetail] = useState<DataSet | null>(null)
+  useEffect(() => {
+    (async () => {
+      if (datasetId) {
+        try {
+          const detail = await fetchDatasetDetail(datasetId)
+          setDetail(detail)
+        }
+        catch {
+          setHasError(true)
+        }
+      }
+    })()
+  }, [datasetId])
+
+  if (hasError)
+    return <AppUnavailable code={500} unknownReason={t('datasetCreation.error.unavailable') as string} />
+
+  return (
+    <div className='flex flex-col bg-components-panel-bg' style={{ height: 'calc(100vh - 56px)' }}>
+      <TopBar activeIndex={step - 1} datasetId={datasetId} />
+      <div style={{ height: 'calc(100% - 52px)' }}>
+        {step === 1 && <StepOne
+          hasConnection={hasConnection}
+          onSetting={() => setShowAccountSettingModal({ payload: 'data-source' })}
+          datasetId={datasetId}
+          dataSourceType={dataSourceType}
+          dataSourceTypeDisable={!!detail?.data_source_type}
+          changeType={setDataSourceType}
+          files={fileList}
+          updateFile={updateFile}
+          updateFileList={updateFileList}
+          notionPages={notionPages}
+          updateNotionPages={updateNotionPages}
+          onStepChange={nextStep}
+          websitePages={websitePages}
+          updateWebsitePages={setWebsitePages}
+          onWebsiteCrawlProviderChange={setWebsiteCrawlProvider}
+          onWebsiteCrawlJobIdChange={setWebsiteCrawlJobId}
+          crawlOptions={crawlOptions}
+          onCrawlOptionsChange={setCrawlOptions}
+        />}
+        {(step === 2 && (!datasetId || (datasetId && !!detail))) && <StepTwo
+          isAPIKeySet={!!embeddingsDefaultModel}
+          onSetting={() => setShowAccountSettingModal({ payload: 'provider' })}
+          indexingType={detail?.indexing_technique}
+          datasetId={datasetId}
+          dataSourceType={dataSourceType}
+          files={fileList.map(file => file.file)}
+          notionPages={notionPages}
+          websitePages={websitePages}
+          websiteCrawlProvider={websiteCrawlProvider}
+          websiteCrawlJobId={websiteCrawlJobId}
+          onStepChange={changeStep}
+          updateIndexingTypeCache={updateIndexingTypeCache}
+          updateRetrievalMethodCache={updateRetrievalMethodCache}
+          updateResultCache={updateResultCache}
+          crawlOptions={crawlOptions}
+        />}
+        {step === 3 && <StepThree
+          datasetId={datasetId}
+          datasetName={detail?.name}
+          indexingType={detail?.indexing_technique || indexingTypeCache}
+          retrievalMethod={detail?.retrieval_model_dict?.search_method || retrievalMethodCache}
+          creationCache={result}
+        />}
+      </div>
+    </div>
+  )
+}
+
+export default DatasetUpdateForm
diff --git a/app/components/datasets/create/notion-page-preview/index.module.css b/app/components/datasets/create/notion-page-preview/index.module.css
new file mode 100644
index 0000000..b3bc589
--- /dev/null
+++ b/app/components/datasets/create/notion-page-preview/index.module.css
@@ -0,0 +1,33 @@
+.filePreview {
+  @apply flex flex-col border-l border-components-panel-border shrink-0 bg-background-default-lighter;
+  width: 528px;
+}
+
+.previewHeader {
+  @apply border-b border-divider-subtle shrink-0;
+  margin: 42px 32px 0;
+  padding-bottom: 16px;
+}
+
+.previewHeader .title {
+  @apply flex justify-between items-center text-text-primary;
+}
+
+.previewHeader .fileName {
+  @apply flex items-center text-text-tertiary;
+}
+
+.previewContent {
+  @apply overflow-y-auto grow text-text-secondary;
+  padding: 20px 32px;
+}
+
+.previewContent .loading {
+  width: 100%;
+  height: 180px;
+  background: #f9fafb center no-repeat url(../assets/Loading.svg);
+  background-size: contain;
+}
+.fileContent {
+  white-space: pre-line;
+}
diff --git a/app/components/datasets/create/notion-page-preview/index.tsx b/app/components/datasets/create/notion-page-preview/index.tsx
new file mode 100644
index 0000000..5b56036
--- /dev/null
+++ b/app/components/datasets/create/notion-page-preview/index.tsx
@@ -0,0 +1,75 @@
+'use client'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { XMarkIcon } from '@heroicons/react/20/solid'
+import Loading from '@/app/components/base/loading'
+import s from './index.module.css'
+import cn from '@/utils/classnames'
+import type { NotionPage } from '@/models/common'
+import NotionIcon from '@/app/components/base/notion-icon'
+import { fetchNotionPagePreview } from '@/service/datasets'
+
+type IProps = {
+  currentPage?: NotionPage
+  hidePreview: () => void
+}
+
+const NotionPagePreview = ({
+  currentPage,
+  hidePreview,
+}: IProps) => {
+  const { t } = useTranslation()
+  const [previewContent, setPreviewContent] = useState('')
+  const [loading, setLoading] = useState(true)
+
+  const getPreviewContent = async () => {
+    if (!currentPage)
+      return
+    try {
+      const res = await fetchNotionPagePreview({
+        workspaceID: currentPage.workspace_id,
+        pageID: currentPage.page_id,
+        pageType: currentPage.type,
+      })
+      setPreviewContent(res.content)
+      setLoading(false)
+    }
+    catch { }
+  }
+
+  useEffect(() => {
+    if (currentPage) {
+      setLoading(true)
+      getPreviewContent()
+    }
+  }, [currentPage])
+
+  return (
+    <div className={cn(s.filePreview, 'h-full')}>
+      <div className={cn(s.previewHeader)}>
+        <div className={cn(s.title, 'title-md-semi-bold')}>
+          <span>{t('datasetCreation.stepOne.pagePreview')}</span>
+          <div className='flex h-6 w-6 cursor-pointer items-center justify-center' onClick={hidePreview}>
+            <XMarkIcon className='h-4 w-4'></XMarkIcon>
+          </div>
+        </div>
+        <div className={cn(s.fileName, 'system-xs-medium')}>
+          <NotionIcon
+            className='mr-1 shrink-0'
+            type='page'
+            src={currentPage?.page_icon}
+          />
+          {currentPage?.page_name}
+        </div>
+      </div>
+      <div className={cn(s.previewContent, 'body-md-regular')}>
+        {loading && <Loading type='area' />}
+        {!loading && (
+          <div className={cn(s.fileContent, 'body-md-regular')}>{previewContent}</div>
+        )}
+      </div>
+    </div>
+  )
+}
+
+export default NotionPagePreview
diff --git a/app/components/datasets/create/step-one/index.module.css b/app/components/datasets/create/step-one/index.module.css
new file mode 100644
index 0000000..581409b
--- /dev/null
+++ b/app/components/datasets/create/step-one/index.module.css
@@ -0,0 +1,66 @@
+.stepHeader {
+  padding: 42px 64px 12px 0;
+}
+
+.form {
+  position: relative;
+  padding: 12px 64px;
+}
+
+.dataSourceItem {
+  @apply w-full relative flex items-center p-3 h-14 bg-components-option-card-option-bg rounded-xl
+  cursor-pointer border border-components-option-card-option-border text-text-secondary;
+}
+
+.dataSourceItem:hover {
+  @apply bg-components-option-card-option-bg-hover border border-components-option-card-option-border-hover shadow-xs shadow-shadow-shadow-3;
+}
+
+.dataSourceItem.active {
+  @apply bg-components-option-card-option-selected-bg border border-components-option-card-option-selected-border
+  ring-[0.5px] ring-components-option-card-option-selected-border;
+}
+
+.dataSourceItem.disabled,
+.dataSourceItem.disabled:hover {
+  @apply bg-components-option-card-option-bg border-[0.5px] border-components-option-card-option-border cursor-not-allowed text-text-disabled shadow-none;
+}
+
+.comingTag {
+  @apply flex justify-center items-center bg-white;
+  position: absolute;
+  right: 8px;
+  top: -10px;
+  padding: 1px 6px;
+  height: 20px;
+  border: 1px solid #E0EAFF;
+  border-radius: 6px;
+  font-weight: 500;
+  font-size: 12px;
+  line-height: 18px;
+  color: #444CE7;
+}
+
+.datasetIcon {
+  @apply flex shrink-0 mr-2 w-8 h-8 rounded-lg bg-center bg-no-repeat bg-text-primary-on-surface border-[0.5px] border-divider-regular backdrop-blur-sm;
+  background-image: url(../assets/file.svg);
+  background-size: 16px;
+}
+
+.datasetIcon.notion {
+  background-image: url(../assets/notion.svg);
+  background-size: 20px;
+}
+
+.datasetIcon.web {
+  background-image: url(../assets/web.svg);
+}
+
+.submitButton {
+  width: 120px;
+}
+
+.notionIcon {
+  background: var(--color-components-card-bg) center no-repeat url(../assets/notion.svg);
+  background-size: 24px;
+}
diff --git a/app/components/datasets/create/step-one/index.tsx b/app/components/datasets/create/step-one/index.tsx
new file mode 100644
index 0000000..38c885e
--- /dev/null
+++ b/app/components/datasets/create/step-one/index.tsx
@@ -0,0 +1,325 @@
+'use client'
+import React, { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowRightLine, RiFolder6Line } from '@remixicon/react'
+import FilePreview from '../file-preview'
+import FileUploader from '../file-uploader'
+import NotionPagePreview from '../notion-page-preview'
+import EmptyDatasetCreationModal from '../empty-dataset-creation-modal'
+import Website from '../website'
+import WebsitePreview from '../website/preview'
+import s from './index.module.css'
+import cn from '@/utils/classnames'
+import type { CrawlOptions, CrawlResultItem, FileItem } from '@/models/datasets'
+import type { DataSourceProvider, NotionPage } from '@/models/common'
+import { DataSourceType } from '@/models/datasets'
+import Button from '@/app/components/base/button'
+import { NotionPageSelector } from '@/app/components/base/notion-page-selector'
+import { useDatasetDetailContext } from '@/context/dataset-detail'
+import { useProviderContext } from '@/context/provider-context'
+import VectorSpaceFull from '@/app/components/billing/vector-space-full'
+import classNames from '@/utils/classnames'
+import { Icon3Dots } from '@/app/components/base/icons/src/vender/line/others'
+import { ENABLE_WEBSITE_FIRECRAWL, ENABLE_WEBSITE_JINAREADER, ENABLE_WEBSITE_WATERCRAWL } from '@/config'
+type IStepOneProps = {
+  datasetId?: string
+  dataSourceType?: DataSourceType
+  dataSourceTypeDisable: boolean
+  hasConnection: boolean
+  onSetting: () => void
+  files: FileItem[]
+  updateFileList: (files: FileItem[]) => void
+  updateFile: (fileItem: FileItem, progress: number, list: FileItem[]) => void
+  notionPages?: NotionPage[]
+  updateNotionPages: (value: NotionPage[]) => void
+  onStepChange: () => void
+  changeType: (type: DataSourceType) => void
+  websitePages?: CrawlResultItem[]
+  updateWebsitePages: (value: CrawlResultItem[]) => void
+  onWebsiteCrawlProviderChange: (provider: DataSourceProvider) => void
+  onWebsiteCrawlJobIdChange: (jobId: string) => void
+  crawlOptions: CrawlOptions
+  onCrawlOptionsChange: (payload: CrawlOptions) => void
+}
+
+type NotionConnectorProps = {
+  onSetting: () => void
+}
+export const NotionConnector = ({ onSetting }: NotionConnectorProps) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex w-[640px] flex-col items-start rounded-2xl bg-workflow-process-bg p-6'>
+      <span className={cn(s.notionIcon, 'mb-2 h-12 w-12 rounded-[10px] border-[0.5px] border-components-card-border p-3 shadow-lg shadow-shadow-shadow-5')} />
+      <div className='mb-1 flex flex-col gap-y-1 pb-3 pt-1'>
+        <span className='system-md-semibold text-text-secondary'>
+          {t('datasetCreation.stepOne.notionSyncTitle')}
+          <Icon3Dots className='relative -left-1.5 -top-2.5 inline h-4 w-4 text-text-secondary' />
+        </span>
+        <div className='system-sm-regular text-text-tertiary'>{t('datasetCreation.stepOne.notionSyncTip')}</div>
+      </div>
+      <Button className='h-8' variant='primary' onClick={onSetting}>{t('datasetCreation.stepOne.connect')}</Button>
+    </div>
+  )
+}
+
+const StepOne = ({
+  datasetId,
+  dataSourceType: inCreatePageDataSourceType,
+  dataSourceTypeDisable,
+  changeType,
+  hasConnection,
+  onSetting,
+  onStepChange,
+  files,
+  updateFileList,
+  updateFile,
+  notionPages = [],
+  updateNotionPages,
+  websitePages = [],
+  updateWebsitePages,
+  onWebsiteCrawlProviderChange,
+  onWebsiteCrawlJobIdChange,
+  crawlOptions,
+  onCrawlOptionsChange,
+}: IStepOneProps) => {
+  const { dataset } = useDatasetDetailContext()
+  const [showModal, setShowModal] = useState(false)
+  const [currentFile, setCurrentFile] = useState<File | undefined>()
+  const [currentNotionPage, setCurrentNotionPage] = useState<NotionPage | undefined>()
+  const [currentWebsite, setCurrentWebsite] = useState<CrawlResultItem | undefined>()
+  const { t } = useTranslation()
+
+  const modalShowHandle = () => setShowModal(true)
+  const modalCloseHandle = () => setShowModal(false)
+
+  const updateCurrentFile = (file: File) => {
+    setCurrentFile(file)
+  }
+  const hideFilePreview = () => {
+    setCurrentFile(undefined)
+  }
+
+  const updateCurrentPage = (page: NotionPage) => {
+    setCurrentNotionPage(page)
+  }
+
+  const hideNotionPagePreview = () => {
+    setCurrentNotionPage(undefined)
+  }
+
+  const hideWebsitePreview = () => {
+    setCurrentWebsite(undefined)
+  }
+
+  const shouldShowDataSourceTypeList = !datasetId || (datasetId && !dataset?.data_source_type)
+  const isInCreatePage = shouldShowDataSourceTypeList
+  const dataSourceType = isInCreatePage ? inCreatePageDataSourceType : dataset?.data_source_type
+  const { plan, enableBilling } = useProviderContext()
+  const allFileLoaded = (files.length > 0 && files.every(file => file.file.id))
+  const hasNotin = notionPages.length > 0
+  const isVectorSpaceFull = plan.usage.vectorSpace >= plan.total.vectorSpace
+  const isShowVectorSpaceFull = (allFileLoaded || hasNotin) && isVectorSpaceFull && enableBilling
+  const notSupportBatchUpload = enableBilling && plan.type === 'sandbox'
+  const nextDisabled = useMemo(() => {
+    if (!files.length)
+      return true
+    if (files.some(file => !file.file.id))
+      return true
+    return isShowVectorSpaceFull
+  }, [files, isShowVectorSpaceFull])
+
+  return (
+    <div className='h-full w-full overflow-x-auto'>
+      <div className='flex h-full w-full min-w-[1440px]'>
+        <div className='relative h-full w-1/2 overflow-y-auto'>
+          <div className='flex justify-end'>
+            <div className={classNames(s.form)}>
+              {
+                shouldShowDataSourceTypeList && (
+                  <div className={classNames(s.stepHeader, 'text-text-secondary system-md-semibold')}>
+                    {t('datasetCreation.steps.one')}
+                  </div>
+                )
+              }
+              {
+                shouldShowDataSourceTypeList && (
+                  <div className='mb-8 grid grid-cols-3 gap-4'>
+                    <div
+                      className={cn(
+                        s.dataSourceItem,
+                        'system-sm-medium',
+                        dataSourceType === DataSourceType.FILE && s.active,
+                        dataSourceTypeDisable && dataSourceType !== DataSourceType.FILE && s.disabled,
+                      )}
+                      onClick={() => {
+                        if (dataSourceTypeDisable)
+                          return
+                        changeType(DataSourceType.FILE)
+                        hideFilePreview()
+                        hideNotionPagePreview()
+                      }}
+                    >
+                      <span className={cn(s.datasetIcon)} />
+                      <span
+                        title={t('datasetCreation.stepOne.dataSourceType.file')}
+                        className='truncate'
+                      >
+                        {t('datasetCreation.stepOne.dataSourceType.file')}
+                      </span>
+                    </div>
+                    <div
+                      className={cn(
+                        s.dataSourceItem,
+                        'system-sm-medium',
+                        dataSourceType === DataSourceType.NOTION && s.active,
+                        dataSourceTypeDisable && dataSourceType !== DataSourceType.NOTION && s.disabled,
+                      )}
+                      onClick={() => {
+                        if (dataSourceTypeDisable)
+                          return
+                        changeType(DataSourceType.NOTION)
+                        hideFilePreview()
+                        hideNotionPagePreview()
+                      }}
+                    >
+                      <span className={cn(s.datasetIcon, s.notion)} />
+                      <span
+                        title={t('datasetCreation.stepOne.dataSourceType.notion')}
+                        className='truncate'
+                      >
+                        {t('datasetCreation.stepOne.dataSourceType.notion')}
+                      </span>
+                    </div>
+                    {(ENABLE_WEBSITE_FIRECRAWL || ENABLE_WEBSITE_JINAREADER || ENABLE_WEBSITE_WATERCRAWL) && (
+                      <div
+                      className={cn(
+                        s.dataSourceItem,
+                        'system-sm-medium',
+                        dataSourceType === DataSourceType.WEB && s.active,
+                        dataSourceTypeDisable && dataSourceType !== DataSourceType.WEB && s.disabled,
+                      )}
+                      onClick={() => changeType(DataSourceType.WEB)}
+                      >
+                      <span className={cn(s.datasetIcon, s.web)} />
+                      <span
+                        title={t('datasetCreation.stepOne.dataSourceType.web')}
+                        className='truncate'
+                      >
+                        {t('datasetCreation.stepOne.dataSourceType.web')}
+                      </span>
+                      </div>
+                    )}
+                  </div>
+                )
+              }
+              {dataSourceType === DataSourceType.FILE && (
+                <>
+                  <FileUploader
+                    fileList={files}
+                    titleClassName={!shouldShowDataSourceTypeList ? 'mt-[30px] !mb-[44px] !text-lg' : undefined}
+                    prepareFileList={updateFileList}
+                    onFileListUpdate={updateFileList}
+                    onFileUpdate={updateFile}
+                    onPreview={updateCurrentFile}
+                    notSupportBatchUpload={notSupportBatchUpload}
+                  />
+                  {isShowVectorSpaceFull && (
+                    <div className='mb-4 max-w-[640px]'>
+                      <VectorSpaceFull />
+                    </div>
+                  )}
+                  <div className="flex max-w-[640px] justify-end gap-2">
+                    {/* <Button>{t('datasetCreation.stepOne.cancel')}</Button> */}
+                    <Button disabled={nextDisabled} variant='primary' onClick={onStepChange}>
+                      <span className="flex gap-0.5 px-[10px]">
+                        <span className="px-0.5">{t('datasetCreation.stepOne.button')}</span>
+                        <RiArrowRightLine className="size-4" />
+                      </span>
+                    </Button>
+                  </div>
+                </>
+              )}
+              {dataSourceType === DataSourceType.NOTION && (
+                <>
+                  {!hasConnection && <NotionConnector onSetting={onSetting} />}
+                  {hasConnection && (
+                    <>
+                      <div className='mb-8 w-[640px]'>
+                        <NotionPageSelector
+                          value={notionPages.map(page => page.page_id)}
+                          onSelect={updateNotionPages}
+                          onPreview={updateCurrentPage}
+                        />
+                      </div>
+                      {isShowVectorSpaceFull && (
+                        <div className='mb-4 max-w-[640px]'>
+                          <VectorSpaceFull />
+                        </div>
+                      )}
+                      <div className="flex max-w-[640px] justify-end gap-2">
+                        {/* <Button>{t('datasetCreation.stepOne.cancel')}</Button> */}
+                        <Button disabled={isShowVectorSpaceFull || !notionPages.length} variant='primary' onClick={onStepChange}>
+                          <span className="flex gap-0.5 px-[10px]">
+                            <span className="px-0.5">{t('datasetCreation.stepOne.button')}</span>
+                            <RiArrowRightLine className="size-4" />
+                          </span>
+                        </Button>
+                      </div>
+                    </>
+                  )}
+                </>
+              )}
+              {dataSourceType === DataSourceType.WEB && (
+                <>
+                  <div className={cn('mb-8 w-[640px]', !shouldShowDataSourceTypeList && 'mt-12')}>
+                    <Website
+                      onPreview={setCurrentWebsite}
+                      checkedCrawlResult={websitePages}
+                      onCheckedCrawlResultChange={updateWebsitePages}
+                      onCrawlProviderChange={onWebsiteCrawlProviderChange}
+                      onJobIdChange={onWebsiteCrawlJobIdChange}
+                      crawlOptions={crawlOptions}
+                      onCrawlOptionsChange={onCrawlOptionsChange}
+                    />
+                  </div>
+                  {isShowVectorSpaceFull && (
+                    <div className='mb-4 max-w-[640px]'>
+                      <VectorSpaceFull />
+                    </div>
+                  )}
+                  <div className="flex max-w-[640px] justify-end gap-2">
+                    {/* <Button>{t('datasetCreation.stepOne.cancel')}</Button> */}
+                    <Button disabled={isShowVectorSpaceFull || !websitePages.length} variant='primary' onClick={onStepChange}>
+                      <span className="flex gap-0.5 px-[10px]">
+                        <span className="px-0.5">{t('datasetCreation.stepOne.button')}</span>
+                        <RiArrowRightLine className="size-4" />
+                      </span>
+                    </Button>
+                  </div>
+                </>
+              )}
+              {!datasetId && (
+                <>
+                  <div className='my-8 h-px max-w-[640px] bg-divider-regular' />
+                  <span className="inline-flex cursor-pointer items-center text-[13px] leading-4 text-text-accent" onClick={modalShowHandle}>
+                    <RiFolder6Line className="mr-1 size-4" />
+                    {t('datasetCreation.stepOne.emptyDatasetCreation')}
+                  </span>
+                </>
+              )}
+            </div>
+            <EmptyDatasetCreationModal show={showModal} onHide={modalCloseHandle} />
+          </div>
+        </div>
+        <div className='h-full w-1/2 overflow-y-auto'>
+          {currentFile && <FilePreview file={currentFile} hidePreview={hideFilePreview} />}
+          {currentNotionPage && <NotionPagePreview currentPage={currentNotionPage} hidePreview={hideNotionPagePreview} />}
+          {currentWebsite && <WebsitePreview payload={currentWebsite} hidePreview={hideWebsitePreview} />}
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default StepOne
diff --git a/app/components/datasets/create/step-three/index.module.css b/app/components/datasets/create/step-three/index.module.css
new file mode 100644
index 0000000..57fe705
--- /dev/null
+++ b/app/components/datasets/create/step-three/index.module.css
@@ -0,0 +1,75 @@
+.creationInfo {
+  padding-top: 42px;
+}
+.creationInfo .title {
+  @apply mb-2;
+  font-weight: 500;
+  font-size: 20px;
+  line-height: 30px;
+  color: #101828;
+}
+.creationInfo .content {
+  margin-bottom: 44px;
+  font-weight: 400;
+  font-size: 14px;
+  line-height: 20px;
+  color: #667085;
+}
+.creationInfo .label {
+  @apply mb-2;
+  font-weight: 500;
+  font-size: 14px;
+  line-height: 20px;
+  color: #101828;
+}
+.datasetName {
+  padding: 8px 12px;
+  background: #F9FAFB;
+  border-radius: 8px;
+  font-weight: 400;
+  font-size: 14px;
+  line-height: 20px;
+  color: #101828;
+  word-break: break-all;
+}
+
+.dividerLine {
+  margin: 24px 0;
+  height: 1px;
+  background-color: #eaecf0;
+}
+
+.sideTip {
+  @apply flex flex-col items-center shrink-0 ;
+  padding-top: 108px;
+  width: 524px;
+  border-left: 0.5px solid #F2F4F7;
+}
+.tipCard {
+  @apply flex flex-col items-start p-6;
+  width: 320px;
+  background-color: #F9FAFB;
+  box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05);
+  border-radius: 12px;
+}
+.tipCard .icon {
+  width: 32px;
+  height: 32px;
+  border: 1px solid #EAECF0;
+  border-radius: 6px;
+  background: center no-repeat url(../assets/book-open-01.svg);
+  background-size: 16px;
+}
+.tipCard .title {
+  margin: 12px 0;
+  font-weight: 500;
+  font-size: 16px;
+  line-height: 24px;
+  color: #344054;
+}
+.tipCard .content {
+  font-weight: 400;
+  font-size: 14px;
+  line-height: 20px;
+  color: #344054;
+}
diff --git a/app/components/datasets/create/step-three/index.tsx b/app/components/datasets/create/step-three/index.tsx
new file mode 100644
index 0000000..cdaa003
--- /dev/null
+++ b/app/components/datasets/create/step-three/index.tsx
@@ -0,0 +1,75 @@
+'use client'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiBookOpenLine } from '@remixicon/react'
+import EmbeddingProcess from '../embedding-process'
+
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import type { FullDocumentDetail, createDocumentResponse } from '@/models/datasets'
+import AppIcon from '@/app/components/base/app-icon'
+
+type StepThreeProps = {
+  datasetId?: string
+  datasetName?: string
+  indexingType?: string
+  retrievalMethod?: string
+  creationCache?: createDocumentResponse
+}
+
+const StepThree = ({ datasetId, datasetName, indexingType, creationCache, retrievalMethod }: StepThreeProps) => {
+  const { t } = useTranslation()
+
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+
+  return (
+    <div className="flex h-full max-h-full w-full justify-center overflow-y-auto">
+      <div className="h-full max-w-[960px] shrink-0 grow overflow-y-auto px-14 sm:px-16">
+        <div className="mx-auto max-w-[640px]">
+          {!datasetId && (
+            <>
+              <div className="pt-10">
+                <div className="mb-1 text-xl font-semibold leading-[22px] text-text-primary">{t('datasetCreation.stepThree.creationTitle')}</div>
+                <div className="mb-7 text-[13px] leading-4 text-text-tertiary">{t('datasetCreation.stepThree.creationContent')}</div>
+                <div className="flex gap-4">
+                  <AppIcon {...creationCache?.dataset} className="size-14 self-center text-2xl" />
+                  <div className="flex grow flex-col gap-1">
+                    <div className="text-[13px] font-semibold leading-6 text-text-secondary">{t('datasetCreation.stepThree.label')}</div>
+                    <div className="w-full truncate rounded-lg bg-components-input-bg-normal px-3 py-2 text-[13px] leading-4 text-components-input-text-filled">{datasetName || creationCache?.dataset?.name}</div>
+                  </div>
+                </div>
+              </div>
+              <hr className="my-6 h-[1px] border-0 bg-divider-subtle" />
+            </>
+          )}
+          {datasetId && (
+            <div className="pt-10">
+              <div className="mb-1 text-xl font-semibold leading-[22px] text-text-primary">{t('datasetCreation.stepThree.additionTitle')}</div>
+              <div className="mb-7 text-[13px] leading-4 text-text-tertiary">{`${t('datasetCreation.stepThree.additionP1')} ${datasetName || creationCache?.dataset?.name} ${t('datasetCreation.stepThree.additionP2')}`}</div>
+            </div>
+          )}
+          <EmbeddingProcess
+            datasetId={datasetId || creationCache?.dataset?.id || ''}
+            batchId={creationCache?.batch || ''}
+            documents={creationCache?.documents as FullDocumentDetail[]}
+            indexingType={indexingType || creationCache?.dataset?.indexing_technique}
+            retrievalMethod={retrievalMethod || creationCache?.dataset?.retrieval_model?.search_method}
+          />
+        </div>
+      </div>
+      {!isMobile && (
+        <div className="shrink-0 pr-8 pt-[88px] text-xs">
+          <div className="flex w-[328px] flex-col gap-3 rounded-xl bg-background-section p-6 text-text-tertiary">
+            <div className="flex size-10 items-center justify-center rounded-[10px] bg-components-card-bg shadow-lg">
+              <RiBookOpenLine className="size-5 text-text-accent" />
+            </div>
+            <div className="text-base font-semibold text-text-secondary">{t('datasetCreation.stepThree.sideTipTitle')}</div>
+            <div className="text-text-tertiary">{t('datasetCreation.stepThree.sideTipContent')}</div>
+          </div>
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default StepThree
diff --git a/app/components/datasets/create/step-two/escape.ts b/app/components/datasets/create/step-two/escape.ts
new file mode 100644
index 0000000..2e1c3a9
--- /dev/null
+++ b/app/components/datasets/create/step-two/escape.ts
@@ -0,0 +1,18 @@
+function escape(input: string): string {
+  if (!input || typeof input !== 'string')
+    return ''
+
+  const res = input
+    // .replaceAll('\\', '\\\\') // This would add too many backslashes
+    .replaceAll('\0', '\\0')
+    .replaceAll('\b', '\\b')
+    .replaceAll('\f', '\\f')
+    .replaceAll('\n', '\\n')
+    .replaceAll('\r', '\\r')
+    .replaceAll('\t', '\\t')
+    .replaceAll('\v', '\\v')
+    .replaceAll('\'', '\\\'')
+  return res
+}
+
+export default escape
diff --git a/app/components/datasets/create/step-two/index.module.css b/app/components/datasets/create/step-two/index.module.css
new file mode 100644
index 0000000..e79ab2d
--- /dev/null
+++ b/app/components/datasets/create/step-two/index.module.css
@@ -0,0 +1,413 @@
+.pageHeader {
+  @apply px-16 flex justify-between items-center;
+  position: sticky;
+  top: 0;
+  left: 0;
+  padding-top: 42px;
+  padding-bottom: 12px;
+  background-color: #fff;
+  font-weight: 600;
+  font-size: 18px;
+  line-height: 28px;
+  color: #101828;
+  z-index: 10;
+}
+
+.segmentationItem {
+  min-height: 68px;
+}
+
+.indexItem {
+  min-height: 126px;
+}
+
+.indexItem .disableMask {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(255, 255, 255, 0.5);
+  border-radius: 12px;
+  z-index: 2;
+}
+
+.indexItem .warningTip {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  padding: 8px 20px 8px 40px;
+  background: #FFFAEB;
+  border-top: 0.5px solid #FEF0C7;
+  border-radius: 12px;
+  font-size: 12px;
+  line-height: 18px;
+  color: #344054;
+  z-index: 3;
+}
+
+.indexItem .warningTip::before {
+  content: '';
+  position: absolute;
+  top: 11px;
+  left: 20px;
+  width: 12px;
+  height: 12px;
+  background: center no-repeat url(../assets/alert-triangle.svg);
+  background-size: 12px;
+}
+
+.indexItem .warningTip .click {
+  color: #155EEF;
+  cursor: pointer;
+}
+
+.disabled {
+  cursor: not-allowed !important;
+}
+
+.indexItem.disabled:hover {
+  background-color: #fcfcfd;
+  border-color: #f2f4f7;
+  box-shadow: none;
+  cursor: default;
+}
+
+.indexItem.disabled:hover .radio {
+  @apply w-4 h-4 border-[2px] border-gray-200 rounded-full;
+}
+
+.radioItem {
+  @apply relative mb-2 rounded-xl border border-components-option-card-option-border cursor-pointer bg-components-option-card-option-bg;
+}
+
+.radioItem.segmentationItem.custom {
+  height: auto;
+}
+
+.radioItem.segmentationItem.custom .typeHeader {
+  /* height: 65px; */
+}
+
+.radioItem.indexItem .typeHeader {
+  @apply py-4 pr-5;
+}
+
+.radioItem.indexItem.active .typeHeader {
+  padding: 15.5px 19.5px 15.5px 63.5px;
+}
+
+.radioItem.indexItem .radio {
+  top: 16px;
+  right: 20px;
+}
+
+.radioItem.indexItem.active .radio {
+  top: 16px;
+  right: 19.5px;
+}
+
+.radioItem.indexItem .typeHeader .title {
+  @apply pb-1;
+}
+
+.radioItem .typeIcon {
+  position: absolute;
+  top: 18px;
+  left: 20px;
+  width: 32px;
+  height: 32px;
+  background: #EEF4FF center no-repeat;
+  border-radius: 8px;
+}
+
+.typeIcon.auto {
+  background-color: #F5F3FF;
+  background-image: url(../assets/zap-fast.svg);
+}
+
+.typeIcon.customize {
+  background-image: url(../assets/sliders-02.svg);
+}
+
+.typeIcon.qualified {
+  background-color: #FFF6ED;
+  background-image: url(../assets/star-07.svg);
+}
+
+.typeIcon.economical {
+  background-image: url(../assets/piggy-bank-mod.svg);
+}
+
+.radioItem .radio {
+  @apply w-4 h-4 border-[2px] border-gray-200 rounded-full;
+  position: absolute;
+  top: 26px;
+  right: 20px;
+}
+
+.radioItem:hover {
+  background-color: #ffffff;
+  border-color: #B2CCFF;
+  box-shadow: 0px 12px 16px -4px rgba(16, 24, 40, 0.08), 0px 4px 6px -2px rgba(16, 24, 40, 0.03);
+}
+
+.radioItem:hover .radio {
+  border-color: #155eef;
+}
+
+.radioItem.active {
+  border-width: 1.5px;
+  border-color: #528BFF;
+  box-shadow: 0px 1px 3px rgba(16, 24, 40, 0.1), 0px 1px 2px rgba(16, 24, 40, 0.06);
+}
+
+.radioItem.active .radio {
+  top: 25.5px;
+  right: 19.5px;
+  border-width: 5px;
+  border-color: #155EEF;
+}
+
+.radioItem.active:hover {
+  border-width: 1.5px;
+  border-color: #528BFF;
+  box-shadow: 0px 1px 3px rgba(16, 24, 40, 0.1), 0px 1px 2px rgba(16, 24, 40, 0.06);
+}
+
+.radioItem.active .typeIcon {
+  top: 17.5px;
+  left: 19.5px;
+}
+
+.radioItem.active .typeHeader {
+  padding: 11.5px 63.5px;
+}
+
+.typeHeader {
+  @apply flex flex-col px-16 py-3 justify-center;
+}
+
+.typeHeader .title {
+  display: flex;
+  align-items: center;
+  padding-bottom: 2px;
+  font-weight: 500;
+  font-size: 16px;
+  line-height: 24px;
+  color: #101828;
+}
+
+.typeHeader .tip {
+  font-weight: 400;
+  font-size: 13px;
+  line-height: 18px;
+  color: #667085;
+}
+
+.recommendTag {
+  display: inline-flex;
+  justify-content: center;
+  align-items: center;
+  padding: 0 6px;
+  margin-left: 4px;
+  border: 1px solid #E0EAFF;
+  border-radius: 6px;
+  font-weight: 500;
+  font-size: 12px;
+  line-height: 20px;
+  color: #444CE7;
+}
+
+.typeFormBody {
+  @apply px-16;
+  border-top: 1px solid #F2F4F7;
+}
+
+.formRow {
+  @apply flex justify-between mt-6;
+}
+
+.formRow .label {
+  @apply mb-2 p-0;
+  font-weight: 500;
+  font-size: 14px;
+  line-height: 20px;
+  color: #101828;
+}
+
+.ruleItem {
+  @apply flex items-center py-1.5;
+}
+
+.formFooter {
+  padding: 16px 0 28px;
+}
+
+.formFooter .button {
+  font-size: 13px;
+  line-height: 18px;
+}
+
+.input {
+  @apply inline-flex h-9 w-full py-1 px-2 pr-14 rounded-lg text-xs leading-normal;
+  @apply bg-gray-100 caret-primary-600 hover:bg-gray-100 focus:ring-1 focus:ring-inset focus:ring-gray-200 focus-visible:outline-none focus:bg-white placeholder:text-gray-400;
+}
+
+.source {
+  @apply flex justify-between items-center mt-8 px-6 py-4 rounded-xl bg-gray-50 border border-gray-100;
+}
+
+.source .divider {
+  @apply shrink-0 mx-4 w-px bg-gray-200;
+  height: 42px;
+}
+
+.fileIcon {
+  @apply inline-flex mr-1 w-6 h-6 bg-center bg-no-repeat;
+  background-image: url(../assets/pdf.svg);
+  background-size: 24px;
+}
+
+.fileIcon.pdf {
+  background-image: url(../assets/pdf.svg);
+}
+
+.fileIcon.csv {
+  background-image: url(../assets/csv.svg);
+}
+
+.fileIcon.doc {
+  background-image: url(../assets/doc.svg);
+}
+
+.fileIcon.docx {
+  background-image: url(../assets/docx.svg);
+}
+
+.fileIcon.xlsx,
+.fileIcon.xls {
+  background-image: url(../assets/xlsx.svg);
+}
+
+.fileIcon.html,
+.fileIcon.htm {
+  background-image: url(../assets/html.svg);
+}
+
+.fileIcon.md,
+.fileIcon.markdown {
+  background-image: url(../assets/md.svg);
+}
+
+.fileIcon.txt {
+  background-image: url(../assets/txt.svg);
+}
+
+.fileIcon.json {
+  background-image: url(../assets/json.svg);
+}
+
+.sourceContent {
+  width: 0;
+  flex: 1 1 auto;
+}
+
+.sourceCount {
+  @apply shrink-0 ml-1;
+  font-weight: 500;
+  font-size: 13px;
+  line-height: 18px;
+  color: #667085;
+}
+
+.segmentCount {
+  flex: 1 1 30%;
+  max-width: 120px;
+}
+
+.divider {
+  @apply mx-3 w-px h-4 bg-gray-200;
+}
+
+.calculating {
+  color: #98A2B3;
+  font-size: 12px;
+  line-height: 18px;
+}
+
+.sideTip {
+  @apply flex flex-col items-center shrink-0;
+  padding-top: 108px;
+  width: 524px;
+  border-left: 0.5px solid #F2F4F7;
+}
+
+.tipCard {
+  @apply flex flex-col items-start p-6;
+  width: 320px;
+  background-color: #F9FAFB;
+  box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05);
+  border-radius: 12px;
+}
+
+.tipCard .icon {
+  width: 32px;
+  height: 32px;
+  border: 1px solid #EAECF0;
+  border-radius: 6px;
+  background: center no-repeat url(../assets/book-open-01.svg);
+  background-size: 16px;
+}
+
+.tipCard .title {
+  margin: 12px 0;
+  font-weight: 500;
+  font-size: 16px;
+  line-height: 24px;
+  color: #344054;
+}
+
+.tipCard .content {
+  font-weight: 400;
+  font-size: 14px;
+  line-height: 20px;
+  color: #344054;
+}
+
+.previewWrap {
+  flex-shrink: 0;
+  width: 524px;
+}
+
+.previewWrap.isMobile {
+  max-width: 524px;
+}
+
+/*
+ * `fixed` must under `previewHeader` because of style override would not work
+ */
+.fixed {
+  padding-top: 12px;
+  font-size: 12px;
+  line-height: 18px;
+  background: rgba(255, 255, 255, 0.9);
+  border-bottom: 0.5px solid #EAECF0;
+  backdrop-filter: blur(4px);
+  animation: fix 0.5s;
+}
+
+@keyframes fix {
+  from {
+    padding-top: 42px;
+    font-size: 18px;
+    line-height: 28px;
+  }
+
+  to {
+    padding-top: 12px;
+    font-size: 12px;
+    line-height: 18px;
+  }
+}
diff --git a/app/components/datasets/create/step-two/index.tsx b/app/components/datasets/create/step-two/index.tsx
new file mode 100644
index 0000000..6b6580a
--- /dev/null
+++ b/app/components/datasets/create/step-two/index.tsx
@@ -0,0 +1,1175 @@
+'use client'
+import type { FC, PropsWithChildren } from 'react'
+import React, { useCallback, useEffect, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import {
+  RiAlertFill,
+  RiArrowLeftLine,
+  RiSearchEyeLine,
+} from '@remixicon/react'
+import Link from 'next/link'
+import Image from 'next/image'
+import { useHover } from 'ahooks'
+import SettingCog from '../assets/setting-gear-mod.svg'
+import OrangeEffect from '../assets/option-card-effect-orange.svg'
+import FamilyMod from '../assets/family-mod.svg'
+import Note from '../assets/note-mod.svg'
+import FileList from '../assets/file-list-3-fill.svg'
+import { indexMethodIcon } from '../icons'
+import { PreviewContainer } from '../../preview/container'
+import { ChunkContainer, QAPreview } from '../../chunk'
+import { PreviewHeader } from '../../preview/header'
+import { FormattedText } from '../../formatted-text/formatted'
+import { PreviewSlice } from '../../formatted-text/flavours/preview-slice'
+import PreviewDocumentPicker from '../../common/document-picker/preview-document-picker'
+import s from './index.module.css'
+import unescape from './unescape'
+import escape from './escape'
+import { OptionCard } from './option-card'
+import LanguageSelect from './language-select'
+import { DelimiterInput, MaxLengthInput, OverlapInput } from './inputs'
+import cn from '@/utils/classnames'
+import type { CrawlOptions, CrawlResultItem, CreateDocumentReq, CustomFile, DocumentItem, FullDocumentDetail, ParentMode, PreProcessingRule, ProcessRule, Rules, createDocumentResponse } from '@/models/datasets'
+import { ChunkingMode, DataSourceType, ProcessMode } from '@/models/datasets'
+
+import Button from '@/app/components/base/button'
+import FloatRightContainer from '@/app/components/base/float-right-container'
+import RetrievalMethodConfig from '@/app/components/datasets/common/retrieval-method-config'
+import EconomicalRetrievalMethodConfig from '@/app/components/datasets/common/economical-retrieval-method-config'
+import type { RetrievalConfig } from '@/types/app'
+import { isReRankModelSelected } from '@/app/components/datasets/common/check-rerank-model'
+import Toast from '@/app/components/base/toast'
+import type { NotionPage } from '@/models/common'
+import { DataSourceProvider } from '@/models/common'
+import { useDatasetDetailContext } from '@/context/dataset-detail'
+import I18n from '@/context/i18n'
+import { RETRIEVE_METHOD } from '@/types/app'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import { useDefaultModel, useModelList, useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { LanguagesSupported } from '@/i18n/language'
+import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
+import type { DefaultModel } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import Checkbox from '@/app/components/base/checkbox'
+import RadioCard from '@/app/components/base/radio-card'
+import { FULL_DOC_PREVIEW_LENGTH, IS_CE_EDITION } from '@/config'
+import Divider from '@/app/components/base/divider'
+import { getNotionInfo, getWebsiteInfo, useCreateDocument, useCreateFirstDocument, useFetchDefaultProcessRule, useFetchFileIndexingEstimateForFile, useFetchFileIndexingEstimateForNotion, useFetchFileIndexingEstimateForWeb } from '@/service/knowledge/use-create-dataset'
+import Badge from '@/app/components/base/badge'
+import { SkeletonContainer, SkeletonPoint, SkeletonRectangle, SkeletonRow } from '@/app/components/base/skeleton'
+import Tooltip from '@/app/components/base/tooltip'
+import CustomDialog from '@/app/components/base/dialog'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback'
+import { noop } from 'lodash-es'
+
+const TextLabel: FC<PropsWithChildren> = (props) => {
+  return <label className='system-sm-semibold text-text-secondary'>{props.children}</label>
+}
+
+type StepTwoProps = {
+  isSetting?: boolean
+  documentDetail?: FullDocumentDetail
+  isAPIKeySet: boolean
+  onSetting: () => void
+  datasetId?: string
+  indexingType?: IndexingType
+  retrievalMethod?: string
+  dataSourceType: DataSourceType
+  files: CustomFile[]
+  notionPages?: NotionPage[]
+  websitePages?: CrawlResultItem[]
+  crawlOptions?: CrawlOptions
+  websiteCrawlProvider?: DataSourceProvider
+  websiteCrawlJobId?: string
+  onStepChange?: (delta: number) => void
+  updateIndexingTypeCache?: (type: string) => void
+  updateRetrievalMethodCache?: (method: string) => void
+  updateResultCache?: (res: createDocumentResponse) => void
+  onSave?: () => void
+  onCancel?: () => void
+}
+
+export enum IndexingType {
+  QUALIFIED = 'high_quality',
+  ECONOMICAL = 'economy',
+}
+
+const DEFAULT_SEGMENT_IDENTIFIER = '\\n\\n'
+const DEFAULT_MAXIMUM_CHUNK_LENGTH = 1024
+const DEFAULT_OVERLAP = 50
+const MAXIMUM_CHUNK_TOKEN_LENGTH = Number.parseInt(globalThis.document?.body?.getAttribute('data-public-indexing-max-segmentation-tokens-length') || '4000', 10)
+
+type ParentChildConfig = {
+  chunkForContext: ParentMode
+  parent: {
+    delimiter: string
+    maxLength: number
+  }
+  child: {
+    delimiter: string
+    maxLength: number
+  }
+}
+
+const defaultParentChildConfig: ParentChildConfig = {
+  chunkForContext: 'paragraph',
+  parent: {
+    delimiter: '\\n\\n',
+    maxLength: 1024,
+  },
+  child: {
+    delimiter: '\\n',
+    maxLength: 512,
+  },
+}
+
+const StepTwo = ({
+  isSetting,
+  documentDetail,
+  isAPIKeySet,
+  datasetId,
+  indexingType,
+  dataSourceType: inCreatePageDataSourceType,
+  files,
+  notionPages = [],
+  websitePages = [],
+  crawlOptions,
+  websiteCrawlProvider = DataSourceProvider.fireCrawl,
+  websiteCrawlJobId = '',
+  onStepChange,
+  updateIndexingTypeCache,
+  updateResultCache,
+  onSave,
+  onCancel,
+  updateRetrievalMethodCache,
+}: StepTwoProps) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+
+  const { dataset: currentDataset, mutateDatasetRes } = useDatasetDetailContext()
+
+  const isInUpload = Boolean(currentDataset)
+  const isUploadInEmptyDataset = isInUpload && !currentDataset?.doc_form
+  const isNotUploadInEmptyDataset = !isUploadInEmptyDataset
+  const isInInit = !isInUpload && !isSetting
+
+  const isInCreatePage = !datasetId || (datasetId && !currentDataset?.data_source_type)
+  const dataSourceType = isInCreatePage ? inCreatePageDataSourceType : currentDataset?.data_source_type
+  const [segmentationType, setSegmentationType] = useState<ProcessMode>(ProcessMode.general)
+  const [segmentIdentifier, doSetSegmentIdentifier] = useState(DEFAULT_SEGMENT_IDENTIFIER)
+  const setSegmentIdentifier = useCallback((value: string, canEmpty?: boolean) => {
+    doSetSegmentIdentifier(value ? escape(value) : (canEmpty ? '' : DEFAULT_SEGMENT_IDENTIFIER))
+  }, [])
+  const [maxChunkLength, setMaxChunkLength] = useState(DEFAULT_MAXIMUM_CHUNK_LENGTH) // default chunk length
+  const [limitMaxChunkLength, setLimitMaxChunkLength] = useState(MAXIMUM_CHUNK_TOKEN_LENGTH)
+  const [overlap, setOverlap] = useState(DEFAULT_OVERLAP)
+  const [rules, setRules] = useState<PreProcessingRule[]>([])
+  const [defaultConfig, setDefaultConfig] = useState<Rules>()
+  const hasSetIndexType = !!indexingType
+  const [indexType, setIndexType] = useState<IndexingType>(() => {
+    if (hasSetIndexType)
+      return indexingType
+    return isAPIKeySet ? IndexingType.QUALIFIED : IndexingType.ECONOMICAL
+  })
+
+  const [previewFile, setPreviewFile] = useState<DocumentItem>(
+    (datasetId && documentDetail)
+      ? documentDetail.file
+      : files[0],
+  )
+  const [previewNotionPage, setPreviewNotionPage] = useState<NotionPage>(
+    (datasetId && documentDetail)
+      ? documentDetail.notion_page
+      : notionPages[0],
+  )
+
+  const [previewWebsitePage, setPreviewWebsitePage] = useState<CrawlResultItem>(
+    (datasetId && documentDetail)
+      ? documentDetail.website_page
+      : websitePages[0],
+  )
+
+  // QA Related
+  const [isQAConfirmDialogOpen, setIsQAConfirmDialogOpen] = useState(false)
+  const [docForm, setDocForm] = useState<ChunkingMode>(
+    (datasetId && documentDetail) ? documentDetail.doc_form as ChunkingMode : ChunkingMode.text,
+  )
+  const handleChangeDocform = (value: ChunkingMode) => {
+    if (value === ChunkingMode.qa && indexType === IndexingType.ECONOMICAL) {
+      setIsQAConfirmDialogOpen(true)
+      return
+    }
+    if (value === ChunkingMode.parentChild && indexType === IndexingType.ECONOMICAL)
+      setIndexType(IndexingType.QUALIFIED)
+    setDocForm(value)
+    // eslint-disable-next-line ts/no-use-before-define
+    currentEstimateMutation.reset()
+  }
+
+  const [docLanguage, setDocLanguage] = useState<string>(
+    (datasetId && documentDetail) ? documentDetail.doc_language : (locale !== LanguagesSupported[1] ? 'English' : 'Chinese Simplified'),
+  )
+
+  const [parentChildConfig, setParentChildConfig] = useState<ParentChildConfig>(defaultParentChildConfig)
+
+  const getIndexing_technique = () => indexingType || indexType
+  const currentDocForm = currentDataset?.doc_form || docForm
+
+  const getProcessRule = (): ProcessRule => {
+    if (currentDocForm === ChunkingMode.parentChild) {
+      return {
+        rules: {
+          pre_processing_rules: rules,
+          segmentation: {
+            separator: unescape(
+              parentChildConfig.parent.delimiter,
+            ),
+            max_tokens: parentChildConfig.parent.maxLength,
+          },
+          parent_mode: parentChildConfig.chunkForContext,
+          subchunk_segmentation: {
+            separator: unescape(parentChildConfig.child.delimiter),
+            max_tokens: parentChildConfig.child.maxLength,
+          },
+        },
+        mode: 'hierarchical',
+      } as ProcessRule
+    }
+    return {
+      rules: {
+        pre_processing_rules: rules,
+        segmentation: {
+          separator: unescape(segmentIdentifier),
+          max_tokens: maxChunkLength,
+          chunk_overlap: overlap,
+        },
+      }, // api will check this. It will be removed after api refactored.
+      mode: segmentationType,
+    } as ProcessRule
+  }
+
+  const fileIndexingEstimateQuery = useFetchFileIndexingEstimateForFile({
+    docForm: currentDocForm,
+    docLanguage,
+    dataSourceType: DataSourceType.FILE,
+    files: previewFile
+      ? [files.find(file => file.name === previewFile.name)!]
+      : files,
+    indexingTechnique: getIndexing_technique() as any,
+    processRule: getProcessRule(),
+    dataset_id: datasetId!,
+  })
+  const notionIndexingEstimateQuery = useFetchFileIndexingEstimateForNotion({
+    docForm: currentDocForm,
+    docLanguage,
+    dataSourceType: DataSourceType.NOTION,
+    notionPages: [previewNotionPage],
+    indexingTechnique: getIndexing_technique() as any,
+    processRule: getProcessRule(),
+    dataset_id: datasetId || '',
+  })
+
+  const websiteIndexingEstimateQuery = useFetchFileIndexingEstimateForWeb({
+    docForm: currentDocForm,
+    docLanguage,
+    dataSourceType: DataSourceType.WEB,
+    websitePages: [previewWebsitePage],
+    crawlOptions,
+    websiteCrawlProvider,
+    websiteCrawlJobId,
+    indexingTechnique: getIndexing_technique() as any,
+    processRule: getProcessRule(),
+    dataset_id: datasetId || '',
+  })
+
+  const currentEstimateMutation = dataSourceType === DataSourceType.FILE
+    ? fileIndexingEstimateQuery
+    : dataSourceType === DataSourceType.NOTION
+      ? notionIndexingEstimateQuery
+      : websiteIndexingEstimateQuery
+
+  const fetchEstimate = useCallback(() => {
+    if (dataSourceType === DataSourceType.FILE)
+      fileIndexingEstimateQuery.mutate()
+
+    if (dataSourceType === DataSourceType.NOTION)
+      notionIndexingEstimateQuery.mutate()
+
+    if (dataSourceType === DataSourceType.WEB)
+      websiteIndexingEstimateQuery.mutate()
+  }, [dataSourceType, fileIndexingEstimateQuery, notionIndexingEstimateQuery, websiteIndexingEstimateQuery])
+
+  const estimate
+    = dataSourceType === DataSourceType.FILE
+      ? fileIndexingEstimateQuery.data
+      : dataSourceType === DataSourceType.NOTION
+        ? notionIndexingEstimateQuery.data
+        : websiteIndexingEstimateQuery.data
+
+  const getRuleName = (key: string) => {
+    if (key === 'remove_extra_spaces')
+      return t('datasetCreation.stepTwo.removeExtraSpaces')
+
+    if (key === 'remove_urls_emails')
+      return t('datasetCreation.stepTwo.removeUrlEmails')
+
+    if (key === 'remove_stopwords')
+      return t('datasetCreation.stepTwo.removeStopwords')
+  }
+  const ruleChangeHandle = (id: string) => {
+    const newRules = rules.map((rule) => {
+      if (rule.id === id) {
+        return {
+          id: rule.id,
+          enabled: !rule.enabled,
+        }
+      }
+      return rule
+    })
+    setRules(newRules)
+  }
+  const resetRules = () => {
+    if (defaultConfig) {
+      setSegmentIdentifier(defaultConfig.segmentation.separator)
+      setMaxChunkLength(defaultConfig.segmentation.max_tokens)
+      setOverlap(defaultConfig.segmentation.chunk_overlap!)
+      setRules(defaultConfig.pre_processing_rules)
+    }
+    setParentChildConfig(defaultParentChildConfig)
+  }
+
+  const updatePreview = () => {
+    if (segmentationType === ProcessMode.general && maxChunkLength > MAXIMUM_CHUNK_TOKEN_LENGTH) {
+      Toast.notify({ type: 'error', message: t('datasetCreation.stepTwo.maxLengthCheck', { limit: MAXIMUM_CHUNK_TOKEN_LENGTH }) })
+      return
+    }
+    fetchEstimate()
+  }
+
+  const {
+    modelList: rerankModelList,
+    defaultModel: rerankDefaultModel,
+    currentModel: isRerankDefaultModelValid,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
+  const { data: embeddingModelList } = useModelList(ModelTypeEnum.textEmbedding)
+  const { data: defaultEmbeddingModel } = useDefaultModel(ModelTypeEnum.textEmbedding)
+  const [embeddingModel, setEmbeddingModel] = useState<DefaultModel>(
+    currentDataset?.embedding_model
+      ? {
+        provider: currentDataset.embedding_model_provider,
+        model: currentDataset.embedding_model,
+      }
+      : {
+        provider: defaultEmbeddingModel?.provider.provider || '',
+        model: defaultEmbeddingModel?.model || '',
+      },
+  )
+  const [retrievalConfig, setRetrievalConfig] = useState(currentDataset?.retrieval_model_dict || {
+    search_method: RETRIEVE_METHOD.semantic,
+    reranking_enable: false,
+    reranking_model: {
+      reranking_provider_name: '',
+      reranking_model_name: '',
+    },
+    top_k: 3,
+    score_threshold_enabled: false,
+    score_threshold: 0.5,
+  } as RetrievalConfig)
+
+  useEffect(() => {
+    if (currentDataset?.retrieval_model_dict)
+      return
+    setRetrievalConfig({
+      search_method: RETRIEVE_METHOD.semantic,
+      reranking_enable: !!isRerankDefaultModelValid,
+      reranking_model: {
+        reranking_provider_name: isRerankDefaultModelValid ? rerankDefaultModel?.provider.provider ?? '' : '',
+        reranking_model_name: isRerankDefaultModelValid ? rerankDefaultModel?.model ?? '' : '',
+      },
+      top_k: 3,
+      score_threshold_enabled: false,
+      score_threshold: 0.5,
+    })
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [rerankDefaultModel, isRerankDefaultModelValid])
+
+  const getCreationParams = () => {
+    let params
+    if (segmentationType === ProcessMode.general && overlap > maxChunkLength) {
+      Toast.notify({ type: 'error', message: t('datasetCreation.stepTwo.overlapCheck') })
+      return
+    }
+    if (segmentationType === ProcessMode.general && maxChunkLength > limitMaxChunkLength) {
+      Toast.notify({ type: 'error', message: t('datasetCreation.stepTwo.maxLengthCheck', { limit: limitMaxChunkLength }) })
+      return
+    }
+    if (isSetting) {
+      params = {
+        original_document_id: documentDetail?.id,
+        doc_form: currentDocForm,
+        doc_language: docLanguage,
+        process_rule: getProcessRule(),
+        retrieval_model: retrievalConfig, // Readonly. If want to changed, just go to settings page.
+        embedding_model: embeddingModel.model, // Readonly
+        embedding_model_provider: embeddingModel.provider, // Readonly
+        indexing_technique: getIndexing_technique(),
+      } as CreateDocumentReq
+    }
+    else { // create
+      const indexMethod = getIndexing_technique()
+      if (indexMethod === IndexingType.QUALIFIED && (!embeddingModel.model || !embeddingModel.provider)) {
+        Toast.notify({
+          type: 'error',
+          message: t('appDebug.datasetConfig.embeddingModelRequired'),
+        })
+        return
+      }
+      if (
+        !isReRankModelSelected({
+          rerankModelList,
+          retrievalConfig,
+          indexMethod: indexMethod as string,
+        })
+      ) {
+        Toast.notify({ type: 'error', message: t('appDebug.datasetConfig.rerankModelRequired') })
+        return
+      }
+      params = {
+        data_source: {
+          type: dataSourceType,
+          info_list: {
+            data_source_type: dataSourceType,
+          },
+        },
+        indexing_technique: getIndexing_technique(),
+        process_rule: getProcessRule(),
+        doc_form: currentDocForm,
+        doc_language: docLanguage,
+        retrieval_model: retrievalConfig,
+        embedding_model: embeddingModel.model,
+        embedding_model_provider: embeddingModel.provider,
+      } as CreateDocumentReq
+      if (dataSourceType === DataSourceType.FILE) {
+        params.data_source.info_list.file_info_list = {
+          file_ids: files.map(file => file.id || '').filter(Boolean),
+        }
+      }
+      if (dataSourceType === DataSourceType.NOTION)
+        params.data_source.info_list.notion_info_list = getNotionInfo(notionPages)
+
+      if (dataSourceType === DataSourceType.WEB) {
+        params.data_source.info_list.website_info_list = getWebsiteInfo({
+          websiteCrawlProvider,
+          websiteCrawlJobId,
+          websitePages,
+        })
+      }
+    }
+    return params
+  }
+
+  const fetchDefaultProcessRuleMutation = useFetchDefaultProcessRule({
+    onSuccess(data) {
+      const separator = data.rules.segmentation.separator
+      setSegmentIdentifier(separator)
+      setMaxChunkLength(data.rules.segmentation.max_tokens)
+      setOverlap(data.rules.segmentation.chunk_overlap!)
+      setRules(data.rules.pre_processing_rules)
+      setDefaultConfig(data.rules)
+      setLimitMaxChunkLength(data.limits.indexing_max_segmentation_tokens_length)
+    },
+    onError(error) {
+      Toast.notify({
+        type: 'error',
+        message: `${error}`,
+      })
+    },
+  })
+
+  const getRulesFromDetail = () => {
+    if (documentDetail) {
+      const rules = documentDetail.dataset_process_rule.rules
+      const separator = rules.segmentation.separator
+      const max = rules.segmentation.max_tokens
+      const overlap = rules.segmentation.chunk_overlap
+      setSegmentIdentifier(separator)
+      setMaxChunkLength(max)
+      setOverlap(overlap!)
+      setRules(rules.pre_processing_rules)
+      setDefaultConfig(rules)
+    }
+  }
+
+  const getDefaultMode = () => {
+    if (documentDetail)
+      setSegmentationType(documentDetail.dataset_process_rule.mode)
+  }
+
+  const createFirstDocumentMutation = useCreateFirstDocument({
+    onError(error) {
+      Toast.notify({
+        type: 'error',
+        message: `${error}`,
+      })
+    },
+  })
+  const createDocumentMutation = useCreateDocument(datasetId!, {
+    onError(error) {
+      Toast.notify({
+        type: 'error',
+        message: `${error}`,
+      })
+    },
+  })
+
+  const isCreating = createFirstDocumentMutation.isPending || createDocumentMutation.isPending
+
+  const createHandle = async () => {
+    const params = getCreationParams()
+    if (!params)
+      return false
+
+    if (!datasetId) {
+      await createFirstDocumentMutation.mutateAsync(
+        params,
+        {
+          onSuccess(data) {
+            updateIndexingTypeCache && updateIndexingTypeCache(indexType as string)
+            updateResultCache && updateResultCache(data)
+            updateRetrievalMethodCache && updateRetrievalMethodCache(retrievalConfig.search_method as string)
+          },
+        },
+      )
+    }
+    else {
+      await createDocumentMutation.mutateAsync(params, {
+        onSuccess(data) {
+          updateIndexingTypeCache && updateIndexingTypeCache(indexType as string)
+          updateResultCache && updateResultCache(data)
+        },
+      })
+    }
+    if (mutateDatasetRes)
+      mutateDatasetRes()
+    onStepChange && onStepChange(+1)
+    isSetting && onSave && onSave()
+  }
+
+  useEffect(() => {
+    // fetch rules
+    if (!isSetting) {
+      fetchDefaultProcessRuleMutation.mutate('/datasets/process-rule')
+    }
+    else {
+      getRulesFromDetail()
+      getDefaultMode()
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  useEffect(() => {
+    // get indexing type by props
+    if (indexingType)
+      setIndexType(indexingType as IndexingType)
+    else
+      setIndexType(isAPIKeySet ? IndexingType.QUALIFIED : IndexingType.ECONOMICAL)
+  }, [isAPIKeySet, indexingType, datasetId])
+
+  const economyDomRef = useRef<HTMLDivElement>(null)
+  const isHoveringEconomy = useHover(economyDomRef)
+
+  const isModelAndRetrievalConfigDisabled = !!datasetId && !!currentDataset?.data_source_type
+
+  return (
+    <div className='flex h-full w-full'>
+      <div className={cn('relative h-full w-1/2 overflow-y-auto py-6', isMobile ? 'px-4' : 'px-12')}>
+        <div className={'system-md-semibold mb-1 text-text-secondary'}>{t('datasetCreation.stepTwo.segmentation')}</div>
+        {((isInUpload && [ChunkingMode.text, ChunkingMode.qa].includes(currentDataset!.doc_form))
+          || isUploadInEmptyDataset
+          || isInInit)
+          && <OptionCard
+            className='mb-2 bg-background-section'
+            title={t('datasetCreation.stepTwo.general')}
+            icon={<Image width={20} height={20} src={SettingCog} alt={t('datasetCreation.stepTwo.general')} />}
+            activeHeaderClassName='bg-dataset-option-card-blue-gradient'
+            description={t('datasetCreation.stepTwo.generalTip')}
+            isActive={
+              [ChunkingMode.text, ChunkingMode.qa].includes(currentDocForm)
+            }
+            onSwitched={() =>
+              handleChangeDocform(ChunkingMode.text)
+            }
+            actions={
+              <>
+                <Button variant={'secondary-accent'} onClick={() => updatePreview()}>
+                  <RiSearchEyeLine className='mr-0.5 h-4 w-4' />
+                  {t('datasetCreation.stepTwo.previewChunk')}
+                </Button>
+                <Button variant={'ghost'} onClick={resetRules}>
+                  {t('datasetCreation.stepTwo.reset')}
+                </Button>
+              </>
+            }
+            noHighlight={isInUpload && isNotUploadInEmptyDataset}
+          >
+            <div className='flex flex-col gap-y-4'>
+              <div className='flex gap-3'>
+                <DelimiterInput
+                  value={segmentIdentifier}
+                  onChange={e => setSegmentIdentifier(e.target.value, true)}
+                />
+                <MaxLengthInput
+                  unit='characters'
+                  value={maxChunkLength}
+                  onChange={setMaxChunkLength}
+                />
+                <OverlapInput
+                  unit='characters'
+                  value={overlap}
+                  min={1}
+                  onChange={setOverlap}
+                />
+              </div>
+              <div className='flex w-full flex-col'>
+                <div className='flex items-center gap-x-2'>
+                  <div className='inline-flex shrink-0'>
+                    <TextLabel>{t('datasetCreation.stepTwo.rules')}</TextLabel>
+                  </div>
+                  <Divider className='grow' bgStyle='gradient' />
+                </div>
+                <div className='mt-1'>
+                  {rules.map(rule => (
+                    <div key={rule.id} className={s.ruleItem} onClick={() => {
+                      ruleChangeHandle(rule.id)
+                    }}>
+                      <Checkbox
+                        checked={rule.enabled}
+                      />
+                      <label className="system-sm-regular ml-2 cursor-pointer text-text-secondary">{getRuleName(rule.id)}</label>
+                    </div>
+                  ))}
+                  {IS_CE_EDITION && <>
+                    <Divider type='horizontal' className='my-4 bg-divider-subtle' />
+                    <div className='flex items-center py-0.5'>
+                      <div className='flex items-center' onClick={() => {
+                        if (currentDataset?.doc_form)
+                          return
+                        if (docForm === ChunkingMode.qa)
+                          handleChangeDocform(ChunkingMode.text)
+                        else
+                          handleChangeDocform(ChunkingMode.qa)
+                      }}>
+                        <Checkbox
+                          checked={currentDocForm === ChunkingMode.qa}
+                          disabled={!!currentDataset?.doc_form}
+                        />
+                        <label className="system-sm-regular ml-2 cursor-pointer text-text-secondary">
+                          {t('datasetCreation.stepTwo.useQALanguage')}
+                        </label>
+                      </div>
+                      <LanguageSelect
+                        currentLanguage={docLanguage || locale}
+                        onSelect={setDocLanguage}
+                        disabled={currentDocForm !== ChunkingMode.qa}
+                      />
+                      <Tooltip popupContent={t('datasetCreation.stepTwo.QATip')} />
+                    </div>
+                    {currentDocForm === ChunkingMode.qa && (
+                      <div
+                        style={{
+                          background: 'linear-gradient(92deg, rgba(247, 144, 9, 0.1) 0%, rgba(255, 255, 255, 0.00) 100%)',
+                        }}
+                        className='mt-2 flex h-10 items-center gap-2 rounded-xl border border-components-panel-border px-3 text-xs shadow-xs backdrop-blur-[5px]'
+                      >
+                        <RiAlertFill className='size-4 text-text-warning-secondary' />
+                        <span className='system-xs-medium text-text-primary'>
+                          {t('datasetCreation.stepTwo.QATip')}
+                        </span>
+                      </div>
+                    )}
+                  </>}
+                </div>
+              </div>
+            </div>
+          </OptionCard>}
+        {
+          (
+            (isInUpload && currentDataset!.doc_form === ChunkingMode.parentChild)
+            || isUploadInEmptyDataset
+            || isInInit
+          )
+          && <OptionCard
+            title={t('datasetCreation.stepTwo.parentChild')}
+            icon={<Image width={20} height={20} src={FamilyMod} alt={t('datasetCreation.stepTwo.parentChild')} />}
+            effectImg={OrangeEffect.src}
+            activeHeaderClassName='bg-dataset-option-card-orange-gradient'
+            description={t('datasetCreation.stepTwo.parentChildTip')}
+            isActive={currentDocForm === ChunkingMode.parentChild}
+            onSwitched={() => handleChangeDocform(ChunkingMode.parentChild)}
+            actions={
+              <>
+                <Button variant={'secondary-accent'} onClick={() => updatePreview()}>
+                  <RiSearchEyeLine className='mr-0.5 h-4 w-4' />
+                  {t('datasetCreation.stepTwo.previewChunk')}
+                </Button>
+                <Button variant={'ghost'} onClick={resetRules}>
+                  {t('datasetCreation.stepTwo.reset')}
+                </Button>
+              </>
+            }
+            noHighlight={isInUpload && isNotUploadInEmptyDataset}
+          >
+            <div className='flex flex-col gap-4'>
+              <div>
+                <div className='flex items-center gap-x-2'>
+                  <div className='inline-flex shrink-0'>
+                    <TextLabel>{t('datasetCreation.stepTwo.parentChunkForContext')}</TextLabel>
+                  </div>
+                  <Divider className='grow' bgStyle='gradient' />
+                </div>
+                <RadioCard className='mt-1'
+                  icon={<Image src={Note} alt='' />}
+                  title={t('datasetCreation.stepTwo.paragraph')}
+                  description={t('datasetCreation.stepTwo.paragraphTip')}
+                  isChosen={parentChildConfig.chunkForContext === 'paragraph'}
+                  onChosen={() => setParentChildConfig(
+                    {
+                      ...parentChildConfig,
+                      chunkForContext: 'paragraph',
+                    },
+                  )}
+                  chosenConfig={
+                    <div className='flex gap-3'>
+                      <DelimiterInput
+                        value={parentChildConfig.parent.delimiter}
+                        tooltip={t('datasetCreation.stepTwo.parentChildDelimiterTip')!}
+                        onChange={e => setParentChildConfig({
+                          ...parentChildConfig,
+                          parent: {
+                            ...parentChildConfig.parent,
+                            delimiter: e.target.value ? escape(e.target.value) : '',
+                          },
+                        })}
+                      />
+                      <MaxLengthInput
+                        unit='characters'
+                        value={parentChildConfig.parent.maxLength}
+                        onChange={value => setParentChildConfig({
+                          ...parentChildConfig,
+                          parent: {
+                            ...parentChildConfig.parent,
+                            maxLength: value,
+                          },
+                        })}
+                      />
+                    </div>
+                  }
+                />
+                <RadioCard className='mt-2'
+                  icon={<Image src={FileList} alt='' />}
+                  title={t('datasetCreation.stepTwo.fullDoc')}
+                  description={t('datasetCreation.stepTwo.fullDocTip')}
+                  onChosen={() => setParentChildConfig(
+                    {
+                      ...parentChildConfig,
+                      chunkForContext: 'full-doc',
+                    },
+                  )}
+                  isChosen={parentChildConfig.chunkForContext === 'full-doc'}
+                />
+              </div>
+
+              <div>
+                <div className='flex items-center gap-x-2'>
+                  <div className='inline-flex shrink-0'>
+                    <TextLabel>{t('datasetCreation.stepTwo.childChunkForRetrieval')}</TextLabel>
+                  </div>
+                  <Divider className='grow' bgStyle='gradient' />
+                </div>
+                <div className='mt-1 flex gap-3'>
+                  <DelimiterInput
+                    value={parentChildConfig.child.delimiter}
+                    tooltip={t('datasetCreation.stepTwo.parentChildChunkDelimiterTip')!}
+                    onChange={e => setParentChildConfig({
+                      ...parentChildConfig,
+                      child: {
+                        ...parentChildConfig.child,
+                        delimiter: e.target.value ? escape(e.target.value) : '',
+                      },
+                    })}
+                  />
+                  <MaxLengthInput
+                    unit='characters'
+                    value={parentChildConfig.child.maxLength}
+                    onChange={value => setParentChildConfig({
+                      ...parentChildConfig,
+                      child: {
+                        ...parentChildConfig.child,
+                        maxLength: value,
+                      },
+                    })}
+                  />
+                </div>
+              </div>
+              <div>
+                <div className='flex items-center gap-x-2'>
+                  <div className='inline-flex shrink-0'>
+                    <TextLabel>{t('datasetCreation.stepTwo.rules')}</TextLabel>
+                  </div>
+                  <Divider className='grow' bgStyle='gradient' />
+                </div>
+                <div className='mt-1'>
+                  {rules.map(rule => (
+                    <div key={rule.id} className={s.ruleItem} onClick={() => {
+                      ruleChangeHandle(rule.id)
+                    }}>
+                      <Checkbox
+                        checked={rule.enabled}
+                      />
+                      <label className="system-sm-regular ml-2 cursor-pointer text-text-secondary">{getRuleName(rule.id)}</label>
+                    </div>
+                  ))}
+                </div>
+              </div>
+            </div>
+          </OptionCard>}
+        <Divider className='my-5' />
+        <div className={'system-md-semibold mb-1 text-text-secondary'}>{t('datasetCreation.stepTwo.indexMode')}</div>
+        <div className='flex items-center gap-2'>
+          {(!hasSetIndexType || (hasSetIndexType && indexingType === IndexingType.QUALIFIED)) && (
+            <OptionCard className='flex-1 self-stretch'
+              title={<div className='flex items-center'>
+                {t('datasetCreation.stepTwo.qualified')}
+                <Badge className={cn('ml-1 h-[18px]', (!hasSetIndexType && indexType === IndexingType.QUALIFIED) ? 'border-text-accent-secondary text-text-accent-secondary' : '')} uppercase>
+                  {t('datasetCreation.stepTwo.recommend')}
+                </Badge>
+                <span className='ml-auto'>
+                  {!hasSetIndexType && <span className={cn(s.radio)} />}
+                </span>
+              </div>}
+              description={t('datasetCreation.stepTwo.qualifiedTip')}
+              icon={<Image src={indexMethodIcon.high_quality} alt='' />}
+              isActive={!hasSetIndexType && indexType === IndexingType.QUALIFIED}
+              disabled={hasSetIndexType}
+              onSwitched={() => {
+                setIndexType(IndexingType.QUALIFIED)
+              }}
+            />
+          )}
+
+          {(!hasSetIndexType || (hasSetIndexType && indexingType === IndexingType.ECONOMICAL)) && (
+            <>
+              <CustomDialog show={isQAConfirmDialogOpen} onClose={() => setIsQAConfirmDialogOpen(false)} className='w-[432px]'>
+                <header className='mb-4 pt-6'>
+                  <h2 className='text-lg font-semibold'>
+                    {t('datasetCreation.stepTwo.qaSwitchHighQualityTipTitle')}
+                  </h2>
+                  <p className='mt-2 text-sm font-normal'>
+                    {t('datasetCreation.stepTwo.qaSwitchHighQualityTipContent')}
+                  </p>
+                </header>
+                <div className='flex gap-2 pb-6'>
+                  <Button className='ml-auto' onClick={() => {
+                    setIsQAConfirmDialogOpen(false)
+                  }}>
+                    {t('datasetCreation.stepTwo.cancel')}
+                  </Button>
+                  <Button variant={'primary'} onClick={() => {
+                    setIsQAConfirmDialogOpen(false)
+                    setIndexType(IndexingType.QUALIFIED)
+                    setDocForm(ChunkingMode.qa)
+                  }}>
+                    {t('datasetCreation.stepTwo.switch')}
+                  </Button>
+                </div>
+              </CustomDialog>
+              <PortalToFollowElem
+                open={
+                  isHoveringEconomy && docForm !== ChunkingMode.text
+                }
+                placement={'top'}
+              >
+                <PortalToFollowElemTrigger asChild>
+                  <OptionCard className='flex-1 self-stretch'
+                    title={t('datasetCreation.stepTwo.economical')}
+                    description={t('datasetCreation.stepTwo.economicalTip')}
+                    icon={<Image src={indexMethodIcon.economical} alt='' />}
+                    isActive={!hasSetIndexType && indexType === IndexingType.ECONOMICAL}
+                    disabled={hasSetIndexType || docForm !== ChunkingMode.text}
+                    ref={economyDomRef}
+                    onSwitched={() => {
+                      setIndexType(IndexingType.ECONOMICAL)
+                    }}
+                  />
+                </PortalToFollowElemTrigger>
+                <PortalToFollowElemContent>
+                  <div className='rounded-lg border-components-panel-border bg-components-tooltip-bg p-3 text-xs font-medium text-text-secondary shadow-lg'>
+                    {
+                      docForm === ChunkingMode.qa
+                        ? t('datasetCreation.stepTwo.notAvailableForQA')
+                        : t('datasetCreation.stepTwo.notAvailableForParentChild')
+                    }
+                  </div>
+                </PortalToFollowElemContent>
+              </PortalToFollowElem>
+            </>)}
+        </div>
+        {!hasSetIndexType && indexType === IndexingType.QUALIFIED && (
+          <div className='mt-2 flex h-10 items-center gap-x-0.5 overflow-hidden rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-2 shadow-xs backdrop-blur-[5px]'>
+            <div className='absolute bottom-0 left-0 right-0 top-0 bg-dataset-warning-message-bg opacity-40'></div>
+            <div className='p-1'>
+              <AlertTriangle className='size-4 text-text-warning-secondary' />
+            </div>
+            <span className='system-xs-medium text-text-primary'>{t('datasetCreation.stepTwo.highQualityTip')}</span>
+          </div>
+        )}
+        {hasSetIndexType && indexType === IndexingType.ECONOMICAL && (
+          <div className='system-xs-medium mt-2'>
+            {t('datasetCreation.stepTwo.indexSettingTip')}
+            <Link className='text-text-accent' href={`/datasets/${datasetId}/settings`}>{t('datasetCreation.stepTwo.datasetSettingLink')}</Link>
+          </div>
+        )}
+        {/* Embedding model */}
+        {indexType === IndexingType.QUALIFIED && (
+          <div className='mt-5'>
+            <div className={cn('system-md-semibold mb-1 text-text-secondary', datasetId && 'flex items-center justify-between')}>{t('datasetSettings.form.embeddingModel')}</div>
+            <ModelSelector
+              readonly={isModelAndRetrievalConfigDisabled}
+              triggerClassName={isModelAndRetrievalConfigDisabled ? 'opacity-50' : ''}
+              defaultModel={embeddingModel}
+              modelList={embeddingModelList}
+              onSelect={(model: DefaultModel) => {
+                setEmbeddingModel(model)
+              }}
+            />
+            {isModelAndRetrievalConfigDisabled && (
+              <div className='system-xs-medium mt-2 text-text-tertiary'>
+                {t('datasetCreation.stepTwo.indexSettingTip')}
+                <Link className='text-text-accent' href={`/datasets/${datasetId}/settings`}>{t('datasetCreation.stepTwo.datasetSettingLink')}</Link>
+              </div>
+            )}
+          </div>
+        )}
+        <Divider className='my-5' />
+        {/* Retrieval Method Config */}
+        <div>
+          {!isModelAndRetrievalConfigDisabled
+            ? (
+              <div className={'mb-1'}>
+                <div className='system-md-semibold mb-0.5 text-text-secondary'>{t('datasetSettings.form.retrievalSetting.title')}</div>
+                <div className='body-xs-regular text-text-tertiary'>
+                  <a target='_blank' rel='noopener noreferrer' href='https://docs.dify.ai/guides/knowledge-base/create-knowledge-and-upload-documents#id-4-retrieval-settings' className='text-text-accent'>{t('datasetSettings.form.retrievalSetting.learnMore')}</a>
+                  {t('datasetSettings.form.retrievalSetting.longDescription')}
+                </div>
+              </div>
+            )
+            : (
+              <div className={cn('system-md-semibold mb-0.5 text-text-secondary', 'flex items-center justify-between')}>
+                <div>{t('datasetSettings.form.retrievalSetting.title')}</div>
+              </div>
+            )}
+
+          <div className=''>
+            {
+              getIndexing_technique() === IndexingType.QUALIFIED
+                ? (
+                  <RetrievalMethodConfig
+                    disabled={isModelAndRetrievalConfigDisabled}
+                    value={retrievalConfig}
+                    onChange={setRetrievalConfig}
+                  />
+                )
+                : (
+                  <EconomicalRetrievalMethodConfig
+                    disabled={isModelAndRetrievalConfigDisabled}
+                    value={retrievalConfig}
+                    onChange={setRetrievalConfig}
+                  />
+                )
+            }
+          </div>
+        </div>
+
+        {!isSetting
+          ? (
+            <div className='mt-8 flex items-center py-2'>
+              <Button onClick={() => onStepChange && onStepChange(-1)}>
+                <RiArrowLeftLine className='mr-1 h-4 w-4' />
+                {t('datasetCreation.stepTwo.previousStep')}
+              </Button>
+              <Button className='ml-auto' loading={isCreating} variant='primary' onClick={createHandle}>{t('datasetCreation.stepTwo.nextStep')}</Button>
+            </div>
+          )
+          : (
+            <div className='mt-8 flex items-center py-2'>
+              <Button loading={isCreating} variant='primary' onClick={createHandle}>{t('datasetCreation.stepTwo.save')}</Button>
+              <Button className='ml-2' onClick={onCancel}>{t('datasetCreation.stepTwo.cancel')}</Button>
+            </div>
+          )}
+      </div>
+      <FloatRightContainer isMobile={isMobile} isOpen={true} onClose={noop} footer={null}>
+        <PreviewContainer
+          header={<PreviewHeader
+            title={t('datasetCreation.stepTwo.preview')}
+          >
+            <div className='flex items-center gap-1'>
+              {dataSourceType === DataSourceType.FILE
+                && <PreviewDocumentPicker
+                  files={files as Array<Required<CustomFile>>}
+                  onChange={(selected) => {
+                    currentEstimateMutation.reset()
+                    setPreviewFile(selected)
+                    currentEstimateMutation.mutate()
+                  }}
+                  // when it is from setting, it just has one file
+                  value={isSetting ? (files[0]! as Required<CustomFile>) : previewFile}
+                />
+              }
+              {dataSourceType === DataSourceType.NOTION
+                && <PreviewDocumentPicker
+                  files={
+                    notionPages.map(page => ({
+                      id: page.page_id,
+                      name: page.page_name,
+                      extension: 'md',
+                    }))
+                  }
+                  onChange={(selected) => {
+                    currentEstimateMutation.reset()
+                    const selectedPage = notionPages.find(page => page.page_id === selected.id)
+                    setPreviewNotionPage(selectedPage!)
+                    currentEstimateMutation.mutate()
+                  }}
+                  value={{
+                    id: previewNotionPage?.page_id || '',
+                    name: previewNotionPage?.page_name || '',
+                    extension: 'md',
+                  }}
+                />
+              }
+              {dataSourceType === DataSourceType.WEB
+                && <PreviewDocumentPicker
+                  files={
+                    websitePages.map(page => ({
+                      id: page.source_url,
+                      name: page.title,
+                      extension: 'md',
+                    }))
+                  }
+                  onChange={(selected) => {
+                    currentEstimateMutation.reset()
+                    const selectedPage = websitePages.find(page => page.source_url === selected.id)
+                    setPreviewWebsitePage(selectedPage!)
+                    currentEstimateMutation.mutate()
+                  }}
+                  value={
+                    {
+                      id: previewWebsitePage?.source_url || '',
+                      name: previewWebsitePage?.title || '',
+                      extension: 'md',
+                    }
+                  }
+                />
+              }
+              {
+                currentDocForm !== ChunkingMode.qa
+                && <Badge text={t('datasetCreation.stepTwo.previewChunkCount', {
+                  count: estimate?.total_segments || 0,
+                }) as string}
+                />
+              }
+            </div>
+          </PreviewHeader>}
+          className={cn('relative flex h-full w-1/2 shrink-0 p-4 pr-0', isMobile && 'w-full max-w-[524px]')}
+          mainClassName='space-y-6'
+        >
+          {currentDocForm === ChunkingMode.qa && estimate?.qa_preview && (
+            estimate?.qa_preview.map((item, index) => (
+              <ChunkContainer
+                key={item.question}
+                label={`Chunk-${index + 1}`}
+                characterCount={item.question.length + item.answer.length}
+              >
+                <QAPreview qa={item} />
+              </ChunkContainer>
+            ))
+          )}
+          {currentDocForm === ChunkingMode.text && estimate?.preview && (
+            estimate?.preview.map((item, index) => (
+              <ChunkContainer
+                key={item.content}
+                label={`Chunk-${index + 1}`}
+                characterCount={item.content.length}
+              >
+                {item.content}
+              </ChunkContainer>
+            ))
+          )}
+          {currentDocForm === ChunkingMode.parentChild && currentEstimateMutation.data?.preview && (
+            estimate?.preview?.map((item, index) => {
+              const indexForLabel = index + 1
+              const childChunks = parentChildConfig.chunkForContext === 'full-doc'
+                ? item.child_chunks.slice(0, FULL_DOC_PREVIEW_LENGTH)
+                : item.child_chunks
+              return (
+                <ChunkContainer
+                  key={item.content}
+                  label={`Chunk-${indexForLabel}`}
+                  characterCount={item.content.length}
+                >
+                  <FormattedText>
+                    {childChunks.map((child, index) => {
+                      const indexForLabel = index + 1
+                      return (
+                        <PreviewSlice
+                          key={child}
+                          label={`C-${indexForLabel}`}
+                          text={child}
+                          tooltip={`Child-chunk-${indexForLabel} 路 ${child.length} Characters`}
+                          labelInnerClassName='text-[10px] font-semibold align-bottom leading-7'
+                          dividerClassName='leading-7'
+                        />
+                      )
+                    })}
+                  </FormattedText>
+                </ChunkContainer>
+              )
+            })
+          )}
+          {currentEstimateMutation.isIdle && (
+            <div className='flex h-full w-full items-center justify-center'>
+              <div className='flex flex-col items-center justify-center gap-3'>
+                <RiSearchEyeLine className='size-10 text-text-empty-state-icon' />
+                <p className='text-sm text-text-tertiary'>
+                  {t('datasetCreation.stepTwo.previewChunkTip')}
+                </p>
+              </div>
+            </div>
+          )}
+          {currentEstimateMutation.isPending && (
+            <div className='space-y-6'>
+              {Array.from({ length: 10 }, (_, i) => (
+                <SkeletonContainer key={i}>
+                  <SkeletonRow>
+                    <SkeletonRectangle className="w-20" />
+                    <SkeletonPoint />
+                    <SkeletonRectangle className="w-24" />
+                  </SkeletonRow>
+                  <SkeletonRectangle className="w-full" />
+                  <SkeletonRectangle className="w-full" />
+                  <SkeletonRectangle className="w-[422px]" />
+                </SkeletonContainer>
+              ))}
+            </div>
+          )}
+        </PreviewContainer>
+      </FloatRightContainer>
+    </div>
+  )
+}
+
+export default StepTwo
diff --git a/app/components/datasets/create/step-two/inputs.tsx b/app/components/datasets/create/step-two/inputs.tsx
new file mode 100644
index 0000000..d6dc6e9
--- /dev/null
+++ b/app/components/datasets/create/step-two/inputs.tsx
@@ -0,0 +1,79 @@
+import type { FC, PropsWithChildren, ReactNode } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { InputProps } from '@/app/components/base/input'
+import Input from '@/app/components/base/input'
+import Tooltip from '@/app/components/base/tooltip'
+import type { InputNumberProps } from '@/app/components/base/input-number'
+import { InputNumber } from '@/app/components/base/input-number'
+
+const TextLabel: FC<PropsWithChildren> = (props) => {
+  return <label className='text-xs font-semibold leading-none text-text-secondary'>{props.children}</label>
+}
+
+const FormField: FC<PropsWithChildren<{ label: ReactNode }>> = (props) => {
+  return <div className='flex-1 space-y-2'>
+    <TextLabel>{props.label}</TextLabel>
+    {props.children}
+  </div>
+}
+
+export const DelimiterInput: FC<InputProps & { tooltip?: string }> = (props) => {
+  const { t } = useTranslation()
+  return <FormField label={<div className='mb-1 flex items-center'>
+    <span className='system-sm-semibold mr-0.5'>{t('datasetCreation.stepTwo.separator')}</span>
+    <Tooltip
+      popupContent={
+        <div className='max-w-[200px]'>
+          {props.tooltip || t('datasetCreation.stepTwo.separatorTip')}
+        </div>
+      }
+    />
+  </div>}>
+    <Input
+      type="text"
+      className='h-9'
+      placeholder={t('datasetCreation.stepTwo.separatorPlaceholder')!}
+      {...props}
+    />
+  </FormField>
+}
+
+export const MaxLengthInput: FC<InputNumberProps> = (props) => {
+  const maxValue = Number.parseInt(globalThis.document?.body?.getAttribute('data-public-indexing-max-segmentation-tokens-length') || '4000', 10)
+
+  const { t } = useTranslation()
+  return <FormField label={<div className='system-sm-semibold mb-1'>
+    {t('datasetCreation.stepTwo.maxLength')}
+  </div>}>
+    <InputNumber
+      type="number"
+      size='large'
+      placeholder={`鈮� ${maxValue}`}
+      max={maxValue}
+      min={1}
+      {...props}
+    />
+  </FormField>
+}
+
+export const OverlapInput: FC<InputNumberProps> = (props) => {
+  const { t } = useTranslation()
+  return <FormField label={<div className='mb-1 flex items-center'>
+    <span className='system-sm-semibold'>{t('datasetCreation.stepTwo.overlap')}</span>
+    <Tooltip
+      popupContent={
+        <div className='max-w-[200px]'>
+          {t('datasetCreation.stepTwo.overlapTip')}
+        </div>
+      }
+    />
+  </div>}>
+    <InputNumber
+      type="number"
+      size='large'
+      placeholder={t('datasetCreation.stepTwo.overlap') || ''}
+      min={1}
+      {...props}
+    />
+  </FormField>
+}
diff --git a/app/components/datasets/create/step-two/language-select/index.tsx b/app/components/datasets/create/step-two/language-select/index.tsx
new file mode 100644
index 0000000..0e6bae9
--- /dev/null
+++ b/app/components/datasets/create/step-two/language-select/index.tsx
@@ -0,0 +1,62 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { RiArrowDownSLine, RiCheckLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import Popover from '@/app/components/base/popover'
+import { languages } from '@/i18n/language'
+
+export type ILanguageSelectProps = {
+  currentLanguage: string
+  onSelect: (language: string) => void
+  disabled?: boolean
+}
+
+const LanguageSelect: FC<ILanguageSelectProps> = ({
+  currentLanguage,
+  onSelect,
+  disabled,
+}) => {
+  return (
+    <Popover
+      manualClose
+      trigger='click'
+      disabled={disabled}
+      popupClassName='z-20'
+      htmlContent={
+        <div className='w-full p-1'>
+          {languages.filter(language => language.supported).map(({ prompt_name }) => (
+            <div
+              key={prompt_name}
+              className='inline-flex w-full cursor-pointer items-center justify-between rounded-lg px-3 py-2 hover:bg-state-base-hover'
+              onClick={() => onSelect(prompt_name)}
+            >
+              <span className='system-sm-medium text-text-secondary'>{prompt_name}</span>
+              {(currentLanguage === prompt_name) && <RiCheckLine className='size-4 text-text-accent' />}
+            </div>
+          ))}
+        </div>
+      }
+      btnElement={
+        <div className={cn('inline-flex items-center gap-x-[1px]', disabled && 'cursor-not-allowed')}>
+          <span className={cn(
+            'system-xs-semibold px-[3px] text-components-button-tertiary-text',
+            disabled ? 'text-components-button-tertiary-text-disabled' : '',
+          )}>
+            {currentLanguage}
+          </span>
+          <RiArrowDownSLine className={cn(
+            'size-3.5 text-components-button-tertiary-text',
+            disabled ? 'text-components-button-tertiary-text-disabled' : '',
+          )} />
+        </div>
+      }
+      btnClassName={() => cn(
+        '!hover:bg-components-button-tertiary-bg !mx-1 rounded-md !border-0 !bg-components-button-tertiary-bg !px-1.5 !py-1',
+        disabled ? 'bg-components-button-tertiary-bg-disabled' : '',
+      )}
+      className='!left-1 !z-20 h-fit !w-[140px] !translate-x-0'
+    />
+  )
+}
+export default React.memo(LanguageSelect)
diff --git a/app/components/datasets/create/step-two/option-card.tsx b/app/components/datasets/create/step-two/option-card.tsx
new file mode 100644
index 0000000..6bfe538
--- /dev/null
+++ b/app/components/datasets/create/step-two/option-card.tsx
@@ -0,0 +1,106 @@
+import type { ComponentProps, FC, ReactNode } from 'react'
+import Image from 'next/image'
+import classNames from '@/utils/classnames'
+
+const TriangleArrow: FC<ComponentProps<'svg'>> = props => (
+  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="11" viewBox="0 0 24 11" fill="none" {...props}>
+    <path d="M9.87868 1.12132C11.0503 -0.0502525 12.9497 -0.0502525 14.1213 1.12132L23.3137 10.3137H0.686292L9.87868 1.12132Z" fill="currentColor" />
+  </svg>
+)
+
+type OptionCardHeaderProps = {
+  icon: ReactNode
+  title: ReactNode
+  description: string
+  isActive?: boolean
+  activeClassName?: string
+  effectImg?: string
+  disabled?: boolean
+}
+
+export const OptionCardHeader: FC<OptionCardHeaderProps> = (props) => {
+  const { icon, title, description, isActive, activeClassName, effectImg, disabled } = props
+  return <div className={classNames(
+    'flex h-full overflow-hidden rounded-t-xl relative',
+    isActive && activeClassName,
+    !disabled && 'cursor-pointer',
+  )}>
+    <div className='relative flex size-14 items-center justify-center overflow-hidden'>
+      {isActive && effectImg && <Image src={effectImg} className='absolute left-0 top-0 h-full w-full' alt='' width={56} height={56} />}
+      <div className='p-1'>
+        <div className='flex size-8 justify-center rounded-lg border border-components-panel-border-subtle bg-background-default-dodge p-1.5 shadow-md'>
+          {icon}
+        </div>
+      </div>
+    </div>
+    <TriangleArrow
+      className={classNames('absolute left-4 -bottom-1.5 text-transparent', isActive && 'text-components-panel-bg')}
+    />
+    <div className='flex-1 space-y-0.5 py-3 pr-4'>
+      <div className='system-md-semibold text-text-secondary'>{title}</div>
+      <div className='system-xs-regular text-text-tertiary'>{description}</div>
+    </div>
+  </div>
+}
+
+type OptionCardProps = {
+  icon: ReactNode
+  className?: string
+  activeHeaderClassName?: string
+  title: ReactNode
+  description: string
+  isActive?: boolean
+  actions?: ReactNode
+  effectImg?: string
+  onSwitched?: () => void
+  noHighlight?: boolean
+  disabled?: boolean
+} & Omit<ComponentProps<'div'>, 'title' | 'onClick'>
+
+export const OptionCard: FC<OptionCardProps> = (
+  {
+    ref,
+    ...props
+  },
+) => {
+  const { icon, className, title, description, isActive, children, actions, activeHeaderClassName, style, effectImg, onSwitched, noHighlight, disabled, ...rest } = props
+  return <div
+    className={classNames(
+      'rounded-xl bg-components-option-card-option-bg shadow-xs',
+      (isActive && !noHighlight)
+        ? 'border-[1.5px] border-components-option-card-option-selected-border'
+        : 'border border-components-option-card-option-border',
+      disabled && 'opacity-50 pointer-events-none',
+      className,
+    )}
+    style={{
+      ...style,
+    }}
+    onClick={() => {
+      if (!isActive && !disabled)
+        onSwitched?.()
+    }}
+    {...rest}
+    ref={ref}
+  >
+    <OptionCardHeader
+      icon={icon}
+      title={title}
+      description={description}
+      isActive={isActive && !noHighlight}
+      activeClassName={activeHeaderClassName}
+      effectImg={effectImg}
+      disabled={disabled}
+    />
+    {/** Body */}
+    {isActive && (children || actions) && <div className='rounded-b-xl bg-components-panel-bg px-4 py-3'>
+      {children}
+      {actions && <div className='mt-4 flex gap-2'>
+        {actions}
+      </div>
+      }
+    </div>}
+  </div>
+}
+
+OptionCard.displayName = 'OptionCard'
diff --git a/app/components/datasets/create/step-two/preview-item/index.tsx b/app/components/datasets/create/step-two/preview-item/index.tsx
new file mode 100644
index 0000000..7c6c920
--- /dev/null
+++ b/app/components/datasets/create/step-two/preview-item/index.tsx
@@ -0,0 +1,78 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+
+export type IPreviewItemProps = {
+  type: string
+  index: number
+  content?: string
+  qa?: {
+    answer: string
+    question: string
+  }
+}
+
+export enum PreviewType {
+  TEXT = 'text',
+  QA = 'QA',
+}
+
+const sharpIcon = (
+  <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M4.74999 1.5L3.24999 10.5M8.74998 1.5L7.24998 10.5M10.25 4H1.75M9.75 8H1.25" stroke="#98A2B3" strokeLinecap="round" strokeLinejoin="round" />
+  </svg>
+)
+
+const textIcon = (
+  <svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M4 3.5H8M6 3.5V8.5M3.9 10.5H8.1C8.94008 10.5 9.36012 10.5 9.68099 10.3365C9.96323 10.1927 10.1927 9.96323 10.3365 9.68099C10.5 9.36012 10.5 8.94008 10.5 8.1V3.9C10.5 3.05992 10.5 2.63988 10.3365 2.31901C10.1927 2.03677 9.96323 1.8073 9.68099 1.66349C9.36012 1.5 8.94008 1.5 8.1 1.5H3.9C3.05992 1.5 2.63988 1.5 2.31901 1.66349C2.03677 1.8073 1.8073 2.03677 1.66349 2.31901C1.5 2.63988 1.5 3.05992 1.5 3.9V8.1C1.5 8.94008 1.5 9.36012 1.66349 9.68099C1.8073 9.96323 2.03677 10.1927 2.31901 10.3365C2.63988 10.5 3.05992 10.5 3.9 10.5Z" stroke="#667085" strokeLinecap="round" strokeLinejoin="round" />
+  </svg>
+
+)
+
+const PreviewItem: FC<IPreviewItemProps> = ({
+  type = PreviewType.TEXT,
+  index,
+  content,
+  qa,
+}) => {
+  const { t } = useTranslation()
+  const charNums = type === PreviewType.TEXT
+    ? (content || '').length
+    : (qa?.answer || '').length + (qa?.question || '').length
+  const formattedIndex = (() => String(index).padStart(3, '0'))()
+
+  return (
+    <div className='rounded-xl bg-gray-50 p-4'>
+      <div className='flex h-5 items-center justify-between text-xs text-gray-500'>
+        <div className='box-border flex h-[18px] items-center space-x-1 rounded-md border border-gray-200 pl-1 pr-1.5 font-medium italic'>
+          {sharpIcon}
+          <span>{formattedIndex}</span>
+        </div>
+        <div className='flex items-center space-x-1'>
+          {textIcon}
+          <span>{charNums} {t('datasetCreation.stepTwo.characters')}</span>
+        </div>
+      </div>
+      <div className='mt-2 line-clamp-6 max-h-[120px] overflow-hidden text-sm text-gray-800'>
+        {type === PreviewType.TEXT && (
+          <div style={{ whiteSpace: 'pre-line' }}>{content}</div>
+        )}
+        {type === PreviewType.QA && (
+          <div style={{ whiteSpace: 'pre-line' }}>
+            <div className='flex'>
+              <div className='text-medium mr-2 shrink-0 text-gray-400'>Q</div>
+              <div style={{ whiteSpace: 'pre-line' }}>{qa?.question}</div>
+            </div>
+            <div className='flex'>
+              <div className='text-medium mr-2 shrink-0 text-gray-400'>A</div>
+              <div style={{ whiteSpace: 'pre-line' }}>{qa?.answer}</div>
+            </div>
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+export default React.memo(PreviewItem)
diff --git a/app/components/datasets/create/step-two/unescape.ts b/app/components/datasets/create/step-two/unescape.ts
new file mode 100644
index 0000000..fae3e96
--- /dev/null
+++ b/app/components/datasets/create/step-two/unescape.ts
@@ -0,0 +1,54 @@
+// https://github.com/iamakulov/unescape-js/blob/master/src/index.js
+
+/**
+ * \\ - matches the backslash which indicates the beginning of an escape sequence
+ * (
+ *   u\{([0-9A-Fa-f]+)\} - first alternative; matches the variable-length hexadecimal escape sequence (\u{ABCD0})
+ * |
+ *   u([0-9A-Fa-f]{4}) - second alternative; matches the 4-digit hexadecimal escape sequence (\uABCD)
+ * |
+ *   x([0-9A-Fa-f]{2}) - third alternative; matches the 2-digit hexadecimal escape sequence (\xA5)
+ * |
+ *   ([1-7][0-7]{0,2}|[0-7]{2,3}) - fourth alternative; matches the up-to-3-digit octal escape sequence (\5 or \512)
+ * |
+ *   (['"tbrnfv0\\]) - fifth alternative; matches the special escape characters (\t, \n and so on)
+ * |
+ *   \U([0-9A-Fa-f]+) - sixth alternative; matches the 8-digit hexadecimal escape sequence used by python (\U0001F3B5)
+ * )
+ */
+const jsEscapeRegex = /\\(u\{([0-9A-Fa-f]+)\}|u([0-9A-Fa-f]{4})|x([0-9A-Fa-f]{2})|([1-7][0-7]{0,2}|[0-7]{2,3})|(['"tbrnfv0\\]))|\\U([0-9A-Fa-f]{8})/g
+
+const usualEscapeSequences: Record<string, string> = {
+  '0': '\0',
+  'b': '\b',
+  'f': '\f',
+  'n': '\n',
+  'r': '\r',
+  't': '\t',
+  'v': '\v',
+  '\'': '\'',
+  '"': '"',
+  '\\': '\\',
+}
+
+const fromHex = (str: string) => String.fromCodePoint(Number.parseInt(str, 16))
+const fromOct = (str: string) => String.fromCodePoint(Number.parseInt(str, 8))
+
+const unescape = (str: string) => {
+  return str.replace(jsEscapeRegex, (_, __, varHex, longHex, shortHex, octal, specialCharacter, python) => {
+    if (varHex !== undefined)
+      return fromHex(varHex)
+    else if (longHex !== undefined)
+      return fromHex(longHex)
+    else if (shortHex !== undefined)
+      return fromHex(shortHex)
+    else if (octal !== undefined)
+      return fromOct(octal)
+    else if (python !== undefined)
+      return fromHex(python)
+    else
+      return usualEscapeSequences[specialCharacter]
+  })
+}
+
+export default unescape
diff --git a/app/components/datasets/create/stepper/index.tsx b/app/components/datasets/create/stepper/index.tsx
new file mode 100644
index 0000000..8882ec6
--- /dev/null
+++ b/app/components/datasets/create/stepper/index.tsx
@@ -0,0 +1,27 @@
+import { type FC, Fragment } from 'react'
+import type { Step } from './step'
+import { StepperStep } from './step'
+
+export type StepperProps = {
+  steps: Step[]
+  activeIndex: number
+}
+
+export const Stepper: FC<StepperProps> = (props) => {
+  const { steps, activeIndex } = props
+  return <div className='flex items-center gap-3'>
+    {steps.map((step, index) => {
+      const isLast = index === steps.length - 1
+      return (
+        <Fragment key={index}>
+          <StepperStep
+            {...step}
+            activeIndex={activeIndex}
+            index={index}
+          />
+          {!isLast && <div className='h-px w-4 bg-divider-deep' />}
+        </Fragment>
+      )
+    })}
+  </div>
+}
diff --git a/app/components/datasets/create/stepper/step.tsx b/app/components/datasets/create/stepper/step.tsx
new file mode 100644
index 0000000..91e9c71
--- /dev/null
+++ b/app/components/datasets/create/stepper/step.tsx
@@ -0,0 +1,46 @@
+import type { FC } from 'react'
+import classNames from '@/utils/classnames'
+
+export type Step = {
+  name: string
+}
+
+export type StepperStepProps = Step & {
+  index: number
+  activeIndex: number
+}
+
+export const StepperStep: FC<StepperStepProps> = (props) => {
+  const { name, activeIndex, index } = props
+  const isActive = index === activeIndex
+  const isDisabled = activeIndex < index
+  const label = isActive ? `STEP ${index + 1}` : `${index + 1}`
+  return <div className='flex items-center gap-2'>
+    <div className={classNames(
+      'h-5 py-1 rounded-3xl flex-col justify-center items-center gap-2 inline-flex',
+      isActive
+        ? 'px-2 bg-state-accent-solid'
+        : !isDisabled
+          ? 'w-5 border border-text-quaternary'
+          : 'w-5 border border-divider-deep',
+    )}>
+      <div className={classNames(
+        'text-center system-2xs-semibold-uppercase',
+        isActive
+          ? 'text-text-primary-on-surface'
+          : !isDisabled
+            ? 'text-text-tertiary'
+            : 'text-text-quaternary',
+      )}>
+        {label}
+      </div>
+    </div>
+    <div className={classNames('system-xs-medium-uppercase',
+      isActive
+        ? 'text-text-accent system-xs-semibold-uppercase'
+        : !isDisabled
+          ? 'text-text-tertiary'
+          : 'text-text-quaternary',
+    )}>{name}</div>
+  </div>
+}
diff --git a/app/components/datasets/create/stop-embedding-modal/index.module.css b/app/components/datasets/create/stop-embedding-modal/index.module.css
new file mode 100644
index 0000000..95f999d
--- /dev/null
+++ b/app/components/datasets/create/stop-embedding-modal/index.module.css
@@ -0,0 +1,37 @@
+.modal {
+  position: relative;
+}
+.modal .icon {
+  width: 48px;
+  height: 48px;
+  background: rgba(255, 255, 255, 0.9) center no-repeat url(../assets/annotation-info.svg);
+  background-size: 24px;
+  border: 0.5px solid #F2F4F7;
+  box-shadow: 0px 20px 24px -4px rgba(16, 24, 40, 0.08), 0px 8px 8px -4px rgba(16, 24, 40, 0.03);
+  border-radius: 12px;
+}
+.modal .close {
+  position: absolute;
+  right: 16px;
+  top: 16px;
+  width: 32px;
+  height: 32px;
+  border-radius: 8px;
+  background: center no-repeat url(../assets/close.svg);
+  background-size: 16px;
+  cursor: pointer;
+}
+.modal .title {
+  @apply mt-3 mb-1;
+  font-weight: 600;
+  font-size: 20px;
+  line-height: 30px;
+  color: #101828;
+}
+.modal .content {
+  @apply mb-10;
+  font-weight: 400;
+  font-size: 14px;
+  line-height: 20px;
+  color: #667085;
+}
diff --git a/app/components/datasets/create/stop-embedding-modal/index.tsx b/app/components/datasets/create/stop-embedding-modal/index.tsx
new file mode 100644
index 0000000..9d29187
--- /dev/null
+++ b/app/components/datasets/create/stop-embedding-modal/index.tsx
@@ -0,0 +1,45 @@
+'use client'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import s from './index.module.css'
+import cn from '@/utils/classnames'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+
+type IProps = {
+  show: boolean
+  onConfirm: () => void
+  onHide: () => void
+}
+
+const StopEmbeddingModal = ({
+  show = false,
+  onConfirm,
+  onHide,
+}: IProps) => {
+  const { t } = useTranslation()
+
+  const submit = () => {
+    onConfirm()
+    onHide()
+  }
+
+  return (
+    <Modal
+      isShow={show}
+      onClose={onHide}
+      className={cn(s.modal, '!max-w-[480px]', 'px-8')}
+    >
+      <div className={s.icon} />
+      <span className={s.close} onClick={onHide} />
+      <div className={s.title}>{t('datasetCreation.stepThree.modelTitle')}</div>
+      <div className={s.content}>{t('datasetCreation.stepThree.modelContent')}</div>
+      <div className='flex flex-row-reverse'>
+        <Button className='ml-2 w-24' variant='primary' onClick={submit}>{t('datasetCreation.stepThree.modelButtonConfirm')}</Button>
+        <Button className='w-24' onClick={onHide}>{t('datasetCreation.stepThree.modelButtonCancel')}</Button>
+      </div>
+    </Modal>
+  )
+}
+
+export default StopEmbeddingModal
diff --git a/app/components/datasets/create/top-bar/index.tsx b/app/components/datasets/create/top-bar/index.tsx
new file mode 100644
index 0000000..c5d8921
--- /dev/null
+++ b/app/components/datasets/create/top-bar/index.tsx
@@ -0,0 +1,47 @@
+import { type FC, useMemo } from 'react'
+import { RiArrowLeftLine } from '@remixicon/react'
+import Link from 'next/link'
+import { useTranslation } from 'react-i18next'
+import { Stepper, type StepperProps } from '../stepper'
+import classNames from '@/utils/classnames'
+
+export type TopBarProps = Pick<StepperProps, 'activeIndex'> & {
+  className?: string
+  datasetId?: string
+}
+
+const STEP_T_MAP: Record<number, string> = {
+  1: 'datasetCreation.steps.one',
+  2: 'datasetCreation.steps.two',
+  3: 'datasetCreation.steps.three',
+}
+
+export const TopBar: FC<TopBarProps> = (props) => {
+  const { className, datasetId, ...rest } = props
+  const { t } = useTranslation()
+
+  const fallbackRoute = useMemo(() => {
+    return datasetId ? `/datasets/${datasetId}/documents` : '/datasets'
+  }, [datasetId])
+
+  return <div className={classNames('flex shrink-0 h-[52px] items-center justify-between relative border-b border-b-divider-subtle', className)}>
+    <Link href={fallbackRoute} replace className="inline-flex h-12 items-center justify-start gap-1 py-2 pl-2 pr-6">
+      <div className='p-2'>
+        <RiArrowLeftLine className='size-4 text-text-primary' />
+      </div>
+      <p className="system-sm-semibold-uppercase text-text-primary">
+        {t('datasetCreation.steps.header.fallbackRoute')}
+      </p>
+    </Link>
+    <div className={
+      'absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2'
+    }>
+      <Stepper
+        steps={Array.from({ length: 3 }, (_, i) => ({
+          name: t(STEP_T_MAP[i + 1]),
+        }))}
+        {...rest}
+      />
+    </div>
+  </div>
+}
diff --git a/app/components/datasets/create/website/base/checkbox-with-label.tsx b/app/components/datasets/create/website/base/checkbox-with-label.tsx
new file mode 100644
index 0000000..f5451af
--- /dev/null
+++ b/app/components/datasets/create/website/base/checkbox-with-label.tsx
@@ -0,0 +1,40 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+import Checkbox from '@/app/components/base/checkbox'
+import Tooltip from '@/app/components/base/tooltip'
+
+type Props = {
+  className?: string
+  isChecked: boolean
+  onChange: (isChecked: boolean) => void
+  label: string
+  labelClassName?: string
+  tooltip?: string
+}
+
+const CheckboxWithLabel: FC<Props> = ({
+  className = '',
+  isChecked,
+  onChange,
+  label,
+  labelClassName,
+  tooltip,
+}) => {
+  return (
+    <label className={cn(className, 'flex h-7 items-center space-x-2')}>
+      <Checkbox checked={isChecked} onCheck={() => onChange(!isChecked)} />
+      <div className={cn('text-sm font-normal text-text-secondary', labelClassName)}>{label}</div>
+      {tooltip && (
+        <Tooltip
+          popupContent={
+            <div className='w-[200px]'>{tooltip}</div>
+          }
+          triggerClassName='ml-0.5 w-4 h-4'
+        />
+      )}
+    </label>
+  )
+}
+export default React.memo(CheckboxWithLabel)
diff --git a/app/components/datasets/create/website/base/crawled-result-item.tsx b/app/components/datasets/create/website/base/crawled-result-item.tsx
new file mode 100644
index 0000000..8ea316f
--- /dev/null
+++ b/app/components/datasets/create/website/base/crawled-result-item.tsx
@@ -0,0 +1,60 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+import type { CrawlResultItem as CrawlResultItemType } from '@/models/datasets'
+import Checkbox from '@/app/components/base/checkbox'
+import Button from '@/app/components/base/button'
+
+type Props = {
+  payload: CrawlResultItemType
+  isChecked: boolean
+  isPreview: boolean
+  onCheckChange: (checked: boolean) => void
+  onPreview: () => void
+}
+
+const CrawledResultItem: FC<Props> = ({
+  isPreview,
+  payload,
+  isChecked,
+  onCheckChange,
+  onPreview,
+}) => {
+  const { t } = useTranslation()
+
+  const handleCheckChange = useCallback(() => {
+    onCheckChange(!isChecked)
+  }, [isChecked, onCheckChange])
+  return (
+    <div className={cn(isPreview ? 'bg-state-base-active' : 'group hover:bg-state-base-hover', 'cursor-pointer rounded-lg p-2')}>
+      <div className='relative flex'>
+        <div className='flex h-5 items-center'>
+          <Checkbox className='mr-2 shrink-0' checked={isChecked} onCheck={handleCheckChange} />
+        </div>
+        <div className='flex min-w-0 grow flex-col'>
+          <div
+            className='truncate text-sm font-medium text-text-secondary'
+            title={payload.title}
+          >
+            {payload.title}
+          </div>
+          <div
+            className='mt-0.5 truncate text-xs text-text-tertiary'
+            title={payload.source_url}
+          >
+            {payload.source_url}
+          </div>
+        </div>
+        <Button
+          onClick={onPreview}
+          className='right-0 top-0 hidden h-6 px-1.5 text-xs font-medium uppercase group-hover:absolute group-hover:block'
+        >
+          {t('datasetCreation.stepOne.website.preview')}
+        </Button>
+      </div>
+    </div>
+  )
+}
+export default React.memo(CrawledResultItem)
diff --git a/app/components/datasets/create/website/base/crawled-result.tsx b/app/components/datasets/create/website/base/crawled-result.tsx
new file mode 100644
index 0000000..c168405
--- /dev/null
+++ b/app/components/datasets/create/website/base/crawled-result.tsx
@@ -0,0 +1,89 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import CheckboxWithLabel from './checkbox-with-label'
+import CrawledResultItem from './crawled-result-item'
+import cn from '@/utils/classnames'
+import type { CrawlResultItem } from '@/models/datasets'
+
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  className?: string
+  list: CrawlResultItem[]
+  checkedList: CrawlResultItem[]
+  onSelectedChange: (selected: CrawlResultItem[]) => void
+  onPreview: (payload: CrawlResultItem) => void
+  usedTime: number
+}
+
+const CrawledResult: FC<Props> = ({
+  className = '',
+  list,
+  checkedList,
+  onSelectedChange,
+  onPreview,
+  usedTime,
+}) => {
+  const { t } = useTranslation()
+
+  const isCheckAll = checkedList.length === list.length
+
+  const handleCheckedAll = useCallback(() => {
+    if (!isCheckAll)
+      onSelectedChange(list)
+
+    else
+      onSelectedChange([])
+  }, [isCheckAll, list, onSelectedChange])
+
+  const handleItemCheckChange = useCallback((item: CrawlResultItem) => {
+    return (checked: boolean) => {
+      if (checked)
+        onSelectedChange([...checkedList, item])
+
+      else
+        onSelectedChange(checkedList.filter(checkedItem => checkedItem.source_url !== item.source_url))
+    }
+  }, [checkedList, onSelectedChange])
+
+  const [previewIndex, setPreviewIndex] = React.useState<number>(-1)
+  const handlePreview = useCallback((index: number) => {
+    return () => {
+      setPreviewIndex(index)
+      onPreview(list[index])
+    }
+  }, [list, onPreview])
+
+  return (
+    <div className={cn(className, 'border-t-[0.5px] border-divider-regular shadow-xs shadow-shadow-shadow-3')}>
+      <div className='flex h-[34px] items-center justify-between px-4'>
+        <CheckboxWithLabel
+          isChecked={isCheckAll}
+          onChange={handleCheckedAll} label={isCheckAll ? t(`${I18N_PREFIX}.resetAll`) : t(`${I18N_PREFIX}.selectAll`)}
+          labelClassName='system-[13px] leading-[16px] font-medium text-text-secondary'
+        />
+        <div className='text-xs text-text-tertiary'>
+          {t(`${I18N_PREFIX}.scrapTimeInfo`, {
+            total: list.length,
+            time: usedTime.toFixed(1),
+          })}
+        </div>
+      </div>
+      <div className='p-2'>
+        {list.map((item, index) => (
+          <CrawledResultItem
+            key={item.source_url}
+            isPreview={index === previewIndex}
+            onPreview={handlePreview(index)}
+            payload={item}
+            isChecked={checkedList.some(checkedItem => checkedItem.source_url === item.source_url)}
+            onCheckChange={handleItemCheckChange(item)}
+          />
+        ))}
+      </div>
+    </div>
+  )
+}
+export default React.memo(CrawledResult)
diff --git a/app/components/datasets/create/website/base/crawling.tsx b/app/components/datasets/create/website/base/crawling.tsx
new file mode 100644
index 0000000..915f17d
--- /dev/null
+++ b/app/components/datasets/create/website/base/crawling.tsx
@@ -0,0 +1,37 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RowStruct } from '@/app/components/base/icons/src/public/other'
+
+type Props = {
+  className?: string
+  crawledNum: number
+  totalNum: number
+}
+
+const Crawling: FC<Props> = ({
+  className = '',
+  crawledNum,
+  totalNum,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className={className}>
+      <div className='flex h-[34px] items-center border-y-[0.5px] border-divider-regular px-4
+        text-xs text-text-tertiary shadow-xs shadow-shadow-shadow-3'>
+        {t('datasetCreation.stepOne.website.totalPageScraped')} {crawledNum}/{totalNum}
+      </div>
+
+      <div className='p-2'>
+        {['', '', '', ''].map((item, index) => (
+          <div className='py-[5px]' key={index}>
+            <RowStruct className='text-text-quaternary' />
+          </div>
+        ))}
+      </div>
+    </div>
+  )
+}
+export default React.memo(Crawling)
diff --git a/app/components/datasets/create/website/base/error-message.tsx b/app/components/datasets/create/website/base/error-message.tsx
new file mode 100644
index 0000000..2788eb9
--- /dev/null
+++ b/app/components/datasets/create/website/base/error-message.tsx
@@ -0,0 +1,30 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback'
+
+type Props = {
+  className?: string
+  title: string
+  errorMsg?: string
+}
+
+const ErrorMessage: FC<Props> = ({
+  className,
+  title,
+  errorMsg,
+}) => {
+  return (
+    <div className={cn(className, 'border-t border-divider-subtle bg-dataset-warning-message-bg px-4 py-2 opacity-40')}>
+      <div className='flex h-5 items-center'>
+        <AlertTriangle className='mr-2 h-4 w-4 text-text-warning-secondary' />
+        <div className='system-md-medium text-text-warning'>{title}</div>
+      </div>
+      {errorMsg && (
+        <div className='system-xs-regular mt-1 pl-6 text-text-secondary'>{errorMsg}</div>
+      )}
+    </div>
+  )
+}
+export default React.memo(ErrorMessage)
diff --git a/app/components/datasets/create/website/base/field.tsx b/app/components/datasets/create/website/base/field.tsx
new file mode 100644
index 0000000..43d7646
--- /dev/null
+++ b/app/components/datasets/create/website/base/field.tsx
@@ -0,0 +1,54 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import Input from './input'
+import cn from '@/utils/classnames'
+import Tooltip from '@/app/components/base/tooltip'
+
+type Props = {
+  className?: string
+  label: string
+  labelClassName?: string
+  value: string | number
+  onChange: (value: string | number) => void
+  isRequired?: boolean
+  placeholder?: string
+  isNumber?: boolean
+  tooltip?: string
+}
+
+const Field: FC<Props> = ({
+  className,
+  label,
+  labelClassName,
+  value,
+  onChange,
+  isRequired = false,
+  placeholder = '',
+  isNumber = false,
+  tooltip,
+}) => {
+  return (
+    <div className={cn(className)}>
+      <div className='flex py-[7px]'>
+        <div className={cn(labelClassName, 'flex h-[16px] items-center text-[13px] font-semibold text-text-secondary')}>{label} </div>
+        {isRequired && <span className='ml-0.5 text-xs font-semibold text-text-destructive'>*</span>}
+        {tooltip && (
+          <Tooltip
+            popupContent={
+              <div className='w-[200px]'>{tooltip}</div>
+            }
+            triggerClassName='ml-0.5 w-4 h-4'
+          />
+        )}
+      </div>
+      <Input
+        value={value}
+        onChange={onChange}
+        placeholder={placeholder}
+        isNumber={isNumber}
+      />
+    </div>
+  )
+}
+export default React.memo(Field)
diff --git a/app/components/datasets/create/website/base/input.tsx b/app/components/datasets/create/website/base/input.tsx
new file mode 100644
index 0000000..ae47111
--- /dev/null
+++ b/app/components/datasets/create/website/base/input.tsx
@@ -0,0 +1,63 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+
+type Props = {
+  value: string | number
+  onChange: (value: string | number) => void
+  placeholder?: string
+  isNumber?: boolean
+}
+
+const MIN_VALUE = 0
+
+const Input: FC<Props> = ({
+  value,
+  onChange,
+  placeholder = '',
+  isNumber = false,
+}) => {
+  const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
+    const value = e.target.value
+    if (isNumber) {
+      let numberValue = Number.parseInt(value, 10) // integer only
+      if (isNaN(numberValue)) {
+        onChange('')
+        return
+      }
+      if (numberValue < MIN_VALUE)
+        numberValue = MIN_VALUE
+
+      onChange(numberValue)
+      return
+    }
+    onChange(value)
+  }, [isNumber, onChange])
+
+  const otherOption = (() => {
+    if (isNumber) {
+      return {
+        min: MIN_VALUE,
+      }
+    }
+    return {
+
+    }
+  })()
+  return (
+    <input
+      type={isNumber ? 'number' : 'text'}
+      {...otherOption}
+      value={value}
+      onChange={handleChange}
+      className='system-xs-regular focus:bg-components-inout-border-active flex h-8 w-full rounded-lg border border-transparent
+      bg-components-input-bg-normal p-2 text-components-input-text-filled
+        caret-[#295eff] placeholder:text-components-input-text-placeholder hover:border
+        hover:border-components-input-border-hover hover:bg-components-input-bg-hover focus:border focus:border-components-input-border-active
+        focus:shadow-xs focus:shadow-shadow-shadow-3
+        focus-visible:outline-none'
+      placeholder={placeholder}
+    />
+  )
+}
+export default React.memo(Input)
diff --git a/app/components/datasets/create/website/base/mock-crawl-result.ts b/app/components/datasets/create/website/base/mock-crawl-result.ts
new file mode 100644
index 0000000..8fd5e66
--- /dev/null
+++ b/app/components/datasets/create/website/base/mock-crawl-result.ts
@@ -0,0 +1,24 @@
+import type { CrawlResultItem } from '@/models/datasets'
+
+const result: CrawlResultItem[] = [
+  {
+    title: 'Start the frontend Docker container separately',
+    markdown: 'Markdown 1',
+    description: 'Description 1',
+    source_url: 'https://example.com/1',
+  },
+  {
+    title: 'Advanced Tool Integration',
+    markdown: 'Markdown 2',
+    description: 'Description 2',
+    source_url: 'https://example.com/2',
+  },
+  {
+    title: 'Local Source Code Start | English | Dify',
+    markdown: 'Markdown 3',
+    description: 'Description 3',
+    source_url: 'https://example.com/3',
+  },
+]
+
+export default result
diff --git a/app/components/datasets/create/website/base/options-wrap.tsx b/app/components/datasets/create/website/base/options-wrap.tsx
new file mode 100644
index 0000000..8e9181b
--- /dev/null
+++ b/app/components/datasets/create/website/base/options-wrap.tsx
@@ -0,0 +1,55 @@
+'use client'
+import { useBoolean } from 'ahooks'
+import type { FC } from 'react'
+import React, { useEffect } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiEqualizer2Line } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import { ChevronRight } from '@/app/components/base/icons/src/vender/line/arrows'
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  className?: string
+  children: React.ReactNode
+  controlFoldOptions?: number
+}
+
+const OptionsWrap: FC<Props> = ({
+  className = '',
+  children,
+  controlFoldOptions,
+}) => {
+  const { t } = useTranslation()
+
+  const [fold, {
+    toggle: foldToggle,
+    setTrue: foldHide,
+  }] = useBoolean(false)
+
+  useEffect(() => {
+    if (controlFoldOptions)
+      foldHide()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [controlFoldOptions])
+  return (
+    <div className={cn(className, !fold ? 'mb-0' : 'mb-3')}>
+      <div
+        className='flex h-[26px] cursor-pointer select-none items-center gap-x-1 py-1'
+        onClick={foldToggle}
+      >
+        <div className='flex grow items-center'>
+          <RiEqualizer2Line className='mr-1 h-4 w-4 text-text-secondary' />
+          <span className='text-[13px] font-semibold uppercase leading-[16px] text-text-secondary'>{t(`${I18N_PREFIX}.options`)}</span>
+        </div>
+        <ChevronRight className={cn(!fold && 'rotate-90', 'h-4 w-4 shrink-0 text-text-tertiary')} />
+      </div>
+      {!fold && (
+        <div className='mb-4'>
+          {children}
+        </div>
+      )}
+
+    </div>
+  )
+}
+export default React.memo(OptionsWrap)
diff --git a/app/components/datasets/create/website/base/url-input.tsx b/app/components/datasets/create/website/base/url-input.tsx
new file mode 100644
index 0000000..b7dc9bf
--- /dev/null
+++ b/app/components/datasets/create/website/base/url-input.tsx
@@ -0,0 +1,48 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import Input from './input'
+import Button from '@/app/components/base/button'
+
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  isRunning: boolean
+  onRun: (url: string) => void
+}
+
+const UrlInput: FC<Props> = ({
+  isRunning,
+  onRun,
+}) => {
+  const { t } = useTranslation()
+  const [url, setUrl] = useState('')
+  const handleUrlChange = useCallback((url: string | number) => {
+    setUrl(url as string)
+  }, [])
+  const handleOnRun = useCallback(() => {
+    if (isRunning)
+      return
+    onRun(url)
+  }, [isRunning, onRun, url])
+
+  return (
+    <div className='flex items-center justify-between gap-x-2'>
+      <Input
+        value={url}
+        onChange={handleUrlChange}
+        placeholder='https://docs.dify.ai'
+      />
+      <Button
+        variant='primary'
+        onClick={handleOnRun}
+        loading={isRunning}
+        spinnerClassName='!ml-0'
+      >
+        {!isRunning ? t(`${I18N_PREFIX}.run`) : ''}
+      </Button>
+    </div>
+  )
+}
+export default React.memo(UrlInput)
diff --git a/app/components/datasets/create/website/firecrawl/header.tsx b/app/components/datasets/create/website/firecrawl/header.tsx
new file mode 100644
index 0000000..d23c57f
--- /dev/null
+++ b/app/components/datasets/create/website/firecrawl/header.tsx
@@ -0,0 +1,43 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiBookOpenLine, RiEqualizer2Line } from '@remixicon/react'
+import Button from '@/app/components/base/button'
+
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  onSetting: () => void
+}
+
+const Header: FC<Props> = ({
+  onSetting,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex h-6 items-center justify-between'>
+      <div className='flex items-center'>
+        <div className='text-base font-medium text-text-secondary'>{t(`${I18N_PREFIX}.firecrawlTitle`)}</div>
+        <div className='ml-2 mr-2 h-3.5 w-px bg-divider-regular' />
+        <Button className='flex h-6 items-center gap-x-[1px] px-1.5' onClick={onSetting}>
+          <RiEqualizer2Line className='h-3.5 w-3.5 text-components-button-secondary-text' />
+          <span className='px-[3px] text-xs font-medium text-components-button-secondary-text'>
+            {t(`${I18N_PREFIX}.configureFirecrawl`)}
+          </span>
+        </Button>
+      </div>
+      <a
+        href='https://docs.firecrawl.dev/introduction'
+        target='_blank'
+        rel='noopener noreferrer'
+        className='inline-flex items-center gap-x-1 text-xs font-medium text-text-accent'
+      >
+        <RiBookOpenLine className='h-3.5 w-3.5 text-text-accent' />
+        <span>{t(`${I18N_PREFIX}.firecrawlDoc`)}</span>
+      </a>
+    </div>
+  )
+}
+export default React.memo(Header)
diff --git a/app/components/datasets/create/website/firecrawl/index.tsx b/app/components/datasets/create/website/firecrawl/index.tsx
new file mode 100644
index 0000000..77f9666
--- /dev/null
+++ b/app/components/datasets/create/website/firecrawl/index.tsx
@@ -0,0 +1,217 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import UrlInput from '../base/url-input'
+import OptionsWrap from '../base/options-wrap'
+import CrawledResult from '../base/crawled-result'
+import Crawling from '../base/crawling'
+import ErrorMessage from '../base/error-message'
+import Header from './header'
+import Options from './options'
+import { useModalContext } from '@/context/modal-context'
+import type { CrawlOptions, CrawlResultItem } from '@/models/datasets'
+import Toast from '@/app/components/base/toast'
+import { checkFirecrawlTaskStatus, createFirecrawlTask } from '@/service/datasets'
+import { sleep } from '@/utils'
+
+const ERROR_I18N_PREFIX = 'common.errorMsg'
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  onPreview: (payload: CrawlResultItem) => void
+  checkedCrawlResult: CrawlResultItem[]
+  onCheckedCrawlResultChange: (payload: CrawlResultItem[]) => void
+  onJobIdChange: (jobId: string) => void
+  crawlOptions: CrawlOptions
+  onCrawlOptionsChange: (payload: CrawlOptions) => void
+}
+
+enum Step {
+  init = 'init',
+  running = 'running',
+  finished = 'finished',
+}
+
+const FireCrawl: FC<Props> = ({
+  onPreview,
+  checkedCrawlResult,
+  onCheckedCrawlResultChange,
+  onJobIdChange,
+  crawlOptions,
+  onCrawlOptionsChange,
+}) => {
+  const { t } = useTranslation()
+  const [step, setStep] = useState<Step>(Step.init)
+  const [controlFoldOptions, setControlFoldOptions] = useState<number>(0)
+  useEffect(() => {
+    if (step !== Step.init)
+      setControlFoldOptions(Date.now())
+  }, [step])
+  const { setShowAccountSettingModal } = useModalContext()
+  const handleSetting = useCallback(() => {
+    setShowAccountSettingModal({
+      payload: 'data-source',
+    })
+  }, [setShowAccountSettingModal])
+
+  const checkValid = useCallback((url: string) => {
+    let errorMsg = ''
+    if (!url) {
+      errorMsg = t(`${ERROR_I18N_PREFIX}.fieldRequired`, {
+        field: 'url',
+      })
+    }
+
+    if (!errorMsg && !((url.startsWith('http://') || url.startsWith('https://'))))
+      errorMsg = t(`${ERROR_I18N_PREFIX}.urlError`)
+
+    if (!errorMsg && (crawlOptions.limit === null || crawlOptions.limit === undefined || crawlOptions.limit === '')) {
+      errorMsg = t(`${ERROR_I18N_PREFIX}.fieldRequired`, {
+        field: t(`${I18N_PREFIX}.limit`),
+      })
+    }
+
+    return {
+      isValid: !errorMsg,
+      errorMsg,
+    }
+  }, [crawlOptions, t])
+
+  const isInit = step === Step.init
+  const isCrawlFinished = step === Step.finished
+  const isRunning = step === Step.running
+  const [crawlResult, setCrawlResult] = useState<{
+    current: number
+    total: number
+    data: CrawlResultItem[]
+    time_consuming: number | string
+  } | undefined>(undefined)
+  const [crawlErrorMessage, setCrawlErrorMessage] = useState('')
+  const showError = isCrawlFinished && crawlErrorMessage
+
+  const waitForCrawlFinished = useCallback(async (jobId: string) => {
+    try {
+      const res = await checkFirecrawlTaskStatus(jobId) as any
+      if (res.status === 'completed') {
+        return {
+          isError: false,
+          data: {
+            ...res,
+            total: Math.min(res.total, Number.parseFloat(crawlOptions.limit as string)),
+          },
+        }
+      }
+      if (res.status === 'error' || !res.status) {
+        // can't get the error message from the firecrawl api
+        return {
+          isError: true,
+          errorMessage: res.message,
+          data: {
+            data: [],
+          },
+        }
+      }
+      // update the progress
+      setCrawlResult({
+        ...res,
+        total: Math.min(res.total, Number.parseFloat(crawlOptions.limit as string)),
+      })
+      onCheckedCrawlResultChange(res.data || []) // default select the crawl result
+      await sleep(2500)
+      return await waitForCrawlFinished(jobId)
+    }
+    catch (e: any) {
+      const errorBody = await e.json()
+      return {
+        isError: true,
+        errorMessage: errorBody.message,
+        data: {
+          data: [],
+        },
+      }
+    }
+  }, [crawlOptions.limit])
+
+  const handleRun = useCallback(async (url: string) => {
+    const { isValid, errorMsg } = checkValid(url)
+    if (!isValid) {
+      Toast.notify({
+        message: errorMsg!,
+        type: 'error',
+      })
+      return
+    }
+    setStep(Step.running)
+    try {
+      const passToServerCrawlOptions: any = {
+        ...crawlOptions,
+      }
+      if (crawlOptions.max_depth === '')
+        delete passToServerCrawlOptions.max_depth
+
+      const res = await createFirecrawlTask({
+        url,
+        options: passToServerCrawlOptions,
+      }) as any
+      const jobId = res.job_id
+      onJobIdChange(jobId)
+      const { isError, data, errorMessage } = await waitForCrawlFinished(jobId)
+      if (isError) {
+        setCrawlErrorMessage(errorMessage || t(`${I18N_PREFIX}.unknownError`))
+      }
+      else {
+        setCrawlResult(data)
+        onCheckedCrawlResultChange(data.data || []) // default select the crawl result
+        setCrawlErrorMessage('')
+      }
+    }
+    catch (e) {
+      setCrawlErrorMessage(t(`${I18N_PREFIX}.unknownError`)!)
+      console.log(e)
+    }
+    finally {
+      setStep(Step.finished)
+    }
+  }, [checkValid, crawlOptions, onJobIdChange, t, waitForCrawlFinished])
+
+  return (
+    <div>
+      <Header onSetting={handleSetting} />
+      <div className='mt-2 rounded-xl border border-components-panel-border bg-background-default-subtle p-4 pb-0'>
+        <UrlInput onRun={handleRun} isRunning={isRunning} />
+        <OptionsWrap
+          className='mt-4'
+          controlFoldOptions={controlFoldOptions}
+        >
+          <Options className='mt-2' payload={crawlOptions} onChange={onCrawlOptionsChange} />
+        </OptionsWrap>
+
+        {!isInit && (
+          <div className='relative left-[-16px] mt-3 w-[calc(100%_+_32px)] rounded-b-xl'>
+            {isRunning
+              && <Crawling
+                className='mt-2'
+                crawledNum={crawlResult?.current || 0}
+                totalNum={crawlResult?.total || Number.parseFloat(crawlOptions.limit as string) || 0}
+              />}
+            {showError && (
+              <ErrorMessage className='rounded-b-xl' title={t(`${I18N_PREFIX}.exceptionErrorTitle`)} errorMsg={crawlErrorMessage} />
+            )}
+            {isCrawlFinished && !showError
+              && <CrawledResult
+                className='mb-2'
+                list={crawlResult?.data || []}
+                checkedList={checkedCrawlResult}
+                onSelectedChange={onCheckedCrawlResultChange}
+                onPreview={onPreview}
+                usedTime={Number.parseFloat(crawlResult?.time_consuming as string) || 0}
+              />
+            }
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+export default React.memo(FireCrawl)
diff --git a/app/components/datasets/create/website/firecrawl/options.tsx b/app/components/datasets/create/website/firecrawl/options.tsx
new file mode 100644
index 0000000..dea6c0e
--- /dev/null
+++ b/app/components/datasets/create/website/firecrawl/options.tsx
@@ -0,0 +1,85 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import CheckboxWithLabel from '../base/checkbox-with-label'
+import Field from '../base/field'
+import cn from '@/utils/classnames'
+import type { CrawlOptions } from '@/models/datasets'
+
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  className?: string
+  payload: CrawlOptions
+  onChange: (payload: CrawlOptions) => void
+}
+
+const Options: FC<Props> = ({
+  className = '',
+  payload,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  const handleChange = useCallback((key: keyof CrawlOptions) => {
+    return (value: any) => {
+      onChange({
+        ...payload,
+        [key]: value,
+      })
+    }
+  }, [payload, onChange])
+  return (
+    <div className={cn(className, ' space-y-2')}>
+      <CheckboxWithLabel
+        label={t(`${I18N_PREFIX}.crawlSubPage`)}
+        isChecked={payload.crawl_sub_pages}
+        onChange={handleChange('crawl_sub_pages')}
+        labelClassName='text-[13px] leading-[16px] font-medium text-text-secondary'
+      />
+      <div className='flex justify-between space-x-4'>
+        <Field
+          className='shrink-0 grow'
+          label={t(`${I18N_PREFIX}.limit`)}
+          value={payload.limit}
+          onChange={handleChange('limit')}
+          isNumber
+          isRequired
+        />
+        <Field
+          className='shrink-0 grow'
+          label={t(`${I18N_PREFIX}.maxDepth`)}
+          value={payload.max_depth}
+          onChange={handleChange('max_depth')}
+          isNumber
+          tooltip={t(`${I18N_PREFIX}.maxDepthTooltip`)!}
+        />
+      </div>
+
+      <div className='flex justify-between space-x-4'>
+        <Field
+          className='shrink-0 grow'
+          label={t(`${I18N_PREFIX}.excludePaths`)}
+          value={payload.excludes}
+          onChange={handleChange('excludes')}
+          placeholder='blog/*, /about/*'
+        />
+        <Field
+          className='shrink-0 grow'
+          label={t(`${I18N_PREFIX}.includeOnlyPaths`)}
+          value={payload.includes}
+          onChange={handleChange('includes')}
+          placeholder='articles/*'
+        />
+      </div>
+      <CheckboxWithLabel
+        label={t(`${I18N_PREFIX}.extractOnlyMainContent`)}
+        isChecked={payload.only_main_content}
+        onChange={handleChange('only_main_content')}
+        labelClassName='text-[13px] leading-[16px] font-medium text-text-secondary'
+      />
+    </div>
+  )
+}
+export default React.memo(Options)
diff --git a/app/components/datasets/create/website/index.module.css b/app/components/datasets/create/website/index.module.css
new file mode 100644
index 0000000..cf6c364
--- /dev/null
+++ b/app/components/datasets/create/website/index.module.css
@@ -0,0 +1,13 @@
+.jinaLogo {
+  @apply w-4 h-4 bg-center bg-no-repeat inline-block;
+  background-color: #F5FAFF;
+  background-image: url(../assets/jina.png);
+  background-size: 16px;
+}
+
+.watercrawlLogo {
+  @apply w-5 h-5 bg-center bg-no-repeat inline-block;
+  /*background-color: #F5FAFF;*/
+  background-image: url(../assets/watercrawl.svg);
+  background-size: 16px;
+}
diff --git a/app/components/datasets/create/website/index.tsx b/app/components/datasets/create/website/index.tsx
new file mode 100644
index 0000000..e2d0e2d
--- /dev/null
+++ b/app/components/datasets/create/website/index.tsx
@@ -0,0 +1,161 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import s from './index.module.css'
+import NoData from './no-data'
+import Firecrawl from './firecrawl'
+import Watercrawl from './watercrawl'
+import JinaReader from './jina-reader'
+import cn from '@/utils/classnames'
+import { useModalContext } from '@/context/modal-context'
+import type { CrawlOptions, CrawlResultItem } from '@/models/datasets'
+import { fetchDataSources } from '@/service/datasets'
+import { type DataSourceItem, DataSourceProvider } from '@/models/common'
+import { ENABLE_WEBSITE_FIRECRAWL, ENABLE_WEBSITE_JINAREADER, ENABLE_WEBSITE_WATERCRAWL } from '@/config'
+
+type Props = {
+  onPreview: (payload: CrawlResultItem) => void
+  checkedCrawlResult: CrawlResultItem[]
+  onCheckedCrawlResultChange: (payload: CrawlResultItem[]) => void
+  onCrawlProviderChange: (provider: DataSourceProvider) => void
+  onJobIdChange: (jobId: string) => void
+  crawlOptions: CrawlOptions
+  onCrawlOptionsChange: (payload: CrawlOptions) => void
+}
+
+const Website: FC<Props> = ({
+  onPreview,
+  checkedCrawlResult,
+  onCheckedCrawlResultChange,
+  onCrawlProviderChange,
+  onJobIdChange,
+  crawlOptions,
+  onCrawlOptionsChange,
+}) => {
+  const { t } = useTranslation()
+  const { setShowAccountSettingModal } = useModalContext()
+  const [isLoaded, setIsLoaded] = useState(false)
+  const [selectedProvider, setSelectedProvider] = useState<DataSourceProvider>(DataSourceProvider.jinaReader)
+  const [sources, setSources] = useState<DataSourceItem[]>([])
+
+  useEffect(() => {
+    onCrawlProviderChange(selectedProvider)
+  }, [selectedProvider, onCrawlProviderChange])
+
+  const checkSetApiKey = useCallback(async () => {
+    const res = await fetchDataSources() as any
+    setSources(res.sources)
+
+    // If users have configured one of the providers, select it.
+    const availableProviders = res.sources.filter((item: DataSourceItem) =>
+      [
+        DataSourceProvider.jinaReader,
+        DataSourceProvider.fireCrawl,
+        DataSourceProvider.waterCrawl,
+      ].includes(item.provider),
+    )
+
+    if (availableProviders.length > 0)
+      setSelectedProvider(availableProviders[0].provider)
+  }, [])
+
+  useEffect(() => {
+    checkSetApiKey().then(() => {
+      setIsLoaded(true)
+    })
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+  const handleOnConfig = useCallback(() => {
+    setShowAccountSettingModal({
+      payload: 'data-source',
+      onCancelCallback: checkSetApiKey,
+    })
+  }, [checkSetApiKey, setShowAccountSettingModal])
+
+  if (!isLoaded)
+    return null
+
+  const source = sources.find(source => source.provider === selectedProvider)
+
+  return (
+    <div>
+      <div className="mb-4">
+        <div className="system-md-medium mb-2 text-text-secondary">
+          {t('datasetCreation.stepOne.website.chooseProvider')}
+        </div>
+        <div className="flex space-x-2">
+          {ENABLE_WEBSITE_JINAREADER && <button
+            className={cn('flex items-center justify-center rounded-lg px-4 py-2',
+              selectedProvider === DataSourceProvider.jinaReader
+                ? 'system-sm-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg text-text-primary'
+                : `system-sm-regular border border-components-option-card-option-border bg-components-option-card-option-bg text-text-secondary
+                hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs hover:shadow-shadow-shadow-3`,
+            )}
+            onClick={() => setSelectedProvider(DataSourceProvider.jinaReader)}
+          >
+            <span className={cn(s.jinaLogo, 'mr-2')}/>
+            <span>Jina Reader</span>
+          </button>}
+         {ENABLE_WEBSITE_FIRECRAWL && <button
+            className={cn('rounded-lg px-4 py-2',
+              selectedProvider === DataSourceProvider.fireCrawl
+                ? 'system-sm-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg text-text-primary'
+                : `system-sm-regular border border-components-option-card-option-border bg-components-option-card-option-bg text-text-secondary
+                hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs hover:shadow-shadow-shadow-3`,
+            )}
+            onClick={() => setSelectedProvider(DataSourceProvider.fireCrawl)}
+          >
+            馃敟 Firecrawl
+          </button>}
+          {ENABLE_WEBSITE_WATERCRAWL && <button
+            className={cn('flex items-center justify-center rounded-lg px-4 py-2',
+              selectedProvider === DataSourceProvider.waterCrawl
+                ? 'system-sm-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg text-text-primary'
+                : `system-sm-regular border border-components-option-card-option-border bg-components-option-card-option-bg text-text-secondary
+                hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs hover:shadow-shadow-shadow-3`,
+            )}
+            onClick={() => setSelectedProvider(DataSourceProvider.waterCrawl)}
+          >
+            <span className={cn(s.watercrawlLogo, 'mr-2')}/>
+            <span>WaterCrawl</span>
+          </button>}
+        </div>
+      </div>
+      {source && selectedProvider === DataSourceProvider.fireCrawl && (
+        <Firecrawl
+          onPreview={onPreview}
+          checkedCrawlResult={checkedCrawlResult}
+          onCheckedCrawlResultChange={onCheckedCrawlResultChange}
+          onJobIdChange={onJobIdChange}
+          crawlOptions={crawlOptions}
+          onCrawlOptionsChange={onCrawlOptionsChange}
+        />
+      )}
+      {source && selectedProvider === DataSourceProvider.waterCrawl && (
+        <Watercrawl
+          onPreview={onPreview}
+          checkedCrawlResult={checkedCrawlResult}
+          onCheckedCrawlResultChange={onCheckedCrawlResultChange}
+          onJobIdChange={onJobIdChange}
+          crawlOptions={crawlOptions}
+          onCrawlOptionsChange={onCrawlOptionsChange}
+        />
+      )}
+      {source && selectedProvider === DataSourceProvider.jinaReader && (
+        <JinaReader
+          onPreview={onPreview}
+          checkedCrawlResult={checkedCrawlResult}
+          onCheckedCrawlResultChange={onCheckedCrawlResultChange}
+          onJobIdChange={onJobIdChange}
+          crawlOptions={crawlOptions}
+          onCrawlOptionsChange={onCrawlOptionsChange}
+        />
+      )}
+      {!source && (
+        <NoData onConfig={handleOnConfig} provider={selectedProvider}/>
+      )}
+    </div>
+  )
+}
+export default React.memo(Website)
diff --git a/app/components/datasets/create/website/jina-reader/base/checkbox-with-label.tsx b/app/components/datasets/create/website/jina-reader/base/checkbox-with-label.tsx
new file mode 100644
index 0000000..3ec1375
--- /dev/null
+++ b/app/components/datasets/create/website/jina-reader/base/checkbox-with-label.tsx
@@ -0,0 +1,40 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+import Checkbox from '@/app/components/base/checkbox'
+import Tooltip from '@/app/components/base/tooltip'
+
+type Props = {
+  className?: string
+  isChecked: boolean
+  onChange: (isChecked: boolean) => void
+  label: string
+  labelClassName?: string
+  tooltip?: string
+}
+
+const CheckboxWithLabel: FC<Props> = ({
+  className = '',
+  isChecked,
+  onChange,
+  label,
+  labelClassName,
+  tooltip,
+}) => {
+  return (
+    <label className={cn(className, 'flex h-7 items-center space-x-2')}>
+      <Checkbox checked={isChecked} onCheck={() => onChange(!isChecked)} />
+      <div className={cn('text-sm font-normal text-gray-800', labelClassName)}>{label}</div>
+      {tooltip && (
+        <Tooltip
+          popupContent={
+            <div className='w-[200px]'>{tooltip}</div>
+          }
+          triggerClassName='ml-0.5 w-4 h-4'
+        />
+      )}
+    </label>
+  )
+}
+export default React.memo(CheckboxWithLabel)
diff --git a/app/components/datasets/create/website/jina-reader/base/error-message.tsx b/app/components/datasets/create/website/jina-reader/base/error-message.tsx
new file mode 100644
index 0000000..5a61638
--- /dev/null
+++ b/app/components/datasets/create/website/jina-reader/base/error-message.tsx
@@ -0,0 +1,30 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback'
+
+type Props = {
+  className?: string
+  title: string
+  errorMsg?: string
+}
+
+const ErrorMessage: FC<Props> = ({
+  className,
+  title,
+  errorMsg,
+}) => {
+  return (
+    <div className={cn(className, 'border-t border-gray-200 bg-[#FFFAEB] px-4 py-2')}>
+      <div className='flex h-5 items-center'>
+        <AlertTriangle className='mr-2 h-4 w-4 text-[#F79009]' />
+        <div className='text-sm font-medium text-[#DC6803]'>{title}</div>
+      </div>
+      {errorMsg && (
+        <div className='mt-1 pl-6 text-xs font-normal leading-[18px] text-gray-700'>{errorMsg}</div>
+      )}
+    </div>
+  )
+}
+export default React.memo(ErrorMessage)
diff --git a/app/components/datasets/create/website/jina-reader/base/field.tsx b/app/components/datasets/create/website/jina-reader/base/field.tsx
new file mode 100644
index 0000000..13477ff
--- /dev/null
+++ b/app/components/datasets/create/website/jina-reader/base/field.tsx
@@ -0,0 +1,54 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import Input from './input'
+import cn from '@/utils/classnames'
+import Tooltip from '@/app/components/base/tooltip'
+
+type Props = {
+  className?: string
+  label: string
+  labelClassName?: string
+  value: string | number
+  onChange: (value: string | number) => void
+  isRequired?: boolean
+  placeholder?: string
+  isNumber?: boolean
+  tooltip?: string
+}
+
+const Field: FC<Props> = ({
+  className,
+  label,
+  labelClassName,
+  value,
+  onChange,
+  isRequired = false,
+  placeholder = '',
+  isNumber = false,
+  tooltip,
+}) => {
+  return (
+    <div className={cn(className)}>
+      <div className='flex py-[7px]'>
+        <div className={cn(labelClassName, 'flex h-[18px] items-center text-[13px] font-medium text-gray-900')}>{label} </div>
+        {isRequired && <span className='ml-0.5 text-xs font-semibold text-[#D92D20]'>*</span>}
+        {tooltip && (
+          <Tooltip
+            popupContent={
+              <div className='w-[200px]'>{tooltip}</div>
+            }
+            triggerClassName='ml-0.5 w-4 h-4'
+          />
+        )}
+      </div>
+      <Input
+        value={value}
+        onChange={onChange}
+        placeholder={placeholder}
+        isNumber={isNumber}
+      />
+    </div>
+  )
+}
+export default React.memo(Field)
diff --git a/app/components/datasets/create/website/jina-reader/base/input.tsx b/app/components/datasets/create/website/jina-reader/base/input.tsx
new file mode 100644
index 0000000..bc7a15a
--- /dev/null
+++ b/app/components/datasets/create/website/jina-reader/base/input.tsx
@@ -0,0 +1,58 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+
+type Props = {
+  value: string | number
+  onChange: (value: string | number) => void
+  placeholder?: string
+  isNumber?: boolean
+}
+
+const MIN_VALUE = 0
+
+const Input: FC<Props> = ({
+  value,
+  onChange,
+  placeholder = '',
+  isNumber = false,
+}) => {
+  const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
+    const value = e.target.value
+    if (isNumber) {
+      let numberValue = Number.parseInt(value, 10) // integer only
+      if (isNaN(numberValue)) {
+        onChange('')
+        return
+      }
+      if (numberValue < MIN_VALUE)
+        numberValue = MIN_VALUE
+
+      onChange(numberValue)
+      return
+    }
+    onChange(value)
+  }, [isNumber, onChange])
+
+  const otherOption = (() => {
+    if (isNumber) {
+      return {
+        min: MIN_VALUE,
+      }
+    }
+    return {
+
+    }
+  })()
+  return (
+    <input
+      type={isNumber ? 'number' : 'text'}
+      {...otherOption}
+      value={value}
+      onChange={handleChange}
+      className='flex h-9 w-full rounded-lg bg-gray-100 px-2 py-1 text-xs leading-normal caret-primary-600 placeholder:text-gray-400 hover:bg-gray-100 focus:bg-gray-50 focus:ring-1 focus:ring-inset focus:ring-gray-200 focus-visible:outline-none'
+      placeholder={placeholder}
+    />
+  )
+}
+export default React.memo(Input)
diff --git a/app/components/datasets/create/website/jina-reader/base/options-wrap.tsx b/app/components/datasets/create/website/jina-reader/base/options-wrap.tsx
new file mode 100644
index 0000000..a5fa687
--- /dev/null
+++ b/app/components/datasets/create/website/jina-reader/base/options-wrap.tsx
@@ -0,0 +1,55 @@
+'use client'
+import { useBoolean } from 'ahooks'
+import type { FC } from 'react'
+import React, { useEffect } from 'react'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+import { Settings04 } from '@/app/components/base/icons/src/vender/line/general'
+import { ChevronRight } from '@/app/components/base/icons/src/vender/line/arrows'
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  className?: string
+  children: React.ReactNode
+  controlFoldOptions?: number
+}
+
+const OptionsWrap: FC<Props> = ({
+  className = '',
+  children,
+  controlFoldOptions,
+}) => {
+  const { t } = useTranslation()
+
+  const [fold, {
+    toggle: foldToggle,
+    setTrue: foldHide,
+  }] = useBoolean(false)
+
+  useEffect(() => {
+    if (controlFoldOptions)
+      foldHide()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [controlFoldOptions])
+  return (
+    <div className={cn(className, !fold ? 'mb-0' : 'mb-3')}>
+      <div
+        className='flex h-[26px] cursor-pointer select-none items-center justify-between py-1'
+        onClick={foldToggle}
+      >
+        <div className='flex items-center text-gray-700'>
+          <Settings04 className='mr-1 h-4 w-4' />
+          <div className='text-[13px] font-semibold uppercase text-gray-800'>{t(`${I18N_PREFIX}.options`)}</div>
+        </div>
+        <ChevronRight className={cn(!fold && 'rotate-90', 'h-4 w-4 text-gray-500')} />
+      </div>
+      {!fold && (
+        <div className='mb-4'>
+          {children}
+        </div>
+      )}
+
+    </div>
+  )
+}
+export default React.memo(OptionsWrap)
diff --git a/app/components/datasets/create/website/jina-reader/base/url-input.tsx b/app/components/datasets/create/website/jina-reader/base/url-input.tsx
new file mode 100644
index 0000000..e6b0475
--- /dev/null
+++ b/app/components/datasets/create/website/jina-reader/base/url-input.tsx
@@ -0,0 +1,48 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import Input from './input'
+import Button from '@/app/components/base/button'
+
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  isRunning: boolean
+  onRun: (url: string) => void
+}
+
+const UrlInput: FC<Props> = ({
+  isRunning,
+  onRun,
+}) => {
+  const { t } = useTranslation()
+  const [url, setUrl] = useState('')
+  const handleUrlChange = useCallback((url: string | number) => {
+    setUrl(url as string)
+  }, [])
+  const handleOnRun = useCallback(() => {
+    if (isRunning)
+      return
+    onRun(url)
+  }, [isRunning, onRun, url])
+
+  return (
+    <div className='flex items-center justify-between'>
+      <Input
+        value={url}
+        onChange={handleUrlChange}
+        placeholder='https://docs.dify.ai'
+      />
+      <Button
+        variant='primary'
+        onClick={handleOnRun}
+        className='ml-2'
+        loading={isRunning}
+      >
+        {!isRunning ? t(`${I18N_PREFIX}.run`) : ''}
+      </Button>
+    </div>
+  )
+}
+export default React.memo(UrlInput)
diff --git a/app/components/datasets/create/website/jina-reader/header.tsx b/app/components/datasets/create/website/jina-reader/header.tsx
new file mode 100644
index 0000000..13b8a9e
--- /dev/null
+++ b/app/components/datasets/create/website/jina-reader/header.tsx
@@ -0,0 +1,43 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiBookOpenLine, RiEqualizer2Line } from '@remixicon/react'
+import Button from '@/app/components/base/button'
+
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  onSetting: () => void
+}
+
+const Header: FC<Props> = ({
+  onSetting,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex h-6 items-center justify-between'>
+      <div className='flex items-center'>
+        <div className='text-sm font-semibold text-text-secondary'>{t(`${I18N_PREFIX}.jinaReaderTitle`)}</div>
+        <div className='ml-2 mr-2 h-3.5 w-px bg-divider-regular' />
+        <Button className='flex h-6 items-center gap-x-[1px] px-1.5' onClick={onSetting}>
+          <RiEqualizer2Line className='h-3.5 w-3.5 text-components-button-secondary-text' />
+          <span className='px-[3px] text-xs font-medium text-components-button-secondary-text'>
+            {t(`${I18N_PREFIX}.configureJinaReader`)}
+          </span>
+        </Button>
+      </div>
+      <a
+        href='https://jina.ai/reader'
+        target='_blank'
+        rel='noopener noreferrer'
+        className='inline-flex items-center gap-x-1 text-xs font-medium text-text-accent'
+      >
+        <RiBookOpenLine className='h-3.5 w-3.5 text-text-accent' />
+        <span>{t(`${I18N_PREFIX}.jinaReaderDoc`)}</span>
+      </a>
+    </div>
+  )
+}
+export default React.memo(Header)
diff --git a/app/components/datasets/create/website/jina-reader/index.tsx b/app/components/datasets/create/website/jina-reader/index.tsx
new file mode 100644
index 0000000..2ab0444
--- /dev/null
+++ b/app/components/datasets/create/website/jina-reader/index.tsx
@@ -0,0 +1,230 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import UrlInput from '../base/url-input'
+import OptionsWrap from '../base/options-wrap'
+import CrawledResult from '../base/crawled-result'
+import Crawling from '../base/crawling'
+import ErrorMessage from '../base/error-message'
+import Header from './header'
+import Options from './options'
+import { useModalContext } from '@/context/modal-context'
+import Toast from '@/app/components/base/toast'
+import { checkJinaReaderTaskStatus, createJinaReaderTask } from '@/service/datasets'
+import { sleep } from '@/utils'
+import type { CrawlOptions, CrawlResultItem } from '@/models/datasets'
+
+const ERROR_I18N_PREFIX = 'common.errorMsg'
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  onPreview: (payload: CrawlResultItem) => void
+  checkedCrawlResult: CrawlResultItem[]
+  onCheckedCrawlResultChange: (payload: CrawlResultItem[]) => void
+  onJobIdChange: (jobId: string) => void
+  crawlOptions: CrawlOptions
+  onCrawlOptionsChange: (payload: CrawlOptions) => void
+}
+
+enum Step {
+  init = 'init',
+  running = 'running',
+  finished = 'finished',
+}
+
+const JinaReader: FC<Props> = ({
+  onPreview,
+  checkedCrawlResult,
+  onCheckedCrawlResultChange,
+  onJobIdChange,
+  crawlOptions,
+  onCrawlOptionsChange,
+}) => {
+  const { t } = useTranslation()
+  const [step, setStep] = useState<Step>(Step.init)
+  const [controlFoldOptions, setControlFoldOptions] = useState<number>(0)
+  useEffect(() => {
+    if (step !== Step.init)
+      setControlFoldOptions(Date.now())
+  }, [step])
+  const { setShowAccountSettingModal } = useModalContext()
+  const handleSetting = useCallback(() => {
+    setShowAccountSettingModal({
+      payload: 'data-source',
+    })
+  }, [setShowAccountSettingModal])
+
+  const checkValid = useCallback((url: string) => {
+    let errorMsg = ''
+    if (!url) {
+      errorMsg = t(`${ERROR_I18N_PREFIX}.fieldRequired`, {
+        field: 'url',
+      })
+    }
+
+    if (!errorMsg && !((url.startsWith('http://') || url.startsWith('https://'))))
+      errorMsg = t(`${ERROR_I18N_PREFIX}.urlError`)
+
+    if (!errorMsg && (crawlOptions.limit === null || crawlOptions.limit === undefined || crawlOptions.limit === '')) {
+      errorMsg = t(`${ERROR_I18N_PREFIX}.fieldRequired`, {
+        field: t(`${I18N_PREFIX}.limit`),
+      })
+    }
+
+    return {
+      isValid: !errorMsg,
+      errorMsg,
+    }
+  }, [crawlOptions, t])
+
+  const isInit = step === Step.init
+  const isCrawlFinished = step === Step.finished
+  const isRunning = step === Step.running
+  const [crawlResult, setCrawlResult] = useState<{
+    current: number
+    total: number
+    data: CrawlResultItem[]
+    time_consuming: number | string
+  } | undefined>(undefined)
+  const [crawlErrorMessage, setCrawlErrorMessage] = useState('')
+  const showError = isCrawlFinished && crawlErrorMessage
+
+  const waitForCrawlFinished = useCallback(async (jobId: string) => {
+    try {
+      const res = await checkJinaReaderTaskStatus(jobId) as any
+      if (res.status === 'completed') {
+        return {
+          isError: false,
+          data: {
+            ...res,
+            total: Math.min(res.total, Number.parseFloat(crawlOptions.limit as string)),
+          },
+        }
+      }
+      if (res.status === 'failed' || !res.status) {
+        return {
+          isError: true,
+          errorMessage: res.message,
+          data: {
+            data: [],
+          },
+        }
+      }
+      // update the progress
+      setCrawlResult({
+        ...res,
+        total: Math.min(res.total, Number.parseFloat(crawlOptions.limit as string)),
+      })
+      onCheckedCrawlResultChange(res.data || []) // default select the crawl result
+      await sleep(2500)
+      return await waitForCrawlFinished(jobId)
+    }
+    catch (e: any) {
+      const errorBody = await e.json()
+      return {
+        isError: true,
+        errorMessage: errorBody.message,
+        data: {
+          data: [],
+        },
+      }
+    }
+  }, [crawlOptions.limit, onCheckedCrawlResultChange])
+
+  const handleRun = useCallback(async (url: string) => {
+    const { isValid, errorMsg } = checkValid(url)
+    if (!isValid) {
+      Toast.notify({
+        message: errorMsg!,
+        type: 'error',
+      })
+      return
+    }
+    setStep(Step.running)
+    try {
+      const startTime = Date.now()
+      const res = await createJinaReaderTask({
+        url,
+        options: crawlOptions,
+      }) as any
+
+      if (res.data) {
+        const data = {
+          current: 1,
+          total: 1,
+          data: [{
+            title: res.data.title,
+            markdown: res.data.content,
+            description: res.data.description,
+            source_url: res.data.url,
+          }],
+          time_consuming: (Date.now() - startTime) / 1000,
+        }
+        setCrawlResult(data)
+        onCheckedCrawlResultChange(data.data || [])
+        setCrawlErrorMessage('')
+      }
+      else if (res.job_id) {
+        const jobId = res.job_id
+        onJobIdChange(jobId)
+        const { isError, data, errorMessage } = await waitForCrawlFinished(jobId)
+        if (isError) {
+          setCrawlErrorMessage(errorMessage || t(`${I18N_PREFIX}.unknownError`))
+        }
+        else {
+          setCrawlResult(data)
+          onCheckedCrawlResultChange(data.data || []) // default select the crawl result
+          setCrawlErrorMessage('')
+        }
+      }
+    }
+    catch (e) {
+      setCrawlErrorMessage(t(`${I18N_PREFIX}.unknownError`)!)
+      console.log(e)
+    }
+    finally {
+      setStep(Step.finished)
+    }
+  }, [checkValid, crawlOptions, onCheckedCrawlResultChange, onJobIdChange, t, waitForCrawlFinished])
+
+  return (
+    <div>
+      <Header onSetting={handleSetting} />
+      <div className='mt-2 rounded-xl border border-components-panel-border bg-background-default-subtle p-4 pb-0'>
+        <UrlInput onRun={handleRun} isRunning={isRunning} />
+        <OptionsWrap
+          className='mt-4'
+          controlFoldOptions={controlFoldOptions}
+        >
+          <Options className='mt-2' payload={crawlOptions} onChange={onCrawlOptionsChange} />
+        </OptionsWrap>
+
+        {!isInit && (
+          <div className='relative left-[-16px] mt-3 w-[calc(100%_+_32px)] rounded-b-xl'>
+            {isRunning
+              && <Crawling
+                className='mt-2'
+                crawledNum={crawlResult?.current || 0}
+                totalNum={crawlResult?.total || Number.parseFloat(crawlOptions.limit as string) || 0}
+              />}
+            {showError && (
+              <ErrorMessage className='rounded-b-xl' title={t(`${I18N_PREFIX}.exceptionErrorTitle`)} errorMsg={crawlErrorMessage} />
+            )}
+            {isCrawlFinished && !showError
+              && <CrawledResult
+                className='mb-2'
+                list={crawlResult?.data || []}
+                checkedList={checkedCrawlResult}
+                onSelectedChange={onCheckedCrawlResultChange}
+                onPreview={onPreview}
+                usedTime={Number.parseFloat(crawlResult?.time_consuming as string) || 0}
+              />
+            }
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+export default React.memo(JinaReader)
diff --git a/app/components/datasets/create/website/jina-reader/options.tsx b/app/components/datasets/create/website/jina-reader/options.tsx
new file mode 100644
index 0000000..e18cff8
--- /dev/null
+++ b/app/components/datasets/create/website/jina-reader/options.tsx
@@ -0,0 +1,61 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import CheckboxWithLabel from '../base/checkbox-with-label'
+import Field from '../base/field'
+import cn from '@/utils/classnames'
+import type { CrawlOptions } from '@/models/datasets'
+
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  className?: string
+  payload: CrawlOptions
+  onChange: (payload: CrawlOptions) => void
+}
+
+const Options: FC<Props> = ({
+  className = '',
+  payload,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  const handleChange = useCallback((key: keyof CrawlOptions) => {
+    return (value: any) => {
+      onChange({
+        ...payload,
+        [key]: value,
+      })
+    }
+  }, [payload, onChange])
+  return (
+    <div className={cn(className, ' space-y-2')}>
+      <CheckboxWithLabel
+        label={t(`${I18N_PREFIX}.crawlSubPage`)}
+        isChecked={payload.crawl_sub_pages}
+        onChange={handleChange('crawl_sub_pages')}
+        labelClassName='text-[13px] leading-[16px] font-medium text-text-secondary'
+      />
+      <CheckboxWithLabel
+        label={t(`${I18N_PREFIX}.useSitemap`)}
+        isChecked={payload.use_sitemap}
+        onChange={handleChange('use_sitemap')}
+        tooltip={t(`${I18N_PREFIX}.useSitemapTooltip`) as string}
+        labelClassName='text-[13px] leading-[16px] font-medium text-text-secondary'
+      />
+      <div className='flex justify-between space-x-4'>
+        <Field
+          className='shrink-0 grow'
+          label={t(`${I18N_PREFIX}.limit`)}
+          value={payload.limit}
+          onChange={handleChange('limit')}
+          isNumber
+          isRequired
+        />
+      </div>
+    </div>
+  )
+}
+export default React.memo(Options)
diff --git a/app/components/datasets/create/website/no-data.tsx b/app/components/datasets/create/website/no-data.tsx
new file mode 100644
index 0000000..1db83a7
--- /dev/null
+++ b/app/components/datasets/create/website/no-data.tsx
@@ -0,0 +1,69 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import s from './index.module.css'
+import { Icon3Dots } from '@/app/components/base/icons/src/vender/line/others'
+import Button from '@/app/components/base/button'
+import { DataSourceProvider } from '@/models/common'
+import { ENABLE_WEBSITE_FIRECRAWL, ENABLE_WEBSITE_JINAREADER, ENABLE_WEBSITE_WATERCRAWL } from '@/config'
+
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  onConfig: () => void
+  provider: DataSourceProvider
+}
+
+const NoData: FC<Props> = ({
+  onConfig,
+  provider,
+}) => {
+  const { t } = useTranslation()
+
+  const providerConfig = {
+    [DataSourceProvider.jinaReader]: ENABLE_WEBSITE_JINAREADER ? {
+      emoji: <span className={s.jinaLogo} />,
+      title: t(`${I18N_PREFIX}.jinaReaderNotConfigured`),
+      description: t(`${I18N_PREFIX}.jinaReaderNotConfiguredDescription`),
+    } : null,
+    [DataSourceProvider.fireCrawl]: ENABLE_WEBSITE_FIRECRAWL ? {
+      emoji: '馃敟',
+      title: t(`${I18N_PREFIX}.fireCrawlNotConfigured`),
+      description: t(`${I18N_PREFIX}.fireCrawlNotConfiguredDescription`),
+    } : null,
+    [DataSourceProvider.waterCrawl]: ENABLE_WEBSITE_WATERCRAWL ? {
+      emoji: '馃挧',
+      title: t(`${I18N_PREFIX}.waterCrawlNotConfigured`),
+      description: t(`${I18N_PREFIX}.waterCrawlNotConfiguredDescription`),
+    } : null,
+  }
+
+  const currentProvider = providerConfig[provider] || providerConfig[DataSourceProvider.jinaReader]
+
+  if (!currentProvider) return null
+
+  return (
+    <>
+      <div className='mt-4 max-w-[640px] rounded-2xl bg-workflow-process-bg p-6'>
+        <div className='flex h-12 w-12 items-center justify-center rounded-[10px] border-[0.5px]
+          border-components-card-border bg-components-card-bg shadow-lg shadow-shadow-shadow-5 backdrop-blur-[5px]'>
+          {currentProvider.emoji}
+        </div>
+        <div className='mb-1 mt-2 flex flex-col gap-y-1 pb-3 pt-1'>
+          <span className='system-md-semibold text-text-secondary'>
+            {currentProvider.title}
+            <Icon3Dots className='relative -left-1.5 -top-2.5 inline' />
+          </span>
+          <div className='system-sm-regular text-text-tertiary'>
+            {currentProvider.description}
+          </div>
+        </div>
+        <Button variant='primary' onClick={onConfig}>
+          {t(`${I18N_PREFIX}.configure`)}
+        </Button>
+      </div>
+    </>
+  )
+}
+export default React.memo(NoData)
diff --git a/app/components/datasets/create/website/preview.tsx b/app/components/datasets/create/website/preview.tsx
new file mode 100644
index 0000000..f43dc83
--- /dev/null
+++ b/app/components/datasets/create/website/preview.tsx
@@ -0,0 +1,41 @@
+'use client'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { XMarkIcon } from '@heroicons/react/20/solid'
+import s from '../file-preview/index.module.css'
+import cn from '@/utils/classnames'
+import type { CrawlResultItem } from '@/models/datasets'
+
+type IProps = {
+  payload: CrawlResultItem
+  hidePreview: () => void
+}
+
+const WebsitePreview = ({
+  payload,
+  hidePreview,
+}: IProps) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className={cn(s.filePreview, 'h-full')}>
+      <div className={cn(s.previewHeader)}>
+        <div className={cn(s.title, 'title-md-semi-bold')}>
+          <span>{t('datasetCreation.stepOne.pagePreview')}</span>
+          <div className='flex h-6 w-6 cursor-pointer items-center justify-center' onClick={hidePreview}>
+            <XMarkIcon className='h-4 w-4'></XMarkIcon>
+          </div>
+        </div>
+        <div className='title-sm-semi-bold break-words text-text-primary'>
+          {payload.title}
+        </div>
+        <div className='system-xs-medium truncate text-text-tertiary' title={payload.source_url}>{payload.source_url}</div>
+      </div>
+      <div className={cn(s.previewContent, 'body-md-regular')}>
+        <div className={cn(s.fileContent)}>{payload.markdown}</div>
+      </div>
+    </div>
+  )
+}
+
+export default WebsitePreview
diff --git a/app/components/datasets/create/website/watercrawl/header.tsx b/app/components/datasets/create/website/watercrawl/header.tsx
new file mode 100644
index 0000000..38b2813
--- /dev/null
+++ b/app/components/datasets/create/website/watercrawl/header.tsx
@@ -0,0 +1,43 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiBookOpenLine, RiEqualizer2Line } from '@remixicon/react'
+import Button from '@/app/components/base/button'
+
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  onSetting: () => void
+}
+
+const Header: FC<Props> = ({
+  onSetting,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex h-6 items-center justify-between'>
+      <div className='flex items-center'>
+        <div className='text-base font-medium text-text-secondary'>{t(`${I18N_PREFIX}.watercrawlTitle`)}</div>
+        <div className='ml-2 mr-2 h-3.5 w-px bg-divider-regular' />
+        <Button className='flex h-6 items-center gap-x-[1px] px-1.5' onClick={onSetting}>
+          <RiEqualizer2Line className='h-3.5 w-3.5 text-components-button-secondary-text' />
+          <span className='px-[3px] text-xs font-medium text-components-button-secondary-text'>
+            {t(`${I18N_PREFIX}.configureWatercrawl`)}
+          </span>
+        </Button>
+      </div>
+      <a
+        href='https://docs.watercrawl.dev/'
+        target='_blank'
+        rel='noopener noreferrer'
+        className='inline-flex items-center gap-x-1 text-xs font-medium text-text-accent'
+      >
+        <RiBookOpenLine className='h-3.5 w-3.5 text-text-accent' />
+        <span>{t(`${I18N_PREFIX}.watercrawlDoc`)}</span>
+      </a>
+    </div>
+  )
+}
+export default React.memo(Header)
diff --git a/app/components/datasets/create/website/watercrawl/index.tsx b/app/components/datasets/create/website/watercrawl/index.tsx
new file mode 100644
index 0000000..bd4faa1
--- /dev/null
+++ b/app/components/datasets/create/website/watercrawl/index.tsx
@@ -0,0 +1,217 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import UrlInput from '../base/url-input'
+import OptionsWrap from '../base/options-wrap'
+import CrawledResult from '../base/crawled-result'
+import Crawling from '../base/crawling'
+import ErrorMessage from '../base/error-message'
+import Header from './header'
+import Options from './options'
+import { useModalContext } from '@/context/modal-context'
+import type { CrawlOptions, CrawlResultItem } from '@/models/datasets'
+import Toast from '@/app/components/base/toast'
+import { checkWatercrawlTaskStatus, createWatercrawlTask } from '@/service/datasets'
+import { sleep } from '@/utils'
+
+const ERROR_I18N_PREFIX = 'common.errorMsg'
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  onPreview: (payload: CrawlResultItem) => void
+  checkedCrawlResult: CrawlResultItem[]
+  onCheckedCrawlResultChange: (payload: CrawlResultItem[]) => void
+  onJobIdChange: (jobId: string) => void
+  crawlOptions: CrawlOptions
+  onCrawlOptionsChange: (payload: CrawlOptions) => void
+}
+
+enum Step {
+  init = 'init',
+  running = 'running',
+  finished = 'finished',
+}
+
+const WaterCrawl: FC<Props> = ({
+  onPreview,
+  checkedCrawlResult,
+  onCheckedCrawlResultChange,
+  onJobIdChange,
+  crawlOptions,
+  onCrawlOptionsChange,
+}) => {
+  const { t } = useTranslation()
+  const [step, setStep] = useState<Step>(Step.init)
+  const [controlFoldOptions, setControlFoldOptions] = useState<number>(0)
+  useEffect(() => {
+    if (step !== Step.init)
+      setControlFoldOptions(Date.now())
+  }, [step])
+  const { setShowAccountSettingModal } = useModalContext()
+  const handleSetting = useCallback(() => {
+    setShowAccountSettingModal({
+      payload: 'data-source',
+    })
+  }, [setShowAccountSettingModal])
+
+  const checkValid = useCallback((url: string) => {
+    let errorMsg = ''
+    if (!url) {
+      errorMsg = t(`${ERROR_I18N_PREFIX}.fieldRequired`, {
+        field: 'url',
+      })
+    }
+
+    if (!errorMsg && !((url.startsWith('http://') || url.startsWith('https://'))))
+      errorMsg = t(`${ERROR_I18N_PREFIX}.urlError`)
+
+    if (!errorMsg && (crawlOptions.limit === null || crawlOptions.limit === undefined || crawlOptions.limit === '')) {
+      errorMsg = t(`${ERROR_I18N_PREFIX}.fieldRequired`, {
+        field: t(`${I18N_PREFIX}.limit`),
+      })
+    }
+
+    return {
+      isValid: !errorMsg,
+      errorMsg,
+    }
+  }, [crawlOptions, t])
+
+  const isInit = step === Step.init
+  const isCrawlFinished = step === Step.finished
+  const isRunning = step === Step.running
+  const [crawlResult, setCrawlResult] = useState<{
+    current: number
+    total: number
+    data: CrawlResultItem[]
+    time_consuming: number | string
+  } | undefined>(undefined)
+  const [crawlErrorMessage, setCrawlErrorMessage] = useState('')
+  const showError = isCrawlFinished && crawlErrorMessage
+
+  const waitForCrawlFinished = useCallback(async (jobId: string): Promise<any> => {
+    try {
+      const res = await checkWatercrawlTaskStatus(jobId) as any
+      if (res.status === 'completed') {
+        return {
+          isError: false,
+          data: {
+            ...res,
+            total: Math.min(res.total, Number.parseFloat(crawlOptions.limit as string)),
+          },
+        }
+      }
+      if (res.status === 'error' || !res.status) {
+        // can't get the error message from the watercrawl api
+        return {
+          isError: true,
+          errorMessage: res.message,
+          data: {
+            data: [],
+          },
+        }
+      }
+      // update the progress
+      setCrawlResult({
+        ...res,
+        total: Math.min(res.total, Number.parseFloat(crawlOptions.limit as string)),
+      })
+      onCheckedCrawlResultChange(res.data || []) // default select the crawl result
+      await sleep(2500)
+      return await waitForCrawlFinished(jobId)
+    }
+    catch (e: any) {
+      const errorBody = await e.json()
+      return {
+        isError: true,
+        errorMessage: errorBody.message,
+        data: {
+          data: [],
+        },
+      }
+    }
+  }, [crawlOptions.limit])
+
+  const handleRun = useCallback(async (url: string) => {
+    const { isValid, errorMsg } = checkValid(url)
+    if (!isValid) {
+      Toast.notify({
+        message: errorMsg!,
+        type: 'error',
+      })
+      return
+    }
+    setStep(Step.running)
+    try {
+      const passToServerCrawlOptions: any = {
+        ...crawlOptions,
+      }
+      if (crawlOptions.max_depth === '')
+        delete passToServerCrawlOptions.max_depth
+
+      const res = await createWatercrawlTask({
+        url,
+        options: passToServerCrawlOptions,
+      }) as any
+      const jobId = res.job_id
+      onJobIdChange(jobId)
+      const { isError, data, errorMessage } = await waitForCrawlFinished(jobId)
+      if (isError) {
+        setCrawlErrorMessage(errorMessage || t(`${I18N_PREFIX}.unknownError`))
+      }
+      else {
+        setCrawlResult(data)
+        onCheckedCrawlResultChange(data.data || []) // default select the crawl result
+        setCrawlErrorMessage('')
+      }
+    }
+    catch (e) {
+      setCrawlErrorMessage(t(`${I18N_PREFIX}.unknownError`)!)
+      console.log(e)
+    }
+    finally {
+      setStep(Step.finished)
+    }
+  }, [checkValid, crawlOptions, onJobIdChange, t, waitForCrawlFinished])
+
+  return (
+    <div>
+      <Header onSetting={handleSetting} />
+      <div className='mt-2 rounded-xl border border-components-panel-border bg-background-default-subtle p-4 pb-0'>
+        <UrlInput onRun={handleRun} isRunning={isRunning} />
+        <OptionsWrap
+          className='mt-4'
+          controlFoldOptions={controlFoldOptions}
+        >
+          <Options className='mt-2' payload={crawlOptions} onChange={onCrawlOptionsChange} />
+        </OptionsWrap>
+
+        {!isInit && (
+          <div className='relative left-[-16px] mt-3 w-[calc(100%_+_32px)] rounded-b-xl'>
+            {isRunning
+              && <Crawling
+                className='mt-2'
+                crawledNum={crawlResult?.current || 0}
+                totalNum={crawlResult?.total || Number.parseFloat(crawlOptions.limit as string) || 0}
+              />}
+            {showError && (
+              <ErrorMessage className='rounded-b-xl' title={t(`${I18N_PREFIX}.exceptionErrorTitle`)} errorMsg={crawlErrorMessage} />
+            )}
+            {isCrawlFinished && !showError
+              && <CrawledResult
+                className='mb-2'
+                list={crawlResult?.data || []}
+                checkedList={checkedCrawlResult}
+                onSelectedChange={onCheckedCrawlResultChange}
+                onPreview={onPreview}
+                usedTime={Number.parseFloat(crawlResult?.time_consuming as string) || 0}
+              />
+            }
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+export default React.memo(WaterCrawl)
diff --git a/app/components/datasets/create/website/watercrawl/options.tsx b/app/components/datasets/create/website/watercrawl/options.tsx
new file mode 100644
index 0000000..dea6c0e
--- /dev/null
+++ b/app/components/datasets/create/website/watercrawl/options.tsx
@@ -0,0 +1,85 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import CheckboxWithLabel from '../base/checkbox-with-label'
+import Field from '../base/field'
+import cn from '@/utils/classnames'
+import type { CrawlOptions } from '@/models/datasets'
+
+const I18N_PREFIX = 'datasetCreation.stepOne.website'
+
+type Props = {
+  className?: string
+  payload: CrawlOptions
+  onChange: (payload: CrawlOptions) => void
+}
+
+const Options: FC<Props> = ({
+  className = '',
+  payload,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  const handleChange = useCallback((key: keyof CrawlOptions) => {
+    return (value: any) => {
+      onChange({
+        ...payload,
+        [key]: value,
+      })
+    }
+  }, [payload, onChange])
+  return (
+    <div className={cn(className, ' space-y-2')}>
+      <CheckboxWithLabel
+        label={t(`${I18N_PREFIX}.crawlSubPage`)}
+        isChecked={payload.crawl_sub_pages}
+        onChange={handleChange('crawl_sub_pages')}
+        labelClassName='text-[13px] leading-[16px] font-medium text-text-secondary'
+      />
+      <div className='flex justify-between space-x-4'>
+        <Field
+          className='shrink-0 grow'
+          label={t(`${I18N_PREFIX}.limit`)}
+          value={payload.limit}
+          onChange={handleChange('limit')}
+          isNumber
+          isRequired
+        />
+        <Field
+          className='shrink-0 grow'
+          label={t(`${I18N_PREFIX}.maxDepth`)}
+          value={payload.max_depth}
+          onChange={handleChange('max_depth')}
+          isNumber
+          tooltip={t(`${I18N_PREFIX}.maxDepthTooltip`)!}
+        />
+      </div>
+
+      <div className='flex justify-between space-x-4'>
+        <Field
+          className='shrink-0 grow'
+          label={t(`${I18N_PREFIX}.excludePaths`)}
+          value={payload.excludes}
+          onChange={handleChange('excludes')}
+          placeholder='blog/*, /about/*'
+        />
+        <Field
+          className='shrink-0 grow'
+          label={t(`${I18N_PREFIX}.includeOnlyPaths`)}
+          value={payload.includes}
+          onChange={handleChange('includes')}
+          placeholder='articles/*'
+        />
+      </div>
+      <CheckboxWithLabel
+        label={t(`${I18N_PREFIX}.extractOnlyMainContent`)}
+        isChecked={payload.only_main_content}
+        onChange={handleChange('only_main_content')}
+        labelClassName='text-[13px] leading-[16px] font-medium text-text-secondary'
+      />
+    </div>
+  )
+}
+export default React.memo(Options)
diff --git a/app/components/datasets/documents/assets/atSign.svg b/app/components/datasets/documents/assets/atSign.svg
new file mode 100644
index 0000000..49bf606
--- /dev/null
+++ b/app/components/datasets/documents/assets/atSign.svg
@@ -0,0 +1,10 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_2427_26665)">
+<path d="M10.6668 5.33333V8.66666C10.6668 9.19709 10.8776 9.7058 11.2526 10.0809C11.6277 10.4559 12.1364 10.6667 12.6668 10.6667C13.1973 10.6667 13.706 10.4559 14.0811 10.0809C14.4561 9.7058 14.6668 9.19709 14.6668 8.66666V7.99999C14.6667 6.49535 14.1577 5.03498 13.2224 3.85635C12.287 2.67772 10.9805 1.85014 9.51526 1.50819C8.04999 1.16624 6.51213 1.33002 5.15173 1.9729C3.79134 2.61579 2.68843 3.69996 2.02234 5.04914C1.35625 6.39832 1.16615 7.93315 1.48295 9.40407C1.79975 10.875 2.60482 12.1955 3.76726 13.1508C4.92969 14.1062 6.38112 14.6402 7.88555 14.6661C9.38997 14.692 10.8589 14.2082 12.0535 13.2933M10.6668 7.99999C10.6668 9.47275 9.47293 10.6667 8.00017 10.6667C6.52741 10.6667 5.3335 9.47275 5.3335 7.99999C5.3335 6.52723 6.52741 5.33333 8.00017 5.33333C9.47293 5.33333 10.6668 6.52723 10.6668 7.99999Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_2427_26665">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/datasets/documents/assets/bezierCurve.svg b/app/components/datasets/documents/assets/bezierCurve.svg
new file mode 100644
index 0000000..f2d1a3b
--- /dev/null
+++ b/app/components/datasets/documents/assets/bezierCurve.svg
@@ -0,0 +1,3 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M5.42857 3.5L2.57143 8.5M3 9.5H8.9999M9.42857 8.5L6.57143 3.5M1.8 10.5H2.2C2.48003 10.5 2.62004 10.5 2.727 10.4455C2.82108 10.3976 2.89757 10.3211 2.9455 10.227C3 10.12 3 9.98003 3 9.7V9.3C3 9.01997 3 8.87996 2.9455 8.773C2.89757 8.67892 2.82108 8.60243 2.727 8.5545C2.62004 8.5 2.48003 8.5 2.2 8.5H1.8C1.51997 8.5 1.37996 8.5 1.273 8.5545C1.17892 8.60243 1.10243 8.67892 1.0545 8.773C1 8.87996 1 9.01997 1 9.3V9.7C1 9.98003 1 10.12 1.0545 10.227C1.10243 10.3211 1.17892 10.3976 1.273 10.4455C1.37996 10.5 1.51997 10.5 1.8 10.5ZM9.8 10.5H10.2C10.48 10.5 10.62 10.5 10.727 10.4455C10.8211 10.3976 10.8976 10.3211 10.9455 10.227C11 10.12 11 9.98003 11 9.7V9.3C11 9.01997 11 8.87996 10.9455 8.773C10.8976 8.67892 10.8211 8.60243 10.727 8.5545C10.62 8.5 10.48 8.5 10.2 8.5H9.8C9.51997 8.5 9.37996 8.5 9.273 8.5545C9.17892 8.60243 9.10243 8.67892 9.0545 8.773C9 8.87996 9 9.01997 9 9.3V9.7C9 9.98003 9 10.12 9.0545 10.227C9.10243 10.3211 9.17892 10.3976 9.273 10.4455C9.37996 10.5 9.51997 10.5 9.8 10.5ZM5.8 3.5H6.2C6.48003 3.5 6.62004 3.5 6.727 3.4455C6.82108 3.39757 6.89757 3.32108 6.9455 3.227C7 3.12004 7 2.98003 7 2.7V2.3C7 2.01997 7 1.87996 6.9455 1.773C6.89757 1.67892 6.82108 1.60243 6.727 1.5545C6.62004 1.5 6.48003 1.5 6.2 1.5H5.8C5.51997 1.5 5.37996 1.5 5.273 1.5545C5.17892 1.60243 5.10243 1.67892 5.0545 1.773C5 1.87996 5 2.01997 5 2.3V2.7C5 2.98003 5 3.12004 5.0545 3.227C5.10243 3.32108 5.17892 3.39757 5.273 3.4455C5.37996 3.5 5.51997 3.5 5.8 3.5Z" stroke="#667085" stroke-linecap="round" stroke-linejoin="round" />
+  </svg>
diff --git a/app/components/datasets/documents/assets/bookOpen.svg b/app/components/datasets/documents/assets/bookOpen.svg
new file mode 100644
index 0000000..04a38fb
--- /dev/null
+++ b/app/components/datasets/documents/assets/bookOpen.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8.00016 14L7.93346 13.8999C7.47037 13.2053 7.23882 12.858 6.9329 12.6065C6.66207 12.3839 6.35001 12.2169 6.01457 12.1151C5.63566 12 5.21823 12 4.38338 12H3.46683C2.72009 12 2.34672 12 2.06151 11.8547C1.81063 11.7268 1.60665 11.5229 1.47882 11.272C1.3335 10.9868 1.3335 10.6134 1.3335 9.86667V4.13333C1.3335 3.3866 1.3335 3.01323 1.47882 2.72801C1.60665 2.47713 1.81063 2.27316 2.06151 2.14532C2.34672 2 2.72009 2 3.46683 2H3.7335C5.22697 2 5.97371 2 6.54414 2.29065C7.0459 2.54631 7.45385 2.95426 7.70951 3.45603C8.00016 4.02646 8.00016 4.77319 8.00016 6.26667M8.00016 14V6.26667M8.00016 14L8.06687 13.8999C8.52996 13.2053 8.76151 12.858 9.06743 12.6065C9.33826 12.3839 9.65032 12.2169 9.98576 12.1151C10.3647 12 10.7821 12 11.6169 12H12.5335C13.2802 12 13.6536 12 13.9388 11.8547C14.1897 11.7268 14.3937 11.5229 14.5215 11.272C14.6668 10.9868 14.6668 10.6134 14.6668 9.86667V4.13333C14.6668 3.3866 14.6668 3.01323 14.5215 2.72801C14.3937 2.47713 14.1897 2.27316 13.9388 2.14532C13.6536 2 13.2802 2 12.5335 2H12.2668C10.7734 2 10.0266 2 9.45619 2.29065C8.95442 2.54631 8.54647 2.95426 8.29081 3.45603C8.00016 4.02646 8.00016 4.77319 8.00016 6.26667" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/documents/assets/briefcase.svg b/app/components/datasets/documents/assets/briefcase.svg
new file mode 100644
index 0000000..7ec1aa4
--- /dev/null
+++ b/app/components/datasets/documents/assets/briefcase.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.3335 14V4.66667C5.3335 4.04669 5.3335 3.7367 5.40164 3.48236C5.58658 2.79218 6.12567 2.25308 6.81586 2.06815C7.07019 2 7.38018 2 8.00016 2C8.62014 2 8.93013 2 9.18447 2.06815C9.87465 2.25308 10.4137 2.79218 10.5987 3.48236C10.6668 3.7367 10.6668 4.04669 10.6668 4.66667V14M3.46683 14H12.5335C13.2802 14 13.6536 14 13.9388 13.8547C14.1897 13.7268 14.3937 13.5229 14.5215 13.272C14.6668 12.9868 14.6668 12.6134 14.6668 11.8667V6.8C14.6668 6.05326 14.6668 5.6799 14.5215 5.39468C14.3937 5.1438 14.1897 4.93982 13.9388 4.81199C13.6536 4.66667 13.2802 4.66667 12.5335 4.66667H3.46683C2.72009 4.66667 2.34672 4.66667 2.06151 4.81199C1.81063 4.93982 1.60665 5.1438 1.47882 5.39468C1.3335 5.6799 1.3335 6.05326 1.3335 6.8V11.8667C1.3335 12.6134 1.3335 12.9868 1.47882 13.272C1.60665 13.5229 1.81063 13.7268 2.06151 13.8547C2.34672 14 2.72009 14 3.46683 14Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/documents/assets/cardLoading.svg b/app/components/datasets/documents/assets/cardLoading.svg
new file mode 100644
index 0000000..76ba4d7
--- /dev/null
+++ b/app/components/datasets/documents/assets/cardLoading.svg
@@ -0,0 +1,15 @@
+<svg width="232" height="120" viewBox="0 0 232 120" preserveAspectRatio="none" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect y="6" width="232" height="8" rx="3" fill="#EAECF0"/>
+<rect y="26" width="232" height="8" rx="3" fill="#EAECF0"/>
+<rect y="46" width="232" height="8" rx="3" fill="#EAECF0"/>
+<rect y="66" width="232" height="8" rx="3" fill="#EAECF0"/>
+<rect y="86" width="232" height="8" rx="3" fill="#EAECF0"/>
+<g clip-path="url(#clip0_2368_22256)">
+<rect y="106" width="256" height="8" rx="3" fill="#EAECF0"/>
+</g>
+<defs>
+<clipPath id="clip0_2368_22256">
+<rect width="232" height="20" fill="white" transform="translate(0 100)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/datasets/documents/assets/file.svg b/app/components/datasets/documents/assets/file.svg
new file mode 100644
index 0000000..32fb805
--- /dev/null
+++ b/app/components/datasets/documents/assets/file.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M9.33317 1.51306V4.26676C9.33317 4.64012 9.33317 4.82681 9.40583 4.96942C9.46975 5.09486 9.57173 5.19684 9.69718 5.26076C9.83978 5.33342 10.0265 5.33342 10.3998 5.33342H13.1535M10.6665 8.66671H5.33317M10.6665 11.3334H5.33317M6.6665 6.00004H5.33317M9.33317 1.33337H5.8665C4.7464 1.33337 4.18635 1.33337 3.75852 1.55136C3.3822 1.74311 3.07624 2.04907 2.88449 2.42539C2.6665 2.85322 2.6665 3.41327 2.6665 4.53337V11.4667C2.6665 12.5868 2.6665 13.1469 2.88449 13.5747C3.07624 13.951 3.3822 14.257 3.75852 14.4487C4.18635 14.6667 4.7464 14.6667 5.8665 14.6667H10.1332C11.2533 14.6667 11.8133 14.6667 12.2412 14.4487C12.6175 14.257 12.9234 13.951 13.1152 13.5747C13.3332 13.1469 13.3332 12.5868 13.3332 11.4667V5.33337L9.33317 1.33337Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/documents/assets/globe.svg b/app/components/datasets/documents/assets/globe.svg
new file mode 100644
index 0000000..457c924
--- /dev/null
+++ b/app/components/datasets/documents/assets/globe.svg
@@ -0,0 +1,10 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_2427_26661)">
+<path d="M1.79133 10.4301L3.06346 9.69574C3.13237 9.65596 3.21323 9.64214 3.29143 9.65678L5.79443 10.1252C6.00013 10.1637 6.19001 10.0054 6.18908 9.7961L6.17934 7.60301C6.17907 7.54342 6.19478 7.48486 6.22484 7.43341L7.48799 5.27085C7.55373 5.1583 7.54784 5.01776 7.47291 4.91111L5.34611 1.88383M12.667 3.23941C9.0003 5.00007 11.0002 7.3334 11.667 7.66674C12.9184 8.29232 14.6586 8.33337 14.6586 8.33337C14.664 8.22294 14.6668 8.11182 14.6668 8.00004C14.6668 4.31814 11.6821 1.33337 8.00016 1.33337C4.31826 1.33337 1.3335 4.31814 1.3335 8.00004C1.3335 11.6819 4.31826 14.6667 8.00016 14.6667C8.11194 14.6667 8.22307 14.664 8.3335 14.6585M11.172 14.6266L9.06083 9.06071L14.6267 11.1719L12.1586 12.1585L11.172 14.6266Z" stroke="#155EEF" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_2427_26661">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/datasets/documents/assets/graduationHat.svg b/app/components/datasets/documents/assets/graduationHat.svg
new file mode 100644
index 0000000..405a377
--- /dev/null
+++ b/app/components/datasets/documents/assets/graduationHat.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M11.3335 9.66667V7.66295C11.3335 7.5433 11.3335 7.48348 11.3153 7.43066C11.2992 7.38395 11.2729 7.34141 11.2383 7.30611C11.1992 7.26619 11.1457 7.23944 11.0387 7.18593L8.00016 5.66667M2.66683 6.33334V10.8711C2.66683 11.119 2.66683 11.243 2.70551 11.3515C2.7397 11.4475 2.79543 11.5343 2.86842 11.6054C2.95097 11.6858 3.06368 11.7374 3.28906 11.8408L7.55573 13.7963C7.71922 13.8712 7.80097 13.9087 7.88612 13.9235C7.96159 13.9366 8.03874 13.9366 8.1142 13.9235C8.19936 13.9087 8.28111 13.8712 8.44459 13.7963L12.7113 11.8408C12.9367 11.7374 13.0494 11.6858 13.1319 11.6054C13.2049 11.5343 13.2606 11.4475 13.2948 11.3515C13.3335 11.243 13.3335 11.119 13.3335 10.8711V6.33334M1.3335 5.66667L7.76165 2.45259C7.8491 2.40887 7.89283 2.387 7.9387 2.3784C7.97932 2.37078 8.02101 2.37078 8.06163 2.3784C8.1075 2.387 8.15122 2.40887 8.23868 2.45259L14.6668 5.66667L8.23868 8.88075C8.15122 8.92447 8.1075 8.94634 8.06163 8.95494C8.02101 8.96256 7.97932 8.96256 7.9387 8.95494C7.89283 8.94634 7.8491 8.92447 7.76165 8.88075L1.3335 5.66667Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/documents/assets/hitLoading.svg b/app/components/datasets/documents/assets/hitLoading.svg
new file mode 100644
index 0000000..713b6a2
--- /dev/null
+++ b/app/components/datasets/documents/assets/hitLoading.svg
@@ -0,0 +1,15 @@
+<svg width="252" height="120" viewBox="0 0 252 120" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect y="6" width="252" height="8" rx="3" fill="#EAECF0"/>
+<rect y="26" width="252" height="8" rx="3" fill="#EAECF0"/>
+<rect y="46" width="252" height="8" rx="3" fill="#EAECF0"/>
+<rect y="66" width="252" height="8" rx="3" fill="#EAECF0"/>
+<rect y="86" width="252" height="8" rx="3" fill="#EAECF0"/>
+<g clip-path="url(#clip0_1562_6752)">
+<rect y="106" width="256" height="8" rx="3" fill="#EAECF0"/>
+</g>
+<defs>
+<clipPath id="clip0_1562_6752">
+<rect width="252" height="20" fill="white" transform="translate(0 100)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/datasets/documents/assets/layoutRightClose.svg b/app/components/datasets/documents/assets/layoutRightClose.svg
new file mode 100644
index 0000000..b247d10
--- /dev/null
+++ b/app/components/datasets/documents/assets/layoutRightClose.svg
@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.12" d="M10 2H10.8C11.9201 2 12.4802 2 12.908 2.21799C13.2843 2.40973 13.5903 2.71569 13.782 3.09202C14 3.51984 14 4.0799 14 5.2V10.8C14 11.9201 14 12.4802 13.782 12.908C13.5903 13.2843 13.2843 13.5903 12.908 13.782C12.4802 14 11.9201 14 10.8 14H10V2Z" fill="#344054"/>
+<path d="M10 2V14M5.2 2H10.8C11.9201 2 12.4802 2 12.908 2.21799C13.2843 2.40973 13.5903 2.71569 13.782 3.09202C14 3.51984 14 4.0799 14 5.2V10.8C14 11.9201 14 12.4802 13.782 12.908C13.5903 13.2843 13.2843 13.5903 12.908 13.782C12.4802 14 11.9201 14 10.8 14H5.2C4.07989 14 3.51984 14 3.09202 13.782C2.71569 13.5903 2.40973 13.2843 2.21799 12.908C2 12.4802 2 11.9201 2 10.8V5.2C2 4.07989 2 3.51984 2.21799 3.09202C2.40973 2.71569 2.71569 2.40973 3.09202 2.21799C3.51984 2 4.0799 2 5.2 2Z" stroke="#344054" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/documents/assets/layoutRightShow.svg b/app/components/datasets/documents/assets/layoutRightShow.svg
new file mode 100644
index 0000000..889e469
--- /dev/null
+++ b/app/components/datasets/documents/assets/layoutRightShow.svg
@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.12" d="M10 2H10.8C11.9201 2 12.4802 2 12.908 2.21799C13.2843 2.40973 13.5903 2.71569 13.782 3.09202C14 3.51984 14 4.0799 14 5.2V10.8C14 11.9201 14 12.4802 13.782 12.908C13.5903 13.2843 13.2843 13.5903 12.908 13.782C12.4802 14 11.9201 14 10.8 14H10V2Z" fill="#004EEB"/>
+<path d="M10 2V14M5.2 2H10.8C11.9201 2 12.4802 2 12.908 2.21799C13.2843 2.40973 13.5903 2.71569 13.782 3.09202C14 3.51984 14 4.0799 14 5.2V10.8C14 11.9201 14 12.4802 13.782 12.908C13.5903 13.2843 13.2843 13.5903 12.908 13.782C12.4802 14 11.9201 14 10.8 14H5.2C4.07989 14 3.51984 14 3.09202 13.782C2.71569 13.5903 2.40973 13.2843 2.21799 12.908C2 12.4802 2 11.9201 2 10.8V5.2C2 4.07989 2 3.51984 2.21799 3.09202C2.40973 2.71569 2.71569 2.40973 3.09202 2.21799C3.51984 2 4.0799 2 5.2 2Z" stroke="#155EEF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/documents/assets/messageTextCircle.svg b/app/components/datasets/documents/assets/messageTextCircle.svg
new file mode 100644
index 0000000..e2c508c
--- /dev/null
+++ b/app/components/datasets/documents/assets/messageTextCircle.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.33333 6.33333H8M5.33333 8.66667H10M8 14C11.3137 14 14 11.3137 14 8C14 4.68629 11.3137 2 8 2C4.68629 2 2 4.68629 2 8C2 8.7981 2.15582 9.5598 2.43871 10.2563C2.49285 10.3897 2.51992 10.4563 2.532 10.5102C2.54381 10.5629 2.54813 10.6019 2.54814 10.6559C2.54814 10.7111 2.53812 10.7713 2.51807 10.8916L2.12275 13.2635C2.08135 13.5119 2.06065 13.6361 2.09917 13.7259C2.13289 13.8045 2.19552 13.8671 2.27412 13.9008C2.36393 13.9393 2.48812 13.9186 2.73651 13.8772L5.10843 13.4819C5.22872 13.4619 5.28887 13.4519 5.34409 13.4519C5.3981 13.4519 5.43711 13.4562 5.48981 13.468C5.54369 13.4801 5.61035 13.5072 5.74366 13.5613C6.4402 13.8442 7.2019 14 8 14Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/documents/assets/normal.svg b/app/components/datasets/documents/assets/normal.svg
new file mode 100644
index 0000000..1d94adf
--- /dev/null
+++ b/app/components/datasets/documents/assets/normal.svg
@@ -0,0 +1,4 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.75 4.5C6.7165 4.5 7.5 3.7165 7.5 2.75C7.5 1.7835 6.7165 1 5.75 1C4.7835 1 4 1.7835 4 2.75C4 3.7165 4.7835 4.5 5.75 4.5Z" fill="#444CE7"/>
+<path d="M3.48775 4.314C3.36842 4.14172 3.30875 4.05558 3.24448 4.02712C3.18679 4.00157 3.12605 3.99844 3.06603 4.01794C2.99918 4.03965 2.94661 4.10099 2.84146 4.22367C2.41951 4.71598 2.13172 5.32705 2.03543 6.00009H2C1.72386 6.00009 1.5 5.77623 1.5 5.50009C1.5 5.31565 1.59961 5.15388 1.75036 5.06668C1.98939 4.9284 2.07107 4.62254 1.9328 4.38351C1.79453 4.14448 1.48867 4.0628 1.24964 4.20107C0.802591 4.45967 0.5 4.94425 0.5 5.50009C0.5 6.32852 1.17157 7.00009 2 7.00009H2.03545C2.14342 7.75422 2.49192 8.43113 2.99997 8.94961L2.99997 10.1117C2.99994 10.1712 2.99992 10.2424 3.00504 10.305C3.01097 10.3776 3.02619 10.4816 3.08171 10.5906C3.15362 10.7317 3.26835 10.8465 3.40948 10.9184C3.51845 10.9739 3.62245 10.9891 3.69505 10.9951C3.7577 11.0002 3.82881 11.0001 3.88836 11.0001H4.86154C4.92109 11.0001 4.99224 11.0002 5.05488 10.9951C5.12749 10.9891 5.23149 10.9739 5.34046 10.9184C5.48158 10.8465 5.59632 10.7317 5.66822 10.5906C5.72375 10.4816 5.73897 10.3776 5.7449 10.305C5.75002 10.2424 5.75 10.1712 5.74997 10.1117L5.74997 10.0001H6.24998L6.24997 10.1115C6.24995 10.1711 6.24992 10.2422 6.25504 10.3048C6.26097 10.3775 6.2762 10.4815 6.33172 10.5904C6.40363 10.7315 6.51836 10.8463 6.65948 10.9182C6.76846 10.9737 6.87245 10.9889 6.94506 10.9949C7.0077 11 7.0788 11 7.13835 10.9999H8.11159C8.17113 11 8.24229 11 8.30493 10.9949C8.37753 10.9889 8.48153 10.9737 8.5905 10.9182C8.73162 10.8463 8.84636 10.7315 8.91827 10.5904C8.97379 10.4815 8.98901 10.3775 8.99494 10.3048C9.00006 10.2422 9.00004 10.1711 9.00001 10.1115L9.00001 9.66299C9.55312 9.40029 10.0258 8.99721 10.3726 8.49993L10.6116 8.49994C10.6711 8.49996 10.7423 8.49999 10.8049 8.49487C10.8775 8.48893 10.9815 8.47371 11.0905 8.41819C11.2316 8.34628 11.3464 8.23155 11.4183 8.09043C11.4738 7.98145 11.489 7.87746 11.4949 7.80485C11.5001 7.74221 11.5 7.67109 11.5 7.61154V5.88181C11.5 5.82509 11.5001 5.75735 11.4954 5.69761C11.49 5.62851 11.4763 5.5294 11.4257 5.42448C11.352 5.27143 11.2285 5.14794 11.0755 5.07422C10.9705 5.02369 10.8714 5.00992 10.8023 5.00454C10.7577 5.00106 10.7087 5.0002 10.6631 4.99999C10.4953 4.64662 10.2702 4.32616 10 4.05044L10 3.51615C10 3.43874 10.0001 3.35111 9.99335 3.27574C9.98593 3.19252 9.96656 3.06385 9.88754 2.93633C9.78902 2.77733 9.63465 2.66089 9.4547 2.60984C9.31038 2.56889 9.18134 2.58561 9.09929 2.60134C9.02497 2.61559 8.94073 2.63969 8.8663 2.66098L8.78839 2.68324C8.6859 2.71252 8.63465 2.72716 8.59861 2.75356C8.5638 2.77904 8.54252 2.80415 8.52309 2.84266C8.50297 2.88255 8.49603 2.94339 8.48215 3.06506C8.32585 4.43546 7.16224 5.5 5.75 5.5C4.81225 5.5 3.98413 5.03063 3.48775 4.314Z" fill="#444CE7"/>
+</svg>
diff --git a/app/components/datasets/documents/assets/star.svg b/app/components/datasets/documents/assets/star.svg
new file mode 100644
index 0000000..3ffda57
--- /dev/null
+++ b/app/components/datasets/documents/assets/star.svg
@@ -0,0 +1,11 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M6 0.5C6.27614 0.5 6.5 0.723858 6.5 1V2C6.5 2.27614 6.27614 2.5 6 2.5C5.72386 2.5 5.5 2.27614 5.5 2V1C5.5 0.723858 5.72386 0.5 6 0.5Z" fill="#FB6514"/>
+<path d="M2.81791 2.11092C2.62265 1.91566 2.30606 1.91566 2.1108 2.11092C1.91554 2.30619 1.91554 2.62277 2.1108 2.81803L2.81791 3.52514C3.01317 3.7204 3.32975 3.7204 3.52502 3.52514C3.72028 3.32988 3.72028 3.01329 3.52502 2.81803L2.81791 2.11092Z" fill="#FB6514"/>
+<path d="M0.5 6C0.5 5.72386 0.723858 5.5 1 5.5H2C2.27614 5.5 2.5 5.72386 2.5 6C2.5 6.27614 2.27614 6.5 2 6.5H1C0.723858 6.5 0.5 6.27614 0.5 6Z" fill="#FB6514"/>
+<path d="M10 5.5C9.72386 5.5 9.5 5.72386 9.5 6C9.5 6.27614 9.72386 6.5 10 6.5H11C11.2761 6.5 11.5 6.27614 11.5 6C11.5 5.72386 11.2761 5.5 11 5.5H10Z" fill="#FB6514"/>
+<path d="M9.18192 8.47482C8.98666 8.27955 8.67008 8.27955 8.47482 8.47482C8.27955 8.67008 8.27955 8.98666 8.47482 9.18192L9.18192 9.88903C9.37718 10.0843 9.69377 10.0843 9.88903 9.88903C10.0843 9.69377 10.0843 9.37718 9.88903 9.18192L9.18192 8.47482Z" fill="#FB6514"/>
+<path d="M9.88903 2.81803C10.0843 2.62277 10.0843 2.30619 9.88903 2.11092C9.69377 1.91566 9.37718 1.91566 9.18192 2.11092L8.47482 2.81803C8.27955 3.01329 8.27955 3.32988 8.47482 3.52514C8.67008 3.7204 8.98666 3.7204 9.18192 3.52514L9.88903 2.81803Z" fill="#FB6514"/>
+<path d="M6 9.5C6.27614 9.5 6.5 9.72386 6.5 10V11C6.5 11.2761 6.27614 11.5 6 11.5C5.72386 11.5 5.5 11.2761 5.5 11V10C5.5 9.72386 5.72386 9.5 6 9.5Z" fill="#FB6514"/>
+<path d="M3.52502 9.18192C3.72028 8.98666 3.72028 8.67008 3.52502 8.47482C3.32975 8.27955 3.01317 8.27955 2.81791 8.47482L2.1108 9.18192C1.91554 9.37718 1.91554 9.69377 2.1108 9.88903C2.30606 10.0843 2.62265 10.0843 2.81791 9.88903L3.52502 9.18192Z" fill="#FB6514"/>
+<path d="M6.44837 3.27869C6.36413 3.10804 6.19032 3 6.00001 3C5.8097 3 5.6359 3.10804 5.55166 3.27869L4.89538 4.60823L3.4277 4.82276C3.23942 4.85028 3.08308 4.98228 3.02439 5.16328C2.9657 5.34429 3.01484 5.54291 3.15115 5.67568L4.21275 6.70968L3.96221 8.17048C3.93004 8.35807 4.00716 8.54766 4.16115 8.65953C4.31514 8.77139 4.51928 8.78613 4.68774 8.69754L6.00001 8.00742L7.31229 8.69754C7.48075 8.78613 7.68489 8.77139 7.83888 8.65953C7.99287 8.54766 8.06999 8.35807 8.03782 8.17048L7.78728 6.70968L8.84888 5.67568C8.98519 5.54291 9.03433 5.34429 8.97564 5.16328C8.91695 4.98228 8.76061 4.85028 8.57233 4.82276L7.10465 4.60823L6.44837 3.27869Z" fill="#FB6514"/>
+</svg>
diff --git a/app/components/datasets/documents/assets/target.svg b/app/components/datasets/documents/assets/target.svg
new file mode 100644
index 0000000..cb74c9e
--- /dev/null
+++ b/app/components/datasets/documents/assets/target.svg
@@ -0,0 +1,10 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <g clip-path="url(#clip0_1745_6117)">
+      <path d="M7.99998 4V2.5L9.49998 1L9.99998 2L11 2.5L9.49998 4H7.99998ZM7.99998 4L5.99999 5.99997M11 6C11 8.76142 8.76142 11 6 11C3.23858 11 1 8.76142 1 6C1 3.23858 3.23858 1 6 1M8.5 6C8.5 7.38071 7.38071 8.5 6 8.5C4.61929 8.5 3.5 7.38071 3.5 6C3.5 4.61929 4.61929 3.5 6 3.5" stroke="#667085" stroke-linecap="round" stroke-linejoin="round" />
+    </g>
+    <defs>
+      <clipPath id="clip0_1745_6117">
+        <rect width="12" height="12" fill="white" />
+      </clipPath>
+    </defs>
+  </svg>
diff --git a/app/components/datasets/documents/assets/typeSquare.svg b/app/components/datasets/documents/assets/typeSquare.svg
new file mode 100644
index 0000000..d1588e8
--- /dev/null
+++ b/app/components/datasets/documents/assets/typeSquare.svg
@@ -0,0 +1,3 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M4 3.5H8M6 3.5V8.5M3.9 10.5H8.1C8.94008 10.5 9.36012 10.5 9.68099 10.3365C9.96323 10.1927 10.1927 9.96323 10.3365 9.68099C10.5 9.36012 10.5 8.94008 10.5 8.1V3.9C10.5 3.05992 10.5 2.63988 10.3365 2.31901C10.1927 2.03677 9.96323 1.8073 9.68099 1.66349C9.36012 1.5 8.94008 1.5 8.1 1.5H3.9C3.05992 1.5 2.63988 1.5 2.31901 1.66349C2.03677 1.8073 1.8073 2.03677 1.66349 2.31901C1.5 2.63988 1.5 3.05992 1.5 3.9V8.1C1.5 8.94008 1.5 9.36012 1.66349 9.68099C1.8073 9.96323 2.03677 10.1927 2.31901 10.3365C2.63988 10.5 3.05992 10.5 3.9 10.5Z" stroke="#667085" stroke-linecap="round" stroke-linejoin="round" />
+  </svg>
diff --git a/app/components/datasets/documents/detail/batch-modal/csv-downloader.tsx b/app/components/datasets/documents/detail/batch-modal/csv-downloader.tsx
new file mode 100644
index 0000000..90bdb70
--- /dev/null
+++ b/app/components/datasets/documents/detail/batch-modal/csv-downloader.tsx
@@ -0,0 +1,109 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import {
+  useCSVDownloader,
+} from 'react-papaparse'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { Download02 as DownloadIcon } from '@/app/components/base/icons/src/vender/solid/general'
+import { ChunkingMode } from '@/models/datasets'
+import I18n from '@/context/i18n'
+import { LanguagesSupported } from '@/i18n/language'
+
+const CSV_TEMPLATE_QA_EN = [
+  ['question', 'answer'],
+  ['question1', 'answer1'],
+  ['question2', 'answer2'],
+]
+const CSV_TEMPLATE_QA_CN = [
+  ['闂', '绛旀'],
+  ['闂 1', '绛旀 1'],
+  ['闂 2', '绛旀 2'],
+]
+const CSV_TEMPLATE_EN = [
+  ['segment content'],
+  ['content1'],
+  ['content2'],
+]
+const CSV_TEMPLATE_CN = [
+  ['鍒嗘鍐呭'],
+  ['鍐呭 1'],
+  ['鍐呭 2'],
+]
+
+const CSVDownload: FC<{ docForm: ChunkingMode }> = ({ docForm }) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const { CSVDownloader, Type } = useCSVDownloader()
+
+  const getTemplate = () => {
+    if (locale === LanguagesSupported[1]) {
+      if (docForm === ChunkingMode.qa)
+        return CSV_TEMPLATE_QA_CN
+      return CSV_TEMPLATE_CN
+    }
+    if (docForm === ChunkingMode.qa)
+      return CSV_TEMPLATE_QA_EN
+    return CSV_TEMPLATE_EN
+  }
+
+  return (
+    <div className='mt-6'>
+      <div className='text-sm font-medium text-gray-900'>{t('share.generation.csvStructureTitle')}</div>
+      <div className='mt-2 max-h-[500px] overflow-auto'>
+        {docForm === ChunkingMode.qa && (
+          <table className='w-full table-fixed border-separate border-spacing-0 rounded-lg border border-gray-200 text-xs'>
+            <thead className='text-gray-500'>
+              <tr>
+                <td className='h-9 border-b border-gray-200 pl-3 pr-2'>{t('datasetDocuments.list.batchModal.question')}</td>
+                <td className='h-9 border-b border-gray-200 pl-3 pr-2'>{t('datasetDocuments.list.batchModal.answer')}</td>
+              </tr>
+            </thead>
+            <tbody className='text-gray-700'>
+              <tr>
+                <td className='h-9 border-b border-gray-100 pl-3 pr-2 text-[13px]'>{t('datasetDocuments.list.batchModal.question')} 1</td>
+                <td className='h-9 border-b border-gray-100 pl-3 pr-2 text-[13px]'>{t('datasetDocuments.list.batchModal.answer')} 1</td>
+              </tr>
+              <tr>
+                <td className='h-9 pl-3 pr-2 text-[13px]'>{t('datasetDocuments.list.batchModal.question')} 2</td>
+                <td className='h-9 pl-3 pr-2 text-[13px]'>{t('datasetDocuments.list.batchModal.answer')} 2</td>
+              </tr>
+            </tbody>
+          </table>
+        )}
+        {docForm === ChunkingMode.text && (
+          <table className='w-full table-fixed border-separate border-spacing-0 rounded-lg border border-gray-200 text-xs'>
+            <thead className='text-gray-500'>
+              <tr>
+                <td className='h-9 border-b border-gray-200 pl-3 pr-2'>{t('datasetDocuments.list.batchModal.contentTitle')}</td>
+              </tr>
+            </thead>
+            <tbody className='text-gray-700'>
+              <tr>
+                <td className='h-9 border-b border-gray-100 pl-3 pr-2 text-[13px]'>{t('datasetDocuments.list.batchModal.content')} 1</td>
+              </tr>
+              <tr>
+                <td className='h-9 pl-3 pr-2 text-[13px]'>{t('datasetDocuments.list.batchModal.content')} 2</td>
+              </tr>
+            </tbody>
+          </table>
+        )}
+      </div>
+      <CSVDownloader
+        className="mt-2 block cursor-pointer"
+        type={Type.Link}
+        filename={'template'}
+        bom={true}
+        data={getTemplate()}
+      >
+        <div className='flex h-[18px] items-center space-x-1 text-xs font-medium text-text-accent'>
+          <DownloadIcon className='mr-1 h-3 w-3' />
+          {t('datasetDocuments.list.batchModal.template')}
+        </div>
+      </CSVDownloader>
+    </div>
+
+  )
+}
+export default React.memo(CSVDownload)
diff --git a/app/components/datasets/documents/detail/batch-modal/csv-uploader.tsx b/app/components/datasets/documents/detail/batch-modal/csv-uploader.tsx
new file mode 100644
index 0000000..471bf7b
--- /dev/null
+++ b/app/components/datasets/documents/detail/batch-modal/csv-uploader.tsx
@@ -0,0 +1,128 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useRef, useState } from 'react'
+import {
+  RiDeleteBinLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import cn from '@/utils/classnames'
+import { Csv as CSVIcon } from '@/app/components/base/icons/src/public/files'
+import { ToastContext } from '@/app/components/base/toast'
+import Button from '@/app/components/base/button'
+
+export type Props = {
+  file: File | undefined
+  updateFile: (file?: File) => void
+}
+
+const CSVUploader: FC<Props> = ({
+  file,
+  updateFile,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const [dragging, setDragging] = useState(false)
+  const dropRef = useRef<HTMLDivElement>(null)
+  const dragRef = useRef<HTMLDivElement>(null)
+  const fileUploader = useRef<HTMLInputElement>(null)
+
+  const handleDragEnter = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+    e.target !== dragRef.current && setDragging(true)
+  }
+  const handleDragOver = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+  }
+  const handleDragLeave = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+    e.target === dragRef.current && setDragging(false)
+  }
+  const handleDrop = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+    setDragging(false)
+    if (!e.dataTransfer)
+      return
+    const files = [...e.dataTransfer.files]
+    if (files.length > 1) {
+      notify({ type: 'error', message: t('datasetCreation.stepOne.uploader.validation.count') })
+      return
+    }
+    updateFile(files[0])
+  }
+  const selectHandle = () => {
+    if (fileUploader.current)
+      fileUploader.current.click()
+  }
+  const removeFile = () => {
+    if (fileUploader.current)
+      fileUploader.current.value = ''
+    updateFile()
+  }
+  const fileChangeHandle = (e: React.ChangeEvent<HTMLInputElement>) => {
+    const currentFile = e.target.files?.[0]
+    updateFile(currentFile)
+  }
+
+  useEffect(() => {
+    dropRef.current?.addEventListener('dragenter', handleDragEnter)
+    dropRef.current?.addEventListener('dragover', handleDragOver)
+    dropRef.current?.addEventListener('dragleave', handleDragLeave)
+    dropRef.current?.addEventListener('drop', handleDrop)
+    return () => {
+      dropRef.current?.removeEventListener('dragenter', handleDragEnter)
+      dropRef.current?.removeEventListener('dragover', handleDragOver)
+      dropRef.current?.removeEventListener('dragleave', handleDragLeave)
+      dropRef.current?.removeEventListener('drop', handleDrop)
+    }
+  }, [])
+
+  return (
+    <div className='mt-6'>
+      <input
+        ref={fileUploader}
+        style={{ display: 'none' }}
+        type="file"
+        id="fileUploader"
+        accept='.csv'
+        onChange={fileChangeHandle}
+      />
+      <div ref={dropRef}>
+        {!file && (
+          <div className={cn('flex h-20 items-center rounded-xl border border-dashed border-gray-200 bg-gray-50 text-sm font-normal', dragging && 'border border-[#B2CCFF] bg-[#F5F8FF]')}>
+            <div className='flex w-full items-center justify-center space-x-2'>
+              <CSVIcon className="shrink-0" />
+              <div className='text-gray-500'>
+                {t('datasetDocuments.list.batchModal.csvUploadTitle')}
+                <span className='cursor-pointer text-primary-400' onClick={selectHandle}>{t('datasetDocuments.list.batchModal.browse')}</span>
+              </div>
+            </div>
+            {dragging && <div ref={dragRef} className='absolute left-0 top-0 h-full w-full' />}
+          </div>
+        )}
+        {file && (
+          <div className={cn('group flex h-20 items-center rounded-xl border border-gray-200 bg-gray-50 px-6 text-sm font-normal', 'hover:border-[#B2CCFF] hover:bg-[#F5F8FF]')}>
+            <CSVIcon className="shrink-0" />
+            <div className='ml-2 flex w-0 grow'>
+              <span className='max-w-[calc(100%_-_30px)] overflow-hidden text-ellipsis whitespace-nowrap text-gray-800'>{file.name.replace(/.csv$/, '')}</span>
+              <span className='shrink-0 text-gray-500'>.csv</span>
+            </div>
+            <div className='hidden items-center group-hover:flex'>
+              <Button onClick={selectHandle}>{t('datasetCreation.stepOne.uploader.change')}</Button>
+              <div className='mx-2 h-4 w-px bg-gray-200' />
+              <div className='cursor-pointer p-2' onClick={removeFile}>
+                <RiDeleteBinLine className='h-4 w-4 text-gray-500' />
+              </div>
+            </div>
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(CSVUploader)
diff --git a/app/components/datasets/documents/detail/batch-modal/index.tsx b/app/components/datasets/documents/detail/batch-modal/index.tsx
new file mode 100644
index 0000000..775d755
--- /dev/null
+++ b/app/components/datasets/documents/detail/batch-modal/index.tsx
@@ -0,0 +1,66 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import CSVUploader from './csv-uploader'
+import CSVDownloader from './csv-downloader'
+import Button from '@/app/components/base/button'
+import Modal from '@/app/components/base/modal'
+import type { ChunkingMode } from '@/models/datasets'
+import { noop } from 'lodash-es'
+
+export type IBatchModalProps = {
+  isShow: boolean
+  docForm: ChunkingMode
+  onCancel: () => void
+  onConfirm: (file: File) => void
+}
+
+const BatchModal: FC<IBatchModalProps> = ({
+  isShow,
+  docForm,
+  onCancel,
+  onConfirm,
+}) => {
+  const { t } = useTranslation()
+  const [currentCSV, setCurrentCSV] = useState<File>()
+  const handleFile = (file?: File) => setCurrentCSV(file)
+
+  const handleSend = () => {
+    if (!currentCSV)
+      return
+    onCancel()
+    onConfirm(currentCSV)
+  }
+
+  useEffect(() => {
+    if (!isShow)
+      setCurrentCSV(undefined)
+  }, [isShow])
+
+  return (
+    <Modal isShow={isShow} onClose={noop} className='!max-w-[520px] !rounded-xl px-8 py-6'>
+      <div className='relative pb-1 text-xl font-medium leading-[30px] text-gray-900'>{t('datasetDocuments.list.batchModal.title')}</div>
+      <div className='absolute right-4 top-4 cursor-pointer p-2' onClick={onCancel}>
+        <RiCloseLine className='h-4 w-4 text-gray-500' />
+      </div>
+      <CSVUploader
+        file={currentCSV}
+        updateFile={handleFile}
+      />
+      <CSVDownloader
+        docForm={docForm}
+      />
+      <div className='mt-[28px] flex justify-end pt-6'>
+        <Button className='mr-2' onClick={onCancel}>
+          {t('datasetDocuments.list.batchModal.cancel')}
+        </Button>
+        <Button variant="primary" onClick={handleSend} disabled={!currentCSV}>
+          {t('datasetDocuments.list.batchModal.run')}
+        </Button>
+      </div>
+    </Modal>
+  )
+}
+export default React.memo(BatchModal)
diff --git a/app/components/datasets/documents/detail/completed/child-segment-detail.tsx b/app/components/datasets/documents/detail/completed/child-segment-detail.tsx
new file mode 100644
index 0000000..81afed9
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/child-segment-detail.tsx
@@ -0,0 +1,134 @@
+import React, { type FC, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiCloseLine,
+  RiCollapseDiagonalLine,
+  RiExpandDiagonalLine,
+} from '@remixicon/react'
+import ActionButtons from './common/action-buttons'
+import ChunkContent from './common/chunk-content'
+import Dot from './common/dot'
+import { SegmentIndexTag } from './common/segment-index-tag'
+import { useSegmentListContext } from './index'
+import type { ChildChunkDetail, ChunkingMode } from '@/models/datasets'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { formatNumber } from '@/utils/format'
+import classNames from '@/utils/classnames'
+import Divider from '@/app/components/base/divider'
+import { formatTime } from '@/utils/time'
+
+type IChildSegmentDetailProps = {
+  chunkId: string
+  childChunkInfo?: Partial<ChildChunkDetail> & { id: string }
+  onUpdate: (segmentId: string, childChunkId: string, content: string) => void
+  onCancel: () => void
+  docForm: ChunkingMode
+}
+
+/**
+ * Show all the contents of the segment
+ */
+const ChildSegmentDetail: FC<IChildSegmentDetailProps> = ({
+  chunkId,
+  childChunkInfo,
+  onUpdate,
+  onCancel,
+  docForm,
+}) => {
+  const { t } = useTranslation()
+  const [content, setContent] = useState(childChunkInfo?.content || '')
+  const { eventEmitter } = useEventEmitterContextContext()
+  const [loading, setLoading] = useState(false)
+  const fullScreen = useSegmentListContext(s => s.fullScreen)
+  const toggleFullScreen = useSegmentListContext(s => s.toggleFullScreen)
+
+  eventEmitter?.useSubscription((v) => {
+    if (v === 'update-child-segment')
+      setLoading(true)
+    if (v === 'update-child-segment-done')
+      setLoading(false)
+  })
+
+  const handleCancel = () => {
+    onCancel()
+  }
+
+  const handleSave = () => {
+    onUpdate(chunkId, childChunkInfo?.id || '', content)
+  }
+
+  const wordCountText = useMemo(() => {
+    const count = content.length
+    return `${formatNumber(count)} ${t('datasetDocuments.segment.characters', { count })}`
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [content.length])
+
+  const EditTimeText = useMemo(() => {
+    const timeText = formatTime({
+      date: (childChunkInfo?.updated_at ?? 0) * 1000,
+      dateFormat: 'MM/DD/YYYY h:mm:ss',
+    })
+    return `${t('datasetDocuments.segment.editedAt')} ${timeText}`
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [childChunkInfo?.updated_at])
+
+  return (
+    <div className={'flex h-full flex-col'}>
+      <div className={classNames('flex items-center justify-between', fullScreen ? 'py-3 pr-4 pl-6 border border-divider-subtle' : 'pt-3 pr-3 pl-4')}>
+        <div className='flex flex-col'>
+          <div className='system-xl-semibold text-text-primary'>{t('datasetDocuments.segment.editChildChunk')}</div>
+          <div className='flex items-center gap-x-2'>
+            <SegmentIndexTag positionId={childChunkInfo?.position || ''} labelPrefix={t('datasetDocuments.segment.childChunk') as string} />
+            <Dot />
+            <span className='system-xs-medium text-text-tertiary'>{wordCountText}</span>
+            <Dot />
+            <span className='system-xs-medium text-text-tertiary'>
+              {EditTimeText}
+            </span>
+          </div>
+        </div>
+        <div className='flex items-center'>
+          {fullScreen && (
+            <>
+              <ActionButtons
+                handleCancel={handleCancel}
+                handleSave={handleSave}
+                loading={loading}
+                isChildChunk={true}
+              />
+              <Divider type='vertical' className='ml-4 mr-2 h-3.5 bg-divider-regular' />
+            </>
+          )}
+          <div className='mr-1 flex h-8 w-8 cursor-pointer items-center justify-center p-1.5' onClick={toggleFullScreen}>
+            {fullScreen ? <RiCollapseDiagonalLine className='h-4 w-4 text-text-tertiary' /> : <RiExpandDiagonalLine className='h-4 w-4 text-text-tertiary' />}
+          </div>
+          <div className='flex h-8 w-8 cursor-pointer items-center justify-center p-1.5' onClick={onCancel}>
+            <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+        </div>
+      </div>
+      <div className={classNames('flex grow w-full', fullScreen ? 'flex-row justify-center px-6 pt-6' : 'py-3 px-4')}>
+        <div className={classNames('break-all overflow-hidden whitespace-pre-line h-full', fullScreen ? 'w-1/2' : 'w-full')}>
+          <ChunkContent
+            docForm={docForm}
+            question={content}
+            onQuestionChange={content => setContent(content)}
+            isEditMode={true}
+          />
+        </div>
+      </div>
+      {!fullScreen && (
+        <div className='flex items-center justify-end border-t-[1px] border-t-divider-subtle p-4 pt-3'>
+          <ActionButtons
+            handleCancel={handleCancel}
+            handleSave={handleSave}
+            loading={loading}
+            isChildChunk={true}
+          />
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default React.memo(ChildSegmentDetail)
diff --git a/app/components/datasets/documents/detail/completed/child-segment-list.tsx b/app/components/datasets/documents/detail/completed/child-segment-list.tsx
new file mode 100644
index 0000000..be5fc8b
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/child-segment-list.tsx
@@ -0,0 +1,195 @@
+import { type FC, useMemo, useState } from 'react'
+import { RiArrowDownSLine, RiArrowRightSLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { EditSlice } from '../../../formatted-text/flavours/edit-slice'
+import { useDocumentContext } from '../index'
+import { FormattedText } from '../../../formatted-text/formatted'
+import Empty from './common/empty'
+import FullDocListSkeleton from './skeleton/full-doc-list-skeleton'
+import { useSegmentListContext } from './index'
+import type { ChildChunkDetail } from '@/models/datasets'
+import Input from '@/app/components/base/input'
+import classNames from '@/utils/classnames'
+import Divider from '@/app/components/base/divider'
+import { formatNumber } from '@/utils/format'
+
+type IChildSegmentCardProps = {
+  childChunks: ChildChunkDetail[]
+  parentChunkId: string
+  handleInputChange?: (value: string) => void
+  handleAddNewChildChunk?: (parentChunkId: string) => void
+  enabled: boolean
+  onDelete?: (segId: string, childChunkId: string) => Promise<void>
+  onClickSlice?: (childChunk: ChildChunkDetail) => void
+  total?: number
+  inputValue?: string
+  onClearFilter?: () => void
+  isLoading?: boolean
+  focused?: boolean
+}
+
+const ChildSegmentList: FC<IChildSegmentCardProps> = ({
+  childChunks,
+  parentChunkId,
+  handleInputChange,
+  handleAddNewChildChunk,
+  enabled,
+  onDelete,
+  onClickSlice,
+  total,
+  inputValue,
+  onClearFilter,
+  isLoading,
+  focused = false,
+}) => {
+  const { t } = useTranslation()
+  const parentMode = useDocumentContext(s => s.parentMode)
+  const currChildChunk = useSegmentListContext(s => s.currChildChunk)
+
+  const [collapsed, setCollapsed] = useState(true)
+
+  const toggleCollapse = () => {
+    setCollapsed(!collapsed)
+  }
+
+  const isParagraphMode = useMemo(() => {
+    return parentMode === 'paragraph'
+  }, [parentMode])
+
+  const isFullDocMode = useMemo(() => {
+    return parentMode === 'full-doc'
+  }, [parentMode])
+
+  const contentOpacity = useMemo(() => {
+    return (enabled || focused) ? '' : 'opacity-50 group-hover/card:opacity-100'
+  }, [enabled, focused])
+
+  const totalText = useMemo(() => {
+    const isSearch = inputValue !== '' && isFullDocMode
+    if (!isSearch) {
+      const text = isFullDocMode
+        ? !total
+          ? '--'
+          : formatNumber(total)
+        : formatNumber(childChunks.length)
+      const count = isFullDocMode
+        ? text === '--'
+          ? 0
+          : total
+        : childChunks.length
+      return `${text} ${t('datasetDocuments.segment.childChunks', { count })}`
+    }
+    else {
+      const text = !total ? '--' : formatNumber(total)
+      const count = text === '--' ? 0 : total
+      return `${count} ${t('datasetDocuments.segment.searchResults', { count })}`
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isFullDocMode, total, childChunks.length, inputValue])
+
+  return (
+    <div className={classNames(
+      'flex flex-col',
+      contentOpacity,
+      isParagraphMode ? 'pt-1 pb-2' : 'px-3 grow',
+      (isFullDocMode && isLoading) && 'overflow-y-hidden',
+    )}>
+      {isFullDocMode ? <Divider type='horizontal' className='my-1 h-[1px] bg-divider-subtle' /> : null}
+      <div className={classNames('flex items-center justify-between', isFullDocMode ? 'pt-2 pb-3 sticky -top-2 left-0 bg-background-default' : '')}>
+        <div className={classNames(
+          'h-7 flex items-center pl-1 pr-3 rounded-lg',
+          isParagraphMode && 'cursor-pointer',
+          (isParagraphMode && collapsed) && 'bg-dataset-child-chunk-expand-btn-bg',
+          isFullDocMode && 'pl-0',
+        )}
+        onClick={(event) => {
+          event.stopPropagation()
+          toggleCollapse()
+        }}
+        >
+          {
+            isParagraphMode
+              ? collapsed
+                ? (
+                  <RiArrowRightSLine className='mr-0.5 h-4 w-4 text-text-secondary opacity-50' />
+                )
+                : (<RiArrowDownSLine className='mr-0.5 h-4 w-4 text-text-secondary' />)
+              : null
+          }
+          <span className='system-sm-semibold-uppercase text-text-secondary'>{totalText}</span>
+          <span className={classNames('text-text-quaternary text-xs font-medium pl-1.5', isParagraphMode ? 'hidden group-hover/card:inline-block' : '')}>路</span>
+          <button
+            type='button'
+            className={classNames(
+              'px-1.5 py-1 text-components-button-secondary-accent-text system-xs-semibold-uppercase',
+              isParagraphMode ? 'hidden group-hover/card:inline-block' : '',
+              (isFullDocMode && isLoading) ? 'text-components-button-secondary-accent-text-disabled' : '',
+            )}
+            onClick={(event) => {
+              event.stopPropagation()
+              handleAddNewChildChunk?.(parentChunkId)
+            }}
+            disabled={isLoading}
+          >
+            {t('common.operation.add')}
+          </button>
+        </div>
+        {isFullDocMode
+          ? <Input
+            showLeftIcon
+            showClearIcon
+            wrapperClassName='!w-52'
+            value={inputValue}
+            onChange={e => handleInputChange?.(e.target.value)}
+            onClear={() => handleInputChange?.('')}
+          />
+          : null}
+      </div>
+      {isLoading ? <FullDocListSkeleton /> : null}
+      {((isFullDocMode && !isLoading) || !collapsed)
+        ? <div className={classNames('flex gap-x-0.5', isFullDocMode ? 'grow mb-6' : 'items-center')}>
+          {isParagraphMode && (
+            <div className='self-stretch'>
+              <Divider type='vertical' className='mx-[7px] w-[2px] bg-text-accent-secondary' />
+            </div>
+          )}
+          {childChunks.length > 0
+            ? <FormattedText className={classNames('w-full !leading-6 flex flex-col', isParagraphMode ? 'gap-y-2' : 'gap-y-3')}>
+              {childChunks.map((childChunk) => {
+                const edited = childChunk.updated_at !== childChunk.created_at
+                const focused = currChildChunk?.childChunkInfo?.id === childChunk.id
+                return <EditSlice
+                  key={childChunk.id}
+                  label={`C-${childChunk.position}${edited ? ` 路 ${t('datasetDocuments.segment.edited')}` : ''}`}
+                  text={childChunk.content}
+                  onDelete={() => onDelete?.(childChunk.segment_id, childChunk.id)}
+                  labelClassName={focused ? 'bg-state-accent-solid text-text-primary-on-surface' : ''}
+                  labelInnerClassName={'text-[10px] font-semibold align-bottom leading-6'}
+                  contentClassName={classNames('!leading-6', focused ? 'bg-state-accent-hover-alt text-text-primary' : 'text-text-secondary')}
+                  showDivider={false}
+                  onClick={(e) => {
+                    e.stopPropagation()
+                    onClickSlice?.(childChunk)
+                  }}
+                  offsetOptions={({ rects }) => {
+                    return {
+                      mainAxis: isFullDocMode ? -rects.floating.width : 12 - rects.floating.width,
+                      crossAxis: (20 - rects.floating.height) / 2,
+                    }
+                  }}
+                />
+              })}
+            </FormattedText>
+            : inputValue !== ''
+              ? <div className='h-full w-full'>
+                <Empty onClearFilter={onClearFilter!} />
+              </div>
+              : null
+          }
+        </div>
+        : null}
+    </div>
+  )
+}
+
+export default ChildSegmentList
diff --git a/app/components/datasets/documents/detail/completed/common/action-buttons.tsx b/app/components/datasets/documents/detail/completed/common/action-buttons.tsx
new file mode 100644
index 0000000..fd0a072
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/common/action-buttons.tsx
@@ -0,0 +1,86 @@
+import React, { type FC, useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useKeyPress } from 'ahooks'
+import { useDocumentContext } from '../../index'
+import Button from '@/app/components/base/button'
+import { getKeyboardKeyCodeBySystem, getKeyboardKeyNameBySystem } from '@/app/components/workflow/utils'
+
+type IActionButtonsProps = {
+  handleCancel: () => void
+  handleSave: () => void
+  loading: boolean
+  actionType?: 'edit' | 'add'
+  handleRegeneration?: () => void
+  isChildChunk?: boolean
+}
+
+const ActionButtons: FC<IActionButtonsProps> = ({
+  handleCancel,
+  handleSave,
+  loading,
+  actionType = 'edit',
+  handleRegeneration,
+  isChildChunk = false,
+}) => {
+  const { t } = useTranslation()
+  const mode = useDocumentContext(s => s.mode)
+  const parentMode = useDocumentContext(s => s.parentMode)
+
+  useKeyPress(['esc'], (e) => {
+    e.preventDefault()
+    handleCancel()
+  })
+
+  useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.s`, (e) => {
+    e.preventDefault()
+    if (loading)
+      return
+    handleSave()
+  },
+  { exactMatch: true, useCapture: true })
+
+  const isParentChildParagraphMode = useMemo(() => {
+    return mode === 'hierarchical' && parentMode === 'paragraph'
+  }, [mode, parentMode])
+
+  return (
+    <div className='flex items-center gap-x-2'>
+      <Button
+        onClick={handleCancel}
+      >
+        <div className='flex items-center gap-x-1'>
+          <span className='system-sm-medium text-components-button-secondary-text'>{t('common.operation.cancel')}</span>
+          <span className='system-kbd rounded-[4px] bg-components-kbd-bg-gray px-[1px] text-text-tertiary'>ESC</span>
+        </div>
+      </Button>
+      {(isParentChildParagraphMode && actionType === 'edit' && !isChildChunk)
+        ? <Button
+          onClick={handleRegeneration}
+          disabled={loading}
+        >
+          <span className='system-sm-medium text-components-button-secondary-text'>
+            {t('common.operation.saveAndRegenerate')}
+          </span>
+        </Button>
+        : null
+      }
+      <Button
+        variant='primary'
+        onClick={handleSave}
+        disabled={loading}
+      >
+        <div className='flex items-center gap-x-1'>
+          <span className='text-components-button-primary-text'>{t('common.operation.save')}</span>
+          <div className='flex items-center gap-x-0.5'>
+            <span className='system-kbd h-4 w-4 rounded-[4px] bg-components-kbd-bg-white capitalize text-text-primary-on-surface'>{getKeyboardKeyNameBySystem('ctrl')}</span>
+            <span className='system-kbd h-4 w-4 rounded-[4px] bg-components-kbd-bg-white text-text-primary-on-surface'>S</span>
+          </div>
+        </div>
+      </Button>
+    </div>
+  )
+}
+
+ActionButtons.displayName = 'ActionButtons'
+
+export default React.memo(ActionButtons)
diff --git a/app/components/datasets/documents/detail/completed/common/add-another.tsx b/app/components/datasets/documents/detail/completed/common/add-another.tsx
new file mode 100644
index 0000000..c504faa
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/common/add-another.tsx
@@ -0,0 +1,32 @@
+import React, { type FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import classNames from '@/utils/classnames'
+import Checkbox from '@/app/components/base/checkbox'
+
+type AddAnotherProps = {
+  className?: string
+  isChecked: boolean
+  onCheck: () => void
+}
+
+const AddAnother: FC<AddAnotherProps> = ({
+  className,
+  isChecked,
+  onCheck,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className={classNames('flex items-center gap-x-1 pl-1', className)}>
+      <Checkbox
+        key='add-another-checkbox'
+        className='shrink-0'
+        checked={isChecked}
+        onCheck={onCheck}
+      />
+      <span className='system-xs-medium text-text-tertiary'>{t('datasetDocuments.segment.addAnother')}</span>
+    </div>
+  )
+}
+
+export default React.memo(AddAnother)
diff --git a/app/components/datasets/documents/detail/completed/common/batch-action.tsx b/app/components/datasets/documents/detail/completed/common/batch-action.tsx
new file mode 100644
index 0000000..78dda7b
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/common/batch-action.tsx
@@ -0,0 +1,114 @@
+import React, { type FC } from 'react'
+import { RiArchive2Line, RiCheckboxCircleLine, RiCloseCircleLine, RiDeleteBinLine, RiDraftLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import Divider from '@/app/components/base/divider'
+import classNames from '@/utils/classnames'
+import Confirm from '@/app/components/base/confirm'
+
+const i18nPrefix = 'dataset.batchAction'
+type IBatchActionProps = {
+  className?: string
+  selectedIds: string[]
+  onBatchEnable: () => void
+  onBatchDisable: () => void
+  onBatchDelete: () => Promise<void>
+  onArchive?: () => void
+  onEditMetadata?: () => void
+  onCancel: () => void
+}
+
+const BatchAction: FC<IBatchActionProps> = ({
+  className,
+  selectedIds,
+  onBatchEnable,
+  onBatchDisable,
+  onArchive,
+  onBatchDelete,
+  onEditMetadata,
+  onCancel,
+}) => {
+  const { t } = useTranslation()
+  const [isShowDeleteConfirm, {
+    setTrue: showDeleteConfirm,
+    setFalse: hideDeleteConfirm,
+  }] = useBoolean(false)
+  const [isDeleting, {
+    setTrue: setIsDeleting,
+  }] = useBoolean(false)
+
+  const handleBatchDelete = async () => {
+    setIsDeleting()
+    await onBatchDelete()
+    hideDeleteConfirm()
+  }
+  return (
+    <div className={classNames('w-full flex justify-center gap-x-2', className)}>
+      <div className='flex items-center gap-x-1 rounded-[10px] border border-components-actionbar-border-accent bg-components-actionbar-bg-accent p-1 shadow-xl shadow-shadow-shadow-5 backdrop-blur-[5px]'>
+        <div className='inline-flex items-center gap-x-2 py-1 pl-2 pr-3'>
+          <span className='flex h-5 w-5 items-center justify-center rounded-md bg-text-accent px-1 py-0.5 text-xs font-medium text-text-primary-on-surface'>
+            {selectedIds.length}
+          </span>
+          <span className='text-[13px] font-semibold leading-[16px] text-text-accent'>{t(`${i18nPrefix}.selected`)}</span>
+        </div>
+        <Divider type='vertical' className='mx-0.5 h-3.5 bg-divider-regular' />
+        <div className='flex items-center gap-x-0.5 px-3 py-2'>
+          <RiCheckboxCircleLine className='h-4 w-4 text-components-button-ghost-text' />
+          <button type='button' className='px-0.5 text-[13px] font-medium leading-[16px] text-components-button-ghost-text' onClick={onBatchEnable}>
+            {t(`${i18nPrefix}.enable`)}
+          </button>
+        </div>
+        <div className='flex items-center gap-x-0.5 px-3 py-2'>
+          <RiCloseCircleLine className='h-4 w-4 text-components-button-ghost-text' />
+          <button type='button' className='px-0.5 text-[13px] font-medium leading-[16px] text-components-button-ghost-text' onClick={onBatchDisable}>
+            {t(`${i18nPrefix}.disable`)}
+          </button>
+        </div>
+        {onEditMetadata && (
+          <div className='flex items-center gap-x-0.5 px-3 py-2'>
+            <RiDraftLine className='h-4 w-4 text-components-button-ghost-text' />
+            <button type='button' className='px-0.5 text-[13px] font-medium leading-[16px] text-components-button-ghost-text' onClick={onEditMetadata}>
+              {t('dataset.metadata.metadata')}
+            </button>
+          </div>
+        )}
+
+        {onArchive && (
+          <div className='flex items-center gap-x-0.5 px-3 py-2'>
+            <RiArchive2Line className='h-4 w-4 text-components-button-ghost-text' />
+            <button type='button' className='px-0.5 text-[13px] font-medium leading-[16px] text-components-button-ghost-text' onClick={onArchive}>
+              {t(`${i18nPrefix}.archive`)}
+            </button>
+          </div>
+        )}
+        <div className='flex items-center gap-x-0.5 px-3 py-2'>
+          <RiDeleteBinLine className='h-4 w-4 text-components-button-destructive-ghost-text' />
+          <button type='button' className='px-0.5 text-[13px] font-medium leading-[16px] text-components-button-destructive-ghost-text' onClick={showDeleteConfirm}>
+            {t(`${i18nPrefix}.delete`)}
+          </button>
+        </div>
+
+        <Divider type='vertical' className='mx-0.5 h-3.5 bg-divider-regular' />
+        <button type='button' className='px-3.5 py-2 text-[13px] font-medium leading-[16px] text-components-button-ghost-text' onClick={onCancel}>
+          {t(`${i18nPrefix}.cancel`)}
+        </button>
+      </div>
+      {
+        isShowDeleteConfirm && (
+          <Confirm
+            isShow
+            title={t('datasetDocuments.list.delete.title')}
+            content={t('datasetDocuments.list.delete.content')}
+            confirmText={t('common.operation.sure')}
+            onConfirm={handleBatchDelete}
+            onCancel={hideDeleteConfirm}
+            isLoading={isDeleting}
+            isDisabled={isDeleting}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default React.memo(BatchAction)
diff --git a/app/components/datasets/documents/detail/completed/common/chunk-content.tsx b/app/components/datasets/documents/detail/completed/common/chunk-content.tsx
new file mode 100644
index 0000000..2f20549
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/common/chunk-content.tsx
@@ -0,0 +1,203 @@
+import React, { useEffect, useRef, useState } from 'react'
+import type { ComponentProps, FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { ChunkingMode } from '@/models/datasets'
+import classNames from '@/utils/classnames'
+import { Markdown } from '@/app/components/base/markdown'
+
+type IContentProps = ComponentProps<'textarea'>
+
+const Textarea: FC<IContentProps> = React.memo(({
+  value,
+  placeholder,
+  className,
+  disabled,
+  ...rest
+}) => {
+  return (
+    <textarea
+      className={classNames(
+        'bg-transparent inset-0 outline-none border-none appearance-none resize-none w-full overflow-y-auto',
+        className,
+      )}
+      placeholder={placeholder}
+      value={value}
+      disabled={disabled}
+      {...rest}
+    />
+  )
+})
+
+Textarea.displayName = 'Textarea'
+
+type IAutoResizeTextAreaProps = ComponentProps<'textarea'> & {
+  containerRef: React.RefObject<HTMLDivElement>
+  labelRef: React.RefObject<HTMLDivElement>
+}
+
+const AutoResizeTextArea: FC<IAutoResizeTextAreaProps> = React.memo(({
+  className,
+  placeholder,
+  value,
+  disabled,
+  containerRef,
+  labelRef,
+  ...rest
+}) => {
+  const textareaRef = useRef<HTMLTextAreaElement>(null)
+  const observerRef = useRef<ResizeObserver>()
+  const [maxHeight, setMaxHeight] = useState(0)
+
+  useEffect(() => {
+    const textarea = textareaRef.current
+    if (!textarea)
+      return
+    textarea.style.height = 'auto'
+    const lineHeight = Number.parseInt(getComputedStyle(textarea).lineHeight)
+    const textareaHeight = Math.max(textarea.scrollHeight, lineHeight)
+    textarea.style.height = `${textareaHeight}px`
+  }, [value])
+
+  useEffect(() => {
+    const container = containerRef.current
+    const label = labelRef.current
+    if (!container || !label)
+      return
+    const updateMaxHeight = () => {
+      const containerHeight = container.clientHeight
+      const labelHeight = label.clientHeight
+      const padding = 32
+      const space = 12
+      const maxHeight = Math.floor((containerHeight - 2 * labelHeight - padding - space) / 2)
+      setMaxHeight(maxHeight)
+    }
+    updateMaxHeight()
+    observerRef.current = new ResizeObserver(updateMaxHeight)
+    observerRef.current.observe(container)
+    return () => {
+      observerRef.current?.disconnect()
+    }
+  }, [])
+
+  return (
+    <textarea
+      ref={textareaRef}
+      className={classNames(
+        'bg-transparent inset-0 outline-none border-none appearance-none resize-none w-full',
+        className,
+      )}
+      style={{
+        maxHeight,
+      }}
+      placeholder={placeholder}
+      value={value}
+      disabled={disabled}
+      {...rest}
+    />
+  )
+})
+
+AutoResizeTextArea.displayName = 'AutoResizeTextArea'
+
+type IQATextAreaProps = {
+  question: string
+  answer?: string
+  onQuestionChange: (question: string) => void
+  onAnswerChange?: (answer: string) => void
+  isEditMode?: boolean
+}
+
+const QATextArea: FC<IQATextAreaProps> = React.memo(({
+  question,
+  answer,
+  onQuestionChange,
+  onAnswerChange,
+  isEditMode = true,
+}) => {
+  const { t } = useTranslation()
+  const containerRef = useRef<HTMLDivElement>(null)
+  const labelRef = useRef<HTMLDivElement>(null)
+
+  return (
+    <div ref={containerRef} className='h-full overflow-hidden'>
+      <div ref={labelRef} className='mb-1 text-xs font-medium text-text-tertiary'>QUESTION</div>
+      <AutoResizeTextArea
+        className='text-sm tracking-[-0.07px] text-text-secondary caret-[#295EFF]'
+        value={question}
+        placeholder={t('datasetDocuments.segment.questionPlaceholder') || ''}
+        onChange={e => onQuestionChange(e.target.value)}
+        disabled={!isEditMode}
+        containerRef={containerRef}
+        labelRef={labelRef}
+      />
+      <div className='mb-1 mt-6 text-xs font-medium text-text-tertiary'>ANSWER</div>
+      <AutoResizeTextArea
+        className='text-sm tracking-[-0.07px] text-text-secondary caret-[#295EFF]'
+        value={answer}
+        placeholder={t('datasetDocuments.segment.answerPlaceholder') || ''}
+        onChange={e => onAnswerChange?.(e.target.value)}
+        disabled={!isEditMode}
+        autoFocus
+        containerRef={containerRef}
+        labelRef={labelRef}
+      />
+    </div>
+  )
+})
+
+QATextArea.displayName = 'QATextArea'
+
+type IChunkContentProps = {
+  question: string
+  answer?: string
+  onQuestionChange: (question: string) => void
+  onAnswerChange?: (answer: string) => void
+  isEditMode?: boolean
+  docForm: ChunkingMode
+}
+
+const ChunkContent: FC<IChunkContentProps> = ({
+  question,
+  answer,
+  onQuestionChange,
+  onAnswerChange,
+  isEditMode,
+  docForm,
+}) => {
+  const { t } = useTranslation()
+
+  if (docForm === ChunkingMode.qa) {
+    return <QATextArea
+      question={question}
+      answer={answer}
+      onQuestionChange={onQuestionChange}
+      onAnswerChange={onAnswerChange}
+      isEditMode={isEditMode}
+    />
+  }
+
+  if (!isEditMode) {
+    return (
+      <Markdown
+        className='h-full w-full !text-text-secondary'
+        content={question}
+        customDisallowedElements={['input']}
+      />
+    )
+  }
+
+  return (
+    <Textarea
+      className='body-md-regular h-full w-full pb-6 tracking-[-0.07px] text-text-secondary caret-[#295EFF]'
+      value={question}
+      placeholder={t('datasetDocuments.segment.contentPlaceholder') || ''}
+      onChange={e => onQuestionChange(e.target.value)}
+      disabled={!isEditMode}
+      autoFocus
+    />
+  )
+}
+
+ChunkContent.displayName = 'ChunkContent'
+
+export default React.memo(ChunkContent)
diff --git a/app/components/datasets/documents/detail/completed/common/dot.tsx b/app/components/datasets/documents/detail/completed/common/dot.tsx
new file mode 100644
index 0000000..2c70f6f
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/common/dot.tsx
@@ -0,0 +1,11 @@
+import React from 'react'
+
+const Dot = () => {
+  return (
+    <div className='system-xs-medium text-text-quaternary'>路</div>
+  )
+}
+
+Dot.displayName = 'Dot'
+
+export default React.memo(Dot)
diff --git a/app/components/datasets/documents/detail/completed/common/empty.tsx b/app/components/datasets/documents/detail/completed/common/empty.tsx
new file mode 100644
index 0000000..eef2aa9
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/common/empty.tsx
@@ -0,0 +1,78 @@
+import React, { type FC } from 'react'
+import { RiFileList2Line } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+
+type IEmptyProps = {
+  onClearFilter: () => void
+}
+
+const EmptyCard = React.memo(() => {
+  return (
+    <div className='h-32 w-full shrink-0 rounded-xl bg-background-section-burn opacity-30' />
+  )
+})
+
+EmptyCard.displayName = 'EmptyCard'
+
+type LineProps = {
+  className?: string
+}
+
+const Line = React.memo(({
+  className,
+}: LineProps) => {
+  return (
+    <svg xmlns="http://www.w3.org/2000/svg" width="2" height="241" viewBox="0 0 2 241" fill="none" className={className}>
+      <path d="M1 0.5L1 240.5" stroke="url(#paint0_linear_1989_74474)"/>
+      <defs>
+        <linearGradient id="paint0_linear_1989_74474" x1="-7.99584" y1="240.5" x2="-7.88094" y2="0.50004" gradientUnits="userSpaceOnUse">
+          <stop stopColor="white" stopOpacity="0.01"/>
+          <stop offset="0.503965" stopColor="#101828" stopOpacity="0.08"/>
+          <stop offset="1" stopColor="white" stopOpacity="0.01"/>
+        </linearGradient>
+      </defs>
+    </svg>
+  )
+})
+
+Line.displayName = 'Line'
+
+const Empty: FC<IEmptyProps> = ({
+  onClearFilter,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className={'relative z-0 flex h-full items-center justify-center'}>
+      <div className='flex flex-col items-center'>
+        <div className='relative z-10 flex h-14 w-14 items-center justify-center rounded-xl border border-divider-subtle bg-components-card-bg shadow-lg shadow-shadow-shadow-5'>
+          <RiFileList2Line className='h-6 w-6 text-text-secondary' />
+          <Line className='absolute -right-[1px] top-1/2 -translate-y-1/2' />
+          <Line className='absolute -left-[1px] top-1/2 -translate-y-1/2' />
+          <Line className='absolute left-1/2 top-0 -translate-x-1/2 -translate-y-1/2 rotate-90' />
+          <Line className='absolute left-1/2 top-full -translate-x-1/2 -translate-y-1/2 rotate-90' />
+        </div>
+        <div className='system-md-regular mt-3 text-text-tertiary'>
+          {t('datasetDocuments.segment.empty')}
+        </div>
+        <button
+          type='button'
+          className='system-sm-medium mt-1 text-text-accent'
+          onClick={onClearFilter}
+        >
+          {t('datasetDocuments.segment.clearFilter')}
+        </button>
+      </div>
+      <div className='absolute left-0 top-0 -z-20 flex h-full w-full flex-col gap-y-3 overflow-hidden'>
+        {
+          Array.from({ length: 10 }).map((_, i) => (
+            <EmptyCard key={i} />
+          ))
+        }
+      </div>
+      <div className='absolute left-0 top-0 -z-10 h-full w-full bg-dataset-chunk-list-mask-bg' />
+    </div>
+  )
+}
+
+export default React.memo(Empty)
diff --git a/app/components/datasets/documents/detail/completed/common/full-screen-drawer.tsx b/app/components/datasets/documents/detail/completed/common/full-screen-drawer.tsx
new file mode 100644
index 0000000..277c429
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/common/full-screen-drawer.tsx
@@ -0,0 +1,36 @@
+import React, { type FC } from 'react'
+import Drawer from '@/app/components/base/drawer'
+import classNames from '@/utils/classnames'
+import { noop } from 'lodash-es'
+
+type IFullScreenDrawerProps = {
+  isOpen: boolean
+  onClose?: () => void
+  fullScreen: boolean
+  children: React.ReactNode
+}
+
+const FullScreenDrawer: FC<IFullScreenDrawerProps> = ({
+  isOpen,
+  onClose = noop,
+  fullScreen,
+  children,
+}) => {
+  return (
+    <Drawer
+      isOpen={isOpen}
+      onClose={onClose}
+      panelClassName={classNames('!p-0 bg-components-panel-bg',
+        fullScreen
+          ? '!max-w-full !w-full'
+          : 'mt-16 mr-2 mb-2 !max-w-[560px] !w-[560px] border-[0.5px] border-components-panel-border rounded-xl',
+      )}
+      mask={false}
+      unmount
+      footer={null}
+    >
+      {children}
+    </Drawer>)
+}
+
+export default FullScreenDrawer
diff --git a/app/components/datasets/documents/detail/completed/common/keywords.tsx b/app/components/datasets/documents/detail/completed/common/keywords.tsx
new file mode 100644
index 0000000..ee90ee2
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/common/keywords.tsx
@@ -0,0 +1,47 @@
+import React, { type FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import classNames from '@/utils/classnames'
+import type { SegmentDetailModel } from '@/models/datasets'
+import TagInput from '@/app/components/base/tag-input'
+
+type IKeywordsProps = {
+  segInfo?: Partial<SegmentDetailModel> & { id: string }
+  className?: string
+  keywords: string[]
+  onKeywordsChange: (keywords: string[]) => void
+  isEditMode?: boolean
+  actionType?: 'edit' | 'add' | 'view'
+}
+
+const Keywords: FC<IKeywordsProps> = ({
+  segInfo,
+  className,
+  keywords,
+  onKeywordsChange,
+  isEditMode,
+  actionType = 'view',
+}) => {
+  const { t } = useTranslation()
+  return (
+    <div className={classNames('flex flex-col', className)}>
+      <div className='system-xs-medium-uppercase text-text-tertiary'>{t('datasetDocuments.segment.keywords')}</div>
+      <div className='flex max-h-[200px] w-full flex-wrap gap-1 overflow-auto text-text-tertiary'>
+        {(!segInfo?.keywords?.length && actionType === 'view')
+          ? '-'
+          : (
+            <TagInput
+              items={keywords}
+              onChange={newKeywords => onKeywordsChange(newKeywords)}
+              disableAdd={!isEditMode}
+              disableRemove={!isEditMode || (keywords.length === 1)}
+            />
+          )
+        }
+      </div>
+    </div>
+  )
+}
+
+Keywords.displayName = 'Keywords'
+
+export default React.memo(Keywords)
diff --git a/app/components/datasets/documents/detail/completed/common/regeneration-modal.tsx b/app/components/datasets/documents/detail/completed/common/regeneration-modal.tsx
new file mode 100644
index 0000000..95bb339
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/common/regeneration-modal.tsx
@@ -0,0 +1,132 @@
+import React, { type FC, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiLoader2Line } from '@remixicon/react'
+import { useCountDown } from 'ahooks'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { noop } from 'lodash-es'
+
+type IDefaultContentProps = {
+  onCancel: () => void
+  onConfirm: () => void
+}
+
+const DefaultContent: FC<IDefaultContentProps> = React.memo(({
+  onCancel,
+  onConfirm,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <>
+      <div className='pb-4'>
+        <span className='title-2xl-semi-bold text-text-primary'>{t('datasetDocuments.segment.regenerationConfirmTitle')}</span>
+        <p className='system-md-regular text-text-secondary'>{t('datasetDocuments.segment.regenerationConfirmMessage')}</p>
+      </div>
+      <div className='flex justify-end gap-x-2 pt-6'>
+        <Button onClick={onCancel}>
+          {t('common.operation.cancel')}
+        </Button>
+        <Button variant='warning' destructive onClick={onConfirm}>
+          {t('common.operation.regenerate')}
+        </Button>
+      </div>
+    </>
+  )
+})
+
+DefaultContent.displayName = 'DefaultContent'
+
+const RegeneratingContent: FC = React.memo(() => {
+  const { t } = useTranslation()
+
+  return (
+    <>
+      <div className='pb-4'>
+        <span className='title-2xl-semi-bold text-text-primary'>{t('datasetDocuments.segment.regeneratingTitle')}</span>
+        <p className='system-md-regular text-text-secondary'>{t('datasetDocuments.segment.regeneratingMessage')}</p>
+      </div>
+      <div className='flex justify-end pt-6'>
+        <Button variant='warning' destructive disabled className='inline-flex items-center gap-x-0.5'>
+          <RiLoader2Line className='h-4 w-4 animate-spin text-components-button-destructive-primary-text-disabled' />
+          <span>{t('common.operation.regenerate')}</span>
+        </Button>
+      </div>
+    </>
+  )
+})
+
+RegeneratingContent.displayName = 'RegeneratingContent'
+
+type IRegenerationCompletedContentProps = {
+  onClose: () => void
+}
+
+const RegenerationCompletedContent: FC<IRegenerationCompletedContentProps> = React.memo(({
+  onClose,
+}) => {
+  const { t } = useTranslation()
+  const targetTime = useRef(Date.now() + 5000)
+  const [countdown] = useCountDown({
+    targetDate: targetTime.current,
+    onEnd: () => {
+      onClose()
+    },
+  })
+
+  return (
+    <>
+      <div className='pb-4'>
+        <span className='title-2xl-semi-bold text-text-primary'>{t('datasetDocuments.segment.regenerationSuccessTitle')}</span>
+        <p className='system-md-regular text-text-secondary'>{t('datasetDocuments.segment.regenerationSuccessMessage')}</p>
+      </div>
+      <div className='flex justify-end pt-6'>
+        <Button variant='primary' onClick={onClose}>
+          {`${t('common.operation.close')}${countdown === 0 ? '' : `(${Math.round(countdown / 1000)})`}`}
+        </Button>
+      </div>
+    </>
+  )
+})
+
+RegenerationCompletedContent.displayName = 'RegenerationCompletedContent'
+
+type IRegenerationModalProps = {
+  isShow: boolean
+  onConfirm: () => void
+  onCancel: () => void
+  onClose: () => void
+}
+
+const RegenerationModal: FC<IRegenerationModalProps> = ({
+  isShow,
+  onConfirm,
+  onCancel,
+  onClose,
+}) => {
+  const [loading, setLoading] = useState(false)
+  const [updateSucceeded, setUpdateSucceeded] = useState(false)
+  const { eventEmitter } = useEventEmitterContextContext()
+
+  eventEmitter?.useSubscription((v) => {
+    if (v === 'update-segment') {
+      setLoading(true)
+      setUpdateSucceeded(false)
+    }
+    if (v === 'update-segment-success')
+      setUpdateSucceeded(true)
+    if (v === 'update-segment-done')
+      setLoading(false)
+  })
+
+  return (
+    <Modal isShow={isShow} onClose={noop} className='!max-w-[480px] !rounded-2xl'>
+      {!loading && !updateSucceeded && <DefaultContent onCancel={onCancel} onConfirm={onConfirm} />}
+      {loading && !updateSucceeded && <RegeneratingContent />}
+      {!loading && updateSucceeded && <RegenerationCompletedContent onClose={onClose} />}
+    </Modal>
+  )
+}
+
+export default RegenerationModal
diff --git a/app/components/datasets/documents/detail/completed/common/segment-index-tag.tsx b/app/components/datasets/documents/detail/completed/common/segment-index-tag.tsx
new file mode 100644
index 0000000..8f30a55
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/common/segment-index-tag.tsx
@@ -0,0 +1,40 @@
+import React, { type FC, useMemo } from 'react'
+import { Chunk } from '@/app/components/base/icons/src/public/knowledge'
+import cn from '@/utils/classnames'
+
+type ISegmentIndexTagProps = {
+  positionId?: string | number
+  label?: string
+  className?: string
+  labelPrefix?: string
+  iconClassName?: string
+  labelClassName?: string
+}
+
+export const SegmentIndexTag: FC<ISegmentIndexTagProps> = ({
+  positionId,
+  label,
+  className,
+  labelPrefix = 'Chunk',
+  iconClassName,
+  labelClassName,
+}) => {
+  const localPositionId = useMemo(() => {
+    const positionIdStr = String(positionId)
+    if (positionIdStr.length >= 2)
+      return `${labelPrefix}-${positionId}`
+    return `${labelPrefix}-${positionIdStr.padStart(2, '0')}`
+  }, [positionId, labelPrefix])
+  return (
+    <div className={cn('flex items-center', className)}>
+      <Chunk className={cn('mr-0.5 h-3 w-3 p-[1px] text-text-tertiary', iconClassName)} />
+      <div className={cn('system-xs-medium text-text-tertiary', labelClassName)}>
+        {label || localPositionId}
+      </div>
+    </div>
+  )
+}
+
+SegmentIndexTag.displayName = 'SegmentIndexTag'
+
+export default React.memo(SegmentIndexTag)
diff --git a/app/components/datasets/documents/detail/completed/common/tag.tsx b/app/components/datasets/documents/detail/completed/common/tag.tsx
new file mode 100644
index 0000000..306087d
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/common/tag.tsx
@@ -0,0 +1,15 @@
+import React from 'react'
+import cn from '@/utils/classnames'
+
+const Tag = ({ text, className }: { text: string; className?: string }) => {
+  return (
+    <div className={cn('inline-flex items-center gap-x-0.5', className)}>
+      <span className='text-xs font-medium text-text-quaternary'>#</span>
+      <span className='line-clamp-1 max-w-12 shrink-0 text-xs text-text-tertiary'>{text}</span>
+    </div>
+  )
+}
+
+Tag.displayName = 'Tag'
+
+export default React.memo(Tag)
diff --git a/app/components/datasets/documents/detail/completed/display-toggle.tsx b/app/components/datasets/documents/detail/completed/display-toggle.tsx
new file mode 100644
index 0000000..24e0be1
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/display-toggle.tsx
@@ -0,0 +1,40 @@
+import React, { type FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiLineHeight } from '@remixicon/react'
+import Tooltip from '@/app/components/base/tooltip'
+import { Collapse } from '@/app/components/base/icons/src/vender/line/editor'
+
+type DisplayToggleProps = {
+  isCollapsed: boolean
+  toggleCollapsed: () => void
+}
+
+const DisplayToggle: FC<DisplayToggleProps> = ({
+  isCollapsed,
+  toggleCollapsed,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <Tooltip
+      popupContent={isCollapsed ? t('datasetDocuments.segment.expandChunks') : t('datasetDocuments.segment.collapseChunks')}
+      popupClassName='text-text-secondary system-xs-medium border-[0.5px] border-components-panel-border'
+    >
+      <button
+        type='button'
+        className='flex items-center justify-center rounded-lg border-[0.5px] border-components-button-secondary-border
+        bg-components-button-secondary-bg p-2 shadow-xs shadow-shadow-shadow-3 backdrop-blur-[5px]'
+        onClick={toggleCollapsed}
+      >
+        {
+          isCollapsed
+            ? <RiLineHeight className='h-4 w-4 text-components-button-secondary-text' />
+            : <Collapse className='h-4 w-4 text-components-button-secondary-text' />
+        }
+      </button>
+
+    </Tooltip>
+  )
+}
+
+export default React.memo(DisplayToggle)
diff --git a/app/components/datasets/documents/detail/completed/index.tsx b/app/components/datasets/documents/detail/completed/index.tsx
new file mode 100644
index 0000000..4fe0df2
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/index.tsx
@@ -0,0 +1,735 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import { useDebounceFn } from 'ahooks'
+import { useTranslation } from 'react-i18next'
+import { createContext, useContext, useContextSelector } from 'use-context-selector'
+import { usePathname } from 'next/navigation'
+import { useDocumentContext } from '../index'
+import { ProcessStatus } from '../segment-add'
+import s from './style.module.css'
+import SegmentList from './segment-list'
+import DisplayToggle from './display-toggle'
+import BatchAction from './common/batch-action'
+import SegmentDetail from './segment-detail'
+import SegmentCard from './segment-card'
+import ChildSegmentList from './child-segment-list'
+import NewChildSegment from './new-child-segment'
+import FullScreenDrawer from './common/full-screen-drawer'
+import ChildSegmentDetail from './child-segment-detail'
+import StatusItem from './status-item'
+import Pagination from '@/app/components/base/pagination'
+import cn from '@/utils/classnames'
+import { formatNumber } from '@/utils/format'
+import Divider from '@/app/components/base/divider'
+import Input from '@/app/components/base/input'
+import { ToastContext } from '@/app/components/base/toast'
+import type { Item } from '@/app/components/base/select'
+import { SimpleSelect } from '@/app/components/base/select'
+import { type ChildChunkDetail, ChunkingMode, type SegmentDetailModel, type SegmentUpdater } from '@/models/datasets'
+import NewSegment from '@/app/components/datasets/documents/detail/new-segment'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import Checkbox from '@/app/components/base/checkbox'
+import {
+  useChildSegmentList,
+  useChildSegmentListKey,
+  useChunkListAllKey,
+  useChunkListDisabledKey,
+  useChunkListEnabledKey,
+  useDeleteChildSegment,
+  useDeleteSegment,
+  useDisableSegment,
+  useEnableSegment,
+  useSegmentList,
+  useSegmentListKey,
+  useUpdateChildSegment,
+  useUpdateSegment,
+} from '@/service/knowledge/use-segment'
+import { useInvalid } from '@/service/use-base'
+import { noop } from 'lodash-es'
+
+const DEFAULT_LIMIT = 10
+
+type CurrSegmentType = {
+  segInfo?: SegmentDetailModel
+  showModal: boolean
+  isEditMode?: boolean
+}
+
+type CurrChildChunkType = {
+  childChunkInfo?: ChildChunkDetail
+  showModal: boolean
+}
+
+type SegmentListContextValue = {
+  isCollapsed: boolean
+  fullScreen: boolean
+  toggleFullScreen: (fullscreen?: boolean) => void
+  currSegment: CurrSegmentType
+  currChildChunk: CurrChildChunkType
+}
+
+const SegmentListContext = createContext<SegmentListContextValue>({
+  isCollapsed: true,
+  fullScreen: false,
+  toggleFullScreen: noop,
+  currSegment: { showModal: false },
+  currChildChunk: { showModal: false },
+})
+
+export const useSegmentListContext = (selector: (value: SegmentListContextValue) => any) => {
+  return useContextSelector(SegmentListContext, selector)
+}
+
+type ICompletedProps = {
+  embeddingAvailable: boolean
+  showNewSegmentModal: boolean
+  onNewSegmentModalChange: (state: boolean) => void
+  importStatus: ProcessStatus | string | undefined
+  archived?: boolean
+}
+/**
+ * Embedding done, show list of all segments
+ * Support search and filter
+ */
+const Completed: FC<ICompletedProps> = ({
+  embeddingAvailable,
+  showNewSegmentModal,
+  onNewSegmentModalChange,
+  importStatus,
+  archived,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const pathname = usePathname()
+  const datasetId = useDocumentContext(s => s.datasetId) || ''
+  const documentId = useDocumentContext(s => s.documentId) || ''
+  const docForm = useDocumentContext(s => s.docForm)
+  const mode = useDocumentContext(s => s.mode)
+  const parentMode = useDocumentContext(s => s.parentMode)
+  // the current segment id and whether to show the modal
+  const [currSegment, setCurrSegment] = useState<CurrSegmentType>({ showModal: false })
+  const [currChildChunk, setCurrChildChunk] = useState<CurrChildChunkType>({ showModal: false })
+  const [currChunkId, setCurrChunkId] = useState('')
+
+  const [inputValue, setInputValue] = useState<string>('') // the input value
+  const [searchValue, setSearchValue] = useState<string>('') // the search value
+  const [selectedStatus, setSelectedStatus] = useState<boolean | 'all'>('all') // the selected status, enabled/disabled/undefined
+
+  const [segments, setSegments] = useState<SegmentDetailModel[]>([]) // all segments data
+  const [childSegments, setChildSegments] = useState<ChildChunkDetail[]>([]) // all child segments data
+  const [selectedSegmentIds, setSelectedSegmentIds] = useState<string[]>([])
+  const { eventEmitter } = useEventEmitterContextContext()
+  const [isCollapsed, setIsCollapsed] = useState(true)
+  const [currentPage, setCurrentPage] = useState(1) // start from 1
+  const [limit, setLimit] = useState(DEFAULT_LIMIT)
+  const [fullScreen, setFullScreen] = useState(false)
+  const [showNewChildSegmentModal, setShowNewChildSegmentModal] = useState(false)
+
+  const segmentListRef = useRef<HTMLDivElement>(null)
+  const childSegmentListRef = useRef<HTMLDivElement>(null)
+  const needScrollToBottom = useRef(false)
+  const statusList = useRef<Item[]>([
+    { value: 'all', name: t('datasetDocuments.list.index.all') },
+    { value: 0, name: t('datasetDocuments.list.status.disabled') },
+    { value: 1, name: t('datasetDocuments.list.status.enabled') },
+  ])
+
+  const { run: handleSearch } = useDebounceFn(() => {
+    setSearchValue(inputValue)
+    setCurrentPage(1)
+  }, { wait: 500 })
+
+  const handleInputChange = (value: string) => {
+    setInputValue(value)
+    handleSearch()
+  }
+
+  const onChangeStatus = ({ value }: Item) => {
+    setSelectedStatus(value === 'all' ? 'all' : !!value)
+    setCurrentPage(1)
+  }
+
+  const isFullDocMode = useMemo(() => {
+    return mode === 'hierarchical' && parentMode === 'full-doc'
+  }, [mode, parentMode])
+
+  const { isFetching: isLoadingSegmentList, data: segmentListData } = useSegmentList(
+    {
+      datasetId,
+      documentId,
+      params: {
+        page: isFullDocMode ? 1 : currentPage,
+        limit: isFullDocMode ? 10 : limit,
+        keyword: isFullDocMode ? '' : searchValue,
+        enabled: selectedStatus,
+      },
+    },
+  )
+  const invalidSegmentList = useInvalid(useSegmentListKey)
+
+  useEffect(() => {
+    if (segmentListData) {
+      setSegments(segmentListData.data || [])
+      const totalPages = segmentListData.total_pages
+      if (totalPages < currentPage)
+        setCurrentPage(totalPages === 0 ? 1 : totalPages)
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [segmentListData])
+
+  useEffect(() => {
+    if (segmentListRef.current && needScrollToBottom.current) {
+      segmentListRef.current.scrollTo({ top: segmentListRef.current.scrollHeight, behavior: 'smooth' })
+      needScrollToBottom.current = false
+    }
+  }, [segments])
+
+  const { isFetching: isLoadingChildSegmentList, data: childChunkListData } = useChildSegmentList(
+    {
+      datasetId,
+      documentId,
+      segmentId: segments[0]?.id || '',
+      params: {
+        page: currentPage === 0 ? 1 : currentPage,
+        limit,
+        keyword: searchValue,
+      },
+    },
+    !isFullDocMode || segments.length === 0,
+  )
+  const invalidChildSegmentList = useInvalid(useChildSegmentListKey)
+
+  useEffect(() => {
+    if (childSegmentListRef.current && needScrollToBottom.current) {
+      childSegmentListRef.current.scrollTo({ top: childSegmentListRef.current.scrollHeight, behavior: 'smooth' })
+      needScrollToBottom.current = false
+    }
+  }, [childSegments])
+
+  useEffect(() => {
+    if (childChunkListData) {
+      setChildSegments(childChunkListData.data || [])
+      const totalPages = childChunkListData.total_pages
+      if (totalPages < currentPage)
+        setCurrentPage(totalPages === 0 ? 1 : totalPages)
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [childChunkListData])
+
+  const resetList = useCallback(() => {
+    setSelectedSegmentIds([])
+    invalidSegmentList()
+  }, [invalidSegmentList])
+
+  const resetChildList = useCallback(() => {
+    invalidChildSegmentList()
+  }, [invalidChildSegmentList])
+
+  const onClickCard = (detail: SegmentDetailModel, isEditMode = false) => {
+    setCurrSegment({ segInfo: detail, showModal: true, isEditMode })
+  }
+
+  const onCloseSegmentDetail = useCallback(() => {
+    setCurrSegment({ showModal: false })
+    setFullScreen(false)
+  }, [])
+
+  const onCloseNewSegmentModal = useCallback(() => {
+    onNewSegmentModalChange(false)
+    setFullScreen(false)
+  }, [onNewSegmentModalChange])
+
+  const onCloseNewChildChunkModal = useCallback(() => {
+    setShowNewChildSegmentModal(false)
+    setFullScreen(false)
+  }, [])
+
+  const { mutateAsync: enableSegment } = useEnableSegment()
+  const { mutateAsync: disableSegment } = useDisableSegment()
+  const invalidChunkListAll = useInvalid(useChunkListAllKey)
+  const invalidChunkListEnabled = useInvalid(useChunkListEnabledKey)
+  const invalidChunkListDisabled = useInvalid(useChunkListDisabledKey)
+
+  const refreshChunkListWithStatusChanged = useCallback(() => {
+    switch (selectedStatus) {
+      case 'all':
+        invalidChunkListDisabled()
+        invalidChunkListEnabled()
+        break
+      default:
+        invalidSegmentList()
+    }
+  }, [selectedStatus, invalidChunkListDisabled, invalidChunkListEnabled, invalidSegmentList])
+
+  const onChangeSwitch = useCallback(async (enable: boolean, segId?: string) => {
+    const operationApi = enable ? enableSegment : disableSegment
+    await operationApi({ datasetId, documentId, segmentIds: segId ? [segId] : selectedSegmentIds }, {
+      onSuccess: () => {
+        notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+        for (const seg of segments) {
+          if (segId ? seg.id === segId : selectedSegmentIds.includes(seg.id))
+            seg.enabled = enable
+        }
+        setSegments([...segments])
+        refreshChunkListWithStatusChanged()
+      },
+      onError: () => {
+        notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+      },
+    })
+  }, [datasetId, documentId, selectedSegmentIds, segments, disableSegment, enableSegment, t, notify, refreshChunkListWithStatusChanged])
+
+  const { mutateAsync: deleteSegment } = useDeleteSegment()
+
+  const onDelete = useCallback(async (segId?: string) => {
+    await deleteSegment({ datasetId, documentId, segmentIds: segId ? [segId] : selectedSegmentIds }, {
+      onSuccess: () => {
+        notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+        resetList()
+        !segId && setSelectedSegmentIds([])
+      },
+      onError: () => {
+        notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+      },
+    })
+  }, [datasetId, documentId, selectedSegmentIds, deleteSegment, resetList, t, notify])
+
+  const { mutateAsync: updateSegment } = useUpdateSegment()
+
+  const refreshChunkListDataWithDetailChanged = useCallback(() => {
+    switch (selectedStatus) {
+      case 'all':
+        invalidChunkListDisabled()
+        invalidChunkListEnabled()
+        break
+      case true:
+        invalidChunkListAll()
+        invalidChunkListDisabled()
+        break
+      case false:
+        invalidChunkListAll()
+        invalidChunkListEnabled()
+        break
+    }
+  }, [selectedStatus, invalidChunkListDisabled, invalidChunkListEnabled, invalidChunkListAll])
+
+  const handleUpdateSegment = useCallback(async (
+    segmentId: string,
+    question: string,
+    answer: string,
+    keywords: string[],
+    needRegenerate = false,
+  ) => {
+    const params: SegmentUpdater = { content: '' }
+    if (docForm === ChunkingMode.qa) {
+      if (!question.trim())
+        return notify({ type: 'error', message: t('datasetDocuments.segment.questionEmpty') })
+      if (!answer.trim())
+        return notify({ type: 'error', message: t('datasetDocuments.segment.answerEmpty') })
+
+      params.content = question
+      params.answer = answer
+    }
+    else {
+      if (!question.trim())
+        return notify({ type: 'error', message: t('datasetDocuments.segment.contentEmpty') })
+
+      params.content = question
+    }
+
+    if (keywords.length)
+      params.keywords = keywords
+
+    if (needRegenerate)
+      params.regenerate_child_chunks = needRegenerate
+
+    eventEmitter?.emit('update-segment')
+    await updateSegment({ datasetId, documentId, segmentId, body: params }, {
+      onSuccess(res) {
+        notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+        if (!needRegenerate)
+          onCloseSegmentDetail()
+        for (const seg of segments) {
+          if (seg.id === segmentId) {
+            seg.answer = res.data.answer
+            seg.content = res.data.content
+            seg.sign_content = res.data.sign_content
+            seg.keywords = res.data.keywords
+            seg.word_count = res.data.word_count
+            seg.hit_count = res.data.hit_count
+            seg.enabled = res.data.enabled
+            seg.updated_at = res.data.updated_at
+            seg.child_chunks = res.data.child_chunks
+          }
+        }
+        setSegments([...segments])
+        refreshChunkListDataWithDetailChanged()
+        eventEmitter?.emit('update-segment-success')
+      },
+      onSettled() {
+        eventEmitter?.emit('update-segment-done')
+      },
+    })
+  }, [segments, datasetId, documentId, updateSegment, docForm, notify, eventEmitter, onCloseSegmentDetail, refreshChunkListDataWithDetailChanged, t])
+
+  useEffect(() => {
+    resetList()
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [pathname])
+
+  useEffect(() => {
+    if (importStatus === ProcessStatus.COMPLETED)
+      resetList()
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [importStatus])
+
+  const onCancelBatchOperation = useCallback(() => {
+    setSelectedSegmentIds([])
+  }, [])
+
+  const onSelected = useCallback((segId: string) => {
+    setSelectedSegmentIds(prev =>
+      prev.includes(segId)
+        ? prev.filter(id => id !== segId)
+        : [...prev, segId],
+    )
+  }, [])
+
+  const isAllSelected = useMemo(() => {
+    return segments.length > 0 && segments.every(seg => selectedSegmentIds.includes(seg.id))
+  }, [segments, selectedSegmentIds])
+
+  const isSomeSelected = useMemo(() => {
+    return segments.some(seg => selectedSegmentIds.includes(seg.id))
+  }, [segments, selectedSegmentIds])
+
+  const onSelectedAll = useCallback(() => {
+    setSelectedSegmentIds((prev) => {
+      const currentAllSegIds = segments.map(seg => seg.id)
+      const prevSelectedIds = prev.filter(item => !currentAllSegIds.includes(item))
+      return [...prevSelectedIds, ...(isAllSelected ? [] : currentAllSegIds)]
+    })
+  }, [segments, isAllSelected])
+
+  const totalText = useMemo(() => {
+    const isSearch = searchValue !== '' || selectedStatus !== 'all'
+    if (!isSearch) {
+      const total = segmentListData?.total ? formatNumber(segmentListData.total) : '--'
+      const count = total === '--' ? 0 : segmentListData!.total
+      const translationKey = (mode === 'hierarchical' && parentMode === 'paragraph')
+        ? 'datasetDocuments.segment.parentChunks'
+        : 'datasetDocuments.segment.chunks'
+      return `${total} ${t(translationKey, { count })}`
+    }
+    else {
+      const total = typeof segmentListData?.total === 'number' ? formatNumber(segmentListData.total) : 0
+      const count = segmentListData?.total || 0
+      return `${total} ${t('datasetDocuments.segment.searchResults', { count })}`
+    }
+  }, [segmentListData, mode, parentMode, searchValue, selectedStatus, t])
+
+  const toggleFullScreen = useCallback(() => {
+    setFullScreen(!fullScreen)
+  }, [fullScreen])
+
+  const viewNewlyAddedChunk = useCallback(async () => {
+    const totalPages = segmentListData?.total_pages || 0
+    const total = segmentListData?.total || 0
+    const newPage = Math.ceil((total + 1) / limit)
+    needScrollToBottom.current = true
+    if (newPage > totalPages) {
+      setCurrentPage(totalPages + 1)
+    }
+    else {
+      resetList()
+      currentPage !== totalPages && setCurrentPage(totalPages)
+    }
+  }, [segmentListData, limit, currentPage, resetList])
+
+  const { mutateAsync: deleteChildSegment } = useDeleteChildSegment()
+
+  const onDeleteChildChunk = useCallback(async (segmentId: string, childChunkId: string) => {
+    await deleteChildSegment(
+      { datasetId, documentId, segmentId, childChunkId },
+      {
+        onSuccess: () => {
+          notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+          if (parentMode === 'paragraph')
+            resetList()
+          else
+            resetChildList()
+        },
+        onError: () => {
+          notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+        },
+      },
+    )
+  }, [datasetId, documentId, parentMode, deleteChildSegment, resetList, resetChildList, t, notify])
+
+  const handleAddNewChildChunk = useCallback((parentChunkId: string) => {
+    setShowNewChildSegmentModal(true)
+    setCurrChunkId(parentChunkId)
+  }, [])
+
+  const onSaveNewChildChunk = useCallback((newChildChunk?: ChildChunkDetail) => {
+    if (parentMode === 'paragraph') {
+      for (const seg of segments) {
+        if (seg.id === currChunkId)
+          seg.child_chunks?.push(newChildChunk!)
+      }
+      setSegments([...segments])
+      refreshChunkListDataWithDetailChanged()
+    }
+    else {
+      resetChildList()
+    }
+  }, [parentMode, currChunkId, segments, refreshChunkListDataWithDetailChanged, resetChildList])
+
+  const viewNewlyAddedChildChunk = useCallback(() => {
+    const totalPages = childChunkListData?.total_pages || 0
+    const total = childChunkListData?.total || 0
+    const newPage = Math.ceil((total + 1) / limit)
+    needScrollToBottom.current = true
+    if (newPage > totalPages) {
+      setCurrentPage(totalPages + 1)
+    }
+    else {
+      resetChildList()
+      currentPage !== totalPages && setCurrentPage(totalPages)
+    }
+  }, [childChunkListData, limit, currentPage, resetChildList])
+
+  const onClickSlice = useCallback((detail: ChildChunkDetail) => {
+    setCurrChildChunk({ childChunkInfo: detail, showModal: true })
+    setCurrChunkId(detail.segment_id)
+  }, [])
+
+  const onCloseChildSegmentDetail = useCallback(() => {
+    setCurrChildChunk({ showModal: false })
+    setFullScreen(false)
+  }, [])
+
+  const { mutateAsync: updateChildSegment } = useUpdateChildSegment()
+
+  const handleUpdateChildChunk = useCallback(async (
+    segmentId: string,
+    childChunkId: string,
+    content: string,
+  ) => {
+    const params: SegmentUpdater = { content: '' }
+    if (!content.trim())
+      return notify({ type: 'error', message: t('datasetDocuments.segment.contentEmpty') })
+
+    params.content = content
+
+    eventEmitter?.emit('update-child-segment')
+    await updateChildSegment({ datasetId, documentId, segmentId, childChunkId, body: params }, {
+      onSuccess: (res) => {
+        notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+        onCloseChildSegmentDetail()
+        if (parentMode === 'paragraph') {
+          for (const seg of segments) {
+            if (seg.id === segmentId) {
+              for (const childSeg of seg.child_chunks!) {
+                if (childSeg.id === childChunkId) {
+                  childSeg.content = res.data.content
+                  childSeg.type = res.data.type
+                  childSeg.word_count = res.data.word_count
+                  childSeg.updated_at = res.data.updated_at
+                }
+              }
+            }
+          }
+          setSegments([...segments])
+          refreshChunkListDataWithDetailChanged()
+        }
+        else {
+          resetChildList()
+        }
+      },
+      onSettled: () => {
+        eventEmitter?.emit('update-child-segment-done')
+      },
+    })
+  }, [segments, datasetId, documentId, parentMode, updateChildSegment, notify, eventEmitter, onCloseChildSegmentDetail, refreshChunkListDataWithDetailChanged, resetChildList, t])
+
+  const onClearFilter = useCallback(() => {
+    setInputValue('')
+    setSearchValue('')
+    setSelectedStatus('all')
+    setCurrentPage(1)
+  }, [])
+
+  const selectDefaultValue = useMemo(() => {
+    if (selectedStatus === 'all')
+      return 'all'
+    return selectedStatus ? 1 : 0
+  }, [selectedStatus])
+
+  return (
+    <SegmentListContext.Provider value={{
+      isCollapsed,
+      fullScreen,
+      toggleFullScreen,
+      currSegment,
+      currChildChunk,
+    }}>
+      {/* Menu Bar */}
+      {!isFullDocMode && <div className={s.docSearchWrapper}>
+        <Checkbox
+          className='shrink-0'
+          checked={isAllSelected}
+          indeterminate={!isAllSelected && isSomeSelected}
+          onCheck={onSelectedAll}
+          disabled={isLoadingSegmentList}
+        />
+        <div className={'system-sm-semibold-uppercase flex-1 pl-5 text-text-secondary'}>{totalText}</div>
+        <SimpleSelect
+          onSelect={onChangeStatus}
+          items={statusList.current}
+          defaultValue={selectDefaultValue}
+          className={s.select}
+          wrapperClassName='h-fit mr-2'
+          optionWrapClassName='w-[160px]'
+          optionClassName='p-0'
+          renderOption={({ item, selected }) => <StatusItem item={item} selected={selected} />}
+          notClearable
+        />
+        <Input
+          showLeftIcon
+          showClearIcon
+          wrapperClassName='!w-52'
+          value={inputValue}
+          onChange={e => handleInputChange(e.target.value)}
+          onClear={() => handleInputChange('')}
+        />
+        <Divider type='vertical' className='mx-3 h-3.5' />
+        <DisplayToggle isCollapsed={isCollapsed} toggleCollapsed={() => setIsCollapsed(!isCollapsed)} />
+      </div>}
+      {/* Segment list */}
+      {
+        isFullDocMode
+          ? <div className={cn(
+            'flex grow flex-col overflow-x-hidden',
+            (isLoadingSegmentList || isLoadingChildSegmentList) ? 'overflow-y-hidden' : 'overflow-y-auto',
+          )}>
+            <SegmentCard
+              detail={segments[0]}
+              onClick={() => onClickCard(segments[0])}
+              loading={isLoadingSegmentList}
+              focused={{
+                segmentIndex: currSegment?.segInfo?.id === segments[0]?.id,
+                segmentContent: currSegment?.segInfo?.id === segments[0]?.id,
+              }}
+            />
+            <ChildSegmentList
+              parentChunkId={segments[0]?.id}
+              onDelete={onDeleteChildChunk}
+              childChunks={childSegments}
+              handleInputChange={handleInputChange}
+              handleAddNewChildChunk={handleAddNewChildChunk}
+              onClickSlice={onClickSlice}
+              enabled={!archived}
+              total={childChunkListData?.total || 0}
+              inputValue={inputValue}
+              onClearFilter={onClearFilter}
+              isLoading={isLoadingSegmentList || isLoadingChildSegmentList}
+            />
+          </div>
+          : <SegmentList
+            ref={segmentListRef}
+            embeddingAvailable={embeddingAvailable}
+            isLoading={isLoadingSegmentList}
+            items={segments}
+            selectedSegmentIds={selectedSegmentIds}
+            onSelected={onSelected}
+            onChangeSwitch={onChangeSwitch}
+            onDelete={onDelete}
+            onClick={onClickCard}
+            archived={archived}
+            onDeleteChildChunk={onDeleteChildChunk}
+            handleAddNewChildChunk={handleAddNewChildChunk}
+            onClickSlice={onClickSlice}
+            onClearFilter={onClearFilter}
+          />
+      }
+      {/* Pagination */}
+      <Divider type='horizontal' className='mx-6 my-0 h-[1px] w-auto bg-divider-subtle' />
+      <Pagination
+        current={currentPage - 1}
+        onChange={cur => setCurrentPage(cur + 1)}
+        total={(isFullDocMode ? childChunkListData?.total : segmentListData?.total) || 0}
+        limit={limit}
+        onLimitChange={limit => setLimit(limit)}
+        className={isFullDocMode ? 'px-3' : ''}
+      />
+      {/* Edit or view segment detail */}
+      <FullScreenDrawer
+        isOpen={currSegment.showModal}
+        fullScreen={fullScreen}
+        onClose={onCloseSegmentDetail}
+      >
+        <SegmentDetail
+          segInfo={currSegment.segInfo ?? { id: '' }}
+          docForm={docForm}
+          isEditMode={currSegment.isEditMode}
+          onUpdate={handleUpdateSegment}
+          onCancel={onCloseSegmentDetail}
+        />
+      </FullScreenDrawer>
+      {/* Create New Segment */}
+      <FullScreenDrawer
+        isOpen={showNewSegmentModal}
+        fullScreen={fullScreen}
+        onClose={onCloseNewSegmentModal}
+      >
+        <NewSegment
+          docForm={docForm}
+          onCancel={onCloseNewSegmentModal}
+          onSave={resetList}
+          viewNewlyAddedChunk={viewNewlyAddedChunk}
+        />
+      </FullScreenDrawer>
+      {/* Edit or view child segment detail */}
+      <FullScreenDrawer
+        isOpen={currChildChunk.showModal}
+        fullScreen={fullScreen}
+        onClose={onCloseChildSegmentDetail}
+      >
+        <ChildSegmentDetail
+          chunkId={currChunkId}
+          childChunkInfo={currChildChunk.childChunkInfo ?? { id: '' }}
+          docForm={docForm}
+          onUpdate={handleUpdateChildChunk}
+          onCancel={onCloseChildSegmentDetail}
+        />
+      </FullScreenDrawer>
+      {/* Create New Child Segment */}
+      <FullScreenDrawer
+        isOpen={showNewChildSegmentModal}
+        fullScreen={fullScreen}
+        onClose={onCloseNewChildChunkModal}
+      >
+        <NewChildSegment
+          chunkId={currChunkId}
+          onCancel={onCloseNewChildChunkModal}
+          onSave={onSaveNewChildChunk}
+          viewNewlyAddedChildChunk={viewNewlyAddedChildChunk}
+        />
+      </FullScreenDrawer>
+      {/* Batch Action Buttons */}
+      {selectedSegmentIds.length > 0
+        && <BatchAction
+          className='absolute bottom-16 left-0 z-20'
+          selectedIds={selectedSegmentIds}
+          onBatchEnable={onChangeSwitch.bind(null, true, '')}
+          onBatchDisable={onChangeSwitch.bind(null, false, '')}
+          onBatchDelete={onDelete.bind(null, '')}
+          onCancel={onCancelBatchOperation}
+        />}
+    </SegmentListContext.Provider>
+  )
+}
+
+export default Completed
diff --git a/app/components/datasets/documents/detail/completed/new-child-segment.tsx b/app/components/datasets/documents/detail/completed/new-child-segment.tsx
new file mode 100644
index 0000000..e1d5701
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/new-child-segment.tsx
@@ -0,0 +1,174 @@
+import { memo, useMemo, useRef, useState } from 'react'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { useParams } from 'next/navigation'
+import { RiCloseLine, RiExpandDiagonalLine } from '@remixicon/react'
+import { useShallow } from 'zustand/react/shallow'
+import { useDocumentContext } from '../index'
+import { SegmentIndexTag } from './common/segment-index-tag'
+import ActionButtons from './common/action-buttons'
+import ChunkContent from './common/chunk-content'
+import AddAnother from './common/add-another'
+import Dot from './common/dot'
+import { useSegmentListContext } from './index'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { ToastContext } from '@/app/components/base/toast'
+import { type ChildChunkDetail, ChunkingMode, type SegmentUpdater } from '@/models/datasets'
+import classNames from '@/utils/classnames'
+import { formatNumber } from '@/utils/format'
+import Divider from '@/app/components/base/divider'
+import { useAddChildSegment } from '@/service/knowledge/use-segment'
+
+type NewChildSegmentModalProps = {
+  chunkId: string
+  onCancel: () => void
+  onSave: (ChildChunk?: ChildChunkDetail) => void
+  viewNewlyAddedChildChunk?: () => void
+}
+
+const NewChildSegmentModal: FC<NewChildSegmentModalProps> = ({
+  chunkId,
+  onCancel,
+  onSave,
+  viewNewlyAddedChildChunk,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const [content, setContent] = useState('')
+  const { datasetId, documentId } = useParams<{ datasetId: string; documentId: string }>()
+  const [loading, setLoading] = useState(false)
+  const [addAnother, setAddAnother] = useState(true)
+  const fullScreen = useSegmentListContext(s => s.fullScreen)
+  const toggleFullScreen = useSegmentListContext(s => s.toggleFullScreen)
+  const { appSidebarExpand } = useAppStore(useShallow(state => ({
+    appSidebarExpand: state.appSidebarExpand,
+  })))
+  const parentMode = useDocumentContext(s => s.parentMode)
+
+  const refreshTimer = useRef<any>(null)
+
+  const isFullDocMode = useMemo(() => {
+    return parentMode === 'full-doc'
+  }, [parentMode])
+
+  const CustomButton = <>
+    <Divider type='vertical' className='mx-1 h-3 bg-divider-regular' />
+    <button
+      type='button'
+      className='system-xs-semibold text-text-accent'
+      onClick={() => {
+        clearTimeout(refreshTimer.current)
+        viewNewlyAddedChildChunk?.()
+      }}>
+      {t('common.operation.view')}
+    </button>
+  </>
+
+  const handleCancel = (actionType: 'esc' | 'add' = 'esc') => {
+    if (actionType === 'esc' || !addAnother)
+      onCancel()
+  }
+
+  const { mutateAsync: addChildSegment } = useAddChildSegment()
+
+  const handleSave = async () => {
+    const params: SegmentUpdater = { content: '' }
+
+    if (!content.trim())
+      return notify({ type: 'error', message: t('datasetDocuments.segment.contentEmpty') })
+
+    params.content = content
+
+    setLoading(true)
+    await addChildSegment({ datasetId, documentId, segmentId: chunkId, body: params }, {
+      onSuccess(res) {
+        notify({
+          type: 'success',
+          message: t('datasetDocuments.segment.childChunkAdded'),
+          className: `!w-[296px] !bottom-0 ${appSidebarExpand === 'expand' ? '!left-[216px]' : '!left-14'}
+          !top-auto !right-auto !mb-[52px] !ml-11`,
+          customComponent: isFullDocMode && CustomButton,
+        })
+        handleCancel('add')
+        if (isFullDocMode) {
+          refreshTimer.current = setTimeout(() => {
+            onSave()
+          }, 3000)
+        }
+        else {
+          onSave(res.data)
+        }
+      },
+      onSettled() {
+        setLoading(false)
+      },
+    })
+  }
+
+  const wordCountText = useMemo(() => {
+    const count = content.length
+    return `${formatNumber(count)} ${t('datasetDocuments.segment.characters', { count })}`
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [content.length])
+
+  return (
+    <div className={'flex h-full flex-col'}>
+      <div className={classNames('flex items-center justify-between', fullScreen ? 'py-3 pr-4 pl-6 border border-divider-subtle' : 'pt-3 pr-3 pl-4')}>
+        <div className='flex flex-col'>
+          <div className='system-xl-semibold text-text-primary'>{t('datasetDocuments.segment.addChildChunk')}</div>
+          <div className='flex items-center gap-x-2'>
+            <SegmentIndexTag label={t('datasetDocuments.segment.newChildChunk') as string} />
+            <Dot />
+            <span className='system-xs-medium text-text-tertiary'>{wordCountText}</span>
+          </div>
+        </div>
+        <div className='flex items-center'>
+          {fullScreen && (
+            <>
+              <AddAnother className='mr-3' isChecked={addAnother} onCheck={() => setAddAnother(!addAnother)} />
+              <ActionButtons
+                handleCancel={handleCancel.bind(null, 'esc')}
+                handleSave={handleSave}
+                loading={loading}
+                actionType='add'
+                isChildChunk={true}
+              />
+              <Divider type='vertical' className='ml-4 mr-2 h-3.5 bg-divider-regular' />
+            </>
+          )}
+          <div className='mr-1 flex h-8 w-8 cursor-pointer items-center justify-center p-1.5' onClick={toggleFullScreen}>
+            <RiExpandDiagonalLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+          <div className='flex h-8 w-8 cursor-pointer items-center justify-center p-1.5' onClick={handleCancel.bind(null, 'esc')}>
+            <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+        </div>
+      </div>
+      <div className={classNames('flex grow w-full', fullScreen ? 'flex-row justify-center px-6 pt-6' : 'py-3 px-4')}>
+        <div className={classNames('break-all overflow-hidden whitespace-pre-line h-full', fullScreen ? 'w-1/2' : 'w-full')}>
+          <ChunkContent
+            docForm={ChunkingMode.parentChild}
+            question={content}
+            onQuestionChange={content => setContent(content)}
+            isEditMode={true}
+          />
+        </div>
+      </div>
+      {!fullScreen && (
+        <div className='flex items-center justify-between border-t-[1px] border-t-divider-subtle p-4 pt-3'>
+          <AddAnother isChecked={addAnother} onCheck={() => setAddAnother(!addAnother)} />
+          <ActionButtons
+            handleCancel={handleCancel.bind(null, 'esc')}
+            handleSave={handleSave}
+            loading={loading}
+            actionType='add'
+            isChildChunk={true}
+          />
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default memo(NewChildSegmentModal)
diff --git a/app/components/datasets/documents/detail/completed/segment-card/chunk-content.tsx b/app/components/datasets/documents/detail/completed/segment-card/chunk-content.tsx
new file mode 100644
index 0000000..d93eb94
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/segment-card/chunk-content.tsx
@@ -0,0 +1,57 @@
+import React, { type FC } from 'react'
+import cn from '@/utils/classnames'
+import { useSegmentListContext } from '..'
+import { Markdown } from '@/app/components/base/markdown'
+
+type ChunkContentProps = {
+  detail: {
+    answer?: string
+    content: string
+    sign_content: string
+  }
+  isFullDocMode: boolean
+  className?: string
+}
+
+const ChunkContent: FC<ChunkContentProps> = ({
+  detail,
+  isFullDocMode,
+  className,
+}) => {
+  const { answer, content, sign_content } = detail
+  const isCollapsed = useSegmentListContext(s => s.isCollapsed)
+
+  if (answer) {
+    return (
+      <div className={className}>
+        <div className='flex gap-x-1'>
+          <div className='w-4 shrink-0 text-[13px] font-medium leading-[20px] text-text-tertiary'>Q</div>
+          <div
+            className={cn('body-md-regular text-text-secondary',
+              isCollapsed ? 'line-clamp-2' : 'line-clamp-20',
+            )}>
+            {content}
+          </div>
+        </div>
+        <div className='flex gap-x-1'>
+          <div className='w-4 shrink-0 text-[13px] font-medium leading-[20px] text-text-tertiary'>A</div>
+          <div className={cn('body-md-regular text-text-secondary',
+            isCollapsed ? 'line-clamp-2' : 'line-clamp-20',
+          )}>
+            {answer}
+          </div>
+        </div>
+      </div>
+    )
+  }
+  return <Markdown
+    className={cn('!mt-0.5 !text-text-secondary',
+      isFullDocMode ? 'line-clamp-3' : isCollapsed ? 'line-clamp-2' : 'line-clamp-20',
+      className,
+    )}
+    content={sign_content || content || ''}
+    customDisallowedElements={['input']}
+  />
+}
+
+export default React.memo(ChunkContent)
diff --git a/app/components/datasets/documents/detail/completed/segment-card/index.tsx b/app/components/datasets/documents/detail/completed/segment-card/index.tsx
new file mode 100644
index 0000000..584a60b
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/segment-card/index.tsx
@@ -0,0 +1,254 @@
+import React, { type FC, useCallback, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiDeleteBinLine, RiEditLine } from '@remixicon/react'
+import { StatusItem } from '../../../list'
+import { useDocumentContext } from '../../index'
+import ChildSegmentList from '../child-segment-list'
+import Tag from '../common/tag'
+import Dot from '../common/dot'
+import { SegmentIndexTag } from '../common/segment-index-tag'
+import ParentChunkCardSkeleton from '../skeleton/parent-chunk-card-skeleton'
+import type { ChildChunkDetail, SegmentDetailModel } from '@/models/datasets'
+import Switch from '@/app/components/base/switch'
+import Divider from '@/app/components/base/divider'
+import { formatNumber } from '@/utils/format'
+import Confirm from '@/app/components/base/confirm'
+import cn from '@/utils/classnames'
+import Badge from '@/app/components/base/badge'
+import { isAfter } from '@/utils/time'
+import Tooltip from '@/app/components/base/tooltip'
+import ChunkContent from './chunk-content'
+
+type ISegmentCardProps = {
+  loading: boolean
+  detail?: SegmentDetailModel & { document?: { name: string } }
+  onClick?: () => void
+  onChangeSwitch?: (enabled: boolean, segId?: string) => Promise<void>
+  onDelete?: (segId: string) => Promise<void>
+  onDeleteChildChunk?: (segId: string, childChunkId: string) => Promise<void>
+  handleAddNewChildChunk?: (parentChunkId: string) => void
+  onClickSlice?: (childChunk: ChildChunkDetail) => void
+  onClickEdit?: () => void
+  className?: string
+  archived?: boolean
+  embeddingAvailable?: boolean
+  focused: {
+    segmentIndex: boolean
+    segmentContent: boolean
+  }
+}
+
+const SegmentCard: FC<ISegmentCardProps> = ({
+  detail = {},
+  onClick,
+  onChangeSwitch,
+  onDelete,
+  onDeleteChildChunk,
+  handleAddNewChildChunk,
+  onClickSlice,
+  onClickEdit,
+  loading = true,
+  className = '',
+  archived,
+  embeddingAvailable,
+  focused,
+}) => {
+  const { t } = useTranslation()
+  const {
+    id,
+    position,
+    enabled,
+    content,
+    sign_content,
+    word_count,
+    hit_count,
+    answer,
+    keywords,
+    child_chunks = [],
+    created_at,
+    updated_at,
+  } = detail as Required<ISegmentCardProps>['detail']
+  const [showModal, setShowModal] = useState(false)
+  const mode = useDocumentContext(s => s.mode)
+  const parentMode = useDocumentContext(s => s.parentMode)
+
+  const isGeneralMode = useMemo(() => {
+    return mode === 'custom'
+  }, [mode])
+
+  const isParentChildMode = useMemo(() => {
+    return mode === 'hierarchical'
+  }, [mode])
+
+  const isParagraphMode = useMemo(() => {
+    return mode === 'hierarchical' && parentMode === 'paragraph'
+  }, [mode, parentMode])
+
+  const isFullDocMode = useMemo(() => {
+    return mode === 'hierarchical' && parentMode === 'full-doc'
+  }, [mode, parentMode])
+
+  const chunkEdited = useMemo(() => {
+    if (mode === 'hierarchical' && parentMode === 'full-doc')
+      return false
+    return isAfter(updated_at * 1000, created_at * 1000)
+  }, [mode, parentMode, updated_at, created_at])
+
+  const contentOpacity = useMemo(() => {
+    return (enabled || focused.segmentContent) ? '' : 'opacity-50 group-hover/card:opacity-100'
+  }, [enabled, focused.segmentContent])
+
+  const handleClickCard = useCallback(() => {
+    if (mode !== 'hierarchical' || parentMode !== 'full-doc')
+      onClick?.()
+  }, [mode, parentMode, onClick])
+
+  const wordCountText = useMemo(() => {
+    const total = formatNumber(word_count)
+    return `${total} ${t('datasetDocuments.segment.characters', { count: word_count })}`
+  }, [word_count, t])
+
+  const labelPrefix = useMemo(() => {
+    return isParentChildMode ? t('datasetDocuments.segment.parentChunk') : t('datasetDocuments.segment.chunk')
+  }, [isParentChildMode, t])
+
+  if (loading)
+    return <ParentChunkCardSkeleton />
+
+  return (
+    <div
+      className={cn(
+        'group/card w-full rounded-xl px-3',
+        isFullDocMode ? '' : 'pb-2 pt-2.5 hover:bg-dataset-chunk-detail-card-hover-bg',
+        focused.segmentContent ? 'bg-dataset-chunk-detail-card-hover-bg' : '',
+        className,
+      )}
+      onClick={handleClickCard}
+    >
+      <div className='relative flex h-5 items-center justify-between'>
+        <>
+          <div className='flex items-center gap-x-2'>
+            <SegmentIndexTag
+              className={cn(contentOpacity)}
+              iconClassName={focused.segmentIndex ? 'text-text-accent' : ''}
+              labelClassName={focused.segmentIndex ? 'text-text-accent' : ''}
+              positionId={position}
+              label={isFullDocMode ? labelPrefix : ''}
+              labelPrefix={labelPrefix}
+            />
+            <Dot />
+            <div className={cn('system-xs-medium text-text-tertiary', contentOpacity)}>{wordCountText}</div>
+            <Dot />
+            <div className={cn('system-xs-medium text-text-tertiary', contentOpacity)}>{`${formatNumber(hit_count)} ${t('datasetDocuments.segment.hitCount')}`}</div>
+            {chunkEdited && (
+              <>
+                <Dot />
+                <Badge text={t('datasetDocuments.segment.edited') as string} uppercase className={contentOpacity} />
+              </>
+            )}
+          </div>
+          {!isFullDocMode
+            ? <div className='flex items-center'>
+              <StatusItem status={enabled ? 'enabled' : 'disabled'} reverse textCls="text-text-tertiary system-xs-regular" />
+              {embeddingAvailable && (
+                <div className="absolute -right-2.5 -top-2 z-20 hidden items-center gap-x-0.5 rounded-[10px] border-[0.5px]
+                      border-components-actionbar-border bg-components-actionbar-bg p-1 shadow-md backdrop-blur-[5px] group-hover/card:flex">
+                  {!archived && (
+                    <>
+                      <Tooltip
+                        popupContent='Edit'
+                        popupClassName='text-text-secondary system-xs-medium'
+                      >
+                        <div
+                          className='flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-lg hover:bg-state-base-hover'
+                          onClick={(e) => {
+                            e.stopPropagation()
+                            onClickEdit?.()
+                          }}>
+                          <RiEditLine className='h-4 w-4 text-text-tertiary' />
+                        </div>
+                      </Tooltip>
+                      <Tooltip
+                        popupContent='Delete'
+                        popupClassName='text-text-secondary system-xs-medium'
+                      >
+                        <div className='group/delete flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-lg hover:bg-state-destructive-hover'
+                          onClick={(e) => {
+                            e.stopPropagation()
+                            setShowModal(true)
+                          }
+                          }>
+                          <RiDeleteBinLine className='h-4 w-4 text-text-tertiary group-hover/delete:text-text-destructive' />
+                        </div>
+                      </Tooltip>
+                      <Divider type="vertical" className="h-3.5 bg-divider-regular" />
+                    </>
+                  )}
+                  <div
+                    onClick={(e: React.MouseEvent<HTMLDivElement, MouseEvent>) =>
+                      e.stopPropagation()
+                    }
+                    className="flex items-center"
+                  >
+                    <Switch
+                      size='md'
+                      disabled={archived || detail?.status !== 'completed'}
+                      defaultValue={enabled}
+                      onChange={async (val) => {
+                        await onChangeSwitch?.(val, id)
+                      }}
+                    />
+                  </div>
+                </div>
+              )}
+            </div>
+            : null}
+        </>
+      </div>
+      <ChunkContent
+        detail={{
+          answer,
+          content,
+          sign_content,
+        }}
+        isFullDocMode={isFullDocMode}
+        className={contentOpacity}
+      />
+      {isGeneralMode && <div className={cn('flex flex-wrap items-center gap-2 py-1.5', contentOpacity)}>
+        {keywords?.map(keyword => <Tag key={keyword} text={keyword} />)}
+      </div>}
+      {
+        isFullDocMode
+          ? <button
+            type='button'
+            className='system-xs-semibold-uppercase mb-2 mt-0.5 text-text-accent'
+            onClick={() => onClick?.()}
+          >{t('common.operation.viewMore')}</button>
+          : null
+      }
+      {
+        isParagraphMode && child_chunks.length > 0
+          && <ChildSegmentList
+            parentChunkId={id}
+            childChunks={child_chunks}
+            enabled={enabled}
+            onDelete={onDeleteChildChunk!}
+            handleAddNewChildChunk={handleAddNewChildChunk}
+            onClickSlice={onClickSlice}
+            focused={focused.segmentContent}
+          />
+      }
+      {showModal
+        && <Confirm
+          isShow={showModal}
+          title={t('datasetDocuments.segment.delete')}
+          confirmText={t('common.operation.sure')}
+          onConfirm={async () => { await onDelete?.(id) }}
+          onCancel={() => setShowModal(false)}
+        />
+      }
+    </div>
+  )
+}
+
+export default React.memo(SegmentCard)
diff --git a/app/components/datasets/documents/detail/completed/segment-detail.tsx b/app/components/datasets/documents/detail/completed/segment-detail.tsx
new file mode 100644
index 0000000..d3575c1
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/segment-detail.tsx
@@ -0,0 +1,185 @@
+import React, { type FC, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiCloseLine,
+  RiCollapseDiagonalLine,
+  RiExpandDiagonalLine,
+} from '@remixicon/react'
+import { useDocumentContext } from '../index'
+import ActionButtons from './common/action-buttons'
+import ChunkContent from './common/chunk-content'
+import Keywords from './common/keywords'
+import RegenerationModal from './common/regeneration-modal'
+import { SegmentIndexTag } from './common/segment-index-tag'
+import Dot from './common/dot'
+import { useSegmentListContext } from './index'
+import { ChunkingMode, type SegmentDetailModel } from '@/models/datasets'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { formatNumber } from '@/utils/format'
+import classNames from '@/utils/classnames'
+import Divider from '@/app/components/base/divider'
+
+type ISegmentDetailProps = {
+  segInfo?: Partial<SegmentDetailModel> & { id: string }
+  onUpdate: (segmentId: string, q: string, a: string, k: string[], needRegenerate?: boolean) => void
+  onCancel: () => void
+  isEditMode?: boolean
+  docForm: ChunkingMode
+}
+
+/**
+ * Show all the contents of the segment
+ */
+const SegmentDetail: FC<ISegmentDetailProps> = ({
+  segInfo,
+  onUpdate,
+  onCancel,
+  isEditMode,
+  docForm,
+}) => {
+  const { t } = useTranslation()
+  const [question, setQuestion] = useState(isEditMode ? segInfo?.content || '' : segInfo?.sign_content || '')
+  const [answer, setAnswer] = useState(segInfo?.answer || '')
+  const [keywords, setKeywords] = useState<string[]>(segInfo?.keywords || [])
+  const { eventEmitter } = useEventEmitterContextContext()
+  const [loading, setLoading] = useState(false)
+  const [showRegenerationModal, setShowRegenerationModal] = useState(false)
+  const fullScreen = useSegmentListContext(s => s.fullScreen)
+  const toggleFullScreen = useSegmentListContext(s => s.toggleFullScreen)
+  const mode = useDocumentContext(s => s.mode)
+  const parentMode = useDocumentContext(s => s.parentMode)
+
+  eventEmitter?.useSubscription((v) => {
+    if (v === 'update-segment')
+      setLoading(true)
+    if (v === 'update-segment-done')
+      setLoading(false)
+  })
+
+  const handleCancel = () => {
+    onCancel()
+  }
+
+  const handleSave = () => {
+    onUpdate(segInfo?.id || '', question, answer, keywords)
+  }
+
+  const handleRegeneration = () => {
+    setShowRegenerationModal(true)
+  }
+
+  const onCancelRegeneration = () => {
+    setShowRegenerationModal(false)
+  }
+
+  const onConfirmRegeneration = () => {
+    onUpdate(segInfo?.id || '', question, answer, keywords, true)
+  }
+
+  const isParentChildMode = useMemo(() => {
+    return mode === 'hierarchical'
+  }, [mode])
+
+  const isFullDocMode = useMemo(() => {
+    return mode === 'hierarchical' && parentMode === 'full-doc'
+  }, [mode, parentMode])
+
+  const titleText = useMemo(() => {
+    return isEditMode ? t('datasetDocuments.segment.editChunk') : t('datasetDocuments.segment.chunkDetail')
+  }, [isEditMode, t])
+
+  const isQAModel = useMemo(() => {
+    return docForm === ChunkingMode.qa
+  }, [docForm])
+
+  const wordCountText = useMemo(() => {
+    const contentLength = isQAModel ? (question.length + answer.length) : question.length
+    const total = formatNumber(isEditMode ? contentLength : segInfo!.word_count as number)
+    const count = isEditMode ? contentLength : segInfo!.word_count as number
+    return `${total} ${t('datasetDocuments.segment.characters', { count })}`
+  }, [isEditMode, question.length, answer.length, isQAModel, segInfo, t])
+
+  const labelPrefix = useMemo(() => {
+    return isParentChildMode ? t('datasetDocuments.segment.parentChunk') : t('datasetDocuments.segment.chunk')
+  }, [isParentChildMode, t])
+
+  return (
+    <div className={'flex h-full flex-col'}>
+      <div className={classNames('flex items-center justify-between', fullScreen ? 'py-3 pr-4 pl-6 border border-divider-subtle' : 'pt-3 pr-3 pl-4')}>
+        <div className='flex flex-col'>
+          <div className='system-xl-semibold text-text-primary'>{titleText}</div>
+          <div className='flex items-center gap-x-2'>
+            <SegmentIndexTag positionId={segInfo?.position || ''} label={isFullDocMode ? labelPrefix : ''} labelPrefix={labelPrefix} />
+            <Dot />
+            <span className='system-xs-medium text-text-tertiary'>{wordCountText}</span>
+          </div>
+        </div>
+        <div className='flex items-center'>
+          {isEditMode && fullScreen && (
+            <>
+              <ActionButtons
+                handleCancel={handleCancel}
+                handleRegeneration={handleRegeneration}
+                handleSave={handleSave}
+                loading={loading}
+              />
+              <Divider type='vertical' className='ml-4 mr-2 h-3.5 bg-divider-regular' />
+            </>
+          )}
+          <div className='mr-1 flex h-8 w-8 cursor-pointer items-center justify-center p-1.5' onClick={toggleFullScreen}>
+            {fullScreen ? <RiCollapseDiagonalLine className='h-4 w-4 text-text-tertiary' /> : <RiExpandDiagonalLine className='h-4 w-4 text-text-tertiary' />}
+          </div>
+          <div className='flex h-8 w-8 cursor-pointer items-center justify-center p-1.5' onClick={onCancel}>
+            <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+        </div>
+      </div>
+      <div className={classNames(
+        'flex grow',
+        fullScreen ? 'w-full flex-row justify-center px-6 pt-6 gap-x-8' : 'flex-col gap-y-1 py-3 px-4',
+        !isEditMode && 'pb-0 overflow-hidden',
+      )}>
+        <div className={classNames(isEditMode ? 'break-all whitespace-pre-line overflow-hidden' : 'overflow-y-auto', fullScreen ? 'w-1/2' : 'grow')}>
+          <ChunkContent
+            docForm={docForm}
+            question={question}
+            answer={answer}
+            onQuestionChange={question => setQuestion(question)}
+            onAnswerChange={answer => setAnswer(answer)}
+            isEditMode={isEditMode}
+          />
+        </div>
+        {mode === 'custom' && <Keywords
+          className={fullScreen ? 'w-1/5' : ''}
+          actionType={isEditMode ? 'edit' : 'view'}
+          segInfo={segInfo}
+          keywords={keywords}
+          isEditMode={isEditMode}
+          onKeywordsChange={keywords => setKeywords(keywords)}
+        />}
+      </div>
+      {isEditMode && !fullScreen && (
+        <div className='flex items-center justify-end border-t-[1px] border-t-divider-subtle p-4 pt-3'>
+          <ActionButtons
+            handleCancel={handleCancel}
+            handleRegeneration={handleRegeneration}
+            handleSave={handleSave}
+            loading={loading}
+          />
+        </div>
+      )}
+      {
+        showRegenerationModal && (
+          <RegenerationModal
+            isShow={showRegenerationModal}
+            onConfirm={onConfirmRegeneration}
+            onCancel={onCancelRegeneration}
+            onClose={onCancelRegeneration}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default React.memo(SegmentDetail)
diff --git a/app/components/datasets/documents/detail/completed/segment-list.tsx b/app/components/datasets/documents/detail/completed/segment-list.tsx
new file mode 100644
index 0000000..f6076e5
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/segment-list.tsx
@@ -0,0 +1,119 @@
+import React, { useMemo } from 'react'
+import { useDocumentContext } from '../index'
+import SegmentCard from './segment-card'
+import Empty from './common/empty'
+import GeneralListSkeleton from './skeleton/general-list-skeleton'
+import ParagraphListSkeleton from './skeleton/paragraph-list-skeleton'
+import { useSegmentListContext } from './index'
+import type { ChildChunkDetail, SegmentDetailModel } from '@/models/datasets'
+import Checkbox from '@/app/components/base/checkbox'
+import Divider from '@/app/components/base/divider'
+
+type ISegmentListProps = {
+  isLoading: boolean
+  items: SegmentDetailModel[]
+  selectedSegmentIds: string[]
+  onSelected: (segId: string) => void
+  onClick: (detail: SegmentDetailModel, isEditMode?: boolean) => void
+  onChangeSwitch: (enabled: boolean, segId?: string,) => Promise<void>
+  onDelete: (segId: string) => Promise<void>
+  onDeleteChildChunk: (sgId: string, childChunkId: string) => Promise<void>
+  handleAddNewChildChunk: (parentChunkId: string) => void
+  onClickSlice: (childChunk: ChildChunkDetail) => void
+  archived?: boolean
+  embeddingAvailable: boolean
+  onClearFilter: () => void
+}
+
+const SegmentList = (
+  {
+    ref,
+    isLoading,
+    items,
+    selectedSegmentIds,
+    onSelected,
+    onClick: onClickCard,
+    onChangeSwitch,
+    onDelete,
+    onDeleteChildChunk,
+    handleAddNewChildChunk,
+    onClickSlice,
+    archived,
+    embeddingAvailable,
+    onClearFilter,
+  }: ISegmentListProps & {
+    ref: React.LegacyRef<HTMLDivElement>
+  },
+) => {
+  const mode = useDocumentContext(s => s.mode)
+  const parentMode = useDocumentContext(s => s.parentMode)
+  const currSegment = useSegmentListContext(s => s.currSegment)
+  const currChildChunk = useSegmentListContext(s => s.currChildChunk)
+
+  const Skeleton = useMemo(() => {
+    return (mode === 'hierarchical' && parentMode === 'paragraph') ? ParagraphListSkeleton : GeneralListSkeleton
+  }, [mode, parentMode])
+
+  // Loading skeleton
+  if (isLoading)
+    return <Skeleton />
+  // Search result is empty
+  if (items.length === 0) {
+    return (
+      <div className='h-full pl-6'>
+        <Empty onClearFilter={onClearFilter} />
+      </div>
+    )
+  }
+  return (
+    <div ref={ref} className={'flex grow flex-col overflow-y-auto'}>
+      {
+        items.map((segItem) => {
+          const isLast = items[items.length - 1].id === segItem.id
+          const segmentIndexFocused
+            = currSegment?.segInfo?.id === segItem.id
+            || (!currSegment && currChildChunk?.childChunkInfo?.segment_id === segItem.id)
+          const segmentContentFocused = currSegment?.segInfo?.id === segItem.id
+            || currChildChunk?.childChunkInfo?.segment_id === segItem.id
+          return (
+            <div key={segItem.id} className='flex items-start gap-x-2'>
+              <Checkbox
+                key={`${segItem.id}-checkbox`}
+                className='mt-3.5 shrink-0'
+                checked={selectedSegmentIds.includes(segItem.id)}
+                onCheck={() => onSelected(segItem.id)}
+              />
+              <div className='min-w-0 grow'>
+                <SegmentCard
+                  key={`${segItem.id}-card`}
+                  detail={segItem}
+                  onClick={() => onClickCard(segItem, true)}
+                  onChangeSwitch={onChangeSwitch}
+                  onClickEdit={() => onClickCard(segItem, true)}
+                  onDelete={onDelete}
+                  onDeleteChildChunk={onDeleteChildChunk}
+                  handleAddNewChildChunk={handleAddNewChildChunk}
+                  onClickSlice={onClickSlice}
+                  loading={false}
+                  archived={archived}
+                  embeddingAvailable={embeddingAvailable}
+                  focused={{
+                    segmentIndex: segmentIndexFocused,
+                    segmentContent: segmentContentFocused,
+                  }}
+                />
+                {!isLast && <div className='w-full px-3'>
+                  <Divider type='horizontal' className='my-1 bg-divider-subtle' />
+                </div>}
+              </div>
+            </div>
+          )
+        })
+      }
+    </div>
+  )
+}
+
+SegmentList.displayName = 'SegmentList'
+
+export default SegmentList
diff --git a/app/components/datasets/documents/detail/completed/skeleton/full-doc-list-skeleton.tsx b/app/components/datasets/documents/detail/completed/skeleton/full-doc-list-skeleton.tsx
new file mode 100644
index 0000000..cc7daa5
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/skeleton/full-doc-list-skeleton.tsx
@@ -0,0 +1,25 @@
+import React from 'react'
+
+const Slice = React.memo(() => {
+  return (
+    <div className='flex flex-col gap-y-1'>
+      <div className='flex h-5 w-full items-center bg-state-base-hover'>
+        <span className='h-5 w-[30px] bg-state-base-hover-alt' />
+      </div>
+      <div className='h-5 w-2/3 bg-state-base-hover' />
+    </div>
+  )
+})
+
+Slice.displayName = 'Slice'
+
+const FullDocListSkeleton = () => {
+  return (
+    <div className='relative z-10 flex w-full grow flex-col gap-y-3 overflow-y-hidden'>
+      <div className='absolute bottom-14 left-0 top-0 z-20 h-full w-full bg-dataset-chunk-list-mask-bg' />
+      {[...Array.from({ length: 15 })].map((_, index) => <Slice key={index} />)}
+    </div>
+  )
+}
+
+export default React.memo(FullDocListSkeleton)
diff --git a/app/components/datasets/documents/detail/completed/skeleton/general-list-skeleton.tsx b/app/components/datasets/documents/detail/completed/skeleton/general-list-skeleton.tsx
new file mode 100644
index 0000000..bf22a53
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/skeleton/general-list-skeleton.tsx
@@ -0,0 +1,74 @@
+import React from 'react'
+import {
+  SkeletonContainer,
+  SkeletonPoint,
+  SkeletonRectangle,
+  SkeletonRow,
+} from '@/app/components/base/skeleton'
+import Checkbox from '@/app/components/base/checkbox'
+import Divider from '@/app/components/base/divider'
+
+export const CardSkelton = React.memo(() => {
+  return (
+    <SkeletonContainer className='gap-y-0 p-1 pb-2'>
+      <SkeletonContainer className='gap-y-0.5 px-2 pt-1.5'>
+        <SkeletonRow className='py-0.5'>
+          <SkeletonRectangle className='w-[72px] bg-text-quaternary' />
+          <SkeletonPoint className='opacity-20' />
+          <SkeletonRectangle className='w-24 bg-text-quaternary' />
+          <SkeletonPoint className='opacity-20' />
+          <SkeletonRectangle className='w-24 bg-text-quaternary' />
+          <SkeletonRow className='grow justify-end gap-1'>
+            <SkeletonRectangle className='w-12 bg-text-quaternary' />
+            <SkeletonRectangle className='mx-1 w-2 bg-text-quaternary' />
+          </SkeletonRow>
+        </SkeletonRow>
+        <SkeletonRow className='py-0.5'>
+          <SkeletonRectangle className='w-full bg-text-quaternary' />
+        </SkeletonRow>
+        <SkeletonRow className='py-0.5'>
+          <SkeletonRectangle className='w-full bg-text-quaternary' />
+        </SkeletonRow>
+        <SkeletonRow className='py-0.5'>
+          <SkeletonRectangle className='w-2/3 bg-text-quaternary' />
+        </SkeletonRow>
+      </SkeletonContainer>
+      <SkeletonContainer className='px-2 py-1.5'>
+        <SkeletonRow>
+          <SkeletonRectangle className='w-14 bg-text-quaternary' />
+          <SkeletonRectangle className='w-[88px] bg-text-quaternary' />
+          <SkeletonRectangle className='w-14 bg-text-quaternary' />
+        </SkeletonRow>
+      </SkeletonContainer>
+    </SkeletonContainer>
+  )
+})
+
+CardSkelton.displayName = 'CardSkelton'
+
+const GeneralListSkeleton = () => {
+  return (
+    <div className='relative z-10 flex grow flex-col overflow-y-hidden'>
+      <div className='absolute left-0 top-0 z-20 h-full w-full bg-dataset-chunk-list-mask-bg' />
+      {[...Array.from({ length: 10 })].map((_, index) => {
+        return (
+          <div key={index} className='flex items-start gap-x-2'>
+            <Checkbox
+              key={`${index}-checkbox`}
+              className='mt-3.5 shrink-0'
+              disabled
+            />
+            <div className='grow'>
+              <CardSkelton />
+              {index !== 9 && <div className='w-full px-3'>
+                <Divider type='horizontal' className='my-1 bg-divider-subtle' />
+              </div>}
+            </div>
+          </div>
+        )
+      })}
+    </div>
+  )
+}
+
+export default React.memo(GeneralListSkeleton)
diff --git a/app/components/datasets/documents/detail/completed/skeleton/paragraph-list-skeleton.tsx b/app/components/datasets/documents/detail/completed/skeleton/paragraph-list-skeleton.tsx
new file mode 100644
index 0000000..eb01feb
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/skeleton/paragraph-list-skeleton.tsx
@@ -0,0 +1,76 @@
+import React from 'react'
+import { RiArrowRightSLine } from '@remixicon/react'
+import {
+  SkeletonContainer,
+  SkeletonPoint,
+  SkeletonRectangle,
+  SkeletonRow,
+} from '@/app/components/base/skeleton'
+import Checkbox from '@/app/components/base/checkbox'
+import Divider from '@/app/components/base/divider'
+
+const CardSkelton = React.memo(() => {
+  return (
+    <SkeletonContainer className='gap-y-0 p-1 pb-2'>
+      <SkeletonContainer className='gap-y-0.5 px-2 pt-1.5'>
+        <SkeletonRow className='py-0.5'>
+          <SkeletonRectangle className='w-[72px] bg-text-quaternary' />
+          <SkeletonPoint className='opacity-20' />
+          <SkeletonRectangle className='w-24 bg-text-quaternary' />
+          <SkeletonPoint className='opacity-20' />
+          <SkeletonRectangle className='w-24 bg-text-quaternary' />
+          <SkeletonRow className='grow justify-end gap-1'>
+            <SkeletonRectangle className='w-12 bg-text-quaternary' />
+            <SkeletonRectangle className='mx-1 w-2 bg-text-quaternary' />
+          </SkeletonRow>
+        </SkeletonRow>
+        <SkeletonRow className='py-0.5'>
+          <SkeletonRectangle className='w-full bg-text-quaternary' />
+        </SkeletonRow>
+        <SkeletonRow className='py-0.5'>
+          <SkeletonRectangle className='w-full bg-text-quaternary' />
+        </SkeletonRow>
+        <SkeletonRow className='py-0.5'>
+          <SkeletonRectangle className='w-2/3 bg-text-quaternary' />
+        </SkeletonRow>
+      </SkeletonContainer>
+      <SkeletonContainer className='p-1 pb-2'>
+        <SkeletonRow>
+          <SkeletonRow className='h-7 gap-x-0.5 rounded-lg bg-dataset-child-chunk-expand-btn-bg pl-1 pr-3'>
+            <RiArrowRightSLine className='h-4 w-4 text-text-secondary opacity-20' />
+            <SkeletonRectangle className='w-32 bg-text-quaternary' />
+          </SkeletonRow>
+        </SkeletonRow>
+      </SkeletonContainer>
+    </SkeletonContainer>
+  )
+})
+
+CardSkelton.displayName = 'CardSkelton'
+
+const ParagraphListSkeleton = () => {
+  return (
+    <div className='relative z-10 flex h-full flex-col overflow-y-hidden'>
+      <div className='absolute left-0 top-0 z-20 h-full w-full bg-dataset-chunk-list-mask-bg' />
+      {[...Array.from({ length: 10 })].map((_, index) => {
+        return (
+          <div key={index} className='flex items-start gap-x-2'>
+            <Checkbox
+              key={`${index}-checkbox`}
+              className='mt-3.5 shrink-0'
+              disabled
+            />
+            <div className='grow'>
+              <CardSkelton />
+              {index !== 9 && <div className='w-full px-3'>
+                <Divider type='horizontal' className='my-1 bg-divider-subtle' />
+              </div>}
+            </div>
+          </div>
+        )
+      })}
+    </div>
+  )
+}
+
+export default React.memo(ParagraphListSkeleton)
diff --git a/app/components/datasets/documents/detail/completed/skeleton/parent-chunk-card-skeleton.tsx b/app/components/datasets/documents/detail/completed/skeleton/parent-chunk-card-skeleton.tsx
new file mode 100644
index 0000000..f22024b
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/skeleton/parent-chunk-card-skeleton.tsx
@@ -0,0 +1,45 @@
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  SkeletonContainer,
+  SkeletonPoint,
+  SkeletonRectangle,
+  SkeletonRow,
+} from '@/app/components/base/skeleton'
+
+const ParentChunkCardSkelton = () => {
+  const { t } = useTranslation()
+  return (
+    <div className='flex flex-col pb-2'>
+      <SkeletonContainer className='gap-y-0 p-1 pb-0'>
+        <SkeletonContainer className='gap-y-0.5 px-2 pt-1.5'>
+          <SkeletonRow className='py-0.5'>
+            <SkeletonRectangle className='w-[72px] bg-text-quaternary' />
+            <SkeletonPoint className='opacity-20' />
+            <SkeletonRectangle className='w-24 bg-text-quaternary' />
+            <SkeletonPoint className='opacity-20' />
+            <SkeletonRectangle className='w-24 bg-text-quaternary' />
+          </SkeletonRow>
+          <SkeletonRow className='py-0.5'>
+            <SkeletonRectangle className='w-full bg-text-quaternary' />
+          </SkeletonRow>
+          <SkeletonRow className='py-0.5'>
+            <SkeletonRectangle className='w-full bg-text-quaternary' />
+          </SkeletonRow>
+          <SkeletonRow className='py-0.5'>
+            <SkeletonRectangle className='w-2/3 bg-text-quaternary' />
+          </SkeletonRow>
+        </SkeletonContainer>
+      </SkeletonContainer>
+      <div className='mt-0.5 flex items-center px-3'>
+        <button type='button' className='system-xs-semibold-uppercase pt-0.5 text-components-button-secondary-accent-text-disabled' disabled>
+          {t('common.operation.viewMore')}
+        </button>
+      </div>
+    </div>
+  )
+}
+
+ParentChunkCardSkelton.displayName = 'ParentChunkCardSkelton'
+
+export default React.memo(ParentChunkCardSkelton)
diff --git a/app/components/datasets/documents/detail/completed/status-item.tsx b/app/components/datasets/documents/detail/completed/status-item.tsx
new file mode 100644
index 0000000..04fbea3
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/status-item.tsx
@@ -0,0 +1,22 @@
+import React, { type FC } from 'react'
+import { RiCheckLine } from '@remixicon/react'
+import type { Item } from '@/app/components/base/select'
+
+type IStatusItemProps = {
+  item: Item
+  selected: boolean
+}
+
+const StatusItem: FC<IStatusItemProps> = ({
+  item,
+  selected,
+}) => {
+  return (
+    <div className='flex items-center justify-between px-2 py-1.5'>
+      <span className='system-md-regular'>{item.name}</span>
+      {selected && <RiCheckLine className='h-4 w-4 text-text-accent' />}
+    </div>
+  )
+}
+
+export default React.memo(StatusItem)
diff --git a/app/components/datasets/documents/detail/completed/style.module.css b/app/components/datasets/documents/detail/completed/style.module.css
new file mode 100644
index 0000000..902ef22
--- /dev/null
+++ b/app/components/datasets/documents/detail/completed/style.module.css
@@ -0,0 +1,146 @@
+.docSearchWrapper {
+  @apply sticky w-full -top-3 flex items-center mb-3 justify-between z-[11] flex-wrap gap-y-1 pr-3;
+}
+.listContainer {
+  height: calc(100% - 3.25rem);
+  @apply box-border pb-[30px];
+}
+.cardWrapper {
+  @apply grid gap-4 grid-cols-3 min-w-[902px] last:mb-[30px];
+}
+.segWrapper {
+  @apply box-border h-[180px] w-full xl:min-w-[290px] bg-gray-50 px-4 pt-4 flex flex-col text-opacity-50 rounded-xl border border-transparent hover:border-gray-200 hover:shadow-lg hover:cursor-pointer hover:bg-white;
+}
+.segTitleWrapper {
+  @apply flex items-center justify-between;
+}
+.segStatusWrapper {
+  @apply flex items-center box-border;
+}
+.segContent {
+  white-space: wrap;
+  @apply flex-1 h-0 min-h-0 mt-2 text-sm text-gray-800 overflow-ellipsis overflow-hidden from-gray-800 to-white;
+}
+.segData {
+  @apply hidden text-gray-500 text-xs pt-2;
+}
+.segDataText {
+  @apply max-w-[80px] truncate;
+}
+.chartLinkText {
+  background: linear-gradient(to left, white, 90%, transparent);
+  @apply text-primary-600 font-semibold text-xs absolute right-0 hidden h-12 pl-12 items-center;
+}
+.select {
+  @apply h-8 py-0 pr-5 w-[100px] shadow-none !important;
+}
+.segModalContent {
+  @apply h-96 text-gray-800 text-base break-all overflow-y-scroll;
+  white-space: pre-line;
+}
+.footer {
+  @apply flex items-center justify-between box-border border-t-gray-200 border-t-[0.5px] pt-3 mt-4 flex-wrap gap-y-2;
+}
+.numberInfo {
+  @apply text-gray-500 text-xs font-medium;
+}
+.keywordTitle {
+  @apply text-gray-500 mb-2 mt-1 text-xs uppercase;
+}
+.keywordWrapper {
+  @apply text-gray-700 w-full max-h-[200px] overflow-auto flex flex-wrap;
+}
+.keyword {
+  @apply text-sm border border-gray-200 max-w-[200px] max-h-[100px] whitespace-pre-line overflow-y-auto mr-1 mb-2 last:mr-0 px-2 py-1 rounded-lg;
+}
+.hashText {
+  @apply w-48 inline-block truncate;
+}
+.commonIcon {
+  @apply w-3 h-3 inline-block align-middle mr-1 bg-gray-500;
+  mask-repeat: no-repeat;
+  mask-size: contain;
+  mask-position: center center;
+}
+.targetIcon {
+  mask-image: url(../../assets/target.svg);
+}
+.typeSquareIcon {
+  mask-image: url(../../assets/typeSquare.svg);
+}
+.bezierCurveIcon {
+  mask-image: url(../../assets/bezierCurve.svg);
+}
+.cardLoadingWrapper {
+  @apply relative w-full h-full inline-block rounded-b-xl;
+  background-position: center center;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-origin: content-box;
+}
+.cardLoadingIcon {
+  background-image: url(../../assets/cardLoading.svg);
+}
+/* .hitLoadingIcon {
+  background-image: url(../../assets/hitLoading.svg);
+} */
+.cardLoadingBg {
+  @apply h-full relative rounded-b-xl mt-4;
+  left: calc(-1rem - 1px);
+  width: calc(100% + 2rem + 2px);
+  height: calc(100% - 1rem + 1px);
+  background: linear-gradient(
+    180deg,
+    rgba(252, 252, 253, 0) 0%,
+    #fcfcfd 74.15%
+  );
+}
+
+.hitTitleWrapper {
+  @apply w-full flex items-center justify-between mb-2;
+}
+.progressWrapper {
+  @apply flex items-center justify-between w-full;
+}
+.progress {
+  border-radius: 3px;
+  @apply relative h-1.5 box-border border border-gray-300 flex-1 mr-2;
+}
+.progressLoading {
+  @apply border-[#EAECF0] bg-[#EAECF0];
+}
+.progressInner {
+  @apply absolute top-0 h-full bg-gray-300;
+}
+.progressText {
+  font-size: 13px;
+  @apply text-gray-700 font-bold;
+}
+.progressTextLoading {
+  border-radius: 5px;
+  @apply h-3.5 w-3.5 bg-[#EAECF0];
+}
+.editTip {
+  box-shadow: 0px 4px 6px -2px rgba(16, 24, 40, 0.03), 0px 12px 16px -4px rgba(16, 24, 40, 0.08);
+}
+
+.delModal {
+  background: linear-gradient(
+      180deg,
+      rgba(217, 45, 32, 0.05) 0%,
+      rgba(217, 45, 32, 0) 24.02%
+    ),
+    #f9fafb;
+  box-shadow: 0px 20px 24px -4px rgba(16, 24, 40, 0.08),
+    0px 8px 8px -4px rgba(16, 24, 40, 0.03);
+  @apply rounded-2xl p-8;
+}
+.warningWrapper {
+  box-shadow: 0px 20px 24px -4px rgba(16, 24, 40, 0.08),
+    0px 8px 8px -4px rgba(16, 24, 40, 0.03);
+  background: rgba(255, 255, 255, 0.9);
+  @apply h-12 w-12 border-[0.5px] border-gray-100 rounded-xl mb-3 flex items-center justify-center;
+}
+.warningIcon {
+  @apply w-[22px] h-[22px] fill-current text-red-600;
+}
diff --git a/app/components/datasets/documents/detail/embedding/index.tsx b/app/components/datasets/documents/detail/embedding/index.tsx
new file mode 100644
index 0000000..e9ea72b
--- /dev/null
+++ b/app/components/datasets/documents/detail/embedding/index.tsx
@@ -0,0 +1,314 @@
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import useSWR from 'swr'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import { omit } from 'lodash-es'
+import { RiLoader2Line, RiPauseCircleLine, RiPlayCircleLine } from '@remixicon/react'
+import Image from 'next/image'
+import { FieldInfo } from '../metadata'
+import { useDocumentContext } from '../index'
+import { IndexingType } from '../../../create/step-two'
+import { indexMethodIcon, retrievalIcon } from '../../../create/icons'
+import EmbeddingSkeleton from './skeleton'
+import { RETRIEVE_METHOD } from '@/types/app'
+import cn from '@/utils/classnames'
+import Divider from '@/app/components/base/divider'
+import { ToastContext } from '@/app/components/base/toast'
+import type { IndexingStatusResponse } from '@/models/datasets'
+import { ProcessMode, type ProcessRuleResponse } from '@/models/datasets'
+import type { CommonResponse } from '@/models/common'
+import { asyncRunSafe, sleep } from '@/utils'
+import {
+  fetchIndexingStatus as doFetchIndexingStatus,
+  fetchProcessRule,
+  pauseDocIndexing,
+  resumeDocIndexing,
+} from '@/service/datasets'
+
+type IEmbeddingDetailProps = {
+  datasetId?: string
+  documentId?: string
+  indexingType?: IndexingType
+  retrievalMethod?: RETRIEVE_METHOD
+  detailUpdate: VoidFunction
+}
+
+type IRuleDetailProps = {
+  sourceData?: ProcessRuleResponse
+  indexingType?: IndexingType
+  retrievalMethod?: RETRIEVE_METHOD
+}
+
+const RuleDetail: FC<IRuleDetailProps> = React.memo(({
+  sourceData,
+  indexingType,
+  retrievalMethod,
+}) => {
+  const { t } = useTranslation()
+
+  const segmentationRuleMap = {
+    mode: t('datasetDocuments.embedding.mode'),
+    segmentLength: t('datasetDocuments.embedding.segmentLength'),
+    textCleaning: t('datasetDocuments.embedding.textCleaning'),
+  }
+
+  const getRuleName = (key: string) => {
+    if (key === 'remove_extra_spaces')
+      return t('datasetCreation.stepTwo.removeExtraSpaces')
+
+    if (key === 'remove_urls_emails')
+      return t('datasetCreation.stepTwo.removeUrlEmails')
+
+    if (key === 'remove_stopwords')
+      return t('datasetCreation.stepTwo.removeStopwords')
+  }
+
+  const isNumber = (value: unknown) => {
+    return typeof value === 'number'
+  }
+
+  const getValue = useCallback((field: string) => {
+    let value: string | number | undefined = '-'
+    const maxTokens = isNumber(sourceData?.rules?.segmentation?.max_tokens)
+      ? sourceData.rules.segmentation.max_tokens
+      : value
+    const childMaxTokens = isNumber(sourceData?.rules?.subchunk_segmentation?.max_tokens)
+      ? sourceData.rules.subchunk_segmentation.max_tokens
+      : value
+    switch (field) {
+      case 'mode':
+        value = !sourceData?.mode
+          ? value
+          : sourceData.mode === ProcessMode.general
+            ? (t('datasetDocuments.embedding.custom') as string)
+            : `${t('datasetDocuments.embedding.hierarchical')} 路 ${sourceData?.rules?.parent_mode === 'paragraph'
+              ? t('dataset.parentMode.paragraph')
+              : t('dataset.parentMode.fullDoc')}`
+        break
+      case 'segmentLength':
+        value = !sourceData?.mode
+          ? value
+          : sourceData.mode === ProcessMode.general
+            ? maxTokens
+            : `${t('datasetDocuments.embedding.parentMaxTokens')} ${maxTokens}; ${t('datasetDocuments.embedding.childMaxTokens')} ${childMaxTokens}`
+        break
+      default:
+        value = !sourceData?.mode
+          ? value
+          : sourceData?.rules?.pre_processing_rules?.filter(rule =>
+            rule.enabled).map(rule => getRuleName(rule.id)).join(',')
+        break
+    }
+    return value
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [sourceData])
+
+  return <div className='py-3'>
+    <div className='flex flex-col gap-y-1'>
+      {Object.keys(segmentationRuleMap).map((field) => {
+        return <FieldInfo
+          key={field}
+          label={segmentationRuleMap[field as keyof typeof segmentationRuleMap]}
+          displayedValue={String(getValue(field))}
+        />
+      })}
+    </div>
+    <Divider type='horizontal' className='bg-divider-subtle' />
+    <FieldInfo
+      label={t('datasetCreation.stepTwo.indexMode')}
+      displayedValue={t(`datasetCreation.stepTwo.${indexingType === IndexingType.ECONOMICAL ? 'economical' : 'qualified'}`) as string}
+      valueIcon={
+        <Image
+          className='size-4'
+          src={
+            indexingType === IndexingType.ECONOMICAL
+              ? indexMethodIcon.economical
+              : indexMethodIcon.high_quality
+          }
+          alt=''
+        />
+      }
+    />
+    <FieldInfo
+      label={t('datasetSettings.form.retrievalSetting.title')}
+      displayedValue={t(`dataset.retrieval.${indexingType === IndexingType.ECONOMICAL ? 'invertedIndex' : retrievalMethod}.title`) as string}
+      valueIcon={
+        <Image
+          className='size-4'
+          src={
+            retrievalMethod === RETRIEVE_METHOD.fullText
+              ? retrievalIcon.fullText
+              : retrievalMethod === RETRIEVE_METHOD.hybrid
+                ? retrievalIcon.hybrid
+                : retrievalIcon.vector
+          }
+          alt=''
+        />
+      }
+    />
+  </div>
+})
+
+RuleDetail.displayName = 'RuleDetail'
+
+const EmbeddingDetail: FC<IEmbeddingDetailProps> = ({
+  datasetId: dstId,
+  documentId: docId,
+  detailUpdate,
+  indexingType,
+  retrievalMethod,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+
+  const datasetId = useDocumentContext(s => s.datasetId)
+  const documentId = useDocumentContext(s => s.documentId)
+  const localDatasetId = dstId ?? datasetId
+  const localDocumentId = docId ?? documentId
+
+  const [indexingStatusDetail, setIndexingStatusDetail] = useState<IndexingStatusResponse | null>(null)
+  const fetchIndexingStatus = async () => {
+    const status = await doFetchIndexingStatus({ datasetId: localDatasetId, documentId: localDocumentId })
+    setIndexingStatusDetail(status)
+    return status
+  }
+
+  const isStopQuery = useRef(false)
+  const stopQueryStatus = useCallback(() => {
+    isStopQuery.current = true
+  }, [])
+
+  const startQueryStatus = useCallback(async () => {
+    if (isStopQuery.current)
+      return
+
+    try {
+      const indexingStatusDetail = await fetchIndexingStatus()
+      if (['completed', 'error', 'paused'].includes(indexingStatusDetail?.indexing_status)) {
+        stopQueryStatus()
+        detailUpdate()
+        return
+      }
+
+      await sleep(2500)
+      await startQueryStatus()
+    }
+    catch {
+      await sleep(2500)
+      await startQueryStatus()
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [stopQueryStatus])
+
+  useEffect(() => {
+    isStopQuery.current = false
+    startQueryStatus()
+    return () => {
+      stopQueryStatus()
+    }
+  }, [startQueryStatus, stopQueryStatus])
+
+  const { data: ruleDetail } = useSWR({
+    action: 'fetchProcessRule',
+    params: { documentId: localDocumentId },
+  }, apiParams => fetchProcessRule(omit(apiParams, 'action')), {
+    revalidateOnFocus: false,
+  })
+
+  const isEmbedding = useMemo(() => ['indexing', 'splitting', 'parsing', 'cleaning'].includes(indexingStatusDetail?.indexing_status || ''), [indexingStatusDetail])
+  const isEmbeddingCompleted = useMemo(() => ['completed'].includes(indexingStatusDetail?.indexing_status || ''), [indexingStatusDetail])
+  const isEmbeddingPaused = useMemo(() => ['paused'].includes(indexingStatusDetail?.indexing_status || ''), [indexingStatusDetail])
+  const isEmbeddingError = useMemo(() => ['error'].includes(indexingStatusDetail?.indexing_status || ''), [indexingStatusDetail])
+  const percent = useMemo(() => {
+    const completedCount = indexingStatusDetail?.completed_segments || 0
+    const totalCount = indexingStatusDetail?.total_segments || 0
+    if (totalCount === 0)
+      return 0
+    const percent = Math.round(completedCount * 100 / totalCount)
+    return percent > 100 ? 100 : percent
+  }, [indexingStatusDetail])
+
+  const handleSwitch = async () => {
+    const opApi = isEmbedding ? pauseDocIndexing : resumeDocIndexing
+    const [e] = await asyncRunSafe<CommonResponse>(opApi({ datasetId: localDatasetId, documentId: localDocumentId }) as Promise<CommonResponse>)
+    if (!e) {
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      // if the embedding is resumed from paused, we need to start the query status
+      if (isEmbeddingPaused) {
+        isStopQuery.current = false
+        startQueryStatus()
+        detailUpdate()
+      }
+      setIndexingStatusDetail(null)
+    }
+    else {
+      notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+    }
+  }
+
+  return (
+    <>
+      <div className='flex flex-col gap-y-2 px-16 py-12'>
+        <div className='flex h-6 items-center gap-x-1'>
+          {isEmbedding && <RiLoader2Line className='h-4 w-4 animate-spin text-text-secondary' />}
+          <span className='system-md-semibold-uppercase grow text-text-secondary'>
+            {isEmbedding && t('datasetDocuments.embedding.processing')}
+            {isEmbeddingCompleted && t('datasetDocuments.embedding.completed')}
+            {isEmbeddingPaused && t('datasetDocuments.embedding.paused')}
+            {isEmbeddingError && t('datasetDocuments.embedding.error')}
+          </span>
+          {isEmbedding && (
+            <button
+              type='button'
+              className={`flex items-center gap-x-1 rounded-md border-[0.5px]
+              border-components-button-secondary-border bg-components-button-secondary-bg px-1.5 py-1 shadow-xs shadow-shadow-shadow-3 backdrop-blur-[5px]`}
+              onClick={handleSwitch}
+            >
+              <RiPauseCircleLine className='h-3.5 w-3.5 text-components-button-secondary-text' />
+              <span className='system-xs-medium pr-[3px] text-components-button-secondary-text'>
+                {t('datasetDocuments.embedding.pause')}
+              </span>
+            </button>
+          )}
+          {isEmbeddingPaused && (
+            <button
+              type='button'
+              className={`flex items-center gap-x-1 rounded-md border-[0.5px]
+              border-components-button-secondary-border bg-components-button-secondary-bg px-1.5 py-1 shadow-xs shadow-shadow-shadow-3 backdrop-blur-[5px]`}
+              onClick={handleSwitch}
+            >
+              <RiPlayCircleLine className='h-3.5 w-3.5 text-components-button-secondary-text' />
+              <span className='system-xs-medium pr-[3px] text-components-button-secondary-text'>
+                {t('datasetDocuments.embedding.resume')}
+              </span>
+            </button>
+          )}
+        </div>
+        {/* progress bar */}
+        <div className={cn(
+          'flex h-2 w-full items-center overflow-hidden rounded-md border border-components-progress-bar-border',
+          isEmbedding ? 'bg-components-progress-bar-bg bg-opacity-50' : 'bg-components-progress-bar-bg',
+        )}>
+          <div
+            className={cn(
+              'h-full',
+              (isEmbedding || isEmbeddingCompleted) && 'bg-components-progress-bar-progress-solid',
+              (isEmbeddingPaused || isEmbeddingError) && 'bg-components-progress-bar-progress-highlight',
+            )}
+            style={{ width: `${percent}%` }}
+          />
+        </div>
+        <div className={'flex w-full items-center'}>
+          <span className='system-xs-medium text-text-secondary'>
+            {`${t('datasetDocuments.embedding.segments')} ${indexingStatusDetail?.completed_segments || '--'}/${indexingStatusDetail?.total_segments || '--'} 路 ${percent}%`}
+          </span>
+        </div>
+        <RuleDetail sourceData={ruleDetail} indexingType={indexingType} retrievalMethod={retrievalMethod} />
+      </div>
+      <EmbeddingSkeleton />
+    </>
+  )
+}
+
+export default React.memo(EmbeddingDetail)
diff --git a/app/components/datasets/documents/detail/embedding/skeleton/index.tsx b/app/components/datasets/documents/detail/embedding/skeleton/index.tsx
new file mode 100644
index 0000000..523af54
--- /dev/null
+++ b/app/components/datasets/documents/detail/embedding/skeleton/index.tsx
@@ -0,0 +1,66 @@
+import React from 'react'
+import {
+  SkeletonContainer,
+  SkeletonPoint,
+  SkeletonRectangle,
+  SkeletonRow,
+} from '@/app/components/base/skeleton'
+import Divider from '@/app/components/base/divider'
+
+const CardSkelton = React.memo(() => {
+  return (
+    <SkeletonContainer className='gap-y-0 p-1 pb-2'>
+      <SkeletonContainer className='gap-y-0.5 px-2 pt-1.5'>
+        <SkeletonRow className='py-0.5'>
+          <SkeletonRectangle className='w-[72px] bg-text-quaternary' />
+          <SkeletonPoint className='opacity-20' />
+          <SkeletonRectangle className='w-24 bg-text-quaternary' />
+          <SkeletonPoint className='opacity-20' />
+          <SkeletonRectangle className='w-24 bg-text-quaternary' />
+          <SkeletonRow className='grow justify-end gap-1'>
+            <SkeletonRectangle className='w-12 bg-text-quaternary' />
+            <SkeletonRectangle className='mx-1 w-2 bg-text-quaternary' />
+          </SkeletonRow>
+        </SkeletonRow>
+        <SkeletonRow className='py-0.5'>
+          <SkeletonRectangle className='w-full bg-text-quaternary' />
+        </SkeletonRow>
+        <SkeletonRow className='py-0.5'>
+          <SkeletonRectangle className='w-full bg-text-quaternary' />
+        </SkeletonRow>
+        <SkeletonRow className='py-0.5'>
+          <SkeletonRectangle className='w-2/3 bg-text-quaternary' />
+        </SkeletonRow>
+      </SkeletonContainer>
+      <SkeletonContainer className='px-2 py-1.5'>
+        <SkeletonRow>
+          <SkeletonRectangle className='w-14 bg-text-quaternary' />
+          <SkeletonRectangle className='w-[88px] bg-text-quaternary' />
+          <SkeletonRectangle className='w-14 bg-text-quaternary' />
+        </SkeletonRow>
+      </SkeletonContainer>
+    </SkeletonContainer>
+  )
+})
+
+CardSkelton.displayName = 'CardSkelton'
+
+const EmbeddingSkeleton = () => {
+  return (
+    <div className='relative z-10 flex grow flex-col overflow-y-hidden'>
+      <div className='absolute left-0 top-0 z-20 h-full w-full bg-dataset-chunk-list-mask-bg' />
+      {[...Array.from({ length: 5 })].map((_, index) => {
+        return (
+          <div key={index} className='w-full px-11'>
+            <CardSkelton />
+            {index !== 9 && <div className='w-full px-3'>
+              <Divider type='horizontal' className='my-1 bg-divider-subtle' />
+            </div>}
+          </div>
+        )
+      })}
+    </div>
+  )
+}
+
+export default React.memo(EmbeddingSkeleton)
diff --git a/app/components/datasets/documents/detail/embedding/style.module.css b/app/components/datasets/documents/detail/embedding/style.module.css
new file mode 100644
index 0000000..c24444a
--- /dev/null
+++ b/app/components/datasets/documents/detail/embedding/style.module.css
@@ -0,0 +1,59 @@
+.progressBar {
+  @apply absolute top-0 h-4;
+}
+.barPaused {
+  background: linear-gradient(
+    270deg,
+    rgba(208, 213, 221, 0.8) -2.21%,
+    rgba(208, 213, 221, 0.5) 100%
+  );
+}
+.barProcessing {
+  background: linear-gradient(
+    90deg,
+    rgba(41, 112, 255, 0.9) 0%,
+    rgba(21, 94, 239, 0.9) 100%
+  );
+}
+.opBtn {
+  @apply w-fit h-6 text-xs px-2 py-1 text-gray-700 rounded-md !important;
+}
+.opIcon {
+  @apply mr-1 stroke-current text-gray-700 w-3 h-3;
+}
+.progressContainer {
+  @apply relative flex mb-2 h-4 rounded-md w-full;
+}
+.progressBgItem {
+  @apply flex-1 border-r border-r-white first:rounded-l-md;
+}
+.progressBgItem:nth-last-child(2) {
+  @apply rounded-r-md;
+}
+.progressData {
+  @apply w-full flex items-center text-xs text-gray-700;
+}
+.previewTip {
+  @apply pb-1 pt-12 text-gray-900 text-sm font-medium;
+}
+.embeddingStatus {
+  @apply flex items-center justify-between text-gray-900 font-medium text-base mb-3;
+}
+.commonIcon {
+  @apply w-3 h-3 mr-1 inline-block align-middle;
+}
+.highIcon {
+  mask-image: url(../../assets/star.svg);
+  @apply bg-orange-500;
+}
+.economyIcon {
+  background-color: #444ce7;
+  mask-image: url(../../assets/normal.svg);
+}
+.tokens {
+  @apply text-xs font-medium px-1;
+}
+.price {
+  color: #f79009;
+  @apply text-xs font-medium;
+}
diff --git a/app/components/datasets/documents/detail/index.tsx b/app/components/datasets/documents/detail/index.tsx
new file mode 100644
index 0000000..aff7403
--- /dev/null
+++ b/app/components/datasets/documents/detail/index.tsx
@@ -0,0 +1,300 @@
+'use client'
+import type { FC } from 'react'
+import React, { useMemo, useState } from 'react'
+import { createContext, useContext, useContextSelector } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import { useRouter } from 'next/navigation'
+import { RiArrowLeftLine, RiLayoutLeft2Line, RiLayoutRight2Line } from '@remixicon/react'
+import { OperationAction, StatusItem } from '../list'
+import DocumentPicker from '../../common/document-picker'
+import Completed from './completed'
+import Embedding from './embedding'
+import Metadata from '@/app/components/datasets/metadata/metadata-document'
+import SegmentAdd, { ProcessStatus } from './segment-add'
+import BatchModal from './batch-modal'
+import style from './style.module.css'
+import cn from '@/utils/classnames'
+import Divider from '@/app/components/base/divider'
+import Loading from '@/app/components/base/loading'
+import { ToastContext } from '@/app/components/base/toast'
+import type { ChunkingMode, ParentMode, ProcessMode } from '@/models/datasets'
+import { useDatasetDetailContext } from '@/context/dataset-detail'
+import FloatRightContainer from '@/app/components/base/float-right-container'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import { useCheckSegmentBatchImportProgress, useChildSegmentListKey, useSegmentBatchImport, useSegmentListKey } from '@/service/knowledge/use-segment'
+import { useDocumentDetail, useDocumentMetadata, useInvalidDocumentList } from '@/service/knowledge/use-document'
+import { useInvalid } from '@/service/use-base'
+
+type DocumentContextValue = {
+  datasetId?: string
+  documentId?: string
+  docForm: string
+  mode?: ProcessMode
+  parentMode?: ParentMode
+}
+
+export const DocumentContext = createContext<DocumentContextValue>({ docForm: '' })
+
+export const useDocumentContext = (selector: (value: DocumentContextValue) => any) => {
+  return useContextSelector(DocumentContext, selector)
+}
+
+type DocumentTitleProps = {
+  datasetId: string
+  extension?: string
+  name?: string
+  processMode?: ProcessMode
+  parent_mode?: ParentMode
+  iconCls?: string
+  textCls?: string
+  wrapperCls?: string
+}
+
+export const DocumentTitle: FC<DocumentTitleProps> = ({ datasetId, extension, name, processMode, parent_mode, wrapperCls }) => {
+  const router = useRouter()
+  return (
+    <div className={cn('flex flex-1 items-center justify-start', wrapperCls)}>
+      <DocumentPicker
+        datasetId={datasetId}
+        value={{
+          name,
+          extension,
+          processMode,
+          parentMode: parent_mode,
+        }}
+        onChange={(doc) => {
+          router.push(`/datasets/${datasetId}/documents/${doc.id}`)
+        }}
+      />
+    </div>
+  )
+}
+
+type Props = {
+  datasetId: string
+  documentId: string
+}
+
+const DocumentDetail: FC<Props> = ({ datasetId, documentId }) => {
+  const router = useRouter()
+  const { t } = useTranslation()
+
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+
+  const { notify } = useContext(ToastContext)
+  const { dataset } = useDatasetDetailContext()
+  const embeddingAvailable = !!dataset?.embedding_available
+  const [showMetadata, setShowMetadata] = useState(!isMobile)
+  const [newSegmentModalVisible, setNewSegmentModalVisible] = useState(false)
+  const [batchModalVisible, setBatchModalVisible] = useState(false)
+  const [importStatus, setImportStatus] = useState<ProcessStatus | string>()
+  const showNewSegmentModal = () => setNewSegmentModalVisible(true)
+  const showBatchModal = () => setBatchModalVisible(true)
+  const hideBatchModal = () => setBatchModalVisible(false)
+  const resetProcessStatus = () => setImportStatus('')
+
+  const { mutateAsync: checkSegmentBatchImportProgress } = useCheckSegmentBatchImportProgress()
+  const checkProcess = async (jobID: string) => {
+    await checkSegmentBatchImportProgress({ jobID }, {
+      onSuccess: (res) => {
+        setImportStatus(res.job_status)
+        if (res.job_status === ProcessStatus.WAITING || res.job_status === ProcessStatus.PROCESSING)
+          setTimeout(() => checkProcess(res.job_id), 2500)
+        if (res.job_status === ProcessStatus.ERROR)
+          notify({ type: 'error', message: `${t('datasetDocuments.list.batchModal.runError')}` })
+      },
+      onError: (e) => {
+        notify({ type: 'error', message: `${t('datasetDocuments.list.batchModal.runError')}${'message' in e ? `: ${e.message}` : ''}` })
+      },
+    })
+  }
+
+  const { mutateAsync: segmentBatchImport } = useSegmentBatchImport()
+  const runBatch = async (csv: File) => {
+    const formData = new FormData()
+    formData.append('file', csv)
+    await segmentBatchImport({
+      url: `/datasets/${datasetId}/documents/${documentId}/segments/batch_import`,
+      body: formData,
+    }, {
+      onSuccess: (res) => {
+        setImportStatus(res.job_status)
+        checkProcess(res.job_id)
+      },
+      onError: (e) => {
+        notify({ type: 'error', message: `${t('datasetDocuments.list.batchModal.runError')}${'message' in e ? `: ${e.message}` : ''}` })
+      },
+    })
+  }
+
+  const { data: documentDetail, error, refetch: detailMutate } = useDocumentDetail({
+    datasetId,
+    documentId,
+    params: { metadata: 'without' },
+  })
+
+  const { data: documentMetadata } = useDocumentMetadata({
+    datasetId,
+    documentId,
+    params: { metadata: 'only' },
+  })
+
+  const backToPrev = () => {
+    router.push(`/datasets/${datasetId}/documents`)
+  }
+
+  const isDetailLoading = !documentDetail && !error
+
+  const embedding = ['queuing', 'indexing', 'paused'].includes((documentDetail?.display_status || '').toLowerCase())
+
+  const invalidChunkList = useInvalid(useSegmentListKey)
+  const invalidChildChunkList = useInvalid(useChildSegmentListKey)
+  const invalidDocumentList = useInvalidDocumentList(datasetId)
+
+  const handleOperate = (operateName?: string) => {
+    invalidDocumentList()
+    if (operateName === 'delete') {
+      backToPrev()
+    }
+    else {
+      detailMutate()
+      // If operation is not rename, refresh the chunk list after 5 seconds
+      if (operateName) {
+        setTimeout(() => {
+          invalidChunkList()
+          invalidChildChunkList()
+        }, 5000)
+      }
+    }
+  }
+
+  const mode = useMemo(() => {
+    return documentDetail?.document_process_rule?.mode
+  }, [documentDetail?.document_process_rule])
+
+  const parentMode = useMemo(() => {
+    return documentDetail?.document_process_rule?.rules?.parent_mode
+  }, [documentDetail?.document_process_rule])
+
+  const isFullDocMode = useMemo(() => {
+    return mode === 'hierarchical' && parentMode === 'full-doc'
+  }, [mode, parentMode])
+
+  return (
+    <DocumentContext.Provider value={{
+      datasetId,
+      documentId,
+      docForm: documentDetail?.doc_form || '',
+      mode,
+      parentMode,
+    }}>
+      <div className='flex h-full flex-col bg-background-default'>
+        <div className='flex min-h-16 flex-wrap items-center justify-between border-b border-b-divider-subtle py-2.5 pl-3 pr-4'>
+          <div onClick={backToPrev} className={'flex h-8 w-8 shrink-0 cursor-pointer items-center justify-center rounded-full hover:bg-components-button-tertiary-bg'}>
+            <RiArrowLeftLine className='h-4 w-4 text-components-button-ghost-text hover:text-text-tertiary' />
+          </div>
+          <DocumentTitle
+            datasetId={datasetId}
+            extension={documentDetail?.data_source_info?.upload_file?.extension}
+            name={documentDetail?.name}
+            wrapperCls='mr-2'
+            parent_mode={parentMode}
+            processMode={mode}
+          />
+          <div className='flex flex-wrap items-center'>
+            {embeddingAvailable && documentDetail && !documentDetail.archived && !isFullDocMode && (
+              <>
+                <SegmentAdd
+                  importStatus={importStatus}
+                  clearProcessStatus={resetProcessStatus}
+                  showNewSegmentModal={showNewSegmentModal}
+                  showBatchModal={showBatchModal}
+                  embedding={embedding}
+                />
+                <Divider type='vertical' className='!mx-3 !h-[14px] !bg-divider-regular' />
+              </>
+            )}
+            <StatusItem
+              status={documentDetail?.display_status || 'available'}
+              scene='detail'
+              errorMessage={documentDetail?.error || ''}
+              textCls='font-semibold text-xs uppercase'
+              detail={{
+                enabled: documentDetail?.enabled || false,
+                archived: documentDetail?.archived || false,
+                id: documentId,
+              }}
+              datasetId={datasetId}
+              onUpdate={handleOperate}
+            />
+            <OperationAction
+              scene='detail'
+              embeddingAvailable={embeddingAvailable}
+              detail={{
+                name: documentDetail?.name || '',
+                enabled: documentDetail?.enabled || false,
+                archived: documentDetail?.archived || false,
+                id: documentId,
+                data_source_type: documentDetail?.data_source_type || '',
+                doc_form: documentDetail?.doc_form || '',
+              }}
+              datasetId={datasetId}
+              onUpdate={handleOperate}
+              className='!w-[200px]'
+            />
+            <button
+              className={style.layoutRightIcon}
+              onClick={() => setShowMetadata(!showMetadata)}
+            >
+              {
+                showMetadata
+                  ? <RiLayoutLeft2Line className='h-4 w-4 text-components-button-secondary-text' />
+                  : <RiLayoutRight2Line className='h-4 w-4 text-components-button-secondary-text' />
+              }
+            </button>
+          </div>
+        </div>
+        <div className='flex flex-1 flex-row' style={{ height: 'calc(100% - 4rem)' }}>
+          {isDetailLoading
+            ? <Loading type='app' />
+            : <div className={cn('flex h-full min-w-0 grow flex-col',
+              embedding ? '' : isFullDocMode ? 'relative pl-11 pr-11 pt-4' : 'relative pl-5 pr-11 pt-3',
+            )}>
+              {embedding
+                ? <Embedding
+                  detailUpdate={detailMutate}
+                  indexingType={dataset?.indexing_technique}
+                  retrievalMethod={dataset?.retrieval_model_dict?.search_method}
+                />
+                : <Completed
+                  embeddingAvailable={embeddingAvailable}
+                  showNewSegmentModal={newSegmentModalVisible}
+                  onNewSegmentModalChange={setNewSegmentModalVisible}
+                  importStatus={importStatus}
+                  archived={documentDetail?.archived}
+                />
+              }
+            </div>
+          }
+          <FloatRightContainer showClose isOpen={showMetadata} onClose={() => setShowMetadata(false)} isMobile={isMobile} panelClassName='!justify-start' footer={null}>
+            <Metadata
+              className='mr-2 mt-3'
+              datasetId={datasetId}
+              documentId={documentId}
+              docDetail={{ ...documentDetail, ...documentMetadata, doc_type: documentMetadata?.doc_type === 'others' ? '' : documentMetadata?.doc_type } as any}
+            />
+          </FloatRightContainer>
+        </div>
+        <BatchModal
+          isShow={batchModalVisible}
+          onCancel={hideBatchModal}
+          onConfirm={runBatch}
+          docForm={documentDetail?.doc_form as ChunkingMode}
+        />
+      </div>
+    </DocumentContext.Provider>
+  )
+}
+
+export default DocumentDetail
diff --git a/app/components/datasets/documents/detail/metadata/index.tsx b/app/components/datasets/documents/detail/metadata/index.tsx
new file mode 100644
index 0000000..da269fc
--- /dev/null
+++ b/app/components/datasets/documents/detail/metadata/index.tsx
@@ -0,0 +1,377 @@
+'use client'
+import type { FC, ReactNode } from 'react'
+import React, { useEffect, useState } from 'react'
+import { PencilIcon } from '@heroicons/react/24/outline'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { get } from 'lodash-es'
+import { useDocumentContext } from '../index'
+import s from './style.module.css'
+import cn from '@/utils/classnames'
+import Input from '@/app/components/base/input'
+import Button from '@/app/components/base/button'
+import Tooltip from '@/app/components/base/tooltip'
+import Radio from '@/app/components/base/radio'
+import Divider from '@/app/components/base/divider'
+import { ToastContext } from '@/app/components/base/toast'
+import { SimpleSelect } from '@/app/components/base/select'
+import Loading from '@/app/components/base/loading'
+import AutoHeightTextarea from '@/app/components/base/auto-height-textarea'
+import { asyncRunSafe, getTextWidthWithCanvas } from '@/utils'
+import { modifyDocMetadata } from '@/service/datasets'
+import type { CommonResponse } from '@/models/common'
+import type { DocType, FullDocumentDetail } from '@/models/datasets'
+import { CUSTOMIZABLE_DOC_TYPES } from '@/models/datasets'
+import type { inputType, metadataType } from '@/hooks/use-metadata'
+import { useBookCategories, useBusinessDocCategories, useLanguages, useMetadataMap, usePersonalDocCategories } from '@/hooks/use-metadata'
+
+const map2Options = (map: { [key: string]: string }) => {
+  return Object.keys(map).map(key => ({ value: key, name: map[key] }))
+}
+
+type IFieldInfoProps = {
+  label: string
+  value?: string
+  valueIcon?: ReactNode
+  displayedValue?: string
+  defaultValue?: string
+  showEdit?: boolean
+  inputType?: inputType
+  selectOptions?: Array<{ value: string; name: string }>
+  onUpdate?: (v: any) => void
+}
+
+export const FieldInfo: FC<IFieldInfoProps> = ({
+  label,
+  value = '',
+  valueIcon,
+  displayedValue = '',
+  defaultValue,
+  showEdit = false,
+  inputType = 'input',
+  selectOptions = [],
+  onUpdate,
+}) => {
+  const { t } = useTranslation()
+  const textNeedWrap = getTextWidthWithCanvas(displayedValue) > 190
+  const editAlignTop = showEdit && inputType === 'textarea'
+  const readAlignTop = !showEdit && textNeedWrap
+
+  return (
+    <div className={cn('flex min-h-5 items-center gap-1 py-0.5 text-xs', editAlignTop && '!items-start', readAlignTop && '!items-start pt-1')}>
+      <div className={cn('w-[200px] shrink-0 overflow-hidden text-ellipsis whitespace-nowrap text-text-tertiary', editAlignTop && 'pt-1')}>{label}</div>
+      <div className="flex grow items-center gap-1 text-text-secondary">
+        {valueIcon}
+        {!showEdit
+          ? displayedValue
+          : inputType === 'select'
+            ? <SimpleSelect
+              onSelect={({ value }) => onUpdate && onUpdate(value as string)}
+              items={selectOptions}
+              defaultValue={value}
+              className={s.select}
+              wrapperClassName={s.selectWrapper}
+              placeholder={`${t('datasetDocuments.metadata.placeholder.select')}${label}`}
+            />
+            : inputType === 'textarea'
+              ? <AutoHeightTextarea
+                onChange={e => onUpdate && onUpdate(e.target.value)}
+                value={value}
+                className={s.textArea}
+                placeholder={`${t('datasetDocuments.metadata.placeholder.add')}${label}`}
+              />
+              : <Input
+                onChange={e => onUpdate?.(e.target.value)}
+                value={value}
+                defaultValue={defaultValue}
+                placeholder={`${t('datasetDocuments.metadata.placeholder.add')}${label}`}
+              />
+        }
+      </div>
+    </div>
+  )
+}
+
+const TypeIcon: FC<{ iconName: string; className?: string }> = ({ iconName, className = '' }) => {
+  return <div className={cn(s.commonIcon, s[`${iconName}Icon`], className)}
+  />
+}
+
+const IconButton: FC<{
+  type: DocType
+  isChecked: boolean
+}> = ({ type, isChecked = false }) => {
+  const metadataMap = useMetadataMap()
+
+  return (
+    <Tooltip
+      popupContent={metadataMap[type].text}
+    >
+      <button className={cn(s.iconWrapper, 'group', isChecked ? s.iconCheck : '')}>
+        <TypeIcon
+          iconName={metadataMap[type].iconName || ''}
+          className={`group-hover:bg-primary-600 ${isChecked ? '!bg-primary-600' : ''}`}
+        />
+      </button>
+    </Tooltip>
+  )
+}
+
+type IMetadataProps = {
+  docDetail?: FullDocumentDetail
+  loading: boolean
+  onUpdate: () => void
+}
+
+const Metadata: FC<IMetadataProps> = ({ docDetail, loading, onUpdate }) => {
+  const { doc_metadata = {} } = docDetail || {}
+  const doc_type = docDetail?.doc_type || ''
+
+  const { t } = useTranslation()
+  const metadataMap = useMetadataMap()
+  const languageMap = useLanguages()
+  const bookCategoryMap = useBookCategories()
+  const personalDocCategoryMap = usePersonalDocCategories()
+  const businessDocCategoryMap = useBusinessDocCategories()
+  const [editStatus, setEditStatus] = useState(!doc_type) // if no documentType, in editing status by default
+  // the initial values are according to the documentType
+  const [metadataParams, setMetadataParams] = useState<{
+    documentType?: DocType | ''
+    metadata: { [key: string]: string }
+  }>(
+    doc_type
+      ? {
+        documentType: doc_type,
+        metadata: doc_metadata || {},
+      }
+      : { metadata: {} })
+  const [showDocTypes, setShowDocTypes] = useState(!doc_type) // whether show doc types
+  const [tempDocType, setTempDocType] = useState<DocType | undefined | ''>('') // for remember icon click
+  const [saveLoading, setSaveLoading] = useState(false)
+
+  const { notify } = useContext(ToastContext)
+  const datasetId = useDocumentContext(s => s.datasetId)
+  const documentId = useDocumentContext(s => s.documentId)
+
+  useEffect(() => {
+    if (docDetail?.doc_type) {
+      setEditStatus(false)
+      setShowDocTypes(false)
+      setTempDocType(docDetail?.doc_type)
+      setMetadataParams({
+        documentType: docDetail?.doc_type,
+        metadata: docDetail?.doc_metadata || {},
+      })
+    }
+  }, [docDetail?.doc_type])
+
+  // confirm doc type
+  const confirmDocType = () => {
+    if (!tempDocType)
+      return
+    setMetadataParams({
+      documentType: tempDocType,
+      metadata: tempDocType === metadataParams.documentType ? metadataParams.metadata : {}, // change doc type, clear metadata
+    })
+    setEditStatus(true)
+    setShowDocTypes(false)
+  }
+
+  // cancel doc type
+  const cancelDocType = () => {
+    setTempDocType(metadataParams.documentType)
+    setEditStatus(true)
+    setShowDocTypes(false)
+  }
+
+  // show doc type select
+  const renderSelectDocType = () => {
+    const { documentType } = metadataParams
+
+    return (
+      <>
+        {!doc_type && !documentType && <>
+          <div className={s.desc}>{t('datasetDocuments.metadata.desc')}</div>
+        </>}
+        <div className={s.operationWrapper}>
+          {!doc_type && !documentType && <>
+            <span className={s.title}>{t('datasetDocuments.metadata.docTypeSelectTitle')}</span>
+          </>}
+          {documentType && <>
+            <span className={s.title}>{t('datasetDocuments.metadata.docTypeChangeTitle')}</span>
+            <span className={s.changeTip}>{t('datasetDocuments.metadata.docTypeSelectWarning')}</span>
+          </>}
+          <Radio.Group value={tempDocType ?? documentType} onChange={setTempDocType} className={s.radioGroup}>
+            {CUSTOMIZABLE_DOC_TYPES.map((type, index) => {
+              const currValue = tempDocType ?? documentType
+              return <Radio key={index} value={type} className={`${s.radio} ${currValue === type ? 'shadow-none' : ''}`}>
+                <IconButton
+                  type={type}
+                  isChecked={currValue === type}
+                />
+              </Radio>
+            })}
+          </Radio.Group>
+          {!doc_type && !documentType && (
+            <Button variant='primary'
+              onClick={confirmDocType}
+              disabled={!tempDocType}
+            >
+              {t('datasetDocuments.metadata.firstMetaAction')}
+            </Button>
+          )}
+          {documentType && <div className={s.opBtnWrapper}>
+            <Button onClick={confirmDocType} className={`${s.opBtn} ${s.opSaveBtn}`} variant='primary' >{t('common.operation.save')}</Button>
+            <Button onClick={cancelDocType} className={`${s.opBtn} ${s.opCancelBtn}`}>{t('common.operation.cancel')}</Button>
+          </div>}
+        </div >
+      </>
+    )
+  }
+
+  // show metadata info and edit
+  const renderFieldInfos = ({ mainField = 'book', canEdit }: { mainField?: metadataType | ''; canEdit?: boolean }) => {
+    if (!mainField)
+      return null
+    const fieldMap = metadataMap[mainField]?.subFieldsMap
+    const sourceData = ['originInfo', 'technicalParameters'].includes(mainField) ? docDetail : metadataParams.metadata
+
+    const getTargetMap = (field: string) => {
+      if (field === 'language')
+        return languageMap
+      if (field === 'category' && mainField === 'book')
+        return bookCategoryMap
+
+      if (field === 'document_type') {
+        if (mainField === 'personal_document')
+          return personalDocCategoryMap
+        if (mainField === 'business_document')
+          return businessDocCategoryMap
+      }
+      return {} as any
+    }
+
+    const getTargetValue = (field: string) => {
+      const val = get(sourceData, field, '')
+      if (!val && val !== 0)
+        return '-'
+      if (fieldMap[field]?.inputType === 'select')
+        return getTargetMap(field)[val]
+      if (fieldMap[field]?.render)
+        return fieldMap[field]?.render?.(val, field === 'hit_count' ? get(sourceData, 'segment_count', 0) as number : undefined)
+      return val
+    }
+
+    return <div className='flex flex-col gap-1'>
+      {Object.keys(fieldMap).map((field) => {
+        return <FieldInfo
+          key={fieldMap[field]?.label}
+          label={fieldMap[field]?.label}
+          displayedValue={getTargetValue(field)}
+          value={get(sourceData, field, '')}
+          inputType={fieldMap[field]?.inputType || 'input'}
+          showEdit={canEdit}
+          onUpdate={(val) => {
+            setMetadataParams(pre => ({ ...pre, metadata: { ...pre.metadata, [field]: val } }))
+          }}
+          selectOptions={map2Options(getTargetMap(field))}
+        />
+      })}
+    </div>
+  }
+
+  const enabledEdit = () => {
+    setEditStatus(true)
+  }
+
+  const onCancel = () => {
+    setMetadataParams({ documentType: doc_type || '', metadata: { ...(docDetail?.doc_metadata || {}) } })
+    setEditStatus(!doc_type)
+    if (!doc_type)
+      setShowDocTypes(true)
+  }
+
+  const onSave = async () => {
+    setSaveLoading(true)
+    const [e] = await asyncRunSafe<CommonResponse>(modifyDocMetadata({
+      datasetId,
+      documentId,
+      body: {
+        doc_type: metadataParams.documentType || doc_type || '',
+        doc_metadata: metadataParams.metadata,
+      },
+    }) as Promise<CommonResponse>)
+    if (!e)
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+    else
+      notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+    onUpdate?.()
+    setEditStatus(false)
+    setSaveLoading(false)
+  }
+
+  return (
+    <div className={`${s.main} ${editStatus ? 'bg-white' : 'bg-gray-25'}`}>
+      {loading
+        ? (<Loading type='app' />)
+        : (
+          <>
+            <div className={s.titleWrapper}>
+              <span className={s.title}>{t('datasetDocuments.metadata.title')}</span>
+              {!editStatus
+                ? <Button onClick={enabledEdit} className={`${s.opBtn} ${s.opEditBtn}`}>
+                  <PencilIcon className={s.opIcon} />
+                  {t('common.operation.edit')}
+                </Button>
+                : showDocTypes
+                  ? null
+                  : <div className={s.opBtnWrapper}>
+                    <Button onClick={onCancel} className={`${s.opBtn} ${s.opCancelBtn}`}>{t('common.operation.cancel')}</Button>
+                    <Button onClick={onSave}
+                      className={`${s.opBtn} ${s.opSaveBtn}`}
+                      variant='primary'
+                      loading={saveLoading}
+                    >
+                      {t('common.operation.save')}
+                    </Button>
+                  </div>}
+            </div>
+            {/* show selected doc type and changing entry */}
+            {!editStatus
+              ? <div className={s.documentTypeShow}>
+                <TypeIcon iconName={metadataMap[doc_type || 'book']?.iconName || ''} className={s.iconShow} />
+                {metadataMap[doc_type || 'book'].text}
+              </div>
+              : showDocTypes
+                ? null
+                : <div className={s.documentTypeShow}>
+                  {metadataParams.documentType && <>
+                    <TypeIcon iconName={metadataMap[metadataParams.documentType || 'book'].iconName || ''} className={s.iconShow} />
+                    {metadataMap[metadataParams.documentType || 'book'].text}
+                    {editStatus && <div className='ml-1 inline-flex items-center gap-1'>
+                      路
+                      <div
+                        onClick={() => { setShowDocTypes(true) }}
+                        className='cursor-pointer hover:text-text-accent'
+                      >
+                        {t('common.operation.change')}
+                      </div>
+                    </div>}
+                  </>}
+                </div>
+            }
+            {(!doc_type && showDocTypes) ? null : <Divider />}
+            {showDocTypes ? renderSelectDocType() : renderFieldInfos({ mainField: metadataParams.documentType, canEdit: editStatus })}
+            {/* show fixed fields */}
+            <Divider />
+            {renderFieldInfos({ mainField: 'originInfo', canEdit: false })}
+            <div className={`${s.title} mt-8`}>{metadataMap.technicalParameters.text}</div>
+            <Divider />
+            {renderFieldInfos({ mainField: 'technicalParameters', canEdit: false })}
+          </>
+        )}
+    </div>
+  )
+}
+
+export default Metadata
diff --git a/app/components/datasets/documents/detail/metadata/style.module.css b/app/components/datasets/documents/detail/metadata/style.module.css
new file mode 100644
index 0000000..37796d3
--- /dev/null
+++ b/app/components/datasets/documents/detail/metadata/style.module.css
@@ -0,0 +1,103 @@
+.main {
+  @apply w-full sm:w-96 xl:w-[360px] flex-shrink-0 p-0 sm:px-6 sm:py-5 overflow-y-auto border-none sm:border-l-gray-100 sm:border-l;
+}
+.operationWrapper {
+  @apply flex flex-col items-center gap-4 mt-7 mb-8;
+}
+.iconWrapper {
+  @apply box-border cursor-pointer h-8 w-8 inline-flex items-center justify-center;
+  @apply border-[#EAECF5] border rounded-lg hover:border-primary-200 hover:bg-primary-25 hover:shadow-md;
+}
+.icon {
+  @apply h-4 w-4 stroke-current stroke-[2px] text-gray-700 group-hover:stroke-primary-600;
+}
+.iconCheck {
+  @apply border-primary-400 border-[1.5px] bg-primary-25 shadow-sm !important;
+}
+.commonIcon {
+  @apply w-4 h-4 inline-block align-middle bg-gray-700 hover:bg-primary-600;
+}
+.bookOpenIcon {
+  mask-image: url(../../assets/bookOpen.svg);
+}
+.globeIcon {
+  mask-image: url(../../assets/globe.svg);
+}
+.graduationHatIcon {
+  mask-image: url(../../assets/graduationHat.svg);
+}
+.fileIcon {
+  mask-image: url(../../assets/file.svg);
+}
+.briefcaseIcon {
+  mask-image: url(../../assets/briefcase.svg);
+}
+.atSignIcon {
+  mask-image: url(../../assets/atSign.svg);
+}
+.messageTextCircleIcon {
+  mask-image: url(../../assets/messageTextCircle.svg);
+}
+.radioGroup {
+  @apply !bg-transparent !gap-2;
+}
+.radio {
+  @apply !p-0 !mr-0 hover:bg-transparent !rounded-lg;
+}
+.title {
+  @apply text-sm text-gray-800 font-medium leading-6;
+}
+.titleWrapper {
+  @apply flex items-center justify-between;
+}
+.desc {
+  @apply text-gray-500 text-xs;
+}
+
+.changeTip {
+  @apply text-[#D92D20] text-xs text-center;
+}
+.opBtnWrapper {
+  @apply flex items-center justify-center gap-1;
+}
+.opBtn {
+  @apply h-6 w-14 px-0 text-xs font-medium rounded-md !important;
+}
+.opEditBtn {
+  box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05);
+  @apply border-[0.5px] border-gray-200 bg-white !important;
+}
+.opCancelBtn {
+  @apply border-none bg-gray-50 font-medium text-gray-700 hover:bg-gray-100 !important;
+}
+.opSaveBtn {
+  @apply border-primary-700 border-[0.5px] font-medium hover:border-none !important;
+}
+.opIcon {
+  @apply h-3 w-3 stroke-current stroke-2 mr-1;
+}
+.select {
+  @apply h-7 py-0 pl-2 text-xs bg-gray-50 hover:bg-gray-100 rounded-md shadow-none !important;
+}
+.selectWrapper {
+  @apply !h-7 w-full
+}
+.selectWrapper ul {
+  @apply text-xs
+}
+.selectWrapper li {
+  @apply flex items-center h-8
+}
+.documentTypeShow {
+  @apply flex items-center text-xs text-gray-500;
+}
+.iconShow {
+  mask-size: contain;
+  @apply w-3 h-3 bg-gray-500 hover:bg-none mr-1 !important;
+}
+.textArea {
+  @apply placeholder:text-gray-400 bg-gray-50 px-2 py-1 caret-primary-600 rounded-md hover:bg-gray-100 focus-visible:outline-none focus-visible:bg-white focus-visible:border focus-visible:border-gray-300 hover:shadow-[0_1px_2px_rgba(16,24,40,0.05);];
+}
+.input {
+  @apply bg-gray-50 hover:bg-gray-100 focus-visible:bg-white !important
+}
diff --git a/app/components/datasets/documents/detail/new-segment.tsx b/app/components/datasets/documents/detail/new-segment.tsx
new file mode 100644
index 0000000..7a08027
--- /dev/null
+++ b/app/components/datasets/documents/detail/new-segment.tsx
@@ -0,0 +1,205 @@
+import { memo, useMemo, useRef, useState } from 'react'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { useParams } from 'next/navigation'
+import { RiCloseLine, RiExpandDiagonalLine } from '@remixicon/react'
+import { useShallow } from 'zustand/react/shallow'
+import { useSegmentListContext } from './completed'
+import { SegmentIndexTag } from './completed/common/segment-index-tag'
+import ActionButtons from './completed/common/action-buttons'
+import Keywords from './completed/common/keywords'
+import ChunkContent from './completed/common/chunk-content'
+import AddAnother from './completed/common/add-another'
+import Dot from './completed/common/dot'
+import { useDocumentContext } from './index'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { ToastContext } from '@/app/components/base/toast'
+import { ChunkingMode, type SegmentUpdater } from '@/models/datasets'
+import classNames from '@/utils/classnames'
+import { formatNumber } from '@/utils/format'
+import Divider from '@/app/components/base/divider'
+import { useAddSegment } from '@/service/knowledge/use-segment'
+
+type NewSegmentModalProps = {
+  onCancel: () => void
+  docForm: ChunkingMode
+  onSave: () => void
+  viewNewlyAddedChunk: () => void
+}
+
+const NewSegmentModal: FC<NewSegmentModalProps> = ({
+  onCancel,
+  docForm,
+  onSave,
+  viewNewlyAddedChunk,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const [question, setQuestion] = useState('')
+  const [answer, setAnswer] = useState('')
+  const { datasetId, documentId } = useParams<{ datasetId: string; documentId: string }>()
+  const [keywords, setKeywords] = useState<string[]>([])
+  const [loading, setLoading] = useState(false)
+  const [addAnother, setAddAnother] = useState(true)
+  const fullScreen = useSegmentListContext(s => s.fullScreen)
+  const toggleFullScreen = useSegmentListContext(s => s.toggleFullScreen)
+  const mode = useDocumentContext(s => s.mode)
+  const { appSidebarExpand } = useAppStore(useShallow(state => ({
+    appSidebarExpand: state.appSidebarExpand,
+  })))
+  const refreshTimer = useRef<any>(null)
+
+  const CustomButton = <>
+    <Divider type='vertical' className='mx-1 h-3 bg-divider-regular' />
+    <button
+      type='button'
+      className='system-xs-semibold text-text-accent'
+      onClick={() => {
+        clearTimeout(refreshTimer.current)
+        viewNewlyAddedChunk()
+      }}>
+      {t('common.operation.view')}
+    </button>
+  </>
+
+  const isQAModel = useMemo(() => {
+    return docForm === ChunkingMode.qa
+  }, [docForm])
+
+  const handleCancel = (actionType: 'esc' | 'add' = 'esc') => {
+    if (actionType === 'esc' || !addAnother)
+      onCancel()
+  }
+
+  const { mutateAsync: addSegment } = useAddSegment()
+
+  const handleSave = async () => {
+    const params: SegmentUpdater = { content: '' }
+    if (isQAModel) {
+      if (!question.trim()) {
+        return notify({
+          type: 'error',
+          message: t('datasetDocuments.segment.questionEmpty'),
+        })
+      }
+      if (!answer.trim()) {
+        return notify({
+          type: 'error',
+          message: t('datasetDocuments.segment.answerEmpty'),
+        })
+      }
+
+      params.content = question
+      params.answer = answer
+    }
+    else {
+      if (!question.trim()) {
+        return notify({
+          type: 'error',
+          message: t('datasetDocuments.segment.contentEmpty'),
+        })
+      }
+
+      params.content = question
+    }
+
+    if (keywords?.length)
+      params.keywords = keywords
+
+    setLoading(true)
+    await addSegment({ datasetId, documentId, body: params }, {
+      onSuccess() {
+        notify({
+          type: 'success',
+          message: t('datasetDocuments.segment.chunkAdded'),
+          className: `!w-[296px] !bottom-0 ${appSidebarExpand === 'expand' ? '!left-[216px]' : '!left-14'}
+          !top-auto !right-auto !mb-[52px] !ml-11`,
+          customComponent: CustomButton,
+        })
+        handleCancel('add')
+        refreshTimer.current = setTimeout(() => {
+          onSave()
+        }, 3000)
+      },
+      onSettled() {
+        setLoading(false)
+      },
+    })
+  }
+
+  const wordCountText = useMemo(() => {
+    const count = isQAModel ? (question.length + answer.length) : question.length
+    return `${formatNumber(count)} ${t('datasetDocuments.segment.characters', { count })}`
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [question.length, answer.length, isQAModel])
+
+  return (
+    <div className={'flex h-full flex-col'}>
+      <div className={classNames('flex items-center justify-between', fullScreen ? 'py-3 pr-4 pl-6 border border-divider-subtle' : 'pt-3 pr-3 pl-4')}>
+        <div className='flex flex-col'>
+          <div className='system-xl-semibold text-text-primary'>{
+            t('datasetDocuments.segment.addChunk')
+          }</div>
+          <div className='flex items-center gap-x-2'>
+            <SegmentIndexTag label={t('datasetDocuments.segment.newChunk')!} />
+            <Dot />
+            <span className='system-xs-medium text-text-tertiary'>{wordCountText}</span>
+          </div>
+        </div>
+        <div className='flex items-center'>
+          {fullScreen && (
+            <>
+              <AddAnother className='mr-3' isChecked={addAnother} onCheck={() => setAddAnother(!addAnother)} />
+              <ActionButtons
+                handleCancel={handleCancel.bind(null, 'esc')}
+                handleSave={handleSave}
+                loading={loading}
+                actionType='add'
+              />
+              <Divider type='vertical' className='ml-4 mr-2 h-3.5 bg-divider-regular' />
+            </>
+          )}
+          <div className='mr-1 flex h-8 w-8 cursor-pointer items-center justify-center p-1.5' onClick={toggleFullScreen}>
+            <RiExpandDiagonalLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+          <div className='flex h-8 w-8 cursor-pointer items-center justify-center p-1.5' onClick={handleCancel.bind(null, 'esc')}>
+            <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+        </div>
+      </div>
+      <div className={classNames('flex grow', fullScreen ? 'w-full flex-row justify-center px-6 pt-6 gap-x-8' : 'flex-col gap-y-1 py-3 px-4')}>
+        <div className={classNames('break-all overflow-hidden whitespace-pre-line', fullScreen ? 'w-1/2' : 'grow')}>
+          <ChunkContent
+            docForm={docForm}
+            question={question}
+            answer={answer}
+            onQuestionChange={question => setQuestion(question)}
+            onAnswerChange={answer => setAnswer(answer)}
+            isEditMode={true}
+          />
+        </div>
+        {mode === 'custom' && <Keywords
+          className={fullScreen ? 'w-1/5' : ''}
+          actionType='add'
+          keywords={keywords}
+          isEditMode={true}
+          onKeywordsChange={keywords => setKeywords(keywords)}
+        />}
+      </div>
+      {!fullScreen && (
+        <div className='flex items-center justify-between border-t-[1px] border-t-divider-subtle p-4 pt-3'>
+          <AddAnother isChecked={addAnother} onCheck={() => setAddAnother(!addAnother)} />
+          <ActionButtons
+            handleCancel={handleCancel.bind(null, 'esc')}
+            handleSave={handleSave}
+            loading={loading}
+            actionType='add'
+          />
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default memo(NewSegmentModal)
diff --git a/app/components/datasets/documents/detail/segment-add/index.tsx b/app/components/datasets/documents/detail/segment-add/index.tsx
new file mode 100644
index 0000000..d41118e
--- /dev/null
+++ b/app/components/datasets/documents/detail/segment-add/index.tsx
@@ -0,0 +1,135 @@
+'use client'
+import type { FC } from 'react'
+import React, { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAddLine,
+  RiArrowDownSLine,
+  RiErrorWarningFill,
+  RiLoader2Line,
+} from '@remixicon/react'
+import cn from '@/utils/classnames'
+import { CheckCircle } from '@/app/components/base/icons/src/vender/solid/general'
+import Popover from '@/app/components/base/popover'
+
+export type ISegmentAddProps = {
+  importStatus: ProcessStatus | string | undefined
+  clearProcessStatus: () => void
+  showNewSegmentModal: () => void
+  showBatchModal: () => void
+  embedding: boolean
+}
+
+export enum ProcessStatus {
+  WAITING = 'waiting',
+  PROCESSING = 'processing',
+  COMPLETED = 'completed',
+  ERROR = 'error',
+}
+
+const SegmentAdd: FC<ISegmentAddProps> = ({
+  importStatus,
+  clearProcessStatus,
+  showNewSegmentModal,
+  showBatchModal,
+  embedding,
+}) => {
+  const { t } = useTranslation()
+  const textColor = useMemo(() => {
+    return embedding
+      ? 'text-components-button-secondary-accent-text-disabled'
+      : 'text-components-button-secondary-accent-text'
+  }, [embedding])
+
+  if (importStatus) {
+    return (
+      <>
+        {(importStatus === ProcessStatus.WAITING || importStatus === ProcessStatus.PROCESSING) && (
+          <div className='relative mr-2 inline-flex items-center overflow-hidden rounded-lg border-[0.5px] border-components-progress-bar-border
+            bg-components-progress-bar-border px-2.5 py-2 text-components-button-secondary-accent-text
+            shadow-xs shadow-shadow-shadow-3 backdrop-blur-[5px]'>
+            <div className={cn('absolute left-0 top-0 z-0 h-full border-r-[1.5px] border-r-components-progress-bar-progress-highlight bg-components-progress-bar-progress', importStatus === ProcessStatus.WAITING ? 'w-3/12' : 'w-2/3')} />
+            <RiLoader2Line className='mr-1 h-4 w-4 animate-spin' />
+            <span className='system-sm-medium z-10 pr-0.5'>{t('datasetDocuments.list.batchModal.processing')}</span>
+          </div>
+        )}
+        {importStatus === ProcessStatus.COMPLETED && (
+          <div className='relative mr-2 inline-flex items-center overflow-hidden rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xs shadow-shadow-shadow-3 backdrop-blur-[5px]'>
+            <div className='inline-flex items-center border-r border-r-divider-subtle px-2.5 py-2 text-text-success'>
+              <CheckCircle className='mr-1 h-4 w-4' />
+              <span className='system-sm-medium pr-0.5'>{t('datasetDocuments.list.batchModal.completed')}</span>
+            </div>
+            <div className='m-1 inline-flex items-center'>
+              <span className='system-xs-medium cursor-pointer rounded-md px-1.5 py-1 text-components-button-ghost-text hover:bg-components-button-ghost-bg-hover' onClick={clearProcessStatus}>{t('datasetDocuments.list.batchModal.ok')}</span>
+            </div>
+            <div className='absolute left-0 top-0 -z-10 h-full w-full bg-dataset-chunk-process-success-bg opacity-40' />
+          </div>
+        )}
+        {importStatus === ProcessStatus.ERROR && (
+          <div className='relative mr-2 inline-flex items-center overflow-hidden rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xs shadow-shadow-shadow-3 backdrop-blur-[5px]'>
+            <div className='inline-flex items-center border-r border-r-divider-subtle px-2.5 py-2 text-text-destructive'>
+              <RiErrorWarningFill className='mr-1 h-4 w-4' />
+              <span className='system-sm-medium pr-0.5'>{t('datasetDocuments.list.batchModal.error')}</span>
+            </div>
+            <div className='m-1 inline-flex items-center'>
+              <span className='system-xs-medium cursor-pointer rounded-md px-1.5 py-1 text-components-button-ghost-text hover:bg-components-button-ghost-bg-hover' onClick={clearProcessStatus}>{t('datasetDocuments.list.batchModal.ok')}</span>
+            </div>
+            <div className='absolute left-0 top-0 -z-10 h-full w-full bg-dataset-chunk-process-error-bg opacity-40' />
+          </div>
+        )}
+      </>
+    )
+  }
+
+  return (
+    <div className={cn(
+      'relative z-20 flex items-center rounded-lg border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg shadow-xs shadow-shadow-shadow-3 backdrop-blur-[5px]',
+      embedding && 'border-components-button-secondary-border-disabled bg-components-button-secondary-bg-disabled',
+    )}>
+      <button
+        type='button'
+        className={`inline-flex items-center rounded-l-lg border-r-[1px] border-r-divider-subtle px-2.5 py-2
+          hover:bg-state-base-hover disabled:cursor-not-allowed disabled:hover:bg-transparent`}
+        onClick={showNewSegmentModal}
+        disabled={embedding}
+      >
+        <RiAddLine className={cn('h-4 w-4', textColor)} />
+        <span className={cn('ml-0.5 px-0.5 text-[13px] font-medium capitalize leading-[16px]', textColor)}>
+          {t('datasetDocuments.list.action.addButton')}
+        </span>
+      </button>
+      <Popover
+        position='br'
+        manualClose
+        trigger='click'
+        htmlContent={
+          // need to wrapper the button with div when manualClose is true
+          <div className='w-full p-1'>
+            <button
+              type='button'
+              className='system-md-regular flex w-full items-center rounded-lg px-2 py-1.5 text-text-secondary'
+              onClick={showBatchModal}
+            >
+              {t('datasetDocuments.list.action.batchAdd')}
+            </button>
+          </div>
+        }
+        btnElement={
+          <div className='flex items-center justify-center' >
+            <RiArrowDownSLine className={cn('h-4 w-4', textColor)}/>
+          </div>
+        }
+        btnClassName={open => cn(
+          `!hover:bg-state-base-hover !rounded-l-none !rounded-r-lg !border-0 !p-2 backdrop-blur-[5px]
+          disabled:cursor-not-allowed disabled:bg-transparent disabled:hover:bg-transparent`,
+          open ? '!bg-state-base-hover' : '',
+        )}
+        popupClassName='!min-w-[128px] !bg-components-panel-bg-blur !rounded-xl border-[0.5px] !ring-0
+          border-components-panel-border !shadow-xl !shadow-shadow-shadow-5 backdrop-blur-[5px]'
+        className='h-fit min-w-[128px]'
+        disabled={embedding}
+      />
+    </div>
+  )
+}
+export default React.memo(SegmentAdd)
diff --git a/app/components/datasets/documents/detail/settings/index.tsx b/app/components/datasets/documents/detail/settings/index.tsx
new file mode 100644
index 0000000..d45e4d8
--- /dev/null
+++ b/app/components/datasets/documents/detail/settings/index.tsx
@@ -0,0 +1,96 @@
+'use client'
+import React, { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import { useContext } from 'use-context-selector'
+import { useRouter } from 'next/navigation'
+import DatasetDetailContext from '@/context/dataset-detail'
+import type { CrawlOptions, CustomFile } from '@/models/datasets'
+
+import Loading from '@/app/components/base/loading'
+import StepTwo from '@/app/components/datasets/create/step-two'
+import AccountSetting from '@/app/components/header/account-setting'
+import AppUnavailable from '@/app/components/base/app-unavailable'
+import { useDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import type { NotionPage } from '@/models/common'
+import { useDocumentDetail, useInvalidDocumentDetailKey } from '@/service/knowledge/use-document'
+
+type DocumentSettingsProps = {
+  datasetId: string
+  documentId: string
+}
+
+const DocumentSettings = ({ datasetId, documentId }: DocumentSettingsProps) => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const [isShowSetAPIKey, { setTrue: showSetAPIKey, setFalse: hideSetAPIkey }] = useBoolean()
+  const { indexingTechnique, dataset } = useContext(DatasetDetailContext)
+  const { data: embeddingsDefaultModel } = useDefaultModel(ModelTypeEnum.textEmbedding)
+
+  const invalidDocumentDetail = useInvalidDocumentDetailKey()
+  const saveHandler = () => {
+    invalidDocumentDetail()
+    router.push(`/datasets/${datasetId}/documents/${documentId}`)
+  }
+
+  const cancelHandler = () => router.back()
+
+  const { data: documentDetail, error } = useDocumentDetail({
+    datasetId,
+    documentId,
+    params: { metadata: 'without' },
+  })
+
+  const currentPage = useMemo(() => {
+    return {
+      workspace_id: documentDetail?.data_source_info.notion_workspace_id,
+      page_id: documentDetail?.data_source_info.notion_page_id,
+      page_name: documentDetail?.name,
+      page_icon: documentDetail?.data_source_info.notion_page_icon,
+      type: documentDetail?.data_source_type,
+    }
+  }, [documentDetail])
+
+  if (error)
+    return <AppUnavailable code={500} unknownReason={t('datasetCreation.error.unavailable') as string} />
+
+  return (
+    <div className='flex' style={{ height: 'calc(100vh - 56px)' }}>
+      <div className="grow">
+        {!documentDetail && <Loading type='app' />}
+        {dataset && documentDetail && (
+          <StepTwo
+            isAPIKeySet={!!embeddingsDefaultModel}
+            onSetting={showSetAPIKey}
+            datasetId={datasetId}
+            dataSourceType={documentDetail.data_source_type}
+            notionPages={[currentPage as unknown as NotionPage]}
+            websitePages={[
+              {
+                title: documentDetail.name,
+                source_url: documentDetail.data_source_info?.url,
+                markdown: '',
+                description: '',
+              },
+            ]}
+            websiteCrawlProvider={documentDetail.data_source_info?.provider}
+            websiteCrawlJobId={documentDetail.data_source_info?.job_id}
+            crawlOptions={documentDetail.data_source_info as unknown as CrawlOptions}
+            indexingType={indexingTechnique}
+            isSetting
+            documentDetail={documentDetail}
+            files={[documentDetail.data_source_info.upload_file as CustomFile]}
+            onSave={saveHandler}
+            onCancel={cancelHandler}
+          />
+        )}
+      </div>
+      {isShowSetAPIKey && <AccountSetting activeTab="provider" onCancel={async () => {
+        hideSetAPIkey()
+      }} />}
+    </div>
+  )
+}
+
+export default DocumentSettings
diff --git a/app/components/datasets/documents/detail/style.module.css b/app/components/datasets/documents/detail/style.module.css
new file mode 100644
index 0000000..8a59ef6
--- /dev/null
+++ b/app/components/datasets/documents/detail/style.module.css
@@ -0,0 +1,11 @@
+.titleIcon {
+  background-position-x: center;
+  background-repeat: no-repeat;
+  background-size: 28px 28px;
+  @apply h-6 w-6 !important;
+}
+.layoutRightIcon {
+  @apply p-2 ml-2 border-[0.5px] border-components-button-secondary-border hover:border-components-button-secondary-border-hover
+  rounded-lg bg-components-button-secondary-bg hover:bg-components-button-secondary-bg-hover cursor-pointer
+  shadow-xs shadow-shadow-shadow-3 backdrop-blur-[5px];
+}
diff --git a/app/components/datasets/documents/index.tsx b/app/components/datasets/documents/index.tsx
new file mode 100644
index 0000000..32980ee
--- /dev/null
+++ b/app/components/datasets/documents/index.tsx
@@ -0,0 +1,350 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useRouter } from 'next/navigation'
+import { useDebounce, useDebounceFn } from 'ahooks'
+import { groupBy } from 'lodash-es'
+import { PlusIcon } from '@heroicons/react/24/solid'
+import { RiDraftLine, RiExternalLinkLine } from '@remixicon/react'
+import AutoDisabledDocument from '../common/document-status-with-action/auto-disabled-document'
+import List from './list'
+import s from './style.module.css'
+import Loading from '@/app/components/base/loading'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import { get } from '@/service/base'
+import { createDocument } from '@/service/datasets'
+import { useDatasetDetailContext } from '@/context/dataset-detail'
+import { NotionPageSelectorModal } from '@/app/components/base/notion-page-selector'
+import type { NotionPage } from '@/models/common'
+import type { CreateDocumentReq } from '@/models/datasets'
+import { DataSourceType, ProcessMode } from '@/models/datasets'
+import IndexFailed from '@/app/components/datasets/common/document-status-with-action/index-failed'
+import { useProviderContext } from '@/context/provider-context'
+import cn from '@/utils/classnames'
+import { useDocumentList, useInvalidDocumentDetailKey, useInvalidDocumentList } from '@/service/knowledge/use-document'
+import { useInvalid } from '@/service/use-base'
+import { useChildSegmentListKey, useSegmentListKey } from '@/service/knowledge/use-segment'
+import useEditDocumentMetadata from '../metadata/hooks/use-edit-dataset-metadata'
+import DatasetMetadataDrawer from '../metadata/metadata-dataset/dataset-metadata-drawer'
+import StatusWithAction from '../common/document-status-with-action/status-with-action'
+import { LanguagesSupported } from '@/i18n/language'
+import { getLocaleOnClient } from '@/i18n'
+
+const FolderPlusIcon = ({ className }: React.SVGProps<SVGElement>) => {
+  return <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" className={className ?? ''}>
+    <path d="M10.8332 5.83333L9.90355 3.9741C9.63601 3.439 9.50222 3.17144 9.30265 2.97597C9.12615 2.80311 8.91344 2.67164 8.6799 2.59109C8.41581 2.5 8.11668 2.5 7.51841 2.5H4.33317C3.39975 2.5 2.93304 2.5 2.57652 2.68166C2.26292 2.84144 2.00795 3.09641 1.84816 3.41002C1.6665 3.76654 1.6665 4.23325 1.6665 5.16667V5.83333M1.6665 5.83333H14.3332C15.7333 5.83333 16.4334 5.83333 16.9681 6.10582C17.4386 6.3455 17.821 6.72795 18.0607 7.19836C18.3332 7.73314 18.3332 8.4332 18.3332 9.83333V13.5C18.3332 14.9001 18.3332 15.6002 18.0607 16.135C17.821 16.6054 17.4386 16.9878 16.9681 17.2275C16.4334 17.5 15.7333 17.5 14.3332 17.5H5.6665C4.26637 17.5 3.56631 17.5 3.03153 17.2275C2.56112 16.9878 2.17867 16.6054 1.93899 16.135C1.6665 15.6002 1.6665 14.9001 1.6665 13.5V5.83333ZM9.99984 14.1667V9.16667M7.49984 11.6667H12.4998" stroke="#667085" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
+  </svg>
+}
+
+const ThreeDotsIcon = ({ className }: React.SVGProps<SVGElement>) => {
+  return <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" className={className ?? ''}>
+    <path d="M5 6.5V5M8.93934 7.56066L10 6.5M10.0103 11.5H11.5103" stroke="#374151" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
+  </svg>
+}
+
+const NotionIcon = ({ className }: React.SVGProps<SVGElement>) => {
+  return <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" className={className ?? ''}>
+    <g clipPath="url(#clip0_2164_11263)">
+      <path fillRule="evenodd" clipRule="evenodd" d="M3.5725 18.2611L1.4229 15.5832C0.905706 14.9389 0.625 14.1466 0.625 13.3312V3.63437C0.625 2.4129 1.60224 1.39936 2.86295 1.31328L12.8326 0.632614C13.5569 0.583164 14.2768 0.775682 14.8717 1.17794L18.3745 3.5462C19.0015 3.97012 19.375 4.66312 19.375 5.40266V16.427C19.375 17.6223 18.4141 18.6121 17.1798 18.688L6.11458 19.3692C5.12958 19.4298 4.17749 19.0148 3.5725 18.2611Z" fill="white" />
+      <path d="M7.03006 8.48669V8.35974C7.03006 8.03794 7.28779 7.77104 7.61997 7.74886L10.0396 7.58733L13.3857 12.5147V8.19009L12.5244 8.07528V8.01498C12.5244 7.68939 12.788 7.42074 13.1244 7.4035L15.326 7.29073V7.60755C15.326 7.75628 15.2154 7.88349 15.0638 7.90913L14.534 7.99874V15.0023L13.8691 15.231C13.3136 15.422 12.6952 15.2175 12.3772 14.7377L9.12879 9.83574V14.5144L10.1287 14.7057L10.1147 14.7985C10.0711 15.089 9.82028 15.3087 9.51687 15.3222L7.03006 15.4329C6.99718 15.1205 7.23132 14.841 7.55431 14.807L7.88143 14.7727V8.53453L7.03006 8.48669Z" fill="black" />
+      <path fillRule="evenodd" clipRule="evenodd" d="M12.9218 1.85424L2.95217 2.53491C2.35499 2.57568 1.89209 3.05578 1.89209 3.63437V13.3312C1.89209 13.8748 2.07923 14.403 2.42402 14.8325L4.57362 17.5104C4.92117 17.9434 5.46812 18.1818 6.03397 18.147L17.0991 17.4658C17.6663 17.4309 18.1078 16.9762 18.1078 16.427V5.40266C18.1078 5.06287 17.9362 4.74447 17.6481 4.54969L14.1453 2.18143C13.7883 1.94008 13.3564 1.82457 12.9218 1.85424ZM3.44654 3.78562C3.30788 3.68296 3.37387 3.46909 3.54806 3.4566L12.9889 2.77944C13.2897 2.75787 13.5886 2.8407 13.8318 3.01305L15.7261 4.35508C15.798 4.40603 15.7642 4.51602 15.6752 4.52086L5.67742 5.0646C5.37485 5.08106 5.0762 4.99217 4.83563 4.81406L3.44654 3.78562ZM5.20848 6.76919C5.20848 6.4444 5.47088 6.1761 5.80642 6.15783L16.3769 5.58216C16.7039 5.56435 16.9792 5.81583 16.9792 6.13239V15.6783C16.9792 16.0025 16.7177 16.2705 16.3829 16.2896L5.8793 16.8872C5.51537 16.9079 5.20848 16.6283 5.20848 16.2759V6.76919Z" fill="black" />
+    </g>
+    <defs>
+      <clipPath id="clip0_2164_11263">
+        <rect width="20" height="20" fill="white" />
+      </clipPath>
+    </defs>
+  </svg>
+}
+
+const EmptyElement: FC<{ canAdd: boolean; onClick: () => void; type?: 'upload' | 'sync' }> = ({ canAdd = true, onClick, type = 'upload' }) => {
+  const { t } = useTranslation()
+  return <div className={s.emptyWrapper}>
+    <div className={s.emptyElement}>
+      <div className={s.emptySymbolIconWrapper}>
+        {type === 'upload' ? <FolderPlusIcon /> : <NotionIcon />}
+      </div>
+      <span className={s.emptyTitle}>{t('datasetDocuments.list.empty.title')}<ThreeDotsIcon className='relative -left-1.5 -top-3 inline' /></span>
+      <div className={s.emptyTip}>
+        {t(`datasetDocuments.list.empty.${type}.tip`)}
+      </div>
+      {type === 'upload' && canAdd && <Button onClick={onClick} className={s.addFileBtn}>
+        <PlusIcon className={s.plusIcon} />{t('datasetDocuments.list.addFile')}
+      </Button>}
+    </div>
+  </div>
+}
+
+type IDocumentsProps = {
+  datasetId: string
+}
+
+export const fetcher = (url: string) => get(url, {}, {})
+const DEFAULT_LIMIT = 10
+
+const Documents: FC<IDocumentsProps> = ({ datasetId }) => {
+  const { t } = useTranslation()
+  const { plan } = useProviderContext()
+  const isFreePlan = plan.type === 'sandbox'
+  const [inputValue, setInputValue] = useState<string>('') // the input value
+  const [searchValue, setSearchValue] = useState<string>('')
+  const [currPage, setCurrPage] = React.useState<number>(0)
+  const [limit, setLimit] = useState<number>(DEFAULT_LIMIT)
+  const router = useRouter()
+  const { dataset } = useDatasetDetailContext()
+  const [notionPageSelectorModalVisible, setNotionPageSelectorModalVisible] = useState(false)
+  const [timerCanRun, setTimerCanRun] = useState(true)
+  const isDataSourceNotion = dataset?.data_source_type === DataSourceType.NOTION
+  const isDataSourceWeb = dataset?.data_source_type === DataSourceType.WEB
+  const isDataSourceFile = dataset?.data_source_type === DataSourceType.FILE
+  const embeddingAvailable = !!dataset?.embedding_available
+  const locale = getLocaleOnClient()
+  const debouncedSearchValue = useDebounce(searchValue, { wait: 500 })
+
+  const { data: documentsRes, isFetching: isListLoading } = useDocumentList({
+    datasetId,
+    query: {
+      page: currPage + 1,
+      limit,
+      keyword: debouncedSearchValue,
+    },
+    refetchInterval: (isDataSourceNotion && timerCanRun) ? 2500 : 0,
+  })
+
+  const invalidDocumentList = useInvalidDocumentList(datasetId)
+
+  useEffect(() => {
+    if (documentsRes) {
+      const totalPages = Math.ceil(documentsRes.total / limit)
+      if (totalPages < currPage + 1)
+        setCurrPage(totalPages === 0 ? 0 : totalPages - 1)
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [documentsRes])
+
+  const invalidDocumentDetail = useInvalidDocumentDetailKey()
+  const invalidChunkList = useInvalid(useSegmentListKey)
+  const invalidChildChunkList = useInvalid(useChildSegmentListKey)
+
+  const handleUpdate = useCallback(() => {
+    invalidDocumentList()
+    invalidDocumentDetail()
+    setTimeout(() => {
+      invalidChunkList()
+      invalidChildChunkList()
+    }, 5000)
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  const documentsWithProgress = useMemo(() => {
+    let completedNum = 0
+    let percent = 0
+    const documentsData = documentsRes?.data?.map((documentItem) => {
+      const { indexing_status, completed_segments, total_segments } = documentItem
+      const isEmbedded = indexing_status === 'completed' || indexing_status === 'paused' || indexing_status === 'error'
+
+      if (isEmbedded)
+        completedNum++
+
+      const completedCount = completed_segments || 0
+      const totalCount = total_segments || 0
+      if (totalCount === 0 && completedCount === 0) {
+        percent = isEmbedded ? 100 : 0
+      }
+      else {
+        const per = Math.round(completedCount * 100 / totalCount)
+        percent = per > 100 ? 100 : per
+      }
+      return {
+        ...documentItem,
+        percent,
+      }
+    })
+    if (completedNum === documentsRes?.data?.length)
+      setTimerCanRun(false)
+    return {
+      ...documentsRes,
+      data: documentsData,
+    }
+  }, [documentsRes])
+  const total = documentsRes?.total || 0
+
+  const routeToDocCreate = () => {
+    if (isDataSourceNotion) {
+      setNotionPageSelectorModalVisible(true)
+      return
+    }
+    router.push(`/datasets/${datasetId}/documents/create`)
+  }
+
+  const handleSaveNotionPageSelected = async (selectedPages: NotionPage[]) => {
+    const workspacesMap = groupBy(selectedPages, 'workspace_id')
+    const workspaces = Object.keys(workspacesMap).map((workspaceId) => {
+      return {
+        workspaceId,
+        pages: workspacesMap[workspaceId],
+      }
+    })
+    const params = {
+      data_source: {
+        type: dataset?.data_source_type,
+        info_list: {
+          data_source_type: dataset?.data_source_type,
+          notion_info_list: workspaces.map((workspace) => {
+            return {
+              workspace_id: workspace.workspaceId,
+              pages: workspace.pages.map((page) => {
+                const { page_id, page_name, page_icon, type } = page
+                return {
+                  page_id,
+                  page_name,
+                  page_icon,
+                  type,
+                }
+              }),
+            }
+          }),
+        },
+      },
+      indexing_technique: dataset?.indexing_technique,
+      process_rule: {
+        rules: {},
+        mode: ProcessMode.general,
+      },
+    } as CreateDocumentReq
+
+    await createDocument({
+      datasetId,
+      body: params,
+    })
+    invalidDocumentList()
+    setTimerCanRun(true)
+    // mutateDatasetIndexingStatus(undefined, { revalidate: true })
+    setNotionPageSelectorModalVisible(false)
+  }
+
+  const documentsList = isDataSourceNotion ? documentsWithProgress?.data : documentsRes?.data
+  const [selectedIds, setSelectedIds] = useState<string[]>([])
+  const { run: handleSearch } = useDebounceFn(() => {
+    setSearchValue(inputValue)
+  }, { wait: 500 })
+
+  const handleInputChange = (value: string) => {
+    setInputValue(value)
+    handleSearch()
+  }
+
+  const {
+    isShowEditModal: isShowEditMetadataModal,
+    showEditModal: showEditMetadataModal,
+    hideEditModal: hideEditMetadataModal,
+    datasetMetaData,
+    handleAddMetaData,
+    handleRename,
+    handleDeleteMetaData,
+    builtInEnabled,
+    setBuiltInEnabled,
+    builtInMetaData,
+  } = useEditDocumentMetadata({
+    datasetId,
+    dataset,
+    onUpdateDocList: invalidDocumentList,
+  })
+
+  return (
+    <div className='flex h-full flex-col overflow-y-auto'>
+      <div className='flex flex-col justify-center gap-1 px-6 pt-4'>
+        <h1 className='text-base font-semibold text-text-primary'>{t('datasetDocuments.list.title')}</h1>
+        <div className='flex items-center space-x-0.5 text-sm font-normal text-text-tertiary'>
+          <span>{t('datasetDocuments.list.desc')}</span>
+          <a
+            className='flex items-center text-text-accent'
+            target='_blank'
+            href={
+              locale === LanguagesSupported[1]
+                ? 'https://docs.dify.ai/zh-hans/guides/knowledge-base/integrate-knowledge-within-application'
+                : 'https://docs.dify.ai/en/guides/knowledge-base/integrate-knowledge-within-application'
+            }
+            >
+            <span>{t('datasetDocuments.list.learnMore')}</span>
+            <RiExternalLinkLine className='h-3 w-3' />
+          </a>
+        </div>
+      </div>
+      <div className='flex flex-1 flex-col px-6 py-4'>
+        <div className='flex flex-wrap items-center justify-between'>
+          <Input
+            showLeftIcon
+            showClearIcon
+            wrapperClassName='!w-[200px]'
+            value={inputValue}
+            onChange={e => handleInputChange(e.target.value)}
+            onClear={() => handleInputChange('')}
+          />
+          <div className='flex !h-8 items-center justify-center gap-2'>
+            {!isFreePlan && <AutoDisabledDocument datasetId={datasetId} />}
+            <IndexFailed datasetId={datasetId} />
+            {!embeddingAvailable && <StatusWithAction type='warning' description={t('dataset.embeddingModelNotAvailable')} />}
+            {embeddingAvailable && (
+              <Button variant='secondary' className='shrink-0' onClick={showEditMetadataModal}>
+                <RiDraftLine className='mr-1 size-4' />
+                {t('dataset.metadata.metadata')}
+              </Button>
+            )}
+            {isShowEditMetadataModal && (
+              <DatasetMetadataDrawer
+                userMetadata={datasetMetaData || []}
+                onClose={hideEditMetadataModal}
+                onAdd={handleAddMetaData}
+                onRename={handleRename}
+                onRemove={handleDeleteMetaData}
+                builtInMetadata={builtInMetaData || []}
+                isBuiltInEnabled={!!builtInEnabled}
+                onIsBuiltInEnabledChange={setBuiltInEnabled}
+              />
+            )}
+            {embeddingAvailable && (
+              <Button variant='primary' onClick={routeToDocCreate} className='shrink-0'>
+                <PlusIcon className={cn('mr-2 h-4 w-4 stroke-current')} />
+                {isDataSourceNotion && t('datasetDocuments.list.addPages')}
+                {isDataSourceWeb && t('datasetDocuments.list.addUrl')}
+                {(!dataset?.data_source_type || isDataSourceFile) && t('datasetDocuments.list.addFile')}
+              </Button>
+            )}
+          </div>
+        </div>
+        {isListLoading
+          ? <Loading type='app' />
+          : total > 0
+            ? <List
+              embeddingAvailable={embeddingAvailable}
+              documents={documentsList || []}
+              datasetId={datasetId}
+              onUpdate={handleUpdate}
+              selectedIds={selectedIds}
+              onSelectedIdChange={setSelectedIds}
+              pagination={{
+                total,
+                limit,
+                onLimitChange: setLimit,
+                current: currPage,
+                onChange: setCurrPage,
+              }}
+              onManageMetadata={showEditMetadataModal}
+            />
+            : <EmptyElement canAdd={embeddingAvailable} onClick={routeToDocCreate} type={isDataSourceNotion ? 'sync' : 'upload'} />
+        }
+        <NotionPageSelectorModal
+          isShow={notionPageSelectorModalVisible}
+          onClose={() => setNotionPageSelectorModalVisible(false)}
+          onSave={handleSaveNotionPageSelected}
+          datasetId={dataset?.id || ''}
+        />
+      </div>
+    </div>
+  )
+}
+
+export default Documents
diff --git a/app/components/datasets/documents/list.tsx b/app/components/datasets/documents/list.tsx
new file mode 100644
index 0000000..cb349ee
--- /dev/null
+++ b/app/components/datasets/documents/list.tsx
@@ -0,0 +1,687 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useMemo, useState } from 'react'
+import { useBoolean, useDebounceFn } from 'ahooks'
+import { ArrowDownIcon } from '@heroicons/react/24/outline'
+import { pick, uniq } from 'lodash-es'
+import {
+  RiArchive2Line,
+  RiDeleteBinLine,
+  RiEditLine,
+  RiEqualizer2Line,
+  RiLoopLeftLine,
+  RiMoreFill,
+} from '@remixicon/react'
+import { useContext } from 'use-context-selector'
+import { useRouter } from 'next/navigation'
+import { useTranslation } from 'react-i18next'
+import dayjs from 'dayjs'
+import { Globe01 } from '../../base/icons/src/vender/line/mapsAndTravel'
+import ChunkingModeLabel from '../common/chunking-mode-label'
+import FileTypeIcon from '../../base/file-uploader/file-type-icon'
+import s from './style.module.css'
+import RenameModal from './rename-modal'
+import BatchAction from './detail/completed/common/batch-action'
+import cn from '@/utils/classnames'
+import Switch from '@/app/components/base/switch'
+import Divider from '@/app/components/base/divider'
+import Popover from '@/app/components/base/popover'
+import Confirm from '@/app/components/base/confirm'
+import Tooltip from '@/app/components/base/tooltip'
+import Toast, { ToastContext } from '@/app/components/base/toast'
+import type { ColorMap, IndicatorProps } from '@/app/components/header/indicator'
+import Indicator from '@/app/components/header/indicator'
+import { asyncRunSafe } from '@/utils'
+import { formatNumber } from '@/utils/format'
+import NotionIcon from '@/app/components/base/notion-icon'
+import ProgressBar from '@/app/components/base/progress-bar'
+import { ChunkingMode, DataSourceType, DocumentActionType, type DocumentDisplayStatus, type SimpleDocumentDetail } from '@/models/datasets'
+import type { CommonResponse } from '@/models/common'
+import useTimestamp from '@/hooks/use-timestamp'
+import { useDatasetDetailContextWithSelector as useDatasetDetailContext } from '@/context/dataset-detail'
+import type { Props as PaginationProps } from '@/app/components/base/pagination'
+import Pagination from '@/app/components/base/pagination'
+import Checkbox from '@/app/components/base/checkbox'
+import { useDocumentArchive, useDocumentDelete, useDocumentDisable, useDocumentEnable, useDocumentUnArchive, useSyncDocument, useSyncWebsite } from '@/service/knowledge/use-document'
+import { extensionToFileType } from '@/app/components/datasets/hit-testing/utils/extension-to-file-type'
+import useBatchEditDocumentMetadata from '../metadata/hooks/use-batch-edit-document-metadata'
+import EditMetadataBatchModal from '@/app/components/datasets/metadata/edit-metadata-batch/modal'
+import { noop } from 'lodash-es'
+
+export const useIndexStatus = () => {
+  const { t } = useTranslation()
+  return {
+    queuing: { color: 'orange', text: t('datasetDocuments.list.status.queuing') }, // waiting
+    indexing: { color: 'blue', text: t('datasetDocuments.list.status.indexing') }, // indexing splitting parsing cleaning
+    paused: { color: 'orange', text: t('datasetDocuments.list.status.paused') }, // paused
+    error: { color: 'red', text: t('datasetDocuments.list.status.error') }, // error
+    available: { color: 'green', text: t('datasetDocuments.list.status.available') }, // completed锛宎rchived = false锛宔nabled = true
+    enabled: { color: 'green', text: t('datasetDocuments.list.status.enabled') }, // completed锛宎rchived = false锛宔nabled = true
+    disabled: { color: 'gray', text: t('datasetDocuments.list.status.disabled') }, // completed锛宎rchived = false锛宔nabled = false
+    archived: { color: 'gray', text: t('datasetDocuments.list.status.archived') }, // completed锛宎rchived = true
+  }
+}
+
+const STATUS_TEXT_COLOR_MAP: ColorMap = {
+  green: 'text-util-colors-green-green-600',
+  orange: 'text-util-colors-warning-warning-600',
+  red: 'text-util-colors-red-red-600',
+  blue: 'text-util-colors-blue-light-blue-light-600',
+  yellow: 'text-util-colors-warning-warning-600',
+  gray: 'text-text-tertiary',
+}
+
+// status item for list
+export const StatusItem: FC<{
+  status: DocumentDisplayStatus
+  reverse?: boolean
+  scene?: 'list' | 'detail'
+  textCls?: string
+  errorMessage?: string
+  detail?: {
+    enabled: boolean
+    archived: boolean
+    id: string
+  }
+  datasetId?: string
+  onUpdate?: (operationName?: string) => void
+
+}> = ({ status, reverse = false, scene = 'list', textCls = '', errorMessage, datasetId = '', detail, onUpdate }) => {
+  const DOC_INDEX_STATUS_MAP = useIndexStatus()
+  const localStatus = status.toLowerCase() as keyof typeof DOC_INDEX_STATUS_MAP
+  const { enabled = false, archived = false, id = '' } = detail || {}
+  const { notify } = useContext(ToastContext)
+  const { t } = useTranslation()
+  const { mutateAsync: enableDocument } = useDocumentEnable()
+  const { mutateAsync: disableDocument } = useDocumentDisable()
+  const { mutateAsync: deleteDocument } = useDocumentDelete()
+
+  const onOperate = async (operationName: OperationName) => {
+    let opApi = deleteDocument
+    switch (operationName) {
+      case 'enable':
+        opApi = enableDocument
+        break
+      case 'disable':
+        opApi = disableDocument
+        break
+    }
+    const [e] = await asyncRunSafe<CommonResponse>(opApi({ datasetId, documentId: id }) as Promise<CommonResponse>)
+    if (!e) {
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      onUpdate?.()
+      // onUpdate?.(operationName)
+    }
+    else { notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') }) }
+  }
+
+  const { run: handleSwitch } = useDebounceFn((operationName: OperationName) => {
+    if (operationName === 'enable' && enabled)
+      return
+    if (operationName === 'disable' && !enabled)
+      return
+    onOperate(operationName)
+  }, { wait: 500 })
+
+  const embedding = useMemo(() => {
+    return ['queuing', 'indexing', 'paused'].includes(localStatus)
+  }, [localStatus])
+
+  return <div className={
+    cn('flex items-center',
+      reverse ? 'flex-row-reverse' : '',
+      scene === 'detail' ? s.statusItemDetail : '')
+  }>
+    <Indicator color={DOC_INDEX_STATUS_MAP[localStatus]?.color as IndicatorProps['color']} className={reverse ? 'ml-2' : 'mr-2'} />
+    <span className={cn(`${STATUS_TEXT_COLOR_MAP[DOC_INDEX_STATUS_MAP[localStatus].color as keyof typeof STATUS_TEXT_COLOR_MAP]} text-sm`, textCls)}>
+      {DOC_INDEX_STATUS_MAP[localStatus]?.text}
+    </span>
+    {
+      errorMessage && (
+        <Tooltip
+          popupContent={
+            <div className='max-w-[260px] break-all'>{errorMessage}</div>
+          }
+          triggerClassName='ml-1 w-4 h-4'
+        />
+      )
+    }
+    {
+      scene === 'detail' && (
+        <div className='ml-1.5 flex items-center justify-between'>
+          <Tooltip
+            popupContent={t('datasetDocuments.list.action.enableWarning')}
+            popupClassName='text-text-secondary system-xs-medium'
+            needsDelay
+            disabled={!archived}
+          >
+            <Switch
+              defaultValue={archived ? false : enabled}
+              onChange={v => !archived && handleSwitch(v ? 'enable' : 'disable')}
+              disabled={embedding || archived}
+              size='md'
+            />
+          </Tooltip>
+        </div>
+      )
+    }
+  </div>
+}
+
+type OperationName = 'delete' | 'archive' | 'enable' | 'disable' | 'sync' | 'un_archive'
+
+// operation action for list and detail
+export const OperationAction: FC<{
+  embeddingAvailable: boolean
+  detail: {
+    name: string
+    enabled: boolean
+    archived: boolean
+    id: string
+    data_source_type: string
+    doc_form: string
+  }
+  datasetId: string
+  onUpdate: (operationName?: string) => void
+  scene?: 'list' | 'detail'
+  className?: string
+}> = ({ embeddingAvailable, datasetId, detail, onUpdate, scene = 'list', className = '' }) => {
+  const { id, enabled = false, archived = false, data_source_type } = detail || {}
+  const [showModal, setShowModal] = useState(false)
+  const [deleting, setDeleting] = useState(false)
+  const { notify } = useContext(ToastContext)
+  const { t } = useTranslation()
+  const router = useRouter()
+  const { mutateAsync: archiveDocument } = useDocumentArchive()
+  const { mutateAsync: unArchiveDocument } = useDocumentUnArchive()
+  const { mutateAsync: enableDocument } = useDocumentEnable()
+  const { mutateAsync: disableDocument } = useDocumentDisable()
+  const { mutateAsync: deleteDocument } = useDocumentDelete()
+  const { mutateAsync: syncDocument } = useSyncDocument()
+  const { mutateAsync: syncWebsite } = useSyncWebsite()
+  const isListScene = scene === 'list'
+
+  const onOperate = async (operationName: OperationName) => {
+    let opApi
+    switch (operationName) {
+      case 'archive':
+        opApi = archiveDocument
+        break
+      case 'un_archive':
+        opApi = unArchiveDocument
+        break
+      case 'enable':
+        opApi = enableDocument
+        break
+      case 'disable':
+        opApi = disableDocument
+        break
+      case 'sync':
+        if (data_source_type === 'notion_import')
+          opApi = syncDocument
+        else
+          opApi = syncWebsite
+        break
+      default:
+        opApi = deleteDocument
+        setDeleting(true)
+        break
+    }
+    const [e] = await asyncRunSafe<CommonResponse>(opApi({ datasetId, documentId: id }) as Promise<CommonResponse>)
+    if (!e) {
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      onUpdate(operationName)
+    }
+    else { notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') }) }
+    if (operationName === 'delete')
+      setDeleting(false)
+  }
+
+  const { run: handleSwitch } = useDebounceFn((operationName: OperationName) => {
+    if (operationName === 'enable' && enabled)
+      return
+    if (operationName === 'disable' && !enabled)
+      return
+    onOperate(operationName)
+  }, { wait: 500 })
+
+  const [currDocument, setCurrDocument] = useState<{
+    id: string
+    name: string
+  } | null>(null)
+  const [isShowRenameModal, {
+    setTrue: setShowRenameModalTrue,
+    setFalse: setShowRenameModalFalse,
+  }] = useBoolean(false)
+  const handleShowRenameModal = useCallback((doc: {
+    id: string
+    name: string
+  }) => {
+    setCurrDocument(doc)
+    setShowRenameModalTrue()
+  }, [setShowRenameModalTrue])
+  const handleRenamed = useCallback(() => {
+    onUpdate()
+  }, [onUpdate])
+
+  return <div className='flex items-center' onClick={e => e.stopPropagation()}>
+    {isListScene && !embeddingAvailable && (
+      <Switch defaultValue={false} onChange={noop} disabled={true} size='md' />
+    )}
+    {isListScene && embeddingAvailable && (
+      <>
+        {archived
+          ? <Tooltip
+            popupContent={t('datasetDocuments.list.action.enableWarning')}
+            popupClassName='!font-semibold'
+            needsDelay
+          >
+            <div>
+              <Switch defaultValue={false} onChange={noop} disabled={true} size='md' />
+            </div>
+          </Tooltip>
+          : <Switch defaultValue={enabled} onChange={v => handleSwitch(v ? 'enable' : 'disable')} size='md' />
+        }
+        <Divider className='!ml-4 !mr-2 !h-3' type='vertical' />
+      </>
+    )}
+    {embeddingAvailable && (
+      <>
+        <Tooltip
+          popupContent={t('datasetDocuments.list.action.settings')}
+          popupClassName='text-text-secondary system-xs-medium'
+        >
+          <button
+            className={cn('mr-2 cursor-pointer rounded-lg',
+              !isListScene
+                ? 'border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg p-2 shadow-xs shadow-shadow-shadow-3 backdrop-blur-[5px] hover:border-components-button-secondary-border-hover hover:bg-components-button-secondary-bg-hover'
+                : 'p-0.5 hover:bg-state-base-hover')}
+            onClick={() => router.push(`/datasets/${datasetId}/documents/${detail.id}/settings`)}>
+            <RiEqualizer2Line className='h-4 w-4 text-components-button-secondary-text' />
+          </button>
+        </Tooltip>
+        <Popover
+          htmlContent={
+            <div className='w-full py-1'>
+              {!archived && (
+                <>
+                  <div className={s.actionItem} onClick={() => {
+                    handleShowRenameModal({
+                      id: detail.id,
+                      name: detail.name,
+                    })
+                  }}>
+                    <RiEditLine className='h-4 w-4 text-text-tertiary' />
+                    <span className={s.actionName}>{t('datasetDocuments.list.table.rename')}</span>
+                  </div>
+                  {['notion_import', DataSourceType.WEB].includes(data_source_type) && (
+                    <div className={s.actionItem} onClick={() => onOperate('sync')}>
+                      <RiLoopLeftLine className='h-4 w-4 text-text-tertiary' />
+                      <span className={s.actionName}>{t('datasetDocuments.list.action.sync')}</span>
+                    </div>
+                  )}
+                  <Divider className='my-1' />
+                </>
+              )}
+              {!archived && <div className={s.actionItem} onClick={() => onOperate('archive')}>
+                <RiArchive2Line className='h-4 w-4 text-text-tertiary' />
+                <span className={s.actionName}>{t('datasetDocuments.list.action.archive')}</span>
+              </div>}
+              {archived && (
+                <div className={s.actionItem} onClick={() => onOperate('un_archive')}>
+                  <RiArchive2Line className='h-4 w-4 text-text-tertiary' />
+                  <span className={s.actionName}>{t('datasetDocuments.list.action.unarchive')}</span>
+                </div>
+              )}
+              <div className={cn(s.actionItem, s.deleteActionItem, 'group')} onClick={() => setShowModal(true)}>
+                <RiDeleteBinLine className={'h-4 w-4 text-text-tertiary group-hover:text-text-destructive'} />
+                <span className={cn(s.actionName, 'group-hover:text-text-destructive')}>{t('datasetDocuments.list.action.delete')}</span>
+              </div>
+            </div>
+          }
+          trigger='click'
+          position='br'
+          btnElement={
+            <div className={cn(s.commonIcon)}>
+              <RiMoreFill className='h-4 w-4 text-components-button-secondary-text' />
+            </div>
+          }
+          btnClassName={open => cn(isListScene ? s.actionIconWrapperList : s.actionIconWrapperDetail, open ? '!hover:bg-state-base-hover !shadow-none' : '!bg-transparent')}
+          popupClassName='!w-full'
+          className={`!z-20 flex h-fit !w-[200px] justify-end ${className}`}
+        />
+      </>
+    )}
+    {showModal
+      && <Confirm
+        isShow={showModal}
+        isLoading={deleting}
+        isDisabled={deleting}
+        title={t('datasetDocuments.list.delete.title')}
+        content={t('datasetDocuments.list.delete.content')}
+        confirmText={t('common.operation.sure')}
+        onConfirm={() => onOperate('delete')}
+        onCancel={() => setShowModal(false)}
+      />
+    }
+
+    {isShowRenameModal && currDocument && (
+      <RenameModal
+        datasetId={datasetId}
+        documentId={currDocument.id}
+        name={currDocument.name}
+        onClose={setShowRenameModalFalse}
+        onSaved={handleRenamed}
+      />
+    )}
+  </div>
+}
+
+export const renderTdValue = (value: string | number | null, isEmptyStyle = false) => {
+  return (
+    <div className={cn(isEmptyStyle ? 'text-text-tertiary' : 'text-text-secondary', s.tdValue)}>
+      {value ?? '-'}
+    </div>
+  )
+}
+
+const renderCount = (count: number | undefined) => {
+  if (!count)
+    return renderTdValue(0, true)
+
+  if (count < 1000)
+    return count
+
+  return `${formatNumber((count / 1000).toFixed(1))}k`
+}
+
+type LocalDoc = SimpleDocumentDetail & { percent?: number }
+type IDocumentListProps = {
+  embeddingAvailable: boolean
+  documents: LocalDoc[]
+  selectedIds: string[]
+  onSelectedIdChange: (selectedIds: string[]) => void
+  datasetId: string
+  pagination: PaginationProps
+  onUpdate: () => void
+  onManageMetadata: () => void
+}
+
+/**
+ * Document list component including basic information
+ */
+const DocumentList: FC<IDocumentListProps> = ({
+  embeddingAvailable,
+  documents = [],
+  selectedIds,
+  onSelectedIdChange,
+  datasetId,
+  pagination,
+  onUpdate,
+  onManageMetadata,
+}) => {
+  const { t } = useTranslation()
+  const { formatTime } = useTimestamp()
+  const router = useRouter()
+  const [datasetConfig] = useDatasetDetailContext(s => [s.dataset])
+  const chunkingMode = datasetConfig?.doc_form
+  const isGeneralMode = chunkingMode !== ChunkingMode.parentChild
+  const isQAMode = chunkingMode === ChunkingMode.qa
+  const [localDocs, setLocalDocs] = useState<LocalDoc[]>(documents)
+  const [enableSort, setEnableSort] = useState(true)
+  const {
+    isShowEditModal,
+    showEditModal,
+    hideEditModal,
+    originalList,
+    handleSave,
+  } = useBatchEditDocumentMetadata({
+    datasetId,
+    docList: documents.filter(item => selectedIds.includes(item.id)),
+    onUpdate,
+  })
+
+  useEffect(() => {
+    setLocalDocs(documents)
+  }, [documents])
+
+  const onClickSort = () => {
+    setEnableSort(!enableSort)
+    if (enableSort) {
+      const sortedDocs = [...localDocs].sort((a, b) => dayjs(a.created_at).isBefore(dayjs(b.created_at)) ? -1 : 1)
+      setLocalDocs(sortedDocs)
+    }
+    else {
+      setLocalDocs(documents)
+    }
+  }
+
+  const [currDocument, setCurrDocument] = useState<LocalDoc | null>(null)
+  const [isShowRenameModal, {
+    setTrue: setShowRenameModalTrue,
+    setFalse: setShowRenameModalFalse,
+  }] = useBoolean(false)
+  const handleShowRenameModal = useCallback((doc: LocalDoc) => {
+    setCurrDocument(doc)
+    setShowRenameModalTrue()
+  }, [setShowRenameModalTrue])
+  const handleRenamed = useCallback(() => {
+    onUpdate()
+  }, [onUpdate])
+
+  const isAllSelected = useMemo(() => {
+    return localDocs.length > 0 && localDocs.every(doc => selectedIds.includes(doc.id))
+  }, [localDocs, selectedIds])
+
+  const isSomeSelected = useMemo(() => {
+    return localDocs.some(doc => selectedIds.includes(doc.id))
+  }, [localDocs, selectedIds])
+
+  const onSelectedAll = useCallback(() => {
+    if (isAllSelected)
+      onSelectedIdChange([])
+    else
+      onSelectedIdChange(uniq([...selectedIds, ...localDocs.map(doc => doc.id)]))
+  }, [isAllSelected, localDocs, onSelectedIdChange, selectedIds])
+  const { mutateAsync: archiveDocument } = useDocumentArchive()
+  const { mutateAsync: enableDocument } = useDocumentEnable()
+  const { mutateAsync: disableDocument } = useDocumentDisable()
+  const { mutateAsync: deleteDocument } = useDocumentDelete()
+
+  const handleAction = (actionName: DocumentActionType) => {
+    return async () => {
+      let opApi
+      switch (actionName) {
+        case DocumentActionType.archive:
+          opApi = archiveDocument
+          break
+        case DocumentActionType.enable:
+          opApi = enableDocument
+          break
+        case DocumentActionType.disable:
+          opApi = disableDocument
+          break
+        default:
+          opApi = deleteDocument
+          break
+      }
+      const [e] = await asyncRunSafe<CommonResponse>(opApi({ datasetId, documentIds: selectedIds }) as Promise<CommonResponse>)
+
+      if (!e) {
+        Toast.notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+        onUpdate()
+      }
+      else { Toast.notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') }) }
+    }
+  }
+
+  return (
+    <div className='relative flex h-full w-full flex-col'>
+      <div className='relative grow overflow-x-auto'>
+        <table className={`mt-3 w-full min-w-[700px] max-w-full border-collapse border-0 text-sm ${s.documentTable}`}>
+          <thead className="h-8 border-b border-divider-subtle text-xs font-medium uppercase leading-8 text-text-tertiary">
+            <tr>
+              <td className='w-12'>
+                <div className='flex items-center' onClick={e => e.stopPropagation()}>
+                  {embeddingAvailable && (
+                    <Checkbox
+                      className='mr-2 shrink-0'
+                      checked={isAllSelected}
+                      indeterminate={!isAllSelected && isSomeSelected}
+                      onCheck={onSelectedAll}
+                    />
+                  )}
+                  #
+                </div>
+              </td>
+              <td>
+                <div className='flex'>
+                  {t('datasetDocuments.list.table.header.fileName')}
+                </div>
+              </td>
+              <td className='w-[130px]'>{t('datasetDocuments.list.table.header.chunkingMode')}</td>
+              <td className='w-24'>{t('datasetDocuments.list.table.header.words')}</td>
+              <td className='w-44'>{t('datasetDocuments.list.table.header.hitCount')}</td>
+              <td className='w-44'>
+                <div className='flex items-center' onClick={onClickSort}>
+                  {t('datasetDocuments.list.table.header.uploadTime')}
+                  <ArrowDownIcon className={cn('ml-0.5 h-3 w-3 cursor-pointer stroke-current stroke-2', enableSort ? 'text-text-tertiary' : 'text-text-disabled')} />
+                </div>
+              </td>
+              <td className='w-40'>{t('datasetDocuments.list.table.header.status')}</td>
+              <td className='w-20'>{t('datasetDocuments.list.table.header.action')}</td>
+            </tr>
+          </thead>
+          <tbody className="text-text-secondary">
+            {localDocs.map((doc, index) => {
+              const isFile = doc.data_source_type === DataSourceType.FILE
+              const fileType = isFile ? doc.data_source_detail_dict?.upload_file?.extension : ''
+              return <tr
+                key={doc.id}
+                className={'h-8 cursor-pointer border-b border-divider-subtle hover:bg-background-default-hover'}
+                onClick={() => {
+                  router.push(`/datasets/${datasetId}/documents/${doc.id}`)
+                }}>
+                <td className='text-left align-middle text-xs text-text-tertiary'>
+                  <div className='flex items-center' onClick={e => e.stopPropagation()}>
+                    <Checkbox
+                      className='mr-2 shrink-0'
+                      checked={selectedIds.includes(doc.id)}
+                      onCheck={() => {
+                        onSelectedIdChange(
+                          selectedIds.includes(doc.id)
+                            ? selectedIds.filter(id => id !== doc.id)
+                            : [...selectedIds, doc.id],
+                        )
+                      }}
+                    />
+                    {/* {doc.position} */}
+                    {index + 1}
+                  </div>
+                </td>
+                <td>
+                  <div className={'group mr-6 flex max-w-[460px] items-center hover:mr-0'}>
+                    <div className='shrink-0'>
+                      {doc?.data_source_type === DataSourceType.NOTION && <NotionIcon className='mr-1.5 mt-[-3px] inline-flex align-middle' type='page' src={doc.data_source_info.notion_page_icon} />}
+                      {doc?.data_source_type === DataSourceType.FILE && <FileTypeIcon type={extensionToFileType(doc?.data_source_info?.upload_file?.extension ?? fileType)} className='mr-1.5' />}
+                      {doc?.data_source_type === DataSourceType.WEB && <Globe01 className='mr-1.5 mt-[-3px] inline-flex align-middle' />}
+                    </div>
+                    <span className='grow-1 truncate text-sm'>{doc.name}</span>
+                    <div className='hidden shrink-0 group-hover:ml-auto group-hover:flex'>
+                      <Tooltip
+                        popupContent={t('datasetDocuments.list.table.rename')}
+                      >
+                        <div
+                          className='cursor-pointer rounded-md p-1 hover:bg-state-base-hover'
+                          onClick={(e) => {
+                            e.stopPropagation()
+                            handleShowRenameModal(doc)
+                          }}
+                        >
+                          <RiEditLine className='h-4 w-4 text-text-tertiary' />
+                        </div>
+                      </Tooltip>
+                    </div>
+                  </div>
+                </td>
+                <td>
+                  <ChunkingModeLabel
+                    isGeneralMode={isGeneralMode}
+                    isQAMode={isQAMode}
+                  />
+                </td>
+                <td>{renderCount(doc.word_count)}</td>
+                <td>{renderCount(doc.hit_count)}</td>
+                <td className='text-[13px] text-text-secondary'>
+                  {formatTime(doc.created_at, t('datasetHitTesting.dateTimeFormat') as string)}
+                </td>
+                <td>
+                  {
+                    (['indexing', 'splitting', 'parsing', 'cleaning'].includes(doc.indexing_status) && doc?.data_source_type === DataSourceType.NOTION)
+                      ? <ProgressBar percent={doc.percent || 0} />
+                      : <StatusItem status={doc.display_status} />
+                  }
+                </td>
+                <td>
+                  <OperationAction
+                    embeddingAvailable={embeddingAvailable}
+                    datasetId={datasetId}
+                    detail={pick(doc, ['name', 'enabled', 'archived', 'id', 'data_source_type', 'doc_form'])}
+                    onUpdate={onUpdate}
+                  />
+                </td>
+              </tr>
+            })}
+          </tbody>
+        </table>
+      </div>
+      {(selectedIds.length > 0) && (
+        <BatchAction
+          className='absolute bottom-16 left-0 z-20'
+          selectedIds={selectedIds}
+          onArchive={handleAction(DocumentActionType.archive)}
+          onBatchEnable={handleAction(DocumentActionType.enable)}
+          onBatchDisable={handleAction(DocumentActionType.disable)}
+          onBatchDelete={handleAction(DocumentActionType.delete)}
+          onEditMetadata={showEditModal}
+          onCancel={() => {
+            onSelectedIdChange([])
+          }}
+        />
+      )}
+      {/* Show Pagination only if the total is more than the limit */}
+      {pagination.total && (
+        <Pagination
+          {...pagination}
+          className='w-full shrink-0 px-0 pb-0'
+        />
+      )}
+
+      {isShowRenameModal && currDocument && (
+        <RenameModal
+          datasetId={datasetId}
+          documentId={currDocument.id}
+          name={currDocument.name}
+          onClose={setShowRenameModalFalse}
+          onSaved={handleRenamed}
+        />
+      )}
+
+      {isShowEditModal && (
+        <EditMetadataBatchModal
+          datasetId={datasetId}
+          documentNum={selectedIds.length}
+          list={originalList}
+          onSave={handleSave}
+          onHide={hideEditModal}
+          onShowManage={() => {
+            hideEditModal()
+            onManageMetadata()
+          }}
+        />
+      )}
+    </div>
+  )
+}
+
+export default DocumentList
diff --git a/app/components/datasets/documents/rename-modal.tsx b/app/components/datasets/documents/rename-modal.tsx
new file mode 100644
index 0000000..ff50479
--- /dev/null
+++ b/app/components/datasets/documents/rename-modal.tsx
@@ -0,0 +1,76 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import Toast from '../../base/toast'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import { renameDocumentName } from '@/service/datasets'
+
+type Props = {
+  datasetId: string
+  documentId: string
+  name: string
+  onClose: () => void
+  onSaved: () => void
+}
+
+const RenameModal: FC<Props> = ({
+  documentId,
+  datasetId,
+  name,
+  onClose,
+  onSaved,
+}) => {
+  const { t } = useTranslation()
+
+  const [newName, setNewName] = useState(name)
+  const [saveLoading, {
+    setTrue: setSaveLoadingTrue,
+    setFalse: setSaveLoadingFalse,
+  }] = useBoolean(false)
+
+  const handleSave = async () => {
+    setSaveLoadingTrue()
+    try {
+      await renameDocumentName({
+        datasetId,
+        documentId,
+        name: newName,
+      })
+      Toast.notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      onSaved()
+      onClose()
+    }
+    catch (error) {
+      if (error)
+        Toast.notify({ type: 'error', message: error.toString() })
+    }
+    finally {
+      setSaveLoadingFalse()
+    }
+  }
+
+  return (
+    <Modal
+      title={t('datasetDocuments.list.table.rename')}
+      isShow
+      onClose={onClose}
+    >
+      <div className={'mt-6 text-sm font-medium leading-[21px] text-text-primary'}>{t('datasetDocuments.list.table.name')}</div>
+      <Input
+        className='mt-2 h-10'
+        value={newName}
+        onChange={e => setNewName(e.target.value)}
+      />
+
+      <div className='mt-10 flex justify-end'>
+        <Button className='mr-2 shrink-0' onClick={onClose}>{t('common.operation.cancel')}</Button>
+        <Button variant='primary' className='shrink-0' onClick={handleSave} loading={saveLoading}>{t('common.operation.save')}</Button>
+      </div>
+    </Modal>
+  )
+}
+export default React.memo(RenameModal)
diff --git a/app/components/datasets/documents/style.module.css b/app/components/datasets/documents/style.module.css
new file mode 100644
index 0000000..ececd3a
--- /dev/null
+++ b/app/components/datasets/documents/style.module.css
@@ -0,0 +1,118 @@
+.documentTable tbody td {
+  padding: 5px 10px 5px 12px;
+  box-sizing: border-box;
+  max-width: 200px;
+}
+.documentTable thead td {
+  padding: 0px 10px 0px 12px;
+  box-sizing: border-box;
+  max-width: 200px;
+}
+.actionIconWrapperList {
+  @apply h-6 w-6 rounded-md border-none p-1 hover:bg-state-base-hover !important;
+}
+.actionIconWrapperDetail {
+  @apply p-2 bg-components-button-secondary-bg hover:bg-components-button-secondary-bg-hover
+  border-[0.5px] border-components-button-secondary-border hover:border-components-button-secondary-border-hover
+  shadow-xs shadow-shadow-shadow-3 !important;
+}
+.actionItem {
+  @apply h-9 py-2 px-3 mx-1 flex items-center gap-2 hover:bg-state-base-hover rounded-lg cursor-pointer;
+}
+.deleteActionItem {
+  @apply hover:bg-state-destructive-hover !important;
+}
+.actionName {
+  @apply text-text-secondary text-sm;
+}
+.addFileBtn {
+  @apply mt-4 w-fit !text-[13px] text-primary-600 font-medium bg-white border-[0.5px];
+}
+.plusIcon {
+  @apply w-4 h-4 mr-2 stroke-current stroke-[1.5px];
+}
+.emptyWrapper {
+  @apply flex items-center justify-center h-full;
+}
+.emptyElement {
+  @apply bg-gray-50 w-[560px] h-fit box-border px-5 py-4 rounded-2xl;
+}
+.emptyTitle {
+  @apply text-gray-700 font-semibold;
+}
+.emptyTip {
+  @apply mt-2 text-gray-500 text-sm font-normal;
+}
+.emptySymbolIconWrapper {
+  @apply w-[44px] h-[44px] border border-solid border-gray-100 rounded-lg flex items-center justify-center mb-2;
+}
+.commonIcon {
+  @apply w-4 h-4 inline-block align-middle;
+  background-repeat: no-repeat;
+  background-position: center center;
+  background-size: contain;
+}
+.actionIcon {
+  @apply bg-gray-500;
+  mask-image: url(~@/assets/action.svg);
+}
+.pdfIcon {
+  background-image: url(~@/assets/pdf.svg);
+}
+.jsonIcon {
+  background-image: url(~@/assets/json.svg);
+}
+.htmlIcon {
+  background-image: url(~@/assets/html.svg);
+}
+.txtIcon {
+  background-image: url(~@/assets/txt.svg);
+}
+.markdownIcon {
+  background-image: url(~@/assets/md.svg);
+}
+.mdIcon {
+  background-image: url(~@/assets/md.svg);
+}
+.xlsIcon {
+  background-image: url(~@/assets/xlsx.svg);
+}
+.xlsxIcon {
+  background-image: url(~@/assets/xlsx.svg);
+}
+.csvIcon {
+  background-image: url(~@/assets/csv.svg);
+}
+.docIcon {
+  background-image: url(~@/assets/doc.svg);
+}
+.docxIcon {
+  background-image: url(~@/assets/docx.svg);
+}
+.statusItemDetail {
+  @apply border-[0.5px] border-components-button-secondary-border inline-flex items-center
+  rounded-lg pl-2.5 pr-2 py-2 mr-2 shadow-xs shadow-shadow-shadow-3 backdrop-blur-[5px];
+}
+.tdValue {
+  @apply text-sm overflow-hidden text-ellipsis whitespace-nowrap;
+}
+.delModal {
+  background: linear-gradient(
+      180deg,
+      rgba(217, 45, 32, 0.05) 0%,
+      rgba(217, 45, 32, 0) 24.02%
+    ),
+    #f9fafb;
+  box-shadow: 0px 20px 24px -4px rgba(16, 24, 40, 0.08),
+    0px 8px 8px -4px rgba(16, 24, 40, 0.03);
+  @apply rounded-2xl p-8;
+}
+.warningWrapper {
+  box-shadow: 0px 20px 24px -4px rgba(16, 24, 40, 0.08),
+    0px 8px 8px -4px rgba(16, 24, 40, 0.03);
+  background: rgba(255, 255, 255, 0.9);
+  @apply h-12 w-12 border-[0.5px] border-gray-100 rounded-xl mb-3 flex items-center justify-center;
+}
+.warningIcon {
+  @apply w-[22px] h-[22px] fill-current text-red-600;
+}
diff --git a/app/components/datasets/external-api/declarations.ts b/app/components/datasets/external-api/declarations.ts
new file mode 100644
index 0000000..ded736d
--- /dev/null
+++ b/app/components/datasets/external-api/declarations.ts
@@ -0,0 +1,16 @@
+export type CreateExternalAPIReq = {
+  name: string
+  settings: {
+    endpoint: string
+    api_key: string
+  }
+}
+
+export type FormSchema = {
+  variable: string
+  type: 'text' | 'secret'
+  label: {
+    [key: string]: string
+  }
+  required: boolean
+}
diff --git a/app/components/datasets/external-api/external-api-modal/Form.tsx b/app/components/datasets/external-api/external-api-modal/Form.tsx
new file mode 100644
index 0000000..2746a32
--- /dev/null
+++ b/app/components/datasets/external-api/external-api-modal/Form.tsx
@@ -0,0 +1,92 @@
+import React, { useState } from 'react'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiBookOpenLine } from '@remixicon/react'
+import type { CreateExternalAPIReq, FormSchema } from '../declarations'
+import Input from '@/app/components/base/input'
+import cn from '@/utils/classnames'
+
+type FormProps = {
+  className?: string
+  itemClassName?: string
+  fieldLabelClassName?: string
+  value: CreateExternalAPIReq
+  onChange: (val: CreateExternalAPIReq) => void
+  formSchemas: FormSchema[]
+  inputClassName?: string
+}
+
+const Form: FC<FormProps> = React.memo(({
+  className,
+  itemClassName,
+  fieldLabelClassName,
+  value,
+  onChange,
+  formSchemas,
+  inputClassName,
+}) => {
+  const { t, i18n } = useTranslation()
+  const [changeKey, setChangeKey] = useState('')
+
+  const handleFormChange = (key: string, val: string) => {
+    setChangeKey(key)
+    if (key === 'name') {
+      onChange({ ...value, [key]: val })
+    }
+    else {
+      onChange({
+        ...value,
+        settings: {
+          ...value.settings,
+          [key]: val,
+        },
+      })
+    }
+  }
+
+  const renderField = (formSchema: FormSchema) => {
+    const { variable, type, label, required } = formSchema
+    const fieldValue = variable === 'name' ? value[variable] : (value.settings[variable as keyof typeof value.settings] || '')
+
+    return (
+      <div key={variable} className={cn(itemClassName, 'flex flex-col items-start gap-1 self-stretch')}>
+        <div className="flex w-full items-center justify-between">
+          <label className={cn(fieldLabelClassName, 'system-sm-semibold text-text-secondary')} htmlFor={variable}>
+            {label[i18n.language] || label.en_US}
+            {required && <span className='ml-1 text-red-500'>*</span>}
+          </label>
+          {variable === 'endpoint' && (
+            <a
+              href={'https://docs.dify.ai/guides/knowledge-base/external-knowledge-api-documentation' || '/'}
+              target='_blank'
+              rel='noopener noreferrer'
+              className='body-xs-regular flex items-center text-text-accent'
+            >
+              <RiBookOpenLine className='mr-1 h-3 w-3 text-text-accent' />
+              {t('dataset.externalAPIPanelDocumentation')}
+            </a>
+          )}
+        </div>
+        <Input
+          type={type === 'secret' ? 'password' : 'text'}
+          id={variable}
+          name={variable}
+          value={fieldValue}
+          onChange={val => handleFormChange(variable, val.target.value)}
+          required={required}
+          className={cn(inputClassName)}
+        />
+      </div>
+    )
+  }
+
+  return (
+    <form className={cn('flex flex-col items-start justify-center gap-4 self-stretch', className)}>
+      {formSchemas.map(formSchema => renderField(formSchema))}
+    </form>
+  )
+})
+
+Form.displayName = 'Form'
+
+export default Form
diff --git a/app/components/datasets/external-api/external-api-modal/index.tsx b/app/components/datasets/external-api/external-api-modal/index.tsx
new file mode 100644
index 0000000..8614664
--- /dev/null
+++ b/app/components/datasets/external-api/external-api-modal/index.tsx
@@ -0,0 +1,218 @@
+import type { FC } from 'react'
+import {
+  memo,
+  useEffect,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiBook2Line,
+  RiCloseLine,
+  RiInformation2Line,
+  RiLock2Fill,
+} from '@remixicon/react'
+import type { CreateExternalAPIReq, FormSchema } from '../declarations'
+import Form from './Form'
+import ActionButton from '@/app/components/base/action-button'
+import Confirm from '@/app/components/base/confirm'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+} from '@/app/components/base/portal-to-follow-elem'
+import { createExternalAPI } from '@/service/datasets'
+import { useToastContext } from '@/app/components/base/toast'
+import Button from '@/app/components/base/button'
+import Tooltip from '@/app/components/base/tooltip'
+
+type AddExternalAPIModalProps = {
+  data?: CreateExternalAPIReq
+  onSave: (formValue: CreateExternalAPIReq) => void
+  onCancel: () => void
+  onEdit?: (formValue: CreateExternalAPIReq) => Promise<void>
+  datasetBindings?: { id: string; name: string }[]
+  isEditMode: boolean
+}
+
+const formSchemas: FormSchema[] = [
+  {
+    variable: 'name',
+    type: 'text',
+    label: {
+      en_US: 'Name',
+    },
+    required: true,
+  },
+  {
+    variable: 'endpoint',
+    type: 'text',
+    label: {
+      en_US: 'API Endpoint',
+    },
+    required: true,
+  },
+  {
+    variable: 'api_key',
+    type: 'secret',
+    label: {
+      en_US: 'API Key',
+    },
+    required: true,
+  },
+]
+
+const AddExternalAPIModal: FC<AddExternalAPIModalProps> = ({ data, onSave, onCancel, datasetBindings, isEditMode, onEdit }) => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const [loading, setLoading] = useState(false)
+  const [showConfirm, setShowConfirm] = useState(false)
+  const [formData, setFormData] = useState<CreateExternalAPIReq>({ name: '', settings: { endpoint: '', api_key: '' } })
+
+  useEffect(() => {
+    if (isEditMode && data)
+      setFormData(data)
+  }, [isEditMode, data])
+
+  const hasEmptyInputs = Object.values(formData).some(value =>
+    typeof value === 'string' ? value.trim() === '' : Object.values(value).some(v => v.trim() === ''),
+  )
+  const handleDataChange = (val: CreateExternalAPIReq) => {
+    setFormData(val)
+  }
+
+  const handleSave = async () => {
+    if (formData && formData.settings.api_key && formData.settings.api_key?.length < 5) {
+      notify({ type: 'error', message: t('common.apiBasedExtension.modal.apiKey.lengthError') })
+      setLoading(false)
+      return
+    }
+    try {
+      setLoading(true)
+      if (isEditMode && onEdit) {
+        await onEdit(
+          {
+            ...formData,
+            settings: { ...formData.settings, api_key: formData.settings.api_key ? '[__HIDDEN__]' : formData.settings.api_key },
+          },
+        )
+        notify({ type: 'success', message: 'External API updated successfully' })
+      }
+      else {
+        const res = await createExternalAPI({ body: formData })
+        if (res && res.id) {
+          notify({ type: 'success', message: 'External API saved successfully' })
+          onSave(res)
+        }
+      }
+      onCancel()
+    }
+    catch (error) {
+      console.error('Error saving/updating external API:', error)
+      notify({ type: 'error', message: 'Failed to save/update External API' })
+    }
+    finally {
+      setLoading(false)
+    }
+  }
+
+  return (
+    <PortalToFollowElem open>
+      <PortalToFollowElemContent className='z-[60] h-full w-full'>
+        <div className='fixed inset-0 flex items-center justify-center bg-black/[.25]'>
+          <div className='shadows-shadow-xl relative flex w-[480px] flex-col items-start rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg'>
+            <div className='flex flex-col items-start gap-2 self-stretch pb-3 pl-6 pr-14 pt-6'>
+              <div className='title-2xl-semi-bold grow self-stretch text-text-primary'>
+                {
+                  isEditMode ? t('dataset.editExternalAPIFormTitle') : t('dataset.createExternalAPI')
+                }
+              </div>
+              {isEditMode && (datasetBindings?.length ?? 0) > 0 && (
+                <div className='system-xs-regular flex items-center text-text-tertiary'>
+                  {t('dataset.editExternalAPIFormWarning.front')}
+                  <span className='flex cursor-pointer items-center text-text-accent'>
+                    &nbsp;{datasetBindings?.length} {t('dataset.editExternalAPIFormWarning.end')}&nbsp;
+                    <Tooltip
+                      popupClassName='flex items-center self-stretch w-[320px]'
+                      popupContent={
+                        <div className='p-1'>
+                          <div className='flex items-start self-stretch pb-0.5 pl-2 pr-3 pt-1'>
+                            <div className='system-xs-medium-uppercase text-text-tertiary'>{`${datasetBindings?.length} ${t('dataset.editExternalAPITooltipTitle')}`}</div>
+                          </div>
+                          {datasetBindings?.map(binding => (
+                            <div key={binding.id} className='flex items-center gap-1 self-stretch px-2 py-1'>
+                              <RiBook2Line className='h-4 w-4 text-text-secondary' />
+                              <div className='system-sm-medium text-text-secondary'>{binding.name}</div>
+                            </div>
+                          ))}
+                        </div>
+                      }
+                      asChild={false}
+                      position='bottom'
+                    >
+                      <RiInformation2Line className='h-3.5 w-3.5' />
+                    </Tooltip>
+                  </span>
+                </div>
+              )}
+            </div>
+            <ActionButton className='absolute right-5 top-5' onClick={onCancel}>
+              <RiCloseLine className='h-[18px] w-[18px] shrink-0 text-text-tertiary' />
+            </ActionButton>
+            <Form
+              value={formData}
+              onChange={handleDataChange}
+              formSchemas={formSchemas}
+              className='flex flex-col items-start justify-center gap-4 self-stretch px-6 py-3'
+            />
+            <div className='flex items-center justify-end gap-2 self-stretch p-6 pt-5'>
+              <Button type='button' variant='secondary' onClick={onCancel}>
+                {t('dataset.externalAPIForm.cancel')}
+              </Button>
+              <Button
+                type='submit'
+                variant='primary'
+                onClick={() => {
+                  if (isEditMode && (datasetBindings?.length ?? 0) > 0)
+                    setShowConfirm(true)
+                  else if (isEditMode && onEdit)
+                    onEdit(formData)
+
+                  else
+                    handleSave()
+                }}
+                disabled={hasEmptyInputs || loading}
+              >
+                {t('dataset.externalAPIForm.save')}
+              </Button>
+            </div>
+            <div className='system-xs-regular flex items-center justify-center gap-1 self-stretch rounded-b-2xl border-t-[0.5px]
+              border-divider-subtle bg-background-soft px-2 py-3 text-text-tertiary'
+            >
+              <RiLock2Fill className='h-3 w-3 text-text-quaternary' />
+              {t('dataset.externalAPIForm.encrypted.front')}
+              <a
+                className='text-text-accent'
+                target='_blank' rel='noopener noreferrer'
+                href='https://pycryptodome.readthedocs.io/en/latest/src/cipher/oaep.html'
+              >
+                PKCS1_OAEP
+              </a>
+              {t('dataset.externalAPIForm.encrypted.end')}
+            </div>
+          </div>
+          {showConfirm && (datasetBindings?.length ?? 0) > 0 && (
+            <Confirm
+              isShow={showConfirm}
+              type='warning'
+              title='Warning'
+              content={`${t('dataset.editExternalAPIConfirmWarningContent.front')} ${datasetBindings?.length} ${t('dataset.editExternalAPIConfirmWarningContent.end')}`}
+              onCancel={() => setShowConfirm(false)}
+              onConfirm={handleSave}
+            />
+          )}
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default memo(AddExternalAPIModal)
diff --git a/app/components/datasets/external-api/external-api-panel/index.tsx b/app/components/datasets/external-api/external-api-panel/index.tsx
new file mode 100644
index 0000000..d4af34f
--- /dev/null
+++ b/app/components/datasets/external-api/external-api-panel/index.tsx
@@ -0,0 +1,90 @@
+import React from 'react'
+import {
+  RiAddLine,
+  RiBookOpenLine,
+  RiCloseLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import ExternalKnowledgeAPICard from '../external-knowledge-api-card'
+import cn from '@/utils/classnames'
+import { useExternalKnowledgeApi } from '@/context/external-knowledge-api-context'
+import ActionButton from '@/app/components/base/action-button'
+import Button from '@/app/components/base/button'
+import Loading from '@/app/components/base/loading'
+import { useModalContext } from '@/context/modal-context'
+
+type ExternalAPIPanelProps = {
+  onClose: () => void
+}
+
+const ExternalAPIPanel: React.FC<ExternalAPIPanelProps> = ({ onClose }) => {
+  const { t } = useTranslation()
+  const { setShowExternalKnowledgeAPIModal } = useModalContext()
+  const { externalKnowledgeApiList, mutateExternalKnowledgeApis, isLoading } = useExternalKnowledgeApi()
+
+  const handleOpenExternalAPIModal = () => {
+    setShowExternalKnowledgeAPIModal({
+      payload: { name: '', settings: { endpoint: '', api_key: '' } },
+      datasetBindings: [],
+      onSaveCallback: () => {
+        mutateExternalKnowledgeApis()
+      },
+      onCancelCallback: () => {
+        mutateExternalKnowledgeApis()
+      },
+      isEditMode: false,
+    })
+  }
+
+  return (
+    <div
+      tabIndex={-1}
+      className={cn('absolute bottom-2 right-0 top-14 z-10 flex outline-none')}
+    >
+      <div
+        className={cn(
+          'relative flex h-full w-[420px] flex-col rounded-l-2xl border border-components-panel-border bg-components-panel-bg-alt',
+        )}
+      >
+        <div className='flex items-start self-stretch p-4 pb-0'>
+          <div className='flex grow flex-col items-start gap-1'>
+            <div className='system-xl-semibold self-stretch text-text-primary'>{t('dataset.externalAPIPanelTitle')}</div>
+            <div className='body-xs-regular self-stretch text-text-tertiary'>{t('dataset.externalAPIPanelDescription')}</div>
+            <a className='flex cursor-pointer items-center justify-center gap-1 self-stretch' href='https://docs.dify.ai/guides/knowledge-base/external-knowledge-api-documentation' target='_blank'>
+              <RiBookOpenLine className='h-3 w-3 text-text-accent' />
+              <div className='body-xs-regular grow text-text-accent'>{t('dataset.externalAPIPanelDocumentation')}</div>
+            </a>
+          </div>
+          <div className='flex items-center'>
+            <ActionButton onClick={() => onClose()}>
+              <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+            </ActionButton>
+          </div>
+        </div>
+        <div className='flex flex-col items-start justify-center gap-2 self-stretch px-4 py-3'>
+          <Button
+            variant={'primary'}
+            className='flex items-center justify-center gap-0.5 px-3 py-2'
+            onClick={handleOpenExternalAPIModal}
+          >
+            <RiAddLine className='h-4 w-4 text-components-button-primary-text' />
+            <div className='system-sm-medium text-components-button-primary-text'>{t('dataset.createExternalAPI')}</div>
+          </Button>
+        </div>
+        <div className='flex grow flex-col items-start gap-1 self-stretch px-4 py-0'>
+          {isLoading
+            ? (
+              <Loading />
+            )
+            : (
+              externalKnowledgeApiList.map(api => (
+                <ExternalKnowledgeAPICard key={api.id} api={api} />
+              ))
+            )}
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default ExternalAPIPanel
diff --git a/app/components/datasets/external-api/external-knowledge-api-card/index.tsx b/app/components/datasets/external-api/external-knowledge-api-card/index.tsx
new file mode 100644
index 0000000..bb50631
--- /dev/null
+++ b/app/components/datasets/external-api/external-knowledge-api-card/index.tsx
@@ -0,0 +1,151 @@
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiDeleteBinLine,
+  RiEditLine,
+} from '@remixicon/react'
+import type { CreateExternalAPIReq } from '../declarations'
+import type { ExternalAPIItem } from '@/models/datasets'
+import { checkUsageExternalAPI, deleteExternalAPI, fetchExternalAPI, updateExternalAPI } from '@/service/datasets'
+import { ApiConnectionMod } from '@/app/components/base/icons/src/vender/solid/development'
+import { useExternalKnowledgeApi } from '@/context/external-knowledge-api-context'
+import { useModalContext } from '@/context/modal-context'
+import ActionButton from '@/app/components/base/action-button'
+import Confirm from '@/app/components/base/confirm'
+
+type ExternalKnowledgeAPICardProps = {
+  api: ExternalAPIItem
+}
+
+const ExternalKnowledgeAPICard: React.FC<ExternalKnowledgeAPICardProps> = ({ api }) => {
+  const { setShowExternalKnowledgeAPIModal } = useModalContext()
+  const [showConfirm, setShowConfirm] = useState(false)
+  const [isHovered, setIsHovered] = useState(false)
+  const [usageCount, setUsageCount] = useState(0)
+  const { mutateExternalKnowledgeApis } = useExternalKnowledgeApi()
+
+  const { t } = useTranslation()
+
+  const handleEditClick = async () => {
+    try {
+      const response = await fetchExternalAPI({ apiTemplateId: api.id })
+      const formValue: CreateExternalAPIReq = {
+        name: response.name,
+        settings: {
+          endpoint: response.settings.endpoint,
+          api_key: response.settings.api_key,
+        },
+      }
+
+      setShowExternalKnowledgeAPIModal({
+        payload: formValue,
+        onSaveCallback: () => {
+          mutateExternalKnowledgeApis()
+        },
+        onCancelCallback: () => {
+          mutateExternalKnowledgeApis()
+        },
+        isEditMode: true,
+        datasetBindings: response.dataset_bindings,
+        onEditCallback: async (updatedData: CreateExternalAPIReq) => {
+          try {
+            await updateExternalAPI({
+              apiTemplateId: api.id,
+              body: {
+                ...response,
+                name: updatedData.name,
+                settings: {
+                  ...response.settings,
+                  endpoint: updatedData.settings.endpoint,
+                  api_key: updatedData.settings.api_key,
+                },
+              },
+            })
+            mutateExternalKnowledgeApis()
+          }
+          catch (error) {
+            console.error('Error updating external knowledge API:', error)
+          }
+        },
+      })
+    }
+    catch (error) {
+      console.error('Error fetching external knowledge API data:', error)
+    }
+  }
+
+  const handleDeleteClick = async () => {
+    try {
+      const usage = await checkUsageExternalAPI({ apiTemplateId: api.id })
+      if (usage.is_using)
+        setUsageCount(usage.count)
+
+      setShowConfirm(true)
+    }
+    catch (error) {
+      console.error('Error checking external API usage:', error)
+    }
+  }
+
+  const handleConfirmDelete = async () => {
+    try {
+      const response = await deleteExternalAPI({ apiTemplateId: api.id })
+      if (response && response.result === 'success') {
+        setShowConfirm(false)
+        mutateExternalKnowledgeApis()
+      }
+      else {
+        console.error('Failed to delete external API')
+      }
+    }
+    catch (error) {
+      console.error('Error deleting external knowledge API:', error)
+    }
+  }
+
+  return (
+    <>
+      <div className={`shadows-shadow-xs flex items-start self-stretch rounded-lg border-[0.5px] border-components-panel-border-subtle
+        bg-components-panel-on-panel-item-bg p-2
+        pl-3 ${isHovered ? 'border-state-destructive-border bg-state-destructive-hover' : ''}`}
+      >
+        <div className='flex grow flex-col items-start justify-center gap-1.5 py-1'>
+          <div className='flex items-center gap-1 self-stretch text-text-secondary'>
+            <ApiConnectionMod className='h-4 w-4' />
+            <div className='system-sm-medium'>{api.name}</div>
+          </div>
+          <div className='system-xs-regular self-stretch text-text-tertiary'>{api.settings.endpoint}</div>
+        </div>
+        <div className='flex items-start gap-1'>
+          <ActionButton onClick={handleEditClick}>
+            <RiEditLine className='h-4 w-4 text-text-tertiary hover:text-text-secondary' />
+          </ActionButton>
+          <ActionButton
+            className='hover:bg-state-destructive-hover'
+            onClick={handleDeleteClick}
+            onMouseEnter={() => setIsHovered(true)}
+            onMouseLeave={() => setIsHovered(false)}
+          >
+            <RiDeleteBinLine className='h-4 w-4 text-text-tertiary hover:text-text-destructive' />
+          </ActionButton>
+        </div>
+      </div>
+      {showConfirm && (
+        <Confirm
+          isShow={showConfirm}
+          title={`${t('dataset.deleteExternalAPIConfirmWarningContent.title.front')} ${api.name}${t('dataset.deleteExternalAPIConfirmWarningContent.title.end')}`}
+          content={
+            usageCount > 0
+              ? `${t('dataset.deleteExternalAPIConfirmWarningContent.content.front')} ${usageCount} ${t('dataset.deleteExternalAPIConfirmWarningContent.content.end')}`
+              : t('dataset.deleteExternalAPIConfirmWarningContent.noConnectionContent')
+          }
+          type='warning'
+          onConfirm={handleConfirmDelete}
+          onCancel={() => setShowConfirm(false)}
+        />
+      )}
+    </>
+  )
+}
+
+export default ExternalKnowledgeAPICard
diff --git a/app/components/datasets/external-knowledge-base/connector/index.tsx b/app/components/datasets/external-knowledge-base/connector/index.tsx
new file mode 100644
index 0000000..33f57d0
--- /dev/null
+++ b/app/components/datasets/external-knowledge-base/connector/index.tsx
@@ -0,0 +1,36 @@
+'use client'
+
+import React, { useState } from 'react'
+import { useRouter } from 'next/navigation'
+import { useToastContext } from '@/app/components/base/toast'
+import ExternalKnowledgeBaseCreate from '@/app/components/datasets/external-knowledge-base/create'
+import type { CreateKnowledgeBaseReq } from '@/app/components/datasets/external-knowledge-base/create/declarations'
+import { createExternalKnowledgeBase } from '@/service/datasets'
+
+const ExternalKnowledgeBaseConnector = () => {
+  const { notify } = useToastContext()
+  const [loading, setLoading] = useState(false)
+  const router = useRouter()
+
+  const handleConnect = async (formValue: CreateKnowledgeBaseReq) => {
+    try {
+      setLoading(true)
+      const result = await createExternalKnowledgeBase({ body: formValue })
+      if (result && result.id) {
+        notify({ type: 'success', message: 'External Knowledge Base Connected Successfully' })
+        router.back()
+      }
+      else { throw new Error('Failed to create external knowledge base') }
+    }
+    catch (error) {
+      console.error('Error creating external knowledge base:', error)
+      notify({ type: 'error', message: 'Failed to connect External Knowledge Base' })
+    }
+    setLoading(false)
+  }
+  return (
+    <ExternalKnowledgeBaseCreate onConnect={handleConnect} loading={loading} />
+  )
+}
+
+export default ExternalKnowledgeBaseConnector
diff --git a/app/components/datasets/external-knowledge-base/create/ExternalApiSelect.tsx b/app/components/datasets/external-knowledge-base/create/ExternalApiSelect.tsx
new file mode 100644
index 0000000..d459061
--- /dev/null
+++ b/app/components/datasets/external-knowledge-base/create/ExternalApiSelect.tsx
@@ -0,0 +1,110 @@
+import React, { useEffect, useState } from 'react'
+import {
+  RiAddLine,
+  RiArrowDownSLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useRouter } from 'next/navigation'
+import { ApiConnectionMod } from '@/app/components/base/icons/src/vender/solid/development'
+import { useModalContext } from '@/context/modal-context'
+import { useExternalKnowledgeApi } from '@/context/external-knowledge-api-context'
+
+type ApiItem = {
+  value: string
+  name: string
+  url: string
+}
+
+type ExternalApiSelectProps = {
+  items: ApiItem[]
+  value?: string
+  onSelect: (item: ApiItem) => void
+}
+
+const ExternalApiSelect: React.FC<ExternalApiSelectProps> = ({ items, value, onSelect }) => {
+  const { t } = useTranslation()
+  const [isOpen, setIsOpen] = useState(false)
+  const [selectedItem, setSelectedItem] = useState<ApiItem | null>(
+    items.find(item => item.value === value) || null,
+  )
+  const { setShowExternalKnowledgeAPIModal } = useModalContext()
+  const { mutateExternalKnowledgeApis } = useExternalKnowledgeApi()
+  const router = useRouter()
+
+  useEffect(() => {
+    const newSelectedItem = items.find(item => item.value === value) || null
+    setSelectedItem(newSelectedItem)
+  }, [value, items])
+
+  const handleAddNewAPI = () => {
+    setShowExternalKnowledgeAPIModal({
+      payload: { name: '', settings: { endpoint: '', api_key: '' } },
+      onSaveCallback: async () => {
+        mutateExternalKnowledgeApis()
+        router.refresh()
+      },
+      onCancelCallback: () => {
+        mutateExternalKnowledgeApis()
+      },
+      isEditMode: false,
+    })
+  }
+
+  const handleSelect = (item: ApiItem) => {
+    setSelectedItem(item)
+    onSelect(item)
+    setIsOpen(false)
+  }
+
+  return (
+    <div className="relative w-full">
+      <div
+        className={`flex cursor-pointer items-center justify-between gap-0.5 self-stretch rounded-lg bg-components-input-bg-normal px-2
+        py-1 hover:bg-state-base-hover-alt ${isOpen && 'bg-state-base-hover-alt'}`}
+        onClick={() => setIsOpen(!isOpen)}
+      >
+        {selectedItem
+          ? (
+            <div className="flex items-center gap-2 self-stretch rounded-lg p-1">
+              <ApiConnectionMod className='h-4 w-4 text-text-secondary' />
+              <div className='flex grow items-center'>
+                <span className='system-sm-regular overflow-hidden text-ellipsis text-components-input-text-filled'>{selectedItem.name}</span>
+              </div>
+            </div>
+          )
+          : (
+            <span className='system-sm-regular text-components-input-text-placeholder'>{t('dataset.selectExternalKnowledgeAPI.placeholder')}</span>
+          )}
+        <RiArrowDownSLine className={`h-4 w-4 text-text-quaternary transition-transform ${isOpen ? 'text-text-secondary' : ''}`} />
+      </div>
+      {isOpen && (
+        <div className="absolute z-10 mt-1 w-full rounded-xl border bg-components-panel-bg-blur shadow-lg">
+          {items.map(item => (
+            <div
+              key={item.value}
+              className="flex cursor-pointer items-center p-1"
+              onClick={() => handleSelect(item)}
+            >
+              <div className="flex w-full items-center gap-2 self-stretch rounded-lg p-2 hover:bg-state-base-hover">
+                <ApiConnectionMod className='h-4 w-4 text-text-secondary' />
+                <span className='system-sm-medium grow overflow-hidden text-ellipsis text-text-secondary'>{item.name}</span>
+                <span className='system-xs-regular overflow-hidden text-ellipsis text-right text-text-tertiary'>{item.url}</span>
+              </div>
+            </div>
+          ))}
+          <div className='flex flex-col items-start self-stretch p-1'>
+            <div
+              className='flex cursor-pointer items-center gap-2 self-stretch rounded-lg p-2 hover:bg-state-base-hover'
+              onClick={handleAddNewAPI}
+            >
+              <RiAddLine className='h-4 w-4 text-text-secondary' />
+              <span className='system-sm-medium grow overflow-hidden text-ellipsis text-text-secondary'>{t('dataset.createNewExternalAPI')}</span>
+            </div>
+          </div>
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default ExternalApiSelect
diff --git a/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx b/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx
new file mode 100644
index 0000000..d70f612
--- /dev/null
+++ b/app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx
@@ -0,0 +1,96 @@
+'use client'
+
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiAddLine } from '@remixicon/react'
+import { useRouter } from 'next/navigation'
+import ExternalApiSelect from './ExternalApiSelect'
+import Input from '@/app/components/base/input'
+import Button from '@/app/components/base/button'
+import { useModalContext } from '@/context/modal-context'
+import { useExternalKnowledgeApi } from '@/context/external-knowledge-api-context'
+
+type ExternalApiSelectionProps = {
+  external_knowledge_api_id: string
+  external_knowledge_id: string
+  onChange: (data: { external_knowledge_api_id?: string; external_knowledge_id?: string }) => void
+}
+
+const ExternalApiSelection: React.FC<ExternalApiSelectionProps> = ({ external_knowledge_api_id, external_knowledge_id, onChange }) => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const { externalKnowledgeApiList } = useExternalKnowledgeApi()
+  const [selectedApiId, setSelectedApiId] = useState(external_knowledge_api_id)
+  const { setShowExternalKnowledgeAPIModal } = useModalContext()
+  const { mutateExternalKnowledgeApis } = useExternalKnowledgeApi()
+
+  const apiItems = externalKnowledgeApiList.map(api => ({
+    value: api.id,
+    name: api.name,
+    url: api.settings.endpoint,
+  }))
+
+  useEffect(() => {
+    if (apiItems.length > 0) {
+      const newSelectedId = external_knowledge_api_id || apiItems[0].value
+      setSelectedApiId(newSelectedId)
+      if (newSelectedId !== external_knowledge_api_id)
+        onChange({ external_knowledge_api_id: newSelectedId, external_knowledge_id })
+    }
+  }, [apiItems, external_knowledge_api_id, external_knowledge_id, onChange])
+
+  const handleAddNewAPI = () => {
+    setShowExternalKnowledgeAPIModal({
+      payload: { name: '', settings: { endpoint: '', api_key: '' } },
+      onSaveCallback: async () => {
+        mutateExternalKnowledgeApis()
+        router.refresh()
+      },
+      onCancelCallback: () => {
+        mutateExternalKnowledgeApis()
+      },
+      isEditMode: false,
+    })
+  }
+
+  useEffect(() => {
+    if (!external_knowledge_api_id && apiItems.length > 0)
+      onChange({ external_knowledge_api_id: apiItems[0].value, external_knowledge_id })
+  }, [])
+
+  return (
+    <form className='flex flex-col gap-4 self-stretch'>
+      <div className='flex flex-col gap-1 self-stretch'>
+        <div className='flex flex-col self-stretch'>
+          <label className='system-sm-semibold text-text-secondary'>{t('dataset.externalAPIPanelTitle')}</label>
+        </div>
+        {apiItems.length > 0
+          ? <ExternalApiSelect
+            items={apiItems}
+            value={selectedApiId}
+            onSelect={(e) => {
+              setSelectedApiId(e.value)
+              onChange({ external_knowledge_api_id: e.value, external_knowledge_id })
+            }}
+          />
+          : <Button variant={'tertiary'} onClick={handleAddNewAPI} className='justify-start gap-0.5'>
+            <RiAddLine className='h-4 w-4 text-text-tertiary' />
+            <span className='system-sm-regular text-text-tertiary'>{t('dataset.noExternalKnowledge')}</span>
+          </Button>
+        }
+      </div>
+      <div className='flex flex-col gap-1 self-stretch'>
+        <div className='flex flex-col self-stretch'>
+          <label className='system-sm-semibold text-text-secondary'>{t('dataset.externalKnowledgeId')}</label>
+        </div>
+        <Input
+          value={external_knowledge_id}
+          onChange={e => onChange({ external_knowledge_id: e.target.value, external_knowledge_api_id })}
+          placeholder={t('dataset.externalKnowledgeIdPlaceholder') ?? ''}
+        />
+      </div>
+    </form>
+  )
+}
+
+export default ExternalApiSelection
diff --git a/app/components/datasets/external-knowledge-base/create/InfoPanel.tsx b/app/components/datasets/external-knowledge-base/create/InfoPanel.tsx
new file mode 100644
index 0000000..5c3c126
--- /dev/null
+++ b/app/components/datasets/external-knowledge-base/create/InfoPanel.tsx
@@ -0,0 +1,33 @@
+import { RiBookOpenLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+
+const InfoPanel = () => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex w-[360px] flex-col items-start pb-2 pr-8 pt-[108px]'>
+      <div className='flex w-full min-w-[240px] flex-col items-start gap-3 self-stretch rounded-xl bg-background-section p-6'>
+        <div className='flex h-10 w-10 grow items-center justify-center gap-2 self-stretch rounded-lg border-[0.5px] border-components-card-border bg-components-card-bg p-1'>
+          <RiBookOpenLine className='h-5 w-5 text-text-accent' />
+        </div>
+        <p className='flex flex-col items-start gap-2 self-stretch'>
+          <span className='system-xl-semibold self-stretch text-text-secondary'>
+            {t('dataset.connectDatasetIntro.title')}
+          </span>
+          <span className='system-sm-regular text-text-tertiary'>
+            {t('dataset.connectDatasetIntro.content.front')}
+            <a className='system-sm-regular ml-1 text-text-accent' href='https://docs.dify.ai/en/guides/knowledge-base/external-knowledge-api' target='_blank' rel="noopener noreferrer">
+              {t('dataset.connectDatasetIntro.content.link')}
+            </a>
+            {t('dataset.connectDatasetIntro.content.end')}
+          </span>
+          <a className='system-sm-regular self-stretch text-text-accent' href='https://docs.dify.ai/en/guides/knowledge-base/connect-external-knowledge-base' target='_blank' rel="noopener noreferrer">
+            {t('dataset.connectDatasetIntro.learnMore')}
+          </a>
+        </p>
+      </div>
+    </div>
+  )
+}
+
+export default InfoPanel
diff --git a/app/components/datasets/external-knowledge-base/create/KnowledgeBaseInfo.tsx b/app/components/datasets/external-knowledge-base/create/KnowledgeBaseInfo.tsx
new file mode 100644
index 0000000..4261208
--- /dev/null
+++ b/app/components/datasets/external-knowledge-base/create/KnowledgeBaseInfo.tsx
@@ -0,0 +1,53 @@
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import Input from '@/app/components/base/input'
+
+type KnowledgeBaseInfoProps = {
+  name: string
+  description?: string
+  onChange: (data: { name?: string; description?: string }) => void
+}
+
+const KnowledgeBaseInfo: React.FC<KnowledgeBaseInfoProps> = ({ name, description, onChange }) => {
+  const { t } = useTranslation()
+
+  const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+    onChange({ name: e.target.value })
+  }
+
+  const handleDescriptionChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
+    onChange({ description: e.target.value })
+  }
+
+  return (
+    <form className='flex flex-col gap-4 self-stretch'>
+      <div className='flex flex-col gap-4 self-stretch'>
+        <div className='flex flex-col gap-1 self-stretch'>
+          <div className='flex flex-col justify-center self-stretch'>
+            <label className='system-sm-semibold text-text-secondary'>{t('dataset.externalKnowledgeName')}</label>
+          </div>
+          <Input
+            value={name}
+            onChange={handleNameChange}
+            placeholder={t('dataset.externalKnowledgeNamePlaceholder') ?? ''}
+          />
+        </div>
+        <div className='flex flex-col gap-1 self-stretch'>
+          <div className='flex flex-col justify-center self-stretch'>
+            <label className='system-sm-semibold text-text-secondary'>{t('dataset.externalKnowledgeDescription')}</label>
+          </div>
+          <div className='flex flex-col gap-1 self-stretch'>
+            <textarea
+              value={description}
+              onChange={ e => handleDescriptionChange(e)}
+              placeholder={t('dataset.externalKnowledgeDescriptionPlaceholder') ?? ''}
+              className={`flex h-20 items-start self-stretch rounded-lg bg-components-input-bg-normal p-3 py-2 ${description ? 'text-components-input-text-filled' : 'text-components-input-text-placeholder'} system-sm-regular`}
+            />
+          </div>
+        </div>
+      </div>
+    </form>
+  )
+}
+
+export default KnowledgeBaseInfo
diff --git a/app/components/datasets/external-knowledge-base/create/RetrievalSettings.tsx b/app/components/datasets/external-knowledge-base/create/RetrievalSettings.tsx
new file mode 100644
index 0000000..1c43d7e
--- /dev/null
+++ b/app/components/datasets/external-knowledge-base/create/RetrievalSettings.tsx
@@ -0,0 +1,67 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import TopKItem from '@/app/components/base/param-item/top-k-item'
+import ScoreThresholdItem from '@/app/components/base/param-item/score-threshold-item'
+import cn from '@/utils/classnames'
+
+type RetrievalSettingsProps = {
+  topK: number
+  scoreThreshold: number
+  scoreThresholdEnabled: boolean
+  isInHitTesting?: boolean
+  isInRetrievalSetting?: boolean
+  onChange: (data: { top_k?: number; score_threshold?: number; score_threshold_enabled?: boolean }) => void
+}
+
+const RetrievalSettings: FC<RetrievalSettingsProps> = ({
+  topK,
+  scoreThreshold,
+  scoreThresholdEnabled,
+  onChange,
+  isInHitTesting = false,
+  isInRetrievalSetting = false,
+}) => {
+  const { t } = useTranslation()
+
+  const handleScoreThresholdChange = (enabled: boolean) => {
+    onChange({ score_threshold_enabled: enabled })
+  }
+
+  return (
+    <div className={cn('flex flex-col gap-2 self-stretch', isInRetrievalSetting && 'w-full max-w-[480px]')}>
+      {!isInHitTesting && !isInRetrievalSetting && <div className='flex h-7 flex-col gap-2 self-stretch pt-1'>
+        <label className='system-sm-semibold text-text-secondary'>{t('dataset.retrievalSettings')}</label>
+      </div>}
+      <div className={cn(
+        'flex gap-4 self-stretch',
+        {
+          'flex-col': isInHitTesting,
+          'flex-row': isInRetrievalSetting,
+          'flex-col sm:flex-row': !isInHitTesting && !isInRetrievalSetting,
+        },
+      )}>
+        <div className='flex grow flex-col gap-1'>
+          <TopKItem
+            className='grow'
+            value={topK}
+            onChange={(_key, v) => onChange({ top_k: v })}
+            enable={true}
+          />
+        </div>
+        <div className='flex grow flex-col gap-1'>
+          <ScoreThresholdItem
+            className='grow'
+            value={scoreThreshold}
+            onChange={(_key, v) => onChange({ score_threshold: v })}
+            enable={scoreThresholdEnabled}
+            hasSwitch={true}
+            onSwitchChange={(_key, v) => handleScoreThresholdChange(v)}
+          />
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default RetrievalSettings
diff --git a/app/components/datasets/external-knowledge-base/create/declarations.ts b/app/components/datasets/external-knowledge-base/create/declarations.ts
new file mode 100644
index 0000000..271caf3
--- /dev/null
+++ b/app/components/datasets/external-knowledge-base/create/declarations.ts
@@ -0,0 +1,12 @@
+export type CreateKnowledgeBaseReq = {
+  name: string
+  description?: string
+  external_knowledge_api_id: string
+  provider: 'external'
+  external_knowledge_id: string
+  external_retrieval_model: {
+    top_k: number
+    score_threshold: number
+    score_threshold_enabled: boolean
+  }
+}
diff --git a/app/components/datasets/external-knowledge-base/create/index.tsx b/app/components/datasets/external-knowledge-base/create/index.tsx
new file mode 100644
index 0000000..5fbddea
--- /dev/null
+++ b/app/components/datasets/external-knowledge-base/create/index.tsx
@@ -0,0 +1,128 @@
+'use client'
+
+import { useCallback, useState } from 'react'
+import { useRouter } from 'next/navigation'
+import { RiArrowLeftLine, RiArrowRightLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import KnowledgeBaseInfo from './KnowledgeBaseInfo'
+import ExternalApiSelection from './ExternalApiSelection'
+import RetrievalSettings from './RetrievalSettings'
+import InfoPanel from './InfoPanel'
+import type { CreateKnowledgeBaseReq } from './declarations'
+import Divider from '@/app/components/base/divider'
+import Button from '@/app/components/base/button'
+
+type ExternalKnowledgeBaseCreateProps = {
+  onConnect: (formValue: CreateKnowledgeBaseReq) => void
+  loading: boolean
+}
+
+const ExternalKnowledgeBaseCreate: React.FC<ExternalKnowledgeBaseCreateProps> = ({ onConnect, loading }) => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const [formData, setFormData] = useState<CreateKnowledgeBaseReq>({
+    name: '',
+    description: '',
+    external_knowledge_api_id: '',
+    external_knowledge_id: '',
+    external_retrieval_model: {
+      top_k: 2,
+      score_threshold: 0.5,
+      score_threshold_enabled: false,
+    },
+    provider: 'external',
+
+  })
+
+  const navBackHandle = useCallback(() => {
+    router.replace('/datasets')
+  }, [router])
+
+  const handleFormChange = (newData: CreateKnowledgeBaseReq) => {
+    setFormData(newData)
+  }
+
+  const isFormValid = formData.name.trim() !== ''
+    && formData.external_knowledge_api_id !== ''
+    && formData.external_knowledge_id !== ''
+    && formData.external_retrieval_model.top_k !== undefined
+    && formData.external_retrieval_model.score_threshold !== undefined
+
+  return (
+    <div className='flex grow flex-col self-stretch rounded-t-2xl border-t border-effects-highlight bg-components-panel-bg'>
+      <div className='flex grow justify-center self-stretch'>
+        <div className='flex w-full max-w-[960px] flex-col items-center px-14 py-0'>
+          <div className='flex w-full max-w-[640px] grow flex-col items-center gap-4 pb-8 pt-6'>
+            <div className='relative flex flex-col items-center gap-[2px] self-stretch py-2'>
+              <div className='system-xl-semibold grow self-stretch text-text-primary'>{t('dataset.connectDataset')}</div>
+              <p className='system-sm-regular text-text-tertiary'>
+                <span>{t('dataset.connectHelper.helper1')}</span>
+                <span className='system-sm-medium text-text-secondary'>{t('dataset.connectHelper.helper2')}</span>
+                <span>{t('dataset.connectHelper.helper3')}</span>
+                <a className='system-sm-regular self-stretch text-text-accent' href='https://docs.dify.ai/en/guides/knowledge-base/connect-external-knowledge-base' target='_blank' rel="noopener noreferrer">
+                  {t('dataset.connectHelper.helper4')}
+                </a>
+                <span>{t('dataset.connectHelper.helper5')} </span>
+              </p>
+              <Button
+                className='absolute left-[-44px] top-1 flex h-8 w-8 items-center justify-center rounded-full p-2'
+                variant='tertiary'
+                onClick={navBackHandle}
+              >
+                <RiArrowLeftLine className='h-4 w-4 text-text-tertiary' />
+              </Button>
+            </div>
+            <KnowledgeBaseInfo
+              name={formData.name}
+              description={formData.description ?? ''}
+              onChange={data => handleFormChange({
+                ...formData,
+                ...data,
+              })}
+            />
+            <Divider />
+            <ExternalApiSelection
+              external_knowledge_api_id={formData.external_knowledge_api_id}
+              external_knowledge_id={formData.external_knowledge_id}
+              onChange={data => handleFormChange({
+                ...formData,
+                ...data,
+              })}
+            />
+            <RetrievalSettings
+              topK={formData.external_retrieval_model.top_k}
+              scoreThreshold={formData.external_retrieval_model.score_threshold}
+              scoreThresholdEnabled={formData.external_retrieval_model.score_threshold_enabled}
+              onChange={data => handleFormChange({
+                ...formData,
+                external_retrieval_model: {
+                  ...formData.external_retrieval_model,
+                  ...data,
+                },
+              })}
+            />
+            <div className='flex items-center justify-end gap-2 self-stretch py-2'>
+              <Button variant='secondary' onClick={navBackHandle}>
+                <div className='system-sm-medium text-components-button-secondary-text'>{t('dataset.externalKnowledgeForm.cancel')}</div>
+              </Button>
+              <Button
+                variant='primary'
+                onClick={() => {
+                  onConnect(formData)
+                }}
+                disabled={!isFormValid}
+                loading={loading}
+              >
+                <div className='system-sm-medium text-components-button-primary-text'>{t('dataset.externalKnowledgeForm.connect')}</div>
+                <RiArrowRightLine className='h-4 w-4 text-components-button-primary-text' />
+              </Button>
+            </div>
+          </div>
+        </div>
+        <InfoPanel />
+      </div>
+    </div>
+  )
+}
+
+export default ExternalKnowledgeBaseCreate
diff --git a/app/components/datasets/formatted-text/flavours/edit-slice.tsx b/app/components/datasets/formatted-text/flavours/edit-slice.tsx
new file mode 100644
index 0000000..44bd170
--- /dev/null
+++ b/app/components/datasets/formatted-text/flavours/edit-slice.tsx
@@ -0,0 +1,115 @@
+import { useState } from 'react'
+import type { FC, ReactNode } from 'react'
+import { FloatingFocusManager, type OffsetOptions, autoUpdate, flip, offset, shift, useDismiss, useFloating, useHover, useInteractions, useRole } from '@floating-ui/react'
+import { RiDeleteBinLine } from '@remixicon/react'
+// @ts-expect-error no types available
+import lineClamp from 'line-clamp'
+import type { SliceProps } from './type'
+import { SliceContainer, SliceContent, SliceDivider, SliceLabel } from './shared'
+import classNames from '@/utils/classnames'
+import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
+
+type EditSliceProps = SliceProps<{
+  label: ReactNode
+  onDelete: () => void
+  labelClassName?: string
+  labelInnerClassName?: string
+  contentClassName?: string
+  showDivider?: boolean
+  offsetOptions?: OffsetOptions
+}>
+
+export const EditSlice: FC<EditSliceProps> = (props) => {
+  const {
+    label,
+    className,
+    text,
+    onDelete,
+    labelClassName,
+    labelInnerClassName,
+    contentClassName,
+    showDivider = true,
+    offsetOptions,
+    ...rest
+  } = props
+  const [delBtnShow, setDelBtnShow] = useState(false)
+  const [isDelBtnHover, setDelBtnHover] = useState(false)
+
+  const { refs, floatingStyles, context } = useFloating({
+    open: delBtnShow,
+    onOpenChange: setDelBtnShow,
+    placement: 'right-start',
+    whileElementsMounted: autoUpdate,
+    middleware: [
+      flip(),
+      shift(),
+      offset(offsetOptions),
+    ],
+  })
+  const hover = useHover(context, {})
+  const dismiss = useDismiss(context)
+  const role = useRole(context)
+  const { getReferenceProps, getFloatingProps } = useInteractions([hover, dismiss, role])
+
+  const isDestructive = delBtnShow && isDelBtnHover
+
+  return (
+    <>
+      <SliceContainer {...rest}
+        className={classNames('block mr-0', className)}
+        ref={(ref) => {
+          refs.setReference(ref)
+          if (ref)
+            lineClamp(ref, 4)
+        }}
+        {...getReferenceProps()}
+      >
+        <SliceLabel
+          className={classNames(
+            isDestructive && '!bg-state-destructive-solid !text-text-primary-on-surface',
+            labelClassName,
+          )}
+          labelInnerClassName={labelInnerClassName}
+        >
+          {label}
+        </SliceLabel>
+        <SliceContent
+          className={classNames(
+            isDestructive && '!bg-state-destructive-hover-alt',
+            contentClassName,
+          )}
+        >
+          {text}
+        </SliceContent>
+        {showDivider && <SliceDivider
+          className={classNames(
+            isDestructive && '!bg-state-destructive-hover-alt',
+          )}
+        />}
+        {delBtnShow && <FloatingFocusManager
+          context={context}
+        >
+          <span
+            ref={refs.setFloating}
+            style={floatingStyles}
+            {...getFloatingProps()}
+            className='inline-flex items-center justify-center rounded-lg bg-components-actionbar-bg p-1 shadow'
+            onMouseEnter={() => setDelBtnHover(true)}
+            onMouseLeave={() => setDelBtnHover(false)}
+          >
+            <ActionButton
+              onClick={(e) => {
+                e.stopPropagation()
+                onDelete()
+                setDelBtnShow(false)
+              }}
+              state={ActionButtonState.Destructive}
+            >
+              <RiDeleteBinLine className='h-4 w-4' />
+            </ActionButton>
+          </span>
+        </FloatingFocusManager>}
+      </SliceContainer>
+    </>
+  )
+}
diff --git a/app/components/datasets/formatted-text/flavours/preview-slice.tsx b/app/components/datasets/formatted-text/flavours/preview-slice.tsx
new file mode 100644
index 0000000..d3fa1f4
--- /dev/null
+++ b/app/components/datasets/formatted-text/flavours/preview-slice.tsx
@@ -0,0 +1,56 @@
+import { useState } from 'react'
+import type { FC, ReactNode } from 'react'
+import { autoUpdate, flip, inline, shift, useDismiss, useFloating, useHover, useInteractions, useRole } from '@floating-ui/react'
+import type { SliceProps } from './type'
+import { SliceContainer, SliceContent, SliceDivider, SliceLabel } from './shared'
+
+type PreviewSliceProps = SliceProps<{
+  label: ReactNode
+  tooltip: ReactNode
+  labelInnerClassName?: string
+  dividerClassName?: string
+}>
+
+export const PreviewSlice: FC<PreviewSliceProps> = (props) => {
+  const { label, className, text, tooltip, labelInnerClassName, dividerClassName, ...rest } = props
+  const [tooltipOpen, setTooltipOpen] = useState(false)
+  const { refs, floatingStyles, context } = useFloating({
+    open: tooltipOpen,
+    onOpenChange: setTooltipOpen,
+    whileElementsMounted: autoUpdate,
+    placement: 'top',
+    middleware: [
+      inline(),
+      flip(),
+      shift(),
+    ],
+  })
+  const hover = useHover(context, {
+    delay: { open: 500 },
+    move: true,
+  })
+  const dismiss = useDismiss(context)
+  const role = useRole(context, { role: 'tooltip' })
+  const { getReferenceProps, getFloatingProps } = useInteractions([hover, dismiss, role])
+  return (
+    <>
+      <SliceContainer {...rest}
+        className={className}
+        ref={refs.setReference}
+        {...getReferenceProps()}
+      >
+        <SliceLabel labelInnerClassName={labelInnerClassName}>{label}</SliceLabel>
+        <SliceContent>{text}</SliceContent>
+        <SliceDivider className={dividerClassName} />
+      </SliceContainer>
+      {tooltipOpen && <span
+        ref={refs.setFloating}
+        style={floatingStyles}
+        {...getFloatingProps()}
+        className='rounded-md border-[0.5px] border-components-panel-border bg-components-tooltip-bg p-2 text-xs leading-4 text-text-secondary shadow shadow-shadow-shadow-5 backdrop-blur-[5px]'
+      >
+        {tooltip}
+      </span>}
+    </>
+  )
+}
diff --git a/app/components/datasets/formatted-text/flavours/shared.tsx b/app/components/datasets/formatted-text/flavours/shared.tsx
new file mode 100644
index 0000000..1154857
--- /dev/null
+++ b/app/components/datasets/formatted-text/flavours/shared.tsx
@@ -0,0 +1,80 @@
+import type { ComponentProps, FC } from 'react'
+import classNames from '@/utils/classnames'
+
+const baseStyle = 'py-[3px]'
+
+export type SliceContainerProps = ComponentProps<'span'>
+
+export const SliceContainer: FC<SliceContainerProps> = (
+  {
+    ref,
+    ...props
+  },
+) => {
+  const { className, ...rest } = props
+  return <span {...rest} ref={ref} className={classNames(
+    'group align-bottom mr-1 select-none text-sm',
+    className,
+  )} />
+}
+SliceContainer.displayName = 'SliceContainer'
+
+export type SliceLabelProps = ComponentProps<'span'> & { labelInnerClassName?: string }
+
+export const SliceLabel: FC<SliceLabelProps> = (
+  {
+    ref,
+    ...props
+  },
+) => {
+  const { className, children, labelInnerClassName, ...rest } = props
+  return <span {...rest} ref={ref} className={classNames(
+    baseStyle,
+    'px-1 bg-state-base-hover-alt group-hover:bg-state-accent-solid group-hover:text-text-primary-on-surface uppercase text-text-tertiary',
+    className,
+  )}>
+    <span className={classNames('text-nowrap', labelInnerClassName)}>
+      {children}
+    </span>
+  </span>
+}
+SliceLabel.displayName = 'SliceLabel'
+
+export type SliceContentProps = ComponentProps<'span'>
+
+export const SliceContent: FC<SliceContentProps> = (
+  {
+    ref,
+    ...props
+  },
+) => {
+  const { className, children, ...rest } = props
+  return <span {...rest} ref={ref} className={classNames(
+    baseStyle,
+    'px-1 bg-state-base-hover group-hover:bg-state-accent-hover-alt group-hover:text-text-primary leading-7 whitespace-pre-line break-all',
+    className,
+  )}>
+    {children}
+  </span>
+}
+SliceContent.displayName = 'SliceContent'
+
+export type SliceDividerProps = ComponentProps<'span'>
+
+export const SliceDivider: FC<SliceDividerProps> = (
+  {
+    ref,
+    ...props
+  },
+) => {
+  const { className, ...rest } = props
+  return <span {...rest} ref={ref} className={classNames(
+    baseStyle,
+    'bg-state-base-active group-hover:bg-state-accent-solid text-sm px-[1px]',
+    className,
+  )}>
+    {/* use a zero-width space to make the hover area bigger */}
+    &#8203;
+  </span>
+}
+SliceDivider.displayName = 'SliceDivider'
diff --git a/app/components/datasets/formatted-text/flavours/type.ts b/app/components/datasets/formatted-text/flavours/type.ts
new file mode 100644
index 0000000..8d2fb43
--- /dev/null
+++ b/app/components/datasets/formatted-text/flavours/type.ts
@@ -0,0 +1,5 @@
+import type { ComponentProps } from 'react'
+
+export type SliceProps<T = {}> = T & {
+  text: string
+} & ComponentProps<'span'>
diff --git a/app/components/datasets/formatted-text/formatted.tsx b/app/components/datasets/formatted-text/formatted.tsx
new file mode 100644
index 0000000..14d339e
--- /dev/null
+++ b/app/components/datasets/formatted-text/formatted.tsx
@@ -0,0 +1,12 @@
+import type { ComponentProps, FC } from 'react'
+import classNames from '@/utils/classnames'
+
+export type FormattedTextProps = ComponentProps<'p'>
+
+export const FormattedText: FC<FormattedTextProps> = (props) => {
+  const { className, ...rest } = props
+  return <p
+    {...rest}
+    className={classNames('leading-7', className)}
+  >{props.children}</p>
+}
diff --git a/app/components/datasets/hit-testing/assets/clock.svg b/app/components/datasets/hit-testing/assets/clock.svg
new file mode 100644
index 0000000..b81dbec
--- /dev/null
+++ b/app/components/datasets/hit-testing/assets/clock.svg
@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M18.9166 9.58333L17.2505 11.25L15.5833 9.58333M17.4542 10.8333C17.4845 10.5597 17.5 10.2817 17.5 10C17.5 5.85786 14.1421 2.5 10 2.5C5.85786 2.5 2.5 5.85786 2.5 10C2.5 14.1421 5.85786 17.5 10 17.5C12.3561 17.5 14.4584 16.4136 15.8333 14.7144M10 5.83333V10L12.5 11.6667" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/hit-testing/assets/grid.svg b/app/components/datasets/hit-testing/assets/grid.svg
new file mode 100644
index 0000000..a165677
--- /dev/null
+++ b/app/components/datasets/hit-testing/assets/grid.svg
@@ -0,0 +1,6 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M4.9 1.75H2.68333C2.35664 1.75 2.19329 1.75 2.06851 1.81358C1.95874 1.86951 1.86951 1.95874 1.81358 2.06851C1.75 2.19329 1.75 2.35664 1.75 2.68333V4.9C1.75 5.2267 1.75 5.39005 1.81358 5.51483C1.86951 5.62459 1.95874 5.71383 2.06851 5.76975C2.19329 5.83333 2.35664 5.83333 2.68333 5.83333H4.9C5.2267 5.83333 5.39005 5.83333 5.51483 5.76975C5.62459 5.71383 5.71383 5.62459 5.76975 5.51483C5.83333 5.39005 5.83333 5.2267 5.83333 4.9V2.68333C5.83333 2.35664 5.83333 2.19329 5.76975 2.06851C5.71383 1.95874 5.62459 1.86951 5.51483 1.81358C5.39005 1.75 5.2267 1.75 4.9 1.75Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M11.3167 1.75H9.1C8.7733 1.75 8.60995 1.75 8.48517 1.81358C8.37541 1.86951 8.28617 1.95874 8.23025 2.06851C8.16667 2.19329 8.16667 2.35664 8.16667 2.68333V4.9C8.16667 5.2267 8.16667 5.39005 8.23025 5.51483C8.28617 5.62459 8.37541 5.71383 8.48517 5.76975C8.60995 5.83333 8.7733 5.83333 9.1 5.83333H11.3167C11.6434 5.83333 11.8067 5.83333 11.9315 5.76975C12.0413 5.71383 12.1305 5.62459 12.1864 5.51483C12.25 5.39005 12.25 5.2267 12.25 4.9V2.68333C12.25 2.35664 12.25 2.19329 12.1864 2.06851C12.1305 1.95874 12.0413 1.86951 11.9315 1.81358C11.8067 1.75 11.6434 1.75 11.3167 1.75Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M11.3167 8.16667H9.1C8.7733 8.16667 8.60995 8.16667 8.48517 8.23025C8.37541 8.28617 8.28617 8.37541 8.23025 8.48517C8.16667 8.60995 8.16667 8.7733 8.16667 9.1V11.3167C8.16667 11.6434 8.16667 11.8067 8.23025 11.9315C8.28617 12.0413 8.37541 12.1305 8.48517 12.1864C8.60995 12.25 8.7733 12.25 9.1 12.25H11.3167C11.6434 12.25 11.8067 12.25 11.9315 12.1864C12.0413 12.1305 12.1305 12.0413 12.1864 11.9315C12.25 11.8067 12.25 11.6434 12.25 11.3167V9.1C12.25 8.7733 12.25 8.60995 12.1864 8.48517C12.1305 8.37541 12.0413 8.28617 11.9315 8.23025C11.8067 8.16667 11.6434 8.16667 11.3167 8.16667Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M4.9 8.16667H2.68333C2.35664 8.16667 2.19329 8.16667 2.06851 8.23025C1.95874 8.28617 1.86951 8.37541 1.81358 8.48517C1.75 8.60995 1.75 8.7733 1.75 9.1V11.3167C1.75 11.6434 1.75 11.8067 1.81358 11.9315C1.86951 12.0413 1.95874 12.1305 2.06851 12.1864C2.19329 12.25 2.35664 12.25 2.68333 12.25H4.9C5.2267 12.25 5.39005 12.25 5.51483 12.1864C5.62459 12.1305 5.71383 12.0413 5.76975 11.9315C5.83333 11.8067 5.83333 11.6434 5.83333 11.3167V9.1C5.83333 8.7733 5.83333 8.60995 5.76975 8.48517C5.71383 8.37541 5.62459 8.28617 5.51483 8.23025C5.39005 8.16667 5.2267 8.16667 4.9 8.16667Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/datasets/hit-testing/assets/plugin.svg b/app/components/datasets/hit-testing/assets/plugin.svg
new file mode 100644
index 0000000..2bd15ed
--- /dev/null
+++ b/app/components/datasets/hit-testing/assets/plugin.svg
@@ -0,0 +1,10 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_4151_6854)">
+<path d="M4.37484 2.62484C4.37484 1.81942 5.02776 1.1665 5.83317 1.1665C6.63859 1.1665 7.2915 1.81942 7.2915 2.62484V3.49984H7.87484C8.69023 3.49984 9.09793 3.49984 9.41953 3.63305C9.84833 3.81066 10.189 4.15134 10.3666 4.58014C10.4998 4.90174 10.4998 5.30944 10.4998 6.12484H11.3748C12.1803 6.12484 12.8332 6.77776 12.8332 7.58317C12.8332 8.38859 12.1803 9.0415 11.3748 9.0415H10.4998V10.0332C10.4998 11.0133 10.4998 11.5033 10.3091 11.8777C10.1413 12.2069 9.8736 12.4747 9.54432 12.6424C9.16997 12.8332 8.67993 12.8332 7.69984 12.8332H7.2915V11.8123C7.2915 11.0875 6.70388 10.4998 5.979 10.4998C5.25413 10.4998 4.6665 11.0875 4.6665 11.8123V12.8332H3.9665C2.98641 12.8332 2.49637 12.8332 2.12202 12.6424C1.79274 12.4747 1.52502 12.2069 1.35724 11.8777C1.1665 11.5033 1.1665 11.0133 1.1665 10.0332V9.0415H2.0415C2.84692 9.0415 3.49984 8.38859 3.49984 7.58317C3.49984 6.77776 2.84692 6.12484 2.0415 6.12484H1.1665C1.1665 5.30944 1.1665 4.90174 1.29971 4.58014C1.47733 4.15134 1.81801 3.81066 2.24681 3.63305C2.56841 3.49984 2.97611 3.49984 3.7915 3.49984H4.37484V2.62484Z" stroke="#667085" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_4151_6854">
+<rect width="14" height="14" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/datasets/hit-testing/components/child-chunks-item.tsx b/app/components/datasets/hit-testing/components/child-chunks-item.tsx
new file mode 100644
index 0000000..3ccd638
--- /dev/null
+++ b/app/components/datasets/hit-testing/components/child-chunks-item.tsx
@@ -0,0 +1,30 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { SliceContent } from '../../formatted-text/flavours/shared'
+import Score from './score'
+import type { HitTestingChildChunk } from '@/models/datasets'
+
+type Props = {
+  payload: HitTestingChildChunk
+  isShowAll: boolean
+}
+
+const ChildChunks: FC<Props> = ({
+  payload,
+  isShowAll,
+}) => {
+  const { score, content, position } = payload
+  return (
+    <div
+      className={!isShowAll ? 'line-clamp-2 break-all' : ''}
+    >
+      <div className='relative top-[-2px] inline-flex items-center'>
+        <div className='system-2xs-semibold-uppercase flex h-[20.5px] items-center  bg-state-accent-solid px-1 text-text-primary-on-surface'>C-{position}</div>
+        <Score value={score} besideChunkName />
+      </div>
+      <SliceContent className='bg-state-accent-hover py-0.5 text-sm font-normal text-text-secondary group-hover:bg-state-accent-hover'>{content}</SliceContent>
+    </div>
+  )
+}
+export default React.memo(ChildChunks)
diff --git a/app/components/datasets/hit-testing/components/chunk-detail-modal.tsx b/app/components/datasets/hit-testing/components/chunk-detail-modal.tsx
new file mode 100644
index 0000000..4fd62bb
--- /dev/null
+++ b/app/components/datasets/hit-testing/components/chunk-detail-modal.tsx
@@ -0,0 +1,92 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { SegmentIndexTag } from '../../documents/detail/completed/common/segment-index-tag'
+import Dot from '../../documents/detail/completed/common/dot'
+import Score from './score'
+import ChildChunksItem from './child-chunks-item'
+import Modal from '@/app/components/base/modal'
+import type { HitTesting } from '@/models/datasets'
+import FileIcon from '@/app/components/base/file-uploader/file-type-icon'
+import type { FileAppearanceTypeEnum } from '@/app/components/base/file-uploader/types'
+import cn from '@/utils/classnames'
+import Tag from '@/app/components/datasets/documents/detail/completed/common/tag'
+import { Markdown } from '@/app/components/base/markdown'
+
+const i18nPrefix = 'datasetHitTesting'
+
+type Props = {
+  payload: HitTesting
+  onHide: () => void
+}
+
+const ChunkDetailModal: FC<Props> = ({
+  payload,
+  onHide,
+}) => {
+  const { t } = useTranslation()
+  const { segment, score, child_chunks } = payload
+  const { position, content, sign_content, keywords, document } = segment
+  const isParentChildRetrieval = !!(child_chunks && child_chunks.length > 0)
+  const extension = document.name.split('.').slice(-1)[0] as FileAppearanceTypeEnum
+  const heighClassName = isParentChildRetrieval ? 'h-[min(627px,_80vh)] overflow-y-auto' : 'h-[min(539px,_80vh)] overflow-y-auto'
+  return (
+    <Modal
+      title={t(`${i18nPrefix}.chunkDetail`)}
+      isShow
+      closable
+      onClose={onHide}
+      className={cn(isParentChildRetrieval ? '!min-w-[1200px]' : '!min-w-[800px]')}
+    >
+      <div className='mt-4 flex'>
+        <div className={cn('flex-1', isParentChildRetrieval && 'pr-6')}>
+          {/* Meta info */}
+          <div className='flex items-center justify-between'>
+            <div className='flex grow items-center space-x-2'>
+              <SegmentIndexTag
+                labelPrefix={`${isParentChildRetrieval ? 'Parent-' : ''}Chunk`}
+                positionId={position}
+                className={cn('w-fit group-hover:opacity-100')}
+              />
+              <Dot />
+              <div className='flex grow items-center space-x-1'>
+                <FileIcon type={extension} size='sm' />
+                <span className='w-0 grow truncate text-[13px] font-normal text-text-secondary'>{document.name}</span>
+              </div>
+            </div>
+            <Score value={score} />
+          </div>
+          <Markdown
+            className={cn('!mt-2 !text-text-secondary', heighClassName)}
+            content={sign_content || content}
+            customDisallowedElements={['input']}
+          />
+          {!isParentChildRetrieval && keywords && keywords.length > 0 && (
+            <div className='mt-6'>
+              <div className='text-xs font-medium uppercase text-text-tertiary'>{t(`${i18nPrefix}.keyword`)}</div>
+              <div className='mt-1 flex flex-wrap'>
+                {keywords.map(keyword => (
+                  <Tag key={keyword} text={keyword} className='mr-2' />
+                ))}
+              </div>
+            </div>
+          )}
+        </div>
+
+        {isParentChildRetrieval && (
+          <div className='flex-1 pb-6 pl-6'>
+            <div className='system-xs-semibold-uppercase text-text-secondary'>{t(`${i18nPrefix}.hitChunks`, { num: child_chunks.length })}</div>
+            <div className={cn('mt-1 space-y-2', heighClassName)}>
+              {child_chunks.map(item => (
+                <ChildChunksItem key={item.id} payload={item} isShowAll />
+              ))}
+            </div>
+          </div>
+        )}
+      </div>
+    </Modal>
+  )
+}
+
+export default React.memo(ChunkDetailModal)
diff --git a/app/components/datasets/hit-testing/components/result-item-external.tsx b/app/components/datasets/hit-testing/components/result-item-external.tsx
new file mode 100644
index 0000000..2c793cd
--- /dev/null
+++ b/app/components/datasets/hit-testing/components/result-item-external.tsx
@@ -0,0 +1,60 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import ResultItemMeta from './result-item-meta'
+import ResultItemFooter from './result-item-footer'
+import type { ExternalKnowledgeBaseHitTesting } from '@/models/datasets'
+import cn from '@/utils/classnames'
+import Modal from '@/app/components/base/modal'
+import { FileAppearanceTypeEnum } from '@/app/components/base/file-uploader/types'
+
+const i18nPrefix = 'datasetHitTesting'
+type Props = {
+  payload: ExternalKnowledgeBaseHitTesting
+  positionId: number
+}
+
+const ResultItemExternal: FC<Props> = ({ payload, positionId }) => {
+  const { t } = useTranslation()
+  const { content, title, score } = payload
+  const [
+    isShowDetailModal,
+    { setTrue: showDetailModal, setFalse: hideDetailModal },
+  ] = useBoolean(false)
+
+  return (
+    <div className={cn('cursor-pointer rounded-xl bg-chat-bubble-bg pt-3 hover:shadow-lg')} onClick={showDetailModal}>
+      {/* Meta info */}
+      <ResultItemMeta className='px-3' labelPrefix={'Chunk'} positionId={positionId} wordCount={content.length} score={score} />
+
+      {/* Main */}
+      <div className='mt-1 px-3'>
+        <div className='body-md-regular line-clamp-2 break-all'>{content}</div>
+      </div>
+
+      {/* Foot */}
+      <ResultItemFooter docType={FileAppearanceTypeEnum.custom} docTitle={title} showDetailModal={showDetailModal} />
+
+      {isShowDetailModal && (
+        <Modal
+          title={t(`${i18nPrefix}.chunkDetail`)}
+          className={'!min-w-[800px]'}
+          closable
+          onClose={hideDetailModal}
+          isShow={isShowDetailModal}
+        >
+          <div className='mt-4 flex-1'>
+            <ResultItemMeta labelPrefix={'Chunk'} positionId={positionId} wordCount={content.length} score={score} />
+            <div className={cn('body-md-regular mt-2 break-all text-text-secondary', 'h-[min(539px,_80vh)] overflow-y-auto')}>
+              {content}
+            </div>
+          </div>
+        </Modal>
+      )}
+    </div>
+  )
+}
+
+export default React.memo(ResultItemExternal)
diff --git a/app/components/datasets/hit-testing/components/result-item-footer.tsx b/app/components/datasets/hit-testing/components/result-item-footer.tsx
new file mode 100644
index 0000000..c06c5aa
--- /dev/null
+++ b/app/components/datasets/hit-testing/components/result-item-footer.tsx
@@ -0,0 +1,42 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowRightUpLine } from '@remixicon/react'
+import FileIcon from '@/app/components/base/file-uploader/file-type-icon'
+import type { FileAppearanceTypeEnum } from '@/app/components/base/file-uploader/types'
+
+type Props = {
+  docType: FileAppearanceTypeEnum
+  docTitle: string
+  showDetailModal: () => void
+}
+const i18nPrefix = 'datasetHitTesting'
+
+const ResultItemFooter: FC<Props> = ({
+  docType,
+  docTitle,
+  showDetailModal,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className="mt-3 flex h-10 items-center justify-between border-t border-divider-subtle pl-3 pr-2">
+      <div className="flex grow items-center space-x-1">
+        <FileIcon type={docType} size="sm" />
+        <span className="w-0 grow truncate text-[13px] font-normal text-text-secondary">
+          {docTitle}
+        </span>
+      </div>
+      <div
+        className="flex cursor-pointer items-center space-x-1 text-text-tertiary"
+        onClick={showDetailModal}
+      >
+        <div className="text-xs uppercase">{t(`${i18nPrefix}.open`)}</div>
+        <RiArrowRightUpLine className="size-3.5" />
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(ResultItemFooter)
diff --git a/app/components/datasets/hit-testing/components/result-item-meta.tsx b/app/components/datasets/hit-testing/components/result-item-meta.tsx
new file mode 100644
index 0000000..617aa77
--- /dev/null
+++ b/app/components/datasets/hit-testing/components/result-item-meta.tsx
@@ -0,0 +1,45 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { SegmentIndexTag } from '../../documents/detail/completed/common/segment-index-tag'
+import Dot from '../../documents/detail/completed/common/dot'
+import Score from './score'
+import cn from '@/utils/classnames'
+
+type Props = {
+  labelPrefix: string
+  positionId: number
+  wordCount: number
+  score: number
+  className?: string
+}
+
+const ResultItemMeta: FC<Props> = ({
+  labelPrefix,
+  positionId,
+  wordCount,
+  score,
+  className,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className={cn('flex items-center justify-between', className)}>
+      <div className="flex items-center space-x-2">
+        <SegmentIndexTag
+          labelPrefix={labelPrefix}
+          positionId={positionId}
+          className={cn('w-fit group-hover:opacity-100')}
+        />
+        <Dot />
+        <div className="system-xs-medium text-text-tertiary">
+          {wordCount} {t('datasetDocuments.segment.characters', { count: wordCount })}
+        </div>
+      </div>
+      <Score value={score} />
+    </div>
+  )
+}
+
+export default React.memo(ResultItemMeta)
diff --git a/app/components/datasets/hit-testing/components/result-item.tsx b/app/components/datasets/hit-testing/components/result-item.tsx
new file mode 100644
index 0000000..03a0023
--- /dev/null
+++ b/app/components/datasets/hit-testing/components/result-item.tsx
@@ -0,0 +1,100 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine, RiArrowRightSLine } from '@remixicon/react'
+import { useBoolean } from 'ahooks'
+import ChildChunkItem from './child-chunks-item'
+import ChunkDetailModal from './chunk-detail-modal'
+import ResultItemMeta from './result-item-meta'
+import ResultItemFooter from './result-item-footer'
+import type { HitTesting } from '@/models/datasets'
+import cn from '@/utils/classnames'
+import type { FileAppearanceTypeEnum } from '@/app/components/base/file-uploader/types'
+import Tag from '@/app/components/datasets/documents/detail/completed/common/tag'
+import { extensionToFileType } from '@/app/components/datasets/hit-testing/utils/extension-to-file-type'
+import { Markdown } from '@/app/components/base/markdown'
+
+const i18nPrefix = 'datasetHitTesting'
+type Props = {
+  payload: HitTesting
+}
+
+const ResultItem: FC<Props> = ({
+  payload,
+}) => {
+  const { t } = useTranslation()
+  const { segment, score, child_chunks } = payload
+  const data = segment
+  const { position, word_count, content, sign_content, keywords, document } = data
+  const isParentChildRetrieval = !!(child_chunks && child_chunks.length > 0)
+  const extension = document.name.split('.').slice(-1)[0] as FileAppearanceTypeEnum
+  const fileType = extensionToFileType(extension)
+  const [isFold, {
+    toggle: toggleFold,
+  }] = useBoolean(false)
+  const Icon = isFold ? RiArrowRightSLine : RiArrowDownSLine
+
+  const [isShowDetailModal, {
+    setTrue: showDetailModal,
+    setFalse: hideDetailModal,
+  }] = useBoolean(false)
+
+  return (
+    <div className={cn('cursor-pointer rounded-xl bg-chat-bubble-bg pt-3 hover:shadow-lg')} onClick={showDetailModal}>
+      {/* Meta info */}
+      <ResultItemMeta className='px-3' labelPrefix={`${isParentChildRetrieval ? 'Parent-' : ''}Chunk`} positionId={position} wordCount={word_count} score={score} />
+
+      {/* Main */}
+      <div className='mt-1 px-3'>
+        <Markdown
+          className='line-clamp-2'
+          content={sign_content || content}
+          customDisallowedElements={['input']}
+        />
+        {isParentChildRetrieval && (
+          <div className='mt-1'>
+            <div
+              className={cn('inline-flex h-6 cursor-pointer select-none items-center space-x-0.5 rounded-lg text-text-secondary', isFold && 'bg-workflow-process-bg pl-1')}
+              onClick={(e) => {
+                e.stopPropagation()
+                toggleFold()
+              }}
+            >
+              <Icon className={cn('h-4 w-4', isFold && 'opacity-50')} />
+              <div className='text-xs font-semibold uppercase'>{t(`${i18nPrefix}.hitChunks`, { num: child_chunks.length })}</div>
+            </div>
+            {!isFold && (
+              <div className='space-y-2'>
+                {child_chunks.map(item => (
+                  <div key={item.id} className='ml-[7px] border-l-[2px] border-text-accent-secondary pl-[7px]'>
+                    <ChildChunkItem payload={item} isShowAll={false} />
+                  </div>
+                ))}
+              </div>
+            )}
+          </div>
+        )}
+        {!isParentChildRetrieval && keywords && keywords.length > 0 && (
+          <div className='mt-2 flex flex-wrap'>
+            {keywords.map(keyword => (
+              <Tag key={keyword} text={keyword} className='mr-2' />
+            ))}
+          </div>
+        )}
+      </div>
+      {/* Foot */}
+      <ResultItemFooter docType={fileType} docTitle={document.name} showDetailModal={showDetailModal} />
+
+      {
+        isShowDetailModal && (
+          <ChunkDetailModal
+            payload={payload}
+            onHide={hideDetailModal}
+          />
+        )
+      }
+    </div >
+  )
+}
+export default React.memo(ResultItem)
diff --git a/app/components/datasets/hit-testing/components/score.tsx b/app/components/datasets/hit-testing/components/score.tsx
new file mode 100644
index 0000000..05e470b
--- /dev/null
+++ b/app/components/datasets/hit-testing/components/score.tsx
@@ -0,0 +1,28 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+
+type Props = {
+  value: number | null
+  besideChunkName?: boolean
+}
+
+const Score: FC<Props> = ({
+  value,
+  besideChunkName,
+}) => {
+  if (!value || isNaN(value))
+    return null
+  return (
+    <div className={cn('relative items-center overflow-hidden border border-components-progress-bar-border px-[5px]',
+      besideChunkName ? 'h-[20.5px] border-l-0' : 'h-[20px] rounded-md')}>
+      <div className={cn('absolute left-0 top-0 h-full border-r-[1.5px] border-components-progress-brand-progress bg-util-colors-blue-brand-blue-brand-100', value === 1 && 'border-r-0')} style={{ width: `${value * 100}%` }} />
+      <div className={cn('relative flex h-full items-center space-x-0.5 text-util-colors-blue-brand-blue-brand-700')}>
+        <div className='system-2xs-medium-uppercase'>score</div>
+        <div className='system-xs-semibold'>{value?.toFixed(2)}</div>
+      </div>
+    </div>
+  )
+}
+export default React.memo(Score)
diff --git a/app/components/datasets/hit-testing/index.tsx b/app/components/datasets/hit-testing/index.tsx
new file mode 100644
index 0000000..fef69a5
--- /dev/null
+++ b/app/components/datasets/hit-testing/index.tsx
@@ -0,0 +1,216 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import useSWR from 'swr'
+import { omit } from 'lodash-es'
+import { useBoolean } from 'ahooks'
+import { useContext } from 'use-context-selector'
+import { RiApps2Line, RiFocus2Line, RiHistoryLine } from '@remixicon/react'
+import Textarea from './textarea'
+import s from './style.module.css'
+import ModifyRetrievalModal from './modify-retrieval-modal'
+import ResultItem from './components/result-item'
+import ResultItemExternal from './components/result-item-external'
+import cn from '@/utils/classnames'
+import type { ExternalKnowledgeBaseHitTesting, ExternalKnowledgeBaseHitTestingResponse, HitTesting, HitTestingResponse } from '@/models/datasets'
+import Loading from '@/app/components/base/loading'
+import Drawer from '@/app/components/base/drawer'
+import Pagination from '@/app/components/base/pagination'
+import FloatRightContainer from '@/app/components/base/float-right-container'
+import { fetchTestingRecords } from '@/service/datasets'
+import DatasetDetailContext from '@/context/dataset-detail'
+import type { RetrievalConfig } from '@/types/app'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import useTimestamp from '@/hooks/use-timestamp'
+import docStyle from '@/app/components/datasets/documents/detail/completed/style.module.css'
+import { CardSkelton } from '../documents/detail/completed/skeleton/general-list-skeleton'
+
+const limit = 10
+
+type Props = {
+  datasetId: string
+}
+
+const RecordsEmpty: FC = () => {
+  const { t } = useTranslation()
+  return <div className='rounded-2xl bg-workflow-process-bg p-5'>
+    <div className='flex h-10 w-10 items-center justify-center rounded-[10px] border-[0.5px] border-components-card-border bg-components-card-bg p-1 shadow-lg shadow-shadow-shadow-5 backdrop-blur-[5px]'>
+      <RiHistoryLine className='h-5 w-5 text-text-tertiary' />
+    </div>
+    <div className='my-2 text-[13px] font-medium leading-4 text-text-tertiary'>{t('datasetHitTesting.noRecentTip')}</div>
+  </div>
+}
+
+const HitTestingPage: FC<Props> = ({ datasetId }: Props) => {
+  const { t } = useTranslation()
+  const { formatTime } = useTimestamp()
+
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+
+  const [hitResult, setHitResult] = useState<HitTestingResponse | undefined>() // 鍒濆鍖栬褰曚负绌烘暟缁�
+  const [externalHitResult, setExternalHitResult] = useState<ExternalKnowledgeBaseHitTestingResponse | undefined>()
+  const [submitLoading, setSubmitLoading] = useState(false)
+  const [text, setText] = useState('')
+
+  const [currPage, setCurrPage] = React.useState<number>(0)
+  const { data: recordsRes, error, mutate: recordsMutate } = useSWR({
+    action: 'fetchTestingRecords',
+    datasetId,
+    params: { limit, page: currPage + 1 },
+  }, apiParams => fetchTestingRecords(omit(apiParams, 'action')))
+
+  const total = recordsRes?.total || 0
+
+  const { dataset: currentDataset } = useContext(DatasetDetailContext)
+  const isExternal = currentDataset?.provider === 'external'
+
+  const [retrievalConfig, setRetrievalConfig] = useState(currentDataset?.retrieval_model_dict as RetrievalConfig)
+  const [isShowModifyRetrievalModal, setIsShowModifyRetrievalModal] = useState(false)
+  const [isShowRightPanel, { setTrue: showRightPanel, setFalse: hideRightPanel, set: setShowRightPanel }] = useBoolean(!isMobile)
+  const renderHitResults = (results: HitTesting[] | ExternalKnowledgeBaseHitTesting[]) => (
+    <div className='flex h-full flex-col rounded-t-2xl bg-background-body px-4 py-3'>
+      <div className='mb-2 shrink-0 pl-2 font-semibold leading-6 text-text-primary'>
+        {t('datasetHitTesting.hit.title', { num: results.length })}
+      </div>
+      <div className='grow space-y-2 overflow-y-auto'>
+        {results.map((record, idx) =>
+          isExternal
+            ? (
+              <ResultItemExternal
+                key={idx}
+                positionId={idx + 1}
+                payload={record as ExternalKnowledgeBaseHitTesting}
+              />
+            )
+            : (
+              <ResultItem key={idx} payload={record as HitTesting} />
+            ),
+        )}
+      </div>
+    </div>
+  )
+
+  const renderEmptyState = () => (
+    <div className='flex h-full flex-col items-center justify-center rounded-t-2xl bg-background-body px-4 py-3'>
+      <div className={cn(docStyle.commonIcon, docStyle.targetIcon, '!h-14 !w-14 !bg-text-quaternary')} />
+      <div className='mt-3 text-[13px] text-text-quaternary'>
+        {t('datasetHitTesting.hit.emptyTip')}
+      </div>
+    </div>
+  )
+
+  useEffect(() => {
+    setShowRightPanel(!isMobile)
+  }, [isMobile, setShowRightPanel])
+
+  return (
+    <div className={s.container}>
+      <div className='flex flex-col px-6 py-3'>
+        <div className='mb-4 flex flex-col justify-center'>
+          <h1 className='text-base font-semibold text-text-primary'>{t('datasetHitTesting.title')}</h1>
+          <p className='mt-0.5 text-[13px] font-normal leading-4 text-text-tertiary'>{t('datasetHitTesting.desc')}</p>
+        </div>
+        <Textarea
+          datasetId={datasetId}
+          setHitResult={setHitResult}
+          setExternalHitResult={setExternalHitResult}
+          onSubmit={showRightPanel}
+          onUpdateList={recordsMutate}
+          loading={submitLoading}
+          setLoading={setSubmitLoading}
+          setText={setText}
+          text={text}
+          isExternal={isExternal}
+          onClickRetrievalMethod={() => setIsShowModifyRetrievalModal(true)}
+          retrievalConfig={retrievalConfig}
+          isEconomy={currentDataset?.indexing_technique === 'economy'}
+        />
+        <div className='mb-3 mt-6 text-base font-semibold text-text-primary'>{t('datasetHitTesting.records')}</div>
+        {(!recordsRes && !error)
+          ? (
+            <div className='flex-1'><Loading type='app' /></div>
+          )
+          : recordsRes?.data?.length
+            ? (
+              <>
+                <div className='grow overflow-y-auto'>
+                  <table className={'w-full border-collapse border-0 text-[13px] leading-4 text-text-secondary '}>
+                    <thead className='sticky top-0 h-7 text-xs  font-medium uppercase leading-7 text-text-tertiary'>
+                      <tr>
+                        <td className='w-[128px] rounded-l-lg bg-background-section-burn pl-3'>{t('datasetHitTesting.table.header.source')}</td>
+                        <td className='bg-background-section-burn'>{t('datasetHitTesting.table.header.text')}</td>
+                        <td className='w-48 rounded-r-lg bg-background-section-burn pl-2'>{t('datasetHitTesting.table.header.time')}</td>
+                      </tr>
+                    </thead>
+                    <tbody>
+                      {recordsRes?.data?.map((record) => {
+                        const SourceIcon = record.source === 'app' ? RiApps2Line : RiFocus2Line
+                        return <tr
+                          key={record.id}
+                          className='group h-10 cursor-pointer border-b border-divider-subtle hover:bg-background-default-hover'
+                          onClick={() => setText(record.content)}
+                        >
+                          <td className='w-[128px] pl-3'>
+                            <div className='flex items-center'>
+                              <SourceIcon className='mr-1 size-4 text-text-tertiary' />
+                              <span className='capitalize'>{record.source.replace('_', ' ').replace('hit testing', 'retrieval test')}</span>
+                            </div>
+                          </td>
+                          <td className='max-w-xs py-2'>{record.content}</td>
+                          <td className='w-36 pl-2'>
+                            {formatTime(record.created_at, t('datasetHitTesting.dateTimeFormat') as string)}
+                          </td>
+                        </tr>
+                      })}
+                    </tbody>
+                  </table>
+                </div>
+                {(total && total > limit)
+                  ? <Pagination current={currPage} onChange={setCurrPage} total={total} limit={limit} />
+                  : null}
+              </>
+            )
+            : (
+              <RecordsEmpty />
+            )}
+      </div>
+      <FloatRightContainer panelClassName='!justify-start !overflow-y-auto' showClose isMobile={isMobile} isOpen={isShowRightPanel} onClose={hideRightPanel} footer={null}>
+        <div className='flex flex-col pt-3'>
+          {/* {renderHitResults(generalResultData)} */}
+          {submitLoading
+            ? <div className='flex h-full flex-col rounded-t-2xl bg-background-body px-4 py-3'>
+              <CardSkelton />
+            </div>
+            : (
+              (() => {
+                if (!hitResult?.records.length && !externalHitResult?.records.length)
+                  return renderEmptyState()
+
+                if (hitResult?.records.length)
+                  return renderHitResults(hitResult.records)
+
+                return renderHitResults(externalHitResult?.records || [])
+              })()
+            )
+          }
+        </div>
+      </FloatRightContainer>
+      <Drawer unmount={true} isOpen={isShowModifyRetrievalModal} onClose={() => setIsShowModifyRetrievalModal(false)} footer={null} mask={isMobile} panelClassName='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[640px] rounded-xl'>
+        <ModifyRetrievalModal
+          indexMethod={currentDataset?.indexing_technique || ''}
+          value={retrievalConfig}
+          isShow={isShowModifyRetrievalModal}
+          onHide={() => setIsShowModifyRetrievalModal(false)}
+          onSave={(value) => {
+            setRetrievalConfig(value)
+            setIsShowModifyRetrievalModal(false)
+          }}
+        />
+      </Drawer>
+    </div>
+  )
+}
+
+export default HitTestingPage
diff --git a/app/components/datasets/hit-testing/modify-external-retrieval-modal.tsx b/app/components/datasets/hit-testing/modify-external-retrieval-modal.tsx
new file mode 100644
index 0000000..db06dc0
--- /dev/null
+++ b/app/components/datasets/hit-testing/modify-external-retrieval-modal.tsx
@@ -0,0 +1,71 @@
+import { useState } from 'react'
+import {
+  RiCloseLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import RetrievalSettings from '../external-knowledge-base/create/RetrievalSettings'
+import Button from '@/app/components/base/button'
+import ActionButton from '@/app/components/base/action-button'
+
+type ModifyExternalRetrievalModalProps = {
+  onClose: () => void
+  onSave: (data: { top_k: number; score_threshold: number; score_threshold_enabled: boolean }) => void
+  initialTopK: number
+  initialScoreThreshold: number
+  initialScoreThresholdEnabled: boolean
+}
+
+const ModifyExternalRetrievalModal: React.FC<ModifyExternalRetrievalModalProps> = ({
+  onClose,
+  onSave,
+  initialTopK,
+  initialScoreThreshold,
+  initialScoreThresholdEnabled,
+}) => {
+  const { t } = useTranslation()
+  const [topK, setTopK] = useState(initialTopK)
+  const [scoreThreshold, setScoreThreshold] = useState(initialScoreThreshold)
+  const [scoreThresholdEnabled, setScoreThresholdEnabled] = useState(initialScoreThresholdEnabled)
+
+  const handleSettingsChange = (data: { top_k?: number; score_threshold?: number; score_threshold_enabled?: boolean }) => {
+    if (data.top_k !== undefined)
+      setTopK(data.top_k)
+    if (data.score_threshold !== undefined)
+      setScoreThreshold(data.score_threshold)
+    if (data.score_threshold_enabled !== undefined)
+      setScoreThresholdEnabled(data.score_threshold_enabled)
+  }
+
+  const handleSave = () => {
+    onSave({ top_k: topK, score_threshold: scoreThreshold, score_threshold_enabled: scoreThresholdEnabled })
+    onClose()
+  }
+
+  return (
+    <div className='shadows-shadow-2xl absolute right-[14px] top-[36px] z-10 flex w-[320px] flex-col items-start rounded-2xl
+      border-[0.5px] border-components-panel-border bg-components-panel-bg'
+    >
+      <div className='flex items-center justify-between self-stretch p-4 pb-2'>
+        <div className='system-xl-semibold grow text-text-primary'>{t('datasetHitTesting.settingTitle')}</div>
+        <ActionButton className='ml-auto' onClick={onClose}>
+          <RiCloseLine className='h-4 w-4 shrink-0' />
+        </ActionButton>
+      </div>
+      <div className='flex flex-col items-start justify-center gap-4 self-stretch p-4 pt-2'>
+        <RetrievalSettings
+          topK={topK}
+          scoreThreshold={scoreThreshold}
+          scoreThresholdEnabled={scoreThresholdEnabled}
+          onChange={handleSettingsChange}
+          isInHitTesting={true}
+        />
+      </div>
+      <div className='flex w-full items-end justify-end gap-1 p-4 pt-2'>
+        <Button className='min-w-[72px] shrink-0' onClick={onClose}>{t('common.operation.cancel')}</Button>
+        <Button variant='primary' className='min-w-[72px] shrink-0' onClick={handleSave}>{t('common.operation.save')}</Button>
+      </div>
+    </div>
+  )
+}
+
+export default ModifyExternalRetrievalModal
diff --git a/app/components/datasets/hit-testing/modify-retrieval-modal.tsx b/app/components/datasets/hit-testing/modify-retrieval-modal.tsx
new file mode 100644
index 0000000..e66448b
--- /dev/null
+++ b/app/components/datasets/hit-testing/modify-retrieval-modal.tsx
@@ -0,0 +1,118 @@
+'use client'
+import type { FC } from 'react'
+import React, { useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import Toast from '../../base/toast'
+import { ModelTypeEnum } from '../../header/account-setting/model-provider-page/declarations'
+import type { RetrievalConfig } from '@/types/app'
+import RetrievalMethodConfig from '@/app/components/datasets/common/retrieval-method-config'
+import EconomicalRetrievalMethodConfig from '@/app/components/datasets/common/economical-retrieval-method-config'
+import Button from '@/app/components/base/button'
+import { isReRankModelSelected } from '@/app/components/datasets/common/check-rerank-model'
+import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+
+type Props = {
+  indexMethod: string
+  value: RetrievalConfig
+  isShow: boolean
+  onHide: () => void
+  onSave: (value: RetrievalConfig) => void
+}
+
+const ModifyRetrievalModal: FC<Props> = ({
+  indexMethod,
+  value,
+  isShow,
+  onHide,
+  onSave,
+}) => {
+  const ref = useRef(null)
+  const { t } = useTranslation()
+  const [retrievalConfig, setRetrievalConfig] = useState(value)
+
+  // useClickAway(() => {
+  //   if (ref)
+  //     onHide()
+  // }, ref)
+
+  const {
+    modelList: rerankModelList,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
+
+  const handleSave = () => {
+    if (
+      !isReRankModelSelected({
+        rerankModelList,
+        retrievalConfig,
+        indexMethod,
+      })
+    ) {
+      Toast.notify({ type: 'error', message: t('appDebug.datasetConfig.rerankModelRequired') })
+      return
+    }
+    onSave(retrievalConfig)
+  }
+
+  if (!isShow)
+    return null
+
+  return (
+    <div
+      className='flex w-full flex-col rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-2xl shadow-shadow-shadow-9'
+      style={{
+        height: 'calc(100vh - 72px)',
+      }}
+      ref={ref}
+    >
+      <div className='h-15 flex shrink-0 justify-between px-3 pb-1 pt-3.5'>
+        <div className='text-base font-semibold text-text-primary'>
+          <div>{t('datasetSettings.form.retrievalSetting.title')}</div>
+          <div className='text-xs font-normal leading-[18px] text-text-tertiary'>
+            <a
+              target='_blank'
+              rel='noopener noreferrer'
+              href='https://docs.dify.ai/guides/knowledge-base/create-knowledge-and-upload-documents#id-4-retrieval-settings'
+              className='text-text-accent'
+            >
+              {t('datasetSettings.form.retrievalSetting.learnMore')}
+            </a>
+            {t('datasetSettings.form.retrievalSetting.description')}
+          </div>
+        </div>
+        <div className='flex'>
+          <div
+            onClick={onHide}
+            className='flex h-8 w-8 cursor-pointer items-center justify-center'
+          >
+            <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+        </div>
+      </div>
+
+      <div className='px-4 py-2'>
+        <div className='mb-1 text-[13px] font-semibold leading-6 text-text-secondary'>
+          {t('datasetSettings.form.retrievalSetting.method')}
+        </div>
+        {indexMethod === 'high_quality'
+          ? (
+            <RetrievalMethodConfig
+              value={retrievalConfig}
+              onChange={setRetrievalConfig}
+            />
+          )
+          : (
+            <EconomicalRetrievalMethodConfig
+              value={retrievalConfig}
+              onChange={setRetrievalConfig}
+            />
+          )}
+      </div>
+      <div className='flex justify-end p-4 pt-2'>
+        <Button className='mr-2 shrink-0' onClick={onHide}>{t('common.operation.cancel')}</Button>
+        <Button variant='primary' className='shrink-0' onClick={handleSave} >{t('common.operation.save')}</Button>
+      </div>
+    </div>
+  )
+}
+export default React.memo(ModifyRetrievalModal)
diff --git a/app/components/datasets/hit-testing/style.module.css b/app/components/datasets/hit-testing/style.module.css
new file mode 100644
index 0000000..a421962
--- /dev/null
+++ b/app/components/datasets/hit-testing/style.module.css
@@ -0,0 +1,43 @@
+.container {
+  @apply flex h-full w-full relative overflow-y-auto;
+}
+
+.container>div {
+  @apply flex-1 h-full;
+}
+
+.commonIcon {
+  @apply w-3.5 h-3.5 inline-block align-middle;
+  background-repeat: no-repeat;
+  background-position: center center;
+  background-size: contain;
+}
+
+.app_icon {
+  background-image: url(./assets/grid.svg);
+}
+
+.hit_testing_icon {
+  background-image: url(../documents/assets/target.svg);
+}
+
+.plugin_icon {
+  background-image: url(./assets/plugin.svg);
+}
+
+.cardWrapper {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(284px, auto));
+  grid-gap: 16px;
+  grid-auto-rows: 216px;
+}
+
+.clockWrapper {
+  border: 0.5px solid #eaecf5;
+  @apply rounded-lg w-11 h-11 flex justify-center items-center;
+}
+
+.clockIcon {
+  mask-image: url(./assets/clock.svg);
+  @apply bg-gray-500;
+}
diff --git a/app/components/datasets/hit-testing/textarea.tsx b/app/components/datasets/hit-testing/textarea.tsx
new file mode 100644
index 0000000..c92e107
--- /dev/null
+++ b/app/components/datasets/hit-testing/textarea.tsx
@@ -0,0 +1,200 @@
+import type { ChangeEvent } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiEqualizer2Line,
+} from '@remixicon/react'
+import Image from 'next/image'
+import Button from '../../base/button'
+import { getIcon } from '../common/retrieval-method-info'
+import ModifyExternalRetrievalModal from './modify-external-retrieval-modal'
+import Tooltip from '@/app/components/base/tooltip'
+import cn from '@/utils/classnames'
+import type { ExternalKnowledgeBaseHitTestingResponse, HitTestingResponse } from '@/models/datasets'
+import { externalKnowledgeBaseHitTesting, hitTesting } from '@/service/datasets'
+import { asyncRunSafe } from '@/utils'
+import { RETRIEVE_METHOD, type RetrievalConfig } from '@/types/app'
+
+type TextAreaWithButtonIProps = {
+  datasetId: string
+  onUpdateList: () => void
+  setHitResult: (res: HitTestingResponse) => void
+  setExternalHitResult: (res: ExternalKnowledgeBaseHitTestingResponse) => void
+  loading: boolean
+  setLoading: (v: boolean) => void
+  text: string
+  setText: (v: string) => void
+  isExternal?: boolean
+  onClickRetrievalMethod: () => void
+  retrievalConfig: RetrievalConfig
+  isEconomy: boolean
+  onSubmit?: () => void
+}
+
+const TextAreaWithButton = ({
+  datasetId,
+  onUpdateList,
+  setHitResult,
+  setExternalHitResult,
+  setLoading,
+  loading,
+  text,
+  setText,
+  isExternal = false,
+  onClickRetrievalMethod,
+  retrievalConfig,
+  isEconomy,
+  onSubmit: _onSubmit,
+}: TextAreaWithButtonIProps) => {
+  const { t } = useTranslation()
+  const [isSettingsOpen, setIsSettingsOpen] = useState(false)
+  const [externalRetrievalSettings, setExternalRetrievalSettings] = useState({
+    top_k: 2,
+    score_threshold: 0.5,
+    score_threshold_enabled: false,
+  })
+
+  const handleSaveExternalRetrievalSettings = (data: { top_k: number; score_threshold: number; score_threshold_enabled: boolean }) => {
+    setExternalRetrievalSettings(data)
+    setIsSettingsOpen(false)
+  }
+
+  function handleTextChange(event: ChangeEvent<HTMLTextAreaElement>) {
+    setText(event.target.value)
+  }
+
+  const onSubmit = async () => {
+    setLoading(true)
+    const [e, res] = await asyncRunSafe<HitTestingResponse>(
+      hitTesting({
+        datasetId,
+        queryText: text,
+        retrieval_model: {
+          ...retrievalConfig,
+          search_method: isEconomy ? RETRIEVE_METHOD.keywordSearch : retrievalConfig.search_method,
+        },
+      }) as Promise<HitTestingResponse>,
+    )
+    if (!e) {
+      setHitResult(res)
+      onUpdateList?.()
+    }
+    setLoading(false)
+    _onSubmit && _onSubmit()
+  }
+
+  const externalRetrievalTestingOnSubmit = async () => {
+    setLoading(true)
+    const [e, res] = await asyncRunSafe<ExternalKnowledgeBaseHitTestingResponse>(
+      externalKnowledgeBaseHitTesting({
+        datasetId,
+        query: text,
+        external_retrieval_model: {
+          top_k: externalRetrievalSettings.top_k,
+          score_threshold: externalRetrievalSettings.score_threshold,
+          score_threshold_enabled: externalRetrievalSettings.score_threshold_enabled,
+        },
+      }) as Promise<ExternalKnowledgeBaseHitTestingResponse>,
+    )
+    if (!e) {
+      setExternalHitResult(res)
+      onUpdateList?.()
+    }
+    setLoading(false)
+  }
+
+  const retrievalMethod = isEconomy ? RETRIEVE_METHOD.invertedIndex : retrievalConfig.search_method
+  const icon = <Image className='size-3.5 text-util-colors-purple-purple-600' src={getIcon(retrievalMethod)} alt='' />
+  return (
+    <>
+      <div className={cn('relative rounded-xl bg-gradient-to-r from-components-input-border-active-prompt-1 to-components-input-border-active-prompt-2 p-0.5 shadow-xs')}>
+        <div className='relative rounded-t-xl bg-background-section-burn pt-1.5'>
+          <div className="flex h-8 items-center justify-between pb-1 pl-4 pr-1.5">
+            <span className="text-[13px] font-semibold uppercase leading-4 text-text-secondary">
+              {t('datasetHitTesting.input.title')}
+            </span>
+            {isExternal
+              ? <Button
+                variant='secondary'
+                size='small'
+                onClick={() => setIsSettingsOpen(!isSettingsOpen)}
+              >
+                <RiEqualizer2Line className='h-3.5 w-3.5 text-components-button-secondary-text' />
+                <div className='flex items-center justify-center gap-1 px-[3px]'>
+                  <span className='system-xs-medium text-components-button-secondary-text'>{t('datasetHitTesting.settingTitle')}</span>
+                </div>
+              </Button>
+              : <div
+                onClick={onClickRetrievalMethod}
+                className='flex h-7 cursor-pointer items-center space-x-0.5 rounded-lg border-[0.5px] border-components-button-secondary-bg bg-components-button-secondary-bg px-1.5 shadow-xs backdrop-blur-[5px] hover:bg-components-button-secondary-bg-hover'
+              >
+                {icon}
+                <div className='text-xs font-medium uppercase text-text-secondary'>{t(`dataset.retrieval.${retrievalMethod}.title`)}</div>
+                <RiEqualizer2Line className='size-4 text-components-menu-item-text'></RiEqualizer2Line>
+              </div>
+            }
+          </div>
+          {
+            isSettingsOpen && (
+              <ModifyExternalRetrievalModal
+                onClose={() => setIsSettingsOpen(false)}
+                onSave={handleSaveExternalRetrievalSettings}
+                initialTopK={externalRetrievalSettings.top_k}
+                initialScoreThreshold={externalRetrievalSettings.score_threshold}
+                initialScoreThresholdEnabled={externalRetrievalSettings.score_threshold_enabled}
+              />
+            )
+          }
+          <div className='h-2 rounded-t-xl bg-background-default'></div>
+        </div>
+        <div className='rounded-b-xl bg-background-default px-4 pb-11'>
+          <textarea
+            className='h-[220px] w-full resize-none border-none bg-transparent text-sm font-normal text-text-secondary caret-[#295EFF]  placeholder:text-sm placeholder:font-normal placeholder:text-components-input-text-placeholder focus-visible:outline-none'
+            value={text}
+            onChange={handleTextChange}
+            placeholder={t('datasetHitTesting.input.placeholder') as string}
+          />
+          <div className="absolute inset-x-0 bottom-0 mx-4 mb-2 mt-2 flex items-center justify-between">
+            {text?.length > 200
+              ? (
+                <Tooltip
+                  popupContent={t('datasetHitTesting.input.countWarning')}
+                >
+                  <div
+                    className={cn('flex h-5 items-center rounded-md bg-background-section-burn px-1 text-xs font-medium text-red-600', !text?.length && 'opacity-50')}
+                  >
+                    {text?.length}
+                    <span className="mx-0.5 text-red-300">/</span>
+                    200
+                  </div>
+                </Tooltip>
+              )
+              : (
+                <div
+                  className={cn('flex h-5 items-center rounded-md bg-background-section-burn px-1 text-xs font-medium text-text-tertiary', !text?.length && 'opacity-50')}
+                >
+                  {text?.length}
+                  <span className="mx-0.5 text-divider-deep">/</span>
+                  200
+                </div>
+              )}
+
+            <div>
+              <Button
+                onClick={isExternal ? externalRetrievalTestingOnSubmit : onSubmit}
+                variant="primary"
+                loading={loading}
+                disabled={(!text?.length || text?.length > 200)}
+                className='w-[88px]'
+              >
+                {t('datasetHitTesting.input.testing')}
+              </Button>
+            </div>
+          </div>
+        </div>
+      </div>
+    </>
+  )
+}
+
+export default TextAreaWithButton
diff --git a/app/components/datasets/hit-testing/utils/extension-to-file-type.ts b/app/components/datasets/hit-testing/utils/extension-to-file-type.ts
new file mode 100644
index 0000000..68db742
--- /dev/null
+++ b/app/components/datasets/hit-testing/utils/extension-to-file-type.ts
@@ -0,0 +1,31 @@
+import { FileAppearanceTypeEnum } from '@/app/components/base/file-uploader/types'
+
+export const extensionToFileType = (extension: string): FileAppearanceTypeEnum => {
+  switch (extension) {
+    case 'pdf':
+      return FileAppearanceTypeEnum.pdf
+    case 'doc':
+    case 'docx':
+      return FileAppearanceTypeEnum.word
+    case 'txt':
+    case 'epub':
+      return FileAppearanceTypeEnum.document
+    case 'md':
+    case 'mdx':
+    case 'markdown':
+      return FileAppearanceTypeEnum.markdown
+    case 'csv':
+    case 'xls':
+    case 'xlsx':
+      return FileAppearanceTypeEnum.excel
+    case 'html':
+    case 'htm':
+    case 'xml':
+      return FileAppearanceTypeEnum.document
+    case 'ppt':
+    case 'pptx':
+      return FileAppearanceTypeEnum.ppt
+    default:
+      return FileAppearanceTypeEnum.custom
+  }
+}
diff --git a/app/components/datasets/loading.tsx b/app/components/datasets/loading.tsx
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/components/datasets/loading.tsx
diff --git a/app/components/datasets/metadata/add-metadata-button.tsx b/app/components/datasets/metadata/add-metadata-button.tsx
new file mode 100644
index 0000000..c342750
--- /dev/null
+++ b/app/components/datasets/metadata/add-metadata-button.tsx
@@ -0,0 +1,31 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import Button from '../../base/button'
+import { RiAddLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import { useTranslation } from 'react-i18next'
+
+type Props = {
+  className?: string
+  onClick?: () => void
+}
+
+const AddedMetadataButton: FC<Props> = ({
+  className,
+  onClick,
+}) => {
+  const { t } = useTranslation()
+  return (
+    <Button
+      className={cn('flex w-full items-center', className)}
+      size='small'
+      variant='tertiary'
+      onClick={onClick}
+    >
+      <RiAddLine className='mr-1 size-3.5' />
+      <div>{t('dataset.metadata.addMetadata')}</div>
+    </Button>
+  )
+}
+export default React.memo(AddedMetadataButton)
diff --git a/app/components/datasets/metadata/base/date-picker.tsx b/app/components/datasets/metadata/base/date-picker.tsx
new file mode 100644
index 0000000..f2bf1e4
--- /dev/null
+++ b/app/components/datasets/metadata/base/date-picker.tsx
@@ -0,0 +1,76 @@
+import { useCallback } from 'react'
+import dayjs from 'dayjs'
+import {
+  RiCalendarLine,
+  RiCloseCircleFill,
+} from '@remixicon/react'
+import DatePicker from '@/app/components/base/date-and-time-picker/date-picker'
+import cn from '@/utils/classnames'
+import type { TriggerProps } from '@/app/components/base/date-and-time-picker/types'
+import useTimestamp from '@/hooks/use-timestamp'
+import { useTranslation } from 'react-i18next'
+
+type Props = {
+  className?: string
+  value?: number
+  onChange: (date: number | null) => void
+}
+const WrappedDatePicker = ({
+  className,
+  value,
+  onChange,
+}: Props) => {
+  const { t } = useTranslation()
+  // const { userProfile: { timezone } } = useAppContext()
+  const { formatTime: formatTimestamp } = useTimestamp()
+
+  const handleDateChange = useCallback((date?: dayjs.Dayjs) => {
+    if (date)
+      onChange(date.unix())
+    else
+      onChange(null)
+  }, [onChange])
+
+  const renderTrigger = useCallback(({
+    handleClickTrigger,
+  }: TriggerProps) => {
+    return (
+      <div onClick={handleClickTrigger} className={cn('group flex items-center rounded-md bg-components-input-bg-normal', className)}>
+        <div
+          className={cn(
+            'grow',
+            value ? 'text-text-secondary' : 'text-text-tertiary',
+          )}
+        >
+          {value ? formatTimestamp(value, t('datasetDocuments.metadata.dateTimeFormat')) : t('dataset.metadata.chooseTime')}
+        </div>
+        <RiCloseCircleFill
+          className={cn(
+            'hidden h-4 w-4 cursor-pointer hover:text-components-input-text-filled group-hover:block',
+            value && 'text-text-quaternary',
+          )}
+          onClick={() => handleDateChange()}
+        />
+        <RiCalendarLine
+          className={cn(
+            'block h-4 w-4 shrink-0 group-hover:hidden',
+            value ? 'text-text-quaternary' : 'text-text-tertiary',
+          )}
+        />
+      </div>
+    )
+  }, [className, value, formatTimestamp, t, handleDateChange])
+
+  return (
+    <DatePicker
+      value={dayjs(value ? value * 1000 : Date.now())}
+      onChange={handleDateChange}
+      onClear={handleDateChange}
+      renderTrigger={renderTrigger}
+      triggerWrapClassName='w-full'
+      popupZIndexClassname='z-[1000]'
+    />
+  )
+}
+
+export default WrappedDatePicker
diff --git a/app/components/datasets/metadata/edit-metadata-batch/add-row.tsx b/app/components/datasets/metadata/edit-metadata-batch/add-row.tsx
new file mode 100644
index 0000000..500bca3
--- /dev/null
+++ b/app/components/datasets/metadata/edit-metadata-batch/add-row.tsx
@@ -0,0 +1,45 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { MetadataItemWithEdit } from '../types'
+import cn from '@/utils/classnames'
+import Label from './label'
+import InputCombined from './input-combined'
+import { RiIndeterminateCircleLine } from '@remixicon/react'
+
+type Props = {
+  className?: string
+  payload: MetadataItemWithEdit
+  onChange: (value: MetadataItemWithEdit) => void
+  onRemove: () => void
+}
+
+const AddRow: FC<Props> = ({
+  className,
+  payload,
+  onChange,
+  onRemove,
+}) => {
+  return (
+    <div className={cn('flex h-6 items-center space-x-0.5', className)}>
+      <Label text={payload.name} />
+      <InputCombined
+        type={payload.type}
+        value={payload.value}
+        onChange={value => onChange({ ...payload, value })}
+      />
+      <div
+        className={
+          cn(
+            'cursor-pointer rounded-md p-1 text-text-tertiary hover:bg-state-destructive-hover hover:text-text-destructive',
+          )
+        }
+        onClick={onRemove}
+      >
+        <RiIndeterminateCircleLine className='size-4' />
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(AddRow)
diff --git a/app/components/datasets/metadata/edit-metadata-batch/edit-row.tsx b/app/components/datasets/metadata/edit-metadata-batch/edit-row.tsx
new file mode 100644
index 0000000..63b4338
--- /dev/null
+++ b/app/components/datasets/metadata/edit-metadata-batch/edit-row.tsx
@@ -0,0 +1,56 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { type MetadataItemWithEdit, UpdateType } from '../types'
+import Label from './label'
+import { RiDeleteBinLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import InputHasSetMultipleValue from './input-has-set-multiple-value'
+import InputCombined from './input-combined'
+import EditedBeacon from './edited-beacon'
+
+type Props = {
+  payload: MetadataItemWithEdit
+  onChange: (payload: MetadataItemWithEdit) => void
+  onRemove: (id: string) => void
+  onReset: (id: string) => void
+}
+
+const EditMetadatabatchItem: FC<Props> = ({
+  payload,
+  onChange,
+  onRemove,
+  onReset,
+}) => {
+  const isUpdated = payload.isUpdated
+  const isDeleted = payload.updateType === UpdateType.delete
+  return (
+    <div className='flex h-6 items-center space-x-0.5'>
+      {isUpdated ? <EditedBeacon onReset={() => onReset(payload.id)} /> : <div className='size-4 shrink-0' />}
+      <Label text={payload.name} isDeleted={isDeleted} />
+      {payload.isMultipleValue
+        ? <InputHasSetMultipleValue
+          onClear={() => onChange({ ...payload, value: null, isMultipleValue: false })}
+          readOnly={isDeleted}
+        />
+        : <InputCombined
+          type={payload.type}
+          value={payload.value}
+          onChange={v => onChange({ ...payload, value: v as string })}
+          readOnly={isDeleted}
+        />}
+
+      <div
+        className={
+          cn(
+            'cursor-pointer rounded-md p-1 text-text-tertiary hover:bg-state-destructive-hover hover:text-text-destructive',
+            isDeleted && 'cursor-default bg-state-destructive-hover  text-text-destructive')
+        }
+        onClick={() => onRemove(payload.id)}
+      >
+        <RiDeleteBinLine className='size-4' />
+      </div>
+    </div>
+  )
+}
+export default React.memo(EditMetadatabatchItem)
diff --git a/app/components/datasets/metadata/edit-metadata-batch/edited-beacon.tsx b/app/components/datasets/metadata/edit-metadata-batch/edited-beacon.tsx
new file mode 100644
index 0000000..ba41918
--- /dev/null
+++ b/app/components/datasets/metadata/edit-metadata-batch/edited-beacon.tsx
@@ -0,0 +1,36 @@
+'use client'
+import type { FC } from 'react'
+import React, { useRef } from 'react'
+import { useHover } from 'ahooks'
+import { RiResetLeftLine } from '@remixicon/react'
+import Tooltip from '@/app/components/base/tooltip'
+import { useTranslation } from 'react-i18next'
+
+type Props = {
+  onReset: () => void
+}
+
+const EditedBeacon: FC<Props> = ({
+  onReset,
+}) => {
+  const { t } = useTranslation()
+  const ref = useRef(null)
+  const isHovering = useHover(ref)
+
+  return (
+    <div ref={ref} className='size-4 cursor-pointer'>
+      {isHovering ? (
+        <Tooltip popupContent={t('common.operation.reset')}>
+          <div className='flex size-4 items-center justify-center rounded-full bg-text-accent-secondary' onClick={onReset}>
+            <RiResetLeftLine className='size-[10px] text-text-primary-on-surface' />
+          </div>
+        </Tooltip>
+      ) : (
+        <div className='flex size-4 items-center justify-center'>
+          <div className='size-1 rounded-full bg-text-accent-secondary'></div>
+        </div>
+      )}
+    </div>
+  )
+}
+export default React.memo(EditedBeacon)
diff --git a/app/components/datasets/metadata/edit-metadata-batch/input-combined.tsx b/app/components/datasets/metadata/edit-metadata-batch/input-combined.tsx
new file mode 100644
index 0000000..fd7bb89
--- /dev/null
+++ b/app/components/datasets/metadata/edit-metadata-batch/input-combined.tsx
@@ -0,0 +1,61 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { DataType } from '../types'
+import Input from '@/app/components/base/input'
+import { InputNumber } from '@/app/components/base/input-number'
+import cn from '@/utils/classnames'
+import Datepicker from '../base/date-picker'
+
+type Props = {
+  className?: string
+  type: DataType
+  value: any
+  onChange: (value: any) => void
+  readOnly?: boolean
+}
+
+const InputCombined: FC<Props> = ({
+  className: configClassName,
+  type,
+  value,
+  onChange,
+  readOnly,
+}) => {
+  const className = cn('h-6 grow p-0.5 text-xs')
+  if (type === DataType.time) {
+    return (
+      <Datepicker
+        className={className}
+        value={value}
+        onChange={onChange}
+      />
+    )
+  }
+
+  if (type === DataType.number) {
+    return (
+      <div className='grow text-[0]'>
+        <InputNumber
+          className={cn(className, 'rounded-l-md')}
+          value={value}
+          onChange={onChange}
+          size='regular'
+          controlWrapClassName='overflow-hidden'
+          controlClassName='pt-0 pb-0'
+          readOnly={readOnly}
+        />
+      </div>
+    )
+  }
+  return (
+    <Input
+      wrapperClassName={configClassName}
+      className={cn(className, 'rounded-md')}
+      value={value}
+      onChange={e => onChange(e.target.value)}
+      readOnly={readOnly}
+    />
+  )
+}
+export default React.memo(InputCombined)
diff --git a/app/components/datasets/metadata/edit-metadata-batch/input-has-set-multiple-value.tsx b/app/components/datasets/metadata/edit-metadata-batch/input-has-set-multiple-value.tsx
new file mode 100644
index 0000000..1e6d457
--- /dev/null
+++ b/app/components/datasets/metadata/edit-metadata-batch/input-has-set-multiple-value.tsx
@@ -0,0 +1,34 @@
+'use client'
+import { RiCloseLine } from '@remixicon/react'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+
+type Props = {
+  onClear: () => void
+  readOnly?: boolean
+}
+
+const InputHasSetMultipleValue: FC<Props> = ({
+  onClear,
+  readOnly,
+}) => {
+  const { t } = useTranslation()
+  return (
+    <div className='h-6 grow rounded-md bg-components-input-bg-normal p-0.5 text-[0]'>
+      <div className={cn('inline-flex h-5 items-center space-x-0.5 rounded-[5px] border-[0.5px] border-components-panel-border bg-components-badge-white-to-dark pl-1.5 pr-0.5 shadow-xs', readOnly && 'pr-1.5')}>
+        <div className='system-xs-regular text-text-secondary'>{t('dataset.metadata.batchEditMetadata.multipleValue')}</div>
+        {!readOnly && (
+          <div className='cursor-pointer rounded-[4px] p-px text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary'>
+            <RiCloseLine
+              className='size-3.5 '
+              onClick={onClear}
+            />
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+export default React.memo(InputHasSetMultipleValue)
diff --git a/app/components/datasets/metadata/edit-metadata-batch/label.tsx b/app/components/datasets/metadata/edit-metadata-batch/label.tsx
new file mode 100644
index 0000000..a6d134d
--- /dev/null
+++ b/app/components/datasets/metadata/edit-metadata-batch/label.tsx
@@ -0,0 +1,27 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+
+type Props = {
+  isDeleted?: boolean,
+  className?: string,
+  text: string
+}
+
+const Label: FC<Props> = ({
+  isDeleted,
+  className,
+  text,
+}) => {
+  return (
+    <div className={cn(
+      'system-xs-medium w-[136px] shrink-0 truncate text-text-tertiary',
+      isDeleted && 'text-text-quaternary line-through',
+      className,
+    )}>
+      {text}
+    </div>
+  )
+}
+export default React.memo(Label)
diff --git a/app/components/datasets/metadata/edit-metadata-batch/modal.tsx b/app/components/datasets/metadata/edit-metadata-batch/modal.tsx
new file mode 100644
index 0000000..c80bd61
--- /dev/null
+++ b/app/components/datasets/metadata/edit-metadata-batch/modal.tsx
@@ -0,0 +1,189 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import Modal from '../../../base/modal'
+import type { BuiltInMetadataItem, MetadataItemInBatchEdit } from '../types'
+import { type MetadataItemWithEdit, UpdateType } from '../types'
+import EditMetadataBatchItem from './edit-row'
+import AddedMetadataItem from './add-row'
+import Button from '../../../base/button'
+import { useTranslation } from 'react-i18next'
+import Checkbox from '../../../base/checkbox'
+import Tooltip from '../../../base/tooltip'
+import SelectMetadataModal from '../metadata-dataset/select-metadata-modal'
+import { RiQuestionLine } from '@remixicon/react'
+import Divider from '@/app/components/base/divider'
+import AddMetadataButton from '../add-metadata-button'
+import produce from 'immer'
+import useCheckMetadataName from '../hooks/use-check-metadata-name'
+import Toast from '@/app/components/base/toast'
+import { useCreateMetaData } from '@/service/knowledge/use-metadata'
+
+const i18nPrefix = 'dataset.metadata.batchEditMetadata'
+
+type Props = {
+  datasetId: string,
+  documentNum: number
+  list: MetadataItemInBatchEdit[]
+  onSave: (editedList: MetadataItemInBatchEdit[], addedList: MetadataItemInBatchEdit[], isApplyToAllSelectDocument: boolean) => void
+  onHide: () => void
+  onShowManage: () => void
+}
+
+const EditMetadataBatchModal: FC<Props> = ({
+  datasetId,
+  documentNum,
+  list,
+  onSave,
+  onHide,
+  onShowManage,
+}) => {
+  const { t } = useTranslation()
+  const [templeList, setTempleList] = useState<MetadataItemWithEdit[]>(list)
+  const handleTemplesChange = useCallback((payload: MetadataItemWithEdit) => {
+    const newTempleList = produce(templeList, (draft) => {
+      const index = draft.findIndex(i => i.id === payload.id)
+      if (index !== -1) {
+        draft[index] = payload
+        draft[index].isUpdated = true
+        draft[index].updateType = UpdateType.changeValue
+      }
+    },
+    )
+    setTempleList(newTempleList)
+  }, [templeList])
+  const handleTempleItemRemove = useCallback((id: string) => {
+    const newTempleList = produce(templeList, (draft) => {
+      const index = draft.findIndex(i => i.id === id)
+      if (index !== -1) {
+        draft[index].isUpdated = true
+        draft[index].updateType = UpdateType.delete
+      }
+    })
+    setTempleList(newTempleList)
+  }, [templeList])
+
+  const handleItemReset = useCallback((id: string) => {
+    const newTempleList = produce(templeList, (draft) => {
+      const index = draft.findIndex(i => i.id === id)
+      if (index !== -1) {
+        draft[index] = { ...list[index] }
+        draft[index].isUpdated = false
+        delete draft[index].updateType
+      }
+    })
+    setTempleList(newTempleList)
+  }, [list, templeList])
+
+  const { checkName } = useCheckMetadataName()
+  const { mutate: doAddMetaData } = useCreateMetaData(datasetId)
+  const handleAddMetaData = useCallback(async (payload: BuiltInMetadataItem) => {
+    const errorMsg = checkName(payload.name).errorMsg
+    if (errorMsg) {
+      Toast.notify({
+        message: errorMsg,
+        type: 'error',
+      })
+      return Promise.reject(new Error(errorMsg))
+    }
+    await doAddMetaData(payload)
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+  }, [checkName, doAddMetaData, t])
+
+  const [addedList, setAddedList] = useState<MetadataItemWithEdit[]>([])
+  const handleAddedListChange = useCallback((payload: MetadataItemWithEdit) => {
+    const newAddedList = addedList.map(i => i.id === payload.id ? payload : i)
+    setAddedList(newAddedList)
+  }, [addedList])
+  const handleAddedItemRemove = useCallback((removeIndex: number) => {
+    return () => {
+      const newAddedList = addedList.filter((i, index) => index !== removeIndex)
+      setAddedList(newAddedList)
+    }
+  }, [addedList])
+
+  const [isApplyToAllSelectDocument, setIsApplyToAllSelectDocument] = useState(false)
+
+  const handleSave = useCallback(() => {
+    onSave(templeList.filter(item => item.updateType !== UpdateType.delete), addedList, isApplyToAllSelectDocument)
+  }, [templeList, addedList, isApplyToAllSelectDocument, onSave])
+  return (
+    <Modal
+      title={t(`${i18nPrefix}.editMetadata`)}
+      isShow
+      closable
+      onClose={onHide}
+      className='!max-w-[640px]'
+    >
+      <div className='system-xs-medium mt-1 text-text-accent'>{t(`${i18nPrefix}.editDocumentsNum`, { num: documentNum })}</div>
+      <div className='ml-[-16px] max-h-[305px] overflow-y-auto'>
+        <div className='mt-4 space-y-2'>
+          {templeList.map(item => (
+            <EditMetadataBatchItem
+              key={item.id}
+              payload={item}
+              onChange={handleTemplesChange}
+              onRemove={handleTempleItemRemove}
+              onReset={handleItemReset}
+            />
+          ))}
+        </div>
+        <div className='mt-4 pl-[18px]'>
+          <div className='flex items-center'>
+            <div className='system-xs-medium-uppercase mr-2 shrink-0 text-text-tertiary'>{t('dataset.metadata.createMetadata.title')}</div>
+            <Divider bgStyle='gradient' />
+          </div>
+          <div className='mt-2 space-y-2'>
+            {addedList.map((item, i) => (
+              <AddedMetadataItem
+                key={i}
+                payload={item}
+                onChange={handleAddedListChange}
+                onRemove={handleAddedItemRemove(i)}
+              />
+            ))}
+          </div>
+          <div className='mt-3'>
+            <SelectMetadataModal
+              datasetId={datasetId}
+              popupPlacement='top-start'
+              popupOffset={{ mainAxis: 4, crossAxis: 0 }}
+              trigger={
+                <AddMetadataButton />
+              }
+              onSave={handleAddMetaData}
+              onSelect={data => setAddedList([...addedList, data as MetadataItemWithEdit])}
+              onManage={onShowManage}
+            />
+          </div>
+        </div>
+      </div>
+
+      <div className='mt-4 flex items-center justify-between'>
+        <div className='flex select-none items-center'>
+          <Checkbox checked={isApplyToAllSelectDocument} onCheck={() => setIsApplyToAllSelectDocument(!isApplyToAllSelectDocument)} />
+          <div className='system-xs-medium ml-2 mr-1 text-text-secondary'>{t(`${i18nPrefix}.applyToAllSelectDocument`)}</div>
+          <Tooltip popupContent={
+            <div className='max-w-[240px]'>{t(`${i18nPrefix}.applyToAllSelectDocumentTip`)}</div>
+          } >
+            <div className='cursor-pointer p-px'>
+              <RiQuestionLine className='size-3.5 text-text-tertiary' />
+            </div>
+          </Tooltip>
+        </div>
+        <div className='flex items-center space-x-2'>
+          <Button
+            onClick={onHide}>{t('common.operation.cancel')}</Button>
+          <Button
+            onClick={handleSave}
+            variant='primary'
+          >{t('common.operation.save')}</Button>
+        </div>
+      </div>
+    </Modal>
+  )
+}
+export default React.memo(EditMetadataBatchModal)
diff --git a/app/components/datasets/metadata/hooks/use-batch-edit-document-metadata.ts b/app/components/datasets/metadata/hooks/use-batch-edit-document-metadata.ts
new file mode 100644
index 0000000..3bb6e1d
--- /dev/null
+++ b/app/components/datasets/metadata/hooks/use-batch-edit-document-metadata.ts
@@ -0,0 +1,143 @@
+import { useBoolean } from 'ahooks'
+import { type MetadataBatchEditToServer, type MetadataItemInBatchEdit, type MetadataItemWithEdit, type MetadataItemWithValue, UpdateType } from '../types'
+import type { SimpleDocumentDetail } from '@/models/datasets'
+import { useMemo } from 'react'
+import { useBatchUpdateDocMetadata } from '@/service/knowledge/use-metadata'
+import Toast from '@/app/components/base/toast'
+import { t } from 'i18next'
+
+type Props = {
+  datasetId: string
+  docList: SimpleDocumentDetail[]
+  onUpdate: () => void
+}
+
+const useBatchEditDocumentMetadata = ({
+  datasetId,
+  docList,
+  onUpdate,
+}: Props) => {
+  const [isShowEditModal, {
+    setTrue: showEditModal,
+    setFalse: hideEditModal,
+  }] = useBoolean(false)
+
+  const metaDataList: MetadataItemWithValue[][] = (() => {
+    const res: MetadataItemWithValue[][] = []
+    docList.forEach((item) => {
+      if (item.doc_metadata) {
+        res.push(item.doc_metadata.filter(item => item.id !== 'built-in'))
+        return
+      }
+      res.push([])
+    })
+    return res
+  })()
+
+  // To check is key has multiple value
+  const originalList: MetadataItemInBatchEdit[] = useMemo(() => {
+    const idNameValue: Record<string, { value: string | number | null, isMultipleValue: boolean }> = {}
+
+    const res: MetadataItemInBatchEdit[] = []
+    metaDataList.forEach((metaData) => {
+      metaData.forEach((item) => {
+        if (idNameValue[item.id]?.isMultipleValue)
+          return
+        const itemInRes = res.find(i => i.id === item.id)
+        if (!idNameValue[item.id]) {
+          idNameValue[item.id] = {
+            value: item.value,
+            isMultipleValue: false,
+          }
+        }
+
+        if (itemInRes && itemInRes.value !== item.value) {
+          idNameValue[item.id].isMultipleValue = true
+          itemInRes.isMultipleValue = true
+          itemInRes.value = null
+          return
+        }
+        if (!itemInRes) {
+          res.push({
+            ...item,
+            isMultipleValue: false,
+          })
+        }
+      })
+    })
+    return res
+  }, [metaDataList])
+
+  const formateToBackendList = (editedList: MetadataItemWithEdit[], addedList: MetadataItemInBatchEdit[], isApplyToAllSelectDocument: boolean) => {
+    const updatedList = editedList.filter((editedItem) => {
+      return editedItem.updateType === UpdateType.changeValue
+    })
+    const removedList = originalList.filter((originalItem) => {
+      const editedItem = editedList.find(i => i.id === originalItem.id)
+      if (!editedItem) // removed item
+        return true
+      return false
+    })
+
+    const res: MetadataBatchEditToServer = docList.map((item, i) => {
+      // the new metadata will override the old one
+      const oldMetadataList = metaDataList[i]
+      let newMetadataList: MetadataItemWithValue[] = [...oldMetadataList, ...addedList]
+        .filter((item) => {
+          return !removedList.find(removedItem => removedItem.id === item.id)
+        })
+        .map(item => ({
+          id: item.id,
+          name: item.name,
+          type: item.type,
+          value: item.value,
+        }))
+      if (isApplyToAllSelectDocument) {
+        // add missing metadata item
+        updatedList.forEach((editedItem) => {
+          if (!newMetadataList.find(i => i.id === editedItem.id) && !editedItem.isMultipleValue)
+            newMetadataList.push(editedItem)
+        })
+      }
+
+      newMetadataList = newMetadataList.map((item) => {
+        const editedItem = updatedList.find(i => i.id === item.id)
+        if (editedItem)
+          return editedItem
+        return item
+      })
+
+      return {
+        document_id: item.id,
+        metadata_list: newMetadataList,
+      }
+    })
+    return res
+  }
+
+  const { mutateAsync } = useBatchUpdateDocMetadata()
+
+  const handleSave = async (editedList: MetadataItemInBatchEdit[], addedList: MetadataItemInBatchEdit[], isApplyToAllSelectDocument: boolean) => {
+    const backendList = formateToBackendList(editedList, addedList, isApplyToAllSelectDocument)
+    await mutateAsync({
+      dataset_id: datasetId,
+      metadata_list: backendList,
+    })
+    onUpdate()
+    hideEditModal()
+    Toast.notify({
+      type: 'success',
+      message: t('common.actionMsg.modifiedSuccessfully'),
+    })
+  }
+
+  return {
+    isShowEditModal,
+    showEditModal,
+    hideEditModal,
+    originalList,
+    handleSave,
+  }
+}
+
+export default useBatchEditDocumentMetadata
diff --git a/app/components/datasets/metadata/hooks/use-check-metadata-name.ts b/app/components/datasets/metadata/hooks/use-check-metadata-name.ts
new file mode 100644
index 0000000..45fe767
--- /dev/null
+++ b/app/components/datasets/metadata/hooks/use-check-metadata-name.ts
@@ -0,0 +1,28 @@
+import { useTranslation } from 'react-i18next'
+
+const i18nPrefix = 'dataset.metadata.checkName'
+
+const useCheckMetadataName = () => {
+  const { t } = useTranslation()
+  return {
+    checkName: (name: string) => {
+      if (!name) {
+        return {
+          errorMsg: t(`${i18nPrefix}.empty`),
+        }
+      }
+
+      if (!/^[a-z][a-z0-9_]*$/.test(name)) {
+        return {
+          errorMsg: t(`${i18nPrefix}.invalid`),
+        }
+      }
+
+      return {
+        errorMsg: '',
+      }
+    },
+  }
+}
+
+export default useCheckMetadataName
diff --git a/app/components/datasets/metadata/hooks/use-edit-dataset-metadata.ts b/app/components/datasets/metadata/hooks/use-edit-dataset-metadata.ts
new file mode 100644
index 0000000..dd1cd0f
--- /dev/null
+++ b/app/components/datasets/metadata/hooks/use-edit-dataset-metadata.ts
@@ -0,0 +1,96 @@
+import { useBoolean } from 'ahooks'
+import { useBuiltInMetaDataFields, useCreateMetaData, useDatasetMetaData, useDeleteMetaData, useRenameMeta, useUpdateBuiltInStatus } from '@/service/knowledge/use-metadata'
+import type { DataSet } from '@/models/datasets'
+import { useCallback, useEffect, useState } from 'react'
+import { type BuiltInMetadataItem, type MetadataItemWithValueLength, isShowManageMetadataLocalStorageKey } from '../types'
+import useCheckMetadataName from './use-check-metadata-name'
+import Toast from '@/app/components/base/toast'
+import { useTranslation } from 'react-i18next'
+
+const useEditDatasetMetadata = ({
+  datasetId,
+  // dataset,
+  onUpdateDocList,
+}: {
+  datasetId: string,
+  dataset?: DataSet,
+  onUpdateDocList: () => void
+}) => {
+  const { t } = useTranslation()
+  const [isShowEditModal, {
+    setTrue: showEditModal,
+    setFalse: hideEditModal,
+  }] = useBoolean(false)
+
+  useEffect(() => {
+    const isShowManageMetadata = localStorage.getItem(isShowManageMetadataLocalStorageKey)
+    if (isShowManageMetadata) {
+      showEditModal()
+      localStorage.removeItem(isShowManageMetadataLocalStorageKey)
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  const { data: datasetMetaData } = useDatasetMetaData(datasetId)
+  const { mutate: doAddMetaData } = useCreateMetaData(datasetId)
+  const { checkName } = useCheckMetadataName()
+  const handleAddMetaData = useCallback(async (payload: BuiltInMetadataItem) => {
+    const errorMsg = checkName(payload.name).errorMsg
+    if (errorMsg) {
+      Toast.notify({
+        message: errorMsg,
+        type: 'error',
+      })
+      return Promise.reject(new Error(errorMsg))
+    }
+    await doAddMetaData(payload)
+  }, [checkName, doAddMetaData])
+
+  const { mutate: doRenameMetaData } = useRenameMeta(datasetId)
+  const handleRename = useCallback(async (payload: MetadataItemWithValueLength) => {
+    const errorMsg = checkName(payload.name).errorMsg
+    if (errorMsg) {
+      Toast.notify({
+        message: errorMsg,
+        type: 'error',
+      })
+      return Promise.reject(new Error(errorMsg))
+    }
+    await doRenameMetaData(payload)
+    onUpdateDocList()
+  }, [checkName, doRenameMetaData, onUpdateDocList])
+
+  const { mutateAsync: doDeleteMetaData } = useDeleteMetaData(datasetId)
+  const handleDeleteMetaData = useCallback(async (metaDataId: string) => {
+    await doDeleteMetaData(metaDataId)
+    onUpdateDocList()
+  }, [doDeleteMetaData, onUpdateDocList])
+
+  const [builtInEnabled, setBuiltInEnabled] = useState(datasetMetaData?.built_in_field_enabled)
+  useEffect(() => { // wait for api response to set the right value
+    setBuiltInEnabled(datasetMetaData?.built_in_field_enabled)
+  }, [datasetMetaData])
+  const { mutateAsync: toggleBuiltInStatus } = useUpdateBuiltInStatus(datasetId)
+  const { data: builtInMetaData } = useBuiltInMetaDataFields()
+  return {
+    isShowEditModal,
+    showEditModal,
+    hideEditModal,
+    datasetMetaData: datasetMetaData?.doc_metadata,
+    handleAddMetaData,
+    handleRename,
+    handleDeleteMetaData,
+    builtInMetaData: builtInMetaData?.fields,
+    builtInEnabled,
+    setBuiltInEnabled: async (enable: boolean) => {
+      await toggleBuiltInStatus(enable)
+      setBuiltInEnabled(enable)
+      Toast.notify({
+        message: t('common.actionMsg.modifiedSuccessfully'),
+        type: 'success',
+      })
+    },
+  }
+}
+
+export default useEditDatasetMetadata
diff --git a/app/components/datasets/metadata/hooks/use-metadata-document.ts b/app/components/datasets/metadata/hooks/use-metadata-document.ts
new file mode 100644
index 0000000..f52806e
--- /dev/null
+++ b/app/components/datasets/metadata/hooks/use-metadata-document.ts
@@ -0,0 +1,159 @@
+import { useBatchUpdateDocMetadata, useDatasetMetaData, useDocumentMetaData } from '@/service/knowledge/use-metadata'
+import { useDatasetDetailContext } from '@/context/dataset-detail'
+import type { BuiltInMetadataItem } from '../types'
+import { DataType, type MetadataItemWithValue } from '../types'
+import { useCallback, useState } from 'react'
+import Toast from '@/app/components/base/toast'
+import type { FullDocumentDetail } from '@/models/datasets'
+import { useTranslation } from 'react-i18next'
+import { useLanguages, useMetadataMap } from '@/hooks/use-metadata'
+import { get } from 'lodash-es'
+import { useCreateMetaData } from '@/service/knowledge/use-metadata'
+import useCheckMetadataName from './use-check-metadata-name'
+
+type Props = {
+  datasetId: string
+  documentId: string
+  docDetail: FullDocumentDetail
+}
+
+const useMetadataDocument = ({
+  datasetId,
+  documentId,
+  docDetail,
+}: Props) => {
+  const { t } = useTranslation()
+
+  const { dataset } = useDatasetDetailContext()
+  const embeddingAvailable = !!dataset?.embedding_available
+
+  const { mutateAsync } = useBatchUpdateDocMetadata()
+  const { checkName } = useCheckMetadataName()
+
+  const [isEdit, setIsEdit] = useState(false)
+  const { data: documentDetail } = useDocumentMetaData({
+    datasetId,
+    documentId,
+  })
+
+  const allList = documentDetail?.doc_metadata || []
+  const list = allList.filter(item => item.id !== 'built-in')
+  const builtList = allList.filter(item => item.id === 'built-in')
+  const [tempList, setTempList] = useState<MetadataItemWithValue[]>(list)
+  const { mutateAsync: doAddMetaData } = useCreateMetaData(datasetId)
+  const handleSelectMetaData = useCallback((metaData: MetadataItemWithValue) => {
+    setTempList((prev) => {
+      const index = prev.findIndex(item => item.id === metaData.id)
+      if (index === -1)
+        return [...prev, metaData]
+
+      return prev
+    })
+  }, [])
+  const handleAddMetaData = useCallback(async (payload: BuiltInMetadataItem) => {
+    const errorMsg = checkName(payload.name).errorMsg
+    if (errorMsg) {
+      Toast.notify({
+        message: errorMsg,
+        type: 'error',
+      })
+      return Promise.reject(new Error(errorMsg))
+    }
+    await doAddMetaData(payload)
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+  }, [checkName, doAddMetaData, t])
+
+  const hasData = list.length > 0
+  const handleSave = async () => {
+    await mutateAsync({
+      dataset_id: datasetId,
+      metadata_list: [{
+        document_id: documentId,
+        metadata_list: tempList,
+      }],
+    })
+    setIsEdit(false)
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+  }
+
+  const handleCancel = () => {
+    setTempList(list)
+    setIsEdit(false)
+  }
+
+  const startToEdit = () => {
+    setTempList(list)
+    setIsEdit(true)
+  }
+
+  // built in enabled is set in dataset
+  const { data: datasetMetaData } = useDatasetMetaData(datasetId)
+  const builtInEnabled = datasetMetaData?.built_in_field_enabled
+
+  // old metadata and technical params
+  const metadataMap = useMetadataMap()
+  const languageMap = useLanguages()
+
+  const getReadOnlyMetaData = (mainField: 'originInfo' | 'technicalParameters') => {
+    const fieldMap = metadataMap[mainField]?.subFieldsMap
+    const sourceData = docDetail
+    const getTargetMap = (field: string) => {
+      if (field === 'language')
+        return languageMap
+
+      return {} as any
+    }
+
+    const getTargetValue = (field: string) => {
+      const val = get(sourceData, field, '')
+      if (!val && val !== 0)
+        return '-'
+      if (fieldMap[field]?.inputType === 'select')
+        return getTargetMap(field)[val]
+      if (fieldMap[field]?.render)
+        return fieldMap[field]?.render?.(val, field === 'hit_count' ? get(sourceData, 'segment_count', 0) as number : undefined)
+      return val
+    }
+    const fieldList = Object.keys(fieldMap).map((key) => {
+      const field = fieldMap[key]
+      return {
+        id: field?.label,
+        type: DataType.string,
+        name: field?.label,
+        value: getTargetValue(key),
+      }
+    })
+
+    return fieldList
+  }
+
+  const originInfo = getReadOnlyMetaData('originInfo')
+  const technicalParameters = getReadOnlyMetaData('technicalParameters')
+
+  return {
+    embeddingAvailable,
+    isEdit,
+    setIsEdit,
+    list,
+    tempList,
+    setTempList,
+    handleSelectMetaData,
+    handleAddMetaData,
+    hasData,
+    builtList,
+    builtInEnabled,
+    startToEdit,
+    handleSave,
+    handleCancel,
+    originInfo,
+    technicalParameters,
+  }
+}
+
+export default useMetadataDocument
diff --git a/app/components/datasets/metadata/metadata-dataset/create-content.tsx b/app/components/datasets/metadata/metadata-dataset/create-content.tsx
new file mode 100644
index 0000000..3ac1a04
--- /dev/null
+++ b/app/components/datasets/metadata/metadata-dataset/create-content.tsx
@@ -0,0 +1,90 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { DataType } from '../types'
+import ModalLikeWrap from '../../../base/modal-like-wrap'
+import Field from './field'
+import OptionCard from '../../../workflow/nodes/_base/components/option-card'
+import Input from '@/app/components/base/input'
+import { RiArrowLeftLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { noop } from 'lodash-es'
+
+const i18nPrefix = 'dataset.metadata.createMetadata'
+
+export type Props = {
+  onClose?: () => void
+  onSave: (data: any) => void
+  hasBack?: boolean
+  onBack?: () => void
+}
+
+const CreateContent: FC<Props> = ({
+  onClose = noop,
+  hasBack,
+  onBack,
+  onSave,
+}) => {
+  const { t } = useTranslation()
+  const [type, setType] = useState(DataType.string)
+
+  const handleTypeChange = useCallback((newType: DataType) => {
+    return () => setType(newType)
+  }, [setType])
+  const [name, setName] = useState('')
+  const handleNameChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
+    setName(e.target.value)
+  }, [setName])
+
+  const handleSave = useCallback(() => {
+    onSave({
+      type,
+      name,
+    })
+  }, [onSave, type, name])
+
+  return (
+    <ModalLikeWrap
+      title={t(`${i18nPrefix}.title`)}
+      onClose={onClose}
+      onConfirm={handleSave}
+      hideCloseBtn={hasBack}
+      beforeHeader={hasBack && (
+        <div className='relative left-[-4px] mb-1 flex cursor-pointer items-center space-x-1 py-1 text-text-accent' onClick={onBack}>
+          <RiArrowLeftLine className='size-4' />
+          <div className='system-xs-semibold-uppercase'>{t(`${i18nPrefix}.back`)}</div>
+        </div>
+      )}
+    >
+      <div className='space-y-3'>
+        <Field label={t(`${i18nPrefix}.type`)}>
+          <div className='grid grid-cols-3 gap-2'>
+            <OptionCard
+              title='String'
+              selected={type === DataType.string}
+              onSelect={handleTypeChange(DataType.string)}
+            />
+            <OptionCard
+              title='Number'
+              selected={type === DataType.number}
+              onSelect={handleTypeChange(DataType.number)}
+            />
+            <OptionCard
+              title='Time'
+              selected={type === DataType.time}
+              onSelect={handleTypeChange(DataType.time)}
+            />
+          </div>
+        </Field>
+        <Field label={t(`${i18nPrefix}.name`)}>
+          <Input
+            value={name}
+            onChange={handleNameChange}
+            placeholder={t(`${i18nPrefix}.namePlaceholder`)}
+          />
+        </Field>
+      </div>
+    </ModalLikeWrap>
+  )
+}
+export default React.memo(CreateContent)
diff --git a/app/components/datasets/metadata/metadata-dataset/create-metadata-modal.tsx b/app/components/datasets/metadata/metadata-dataset/create-metadata-modal.tsx
new file mode 100644
index 0000000..6e00aa4
--- /dev/null
+++ b/app/components/datasets/metadata/metadata-dataset/create-metadata-modal.tsx
@@ -0,0 +1,45 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { Props as CreateContentProps } from './create-content'
+import CreateContent from './create-content'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '../../../base/portal-to-follow-elem'
+
+type Props = {
+  open: boolean
+  setOpen: (open: boolean) => void
+  onSave: (data: any) => void
+  trigger: React.ReactNode
+  popupLeft?: number
+} & CreateContentProps
+
+const CreateMetadataModal: FC<Props> = ({
+  open,
+  setOpen,
+  trigger,
+  popupLeft = 20,
+  ...createContentProps
+}) => {
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='left-start'
+      offset={{
+        mainAxis: popupLeft,
+        crossAxis: -38,
+      }}
+    >
+      <PortalToFollowElemTrigger
+        onClick={() => setOpen(!open)}
+      >
+        {trigger}
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[1000]'>
+        <CreateContent {...createContentProps} onClose={() => setOpen(false)} onBack={() => setOpen(false)} />
+      </PortalToFollowElemContent>
+    </PortalToFollowElem >
+
+  )
+}
+export default React.memo(CreateMetadataModal)
diff --git a/app/components/datasets/metadata/metadata-dataset/dataset-metadata-drawer.tsx b/app/components/datasets/metadata/metadata-dataset/dataset-metadata-drawer.tsx
new file mode 100644
index 0000000..b5e4d17
--- /dev/null
+++ b/app/components/datasets/metadata/metadata-dataset/dataset-metadata-drawer.tsx
@@ -0,0 +1,248 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useRef, useState } from 'react'
+import type { BuiltInMetadataItem, MetadataItemWithValueLength } from '../types'
+import Drawer from '@/app/components/base/drawer'
+import Button from '@/app/components/base/button'
+import { RiAddLine, RiDeleteBinLine, RiEditLine } from '@remixicon/react'
+import { getIcon } from '../utils/get-icon'
+import cn from '@/utils/classnames'
+import Modal from '@/app/components/base/modal'
+import Field from './field'
+import Input from '@/app/components/base/input'
+import { useTranslation } from 'react-i18next'
+import Switch from '@/app/components/base/switch'
+import Tooltip from '@/app/components/base/tooltip'
+import CreateModal from '@/app/components/datasets/metadata/metadata-dataset/create-metadata-modal'
+import { useBoolean, useHover } from 'ahooks'
+import Confirm from '@/app/components/base/confirm'
+import Toast from '@/app/components/base/toast'
+
+const i18nPrefix = 'dataset.metadata.datasetMetadata'
+
+type Props = {
+  userMetadata: MetadataItemWithValueLength[]
+  builtInMetadata: BuiltInMetadataItem[]
+  isBuiltInEnabled: boolean
+  onIsBuiltInEnabledChange: (value: boolean) => void
+  onClose: () => void
+  onAdd: (payload: BuiltInMetadataItem) => void
+  onRename: (payload: MetadataItemWithValueLength) => void
+  onRemove: (metaDataId: string) => void
+}
+
+type ItemProps = {
+  readonly?: boolean
+  disabled?: boolean
+  payload: MetadataItemWithValueLength
+  onRename?: () => void
+  onDelete?: () => void
+}
+const Item: FC<ItemProps> = ({
+  readonly,
+  disabled,
+  payload,
+  onRename,
+  onDelete,
+}) => {
+  const { t } = useTranslation()
+  const Icon = getIcon(payload.type)
+
+  const handleRename = useCallback(() => {
+    onRename?.()
+  }, [onRename])
+
+  const deleteBtnRef = useRef<HTMLDivElement>(null)
+  const isDeleteHovering = useHover(deleteBtnRef)
+  const [isShowDeleteConfirm, {
+    setTrue: showDeleteConfirm,
+    setFalse: hideDeleteConfirm,
+  }] = useBoolean(false)
+  const handleDelete = useCallback(() => {
+    hideDeleteConfirm()
+    onDelete?.()
+  }, [hideDeleteConfirm, onDelete])
+
+  return (
+    <div
+      key={payload.name}
+      className={cn(
+        !readonly && !disabled && 'group/item cursor-pointer hover:shadow-xs',
+        'rounded-md border border-components-panel-border-subtle bg-components-panel-on-panel-item-bg',
+        isDeleteHovering && 'border border-state-destructive-border bg-state-destructive-hover',
+      )}
+    >
+      <div
+        className={cn(
+          'flex h-8 items-center justify-between  px-2',
+          disabled && 'opacity-30', // not include border and bg
+        )}
+      >
+        <div className='flex h-full items-center space-x-1 text-text-tertiary'>
+          <Icon className='size-4 shrink-0' />
+          <div className='system-sm-medium max-w-[250px] truncate text-text-primary'>{payload.name}</div>
+          <div className='system-xs-regular shrink-0'>{payload.type}</div>
+        </div>
+        {(!readonly || disabled) && (
+          <div className='system-xs-regular ml-2 shrink-0 text-text-tertiary group-hover/item:hidden'>
+            {disabled ? t(`${i18nPrefix}.disabled`) : t(`${i18nPrefix}.values`, { num: payload.count || 0 })}
+          </div>
+        )}
+        <div className='ml-2 hidden items-center space-x-1 text-text-tertiary group-hover/item:flex'>
+          <RiEditLine className='size-4 cursor-pointer' onClick={handleRename} />
+          <div ref={deleteBtnRef} className='hover:text-text-destructive'>
+            <RiDeleteBinLine className='size-4 cursor-pointer' onClick={showDeleteConfirm} />
+          </div>
+        </div>
+        {isShowDeleteConfirm && (
+          <Confirm
+            isShow
+            type='warning'
+            title={t('dataset.metadata.datasetMetadata.deleteTitle')}
+            content={t('dataset.metadata.datasetMetadata.deleteContent', { name: payload.name })}
+            onConfirm={handleDelete}
+            onCancel={hideDeleteConfirm}
+          />
+        )}
+      </div>
+    </div>
+  )
+}
+
+const DatasetMetadataDrawer: FC<Props> = ({
+  userMetadata,
+  builtInMetadata,
+  isBuiltInEnabled,
+  onIsBuiltInEnabledChange,
+  onClose,
+  onAdd,
+  onRename,
+  onRemove,
+}) => {
+  const { t } = useTranslation()
+  const [isShowRenameModal, setIsShowRenameModal] = useState(false)
+  const [currPayload, setCurrPayload] = useState<MetadataItemWithValueLength | null>(null)
+  const [templeName, setTempleName] = useState('')
+  const handleRename = useCallback((payload: MetadataItemWithValueLength) => {
+    return () => {
+      setCurrPayload(payload)
+      setTempleName(payload.name)
+      setIsShowRenameModal(true)
+    }
+  }, [setCurrPayload, setIsShowRenameModal])
+
+  const [open, setOpen] = useState(false)
+  const handleAdd = useCallback(async (data: MetadataItemWithValueLength) => {
+    await onAdd(data)
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+    setOpen(false)
+  }, [onAdd, t])
+
+  const handleRenamed = useCallback(async () => {
+    const item = userMetadata.find(p => p.id === currPayload?.id)
+    if (item) {
+      await onRename({
+        ...item,
+        name: templeName,
+      })
+      Toast.notify({
+        type: 'success',
+        message: t('common.api.actionSuccess'),
+      })
+    }
+    setIsShowRenameModal(false)
+  }, [userMetadata, currPayload?.id, onRename, templeName, t])
+
+  const handleDelete = useCallback((payload: MetadataItemWithValueLength) => {
+    return async () => {
+      await onRemove(payload.id)
+      Toast.notify({
+        type: 'success',
+        message: t('common.api.actionSuccess'),
+      })
+    }
+  }, [onRemove, t])
+
+  return (
+    <Drawer
+      isOpen={true}
+      onClose={onClose}
+      showClose
+      title={t('dataset.metadata.metadata')}
+      footer={null}
+      panelClassName='px-4 block !max-w-[420px] my-2 rounded-l-2xl'
+    >
+      <div className='h-full overflow-y-auto'>
+        <div className='system-sm-regular text-text-tertiary'>{t(`${i18nPrefix}.description`)}</div>
+        <CreateModal
+          open={open}
+          setOpen={setOpen}
+          trigger={<Button variant='primary' className='mt-3'>
+            <RiAddLine className='mr-1' />
+            {t(`${i18nPrefix}.addMetaData`)}
+          </Button>} hasBack onSave={handleAdd}
+        />
+
+        <div className='mt-3 space-y-1'>
+          {userMetadata.map(payload => (
+            <Item
+              key={payload.id}
+              payload={payload}
+              onRename={handleRename(payload)}
+              onDelete={handleDelete(payload)}
+            />
+          ))}
+        </div>
+
+        <div className='mt-3 flex h-6 items-center'>
+          <Switch
+            defaultValue={isBuiltInEnabled}
+            onChange={onIsBuiltInEnabledChange}
+          />
+          <div className='system-sm-semibold ml-2 mr-0.5 text-text-secondary'>{t(`${i18nPrefix}.builtIn`)}</div>
+          <Tooltip popupContent={<div className='max-w-[100px]'>{t(`${i18nPrefix}.builtInDescription`)}</div>} />
+        </div>
+
+        <div className='mt-1 space-y-1'>
+          {builtInMetadata.map(payload => (
+            <Item
+              key={payload.name}
+              readonly
+              disabled={!isBuiltInEnabled}
+              payload={payload as MetadataItemWithValueLength}
+            />
+          ))}
+        </div>
+
+        {isShowRenameModal && (
+          <Modal isShow title={t(`${i18nPrefix}.rename`)} onClose={() => setIsShowRenameModal(false)}>
+            <Field label={t(`${i18nPrefix}.name`)} className='mt-4'>
+              <Input
+                value={templeName}
+                onChange={e => setTempleName(e.target.value)}
+                placeholder={t(`${i18nPrefix}.namePlaceholder`)}
+              />
+            </Field>
+            <div className='mt-4 flex justify-end'>
+              <Button
+                className='mr-2'
+                onClick={() => {
+                  setIsShowRenameModal(false)
+                  setTempleName(currPayload!.name)
+                }}>{t('common.operation.cancel')}</Button>
+              <Button
+                onClick={handleRenamed}
+                variant='primary'
+                disabled={!templeName}
+              >{t('common.operation.save')}</Button>
+            </div>
+          </Modal>
+        )}
+      </div>
+    </Drawer>
+  )
+}
+export default React.memo(DatasetMetadataDrawer)
diff --git a/app/components/datasets/metadata/metadata-dataset/field.tsx b/app/components/datasets/metadata/metadata-dataset/field.tsx
new file mode 100644
index 0000000..d7f0e47
--- /dev/null
+++ b/app/components/datasets/metadata/metadata-dataset/field.tsx
@@ -0,0 +1,23 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+
+type Props = {
+  className?: string
+  label: string
+  children: React.ReactNode
+}
+
+const Field: FC<Props> = ({
+  className,
+  label,
+  children,
+}) => {
+  return (
+    <div className={className}>
+      <div className='system-sm-semibold py-1 text-text-secondary'>{label}</div>
+      <div className='mt-1'>{children}</div>
+    </div>
+  )
+}
+export default React.memo(Field)
diff --git a/app/components/datasets/metadata/metadata-dataset/select-metadata-modal.tsx b/app/components/datasets/metadata/metadata-dataset/select-metadata-modal.tsx
new file mode 100644
index 0000000..91c9715
--- /dev/null
+++ b/app/components/datasets/metadata/metadata-dataset/select-metadata-modal.tsx
@@ -0,0 +1,82 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import type { Props as CreateContentProps } from './create-content'
+import CreateContent from './create-content'
+import SelectMetadata from './select-metadata'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '../../../base/portal-to-follow-elem'
+import type { MetadataItem } from '../types'
+import type { Placement } from '@floating-ui/react'
+import { useDatasetMetaData } from '@/service/knowledge/use-metadata'
+
+type Props = {
+  datasetId: string
+  popupPlacement?: Placement
+  popupOffset?: { mainAxis: number, crossAxis: number }
+  onSelect: (data: MetadataItem) => void
+  onSave: (data: MetadataItem) => void
+  trigger: React.ReactNode
+  onManage: () => void
+} & CreateContentProps
+
+enum Step {
+  select = 'select',
+  create = 'create',
+}
+
+const SelectMetadataModal: FC<Props> = ({
+  datasetId,
+  popupPlacement = 'left-start',
+  popupOffset = { mainAxis: -38, crossAxis: 4 },
+  trigger,
+  onSelect,
+  onSave,
+  onManage,
+}) => {
+  const { data: datasetMetaData } = useDatasetMetaData(datasetId)
+
+  const [open, setOpen] = useState(false)
+  const [step, setStep] = useState(Step.select)
+
+  const handleSave = useCallback(async (data: MetadataItem) => {
+    await onSave(data)
+    setStep(Step.select)
+  }, [onSave])
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement={popupPlacement}
+      offset={popupOffset}
+    >
+      <PortalToFollowElemTrigger
+        onClick={() => setOpen(!open)}
+        className='block'
+      >
+        {trigger}
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[1000]'>
+        {step === Step.select ? (
+          <SelectMetadata
+            onSelect={(data) => {
+              onSelect(data)
+              setOpen(false)
+            }}
+            list={datasetMetaData?.doc_metadata || []}
+            onNew={() => setStep(Step.create)}
+            onManage={onManage}
+          />
+        ) : (
+          <CreateContent
+            onSave={handleSave}
+            hasBack
+            onBack={() => setStep(Step.select)}
+            onClose={() => setStep(Step.select)}
+          />
+        )}
+      </PortalToFollowElemContent>
+    </PortalToFollowElem >
+
+  )
+}
+export default React.memo(SelectMetadataModal)
diff --git a/app/components/datasets/metadata/metadata-dataset/select-metadata.tsx b/app/components/datasets/metadata/metadata-dataset/select-metadata.tsx
new file mode 100644
index 0000000..d3580cf
--- /dev/null
+++ b/app/components/datasets/metadata/metadata-dataset/select-metadata.tsx
@@ -0,0 +1,82 @@
+'use client'
+import type { FC } from 'react'
+import React, { useMemo, useState } from 'react'
+import type { MetadataItem } from '../types'
+import SearchInput from '@/app/components/base/search-input'
+import { RiAddLine, RiArrowRightUpLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { getIcon } from '../utils/get-icon'
+
+const i18nPrefix = 'dataset.metadata.selectMetadata'
+
+type Props = {
+  list: MetadataItem[]
+  onSelect: (data: MetadataItem) => void
+  onNew: () => void
+  onManage: () => void
+}
+
+const SelectMetadata: FC<Props> = ({
+  list: notFilteredList,
+  onSelect,
+  onNew,
+  onManage,
+}) => {
+  const { t } = useTranslation()
+
+  const [query, setQuery] = useState('')
+  const list = useMemo(() => {
+    if (!query) return notFilteredList
+    return notFilteredList.filter((item) => {
+      return item.name.toLowerCase().includes(query.toLowerCase())
+    })
+  }, [query, notFilteredList])
+  return (
+    <div className='w-[320px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur pb-0 pt-2 shadow-lg backdrop-blur-[5px]'>
+      <SearchInput
+        className='mx-2'
+        value={query}
+        onChange={setQuery}
+        placeholder={t(`${i18nPrefix}.search`)}
+      />
+      <div className='mt-2'>
+        {list.map((item) => {
+          const Icon = getIcon(item.type)
+          return (
+            <div
+              key={item.id}
+              className='mx-1 flex h-6 cursor-pointer  items-center justify-between rounded-md px-3 hover:bg-state-base-hover'
+              onClick={() => onSelect({
+                id: item.id,
+                name: item.name,
+                type: item.type,
+              })}
+            >
+              <div className='flex h-full w-0 grow items-center text-text-secondary'>
+                <Icon className='mr-[5px] size-3.5 shrink-0' />
+                <div className='system-sm-medium w-0 grow truncate'>{item.name}</div>
+              </div>
+              <div className='system-xs-regular ml-1 shrink-0 text-text-tertiary'>
+                {item.type}
+              </div>
+            </div>
+          )
+        })}
+      </div>
+      <div className='mt-1 flex justify-between border-t border-divider-subtle p-1'>
+        <div className='flex h-6 cursor-pointer items-center space-x-1 rounded-md px-3 text-text-secondary hover:bg-state-base-hover' onClick={onNew}>
+          <RiAddLine className='size-3.5' />
+          <div className='system-sm-medium'>{t(`${i18nPrefix}.newAction`)}</div>
+        </div>
+        <div className='flex h-6 items-center text-text-secondary '>
+          <div className='mr-[3px] h-3 w-px bg-divider-regular'></div>
+          <div className='flex h-full cursor-pointer items-center rounded-md px-1.5 hover:bg-state-base-hover' onClick={onManage}>
+            <div className='system-sm-medium mr-1'>{t(`${i18nPrefix}.manageAction`)}</div>
+            <RiArrowRightUpLine className='size-3.5' />
+          </div>
+        </div>
+      </div>
+    </div>
+  )
+}
+export default React.memo(SelectMetadata)
diff --git a/app/components/datasets/metadata/metadata-document/field.tsx b/app/components/datasets/metadata/metadata-document/field.tsx
new file mode 100644
index 0000000..1ef1d7c
--- /dev/null
+++ b/app/components/datasets/metadata/metadata-document/field.tsx
@@ -0,0 +1,26 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+
+type Props = {
+  label: string
+  children: React.ReactNode
+}
+
+const Field: FC<Props> = ({
+  label,
+  children,
+}) => {
+  return (
+    <div className='flex items-start space-x-2'>
+      <div className='system-xs-medium w-[128px] shrink-0 items-center truncate py-1 text-text-tertiary'>
+        {label}
+      </div>
+      <div className='w-[244px] shrink-0'>
+        {children}
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Field)
diff --git a/app/components/datasets/metadata/metadata-document/index.tsx b/app/components/datasets/metadata/metadata-document/index.tsx
new file mode 100644
index 0000000..bf82e27
--- /dev/null
+++ b/app/components/datasets/metadata/metadata-document/index.tsx
@@ -0,0 +1,120 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import InfoGroup from './info-group'
+import NoData from './no-data'
+import Button from '@/app/components/base/button'
+import { RiEditLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import Divider from '@/app/components/base/divider'
+import useMetadataDocument from '../hooks/use-metadata-document'
+import type { FullDocumentDetail } from '@/models/datasets'
+import cn from '@/utils/classnames'
+
+const i18nPrefix = 'dataset.metadata.documentMetadata'
+
+type Props = {
+  datasetId: string
+  documentId: string
+  className?: string
+  docDetail: FullDocumentDetail
+}
+const MetadataDocument: FC<Props> = ({
+  datasetId,
+  documentId,
+  className,
+  docDetail,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    embeddingAvailable,
+    isEdit,
+    setIsEdit,
+    list,
+    tempList,
+    setTempList,
+    handleSelectMetaData,
+    handleAddMetaData,
+    hasData,
+    builtList,
+    builtInEnabled,
+    startToEdit,
+    handleSave,
+    handleCancel,
+    originInfo,
+    technicalParameters,
+  } = useMetadataDocument({ datasetId, documentId, docDetail })
+
+  return (
+    <div className={cn('w-[388px] space-y-4', className)}>
+      {(hasData || isEdit) ? (
+        <div className='pl-2'>
+          <InfoGroup
+            title={t('dataset.metadata.metadata')}
+            uppercaseTitle={false}
+            titleTooltip={t(`${i18nPrefix}.metadataToolTip`)}
+            list={isEdit ? tempList : list}
+            dataSetId={datasetId}
+            headerRight={embeddingAvailable && (isEdit ? (
+              <div className='flex space-x-1'>
+                <Button variant='ghost' size='small' onClick={handleCancel}>
+                  <div>{t('common.operation.cancel')}</div>
+                </Button>
+                <Button variant='primary' size='small' onClick={handleSave}>
+                  <div>{t('common.operation.save')}</div>
+                </Button>
+              </div>
+            ) : (
+              <Button variant='ghost' size='small' onClick={startToEdit}>
+                <RiEditLine className='mr-1 size-3.5 cursor-pointer text-text-tertiary' />
+                <div>{t('common.operation.edit')}</div>
+              </Button>
+            ))}
+            isEdit={isEdit}
+            contentClassName='mt-5'
+            onChange={(item) => {
+              const newList = tempList.map(i => (i.name === item.name ? item : i))
+              setTempList(newList)
+            }}
+            onDelete={(item) => {
+              const newList = tempList.filter(i => i.name !== item.name)
+              setTempList(newList)
+            }}
+            onAdd={handleAddMetaData}
+            onSelect={handleSelectMetaData}
+          />
+        </div>
+      ) : (
+        embeddingAvailable && <NoData onStart={() => setIsEdit(true)} />
+      )}
+      {builtInEnabled && (
+        <div className='pl-2'>
+          <Divider className='my-3' bgStyle='gradient' />
+          <InfoGroup
+            noHeader
+            titleTooltip='Built-in metadata is system-generated metadata that is automatically added to the document. You can enable or disable built-in metadata here.'
+            list={builtList}
+            dataSetId={datasetId}
+          />
+        </div>
+      )}
+
+      {/* Old Metadata */}
+      <InfoGroup
+        className='pl-2'
+        title={t(`${i18nPrefix}.documentInformation`)}
+        list={originInfo}
+        dataSetId={datasetId}
+      />
+      <InfoGroup
+        className='pl-2'
+        title={t(`${i18nPrefix}.technicalParameters`)}
+        list={technicalParameters}
+        dataSetId={datasetId}
+      />
+    </div>
+  )
+}
+
+export default React.memo(MetadataDocument)
diff --git a/app/components/datasets/metadata/metadata-document/info-group.tsx b/app/components/datasets/metadata/metadata-document/info-group.tsx
new file mode 100644
index 0000000..9078c43
--- /dev/null
+++ b/app/components/datasets/metadata/metadata-document/info-group.tsx
@@ -0,0 +1,111 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useRouter } from 'next/navigation'
+import { DataType, type MetadataItemWithValue, isShowManageMetadataLocalStorageKey } from '../types'
+import Field from './field'
+import InputCombined from '../edit-metadata-batch/input-combined'
+import { RiDeleteBinLine, RiQuestionLine } from '@remixicon/react'
+import Tooltip from '@/app/components/base/tooltip'
+import cn from '@/utils/classnames'
+import Divider from '@/app/components/base/divider'
+import SelectMetadataModal from '../metadata-dataset/select-metadata-modal'
+import AddMetadataButton from '../add-metadata-button'
+import useTimestamp from '@/hooks/use-timestamp'
+import { useTranslation } from 'react-i18next'
+
+type Props = {
+  dataSetId: string
+  className?: string
+  noHeader?: boolean
+  title?: string
+  uppercaseTitle?: boolean
+  titleTooltip?: string
+  headerRight?: React.ReactNode
+  contentClassName?: string
+  list: MetadataItemWithValue[]
+  isEdit?: boolean
+  onChange?: (item: MetadataItemWithValue) => void
+  onDelete?: (item: MetadataItemWithValue) => void
+  onSelect?: (item: MetadataItemWithValue) => void
+  onAdd?: (item: MetadataItemWithValue) => void
+}
+
+const InfoGroup: FC<Props> = ({
+  dataSetId,
+  className,
+  noHeader,
+  title,
+  uppercaseTitle = true,
+  titleTooltip,
+  headerRight,
+  contentClassName,
+  list,
+  isEdit,
+  onChange,
+  onDelete,
+  onSelect,
+  onAdd,
+}) => {
+  const router = useRouter()
+  const { t } = useTranslation()
+  const { formatTime: formatTimestamp } = useTimestamp()
+
+  const handleMangeMetadata = () => {
+    localStorage.setItem(isShowManageMetadataLocalStorageKey, 'true')
+    router.push(`/datasets/${dataSetId}/documents`)
+  }
+
+  return (
+    <div className={cn(className)}>
+      {!noHeader && (
+        <div className='flex items-center justify-between'>
+          <div className='flex items-center space-x-1'>
+            <div className={cn('text-text-secondary', uppercaseTitle ? 'system-xs-semibold-uppercase' : 'system-md-semibold')}>{title}</div>
+            {titleTooltip && (
+              <Tooltip popupContent={<div className='max-w-[240px]'>{titleTooltip}</div>}>
+                <div><RiQuestionLine className='size-3.5 text-text-tertiary' /></div>
+              </Tooltip>
+            )}
+          </div>
+          {headerRight}
+        </div>
+      )}
+
+      <div className={cn('mt-3 space-y-1', contentClassName)}>
+        {isEdit && (
+          <div>
+            <SelectMetadataModal
+              datasetId={dataSetId}
+              trigger={
+                <AddMetadataButton />
+              }
+              onSelect={data => onSelect?.(data as MetadataItemWithValue)}
+              onSave={data => onAdd?.(data)}
+              onManage={handleMangeMetadata}
+            />
+            {list.length > 0 && <Divider className='my-3 ' bgStyle='gradient' />}
+          </div>
+        )}
+        {list.map((item, i) => (
+          <Field key={(item.id && item.id !== 'built-in') ? item.id : `${i}`} label={item.name}>
+            {isEdit ? (
+              <div className='flex items-center space-x-0.5'>
+                <InputCombined
+                  className='h-6'
+                  type={item.type}
+                  value={item.value}
+                  onChange={value => onChange?.({ ...item, value })}
+                />
+                <div className='shrink-0 cursor-pointer rounded-md p-1  text-text-tertiary hover:bg-state-destructive-hover hover:text-text-destructive'>
+                  <RiDeleteBinLine className='size-4' onClick={() => onDelete?.(item)} />
+                </div>
+              </div>
+            ) : (<div className='system-xs-regular py-1 text-text-secondary'>{(item.value && item.type === DataType.time) ? formatTimestamp((item.value as number), t('datasetDocuments.metadata.dateTimeFormat')) : item.value}</div>)}
+          </Field>
+        ))}
+      </div>
+    </div>
+  )
+}
+export default React.memo(InfoGroup)
diff --git a/app/components/datasets/metadata/metadata-document/no-data.tsx b/app/components/datasets/metadata/metadata-document/no-data.tsx
new file mode 100644
index 0000000..624abf3
--- /dev/null
+++ b/app/components/datasets/metadata/metadata-document/no-data.tsx
@@ -0,0 +1,27 @@
+'use client'
+import Button from '@/app/components/base/button'
+import { RiArrowRightLine } from '@remixicon/react'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+
+type Props = {
+  onStart: () => void
+}
+
+const NoData: FC<Props> = ({
+  onStart,
+}) => {
+  const { t } = useTranslation()
+  return (
+    <div className='rounded-xl bg-gradient-to-r from-workflow-workflow-progress-bg-1 to-workflow-workflow-progress-bg-2 p-4 pt-3'>
+      <div className='text-xs font-semibold leading-5 text-text-secondary'>{t('dataset.metadata.metadata')}</div>
+      <div className='system-xs-regular mt-1 text-text-tertiary'>{t('dataset.metadata.documentMetadata.metadataToolTip')}</div>
+      <Button variant='primary' className='mt-2' onClick={onStart}>
+        <div>{t('dataset.metadata.documentMetadata.startLabeling')}</div>
+        <RiArrowRightLine className='ml-1 size-4' />
+      </Button>
+    </div>
+  )
+}
+export default React.memo(NoData)
diff --git a/app/components/datasets/metadata/types.ts b/app/components/datasets/metadata/types.ts
new file mode 100644
index 0000000..00688e2
--- /dev/null
+++ b/app/components/datasets/metadata/types.ts
@@ -0,0 +1,41 @@
+export enum DataType {
+  string = 'string',
+  number = 'number',
+  time = 'time',
+}
+
+export type BuiltInMetadataItem = {
+  type: DataType
+  name: string
+}
+
+export type MetadataItem = BuiltInMetadataItem & {
+  id: string
+}
+
+export type MetadataItemWithValue = MetadataItem & {
+  value: string | number | null
+}
+
+export type MetadataItemWithValueLength = MetadataItem & {
+  count: number
+}
+
+export type MetadataItemInBatchEdit = MetadataItemWithValue & {
+  isMultipleValue?: boolean
+}
+
+export type MetadataBatchEditToServer = { document_id: string, metadata_list: MetadataItemWithValue[] }[]
+
+export enum UpdateType {
+  changeValue = 'changeValue',
+  delete = 'delete',
+}
+
+export type MetadataItemWithEdit = MetadataItemWithValue & {
+  isMultipleValue?: boolean
+  isUpdated?: boolean
+  updateType?: UpdateType
+}
+
+export const isShowManageMetadataLocalStorageKey = 'dify-isShowManageMetadata'
diff --git a/app/components/datasets/metadata/utils/get-icon.ts b/app/components/datasets/metadata/utils/get-icon.ts
new file mode 100644
index 0000000..69b9bb1
--- /dev/null
+++ b/app/components/datasets/metadata/utils/get-icon.ts
@@ -0,0 +1,10 @@
+import { DataType } from '../types'
+import { RiHashtag, RiTextSnippet, RiTimeLine } from '@remixicon/react'
+
+export const getIcon = (type: DataType) => {
+  return ({
+    [DataType.string]: RiTextSnippet,
+    [DataType.number]: RiHashtag,
+    [DataType.time]: RiTimeLine,
+  }[type] || RiTextSnippet)
+}
diff --git a/app/components/datasets/preview/container.tsx b/app/components/datasets/preview/container.tsx
new file mode 100644
index 0000000..f6c1f7d
--- /dev/null
+++ b/app/components/datasets/preview/container.tsx
@@ -0,0 +1,29 @@
+import type { ComponentProps, FC, ReactNode } from 'react'
+import { forwardRef } from 'react'
+import classNames from '@/utils/classnames'
+
+export type PreviewContainerProps = ComponentProps<'div'> & {
+  header: ReactNode
+  mainClassName?: string
+}
+
+export const PreviewContainer: FC<PreviewContainerProps> = forwardRef((props, ref) => {
+  const { children, className, header, mainClassName, ...rest } = props
+  return <div className={className}>
+    <div
+      {...rest}
+      ref={ref}
+      className={classNames(
+        'flex flex-col w-full h-full overflow-y-auto rounded-l-xl border-t-[0.5px] border-l-[0.5px] border-components-panel-border bg-background-default-lighter shadow shadow-shadow-shadow-5',
+      )}
+    >
+      <header className='border-b border-divider-subtle pb-3 pl-5 pr-4 pt-4'>
+        {header}
+      </header>
+      <main className={classNames('py-5 px-6 w-full h-full', mainClassName)}>
+        {children}
+      </main>
+    </div>
+  </div>
+})
+PreviewContainer.displayName = 'PreviewContainer'
diff --git a/app/components/datasets/preview/header.tsx b/app/components/datasets/preview/header.tsx
new file mode 100644
index 0000000..eb3cd46
--- /dev/null
+++ b/app/components/datasets/preview/header.tsx
@@ -0,0 +1,23 @@
+import type { ComponentProps, FC } from 'react'
+import classNames from '@/utils/classnames'
+
+export type PreviewHeaderProps = Omit<ComponentProps<'div'>, 'title'> & {
+  title: string
+}
+
+export const PreviewHeader: FC<PreviewHeaderProps> = (props) => {
+  const { title, className, children, ...rest } = props
+  return <div
+    {...rest}
+    className={classNames(
+      className,
+    )}
+  >
+    <div
+      className='system-2xs-semibold-uppercase mb-1 px-1 uppercase text-text-accent'
+    >
+      {title}
+    </div>
+    {children}
+  </div>
+}
diff --git a/app/components/datasets/preview/index.tsx b/app/components/datasets/preview/index.tsx
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/components/datasets/preview/index.tsx
diff --git a/app/components/datasets/rename-modal/index.tsx b/app/components/datasets/rename-modal/index.tsx
new file mode 100644
index 0000000..dd53baf
--- /dev/null
+++ b/app/components/datasets/rename-modal/index.tsx
@@ -0,0 +1,110 @@
+'use client'
+
+import type { MouseEventHandler } from 'react'
+import { useState } from 'react'
+import { RiCloseLine } from '@remixicon/react'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import Modal from '@/app/components/base/modal'
+import { ToastContext } from '@/app/components/base/toast'
+import type { DataSet } from '@/models/datasets'
+import { updateDatasetSetting } from '@/service/datasets'
+import { noop } from 'lodash-es'
+
+type RenameDatasetModalProps = {
+  show: boolean
+  dataset: DataSet
+  onSuccess?: () => void
+  onClose: () => void
+}
+
+const RenameDatasetModal = ({ show, dataset, onSuccess, onClose }: RenameDatasetModalProps) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const [loading, setLoading] = useState(false)
+  const [name, setName] = useState<string>(dataset.name)
+  const [description, setDescription] = useState<string>(dataset.description)
+  const [externalKnowledgeId, setExternalKnowledgeId] = useState<string>(dataset.external_knowledge_info.external_knowledge_id)
+  const [externalKnowledgeApiId, setExternalKnowledgeApiId] = useState<string>(dataset.external_knowledge_info.external_knowledge_api_id)
+
+  const onConfirm: MouseEventHandler = async () => {
+    if (!name.trim()) {
+      notify({ type: 'error', message: t('datasetSettings.form.nameError') })
+      return
+    }
+    try {
+      setLoading(true)
+      const body: Partial<DataSet> & { external_knowledge_id?: string; external_knowledge_api_id?: string } = {
+        name,
+        description,
+      }
+      if (externalKnowledgeId && externalKnowledgeApiId) {
+        body.external_knowledge_id = externalKnowledgeId
+        body.external_knowledge_api_id = externalKnowledgeApiId
+      }
+      await updateDatasetSetting({
+        datasetId: dataset.id,
+        body,
+      })
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      if (onSuccess)
+        onSuccess()
+      onClose()
+    }
+    catch {
+      notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+    }
+    finally {
+      setLoading(false)
+    }
+  }
+
+  return (
+    <Modal
+      className='w-[520px] max-w-[520px] rounded-xl px-8 py-6'
+      isShow={show}
+      onClose={noop}
+    >
+      <div className='relative pb-2 text-xl font-medium leading-[30px] text-text-primary'>{t('datasetSettings.title')}</div>
+      <div className='absolute right-4 top-4 cursor-pointer p-2' onClick={onClose}>
+        <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+      </div>
+      <div>
+        <div className={cn('flex flex-wrap items-center justify-between py-4')}>
+          <div className='shrink-0 py-2 text-sm font-medium leading-[20px] text-text-primary'>
+            {t('datasetSettings.form.name')}
+          </div>
+          <Input
+            value={name}
+            onChange={e => setName(e.target.value)}
+            className='h-9'
+            placeholder={t('datasetSettings.form.namePlaceholder') || ''}
+          />
+        </div>
+        <div className={cn('flex flex-wrap items-center justify-between py-4')}>
+          <div className='shrink-0 py-2 text-sm font-medium leading-[20px] text-text-primary'>
+            {t('datasetSettings.form.desc')}
+          </div>
+          <div className='w-full'>
+            <Textarea
+              value={description}
+              onChange={e => setDescription(e.target.value)}
+              className='resize-none'
+              placeholder={t('datasetSettings.form.descPlaceholder') || ''}
+            />
+          </div>
+        </div>
+      </div>
+      <div className='flex justify-end pt-6'>
+        <Button className='mr-2' onClick={onClose}>{t('common.operation.cancel')}</Button>
+        <Button disabled={loading} variant="primary" onClick={onConfirm}>{t('common.operation.save')}</Button>
+      </div>
+    </Modal>
+  )
+}
+
+export default RenameDatasetModal
diff --git a/app/components/datasets/settings/form/index.tsx b/app/components/datasets/settings/form/index.tsx
new file mode 100644
index 0000000..c36c16c
--- /dev/null
+++ b/app/components/datasets/settings/form/index.tsx
@@ -0,0 +1,354 @@
+'use client'
+import { useState } from 'react'
+import { useMount } from 'ahooks'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import { useSWRConfig } from 'swr'
+import { unstable_serialize } from 'swr/infinite'
+import PermissionSelector from '../permission-selector'
+import IndexMethodRadio from '../index-method-radio'
+import RetrievalSettings from '../../external-knowledge-base/create/RetrievalSettings'
+import { IndexingType } from '../../create/step-two'
+import RetrievalMethodConfig from '@/app/components/datasets/common/retrieval-method-config'
+import EconomicalRetrievalMethodConfig from '@/app/components/datasets/common/economical-retrieval-method-config'
+import { ToastContext } from '@/app/components/base/toast'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import { ApiConnectionMod } from '@/app/components/base/icons/src/vender/solid/development'
+import { updateDatasetSetting } from '@/service/datasets'
+import { type DataSetListResponse, DatasetPermission } from '@/models/datasets'
+import DatasetDetailContext from '@/context/dataset-detail'
+import type { RetrievalConfig } from '@/types/app'
+import { useAppContext } from '@/context/app-context'
+import { isReRankModelSelected } from '@/app/components/datasets/common/check-rerank-model'
+import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
+import {
+  useModelList,
+  useModelListAndDefaultModelAndCurrentProviderAndModel,
+} from '@/app/components/header/account-setting/model-provider-page/hooks'
+import type { DefaultModel } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { fetchMembers } from '@/service/common'
+import type { Member } from '@/models/common'
+import AlertTriangle from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback/AlertTriangle'
+
+const rowClass = 'flex'
+const labelClass = `
+  flex items-center shrink-0 w-[180px] h-9
+`
+
+const getKey = (pageIndex: number, previousPageData: DataSetListResponse) => {
+  if (!pageIndex || previousPageData.has_more)
+    return { url: 'datasets', params: { page: pageIndex + 1, limit: 30 } }
+  return null
+}
+
+const Form = () => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const { mutate } = useSWRConfig()
+  const { isCurrentWorkspaceDatasetOperator } = useAppContext()
+  const { dataset: currentDataset, mutateDatasetRes: mutateDatasets } = useContext(DatasetDetailContext)
+  const [loading, setLoading] = useState(false)
+  const [name, setName] = useState(currentDataset?.name ?? '')
+  const [description, setDescription] = useState(currentDataset?.description ?? '')
+  const [permission, setPermission] = useState(currentDataset?.permission)
+  const [topK, setTopK] = useState(currentDataset?.external_retrieval_model.top_k ?? 2)
+  const [scoreThreshold, setScoreThreshold] = useState(currentDataset?.external_retrieval_model.score_threshold ?? 0.5)
+  const [scoreThresholdEnabled, setScoreThresholdEnabled] = useState(currentDataset?.external_retrieval_model.score_threshold_enabled ?? false)
+  const [selectedMemberIDs, setSelectedMemberIDs] = useState<string[]>(currentDataset?.partial_member_list || [])
+  const [memberList, setMemberList] = useState<Member[]>([])
+  const [indexMethod, setIndexMethod] = useState(currentDataset?.indexing_technique)
+  const [retrievalConfig, setRetrievalConfig] = useState(currentDataset?.retrieval_model_dict as RetrievalConfig)
+  const [embeddingModel, setEmbeddingModel] = useState<DefaultModel>(
+    currentDataset?.embedding_model
+      ? {
+        provider: currentDataset.embedding_model_provider,
+        model: currentDataset.embedding_model,
+      }
+      : {
+        provider: '',
+        model: '',
+      },
+  )
+  const {
+    modelList: rerankModelList,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
+  const { data: embeddingModelList } = useModelList(ModelTypeEnum.textEmbedding)
+
+  const getMembers = async () => {
+    const { accounts } = await fetchMembers({ url: '/workspaces/current/members', params: {} })
+    if (!accounts)
+      setMemberList([])
+    else
+      setMemberList(accounts)
+  }
+
+  const handleSettingsChange = (data: { top_k?: number; score_threshold?: number; score_threshold_enabled?: boolean }) => {
+    if (data.top_k !== undefined)
+      setTopK(data.top_k)
+    if (data.score_threshold !== undefined)
+      setScoreThreshold(data.score_threshold)
+    if (data.score_threshold_enabled !== undefined)
+      setScoreThresholdEnabled(data.score_threshold_enabled)
+  }
+
+  useMount(() => {
+    getMembers()
+  })
+
+  const handleSave = async () => {
+    if (loading)
+      return
+    if (!name?.trim()) {
+      notify({ type: 'error', message: t('datasetSettings.form.nameError') })
+      return
+    }
+    if (
+      !isReRankModelSelected({
+        rerankModelList,
+        retrievalConfig,
+        indexMethod,
+      })
+    ) {
+      notify({ type: 'error', message: t('appDebug.datasetConfig.rerankModelRequired') })
+      return
+    }
+    if (retrievalConfig.weights) {
+      retrievalConfig.weights.vector_setting.embedding_provider_name = currentDataset?.embedding_model_provider || ''
+      retrievalConfig.weights.vector_setting.embedding_model_name = currentDataset?.embedding_model || ''
+    }
+    try {
+      setLoading(true)
+      const requestParams = {
+        datasetId: currentDataset!.id,
+        body: {
+          name,
+          description,
+          permission,
+          indexing_technique: indexMethod,
+          retrieval_model: {
+            ...retrievalConfig,
+            score_threshold: retrievalConfig.score_threshold_enabled ? retrievalConfig.score_threshold : 0,
+          },
+          embedding_model: embeddingModel.model,
+          embedding_model_provider: embeddingModel.provider,
+          ...(currentDataset!.provider === 'external' && {
+            external_knowledge_id: currentDataset!.external_knowledge_info.external_knowledge_id,
+            external_knowledge_api_id: currentDataset!.external_knowledge_info.external_knowledge_api_id,
+            external_retrieval_model: {
+              top_k: topK,
+              score_threshold: scoreThreshold,
+              score_threshold_enabled: scoreThresholdEnabled,
+            },
+          }),
+        },
+      } as any
+      if (permission === DatasetPermission.partialMembers) {
+        requestParams.body.partial_member_list = selectedMemberIDs.map((id) => {
+          return {
+            user_id: id,
+            role: memberList.find(member => member.id === id)?.role,
+          }
+        })
+      }
+      await updateDatasetSetting(requestParams)
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      if (mutateDatasets) {
+        await mutateDatasets()
+        mutate(unstable_serialize(getKey))
+      }
+    }
+    catch {
+      notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+    }
+    finally {
+      setLoading(false)
+    }
+  }
+
+  return (
+    <div className='flex w-full flex-col gap-y-4 px-14 py-8 sm:w-[880px]'>
+      <div className={rowClass}>
+        <div className={labelClass}>
+          <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.name')}</div>
+        </div>
+        <div className='grow'>
+          <Input
+            disabled={!currentDataset?.embedding_available}
+            className='h-9'
+            value={name}
+            onChange={e => setName(e.target.value)}
+          />
+        </div>
+      </div>
+      <div className={rowClass}>
+        <div className={labelClass}>
+          <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.desc')}</div>
+        </div>
+        <div className='grow'>
+          <Textarea
+            disabled={!currentDataset?.embedding_available}
+            className='h-[120px] resize-none'
+            placeholder={t('datasetSettings.form.descPlaceholder') || ''}
+            value={description}
+            onChange={e => setDescription(e.target.value)}
+          />
+        </div>
+      </div>
+      <div className={rowClass}>
+        <div className={labelClass}>
+          <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.permissions')}</div>
+        </div>
+        <div className='grow'>
+          <PermissionSelector
+            disabled={!currentDataset?.embedding_available || isCurrentWorkspaceDatasetOperator}
+            permission={permission}
+            value={selectedMemberIDs}
+            onChange={v => setPermission(v)}
+            onMemberSelect={setSelectedMemberIDs}
+            memberList={memberList}
+          />
+        </div>
+      </div>
+      {currentDataset && currentDataset.indexing_technique && (
+        <>
+          <div className='my-1 h-0 w-full border-b border-divider-subtle' />
+          <div className={rowClass}>
+            <div className={labelClass}>
+              <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.indexMethod')}</div>
+            </div>
+            <div className='grow'>
+              <IndexMethodRadio
+                disable={!currentDataset?.embedding_available}
+                value={indexMethod}
+                onChange={v => setIndexMethod(v!)}
+                docForm={currentDataset.doc_form}
+                currentValue={currentDataset.indexing_technique}
+              />
+              {currentDataset.indexing_technique === IndexingType.ECONOMICAL && indexMethod === IndexingType.QUALIFIED && <div className='mt-2 flex h-10 items-center gap-x-0.5 overflow-hidden rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-2 shadow-xs backdrop-blur-[5px]'>
+                <div className='absolute bottom-0 left-0 right-0 top-0 bg-[linear-gradient(92deg,rgba(247,144,9,0.25)_0%,rgba(255,255,255,0.00)_100%)] opacity-40'></div>
+                <div className='p-1'>
+                  <AlertTriangle className='size-4 text-text-warning-secondary' />
+                </div>
+                <span className='system-xs-medium'>{t('datasetSettings.form.upgradeHighQualityTip')}</span>
+              </div>}
+            </div>
+          </div>
+        </>
+      )}
+      {indexMethod === 'high_quality' && (
+        <>
+          <div className={rowClass}>
+            <div className={labelClass}>
+              <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.embeddingModel')}</div>
+            </div>
+            <div className='grow'>
+              <ModelSelector
+                triggerClassName=''
+                defaultModel={embeddingModel}
+                modelList={embeddingModelList}
+                onSelect={(model: DefaultModel) => {
+                  setEmbeddingModel(model)
+                }}
+              />
+            </div>
+          </div>
+        </>
+      )}
+      {/* Retrieval Method Config */}
+      {currentDataset?.provider === 'external'
+        ? <>
+          <div className='my-1 h-0 w-full border-b border-divider-subtle' />
+          <div className={rowClass}>
+            <div className={labelClass}>
+              <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.retrievalSetting.title')}</div>
+            </div>
+            <RetrievalSettings
+              topK={topK}
+              scoreThreshold={scoreThreshold}
+              scoreThresholdEnabled={scoreThresholdEnabled}
+              onChange={handleSettingsChange}
+              isInRetrievalSetting={true}
+            />
+          </div>
+          <div className='my-1 h-0 w-full border-b border-divider-subtle' />
+          <div className={rowClass}>
+            <div className={labelClass}>
+              <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.externalKnowledgeAPI')}</div>
+            </div>
+            <div className='w-full'>
+              <div className='flex h-full items-center gap-1 rounded-lg bg-components-input-bg-normal px-3 py-2'>
+                <ApiConnectionMod className='h-4 w-4 text-text-secondary' />
+                <div className='system-sm-medium overflow-hidden text-ellipsis text-text-secondary'>
+                  {currentDataset?.external_knowledge_info.external_knowledge_api_name}
+                </div>
+                <div className='system-xs-regular text-text-tertiary'>路</div>
+                <div className='system-xs-regular text-text-tertiary'>{currentDataset?.external_knowledge_info.external_knowledge_api_endpoint}</div>
+              </div>
+            </div>
+          </div>
+          <div className={rowClass}>
+            <div className={labelClass}>
+              <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.externalKnowledgeID')}</div>
+            </div>
+            <div className='w-full'>
+              <div className='flex h-full items-center gap-1 rounded-lg bg-components-input-bg-normal px-3 py-2'>
+                <div className='system-xs-regular text-text-tertiary'>{currentDataset?.external_knowledge_info.external_knowledge_id}</div>
+              </div>
+            </div>
+          </div>
+        </>
+        : indexMethod
+          ? <>
+            <div className='my-1 h-0 w-full border-b border-divider-subtle' />
+            <div className={rowClass}>
+              <div className={labelClass}>
+                <div>
+                  <div className='system-sm-semibold text-text-secondary'>{t('datasetSettings.form.retrievalSetting.title')}</div>
+                  <div className='body-xs-regular text-text-tertiary'>
+                    <a target='_blank' rel='noopener noreferrer' href='https://docs.dify.ai/guides/knowledge-base/create-knowledge-and-upload-documents#id-4-retrieval-settings' className='text-text-accent'>{t('datasetSettings.form.retrievalSetting.learnMore')}</a>
+                    {t('datasetSettings.form.retrievalSetting.description')}
+                  </div>
+                </div>
+              </div>
+              <div className='grow'>
+                {indexMethod === IndexingType.QUALIFIED
+                  ? (
+                    <RetrievalMethodConfig
+                      value={retrievalConfig}
+                      onChange={setRetrievalConfig}
+                    />
+                  )
+                  : (
+                    <EconomicalRetrievalMethodConfig
+                      value={retrievalConfig}
+                      onChange={setRetrievalConfig}
+                    />
+                  )}
+              </div>
+            </div>
+          </>
+          : null
+      }
+      <div className='my-1 h-0 w-full border-b border-divider-subtle' />
+      <div className={rowClass}>
+        <div className={labelClass} />
+        <div className='grow'>
+          <Button
+            className='min-w-24'
+            variant='primary'
+            loading={loading}
+            disabled={loading}
+            onClick={handleSave}
+          >
+            {t('datasetSettings.form.save')}
+          </Button>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default Form
diff --git a/app/components/datasets/settings/index-method-radio/assets/economy.svg b/app/components/datasets/settings/index-method-radio/assets/economy.svg
new file mode 100644
index 0000000..6b135bf
--- /dev/null
+++ b/app/components/datasets/settings/index-method-radio/assets/economy.svg
@@ -0,0 +1,5 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="8" fill="#EEF4FF"/>
+<path d="M11.6665 9.99998C12.9552 9.99998 13.9998 8.95531 13.9998 7.66665C13.9998 6.37798 12.9552 5.33331 11.6665 5.33331C10.3778 5.33331 9.33317 6.37798 9.33317 7.66665C9.33317 8.95531 10.3778 9.99998 11.6665 9.99998Z" fill="#444CE7"/>
+<path d="M8.65017 9.75198C8.49106 9.52227 8.4115 9.40741 8.32581 9.36947C8.24888 9.33541 8.1679 9.33124 8.08788 9.35723C7.99875 9.38618 7.92865 9.46797 7.78845 9.63154C7.22585 10.2879 6.84213 11.1027 6.71374 12.0001H6.6665C6.29831 12.0001 5.99984 11.7016 5.99984 11.3334C5.99984 11.0875 6.13265 10.8718 6.33365 10.7555C6.65236 10.5712 6.76127 10.1634 6.57691 9.84466C6.39255 9.52595 5.98473 9.41704 5.66602 9.60141C5.06996 9.94621 4.6665 10.5923 4.6665 11.3334C4.6665 12.438 5.56193 13.3334 6.6665 13.3334H6.71377C6.85773 14.3389 7.32239 15.2415 7.9998 15.9328L7.99979 17.4822C7.99976 17.5616 7.99973 17.6565 8.00655 17.74C8.01446 17.8368 8.03476 17.9755 8.10879 18.1208C8.20466 18.309 8.35764 18.4619 8.54581 18.5578C8.6911 18.6318 8.82976 18.6521 8.92658 18.6601C9.0101 18.6669 9.10492 18.6668 9.18432 18.6668H10.4819C10.5613 18.6668 10.6562 18.6669 10.7397 18.6601C10.8365 18.6521 10.9752 18.6318 11.1205 18.5578C11.3086 18.4619 11.4616 18.309 11.5575 18.1208C11.6315 17.9755 11.6518 17.8368 11.6597 17.74C11.6665 17.6565 11.6665 17.5616 11.6665 17.4822L11.6665 17.3335H12.3331L12.3331 17.482C12.3331 17.5614 12.3331 17.6562 12.3399 17.7398C12.3478 17.8366 12.3681 17.9753 12.4421 18.1205C12.538 18.3087 12.691 18.4617 12.8791 18.5576C13.0244 18.6316 13.1631 18.6519 13.2599 18.6598C13.3434 18.6666 13.4382 18.6666 13.5176 18.6666H14.8153C14.8947 18.6666 14.9896 18.6666 15.0731 18.6598C15.1699 18.6519 15.3085 18.6316 15.4538 18.5576C15.642 18.4617 15.795 18.3087 15.8909 18.1205C15.9649 17.9753 15.9852 17.8366 15.9931 17.7398C15.9999 17.6562 15.9999 17.5614 15.9999 17.482L15.9999 16.884C16.7373 16.5337 17.3676 15.9963 17.83 15.3332L18.1486 15.3332C18.228 15.3333 18.3229 15.3333 18.4064 15.3265C18.5032 15.3186 18.6419 15.2983 18.7872 15.2242C18.9753 15.1284 19.1283 14.9754 19.2242 14.7872C19.2982 14.6419 19.3185 14.5033 19.3264 14.4064C19.3333 14.3229 19.3332 14.2281 19.3332 14.1487V11.8424C19.3332 11.7668 19.3332 11.6765 19.327 11.5968C19.3199 11.5047 19.3015 11.3725 19.2341 11.2326C19.1358 11.0286 18.9712 10.8639 18.7671 10.7656C18.6272 10.6982 18.4951 10.6799 18.403 10.6727C18.3435 10.6681 18.2781 10.6669 18.2173 10.6666C17.9935 10.1955 17.6934 9.76819 17.3332 9.40057L17.3332 8.68818C17.3332 8.58496 17.3333 8.46813 17.3243 8.36763C17.3144 8.25667 17.2886 8.08512 17.1832 7.91509C17.0519 7.70309 16.846 7.54783 16.6061 7.47976C16.4137 7.42517 16.2416 7.44747 16.1322 7.46844C16.0331 7.48743 15.9208 7.51956 15.8216 7.54795L15.7177 7.57763C15.581 7.61667 15.5127 7.6362 15.4646 7.67139C15.4182 7.70536 15.3899 7.73885 15.364 7.7902C15.3371 7.84338 15.3279 7.92449 15.3094 8.08672C15.101 9.91393 13.5495 11.3333 11.6665 11.3333C10.4162 11.3333 9.31201 10.7075 8.65017 9.75198Z" fill="#444CE7"/>
+</svg>
diff --git a/app/components/datasets/settings/index-method-radio/assets/high-quality.svg b/app/components/datasets/settings/index-method-radio/assets/high-quality.svg
new file mode 100644
index 0000000..dcb9aa2
--- /dev/null
+++ b/app/components/datasets/settings/index-method-radio/assets/high-quality.svg
@@ -0,0 +1,12 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="8" fill="#FFF6ED"/>
+<path d="M11.9998 4.66669C12.368 4.66669 12.6665 4.96516 12.6665 5.33335V6.66669C12.6665 7.03488 12.368 7.33335 11.9998 7.33335C11.6316 7.33335 11.3332 7.03488 11.3332 6.66669V5.33335C11.3332 4.96516 11.6316 4.66669 11.9998 4.66669Z" fill="#FB6514"/>
+<path d="M7.75705 6.81459C7.4967 6.55424 7.07459 6.55424 6.81424 6.81459C6.55389 7.07494 6.55389 7.49705 6.81424 7.75739L7.75705 8.7002C8.0174 8.96055 8.43951 8.96055 8.69986 8.7002C8.96021 8.43985 8.96021 8.01774 8.69986 7.75739L7.75705 6.81459Z" fill="#FB6514"/>
+<path d="M4.6665 12C4.6665 11.6318 4.96498 11.3334 5.33317 11.3334H6.6665C7.03469 11.3334 7.33317 11.6318 7.33317 12C7.33317 12.3682 7.03469 12.6667 6.6665 12.6667H5.33317C4.96498 12.6667 4.6665 12.3682 4.6665 12Z" fill="#FB6514"/>
+<path d="M17.3332 11.3334C16.965 11.3334 16.6665 11.6318 16.6665 12C16.6665 12.3682 16.965 12.6667 17.3332 12.6667H18.6665C19.0347 12.6667 19.3332 12.3682 19.3332 12C19.3332 11.6318 19.0347 11.3334 18.6665 11.3334H17.3332Z" fill="#FB6514"/>
+<path d="M16.2424 15.2998C15.982 15.0394 15.5599 15.0394 15.2996 15.2998C15.0392 15.5601 15.0392 15.9822 15.2996 16.2426L16.2424 17.1854C16.5027 17.4457 16.9249 17.4457 17.1852 17.1854C17.4456 16.925 17.4456 16.5029 17.1852 16.2426L16.2424 15.2998Z" fill="#FB6514"/>
+<path d="M17.1852 7.75739C17.4456 7.49705 17.4456 7.07494 17.1852 6.81459C16.9249 6.55424 16.5027 6.55424 16.2424 6.81459L15.2996 7.75739C15.0392 8.01774 15.0392 8.43985 15.2996 8.7002C15.5599 8.96055 15.982 8.96055 16.2424 8.7002L17.1852 7.75739Z" fill="#FB6514"/>
+<path d="M11.9998 16.6667C12.368 16.6667 12.6665 16.9652 12.6665 17.3334V18.6667C12.6665 19.0349 12.368 19.3334 11.9998 19.3334C11.6316 19.3334 11.3332 19.0349 11.3332 18.6667V17.3334C11.3332 16.9652 11.6316 16.6667 11.9998 16.6667Z" fill="#FB6514"/>
+<path d="M8.69986 16.2426C8.96021 15.9822 8.96021 15.5601 8.69986 15.2998C8.43951 15.0394 8.0174 15.0394 7.75705 15.2998L6.81424 16.2426C6.55389 16.5029 6.55389 16.925 6.81424 17.1854C7.07459 17.4457 7.4967 17.4457 7.75705 17.1854L8.69986 16.2426Z" fill="#FB6514"/>
+<path d="M12.5977 8.3716C12.4853 8.14407 12.2536 8.00002 11.9999 8.00002C11.7461 8.00002 11.5144 8.14407 11.4021 8.3716L10.527 10.1443L8.5701 10.4304C8.31906 10.4671 8.11061 10.6431 8.03236 10.8844C7.95411 11.1257 8.01962 11.3906 8.20137 11.5676L9.61684 12.9463L9.28278 14.894C9.23988 15.1441 9.34271 15.3969 9.54803 15.5461C9.75335 15.6952 10.0255 15.7149 10.2502 15.5967L11.9999 14.6766L13.7496 15.5967C13.9742 15.7149 14.2464 15.6952 14.4517 15.5461C14.657 15.3969 14.7598 15.1441 14.7169 14.894L14.3829 12.9463L15.7983 11.5676C15.9801 11.3906 16.0456 11.1257 15.9674 10.8844C15.8891 10.6431 15.6806 10.4671 15.4296 10.4304L13.4727 10.1443L12.5977 8.3716Z" fill="#FB6514"/>
+</svg>
diff --git a/app/components/datasets/settings/index-method-radio/index.tsx b/app/components/datasets/settings/index-method-radio/index.tsx
new file mode 100644
index 0000000..f0d2b32
--- /dev/null
+++ b/app/components/datasets/settings/index-method-radio/index.tsx
@@ -0,0 +1,106 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import Image from 'next/image'
+import { useRef } from 'react'
+import { useHover } from 'ahooks'
+import { IndexingType } from '../../create/step-two'
+import { OptionCard } from '../../create/step-two/option-card'
+import { indexMethodIcon } from '../../create/icons'
+import classNames from '@/utils/classnames'
+import type { DataSet } from '@/models/datasets'
+import { ChunkingMode } from '@/models/datasets'
+import Badge from '@/app/components/base/badge'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+
+type IIndexMethodRadioProps = {
+  value?: DataSet['indexing_technique']
+  onChange: (v?: DataSet['indexing_technique']) => void
+  disable?: boolean
+  docForm?: ChunkingMode
+  currentValue?: DataSet['indexing_technique']
+}
+
+const IndexMethodRadio = ({
+  value,
+  onChange,
+  disable,
+  docForm,
+  currentValue,
+}: IIndexMethodRadioProps) => {
+  const { t } = useTranslation()
+  const economyDomRef = useRef<HTMLDivElement>(null)
+  const isHoveringEconomy = useHover(economyDomRef)
+  const isEconomyDisabled = currentValue === IndexingType.QUALIFIED
+  const options = [
+    {
+      key: 'high_quality',
+      text: <div className='flex items-center'>
+        {t('datasetCreation.stepTwo.qualified')}
+        <Badge uppercase className='ml-auto border-text-accent-secondary text-text-accent-secondary'>
+          {t('datasetCreation.stepTwo.recommend')}
+        </Badge>
+      </div>,
+      desc: t('datasetSettings.form.indexMethodHighQualityTip'),
+    },
+    {
+      key: 'economy',
+      text: t('datasetSettings.form.indexMethodEconomy'),
+      desc: t('datasetSettings.form.indexMethodEconomyTip'),
+    },
+  ]
+
+  return (
+    <div className={classNames('flex justify-between w-full gap-2')}>
+      {
+        options.map((option) => {
+          const isParentChild = docForm === ChunkingMode.parentChild
+          return (
+            <PortalToFollowElem
+              key={option.key}
+              open={
+                isHoveringEconomy && option.key === 'economy'
+              }
+              placement={'top'}
+            >
+              <PortalToFollowElemTrigger>
+                <OptionCard
+                  disabled={
+                    disable
+                    || (isEconomyDisabled && option.key === IndexingType.ECONOMICAL)
+                  }
+                  isActive={option.key === value}
+                  onSwitched={() => {
+                    if (isParentChild && option.key === IndexingType.ECONOMICAL)
+                      return
+                    if (isEconomyDisabled && option.key === IndexingType.ECONOMICAL)
+                      return
+                    if (!disable)
+                      onChange(option.key as DataSet['indexing_technique'])
+                  } }
+                  icon={
+                    <Image
+                      src={option.key === 'high_quality' ? indexMethodIcon.high_quality : indexMethodIcon.economical}
+                      alt={option.desc}
+                    />
+                  }
+                  title={option.text}
+                  description={option.desc}
+                  ref={option.key === 'economy' ? economyDomRef : undefined}
+                  className={classNames((isEconomyDisabled && option.key === 'economy') && 'cursor-not-allowed')}
+                >
+                </OptionCard>
+              </PortalToFollowElemTrigger>
+              <PortalToFollowElemContent style={{ zIndex: 60 }}>
+                <div className='rounded-lg border-components-panel-border bg-components-tooltip-bg p-3 text-xs font-medium text-text-secondary shadow-lg'>
+                  {t('datasetSettings.form.indexMethodChangeToEconomyDisabledTip')}
+                </div>
+              </PortalToFollowElemContent>
+            </PortalToFollowElem>
+          )
+        })
+      }
+    </div>
+  )
+}
+
+export default IndexMethodRadio
diff --git a/app/components/datasets/settings/permission-selector/index.tsx b/app/components/datasets/settings/permission-selector/index.tsx
new file mode 100644
index 0000000..9bb6f81
--- /dev/null
+++ b/app/components/datasets/settings/permission-selector/index.tsx
@@ -0,0 +1,195 @@
+import { useTranslation } from 'react-i18next'
+import cn from 'classnames'
+import React, { useMemo, useState } from 'react'
+import { useDebounceFn } from 'ahooks'
+import { RiArrowDownSLine } from '@remixicon/react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Avatar from '@/app/components/base/avatar'
+import Input from '@/app/components/base/input'
+import { Check } from '@/app/components/base/icons/src/vender/line/general'
+import { Users01, UsersPlus } from '@/app/components/base/icons/src/vender/solid/users'
+import { DatasetPermission } from '@/models/datasets'
+import { useAppContext } from '@/context/app-context'
+import type { Member } from '@/models/common'
+export type RoleSelectorProps = {
+  disabled?: boolean
+  permission?: DatasetPermission
+  value: string[]
+  memberList: Member[]
+  onChange: (permission?: DatasetPermission) => void
+  onMemberSelect: (v: string[]) => void
+}
+
+const PermissionSelector = ({ disabled, permission, value, memberList, onChange, onMemberSelect }: RoleSelectorProps) => {
+  const { t } = useTranslation()
+  const { userProfile } = useAppContext()
+  const [open, setOpen] = useState(false)
+
+  const [keywords, setKeywords] = useState('')
+  const [searchKeywords, setSearchKeywords] = useState('')
+  const { run: handleSearch } = useDebounceFn(() => {
+    setSearchKeywords(keywords)
+  }, { wait: 500 })
+  const handleKeywordsChange = (value: string) => {
+    setKeywords(value)
+    handleSearch()
+  }
+  const selectMember = (member: Member) => {
+    if (value.includes(member.id))
+      onMemberSelect(value.filter(v => v !== member.id))
+    else
+      onMemberSelect([...value, member.id])
+  }
+
+  const selectedMembers = useMemo(() => {
+    return [
+      userProfile,
+      ...memberList.filter(member => member.id !== userProfile.id).filter(member => value.includes(member.id)),
+    ].map(member => member.name).join(', ')
+  }, [userProfile, value, memberList])
+
+  const showMe = useMemo(() => {
+    return userProfile.name.includes(searchKeywords) || userProfile.email.includes(searchKeywords)
+  }, [searchKeywords, userProfile])
+
+  const filteredMemberList = useMemo(() => {
+    return memberList.filter(member => (member.name.includes(searchKeywords) || member.email.includes(searchKeywords)) && member.id !== userProfile.id && ['owner', 'admin', 'editor', 'dataset_operator'].includes(member.role))
+  }, [memberList, searchKeywords, userProfile])
+
+  const isOnlyMe = permission === DatasetPermission.onlyMe
+  const isAllTeamMembers = permission === DatasetPermission.allTeamMembers
+  const isPartialMembers = permission === DatasetPermission.partialMembers
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <div className='relative'>
+        <PortalToFollowElemTrigger
+          onClick={() => !disabled && setOpen(v => !v)}
+          className='block'
+        >
+          <div className={cn('flex cursor-pointer items-center rounded-lg bg-components-input-bg-normal px-3 py-[6px] hover:bg-state-base-hover-alt',
+            open && 'bg-state-base-hover-alt',
+            disabled && '!cursor-not-allowed !bg-components-input-bg-disabled hover:!bg-components-input-bg-disabled',
+          )}>
+            {
+              isOnlyMe && (
+                <>
+                  <Avatar avatar={userProfile.avatar_url} name={userProfile.name} className='mr-2 shrink-0' size={24} />
+                  <div className='mr-2 grow text-sm leading-5 text-components-input-text-filled'>{t('datasetSettings.form.permissionsOnlyMe')}</div>
+                </>
+              )
+            }
+            {
+              isAllTeamMembers && (
+                <>
+                  <div className='mr-2 flex h-6 w-6 items-center justify-center rounded-lg bg-[#EEF4FF]'>
+                    <Users01 className='h-3.5 w-3.5 text-[#444CE7]' />
+                  </div>
+                  <div className='mr-2 grow text-sm leading-5 text-components-input-text-filled'>{t('datasetSettings.form.permissionsAllMember')}</div>
+                </>
+              )
+            }
+            {
+              isPartialMembers && (
+                <>
+                  <div className='mr-2 flex h-6 w-6 items-center justify-center rounded-lg bg-[#EEF4FF]'>
+                    <Users01 className='h-3.5 w-3.5 text-[#444CE7]' />
+                  </div>
+                  <div title={selectedMembers} className='mr-2 grow truncate text-sm leading-5 text-components-input-text-filled'>{selectedMembers}</div>
+                </>
+              )
+            }
+            <RiArrowDownSLine className={cn('h-4 w-4 shrink-0 text-text-secondary', disabled && '!text-components-input-text-placeholder')} />
+          </div>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[1002]'>
+          <div className='relative w-[480px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg backdrop-blur-sm'>
+            <div className='p-1'>
+              <div className='cursor-pointer rounded-lg py-1 pl-3 pr-2 hover:bg-state-base-hover' onClick={() => {
+                onChange(DatasetPermission.onlyMe)
+                setOpen(false)
+              }}>
+                <div className='flex items-center gap-2'>
+                  <Avatar avatar={userProfile.avatar_url} name={userProfile.name} className='mr-2 shrink-0' size={24} />
+                  <div className='mr-2 grow text-sm leading-5 text-text-primary'>{t('datasetSettings.form.permissionsOnlyMe')}</div>
+                  {isOnlyMe && <Check className='h-4 w-4 text-primary-600' />}
+                </div>
+              </div>
+              <div className='cursor-pointer rounded-lg py-1 pl-3 pr-2 hover:bg-state-base-hover' onClick={() => {
+                onChange(DatasetPermission.allTeamMembers)
+                setOpen(false)
+              }}>
+                <div className='flex items-center gap-2'>
+                  <div className='mr-2 flex h-6 w-6 items-center justify-center rounded-lg bg-[#EEF4FF]'>
+                    <Users01 className='h-3.5 w-3.5 text-[#444CE7]' />
+                  </div>
+                  <div className='mr-2 grow text-sm leading-5 text-text-primary'>{t('datasetSettings.form.permissionsAllMember')}</div>
+                  {isAllTeamMembers && <Check className='h-4 w-4 text-primary-600' />}
+                </div>
+              </div>
+              <div className='cursor-pointer rounded-lg py-1 pl-3 pr-2 hover:bg-state-base-hover' onClick={() => {
+                onChange(DatasetPermission.partialMembers)
+                onMemberSelect([userProfile.id])
+              }}>
+                <div className='flex items-center gap-2'>
+                  <div className={cn('mr-2 flex h-6 w-6 items-center justify-center rounded-lg bg-[#FFF6ED]', isPartialMembers && '!bg-[#EEF4FF]')}>
+                    <UsersPlus className={cn('h-3.5 w-3.5 text-[#FB6514]', isPartialMembers && '!text-[#444CE7]')} />
+                  </div>
+                  <div className='mr-2 grow text-sm leading-5 text-text-primary'>{t('datasetSettings.form.permissionsInvitedMembers')}</div>
+                  {isPartialMembers && <Check className='h-4 w-4 text-primary-600' />}
+                </div>
+              </div>
+            </div>
+            {isPartialMembers && (
+              <div className='max-h-[360px] overflow-y-auto border-t-[1px] border-divider-regular pb-1 pl-1 pr-1'>
+                <div className='sticky left-0 top-0 z-10 bg-white p-2 pb-1'>
+                  <Input
+                    showLeftIcon
+                    showClearIcon
+                    value={keywords}
+                    onChange={e => handleKeywordsChange(e.target.value)}
+                    onClear={() => handleKeywordsChange('')}
+                  />
+                </div>
+                {showMe && (
+                  <div className='flex items-center gap-2 rounded-lg py-1 pl-3 pr-[10px]'>
+                    <Avatar avatar={userProfile.avatar_url} name={userProfile.name} className='shrink-0' size={24} />
+                    <div className='grow'>
+                      <div className='truncate text-[13px] font-medium leading-[18px] text-text-secondary'>
+                        {userProfile.name}
+                        <span className='text-xs font-normal text-text-tertiary'>{t('datasetSettings.form.me')}</span>
+                      </div>
+                      <div className='truncate text-xs leading-[18px] text-text-tertiary'>{userProfile.email}</div>
+                    </div>
+                    <Check className='h-4 w-4 shrink-0 text-text-accent opacity-30' />
+                  </div>
+                )}
+                {filteredMemberList.map(member => (
+                  <div key={member.id} className='flex cursor-pointer items-center gap-2 rounded-lg py-1 pl-3 pr-[10px] hover:bg-state-base-hover' onClick={() => selectMember(member)}>
+                    <Avatar avatar={userProfile.avatar_url} name={member.name} className='shrink-0' size={24} />
+                    <div className='grow'>
+                      <div className='truncate text-[13px] font-medium leading-[18px] text-text-secondary'>{member.name}</div>
+                      <div className='truncate text-xs leading-[18px] text-text-tertiary'>{member.email}</div>
+                    </div>
+                    {value.includes(member.id) && <Check className='h-4 w-4 shrink-0 text-text-accent' />}
+                  </div>
+                ))}
+              </div>
+            )}
+          </div>
+        </PortalToFollowElemContent>
+      </div>
+    </PortalToFollowElem>
+  )
+}
+
+export default PermissionSelector
diff --git a/app/components/develop/ApiServer.tsx b/app/components/develop/ApiServer.tsx
new file mode 100644
index 0000000..9f2c9cf
--- /dev/null
+++ b/app/components/develop/ApiServer.tsx
@@ -0,0 +1,36 @@
+'use client'
+
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import CopyFeedback from '@/app/components/base/copy-feedback'
+import SecretKeyButton from '@/app/components/develop/secret-key/secret-key-button'
+
+type ApiServerProps = {
+  apiBaseUrl: string
+  appId?: string
+}
+const ApiServer: FC<ApiServerProps> = ({
+  apiBaseUrl,
+  appId,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex flex-wrap items-center gap-y-2'>
+      <div className='mr-2 flex h-8 items-center rounded-lg border-[0.5px] border-components-input-border-active bg-components-input-bg-normal pl-1.5 pr-1 leading-5'>
+        <div className='mr-0.5 h-5 shrink-0 rounded-md border border-divider-subtle px-1.5 text-[11px] text-text-tertiary'>{t('appApi.apiServer')}</div>
+        <div className='w-fit truncate px-1 text-[13px] font-medium text-text-secondary sm:w-[248px]'>{apiBaseUrl}</div>
+        <div className='mx-1 h-[14px] w-[1px] bg-divider-regular'></div>
+        <CopyFeedback content={apiBaseUrl}/>
+      </div>
+      <div className='mr-2 flex h-8 items-center rounded-lg border-[0.5px] border-[#D1FADF] bg-[#ECFDF3] px-3 text-xs font-semibold text-[#039855]'>
+        {t('appApi.ok')}
+      </div>
+      <SecretKeyButton
+        className='!h-8 shrink-0' appId={appId}
+      />
+    </div>
+  )
+}
+
+export default ApiServer
diff --git a/app/components/develop/code.tsx b/app/components/develop/code.tsx
new file mode 100644
index 0000000..d187d78
--- /dev/null
+++ b/app/components/develop/code.tsx
@@ -0,0 +1,305 @@
+'use client'
+import {
+  Children,
+  createContext,
+  useContext,
+  useEffect,
+  useRef,
+  useState,
+} from 'react'
+import { Tab, TabList, TabPanel, TabPanels } from '@headlessui/react'
+import { Tag } from './tag'
+import classNames from '@/utils/classnames'
+import { writeTextToClipboard } from '@/utils/clipboard'
+
+const languageNames = {
+  js: 'JavaScript',
+  ts: 'TypeScript',
+  javascript: 'JavaScript',
+  typescript: 'TypeScript',
+  php: 'PHP',
+  python: 'Python',
+  ruby: 'Ruby',
+  go: 'Go',
+} as { [key: string]: string }
+
+type IChildrenProps = {
+  children: React.ReactNode
+  [key: string]: any
+}
+
+function getPanelTitle({ className }: { className: string }) {
+  const language = className.split('-')[1]
+  return languageNames[language] ?? 'Code'
+}
+
+function ClipboardIcon(props: any) {
+  return (
+    <svg viewBox="0 0 20 20" aria-hidden="true" {...props}>
+      <path
+        strokeWidth="0"
+        d="M5.5 13.5v-5a2 2 0 0 1 2-2l.447-.894A2 2 0 0 1 9.737 4.5h.527a2 2 0 0 1 1.789 1.106l.447.894a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-5a2 2 0 0 1-2-2Z"
+      />
+      <path
+        fill="none"
+        strokeLinejoin="round"
+        d="M12.5 6.5a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-5a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2m5 0-.447-.894a2 2 0 0 0-1.79-1.106h-.527a2 2 0 0 0-1.789 1.106L7.5 6.5m5 0-1 1h-3l-1-1"
+      />
+    </svg>
+  )
+}
+
+function CopyButton({ code }: { code: string }) {
+  const [copyCount, setCopyCount] = useState(0)
+  const copied = copyCount > 0
+
+  useEffect(() => {
+    if (copyCount > 0) {
+      const timeout = setTimeout(() => setCopyCount(0), 1000)
+      return () => {
+        clearTimeout(timeout)
+      }
+    }
+  }, [copyCount])
+
+  return (
+    <button
+      type="button"
+      className={classNames(
+        'group/button absolute top-3.5 right-4 overflow-hidden rounded-full py-1 pl-2 pr-3 text-2xs font-medium opacity-0 backdrop-blur transition focus:opacity-100 group-hover:opacity-100',
+        copied
+          ? 'bg-emerald-400/10 ring-1 ring-inset ring-emerald-400/20'
+          : 'bg-white/5 hover:bg-white/7.5 dark:bg-white/2.5 dark:hover:bg-white/5',
+      )}
+      onClick={() => {
+        writeTextToClipboard(code).then(() => {
+          setCopyCount(count => count + 1)
+        })
+      }}
+    >
+      <span
+        aria-hidden={copied}
+        className={classNames(
+          'pointer-events-none flex items-center gap-0.5 text-zinc-400 transition duration-300',
+          copied && '-translate-y-1.5 opacity-0',
+        )}
+      >
+        <ClipboardIcon className="h-5 w-5 fill-zinc-500/20 stroke-zinc-500 transition-colors group-hover/button:stroke-zinc-400" />
+        Copy
+      </span>
+      <span
+        aria-hidden={!copied}
+        className={classNames(
+          'pointer-events-none absolute inset-0 flex items-center justify-center text-emerald-400 transition duration-300',
+          !copied && 'translate-y-1.5 opacity-0',
+        )}
+      >
+        Copied!
+      </span>
+    </button>
+  )
+}
+
+function CodePanelHeader({ tag, label }: { tag: string; label: string }) {
+  if (!tag && !label)
+    return null
+
+  return (
+    <div className="border-b-white/7.5 bg-white/2.5 dark:bg-white/1 flex h-9 items-center gap-2 border-y border-t-transparent bg-zinc-900 px-4 dark:border-b-white/5">
+      {tag && (
+        <div className="dark flex">
+          <Tag variant="small">{tag}</Tag>
+        </div>
+      )}
+      {tag && label && (
+        <span className="h-0.5 w-0.5 rounded-full bg-zinc-500" />
+      )}
+      {label && (
+        <span className="font-mono text-xs text-zinc-400">{label}</span>
+      )}
+    </div>
+  )
+}
+
+type ICodePanelProps = {
+  children: React.ReactNode
+  tag?: string
+  code?: string
+  label?: string
+  targetCode?: string
+}
+function CodePanel({ tag, label, code, children, targetCode }: ICodePanelProps) {
+  const child = Children.only(children)
+
+  return (
+    <div className="dark:bg-white/2.5 group">
+      <CodePanelHeader
+        tag={child.props.tag ?? tag}
+        label={child.props.label ?? label}
+      />
+      <div className="relative">
+        {/* <pre className="p-4 overflow-x-auto text-xs text-white">{children}</pre> */}
+        {/* <CopyButton code={child.props.code ?? code} /> */}
+        {/* <CopyButton code={child.props.children.props.children} /> */}
+        <pre className="overflow-x-auto p-4 text-xs text-white">{targetCode || children}</pre>
+        <CopyButton code={targetCode || child.props.children.props.children} />
+      </div>
+    </div>
+  )
+}
+
+function CodeGroupHeader({ title, children, selectedIndex }: IChildrenProps) {
+  const hasTabs = Children.count(children) > 1
+
+  if (!title && !hasTabs)
+    return null
+
+  return (
+    <div className="flex min-h-[calc(theme(spacing.12)+1px)] flex-wrap items-start gap-x-4 border-b border-zinc-700 bg-zinc-800 px-4 dark:border-zinc-800 dark:bg-transparent">
+      {title && (
+        <h3 className="mr-auto pt-3 text-xs font-semibold text-white">
+          {title}
+        </h3>
+      )}
+      {hasTabs && (
+        <TabList className="-mb-px flex gap-4 text-xs font-medium">
+          {Children.map(children, (child, childIndex) => (
+            <Tab
+              className={classNames(
+                'border-b py-3 transition focus:[&:not(:focus-visible)]:outline-none',
+                childIndex === selectedIndex
+                  ? 'border-emerald-500 text-emerald-400'
+                  : 'border-transparent text-zinc-400 hover:text-zinc-300',
+              )}
+            >
+              {getPanelTitle(child.props.children.props)}
+            </Tab>
+          ))}
+        </TabList>
+      )}
+    </div>
+  )
+}
+
+type ICodeGroupPanelsProps = {
+  children: React.ReactNode
+  [key: string]: any
+}
+function CodeGroupPanels({ children, targetCode, ...props }: ICodeGroupPanelsProps) {
+  const hasTabs = Children.count(children) > 1
+
+  if (hasTabs) {
+    return (
+      <TabPanels>
+        {Children.map(children, child => (
+          <TabPanel>
+            <CodePanel {...props}>{child}</CodePanel>
+          </TabPanel>
+        ))}
+      </TabPanels>
+    )
+  }
+
+  return <CodePanel {...props} targetCode={targetCode}>{children}</CodePanel>
+}
+
+function usePreventLayoutShift() {
+  const positionRef = useRef<any>()
+  const rafRef = useRef<any>()
+
+  useEffect(() => {
+    return () => {
+      window.cancelAnimationFrame(rafRef.current)
+    }
+  }, [])
+
+  return {
+    positionRef,
+    preventLayoutShift(callback: () => {}) {
+      const initialTop = positionRef.current.getBoundingClientRect().top
+
+      callback()
+
+      rafRef.current = window.requestAnimationFrame(() => {
+        const newTop = positionRef.current.getBoundingClientRect().top
+        window.scrollBy(0, newTop - initialTop)
+      })
+    },
+  }
+}
+
+function useTabGroupProps(availableLanguages: string[]) {
+  const [preferredLanguages, addPreferredLanguage] = useState<any>([])
+  const [selectedIndex, setSelectedIndex] = useState(0)
+  const activeLanguage = [...availableLanguages].sort(
+    (a, z) => preferredLanguages.indexOf(z) - preferredLanguages.indexOf(a),
+  )[0]
+  const languageIndex = availableLanguages.indexOf(activeLanguage)
+  const newSelectedIndex = languageIndex === -1 ? selectedIndex : languageIndex
+  if (newSelectedIndex !== selectedIndex)
+    setSelectedIndex(newSelectedIndex)
+
+  const { positionRef, preventLayoutShift } = usePreventLayoutShift()
+
+  return {
+    as: 'div',
+    ref: positionRef,
+    selectedIndex,
+    onChange: (newSelectedIndex: number) => {
+      preventLayoutShift(() =>
+        (addPreferredLanguage(availableLanguages[newSelectedIndex]) as any),
+      )
+    },
+  }
+}
+
+const CodeGroupContext = createContext(false)
+
+export function CodeGroup({ children, title, inputs, targetCode, ...props }: IChildrenProps) {
+  const languages = Children.map(children, child =>
+    getPanelTitle(child.props.children.props),
+  )
+  const tabGroupProps = useTabGroupProps(languages)
+  const hasTabs = Children.count(children) > 1
+  const Container = hasTabs ? Tab.Group : 'div'
+  const containerProps = hasTabs ? tabGroupProps : {}
+  const headerProps = hasTabs
+    ? { selectedIndex: tabGroupProps.selectedIndex }
+    : {}
+
+  return (
+    <CodeGroupContext.Provider value={true}>
+      <Container
+        {...containerProps}
+        className="not-prose my-6 overflow-hidden rounded-2xl bg-zinc-900 shadow-md dark:ring-1 dark:ring-white/10"
+      >
+        <CodeGroupHeader title={title} {...headerProps}>
+          {children}
+        </CodeGroupHeader>
+        <CodeGroupPanels {...props} targetCode={targetCode}>{children}</CodeGroupPanels>
+      </Container>
+    </CodeGroupContext.Provider>
+  )
+}
+
+type IChildProps = {
+  children: string
+  [key: string]: any
+}
+export function Code({ children, ...props }: IChildProps) {
+  const isGrouped = useContext(CodeGroupContext)
+
+  if (isGrouped)
+    return <code {...props} dangerouslySetInnerHTML={{ __html: children }} />
+
+  return <code {...props}>{children}</code>
+}
+
+export function Pre({ children, ...props }: IChildrenProps) {
+  const isGrouped = useContext(CodeGroupContext)
+
+  if (isGrouped)
+    return children
+
+  return <CodeGroup {...props}>{children}</CodeGroup>
+}
diff --git a/app/components/develop/doc.tsx b/app/components/develop/doc.tsx
new file mode 100644
index 0000000..c61cc09
--- /dev/null
+++ b/app/components/develop/doc.tsx
@@ -0,0 +1,178 @@
+'use client'
+import { useEffect, useState } from 'react'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import { RiListUnordered } from '@remixicon/react'
+import TemplateEn from './template/template.en.mdx'
+import TemplateZh from './template/template.zh.mdx'
+import TemplateJa from './template/template.ja.mdx'
+import TemplateAdvancedChatEn from './template/template_advanced_chat.en.mdx'
+import TemplateAdvancedChatZh from './template/template_advanced_chat.zh.mdx'
+import TemplateAdvancedChatJa from './template/template_advanced_chat.ja.mdx'
+import TemplateWorkflowEn from './template/template_workflow.en.mdx'
+import TemplateWorkflowZh from './template/template_workflow.zh.mdx'
+import TemplateWorkflowJa from './template/template_workflow.ja.mdx'
+import TemplateChatEn from './template/template_chat.en.mdx'
+import TemplateChatZh from './template/template_chat.zh.mdx'
+import TemplateChatJa from './template/template_chat.ja.mdx'
+import I18n from '@/context/i18n'
+import { LanguagesSupported } from '@/i18n/language'
+import useTheme from '@/hooks/use-theme'
+import { Theme } from '@/types/app'
+import cn from '@/utils/classnames'
+
+type IDocProps = {
+  appDetail: any
+}
+
+const Doc = ({ appDetail }: IDocProps) => {
+  const { locale } = useContext(I18n)
+  const { t } = useTranslation()
+  const [toc, setToc] = useState<Array<{ href: string; text: string }>>([])
+  const [isTocExpanded, setIsTocExpanded] = useState(false)
+  const { theme } = useTheme()
+
+  const variables = appDetail?.model_config?.configs?.prompt_variables || []
+  const inputs = variables.reduce((res: any, variable: any) => {
+    res[variable.key] = variable.name || ''
+    return res
+  }, {})
+
+  useEffect(() => {
+    const mediaQuery = window.matchMedia('(min-width: 1280px)')
+    setIsTocExpanded(mediaQuery.matches)
+  }, [])
+
+  useEffect(() => {
+    const extractTOC = () => {
+      const article = document.querySelector('article')
+      if (article) {
+        const headings = article.querySelectorAll('h2')
+        const tocItems = Array.from(headings).map((heading) => {
+          const anchor = heading.querySelector('a')
+          if (anchor) {
+            return {
+              href: anchor.getAttribute('href') || '',
+              text: anchor.textContent || '',
+            }
+          }
+          return null
+        }).filter((item): item is { href: string; text: string } => item !== null)
+        setToc(tocItems)
+      }
+    }
+
+    // Run after component has rendered
+    setTimeout(extractTOC, 0)
+  }, [appDetail, locale])
+
+  const handleTocClick = (e: React.MouseEvent<HTMLAnchorElement>, item: { href: string; text: string }) => {
+    e.preventDefault()
+    const targetId = item.href.replace('#', '')
+    const element = document.getElementById(targetId)
+    if (element) {
+      const scrollContainer = document.querySelector('.overflow-auto')
+      if (scrollContainer) {
+        const headerOffset = 80
+        const elementTop = element.offsetTop - headerOffset
+        scrollContainer.scrollTo({
+          top: elementTop,
+          behavior: 'smooth',
+        })
+      }
+    }
+  }
+  return (
+    <div className="flex">
+      <div className={`fixed right-8 top-32 z-10 transition-all ${isTocExpanded ? 'w-64' : 'w-10'}`}>
+        {isTocExpanded
+          ? (
+            <nav className="toc max-h-[calc(100vh-150px)] w-full overflow-y-auto rounded-lg bg-components-panel-bg p-4 shadow-md">
+              <div className="mb-4 flex items-center justify-between">
+                <h3 className="text-lg font-semibold text-text-primary">{t('appApi.develop.toc')}</h3>
+                <button
+                  onClick={() => setIsTocExpanded(false)}
+                  className="text-text-tertiary hover:text-text-secondary"
+                >
+                  鉁�
+                </button>
+              </div>
+              <ul className="space-y-2">
+                {toc.map((item, index) => (
+                  <li key={index}>
+                    <a
+                      href={item.href}
+                      className="text-text-secondary transition-colors duration-200 hover:text-text-primary hover:underline"
+                      onClick={e => handleTocClick(e, item)}
+                    >
+                      {item.text}
+                    </a>
+                  </li>
+                ))}
+              </ul>
+            </nav>
+          )
+          : (
+            <button
+              onClick={() => setIsTocExpanded(true)}
+              className="flex h-10 w-10 items-center justify-center rounded-full bg-components-button-secondary-bg shadow-md transition-colors duration-200 hover:bg-components-button-secondary-bg-hover"
+            >
+              <RiListUnordered className="h-6 w-6 text-components-button-secondary-text" />
+            </button>
+          )}
+      </div>
+      <article className={cn('prose-xl prose', theme === Theme.dark && 'prose-invert')} >
+        {(appDetail?.mode === 'chat' || appDetail?.mode === 'agent-chat') && (
+          (() => {
+            switch (locale) {
+              case LanguagesSupported[1]:
+                return <TemplateChatZh appDetail={appDetail} variables={variables} inputs={inputs} />
+              case LanguagesSupported[7]:
+                return <TemplateChatJa appDetail={appDetail} variables={variables} inputs={inputs} />
+              default:
+                return <TemplateChatEn appDetail={appDetail} variables={variables} inputs={inputs} />
+            }
+          })()
+        )}
+        {appDetail?.mode === 'advanced-chat' && (
+          (() => {
+            switch (locale) {
+              case LanguagesSupported[1]:
+                return <TemplateAdvancedChatZh appDetail={appDetail} variables={variables} inputs={inputs} />
+              case LanguagesSupported[7]:
+                return <TemplateAdvancedChatJa appDetail={appDetail} variables={variables} inputs={inputs} />
+              default:
+                return <TemplateAdvancedChatEn appDetail={appDetail} variables={variables} inputs={inputs} />
+            }
+          })()
+        )}
+        {appDetail?.mode === 'workflow' && (
+          (() => {
+            switch (locale) {
+              case LanguagesSupported[1]:
+                return <TemplateWorkflowZh appDetail={appDetail} variables={variables} inputs={inputs} />
+              case LanguagesSupported[7]:
+                return <TemplateWorkflowJa appDetail={appDetail} variables={variables} inputs={inputs} />
+              default:
+                return <TemplateWorkflowEn appDetail={appDetail} variables={variables} inputs={inputs} />
+            }
+          })()
+        )}
+        {appDetail?.mode === 'completion' && (
+          (() => {
+            switch (locale) {
+              case LanguagesSupported[1]:
+                return <TemplateZh appDetail={appDetail} variables={variables} inputs={inputs} />
+              case LanguagesSupported[7]:
+                return <TemplateJa appDetail={appDetail} variables={variables} inputs={inputs} />
+              default:
+                return <TemplateEn appDetail={appDetail} variables={variables} inputs={inputs} />
+            }
+          })()
+        )}
+      </article>
+    </div>
+  )
+}
+
+export default Doc
diff --git a/app/components/develop/index.tsx b/app/components/develop/index.tsx
new file mode 100644
index 0000000..c3f88a1
--- /dev/null
+++ b/app/components/develop/index.tsx
@@ -0,0 +1,35 @@
+'use client'
+import Doc from '@/app/components/develop/doc'
+import Loading from '@/app/components/base/loading'
+import ApiServer from '@/app/components/develop/ApiServer'
+import { useStore as useAppStore } from '@/app/components/app/store'
+
+type IDevelopMainProps = {
+  appId: string
+}
+
+const DevelopMain = ({ appId }: IDevelopMainProps) => {
+  const appDetail = useAppStore(state => state.appDetail)
+
+  if (!appDetail) {
+    return (
+      <div className='flex h-full items-center justify-center bg-background-default'>
+        <Loading />
+      </div>
+    )
+  }
+
+  return (
+    <div className='relative flex h-full flex-col overflow-hidden'>
+      <div className='flex shrink-0 items-center justify-between border-b border-solid border-b-divider-regular px-6 py-2'>
+        <div className='text-lg font-medium text-text-primary'></div>
+        <ApiServer apiBaseUrl={appDetail.api_base_url} appId={appId} />
+      </div>
+      <div className='grow overflow-auto px-4 py-4 sm:px-10'>
+        <Doc appDetail={appDetail} />
+      </div>
+    </div>
+  )
+}
+
+export default DevelopMain
diff --git a/app/components/develop/md.tsx b/app/components/develop/md.tsx
new file mode 100644
index 0000000..a9b74a3
--- /dev/null
+++ b/app/components/develop/md.tsx
@@ -0,0 +1,151 @@
+'use client'
+import type { PropsWithChildren } from 'react'
+import classNames from '@/utils/classnames'
+
+type IChildrenProps = {
+  children: React.ReactNode
+  id?: string
+  tag?: any
+  label?: any
+  anchor: boolean
+}
+
+type IHeaderingProps = {
+  url: string
+  method: 'PUT' | 'DELETE' | 'GET' | 'POST' | 'PATCH'
+  title: string
+  name: string
+}
+
+export const Heading = function H2({
+  url,
+  method,
+  title,
+  name,
+}: IHeaderingProps) {
+  let style = ''
+  switch (method) {
+    case 'PUT':
+      style = 'ring-amber-300 bg-amber-400/10 text-amber-500 dark:ring-amber-400/30 dark:bg-amber-400/10 dark:text-amber-400'
+      break
+    case 'DELETE':
+      style = 'ring-rose-200 bg-rose-50 text-red-500 dark:ring-rose-500/20 dark:bg-rose-400/10 dark:text-rose-400'
+      break
+    case 'POST':
+      style = 'ring-sky-300 bg-sky-400/10 text-sky-500 dark:ring-sky-400/30 dark:bg-sky-400/10 dark:text-sky-400'
+      break
+    case 'PATCH':
+      style = 'ring-violet-300 bg-violet-400/10 text-violet-500 dark:ring-violet-400/30 dark:bg-violet-400/10 dark:text-violet-400'
+      break
+    default:
+      style = 'ring-emerald-300 dark:ring-emerald-400/30 bg-emerald-400/10 text-emerald-500 dark:text-emerald-400'
+      break
+  }
+  return (
+    <>
+      <span id={name?.replace(/^#/, '')} className='relative -top-28' />
+      <div className="flex items-center gap-x-3" >
+        <span className={`rounded-lg px-1.5 font-mono text-[0.625rem] font-semibold leading-6 ring-1 ring-inset ${style}`}>{method}</span>
+        {/* <span className="h-0.5 w-0.5 rounded-full bg-zinc-300 dark:bg-zinc-600"></span> */}
+        <span className="font-mono text-xs text-zinc-400">{url}</span>
+      </div>
+      <h2 className='mt-2 scroll-mt-32'>
+        <a href={name} className='group text-inherit no-underline hover:text-inherit'>{title}</a>
+      </h2>
+    </>
+
+  )
+}
+
+export function Row({ children }: IChildrenProps) {
+  return (
+    <div className="grid grid-cols-1 items-start gap-x-16 gap-y-10 xl:!max-w-none xl:grid-cols-2">
+      {children}
+    </div>
+  )
+}
+
+type IColProps = IChildrenProps & {
+  sticky: boolean
+}
+export function Col({ children, sticky = false }: IColProps) {
+  return (
+    <div
+      className={classNames(
+        '[&>:first-child]:mt-0 [&>:last-child]:mb-0',
+        sticky && 'xl:sticky xl:top-24',
+      )}
+    >
+      {children}
+    </div>
+  )
+}
+
+export function Properties({ children }: IChildrenProps) {
+  return (
+    <div className="my-6">
+      <ul
+        role="list"
+        className="m-0 max-w-[calc(theme(maxWidth.lg)-theme(spacing.8))] list-none divide-y divide-zinc-900/5 p-0 dark:divide-white/5"
+      >
+        {children}
+      </ul>
+    </div>
+  )
+}
+
+type IProperty = IChildrenProps & {
+  name: string
+  type: string
+}
+export function Property({ name, type, children }: IProperty) {
+  return (
+    <li className="m-0 px-0 py-4 first:pt-0 last:pb-0">
+      <dl className="m-0 flex flex-wrap items-center gap-x-3 gap-y-2">
+        <dt className="sr-only">Name</dt>
+        <dd>
+          <code>{name}</code>
+        </dd>
+        <dt className="sr-only">Type</dt>
+        <dd className="font-mono text-xs text-zinc-400 dark:text-zinc-500">
+          {type}
+        </dd>
+        <dt className="sr-only">Description</dt>
+        <dd className="w-full flex-none [&>:first-child]:mt-0 [&>:last-child]:mb-0">
+          {children}
+        </dd>
+      </dl>
+    </li>
+  )
+}
+
+type ISubProperty = IChildrenProps & {
+  name: string
+  type: string
+}
+export function SubProperty({ name, type, children }: ISubProperty) {
+  return (
+    <li className="m-0 px-0 py-1 last:pb-0">
+      <dl className="m-0 flex flex-wrap items-center gap-x-3">
+        <dt className="sr-only">Name</dt>
+        <dd>
+          <code>{name}</code>
+        </dd>
+        <dt className="sr-only">Type</dt>
+        <dd className="font-mono text-xs text-zinc-400 dark:text-zinc-500">
+          {type}
+        </dd>
+        <dt className="sr-only">Description</dt>
+        <dd className="w-full flex-none [&>:first-child]:mt-0 [&>:last-child]:mb-0">
+          {children}
+        </dd>
+      </dl>
+    </li>
+  )
+}
+
+export function PropertyInstruction({ children }: PropsWithChildren<{}>) {
+  return (
+    <li className="m-0 px-0 py-4 italic first:pt-0">{children}</li>
+  )
+}
diff --git a/app/components/develop/secret-key/assets/copied.svg b/app/components/develop/secret-key/assets/copied.svg
new file mode 100644
index 0000000..de5f86c
--- /dev/null
+++ b/app/components/develop/secret-key/assets/copied.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M10.6665 2.66683C11.2865 2.66683 11.5965 2.66683 11.8508 2.73498C12.541 2.91991 13.0801 3.45901 13.265 4.14919C13.3332 4.40352 13.3332 4.71352 13.3332 5.3335V11.4668C13.3332 12.5869 13.3332 13.147 13.1152 13.5748C12.9234 13.9511 12.6175 14.2571 12.2412 14.4488C11.8133 14.6668 11.2533 14.6668 10.1332 14.6668H5.8665C4.7464 14.6668 4.18635 14.6668 3.75852 14.4488C3.3822 14.2571 3.07624 13.9511 2.88449 13.5748C2.6665 13.147 2.6665 12.5869 2.6665 11.4668V5.3335C2.6665 4.71352 2.6665 4.40352 2.73465 4.14919C2.91959 3.45901 3.45868 2.91991 4.14887 2.73498C4.4032 2.66683 4.71319 2.66683 5.33317 2.66683M5.99984 10.0002L7.33317 11.3335L10.3332 8.3335M6.39984 4.00016H9.59984C9.9732 4.00016 10.1599 4.00016 10.3025 3.9275C10.4279 3.86359 10.5299 3.7616 10.5938 3.63616C10.6665 3.49355 10.6665 3.30686 10.6665 2.9335V2.40016C10.6665 2.02679 10.6665 1.84011 10.5938 1.6975C10.5299 1.57206 10.4279 1.47007 10.3025 1.40616C10.1599 1.3335 9.97321 1.3335 9.59984 1.3335H6.39984C6.02647 1.3335 5.83978 1.3335 5.69718 1.40616C5.57174 1.47007 5.46975 1.57206 5.40583 1.6975C5.33317 1.84011 5.33317 2.02679 5.33317 2.40016V2.9335C5.33317 3.30686 5.33317 3.49355 5.40583 3.63616C5.46975 3.7616 5.57174 3.86359 5.69718 3.9275C5.83978 4.00016 6.02647 4.00016 6.39984 4.00016Z" stroke="#1D2939" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/develop/secret-key/assets/copy-hover.svg b/app/components/develop/secret-key/assets/copy-hover.svg
new file mode 100644
index 0000000..ca8334a
--- /dev/null
+++ b/app/components/develop/secret-key/assets/copy-hover.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M10.6665 2.66634H11.9998C12.3535 2.66634 12.6926 2.80682 12.9426 3.05687C13.1927 3.30691 13.3332 3.64605 13.3332 3.99967V13.333C13.3332 13.6866 13.1927 14.0258 12.9426 14.2758C12.6926 14.5259 12.3535 14.6663 11.9998 14.6663H3.99984C3.64622 14.6663 3.30708 14.5259 3.05703 14.2758C2.80698 14.0258 2.6665 13.6866 2.6665 13.333V3.99967C2.6665 3.64605 2.80698 3.30691 3.05703 3.05687C3.30708 2.80682 3.64622 2.66634 3.99984 2.66634H5.33317M5.99984 1.33301H9.99984C10.368 1.33301 10.6665 1.63148 10.6665 1.99967V3.33301C10.6665 3.7012 10.368 3.99967 9.99984 3.99967H5.99984C5.63165 3.99967 5.33317 3.7012 5.33317 3.33301V1.99967C5.33317 1.63148 5.63165 1.33301 5.99984 1.33301Z" stroke="#1D2939" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/develop/secret-key/assets/copy.svg b/app/components/develop/secret-key/assets/copy.svg
new file mode 100644
index 0000000..18d2b4e
--- /dev/null
+++ b/app/components/develop/secret-key/assets/copy.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M10.6665 2.66634H11.9998C12.3535 2.66634 12.6926 2.80682 12.9426 3.05687C13.1927 3.30691 13.3332 3.64605 13.3332 3.99967V13.333C13.3332 13.6866 13.1927 14.0258 12.9426 14.2758C12.6926 14.5259 12.3535 14.6663 11.9998 14.6663H3.99984C3.64622 14.6663 3.30708 14.5259 3.05703 14.2758C2.80698 14.0258 2.6665 13.6866 2.6665 13.333V3.99967C2.6665 3.64605 2.80698 3.30691 3.05703 3.05687C3.30708 2.80682 3.64622 2.66634 3.99984 2.66634H5.33317M5.99984 1.33301H9.99984C10.368 1.33301 10.6665 1.63148 10.6665 1.99967V3.33301C10.6665 3.7012 10.368 3.99967 9.99984 3.99967H5.99984C5.63165 3.99967 5.33317 3.7012 5.33317 3.33301V1.99967C5.33317 1.63148 5.63165 1.33301 5.99984 1.33301Z" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/develop/secret-key/assets/pause.svg b/app/components/develop/secret-key/assets/pause.svg
new file mode 100644
index 0000000..a204b17
--- /dev/null
+++ b/app/components/develop/secret-key/assets/pause.svg
@@ -0,0 +1,10 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_129_2189)">
+<path d="M10.6666 14V10M13.3333 14V10M18.6666 12C18.6666 15.6819 15.6819 18.6667 12 18.6667C8.31808 18.6667 5.33331 15.6819 5.33331 12C5.33331 8.3181 8.31808 5.33333 12 5.33333C15.6819 5.33333 18.6666 8.3181 18.6666 12Z" stroke="#155EEF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_129_2189">
+<rect width="16" height="16" fill="white" transform="translate(4 4)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/develop/secret-key/assets/play.svg b/app/components/develop/secret-key/assets/play.svg
new file mode 100644
index 0000000..b423e98
--- /dev/null
+++ b/app/components/develop/secret-key/assets/play.svg
@@ -0,0 +1,11 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_129_107)">
+<path d="M7.99998 14.6666C11.6819 14.6666 14.6666 11.6819 14.6666 7.99998C14.6666 4.31808 11.6819 1.33331 7.99998 1.33331C4.31808 1.33331 1.33331 4.31808 1.33331 7.99998C1.33331 11.6819 4.31808 14.6666 7.99998 14.6666Z" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M6.66665 5.33331L10.6666 7.99998L6.66665 10.6666V5.33331Z" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_129_107">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/develop/secret-key/assets/qrcode-hover.svg b/app/components/develop/secret-key/assets/qrcode-hover.svg
new file mode 100644
index 0000000..84e3ee7
--- /dev/null
+++ b/app/components/develop/secret-key/assets/qrcode-hover.svg
@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path d="M4.33333 4.33333H4.34M11.6667 4.33333H11.6733M4.33333 11.6667H4.34M8.66667 8.66667H8.67333M11.6667 11.6667H11.6733M11.3333 14H14V11.3333M9.33333 11V14M14 9.33333H11M10.4 6.66667H12.9333C13.3067 6.66667 13.4934 6.66667 13.636 6.594C13.7614 6.53009 13.8634 6.4281 13.9273 6.30266C14 6.16005 14 5.97337 14 5.6V3.06667C14 2.6933 14 2.50661 13.9273 2.36401C13.8634 2.23856 13.7614 2.13658 13.636 2.07266C13.4934 2 13.3067 2 12.9333 2H10.4C10.0266 2 9.83995 2 9.69734 2.07266C9.5719 2.13658 9.46991 2.23856 9.406 2.36401C9.33333 2.50661 9.33333 2.6933 9.33333 3.06667V5.6C9.33333 5.97337 9.33333 6.16005 9.406 6.30266C9.46991 6.4281 9.5719 6.53009 9.69734 6.594C9.83995 6.66667 10.0266 6.66667 10.4 6.66667ZM3.06667 6.66667H5.6C5.97337 6.66667 6.16005 6.66667 6.30266 6.594C6.4281 6.53009 6.53009 6.4281 6.594 6.30266C6.66667 6.16005 6.66667 5.97337 6.66667 5.6V3.06667C6.66667 2.6933 6.66667 2.50661 6.594 2.36401C6.53009 2.23856 6.4281 2.13658 6.30266 2.07266C6.16005 2 5.97337 2 5.6 2H3.06667C2.6933 2 2.50661 2 2.36401 2.07266C2.23856 2.13658 2.13658 2.23856 2.07266 2.36401C2 2.50661 2 2.6933 2 3.06667V5.6C2 5.97337 2 6.16005 2.07266 6.30266C2.13658 6.4281 2.23856 6.53009 2.36401 6.594C2.50661 6.66667 2.6933 6.66667 3.06667 6.66667ZM3.06667 14H5.6C5.97337 14 6.16005 14 6.30266 13.9273C6.4281 13.8634 6.53009 13.7614 6.594 13.636C6.66667 13.4934 6.66667 13.3067 6.66667 12.9333V10.4C6.66667 10.0266 6.66667 9.83995 6.594 9.69734C6.53009 9.5719 6.4281 9.46991 6.30266 9.406C6.16005 9.33333 5.97337 9.33333 5.6 9.33333H3.06667C2.6933 9.33333 2.50661 9.33333 2.36401 9.406C2.23856 9.46991 2.13658 9.5719 2.07266 9.69734C2 9.83995 2 10.0266 2 10.4V12.9333C2 13.3067 2 13.4934 2.07266 13.636C2.13658 13.7614 2.23856 13.8634 2.36401 13.9273C2.50661 14 2.6933 14 3.06667 14Z" stroke="#1D2939" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+  </svg>
+  
\ No newline at end of file
diff --git a/app/components/develop/secret-key/assets/qrcode.svg b/app/components/develop/secret-key/assets/qrcode.svg
new file mode 100644
index 0000000..57878d5
--- /dev/null
+++ b/app/components/develop/secret-key/assets/qrcode.svg
@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path d="M4.33333 4.33333H4.34M11.6667 4.33333H11.6733M4.33333 11.6667H4.34M8.66667 8.66667H8.67333M11.6667 11.6667H11.6733M11.3333 14H14V11.3333M9.33333 11V14M14 9.33333H11M10.4 6.66667H12.9333C13.3067 6.66667 13.4934 6.66667 13.636 6.594C13.7614 6.53009 13.8634 6.4281 13.9273 6.30266C14 6.16005 14 5.97337 14 5.6V3.06667C14 2.6933 14 2.50661 13.9273 2.36401C13.8634 2.23856 13.7614 2.13658 13.636 2.07266C13.4934 2 13.3067 2 12.9333 2H10.4C10.0266 2 9.83995 2 9.69734 2.07266C9.5719 2.13658 9.46991 2.23856 9.406 2.36401C9.33333 2.50661 9.33333 2.6933 9.33333 3.06667V5.6C9.33333 5.97337 9.33333 6.16005 9.406 6.30266C9.46991 6.4281 9.5719 6.53009 9.69734 6.594C9.83995 6.66667 10.0266 6.66667 10.4 6.66667ZM3.06667 6.66667H5.6C5.97337 6.66667 6.16005 6.66667 6.30266 6.594C6.4281 6.53009 6.53009 6.4281 6.594 6.30266C6.66667 6.16005 6.66667 5.97337 6.66667 5.6V3.06667C6.66667 2.6933 6.66667 2.50661 6.594 2.36401C6.53009 2.23856 6.4281 2.13658 6.30266 2.07266C6.16005 2 5.97337 2 5.6 2H3.06667C2.6933 2 2.50661 2 2.36401 2.07266C2.23856 2.13658 2.13658 2.23856 2.07266 2.36401C2 2.50661 2 2.6933 2 3.06667V5.6C2 5.97337 2 6.16005 2.07266 6.30266C2.13658 6.4281 2.23856 6.53009 2.36401 6.594C2.50661 6.66667 2.6933 6.66667 3.06667 6.66667ZM3.06667 14H5.6C5.97337 14 6.16005 14 6.30266 13.9273C6.4281 13.8634 6.53009 13.7614 6.594 13.636C6.66667 13.4934 6.66667 13.3067 6.66667 12.9333V10.4C6.66667 10.0266 6.66667 9.83995 6.594 9.69734C6.53009 9.5719 6.4281 9.46991 6.30266 9.406C6.16005 9.33333 5.97337 9.33333 5.6 9.33333H3.06667C2.6933 9.33333 2.50661 9.33333 2.36401 9.406C2.23856 9.46991 2.13658 9.5719 2.07266 9.69734C2 9.83995 2 10.0266 2 10.4V12.9333C2 13.3067 2 13.4934 2.07266 13.636C2.13658 13.7614 2.23856 13.8634 2.36401 13.9273C2.50661 14 2.6933 14 3.06667 14Z" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+  </svg>
+  
\ No newline at end of file
diff --git a/app/components/develop/secret-key/assets/svg.svg b/app/components/develop/secret-key/assets/svg.svg
new file mode 100644
index 0000000..bf401e0
--- /dev/null
+++ b/app/components/develop/secret-key/assets/svg.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1694177685288" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4415" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M192 384h640a42.666667 42.666667 0 0 1 42.666667 42.666667v362.666666a42.666667 42.666667 0 0 1-42.666667 42.666667H192v106.666667a21.333333 21.333333 0 0 0 21.333333 21.333333h725.333334a21.333333 21.333333 0 0 0 21.333333-21.333333V308.821333L949.909333 298.666667h-126.528A98.048 98.048 0 0 1 725.333333 200.618667V72.661333L716.714667 64H213.333333a21.333333 21.333333 0 0 0-21.333333 21.333333v298.666667zM128 832H42.666667a42.666667 42.666667 0 0 1-42.666667-42.666667V426.666667a42.666667 42.666667 0 0 1 42.666667-42.666667h85.333333V85.333333a85.333333 85.333333 0 0 1 85.333333-85.333333h530.026667L1024 282.453333V938.666667a85.333333 85.333333 0 0 1-85.333333 85.333333H213.333333a85.333333 85.333333 0 0 1-85.333333-85.333333v-106.666667z m61.376-364.885333c-27.434667 0-49.898667 6.528-67.712 19.968-19.221333 13.824-28.501333 33.024-28.501333 57.216s9.621333 42.624 29.226666 55.296c7.466667 4.608 27.093333 12.288 58.432 23.04 28.138667 9.216 44.522667 15.36 49.514667 18.048 15.68 8.448 23.872 19.968 23.872 34.56 0 11.52-5.696 20.352-16.384 27.264-10.688 6.528-25.664 9.984-44.181333 9.984-21.013333 0-36.352-4.224-46.314667-11.904-11.050667-8.832-17.813333-23.808-20.672-44.544H85.333333c1.792 34.944 13.546667 60.288 34.922667 76.416 17.450667 13.056 42.026667 19.584 73.386667 19.584 32.426667 0 57.706667-7.296 75.52-21.12 17.813333-14.208 26.730667-33.792 26.730666-58.368 0-25.344-11.050667-44.928-33.130666-59.136-9.984-6.144-32.064-15.36-66.624-26.88-23.509333-8.064-38.122667-13.824-43.477334-16.896-12.096-6.912-17.813333-16.512-17.813333-28.032 0-13.056 4.992-22.656 15.68-28.416 8.554667-4.992 20.672-7.296 36.693333-7.296 18.538667 0 32.789333 3.456 42.048 11.136 9.258667 7.296 16.021333 19.584 19.584 36.48h41.344c-2.496-29.952-12.821333-52.224-30.656-66.432-16.725333-13.44-40.256-19.968-70.186666-19.968z m118.976 5.376L398.848 746.666667h50.24l90.496-274.176h-45.226667l-69.845333 223.488h-1.066667l-69.845333-223.488h-45.226667z m368.405333-5.376c-37.76 0-67.690667 13.824-89.792 42.24-21.013333 26.496-31.36 60.288-31.36 101.376 0 40.704 10.346667 74.112 31.36 99.84 22.442667 27.648 53.802667 41.472 94.421334 41.472 22.805333 0 43.093333-3.072 61.632-9.216A143.829333 143.829333 0 0 0 789.333333 716.714667V600.746667h-109.013333v38.4h67.328v56.448c-8.533333 5.376-17.450667 9.6-27.434667 12.672a123.285333 123.285333 0 0 1-34.197333 4.608c-30.997333 0-53.802667-9.216-68.416-27.648-13.525333-17.28-20.309333-42.24-20.309333-74.496 0-33.792 7.488-59.52 22.826666-77.952 13.866667-17.664 32.768-26.112 56.64-26.112 19.221333 0 34.901333 4.224 46.656 13.056 11.413333 8.832 19.242667 21.888 22.826667 39.552h42.026667c-4.629333-30.72-16.042667-53.376-34.197334-68.736-18.88-15.744-44.544-23.424-77.312-23.424z" fill="#8a8a8a" p-id="4416"></path></svg>
\ No newline at end of file
diff --git a/app/components/develop/secret-key/assets/svged.svg b/app/components/develop/secret-key/assets/svged.svg
new file mode 100644
index 0000000..bca6210
--- /dev/null
+++ b/app/components/develop/secret-key/assets/svged.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1694177378730" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4206" width="16" height="16" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M192 384h640a42.666667 42.666667 0 0 1 42.666667 42.666667v362.666666a42.666667 42.666667 0 0 1-42.666667 42.666667H192v106.666667a21.333333 21.333333 0 0 0 21.333333 21.333333h725.333334a21.333333 21.333333 0 0 0 21.333333-21.333333V308.821333L949.909333 298.666667h-126.528A98.048 98.048 0 0 1 725.333333 200.618667V72.661333L716.714667 64H213.333333a21.333333 21.333333 0 0 0-21.333333 21.333333v298.666667zM128 832H42.666667a42.666667 42.666667 0 0 1-42.666667-42.666667V426.666667a42.666667 42.666667 0 0 1 42.666667-42.666667h85.333333V85.333333a85.333333 85.333333 0 0 1 85.333333-85.333333h530.026667L1024 282.453333V938.666667a85.333333 85.333333 0 0 1-85.333333 85.333333H213.333333a85.333333 85.333333 0 0 1-85.333333-85.333333v-106.666667z m61.376-364.885333c-27.434667 0-49.898667 6.528-67.712 19.968-19.221333 13.824-28.501333 33.024-28.501333 57.216s9.621333 42.624 29.226666 55.296c7.466667 4.608 27.093333 12.288 58.432 23.04 28.138667 9.216 44.522667 15.36 49.514667 18.048 15.68 8.448 23.872 19.968 23.872 34.56 0 11.52-5.696 20.352-16.384 27.264-10.688 6.528-25.664 9.984-44.181333 9.984-21.013333 0-36.352-4.224-46.314667-11.904-11.050667-8.832-17.813333-23.808-20.672-44.544H85.333333c1.792 34.944 13.546667 60.288 34.922667 76.416 17.450667 13.056 42.026667 19.584 73.386667 19.584 32.426667 0 57.706667-7.296 75.52-21.12 17.813333-14.208 26.730667-33.792 26.730666-58.368 0-25.344-11.050667-44.928-33.130666-59.136-9.984-6.144-32.064-15.36-66.624-26.88-23.509333-8.064-38.122667-13.824-43.477334-16.896-12.096-6.912-17.813333-16.512-17.813333-28.032 0-13.056 4.992-22.656 15.68-28.416 8.554667-4.992 20.672-7.296 36.693333-7.296 18.538667 0 32.789333 3.456 42.048 11.136 9.258667 7.296 16.021333 19.584 19.584 36.48h41.344c-2.496-29.952-12.821333-52.224-30.656-66.432-16.725333-13.44-40.256-19.968-70.186666-19.968z m118.976 5.376L398.848 746.666667h50.24l90.496-274.176h-45.226667l-69.845333 223.488h-1.066667l-69.845333-223.488h-45.226667z m368.405333-5.376c-37.76 0-67.690667 13.824-89.792 42.24-21.013333 26.496-31.36 60.288-31.36 101.376 0 40.704 10.346667 74.112 31.36 99.84 22.442667 27.648 53.802667 41.472 94.421334 41.472 22.805333 0 43.093333-3.072 61.632-9.216A143.829333 143.829333 0 0 0 789.333333 716.714667V600.746667h-109.013333v38.4h67.328v56.448c-8.533333 5.376-17.450667 9.6-27.434667 12.672a123.285333 123.285333 0 0 1-34.197333 4.608c-30.997333 0-53.802667-9.216-68.416-27.648-13.525333-17.28-20.309333-42.24-20.309333-74.496 0-33.792 7.488-59.52 22.826666-77.952 13.866667-17.664 32.768-26.112 56.64-26.112 19.221333 0 34.901333 4.224 46.656 13.056 11.413333 8.832 19.242667 21.888 22.826667 39.552h42.026667c-4.629333-30.72-16.042667-53.376-34.197334-68.736-18.88-15.744-44.544-23.424-77.312-23.424z" fill="#1A8EF7" p-id="4207"></path></svg>
\ No newline at end of file
diff --git a/app/components/develop/secret-key/assets/trash-gray.svg b/app/components/develop/secret-key/assets/trash-gray.svg
new file mode 100644
index 0000000..ef65c30
--- /dev/null
+++ b/app/components/develop/secret-key/assets/trash-gray.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path d="M6 2H10M2 4H14M12.6667 4L12.1991 11.0129C12.129 12.065 12.0939 12.5911 11.8667 12.99C11.6666 13.3412 11.3648 13.6235 11.0011 13.7998C10.588 14 10.0607 14 9.00623 14H6.99377C5.93927 14 5.41202 14 4.99889 13.7998C4.63517 13.6235 4.33339 13.3412 4.13332 12.99C3.90607 12.5911 3.871 12.065 3.80086 11.0129L3.33333 4M6.66667 7V10.3333M9.33333 7V10.3333" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/develop/secret-key/assets/trash-red.svg b/app/components/develop/secret-key/assets/trash-red.svg
new file mode 100644
index 0000000..4266dde
--- /dev/null
+++ b/app/components/develop/secret-key/assets/trash-red.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M6 2H10M2 4H14M12.6667 4L12.1991 11.0129C12.129 12.065 12.0939 12.5911 11.8667 12.99C11.6666 13.3412 11.3648 13.6235 11.0011 13.7998C10.588 14 10.0607 14 9.00623 14H6.99377C5.93927 14 5.41202 14 4.99889 13.7998C4.63517 13.6235 4.33339 13.3412 4.13332 12.99C3.90607 12.5911 3.871 12.065 3.80086 11.0129L3.33333 4M6.66667 7V10.3333M9.33333 7V10.3333" stroke="#D92D20" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/develop/secret-key/input-copy.tsx b/app/components/develop/secret-key/input-copy.tsx
new file mode 100644
index 0000000..982c63f
--- /dev/null
+++ b/app/components/develop/secret-key/input-copy.tsx
@@ -0,0 +1,57 @@
+'use client'
+import React, { useEffect, useState } from 'react'
+import copy from 'copy-to-clipboard'
+import { t } from 'i18next'
+import Tooltip from '@/app/components/base/tooltip'
+import CopyFeedback from '@/app/components/base/copy-feedback'
+
+type IInputCopyProps = {
+  value?: string
+  className?: string
+  children?: React.ReactNode
+}
+
+const InputCopy = ({
+  value = '',
+  className,
+  children,
+}: IInputCopyProps) => {
+  const [isCopied, setIsCopied] = useState(false)
+
+  useEffect(() => {
+    if (isCopied) {
+      const timeout = setTimeout(() => {
+        setIsCopied(false)
+      }, 1000)
+
+      return () => {
+        clearTimeout(timeout)
+      }
+    }
+  }, [isCopied])
+
+  return (
+    <div className={`flex items-center rounded-lg bg-components-input-bg-normal py-2 hover:bg-state-base-hover ${className}`}>
+      <div className="flex h-5 grow items-center">
+        {children}
+        <div className='relative h-full grow text-[13px]'>
+          <div className='r-0 absolute left-0 top-0 w-full cursor-pointer truncate pl-2 pr-2' onClick={() => {
+            copy(value)
+            setIsCopied(true)
+          }}>
+            <Tooltip
+              popupContent={isCopied ? `${t('appApi.copied')}` : `${t('appApi.copy')}`}
+              position='bottom'
+            >
+              <span className='text-text-secondary'>{value}</span>
+            </Tooltip>
+          </div>
+        </div>
+        <div className="h-4 w-px shrink-0 bg-divider-regular" />
+        <div className='mx-1'><CopyFeedback content={value} /></div>
+      </div>
+    </div>
+  )
+}
+
+export default InputCopy
diff --git a/app/components/develop/secret-key/secret-key-button.tsx b/app/components/develop/secret-key/secret-key-button.tsx
new file mode 100644
index 0000000..7d27c01
--- /dev/null
+++ b/app/components/develop/secret-key/secret-key-button.tsx
@@ -0,0 +1,35 @@
+'use client'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiKey2Line } from '@remixicon/react'
+import Button from '@/app/components/base/button'
+import SecretKeyModal from '@/app/components/develop/secret-key/secret-key-modal'
+
+type ISecretKeyButtonProps = {
+  className?: string
+  appId?: string
+  textCls?: string
+}
+
+const SecretKeyButton = ({ className, appId, textCls }: ISecretKeyButtonProps) => {
+  const [isVisible, setVisible] = useState(false)
+  const { t } = useTranslation()
+  return (
+    <>
+      <Button
+        className={`px-3 ${className}`}
+        onClick={() => setVisible(true)}
+        size='small'
+        variant='ghost'
+      >
+        <div className={'flex h-3.5 w-3.5 items-center justify-center'}>
+          <RiKey2Line className='h-3.5 w-3.5 text-text-tertiary' />
+        </div>
+        <div className={`system-xs-medium px-[3px] text-text-tertiary ${textCls}`}>{t('appApi.apiKey')}</div>
+      </Button>
+      <SecretKeyModal isShow={isVisible} onClose={() => setVisible(false)} appId={appId} />
+    </>
+  )
+}
+
+export default SecretKeyButton
diff --git a/app/components/develop/secret-key/secret-key-generate.tsx b/app/components/develop/secret-key/secret-key-generate.tsx
new file mode 100644
index 0000000..3d15b04
--- /dev/null
+++ b/app/components/develop/secret-key/secret-key-generate.tsx
@@ -0,0 +1,41 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { XMarkIcon } from '@heroicons/react/20/solid'
+import InputCopy from './input-copy'
+import s from './style.module.css'
+import Button from '@/app/components/base/button'
+import Modal from '@/app/components/base/modal'
+import type { CreateApiKeyResponse } from '@/models/app'
+
+type ISecretKeyGenerateModalProps = {
+  isShow: boolean
+  onClose: () => void
+  newKey?: CreateApiKeyResponse
+  className?: string
+}
+
+const SecretKeyGenerateModal = ({
+  isShow = false,
+  onClose,
+  newKey,
+  className,
+}: ISecretKeyGenerateModalProps) => {
+  const { t } = useTranslation()
+  return (
+    <Modal isShow={isShow} onClose={onClose} title={`${t('appApi.apiKeyModal.apiSecretKey')}`} className={`px-8 ${className}`}>
+      <XMarkIcon className={`absolute h-6 w-6 cursor-pointer text-text-tertiary ${s.close}`} onClick={onClose} />
+      <p className='mt-1 text-[13px] font-normal leading-5 text-text-tertiary'>{t('appApi.apiKeyModal.generateTips')}</p>
+      <div className='my-4'>
+        <InputCopy className='w-full' value={newKey?.token} />
+      </div>
+      <div className='my-4 flex justify-end'>
+        <Button className={`shrink-0 ${s.w64}`} onClick={onClose}>
+          <span className='text-xs font-medium text-text-secondary'>{t('appApi.actionMsg.ok')}</span>
+        </Button>
+      </div>
+
+    </Modal >
+  )
+}
+
+export default SecretKeyGenerateModal
diff --git a/app/components/develop/secret-key/secret-key-modal.tsx b/app/components/develop/secret-key/secret-key-modal.tsx
new file mode 100644
index 0000000..b61e231
--- /dev/null
+++ b/app/components/develop/secret-key/secret-key-modal.tsx
@@ -0,0 +1,147 @@
+'use client'
+import {
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiDeleteBinLine } from '@remixicon/react'
+import { PlusIcon, XMarkIcon } from '@heroicons/react/20/solid'
+import useSWR, { useSWRConfig } from 'swr'
+import SecretKeyGenerateModal from './secret-key-generate'
+import s from './style.module.css'
+import ActionButton from '@/app/components/base/action-button'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import CopyFeedback from '@/app/components/base/copy-feedback'
+import {
+  createApikey as createAppApikey,
+  delApikey as delAppApikey,
+  fetchApiKeysList as fetchAppApiKeysList,
+} from '@/service/apps'
+import {
+  createApikey as createDatasetApikey,
+  delApikey as delDatasetApikey,
+  fetchApiKeysList as fetchDatasetApiKeysList,
+} from '@/service/datasets'
+import type { CreateApiKeyResponse } from '@/models/app'
+import Loading from '@/app/components/base/loading'
+import Confirm from '@/app/components/base/confirm'
+import useTimestamp from '@/hooks/use-timestamp'
+import { useAppContext } from '@/context/app-context'
+
+type ISecretKeyModalProps = {
+  isShow: boolean
+  appId?: string
+  onClose: () => void
+}
+
+const SecretKeyModal = ({
+  isShow = false,
+  appId,
+  onClose,
+}: ISecretKeyModalProps) => {
+  const { t } = useTranslation()
+  const { formatTime } = useTimestamp()
+  const { currentWorkspace, isCurrentWorkspaceManager, isCurrentWorkspaceEditor } = useAppContext()
+  const [showConfirmDelete, setShowConfirmDelete] = useState(false)
+  const [isVisible, setVisible] = useState(false)
+  const [newKey, setNewKey] = useState<CreateApiKeyResponse | undefined>(undefined)
+  const { mutate } = useSWRConfig()
+  const commonParams = appId
+    ? { url: `/apps/${appId}/api-keys`, params: {} }
+    : { url: '/datasets/api-keys', params: {} }
+  const fetchApiKeysList = appId ? fetchAppApiKeysList : fetchDatasetApiKeysList
+  const { data: apiKeysList } = useSWR(commonParams, fetchApiKeysList)
+
+  const [delKeyID, setDelKeyId] = useState('')
+
+  const onDel = async () => {
+    setShowConfirmDelete(false)
+    if (!delKeyID)
+      return
+
+    const delApikey = appId ? delAppApikey : delDatasetApikey
+    const params = appId
+      ? { url: `/apps/${appId}/api-keys/${delKeyID}`, params: {} }
+      : { url: `/datasets/api-keys/${delKeyID}`, params: {} }
+    await delApikey(params)
+    mutate(commonParams)
+  }
+
+  const onCreate = async () => {
+    const params = appId
+      ? { url: `/apps/${appId}/api-keys`, body: {} }
+      : { url: '/datasets/api-keys', body: {} }
+    const createApikey = appId ? createAppApikey : createDatasetApikey
+    const res = await createApikey(params)
+    setVisible(true)
+    setNewKey(res)
+    mutate(commonParams)
+  }
+
+  const generateToken = (token: string) => {
+    return `${token.slice(0, 3)}...${token.slice(-20)}`
+  }
+
+  return (
+    <Modal isShow={isShow} onClose={onClose} title={`${t('appApi.apiKeyModal.apiSecretKey')}`} className={`${s.customModal} flex flex-col px-8`}>
+      <XMarkIcon className={`absolute h-6 w-6 cursor-pointer text-text-tertiary ${s.close}`} onClick={onClose} />
+      <p className='mt-1 shrink-0 text-[13px] font-normal leading-5 text-text-tertiary'>{t('appApi.apiKeyModal.apiSecretKeyTips')}</p>
+      {!apiKeysList && <div className='mt-4'><Loading /></div>}
+      {
+        !!apiKeysList?.data?.length && (
+          <div className='mt-4 flex grow flex-col overflow-hidden'>
+            <div className='flex h-9 shrink-0 items-center border-b border-divider-regular text-xs font-semibold text-text-tertiary'>
+              <div className='w-64 shrink-0 px-3'>{t('appApi.apiKeyModal.secretKey')}</div>
+              <div className='w-[200px] shrink-0 px-3'>{t('appApi.apiKeyModal.created')}</div>
+              <div className='w-[200px] shrink-0 px-3'>{t('appApi.apiKeyModal.lastUsed')}</div>
+              <div className='grow px-3'></div>
+            </div>
+            <div className='grow overflow-auto'>
+              {apiKeysList.data.map(api => (
+                <div className='flex h-9 items-center border-b border-divider-regular text-sm font-normal text-text-secondary' key={api.id}>
+                  <div className='w-64 shrink-0 truncate px-3 font-mono'>{generateToken(api.token)}</div>
+                  <div className='w-[200px] shrink-0 truncate px-3'>{formatTime(Number(api.created_at), t('appLog.dateTimeFormat') as string)}</div>
+                  <div className='w-[200px] shrink-0 truncate px-3'>{api.last_used_at ? formatTime(Number(api.last_used_at), t('appLog.dateTimeFormat') as string) : t('appApi.never')}</div>
+                  <div className='flex grow space-x-2 px-3'>
+                    <CopyFeedback content={api.token} />
+                    {isCurrentWorkspaceManager && (
+                      <ActionButton
+                        onClick={() => {
+                          setDelKeyId(api.id)
+                          setShowConfirmDelete(true)
+                        }}
+                      >
+                        <RiDeleteBinLine className='h-4 w-4' />
+                      </ActionButton>
+                    )}
+                  </div>
+                </div>
+              ))}
+            </div>
+          </div>
+        )
+      }
+      <div className='flex'>
+        <Button className={`mt-4 flex shrink-0 ${s.autoWidth}`} onClick={onCreate} disabled={!currentWorkspace || !isCurrentWorkspaceEditor}>
+          <PlusIcon className='mr-1 flex h-4 w-4 shrink-0' />
+          <div className='text-xs font-medium text-text-secondary'>{t('appApi.apiKeyModal.createNewSecretKey')}</div>
+        </Button>
+      </div>
+      <SecretKeyGenerateModal className='shrink-0' isShow={isVisible} onClose={() => setVisible(false)} newKey={newKey} />
+      {showConfirmDelete && (
+        <Confirm
+          title={`${t('appApi.actionMsg.deleteConfirmTitle')}`}
+          content={`${t('appApi.actionMsg.deleteConfirmTips')}`}
+          isShow={showConfirmDelete}
+          onConfirm={onDel}
+          onCancel={() => {
+            setDelKeyId('')
+            setShowConfirmDelete(false)
+          }}
+        />
+      )}
+    </Modal >
+  )
+}
+
+export default SecretKeyModal
diff --git a/app/components/develop/secret-key/style.module.css b/app/components/develop/secret-key/style.module.css
new file mode 100644
index 0000000..f13161c
--- /dev/null
+++ b/app/components/develop/secret-key/style.module.css
@@ -0,0 +1,57 @@
+.customModal {
+    max-width: 800px !important;
+    max-height: calc(100vh - 80px);
+}
+
+.close {
+    top: 1.5rem;
+    right: 1.5rem;
+}
+
+.trash {
+    color: transparent;
+}
+
+.w64 {
+    width: 4rem;
+}
+
+.customApi {
+    font-size: 11px;
+}
+
+.autoWidth {
+    width: auto;
+}
+
+.trashIcon {
+    background-color: transparent;
+    background-image: url(./assets/trash-gray.svg);
+    background-position: center;
+    background-repeat: no-repeat;
+    background-size: 16px 16px;
+}
+
+.trashIcon:hover {
+    background-color: rgba(254, 228, 226, 1);
+    background-image: url(./assets/trash-red.svg);
+    background-position: center;
+    background-repeat: no-repeat;
+    background-size: 16px 16px;
+}
+
+.copyIcon {
+    background-image: url(./assets/copy.svg);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.copyIcon:hover {
+    background-image: url(./assets/copy-hover.svg);
+    background-position: center;
+    background-repeat: no-repeat;
+}
+
+.copyIcon.copied {
+    background-image: url(./assets/copied.svg);
+}
diff --git a/app/components/develop/tag.tsx b/app/components/develop/tag.tsx
new file mode 100644
index 0000000..0b797f9
--- /dev/null
+++ b/app/components/develop/tag.tsx
@@ -0,0 +1,65 @@
+'use client'
+import classNames from '@/utils/classnames'
+
+const variantStyles = {
+  medium: 'rounded-lg px-1.5 ring-1 ring-inset',
+} as { [key: string]: string }
+
+const colorStyles = {
+  emerald: {
+    small: 'text-emerald-500 dark:text-emerald-400',
+    medium:
+      'ring-emerald-300 dark:ring-emerald-400/30 bg-emerald-400/10 text-emerald-500 dark:text-emerald-400',
+  },
+  sky: {
+    small: 'text-sky-500',
+    medium:
+      'ring-sky-300 bg-sky-400/10 text-sky-500 dark:ring-sky-400/30 dark:bg-sky-400/10 dark:text-sky-400',
+  },
+  amber: {
+    small: 'text-amber-500',
+    medium:
+      'ring-amber-300 bg-amber-400/10 text-amber-500 dark:ring-amber-400/30 dark:bg-amber-400/10 dark:text-amber-400',
+  },
+  rose: {
+    small: 'text-red-500 dark:text-rose-500',
+    medium:
+      'ring-rose-200 bg-rose-50 text-red-500 dark:ring-rose-500/20 dark:bg-rose-400/10 dark:text-rose-400',
+  },
+  zinc: {
+    small: 'text-zinc-400 dark:text-zinc-500',
+    medium:
+      'ring-zinc-200 bg-zinc-50 text-zinc-500 dark:ring-zinc-500/20 dark:bg-zinc-400/10 dark:text-zinc-400',
+  },
+} as { [key: string]: { [key: string]: string } }
+
+const valueColorMap = {
+  get: 'emerald',
+  post: 'sky',
+  put: 'amber',
+  delete: 'rose',
+} as { [key: string]: string }
+
+type ITagProps = {
+  children: string
+  color?: string
+  variant?: string
+}
+
+export function Tag({
+  children,
+  variant = 'medium',
+  color = valueColorMap[children.toLowerCase()] ?? 'emerald',
+}: ITagProps) {
+  return (
+    <span
+      className={classNames(
+        'font-mono text-[0.625rem] font-semibold leading-6',
+        variantStyles[variant],
+        colorStyles[color][variant],
+      )}
+    >
+      {children}
+    </span>
+  )
+}
diff --git a/app/components/develop/template/template.en.mdx b/app/components/develop/template/template.en.mdx
new file mode 100644
index 0000000..8212e80
--- /dev/null
+++ b/app/components/develop/template/template.en.mdx
@@ -0,0 +1,708 @@
+import { CodeGroup } from '../code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty, Paragraph } from '../md.tsx'
+
+# Completion App API
+
+The text generation application offers non-session support and is ideal for translation, article writing, summarization AI, and more.
+
+<div>
+  ### Base URL
+  <CodeGroup title="Code" targetCode={props.appDetail.api_base_url}>
+    ```javascript
+    ```
+  </CodeGroup>
+
+  ### Authentication
+
+  The Service API uses `API-Key` authentication.
+  <i>**Strongly recommend storing your API Key on the server-side, not shared or stored on the client-side, to avoid possible API-Key leakage that can lead to serious consequences.**</i>
+
+  For all API requests, include your API Key in the `Authorization` HTTP Header, as shown below:
+
+  <CodeGroup title="Code">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+
+    ```
+  </CodeGroup>
+</div>
+
+---
+
+<Heading
+  url='/completion-messages'
+  method='POST'
+  title='Create Completion Message'
+  name='#Create-Completion-Message'
+/>
+<Row>
+  <Col>
+    Send a request to the text generation application.
+
+    ### Request Body
+
+    <Properties>
+      
+      <Property name='inputs' type='object' key='inputs'>
+          Allows the entry of various variable values defined by the App.
+          The `inputs` parameter contains multiple key/value pairs, with each key corresponding to a specific variable and each value being the specific value for that variable.
+          The text generation application requires at least one key/value pair to be inputted.
+          - `query` (string) Required
+            The input text, the content to be processed.
+      </Property>
+      <Property name='response_mode' type='string' key='response_mode'>
+        The mode of response return, supporting:
+        - `streaming` Streaming mode (recommended), implements a typewriter-like output through SSE ([Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)).
+        - `blocking` Blocking mode, returns result after execution is complete. (Requests may be interrupted if the process is long)
+        <i>Due to Cloudflare restrictions, the request will be interrupted without a return after 100 seconds.</i>
+      </Property>
+      <Property name='user' type='string' key='user'>
+          User identifier, used to define the identity of the end-user for retrieval and statistics.
+          Should be uniquely defined by the developer within the application.
+      </Property>
+      <Property name='files' type='array[object]' key='files'>
+          File list, suitable for inputting files (images) combined with text understanding and answering questions, available only when the model supports Vision capability.
+          - `type` (string) Supported type: `image` (currently only supports image type)
+          - `transfer_method` (string) Transfer method, `remote_url` for image URL / `local_file` for file upload
+          - `url` (string) Image URL (when the transfer method is `remote_url`)
+          - `upload_file_id` (string) Uploaded file ID, which must be obtained by uploading through the File Upload API in advance (when the transfer method is `local_file`)
+      </Property>
+    </Properties>
+
+    ### Response
+    When `response_mode` is `blocking`, return a CompletionResponse object.
+    When `response_mode` is `streaming`, return a ChunkCompletionResponse stream.
+
+    ### ChatCompletionResponse
+    Returns the complete App result, `Content-Type` is `application/json`.
+    - `message_id` (string) Unique message ID
+    - `mode` (string) App mode, fixed as `chat`
+    - `answer` (string) Complete response content
+    - `metadata` (object) Metadata
+      - `usage` (Usage) Model usage information
+      - `retriever_resources` (array[RetrieverResource]) Citation and Attribution List
+    - `created_at` (int) Message creation timestamp, e.g., 1705395332
+
+    ### ChunkChatCompletionResponse
+    Returns the stream chunks outputted by the App, `Content-Type` is `text/event-stream`.
+    Each streaming chunk starts with `data:`, separated by two newline characters `\n\n`, as shown below:
+    <CodeGroup>
+    ```streaming {{ title: 'Response' }}
+    data: {"event": "message", "task_id": "900bbd43-dc0b-4383-a372-aa6e6c414227", "id": "663c5084-a254-4040-8ad3-51f2a3c1a77c", "answer": "Hi", "created_at": 1705398420}\n\n
+    ```
+    </CodeGroup>
+    The structure of the streaming chunks varies depending on the `event`:
+    - `event: message` LLM returns text chunk event, i.e., the complete text is output in a chunked fashion.
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `message_id` (string) Unique message ID
+      - `answer` (string) LLM returned text chunk content
+      - `created_at` (int) Creation timestamp, e.g., 1705395332
+    - `event: message_end` Message end event, receiving this event means streaming has ended.
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `message_id` (string) Unique message ID
+      - `metadata` (object) Metadata
+        - `usage` (Usage) Model usage information
+        - `retriever_resources` (array[RetrieverResource]) Citation and Attribution List
+    - `event: tts_message` TTS audio stream event, that is, speech synthesis output. The content is an audio block in Mp3 format, encoded as a base64 string. When playing, simply decode the base64 and feed it into the player. (This message is available only when auto-play is enabled)
+      - `task_id` (string) Task ID, used for request tracking and the stop response interface below
+      - `message_id` (string) Unique message ID
+      - `audio` (string) The audio after speech synthesis, encoded in base64 text content, when playing, simply decode the base64 and feed it into the player
+      - `created_at` (int) Creation timestamp, e.g.: 1705395332
+    - `event: tts_message_end` TTS audio stream end event, receiving this event indicates the end of the audio stream.
+      - `task_id` (string) Task ID, used for request tracking and the stop response interface below
+      - `message_id` (string) Unique message ID
+      - `audio` (string) The end event has no audio, so this is an empty string
+      - `created_at` (int) Creation timestamp, e.g.: 1705395332
+    - `event: message_replace` Message content replacement event.
+      When output content moderation is enabled, if the content is flagged, then the message content will be replaced with a preset reply through this event.
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `message_id` (string) Unique message ID
+      - `answer` (string) Replacement content (directly replaces all LLM reply text)
+      - `created_at` (int) Creation timestamp, e.g., 1705395332
+    - `event: error`
+      Exceptions that occur during the streaming process will be output in the form of stream events, and reception of an error event will end the stream.
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `message_id` (string) Unique message ID
+      - `status` (int) HTTP status code
+      - `code` (string) Error code
+      - `message` (string) Error message
+    - `event: ping` Ping event every 10 seconds to keep the connection alive.
+
+    ### Errors
+    - 404, Conversation does not exists
+    - 400, `invalid_param`, abnormal parameter input
+    - 400, `app_unavailable`, App configuration unavailable
+    - 400, `provider_not_initialize`, no available model credential configuration
+    - 400, `provider_quota_exceeded`, model invocation quota insufficient
+    - 400, `model_currently_not_support`, current model unavailable
+    - 400, `completion_request_error`, text generation failed
+    - 500, internal server error
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/completion-messages" targetCode={`curl -X POST '${props.appDetail.api_base_url}/completion-messages' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "inputs": {"query": "Hello, world!"},\n    "response_mode": "streaming",\n    "user": "abc-123"\n}'\n`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/completion-messages' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "inputs": {
+          "query": "Hello, world!"
+        },
+        "response_mode": "streaming",
+        "user": "abc-123"
+    }'
+    ```
+
+    </CodeGroup>
+    ### Blocking Mode
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "event": "message",
+      "message_id": "9da23599-e713-473b-982c-4328d4f5c78a",
+      "mode": "completion",
+      "answer": "Hello World!...",
+      "metadata": {
+          "usage": {
+              "prompt_tokens": 1033,
+              "prompt_unit_price": "0.001",
+              "prompt_price_unit": "0.001",
+              "prompt_price": "0.0010330",
+              "completion_tokens": 128,
+              "completion_unit_price": "0.002",
+              "completion_price_unit": "0.001",
+              "completion_price": "0.0002560",
+              "total_tokens": 1161,
+              "total_price": "0.0012890",
+              "currency": "USD",
+              "latency": 0.7682376249867957
+          }
+      },
+      "created_at": 1705407629
+  }
+    ```
+    </CodeGroup>
+    ### Streaming Mode
+    <CodeGroup title="Response">
+    ```streaming {{ title: 'Response' }}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " I", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": "'m", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " glad", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " to", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " meet", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " you", "created_at": 1679586595}
+      data: {"event": "message_end", "id": "5e52ce04-874b-4d27-9045-b3bc80def685", "metadata": {"usage": {"prompt_tokens": 1033, "prompt_unit_price": "0.001", "prompt_price_unit": "0.001", "prompt_price": "0.0010330", "completion_tokens": 135, "completion_unit_price": "0.002", "completion_price_unit": "0.001", "completion_price": "0.0002700", "total_tokens": 1168, "total_price": "0.0013030", "currency": "USD", "latency": 1.381760165997548}}}
+      data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+      data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/files/upload'
+  method='POST'
+  title='File Upload'
+  name='#file-upload'
+/>
+<Row>
+  <Col>
+  Upload a file (currently only images are supported) for use when sending messages, enabling multimodal understanding of images and text.
+  Supports png, jpg, jpeg, webp, gif formats.
+  <i>Uploaded files are for use by the current end-user only.</i>
+
+  ### Request Body
+  This interface requires a `multipart/form-data` request.
+  - `file` (File) Required
+    The file to be uploaded.
+  - `user` (string) Required
+    User identifier, defined by the developer's rules, must be unique within the application.
+
+  ### Response
+  After a successful upload, the server will return the file's ID and related information.
+  - `id` (uuid) ID
+  - `name` (string) File name
+  - `size` (int) File size (bytes)
+  - `extension` (string) File extension
+  - `mime_type` (string) File mime-type
+  - `created_by` (uuid) End-user ID
+  - `created_at` (timestamp) Creation timestamp, e.g., 1705395332
+
+  ### Errors
+  - 400, `no_file_uploaded`, a file must be provided
+  - 400, `too_many_files`, currently only one file is accepted
+  - 400, `unsupported_preview`, the file does not support preview
+  - 400, `unsupported_estimate`, the file does not support estimation
+  - 413, `file_too_large`, the file is too large
+  - 415, `unsupported_file_type`, unsupported extension, currently only document files are accepted
+  - 503, `s3_connection_failed`, unable to connect to S3 service
+  - 503, `s3_permission_denied`, no permission to upload files to S3
+  - 503, `s3_file_too_large`, file exceeds S3 size limit
+  - 500, internal server error
+
+
+  </Col>
+  <Col sticky>
+  ### Request Example
+  <CodeGroup title="Request" tag="POST" label="/files/upload" targetCode={`curl -X POST '${props.appDetail.api_base_url}/files/upload' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=image/[png|jpeg|jpg|webp|gif] \\\n--form 'user=abc-123'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/files/upload' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@"/path/to/file"'
+    ```
+
+    </CodeGroup>
+
+
+  ### Response Example
+  <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "72fa9618-8f89-4a37-9b33-7e1178a24a67",
+      "name": "example.png",
+      "size": 1024,
+      "extension": "png",
+      "mime_type": "image/png",
+      "created_by": "6ad1ab0a-73ff-4ac1-b9e4-cdb312f71f13",
+      "created_at": 1577836800,
+    }
+  ```
+  </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/completion-messages/:task_id/stop'
+  method='POST'
+  title='Stop Generate'
+  name='#stop-generatebacks'
+/>
+<Row>
+  <Col>
+  Only supported in streaming mode.
+  ### Path
+  - `task_id` (string) Task ID, can be obtained from the streaming chunk return
+  Request Body
+  - `user` (string) Required
+    User identifier, used to define the identity of the end-user, must be consistent with the user passed in the send message interface.
+  ### Response
+  - `result` (string) Always returns "success"
+  </Col>
+  <Col sticky>
+  ### Request Example
+  <CodeGroup title="Request" tag="POST" label="/completion-messages/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/completion-messages/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{ "user": "abc-123"}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/completion-messages/:task_id/stop' \
+    -H 'Authorization: Bearer {api_key}' \
+    -H 'Content-Type: application/json' \
+    --data-raw '{
+        "user": "abc-123"
+    }'
+    ```
+    </CodeGroup>
+
+    ### Response Example
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/messages/:message_id/feedbacks'
+  method='POST'
+  title='Message Feedback'
+  name='#feedbacks'
+/>
+<Row>
+  <Col>
+    End-users can provide feedback messages, facilitating application developers to optimize expected outputs.
+
+    ### Path
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+       Message ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+
+    <Properties>
+      <Property name='rating' type='string' key='rating'>
+        Upvote as `like`, downvote as `dislike`, revoke upvote as `null`
+      </Property>
+      <Property name='user' type='string' key='user'>
+        User identifier, defined by the developer's rules, must be unique within the application.
+      </Property>
+      <Property name='content' type='string' key='content'>
+        The specific content of message feedback.
+      </Property>
+    </Properties>
+
+    ### Response
+    - `result` (string) Always returns "success"
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/messages/:message_id/feedbacks" targetCode={`curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks \\\n --header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "rating": "like",\n    "user": "abc-123",\n    "content": "message feedback information"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "rating": "like",
+        "user": "abc-123",
+        "content": "message feedback information"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/app/feedbacks'
+  method='GET'
+  title='Get feedbacks of application'
+  name='#app-feedbacks'
+/>
+<Row>
+  <Col>
+    Get application's feedbacks.
+
+    ### Query
+    <Properties>
+      <Property name='page' type='string' key='page'>
+       锛坥ptional锛塸agination锛宒efault锛�1
+      </Property>
+    </Properties>
+
+    <Properties>
+      <Property name='limit' type='string' key='limit'>
+       锛坥ptional锛� records per page default锛�20
+      </Property>
+    </Properties>
+
+    ### Response
+    - `data` (List) return apps feedback list.
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/app/feedbacks" targetCode={`curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+      {
+          "data": [
+              {
+                  "id": "8c0fbed8-e2f9-49ff-9f0e-15a35bdd0e25",
+                  "app_id": "f252d396-fe48-450e-94ec-e184218e7346",
+                  "conversation_id": "2397604b-9deb-430e-b285-4726e51fd62d",
+                  "message_id": "709c0b0f-0a96-4a4e-91a4-ec0889937b11",
+                  "rating": "like",
+                  "content": "message feedback information-3",
+                  "from_source": "user",
+                  "from_end_user_id": "74286412-9a1a-42c1-929c-01edb1d381d5",
+                  "from_account_id": null,
+                  "created_at": "2025-04-24T09:24:38",
+                  "updated_at": "2025-04-24T09:24:38"
+              }
+          ]
+      }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/text-to-audio'
+  method='POST'
+  title='Text to Audio'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    Text to speech.
+
+    ### Request Body
+
+    <Properties>
+      <Property name='message_id' type='str' key='message_id'>
+        For text messages generated by Dify, simply pass the generated message-id directly. The backend will use the message-id to look up the corresponding content and synthesize the voice information directly. If both message_id and text are provided simultaneously, the message_id is given priority.
+      </Property>
+      <Property name='text' type='str' key='text'>
+        Speech generated content.
+      </Property>
+      <Property name='user' type='string' key='user'>
+        The user identifier, defined by the developer, must ensure uniqueness within the app.
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/text-to-audio" targetCode={`curl -o text-to-audio.mp3 -X POST '${props.appDetail.api_base_url}/text-to-audio' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290",\n    "text": "Hello Dify",\n    "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -o text-to-audio.mp3 -X POST '${props.appDetail.api_base_url}/text-to-audio' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290",
+        "text": "Hello Dify",
+        "user": "abc-123"
+    }'
+    ```
+    
+    </CodeGroup>
+
+    <CodeGroup title="headers">
+    ```json {{ title: 'headers' }}
+    {
+      "Content-Type": "audio/wav"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/info'
+  method='GET'
+  title='Get Application Basic Information'
+  name='#info'
+/>
+<Row>
+  <Col>
+  Used to get basic information about this application
+
+  ### Response
+  - `name` (string) application name
+  - `description` (string) application description
+  - `tags` (array[string]) application tags
+  </Col>
+  <Col>
+    <CodeGroup title="Request" tag="GET" label="/info" targetCode={`curl -X GET '${props.appDetail.api_base_url}/info' \\\n-H 'Authorization: Bearer {api_key}'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/info' \
+      -H 'Authorization: Bearer {api_key}'
+      ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "name": "My App",
+      "description": "This is my app.",
+      "tags": [
+        "tag1",
+        "tag2"
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/parameters'
+  method='GET'
+  title='Get Application Parameters Information'
+  name='#parameters'
+/>
+<Row>
+  <Col>
+    Used at the start of entering the page to obtain information such as features, input parameter names, types, and default values.
+
+    ### Response
+    - `opening_statement` (string) Opening statement
+    - `suggested_questions` (array[string]) List of suggested questions for the opening
+    - `suggested_questions_after_answer` (object) Suggest questions after enabling the answer.
+      - `enabled` (bool) Whether it is enabled
+    - `speech_to_text` (object) Speech to text
+      - `enabled` (bool) Whether it is enabled
+    - `retriever_resource` (object) Citation and Attribution
+      - `enabled` (bool) Whether it is enabled
+    - `annotation_reply` (object) Annotation reply
+      - `enabled` (bool) Whether it is enabled
+    - `user_input_form` (array[object]) User input form configuration
+      - `text-input` (object) Text input control
+        - `label` (string) Variable display label name
+        - `variable` (string) Variable ID
+        - `required` (bool) Whether it is required
+        - `default` (string) Default value
+      - `paragraph` (object) Paragraph text input control
+        - `label` (string) Variable display label name
+        - `variable` (string) Variable ID
+        - `required` (bool) Whether it is required
+        - `default` (string) Default value
+      - `select` (object) Dropdown control
+        - `label` (string) Variable display label name
+        - `variable` (string) Variable ID
+        - `required` (bool) Whether it is required
+        - `default` (string) Default value
+        - `options` (array[string]) Option values
+    - `file_upload` (object) File upload configuration
+      - `image` (object) Image settings
+        Currently only supports image types: `png`, `jpg`, `jpeg`, `webp`, `gif`
+        - `enabled` (bool) Whether it is enabled
+        - `number_limits` (int) Image number limit, default is 3
+        - `transfer_methods` (array[string]) List of transfer methods, remote_url, local_file, must choose one
+    - `system_parameters` (object) System parameters
+      - `file_size_limit` (int) Document upload size limit (MB)
+      - `image_file_size_limit` (int) Image file upload size limit (MB)
+      - `audio_file_size_limit` (int) Audio file upload size limit (MB)
+      - `video_file_size_limit` (int) Video file upload size limit (MB)
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/parameters" targetCode={` curl -X GET '${props.appDetail.api_base_url}/parameters'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/parameters' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "opening_statement": "Hello!",
+      "suggested_questions_after_answer": {
+          "enabled": true
+      },
+      "speech_to_text": {
+          "enabled": true
+      },
+      "retriever_resource": {
+          "enabled": true
+      },
+      "annotation_reply": {
+          "enabled": true
+      },
+      "user_input_form": [
+          {
+              "paragraph": {
+                  "label": "Query",
+                  "variable": "query",
+                  "required": true,
+                  "default": ""
+              }
+          }
+      ],
+      "file_upload": {
+          "image": {
+              "enabled": false,
+              "number_limits": 3,
+              "detail": "high",
+              "transfer_methods": [
+                  "remote_url",
+                  "local_file"
+              ]
+          }
+      },
+      "system_parameters": {
+          "file_size_limit": 15,
+          "image_file_size_limit": 10,
+          "audio_file_size_limit": 50,
+          "video_file_size_limit": 100
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/site'
+  method='GET'
+  title='Get Application WebApp Settings'
+  name='#site'
+/>
+<Row>
+  <Col>
+  Used to get the WebApp settings of the application.
+  ### Response
+  - `title` (string) WebApp name
+  - `chat_color_theme` (string) Chat color theme, in hex format
+  - `chat_color_theme_inverted` (bool) Whether the chat color theme is inverted
+  - `icon_type` (string) Icon type, `emoji` - emoji, `image` - picture
+  - `icon` (string) Icon. If it's `emoji` type, it's an emoji symbol; if it's `image` type, it's an image URL.
+  - `icon_background` (string) Background color in hex format
+  - `icon_url` (string) Icon URL
+  - `description` (string) Description
+  - `copyright` (string) Copyright information
+  - `privacy_policy` (string) Privacy policy link
+  - `custom_disclaimer` (string) Custom disclaimer
+  - `default_language` (string) Default language
+  - `show_workflow_steps` (bool) Whether to show workflow details
+  - `use_icon_as_answer_icon` (bool) Whether to replace 馃 in chat with the WebApp icon
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="POST" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/site' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/site' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "title": "My App",
+      "chat_color_theme": "#ff4a4a",
+      "chat_color_theme_inverted": false,
+      "icon_type": "emoji",
+      "icon": "馃槃",
+      "icon_background": "#FFEAD5",
+      "icon_url": null,
+      "description": "This is my app.",
+      "copyright": "all rights reserved",
+      "privacy_policy": "",
+      "custom_disclaimer": "All generated by AI",
+      "default_language": "en-US",
+      "show_workflow_steps": false,
+      "use_icon_as_answer_icon": false,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+___
diff --git a/app/components/develop/template/template.ja.mdx b/app/components/develop/template/template.ja.mdx
new file mode 100644
index 0000000..5061792
--- /dev/null
+++ b/app/components/develop/template/template.ja.mdx
@@ -0,0 +1,706 @@
+import { CodeGroup } from '../code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty, Paragraph } from '../md.tsx'
+
+# Completion 銈€儣銉� API
+
+銉嗐偔銈广儓鐢熸垚銈€儣銉偙銉笺偡銉с兂銇偦銉冦偡銉с兂銉偣銈掋偟銉濄兗銉堛仐銆佺炕瑷炽�佽浜嬩綔鎴愩�佽绱凙I绛夈伀鏈�閬┿仹銇欍��
+
+<div>
+  ### 銉欍兗銈筓RL
+  <CodeGroup title="Code" targetCode={props.appDetail.api_base_url}>
+    ```javascript
+    ```
+  </CodeGroup>
+
+  ### 瑾嶈
+
+  銈点兗銉撱偣API銇痐API-Key`瑾嶈銈掍娇鐢ㄣ仐銇俱仚銆�
+  <i>**API銈兗銇紡娲┿伀銈堛倠閲嶅ぇ銇祼鏋溿倰閬裤亼銈嬨仧銈併�丄PI銈兗銇偟銉笺儛銉笺偟銈ゃ儔銇繚瀛樸仐銆併偗銉┿偆銈€兂銉堛偟銈ゃ儔銇с伅鍏辨湁銈勪繚瀛樸仐銇亜銇撱仺銈掑挤銇忔帹濂ㄣ仐銇俱仚銆�**</i>
+
+  銇欍伖銇︺伄API銉偗銈ㄣ偣銉堛仹銆佷互涓嬨伄銈堛亞銇玚Authorization` HTTP銉樸儍銉�銉笺伀API銈兗銈掑惈銈併仸銇忋仩銇曘亜锛�
+
+  <CodeGroup title="Code">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+
+    ```
+  </CodeGroup>
+</div>
+
+---
+
+<Heading
+  url='/completion-messages'
+  method='POST'
+  title='瀹屼簡銉°儍銈汇兗銈搞伄浣滄垚'
+  name='#Create-Completion-Message'
+/>
+<Row>
+  <Col>
+    銉嗐偔銈广儓鐢熸垚銈€儣銉偙銉笺偡銉с兂銇儶銈偍銈广儓銈掗�佷俊銇椼伨銇欍��
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+
+    <Properties>
+      
+      <Property name='inputs' type='object' key='inputs'>
+          銈€儣銉仹瀹氱京銇曘倢銇熷悇绋鏁板�ゃ倰鍏ュ姏銇с亶銇俱仚銆�
+          `inputs`銉戙儵銉°兗銈裤伀銇鏁般伄銈兗/鍊ゃ儦銈€亴鍚伨銈屻�佸悇銈兗銇壒瀹氥伄澶夋暟銇蹇溿仐銆佸悇鍊ゃ伅銇濄伄澶夋暟銇叿浣撶殑銇�ゃ仺銇倞銇俱仚銆�
+          銉嗐偔銈广儓鐢熸垚銈€儣銉偙銉笺偡銉с兂銇с伅銆佸皯銇亸銇ㄣ倐1銇ゃ伄銈兗/鍊ゃ儦銈€伄鍏ュ姏銇屽繀瑕併仹銇欍��
+          - `query` (string) 蹇呴爤
+            鍏ュ姏銉嗐偔銈广儓銆佸嚘鐞嗐仌銈屻倠鍐呭銆�
+      </Property>
+      <Property name='response_mode' type='string' key='response_mode'>
+        銉偣銉濄兂銈硅繑鍗淬儮銉笺儔銆佷互涓嬨倰銈点儩銉笺儓锛�
+        - `streaming` 銈广儓銉兗銉熴兂銈般儮銉笺儔锛堟帹濂級銆丼SE锛圼Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)锛夈伀銈堛倠銈裤偆銉椼儵銈ゃ偪銉奸ⅷ銇嚭鍔涖倰瀹熻銆�
+        - `blocking` 銉栥儹銉冦偔銉炽偘銉€兗銉夈�佸疅琛屽畬浜嗗緦銇祼鏋溿倰杩斿嵈銆傦紙鍑︾悊銇岄暦銇勫牬鍚堛伅銉偗銈ㄣ偣銉堛亴涓柇銇曘倢銈嬪彲鑳芥�с亴銇傘倞銇俱仚锛�
+        <i>Cloudflare銇埗闄愩伀銈堛倞銆�100绉掑緦銇繑鍗淬仾銇椼仹涓柇銇曘倢銇俱仚銆�</i>
+      </Property>
+      <Property name='user' type='string' key='user'>
+          銉︺兗銈躲兗璀樺垾瀛愩�併偍銉炽儔銉︺兗銈躲兗銇韩鍏冦倰瀹氱京銇椼�佸彇寰椼倓绲辫▓銇娇鐢ㄣ仐銇俱仚銆�
+          銈€儣銉偙銉笺偡銉с兂鍐呫仹闁嬬櫤鑰呫亴涓�鎰忋伀瀹氱京銇欍倠蹇呰銇屻亗銈娿伨銇欍��
+      </Property>
+      <Property name='files' type='array[object]' key='files'>
+          銉曘偂銈ゃ儷銉偣銉堛�併儮銉囥儷銇孷ision姗熻兘銈掋偟銉濄兗銉堛仐銇︺亜銈嬪牬鍚堛伄銇裤�併儐銈偣銉堢悊瑙c仺璩晱蹇滅瓟銈掔祫銇垮悎銈忋仜銇熴儠銈°偆銉紙鐢诲儚锛夈伄鍏ュ姏銇仼銇椼仸銇勩伨銇欍��
+          - `type` (string) 銈点儩銉笺儓銇曘倢銈嬨偪銈ゃ儣锛歚image`锛堢従鍦ㄣ伅鐢诲儚銈裤偆銉椼伄銇裤偟銉濄兗銉堬級
+          - `transfer_method` (string) 杌㈤�佹柟娉曘�佺敾鍍廢RL銇牬鍚堛伅`remote_url` / 銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔銇牬鍚堛伅`local_file`
+          - `url` (string) 鐢诲儚URL锛堣虎閫佹柟娉曘亴`remote_url`銇牬鍚堬級
+          - `upload_file_id` (string) 銈€儍銉椼儹銉笺儔銇曘倢銇熴儠銈°偆銉獻D銆佷簨鍓嶃伀銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔API銈掗�氥仒銇︺偄銉冦儣銉兗銉夈仚銈嬪繀瑕併亴銇傘倞銇俱仚锛堣虎閫佹柟娉曘亴`local_file`銇牬鍚堬級
+      </Property>
+    </Properties>
+
+    ### 銉偣銉濄兂銈�
+    `response_mode`銇宍blocking`銇牬鍚堛�丆ompletionResponse銈儢銈搞偋銈儓銈掕繑鍗淬仐銇俱仚銆�
+    `response_mode`銇宍streaming`銇牬鍚堛�丆hunkCompletionResponse銈广儓銉兗銉犮倰杩斿嵈銇椼伨銇欍��
+
+    ### ChatCompletionResponse
+    銈€儣銉伄瀹屽叏銇祼鏋溿倰杩斿嵈銆乣Content-Type`銇痐application/json`銇с仚銆�
+    - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+    - `mode` (string) 銈€儣銉儮銉笺儔銆佸浐瀹氥仹`chat`
+    - `answer` (string) 瀹屽叏銇繙绛斿唴瀹�
+    - `metadata` (object) 銉°偪銉囥兗銈�
+      - `usage` (Usage) 銉€儑銉娇鐢ㄦ儏鍫�
+      - `retriever_resources` (array[RetrieverResource]) 寮曠敤銇ㄥ赴灞炪伄銉偣銉�
+    - `created_at` (int) 銉°儍銈汇兗銈镐綔鎴愩偪銈ゃ儬銈广偪銉炽儣銆佷緥锛�1705395332
+
+    ### ChunkChatCompletionResponse
+    銈€儣銉亴鍑哄姏銇欍倠銈广儓銉兗銉犮儊銉c兂銈倰杩斿嵈銆乣Content-Type`銇痐text/event-stream`銇с仚銆�
+    鍚勩偣銉堛儶銉笺儫銉炽偘銉併儯銉炽偗銇痐data:`銇у銇俱倞銆�2銇ゃ伄鏀硅鏂囧瓧`\n\n`銇у尯鍒囥倝銈屻伨銇欙細
+    <CodeGroup>
+    ```streaming {{ title: 'Response' }}
+    data: {"event": "message", "task_id": "900bbd43-dc0b-4383-a372-aa6e6c414227", "id": "663c5084-a254-4040-8ad3-51f2a3c1a77c", "answer": "Hi", "created_at": 1705398420}\n\n
+    ```
+    </CodeGroup>
+    銈广儓銉兗銉熴兂銈般儊銉c兂銈伄妲嬮�犮伅`event`銇倛銇c仸鐣般仾銈娿伨銇欙細
+    - `event: message` LLM銇屻儐銈偣銉堛儊銉c兂銈倰杩斻仚銈ゃ儥銉炽儓銆併仱銇俱倞瀹屽叏銇儐銈偣銉堛亴銉併儯銉炽偗褰㈠紡銇у嚭鍔涖仌銈屻伨銇欍��
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓銇拷璺°仺浠ヤ笅銇敓鎴愬仠姝PI銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `answer` (string) LLM銇岃繑銇椼仧銉嗐偔銈广儓銉併儯銉炽偗銇唴瀹�
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: message_end` 銉°儍銈汇兗銈哥祩浜嗐偆銉欍兂銉堛�併亾銇偆銉欍兂銉堛倰鍙椾俊銇欍倠銇ㄣ偣銉堛儶銉笺儫銉炽偘銇岀祩浜嗐仐銇熴亾銇ㄣ倰鎰忓懗銇椼伨銇欍��
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓銇拷璺°仺浠ヤ笅銇敓鎴愬仠姝PI銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `metadata` (object) 銉°偪銉囥兗銈�
+        - `usage` (Usage) 銉€儑銉娇鐢ㄦ儏鍫�
+        - `retriever_resources` (array[RetrieverResource]) 寮曠敤銇ㄥ赴灞炪伄銉偣銉�
+    - `event: tts_message` TTS闊冲0銈广儓銉兗銉犮偆銉欍兂銉堛�併仱銇俱倞闊冲0鍚堟垚鍑哄姏銆傚唴瀹广伅Mp3褰㈠紡銇煶澹般儢銉儍銈仹銆乥ase64鏂囧瓧鍒椼仺銇椼仸銈ㄣ兂銈炽兗銉夈仌銈屻仸銇勩伨銇欍�傚啀鐢熸檪銇崢銇玝ase64銈掋儑銈炽兗銉夈仐銇︺儣銉兗銉ゃ兗銇緵绲︺仚銈嬨仩銇戙仹銇欍�傦紙銇撱伄銉°儍銈汇兗銈搞伅鑷嫊鍐嶇敓銇屾湁鍔广仾鍫村悎銇伩鍒╃敤鍙兘锛�
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓銇拷璺°仺浠ヤ笅銇繙绛斿仠姝€偆銉炽偪銉笺儠銈с兗銈广伀浣跨敤
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `audio` (string) 闊冲0鍚堟垚寰屻伄闊冲0銆乥ase64銉嗐偔銈广儓銈炽兂銉嗐兂銉勩仺銇椼仸銈ㄣ兂銈炽兗銉夈�佸啀鐢熸檪銇崢銇玝ase64銈掋儑銈炽兗銉夈仐銇︺儣銉兗銉ゃ兗銇緵绲�
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: tts_message_end` TTS闊冲0銈广儓銉兗銉犵祩浜嗐偆銉欍兂銉堛�併亾銇偆銉欍兂銉堛倰鍙椾俊銇欍倠銇ㄩ煶澹般偣銉堛儶銉笺儬銇岀祩浜嗐仐銇熴亾銇ㄣ倰绀恒仐銇俱仚銆�
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓銇拷璺°仺浠ヤ笅銇繙绛斿仠姝€偆銉炽偪銉笺儠銈с兗銈广伀浣跨敤
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `audio` (string) 绲備簡銈ゃ儥銉炽儓銇伅闊冲0銇屻仾銇勩仧銈併�佺┖鏂囧瓧鍒�
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: message_replace` 銉°儍銈汇兗銈稿唴瀹圭疆鎻涖偆銉欍兂銉堛��
+      鍑哄姏鍐呭銇儮銉囥儸銉笺偡銉с兂銇屾湁鍔广仾鍫村悎銆併偝銉炽儐銉炽儎銇屻儠銉┿偘浠樸亼銇曘倢銈嬨仺銆併亾銇偆銉欍兂銉堛倰閫氥仒銇︺儭銉冦偦銉笺偢鍐呭銇屼簨鍓嶈ō瀹氥仌銈屻仧杩斾俊銇疆銇嶆彌銇堛倝銈屻伨銇欍��
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓銇拷璺°仺浠ヤ笅銇敓鎴愬仠姝PI銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `answer` (string) 缃彌鍐呭锛圠LM銇繑淇°儐銈偣銉堛仚銇广仸銈掔洿鎺ョ疆鎻涳級
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: error`
+      銈广儓銉兗銉熴兂銈板嚘鐞嗕腑銇櫤鐢熴仐銇熶緥澶栥伅銆併偣銉堛儶銉笺儬銈ゃ儥銉炽儓銇舰寮忋仹鍑哄姏銇曘倢銆併偍銉┿兗銈ゃ儥銉炽儓銈掑彈淇°仚銈嬨仺銈广儓銉兗銉犮亴绲備簡銇椼伨銇欍��
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓銇拷璺°仺浠ヤ笅銇敓鎴愬仠姝PI銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `status` (int) HTTP銈广儐銉笺偪銈广偝銉笺儔
+      - `code` (string) 銈ㄣ儵銉笺偝銉笺儔
+      - `message` (string) 銈ㄣ儵銉笺儭銉冦偦銉笺偢
+    - `event: ping` 鎺ョ稓銈掔董鎸併仚銈嬨仧銈�10绉掋仈銇ㄣ伄Ping銈ゃ儥銉炽儓銆�
+
+    ### 銈ㄣ儵銉�
+    - 404, 浼氳┍銇屽瓨鍦ㄣ仐銇俱仜銈�
+    - 400, `invalid_param`, 銉戙儵銉°兗銈垮叆鍔涚暟甯�
+    - 400, `app_unavailable`, 銈€儣銉ō瀹氥亴鍒╃敤銇с亶銇俱仜銈�
+    - 400, `provider_not_initialize`, 鍒╃敤鍙兘銇儮銉囥儷瑾嶈鎯呭牨瑷畾銇屻亗銈娿伨銇涖倱
+    - 400, `provider_quota_exceeded`, 銉€儑銉懠銇冲嚭銇椼偗銈┿兗銈夸笉瓒�
+    - 400, `model_currently_not_support`, 鐝惧湪銇儮銉囥儷銇埄鐢ㄣ仹銇嶃伨銇涖倱
+    - 400, `completion_request_error`, 銉嗐偔銈广儓鐢熸垚銇け鏁椼仐銇俱仐銇�
+    - 500, 鍐呴儴銈点兗銉愩兗銈ㄣ儵銉�
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/completion-messages" targetCode={`curl -X POST '${props.appDetail.api_base_url}/completion-messages' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "inputs": {"query": "Hello, world!"},\n    "response_mode": "streaming",\n    "user": "abc-123"\n}'\n`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/completion-messages' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "inputs": {
+          "query": "Hello, world!"
+        },
+        "response_mode": "streaming",
+        "user": "abc-123"
+    }'
+    ```
+
+    </CodeGroup>
+    ### 銉栥儹銉冦偔銉炽偘銉€兗銉�
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "event": "message",
+      "message_id": "9da23599-e713-473b-982c-4328d4f5c78a",
+      "mode": "completion",
+      "answer": "Hello World!...",
+      "metadata": {
+          "usage": {
+              "prompt_tokens": 1033,
+              "prompt_unit_price": "0.001",
+              "prompt_price_unit": "0.001",
+              "prompt_price": "0.0010330",
+              "completion_tokens": 128,
+              "completion_unit_price": "0.002",
+              "completion_price_unit": "0.001",
+              "completion_price": "0.0002560",
+              "total_tokens": 1161,
+              "total_price": "0.0012890",
+              "currency": "USD",
+              "latency": 0.7682376249867957
+          }
+      },
+      "created_at": 1705407629
+  }
+    ```
+    </CodeGroup>
+    ### 銈广儓銉兗銉熴兂銈般儮銉笺儔
+    <CodeGroup title="Response">
+    ```streaming {{ title: 'Response' }}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " I", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": "'m", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " glad", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " to", "created_at": 1679586595}
+      data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " meet", "created_at": 1679586595}
+      data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " you", "created_at": 1679586595}
+      data: {"event": "message_end", "id": "5e52ce04-874b-4d27-9045-b3bc80def685", "metadata": {"usage": {"prompt_tokens": 1033, "prompt_unit_price": "0.001", "prompt_price_unit": "0.001", "prompt_price": "0.0010330", "completion_tokens": 135, "completion_unit_price": "0.002", "completion_price_unit": "0.001", "completion_price": "0.0002700", "total_tokens": 1168, "total_price": "0.0013030", "currency": "USD", "latency": 1.381760165997548}}}
+      data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+      data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/files/upload'
+  method='POST'
+  title='銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔'
+  name='#file-upload'
+/>
+<Row>
+  <Col>
+  銉°儍銈汇兗銈搁�佷俊鏅傘伀浣跨敤銇欍倠銉曘偂銈ゃ儷锛堢従鍦ㄣ伅鐢诲儚銇伩瀵惧繙锛夈倰銈€儍銉椼儹銉笺儔銇椼�佺敾鍍忋仺銉嗐偔銈广儓銇優銉儊銉€兗銉�銉仾鐞嗚В銈掑彲鑳姐伀銇椼伨銇欍��
+  png銆乯pg銆乯peg銆亀ebp銆乬if褰㈠紡銇蹇溿仐銇︺亜銇俱仚銆�
+  <i>銈€儍銉椼儹銉笺儔銇曘倢銇熴儠銈°偆銉伅銆佺従鍦ㄣ伄銈ㄣ兂銉夈儲銉笺偠銉笺伄銇裤亴浣跨敤銇с亶銇俱仚銆�</i>
+
+  ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+  銇撱伄銈ゃ兂銈裤兗銉曘偋銉笺偣銇痐multipart/form-data`銉偗銈ㄣ偣銉堛亴蹇呰銇с仚銆�
+  - `file` (File) 蹇呴爤
+    銈€儍銉椼儹銉笺儔銇欍倠銉曘偂銈ゃ儷銆�
+  - `user` (string) 蹇呴爤
+    闁嬬櫤鑰呫伄銉兗銉仹瀹氱京銇曘倢銇熴儲銉笺偠銉艰瓨鍒ュ瓙銆傘偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇傘倠蹇呰銇屻亗銈娿伨銇欍��
+
+  ### 銉偣銉濄兂銈�
+  銈€儍銉椼儹銉笺儔銇屾垚鍔熴仚銈嬨仺銆併偟銉笺儛銉笺伅銉曘偂銈ゃ儷銇甀D銇ㄩ枹閫f儏鍫便倰杩斻仐銇俱仚銆�
+  - `id` (uuid) ID
+  - `name` (string) 銉曘偂銈ゃ儷鍚�
+  - `size` (int) 銉曘偂銈ゃ儷銈点偆銈猴紙銉愩偆銉堬級
+  - `extension` (string) 銉曘偂銈ゃ儷鎷″嫉瀛�
+  - `mime_type` (string) 銉曘偂銈ゃ儷銇甅IME銈裤偆銉�
+  - `created_by` (uuid) 銈ㄣ兂銉夈儲銉笺偠銉糏D
+  - `created_at` (timestamp) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+
+  ### 銈ㄣ儵銉�
+  - 400, `no_file_uploaded`, 銉曘偂銈ゃ儷銈掓彁渚涖仚銈嬪繀瑕併亴銇傘倞銇俱仚
+  - 400, `too_many_files`, 鐝惧湪銇�1銇ゃ伄銉曘偂銈ゃ儷銇伩鍙椼亼浠樸亼銇︺亜銇俱仚
+  - 400, `unsupported_preview`, 銉曘偂銈ゃ儷銇屻儣銉儞銉ャ兗銇蹇溿仐銇︺亜銇俱仜銈�
+  - 400, `unsupported_estimate`, 銉曘偂銈ゃ儷銇屾帹瀹氥伀瀵惧繙銇椼仸銇勩伨銇涖倱
+  - 413, `file_too_large`, 銉曘偂銈ゃ儷銇屽ぇ銇嶃仚銇庛伨銇�
+  - 415, `unsupported_file_type`, 銈点儩銉笺儓銇曘倢銇︺亜銇亜鎷″嫉瀛愩仹銇欍�傜従鍦ㄣ伅銉夈偔銉ャ儭銉炽儓銉曘偂銈ゃ儷銇伩鍙椼亼浠樸亼銇︺亜銇俱仚
+  - 503, `s3_connection_failed`, S3銈点兗銉撱偣銇帴缍氥仹銇嶃伨銇涖倱
+  - 503, `s3_permission_denied`, S3銇搞伄銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔妯╅檺銇屻亗銈娿伨銇涖倱
+  - 503, `s3_file_too_large`, 銉曘偂銈ゃ儷銇孲3銇偟銈ゃ偤鍒堕檺銈掕秴銇堛仸銇勩伨銇�
+  - 500, 鍐呴儴銈点兗銉愩兗銈ㄣ儵銉�
+
+  </Col>
+  <Col sticky>
+  ### 銉偗銈ㄣ偣銉堜緥
+  <CodeGroup title="Request" tag="POST" label="/files/upload" targetCode={`curl -X POST '${props.appDetail.api_base_url}/files/upload' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=image/[png|jpeg|jpg|webp|gif] \\\n--form 'user=abc-123'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/files/upload' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@"/path/to/file"'
+    ```
+
+    </CodeGroup>
+
+
+  ### 銉偣銉濄兂銈逛緥
+  <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "72fa9618-8f89-4a37-9b33-7e1178a24a67",
+      "name": "example.png",
+      "size": 1024,
+      "extension": "png",
+      "mime_type": "image/png",
+      "created_by": "6ad1ab0a-73ff-4ac1-b9e4-cdb312f71f13",
+      "created_at": 1577836800,
+    }
+  ```
+  </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/completion-messages/:task_id/stop'
+  method='POST'
+  title='鐢熸垚銇仠姝�'
+  name='#stop-generatebacks'
+/>
+<Row>
+  <Col>
+  銈广儓銉兗銉熴兂銈般儮銉笺儔銇с伄銇裤偟銉濄兗銉堛仌銈屻仸銇勩伨銇欍��
+  ### 銉戙偣
+  - `task_id` (string) 銈裤偣銈疘D銆併偣銉堛儶銉笺儫銉炽偘銉併儯銉炽偗銇繑淇°亱銈夊彇寰楀彲鑳�
+  銉偗銈ㄣ偣銉堛儨銉囥偅
+  - `user` (string) 蹇呴爤
+    銉︺兗銈躲兗璀樺垾瀛愩�傘偍銉炽儔銉︺兗銈躲兗銇韩鍏冦倰瀹氱京銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻�併儭銉冦偦銉笺偢閫佷俊銈ゃ兂銈裤兗銉曘偋銉笺偣銇ф浮銇曘倢銇熴儲銉笺偠銉笺仺涓�鑷淬仚銈嬪繀瑕併亴銇傘倞銇俱仚銆�
+  ### 銉偣銉濄兂銈�
+  - `result` (string) 甯搞伀"success"銈掕繑銇椼伨銇�
+  </Col>
+  <Col sticky>
+  ### 銉偗銈ㄣ偣銉堜緥
+  <CodeGroup title="Request" tag="POST" label="/completion-messages/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/completion-messages/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{ "user": "abc-123"}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/completion-messages/:task_id/stop' \
+    -H 'Authorization: Bearer {api_key}' \
+    -H 'Content-Type: application/json' \
+    --data-raw '{
+        "user": "abc-123"
+    }'
+    ```
+    </CodeGroup>
+
+    ### 銉偣銉濄兂銈逛緥
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/messages/:message_id/feedbacks'
+  method='POST'
+  title='銉°儍銈汇兗銈搞儠銈c兗銉夈儛銉冦偗'
+  name='#feedbacks'
+/>
+<Row>
+  <Col>
+    銈ㄣ兂銉夈儲銉笺偠銉笺伅銉曘偅銉笺儔銉愩儍銈儭銉冦偦銉笺偢銈掓彁渚涖仹銇嶃�併偄銉椼儶銈便兗銈枫儳銉抽枊鐧鸿�呫亴鏈熷緟銇曘倢銈嬪嚭鍔涖倰鏈�閬╁寲銇欍倠銇伀褰圭珛銇°伨銇欍��
+
+    ### 銉戙偣
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+       銉°儍銈汇兗銈窱D
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+
+    <Properties>
+      <Property name='rating' type='string' key='rating'>
+        楂樿渚°伅`like`銆佷綆瑭曚尽銇痐dislike`銆侀珮瑭曚尽銇彇銈婃秷銇椼伅`null`
+      </Property>
+      <Property name='user' type='string' key='user'>
+        闁嬬櫤鑰呫伄銉兗銉仹瀹氱京銇曘倢銇熴儲銉笺偠銉艰瓨鍒ュ瓙銆傘偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇傘倠蹇呰銇屻亗銈娿伨銇欍��
+      </Property>
+      <Property name='content' type='string' key='content'>
+        銉°儍銈汇兗銈搞伄銉曘偅銉笺儔銉愩儍銈仹銇欍��
+      </Property>
+    </Properties>
+
+    ### 銉偣銉濄兂銈�
+    - `result` (string) 甯搞伀"success"銈掕繑銇椼伨銇�
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/messages/:message_id/feedbacks" targetCode={`curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks \\\n --header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "rating": "like",\n    "user": "abc-123",\n    "content": "message feedback information"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "rating": "like",
+        "user": "abc-123",
+        "content": "message feedback information"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/app/feedbacks'
+  method='GET'
+  title='銈€儣銉伄銉°儍銈汇兗銈搞伄銆屻亜銇勩伃銆嶃仺銉曘偅銉笺儔銉愩儍銈倰鍙栧緱'
+  name='#app-feedbacks'
+/>
+<Row>
+  <Col>
+    銈€儣銉伄銈ㄣ兂銉夈儲銉笺偠銉笺亱銈夈伄銉曘偅銉笺儔銉愩儍銈倓銆屻亜銇勩伃銆嶃倰鍙栧緱銇椼伨銇欍��
+
+    ### 銈偍銉�
+    <Properties>
+      <Property name='page' type='string' key='page'>
+       锛堜换鎰忥級銉氥兗銈哥暘鍙枫�傘儑銉曘偐銉儓鍊わ細1
+      </Property>
+    </Properties>
+
+    <Properties>
+      <Property name='limit' type='string' key='limit'>
+       锛堜换鎰忥級1銉氥兗銈搞亗銇熴倞銇欢鏁般�傘儑銉曘偐銉儓鍊わ細20
+      </Property>
+    </Properties>
+
+    ### 銉偣銉濄兂銈�
+    - `data` (銉偣銉�) 銇撱伄銈€儣銉伄銆屻亜銇勩伃銆嶃仺銉曘偅銉笺儔銉愩儍銈伄涓�瑕с倰杩斻仐銇俱仚銆�
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/app/feedbacks" targetCode={`curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+        {
+        "data": [
+            {
+                "id": "8c0fbed8-e2f9-49ff-9f0e-15a35bdd0e25",
+                "app_id": "f252d396-fe48-450e-94ec-e184218e7346",
+                "conversation_id": "2397604b-9deb-430e-b285-4726e51fd62d",
+                "message_id": "709c0b0f-0a96-4a4e-91a4-ec0889937b11",
+                "rating": "like",
+                "content": "message feedback information-3",
+                "from_source": "user",
+                "from_end_user_id": "74286412-9a1a-42c1-929c-01edb1d381d5",
+                "from_account_id": null,
+                "created_at": "2025-04-24T09:24:38",
+                "updated_at": "2025-04-24T09:24:38"
+            }
+        ]
+        }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/text-to-audio'
+  method='POST'
+  title='銉嗐偔銈广儓銇嬨倝闊冲0'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    銉嗐偔銈广儓銈掗煶澹般伀澶夋彌銇椼伨銇欍��
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+
+    <Properties>
+      <Property name='message_id' type='str' key='message_id'>
+        Dify銇岀敓鎴愩仐銇熴儐銈偣銉堛儭銉冦偦銉笺偢銇牬鍚堛�佺敓鎴愩仌銈屻仧message-id銈掔洿鎺ユ浮銇欍仩銇戙仹銇欍�傘儛銉冦偗銈ㄣ兂銉夈伅message-id銈掍娇鐢ㄣ仐銇﹀蹇溿仚銈嬨偝銉炽儐銉炽儎銈掓绱€仐銆侀煶澹版儏鍫便倰鐩存帴鍚堟垚銇椼伨銇欍�俶essage_id銇╰ext銇浮鏂广亴鍚屾檪銇彁渚涖仌銈屻仧鍫村悎銆乵essage_id銇屽劒鍏堛仌銈屻伨銇欍��
+      </Property>
+      <Property name='text' type='str' key='text'>
+        闊冲0鐢熸垚銈炽兂銉嗐兂銉勩��
+      </Property>
+      <Property name='user' type='string' key='user'>
+        闁嬬櫤鑰呫亴瀹氱京銇椼仧銉︺兗銈躲兗璀樺垾瀛愩�傘偄銉椼儶鍐呫仹涓�鎰忔�с倰纰轰繚銇欍倠蹇呰銇屻亗銈娿伨銇欍��
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/text-to-audio" targetCode={`curl -o text-to-audio.mp3 -X POST '${props.appDetail.api_base_url}/text-to-audio' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290",\n    "text": "Hello Dify",\n    "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -o text-to-audio.mp3 -X POST '${props.appDetail.api_base_url}/text-to-audio' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290",
+        "text": "Hello Dify",
+        "user": "abc-123"
+    }'
+    ```
+    
+    </CodeGroup>
+
+    <CodeGroup title="headers">
+    ```json {{ title: 'headers' }}
+    {
+      "Content-Type": "audio/wav"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/info'
+  method='GET'
+  title='銈€儣銉偙銉笺偡銉с兂銇熀鏈儏鍫便倰鍙栧緱'
+  name='#info'
+/>
+<Row>
+  <Col>
+  銇撱伄銈€儣銉偙銉笺偡銉с兂銇熀鏈儏鍫便倰鍙栧緱銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇�
+
+  ### Response
+  - `name` (string) 銈€儣銉偙銉笺偡銉с兂銇悕鍓�
+  - `description` (string) 銈€儣銉偙銉笺偡銉с兂銇鏄�
+  - `tags` (array[string]) 銈€儣銉偙銉笺偡銉с兂銇偪銈�
+  </Col>
+  <Col>
+    <CodeGroup title="Request" tag="GET" label="/info" targetCode={`curl -X GET '${props.appDetail.api_base_url}/info' \\\n-H 'Authorization: Bearer {api_key}'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/info' \
+      -H 'Authorization: Bearer {api_key}'
+      ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "name": "My App",
+      "description": "This is my app.",
+      "tags": [
+        "tag1",
+        "tag2"
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/parameters'
+  method='GET'
+  title='銈€儣銉偙銉笺偡銉с兂銇儜銉┿儭銉笺偪鎯呭牨銈掑彇寰�'
+  name='#parameters'
+/>
+<Row>
+  <Col>
+    銉氥兗銈搁枊濮嬫檪銇�佹鑳姐�佸叆鍔涖儜銉┿儭銉笺偪鍚嶃�併偪銈ゃ儣銆併儑銉曘偐銉儓鍊ゃ仾銇┿伄鎯呭牨銈掑彇寰椼仚銈嬨仧銈併伀浣跨敤銇曘倢銇俱仚銆�
+
+    ### 銉偣銉濄兂銈�
+    - `opening_statement` (string) 闁嬪鏂�
+    - `suggested_questions` (array[string]) 闁嬪鏅傘伄鎻愭璩晱銉偣銉�
+    - `suggested_questions_after_answer` (object) 鍥炵瓟寰屻伄鎻愭璩晱銈掓湁鍔广伀銇椼伨銇欍��
+      - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+    - `speech_to_text` (object) 闊冲0銇嬨倝銉嗐偔銈广儓
+      - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+    - `retriever_resource` (object) 寮曠敤銇ㄥ赴灞�
+      - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+    - `annotation_reply` (object) 娉ㄩ噲浠樸亶杩斾俊
+      - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+    - `user_input_form` (array[object]) 銉︺兗銈躲兗鍏ュ姏銉曘偐銉笺儬瑷畾
+      - `text-input` (object) 銉嗐偔銈广儓鍏ュ姏銈炽兂銉堛儹銉笺儷
+        - `label` (string) 澶夋暟琛ㄧず銉┿儥銉悕
+        - `variable` (string) 澶夋暟ID
+        - `required` (bool) 蹇呴爤銇嬨仼銇嗐亱
+        - `default` (string) 銉囥儠銈┿儷銉堝��
+      - `paragraph` (object) 娈佃惤銉嗐偔銈广儓鍏ュ姏銈炽兂銉堛儹銉笺儷
+        - `label` (string) 澶夋暟琛ㄧず銉┿儥銉悕
+        - `variable` (string) 澶夋暟ID
+        - `required` (bool) 蹇呴爤銇嬨仼銇嗐亱
+        - `default` (string) 銉囥儠銈┿儷銉堝��
+      - `select` (object) 銉夈儹銉冦儣銉�銈︺兂銈炽兂銉堛儹銉笺儷
+        - `label` (string) 澶夋暟琛ㄧず銉┿儥銉悕
+        - `variable` (string) 澶夋暟ID
+        - `required` (bool) 蹇呴爤銇嬨仼銇嗐亱
+        - `default` (string) 銉囥儠銈┿儷銉堝��
+        - `options` (array[string]) 銈儣銈枫儳銉冲��
+    - `file_upload` (object) 銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔瑷畾
+      - `image` (object) 鐢诲儚瑷畾
+        鐝惧湪銇敾鍍忋偪銈ゃ儣銇伩瀵惧繙锛歚png`銆乣jpg`銆乣jpeg`銆乣webp`銆乣gif`
+        - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+        - `number_limits` (int) 鐢诲儚鏁板埗闄愩�併儑銉曘偐銉儓銇�3
+        - `transfer_methods` (array[string]) 杌㈤�佹柟娉曘儶銈广儓銆乺emote_url銆乴ocal_file銆併亜銇氥倢銇嬨倰閬告姙
+    - `system_parameters` (object) 銈枫偣銉嗐儬銉戙儵銉°兗銈�
+      - `file_size_limit` (int) 銉夈偔銉ャ儭銉炽儓銈€儍銉椼儹銉笺儔銈点偆銈哄埗闄愶紙MB锛�
+      - `image_file_size_limit` (int) 鐢诲儚銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔銈点偆銈哄埗闄愶紙MB锛�
+      - `audio_file_size_limit` (int) 闊冲0銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔銈点偆銈哄埗闄愶紙MB锛�
+      - `video_file_size_limit` (int) 鍕曠敾銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔銈点偆銈哄埗闄愶紙MB锛�
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/parameters" targetCode={` curl -X GET '${props.appDetail.api_base_url}/parameters'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/parameters' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "opening_statement": "Hello!",
+      "suggested_questions_after_answer": {
+          "enabled": true
+      },
+      "speech_to_text": {
+          "enabled": true
+      },
+      "retriever_resource": {
+          "enabled": true
+      },
+      "annotation_reply": {
+          "enabled": true
+      },
+      "user_input_form": [
+          {
+              "paragraph": {
+                  "label": "Query",
+                  "variable": "query",
+                  "required": true,
+                  "default": ""
+              }
+          }
+      ],
+      "file_upload": {
+          "image": {
+              "enabled": false,
+              "number_limits": 3,
+              "detail": "high",
+              "transfer_methods": [
+                  "remote_url",
+                  "local_file"
+              ]
+          }
+      },
+      "system_parameters": {
+          "file_size_limit": 15,
+          "image_file_size_limit": 10,
+          "audio_file_size_limit": 50,
+          "video_file_size_limit": 100
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/site'
+  method='GET'
+  title='銈€儣銉伄WebApp瑷畾銈掑彇寰�'
+  name='#site'
+/>
+<Row>
+  <Col>
+  銈€儣銉伄WebApp瑷畾銈掑彇寰椼仚銈嬨仧銈併伀浣跨敤銇椼伨銇欍��
+  ### 銉偣銉濄兂銈�
+  - `title` (string) WebApp鍚�
+  - `chat_color_theme` (string) 銉併儯銉冦儓銇壊銉嗐兗銉炪��16閫叉暟褰㈠紡
+  - `chat_color_theme_inverted` (bool) 銉併儯銉冦儓銇壊銉嗐兗銉炪倰鍙嶈虎銇欍倠銇嬨仼銇嗐亱
+  - `icon_type` (string) 銈€偆銈炽兂銈裤偆銉椼�乣emoji`-绲垫枃瀛椼�乣image`-鐢诲儚
+  - `icon` (string) 銈€偆銈炽兂銆俙emoji`銈裤偆銉椼伄鍫村悎銇档鏂囧瓧銆乣image`銈裤偆銉椼伄鍫村悎銇敾鍍廢RL
+  - `icon_background` (string) 16閫叉暟褰㈠紡銇儗鏅壊
+  - `icon_url` (string) 銈€偆銈炽兂銇甎RL
+  - `description` (string) 瑾槑
+  - `copyright` (string) 钁椾綔妯╂儏鍫�
+  - `privacy_policy` (string) 銉椼儵銈ゃ儛銈枫兗銉濄儶銈枫兗銇儶銉炽偗
+  - `custom_disclaimer` (string) 銈偣銈裤儬鍏嶈铂浜嬮爡
+  - `default_language` (string) 銉囥儠銈┿儷銉堣█瑾�
+  - `show_workflow_steps` (bool) 銉兗銈儠銉兗銇┏绱般倰琛ㄧず銇欍倠銇嬨仼銇嗐亱
+  - `use_icon_as_answer_icon` (bool) WebApp銇偄銈ゃ偝銉炽倰銉併儯銉冦儓鍐呫伄馃銇疆銇嶆彌銇堛倠銇嬨仼銇嗐亱
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="POST" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/site' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/site' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "title": "My App",
+      "chat_color_theme": "#ff4a4a",
+      "chat_color_theme_inverted": false,
+      "icon_type": "emoji",
+      "icon": "馃槃",
+      "icon_background": "#FFEAD5",
+      "icon_url": null,
+      "description": "This is my app.",
+      "copyright": "all rights reserved",
+      "privacy_policy": "",
+      "custom_disclaimer": "All generated by AI",
+      "default_language": "en-US",
+      "show_workflow_steps": false,
+      "use_icon_as_answer_icon": false,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+___
diff --git a/app/components/develop/template/template.zh.mdx b/app/components/develop/template/template.zh.mdx
new file mode 100644
index 0000000..df83684
--- /dev/null
+++ b/app/components/develop/template/template.zh.mdx
@@ -0,0 +1,967 @@
+import { CodeGroup } from '../code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty } from '../md.tsx'
+
+# 鏂囨湰鐢熸垚鍨嬪簲鐢� API
+
+鏂囨湰鐢熸垚搴旂敤鏃犱細璇濇敮鎸侊紝閫傚悎鐢ㄤ簬缈昏瘧/鏂囩珷鍐欎綔/鎬荤粨 AI 绛夌瓑銆�
+
+<div>
+  ### 鍩虹 URL
+  <CodeGroup title="Code" targetCode={props.appDetail.api_base_url}>
+    ```javascript
+    ```
+  </CodeGroup>
+
+  ### 閴存潈
+
+
+  Dify Service API 浣跨敤 `API-Key` 杩涜閴存潈銆�
+  <i>**寮虹儓寤鸿寮�鍙戣�呮妸 `API-Key` 鏀惧湪鍚庣瀛樺偍锛岃�岄潪鍒嗕韩鎴栬�呮斁鍦ㄥ鎴风瀛樺偍锛屼互鍏� `API-Key` 娉勯湶锛屽鑷磋储浜ф崯澶便��**</i>
+  鎵�鏈� API 璇锋眰閮藉簲鍦� **`Authorization`** HTTP Header 涓寘鍚偍鐨� `API-Key`锛屽涓嬫墍绀猴細
+
+  <CodeGroup title="Code">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+    ```
+  </CodeGroup>
+</div>
+
+---
+
+<Heading
+  url='/completion-messages'
+  method='POST'
+  title='鍙戦�佹秷鎭�'
+  name='#Create-Completion-Message'
+/>
+<Row>
+  <Col>
+    鍙戦�佽姹傜粰鏂囨湰鐢熸垚鍨嬪簲鐢ㄣ��
+
+    ### Request Body
+
+    <Properties>
+      <Property name='inputs' type='object' key='inputs'>
+        (閫夊~)鍏佽浼犲叆 App 瀹氫箟鐨勫悇鍙橀噺鍊笺��
+  inputs 鍙傛暟鍖呭惈浜嗗缁勯敭鍊煎锛圞ey/Value pairs锛夛紝姣忕粍鐨勯敭瀵瑰簲涓�涓壒瀹氬彉閲忥紝姣忕粍鐨勫�煎垯鏄鍙橀噺鐨勫叿浣撳�笺��
+  鏂囨湰鐢熸垚鍨嬪簲鐢ㄨ姹傝嚦灏戜紶鍏ヤ竴缁勯敭鍊煎銆�
+      - `query` (string) 蹇呭~
+        鐢ㄦ埛杈撳叆鐨勬枃鏈唴瀹广��
+      </Property>
+      <Property name='response_mode' type='string' key='response_mode'>
+        - `streaming` 娴佸紡妯″紡锛堟帹鑽愶級銆傚熀浜� SSE锛�**[Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)**锛夊疄鐜扮被浼兼墦瀛楁満杈撳嚭鏂瑰紡鐨勬祦寮忚繑鍥炪��
+        - `blocking` 闃诲妯″紡锛岀瓑寰呮墽琛屽畬姣曞悗杩斿洖缁撴灉銆傦紙璇锋眰鑻ユ祦绋嬭緝闀垮彲鑳戒細琚腑鏂級銆�
+        <i>鐢变簬 Cloudflare 闄愬埗锛岃姹備細鍦� 100 绉掕秴鏃舵棤杩斿洖鍚庝腑鏂��</i>
+      </Property>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敤浜庡畾涔夌粓绔敤鎴风殑韬唤锛屾柟渚挎绱€�佺粺璁°��
+        鐢卞紑鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+      <Property name='files' type='array[object]' key='files'>
+          涓婁紶鐨勬枃浠躲��
+          - `type` (string) 鏀寔绫诲瀷锛氬浘鐗� `image`锛堢洰鍓嶄粎鏀寔鍥剧墖鏍煎紡锛� 銆�
+          - `transfer_method` (string)  浼犻�掓柟寮�:
+            - `remote_url`: 鍥剧墖鍦板潃銆�
+            - `local_file`: 涓婁紶鏂囦欢銆�
+          - `url` 鍥剧墖鍦板潃銆傦紙浠呭綋浼犻�掓柟寮忎负 `remote_url` 鏃讹級銆�
+          - `upload_file_id` 涓婁紶鏂囦欢 ID銆傦紙浠呭綋浼犻�掓柟寮忎负 `local_file `鏃讹級銆�
+      </Property>
+    </Properties>
+
+    ### Response
+    <Properties>
+    褰� `response_mode` 涓� `blocking` 鏃讹紝杩斿洖 ChatCompletionResponse object銆�
+    褰� `response_mode` 涓� `streaming`鏃讹紝杩斿洖 ChunkChatCompletionResponse object 娴佸紡搴忓垪銆�
+
+    ### ChatCompletionResponse
+    杩斿洖瀹屾暣鐨� App 缁撴灉锛宍Content-Type` 涓� `application/json`銆�
+    - `message_id` (string) 娑堟伅鍞竴 ID
+    - `mode` (string) App 妯″紡锛屽浐瀹氫负 chat
+    - `answer` (string) 瀹屾暣鍥炲鍐呭
+    - `metadata` (object) 鍏冩暟鎹�
+      - `usage` (Usage) 妯″瀷鐢ㄩ噺淇℃伅
+      - `retriever_resources` (array[RetrieverResource]) 寮曠敤鍜屽綊灞炲垎娈靛垪琛�
+    - `created_at` (int) 娑堟伅鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+
+    ### ChunkChatCompletionResponse
+    杩斿洖 App 杈撳嚭鐨勬祦寮忓潡锛宍Content-Type` 涓� `text/event-stream`銆�
+    姣忎釜娴佸紡鍧楀潎涓� data: 寮�澶达紝鍧椾箣闂翠互 `\n\n` 鍗充袱涓崲琛岀鍒嗛殧锛屽涓嬫墍绀猴細
+    <CodeGroup>
+    ```streaming {{ title: 'Response' }}
+    data: {"event": "message", "task_id": "900bbd43-dc0b-4383-a372-aa6e6c414227", "id": "663c5084-a254-4040-8ad3-51f2a3c1a77c", "answer": "Hi", "created_at": 1705398420}\n\n
+    ```
+    </CodeGroup>
+    娴佸紡鍧椾腑鏍规嵁 `event` 涓嶅悓锛岀粨鏋勪篃涓嶅悓锛�
+    - `event: message` LLM 杩斿洖鏂囨湰鍧椾簨浠讹紝鍗筹細瀹屾暣鐨勬枃鏈互鍒嗗潡鐨勬柟寮忚緭鍑恒��
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `answer` (string) LLM 杩斿洖鏂囨湰鍧楀唴瀹�
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: message_end` 娑堟伅缁撴潫浜嬩欢锛屾敹鍒版浜嬩欢鍒欎唬琛ㄦ枃鏈祦寮忚繑鍥炵粨鏉熴��
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `metadata` (object) 鍏冩暟鎹�
+        - `usage` (Usage) 妯″瀷鐢ㄩ噺淇℃伅
+        - `retriever_resources` (array[RetrieverResource]) 寮曠敤鍜屽綊灞炲垎娈靛垪琛�
+    - `event: tts_message` TTS 闊抽娴佷簨浠讹紝鍗筹細璇煶鍚堟垚杈撳嚭銆傚唴瀹规槸Mp3鏍煎紡鐨勯煶棰戝潡锛屼娇鐢� base64 缂栫爜鍚庣殑瀛楃涓诧紝鎾斁鐨勬椂鍊欑洿鎺ヨВ鐮佸嵆鍙��(寮�鍚嚜鍔ㄦ挱鏀炬墠鏈夋娑堟伅)
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `audio` (string) 璇煶鍚堟垚涔嬪悗鐨勯煶棰戝潡浣跨敤 Base64 缂栫爜涔嬪悗鐨勬枃鏈唴瀹癸紝鎾斁鐨勬椂鍊欑洿鎺� base64 瑙g爜閫佸叆鎾斁鍣ㄥ嵆鍙�
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: tts_message_end` TTS 闊抽娴佺粨鏉熶簨浠讹紝鏀跺埌杩欎釜浜嬩欢琛ㄧず闊抽娴佽繑鍥炵粨鏉熴��
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `audio` (string) 缁撴潫浜嬩欢鏄病鏈夐煶棰戠殑锛屾墍浠ヨ繖閲屾槸绌哄瓧绗︿覆
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: message_replace` 娑堟伅鍐呭鏇挎崲浜嬩欢銆�
+      寮�鍚唴瀹瑰鏌ュ拰瀹℃煡杈撳嚭鍐呭鏃讹紝鑻ュ懡涓簡瀹℃煡鏉′欢锛屽垯浼氶�氳繃姝や簨浠舵浛鎹㈡秷鎭唴瀹逛负棰勮鍥炲銆�
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `answer` (string) 鏇挎崲鍐呭锛堢洿鎺ユ浛鎹� LLM 鎵�鏈夊洖澶嶆枃鏈級
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: error`
+      娴佸紡杈撳嚭杩囩▼涓嚭鐜扮殑寮傚父浼氫互 stream event 褰㈠紡杈撳嚭锛屾敹鍒板紓甯镐簨浠跺悗鍗崇粨鏉熴��
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `status` (int) HTTP 鐘舵�佺爜
+      - `code` (string) 閿欒鐮�
+      - `message` (string) 閿欒娑堟伅
+    - `event: ping` 姣� 10s 涓�娆$殑 ping 浜嬩欢锛屼繚鎸佽繛鎺ュ瓨娲汇��
+
+    ### Errors
+    - 404锛屽璇濅笉瀛樺湪
+    - 400锛宍invalid_param`锛屼紶鍏ュ弬鏁板紓甯�
+    - 400锛宍app_unavailable`锛孉pp 閰嶇疆涓嶅彲鐢�
+    - 400锛宍provider_not_initialize`锛屾棤鍙敤妯″瀷鍑嵁閰嶇疆
+    - 400锛宍provider_quota_exceeded`锛屾ā鍨嬭皟鐢ㄩ搴︿笉瓒�
+    - 400锛宍model_currently_not_support`锛屽綋鍓嶆ā鍨嬩笉鍙敤
+    - 400锛宍completion_request_error`锛屾枃鏈敓鎴愬け璐�
+    - 500锛屾湇鍔″唴閮ㄥ紓甯�
+
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/completion-messages" targetCode={`curl -X POST '${props.appDetail.api_base_url}/completion-messages' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "inputs": {"query": "Hello, world!"},\n    "response_mode": "streaming",\n    "user": "abc-123"\n}'\n`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/completion-messages' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "inputs": {
+          "query": "Hello, world!"
+        },
+        "response_mode": "streaming",
+        "user": "abc-123"
+    }'
+    ```
+    </CodeGroup>
+    ### blocking
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "0b089b9a-24d9-48cc-94f8-762677276261",
+      "answer": "how are you?",
+      "created_at": 1679586667
+    }
+    ```
+    </CodeGroup>
+    ### streaming
+    <CodeGroup title="Response">
+    ```streaming {{ title: 'Response' }}
+      data: {"id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " I", "created_at": 1679586595}
+      data: {"id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "answer": " I", "created_at": 1679586595}
+      data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+      data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/files/upload'
+  method='POST'
+  title='涓婁紶鏂囦欢'
+  name='#files-upload'
+/>
+<Row>
+  <Col>
+    涓婁紶鏂囦欢锛堢洰鍓嶄粎鏀寔鍥剧墖锛夊苟鍦ㄥ彂閫佹秷鎭椂浣跨敤锛屽彲瀹炵幇鍥炬枃澶氭ā鎬佺悊瑙c��
+    鏀寔 png, jpg, jpeg, webp, gif 鏍煎紡銆�
+    <i>涓婁紶鐨勬枃浠朵粎渚涘綋鍓嶇粓绔敤鎴蜂娇鐢ㄣ��</i>
+
+    ### Request Body
+    璇ユ帴鍙i渶浣跨敤  `multipart/form-data` 杩涜璇锋眰銆�
+    <Properties>
+      <Property name='file' type='file' key='file'>
+        瑕佷笂浼犵殑鏂囦欢銆�
+      </Property>
+      <Property name='user' type='string' key='user'>
+          鐢ㄦ埛鏍囪瘑锛岀敤浜庡畾涔夌粓绔敤鎴风殑韬唤锛屽繀椤诲拰鍙戦�佹秷鎭帴鍙d紶鍏� user 淇濇寔涓�鑷淬��
+      </Property>
+    </Properties>
+
+    ### Response
+    鎴愬姛涓婁紶鍚庯紝鏈嶅姟鍣ㄤ細杩斿洖鏂囦欢鐨� ID 鍜岀浉鍏充俊鎭��
+    - `id` (uuid) ID
+    - `name` (string) 鏂囦欢鍚�
+    - `size` (int) 鏂囦欢澶у皬锛坆yte锛�
+    - `extension` (string) 鏂囦欢鍚庣紑
+    - `mime_type` (string) 鏂囦欢 mime-type
+    - `created_by` (uuid) 涓婁紶浜� ID
+    - `created_at` (timestamp) 涓婁紶鏃堕棿
+
+    ### Errors
+    - 400锛宍no_file_uploaded`锛屽繀椤绘彁渚涙枃浠�
+    - 400锛宍too_many_files`锛岀洰鍓嶅彧鎺ュ彈涓�涓枃浠�
+    - 400锛宍unsupported_preview`锛岃鏂囦欢涓嶆敮鎸侀瑙�
+    - 400锛宍unsupported_estimate`锛岃鏂囦欢涓嶆敮鎸佷及绠�
+    - 413锛宍file_too_large`锛屾枃浠跺お澶�
+    - 415锛宍unsupported_file_type`锛屼笉鏀寔鐨勬墿灞曞悕锛屽綋鍓嶅彧鎺ュ彈鏂囨。绫绘枃浠�
+    - 503锛宍s3_connection_failed`锛屾棤娉曡繛鎺ュ埌 S3 鏈嶅姟
+    - 503锛宍s3_permission_denied`锛屾棤鏉冮檺涓婁紶鏂囦欢鍒� S3
+    - 503锛宍s3_file_too_large`锛屾枃浠惰秴鍑� S3 澶у皬闄愬埗
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/files/upload" targetCode={`curl -X POST '${props.appDetail.api_base_url}/files/upload' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=image/[png|jpeg|jpg|webp|gif] \\\n--form 'user=abc-123'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/files/upload' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@"/path/to/file"'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "72fa9618-8f89-4a37-9b33-7e1178a24a67",
+      "name": "example.png",
+      "size": 1024,
+      "extension": "png",
+      "mime_type": "image/png",
+      "created_by": 123,
+      "created_at": 1577836800,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+<Heading
+  url='/completion-messages/:task_id/stop'
+  method='POST'
+  title='鍋滄鍝嶅簲'
+  name='#Stop'
+/>
+<Row>
+  <Col>
+  浠呮敮鎸佹祦寮忔ā寮忋��
+  ### Path
+  - `task_id` (string) 浠诲姟 ID锛屽彲鍦ㄦ祦寮忚繑鍥� Chunk 涓幏鍙�
+
+  ### Request Body
+  - `user` (string) Required
+    鐢ㄦ埛鏍囪瘑锛岀敤浜庡畾涔夌粓绔敤鎴风殑韬唤锛屽繀椤诲拰鍙戦�佹秷鎭帴鍙d紶鍏� user 淇濇寔涓�鑷淬��
+  ### Response
+  - `result` (string) 鍥哄畾杩斿洖 success
+  </Col>
+  <Col sticky>
+  <CodeGroup title="Request" tag="POST" label="/completion-messages/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/completion-messages/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{ "user": "abc-123"}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/completion-messages/:task_id/stop' \
+    -H 'Authorization: Bearer {api_key}' \
+    -H 'Content-Type: application/json' \
+    --data-raw '{
+        "user": "abc-123"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/messages/:message_id/feedbacks'
+  method='POST'
+  title='娑堟伅鍙嶉锛堢偣璧烇級'
+  name='#feedbacks'
+/>
+<Row>
+  <Col>
+    娑堟伅缁堢鐢ㄦ埛鍙嶉銆佺偣璧烇紝鏂逛究搴旂敤寮�鍙戣�呬紭鍖栬緭鍑洪鏈熴��
+
+    ### Path Params
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+       娑堟伅 ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+
+    <Properties>
+      <Property name='rating' type='string' key='rating'>
+         鐐硅禐 like, 鐐硅俯 dislike,  鎾ら攢鐐硅禐 null
+      </Property>
+      <Property name='user' type='string' key='user'>
+          鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+      <Property name='content' type='string' key='content'>
+          娑堟伅鍙嶉鐨勫叿浣撲俊鎭��
+      </Property>
+    </Properties>
+
+    ### Response
+    - `result` (string) 鍥哄畾杩斿洖 success
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/messages/:message_id/feedbacks" targetCode={`curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "rating": "like",\n    "user": "abc-123",\n    "content": "message feedback information"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "rating": "like",
+        "user": "abc-123",
+        "content": "message feedback information"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/app/feedbacks'
+  method='GET'
+  title='Get feedbacks of application'
+  name='#app-feedbacks'
+/>
+<Row>
+  <Col>
+    Get application's feedbacks.
+
+    ### Query
+    <Properties>
+      <Property name='page' type='string' key='page'>
+       锛坥ptional锛塸agination锛宒efault锛�1
+      </Property>
+    </Properties>
+
+    <Properties>
+      <Property name='limit' type='string' key='limit'>
+       锛坥ptional锛� records per page default锛�20
+      </Property>
+    </Properties>
+
+    ### Response
+    - `data` (List) return apps feedback list.
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/app/feedbacks" targetCode={`curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+      {
+          "data": [
+              {
+                  "id": "8c0fbed8-e2f9-49ff-9f0e-15a35bdd0e25",
+                  "app_id": "f252d396-fe48-450e-94ec-e184218e7346",
+                  "conversation_id": "2397604b-9deb-430e-b285-4726e51fd62d",
+                  "message_id": "709c0b0f-0a96-4a4e-91a4-ec0889937b11",
+                  "rating": "like",
+                  "content": "message feedback information-3",
+                  "from_source": "user",
+                  "from_end_user_id": "74286412-9a1a-42c1-929c-01edb1d381d5",
+                  "from_account_id": null,
+                  "created_at": "2025-04-24T09:24:38",
+                  "updated_at": "2025-04-24T09:24:38"
+              }
+          ]
+      }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/text-to-audio'
+  method='POST'
+  title='鏂囧瓧杞闊�'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    鏂囧瓧杞闊炽��
+
+    ### Request Body
+
+    <Properties>
+      <Property name='message_id' type='str' key='message_id'>
+        Dify 鐢熸垚鐨勬枃鏈秷鎭紝閭d箞鐩存帴浼犻�掔敓鎴愮殑message-id 鍗冲彲锛屽悗鍙颁細閫氳繃 message_id 鏌ユ壘鐩稿簲鐨勫唴瀹圭洿鎺ュ悎鎴愯闊充俊鎭�傚鏋滃悓鏃朵紶 message_id 鍜� text锛屼紭鍏堜娇鐢� message_id銆�
+      </Property>
+      <Property name='text' type='str' key='text'>
+        璇煶鐢熸垚鍐呭銆傚鏋滄病鏈変紶 message-id鐨勮瘽锛屽垯浼氫娇鐢ㄨ繖涓瓧娈电殑鍐呭
+      </Property>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/text-to-audio" targetCode={`curl -o text-to-audio.mp3 -X POST '${props.appDetail.api_base_url}/text-to-audio' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290",\n    "text": "浣犲ソDify",\n    "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -o text-to-audio.mp3 -X POST '${props.appDetail.api_base_url}/text-to-audio' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290",
+        "text": "浣犲ソDify",
+        "user": "abc-123",
+        "streaming": false
+    }'
+    ```
+    
+    </CodeGroup>
+
+    <CodeGroup title="headers">
+    ```json {{ title: 'headers' }}
+    {
+      "Content-Type": "audio/wav"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/info'
+  method='GET'
+  title='鑾峰彇搴旂敤鍩烘湰淇℃伅'
+  name='#info'
+/>
+<Row>
+  <Col>
+  鐢ㄤ簬鑾峰彇搴旂敤鐨勫熀鏈俊鎭�
+  ### Response
+  - `name` (string) 搴旂敤鍚嶇О
+  - `description` (string) 搴旂敤鎻忚堪
+  - `tags` (array[string]) 搴旂敤鏍囩
+  </Col>
+  <Col>
+    <CodeGroup title="Request" tag="GET" label="/info" targetCode={`curl -X GET '${props.appDetail.api_base_url}/info' \\\n-H 'Authorization: Bearer {api_key}'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/info' \
+      -H 'Authorization: Bearer {api_key}'
+      ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "name": "My App",
+      "description": "This is my app.",
+      "tags": [
+        "tag1",
+        "tag2"
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/parameters'
+  method='GET'
+  title='鑾峰彇搴旂敤鍙傛暟'
+  name='#parameters'
+/>
+<Row>
+  <Col>
+    鐢ㄤ簬杩涘叆椤甸潰涓�寮�濮嬶紝鑾峰彇鍔熻兘寮�鍏炽�佽緭鍏ュ弬鏁板悕绉般�佺被鍨嬪強榛樿鍊肩瓑浣跨敤銆�
+
+    ### Response
+    - `opening_statement` (string) 寮�鍦虹櫧
+    - `suggested_questions` (array[string]) 寮�鍦烘帹鑽愰棶棰樺垪琛�
+    - `suggested_questions_after_answer` (object) 鍚敤鍥炵瓟鍚庣粰鍑烘帹鑽愰棶棰樸��
+      - `enabled` (bool) 鏄惁寮�鍚�
+    - `speech_to_text` (object) 璇煶杞枃鏈�
+      - `enabled` (bool) 鏄惁寮�鍚�
+    - `retriever_resource` (object) 寮曠敤鍜屽綊灞�
+      - `enabled` (bool) 鏄惁寮�鍚�
+    - `annotation_reply` (object) 鏍囪鍥炲
+      - `enabled` (bool) 鏄惁寮�鍚�
+    - `user_input_form` (array[object]) 鐢ㄦ埛杈撳叆琛ㄥ崟閰嶇疆
+      - `text-input` (object) 鏂囨湰杈撳叆鎺т欢
+        - `label` (string) 鎺т欢灞曠ず鏍囩鍚�
+        - `variable` (string) 鎺т欢 ID
+        - `required` (bool) 鏄惁蹇呭~
+        - `default` (string) 榛樿鍊�
+      - `paragraph` (object) 娈佃惤鏂囨湰杈撳叆鎺т欢
+        - `label` (string) 鎺т欢灞曠ず鏍囩鍚�
+        - `variable` (string) 鎺т欢 ID
+        - `required` (bool) 鏄惁蹇呭~
+        - `default` (string) 榛樿鍊�
+      - `select` (object) 涓嬫媺鎺т欢
+        - `label` (string) 鎺т欢灞曠ず鏍囩鍚�
+        - `variable` (string) 鎺т欢 ID
+        - `required` (bool) 鏄惁蹇呭~
+        - `default` (string) 榛樿鍊�
+        - `options` (array[string]) 閫夐」鍊�
+    - `file_upload` (object) 鏂囦欢涓婁紶閰嶇疆
+      - `image` (object) 鍥剧墖璁剧疆
+        褰撳墠浠呮敮鎸佸浘鐗囩被鍨嬶細`png`, `jpg`, `jpeg`, `webp`, `gif`
+        - `enabled` (bool) 鏄惁寮�鍚�
+        - `number_limits` (int) 鍥剧墖鏁伴噺闄愬埗锛岄粯璁� 3
+        - `transfer_methods` (array[string]) 浼犻�掓柟寮忓垪琛紝remote_url , local_file锛屽繀閫変竴涓�
+    - `system_parameters` (object) 绯荤粺鍙傛暟
+      - `file_size_limit` (int) 鏂囨。涓婁紶澶у皬闄愬埗 (MB)
+      - `image_file_size_limit` (int) 鍥剧墖鏂囦欢涓婁紶澶у皬闄愬埗锛圡B锛�
+      - `audio_file_size_limit` (int) 闊抽鏂囦欢涓婁紶澶у皬闄愬埗 (MB)
+      - `video_file_size_limit` (int) 瑙嗛鏂囦欢涓婁紶澶у皬闄愬埗 (MB)
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/parameters" targetCode={` curl -X GET '${props.appDetail.api_base_url}/parameters'\\\n--header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/parameters' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "introduction": "nice to meet you",
+      "user_input_form": [
+        {
+          "text-input": {
+            "label": "a",
+            "variable": "a",
+            "required": true,
+            "max_length": 48,
+            "default": ""
+          }
+        },
+        {
+          // ...
+        }
+      ],
+      "file_upload": {
+        "image": {
+          "enabled": true,
+          "number_limits": 3,
+          "transfer_methods": [
+            "remote_url",
+            "local_file"
+          ]
+        }
+      },
+      "system_parameters": {
+          "file_size_limit": 15,
+          "image_file_size_limit": 10,
+          "audio_file_size_limit": 50,
+          "video_file_size_limit": 100
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/site'
+  method='GET'
+  title='鑾峰彇搴旂敤 WebApp 璁剧疆'
+  name='#site'
+/>
+<Row>
+  <Col>
+  鐢ㄤ簬鑾峰彇搴旂敤鐨� WebApp 璁剧疆
+  ### Response
+  - `title` (string) WebApp 鍚嶇О
+  - `chat_color_theme` (string) 鑱婂ぉ棰滆壊涓婚, hex 鏍煎紡
+  - `chat_color_theme_inverted` (bool) 鑱婂ぉ棰滆壊涓婚鏄惁鍙嶈浆
+  - `icon_type` (string) 鍥炬爣绫诲瀷, `emoji`-琛ㄦ儏, `image`-鍥剧墖
+  - `icon` (string) 鍥炬爣, 濡傛灉鏄� `emoji` 绫诲瀷, 鍒欐槸 emoji 琛ㄦ儏绗﹀彿, 濡傛灉鏄� `image` 绫诲瀷, 鍒欐槸鍥剧墖 URL
+  - `icon_background` (string) hex 鏍煎紡鐨勮儗鏅壊
+  - `icon_url` (string) 鍥炬爣 URL
+  - `description` (string) 鎻忚堪
+  - `copyright` (string) 鐗堟潈淇℃伅
+  - `privacy_policy` (string) 闅愮鏀跨瓥閾炬帴
+  - `custom_disclaimer` (string) 鑷畾涔夊厤璐e0鏄�
+  - `default_language` (string) 榛樿璇█
+  - `show_workflow_steps` (bool) 鏄惁鏄剧ず宸ヤ綔娴佽鎯�
+  - `use_icon_as_answer_icon` (bool) 鏄惁浣跨敤 WebApp 鍥炬爣鏇挎崲鑱婂ぉ涓殑 馃
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="POST" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/site' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/site' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "title": "My App",
+      "chat_color_theme": "#ff4a4a",
+      "chat_color_theme_inverted": false,
+      "icon_type": "emoji",
+      "icon": "馃槃",
+      "icon_background": "#FFEAD5",
+      "icon_url": null,
+      "description": "This is my app.",
+      "copyright": "all rights reserved",
+      "privacy_policy": "",
+      "custom_disclaimer": "All generated by AI",
+      "default_language": "en-US",
+      "show_workflow_steps": false,
+      "use_icon_as_answer_icon": false,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+___
+
+<Heading
+  url='/apps/annotations'
+  method='GET'
+  title='鑾峰彇鏍囨敞鍒楄〃'
+  name='#annotation_list'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='page' type='string' key='page'>
+        椤电爜
+      </Property>
+      <Property name='limit' type='string' key='limit'>
+        姣忛〉鏁伴噺
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/apps/annotations"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/apps/annotations?page=1&limit=20' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/apps/annotations?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [
+        {
+          "id": "69d48372-ad81-4c75-9c46-2ce197b4d402",
+          "question": "What is your name?",
+          "answer": "I am Dify.",
+          "hit_count": 0,
+          "created_at": 1735625869
+        }
+      ],
+      "has_more": false,
+      "limit": 20,
+      "total": 1,
+      "page": 1
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotations'
+  method='POST'
+  title='鍒涘缓鏍囨敞'
+  name='#create_annotation'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='question' type='string' key='question'>
+        闂
+      </Property>
+      <Property name='answer' type='string' key='answer'>
+        绛旀鍐呭
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/apps/annotations"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/apps/annotations' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"question": "What is your name?","answer": "I am Dify."}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/apps/annotations' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "question": "What is your name?",
+        "answer": "I am Dify."
+    }'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "69d48372-ad81-4c75-9c46-2ce197b4d402",
+      "question": "What is your name?",
+      "answer": "I am Dify.",
+      "hit_count": 0,
+      "created_at": 1735625869
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotations/{annotation_id}'
+  method='PUT'
+  title='鏇存柊鏍囨敞'
+  name='#update_annotation'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='annotation_id' type='string' key='annotation_id'>
+        鏍囨敞 ID
+      </Property>
+      <Property name='question' type='string' key='question'>
+        闂
+      </Property>
+      <Property name='answer' type='string' key='answer'>
+        绛旀鍐呭
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="PUT"
+      label="/apps/annotations/{annotation_id}"
+      targetCode={`curl --location --request PUT '${props.apiBaseUrl}/apps/annotations/{annotation_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"question": "What is your name?","answer": "I am Dify."}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request PUT '${props.apiBaseUrl}/apps/annotations/{annotation_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "question": "What is your name?",
+        "answer": "I am Dify."
+    }'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "69d48372-ad81-4c75-9c46-2ce197b4d402",
+      "question": "What is your name?",
+      "answer": "I am Dify.",
+      "hit_count": 0,
+      "created_at": 1735625869
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotations/{annotation_id}'
+  method='DELETE'
+  title='鍒犻櫎鏍囨敞'
+  name='#delete_annotation'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='annotation_id' type='string' key='annotation_id'>
+        鏍囨敞 ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="PUT"
+      label="/apps/annotations/{annotation_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/apps/annotations/{annotation_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/apps/annotations/{annotation_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotation-reply/{action}'
+  method='POST'
+  title='鏍囨敞鍥炲鍒濆璁剧疆'
+  name='#initial_annotation_reply_settings'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='action' type='string' key='action'>
+        鍔ㄤ綔锛屽彧鑳芥槸 'enable' 鎴� 'disable'
+      </Property>
+      <Property name='embedding_provider_name' type='string' key='embedding_provider_name'>
+        鎸囧畾鐨勫祵鍏ユā鍨嬫彁渚涘晢, 蹇呴』鍏堝湪绯荤粺鍐呰瀹氬ソ鎺ュ叆鐨勬ā鍨嬶紝瀵瑰簲鐨勬槸provider瀛楁
+      </Property>
+      <Property name='embedding_model_name' type='string' key='embedding_model_name'>
+        鎸囧畾鐨勫祵鍏ユā鍨嬶紝瀵瑰簲鐨勬槸model瀛楁
+      </Property>
+      <Property name='score_threshold' type='number' key='score_threshold'>
+        鐩镐技搴﹂槇鍊硷紝褰撶浉浼煎害澶т簬璇ラ槇鍊兼椂锛岀郴缁熶細鑷姩鍥炲锛屽惁鍒欎笉鍥炲
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    宓屽叆妯″瀷鐨勬彁渚涘晢鍜屾ā鍨嬪悕绉板彲浠ラ�氳繃浠ヤ笅鎺ュ彛鑾峰彇锛歷1/workspaces/current/models/model-types/text-embedding锛� 鍏蜂綋瑙侊細閫氳繃 API 缁存姢鐭ヨ瘑搴撱�� 浣跨敤鐨凙uthorization鏄疍ataset鐨凙PI Token銆�
+    璇ユ帴鍙f槸寮傛鎵ц锛屾墍浠ヤ細杩斿洖涓�涓猨ob_id锛岄�氳繃鏌ヨjob鐘舵�佹帴鍙e彲浠ヨ幏鍙栧埌鏈�缁堢殑鎵ц缁撴灉銆�
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/apps/annotation-reply/{action}"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/apps/annotation-reply/{action}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"score_threshold": 0.9, "embedding_provider_name": "zhipu", "embedding_model_name": "embedding_3"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST 'https://api.dify.ai/v1/apps/annotation-reply/{action}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "score_threshold": 0.9,
+        "embedding_provider_name": "zhipu",
+        "embedding_model_name": "embedding_3"
+    }'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "job_id": "b15c8f68-1cf4-4877-bf21-ed7cf2011802",
+      "job_status": "waiting"
+    }
+    ```
+    
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotation-reply/{action}/status/{job_id}'
+  method='GET'
+  title='鏌ヨ鏍囨敞鍥炲鍒濆璁剧疆浠诲姟鐘舵��'
+  name='#initial_annotation_reply_settings_task_status'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+    <Property name='action' type='string' key='action'>
+        鍔ㄤ綔锛屽彧鑳芥槸 'enable' 鎴� 'disable'锛屽苟涓斿繀椤诲拰鏍囨敞鍥炲鍒濆璁剧疆鎺ュ彛鐨勫姩浣滀竴鑷�
+      </Property>
+      <Property name='job_id' type='string' key='job_id'>
+        浠诲姟 ID锛屼粠鏍囨敞鍥炲鍒濆璁剧疆鎺ュ彛杩斿洖鐨� job_id
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/apps/annotations"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/apps/annotation-reply/{action}/status/{job_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/apps/annotation-reply/{action}/status/{job_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "job_id": "b15c8f68-1cf4-4877-bf21-ed7cf2011802",
+      "job_status": "waiting",
+      "error_msg": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
diff --git a/app/components/develop/template/template_advanced_chat.en.mdx b/app/components/develop/template/template_advanced_chat.en.mdx
new file mode 100644
index 0000000..f460949
--- /dev/null
+++ b/app/components/develop/template/template_advanced_chat.en.mdx
@@ -0,0 +1,1660 @@
+import { CodeGroup } from '../code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty, Paragraph } from '../md.tsx'
+
+# Advanced Chat App API
+
+Chat applications support session persistence, allowing previous chat history to be used as context for responses. This can be applicable for chatbot, customer service AI, etc.
+
+<div>
+  ### Base URL
+  <CodeGroup title="Code" targetCode={props.appDetail.api_base_url}>
+    ```javascript
+    ```
+  </CodeGroup>
+
+  ### Authentication
+
+  The Service API uses `API-Key` authentication.
+  <i>**Strongly recommend storing your API Key on the server-side, not shared or stored on the client-side, to avoid possible API-Key leakage that can lead to serious consequences.**</i>
+
+  For all API requests, include your API Key in the `Authorization`HTTP Header, as shown below:
+
+  <CodeGroup title="Code">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+
+    ```
+  </CodeGroup>
+</div>
+
+---
+
+<Heading
+  url='/chat-messages'
+  method='POST'
+  title='Send Chat Message'
+  name='#Send-Chat-Message'
+/>
+<Row>
+  <Col>
+    Send a request to the chat application.
+
+    ### Request Body
+
+    <Properties>
+      <Property name='query' type='string' key='query'>
+        User Input/Question content
+      </Property>
+      <Property name='inputs' type='object' key='inputs'>
+          Allows the entry of various variable values defined by the App.
+          The `inputs` parameter contains multiple key/value pairs, with each key corresponding to a specific variable and each value being the specific value for that variable.
+          If the variable is of file type, specify an object that has the keys described in `files` below.
+          Default `{}`
+      </Property>
+      <Property name='response_mode' type='string' key='response_mode'>
+        The mode of response return, supporting:
+        - `streaming` Streaming mode (recommended), implements a typewriter-like output through SSE ([Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)).
+        - `blocking` Blocking mode, returns result after execution is complete. (Requests may be interrupted if the process is long)
+        Due to Cloudflare restrictions, the request will be interrupted without a return after 100 seconds.
+      </Property>
+      <Property name='user' type='string' key='user'>
+          User identifier, used to define the identity of the end-user for retrieval and statistics.
+          Should be uniquely defined by the developer within the application.
+      </Property>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+      Conversation ID, to continue the conversation based on previous chat records, it is necessary to pass the previous message's conversation_id.
+      </Property>
+      <Property name='files' type='array[object]' key='files'>
+          File list, suitable for inputting files combined with text understanding and answering questions, available only when the model supports Vision capability.
+          - `type` (string) Supported type: 
+            - `document` ('TXT', 'MD', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB')
+            - `image` ('JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG')
+            - `audio` ('MP3', 'M4A', 'WAV', 'WEBM', 'AMR')
+            - `video` ('MP4', 'MOV', 'MPEG', 'MPGA')
+            - `custom` (Other file types)
+          - `transfer_method` (string) Transfer method, `remote_url` for image URL / `local_file` for file upload
+          - `url` (string) Image URL (when the transfer method is `remote_url`)
+          - `upload_file_id` (string) Uploaded file ID, which must be obtained by uploading through the File Upload API in advance (when the transfer method is `local_file`)
+      </Property>
+      <Property name='auto_generate_name' type='bool' key='auto_generate_name'>
+      Auto-generate title, default is `true`.
+      If set to `false`, can achieve async title generation by calling the conversation rename API and setting `auto_generate` to `true`.
+      </Property>
+    </Properties>
+
+    ### Response
+    When response_mode is blocking, return a CompletionResponse object.
+    When response_mode is streaming, return a ChunkCompletionResponse stream.
+
+    ### ChatCompletionResponse
+    Returns the complete App result, `Content-Type` is `application/json`.
+    - `event` (string) Event type, fixed to `message`
+    - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+    - `id` (string) unique ID
+    - `message_id` (string) Unique message ID
+    - `conversation_id` (string) Conversation ID
+    - `mode` (string) App mode, fixed as `chat`
+    - `answer` (string) Complete response content
+    - `metadata` (object) Metadata
+      - `usage` (Usage) Model usage information
+      - `retriever_resources` (array[RetrieverResource]) Citation and Attribution List
+    - `created_at` (int) Message creation timestamp, e.g., 1705395332
+
+    ### ChunkChatCompletionResponse
+    Returns the stream chunks outputted by the App, `Content-Type` is `text/event-stream`.
+    Each streaming chunk starts with `data:`, separated by two newline characters `\n\n`, as shown below:
+    <CodeGroup>
+    ```streaming {{ title: 'Response' }}
+    data: {"event": "message", "task_id": "900bbd43-dc0b-4383-a372-aa6e6c414227", "id": "663c5084-a254-4040-8ad3-51f2a3c1a77c", "answer": "Hi", "created_at": 1705398420}\n\n
+    ```
+    </CodeGroup>
+    The structure of the streaming chunks varies depending on the `event`:
+    - `event: message` LLM returns text chunk event, i.e., the complete text is output in a chunked fashion.
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `message_id` (string) Unique message ID
+      - `conversation_id` (string) Conversation ID
+      - `answer` (string) LLM returned text chunk content
+      - `created_at` (int) Creation timestamp, e.g., 1705395332
+    - `event: message_file` Message file event, a new file has created by tool
+      - `id` (string) File unique ID
+      - `type` (string) File type锛宱nly allow "image" currently
+      - `belongs_to` (string) Belongs to, it will only be an 'assistant' here
+      - `url` (string) Remote url of file
+      - `conversation_id`  (string) Conversation ID
+    - `event: message_end` Message end event, receiving this event means streaming has ended.
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `message_id` (string) Unique message ID
+      - `conversation_id` (string) Conversation ID
+      - `metadata` (object) Metadata
+        - `usage` (Usage) Model usage information
+        - `retriever_resources` (array[RetrieverResource]) Citation and Attribution List
+    - `event: tts_message` TTS audio stream event, that is, speech synthesis output. The content is an audio block in Mp3 format, encoded as a base64 string. When playing, simply decode the base64 and feed it into the player. (This message is available only when auto-play is enabled)
+      - `task_id` (string) Task ID, used for request tracking and the stop response interface below
+      - `message_id` (string) Unique message ID
+      - `audio` (string) The audio after speech synthesis, encoded in base64 text content, when playing, simply decode the base64 and feed it into the player
+      - `created_at` (int) Creation timestamp, e.g.: 1705395332
+    - `event: tts_message_end` TTS audio stream end event, receiving this event indicates the end of the audio stream.
+      - `task_id` (string) Task ID, used for request tracking and the stop response interface below
+      - `message_id` (string) Unique message ID
+      - `audio` (string) The end event has no audio, so this is an empty string
+      - `created_at` (int) Creation timestamp, e.g.: 1705395332
+    - `event: message_replace` Message content replacement event.
+      When output content moderation is enabled, if the content is flagged, then the message content will be replaced with a preset reply through this event.
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `message_id` (string) Unique message ID
+      - `conversation_id` (string) Conversation ID
+      - `answer` (string) Replacement content (directly replaces all LLM reply text)
+      - `created_at` (int) Creation timestamp, e.g., 1705395332
+    - `event: workflow_started` workflow starts execution
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `workflow_run_id` (string) Unique ID of workflow execution
+      - `event` (string) fixed to `workflow_started`
+      - `data` (object) detail
+        - `id` (string) Unique ID of workflow execution
+        - `workflow_id` (string) ID of related workflow
+        - `sequence_number` (int) Self-increasing serial number, self-increasing in the App, starting from 1
+        - `created_at` (timestamp) Creation timestamp, e.g., 1705395332
+    - `event: node_started` node execution started
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `workflow_run_id` (string) Unique ID of workflow execution
+      - `event` (string) fixed to `node_started`
+      - `data` (object) detail
+        - `id` (string) Unique ID of workflow execution
+        - `node_id` (string) ID of node
+        - `node_type` (string) type of node
+        - `title` (string) name of node
+        - `index` (int) Execution sequence number, used to display Tracing Node sequence
+        - `predecessor_node_id` (string) optional Prefix node ID, used for canvas display execution path
+        - `inputs` (object) Contents of all preceding node variables used in the node
+        - `created_at` (timestamp) timestamp of start, e.g., 1705395332
+    - `event: node_finished` node execution ends, success or failure in different states in the same event
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `workflow_run_id` (string) Unique ID of workflow execution
+      - `event` (string) fixed to `node_finished`
+      - `data` (object) detail
+        - `id` (string) Unique ID of workflow execution
+        - `node_id` (string) ID of node
+        - `node_type` (string) type of node
+        - `title` (string) name of node
+        - `index` (int) Execution sequence number, used to display Tracing Node sequence
+        - `predecessor_node_id` (string) optional Prefix node ID, used for canvas display execution path
+        - `inputs` (object) Contents of all preceding node variables used in the node
+        - `process_data` (json) Optional node process data
+        - `outputs` (json) Optional content of output
+        - `status` (string) status of execution, `running` / `succeeded` / `failed` / `stopped`
+        - `error` (string) Optional reason of error
+        - `elapsed_time` (float) Optional total seconds to be used
+        - `execution_metadata` (json) meta data
+          - `total_tokens` (int) optional tokens to be used
+          - `total_price` (decimal) optional Total cost
+          - `currency` (string) optional e.g. `USD` / `RMB`
+        - `created_at` (timestamp) timestamp of start, e.g., 1705395332
+    - `event: workflow_finished` workflow execution ends, success or failure in different states in the same event
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `workflow_run_id` (string) Unique ID of workflow execution
+      - `event` (string) fixed to `workflow_finished`
+      - `data` (object) detail
+        - `id` (string) ID of workflow execution
+        - `workflow_id` (string) ID of related workflow
+        - `status` (string) status of execution, `running` / `succeeded` / `failed` / `stopped`
+        - `outputs` (json) Optional content of output
+        - `error` (string) Optional reason of error
+        - `elapsed_time` (float) Optional total seconds to be used
+        - `total_tokens` (int) Optional tokens to be used
+        - `total_steps` (int) default 0
+        - `created_at` (timestamp) start time
+        - `finished_at` (timestamp) end time
+    - `event: error`
+      Exceptions that occur during the streaming process will be output in the form of stream events, and reception of an error event will end the stream.
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `message_id` (string) Unique message ID
+      - `status` (int) HTTP status code
+      - `code` (string) Error code
+      - `message` (string) Error message
+    - `event: ping` Ping event every 10 seconds to keep the connection alive.
+
+    ### Errors
+    - 404, Conversation does not exists
+    - 400, `invalid_param`, abnormal parameter input
+    - 400, `app_unavailable`, App configuration unavailable
+    - 400, `provider_not_initialize`, no available model credential configuration
+    - 400, `provider_quota_exceeded`, model invocation quota insufficient
+    - 400, `model_currently_not_support`, current model unavailable
+    - 400, `completion_request_error`, text generation failed
+    - 500, internal server error
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/chat-messages" targetCode={`curl -X POST '${props.appDetail.api_base_url}/chat-messages' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "inputs": ${JSON.stringify(props.inputs)},\n    "query": "What are the specs of the iPhone 13 Pro Max?",\n    "response_mode": "streaming",\n    "conversation_id": "",\n    "user": "abc-123",\n    "files": [\n      {\n        "type": "image",\n        "transfer_method": "remote_url",\n        "url": "https://cloud.dify.ai/logo/logo-site.png"\n      }\n    ]\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/chat-messages' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "inputs": {},
+        "query": "eh",
+        "response_mode": "streaming",
+        "conversation_id": "1c7e55fb-1ba2-4e10-81b5-30addcea2276",
+        "user": "abc-123"
+    }'
+    ```
+    </CodeGroup>
+    ### Blocking Mode
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+        "event": "message",
+        "task_id": "c3800678-a077-43df-a102-53f23ed20b88", 
+        "id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "message_id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2",
+        "mode": "chat",
+        "answer": "iPhone 13 Pro Max specs are listed here:...",
+        "metadata": {
+            "usage": {
+                "prompt_tokens": 1033,
+                "prompt_unit_price": "0.001",
+                "prompt_price_unit": "0.001",
+                "prompt_price": "0.0010330",
+                "completion_tokens": 128,
+                "completion_unit_price": "0.002",
+                "completion_price_unit": "0.001",
+                "completion_price": "0.0002560",
+                "total_tokens": 1161,
+                "total_price": "0.0012890",
+                "currency": "USD",
+                "latency": 0.7682376249867957
+            },
+            "retriever_resources": [
+                {
+                    "position": 1,
+                    "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb",
+                    "dataset_name": "iPhone",
+                    "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00",
+                    "document_name": "iPhone List",
+                    "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a",
+                    "score": 0.98457545,
+                    "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""
+                }
+            ]
+        },
+        "created_at": 1705407629
+    }
+    ```
+    </CodeGroup>
+    ### Streaming Mode
+    <CodeGroup title="Response">
+    ```streaming {{ title: 'Response' }}
+      data: {"event": "workflow_started", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "workflow_id": "dfjasklfjdslag", "sequence_number": 1, "created_at": 1679586595}}
+      data: {"event": "node_started", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "node_id": "dfjasklfjdslag", "node_type": "start", "title": "Start", "index": 0, "predecessor_node_id": "fdljewklfklgejlglsd", "inputs": {}, "created_at": 1679586595}}
+      data: {"event": "node_finished", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "node_id": "dfjasklfjdslag", "node_type": "start", "title": "Start", "index": 0, "predecessor_node_id": "fdljewklfklgejlglsd", "inputs": {}, "outputs": {}, "status": "succeeded", "elapsed_time": 0.324, "execution_metadata": {"total_tokens": 63127864, "total_price": 2.378, "currency": "USD"},  "created_at": 1679586595}}
+      data: {"event": "workflow_finished", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "workflow_id": "dfjasklfjdslag", "outputs": {}, "status": "succeeded", "elapsed_time": 0.324, "total_tokens": 63127864, "total_steps": "1", "created_at": 1679586595, "finished_at": 1679976595}}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " I", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": "'m", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " glad", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " to", "created_at": 1679586595}
+      data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " meet", "created_at": 1679586595}
+      data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " you", "created_at": 1679586595}
+      data: {"event": "message_end", "id": "5e52ce04-874b-4d27-9045-b3bc80def685", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "metadata": {"usage": {"prompt_tokens": 1033, "prompt_unit_price": "0.001", "prompt_price_unit": "0.001", "prompt_price": "0.0010330", "completion_tokens": 135, "completion_unit_price": "0.002", "completion_price_unit": "0.001", "completion_price": "0.0002700", "total_tokens": 1168, "total_price": "0.0013030", "currency": "USD", "latency": 1.381760165997548}, "retriever_resources": [{"position": 1, "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb", "dataset_name": "iPhone", "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00", "document_name": "iPhone List", "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a", "score": 0.98457545, "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""}]}}
+      data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+      data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+    ```
+    </CodeGroup>
+
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/files/upload'
+  method='POST'
+  title='File Upload'
+  name='#file-upload'
+/>
+<Row>
+  <Col>
+  Upload a file for use when sending messages, enabling multimodal understanding of images and text.
+  Supports any formats that are supported by your application.
+  Uploaded files are for use by the current end-user only.
+
+  ### Request Body
+  This interface requires a `multipart/form-data` request.
+  - `file` (File) Required
+    The file to be uploaded.
+  - `user` (string) Required
+    User identifier, defined by the developer's rules, must be unique within the application.
+
+  ### Response
+  After a successful upload, the server will return the file's ID and related information.
+  - `id` (uuid) ID
+  - `name` (string) File name
+  - `size` (int) File size (bytes)
+  - `extension` (string) File extension
+  - `mime_type` (string) File mime-type
+  - `created_by` (uuid) End-user ID
+  - `created_at` (timestamp) Creation timestamp, e.g., 1705395332
+
+  ### Errors
+  - 400, `no_file_uploaded`, a file must be provided
+  - 400, `too_many_files`, currently only one file is accepted
+  - 400, `unsupported_preview`, the file does not support preview
+  - 400, `unsupported_estimate`, the file does not support estimation
+  - 413, `file_too_large`, the file is too large
+  - 415, `unsupported_file_type`, unsupported extension, currently only document files are accepted
+  - 503, `s3_connection_failed`, unable to connect to S3 service
+  - 503, `s3_permission_denied`, no permission to upload files to S3
+  - 503, `s3_file_too_large`, file exceeds S3 size limit
+  - 500, internal server error
+
+
+  </Col>
+  <Col sticky>
+  ### Request Example
+  <CodeGroup title="Request" tag="POST" label="/files/upload" targetCode={`curl -X POST '${props.appDetail.api_base_url}/files/upload' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=image/[png|jpeg|jpg|webp|gif] \\\n--form 'user=abc-123'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/files/upload' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@"/path/to/file"'
+    ```
+
+    </CodeGroup>
+
+
+  ### Response Example
+  <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "72fa9618-8f89-4a37-9b33-7e1178a24a67",
+      "name": "example.png",
+      "size": 1024,
+      "extension": "png",
+      "mime_type": "image/png",
+      "created_by": "6ad1ab0a-73ff-4ac1-b9e4-cdb312f71f13",
+      "created_at": 1577836800,
+    }
+  ```
+  </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/chat-messages/:task_id/stop'
+  method='POST'
+  title='Stop Generate'
+  name='#stop-generatebacks'
+/>
+<Row>
+  <Col>
+  Only supported in streaming mode.
+  ### Path
+  - `task_id` (string) Task ID, can be obtained from the streaming chunk return
+  ### Request Body
+  - `user` (string) Required
+    User identifier, used to define the identity of the end-user, must be consistent with the user passed in the send message interface.
+  ### Response
+  - `result` (string) Always returns "success"
+  </Col>
+  <Col sticky>
+  ### Request Example
+  <CodeGroup title="Request" tag="POST" label="/chat-messages/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/chat-messages/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/chat-messages/:task_id/stop' \
+    -H 'Authorization: Bearer {api_key}' \
+    -H 'Content-Type: application/json' \
+    --data-raw '{
+        "user": "abc-123"
+    }'
+    ```
+    </CodeGroup>
+
+    ### Response Example
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/messages/:message_id/feedbacks'
+  method='POST'
+  title='Message Feedback'
+  name='#feedbacks'
+/>
+<Row>
+  <Col>
+    End-users can provide feedback messages, facilitating application developers to optimize expected outputs.
+
+    ### Path
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+       Message ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+
+    <Properties>
+      <Property name='rating' type='string' key='rating'>
+        Upvote as `like`, downvote as `dislike`, revoke upvote as `null`
+      </Property>
+      <Property name='user' type='string' key='user'>
+        User identifier, defined by the developer's rules, must be unique within the application.
+      </Property>
+      <Property name='content' type='string' key='content'>
+        The specific content of message feedback.
+      </Property>
+    </Properties>
+
+    ### Response
+    - `result` (string) Always returns "success"
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/messages/:message_id/feedbacks" targetCode={`curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks \\\n --header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "rating": "like",\n    "user": "abc-123",\n    "content": "message feedback information"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "rating": "like",
+        "user": "abc-123",
+        "content": "message feedback information"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/app/feedbacks'
+  method='GET'
+  title='Get feedbacks of application'
+  name='#app-feedbacks'
+/>
+<Row>
+  <Col>
+    Get application's feedbacks.
+
+    ### Query
+    <Properties>
+      <Property name='page' type='string' key='page'>
+       锛坥ptional锛塸agination锛宒efault锛�1
+      </Property>
+    </Properties>
+
+    <Properties>
+      <Property name='limit' type='string' key='limit'>
+       锛坥ptional锛� records per page default锛�20
+      </Property>
+    </Properties>
+
+    ### Response
+    - `data` (List) return apps feedback list.
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/app/feedbacks" targetCode={`curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+      {
+          "data": [
+              {
+                  "id": "8c0fbed8-e2f9-49ff-9f0e-15a35bdd0e25",
+                  "app_id": "f252d396-fe48-450e-94ec-e184218e7346",
+                  "conversation_id": "2397604b-9deb-430e-b285-4726e51fd62d",
+                  "message_id": "709c0b0f-0a96-4a4e-91a4-ec0889937b11",
+                  "rating": "like",
+                  "content": "message feedback information-3",
+                  "from_source": "user",
+                  "from_end_user_id": "74286412-9a1a-42c1-929c-01edb1d381d5",
+                  "from_account_id": null,
+                  "created_at": "2025-04-24T09:24:38",
+                  "updated_at": "2025-04-24T09:24:38"
+              }
+          ]
+      }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/messages/{message_id}/suggested'
+  method='GET'
+  title='Next Suggested Questions'
+  name='#suggested'
+/>
+<Row>
+  <Col>
+    Get next questions suggestions for the current message
+
+    ### Path Params
+
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+        Message ID
+      </Property>
+    </Properties>
+
+    ### Query
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        User identifier, used to define the identity of the end-user for retrieval and statistics.
+        Should be uniquely defined by the developer within the application.
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/messages/{message_id}/suggested" targetCode={`curl --location --request GET '${props.appDetail.api_base_url}/messages/{message_id}/suggested?user=abc-123& \\\n--header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \\\n--header 'Content-Type: application/json'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.appDetail.api_base_url}/messages/{message_id}/suggested?user=abc-123' \
+    --header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \
+    --header 'Content-Type: application/json' \
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success",
+      "data": [
+            "a",
+            "b",
+            "c"
+        ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/messages'
+  method='GET'
+  title='Get Conversation History Messages'
+  name='#messages'
+/>
+<Row>
+  <Col>
+    Returns historical chat records in a scrolling load format, with the first page returning the latest `{limit}` messages, i.e., in reverse order.
+
+    ### Query
+
+    <Properties>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+        Conversation ID
+      </Property>
+      <Property name='user' type='string' key='user'>
+        User identifier, used to define the identity of the end-user for retrieval and statistics.
+        Should be uniquely defined by the developer within the application.
+      </Property>
+      <Property name='first_id' type='string' key='first_id'>
+          The ID of the first chat record on the current page, default is null.
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+          How many chat history messages to return in one request, default is 20.
+      </Property>
+    </Properties>
+
+    ### Response
+    - `data` (array[object]) Message list
+    - `id` (string) Message ID
+    - `conversation_id` (string) Conversation ID
+    - `inputs` (object) User input parameters.
+    - `query` (string) User input / question content.
+    - `message_files` (array[object]) Message files
+      - `id` (string) ID
+      - `type` (string) File type, image for images
+      - `url` (string) Preview image URL
+      - `belongs_to` (string) belongs to锛寀ser orassistant
+    - `answer` (string) Response message content
+    - `created_at` (timestamp) Creation timestamp, e.g., 1705395332
+    - `feedback` (object) Feedback information
+      - `rating` (string) Upvote as `like` / Downvote as `dislike`
+    - `retriever_resources` (array[RetrieverResource]) Citation and Attribution List
+  - `has_more` (bool) Whether there is a next page
+  - `limit` (int) Number of returned items, if input exceeds system limit, returns system limit amount
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/messages" targetCode={`curl -X GET '${props.appDetail.api_base_url}/messages?user=abc-123&conversation_id='\\\n --header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/messages?user=abc-123&conversation_id='
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+    ### Response Example
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "limit": 20,
+      "has_more": false,
+      "data": [
+        {
+            "id": "a076a87f-31e5-48dc-b452-0061adbbc922",
+            "conversation_id": "cd78daf6-f9e4-4463-9ff2-54257230a0ce",
+            "inputs": {
+                "name": "dify"
+            },
+            "query": "iphone 13 pro",
+            "answer": "The iPhone 13 Pro, released on September 24, 2021, features a 6.1-inch display with a resolution of 1170 x 2532. It is equipped with a Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard) processor, 6 GB of RAM, and offers storage options of 128 GB, 256 GB, 512 GB, and 1 TB. The camera is 12 MP, the battery capacity is 3095 mAh, and it runs on iOS 15.",
+            "message_files": [],
+            "feedback": null,
+            "retriever_resources": [
+                {
+                    "position": 1,
+                    "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb",
+                    "dataset_name": "iPhone",
+                    "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00",
+                    "document_name": "iPhone List",
+                    "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a",
+                    "score": 0.98457545,
+                    "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""
+                }
+            ],
+            "created_at": 1705569239,
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations'
+  method='GET'
+  title='Get Conversations'
+  name='#conversations'
+/>
+<Row>
+  <Col>
+    Retrieve the conversation list for the current user, defaulting to the most recent 20 entries.
+
+    ### Query
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+          User identifier, used to define the identity of the end-user for retrieval and statistics.
+          Should be uniquely defined by the developer within the application.
+      </Property>
+      <Property name='last_id' type='string' key='last_id'>
+          (Optional) The ID of the last record on the current page, default is null.
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+          (Optional) How many records to return in one request, default is the most recent 20 entries. Maximum 100, minimum 1.
+      </Property>
+      <Property name='sort_by' type='string' key='sort_by'>
+        (Optional) Sorting Field, Default: -updated_at (sorted in descending order by update time)
+        - Available Values: created_at, -created_at, updated_at, -updated_at
+        - The symbol before the field represents the order or reverse, "-" represents reverse order.
+      </Property>
+    </Properties>
+
+    ### Response
+    - `data` (array[object]) List of conversations
+      - `id` (string) Conversation ID
+      - `name` (string) Conversation name, by default, is generated by LLM.
+      - `inputs` (object) User input parameters.
+      - `status` (string) Conversation status
+      - `introduction` (string) Introduction
+      - `created_at` (timestamp) Creation timestamp, e.g., 1705395332
+      - `updated_at` (timestamp) Update timestamp, e.g., 1705395332
+    - `has_more` (bool)
+    - `limit` (int) Number of entries returned, if input exceeds system limit, system limit number is returned
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/conversations" targetCode={`curl -X GET '${props.appDetail.api_base_url}/conversations?user=abc-123&last_id=&limit=20' \\\n --header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations?user=abc-123&last_id=&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "limit": 20,
+      "has_more": false,
+      "data": [
+        {
+          "id": "10799fb8-64f7-4296-bbf7-b42bfbe0ae54",
+          "name": "New chat",
+          "inputs": {
+              "book": "book",
+              "myName": "Lucy"
+          },
+          "status": "normal",
+          "created_at": 1679667915,
+          "updated_at": 1679667915
+        },
+        {
+          "id": "hSIhXBhNe8X1d8Et"
+          // ...
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations/:conversation_id'
+  method='DELETE'
+  title='Delete Conversation'
+  name='#delete'
+/>
+<Row>
+  <Col>
+    Delete a conversation.
+
+    ### Path
+    - `conversation_id` (string) Conversation ID
+
+    ### Request Body
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        The user identifier, defined by the developer, must ensure uniqueness within the application.
+      </Property>
+    </Properties>
+
+    ### Response
+    - `result` (string) Always returns "success"
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="DELETE" label="/conversations/:conversation_id" targetCode={`curl -X DELETE '${props.appDetail.api_base_url}/conversations/:conversation_id' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+        curl -X DELETE '${props.appDetail.api_base_url}/conversations/{conversation_id}' \
+        --header 'Content-Type: application/json' \
+        --header 'Accept: application/json' \
+        --header 'Authorization: Bearer {api_key}' \
+        --data '{
+            "user": "abc-123"
+        }'
+      ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/conversations/:conversation_id/name'
+  method='POST'
+  title='Conversation Rename'
+  name='#rename'
+/>
+<Row>
+  <Col>
+    ### Request Body
+    Rename the session, the session name is used for display on clients that support multiple sessions.
+
+    ### Path
+    - `conversation_id` (string) Conversation ID
+
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        (Optional) The name of the conversation. This parameter can be omitted if `auto_generate` is set to `true`.
+      </Property>
+      <Property name='auto_generate' type='bool' key='auto_generate'>
+        (Optional) Automatically generate the title, default is `false`
+      </Property>
+      <Property name='user' type='string' key='user'>
+        The user identifier, defined by the developer, must ensure uniqueness within the application.
+      </Property>
+    </Properties>
+
+    ### Response
+    - `id` (string) Conversation ID
+    - `name` (string) Conversation name
+    - `inputs` (object) User input parameters
+    - `status` (string) Conversation status
+    - `introduction` (string) Introduction
+    - `created_at` (timestamp) Creation timestamp, e.g., 1705395332
+    - `updated_at` (timestamp) Update timestamp, e.g., 1705395332
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/conversations/:conversation_id/name" targetCode={`curl -X POST '${props.appDetail.api_base_url}/conversations/:conversation_id/name' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "name": "", \n "auto_generate": true, \n "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/conversations/{conversation_id}/name' \
+    --header 'Content-Type: application/json' \
+    --header 'Authorization: Bearer {api_key}' \
+    --data-raw '{
+        "name": "",
+        "auto_generate": true,
+        "user": "abc-123"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+        "id": "cd78daf6-f9e4-4463-9ff2-54257230a0ce",
+        "name": "Chat vs AI",
+        "inputs": {},
+        "status": "normal",
+        "introduction": "",
+        "created_at": 1705569238,
+        "updated_at": 1705569238
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations/:conversation_id/variables'
+  method='GET'
+  title='Get Conversation Variables'
+  name='#conversation-variables'
+/>
+<Row>
+  <Col>
+    Retrieve variables from a specific conversation. This endpoint is useful for extracting structured data that was captured during the conversation.
+
+    ### Path Parameters
+
+    <Properties>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+        The ID of the conversation to retrieve variables from.
+      </Property>
+    </Properties>
+
+    ### Query Parameters
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        The user identifier, defined by the developer, must ensure uniqueness within the application
+      </Property>
+      <Property name='last_id' type='string' key='last_id'>
+          (Optional) The ID of the last record on the current page, default is null.
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+          (Optional) How many records to return in one request, default is the most recent 20 entries. Maximum 100, minimum 1.
+      </Property>
+    </Properties>
+
+    ### Response
+
+    - `limit` (int) Number of items per page
+    - `has_more` (bool) Whether there is a next page
+    - `data` (array[object]) List of variables
+      - `id` (string) Variable ID
+      - `name` (string) Variable name
+      - `value_type` (string) Variable type (string, number, object, etc.)
+      - `value` (string) Variable value
+      - `description` (string) Variable description
+      - `created_at` (int) Creation timestamp
+      - `updated_at` (int) Last update timestamp
+
+    ### Errors
+    - 404, `conversation_not_exists`, Conversation not found
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/conversations/:conversation_id/variables" targetCode={`curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123' \\\n--header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Request with variable name filter">
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123&variable_name=customer_name' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "limit": 100,
+      "has_more": false,
+      "data": [
+        {
+          "id": "variable-uuid-1",
+          "name": "customer_name",
+          "value_type": "string",
+          "value": "John Doe",
+          "description": "Customer name extracted from the conversation",
+          "created_at": 1650000000000,
+          "updated_at": 1650000000000
+        },
+        {
+          "id": "variable-uuid-2",
+          "name": "order_details",
+          "value_type": "json",
+          "value": "{\"product\":\"Widget\",\"quantity\":5,\"price\":19.99}",
+          "description": "Order details from the customer",
+          "created_at": 1650000000000,
+          "updated_at": 1650000000000
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/audio-to-text'
+  method='POST'
+  title='Speech to Text'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    This endpoint requires a multipart/form-data request.
+
+    ### Request Body
+
+    <Properties>
+      <Property name='file' type='file' key='file'>
+        Audio file.
+        Supported formats: `['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm']`
+        File size limit: 15MB
+      </Property>
+      <Property name='user' type='string' key='user'>
+      User identifier, defined by the developer's rules, must be unique within the application.
+      </Property>
+    </Properties>
+
+    ### Response
+    - `text` (string) Output text
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/audio-to-text" targetCode={`curl -X POST '${props.appDetail.api_base_url}/audio-to-text' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=audio/[mp3|mp4|mpeg|mpga|m4a|wav|webm]'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/conversations/name' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@localfile;type=audio/mp3'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "text": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/text-to-audio'
+  method='POST'
+  title='Text to Audio'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    Text to speech.
+
+    ### Request Body
+
+    <Properties>
+      <Property name='message_id' type='str' key='message_id'>
+        For text messages generated by Dify, simply pass the generated message-id directly. The backend will use the message-id to look up the corresponding content and synthesize the voice information directly. If both message_id and text are provided simultaneously, the message_id is given priority.
+      </Property>
+      <Property name='text' type='str' key='text'>
+        Speech generated content銆�
+      </Property>
+      <Property name='user' type='string' key='user'>
+        The user identifier, defined by the developer, must ensure uniqueness within the app.
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/text-to-audio" targetCode={`curl -o text-to-audio.mp3 -X POST '${props.appDetail.api_base_url}/text-to-audio' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290",\n    "text": "Hello Dify",\n    "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -o text-to-audio.mp3 -X POST '${props.appDetail.api_base_url}/text-to-audio' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290",
+        "text": "Hello Dify",
+        "user": "abc-123",
+        "streaming": false
+    }'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="headers">
+    ```json {{ title: 'headers' }}
+    {
+      "Content-Type": "audio/wav"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/info'
+  method='GET'
+  title='Get Application Basic Information'
+  name='#info'
+/>
+<Row>
+  <Col>
+  Used to get basic information about this application
+
+  ### Response
+  - `name` (string) application name
+  - `description` (string) application description
+  - `tags` (array[string]) application tags
+  </Col>
+  <Col>
+    <CodeGroup title="Request" tag="GET" label="/info" targetCode={`curl -X GET '${props.appDetail.api_base_url}/info' \\\n-H 'Authorization: Bearer {api_key}'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/info' \
+      -H 'Authorization: Bearer {api_key}'
+      ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "name": "My App",
+      "description": "This is my app.",
+      "tags": [
+        "tag1",
+        "tag2"
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/parameters'
+  method='GET'
+  title='Get Application Parameters Information'
+  name='#parameters'
+/>
+<Row>
+  <Col>
+    Used at the start of entering the page to obtain information such as features, input parameter names, types, and default values.
+
+    ### Response
+    - `opening_statement` (string) Opening statement
+    - `suggested_questions` (array[string]) List of suggested questions for the opening
+    - `suggested_questions_after_answer` (object) Suggest questions after enabling the answer.
+      - `enabled` (bool) Whether it is enabled
+    - `speech_to_text` (object) Speech to text
+      - `enabled` (bool) Whether it is enabled
+    - `retriever_resource` (object) Citation and Attribution
+      - `enabled` (bool) Whether it is enabled
+    - `annotation_reply` (object) Annotation reply
+      - `enabled` (bool) Whether it is enabled
+    - `user_input_form` (array[object]) User input form configuration
+      - `text-input` (object) Text input control
+        - `label` (string) Variable display label name
+        - `variable` (string) Variable ID
+        - `required` (bool) Whether it is required
+        - `default` (string) Default value
+      - `paragraph` (object) Paragraph text input control
+        - `label` (string) Variable display label name
+        - `variable` (string) Variable ID
+        - `required` (bool) Whether it is required
+        - `default` (string) Default value
+      - `select` (object) Dropdown control
+        - `label` (string) Variable display label name
+        - `variable` (string) Variable ID
+        - `required` (bool) Whether it is required
+        - `default` (string) Default value
+        - `options` (array[string]) Option values
+    - `file_upload` (object) File upload configuration
+      - `image` (object) Image settings
+        Currently only supports image types: `png`, `jpg`, `jpeg`, `webp`, `gif`
+        - `enabled` (bool) Whether it is enabled
+        - `number_limits` (int) Image number limit, default is 3
+        - `transfer_methods` (array[string]) List of transfer methods, remote_url, local_file, must choose one
+    - `system_parameters` (object) System parameters
+      - `file_size_limit` (int) Document upload size limit (MB)
+      - `image_file_size_limit` (int) Image file upload size limit (MB)
+      - `audio_file_size_limit` (int) Audio file upload size limit (MB)
+      - `video_file_size_limit` (int) Video file upload size limit (MB)
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/parameters" targetCode={` curl -X GET '${props.appDetail.api_base_url}/parameters'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/parameters' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "opening_statement": "Hello!",
+      "suggested_questions_after_answer": {
+          "enabled": true
+      },
+      "speech_to_text": {
+          "enabled": true
+      },
+      "retriever_resource": {
+          "enabled": true
+      },
+      "annotation_reply": {
+          "enabled": true
+      },
+      "user_input_form": [
+          {
+              "paragraph": {
+                  "label": "Query",
+                  "variable": "query",
+                  "required": true,
+                  "default": ""
+              }
+          }
+      ],
+      "file_upload": {
+          "image": {
+              "enabled": false,
+              "number_limits": 3,
+              "detail": "high",
+              "transfer_methods": [
+                  "remote_url",
+                  "local_file"
+              ]
+          }
+      },
+      "system_parameters": {
+          "file_size_limit": 15,
+          "image_file_size_limit": 10,
+          "audio_file_size_limit": 50,
+          "video_file_size_limit": 100
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/meta'
+  method='GET'
+  title='Get Application Meta Information'
+  name='#meta'
+/>
+<Row>
+  <Col>
+  Used to get icons of tools in this application
+
+  ### Response
+  - `tool_icons`(object[string]) tool icons
+    - `tool_name` (string)
+      - `icon` (object|string)
+        - (object) icon object
+          - `background` (string) background color in hex format
+          - `content`(string) emoji
+        - (string) url of icon
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="GET" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/meta' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/meta' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "tool_icons": {
+        "dalle2": "https://cloud.dify.ai/console/api/workspaces/current/tool-provider/builtin/dalle/icon",
+        "api_tool": {
+          "background": "#252525",
+          "content": "\ud83d\ude01"
+        }
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/site'
+  method='GET'
+  title='Get Application WebApp Settings'
+  name='#site'
+/>
+<Row>
+  <Col>
+  Used to get the WebApp settings of the application.
+  ### Response
+  - `title` (string) WebApp name
+  - `chat_color_theme` (string) Chat color theme, in hex format
+  - `chat_color_theme_inverted` (bool) Whether the chat color theme is inverted
+  - `icon_type` (string) Icon type, `emoji` - emoji, `image` - picture
+  - `icon` (string) Icon. If it's `emoji` type, it's an emoji symbol; if it's `image` type, it's an image URL
+  - `icon_background` (string) Background color in hex format
+  - `icon_url` (string) Icon URL
+  - `description` (string) Description
+  - `copyright` (string) Copyright information
+  - `privacy_policy` (string) Privacy policy link
+  - `custom_disclaimer` (string) Custom disclaimer
+  - `default_language` (string) Default language
+  - `show_workflow_steps` (bool) Whether to show workflow details
+  - `use_icon_as_answer_icon` (bool) Whether to replace 馃 in chat with the WebApp icon
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="POST" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/site' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/site' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "title": "My App",
+      "chat_color_theme": "#ff4a4a",
+      "chat_color_theme_inverted": false,
+      "icon_type": "emoji",
+      "icon": "馃槃",
+      "icon_background": "#FFEAD5",
+      "icon_url": null,
+      "description": "This is my app.",
+      "copyright": "all rights reserved",
+      "privacy_policy": "",
+      "custom_disclaimer": "All generated by AI",
+      "default_language": "en-US",
+      "show_workflow_steps": false,
+      "use_icon_as_answer_icon": false,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+___
+
+<Heading
+  url='/apps/annotations'
+  method='GET'
+  title='Get Annotation List'
+  name='#annotation_list'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='page' type='string' key='page'>
+        Page number
+      </Property>
+      <Property name='limit' type='string' key='limit'>
+        Number of items returned, default 20, range 1-100
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/apps/annotations"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/apps/annotations?page=1&limit=20' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/apps/annotations?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [
+        {
+          "id": "69d48372-ad81-4c75-9c46-2ce197b4d402",
+          "question": "What is your name?",
+          "answer": "I am Dify.",
+          "hit_count": 0,
+          "created_at": 1735625869
+        }
+      ],
+      "has_more": false,
+      "limit": 20,
+      "total": 1,
+      "page": 1
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotations'
+  method='POST'
+  title='Create Annotation'
+  name='#create_annotation'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='question' type='string' key='question'>
+        Question
+      </Property>
+      <Property name='answer' type='string' key='answer'>
+        Answer
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/apps/annotations"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/apps/annotations' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"question": "What is your name?","answer": "I am Dify."}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/apps/annotations' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "question": "What is your name?",
+        "answer": "I am Dify."
+    }'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "69d48372-ad81-4c75-9c46-2ce197b4d402",
+      "question": "What is your name?",
+      "answer": "I am Dify.",
+      "hit_count": 0,
+      "created_at": 1735625869
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotations/{annotation_id}'
+  method='PUT'
+  title='Update Annotation'
+  name='#update_annotation'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='annotation_id' type='string' key='annotation_id'>
+        Annotation ID
+      </Property>
+      <Property name='question' type='string' key='question'>
+        Question
+      </Property>
+      <Property name='answer' type='string' key='answer'>
+        Answer
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="PUT"
+      label="/apps/annotations/{annotation_id}"
+      targetCode={`curl --location --request PUT '${props.apiBaseUrl}/apps/annotations/{annotation_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"question": "What is your name?","answer": "I am Dify."}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request PUT '${props.apiBaseUrl}/apps/annotations/{annotation_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "question": "What is your name?",
+        "answer": "I am Dify."
+    }'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "69d48372-ad81-4c75-9c46-2ce197b4d402",
+      "question": "What is your name?",
+      "answer": "I am Dify.",
+      "hit_count": 0,
+      "created_at": 1735625869
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotations/{annotation_id}'
+  method='DELETE'
+  title='Delete Annotation'
+  name='#delete_annotation'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='annotation_id' type='string' key='annotation_id'>
+        Annotation ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="PUT"
+      label="/apps/annotations/{annotation_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/apps/annotations/{annotation_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/apps/annotations/{annotation_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotation-reply/{action}'
+  method='POST'
+  title='Initial Annotation Reply Settings'
+  name='#initial_annotation_reply_settings'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='action' type='string' key='action'>
+        Action, can only be 'enable' or 'disable'
+      </Property>
+      <Property name='embedding_provider_name' type='string' key='embedding_provider_name'>
+        Specified embedding model provider, must be set up in the system first, corresponding to the provider field(Optional)
+      </Property>
+      <Property name='embedding_model_name' type='string' key='embedding_model_name'>
+        Specified embedding model, corresponding to the model field(Optional)
+      </Property>
+      <Property name='score_threshold' type='number' key='score_threshold'>
+        The similarity threshold for matching annotated replies. Only annotations with scores above this threshold will be recalled.
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    The provider and model name of the embedding model can be obtained through the following interface: v1/workspaces/current/models/model-types/text-embedding. For specific instructions, see: Maintain Knowledge Base via API. The Authorization used is the Dataset API Token.
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/apps/annotation-reply/{action}"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/apps/annotation-reply/{action}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"score_threshold": 0.9, "embedding_provider_name": "zhipu", "embedding_model_name": "embedding_3"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST 'https://api.dify.ai/v1/apps/annotation-reply/{action}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "score_threshold": 0.9,
+        "embedding_provider_name": "zhipu",
+        "embedding_model_name": "embedding_3"
+    }'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "job_id": "b15c8f68-1cf4-4877-bf21-ed7cf2011802",
+      "job_status": "waiting"
+    }
+    ```
+    </CodeGroup>
+    This interface is executed asynchronously, so it will return a job_id. You can get the final execution result by querying the job status interface.
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotation-reply/{action}/status/{job_id}'
+  method='GET'
+  title='Query Initial Annotation Reply Settings Task Status'
+  name='#initial_annotation_reply_settings_task_status'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+    <Property name='action' type='string' key='action'>
+        Action, can only be 'enable' or 'disable', must be the same as the action in the initial annotation reply settings interface
+      </Property>
+      <Property name='job_id' type='string' key='job_id'>
+        Job ID, obtained from the initial annotation reply settings interface
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/apps/annotations"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/apps/annotation-reply/{action}/status/{job_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/apps/annotation-reply/{action}/status/{job_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "job_id": "b15c8f68-1cf4-4877-bf21-ed7cf2011802",
+      "job_status": "waiting",
+      "error_msg": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
diff --git a/app/components/develop/template/template_advanced_chat.ja.mdx b/app/components/develop/template/template_advanced_chat.ja.mdx
new file mode 100644
index 0000000..75c69a4
--- /dev/null
+++ b/app/components/develop/template/template_advanced_chat.ja.mdx
@@ -0,0 +1,1365 @@
+import { CodeGroup } from '../code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty, Paragraph } from '../md.tsx'
+
+# 楂樺害銇儊銉c儍銉堛偄銉椼儶API
+
+銉併儯銉冦儓銈€儣銉偙銉笺偡銉с兂銇偦銉冦偡銉с兂銇寔缍氭�с倰銈点儩銉笺儓銇椼仸銇娿倞銆佷互鍓嶃伄銉併儯銉冦儓灞ユ銈掑繙绛斻伄銈炽兂銉嗐偔銈广儓銇ㄣ仐銇︿娇鐢ㄣ仹銇嶃伨銇欍�傘亾銈屻伅銆併儊銉c儍銉堛儨銉冦儓銈勩偒銈广偪銉炪兗銈点兗銉撱偣AI銇仼銇仼鐢ㄣ仹銇嶃伨銇欍��
+
+<div>
+  ### 銉欍兗銈筓RL
+  <CodeGroup title="銈炽兗銉�" targetCode={props.appDetail.api_base_url}>
+    ```javascript
+    ```
+  </CodeGroup>
+
+  ### 瑾嶈
+
+  銈点兗銉撱偣API銇痐API-Key`瑾嶈銈掍娇鐢ㄣ仐銇俱仚銆�
+  <i>**API銈兗銇偟銉笺儛銉煎伌銇繚瀛樸仐銆併偗銉┿偆銈€兂銉堝伌銇у叡鏈夈伨銇熴伅淇濆瓨銇椼仾銇勩亾銇ㄣ倰寮枫亸銇婂嫥銈併仐銇俱仚銆侫PI銈兗銇紡娲┿伅娣卞埢銇祼鏋溿倰鎷涖亸鍙兘鎬с亴銇傘倞銇俱仚銆�**</i>
+
+  銇欍伖銇︺伄API銉偗銈ㄣ偣銉堛伀銇�佷互涓嬨伄銈堛亞銇玚Authorization`HTTP銉樸儍銉�銉笺伀API銈兗銈掑惈銈併仸銇忋仩銇曘亜锛�
+
+  <CodeGroup title="銈炽兗銉�">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+
+    ```
+  </CodeGroup>
+</div>
+
+---
+
+<Heading
+  url='/chat-messages'
+  method='POST'
+  title='銉併儯銉冦儓銉°儍銈汇兗銈搞倰閫佷俊'
+  name='#Send-Chat-Message'
+/>
+<Row>
+  <Col>
+    銉併儯銉冦儓銈€儣銉偙銉笺偡銉с兂銇儶銈偍銈广儓銈掗�佷俊銇椼伨銇欍��
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+
+    <Properties>
+      <Property name='query' type='string' key='query'>
+        銉︺兗銈躲兗鍏ュ姏/璩晱鍐呭
+      </Property>
+      <Property name='inputs' type='object' key='inputs'>
+          銈€儣銉伀銈堛仯銇﹀畾缇┿仌銈屻仧銇曘伨銇栥伨銇鏁板�ゃ伄鍏ュ姏銈掕ū鍙仐銇俱仚銆�
+          `inputs`銉戙儵銉°兗銈裤伀銇鏁般伄銈兗/鍊ゃ儦銈€亴鍚伨銈屻�佸悇銈兗銇壒瀹氥伄澶夋暟銇蹇溿仐銆佸悇鍊ゃ伅銇濄伄澶夋暟銇壒瀹氥伄鍊ゃ仹銇欍��
+          澶夋暟銇屻儠銈°偆銉偪銈ゃ儣銇牬鍚堛�佷互涓嬨伄`files`銇ц鏄庛仌銈屻仸銇勩倠銈兗銈掓寔銇ゃ偑銉栥偢銈с偗銉堛倰鎸囧畾銇椼伨銇欍��
+          銉囥儠銈┿儷銉坄{}`
+      </Property>
+      <Property name='response_mode' type='string' key='response_mode'>
+        蹇滅瓟銇繑鍗淬儮銉笺儔銈掓寚瀹氥仐銇俱仚銆傘偟銉濄兗銉堛仌銈屻仸銇勩倠銉€兗銉夛細
+        - `streaming` 銈广儓銉兗銉熴兂銈般儮銉笺儔锛堟帹濂級銆丼SE锛圼銈点兗銉愩兗閫佷俊銈ゃ儥銉炽儓](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)锛夈倰閫氥仒銇︺偪銈ゃ儣銉┿偆銈裤兗銇倛銇嗐仾鍑哄姏銈掑疅瑁呫仐銇俱仚銆�
+        - `blocking` 銉栥儹銉冦偔銉炽偘銉€兗銉夈�佸疅琛屽畬浜嗗緦銇祼鏋溿倰杩斻仐銇俱仚銆傦紙銉椼儹銈汇偣銇岄暦銇勫牬鍚堛�併儶銈偍銈广儓銇屼腑鏂仌銈屻倠鍙兘鎬с亴銇傘倞銇俱仚锛�
+        Cloudflare銇埗闄愩伀銈堛倞銆併儶銈偍銈广儓銇�100绉掑緦銇繑绛斻仾銇椼仹涓柇銇曘倢銇俱仚銆�
+      </Property>
+      <Property name='user' type='string' key='user'>
+          銉︺兗銈躲兗璀樺垾瀛愩�併偍銉炽儔銉︺兗銈躲兗銇韩鍏冦倰瀹氱京銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻�佺当瑷堛伄銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍��
+          銈€儣銉偙銉笺偡銉с兂鍐呫仹闁嬬櫤鑰呫伀銈堛仯銇︿竴鎰忋伀瀹氱京銇曘倢銈嬨伖銇嶃仹銇欍��
+      </Property>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+      浼氳┍ID銆佷互鍓嶃伄銉併儯銉冦儓瑷橀尣銇熀銇ャ亜銇︿細瑭便倰缍氥亼銈嬨伀銇�佷互鍓嶃伄銉°儍銈汇兗銈搞伄conversation_id銈掓浮銇欏繀瑕併亴銇傘倞銇俱仚銆�
+      </Property>
+      <Property name='files' type='array[object]' key='files'>
+          銉曘偂銈ゃ儷銉偣銉堛�併儐銈偣銉堛伄鐞嗚В銇ㄨ唱鍟忋伕銇洖绛斻倰绲勩伩鍚堛倧銇涖仧銉曘偂銈ゃ儷銇叆鍔涖伀閬┿仐銇︺亰銈娿�併儮銉囥儷銇屻儞銈搞儳銉虫鑳姐倰銈点儩銉笺儓銇椼仸銇勩倠鍫村悎銇伄銇垮埄鐢ㄥ彲鑳姐仹銇欍��
+          - `type` (string) 銈点儩銉笺儓銇曘倢銇︺亜銈嬨偪銈ゃ儣锛� 
+            - `document` ('TXT', 'MD', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB')
+            - `image` ('JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG')
+            - `audio` ('MP3', 'M4A', 'WAV', 'WEBM', 'AMR')
+            - `video` ('MP4', 'MOV', 'MPEG', 'MPGA')
+            - `custom` (浠栥伄銉曘偂銈ゃ儷銈裤偆銉�)
+          - `transfer_method` (string) 杌㈤�佹柟娉曘�佺敾鍍廢RL銇牬鍚堛伅`remote_url` / 銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔銇牬鍚堛伅`local_file`
+          - `url` (string) 鐢诲儚URL锛堣虎閫佹柟娉曘亴`remote_url`銇牬鍚堬級
+          - `upload_file_id` (string) 銈€儍銉椼儹銉笺儔銇曘倢銇熴儠銈°偆銉獻D銆佷簨鍓嶃伀銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔API銈掗�氥仒銇﹀彇寰椼仚銈嬪繀瑕併亴銇傘倞銇俱仚锛堣虎閫佹柟娉曘亴`local_file`銇牬鍚堬級
+      </Property>
+      <Property name='auto_generate_name' type='bool' key='auto_generate_name'>
+      銈裤偆銉堛儷銈掕嚜鍕曠敓鎴愩�併儑銉曘偐銉儓銇痐true`銆�
+      `false`銇ō瀹氥仚銈嬨仺銆佷細瑭便伄銉儘銉笺儬API銈掑懠銇冲嚭銇椼�乣auto_generate`銈抈true`銇ō瀹氥仚銈嬨亾銇ㄣ仹闈炲悓鏈熴偪銈ゃ儓銉敓鎴愩倰瀹熺従銇с亶銇俱仚銆�
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+    response_mode銇屻儢銉儍銈兂銈般伄鍫村悎銆丆ompletionResponse銈儢銈搞偋銈儓銈掕繑銇椼伨銇欍��
+    response_mode銇屻偣銉堛儶銉笺儫銉炽偘銇牬鍚堛�丆hunkCompletionResponse銈广儓銉兗銉犮倰杩斻仐銇俱仚銆�
+
+    ### ChatCompletionResponse
+    瀹屽叏銇偄銉椼儶绲愭灉銈掕繑銇椼伨銇欍�俙Content-Type`銇痐application/json`銇с仚銆�
+    - `event` (string) 銈ゃ儥銉炽儓銈裤偆銉椼�佸浐瀹氥仹 `message`
+    - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+    - `id` (string) 銉︺儖銉笺偗ID
+    - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+    - `conversation_id` (string) 浼氳┍ID
+    - `mode` (string) 銈€儣銉儮銉笺儔銆乣chat`銇ㄣ仐銇﹀浐瀹�
+    - `answer` (string) 瀹屽叏銇繙绛斿唴瀹�
+    - `metadata` (object) 銉°偪銉囥兗銈�
+      - `usage` (Usage) 銉€儑銉娇鐢ㄦ儏鍫�
+      - `retriever_resources` (array[RetrieverResource]) 寮曠敤銇ㄥ赴灞炪儶銈广儓
+    - `created_at` (int) 銉°儍銈汇兗銈镐綔鎴愩偪銈ゃ儬銈广偪銉炽儣銆佷緥锛�1705395332
+
+    ### ChunkChatCompletionResponse
+    銈€儣銉伀銈堛仯銇﹀嚭鍔涖仌銈屻仧銈广儓銉兗銉犮儊銉c兂銈倰杩斻仐銇俱仚銆俙Content-Type`銇痐text/event-stream`銇с仚銆�
+    鍚勩偣銉堛儶銉笺儫銉炽偘銉併儯銉炽偗銇痐data:`銇у銇俱倞銆�2銇ゃ伄鏀硅鏂囧瓧`\n\n`銇у尯鍒囥倝銈屻伨銇欍�備互涓嬨伄銈堛亞銇〃绀恒仌銈屻伨銇欙細
+    <CodeGroup>
+    ```streaming {{ title: '蹇滅瓟' }}
+    data: {"event": "message", "task_id": "900bbd43-dc0b-4383-a372-aa6e6c414227", "id": "663c5084-a254-4040-8ad3-51f2a3c1a77c", "answer": "Hi", "created_at": 1705398420}\n\n
+    ```
+    </CodeGroup>
+    銈广儓銉兗銉熴兂銈般儊銉c兂銈伄妲嬮�犮伅`event`銇繙銇樸仸鐣般仾銈娿伨銇欙細
+    - `event: message` LLM銇屻儐銈偣銉堛儊銉c兂銈偆銉欍兂銉堛倰杩斻仐銇俱仚銆傘仱銇俱倞銆佸畬鍏ㄣ仾銉嗐偔銈广儓銇屻儊銉c兂銈舰寮忋仹鍑哄姏銇曘倢銇俱仚銆�
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `conversation_id` (string) 浼氳┍ID
+      - `answer` (string) LLM銇岃繑銇椼仧銉嗐偔銈广儓銉併儯銉炽偗鍐呭
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: message_file` 銉°儍銈汇兗銈搞儠銈°偆銉偆銉欍兂銉堛�併儎銉笺儷銇倛銇c仸鏂般仐銇勩儠銈°偆銉亴浣滄垚銇曘倢銇俱仐銇�
+      - `id` (string) 銉曘偂銈ゃ儷涓�鎰廔D
+      - `type` (string) 銉曘偂銈ゃ儷銈裤偆銉椼�佺従鍦ㄣ伅"image"銇伩瑷卞彲
+      - `belongs_to` (string) 鎵�灞炪�併亾銇撱仹銇�'assistant'銇伩
+      - `url` (string) 銉曘偂銈ゃ儷銇儶銉€兗銉圲RL
+      - `conversation_id`  (string) 浼氳┍ID
+    - `event: message_end` 銉°儍銈汇兗銈哥祩浜嗐偆銉欍兂銉堛�併亾銇偆銉欍兂銉堛倰鍙椾俊銇欍倠銇ㄣ偣銉堛儶銉笺儫銉炽偘銇岀祩浜嗐仐銇熴亾銇ㄣ倰鎰忓懗銇椼伨銇欍��
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `conversation_id` (string) 浼氳┍ID
+      - `metadata` (object) 銉°偪銉囥兗銈�
+        - `usage` (Usage) 銉€儑銉娇鐢ㄦ儏鍫�
+        - `retriever_resources` (array[RetrieverResource]) 寮曠敤銇ㄥ赴灞炪儶銈广儓
+    - `event: tts_message` TTS銈兗銉囥偅銈偣銉堛儶銉笺儬銈ゃ儥銉炽儓銆併仱銇俱倞闊冲0鍚堟垚鍑哄姏銆傚唴瀹广伅Mp3褰㈠紡銇偑銉笺儑銈c偑銉栥儹銉冦偗銇с�乥ase64鏂囧瓧鍒椼仺銇椼仸銈ㄣ兂銈炽兗銉夈仌銈屻仸銇勩伨銇欍�傚啀鐢熸檪銇伅銆乥ase64銈掋儑銈炽兗銉夈仐銇︺儣銉兗銉ゃ兗銇叆鍔涖仚銈嬨仩銇戙仹銇欍�傦紙銇撱伄銉°儍銈汇兗銈搞伅鑷嫊鍐嶇敓銇屾湁鍔广仾鍫村悎銇伄銇垮埄鐢ㄥ彲鑳斤級
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄銈广儓銉冦儣蹇滅瓟銈ゃ兂銈裤兗銉曘偋銉笺偣銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `audio` (string) 闊冲0鍚堟垚寰屻伄銈兗銉囥偅銈�乥ase64銉嗐偔銈广儓銈炽兂銉嗐兂銉勩仺銇椼仸銈ㄣ兂銈炽兗銉夈仌銈屻仸銇娿倞銆佸啀鐢熸檪銇伅base64銈掋儑銈炽兗銉夈仐銇︺儣銉兗銉ゃ兗銇叆鍔涖仚銈嬨仩銇戙仹銇�
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: tts_message_end` TTS銈兗銉囥偅銈偣銉堛儶銉笺儬绲備簡銈ゃ儥銉炽儓銆併亾銇偆銉欍兂銉堛倰鍙椾俊銇欍倠銇ㄣ偑銉笺儑銈c偑銈广儓銉兗銉犮亴绲備簡銇椼仧銇撱仺銈掔ず銇椼伨銇欍��
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄銈广儓銉冦儣蹇滅瓟銈ゃ兂銈裤兗銉曘偋銉笺偣銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `audio` (string) 绲備簡銈ゃ儥銉炽儓銇伅銈兗銉囥偅銈亴銇亜銇熴倎銆併亾銈屻伅绌恒伄鏂囧瓧鍒椼仹銇�
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: message_replace` 銉°儍銈汇兗銈稿唴瀹圭疆鎻涖偆銉欍兂銉堛��
+      鍑哄姏鍐呭銇儮銉囥儸銉笺偡銉с兂銇屾湁鍔广仾鍫村悎銆佸唴瀹广亴銉曘儵銈颁粯銇戙仌銈屻倠銇ㄣ�併亾銇偆銉欍兂銉堛倰閫氥仒銇︺儭銉冦偦銉笺偢鍐呭銇屻儣銉偦銉冦儓銇繑淇°伀缃亶鎻涖亪銈夈倢銇俱仚銆�
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `conversation_id` (string) 浼氳┍ID
+      - `answer` (string) 缃彌鍐呭锛堛仚銇广仸銇甃LM杩斾俊銉嗐偔銈广儓銈掔洿鎺ョ疆銇嶆彌銇堛伨銇欙級
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: workflow_started` 銉兗銈儠銉兗銇屽疅琛屻倰闁嬪
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `workflow_run_id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰廔D
+      - `event` (string) `workflow_started`銇浐瀹�
+      - `data` (object) 瑭崇窗
+        - `id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰廔D
+        - `workflow_id` (string) 闁㈤�c儻銉笺偗銉曘儹銉笺伄ID
+        - `sequence_number` (int) 鑷繁澧楀姞銈枫儶銈€儷鐣彿銆併偄銉椼儶鍐呫仹鑷繁澧楀姞銇椼��1銇嬨倝濮嬨伨銈娿伨銇�
+        - `created_at` (timestamp) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: node_started` 銉庛兗銉夊疅琛屻亴闁嬪
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `workflow_run_id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰廔D
+      - `event` (string) `node_started`銇浐瀹�
+      - `data` (object) 瑭崇窗
+        - `id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰廔D
+        - `node_id` (string) 銉庛兗銉夈伄ID
+        - `node_type` (string) 銉庛兗銉夈伄銈裤偆銉�
+        - `title` (string) 銉庛兗銉夈伄鍚嶅墠
+        - `index` (int) 瀹熻銈枫兗銈便兂銈圭暘鍙枫�併儓銉兗銈广儙銉笺儔銈枫兗銈便兂銈广倰琛ㄧず銇欍倠銇熴倎銇娇鐢�
+        - `predecessor_node_id` (string) 銈儣銈枫儳銉炽伄銉椼儸銉曘偅銉冦偗銈广儙銉笺儔ID銆併偔銉c兂銉愩偣琛ㄧず瀹熻銉戙偣銇娇鐢�
+        - `inputs` (object) 銉庛兗銉夈仹浣跨敤銇曘倢銈嬨仚銇广仸銇墠銇儙銉笺儔澶夋暟銇唴瀹�
+        - `created_at` (timestamp) 闁嬪銇偪銈ゃ儬銈广偪銉炽儣銆佷緥锛�1705395332
+    - `event: node_finished` 銉庛兗銉夊疅琛屻亴绲備簡銆佹垚鍔熴伨銇熴伅澶辨晽銇悓銇樸偆銉欍兂銉堝唴銇х暟銇倠鐘舵厠銇хず銇曘倢銇俱仚
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `workflow_run_id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰廔D
+      - `event` (string) `node_finished`銇浐瀹�
+      - `data` (object) 瑭崇窗
+        - `id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰廔D
+        - `node_id` (string) 銉庛兗銉夈伄ID
+        - `node_type` (string) 銉庛兗銉夈伄銈裤偆銉�
+        - `title` (string) 銉庛兗銉夈伄鍚嶅墠
+        - `index` (int) 瀹熻銈枫兗銈便兂銈圭暘鍙枫�併儓銉兗銈广儙銉笺儔銈枫兗銈便兂銈广倰琛ㄧず銇欍倠銇熴倎銇娇鐢�
+        - `predecessor_node_id` (string) 銈儣銈枫儳銉炽伄銉椼儸銉曘偅銉冦偗銈广儙銉笺儔ID銆併偔銉c兂銉愩偣琛ㄧず瀹熻銉戙偣銇娇鐢�
+        - `inputs` (object) 銉庛兗銉夈仹浣跨敤銇曘倢銈嬨仚銇广仸銇墠銇儙銉笺儔澶夋暟銇唴瀹�
+        - `process_data` (json) 銈儣銈枫儳銉炽伄銉庛兗銉夈儣銉偦銈广儑銉笺偪
+        - `outputs` (json) 銈儣銈枫儳銉炽伄鍑哄姏鍐呭
+        - `status` (string) 瀹熻銇姸鎱嬨�乣running` / `succeeded` / `failed` / `stopped`
+        - `error` (string) 銈儣銈枫儳銉炽伄銈ㄣ儵銉肩悊鐢�
+        - `elapsed_time` (float) 銈儣銈枫儳銉炽伄浣跨敤銇曘倢銈嬪悎瑷堢鏁�
+        - `execution_metadata` (json) 銉°偪銉囥兗銈�
+          - `total_tokens` (int) 銈儣銈枫儳銉炽伄浣跨敤銇曘倢銈嬨儓銉笺偗銉虫暟
+          - `total_price` (decimal) 銈儣銈枫儳銉炽伄鍚堣▓銈炽偣銉�
+          - `currency` (string) 銈儣銈枫儳銉炽�佷緥锛歚USD` / `RMB`
+        - `created_at` (timestamp) 闁嬪銇偪銈ゃ儬銈广偪銉炽儣銆佷緥锛�1705395332
+    - `event: workflow_finished` 銉兗銈儠銉兗瀹熻銇岀祩浜嗐�佹垚鍔熴伨銇熴伅澶辨晽銇悓銇樸偆銉欍兂銉堝唴銇х暟銇倠鐘舵厠銇хず銇曘倢銇俱仚
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `workflow_run_id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰廔D
+      - `event` (string) `workflow_finished`銇浐瀹�
+      - `data` (object) 瑭崇窗
+        - `id` (string) 銉兗銈儠銉兗瀹熻銇甀D
+        - `workflow_id` (string) 闁㈤�c儻銉笺偗銉曘儹銉笺伄ID
+        - `status` (string) 瀹熻銇姸鎱嬨�乣running` / `succeeded` / `failed` / `stopped`
+        - `outputs` (json) 銈儣銈枫儳銉炽伄鍑哄姏鍐呭
+        - `error` (string) 銈儣銈枫儳銉炽伄銈ㄣ儵銉肩悊鐢�
+        - `elapsed_time` (float) 銈儣銈枫儳銉炽伄浣跨敤銇曘倢銈嬪悎瑷堢鏁�
+        - `total_tokens` (int) 銈儣銈枫儳銉炽伄浣跨敤銇曘倢銈嬨儓銉笺偗銉虫暟
+        - `total_steps` (int) 銉囥儠銈┿儷銉�0
+        - `created_at` (timestamp) 闁嬪鏅傞枔
+        - `finished_at` (timestamp) 绲備簡鏅傞枔
+    - `event: error`
+      銈广儓銉兗銉熴兂銈般儣銉偦銈逛腑銇櫤鐢熴仚銈嬩緥澶栥伅銈广儓銉兗銉犮偆銉欍兂銉堛伄褰㈠紡銇у嚭鍔涖仌銈屻�併偍銉┿兗銈ゃ儥銉炽儓銈掑彈淇°仚銈嬨仺銈广儓銉兗銉犮亴绲備簡銇椼伨銇欍��
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `status` (int) HTTP銈广儐銉笺偪銈广偝銉笺儔
+      - `code` (string) 銈ㄣ儵銉笺偝銉笺儔
+      - `message` (string) 銈ㄣ儵銉笺儭銉冦偦銉笺偢
+    - `event: ping` 鎺ョ稓銈掔董鎸併仚銈嬨仧銈併伀10绉掋仈銇ㄣ伀ping銈ゃ儥銉炽儓銇岀櫤鐢熴仐銇俱仚銆�
+
+    ### 銈ㄣ儵銉�
+    - 404, 浼氳┍銇屽瓨鍦ㄣ仐銇俱仜銈�
+    - 400, `invalid_param`, 鐣板父銇儜銉┿儭銉笺偪鍏ュ姏
+    - 400, `app_unavailable`, 銈€儣銉鎴愩亴鍒╃敤銇с亶銇俱仜銈�
+    - 400, `provider_not_initialize`, 鍒╃敤鍙兘銇儮銉囥儷璩囨牸鎯呭牨妲嬫垚銇屻亗銈娿伨銇涖倱
+    - 400, `provider_quota_exceeded`, 銉€儑銉懠銇冲嚭銇椼偗銈┿兗銈裤亴涓嶈冻銇椼仸銇勩伨銇�
+    - 400, `model_currently_not_support`, 鐝惧湪銇儮銉囥儷銇屽埄鐢ㄣ仹銇嶃伨銇涖倱
+    - 400, `completion_request_error`, 銉嗐偔銈广儓鐢熸垚銇け鏁椼仐銇俱仐銇�
+    - 500, 鍐呴儴銈点兗銉愩兗銈ㄣ儵銉�
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/chat-messages" targetCode={`curl -X POST '${props.appDetail.api_base_url}/chat-messages' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "inputs": ${JSON.stringify(props.inputs)},\n    "query": "iPhone 13 Pro Max銇粫妲樸伅浣曘仹銇欍亱锛�",\n    "response_mode": "streaming",\n    "conversation_id": "",\n    "user": "abc-123",\n    "files": [\n      {\n        "type": "image",\n        "transfer_method": "remote_url",\n        "url": "https://cloud.dify.ai/logo/logo-site.png"\n      }\n    ]\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/chat-messages' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "inputs": {},
+        "query": "eh",
+        "response_mode": "streaming",
+        "conversation_id": "1c7e55fb-1ba2-4e10-81b5-30addcea2276",
+        "user": "abc-123"
+    }'
+    ```
+    </CodeGroup>
+    ### 銉栥儹銉冦偔銉炽偘銉€兗銉�
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+        "event": "message",
+        "task_id": "c3800678-a077-43df-a102-53f23ed20b88", 
+        "id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "message_id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2",
+        "mode": "chat",
+        "answer": "iPhone 13 Pro Max銇粫妲樸伅娆°伄銇ㄣ亰銈娿仹銇�:...",
+        "metadata": {
+            "usage": {
+                "prompt_tokens": 1033,
+                "prompt_unit_price": "0.001",
+                "prompt_price_unit": "0.001",
+                "prompt_price": "0.0010330",
+                "completion_tokens": 128,
+                "completion_unit_price": "0.002",
+                "completion_price_unit": "0.001",
+                "completion_price": "0.0002560",
+                "total_tokens": 1161,
+                "total_price": "0.0012890",
+                "currency": "USD",
+                "latency": 0.7682376249867957
+            },
+            "retriever_resources": [
+                {
+                    "position": 1,
+                    "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb",
+                    "dataset_name": "iPhone",
+                    "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00",
+                    "document_name": "iPhone List",
+                    "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a",
+                    "score": 0.98457545,
+                    "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""
+                }
+            ]
+        },
+        "created_at": 1705407629
+    }
+    ```
+    </CodeGroup>
+    ### 銈广儓銉兗銉熴兂銈般儮銉笺儔
+    <CodeGroup title="蹇滅瓟">
+    ```streaming {{ title: '蹇滅瓟' }}
+      data: {"event": "workflow_started", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "workflow_id": "dfjasklfjdslag", "sequence_number": 1, "created_at": 1679586595}}
+      data: {"event": "node_started", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "node_id": "dfjasklfjdslag", "node_type": "start", "title": "Start", "index": 0, "predecessor_node_id": "fdljewklfklgejlglsd", "inputs": {}, "created_at": 1679586595}}
+      data: {"event": "node_finished", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "node_id": "dfjasklfjdslag", "node_type": "start", "title": "Start", "index": 0, "predecessor_node_id": "fdljewklfklgejlglsd", "inputs": {}, "outputs": {}, "status": "succeeded", "elapsed_time": 0.324, "execution_metadata": {"total_tokens": 63127864, "total_price": 2.378, "currency": "USD"},  "created_at": 1679586595}}
+      data: {"event": "workflow_finished", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "workflow_id": "dfjasklfjdslag", "outputs": {}, "status": "succeeded", "elapsed_time": 0.324, "total_tokens": 63127864, "total_steps": "1", "created_at": 1679586595, "finished_at": 1679976595}}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " I", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": "'m", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " glad", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " to", "created_at": 1679586595}
+      data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " meet", "created_at": 1679586595}
+      data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " you", "created_at": 1679586595}
+      data: {"event": "message_end", "id": "5e52ce04-874b-4d27-9045-b3bc80def685", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "metadata": {"usage": {"prompt_tokens": 1033, "prompt_unit_price": "0.001", "prompt_price_unit": "0.001", "prompt_price": "0.0010330", "completion_tokens": 135, "completion_unit_price": "0.002", "completion_price_unit": "0.001", "completion_price": "0.0002700", "total_tokens": 1168, "total_price": "0.0013030", "currency": "USD", "latency": 1.381760165997548}, "retriever_resources": [{"position": 1, "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb", "dataset_name": "iPhone", "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00", "document_name": "iPhone List", "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a", "score": 0.98457545, "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""}]}}
+      data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+      data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+    ```
+    </CodeGroup>
+
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/files/upload'
+  method='POST'
+  title='銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔'
+  name='#file-upload'
+/>
+<Row>
+  <Col>
+  銉°儍銈汇兗銈搁�佷俊鏅傘伀浣跨敤銇欍倠銉曘偂銈ゃ儷銈掋偄銉冦儣銉兗銉夈仐銆佺敾鍍忋仺銉嗐偔銈广儓銇優銉儊銉€兗銉�銉悊瑙c倰鍙兘銇仐銇俱仚銆�
+  銈€儣銉偙銉笺偡銉с兂銇с偟銉濄兗銉堛仌銈屻仸銇勩倠褰㈠紡銈掋偟銉濄兗銉堛仐銇俱仚銆�
+  銈€儍銉椼儹銉笺儔銇曘倢銇熴儠銈°偆銉伅鐝惧湪銇偍銉炽儔銉︺兗銈躲兗銇伩銇屼娇鐢ㄣ仹銇嶃伨銇欍��
+
+  ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+  銇撱伄銈ゃ兂銈裤兗銉曘偋銉笺偣銇痐multipart/form-data`銉偗銈ㄣ偣銉堛倰蹇呰銇ㄣ仐銇俱仚銆�
+  - `file` (File) 蹇呴爤
+    銈€儍銉椼儹銉笺儔銇欍倠銉曘偂銈ゃ儷銆�
+  - `user` (string) 蹇呴爤
+    銉︺兗銈躲兗璀樺垾瀛愩�侀枊鐧鸿�呫伄銉兗銉伀銈堛仯銇﹀畾缇┿仌銈屻�併偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇亼銈屻伆銇倞銇俱仜銈撱��
+
+  ### 蹇滅瓟
+  銈€儍銉椼儹銉笺儔銇屾垚鍔熴仚銈嬨仺銆併偟銉笺儛銉笺伅銉曘偂銈ゃ儷銇甀D銇ㄩ枹閫f儏鍫便倰杩斻仐銇俱仚銆�
+  - `id` (uuid) ID
+  - `name` (string) 銉曘偂銈ゃ儷鍚�
+  - `size` (int) 銉曘偂銈ゃ儷銈点偆銈猴紙銉愩偆銉堬級
+  - `extension` (string) 銉曘偂銈ゃ儷鎷″嫉瀛�
+  - `mime_type` (string) 銉曘偂銈ゃ儷銇甅IME銈裤偆銉�
+  - `created_by` (uuid) 銈ㄣ兂銉夈儲銉笺偠銉糏D
+  - `created_at` (timestamp) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+
+  ### 銈ㄣ儵銉�
+  - 400, `no_file_uploaded`, 銉曘偂銈ゃ儷銇屾彁渚涖仌銈屻仾銇戙倢銇般仾銈娿伨銇涖倱
+  - 400, `too_many_files`, 鐝惧湪銇�1銇ゃ伄銉曘偂銈ゃ儷銇伩鍙椼亼浠樸亼銇俱仚
+  - 400, `unsupported_preview`, 銉曘偂銈ゃ儷銇儣銉儞銉ャ兗銈掋偟銉濄兗銉堛仐銇︺亜銇俱仜銈�
+  - 400, `unsupported_estimate`, 銉曘偂銈ゃ儷銇帹瀹氥倰銈点儩銉笺儓銇椼仸銇勩伨銇涖倱
+  - 413, `file_too_large`, 銉曘偂銈ゃ儷銇屽ぇ銇嶃仚銇庛伨銇�
+  - 415, `unsupported_file_type`, 銈点儩銉笺儓銇曘倢銇︺亜銇亜鎷″嫉瀛愩�佺従鍦ㄣ伅銉夈偔銉ャ儭銉炽儓銉曘偂銈ゃ儷銇伩鍙椼亼浠樸亼銇俱仚
+  - 503, `s3_connection_failed`, S3銈点兗銉撱偣銇帴缍氥仹銇嶃伨銇涖倱
+  - 503, `s3_permission_denied`, S3銇儠銈°偆銉倰銈€儍銉椼儹銉笺儔銇欍倠妯╅檺銇屻亗銈娿伨銇涖倱
+  - 503, `s3_file_too_large`, 銉曘偂銈ゃ儷銇孲3銇偟銈ゃ偤鍒堕檺銈掕秴銇堛仸銇勩伨銇�
+  - 500, 鍐呴儴銈点兗銉愩兗銈ㄣ儵銉�
+
+
+  </Col>
+  <Col sticky>
+  ### 銉偗銈ㄣ偣銉堜緥
+  <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/files/upload" targetCode={`curl -X POST '${props.appDetail.api_base_url}/files/upload' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=image/[png|jpeg|jpg|webp|gif] \\\n--form 'user=abc-123'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/files/upload' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@"/path/to/file"'
+    ```
+
+    </CodeGroup>
+
+
+  ### 蹇滅瓟渚�
+  <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "id": "72fa9618-8f89-4a37-9b33-7e1178a24a67",
+      "name": "example.png",
+      "size": 1024,
+      "extension": "png",
+      "mime_type": "image/png",
+      "created_by": "6ad1ab0a-73ff-4ac1-b9e4-cdb312f71f13",
+      "created_at": 1577836800,
+    }
+  ```
+  </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/chat-messages/:task_id/stop'
+  method='POST'
+  title='鐢熸垚銈掑仠姝�'
+  name='#stop-generatebacks'
+/>
+<Row>
+  <Col>
+  銈广儓銉兗銉熴兂銈般儮銉笺儔銇с伄銇裤偟銉濄兗銉堛仌銈屻仸銇勩伨銇欍��
+  ### 銉戙偣
+  - `task_id` (string) 銈裤偣銈疘D銆併偣銉堛儶銉笺儫銉炽偘銉併儯銉炽偗銇繑銈婂�ゃ亱銈夊彇寰椼仹銇嶃伨銇�
+  ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+  - `user` (string) 蹇呴爤
+    銉︺兗銈躲兗璀樺垾瀛愩�併偍銉炽儔銉︺兗銈躲兗銇韩鍏冦倰瀹氱京銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻�侀�佷俊銉°儍銈汇兗銈搞偆銉炽偪銉笺儠銈с兗銈广仹娓°仌銈屻仧銉︺兗銈躲兗銇ㄤ竴鑷淬仐銇︺亜銈嬪繀瑕併亴銇傘倞銇俱仚銆�
+  ### 蹇滅瓟
+  - `result` (string) 甯搞伀"success"銈掕繑銇椼伨銇�
+  </Col>
+  <Col sticky>
+  ### 銉偗銈ㄣ偣銉堜緥
+  <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/chat-messages/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/chat-messages/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/chat-messages/:task_id/stop' \
+    -H 'Authorization: Bearer {api_key}' \
+    -H 'Content-Type: application/json' \
+    --data-raw '{
+        "user": "abc-123"
+    }'
+    ```
+    </CodeGroup>
+
+    ### 蹇滅瓟渚�
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/messages/:message_id/feedbacks'
+  method='POST'
+  title='銉°儍銈汇兗銈搞儠銈c兗銉夈儛銉冦偗'
+  name='#feedbacks'
+/>
+<Row>
+  <Col>
+    銈ㄣ兂銉夈儲銉笺偠銉笺伅銉曘偅銉笺儔銉愩儍銈儭銉冦偦銉笺偢銈掓彁渚涖仹銇嶃�併偄銉椼儶銈便兗銈枫儳銉抽枊鐧鸿�呫亴鏈熷緟銇曘倢銈嬪嚭鍔涖倰鏈�閬╁寲銇欍倠銇倰鏀彺銇椼伨銇欍��
+
+    ### 銉戙偣
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+       銉°儍銈汇兗銈窱D
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+
+    <Properties>
+      <Property name='rating' type='string' key='rating'>
+        銈€儍銉椼儨銉笺儓銇痐like`銆併儉銈︺兂銉溿兗銉堛伅`dislike`銆併偄銉冦儣銉溿兗銉堛伄鍙栥倞娑堛仐銇痐null`
+      </Property>
+      <Property name='user' type='string' key='user'>
+        銉︺兗銈躲兗璀樺垾瀛愩�侀枊鐧鸿�呫伄銉兗銉伀銈堛仯銇﹀畾缇┿仌銈屻�併偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇亼銈屻伆銇倞銇俱仜銈撱��
+      </Property>
+      <Property name='content' type='string' key='content'>
+        銉°儍銈汇兗銈搞伄銉曘偅銉笺儔銉愩儍銈仹銇欍��
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+    - `result` (string) 甯搞伀"success"銈掕繑銇椼伨銇�
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/messages/:message_id/feedbacks" targetCode={`curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks \\\n --header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "rating": "like",\n    "user": "abc-123",\n    "content": "message feedback information"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "rating": "like",
+        "user": "abc-123",
+        "content": "message feedback information"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/app/feedbacks'
+  method='GET'
+  title='銈€儣銉伄銉°儍銈汇兗銈搞伄銆屻亜銇勩伃銆嶃仺銉曘偅銉笺儔銉愩儍銈倰鍙栧緱'
+  name='#app-feedbacks'
+/>
+<Row>
+  <Col>
+    銈€儣銉伄銈ㄣ兂銉夈儲銉笺偠銉笺亱銈夈伄銉曘偅銉笺儔銉愩儍銈倓銆屻亜銇勩伃銆嶃倰鍙栧緱銇椼伨銇欍��
+
+    ### 銈偍銉�
+    <Properties>
+      <Property name='page' type='string' key='page'>
+       锛堜换鎰忥級銉氥兗銈哥暘鍙枫�傘儑銉曘偐銉儓鍊わ細1
+      </Property>
+    </Properties>
+
+    <Properties>
+      <Property name='limit' type='string' key='limit'>
+       锛堜换鎰忥級1銉氥兗銈搞亗銇熴倞銇欢鏁般�傘儑銉曘偐銉儓鍊わ細20
+      </Property>
+    </Properties>
+
+    ### 銉偣銉濄兂銈�
+    - `data` (銉偣銉�) 銇撱伄銈€儣銉伄銆屻亜銇勩伃銆嶃仺銉曘偅銉笺儔銉愩儍銈伄涓�瑕с倰杩斻仐銇俱仚銆�
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/app/feedbacks" targetCode={`curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+        {
+        "data": [
+            {
+                "id": "8c0fbed8-e2f9-49ff-9f0e-15a35bdd0e25",
+                "app_id": "f252d396-fe48-450e-94ec-e184218e7346",
+                "conversation_id": "2397604b-9deb-430e-b285-4726e51fd62d",
+                "message_id": "709c0b0f-0a96-4a4e-91a4-ec0889937b11",
+                "rating": "like",
+                "content": "message feedback information-3",
+                "from_source": "user",
+                "from_end_user_id": "74286412-9a1a-42c1-929c-01edb1d381d5",
+                "from_account_id": null,
+                "created_at": "2025-04-24T09:24:38",
+                "updated_at": "2025-04-24T09:24:38"
+            }
+        ]
+        }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+
+<Heading
+  url='/messages/{message_id}/suggested'
+  method='GET'
+  title='娆°伄鎺ㄥエ璩晱'
+  name='#suggested'
+/>
+<Row>
+  <Col>
+    鐝惧湪銇儭銉冦偦銉笺偢銇銇欍倠娆°伄璩晱銇彁妗堛倰鍙栧緱銇椼伨銇�
+
+    ### 銉戙偣銉戙儵銉°兗銈�
+
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+        銉°儍銈汇兗銈窱D
+      </Property>
+    </Properties>
+
+    ### 銈偍銉�
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        銉︺兗銈躲兗璀樺垾瀛愩�併偍銉炽儔銉︺兗銈躲兗銇韩鍏冦倰瀹氱京銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻�佺当瑷堛伄銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍��
+        銈€儣銉偙銉笺偡銉с兂鍐呫仹闁嬬櫤鑰呫伀銈堛仯銇︿竴鎰忋伀瀹氱京銇曘倢銈嬨伖銇嶃仹銇欍��
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="GET" label="/messages/{message_id}/suggested" targetCode={`curl --location --request GET '${props.appDetail.api_base_url}/messages/{message_id}/suggested?user=abc-123& \\\n--header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \\\n--header 'Content-Type: application/json'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.appDetail.api_base_url}/messages/{message_id}/suggested?user=abc-123' \
+    --header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \
+    --header 'Content-Type: application/json' \
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "result": "success",
+      "data": [
+            "a",
+            "b",
+            "c"
+        ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/messages'
+  method='GET'
+  title='浼氳┍灞ユ銉°儍銈汇兗銈搞倰鍙栧緱'
+  name='#messages'
+/>
+<Row>
+  <Col>
+    銈广偗銉兗銉儹銉笺儔褰㈠紡銇у饱姝淬儊銉c儍銉堣閷层倰杩斻仐銆佹渶鍒濄伄銉氥兗銈搞伅鏈�鏂般伄`{limit}`銉°儍銈汇兗銈搞倰杩斻仐銇俱仚銆傘仱銇俱倞銆侀�嗛爢銇с仚銆�
+
+    ### 銈偍銉�
+
+    <Properties>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+        浼氳┍ID
+      </Property>
+      <Property name='user' type='string' key='user'>
+        銉︺兗銈躲兗璀樺垾瀛愩�併偍銉炽儔銉︺兗銈躲兗銇韩鍏冦倰瀹氱京銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻�佺当瑷堛伄銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍��
+        銈€儣銉偙銉笺偡銉с兂鍐呫仹闁嬬櫤鑰呫伀銈堛仯銇︿竴鎰忋伀瀹氱京銇曘倢銈嬨伖銇嶃仹銇欍��
+      </Property>
+      <Property name='first_id' type='string' key='first_id'>
+          鐝惧湪銇儦銉笺偢銇渶鍒濄伄銉併儯銉冦儓瑷橀尣銇甀D銆併儑銉曘偐銉儓銇痭ull銇с仚銆�
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+          1鍥炪伄銉偗銈ㄣ偣銉堛仹杩斻仚銉併儯銉冦儓灞ユ銉°儍銈汇兗銈搞伄鏁般�併儑銉曘偐銉儓銇�20銇с仚銆�
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+    - `data` (array[object]) 銉°儍銈汇兗銈搞儶銈广儓
+    - `id` (string) 銉°儍銈汇兗銈窱D
+    - `conversation_id` (string) 浼氳┍ID
+    - `inputs` (object) 銉︺兗銈躲兗鍏ュ姏銉戙儵銉°兗銈裤��
+    - `query` (string) 銉︺兗銈躲兗鍏ュ姏/璩晱鍐呭銆�
+    - `message_files` (array[object]) 銉°儍銈汇兗銈搞儠銈°偆銉�
+      - `id` (string) ID
+      - `type` (string) 銉曘偂銈ゃ儷銈裤偆銉椼�佺敾鍍忋伄鍫村悎銇痠mage
+      - `url` (string) 銉椼儸銉撱儱銉肩敾鍍廢RL
+      - `belongs_to` (string) 鎵�灞炪�乽ser銇俱仧銇痑ssistant
+    - `answer` (string) 蹇滅瓟銉°儍銈汇兗銈稿唴瀹�
+    - `created_at` (timestamp) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `feedback` (object) 銉曘偅銉笺儔銉愩儍銈儏鍫�
+      - `rating` (string) 銈€儍銉椼儨銉笺儓銇痐like` / 銉�銈︺兂銉溿兗銉堛伅`dislike`
+    - `retriever_resources` (array[RetrieverResource]) 寮曠敤銇ㄥ赴灞炪儶銈广儓
+  - `has_more` (bool) 娆°伄銉氥兗銈搞亴銇傘倠銇嬨仼銇嗐亱
+  - `limit` (int) 杩斻仌銈屻仧闋呯洰鏁般�佸叆鍔涖亴銈枫偣銉嗐儬鍒堕檺銈掕秴銇堛倠鍫村悎銆併偡銈广儐銉犲埗闄愭暟銈掕繑銇椼伨銇�
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="GET" label="/messages" targetCode={`curl -X GET '${props.appDetail.api_base_url}/messages?user=abc-123&conversation_id='\\\n --header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/messages?user=abc-123&conversation_id='
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+    ### 蹇滅瓟渚�
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "limit": 20,
+      "has_more": false,
+      "data": [
+        {
+            "id": "a076a87f-31e5-48dc-b452-0061adbbc922",
+            "conversation_id": "cd78daf6-f9e4-4463-9ff2-54257230a0ce",
+            "inputs": {
+                "name": "dify"
+            },
+            "query": "iphone 13 pro",
+            "answer": "iPhone 13 Pro銇�2021骞�9鏈�24鏃ャ伀鐧哄2銇曘倢銆�6.1銈ゃ兂銉併伄銉囥偅銈广儣銉偆銇�1170 x 2532銇В鍍忓害銈掑倷銇堛仸銇勩伨銇欍�侶exa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)銉椼儹銈汇儍銈点��6 GB銇甊AM銈掓惌杓夈仐銆�128 GB銆�256 GB銆�512 GB銆�1 TB銇偣銉堛儸銉笺偢銈儣銈枫儳銉炽倰鎻愪緵銇椼伨銇欍�傘偒銉°儵銇�12 MP銆併儛銉冦儐銉兗瀹归噺銇�3095 mAh銇с�乮OS 15銈掓惌杓夈仐銇︺亜銇俱仚銆�",
+            "message_files": [],
+            "feedback": null,
+            "retriever_resources": [
+                {
+                    "position": 1,
+                    "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb",
+                    "dataset_name": "iPhone",
+                    "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00",
+                    "document_name": "iPhone List",
+                    "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a",
+                    "score": 0.98457545,
+                    "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""
+                }
+            ],
+            "created_at": 1705569239,
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations'
+  method='GET'
+  title='浼氳┍銈掑彇寰�'
+  name='#conversations'
+/>
+<Row>
+  <Col>
+    鐝惧湪銇儲銉笺偠銉笺伄浼氳┍銉偣銉堛倰鍙栧緱銇椼�併儑銉曘偐銉儓銇ф渶鏂般伄20浠躲倰杩斻仐銇俱仚銆�
+
+    ### 銈偍銉�
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+          銉︺兗銈躲兗璀樺垾瀛愩�併偍銉炽儔銉︺兗銈躲兗銇韩鍏冦倰瀹氱京銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻�佺当瑷堛伄銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍��
+          銈€儣銉偙銉笺偡銉с兂鍐呫仹闁嬬櫤鑰呫伀銈堛仯銇︿竴鎰忋伀瀹氱京銇曘倢銈嬨伖銇嶃仹銇欍��
+      </Property>
+      <Property name='last_id' type='string' key='last_id'>
+          (Optional)鐝惧湪銇儦銉笺偢銇渶寰屻伄瑷橀尣銇甀D銆併儑銉曘偐銉儓銇痭ull銇с仚銆�
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+          (Optional)1鍥炪伄銉偗銈ㄣ偣銉堛仹杩斻仚瑷橀尣銇暟銆併儑銉曘偐銉儓銇渶鏂般伄20浠躲仹銇欍�傛渶澶�100銆佹渶灏�1銆�
+      </Property>
+      <Property name='sort_by' type='string' key='sort_by'>
+        (Optional)銈姐兗銉堛儠銈c兗銉儔銆併儑銉曘偐銉儓锛�-updated_at锛堟洿鏂版檪闁撱仹闄嶉爢銇偨銉笺儓锛�
+        - 鍒╃敤鍙兘銇�わ細created_at, -created_at, updated_at, -updated_at
+        - 銉曘偅銉笺儷銉夈伄鍓嶃伄瑷樺彿銇爢搴忋伨銇熴伅閫嗛爢銈掕〃銇椼��"-"銇�嗛爢銈掕〃銇椼伨銇欍��
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+    - `data` (array[object]) 浼氳┍銇儶銈广儓
+      - `id` (string) 浼氳┍ID
+      - `name` (string) 浼氳┍鍚嶃�併儑銉曘偐銉儓銇с伅LLM銇倛銇c仸鐢熸垚銇曘倢銇俱仚銆�
+      - `inputs` (object) 銉︺兗銈躲兗鍏ュ姏銉戙儵銉°兗銈裤��
+      - `introduction` (string) 绱逛粙
+      - `created_at` (timestamp) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+      - `updated_at` (timestamp) 鏇存柊銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `has_more` (bool)
+    - `limit` (int) 杩斻仌銈屻仧銈ㄣ兂銉堛儶鏁般�佸叆鍔涖亴銈枫偣銉嗐儬鍒堕檺銈掕秴銇堛倠鍫村悎銆併偡銈广儐銉犲埗闄愭暟銇岃繑銇曘倢銇俱仚
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="GET" label="/conversations" targetCode={`curl -X GET '${props.appDetail.api_base_url}/conversations?user=abc-123&last_id=&limit=20' \\\n --header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations?user=abc-123&last_id=&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "limit": 20,
+      "has_more": false,
+      "data": [
+        {
+          "id": "10799fb8-64f7-4296-bbf7-b42bfbe0ae54",
+          "name": "鏂般仐銇勩儊銉c儍銉�",
+          "inputs": {
+              "book": "book",
+              "myName": "Lucy"
+          },
+          "status": "normal",
+          "created_at": 1679667915,
+          "updated_at": 1679667915
+        },
+        {
+          "id": "hSIhXBhNe8X1d8Et"
+          // ...
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations/:conversation_id'
+  method='DELETE'
+  title='浼氳┍銈掑墛闄�'
+  name='#delete'
+/>
+<Row>
+  <Col>
+    浼氳┍銈掑墛闄ゃ仐銇俱仚銆�
+
+    ### 銉戙偣
+    - `conversation_id` (string) 浼氳┍ID
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        銉︺兗銈躲兗璀樺垾瀛愩�侀枊鐧鸿�呫伀銈堛仯銇﹀畾缇┿仌銈屻�併偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇傘倠銇撱仺銈掍繚瑷笺仐銇亼銈屻伆銇倞銇俱仜銈撱��
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+    - `result` (string) 甯搞伀"success"銈掕繑銇椼伨銇�
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="DELETE" label="/conversations/:conversation_id" targetCode={`curl -X DELETE '${props.appDetail.api_base_url}/conversations/:conversation_id' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+        curl -X DELETE '${props.appDetail.api_base_url}/conversations/{conversation_id}' \
+        --header 'Content-Type: application/json' \
+        --header 'Accept: application/json' \
+        --header 'Authorization: Bearer {api_key}' \
+        --data '{
+            "user": "abc-123"
+        }'
+      ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```text {{ title: '蹇滅瓟' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/conversations/:conversation_id/name'
+  method='POST'
+  title='浼氳┍銇悕鍓嶃倰澶夋洿'
+  name='#rename'
+/>
+<Row>
+  <Col>
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    銈汇儍銈枫儳銉炽伄鍚嶅墠銈掑鏇淬仐銇俱仚銆傘偦銉冦偡銉с兂鍚嶃伅銆佽鏁般伄銈汇儍銈枫儳銉炽倰銈点儩銉笺儓銇欍倠銈儵銈ゃ偄銉炽儓銇с伄琛ㄧず銇娇鐢ㄣ仌銈屻伨銇欍��
+
+    ### 銉戙偣
+    - `conversation_id` (string) 浼氳┍ID
+
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        (Optional)浼氳┍銇悕鍓嶃�俙auto_generate`銇宍true`銇ō瀹氥仌銈屻仸銇勩倠鍫村悎銆併亾銇儜銉┿儭銉笺偪銇渷鐣ャ仹銇嶃伨銇欍��
+      </Property>
+      <Property name='auto_generate' type='bool' key='auto_generate'>
+        (Optional)銈裤偆銉堛儷銈掕嚜鍕曠敓鎴愩�併儑銉曘偐銉儓銇痐false`
+      </Property>
+      <Property name='user' type='string' key='user'>
+        銉︺兗銈躲兗璀樺垾瀛愩�侀枊鐧鸿�呫伀銈堛仯銇﹀畾缇┿仌銈屻�併偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇傘倠銇撱仺銈掍繚瑷笺仐銇亼銈屻伆銇倞銇俱仜銈撱��
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+    - `id` (string) 浼氳┍ID
+    - `name` (string) 浼氳┍鍚�
+    - `inputs` (object) 銉︺兗銈躲兗鍏ュ姏銉戙儵銉°兗銈�
+    - `status` (string) 浼氳┍鐘舵厠
+    - `introduction` (string) 绱逛粙
+    - `created_at` (timestamp) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `updated_at` (timestamp) 鏇存柊銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/conversations/:conversation_id/name" targetCode={`curl -X POST '${props.appDetail.api_base_url}/conversations/:conversation_id/name' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "name": "", \n "auto_generate": true, \n "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/conversations/{conversation_id}/name' \
+    --header 'Content-Type: application/json' \
+    --header 'Authorization: Bearer {api_key}' \
+    --data-raw '{
+        "name": "",
+        "auto_generate": true,
+        "user": "abc-123"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+        "id": "cd78daf6-f9e4-4463-9ff2-54257230a0ce",
+        "name": "銉併儯銉冦儓 vs AI",
+        "inputs": {},
+        "status": "normal",
+        "introduction": "",
+        "created_at": 1705569238,
+        "updated_at": 1705569238
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations/:conversation_id/variables'
+  method='GET'
+  title='浼氳┍澶夋暟銇彇寰�'
+  name='#conversation-variables'
+/>
+<Row>
+  <Col>
+    鐗瑰畾銇細瑭便亱銈夊鏁般倰鍙栧緱銇椼伨銇欍�傘亾銇偍銉炽儔銉濄偆銉炽儓銇�佷細瑭变腑銇彇寰椼仌銈屻仧妲嬮�犲寲銉囥兗銈裤倰鎶藉嚭銇欍倠銇伀褰圭珛銇°伨銇欍��
+
+    ### 銉戙偣銉戙儵銉°兗銈�
+
+    <Properties>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+        澶夋暟銈掑彇寰椼仚銈嬩細瑭便伄ID銆�
+      </Property>
+    </Properties>
+
+    ### 銈偍銉儜銉┿儭銉笺偪
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        銉︺兗銈躲兗璀樺垾瀛愩�傞枊鐧鸿�呫伀銈堛仯銇﹀畾缇┿仌銈屻仧銉兗銉伀寰撱亜銆併偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇傘倠蹇呰銇屻亗銈娿伨銇欍��
+      </Property>
+      <Property name='last_id' type='string' key='last_id'>
+          (Optional)鐝惧湪銇儦銉笺偢銇渶寰屻伄瑷橀尣銇甀D銆併儑銉曘偐銉儓銇痭ull銇с仚銆�
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+          (Optional)1鍥炪伄銉偗銈ㄣ偣銉堛仹杩斻仚瑷橀尣銇暟銆併儑銉曘偐銉儓銇渶鏂般伄20浠躲仹銇欍�傛渶澶�100銆佹渶灏�1銆�
+      </Property>
+    </Properties>
+
+    ### 銉偣銉濄兂銈�
+
+    - `limit` (int) 銉氥兗銈搞仈銇ㄣ伄銈€偆銉嗐儬鏁�
+    - `has_more` (bool) 銇曘倝銇偄銈ゃ儐銉犮亴銇傘倠銇嬨仼銇嗐亱
+    - `data` (array[object]) 澶夋暟銇儶銈广儓
+      - `id` (string) 澶夋暟ID
+      - `name` (string) 澶夋暟鍚�
+      - `value_type` (string) 澶夋暟銈裤偆銉楋紙鏂囧瓧鍒椼�佹暟鍊ゃ�佺湡鍋藉�ゃ仾銇╋級
+      - `value` (string) 澶夋暟鍊�
+      - `description` (string) 澶夋暟銇鏄�
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉�
+      - `updated_at` (int) 鏈�绲傛洿鏂般偪銈ゃ儬銈广偪銉炽儣
+
+    ### 銈ㄣ儵銉�
+    - 404, `conversation_not_exists`, 浼氳┍銇岃銇ゃ亱銈娿伨銇涖倱
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/conversations/:conversation_id/variables" targetCode={`curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123' \\\n--header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Request with variable name filter">
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123&variable_name=customer_name' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "limit": 100,
+      "has_more": false,
+      "data": [
+        {
+          "id": "variable-uuid-1",
+          "name": "customer_name",
+          "value_type": "string",
+          "value": "John Doe",
+          "description": "浼氳┍銇嬨倝鎶藉嚭銇曘倢銇熼¨瀹㈠悕",
+          "created_at": 1650000000000,
+          "updated_at": 1650000000000
+        },
+        {
+          "id": "variable-uuid-2",
+          "name": "order_details",
+          "value_type": "json",
+          "value": "{\"product\":\"Widget\",\"quantity\":5,\"price\":19.99}",
+          "description": "椤у銇敞鏂囪┏绱�",
+          "created_at": 1650000000000,
+          "updated_at": 1650000000000
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/audio-to-text'
+  method='POST'
+  title='闊冲0銇嬨倝銉嗐偔銈广儓銇�'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    銇撱伄銈ㄣ兂銉夈儩銈ゃ兂銉堛伅multipart/form-data銉偗銈ㄣ偣銉堛倰蹇呰銇ㄣ仐銇俱仚銆�
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+
+    <Properties>
+      <Property name='file' type='file' key='file'>
+        銈兗銉囥偅銈儠銈°偆銉��
+        銈点儩銉笺儓銇曘倢銇︺亜銈嬪舰寮忥細`['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm']`
+        銉曘偂銈ゃ儷銈点偆銈哄埗闄愶細15MB
+      </Property>
+      <Property name='user' type='string' key='user'>
+      銉︺兗銈躲兗璀樺垾瀛愩�侀枊鐧鸿�呫伄銉兗銉伀銈堛仯銇﹀畾缇┿仌銈屻�併偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇亼銈屻伆銇倞銇俱仜銈撱��
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+    - `text` (string) 鍑哄姏銉嗐偔銈广儓
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/audio-to-text" targetCode={`curl -X POST '${props.appDetail.api_base_url}/audio-to-text' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=audio/[mp3|mp4|mpeg|mpga|m4a|wav|webm]'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/conversations/name' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@localfile;type=audio/mp3'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "text": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/text-to-audio'
+  method='POST'
+  title='銉嗐偔銈广儓銇嬨倝闊冲0銇�'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    銉嗐偔銈广儓銈掗煶澹般伀澶夋彌銇椼伨銇欍��
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+
+    <Properties>
+      <Property name='message_id' type='str' key='message_id'>
+        Dify銇倛銇c仸鐢熸垚銇曘倢銇熴儐銈偣銉堛儭銉冦偦銉笺偢銇牬鍚堛�佺敓鎴愩仌銈屻仧銉°儍銈汇兗銈窱D銈掔洿鎺ユ浮銇椼伨銇欍�傘儛銉冦偗銈ㄣ兂銉夈伅銉°儍銈汇兗銈窱D銈掍娇鐢ㄣ仐銇﹀蹇溿仚銈嬪唴瀹广倰妞滅储銇椼�侀煶澹版儏鍫便倰鐩存帴鍚堟垚銇椼伨銇欍�俶essage_id銇╰ext銇屽悓鏅傘伀鎻愪緵銇曘倢銈嬪牬鍚堛�乵essage_id銇屽劒鍏堛仌銈屻伨銇欍��
+      </Property>
+      <Property name='text' type='str' key='text'>
+        闊冲0鐢熸垚銈炽兂銉嗐兂銉勩��
+      </Property>
+      <Property name='user' type='string' key='user'>
+        銉︺兗銈躲兗璀樺垾瀛愩�侀枊鐧鸿�呫伀銈堛仯銇﹀畾缇┿仌銈屻�併偄銉椼儶鍐呫仹涓�鎰忋仹銇傘倠銇撱仺銈掍繚瑷笺仐銇亼銈屻伆銇倞銇俱仜銈撱��
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/text-to-audio" targetCode={`curl -o text-to-audio.mp3 -X POST '${props.appDetail.api_base_url}/text-to-audio' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290",\n    "text": "Hello Dify",\n    "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -o text-to-audio.mp3 -X POST '${props.appDetail.api_base_url}/text-to-audio' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290",
+        "text": "Hello Dify",
+        "user": "abc-123",
+        "streaming": false
+    }'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="銉樸儍銉�銉�">
+    ```json {{ title: '銉樸儍銉�銉�' }}
+    {
+      "Content-Type": "audio/wav"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/info'
+  method='GET'
+  title='銈€儣銉偙銉笺偡銉с兂銇熀鏈儏鍫便倰鍙栧緱'
+  name='#info'
+/>
+<Row>
+  <Col>
+  銇撱伄銈€儣銉偙銉笺偡銉с兂銇熀鏈儏鍫便倰鍙栧緱銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇�
+
+  ### Response
+  - `name` (string) 銈€儣銉偙銉笺偡銉с兂銇悕鍓�
+  - `description` (string) 銈€儣銉偙銉笺偡銉с兂銇鏄�
+  - `tags` (array[string]) 銈€儣銉偙銉笺偡銉с兂銇偪銈�
+  </Col>
+  <Col>
+    <CodeGroup title="Request" tag="GET" label="/info" targetCode={`curl -X GET '${props.appDetail.api_base_url}/info' \\\n-H 'Authorization: Bearer {api_key}'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/info' \
+      -H 'Authorization: Bearer {api_key}'
+      ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "name": "My App",
+      "description": "This is my app.",
+      "tags": [
+        "tag1",
+        "tag2"
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/parameters'
+  method='GET'
+  title='銈€儣銉偙銉笺偡銉с兂銇儜銉┿儭銉笺偪鎯呭牨銈掑彇寰�'
+  name='#parameters'
+/>
+<Row>
+  <Col>
+    銉氥兗銈搞伀鍏ャ倠闅涖伀銆佹鑳姐�佸叆鍔涖儜銉┿儭銉笺偪鍚嶃�併偪銈ゃ儣銆併儑銉曘偐銉儓鍊ゃ仾銇┿伄鎯呭牨銈掑彇寰椼仚銈嬨仧銈併伀浣跨敤銇曘倢銇俱仚銆�
+
+    ### 蹇滅瓟
+    - `opening_statement` (string) 闁嬪銇尐鎷�
+    - `suggested_questions` (array[string]) 闁嬪鏅傘伄鎺ㄥエ璩晱銇儶銈广儓
+    - `suggested_questions_after_answer` (object) 绛斻亪銈掓湁鍔广伀銇椼仧寰屻伄璩晱銈掓彁妗堛仐銇俱仚銆�
+      - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+    - `speech_to_text` (object) 闊冲0銇嬨倝銉嗐偔銈广儓銇�
+      - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+    - `retriever_resource` (object) 寮曠敤銇ㄥ赴灞�
+      - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+    - `annotation_reply` (object) 娉ㄩ噲杩斾俊
+      - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+    - `user_input_form` (array[object]) 銉︺兗銈躲兗鍏ュ姏銉曘偐銉笺儬銇ō瀹�
+      - `text-input` (object) 銉嗐偔銈广儓鍏ュ姏銈炽兂銉堛儹銉笺儷
+        - `label` (string) 澶夋暟琛ㄧず銉┿儥銉悕
+        - `variable` (string) 澶夋暟ID
+        - `required` (bool) 蹇呴爤銇嬨仼銇嗐亱
+        - `default` (string) 銉囥儠銈┿儷銉堝��
+      - `paragraph` (object) 娈佃惤銉嗐偔銈广儓鍏ュ姏銈炽兂銉堛儹銉笺儷
+        - `label` (string) 澶夋暟琛ㄧず銉┿儥銉悕
+        - `variable` (string) 澶夋暟ID
+        - `required` (bool) 蹇呴爤銇嬨仼銇嗐亱
+        - `default` (string) 銉囥儠銈┿儷銉堝��
+      - `select` (object) 銉夈儹銉冦儣銉�銈︺兂銈炽兂銉堛儹銉笺儷
+        - `label` (string) 澶夋暟琛ㄧず銉┿儥銉悕
+        - `variable` (string) 澶夋暟ID
+        - `required` (bool) 蹇呴爤銇嬨仼銇嗐亱
+        - `default` (string) 銉囥儠銈┿儷銉堝��
+        - `options` (array[string]) 銈儣銈枫儳銉冲��
+    - `file_upload` (object) 銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔瑷畾
+      - `image` (object) 鐢诲儚瑷畾
+        鐝惧湪銈点儩銉笺儓銇曘倢銇︺亜銈嬬敾鍍忋偪銈ゃ儣锛歚png`, `jpg`, `jpeg`, `webp`, `gif`
+        - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+        - `number_limits` (int) 鐢诲儚鏁般伄鍒堕檺銆併儑銉曘偐銉儓銇�3
+        - `transfer_methods` (array[string]) 杌㈤�佹柟娉曘伄銉偣銉堛�乺emote_url, local_file銆併亜銇氥倢銇嬨倰閬告姙銇欍倠蹇呰銇屻亗銈娿伨銇�
+    - `system_parameters` (object) 銈枫偣銉嗐儬銉戙儵銉°兗銈�
+      - `file_size_limit` (int) 銉夈偔銉ャ儭銉炽儓銈€儍銉椼儹銉笺儔銈点偆銈哄埗闄愶紙MB锛�
+      - `image_file_size_limit` (int) 鐢诲儚銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔銈点偆銈哄埗闄愶紙MB锛�
+      - `audio_file_size_limit` (int) 銈兗銉囥偅銈儠銈°偆銉偄銉冦儣銉兗銉夈偟銈ゃ偤鍒堕檺锛圡B锛�
+      - `video_file_size_limit` (int) 銉撱儑銈儠銈°偆銉偄銉冦儣銉兗銉夈偟銈ゃ偤鍒堕檺锛圡B锛�
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="GET" label="/parameters" targetCode={` curl -X GET '${props.appDetail.api_base_url}/parameters'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/parameters' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "opening_statement": "銇撱倱銇仭銇紒",
+      "suggested_questions_after_answer": {
+          "enabled": true
+      },
+      "speech_to_text": {
+          "enabled": true
+      },
+      "retriever_resource": {
+          "enabled": true
+      },
+      "annotation_reply": {
+          "enabled": true
+      },
+      "user_input_form": [
+          {
+              "paragraph": {
+                  "label": "銈偍銉�",
+                  "variable": "query",
+                  "required": true,
+                  "default": ""
+              }
+          }
+      ],
+      "file_upload": {
+          "image": {
+              "enabled": false,
+              "number_limits": 3,
+              "detail": "high",
+              "transfer_methods": [
+                  "remote_url",
+                  "local_file"
+              ]
+          }
+      },
+      "system_parameters": {
+          "file_size_limit": 15,
+          "image_file_size_limit": 10,
+          "audio_file_size_limit": 50,
+          "video_file_size_limit": 100
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/meta'
+  method='GET'
+  title='銈€儣銉偙銉笺偡銉с兂銇儭銈挎儏鍫便倰鍙栧緱'
+  name='#meta'
+/>
+<Row>
+  <Col>
+  銇撱伄銈€儣銉偙銉笺偡銉с兂銇儎銉笺儷銇偄銈ゃ偝銉炽倰鍙栧緱銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇�
+
+  ### 蹇滅瓟
+  - `tool_icons`(object[string]) 銉勩兗銉偄銈ゃ偝銉�
+    - `tool_name` (string)
+      - `icon` (object|string)
+        - (object) 銈€偆銈炽兂銈儢銈搞偋銈儓
+          - `background` (string) 鑳屾櫙鑹诧紙16閫叉暟褰㈠紡锛�
+          - `content`(string) 绲垫枃瀛�
+        - (string) 銈€偆銈炽兂銇甎RL
+  </Col>
+  <Col>
+  <CodeGroup title="銉偗銈ㄣ偣銉�" tag="GET" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/meta' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/meta' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "tool_icons": {
+        "dalle2": "https://cloud.dify.ai/console/api/workspaces/current/tool-provider/builtin/dalle/icon",
+        "api_tool": {
+          "background": "#252525",
+          "content": "\ud83d\ude01"
+        }
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/site'
+  method='GET'
+  title='銈€儣銉伄WebApp瑷畾銈掑彇寰�'
+  name='#site'
+/>
+<Row>
+  <Col>
+  銈€儣銉伄WebApp瑷畾銈掑彇寰椼仚銈嬨仧銈併伀浣跨敤銇椼伨銇欍��
+  ### 蹇滅瓟
+  - `title` (string) WebApp鍚�
+  - `chat_color_theme` (string) 銉併儯銉冦儓銇壊銉嗐兗銉炪��16閫叉暟褰㈠紡
+  - `chat_color_theme_inverted` (bool) 銉併儯銉冦儓銇壊銉嗐兗銉炪倰鍙嶈虎銇欍倠銇嬨仼銇嗐亱
+  - `icon_type` (string) 銈€偆銈炽兂銈裤偆銉椼�乣emoji`-绲垫枃瀛椼�乣image`-鐢诲儚
+  - `icon` (string) 銈€偆銈炽兂銆俙emoji`銈裤偆銉椼伄鍫村悎銇档鏂囧瓧銆乣image`銈裤偆銉椼伄鍫村悎銇敾鍍廢RL
+  - `icon_background` (string) 16閫叉暟褰㈠紡銇儗鏅壊
+  - `icon_url` (string) 銈€偆銈炽兂銇甎RL
+  - `description` (string) 瑾槑
+  - `copyright` (string) 钁椾綔妯╂儏鍫�
+  - `privacy_policy` (string) 銉椼儵銈ゃ儛銈枫兗銉濄儶銈枫兗銇儶銉炽偗
+  - `custom_disclaimer` (string) 銈偣銈裤儬鍏嶈铂浜嬮爡
+  - `default_language` (string) 銉囥儠銈┿儷銉堣█瑾�
+  - `show_workflow_steps` (bool) 銉兗銈儠銉兗銇┏绱般倰琛ㄧず銇欍倠銇嬨仼銇嗐亱
+  - `use_icon_as_answer_icon` (bool) WebApp銇偄銈ゃ偝銉炽倰銉併儯銉冦儓鍐呫伄馃銇疆銇嶆彌銇堛倠銇嬨仼銇嗐亱
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="POST" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/site' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/site' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "title": "My App",
+      "chat_color_theme": "#ff4a4a",
+      "chat_color_theme_inverted": false,
+      "icon_type": "emoji",
+      "icon": "馃槃",
+      "icon_background": "#FFEAD5",
+      "icon_url": null,
+      "description": "This is my app.",
+      "copyright": "all rights reserved",
+      "privacy_policy": "",
+      "custom_disclaimer": "All generated by AI",
+      "default_language": "en-US",
+      "show_workflow_steps": false,
+      "use_icon_as_answer_icon": false,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+___
diff --git a/app/components/develop/template/template_advanced_chat.zh.mdx b/app/components/develop/template/template_advanced_chat.zh.mdx
new file mode 100644
index 0000000..9077f54
--- /dev/null
+++ b/app/components/develop/template/template_advanced_chat.zh.mdx
@@ -0,0 +1,1684 @@
+import { CodeGroup } from '../code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty } from '../md.tsx'
+
+# 宸ヤ綔娴佺紪鎺掑璇濆瀷搴旂敤 API
+
+瀵硅瘽搴旂敤鏀寔浼氳瘽鎸佷箙鍖栵紝鍙皢涔嬪墠鐨勮亰澶╄褰曚綔涓轰笂涓嬫枃杩涜鍥炵瓟锛屽彲閫傜敤浜庤亰澶�/瀹㈡湇 AI 绛夈��
+
+<div>
+  ### 鍩虹 URL
+  <CodeGroup title="Code" targetCode={props.appDetail.api_base_url}>
+    ```javascript
+    ```
+  </CodeGroup>
+
+  ### 閴存潈
+
+  Service API 浣跨敤 `API-Key` 杩涜閴存潈銆�
+  <i>**寮虹儓寤鸿寮�鍙戣�呮妸 `API-Key` 鏀惧湪鍚庣瀛樺偍锛岃�岄潪鍒嗕韩鎴栬�呮斁鍦ㄥ鎴风瀛樺偍锛屼互鍏� `API-Key` 娉勯湶锛屽鑷磋储浜ф崯澶便��**</i>
+  鎵�鏈� API 璇锋眰閮藉簲鍦� **`Authorization`** HTTP Header 涓寘鍚偍鐨� `API-Key`锛屽涓嬫墍绀猴細
+
+  <CodeGroup title="Code">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+    ```
+  </CodeGroup>
+</div>
+
+---
+
+<Heading
+  url='/chat-messages'
+  method='POST'
+  title='鍙戦�佸璇濇秷鎭�'
+  name='#Create-Chat-Message'
+/>
+<Row>
+  <Col>
+    鍒涘缓浼氳瘽娑堟伅銆�
+
+    ### Request Body
+
+    <Properties>
+      <Property name='query' type='string' key='query'>
+        鐢ㄦ埛杈撳叆/鎻愰棶鍐呭銆�
+      </Property>
+      <Property name='inputs' type='object' key='inputs'>
+        鍏佽浼犲叆 App 瀹氫箟鐨勫悇鍙橀噺鍊笺��
+        inputs 鍙傛暟鍖呭惈浜嗗缁勯敭鍊煎锛圞ey/Value pairs锛夛紝姣忕粍鐨勯敭瀵瑰簲涓�涓壒瀹氬彉閲忥紝姣忕粍鐨勫�煎垯鏄鍙橀噺鐨勫叿浣撳�笺��
+        濡傛灉鍙橀噺鏄枃浠剁被鍨嬶紝璇锋寚瀹氫竴涓寘鍚互涓� `files` 涓墍杩伴敭鐨勫璞°��
+        榛樿 `{}`
+      </Property>
+      <Property name='response_mode' type='string' key='response_mode'>
+        - `streaming` 娴佸紡妯″紡锛堟帹鑽愶級銆傚熀浜� SSE锛�**[Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)**锛夊疄鐜扮被浼兼墦瀛楁満杈撳嚭鏂瑰紡鐨勬祦寮忚繑鍥炪��
+        - `blocking` 闃诲妯″紡锛岀瓑寰呮墽琛屽畬姣曞悗杩斿洖缁撴灉銆傦紙璇锋眰鑻ユ祦绋嬭緝闀垮彲鑳戒細琚腑鏂級銆�
+        <i>鐢变簬 Cloudflare 闄愬埗锛岃姹備細鍦� 100 绉掕秴鏃舵棤杩斿洖鍚庝腑鏂��</i>
+      </Property>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敤浜庡畾涔夌粓绔敤鎴风殑韬唤锛屾柟渚挎绱€�佺粺璁°��
+        鐢卞紑鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+      锛堥�夊~锛変細璇� ID锛岄渶瑕佸熀浜庝箣鍓嶇殑鑱婂ぉ璁板綍缁х画瀵硅瘽锛屽繀椤讳紶涔嬪墠娑堟伅鐨� conversation_id銆�
+      </Property>
+      <Property name='files' type='array[object]' key='files'>
+          鏂囦欢鍒楄〃锛岄�傜敤浜庝紶鍏ユ枃浠剁粨鍚堟枃鏈悊瑙e苟鍥炵瓟闂锛屼粎褰撴ā鍨嬫敮鎸� Vision 鑳藉姏鏃跺彲鐢ㄣ��
+          - `type` (string) 鏀寔绫诲瀷锛�
+            - `document` 鍏蜂綋绫诲瀷鍖呭惈锛�'TXT', 'MD', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
+            - `image` 鍏蜂綋绫诲瀷鍖呭惈锛�'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
+            - `audio` 鍏蜂綋绫诲瀷鍖呭惈锛�'MP3', 'M4A', 'WAV', 'WEBM', 'AMR'
+            - `video` 鍏蜂綋绫诲瀷鍖呭惈锛�'MP4', 'MOV', 'MPEG', 'MPGA'
+            - `custom` 鍏蜂綋绫诲瀷鍖呭惈锛氬叾浠栨枃浠剁被鍨�
+          - `transfer_method` (string)  浼犻�掓柟寮�:
+            - `remote_url`: 鍥剧墖鍦板潃銆�
+            - `local_file`: 涓婁紶鏂囦欢銆�
+          - `url` 鍥剧墖鍦板潃銆傦紙浠呭綋浼犻�掓柟寮忎负 `remote_url` 鏃讹級銆�
+          - `upload_file_id` 涓婁紶鏂囦欢 ID銆傦紙浠呭綋浼犻�掓柟寮忎负 `local_file `鏃讹級銆�
+      </Property>
+      <Property name='auto_generate_name' type='bool' key='auto_generate_name'>
+      锛堥�夊~锛夎嚜鍔ㄧ敓鎴愭爣棰橈紝榛樿 `true`銆� 鑻ヨ缃负 `false`锛屽垯鍙�氳繃璋冪敤浼氳瘽閲嶅懡鍚嶆帴鍙e苟璁剧疆 `auto_generate` 涓� `true` 瀹炵幇寮傛鐢熸垚鏍囬銆�
+      </Property>
+    </Properties>
+
+    ### Response
+    <Properties>
+    褰� `response_mode` 涓� `blocking` 鏃讹紝杩斿洖 ChatCompletionResponse object銆�
+    褰� `response_mode` 涓� `streaming`鏃讹紝杩斿洖 ChunkChatCompletionResponse object 娴佸紡搴忓垪銆�
+
+    ### ChatCompletionResponse
+
+    杩斿洖瀹屾暣鐨� App 缁撴灉锛宍Content-Type` 涓� `application/json`銆�
+    - `event` (string) 浜嬩欢绫诲瀷锛屽浐瀹氫负 `message`
+    - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+    - `id` (string) 鍞竴ID
+    - `message_id` (string) 娑堟伅鍞竴 ID
+    - `conversation_id` (string) 浼氳瘽 ID
+    - `mode` (string) App 妯″紡锛屽浐瀹氫负 chat
+    - `answer` (string) 瀹屾暣鍥炲鍐呭
+    - `metadata` (object) 鍏冩暟鎹�
+      - `usage` (Usage) 妯″瀷鐢ㄩ噺淇℃伅
+      - `retriever_resources` (array[RetrieverResource]) 寮曠敤鍜屽綊灞炲垎娈靛垪琛�
+    - `created_at` (int) 娑堟伅鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+
+    ### ChunkChatCompletionResponse
+    杩斿洖 App 杈撳嚭鐨勬祦寮忓潡锛宍Content-Type` 涓� `text/event-stream`銆�
+    姣忎釜娴佸紡鍧楀潎涓� data: 寮�澶达紝鍧椾箣闂翠互 \n\n 鍗充袱涓崲琛岀鍒嗛殧锛屽涓嬫墍绀猴細
+    <CodeGroup>
+    ```streaming {{ title: 'Response' }}
+    data: {"event": "message", "task_id": "900bbd43-dc0b-4383-a372-aa6e6c414227", "id": "663c5084-a254-4040-8ad3-51f2a3c1a77c", "answer": "Hi", "created_at": 1705398420}\n\n
+    ```
+    </CodeGroup>
+
+    娴佸紡鍧椾腑鏍规嵁 event 涓嶅悓锛岀粨鏋勪篃涓嶅悓锛�
+    - `event: message` LLM 杩斿洖鏂囨湰鍧椾簨浠讹紝鍗筹細瀹屾暣鐨勬枃鏈互鍒嗗潡鐨勬柟寮忚緭鍑恒��
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `conversation_id` (string) 浼氳瘽 ID
+      - `answer` (string) LLM 杩斿洖鏂囨湰鍧楀唴瀹�
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: message_file` 鏂囦欢浜嬩欢锛岃〃绀烘湁鏂版枃浠堕渶瑕佸睍绀�
+      - `id` (string) 鏂囦欢鍞竴ID
+      - `type` (string) 鏂囦欢绫诲瀷锛岀洰鍓嶄粎涓篿mage
+      - `belongs_to` (string) 鏂囦欢褰掑睘锛寀ser鎴朼ssistant锛岃鎺ュ彛杩斿洖浠呬负 `assistant`
+      - `url` (string) 鏂囦欢璁块棶鍦板潃
+      - `conversation_id`  (string) 浼氳瘽ID
+    - `event: message_end` 娑堟伅缁撴潫浜嬩欢锛屾敹鍒版浜嬩欢鍒欎唬琛ㄦ祦寮忚繑鍥炵粨鏉熴��
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `conversation_id` (string) 浼氳瘽 ID
+      - `metadata` (object) 鍏冩暟鎹�
+        - `usage` (Usage) 妯″瀷鐢ㄩ噺淇℃伅
+        - `retriever_resources` (array[RetrieverResource]) 寮曠敤鍜屽綊灞炲垎娈靛垪琛�
+    - `event: tts_message` TTS 闊抽娴佷簨浠讹紝鍗筹細璇煶鍚堟垚杈撳嚭銆傚唴瀹规槸Mp3鏍煎紡鐨勯煶棰戝潡锛屼娇鐢� base64 缂栫爜鍚庣殑瀛楃涓诧紝鎾斁鐨勬椂鍊欑洿鎺ヨВ鐮佸嵆鍙��(寮�鍚嚜鍔ㄦ挱鏀炬墠鏈夋娑堟伅)
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `audio` (string) 璇煶鍚堟垚涔嬪悗鐨勯煶棰戝潡浣跨敤 Base64 缂栫爜涔嬪悗鐨勬枃鏈唴瀹癸紝鎾斁鐨勬椂鍊欑洿鎺� base64 瑙g爜閫佸叆鎾斁鍣ㄥ嵆鍙�
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: tts_message_end` TTS 闊抽娴佺粨鏉熶簨浠讹紝鏀跺埌杩欎釜浜嬩欢琛ㄧず闊抽娴佽繑鍥炵粨鏉熴��
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `audio` (string) 缁撴潫浜嬩欢鏄病鏈夐煶棰戠殑锛屾墍浠ヨ繖閲屾槸绌哄瓧绗︿覆
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: message_replace` 娑堟伅鍐呭鏇挎崲浜嬩欢銆�
+      寮�鍚唴瀹瑰鏌ュ拰瀹℃煡杈撳嚭鍐呭鏃讹紝鑻ュ懡涓簡瀹℃煡鏉′欢锛屽垯浼氶�氳繃姝や簨浠舵浛鎹㈡秷鎭唴瀹逛负棰勮鍥炲銆�
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `conversation_id` (string) 浼氳瘽 ID
+      - `answer` (string) 鏇挎崲鍐呭锛堢洿鎺ユ浛鎹� LLM 鎵�鏈夊洖澶嶆枃鏈級
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: workflow_started` workflow 寮�濮嬫墽琛�
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `workflow_run_id` (string) workflow 鎵ц ID
+      - `event` (string) 鍥哄畾涓� `workflow_started`
+      - `data` (object) 璇︾粏鍐呭
+        - `id` (string) workflow 鎵ц ID
+        - `workflow_id` (string) 鍏宠仈 Workflow ID
+        - `sequence_number` (int) 鑷搴忓彿锛孉pp 鍐呰嚜澧烇紝浠� 1 寮�濮�
+        - `created_at` (timestamp) 寮�濮嬫椂闂�
+    - `event: node_started` node 寮�濮嬫墽琛�
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `workflow_run_id` (string) workflow 鎵ц ID
+      - `event` (string) 鍥哄畾涓� `node_started`
+      - `data` (object) 璇︾粏鍐呭
+        - `id` (string) workflow 鎵ц ID
+        - `node_id` (string) 鑺傜偣 ID
+        - `node_type` (string) 鑺傜偣绫诲瀷
+        - `title` (string) 鑺傜偣鍚嶇О
+        - `index` (int) 鎵ц搴忓彿锛岀敤浜庡睍绀� Tracing Node 椤哄簭
+        - `predecessor_node_id` (string) 鍓嶇疆鑺傜偣 ID锛岀敤浜庣敾甯冨睍绀烘墽琛岃矾寰�
+        - `inputs` (object) 鑺傜偣涓墍鏈変娇鐢ㄥ埌鐨勫墠缃妭鐐瑰彉閲忓唴瀹�
+        - `created_at` (timestamp) 寮�濮嬫椂闂�
+    - `event: node_finished` node 鎵ц缁撴潫锛屾垚鍔熷け璐ュ悓涓�浜嬩欢涓笉鍚岀姸鎬�
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `workflow_run_id` (string) workflow 鎵ц ID
+      - `event` (string) 鍥哄畾涓� `node_finished`
+      - `data` (object) 璇︾粏鍐呭
+        - `id` (string) node 鎵ц ID
+        - `node_id` (string) 鑺傜偣 ID
+        - `index` (int) 鎵ц搴忓彿锛岀敤浜庡睍绀� Tracing Node 椤哄簭
+        - `predecessor_node_id` (string) optional 鍓嶇疆鑺傜偣 ID锛岀敤浜庣敾甯冨睍绀烘墽琛岃矾寰�
+        - `inputs` (object) 鑺傜偣涓墍鏈変娇鐢ㄥ埌鐨勫墠缃妭鐐瑰彉閲忓唴瀹�
+        - `process_data` (json) Optional 鑺傜偣杩囩▼鏁版嵁
+        - `outputs` (json) Optional 杈撳嚭鍐呭
+        - `status` (string) 鎵ц鐘舵�� `running` / `succeeded` / `failed` / `stopped`
+        - `error` (string) Optional 閿欒鍘熷洜
+        - `elapsed_time` (float) Optional 鑰楁椂(s)
+        - `execution_metadata` (json) 鍏冩暟鎹�
+          - `total_tokens` (int) optional 鎬讳娇鐢� tokens
+          - `total_price` (decimal) optional 鎬昏垂鐢�
+          - `currency` (string) optional 璐у竵锛屽 `USD` / `RMB`
+        - `created_at` (timestamp) 寮�濮嬫椂闂�
+    - `event: workflow_finished` workflow 鎵ц缁撴潫锛屾垚鍔熷け璐ュ悓涓�浜嬩欢涓笉鍚岀姸鎬�
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `workflow_run_id` (string) workflow 鎵ц ID
+      - `event` (string) 鍥哄畾涓� `workflow_finished`
+      - `data` (object) 璇︾粏鍐呭
+        - `id` (string) workflow 鎵ц ID
+        - `workflow_id` (string) 鍏宠仈 Workflow ID
+        - `status` (string)  鎵ц鐘舵�� `running` / `succeeded` / `failed` / `stopped`
+        - `outputs` (json) Optional 杈撳嚭鍐呭
+        - `error` (string) Optional 閿欒鍘熷洜
+        - `elapsed_time` (float) Optional 鑰楁椂(s)
+        - `total_tokens` (int) Optional 鎬讳娇鐢� tokens
+        - `total_steps` (int) 鎬绘鏁帮紙鍐椾綑锛夛紝榛樿 0
+        - `created_at` (timestamp) 寮�濮嬫椂闂�
+        - `finished_at` (timestamp) 缁撴潫鏃堕棿
+    - `event: error`
+      娴佸紡杈撳嚭杩囩▼涓嚭鐜扮殑寮傚父浼氫互 stream event 褰㈠紡杈撳嚭锛屾敹鍒板紓甯镐簨浠跺悗鍗崇粨鏉熴��
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `status` (int) HTTP 鐘舵�佺爜
+      - `code` (string) 閿欒鐮�
+      - `message` (string) 閿欒娑堟伅
+    - `event: ping` 姣� 10s 涓�娆$殑 ping 浜嬩欢锛屼繚鎸佽繛鎺ュ瓨娲汇��
+
+    ### Errors
+    - 404锛屽璇濅笉瀛樺湪
+    - 400锛宍invalid_param`锛屼紶鍏ュ弬鏁板紓甯�
+    - 400锛宍app_unavailable`锛孉pp 閰嶇疆涓嶅彲鐢�
+    - 400锛宍provider_not_initialize`锛屾棤鍙敤妯″瀷鍑嵁閰嶇疆
+    - 400锛宍provider_quota_exceeded`锛屾ā鍨嬭皟鐢ㄩ搴︿笉瓒�
+    - 400锛宍model_currently_not_support`锛屽綋鍓嶆ā鍨嬩笉鍙敤
+    - 400锛宍completion_request_error`锛屾枃鏈敓鎴愬け璐�
+    - 500锛屾湇鍔″唴閮ㄥ紓甯�
+
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/chat-messages" targetCode={`curl -X POST '${props.appDetail.api_base_url}/chat-messages' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "inputs": ${JSON.stringify(props.inputs)},\n    "query": "What are the specs of the iPhone 13 Pro Max?",\n    "response_mode": "streaming",\n    "conversation_id": "",\n    "user": "abc-123",\n    "files": [\n      {\n        "type": "image",\n        "transfer_method": "remote_url",\n        "url": "https://cloud.dify.ai/logo/logo-site.png"\n      }\n    ]\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/chat-messages' \
+    -H 'Authorization: Bearer {api_key}' \
+    -H 'Content-Type: application/json' \
+    --data-raw '{
+        "inputs": {
+            "name": "dify"
+        },
+        "query": "What are the specs of the iPhone 13 Pro Max?",
+        "conversation_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb",
+        "response_mode": "streaming",
+        "user": "abc-123",
+        "files": [
+          {
+            "type": "image",
+            "transfer_method": "remote_url",
+            "url": "https://cloud.dify.ai/logo/logo-site.png"
+          }
+        ]
+    }'
+    ```
+
+    </CodeGroup>
+    ### 闃诲妯″紡
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+        "event": "message",
+        "task_id": "c3800678-a077-43df-a102-53f23ed20b88", 
+        "id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "message_id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2",
+        "mode": "chat",
+        "answer": "iPhone 13 Pro Max specs are listed here:...",
+        "metadata": {
+            "usage": {
+                "prompt_tokens": 1033,
+                "prompt_unit_price": "0.001",
+                "prompt_price_unit": "0.001",
+                "prompt_price": "0.0010330",
+                "completion_tokens": 128,
+                "completion_unit_price": "0.002",
+                "completion_price_unit": "0.001",
+                "completion_price": "0.0002560",
+                "total_tokens": 1161,
+                "total_price": "0.0012890",
+                "currency": "USD",
+                "latency": 0.7682376249867957
+            },
+            "retriever_resources": [
+                {
+                    "position": 1,
+                    "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb",
+                    "dataset_name": "iPhone",
+                    "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00",
+                    "document_name": "iPhone List",
+                    "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a",
+                    "score": 0.98457545,
+                    "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""
+                }
+            ]
+        },
+        "created_at": 1705407629
+    }
+    ```
+    </CodeGroup>
+    ### 娴佸紡妯″紡
+    <CodeGroup title="Response">
+    ```streaming {{ title: 'Response' }}
+      data: {"event": "workflow_started", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "workflow_id": "dfjasklfjdslag", "sequence_number": 1, "created_at": 1679586595}}
+      data: {"event": "node_started", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "node_id": "dfjasklfjdslag", "node_type": "start", "title": "Start", "index": 0, "predecessor_node_id": "fdljewklfklgejlglsd", "inputs": {}, "created_at": 1679586595}}
+      data: {"event": "node_finished", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "node_id": "dfjasklfjdslag", "node_type": "start", "title": "Start", "index": 0, "predecessor_node_id": "fdljewklfklgejlglsd", "inputs": {}, "outputs": {}, "status": "succeeded", "elapsed_time": 0.324, "execution_metadata": {"total_tokens": 63127864, "total_price": 2.378, "currency": "USD"},  "created_at": 1679586595}}
+      data: {"event": "workflow_finished", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "workflow_id": "dfjasklfjdslag", "outputs": {}, "status": "succeeded", "elapsed_time": 0.324, "total_tokens": 63127864, "total_steps": "1", "created_at": 1679586595, "finished_at": 1679976595}}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " I", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": "'m", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " glad", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " to", "created_at": 1679586595}
+      data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " meet", "created_at": 1679586595}
+      data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " you", "created_at": 1679586595}
+      data: {"event": "message_end", "id": "5e52ce04-874b-4d27-9045-b3bc80def685", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "metadata": {"usage": {"prompt_tokens": 1033, "prompt_unit_price": "0.001", "prompt_price_unit": "0.001", "prompt_price": "0.0010330", "completion_tokens": 135, "completion_unit_price": "0.002", "completion_price_unit": "0.001", "completion_price": "0.0002700", "total_tokens": 1168, "total_price": "0.0013030", "currency": "USD", "latency": 1.381760165997548}, "retriever_resources": [{"position": 1, "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb", "dataset_name": "iPhone", "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00", "document_name": "iPhone List", "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a", "score": 0.98457545, "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""}]}}
+      data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+      data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/files/upload'
+  method='POST'
+  title='涓婁紶鏂囦欢'
+  name='#files-upload'
+/>
+<Row>
+  <Col>
+    涓婁紶鏂囦欢骞跺湪鍙戦�佹秷鎭椂浣跨敤锛屽彲瀹炵幇鍥炬枃澶氭ā鎬佺悊瑙c��
+    鏀寔鎮ㄧ殑搴旂敤绋嬪簭鎵�鏀寔鐨勬墍鏈夋牸寮忋��
+    <i>涓婁紶鐨勬枃浠朵粎渚涘綋鍓嶇粓绔敤鎴蜂娇鐢ㄣ��</i>
+
+    ### Request Body
+    璇ユ帴鍙i渶浣跨敤  `multipart/form-data` 杩涜璇锋眰銆�
+    <Properties>
+      <Property name='file' type='file' key='file'>
+        瑕佷笂浼犵殑鏂囦欢銆�
+      </Property>
+      <Property name='user' type='string' key='user'>
+          鐢ㄦ埛鏍囪瘑锛岀敤浜庡畾涔夌粓绔敤鎴风殑韬唤锛屽繀椤诲拰鍙戦�佹秷鎭帴鍙d紶鍏� user 淇濇寔涓�鑷淬��
+      </Property>
+    </Properties>
+
+    ### Response
+    鎴愬姛涓婁紶鍚庯紝鏈嶅姟鍣ㄤ細杩斿洖鏂囦欢鐨� ID 鍜岀浉鍏充俊鎭��
+    - `id` (uuid) ID
+    - `name` (string) 鏂囦欢鍚�
+    - `size` (int) 鏂囦欢澶у皬锛坆yte锛�
+    - `extension` (string) 鏂囦欢鍚庣紑
+    - `mime_type` (string) 鏂囦欢 mime-type
+    - `created_by` (uuid) 涓婁紶浜� ID
+    - `created_at` (timestamp) 涓婁紶鏃堕棿
+
+    ### Errors
+    - 400锛宍no_file_uploaded`锛屽繀椤绘彁渚涙枃浠�
+    - 400锛宍too_many_files`锛岀洰鍓嶅彧鎺ュ彈涓�涓枃浠�
+    - 400锛宍unsupported_preview`锛岃鏂囦欢涓嶆敮鎸侀瑙�
+    - 400锛宍unsupported_estimate`锛岃鏂囦欢涓嶆敮鎸佷及绠�
+    - 413锛宍file_too_large`锛屾枃浠跺お澶�
+    - 415锛宍unsupported_file_type`锛屼笉鏀寔鐨勬墿灞曞悕锛屽綋鍓嶅彧鎺ュ彈鏂囨。绫绘枃浠�
+    - 503锛宍s3_connection_failed`锛屾棤娉曡繛鎺ュ埌 S3 鏈嶅姟
+    - 503锛宍s3_permission_denied`锛屾棤鏉冮檺涓婁紶鏂囦欢鍒� S3
+    - 503锛宍s3_file_too_large`锛屾枃浠惰秴鍑� S3 澶у皬闄愬埗
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/files/upload" targetCode={`curl -X POST '${props.appDetail.api_base_url}/files/upload' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=image/[png|jpeg|jpg|webp|gif] \\\n--form 'user=abc-123'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/files/upload' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@"/path/to/file"'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "72fa9618-8f89-4a37-9b33-7e1178a24a67",
+      "name": "example.png",
+      "size": 1024,
+      "extension": "png",
+      "mime_type": "image/png",
+      "created_by": 123,
+      "created_at": 1577836800,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+<Heading
+  url='/chat-messages/:task_id/stop'
+  method='POST'
+  title='鍋滄鍝嶅簲'
+  name='#Stop'
+/>
+<Row>
+  <Col>
+  浠呮敮鎸佹祦寮忔ā寮忋��
+  ### Path
+  - `task_id` (string) 浠诲姟 ID锛屽彲鍦ㄦ祦寮忚繑鍥� Chunk 涓幏鍙�
+
+  ### Request Body
+  - `user` (string) Required
+    鐢ㄦ埛鏍囪瘑锛岀敤浜庡畾涔夌粓绔敤鎴风殑韬唤锛屽繀椤诲拰鍙戦�佹秷鎭帴鍙d紶鍏� user 淇濇寔涓�鑷淬��
+  ### Response
+  - `result` (string) 鍥哄畾杩斿洖 success
+  </Col>
+  <Col sticky>
+  <CodeGroup title="Request" tag="POST" label="/chat-messages/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/chat-messages/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{ "user": "abc-123"}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/chat-messages/:task_id/stop' \
+    -H 'Authorization: Bearer {api_key}' \
+    -H 'Content-Type: application/json' \
+    --data-raw '{
+        "user": "abc-123"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/messages/:message_id/feedbacks'
+  method='POST'
+  title='娑堟伅鍙嶉锛堢偣璧烇級'
+  name='#feedbacks'
+/>
+<Row>
+  <Col>
+    娑堟伅缁堢鐢ㄦ埛鍙嶉銆佺偣璧烇紝鏂逛究搴旂敤寮�鍙戣�呬紭鍖栬緭鍑洪鏈熴��
+
+    ### Path Params
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+       娑堟伅 ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+
+    <Properties>
+      <Property name='rating' type='string' key='rating'>
+         鐐硅禐 like, 鐐硅俯 dislike,  鎾ら攢鐐硅禐 null
+      </Property>
+      <Property name='user' type='string' key='user'>
+          鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+      <Property name='content' type='string' key='content'>
+          娑堟伅鍙嶉鐨勫叿浣撲俊鎭��
+      </Property>
+    </Properties>
+
+    ### Response
+    - `result` (string) 鍥哄畾杩斿洖 success
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/messages/:message_id/feedbacks" targetCode={`curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "rating": "like",\n    "user": "abc-123",\n    "content": "message feedback information"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "rating": "like",
+        "user": "abc-123",
+        "content": "message feedback information"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/app/feedbacks'
+  method='GET'
+  title='鑾峰彇APP鐨勬秷鎭偣璧炲拰鍙嶉'
+  name='#app-feedbacks'
+/>
+<Row>
+  <Col>
+    鑾峰彇搴旂敤鐨勭粓绔敤鎴峰弽棣堛�佺偣璧炪��
+
+    ### Query
+    <Properties>
+      <Property name='page' type='string' key='page'>
+       锛堥�夊~锛夊垎椤碉紝榛樿鍊硷細1
+      </Property>
+    </Properties>
+
+    <Properties>
+      <Property name='limit' type='string' key='limit'>
+       锛堥�夊~锛夋瘡椤垫暟閲忥紝榛樿鍊硷細20
+      </Property>
+    </Properties>
+
+    ### Response
+    - `data` (List) 杩斿洖璇PP鐨勭偣璧炪�佸弽棣堝垪琛ㄣ��
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/app/feedbacks" targetCode={`curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+        {
+        "data": [
+            {
+                "id": "8c0fbed8-e2f9-49ff-9f0e-15a35bdd0e25",
+                "app_id": "f252d396-fe48-450e-94ec-e184218e7346",
+                "conversation_id": "2397604b-9deb-430e-b285-4726e51fd62d",
+                "message_id": "709c0b0f-0a96-4a4e-91a4-ec0889937b11",
+                "rating": "like",
+                "content": "message feedback information-3",
+                "from_source": "user",
+                "from_end_user_id": "74286412-9a1a-42c1-929c-01edb1d381d5",
+                "from_account_id": null,
+                "created_at": "2025-04-24T09:24:38",
+                "updated_at": "2025-04-24T09:24:38"
+            }
+        ]
+        }
+
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/messages/{message_id}/suggested'
+  method='GET'
+  title='鑾峰彇涓嬩竴杞缓璁棶棰樺垪琛�'
+  name='#suggested'
+/>
+<Row>
+  <Col>
+    鑾峰彇涓嬩竴杞缓璁棶棰樺垪琛ㄣ��
+
+    ### Path Params
+
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+        Message ID
+      </Property>
+    </Properties>
+
+    ### Query
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/messages/{message_id}/suggested" targetCode={`curl --location --request GET '${props.appDetail.api_base_url}/messages/{message_id}/suggested?user=abc-123 \\\n--header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \\\n--header 'Content-Type: application/json'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.appDetail.api_base_url}/messages/{message_id}/suggested?user=abc-123' \
+    --header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \
+    --header 'Content-Type: application/json' \
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success",
+      "data": [
+            "a",
+            "b",
+            "c"
+        ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+---
+
+<Heading
+  url='/messages'
+  method='GET'
+  title='鑾峰彇浼氳瘽鍘嗗彶娑堟伅'
+  name='#messages'
+/>
+<Row>
+  <Col>
+    婊氬姩鍔犺浇褰㈠紡杩斿洖鍘嗗彶鑱婂ぉ璁板綍锛岀涓�椤佃繑鍥炴渶鏂�  `limit` 鏉★紝鍗筹細鍊掑簭杩斿洖銆�
+
+    ### Query
+
+    <Properties>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+        浼氳瘽 ID
+      </Property>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+      <Property name='first_id' type='string' key='first_id'>
+        褰撳墠椤电涓�鏉¤亰澶╄褰曠殑 ID锛岄粯璁� null
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+        涓�娆¤姹傝繑鍥炲灏戞潯鑱婂ぉ璁板綍锛岄粯璁� 20 鏉°��
+      </Property>
+    </Properties>
+
+    ### Response
+    - `data` (array[object])  娑堟伅鍒楄〃
+    - `id`  (string) 娑堟伅 ID
+    - `conversation_id` (string)  浼氳瘽 ID
+    - `inputs` (object) 鐢ㄦ埛杈撳叆鍙傛暟銆�
+    - `query`  (string) 鐢ㄦ埛杈撳叆 / 鎻愰棶鍐呭銆�
+    - `message_files` (array[object]) 娑堟伅鏂囦欢
+      - `id` (string) ID
+      - `type` (string) 鏂囦欢绫诲瀷锛宨mage 鍥剧墖
+      - `url` (string) 棰勮鍥剧墖鍦板潃
+      - `belongs_to` (string) 鏂囦欢褰掑睘鏂癸紝user 鎴� assistant
+    - `answer` (string)  鍥炵瓟娑堟伅鍐呭
+    - `created_at`  (timestamp) 鍒涘缓鏃堕棿
+    - `feedback` (object) 鍙嶉淇℃伅
+      - `rating` (string) 鐐硅禐 like / 鐐硅俯 dislike
+    - `retriever_resources` (array[RetrieverResource]) 寮曠敤鍜屽綊灞炲垎娈靛垪琛�
+  - `has_more` (bool) 鏄惁瀛樺湪涓嬩竴椤�
+  - `limit` (int) 杩斿洖鏉℃暟锛岃嫢浼犲叆瓒呰繃绯荤粺闄愬埗锛岃繑鍥炵郴缁熼檺鍒舵暟閲�
+  </Col>
+  <Col sticky>
+    ### Request Example
+    <CodeGroup title="Request" tag="GET" label="/messages" targetCode={`curl -X GET '${props.appDetail.api_base_url}/messages?user=abc-123&conversation_id=' \\\n--header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/messages?user=abc-123&conversation_id='
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    ### Response Example
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+    "limit": 20,
+    "has_more": false,
+    "data": [
+        {
+            "id": "a076a87f-31e5-48dc-b452-0061adbbc922",
+            "conversation_id": "cd78daf6-f9e4-4463-9ff2-54257230a0ce",
+            "inputs": {
+                "name": "dify"
+            },
+            "query": "iphone 13 pro",
+            "answer": "The iPhone 13 Pro, released on September 24, 2021, features a 6.1-inch display with a resolution of 1170 x 2532. It is equipped with a Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard) processor, 6 GB of RAM, and offers storage options of 128 GB, 256 GB, 512 GB, and 1 TB. The camera is 12 MP, the battery capacity is 3095 mAh, and it runs on iOS 15.",
+            "message_files": [],
+            "feedback": null,
+            "retriever_resources": [
+                {
+                    "position": 1,
+                    "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb",
+                    "dataset_name": "iPhone",
+                    "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00",
+                    "document_name": "iPhone List",
+                    "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a",
+                    "score": 0.98457545,
+                    "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""
+                }
+            ],
+            "created_at": 1705569239
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+
+    ### Response Example(鏅鸿兘鍔╂墜)
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+    "limit": 20,
+    "has_more": false,
+    "data": [
+        {
+            "id": "d35e006c-7c4d-458f-9142-be4930abdf94",
+            "conversation_id": "957c068b-f258-4f89-ba10-6e8a0361c457",
+            "inputs": {},
+            "query": "draw a cat",
+            "answer": "I have generated an image of a cat for you. Please check your messages to view the image.",
+            "message_files": [
+                {
+                    "id": "976990d2-5294-47e6-8f14-7356ba9d2d76",
+                    "type": "image",
+                    "url": "http://127.0.0.1:5001/files/tools/976990d2-5294-47e6-8f14-7356ba9d2d76.png?timestamp=1705988524&nonce=55df3f9f7311a9acd91bf074cd524092&sign=z43nMSO1L2HBvoqADLkRxr7Biz0fkjeDstnJiCK1zh8=",
+                    "belongs_to": "assistant"
+                }
+            ],
+            "feedback": null,
+            "retriever_resources": [],
+            "created_at": 1705988187
+        }
+        ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations'
+  method='GET'
+  title='鑾峰彇浼氳瘽鍒楄〃'
+  name='#conversations'
+/>
+<Row>
+  <Col>
+    鑾峰彇褰撳墠鐢ㄦ埛鐨勪細璇濆垪琛紝榛樿杩斿洖鏈�杩戠殑 20 鏉°��
+
+    ### Query
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+      <Property name='last_id' type='string' key='last_id'>
+        锛堥�夊~锛夊綋鍓嶉〉鏈�鍚庨潰涓�鏉¤褰曠殑 ID锛岄粯璁� null
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+        锛堥�夊~锛変竴娆¤姹傝繑鍥炲灏戞潯璁板綍锛岄粯璁� 20 鏉★紝鏈�澶� 100 鏉★紝鏈�灏� 1 鏉°��
+      </Property>
+      <Property name='sort_by' type='string' key='sort_by'>
+        锛堥�夊~锛夋帓搴忓瓧娈碉紝榛樿 -updated_at(鎸夋洿鏂版椂闂村�掑簭鎺掑垪)
+        - 鍙�夊�硷細created_at, -created_at, updated_at, -updated_at
+        - 瀛楁鍓嶉潰鐨勭鍙蜂唬琛ㄩ『搴忔垨鍊掑簭锛�-浠h〃鍊掑簭
+      </Property>
+    </Properties>
+
+    ### Response
+    - `data` (array[object]) 浼氳瘽鍒楄〃
+      - `id`  (string) 浼氳瘽 ID
+      - `name`  (string) 浼氳瘽鍚嶇О锛岄粯璁ょ敱澶ц瑷�妯″瀷鐢熸垚銆�
+      - `inputs` (object) 鐢ㄦ埛杈撳叆鍙傛暟銆�
+      - `status` (string) 浼氳瘽鐘舵��
+      - `introduction` (string) 寮�鍦虹櫧
+      - `created_at` (timestamp) 鍒涘缓鏃堕棿
+      - `updated_at` (timestamp) 鏇存柊鏃堕棿
+    - `has_more` (bool)
+    - `limit` (int) 杩斿洖鏉℃暟锛岃嫢浼犲叆瓒呰繃绯荤粺闄愬埗锛岃繑鍥炵郴缁熼檺鍒舵暟閲�
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/conversations" targetCode={`curl -X GET '${props.appDetail.api_base_url}/conversations?user=abc-123&last_id=&limit=20'\\\n--header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations?user=abc-123&last_id=&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "limit": 20,
+      "has_more": false,
+      "data": [
+        {
+          "id": "10799fb8-64f7-4296-bbf7-b42bfbe0ae54",
+          "name": "New chat",
+          "inputs": {
+              "book": "book",
+              "myName": "Lucy"
+          },
+          "status": "normal",
+          "created_at": 1679667915,
+          "updated_at": 1679667915
+        },
+        {
+          "id": "hSIhXBhNe8X1d8Et"
+          // ...
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/conversations/:conversation_id'
+  method='DELETE'
+  title='鍒犻櫎浼氳瘽'
+  name='#delete'
+/>
+<Row>
+  <Col>
+    鍒犻櫎浼氳瘽銆�
+
+    ### Path
+    - `conversation_id` (string) 浼氳瘽 ID
+
+    ### Request Body
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+    </Properties>
+
+    ### Response
+    - `result` (string) 鍥哄畾杩斿洖 success
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="DELETE" label="/conversations/:conversation_id" targetCode={`curl -X DELETE '${props.appDetail.api_base_url}/conversations/:conversation_id' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+        curl -X DELETE '${props.appDetail.api_base_url}/conversations/{conversation_id}' \
+        --header 'Content-Type: application/json' \
+        --header 'Accept: application/json' \
+        --header 'Authorization: Bearer {api_key}' \
+        --data '{
+            "user": "abc-123"
+        }'
+      ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations/:conversation_id/name'
+  method='POST'
+  title='浼氳瘽閲嶅懡鍚�'
+  name='#rename'
+/>
+<Row>
+  <Col>
+    瀵逛細璇濊繘琛岄噸鍛藉悕锛屼細璇濆悕绉扮敤浜庢樉绀哄湪鏀寔澶氫細璇濈殑瀹㈡埛绔笂銆�
+
+    ### Path
+    - `conversation_id` (string) 浼氳瘽 ID
+
+    ### Request Body
+
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        锛堥�夊~锛夊悕绉帮紝鑻� `auto_generate` 涓� `true` 鏃讹紝璇ュ弬鏁板彲涓嶄紶銆�
+      </Property>
+      <Property name='auto_generate' type='bool' key='auto_generate'>
+        锛堥�夊~锛夎嚜鍔ㄧ敓鎴愭爣棰橈紝榛樿 false銆�
+      </Property>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+    </Properties>
+
+    ### Response
+    - `id`  (string) 浼氳瘽 ID
+    - `name`  (string) 浼氳瘽鍚嶇О
+    - `inputs` (object) 鐢ㄦ埛杈撳叆鍙傛暟
+    - `status` (string) 浼氳瘽鐘舵��
+    - `introduction` (string) 寮�鍦虹櫧
+    - `created_at` (timestamp) 鍒涘缓鏃堕棿
+    - `updated_at` (timestamp) 鏇存柊鏃堕棿
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/conversations/:conversation_id/name" targetCode={`curl -X POST '${props.appDetail.api_base_url}/conversations/:conversation_id/name' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "name": "", \n "auto_generate": true, \n "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/conversations/{conversation_id}/name' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "name": "",
+        "auto_generate": true,
+        "user": "abc-123"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "34d511d5-56de-4f16-a997-57b379508443",
+      "name": "hello",
+      "inputs": {},
+      "status": "normal",
+      "introduction": "",
+      "created_at": 1732731141,
+      "updated_at": 1732734510
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations/:conversation_id/variables'
+  method='GET'
+  title='鑾峰彇瀵硅瘽鍙橀噺'
+  name='#conversation-variables'
+/>
+<Row>
+  <Col>
+    浠庣壒瀹氬璇濅腑妫�绱㈠彉閲忋�傛绔偣瀵逛簬鎻愬彇瀵硅瘽杩囩▼涓崟鑾风殑缁撴瀯鍖栨暟鎹潪甯告湁鐢ㄣ��
+
+    ### 璺緞鍙傛暟
+
+    <Properties>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+        瑕佷粠涓绱㈠彉閲忕殑瀵硅瘽ID銆�
+      </Property>
+    </Properties>
+
+    ### 鏌ヨ鍙傛暟
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑绗︼紝鐢卞紑鍙戜汉鍛樺畾涔夌殑瑙勫垯锛屽湪搴旂敤绋嬪簭鍐呭繀椤诲敮涓�銆�
+      </Property>
+      <Property name='last_id' type='string' key='last_id'>
+        锛堥�夊~锛夊綋鍓嶉〉鏈�鍚庨潰涓�鏉¤褰曠殑 ID锛岄粯璁� null
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+        锛堥�夊~锛変竴娆¤姹傝繑鍥炲灏戞潯璁板綍锛岄粯璁� 20 鏉★紝鏈�澶� 100 鏉★紝鏈�灏� 1 鏉°��
+      </Property>
+    </Properties>
+
+    ### 鍝嶅簲
+
+    - `limit` (int) 姣忛〉椤圭洰鏁�
+    - `has_more` (bool) 鏄惁鏈夋洿澶氶」鐩�
+    - `data` (array[object]) 鍙橀噺鍒楄〃
+      - `id` (string) 鍙橀噺ID
+      - `name` (string) 鍙橀噺鍚嶇О
+      - `value_type` (string) 鍙橀噺绫诲瀷锛堝瓧绗︿覆銆佹暟瀛椼�佸竷灏旂瓑锛�
+      - `value` (string) 鍙橀噺鍊�
+      - `description` (string) 鍙橀噺鎻忚堪
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴�
+      - `updated_at` (int) 鏈�鍚庢洿鏂版椂闂存埑
+
+    ### 閿欒
+    - 404, `conversation_not_exists`, 瀵硅瘽涓嶅瓨鍦�
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/conversations/:conversation_id/variables" targetCode={`curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123' \\\n--header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Request with variable name filter">
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123&variable_name=customer_name' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "limit": 100,
+      "has_more": false,
+      "data": [
+        {
+          "id": "variable-uuid-1",
+          "name": "customer_name",
+          "value_type": "string",
+          "value": "John Doe",
+          "description": "瀹㈡埛鍚嶇О锛堜粠瀵硅瘽涓彁鍙栵級",
+          "created_at": 1650000000000,
+          "updated_at": 1650000000000
+        },
+        {
+          "id": "variable-uuid-2",
+          "name": "order_details",
+          "value_type": "json",
+          "value": "{\"product\":\"Widget\",\"quantity\":5,\"price\":19.99}",
+          "description": "瀹㈡埛鐨勮鍗曡鎯�",
+          "created_at": 1650000000000,
+          "updated_at": 1650000000000
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/audio-to-text'
+  method='POST'
+  title='璇煶杞枃瀛�'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    ### Request Body
+    璇ユ帴鍙i渶浣跨敤 `multipart/form-data` 杩涜璇锋眰銆�
+    <Properties>
+      <Property name='file' type='file' key='file'>
+        璇煶鏂囦欢銆�
+        鏀寔鏍煎紡锛歚['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm']`
+        鏂囦欢澶у皬闄愬埗锛�15MB
+      </Property>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+    </Properties>
+
+    ### Response
+    - `text` (string) 杈撳嚭鏂囧瓧
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/audio-to-text" targetCode={`curl -X POST '${props.appDetail.api_base_url}/audio-to-text' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=audio/[mp3|mp4|mpeg|mpga|m4a|wav|webm]`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/conversations/name' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@localfile;type=audio/mp3'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "text": "hello"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/text-to-audio'
+  method='POST'
+  title='鏂囧瓧杞闊�'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    鏂囧瓧杞闊炽��
+
+    ### Request Body
+
+    <Properties>
+      <Property name='message_id' type='str' key='message_id'>
+        Dify 鐢熸垚鐨勬枃鏈秷鎭紝閭d箞鐩存帴浼犻�掔敓鎴愮殑message-id 鍗冲彲锛屽悗鍙颁細閫氳繃 message_id 鏌ユ壘鐩稿簲鐨勫唴瀹圭洿鎺ュ悎鎴愯闊充俊鎭�傚鏋滃悓鏃朵紶 message_id 鍜� text锛屼紭鍏堜娇鐢� message_id銆�
+      </Property>
+      <Property name='text' type='str' key='text'>
+        璇煶鐢熸垚鍐呭銆傚鏋滄病鏈変紶 message-id鐨勮瘽锛屽垯浼氫娇鐢ㄨ繖涓瓧娈电殑鍐呭
+      </Property>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/text-to-audio" targetCode={`curl -o text-to-audio.mp3 -X POST '${props.appDetail.api_base_url}/text-to-audio' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290",\n    "text": "浣犲ソDify",\n    "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -o text-to-audio.mp3 -X POST '${props.appDetail.api_base_url}/text-to-audio' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290",
+        "text": "浣犲ソDify",
+        "user": "abc-123"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="headers">
+    ```json {{ title: 'headers' }}
+    {
+      "Content-Type": "audio/wav"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/info'
+  method='GET'
+  title='鑾峰彇搴旂敤鍩烘湰淇℃伅'
+  name='#info'
+/>
+<Row>
+  <Col>
+  鐢ㄤ簬鑾峰彇搴旂敤鐨勫熀鏈俊鎭�
+  ### Response
+  - `name` (string) 搴旂敤鍚嶇О
+  - `description` (string) 搴旂敤鎻忚堪
+  - `tags` (array[string]) 搴旂敤鏍囩
+  </Col>
+  <Col>
+    <CodeGroup title="Request" tag="GET" label="/info" targetCode={`curl -X GET '${props.appDetail.api_base_url}/info' \\\n-H 'Authorization: Bearer {api_key}'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/info' \
+      -H 'Authorization: Bearer {api_key}'
+      ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "name": "My App",
+      "description": "This is my app.",
+      "tags": [
+        "tag1",
+        "tag2"
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/parameters'
+  method='GET'
+  title='鑾峰彇搴旂敤鍙傛暟'
+  name='#parameters'
+/>
+<Row>
+  <Col>
+    鐢ㄤ簬杩涘叆椤甸潰涓�寮�濮嬶紝鑾峰彇鍔熻兘寮�鍏炽�佽緭鍏ュ弬鏁板悕绉般�佺被鍨嬪強榛樿鍊肩瓑浣跨敤銆�
+
+    ### Response
+    - `opening_statement` (string) 寮�鍦虹櫧
+    - `suggested_questions` (array[string]) 寮�鍦烘帹鑽愰棶棰樺垪琛�
+    - `suggested_questions_after_answer` (object) 鍚敤鍥炵瓟鍚庣粰鍑烘帹鑽愰棶棰樸��
+      - `enabled` (bool) 鏄惁寮�鍚�
+    - `speech_to_text` (object) 璇煶杞枃鏈�
+      - `enabled` (bool) 鏄惁寮�鍚�
+    - `retriever_resource` (object) 寮曠敤鍜屽綊灞�
+      - `enabled` (bool) 鏄惁寮�鍚�
+    - `annotation_reply` (object) 鏍囪鍥炲
+      - `enabled` (bool) 鏄惁寮�鍚�
+    - `user_input_form` (array[object]) 鐢ㄦ埛杈撳叆琛ㄥ崟閰嶇疆
+      - `text-input` (object) 鏂囨湰杈撳叆鎺т欢
+        - `label` (string) 鎺т欢灞曠ず鏍囩鍚�
+        - `variable` (string) 鎺т欢 ID
+        - `required` (bool) 鏄惁蹇呭~
+        - `default` (string) 榛樿鍊�
+      - `paragraph` (object) 娈佃惤鏂囨湰杈撳叆鎺т欢
+        - `label` (string) 鎺т欢灞曠ず鏍囩鍚�
+        - `variable` (string) 鎺т欢 ID
+        - `required` (bool) 鏄惁蹇呭~
+        - `default` (string) 榛樿鍊�
+      - `select` (object) 涓嬫媺鎺т欢
+        - `label` (string) 鎺т欢灞曠ず鏍囩鍚�
+        - `variable` (string) 鎺т欢 ID
+        - `required` (bool) 鏄惁蹇呭~
+        - `default` (string) 榛樿鍊�
+        - `options` (array[string]) 閫夐」鍊�
+    - `file_upload` (object) 鏂囦欢涓婁紶閰嶇疆
+      - `image` (object) 鍥剧墖璁剧疆
+        褰撳墠浠呮敮鎸佸浘鐗囩被鍨嬶細`png`, `jpg`, `jpeg`, `webp`, `gif`
+        - `enabled` (bool) 鏄惁寮�鍚�
+        - `number_limits` (int) 鍥剧墖鏁伴噺闄愬埗锛岄粯璁� 3
+        - `transfer_methods` (array[string]) 浼犻�掓柟寮忓垪琛紝remote_url , local_file锛屽繀閫変竴涓�
+    - `system_parameters` (object) 绯荤粺鍙傛暟
+      - `file_size_limit` (int) Document upload size limit (MB)
+      - `image_file_size_limit` (int) Image file upload size limit (MB)
+      - `audio_file_size_limit` (int) Audio file upload size limit (MB)
+      - `video_file_size_limit` (int) Video file upload size limit (MB)
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/parameters" targetCode={` curl -X GET '${props.appDetail.api_base_url}/parameters'\\\n--header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/parameters' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "introduction": "nice to meet you",
+      "user_input_form": [
+        {
+          "text-input": {
+            "label": "a",
+            "variable": "a",
+            "required": true,
+            "max_length": 48,
+            "default": ""
+          }
+        },
+        {
+          // ...
+        }
+      ],
+      "file_upload": {
+        "image": {
+          "enabled": true,
+          "number_limits": 3,
+          "transfer_methods": [
+            "remote_url",
+            "local_file"
+          ]
+        }
+      },
+      "system_parameters": {
+          "file_size_limit": 15,
+          "image_file_size_limit": 10,
+          "audio_file_size_limit": 50,
+          "video_file_size_limit": 100
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/meta'
+  method='GET'
+  title='鑾峰彇搴旂敤Meta淇℃伅'
+  name='#meta'
+/>
+<Row>
+  <Col>
+  鐢ㄤ簬鑾峰彇宸ュ叿icon
+  ### Response
+  - `tool_icons`(object[string]) 宸ュ叿鍥炬爣
+    - `宸ュ叿鍚嶇О` (string)
+      - `icon` (object|string)
+        - (object) 鍥炬爣
+          - `background` (string) hex鏍煎紡鐨勮儗鏅壊
+          - `content`(string) emoji
+        - (string) 鍥炬爣URL
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="POST" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/meta' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/meta' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "tool_icons": {
+          "dalle2": "https://cloud.dify.ai/console/api/workspaces/current/tool-provider/builtin/dalle/icon",
+          "api_tool": {
+              "background": "#252525",
+              "content": "\ud83d\ude01"
+          }
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/site'
+  method='GET'
+  title='鑾峰彇搴旂敤 WebApp 璁剧疆'
+  name='#site'
+/>
+<Row>
+  <Col>
+  鐢ㄤ簬鑾峰彇搴旂敤鐨� WebApp 璁剧疆
+  ### Response
+  - `title` (string) WebApp 鍚嶇О
+  - `chat_color_theme` (string) 鑱婂ぉ棰滆壊涓婚, hex 鏍煎紡
+  - `chat_color_theme_inverted` (bool) 鑱婂ぉ棰滆壊涓婚鏄惁鍙嶈浆
+  - `icon_type` (string) 鍥炬爣绫诲瀷, `emoji`-琛ㄦ儏, `image`-鍥剧墖
+  - `icon` (string) 鍥炬爣, 濡傛灉鏄� `emoji` 绫诲瀷, 鍒欐槸 emoji 琛ㄦ儏绗﹀彿, 濡傛灉鏄� `image` 绫诲瀷, 鍒欐槸鍥剧墖 URL
+  - `icon_background` (string) hex 鏍煎紡鐨勮儗鏅壊
+  - `icon_url` (string) 鍥炬爣 URL
+  - `description` (string) 鎻忚堪
+  - `copyright` (string) 鐗堟潈淇℃伅
+  - `privacy_policy` (string) 闅愮鏀跨瓥閾炬帴
+  - `custom_disclaimer` (string) 鑷畾涔夊厤璐e0鏄�
+  - `default_language` (string) 榛樿璇█
+  - `show_workflow_steps` (bool) 鏄惁鏄剧ず宸ヤ綔娴佽鎯�
+  - `use_icon_as_answer_icon` (bool) 鏄惁浣跨敤 WebApp 鍥炬爣鏇挎崲鑱婂ぉ涓殑 馃
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="POST" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/site' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/site' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "title": "My App",
+      "chat_color_theme": "#ff4a4a",
+      "chat_color_theme_inverted": false,
+      "icon_type": "emoji",
+      "icon": "馃槃",
+      "icon_background": "#FFEAD5",
+      "icon_url": null,
+      "description": "This is my app.",
+      "copyright": "all rights reserved",
+      "privacy_policy": "",
+      "custom_disclaimer": "All generated by AI",
+      "default_language": "en-US",
+      "show_workflow_steps": false,
+      "use_icon_as_answer_icon": false,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+___
+
+<Heading
+  url='/apps/annotations'
+  method='GET'
+  title='鑾峰彇鏍囨敞鍒楄〃'
+  name='#annotation_list'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='page' type='string' key='page'>
+        椤电爜
+      </Property>
+      <Property name='limit' type='string' key='limit'>
+        姣忛〉鏁伴噺
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/apps/annotations"
+      targetCode={`curl --location --request GET '${props.appDetail.api_base_url}/apps/annotations?page=1&limit=20' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.appDetail.api_base_url}/apps/annotations?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [
+        {
+          "id": "69d48372-ad81-4c75-9c46-2ce197b4d402",
+          "question": "What is your name?",
+          "answer": "I am Dify.",
+          "hit_count": 0,
+          "created_at": 1735625869
+        }
+      ],
+      "has_more": false,
+      "limit": 20,
+      "total": 1,
+      "page": 1
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotations'
+  method='POST'
+  title='鍒涘缓鏍囨敞'
+  name='#create_annotation'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='question' type='string' key='question'>
+        闂
+      </Property>
+      <Property name='answer' type='string' key='answer'>
+        绛旀鍐呭
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/apps/annotations"
+      targetCode={`curl --location --request POST '${props.appDetail.api_base_url}/apps/annotations' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"question": "What is your name?","answer": "I am Dify."}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.appDetail.api_base_url}/apps/annotations' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "question": "What is your name?",
+        "answer": "I am Dify."
+    }'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "69d48372-ad81-4c75-9c46-2ce197b4d402",
+      "question": "What is your name?",
+      "answer": "I am Dify.",
+      "hit_count": 0,
+      "created_at": 1735625869
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotations/{annotation_id}'
+  method='PUT'
+  title='鏇存柊鏍囨敞'
+  name='#update_annotation'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='annotation_id' type='string' key='annotation_id'>
+        鏍囨敞 ID
+      </Property>
+      <Property name='question' type='string' key='question'>
+        闂
+      </Property>
+      <Property name='answer' type='string' key='answer'>
+        绛旀鍐呭
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="PUT"
+      label="/apps/annotations/{annotation_id}"
+      targetCode={`curl --location --request PUT '${props.appDetail.api_base_url}/apps/annotations/{annotation_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"question": "What is your name?","answer": "I am Dify."}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request PUT '${props.appDetail.api_base_url}/apps/annotations/{annotation_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "question": "What is your name?",
+        "answer": "I am Dify."
+    }'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "69d48372-ad81-4c75-9c46-2ce197b4d402",
+      "question": "What is your name?",
+      "answer": "I am Dify.",
+      "hit_count": 0,
+      "created_at": 1735625869
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotations/{annotation_id}'
+  method='DELETE'
+  title='鍒犻櫎鏍囨敞'
+  name='#delete_annotation'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='annotation_id' type='string' key='annotation_id'>
+        鏍囨敞 ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="PUT"
+      label="/apps/annotations/{annotation_id}"
+      targetCode={`curl --location --request DELETE '${props.appDetail.api_base_url}/apps/annotations/{annotation_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.appDetail.api_base_url}/apps/annotations/{annotation_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotation-reply/{action}'
+  method='POST'
+  title='鏍囨敞鍥炲鍒濆璁剧疆'
+  name='#initial_annotation_reply_settings'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='action' type='string' key='action'>
+        鍔ㄤ綔锛屽彧鑳芥槸 'enable' 鎴� 'disable'
+      </Property>
+      <Property name='embedding_provider_name' type='string' key='embedding_provider_name'>
+        鎸囧畾鐨勫祵鍏ユā鍨嬫彁渚涘晢, 蹇呴』鍏堝湪绯荤粺鍐呰瀹氬ソ鎺ュ叆鐨勬ā鍨嬶紝瀵瑰簲鐨勬槸provider瀛楁
+      </Property>
+      <Property name='embedding_model_name' type='string' key='embedding_model_name'>
+        鎸囧畾鐨勫祵鍏ユā鍨嬶紝瀵瑰簲鐨勬槸model瀛楁
+      </Property>
+      <Property name='score_threshold' type='number' key='score_threshold'>
+        鐩镐技搴﹂槇鍊硷紝褰撶浉浼煎害澶т簬璇ラ槇鍊兼椂锛岀郴缁熶細鑷姩鍥炲锛屽惁鍒欎笉鍥炲
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    宓屽叆妯″瀷鐨勬彁渚涘晢鍜屾ā鍨嬪悕绉板彲浠ラ�氳繃浠ヤ笅鎺ュ彛鑾峰彇锛歷1/workspaces/current/models/model-types/text-embedding锛� 鍏蜂綋瑙侊細閫氳繃 API 缁存姢鐭ヨ瘑搴撱�� 浣跨敤鐨凙uthorization鏄疍ataset鐨凙PI Token銆�
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/apps/annotation-reply/{action}"
+      targetCode={`curl --location --request POST '${props.appDetail.api_base_url}/apps/annotation-reply/{action}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"score_threshold": 0.9, "embedding_provider_name": "zhipu", "embedding_model_name": "embedding_3"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST 'https://api.dify.ai/v1/apps/annotation-reply/{action}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "score_threshold": 0.9,
+        "embedding_provider_name": "zhipu",
+        "embedding_model_name": "embedding_3"
+    }'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "job_id": "b15c8f68-1cf4-4877-bf21-ed7cf2011802",
+      "job_status": "waiting"
+    }
+    ```
+    </CodeGroup>
+    璇ユ帴鍙f槸寮傛鎵ц锛屾墍浠ヤ細杩斿洖涓�涓猨ob_id锛岄�氳繃鏌ヨjob鐘舵�佹帴鍙e彲浠ヨ幏鍙栧埌鏈�缁堢殑鎵ц缁撴灉銆�
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotation-reply/{action}/status/{job_id}'
+  method='GET'
+  title='鏌ヨ鏍囨敞鍥炲鍒濆璁剧疆浠诲姟鐘舵��'
+  name='#initial_annotation_reply_settings_task_status'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+    <Property name='action' type='string' key='action'>
+        鍔ㄤ綔锛屽彧鑳芥槸 'enable' 鎴� 'disable'锛屽苟涓斿繀椤诲拰鏍囨敞鍥炲鍒濆璁剧疆鎺ュ彛鐨勫姩浣滀竴鑷�
+      </Property>
+      <Property name='job_id' type='string' key='job_id'>
+        浠诲姟 ID锛屼粠鏍囨敞鍥炲鍒濆璁剧疆鎺ュ彛杩斿洖鐨� job_id
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/apps/annotations"
+      targetCode={`curl --location --request GET '${props.appDetail.api_base_url}/apps/annotation-reply/{action}/status/{job_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.appDetail.api_base_url}/apps/annotation-reply/{action}/status/{job_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "job_id": "b15c8f68-1cf4-4877-bf21-ed7cf2011802",
+      "job_status": "waiting",
+      "error_msg": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
diff --git a/app/components/develop/template/template_chat.en.mdx b/app/components/develop/template/template_chat.en.mdx
new file mode 100644
index 0000000..c45a803
--- /dev/null
+++ b/app/components/develop/template/template_chat.en.mdx
@@ -0,0 +1,1700 @@
+import { CodeGroup } from '../code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty, Paragraph } from '../md.tsx'
+
+# Chat App API
+
+Chat applications support session persistence, allowing previous chat history to be used as context for responses. This can be applicable for chatbot, customer service AI, etc.
+
+<div>
+  ### Base URL
+  <CodeGroup title="Code" targetCode={props.appDetail.api_base_url}>
+    ```javascript
+    ```
+  </CodeGroup>
+
+  ### Authentication
+
+  The Service API uses `API-Key` authentication.
+  <i>**Strongly recommend storing your API Key on the server-side, not shared or stored on the client-side, to avoid possible API-Key leakage that can lead to serious consequences.**</i>
+
+  For all API requests, include your API Key in the `Authorization`HTTP Header, as shown below:
+
+  <CodeGroup title="Code">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+
+    ```
+  </CodeGroup>
+</div>
+
+---
+
+<Heading
+  url='/chat-messages'
+  method='POST'
+  title='Send Chat Message'
+  name='#Send-Chat-Message'
+/>
+<Row>
+  <Col>
+    Send a request to the chat application.
+
+    ### Request Body
+
+    <Properties>
+      <Property name='query' type='string' key='query'>
+        User Input/Question content
+      </Property>
+      <Property name='inputs' type='object' key='inputs'>
+          Allows the entry of various variable values defined by the App.
+          The `inputs` parameter contains multiple key/value pairs, with each key corresponding to a specific variable and each value being the specific value for that variable. Default `{}`
+      </Property>
+      <Property name='response_mode' type='string' key='response_mode'>
+        The mode of response return, supporting:
+        - `streaming` Streaming mode (recommended), implements a typewriter-like output through SSE ([Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)).
+        - `blocking` Blocking mode, returns result after execution is complete. (Requests may be interrupted if the process is long)
+        Due to Cloudflare restrictions, the request will be interrupted without a return after 100 seconds.
+        <i>Note: blocking mode is not supported in Agent Assistant mode</i>
+      </Property>
+      <Property name='user' type='string' key='user'>
+          User identifier, used to define the identity of the end-user for retrieval and statistics.
+          Should be uniquely defined by the developer within the application.
+      </Property>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+      Conversation ID, to continue the conversation based on previous chat records, it is necessary to pass the previous message's conversation_id.
+      </Property>
+      <Property name='files' type='array[object]' key='files'>
+          File list, suitable for inputting files (images) combined with text understanding and answering questions, available only when the model supports Vision capability.
+          - `type` (string) Supported type: `image` (currently only supports image type)
+          - `transfer_method` (string) Transfer method, `remote_url` for image URL / `local_file` for file upload
+          - `url` (string) Image URL (when the transfer method is `remote_url`)
+          - `upload_file_id` (string) Uploaded file ID, which must be obtained by uploading through the File Upload API in advance (when the transfer method is `local_file`)
+      </Property>
+      <Property name='auto_generate_name' type='bool' key='auto_generate_name'>
+      Auto-generate title, default is `true`.
+      If set to `false`, can achieve async title generation by calling the conversation rename API and setting `auto_generate` to `true`.
+      </Property>
+    </Properties>
+
+    ### Response
+    When response_mode is blocking, return a CompletionResponse object.
+    When response_mode is streaming, return a ChunkCompletionResponse stream.
+
+    ### ChatCompletionResponse
+    Returns the complete App result, `Content-Type` is `application/json`.
+    - `event` (string) 浜嬩欢绫诲瀷锛屽浐瀹氫负 `message`
+    - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+    - `id` (string) 鍞竴ID
+    - `message_id` (string) Unique message ID
+    - `conversation_id` (string) Conversation ID
+    - `mode` (string) App mode, fixed as `chat`
+    - `answer` (string) Complete response content
+    - `metadata` (object) Metadata
+      - `usage` (Usage) Model usage information
+      - `retriever_resources` (array[RetrieverResource]) Citation and Attribution List
+    - `created_at` (int) Message creation timestamp, e.g., 1705395332
+
+    ### ChunkChatCompletionResponse
+    Returns the stream chunks outputted by the App, `Content-Type` is `text/event-stream`.
+    Each streaming chunk starts with `data:`, separated by two newline characters `\n\n`, as shown below:
+    <CodeGroup>
+    ```streaming {{ title: 'Response' }}
+    data: {"event": "message", "task_id": "900bbd43-dc0b-4383-a372-aa6e6c414227", "id": "663c5084-a254-4040-8ad3-51f2a3c1a77c", "answer": "Hi", "created_at": 1705398420}\n\n
+    ```
+    </CodeGroup>
+    The structure of the streaming chunks varies depending on the `event`:
+    - `event: message` LLM returns text chunk event, i.e., the complete text is output in a chunked fashion.
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `message_id` (string) Unique message ID
+      - `conversation_id` (string) Conversation ID
+      - `answer` (string) LLM returned text chunk content
+      - `created_at` (int) Creation timestamp, e.g., 1705395332
+    - `event: agent_message` LLM returns text chunk event, i.e., with Agent Assistant enabled, the complete text is output in a chunked fashion (Only supported in Agent mode)
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `message_id` (string) Unique message ID
+      - `conversation_id` (string) Conversation ID
+      - `answer` (string) LLM returned text chunk content
+      - `created_at` (int) Creation timestamp, e.g., 1705395332
+    - `event: tts_message` TTS audio stream event, that is, speech synthesis output. The content is an audio block in Mp3 format, encoded as a base64 string. When playing, simply decode the base64 and feed it into the player. (This message is available only when auto-play is enabled)
+      - `task_id` (string) Task ID, used for request tracking and the stop response interface below
+      - `message_id` (string) Unique message ID
+      - `audio` (string) The audio after speech synthesis, encoded in base64 text content, when playing, simply decode the base64 and feed it into the player
+      - `created_at` (int) Creation timestamp, e.g.: 1705395332
+    - `event: tts_message_end` TTS audio stream end event, receiving this event indicates the end of the audio stream.
+      - `task_id` (string) Task ID, used for request tracking and the stop response interface below
+      - `message_id` (string) Unique message ID
+      - `audio` (string) The end event has no audio, so this is an empty string
+      - `created_at` (int) Creation timestamp, e.g.: 1705395332
+    - `event: agent_thought` thought of Agent, contains the thought of LLM, input and output of tool calls (Only supported in Agent mode)
+      - `id` (string) Agent thought ID, every iteration has a unique agent thought ID
+      - `task_id` (string)  Task ID, used for request tracking and the below Stop Generate API
+      - `message_id` (string) Unique message ID
+      - `position` (int) Position of current agent thought, each message may have multiple thoughts in order.
+      - `thought` (string) What LLM is thinking about
+      - `observation` (string) Response from tool calls
+      - `tool` (string) A list of tools represents which tools are called锛宻plit by ;
+      - `tool_input` (string) Input of tools in JSON format. Like: `{"dalle3": {"prompt": "a cute cat"}}`.
+      - `created_at` (int) Creation timestamp, e.g., 1705395332
+      - `message_files` (array[string])  Refer to message_file event
+        - `file_id` (string) File ID
+      - `conversation_id` (string) Conversation ID
+    - `event: message_file` Message file event, a new file has created by tool
+      - `id` (string) File unique ID
+      - `type` (string) File type锛宱nly allow "image" currently
+      - `belongs_to` (string) Belongs to, it will only be an 'assistant' here
+      - `url` (string) Remote url of file
+      - `conversation_id`  (string) Conversation ID
+    - `event: message_end` Message end event, receiving this event means streaming has ended.
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `message_id` (string) Unique message ID
+      - `conversation_id` (string) Conversation ID
+      - `metadata` (object) Metadata
+        - `usage` (Usage) Model usage information
+        - `retriever_resources` (array[RetrieverResource]) Citation and Attribution List
+    - `event: message_replace` Message content replacement event.
+      When output content moderation is enabled, if the content is flagged, then the message content will be replaced with a preset reply through this event.
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `message_id` (string) Unique message ID
+      - `conversation_id` (string) Conversation ID
+      - `answer` (string) Replacement content (directly replaces all LLM reply text)
+      - `created_at` (int) Creation timestamp, e.g., 1705395332
+    - `event: error`
+      Exceptions that occur during the streaming process will be output in the form of stream events, and reception of an error event will end the stream.
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `message_id` (string) Unique message ID
+      - `status` (int) HTTP status code
+      - `code` (string) Error code
+      - `message` (string) Error message
+    - `event: ping` Ping event every 10 seconds to keep the connection alive.
+
+    ### Errors
+    - 404, Conversation does not exists
+    - 400, `invalid_param`, abnormal parameter input
+    - 400, `app_unavailable`, App configuration unavailable
+    - 400, `provider_not_initialize`, no available model credential configuration
+    - 400, `provider_quota_exceeded`, model invocation quota insufficient
+    - 400, `model_currently_not_support`, current model unavailable
+    - 400, `completion_request_error`, text generation failed
+    - 500, internal server error
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/chat-messages" targetCode={`curl -X POST '${props.appDetail.api_base_url}/chat-messages' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "inputs": ${JSON.stringify(props.inputs)},\n    "query": "What are the specs of the iPhone 13 Pro Max?",\n    "response_mode": "streaming",\n    "conversation_id": "",\n    "user": "abc-123",\n    "files": [\n      {\n        "type": "image",\n        "transfer_method": "remote_url",\n        "url": "https://cloud.dify.ai/logo/logo-site.png"\n      }\n    ]\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/chat-messages' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "inputs": {},
+        "query": "eh",
+        "response_mode": "streaming",
+        "conversation_id": "1c7e55fb-1ba2-4e10-81b5-30addcea2276",
+        "user": "abc-123"
+    }'
+    ```
+    </CodeGroup>
+    ### Blocking Mode
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+        "event": "message",
+        "task_id": "c3800678-a077-43df-a102-53f23ed20b88", 
+        "id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "message_id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2",
+        "mode": "chat",
+        "answer": "iPhone 13 Pro Max specs are listed here:...",
+        "metadata": {
+            "usage": {
+                "prompt_tokens": 1033,
+                "prompt_unit_price": "0.001",
+                "prompt_price_unit": "0.001",
+                "prompt_price": "0.0010330",
+                "completion_tokens": 128,
+                "completion_unit_price": "0.002",
+                "completion_price_unit": "0.001",
+                "completion_price": "0.0002560",
+                "total_tokens": 1161,
+                "total_price": "0.0012890",
+                "currency": "USD",
+                "latency": 0.7682376249867957
+            },
+            "retriever_resources": [
+                {
+                    "position": 1,
+                    "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb",
+                    "dataset_name": "iPhone",
+                    "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00",
+                    "document_name": "iPhone List",
+                    "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a",
+                    "score": 0.98457545,
+                    "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""
+                }
+            ]
+        },
+        "created_at": 1705407629
+    }
+    ```
+    </CodeGroup>
+    ### Streaming Mode ( Basic Assistant )
+    <CodeGroup title="Response">
+    ```streaming {{ title: 'Response' }}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " I", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": "'m", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " glad", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " to", "created_at": 1679586595}
+      data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " meet", "created_at": 1679586595}
+      data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " you", "created_at": 1679586595}
+      data: {"event": "message_end", "id": "5e52ce04-874b-4d27-9045-b3bc80def685", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "metadata": {"usage": {"prompt_tokens": 1033, "prompt_unit_price": "0.001", "prompt_price_unit": "0.001", "prompt_price": "0.0010330", "completion_tokens": 135, "completion_unit_price": "0.002", "completion_price_unit": "0.001", "completion_price": "0.0002700", "total_tokens": 1168, "total_price": "0.0013030", "currency": "USD", "latency": 1.381760165997548}, "retriever_resources": [{"position": 1, "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb", "dataset_name": "iPhone", "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00", "document_name": "iPhone List", "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a", "score": 0.98457545, "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""}]}}
+      data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+      data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+    ```
+    </CodeGroup>
+    ### Response Example(Agent Assistant)
+    <CodeGroup title="Response">
+    ```streaming {{ title: 'Response' }}
+    data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " I", "created_at": 1679586595}
+    data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": "'m", "created_at": 1679586595}
+    data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " glad", "created_at": 1679586595}
+    data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " to", "created_at": 1679586595}
+    data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " meet", "created_at": 1679586595}
+    data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " you", "created_at": 1679586595}
+    data: {"event": "message_end", "id": "5e52ce04-874b-4d27-9045-b3bc80def685", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "metadata": {"usage": {"prompt_tokens": 1033, "prompt_unit_price": "0.001", "prompt_price_unit": "0.001", "prompt_price": "0.0010330", "completion_tokens": 135, "completion_unit_price": "0.002", "completion_price_unit": "0.001", "completion_price": "0.0002700", "total_tokens": 1168, "total_price": "0.0013030", "currency": "USD", "latency": 1.381760165997548}, "retriever_resources": [{"position": 1, "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb", "dataset_name": "iPhone", "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00", "document_name": "iPhone List", "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a", "score": 0.98457545, "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""}]}}
+    data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+    data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+  ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/files/upload'
+  method='POST'
+  title='File Upload'
+  name='#file-upload'
+/>
+<Row>
+  <Col>
+  Upload a file (currently only images are supported) for use when sending messages, enabling multimodal understanding of images and text.
+  Supports png, jpg, jpeg, webp, gif formats.
+  Uploaded files are for use by the current end-user only.
+
+  ### Request Body
+  This interface requires a `multipart/form-data` request.
+  - `file` (File) Required
+    The file to be uploaded.
+  - `user` (string) Required
+    User identifier, defined by the developer's rules, must be unique within the application.
+
+  ### Response
+  After a successful upload, the server will return the file's ID and related information.
+  - `id` (uuid) ID
+  - `name` (string) File name
+  - `size` (int) File size (bytes)
+  - `extension` (string) File extension
+  - `mime_type` (string) File mime-type
+  - `created_by` (uuid) End-user ID
+  - `created_at` (timestamp) Creation timestamp, e.g., 1705395332
+
+  ### Errors
+  - 400, `no_file_uploaded`, a file must be provided
+  - 400, `too_many_files`, currently only one file is accepted
+  - 400, `unsupported_preview`, the file does not support preview
+  - 400, `unsupported_estimate`, the file does not support estimation
+  - 413, `file_too_large`, the file is too large
+  - 415, `unsupported_file_type`, unsupported extension, currently only document files are accepted
+  - 503, `s3_connection_failed`, unable to connect to S3 service
+  - 503, `s3_permission_denied`, no permission to upload files to S3
+  - 503, `s3_file_too_large`, file exceeds S3 size limit
+  - 500, internal server error
+
+
+  </Col>
+  <Col sticky>
+  ### Request Example
+  <CodeGroup title="Request" tag="POST" label="/files/upload" targetCode={`curl -X POST '${props.appDetail.api_base_url}/files/upload' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=image/[png|jpeg|jpg|webp|gif] \\\n--form 'user=abc-123'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/files/upload' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@"/path/to/file"'
+    ```
+
+    </CodeGroup>
+
+
+  ### Response Example
+  <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "72fa9618-8f89-4a37-9b33-7e1178a24a67",
+      "name": "example.png",
+      "size": 1024,
+      "extension": "png",
+      "mime_type": "image/png",
+      "created_by": "6ad1ab0a-73ff-4ac1-b9e4-cdb312f71f13",
+      "created_at": 1577836800,
+    }
+  ```
+  </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/chat-messages/:task_id/stop'
+  method='POST'
+  title='Stop Generate'
+  name='#stop-generatebacks'
+/>
+<Row>
+  <Col>
+  Only supported in streaming mode.
+  ### Path
+  - `task_id` (string) Task ID, can be obtained from the streaming chunk return
+  ### Request Body
+  - `user` (string) Required
+    User identifier, used to define the identity of the end-user, must be consistent with the user passed in the send message interface.
+  ### Response
+  - `result` (string) Always returns "success"
+  </Col>
+  <Col sticky>
+  ### Request Example
+  <CodeGroup title="Request" tag="POST" label="/chat-messages/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/chat-messages/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/chat-messages/:task_id/stop' \
+    -H 'Authorization: Bearer {api_key}' \
+    -H 'Content-Type: application/json' \
+    --data-raw '{
+        "user": "abc-123"
+    }'
+    ```
+    </CodeGroup>
+
+    ### Response Example
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/messages/:message_id/feedbacks'
+  method='POST'
+  title='Message Feedback'
+  name='#feedbacks'
+/>
+<Row>
+  <Col>
+    End-users can provide feedback messages, facilitating application developers to optimize expected outputs.
+
+    ### Path
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+       Message ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+
+    <Properties>
+      <Property name='rating' type='string' key='rating'>
+        Upvote as `like`, downvote as `dislike`, revoke upvote as `null`
+      </Property>
+      <Property name='user' type='string' key='user'>
+        User identifier, defined by the developer's rules, must be unique within the application.
+      </Property>
+      <Property name='content' type='string' key='content'>
+        The specific content of message feedback.
+      </Property>
+    </Properties>
+
+    ### Response
+    - `result` (string) Always returns "success"
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/messages/:message_id/feedbacks" targetCode={`curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks \\\n --header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "rating": "like",\n    "user": "abc-123",\n    "content": "message feedback information"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "rating": "like",
+        "user": "abc-123",
+        "content": "message feedback information"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/app/feedbacks'
+  method='GET'
+  title='Get feedbacks of application'
+  name='#app-feedbacks'
+/>
+<Row>
+  <Col>
+    Get application's feedbacks.
+
+    ### Query
+    <Properties>
+      <Property name='page' type='string' key='page'>
+       锛坥ptional锛塸agination锛宒efault锛�1
+      </Property>
+    </Properties>
+
+    <Properties>
+      <Property name='limit' type='string' key='limit'>
+       锛坥ptional锛� records per page default锛�20
+      </Property>
+    </Properties>
+
+    ### Response
+    - `data` (List) return apps feedback list.
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/app/feedbacks" targetCode={`curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+      {
+          "data": [
+              {
+                  "id": "8c0fbed8-e2f9-49ff-9f0e-15a35bdd0e25",
+                  "app_id": "f252d396-fe48-450e-94ec-e184218e7346",
+                  "conversation_id": "2397604b-9deb-430e-b285-4726e51fd62d",
+                  "message_id": "709c0b0f-0a96-4a4e-91a4-ec0889937b11",
+                  "rating": "like",
+                  "content": "message feedback information-3",
+                  "from_source": "user",
+                  "from_end_user_id": "74286412-9a1a-42c1-929c-01edb1d381d5",
+                  "from_account_id": null,
+                  "created_at": "2025-04-24T09:24:38",
+                  "updated_at": "2025-04-24T09:24:38"
+              }
+          ]
+      }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/messages/{message_id}/suggested'
+  method='GET'
+  title='Next Suggested Questions'
+  name='#suggested'
+/>
+<Row>
+  <Col>
+    Get next questions suggestions for the current message
+
+    ### Path Params
+
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+        Message ID
+      </Property>
+    </Properties>
+
+    ### Query
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        User identifier, used to define the identity of the end-user for retrieval and statistics.
+        Should be uniquely defined by the developer within the application.
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/messages/{message_id}/suggested" targetCode={`curl --location --request GET '${props.appDetail.api_base_url}/messages/{message_id}/suggested?user=abc-123& \\\n--header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \\\n--header 'Content-Type: application/json'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.appDetail.api_base_url}/messages/{message_id}/suggested' \
+    --header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \
+    --header 'Content-Type: application/json' \
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success",
+      "data": [
+            "a",
+            "b",
+            "c"
+        ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/messages'
+  method='GET'
+  title='Get Conversation History Messages'
+  name='#messages'
+/>
+<Row>
+  <Col>
+    Returns historical chat records in a scrolling load format, with the first page returning the latest `{limit}` messages, i.e., in reverse order.
+
+    ### Query
+
+    <Properties>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+        Conversation ID
+      </Property>
+      <Property name='user' type='string' key='user'>
+        User identifier, used to define the identity of the end-user for retrieval and statistics.
+        Should be uniquely defined by the developer within the application.
+      </Property>
+      <Property name='first_id' type='string' key='first_id'>
+          The ID of the first chat record on the current page, default is null.
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+          How many chat history messages to return in one request, default is 20.
+      </Property>
+    </Properties>
+
+    ### Response
+    - `data` (array[object]) Message list
+    - `id` (string) Message ID
+    - `conversation_id` (string) Conversation ID
+    - `inputs` (object) User input parameters.
+    - `query` (string) User input / question content.
+    - `message_files` (array[object]) Message files
+      - `id` (string) ID
+      - `type` (string) File type, image for images
+      - `url` (string) Preview image URL
+      - `belongs_to` (string) belongs to锛寀ser or assistant
+    - `agent_thoughts` (array[object]) Agent thought锛圗mpty if it's a Basic Assistant锛�
+      - `id` (string) Agent thought ID, every iteration has a unique agent thought ID
+      - `message_id` (string) Unique message ID
+      - `position` (int) Position of current agent thought, each message may have multiple thoughts in order.
+      - `thought` (string) What LLM is thinking about
+      - `observation` (string) Response from tool calls
+      - `tool` (string) A list of tools represents which tools are called锛宻plit by ;
+      - `tool_input` (string) Input of tools in JSON format. Like: `{"dalle3": {"prompt": "a cute cat"}}`.
+      - `created_at` (int) Creation timestamp, e.g., 1705395332
+      - `message_files` (array[string])  Refer to message_file event
+        - `file_id` (string) File ID
+    - `answer` (string) Response message content
+    - `created_at` (timestamp) Creation timestamp, e.g., 1705395332
+    - `feedback` (object) Feedback information
+      - `rating` (string) Upvote as `like` / Downvote as `dislike`
+    - `retriever_resources` (array[RetrieverResource]) Citation and Attribution List
+  - `has_more` (bool) Whether there is a next page
+  - `limit` (int) Number of returned items, if input exceeds system limit, returns system limit amount
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/messages" targetCode={`curl -X GET '${props.appDetail.api_base_url}/messages?user=abc-123&conversation_id='\\\n --header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/messages?user=abc-123&conversation_id='
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+    ### Response Example (Basic Assistant)
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "limit": 20,
+      "has_more": false,
+      "data": [
+        {
+            "id": "a076a87f-31e5-48dc-b452-0061adbbc922",
+            "conversation_id": "cd78daf6-f9e4-4463-9ff2-54257230a0ce",
+            "inputs": {
+                "name": "dify"
+            },
+            "query": "iphone 13 pro",
+            "answer": "The iPhone 13 Pro, released on September 24, 2021, features a 6.1-inch display with a resolution of 1170 x 2532. It is equipped with a Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard) processor, 6 GB of RAM, and offers storage options of 128 GB, 256 GB, 512 GB, and 1 TB. The camera is 12 MP, the battery capacity is 3095 mAh, and it runs on iOS 15.",
+            "message_files": [],
+            "feedback": null,
+            "retriever_resources": [
+                {
+                    "position": 1,
+                    "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb",
+                    "dataset_name": "iPhone",
+                    "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00",
+                    "document_name": "iPhone List",
+                    "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a",
+                    "score": 0.98457545,
+                    "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""
+                }
+            ],
+            "agent_thoughts": [],
+            "created_at": 1705569239,
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+
+    ### Response Example (Agent Assistant)
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+        "limit": 20,
+        "has_more": false,
+        "data": [
+            {
+                "id": "d35e006c-7c4d-458f-9142-be4930abdf94",
+                "conversation_id": "957c068b-f258-4f89-ba10-6e8a0361c457",
+                "inputs": {},
+                "query": "draw a cat",
+                "answer": "I have generated an image of a cat for you. Please check your messages to view the image.",
+                "message_files": [
+                    {
+                        "id": "976990d2-5294-47e6-8f14-7356ba9d2d76",
+                        "type": "image",
+                        "url": "http://127.0.0.1:5001/files/tools/976990d2-5294-47e6-8f14-7356ba9d2d76.png?timestamp=1705988524&nonce=55df3f9f7311a9acd91bf074cd524092&sign=z43nMSO1L2HBvoqADLkRxr7Biz0fkjeDstnJiCK1zh8=",
+                        "belongs_to": "assistant"
+                    }
+                ],
+                "feedback": null,
+                "retriever_resources": [],
+                "created_at": 1705988187,
+                "agent_thoughts": [
+                    {
+                        "id": "592c84cf-07ee-441c-9dcc-ffc66c033469",
+                        "chain_id": null,
+                        "message_id": "d35e006c-7c4d-458f-9142-be4930abdf94",
+                        "position": 1,
+                        "thought": "",
+                        "tool": "dalle2",
+                        "tool_input": "{\"dalle2\": {\"prompt\": \"cat\"}}",
+                        "created_at": 1705988186,
+                        "observation": "image has been created and sent to user already, you should tell user to check it now.",
+                        "files": [
+                            "976990d2-5294-47e6-8f14-7356ba9d2d76"
+                        ]
+                    },
+                    {
+                        "id": "73ead60d-2370-4780-b5ed-532d2762b0e5",
+                        "chain_id": null,
+                        "message_id": "d35e006c-7c4d-458f-9142-be4930abdf94",
+                        "position": 2,
+                        "thought": "I have generated an image of a cat for you. Please check your messages to view the image.",
+                        "tool": "",
+                        "tool_input": "",
+                        "created_at": 1705988199,
+                        "observation": "",
+                        "files": []
+                    }
+                ]
+            }
+        ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations'
+  method='GET'
+  title='Get Conversations'
+  name='#conversations'
+/>
+<Row>
+  <Col>
+    Retrieve the conversation list for the current user, defaulting to the most recent 20 entries.
+
+    ### Query
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+          User identifier, used to define the identity of the end-user for retrieval and statistics.
+          Should be uniquely defined by the developer within the application.
+      </Property>
+      <Property name='last_id' type='string' key='last_id'>
+          (Optional) The ID of the last record on the current page, default is null.
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+          (Optional) How many records to return in one request, default is the most recent 20 entries. Maximum 100, minimum 1.
+      </Property>
+      <Property name='sort_by' type='string' key='sort_by'>
+        (Optional) Sorting Field, Default: -updated_at (sorted in descending order by update time)
+        - Available Values: created_at, -created_at, updated_at, -updated_at
+        - The symbol before the field represents the order or reverse, "-" represents reverse order.
+      </Property>
+    </Properties>
+
+    ### Response
+    - `data` (array[object]) List of conversations
+      - `id` (string) Conversation ID
+      - `name` (string) Conversation name, by default, is a snippet of the first question asked by the user in the conversation.
+      - `inputs` (object) User input parameters.
+      - `status` (string) Conversation status
+      - `introduction` (string) Introduction
+      - `created_at` (timestamp) Creation timestamp, e.g., 1705395332
+      - `updated_at` (timestamp) Update timestamp, e.g., 1705395332
+    - `has_more` (bool)
+    - `limit` (int) Number of entries returned, if input exceeds system limit, system limit number is returned
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/conversations" targetCode={`curl -X GET '${props.appDetail.api_base_url}/conversations?user=abc-123&last_id=&limit=20' \\\n --header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations?user=abc-123&last_id=&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "limit": 20,
+      "has_more": false,
+      "data": [
+        {
+          "id": "10799fb8-64f7-4296-bbf7-b42bfbe0ae54",
+          "name": "New chat",
+          "inputs": {
+              "book": "book",
+              "myName": "Lucy"
+          },
+          "status": "normal",
+          "created_at": 1679667915,
+          "updated_at": 1679667915
+        },
+        {
+          "id": "hSIhXBhNe8X1d8Et"
+          // ...
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations/:conversation_id'
+  method='DELETE'
+  title='Delete Conversation'
+  name='#delete'
+/>
+<Row>
+  <Col>
+    Delete a conversation.
+
+    ### Path
+    - `conversation_id` (string) Conversation ID
+
+    ### Request Body
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        The user identifier, defined by the developer, must ensure uniqueness within the application.
+      </Property>
+    </Properties>
+
+    ### Response
+    - `result` (string) Always returns "success"
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="DELETE" label="/conversations/:conversation_id" targetCode={`curl -X DELETE '${props.appDetail.api_base_url}/conversations/:conversation_id' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+        curl -X DELETE '${props.appDetail.api_base_url}/conversations/{conversation_id}' \
+        --header 'Content-Type: application/json' \
+        --header 'Accept: application/json' \
+        --header 'Authorization: Bearer {api_key}' \
+        --data '{
+            "user": "abc-123"
+        }'
+      ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/conversations/:conversation_id/name'
+  method='POST'
+  title='Conversation Rename'
+  name='#rename'
+/>
+<Row>
+  <Col>
+    ### Request Body
+    Rename the session, the session name is used for display on clients that support multiple sessions.
+
+    ### Path
+    - `conversation_id` (string) Conversation ID
+
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        (Optional) The name of the conversation. This parameter can be omitted if `auto_generate` is set to `true`.
+      </Property>
+      <Property name='auto_generate' type='bool' key='auto_generate'>
+        (Optional) Automatically generate the title, default is `false`
+      </Property>
+      <Property name='user' type='string' key='user'>
+        The user identifier, defined by the developer, must ensure uniqueness within the application.
+      </Property>
+    </Properties>
+
+    ### Response
+    - `id` (string) Conversation ID
+    - `name` (string) Conversation name
+    - `inputs` (object) User input parameters
+    - `status` (string) Conversation status
+    - `introduction` (string) Introduction
+    - `created_at` (timestamp) Creation timestamp, e.g., 1705395332
+    - `updated_at` (timestamp) Update timestamp, e.g., 1705395332
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/conversations/:conversation_id/name" targetCode={`curl -X POST '${props.appDetail.api_base_url}/conversations/:conversation_id/name' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "name": "", \n "auto_generate": true, \n "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/conversations/{conversation_id}/name' \
+    --header 'Content-Type: application/json' \
+    --header 'Authorization: Bearer {api_key}' \
+    --data-raw '{
+        "name": "",
+        "auto_generate": true,
+        "user": "abc-123"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+        "id": "cd78daf6-f9e4-4463-9ff2-54257230a0ce",
+        "name": "Chat vs AI",
+        "inputs": {},
+        "status": "normal",
+        "introduction": "",
+        "created_at": 1705569238,
+        "updated_at": 1705569238
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations/:conversation_id/variables'
+  method='GET'
+  title='Get Conversation Variables'
+  name='#conversation-variables'
+/>
+<Row>
+  <Col>
+    Retrieve variables from a specific conversation. This endpoint is useful for extracting structured data that was captured during the conversation.
+
+    ### Path Parameters
+
+    <Properties>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+        The ID of the conversation to retrieve variables from.
+      </Property>
+    </Properties>
+
+    ### Query Parameters
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        The user identifier, defined by the developer, must ensure uniqueness within the application
+      </Property>
+      <Property name='last_id' type='string' key='last_id'>
+          (Optional) The ID of the last record on the current page, default is null.
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+          (Optional) How many records to return in one request, default is the most recent 20 entries. Maximum 100, minimum 1.
+      </Property>
+    </Properties>
+
+    ### Response
+
+    - `limit` (int) Number of items per page
+    - `has_more` (bool) Whether there is a next page
+    - `data` (array[object]) List of variables
+      - `id` (string) Variable ID
+      - `name` (string) Variable name
+      - `value_type` (string) Variable type (string, number, object, etc.)
+      - `value` (string) Variable value
+      - `description` (string) Variable description
+      - `created_at` (int) Creation timestamp
+      - `updated_at` (int) Last update timestamp
+
+    ### Errors
+    - 404, `conversation_not_exists`, Conversation not found
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/conversations/:conversation_id/variables" targetCode={`curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123' \\\n--header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Request with variable name filter">
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123&variable_name=customer_name' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "limit": 100,
+      "has_more": false,
+      "data": [
+        {
+          "id": "variable-uuid-1",
+          "name": "customer_name",
+          "value_type": "string",
+          "value": "John Doe",
+          "description": "Customer name extracted from the conversation",
+          "created_at": 1650000000000,
+          "updated_at": 1650000000000
+        },
+        {
+          "id": "variable-uuid-2",
+          "name": "order_details",
+          "value_type": "json",
+          "value": "{\"product\":\"Widget\",\"quantity\":5,\"price\":19.99}",
+          "description": "Order details from the customer",
+          "created_at": 1650000000000,
+          "updated_at": 1650000000000
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/audio-to-text'
+  method='POST'
+  title='Speech to Text'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    This endpoint requires a multipart/form-data request.
+
+    ### Request Body
+
+    <Properties>
+      <Property name='file' type='file' key='file'>
+        Audio file.
+        Supported formats: `['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm']`
+        File size limit: 15MB
+      </Property>
+      <Property name='user' type='string' key='user'>
+      User identifier, defined by the developer's rules, must be unique within the application.
+      </Property>
+    </Properties>
+
+    ### Response
+    - `text` (string) Output text
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/audio-to-text" targetCode={`curl -X POST '${props.appDetail.api_base_url}/audio-to-text' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=audio/[mp3|mp4|mpeg|mpga|m4a|wav|webm]'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/conversations/name' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@localfile;type=audio/mp3'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "text": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/text-to-audio'
+  method='POST'
+  title='Text to Audio'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    Text to speech.
+
+    ### Request Body
+
+    <Properties>
+      <Property name='message_id' type='str' key='message_id'>
+        For text messages generated by Dify, simply pass the generated message-id directly. The backend will use the message-id to look up the corresponding content and synthesize the voice information directly. If both message_id and text are provided simultaneously, the message_id is given priority.
+      </Property>
+      <Property name='text' type='str' key='text'>
+        Speech generated content銆�
+      </Property>
+      <Property name='user' type='string' key='user'>
+        The user identifier, defined by the developer, must ensure uniqueness within the app.
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/text-to-audio" targetCode={`curl --location --request POST '${props.appDetail.api_base_url}/text-to-audio' \\\n--header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \\\n--form 'text=Hello Dify;user=abc-123;message_id=5ad4cb98-f0c7-4085-b384-88c403be6290`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.appDetail.api_base_url}/text-to-audio' \
+    --header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \
+    --form 'file=Hello Dify;user=abc-123;message_id=5ad4cb98-f0c7-4085-b384-88c403be6290'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="headers">
+    ```json {{ title: 'headers' }}
+    {
+      "Content-Type": "audio/wav"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/info'
+  method='GET'
+  title='Get Application Basic Information'
+  name='#info'
+/>
+<Row>
+  <Col>
+  Used to get basic information about this application
+
+  ### Response
+  - `name` (string) application name
+  - `description` (string) application description
+  - `tags` (array[string]) application tags
+  </Col>
+  <Col>
+    <CodeGroup title="Request" tag="GET" label="/info" targetCode={`curl -X GET '${props.appDetail.api_base_url}/info' \\\n-H 'Authorization: Bearer {api_key}'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/info' \
+      -H 'Authorization: Bearer {api_key}'
+      ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "name": "My App",
+      "description": "This is my app.",
+      "tags": [
+        "tag1",
+        "tag2"
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/parameters'
+  method='GET'
+  title='Get Application Parameters Information'
+  name='#parameters'
+/>
+<Row>
+  <Col>
+    Used at the start of entering the page to obtain information such as features, input parameter names, types, and default values.
+
+    ### Query
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+          User identifier, defined by the developer's rules, must be unique within the application.
+      </Property>
+    </Properties>
+
+    ### Response
+    - `opening_statement` (string) Opening statement
+    - `suggested_questions` (array[string]) List of suggested questions for the opening
+    - `suggested_questions_after_answer` (object) Suggest questions after enabling the answer.
+      - `enabled` (bool) Whether it is enabled
+    - `speech_to_text` (object) Speech to text
+      - `enabled` (bool) Whether it is enabled
+    - `retriever_resource` (object) Citation and Attribution
+      - `enabled` (bool) Whether it is enabled
+    - `annotation_reply` (object) Annotation reply
+      - `enabled` (bool) Whether it is enabled
+    - `user_input_form` (array[object]) User input form configuration
+      - `text-input` (object) Text input control
+        - `label` (string) Variable display label name
+        - `variable` (string) Variable ID
+        - `required` (bool) Whether it is required
+        - `default` (string) Default value
+      - `paragraph` (object) Paragraph text input control
+        - `label` (string) Variable display label name
+        - `variable` (string) Variable ID
+        - `required` (bool) Whether it is required
+        - `default` (string) Default value
+      - `select` (object) Dropdown control
+        - `label` (string) Variable display label name
+        - `variable` (string) Variable ID
+        - `required` (bool) Whether it is required
+        - `default` (string) Default value
+        - `options` (array[string]) Option values
+    - `file_upload` (object) File upload configuration
+      - `image` (object) Image settings
+        Currently only supports image types: `png`, `jpg`, `jpeg`, `webp`, `gif`
+        - `enabled` (bool) Whether it is enabled
+        - `number_limits` (int) Image number limit, default is 3
+        - `transfer_methods` (array[string]) List of transfer methods, remote_url, local_file, must choose one
+    - `system_parameters` (object) System parameters
+      - `file_size_limit` (int) Document upload size limit (MB)
+      - `image_file_size_limit` (int) Image file upload size limit (MB)
+      - `audio_file_size_limit` (int) Audio file upload size limit (MB)
+      - `video_file_size_limit` (int) Video file upload size limit (MB)
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/parameters" targetCode={` curl -X GET '${props.appDetail.api_base_url}/parameters'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/parameters' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "opening_statement": "Hello!",
+      "suggested_questions_after_answer": {
+          "enabled": true
+      },
+      "speech_to_text": {
+          "enabled": true
+      },
+      "retriever_resource": {
+          "enabled": true
+      },
+      "annotation_reply": {
+          "enabled": true
+      },
+      "user_input_form": [
+          {
+              "paragraph": {
+                  "label": "Query",
+                  "variable": "query",
+                  "required": true,
+                  "default": ""
+              }
+          }
+      ],
+      "file_upload": {
+          "image": {
+              "enabled": false,
+              "number_limits": 3,
+              "detail": "high",
+              "transfer_methods": [
+                  "remote_url",
+                  "local_file"
+              ]
+          }
+      },
+      "system_parameters": {
+          "file_size_limit": 15,
+          "image_file_size_limit": 10,
+          "audio_file_size_limit": 50,
+          "video_file_size_limit": 100
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/meta'
+  method='GET'
+  title='Get Application Meta Information'
+  name='#meta'
+/>
+<Row>
+  <Col>
+  Used to get icons of tools in this application
+
+  ### Response
+  - `tool_icons`(object[string]) tool icons
+    - `tool_name` (string)
+      - `icon` (object|string)
+        - (object) icon object
+          - `background` (string) background color in hex format
+          - `content`(string) emoji
+        - (string) url of icon
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="GET" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/meta' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/meta' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "tool_icons": {
+        "dalle2": "https://cloud.dify.ai/console/api/workspaces/current/tool-provider/builtin/dalle/icon",
+        "api_tool": {
+          "background": "#252525",
+          "content": "\ud83d\ude01"
+        }
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/site'
+  method='GET'
+  title='Get Application WebApp Settings'
+  name='#site'
+/>
+<Row>
+  <Col>
+  Used to get the WebApp settings of the application.
+  ### Response
+  - `title` (string) WebApp name
+  - `chat_color_theme` (string) Chat color theme, in hex format
+  - `chat_color_theme_inverted` (bool) Whether the chat color theme is inverted
+  - `icon_type` (string) Icon type, `emoji` - emoji, `image` - picture
+  - `icon` (string) Icon. If it's `emoji` type, it's an emoji symbol; if it's `image` type, it's an image URL
+  - `icon_background` (string) Background color in hex format
+  - `icon_url` (string) Icon URL
+  - `description` (string) Description
+  - `copyright` (string) Copyright information
+  - `privacy_policy` (string) Privacy policy link
+  - `custom_disclaimer` (string) Custom disclaimer
+  - `default_language` (string) Default language
+  - `show_workflow_steps` (bool) Whether to show workflow details
+  - `use_icon_as_answer_icon` (bool) Whether to replace 馃 in chat with the WebApp icon
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="POST" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/site' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/site' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "title": "My App",
+      "chat_color_theme": "#ff4a4a",
+      "chat_color_theme_inverted": false,
+      "icon_type": "emoji",
+      "icon": "馃槃",
+      "icon_background": "#FFEAD5",
+      "icon_url": null,
+      "description": "This is my app.",
+      "copyright": "all rights reserved",
+      "privacy_policy": "",
+      "custom_disclaimer": "All generated by AI",
+      "default_language": "en-US",
+      "show_workflow_steps": false,
+      "use_icon_as_answer_icon": false,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+___
+
+<Heading
+  url='/apps/annotations'
+  method='GET'
+  title='Get Annotation List'
+  name='#annotation_list'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='page' type='string' key='page'>
+        Page number
+      </Property>
+      <Property name='limit' type='string' key='limit'>
+        Number of items returned, default 20, range 1-100
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/apps/annotations"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/apps/annotations?page=1&limit=20' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/apps/annotations?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "data": [
+        {
+          "id": "69d48372-ad81-4c75-9c46-2ce197b4d402",
+          "question": "What is your name?",
+          "answer": "I am Dify.",
+          "hit_count": 0,
+          "created_at": 1735625869
+        }
+      ],
+      "has_more": false,
+      "limit": 20,
+      "total": 1,
+      "page": 1
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotations'
+  method='POST'
+  title='Create Annotation'
+  name='#create_annotation'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='question' type='string' key='question'>
+        Question
+      </Property>
+      <Property name='answer' type='string' key='answer'>
+        Answer
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/apps/annotations"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/apps/annotations' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"question": "What is your name?","answer": "I am Dify."}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/apps/annotations' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "question": "What is your name?",
+        "answer": "I am Dify."
+    }'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      {
+        "id": "69d48372-ad81-4c75-9c46-2ce197b4d402",
+        "question": "What is your name?",
+        "answer": "I am Dify.",
+        "hit_count": 0,
+        "created_at": 1735625869
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotations/{annotation_id}'
+  method='PUT'
+  title='Update Annotation'
+  name='#update_annotation'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='annotation_id' type='string' key='annotation_id'>
+        Annotation ID
+      </Property>
+      <Property name='question' type='string' key='question'>
+        Question
+      </Property>
+      <Property name='answer' type='string' key='answer'>
+        Answer
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="PUT"
+      label="/apps/annotations/{annotation_id}"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/apps/annotations/{annotation_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"question": "What is your name?","answer": "I am Dify."}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.apiBaseUrl}/apps/annotations/{annotation_id}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "question": "What is your name?",
+        "answer": "I am Dify."
+    }'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      {
+        "id": "69d48372-ad81-4c75-9c46-2ce197b4d402",
+        "question": "What is your name?",
+        "answer": "I am Dify.",
+        "hit_count": 0,
+        "created_at": 1735625869
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotations/{annotation_id}'
+  method='DELETE'
+  title='Delete Annotation'
+  name='#delete_annotation'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='annotation_id' type='string' key='annotation_id'>
+        Annotation ID
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="PUT"
+      label="/apps/annotations/{annotation_id}"
+      targetCode={`curl --location --request DELETE '${props.apiBaseUrl}/apps/annotations/{annotation_id}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request DELETE '${props.apiBaseUrl}/apps/annotations/{annotation_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotation-reply/{action}'
+  method='POST'
+  title='Initial Annotation Reply Settings'
+  name='#initial_annotation_reply_settings'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+      <Property name='action' type='string' key='action'>
+        Action, can only be 'enable' or 'disable'
+      </Property>
+      <Property name='embedding_model_provider' type='string' key='embedding_model_provider'>
+        Specified embedding model provider, must be set up in the system first, corresponding to the provider field(Optional)
+      </Property>
+      <Property name='embedding_model' type='string' key='embedding_model'>
+        Specified embedding model, corresponding to the model field(Optional)
+      </Property>
+      <Property name='score_threshold' type='number' key='score_threshold'>
+        The similarity threshold for matching annotated replies. Only annotations with scores above this threshold will be recalled.
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    The provider and model name of the embedding model can be obtained through the following interface: v1/workspaces/current/models/model-types/text-embedding. For specific instructions, see: Maintain Knowledge Base via API. The Authorization used is the Dataset API Token.
+    <CodeGroup
+      title="Request"
+      tag="POST"
+      label="/apps/annotation-reply/{action}"
+      targetCode={`curl --location --request POST '${props.apiBaseUrl}/apps/annotation-reply/{action}' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{"score_threshold": 0.9, "embedding_provider_name": "zhipu", "embedding_model_name": "embedding_3"}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST 'https://api.dify.ai/v1/apps/annotation-reply/{action}' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "score_threshold": 0.9,
+        "embedding_provider_name": "zhipu",
+        "embedding_model_name": "embedding_3"
+    }'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "job_id": "b15c8f68-1cf4-4877-bf21-ed7cf2011802",
+      "job_status": "waiting"
+    }
+    ```
+    </CodeGroup>
+    This interface is executed asynchronously, so it will return a job_id. You can get the final execution result by querying the job status interface.
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/apps/annotation-reply/{action}/status/{job_id}'
+  method='GET'
+  title='Query Initial Annotation Reply Settings Task Status'
+  name='#initial_annotation_reply_settings_task_status'
+/>
+<Row>
+  <Col>
+    ### Query
+    <Properties>
+    <Property name='action' type='string' key='action'>
+        Action, can only be 'enable' or 'disable', must be the same as the action in the initial annotation reply settings interface
+      </Property>
+      <Property name='job_id' type='string' key='job_id'>
+        Job ID, 
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+    <CodeGroup
+      title="Request"
+      tag="GET"
+      label="/apps/annotations"
+      targetCode={`curl --location --request GET '${props.apiBaseUrl}/apps/annotation-reply/{action}/status/{job_id}' \\\n--header 'Authorization: Bearer {api_key}'`}
+    >
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.apiBaseUrl}/apps/annotation-reply/{action}/status/{job_id}' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "job_id": "b15c8f68-1cf4-4877-bf21-ed7cf2011802",
+      "job_status": "waiting",
+      "error_msg": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
diff --git a/app/components/develop/template/template_chat.ja.mdx b/app/components/develop/template/template_chat.ja.mdx
new file mode 100644
index 0000000..81385ed
--- /dev/null
+++ b/app/components/develop/template/template_chat.ja.mdx
@@ -0,0 +1,1392 @@
+import { CodeGroup } from '../code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty, Paragraph } from '../md.tsx'
+
+# 銉併儯銉冦儓銈€儣銉狝PI
+
+銉併儯銉冦儓銈€儣銉偙銉笺偡銉с兂銇偦銉冦偡銉с兂銇寔缍氭�с倰銈点儩銉笺儓銇椼仸銇娿倞銆佷互鍓嶃伄銉併儯銉冦儓灞ユ銈掑繙绛斻伄銈炽兂銉嗐偔銈广儓銇ㄣ仐銇︿娇鐢ㄣ仹銇嶃伨銇欍�傘亾銈屻伅銆併儊銉c儍銉堛儨銉冦儓銈勩偒銈广偪銉炪兗銈点兗銉撱偣AI銇仼銇仼鐢ㄣ仹銇嶃伨銇欍��
+
+<div>
+  ### 銉欍兗銈筓RL
+  <CodeGroup title="銈炽兗銉�" targetCode={props.appDetail.api_base_url}>
+    ```javascript
+    ```
+  </CodeGroup>
+
+  ### 瑾嶈
+
+  銈点兗銉撱偣API銇痐API-Key`瑾嶈銈掍娇鐢ㄣ仐銇俱仚銆�
+  <i>**API銈兗銇紡娲┿倰闃层亹銇熴倎銆丄PI銈兗銇偗銉┿偆銈€兂銉堝伌銇у叡鏈夈伨銇熴伅淇濆瓨銇涖仛銆併偟銉笺儛銉煎伌銇т繚瀛樸仚銈嬨亾銇ㄣ倰寮枫亸銇婂嫥銈併仐銇俱仚銆�**</i>
+
+  銇欍伖銇︺伄API銉偗銈ㄣ偣銉堛伀銇娿亜銇︺�佷互涓嬨伄銈堛亞銇玚Authorization`HTTP銉樸儍銉�銉笺伀API銈兗銈掑惈銈併仸銇忋仩銇曘亜锛�
+
+  <CodeGroup title="銈炽兗銉�">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+
+    ```
+  </CodeGroup>
+</div>
+
+---
+
+<Heading
+  url='/chat-messages'
+  method='POST'
+  title='銉併儯銉冦儓銉°儍銈汇兗銈搞倰閫佷俊'
+  name='#Send-Chat-Message'
+/>
+<Row>
+  <Col>
+    銉併儯銉冦儓銈€儣銉偙銉笺偡銉с兂銇儶銈偍銈广儓銈掗�佷俊銇椼伨銇欍��
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+
+    <Properties>
+      <Property name='query' type='string' key='query'>
+        銉︺兗銈躲兗鍏ュ姏/璩晱鍐呭
+      </Property>
+      <Property name='inputs' type='object' key='inputs'>
+          銈€儣銉仹瀹氱京銇曘倢銇熴仌銇俱仏銇俱仾澶夋暟鍊ゃ伄鍏ュ姏銈掕ū鍙仐銇俱仚銆�
+          `inputs`銉戙儵銉°兗銈裤伀銇鏁般伄銈兗/鍊ゃ儦銈€亴鍚伨銈屻�佸悇銈兗銇壒瀹氥伄澶夋暟銇蹇溿仐銆佸悇鍊ゃ伅銇濄伄澶夋暟銇壒瀹氥伄鍊ゃ仹銇欍�傘儑銉曘偐銉儓銇痐{}`
+      </Property>
+      <Property name='response_mode' type='string' key='response_mode'>
+        蹇滅瓟銇繑鍗淬儮銉笺儔銈掓寚瀹氥仐銇俱仚銆傘偟銉濄兗銉堛仌銈屻仸銇勩倠銉€兗銉夛細
+        - `streaming` 銈广儓銉兗銉熴兂銈般儮銉笺儔锛堟帹濂級銆丼SE锛圼Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)锛夈倰閫氥仒銇︺偪銈ゃ儣銉┿偆銈裤兗銇倛銇嗐仾鍑哄姏銈掑疅瑁呫仐銇俱仚銆�
+        - `blocking` 銉栥儹銉冦偔銉炽偘銉€兗銉夈�佸疅琛屽畬浜嗗緦銇祼鏋溿倰杩斻仐銇俱仚銆傦紙銉椼儹銈汇偣銇岄暦銇勫牬鍚堛�併儶銈偍銈广儓銇屼腑鏂仌銈屻倠鍙兘鎬с亴銇傘倞銇俱仚锛�
+        Cloudflare銇埗闄愩伀銈堛倞銆�100绉掑緦銇繙绛斻亴銇亜鍫村悎銆併儶銈偍銈广儓銇腑鏂仌銈屻伨銇欍��
+        <i>娉細銈ㄣ兗銈搞偋銉炽儓銈€偡銈广偪銉炽儓銉€兗銉夈仹銇儢銉儍銈兂銈般儮銉笺儔銇偟銉濄兗銉堛仌銈屻仸銇勩伨銇涖倱</i>
+      </Property>
+      <Property name='user' type='string' key='user'>
+          銉︺兗銈躲兗璀樺垾瀛愩�併偍銉炽儔銉︺兗銈躲兗銇偄銈ゃ儑銉炽儐銈c儐銈c倰瀹氱京銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍��
+          銈€儣銉偙銉笺偡銉с兂鍐呫仹闁嬬櫤鑰呫伀銈堛仯銇︿竴鎰忋伀瀹氱京銇曘倢銈嬪繀瑕併亴銇傘倞銇俱仚銆�
+      </Property>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+      浼氳┍ID銆佷互鍓嶃伄銉併儯銉冦儓瑷橀尣銇熀銇ャ亜銇︿細瑭便倰缍氥亼銈嬨伀銇�佸墠銇儭銉冦偦銉笺偢銇甤onversation_id銈掓浮銇欏繀瑕併亴銇傘倞銇俱仚銆�
+      </Property>
+      <Property name='files' type='array[object]' key='files'>
+          銉曘偂銈ゃ儷銉偣銉堛�併儐銈偣銉堛伄鐞嗚В銇ㄨ唱鍟忋伕銇洖绛斻倰绲勩伩鍚堛倧銇涖仧銉曘偂銈ゃ儷锛堢敾鍍忥級銇叆鍔涖伀閬┿仐銇︺亰銈娿�併儮銉囥儷銇屻儞銈搞儳銉虫鑳姐倰銈点儩銉笺儓銇椼仸銇勩倠鍫村悎銇伄銇垮埄鐢ㄥ彲鑳姐仹銇欍��
+          - `type` (string) 銈点儩銉笺儓銇曘倢銇︺亜銈嬨偪銈ゃ儣锛歚image`锛堢従鍦ㄣ伅鐢诲儚銈裤偆銉椼伄銇裤偟銉濄兗銉堬級
+          - `transfer_method` (string) 杌㈤�佹柟娉曘�佺敾鍍廢RL銇牬鍚堛伅`remote_url` / 銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔銇牬鍚堛伅`local_file`
+          - `url` (string) 鐢诲儚URL锛堣虎閫佹柟娉曘亴`remote_url`銇牬鍚堬級
+          - `upload_file_id` (string) 銈€儍銉椼儹銉笺儔銇曘倢銇熴儠銈°偆銉獻D銆佷簨鍓嶃伀銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔API銈掗�氥仒銇﹀彇寰椼仚銈嬪繀瑕併亴銇傘倞銇俱仚锛堣虎閫佹柟娉曘亴`local_file`銇牬鍚堬級
+      </Property>
+      <Property name='auto_generate_name' type='bool' key='auto_generate_name'>
+      銈裤偆銉堛儷銈掕嚜鍕曠敓鎴愩仐銇俱仚銆傘儑銉曘偐銉儓銇痐true`銇с仚銆�
+      `false`銇ō瀹氥仚銈嬨仺銆佷細瑭便伄銉儘銉笺儬API銈掑懠銇冲嚭銇椼�乣auto_generate`銈抈true`銇ō瀹氥仚銈嬨亾銇ㄣ仹闈炲悓鏈熴偪銈ゃ儓銉敓鎴愩倰瀹熺従銇с亶銇俱仚銆�
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+    response_mode銇屻儢銉儍銈兂銈般伄鍫村悎銆丆ompletionResponse銈儢銈搞偋銈儓銈掕繑銇椼伨銇欍��
+    response_mode銇屻偣銉堛儶銉笺儫銉炽偘銇牬鍚堛�丆hunkCompletionResponse銈广儓銉兗銉犮倰杩斻仐銇俱仚銆�
+
+    ### ChatCompletionResponse
+    瀹屽叏銇偄銉椼儶绲愭灉銈掕繑銇椼伨銇欍�俙Content-Type`銇痐application/json`銇с仚銆�
+    - `event` (string) 銈ゃ儥銉炽儓銈裤偆銉椼�佸浐瀹氥仹 `message`
+    - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+    - `id` (string) 銉︺儖銉笺偗ID
+    - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+    - `conversation_id` (string) 浼氳┍ID
+    - `mode` (string) 銈€儣銉儮銉笺儔銆乣chat`銇ㄣ仐銇﹀浐瀹�
+    - `answer` (string) 瀹屽叏銇繙绛斿唴瀹�
+    - `metadata` (object) 銉°偪銉囥兗銈�
+      - `usage` (Usage) 銉€儑銉娇鐢ㄦ儏鍫�
+      - `retriever_resources` (array[RetrieverResource]) 寮曠敤銇ㄥ赴灞炪儶銈广儓
+    - `created_at` (int) 銉°儍銈汇兗銈镐綔鎴愩偪銈ゃ儬銈广偪銉炽儣銆佷緥锛�1705395332
+
+    ### ChunkChatCompletionResponse
+    銈€儣銉伀銈堛仯銇﹀嚭鍔涖仌銈屻仧銈广儓銉兗銉犮儊銉c兂銈倰杩斻仐銇俱仚銆俙Content-Type`銇痐text/event-stream`銇с仚銆�
+    鍚勩偣銉堛儶銉笺儫銉炽偘銉併儯銉炽偗銇痐data:`銇у銇俱倞銆�2銇ゃ伄鏀硅鏂囧瓧`\n\n`銇у尯鍒囥倝銈屻伨銇欍�備互涓嬨伄銈堛亞銇〃绀恒仌銈屻伨銇欙細
+    <CodeGroup>
+    ```streaming {{ title: '蹇滅瓟' }}
+    data: {"event": "message", "task_id": "900bbd43-dc0b-4383-a372-aa6e6c414227", "id": "663c5084-a254-4040-8ad3-51f2a3c1a77c", "answer": "Hi", "created_at": 1705398420}\n\n
+    ```
+    </CodeGroup>
+    銈广儓銉兗銉熴兂銈般儊銉c兂銈伄妲嬮�犮伅`event`銇繙銇樸仸鐣般仾銈娿伨銇欙細
+    - `event: message` LLM銇儐銈偣銉堛儊銉c兂銈偆銉欍兂銉堛倰杩斻仐銇俱仚銆傘仱銇俱倞銆佸畬鍏ㄣ仾銉嗐偔銈广儓銇屻儊銉c兂銈舰寮忋仹鍑哄姏銇曘倢銇俱仚銆�
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `conversation_id` (string) 浼氳┍ID
+      - `answer` (string) LLM銇岃繑銇椼仧銉嗐偔銈广儓銉併儯銉炽偗鍐呭
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: agent_message` LLM銇儐銈偣銉堛儊銉c兂銈偆銉欍兂銉堛倰杩斻仐銇俱仚銆傘仱銇俱倞銆併偍銉笺偢銈с兂銉堛偄銈枫偣銈裤兂銉堛亴鏈夊姽銇牬鍚堛�佸畬鍏ㄣ仾銉嗐偔銈广儓銇屻儊銉c兂銈舰寮忋仹鍑哄姏銇曘倢銇俱仚锛堛偍銉笺偢銈с兂銉堛儮銉笺儔銇с伄銇裤偟銉濄兗銉堬級
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `conversation_id` (string) 浼氳┍ID
+      - `answer` (string) LLM銇岃繑銇椼仧銉嗐偔銈广儓銉併儯銉炽偗鍐呭
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: tts_message` TTS銈兗銉囥偅銈偣銉堛儶銉笺儬銈ゃ儥銉炽儓銆併仱銇俱倞闊冲0鍚堟垚鍑哄姏銆傚唴瀹广伅Mp3褰㈠紡銇偑銉笺儑銈c偑銉栥儹銉冦偗銇с�乥ase64鏂囧瓧鍒椼仺銇椼仸銈ㄣ兂銈炽兗銉夈仌銈屻仸銇勩伨銇欍�傚啀鐢熸檪銇伅銆乥ase64銈掋儑銈炽兗銉夈仐銇︺儣銉兗銉ゃ兗銇叆鍔涖仚銈嬨仩銇戙仹銇欍�傦紙銇撱伄銉°儍銈汇兗銈搞伅鑷嫊鍐嶇敓銇屾湁鍔广仾鍫村悎銇伄銇垮埄鐢ㄥ彲鑳斤級
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄鍋滄蹇滅瓟銈ゃ兂銈裤兗銉曘偋銉笺偣銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `audio` (string) 闊冲0鍚堟垚寰屻伄銈兗銉囥偅銈�乥ase64銉嗐偔銈广儓銈炽兂銉嗐兂銉勩仺銇椼仸銈ㄣ兂銈炽兗銉夈仌銈屻仸銇娿倞銆佸啀鐢熸檪銇伅base64銈掋儑銈炽兗銉夈仐銇︺儣銉兗銉ゃ兗銇叆鍔涖仚銈嬨仩銇戙仹銇�
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: tts_message_end` TTS銈兗銉囥偅銈偣銉堛儶銉笺儬绲備簡銈ゃ儥銉炽儓銆傘亾銇偆銉欍兂銉堛倰鍙椾俊銇欍倠銇ㄣ�併偑銉笺儑銈c偑銈广儓銉兗銉犮伄绲備簡銈掔ず銇椼伨銇欍��
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄鍋滄蹇滅瓟銈ゃ兂銈裤兗銉曘偋銉笺偣銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `audio` (string) 绲備簡銈ゃ儥銉炽儓銇伅銈兗銉囥偅銈亴銇亜銇熴倎銆併亾銈屻伅绌恒伄鏂囧瓧鍒椼仹銇�
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: agent_thought` 銈ㄣ兗銈搞偋銉炽儓銇�濊�冦�丩LM銇�濊�冦�併儎銉笺儷鍛笺伋鍑恒仐銇叆鍔涖仺鍑哄姏銈掑惈銇裤伨銇欙紙銈ㄣ兗銈搞偋銉炽儓銉€兗銉夈仹銇伩銈点儩銉笺儓锛�
+      - `id` (string) 銈ㄣ兗銈搞偋銉炽儓鎬濊�僆D銆佸悇鍙嶅京銇伅涓�鎰忋伄銈ㄣ兗銈搞偋銉炽儓鎬濊�僆D銇屻亗銈娿伨銇�
+      - `task_id` (string)  銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `position` (int) 鐝惧湪銇偍銉笺偢銈с兂銉堟�濊�冦伄浣嶇疆銆佸悇銉°儍銈汇兗銈搞伀銇爢鐣伀瑜囨暟銇�濊�冦亴鍚伨銈屻倠鍫村悎銇屻亗銈娿伨銇欍��
+      - `thought` (string) LLM銇岃�冦亪銇︺亜銈嬨亾銇�
+      - `observation` (string) 銉勩兗銉懠銇冲嚭銇椼亱銈夈伄蹇滅瓟
+      - `tool` (string) 鍛笺伋鍑恒仌銈屻仧銉勩兗銉伄銉偣銉堛��;銇у尯鍒囥倝銈屻伨銇�
+      - `tool_input` (string) 銉勩兗銉伄鍏ュ姏銆丣SON褰㈠紡銆備緥锛歚{"dalle3": {"prompt": "a cute cat"}}`銆�
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+      - `message_files` (array[string]) message_file銈ゃ儥銉炽儓銈掑弬鐓�
+        - `file_id` (string) 銉曘偂銈ゃ儷ID
+      - `conversation_id` (string) 浼氳┍ID
+    - `event: message_file` 銉°儍銈汇兗銈搞儠銈°偆銉偆銉欍兂銉堛�併儎銉笺儷銇倛銇c仸鏂般仐銇勩儠銈°偆銉亴浣滄垚銇曘倢銇俱仐銇�
+      - `id` (string) 銉曘偂銈ゃ儷涓�鎰廔D
+      - `type` (string) 銉曘偂銈ゃ儷銈裤偆銉椼�佺従鍦ㄣ伅"image"銇伩瑷卞彲
+      - `belongs_to` (string) 鎵�灞炪�併亾銇撱仹銇�'assistant'銇伩
+      - `url` (string) 銉曘偂銈ゃ儷銇儶銉€兗銉圲RL
+      - `conversation_id`  (string) 浼氳┍ID
+    - `event: message_end` 銉°儍銈汇兗銈哥祩浜嗐偆銉欍兂銉堛�併亾銇偆銉欍兂銉堛倰鍙椾俊銇欍倠銇ㄣ偣銉堛儶銉笺儫銉炽偘銇岀祩浜嗐仐銇熴亾銇ㄣ倰鎰忓懗銇椼伨銇欍��
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `conversation_id` (string) 浼氳┍ID
+      - `metadata` (object) 銉°偪銉囥兗銈�
+        - `usage` (Usage) 銉€儑銉娇鐢ㄦ儏鍫�
+        - `retriever_resources` (array[RetrieverResource]) 寮曠敤銇ㄥ赴灞炪儶銈广儓
+    - `event: message_replace` 銉°儍銈汇兗銈稿唴瀹圭疆鎻涖偆銉欍兂銉堛��
+      鍑哄姏鍐呭銇儮銉囥儸銉笺偡銉с兂銇屾湁鍔广仾鍫村悎銆佸唴瀹广亴銉曘儵銈般仌銈屻倠銇ㄣ�併亾銇偆銉欍兂銉堛倰閫氥仒銇︺儭銉冦偦銉笺偢鍐呭銇屼簨鍓嶈ō瀹氥仌銈屻仧杩斾俊銇疆銇嶆彌銇堛倝銈屻伨銇欍��
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `conversation_id` (string) 浼氳┍ID
+      - `answer` (string) 缃彌鍐呭锛堛仚銇广仸銇甃LM杩斾俊銉嗐偔銈广儓銈掔洿鎺ョ疆鎻涳級
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: error`
+      銈广儓銉兗銉熴兂銈般儣銉偦銈逛腑銇櫤鐢熴仐銇熶緥澶栥伅銈广儓銉兗銉犮偆銉欍兂銉堛伄褰㈠紡銇у嚭鍔涖仌銈屻�併偍銉┿兗銈ゃ儥銉炽儓銈掑彈淇°仚銈嬨仺銈广儓銉兗銉犮亴绲備簡銇椼伨銇欍��
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `status` (int) HTTP銈广儐銉笺偪銈广偝銉笺儔
+      - `code` (string) 銈ㄣ儵銉笺偝銉笺儔
+      - `message` (string) 銈ㄣ儵銉笺儭銉冦偦銉笺偢
+    - `event: ping` 鎺ョ稓銈掔董鎸併仚銈嬨仧銈併伀10绉掋仈銇ㄣ伀ping銈ゃ儥銉炽儓銇岀櫤鐢熴仐銇俱仚銆�
+
+    ### 銈ㄣ儵銉�
+    - 404, 浼氳┍銇屽瓨鍦ㄣ仐銇俱仜銈�
+    - 400, `invalid_param`, 鐣板父銇儜銉┿儭銉笺偪鍏ュ姏
+    - 400, `app_unavailable`, 銈€儣銉鎴愩亴鍒╃敤銇с亶銇俱仜銈�
+    - 400, `provider_not_initialize`, 鍒╃敤鍙兘銇儮銉囥儷璩囨牸鎯呭牨妲嬫垚銇屻亗銈娿伨銇涖倱
+    - 400, `provider_quota_exceeded`, 銉€儑銉懠銇冲嚭銇椼偗銈┿兗銈裤亴涓嶈冻銇椼仸銇勩伨銇�
+    - 400, `model_currently_not_support`, 鐝惧湪銇儮銉囥儷銇埄鐢ㄣ仹銇嶃伨銇涖倱
+    - 400, `completion_request_error`, 銉嗐偔銈广儓鐢熸垚銇け鏁椼仐銇俱仐銇�
+    - 500, 鍐呴儴銈点兗銉愩兗銈ㄣ儵銉�
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/chat-messages" targetCode={`curl -X POST '${props.appDetail.api_base_url}/chat-messages' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "inputs": ${JSON.stringify(props.inputs)},\n    "query": "What are the specs of the iPhone 13 Pro Max?",\n    "response_mode": "streaming",\n    "conversation_id": "",\n    "user": "abc-123",\n    "files": [\n      {\n        "type": "image",\n        "transfer_method": "remote_url",\n        "url": "https://cloud.dify.ai/logo/logo-site.png"\n      }\n    ]\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/chat-messages' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "inputs": {},
+        "query": "eh",
+        "response_mode": "streaming",
+        "conversation_id": "1c7e55fb-1ba2-4e10-81b5-30addcea2276",
+        "user": "abc-123"
+    }'
+    ```
+    </CodeGroup>
+    ### 銉栥儹銉冦偔銉炽偘銉€兗銉�
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+        "event": "message",
+        "task_id": "c3800678-a077-43df-a102-53f23ed20b88", 
+        "id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "message_id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2",
+        "mode": "chat",
+        "answer": "iPhone 13 Pro Max銇粫妲樸伅娆°伄銇ㄣ亰銈娿仹銇�:...",
+        "metadata": {
+            "usage": {
+                "prompt_tokens": 1033,
+                "prompt_unit_price": "0.001",
+                "prompt_price_unit": "0.001",
+                "prompt_price": "0.0010330",
+                "completion_tokens": 128,
+                "completion_unit_price": "0.002",
+                "completion_price_unit": "0.001",
+                "completion_price": "0.0002560",
+                "total_tokens": 1161,
+                "total_price": "0.0012890",
+                "currency": "USD",
+                "latency": 0.7682376249867957
+            },
+            "retriever_resources": [
+                {
+                    "position": 1,
+                    "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb",
+                    "dataset_name": "iPhone",
+                    "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00",
+                    "document_name": "iPhone List",
+                    "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a",
+                    "score": 0.98457545,
+                    "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""
+                }
+            ]
+        },
+        "created_at": 1705407629
+    }
+    ```
+    </CodeGroup>
+    ### 銈广儓銉兗銉熴兂銈般儮銉笺儔锛堝熀鏈偄銈枫偣銈裤兂銉堬級
+    <CodeGroup title="蹇滅瓟">
+    ```streaming {{ title: '蹇滅瓟' }}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " I", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": "'m", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " glad", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " to", "created_at": 1679586595}
+      data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " meet", "created_at": 1679586595}
+      data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " you", "created_at": 1679586595}
+      data: {"event": "message_end", "id": "5e52ce04-874b-4d27-9045-b3bc80def685", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "metadata": {"usage": {"prompt_tokens": 1033, "prompt_unit_price": "0.001", "prompt_price_unit": "0.001", "prompt_price": "0.0010330", "completion_tokens": 135, "completion_unit_price": "0.002", "completion_price_unit": "0.001", "completion_price": "0.0002700", "total_tokens": 1168, "total_price": "0.0013030", "currency": "USD", "latency": 1.381760165997548}, "retriever_resources": [{"position": 1, "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb", "dataset_name": "iPhone", "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00", "document_name": "iPhone List", "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a", "score": 0.98457545, "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""}]}}
+      data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+      data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+    ```
+    </CodeGroup>
+    ### 蹇滅瓟渚嬶紙銈ㄣ兗銈搞偋銉炽儓銈€偡銈广偪銉炽儓锛�
+    <CodeGroup title="蹇滅瓟">
+    ```streaming {{ title: '蹇滅瓟' }}
+    data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " I", "created_at": 1679586595}
+    data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": "'m", "created_at": 1679586595}
+    data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " glad", "created_at": 1679586595}
+    data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " to", "created_at": 1679586595}
+    data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " meet", "created_at": 1679586595}
+    data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " you", "created_at": 1679586595}
+    data: {"event": "message_end", "id": "5e52ce04-874b-4d27-9045-b3bc80def685", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "metadata": {"usage": {"prompt_tokens": 1033, "prompt_unit_price": "0.001", "prompt_price_unit": "0.001", "prompt_price": "0.0010330", "completion_tokens": 135, "completion_unit_price": "0.002", "completion_price_unit": "0.001", "completion_price": "0.0002700", "total_tokens": 1168, "total_price": "0.0013030", "currency": "USD", "latency": 1.381760165997548}, "retriever_resources": [{"position": 1, "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb", "dataset_name": "iPhone", "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00", "document_name": "iPhone List", "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a", "score": 0.98457545, "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""}]}}
+    data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+    data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+  ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/files/upload'
+  method='POST'
+  title='銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔'
+  name='#file-upload'
+/>
+<Row>
+  <Col>
+  銉°儍銈汇兗銈搁�佷俊鏅傘伀浣跨敤銇欍倠銇熴倎銇儠銈°偆銉倰銈€儍銉椼儹銉笺儔銇椼伨銇欙紙鐝惧湪銇敾鍍忋伄銇裤偟銉濄兗銉堬級銆傜敾鍍忋仺銉嗐偔銈广儓銇優銉儊銉€兗銉�銉悊瑙c倰鍙兘銇仐銇俱仚銆�
+  png銆乯pg銆乯peg銆亀ebp銆乬if褰㈠紡銈掋偟銉濄兗銉堛仐銇︺亜銇俱仚銆�
+  銈€儍銉椼儹銉笺儔銇曘倢銇熴儠銈°偆銉伅鐝惧湪銇偍銉炽儔銉︺兗銈躲兗銇伩銇屼娇鐢ㄣ仹銇嶃伨銇欍��
+
+  ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+  銇撱伄銈ゃ兂銈裤兗銉曘偋銉笺偣銇痐multipart/form-data`銉偗銈ㄣ偣銉堛倰蹇呰銇ㄣ仐銇俱仚銆�
+  - `file` (File) 蹇呴爤
+    銈€儍銉椼儹銉笺儔銇欍倠銉曘偂銈ゃ儷銆�
+  - `user` (string) 蹇呴爤
+    銉︺兗銈躲兗璀樺垾瀛愩�侀枊鐧鸿�呫伄銉兗銉仹瀹氱京銇曘倢銆併偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇亼銈屻伆銇倞銇俱仜銈撱��
+
+  ### 蹇滅瓟
+  銈€儍銉椼儹銉笺儔銇屾垚鍔熴仚銈嬨仺銆併偟銉笺儛銉笺伅銉曘偂銈ゃ儷銇甀D銇ㄩ枹閫f儏鍫便倰杩斻仐銇俱仚銆�
+  - `id` (uuid) ID
+  - `name` (string) 銉曘偂銈ゃ儷鍚�
+  - `size` (int) 銉曘偂銈ゃ儷銈点偆銈猴紙銉愩偆銉堬級
+  - `extension` (string) 銉曘偂銈ゃ儷鎷″嫉瀛�
+  - `mime_type` (string) 銉曘偂銈ゃ儷銇甅IME銈裤偆銉�
+  - `created_by` (uuid) 銈ㄣ兂銉夈儲銉笺偠銉糏D
+  - `created_at` (timestamp) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+
+  ### 銈ㄣ儵銉�
+  - 400, `no_file_uploaded`, 銉曘偂銈ゃ儷銇屾彁渚涖仌銈屻仾銇戙倢銇般仾銈娿伨銇涖倱
+  - 400, `too_many_files`, 鐝惧湪銇�1銇ゃ伄銉曘偂銈ゃ儷銇伩鍙椼亼浠樸亼銇俱仚
+  - 400, `unsupported_preview`, 銉曘偂銈ゃ儷銇儣銉儞銉ャ兗銈掋偟銉濄兗銉堛仐銇︺亜銇俱仜銈�
+  - 400, `unsupported_estimate`, 銉曘偂銈ゃ儷銇帹瀹氥倰銈点儩銉笺儓銇椼仸銇勩伨銇涖倱
+  - 413, `file_too_large`, 銉曘偂銈ゃ儷銇屽ぇ銇嶃仚銇庛伨銇�
+  - 415, `unsupported_file_type`, 銈点儩銉笺儓銇曘倢銇︺亜銇亜鎷″嫉瀛愩�佺従鍦ㄣ伅銉夈偔銉ャ儭銉炽儓銉曘偂銈ゃ儷銇伩鍙椼亼浠樸亼銇俱仚
+  - 503, `s3_connection_failed`, S3銈点兗銉撱偣銇帴缍氥仹銇嶃伨銇涖倱
+  - 503, `s3_permission_denied`, S3銇儠銈°偆銉倰銈€儍銉椼儹銉笺儔銇欍倠妯╅檺銇屻亗銈娿伨銇涖倱
+  - 503, `s3_file_too_large`, 銉曘偂銈ゃ儷銇孲3銇偟銈ゃ偤鍒堕檺銈掕秴銇堛仸銇勩伨銇�
+  - 500, 鍐呴儴銈点兗銉愩兗銈ㄣ儵銉�
+
+
+  </Col>
+  <Col sticky>
+  ### 銉偗銈ㄣ偣銉堜緥
+  <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/files/upload" targetCode={`curl -X POST '${props.appDetail.api_base_url}/files/upload' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=image/[png|jpeg|jpg|webp|gif] \\\n--form 'user=abc-123'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/files/upload' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@"/path/to/file"'
+    ```
+
+    </CodeGroup>
+
+
+  ### 蹇滅瓟渚�
+  <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "id": "72fa9618-8f89-4a37-9b33-7e1178a24a67",
+      "name": "example.png",
+      "size": 1024,
+      "extension": "png",
+      "mime_type": "image/png",
+      "created_by": "6ad1ab0a-73ff-4ac1-b9e4-cdb312f71f13",
+      "created_at": 1577836800,
+    }
+  ```
+  </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/chat-messages/:task_id/stop'
+  method='POST'
+  title='鐢熸垚鍋滄'
+  name='#stop-generatebacks'
+/>
+<Row>
+  <Col>
+  銈广儓銉兗銉熴兂銈般儮銉笺儔銇с伄銇裤偟銉濄兗銉堛仌銈屻仸銇勩伨銇欍��
+  ### 銉戙偣
+  - `task_id` (string) 銈裤偣銈疘D銆併偣銉堛儶銉笺儫銉炽偘銉併儯銉炽偗銇繑銈婂�ゃ亱銈夊彇寰椼仹銇嶃伨銇�
+  ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+  - `user` (string) 蹇呴爤
+    銉︺兗銈躲兗璀樺垾瀛愩�併偍銉炽儔銉︺兗銈躲兗銇偄銈ゃ儑銉炽儐銈c儐銈c倰瀹氱京銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻�併儭銉冦偦銉笺偢閫佷俊銈ゃ兂銈裤兗銉曘偋銉笺偣銇ф浮銇曘倢銇熴儲銉笺偠銉笺仺涓�鑷淬仐銇︺亜銈嬪繀瑕併亴銇傘倞銇俱仚銆�
+  ### 蹇滅瓟
+  - `result` (string) 甯搞伀"success"銈掕繑銇椼伨銇�
+  </Col>
+  <Col sticky>
+  ### 銉偗銈ㄣ偣銉堜緥
+  <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/chat-messages/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/chat-messages/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/chat-messages/:task_id/stop' \
+    -H 'Authorization: Bearer {api_key}' \
+    -H 'Content-Type: application/json' \
+    --data-raw '{
+        "user": "abc-123"
+    }'
+    ```
+    </CodeGroup>
+
+    ### 蹇滅瓟渚�
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/messages/:message_id/feedbacks'
+  method='POST'
+  title='銉°儍銈汇兗銈搞儠銈c兗銉夈儛銉冦偗'
+  name='#feedbacks'
+/>
+<Row>
+  <Col>
+    銈ㄣ兂銉夈儲銉笺偠銉笺伅銉曘偅銉笺儔銉愩儍銈儭銉冦偦銉笺偢銈掓彁渚涖仹銇嶃�併偄銉椼儶銈便兗銈枫儳銉抽枊鐧鸿�呫亴鏈熷緟銇曘倢銈嬪嚭鍔涖倰鏈�閬╁寲銇欍倠銇伀褰圭珛銇°伨銇欍��
+
+    ### 銉戙偣
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+       銉°儍銈汇兗銈窱D
+      </Property>
+    </Properties>
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+
+    <Properties>
+      <Property name='rating' type='string' key='rating'>
+        銈€儍銉椼儨銉笺儓銇痐like`銆併儉銈︺兂銉溿兗銉堛伅`dislike`銆併偄銉冦儣銉溿兗銉堛伄鍙栥倞娑堛仐銇痐null`
+      </Property>
+      <Property name='user' type='string' key='user'>
+        銉︺兗銈躲兗璀樺垾瀛愩�侀枊鐧鸿�呫伄銉兗銉仹瀹氱京銇曘倢銆併偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇亼銈屻伆銇倞銇俱仜銈撱��
+      </Property>
+      <Property name='content' type='string' key='content'>
+        銉°儍銈汇兗銈搞伄銉曘偅銉笺儔銉愩儍銈仹銇欍��
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+    - `result` (string) 甯搞伀"success"銈掕繑銇椼伨銇�
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/messages/:message_id/feedbacks" targetCode={`curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks \\\n --header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "rating": "like",\n    "user": "abc-123",\n    "content": "message feedback information"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "rating": "like",
+        "user": "abc-123",
+        "content": "message feedback information"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/app/feedbacks'
+  method='GET'
+  title='銈€儣銉伄銉°儍銈汇兗銈搞伄銆屻亜銇勩伃銆嶃仺銉曘偅銉笺儔銉愩儍銈倰鍙栧緱'
+  name='#app-feedbacks'
+/>
+<Row>
+  <Col>
+    銈€儣銉伄銈ㄣ兂銉夈儲銉笺偠銉笺亱銈夈伄銉曘偅銉笺儔銉愩儍銈倓銆屻亜銇勩伃銆嶃倰鍙栧緱銇椼伨銇欍��
+
+    ### 銈偍銉�
+    <Properties>
+      <Property name='page' type='string' key='page'>
+       锛堜换鎰忥級銉氥兗銈哥暘鍙枫�傘儑銉曘偐銉儓鍊わ細1
+      </Property>
+    </Properties>
+
+    <Properties>
+      <Property name='limit' type='string' key='limit'>
+       锛堜换鎰忥級1銉氥兗銈搞亗銇熴倞銇欢鏁般�傘儑銉曘偐銉儓鍊わ細20
+      </Property>
+    </Properties>
+
+    ### 銉偣銉濄兂銈�
+    - `data` (銉偣銉�) 銇撱伄銈€儣銉伄銆屻亜銇勩伃銆嶃仺銉曘偅銉笺儔銉愩儍銈伄涓�瑕с倰杩斻仐銇俱仚銆�
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/app/feedbacks" targetCode={`curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+        {
+        "data": [
+            {
+                "id": "8c0fbed8-e2f9-49ff-9f0e-15a35bdd0e25",
+                "app_id": "f252d396-fe48-450e-94ec-e184218e7346",
+                "conversation_id": "2397604b-9deb-430e-b285-4726e51fd62d",
+                "message_id": "709c0b0f-0a96-4a4e-91a4-ec0889937b11",
+                "rating": "like",
+                "content": "message feedback information-3",
+                "from_source": "user",
+                "from_end_user_id": "74286412-9a1a-42c1-929c-01edb1d381d5",
+                "from_account_id": null,
+                "created_at": "2025-04-24T09:24:38",
+                "updated_at": "2025-04-24T09:24:38"
+            }
+        ]
+        }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+
+<Heading
+  url='/messages/{message_id}/suggested'
+  method='GET'
+  title='娆°伄鎺ㄥエ璩晱'
+  name='#suggested'
+/>
+<Row>
+  <Col>
+    鐝惧湪銇儭銉冦偦銉笺偢銇銇欍倠娆°伄璩晱銇彁妗堛倰鍙栧緱銇椼伨銇�
+
+    ### 銉戙偣銉戙儵銉°兗銈�
+
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+        銉°儍銈汇兗銈窱D
+      </Property>
+    </Properties>
+
+    ### 銈偍銉�
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        銉︺兗銈躲兗璀樺垾瀛愩�併偍銉炽儔銉︺兗銈躲兗銇偄銈ゃ儑銉炽儐銈c儐銈c倰瀹氱京銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻�佺当瑷堛伄銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍��
+        銈€儣銉偙銉笺偡銉с兂鍐呫仹闁嬬櫤鑰呫伀銈堛仯銇︿竴鎰忋伀瀹氱京銇曘倢銈嬪繀瑕併亴銇傘倞銇俱仚銆�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="GET" label="/messages/{message_id}/suggested" targetCode={`curl --location --request GET '${props.appDetail.api_base_url}/messages/{message_id}/suggested?user=abc-123& \\\n--header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \\\n--header 'Content-Type: application/json'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.appDetail.api_base_url}/messages/{message_id}/suggested' \
+    --header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \
+    --header 'Content-Type: application/json' \
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "result": "success",
+      "data": [
+            "a",
+            "b",
+            "c"
+        ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/messages'
+  method='GET'
+  title='浼氳┍灞ユ銉°儍銈汇兗銈搞倰鍙栧緱'
+  name='#messages'
+/>
+<Row>
+  <Col>
+    銈广偗銉兗銉儹銉笺儔褰㈠紡銇ч亷鍘汇伄銉併儯銉冦儓瑷橀尣銈掕繑銇椼�佹渶鍒濄伄銉氥兗銈搞伅鏈�鏂般伄`{limit}`銉°儍銈汇兗銈搞倰杩斻仐銇俱仚銆傘仱銇俱倞銆侀�嗛爢銇с仚銆�
+
+    ### 銈偍銉�
+
+    <Properties>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+        浼氳┍ID
+      </Property>
+      <Property name='user' type='string' key='user'>
+        銉︺兗銈躲兗璀樺垾瀛愩�併偍銉炽儔銉︺兗銈躲兗銇偄銈ゃ儑銉炽儐銈c儐銈c倰瀹氱京銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻�佺当瑷堛伄銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍��
+        銈€儣銉偙銉笺偡銉с兂鍐呫仹闁嬬櫤鑰呫伀銈堛仯銇︿竴鎰忋伀瀹氱京銇曘倢銈嬪繀瑕併亴銇傘倞銇俱仚銆�
+      </Property>
+      <Property name='first_id' type='string' key='first_id'>
+          鐝惧湪銇儦銉笺偢銇渶鍒濄伄銉併儯銉冦儓瑷橀尣銇甀D銆併儑銉曘偐銉儓銇痭ull銇с仚銆�
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+          1鍥炪伄銉偗銈ㄣ偣銉堛仹杩斻仚銉併儯銉冦儓灞ユ銉°儍銈汇兗銈搞伄鏁般�併儑銉曘偐銉儓銇�20銇с仚銆�
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+    - `data` (array[object]) 銉°儍銈汇兗銈搞儶銈广儓
+    - `id` (string) 銉°儍銈汇兗銈窱D
+    - `conversation_id` (string) 浼氳┍ID
+    - `inputs` (object) 銉︺兗銈躲兗鍏ュ姏銉戙儵銉°兗銈裤��
+    - `query` (string) 銉︺兗銈躲兗鍏ュ姏/璩晱鍐呭銆�
+    - `message_files` (array[object]) 銉°儍銈汇兗銈搞儠銈°偆銉�
+      - `id` (string) ID
+      - `type` (string) 銉曘偂銈ゃ儷銈裤偆銉椼�佺敾鍍忋伄鍫村悎銇痠mage
+      - `url` (string) 銉椼儸銉撱儱銉肩敾鍍廢RL
+      - `belongs_to` (string) 鎵�灞炪�併儲銉笺偠銉笺伨銇熴伅銈€偡銈广偪銉炽儓
+    - `agent_thoughts` (array[object]) 銈ㄣ兗銈搞偋銉炽儓銇�濊�冿紙鍩烘湰銈€偡銈广偪銉炽儓銇牬鍚堛伅绌猴級
+      - `id` (string) 銈ㄣ兗銈搞偋銉炽儓鎬濊�僆D銆佸悇鍙嶅京銇伅涓�鎰忋伄銈ㄣ兗銈搞偋銉炽儓鎬濊�僆D銇屻亗銈娿伨銇�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `position` (int) 鐝惧湪銇偍銉笺偢銈с兂銉堟�濊�冦伄浣嶇疆銆佸悇銉°儍銈汇兗銈搞伀銇爢鐣伀瑜囨暟銇�濊�冦亴鍚伨銈屻倠鍫村悎銇屻亗銈娿伨銇欍��
+      - `thought` (string) LLM銇岃�冦亪銇︺亜銈嬨亾銇�
+      - `observation` (string) 銉勩兗銉懠銇冲嚭銇椼亱銈夈伄蹇滅瓟
+      - `tool` (string) 鍛笺伋鍑恒仌銈屻仧銉勩兗銉伄銉偣銉堛��;銇у尯鍒囥倝銈屻伨銇�
+      - `tool_input` (string) 銉勩兗銉伄鍏ュ姏銆丣SON褰㈠紡銆備緥锛歚{"dalle3": {"prompt": "a cute cat"}}`銆�
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+      - `message_files` (array[string]) message_file銈ゃ儥銉炽儓銈掑弬鐓�
+        - `file_id` (string) 銉曘偂銈ゃ儷ID
+    - `answer` (string) 蹇滅瓟銉°儍銈汇兗銈稿唴瀹�
+    - `created_at` (timestamp) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `feedback` (object) 銉曘偅銉笺儔銉愩儍銈儏鍫�
+      - `rating` (string) 銈€儍銉椼儨銉笺儓銇痐like` / 銉�銈︺兂銉溿兗銉堛伅`dislike`
+    - `retriever_resources` (array[RetrieverResource]) 寮曠敤銇ㄥ赴灞炪儶銈广儓
+  - `has_more` (bool) 娆°伄銉氥兗銈搞亴銇傘倠銇嬨仼銇嗐亱
+  - `limit` (int) 杩斻仌銈屻仧銈€偆銉嗐儬銇暟銆佸叆鍔涖亴銈枫偣銉嗐儬鍒堕檺銈掕秴銇堛倠鍫村悎銆併偡銈广儐銉犲埗闄愩伄鏁般倰杩斻仐銇俱仚
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="GET" label="/messages" targetCode={`curl -X GET '${props.appDetail.api_base_url}/messages?user=abc-123&conversation_id='\\\n --header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/messages?user=abc-123&conversation_id='
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+    ### 蹇滅瓟渚嬶紙鍩烘湰銈€偡銈广偪銉炽儓锛�
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "limit": 20,
+      "has_more": false,
+      "data": [
+        {
+            "id": "a076a87f-31e5-48dc-b452-0061adbbc922",
+            "conversation_id": "cd78daf6-f9e4-4463-9ff2-54257230a0ce",
+            "inputs": {
+                "name": "dify"
+            },
+            "query": "iphone 13 pro",
+            "answer": "iPhone 13 Pro銇�2021骞�9鏈�24鏃ャ伀鐧哄2銇曘倢銆�6.1銈ゃ兂銉併伄銉囥偅銈广儣銉偆銇�1170 x 2532銇В鍍忓害銈掑倷銇堛仸銇勩伨銇欍�侶exa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)銉椼儹銈汇儍銈点��6 GB銇甊AM銈掓惌杓夈仐銆�128 GB銆�256 GB銆�512 GB銆�1 TB銇偣銉堛儸銉笺偢銈儣銈枫儳銉炽倰鎻愪緵銇椼伨銇欍�傘偒銉°儵銇�12 MP銆併儛銉冦儐銉兗瀹归噺銇�3095 mAh銇с�乮OS 15銈掓惌杓夈仐銇︺亜銇俱仚銆�",
+            "message_files": [],
+            "feedback": null,
+            "retriever_resources": [
+                {
+                    "position": 1,
+                    "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb",
+                    "dataset_name": "iPhone",
+                    "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00",
+                    "document_name": "iPhone List",
+                    "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a",
+                    "score": 0.98457545,
+                    "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""
+                }
+            ],
+            "agent_thoughts": [],
+            "created_at": 1705569239,
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+
+    ### 蹇滅瓟渚嬶紙銈ㄣ兗銈搞偋銉炽儓銈€偡銈广偪銉炽儓锛�
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+        "limit": 20,
+        "has_more": false,
+        "data": [
+            {
+                "id": "d35e006c-7c4d-458f-9142-be4930abdf94",
+                "conversation_id": "957c068b-f258-4f89-ba10-6e8a0361c457",
+                "inputs": {},
+                "query": "draw a cat",
+                "answer": "鐚伄鐢诲儚銈掔敓鎴愩仐銇俱仐銇熴�傘儭銉冦偦銉笺偢銈掔⒑瑾嶃仐銇︾敾鍍忋倰琛ㄧず銇椼仸銇忋仩銇曘亜銆�",
+                "message_files": [
+                    {
+                        "id": "976990d2-5294-47e6-8f14-7356ba9d2d76",
+                        "type": "image",
+                        "url": "http://127.0.0.1:5001/files/tools/976990d2-5294-47e6-8f14-7356ba9d2d76.png?timestamp=1705988524&nonce=55df3f9f7311a9acd91bf074cd524092&sign=z43nMSO1L2HBvoqADLkRxr7Biz0fkjeDstnJiCK1zh8=",
+                        "belongs_to": "assistant"
+                    }
+                ],
+                "feedback": null,
+                "retriever_resources": [],
+                "created_at": 1705988187,
+                "agent_thoughts": [
+                    {
+                        "id": "592c84cf-07ee-441c-9dcc-ffc66c033469",
+                        "chain_id": null,
+                        "message_id": "d35e006c-7c4d-458f-9142-be4930abdf94",
+                        "position": 1,
+                        "thought": "",
+                        "tool": "dalle2",
+                        "tool_input": "{\"dalle2\": {\"prompt\": \"cat\"}}",
+                        "created_at": 1705988186,
+                        "observation": "鐢诲儚銇仚銇с伀浣滄垚銇曘倢銆併儲銉笺偠銉笺伀閫佷俊銇曘倢銇俱仐銇熴�備粖銇欍亹銉︺兗銈躲兗銇⒑瑾嶃仚銈嬨倛銇嗐伀浼濄亪銇︺亸銇犮仌銇勩��",
+                        "files": [
+                            "976990d2-5294-47e6-8f14-7356ba9d2d76"
+                        ]
+                    },
+                    {
+                        "id": "73ead60d-2370-4780-b5ed-532d2762b0e5",
+                        "chain_id": null,
+                        "message_id": "d35e006c-7c4d-458f-9142-be4930abdf94",
+                        "position": 2,
+                        "thought": "鐚伄鐢诲儚銈掔敓鎴愩仐銇俱仐銇熴�傘儭銉冦偦銉笺偢銈掔⒑瑾嶃仐銇︾敾鍍忋倰琛ㄧず銇椼仸銇忋仩銇曘亜銆�",
+                        "tool": "",
+                        "tool_input": "",
+                        "created_at": 1705988199,
+                        "observation": "",
+                        "files": []
+                    }
+                ]
+            }
+        ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations'
+  method='GET'
+  title='浼氳┍銈掑彇寰�'
+  name='#conversations'
+/>
+<Row>
+  <Col>
+    鐝惧湪銇儲銉笺偠銉笺伄浼氳┍銉偣銉堛倰鍙栧緱銇椼�併儑銉曘偐銉儓銇ф渶鏂般伄20浠躲倰杩斻仐銇俱仚銆�
+
+    ### 銈偍銉�
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+          銉︺兗銈躲兗璀樺垾瀛愩�併偍銉炽儔銉︺兗銈躲兗銇偄銈ゃ儑銉炽儐銈c儐銈c倰瀹氱京銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻�佺当瑷堛伄銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍��
+          銈€儣銉偙銉笺偡銉с兂鍐呫仹闁嬬櫤鑰呫伀銈堛仯銇︿竴鎰忋伀瀹氱京銇曘倢銈嬪繀瑕併亴銇傘倞銇俱仚銆�
+      </Property>
+      <Property name='last_id' type='string' key='last_id'>
+          (Optional)鐝惧湪銇儦銉笺偢銇渶寰屻伄銉偝銉笺儔銇甀D銆併儑銉曘偐銉儓銇痭ull銇с仚銆�
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+          (Optional)1鍥炪伄銉偗銈ㄣ偣銉堛仹杩斻仚銉偝銉笺儔銇暟銆併儑銉曘偐銉儓銇渶鏂般伄20浠躲仹銇欍�傛渶澶�100銆佹渶灏�1銆�
+      </Property>
+      <Property name='sort_by' type='string' key='sort_by'>
+        (Optional)銈姐兗銉堛儠銈c兗銉儔銆併儑銉曘偐銉儓锛�-updated_at锛堟洿鏂版檪闁撱仹闄嶉爢銇偨銉笺儓锛�
+        - 鍒╃敤鍙兘銇�わ細created_at, -created_at, updated_at, -updated_at
+        - 銉曘偅銉笺儷銉夈伄鍓嶃伄瑷樺彿銇爢搴忋伨銇熴伅閫嗛爢銈掕〃銇椼��"-"銇�嗛爢銈掕〃銇椼伨銇欍��
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+    - `data` (array[object]) 浼氳┍銇儶銈广儓
+      - `id` (string) 浼氳┍ID
+      - `name` (string) 浼氳┍鍚嶃�併儑銉曘偐銉儓銇с伅銆併儲銉笺偠銉笺亴浼氳┍銇ф渶鍒濄伀灏嬨伃銇熻唱鍟忋伄銈广儖銉氥儍銉堛仹銇欍��
+      - `inputs` (object) 銉︺兗銈躲兗鍏ュ姏銉戙儵銉°兗銈裤��
+      - `introduction` (string) 绱逛粙
+      - `created_at` (timestamp) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+      - `updated_at` (timestamp) 鏇存柊銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `has_more` (bool)
+    - `limit` (int) 杩斻仌銈屻仧銈ㄣ兂銉堛儶銇暟銆佸叆鍔涖亴銈枫偣銉嗐儬鍒堕檺銈掕秴銇堛倠鍫村悎銆併偡銈广儐銉犲埗闄愩伄鏁般倰杩斻仐銇俱仚
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="GET" label="/conversations" targetCode={`curl -X GET '${props.appDetail.api_base_url}/conversations?user=abc-123&last_id=&limit=20' \\\n --header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations?user=abc-123&last_id=&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "limit": 20,
+      "has_more": false,
+      "data": [
+        {
+          "id": "10799fb8-64f7-4296-bbf7-b42bfbe0ae54",
+          "name": "鏂般仐銇勩儊銉c儍銉�",
+          "inputs": {
+              "book": "book",
+              "myName": "Lucy"
+          },
+          "status": "normal",
+          "created_at": 1679667915,
+          "updated_at": 1679667915
+        },
+        {
+          "id": "hSIhXBhNe8X1d8Et"
+          // ...
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations/:conversation_id'
+  method='DELETE'
+  title='浼氳┍銈掑墛闄�'
+  name='#delete'
+/>
+<Row>
+  <Col>
+    浼氳┍銈掑墛闄ゃ仐銇俱仚銆�
+
+    ### 銉戙偣
+    - `conversation_id` (string) 浼氳┍ID
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        銉︺兗銈躲兗璀樺垾瀛愩�侀枊鐧鸿�呫伀銈堛仯銇﹀畾缇┿仌銈屻�併偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇傘倠蹇呰銇屻亗銈娿伨銇欍��
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+    - `result` (string) 甯搞伀"success"銈掕繑銇椼伨銇�
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="DELETE" label="/conversations/:conversation_id" targetCode={`curl -X DELETE '${props.appDetail.api_base_url}/conversations/:conversation_id' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+        curl -X DELETE '${props.appDetail.api_base_url}/conversations/{conversation_id}' \
+        --header 'Content-Type: application/json' \
+        --header 'Accept: application/json' \
+        --header 'Authorization: Bearer {api_key}' \
+        --data '{
+            "user": "abc-123"
+        }'
+      ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```text {{ title: '蹇滅瓟' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/conversations/:conversation_id/name'
+  method='POST'
+  title='浼氳┍銇悕鍓嶃倰澶夋洿'
+  name='#rename'
+/>
+<Row>
+  <Col>
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+    銈汇儍銈枫儳銉炽伄鍚嶅墠銈掑鏇淬仐銇俱仚銆傘偦銉冦偡銉с兂鍚嶃伅銆佽鏁般伄銈汇儍銈枫儳銉炽倰銈点儩銉笺儓銇欍倠銈儵銈ゃ偄銉炽儓銇с伄琛ㄧず銇娇鐢ㄣ仌銈屻伨銇欍��
+
+    ### 銉戙偣
+    - `conversation_id` (string) 浼氳┍ID
+
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        (Optional)浼氳┍銇悕鍓嶃�傘亾銇儜銉┿儭銉笺偪銇�乣auto_generate`銇宍true`銇ō瀹氥仌銈屻仸銇勩倠鍫村悎銆佺渷鐣ャ仹銇嶃伨銇欍��
+      </Property>
+      <Property name='auto_generate' type='bool' key='auto_generate'>
+        (Optional)銈裤偆銉堛儷銈掕嚜鍕曠敓鎴愩仐銇俱仚銆傘儑銉曘偐銉儓銇痐false`銇с仚銆�
+      </Property>
+      <Property name='user' type='string' key='user'>
+        銉︺兗銈躲兗璀樺垾瀛愩�侀枊鐧鸿�呫伀銈堛仯銇﹀畾缇┿仌銈屻�併偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇傘倠蹇呰銇屻亗銈娿伨銇欍��
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+    - `id` (string) 浼氳┍ID
+    - `name` (string) 浼氳┍鍚�
+    - `inputs` (object) 銉︺兗銈躲兗鍏ュ姏銉戙儵銉°兗銈�
+    - `status` (string) 浼氳┍鐘舵厠
+    - `introduction` (string) 绱逛粙
+    - `created_at` (timestamp) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `updated_at` (timestamp) 鏇存柊銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/conversations/:conversation_id/name" targetCode={`curl -X POST '${props.appDetail.api_base_url}/conversations/:conversation_id/name' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "name": "", \n "auto_generate": true, \n "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/conversations/{conversation_id}/name' \
+    --header 'Content-Type: application/json' \
+    --header 'Authorization: Bearer {api_key}' \
+    --data-raw '{
+        "name": "",
+        "auto_generate": true,
+        "user": "abc-123"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+        "id": "cd78daf6-f9e4-4463-9ff2-54257230a0ce",
+        "name": "Chat vs AI",
+        "inputs": {},
+        "introduction": "",
+        "created_at": 1705569238,
+        "updated_at": 1705569238
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations/:conversation_id/variables'
+  method='GET'
+  title='浼氳┍澶夋暟銇彇寰�'
+  name='#conversation-variables'
+/>
+<Row>
+  <Col>
+    鐗瑰畾銇細瑭便亱銈夊鏁般倰鍙栧緱銇椼伨銇欍�傘亾銇偍銉炽儔銉濄偆銉炽儓銇�佷細瑭变腑銇彇寰椼仌銈屻仧妲嬮�犲寲銉囥兗銈裤倰鎶藉嚭銇欍倠銇伀褰圭珛銇°伨銇欍��
+
+    ### 銉戙偣銉戙儵銉°兗銈�
+
+    <Properties>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+        澶夋暟銈掑彇寰椼仚銈嬩細瑭便伄ID銆�
+      </Property>
+    </Properties>
+
+    ### 銈偍銉儜銉┿儭銉笺偪
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        銉︺兗銈躲兗璀樺垾瀛愩�傞枊鐧鸿�呫伀銈堛仯銇﹀畾缇┿仌銈屻仧銉兗銉伀寰撱亜銆併偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇傘倠蹇呰銇屻亗銈娿伨銇欍��
+      </Property>
+      <Property name='last_id' type='string' key='last_id'>
+          (Optional)鐝惧湪銇儦銉笺偢銇渶寰屻伄銉偝銉笺儔銇甀D銆併儑銉曘偐銉儓銇痭ull銇с仚銆�
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+          (Optional)1鍥炪伄銉偗銈ㄣ偣銉堛仹杩斻仚銉偝銉笺儔銇暟銆併儑銉曘偐銉儓銇渶鏂般伄20浠躲仹銇欍�傛渶澶�100銆佹渶灏�1銆�
+      </Property>
+    </Properties>
+
+    ### 銉偣銉濄兂銈�
+
+    - `limit` (int) 銉氥兗銈搞仈銇ㄣ伄銈€偆銉嗐儬鏁�
+    - `has_more` (bool) 銇曘倝銇偄銈ゃ儐銉犮亴銇傘倠銇嬨仼銇嗐亱
+    - `data` (array[object]) 澶夋暟銇儶銈广儓
+      - `id` (string) 澶夋暟ID
+      - `name` (string) 澶夋暟鍚�
+      - `value_type` (string) 澶夋暟銈裤偆銉楋紙鏂囧瓧鍒椼�佹暟鍊ゃ�佺湡鍋藉�ゃ仾銇╋級
+      - `value` (string) 澶夋暟鍊�
+      - `description` (string) 澶夋暟銇鏄�
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉�
+      - `updated_at` (int) 鏈�绲傛洿鏂般偪銈ゃ儬銈广偪銉炽儣
+
+    ### 銈ㄣ儵銉�
+    - 404, `conversation_not_exists`, 浼氳┍銇岃銇ゃ亱銈娿伨銇涖倱
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/conversations/:conversation_id/variables" targetCode={`curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123' \\\n--header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Request with variable name filter">
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123&variable_name=customer_name' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "limit": 100,
+      "has_more": false,
+      "data": [
+        {
+          "id": "variable-uuid-1",
+          "name": "customer_name",
+          "value_type": "string",
+          "value": "John Doe",
+          "description": "浼氳┍銇嬨倝鎶藉嚭銇曘倢銇熼¨瀹㈠悕",
+          "created_at": 1650000000000,
+          "updated_at": 1650000000000
+        },
+        {
+          "id": "variable-uuid-2",
+          "name": "order_details",
+          "value_type": "json",
+          "value": "{\"product\":\"Widget\",\"quantity\":5,\"price\":19.99}",
+          "description": "椤у銇敞鏂囪┏绱�",
+          "created_at": 1650000000000,
+          "updated_at": 1650000000000
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/audio-to-text'
+  method='POST'
+  title='闊冲0銇嬨倝銉嗐偔銈广儓銇�'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    銇撱伄銈ㄣ兂銉夈儩銈ゃ兂銉堛伅multipart/form-data銉偗銈ㄣ偣銉堛倰蹇呰銇ㄣ仐銇俱仚銆�
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+
+    <Properties>
+      <Property name='file' type='file' key='file'>
+        銈兗銉囥偅銈儠銈°偆銉��
+        銈点儩銉笺儓銇曘倢銇︺亜銈嬪舰寮忥細`['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm']`
+        銉曘偂銈ゃ儷銈点偆銈哄埗闄愶細15MB
+      </Property>
+      <Property name='user' type='string' key='user'>
+      銉︺兗銈躲兗璀樺垾瀛愩�侀枊鐧鸿�呫伄銉兗銉仹瀹氱京銇曘倢銆併偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇亼銈屻伆銇倞銇俱仜銈撱��
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+    - `text` (string) 鍑哄姏銉嗐偔銈广儓
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/audio-to-text" targetCode={`curl -X POST '${props.appDetail.api_base_url}/audio-to-text' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=audio/[mp3|mp4|mpeg|mpga|m4a|wav|webm]'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/conversations/name' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@localfile;type=audio/mp3'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "text": ""
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/text-to-audio'
+  method='POST'
+  title='銉嗐偔銈广儓銇嬨倝闊冲0銇�'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    銉嗐偔銈广儓銈掗煶澹般伀澶夋彌銇椼伨銇欍��
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+
+    <Properties>
+      <Property name='message_id' type='str' key='message_id'>
+        Dify銇倛銇c仸鐢熸垚銇曘倢銇熴儐銈偣銉堛儭銉冦偦銉笺偢銇牬鍚堛�佺敓鎴愩仌銈屻仧銉°儍銈汇兗銈窱D銈掔洿鎺ユ浮銇椼伨銇欍�傘儛銉冦偗銈ㄣ兂銉夈伅銉°儍銈汇兗銈窱D銈掍娇鐢ㄣ仐銇﹀蹇溿仚銈嬨偝銉炽儐銉炽儎銈掓绱€仐銆侀煶澹版儏鍫便倰鐩存帴鍚堟垚銇椼伨銇欍�俶essage_id銇╰ext銇屽悓鏅傘伀鎻愪緵銇曘倢銈嬪牬鍚堛�乵essage_id銇屽劒鍏堛仌銈屻伨銇欍��
+      </Property>
+      <Property name='text' type='str' key='text'>
+        闊冲0鐢熸垚銈炽兂銉嗐兂銉勩��
+      </Property>
+      <Property name='user' type='string' key='user'>
+        銉︺兗銈躲兗璀樺垾瀛愩�侀枊鐧鸿�呫伀銈堛仯銇﹀畾缇┿仌銈屻�併偄銉椼儶鍐呫仹涓�鎰忋仹銇傘倠蹇呰銇屻亗銈娿伨銇欍��
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/text-to-audio" targetCode={`curl --location --request POST '${props.appDetail.api_base_url}/text-to-audio' \\\n--header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \\\n--form 'text=Hello Dify;user=abc-123;message_id=5ad4cb98-f0c7-4085-b384-88c403be6290`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.appDetail.api_base_url}/text-to-audio' \
+    --header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \
+    --form 'file=Hello Dify;user=abc-123;message_id=5ad4cb98-f0c7-4085-b384-88c403be6290'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="銉樸儍銉�銉�">
+    ```json {{ title: '銉樸儍銉�銉�' }}
+    {
+      "Content-Type": "audio/wav"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/info'
+  method='GET'
+  title='銈€儣銉偙銉笺偡銉с兂銇熀鏈儏鍫便倰鍙栧緱'
+  name='#info'
+/>
+<Row>
+  <Col>
+  銇撱伄銈€儣銉偙銉笺偡銉с兂銇熀鏈儏鍫便倰鍙栧緱銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇�
+
+  ### Response
+  - `name` (string) 銈€儣銉偙銉笺偡銉с兂銇悕鍓�
+  - `description` (string) 銈€儣銉偙銉笺偡銉с兂銇鏄�
+  - `tags` (array[string]) 銈€儣銉偙銉笺偡銉с兂銇偪銈�
+  </Col>
+  <Col>
+    <CodeGroup title="Request" tag="GET" label="/info" targetCode={`curl -X GET '${props.appDetail.api_base_url}/info' \\\n-H 'Authorization: Bearer {api_key}'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/info' \
+      -H 'Authorization: Bearer {api_key}'
+      ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "name": "My App",
+      "description": "This is my app.",
+      "tags": [
+        "tag1",
+        "tag2"
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/parameters'
+  method='GET'
+  title='銈€儣銉偙銉笺偡銉с兂銇儜銉┿儭銉笺偪鎯呭牨銈掑彇寰�'
+  name='#parameters'
+/>
+<Row>
+  <Col>
+    銉氥兗銈搞伀鍏ャ倠闅涖伀銆佹鑳姐�佸叆鍔涖儜銉┿儭銉笺偪鍚嶃�併偪銈ゃ儣銆併儑銉曘偐銉儓鍊ゃ仾銇┿伄鎯呭牨銈掑彇寰椼仚銈嬨仧銈併伀浣跨敤銇曘倢銇俱仚銆�
+
+    ### 蹇滅瓟
+    - `opening_statement` (string) 闁嬪鏂�
+    - `suggested_questions` (array[string]) 闁嬪鏅傘伄鎺ㄥエ璩晱銇儶銈广儓
+    - `suggested_questions_after_answer` (object) 绛斻亪銈掓湁鍔广伀銇椼仧寰屻伄璩晱銈掓彁妗堛仐銇俱仚銆�
+      - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+    - `speech_to_text` (object) 闊冲0銇嬨倝銉嗐偔銈广儓銇�
+      - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+    - `retriever_resource` (object) 寮曠敤銇ㄥ赴灞�
+      - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+    - `annotation_reply` (object) 娉ㄩ噲杩斾俊
+      - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+    - `user_input_form` (array[object]) 銉︺兗銈躲兗鍏ュ姏銉曘偐銉笺儬銇鎴�
+      - `text-input` (object) 銉嗐偔銈广儓鍏ュ姏銈炽兂銉堛儹銉笺儷
+        - `label` (string) 澶夋暟琛ㄧず銉┿儥銉悕
+        - `variable` (string) 澶夋暟ID
+        - `required` (bool) 蹇呴爤銇嬨仼銇嗐亱
+        - `default` (string) 銉囥儠銈┿儷銉堝��
+      - `paragraph` (object) 娈佃惤銉嗐偔銈广儓鍏ュ姏銈炽兂銉堛儹銉笺儷
+        - `label` (string) 澶夋暟琛ㄧず銉┿儥銉悕
+        - `variable` (string) 澶夋暟ID
+        - `required` (bool) 蹇呴爤銇嬨仼銇嗐亱
+        - `default` (string) 銉囥儠銈┿儷銉堝��
+      - `select` (object) 銉夈儹銉冦儣銉�銈︺兂銈炽兂銉堛儹銉笺儷
+        - `label` (string) 澶夋暟琛ㄧず銉┿儥銉悕
+        - `variable` (string) 澶夋暟ID
+        - `required` (bool) 蹇呴爤銇嬨仼銇嗐亱
+        - `default` (string) 銉囥儠銈┿儷銉堝��
+        - `options` (array[string]) 銈儣銈枫儳銉冲��
+    - `file_upload` (object) 銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔妲嬫垚
+      - `image` (object) 鐢诲儚瑷畾
+        鐝惧湪銈点儩銉笺儓銇曘倢銇︺亜銈嬬敾鍍忋偪銈ゃ儣锛歚png`, `jpg`, `jpeg`, `webp`, `gif`
+        - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+        - `number_limits` (int) 鐢诲儚鏁般伄鍒堕檺銆併儑銉曘偐銉儓銇�3
+        - `transfer_methods` (array[string]) 杌㈤�佹柟娉曘伄銉偣銉堛�乺emote_url, local_file銆併亜銇氥倢銇嬨倰閬告姙銇欍倠蹇呰銇屻亗銈娿伨銇�
+    - `system_parameters` (object) 銈枫偣銉嗐儬銉戙儵銉°兗銈�
+      - `file_size_limit` (int) 銉夈偔銉ャ儭銉炽儓銈€儍銉椼儹銉笺儔銈点偆銈哄埗闄愶紙MB锛�
+      - `image_file_size_limit` (int) 鐢诲儚銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔銈点偆銈哄埗闄愶紙MB锛�
+      - `audio_file_size_limit` (int) 銈兗銉囥偅銈儠銈°偆銉偄銉冦儣銉兗銉夈偟銈ゃ偤鍒堕檺锛圡B锛�
+      - `video_file_size_limit` (int) 銉撱儑銈儠銈°偆銉偄銉冦儣銉兗銉夈偟銈ゃ偤鍒堕檺锛圡B锛�
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="GET" label="/parameters" targetCode={` curl -X GET '${props.appDetail.api_base_url}/parameters'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/parameters' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "opening_statement": "銇撱倱銇仭銇紒",
+      "suggested_questions_after_answer": {
+          "enabled": true
+      },
+      "speech_to_text": {
+          "enabled": true
+      },
+      "retriever_resource": {
+          "enabled": true
+      },
+      "annotation_reply": {
+          "enabled": true
+      },
+      "user_input_form": [
+          {
+              "paragraph": {
+                  "label": "銈偍銉�",
+                  "variable": "query",
+                  "required": true,
+                  "default": ""
+              }
+          }
+      ],
+      "file_upload": {
+          "image": {
+              "enabled": false,
+              "number_limits": 3,
+              "detail": "high",
+              "transfer_methods": [
+                  "remote_url",
+                  "local_file"
+              ]
+          }
+      },
+      "system_parameters": {
+          "file_size_limit": 15,
+          "image_file_size_limit": 10,
+          "audio_file_size_limit": 50,
+          "video_file_size_limit": 100
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/meta'
+  method='GET'
+  title='銈€儣銉偙銉笺偡銉с兂銇儭銈挎儏鍫便倰鍙栧緱'
+  name='#meta'
+/>
+<Row>
+  <Col>
+  銇撱伄銈€儣銉偙銉笺偡銉с兂銇儎銉笺儷銇偄銈ゃ偝銉炽倰鍙栧緱銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇�
+
+  ### 蹇滅瓟
+  - `tool_icons`(object[string]) 銉勩兗銉偄銈ゃ偝銉�
+    - `tool_name` (string)
+      - `icon` (object|string)
+        - (object) 銈€偆銈炽兂銈儢銈搞偋銈儓
+          - `background` (string) 鑳屾櫙鑹诧紙16閫叉暟褰㈠紡锛�
+          - `content`(string) 绲垫枃瀛�
+        - (string) 銈€偆銈炽兂銇甎RL
+  </Col>
+  <Col>
+  <CodeGroup title="銉偗銈ㄣ偣銉�" tag="GET" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/meta' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/meta' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "tool_icons": {
+        "dalle2": "https://cloud.dify.ai/console/api/workspaces/current/tool-provider/builtin/dalle/icon",
+        "api_tool": {
+          "background": "#252525",
+          "content": "\ud83d\ude01"
+        }
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/site'
+  method='GET'
+  title='銈€儣銉伄WebApp瑷畾銈掑彇寰�'
+  name='#site'
+/>
+<Row>
+  <Col>
+  銈€儣銉伄WebApp瑷畾銈掑彇寰椼仚銈嬨仧銈併伀浣跨敤銇椼伨銇欍��
+  ### 蹇滅瓟
+  - `title` (string) WebApp鍚�
+  - `chat_color_theme` (string) 銉併儯銉冦儓銇壊銉嗐兗銉炪��16閫叉暟褰㈠紡
+  - `chat_color_theme_inverted` (bool) 銉併儯銉冦儓銇壊銉嗐兗銉炪倰鍙嶈虎銇欍倠銇嬨仼銇嗐亱
+  - `icon_type` (string) 銈€偆銈炽兂銈裤偆銉椼�乣emoji`-绲垫枃瀛椼�乣image`-鐢诲儚
+  - `icon` (string) 銈€偆銈炽兂銆俙emoji`銈裤偆銉椼伄鍫村悎銇档鏂囧瓧銆乣image`銈裤偆銉椼伄鍫村悎銇敾鍍廢RL
+  - `icon_background` (string) 16閫叉暟褰㈠紡銇儗鏅壊
+  - `icon_url` (string) 銈€偆銈炽兂銇甎RL
+  - `description` (string) 瑾槑
+  - `copyright` (string) 钁椾綔妯╂儏鍫�
+  - `privacy_policy` (string) 銉椼儵銈ゃ儛銈枫兗銉濄儶銈枫兗銇儶銉炽偗
+  - `custom_disclaimer` (string) 銈偣銈裤儬鍏嶈铂浜嬮爡
+  - `default_language` (string) 銉囥儠銈┿儷銉堣█瑾�
+  - `show_workflow_steps` (bool) 銉兗銈儠銉兗銇┏绱般倰琛ㄧず銇欍倠銇嬨仼銇嗐亱
+  - `use_icon_as_answer_icon` (bool) WebApp銇偄銈ゃ偝銉炽倰銉併儯銉冦儓鍐呫伄馃銇疆銇嶆彌銇堛倠銇嬨仼銇嗐亱
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="POST" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/site' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/site' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "title": "My App",
+      "chat_color_theme": "#ff4a4a",
+      "chat_color_theme_inverted": false,
+      "icon_type": "emoji",
+      "icon": "馃槃",
+      "icon_background": "#FFEAD5",
+      "icon_url": null,
+      "description": "This is my app.",
+      "copyright": "all rights reserved",
+      "privacy_policy": "",
+      "custom_disclaimer": "All generated by AI",
+      "default_language": "en-US",
+      "show_workflow_steps": false,
+      "use_icon_as_answer_icon": false,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+___
diff --git a/app/components/develop/template/template_chat.zh.mdx b/app/components/develop/template/template_chat.zh.mdx
new file mode 100644
index 0000000..8661700
--- /dev/null
+++ b/app/components/develop/template/template_chat.zh.mdx
@@ -0,0 +1,1394 @@
+import { CodeGroup } from '../code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty } from '../md.tsx'
+
+# 瀵硅瘽鍨嬪簲鐢� API
+
+瀵硅瘽搴旂敤鏀寔浼氳瘽鎸佷箙鍖栵紝鍙皢涔嬪墠鐨勮亰澶╄褰曚綔涓轰笂涓嬫枃杩涜鍥炵瓟锛屽彲閫傜敤浜庤亰澶�/瀹㈡湇 AI 绛夈��
+
+<div>
+  ### 鍩虹 URL
+  <CodeGroup title="Code" targetCode={props.appDetail.api_base_url}>
+    ```javascript
+    ```
+  </CodeGroup>
+
+  ### 閴存潈
+
+  Service API 浣跨敤 `API-Key` 杩涜閴存潈銆�
+  <i>**寮虹儓寤鸿寮�鍙戣�呮妸 `API-Key` 鏀惧湪鍚庣瀛樺偍锛岃�岄潪鍒嗕韩鎴栬�呮斁鍦ㄥ鎴风瀛樺偍锛屼互鍏� `API-Key` 娉勯湶锛屽鑷磋储浜ф崯澶便��**</i>
+  鎵�鏈� API 璇锋眰閮藉簲鍦� **`Authorization`** HTTP Header 涓寘鍚偍鐨� `API-Key`锛屽涓嬫墍绀猴細
+
+  <CodeGroup title="Code">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+    ```
+  </CodeGroup>
+</div>
+
+---
+
+<Heading
+  url='/chat-messages'
+  method='POST'
+  title='鍙戦�佸璇濇秷鎭�'
+  name='#Create-Chat-Message'
+/>
+<Row>
+  <Col>
+    鍒涘缓浼氳瘽娑堟伅銆�
+
+    ### Request Body
+
+    <Properties>
+      <Property name='query' type='string' key='query'>
+        鐢ㄦ埛杈撳叆/鎻愰棶鍐呭銆�
+      </Property>
+      <Property name='inputs' type='object' key='inputs'>
+        鍏佽浼犲叆 App 瀹氫箟鐨勫悇鍙橀噺鍊笺��
+        inputs 鍙傛暟鍖呭惈浜嗗缁勯敭鍊煎锛圞ey/Value pairs锛夛紝姣忕粍鐨勯敭瀵瑰簲涓�涓壒瀹氬彉閲忥紝姣忕粍鐨勫�煎垯鏄鍙橀噺鐨勫叿浣撳�笺��
+        榛樿 `{}`
+      </Property>
+      <Property name='response_mode' type='string' key='response_mode'>
+        - `streaming` 娴佸紡妯″紡锛堟帹鑽愶級銆傚熀浜� SSE锛�**[Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)**锛夊疄鐜扮被浼兼墦瀛楁満杈撳嚭鏂瑰紡鐨勬祦寮忚繑鍥炪��
+        - `blocking` 闃诲妯″紡锛岀瓑寰呮墽琛屽畬姣曞悗杩斿洖缁撴灉銆傦紙璇锋眰鑻ユ祦绋嬭緝闀垮彲鑳戒細琚腑鏂級銆�
+        <i>鐢变簬 Cloudflare 闄愬埗锛岃姹備細鍦� 100 绉掕秴鏃舵棤杩斿洖鍚庝腑鏂��</i>
+        娉細Agent妯″紡涓嬩笉鍏佽blocking銆�
+      </Property>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敤浜庡畾涔夌粓绔敤鎴风殑韬唤锛屾柟渚挎绱€�佺粺璁°��
+        鐢卞紑鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+      锛堥�夊~锛変細璇� ID锛岄渶瑕佸熀浜庝箣鍓嶇殑鑱婂ぉ璁板綍缁х画瀵硅瘽锛屽繀椤讳紶涔嬪墠娑堟伅鐨� conversation_id銆�
+      </Property>
+      <Property name='files' type='array[object]' key='files'>
+          涓婁紶鐨勬枃浠躲��
+          - `type` (string) 鏀寔绫诲瀷锛氬浘鐗� `image`锛堢洰鍓嶄粎鏀寔鍥剧墖鏍煎紡锛� 銆�
+          - `transfer_method` (string)  浼犻�掓柟寮�:
+            - `remote_url`: 鍥剧墖鍦板潃銆�
+            - `local_file`: 涓婁紶鏂囦欢銆�
+          - `url` 鍥剧墖鍦板潃銆傦紙浠呭綋浼犻�掓柟寮忎负 `remote_url` 鏃讹級銆�
+          - `upload_file_id` 涓婁紶鏂囦欢 ID銆傦紙浠呭綋浼犻�掓柟寮忎负 `local_file `鏃讹級銆�
+      </Property>
+      <Property name='auto_generate_name' type='bool' key='auto_generate_name'>
+      锛堥�夊~锛夎嚜鍔ㄧ敓鎴愭爣棰橈紝榛樿 `true`銆� 鑻ヨ缃负 `false`锛屽垯鍙�氳繃璋冪敤浼氳瘽閲嶅懡鍚嶆帴鍙e苟璁剧疆 `auto_generate` 涓� `true` 瀹炵幇寮傛鐢熸垚鏍囬銆�
+      </Property>
+    </Properties>
+
+    ### Response
+    <Properties>
+    褰� `response_mode` 涓� `blocking` 鏃讹紝杩斿洖 ChatCompletionResponse object銆�
+    褰� `response_mode` 涓� `streaming`鏃讹紝杩斿洖 ChunkChatCompletionResponse object 娴佸紡搴忓垪銆�
+
+    ### ChatCompletionResponse
+
+    杩斿洖瀹屾暣鐨� App 缁撴灉锛宍Content-Type` 涓� `application/json`銆�
+    - `event` (string) 浜嬩欢绫诲瀷锛屽浐瀹氫负 `message`
+    - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+    - `id` (string) 鍞竴ID
+    - `message_id` (string) 娑堟伅鍞竴 ID
+    - `conversation_id` (string) 浼氳瘽 ID
+    - `mode` (string) App 妯″紡锛屽浐瀹氫负 chat
+    - `answer` (string) 瀹屾暣鍥炲鍐呭
+    - `metadata` (object) 鍏冩暟鎹�
+      - `usage` (Usage) 妯″瀷鐢ㄩ噺淇℃伅
+      - `retriever_resources` (array[RetrieverResource]) 寮曠敤鍜屽綊灞炲垎娈靛垪琛�
+    - `created_at` (int) 娑堟伅鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    ### ChunkChatCompletionResponse
+    杩斿洖 App 杈撳嚭鐨勬祦寮忓潡锛宍Content-Type` 涓� `text/event-stream`銆�
+    姣忎釜娴佸紡鍧楀潎涓� data: 寮�澶达紝鍧椾箣闂翠互 \n\n 鍗充袱涓崲琛岀鍒嗛殧锛屽涓嬫墍绀猴細
+    <CodeGroup>
+    ```streaming {{ title: 'Response' }}
+    data: {"event": "message", "task_id": "900bbd43-dc0b-4383-a372-aa6e6c414227", "id": "663c5084-a254-4040-8ad3-51f2a3c1a77c", "answer": "Hi", "created_at": 1705398420}\n\n
+    ```
+    </CodeGroup>
+
+    娴佸紡鍧椾腑鏍规嵁 event 涓嶅悓锛岀粨鏋勪篃涓嶅悓锛�
+    - `event: message` LLM 杩斿洖鏂囨湰鍧椾簨浠讹紝鍗筹細瀹屾暣鐨勬枃鏈互鍒嗗潡鐨勬柟寮忚緭鍑恒��
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `conversation_id` (string) 浼氳瘽 ID
+      - `answer` (string) LLM 杩斿洖鏂囨湰鍧楀唴瀹�
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: agent_message` Agent妯″紡涓嬭繑鍥炴枃鏈潡浜嬩欢锛屽嵆锛氬湪Agent妯″紡涓嬶紝鏂囩珷鐨勬枃鏈互鍒嗗潡鐨勬柟寮忚緭鍑猴紙浠匒gent妯″紡涓嬩娇鐢級
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `conversation_id` (string) 浼氳瘽 ID
+      - `answer` (string) LLM 杩斿洖鏂囨湰鍧楀唴瀹�
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: agent_thought` Agent妯″紡涓嬫湁鍏矨gent鎬濊�冩楠ょ殑鐩稿叧鍐呭锛屾秹鍙婂埌宸ュ叿璋冪敤锛堜粎Agent妯″紡涓嬩娇鐢級
+      - `id` (string) agent_thought ID锛屾瘡涓�杞瓵gent杩唬閮戒細鏈変竴涓敮涓�鐨刬d
+      - `task_id` (string) 浠诲姟ID锛岀敤浜庤姹傝窡韪笅鏂圭殑鍋滄鍝嶅簲鎺ュ彛
+      - `message_id` (string) 娑堟伅鍞竴ID
+      - `position` (int) agent_thought鍦ㄦ秷鎭腑鐨勪綅缃紝濡傜涓�杞凯浠osition涓�1
+      - `thought` (string) agent鐨勬�濊�冨唴瀹�
+      - `observation` (string) 宸ュ叿璋冪敤鐨勮繑鍥炵粨鏋�
+      - `tool` (string) 浣跨敤鐨勫伐鍏峰垪琛紝浠� ; 鍒嗗壊澶氫釜宸ュ叿
+      - `tool_input` (string) 宸ュ叿鐨勮緭鍏ワ紝JSON鏍煎紡鐨勫瓧绗︿覆(object)銆傚锛歚{"dalle3": {"prompt": "a cute cat"}}`
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+      - `message_files` (array[string])  褰撳墠 `agent_thought` 鍏宠仈鐨勬枃浠禝D
+        - `file_id` (string) 鏂囦欢ID
+      - `conversation_id` (string) 浼氳瘽ID
+    - `event: message_file` 鏂囦欢浜嬩欢锛岃〃绀烘湁鏂版枃浠堕渶瑕佸睍绀�
+      - `id` (string) 鏂囦欢鍞竴ID
+      - `type` (string) 鏂囦欢绫诲瀷锛岀洰鍓嶄粎涓篿mage
+      - `belongs_to` (string) 鏂囦欢褰掑睘锛寀ser鎴朼ssistant锛岃鎺ュ彛杩斿洖浠呬负 `assistant`
+      - `url` (string) 鏂囦欢璁块棶鍦板潃
+      - `conversation_id`  (string) 浼氳瘽ID
+    - `event: message_end` 娑堟伅缁撴潫浜嬩欢锛屾敹鍒版浜嬩欢鍒欎唬琛ㄦ祦寮忚繑鍥炵粨鏉熴��
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `conversation_id` (string) 浼氳瘽 ID
+      - `metadata` (object) 鍏冩暟鎹�
+        - `usage` (Usage) 妯″瀷鐢ㄩ噺淇℃伅
+        - `retriever_resources` (array[RetrieverResource]) 寮曠敤鍜屽綊灞炲垎娈靛垪琛�
+    - `event: tts_message` TTS 闊抽娴佷簨浠讹紝鍗筹細璇煶鍚堟垚杈撳嚭銆傚唴瀹规槸Mp3鏍煎紡鐨勯煶棰戝潡锛屼娇鐢� base64 缂栫爜鍚庣殑瀛楃涓诧紝鎾斁鐨勬椂鍊欑洿鎺ヨВ鐮佸嵆鍙��(寮�鍚嚜鍔ㄦ挱鏀炬墠鏈夋娑堟伅)
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `audio` (string) 璇煶鍚堟垚涔嬪悗鐨勯煶棰戝潡浣跨敤 Base64 缂栫爜涔嬪悗鐨勬枃鏈唴瀹癸紝鎾斁鐨勬椂鍊欑洿鎺� base64 瑙g爜閫佸叆鎾斁鍣ㄥ嵆鍙�
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: tts_message_end` TTS 闊抽娴佺粨鏉熶簨浠讹紝鏀跺埌杩欎釜浜嬩欢琛ㄧず闊抽娴佽繑鍥炵粨鏉熴��
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `audio` (string) 缁撴潫浜嬩欢鏄病鏈夐煶棰戠殑锛屾墍浠ヨ繖閲屾槸绌哄瓧绗︿覆
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: message_replace` 娑堟伅鍐呭鏇挎崲浜嬩欢銆�
+      寮�鍚唴瀹瑰鏌ュ拰瀹℃煡杈撳嚭鍐呭鏃讹紝鑻ュ懡涓簡瀹℃煡鏉′欢锛屽垯浼氶�氳繃姝や簨浠舵浛鎹㈡秷鎭唴瀹逛负棰勮鍥炲銆�
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `conversation_id` (string) 浼氳瘽 ID
+      - `answer` (string) 鏇挎崲鍐呭锛堢洿鎺ユ浛鎹� LLM 鎵�鏈夊洖澶嶆枃鏈級
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: error`
+      娴佸紡杈撳嚭杩囩▼涓嚭鐜扮殑寮傚父浼氫互 stream event 褰㈠紡杈撳嚭锛屾敹鍒板紓甯镐簨浠跺悗鍗崇粨鏉熴��
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `status` (int) HTTP 鐘舵�佺爜
+      - `code` (string) 閿欒鐮�
+      - `message` (string) 閿欒娑堟伅
+    - `event: ping` 姣� 10s 涓�娆$殑 ping 浜嬩欢锛屼繚鎸佽繛鎺ュ瓨娲汇��
+
+    ### Errors
+    - 404锛屽璇濅笉瀛樺湪
+    - 400锛宍invalid_param`锛屼紶鍏ュ弬鏁板紓甯�
+    - 400锛宍app_unavailable`锛孉pp 閰嶇疆涓嶅彲鐢�
+    - 400锛宍provider_not_initialize`锛屾棤鍙敤妯″瀷鍑嵁閰嶇疆
+    - 400锛宍provider_quota_exceeded`锛屾ā鍨嬭皟鐢ㄩ搴︿笉瓒�
+    - 400锛宍model_currently_not_support`锛屽綋鍓嶆ā鍨嬩笉鍙敤
+    - 400锛宍completion_request_error`锛屾枃鏈敓鎴愬け璐�
+    - 500锛屾湇鍔″唴閮ㄥ紓甯�
+
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/chat-messages" targetCode={`curl -X POST '${props.appDetail.api_base_url}/chat-messages' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "inputs": ${JSON.stringify(props.inputs)},\n    "query": "What are the specs of the iPhone 13 Pro Max?",\n    "response_mode": "streaming",\n    "conversation_id": "",\n    "user": "abc-123",\n    "files": [\n      {\n        "type": "image",\n        "transfer_method": "remote_url",\n        "url": "https://cloud.dify.ai/logo/logo-site.png"\n      }\n    ]\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/chat-messages' \
+    -H 'Authorization: Bearer {api_key}' \
+    -H 'Content-Type: application/json' \
+    --data-raw '{
+        "inputs": {
+            "name": "dify"
+        },
+        "query": "What are the specs of the iPhone 13 Pro Max?",
+        "conversation_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb",
+        "response_mode": "streaming",
+        "user": "abc-123",
+        "files": [
+          {
+            "type": "image",
+            "transfer_method": "remote_url",
+            "url": "https://cloud.dify.ai/logo/logo-site.png"
+          }
+        ]
+    }'
+    ```
+
+    </CodeGroup>
+    ### 闃诲妯″紡
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+        "event": "message",
+        "task_id": "c3800678-a077-43df-a102-53f23ed20b88", 
+        "id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "message_id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2",
+        "mode": "chat",
+        "answer": "iPhone 13 Pro Max specs are listed here:...",
+        "metadata": {
+            "usage": {
+                "prompt_tokens": 1033,
+                "prompt_unit_price": "0.001",
+                "prompt_price_unit": "0.001",
+                "prompt_price": "0.0010330",
+                "completion_tokens": 128,
+                "completion_unit_price": "0.002",
+                "completion_price_unit": "0.001",
+                "completion_price": "0.0002560",
+                "total_tokens": 1161,
+                "total_price": "0.0012890",
+                "currency": "USD",
+                "latency": 0.7682376249867957
+            },
+            "retriever_resources": [
+                {
+                    "position": 1,
+                    "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb",
+                    "dataset_name": "iPhone",
+                    "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00",
+                    "document_name": "iPhone List",
+                    "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a",
+                    "score": 0.98457545,
+                    "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""
+                }
+            ]
+        },
+        "created_at": 1705407629
+    }
+    ```
+    </CodeGroup>
+    ### 娴佸紡妯″紡锛堝熀纭�鍔╂墜锛�
+    <CodeGroup title="Response">
+    ```streaming {{ title: 'Response' }}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " I", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": "'m", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " glad", "created_at": 1679586595}
+      data: {"event": "message", "message_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " to", "created_at": 1679586595}
+      data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " meet", "created_at": 1679586595}
+      data: {"event": "message", "message_id" : "5ad4cb98-f0c7-4085-b384-88c403be6290", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "answer": " you", "created_at": 1679586595}
+      data: {"event": "message_end", "id": "5e52ce04-874b-4d27-9045-b3bc80def685", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "metadata": {"usage": {"prompt_tokens": 1033, "prompt_unit_price": "0.001", "prompt_price_unit": "0.001", "prompt_price": "0.0010330", "completion_tokens": 135, "completion_unit_price": "0.002", "completion_price_unit": "0.001", "completion_price": "0.0002700", "total_tokens": 1168, "total_price": "0.0013030", "currency": "USD", "latency": 1.381760165997548}, "retriever_resources": [{"position": 1, "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb", "dataset_name": "iPhone", "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00", "document_name": "iPhone List", "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a", "score": 0.98457545, "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""}]}}
+      data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+      data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+    ```
+    </CodeGroup>
+
+    ### 娴佸紡妯″紡锛堟櫤鑳藉姪鎵嬶級
+    <CodeGroup title="Response">
+    ```streaming {{ title: 'Response' }}
+      data: {"event": "agent_thought", "id": "8dcf3648-fbad-407a-85dd-73a6f43aeb9f", "task_id": "9cf1ddd7-f94b-459b-b942-b77b26c59e9b", "message_id": "1fb10045-55fd-4040-99e6-d048d07cbad3", "position": 1, "thought": "", "observation": "", "tool": "", "tool_input": "", "created_at": 1705639511, "message_files": [], "conversation_id": "c216c595-2d89-438c-b33c-aae5ddddd142"}
+      data: {"event": "agent_thought", "id": "8dcf3648-fbad-407a-85dd-73a6f43aeb9f", "task_id": "9cf1ddd7-f94b-459b-b942-b77b26c59e9b", "message_id": "1fb10045-55fd-4040-99e6-d048d07cbad3", "position": 1, "thought": "", "observation": "", "tool": "dalle3", "tool_input": "{\"dalle3\": {\"prompt\": \"cute Japanese anime girl with white hair, blue eyes, bunny girl suit\"}}", "created_at": 1705639511, "message_files": [], "conversation_id": "c216c595-2d89-438c-b33c-aae5ddddd142"}
+      data: {"event": "message_file", "id": "d75b7a5c-ce5e-442e-ab1b-d6a5e5b557b0", "type": "image", "belongs_to": "assistant", "url": "http://127.0.0.1:5001/files/tools/d75b7a5c-ce5e-442e-ab1b-d6a5e5b557b0.png?timestamp=1705639526&nonce=70423256c60da73a9c96d1385ff78487&sign=7B5fKV9890YJuqchQvrABvW4AIupDvDvxGdu1EOJT94=", "conversation_id": "c216c595-2d89-438c-b33c-aae5ddddd142"}
+      data: {"event": "agent_thought", "id": "8dcf3648-fbad-407a-85dd-73a6f43aeb9f", "task_id": "9cf1ddd7-f94b-459b-b942-b77b26c59e9b", "message_id": "1fb10045-55fd-4040-99e6-d048d07cbad3", "position": 1, "thought": "", "observation": "image has been created and sent to user already, you should tell user to check it now.", "tool": "dalle3", "tool_input": "{\"dalle3\": {\"prompt\": \"cute Japanese anime girl with white hair, blue eyes, bunny girl suit\"}}", "created_at": 1705639511, "message_files": ["d75b7a5c-ce5e-442e-ab1b-d6a5e5b557b0"], "conversation_id": "c216c595-2d89-438c-b33c-aae5ddddd142"}
+      data: {"event": "agent_thought", "id": "67a99dc1-4f82-42d3-b354-18d4594840c8", "task_id": "9cf1ddd7-f94b-459b-b942-b77b26c59e9b", "message_id": "1fb10045-55fd-4040-99e6-d048d07cbad3", "position": 2, "thought": "", "observation": "", "tool": "", "tool_input": "", "created_at": 1705639511, "message_files": [], "conversation_id": "c216c595-2d89-438c-b33c-aae5ddddd142"}
+      data: {"event": "agent_message", "id": "1fb10045-55fd-4040-99e6-d048d07cbad3", "task_id": "9cf1ddd7-f94b-459b-b942-b77b26c59e9b", "message_id": "1fb10045-55fd-4040-99e6-d048d07cbad3", "answer": "I have created an image of a cute Japanese", "created_at": 1705639511, "conversation_id": "c216c595-2d89-438c-b33c-aae5ddddd142"}
+      data: {"event": "agent_message", "id": "1fb10045-55fd-4040-99e6-d048d07cbad3", "task_id": "9cf1ddd7-f94b-459b-b942-b77b26c59e9b", "message_id": "1fb10045-55fd-4040-99e6-d048d07cbad3", "answer": " anime girl with white hair and blue", "created_at": 1705639511, "conversation_id": "c216c595-2d89-438c-b33c-aae5ddddd142"}
+      data: {"event": "agent_message", "id": "1fb10045-55fd-4040-99e6-d048d07cbad3", "task_id": "9cf1ddd7-f94b-459b-b942-b77b26c59e9b", "message_id": "1fb10045-55fd-4040-99e6-d048d07cbad3", "answer": " eyes wearing a bunny girl" ,"created_at": 1705639511, "conversation_id": "c216c595-2d89-438c-b33c-aae5ddddd142"}
+      data: {"event": "agent_message", "id": "1fb10045-55fd-4040-99e6-d048d07cbad3", "task_id": "9cf1ddd7-f94b-459b-b942-b77b26c59e9b", "message_id": "1fb10045-55fd-4040-99e6-d048d07cbad3", "answer": " suit .", "created_at": 1705639511, "conversation_id": "c216c595-2d89-438c-b33c-aae5ddddd142"}
+      data: {"event": "agent_thought", "id": "67a99dc1-4f82-42d3-b354-18d4594840c8", "task_id": "9cf1ddd7-f94b-459b-b942-b77b26c59e9b", "message_id": "1fb10045-55fd-4040-99e6-d048d07cbad3", "position": 2, "thought": "I have created an image of a cute Japanese anime girl with white hair and blue eyes wearing a bunny girl suit.", "observation": "", "tool": "", "tool_input": "", "created_at": 1705639511, "message_files": [], "conversation_id": "c216c595-2d89-438c-b33c-aae5ddddd142"}
+      data: {"event": "message_end", "id": "5e52ce04-874b-4d27-9045-b3bc80def685", "conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2", "metadata": {"usage": {"prompt_tokens": 1033, "prompt_unit_price": "0.001", "prompt_price_unit": "0.001", "prompt_price": "0.0010330", "completion_tokens": 135, "completion_unit_price": "0.002", "completion_price_unit": "0.001", "completion_price": "0.0002700", "total_tokens": 1168, "total_price": "0.0013030", "currency": "USD", "latency": 1.381760165997548}, "retriever_resources": [{"position": 1, "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb", "dataset_name": "iPhone", "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00", "document_name": "iPhone List", "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a", "score": 0.98457545, "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""}]}}
+      data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+      data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/files/upload'
+  method='POST'
+  title='涓婁紶鏂囦欢'
+  name='#files-upload'
+/>
+<Row>
+  <Col>
+    涓婁紶鏂囦欢锛堢洰鍓嶄粎鏀寔鍥剧墖锛夊苟鍦ㄥ彂閫佹秷鎭椂浣跨敤锛屽彲瀹炵幇鍥炬枃澶氭ā鎬佺悊瑙c��
+    鏀寔 png, jpg, jpeg, webp, gif 鏍煎紡銆�
+    <i>涓婁紶鐨勬枃浠朵粎渚涘綋鍓嶇粓绔敤鎴蜂娇鐢ㄣ��</i>
+
+    ### Request Body
+    璇ユ帴鍙i渶浣跨敤  `multipart/form-data` 杩涜璇锋眰銆�
+    <Properties>
+      <Property name='file' type='file' key='file'>
+        瑕佷笂浼犵殑鏂囦欢銆�
+      </Property>
+      <Property name='user' type='string' key='user'>
+          鐢ㄦ埛鏍囪瘑锛岀敤浜庡畾涔夌粓绔敤鎴风殑韬唤锛屽繀椤诲拰鍙戦�佹秷鎭帴鍙d紶鍏� user 淇濇寔涓�鑷淬��
+      </Property>
+    </Properties>
+
+    ### Response
+    鎴愬姛涓婁紶鍚庯紝鏈嶅姟鍣ㄤ細杩斿洖鏂囦欢鐨� ID 鍜岀浉鍏充俊鎭��
+    - `id` (uuid) ID
+    - `name` (string) 鏂囦欢鍚�
+    - `size` (int) 鏂囦欢澶у皬锛坆yte锛�
+    - `extension` (string) 鏂囦欢鍚庣紑
+    - `mime_type` (string) 鏂囦欢 mime-type
+    - `created_by` (uuid) 涓婁紶浜� ID
+    - `created_at` (timestamp) 涓婁紶鏃堕棿
+
+    ### Errors
+    - 400锛宍no_file_uploaded`锛屽繀椤绘彁渚涙枃浠�
+    - 400锛宍too_many_files`锛岀洰鍓嶅彧鎺ュ彈涓�涓枃浠�
+    - 400锛宍unsupported_preview`锛岃鏂囦欢涓嶆敮鎸侀瑙�
+    - 400锛宍unsupported_estimate`锛岃鏂囦欢涓嶆敮鎸佷及绠�
+    - 413锛宍file_too_large`锛屾枃浠跺お澶�
+    - 415锛宍unsupported_file_type`锛屼笉鏀寔鐨勬墿灞曞悕锛屽綋鍓嶅彧鎺ュ彈鏂囨。绫绘枃浠�
+    - 503锛宍s3_connection_failed`锛屾棤娉曡繛鎺ュ埌 S3 鏈嶅姟
+    - 503锛宍s3_permission_denied`锛屾棤鏉冮檺涓婁紶鏂囦欢鍒� S3
+    - 503锛宍s3_file_too_large`锛屾枃浠惰秴鍑� S3 澶у皬闄愬埗
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/files/upload" targetCode={`curl -X POST '${props.appDetail.api_base_url}/files/upload' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=image/[png|jpeg|jpg|webp|gif] \\\n--form 'user=abc-123'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/files/upload' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@"/path/to/file"'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "72fa9618-8f89-4a37-9b33-7e1178a24a67",
+      "name": "example.png",
+      "size": 1024,
+      "extension": "png",
+      "mime_type": "image/png",
+      "created_by": 123,
+      "created_at": 1577836800,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+<Heading
+  url='/chat-messages/:task_id/stop'
+  method='POST'
+  title='鍋滄鍝嶅簲'
+  name='#Stop'
+/>
+<Row>
+  <Col>
+  浠呮敮鎸佹祦寮忔ā寮忋��
+  ### Path
+  - `task_id` (string) 浠诲姟 ID锛屽彲鍦ㄦ祦寮忚繑鍥� Chunk 涓幏鍙�
+
+  ### Request Body
+  - `user` (string) Required
+    鐢ㄦ埛鏍囪瘑锛岀敤浜庡畾涔夌粓绔敤鎴风殑韬唤锛屽繀椤诲拰鍙戦�佹秷鎭帴鍙d紶鍏� user 淇濇寔涓�鑷淬��
+  ### Response
+  - `result` (string) 鍥哄畾杩斿洖 success
+  </Col>
+  <Col sticky>
+  <CodeGroup title="Request" tag="POST" label="/chat-messages/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/chat-messages/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{ "user": "abc-123"}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/chat-messages/:task_id/stop' \
+    -H 'Authorization: Bearer {api_key}' \
+    -H 'Content-Type: application/json' \
+    --data-raw '{
+        "user": "abc-123"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/messages/:message_id/feedbacks'
+  method='POST'
+  title='娑堟伅鍙嶉锛堢偣璧烇級'
+  name='#feedbacks'
+/>
+<Row>
+  <Col>
+    娑堟伅缁堢鐢ㄦ埛鍙嶉銆佺偣璧烇紝鏂逛究搴旂敤寮�鍙戣�呬紭鍖栬緭鍑洪鏈熴��
+
+    ### Path Params
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+       娑堟伅 ID
+      </Property>
+    </Properties>
+
+    ### Request Body
+
+    <Properties>
+      <Property name='rating' type='string' key='rating'>
+         鐐硅禐 like, 鐐硅俯 dislike,  鎾ら攢鐐硅禐 null
+      </Property>
+      <Property name='user' type='string' key='user'>
+          鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+      <Property name='content' type='string' key='content'>
+          娑堟伅鍙嶉鐨勫叿浣撲俊鎭��
+      </Property>
+    </Properties>
+
+    ### Response
+    - `result` (string) 鍥哄畾杩斿洖 success
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/messages/:message_id/feedbacks" targetCode={`curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "rating": "like",\n    "user": "abc-123",\n    "content": "message feedback information"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/messages/:message_id/feedbacks' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "rating": "like",
+        "user": "abc-123",
+        "content": "message feedback information"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/app/feedbacks'
+  method='GET'
+  title='鑾峰彇APP鐨勬秷鎭偣璧炲拰鍙嶉'
+  name='#app-feedbacks'
+/>
+<Row>
+  <Col>
+    鑾峰彇搴旂敤鐨勭粓绔敤鎴峰弽棣堛�佺偣璧炪��
+
+    ### Query
+    <Properties>
+      <Property name='page' type='string' key='page'>
+       锛堥�夊~锛夊垎椤碉紝榛樿鍊硷細1
+      </Property>
+    </Properties>
+
+    <Properties>
+      <Property name='limit' type='string' key='limit'>
+       锛堥�夊~锛夋瘡椤垫暟閲忥紝榛樿鍊硷細20
+      </Property>
+    </Properties>
+
+    ### Response
+    - `data` (List) 杩斿洖璇PP鐨勭偣璧炪�佸弽棣堝垪琛ㄣ��
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/app/feedbacks" targetCode={`curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/app/feedbacks?page=1&limit=20' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+        {
+        "data": [
+            {
+                "id": "8c0fbed8-e2f9-49ff-9f0e-15a35bdd0e25",
+                "app_id": "f252d396-fe48-450e-94ec-e184218e7346",
+                "conversation_id": "2397604b-9deb-430e-b285-4726e51fd62d",
+                "message_id": "709c0b0f-0a96-4a4e-91a4-ec0889937b11",
+                "rating": "like",
+                "content": "message feedback information-3",
+                "from_source": "user",
+                "from_end_user_id": "74286412-9a1a-42c1-929c-01edb1d381d5",
+                "from_account_id": null,
+                "created_at": "2025-04-24T09:24:38",
+                "updated_at": "2025-04-24T09:24:38"
+            }
+        ]
+        }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/messages/{message_id}/suggested'
+  method='GET'
+  title='鑾峰彇涓嬩竴杞缓璁棶棰樺垪琛�'
+  name='#suggested'
+/>
+<Row>
+  <Col>
+    鑾峰彇涓嬩竴杞缓璁棶棰樺垪琛ㄣ��
+
+    ### Path Params
+
+    <Properties>
+      <Property name='message_id' type='string' key='message_id'>
+        Message ID
+      </Property>
+    </Properties>
+
+    ### Query
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/messages/{message_id}/suggested" targetCode={`curl --location --request GET '${props.appDetail.api_base_url}/messages/{message_id}/suggested?user=abc-123 \\\n--header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \\\n--header 'Content-Type: application/json'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl --location --request GET '${props.appDetail.api_base_url}/messages/{message_id}/suggested' \
+    --header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \
+    --header 'Content-Type: application/json' \
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success",
+      "data": [
+            "a",
+            "b",
+            "c"
+        ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+---
+
+<Heading
+  url='/messages'
+  method='GET'
+  title='鑾峰彇浼氳瘽鍘嗗彶娑堟伅'
+  name='#messages'
+/>
+<Row>
+  <Col>
+    婊氬姩鍔犺浇褰㈠紡杩斿洖鍘嗗彶鑱婂ぉ璁板綍锛岀涓�椤佃繑鍥炴渶鏂�  `limit` 鏉★紝鍗筹細鍊掑簭杩斿洖銆�
+
+    ### Query
+
+    <Properties>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+        浼氳瘽 ID
+      </Property>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+      <Property name='first_id' type='string' key='first_id'>
+        褰撳墠椤电涓�鏉¤亰澶╄褰曠殑 ID锛岄粯璁� null
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+        涓�娆¤姹傝繑鍥炲灏戞潯鑱婂ぉ璁板綍锛岄粯璁� 20 鏉°��
+      </Property>
+    </Properties>
+
+    ### Response
+    - `data` (array[object])  娑堟伅鍒楄〃
+    - `id`  (string) 娑堟伅 ID
+    - `conversation_id` (string)  浼氳瘽 ID
+    - `inputs` (object) 鐢ㄦ埛杈撳叆鍙傛暟銆�
+    - `query`  (string) 鐢ㄦ埛杈撳叆 / 鎻愰棶鍐呭銆�
+    - `message_files` (array[object]) 娑堟伅鏂囦欢
+      - `id` (string) ID
+      - `type` (string) 鏂囦欢绫诲瀷锛宨mage 鍥剧墖
+      - `url` (string) 棰勮鍥剧墖鍦板潃
+      - `belongs_to` (string) 鏂囦欢褰掑睘鏂癸紝user 鎴� assistant
+      - `agent_thoughts` (array[object]) Agent鎬濊�冨唴瀹癸紙浠匒gent妯″紡涓嬩笉涓虹┖锛�
+        - `id` (string) agent_thought ID锛屾瘡涓�杞瓵gent杩唬閮戒細鏈変竴涓敮涓�鐨刬d
+        - `message_id` (string) 娑堟伅鍞竴ID
+        - `position` (int) agent_thought鍦ㄦ秷鎭腑鐨勪綅缃紝濡傜涓�杞凯浠osition涓�1
+        - `thought` (string) agent鐨勬�濊�冨唴瀹�
+        - `observation` (string) 宸ュ叿璋冪敤鐨勮繑鍥炵粨鏋�
+        - `tool` (string) 浣跨敤鐨勫伐鍏峰垪琛紝浠� ; 鍒嗗壊澶氫釜宸ュ叿
+        - `tool_input` (string) 宸ュ叿鐨勮緭鍏ワ紝JSON鏍煎紡鐨勫瓧绗︿覆(object)銆傚锛歚{"dalle3": {"prompt": "a cute cat"}}`
+        - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+        - `message_files` (array[string])  褰撳墠agent_thought 鍏宠仈鐨勬枃浠禝D
+          - `file_id` (string) 鏂囦欢ID
+        - `conversation_id` (string) 浼氳瘽ID
+    - `answer` (string)  鍥炵瓟娑堟伅鍐呭
+    - `created_at`  (timestamp) 鍒涘缓鏃堕棿
+    - `feedback` (object) 鍙嶉淇℃伅
+      - `rating` (string) 鐐硅禐 like / 鐐硅俯 dislike
+    - `retriever_resources` (array[RetrieverResource]) 寮曠敤鍜屽綊灞炲垎娈靛垪琛�
+  - `has_more` (bool) 鏄惁瀛樺湪涓嬩竴椤�
+  - `limit` (int) 杩斿洖鏉℃暟锛岃嫢浼犲叆瓒呰繃绯荤粺闄愬埗锛岃繑鍥炵郴缁熼檺鍒舵暟閲�
+  </Col>
+  <Col sticky>
+    ### Request Example
+    <CodeGroup title="Request" tag="GET" label="/messages" targetCode={`curl -X GET '${props.appDetail.api_base_url}/messages?user=abc-123&conversation_id=' \\\n--header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/messages?user=abc-123&conversation_id='
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    ### Response Example(鍩虹鍔╂墜)
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+    "limit": 20,
+    "has_more": false,
+    "data": [
+        {
+            "id": "a076a87f-31e5-48dc-b452-0061adbbc922",
+            "conversation_id": "cd78daf6-f9e4-4463-9ff2-54257230a0ce",
+            "inputs": {
+                "name": "dify"
+            },
+            "query": "iphone 13 pro",
+            "answer": "The iPhone 13 Pro, released on September 24, 2021, features a 6.1-inch display with a resolution of 1170 x 2532. It is equipped with a Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard) processor, 6 GB of RAM, and offers storage options of 128 GB, 256 GB, 512 GB, and 1 TB. The camera is 12 MP, the battery capacity is 3095 mAh, and it runs on iOS 15.",
+            "message_files": [],
+            "feedback": null,
+            "retriever_resources": [
+                {
+                    "position": 1,
+                    "dataset_id": "101b4c97-fc2e-463c-90b1-5261a4cdcafb",
+                    "dataset_name": "iPhone",
+                    "document_id": "8dd1ad74-0b5f-4175-b735-7d98bbbb4e00",
+                    "document_name": "iPhone List",
+                    "segment_id": "ed599c7f-2766-4294-9d1d-e5235a61270a",
+                    "score": 0.98457545,
+                    "content": "\"Model\",\"Release Date\",\"Display Size\",\"Resolution\",\"Processor\",\"RAM\",\"Storage\",\"Camera\",\"Battery\",\"Operating System\"\n\"iPhone 13 Pro Max\",\"September 24, 2021\",\"6.7 inch\",\"1284 x 2778\",\"Hexa-core (2x3.23 GHz Avalanche + 4x1.82 GHz Blizzard)\",\"6 GB\",\"128, 256, 512 GB, 1TB\",\"12 MP\",\"4352 mAh\",\"iOS 15\""
+                }
+            ],
+            "agent_thoughts": [],
+            "created_at": 1705569239
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+
+    ### Response Example(鏅鸿兘鍔╂墜)
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+    "limit": 20,
+    "has_more": false,
+    "data": [
+        {
+            "id": "d35e006c-7c4d-458f-9142-be4930abdf94",
+            "conversation_id": "957c068b-f258-4f89-ba10-6e8a0361c457",
+            "inputs": {},
+            "query": "draw a cat",
+            "answer": "I have generated an image of a cat for you. Please check your messages to view the image.",
+            "message_files": [
+                {
+                    "id": "976990d2-5294-47e6-8f14-7356ba9d2d76",
+                    "type": "image",
+                    "url": "http://127.0.0.1:5001/files/tools/976990d2-5294-47e6-8f14-7356ba9d2d76.png?timestamp=1705988524&nonce=55df3f9f7311a9acd91bf074cd524092&sign=z43nMSO1L2HBvoqADLkRxr7Biz0fkjeDstnJiCK1zh8=",
+                    "belongs_to": "assistant"
+                }
+            ],
+            "feedback": null,
+            "retriever_resources": [],
+            "created_at": 1705988187,
+            "agent_thoughts": [
+                {
+                    "id": "592c84cf-07ee-441c-9dcc-ffc66c033469",
+                    "chain_id": null,
+                    "message_id": "d35e006c-7c4d-458f-9142-be4930abdf94",
+                    "position": 1,
+                    "thought": "",
+                    "tool": "dalle2",
+                    "tool_input": "{\"dalle2\": {\"prompt\": \"cat\"}}",
+                    "created_at": 1705988186,
+                    "observation": "image has been created and sent to user already, you should tell user to check it now.",
+                    "files": [
+                        "976990d2-5294-47e6-8f14-7356ba9d2d76"
+                    ]
+                },
+                {
+                    "id": "73ead60d-2370-4780-b5ed-532d2762b0e5",
+                    "chain_id": null,
+                    "message_id": "d35e006c-7c4d-458f-9142-be4930abdf94",
+                    "position": 2,
+                    "thought": "I have generated an image of a cat for you. Please check your messages to view the image.",
+                    "tool": "",
+                    "tool_input": "",
+                    "created_at": 1705988199,
+                    "observation": "",
+                    "files": []
+                }
+            ]
+        }
+        ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations'
+  method='GET'
+  title='鑾峰彇浼氳瘽鍒楄〃'
+  name='#conversations'
+/>
+<Row>
+  <Col>
+    鑾峰彇褰撳墠鐢ㄦ埛鐨勪細璇濆垪琛紝榛樿杩斿洖鏈�杩戠殑 20 鏉°��
+
+    ### Query
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+      <Property name='last_id' type='string' key='last_id'>
+        锛堥�夊~锛夊綋鍓嶉〉鏈�鍚庨潰涓�鏉¤褰曠殑 ID锛岄粯璁� null
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+        锛堥�夊~锛変竴娆¤姹傝繑鍥炲灏戞潯璁板綍锛岄粯璁� 20 鏉★紝鏈�澶� 100 鏉★紝鏈�灏� 1 鏉°��
+      </Property>
+      <Property name='sort_by' type='string' key='sort_by'>
+        锛堥�夊~锛夋帓搴忓瓧娈碉紝榛樿 -updated_at(鎸夋洿鏂版椂闂村�掑簭鎺掑垪)
+        - 鍙�夊�硷細created_at, -created_at, updated_at, -updated_at
+        - 瀛楁鍓嶉潰鐨勭鍙蜂唬琛ㄩ『搴忔垨鍊掑簭锛�-浠h〃鍊掑簭
+      </Property>
+    </Properties>
+
+    ### Response
+    - `data` (array[object]) 浼氳瘽鍒楄〃
+      - `id`  (string) 浼氳瘽 ID
+      - `name`  (string) 浼氳瘽鍚嶇О锛岄粯璁や负浼氳瘽涓敤鎴锋渶寮�濮嬮棶棰樼殑鎴彇銆�
+      - `inputs` (object) 鐢ㄦ埛杈撳叆鍙傛暟銆�
+      - `status` (string) 浼氳瘽鐘舵��
+      - `introduction` (string) 寮�鍦虹櫧
+      - `created_at` (timestamp) 鍒涘缓鏃堕棿
+      - `updated_at` (timestamp) 鏇存柊鏃堕棿
+    - `has_more` (bool)
+    - `limit` (int) 杩斿洖鏉℃暟锛岃嫢浼犲叆瓒呰繃绯荤粺闄愬埗锛岃繑鍥炵郴缁熼檺鍒舵暟閲�
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/conversations" targetCode={`curl -X GET '${props.appDetail.api_base_url}/conversations?user=abc-123&last_id=&limit=20'\\\n--header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations?user=abc-123&last_id=&limit=20' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "limit": 20,
+      "has_more": false,
+      "data": [
+        {
+          "id": "10799fb8-64f7-4296-bbf7-b42bfbe0ae54",
+          "name": "New chat",
+          "inputs": {
+              "book": "book",
+              "myName": "Lucy"
+          },
+          "status": "normal",
+          "created_at": 1679667915,
+          "updated_at": 1679667915
+        },
+        {
+          "id": "hSIhXBhNe8X1d8Et"
+          // ...
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+<Heading
+  url='/conversations/:conversation_id'
+  method='DELETE'
+  title='鍒犻櫎浼氳瘽'
+  name='#delete'
+/>
+<Row>
+  <Col>
+    鍒犻櫎浼氳瘽銆�
+
+    ### Path
+    - `conversation_id` (string) 浼氳瘽 ID
+
+    ### Request Body
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+    </Properties>
+
+    ### Response
+    - `result` (string) 鍥哄畾杩斿洖 success
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="DELETE" label="/conversations/:conversation_id" targetCode={`curl -X DELETE '${props.appDetail.api_base_url}/conversations/:conversation_id' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+        curl -X DELETE '${props.appDetail.api_base_url}/conversations/{conversation_id}' \
+        --header 'Content-Type: application/json' \
+        --header 'Accept: application/json' \
+        --header 'Authorization: Bearer {api_key}' \
+        --data '{
+            "user": "abc-123"
+        }'
+      ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```text {{ title: 'Response' }}
+    204 No Content
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations/:conversation_id/name'
+  method='POST'
+  title='浼氳瘽閲嶅懡鍚�'
+  name='#rename'
+/>
+<Row>
+  <Col>
+    瀵逛細璇濊繘琛岄噸鍛藉悕锛屼細璇濆悕绉扮敤浜庢樉绀哄湪鏀寔澶氫細璇濈殑瀹㈡埛绔笂銆�
+
+    ### Path
+    - `conversation_id` (string) 浼氳瘽 ID
+
+    ### Request Body
+
+    <Properties>
+      <Property name='name' type='string' key='name'>
+        锛堥�夊~锛夊悕绉帮紝鑻� `auto_generate` 涓� `true` 鏃讹紝璇ュ弬鏁板彲涓嶄紶銆�
+      </Property>
+      <Property name='auto_generate' type='bool' key='auto_generate'>
+        锛堥�夊~锛夎嚜鍔ㄧ敓鎴愭爣棰橈紝榛樿 false銆�
+      </Property>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+    </Properties>
+
+    ### Response
+    - `id`  (string) 浼氳瘽 ID
+    - `name`  (string) 浼氳瘽鍚嶇О
+    - `inputs` (object) 鐢ㄦ埛杈撳叆鍙傛暟
+    - `status` (string) 浼氳瘽鐘舵��
+    - `introduction` (string) 寮�鍦虹櫧
+    - `created_at` (timestamp) 鍒涘缓鏃堕棿
+    - `updated_at` (timestamp) 鏇存柊鏃堕棿
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/conversations/:conversation_id/name" targetCode={`curl -X POST '${props.appDetail.api_base_url}/conversations/:conversation_id/name' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "name": "", \n "auto_generate": true, \n "user": "abc-123"\n}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/conversations/{conversation_id}/name' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "name": "",
+        "auto_generate": true,
+        "user": "abc-123"
+    }'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "34d511d5-56de-4f16-a997-57b379508443",
+      "name": "hello",
+      "inputs": {},
+      "status": "normal",
+      "introduction": "",
+      "created_at": 1732731141,
+      "updated_at": 1732734510
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/conversations/:conversation_id/variables'
+  method='GET'
+  title='鑾峰彇瀵硅瘽鍙橀噺'
+  name='#conversation-variables'
+/>
+<Row>
+  <Col>
+    浠庣壒瀹氬璇濅腑妫�绱㈠彉閲忋�傛绔偣瀵逛簬鎻愬彇瀵硅瘽杩囩▼涓崟鑾风殑缁撴瀯鍖栨暟鎹潪甯告湁鐢ㄣ��
+
+    ### 璺緞鍙傛暟
+
+    <Properties>
+      <Property name='conversation_id' type='string' key='conversation_id'>
+        瑕佷粠涓绱㈠彉閲忕殑瀵硅瘽ID銆�
+      </Property>
+    </Properties>
+
+    ### 鏌ヨ鍙傛暟
+
+    <Properties>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑绗︼紝鐢卞紑鍙戜汉鍛樺畾涔夌殑瑙勫垯锛屽湪搴旂敤绋嬪簭鍐呭繀椤诲敮涓�銆�
+      </Property>
+      <Property name='last_id' type='string' key='last_id'>
+        锛堥�夊~锛夊綋鍓嶉〉鏈�鍚庨潰涓�鏉¤褰曠殑 ID锛岄粯璁� null
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+        锛堥�夊~锛変竴娆¤姹傝繑鍥炲灏戞潯璁板綍锛岄粯璁� 20 鏉★紝鏈�澶� 100 鏉★紝鏈�灏� 1 鏉°��
+      </Property>
+    </Properties>
+
+    ### 鍝嶅簲
+
+    - `limit` (int) 姣忛〉椤圭洰鏁�
+    - `has_more` (bool) 鏄惁鏈夋洿澶氶」鐩�
+    - `data` (array[object]) 鍙橀噺鍒楄〃
+      - `id` (string) 鍙橀噺ID
+      - `name` (string) 鍙橀噺鍚嶇О
+      - `value_type` (string) 鍙橀噺绫诲瀷锛堝瓧绗︿覆銆佹暟瀛椼�佸竷灏旂瓑锛�
+      - `value` (string) 鍙橀噺鍊�
+      - `description` (string) 鍙橀噺鎻忚堪
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴�
+      - `updated_at` (int) 鏈�鍚庢洿鏂版椂闂存埑
+
+    ### 閿欒
+    - 404, `conversation_not_exists`, 瀵硅瘽涓嶅瓨鍦�
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/conversations/:conversation_id/variables" targetCode={`curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123' \\\n--header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Request with variable name filter">
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/conversations/{conversation_id}/variables?user=abc-123&variable_name=customer_name' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "limit": 100,
+      "has_more": false,
+      "data": [
+        {
+          "id": "variable-uuid-1",
+          "name": "customer_name",
+          "value_type": "string",
+          "value": "John Doe",
+          "description": "瀹㈡埛鍚嶇О锛堜粠瀵硅瘽涓彁鍙栵級",
+          "created_at": 1650000000000,
+          "updated_at": 1650000000000
+        },
+        {
+          "id": "variable-uuid-2",
+          "name": "order_details",
+          "value_type": "json",
+          "value": "{\"product\":\"Widget\",\"quantity\":5,\"price\":19.99}",
+          "description": "瀹㈡埛鐨勮鍗曡鎯�",
+          "created_at": 1650000000000,
+          "updated_at": 1650000000000
+        }
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/audio-to-text'
+  method='POST'
+  title='璇煶杞枃瀛�'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    ### Request Body
+    璇ユ帴鍙i渶浣跨敤 `multipart/form-data` 杩涜璇锋眰銆�
+    <Properties>
+      <Property name='file' type='file' key='file'>
+        璇煶鏂囦欢銆�
+        鏀寔鏍煎紡锛歚['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm']`
+        鏂囦欢澶у皬闄愬埗锛�15MB
+      </Property>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+    </Properties>
+
+    ### Response
+    - `text` (string) 杈撳嚭鏂囧瓧
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/audio-to-text" targetCode={`curl -X POST '${props.appDetail.api_base_url}/audio-to-text' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=audio/[mp3|mp4|mpeg|mpga|m4a|wav|webm]`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/conversations/name' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@localfile;type=audio/mp3'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "text": "hello"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/text-to-audio'
+  method='POST'
+  title='鏂囧瓧杞闊�'
+  name='#audio'
+/>
+<Row>
+  <Col>
+    鏂囧瓧杞闊炽��
+
+    ### Request Body
+
+    <Properties>
+      <Property name='message_id' type='str' key='message_id'>
+        Dify 鐢熸垚鐨勬枃鏈秷鎭紝閭d箞鐩存帴浼犻�掔敓鎴愮殑message-id 鍗冲彲锛屽悗鍙颁細閫氳繃 message_id 鏌ユ壘鐩稿簲鐨勫唴瀹圭洿鎺ュ悎鎴愯闊充俊鎭�傚鏋滃悓鏃朵紶 message_id 鍜� text锛屼紭鍏堜娇鐢� message_id銆�
+      </Property>
+      <Property name='text' type='str' key='text'>
+        璇煶鐢熸垚鍐呭銆傚鏋滄病鏈変紶 message-id鐨勮瘽锛屽垯浼氫娇鐢ㄨ繖涓瓧娈电殑鍐呭
+      </Property>
+      <Property name='user' type='string' key='user'>
+        鐢ㄦ埛鏍囪瘑锛岀敱寮�鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+      </Property>
+    </Properties>
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/text-to-audio" targetCode={`curl --location --request POST '${props.appDetail.api_base_url}/text-to-audio' \\\n--header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \\\n--form 'text=浣犲ソDify;user=abc-123;message_id=5ad4cb98-f0c7-4085-b384-88c403be6290`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl --location --request POST '${props.appDetail.api_base_url}/text-to-audio' \
+    --header 'Authorization: Bearer ENTER-YOUR-SECRET-KEY' \
+    --form 'file=浣犲ソDify;user=abc-123;message_id=5ad4cb98-f0c7-4085-b384-88c403be6290'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="headers">
+    ```json {{ title: 'headers' }}
+    {
+      "Content-Type": "audio/wav"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/info'
+  method='GET'
+  title='鑾峰彇搴旂敤鍩烘湰淇℃伅'
+  name='#info'
+/>
+<Row>
+  <Col>
+  鐢ㄤ簬鑾峰彇搴旂敤鐨勫熀鏈俊鎭�
+  ### Response
+  - `name` (string) 搴旂敤鍚嶇О
+  - `description` (string) 搴旂敤鎻忚堪
+  - `tags` (array[string]) 搴旂敤鏍囩
+  </Col>
+  <Col>
+    <CodeGroup title="Request" tag="GET" label="/info" targetCode={`curl -X GET '${props.appDetail.api_base_url}/info' \\\n-H 'Authorization: Bearer {api_key}'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/info' \
+      -H 'Authorization: Bearer {api_key}'
+      ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "name": "My App",
+      "description": "This is my app.",
+      "tags": [
+        "tag1",
+        "tag2"
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/parameters'
+  method='GET'
+  title='鑾峰彇搴旂敤鍙傛暟'
+  name='#parameters'
+/>
+<Row>
+  <Col>
+    鐢ㄤ簬杩涘叆椤甸潰涓�寮�濮嬶紝鑾峰彇鍔熻兘寮�鍏炽�佽緭鍏ュ弬鏁板悕绉般�佺被鍨嬪強榛樿鍊肩瓑浣跨敤銆�
+
+    ### Response
+    - `opening_statement` (string) 寮�鍦虹櫧
+    - `suggested_questions` (array[string]) 寮�鍦烘帹鑽愰棶棰樺垪琛�
+    - `suggested_questions_after_answer` (object) 鍚敤鍥炵瓟鍚庣粰鍑烘帹鑽愰棶棰樸��
+      - `enabled` (bool) 鏄惁寮�鍚�
+    - `speech_to_text` (object) 璇煶杞枃鏈�
+      - `enabled` (bool) 鏄惁寮�鍚�
+    - `retriever_resource` (object) 寮曠敤鍜屽綊灞�
+      - `enabled` (bool) 鏄惁寮�鍚�
+    - `annotation_reply` (object) 鏍囪鍥炲
+      - `enabled` (bool) 鏄惁寮�鍚�
+    - `user_input_form` (array[object]) 鐢ㄦ埛杈撳叆琛ㄥ崟閰嶇疆
+      - `text-input` (object) 鏂囨湰杈撳叆鎺т欢
+        - `label` (string) 鎺т欢灞曠ず鏍囩鍚�
+        - `variable` (string) 鎺т欢 ID
+        - `required` (bool) 鏄惁蹇呭~
+        - `default` (string) 榛樿鍊�
+      - `paragraph` (object) 娈佃惤鏂囨湰杈撳叆鎺т欢
+        - `label` (string) 鎺т欢灞曠ず鏍囩鍚�
+        - `variable` (string) 鎺т欢 ID
+        - `required` (bool) 鏄惁蹇呭~
+        - `default` (string) 榛樿鍊�
+      - `select` (object) 涓嬫媺鎺т欢
+        - `label` (string) 鎺т欢灞曠ず鏍囩鍚�
+        - `variable` (string) 鎺т欢 ID
+        - `required` (bool) 鏄惁蹇呭~
+        - `default` (string) 榛樿鍊�
+        - `options` (array[string]) 閫夐」鍊�
+    - `file_upload` (object) 鏂囦欢涓婁紶閰嶇疆
+      - `image` (object) 鍥剧墖璁剧疆
+        褰撳墠浠呮敮鎸佸浘鐗囩被鍨嬶細`png`, `jpg`, `jpeg`, `webp`, `gif`
+        - `enabled` (bool) 鏄惁寮�鍚�
+        - `number_limits` (int) 鍥剧墖鏁伴噺闄愬埗锛岄粯璁� 3
+        - `transfer_methods` (array[string]) 浼犻�掓柟寮忓垪琛紝remote_url , local_file锛屽繀閫変竴涓�
+    - `system_parameters` (object) 绯荤粺鍙傛暟
+      - `file_size_limit` (int) 鏂囨。涓婁紶澶у皬闄愬埗 (MB)
+      - `image_file_size_limit` (int) 鍥剧墖鏂囦欢涓婁紶澶у皬闄愬埗锛圡B锛�
+      - `audio_file_size_limit` (int) 闊抽鏂囦欢涓婁紶澶у皬闄愬埗 (MB)
+      - `video_file_size_limit` (int) 瑙嗛鏂囦欢涓婁紶澶у皬闄愬埗 (MB)
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/parameters" targetCode={` curl -X GET '${props.appDetail.api_base_url}/parameters'\\\n--header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/parameters' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "introduction": "nice to meet you",
+      "user_input_form": [
+        {
+          "text-input": {
+            "label": "a",
+            "variable": "a",
+            "required": true,
+            "max_length": 48,
+            "default": ""
+          }
+        },
+        {
+          // ...
+        }
+      ],
+      "file_upload": {
+        "image": {
+          "enabled": true,
+          "number_limits": 3,
+          "transfer_methods": [
+            "remote_url",
+            "local_file"
+          ]
+        }
+      },
+      "system_parameters": {
+          "file_size_limit": 15,
+          "image_file_size_limit": 10,
+          "audio_file_size_limit": 50,
+          "video_file_size_limit": 100
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/meta'
+  method='GET'
+  title='鑾峰彇搴旂敤Meta淇℃伅'
+  name='#meta'
+/>
+<Row>
+  <Col>
+  鐢ㄤ簬鑾峰彇宸ュ叿icon
+  ### Response
+  - `tool_icons`(object[string]) 宸ュ叿鍥炬爣
+    - `宸ュ叿鍚嶇О` (string)
+      - `icon` (object|string)
+        - (object) 鍥炬爣
+          - `background` (string) hex鏍煎紡鐨勮儗鏅壊
+          - `content`(string) emoji
+        - (string) 鍥炬爣URL
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="POST" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/meta' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/meta' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "tool_icons": {
+          "dalle2": "https://cloud.dify.ai/console/api/workspaces/current/tool-provider/builtin/dalle/icon",
+          "api_tool": {
+              "background": "#252525",
+              "content": "\ud83d\ude01"
+          }
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/site'
+  method='GET'
+  title='鑾峰彇搴旂敤 WebApp 璁剧疆'
+  name='#site'
+/>
+<Row>
+  <Col>
+  鐢ㄤ簬鑾峰彇搴旂敤鐨� WebApp 璁剧疆
+  ### Response
+  - `title` (string) WebApp 鍚嶇О
+  - `chat_color_theme` (string) 鑱婂ぉ棰滆壊涓婚, hex 鏍煎紡
+  - `chat_color_theme_inverted` (bool) 鑱婂ぉ棰滆壊涓婚鏄惁鍙嶈浆
+  - `icon_type` (string) 鍥炬爣绫诲瀷, `emoji`-琛ㄦ儏, `image`-鍥剧墖
+  - `icon` (string) 鍥炬爣, 濡傛灉鏄� `emoji` 绫诲瀷, 鍒欐槸 emoji 琛ㄦ儏绗﹀彿, 濡傛灉鏄� `image` 绫诲瀷, 鍒欐槸鍥剧墖 URL
+  - `icon_background` (string) hex 鏍煎紡鐨勮儗鏅壊
+  - `icon_url` (string) 鍥炬爣 URL
+  - `description` (string) 鎻忚堪
+  - `copyright` (string) 鐗堟潈淇℃伅
+  - `privacy_policy` (string) 闅愮鏀跨瓥閾炬帴
+  - `custom_disclaimer` (string) 鑷畾涔夊厤璐e0鏄�
+  - `default_language` (string) 榛樿璇█
+  - `show_workflow_steps` (bool) 鏄惁鏄剧ず宸ヤ綔娴佽鎯�
+  - `use_icon_as_answer_icon` (bool) 鏄惁浣跨敤 WebApp 鍥炬爣鏇挎崲鑱婂ぉ涓殑 馃
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="POST" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/site' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/site' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "title": "My App",
+      "chat_color_theme": "#ff4a4a",
+      "chat_color_theme_inverted": false,
+      "icon_type": "emoji",
+      "icon": "馃槃",
+      "icon_background": "#FFEAD5",
+      "icon_url": null,
+      "description": "This is my app.",
+      "copyright": "all rights reserved",
+      "privacy_policy": "",
+      "custom_disclaimer": "All generated by AI",
+      "default_language": "en-US",
+      "show_workflow_steps": false,
+      "use_icon_as_answer_icon": false,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+___
diff --git a/app/components/develop/template/template_workflow.en.mdx b/app/components/develop/template/template_workflow.en.mdx
new file mode 100644
index 0000000..2afcedc
--- /dev/null
+++ b/app/components/develop/template/template_workflow.en.mdx
@@ -0,0 +1,792 @@
+import { CodeGroup } from '../code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty, Paragraph } from '../md.tsx'
+
+# Workflow App API
+
+Workflow applications offers non-session support and is ideal for translation, article writing, summarization AI, and more.
+
+<div>
+  ### Base URL
+  <CodeGroup title="Code" targetCode={props.appDetail.api_base_url}>
+    ```javascript
+    ```
+  </CodeGroup>
+
+  ### Authentication
+
+  The Service API uses `API-Key` authentication.
+  <i>**Strongly recommend storing your API Key on the server-side, not shared or stored on the client-side, to avoid possible API-Key leakage that can lead to serious consequences.**</i>
+
+  For all API requests, include your API Key in the `Authorization` HTTP Header, as shown below:
+
+  <CodeGroup title="Code">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+
+    ```
+  </CodeGroup>
+</div>
+
+---
+
+<Heading
+  url='/workflows/run'
+  method='POST'
+  title='Execute Workflow'
+  name='#Execute-Workflow'
+/>
+<Row>
+  <Col>
+    Execute workflow, cannot be executed without a published workflow.
+
+    ### Request Body
+      - `inputs` (object) Required
+        Allows the entry of various variable values defined by the App.
+        The `inputs` parameter contains multiple key/value pairs, with each key corresponding to a specific variable and each value being the specific value for that variable.
+        The workflow application requires at least one key/value pair to be inputted. The variable can be of File Array type.
+        File Array type variable is suitable for inputting files combined with text understanding and answering questions, available only when the model supports file parsing and understanding capability.
+        If the variable is of File Array type, the corresponding value should be a list whose elements contain following attributions: 
+          - `type` (string) Supported type: 
+            - `document` ('TXT', 'MD', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB')
+            - `image` ('JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG')
+            - `audio` ('MP3', 'M4A', 'WAV', 'WEBM', 'AMR')
+            - `video` ('MP4', 'MOV', 'MPEG', 'MPGA')
+            - `custom` (Other file types)
+          - `transfer_method` (string) Transfer method, `remote_url` for image URL / `local_file` for file upload
+          - `url` (string) Image URL (when the transfer method is `remote_url`)
+          - `upload_file_id` (string) Uploaded file ID, which must be obtained by uploading through the File Upload API in advance (when the transfer method is `local_file`)
+
+      - `response_mode` (string) Required
+        The mode of response return, supporting:
+        - `streaming` Streaming mode (recommended), implements a typewriter-like output through SSE ([Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)).
+        - `blocking` Blocking mode, returns result after execution is complete. (Requests may be interrupted if the process is long)
+        <i>Due to Cloudflare restrictions, the request will be interrupted without a return after 100 seconds.</i>
+      - `user` (string) Required
+        User identifier, used to define the identity of the end-user for retrieval and statistics.
+        Should be uniquely defined by the developer within the application.
+
+    ### Response
+    When `response_mode` is `blocking`, return a CompletionResponse object.
+    When `response_mode` is `streaming`, return a ChunkCompletionResponse stream.
+
+    ### CompletionResponse
+    Returns the App result, `Content-Type` is `application/json`.
+    - `workflow_run_id` (string) Unique ID of workflow execution
+    - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+    - `data` (object) detail of result
+      - `id` (string) ID of workflow execution
+      - `workflow_id` (string) ID of related workflow
+      - `status` (string) status of execution, `running` / `succeeded` / `failed` / `stopped`
+      - `outputs` (json) Optional content of output
+      - `error` (string) Optional reason of error
+      - `elapsed_time` (float) Optional total seconds to be used
+      - `total_tokens` (int) Optional tokens to be used
+      - `total_steps` (int) default 0
+      - `created_at` (timestamp) start time
+      - `finished_at` (timestamp) end time
+
+    ### ChunkCompletionResponse
+    Returns the stream chunks outputted by the App, `Content-Type` is `text/event-stream`.
+    Each streaming chunk starts with `data:`, separated by two newline characters `\n\n`, as shown below:
+    <CodeGroup>
+    ```streaming {{ title: 'Response' }}
+    data: {"event": "text_chunk", "workflow_run_id": "b85e5fc5-751b-454d-b14e-dc5f240b0a31", "task_id": "bd029338-b068-4d34-a331-fc85478922c2", "data": {"text": "\u4e3a\u4e86", "from_variable_selector": ["1745912968134", "text"]}}\n\n
+    ```
+    </CodeGroup>
+    The structure of the streaming chunks varies depending on the `event`:
+    - `event: workflow_started` workflow starts execution
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `workflow_run_id` (string) Unique ID of workflow execution
+      - `event` (string) fixed to `workflow_started`
+      - `data` (object) detail
+        - `id` (string) Unique ID of workflow execution
+        - `workflow_id` (string) ID of related workflow
+        - `sequence_number` (int) Self-increasing serial number, self-increasing in the App, starting from 1
+        - `created_at` (timestamp) Creation timestamp, e.g., 1705395332
+    - `event: node_started` node execution started
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `workflow_run_id` (string) Unique ID of workflow execution
+      - `event` (string) fixed to `node_started`
+      - `data` (object) detail
+        - `id` (string) Unique ID of workflow execution
+        - `node_id` (string) ID of node
+        - `node_type` (string) type of node
+        - `title` (string) name of node
+        - `index` (int) Execution sequence number, used to display Tracing Node sequence
+        - `predecessor_node_id` (string) optional Prefix node ID, used for canvas display execution path
+        - `inputs` (object) Contents of all preceding node variables used in the node
+        - `created_at` (timestamp) timestamp of start, e.g., 1705395332
+    - `event: text_chunk` Text fragment  
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API 
+      - `workflow_run_id` (string) Unique ID of workflow execution 
+      - `event` (string) fixed to `text_chunk`
+      - `data` (object) detail
+        - `text` (string) Text content
+        - `from_variable_selector` (array) Text source path, helping developers understand which node and variable generated the text
+    - `event: node_finished` node execution ends, success or failure in different states in the same event
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `workflow_run_id` (string) Unique ID of workflow execution
+      - `event` (string) fixed to `node_finished`
+      - `data` (object) detail
+        - `id` (string) Unique ID of workflow execution
+        - `node_id` (string) ID of node
+        - `node_type` (string) type of node
+        - `title` (string) name of node
+        - `index` (int) Execution sequence number, used to display Tracing Node sequence
+        - `predecessor_node_id` (string) optional Prefix node ID, used for canvas display execution path
+        - `inputs` (object) Contents of all preceding node variables used in the node
+        - `process_data` (json) Optional node process data
+        - `outputs` (json) Optional content of output
+        - `status` (string) status of execution, `running` / `succeeded` / `failed` / `stopped`
+        - `error` (string) Optional reason of error
+        - `elapsed_time` (float) Optional total seconds to be used
+        - `execution_metadata` (json) meta data
+          - `total_tokens` (int) optional tokens to be used
+          - `total_price` (decimal) optional Total cost
+          - `currency` (string) optional e.g. `USD` / `RMB`
+        - `created_at` (timestamp) timestamp of start, e.g., 1705395332
+    - `event: workflow_finished` workflow execution ends, success or failure in different states in the same event
+      - `task_id` (string) Task ID, used for request tracking and the below Stop Generate API
+      - `workflow_run_id` (string) Unique ID of workflow execution
+      - `event` (string) fixed to `workflow_finished`
+      - `data` (object) detail
+        - `id` (string) ID of workflow execution
+        - `workflow_id` (string) ID of related workflow
+        - `status` (string) status of execution, `running` / `succeeded` / `failed` / `stopped`
+        - `outputs` (json) Optional content of output
+        - `error` (string) Optional reason of error
+        - `elapsed_time` (float) Optional total seconds to be used
+        - `total_tokens` (int) Optional tokens to be used
+        - `total_steps` (int) default 0
+        - `created_at` (timestamp) start time
+        - `finished_at` (timestamp) end time
+    - `event: tts_message` TTS audio stream event, that is, speech synthesis output. The content is an audio block in Mp3 format, encoded as a base64 string. When playing, simply decode the base64 and feed it into the player. (This message is available only when auto-play is enabled)
+      - `task_id` (string) Task ID, used for request tracking and the stop response interface below
+      - `message_id` (string) Unique message ID
+      - `audio` (string) The audio after speech synthesis, encoded in base64 text content, when playing, simply decode the base64 and feed it into the player
+      - `created_at` (int) Creation timestamp, e.g.: 1705395332
+    - `event: tts_message_end` TTS audio stream end event, receiving this event indicates the end of the audio stream.
+      - `task_id` (string) Task ID, used for request tracking and the stop response interface below
+      - `message_id` (string) Unique message ID
+      - `audio` (string) The end event has no audio, so this is an empty string
+      - `created_at` (int) Creation timestamp, e.g.: 1705395332
+    - `event: ping` Ping event every 10 seconds to keep the connection alive.
+
+    ### Errors
+    - 400, `invalid_param`, abnormal parameter input
+    - 400, `app_unavailable`, App configuration unavailable
+    - 400, `provider_not_initialize`, no available model credential configuration
+    - 400, `provider_quota_exceeded`, model invocation quota insufficient
+    - 400, `model_currently_not_support`, current model unavailable
+    - 400, `workflow_request_error`, workflow execution failed
+    - 500, internal server error
+
+  </Col>
+  <Col sticky>
+     <CodeGroup title="Request" tag="POST" label="/workflows/run" targetCode={`curl -X POST '${props.appDetail.api_base_url}/workflows/run' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "inputs": ${JSON.stringify(props.inputs)},\n    "response_mode": "streaming",\n    "user": "abc-123"\n}'\n`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/workflows/run' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "inputs": {},
+        "response_mode": "streaming",
+        "user": "abc-123"
+    }'
+    ```
+
+    </CodeGroup>
+    <CodeGroup title="Example: file array as an input variable">
+      ```json {{ title: 'File variable example' }}
+      {
+        "inputs": {
+          "{variable_name}": 
+          [
+            {
+            "transfer_method": "local_file",
+            "upload_file_id": "{upload_file_id}",
+            "type": "{document_type}"
+            }
+          ]
+        }
+      }
+      ```
+    </CodeGroup>
+    ### Blocking Mode
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+        "workflow_run_id": "djflajgkldjgd",
+        "task_id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "data": {
+            "id": "fdlsjfjejkghjda",
+            "workflow_id": "fldjaslkfjlsda",
+            "status": "succeeded",
+            "outputs": {
+              "text": "Nice to meet you."
+            },
+            "error": null,
+            "elapsed_time": 0.875,
+            "total_tokens": 3562,
+            "total_steps": 8,
+            "created_at": 1705407629,
+            "finished_at": 1727807631
+        }
+    }
+    ```
+    </CodeGroup>
+    ### Streaming Mode
+    <CodeGroup title="Response">
+    ```streaming {{ title: 'Response' }}
+      data: {"event": "workflow_started", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "workflow_id": "dfjasklfjdslag", "sequence_number": 1, "created_at": 1679586595}}
+      data: {"event": "node_started", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "node_id": "dfjasklfjdslag", "node_type": "start", "title": "Start", "index": 0, "predecessor_node_id": "fdljewklfklgejlglsd", "inputs": {}, "created_at": 1679586595}}
+      data: {"event": "node_finished", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "node_id": "dfjasklfjdslag", "node_type": "start", "title": "Start", "index": 0, "predecessor_node_id": "fdljewklfklgejlglsd", "inputs": {}, "outputs": {}, "status": "succeeded", "elapsed_time": 0.324, "execution_metadata": {"total_tokens": 63127864, "total_price": 2.378, "currency": "USD"},  "created_at": 1679586595}}
+      data: {"event": "workflow_finished", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "workflow_id": "dfjasklfjdslag", "outputs": {}, "status": "succeeded", "elapsed_time": 0.324, "total_tokens": 63127864, "total_steps": "1", "created_at": 1679586595, "finished_at": 1679976595}}
+      data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+      data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+    ```
+    </CodeGroup>
+    <CodeGroup title="File upload sample code">
+      ```json {{ title: 'File upload sample code' }}
+      import requests
+      import json
+
+      def upload_file(file_path, user):
+          upload_url = "https://api.dify.ai/v1/files/upload"
+          headers = {
+              "Authorization": "Bearer app-xxxxxxxx",
+          }
+          
+          try:
+              print("Upload file...")
+              with open(file_path, 'rb') as file:
+                  files = {
+                      'file': (file_path, file, 'text/plain')  # Make sure the file is uploaded with the appropriate MIME type
+                  }
+                  data = {
+                      "user": user,
+                      "type": "TXT"  # Set the file type to TXT
+                  }
+                  
+                  response = requests.post(upload_url, headers=headers, files=files, data=data)
+                  if response.status_code == 201:  # 201 means creation is successful
+                      print("File uploaded successfully")
+                      return response.json().get("id")  # Get the uploaded file ID
+                  else:
+                      print(f"File upload failed, status code: {response.status_code}")
+                      return None
+          except Exception as e:
+              print(f"Error occurred: {str(e)}")
+              return None
+
+      def run_workflow(file_id, user, response_mode="blocking"):
+          workflow_url = "https://api.dify.ai/v1/workflows/run"
+          headers = {
+              "Authorization": "Bearer app-xxxxxxxxx",
+              "Content-Type": "application/json"
+          }
+
+          data = {
+              "inputs": {
+                  "orig_mail": [{
+                      "transfer_method": "local_file",
+                      "upload_file_id": file_id,
+                      "type": "document"
+                  }]
+              },
+              "response_mode": response_mode,
+              "user": user
+          }
+
+          try:
+              print("Run Workflow...")
+              response = requests.post(workflow_url, headers=headers, json=data)
+              if response.status_code == 200:
+                  print("Workflow execution successful")
+                  return response.json()
+              else:
+                  print(f"Workflow execution failed, status code: {response.status_code}")
+                  return {"status": "error", "message": f"Failed to execute workflow, status code: {response.status_code}"}
+          except Exception as e:
+              print(f"Error occurred: {str(e)}")
+              return {"status": "error", "message": str(e)}
+
+      # Usage Examples
+      file_path = "{your_file_path}"
+      user = "difyuser"
+
+      # Upload files
+      file_id = upload_file(file_path, user)
+      if file_id:
+          # The file was uploaded successfully, and the workflow continues to run
+          result = run_workflow(file_id, user)
+          print(result)
+      else:
+          print("File upload failed and workflow cannot be executed")
+      ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/workflows/run/:workflow_id'
+  method='GET'
+  title='Get Workflow Run Detail'
+  name='#get-workflow-run-detail'
+/>
+<Row>
+  <Col>
+    Retrieve the current execution results of a workflow task based on the workflow execution ID.
+    ### Path
+    - `workflow_id` (string) Workflow ID, can be obtained from the streaming chunk return
+    ### Response
+    - `id` (string) ID of workflow execution
+    - `workflow_id` (string) ID of related workflow
+    - `status` (string) status of execution, `running` / `succeeded` / `failed` / `stopped`
+    - `inputs` (json) content of input
+    - `outputs` (json) content of output
+    - `error` (string) reason of error
+    - `total_steps` (int) total steps of task
+    - `total_tokens` (int) total tokens to be used
+    - `created_at` (timestamp) start time
+    - `finished_at` (timestamp) end time
+    - `elapsed_time` (float) total seconds to be used
+  </Col>
+  <Col sticky>
+    ### Request Example
+    <CodeGroup title="Request" tag="GET" label="/workflows/run/:workflow_id" targetCode={`curl -X GET '${props.appDetail.api_base_url}/workflows/run/:workflow_id' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/workflows/run/:workflow_id' \
+      -H 'Authorization: Bearer {api_key}' \
+      -H 'Content-Type: application/json'
+      ```
+    </CodeGroup>
+
+    ### Response Example
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+        "id": "b1ad3277-089e-42c6-9dff-6820d94fbc76",
+        "workflow_id": "19eff89f-ec03-4f75-b0fc-897e7effea02",
+        "status": "succeeded",
+        "inputs": "{\"sys.files\": [], \"sys.user_id\": \"abc-123\"}",
+        "outputs": null,
+        "error": null,
+        "total_steps": 3,
+        "total_tokens": 0,
+        "created_at": 1705407629,
+        "finished_at": 1727807631,
+        "elapsed_time": 30.098514399956912
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/workflows/tasks/:task_id/stop'
+  method='POST'
+  title='Stop Generate'
+  name='#stop-generatebacks'
+/>
+<Row>
+  <Col>
+  Only supported in streaming mode.
+  ### Path
+  - `task_id` (string) Task ID, can be obtained from the streaming chunk return
+  ### Request Body
+  - `user` (string) Required
+    User identifier, used to define the identity of the end-user, must be consistent with the user passed in the send message interface.
+  ### Response
+  - `result` (string) Always returns "success"
+  </Col>
+  <Col sticky>
+  ### Request Example
+  <CodeGroup title="Request" tag="POST" label="/workflows/tasks/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/workflows/tasks/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/workflows/tasks/:task_id/stop' \
+    -H 'Authorization: Bearer {api_key}' \
+    -H 'Content-Type: application/json' \
+    --data-raw '{
+        "user": "abc-123"
+    }'
+    ```
+    </CodeGroup>
+
+    ### Response Example
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/files/upload'
+  method='POST'
+  title='File Upload'
+  name='#file-upload'
+/>
+<Row>
+  <Col>
+  Upload a file for use when sending messages, enabling multimodal understanding of images and text.
+  Supports any formats that are supported by your workflow.
+  Uploaded files are for use by the current end-user only.
+
+  ### Request Body
+  This interface requires a `multipart/form-data` request.
+  - `file` (File) Required
+    The file to be uploaded.
+  - `user` (string) Required
+    User identifier, defined by the developer's rules, must be unique within the application.
+
+  ### Response
+  After a successful upload, the server will return the file's ID and related information.
+  - `id` (uuid) ID
+  - `name` (string) File name
+  - `size` (int) File size (bytes)
+  - `extension` (string) File extension
+  - `mime_type` (string) File mime-type
+  - `created_by` (uuid) End-user ID
+  - `created_at` (timestamp) Creation timestamp, e.g., 1705395332
+
+  ### Errors
+  - 400, `no_file_uploaded`, a file must be provided
+  - 400, `too_many_files`, currently only one file is accepted
+  - 400, `unsupported_preview`, the file does not support preview
+  - 400, `unsupported_estimate`, the file does not support estimation
+  - 413, `file_too_large`, the file is too large
+  - 415, `unsupported_file_type`, unsupported extension, currently only document files are accepted
+  - 503, `s3_connection_failed`, unable to connect to S3 service
+  - 503, `s3_permission_denied`, no permission to upload files to S3
+  - 503, `s3_file_too_large`, file exceeds S3 size limit
+  - 500, internal server error
+
+
+  </Col>
+  <Col sticky>
+  ### Request Example
+  <CodeGroup title="Request" tag="POST" label="/files/upload" targetCode={`curl -X POST '${props.appDetail.api_base_url}/files/upload' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=image/[png|jpeg|jpg|webp|gif] \\\n--form 'user=abc-123'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/files/upload' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@"/path/to/file"'
+    ```
+
+    </CodeGroup>
+
+
+  ### Response Example
+  <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "72fa9618-8f89-4a37-9b33-7e1178a24a67",
+      "name": "example.png",
+      "size": 1024,
+      "extension": "png",
+      "mime_type": "image/png",
+      "created_by": "6ad1ab0a-73ff-4ac1-b9e4-cdb312f71f13",
+      "created_at": 1577836800,
+    }
+  ```
+  </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/workflows/logs'
+  method='GET'
+  title='Get Workflow Logs'
+  name='#Get-Workflow-Logs'
+/>
+<Row>
+  <Col>
+    Returns workflow logs, with the first page returning the latest `{limit}` messages, i.e., in reverse order.
+
+    ### Query
+
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        Keyword to search
+      </Property>
+      <Property name='status' type='string' key='status'>
+        succeeded/failed/stopped
+      </Property>
+      <Property name='page' type='int' key='page'>
+        current page, default is 1.
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+          How many chat history messages to return in one request, default is 20.
+      </Property>
+    </Properties>
+
+    ### Response
+  - `page` (int) Current page
+  - `limit` (int) Number of returned items, if input exceeds system limit, returns system limit amount
+  - `total` (int) Number of total items
+  - `has_more` (bool) Whether there is a next page
+  - `data` (array[object]) Log list
+    - `id` (string) ID
+    - `workflow_run` (object) Workflow run
+      - `id` (string) ID
+      - `version` (string) Version
+      - `status` (string) status of execution, `running` / `succeeded` / `failed` / `stopped`
+      - `error` (string) Optional reason of error
+      - `elapsed_time` (float) total seconds to be used
+      - `total_tokens` (int) tokens to be used
+      - `total_steps` (int) default 0
+      - `created_at` (timestamp) start time
+      - `finished_at` (timestamp) end time
+    - `created_from` (string) Created from
+    - `created_by_role` (string) Created by role
+    - `created_by_account` (string) Optional Created by account
+    - `created_by_end_user` (object) Created by end user
+      - `id` (string) ID
+      - `type` (string) Type
+      - `is_anonymous` (bool) Is anonymous
+      - `session_id` (string) Session ID
+    - `created_at` (timestamp) create time
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/workflows/logs" targetCode={`curl -X GET '${props.appDetail.api_base_url}/workflows/logs'\\\n --header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/workflows/logs?limit=1'
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+    ### Response Example
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+        "page": 1,
+        "limit": 1,
+        "total": 7,
+        "has_more": true,
+        "data": [
+            {
+                "id": "e41b93f1-7ca2-40fd-b3a8-999aeb499cc0",
+                "workflow_run": {
+                    "id": "c0640fc8-03ef-4481-a96c-8a13b732a36e",
+                    "version": "2024-08-01 12:17:09.771832",
+                    "status": "succeeded",
+                    "error": null,
+                    "elapsed_time": 1.3588523610014818,
+                    "total_tokens": 0,
+                    "total_steps": 3,
+                    "created_at": 1726139643,
+                    "finished_at": 1726139644
+                },
+                "created_from": "service-api",
+                "created_by_role": "end_user",
+                "created_by_account": null,
+                "created_by_end_user": {
+                    "id": "7f7d9117-dd9d-441d-8970-87e5e7e687a3",
+                    "type": "service_api",
+                    "is_anonymous": false,
+                    "session_id": "abc-123"
+                },
+                "created_at": 1726139644
+            }
+        ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/info'
+  method='GET'
+  title='Get Application Basic Information'
+  name='#info'
+/>
+<Row>
+  <Col>
+  Used to get basic information about this application
+
+  ### Response
+  - `name` (string) application name
+  - `description` (string) application description
+  - `tags` (array[string]) application tags
+  </Col>
+  <Col>
+    <CodeGroup title="Request" tag="GET" label="/info" targetCode={`curl -X GET '${props.appDetail.api_base_url}/info' \\\n-H 'Authorization: Bearer {api_key}'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/info' \
+      -H 'Authorization: Bearer {api_key}'
+      ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "name": "My App",
+      "description": "This is my app.",
+      "tags": [
+        "tag1",
+        "tag2"
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/parameters'
+  method='GET'
+  title='Get Application Parameters Information'
+  name='#parameters'
+/>
+<Row>
+  <Col>
+    Used at the start of entering the page to obtain information such as features, input parameter names, types, and default values.
+
+    ### Response
+    - `user_input_form` (array[object]) User input form configuration
+      - `text-input` (object) Text input control
+        - `label` (string) Variable display label name
+        - `variable` (string) Variable ID
+        - `required` (bool) Whether it is required
+        - `default` (string) Default value
+      - `paragraph` (object) Paragraph text input control
+        - `label` (string) Variable display label name
+        - `variable` (string) Variable ID
+        - `required` (bool) Whether it is required
+        - `default` (string) Default value
+      - `select` (object) Dropdown control
+        - `label` (string) Variable display label name
+        - `variable` (string) Variable ID
+        - `required` (bool) Whether it is required
+        - `default` (string) Default value
+        - `options` (array[string]) Option values
+    - `file_upload` (object) File upload configuration
+      - `image` (object) Image settings
+        Currently only supports image types: `png`, `jpg`, `jpeg`, `webp`, `gif`
+        - `enabled` (bool) Whether it is enabled
+        - `number_limits` (int) Image number limit, default is 3
+        - `transfer_methods` (array[string]) List of transfer methods, remote_url, local_file, must choose one
+    - `system_parameters` (object) System parameters
+      - `file_size_limit` (int) Document upload size limit (MB)
+      - `image_file_size_limit` (int) Image file upload size limit (MB)
+      - `audio_file_size_limit` (int) Audio file upload size limit (MB)
+      - `video_file_size_limit` (int) Video file upload size limit (MB)
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/parameters" targetCode={` curl -X GET '${props.appDetail.api_base_url}/parameters'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/parameters' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "user_input_form": [
+          {
+              "paragraph": {
+                  "label": "Query",
+                  "variable": "query",
+                  "required": true,
+                  "default": ""
+              }
+          }
+      ],
+      "file_upload": {
+          "image": {
+              "enabled": false,
+              "number_limits": 3,
+              "detail": "high",
+              "transfer_methods": [
+                  "remote_url",
+                  "local_file"
+              ]
+          }
+      },
+      "system_parameters": {
+          "file_size_limit": 15,
+          "image_file_size_limit": 10,
+          "audio_file_size_limit": 50,
+          "video_file_size_limit": 100
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/site'
+  method='GET'
+  title='Get Application WebApp Settings'
+  name='#site'
+/>
+<Row>
+  <Col>
+  Used to get the WebApp settings of the application.
+  ### Response
+  - `title` (string) WebApp name
+  - `icon_type` (string) Icon type, `emoji` - emoji, `image` - picture
+  - `icon` (string) Icon. If it's `emoji` type, it's an emoji symbol; if it's `image` type, it's an image URL.
+  - `icon_background` (string) Background color in hex format
+  - `icon_url` (string) Icon URL
+  - `description` (string) Description
+  - `copyright` (string) Copyright information
+  - `privacy_policy` (string) Privacy policy link
+  - `custom_disclaimer` (string) Custom disclaimer
+  - `default_language` (string) Default language
+  - `show_workflow_steps` (bool) Whether to show workflow details
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="POST" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/site' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/site' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "title": "My App",
+      "icon_type": "emoji",
+      "icon": "馃槃",
+      "icon_background": "#FFEAD5",
+      "icon_url": null,
+      "description": "This is my app.",
+      "copyright": "all rights reserved",
+      "privacy_policy": "",
+      "custom_disclaimer": "All generated by AI",
+      "default_language": "en-US",
+      "show_workflow_steps": false,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+___
diff --git a/app/components/develop/template/template_workflow.ja.mdx b/app/components/develop/template/template_workflow.ja.mdx
new file mode 100644
index 0000000..b6afea9
--- /dev/null
+++ b/app/components/develop/template/template_workflow.ja.mdx
@@ -0,0 +1,796 @@
+import { CodeGroup } from '../code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty, Paragraph } from '../md.tsx'
+
+# 銉兗銈儠銉兗銈€儣銉狝PI
+
+銉兗銈儠銉兗銈€儣銉偙銉笺偡銉с兂銇�併偦銉冦偡銉с兂銈掋偟銉濄兗銉堛仜銇氥�佺炕瑷炽�佽浜嬩綔鎴愩�佽绱凙I銇仼銇渶閬┿仹銇欍��
+
+<div>
+  ### 銉欍兗銈筓RL
+  <CodeGroup title="銈炽兗銉�" targetCode={props.appDetail.api_base_url}>
+    ```javascript
+    ```
+  </CodeGroup>
+
+  ### 瑾嶈
+
+  銈点兗銉撱偣API銇痐API-Key`瑾嶈銈掍娇鐢ㄣ仐銇俱仚銆�
+  <i>**API銈兗銇紡娲┿倰闃层亹銇熴倎銆丄PI銈兗銇偗銉┿偆銈€兂銉堝伌銇у叡鏈夈伨銇熴伅淇濆瓨銇涖仛銆併偟銉笺儛銉煎伌銇т繚瀛樸仚銈嬨亾銇ㄣ倰寮枫亸銇婂嫥銈併仐銇俱仚銆�**</i>
+
+  銇欍伖銇︺伄API銉偗銈ㄣ偣銉堛伀銇娿亜銇︺�佷互涓嬨伄銈堛亞銇玚Authorization`HTTP銉樸儍銉�銉笺伀API銈兗銈掑惈銈併仸銇忋仩銇曘亜锛�
+
+  <CodeGroup title="銈炽兗銉�">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+
+    ```
+  </CodeGroup>
+</div>
+
+---
+
+<Heading
+  url='/workflows/run'
+  method='POST'
+  title='銉兗銈儠銉兗銈掑疅琛�'
+  name='#Execute-Workflow'
+/>
+<Row>
+  <Col>
+    銉兗銈儠銉兗銈掑疅琛屻仐銇俱仚銆傚叕闁嬨仌銈屻仧銉兗銈儠銉兗銇屻仾銇勩仺瀹熻銇с亶銇俱仜銈撱��
+
+    ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+      - `inputs` (object) 蹇呴爤
+        銈€儣銉仹瀹氱京銇曘倢銇熴仌銇俱仏銇俱仾澶夋暟鍊ゃ伄鍏ュ姏銈掕ū鍙仐銇俱仚銆�
+        `inputs`銉戙儵銉°兗銈裤伀銇鏁般伄銈兗/鍊ゃ儦銈€亴鍚伨銈屻�佸悇銈兗銇壒瀹氥伄澶夋暟銇蹇溿仐銆佸悇鍊ゃ伅銇濄伄澶夋暟銇壒瀹氥伄鍊ゃ仹銇欍��
+        銉兗銈儠銉兗銈€儣銉偙銉笺偡銉с兂銇皯銇亸銇ㄣ倐1銇ゃ伄銈兗/鍊ゃ儦銈€伄鍏ュ姏銈掑繀瑕併仺銇椼伨銇欍�傚�ゃ伅銉曘偂銈ゃ儷銉偣銉堛仹銇傘倠鍫村悎銈傘亗銈娿伨銇欍��
+        銉曘偂銈ゃ儷銉偣銉堛伅銆併儐銈偣銉堢悊瑙c仺璩晱銇搞伄鍥炵瓟銈掔祫銇垮悎銈忋仜銇熴儠銈°偆銉伄鍏ュ姏銇仼銇椼仸銇勩伨銇欍�傘儮銉囥儷銇屻儠銈°偆銉伄瑙f瀽銇ㄧ悊瑙f鑳姐倰銈点儩銉笺儓銇椼仸銇勩倠鍫村悎銇伄銇夸娇鐢ㄣ仹銇嶃伨銇欍��
+
+        澶夋暟銇屻儠銈°偆銉儶銈广儓銇牬鍚堛�併儶銈广儓銇悇瑕佺礌銇互涓嬨伄灞炴�с倰鎸併仱蹇呰銇屻亗銈娿伨銇欍��
+          - `type` (string) 銈点儩銉笺儓銇曘倢銇︺亜銈嬨偪銈ゃ儣: 
+            - `document` ('TXT', 'MD', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB')
+            - `image` ('JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG')
+            - `audio` ('MP3', 'M4A', 'WAV', 'WEBM', 'AMR')
+            - `video` ('MP4', 'MOV', 'MPEG', 'MPGA')
+            - `custom` (浠栥伄銉曘偂銈ゃ儷銈裤偆銉�)
+          - `transfer_method` (string) 杌㈤�佹柟娉曘�佺敾鍍廢RL銇牬鍚堛伅`remote_url` / 銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔銇牬鍚堛伅`local_file`
+          - `url` (string) 鐢诲儚URL锛堣虎閫佹柟娉曘亴`remote_url`銇牬鍚堬級
+          - `upload_file_id` (string) 銈€儍銉椼儹銉笺儔銇曘倢銇熴儠銈°偆銉獻D銆佷簨鍓嶃伀銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔API銈掗�氥仒銇﹀彇寰椼仚銈嬪繀瑕併亴銇傘倞銇俱仚锛堣虎閫佹柟娉曘亴`local_file`銇牬鍚堬級
+
+      - `response_mode` (string) 蹇呴爤
+        蹇滅瓟銇繑鍗淬儮銉笺儔銈掓寚瀹氥仐銇俱仚銆傘偟銉濄兗銉堛仌銈屻仸銇勩倠銉€兗銉夛細
+        - `streaming` 銈广儓銉兗銉熴兂銈般儮銉笺儔锛堟帹濂級銆丼SE锛圼Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)锛夈倰閫氥仒銇︺偪銈ゃ儣銉┿偆銈裤兗銇倛銇嗐仾鍑哄姏銈掑疅瑁呫仐銇俱仚銆�
+        - `blocking` 銉栥儹銉冦偔銉炽偘銉€兗銉夈�佸疅琛屽畬浜嗗緦銇祼鏋溿倰杩斻仐銇俱仚銆傦紙銉椼儹銈汇偣銇岄暦銇勫牬鍚堛�併儶銈偍銈广儓銇屼腑鏂仌銈屻倠鍙兘鎬с亴銇傘倞銇俱仚锛�
+        <i>Cloudflare銇埗闄愩伀銈堛倞銆�100绉掑緦銇繙绛斻亴銇亜鍫村悎銆併儶銈偍銈广儓銇腑鏂仌銈屻伨銇欍��</i>
+      - `user` (string) 蹇呴爤
+        銉︺兗銈躲兗璀樺垾瀛愩�併偍銉炽儔銉︺兗銈躲兗銇偄銈ゃ儑銉炽儐銈c儐銈c倰瀹氱京銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍��
+        銈€儣銉偙銉笺偡銉с兂鍐呫仹闁嬬櫤鑰呫伀銈堛仯銇︿竴鎰忋伀瀹氱京銇曘倢銈嬪繀瑕併亴銇傘倞銇俱仚銆�
+      - `files` (array[object]) 銈儣銈枫儳銉�
+        
+
+    ### 蹇滅瓟
+    `response_mode`銇宍blocking`銇牬鍚堛�丆ompletionResponse銈儢銈搞偋銈儓銈掕繑銇椼伨銇欍��
+    `response_mode`銇宍streaming`銇牬鍚堛�丆hunkCompletionResponse銈广儓銉兗銉犮倰杩斻仐銇俱仚銆�
+
+    ### CompletionResponse
+    銈€儣銉伄绲愭灉銈掕繑銇椼伨銇欍�俙Content-Type`銇痐application/json`銇с仚銆�
+    - `workflow_run_id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰忋伄ID
+    - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+    - `data` (object) 绲愭灉銇┏绱�
+      - `id` (string) 銉兗銈儠銉兗瀹熻銇甀D
+      - `workflow_id` (string) 闁㈤�c仚銈嬨儻銉笺偗銉曘儹銉笺伄ID
+      - `status` (string) 瀹熻銇偣銉嗐兗銈裤偣銆乣running` / `succeeded` / `failed` / `stopped`
+      - `outputs` (json) 銈儣銈枫儳銉炽伄鍑哄姏鍐呭
+      - `error` (string) 銈儣銈枫儳銉炽伄銈ㄣ儵銉肩悊鐢�
+      - `elapsed_time` (float) 銈儣銈枫儳銉炽伄浣跨敤鏅傞枔锛堢锛�
+      - `total_tokens` (int) 銈儣銈枫儳銉炽伄浣跨敤銉堛兗銈兂鏁�
+      - `total_steps` (int) 銉囥儠銈┿儷銉�0
+      - `created_at` (timestamp) 闁嬪鏅傞枔
+      - `finished_at` (timestamp) 绲備簡鏅傞枔
+
+    ### ChunkCompletionResponse
+    銈€儣銉伀銈堛仯銇﹀嚭鍔涖仌銈屻仧銈广儓銉兗銉犮儊銉c兂銈倰杩斻仐銇俱仚銆俙Content-Type`銇痐text/event-stream`銇с仚銆�
+    鍚勩偣銉堛儶銉笺儫銉炽偘銉併儯銉炽偗銇痐data:`銇у銇俱倞銆�2銇ゃ伄鏀硅鏂囧瓧`\n\n`銇у尯鍒囥倝銈屻伨銇欍�備互涓嬨伄銈堛亞銇〃绀恒仌銈屻伨銇欙細
+    <CodeGroup>
+    ```streaming {{ title: '蹇滅瓟' }}
+    data: {"event": "text_chunk", "workflow_run_id": "b85e5fc5-751b-454d-b14e-dc5f240b0a31", "task_id": "bd029338-b068-4d34-a331-fc85478922c2", "data": {"text": "\u4e3a\u4e86", "from_variable_selector": ["1745912968134", "text"]}}\n\n
+    ```
+    </CodeGroup>
+    銈广儓銉兗銉熴兂銈般儊銉c兂銈伄妲嬮�犮伅`event`銇繙銇樸仸鐣般仾銈娿伨銇欙細
+    - `event: workflow_started` 銉兗銈儠銉兗銇屽疅琛屻倰闁嬪
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `workflow_run_id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰忋伄ID
+      - `event` (string) `workflow_started`銇浐瀹�
+      - `data` (object) 瑭崇窗
+        - `id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰忋伄ID
+        - `workflow_id` (string) 闁㈤�c仚銈嬨儻銉笺偗銉曘儹銉笺伄ID
+        - `sequence_number` (int) 鑷繁澧楀姞銈枫儶銈€儷鐣彿銆併偄銉椼儶鍐呫仹鑷繁澧楀姞銇椼��1銇嬨倝濮嬨伨銈娿伨銇�
+        - `created_at` (timestamp) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: node_started` 銉庛兗銉夊疅琛岄枊濮�
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `workflow_run_id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰忋伄ID
+      - `event` (string) `node_started`銇浐瀹�
+      - `data` (object) 瑭崇窗
+        - `id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰忋伄ID
+        - `node_id` (string) 銉庛兗銉夈伄ID
+        - `node_type` (string) 銉庛兗銉夈伄銈裤偆銉�
+        - `title` (string) 銉庛兗銉夈伄鍚嶅墠
+        - `index` (int) 瀹熻銈枫兗銈便兂銈圭暘鍙枫�併儓銉兗銈广儙銉笺儔銈枫兗銈便兂銈广倰琛ㄧず銇欍倠銇熴倎銇娇鐢�
+        - `predecessor_node_id` (string) 銈儣銈枫儳銉炽伄銉椼儸銉曘偅銉冦偗銈广儙銉笺儔ID銆併偔銉c兂銉愩偣琛ㄧず瀹熻銉戙偣銇娇鐢�
+        - `inputs` (object) 銉庛兗銉夈仹浣跨敤銇曘倢銈嬨仚銇广仸銇墠銇儙銉笺儔澶夋暟銇唴瀹�
+        - `created_at` (timestamp) 闁嬪銇偪銈ゃ儬銈广偪銉炽儣銆佷緥锛�1705395332
+    - `event: text_chunk` 銉嗐偔銈广儓銉曘儵銈般儭銉炽儓
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `workflow_run_id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰忋伄ID
+      - `event` (string) `text_chunk`銇浐瀹�
+      - `data` (object) 瑭崇窗
+        - `text` (string) 銉嗐偔銈广儓鍐呭
+        - `from_variable_selector` (array) 銉嗐偔銈广儓鐢熸垚鍏冦儜銈癸紙闁嬬櫤鑰呫亴銇┿伄銉庛兗銉夈伄銇┿伄澶夋暟銇嬨倝鐢熸垚銇曘倢銇熴亱銈掔悊瑙c仚銈嬨仧銈併伄鎯呭牨锛�
+    - `event: node_finished` 銉庛兗銉夊疅琛岀祩浜嗐�佸悓銇樸偆銉欍兂銉堛仹鐣般仾銈嬬姸鎱嬨仹鎴愬姛銇俱仧銇け鏁�
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `workflow_run_id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰忋伄ID
+      - `event` (string) `node_finished`銇浐瀹�
+      - `data` (object) 瑭崇窗
+        - `id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰忋伄ID
+        - `node_id` (string) 銉庛兗銉夈伄ID
+        - `node_type` (string) 銉庛兗銉夈伄銈裤偆銉�
+        - `title` (string) 銉庛兗銉夈伄鍚嶅墠
+        - `index` (int) 瀹熻銈枫兗銈便兂銈圭暘鍙枫�併儓銉兗銈广儙銉笺儔銈枫兗銈便兂銈广倰琛ㄧず銇欍倠銇熴倎銇娇鐢�
+        - `predecessor_node_id` (string) 銈儣銈枫儳銉炽伄銉椼儸銉曘偅銉冦偗銈广儙銉笺儔ID銆併偔銉c兂銉愩偣琛ㄧず瀹熻銉戙偣銇娇鐢�
+        - `inputs` (object) 銉庛兗銉夈仹浣跨敤銇曘倢銈嬨仚銇广仸銇墠銇儙銉笺儔澶夋暟銇唴瀹�
+        - `process_data` (json) 銈儣銈枫儳銉炽伄銉庛兗銉夈儣銉偦銈广儑銉笺偪
+        - `outputs` (json) 銈儣銈枫儳銉炽伄鍑哄姏鍐呭
+        - `status` (string) 瀹熻銇偣銉嗐兗銈裤偣銆乣running` / `succeeded` / `failed` / `stopped`
+        - `error` (string) 銈儣銈枫儳銉炽伄銈ㄣ儵銉肩悊鐢�
+        - `elapsed_time` (float) 銈儣銈枫儳銉炽伄浣跨敤鏅傞枔锛堢锛�
+        - `execution_metadata` (json) 銉°偪銉囥兗銈�
+          - `total_tokens` (int) 銈儣銈枫儳銉炽伄浣跨敤銉堛兗銈兂鏁�
+          - `total_price` (decimal) 銈儣銈枫儳銉炽伄绶忋偝銈广儓
+          - `currency` (string) 銈儣銈枫儳銉� 渚嬶細`USD` / `RMB`
+        - `created_at` (timestamp) 闁嬪銇偪銈ゃ儬銈广偪銉炽儣銆佷緥锛�1705395332
+    - `event: workflow_finished` 銉兗銈儠銉兗瀹熻绲備簡銆佸悓銇樸偆銉欍兂銉堛仹鐣般仾銈嬬姸鎱嬨仹鎴愬姛銇俱仧銇け鏁�
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄Stop Generate API銇娇鐢�
+      - `workflow_run_id` (string) 銉兗銈儠銉兗瀹熻銇竴鎰忋伄ID
+      - `event` (string) `workflow_finished`銇浐瀹�
+      - `data` (object) 瑭崇窗
+        - `id` (string) 銉兗銈儠銉兗瀹熻銇甀D
+        - `workflow_id` (string) 闁㈤�c仚銈嬨儻銉笺偗銉曘儹銉笺伄ID
+        - `status` (string) 瀹熻銇偣銉嗐兗銈裤偣銆乣running` / `succeeded` / `failed` / `stopped`
+        - `outputs` (json) 銈儣銈枫儳銉炽伄鍑哄姏鍐呭
+        - `error` (string) 銈儣銈枫儳銉炽伄銈ㄣ儵銉肩悊鐢�
+        - `elapsed_time` (float) 銈儣銈枫儳銉炽伄浣跨敤鏅傞枔锛堢锛�
+        - `total_tokens` (int) 銈儣銈枫儳銉炽伄浣跨敤銉堛兗銈兂鏁�
+        - `total_steps` (int) 銉囥儠銈┿儷銉�0
+        - `created_at` (timestamp) 闁嬪鏅傞枔
+        - `finished_at` (timestamp) 绲備簡鏅傞枔
+    - `event: tts_message` TTS銈兗銉囥偅銈偣銉堛儶銉笺儬銈ゃ儥銉炽儓銆併仱銇俱倞闊冲0鍚堟垚鍑哄姏銆傚唴瀹广伅Mp3褰㈠紡銇偑銉笺儑銈c偑銉栥儹銉冦偗銇с�乥ase64鏂囧瓧鍒椼仺銇椼仸銈ㄣ兂銈炽兗銉夈仌銈屻仸銇勩伨銇欍�傚啀鐢熸檪銇伅銆乥ase64銈掋儑銈炽兗銉夈仐銇︺儣銉兗銉ゃ兗銇叆鍔涖仚銈嬨仩銇戙仹銇欍�傦紙銇撱伄銉°儍銈汇兗銈搞伅鑷嫊鍐嶇敓銇屾湁鍔广仾鍫村悎銇伄銇垮埄鐢ㄥ彲鑳斤級
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄鍋滄蹇滅瓟銈ゃ兂銈裤兗銉曘偋銉笺偣銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `audio` (string) 闊冲0鍚堟垚寰屻伄銈兗銉囥偅銈�乥ase64銉嗐偔銈广儓銈炽兂銉嗐兂銉勩仺銇椼仸銈ㄣ兂銈炽兗銉夈仌銈屻仸銇娿倞銆佸啀鐢熸檪銇伅base64銈掋儑銈炽兗銉夈仐銇︺儣銉兗銉ゃ兗銇叆鍔涖仚銈嬨仩銇戙仹銇�
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: tts_message_end` TTS銈兗銉囥偅銈偣銉堛儶銉笺儬绲備簡銈ゃ儥銉炽儓銆傘亾銇偆銉欍兂銉堛倰鍙椾俊銇欍倠銇ㄣ�併偑銉笺儑銈c偑銈广儓銉兗銉犮伄绲備簡銈掔ず銇椼伨銇欍��
+      - `task_id` (string) 銈裤偣銈疘D銆併儶銈偍銈广儓杩借贰銇ㄤ互涓嬨伄鍋滄蹇滅瓟銈ゃ兂銈裤兗銉曘偋銉笺偣銇娇鐢�
+      - `message_id` (string) 涓�鎰忋伄銉°儍銈汇兗銈窱D
+      - `audio` (string) 绲備簡銈ゃ儥銉炽儓銇伅銈兗銉囥偅銈亴銇亜銇熴倎銆併亾銈屻伅绌恒伄鏂囧瓧鍒椼仹銇�
+      - `created_at` (int) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+    - `event: ping` 鎺ョ稓銈掔董鎸併仚銈嬨仧銈併伀10绉掋仈銇ㄣ伀閫佷俊銇曘倢銈婸ing銈ゃ儥銉炽儓銆�
+
+    ### 銈ㄣ儵銉�
+    - 400, `invalid_param`, 鐣板父銇儜銉┿儭銉笺偪鍏ュ姏
+    - 400, `app_unavailable`, 銈€儣銉伄瑷畾銇屽埄鐢ㄣ仹銇嶃伨銇涖倱
+    - 400, `provider_not_initialize`, 鍒╃敤鍙兘銇儮銉囥儷璩囨牸鎯呭牨銇ō瀹氥亴銇傘倞銇俱仜銈�
+    - 400, `provider_quota_exceeded`, 銉€儑銉懠銇冲嚭銇椼伄銈偐銉笺偪銇屼笉瓒炽仐銇︺亜銇俱仚
+    - 400, `model_currently_not_support`, 鐝惧湪銇儮銉囥儷銇埄鐢ㄣ仹銇嶃伨銇涖倱
+    - 400, `workflow_request_error`, 銉兗銈儠銉兗瀹熻銇け鏁椼仐銇俱仐銇�
+    - 500, 鍐呴儴銈点兗銉愩兗銈ㄣ儵銉�
+
+  </Col>
+  <Col sticky>
+     <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/workflows/run" targetCode={`curl -X POST '${props.appDetail.api_base_url}/workflows/run' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "inputs": ${JSON.stringify(props.inputs)},\n    "response_mode": "streaming",\n    "user": "abc-123"\n}'\n`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/workflows/run' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "inputs": {},
+        "response_mode": "streaming",
+        "user": "abc-123"
+    }'
+    ```
+
+    </CodeGroup>
+    <CodeGroup title="銉曘偂銈ゃ儷澶夋暟銇緥">
+      ```json {{ title: '銉曘偂銈ゃ儷澶夋暟銇緥' }}
+      {
+        "inputs": {
+          "{variable_name}": 
+          [
+            {
+            "transfer_method": "local_file",
+            "upload_file_id": "{upload_file_id}",
+            "type": "{document_type}"
+            }
+          ]
+        }
+      }
+      ```
+    </CodeGroup>
+    ### 銉栥儹銉冦偔銉炽偘銉€兗銉�
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+        "workflow_run_id": "djflajgkldjgd",
+        "task_id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "data": {
+            "id": "fdlsjfjejkghjda",
+            "workflow_id": "fldjaslkfjlsda",
+            "status": "succeeded",
+            "outputs": {
+              "text": "Nice to meet you."
+            },
+            "error": null,
+            "elapsed_time": 0.875,
+            "total_tokens": 3562,
+            "total_steps": 8,
+            "created_at": 1705407629,
+            "finished_at": 1727807631
+        }
+    }
+    ```
+    </CodeGroup>
+    ### 銈广儓銉兗銉熴兂銈般儮銉笺儔
+    <CodeGroup title="蹇滅瓟">
+    ```streaming {{ title: '蹇滅瓟' }}
+      data: {"event": "workflow_started", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "workflow_id": "dfjasklfjdslag", "sequence_number": 1, "created_at": 1679586595}}
+      data: {"event": "node_started", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "node_id": "dfjasklfjdslag", "node_type": "start", "title": "Start", "index": 0, "predecessor_node_id": "fdljewklfklgejlglsd", "inputs": {}, "created_at": 1679586595}}
+      data: {"event": "node_finished", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "node_id": "dfjasklfjdslag", "node_type": "start", "title": "Start", "index": 0, "predecessor_node_id": "fdljewklfklgejlglsd", "inputs": {}, "outputs": {}, "status": "succeeded", "elapsed_time": 0.324, "execution_metadata": {"total_tokens": 63127864, "total_price": 2.378, "currency": "USD"},  "created_at": 1679586595}}
+      data: {"event": "workflow_finished", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "workflow_id": "dfjasklfjdslag", "outputs": {}, "status": "succeeded", "elapsed_time": 0.324, "total_tokens": 63127864, "total_steps": "1", "created_at": 1679586595, "finished_at": 1679976595}}
+      data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+      data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+    ```
+    </CodeGroup>
+    <CodeGroup title="銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔銇偟銉炽儣銉偝銉笺儔">
+      ```json {{ title: '銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔銇偟銉炽儣銉偝銉笺儔' }}
+      import requests
+      import json
+
+      def upload_file(file_path, user):
+          upload_url = "https://api.dify.ai/v1/files/upload"
+          headers = {
+              "Authorization": "Bearer app-xxxxxxxx",
+          }
+          
+          try:
+              print("銉曘偂銈ゃ儷銈掋偄銉冦儣銉兗銉夈仐銇︺亜銇俱仚...")
+              with open(file_path, 'rb') as file:
+                  files = {
+                      'file': (file_path, file, 'text/plain')  # 銉曘偂銈ゃ儷銇岄仼鍒囥仾 MIME 銈裤偆銉椼仹銈€儍銉椼儹銉笺儔銇曘倢銇︺亜銈嬨亾銇ㄣ倰纰鸿獚銇椼仸銇忋仩銇曘亜
+                  }
+                  data = {
+                      "user": user,
+                      "type": "TXT"  # 銉曘偂銈ゃ儷銈裤偆銉椼倰TXT銇ō瀹氥仐銇俱仚
+                  }
+                  
+                  response = requests.post(upload_url, headers=headers, files=files, data=data)
+                  if response.status_code == 201:  # 201 銇綔鎴愩亴鎴愬姛銇椼仧銇撱仺銈掓剰鍛炽仐銇俱仚
+                      print("銉曘偂銈ゃ儷銇屾甯搞伀銈€儍銉椼儹銉笺儔銇曘倢銇俱仐銇�")
+                      return response.json().get("id")  # 銈€儍銉椼儹銉笺儔銇曘倢銇熴儠銈°偆銉獻D銈掑彇寰椼仚銈�
+                  else:
+                      print(f"銉曘偂銈ゃ儷銇偄銉冦儣銉兗銉夈伀澶辨晽銇椼伨銇椼仧銆傘偣銉嗐兗銈裤偣 銈炽兗銉�: {response.status_code}")
+                      return None
+          except Exception as e:
+              print(f"銈ㄣ儵銉笺亴鐧虹敓銇椼伨銇椼仧: {str(e)}")
+              return None
+
+      def run_workflow(file_id, user, response_mode="blocking"):
+          workflow_url = "https://api.dify.ai/v1/workflows/run"
+          headers = {
+              "Authorization": "Bearer app-xxxxxxxxx",
+              "Content-Type": "application/json"
+          }
+
+          data = {
+              "inputs": {
+                  "orig_mail": [{
+                      "transfer_method": "local_file",
+                      "upload_file_id": file_id,
+                      "type": "document"
+                  }]
+              },
+              "response_mode": response_mode,
+              "user": user
+          }
+
+          try:
+              print("銉兗銈儠銉兗銈掑疅琛�...")
+              response = requests.post(workflow_url, headers=headers, json=data)
+              if response.status_code == 200:
+                  print("銉兗銈儠銉兗銇屾甯搞伀瀹熻銇曘倢銇俱仐銇�")
+                  return response.json()
+              else:
+                  print(f"銉兗銈儠銉兗銇疅琛屻亴銈广儐銉笺偪銈� 銈炽兗銉夈仹澶辨晽銇椼伨銇椼仧: {response.status_code}")
+                  return {"status": "error", "message": f"Failed to execute workflow, status code: {response.status_code}"}
+          except Exception as e:
+              print(f"銈ㄣ儵銉笺亴鐧虹敓銇椼伨銇椼仧: {str(e)}")
+              return {"status": "error", "message": str(e)}
+
+      # 浣跨敤渚�
+      file_path = "{your_file_path}"
+      user = "difyuser"
+
+      # 銉曘偂銈ゃ儷銈掋偄銉冦儣銉兗銉夈仚銈�
+      file_id = upload_file(file_path, user)
+      if file_id:
+          # 銉曘偂銈ゃ儷銇甯搞伀銈€儍銉椼儹銉笺儔銇曘倢銇俱仐銇熴�傘儻銉笺偗銉曘儹銉笺伄瀹熻銈掔稓琛屻仐銇俱仚
+          result = run_workflow(file_id, user)
+          print(result)
+      else:
+          print("銉曘偂銈ゃ儷銇偄銉冦儣銉兗銉夈伀澶辨晽銇椼�併儻銉笺偗銉曘儹銉笺倰瀹熻銇с亶銇俱仜銈�")
+      ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/workflows/run/:workflow_id'
+  method='GET'
+  title='銉兗銈儠銉兗瀹熻瑭崇窗銈掑彇寰�'
+  name='#get-workflow-run-detail'
+/>
+<Row>
+  <Col>
+    銉兗銈儠銉兗瀹熻ID銇熀銇ャ亜銇︺�併儻銉笺偗銉曘儹銉笺偪銈广偗銇従鍦ㄣ伄瀹熻绲愭灉銈掑彇寰椼仐銇俱仚銆�
+    ### 銉戙偣
+    - `workflow_id` (string) 銉兗銈儠銉兗ID銆併偣銉堛儶銉笺儫銉炽偘銉併儯銉炽偗銇繑銈婂�ゃ亱銈夊彇寰楀彲鑳�
+    ### 蹇滅瓟
+    - `id` (string) 銉兗銈儠銉兗瀹熻銇甀D
+    - `workflow_id` (string) 闁㈤�c仚銈嬨儻銉笺偗銉曘儹銉笺伄ID
+    - `status` (string) 瀹熻銇偣銉嗐兗銈裤偣銆乣running` / `succeeded` / `failed` / `stopped`
+    - `inputs` (json) 鍏ュ姏鍐呭
+    - `outputs` (json) 鍑哄姏鍐呭
+    - `error` (string) 銈ㄣ儵銉肩悊鐢�
+    - `total_steps` (int) 銈裤偣銈伄绶忋偣銉嗐儍銉楁暟
+    - `total_tokens` (int) 浣跨敤銇曘倢銈嬨儓銉笺偗銉炽伄绶忔暟
+    - `created_at` (timestamp) 闁嬪鏅傞枔
+    - `finished_at` (timestamp) 绲備簡鏅傞枔
+    - `elapsed_time` (float) 浣跨敤銇曘倢銈嬬窂绉掓暟
+  </Col>
+  <Col sticky>
+    ### 銉偗銈ㄣ偣銉堜緥
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="GET" label="/workflows/run/:workflow_id" targetCode={`curl -X GET '${props.appDetail.api_base_url}/workflows/run/:workflow_id' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/workflows/run/:workflow_id' \
+      -H 'Authorization: Bearer {api_key}' \
+      -H 'Content-Type: application/json'
+      ```
+    </CodeGroup>
+
+    ### 蹇滅瓟渚�
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+        "id": "b1ad3277-089e-42c6-9dff-6820d94fbc76",
+        "workflow_id": "19eff89f-ec03-4f75-b0fc-897e7effea02",
+        "status": "succeeded",
+        "inputs": "{\"sys.files\": [], \"sys.user_id\": \"abc-123\"}",
+        "outputs": null,
+        "error": null,
+        "total_steps": 3,
+        "total_tokens": 0,
+        "created_at": 1705407629,
+        "finished_at": 1727807631,
+        "elapsed_time": 30.098514399956912
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/workflows/tasks/:task_id/stop'
+  method='POST'
+  title='鐢熸垚銈掑仠姝�'
+  name='#stop-generatebacks'
+/>
+<Row>
+  <Col>
+  銈广儓銉兗銉熴兂銈般儮銉笺儔銇с伄銇裤偟銉濄兗銉堛仌銈屻仸銇勩伨銇欍��
+  ### 銉戙偣
+  - `task_id` (string) 銈裤偣銈疘D銆併偣銉堛儶銉笺儫銉炽偘銉併儯銉炽偗銇繑銈婂�ゃ亱銈夊彇寰楀彲鑳�
+  ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+  - `user` (string) 蹇呴爤
+    銉︺兗銈躲兗璀樺垾瀛愩�併偍銉炽儔銉︺兗銈躲兗銇偄銈ゃ儑銉炽儐銈c儐銈c倰瀹氱京銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻�侀�佷俊銉°儍銈汇兗銈搞偆銉炽偪銉笺儠銈с兗銈广仹娓°仌銈屻仧銉︺兗銈躲兗銇ㄤ竴鑷淬仐銇︺亜銈嬪繀瑕併亴銇傘倞銇俱仚銆�
+  ### 蹇滅瓟
+  - `result` (string) 甯搞伀"success"銈掕繑銇椼伨銇�
+  </Col>
+  <Col sticky>
+  ### 銉偗銈ㄣ偣銉堜緥
+  <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/workflows/tasks/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/workflows/tasks/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/workflows/tasks/:task_id/stop' \
+    -H 'Authorization: Bearer {api_key}' \
+    -H 'Content-Type: application/json' \
+    --data-raw '{
+        "user": "abc-123"
+    }'
+    ```
+    </CodeGroup>
+
+    ### 蹇滅瓟渚�
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/files/upload'
+  method='POST'
+  title='銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔'
+  name='#file-upload'
+/>
+<Row>
+  <Col>
+  銉°儍銈汇兗銈搁�佷俊鏅傘伀浣跨敤銇欍倠銇熴倎銇儠銈°偆銉倰銈€儍銉椼儹銉笺儔銇椼�佺敾鍍忋仺銉嗐偔銈广儓銇優銉儊銉€兗銉�銉悊瑙c倰鍙兘銇仐銇俱仚銆�
+  銉兗銈儠銉兗銇с偟銉濄兗銉堛仌銈屻仸銇勩倠浠绘剰銇舰寮忋倰銈点儩銉笺儓銇椼伨銇欍��
+  銈€儍銉椼儹銉笺儔銇曘倢銇熴儠銈°偆銉伅銆佺従鍦ㄣ伄銈ㄣ兂銉夈儲銉笺偠銉笺伄銇裤亴浣跨敤銇с亶銇俱仚銆�
+
+  ### 銉偗銈ㄣ偣銉堛儨銉囥偅
+  銇撱伄銈ゃ兂銈裤兗銉曘偋銉笺偣銇痐multipart/form-data`銉偗銈ㄣ偣銉堛倰蹇呰銇ㄣ仐銇俱仚銆�
+  - `file` (File) 蹇呴爤
+    銈€儍銉椼儹銉笺儔銇欍倠銉曘偂銈ゃ儷銆�
+  - `user` (string) 蹇呴爤
+    銉︺兗銈躲兗璀樺垾瀛愩�侀枊鐧鸿�呫伄銉兗銉仹瀹氱京銇曘倢銆併偄銉椼儶銈便兗銈枫儳銉冲唴銇т竴鎰忋仹銇亼銈屻伆銇倞銇俱仜銈撱��
+
+  ### 蹇滅瓟
+  銈€儍銉椼儹銉笺儔銇屾垚鍔熴仚銈嬨仺銆併偟銉笺儛銉笺伅銉曘偂銈ゃ儷銇甀D銇ㄩ枹閫f儏鍫便倰杩斻仐銇俱仚銆�
+  - `id` (uuid) ID
+  - `name` (string) 銉曘偂銈ゃ儷鍚�
+  - `size` (int) 銉曘偂銈ゃ儷銈点偆銈猴紙銉愩偆銉堬級
+  - `extension` (string) 銉曘偂銈ゃ儷鎷″嫉瀛�
+  - `mime_type` (string) 銉曘偂銈ゃ儷銇甅IME銈裤偆銉�
+  - `created_by` (uuid) 銈ㄣ兂銉夈儲銉笺偠銉糏D
+  - `created_at` (timestamp) 浣滄垚銈裤偆銉犮偣銈裤兂銉椼�佷緥锛�1705395332
+
+  ### 銈ㄣ儵銉�
+  - 400, `no_file_uploaded`, 銉曘偂銈ゃ儷銇屾彁渚涖仌銈屻仸銇勩伨銇涖倱
+  - 400, `too_many_files`, 鐝惧湪銇�1銇ゃ伄銉曘偂銈ゃ儷銇伩鍙椼亼浠樸亼銇︺亜銇俱仚
+  - 400, `unsupported_preview`, 銉曘偂銈ゃ儷銇儣銉儞銉ャ兗銈掋偟銉濄兗銉堛仐銇︺亜銇俱仜銈�
+  - 400, `unsupported_estimate`, 銉曘偂銈ゃ儷銇帹瀹氥倰銈点儩銉笺儓銇椼仸銇勩伨銇涖倱
+  - 413, `file_too_large`, 銉曘偂銈ゃ儷銇屽ぇ銇嶃仚銇庛伨銇�
+  - 415, `unsupported_file_type`, 銈点儩銉笺儓銇曘倢銇︺亜銇亜鎷″嫉瀛愩�佺従鍦ㄣ伅銉夈偔銉ャ儭銉炽儓銉曘偂銈ゃ儷銇伩鍙椼亼浠樸亼銇︺亜銇俱仚
+  - 503, `s3_connection_failed`, S3銈点兗銉撱偣銇帴缍氥仹銇嶃伨銇涖倱
+  - 503, `s3_permission_denied`, S3銇儠銈°偆銉倰銈€儍銉椼儹銉笺儔銇欍倠妯╅檺銇屻亗銈娿伨銇涖倱
+  - 503, `s3_file_too_large`, 銉曘偂銈ゃ儷銇孲3銇偟銈ゃ偤鍒堕檺銈掕秴銇堛仸銇勩伨銇�
+  - 500, 鍐呴儴銈点兗銉愩兗銈ㄣ儵銉�
+
+
+  </Col>
+  <Col sticky>
+  ### 銉偗銈ㄣ偣銉堜緥
+  <CodeGroup title="銉偗銈ㄣ偣銉�" tag="POST" label="/files/upload" targetCode={`curl -X POST '${props.appDetail.api_base_url}/files/upload' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=image/[png|jpeg|jpg|webp|gif] \\\n--form 'user=abc-123'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/files/upload' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@"/path/to/file"'
+    ```
+
+    </CodeGroup>
+
+
+  ### 蹇滅瓟渚�
+  <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "id": "72fa9618-8f89-4a37-9b33-7e1178a24a67",
+      "name": "example.png",
+      "size": 1024,
+      "extension": "png",
+      "mime_type": "image/png",
+      "created_by": "6ad1ab0a-73ff-4ac1-b9e4-cdb312f71f13",
+      "created_at": 1577836800,
+    }
+  ```
+  </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/workflows/logs'
+  method='GET'
+  title='銉兗銈儠銉兗銉偘銈掑彇寰�'
+  name='#Get-Workflow-Logs'
+/>
+<Row>
+  <Col>
+    銉兗銈儠銉兗銉偘銈掕繑銇椼伨銇欍�傛渶鍒濄伄銉氥兗銈搞伅鏈�鏂般伄`{limit}`銉°儍銈汇兗銈搞倰杩斻仐銇俱仚銆傘仱銇俱倞銆侀�嗛爢銇с仚銆�
+
+    ### 銈偍銉�
+
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        妞滅储銇欍倠銈兗銉兗銉�
+      </Property>
+      <Property name='status' type='string' key='status'>
+        succeeded/failed/stopped
+      </Property>
+      <Property name='page' type='int' key='page'>
+        鐝惧湪銇儦銉笺偢銆併儑銉曘偐銉儓銇�1銆�
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+          1鍥炪伄銉偗銈ㄣ偣銉堛仹杩斻仚銉併儯銉冦儓灞ユ銉°儍銈汇兗銈搞伄鏁般�併儑銉曘偐銉儓銇�20銆�
+      </Property>
+    </Properties>
+
+    ### 蹇滅瓟
+  - `page` (int) 鐝惧湪銇儦銉笺偢
+  - `limit` (int) 杩斻仌銈屻仧銈€偆銉嗐儬銇暟銆佸叆鍔涖亴銈枫偣銉嗐儬鍒堕檺銈掕秴銇堛倠鍫村悎銆併偡銈广儐銉犲埗闄愰噺銈掕繑銇椼伨銇�
+  - `total` (int) 鍚堣▓銈€偆銉嗐儬鏁�
+  - `has_more` (bool) 娆°伄銉氥兗銈搞亴銇傘倠銇嬨仼銇嗐亱
+  - `data` (array[object]) 銉偘銉偣銉�
+    - `id` (string) ID
+    - `workflow_run` (object) 銉兗銈儠銉兗瀹熻
+      - `id` (string) ID
+      - `version` (string) 銉愩兗銈搞儳銉�
+      - `status` (string) 瀹熻銇偣銉嗐兗銈裤偣銆乣running` / `succeeded` / `failed` / `stopped`
+      - `error` (string) 銈儣銈枫儳銉炽伄銈ㄣ儵銉肩悊鐢�
+      - `elapsed_time` (float) 浣跨敤銇曘倢銈嬬窂绉掓暟
+      - `total_tokens` (int) 浣跨敤銇曘倢銈嬨儓銉笺偗銉虫暟
+      - `total_steps` (int) 銉囥儠銈┿儷銉�0
+      - `created_at` (timestamp) 闁嬪鏅傞枔
+      - `finished_at` (timestamp) 绲備簡鏅傞枔
+    - `created_from` (string) 浣滄垚鍏�
+    - `created_by_role` (string) 浣滄垚鑰呫伄褰瑰壊
+    - `created_by_account` (string) 銈儣銈枫儳銉炽伄浣滄垚鑰呫偄銈偊銉炽儓
+    - `created_by_end_user` (object) 銈ㄣ兂銉夈儲銉笺偠銉笺伀銈堛仯銇︿綔鎴�
+      - `id` (string) ID
+      - `type` (string) 銈裤偆銉�
+      - `is_anonymous` (bool) 鍖垮悕銇嬨仼銇嗐亱
+      - `session_id` (string) 銈汇儍銈枫儳銉矷D
+    - `created_at` (timestamp) 浣滄垚鏅傞枔
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="GET" label="/workflows/logs" targetCode={`curl -X GET '${props.appDetail.api_base_url}/workflows/logs'\\\n --header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/workflows/logs?limit=1'
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+    ### 蹇滅瓟渚�
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+        "page": 1,
+        "limit": 1,
+        "total": 7,
+        "has_more": true,
+        "data": [
+            {
+                "id": "e41b93f1-7ca2-40fd-b3a8-999aeb499cc0",
+                "workflow_run": {
+                    "id": "c0640fc8-03ef-4481-a96c-8a13b732a36e",
+                    "version": "2024-08-01 12:17:09.771832",
+                    "status": "succeeded",
+                    "error": null,
+                    "elapsed_time": 1.3588523610014818,
+                    "total_tokens": 0,
+                    "total_steps": 3,
+                    "created_at": 1726139643,
+                    "finished_at": 1726139644
+                },
+                "created_from": "service-api",
+                "created_by_role": "end_user",
+                "created_by_account": null,
+                "created_by_end_user": {
+                    "id": "7f7d9117-dd9d-441d-8970-87e5e7e687a3",
+                    "type": "service_api",
+                    "is_anonymous": false,
+                    "session_id": "abc-123"
+                },
+                "created_at": 1726139644
+            }
+        ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/info'
+  method='GET'
+  title='銈€儣銉偙銉笺偡銉с兂銇熀鏈儏鍫便倰鍙栧緱'
+  name='#info'
+/>
+<Row>
+  <Col>
+  銇撱伄銈€儣銉偙銉笺偡銉с兂銇熀鏈儏鍫便倰鍙栧緱銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇�
+
+  ### Response
+  - `name` (string) 銈€儣銉偙銉笺偡銉с兂銇悕鍓�
+  - `description` (string) 銈€儣銉偙銉笺偡銉с兂銇鏄�
+  - `tags` (array[string]) 銈€儣銉偙銉笺偡銉с兂銇偪銈�
+  </Col>
+  <Col>
+    <CodeGroup title="Request" tag="GET" label="/info" targetCode={`curl -X GET '${props.appDetail.api_base_url}/info' \\\n-H 'Authorization: Bearer {api_key}'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/info' \
+      -H 'Authorization: Bearer {api_key}'
+      ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "name": "My App",
+      "description": "This is my app.",
+      "tags": [
+        "tag1",
+        "tag2"
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/parameters'
+  method='GET'
+  title='銈€儣銉偙銉笺偡銉с兂銇儜銉┿儭銉笺偪鎯呭牨銈掑彇寰�'
+  name='#parameters'
+/>
+<Row>
+  <Col>
+    銉氥兗銈搞伀鍏ャ倠闅涖伀銆佹鑳姐�佸叆鍔涖儜銉┿儭銉笺偪鍚嶃�併偪銈ゃ儣銆併儑銉曘偐銉儓鍊ゃ仾銇┿伄鎯呭牨銈掑彇寰椼仚銈嬨仧銈併伀浣跨敤銇曘倢銇俱仚銆�
+
+    ### 蹇滅瓟
+    - `user_input_form` (array[object]) 銉︺兗銈躲兗鍏ュ姏銉曘偐銉笺儬銇ō瀹�
+      - `text-input` (object) 銉嗐偔銈广儓鍏ュ姏銈炽兂銉堛儹銉笺儷
+        - `label` (string) 澶夋暟琛ㄧず銉┿儥銉悕
+        - `variable` (string) 澶夋暟ID
+        - `required` (bool) 蹇呴爤銇嬨仼銇嗐亱
+        - `default` (string) 銉囥儠銈┿儷銉堝��
+      - `paragraph` (object) 娈佃惤銉嗐偔銈广儓鍏ュ姏銈炽兂銉堛儹銉笺儷
+        - `label` (string) 澶夋暟琛ㄧず銉┿儥銉悕
+        - `variable` (string) 澶夋暟ID
+        - `required` (bool) 蹇呴爤銇嬨仼銇嗐亱
+        - `default` (string) 銉囥儠銈┿儷銉堝��
+      - `select` (object) 銉夈儹銉冦儣銉�銈︺兂銈炽兂銉堛儹銉笺儷
+        - `label` (string) 澶夋暟琛ㄧず銉┿儥銉悕
+        - `variable` (string) 澶夋暟ID
+        - `required` (bool) 蹇呴爤銇嬨仼銇嗐亱
+        - `default` (string) 銉囥儠銈┿儷銉堝��
+        - `options` (array[string]) 銈儣銈枫儳銉冲��
+    - `file_upload` (object) 銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔瑷畾
+      - `image` (object) 鐢诲儚瑷畾
+        鐝惧湪銈点儩銉笺儓銇曘倢銇︺亜銈嬬敾鍍忋偪銈ゃ儣銇伩锛歚png`, `jpg`, `jpeg`, `webp`, `gif`
+        - `enabled` (bool) 鏈夊姽銇嬨仼銇嗐亱
+        - `number_limits` (int) 鐢诲儚鏁般伄鍒堕檺銆併儑銉曘偐銉儓銇�3
+        - `transfer_methods` (array[string]) 杌㈤�佹柟娉曘伄銉偣銉堛�乺emote_url, local_file銆併亜銇氥倢銇嬨倰閬告姙銇欍倠蹇呰銇屻亗銈娿伨銇�
+    - `system_parameters` (object) 銈枫偣銉嗐儬銉戙儵銉°兗銈�
+      - `file_size_limit` (int) 銉夈偔銉ャ儭銉炽儓銈€儍銉椼儹銉笺儔銈点偆銈哄埗闄愶紙MB锛�
+      - `image_file_size_limit` (int) 鐢诲儚銉曘偂銈ゃ儷銈€儍銉椼儹銉笺儔銈点偆銈哄埗闄愶紙MB锛�
+      - `audio_file_size_limit` (int) 銈兗銉囥偅銈儠銈°偆銉偄銉冦儣銉兗銉夈偟銈ゃ偤鍒堕檺锛圡B锛�
+      - `video_file_size_limit` (int) 銉撱儑銈儠銈°偆銉偄銉冦儣銉兗銉夈偟銈ゃ偤鍒堕檺锛圡B锛�
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="銉偗銈ㄣ偣銉�" tag="GET" label="/parameters" targetCode={` curl -X GET '${props.appDetail.api_base_url}/parameters'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/parameters' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="蹇滅瓟">
+    ```json {{ title: '蹇滅瓟' }}
+    {
+      "user_input_form": [
+          {
+              "paragraph": {
+                  "label": "Query",
+                  "variable": "query",
+                  "required": true,
+                  "default": ""
+              }
+          }
+      ],
+      "file_upload": {
+          "image": {
+              "enabled": false,
+              "number_limits": 3,
+              "detail": "high",
+              "transfer_methods": [
+                  "remote_url",
+                  "local_file"
+              ]
+          }
+      },
+      "system_parameters": {
+          "file_size_limit": 15,
+          "image_file_size_limit": 10,
+          "audio_file_size_limit": 50,
+          "video_file_size_limit": 100
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+鈥斺�斺��
+
+<Heading
+  url='/site'
+  method='GET'
+  title='銈€儣銉伄WebApp瑷畾銈掑彇寰�'
+  name='#site'
+/>
+<Row>
+  <Col>
+  銈€儣銉伄WebApp瑷畾銈掑彇寰椼仚銈嬨仧銈併伀浣跨敤銇椼伨銇欍��
+  ### 蹇滅瓟
+  - `title` (string) WebApp鍚�
+  - `icon_type` (string) 銈€偆銈炽兂銈裤偆銉椼�乣emoji`-绲垫枃瀛椼�乣image`-鐢诲儚
+  - `icon` (string) 銈€偆銈炽兂銆俙emoji`銈裤偆銉椼伄鍫村悎銇档鏂囧瓧銆乣image`銈裤偆銉椼伄鍫村悎銇敾鍍廢RL
+  - `icon_background` (string) 16閫叉暟褰㈠紡銇儗鏅壊
+  - `icon_url` (string) 銈€偆銈炽兂銇甎RL
+  - `description` (string) 瑾槑
+  - `copyright` (string) 钁椾綔妯╂儏鍫�
+  - `privacy_policy` (string) 銉椼儵銈ゃ儛銈枫兗銉濄儶銈枫兗銇儶銉炽偗
+  - `custom_disclaimer` (string) 銈偣銈裤儬鍏嶈铂浜嬮爡
+  - `default_language` (string) 銉囥儠銈┿儷銉堣█瑾�
+  - `show_workflow_steps` (bool) 銉兗銈儠銉兗銇┏绱般倰琛ㄧず銇欍倠銇嬨仼銇嗐亱
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="POST" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/site' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/site' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "title": "My App",
+      "icon_type": "emoji",
+      "icon": "馃槃",
+      "icon_background": "#FFEAD5",
+      "icon_url": null,
+      "description": "This is my app.",
+      "copyright": "all rights reserved",
+      "privacy_policy": "",
+      "custom_disclaimer": "All generated by AI",
+      "default_language": "en-US",
+      "show_workflow_steps": false,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+___
+
diff --git a/app/components/develop/template/template_workflow.zh.mdx b/app/components/develop/template/template_workflow.zh.mdx
new file mode 100644
index 0000000..e78b309
--- /dev/null
+++ b/app/components/develop/template/template_workflow.zh.mdx
@@ -0,0 +1,783 @@
+import { CodeGroup } from '../code.tsx'
+import { Row, Col, Properties, Property, Heading, SubProperty, Paragraph } from '../md.tsx'
+
+# Workflow 搴旂敤 API
+
+Workflow 搴旂敤鏃犱細璇濇敮鎸侊紝閫傚悎鐢ㄤ簬缈昏瘧/鏂囩珷鍐欎綔/鎬荤粨 AI 绛夌瓑銆�
+
+<div>
+  ### Base URL
+  <CodeGroup title="Code" targetCode={props.appDetail.api_base_url}>
+    ```javascript
+    ```
+  </CodeGroup>
+
+  ### Authentication
+
+  Dify Service API 浣跨敤 `API-Key` 杩涜閴存潈銆�
+  <i>**寮虹儓寤鸿寮�鍙戣�呮妸 `API-Key` 鏀惧湪鍚庣瀛樺偍锛岃�岄潪鍒嗕韩鎴栬�呮斁鍦ㄥ鎴风瀛樺偍锛屼互鍏� `API-Key` 娉勯湶锛屽鑷磋储浜ф崯澶便��**</i>
+  鎵�鏈� API 璇锋眰閮藉簲鍦� **`Authorization`** HTTP Header 涓寘鍚偍鐨� `API-Key`锛屽涓嬫墍绀猴細
+
+  <CodeGroup title="Code">
+    ```javascript
+      Authorization: Bearer {API_KEY}
+
+    ```
+  </CodeGroup>
+</div>
+
+---
+
+<Heading
+  url='/workflows/run'
+  method='POST'
+  title='鎵ц workflow'
+  name='#Execute-Workflow'
+/>
+<Row>
+  <Col>
+    鎵ц workflow锛屾病鏈夊凡鍙戝竷鐨� workflow锛屼笉鍙墽琛屻��
+
+    ### Request Body
+      - `inputs` (object) Required
+        鍏佽浼犲叆 App 瀹氫箟鐨勫悇鍙橀噺鍊笺��
+        inputs 鍙傛暟鍖呭惈浜嗗缁勯敭鍊煎锛圞ey/Value pairs锛夛紝姣忕粍鐨勯敭瀵瑰簲涓�涓壒瀹氬彉閲忥紝姣忕粍鐨勫�煎垯鏄鍙橀噺鐨勫叿浣撳�笺�傚彉閲忓彲浠ユ槸鏂囦欢鍒楄〃绫诲瀷銆�
+        鏂囦欢鍒楄〃绫诲瀷鍙橀噺閫傜敤浜庝紶鍏ユ枃浠剁粨鍚堟枃鏈悊瑙e苟鍥炵瓟闂锛屼粎褰撴ā鍨嬫敮鎸佽绫诲瀷鏂囦欢瑙f瀽鑳藉姏鏃跺彲鐢ㄣ�傚鏋滆鍙橀噺鏄枃浠跺垪琛ㄧ被鍨嬶紝璇ュ彉閲忓搴旂殑鍊煎簲鏄垪琛ㄦ牸寮忥紝鍏朵腑姣忎釜鍏冪礌搴斿寘鍚互涓嬪唴瀹癸細
+          - `type` (string) 鏀寔绫诲瀷锛�
+            - `document` 鍏蜂綋绫诲瀷鍖呭惈锛�'TXT', 'MD', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'
+            - `image` 鍏蜂綋绫诲瀷鍖呭惈锛�'JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'
+            - `audio` 鍏蜂綋绫诲瀷鍖呭惈锛�'MP3', 'M4A', 'WAV', 'WEBM', 'AMR'
+            - `video` 鍏蜂綋绫诲瀷鍖呭惈锛�'MP4', 'MOV', 'MPEG', 'MPGA'
+            - `custom` 鍏蜂綋绫诲瀷鍖呭惈锛氬叾浠栨枃浠剁被鍨�
+          - `transfer_method` (string) 浼犻�掓柟寮忥紝`remote_url` 鍥剧墖鍦板潃 / `local_file` 涓婁紶鏂囦欢
+          - `url` (string) 鍥剧墖鍦板潃锛堜粎褰撲紶閫掓柟寮忎负 `remote_url` 鏃讹級
+          - `upload_file_id` (string)  涓婁紶鏂囦欢 ID锛堜粎褰撲紶閫掓柟寮忎负 `local_file` 鏃讹級
+      - `response_mode` (string) Required
+        杩斿洖鍝嶅簲妯″紡锛屾敮鎸侊細
+        - `streaming` 娴佸紡妯″紡锛堟帹鑽愶級銆傚熀浜� SSE锛�**[Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)**锛夊疄鐜扮被浼兼墦瀛楁満杈撳嚭鏂瑰紡鐨勬祦寮忚繑鍥炪��
+        - `blocking` 闃诲妯″紡锛岀瓑寰呮墽琛屽畬姣曞悗杩斿洖缁撴灉銆傦紙璇锋眰鑻ユ祦绋嬭緝闀垮彲鑳戒細琚腑鏂級銆�
+        <i>鐢变簬 Cloudflare 闄愬埗锛岃姹備細鍦� 100 绉掕秴鏃舵棤杩斿洖鍚庝腑鏂��</i>
+      - `user` (string) Required
+        鐢ㄦ埛鏍囪瘑锛岀敤浜庡畾涔夌粓绔敤鎴风殑韬唤锛屾柟渚挎绱€�佺粺璁°��
+        鐢卞紑鍙戣�呭畾涔夎鍒欙紝闇�淇濊瘉鐢ㄦ埛鏍囪瘑鍦ㄥ簲鐢ㄥ唴鍞竴銆�
+
+
+    ### Response
+    褰� `response_mode` 涓� `blocking` 鏃讹紝杩斿洖 CompletionResponse object銆�
+    褰� `response_mode` 涓� `streaming`鏃讹紝杩斿洖 ChunkCompletionResponse object 娴佸紡搴忓垪銆�
+
+    ### CompletionResponse
+    杩斿洖瀹屾暣鐨� App 缁撴灉锛宍Content-Type` 涓� `application/json` 銆�
+    - `workflow_run_id` (string) workflow 鎵ц ID
+    - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+    - `data` (object) 璇︾粏鍐呭
+      - `id` (string) workflow 鎵ц ID
+      - `workflow_id` (string) 鍏宠仈 Workflow ID
+      - `status` (string) 鎵ц鐘舵��, `running` / `succeeded` / `failed` / `stopped`
+      - `outputs` (json) Optional 杈撳嚭鍐呭
+      - `error` (string) Optional 閿欒鍘熷洜
+      - `elapsed_time` (float) Optional 鑰楁椂(s)
+      - `total_tokens` (int) Optional 鎬讳娇鐢� tokens
+      - `total_steps` (int) 鎬绘鏁帮紙鍐椾綑锛夛紝榛樿 0
+      - `created_at` (timestamp) 寮�濮嬫椂闂�
+      - `finished_at` (timestamp) 缁撴潫鏃堕棿
+
+    ### ChunkCompletionResponse
+    杩斿洖 App 杈撳嚭鐨勬祦寮忓潡锛宍Content-Type` 涓� `text/event-stream`銆�
+    姣忎釜娴佸紡鍧楀潎涓� data: 寮�澶达紝鍧椾箣闂翠互 `\n\n` 鍗充袱涓崲琛岀鍒嗛殧锛屽涓嬫墍绀猴細
+    <CodeGroup>
+    ```streaming {{ title: 'Response' }}
+    data: {"event": "text_chunk", "workflow_run_id": "b85e5fc5-751b-454d-b14e-dc5f240b0a31", "task_id": "bd029338-b068-4d34-a331-fc85478922c2", "data": {"text": "\u4e3a\u4e86", "from_variable_selector": ["1745912968134", "text"]}}\n\n
+    ```
+    </CodeGroup>
+    娴佸紡鍧椾腑鏍规嵁 `event` 涓嶅悓锛岀粨鏋勪篃涓嶅悓锛屽寘鍚互涓嬬被鍨嬶細
+    - `event: workflow_started` workflow 寮�濮嬫墽琛�
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `workflow_run_id` (string) workflow 鎵ц ID
+      - `event` (string) 鍥哄畾涓� `workflow_started`
+      - `data` (object) 璇︾粏鍐呭
+        - `id` (string) workflow 鎵ц ID
+        - `workflow_id` (string) 鍏宠仈 Workflow ID
+        - `sequence_number` (int) 鑷搴忓彿锛孉pp 鍐呰嚜澧烇紝浠� 1 寮�濮�
+        - `created_at` (timestamp) 寮�濮嬫椂闂�
+    - `event: node_started` node 寮�濮嬫墽琛�
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `workflow_run_id` (string) workflow 鎵ц ID
+      - `event` (string) 鍥哄畾涓� `node_started`
+      - `data` (object) 璇︾粏鍐呭
+        - `id` (string) workflow 鎵ц ID
+        - `node_id` (string) 鑺傜偣 ID
+        - `node_type` (string) 鑺傜偣绫诲瀷
+        - `title` (string) 鑺傜偣鍚嶇О
+        - `index` (int) 鎵ц搴忓彿锛岀敤浜庡睍绀� Tracing Node 椤哄簭
+        - `predecessor_node_id` (string) 鍓嶇疆鑺傜偣 ID锛岀敤浜庣敾甯冨睍绀烘墽琛岃矾寰�
+        - `inputs` (object) 鑺傜偣涓墍鏈変娇鐢ㄥ埌鐨勫墠缃妭鐐瑰彉閲忓唴瀹�
+        - `created_at` (timestamp) 寮�濮嬫椂闂�
+    - `event: text_chunk` 鏂囨湰鐗囨
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `workflow_run_id` (string) workflow 鎵ц ID
+      - `event` (string) 鍥哄畾涓� `text_chunk`
+      - `data` (object) 璇︾粏鍐呭
+        - `text` (string) 鏂囨湰鍐呭
+        - `from_variable_selector` (array) 鏂囨湰鏉ユ簮璺緞锛屽府鍔╁紑鍙戣�呬簡瑙f枃鏈槸鐢卞摢涓妭鐐圭殑鍝釜鍙橀噺鐢熸垚鐨�
+    - `event: node_finished` node 鎵ц缁撴潫锛屾垚鍔熷け璐ュ悓涓�浜嬩欢涓笉鍚岀姸鎬�
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `workflow_run_id` (string) workflow 鎵ц ID
+      - `event` (string) 鍥哄畾涓� `node_finished`
+      - `data` (object) 璇︾粏鍐呭
+        - `id` (string) node 鎵ц ID
+        - `node_id` (string) 鑺傜偣 ID
+        - `index` (int) 鎵ц搴忓彿锛岀敤浜庡睍绀� Tracing Node 椤哄簭
+        - `predecessor_node_id` (string) optional 鍓嶇疆鑺傜偣 ID锛岀敤浜庣敾甯冨睍绀烘墽琛岃矾寰�
+        - `inputs` (object) 鑺傜偣涓墍鏈変娇鐢ㄥ埌鐨勫墠缃妭鐐瑰彉閲忓唴瀹�
+        - `process_data` (json) Optional 鑺傜偣杩囩▼鏁版嵁
+        - `outputs` (json) Optional 杈撳嚭鍐呭
+        - `status` (string) 鎵ц鐘舵�� `running` / `succeeded` / `failed` / `stopped`
+        - `error` (string) Optional 閿欒鍘熷洜
+        - `elapsed_time` (float) Optional 鑰楁椂(s)
+        - `execution_metadata` (json) 鍏冩暟鎹�
+          - `total_tokens` (int) optional 鎬讳娇鐢� tokens
+          - `total_price` (decimal) optional 鎬昏垂鐢�
+          - `currency` (string) optional 璐у竵锛屽 `USD` / `RMB`
+        - `created_at` (timestamp) 寮�濮嬫椂闂�
+    - `event: workflow_finished` workflow 鎵ц缁撴潫锛屾垚鍔熷け璐ュ悓涓�浜嬩欢涓笉鍚岀姸鎬�
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `workflow_run_id` (string) workflow 鎵ц ID
+      - `event` (string) 鍥哄畾涓� `workflow_finished`
+      - `data` (object) 璇︾粏鍐呭
+        - `id` (string) workflow 鎵ц ID
+        - `workflow_id` (string) 鍏宠仈 Workflow ID
+        - `status` (string)  鎵ц鐘舵�� `running` / `succeeded` / `failed` / `stopped`
+        - `outputs` (json) Optional 杈撳嚭鍐呭
+        - `error` (string) Optional 閿欒鍘熷洜
+        - `elapsed_time` (float) Optional 鑰楁椂(s)
+        - `total_tokens` (int) Optional 鎬讳娇鐢� tokens
+        - `total_steps` (int) 鎬绘鏁帮紙鍐椾綑锛夛紝榛樿 0
+        - `created_at` (timestamp) 寮�濮嬫椂闂�
+        - `finished_at` (timestamp) 缁撴潫鏃堕棿
+    - `event: tts_message` TTS 闊抽娴佷簨浠讹紝鍗筹細璇煶鍚堟垚杈撳嚭銆傚唴瀹规槸Mp3鏍煎紡鐨勯煶棰戝潡锛屼娇鐢� base64 缂栫爜鍚庣殑瀛楃涓诧紝鎾斁鐨勬椂鍊欑洿鎺ヨВ鐮佸嵆鍙��(寮�鍚嚜鍔ㄦ挱鏀炬墠鏈夋娑堟伅)
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `audio` (string) 璇煶鍚堟垚涔嬪悗鐨勯煶棰戝潡浣跨敤 Base64 缂栫爜涔嬪悗鐨勬枃鏈唴瀹癸紝鎾斁鐨勬椂鍊欑洿鎺� base64 瑙g爜閫佸叆鎾斁鍣ㄥ嵆鍙�
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: tts_message_end` TTS 闊抽娴佺粨鏉熶簨浠讹紝鏀跺埌杩欎釜浜嬩欢琛ㄧず闊抽娴佽繑鍥炵粨鏉熴��
+      - `task_id` (string) 浠诲姟 ID锛岀敤浜庤姹傝窡韪拰涓嬫柟鐨勫仠姝㈠搷搴旀帴鍙�
+      - `message_id` (string) 娑堟伅鍞竴 ID
+      - `audio` (string) 缁撴潫浜嬩欢鏄病鏈夐煶棰戠殑锛屾墍浠ヨ繖閲屾槸绌哄瓧绗︿覆
+      - `created_at` (int) 鍒涘缓鏃堕棿鎴筹紝濡傦細1705395332
+    - `event: ping` 姣� 10s 涓�娆$殑 ping 浜嬩欢锛屼繚鎸佽繛鎺ュ瓨娲汇��
+
+    ### Errors
+    - 400锛宍invalid_param`锛屼紶鍏ュ弬鏁板紓甯�
+    - 400锛宍app_unavailable`锛孉pp 閰嶇疆涓嶅彲鐢�
+    - 400锛宍provider_not_initialize`锛屾棤鍙敤妯″瀷鍑嵁閰嶇疆
+    - 400锛宍provider_quota_exceeded`锛屾ā鍨嬭皟鐢ㄩ搴︿笉瓒�
+    - 400锛宍model_currently_not_support`锛屽綋鍓嶆ā鍨嬩笉鍙敤
+    - 400锛宍workflow_request_error`锛寃orkflow 鎵ц澶辫触
+    - 500锛屾湇鍔″唴閮ㄥ紓甯�
+
+  </Col>
+  <Col sticky>
+    <CodeGroup title="Request" tag="POST" label="/workflows/run" targetCode={`curl -X POST '${props.appDetail.api_base_url}/workflows/run' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n    "inputs": ${JSON.stringify(props.inputs)},\n    "response_mode": "streaming",\n    "user": "abc-123"\n}'\n`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/workflows/run' \
+    --header 'Authorization: Bearer {api_key}' \
+    --header 'Content-Type: application/json' \
+    --data-raw '{
+        "inputs": {},
+        "response_mode": "streaming",
+        "user": "abc-123"
+    }'
+    ```
+    </CodeGroup>
+    <CodeGroup title="Example: file array as an input variable">
+      ```json {{ title: 'File variable example' }}
+      {
+        "inputs": {
+          "{variable_name}": 
+          [
+            {
+            "transfer_method": "local_file",
+            "upload_file_id": "{upload_file_id}",
+            "type": "{document_type}"
+            }
+          ]
+        }
+      }
+      ```
+    </CodeGroup>
+    ### Blocking Mode
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+        "workflow_run_id": "djflajgkldjgd",
+        "task_id": "9da23599-e713-473b-982c-4328d4f5c78a",
+        "data": {
+            "id": "fdlsjfjejkghjda",
+            "workflow_id": "fldjaslkfjlsda",
+            "status": "succeeded",
+            "outputs": {
+              "text": "Nice to meet you."
+            },
+            "error": null,
+            "elapsed_time": 0.875,
+            "total_tokens": 3562,
+            "total_steps": 8,
+            "created_at": 1705407629,
+            "finished_at": 1727807631
+        }
+    }
+    ```
+    </CodeGroup>
+    ### Streaming Mode
+    <CodeGroup title="Response">
+    ```streaming {{ title: 'Response' }}
+      data: {"event": "workflow_started", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "workflow_id": "dfjasklfjdslag", "sequence_number": 1, "created_at": 1679586595}}
+      data: {"event": "node_started", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "node_id": "dfjasklfjdslag", "node_type": "start", "title": "Start", "index": 0, "predecessor_node_id": "fdljewklfklgejlglsd", "inputs": {}, "created_at": 1679586595}}
+      data: {"event": "node_finished", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "node_id": "dfjasklfjdslag", "node_type": "start", "title": "Start", "index": 0, "predecessor_node_id": "fdljewklfklgejlglsd", "inputs": {}, "outputs": {}, "status": "succeeded", "elapsed_time": 0.324, "execution_metadata": {"total_tokens": 63127864, "total_price": 2.378, "currency": "USD"},  "created_at": 1679586595}}
+      data: {"event": "workflow_finished", "task_id": "5ad4cb98-f0c7-4085-b384-88c403be6290", "workflow_run_id": "5ad498-f0c7-4085-b384-88cbe6290", "data": {"id": "5ad498-f0c7-4085-b384-88cbe6290", "workflow_id": "dfjasklfjdslag", "outputs": {}, "status": "succeeded", "elapsed_time": 0.324, "total_tokens": 63127864, "total_steps": "1", "created_at": 1679586595, "finished_at": 1679976595}}
+      data: {"event": "tts_message", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"}
+      data: {"event": "tts_message_end", "conversation_id": "23dd85f3-1a41-4ea0-b7a9-062734ccfaf9", "message_id": "a8bdc41c-13b2-4c18-bfd9-054b9803038c", "created_at": 1721205487, "task_id": "3bf8a0bb-e73b-4690-9e66-4e429bad8ee7", "audio": ""}
+    ```
+    </CodeGroup>
+    <CodeGroup title="File upload sample code">
+      ```json {{ title: 'File upload sample code' }}
+      import requests
+      import json
+
+      def upload_file(file_path, user):
+          upload_url = "https://api.dify.ai/v1/files/upload"
+          headers = {
+              "Authorization": "Bearer app-xxxxxxxx",
+          }
+          
+          try:
+              print("涓婁紶鏂囦欢涓�...")
+              with open(file_path, 'rb') as file:
+                  files = {
+                      'file': (file_path, file, 'text/plain')  # 纭繚鏂囦欢浠ラ�傚綋鐨凪IME绫诲瀷涓婁紶
+                  }
+                  data = {
+                      "user": user,
+                      "type": "TXT"  # 璁剧疆鏂囦欢绫诲瀷涓篢XT
+                  }
+                  
+                  response = requests.post(upload_url, headers=headers, files=files, data=data)
+                  if response.status_code == 201:  # 201 琛ㄧず鍒涘缓鎴愬姛
+                      print("鏂囦欢涓婁紶鎴愬姛")
+                      return response.json().get("id")  # 鑾峰彇涓婁紶鐨勬枃浠� ID
+                  else:
+                      print(f"鏂囦欢涓婁紶澶辫触锛岀姸鎬佺爜: {response.status_code}")
+                      return None
+          except Exception as e:
+              print(f"鍙戠敓閿欒: {str(e)}")
+              return None
+
+      def run_workflow(file_id, user, response_mode="blocking"):
+          workflow_url = "https://api.dify.ai/v1/workflows/run"
+          headers = {
+              "Authorization": "Bearer app-xxxxxxxxx",
+              "Content-Type": "application/json"
+          }
+
+          data = {
+              "inputs": {
+                  "orig_mail": [{
+                      "transfer_method": "local_file",
+                      "upload_file_id": file_id,
+                      "type": "document"
+                  }]
+              },
+              "response_mode": response_mode,
+              "user": user
+          }
+
+          try:
+              print("杩愯宸ヤ綔娴�...")
+              response = requests.post(workflow_url, headers=headers, json=data)
+              if response.status_code == 200:
+                  print("宸ヤ綔娴佹墽琛屾垚鍔�")
+                  return response.json()
+              else:
+                  print(f"宸ヤ綔娴佹墽琛屽け璐ワ紝鐘舵�佺爜: {response.status_code}")
+                  return {"status": "error", "message": f"Failed to execute workflow, status code: {response.status_code}"}
+          except Exception as e:
+              print(f"鍙戠敓閿欒: {str(e)}")
+              return {"status": "error", "message": str(e)}
+
+      # 浣跨敤绀轰緥
+      file_path = "{your_file_path}"
+      user = "difyuser"
+
+      # 涓婁紶鏂囦欢
+      file_id = upload_file(file_path, user)
+      if file_id:
+          # 鏂囦欢涓婁紶鎴愬姛锛岀户缁繍琛屽伐浣滄祦
+          result = run_workflow(file_id, user)
+          print(result)
+      else:
+          print("鏂囦欢涓婁紶澶辫触锛屾棤娉曟墽琛屽伐浣滄祦")
+      ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/workflows/run/:workflow_run_id'
+  method='GET'
+  title='鑾峰彇workflow鎵ц鎯呭喌'
+  name='#get-workflow-run-detail'
+/>
+<Row>
+  <Col>
+    鏍规嵁 workflow 鎵ц ID 鑾峰彇 workflow 浠诲姟褰撳墠鎵ц缁撴灉
+    ### Path
+    - `workflow_run_id` (string) workflow_run_id锛屽彲鍦ㄦ祦寮忚繑鍥� Chunk 涓幏鍙�
+    ### Response
+    - `id` (string) workflow 鎵ц ID
+    - `workflow_id` (string) 鍏宠仈鐨� Workflow ID
+    - `status` (string) 鎵ц鐘舵�� `running` / `succeeded` / `failed` / `stopped`
+    - `inputs` (json) 浠诲姟杈撳叆鍐呭
+    - `outputs` (json) 浠诲姟杈撳嚭鍐呭
+    - `error` (string) 閿欒鍘熷洜
+    - `total_steps` (int) 浠诲姟鎵ц鎬绘鏁�
+    - `total_tokens` (int) 浠诲姟鎵ц鎬� tokens
+    - `created_at` (timestamp) 浠诲姟寮�濮嬫椂闂�
+    - `finished_at` (timestamp) 浠诲姟缁撴潫鏃堕棿
+    - `elapsed_time` (float) 鑰楁椂(s)
+  </Col>
+  <Col sticky>
+    ### Request Example
+    <CodeGroup title="Request" tag="GET" label="/workflows/run/:workflow_run_id" targetCode={`curl -X GET '${props.appDetail.api_base_url}/workflows/run/:workflow_run_id' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/workflows/run/:workflow_run_id' \
+      -H 'Authorization: Bearer {api_key}' \
+      -H 'Content-Type: application/json'
+      ```
+    </CodeGroup>
+
+    ### Response Example
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+        "id": "b1ad3277-089e-42c6-9dff-6820d94fbc76",
+        "workflow_id": "19eff89f-ec03-4f75-b0fc-897e7effea02",
+        "status": "succeeded",
+        "inputs": "{\"sys.files\": [], \"sys.user_id\": \"abc-123\"}",
+        "outputs": null,
+        "error": null,
+        "total_steps": 3,
+        "total_tokens": 0,
+        "created_at": 1705407629,
+        "finished_at": 1727807631,
+        "elapsed_time": 30.098514399956912
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/workflows/tasks/:task_id/stop'
+  method='POST'
+  title='鍋滄鍝嶅簲'
+  name='#stop-generatebacks'
+/>
+<Row>
+  <Col>
+    浠呮敮鎸佹祦寮忔ā寮忋��
+    ### Path
+    - `task_id` (string) 浠诲姟 ID锛屽彲鍦ㄦ祦寮忚繑鍥� Chunk 涓幏鍙�
+    ### Request Body
+    - `user` (string) Required
+      鐢ㄦ埛鏍囪瘑锛岀敤浜庡畾涔夌粓绔敤鎴风殑韬唤锛屽繀椤诲拰鍙戦�佹秷鎭帴鍙d紶鍏� user 淇濇寔涓�鑷淬��
+    ### Response
+    - `result` (string) 鍥哄畾杩斿洖 "success"
+  </Col>
+  <Col sticky>
+    ### Request Example
+    <CodeGroup title="Request" tag="POST" label="/workflows/tasks/:task_id/stop" targetCode={`curl -X POST '${props.appDetail.api_base_url}/workflows/tasks/:task_id/stop' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{"user": "abc-123"}'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X POST '${props.appDetail.api_base_url}/workflows/tasks/:task_id/stop' \
+      -H 'Authorization: Bearer {api_key}' \
+      -H 'Content-Type: application/json' \
+      --data-raw '{
+          "user": "abc-123"
+      }'
+      ```
+    </CodeGroup>
+
+    ### Response Example
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "result": "success"
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/files/upload'
+  method='POST'
+  title='涓婁紶鏂囦欢'
+  name='#files-upload'
+/>
+<Row>
+  <Col>
+    涓婁紶鏂囦欢骞跺湪鍙戦�佹秷鎭椂浣跨敤锛屽彲瀹炵幇鍥炬枃澶氭ā鎬佺悊瑙c��
+    鏀寔鎮ㄧ殑宸ヤ綔娴佺▼鎵�鏀寔鐨勪换浣曟牸寮忋��
+    <i>涓婁紶鐨勬枃浠朵粎渚涘綋鍓嶇粓绔敤鎴蜂娇鐢ㄣ��</i>
+
+    ### Request Body
+    璇ユ帴鍙i渶浣跨敤  `multipart/form-data` 杩涜璇锋眰銆�
+    <Properties>
+      <Property name='file' type='file' key='file'>
+        瑕佷笂浼犵殑鏂囦欢銆�
+      </Property>
+      <Property name='user' type='string' key='user'>
+          鐢ㄦ埛鏍囪瘑锛岀敤浜庡畾涔夌粓绔敤鎴风殑韬唤锛屽繀椤诲拰鍙戦�佹秷鎭帴鍙d紶鍏� user 淇濇寔涓�鑷淬��
+      </Property>
+    </Properties>
+
+    ### Response
+    鎴愬姛涓婁紶鍚庯紝鏈嶅姟鍣ㄤ細杩斿洖鏂囦欢鐨� ID 鍜岀浉鍏充俊鎭��
+    - `id` (uuid) ID
+    - `name` (string) 鏂囦欢鍚�
+    - `size` (int) 鏂囦欢澶у皬锛坆yte锛�
+    - `extension` (string) 鏂囦欢鍚庣紑
+    - `mime_type` (string) 鏂囦欢 mime-type
+    - `created_by` (uuid) 涓婁紶浜� ID
+    - `created_at` (timestamp) 涓婁紶鏃堕棿
+
+    ### Errors
+    - 400锛宍no_file_uploaded`锛屽繀椤绘彁渚涙枃浠�
+    - 400锛宍too_many_files`锛岀洰鍓嶅彧鎺ュ彈涓�涓枃浠�
+    - 400锛宍unsupported_preview`锛岃鏂囦欢涓嶆敮鎸侀瑙�
+    - 400锛宍unsupported_estimate`锛岃鏂囦欢涓嶆敮鎸佷及绠�
+    - 413锛宍file_too_large`锛屾枃浠跺お澶�
+    - 415锛宍unsupported_file_type`锛屼笉鏀寔鐨勬墿灞曞悕锛屽綋鍓嶅彧鎺ュ彈鏂囨。绫绘枃浠�
+    - 503锛宍s3_connection_failed`锛屾棤娉曡繛鎺ュ埌 S3 鏈嶅姟
+    - 503锛宍s3_permission_denied`锛屾棤鏉冮檺涓婁紶鏂囦欢鍒� S3
+    - 503锛宍s3_file_too_large`锛屾枃浠惰秴鍑� S3 澶у皬闄愬埗
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="POST" label="/files/upload" targetCode={`curl -X POST '${props.appDetail.api_base_url}/files/upload' \\\n--header 'Authorization: Bearer {api_key}' \\\n--form 'file=@localfile;type=image/[png|jpeg|jpg|webp|gif] \\\n--form 'user=abc-123'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X POST '${props.appDetail.api_base_url}/files/upload' \
+    --header 'Authorization: Bearer {api_key}' \
+    --form 'file=@"/path/to/file"'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "id": "72fa9618-8f89-4a37-9b33-7e1178a24a67",
+      "name": "example.png",
+      "size": 1024,
+      "extension": "png",
+      "mime_type": "image/png",
+      "created_by": 123,
+      "created_at": 1577836800,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/workflows/logs'
+  method='GET'
+  title='鑾峰彇 workflow 鏃ュ織'
+  name='#Get-Workflow-Logs'
+/>
+<Row>
+  <Col>
+    鍊掑簭杩斿洖workflow鏃ュ織
+
+    ### Query
+
+    <Properties>
+      <Property name='keyword' type='string' key='keyword'>
+        鍏抽敭瀛�
+      </Property>
+      <Property name='status' type='string' key='status'>
+        鎵ц鐘舵�� succeeded/failed/stopped
+      </Property>
+      <Property name='page' type='int' key='page'>
+        褰撳墠椤电爜, 榛樿1.
+      </Property>
+      <Property name='limit' type='int' key='limit'>
+        姣忛〉鏉℃暟, 榛樿20.
+      </Property>
+    </Properties>
+
+    ### Response
+  - `page` (int) 褰撳墠椤电爜
+  - `limit` (int) 姣忛〉鏉℃暟
+  - `total` (int) 鎬绘潯鏁�
+  - `has_more` (bool) 鏄惁杩樻湁鏇村鏁版嵁
+  - `data` (array[object]) 褰撳墠椤电爜鐨勬暟鎹�
+    - `id` (string) 鏍囪瘑
+    - `workflow_run` (object) Workflow 鎵ц鏃ュ織
+      - `id` (string) 鏍囪瘑
+      - `version` (string) 鐗堟湰
+      - `status` (string) 鎵ц鐘舵��, `running` / `succeeded` / `failed` / `stopped`
+      - `error` (string) (鍙��) 閿欒
+      - `elapsed_time` (float) 鑰楁椂锛屽崟浣嶇
+      - `total_tokens` (int) 娑堣�楃殑token鏁伴噺
+      - `total_steps` (int) 鎵ц姝ラ闀垮害
+      - `created_at` (timestamp) 寮�濮嬫椂闂�
+      - `finished_at` (timestamp) 缁撴潫鏃堕棿
+    - `created_from` (string) 鏉ユ簮
+    - `created_by_role` (string) 瑙掕壊
+    - `created_by_account` (string) (鍙��) 甯愬彿
+    - `created_by_end_user` (object) 鐢ㄦ埛
+      - `id` (string) 鏍囪瘑
+      - `type` (string) 绫诲瀷
+      - `is_anonymous` (bool) 鏄惁鍖垮悕
+      - `session_id` (string) 浼氳瘽鏍囪瘑
+    - `created_at` (timestamp) 鍒涘缓鏃堕棿
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/workflows/logs" targetCode={`curl -X GET '${props.appDetail.api_base_url}/workflows/logs'\\\n --header 'Authorization: Bearer {api_key}'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/workflows/logs?limit=1'
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+    ### Response Example
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+        "page": 1,
+        "limit": 1,
+        "total": 7,
+        "has_more": true,
+        "data": [
+            {
+                "id": "e41b93f1-7ca2-40fd-b3a8-999aeb499cc0",
+                "workflow_run": {
+                    "id": "c0640fc8-03ef-4481-a96c-8a13b732a36e",
+                    "version": "2024-08-01 12:17:09.771832",
+                    "status": "succeeded",
+                    "error": null,
+                    "elapsed_time": 1.3588523610014818,
+                    "total_tokens": 0,
+                    "total_steps": 3,
+                    "created_at": 1726139643,
+                    "finished_at": 1726139644
+                },
+                "created_from": "service-api",
+                "created_by_role": "end_user",
+                "created_by_account": null,
+                "created_by_end_user": {
+                    "id": "7f7d9117-dd9d-441d-8970-87e5e7e687a3",
+                    "type": "service_api",
+                    "is_anonymous": false,
+                    "session_id": "abc-123"
+                },
+                "created_at": 1726139644
+            }
+        ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+---
+
+<Heading
+  url='/info'
+  method='GET'
+  title='鑾峰彇搴旂敤鍩烘湰淇℃伅'
+  name='#info'
+/>
+<Row>
+  <Col>
+  鐢ㄤ簬鑾峰彇搴旂敤鐨勫熀鏈俊鎭�
+  ### Response
+  - `name` (string) 搴旂敤鍚嶇О
+  - `description` (string) 搴旂敤鎻忚堪
+  - `tags` (array[string]) 搴旂敤鏍囩
+  </Col>
+  <Col>
+    <CodeGroup title="Request" tag="GET" label="/info" targetCode={`curl -X GET '${props.appDetail.api_base_url}/info' \\\n-H 'Authorization: Bearer {api_key}'`}>
+      ```bash {{ title: 'cURL' }}
+      curl -X GET '${props.appDetail.api_base_url}/info' \
+      -H 'Authorization: Bearer {api_key}'
+      ```
+    </CodeGroup>
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "name": "My App",
+      "description": "This is my app.",
+      "tags": [
+        "tag1",
+        "tag2"
+      ]
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/parameters'
+  method='GET'
+  title='鑾峰彇搴旂敤鍙傛暟'
+  name='#parameters'
+/>
+<Row>
+  <Col>
+    鐢ㄤ簬杩涘叆椤甸潰涓�寮�濮嬶紝鑾峰彇鍔熻兘寮�鍏炽�佽緭鍏ュ弬鏁板悕绉般�佺被鍨嬪強榛樿鍊肩瓑浣跨敤銆�
+
+    ### Response
+    - `user_input_form` (array[object]) 鐢ㄦ埛杈撳叆琛ㄥ崟閰嶇疆
+      - `text-input` (object) 鏂囨湰杈撳叆鎺т欢
+        - `label` (string) 鎺т欢灞曠ず鏍囩鍚�
+        - `variable` (string) 鎺т欢 ID
+        - `required` (bool) 鏄惁蹇呭~
+        - `default` (string) 榛樿鍊�
+      - `paragraph` (object) 娈佃惤鏂囨湰杈撳叆鎺т欢
+        - `label` (string) 鎺т欢灞曠ず鏍囩鍚�
+        - `variable` (string) 鎺т欢 ID
+        - `required` (bool) 鏄惁蹇呭~
+        - `default` (string) 榛樿鍊�
+      - `select` (object) 涓嬫媺鎺т欢
+        - `label` (string) 鎺т欢灞曠ず鏍囩鍚�
+        - `variable` (string) 鎺т欢 ID
+        - `required` (bool) 鏄惁蹇呭~
+        - `default` (string) 榛樿鍊�
+        - `options` (array[string]) 閫夐」鍊�
+    - `file_upload` (object) 鏂囦欢涓婁紶閰嶇疆
+      - `image` (object) 鍥剧墖璁剧疆
+        褰撳墠浠呮敮鎸佸浘鐗囩被鍨嬶細`png`, `jpg`, `jpeg`, `webp`, `gif`
+        - `enabled` (bool) 鏄惁寮�鍚�
+        - `number_limits` (int) 鍥剧墖鏁伴噺闄愬埗锛岄粯璁� 3
+        - `transfer_methods` (array[string]) 浼犻�掓柟寮忓垪琛紝remote_url , local_file锛屽繀閫変竴涓�
+    - `system_parameters` (object) 绯荤粺鍙傛暟
+      - `file_size_limit` (int) 鏂囨。涓婁紶澶у皬闄愬埗 (MB)
+      - `image_file_size_limit` (int) 鍥剧墖鏂囦欢涓婁紶澶у皬闄愬埗锛圡B锛�
+      - `audio_file_size_limit` (int) 闊抽鏂囦欢涓婁紶澶у皬闄愬埗 (MB)
+      - `video_file_size_limit` (int) 瑙嗛鏂囦欢涓婁紶澶у皬闄愬埗 (MB)
+
+  </Col>
+  <Col sticky>
+
+    <CodeGroup title="Request" tag="GET" label="/parameters" targetCode={` curl -X GET '${props.appDetail.api_base_url}/parameters'`}>
+
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/parameters' \
+    --header 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "user_input_form": [
+          {
+              "paragraph": {
+                  "label": "Query",
+                  "variable": "query",
+                  "required": true,
+                  "default": ""
+              }
+          }
+      ],
+      "file_upload": {
+          "image": {
+              "enabled": false,
+              "number_limits": 3,
+              "detail": "high",
+              "transfer_methods": [
+                  "remote_url",
+                  "local_file"
+              ]
+          }
+      },
+      "system_parameters": {
+          "file_size_limit": 15,
+          "image_file_size_limit": 10,
+          "audio_file_size_limit": 50,
+          "video_file_size_limit": 100
+      }
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+
+---
+
+<Heading
+  url='/site'
+  method='GET'
+  title='鑾峰彇搴旂敤 WebApp 璁剧疆'
+  name='#site'
+/>
+<Row>
+  <Col>
+  鐢ㄤ簬鑾峰彇搴旂敤鐨� WebApp 璁剧疆
+  ### Response
+  - `title` (string) WebApp 鍚嶇О
+  - `icon_type` (string) 鍥炬爣绫诲瀷, `emoji`-琛ㄦ儏, `image`-鍥剧墖
+  - `icon` (string) 鍥炬爣, 濡傛灉鏄� `emoji` 绫诲瀷, 鍒欐槸 emoji 琛ㄦ儏绗﹀彿, 濡傛灉鏄� `image` 绫诲瀷, 鍒欐槸鍥剧墖 URL
+  - `icon_background` (string) hex 鏍煎紡鐨勮儗鏅壊
+  - `icon_url` (string) 鍥炬爣 URL
+  - `description` (string) 鎻忚堪
+  - `copyright` (string) 鐗堟潈淇℃伅
+  - `privacy_policy` (string) 闅愮鏀跨瓥閾炬帴
+  - `custom_disclaimer` (string) 鑷畾涔夊厤璐e0鏄�
+  - `default_language` (string) 榛樿璇█
+  - `show_workflow_steps` (bool) 鏄惁鏄剧ず宸ヤ綔娴佽鎯�
+  </Col>
+  <Col>
+  <CodeGroup title="Request" tag="POST" label="/meta" targetCode={`curl -X GET '${props.appDetail.api_base_url}/site' \\\n-H 'Authorization: Bearer {api_key}'`}>
+    ```bash {{ title: 'cURL' }}
+    curl -X GET '${props.appDetail.api_base_url}/site' \
+    -H 'Authorization: Bearer {api_key}'
+    ```
+
+    </CodeGroup>
+
+    <CodeGroup title="Response">
+    ```json {{ title: 'Response' }}
+    {
+      "title": "My App",
+      "icon_type": "emoji",
+      "icon": "馃槃",
+      "icon_background": "#FFEAD5",
+      "icon_url": null,
+      "description": "This is my app.",
+      "copyright": "all rights reserved",
+      "privacy_policy": "",
+      "custom_disclaimer": "All generated by AI",
+      "default_language": "en-US",
+      "show_workflow_steps": false,
+    }
+    ```
+    </CodeGroup>
+  </Col>
+</Row>
+___
diff --git a/app/components/explore/app-card/index.tsx b/app/components/explore/app-card/index.tsx
new file mode 100644
index 0000000..31d218a
--- /dev/null
+++ b/app/components/explore/app-card/index.tsx
@@ -0,0 +1,70 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { PlusIcon } from '@heroicons/react/20/solid'
+import Button from '../../base/button'
+import cn from '@/utils/classnames'
+import type { App } from '@/models/explore'
+import AppIcon from '@/app/components/base/app-icon'
+import { AppTypeIcon } from '../../app/type-selector'
+export type AppCardProps = {
+  app: App
+  canCreate: boolean
+  onCreate: () => void
+  isExplore: boolean
+}
+
+const AppCard = ({
+  app,
+  canCreate,
+  onCreate,
+  isExplore,
+}: AppCardProps) => {
+  const { t } = useTranslation()
+  const { app: appBasicInfo } = app
+  return (
+    <div className={cn('group relative col-span-1 flex cursor-pointer flex-col overflow-hidden rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg pb-2 shadow-sm transition-all duration-200 ease-in-out hover:shadow-lg')}>
+      <div className='flex h-[66px] shrink-0 grow-0 items-center gap-3 px-[14px] pb-3 pt-[14px]'>
+        <div className='relative shrink-0'>
+          <AppIcon
+            size='large'
+            iconType={appBasicInfo.icon_type}
+            icon={appBasicInfo.icon}
+            background={appBasicInfo.icon_background}
+            imageUrl={appBasicInfo.icon_url}
+          />
+          <AppTypeIcon wrapperClassName='absolute -bottom-0.5 -right-0.5 w-4 h-4 rounded-[4px] border border-divider-regular outline outline-components-panel-on-panel-item-bg'
+            className='h-3 w-3' type={appBasicInfo.mode} />
+        </div>
+        <div className='w-0 grow py-[1px]'>
+          <div className='flex items-center text-sm font-semibold leading-5 text-text-secondary'>
+            <div className='truncate' title={appBasicInfo.name}>{appBasicInfo.name}</div>
+          </div>
+          <div className='flex items-center text-[10px] font-medium leading-[18px] text-text-tertiary'>
+            {appBasicInfo.mode === 'advanced-chat' && <div className='truncate'>{t('app.types.advanced').toUpperCase()}</div>}
+            {appBasicInfo.mode === 'chat' && <div className='truncate'>{t('app.types.chatbot').toUpperCase()}</div>}
+            {appBasicInfo.mode === 'agent-chat' && <div className='truncate'>{t('app.types.agent').toUpperCase()}</div>}
+            {appBasicInfo.mode === 'workflow' && <div className='truncate'>{t('app.types.workflow').toUpperCase()}</div>}
+            {appBasicInfo.mode === 'completion' && <div className='truncate'>{t('app.types.completion').toUpperCase()}</div>}
+          </div>
+        </div>
+      </div>
+      <div className="description-wrapper system-xs-regular h-[90px] px-[14px] text-text-tertiary">
+        <div className='line-clamp-4 group-hover:line-clamp-2'>
+          {app.description}
+        </div>
+      </div>
+      {isExplore && canCreate && (
+        <div className={cn('absolute bottom-0 left-0 right-0 hidden bg-gradient-to-t from-components-panel-gradient-2 from-[60.27%] to-transparent p-4 pt-8 group-hover:flex')}>
+          <div className={cn('flex h-8 w-full items-center space-x-2')}>
+            <Button variant='primary' className='h-7 grow' onClick={() => onCreate()}>
+              <PlusIcon className='mr-1 h-4 w-4' />
+              <span className='text-xs'>{t('explore.appCard.addToWorkspace')}</span>
+            </Button>
+          </div>
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default AppCard
diff --git a/app/components/explore/app-list/index.tsx b/app/components/explore/app-list/index.tsx
new file mode 100644
index 0000000..7e2d990
--- /dev/null
+++ b/app/components/explore/app-list/index.tsx
@@ -0,0 +1,246 @@
+'use client'
+
+import React, { useCallback, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import useSWR from 'swr'
+import { useDebounceFn } from 'ahooks'
+import s from './style.module.css'
+import cn from '@/utils/classnames'
+import ExploreContext from '@/context/explore-context'
+import type { App } from '@/models/explore'
+import Category from '@/app/components/explore/category'
+import AppCard from '@/app/components/explore/app-card'
+import { fetchAppDetail, fetchAppList } from '@/service/explore'
+import { useTabSearchParams } from '@/hooks/use-tab-searchparams'
+import CreateAppModal from '@/app/components/explore/create-app-modal'
+import type { CreateAppModalProps } from '@/app/components/explore/create-app-modal'
+import Loading from '@/app/components/base/loading'
+import Input from '@/app/components/base/input'
+import {
+  DSLImportMode,
+} from '@/models/app'
+import { useImportDSL } from '@/hooks/use-import-dsl'
+import DSLConfirmModal from '@/app/components/app/create-from-dsl-modal/dsl-confirm-modal'
+
+type AppsProps = {
+  onSuccess?: () => void
+}
+
+export enum PageType {
+  EXPLORE = 'explore',
+  CREATE = 'create',
+}
+
+const Apps = ({
+  onSuccess,
+}: AppsProps) => {
+  const { t } = useTranslation()
+  const { hasEditPermission } = useContext(ExploreContext)
+  const allCategoriesEn = t('explore.apps.allCategories', { lng: 'en' })
+
+  const [keywords, setKeywords] = useState('')
+  const [searchKeywords, setSearchKeywords] = useState('')
+
+  const { run: handleSearch } = useDebounceFn(() => {
+    setSearchKeywords(keywords)
+  }, { wait: 500 })
+
+  const handleKeywordsChange = (value: string) => {
+    setKeywords(value)
+    handleSearch()
+  }
+
+  const [currentType, setCurrentType] = useState<string>('')
+  const [currCategory, setCurrCategory] = useTabSearchParams({
+    defaultTab: allCategoriesEn,
+    disableSearchParams: false,
+  })
+
+  const {
+    data: { categories, allList },
+  } = useSWR(
+    ['/explore/apps'],
+    () =>
+      fetchAppList().then(({ categories, recommended_apps }) => ({
+        categories,
+        allList: recommended_apps.sort((a, b) => a.position - b.position),
+      })),
+    {
+      fallbackData: {
+        categories: [],
+        allList: [],
+      },
+    },
+  )
+
+  const filteredList = useMemo(() => {
+    if (currCategory === allCategoriesEn) {
+      if (!currentType)
+        return allList
+      else if (currentType === 'chatbot')
+        return allList.filter(item => (item.app.mode === 'chat' || item.app.mode === 'advanced-chat'))
+      else if (currentType === 'agent')
+        return allList.filter(item => (item.app.mode === 'agent-chat'))
+      else
+        return allList.filter(item => (item.app.mode === 'workflow'))
+    }
+    else {
+      if (!currentType)
+        return allList.filter(item => item.category === currCategory)
+      else if (currentType === 'chatbot')
+        return allList.filter(item => (item.app.mode === 'chat' || item.app.mode === 'advanced-chat') && item.category === currCategory)
+      else if (currentType === 'agent')
+        return allList.filter(item => (item.app.mode === 'agent-chat') && item.category === currCategory)
+      else
+        return allList.filter(item => (item.app.mode === 'workflow') && item.category === currCategory)
+    }
+  }, [currentType, currCategory, allCategoriesEn, allList])
+
+  const searchFilteredList = useMemo(() => {
+    if (!searchKeywords || !filteredList || filteredList.length === 0)
+      return filteredList
+
+    const lowerCaseSearchKeywords = searchKeywords.toLowerCase()
+
+    return filteredList.filter(item =>
+      item.app && item.app.name && item.app.name.toLowerCase().includes(lowerCaseSearchKeywords),
+    )
+  }, [searchKeywords, filteredList])
+
+  const [currApp, setCurrApp] = React.useState<App | null>(null)
+  const [isShowCreateModal, setIsShowCreateModal] = React.useState(false)
+
+  const {
+    handleImportDSL,
+    handleImportDSLConfirm,
+    versions,
+    isFetching,
+  } = useImportDSL()
+  const [showDSLConfirmModal, setShowDSLConfirmModal] = useState(false)
+  const onCreate: CreateAppModalProps['onConfirm'] = async ({
+    name,
+    icon_type,
+    icon,
+    icon_background,
+    description,
+  }) => {
+    const { export_data } = await fetchAppDetail(
+      currApp?.app.id as string,
+    )
+    const payload = {
+      mode: DSLImportMode.YAML_CONTENT,
+      yaml_content: export_data,
+      name,
+      icon_type,
+      icon,
+      icon_background,
+      description,
+    }
+    await handleImportDSL(payload, {
+      onSuccess: () => {
+        setIsShowCreateModal(false)
+      },
+      onPending: () => {
+        setShowDSLConfirmModal(true)
+      },
+    })
+  }
+
+  const onConfirmDSL = useCallback(async () => {
+    await handleImportDSLConfirm({
+      onSuccess,
+    })
+  }, [handleImportDSLConfirm, onSuccess])
+
+  if (!categories || categories.length === 0) {
+    return (
+      <div className="flex h-full items-center">
+        <Loading type="area" />
+      </div>
+    )
+  }
+
+  return (
+    <div className={cn(
+      'flex h-full flex-col border-l-[0.5px] border-divider-regular',
+    )}>
+
+      <div className='shrink-0 px-12 pt-6'>
+        <div className={`mb-1 ${s.textGradient} text-xl font-semibold`}>{t('explore.apps.title')}</div>
+        <div className='text-sm text-text-tertiary'>{t('explore.apps.description')}</div>
+      </div>
+
+      <div className={cn(
+        'mt-6 flex items-center justify-between px-12',
+      )}>
+        <>
+          <Category
+            list={categories}
+            value={currCategory}
+            onChange={setCurrCategory}
+            allCategoriesEn={allCategoriesEn}
+          />
+        </>
+        <Input
+          showLeftIcon
+          showClearIcon
+          wrapperClassName='w-[200px]'
+          value={keywords}
+          onChange={e => handleKeywordsChange(e.target.value)}
+          onClear={() => handleKeywordsChange('')}
+        />
+
+      </div>
+
+      <div className={cn(
+        'relative mt-4 flex flex-1 shrink-0 grow flex-col overflow-auto pb-6',
+      )}>
+        <nav
+          className={cn(
+            s.appList,
+            'grid shrink-0 content-start gap-4 px-6 sm:px-12',
+          )}>
+          {searchFilteredList.map(app => (
+            <AppCard
+              key={app.app_id}
+              isExplore
+              app={app}
+              canCreate={hasEditPermission}
+              onCreate={() => {
+                setCurrApp(app)
+                setIsShowCreateModal(true)
+              }}
+            />
+          ))}
+        </nav>
+      </div>
+      {isShowCreateModal && (
+        <CreateAppModal
+          appIconType={currApp?.app.icon_type || 'emoji'}
+          appIcon={currApp?.app.icon || ''}
+          appIconBackground={currApp?.app.icon_background || ''}
+          appIconUrl={currApp?.app.icon_url}
+          appName={currApp?.app.name || ''}
+          appDescription={currApp?.app.description || ''}
+          show={isShowCreateModal}
+          onConfirm={onCreate}
+          confirmDisabled={isFetching}
+          onHide={() => setIsShowCreateModal(false)}
+        />
+      )}
+      {
+        showDSLConfirmModal && (
+          <DSLConfirmModal
+            versions={versions}
+            onCancel={() => setShowDSLConfirmModal(false)}
+            onConfirm={onConfirmDSL}
+            confirmDisabled={isFetching}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default React.memo(Apps)
diff --git a/app/components/explore/app-list/style.module.css b/app/components/explore/app-list/style.module.css
new file mode 100644
index 0000000..241130a
--- /dev/null
+++ b/app/components/explore/app-list/style.module.css
@@ -0,0 +1,29 @@
+.textGradient {
+  background: linear-gradient(to right, rgba(16, 74, 225, 1) 0, rgba(0, 152, 238, 1) 100%);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+  text-fill-color: transparent;
+}
+
+.appList {
+  grid-template-columns: repeat(1, minmax(0, 1fr))
+}
+
+@media (min-width: 1624px) {
+  .appList {
+    grid-template-columns: repeat(4, minmax(0, 1fr))
+  }
+}
+
+@media (min-width: 1300px) and (max-width: 1624px) {
+  .appList {
+    grid-template-columns: repeat(3, minmax(0, 1fr))
+  }
+}
+
+@media (min-width: 1025px) and (max-width: 1300px) {
+  .appList {
+    grid-template-columns: repeat(2, minmax(0, 1fr))
+  }
+}
diff --git a/app/components/explore/category.tsx b/app/components/explore/category.tsx
new file mode 100644
index 0000000..51daaa9
--- /dev/null
+++ b/app/components/explore/category.tsx
@@ -0,0 +1,60 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+import exploreI18n from '@/i18n/en-US/explore'
+import type { AppCategory } from '@/models/explore'
+import { ThumbsUp } from '@/app/components/base/icons/src/vender/line/alertsAndFeedback'
+
+const categoryI18n = exploreI18n.category
+
+export type ICategoryProps = {
+  className?: string
+  list: AppCategory[]
+  value: string
+  onChange: (value: AppCategory | string) => void
+  /**
+   * default value for search param 'category' in en
+   */
+  allCategoriesEn: string
+}
+
+const Category: FC<ICategoryProps> = ({
+  className,
+  list,
+  value,
+  onChange,
+  allCategoriesEn,
+}) => {
+  const { t } = useTranslation()
+  const isAllCategories = !list.includes(value as AppCategory) || value === allCategoriesEn
+
+  const itemClassName = (isSelected: boolean) => cn(
+    'flex h-[32px] cursor-pointer items-center rounded-lg border-[0.5px] border-transparent px-3 py-[7px] font-medium leading-[18px] text-text-tertiary hover:bg-components-main-nav-nav-button-bg-active',
+    isSelected && 'border-components-main-nav-nav-button-border bg-components-main-nav-nav-button-bg-active text-components-main-nav-nav-button-text-active shadow-xs',
+  )
+
+  return (
+    <div className={cn(className, 'flex flex-wrap space-x-1 text-[13px]')}>
+      <div
+        className={itemClassName(isAllCategories)}
+        onClick={() => onChange(allCategoriesEn)}
+      >
+        <ThumbsUp className='mr-1 h-3.5 w-3.5' />
+        {t('explore.apps.allCategories')}
+      </div>
+      {list.filter(name => name !== allCategoriesEn).map(name => (
+        <div
+          key={name}
+          className={itemClassName(name === value)}
+          onClick={() => onChange(name)}
+        >
+          {(categoryI18n as any)[name] ? t(`explore.category.${name}`) : name}
+        </div>
+      ))}
+    </div>
+  )
+}
+
+export default React.memo(Category)
diff --git a/app/components/explore/create-app-modal/index.tsx b/app/components/explore/create-app-modal/index.tsx
new file mode 100644
index 0000000..f30b286
--- /dev/null
+++ b/app/components/explore/create-app-modal/index.tsx
@@ -0,0 +1,195 @@
+'use client'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine, RiCommandLine, RiCornerDownLeftLine } from '@remixicon/react'
+import { useDebounceFn, useKeyPress } from 'ahooks'
+import AppIconPicker from '../../base/app-icon-picker'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import Switch from '@/app/components/base/switch'
+import Toast from '@/app/components/base/toast'
+import AppIcon from '@/app/components/base/app-icon'
+import { useProviderContext } from '@/context/provider-context'
+import AppsFull from '@/app/components/billing/apps-full-in-dialog'
+import type { AppIconType } from '@/types/app'
+import { noop } from 'lodash-es'
+
+export type CreateAppModalProps = {
+  show: boolean
+  isEditModal?: boolean
+  appName: string
+  appDescription: string
+  appIconType: AppIconType | null
+  appIcon: string
+  appIconBackground?: string | null
+  appIconUrl?: string | null
+  appMode?: string
+  appUseIconAsAnswerIcon?: boolean
+  onConfirm: (info: {
+    name: string
+    icon_type: AppIconType
+    icon: string
+    icon_background?: string
+    description: string
+    use_icon_as_answer_icon?: boolean
+  }) => Promise<void>
+  confirmDisabled?: boolean
+  onHide: () => void
+}
+
+const CreateAppModal = ({
+  show = false,
+  isEditModal = false,
+  appIconType,
+  appIcon: _appIcon,
+  appIconBackground,
+  appIconUrl,
+  appName,
+  appDescription,
+  appMode,
+  appUseIconAsAnswerIcon,
+  onConfirm,
+  confirmDisabled,
+  onHide,
+}: CreateAppModalProps) => {
+  const { t } = useTranslation()
+
+  const [name, setName] = React.useState(appName)
+  const [appIcon, setAppIcon] = useState(
+    () => appIconType === 'image'
+      ? { type: 'image' as const, fileId: _appIcon, url: appIconUrl }
+      : { type: 'emoji' as const, icon: _appIcon, background: appIconBackground },
+  )
+  const [showAppIconPicker, setShowAppIconPicker] = useState(false)
+  const [description, setDescription] = useState(appDescription || '')
+  const [useIconAsAnswerIcon, setUseIconAsAnswerIcon] = useState(appUseIconAsAnswerIcon || false)
+
+  const { plan, enableBilling } = useProviderContext()
+  const isAppsFull = (enableBilling && plan.usage.buildApps >= plan.total.buildApps)
+
+  const submit = useCallback(() => {
+    if (!name.trim()) {
+      Toast.notify({ type: 'error', message: t('explore.appCustomize.nameRequired') })
+      return
+    }
+    onConfirm({
+      name,
+      icon_type: appIcon.type,
+      icon: appIcon.type === 'emoji' ? appIcon.icon : appIcon.fileId,
+      icon_background: appIcon.type === 'emoji' ? appIcon.background! : undefined,
+      description,
+      use_icon_as_answer_icon: useIconAsAnswerIcon,
+    })
+    onHide()
+  }, [name, appIcon, description, useIconAsAnswerIcon, onConfirm, onHide, t])
+
+  const { run: handleSubmit } = useDebounceFn(submit, { wait: 300 })
+
+  useKeyPress(['meta.enter', 'ctrl.enter'], () => {
+    if (show && !(!isEditModal && isAppsFull) && name.trim())
+      handleSubmit()
+  })
+
+  useKeyPress('esc', () => {
+    if (show)
+      onHide()
+  })
+
+  return (
+    <>
+      <Modal
+        isShow={show}
+        onClose={noop}
+        className='relative !max-w-[480px] px-8'
+      >
+        <div className='absolute right-4 top-4 cursor-pointer p-2' onClick={onHide}>
+          <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+        </div>
+        {isEditModal && (
+          <div className='mb-9 text-xl font-semibold leading-[30px] text-text-primary'>{t('app.editAppTitle')}</div>
+        )}
+        {!isEditModal && (
+          <div className='mb-9 text-xl font-semibold leading-[30px] text-text-primary'>{t('explore.appCustomize.title', { name: appName })}</div>
+        )}
+        <div className='mb-9'>
+          {/* icon & name */}
+          <div className='pt-2'>
+            <div className='py-2 text-sm font-medium leading-[20px] text-text-primary'>{t('app.newApp.captionName')}</div>
+            <div className='flex items-center justify-between space-x-2'>
+              <AppIcon
+                size='large'
+                onClick={() => { setShowAppIconPicker(true) }}
+                className='cursor-pointer'
+                iconType={appIcon.type}
+                icon={appIcon.type === 'image' ? appIcon.fileId : appIcon.icon}
+                background={appIcon.type === 'image' ? undefined : appIcon.background}
+                imageUrl={appIcon.type === 'image' ? appIcon.url : undefined}
+              />
+              <Input
+                value={name}
+                onChange={e => setName(e.target.value)}
+                placeholder={t('app.newApp.appNamePlaceholder') || ''}
+                className='h-10 grow'
+              />
+            </div>
+          </div>
+          {/* description */}
+          <div className='pt-2'>
+            <div className='py-2 text-sm font-medium leading-[20px] text-text-primary'>{t('app.newApp.captionDescription')}</div>
+            <Textarea
+              className='resize-none'
+              placeholder={t('app.newApp.appDescriptionPlaceholder') || ''}
+              value={description}
+              onChange={e => setDescription(e.target.value)}
+            />
+          </div>
+          {/* answer icon */}
+          {isEditModal && (appMode === 'chat' || appMode === 'advanced-chat' || appMode === 'agent-chat') && (
+            <div className='pt-2'>
+              <div className='flex items-center justify-between'>
+                <div className='py-2 text-sm font-medium leading-[20px] text-text-primary'>{t('app.answerIcon.title')}</div>
+                <Switch
+                  defaultValue={useIconAsAnswerIcon}
+                  onChange={v => setUseIconAsAnswerIcon(v)}
+                />
+              </div>
+              <p className='body-xs-regular text-text-tertiary'>{t('app.answerIcon.descriptionInExplore')}</p>
+            </div>
+          )}
+          {!isEditModal && isAppsFull && <AppsFull className='mt-4' loc='app-explore-create' />}
+        </div>
+        <div className='flex flex-row-reverse'>
+          <Button
+            disabled={(!isEditModal && isAppsFull) || !name.trim() || confirmDisabled}
+            className='ml-2 w-24 gap-1'
+            variant='primary'
+            onClick={handleSubmit}
+          >
+            <span>{!isEditModal ? t('common.operation.create') : t('common.operation.save')}</span>
+            <div className='flex gap-0.5'>
+              <RiCommandLine size={14} className='system-kbd rounded-sm bg-components-kbd-bg-white p-0.5' />
+              <RiCornerDownLeftLine size={14} className='system-kbd rounded-sm bg-components-kbd-bg-white p-0.5' />
+            </div>
+          </Button>
+          <Button className='w-24' onClick={onHide}>{t('common.operation.cancel')}</Button>
+        </div>
+      </Modal>
+      {showAppIconPicker && <AppIconPicker
+        onSelect={(payload) => {
+          setAppIcon(payload)
+          setShowAppIconPicker(false)
+        }}
+        onClose={() => {
+          setAppIcon(appIconType === 'image'
+            ? { type: 'image' as const, url: appIconUrl, fileId: _appIcon }
+            : { type: 'emoji' as const, icon: _appIcon, background: appIconBackground })
+          setShowAppIconPicker(false)
+        }}
+      />}
+    </>
+  )
+}
+
+export default CreateAppModal
diff --git a/app/components/explore/index.tsx b/app/components/explore/index.tsx
new file mode 100644
index 0000000..5175b46
--- /dev/null
+++ b/app/components/explore/index.tsx
@@ -0,0 +1,63 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import { useRouter } from 'next/navigation'
+import { useTranslation } from 'react-i18next'
+import ExploreContext from '@/context/explore-context'
+import Sidebar from '@/app/components/explore/sidebar'
+import { useAppContext } from '@/context/app-context'
+import { fetchMembers } from '@/service/common'
+import type { InstalledApp } from '@/models/explore'
+
+export type IExploreProps = {
+  children: React.ReactNode
+}
+
+const Explore: FC<IExploreProps> = ({
+  children,
+}) => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const [controlUpdateInstalledApps, setControlUpdateInstalledApps] = useState(0)
+  const { userProfile, isCurrentWorkspaceDatasetOperator } = useAppContext()
+  const [hasEditPermission, setHasEditPermission] = useState(false)
+  const [installedApps, setInstalledApps] = useState<InstalledApp[]>([])
+
+  useEffect(() => {
+    document.title = `${t('explore.title')} - Dify`;
+    (async () => {
+      const { accounts } = await fetchMembers({ url: '/workspaces/current/members', params: {} })
+      if (!accounts)
+        return
+      const currUser = accounts.find(account => account.id === userProfile.id)
+      setHasEditPermission(currUser?.role !== 'normal')
+    })()
+  }, [])
+
+  useEffect(() => {
+    if (isCurrentWorkspaceDatasetOperator)
+      return router.replace('/datasets')
+  }, [isCurrentWorkspaceDatasetOperator])
+
+  return (
+    <div className='flex h-full overflow-hidden border-t border-divider-regular bg-background-body'>
+      <ExploreContext.Provider
+        value={
+          {
+            controlUpdateInstalledApps,
+            setControlUpdateInstalledApps,
+            hasEditPermission,
+            installedApps,
+            setInstalledApps,
+          }
+        }
+      >
+        <Sidebar controlUpdateInstalledApps={controlUpdateInstalledApps} />
+        <div className='w-0 grow'>
+          {children}
+        </div>
+      </ExploreContext.Provider>
+    </div>
+  )
+}
+export default React.memo(Explore)
diff --git a/app/components/explore/installed-app/index.tsx b/app/components/explore/installed-app/index.tsx
new file mode 100644
index 0000000..62f9452
--- /dev/null
+++ b/app/components/explore/installed-app/index.tsx
@@ -0,0 +1,42 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useContext } from 'use-context-selector'
+import ExploreContext from '@/context/explore-context'
+import TextGenerationApp from '@/app/components/share/text-generation'
+import Loading from '@/app/components/base/loading'
+import ChatWithHistory from '@/app/components/base/chat/chat-with-history'
+
+export type IInstalledAppProps = {
+  id: string
+}
+
+const InstalledApp: FC<IInstalledAppProps> = ({
+  id,
+}) => {
+  const { installedApps } = useContext(ExploreContext)
+  const installedApp = installedApps.find(item => item.id === id)
+
+  if (!installedApp) {
+    return (
+      <div className='flex h-full items-center'>
+        <Loading type='area' />
+      </div>
+    )
+  }
+
+  return (
+    <div className='h-full py-2 pl-0 pr-2 sm:p-2'>
+      {installedApp.app.mode !== 'completion' && installedApp.app.mode !== 'workflow' && (
+        <ChatWithHistory installedAppInfo={installedApp} className='overflow-hidden rounded-2xl shadow-md' />
+      )}
+      {installedApp.app.mode === 'completion' && (
+        <TextGenerationApp isInstalledApp installedAppInfo={installedApp}/>
+      )}
+      {installedApp.app.mode === 'workflow' && (
+        <TextGenerationApp isWorkflow isInstalledApp installedAppInfo={installedApp}/>
+      )}
+    </div>
+  )
+}
+export default React.memo(InstalledApp)
diff --git a/app/components/explore/item-operation/index.tsx b/app/components/explore/item-operation/index.tsx
new file mode 100644
index 0000000..6fd11fd
--- /dev/null
+++ b/app/components/explore/item-operation/index.tsx
@@ -0,0 +1,90 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useRef, useState } from 'react'
+import {
+  RiDeleteBinLine,
+  RiEditLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import { Pin02 } from '../../base/icons/src/vender/line/general'
+
+import s from './style.module.css'
+import cn from '@/utils/classnames'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+
+export type IItemOperationProps = {
+  className?: string
+  isItemHovering?: boolean
+  isPinned: boolean
+  isShowRenameConversation?: boolean
+  onRenameConversation?: () => void
+  isShowDelete: boolean
+  togglePin: () => void
+  onDelete: () => void
+}
+
+const ItemOperation: FC<IItemOperationProps> = ({
+  className,
+  isItemHovering,
+  isPinned,
+  togglePin,
+  isShowRenameConversation,
+  onRenameConversation,
+  isShowDelete,
+  onDelete,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const ref = useRef(null)
+  const [isHovering, { setTrue: setIsHovering, setFalse: setNotHovering }] = useBoolean(false)
+  useEffect(() => {
+    if (!isItemHovering && !isHovering)
+      setOpen(false)
+  }, [isItemHovering, isHovering])
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={4}
+    >
+      <PortalToFollowElemTrigger
+        onClick={() => setOpen(v => !v)}
+      >
+        <div className={cn(className, s.btn, 'h-6 w-6 rounded-md border-none py-1', (isItemHovering || open) && `${s.open} !bg-components-actionbar-bg !shadow-none`)}></div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent
+        className="z-50"
+      >
+        <div
+          ref={ref}
+          className={'min-w-[120px] rounded-lg border border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg backdrop-blur-[5px]'}
+          onMouseEnter={setIsHovering}
+          onMouseLeave={setNotHovering}
+          onClick={(e) => {
+            e.stopPropagation()
+          }}
+        >
+          <div className={cn(s.actionItem, 'group hover:bg-state-base-hover')} onClick={togglePin}>
+            <Pin02 className='h-4 w-4 shrink-0 text-text-secondary' />
+            <span className={s.actionName}>{isPinned ? t('explore.sidebar.action.unpin') : t('explore.sidebar.action.pin')}</span>
+          </div>
+          {isShowRenameConversation && (
+            <div className={cn(s.actionItem, 'group hover:bg-state-base-hover')} onClick={onRenameConversation}>
+              <RiEditLine className='h-4 w-4 shrink-0 text-text-secondary' />
+              <span className={s.actionName}>{t('explore.sidebar.action.rename')}</span>
+            </div>
+          )}
+          {isShowDelete && (
+            <div className={cn(s.actionItem, s.deleteActionItem, 'group hover:bg-state-base-hover')} onClick={onDelete} >
+              <RiDeleteBinLine className={cn(s.deleteActionItemChild, 'h-4 w-4 shrink-0 stroke-current stroke-2 text-text-secondary')} />
+              <span className={cn(s.actionName, s.deleteActionItemChild)}>{t('explore.sidebar.action.delete')}</span>
+            </div>
+          )}
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default React.memo(ItemOperation)
diff --git a/app/components/explore/item-operation/style.module.css b/app/components/explore/item-operation/style.module.css
new file mode 100644
index 0000000..7d4a46a
--- /dev/null
+++ b/app/components/explore/item-operation/style.module.css
@@ -0,0 +1,33 @@
+.actionItem {
+  @apply h-9 py-2 px-3 mx-1 flex items-center gap-2 rounded-lg cursor-pointer;
+}
+
+.actionName {
+  @apply text-text-secondary text-sm;
+}
+
+.commonIcon {
+  @apply w-4 h-4 inline-block align-middle;
+  background-repeat: no-repeat;
+  background-position: center center;
+  background-size: contain;
+}
+
+.actionIcon {
+  @apply bg-gray-500;
+  mask-image: url(~@/assets/action.svg);
+}
+
+body .btn.open,
+body .btn:hover {
+  background: url(~@/assets/action.svg) center center no-repeat transparent;
+  background-size: 16px 16px;
+}
+
+body .btn:hover {
+  background-color: #F2F4F7;
+}
+
+.deleteActionItem:hover .deleteActionItemChild {
+  @apply text-red-500;
+}
diff --git a/app/components/explore/sidebar/app-nav-item/index.tsx b/app/components/explore/sidebar/app-nav-item/index.tsx
new file mode 100644
index 0000000..9b3ca09
--- /dev/null
+++ b/app/components/explore/sidebar/app-nav-item/index.tsx
@@ -0,0 +1,75 @@
+'use client'
+import React, { useRef } from 'react'
+
+import { useRouter } from 'next/navigation'
+import { useHover } from 'ahooks'
+import cn from '@/utils/classnames'
+import ItemOperation from '@/app/components/explore/item-operation'
+import AppIcon from '@/app/components/base/app-icon'
+import type { AppIconType } from '@/types/app'
+
+export type IAppNavItemProps = {
+  isMobile: boolean
+  name: string
+  id: string
+  icon_type: AppIconType | null
+  icon: string
+  icon_background: string
+  icon_url: string
+  isSelected: boolean
+  isPinned: boolean
+  togglePin: () => void
+  uninstallable: boolean
+  onDelete: (id: string) => void
+}
+
+export default function AppNavItem({
+  isMobile,
+  name,
+  id,
+  icon_type,
+  icon,
+  icon_background,
+  icon_url,
+  isSelected,
+  isPinned,
+  togglePin,
+  uninstallable,
+  onDelete,
+}: IAppNavItemProps) {
+  const router = useRouter()
+  const url = `/explore/installed/${id}`
+  const ref = useRef(null)
+  const isHovering = useHover(ref)
+  return (
+    <div
+      ref={ref}
+      key={id}
+      className={cn('system-sm-medium flex h-8 items-center justify-between rounded-lg px-2 text-sm font-normal text-components-menu-item-text mobile:justify-center mobile:px-1',
+        isSelected ? 'bg-state-base-active text-components-menu-item-text-active' : 'hover:bg-state-base-hover hover:text-components-menu-item-text-hover',
+      )}
+      onClick={() => {
+        router.push(url) // use Link causes popup item always trigger jump. Can not be solved by e.stopPropagation().
+      }}
+    >
+      {isMobile && <AppIcon size='tiny' iconType={icon_type} icon={icon} background={icon_background} imageUrl={icon_url} />}
+      {!isMobile && (
+        <>
+          <div className='flex w-0 grow items-center space-x-2'>
+            <AppIcon size='tiny' iconType={icon_type} icon={icon} background={icon_background} imageUrl={icon_url} />
+            <div className='overflow-hidden text-ellipsis whitespace-nowrap' title={name}>{name}</div>
+          </div>
+          <div className='h-6 shrink-0' onClick={e => e.stopPropagation()}>
+            <ItemOperation
+              isPinned={isPinned}
+              isItemHovering={isHovering}
+              togglePin={togglePin}
+              isShowDelete={!uninstallable && !isSelected}
+              onDelete={() => onDelete(id)}
+            />
+          </div>
+        </>
+      )}
+    </div>
+  )
+}
diff --git a/app/components/explore/sidebar/index.tsx b/app/components/explore/sidebar/index.tsx
new file mode 100644
index 0000000..fe5935b
--- /dev/null
+++ b/app/components/explore/sidebar/index.tsx
@@ -0,0 +1,153 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { useSelectedLayoutSegments } from 'next/navigation'
+import Link from 'next/link'
+import Toast from '../../base/toast'
+import Item from './app-nav-item'
+import cn from '@/utils/classnames'
+import { fetchInstalledAppList as doFetchInstalledAppList, uninstallApp, updatePinStatus } from '@/service/explore'
+import ExploreContext from '@/context/explore-context'
+import Confirm from '@/app/components/base/confirm'
+import Divider from '@/app/components/base/divider'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+
+const SelectedDiscoveryIcon = () => (
+  <svg width="16" height="16" viewBox="0 0 16 16" fill="current" xmlns="http://www.w3.org/2000/svg">
+    <path fillRule="evenodd" clipRule="evenodd" d="M13.4135 1.11725C13.5091 1.09983 13.6483 1.08355 13.8078 1.11745C14.0143 1.16136 14.2017 1.26953 14.343 1.42647C14.4521 1.54766 14.5076 1.67634 14.5403 1.76781C14.5685 1.84673 14.593 1.93833 14.6136 2.01504L15.5533 5.5222C15.5739 5.5989 15.5985 5.69049 15.6135 5.77296C15.6309 5.86852 15.6472 6.00771 15.6133 6.16722C15.5694 6.37378 15.4612 6.56114 15.3043 6.70245C15.1831 6.81157 15.0544 6.86706 14.9629 6.89975C14.884 6.92796 14.7924 6.95247 14.7157 6.97299L14.676 6.98364C14.3365 7.07461 14.0437 7.15309 13.7972 7.19802C13.537 7.24543 13.2715 7.26736 12.9946 7.20849C12.7513 7.15677 12.5213 7.06047 12.3156 6.92591L9.63273 7.64477C9.86399 7.97104 9.99992 8.36965 9.99992 8.80001C9.99992 9.2424 9.85628 9.65124 9.6131 9.98245L12.5508 14.291C12.7582 14.5952 12.6797 15.01 12.3755 15.2174C12.0713 15.4248 11.6566 15.3464 11.4492 15.0422L8.51171 10.7339C8.34835 10.777 8.17682 10.8 7.99992 10.8C7.82305 10.8 7.65155 10.777 7.48823 10.734L4.5508 15.0422C4.34338 15.3464 3.92863 15.4248 3.62442 15.2174C3.32021 15.01 3.24175 14.5952 3.44916 14.291L6.3868 9.98254C6.14358 9.65132 5.99992 9.24244 5.99992 8.80001C5.99992 8.73795 6.00274 8.67655 6.00827 8.61594L4.59643 8.99424C4.51973 9.01483 4.42813 9.03941 4.34567 9.05444C4.25011 9.07185 4.11092 9.08814 3.95141 9.05423C3.74485 9.01033 3.55748 8.90215 3.41618 8.74522C3.38535 8.71097 3.3588 8.67614 3.33583 8.64171L2.49206 8.8678C2.41536 8.88838 2.32376 8.91296 2.2413 8.92799C2.14574 8.94541 2.00655 8.96169 1.84704 8.92779C1.64048 8.88388 1.45311 8.77571 1.31181 8.61877C1.20269 8.49759 1.1472 8.3689 1.1145 8.27744C1.08629 8.1985 1.06177 8.10689 1.04125 8.03018L0.791701 7.09885C0.771119 7.02215 0.746538 6.93055 0.731508 6.84809C0.714092 6.75253 0.697808 6.61334 0.731712 6.45383C0.775619 6.24726 0.883793 6.0599 1.04073 5.9186C1.16191 5.80948 1.2906 5.75399 1.38206 5.72129C1.461 5.69307 1.55261 5.66856 1.62932 5.64804L2.47318 5.42193C2.47586 5.38071 2.48143 5.33735 2.49099 5.29237C2.5349 5.08581 2.64307 4.89844 2.80001 4.75714C2.92119 4.64802 3.04988 4.59253 3.14134 4.55983C3.22027 4.53162 3.31189 4.50711 3.3886 4.48658L11.1078 2.41824C11.2186 2.19888 11.3697 2.00049 11.5545 1.83406C11.7649 1.64462 12.0058 1.53085 12.2548 1.44183C12.4907 1.35749 12.7836 1.27904 13.123 1.18809L13.1628 1.17744C13.2395 1.15686 13.3311 1.13228 13.4135 1.11725ZM13.3642 2.5039C13.0648 2.58443 12.8606 2.64126 12.7036 2.69735C12.5325 2.75852 12.4742 2.80016 12.4467 2.82492C12.3421 2.91912 12.2699 3.04403 12.2407 3.18174C12.233 3.21793 12.2261 3.28928 12.2587 3.46805C12.2927 3.6545 12.3564 3.89436 12.4559 4.26563L12.5594 4.652C12.6589 5.02328 12.7236 5.26287 12.7874 5.44133C12.8486 5.61244 12.8902 5.67079 12.915 5.69829C13.0092 5.80291 13.1341 5.87503 13.2718 5.9043C13.308 5.91199 13.3793 5.91887 13.5581 5.88629C13.7221 5.85641 13.9273 5.80352 14.2269 5.72356L13.3642 2.5039Z" fill="currentColor" />
+  </svg>
+)
+
+const DiscoveryIcon = () => (
+  <svg width="16" height="16" viewBox="0 0 16 16" fill="current" xmlns="http://www.w3.org/2000/svg">
+    <path d="M8.74786 9.89676L12.0003 14.6669M7.25269 9.89676L4.00027 14.6669M9.3336 8.80031C9.3336 9.53669 8.73665 10.1336 8.00027 10.1336C7.26389 10.1336 6.66694 9.53669 6.66694 8.80031C6.66694 8.06393 7.26389 7.46698 8.00027 7.46698C8.73665 7.46698 9.3336 8.06393 9.3336 8.80031ZM11.4326 3.02182L3.57641 5.12689C3.39609 5.1752 3.30593 5.19936 3.24646 5.25291C3.19415 5.30001 3.15809 5.36247 3.14345 5.43132C3.12681 5.5096 3.15097 5.59976 3.19929 5.78008L3.78595 7.96951C3.83426 8.14984 3.85842 8.24 3.91197 8.29947C3.95907 8.35178 4.02153 8.38784 4.09038 8.40248C4.16866 8.41911 4.25882 8.39496 4.43914 8.34664L12.2953 6.24158L11.4326 3.02182ZM14.5285 6.33338C13.8072 6.52665 13.4466 6.62328 13.1335 6.55673C12.8581 6.49819 12.6082 6.35396 12.4198 6.14471C12.2056 5.90682 12.109 5.54618 11.9157 4.82489L11.8122 4.43852C11.6189 3.71722 11.5223 3.35658 11.5889 3.04347C11.6474 2.76805 11.7916 2.51823 12.0009 2.32982C12.2388 2.11563 12.5994 2.019 13.3207 1.82573C13.501 1.77741 13.5912 1.75325 13.6695 1.76989C13.7383 1.78452 13.8008 1.82058 13.8479 1.87289C13.9014 1.93237 13.9256 2.02253 13.9739 2.20285L14.9057 5.68018C14.954 5.86051 14.9781 5.95067 14.9615 6.02894C14.9469 6.0978 14.9108 6.16025 14.8585 6.20736C14.799 6.2609 14.7088 6.28506 14.5285 6.33338ZM2.33475 8.22033L3.23628 7.97876C3.4166 7.93044 3.50676 7.90628 3.56623 7.85274C3.61854 7.80563 3.6546 7.74318 3.66924 7.67433C3.68588 7.59605 3.66172 7.50589 3.6134 7.32556L3.37184 6.42403C3.32352 6.24371 3.29936 6.15355 3.24581 6.09408C3.19871 6.04176 3.13626 6.00571 3.0674 5.99107C2.98912 5.97443 2.89896 5.99859 2.71864 6.04691L1.81711 6.28847C1.63678 6.33679 1.54662 6.36095 1.48715 6.4145C1.43484 6.4616 1.39878 6.52405 1.38415 6.59291C1.36751 6.67119 1.39167 6.76135 1.43998 6.94167L1.68155 7.8432C1.72987 8.02352 1.75402 8.11369 1.80757 8.17316C1.85467 8.22547 1.91713 8.26153 1.98598 8.27616C2.06426 8.2928 2.15442 8.26864 2.33475 8.22033Z" stroke="currentColor" strokeWidth="1.25" strokeLinecap="round" strokeLinejoin="round" />
+  </svg>
+)
+
+const SelectedChatIcon = () => (
+  <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path fillRule="evenodd" clipRule="evenodd" d="M8.00016 1.3335C4.31826 1.3335 1.3335 4.31826 1.3335 8.00016C1.3335 8.88571 1.50651 9.7325 1.8212 10.5074C1.84962 10.5773 1.86597 10.6178 1.87718 10.6476L1.88058 10.6568L1.88016 10.66C1.87683 10.6846 1.87131 10.7181 1.86064 10.7821L1.46212 13.1732C1.44424 13.2803 1.42423 13.4001 1.41638 13.5041C1.40782 13.6176 1.40484 13.7981 1.48665 13.9888C1.58779 14.2246 1.77569 14.4125 2.0115 14.5137C2.20224 14.5955 2.38274 14.5925 2.49619 14.5839C2.60025 14.5761 2.72006 14.5561 2.82715 14.5382L5.2182 14.1397C5.28222 14.129 5.31576 14.1235 5.34036 14.1202L5.34353 14.1197L5.35274 14.1231C5.38258 14.1344 5.42298 14.1507 5.49297 14.1791C6.26783 14.4938 7.11462 14.6668 8.00016 14.6668C11.6821 14.6668 14.6668 11.6821 14.6668 8.00016C14.6668 4.31826 11.6821 1.3335 8.00016 1.3335ZM4.00016 8.00016C4.00016 7.44788 4.44788 7.00016 5.00016 7.00016C5.55245 7.00016 6.00016 7.44788 6.00016 8.00016C6.00016 8.55245 5.55245 9.00016 5.00016 9.00016C4.44788 9.00016 4.00016 8.55245 4.00016 8.00016ZM7.00016 8.00016C7.00016 7.44788 7.44788 7.00016 8.00016 7.00016C8.55245 7.00016 9.00016 7.44788 9.00016 8.00016C9.00016 8.55245 8.55245 9.00016 8.00016 9.00016C7.44788 9.00016 7.00016 8.55245 7.00016 8.00016ZM11.0002 7.00016C10.4479 7.00016 10.0002 7.44788 10.0002 8.00016C10.0002 8.55245 10.4479 9.00016 11.0002 9.00016C11.5524 9.00016 12.0002 8.55245 12.0002 8.00016C12.0002 7.44788 11.5524 7.00016 11.0002 7.00016Z" fill="#155EEF" />
+  </svg>
+)
+
+const ChatIcon = () => (
+  <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M5 8H5.00667M8 8H8.00667M11 8H11.0067M8 14C11.3137 14 14 11.3137 14 8C14 4.68629 11.3137 2 8 2C4.68629 2 2 4.68629 2 8C2 8.7981 2.15582 9.5598 2.43871 10.2563C2.49285 10.3897 2.51992 10.4563 2.532 10.5102C2.54381 10.5629 2.54813 10.6019 2.54814 10.6559C2.54814 10.7111 2.53812 10.7713 2.51807 10.8916L2.12275 13.2635C2.08135 13.5119 2.06065 13.6361 2.09917 13.7259C2.13289 13.8045 2.19552 13.8671 2.27412 13.9008C2.36393 13.9393 2.48812 13.9186 2.73651 13.8772L5.10843 13.4819C5.22872 13.4619 5.28887 13.4519 5.34409 13.4519C5.3981 13.4519 5.43711 13.4562 5.48981 13.468C5.54369 13.4801 5.61035 13.5072 5.74366 13.5613C6.4402 13.8442 7.2019 14 8 14ZM5.33333 8C5.33333 8.1841 5.1841 8.33333 5 8.33333C4.81591 8.33333 4.66667 8.1841 4.66667 8C4.66667 7.81591 4.81591 7.66667 5 7.66667C5.1841 7.66667 5.33333 7.81591 5.33333 8ZM8.33333 8C8.33333 8.1841 8.1841 8.33333 8 8.33333C7.81591 8.33333 7.66667 8.1841 7.66667 8C7.66667 7.81591 7.81591 7.66667 8 7.66667C8.1841 7.66667 8.33333 7.81591 8.33333 8ZM11.3333 8C11.3333 8.1841 11.1841 8.33333 11 8.33333C10.8159 8.33333 10.6667 8.1841 10.6667 8C10.6667 7.81591 10.8159 7.66667 11 7.66667C11.1841 7.66667 11.3333 7.81591 11.3333 8Z" stroke="#344054" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" />
+  </svg>
+)
+
+export type IExploreSideBarProps = {
+  controlUpdateInstalledApps: number
+}
+
+const SideBar: FC<IExploreSideBarProps> = ({
+  controlUpdateInstalledApps,
+}) => {
+  const { t } = useTranslation()
+  const segments = useSelectedLayoutSegments()
+  const lastSegment = segments.slice(-1)[0]
+  const isDiscoverySelected = lastSegment === 'apps'
+  const isChatSelected = lastSegment === 'chat'
+  const { installedApps, setInstalledApps } = useContext(ExploreContext)
+
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+
+  const fetchInstalledAppList = async () => {
+    const { installed_apps }: any = await doFetchInstalledAppList()
+    setInstalledApps(installed_apps)
+  }
+
+  const [showConfirm, setShowConfirm] = useState(false)
+  const [currId, setCurrId] = useState('')
+  const handleDelete = async () => {
+    const id = currId
+    await uninstallApp(id)
+    setShowConfirm(false)
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.remove'),
+    })
+    fetchInstalledAppList()
+  }
+
+  const handleUpdatePinStatus = async (id: string, isPinned: boolean) => {
+    await updatePinStatus(id, isPinned)
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.success'),
+    })
+    fetchInstalledAppList()
+  }
+
+  useEffect(() => {
+    fetchInstalledAppList()
+  }, [])
+
+  useEffect(() => {
+    fetchInstalledAppList()
+  }, [controlUpdateInstalledApps])
+
+  const pinnedAppsCount = installedApps.filter(({ is_pinned }) => is_pinned).length
+  return (
+    <div className='w-fit shrink-0 cursor-pointer border-r border-divider-burn px-4 pt-6 sm:w-[216px]'>
+      <div className={cn(isDiscoverySelected ? 'text-text-accent' : 'text-text-tertiary')}>
+        <Link
+          href='/explore/apps'
+          className={cn(isDiscoverySelected ? ' bg-components-main-nav-nav-button-bg-active' : 'font-medium hover:bg-state-base-hover',
+            'flex h-9 items-center gap-2 rounded-lg px-3 mobile:w-fit mobile:justify-center mobile:px-2 pc:w-full pc:justify-start')}
+          style={isDiscoverySelected ? { boxShadow: '0px 1px 2px rgba(16, 24, 40, 0.05)' } : {}}
+        >
+          {isDiscoverySelected ? <SelectedDiscoveryIcon /> : <DiscoveryIcon />}
+          {!isMobile && <div className='text-sm'>{t('explore.sidebar.discovery')}</div>}
+        </Link>
+      </div>
+      {installedApps.length > 0 && (
+        <div className='mt-10'>
+          <p className='break-all pl-2 text-xs font-medium uppercase text-text-tertiary mobile:px-0'>{t('explore.sidebar.workspace')}</p>
+          <div className='mt-3 space-y-1 overflow-y-auto overflow-x-hidden'
+            style={{
+              height: 'calc(100vh - 250px)',
+            }}
+          >
+            {installedApps.map(({ id, is_pinned, uninstallable, app: { name, icon_type, icon, icon_url, icon_background } }, index) => (
+              <React.Fragment key={id}>
+                <Item
+                  isMobile={isMobile}
+                  name={name}
+                  icon_type={icon_type}
+                  icon={icon}
+                  icon_background={icon_background}
+                  icon_url={icon_url}
+                  id={id}
+                  isSelected={lastSegment?.toLowerCase() === id}
+                  isPinned={is_pinned}
+                  togglePin={() => handleUpdatePinStatus(id, !is_pinned)}
+                  uninstallable={uninstallable}
+                  onDelete={(id) => {
+                    setCurrId(id)
+                    setShowConfirm(true)
+                  }}
+                />
+                {index === pinnedAppsCount - 1 && index !== installedApps.length - 1 && <Divider />}
+              </React.Fragment>
+            ))}
+          </div>
+        </div>
+      )}
+      {showConfirm && (
+        <Confirm
+          title={t('explore.sidebar.delete.title')}
+          content={t('explore.sidebar.delete.content')}
+          isShow={showConfirm}
+          onConfirm={handleDelete}
+          onCancel={() => setShowConfirm(false)}
+        />
+      )}
+    </div>
+  )
+}
+
+export default React.memo(SideBar)
diff --git a/app/components/header/account-about/index.tsx b/app/components/header/account-about/index.tsx
new file mode 100644
index 0000000..6129b48
--- /dev/null
+++ b/app/components/header/account-about/index.tsx
@@ -0,0 +1,87 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import Link from 'next/link'
+import dayjs from 'dayjs'
+import { RiCloseLine } from '@remixicon/react'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import type { LangGeniusVersionResponse } from '@/models/common'
+import { IS_CE_EDITION } from '@/config'
+import DifyLogo from '@/app/components/base/logo/dify-logo'
+import { noop } from 'lodash-es'
+
+type IAccountSettingProps = {
+  langeniusVersionInfo: LangGeniusVersionResponse
+  onCancel: () => void
+}
+
+export default function AccountAbout({
+  langeniusVersionInfo,
+  onCancel,
+}: IAccountSettingProps) {
+  const { t } = useTranslation()
+  const isLatest = langeniusVersionInfo.current_version === langeniusVersionInfo.latest_version
+
+  return (
+    <Modal
+      isShow
+      onClose={noop}
+      className='!w-[480px] !max-w-[480px] !px-6 !py-4'
+    >
+      <div>
+        <div className='absolute right-4 top-4 flex h-8 w-8 cursor-pointer items-center justify-center' onClick={onCancel}>
+          <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+        </div>
+        <div className='flex flex-col items-center gap-4 py-8'>
+          <DifyLogo size='large' className='mx-auto' />
+          <div className='text-center text-xs font-normal text-text-tertiary'>Version {langeniusVersionInfo?.current_version}</div>
+          <div className='flex flex-col items-center gap-2 text-center text-xs font-normal text-text-secondary'>
+            <div>漏 {dayjs().year()} LangGenius, Inc., Contributors.</div>
+            <div className='text-text-accent'>
+              {
+                IS_CE_EDITION
+                  ? <Link href={'https://github.com/langgenius/dify/blob/main/LICENSE'} target='_blank' rel='noopener noreferrer'>Open Source License</Link>
+                  : <>
+                    <Link href='https://dify.ai/privacy' target='_blank' rel='noopener noreferrer'>Privacy Policy</Link>,&nbsp;
+                    <Link href='https://dify.ai/terms' target='_blank' rel='noopener noreferrer'>Terms of Service</Link>
+                  </>
+              }
+            </div>
+          </div>
+        </div>
+        <div className='-mx-8 mb-4 h-[0.5px] bg-divider-regular' />
+        <div className='flex items-center justify-between'>
+          <div className='text-xs font-medium text-text-tertiary'>
+            {
+              isLatest
+                ? t('common.about.latestAvailable', { version: langeniusVersionInfo.latest_version })
+                : t('common.about.nowAvailable', { version: langeniusVersionInfo.latest_version })
+            }
+          </div>
+          <div className='flex items-center'>
+            <Button className='mr-2' size='small'>
+              <Link
+                href={'https://github.com/langgenius/dify/releases'}
+                target='_blank' rel='noopener noreferrer'
+              >
+                {t('common.about.changeLog')}
+              </Link>
+            </Button>
+            {
+              !isLatest && !IS_CE_EDITION && (
+                <Button variant='primary' size='small'>
+                  <Link
+                    href={langeniusVersionInfo.release_notes}
+                    target='_blank' rel='noopener noreferrer'
+                  >
+                    {t('common.about.updateNow')}
+                  </Link>
+                </Button>
+              )
+            }
+          </div>
+        </div>
+      </div>
+    </Modal>
+  )
+}
diff --git a/app/components/header/account-dropdown/compliance.tsx b/app/components/header/account-dropdown/compliance.tsx
new file mode 100644
index 0000000..b584968
--- /dev/null
+++ b/app/components/header/account-dropdown/compliance.tsx
@@ -0,0 +1,185 @@
+import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react'
+import { RiArrowDownCircleLine, RiArrowRightSLine, RiVerifiedBadgeLine } from '@remixicon/react'
+import type { FC, MouseEvent } from 'react'
+import { Fragment, useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useMutation } from '@tanstack/react-query'
+import PremiumBadge from '../../base/premium-badge'
+import SparklesSoft from '../../base/icons/src/public/common/SparklesSoft'
+import Button from '../../base/button'
+import Soc2 from '../../base/icons/src/public/common/Soc2'
+import Iso from '../../base/icons/src/public/common/Iso'
+import Gdpr from '../../base/icons/src/public/common/Gdpr'
+import Toast from '../../base/toast'
+import Tooltip from '../../base/tooltip'
+import cn from '@/utils/classnames'
+import { useProviderContext } from '@/context/provider-context'
+import { Plan } from '@/app/components/billing/type'
+import { useModalContext } from '@/context/modal-context'
+import { getDocDownloadUrl } from '@/service/common'
+
+enum DocName {
+  SOC2_Type_I = 'SOC2_Type_I',
+  SOC2_Type_II = 'SOC2_Type_II',
+  ISO_27001 = 'ISO_27001',
+  GDPR = 'GDPR',
+}
+
+type UpgradeOrDownloadProps = {
+  doc_name: DocName
+}
+const UpgradeOrDownload: FC<UpgradeOrDownloadProps> = ({ doc_name }) => {
+  const { t } = useTranslation()
+  const { plan } = useProviderContext()
+  const { setShowPricingModal, setShowAccountSettingModal } = useModalContext()
+  const isFreePlan = plan.type === Plan.sandbox
+
+  const handlePlanClick = useCallback(() => {
+    if (isFreePlan)
+      setShowPricingModal()
+    else
+      setShowAccountSettingModal({ payload: 'billing' })
+  }, [isFreePlan, setShowAccountSettingModal, setShowPricingModal])
+
+  const { isPending, mutate: downloadCompliance } = useMutation({
+    mutationKey: ['downloadCompliance', doc_name],
+    mutationFn: async () => {
+      try {
+        const ret = await getDocDownloadUrl(doc_name)
+        const a = document.createElement('a')
+        a.href = ret.url
+        a.click()
+        Toast.notify({
+          type: 'success',
+          message: t('common.operation.downloadSuccess'),
+        })
+      }
+      catch (error) {
+        console.error(error)
+        Toast.notify({
+          type: 'error',
+          message: t('common.operation.downloadFailed'),
+        })
+      }
+    },
+  })
+  const whichPlanCanDownloadCompliance = {
+    [DocName.SOC2_Type_I]: [Plan.professional, Plan.team],
+    [DocName.SOC2_Type_II]: [Plan.team],
+    [DocName.ISO_27001]: [Plan.team],
+    [DocName.GDPR]: [Plan.team, Plan.professional, Plan.sandbox],
+  }
+
+  const isCurrentPlanCanDownload = whichPlanCanDownloadCompliance[doc_name].includes(plan.type)
+  const handleDownloadClick = useCallback((e: MouseEvent<HTMLButtonElement>) => {
+    e.preventDefault()
+    downloadCompliance()
+  }, [downloadCompliance])
+  if (isCurrentPlanCanDownload) {
+    return <Button loading={isPending} disabled={isPending} size='small' variant='secondary' className='flex items-center gap-[1px]' onClick={handleDownloadClick}>
+      <RiArrowDownCircleLine className='size-[14px] text-components-button-secondary-text-disabled' />
+      <span className='system-xs-medium px-[3px] text-components-button-secondary-text'>{t('common.operation.download')}</span>
+    </Button>
+  }
+  const upgradeTooltip: Record<Plan, string> = {
+    [Plan.sandbox]: t('common.compliance.sandboxUpgradeTooltip'),
+    [Plan.professional]: t('common.compliance.professionalUpgradeTooltip'),
+    [Plan.team]: '',
+    [Plan.enterprise]: '',
+  }
+  return <Tooltip asChild={false} popupContent={upgradeTooltip[plan.type]}>
+    <PremiumBadge color='blue' allowHover={true} onClick={handlePlanClick}>
+      <SparklesSoft className='flex h-3.5 w-3.5 items-center py-[1px] pl-[3px] text-components-premium-badge-indigo-text-stop-0' />
+      <div className='system-xs-medium'>
+        <span className='p-1'>
+          {t('billing.upgradeBtn.encourageShort')}
+        </span>
+      </div>
+    </PremiumBadge>
+  </Tooltip>
+}
+
+export default function Compliance() {
+  const itemClassName = `
+  flex items-center w-full h-10 pl-1 pr-2 py-1 text-text-secondary system-md-regular
+  rounded-lg hover:bg-state-base-hover gap-1
+`
+  const { t } = useTranslation()
+
+  return <Menu as="div" className="relative h-full w-full">
+    {
+      ({ open }) => (
+        <>
+          <MenuButton className={
+            cn('group flex h-9 w-full items-center gap-1 rounded-lg py-2 pl-3 pr-2 hover:bg-state-base-hover',
+              open && 'bg-state-base-hover',
+            )}>
+            <RiVerifiedBadgeLine className='size-4 shrink-0 text-text-tertiary' />
+            <div className='system-md-regular grow px-1 text-left text-text-secondary'>{t('common.userProfile.compliance')}</div>
+            <RiArrowRightSLine className='size-[14px] shrink-0 text-text-tertiary' />
+          </MenuButton>
+          <Transition
+            as={Fragment}
+            enter="transition ease-out duration-100"
+            enterFrom="transform opacity-0 scale-95"
+            enterTo="transform opacity-100 scale-100"
+            leave="transition ease-in duration-75"
+            leaveFrom="transform opacity-100 scale-100"
+            leaveTo="transform opacity-0 scale-95"
+          >
+            <MenuItems
+              className={cn(
+                `absolute top-[1px] z-10 max-h-[70vh] w-[337px] origin-top-right -translate-x-full divide-y divide-divider-subtle overflow-y-scroll
+                rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg backdrop-blur-[5px] focus:outline-none
+              `,
+              )}
+            >
+              <div className="px-1 py-1">
+                <MenuItem>
+                  <div
+                    className={cn(itemClassName, 'group justify-between',
+                      'data-[active]:bg-state-base-hover',
+                    )}>
+                    <Soc2 className='size-7 shrink-0' />
+                    <div className='system-md-regular grow truncate px-1 text-text-secondary'>{t('common.compliance.soc2Type1')}</div>
+                    <UpgradeOrDownload doc_name={DocName.SOC2_Type_I} />
+                  </div>
+                </MenuItem>
+                <MenuItem>
+                  <div
+                    className={cn(itemClassName, 'group justify-between',
+                      'data-[active]:bg-state-base-hover',
+                    )}>
+                    <Soc2 className='size-7 shrink-0' />
+                    <div className='system-md-regular grow truncate px-1 text-text-secondary'>{t('common.compliance.soc2Type2')}</div>
+                    <UpgradeOrDownload doc_name={DocName.SOC2_Type_II} />
+                  </div>
+                </MenuItem>
+                <MenuItem>
+                  <div
+                    className={cn(itemClassName, 'group justify-between',
+                      'data-[active]:bg-state-base-hover',
+                    )}>
+                    <Iso className='size-7 shrink-0' />
+                    <div className='system-md-regular grow truncate px-1 text-text-secondary'>{t('common.compliance.iso27001')}</div>
+                    <UpgradeOrDownload doc_name={DocName.ISO_27001} />
+                  </div>
+                </MenuItem>
+                <MenuItem>
+                  <div
+                    className={cn(itemClassName, 'group justify-between',
+                      'data-[active]:bg-state-base-hover',
+                    )}>
+                    <Gdpr className='size-7 shrink-0' />
+                    <div className='system-md-regular grow truncate px-1 text-text-secondary'>{t('common.compliance.gdpr')}</div>
+                    <UpgradeOrDownload doc_name={DocName.GDPR} />
+                  </div>
+                </MenuItem>
+              </div>
+            </MenuItems>
+          </Transition>
+        </>
+      )
+    }
+  </Menu>
+}
diff --git a/app/components/header/account-dropdown/index.tsx b/app/components/header/account-dropdown/index.tsx
new file mode 100644
index 0000000..4a08a4c
--- /dev/null
+++ b/app/components/header/account-dropdown/index.tsx
@@ -0,0 +1,223 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { Fragment, useState } from 'react'
+import { useRouter } from 'next/navigation'
+import { useContextSelector } from 'use-context-selector'
+import {
+  RiAccountCircleLine,
+  RiArrowRightUpLine,
+  RiBookOpenLine,
+  RiGithubLine,
+  RiGraduationCapFill,
+  RiInformation2Line,
+  RiLogoutBoxRLine,
+  RiMap2Line,
+  RiSettings3Line,
+  RiStarLine,
+  RiTShirt2Line,
+} from '@remixicon/react'
+import Link from 'next/link'
+import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react'
+import Indicator from '../indicator'
+import AccountAbout from '../account-about'
+import GithubStar from '../github-star'
+import Support from './support'
+import Compliance from './compliance'
+import PremiumBadge from '@/app/components/base/premium-badge'
+import { useGetDocLanguage } from '@/context/i18n'
+import Avatar from '@/app/components/base/avatar'
+import ThemeSwitcher from '@/app/components/base/theme-switcher'
+import { logout } from '@/service/common'
+import AppContext, { useAppContext } from '@/context/app-context'
+import { useProviderContext } from '@/context/provider-context'
+import { useModalContext } from '@/context/modal-context'
+import { LicenseStatus } from '@/types/feature'
+import { IS_CLOUD_EDITION } from '@/config'
+import cn from '@/utils/classnames'
+
+export default function AppSelector() {
+  const itemClassName = `
+    flex items-center w-full h-9 pl-3 pr-2 text-text-secondary system-md-regular
+    rounded-lg hover:bg-state-base-hover cursor-pointer gap-1
+  `
+  const router = useRouter()
+  const [aboutVisible, setAboutVisible] = useState(false)
+  const systemFeatures = useContextSelector(AppContext, v => v.systemFeatures)
+
+  const { t } = useTranslation()
+  const { userProfile, langeniusVersionInfo, isCurrentWorkspaceOwner } = useAppContext()
+  const { isEducationAccount } = useProviderContext()
+  const { setShowAccountSettingModal } = useModalContext()
+  const docLanguage = useGetDocLanguage()
+
+  const handleLogout = async () => {
+    await logout({
+      url: '/logout',
+      params: {},
+    })
+
+    localStorage.removeItem('setup_status')
+    localStorage.removeItem('console_token')
+    localStorage.removeItem('refresh_token')
+
+    router.push('/signin')
+  }
+
+  return (
+    <div className="">
+      <Menu as="div" className="relative inline-block text-left">
+        {
+          ({ open }) => (
+            <>
+              <MenuButton className={cn('inline-flex items-center rounded-[20px] p-0.5 hover:bg-background-default-dodge', open && 'bg-background-default-dodge')}>
+                <Avatar avatar={userProfile.avatar_url} name={userProfile.name} size={36} />
+              </MenuButton>
+              <Transition
+                as={Fragment}
+                enter="transition ease-out duration-100"
+                enterFrom="transform opacity-0 scale-95"
+                enterTo="transform opacity-100 scale-100"
+                leave="transition ease-in duration-75"
+                leaveFrom="transform opacity-100 scale-100"
+                leaveTo="transform opacity-0 scale-95"
+              >
+                <MenuItems
+                  className="
+                    absolute right-0 mt-1.5 w-60 max-w-80
+                    origin-top-right divide-y divide-divider-subtle rounded-xl bg-components-panel-bg-blur shadow-lg
+                    backdrop-blur-sm focus:outline-none
+                  "
+                >
+                  <MenuItem disabled>
+                    <div className='flex flex-nowrap items-center py-[13px] pl-3 pr-2'>
+                      <div className='grow'>
+                        <div className='system-md-medium break-all text-text-primary'>
+                          {userProfile.name}
+                          {isEducationAccount && (
+                            <PremiumBadge size='s' color='blue' className='ml-1 !px-2'>
+                              <RiGraduationCapFill className='mr-1 h-3 w-3' />
+                              <span className='system-2xs-medium'>EDU</span>
+                            </PremiumBadge>
+                          )}
+                        </div>
+                        <div className='system-xs-regular break-all text-text-tertiary'>{userProfile.email}</div>
+                      </div>
+                      <Avatar avatar={userProfile.avatar_url} name={userProfile.name} size={36} className='mr-3' />
+                    </div>
+                  </MenuItem>
+                  <div className="px-1 py-1">
+                    <MenuItem>
+                      <Link
+                        className={cn(itemClassName, 'group',
+                          'data-[active]:bg-state-base-hover',
+                        )}
+                        href='/account'
+                        target='_self' rel='noopener noreferrer'>
+                        <RiAccountCircleLine className='size-4 shrink-0 text-text-tertiary' />
+                        <div className='system-md-regular grow px-1 text-text-secondary'>{t('common.account.account')}</div>
+                        <RiArrowRightUpLine className='size-[14px] shrink-0 text-text-tertiary' />
+                      </Link>
+                    </MenuItem>
+                    <MenuItem>
+                      <div className={cn(itemClassName,
+                        'data-[active]:bg-state-base-hover',
+                      )} onClick={() => setShowAccountSettingModal({ payload: 'members' })}>
+                        <RiSettings3Line className='size-4 shrink-0 text-text-tertiary' />
+                        <div className='system-md-regular grow px-1 text-text-secondary'>{t('common.userProfile.settings')}</div>
+                      </div>
+                    </MenuItem>
+                  </div>
+                  <div className='p-1'>
+                    <MenuItem>
+                      <Link
+                        className={cn(itemClassName, 'group justify-between',
+                          'data-[active]:bg-state-base-hover',
+                        )}
+                        href={`https://docs.dify.ai/${docLanguage}/introduction`}
+                        target='_blank' rel='noopener noreferrer'>
+                        <RiBookOpenLine className='size-4 shrink-0 text-text-tertiary' />
+                        <div className='system-md-regular grow px-1 text-text-secondary'>{t('common.userProfile.helpCenter')}</div>
+                        <RiArrowRightUpLine className='size-[14px] shrink-0 text-text-tertiary' />
+                      </Link>
+                    </MenuItem>
+                    <Support />
+                    {IS_CLOUD_EDITION && isCurrentWorkspaceOwner && <Compliance />}
+                  </div>
+                  <div className='p-1'>
+                    <MenuItem>
+                      <Link
+                        className={cn(itemClassName, 'group justify-between',
+                          'data-[active]:bg-state-base-hover',
+                        )}
+                        href='https://roadmap.dify.ai'
+                        target='_blank' rel='noopener noreferrer'>
+                        <RiMap2Line className='size-4 shrink-0 text-text-tertiary' />
+                        <div className='system-md-regular grow px-1 text-text-secondary'>{t('common.userProfile.roadmap')}</div>
+                        <RiArrowRightUpLine className='size-[14px] shrink-0 text-text-tertiary' />
+                      </Link>
+                    </MenuItem>
+                    {systemFeatures.license.status === LicenseStatus.NONE && <MenuItem>
+                      <Link
+                        className={cn(itemClassName, 'group justify-between',
+                          'data-[active]:bg-state-base-hover',
+                        )}
+                        href='https://github.com/langgenius/dify'
+                        target='_blank' rel='noopener noreferrer'>
+                        <RiGithubLine className='size-4 shrink-0 text-text-tertiary' />
+                        <div className='system-md-regular grow px-1 text-text-secondary'>{t('common.userProfile.github')}</div>
+                        <div className='flex items-center gap-0.5 rounded-[5px] border border-divider-deep bg-components-badge-bg-dimm px-[5px] py-[3px]'>
+                          <RiStarLine className='size-3 shrink-0 text-text-tertiary' />
+                          <GithubStar className='system-2xs-medium-uppercase text-text-tertiary' />
+                        </div>
+                      </Link>
+                    </MenuItem>}
+                    {
+                      document?.body?.getAttribute('data-public-site-about') !== 'hide' && (
+                        <MenuItem>
+                          <div className={cn(itemClassName, 'justify-between',
+                            'data-[active]:bg-state-base-hover',
+                          )} onClick={() => setAboutVisible(true)}>
+                            <RiInformation2Line className='size-4 shrink-0 text-text-tertiary' />
+                            <div className='system-md-regular grow px-1 text-text-secondary'>{t('common.userProfile.about')}</div>
+                            <div className='flex shrink-0 items-center'>
+                              <div className='system-xs-regular mr-2 text-text-tertiary'>{langeniusVersionInfo.current_version}</div>
+                              <Indicator color={langeniusVersionInfo.current_version === langeniusVersionInfo.latest_version ? 'green' : 'orange'} />
+                            </div>
+                          </div>
+                        </MenuItem>
+                      )
+                    }
+                  </div>
+                  <MenuItem disabled>
+                    <div className='p-1'>
+                      <div className={cn(itemClassName, 'hover:bg-transparent')}>
+                        <RiTShirt2Line className='size-4 shrink-0 text-text-tertiary' />
+                        <div className='system-md-regular grow px-1 text-text-secondary'>{t('common.theme.theme')}</div>
+                        <ThemeSwitcher/>
+                      </div>
+                    </div>
+                  </MenuItem>
+                  <MenuItem>
+                    <div className='p-1' onClick={() => handleLogout()}>
+                      <div
+                        className={cn(itemClassName, 'group justify-between',
+                          'data-[active]:bg-state-base-hover',
+                        )}
+                      >
+                        <RiLogoutBoxRLine className='size-4 shrink-0 text-text-tertiary' />
+                        <div className='system-md-regular grow px-1 text-text-secondary'>{t('common.userProfile.logout')}</div>
+                      </div>
+                    </div>
+                  </MenuItem>
+                </MenuItems>
+              </Transition>
+            </>
+          )
+        }
+      </Menu>
+      {
+        aboutVisible && <AccountAbout onCancel={() => setAboutVisible(false)} langeniusVersionInfo={langeniusVersionInfo} />
+      }
+    </div >
+  )
+}
diff --git a/app/components/header/account-dropdown/support.tsx b/app/components/header/account-dropdown/support.tsx
new file mode 100644
index 0000000..e4731d2
--- /dev/null
+++ b/app/components/header/account-dropdown/support.tsx
@@ -0,0 +1,94 @@
+import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react'
+import { RiArrowRightSLine, RiArrowRightUpLine, RiDiscordLine, RiFeedbackLine, RiMailSendLine, RiQuestionLine } from '@remixicon/react'
+import { Fragment } from 'react'
+import Link from 'next/link'
+import { useTranslation } from 'react-i18next'
+import { mailToSupport } from '../utils/util'
+import cn from '@/utils/classnames'
+import { useProviderContext } from '@/context/provider-context'
+import { Plan } from '@/app/components/billing/type'
+import { useAppContext } from '@/context/app-context'
+
+export default function Support() {
+  const itemClassName = `
+  flex items-center w-full h-9 pl-3 pr-2 text-text-secondary system-md-regular
+  rounded-lg hover:bg-state-base-hover cursor-pointer gap-1
+`
+  const { t } = useTranslation()
+  const { plan } = useProviderContext()
+  const { userProfile, langeniusVersionInfo } = useAppContext()
+  const canEmailSupport = plan.type === Plan.professional || plan.type === Plan.team || plan.type === Plan.enterprise
+
+  return <Menu as="div" className="relative h-full w-full">
+    {
+      ({ open }) => (
+        <>
+          <MenuButton className={
+            cn('group flex h-9 w-full items-center gap-1 rounded-lg py-2 pl-3 pr-2 hover:bg-state-base-hover',
+              open && 'bg-state-base-hover',
+            )}>
+            <RiQuestionLine className='size-4 shrink-0 text-text-tertiary' />
+            <div className='system-md-regular grow px-1 text-left text-text-secondary'>{t('common.userProfile.support')}</div>
+            <RiArrowRightSLine className='size-[14px] shrink-0 text-text-tertiary' />
+          </MenuButton>
+          <Transition
+            as={Fragment}
+            enter="transition ease-out duration-100"
+            enterFrom="transform opacity-0 scale-95"
+            enterTo="transform opacity-100 scale-100"
+            leave="transition ease-in duration-75"
+            leaveFrom="transform opacity-100 scale-100"
+            leaveTo="transform opacity-0 scale-95"
+          >
+            <MenuItems
+              className={cn(
+                `absolute top-[1px] z-10 max-h-[70vh] w-[216px] origin-top-right -translate-x-full divide-y divide-divider-subtle overflow-y-scroll
+                rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg backdrop-blur-[5px] focus:outline-none
+              `,
+              )}
+            >
+              <div className="px-1 py-1">
+                {canEmailSupport && <MenuItem>
+                  <a
+                    className={cn(itemClassName, 'group justify-between',
+                      'data-[active]:bg-state-base-hover',
+                    )}
+                    href={mailToSupport(userProfile.email, plan.type, langeniusVersionInfo.current_version)}
+                    target='_blank' rel='noopener noreferrer'>
+                    <RiMailSendLine className='size-4 shrink-0 text-text-tertiary' />
+                    <div className='system-md-regular grow px-1 text-text-secondary'>{t('common.userProfile.emailSupport')}</div>
+                    <RiArrowRightUpLine className='size-[14px] shrink-0 text-text-tertiary' />
+                  </a>
+                </MenuItem>}
+                <MenuItem>
+                  <Link
+                    className={cn(itemClassName, 'group justify-between',
+                      'data-[active]:bg-state-base-hover',
+                    )}
+                    href='https://github.com/langgenius/dify/discussions/categories/feedbacks'
+                    target='_blank' rel='noopener noreferrer'>
+                    <RiFeedbackLine className='size-4 shrink-0 text-text-tertiary' />
+                    <div className='system-md-regular grow px-1 text-text-secondary'>{t('common.userProfile.communityFeedback')}</div>
+                    <RiArrowRightUpLine className='size-[14px] shrink-0 text-text-tertiary' />
+                  </Link>
+                </MenuItem>
+                <MenuItem>
+                  <Link
+                    className={cn(itemClassName, 'group justify-between',
+                      'data-[active]:bg-state-base-hover',
+                    )}
+                    href='https://discord.gg/5AEfbxcd9k'
+                    target='_blank' rel='noopener noreferrer'>
+                    <RiDiscordLine className='size-4 shrink-0 text-text-tertiary' />
+                    <div className='system-md-regular grow px-1 text-text-secondary'>{t('common.userProfile.community')}</div>
+                    <RiArrowRightUpLine className='size-[14px] shrink-0 text-text-tertiary' />
+                  </Link>
+                </MenuItem>
+              </div>
+            </MenuItems>
+          </Transition>
+        </>
+      )
+    }
+  </Menu>
+}
diff --git a/app/components/header/account-dropdown/workplace-selector/index.module.css b/app/components/header/account-dropdown/workplace-selector/index.module.css
new file mode 100644
index 0000000..c3184f7
--- /dev/null
+++ b/app/components/header/account-dropdown/workplace-selector/index.module.css
@@ -0,0 +1,5 @@
+.popup {
+  left: 4px;
+  transform: translateX(-100%);
+  box-shadow: 0px 12px 16px -4px rgba(16, 24, 40, 0.08), 0px 4px 6px -2px rgba(16, 24, 40, 0.03);
+}
diff --git a/app/components/header/account-dropdown/workplace-selector/index.tsx b/app/components/header/account-dropdown/workplace-selector/index.tsx
new file mode 100644
index 0000000..b62e607
--- /dev/null
+++ b/app/components/header/account-dropdown/workplace-selector/index.tsx
@@ -0,0 +1,94 @@
+import { Fragment } from 'react'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import { Menu, MenuButton, MenuItems, Transition } from '@headlessui/react'
+import { RiArrowDownSLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import { WEB_PREFIX } from '@/config'
+import PlanBadge from '@/app/components/header/plan-badge'
+import { switchWorkspace } from '@/service/common'
+import { useWorkspacesContext } from '@/context/workspace-context'
+import { ToastContext } from '@/app/components/base/toast'
+import type { Plan } from '@/app/components/billing/type'
+
+const WorkplaceSelector = () => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const { workspaces } = useWorkspacesContext()
+  const currentWorkspace = workspaces.find(v => v.current)
+
+  const handleSwitchWorkspace = async (tenant_id: string) => {
+    try {
+      if (currentWorkspace?.id === tenant_id)
+        return
+      await switchWorkspace({ url: '/workspaces/switch', body: { tenant_id } })
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      location.assign(WEB_PREFIX)
+    }
+    catch {
+      notify({ type: 'error', message: t('common.provider.saveFailed') })
+    }
+  }
+
+  return (
+    <Menu as="div" className="relative h-full w-full">
+      {
+        ({ open }) => (
+          <>
+            <MenuButton className={cn(
+              `
+                group flex w-full cursor-pointer items-center
+                gap-1.5 p-0.5 hover:bg-state-base-hover ${open && 'bg-state-base-hover'} rounded-[10px]
+              `,
+            )}>
+              <div className='flex h-6 w-6 items-center justify-center rounded-md bg-components-icon-bg-blue-solid text-[13px]'>
+                <span className='h-6 bg-gradient-to-r from-components-avatar-shape-fill-stop-0 to-components-avatar-shape-fill-stop-100 bg-clip-text align-middle font-semibold uppercase leading-6 text-shadow-shadow-1 opacity-90'>{currentWorkspace?.name[0]?.toLocaleUpperCase()}</span>
+              </div>
+              <div className='flex flex-row'>
+                <div className={'system-sm-medium max-w-[160px] truncate text-text-secondary'}>{currentWorkspace?.name}</div>
+                <RiArrowDownSLine className='h-4 w-4 text-text-secondary' />
+              </div>
+            </MenuButton>
+            <Transition
+              as={Fragment}
+              enter="transition ease-out duration-100"
+              enterFrom="transform opacity-0 scale-95"
+              enterTo="transform opacity-100 scale-100"
+              leave="transition ease-in duration-75"
+              leaveFrom="transform opacity-100 scale-100"
+              leaveTo="transform opacity-0 scale-95"
+            >
+              <MenuItems
+                className={cn(
+                  `
+                    shadows-shadow-lg absolute left-[-15px] mt-1 flex max-h-[400px] w-[280px] flex-col items-start overflow-y-auto rounded-xl
+                    bg-components-panel-bg-blur backdrop-blur-[5px]
+                  `,
+                )}
+              >
+                <div className="flex w-full flex-col items-start self-stretch rounded-xl border-[0.5px] border-components-panel-border p-1 pb-2 shadow-lg ">
+                  <div className='flex items-start self-stretch px-3 pb-0.5 pt-1'>
+                    <span className='system-xs-medium-uppercase flex-1 text-text-tertiary'>{t('common.userProfile.workspace')}</span>
+                  </div>
+                  {
+                    workspaces.map(workspace => (
+                      <div className='flex items-center gap-2 self-stretch rounded-lg py-1 pl-3 pr-2 hover:bg-state-base-hover' key={workspace.id} onClick={() => handleSwitchWorkspace(workspace.id)}>
+                        <div className='flex h-6 w-6 items-center justify-center rounded-md bg-components-icon-bg-blue-solid text-[13px]'>
+                          <span className='h-6 bg-gradient-to-r from-components-avatar-shape-fill-stop-0 to-components-avatar-shape-fill-stop-100 bg-clip-text align-middle font-semibold uppercase leading-6 text-shadow-shadow-1 opacity-90'>{workspace?.name[0]?.toLocaleUpperCase()}</span>
+                        </div>
+                        <div className='system-md-regular line-clamp-1 grow cursor-pointer overflow-hidden text-ellipsis text-text-secondary'>{workspace.name}</div>
+                        <PlanBadge plan={workspace.plan as Plan} />
+                      </div>
+                    ))
+                  }
+                </div>
+              </MenuItems>
+            </Transition>
+          </>
+        )
+      }
+    </Menu>
+  )
+}
+
+export default WorkplaceSelector
diff --git a/app/components/header/account-setting/Integrations-page/index.module.css b/app/components/header/account-setting/Integrations-page/index.module.css
new file mode 100644
index 0000000..7c2a883
--- /dev/null
+++ b/app/components/header/account-setting/Integrations-page/index.module.css
@@ -0,0 +1,24 @@
+.google-icon {
+  background: url(../../assets/google.svg) center center no-repeat;
+  background-size: 16px 16px;
+}
+
+.github-icon {
+  background: url(../../assets/github.svg) center center no-repeat;
+  background-size: 16px 16px;
+}
+
+.twitter-icon {
+  background: url(../../assets/twitter.svg) center center no-repeat;
+  background-size: 16px 16px;
+}
+
+.bitbucket-icon {
+  background: url(../../assets/bitbucket.svg) center center no-repeat;
+  background-size: 16px 16px;
+}
+
+.salesforce-icon {
+  background: url(../../assets/salesforce.svg) center center no-repeat;
+  background-size: 24px auto;
+}
diff --git a/app/components/header/account-setting/Integrations-page/index.tsx b/app/components/header/account-setting/Integrations-page/index.tsx
new file mode 100644
index 0000000..0d346e0
--- /dev/null
+++ b/app/components/header/account-setting/Integrations-page/index.tsx
@@ -0,0 +1,74 @@
+'use client'
+
+import { useTranslation } from 'react-i18next'
+import useSWR from 'swr'
+import Link from 'next/link'
+import s from './index.module.css'
+import classNames from '@/utils/classnames'
+import { fetchAccountIntegrates } from '@/service/common'
+
+const titleClassName = `
+  mb-2 text-sm font-medium text-gray-900
+`
+
+export default function IntegrationsPage() {
+  const { t } = useTranslation()
+
+  const integrateMap = {
+    google: {
+      name: t('common.integrations.google'),
+      description: t('common.integrations.googleAccount'),
+    },
+    github: {
+      name: t('common.integrations.github'),
+      description: t('common.integrations.githubAccount'),
+    },
+  }
+
+  const { data } = useSWR({ url: '/account/integrates' }, fetchAccountIntegrates)
+  const integrates = data?.data?.length ? data.data : []
+
+  return (
+    <>
+      <div className='mb-8'>
+        <div className={titleClassName}>{t('common.integrations.connected')}</div>
+        {
+          integrates.map(integrate => (
+            <div key={integrate.provider} className='mb-2 flex items-center rounded-lg border-[0.5px] border-gray-200 bg-gray-50 px-3 py-2'>
+              <div className={classNames('w-8 h-8 mr-3 bg-white rounded-lg border border-gray-100', s[`${integrate.provider}-icon`])} />
+              <div className='grow'>
+                <div className='text-sm font-medium leading-[21px] text-gray-800'>{integrateMap[integrate.provider].name}</div>
+                <div className='text-xs font-normal leading-[18px] text-gray-500'>{integrateMap[integrate.provider].description}</div>
+              </div>
+              {
+                !integrate.is_bound && (
+                  <Link
+                    className='flex h-8 cursor-pointer items-center rounded-lg border border-gray-200 bg-white px-[7px] text-xs font-medium text-gray-700'
+                    href={integrate.link}
+                    target='_blank' rel='noopener noreferrer'>
+                    {t('common.integrations.connect')}
+                  </Link>
+                )
+              }
+            </div>
+          ))
+        }
+      </div>
+      {/* <div className='mb-8'>
+        <div className={titleClassName}>Add a service </div>
+        {
+          services.map(service => (
+            <div key={service.key} className='mb-2 flex items-center px-3 py-2 bg-gray-50 border-[0.5px] border-gray-200 rounded-lg'>
+              <div className={classNames('w-8 h-8 mr-3 bg-white rounded-lg border border-gray-100', s[`${service.key}-icon`])} />
+              <div className='grow'>
+                <div className='leading-[21px] text-sm font-medium text-gray-800'>{service.name}</div>
+                <div className='leading-[18px] text-xs font-normal text-gray-500'>{service.description}</div>
+              </div>
+              <Button className='text-xs font-medium text-gray-800'>Connect</Button>
+            </div>
+          ))
+        }
+      </div> */}
+    </>
+  )
+}
diff --git a/app/components/header/account-setting/api-based-extension-page/empty.tsx b/app/components/header/account-setting/api-based-extension-page/empty.tsx
new file mode 100644
index 0000000..a7c7391
--- /dev/null
+++ b/app/components/header/account-setting/api-based-extension-page/empty.tsx
@@ -0,0 +1,28 @@
+import { useTranslation } from 'react-i18next'
+import {
+  RiExternalLinkLine,
+  RiPuzzle2Line,
+} from '@remixicon/react'
+
+const Empty = () => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='mb-2 rounded-xl bg-background-section p-6'>
+      <div className='mb-3 flex h-10 w-10 items-center justify-center rounded-[10px] border-[0.5px] border-components-card-border bg-components-card-bg-alt shadow-lg backdrop-blur-sm'>
+        <RiPuzzle2Line className='h-5 w-5 text-text-accent' />
+      </div>
+      <div className='system-sm-medium mb-1 text-text-secondary'>{t('common.apiBasedExtension.title')}</div>
+      <a
+        className='system-xs-regular flex items-center text-text-accent'
+        href={t('common.apiBasedExtension.linkUrl') || '/'}
+        target='_blank' rel='noopener noreferrer'
+      >
+        {t('common.apiBasedExtension.link')}
+        <RiExternalLinkLine className='ml-1 h-3 w-3' />
+      </a>
+    </div>
+  )
+}
+
+export default Empty
diff --git a/app/components/header/account-setting/api-based-extension-page/index.tsx b/app/components/header/account-setting/api-based-extension-page/index.tsx
new file mode 100644
index 0000000..d16c4f2
--- /dev/null
+++ b/app/components/header/account-setting/api-based-extension-page/index.tsx
@@ -0,0 +1,57 @@
+import { useTranslation } from 'react-i18next'
+import useSWR from 'swr'
+import {
+  RiAddLine,
+} from '@remixicon/react'
+import Item from './item'
+import Empty from './empty'
+import Button from '@/app/components/base/button'
+import { useModalContext } from '@/context/modal-context'
+import { fetchApiBasedExtensionList } from '@/service/common'
+
+const ApiBasedExtensionPage = () => {
+  const { t } = useTranslation()
+  const { setShowApiBasedExtensionModal } = useModalContext()
+  const { data, mutate, isLoading } = useSWR(
+    '/api-based-extension',
+    fetchApiBasedExtensionList,
+  )
+
+  const handleOpenApiBasedExtensionModal = () => {
+    setShowApiBasedExtensionModal({
+      payload: {},
+      onSaveCallback: () => mutate(),
+    })
+  }
+
+  return (
+    <div>
+      {
+        !isLoading && !data?.length && (
+          <Empty />
+        )
+      }
+      {
+        !isLoading && !!data?.length && (
+          data.map(item => (
+            <Item
+              key={item.id}
+              data={item}
+              onUpdate={() => mutate()}
+            />
+          ))
+        )
+      }
+      <Button
+        variant='secondary'
+        className='w-full'
+        onClick={handleOpenApiBasedExtensionModal}
+      >
+        <RiAddLine className='mr-1 h-4 w-4' />
+        {t('common.apiBasedExtension.add')}
+      </Button>
+    </div>
+  )
+}
+
+export default ApiBasedExtensionPage
diff --git a/app/components/header/account-setting/api-based-extension-page/item.tsx b/app/components/header/account-setting/api-based-extension-page/item.tsx
new file mode 100644
index 0000000..5a9ed24
--- /dev/null
+++ b/app/components/header/account-setting/api-based-extension-page/item.tsx
@@ -0,0 +1,74 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiDeleteBinLine,
+  RiEditLine,
+} from '@remixicon/react'
+import Button from '@/app/components/base/button'
+import type { ApiBasedExtension } from '@/models/common'
+import { useModalContext } from '@/context/modal-context'
+import { deleteApiBasedExtension } from '@/service/common'
+import Confirm from '@/app/components/base/confirm'
+
+type ItemProps = {
+  data: ApiBasedExtension
+  onUpdate: () => void
+}
+const Item: FC<ItemProps> = ({
+  data,
+  onUpdate,
+}) => {
+  const { t } = useTranslation()
+  const { setShowApiBasedExtensionModal } = useModalContext()
+  const [showDeleteConfirm, setShowDeleteConfirm] = useState(false)
+
+  const handleOpenApiBasedExtensionModal = () => {
+    setShowApiBasedExtensionModal({
+      payload: data,
+      onSaveCallback: () => onUpdate(),
+    })
+  }
+  const handleDeleteApiBasedExtension = async () => {
+    await deleteApiBasedExtension(`/api-based-extension/${data.id}`)
+
+    setShowDeleteConfirm(false)
+    onUpdate()
+  }
+
+  return (
+    <div className='group mb-2 flex items-center rounded-xl border-[0.5px] border-transparent bg-components-input-bg-normal px-4 py-2 hover:border-components-input-border-active hover:shadow-xs'>
+      <div className='grow'>
+        <div className='mb-0.5 text-[13px] font-medium text-text-secondary'>{data.name}</div>
+        <div className='text-xs text-text-tertiary'>{data.api_endpoint}</div>
+      </div>
+      <div className='hidden items-center group-hover:flex'>
+        <Button
+          className='mr-1'
+          onClick={handleOpenApiBasedExtensionModal}
+        >
+          <RiEditLine className='mr-1 h-4 w-4' />
+          {t('common.operation.edit')}
+        </Button>
+        <Button
+          onClick={() => setShowDeleteConfirm(true)}
+        >
+          <RiDeleteBinLine className='mr-1 h-4 w-4' />
+          {t('common.operation.delete')}
+        </Button>
+      </div>
+      {
+        showDeleteConfirm
+          && <Confirm
+            isShow={showDeleteConfirm}
+            onCancel={() => setShowDeleteConfirm(false)}
+            title={`${t('common.operation.delete')} 鈥�${data.name}鈥�?`}
+            onConfirm={handleDeleteApiBasedExtension}
+            confirmText={t('common.operation.delete') || ''}
+          />
+      }
+    </div>
+  )
+}
+
+export default Item
diff --git a/app/components/header/account-setting/api-based-extension-page/modal.tsx b/app/components/header/account-setting/api-based-extension-page/modal.tsx
new file mode 100644
index 0000000..53f7673
--- /dev/null
+++ b/app/components/header/account-setting/api-based-extension-page/modal.tsx
@@ -0,0 +1,150 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import { BookOpen01 } from '@/app/components/base/icons/src/vender/line/education'
+import type { ApiBasedExtension } from '@/models/common'
+import {
+  addApiBasedExtension,
+  updateApiBasedExtension,
+} from '@/service/common'
+import { useToastContext } from '@/app/components/base/toast'
+import { noop } from 'lodash-es'
+
+export type ApiBasedExtensionData = {
+  name?: string
+  apiEndpoint?: string
+  apiKey?: string
+}
+
+type ApiBasedExtensionModalProps = {
+  data: ApiBasedExtension
+  onCancel: () => void
+  onSave?: (newData: ApiBasedExtension) => void
+}
+const ApiBasedExtensionModal: FC<ApiBasedExtensionModalProps> = ({
+  data,
+  onCancel,
+  onSave,
+}) => {
+  const { t } = useTranslation()
+  const [localeData, setLocaleData] = useState(data)
+  const [loading, setLoading] = useState(false)
+  const { notify } = useToastContext()
+  const handleDataChange = (type: string, value: string) => {
+    setLocaleData({ ...localeData, [type]: value })
+  }
+  const handleSave = async () => {
+    setLoading(true)
+
+    if (localeData && localeData.api_key && localeData.api_key?.length < 5) {
+      notify({ type: 'error', message: t('common.apiBasedExtension.modal.apiKey.lengthError') })
+      setLoading(false)
+      return
+    }
+
+    try {
+      let res: ApiBasedExtension = {}
+      if (!data.id) {
+        res = await addApiBasedExtension({
+          url: '/api-based-extension',
+          body: localeData,
+        })
+      }
+      else {
+        res = await updateApiBasedExtension({
+          url: `/api-based-extension/${data.id}`,
+          body: {
+            ...localeData,
+            api_key: data.api_key === localeData.api_key ? '[__HIDDEN__]' : localeData.api_key,
+          },
+        })
+
+        notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      }
+
+      if (onSave)
+        onSave(res)
+    }
+    finally {
+      setLoading(false)
+    }
+  }
+
+  return (
+    <Modal
+      isShow
+      onClose={noop}
+      className='!w-[640px] !max-w-none !p-8 !pb-6'
+    >
+      <div className='mb-2 text-xl font-semibold text-text-primary'>
+        {
+          data.name
+            ? t('common.apiBasedExtension.modal.editTitle')
+            : t('common.apiBasedExtension.modal.title')
+        }
+      </div>
+      <div className='py-2'>
+        <div className='text-sm font-medium leading-9 text-text-primary'>
+          {t('common.apiBasedExtension.modal.name.title')}
+        </div>
+        <input
+          value={localeData.name || ''}
+          onChange={e => handleDataChange('name', e.target.value)}
+          className='block h-9 w-full appearance-none rounded-lg bg-components-input-bg-normal px-3 text-sm text-text-primary outline-none'
+          placeholder={t('common.apiBasedExtension.modal.name.placeholder') || ''}
+        />
+      </div>
+      <div className='py-2'>
+        <div className='flex h-9 items-center justify-between text-sm font-medium text-text-primary'>
+          {t('common.apiBasedExtension.modal.apiEndpoint.title')}
+          <a
+            href={t('common.apiBasedExtension.linkUrl') || '/'}
+            target='_blank' rel='noopener noreferrer'
+            className='group flex items-center text-xs font-normal text-text-accent'
+          >
+            <BookOpen01 className='mr-1 h-3 w-3' />
+            {t('common.apiBasedExtension.link')}
+          </a>
+        </div>
+        <input
+          value={localeData.api_endpoint || ''}
+          onChange={e => handleDataChange('api_endpoint', e.target.value)}
+          className='block h-9 w-full appearance-none rounded-lg bg-components-input-bg-normal px-3 text-sm text-text-primary outline-none'
+          placeholder={t('common.apiBasedExtension.modal.apiEndpoint.placeholder') || ''}
+        />
+      </div>
+      <div className='py-2'>
+        <div className='text-sm font-medium leading-9 text-text-primary'>
+          {t('common.apiBasedExtension.modal.apiKey.title')}
+        </div>
+        <div className='flex items-center'>
+          <input
+            value={localeData.api_key || ''}
+            onChange={e => handleDataChange('api_key', e.target.value)}
+            className='mr-2 block h-9 grow appearance-none rounded-lg bg-components-input-bg-normal px-3 text-sm text-text-primary outline-none'
+            placeholder={t('common.apiBasedExtension.modal.apiKey.placeholder') || ''}
+          />
+        </div>
+      </div>
+      <div className='mt-6 flex items-center justify-end'>
+        <Button
+          onClick={onCancel}
+          className='mr-2'
+        >
+          {t('common.operation.cancel')}
+        </Button>
+        <Button
+          variant='primary'
+          disabled={!localeData.name || !localeData.api_endpoint || !localeData.api_key || loading}
+          onClick={handleSave}
+        >
+          {t('common.operation.save')}
+        </Button>
+      </div>
+    </Modal>
+  )
+}
+
+export default ApiBasedExtensionModal
diff --git a/app/components/header/account-setting/api-based-extension-page/selector.tsx b/app/components/header/account-setting/api-based-extension-page/selector.tsx
new file mode 100644
index 0000000..19d034a
--- /dev/null
+++ b/app/components/header/account-setting/api-based-extension-page/selector.tsx
@@ -0,0 +1,127 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import useSWR from 'swr'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAddLine,
+  RiArrowDownSLine,
+} from '@remixicon/react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import {
+  ArrowUpRight,
+} from '@/app/components/base/icons/src/vender/line/arrows'
+import { useModalContext } from '@/context/modal-context'
+import { fetchApiBasedExtensionList } from '@/service/common'
+
+type ApiBasedExtensionSelectorProps = {
+  value: string
+  onChange: (value: string) => void
+}
+
+const ApiBasedExtensionSelector: FC<ApiBasedExtensionSelectorProps> = ({
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const {
+    setShowAccountSettingModal,
+    setShowApiBasedExtensionModal,
+  } = useModalContext()
+  const { data, mutate } = useSWR(
+    '/api-based-extension',
+    fetchApiBasedExtensionList,
+  )
+  const handleSelect = (id: string) => {
+    onChange(id)
+    setOpen(false)
+  }
+
+  const currentItem = data?.find(item => item.id === value)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)} className='w-full'>
+        {
+          currentItem
+            ? (
+              <div className='flex h-9 cursor-pointer items-center justify-between rounded-lg bg-components-input-bg-normal pl-3 pr-2.5'>
+                <div className='text-sm text-text-primary'>{currentItem.name}</div>
+                <div className='flex items-center'>
+                  <div className='mr-1.5 w-[270px] truncate text-right text-xs text-text-quaternary'>
+                    {currentItem.api_endpoint}
+                  </div>
+                  <RiArrowDownSLine className={`h-4 w-4 text-text-secondary ${!open && 'opacity-60'}`} />
+                </div>
+              </div>
+            )
+            : (
+              <div className='flex h-9 cursor-pointer items-center justify-between rounded-lg bg-components-input-bg-normal pl-3 pr-2.5 text-sm text-text-quaternary'>
+                {t('common.apiBasedExtension.selector.placeholder')}
+                <RiArrowDownSLine className={`h-4 w-4 text-text-secondary ${!open && 'opacity-60'}`} />
+              </div>
+            )
+        }
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[102] w-[calc(100%-32px)] max-w-[576px]'>
+        <div className='z-10 w-full rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-lg'>
+          <div className='p-1'>
+            <div className='flex items-center justify-between px-3 pb-1 pt-2'>
+              <div className='text-xs font-medium text-text-tertiary'>
+                {t('common.apiBasedExtension.selector.title')}
+              </div>
+              <div
+                className='flex cursor-pointer items-center text-xs text-text-accent'
+                onClick={() => {
+                  setOpen(false)
+                  setShowAccountSettingModal({ payload: 'api-based-extension' })
+                }}
+              >
+                {t('common.apiBasedExtension.selector.manage')}
+                <ArrowUpRight className='ml-0.5 h-3 w-3' />
+              </div>
+            </div>
+            <div className='max-h-[250px] overflow-y-auto'>
+              {
+                data?.map(item => (
+                  <div
+                    key={item.id}
+                    className='w-full cursor-pointer rounded-md px-3 py-1.5 text-left hover:stroke-state-base-hover'
+                    onClick={() => handleSelect(item.id!)}
+                  >
+                    <div className='text-sm text-text-primary'>{item.name}</div>
+                    <div className='text-xs text-text-tertiary'>{item.api_endpoint}</div>
+                  </div>
+                ))
+              }
+            </div>
+          </div>
+          <div className='h-[1px] bg-divider-regular' />
+          <div className='p-1'>
+            <div
+              className='flex h-8 cursor-pointer items-center px-3 text-sm text-text-accent'
+              onClick={() => {
+                setOpen(false)
+                setShowApiBasedExtensionModal({ payload: {}, onSaveCallback: () => mutate() })
+              }}
+            >
+              <RiAddLine className='mr-2 h-4 w-4' />
+              {t('common.operation.add')}
+            </div>
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default ApiBasedExtensionSelector
diff --git a/app/components/header/account-setting/collapse/index.tsx b/app/components/header/account-setting/collapse/index.tsx
new file mode 100644
index 0000000..e028f03
--- /dev/null
+++ b/app/components/header/account-setting/collapse/index.tsx
@@ -0,0 +1,54 @@
+import { useState } from 'react'
+import { ChevronDownIcon, ChevronRightIcon } from '@heroicons/react/24/outline'
+import classNames from '@/utils/classnames'
+
+export type IItem = {
+  key: string
+  name: string
+}
+type ICollapse = {
+  title: string | undefined
+  items: IItem[]
+  renderItem: (item: IItem) => React.ReactNode
+  onSelect?: (item: IItem) => void
+  wrapperClassName?: string
+}
+const Collapse = ({
+  title,
+  items,
+  renderItem,
+  onSelect,
+  wrapperClassName,
+}: ICollapse) => {
+  const [open, setOpen] = useState(false)
+
+  const toggle = () => setOpen(!open)
+
+  return (
+    <div className={classNames('bg-background-section-burn rounded-xl overflow-hidden', wrapperClassName)}>
+      <div className='flex cursor-pointer items-center justify-between px-3 py-2 text-xs font-medium leading-[18px] text-text-secondary' onClick={toggle}>
+        {title}
+        {
+          open
+            ? <ChevronDownIcon className='h-3 w-3 text-components-button-tertiary-text' />
+            : <ChevronRightIcon className='h-3 w-3 text-components-button-tertiary-text' />
+        }
+      </div>
+      {
+        open && (
+          <div className='mx-1 mb-1 rounded-lg border-t border-divider-subtle bg-components-panel-on-panel-item-bg py-1'>
+            {
+              items.map(item => (
+                <div key={item.key} onClick={() => onSelect && onSelect(item)}>
+                  {renderItem(item)}
+                </div>
+              ))
+            }
+          </div>
+        )
+      }
+    </div>
+  )
+}
+
+export default Collapse
diff --git a/app/components/header/account-setting/data-source-page/data-source-notion/index.tsx b/app/components/header/account-setting/data-source-page/data-source-notion/index.tsx
new file mode 100644
index 0000000..38efdcb
--- /dev/null
+++ b/app/components/header/account-setting/data-source-page/data-source-notion/index.tsx
@@ -0,0 +1,85 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import useSWR from 'swr'
+import Panel from '../panel'
+import { DataSourceType } from '../panel/types'
+import type { DataSourceNotion as TDataSourceNotion } from '@/models/common'
+import { useAppContext } from '@/context/app-context'
+import { fetchNotionConnection } from '@/service/common'
+import NotionIcon from '@/app/components/base/notion-icon'
+import { noop } from 'lodash-es'
+
+const Icon: FC<{
+  src: string
+  name: string
+  className: string
+}> = ({ src, name, className }) => {
+  return (
+    <NotionIcon
+      src={src}
+      name={name}
+      className={className}
+    />
+  )
+}
+type Props = {
+  workspaces: TDataSourceNotion[]
+}
+
+const DataSourceNotion: FC<Props> = ({
+  workspaces,
+}) => {
+  const { isCurrentWorkspaceManager } = useAppContext()
+  const [canConnectNotion, setCanConnectNotion] = useState(false)
+  const { data } = useSWR(canConnectNotion ? '/oauth/data-source/notion' : null, fetchNotionConnection)
+
+  const connected = !!workspaces.length
+
+  const handleConnectNotion = () => {
+    if (!isCurrentWorkspaceManager)
+      return
+
+    setCanConnectNotion(true)
+  }
+
+  const handleAuthAgain = () => {
+    if (data?.data)
+      window.location.href = data.data
+    else
+      setCanConnectNotion(true)
+  }
+
+  useEffect(() => {
+    if (data?.data)
+      window.location.href = data.data
+  }, [data])
+  return (
+    <Panel
+      type={DataSourceType.notion}
+      isConfigured={connected}
+      onConfigure={handleConnectNotion}
+      readOnly={!isCurrentWorkspaceManager}
+      isSupportList
+      configuredList={workspaces.map(workspace => ({
+        id: workspace.id,
+        logo: ({ className }: { className: string }) => (
+          <Icon
+            src={workspace.source_info.workspace_icon!}
+            name={workspace.source_info.workspace_name}
+            className={className}
+          />),
+        name: workspace.source_info.workspace_name,
+        isActive: workspace.is_bound,
+        notionConfig: {
+          total: workspace.source_info.total || 0,
+        },
+      }))}
+      onRemove={noop} // handled in operation/index.tsx
+      notionActions={{
+        onChangeAuthorizedPage: handleAuthAgain,
+      }}
+    />
+  )
+}
+export default React.memo(DataSourceNotion)
diff --git a/app/components/header/account-setting/data-source-page/data-source-notion/operate/index.tsx b/app/components/header/account-setting/data-source-page/data-source-notion/operate/index.tsx
new file mode 100644
index 0000000..bcf24d6
--- /dev/null
+++ b/app/components/header/account-setting/data-source-page/data-source-notion/operate/index.tsx
@@ -0,0 +1,101 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { Fragment } from 'react'
+import { useSWRConfig } from 'swr'
+import {
+  RiDeleteBinLine,
+  RiLoopLeftLine,
+  RiMoreFill,
+  RiStickyNoteAddLine,
+} from '@remixicon/react'
+import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react'
+import { syncDataSourceNotion, updateDataSourceNotionAction } from '@/service/common'
+import Toast from '@/app/components/base/toast'
+import cn from '@/utils/classnames'
+
+type OperateProps = {
+  payload: {
+    id: string
+    total: number
+  }
+  onAuthAgain: () => void
+}
+export default function Operate({
+  payload,
+  onAuthAgain,
+}: OperateProps) {
+  const { t } = useTranslation()
+  const { mutate } = useSWRConfig()
+
+  const updateIntegrates = () => {
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.success'),
+    })
+    mutate({ url: 'data-source/integrates' })
+  }
+  const handleSync = async () => {
+    await syncDataSourceNotion({ url: `/oauth/data-source/notion/${payload.id}/sync` })
+    updateIntegrates()
+  }
+  const handleRemove = async () => {
+    await updateDataSourceNotionAction({ url: `/data-source/integrates/${payload.id}/disable` })
+    updateIntegrates()
+  }
+
+  return (
+    <Menu as="div" className="relative inline-block text-left">
+      {
+        ({ open }) => (
+          <>
+            <MenuButton className={cn('flex h-8 w-8 items-center justify-center rounded-lg hover:bg-state-base-hover', open && 'bg-state-base-hover')}>
+              <RiMoreFill className='h-4 w-4 text-text-secondary' />
+            </MenuButton>
+            <Transition
+              as={Fragment}
+              enter="transition ease-out duration-100"
+              enterFrom="transform opacity-0 scale-95"
+              enterTo="transform opacity-100 scale-100"
+              leave="transition ease-in duration-75"
+              leaveFrom="transform opacity-100 scale-100"
+              leaveTo="transform opacity-0 scale-95"
+            >
+              <MenuItems className="absolute right-0 top-9 w-60 max-w-80 origin-top-right rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg backdrop-blur-sm">
+                <div className="px-1 py-1">
+                  <MenuItem>
+                    <div
+                      className='flex cursor-pointer rounded-lg px-3 py-2 hover:bg-state-base-hover'
+                      onClick={onAuthAgain}
+                    >
+                      <RiStickyNoteAddLine className='mr-2 mt-[2px] h-4 w-4 text-text-tertiary' />
+                      <div>
+                        <div className='system-sm-semibold text-text-secondary'>{t('common.dataSource.notion.changeAuthorizedPages')}</div>
+                        <div className='system-xs-regular text-text-tertiary'>
+                          {payload.total} {t('common.dataSource.notion.pagesAuthorized')}
+                        </div>
+                      </div>
+                    </div>
+                  </MenuItem>
+                  <MenuItem>
+                    <div className='flex cursor-pointer rounded-lg px-3 py-2 hover:bg-state-base-hover' onClick={handleSync}>
+                      <RiLoopLeftLine className='mr-2 mt-[2px] h-4 w-4 text-text-tertiary' />
+                      <div className='system-sm-semibold text-text-secondary'>{t('common.dataSource.notion.sync')}</div>
+                    </div>
+                  </MenuItem>
+                </div>
+                <MenuItem>
+                  <div className='border-t border-divider-subtle p-1'>
+                    <div className='flex cursor-pointer rounded-lg px-3 py-2 hover:bg-state-base-hover' onClick={handleRemove}>
+                      <RiDeleteBinLine className='mr-2 mt-[2px] h-4 w-4 text-text-tertiary' />
+                      <div className='system-sm-semibold text-text-secondary'>{t('common.dataSource.notion.remove')}</div>
+                    </div>
+                  </div>
+                </MenuItem>
+              </MenuItems>
+            </Transition>
+          </>
+        )
+      }
+    </Menu>
+  )
+}
diff --git a/app/components/header/account-setting/data-source-page/data-source-website/config-firecrawl-modal.tsx b/app/components/header/account-setting/data-source-page/data-source-website/config-firecrawl-modal.tsx
new file mode 100644
index 0000000..81ee35a
--- /dev/null
+++ b/app/components/header/account-setting/data-source-page/data-source-website/config-firecrawl-modal.tsx
@@ -0,0 +1,161 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+} from '@/app/components/base/portal-to-follow-elem'
+import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security'
+import Button from '@/app/components/base/button'
+import type { FirecrawlConfig } from '@/models/common'
+import Field from '@/app/components/datasets/create/website/base/field'
+import Toast from '@/app/components/base/toast'
+import { createDataSourceApiKeyBinding } from '@/service/datasets'
+import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general'
+type Props = {
+  onCancel: () => void
+  onSaved: () => void
+}
+
+const I18N_PREFIX = 'datasetCreation.firecrawl'
+
+const DEFAULT_BASE_URL = 'https://api.firecrawl.dev'
+
+const ConfigFirecrawlModal: FC<Props> = ({
+  onCancel,
+  onSaved,
+}) => {
+  const { t } = useTranslation()
+  const [isSaving, setIsSaving] = useState(false)
+  const [config, setConfig] = useState<FirecrawlConfig>({
+    api_key: '',
+    base_url: '',
+  })
+
+  const handleConfigChange = useCallback((key: string) => {
+    return (value: string | number) => {
+      setConfig(prev => ({ ...prev, [key]: value as string }))
+    }
+  }, [])
+
+  const handleSave = useCallback(async () => {
+    if (isSaving)
+      return
+    let errorMsg = ''
+    if (config.base_url && !((config.base_url.startsWith('http://') || config.base_url.startsWith('https://'))))
+      errorMsg = t('common.errorMsg.urlError')
+    if (!errorMsg) {
+      if (!config.api_key) {
+        errorMsg = t('common.errorMsg.fieldRequired', {
+          field: 'API Key',
+        })
+      }
+    }
+
+    if (errorMsg) {
+      Toast.notify({
+        type: 'error',
+        message: errorMsg,
+      })
+      return
+    }
+    const postData = {
+      category: 'website',
+      provider: 'firecrawl',
+      credentials: {
+        auth_type: 'bearer',
+        config: {
+          api_key: config.api_key,
+          base_url: config.base_url || DEFAULT_BASE_URL,
+        },
+      },
+    }
+    try {
+      setIsSaving(true)
+      await createDataSourceApiKeyBinding(postData)
+      Toast.notify({
+        type: 'success',
+        message: t('common.api.success'),
+      })
+    }
+    finally {
+      setIsSaving(false)
+    }
+
+    onSaved()
+  }, [config.api_key, config.base_url, onSaved, t, isSaving])
+
+  return (
+    <PortalToFollowElem open>
+      <PortalToFollowElemContent className='z-[60] h-full w-full'>
+        <div className='fixed inset-0 flex items-center justify-center bg-background-overlay'>
+          <div className='mx-2 max-h-[calc(100vh-120px)] w-[640px] overflow-y-auto rounded-2xl bg-components-panel-bg shadow-xl'>
+            <div className='px-8 pt-8'>
+              <div className='mb-4 flex items-center justify-between'>
+                <div className='system-xl-semibold text-text-primary'>{t(`${I18N_PREFIX}.configFirecrawl`)}</div>
+              </div>
+
+              <div className='space-y-4'>
+                <Field
+                  label='API Key'
+                  labelClassName='!text-sm'
+                  isRequired
+                  value={config.api_key}
+                  onChange={handleConfigChange('api_key')}
+                  placeholder={t(`${I18N_PREFIX}.apiKeyPlaceholder`)!}
+                />
+                <Field
+                  label='Base URL'
+                  labelClassName='!text-sm'
+                  value={config.base_url}
+                  onChange={handleConfigChange('base_url')}
+                  placeholder={DEFAULT_BASE_URL}
+                />
+              </div>
+              <div className='my-8 flex h-8 items-center justify-between'>
+                <a className='flex items-center space-x-1 text-xs font-normal leading-[18px] text-text-accent' target='_blank' href='https://www.firecrawl.dev/account'>
+                  <span>{t(`${I18N_PREFIX}.getApiKeyLinkText`)}</span>
+                  <LinkExternal02 className='h-3 w-3' />
+                </a>
+                <div className='flex'>
+                  <Button
+                    size='large'
+                    className='mr-2'
+                    onClick={onCancel}
+                  >
+                    {t('common.operation.cancel')}
+                  </Button>
+                  <Button
+                    variant='primary'
+                    size='large'
+                    onClick={handleSave}
+                    loading={isSaving}
+                  >
+                    {t('common.operation.save')}
+                  </Button>
+                </div>
+
+              </div>
+            </div>
+            <div className='border-t-[0.5px] border-t-divider-regular'>
+              <div className='flex items-center justify-center bg-background-section-burn py-3 text-xs text-text-tertiary'>
+                <Lock01 className='mr-1 h-3 w-3 text-text-tertiary' />
+                {t('common.modelProvider.encrypted.front')}
+                <a
+                  className='mx-1 text-text-accent'
+                  target='_blank' rel='noopener noreferrer'
+                  href='https://pycryptodome.readthedocs.io/en/latest/src/cipher/oaep.html'
+                >
+                  PKCS1_OAEP
+                </a>
+                {t('common.modelProvider.encrypted.back')}
+              </div>
+            </div>
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default React.memo(ConfigFirecrawlModal)
diff --git a/app/components/header/account-setting/data-source-page/data-source-website/config-jina-reader-modal.tsx b/app/components/header/account-setting/data-source-page/data-source-website/config-jina-reader-modal.tsx
new file mode 100644
index 0000000..1e57e2f
--- /dev/null
+++ b/app/components/header/account-setting/data-source-page/data-source-website/config-jina-reader-modal.tsx
@@ -0,0 +1,140 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+} from '@/app/components/base/portal-to-follow-elem'
+import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security'
+import Button from '@/app/components/base/button'
+import { DataSourceProvider } from '@/models/common'
+import Field from '@/app/components/datasets/create/website/base/field'
+import Toast from '@/app/components/base/toast'
+import { createDataSourceApiKeyBinding } from '@/service/datasets'
+import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general'
+type Props = {
+  onCancel: () => void
+  onSaved: () => void
+}
+
+const I18N_PREFIX = 'datasetCreation.jinaReader'
+
+const ConfigJinaReaderModal: FC<Props> = ({
+  onCancel,
+  onSaved,
+}) => {
+  const { t } = useTranslation()
+  const [isSaving, setIsSaving] = useState(false)
+  const [apiKey, setApiKey] = useState('')
+
+  const handleSave = useCallback(async () => {
+    if (isSaving)
+      return
+    let errorMsg = ''
+    if (!errorMsg) {
+      if (!apiKey) {
+        errorMsg = t('common.errorMsg.fieldRequired', {
+          field: 'API Key',
+        })
+      }
+    }
+
+    if (errorMsg) {
+      Toast.notify({
+        type: 'error',
+        message: errorMsg,
+      })
+      return
+    }
+    const postData = {
+      category: 'website',
+      provider: DataSourceProvider.jinaReader,
+      credentials: {
+        auth_type: 'bearer',
+        config: {
+          api_key: apiKey,
+        },
+      },
+    }
+    try {
+      setIsSaving(true)
+      await createDataSourceApiKeyBinding(postData)
+      Toast.notify({
+        type: 'success',
+        message: t('common.api.success'),
+      })
+    }
+    finally {
+      setIsSaving(false)
+    }
+
+    onSaved()
+  }, [apiKey, onSaved, t, isSaving])
+
+  return (
+    <PortalToFollowElem open>
+      <PortalToFollowElemContent className='z-[60] h-full w-full'>
+        <div className='fixed inset-0 flex items-center justify-center bg-background-overlay'>
+          <div className='mx-2 max-h-[calc(100vh-120px)] w-[640px] overflow-y-auto rounded-2xl bg-components-panel-bg shadow-xl'>
+            <div className='px-8 pt-8'>
+              <div className='mb-4 flex items-center justify-between'>
+                <div className='system-xl-semibold text-text-primary'>{t(`${I18N_PREFIX}.configJinaReader`)}</div>
+              </div>
+
+              <div className='space-y-4'>
+                <Field
+                  label='API Key'
+                  labelClassName='!text-sm'
+                  isRequired
+                  value={apiKey}
+                  onChange={(value: string | number) => setApiKey(value as string)}
+                  placeholder={t(`${I18N_PREFIX}.apiKeyPlaceholder`)!}
+                />
+              </div>
+              <div className='my-8 flex h-8 items-center justify-between'>
+                <a className='flex items-center space-x-1 text-xs font-normal leading-[18px] text-text-accent' target='_blank' href='https://jina.ai/reader/'>
+                  <span>{t(`${I18N_PREFIX}.getApiKeyLinkText`)}</span>
+                  <LinkExternal02 className='h-3 w-3' />
+                </a>
+                <div className='flex'>
+                  <Button
+                    size='large'
+                    className='mr-2'
+                    onClick={onCancel}
+                  >
+                    {t('common.operation.cancel')}
+                  </Button>
+                  <Button
+                    variant='primary'
+                    size='large'
+                    onClick={handleSave}
+                    loading={isSaving}
+                  >
+                    {t('common.operation.save')}
+                  </Button>
+                </div>
+
+              </div>
+            </div>
+            <div className='border-t-[0.5px] border-t-divider-regular'>
+              <div className='flex items-center justify-center bg-background-section-burn py-3 text-xs text-text-tertiary'>
+                <Lock01 className='mr-1 h-3 w-3 text-text-tertiary' />
+                {t('common.modelProvider.encrypted.front')}
+                <a
+                  className='mx-1 text-text-accent'
+                  target='_blank' rel='noopener noreferrer'
+                  href='https://pycryptodome.readthedocs.io/en/latest/src/cipher/oaep.html'
+                >
+                  PKCS1_OAEP
+                </a>
+                {t('common.modelProvider.encrypted.back')}
+              </div>
+            </div>
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default React.memo(ConfigJinaReaderModal)
diff --git a/app/components/header/account-setting/data-source-page/data-source-website/config-watercrawl-modal.tsx b/app/components/header/account-setting/data-source-page/data-source-website/config-watercrawl-modal.tsx
new file mode 100644
index 0000000..ff85353
--- /dev/null
+++ b/app/components/header/account-setting/data-source-page/data-source-website/config-watercrawl-modal.tsx
@@ -0,0 +1,161 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+} from '@/app/components/base/portal-to-follow-elem'
+import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security'
+import Button from '@/app/components/base/button'
+import type { WatercrawlConfig } from '@/models/common'
+import Field from '@/app/components/datasets/create/website/base/field'
+import Toast from '@/app/components/base/toast'
+import { createDataSourceApiKeyBinding } from '@/service/datasets'
+import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general'
+type Props = {
+  onCancel: () => void
+  onSaved: () => void
+}
+
+const I18N_PREFIX = 'datasetCreation.watercrawl'
+
+const DEFAULT_BASE_URL = 'https://app.watercrawl.dev'
+
+const ConfigWatercrawlModal: FC<Props> = ({
+  onCancel,
+  onSaved,
+}) => {
+  const { t } = useTranslation()
+  const [isSaving, setIsSaving] = useState(false)
+  const [config, setConfig] = useState<WatercrawlConfig>({
+    api_key: '',
+    base_url: '',
+  })
+
+  const handleConfigChange = useCallback((key: string) => {
+    return (value: string | number) => {
+      setConfig(prev => ({ ...prev, [key]: value as string }))
+    }
+  }, [])
+
+  const handleSave = useCallback(async () => {
+    if (isSaving)
+      return
+    let errorMsg = ''
+    if (config.base_url && !((config.base_url.startsWith('http://') || config.base_url.startsWith('https://'))))
+      errorMsg = t('common.errorMsg.urlError')
+    if (!errorMsg) {
+      if (!config.api_key) {
+        errorMsg = t('common.errorMsg.fieldRequired', {
+          field: 'API Key',
+        })
+      }
+    }
+
+    if (errorMsg) {
+      Toast.notify({
+        type: 'error',
+        message: errorMsg,
+      })
+      return
+    }
+    const postData = {
+      category: 'website',
+      provider: 'watercrawl',
+      credentials: {
+        auth_type: 'x-api-key',
+        config: {
+          api_key: config.api_key,
+          base_url: config.base_url || DEFAULT_BASE_URL,
+        },
+      },
+    }
+    try {
+      setIsSaving(true)
+      await createDataSourceApiKeyBinding(postData)
+      Toast.notify({
+        type: 'success',
+        message: t('common.api.success'),
+      })
+    }
+    finally {
+      setIsSaving(false)
+    }
+
+    onSaved()
+  }, [config.api_key, config.base_url, onSaved, t, isSaving])
+
+  return (
+    <PortalToFollowElem open>
+      <PortalToFollowElemContent className='z-[60] h-full w-full'>
+        <div className='fixed inset-0 flex items-center justify-center bg-background-overlay'>
+          <div className='mx-2 max-h-[calc(100vh-120px)] w-[640px] overflow-y-auto rounded-2xl bg-components-panel-bg shadow-xl'>
+            <div className='px-8 pt-8'>
+              <div className='mb-4 flex items-center justify-between'>
+                <div className='system-xl-semibold text-text-primary'>{t(`${I18N_PREFIX}.configWatercrawl`)}</div>
+              </div>
+
+              <div className='space-y-4'>
+                <Field
+                  label='API Key'
+                  labelClassName='!text-sm'
+                  isRequired
+                  value={config.api_key}
+                  onChange={handleConfigChange('api_key')}
+                  placeholder={t(`${I18N_PREFIX}.apiKeyPlaceholder`)!}
+                />
+                <Field
+                  label='Base URL'
+                  labelClassName='!text-sm'
+                  value={config.base_url}
+                  onChange={handleConfigChange('base_url')}
+                  placeholder={DEFAULT_BASE_URL}
+                />
+              </div>
+              <div className='my-8 flex h-8 items-center justify-between'>
+                <a className='flex items-center space-x-1 text-xs font-normal leading-[18px] text-text-accent' target='_blank' href='https://app.watercrawl.dev/'>
+                  <span>{t(`${I18N_PREFIX}.getApiKeyLinkText`)}</span>
+                  <LinkExternal02 className='h-3 w-3' />
+                </a>
+                <div className='flex'>
+                  <Button
+                    size='large'
+                    className='mr-2'
+                    onClick={onCancel}
+                  >
+                    {t('common.operation.cancel')}
+                  </Button>
+                  <Button
+                    variant='primary'
+                    size='large'
+                    onClick={handleSave}
+                    loading={isSaving}
+                  >
+                    {t('common.operation.save')}
+                  </Button>
+                </div>
+
+              </div>
+            </div>
+            <div className='border-t-[0.5px] border-t-divider-regular'>
+              <div className='flex items-center justify-center bg-background-section-burn py-3 text-xs text-text-tertiary'>
+                <Lock01 className='mr-1 h-3 w-3 text-text-tertiary' />
+                {t('common.modelProvider.encrypted.front')}
+                <a
+                  className='mx-1 text-text-accent'
+                  target='_blank' rel='noopener noreferrer'
+                  href='https://pycryptodome.readthedocs.io/en/latest/src/cipher/oaep.html'
+                >
+                  PKCS1_OAEP
+                </a>
+                {t('common.modelProvider.encrypted.back')}
+              </div>
+            </div>
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default React.memo(ConfigWatercrawlModal)
diff --git a/app/components/header/account-setting/data-source-page/data-source-website/index.tsx b/app/components/header/account-setting/data-source-page/data-source-website/index.tsx
new file mode 100644
index 0000000..911bf01
--- /dev/null
+++ b/app/components/header/account-setting/data-source-page/data-source-website/index.tsx
@@ -0,0 +1,132 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import Panel from '../panel'
+import { DataSourceType } from '../panel/types'
+import ConfigFirecrawlModal from './config-firecrawl-modal'
+import ConfigWatercrawlModal from './config-watercrawl-modal'
+import ConfigJinaReaderModal from './config-jina-reader-modal'
+import cn from '@/utils/classnames'
+import s from '@/app/components/datasets/create/website/index.module.css'
+import { fetchDataSources, removeDataSourceApiKeyBinding } from '@/service/datasets'
+
+import type { DataSourceItem } from '@/models/common'
+import { DataSourceProvider } from '@/models/common'
+import { useAppContext } from '@/context/app-context'
+import Toast from '@/app/components/base/toast'
+
+type Props = {
+  provider: DataSourceProvider
+}
+
+const DataSourceWebsite: FC<Props> = ({ provider }) => {
+  const { t } = useTranslation()
+  const { isCurrentWorkspaceManager } = useAppContext()
+  const [sources, setSources] = useState<DataSourceItem[]>([])
+  const checkSetApiKey = useCallback(async () => {
+    const res = await fetchDataSources() as any
+    const list = res.sources
+    setSources(list)
+  }, [])
+
+  useEffect(() => {
+    checkSetApiKey()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  const [configTarget, setConfigTarget] = useState<DataSourceProvider | null>(null)
+  const showConfig = useCallback((provider: DataSourceProvider) => {
+    setConfigTarget(provider)
+  }, [setConfigTarget])
+
+  const hideConfig = useCallback(() => {
+    setConfigTarget(null)
+  }, [setConfigTarget])
+
+  const handleAdded = useCallback(() => {
+    checkSetApiKey()
+    hideConfig()
+  }, [checkSetApiKey, hideConfig])
+
+  const getIdByProvider = (provider: DataSourceProvider): string | undefined => {
+    const source = sources.find(item => item.provider === provider)
+    return source?.id
+  }
+
+  const getProviderName = (provider: DataSourceProvider): string => {
+    if (provider === DataSourceProvider.fireCrawl)
+      return 'Firecrawl'
+
+    if (provider === DataSourceProvider.waterCrawl)
+      return 'WaterCrawl'
+
+    return 'Jina Reader'
+  }
+
+  const handleRemove = useCallback((provider: DataSourceProvider) => {
+    return async () => {
+      const dataSourceId = getIdByProvider(provider)
+      if (dataSourceId) {
+        await removeDataSourceApiKeyBinding(dataSourceId)
+        setSources(sources.filter(item => item.provider !== provider))
+        Toast.notify({
+          type: 'success',
+          message: t('common.api.remove'),
+        })
+      }
+    }
+  }, [sources, t])
+
+  return (
+    <>
+      <Panel
+        type={DataSourceType.website}
+        provider={provider}
+        isConfigured={sources.find(item => item.provider === provider) !== undefined}
+        onConfigure={() => showConfig(provider)}
+        readOnly={!isCurrentWorkspaceManager}
+        configuredList={sources.filter(item => item.provider === provider).map(item => ({
+          id: item.id,
+          logo: ({ className }: { className: string }) => {
+            if (item.provider === DataSourceProvider.fireCrawl) {
+              return (
+                <div
+                  className={cn(className, 'ml-3 flex h-5 w-5 items-center justify-center rounded border border-divider-subtle !bg-background-default text-xs font-medium text-text-tertiary')}>馃敟</div>
+              )
+            }
+
+            if (item.provider === DataSourceProvider.waterCrawl) {
+              return (
+                <div
+                  className={cn(className, 'ml-3 flex h-5 w-5 items-center justify-center rounded border border-divider-subtle !bg-background-default text-xs font-medium text-text-tertiary')}>
+                  <span className={s.watercrawlLogo}/>
+                </div>
+              )
+            }
+            return (
+              <div
+                className={cn(className, 'ml-3 flex h-5 w-5 items-center justify-center rounded border border-divider-subtle !bg-background-default text-xs font-medium text-text-tertiary')}>
+                <span className={s.jinaLogo}/>
+              </div>
+            )
+          },
+          name: getProviderName(item.provider),
+          isActive: true,
+        }))}
+        onRemove={handleRemove(provider)}
+      />
+      {configTarget === DataSourceProvider.fireCrawl && (
+        <ConfigFirecrawlModal onSaved={handleAdded} onCancel={hideConfig}/>
+      )}
+      {configTarget === DataSourceProvider.waterCrawl && (
+        <ConfigWatercrawlModal onSaved={handleAdded} onCancel={hideConfig}/>
+      )}
+      {configTarget === DataSourceProvider.jinaReader && (
+        <ConfigJinaReaderModal onSaved={handleAdded} onCancel={hideConfig}/>
+      )}
+    </>
+
+  )
+}
+export default React.memo(DataSourceWebsite)
diff --git a/app/components/header/account-setting/data-source-page/index.module.css b/app/components/header/account-setting/data-source-page/index.module.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/components/header/account-setting/data-source-page/index.module.css
diff --git a/app/components/header/account-setting/data-source-page/index.tsx b/app/components/header/account-setting/data-source-page/index.tsx
new file mode 100644
index 0000000..fb13813
--- /dev/null
+++ b/app/components/header/account-setting/data-source-page/index.tsx
@@ -0,0 +1,20 @@
+import useSWR from 'swr'
+import DataSourceNotion from './data-source-notion'
+import DataSourceWebsite from './data-source-website'
+import { fetchDataSource } from '@/service/common'
+import { DataSourceProvider } from '@/models/common'
+import { ENABLE_WEBSITE_FIRECRAWL, ENABLE_WEBSITE_JINAREADER, ENABLE_WEBSITE_WATERCRAWL } from '@/config'
+
+export default function DataSourcePage() {
+  const { data } = useSWR({ url: 'data-source/integrates' }, fetchDataSource)
+  const notionWorkspaces = data?.data.filter(item => item.provider === 'notion') || []
+
+  return (
+    <div className='mb-8'>
+      <DataSourceNotion workspaces={notionWorkspaces} />
+      {ENABLE_WEBSITE_JINAREADER && <DataSourceWebsite provider={DataSourceProvider.jinaReader} />}
+      {ENABLE_WEBSITE_FIRECRAWL && <DataSourceWebsite provider={DataSourceProvider.fireCrawl} />}
+      {ENABLE_WEBSITE_WATERCRAWL && <DataSourceWebsite provider={DataSourceProvider.waterCrawl} />}
+    </div>
+  )
+}
diff --git a/app/components/header/account-setting/data-source-page/panel/config-item.tsx b/app/components/header/account-setting/data-source-page/panel/config-item.tsx
new file mode 100644
index 0000000..6faf840
--- /dev/null
+++ b/app/components/header/account-setting/data-source-page/panel/config-item.tsx
@@ -0,0 +1,83 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiDeleteBinLine,
+} from '@remixicon/react'
+import Indicator from '../../../indicator'
+import Operate from '../data-source-notion/operate'
+import { DataSourceType } from './types'
+import s from './style.module.css'
+import cn from '@/utils/classnames'
+import { noop } from 'lodash-es'
+
+export type ConfigItemType = {
+  id: string
+  logo: any
+  name: string
+  isActive: boolean
+  notionConfig?: {
+    total: number
+  }
+}
+
+type Props = {
+  type: DataSourceType
+  payload: ConfigItemType
+  onRemove: () => void
+  notionActions?: {
+    onChangeAuthorizedPage: () => void
+  }
+  readOnly: boolean
+}
+
+const ConfigItem: FC<Props> = ({
+  type,
+  payload,
+  onRemove,
+  notionActions,
+  readOnly,
+}) => {
+  const { t } = useTranslation()
+  const isNotion = type === DataSourceType.notion
+  const isWebsite = type === DataSourceType.website
+  const onChangeAuthorizedPage = notionActions?.onChangeAuthorizedPage || noop
+
+  return (
+    <div className={cn(s['workspace-item'], 'mb-1 flex items-center rounded-lg bg-components-panel-on-panel-item-bg py-1 pr-1')} key={payload.id}>
+      <payload.logo className='ml-3 mr-1.5' />
+      <div className='system-sm-medium grow truncate py-[7px] text-text-secondary' title={payload.name}>{payload.name}</div>
+      {
+        payload.isActive
+          ? <Indicator className='mr-[6px] shrink-0' color='green' />
+          : <Indicator className='mr-[6px] shrink-0' color='yellow' />
+      }
+      <div className={`system-xs-semibold-uppercase mr-3 shrink-0 ${payload.isActive ? 'text-util-colors-green-green-600' : 'text-util-colors-warning-warning-600'}`}>
+        {
+          payload.isActive
+            ? t(isNotion ? 'common.dataSource.notion.connected' : 'common.dataSource.website.active')
+            : t(isNotion ? 'common.dataSource.notion.disconnected' : 'common.dataSource.website.inactive')
+        }
+      </div>
+      <div className='mr-2 h-3 w-[1px] bg-divider-regular' />
+      {isNotion && (
+        <Operate payload={{
+          id: payload.id,
+          total: payload.notionConfig?.total || 0,
+        }} onAuthAgain={onChangeAuthorizedPage}
+        />
+      )}
+
+      {
+        isWebsite && !readOnly && (
+          <div className='cursor-pointer rounded-md p-2 text-text-tertiary hover:bg-state-base-hover' onClick={onRemove} >
+            <RiDeleteBinLine className='h-4 w-4' />
+          </div>
+        )
+      }
+
+    </div>
+  )
+}
+export default React.memo(ConfigItem)
diff --git a/app/components/header/account-setting/data-source-page/panel/index.tsx b/app/components/header/account-setting/data-source-page/panel/index.tsx
new file mode 100644
index 0000000..95ab9a6
--- /dev/null
+++ b/app/components/header/account-setting/data-source-page/panel/index.tsx
@@ -0,0 +1,145 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiAddLine } from '@remixicon/react'
+import type { ConfigItemType } from './config-item'
+import ConfigItem from './config-item'
+
+import s from './style.module.css'
+import { DataSourceType } from './types'
+import Button from '@/app/components/base/button'
+import { DataSourceProvider } from '@/models/common'
+import cn from '@/utils/classnames'
+
+type Props = {
+  type: DataSourceType
+  provider?: DataSourceProvider
+  isConfigured: boolean
+  onConfigure: () => void
+  readOnly: boolean
+  isSupportList?: boolean
+  configuredList: ConfigItemType[]
+  onRemove: () => void
+  notionActions?: {
+    onChangeAuthorizedPage: () => void
+  }
+}
+
+const Panel: FC<Props> = ({
+  type,
+  provider,
+  isConfigured,
+  onConfigure,
+  readOnly,
+  configuredList,
+  isSupportList,
+  onRemove,
+  notionActions,
+}) => {
+  const { t } = useTranslation()
+  const isNotion = type === DataSourceType.notion
+  const isWebsite = type === DataSourceType.website
+
+  const getProviderName = (): string => {
+    if (provider === DataSourceProvider.fireCrawl) return '馃敟 Firecrawl'
+    if (provider === DataSourceProvider.waterCrawl) return 'WaterCrawl'
+    return 'Jina Reader'
+  }
+
+  return (
+    <div className='mb-2 rounded-xl bg-background-section-burn'>
+      <div className='flex items-center px-3 py-[9px]'>
+        <div className={cn(s[`${type}-icon`], 'mr-3 h-8 w-8 rounded-lg border border-divider-subtle !bg-background-default')} />
+        <div className='grow'>
+          <div className='flex h-5 items-center'>
+            <div className='text-sm font-medium text-text-primary'>{t(`common.dataSource.${type}.title`)}</div>
+            {isWebsite && (
+              <div className='ml-1 rounded-md bg-components-badge-white-to-dark px-1.5 text-xs font-medium leading-[18px] text-text-secondary'>
+                <span className='text-text-tertiary'>{t('common.dataSource.website.with')}</span> {getProviderName()}
+              </div>
+            )}
+          </div>
+          {
+            !isConfigured && (
+              <div className='system-xs-medium text-text-tertiary'>
+                {t(`common.dataSource.${type}.description`)}
+              </div>
+            )
+          }
+        </div>
+        {isNotion && (
+          <>
+            {
+              isConfigured
+                ? (
+                  <Button
+                    disabled={readOnly}
+                    className='ml-3'
+                    onClick={onConfigure}
+                  >
+                    {t('common.dataSource.configure')}
+                  </Button>
+                )
+                : (
+                  <>
+                    {isSupportList && <div
+                      className={
+                        `system-sm-medium flex min-h-7 items-center rounded-md border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-3 py-1 text-components-button-secondary-accent-text
+                  ${!readOnly ? 'cursor-pointer' : 'cursor-default opacity-50 grayscale'}`
+                      }
+                      onClick={onConfigure}
+                    >
+                      <RiAddLine className='mr-[5px] h-4 w-4 text-components-button-secondary-accent-text' />
+                      {t('common.dataSource.connect')}
+                    </div>}
+                  </>
+                )
+            }
+          </>
+        )}
+
+        {isWebsite && !isConfigured && (
+          <div
+            className={
+              `ml-3 flex h-7 items-center rounded-md border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg
+              px-3 text-xs font-medium text-components-button-secondary-accent-text
+              ${!readOnly ? 'cursor-pointer' : 'cursor-default opacity-50 grayscale'}`
+            }
+            onClick={!readOnly ? onConfigure : undefined}
+          >
+            {t('common.dataSource.configure')}
+          </div>
+        )}
+
+      </div>
+      {
+        isConfigured && (
+          <>
+            <div className='flex h-[18px] items-center px-3'>
+              <div className='system-xs-medium text-text-tertiary'>
+                {isNotion ? t('common.dataSource.notion.connectedWorkspace') : t('common.dataSource.website.configuredCrawlers')}
+              </div>
+              <div className='ml-3 grow border-t border-t-divider-subtle' />
+            </div>
+            <div className='px-3 pb-3 pt-2'>
+              {
+                configuredList.map(item => (
+                  <ConfigItem
+                    key={item.id}
+                    type={type}
+                    payload={item}
+                    onRemove={onRemove}
+                    notionActions={notionActions}
+                    readOnly={readOnly}
+                  />
+                ))
+              }
+            </div>
+          </>
+        )
+      }
+    </div>
+  )
+}
+export default React.memo(Panel)
diff --git a/app/components/header/account-setting/data-source-page/panel/style.module.css b/app/components/header/account-setting/data-source-page/panel/style.module.css
new file mode 100644
index 0000000..ac9be02
--- /dev/null
+++ b/app/components/header/account-setting/data-source-page/panel/style.module.css
@@ -0,0 +1,17 @@
+.notion-icon {
+  background: #ffffff url(../../../assets/notion.svg) center center no-repeat;
+  background-size: 20px 20px;
+}
+
+.website-icon {
+  background: #ffffff url(../../../../datasets/create/assets/web.svg) center center no-repeat;
+  background-size: 20px 20px;
+}
+
+.workspace-item {
+  box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05);
+}
+
+.workspace-item:last-of-type {
+  margin-bottom: 0;
+}
diff --git a/app/components/header/account-setting/data-source-page/panel/types.ts b/app/components/header/account-setting/data-source-page/panel/types.ts
new file mode 100644
index 0000000..345bc10
--- /dev/null
+++ b/app/components/header/account-setting/data-source-page/panel/types.ts
@@ -0,0 +1,4 @@
+export enum DataSourceType {
+  notion = 'notion',
+  website = 'website',
+}
diff --git a/app/components/header/account-setting/index.tsx b/app/components/header/account-setting/index.tsx
new file mode 100644
index 0000000..b2a3c82
--- /dev/null
+++ b/app/components/header/account-setting/index.tsx
@@ -0,0 +1,229 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { useEffect, useRef, useState } from 'react'
+import {
+  RiBrain2Fill,
+  RiBrain2Line,
+  RiCloseLine,
+  RiColorFilterFill,
+  RiColorFilterLine,
+  RiDatabase2Fill,
+  RiDatabase2Line,
+  RiGroup2Fill,
+  RiGroup2Line,
+  RiMoneyDollarCircleFill,
+  RiMoneyDollarCircleLine,
+  RiPuzzle2Fill,
+  RiPuzzle2Line,
+  RiTranslate2,
+} from '@remixicon/react'
+import Button from '../../base/button'
+import MembersPage from './members-page'
+import LanguagePage from './language-page'
+import ApiBasedExtensionPage from './api-based-extension-page'
+import DataSourcePage from './data-source-page'
+import ModelProviderPage from './model-provider-page'
+import cn from '@/utils/classnames'
+import BillingPage from '@/app/components/billing/billing-page'
+import CustomPage from '@/app/components/custom/custom-page'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import { useProviderContext } from '@/context/provider-context'
+import { useAppContext } from '@/context/app-context'
+import MenuDialog from '@/app/components/header/account-setting/menu-dialog'
+import Input from '@/app/components/base/input'
+
+const iconClassName = `
+  w-5 h-5 mr-2
+`
+
+type IAccountSettingProps = {
+  onCancel: () => void
+  activeTab?: string
+}
+
+type GroupItem = {
+  key: string
+  name: string
+  description?: string
+  icon: React.JSX.Element
+  activeIcon: React.JSX.Element
+}
+
+export default function AccountSetting({
+  onCancel,
+  activeTab = 'members',
+}: IAccountSettingProps) {
+  const [activeMenu, setActiveMenu] = useState(activeTab)
+  const { t } = useTranslation()
+  const { enableBilling, enableReplaceWebAppLogo } = useProviderContext()
+  const { isCurrentWorkspaceDatasetOperator } = useAppContext()
+
+  const workplaceGroupItems = (() => {
+    if (isCurrentWorkspaceDatasetOperator)
+      return []
+    return [
+      {
+        key: 'provider',
+        name: t('common.settings.provider'),
+        icon: <RiBrain2Line className={iconClassName} />,
+        activeIcon: <RiBrain2Fill className={iconClassName} />,
+      },
+      {
+        key: 'members',
+        name: t('common.settings.members'),
+        icon: <RiGroup2Line className={iconClassName} />,
+        activeIcon: <RiGroup2Fill className={iconClassName} />,
+      },
+      {
+        // Use key false to hide this item
+        key: enableBilling ? 'billing' : false,
+        name: t('common.settings.billing'),
+        description: t('billing.plansCommon.receiptInfo'),
+        icon: <RiMoneyDollarCircleLine className={iconClassName} />,
+        activeIcon: <RiMoneyDollarCircleFill className={iconClassName} />,
+      },
+      {
+        key: 'data-source',
+        name: t('common.settings.dataSource'),
+        icon: <RiDatabase2Line className={iconClassName} />,
+        activeIcon: <RiDatabase2Fill className={iconClassName} />,
+      },
+      {
+        key: 'api-based-extension',
+        name: t('common.settings.apiBasedExtension'),
+        icon: <RiPuzzle2Line className={iconClassName} />,
+        activeIcon: <RiPuzzle2Fill className={iconClassName} />,
+      },
+      {
+        key: (enableReplaceWebAppLogo || enableBilling) ? 'custom' : false,
+        name: t('custom.custom'),
+        icon: <RiColorFilterLine className={iconClassName} />,
+        activeIcon: <RiColorFilterFill className={iconClassName} />,
+      },
+    ].filter(item => !!item.key) as GroupItem[]
+  })()
+
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+
+  const menuItems = [
+    {
+      key: 'workspace-group',
+      name: t('common.settings.workplaceGroup'),
+      items: workplaceGroupItems,
+    },
+    {
+      key: 'account-group',
+      name: t('common.settings.generalGroup'),
+      items: [
+        {
+          key: 'language',
+          name: t('common.settings.language'),
+          icon: <RiTranslate2 className={iconClassName} />,
+          activeIcon: <RiTranslate2 className={iconClassName} />,
+        },
+      ],
+    },
+  ]
+  const scrollRef = useRef<HTMLDivElement>(null)
+  const [scrolled, setScrolled] = useState(false)
+  useEffect(() => {
+    const targetElement = scrollRef.current
+    const scrollHandle = (e: Event) => {
+      const userScrolled = (e.target as HTMLDivElement).scrollTop > 0
+      setScrolled(userScrolled)
+    }
+    targetElement?.addEventListener('scroll', scrollHandle)
+    return () => {
+      targetElement?.removeEventListener('scroll', scrollHandle)
+    }
+  }, [])
+
+  const activeItem = [...menuItems[0].items, ...menuItems[1].items].find(item => item.key === activeMenu)
+
+  const [searchValue, setSearchValue] = useState<string>('')
+
+  return (
+    <MenuDialog
+      show
+      onClose={onCancel}
+    >
+      <div className='mx-auto flex h-[100vh] max-w-[1048px]'>
+        <div className='flex w-[44px] flex-col border-r border-divider-burn pl-4 pr-6 sm:w-[224px]'>
+          <div className='title-2xl-semi-bold mb-8 mt-6 px-3 py-2 text-text-primary'>{t('common.userProfile.settings')}</div>
+          <div className='w-full'>
+            {
+              menuItems.map(menuItem => (
+                <div key={menuItem.key} className='mb-2'>
+                  {!isCurrentWorkspaceDatasetOperator && (
+                    <div className='system-xs-medium-uppercase mb-0.5 py-2 pb-1 pl-3 text-text-tertiary'>{menuItem.name}</div>
+                  )}
+                  <div>
+                    {
+                      menuItem.items.map(item => (
+                        <div
+                          key={item.key}
+                          className={cn(
+                            'mb-0.5 flex h-[37px] cursor-pointer items-center rounded-lg p-1 pl-3 text-sm',
+                            activeMenu === item.key ? 'system-sm-semibold bg-state-base-active text-components-menu-item-text-active' : 'system-sm-medium text-components-menu-item-text')}
+                          title={item.name}
+                          onClick={() => setActiveMenu(item.key)}
+                        >
+                          {activeMenu === item.key ? item.activeIcon : item.icon}
+                          {!isMobile && <div className='truncate'>{item.name}</div>}
+                        </div>
+                      ))
+                    }
+                  </div>
+                </div>
+              ))
+            }
+          </div>
+        </div>
+        <div className='relative flex w-[824px]'>
+          <div className='absolute -right-11 top-6 z-[9999] flex flex-col items-center'>
+            <Button
+              variant='tertiary'
+              size='large'
+              className='px-2'
+              onClick={onCancel}
+            >
+              <RiCloseLine className='h-5 w-5' />
+            </Button>
+            <div className='system-2xs-medium-uppercase mt-1 text-text-tertiary'>ESC</div>
+          </div>
+          <div ref={scrollRef} className='w-full overflow-y-auto bg-components-panel-bg pb-4'>
+            <div className={cn('sticky top-0 z-20 mx-8 mb-[18px] flex items-center bg-components-panel-bg pb-2 pt-[27px]', scrolled && 'border-b border-divider-regular')}>
+              <div className='title-2xl-semi-bold shrink-0 text-text-primary'>
+                {activeItem?.name}
+                {activeItem?.description && (
+                  <div className='system-sm-regular mt-1 text-text-tertiary'>{activeItem?.description}</div>
+                )}
+              </div>
+              {activeItem?.key === 'provider' && (
+                <div className='flex grow justify-end'>
+                  <Input
+                    showLeftIcon
+                    wrapperClassName='!w-[200px]'
+                    className='!h-8 !text-[13px]'
+                    onChange={e => setSearchValue(e.target.value)}
+                    value={searchValue}
+                  />
+                </div>
+              )}
+            </div>
+            <div className='px-4 pt-2 sm:px-8'>
+              {activeMenu === 'provider' && <ModelProviderPage searchText={searchValue} />}
+              {activeMenu === 'members' && <MembersPage />}
+              {activeMenu === 'billing' && <BillingPage />}
+              {activeMenu === 'data-source' && <DataSourcePage />}
+              {activeMenu === 'api-based-extension' && <ApiBasedExtensionPage />}
+              {activeMenu === 'custom' && <CustomPage />}
+              {activeMenu === 'language' && <LanguagePage />}
+            </div>
+          </div>
+        </div>
+      </div>
+    </MenuDialog>
+  )
+}
diff --git a/app/components/header/account-setting/key-validator/KeyInput.tsx b/app/components/header/account-setting/key-validator/KeyInput.tsx
new file mode 100644
index 0000000..414f4f2
--- /dev/null
+++ b/app/components/header/account-setting/key-validator/KeyInput.tsx
@@ -0,0 +1,77 @@
+import type { ChangeEvent } from 'react'
+import {
+  ValidatedErrorIcon,
+  ValidatedErrorMessage,
+  ValidatedSuccessIcon,
+  ValidatingTip,
+} from './ValidateStatus'
+import { ValidatedStatus } from './declarations'
+import type { ValidatedStatusState } from './declarations'
+
+type KeyInputProps = {
+  value?: string
+  name: string
+  placeholder: string
+  className?: string
+  onChange: (v: string) => void
+  onFocus?: () => void
+  validating: boolean
+  validatedStatusState: ValidatedStatusState
+}
+
+const KeyInput = ({
+  value,
+  name,
+  placeholder,
+  className,
+  onChange,
+  onFocus,
+  validating,
+  validatedStatusState,
+}: KeyInputProps) => {
+  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
+    const inputValue = e.target.value
+    onChange(inputValue)
+  }
+
+  const getValidatedIcon = () => {
+    if (validatedStatusState.status === ValidatedStatus.Error || validatedStatusState.status === ValidatedStatus.Exceed)
+      return <ValidatedErrorIcon />
+
+    if (validatedStatusState.status === ValidatedStatus.Success)
+      return <ValidatedSuccessIcon />
+  }
+  const getValidatedTip = () => {
+    if (validating)
+      return <ValidatingTip />
+
+    if (validatedStatusState.status === ValidatedStatus.Error)
+      return <ValidatedErrorMessage errorMessage={validatedStatusState.message ?? ''} />
+  }
+
+  return (
+    <div className={className}>
+      <div className="mb-2 text-[13px] font-medium text-gray-800">{name}</div>
+      <div className='
+        flex items-center rounded-lg bg-white px-3
+        shadow-xs
+      '>
+        <input
+          className='
+            mr-2 w-full appearance-none
+            bg-transparent py-[9px] text-xs font-medium
+            leading-[18px] text-gray-700 outline-none
+          '
+          value={value}
+          placeholder={placeholder}
+          onChange={handleChange}
+          onFocus={onFocus}
+        />
+        {getValidatedIcon()}
+      </div>
+      {getValidatedTip()}
+    </div>
+  )
+}
+
+export default KeyInput
diff --git a/app/components/header/account-setting/key-validator/Operate.tsx b/app/components/header/account-setting/key-validator/Operate.tsx
new file mode 100644
index 0000000..c3cfd1d
--- /dev/null
+++ b/app/components/header/account-setting/key-validator/Operate.tsx
@@ -0,0 +1,87 @@
+import { useTranslation } from 'react-i18next'
+import Indicator from '../../indicator'
+import type { Status } from './declarations'
+
+type OperateProps = {
+  isOpen: boolean
+  status: Status
+  disabled?: boolean
+  onCancel: () => void
+  onSave: () => void
+  onAdd: () => void
+  onEdit: () => void
+}
+
+const Operate = ({
+  isOpen,
+  status,
+  disabled,
+  onCancel,
+  onSave,
+  onAdd,
+  onEdit,
+}: OperateProps) => {
+  const { t } = useTranslation()
+
+  if (isOpen) {
+    return (
+      <div className='flex items-center'>
+        <div className='
+          mr-[5px] flex
+          h-7 cursor-pointer items-center rounded-md px-3
+          text-xs font-medium text-gray-700
+        ' onClick={onCancel} >
+          {t('common.operation.cancel')}
+        </div>
+        <div className='
+          flex h-7
+          cursor-pointer items-center rounded-md bg-primary-700 px-3
+          text-xs font-medium text-white
+        ' onClick={onSave}>
+          {t('common.operation.save')}
+        </div>
+      </div>
+    )
+  }
+
+  if (status === 'add') {
+    return (
+      <div className={
+        `flex h-[28px] cursor-pointer items-center rounded-md border border-gray-200
+        bg-white px-3 text-xs font-medium text-gray-700 ${disabled && 'cursor-default opacity-50'}}`
+      } onClick={() => !disabled && onAdd()}>
+        {t('common.provider.addKey')}
+      </div>
+    )
+  }
+
+  if (status === 'fail' || status === 'success') {
+    return (
+      <div className='flex items-center'>
+        {
+          status === 'fail' && (
+            <div className='mr-4 flex items-center'>
+              <div className='text-xs text-[#D92D20]'>{t('common.provider.invalidApiKey')}</div>
+              <Indicator color='red' className='ml-2' />
+            </div>
+          )
+        }
+        {
+          status === 'success' && (
+            <Indicator color='green' className='mr-4' />
+          )
+        }
+        <div className={
+          `flex h-[28px] cursor-pointer items-center rounded-md border border-gray-200
+          bg-white px-3 text-xs font-medium text-gray-700 ${disabled && 'cursor-default opacity-50'}}`
+        } onClick={() => !disabled && onEdit()}>
+          {t('common.provider.editKey')}
+        </div>
+      </div>
+    )
+  }
+
+  return null
+}
+
+export default Operate
diff --git a/app/components/header/account-setting/key-validator/ValidateStatus.tsx b/app/components/header/account-setting/key-validator/ValidateStatus.tsx
new file mode 100644
index 0000000..4abbb5c
--- /dev/null
+++ b/app/components/header/account-setting/key-validator/ValidateStatus.tsx
@@ -0,0 +1,32 @@
+import { useTranslation } from 'react-i18next'
+import {
+  RiErrorWarningFill,
+} from '@remixicon/react'
+import { CheckCircle } from '@/app/components/base/icons/src/vender/solid/general'
+
+export const ValidatedErrorIcon = () => {
+  return <RiErrorWarningFill className='h-4 w-4 text-[#D92D20]' />
+}
+
+export const ValidatedSuccessIcon = () => {
+  return <CheckCircle className='h-4 w-4 text-[#039855]' />
+}
+
+export const ValidatingTip = () => {
+  const { t } = useTranslation()
+  return (
+    <div className={'mt-2 text-xs font-normal text-primary-600'}>
+      {t('common.provider.validating')}
+    </div>
+  )
+}
+
+export const ValidatedErrorMessage = ({ errorMessage }: { errorMessage: string }) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className={'mt-2 text-xs font-normal text-[#D92D20]'}>
+      {t('common.provider.validatedError')}{errorMessage}
+    </div>
+  )
+}
diff --git a/app/components/header/account-setting/key-validator/declarations.ts b/app/components/header/account-setting/key-validator/declarations.ts
new file mode 100644
index 0000000..7e14fa1
--- /dev/null
+++ b/app/components/header/account-setting/key-validator/declarations.ts
@@ -0,0 +1,43 @@
+import type { Dispatch, SetStateAction } from 'react'
+
+export enum ValidatedStatus {
+  Success = 'success',
+  Error = 'error',
+  Exceed = 'exceed',
+}
+
+export type ValidatedStatusState = {
+  status?: ValidatedStatus
+  message?: string
+}
+
+export type Status = 'add' | 'fail' | 'success'
+
+export type ValidateValue = Record<string, any>
+
+export type ValidateCallback = {
+  before: (v?: ValidateValue) => boolean | undefined
+  run?: (v?: ValidateValue) => Promise<ValidatedStatusState>
+}
+
+export type Form = {
+  key: string
+  title: string
+  placeholder: string
+  value?: string
+  validate?: ValidateCallback
+  handleFocus?: (v: ValidateValue, dispatch: Dispatch<SetStateAction<ValidateValue>>) => void
+}
+
+export type KeyFrom = {
+  text: string
+  link: string
+}
+
+export type KeyValidatorProps = {
+  type: string
+  title: React.ReactNode
+  status: Status
+  forms: Form[]
+  keyFrom: KeyFrom
+}
diff --git a/app/components/header/account-setting/key-validator/hooks.ts b/app/components/header/account-setting/key-validator/hooks.ts
new file mode 100644
index 0000000..d03f85c
--- /dev/null
+++ b/app/components/header/account-setting/key-validator/hooks.ts
@@ -0,0 +1,31 @@
+import { useState } from 'react'
+import { useDebounceFn } from 'ahooks'
+import type { DebouncedFunc } from 'lodash-es'
+import { ValidatedStatus } from './declarations'
+import type { ValidateCallback, ValidateValue, ValidatedStatusState } from './declarations'
+
+export const useValidate: (value: ValidateValue) => [DebouncedFunc<(validateCallback: ValidateCallback) => Promise<void>>, boolean, ValidatedStatusState] = (value) => {
+  const [validating, setValidating] = useState(false)
+  const [validatedStatus, setValidatedStatus] = useState<ValidatedStatusState>({})
+
+  const { run } = useDebounceFn(async (validateCallback: ValidateCallback) => {
+    if (!validateCallback.before(value)) {
+      setValidating(false)
+      setValidatedStatus({})
+      return
+    }
+    setValidating(true)
+
+    if (validateCallback.run) {
+      const res = await validateCallback?.run(value)
+      setValidatedStatus(
+        res.status === 'success'
+          ? { status: ValidatedStatus.Success }
+          : { status: ValidatedStatus.Error, message: res.message })
+
+      setValidating(false)
+    }
+  }, { wait: 1000 })
+
+  return [run, validating, validatedStatus]
+}
diff --git a/app/components/header/account-setting/key-validator/index.tsx b/app/components/header/account-setting/key-validator/index.tsx
new file mode 100644
index 0000000..798477a
--- /dev/null
+++ b/app/components/header/account-setting/key-validator/index.tsx
@@ -0,0 +1,122 @@
+import { useState } from 'react'
+import Operate from './Operate'
+import KeyInput from './KeyInput'
+import { useValidate } from './hooks'
+import type { Form, KeyFrom, Status, ValidateValue } from './declarations'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general'
+
+export type KeyValidatorProps = {
+  type: string
+  title: React.ReactNode
+  status: Status
+  forms: Form[]
+  keyFrom: KeyFrom
+  onSave: (v: ValidateValue) => Promise<boolean | undefined>
+  disabled?: boolean
+}
+
+const KeyValidator = ({
+  type,
+  title,
+  status,
+  forms,
+  keyFrom,
+  onSave,
+  disabled,
+}: KeyValidatorProps) => {
+  const triggerKey = `plugins/${type}`
+  const { eventEmitter } = useEventEmitterContextContext()
+  const [isOpen, setIsOpen] = useState(false)
+  const prevValue = forms.reduce((prev: ValidateValue, next: Form) => {
+    prev[next.key] = next.value
+    return prev
+  }, {})
+  const [value, setValue] = useState(prevValue)
+  const [validate, validating, validatedStatusState] = useValidate(value)
+
+  eventEmitter?.useSubscription((v) => {
+    if (v !== triggerKey) {
+      setIsOpen(false)
+      setValue(prevValue)
+      validate({ before: () => false })
+    }
+  })
+
+  const handleCancel = () => {
+    eventEmitter?.emit('')
+  }
+
+  const handleSave = async () => {
+    if (await onSave(value))
+      eventEmitter?.emit('')
+  }
+
+  const handleAdd = () => {
+    setIsOpen(true)
+    eventEmitter?.emit(triggerKey)
+  }
+
+  const handleEdit = () => {
+    setIsOpen(true)
+    eventEmitter?.emit(triggerKey)
+  }
+
+  const handleChange = (form: Form, val: string) => {
+    setValue({ ...value, [form.key]: val })
+
+    if (form.validate)
+      validate(form.validate)
+  }
+
+  const handleFocus = (form: Form) => {
+    if (form.handleFocus)
+      form.handleFocus(value, setValue)
+  }
+
+  return (
+    <div className='mb-2 rounded-md border-[0.5px] border-gray-200 bg-gray-50'>
+      <div className={
+        `flex h-[52px] cursor-pointer items-center justify-between px-4 ${isOpen && 'border-b-[0.5px] border-b-gray-200'}`
+      }>
+        {title}
+        <Operate
+          isOpen={isOpen}
+          status={status}
+          onCancel={handleCancel}
+          onSave={handleSave}
+          onAdd={handleAdd}
+          onEdit={handleEdit}
+          disabled={disabled}
+        />
+      </div>
+      {
+        isOpen && !disabled && (
+          <div className='px-4 py-3'>
+            {
+              forms.map(form => (
+                <KeyInput
+                  key={form.key}
+                  className='mb-4'
+                  name={form.title}
+                  placeholder={form.placeholder}
+                  value={value[form.key] as string || ''}
+                  onChange={v => handleChange(form, v)}
+                  onFocus={() => handleFocus(form)}
+                  validating={validating}
+                  validatedStatusState={validatedStatusState}
+                />
+              ))
+            }
+            <a className="flex cursor-pointer items-center text-xs text-primary-600" href={keyFrom.link} target='_blank' rel='noopener noreferrer'>
+              {keyFrom.text}
+              <LinkExternal02 className='ml-1 h-3 w-3 text-primary-600' />
+            </a>
+          </div>
+        )
+      }
+    </div>
+  )
+}
+
+export default KeyValidator
diff --git a/app/components/header/account-setting/language-page/index.module.css b/app/components/header/account-setting/language-page/index.module.css
new file mode 100644
index 0000000..7c2a883
--- /dev/null
+++ b/app/components/header/account-setting/language-page/index.module.css
@@ -0,0 +1,24 @@
+.google-icon {
+  background: url(../../assets/google.svg) center center no-repeat;
+  background-size: 16px 16px;
+}
+
+.github-icon {
+  background: url(../../assets/github.svg) center center no-repeat;
+  background-size: 16px 16px;
+}
+
+.twitter-icon {
+  background: url(../../assets/twitter.svg) center center no-repeat;
+  background-size: 16px 16px;
+}
+
+.bitbucket-icon {
+  background: url(../../assets/bitbucket.svg) center center no-repeat;
+  background-size: 16px 16px;
+}
+
+.salesforce-icon {
+  background: url(../../assets/salesforce.svg) center center no-repeat;
+  background-size: 24px auto;
+}
diff --git a/app/components/header/account-setting/language-page/index.tsx b/app/components/header/account-setting/language-page/index.tsx
new file mode 100644
index 0000000..7d3e09f
--- /dev/null
+++ b/app/components/header/account-setting/language-page/index.tsx
@@ -0,0 +1,86 @@
+'use client'
+
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { useAppContext } from '@/context/app-context'
+import { SimpleSelect } from '@/app/components/base/select'
+import type { Item } from '@/app/components/base/select'
+import { updateUserProfile } from '@/service/common'
+import { ToastContext } from '@/app/components/base/toast'
+import I18n from '@/context/i18n'
+import { timezones } from '@/utils/timezone'
+import { languages } from '@/i18n/language'
+
+const titleClassName = `
+  mb-2 system-sm-semibold text-text-secondary
+`
+
+export default function LanguagePage() {
+  const { locale, setLocaleOnClient } = useContext(I18n)
+  const { userProfile, mutateUserProfile } = useAppContext()
+  const { notify } = useContext(ToastContext)
+  const [editing, setEditing] = useState(false)
+  const { t } = useTranslation()
+
+  const handleSelectLanguage = async (item: Item) => {
+    const url = '/account/interface-language'
+    const bodyKey = 'interface_language'
+
+    setEditing(true)
+    try {
+      await updateUserProfile({ url, body: { [bodyKey]: item.value } })
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+
+      setLocaleOnClient(item.value.toString())
+    }
+    catch (e) {
+      notify({ type: 'error', message: (e as Error).message })
+    }
+    finally {
+      setEditing(false)
+    }
+  }
+
+  const handleSelectTimezone = async (item: Item) => {
+    const url = '/account/timezone'
+    const bodyKey = 'timezone'
+
+    setEditing(true)
+    try {
+      await updateUserProfile({ url, body: { [bodyKey]: item.value } })
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+
+      mutateUserProfile()
+    }
+    catch (e) {
+      notify({ type: 'error', message: (e as Error).message })
+    }
+    finally {
+      setEditing(false)
+    }
+  }
+
+  return (
+    <>
+      <div className='mb-8'>
+        <div className={titleClassName}>{t('common.language.displayLanguage')}</div>
+        <SimpleSelect
+          defaultValue={locale || userProfile.interface_language}
+          items={languages.filter(item => item.supported)}
+          onSelect={item => handleSelectLanguage(item)}
+          disabled={editing}
+        />
+      </div>
+      <div className='mb-8'>
+        <div className={titleClassName}>{t('common.language.timezone')}</div>
+        <SimpleSelect
+          defaultValue={userProfile.timezone}
+          items={timezones}
+          onSelect={item => handleSelectTimezone(item)}
+          disabled={editing}
+        />
+      </div>
+    </>
+  )
+}
diff --git a/app/components/header/account-setting/members-page/edit-workspace-modal/index.module.css b/app/components/header/account-setting/members-page/edit-workspace-modal/index.module.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/components/header/account-setting/members-page/edit-workspace-modal/index.module.css
diff --git a/app/components/header/account-setting/members-page/edit-workspace-modal/index.tsx b/app/components/header/account-setting/members-page/edit-workspace-modal/index.tsx
new file mode 100644
index 0000000..2c11c36
--- /dev/null
+++ b/app/components/header/account-setting/members-page/edit-workspace-modal/index.tsx
@@ -0,0 +1,90 @@
+'use client'
+import cn from '@/utils/classnames'
+import Modal from '@/app/components/base/modal'
+import Input from '@/app/components/base/input'
+import { WEB_PREFIX } from '@/config'
+import { useTranslation } from 'react-i18next'
+import { useState } from 'react'
+import { useContext } from 'use-context-selector'
+import s from './index.module.css'
+import Button from '@/app/components/base/button'
+import { RiCloseLine } from '@remixicon/react'
+import { useAppContext } from '@/context/app-context'
+import { updateWorkspaceInfo } from '@/service/common'
+import { ToastContext } from '@/app/components/base/toast'
+import { noop } from 'lodash-es'
+
+type IEditWorkspaceModalProps = {
+  onCancel: () => void
+}
+const EditWorkspaceModal = ({
+  onCancel,
+}: IEditWorkspaceModalProps) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const { currentWorkspace, isCurrentWorkspaceOwner } = useAppContext()
+  const [name, setName] = useState<string>(currentWorkspace.name)
+
+  const changeWorkspaceInfo = async (name: string) => {
+    try {
+      await updateWorkspaceInfo({
+        url: '/workspaces/info',
+        body: {
+          name,
+        },
+      })
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      location.assign(WEB_PREFIX)
+    }
+    catch {
+      notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+    }
+  }
+
+  return (
+    <div className={cn(s.wrap)}>
+      <Modal overflowVisible isShow onClose={noop} className={cn(s.modal)}>
+        <div className='mb-2 flex justify-between'>
+          <div className='text-xl font-semibold text-text-primary'>{t('common.account.editWorkspaceInfo')}</div>
+          <RiCloseLine className='h-4 w-4 cursor-pointer text-text-tertiary' onClick={onCancel} />
+        </div>
+        <div>
+          <div className='mb-2 text-sm font-medium text-text-primary'>{t('common.account.workspaceName')}</div>
+          <Input
+            className='mb-2'
+            value={name}
+            placeholder={t('common.account.workspaceNamePlaceholder')}
+            onChange={(e) => {
+              setName(e.target.value)
+            }}
+            onClear={() => {
+              setName(currentWorkspace.name)
+            }}
+          />
+
+          <div className='sticky bottom-0 -mx-2 mt-2 flex flex-wrap items-center justify-end gap-x-2 bg-components-panel-bg px-2 pt-4'>
+            <Button
+              size='large'
+              onClick={onCancel}
+            >
+              {t('common.operation.cancel')}
+            </Button>
+            <Button
+              size='large'
+              variant='primary'
+              onClick={() => {
+                changeWorkspaceInfo(name)
+                onCancel()
+              }}
+              disabled={!isCurrentWorkspaceOwner}
+            >
+              {t('common.operation.confirm')}
+            </Button>
+          </div>
+
+        </div>
+      </Modal>
+    </div>
+  )
+}
+export default EditWorkspaceModal
diff --git a/app/components/header/account-setting/members-page/index.tsx b/app/components/header/account-setting/members-page/index.tsx
new file mode 100644
index 0000000..939834e
--- /dev/null
+++ b/app/components/header/account-setting/members-page/index.tsx
@@ -0,0 +1,178 @@
+'use client'
+import { useState } from 'react'
+import useSWR from 'swr'
+import dayjs from 'dayjs'
+import 'dayjs/locale/zh-cn'
+import relativeTime from 'dayjs/plugin/relativeTime'
+import { useContext } from 'use-context-selector'
+import { RiUserAddLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import InviteModal from './invite-modal'
+import InvitedModal from './invited-modal'
+import EditWorkspaceModal from './edit-workspace-modal'
+import Operation from './operation'
+import { fetchMembers } from '@/service/common'
+import I18n from '@/context/i18n'
+import { useAppContext } from '@/context/app-context'
+import Avatar from '@/app/components/base/avatar'
+import type { InvitationResult } from '@/models/common'
+import { useProviderContext } from '@/context/provider-context'
+import { Plan } from '@/app/components/billing/type'
+import Button from '@/app/components/base/button'
+import UpgradeBtn from '@/app/components/billing/upgrade-btn'
+import { NUM_INFINITE } from '@/app/components/billing/config'
+import { LanguagesSupported } from '@/i18n/language'
+import cn from '@/utils/classnames'
+import Tooltip from '@/app/components/base/tooltip'
+import { RiPencilLine } from '@remixicon/react'
+dayjs.extend(relativeTime)
+
+const MembersPage = () => {
+  const { t } = useTranslation()
+  const RoleMap = {
+    owner: t('common.members.owner'),
+    admin: t('common.members.admin'),
+    editor: t('common.members.editor'),
+    dataset_operator: t('common.members.datasetOperator'),
+    normal: t('common.members.normal'),
+  }
+  const { locale } = useContext(I18n)
+
+  const { userProfile, currentWorkspace, isCurrentWorkspaceOwner, isCurrentWorkspaceManager, systemFeatures } = useAppContext()
+  const { data, mutate } = useSWR(
+    {
+      url: '/workspaces/current/members',
+      params: {},
+    },
+    fetchMembers,
+  )
+  const [inviteModalVisible, setInviteModalVisible] = useState(false)
+  const [invitationResults, setInvitationResults] = useState<InvitationResult[]>([])
+  const [invitedModalVisible, setInvitedModalVisible] = useState(false)
+  const accounts = data?.accounts || []
+  const { plan, enableBilling } = useProviderContext()
+  const isNotUnlimitedMemberPlan = enableBilling && plan.type !== Plan.team && plan.type !== Plan.enterprise
+  const isMemberFull = enableBilling && isNotUnlimitedMemberPlan && accounts.length >= plan.total.teamMembers
+  const [editWorkspaceModalVisible, setEditWorkspaceModalVisible] = useState(false)
+
+  return (
+    <>
+      <div className='flex flex-col'>
+        <div className='mb-4 flex items-center gap-3 rounded-xl border-l-[0.5px] border-t-[0.5px] border-divider-subtle bg-gradient-to-r from-background-gradient-bg-fill-chat-bg-2 to-background-gradient-bg-fill-chat-bg-1 p-3 pr-5'>
+          <div className='flex h-12 w-12 items-center justify-center rounded-xl bg-components-icon-bg-blue-solid text-[20px]'>
+            <span className='bg-gradient-to-r from-components-avatar-shape-fill-stop-0 to-components-avatar-shape-fill-stop-100 bg-clip-text font-semibold uppercase text-shadow-shadow-1 opacity-90'>{currentWorkspace?.name[0]?.toLocaleUpperCase()}</span>
+          </div>
+          <div className='grow'>
+            <div className='system-md-semibold flex items-center gap-1 text-text-secondary'>
+              <span>{currentWorkspace?.name}</span>
+              {isCurrentWorkspaceOwner && <span>
+                <Tooltip
+                  popupContent={t('common.account.editWorkspaceInfo')}
+                  needsDelay
+                >
+                  <div
+                    className='cursor-pointer rounded-md p-1 hover:bg-black/5'
+                    onClick={() => {
+                      setEditWorkspaceModalVisible(true)
+                    }}
+                  >
+                    <RiPencilLine className='h-4 w-4 text-text-tertiary' />
+                  </div>
+                </Tooltip>
+              </span>}
+            </div>
+            <div className='system-xs-medium mt-1 text-text-tertiary'>
+              {enableBilling && isNotUnlimitedMemberPlan
+                ? (
+                  <div className='flex space-x-1'>
+                    <div>{t('billing.plansCommon.member')}{locale !== LanguagesSupported[1] && accounts.length > 1 && 's'}</div>
+                    <div className=''>{accounts.length}</div>
+                    <div>/</div>
+                    <div>{plan.total.teamMembers === NUM_INFINITE ? t('billing.plansCommon.unlimited') : plan.total.teamMembers}</div>
+                  </div>
+                )
+                : (
+                  <div className='flex space-x-1'>
+                    <div>{accounts.length}</div>
+                    <div>{t('billing.plansCommon.memberAfter')}{locale !== LanguagesSupported[1] && accounts.length > 1 && 's'}</div>
+                  </div>
+                )}
+            </div>
+
+          </div>
+          {isMemberFull && (
+            <UpgradeBtn className='mr-2' loc='member-invite' />
+          )}
+          <Button variant='primary' className={cn('shrink-0')} disabled={!isCurrentWorkspaceManager || isMemberFull} onClick={() => setInviteModalVisible(true)}>
+            <RiUserAddLine className='mr-1 h-4 w-4' />
+            {t('common.members.invite')}
+          </Button>
+        </div>
+        <div className='overflow-visible lg:overflow-visible'>
+          <div className='flex min-w-[480px] items-center border-b border-divider-regular py-[7px]'>
+            <div className='system-xs-medium-uppercase grow px-3 text-text-tertiary'>{t('common.members.name')}</div>
+            <div className='system-xs-medium-uppercase w-[104px] shrink-0 text-text-tertiary'>{t('common.members.lastActive')}</div>
+            <div className='system-xs-medium-uppercase w-[96px] shrink-0 px-3 text-text-tertiary'>{t('common.members.role')}</div>
+          </div>
+          <div className='relative min-w-[480px]'>
+            {
+              accounts.map(account => (
+                <div key={account.id} className='flex border-b border-divider-subtle'>
+                  <div className='flex grow items-center px-3 py-2'>
+                    <Avatar avatar={account.avatar_url} size={24} className='mr-2' name={account.name} />
+                    <div className=''>
+                      <div className='system-sm-medium text-text-secondary'>
+                        {account.name}
+                        {account.status === 'pending' && <span className='system-xs-medium ml-1 text-text-warning'>{t('common.members.pending')}</span>}
+                        {userProfile.email === account.email && <span className='system-xs-regular text-text-tertiary'>{t('common.members.you')}</span>}
+                      </div>
+                      <div className='system-xs-regular text-text-tertiary'>{account.email}</div>
+                    </div>
+                  </div>
+                  <div className='system-sm-regular flex w-[104px] shrink-0 items-center py-2 text-text-secondary'>{dayjs(Number((account.last_active_at || account.created_at)) * 1000).locale(locale === 'zh-Hans' ? 'zh-cn' : 'en').fromNow()}</div>
+                  <div className='flex w-[96px] shrink-0 items-center'>
+                    {
+                      isCurrentWorkspaceOwner && account.role !== 'owner'
+                        ? <Operation member={account} operatorRole={currentWorkspace.role} onOperate={mutate} />
+                        : <div className='system-sm-regular px-3 text-text-secondary'>{RoleMap[account.role] || RoleMap.normal}</div>
+                    }
+                  </div>
+                </div>
+              ))
+            }
+          </div>
+        </div>
+      </div>
+      {
+        inviteModalVisible && (
+          <InviteModal
+            isEmailSetup={systemFeatures.is_email_setup}
+            onCancel={() => setInviteModalVisible(false)}
+            onSend={(invitationResults) => {
+              setInvitedModalVisible(true)
+              setInvitationResults(invitationResults)
+              mutate()
+            }}
+          />
+        )
+      }
+      {
+        invitedModalVisible && (
+          <InvitedModal
+            invitationResults={invitationResults}
+            onCancel={() => setInvitedModalVisible(false)}
+          />
+        )
+      }
+      {
+        editWorkspaceModalVisible && (
+          <EditWorkspaceModal
+            onCancel={() => setEditWorkspaceModalVisible(false)}
+          />
+        )
+      }
+    </>
+  )
+}
+
+export default MembersPage
diff --git a/app/components/header/account-setting/members-page/invite-modal/index.module.css b/app/components/header/account-setting/members-page/invite-modal/index.module.css
new file mode 100644
index 0000000..fbaa118
--- /dev/null
+++ b/app/components/header/account-setting/members-page/invite-modal/index.module.css
@@ -0,0 +1,12 @@
+.modal {
+  padding: 24px 32px !important;
+  width: 400px !important;
+}
+
+.emailsInput {
+  background-color: rgb(243 244 246 / var(--tw-bg-opacity)) !important;
+}
+
+.emailBackground {
+  background-color: white !important;
+}
diff --git a/app/components/header/account-setting/members-page/invite-modal/index.tsx b/app/components/header/account-setting/members-page/invite-modal/index.tsx
new file mode 100644
index 0000000..107166b
--- /dev/null
+++ b/app/components/header/account-setting/members-page/invite-modal/index.tsx
@@ -0,0 +1,123 @@
+'use client'
+import { useCallback, useState } from 'react'
+import { useContext } from 'use-context-selector'
+import { RiCloseLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { ReactMultiEmail } from 'react-multi-email'
+import { RiErrorWarningFill } from '@remixicon/react'
+import RoleSelector from './role-selector'
+import s from './index.module.css'
+import cn from '@/utils/classnames'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import { inviteMember } from '@/service/common'
+import { emailRegex } from '@/config'
+import { ToastContext } from '@/app/components/base/toast'
+import type { InvitationResult } from '@/models/common'
+import I18n from '@/context/i18n'
+import 'react-multi-email/dist/style.css'
+import { noop } from 'lodash-es'
+
+type IInviteModalProps = {
+  isEmailSetup: boolean
+  onCancel: () => void
+  onSend: (invitationResults: InvitationResult[]) => void
+}
+
+const InviteModal = ({
+  isEmailSetup,
+  onCancel,
+  onSend,
+}: IInviteModalProps) => {
+  const { t } = useTranslation()
+  const [emails, setEmails] = useState<string[]>([])
+  const { notify } = useContext(ToastContext)
+
+  const { locale } = useContext(I18n)
+  const [role, setRole] = useState<string>('normal')
+
+  const handleSend = useCallback(async () => {
+    if (emails.map((email: string) => emailRegex.test(email)).every(Boolean)) {
+      try {
+        const { result, invitation_results } = await inviteMember({
+          url: '/workspaces/current/members/invite-email',
+          body: { emails, role, language: locale },
+        })
+
+        if (result === 'success') {
+          onCancel()
+          onSend(invitation_results)
+        }
+      }
+      catch { }
+    }
+    else {
+      notify({ type: 'error', message: t('common.members.emailInvalid') })
+    }
+  }, [role, emails, notify, onCancel, onSend, t])
+
+  return (
+    <div className={cn(s.wrap)}>
+      <Modal overflowVisible isShow onClose={noop} className={cn(s.modal)}>
+        <div className='mb-2 flex justify-between'>
+          <div className='text-xl font-semibold text-text-primary'>{t('common.members.inviteTeamMember')}</div>
+          <RiCloseLine className='h-4 w-4 cursor-pointer text-text-tertiary' onClick={onCancel} />
+        </div>
+        <div className='mb-3 text-[13px] text-text-tertiary'>{t('common.members.inviteTeamMemberTip')}</div>
+        {!isEmailSetup && (
+          <div className='grow basis-0 overflow-y-auto pb-4'>
+            <div className='relative mb-1 rounded-xl border border-components-panel-border p-2 shadow-xs'>
+              <div className='absolute left-0 top-0 h-full w-full rounded-xl opacity-40' style={{ background: 'linear-gradient(92deg, rgba(255, 171, 0, 0.25) 18.12%, rgba(255, 255, 255, 0.00) 167.31%)' }}></div>
+              <div className='relative flex h-full w-full items-start'>
+                <div className='mr-0.5 shrink-0 p-0.5'>
+                  <RiErrorWarningFill className='h-5 w-5 text-text-warning' />
+                </div>
+                <div className='system-xs-medium text-text-primary'>
+                  <span>{t('common.members.emailNotSetup')}</span>
+                </div>
+              </div>
+            </div>
+          </div>
+        )}
+
+        <div>
+          <div className='mb-2 text-sm font-medium text-text-primary'>{t('common.members.email')}</div>
+          <div className='mb-8 flex h-36 items-stretch'>
+            <ReactMultiEmail
+              className={cn('w-full border-components-input-border-active !bg-components-input-bg-normal px-3 pt-2 outline-none',
+                'appearance-none overflow-y-auto rounded-lg text-sm !text-text-primary',
+              )}
+              autoFocus
+              emails={emails}
+              inputClassName='bg-transparent'
+              onChange={setEmails}
+              getLabel={(email, index, removeEmail) =>
+                <div data-tag key={index} className={cn('bg-components-button-secondary-bg')}>
+                  <div data-tag-item>{email}</div>
+                  <span data-tag-handle onClick={() => removeEmail(index)}>
+                    脳
+                  </span>
+                </div>
+              }
+              placeholder={t('common.members.emailPlaceholder') || ''}
+            />
+          </div>
+          <div className='mb-6'>
+            <RoleSelector value={role} onChange={setRole} />
+          </div>
+          <Button
+            tabIndex={0}
+            className='w-full'
+            onClick={handleSend}
+            disabled={!emails.length}
+            variant='primary'
+          >
+            {t('common.members.sendInvite')}
+          </Button>
+        </div>
+      </Modal>
+    </div>
+  )
+}
+
+export default InviteModal
diff --git a/app/components/header/account-setting/members-page/invite-modal/role-selector.tsx b/app/components/header/account-setting/members-page/invite-modal/role-selector.tsx
new file mode 100644
index 0000000..0a28d79
--- /dev/null
+++ b/app/components/header/account-setting/members-page/invite-modal/role-selector.tsx
@@ -0,0 +1,95 @@
+import { useTranslation } from 'react-i18next'
+import cn from 'classnames'
+import React, { useState } from 'react'
+import { RiArrowDownSLine } from '@remixicon/react'
+import { useProviderContext } from '@/context/provider-context'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { Check } from '@/app/components/base/icons/src/vender/line/general'
+
+export type RoleSelectorProps = {
+  value: string
+  onChange: (role: string) => void
+}
+
+const RoleSelector = ({ value, onChange }: RoleSelectorProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const { datasetOperatorEnabled } = useProviderContext()
+
+  const toHump = (name: string) => name.replace(/_(\w)/g, (all, letter) => letter.toUpperCase())
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <div className='relative'>
+        <PortalToFollowElemTrigger
+          onClick={() => setOpen(v => !v)}
+          className='block'
+        >
+          <div className={cn('flex cursor-pointer items-center rounded-lg bg-components-input-bg-normal px-3 py-2 hover:bg-state-base-hover', open && 'bg-state-base-hover')}>
+            <div className='mr-2 grow text-sm leading-5 text-text-primary'>{t('common.members.invitedAsRole', { role: t(`common.members.${toHump(value)}`) })}</div>
+            <RiArrowDownSLine className='h-4 w-4 shrink-0 text-text-secondary' />
+          </div>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[1002]'>
+          <div className='relative w-[336px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-lg'>
+            <div className='p-1'>
+              <div className='cursor-pointer rounded-lg p-2 hover:bg-state-base-hover' onClick={() => {
+                onChange('normal')
+                setOpen(false)
+              }}>
+                <div className='relative pl-5'>
+                  <div className='text-sm leading-5 text-text-secondary'>{t('common.members.normal')}</div>
+                  <div className='text-xs leading-[18px] text-text-tertiary'>{t('common.members.normalTip')}</div>
+                  {value === 'normal' && <Check className='absolute left-0 top-0.5 h-4 w-4 text-text-accent'/>}
+                </div>
+              </div>
+              <div className='cursor-pointer rounded-lg p-2 hover:bg-state-base-hover' onClick={() => {
+                onChange('editor')
+                setOpen(false)
+              }}>
+                <div className='relative pl-5'>
+                  <div className='text-sm leading-5 text-text-secondary'>{t('common.members.editor')}</div>
+                  <div className='text-xs leading-[18px] text-text-tertiary'>{t('common.members.editorTip')}</div>
+                  {value === 'editor' && <Check className='absolute left-0 top-0.5 h-4 w-4 text-text-accent'/>}
+                </div>
+              </div>
+              <div className='cursor-pointer rounded-lg p-2 hover:bg-state-base-hover' onClick={() => {
+                onChange('admin')
+                setOpen(false)
+              }}>
+                <div className='relative pl-5'>
+                  <div className='text-sm leading-5 text-text-secondary'>{t('common.members.admin')}</div>
+                  <div className='text-xs leading-[18px] text-text-tertiary'>{t('common.members.adminTip')}</div>
+                  {value === 'admin' && <Check className='absolute left-0 top-0.5 h-4 w-4 text-text-accent'/>}
+                </div>
+              </div>
+              {datasetOperatorEnabled && (
+                <div className='cursor-pointer rounded-lg p-2 hover:bg-state-base-hover' onClick={() => {
+                  onChange('dataset_operator')
+                  setOpen(false)
+                }}>
+                  <div className='relative pl-5'>
+                    <div className='text-sm leading-5 text-text-secondary'>{t('common.members.datasetOperator')}</div>
+                    <div className='text-xs leading-[18px] text-text-tertiary'>{t('common.members.datasetOperatorTip')}</div>
+                    {value === 'dataset_operator' && <Check className='absolute left-0 top-0.5 h-4 w-4 text-text-accent'/>}
+                  </div>
+                </div>
+              )}
+            </div>
+          </div>
+        </PortalToFollowElemContent>
+      </div>
+    </PortalToFollowElem>
+  )
+}
+
+export default RoleSelector
diff --git a/app/components/header/account-setting/members-page/invited-modal/assets/copied.svg b/app/components/header/account-setting/members-page/invited-modal/assets/copied.svg
new file mode 100644
index 0000000..de5f86c
--- /dev/null
+++ b/app/components/header/account-setting/members-page/invited-modal/assets/copied.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M10.6665 2.66683C11.2865 2.66683 11.5965 2.66683 11.8508 2.73498C12.541 2.91991 13.0801 3.45901 13.265 4.14919C13.3332 4.40352 13.3332 4.71352 13.3332 5.3335V11.4668C13.3332 12.5869 13.3332 13.147 13.1152 13.5748C12.9234 13.9511 12.6175 14.2571 12.2412 14.4488C11.8133 14.6668 11.2533 14.6668 10.1332 14.6668H5.8665C4.7464 14.6668 4.18635 14.6668 3.75852 14.4488C3.3822 14.2571 3.07624 13.9511 2.88449 13.5748C2.6665 13.147 2.6665 12.5869 2.6665 11.4668V5.3335C2.6665 4.71352 2.6665 4.40352 2.73465 4.14919C2.91959 3.45901 3.45868 2.91991 4.14887 2.73498C4.4032 2.66683 4.71319 2.66683 5.33317 2.66683M5.99984 10.0002L7.33317 11.3335L10.3332 8.3335M6.39984 4.00016H9.59984C9.9732 4.00016 10.1599 4.00016 10.3025 3.9275C10.4279 3.86359 10.5299 3.7616 10.5938 3.63616C10.6665 3.49355 10.6665 3.30686 10.6665 2.9335V2.40016C10.6665 2.02679 10.6665 1.84011 10.5938 1.6975C10.5299 1.57206 10.4279 1.47007 10.3025 1.40616C10.1599 1.3335 9.97321 1.3335 9.59984 1.3335H6.39984C6.02647 1.3335 5.83978 1.3335 5.69718 1.40616C5.57174 1.47007 5.46975 1.57206 5.40583 1.6975C5.33317 1.84011 5.33317 2.02679 5.33317 2.40016V2.9335C5.33317 3.30686 5.33317 3.49355 5.40583 3.63616C5.46975 3.7616 5.57174 3.86359 5.69718 3.9275C5.83978 4.00016 6.02647 4.00016 6.39984 4.00016Z" stroke="#1D2939" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/header/account-setting/members-page/invited-modal/assets/copy-hover.svg b/app/components/header/account-setting/members-page/invited-modal/assets/copy-hover.svg
new file mode 100644
index 0000000..ca8334a
--- /dev/null
+++ b/app/components/header/account-setting/members-page/invited-modal/assets/copy-hover.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M10.6665 2.66634H11.9998C12.3535 2.66634 12.6926 2.80682 12.9426 3.05687C13.1927 3.30691 13.3332 3.64605 13.3332 3.99967V13.333C13.3332 13.6866 13.1927 14.0258 12.9426 14.2758C12.6926 14.5259 12.3535 14.6663 11.9998 14.6663H3.99984C3.64622 14.6663 3.30708 14.5259 3.05703 14.2758C2.80698 14.0258 2.6665 13.6866 2.6665 13.333V3.99967C2.6665 3.64605 2.80698 3.30691 3.05703 3.05687C3.30708 2.80682 3.64622 2.66634 3.99984 2.66634H5.33317M5.99984 1.33301H9.99984C10.368 1.33301 10.6665 1.63148 10.6665 1.99967V3.33301C10.6665 3.7012 10.368 3.99967 9.99984 3.99967H5.99984C5.63165 3.99967 5.33317 3.7012 5.33317 3.33301V1.99967C5.33317 1.63148 5.63165 1.33301 5.99984 1.33301Z" stroke="#1D2939" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/header/account-setting/members-page/invited-modal/assets/copy.svg b/app/components/header/account-setting/members-page/invited-modal/assets/copy.svg
new file mode 100644
index 0000000..18d2b4e
--- /dev/null
+++ b/app/components/header/account-setting/members-page/invited-modal/assets/copy.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M10.6665 2.66634H11.9998C12.3535 2.66634 12.6926 2.80682 12.9426 3.05687C13.1927 3.30691 13.3332 3.64605 13.3332 3.99967V13.333C13.3332 13.6866 13.1927 14.0258 12.9426 14.2758C12.6926 14.5259 12.3535 14.6663 11.9998 14.6663H3.99984C3.64622 14.6663 3.30708 14.5259 3.05703 14.2758C2.80698 14.0258 2.6665 13.6866 2.6665 13.333V3.99967C2.6665 3.64605 2.80698 3.30691 3.05703 3.05687C3.30708 2.80682 3.64622 2.66634 3.99984 2.66634H5.33317M5.99984 1.33301H9.99984C10.368 1.33301 10.6665 1.63148 10.6665 1.99967V3.33301C10.6665 3.7012 10.368 3.99967 9.99984 3.99967H5.99984C5.63165 3.99967 5.33317 3.7012 5.33317 3.33301V1.99967C5.33317 1.63148 5.63165 1.33301 5.99984 1.33301Z" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/header/account-setting/members-page/invited-modal/index.module.css b/app/components/header/account-setting/members-page/invited-modal/index.module.css
new file mode 100644
index 0000000..9647043
--- /dev/null
+++ b/app/components/header/account-setting/members-page/invited-modal/index.module.css
@@ -0,0 +1,21 @@
+.modal {
+  padding: 32px !important;
+  width: 480px !important;
+  /* background: linear-gradient(180deg, rgba(3, 152, 85, 0.05) 0%, rgba(3, 152, 85, 0) 22.44%), #F9FAFB !important; */
+}
+
+.copyIcon {
+  background-image: url(./assets/copy.svg);
+  background-position: center;
+  background-repeat: no-repeat;
+}
+
+.copyIcon:hover {
+  background-image: url(./assets/copy-hover.svg);
+  background-position: center;
+  background-repeat: no-repeat;
+}
+
+.copyIcon.copied {
+  background-image: url(./assets/copied.svg);
+}
diff --git a/app/components/header/account-setting/members-page/invited-modal/index.tsx b/app/components/header/account-setting/members-page/invited-modal/index.tsx
new file mode 100644
index 0000000..2719708
--- /dev/null
+++ b/app/components/header/account-setting/members-page/invited-modal/index.tsx
@@ -0,0 +1,99 @@
+import { CheckCircleIcon } from '@heroicons/react/24/solid'
+import { XMarkIcon } from '@heroicons/react/24/outline'
+import { RiQuestionLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useMemo } from 'react'
+import InvitationLink from './invitation-link'
+import s from './index.module.css'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import { IS_CE_EDITION } from '@/config'
+import type { InvitationResult } from '@/models/common'
+import Tooltip from '@/app/components/base/tooltip'
+import { noop } from 'lodash-es'
+
+export type SuccessInvitationResult = Extract<InvitationResult, { status: 'success' }>
+export type FailedInvitationResult = Extract<InvitationResult, { status: 'failed' }>
+
+type IInvitedModalProps = {
+  invitationResults: InvitationResult[]
+  onCancel: () => void
+}
+const InvitedModal = ({
+  invitationResults,
+  onCancel,
+}: IInvitedModalProps) => {
+  const { t } = useTranslation()
+
+  const successInvitationResults = useMemo<SuccessInvitationResult[]>(() => invitationResults?.filter(item => item.status === 'success') as SuccessInvitationResult[], [invitationResults])
+  const failedInvitationResults = useMemo<FailedInvitationResult[]>(() => invitationResults?.filter(item => item.status !== 'success') as FailedInvitationResult[], [invitationResults])
+
+  return (
+    <div className={s.wrap}>
+      <Modal isShow onClose={noop} className={s.modal}>
+        <div className='mb-3 flex justify-between'>
+          <div className='
+            flex h-12 w-12 items-center justify-center rounded-xl
+            border-[0.5px] border-components-panel-border bg-background-section-burn
+            shadow-xl
+          '>
+            <CheckCircleIcon className='h-[22px] w-[22px] text-[#039855]' />
+          </div>
+          <XMarkIcon className='h-4 w-4 cursor-pointer' onClick={onCancel} />
+        </div>
+        <div className='mb-1 text-xl font-semibold text-text-primary'>{t('common.members.invitationSent')}</div>
+        {!IS_CE_EDITION && (
+          <div className='mb-10 text-sm text-text-tertiary'>{t('common.members.invitationSentTip')}</div>
+        )}
+        {IS_CE_EDITION && (
+          <>
+            <div className='mb-5 text-sm text-text-tertiary'>{t('common.members.invitationSentTip')}</div>
+            <div className='mb-9 flex flex-col gap-2'>
+              {
+                !!successInvitationResults.length
+                && <>
+                  <div className='font-Medium py-2 text-sm text-text-primary'>{t('common.members.invitationLink')}</div>
+                  {successInvitationResults.map(item =>
+                    <InvitationLink key={item.email} value={item} />)}
+                </>
+              }
+              {
+                !!failedInvitationResults.length
+                && <>
+                  <div className='font-Medium py-2 text-sm text-text-primary'>{t('common.members.failedInvitationEmails')}</div>
+                  <div className='flex flex-wrap justify-between gap-y-1'>
+                    {
+                      failedInvitationResults.map(item =>
+                        <div key={item.email} className='flex justify-center rounded-md border border-red-300 bg-orange-50 px-1'>
+                          <Tooltip
+                            popupContent={item.message}
+                          >
+                            <div className='flex items-center justify-center gap-1 text-sm'>
+                              {item.email}
+                              <RiQuestionLine className='h-4 w-4 text-red-300' />
+                            </div>
+                          </Tooltip>
+                        </div>,
+                      )
+                    }
+                  </div>
+                </>
+              }
+            </div>
+          </>
+        )}
+        <div className='flex justify-end'>
+          <Button
+            className='w-[96px]'
+            onClick={onCancel}
+            variant='primary'
+          >
+            {t('common.members.ok')}
+          </Button>
+        </div>
+      </Modal>
+    </div>
+  )
+}
+
+export default InvitedModal
diff --git a/app/components/header/account-setting/members-page/invited-modal/invitation-link.tsx b/app/components/header/account-setting/members-page/invited-modal/invitation-link.tsx
new file mode 100644
index 0000000..2426f7b
--- /dev/null
+++ b/app/components/header/account-setting/members-page/invited-modal/invitation-link.tsx
@@ -0,0 +1,62 @@
+'use client'
+import React, { useCallback, useEffect, useRef, useState } from 'react'
+import { t } from 'i18next'
+import copy from 'copy-to-clipboard'
+import s from './index.module.css'
+import type { SuccessInvitationResult } from '.'
+import Tooltip from '@/app/components/base/tooltip'
+import { randomString } from '@/utils'
+
+type IInvitationLinkProps = {
+  value: SuccessInvitationResult
+}
+
+const InvitationLink = ({
+  value,
+}: IInvitationLinkProps) => {
+  const [isCopied, setIsCopied] = useState(false)
+  const selector = useRef(`invite-link-${randomString(4)}`)
+
+  const copyHandle = useCallback(() => {
+    // No prefix is needed here because the backend has already processed it
+    copy(`${!value.url.startsWith('http') ? window.location.origin : ''}${value.url}`)
+    setIsCopied(true)
+  }, [value])
+
+  useEffect(() => {
+    if (isCopied) {
+      const timeout = setTimeout(() => {
+        setIsCopied(false)
+      }, 1000)
+
+      return () => {
+        clearTimeout(timeout)
+      }
+    }
+  }, [isCopied])
+
+  return (
+    <div className='flex items-center rounded-lg border border-components-input-border-active bg-components-input-bg-normal py-2 hover:bg-state-base-hover'>
+      <div className="flex h-5 grow items-center">
+        <div className='relative h-full grow text-[13px]'>
+          <Tooltip
+            popupContent={isCopied ? `${t('appApi.copied')}` : `${t('appApi.copy')}`}
+          >
+            <div className='r-0 absolute left-0 top-0 w-full cursor-pointer truncate pl-2 pr-2' onClick={copyHandle}>{value.url}</div>
+          </Tooltip>
+        </div>
+        <div className="h-4 shrink-0 border bg-divider-regular" />
+        <Tooltip
+          popupContent={isCopied ? `${t('appApi.copied')}` : `${t('appApi.copy')}`}
+        >
+          <div className="shrink-0 px-0.5">
+            <div className={`box-border flex h-[30px] w-[30px] cursor-pointer items-center justify-center rounded-lg hover:bg-state-base-hover ${s.copyIcon} ${isCopied ? s.copied : ''}`} onClick={copyHandle}>
+            </div>
+          </div>
+        </Tooltip>
+      </div>
+    </div>
+  )
+}
+
+export default InvitationLink
diff --git a/app/components/header/account-setting/members-page/operation/index.tsx b/app/components/header/account-setting/members-page/operation/index.tsx
new file mode 100644
index 0000000..46f842d
--- /dev/null
+++ b/app/components/header/account-setting/members-page/operation/index.tsx
@@ -0,0 +1,134 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { Fragment, useMemo } from 'react'
+import { useContext } from 'use-context-selector'
+import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react'
+import { CheckIcon, ChevronDownIcon } from '@heroicons/react/24/outline'
+import { useProviderContext } from '@/context/provider-context'
+import cn from '@/utils/classnames'
+import type { Member } from '@/models/common'
+import { deleteMemberOrCancelInvitation, updateMemberRole } from '@/service/common'
+import { ToastContext } from '@/app/components/base/toast'
+
+type IOperationProps = {
+  member: Member
+  operatorRole: string
+  onOperate: () => void
+}
+
+const Operation = ({
+  member,
+  operatorRole,
+  onOperate,
+}: IOperationProps) => {
+  const { t } = useTranslation()
+  const { datasetOperatorEnabled } = useProviderContext()
+  const RoleMap = {
+    owner: t('common.members.owner'),
+    admin: t('common.members.admin'),
+    editor: t('common.members.editor'),
+    normal: t('common.members.normal'),
+    dataset_operator: t('common.members.datasetOperator'),
+  }
+  const roleList = useMemo(() => {
+    if (operatorRole === 'owner') {
+      return [
+        ...['admin', 'editor', 'normal'],
+        ...(datasetOperatorEnabled ? ['dataset_operator'] : []),
+      ]
+    }
+    if (operatorRole === 'admin') {
+      return [
+        ...['editor', 'normal'],
+        ...(datasetOperatorEnabled ? ['dataset_operator'] : []),
+      ]
+    }
+    return []
+  }, [operatorRole, datasetOperatorEnabled])
+  const { notify } = useContext(ToastContext)
+  const toHump = (name: string) => name.replace(/_(\w)/g, (all, letter) => letter.toUpperCase())
+  const handleDeleteMemberOrCancelInvitation = async () => {
+    try {
+      await deleteMemberOrCancelInvitation({ url: `/workspaces/current/members/${member.id}` })
+      onOperate()
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+    }
+    catch {
+
+    }
+  }
+  const handleUpdateMemberRole = async (role: string) => {
+    try {
+      await updateMemberRole({
+        url: `/workspaces/current/members/${member.id}/update-role`,
+        body: { role },
+      })
+      onOperate()
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+    }
+    catch {
+
+    }
+  }
+
+  return (
+    <Menu as="div" className="relative h-full w-full">
+      {
+        ({ open }) => (
+          <>
+            <MenuButton className={cn('system-sm-regular group flex h-full w-full cursor-pointer items-center justify-between px-3 text-text-secondary hover:bg-state-base-hover', open && 'bg-state-base-hover')}>
+              {RoleMap[member.role] || RoleMap.normal}
+              <ChevronDownIcon className={cn('h-4 w-4 group-hover:block', open ? 'block' : 'hidden')} />
+            </MenuButton>
+            <Transition
+              as={Fragment}
+              enter="transition ease-out duration-100"
+              enterFrom="transform opacity-0 scale-95"
+              enterTo="transform opacity-100 scale-100"
+              leave="transition ease-in duration-75"
+              leaveFrom="transform opacity-100 scale-100"
+              leaveTo="transform opacity-0 scale-95"
+            >
+              <MenuItems
+                className={cn('absolute right-0 top-[52px] z-10 origin-top-right rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg backdrop-blur-sm')}
+              >
+                <div className="p-1">
+                  {
+                    roleList.map(role => (
+                      <MenuItem key={role}>
+                        <div className='flex cursor-pointer rounded-lg px-3 py-2 hover:bg-state-base-hover' onClick={() => handleUpdateMemberRole(role)}>
+                          {
+                            role === member.role
+                              ? <CheckIcon className='mr-1 mt-[2px] h-4 w-4 text-text-accent' />
+                              : <div className='mr-1 mt-[2px] h-4 w-4 text-text-accent' />
+                          }
+                          <div>
+                            <div className='system-sm-semibold whitespace-nowrap text-text-secondary'>{t(`common.members.${toHump(role)}`)}</div>
+                            <div className='system-xs-regular whitespace-nowrap text-text-tertiary'>{t(`common.members.${toHump(role)}Tip`)}</div>
+                          </div>
+                        </div>
+                      </MenuItem>
+                    ))
+                  }
+                </div>
+                <MenuItem>
+                  <div className='border-t border-divider-subtle p-1'>
+                    <div className='flex cursor-pointer rounded-lg px-3 py-2 hover:bg-state-base-hover' onClick={handleDeleteMemberOrCancelInvitation}>
+                      <div className='mr-1 mt-[2px] h-4 w-4 text-text-accent' />
+                      <div>
+                        <div className='system-sm-semibold whitespace-nowrap text-text-secondary'>{t('common.members.removeFromTeam')}</div>
+                        <div className='system-xs-regular whitespace-nowrap text-text-tertiary'>{t('common.members.removeFromTeamTip')}</div>
+                      </div>
+                    </div>
+                  </div>
+                </MenuItem>
+              </MenuItems>
+            </Transition>
+          </>
+        )
+      }
+    </Menu>
+  )
+}
+
+export default Operation
diff --git a/app/components/header/account-setting/menu-dialog.tsx b/app/components/header/account-setting/menu-dialog.tsx
new file mode 100644
index 0000000..ad3a1e7
--- /dev/null
+++ b/app/components/header/account-setting/menu-dialog.tsx
@@ -0,0 +1,60 @@
+import { Fragment, useCallback, useEffect } from 'react'
+import type { ReactNode } from 'react'
+import { Dialog, DialogPanel, Transition, TransitionChild } from '@headlessui/react'
+import cn from '@/utils/classnames'
+import { noop } from 'lodash-es'
+
+type DialogProps = {
+  className?: string
+  children: ReactNode
+  show: boolean
+  onClose?: () => void
+}
+
+const MenuDialog = ({
+  className,
+  children,
+  show,
+  onClose,
+}: DialogProps) => {
+  const close = useCallback(() => onClose?.(), [onClose])
+
+  useEffect(() => {
+    const handleKeyDown = (event: KeyboardEvent) => {
+      if (event.key === 'Escape') {
+        event.preventDefault()
+        close()
+      }
+    }
+
+    document.addEventListener('keydown', handleKeyDown)
+    return () => {
+      document.removeEventListener('keydown', handleKeyDown)
+    }
+  }, [close])
+
+  return (
+    <Transition appear show={show} as={Fragment}>
+      <Dialog as="div" className="relative z-[60]" onClose={noop}>
+        <div className="fixed inset-0">
+          <div className="flex min-h-full flex-col items-center justify-center">
+            <TransitionChild>
+              <DialogPanel className={cn(
+                'relative h-full w-full grow overflow-hidden bg-background-sidenav-bg p-0 text-left align-middle backdrop-blur-md transition-all',
+                'duration-300 ease-in data-[closed]:scale-95 data-[closed]:opacity-0',
+                'data-[enter]:scale-100 data-[enter]:opacity-100',
+                'data-[enter]:scale-95 data-[leave]:opacity-0',
+                className,
+              )}>
+                <div className='absolute right-0 top-0 h-full w-1/2 bg-components-panel-bg' />
+                {children}
+              </DialogPanel>
+            </TransitionChild>
+          </div>
+        </div>
+      </Dialog>
+    </Transition >
+  )
+}
+
+export default MenuDialog
diff --git a/app/components/header/account-setting/model-provider-page/declarations.ts b/app/components/header/account-setting/model-provider-page/declarations.ts
new file mode 100644
index 0000000..12dd9b3
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/declarations.ts
@@ -0,0 +1,271 @@
+export type FormValue = Record<string, any>
+
+export type TypeWithI18N<T = string> = {
+  en_US: T
+  zh_Hans: T
+  [key: string]: T
+}
+
+export enum FormTypeEnum {
+  textInput = 'text-input',
+  textNumber = 'number-input',
+  secretInput = 'secret-input',
+  select = 'select',
+  radio = 'radio',
+  boolean = 'boolean',
+  files = 'files',
+  file = 'file',
+  modelSelector = 'model-selector',
+  toolSelector = 'tool-selector',
+  multiToolSelector = 'array[tools]',
+  appSelector = 'app-selector',
+}
+
+export type FormOption = {
+  label: TypeWithI18N
+  value: string
+  show_on: FormShowOnObject[]
+}
+
+export enum ModelTypeEnum {
+  textGeneration = 'llm',
+  textEmbedding = 'text-embedding',
+  rerank = 'rerank',
+  speech2text = 'speech2text',
+  moderation = 'moderation',
+  tts = 'tts',
+}
+
+export const MODEL_TYPE_TEXT = {
+  [ModelTypeEnum.textGeneration]: 'LLM',
+  [ModelTypeEnum.textEmbedding]: 'Text Embedding',
+  [ModelTypeEnum.rerank]: 'Rerank',
+  [ModelTypeEnum.speech2text]: 'Speech2text',
+  [ModelTypeEnum.moderation]: 'Moderation',
+  [ModelTypeEnum.tts]: 'TTS',
+}
+
+export enum ConfigurationMethodEnum {
+  predefinedModel = 'predefined-model',
+  customizableModel = 'customizable-model',
+  fetchFromRemote = 'fetch-from-remote',
+}
+
+export enum ModelFeatureEnum {
+  toolCall = 'tool-call',
+  multiToolCall = 'multi-tool-call',
+  agentThought = 'agent-thought',
+  streamToolCall = 'stream-tool-call',
+  vision = 'vision',
+  video = 'video',
+  document = 'document',
+  audio = 'audio',
+  StructuredOutput = 'structured-output',
+}
+
+export enum ModelFeatureTextEnum {
+  toolCall = 'Tool Call',
+  multiToolCall = 'Multi Tool Call',
+  agentThought = 'Agent Thought',
+  vision = 'Vision',
+  video = 'Video',
+  document = 'Document',
+  audio = 'Audio',
+}
+
+export enum ModelStatusEnum {
+  active = 'active',
+  noConfigure = 'no-configure',
+  quotaExceeded = 'quota-exceeded',
+  noPermission = 'no-permission',
+  disabled = 'disabled',
+}
+
+export const MODEL_STATUS_TEXT: { [k: string]: TypeWithI18N } = {
+  'no-configure': {
+    en_US: 'No Configure',
+    zh_Hans: '鏈厤缃嚟鎹�',
+  },
+  'quota-exceeded': {
+    en_US: 'Quota Exceeded',
+    zh_Hans: '棰濆害涓嶈冻',
+  },
+  'no-permission': {
+    en_US: 'No Permission',
+    zh_Hans: '鏃犱娇鐢ㄦ潈闄�',
+  },
+}
+
+export enum CustomConfigurationStatusEnum {
+  active = 'active',
+  noConfigure = 'no-configure',
+}
+
+export type FormShowOnObject = {
+  variable: string
+  value: string
+}
+
+export type CredentialFormSchemaBase = {
+  variable: string
+  label: TypeWithI18N
+  type: FormTypeEnum
+  required: boolean
+  default?: string
+  tooltip?: TypeWithI18N
+  show_on: FormShowOnObject[]
+  url?: string
+  scope?: string
+}
+
+export type CredentialFormSchemaTextInput = CredentialFormSchemaBase & {
+  max_length?: number;
+  placeholder?: TypeWithI18N,
+  template?: {
+    enabled: boolean
+  },
+  auto_generate?: {
+    type: string
+  }
+}
+export type CredentialFormSchemaNumberInput = CredentialFormSchemaBase & { min?: number; max?: number; placeholder?: TypeWithI18N }
+export type CredentialFormSchemaSelect = CredentialFormSchemaBase & { options: FormOption[]; placeholder?: TypeWithI18N }
+export type CredentialFormSchemaRadio = CredentialFormSchemaBase & { options: FormOption[] }
+export type CredentialFormSchemaSecretInput = CredentialFormSchemaBase & { placeholder?: TypeWithI18N }
+export type CredentialFormSchema = CredentialFormSchemaTextInput | CredentialFormSchemaSelect | CredentialFormSchemaRadio | CredentialFormSchemaSecretInput
+
+export type ModelItem = {
+  model: string
+  label: TypeWithI18N
+  model_type: ModelTypeEnum
+  features?: ModelFeatureEnum[]
+  fetch_from: ConfigurationMethodEnum
+  status: ModelStatusEnum
+  model_properties: Record<string, string | number>
+  load_balancing_enabled: boolean
+  deprecated?: boolean
+}
+
+export enum PreferredProviderTypeEnum {
+  system = 'system',
+  custom = 'custom',
+}
+
+export enum CurrentSystemQuotaTypeEnum {
+  trial = 'trial',
+  free = 'free',
+  paid = 'paid',
+}
+
+export enum QuotaUnitEnum {
+  times = 'times',
+  tokens = 'tokens',
+  credits = 'credits',
+}
+
+export type QuotaConfiguration = {
+  quota_type: CurrentSystemQuotaTypeEnum
+  quota_unit: QuotaUnitEnum
+  quota_limit: number
+  quota_used: number
+  last_used: number
+  is_valid: boolean
+}
+
+export type ModelProvider = {
+  provider: string
+  label: TypeWithI18N
+  description?: TypeWithI18N
+  help: {
+    title: TypeWithI18N
+    url: TypeWithI18N
+  }
+  icon_small: TypeWithI18N
+  icon_large: TypeWithI18N
+  background?: string
+  supported_model_types: ModelTypeEnum[]
+  configurate_methods: ConfigurationMethodEnum[]
+  provider_credential_schema: {
+    credential_form_schemas: CredentialFormSchema[]
+  }
+  model_credential_schema: {
+    model: {
+      label: TypeWithI18N
+      placeholder: TypeWithI18N
+    }
+    credential_form_schemas: CredentialFormSchema[]
+  }
+  preferred_provider_type: PreferredProviderTypeEnum
+  custom_configuration: {
+    status: CustomConfigurationStatusEnum
+  }
+  system_configuration: {
+    enabled: boolean
+    current_quota_type: CurrentSystemQuotaTypeEnum
+    quota_configurations: QuotaConfiguration[]
+  }
+}
+
+export type Model = {
+  provider: string
+  icon_large: TypeWithI18N
+  icon_small: TypeWithI18N
+  label: TypeWithI18N
+  models: ModelItem[]
+  status: ModelStatusEnum
+}
+
+export type DefaultModelResponse = {
+  model: string
+  model_type: ModelTypeEnum
+  provider: {
+    provider: string
+    icon_large: TypeWithI18N
+    icon_small: TypeWithI18N
+  }
+}
+
+export type DefaultModel = {
+  provider: string
+  model: string
+}
+
+export type CustomConfigurationModelFixedFields = {
+  __model_name: string
+  __model_type: ModelTypeEnum
+}
+
+export type ModelParameterRule = {
+  default?: number | string | boolean | string[]
+  help?: TypeWithI18N
+  label: TypeWithI18N
+  min?: number
+  max?: number
+  name: string
+  precision?: number
+  required: false
+  type: string
+  use_template?: string
+  options?: string[]
+  tagPlaceholder?: TypeWithI18N
+}
+
+export type ModelLoadBalancingConfigEntry = {
+  /** model balancing config entry id */
+  id?: string
+  /** is config entry enabled */
+  enabled?: boolean
+  /** config entry name */
+  name: string
+  /** model balancing credential */
+  credentials: Record<string, string | undefined | boolean>
+  /** is config entry currently removed from Round-robin queue */
+  in_cooldown?: boolean
+  /** cooldown time (in seconds) */
+  ttl?: number
+}
+
+export type ModelLoadBalancingConfig = {
+  enabled: boolean
+  configs: ModelLoadBalancingConfigEntry[]
+}
diff --git a/app/components/header/account-setting/model-provider-page/hooks.spec.ts b/app/components/header/account-setting/model-provider-page/hooks.spec.ts
new file mode 100644
index 0000000..b7a56f7
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/hooks.spec.ts
@@ -0,0 +1,87 @@
+import { renderHook } from '@testing-library/react'
+import { useLanguage } from './hooks'
+import { useContext } from 'use-context-selector'
+import { after } from 'node:test'
+
+jest.mock('swr', () => ({
+  __esModule: true,
+  default: jest.fn(), // mock useSWR
+  useSWRConfig: jest.fn(),
+}))
+
+// mock use-context-selector
+jest.mock('use-context-selector', () => ({
+  useContext: jest.fn(),
+}))
+
+// mock service/common functions
+jest.mock('@/service/common', () => ({
+  fetchDefaultModal: jest.fn(),
+  fetchModelList: jest.fn(),
+  fetchModelProviderCredentials: jest.fn(),
+  fetchModelProviders: jest.fn(),
+  getPayUrl: jest.fn(),
+}))
+
+// mock context hooks
+jest.mock('@/context/i18n', () => ({
+  __esModule: true,
+  default: jest.fn(),
+}))
+
+jest.mock('@/context/provider-context', () => ({
+  useProviderContext: jest.fn(),
+}))
+
+jest.mock('@/context/modal-context', () => ({
+  useModalContextSelector: jest.fn(),
+}))
+
+jest.mock('@/context/event-emitter', () => ({
+  useEventEmitterContextContext: jest.fn(),
+}))
+
+// mock plugins
+jest.mock('@/app/components/plugins/marketplace/hooks', () => ({
+  useMarketplacePlugins: jest.fn(),
+}))
+
+jest.mock('@/app/components/plugins/marketplace/utils', () => ({
+  getMarketplacePluginsByCollectionId: jest.fn(),
+}))
+
+jest.mock('./provider-added-card', () => jest.fn())
+
+after(() => {
+  jest.resetModules()
+  jest.clearAllMocks()
+})
+
+describe('useLanguage', () => {
+  it('should replace hyphen with underscore in locale', () => {
+    (useContext as jest.Mock).mockReturnValue({
+      locale: 'en-US',
+    })
+    const { result } = renderHook(() => useLanguage())
+    expect(result.current).toBe('en_US')
+  })
+
+  it('should return locale as is if no hyphen exists', () => {
+    (useContext as jest.Mock).mockReturnValue({
+      locale: 'enUS',
+    })
+
+    const { result } = renderHook(() => useLanguage())
+    expect(result.current).toBe('enUS')
+  })
+
+  it('should handle multiple hyphens', () => {
+    // Mock the I18n context return value
+    (useContext as jest.Mock).mockReturnValue({
+      locale: 'zh-Hans-CN',
+    })
+
+    const { result } = renderHook(() => useLanguage())
+    expect(result.current).toBe('zh_Hans-CN')
+  })
+})
diff --git a/app/components/header/account-setting/model-provider-page/hooks.ts b/app/components/header/account-setting/model-provider-page/hooks.ts
new file mode 100644
index 0000000..48acaeb
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/hooks.ts
@@ -0,0 +1,353 @@
+import {
+  useCallback,
+  useEffect,
+  useMemo,
+  useState,
+} from 'react'
+import useSWR, { useSWRConfig } from 'swr'
+import { useContext } from 'use-context-selector'
+import type {
+  CustomConfigurationModelFixedFields,
+  DefaultModel,
+  DefaultModelResponse,
+  Model,
+  ModelProvider,
+  ModelTypeEnum,
+} from './declarations'
+import {
+  ConfigurationMethodEnum,
+  CustomConfigurationStatusEnum,
+  ModelStatusEnum,
+} from './declarations'
+import I18n from '@/context/i18n'
+import {
+  fetchDefaultModal,
+  fetchModelList,
+  fetchModelProviderCredentials,
+  fetchModelProviders,
+  getPayUrl,
+} from '@/service/common'
+import { useProviderContext } from '@/context/provider-context'
+import {
+  useMarketplacePlugins,
+} from '@/app/components/plugins/marketplace/hooks'
+import type { Plugin } from '@/app/components/plugins/types'
+import { PluginType } from '@/app/components/plugins/types'
+import { getMarketplacePluginsByCollectionId } from '@/app/components/plugins/marketplace/utils'
+import { useModalContextSelector } from '@/context/modal-context'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST } from './provider-added-card'
+
+type UseDefaultModelAndModelList = (
+  defaultModel: DefaultModelResponse | undefined,
+  modelList: Model[],
+) => [DefaultModel | undefined, (model: DefaultModel) => void]
+export const useSystemDefaultModelAndModelList: UseDefaultModelAndModelList = (
+  defaultModel,
+  modelList,
+) => {
+  const currentDefaultModel = useMemo(() => {
+    const currentProvider = modelList.find(provider => provider.provider === defaultModel?.provider.provider)
+    const currentModel = currentProvider?.models.find(model => model.model === defaultModel?.model)
+    const currentDefaultModel = currentProvider && currentModel && {
+      model: currentModel.model,
+      provider: currentProvider.provider,
+    }
+
+    return currentDefaultModel
+  }, [defaultModel, modelList])
+  const [defaultModelState, setDefaultModelState] = useState<DefaultModel | undefined>(currentDefaultModel)
+  const handleDefaultModelChange = useCallback((model: DefaultModel) => {
+    setDefaultModelState(model)
+  }, [])
+  useEffect(() => {
+    setDefaultModelState(currentDefaultModel)
+  }, [currentDefaultModel])
+
+  return [defaultModelState, handleDefaultModelChange]
+}
+
+export const useLanguage = () => {
+  const { locale } = useContext(I18n)
+  return locale.replace('-', '_')
+}
+
+export const useProviderCredentialsAndLoadBalancing = (
+  provider: string,
+  configurationMethod: ConfigurationMethodEnum,
+  configured?: boolean,
+  currentCustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields,
+) => {
+  const { data: predefinedFormSchemasValue, mutate: mutatePredefined } = useSWR(
+    (configurationMethod === ConfigurationMethodEnum.predefinedModel && configured)
+      ? `/workspaces/current/model-providers/${provider}/credentials`
+      : null,
+    fetchModelProviderCredentials,
+  )
+  const { data: customFormSchemasValue, mutate: mutateCustomized } = useSWR(
+    (configurationMethod === ConfigurationMethodEnum.customizableModel && currentCustomConfigurationModelFixedFields)
+      ? `/workspaces/current/model-providers/${provider}/models/credentials?model=${currentCustomConfigurationModelFixedFields?.__model_name}&model_type=${currentCustomConfigurationModelFixedFields?.__model_type}`
+      : null,
+    fetchModelProviderCredentials,
+  )
+
+  const credentials = useMemo(() => {
+    return configurationMethod === ConfigurationMethodEnum.predefinedModel
+      ? predefinedFormSchemasValue?.credentials
+      : customFormSchemasValue?.credentials
+        ? {
+          ...customFormSchemasValue?.credentials,
+          ...currentCustomConfigurationModelFixedFields,
+        }
+        : undefined
+  }, [
+    configurationMethod,
+    currentCustomConfigurationModelFixedFields,
+    customFormSchemasValue?.credentials,
+    predefinedFormSchemasValue?.credentials,
+  ])
+
+  const mutate = useMemo(() => () => {
+    mutatePredefined()
+    mutateCustomized()
+  }, [mutateCustomized, mutatePredefined])
+
+  return {
+    credentials,
+    loadBalancing: (configurationMethod === ConfigurationMethodEnum.predefinedModel
+      ? predefinedFormSchemasValue
+      : customFormSchemasValue
+    )?.load_balancing,
+    mutate,
+  }
+  // as ([Record<string, string | boolean | undefined> | undefined, ModelLoadBalancingConfig | undefined])
+}
+
+export const useModelList = (type: ModelTypeEnum) => {
+  const { data, mutate, isLoading } = useSWR(`/workspaces/current/models/model-types/${type}`, fetchModelList)
+
+  return {
+    data: data?.data || [],
+    mutate,
+    isLoading,
+  }
+}
+
+export const useDefaultModel = (type: ModelTypeEnum) => {
+  const { data, mutate, isLoading } = useSWR(`/workspaces/current/default-model?model_type=${type}`, fetchDefaultModal)
+
+  return {
+    data: data?.data,
+    mutate,
+    isLoading,
+  }
+}
+
+export const useCurrentProviderAndModel = (modelList: Model[], defaultModel?: DefaultModel) => {
+  const currentProvider = modelList.find(provider => provider.provider === defaultModel?.provider)
+  const currentModel = currentProvider?.models.find(model => model.model === defaultModel?.model)
+
+  return {
+    currentProvider,
+    currentModel,
+  }
+}
+
+export const useTextGenerationCurrentProviderAndModelAndModelList = (defaultModel?: DefaultModel) => {
+  const { textGenerationModelList } = useProviderContext()
+  const activeTextGenerationModelList = textGenerationModelList.filter(model => model.status === ModelStatusEnum.active)
+  const {
+    currentProvider,
+    currentModel,
+  } = useCurrentProviderAndModel(textGenerationModelList, defaultModel)
+
+  return {
+    currentProvider,
+    currentModel,
+    textGenerationModelList,
+    activeTextGenerationModelList,
+  }
+}
+
+export const useModelListAndDefaultModel = (type: ModelTypeEnum) => {
+  const { data: modelList } = useModelList(type)
+  const { data: defaultModel } = useDefaultModel(type)
+
+  return {
+    modelList,
+    defaultModel,
+  }
+}
+
+export const useModelListAndDefaultModelAndCurrentProviderAndModel = (type: ModelTypeEnum) => {
+  const { modelList, defaultModel } = useModelListAndDefaultModel(type)
+  const { currentProvider, currentModel } = useCurrentProviderAndModel(
+    modelList,
+    { provider: defaultModel?.provider.provider || '', model: defaultModel?.model || '' },
+  )
+
+  return {
+    modelList,
+    defaultModel,
+    currentProvider,
+    currentModel,
+  }
+}
+
+export const useUpdateModelList = () => {
+  const { mutate } = useSWRConfig()
+
+  const updateModelList = useCallback((type: ModelTypeEnum) => {
+    mutate(`/workspaces/current/models/model-types/${type}`)
+  }, [mutate])
+
+  return updateModelList
+}
+
+export const useAnthropicBuyQuota = () => {
+  const [loading, setLoading] = useState(false)
+
+  const handleGetPayUrl = async () => {
+    if (loading)
+      return
+
+    setLoading(true)
+    try {
+      const res = await getPayUrl('/workspaces/current/model-providers/anthropic/checkout-url')
+
+      window.location.href = res.url
+    }
+    finally {
+      setLoading(false)
+    }
+  }
+
+  return handleGetPayUrl
+}
+
+export const useModelProviders = () => {
+  const { data: providersData, mutate, isLoading } = useSWR('/workspaces/current/model-providers', fetchModelProviders)
+
+  return {
+    data: providersData?.data || [],
+    mutate,
+    isLoading,
+  }
+}
+
+export const useUpdateModelProviders = () => {
+  const { mutate } = useSWRConfig()
+
+  const updateModelProviders = useCallback(() => {
+    mutate('/workspaces/current/model-providers')
+  }, [mutate])
+
+  return updateModelProviders
+}
+
+export const useMarketplaceAllPlugins = (providers: ModelProvider[], searchText: string) => {
+  const exclude = useMemo(() => {
+    return providers.map(provider => provider.provider.replace(/(.+)\/([^/]+)$/, '$1'))
+  }, [providers])
+  const [collectionPlugins, setCollectionPlugins] = useState<Plugin[]>([])
+
+  const {
+    plugins,
+    queryPlugins,
+    queryPluginsWithDebounced,
+    isLoading,
+  } = useMarketplacePlugins()
+
+  const getCollectionPlugins = useCallback(async () => {
+    const collectionPlugins = await getMarketplacePluginsByCollectionId('__model-settings-pinned-models')
+
+    setCollectionPlugins(collectionPlugins)
+  }, [])
+
+  useEffect(() => {
+    getCollectionPlugins()
+  }, [getCollectionPlugins])
+
+  useEffect(() => {
+    if (searchText) {
+      queryPluginsWithDebounced({
+        query: searchText,
+        category: PluginType.model,
+        exclude,
+        type: 'plugin',
+        sortBy: 'install_count',
+        sortOrder: 'DESC',
+      })
+    }
+    else {
+      queryPlugins({
+        query: '',
+        category: PluginType.model,
+        type: 'plugin',
+        pageSize: 1000,
+        exclude,
+        sortBy: 'install_count',
+        sortOrder: 'DESC',
+      })
+    }
+  }, [queryPlugins, queryPluginsWithDebounced, searchText, exclude])
+
+  const allPlugins = useMemo(() => {
+    const allPlugins = [...collectionPlugins.filter(plugin => !exclude.includes(plugin.plugin_id))]
+
+    if (plugins?.length) {
+      for (let i = 0; i < plugins.length; i++) {
+        const plugin = plugins[i]
+
+        if (plugin.type !== 'bundle' && !allPlugins.find(p => p.plugin_id === plugin.plugin_id))
+          allPlugins.push(plugin)
+      }
+    }
+
+    return allPlugins
+  }, [plugins, collectionPlugins, exclude])
+
+  return {
+    plugins: allPlugins,
+    isLoading,
+  }
+}
+
+export const useModelModalHandler = () => {
+  const setShowModelModal = useModalContextSelector(state => state.setShowModelModal)
+  const updateModelProviders = useUpdateModelProviders()
+  const updateModelList = useUpdateModelList()
+  const { eventEmitter } = useEventEmitterContextContext()
+
+  return (
+    provider: ModelProvider,
+    configurationMethod: ConfigurationMethodEnum,
+    CustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields,
+  ) => {
+    setShowModelModal({
+      payload: {
+        currentProvider: provider,
+        currentConfigurationMethod: configurationMethod,
+        currentCustomConfigurationModelFixedFields: CustomConfigurationModelFixedFields,
+      },
+      onSaveCallback: () => {
+        updateModelProviders()
+
+        provider.supported_model_types.forEach((type) => {
+          updateModelList(type)
+        })
+
+        if (configurationMethod === ConfigurationMethodEnum.customizableModel
+            && provider.custom_configuration.status === CustomConfigurationStatusEnum.active) {
+          eventEmitter?.emit({
+            type: UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST,
+            payload: provider.provider,
+          } as any)
+
+          if (CustomConfigurationModelFixedFields?.__model_type)
+            updateModelList(CustomConfigurationModelFixedFields.__model_type)
+        }
+      },
+    })
+  }
+}
diff --git a/app/components/header/account-setting/model-provider-page/index.tsx b/app/components/header/account-setting/model-provider-page/index.tsx
new file mode 100644
index 0000000..7c4e2ea
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/index.tsx
@@ -0,0 +1,161 @@
+import { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useDebounce } from 'ahooks'
+import {
+  RiAlertFill,
+  RiBrainLine,
+} from '@remixicon/react'
+import SystemModelSelector from './system-model-selector'
+import ProviderAddedCard from './provider-added-card'
+import type {
+  ConfigurationMethodEnum,
+  CustomConfigurationModelFixedFields,
+  ModelProvider,
+} from './declarations'
+import {
+  CustomConfigurationStatusEnum,
+  ModelTypeEnum,
+} from './declarations'
+import {
+  useDefaultModel,
+  useModelModalHandler,
+} from './hooks'
+import InstallFromMarketplace from './install-from-marketplace'
+import { useProviderContext } from '@/context/provider-context'
+import cn from '@/utils/classnames'
+import { useSelector as useAppContextSelector } from '@/context/app-context'
+
+type Props = {
+  searchText: string
+}
+
+const FixedModelProvider = ['langgenius/openai/openai', 'langgenius/anthropic/anthropic']
+
+const ModelProviderPage = ({ searchText }: Props) => {
+  const debouncedSearchText = useDebounce(searchText, { wait: 500 })
+  const { t } = useTranslation()
+  const { data: textGenerationDefaultModel } = useDefaultModel(ModelTypeEnum.textGeneration)
+  const { data: embeddingsDefaultModel } = useDefaultModel(ModelTypeEnum.textEmbedding)
+  const { data: rerankDefaultModel } = useDefaultModel(ModelTypeEnum.rerank)
+  const { data: speech2textDefaultModel } = useDefaultModel(ModelTypeEnum.speech2text)
+  const { data: ttsDefaultModel } = useDefaultModel(ModelTypeEnum.tts)
+  const { modelProviders: providers } = useProviderContext()
+  const { enable_marketplace } = useAppContextSelector(s => s.systemFeatures)
+  const defaultModelNotConfigured = !textGenerationDefaultModel && !embeddingsDefaultModel && !speech2textDefaultModel && !rerankDefaultModel && !ttsDefaultModel
+  const [configuredProviders, notConfiguredProviders] = useMemo(() => {
+    const configuredProviders: ModelProvider[] = []
+    const notConfiguredProviders: ModelProvider[] = []
+
+    providers.forEach((provider) => {
+      if (
+        provider.custom_configuration.status === CustomConfigurationStatusEnum.active
+        || (
+          provider.system_configuration.enabled === true
+          && provider.system_configuration.quota_configurations.find(item => item.quota_type === provider.system_configuration.current_quota_type)
+        )
+      )
+        configuredProviders.push(provider)
+      else
+        notConfiguredProviders.push(provider)
+    })
+
+    configuredProviders.sort((a, b) => {
+      if (FixedModelProvider.includes(a.provider) && FixedModelProvider.includes(b.provider))
+        return FixedModelProvider.indexOf(a.provider) - FixedModelProvider.indexOf(b.provider) > 0 ? 1 : -1
+      else if (FixedModelProvider.includes(a.provider))
+        return -1
+      else if (FixedModelProvider.includes(b.provider))
+        return 1
+      return 0
+    })
+
+    return [configuredProviders, notConfiguredProviders]
+  }, [providers])
+  const [filteredConfiguredProviders, filteredNotConfiguredProviders] = useMemo(() => {
+    const filteredConfiguredProviders = configuredProviders.filter(
+      provider => provider.provider.toLowerCase().includes(debouncedSearchText.toLowerCase())
+        || Object.values(provider.label).some(text => text.toLowerCase().includes(debouncedSearchText.toLowerCase())),
+    )
+    const filteredNotConfiguredProviders = notConfiguredProviders.filter(
+      provider => provider.provider.toLowerCase().includes(debouncedSearchText.toLowerCase())
+        || Object.values(provider.label).some(text => text.toLowerCase().includes(debouncedSearchText.toLowerCase())),
+    )
+
+    return [filteredConfiguredProviders, filteredNotConfiguredProviders]
+  }, [configuredProviders, debouncedSearchText, notConfiguredProviders])
+
+  const handleOpenModal = useModelModalHandler()
+
+  return (
+    <div className='relative -mt-2 pt-1'>
+      <div className={cn('mb-2 flex items-center')}>
+        <div className='system-md-semibold grow text-text-primary'>{t('common.modelProvider.models')}</div>
+        <div className={cn(
+          'relative flex shrink-0 items-center justify-end gap-2 rounded-lg border border-transparent p-px',
+          defaultModelNotConfigured && 'border-components-panel-border bg-components-panel-bg-blur pl-2 shadow-xs',
+        )}>
+          {defaultModelNotConfigured && <div className='absolute bottom-0 left-0 right-0 top-0 opacity-40' style={{ background: 'linear-gradient(92deg, rgba(247, 144, 9, 0.25) 0%, rgba(255, 255, 255, 0.00) 100%)' }} />}
+          {defaultModelNotConfigured && (
+            <div className='system-xs-medium flex items-center gap-1 text-text-primary'>
+              <RiAlertFill className='h-4 w-4 text-text-warning-secondary' />
+              {t('common.modelProvider.notConfigured')}
+            </div>
+          )}
+          <SystemModelSelector
+            notConfigured={defaultModelNotConfigured}
+            textGenerationDefaultModel={textGenerationDefaultModel}
+            embeddingsDefaultModel={embeddingsDefaultModel}
+            rerankDefaultModel={rerankDefaultModel}
+            speech2textDefaultModel={speech2textDefaultModel}
+            ttsDefaultModel={ttsDefaultModel}
+          />
+        </div>
+      </div>
+      {!filteredConfiguredProviders?.length && (
+        <div className='mb-2 rounded-[10px] bg-workflow-process-bg p-4'>
+          <div className='flex h-10 w-10 items-center justify-center rounded-[10px] border-[0.5px] border-components-card-border bg-components-card-bg shadow-lg backdrop-blur'>
+            <RiBrainLine className='h-5 w-5 text-text-primary' />
+          </div>
+          <div className='system-sm-medium mt-2 text-text-secondary'>{t('common.modelProvider.emptyProviderTitle')}</div>
+          <div className='system-xs-regular mt-1 text-text-tertiary'>{t('common.modelProvider.emptyProviderTip')}</div>
+        </div>
+      )}
+      {!!filteredConfiguredProviders?.length && (
+        <div className='relative'>
+          {filteredConfiguredProviders?.map(provider => (
+            <ProviderAddedCard
+              key={provider.provider}
+              provider={provider}
+              onOpenModal={(configurationMethod: ConfigurationMethodEnum, currentCustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields) => handleOpenModal(provider, configurationMethod, currentCustomConfigurationModelFixedFields)}
+            />
+          ))}
+        </div>
+      )}
+      {!!filteredNotConfiguredProviders?.length && (
+        <>
+          <div className='system-md-semibold mb-2 flex items-center pt-2 text-text-primary'>{t('common.modelProvider.toBeConfigured')}</div>
+          <div className='relative'>
+            {filteredNotConfiguredProviders?.map(provider => (
+              <ProviderAddedCard
+                notConfigured
+                key={provider.provider}
+                provider={provider}
+                onOpenModal={(configurationMethod: ConfigurationMethodEnum, currentCustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields) => handleOpenModal(provider, configurationMethod, currentCustomConfigurationModelFixedFields)}
+              />
+            ))}
+          </div>
+        </>
+      )}
+      {
+        enable_marketplace && (
+          <InstallFromMarketplace
+            providers={providers}
+            searchText={searchText}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default ModelProviderPage
diff --git a/app/components/header/account-setting/model-provider-page/install-from-marketplace.tsx b/app/components/header/account-setting/model-provider-page/install-from-marketplace.tsx
new file mode 100644
index 0000000..818007a
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/install-from-marketplace.tsx
@@ -0,0 +1,83 @@
+import { useCallback, useState } from 'react'
+import { useTheme } from 'next-themes'
+import { useTranslation } from 'react-i18next'
+import Link from 'next/link'
+import {
+  RiArrowDownSLine,
+  RiArrowRightUpLine,
+} from '@remixicon/react'
+import type {
+  ModelProvider,
+} from './declarations'
+import {
+  useMarketplaceAllPlugins,
+} from './hooks'
+import Divider from '@/app/components/base/divider'
+import Loading from '@/app/components/base/loading'
+import ProviderCard from '@/app/components/plugins/provider-card'
+import List from '@/app/components/plugins/marketplace/list'
+import type { Plugin } from '@/app/components/plugins/types'
+import { MARKETPLACE_URL_PREFIX } from '@/config'
+import cn from '@/utils/classnames'
+import { getLocaleOnClient } from '@/i18n'
+
+type InstallFromMarketplaceProps = {
+  providers: ModelProvider[]
+  searchText: string
+}
+const InstallFromMarketplace = ({
+  providers,
+  searchText,
+}: InstallFromMarketplaceProps) => {
+  const { t } = useTranslation()
+  const { theme } = useTheme()
+  const [collapse, setCollapse] = useState(false)
+  const locale = getLocaleOnClient()
+  const {
+    plugins: allPlugins,
+    isLoading: isAllPluginsLoading,
+  } = useMarketplaceAllPlugins(providers, searchText)
+
+  const cardRender = useCallback((plugin: Plugin) => {
+    if (plugin.type === 'bundle')
+      return null
+
+    return <ProviderCard key={plugin.plugin_id} payload={plugin} />
+  }, [])
+
+  return (
+    <div className='mb-2'>
+      <Divider className='!mt-4 h-px' />
+      <div className='flex items-center justify-between'>
+        <div className='system-md-semibold flex cursor-pointer items-center gap-1 text-text-primary' onClick={() => setCollapse(!collapse)}>
+          <RiArrowDownSLine className={cn('h-4 w-4', collapse && '-rotate-90')} />
+          {t('common.modelProvider.installProvider')}
+        </div>
+        <div className='mb-2 flex items-center pt-2'>
+          <span className='system-sm-regular pr-1 text-text-tertiary'>{t('common.modelProvider.discoverMore')}</span>
+          <Link target="_blank" href={`${MARKETPLACE_URL_PREFIX}${theme ? `?theme=${theme}` : ''}`} className='system-sm-medium inline-flex items-center text-text-accent'>
+            {t('plugin.marketplace.difyMarketplace')}
+            <RiArrowRightUpLine className='h-4 w-4' />
+          </Link>
+        </div>
+      </div>
+      {!collapse && isAllPluginsLoading && <Loading type='area' />}
+      {
+        !isAllPluginsLoading && !collapse && (
+          <List
+            marketplaceCollections={[]}
+            marketplaceCollectionPluginsMap={{}}
+            plugins={allPlugins}
+            showInstallButton
+            locale={locale}
+            cardContainerClassName='grid grid-cols-2 gap-2'
+            cardRender={cardRender}
+            emptyClassName='h-auto'
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default InstallFromMarketplace
diff --git a/app/components/header/account-setting/model-provider-page/model-badge/index.tsx b/app/components/header/account-setting/model-provider-page/model-badge/index.tsx
new file mode 100644
index 0000000..d272e96
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-badge/index.tsx
@@ -0,0 +1,22 @@
+import type { FC, ReactNode } from 'react'
+import classNames from '@/utils/classnames'
+
+type ModelBadgeProps = {
+  className?: string
+  children?: ReactNode
+}
+const ModelBadge: FC<ModelBadgeProps> = ({
+  className,
+  children,
+}) => {
+  return (
+    <div className={classNames(
+      'flex items-center px-1 h-[18px] rounded-[5px] border border-divider-deep system-2xs-medium-uppercase text-text-tertiary cursor-default',
+      className,
+    )}>
+      {children}
+    </div>
+  )
+}
+
+export default ModelBadge
diff --git a/app/components/header/account-setting/model-provider-page/model-icon/index.tsx b/app/components/header/account-setting/model-provider-page/model-icon/index.tsx
new file mode 100644
index 0000000..d302def
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-icon/index.tsx
@@ -0,0 +1,50 @@
+import type { FC } from 'react'
+import type {
+  Model,
+  ModelProvider,
+} from '../declarations'
+import { useLanguage } from '../hooks'
+import { Group } from '@/app/components/base/icons/src/vender/other'
+import { OpenaiBlue, OpenaiViolet } from '@/app/components/base/icons/src/public/llm'
+import cn from '@/utils/classnames'
+import { renderI18nObject } from '@/i18n'
+
+type ModelIconProps = {
+  provider?: Model | ModelProvider
+  modelName?: string
+  className?: string
+  isDeprecated?: boolean
+}
+const ModelIcon: FC<ModelIconProps> = ({
+  provider,
+  className,
+  modelName,
+  isDeprecated = false,
+}) => {
+  const language = useLanguage()
+  if (provider?.provider && ['openai', 'langgenius/openai/openai'].includes(provider.provider) && modelName?.includes('gpt-4o'))
+    return <div className='flex items-center justify-center'><OpenaiBlue className={cn('h-5 w-5', className)} /></div>
+  if (provider?.provider && ['openai', 'langgenius/openai/openai'].includes(provider.provider) && modelName?.startsWith('gpt-4'))
+    return <div className='flex items-center justify-center'><OpenaiViolet className={cn('h-5 w-5', className)} /></div>
+
+  if (provider?.icon_small) {
+    return (
+      <div className={cn('flex h-5 w-5 items-center justify-center', isDeprecated && 'opacity-50', className)}>
+        <img alt='model-icon' src={renderI18nObject(provider.icon_small, language)}/>
+      </div>
+    )
+  }
+
+  return (
+    <div className={cn(
+      'flex h-5 w-5 items-center justify-center rounded-md border-[0.5px] border-components-panel-border-subtle bg-background-default-subtle',
+      className,
+    )}>
+      <div className='flex h-5 w-5 items-center justify-center opacity-35'>
+        <Group className='h-3 w-3 text-text-tertiary' />
+      </div>
+    </div>
+  )
+}
+
+export default ModelIcon
diff --git a/app/components/header/account-setting/model-provider-page/model-modal/Form.tsx b/app/components/header/account-setting/model-provider-page/model-modal/Form.tsx
new file mode 100644
index 0000000..c5af4ed
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-modal/Form.tsx
@@ -0,0 +1,424 @@
+import { useCallback, useState } from 'react'
+import type { ReactNode } from 'react'
+import { ValidatingTip } from '../../key-validator/ValidateStatus'
+import type {
+  CredentialFormSchema,
+  CredentialFormSchemaNumberInput,
+  CredentialFormSchemaRadio,
+  CredentialFormSchemaSecretInput,
+  CredentialFormSchemaSelect,
+  CredentialFormSchemaTextInput,
+  FormValue,
+} from '../declarations'
+import { FormTypeEnum } from '../declarations'
+import { useLanguage } from '../hooks'
+import Input from './Input'
+import cn from '@/utils/classnames'
+import { SimpleSelect } from '@/app/components/base/select'
+import Tooltip from '@/app/components/base/tooltip'
+import Radio from '@/app/components/base/radio'
+import ModelParameterModal from '@/app/components/plugins/plugin-detail-panel/model-selector'
+import ToolSelector from '@/app/components/plugins/plugin-detail-panel/tool-selector'
+import MultipleToolSelector from '@/app/components/plugins/plugin-detail-panel/multiple-tool-selector'
+import AppSelector from '@/app/components/plugins/plugin-detail-panel/app-selector'
+import RadioE from '@/app/components/base/radio/ui'
+import type {
+  NodeOutPutVar,
+} from '@/app/components/workflow/types'
+import type { Node } from 'reactflow'
+
+type FormProps<
+  CustomFormSchema extends Omit<CredentialFormSchema, 'type'> & { type: string } = never,
+> = {
+  className?: string
+  itemClassName?: string
+  fieldLabelClassName?: string
+  value: FormValue
+  onChange: (val: FormValue) => void
+  formSchemas: Array<CredentialFormSchema | CustomFormSchema>
+  validating: boolean
+  validatedSuccess?: boolean
+  showOnVariableMap: Record<string, string[]>
+  isEditMode: boolean
+  isAgentStrategy?: boolean
+  readonly?: boolean
+  inputClassName?: string
+  isShowDefaultValue?: boolean
+  fieldMoreInfo?: (payload: CredentialFormSchema | CustomFormSchema) => ReactNode
+  customRenderField?: (
+    formSchema: CustomFormSchema,
+    props: Omit<FormProps<CustomFormSchema>, 'override' | 'customRenderField'>
+  ) => ReactNode
+  // If return falsy value, this field will fallback to default render
+  override?: [Array<FormTypeEnum>, (formSchema: CredentialFormSchema, props: Omit<FormProps<CustomFormSchema>, 'override' | 'customRenderField'>) => ReactNode]
+  nodeId?: string
+  nodeOutputVars?: NodeOutPutVar[],
+  availableNodes?: Node[],
+}
+
+function Form<
+  CustomFormSchema extends Omit<CredentialFormSchema, 'type'> & { type: string } = never,
+>({
+  className,
+  itemClassName,
+  fieldLabelClassName,
+  value,
+  onChange,
+  formSchemas,
+  validating,
+  validatedSuccess,
+  showOnVariableMap,
+  isEditMode,
+  isAgentStrategy = false,
+  readonly,
+  inputClassName,
+  isShowDefaultValue = false,
+  fieldMoreInfo,
+  customRenderField,
+  override,
+  nodeId,
+  nodeOutputVars,
+  availableNodes,
+}: FormProps<CustomFormSchema>) {
+  const language = useLanguage()
+  const [changeKey, setChangeKey] = useState('')
+  const filteredProps: Omit<FormProps<CustomFormSchema>, 'override' | 'customRenderField'> = {
+    className,
+    itemClassName,
+    fieldLabelClassName,
+    value,
+    onChange,
+    formSchemas,
+    validating,
+    validatedSuccess,
+    showOnVariableMap,
+    isEditMode,
+    readonly,
+    inputClassName,
+    isShowDefaultValue,
+    fieldMoreInfo,
+  }
+
+  const handleFormChange = (key: string, val: string | boolean) => {
+    if (isEditMode && (key === '__model_type' || key === '__model_name'))
+      return
+
+    setChangeKey(key)
+    const shouldClearVariable: Record<string, string | undefined> = {}
+    if (showOnVariableMap[key]?.length) {
+      showOnVariableMap[key].forEach((clearVariable) => {
+        const schema = formSchemas.find(it => it.variable === clearVariable)
+        shouldClearVariable[clearVariable] = schema ? schema.default : undefined
+      })
+    }
+    onChange({ ...value, [key]: val, ...shouldClearVariable })
+  }
+
+  const handleModelChanged = useCallback((key: string, model: any) => {
+    const newValue = {
+      ...value[key],
+      ...model,
+      type: FormTypeEnum.modelSelector,
+    }
+    onChange({ ...value, [key]: newValue })
+  }, [onChange, value])
+
+  const renderField = (formSchema: CredentialFormSchema | CustomFormSchema) => {
+    const tooltip = formSchema.tooltip
+    const tooltipContent = (tooltip && (
+      <Tooltip
+        popupContent={<div className='w-[200px]'>
+          {tooltip[language] || tooltip.en_US}
+        </div>}
+        triggerClassName='ml-1 w-4 h-4'
+        asChild={false} />
+    ))
+    if (override) {
+      const [overrideTypes, overrideRender] = override
+      if (overrideTypes.includes(formSchema.type as FormTypeEnum)) {
+        const node = overrideRender(formSchema as CredentialFormSchema, filteredProps)
+        if (node)
+          return node
+      }
+    }
+
+    if (formSchema.type === FormTypeEnum.textInput || formSchema.type === FormTypeEnum.secretInput || formSchema.type === FormTypeEnum.textNumber) {
+      const {
+        variable, label, placeholder, required, show_on,
+      } = formSchema as (CredentialFormSchemaTextInput | CredentialFormSchemaSecretInput)
+
+      if (show_on.length && !show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value))
+        return null
+
+      const disabled = readonly || (isEditMode && (variable === '__model_type' || variable === '__model_name'))
+      return (
+        <div key={variable} className={cn(itemClassName, 'py-3')}>
+          <div className={cn(fieldLabelClassName, 'system-sm-semibold flex items-center py-2 text-text-secondary')}>
+            {label[language] || label.en_US}
+            {required && (
+              <span className='ml-1 text-red-500'>*</span>
+            )}
+            {tooltipContent}
+          </div>
+          <Input
+            className={cn(inputClassName, `${disabled && 'cursor-not-allowed opacity-60'}`)}
+            value={(isShowDefaultValue && ((value[variable] as string) === '' || value[variable] === undefined || value[variable] === null)) ? formSchema.default : value[variable]}
+            onChange={val => handleFormChange(variable, val)}
+            validated={validatedSuccess}
+            placeholder={placeholder?.[language] || placeholder?.en_US}
+            disabled={disabled}
+            type={formSchema.type === FormTypeEnum.secretInput ? 'password'
+              : formSchema.type === FormTypeEnum.textNumber ? 'number'
+                : 'text'}
+            {...(formSchema.type === FormTypeEnum.textNumber ? { min: (formSchema as CredentialFormSchemaNumberInput).min, max: (formSchema as CredentialFormSchemaNumberInput).max } : {})} />
+          {fieldMoreInfo?.(formSchema)}
+          {validating && changeKey === variable && <ValidatingTip />}
+        </div>
+      )
+    }
+
+    if (formSchema.type === FormTypeEnum.radio) {
+      const {
+        options, variable, label, show_on, required,
+      } = formSchema as CredentialFormSchemaRadio
+
+      if (show_on.length && !show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value))
+        return null
+
+      const disabled = isEditMode && (variable === '__model_type' || variable === '__model_name')
+
+      return (
+        <div key={variable} className={cn(itemClassName, 'py-3')}>
+          <div className={cn(fieldLabelClassName, 'system-sm-semibold flex items-center py-2 text-text-secondary')}>
+            {label[language] || label.en_US}
+            {required && (
+              <span className='ml-1 text-red-500'>*</span>
+            )}
+            {tooltipContent}
+          </div>
+          <div className={cn('grid gap-3', `grid-cols-${options?.length}`)}>
+            {options.filter((option) => {
+              if (option.show_on.length)
+                return option.show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value)
+
+              return true
+            }).map(option => (
+              <div
+                className={`
+                    flex cursor-pointer items-center gap-2 rounded-lg border border-components-option-card-option-border bg-components-option-card-option-bg px-3 py-2
+                    ${value[variable] === option.value && 'border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg shadow-sm'}
+                    ${disabled && '!cursor-not-allowed opacity-60'}
+                  `}
+                onClick={() => handleFormChange(variable, option.value)}
+                key={`${variable}-${option.value}`}
+              >
+                <RadioE isChecked={value[variable] === option.value} />
+
+                <div className='system-sm-regular text-text-secondary'>{option.label[language] || option.label.en_US}</div>
+              </div>
+            ))}
+          </div>
+          {fieldMoreInfo?.(formSchema)}
+          {validating && changeKey === variable && <ValidatingTip />}
+        </div>
+      )
+    }
+
+    if (formSchema.type === FormTypeEnum.select) {
+      const {
+        options, variable, label, show_on, required, placeholder,
+      } = formSchema as CredentialFormSchemaSelect
+
+      if (show_on.length && !show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value))
+        return null
+
+      return (
+        <div key={variable} className={cn(itemClassName, 'py-3')}>
+          <div className={cn(fieldLabelClassName, 'system-sm-semibold flex items-center py-2 text-text-secondary')}>
+            {label[language] || label.en_US}
+
+            {required && (
+              <span className='ml-1 text-red-500'>*</span>
+            )}
+            {tooltipContent}
+          </div>
+          <SimpleSelect
+            wrapperClassName='h-8'
+            className={cn(inputClassName)}
+            disabled={readonly}
+            defaultValue={(isShowDefaultValue && ((value[variable] as string) === '' || value[variable] === undefined || value[variable] === null)) ? formSchema.default : value[variable]}
+            items={options.filter((option) => {
+              if (option.show_on.length)
+                return option.show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value)
+
+              return true
+            }).map(option => ({ value: option.value, name: option.label[language] || option.label.en_US }))}
+            onSelect={item => handleFormChange(variable, item.value as string)}
+            placeholder={placeholder?.[language] || placeholder?.en_US} />
+          {fieldMoreInfo?.(formSchema)}
+          {validating && changeKey === variable && <ValidatingTip />}
+        </div>
+      )
+    }
+
+    if (formSchema.type === FormTypeEnum.boolean) {
+      const {
+        variable, label, show_on, required,
+      } = formSchema as CredentialFormSchemaRadio
+
+      if (show_on.length && !show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value))
+        return null
+
+      return (
+        <div key={variable} className={cn(itemClassName, 'py-3')}>
+          <div className='system-sm-semibold flex items-center justify-between py-2 text-text-secondary'>
+            <div className='flex items-center space-x-2'>
+              <span className={cn(fieldLabelClassName, 'system-sm-regular flex items-center py-2 text-text-secondary')}>{label[language] || label.en_US}</span>
+              {required && (
+                <span className='ml-1 text-red-500'>*</span>
+              )}
+              {tooltipContent}
+            </div>
+            <Radio.Group
+              className='flex items-center'
+              value={value[variable] === null ? undefined : (value[variable] ? 1 : 0)}
+              onChange={val => handleFormChange(variable, val === 1)}
+            >
+              <Radio value={1} className='!mr-1'>True</Radio>
+              <Radio value={0}>False</Radio>
+            </Radio.Group>
+          </div>
+          {fieldMoreInfo?.(formSchema)}
+        </div>
+      )
+    }
+
+    if (formSchema.type === FormTypeEnum.modelSelector) {
+      const {
+        variable, label, required, scope,
+      } = formSchema as (CredentialFormSchemaTextInput | CredentialFormSchemaSecretInput)
+      return (
+        <div key={variable} className={cn(itemClassName, 'py-3')}>
+          <div className={cn(fieldLabelClassName, 'system-sm-semibold flex items-center py-2 text-text-secondary')}>
+            {label[language] || label.en_US}
+            {required && (
+              <span className='ml-1 text-red-500'>*</span>
+            )}
+            {tooltipContent}
+          </div>
+          <ModelParameterModal
+            popupClassName='!w-[387px]'
+            isAdvancedMode
+            isInWorkflow
+            isAgentStrategy={isAgentStrategy}
+            value={value[variable]}
+            setModel={model => handleModelChanged(variable, model)}
+            readonly={readonly}
+            scope={scope} />
+          {fieldMoreInfo?.(formSchema)}
+          {validating && changeKey === variable && <ValidatingTip />}
+        </div>
+      )
+    }
+
+    if (formSchema.type === FormTypeEnum.toolSelector) {
+      const {
+        variable,
+        label,
+        required,
+        scope,
+      } = formSchema as (CredentialFormSchemaTextInput | CredentialFormSchemaSecretInput)
+      return (
+        <div key={variable} className={cn(itemClassName, 'py-3')}>
+          <div className={cn(fieldLabelClassName, 'system-sm-semibold flex items-center py-2 text-text-secondary')}>
+            {label[language] || label.en_US}
+            {required && (
+              <span className='ml-1 text-red-500'>*</span>
+            )}
+            {tooltipContent}
+          </div>
+          <ToolSelector
+            scope={scope}
+            nodeId={nodeId}
+            nodeOutputVars={nodeOutputVars || []}
+            availableNodes={availableNodes || []}
+            disabled={readonly}
+            value={value[variable]}
+            // selectedTools={value[variable] ? [value[variable]] : []}
+            onSelect={item => handleFormChange(variable, item as any)}
+            onDelete={() => handleFormChange(variable, null as any)}
+          />
+          {fieldMoreInfo?.(formSchema)}
+          {validating && changeKey === variable && <ValidatingTip />}
+        </div>
+      )
+    }
+
+    if (formSchema.type === FormTypeEnum.multiToolSelector) {
+      const {
+        variable,
+        label,
+        tooltip,
+        required,
+        scope,
+      } = formSchema as (CredentialFormSchemaTextInput | CredentialFormSchemaSecretInput)
+
+      return (
+        <div key={variable} className={cn(itemClassName, 'py-3')}>
+          <MultipleToolSelector
+            disabled={readonly}
+            nodeId={nodeId}
+            nodeOutputVars={nodeOutputVars || []}
+            availableNodes={availableNodes || []}
+            scope={scope}
+            label={label[language] || label.en_US}
+            required={required}
+            tooltip={tooltip?.[language] || tooltip?.en_US}
+            value={value[variable] || []}
+            onChange={item => handleFormChange(variable, item as any)}
+            supportCollapse
+          />
+          {fieldMoreInfo?.(formSchema)}
+          {validating && changeKey === variable && <ValidatingTip />}
+        </div>
+      )
+    }
+
+    if (formSchema.type === FormTypeEnum.appSelector) {
+      const {
+        variable, label, required, scope,
+      } = formSchema as (CredentialFormSchemaTextInput | CredentialFormSchemaSecretInput)
+
+      return (
+        <div key={variable} className={cn(itemClassName, 'py-3')}>
+          <div className={cn(fieldLabelClassName, 'system-sm-semibold flex items-center py-2 text-text-secondary')}>
+            {label[language] || label.en_US}
+            {required && (
+              <span className='ml-1 text-red-500'>*</span>
+            )}
+            {tooltipContent}
+          </div>
+          <AppSelector
+            disabled={readonly}
+            scope={scope}
+            value={value[variable]}
+            onSelect={item => handleFormChange(variable, { ...item, type: FormTypeEnum.appSelector } as any)} />
+          {fieldMoreInfo?.(formSchema)}
+          {validating && changeKey === variable && <ValidatingTip />}
+        </div>
+      )
+    }
+
+    // @ts-expect-error it work
+    if (!Object.values(FormTypeEnum).includes(formSchema.type))
+      return customRenderField?.(formSchema as CustomFormSchema, filteredProps)
+  }
+
+  return (
+    <div className={className}>
+      {formSchemas.map(formSchema => renderField(formSchema))}
+    </div>
+  )
+}
+
+export default Form
diff --git a/app/components/header/account-setting/model-provider-page/model-modal/Input.tsx b/app/components/header/account-setting/model-provider-page/model-modal/Input.tsx
new file mode 100644
index 0000000..a19e330
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-modal/Input.tsx
@@ -0,0 +1,74 @@
+import type { FC } from 'react'
+import { CheckCircle } from '@/app/components/base/icons/src/vender/solid/general'
+
+type InputProps = {
+  value?: string
+  onChange: (v: string) => void
+  onFocus?: () => void
+  placeholder?: string
+  validated?: boolean
+  className?: string
+  disabled?: boolean
+  type?: string
+  min?: number
+  max?: number
+}
+const Input: FC<InputProps> = ({
+  value,
+  onChange,
+  onFocus,
+  placeholder,
+  validated,
+  className,
+  disabled,
+  type = 'text',
+  min,
+  max,
+}) => {
+  const toLimit = (v: string) => {
+    const minNum = Number.parseFloat(`${min}`)
+    const maxNum = Number.parseFloat(`${max}`)
+    if (!isNaN(minNum) && Number.parseFloat(v) < minNum) {
+      onChange(`${min}`)
+      return
+    }
+
+    if (!isNaN(maxNum) && Number.parseFloat(v) > maxNum)
+      onChange(`${max}`)
+  }
+  return (
+    <div className='relative'>
+      <input
+        autoComplete="new-password"
+        tabIndex={0}
+        className={`
+          block h-8 w-full appearance-none rounded-lg border border-transparent bg-components-input-bg-normal px-3 text-sm
+          text-components-input-text-filled caret-primary-600 outline-none
+          placeholder:text-sm placeholder:text-text-tertiary
+          hover:border-components-input-border-hover hover:bg-components-input-bg-hover focus:border-components-input-border-active
+          focus:bg-components-input-bg-active focus:shadow-xs
+          ${validated && 'pr-[30px]'}
+          ${className}
+        `}
+        placeholder={placeholder || ''}
+        onChange={e => onChange(e.target.value)}
+        onBlur={e => toLimit(e.target.value)}
+        onFocus={onFocus}
+        value={value}
+        disabled={disabled}
+        type={type}
+        min={min}
+        max={max}
+      />
+      {
+        validated && (
+          <div className='absolute right-2.5 top-2.5'>
+            <CheckCircle className='h-4 w-4 text-[#039855]' />
+          </div>
+        )
+      }
+    </div>
+  )
+}
+
+export default Input
diff --git a/app/components/header/account-setting/model-provider-page/model-modal/index.tsx b/app/components/header/account-setting/model-provider-page/model-modal/index.tsx
new file mode 100644
index 0000000..bc98081
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-modal/index.tsx
@@ -0,0 +1,401 @@
+import type { FC } from 'react'
+import {
+  memo,
+  useCallback,
+  useEffect,
+  useMemo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiErrorWarningFill,
+} from '@remixicon/react'
+import type {
+  CredentialFormSchema,
+  CredentialFormSchemaRadio,
+  CredentialFormSchemaSelect,
+  CustomConfigurationModelFixedFields,
+  FormValue,
+  ModelLoadBalancingConfig,
+  ModelLoadBalancingConfigEntry,
+  ModelProvider,
+} from '../declarations'
+import {
+  ConfigurationMethodEnum,
+  CustomConfigurationStatusEnum,
+  FormTypeEnum,
+} from '../declarations'
+import {
+  genModelNameFormSchema,
+  genModelTypeFormSchema,
+  removeCredentials,
+  saveCredentials,
+} from '../utils'
+import {
+  useLanguage,
+  useProviderCredentialsAndLoadBalancing,
+} from '../hooks'
+import { useValidate } from '../../key-validator/hooks'
+import { ValidatedStatus } from '../../key-validator/declarations'
+import ModelLoadBalancingConfigs from '../provider-added-card/model-load-balancing-configs'
+import Form from './Form'
+import Button from '@/app/components/base/button'
+import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security'
+import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+} from '@/app/components/base/portal-to-follow-elem'
+import { useToastContext } from '@/app/components/base/toast'
+import Confirm from '@/app/components/base/confirm'
+import { useAppContext } from '@/context/app-context'
+
+type ModelModalProps = {
+  provider: ModelProvider
+  configurateMethod: ConfigurationMethodEnum
+  currentCustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields
+  onCancel: () => void
+  onSave: () => void
+}
+
+const ModelModal: FC<ModelModalProps> = ({
+  provider,
+  configurateMethod,
+  currentCustomConfigurationModelFixedFields,
+  onCancel,
+  onSave,
+}) => {
+  const providerFormSchemaPredefined = configurateMethod === ConfigurationMethodEnum.predefinedModel
+  const {
+    credentials: formSchemasValue,
+    loadBalancing: originalConfig,
+    mutate,
+  } = useProviderCredentialsAndLoadBalancing(
+    provider.provider,
+    configurateMethod,
+    providerFormSchemaPredefined && provider.custom_configuration.status === CustomConfigurationStatusEnum.active,
+    currentCustomConfigurationModelFixedFields,
+  )
+  const { isCurrentWorkspaceManager } = useAppContext()
+  const isEditMode = !!formSchemasValue && isCurrentWorkspaceManager
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const language = useLanguage()
+  const [loading, setLoading] = useState(false)
+  const [showConfirm, setShowConfirm] = useState(false)
+
+  const [draftConfig, setDraftConfig] = useState<ModelLoadBalancingConfig>()
+  const originalConfigMap = useMemo(() => {
+    if (!originalConfig)
+      return {}
+    return originalConfig?.configs.reduce((prev, config) => {
+      if (config.id)
+        prev[config.id] = config
+      return prev
+    }, {} as Record<string, ModelLoadBalancingConfigEntry>)
+  }, [originalConfig])
+  useEffect(() => {
+    if (originalConfig && !draftConfig)
+      setDraftConfig(originalConfig)
+  }, [draftConfig, originalConfig])
+
+  const formSchemas = useMemo(() => {
+    return providerFormSchemaPredefined
+      ? provider.provider_credential_schema.credential_form_schemas
+      : [
+        genModelTypeFormSchema(provider.supported_model_types),
+        genModelNameFormSchema(provider.model_credential_schema?.model),
+        ...(draftConfig?.enabled ? [] : provider.model_credential_schema.credential_form_schemas),
+      ]
+  }, [
+    providerFormSchemaPredefined,
+    provider.provider_credential_schema?.credential_form_schemas,
+    provider.supported_model_types,
+    provider.model_credential_schema?.credential_form_schemas,
+    provider.model_credential_schema?.model,
+    draftConfig?.enabled,
+  ])
+  const [
+    requiredFormSchemas,
+    defaultFormSchemaValue,
+    showOnVariableMap,
+  ] = useMemo(() => {
+    const requiredFormSchemas: CredentialFormSchema[] = []
+    const defaultFormSchemaValue: Record<string, string | number> = {}
+    const showOnVariableMap: Record<string, string[]> = {}
+
+    formSchemas.forEach((formSchema) => {
+      if (formSchema.required)
+        requiredFormSchemas.push(formSchema)
+
+      if (formSchema.default)
+        defaultFormSchemaValue[formSchema.variable] = formSchema.default
+
+      if (formSchema.show_on.length) {
+        formSchema.show_on.forEach((showOnItem) => {
+          if (!showOnVariableMap[showOnItem.variable])
+            showOnVariableMap[showOnItem.variable] = []
+
+          if (!showOnVariableMap[showOnItem.variable].includes(formSchema.variable))
+            showOnVariableMap[showOnItem.variable].push(formSchema.variable)
+        })
+      }
+
+      if (formSchema.type === FormTypeEnum.select || formSchema.type === FormTypeEnum.radio) {
+        (formSchema as (CredentialFormSchemaRadio | CredentialFormSchemaSelect)).options.forEach((option) => {
+          if (option.show_on.length) {
+            option.show_on.forEach((showOnItem) => {
+              if (!showOnVariableMap[showOnItem.variable])
+                showOnVariableMap[showOnItem.variable] = []
+
+              if (!showOnVariableMap[showOnItem.variable].includes(formSchema.variable))
+                showOnVariableMap[showOnItem.variable].push(formSchema.variable)
+            })
+          }
+        })
+      }
+    })
+
+    return [
+      requiredFormSchemas,
+      defaultFormSchemaValue,
+      showOnVariableMap,
+    ]
+  }, [formSchemas])
+  const initialFormSchemasValue: Record<string, string | number> = useMemo(() => {
+    return {
+      ...defaultFormSchemaValue,
+      ...formSchemasValue,
+    } as unknown as Record<string, string | number>
+  }, [formSchemasValue, defaultFormSchemaValue])
+  const [value, setValue] = useState(initialFormSchemasValue)
+  useEffect(() => {
+    setValue(initialFormSchemasValue)
+  }, [initialFormSchemasValue])
+  const [_, validating, validatedStatusState] = useValidate(value)
+  const filteredRequiredFormSchemas = requiredFormSchemas.filter((requiredFormSchema) => {
+    if (requiredFormSchema.show_on.length && requiredFormSchema.show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value))
+      return true
+
+    if (!requiredFormSchema.show_on.length)
+      return true
+
+    return false
+  })
+
+  const handleValueChange = (v: FormValue) => {
+    setValue(v)
+  }
+
+  const extendedSecretFormSchemas = useMemo(
+    () =>
+      (providerFormSchemaPredefined
+        ? provider.provider_credential_schema.credential_form_schemas
+        : [
+          genModelTypeFormSchema(provider.supported_model_types),
+          genModelNameFormSchema(provider.model_credential_schema?.model),
+          ...provider.model_credential_schema.credential_form_schemas,
+        ]).filter(({ type }) => type === FormTypeEnum.secretInput),
+    [
+      provider.model_credential_schema?.credential_form_schemas,
+      provider.model_credential_schema?.model,
+      provider.provider_credential_schema?.credential_form_schemas,
+      provider.supported_model_types,
+      providerFormSchemaPredefined,
+    ],
+  )
+
+  const encodeSecretValues = useCallback((v: FormValue) => {
+    const result = { ...v }
+    extendedSecretFormSchemas.forEach(({ variable }) => {
+      if (result[variable] === formSchemasValue?.[variable] && result[variable] !== undefined)
+        result[variable] = '[__HIDDEN__]'
+    })
+    return result
+  }, [extendedSecretFormSchemas, formSchemasValue])
+
+  const encodeConfigEntrySecretValues = useCallback((entry: ModelLoadBalancingConfigEntry) => {
+    const result = { ...entry }
+    extendedSecretFormSchemas.forEach(({ variable }) => {
+      if (entry.id && result.credentials[variable] === originalConfigMap[entry.id]?.credentials?.[variable])
+        result.credentials[variable] = '[__HIDDEN__]'
+    })
+    return result
+  }, [extendedSecretFormSchemas, originalConfigMap])
+
+  const handleSave = async () => {
+    try {
+      setLoading(true)
+      const res = await saveCredentials(
+        providerFormSchemaPredefined,
+        provider.provider,
+        encodeSecretValues(value),
+        {
+          ...draftConfig,
+          enabled: Boolean(draftConfig?.enabled),
+          configs: draftConfig?.configs.map(encodeConfigEntrySecretValues) || [],
+        },
+      )
+      if (res.result === 'success') {
+        notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+        mutate()
+        onSave()
+        onCancel()
+      }
+    }
+    finally {
+      setLoading(false)
+    }
+  }
+
+  const handleRemove = async () => {
+    try {
+      setLoading(true)
+
+      const res = await removeCredentials(
+        providerFormSchemaPredefined,
+        provider.provider,
+        value,
+      )
+      if (res.result === 'success') {
+        notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+        mutate()
+        onSave()
+        onCancel()
+      }
+    }
+    finally {
+      setLoading(false)
+    }
+  }
+
+  const renderTitlePrefix = () => {
+    const prefix = isEditMode ? t('common.operation.setup') : t('common.operation.add')
+    return `${prefix} ${provider.label[language] || provider.label.en_US}`
+  }
+
+  return (
+    <PortalToFollowElem open>
+      <PortalToFollowElemContent className='z-[60] h-full w-full'>
+        <div className='fixed inset-0 flex items-center justify-center bg-black/[.25]'>
+          <div className='mx-2 w-[640px] overflow-auto rounded-2xl bg-components-panel-bg shadow-xl'>
+            <div className='px-8 pt-8'>
+              <div className='mb-2 flex items-center'>
+                <div className='text-xl font-semibold text-text-primary'>{renderTitlePrefix()}</div>
+              </div>
+
+              <div className='max-h-[calc(100vh-320px)] overflow-y-auto'>
+                <Form
+                  value={value}
+                  onChange={handleValueChange}
+                  formSchemas={formSchemas}
+                  validating={validating}
+                  validatedSuccess={validatedStatusState.status === ValidatedStatus.Success}
+                  showOnVariableMap={showOnVariableMap}
+                  isEditMode={isEditMode}
+                />
+                <div className='mb-4 mt-1 border-t-[0.5px] border-t-divider-regular' />
+                <ModelLoadBalancingConfigs withSwitch {...{
+                  draftConfig,
+                  setDraftConfig,
+                  provider,
+                  currentCustomConfigurationModelFixedFields,
+                  configurationMethod: configurateMethod,
+                }} />
+              </div>
+
+              <div className='sticky bottom-0 -mx-2 mt-2 flex flex-wrap items-center justify-between gap-y-2 bg-components-panel-bg px-2 pb-6 pt-4'>
+                {
+                  (provider.help && (provider.help.title || provider.help.url))
+                    ? (
+                      <a
+                        href={provider.help?.url[language] || provider.help?.url.en_US}
+                        target='_blank' rel='noopener noreferrer'
+                        className='inline-flex items-center text-xs text-primary-600'
+                        onClick={e => !provider.help.url && e.preventDefault()}
+                      >
+                        {provider.help.title?.[language] || provider.help.url[language] || provider.help.title?.en_US || provider.help.url.en_US}
+                        <LinkExternal02 className='ml-1 h-3 w-3' />
+                      </a>
+                    )
+                    : <div />
+                }
+                <div>
+                  {
+                    isEditMode && (
+                      <Button
+                        variant='warning'
+                        size='large'
+                        className='mr-2'
+                        onClick={() => setShowConfirm(true)}
+                      >
+                        {t('common.operation.remove')}
+                      </Button>
+                    )
+                  }
+                  <Button
+                    size='large'
+                    className='mr-2'
+                    onClick={onCancel}
+                  >
+                    {t('common.operation.cancel')}
+                  </Button>
+                  <Button
+                    size='large'
+                    variant='primary'
+                    onClick={handleSave}
+                    disabled={
+                      loading
+                      || filteredRequiredFormSchemas.some(item => value[item.variable] === undefined)
+                      || (draftConfig?.enabled && (draftConfig?.configs.filter(config => config.enabled).length ?? 0) < 2)
+                    }
+
+                  >
+                    {t('common.operation.save')}
+                  </Button>
+                </div>
+              </div>
+            </div>
+            <div className='border-t-[0.5px] border-t-divider-regular'>
+              {
+                (validatedStatusState.status === ValidatedStatus.Error && validatedStatusState.message)
+                  ? (
+                    <div className='flex bg-background-section-burn px-[10px] py-3 text-xs text-[#D92D20]'>
+                      <RiErrorWarningFill className='mr-2 mt-[1px] h-[14px] w-[14px]' />
+                      {validatedStatusState.message}
+                    </div>
+                  )
+                  : (
+                    <div className='flex items-center justify-center bg-background-section-burn py-3 text-xs text-text-tertiary'>
+                      <Lock01 className='mr-1 h-3 w-3 text-text-tertiary' />
+                      {t('common.modelProvider.encrypted.front')}
+                      <a
+                        className='mx-1 text-text-accent'
+                        target='_blank' rel='noopener noreferrer'
+                        href='https://pycryptodome.readthedocs.io/en/latest/src/cipher/oaep.html'
+                      >
+                        PKCS1_OAEP
+                      </a>
+                      {t('common.modelProvider.encrypted.back')}
+                    </div>
+                  )
+              }
+            </div>
+          </div>
+          {
+            showConfirm && (
+              <Confirm
+                title={t('common.modelProvider.confirmDelete')}
+                isShow={showConfirm}
+                onCancel={() => setShowConfirm(false)}
+                onConfirm={handleRemove}
+              />
+            )
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default memo(ModelModal)
diff --git a/app/components/header/account-setting/model-provider-page/model-modal/model-load-balancing-entry-modal.tsx b/app/components/header/account-setting/model-provider-page/model-modal/model-load-balancing-entry-modal.tsx
new file mode 100644
index 0000000..d6285a7
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-modal/model-load-balancing-entry-modal.tsx
@@ -0,0 +1,348 @@
+import type { FC } from 'react'
+import {
+  memo,
+  useCallback,
+  useEffect,
+  useMemo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiErrorWarningFill,
+} from '@remixicon/react'
+import type {
+  CredentialFormSchema,
+  CredentialFormSchemaRadio,
+  CredentialFormSchemaSelect,
+  CredentialFormSchemaTextInput,
+  CustomConfigurationModelFixedFields,
+  FormValue,
+  ModelLoadBalancingConfigEntry,
+  ModelProvider,
+} from '../declarations'
+import {
+  ConfigurationMethodEnum,
+  FormTypeEnum,
+} from '../declarations'
+
+import {
+  useLanguage,
+} from '../hooks'
+import { useValidate } from '../../key-validator/hooks'
+import { ValidatedStatus } from '../../key-validator/declarations'
+import { validateLoadBalancingCredentials } from '../utils'
+import Form from './Form'
+import Button from '@/app/components/base/button'
+import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security'
+import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+} from '@/app/components/base/portal-to-follow-elem'
+import { useToastContext } from '@/app/components/base/toast'
+import Confirm from '@/app/components/base/confirm'
+
+type ModelModalProps = {
+  provider: ModelProvider
+  configurationMethod: ConfigurationMethodEnum
+  currentCustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields
+  entry?: ModelLoadBalancingConfigEntry
+  onCancel: () => void
+  onSave: (entry: ModelLoadBalancingConfigEntry) => void
+  onRemove: () => void
+}
+
+const ModelLoadBalancingEntryModal: FC<ModelModalProps> = ({
+  provider,
+  configurationMethod,
+  currentCustomConfigurationModelFixedFields,
+  entry,
+  onCancel,
+  onSave,
+  onRemove,
+}) => {
+  const providerFormSchemaPredefined = configurationMethod === ConfigurationMethodEnum.predefinedModel
+  // const { credentials: formSchemasValue } = useProviderCredentialsAndLoadBalancing(
+  //   provider.provider,
+  //   configurationMethod,
+  //   providerFormSchemaPredefined && provider.custom_configuration.status === CustomConfigurationStatusEnum.active,
+  //   currentCustomConfigurationModelFixedFields,
+  // )
+  const isEditMode = !!entry
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const language = useLanguage()
+  const [loading, setLoading] = useState(false)
+  const [showConfirm, setShowConfirm] = useState(false)
+  const formSchemas = useMemo(() => {
+    return [
+      {
+        type: FormTypeEnum.textInput,
+        label: {
+          en_US: 'Config Name',
+          zh_Hans: '閰嶇疆鍚嶇О',
+        },
+        variable: 'name',
+        required: true,
+        show_on: [],
+        placeholder: {
+          en_US: 'Enter your Config Name here',
+          zh_Hans: '杈撳叆閰嶇疆鍚嶇О',
+        },
+      } as CredentialFormSchemaTextInput,
+      ...(
+        providerFormSchemaPredefined
+          ? provider.provider_credential_schema.credential_form_schemas
+          : provider.model_credential_schema.credential_form_schemas
+      ),
+    ]
+  }, [
+    providerFormSchemaPredefined,
+    provider.provider_credential_schema?.credential_form_schemas,
+    provider.model_credential_schema?.credential_form_schemas,
+  ])
+
+  const [
+    requiredFormSchemas,
+    secretFormSchemas,
+    defaultFormSchemaValue,
+    showOnVariableMap,
+  ] = useMemo(() => {
+    const requiredFormSchemas: CredentialFormSchema[] = []
+    const secretFormSchemas: CredentialFormSchema[] = []
+    const defaultFormSchemaValue: Record<string, string | number> = {}
+    const showOnVariableMap: Record<string, string[]> = {}
+
+    formSchemas.forEach((formSchema) => {
+      if (formSchema.required)
+        requiredFormSchemas.push(formSchema)
+
+      if (formSchema.type === FormTypeEnum.secretInput)
+        secretFormSchemas.push(formSchema)
+
+      if (formSchema.default)
+        defaultFormSchemaValue[formSchema.variable] = formSchema.default
+
+      if (formSchema.show_on.length) {
+        formSchema.show_on.forEach((showOnItem) => {
+          if (!showOnVariableMap[showOnItem.variable])
+            showOnVariableMap[showOnItem.variable] = []
+
+          if (!showOnVariableMap[showOnItem.variable].includes(formSchema.variable))
+            showOnVariableMap[showOnItem.variable].push(formSchema.variable)
+        })
+      }
+
+      if (formSchema.type === FormTypeEnum.select || formSchema.type === FormTypeEnum.radio) {
+        (formSchema as (CredentialFormSchemaRadio | CredentialFormSchemaSelect)).options.forEach((option) => {
+          if (option.show_on.length) {
+            option.show_on.forEach((showOnItem) => {
+              if (!showOnVariableMap[showOnItem.variable])
+                showOnVariableMap[showOnItem.variable] = []
+
+              if (!showOnVariableMap[showOnItem.variable].includes(formSchema.variable))
+                showOnVariableMap[showOnItem.variable].push(formSchema.variable)
+            })
+          }
+        })
+      }
+    })
+
+    return [
+      requiredFormSchemas,
+      secretFormSchemas,
+      defaultFormSchemaValue,
+      showOnVariableMap,
+    ]
+  }, [formSchemas])
+  const [initialValue, setInitialValue] = useState<ModelLoadBalancingConfigEntry['credentials']>()
+  useEffect(() => {
+    if (entry && !initialValue) {
+      setInitialValue({
+        ...defaultFormSchemaValue,
+        ...entry.credentials,
+        id: entry.id,
+        name: entry.name,
+      } as Record<string, string | undefined | boolean>)
+    }
+  }, [entry, defaultFormSchemaValue, initialValue])
+  const formSchemasValue = useMemo(() => ({
+    ...currentCustomConfigurationModelFixedFields,
+    ...initialValue,
+  }), [currentCustomConfigurationModelFixedFields, initialValue])
+  const initialFormSchemasValue: Record<string, string | number> = useMemo(() => {
+    return {
+      ...defaultFormSchemaValue,
+      ...formSchemasValue,
+    } as Record<string, string | number>
+  }, [formSchemasValue, defaultFormSchemaValue])
+  const [value, setValue] = useState(initialFormSchemasValue)
+  useEffect(() => {
+    setValue(initialFormSchemasValue)
+  }, [initialFormSchemasValue])
+  const [_, validating, validatedStatusState] = useValidate(value)
+  const filteredRequiredFormSchemas = requiredFormSchemas.filter((requiredFormSchema) => {
+    if (requiredFormSchema.show_on.length && requiredFormSchema.show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value))
+      return true
+
+    if (!requiredFormSchema.show_on.length)
+      return true
+
+    return false
+  })
+  const getSecretValues = useCallback((v: FormValue) => {
+    return secretFormSchemas.reduce((prev, next) => {
+      if (isEditMode && v[next.variable] && v[next.variable] === initialFormSchemasValue[next.variable])
+        prev[next.variable] = '[__HIDDEN__]'
+
+      return prev
+    }, {} as Record<string, string>)
+  }, [initialFormSchemasValue, isEditMode, secretFormSchemas])
+
+  // const handleValueChange = ({ __model_type, __model_name, ...v }: FormValue) => {
+  const handleValueChange = (v: FormValue) => {
+    setValue(v)
+  }
+  const handleSave = async () => {
+    try {
+      setLoading(true)
+
+      const res = await validateLoadBalancingCredentials(
+        providerFormSchemaPredefined,
+        provider.provider,
+        {
+          ...value,
+          ...getSecretValues(value),
+        },
+        entry?.id,
+      )
+      if (res.status === ValidatedStatus.Success) {
+        // notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+        const { __model_type, __model_name, name, ...credentials } = value
+        onSave({
+          ...(entry || {}),
+          name: name as string,
+          credentials: credentials as Record<string, string | boolean | undefined>,
+        })
+        //   onCancel()
+      }
+      else {
+        notify({ type: 'error', message: res.message || '' })
+      }
+    }
+    finally {
+      setLoading(false)
+    }
+  }
+
+  const handleRemove = () => {
+    onRemove?.()
+  }
+
+  return (
+    <PortalToFollowElem open>
+      <PortalToFollowElemContent className='z-[60] h-full w-full'>
+        <div className='fixed inset-0 flex items-center justify-center bg-black/[.25]'>
+          <div className='mx-2 max-h-[calc(100vh-120px)] w-[640px] overflow-y-auto rounded-2xl bg-white shadow-xl'>
+            <div className='px-8 pt-8'>
+              <div className='mb-2 flex items-center justify-between'>
+                <div className='text-xl font-semibold text-gray-900'>{t(isEditMode ? 'common.modelProvider.editConfig' : 'common.modelProvider.addConfig')}</div>
+              </div>
+              <Form
+                value={value}
+                onChange={handleValueChange}
+                formSchemas={formSchemas}
+                validating={validating}
+                validatedSuccess={validatedStatusState.status === ValidatedStatus.Success}
+                showOnVariableMap={showOnVariableMap}
+                isEditMode={isEditMode}
+              />
+              <div className='sticky bottom-0 flex flex-wrap items-center justify-between gap-y-2 bg-white py-6'>
+                {
+                  (provider.help && (provider.help.title || provider.help.url))
+                    ? (
+                      <a
+                        href={provider.help?.url[language] || provider.help?.url.en_US}
+                        target='_blank' rel='noopener noreferrer'
+                        className='inline-flex items-center text-xs text-primary-600'
+                        onClick={e => !provider.help.url && e.preventDefault()}
+                      >
+                        {provider.help.title?.[language] || provider.help.url[language] || provider.help.title?.en_US || provider.help.url.en_US}
+                        <LinkExternal02 className='ml-1 h-3 w-3' />
+                      </a>
+                    )
+                    : <div />
+                }
+                <div>
+                  {
+                    isEditMode && (
+                      <Button
+                        size='large'
+                        className='mr-2 text-[#D92D20]'
+                        onClick={() => setShowConfirm(true)}
+                      >
+                        {t('common.operation.remove')}
+                      </Button>
+                    )
+                  }
+                  <Button
+                    size='large'
+                    className='mr-2'
+                    onClick={onCancel}
+                  >
+                    {t('common.operation.cancel')}
+                  </Button>
+                  <Button
+                    size='large'
+                    variant='primary'
+                    onClick={handleSave}
+                    disabled={loading || filteredRequiredFormSchemas.some(item => value[item.variable] === undefined)}
+                  >
+                    {t('common.operation.save')}
+                  </Button>
+                </div>
+              </div>
+            </div>
+            <div className='border-t-[0.5px] border-t-black/5'>
+              {
+                (validatedStatusState.status === ValidatedStatus.Error && validatedStatusState.message)
+                  ? (
+                    <div className='flex bg-[#FEF3F2] px-[10px] py-3 text-xs text-[#D92D20]'>
+                      <RiErrorWarningFill className='mr-2 mt-[1px] h-[14px] w-[14px]' />
+                      {validatedStatusState.message}
+                    </div>
+                  )
+                  : (
+                    <div className='flex items-center justify-center bg-gray-50 py-3 text-xs text-gray-500'>
+                      <Lock01 className='mr-1 h-3 w-3 text-gray-500' />
+                      {t('common.modelProvider.encrypted.front')}
+                      <a
+                        className='mx-1 text-primary-600'
+                        target='_blank' rel='noopener noreferrer'
+                        href='https://pycryptodome.readthedocs.io/en/latest/src/cipher/oaep.html'
+                      >
+                        PKCS1_OAEP
+                      </a>
+                      {t('common.modelProvider.encrypted.back')}
+                    </div>
+                  )
+              }
+            </div>
+          </div>
+          {
+            showConfirm && (
+              <Confirm
+                title={t('common.modelProvider.confirmDelete')}
+                isShow={showConfirm}
+                onCancel={() => setShowConfirm(false)}
+                onConfirm={handleRemove}
+              />
+            )
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default memo(ModelLoadBalancingEntryModal)
diff --git a/app/components/header/account-setting/model-provider-page/model-name/index.tsx b/app/components/header/account-setting/model-provider-page/model-name/index.tsx
new file mode 100644
index 0000000..f88c751
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-name/index.tsx
@@ -0,0 +1,84 @@
+import type { FC, PropsWithChildren } from 'react'
+import {
+  modelTypeFormat,
+  sizeFormat,
+} from '../utils'
+import { useLanguage } from '../hooks'
+import type { ModelItem } from '../declarations'
+import ModelBadge from '../model-badge'
+import FeatureIcon from '../model-selector/feature-icon'
+import cn from '@/utils/classnames'
+
+type ModelNameProps = PropsWithChildren<{
+  modelItem: ModelItem
+  className?: string
+  showModelType?: boolean
+  modelTypeClassName?: string
+  showMode?: boolean
+  modeClassName?: string
+  showFeatures?: boolean
+  featuresClassName?: string
+  showContextSize?: boolean
+}>
+const ModelName: FC<ModelNameProps> = ({
+  modelItem,
+  className,
+  showModelType,
+  modelTypeClassName,
+  showMode,
+  modeClassName,
+  showFeatures,
+  featuresClassName,
+  showContextSize,
+  children,
+}) => {
+  const language = useLanguage()
+
+  if (!modelItem)
+    return null
+  return (
+    <div className={cn('system-sm-regular flex items-center gap-0.5 overflow-hidden truncate text-ellipsis text-components-input-text-filled', className)}>
+      <div
+        className='truncate'
+        title={modelItem.label[language] || modelItem.label.en_US}
+      >
+        {modelItem.label[language] || modelItem.label.en_US}
+      </div>
+      <div className='flex items-center gap-0.5'>
+        {
+          showModelType && modelItem.model_type && (
+            <ModelBadge className={modelTypeClassName}>
+              {modelTypeFormat(modelItem.model_type)}
+            </ModelBadge>
+          )
+        }
+        {
+          modelItem.model_properties.mode && showMode && (
+            <ModelBadge className={modeClassName}>
+              {(modelItem.model_properties.mode as string).toLocaleUpperCase()}
+            </ModelBadge>
+          )
+        }
+        {
+          showFeatures && modelItem.features?.map(feature => (
+            <FeatureIcon
+              key={feature}
+              feature={feature}
+              className={featuresClassName}
+            />
+          ))
+        }
+        {
+          showContextSize && modelItem.model_properties.context_size && (
+            <ModelBadge>
+              {sizeFormat(modelItem.model_properties.context_size as number)}
+            </ModelBadge>
+          )
+        }
+      </div>
+      {children}
+    </div>
+  )
+}
+
+export default ModelName
diff --git a/app/components/header/account-setting/model-provider-page/model-parameter-modal/agent-model-trigger.tsx b/app/components/header/account-setting/model-provider-page/model-parameter-modal/agent-model-trigger.tsx
new file mode 100644
index 0000000..f9ab2e3
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-parameter-modal/agent-model-trigger.tsx
@@ -0,0 +1,154 @@
+import type { FC } from 'react'
+import { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import type {
+  ModelItem,
+  ModelProvider,
+} from '../declarations'
+import {
+  CustomConfigurationStatusEnum,
+  ModelTypeEnum,
+} from '../declarations'
+import { useInvalidateInstalledPluginList } from '@/service/use-plugins'
+import ConfigurationButton from './configuration-button'
+import Loading from '@/app/components/base/loading'
+import {
+  useModelModalHandler,
+  useUpdateModelList,
+  useUpdateModelProviders,
+} from '../hooks'
+import ModelIcon from '../model-icon'
+import ModelDisplay from './model-display'
+import { InstallPluginButton } from '@/app/components/workflow/nodes/_base/components/install-plugin-button'
+import StatusIndicators from './status-indicators'
+import cn from '@/utils/classnames'
+import { useProviderContext } from '@/context/provider-context'
+import { RiEqualizer2Line } from '@remixicon/react'
+import { useModelInList, usePluginInfo } from '@/service/use-plugins'
+
+export type AgentModelTriggerProps = {
+  open?: boolean
+  disabled?: boolean
+  currentProvider?: ModelProvider
+  currentModel?: ModelItem
+  providerName?: string
+  modelId?: string
+  hasDeprecated?: boolean
+  scope?: string
+}
+
+const AgentModelTrigger: FC<AgentModelTriggerProps> = ({
+  disabled,
+  currentProvider,
+  currentModel,
+  providerName,
+  modelId,
+  hasDeprecated,
+  scope,
+}) => {
+  const { t } = useTranslation()
+  const { modelProviders } = useProviderContext()
+  const updateModelProviders = useUpdateModelProviders()
+  const updateModelList = useUpdateModelList()
+  const { modelProvider, needsConfiguration } = useMemo(() => {
+    const modelProvider = modelProviders.find(item => item.provider === providerName)
+    const needsConfiguration = modelProvider?.custom_configuration.status === CustomConfigurationStatusEnum.noConfigure && !(
+      modelProvider.system_configuration.enabled === true
+      && modelProvider.system_configuration.quota_configurations.find(
+        item => item.quota_type === modelProvider.system_configuration.current_quota_type,
+      )
+    )
+    return {
+      modelProvider,
+      needsConfiguration,
+    }
+  }, [modelProviders, providerName])
+  const [installed, setInstalled] = useState(false)
+  const invalidateInstalledPluginList = useInvalidateInstalledPluginList()
+  const handleOpenModal = useModelModalHandler()
+
+  const { data: inModelList = false } = useModelInList(currentProvider, modelId)
+  const { data: pluginInfo, isLoading: isPluginLoading } = usePluginInfo(providerName)
+
+  if (modelId && isPluginLoading)
+    return <Loading />
+
+  return (
+    <div
+      className={cn(
+        'group relative flex grow cursor-pointer items-center gap-[2px] rounded-lg bg-components-input-bg-normal p-1 hover:bg-state-base-hover-alt',
+      )}
+    >
+      {modelId ? (
+        <>
+          <ModelIcon
+            className='p-0.5'
+            provider={currentProvider || modelProvider}
+            modelName={currentModel?.model || modelId}
+            isDeprecated={hasDeprecated}
+          />
+          <ModelDisplay
+            currentModel={currentModel}
+            modelId={modelId}
+          />
+          {needsConfiguration && (
+            <ConfigurationButton
+              modelProvider={modelProvider}
+              handleOpenModal={handleOpenModal}
+            />
+          )}
+          <StatusIndicators
+            needsConfiguration={needsConfiguration}
+            modelProvider={!!modelProvider}
+            inModelList={inModelList}
+            disabled={!!disabled}
+            pluginInfo={pluginInfo}
+            t={t}
+          />
+          {!installed && !modelProvider && pluginInfo && (
+            <InstallPluginButton
+              onClick={e => e.stopPropagation()}
+              size={'small'}
+              uniqueIdentifier={pluginInfo.latest_package_identifier}
+              onSuccess={() => {
+                [
+                  ModelTypeEnum.textGeneration,
+                  ModelTypeEnum.textEmbedding,
+                  ModelTypeEnum.rerank,
+                  ModelTypeEnum.moderation,
+                  ModelTypeEnum.speech2text,
+                  ModelTypeEnum.tts,
+                ].forEach((type: ModelTypeEnum) => {
+                  if (scope?.includes(type))
+                    updateModelList(type)
+                },
+                )
+                updateModelProviders()
+                invalidateInstalledPluginList()
+                setInstalled(true)
+              }}
+            />
+          )}
+          {modelProvider && !disabled && !needsConfiguration && (
+            <div className="flex items-center pr-1">
+              <RiEqualizer2Line className="h-4 w-4 text-text-tertiary group-hover:text-text-secondary" />
+            </div>
+          )}
+        </>
+      ) : (
+        <>
+          <div className="flex grow items-center gap-1 p-1 pl-2">
+            <span className="system-sm-regular overflow-hidden text-ellipsis whitespace-nowrap text-components-input-text-placeholder">
+              {t('workflow.nodes.agent.configureModel')}
+            </span>
+          </div>
+          <div className="flex items-center pr-1">
+            <RiEqualizer2Line className="h-4 w-4 text-text-tertiary group-hover:text-text-secondary" />
+          </div>
+        </>
+      )}
+    </div>
+  )
+}
+
+export default AgentModelTrigger
diff --git a/app/components/header/account-setting/model-provider-page/model-parameter-modal/configuration-button.tsx b/app/components/header/account-setting/model-provider-page/model-parameter-modal/configuration-button.tsx
new file mode 100644
index 0000000..4dcc045
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-parameter-modal/configuration-button.tsx
@@ -0,0 +1,32 @@
+import Button from '@/app/components/base/button'
+import { ConfigurationMethodEnum } from '../declarations'
+import { useTranslation } from 'react-i18next'
+
+type ConfigurationButtonProps = {
+  modelProvider: any
+  handleOpenModal: any
+}
+
+const ConfigurationButton = ({ modelProvider, handleOpenModal }: ConfigurationButtonProps) => {
+  const { t } = useTranslation()
+  return (
+    <Button
+      size="small"
+      className="z-[100]"
+      onClick={(e) => {
+        e.stopPropagation()
+        handleOpenModal(modelProvider, ConfigurationMethodEnum.predefinedModel, undefined)
+      }}
+    >
+      <div className="flex items-center justify-center gap-1 px-[3px]">
+        {t('workflow.nodes.agent.notAuthorized')}
+      </div>
+      <div className="flex h-[14px] w-[14px] items-center justify-center">
+        <div className="h-2 w-2 shrink-0 rounded-[3px] border border-components-badge-status-light-warning-border-inner
+          bg-components-badge-status-light-warning-bg shadow-components-badge-status-light-warning-halo" />
+      </div>
+    </Button>
+  )
+}
+
+export default ConfigurationButton
diff --git a/app/components/header/account-setting/model-provider-page/model-parameter-modal/index.tsx b/app/components/header/account-setting/model-provider-page/model-parameter-modal/index.tsx
new file mode 100644
index 0000000..dd441dd
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-parameter-modal/index.tsx
@@ -0,0 +1,267 @@
+import type {
+  FC,
+  ReactNode,
+} from 'react'
+import { useMemo, useState } from 'react'
+import useSWR from 'swr'
+import { useTranslation } from 'react-i18next'
+import type {
+  DefaultModel,
+  FormValue,
+  ModelParameterRule,
+} from '../declarations'
+import { ModelStatusEnum } from '../declarations'
+import ModelSelector from '../model-selector'
+import {
+  useTextGenerationCurrentProviderAndModelAndModelList,
+} from '../hooks'
+import ParameterItem from './parameter-item'
+import type { ParameterValue } from './parameter-item'
+import Trigger from './trigger'
+import type { TriggerProps } from './trigger'
+import PresetsParameter from './presets-parameter'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { fetchModelParameterRules } from '@/service/common'
+import Loading from '@/app/components/base/loading'
+import { useProviderContext } from '@/context/provider-context'
+import { TONE_LIST } from '@/config'
+import { ArrowNarrowLeft } from '@/app/components/base/icons/src/vender/line/arrows'
+
+export type ModelParameterModalProps = {
+  popupClassName?: string
+  portalToFollowElemContentClassName?: string
+  isAdvancedMode: boolean
+  mode: string
+  modelId: string
+  provider: string
+  setModel: (model: { modelId: string; provider: string; mode?: string; features?: string[] }) => void
+  completionParams: FormValue
+  onCompletionParamsChange: (newParams: FormValue) => void
+  hideDebugWithMultipleModel?: boolean
+  debugWithMultipleModel?: boolean
+  onDebugWithMultipleModelChange?: () => void
+  renderTrigger?: (v: TriggerProps) => ReactNode
+  readonly?: boolean
+  isInWorkflow?: boolean
+  scope?: string
+}
+const stopParameterRule: ModelParameterRule = {
+  default: [],
+  help: {
+    en_US: 'Up to four sequences where the API聽will stop generating further tokens. The聽returned text will not contain the stop聽sequence.',
+    zh_Hans: '鏈�澶氬洓涓簭鍒楋紝API 灏嗗仠姝㈢敓鎴愭洿澶氱殑 token銆傝繑鍥炵殑鏂囨湰灏嗕笉鍖呭惈鍋滄搴忓垪銆�',
+  },
+  label: {
+    en_US: 'Stop sequences',
+    zh_Hans: '鍋滄搴忓垪',
+  },
+  name: 'stop',
+  required: false,
+  type: 'tag',
+  tagPlaceholder: {
+    en_US: 'Enter sequence and press Tab',
+    zh_Hans: '杈撳叆搴忓垪骞舵寜 Tab 閿�',
+  },
+}
+
+const PROVIDER_WITH_PRESET_TONE = ['langgenius/openai/openai', 'langgenius/azure_openai/azure_openai']
+const ModelParameterModal: FC<ModelParameterModalProps> = ({
+  popupClassName,
+  portalToFollowElemContentClassName,
+  isAdvancedMode,
+  modelId,
+  provider,
+  setModel,
+  completionParams,
+  onCompletionParamsChange,
+  hideDebugWithMultipleModel,
+  debugWithMultipleModel,
+  onDebugWithMultipleModelChange,
+  renderTrigger,
+  readonly,
+  isInWorkflow,
+}) => {
+  const { t } = useTranslation()
+  const { isAPIKeySet } = useProviderContext()
+  const [open, setOpen] = useState(false)
+  const { data: parameterRulesData, isLoading } = useSWR((provider && modelId) ? `/workspaces/current/model-providers/${provider}/models/parameter-rules?model=${modelId}` : null, fetchModelParameterRules)
+  const {
+    currentProvider,
+    currentModel,
+    activeTextGenerationModelList,
+  } = useTextGenerationCurrentProviderAndModelAndModelList(
+    { provider, model: modelId },
+  )
+
+  const hasDeprecated = !currentProvider || !currentModel
+  const modelDisabled = currentModel?.status !== ModelStatusEnum.active
+  const disabled = !isAPIKeySet || hasDeprecated || modelDisabled
+
+  const parameterRules: ModelParameterRule[] = useMemo(() => {
+    return parameterRulesData?.data || []
+  }, [parameterRulesData])
+
+  const handleParamChange = (key: string, value: ParameterValue) => {
+    onCompletionParamsChange({
+      ...completionParams,
+      [key]: value,
+    })
+  }
+
+  const handleChangeModel = ({ provider, model }: DefaultModel) => {
+    const targetProvider = activeTextGenerationModelList.find(modelItem => modelItem.provider === provider)
+    const targetModelItem = targetProvider?.models.find(modelItem => modelItem.model === model)
+    setModel({
+      modelId: model,
+      provider,
+      mode: targetModelItem?.model_properties.mode as string,
+      features: targetModelItem?.features || [],
+    })
+  }
+
+  const handleSwitch = (key: string, value: boolean, assignValue: ParameterValue) => {
+    if (!value) {
+      const newCompletionParams = { ...completionParams }
+      delete newCompletionParams[key]
+
+      onCompletionParamsChange(newCompletionParams)
+    }
+    if (value) {
+      onCompletionParamsChange({
+        ...completionParams,
+        [key]: assignValue,
+      })
+    }
+  }
+
+  const handleSelectPresetParameter = (toneId: number) => {
+    const tone = TONE_LIST.find(tone => tone.id === toneId)
+    if (tone) {
+      onCompletionParamsChange({
+        ...completionParams,
+        ...tone.config,
+      })
+    }
+  }
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement={isInWorkflow ? 'left' : 'bottom-end'}
+      offset={4}
+    >
+      <div className='relative'>
+        <PortalToFollowElemTrigger
+          onClick={() => {
+            if (readonly)
+              return
+            setOpen(v => !v)
+          }}
+          className='block'
+        >
+          {
+            renderTrigger
+              ? renderTrigger({
+                open,
+                disabled,
+                modelDisabled,
+                hasDeprecated,
+                currentProvider,
+                currentModel,
+                providerName: provider,
+                modelId,
+              })
+              : (
+                <Trigger
+                  disabled={disabled}
+                  isInWorkflow={isInWorkflow}
+                  modelDisabled={modelDisabled}
+                  hasDeprecated={hasDeprecated}
+                  currentProvider={currentProvider}
+                  currentModel={currentModel}
+                  providerName={provider}
+                  modelId={modelId}
+                />
+              )
+          }
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className={cn('z-[60]', portalToFollowElemContentClassName)}>
+          <div className={cn(popupClassName, 'w-[389px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-lg')}>
+            <div className={cn('max-h-[420px] overflow-y-auto p-4 pt-3')}>
+              <div className='relative'>
+                <div className={cn('system-sm-semibold mb-1 flex h-6 items-center text-text-secondary')}>
+                  {t('common.modelProvider.model').toLocaleUpperCase()}
+                </div>
+                <ModelSelector
+                  defaultModel={(provider || modelId) ? { provider, model: modelId } : undefined}
+                  modelList={activeTextGenerationModelList}
+                  onSelect={handleChangeModel}
+                />
+              </div>
+              {
+                !!parameterRules.length && (
+                  <div className='my-3 h-[1px] bg-divider-subtle' />
+                )
+              }
+              {
+                isLoading && (
+                  <div className='mt-5'><Loading /></div>
+                )
+              }
+              {
+                !isLoading && !!parameterRules.length && (
+                  <div className='mb-2 flex items-center justify-between'>
+                    <div className={cn('system-sm-semibold flex h-6 items-center text-text-secondary')}>{t('common.modelProvider.parameters')}</div>
+                    {
+                      PROVIDER_WITH_PRESET_TONE.includes(provider) && (
+                        <PresetsParameter onSelect={handleSelectPresetParameter} />
+                      )
+                    }
+                  </div>
+                )
+              }
+              {
+                !isLoading && !!parameterRules.length && (
+                  [
+                    ...parameterRules,
+                    ...(isAdvancedMode ? [stopParameterRule] : []),
+                  ].map(parameter => (
+                    <ParameterItem
+                      key={`${modelId}-${parameter.name}`}
+                      parameterRule={parameter}
+                      value={completionParams?.[parameter.name]}
+                      onChange={v => handleParamChange(parameter.name, v)}
+                      onSwitch={(checked, assignValue) => handleSwitch(parameter.name, checked, assignValue)}
+                      isInWorkflow={isInWorkflow}
+                    />
+                  ))
+                )
+              }
+            </div>
+            {!hideDebugWithMultipleModel && (
+              <div
+                className='bg-components-section-burn system-sm-regular flex h-[50px] cursor-pointer items-center justify-between rounded-b-xl border-t border-t-divider-subtle px-4 text-text-accent'
+                onClick={() => onDebugWithMultipleModelChange?.()}
+              >
+                {
+                  debugWithMultipleModel
+                    ? t('appDebug.debugAsSingleModel')
+                    : t('appDebug.debugAsMultipleModel')
+                }
+                <ArrowNarrowLeft className='h-3 w-3 rotate-180' />
+              </div>
+            )}
+          </div>
+        </PortalToFollowElemContent>
+      </div>
+    </PortalToFollowElem>
+  )
+}
+
+export default ModelParameterModal
diff --git a/app/components/header/account-setting/model-provider-page/model-parameter-modal/model-display.tsx b/app/components/header/account-setting/model-provider-page/model-parameter-modal/model-display.tsx
new file mode 100644
index 0000000..e9e8ec7
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-parameter-modal/model-display.tsx
@@ -0,0 +1,25 @@
+import ModelName from '../model-name'
+
+type ModelDisplayProps = {
+  currentModel: any
+  modelId: string
+}
+
+const ModelDisplay = ({ currentModel, modelId }: ModelDisplayProps) => {
+  return currentModel ? (
+    <ModelName
+      className="flex grow items-center gap-1 px-1 py-[3px]"
+      modelItem={currentModel}
+      showMode
+      showFeatures
+    />
+  ) : (
+    <div className="flex grow items-center gap-1 truncate px-1 py-[3px] opacity-50">
+      <div className="system-sm-regular overflow-hidden text-ellipsis text-components-input-text-filled">
+        {modelId}
+      </div>
+    </div>
+  )
+}
+
+export default ModelDisplay
diff --git a/app/components/header/account-setting/model-provider-page/model-parameter-modal/parameter-item.tsx b/app/components/header/account-setting/model-provider-page/model-parameter-modal/parameter-item.tsx
new file mode 100644
index 0000000..3e969d7
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-parameter-modal/parameter-item.tsx
@@ -0,0 +1,295 @@
+import type { FC } from 'react'
+import { useEffect, useRef, useState } from 'react'
+import type { ModelParameterRule } from '../declarations'
+import { useLanguage } from '../hooks'
+import { isNullOrUndefined } from '../utils'
+import cn from '@/utils/classnames'
+import Switch from '@/app/components/base/switch'
+import Tooltip from '@/app/components/base/tooltip'
+import Slider from '@/app/components/base/slider'
+import Radio from '@/app/components/base/radio'
+import { SimpleSelect } from '@/app/components/base/select'
+import TagInput from '@/app/components/base/tag-input'
+import { useTranslation } from 'react-i18next'
+
+export type ParameterValue = number | string | string[] | boolean | undefined
+
+type ParameterItemProps = {
+  parameterRule: ModelParameterRule
+  value?: ParameterValue
+  onChange?: (value: ParameterValue) => void
+  onSwitch?: (checked: boolean, assignValue: ParameterValue) => void
+  isInWorkflow?: boolean
+}
+const ParameterItem: FC<ParameterItemProps> = ({
+  parameterRule,
+  value,
+  onChange,
+  onSwitch,
+  isInWorkflow,
+}) => {
+  const { t } = useTranslation()
+  const language = useLanguage()
+  const [localValue, setLocalValue] = useState(value)
+  const numberInputRef = useRef<HTMLInputElement>(null)
+
+  const getDefaultValue = () => {
+    let defaultValue: ParameterValue
+
+    if (parameterRule.type === 'int' || parameterRule.type === 'float')
+      defaultValue = isNullOrUndefined(parameterRule.default) ? (parameterRule.min || 0) : parameterRule.default
+    else if (parameterRule.type === 'string' || parameterRule.type === 'text')
+      defaultValue = parameterRule.default || ''
+    else if (parameterRule.type === 'boolean')
+      defaultValue = !isNullOrUndefined(parameterRule.default) ? parameterRule.default : false
+    else if (parameterRule.type === 'tag')
+      defaultValue = !isNullOrUndefined(parameterRule.default) ? parameterRule.default : []
+
+    return defaultValue
+  }
+
+  const renderValue = value ?? localValue ?? getDefaultValue()
+
+  const handleInputChange = (newValue: ParameterValue) => {
+    setLocalValue(newValue)
+
+    if (onChange && (parameterRule.name === 'stop' || !isNullOrUndefined(value) || parameterRule.required))
+      onChange(newValue)
+  }
+
+  const handleNumberInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+    let num = +e.target.value
+
+    if (!isNullOrUndefined(parameterRule.max) && num > parameterRule.max!) {
+      num = parameterRule.max as number
+      numberInputRef.current!.value = `${num}`
+    }
+
+    if (!isNullOrUndefined(parameterRule.min) && num < parameterRule.min!)
+      num = parameterRule.min as number
+
+    handleInputChange(num)
+  }
+
+  const handleNumberInputBlur = () => {
+    if (numberInputRef.current)
+      numberInputRef.current.value = renderValue as string
+  }
+
+  const handleSlideChange = (num: number) => {
+    if (!isNullOrUndefined(parameterRule.max) && num > parameterRule.max!) {
+      handleInputChange(parameterRule.max)
+      numberInputRef.current!.value = `${parameterRule.max}`
+      return
+    }
+
+    if (!isNullOrUndefined(parameterRule.min) && num < parameterRule.min!) {
+      handleInputChange(parameterRule.min)
+      numberInputRef.current!.value = `${parameterRule.min}`
+      return
+    }
+
+    handleInputChange(num)
+    numberInputRef.current!.value = `${num}`
+  }
+
+  const handleRadioChange = (v: number) => {
+    handleInputChange(v === 1)
+  }
+
+  const handleStringInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
+    handleInputChange(e.target.value)
+  }
+
+  const handleSelect = (option: { value: string | number; name: string }) => {
+    handleInputChange(option.value)
+  }
+
+  const handleTagChange = (newSequences: string[]) => {
+    handleInputChange(newSequences)
+  }
+
+  const handleSwitch = (checked: boolean) => {
+    if (onSwitch) {
+      const assignValue: ParameterValue = localValue || getDefaultValue()
+
+      onSwitch(checked, assignValue)
+    }
+  }
+
+  useEffect(() => {
+    if ((parameterRule.type === 'int' || parameterRule.type === 'float') && numberInputRef.current)
+      numberInputRef.current.value = `${renderValue}`
+  }, [value])
+
+  const renderInput = () => {
+    const numberInputWithSlide = (parameterRule.type === 'int' || parameterRule.type === 'float')
+      && !isNullOrUndefined(parameterRule.min)
+      && !isNullOrUndefined(parameterRule.max)
+
+    if (parameterRule.type === 'int') {
+      let step = 100
+      if (parameterRule.max) {
+        if (parameterRule.max < 100)
+          step = 1
+        else if (parameterRule.max < 1000)
+          step = 10
+      }
+
+      return (
+        <>
+          {numberInputWithSlide && <Slider
+            className='w-[120px]'
+            value={renderValue as number}
+            min={parameterRule.min}
+            max={parameterRule.max}
+            step={step}
+            onChange={handleSlideChange}
+          />}
+          <input
+            ref={numberInputRef}
+            className='system-sm-regular ml-4 block h-8 w-16 shrink-0 appearance-none rounded-lg bg-components-input-bg-normal pl-3 text-components-input-text-filled outline-none'
+            type='number'
+            max={parameterRule.max}
+            min={parameterRule.min}
+            step={numberInputWithSlide ? step : +`0.${parameterRule.precision || 0}`}
+            onChange={handleNumberInputChange}
+            onBlur={handleNumberInputBlur}
+          />
+        </>
+      )
+    }
+
+    if (parameterRule.type === 'float') {
+      return (
+        <>
+          {numberInputWithSlide && <Slider
+            className='w-[120px]'
+            value={renderValue as number}
+            min={parameterRule.min}
+            max={parameterRule.max}
+            step={0.1}
+            onChange={handleSlideChange}
+          />}
+          <input
+            ref={numberInputRef}
+            className='system-sm-regular ml-4 block h-8 w-16 shrink-0 appearance-none rounded-lg bg-components-input-bg-normal pl-3 text-components-input-text-filled outline-none'
+            type='number'
+            max={parameterRule.max}
+            min={parameterRule.min}
+            step={numberInputWithSlide ? 0.1 : +`0.${parameterRule.precision || 0}`}
+            onChange={handleNumberInputChange}
+            onBlur={handleNumberInputBlur}
+          />
+        </>
+      )
+    }
+
+    if (parameterRule.type === 'boolean') {
+      return (
+        <Radio.Group
+          className='flex w-[178px] items-center'
+          value={renderValue ? 1 : 0}
+          onChange={handleRadioChange}
+        >
+          <Radio value={1} className='w-[83px]'>True</Radio>
+          <Radio value={0} className='w-[83px]'>False</Radio>
+        </Radio.Group>
+      )
+    }
+
+    if (parameterRule.type === 'string' && !parameterRule.options?.length) {
+      return (
+        <input
+          className={cn(isInWorkflow ? 'w-[178px]' : 'w-full', 'system-sm-regular ml-4 flex h-8 appearance-none items-center rounded-lg bg-components-input-bg-normal px-3 text-components-input-text-filled outline-none')}
+          value={renderValue as string}
+          onChange={handleStringInputChange}
+        />
+      )
+    }
+
+    if (parameterRule.type === 'text') {
+      return (
+        <textarea
+          className='system-sm-regular ml-4 h-20 w-full rounded-lg bg-components-input-bg-normal px-1 text-components-input-text-filled'
+          value={renderValue as string}
+          onChange={handleStringInputChange}
+        />
+      )
+    }
+
+    if (parameterRule.type === 'string' && !!parameterRule?.options?.length) {
+      return (
+        <SimpleSelect
+          className='!py-0'
+          wrapperClassName={cn('!h-8 w-full')}
+          defaultValue={renderValue as string}
+          onSelect={handleSelect}
+          items={parameterRule.options.map(option => ({ value: option, name: option }))}
+        />
+      )
+    }
+
+    if (parameterRule.type === 'tag') {
+      return (
+        <div className={cn('!h-8 w-full')}>
+          <TagInput
+            items={renderValue as string[]}
+            onChange={handleTagChange}
+            customizedConfirmKey='Tab'
+            isInWorkflow={isInWorkflow}
+          />
+        </div>
+      )
+    }
+
+    return null
+  }
+
+  return (
+    <div className='mb-2 flex items-center justify-between'>
+      <div className='shrink-0 basis-1/2'>
+        <div className={cn('flex w-full shrink-0 items-center')}>
+          {
+            !parameterRule.required && parameterRule.name !== 'stop' && (
+              <div className='mr-2 w-7'>
+                <Switch
+                  defaultValue={!isNullOrUndefined(value)}
+                  onChange={handleSwitch}
+                  size='md'
+                />
+              </div>
+            )
+          }
+          <div
+            className='system-xs-regular mr-0.5 truncate text-text-secondary'
+            title={parameterRule.label[language] || parameterRule.label.en_US}
+          >
+            {parameterRule.label[language] || parameterRule.label.en_US}
+          </div>
+          {
+            parameterRule.help && (
+              <Tooltip
+                popupContent={(
+                  <div className='w-[178px] whitespace-pre-wrap'>{parameterRule.help[language] || parameterRule.help.en_US}</div>
+                )}
+                popupClassName='mr-1'
+                triggerClassName='mr-1 w-4 h-4 shrink-0'
+              />
+            )
+          }
+        </div>
+        {
+          parameterRule.type === 'tag' && (
+            <div className={cn(!isInWorkflow && 'w-[178px]', 'system-xs-regular text-text-tertiary')}>
+              {parameterRule?.tagPlaceholder?.[language]}
+            </div>
+          )
+        }
+      </div>
+      {renderInput()}
+    </div>
+  )
+}
+
+export default ParameterItem
diff --git a/app/components/header/account-setting/model-provider-page/model-parameter-modal/presets-parameter.tsx b/app/components/header/account-setting/model-provider-page/model-parameter-modal/presets-parameter.tsx
new file mode 100644
index 0000000..20a9bdc
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-parameter-modal/presets-parameter.tsx
@@ -0,0 +1,63 @@
+import type { FC } from 'react'
+import { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine } from '@remixicon/react'
+import Button from '@/app/components/base/button'
+import Dropdown from '@/app/components/base/dropdown'
+import { Brush01 } from '@/app/components/base/icons/src/vender/solid/editor'
+import { Scales02 } from '@/app/components/base/icons/src/vender/solid/FinanceAndECommerce'
+import { Target04 } from '@/app/components/base/icons/src/vender/solid/general'
+import { TONE_LIST } from '@/config'
+import cn from '@/utils/classnames'
+
+type PresetsParameterProps = {
+  onSelect: (toneId: number) => void
+}
+const PresetsParameter: FC<PresetsParameterProps> = ({
+  onSelect,
+}) => {
+  const { t } = useTranslation()
+  const renderTrigger = useCallback((open: boolean) => {
+    return (
+      <Button
+        size={'small'}
+        variant={'secondary'}
+        className={cn(open && 'bg-state-base-hover')}
+      >
+        {t('common.modelProvider.loadPresets')}
+        <RiArrowDownSLine className='ml-0.5 h-3.5 w-3.5' />
+      </Button>
+    )
+  }, [t])
+  const getToneIcon = (toneId: number) => {
+    const className = 'mr-2 w-[14px] h-[14px]'
+    const res = ({
+      1: <Brush01 className={`${className} text-[#6938EF]`} />,
+      2: <Scales02 className={`${className} text-indigo-600`} />,
+      3: <Target04 className={`${className} text-[#107569]`} />,
+    })[toneId]
+    return res
+  }
+  const options = TONE_LIST.slice(0, 3).map((tone) => {
+    return {
+      value: tone.id,
+      text: (
+        <div className='flex h-full items-center'>
+          {getToneIcon(tone.id)}
+          {t(`common.model.tone.${tone.name}`) as string}
+        </div>
+      ),
+    }
+  })
+
+  return (
+    <Dropdown
+      renderTrigger={renderTrigger}
+      items={options}
+      onSelect={item => onSelect(item.value as number)}
+      popupClassName='z-[1003]'
+    />
+  )
+}
+
+export default PresetsParameter
diff --git a/app/components/header/account-setting/model-provider-page/model-parameter-modal/status-indicators.tsx b/app/components/header/account-setting/model-provider-page/model-parameter-modal/status-indicators.tsx
new file mode 100644
index 0000000..02b8cb2
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-parameter-modal/status-indicators.tsx
@@ -0,0 +1,99 @@
+import Tooltip from '@/app/components/base/tooltip'
+import Link from 'next/link'
+import { SwitchPluginVersion } from '@/app/components/workflow/nodes/_base/components/switch-plugin-version'
+import { useInstalledPluginList } from '@/service/use-plugins'
+import { RiErrorWarningFill } from '@remixicon/react'
+
+type StatusIndicatorsProps = {
+  needsConfiguration: boolean
+  modelProvider: boolean
+  inModelList: boolean
+  disabled: boolean
+  pluginInfo: any
+  t: any
+}
+
+const StatusIndicators = ({ needsConfiguration, modelProvider, inModelList, disabled, pluginInfo, t }: StatusIndicatorsProps) => {
+  const { data: pluginList } = useInstalledPluginList()
+  const renderTooltipContent = (title: string, description?: string, linkText?: string, linkHref?: string) => {
+    return (
+      <div className='flex w-[240px] max-w-[240px] flex-col gap-1 px-1 py-1.5' onClick={e => e.stopPropagation()}>
+        <div className='title-xs-semi-bold text-text-primary'>{title}</div>
+        {description && (
+          <div className='body-xs-regular min-w-[200px] text-text-secondary'>
+            {description}
+          </div>
+        )}
+        {linkText && linkHref && (
+          <div className='body-xs-regular z-[100] cursor-pointer text-text-accent'>
+            <Link
+              href={linkHref}
+              onClick={(e) => {
+                e.stopPropagation()
+              }}
+            >
+              {linkText}
+            </Link>
+          </div>
+        )}
+      </div>
+    )
+  }
+  // const installedPluginUniqueIdentifier = pluginList?.plugins.find(plugin => plugin.name === pluginInfo.name)?.plugin_unique_identifier
+  return (
+    <>
+      {/* plugin installed and model is in model list but disabled */}
+      {/* plugin installed from github/local and model is not in model list */}
+      {!needsConfiguration && modelProvider && disabled && (
+        <>
+          {inModelList ? (
+            <Tooltip
+              popupContent={t('workflow.nodes.agent.modelSelectorTooltips.deprecated')}
+              asChild={false}
+              needsDelay={false}
+            >
+              <RiErrorWarningFill className='h-4 w-4 text-text-destructive' />
+            </Tooltip>
+          ) : !pluginInfo ? (
+            <Tooltip
+              popupContent={renderTooltipContent(
+                t('workflow.nodes.agent.modelNotSupport.title'),
+                t('workflow.nodes.agent.modelNotSupport.desc'),
+                t('workflow.nodes.agent.linkToPlugin'),
+                '/plugins',
+              )}
+              asChild={false}
+              needsDelay={true}
+            >
+              <RiErrorWarningFill className='h-4 w-4 text-text-destructive' />
+            </Tooltip>
+          ) : (
+            <SwitchPluginVersion
+              tooltip={renderTooltipContent(
+                t('workflow.nodes.agent.modelNotSupport.title'),
+                t('workflow.nodes.agent.modelNotSupport.descForVersionSwitch'),
+              )}
+              uniqueIdentifier={pluginList?.plugins.find(plugin => plugin.name === pluginInfo.name)?.plugin_unique_identifier ?? ''}
+            />
+          )}
+        </>
+      )}
+      {!modelProvider && !pluginInfo && (
+        <Tooltip
+          popupContent={renderTooltipContent(
+            t('workflow.nodes.agent.modelNotInMarketplace.title'),
+            t('workflow.nodes.agent.modelNotInMarketplace.desc'),
+            t('workflow.nodes.agent.linkToPlugin'),
+            '/plugins',
+          )}
+          asChild={false}
+          needsDelay
+        >
+          <RiErrorWarningFill className='h-4 w-4 text-text-destructive' />
+        </Tooltip>
+      )}
+    </>
+  )
+}
+
+export default StatusIndicators
diff --git a/app/components/header/account-setting/model-provider-page/model-parameter-modal/trigger.tsx b/app/components/header/account-setting/model-provider-page/model-parameter-modal/trigger.tsx
new file mode 100644
index 0000000..7c96c9a
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-parameter-modal/trigger.tsx
@@ -0,0 +1,112 @@
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine } from '@remixicon/react'
+import type {
+  Model,
+  ModelItem,
+  ModelProvider,
+} from '../declarations'
+import { MODEL_STATUS_TEXT } from '../declarations'
+import { useLanguage } from '../hooks'
+import ModelIcon from '../model-icon'
+import ModelName from '../model-name'
+import cn from '@/utils/classnames'
+import { useProviderContext } from '@/context/provider-context'
+import { SlidersH } from '@/app/components/base/icons/src/vender/line/mediaAndDevices'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/line/alertsAndFeedback'
+import Tooltip from '@/app/components/base/tooltip'
+
+export type TriggerProps = {
+  open?: boolean
+  disabled?: boolean
+  currentProvider?: ModelProvider | Model
+  currentModel?: ModelItem
+  providerName?: string
+  modelId?: string
+  hasDeprecated?: boolean
+  modelDisabled?: boolean
+  isInWorkflow?: boolean
+}
+const Trigger: FC<TriggerProps> = ({
+  disabled,
+  currentProvider,
+  currentModel,
+  providerName,
+  modelId,
+  hasDeprecated,
+  modelDisabled,
+  isInWorkflow,
+}) => {
+  const { t } = useTranslation()
+  const language = useLanguage()
+  const { modelProviders } = useProviderContext()
+
+  return (
+    <div
+      className={cn(
+        'relative flex h-8 cursor-pointer items-center rounded-lg  px-2',
+        !isInWorkflow && 'border ring-inset hover:ring-[0.5px]',
+        !isInWorkflow && (disabled ? 'border-text-warning bg-state-warning-hover ring-text-warning' : 'border-util-colors-indigo-indigo-600 bg-state-accent-hover ring-util-colors-indigo-indigo-600'),
+        isInWorkflow && 'border border-workflow-block-parma-bg bg-workflow-block-parma-bg pr-[30px]  hover:border-components-input-border-active',
+      )}
+    >
+      {
+        currentProvider && (
+          <ModelIcon
+            className='mr-1.5 !h-5 !w-5'
+            provider={currentProvider}
+            modelName={currentModel?.model}
+          />
+        )
+      }
+      {
+        !currentProvider && (
+          <ModelIcon
+            className='mr-1.5 !h-5 !w-5'
+            provider={modelProviders.find(item => item.provider === providerName)}
+            modelName={modelId}
+          />
+        )
+      }
+      {
+        currentModel && (
+          <ModelName
+            className='mr-1.5 text-text-primary'
+            modelItem={currentModel}
+            showMode
+            showFeatures
+          />
+        )
+      }
+      {
+        !currentModel && (
+          <div className='mr-1 truncate text-[13px] font-medium text-text-primary'>
+            {modelId}
+          </div>
+        )
+      }
+      {
+        disabled
+          ? (
+            <Tooltip
+              popupContent={
+                hasDeprecated
+                  ? t('common.modelProvider.deprecated')
+                  : (modelDisabled && currentModel)
+                    ? MODEL_STATUS_TEXT[currentModel.status as string][language]
+                    : ''
+              }
+            >
+              <AlertTriangle className='h-4 w-4 text-[#F79009]' />
+            </Tooltip>
+          )
+          : (
+            <SlidersH className={cn(!isInWorkflow ? 'text-indigo-600' : 'text-text-tertiary', 'h-4 w-4 shrink-0')} />
+          )
+      }
+      {isInWorkflow && (<RiArrowDownSLine className='absolute right-2 top-[9px] h-3.5 w-3.5 text-text-tertiary' />)}
+    </div>
+  )
+}
+
+export default Trigger
diff --git a/app/components/header/account-setting/model-provider-page/model-selector/deprecated-model-trigger.tsx b/app/components/header/account-setting/model-provider-page/model-selector/deprecated-model-trigger.tsx
new file mode 100644
index 0000000..0b01635
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-selector/deprecated-model-trigger.tsx
@@ -0,0 +1,54 @@
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import ModelIcon from '../model-icon'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/line/alertsAndFeedback'
+import { useProviderContext } from '@/context/provider-context'
+import Tooltip from '@/app/components/base/tooltip'
+import cn from '@/utils/classnames'
+
+type ModelTriggerProps = {
+  modelName: string
+  providerName: string
+  className?: string
+  showWarnIcon?: boolean
+  contentClassName?: string
+}
+const ModelTrigger: FC<ModelTriggerProps> = ({
+  modelName,
+  providerName,
+  className,
+  showWarnIcon,
+  contentClassName,
+}) => {
+  const { t } = useTranslation()
+  const { modelProviders } = useProviderContext()
+  const currentProvider = modelProviders.find(provider => provider.provider === providerName)
+
+  return (
+    <div
+      className={cn('group box-content flex h-8 grow cursor-pointer items-center gap-1 rounded-lg bg-components-input-bg-disabled p-[3px] pl-1', className)}
+    >
+      <div className={cn('flex w-full items-center', contentClassName)}>
+        <div className='flex min-w-0 flex-1 items-center gap-1 py-[1px]'>
+          <ModelIcon
+            className="h-4 w-4"
+            provider={currentProvider}
+            modelName={modelName}
+          />
+          <div className='system-sm-regular truncate text-components-input-text-filled'>
+            {modelName}
+          </div>
+        </div>
+        <div className='flex shrink-0 items-center justify-center'>
+          {showWarnIcon && (
+            <Tooltip popupContent={t('common.modelProvider.deprecated')}>
+              <AlertTriangle className='h-4 w-4 text-text-warning-secondary' />
+            </Tooltip>
+          )}
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default ModelTrigger
diff --git a/app/components/header/account-setting/model-provider-page/model-selector/empty-trigger.tsx b/app/components/header/account-setting/model-provider-page/model-selector/empty-trigger.tsx
new file mode 100644
index 0000000..613b1c0
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-selector/empty-trigger.tsx
@@ -0,0 +1,40 @@
+import type { FC } from 'react'
+import { RiEqualizer2Line } from '@remixicon/react'
+import { CubeOutline } from '@/app/components/base/icons/src/vender/line/shapes'
+import cn from '@/utils/classnames'
+import { useTranslation } from 'react-i18next'
+type ModelTriggerProps = {
+  open: boolean
+  className?: string
+}
+const ModelTrigger: FC<ModelTriggerProps> = ({
+  open,
+  className,
+}) => {
+  const { t } = useTranslation()
+  return (
+    <div
+      className={cn(
+        'flex cursor-pointer items-center gap-0.5 rounded-lg bg-components-input-bg-normal p-1 hover:bg-components-input-bg-hover', open && 'bg-components-input-bg-hover',
+        className,
+      )}
+    >
+      <div className='flex grow items-center'>
+        <div className='mr-1.5 flex h-4 w-4 items-center justify-center rounded-[5px] border border-dashed border-divider-regular'>
+          <CubeOutline className='h-3 w-3 text-text-quaternary' />
+        </div>
+        <div
+          className='truncate text-[13px] text-text-tertiary'
+          title='Configure model'
+        >
+          {t('plugin.detailPanel.configureModel')}
+        </div>
+      </div>
+      <div className='flex h-4 w-4 shrink-0 items-center justify-center'>
+        <RiEqualizer2Line className='h-3.5 w-3.5 text-text-tertiary' />
+      </div>
+    </div>
+  )
+}
+
+export default ModelTrigger
diff --git a/app/components/header/account-setting/model-provider-page/model-selector/feature-icon.tsx b/app/components/header/account-setting/model-provider-page/model-selector/feature-icon.tsx
new file mode 100644
index 0000000..b9422a8
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-selector/feature-icon.tsx
@@ -0,0 +1,124 @@
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import ModelBadge from '../model-badge'
+import {
+  ModelFeatureEnum,
+  ModelFeatureTextEnum,
+} from '../declarations'
+import {
+  AudioSupportIcon,
+  DocumentSupportIcon,
+  // MagicBox,
+  MagicEyes,
+  // MagicWand,
+  // Robot,
+  VideoSupportIcon,
+} from '@/app/components/base/icons/src/vender/solid/mediaAndDevices'
+import Tooltip from '@/app/components/base/tooltip'
+
+type FeatureIconProps = {
+  feature: ModelFeatureEnum
+  className?: string
+}
+const FeatureIcon: FC<FeatureIconProps> = ({
+  className,
+  feature,
+}) => {
+  const { t } = useTranslation()
+
+  // if (feature === ModelFeatureEnum.agentThought) {
+  //   return (
+  //     <Tooltip
+  //       popupContent={t('common.modelProvider.featureSupported', { feature: ModelFeatureTextEnum.agentThought })}
+  //     >
+  //       <ModelBadge className={`mr-0.5 !px-0 w-[18px] justify-center text-gray-500 ${className}`}>
+  //         <Robot className='w-3 h-3' />
+  //       </ModelBadge>
+  //     </Tooltip>
+  //   )
+  // }
+
+  // if (feature === ModelFeatureEnum.toolCall) {
+  //   return (
+  //     <Tooltip
+  //       popupContent={t('common.modelProvider.featureSupported', { feature: ModelFeatureTextEnum.toolCall })}
+  //     >
+  //       <ModelBadge className={`mr-0.5 !px-0 w-[18px] justify-center text-gray-500 ${className}`}>
+  //         <MagicWand className='w-3 h-3' />
+  //       </ModelBadge>
+  //     </Tooltip>
+  //   )
+  // }
+
+  // if (feature === ModelFeatureEnum.multiToolCall) {
+  //   return (
+  //     <Tooltip
+  //       popupContent={t('common.modelProvider.featureSupported', { feature: ModelFeatureTextEnum.multiToolCall })}
+  //     >
+  //       <ModelBadge className={`mr-0.5 !px-0 w-[18px] justify-center text-gray-500 ${className}`}>
+  //         <MagicBox className='w-3 h-3' />
+  //       </ModelBadge>
+  //     </Tooltip>
+  //   )
+  // }
+
+  if (feature === ModelFeatureEnum.vision) {
+    return (
+      <Tooltip
+        popupContent={t('common.modelProvider.featureSupported', { feature: ModelFeatureTextEnum.vision })}
+      >
+        <div className='inline-block cursor-help'>
+          <ModelBadge className={`w-[18px] justify-center !px-0 text-text-tertiary ${className}`}>
+            <MagicEyes className='h-3 w-3' />
+          </ModelBadge>
+        </div>
+      </Tooltip>
+    )
+  }
+
+  if (feature === ModelFeatureEnum.document) {
+    return (
+      <Tooltip
+        popupContent={t('common.modelProvider.featureSupported', { feature: ModelFeatureTextEnum.document })}
+      >
+        <div className='inline-block cursor-help'>
+          <ModelBadge className={`w-[18px] justify-center !px-0 text-text-tertiary ${className}`}>
+            <DocumentSupportIcon className='h-3 w-3' />
+          </ModelBadge>
+        </div>
+      </Tooltip>
+    )
+  }
+
+  if (feature === ModelFeatureEnum.audio) {
+    return (
+      <Tooltip
+        popupContent={t('common.modelProvider.featureSupported', { feature: ModelFeatureTextEnum.audio })}
+      >
+        <div className='inline-block cursor-help'>
+          <ModelBadge className={`w-[18px] justify-center !px-0 text-text-tertiary ${className}`}>
+            <AudioSupportIcon className='h-3 w-3' />
+          </ModelBadge>
+        </div>
+      </Tooltip>
+    )
+  }
+
+  if (feature === ModelFeatureEnum.video) {
+    return (
+      <Tooltip
+        popupContent={t('common.modelProvider.featureSupported', { feature: ModelFeatureTextEnum.video })}
+      >
+        <div className='inline-block cursor-help'>
+          <ModelBadge className={`w-[18px] justify-center !px-0 text-text-tertiary ${className}`}>
+            <VideoSupportIcon className='h-3 w-3' />
+          </ModelBadge>
+        </div>
+      </Tooltip>
+    )
+  }
+
+  return null
+}
+
+export default FeatureIcon
diff --git a/app/components/header/account-setting/model-provider-page/model-selector/index.tsx b/app/components/header/account-setting/model-provider-page/model-selector/index.tsx
new file mode 100644
index 0000000..d28959a
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-selector/index.tsx
@@ -0,0 +1,122 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import type {
+  DefaultModel,
+  Model,
+  ModelItem,
+} from '../declarations'
+import { useCurrentProviderAndModel } from '../hooks'
+import ModelTrigger from './model-trigger'
+import EmptyTrigger from './empty-trigger'
+import DeprecatedModelTrigger from './deprecated-model-trigger'
+import Popup from './popup'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import classNames from '@/utils/classnames'
+
+type ModelSelectorProps = {
+  defaultModel?: DefaultModel
+  modelList: Model[]
+  triggerClassName?: string
+  popupClassName?: string
+  onSelect?: (model: DefaultModel) => void
+  readonly?: boolean
+  scopeFeatures?: string[]
+  deprecatedClassName?: string
+  showDeprecatedWarnIcon?: boolean
+}
+const ModelSelector: FC<ModelSelectorProps> = ({
+  defaultModel,
+  modelList,
+  triggerClassName,
+  popupClassName,
+  onSelect,
+  readonly,
+  scopeFeatures = [],
+  deprecatedClassName,
+  showDeprecatedWarnIcon = false,
+}) => {
+  const [open, setOpen] = useState(false)
+  const {
+    currentProvider,
+    currentModel,
+  } = useCurrentProviderAndModel(
+    modelList,
+    defaultModel,
+  )
+
+  const handleSelect = (provider: string, model: ModelItem) => {
+    setOpen(false)
+
+    if (onSelect)
+      onSelect({ provider, model: model.model })
+  }
+
+  const handleToggle = () => {
+    if (readonly)
+      return
+
+    setOpen(v => !v)
+  }
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <div className={classNames('relative')}>
+        <PortalToFollowElemTrigger
+          onClick={handleToggle}
+          className='block'
+        >
+          {
+            currentModel && currentProvider && (
+              <ModelTrigger
+                open={open}
+                provider={currentProvider}
+                model={currentModel}
+                className={triggerClassName}
+                readonly={readonly}
+              />
+            )
+          }
+          {
+            !currentModel && defaultModel && (
+              <DeprecatedModelTrigger
+                modelName={defaultModel?.model || ''}
+                providerName={defaultModel?.provider || ''}
+                className={triggerClassName}
+                showWarnIcon={showDeprecatedWarnIcon}
+                contentClassName={deprecatedClassName}
+              />
+            )
+          }
+          {
+            !defaultModel && (
+              <EmptyTrigger
+                open={open}
+                className={triggerClassName}
+              />
+            )
+          }
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className={`z-[1002] ${popupClassName}`}>
+          <Popup
+            defaultModel={defaultModel}
+            modelList={modelList}
+            onSelect={handleSelect}
+            scopeFeatures={scopeFeatures}
+            onHide={() => setOpen(false)}
+          />
+        </PortalToFollowElemContent>
+      </div>
+    </PortalToFollowElem>
+  )
+}
+
+export default ModelSelector
diff --git a/app/components/header/account-setting/model-provider-page/model-selector/model-trigger.tsx b/app/components/header/account-setting/model-provider-page/model-selector/model-trigger.tsx
new file mode 100644
index 0000000..079bad7
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-selector/model-trigger.tsx
@@ -0,0 +1,78 @@
+import type { FC } from 'react'
+import { RiArrowDownSLine } from '@remixicon/react'
+import type {
+  Model,
+  ModelItem,
+} from '../declarations'
+import {
+  MODEL_STATUS_TEXT,
+  ModelStatusEnum,
+} from '../declarations'
+import { useLanguage } from '../hooks'
+import ModelIcon from '../model-icon'
+import ModelName from '../model-name'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/line/alertsAndFeedback'
+import Tooltip from '@/app/components/base/tooltip'
+import cn from '@/utils/classnames'
+
+type ModelTriggerProps = {
+  open: boolean
+  provider: Model
+  model: ModelItem
+  className?: string
+  readonly?: boolean
+}
+const ModelTrigger: FC<ModelTriggerProps> = ({
+  open,
+  provider,
+  model,
+  className,
+  readonly,
+}) => {
+  const language = useLanguage()
+
+  return (
+    <div
+      className={cn(
+        'group flex h-8 items-center gap-0.5 rounded-lg bg-components-input-bg-normal p-1',
+        !readonly && 'cursor-pointer hover:bg-components-input-bg-hover',
+        open && 'bg-components-input-bg-hover',
+        model.status !== ModelStatusEnum.active && 'bg-components-input-bg-disabled hover:bg-components-input-bg-disabled',
+        className,
+      )}
+    >
+      <ModelIcon
+        className='p-0.5'
+        provider={provider}
+        modelName={model.model}
+      />
+      <div className='flex grow items-center gap-1 truncate px-1 py-[3px]'>
+        <ModelName
+          className='grow'
+          modelItem={model}
+          showMode
+          showFeatures
+        />
+        {!readonly && (
+          <div className='flex h-4 w-4 shrink-0 items-center justify-center'>
+            {
+              model.status !== ModelStatusEnum.active
+                ? (
+                  <Tooltip popupContent={MODEL_STATUS_TEXT[model.status][language]}>
+                    <AlertTriangle className='h-4 w-4 text-text-warning-secondary' />
+                  </Tooltip>
+                )
+                : (
+                  <RiArrowDownSLine
+                    className='h-3.5 w-3.5 text-text-tertiary'
+                  />
+                )
+            }
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+
+export default ModelTrigger
diff --git a/app/components/header/account-setting/model-provider-page/model-selector/popup-item.tsx b/app/components/header/account-setting/model-provider-page/model-selector/popup-item.tsx
new file mode 100644
index 0000000..e536817
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-selector/popup-item.tsx
@@ -0,0 +1,195 @@
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiFileTextLine,
+  RiFilmAiLine,
+  RiImageCircleAiLine,
+  RiVoiceAiFill,
+} from '@remixicon/react'
+import type {
+  DefaultModel,
+  Model,
+  ModelItem,
+} from '../declarations'
+import {
+  ModelFeatureEnum,
+  ModelFeatureTextEnum,
+  ModelTypeEnum,
+} from '../declarations'
+import {
+  modelTypeFormat,
+  sizeFormat,
+} from '../utils'
+import {
+  useLanguage,
+  useUpdateModelList,
+  useUpdateModelProviders,
+} from '../hooks'
+import ModelIcon from '../model-icon'
+import ModelName from '../model-name'
+import ModelBadge from '../model-badge'
+import {
+  ConfigurationMethodEnum,
+  ModelStatusEnum,
+} from '../declarations'
+import { Check } from '@/app/components/base/icons/src/vender/line/general'
+import { useModalContext } from '@/context/modal-context'
+import { useProviderContext } from '@/context/provider-context'
+import Tooltip from '@/app/components/base/tooltip'
+import cn from '@/utils/classnames'
+
+type PopupItemProps = {
+  defaultModel?: DefaultModel
+  model: Model
+  onSelect: (provider: string, model: ModelItem) => void
+}
+const PopupItem: FC<PopupItemProps> = ({
+  defaultModel,
+  model,
+  onSelect,
+}) => {
+  const { t } = useTranslation()
+  const language = useLanguage()
+  const { setShowModelModal } = useModalContext()
+  const { modelProviders } = useProviderContext()
+  const updateModelList = useUpdateModelList()
+  const updateModelProviders = useUpdateModelProviders()
+  const currentProvider = modelProviders.find(provider => provider.provider === model.provider)!
+  const handleSelect = (provider: string, modelItem: ModelItem) => {
+    if (modelItem.status !== ModelStatusEnum.active)
+      return
+
+    onSelect(provider, modelItem)
+  }
+  const handleOpenModelModal = () => {
+    setShowModelModal({
+      payload: {
+        currentProvider,
+        currentConfigurationMethod: ConfigurationMethodEnum.predefinedModel,
+      },
+      onSaveCallback: () => {
+        updateModelProviders()
+
+        const modelType = model.models[0].model_type
+
+        if (modelType)
+          updateModelList(modelType)
+      },
+    })
+  }
+
+  return (
+    <div className='mb-1'>
+      <div className='flex h-[22px] items-center px-3 text-xs font-medium text-text-tertiary'>
+        {model.label[language] || model.label.en_US}
+      </div>
+      {
+        model.models.map(modelItem => (
+          <Tooltip
+            key={modelItem.model}
+            position='right'
+            popupClassName='p-3 !w-[206px] bg-components-panel-bg-blur backdrop-blur-sm border-[0.5px] border-components-panel-border rounded-xl'
+            popupContent={
+              <div className='flex flex-col gap-1'>
+                <div className='flex flex-col items-start gap-2'>
+                  <ModelIcon
+                    className={cn('h-5 w-5 shrink-0')}
+                    provider={model}
+                    modelName={modelItem.model}
+                  />
+                  <div className='system-md-medium text-wrap break-words text-text-primary'>{modelItem.label[language] || modelItem.label.en_US}</div>
+                </div>
+                {/* {currentProvider?.description && (
+                  <div className='text-text-tertiary system-xs-regular'>{currentProvider?.description?.[language] || currentProvider?.description?.en_US}</div>
+                )} */}
+                <div className='flex flex-wrap gap-1'>
+                  {modelItem.model_type && (
+                    <ModelBadge>
+                      {modelTypeFormat(modelItem.model_type)}
+                    </ModelBadge>
+                  )}
+                  {modelItem.model_properties.mode && (
+                    <ModelBadge>
+                      {(modelItem.model_properties.mode as string).toLocaleUpperCase()}
+                    </ModelBadge>
+                  )}
+                  {modelItem.model_properties.context_size && (
+                    <ModelBadge>
+                      {sizeFormat(modelItem.model_properties.context_size as number)}
+                    </ModelBadge>
+                  )}
+                </div>
+                {modelItem.model_type === ModelTypeEnum.textGeneration && modelItem.features?.some(feature => [ModelFeatureEnum.vision, ModelFeatureEnum.audio, ModelFeatureEnum.video, ModelFeatureEnum.document].includes(feature)) && (
+                  <div className='pt-2'>
+                    <div className='system-2xs-medium-uppercase mb-1 text-text-tertiary'>{t('common.model.capabilities')}</div>
+                    <div className='flex flex-wrap gap-1'>
+                      {modelItem.features?.includes(ModelFeatureEnum.vision) && (
+                        <ModelBadge>
+                          <RiImageCircleAiLine className='mr-0.5 h-3.5 w-3.5' />
+                          <span>{ModelFeatureTextEnum.vision}</span>
+                        </ModelBadge>
+                      )}
+                      {modelItem.features?.includes(ModelFeatureEnum.audio) && (
+                        <ModelBadge>
+                          <RiVoiceAiFill className='mr-0.5 h-3.5 w-3.5' />
+                          <span>{ModelFeatureTextEnum.audio}</span>
+                        </ModelBadge>
+                      )}
+                      {modelItem.features?.includes(ModelFeatureEnum.video) && (
+                        <ModelBadge>
+                          <RiFilmAiLine className='mr-0.5 h-3.5 w-3.5' />
+                          <span>{ModelFeatureTextEnum.video}</span>
+                        </ModelBadge>
+                      )}
+                      {modelItem.features?.includes(ModelFeatureEnum.document) && (
+                        <ModelBadge>
+                          <RiFileTextLine className='mr-0.5 h-3.5 w-3.5' />
+                          <span>{ModelFeatureTextEnum.document}</span>
+                        </ModelBadge>
+                      )}
+                    </div>
+                  </div>
+                )}
+              </div>
+            }
+          >
+            <div
+              key={modelItem.model}
+              className={cn('group relative flex h-8 items-center gap-1 rounded-lg px-3 py-1.5', modelItem.status === ModelStatusEnum.active ? 'cursor-pointer hover:bg-state-base-hover' : 'cursor-not-allowed hover:bg-state-base-hover-alt')}
+              onClick={() => handleSelect(model.provider, modelItem)}
+            >
+              <div className='flex items-center gap-2'>
+                <ModelIcon
+                  className={cn('h-5 w-5 shrink-0')}
+                  provider={model}
+                  modelName={modelItem.model}
+                />
+                <ModelName
+                  className={cn('system-sm-medium text-text-secondary', modelItem.status !== ModelStatusEnum.active && 'opacity-60')}
+                  modelItem={modelItem}
+                />
+              </div>
+              {
+                defaultModel?.model === modelItem.model && defaultModel.provider === currentProvider.provider && (
+                  <Check className='h-4 w-4 shrink-0 text-text-accent' />
+                )
+              }
+              {
+                modelItem.status === ModelStatusEnum.noConfigure && (
+                  <div
+                    className='hidden cursor-pointer text-xs font-medium text-text-accent group-hover:block'
+                    onClick={handleOpenModelModal}
+                  >
+                    {t('common.operation.add').toLocaleUpperCase()}
+                  </div>
+                )
+              }
+            </div>
+          </Tooltip>
+        ))
+      }
+    </div>
+  )
+}
+
+export default PopupItem
diff --git a/app/components/header/account-setting/model-provider-page/model-selector/popup.tsx b/app/components/header/account-setting/model-provider-page/model-selector/popup.tsx
new file mode 100644
index 0000000..63849bd
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/model-selector/popup.tsx
@@ -0,0 +1,121 @@
+import type { FC } from 'react'
+import { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowRightUpLine,
+  RiSearchLine,
+} from '@remixicon/react'
+import type {
+  DefaultModel,
+  Model,
+  ModelItem,
+} from '../declarations'
+import { ModelFeatureEnum } from '../declarations'
+import { useLanguage } from '../hooks'
+import PopupItem from './popup-item'
+import { XCircle } from '@/app/components/base/icons/src/vender/solid/general'
+import { useModalContext } from '@/context/modal-context'
+import { supportFunctionCall } from '@/utils/tool-call'
+
+type PopupProps = {
+  defaultModel?: DefaultModel
+  modelList: Model[]
+  onSelect: (provider: string, model: ModelItem) => void
+  scopeFeatures?: string[]
+  onHide: () => void
+}
+const Popup: FC<PopupProps> = ({
+  defaultModel,
+  modelList,
+  onSelect,
+  scopeFeatures = [],
+  onHide,
+}) => {
+  const { t } = useTranslation()
+  const language = useLanguage()
+  const [searchText, setSearchText] = useState('')
+  const { setShowAccountSettingModal } = useModalContext()
+
+  const filteredModelList = useMemo(() => {
+    return modelList.map((model) => {
+      const filteredModels = model.models
+        .filter((modelItem) => {
+          if (modelItem.label[language] !== undefined)
+            return modelItem.label[language].toLowerCase().includes(searchText.toLowerCase())
+          return Object.values(modelItem.label).some(label =>
+            label.toLowerCase().includes(searchText.toLowerCase()),
+          )
+        })
+        .filter((modelItem) => {
+          if (scopeFeatures.length === 0)
+            return true
+          return scopeFeatures.every((feature) => {
+            if (feature === ModelFeatureEnum.toolCall)
+              return supportFunctionCall(modelItem.features)
+            return modelItem.features?.some(featureItem => featureItem === feature)
+          })
+        })
+      return { ...model, models: filteredModels }
+    }).filter(model => model.models.length > 0)
+  }, [language, modelList, scopeFeatures, searchText])
+
+  return (
+    <div className='max-h-[480px] w-[320px] overflow-y-auto rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-lg'>
+      <div className='sticky top-0 z-10 bg-components-panel-bg pb-1 pl-3 pr-2 pt-3'>
+        <div className={`
+          flex h-8 items-center rounded-lg border pl-[9px] pr-[10px]
+          ${searchText ? 'border-components-input-border-active bg-components-input-bg-active shadow-xs' : 'border-transparent bg-components-input-bg-normal'}
+        `}>
+          <RiSearchLine
+            className={`
+              mr-[7px] h-[14px] w-[14px] shrink-0
+              ${searchText ? 'text-text-tertiary' : 'text-text-quaternary'}
+            `}
+          />
+          <input
+            className='block h-[18px] grow appearance-none bg-transparent text-[13px] text-text-primary outline-none'
+            placeholder={t('datasetSettings.form.searchModel') || ''}
+            value={searchText}
+            onChange={e => setSearchText(e.target.value)}
+          />
+          {
+            searchText && (
+              <XCircle
+                className='ml-1.5 h-[14px] w-[14px] shrink-0 cursor-pointer text-text-quaternary'
+                onClick={() => setSearchText('')}
+              />
+            )
+          }
+        </div>
+      </div>
+      <div className='p-1'>
+        {
+          filteredModelList.map(model => (
+            <PopupItem
+              key={model.provider}
+              defaultModel={defaultModel}
+              model={model}
+              onSelect={onSelect}
+            />
+          ))
+        }
+        {
+          !filteredModelList.length && (
+            <div className='break-all px-3 py-1.5 text-center text-xs leading-[18px] text-text-tertiary'>
+              {`No model found for 鈥�${searchText}鈥漙}
+            </div>
+          )
+        }
+      </div>
+      <div className='sticky bottom-0 flex cursor-pointer items-center rounded-b-lg border-t border-divider-subtle bg-components-panel-bg px-4 py-2 text-text-accent-light-mode-only' onClick={() => {
+        onHide()
+        setShowAccountSettingModal({ payload: 'provider' })
+      }}>
+        <span className='system-xs-medium'>{t('common.model.settingsLink')}</span>
+        <RiArrowRightUpLine className='ml-0.5 h-3 w-3' />
+      </div>
+    </div>
+  )
+}
+
+export default Popup
diff --git a/app/components/header/account-setting/model-provider-page/provider-added-card/add-model-button.tsx b/app/components/header/account-setting/model-provider-page/provider-added-card/add-model-button.tsx
new file mode 100644
index 0000000..fc9960f
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/provider-added-card/add-model-button.tsx
@@ -0,0 +1,27 @@
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { PlusCircle } from '@/app/components/base/icons/src/vender/solid/general'
+import cn from '@/utils/classnames'
+
+type AddModelButtonProps = {
+  className?: string
+  onClick: () => void
+}
+const AddModelButton: FC<AddModelButtonProps> = ({
+  className,
+  onClick,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <span
+      className={cn('system-xs-medium flex h-6 shrink-0 cursor-pointer items-center rounded-md px-1.5 text-text-tertiary hover:bg-components-button-ghost-bg-hover hover:text-components-button-ghost-text', className)}
+      onClick={onClick}
+    >
+      <PlusCircle className='mr-1 h-3 w-3' />
+      {t('common.modelProvider.addModel')}
+    </span>
+  )
+}
+
+export default AddModelButton
diff --git a/app/components/header/account-setting/model-provider-page/provider-added-card/cooldown-timer.tsx b/app/components/header/account-setting/model-provider-page/provider-added-card/cooldown-timer.tsx
new file mode 100644
index 0000000..dea3200
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/provider-added-card/cooldown-timer.tsx
@@ -0,0 +1,64 @@
+import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useLatest } from 'ahooks'
+import SimplePieChart from '@/app/components/base/simple-pie-chart'
+import Tooltip from '@/app/components/base/tooltip'
+
+export type CooldownTimerProps = {
+  secondsRemaining?: number
+  onFinish?: () => void
+}
+
+const CooldownTimer = ({ secondsRemaining, onFinish }: CooldownTimerProps) => {
+  const { t } = useTranslation()
+
+  const targetTime = useRef<number>(Date.now())
+  const [currentTime, setCurrentTime] = useState(targetTime.current)
+  const displayTime = useMemo(
+    () => Math.ceil((targetTime.current - currentTime) / 1000),
+    [currentTime],
+  )
+
+  const countdownTimeout = useRef<number>(undefined)
+  const clearCountdown = useCallback(() => {
+    if (countdownTimeout.current) {
+      window.clearTimeout(countdownTimeout.current)
+      countdownTimeout.current = undefined
+    }
+  }, [])
+
+  const onFinishRef = useLatest(onFinish)
+
+  const countdown = useCallback(() => {
+    clearCountdown()
+    countdownTimeout.current = window.setTimeout(() => {
+      const now = Date.now()
+      if (now <= targetTime.current) {
+        setCurrentTime(Date.now())
+        countdown()
+      }
+      else {
+        onFinishRef.current?.()
+        clearCountdown()
+      }
+    }, 1000)
+  }, [clearCountdown, onFinishRef])
+
+  useEffect(() => {
+    const now = Date.now()
+    targetTime.current = now + (secondsRemaining ?? 0) * 1000
+    setCurrentTime(now)
+    countdown()
+    return clearCountdown
+  }, [clearCountdown, countdown, secondsRemaining])
+
+  return displayTime
+    ? (
+      <Tooltip popupContent={t('common.modelProvider.apiKeyRateLimit', { seconds: displayTime })}>
+        <SimplePieChart percentage={Math.round(displayTime / 60 * 100)} className='h-3 w-3' />
+      </Tooltip>
+    )
+    : null
+}
+
+export default memo(CooldownTimer)
diff --git a/app/components/header/account-setting/model-provider-page/provider-added-card/credential-panel.tsx b/app/components/header/account-setting/model-provider-page/provider-added-card/credential-panel.tsx
new file mode 100644
index 0000000..822df5f
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/provider-added-card/credential-panel.tsx
@@ -0,0 +1,114 @@
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiEqualizer2Line } from '@remixicon/react'
+import type { ModelProvider } from '../declarations'
+import {
+  ConfigurationMethodEnum,
+  CustomConfigurationStatusEnum,
+  PreferredProviderTypeEnum,
+} from '../declarations'
+import {
+  useUpdateModelList,
+  useUpdateModelProviders,
+} from '../hooks'
+import PrioritySelector from './priority-selector'
+import PriorityUseTip from './priority-use-tip'
+import { UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST } from './index'
+import Indicator from '@/app/components/header/indicator'
+import Button from '@/app/components/base/button'
+import { changeModelProviderPriority } from '@/service/common'
+import { useToastContext } from '@/app/components/base/toast'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+
+type CredentialPanelProps = {
+  provider: ModelProvider
+  onSetup: () => void
+}
+const CredentialPanel: FC<CredentialPanelProps> = ({
+  provider,
+  onSetup,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const { eventEmitter } = useEventEmitterContextContext()
+  const updateModelList = useUpdateModelList()
+  const updateModelProviders = useUpdateModelProviders()
+  const customConfig = provider.custom_configuration
+  const systemConfig = provider.system_configuration
+  const priorityUseType = provider.preferred_provider_type
+  const isCustomConfigured = customConfig.status === CustomConfigurationStatusEnum.active
+  const configurateMethods = provider.configurate_methods
+
+  const handleChangePriority = async (key: PreferredProviderTypeEnum) => {
+    const res = await changeModelProviderPriority({
+      url: `/workspaces/current/model-providers/${provider.provider}/preferred-provider-type`,
+      body: {
+        preferred_provider_type: key,
+      },
+    })
+    if (res.result === 'success') {
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      updateModelProviders()
+
+      configurateMethods.forEach((method) => {
+        if (method === ConfigurationMethodEnum.predefinedModel)
+          provider.supported_model_types.forEach(modelType => updateModelList(modelType))
+      })
+
+      eventEmitter?.emit({
+        type: UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST,
+        payload: provider.provider,
+      } as any)
+    }
+  }
+
+  return (
+    <>
+      {
+        provider.provider_credential_schema && (
+          <div className='relative ml-1 w-[112px] shrink-0 rounded-lg border-[0.5px] border-components-panel-border bg-white/[0.18] p-1'>
+            <div className='system-xs-medium-uppercase mb-1 flex h-5 items-center justify-between pl-2 pr-[7px] pt-1 text-text-tertiary'>
+              API-KEY
+              <Indicator color={isCustomConfigured ? 'green' : 'red'} />
+            </div>
+            <div className='flex items-center gap-0.5'>
+              <Button
+                className='grow'
+                size='small'
+                onClick={onSetup}
+              >
+                <RiEqualizer2Line className='mr-1 h-3.5 w-3.5' />
+                {t('common.operation.setup')}
+              </Button>
+              {
+                systemConfig.enabled && isCustomConfigured && (
+                  <PrioritySelector
+                    value={priorityUseType}
+                    onSelect={handleChangePriority}
+                  />
+                )
+              }
+            </div>
+            {
+              priorityUseType === PreferredProviderTypeEnum.custom && systemConfig.enabled && (
+                <PriorityUseTip />
+              )
+            }
+          </div>
+        )
+      }
+      {
+        systemConfig.enabled && isCustomConfigured && !provider.provider_credential_schema && (
+          <div className='ml-1'>
+            <PrioritySelector
+              value={priorityUseType}
+              onSelect={handleChangePriority}
+            />
+          </div>
+        )
+      }
+    </>
+  )
+}
+
+export default CredentialPanel
diff --git a/app/components/header/account-setting/model-provider-page/provider-added-card/index.tsx b/app/components/header/account-setting/model-provider-page/provider-added-card/index.tsx
new file mode 100644
index 0000000..2ff9669
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/provider-added-card/index.tsx
@@ -0,0 +1,186 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowRightSLine,
+  RiInformation2Fill,
+  RiLoader2Line,
+} from '@remixicon/react'
+import type {
+  CustomConfigurationModelFixedFields,
+  ModelItem,
+  ModelProvider,
+} from '../declarations'
+import { ConfigurationMethodEnum } from '../declarations'
+import {
+  MODEL_PROVIDER_QUOTA_GET_PAID,
+  modelTypeFormat,
+} from '../utils'
+import ProviderIcon from '../provider-icon'
+import ModelBadge from '../model-badge'
+import CredentialPanel from './credential-panel'
+import QuotaPanel from './quota-panel'
+import ModelList from './model-list'
+import AddModelButton from './add-model-button'
+import { fetchModelProviderModelList } from '@/service/common'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { IS_CE_EDITION } from '@/config'
+import { useAppContext } from '@/context/app-context'
+import cn from '@/utils/classnames'
+
+export const UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST = 'UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST'
+type ProviderAddedCardProps = {
+  notConfigured?: boolean
+  provider: ModelProvider
+  onOpenModal: (configurationMethod: ConfigurationMethodEnum, currentCustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields) => void
+}
+const ProviderAddedCard: FC<ProviderAddedCardProps> = ({
+  notConfigured,
+  provider,
+  onOpenModal,
+}) => {
+  const { t } = useTranslation()
+  const { eventEmitter } = useEventEmitterContextContext()
+  const [fetched, setFetched] = useState(false)
+  const [loading, setLoading] = useState(false)
+  const [collapsed, setCollapsed] = useState(true)
+  const [modelList, setModelList] = useState<ModelItem[]>([])
+  const configurationMethods = provider.configurate_methods.filter(method => method !== ConfigurationMethodEnum.fetchFromRemote)
+  const systemConfig = provider.system_configuration
+  const hasModelList = fetched && !!modelList.length
+  const { isCurrentWorkspaceManager } = useAppContext()
+  const showQuota = systemConfig.enabled && [...MODEL_PROVIDER_QUOTA_GET_PAID].includes(provider.provider) && !IS_CE_EDITION
+  const showCredential = configurationMethods.includes(ConfigurationMethodEnum.predefinedModel) && isCurrentWorkspaceManager
+
+  const getModelList = async (providerName: string) => {
+    if (loading)
+      return
+    try {
+      setLoading(true)
+      const modelsData = await fetchModelProviderModelList(`/workspaces/current/model-providers/${providerName}/models`)
+      setModelList(modelsData.data)
+      setCollapsed(false)
+      setFetched(true)
+    }
+    finally {
+      setLoading(false)
+    }
+  }
+  const handleOpenModelList = () => {
+    if (fetched) {
+      setCollapsed(false)
+      return
+    }
+
+    getModelList(provider.provider)
+  }
+
+  eventEmitter?.useSubscription((v: any) => {
+    if (v?.type === UPDATE_MODEL_PROVIDER_CUSTOM_MODEL_LIST && v.payload === provider.provider)
+      getModelList(v.payload)
+  })
+
+  return (
+    <div
+      className={cn(
+        'mb-2 rounded-xl border-[0.5px] border-divider-regular bg-third-party-model-bg-default shadow-xs',
+        provider.provider === 'langgenius/openai/openai' && 'bg-third-party-model-bg-openai',
+        provider.provider === 'langgenius/anthropic/anthropic' && 'bg-third-party-model-bg-anthropic',
+      )}
+    >
+      <div className='flex rounded-t-xl py-2 pl-3 pr-2'>
+        <div className='grow px-1 pb-0.5 pt-1'>
+          <ProviderIcon
+            className='mb-2'
+            provider={provider}
+          />
+          <div className='flex gap-0.5'>
+            {
+              provider.supported_model_types.map(modelType => (
+                <ModelBadge key={modelType}>
+                  {modelTypeFormat(modelType)}
+                </ModelBadge>
+              ))
+            }
+          </div>
+        </div>
+        {
+          showQuota && (
+            <QuotaPanel
+              provider={provider}
+            />
+          )
+        }
+        {
+          showCredential && (
+            <CredentialPanel
+              onSetup={() => onOpenModal(ConfigurationMethodEnum.predefinedModel)}
+              provider={provider}
+            />
+          )
+        }
+      </div>
+      {
+        collapsed && (
+          <div className='system-xs-medium group flex items-center justify-between border-t border-t-divider-subtle py-1.5 pl-2 pr-[11px] text-text-tertiary'>
+            {(showQuota || !notConfigured) && (
+              <>
+                <div className='flex h-6 items-center pl-1 pr-1.5 leading-6 group-hover:hidden'>
+                  {
+                    hasModelList
+                      ? t('common.modelProvider.modelsNum', { num: modelList.length })
+                      : t('common.modelProvider.showModels')
+                  }
+                  {!loading && <RiArrowRightSLine className='h-4 w-4' />}
+                </div>
+                <div
+                  className='hidden h-6 cursor-pointer items-center rounded-lg pl-1 pr-1.5 hover:bg-components-button-ghost-bg-hover group-hover:flex'
+                  onClick={handleOpenModelList}
+                >
+                  {
+                    hasModelList
+                      ? t('common.modelProvider.showModelsNum', { num: modelList.length })
+                      : t('common.modelProvider.showModels')
+                  }
+                  {!loading && <RiArrowRightSLine className='h-4 w-4' />}
+                  {
+                    loading && (
+                      <RiLoader2Line className='ml-0.5 h-3 w-3 animate-spin' />
+                    )
+                  }
+                </div>
+              </>
+            )}
+            {!showQuota && notConfigured && (
+              <div className='flex h-6 items-center pl-1 pr-1.5'>
+                <RiInformation2Fill className='mr-1 h-4 w-4 text-text-accent' />
+                <span className='system-xs-medium text-text-secondary'>{t('common.modelProvider.configureTip')}</span>
+              </div>
+            )}
+            {
+              configurationMethods.includes(ConfigurationMethodEnum.customizableModel) && isCurrentWorkspaceManager && (
+                <AddModelButton
+                  onClick={() => onOpenModal(ConfigurationMethodEnum.customizableModel)}
+                  className='flex'
+                />
+              )
+            }
+          </div>
+        )
+      }
+      {
+        !collapsed && (
+          <ModelList
+            provider={provider}
+            models={modelList}
+            onCollapse={() => setCollapsed(true)}
+            onConfig={currentCustomConfigurationModelFixedFields => onOpenModal(ConfigurationMethodEnum.customizableModel, currentCustomConfigurationModelFixedFields)}
+            onChange={(provider: string) => getModelList(provider)}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default ProviderAddedCard
diff --git a/app/components/header/account-setting/model-provider-page/provider-added-card/model-list-item.tsx b/app/components/header/account-setting/model-provider-page/provider-added-card/model-list-item.tsx
new file mode 100644
index 0000000..62ad425
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/provider-added-card/model-list-item.tsx
@@ -0,0 +1,128 @@
+import { memo, useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useDebounceFn } from 'ahooks'
+import type { CustomConfigurationModelFixedFields, ModelItem, ModelProvider } from '../declarations'
+import { ConfigurationMethodEnum, ModelStatusEnum } from '../declarations'
+import ModelBadge from '../model-badge'
+import ModelIcon from '../model-icon'
+import ModelName from '../model-name'
+import classNames from '@/utils/classnames'
+import Button from '@/app/components/base/button'
+import { Balance } from '@/app/components/base/icons/src/vender/line/financeAndECommerce'
+import { Settings01 } from '@/app/components/base/icons/src/vender/line/general'
+import Switch from '@/app/components/base/switch'
+import Tooltip from '@/app/components/base/tooltip'
+import { useProviderContext, useProviderContextSelector } from '@/context/provider-context'
+import { disableModel, enableModel } from '@/service/common'
+import { Plan } from '@/app/components/billing/type'
+import { useAppContext } from '@/context/app-context'
+
+export type ModelListItemProps = {
+  model: ModelItem
+  provider: ModelProvider
+  isConfigurable: boolean
+  onConfig: (currentCustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields) => void
+  onModifyLoadBalancing?: (model: ModelItem) => void
+}
+
+const ModelListItem = ({ model, provider, isConfigurable, onConfig, onModifyLoadBalancing }: ModelListItemProps) => {
+  const { t } = useTranslation()
+  const { plan } = useProviderContext()
+  const modelLoadBalancingEnabled = useProviderContextSelector(state => state.modelLoadBalancingEnabled)
+  const { isCurrentWorkspaceManager } = useAppContext()
+
+  const toggleModelEnablingStatus = useCallback(async (enabled: boolean) => {
+    if (enabled)
+      await enableModel(`/workspaces/current/model-providers/${provider.provider}/models/enable`, { model: model.model, model_type: model.model_type })
+    else
+      await disableModel(`/workspaces/current/model-providers/${provider.provider}/models/disable`, { model: model.model, model_type: model.model_type })
+  }, [model.model, model.model_type, provider.provider])
+
+  const { run: debouncedToggleModelEnablingStatus } = useDebounceFn(toggleModelEnablingStatus, { wait: 500 })
+
+  const onEnablingStateChange = useCallback(async (value: boolean) => {
+    debouncedToggleModelEnablingStatus(value)
+  }, [debouncedToggleModelEnablingStatus])
+
+  return (
+    <div
+      key={model.model}
+      className={classNames(
+        'group flex items-center pl-2 pr-2.5 h-8 rounded-lg',
+        isConfigurable && 'hover:bg-components-panel-on-panel-item-bg-hover',
+        model.deprecated && 'opacity-60',
+      )}
+    >
+      <ModelIcon
+        className='mr-2 shrink-0'
+        provider={provider}
+        modelName={model.model}
+      />
+      <ModelName
+        className='system-md-regular grow text-text-secondary'
+        modelItem={model}
+        showModelType
+        showMode
+        showContextSize
+      >
+        {modelLoadBalancingEnabled && !model.deprecated && model.load_balancing_enabled && (
+          <ModelBadge className='ml-1 border-text-accent-secondary uppercase text-text-accent-secondary'>
+            <Balance className='mr-0.5 h-3 w-3' />
+            {t('common.modelProvider.loadBalancingHeadline')}
+          </ModelBadge>
+        )}
+      </ModelName>
+      <div className='flex shrink-0 items-center'>
+        {
+          model.fetch_from === ConfigurationMethodEnum.customizableModel
+            ? (isCurrentWorkspaceManager && (
+              <Button
+                size='small'
+                className='hidden group-hover:flex'
+                onClick={() => onConfig({ __model_name: model.model, __model_type: model.model_type })}
+              >
+                <Settings01 className='mr-1 h-3.5 w-3.5' />
+                {t('common.modelProvider.config')}
+              </Button>
+            ))
+            : (isCurrentWorkspaceManager && (modelLoadBalancingEnabled || plan.type === Plan.sandbox) && !model.deprecated && [ModelStatusEnum.active, ModelStatusEnum.disabled].includes(model.status))
+              ? (
+                <Button
+                  size='small'
+                  className='opacity-0 transition-opacity group-hover:opacity-100'
+                  onClick={() => onModifyLoadBalancing?.(model)}
+                >
+                  <Balance className='mr-1 h-3.5 w-3.5' />
+                  {t('common.modelProvider.configLoadBalancing')}
+                </Button>
+              )
+              : null
+        }
+        {
+          model.deprecated
+            ? (
+              <Tooltip
+                popupContent={
+                  <span className='font-semibold'>{t('common.modelProvider.modelHasBeenDeprecated')}</span>} offset={{ mainAxis: 4 }
+                }
+                needsDelay
+              >
+                <Switch defaultValue={false} disabled size='md' />
+              </Tooltip>
+            )
+            : (isCurrentWorkspaceManager && (
+              <Switch
+                className='ml-2'
+                defaultValue={model?.status === ModelStatusEnum.active}
+                disabled={![ModelStatusEnum.active, ModelStatusEnum.disabled].includes(model.status)}
+                size='md'
+                onChange={onEnablingStateChange}
+              />
+            ))
+        }
+      </div>
+    </div>
+  )
+}
+
+export default memo(ModelListItem)
diff --git a/app/components/header/account-setting/model-provider-page/provider-added-card/model-list.tsx b/app/components/header/account-setting/model-provider-page/provider-added-card/model-list.tsx
new file mode 100644
index 0000000..699be6e
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/provider-added-card/model-list.tsx
@@ -0,0 +1,102 @@
+import type { FC } from 'react'
+import { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowRightSLine,
+} from '@remixicon/react'
+import type {
+  CustomConfigurationModelFixedFields,
+  ModelItem,
+  ModelProvider,
+} from '../declarations'
+import {
+  ConfigurationMethodEnum,
+} from '../declarations'
+// import Tab from './tab'
+import AddModelButton from './add-model-button'
+import ModelListItem from './model-list-item'
+import { useModalContextSelector } from '@/context/modal-context'
+import { useAppContext } from '@/context/app-context'
+
+type ModelListProps = {
+  provider: ModelProvider
+  models: ModelItem[]
+  onCollapse: () => void
+  onConfig: (currentCustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields) => void
+  onChange?: (provider: string) => void
+}
+const ModelList: FC<ModelListProps> = ({
+  provider,
+  models,
+  onCollapse,
+  onConfig,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const configurativeMethods = provider.configurate_methods.filter(method => method !== ConfigurationMethodEnum.fetchFromRemote)
+  const { isCurrentWorkspaceManager } = useAppContext()
+  const isConfigurable = configurativeMethods.includes(ConfigurationMethodEnum.customizableModel)
+
+  const setShowModelLoadBalancingModal = useModalContextSelector(state => state.setShowModelLoadBalancingModal)
+  const onModifyLoadBalancing = useCallback((model: ModelItem) => {
+    setShowModelLoadBalancingModal({
+      provider,
+      model: model!,
+      open: !!model,
+      onClose: () => setShowModelLoadBalancingModal(null),
+      onSave: onChange,
+    })
+  }, [onChange, provider, setShowModelLoadBalancingModal])
+
+  return (
+    <div className='rounded-b-xl px-2 pb-2'>
+      <div className='rounded-lg bg-components-panel-bg py-1'>
+        <div className='flex items-center pl-1 pr-[3px]'>
+          <span className='group mr-2 flex shrink-0 items-center'>
+            <span className='system-xs-medium inline-flex h-6 items-center pl-1 pr-1.5 text-text-tertiary group-hover:hidden'>
+              {t('common.modelProvider.modelsNum', { num: models.length })}
+              <RiArrowRightSLine className='mr-0.5 h-4 w-4 rotate-90' />
+            </span>
+            <span
+              className='system-xs-medium hidden h-6 cursor-pointer items-center rounded-lg bg-state-base-hover pl-1 pr-1.5 text-text-tertiary group-hover:inline-flex'
+              onClick={() => onCollapse()}
+            >
+              {t('common.modelProvider.modelsNum', { num: models.length })}
+              <RiArrowRightSLine className='mr-0.5 h-4 w-4 rotate-90' />
+            </span>
+          </span>
+          {/* {
+            isConfigurable && canSystemConfig && (
+              <span className='flex items-center'>
+                <Tab active='all' onSelect={() => {}} />
+              </span>
+            )
+          } */}
+          {
+            isConfigurable && isCurrentWorkspaceManager && (
+              <div className='flex grow justify-end'>
+                <AddModelButton onClick={() => onConfig()} />
+              </div>
+            )
+          }
+        </div>
+        {
+          models.map(model => (
+            <ModelListItem
+              key={model.model}
+              {...{
+                model,
+                provider,
+                isConfigurable,
+                onConfig,
+                onModifyLoadBalancing,
+              }}
+            />
+          ))
+        }
+      </div>
+    </div>
+  )
+}
+
+export default ModelList
diff --git a/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-configs.tsx b/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-configs.tsx
new file mode 100644
index 0000000..f63eef4
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-configs.tsx
@@ -0,0 +1,274 @@
+import type { Dispatch, SetStateAction } from 'react'
+import { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiDeleteBinLine,
+} from '@remixicon/react'
+import type { ConfigurationMethodEnum, CustomConfigurationModelFixedFields, ModelLoadBalancingConfig, ModelLoadBalancingConfigEntry, ModelProvider } from '../declarations'
+import Indicator from '../../../indicator'
+import CooldownTimer from './cooldown-timer'
+import classNames from '@/utils/classnames'
+import Tooltip from '@/app/components/base/tooltip'
+import Switch from '@/app/components/base/switch'
+import { Balance } from '@/app/components/base/icons/src/vender/line/financeAndECommerce'
+import { Edit02, Plus02 } from '@/app/components/base/icons/src/vender/line/general'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback'
+import { useModalContextSelector } from '@/context/modal-context'
+import UpgradeBtn from '@/app/components/billing/upgrade-btn'
+import s from '@/app/components/custom/style.module.css'
+import GridMask from '@/app/components/base/grid-mask'
+import { useProviderContextSelector } from '@/context/provider-context'
+import { IS_CE_EDITION } from '@/config'
+
+export type ModelLoadBalancingConfigsProps = {
+  draftConfig?: ModelLoadBalancingConfig
+  setDraftConfig: Dispatch<SetStateAction<ModelLoadBalancingConfig | undefined>>
+  provider: ModelProvider
+  configurationMethod: ConfigurationMethodEnum
+  currentCustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields
+  withSwitch?: boolean
+  className?: string
+}
+
+const ModelLoadBalancingConfigs = ({
+  draftConfig,
+  setDraftConfig,
+  provider,
+  configurationMethod,
+  currentCustomConfigurationModelFixedFields,
+  withSwitch = false,
+  className,
+}: ModelLoadBalancingConfigsProps) => {
+  const { t } = useTranslation()
+  const modelLoadBalancingEnabled = useProviderContextSelector(state => state.modelLoadBalancingEnabled)
+
+  const updateConfigEntry = useCallback(
+    (
+      index: number,
+      modifier: (entry: ModelLoadBalancingConfigEntry) => ModelLoadBalancingConfigEntry | undefined,
+    ) => {
+      setDraftConfig((prev) => {
+        if (!prev)
+          return prev
+        const newConfigs = [...prev.configs]
+        const modifiedConfig = modifier(newConfigs[index])
+        if (modifiedConfig)
+          newConfigs[index] = modifiedConfig
+        else
+          newConfigs.splice(index, 1)
+        return {
+          ...prev,
+          configs: newConfigs,
+        }
+      })
+    },
+    [setDraftConfig],
+  )
+
+  const toggleModalBalancing = useCallback((enabled: boolean) => {
+    if ((modelLoadBalancingEnabled || !enabled) && draftConfig) {
+      setDraftConfig({
+        ...draftConfig,
+        enabled,
+      })
+    }
+  }, [draftConfig, modelLoadBalancingEnabled, setDraftConfig])
+
+  const toggleConfigEntryEnabled = useCallback((index: number, state?: boolean) => {
+    updateConfigEntry(index, entry => ({
+      ...entry,
+      enabled: typeof state === 'boolean' ? state : !entry.enabled,
+    }))
+  }, [updateConfigEntry])
+
+  const setShowModelLoadBalancingEntryModal = useModalContextSelector(state => state.setShowModelLoadBalancingEntryModal)
+
+  const toggleEntryModal = useCallback((index?: number, entry?: ModelLoadBalancingConfigEntry) => {
+    setShowModelLoadBalancingEntryModal({
+      payload: {
+        currentProvider: provider,
+        currentConfigurationMethod: configurationMethod,
+        currentCustomConfigurationModelFixedFields,
+        entry,
+        index,
+      },
+      onSaveCallback: ({ entry: result }) => {
+        if (entry) {
+          // edit
+          setDraftConfig(prev => ({
+            ...prev,
+            enabled: !!prev?.enabled,
+            configs: prev?.configs.map((config, i) => i === index ? result! : config) || [],
+          }))
+        }
+        else {
+          // add
+          setDraftConfig(prev => ({
+            ...prev,
+            enabled: !!prev?.enabled,
+            configs: (prev?.configs || []).concat([{ ...result!, enabled: true }]),
+          }))
+        }
+      },
+      onRemoveCallback: ({ index }) => {
+        if (index !== undefined && (draftConfig?.configs?.length ?? 0) > index) {
+          setDraftConfig(prev => ({
+            ...prev,
+            enabled: !!prev?.enabled,
+            configs: prev?.configs.filter((_, i) => i !== index) || [],
+          }))
+        }
+      },
+    })
+  }, [
+    configurationMethod,
+    currentCustomConfigurationModelFixedFields,
+    draftConfig?.configs?.length,
+    provider,
+    setDraftConfig,
+    setShowModelLoadBalancingEntryModal,
+  ])
+
+  const clearCountdown = useCallback((index: number) => {
+    updateConfigEntry(index, ({ ttl: _, ...entry }) => {
+      return {
+        ...entry,
+        in_cooldown: false,
+      }
+    })
+  }, [updateConfigEntry])
+
+  if (!draftConfig)
+    return null
+
+  return (
+    <>
+      <div
+        className={classNames(
+          'min-h-16 bg-components-panel-bg border rounded-xl transition-colors',
+          (withSwitch || !draftConfig.enabled) ? 'border-components-panel-border' : 'border-util-colors-blue-blue-600',
+          (withSwitch || draftConfig.enabled) ? 'cursor-default' : 'cursor-pointer',
+          className,
+        )}
+        onClick={(!withSwitch && !draftConfig.enabled) ? () => toggleModalBalancing(true) : undefined}
+      >
+        <div className='flex select-none items-center gap-2 px-[15px] py-3'>
+          <div className='flex h-8 w-8 shrink-0 grow-0 items-center justify-center rounded-lg border border-util-colors-indigo-indigo-100 bg-util-colors-indigo-indigo-50 text-util-colors-blue-blue-600'>
+            <Balance className='h-4 w-4' />
+          </div>
+          <div className='grow'>
+            <div className='flex items-center gap-1 text-sm text-text-primary'>
+              {t('common.modelProvider.loadBalancing')}
+              <Tooltip
+                popupContent={t('common.modelProvider.loadBalancingInfo')}
+                popupClassName='max-w-[300px]'
+                triggerClassName='w-3 h-3'
+              />
+            </div>
+            <div className='text-xs text-text-tertiary'>{t('common.modelProvider.loadBalancingDescription')}</div>
+          </div>
+          {
+            withSwitch && (
+              <Switch
+                defaultValue={Boolean(draftConfig.enabled)}
+                size='l'
+                className='ml-3 justify-self-end'
+                disabled={!modelLoadBalancingEnabled && !draftConfig.enabled}
+                onChange={value => toggleModalBalancing(value)}
+              />
+            )
+          }
+        </div>
+        {draftConfig.enabled && (
+          <div className='flex flex-col gap-1 px-3 pb-3'>
+            {draftConfig.configs.map((config, index) => {
+              const isProviderManaged = config.name === '__inherit__'
+              return (
+                <div key={config.id || index} className='group flex h-10 items-center rounded-lg border border-components-panel-border bg-components-panel-on-panel-item-bg px-3 shadow-xs'>
+                  <div className='flex grow items-center'>
+                    <div className='mr-2 flex h-3 w-3 items-center justify-center'>
+                      {(config.in_cooldown && Boolean(config.ttl))
+                        ? (
+                          <CooldownTimer secondsRemaining={config.ttl} onFinish={() => clearCountdown(index)} />
+                        )
+                        : (
+                          <Tooltip popupContent={t('common.modelProvider.apiKeyStatusNormal')}>
+                            <Indicator color='green' />
+                          </Tooltip>
+                        )}
+                    </div>
+                    <div className='mr-1 text-[13px]'>
+                      {isProviderManaged ? t('common.modelProvider.defaultConfig') : config.name}
+                    </div>
+                    {isProviderManaged && (
+                      <span className='rounded-[5px] border border-divider-regular px-1 text-2xs uppercase text-text-tertiary'>{t('common.modelProvider.providerManaged')}</span>
+                    )}
+                  </div>
+                  <div className='flex items-center gap-1'>
+                    {!isProviderManaged && (
+                      <>
+                        <div className='flex items-center gap-1 opacity-0 transition-opacity group-hover:opacity-100'>
+                          <span
+                            className='flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg bg-components-button-secondary-bg text-text-tertiary transition-colors hover:bg-components-button-secondary-bg-hover'
+                            onClick={() => toggleEntryModal(index, config)}
+                          >
+                            <Edit02 className='h-4 w-4' />
+                          </span>
+                          <span
+                            className='flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg bg-components-button-secondary-bg text-text-tertiary transition-colors hover:bg-components-button-secondary-bg-hover'
+                            onClick={() => updateConfigEntry(index, () => undefined)}
+                          >
+                            <RiDeleteBinLine className='h-4 w-4' />
+                          </span>
+                          <span className='mr-2 h-3 border-r border-r-divider-subtle' />
+                        </div>
+                      </>
+                    )}
+                    <Switch
+                      defaultValue={Boolean(config.enabled)}
+                      size='md'
+                      className='justify-self-end'
+                      onChange={value => toggleConfigEntryEnabled(index, value)}
+                    />
+                  </div>
+                </div>
+              )
+            })}
+
+            <div
+              className='mt-1 flex h-8 items-center px-3 text-[13px] font-medium text-primary-600'
+              onClick={() => toggleEntryModal()}
+            >
+              <div className='flex cursor-pointer items-center'>
+                <Plus02 className='mr-2 h-3 w-3' />{t('common.modelProvider.addConfig')}
+              </div>
+            </div>
+          </div>
+        )}
+        {
+          draftConfig.enabled && draftConfig.configs.length < 2 && (
+            <div className='flex h-[34px] items-center border-t border-t-divider-subtle bg-components-panel-bg px-6 text-xs text-text-secondary'>
+              <AlertTriangle className='mr-1 h-3 w-3 text-[#f79009]' />
+              {t('common.modelProvider.loadBalancingLeastKeyWarning')}
+            </div>
+          )
+        }
+      </div>
+
+      {!modelLoadBalancingEnabled && !IS_CE_EDITION && (
+        <GridMask canvasClassName='!rounded-xl'>
+          <div className='mt-2 flex h-14 items-center justify-between rounded-xl border-[0.5px] border-components-panel-border px-4 shadow-md'>
+            <div
+              className={classNames('text-sm font-semibold leading-tight text-gradient', s.textGradient)}
+            >
+              {t('common.modelProvider.upgradeForLoadBalancing')}
+            </div>
+            <UpgradeBtn />
+          </div>
+        </GridMask>
+      )}
+    </>
+  )
+}
+
+export default ModelLoadBalancingConfigs
diff --git a/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-modal.tsx b/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-modal.tsx
new file mode 100644
index 0000000..c258806
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-modal.tsx
@@ -0,0 +1,189 @@
+import { memo, useCallback, useEffect, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import useSWR from 'swr'
+import type { ModelItem, ModelLoadBalancingConfig, ModelLoadBalancingConfigEntry, ModelProvider } from '../declarations'
+import { FormTypeEnum } from '../declarations'
+import ModelIcon from '../model-icon'
+import ModelName from '../model-name'
+import { savePredefinedLoadBalancingConfig } from '../utils'
+import ModelLoadBalancingConfigs from './model-load-balancing-configs'
+import classNames from '@/utils/classnames'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import { fetchModelLoadBalancingConfig } from '@/service/common'
+import Loading from '@/app/components/base/loading'
+import { useToastContext } from '@/app/components/base/toast'
+
+export type ModelLoadBalancingModalProps = {
+  provider: ModelProvider
+  model: ModelItem
+  open?: boolean
+  onClose?: () => void
+  onSave?: (provider: string) => void
+}
+
+// model balancing config modal
+const ModelLoadBalancingModal = ({ provider, model, open = false, onClose, onSave }: ModelLoadBalancingModalProps) => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+
+  const [loading, setLoading] = useState(false)
+
+  const { data, mutate } = useSWR(
+    `/workspaces/current/model-providers/${provider.provider}/models/credentials?model=${model.model}&model_type=${model.model_type}`,
+    fetchModelLoadBalancingConfig,
+  )
+
+  const originalConfig = data?.load_balancing
+  const [draftConfig, setDraftConfig] = useState<ModelLoadBalancingConfig>()
+  const originalConfigMap = useMemo(() => {
+    if (!originalConfig)
+      return {}
+    return originalConfig?.configs.reduce((prev, config) => {
+      if (config.id)
+        prev[config.id] = config
+      return prev
+    }, {} as Record<string, ModelLoadBalancingConfigEntry>)
+  }, [originalConfig])
+  useEffect(() => {
+    if (originalConfig)
+      setDraftConfig(originalConfig)
+  }, [originalConfig])
+
+  const toggleModalBalancing = useCallback((enabled: boolean) => {
+    if (draftConfig) {
+      setDraftConfig({
+        ...draftConfig,
+        enabled,
+      })
+    }
+  }, [draftConfig])
+
+  const extendedSecretFormSchemas = useMemo(
+    () => provider.provider_credential_schema.credential_form_schemas.filter(
+      ({ type }) => type === FormTypeEnum.secretInput,
+    ),
+    [provider.provider_credential_schema.credential_form_schemas],
+  )
+
+  const encodeConfigEntrySecretValues = useCallback((entry: ModelLoadBalancingConfigEntry) => {
+    const result = { ...entry }
+    extendedSecretFormSchemas.forEach(({ variable }) => {
+      if (entry.id && result.credentials[variable] === originalConfigMap[entry.id]?.credentials?.[variable])
+        result.credentials[variable] = '[__HIDDEN__]'
+    })
+    return result
+  }, [extendedSecretFormSchemas, originalConfigMap])
+
+  const handleSave = async () => {
+    try {
+      setLoading(true)
+      const res = await savePredefinedLoadBalancingConfig(
+        provider.provider,
+        ({
+          ...(data?.credentials ?? {}),
+          __model_type: model.model_type,
+          __model_name: model.model,
+        }),
+        {
+          ...draftConfig,
+          enabled: Boolean(draftConfig?.enabled),
+          configs: draftConfig!.configs.map(encodeConfigEntrySecretValues),
+        },
+      )
+      if (res.result === 'success') {
+        notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+        mutate()
+        onSave?.(provider.provider)
+        onClose?.()
+      }
+    }
+    finally {
+      setLoading(false)
+    }
+  }
+
+  return (
+    <Modal
+      isShow={Boolean(model) && open}
+      onClose={onClose}
+      className='w-[640px] max-w-none px-8 pt-8'
+      title={
+        <div className='pb-3 font-semibold'>
+          <div className='h-[30px]'>{t('common.modelProvider.configLoadBalancing')}</div>
+          {Boolean(model) && (
+            <div className='flex h-5 items-center'>
+              <ModelIcon
+                className='mr-2 shrink-0'
+                provider={provider}
+                modelName={model!.model}
+              />
+              <ModelName
+                className='system-md-regular grow text-text-secondary'
+                modelItem={model!}
+                showModelType
+                showMode
+                showContextSize
+              />
+            </div>
+          )}
+        </div>
+      }
+    >
+      {!draftConfig
+        ? <Loading type='area' />
+        : (
+          <>
+            <div className='py-2'>
+              <div
+                className={classNames(
+                  'min-h-16 bg-components-panel-bg border rounded-xl transition-colors',
+                  draftConfig.enabled ? 'border-components-panel-border cursor-pointer' : 'border-util-colors-blue-blue-600 cursor-default',
+                )}
+                onClick={draftConfig.enabled ? () => toggleModalBalancing(false) : undefined}
+              >
+                <div className='flex select-none items-center gap-2 px-[15px] py-3'>
+                  <div className='flex h-8 w-8 shrink-0 grow-0 items-center justify-center rounded-lg border border-components-card-border bg-components-card-bg'>
+                    {Boolean(model) && (
+                      <ModelIcon className='shrink-0' provider={provider} modelName={model!.model} />
+                    )}
+                  </div>
+                  <div className='grow'>
+                    <div className='text-sm text-text-secondary'>{t('common.modelProvider.providerManaged')}</div>
+                    <div className='text-xs text-text-tertiary'>{t('common.modelProvider.providerManagedDescription')}</div>
+                  </div>
+                </div>
+              </div>
+
+              <ModelLoadBalancingConfigs {...{
+                draftConfig,
+                setDraftConfig,
+                provider,
+                currentCustomConfigurationModelFixedFields: {
+                  __model_name: model.model,
+                  __model_type: model.model_type,
+                },
+                configurationMethod: model.fetch_from,
+                className: 'mt-2',
+              }} />
+            </div>
+
+            <div className='mt-6 flex items-center justify-end gap-2'>
+              <Button onClick={onClose}>{t('common.operation.cancel')}</Button>
+              <Button
+                variant='primary'
+                onClick={handleSave}
+                disabled={
+                  loading
+                  || (draftConfig?.enabled && (draftConfig?.configs.filter(config => config.enabled).length ?? 0) < 2)
+                }
+              >{t('common.operation.save')}</Button>
+            </div>
+          </>
+        )
+      }
+    </Modal >
+  )
+}
+
+export default memo(ModelLoadBalancingModal)
diff --git a/app/components/header/account-setting/model-provider-page/provider-added-card/priority-selector.tsx b/app/components/header/account-setting/model-provider-page/provider-added-card/priority-selector.tsx
new file mode 100644
index 0000000..193608a
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/provider-added-card/priority-selector.tsx
@@ -0,0 +1,76 @@
+import { Fragment } from 'react'
+import type { FC } from 'react'
+import { Popover, PopoverButton, PopoverPanel, Transition } from '@headlessui/react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiCheckLine,
+  RiMoreFill,
+} from '@remixicon/react'
+import { PreferredProviderTypeEnum } from '../declarations'
+import Button from '@/app/components/base/button'
+import cn from '@/utils/classnames'
+
+type SelectorProps = {
+  value?: string
+  onSelect: (key: PreferredProviderTypeEnum) => void
+}
+const Selector: FC<SelectorProps> = ({
+  value,
+  onSelect,
+}) => {
+  const { t } = useTranslation()
+  const options = [
+    {
+      key: PreferredProviderTypeEnum.custom,
+      text: t('common.modelProvider.apiKey'),
+    },
+    {
+      key: PreferredProviderTypeEnum.system,
+      text: t('common.modelProvider.quota'),
+    },
+  ]
+
+  return (
+    <Popover className='relative'>
+      <PopoverButton as='div'>
+        {
+          ({ open }) => (
+            <Button className={cn(
+              'h-6 w-6 rounded-md px-0',
+              open && 'bg-components-button-secondary-bg-hover',
+            )}>
+              <RiMoreFill className='h-3 w-3' />
+            </Button>
+          )
+        }
+      </PopoverButton>
+      <Transition
+        as={Fragment}
+        leave='transition ease-in duration-100'
+        leaveFrom='opacity-100'
+        leaveTo='opacity-0'
+      >
+        <PopoverPanel className='absolute right-0 top-7 z-10 w-[144px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-lg'>
+          <div className='p-1'>
+            <div className='px-3 pb-1 pt-2 text-sm font-medium text-text-secondary'>{t('common.modelProvider.card.priorityUse')}</div>
+            {
+              options.map(option => (
+                <PopoverButton as={Fragment} key={option.key}>
+                  <div
+                    className='flex h-9 cursor-pointer items-center justify-between rounded-lg px-3 text-sm text-text-secondary hover:bg-components-panel-on-panel-item-bg-hover'
+                    onClick={() => onSelect(option.key)}
+                  >
+                    <div className='grow'>{option.text}</div>
+                    {value === option.key && <RiCheckLine className='h-4 w-4 text-text-accent' />}
+                  </div>
+                </PopoverButton>
+              ))
+            }
+          </div>
+        </PopoverPanel>
+      </Transition>
+    </Popover>
+  )
+}
+
+export default Selector
diff --git a/app/components/header/account-setting/model-provider-page/provider-added-card/priority-use-tip.tsx b/app/components/header/account-setting/model-provider-page/provider-added-card/priority-use-tip.tsx
new file mode 100644
index 0000000..9bb898f
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/provider-added-card/priority-use-tip.tsx
@@ -0,0 +1,19 @@
+import { useTranslation } from 'react-i18next'
+import { ChevronDownDouble } from '@/app/components/base/icons/src/vender/line/arrows'
+import Tooltip from '@/app/components/base/tooltip'
+
+const PriorityUseTip = () => {
+  const { t } = useTranslation()
+
+  return (
+    <Tooltip
+      popupContent={t('common.modelProvider.priorityUsing') || ''}
+    >
+      <div className='absolute -right-[5px] -top-[5px] cursor-pointer rounded-[5px] border-[0.5px] border-components-panel-border-subtle bg-util-colors-indigo-indigo-50 shadow-xs'>
+        <ChevronDownDouble className='h-3 w-3 rotate-180 text-util-colors-indigo-indigo-600' />
+      </div>
+    </Tooltip>
+  )
+}
+
+export default PriorityUseTip
diff --git a/app/components/header/account-setting/model-provider-page/provider-added-card/quota-panel.tsx b/app/components/header/account-setting/model-provider-page/provider-added-card/quota-panel.tsx
new file mode 100644
index 0000000..b3e871e
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/provider-added-card/quota-panel.tsx
@@ -0,0 +1,66 @@
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { ModelProvider } from '../declarations'
+import {
+  CustomConfigurationStatusEnum,
+  PreferredProviderTypeEnum,
+  QuotaUnitEnum,
+} from '../declarations'
+import {
+  MODEL_PROVIDER_QUOTA_GET_PAID,
+} from '../utils'
+import PriorityUseTip from './priority-use-tip'
+import Tooltip from '@/app/components/base/tooltip'
+import { formatNumber } from '@/utils/format'
+
+type QuotaPanelProps = {
+  provider: ModelProvider
+}
+const QuotaPanel: FC<QuotaPanelProps> = ({
+  provider,
+}) => {
+  const { t } = useTranslation()
+
+  const customConfig = provider.custom_configuration
+  const priorityUseType = provider.preferred_provider_type
+  const systemConfig = provider.system_configuration
+  const currentQuota = systemConfig.enabled && systemConfig.quota_configurations.find(item => item.quota_type === systemConfig.current_quota_type)
+  const openaiOrAnthropic = MODEL_PROVIDER_QUOTA_GET_PAID.includes(provider.provider)
+
+  return (
+    <div className='group relative min-w-[112px] shrink-0 rounded-lg border-[0.5px] border-components-panel-border bg-white/[0.18] px-3 py-2 shadow-xs'>
+      <div className='system-xs-medium-uppercase mb-2 flex h-4 items-center text-text-tertiary'>
+        {t('common.modelProvider.quota')}
+        <Tooltip popupContent={
+          openaiOrAnthropic
+            ? t('common.modelProvider.card.tip')
+            : t('common.modelProvider.quotaTip')
+        }
+        />
+      </div>
+      {
+        currentQuota && (
+          <div className='flex h-4 items-center text-xs text-text-tertiary'>
+            <span className='system-md-semibold-uppercase mr-0.5 text-text-secondary'>{formatNumber(Math.max((currentQuota?.quota_limit || 0) - (currentQuota?.quota_used || 0), 0))}</span>
+            {
+              currentQuota?.quota_unit === QuotaUnitEnum.tokens && 'Tokens'
+            }
+            {
+              currentQuota?.quota_unit === QuotaUnitEnum.times && t('common.modelProvider.callTimes')
+            }
+            {
+              currentQuota?.quota_unit === QuotaUnitEnum.credits && t('common.modelProvider.credits')
+            }
+          </div>
+        )
+      }
+      {
+        priorityUseType === PreferredProviderTypeEnum.system && customConfig.status === CustomConfigurationStatusEnum.active && (
+          <PriorityUseTip />
+        )
+      }
+    </div>
+  )
+}
+
+export default QuotaPanel
diff --git a/app/components/header/account-setting/model-provider-page/provider-icon/index.tsx b/app/components/header/account-setting/model-provider-page/provider-icon/index.tsx
new file mode 100644
index 0000000..253269d
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/provider-icon/index.tsx
@@ -0,0 +1,53 @@
+import type { FC } from 'react'
+import type { ModelProvider } from '../declarations'
+import { useLanguage } from '../hooks'
+import { Openai } from '@/app/components/base/icons/src/vender/other'
+import { AnthropicDark, AnthropicLight } from '@/app/components/base/icons/src/public/llm'
+import { renderI18nObject } from '@/i18n'
+import { Theme } from '@/types/app'
+import cn from '@/utils/classnames'
+import useTheme from '@/hooks/use-theme'
+
+type ProviderIconProps = {
+  provider: ModelProvider
+  className?: string
+}
+const ProviderIcon: FC<ProviderIconProps> = ({
+  provider,
+  className,
+}) => {
+  const { theme } = useTheme()
+  const language = useLanguage()
+
+  if (provider.provider === 'langgenius/anthropic/anthropic') {
+    return (
+      <div className='mb-2 py-[7px]'>
+        {theme === Theme.dark && <AnthropicLight className='h-2.5 w-[90px]' />}
+        {theme === Theme.light && <AnthropicDark className='h-2.5 w-[90px]' />}
+      </div>
+    )
+  }
+
+  if (provider.provider === 'langgenius/openai/openai') {
+    return (
+      <div className='mb-2'>
+        <Openai className='h-6 w-auto text-text-inverted-dimmed' />
+      </div>
+    )
+  }
+
+  return (
+    <div className={cn('inline-flex items-center gap-2', className)}>
+      <img
+        alt='provider-icon'
+        src={renderI18nObject(provider.icon_small, language)}
+        className='h-6 w-6'
+      />
+      <div className='system-md-semibold text-text-primary'>
+        {renderI18nObject(provider.label, language)}
+      </div>
+    </div>
+  )
+}
+
+export default ProviderIcon
diff --git a/app/components/header/account-setting/model-provider-page/system-model-selector/index.tsx b/app/components/header/account-setting/model-provider-page/system-model-selector/index.tsx
new file mode 100644
index 0000000..30ba475
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/system-model-selector/index.tsx
@@ -0,0 +1,265 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiEqualizer2Line } from '@remixicon/react'
+import ModelSelector from '../model-selector'
+import {
+  useModelList,
+  useSystemDefaultModelAndModelList,
+  useUpdateModelList,
+} from '../hooks'
+import type {
+  DefaultModel,
+  DefaultModelResponse,
+} from '../declarations'
+import { ModelTypeEnum } from '../declarations'
+import Tooltip from '@/app/components/base/tooltip'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Button from '@/app/components/base/button'
+import { useProviderContext } from '@/context/provider-context'
+import { updateDefaultModel } from '@/service/common'
+import { useToastContext } from '@/app/components/base/toast'
+import { useAppContext } from '@/context/app-context'
+
+type SystemModelSelectorProps = {
+  textGenerationDefaultModel: DefaultModelResponse | undefined
+  embeddingsDefaultModel: DefaultModelResponse | undefined
+  rerankDefaultModel: DefaultModelResponse | undefined
+  speech2textDefaultModel: DefaultModelResponse | undefined
+  ttsDefaultModel: DefaultModelResponse | undefined
+  notConfigured: boolean
+}
+const SystemModel: FC<SystemModelSelectorProps> = ({
+  textGenerationDefaultModel,
+  embeddingsDefaultModel,
+  rerankDefaultModel,
+  speech2textDefaultModel,
+  ttsDefaultModel,
+  notConfigured,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const { isCurrentWorkspaceManager } = useAppContext()
+  const { textGenerationModelList } = useProviderContext()
+  const updateModelList = useUpdateModelList()
+  const { data: embeddingModelList } = useModelList(ModelTypeEnum.textEmbedding)
+  const { data: rerankModelList } = useModelList(ModelTypeEnum.rerank)
+  const { data: speech2textModelList } = useModelList(ModelTypeEnum.speech2text)
+  const { data: ttsModelList } = useModelList(ModelTypeEnum.tts)
+  const [changedModelTypes, setChangedModelTypes] = useState<ModelTypeEnum[]>([])
+  const [currentTextGenerationDefaultModel, changeCurrentTextGenerationDefaultModel] = useSystemDefaultModelAndModelList(textGenerationDefaultModel, textGenerationModelList)
+  const [currentEmbeddingsDefaultModel, changeCurrentEmbeddingsDefaultModel] = useSystemDefaultModelAndModelList(embeddingsDefaultModel, embeddingModelList)
+  const [currentRerankDefaultModel, changeCurrentRerankDefaultModel] = useSystemDefaultModelAndModelList(rerankDefaultModel, rerankModelList)
+  const [currentSpeech2textDefaultModel, changeCurrentSpeech2textDefaultModel] = useSystemDefaultModelAndModelList(speech2textDefaultModel, speech2textModelList)
+  const [currentTTSDefaultModel, changeCurrentTTSDefaultModel] = useSystemDefaultModelAndModelList(ttsDefaultModel, ttsModelList)
+  const [open, setOpen] = useState(false)
+
+  const getCurrentDefaultModelByModelType = (modelType: ModelTypeEnum) => {
+    if (modelType === ModelTypeEnum.textGeneration)
+      return currentTextGenerationDefaultModel
+    else if (modelType === ModelTypeEnum.textEmbedding)
+      return currentEmbeddingsDefaultModel
+    else if (modelType === ModelTypeEnum.rerank)
+      return currentRerankDefaultModel
+    else if (modelType === ModelTypeEnum.speech2text)
+      return currentSpeech2textDefaultModel
+    else if (modelType === ModelTypeEnum.tts)
+      return currentTTSDefaultModel
+
+    return undefined
+  }
+  const handleChangeDefaultModel = (modelType: ModelTypeEnum, model: DefaultModel) => {
+    if (modelType === ModelTypeEnum.textGeneration)
+      changeCurrentTextGenerationDefaultModel(model)
+    else if (modelType === ModelTypeEnum.textEmbedding)
+      changeCurrentEmbeddingsDefaultModel(model)
+    else if (modelType === ModelTypeEnum.rerank)
+      changeCurrentRerankDefaultModel(model)
+    else if (modelType === ModelTypeEnum.speech2text)
+      changeCurrentSpeech2textDefaultModel(model)
+    else if (modelType === ModelTypeEnum.tts)
+      changeCurrentTTSDefaultModel(model)
+
+    if (!changedModelTypes.includes(modelType))
+      setChangedModelTypes([...changedModelTypes, modelType])
+  }
+  const handleSave = async () => {
+    const res = await updateDefaultModel({
+      url: '/workspaces/current/default-model',
+      body: {
+        model_settings: [ModelTypeEnum.textGeneration, ModelTypeEnum.textEmbedding, ModelTypeEnum.rerank, ModelTypeEnum.speech2text, ModelTypeEnum.tts].map((modelType) => {
+          return {
+            model_type: modelType,
+            provider: getCurrentDefaultModelByModelType(modelType)?.provider,
+            model: getCurrentDefaultModelByModelType(modelType)?.model,
+          }
+        }),
+      },
+    })
+    if (res.result === 'success') {
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      setOpen(false)
+
+      changedModelTypes.forEach((modelType) => {
+        if (modelType === ModelTypeEnum.textGeneration)
+          updateModelList(modelType)
+        else if (modelType === ModelTypeEnum.textEmbedding)
+          updateModelList(modelType)
+        else if (modelType === ModelTypeEnum.rerank)
+          updateModelList(modelType)
+        else if (modelType === ModelTypeEnum.speech2text)
+          updateModelList(modelType)
+        else if (modelType === ModelTypeEnum.tts)
+          updateModelList(modelType)
+      })
+    }
+  }
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 8,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+        <Button
+          className='relative'
+          variant={notConfigured ? 'primary' : 'secondary'}
+          size='small'
+        >
+          <RiEqualizer2Line className='mr-1 h-3.5 w-3.5' />
+          {t('common.modelProvider.systemModelSettings')}
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[60]'>
+        <div className='w-[360px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg pt-4 shadow-xl'>
+          <div className='px-6 py-1'>
+            <div className='flex h-8 items-center text-[13px] font-medium text-text-primary'>
+              {t('common.modelProvider.systemReasoningModel.key')}
+              <Tooltip
+                popupContent={
+                  <div className='w-[261px] text-text-tertiary'>
+                    {t('common.modelProvider.systemReasoningModel.tip')}
+                  </div>
+                }
+                triggerClassName='ml-0.5 w-4 h-4 shrink-0'
+              />
+            </div>
+            <div>
+              <ModelSelector
+                defaultModel={currentTextGenerationDefaultModel}
+                modelList={textGenerationModelList}
+                onSelect={model => handleChangeDefaultModel(ModelTypeEnum.textGeneration, model)}
+              />
+            </div>
+          </div>
+          <div className='px-6 py-1'>
+            <div className='flex h-8 items-center text-[13px] font-medium text-text-primary'>
+              {t('common.modelProvider.embeddingModel.key')}
+              <Tooltip
+                popupContent={
+                  <div className='w-[261px] text-text-tertiary'>
+                    {t('common.modelProvider.embeddingModel.tip')}
+                  </div>
+                }
+                triggerClassName='ml-0.5 w-4 h-4 shrink-0'
+              />
+            </div>
+            <div>
+              <ModelSelector
+                defaultModel={currentEmbeddingsDefaultModel}
+                modelList={embeddingModelList}
+                onSelect={model => handleChangeDefaultModel(ModelTypeEnum.textEmbedding, model)}
+              />
+            </div>
+          </div>
+          <div className='px-6 py-1'>
+            <div className='flex h-8 items-center text-[13px] font-medium text-text-primary'>
+              {t('common.modelProvider.rerankModel.key')}
+              <Tooltip
+                popupContent={
+                  <div className='w-[261px] text-text-tertiary'>
+                    {t('common.modelProvider.rerankModel.tip')}
+                  </div>
+                }
+                triggerClassName='ml-0.5 w-4 h-4 shrink-0'
+              />
+            </div>
+            <div>
+              <ModelSelector
+                defaultModel={currentRerankDefaultModel}
+                modelList={rerankModelList}
+                onSelect={model => handleChangeDefaultModel(ModelTypeEnum.rerank, model)}
+              />
+            </div>
+          </div>
+          <div className='px-6 py-1'>
+            <div className='flex h-8 items-center text-[13px] font-medium text-text-primary'>
+              {t('common.modelProvider.speechToTextModel.key')}
+              <Tooltip
+                popupContent={
+                  <div className='w-[261px] text-text-tertiary'>
+                    {t('common.modelProvider.speechToTextModel.tip')}
+                  </div>
+                }
+                triggerClassName='ml-0.5 w-4 h-4 shrink-0'
+              />
+            </div>
+            <div>
+              <ModelSelector
+                defaultModel={currentSpeech2textDefaultModel}
+                modelList={speech2textModelList}
+                onSelect={model => handleChangeDefaultModel(ModelTypeEnum.speech2text, model)}
+              />
+            </div>
+          </div>
+          <div className='px-6 py-1'>
+            <div className='flex h-8 items-center text-[13px] font-medium text-text-primary'>
+              {t('common.modelProvider.ttsModel.key')}
+              <Tooltip
+                popupContent={
+                  <div className='w-[261px] text-text-tertiary'>
+                    {t('common.modelProvider.ttsModel.tip')}
+                  </div>
+                }
+                triggerClassName='ml-0.5 w-4 h-4 shrink-0'
+              />
+            </div>
+            <div>
+              <ModelSelector
+                defaultModel={currentTTSDefaultModel}
+                modelList={ttsModelList}
+                onSelect={model => handleChangeDefaultModel(ModelTypeEnum.tts, model)}
+              />
+            </div>
+          </div>
+          <div className='flex items-center justify-end px-6 py-4'>
+            <Button
+              onClick={() => setOpen(false)}
+            >
+              {t('common.operation.cancel')}
+            </Button>
+            <Button
+              className='ml-2'
+              variant='primary'
+              onClick={handleSave}
+              disabled={!isCurrentWorkspaceManager}
+            >
+              {t('common.operation.save')}
+            </Button>
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default SystemModel
diff --git a/app/components/header/account-setting/model-provider-page/utils.ts b/app/components/header/account-setting/model-provider-page/utils.ts
new file mode 100644
index 0000000..9056afe
--- /dev/null
+++ b/app/components/header/account-setting/model-provider-page/utils.ts
@@ -0,0 +1,195 @@
+import { ValidatedStatus } from '../key-validator/declarations'
+import type {
+  CredentialFormSchemaRadio,
+  CredentialFormSchemaTextInput,
+  FormValue,
+  ModelLoadBalancingConfig,
+} from './declarations'
+import {
+  ConfigurationMethodEnum,
+  FormTypeEnum,
+  MODEL_TYPE_TEXT,
+  ModelTypeEnum,
+} from './declarations'
+import {
+  deleteModelProvider,
+  setModelProvider,
+  validateModelLoadBalancingCredentials,
+  validateModelProvider,
+} from '@/service/common'
+
+export const MODEL_PROVIDER_QUOTA_GET_PAID = ['langgenius/anthropic/anthropic', 'langgenius/openai/openai', 'langgenius/azure_openai/azure_openai']
+
+export const isNullOrUndefined = (value: any) => {
+  return value === undefined || value === null
+}
+
+export const validateCredentials = async (predefined: boolean, provider: string, v: FormValue) => {
+  let body, url
+
+  if (predefined) {
+    body = {
+      credentials: v,
+    }
+    url = `/workspaces/current/model-providers/${provider}/credentials/validate`
+  }
+  else {
+    const { __model_name, __model_type, ...credentials } = v
+    body = {
+      model: __model_name,
+      model_type: __model_type,
+      credentials,
+    }
+    url = `/workspaces/current/model-providers/${provider}/models/credentials/validate`
+  }
+  try {
+    const res = await validateModelProvider({ url, body })
+    if (res.result === 'success')
+      return Promise.resolve({ status: ValidatedStatus.Success })
+    else
+      return Promise.resolve({ status: ValidatedStatus.Error, message: res.error || 'error' })
+  }
+  catch (e: any) {
+    return Promise.resolve({ status: ValidatedStatus.Error, message: e.message })
+  }
+}
+
+export const validateLoadBalancingCredentials = async (predefined: boolean, provider: string, v: FormValue, id?: string): Promise<{
+  status: ValidatedStatus
+  message?: string
+}> => {
+  const { __model_name, __model_type, ...credentials } = v
+  try {
+    const res = await validateModelLoadBalancingCredentials({
+      url: `/workspaces/current/model-providers/${provider}/models/load-balancing-configs/${id ? `${id}/` : ''}credentials-validate`,
+      body: {
+        model: __model_name,
+        model_type: __model_type,
+        credentials,
+      },
+    })
+    if (res.result === 'success')
+      return Promise.resolve({ status: ValidatedStatus.Success })
+    else
+      return Promise.resolve({ status: ValidatedStatus.Error, message: res.error || 'error' })
+  }
+  catch (e: any) {
+    return Promise.resolve({ status: ValidatedStatus.Error, message: e.message })
+  }
+}
+
+export const saveCredentials = async (predefined: boolean, provider: string, v: FormValue, loadBalancing?: ModelLoadBalancingConfig) => {
+  let body, url
+
+  if (predefined) {
+    body = {
+      config_from: ConfigurationMethodEnum.predefinedModel,
+      credentials: v,
+      load_balancing: loadBalancing,
+    }
+    url = `/workspaces/current/model-providers/${provider}`
+  }
+  else {
+    const { __model_name, __model_type, ...credentials } = v
+    body = {
+      model: __model_name,
+      model_type: __model_type,
+      credentials,
+      load_balancing: loadBalancing,
+    }
+    url = `/workspaces/current/model-providers/${provider}/models`
+  }
+
+  return setModelProvider({ url, body })
+}
+
+export const savePredefinedLoadBalancingConfig = async (provider: string, v: FormValue, loadBalancing?: ModelLoadBalancingConfig) => {
+  const { __model_name, __model_type, ...credentials } = v
+  const body = {
+    config_from: ConfigurationMethodEnum.predefinedModel,
+    model: __model_name,
+    model_type: __model_type,
+    credentials,
+    load_balancing: loadBalancing,
+  }
+  const url = `/workspaces/current/model-providers/${provider}/models`
+
+  return setModelProvider({ url, body })
+}
+
+export const removeCredentials = async (predefined: boolean, provider: string, v: FormValue) => {
+  let url = ''
+  let body
+
+  if (predefined) {
+    url = `/workspaces/current/model-providers/${provider}`
+  }
+  else {
+    if (v) {
+      const { __model_name, __model_type } = v
+      body = {
+        model: __model_name,
+        model_type: __model_type,
+      }
+      url = `/workspaces/current/model-providers/${provider}/models`
+    }
+  }
+
+  return deleteModelProvider({ url, body })
+}
+
+export const sizeFormat = (size: number) => {
+  const remainder = Math.floor(size / 1000)
+  if (remainder < 1)
+    return `${size}`
+  else
+    return `${remainder}K`
+}
+
+export const modelTypeFormat = (modelType: ModelTypeEnum) => {
+  if (modelType === ModelTypeEnum.textEmbedding)
+    return 'TEXT EMBEDDING'
+
+  return modelType.toLocaleUpperCase()
+}
+
+export const genModelTypeFormSchema = (modelTypes: ModelTypeEnum[]) => {
+  return {
+    type: FormTypeEnum.radio,
+    label: {
+      zh_Hans: '妯″瀷绫诲瀷',
+      en_US: 'Model Type',
+    },
+    variable: '__model_type',
+    default: modelTypes[0],
+    required: true,
+    show_on: [],
+    options: modelTypes.map((modelType: ModelTypeEnum) => {
+      return {
+        value: modelType,
+        label: {
+          zh_Hans: MODEL_TYPE_TEXT[modelType],
+          en_US: MODEL_TYPE_TEXT[modelType],
+        },
+        show_on: [],
+      }
+    }),
+  } as CredentialFormSchemaRadio
+}
+
+export const genModelNameFormSchema = (model?: Pick<CredentialFormSchemaTextInput, 'label' | 'placeholder'>) => {
+  return {
+    type: FormTypeEnum.textInput,
+    label: model?.label || {
+      zh_Hans: '妯″瀷鍚嶇О',
+      en_US: 'Model Name',
+    },
+    variable: '__model_name',
+    required: true,
+    show_on: [],
+    placeholder: model?.placeholder || {
+      zh_Hans: '璇疯緭鍏ユā鍨嬪悕绉�',
+      en_US: 'Please enter model name',
+    },
+  } as CredentialFormSchemaTextInput
+}
diff --git a/app/components/header/account-setting/plugin-page/SerpapiPlugin.tsx b/app/components/header/account-setting/plugin-page/SerpapiPlugin.tsx
new file mode 100644
index 0000000..86b7db0
--- /dev/null
+++ b/app/components/header/account-setting/plugin-page/SerpapiPlugin.tsx
@@ -0,0 +1,80 @@
+import { useTranslation } from 'react-i18next'
+import Image from 'next/image'
+import SerpapiLogo from '../../assets/serpapi.png'
+import KeyValidator from '../key-validator'
+import type { Form, ValidateValue } from '../key-validator/declarations'
+import { updatePluginKey, validatePluginKey } from './utils'
+import { useToastContext } from '@/app/components/base/toast'
+import type { PluginProvider } from '@/models/common'
+import { useAppContext } from '@/context/app-context'
+
+type SerpapiPluginProps = {
+  plugin: PluginProvider
+  onUpdate: () => void
+}
+const SerpapiPlugin = ({
+  plugin,
+  onUpdate,
+}: SerpapiPluginProps) => {
+  const { t } = useTranslation()
+  const { isCurrentWorkspaceManager } = useAppContext()
+  const { notify } = useToastContext()
+
+  const forms: Form[] = [{
+    key: 'api_key',
+    title: t('common.plugin.serpapi.apiKey'),
+    placeholder: t('common.plugin.serpapi.apiKeyPlaceholder'),
+    value: plugin.credentials?.api_key,
+    validate: {
+      before: (v) => {
+        if (v?.api_key)
+          return true
+      },
+      run: async (v) => {
+        return validatePluginKey('serpapi', {
+          credentials: {
+            api_key: v?.api_key,
+          },
+        })
+      },
+    },
+    handleFocus: (v, dispatch) => {
+      if (v.api_key === plugin.credentials?.api_key)
+        dispatch({ ...v, api_key: '' })
+    },
+  }]
+
+  const handleSave = async (v: ValidateValue) => {
+    if (!v?.api_key || v?.api_key === plugin.credentials?.api_key)
+      return
+
+    const res = await updatePluginKey('serpapi', {
+      credentials: {
+        api_key: v?.api_key,
+      },
+    })
+
+    if (res.status === 'success') {
+      notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') })
+      onUpdate()
+      return true
+    }
+  }
+
+  return (
+    <KeyValidator
+      type='serpapi'
+      title={<Image alt='serpapi logo' src={SerpapiLogo} width={64} />}
+      status={plugin.credentials?.api_key ? 'success' : 'add'}
+      forms={forms}
+      keyFrom={{
+        text: t('common.plugin.serpapi.keyFrom'),
+        link: 'https://serpapi.com/manage-api-key',
+      }}
+      onSave={handleSave}
+      disabled={!isCurrentWorkspaceManager}
+    />
+  )
+}
+
+export default SerpapiPlugin
diff --git a/app/components/header/account-setting/plugin-page/index.tsx b/app/components/header/account-setting/plugin-page/index.tsx
new file mode 100644
index 0000000..bf404b0
--- /dev/null
+++ b/app/components/header/account-setting/plugin-page/index.tsx
@@ -0,0 +1,38 @@
+import useSWR from 'swr'
+import { LockClosedIcon } from '@heroicons/react/24/solid'
+import { useTranslation } from 'react-i18next'
+import Link from 'next/link'
+import SerpapiPlugin from './SerpapiPlugin'
+import { fetchPluginProviders } from '@/service/common'
+import type { PluginProvider } from '@/models/common'
+
+const PluginPage = () => {
+  const { t } = useTranslation()
+  const { data: plugins, mutate } = useSWR('/workspaces/current/tool-providers', fetchPluginProviders)
+
+  const Plugin_MAP: Record<string, (plugin: PluginProvider) => React.JSX.Element> = {
+    serpapi: (plugin: PluginProvider) => <SerpapiPlugin key='serpapi' plugin={plugin} onUpdate={() => mutate()} />,
+  }
+
+  return (
+    <div className='pb-7'>
+      <div>
+        {plugins?.map(plugin => Plugin_MAP[plugin.tool_name](plugin))}
+      </div>
+      <div className='fixed bottom-0 flex h-[42px] w-[472px] items-center bg-white text-xs text-gray-500'>
+        <LockClosedIcon className='mr-1 h-3 w-3' />
+        {t('common.provider.encrypted.front')}
+        <Link
+          className='mx-1 text-primary-600'
+          target='_blank' rel='noopener noreferrer'
+          href='https://pycryptodome.readthedocs.io/en/latest/src/cipher/oaep.html'
+        >
+          PKCS1_OAEP
+        </Link>
+        {t('common.provider.encrypted.back')}
+      </div>
+    </div>
+  )
+}
+
+export default PluginPage
diff --git a/app/components/header/account-setting/plugin-page/utils.ts b/app/components/header/account-setting/plugin-page/utils.ts
new file mode 100644
index 0000000..cb9e25a
--- /dev/null
+++ b/app/components/header/account-setting/plugin-page/utils.ts
@@ -0,0 +1,34 @@
+import { ValidatedStatus } from '../key-validator/declarations'
+import { updatePluginProviderAIKey, validatePluginProviderKey } from '@/service/common'
+
+export const validatePluginKey = async (pluginType: string, body: any) => {
+  try {
+    const res = await validatePluginProviderKey({
+      url: `/workspaces/current/tool-providers/${pluginType}/credentials-validate`,
+      body,
+    })
+    if (res.result === 'success')
+      return Promise.resolve({ status: ValidatedStatus.Success })
+    else
+      return Promise.resolve({ status: ValidatedStatus.Error, message: res.error })
+  }
+  catch (e: any) {
+    return Promise.resolve({ status: ValidatedStatus.Error, message: e.message })
+  }
+}
+
+export const updatePluginKey = async (pluginType: string, body: any) => {
+  try {
+    const res = await updatePluginProviderAIKey({
+      url: `/workspaces/current/tool-providers/${pluginType}/credentials`,
+      body,
+    })
+    if (res.result === 'success')
+      return Promise.resolve({ status: ValidatedStatus.Success })
+    else
+      return Promise.resolve({ status: ValidatedStatus.Error, message: res.error })
+  }
+  catch (e: any) {
+    return Promise.resolve({ status: ValidatedStatus.Error, message: e.message })
+  }
+}
diff --git a/app/components/header/app-back/index.tsx b/app/components/header/app-back/index.tsx
new file mode 100644
index 0000000..bfc1736
--- /dev/null
+++ b/app/components/header/app-back/index.tsx
@@ -0,0 +1,36 @@
+'use client'
+
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { ArrowLeftIcon, Squares2X2Icon } from '@heroicons/react/24/solid'
+import classNames from '@/utils/classnames'
+import type { AppDetailResponse } from '@/models/app'
+
+type IAppBackProps = {
+  curApp: AppDetailResponse
+}
+export default function AppBack({ curApp }: IAppBackProps) {
+  const { t } = useTranslation()
+
+  const [hovered, setHovered] = useState(false)
+
+  return (
+    <div
+      className={classNames(`
+        flex items-center h-7 pl-2.5 pr-2
+        text-[#1C64F2] font-semibold cursor-pointer
+        rounded-[10px]
+        ${curApp && 'hover:bg-[#EBF5FF]'}
+      `)}
+      onMouseEnter={() => setHovered(true)}
+      onMouseLeave={() => setHovered(false)}
+    >
+      {
+        (hovered && curApp)
+          ? <ArrowLeftIcon className='mr-1 h-[18px] w-[18px]' />
+          : <Squares2X2Icon className='mr-1 h-[18px] w-[18px]' />
+      }
+      {t('common.menus.apps')}
+    </div>
+  )
+}
diff --git a/app/components/header/app-nav/index.tsx b/app/components/header/app-nav/index.tsx
new file mode 100644
index 0000000..3b90281
--- /dev/null
+++ b/app/components/header/app-nav/index.tsx
@@ -0,0 +1,150 @@
+'use client'
+
+import { useCallback, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useParams } from 'next/navigation'
+import useSWRInfinite from 'swr/infinite'
+import { flatten } from 'lodash-es'
+import produce from 'immer'
+import {
+  RiRobot2Fill,
+  RiRobot2Line,
+} from '@remixicon/react'
+import Nav from '../nav'
+import type { NavItem } from '../nav/nav-selector'
+import { fetchAppList } from '@/service/apps'
+import CreateAppTemplateDialog from '@/app/components/app/create-app-dialog'
+import CreateAppModal from '@/app/components/app/create-app-modal'
+import CreateFromDSLModal from '@/app/components/app/create-from-dsl-modal'
+import type { AppListResponse } from '@/models/app'
+import { useAppContext } from '@/context/app-context'
+import { useStore as useAppStore } from '@/app/components/app/store'
+
+const getKey = (
+  pageIndex: number,
+  previousPageData: AppListResponse,
+  activeTab: string,
+  keywords: string,
+) => {
+  if (!pageIndex || previousPageData.has_more) {
+    const params: any = { url: 'apps', params: { page: pageIndex + 1, limit: 30, name: keywords } }
+
+    if (activeTab !== 'all')
+      params.params.mode = activeTab
+    else
+      delete params.params.mode
+
+    return params
+  }
+  return null
+}
+
+const AppNav = () => {
+  const { t } = useTranslation()
+  const { appId } = useParams()
+  const { isCurrentWorkspaceEditor } = useAppContext()
+  const appDetail = useAppStore(state => state.appDetail)
+  const [showNewAppDialog, setShowNewAppDialog] = useState(false)
+  const [showNewAppTemplateDialog, setShowNewAppTemplateDialog] = useState(false)
+  const [showCreateFromDSLModal, setShowCreateFromDSLModal] = useState(false)
+  const [navItems, setNavItems] = useState<NavItem[]>([])
+
+  const { data: appsData, setSize, mutate } = useSWRInfinite(
+    appId
+      ? (pageIndex: number, previousPageData: AppListResponse) => getKey(pageIndex, previousPageData, 'all', '')
+      : () => null,
+    fetchAppList,
+    { revalidateFirstPage: false },
+  )
+
+  const handleLoadmore = useCallback(() => {
+    setSize(size => size + 1)
+  }, [setSize])
+
+  const openModal = (state: string) => {
+    if (state === 'blank')
+      setShowNewAppDialog(true)
+    if (state === 'template')
+      setShowNewAppTemplateDialog(true)
+    if (state === 'dsl')
+      setShowCreateFromDSLModal(true)
+  }
+
+  useEffect(() => {
+    if (appsData) {
+      const appItems = flatten(appsData?.map(appData => appData.data))
+      const navItems = appItems.map((app) => {
+        const link = ((isCurrentWorkspaceEditor, app) => {
+          if (!isCurrentWorkspaceEditor) {
+            return `/app/${app.id}/overview`
+          }
+          else {
+            if (app.mode === 'workflow' || app.mode === 'advanced-chat')
+              return `/app/${app.id}/workflow`
+            else
+              return `/app/${app.id}/configuration`
+          }
+        })(isCurrentWorkspaceEditor, app)
+        return {
+          id: app.id,
+          icon_type: app.icon_type,
+          icon: app.icon,
+          icon_background: app.icon_background,
+          icon_url: app.icon_url,
+          name: app.name,
+          mode: app.mode,
+          link,
+        }
+      })
+      setNavItems(navItems)
+    }
+  }, [appsData, isCurrentWorkspaceEditor, setNavItems])
+
+  // update current app name
+  useEffect(() => {
+    if (appDetail) {
+      const newNavItems = produce(navItems, (draft: NavItem[]) => {
+        navItems.forEach((app, index) => {
+          if (app.id === appDetail.id)
+            draft[index].name = appDetail.name
+        })
+      })
+      setNavItems(newNavItems)
+    }
+  }, [appDetail, navItems])
+
+  return (
+    <>
+      <Nav
+        isApp
+        icon={<RiRobot2Line className='h-4 w-4' />}
+        activeIcon={<RiRobot2Fill className='h-4 w-4' />}
+        text={t('common.menus.apps')}
+        activeSegment={['apps', 'app']}
+        link='/apps'
+        curNav={appDetail}
+        navs={navItems}
+        createText={t('common.menus.newApp')}
+        onCreate={openModal}
+        onLoadmore={handleLoadmore}
+      />
+      <CreateAppModal
+        show={showNewAppDialog}
+        onClose={() => setShowNewAppDialog(false)}
+        onSuccess={() => mutate()}
+      />
+      <CreateAppTemplateDialog
+        show={showNewAppTemplateDialog}
+        onClose={() => setShowNewAppTemplateDialog(false)}
+        onSuccess={() => mutate()}
+      />
+      <CreateFromDSLModal
+        show={showCreateFromDSLModal}
+        onClose={() => setShowCreateFromDSLModal(false)}
+        onSuccess={() => mutate()}
+      />
+    </>
+  )
+}
+
+export default AppNav
diff --git a/app/components/header/app-selector/index.tsx b/app/components/header/app-selector/index.tsx
new file mode 100644
index 0000000..1c0dbc5
--- /dev/null
+++ b/app/components/header/app-selector/index.tsx
@@ -0,0 +1,112 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { Fragment, useState } from 'react'
+import { ChevronDownIcon, PlusIcon } from '@heroicons/react/24/solid'
+import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react'
+import { useRouter } from 'next/navigation'
+import Indicator from '../indicator'
+import type { AppDetailResponse } from '@/models/app'
+import CreateAppDialog from '@/app/components/app/create-app-dialog'
+import AppIcon from '@/app/components/base/app-icon'
+import { useAppContext } from '@/context/app-context'
+import { noop } from 'lodash-es'
+
+type IAppSelectorProps = {
+  appItems: AppDetailResponse[]
+  curApp: AppDetailResponse
+}
+
+export default function AppSelector({ appItems, curApp }: IAppSelectorProps) {
+  const router = useRouter()
+  const { isCurrentWorkspaceEditor } = useAppContext()
+  const [showNewAppDialog, setShowNewAppDialog] = useState(false)
+  const { t } = useTranslation()
+
+  const itemClassName = `
+    flex items-center w-full h-10 px-3 text-gray-700 text-[14px]
+    rounded-lg font-normal hover:bg-gray-100 cursor-pointer
+  `
+
+  return (
+    <div className="">
+      <Menu as="div" className="relative inline-block text-left">
+        <div>
+          <MenuButton
+            className="
+              inline-flex h-7 w-full items-center justify-center
+              rounded-[10px] pl-2 pr-2.5 text-[14px] font-semibold
+              text-[#1C64F2] hover:bg-[#EBF5FF]
+            "
+          >
+            {curApp?.name}
+            <ChevronDownIcon
+              className="ml-1 h-3 w-3"
+              aria-hidden="true"
+            />
+          </MenuButton>
+        </div>
+        <Transition
+          as={Fragment}
+          enter="transition ease-out duration-100"
+          enterFrom="transform opacity-0 scale-95"
+          enterTo="transform opacity-100 scale-100"
+          leave="transition ease-in duration-75"
+          leaveFrom="transform opacity-100 scale-100"
+          leaveTo="transform opacity-0 scale-95"
+        >
+          <MenuItems
+            className="
+              absolute -left-11 right-0 mt-1.5 w-60 max-w-80
+              origin-top-right divide-y divide-gray-100 rounded-lg bg-white
+              shadow-lg
+            "
+          >
+            {!!appItems.length && (<div className="overflow-auto px-1 py-1" style={{ maxHeight: '50vh' }}>
+              {
+                appItems.map((app: AppDetailResponse) => (
+                  <MenuItem key={app.id}>
+                    <div className={itemClassName} onClick={() =>
+                      router.push(`/app/${app.id}/${isCurrentWorkspaceEditor ? 'configuration' : 'overview'}`)
+                    }>
+                      <div className='relative mr-2 h-6 w-6 rounded-[6px] bg-[#D5F5F6]'>
+                        <AppIcon size='tiny' />
+                        <div className='absolute -bottom-0.5 -right-0.5 flex h-2.5 w-2.5 items-center justify-center rounded bg-white'>
+                          <Indicator />
+                        </div>
+                      </div>
+                      {app.name}
+                    </div>
+                  </MenuItem>
+                ))
+              }
+            </div>)}
+            {isCurrentWorkspaceEditor && <MenuItem>
+              <div className='p-1' onClick={() => setShowNewAppDialog(true)}>
+                <div
+                  className='flex h-12 cursor-pointer items-center rounded-lg hover:bg-gray-100'
+                >
+                  <div
+                    className='
+                      ml-4 mr-2 flex
+                      h-6 w-6 items-center justify-center rounded-[6px] border-[0.5px]
+                      border-dashed border-gray-200 bg-gray-100
+                    '
+                  >
+                    <PlusIcon className='h-4 w-4 text-gray-500' />
+                  </div>
+                  <div className='text-[14px] font-normal text-gray-700'>{t('common.menus.newApp')}</div>
+                </div>
+              </div>
+            </MenuItem>
+            }
+          </MenuItems>
+        </Transition>
+      </Menu>
+      <CreateAppDialog
+        show={showNewAppDialog}
+        onClose={() => setShowNewAppDialog(false)}
+        onSuccess={noop}
+      />
+    </div>
+  )
+}
diff --git a/app/components/header/assets/alpha.svg b/app/components/header/assets/alpha.svg
new file mode 100644
index 0000000..3be0fdb
--- /dev/null
+++ b/app/components/header/assets/alpha.svg
@@ -0,0 +1,4 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M6 5.24975C5.58579 5.24975 5.25 5.58554 5.25 5.99975C5.25 6.41396 5.58579 6.74975 6 6.74975C6.41421 6.74975 6.75 6.41396 6.75 5.99975C6.75 5.58554 6.41421 5.24975 6 5.24975Z" fill="#344054"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.55961 1.2874C7.06059 1.49287 6.53398 1.7771 5.99996 2.13007C5.46595 1.77712 4.93936 1.4929 4.44036 1.28743C3.8603 1.04858 3.29372 0.906291 2.7826 0.902457C2.269 0.898605 1.77103 1.03634 1.40379 1.40358C1.03655 1.77082 0.89882 2.26879 0.902672 2.78238C0.906505 3.2935 1.0488 3.86008 1.28765 4.44015C1.49312 4.93915 1.77733 5.46574 2.13029 5.99975C1.77733 6.53376 1.49311 7.06036 1.28764 7.55936C1.04879 8.13942 0.9065 8.706 0.902666 9.21712C0.898814 9.73072 1.03655 10.2287 1.40379 10.5959C1.77103 10.9632 2.269 11.1009 2.78259 11.097C3.29371 11.0932 3.86029 10.9509 4.44035 10.7121C4.93935 10.5066 5.46595 10.2224 5.99996 9.86944C6.53398 10.2224 7.06059 10.5066 7.55961 10.7121C8.13967 10.951 8.70625 11.0933 9.21737 11.0971C9.73097 11.1009 10.2289 10.9632 10.5962 10.596C10.9634 10.2287 11.1012 9.73075 11.0973 9.21716C11.0935 8.70604 10.9512 8.13946 10.7123 7.5594C10.5068 7.06038 10.2226 6.53377 9.86966 5.99975C10.2226 5.46573 10.5068 4.93912 10.7123 4.44011C10.9512 3.86005 11.0935 3.29347 11.0973 2.78235C11.1011 2.26875 10.9634 1.77078 10.5962 1.40354C10.2289 1.0363 9.73096 0.89857 9.21737 0.902422C8.70625 0.906256 8.13967 1.04855 7.55961 1.2874ZM7.94035 2.21207C7.60184 2.35146 7.2419 2.53581 6.87023 2.7619C7.29274 3.09639 7.71306 3.47021 8.12131 3.87845C8.52954 4.28668 8.90334 4.70698 9.23781 5.12947C9.46391 4.75781 9.64826 4.39787 9.78764 4.05936C9.99666 3.55175 10.0948 3.11609 10.0973 2.77485C10.0999 2.43608 10.01 2.23156 9.88907 2.11065C9.76815 1.98973 9.56364 1.89985 9.22487 1.90239C8.88362 1.90495 8.44796 2.00306 7.94035 2.21207ZM2.21232 4.0594C2.35171 4.39789 2.53604 4.75782 2.76213 5.12947C3.09661 4.70697 3.47042 4.28665 3.87866 3.87842C4.28689 3.47019 4.70719 3.09639 5.12968 2.76191C4.75803 2.53582 4.3981 2.35149 4.05961 2.21211C3.552 2.00309 3.11634 1.90499 2.7751 1.90243C2.43633 1.89989 2.23181 1.98977 2.1109 2.11068C1.98998 2.2316 1.9001 2.43611 1.90264 2.77488C1.9052 3.11613 2.00331 3.55179 2.21232 4.0594ZM4.58577 4.58552C4.11988 5.05141 3.70722 5.5288 3.35371 5.99975C3.70722 6.4707 4.11988 6.94809 4.58577 7.41398C5.05165 7.87986 5.52902 8.29251 5.99996 8.64601C6.47091 8.2925 6.9483 7.87984 7.41419 7.41395C7.88007 6.94807 8.29272 6.47069 8.64623 5.99975C8.29272 5.52881 7.88008 5.05143 7.4142 4.58556C6.94831 4.11966 6.47091 3.70701 5.99996 3.35349C5.52902 3.707 5.05164 4.11965 4.58577 4.58552ZM2.21232 7.94011C2.3517 7.60161 2.53604 7.24168 2.76213 6.87003C3.09661 7.29253 3.47042 7.71285 3.87866 8.12109C4.28689 8.52932 4.70719 8.90312 5.12968 9.23759C4.75803 9.46368 4.3981 9.64802 4.05961 9.7874C3.552 9.99641 3.11634 10.0945 2.77509 10.0971C2.43632 10.0996 2.23181 10.0097 2.11089 9.88882C1.98998 9.76791 1.9001 9.5634 1.90264 9.22462C1.9052 8.88338 2.0033 8.44772 2.21232 7.94011ZM7.94036 9.78743C7.60185 9.64804 7.2419 9.4637 6.87023 9.2376C7.29274 8.90311 7.71306 8.5293 8.1213 8.12106C8.52953 7.71282 8.90334 7.29252 9.23782 6.87003C9.46392 7.24169 9.64826 7.60163 9.78765 7.94015C9.99666 8.44775 10.0948 8.88342 10.0973 9.22466C10.0999 9.56343 10.01 9.76794 9.88907 9.88886C9.76816 10.0098 9.56364 10.0997 9.22487 10.0971C8.88363 10.0946 8.44797 9.99645 7.94036 9.78743Z" fill="#344054"/>
+</svg>
diff --git a/app/components/header/assets/anthropic.svg b/app/components/header/assets/anthropic.svg
new file mode 100644
index 0000000..c0ec02d
--- /dev/null
+++ b/app/components/header/assets/anthropic.svg
@@ -0,0 +1,11 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="6" fill="#CA9F7B"/>
+<g clip-path="url(#clip0_3907_39360)">
+<path d="M14.9613 7.13043H12.8476L16.7022 16.8696H18.8159L14.9613 7.13043ZM8.85457 7.13043L5 16.8696H7.15539L7.94365 14.8243H11.9763L12.7645 16.8696H14.9199L11.0653 7.13043H8.85457ZM8.64091 13.0156L9.95996 9.59291L11.279 13.0156H8.64091Z" fill="#191918"/>
+</g>
+<defs>
+<clipPath id="clip0_3907_39360">
+<rect width="14" height="9.73913" fill="white" transform="translate(5 7.13043)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/header/assets/azure.svg b/app/components/header/assets/azure.svg
new file mode 100644
index 0000000..3cfe391
--- /dev/null
+++ b/app/components/header/assets/azure.svg
@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="6" fill="#3980C5"/>
+<path d="M18.5963 11.6572C18.748 11.9956 18.8443 12.3574 18.8836 12.7264C18.9216 13.0954 18.9026 13.4689 18.8238 13.8321C18.7465 14.1953 18.6123 14.5439 18.4256 14.8648C18.3031 15.0792 18.1587 15.2805 17.9924 15.4657C17.8276 15.6495 17.6438 15.8158 17.444 15.9617C17.2427 16.1075 17.0283 16.2301 16.8007 16.3307C16.5746 16.4299 16.3383 16.5057 16.0962 16.5553C15.9824 16.9083 15.8132 17.2423 15.5944 17.5428C15.3771 17.8433 15.1131 18.1073 14.8126 18.3247C14.5121 18.5435 14.1795 18.7127 13.8266 18.8264C13.4736 18.9417 13.1045 18.9985 12.7326 18.9985C12.4861 19 12.2381 18.9738 11.996 18.9242C11.7553 18.8731 11.519 18.7958 11.2929 18.6952C11.0668 18.5945 10.8524 18.4691 10.6526 18.3232C10.4542 18.1773 10.2704 18.0096 10.107 17.8243C9.74237 17.9031 9.36896 17.9221 8.99992 17.8841C8.63089 17.8448 8.26914 17.7485 7.92928 17.5968C7.59088 17.4466 7.27727 17.2423 7.00159 16.9929C6.72591 16.7435 6.49107 16.4518 6.30582 16.1309C6.18184 15.9164 6.07973 15.6904 6.00242 15.4555C5.92511 15.2207 5.87406 14.9785 5.84781 14.732C5.82155 14.487 5.82301 14.239 5.84927 13.9925C5.87552 13.7475 5.92949 13.5053 6.0068 13.2705C5.75883 12.9948 5.55462 12.6812 5.40292 12.3428C5.25268 12.0029 5.15495 11.6426 5.11703 11.2736C5.07765 10.9046 5.09807 10.5312 5.17538 10.168C5.25268 9.80476 5.38688 9.45614 5.57358 9.13524C5.69611 8.92082 5.84051 8.71807 6.00534 8.53428C6.17017 8.3505 6.35541 8.18421 6.55525 8.03835C6.75508 7.89248 6.97096 7.7685 7.19705 7.66931C7.42459 7.56867 7.66089 7.49428 7.90303 7.44468C8.0168 7.09023 8.186 6.75766 8.40334 6.45718C8.62213 6.15671 8.88615 5.89269 9.18663 5.6739C9.48711 5.45656 9.81968 5.28736 10.1727 5.17213C10.5257 5.05835 10.8947 5.00001 11.2666 5.00146C11.5132 5.00001 11.7611 5.0248 12.0033 5.07586C12.2454 5.12691 12.4817 5.20276 12.7078 5.3034C12.9339 5.40551 13.1483 5.52949 13.3481 5.67535C13.548 5.82268 13.7317 5.98896 13.8951 6.17421C14.2583 6.0969 14.6317 6.07794 15.0008 6.11586C15.3698 6.15379 15.7301 6.25152 16.0699 6.40176C16.4083 6.55345 16.7219 6.75621 16.9976 7.00563C17.2733 7.2536 17.5082 7.54387 17.6934 7.86623C17.8174 8.07919 17.9195 8.30528 17.9968 8.54158C18.0741 8.77642 18.1266 9.01855 18.1514 9.26506C18.1777 9.51157 18.1777 9.75954 18.15 10.006C18.1237 10.2526 18.0697 10.4947 17.9924 10.7295C18.2418 11.0052 18.4446 11.3174 18.5963 11.6572ZM13.7361 17.8841C14.0541 17.7529 14.3429 17.5589 14.5865 17.3153C14.8301 17.0717 15.0241 16.7829 15.1554 16.4634C15.2866 16.1455 15.3552 15.8041 15.3552 15.4599V12.2071C15.3542 12.2042 15.3533 12.2008 15.3523 12.1969C15.3513 12.194 15.3499 12.1911 15.3479 12.1882C15.346 12.1853 15.3435 12.1828 15.3406 12.1809C15.3377 12.178 15.3348 12.176 15.3319 12.175L14.1547 11.4953V15.4249C14.1547 15.4643 14.1489 15.5051 14.1387 15.543C14.1285 15.5824 14.1139 15.6189 14.0935 15.6539C14.0731 15.6889 14.0497 15.721 14.0206 15.7487C13.9922 15.777 13.9603 15.8015 13.9257 15.8216L11.1383 17.4305C11.1149 17.4451 11.0756 17.4655 11.0551 17.4772C11.1704 17.5749 11.2958 17.661 11.4271 17.7368C11.5598 17.8127 11.6969 17.8769 11.8399 17.9294C11.9828 17.9804 12.1302 18.0198 12.2789 18.0461C12.4292 18.0723 12.5809 18.0854 12.7326 18.0854C13.0768 18.0854 13.4181 18.0169 13.7361 17.8841ZM7.09786 15.6758C7.27144 15.9748 7.50044 16.2344 7.77321 16.4445C8.04743 16.6545 8.35812 16.8077 8.69069 16.8967C9.02326 16.9856 9.37042 17.009 9.71174 16.9637C10.0531 16.9185 10.3813 16.8077 10.6803 16.6356L13.4984 15.0092L13.5057 15.0019C13.5076 14.9999 13.5091 14.997 13.51 14.9931C13.512 14.9902 13.5134 14.9873 13.5144 14.9844V13.6133L10.1129 15.581C10.0779 15.6014 10.0414 15.616 10.0035 15.6276C9.96408 15.6378 9.9247 15.6422 9.88386 15.6422C9.84447 15.6422 9.80509 15.6378 9.76571 15.6276C9.72778 15.616 9.68986 15.6014 9.65485 15.581L6.86739 13.9706C6.8426 13.956 6.80613 13.9342 6.78571 13.921C6.75946 14.0713 6.74633 14.223 6.74633 14.3747C6.74633 14.5264 6.76091 14.6781 6.78717 14.8283C6.81342 14.9771 6.85427 15.1244 6.90532 15.2674C6.95783 15.4103 7.02201 15.5474 7.09786 15.6787V15.6758ZM6.36562 9.59325C6.1935 9.89228 6.08265 10.2219 6.03743 10.5632C5.99221 10.9046 6.01555 11.2503 6.10453 11.5843C6.1935 11.9169 6.34666 12.2276 6.5567 12.5018C6.76675 12.7745 7.02784 13.0035 7.32541 13.1757L10.142 14.8035C10.145 14.8045 10.1484 14.8055 10.1522 14.8064H10.1625C10.1663 14.8064 10.1697 14.8055 10.1727 14.8035C10.1756 14.8025 10.1785 14.8011 10.1814 14.7991L11.3629 14.1165L7.96137 12.1532C7.92782 12.1327 7.89573 12.1079 7.86656 12.0802C7.8383 12.0519 7.81379 12.02 7.79363 11.9854C7.77467 11.9504 7.75862 11.9139 7.74841 11.8746C7.7382 11.8366 7.73237 11.7973 7.73383 11.7564V8.44385C7.59088 8.49636 7.45231 8.56054 7.32103 8.63639C7.18975 8.7137 7.06577 8.80121 6.94908 8.89894C6.83385 8.99667 6.72591 9.10461 6.62818 9.2213C6.53045 9.33653 6.44439 9.46198 6.36854 9.59325H6.36562ZM16.0408 11.8454C16.0758 11.8658 16.1079 11.8892 16.137 11.9183C16.1647 11.946 16.1895 11.9781 16.21 12.0131C16.2289 12.0481 16.245 12.0861 16.2552 12.124C16.2639 12.1634 16.2698 12.2028 16.2683 12.2436V15.5562C16.7365 15.384 17.145 15.0821 17.4469 14.6854C17.7503 14.2886 17.9326 13.8146 17.9749 13.3186C18.0172 12.8227 17.918 12.3238 17.6876 11.8819C17.4571 11.4399 17.1056 11.0723 16.6738 10.8243L13.8572 9.19651C13.8543 9.19553 13.8509 9.19456 13.847 9.19359H13.8368C13.8338 9.19456 13.8304 9.19553 13.8266 9.19651C13.8236 9.19748 13.8207 9.19894 13.8178 9.20088L12.6421 9.88061L16.0437 11.8454H16.0408ZM17.215 10.0804H17.2135V10.0819L17.215 10.0804ZM17.2135 10.079C17.2981 9.58888 17.2412 9.08419 17.0487 8.62472C16.8576 8.16525 16.5382 7.76996 16.1297 7.48407C15.7213 7.19963 15.24 7.03626 14.7426 7.01438C14.2437 6.99396 13.7507 7.11503 13.3189 7.363L10.5023 8.98938C10.4994 8.99132 10.497 8.99375 10.495 8.99667L10.4892 9.00542C10.4882 9.00834 10.4872 9.01174 10.4863 9.01563C10.4853 9.01855 10.4848 9.02196 10.4848 9.02585V10.3853L13.8864 8.42051C13.9214 8.40009 13.9593 8.3855 13.9972 8.37383C14.0366 8.36362 14.076 8.35925 14.1154 8.35925C14.1562 8.35925 14.1956 8.36362 14.235 8.37383C14.2729 8.3855 14.3094 8.40009 14.3444 8.42051L17.1318 10.0308C17.1566 10.0454 17.1931 10.0659 17.2135 10.079ZM9.84301 8.57367C9.84301 8.53428 9.84885 8.4949 9.85906 8.45552C9.86927 8.41759 9.88386 8.37967 9.90428 8.34466C9.9247 8.31111 9.94804 8.27902 9.97721 8.24985C10.0049 8.22214 10.037 8.19734 10.072 8.17838L12.8595 6.5695C12.8857 6.55345 12.9222 6.53303 12.9426 6.52282C12.5605 6.20338 12.0937 5.99917 11.5992 5.93645C11.1047 5.87227 10.603 5.95104 10.1522 6.16254C9.70007 6.37404 9.3179 6.71099 9.05097 7.13107C8.78404 7.55262 8.64256 8.03981 8.64256 8.53866V11.7914C8.64353 11.7953 8.6445 11.7987 8.64547 11.8016C8.64645 11.8045 8.6479 11.8075 8.64985 11.8104C8.65179 11.8133 8.65422 11.8162 8.65714 11.8191C8.65909 11.8211 8.662 11.823 8.66589 11.825L9.84301 12.5047V8.57367ZM10.4819 12.8723L11.9974 13.7475L13.5129 12.8723V11.1234L11.9989 10.2482L10.4834 11.1234L10.4819 12.8723Z" fill="white"/>
+</svg>
diff --git a/app/components/header/assets/bitbucket.svg b/app/components/header/assets/bitbucket.svg
new file mode 100644
index 0000000..4d28ea7
--- /dev/null
+++ b/app/components/header/assets/bitbucket.svg
@@ -0,0 +1,10 @@
+<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_660_1978)">
+<path d="M16.1064 1.77422C16.1184 1.7048 16.115 1.63359 16.0965 1.56561C16.078 1.49763 16.0448 1.43453 15.9993 1.38074C15.9538 1.32696 15.8971 1.2838 15.8331 1.25431C15.7691 1.22481 15.6994 1.20969 15.629 1.21001H0.602662C0.531806 1.20898 0.461593 1.22358 0.397019 1.25276C0.332445 1.28195 0.275097 1.32501 0.229055 1.37888C0.183014 1.43275 0.14941 1.4961 0.130636 1.56443C0.111861 1.63276 0.108377 1.70439 0.120432 1.77422L2.31458 15.2285C2.33294 15.3417 2.3911 15.4448 2.47861 15.519C2.56611 15.5933 2.67723 15.6339 2.79199 15.6335H13.4493C13.6904 15.6335 13.8929 15.4648 13.9315 15.2285L16.1064 1.77422ZM9.78916 10.7823H6.4473L5.54553 6.05643H10.5993L9.78916 10.7823Z" fill="#2684FF"/>
+</g>
+<defs>
+<clipPath id="clip0_660_1978">
+<rect width="16" height="16" fill="white" transform="translate(0 0.5)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/header/assets/file.svg b/app/components/header/assets/file.svg
new file mode 100644
index 0000000..aab093a
--- /dev/null
+++ b/app/components/header/assets/file.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M13.3333 6.99992V4.53325C13.3333 3.41315 13.3333 2.85309 13.1153 2.42527C12.9236 2.04895 12.6176 1.74299 12.2413 1.55124C11.8135 1.33325 11.2534 1.33325 10.1333 1.33325H5.86666C4.74655 1.33325 4.1865 1.33325 3.75868 1.55124C3.38235 1.74299 3.07639 2.04895 2.88464 2.42527C2.66666 2.85309 2.66666 3.41315 2.66666 4.53325V11.4666C2.66666 12.5867 2.66666 13.1467 2.88464 13.5746C3.07639 13.9509 3.38235 14.2569 3.75868 14.4486C4.1865 14.6666 4.74655 14.6666 5.86666 14.6666H7.99999M9.33332 7.33325H5.33332M6.66666 9.99992H5.33332M10.6667 4.66659H5.33332M12 13.9999V9.99992M9.99999 11.9999H14" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/header/assets/github.svg b/app/components/header/assets/github.svg
new file mode 100644
index 0000000..f03798b
--- /dev/null
+++ b/app/components/header/assets/github.svg
@@ -0,0 +1,17 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_131_1011)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.0003 0.5C9.15149 0.501478 6.39613 1.51046 4.22687 3.34652C2.05761 5.18259 0.615903 7.72601 0.159545 10.522C-0.296814 13.318 0.261927 16.1842 1.73587 18.6082C3.20981 21.0321 5.50284 22.8558 8.20493 23.753C8.80105 23.8636 9.0256 23.4941 9.0256 23.18C9.0256 22.8658 9.01367 21.955 9.0097 20.9592C5.6714 21.6804 4.96599 19.5505 4.96599 19.5505C4.42152 18.1674 3.63464 17.8039 3.63464 17.8039C2.54571 17.065 3.71611 17.0788 3.71611 17.0788C4.92227 17.1637 5.55616 18.3097 5.55616 18.3097C6.62521 20.1333 8.36389 19.6058 9.04745 19.2976C9.15475 18.5251 9.46673 17.9995 9.8105 17.7012C7.14383 17.4008 4.34204 16.3774 4.34204 11.8054C4.32551 10.6197 4.76802 9.47305 5.57801 8.60268C5.45481 8.30236 5.04348 7.08923 5.69524 5.44143C5.69524 5.44143 6.7027 5.12135 8.9958 6.66444C10.9627 6.12962 13.0379 6.12962 15.0047 6.66444C17.2958 5.12135 18.3013 5.44143 18.3013 5.44143C18.9551 7.08528 18.5437 8.29841 18.4205 8.60268C19.2331 9.47319 19.6765 10.6218 19.6585 11.8094C19.6585 16.3912 16.8507 17.4008 14.1801 17.6952C14.6093 18.0667 14.9928 18.7918 14.9928 19.9061C14.9928 21.5026 14.9789 22.7868 14.9789 23.18C14.9789 23.4981 15.1955 23.8695 15.8035 23.753C18.5059 22.8557 20.7992 21.0317 22.2731 18.6073C23.747 16.183 24.3055 13.3163 23.8486 10.5201C23.3917 7.7238 21.9493 5.18035 19.7793 3.34461C17.6093 1.50886 14.8533 0.500541 12.0042 0.5H12.0003Z" fill="#191717"/>
+<path d="M4.54444 17.6321C4.5186 17.6914 4.42322 17.7092 4.34573 17.6677C4.26823 17.6262 4.21061 17.5491 4.23843 17.4879C4.26625 17.4266 4.35964 17.4108 4.43714 17.4523C4.51463 17.4938 4.57424 17.5729 4.54444 17.6321Z" fill="#191717"/>
+<path d="M5.03123 18.1714C4.99008 18.192 4.943 18.1978 4.89805 18.1877C4.8531 18.1776 4.81308 18.1523 4.78483 18.1161C4.70734 18.0331 4.69143 17.9185 4.75104 17.8671C4.81066 17.8157 4.91797 17.8395 4.99546 17.9224C5.07296 18.0054 5.09084 18.12 5.03123 18.1714Z" fill="#191717"/>
+<path d="M5.50425 18.857C5.43072 18.9084 5.30553 18.857 5.23598 18.7543C5.21675 18.7359 5.20146 18.7138 5.19101 18.6893C5.18056 18.6649 5.17517 18.6386 5.17517 18.612C5.17517 18.5855 5.18056 18.5592 5.19101 18.5347C5.20146 18.5103 5.21675 18.4882 5.23598 18.4698C5.3095 18.4204 5.4347 18.4698 5.50425 18.5705C5.57379 18.6713 5.57578 18.8057 5.50425 18.857V18.857Z" fill="#191717"/>
+<path d="M6.14612 19.5207C6.08054 19.5939 5.94741 19.5741 5.83812 19.4753C5.72883 19.3765 5.70299 19.2422 5.76857 19.171C5.83414 19.0999 5.96727 19.1197 6.08054 19.2165C6.1938 19.3133 6.21566 19.4496 6.14612 19.5207V19.5207Z" fill="#191717"/>
+<path d="M7.04617 19.9081C7.01637 20.001 6.88124 20.0425 6.74612 20.003C6.611 19.9635 6.52158 19.8528 6.54741 19.758C6.57325 19.6631 6.71036 19.6197 6.84747 19.6631C6.98457 19.7066 7.07201 19.8113 7.04617 19.9081Z" fill="#191717"/>
+<path d="M8.02783 19.9752C8.02783 20.072 7.91656 20.155 7.77349 20.1569C7.63042 20.1589 7.51318 20.0799 7.51318 19.9831C7.51318 19.8863 7.62445 19.8033 7.76752 19.8013C7.91059 19.7993 8.02783 19.8764 8.02783 19.9752Z" fill="#191717"/>
+<path d="M8.9419 19.8232C8.95978 19.92 8.86042 20.0207 8.71735 20.0445C8.57428 20.0682 8.4491 20.0109 8.43121 19.916C8.41333 19.8212 8.51666 19.7185 8.65576 19.6928C8.79485 19.6671 8.92401 19.7264 8.9419 19.8232Z" fill="#191717"/>
+</g>
+<defs>
+<clipPath id="clip0_131_1011">
+<rect width="24" height="24" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/header/assets/google.svg b/app/components/header/assets/google.svg
new file mode 100644
index 0000000..6bcacfc
--- /dev/null
+++ b/app/components/header/assets/google.svg
@@ -0,0 +1,13 @@
+<svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_729_2080)">
+<path d="M20.3052 10.2302C20.3052 9.55044 20.2501 8.86699 20.1325 8.19824H10.7002V12.0491H16.1016C15.8775 13.291 15.1573 14.3897 14.1027 15.0878V17.5864H17.3252C19.2176 15.8448 20.3052 13.2726 20.3052 10.2302Z" fill="#4285F4"/>
+<path d="M10.6999 20.0008C13.397 20.0008 15.6714 19.1152 17.3286 17.5867L14.1061 15.088C13.2096 15.698 12.0521 16.0434 10.7036 16.0434C8.09474 16.0434 5.88272 14.2833 5.08904 11.917H1.76367V14.4928C3.46127 17.8696 6.91892 20.0008 10.6999 20.0008Z" fill="#34A853"/>
+<path d="M5.08564 11.9172C4.66676 10.6753 4.66676 9.33044 5.08564 8.08848V5.5127H1.76395C0.345611 8.33834 0.345611 11.6674 1.76395 14.493L5.08564 11.9172Z" fill="#FBBC04"/>
+<path d="M10.6999 3.95805C12.1256 3.936 13.5035 4.47247 14.536 5.45722L17.3911 2.60218C15.5833 0.904587 13.1838 -0.0287217 10.6999 0.000673888C6.91892 0.000673888 3.46126 2.13185 1.76367 5.51234L5.08537 8.08813C5.87537 5.71811 8.09106 3.95805 10.6999 3.95805Z" fill="#EA4335"/>
+</g>
+<defs>
+<clipPath id="clip0_729_2080">
+<rect width="20" height="20" fill="white" transform="translate(0.5)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/header/assets/gpt.svg b/app/components/header/assets/gpt.svg
new file mode 100644
index 0000000..c20df23
--- /dev/null
+++ b/app/components/header/assets/gpt.svg
@@ -0,0 +1,4 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="20" height="20" rx="6" fill="black"/>
+<path d="M16.5965 9.65778C16.7482 9.99618 16.8444 10.3579 16.8838 10.727C16.9218 11.096 16.9028 11.4694 16.824 11.8326C16.7467 12.1958 16.6125 12.5444 16.4258 12.8653C16.3033 13.0797 16.1589 13.281 15.9926 13.4663C15.8278 13.6501 15.644 13.8163 15.4442 13.9622C15.2429 14.1081 15.0284 14.2306 14.8009 14.3312C14.5748 14.4304 14.3385 14.5063 14.0964 14.5559C13.9826 14.9089 13.8134 15.2429 13.5946 15.5434C13.3773 15.8439 13.1133 16.1079 12.8128 16.3252C12.5123 16.544 12.1797 16.7132 11.8267 16.827C11.4737 16.9422 11.1047 16.9991 10.7328 16.9991C10.4862 17.0006 10.2383 16.9743 9.99615 16.9247C9.75547 16.8737 9.51917 16.7963 9.29308 16.6957C9.06699 16.5951 8.85257 16.4696 8.65274 16.3237C8.45437 16.1779 8.27058 16.0101 8.10721 15.8249C7.74255 15.9037 7.36914 15.9226 7.00011 15.8847C6.63107 15.8453 6.26933 15.749 5.92947 15.5973C5.59106 15.4471 5.27745 15.2429 5.00177 14.9935C4.72609 14.744 4.49125 14.4523 4.306 14.1314C4.18202 13.917 4.07991 13.6909 4.00261 13.4561C3.9253 13.2212 3.87425 12.9791 3.84799 12.7326C3.82173 12.4875 3.82319 12.2396 3.84945 11.9931C3.8757 11.748 3.92967 11.5059 4.00698 11.271C3.75901 10.9953 3.5548 10.6817 3.40311 10.3433C3.25287 10.0035 3.15514 9.64319 3.11721 9.27415C3.07783 8.90512 3.09825 8.53171 3.17556 8.16851C3.25287 7.80531 3.38706 7.45669 3.57377 7.13579C3.69629 6.92137 3.8407 6.71862 4.00552 6.53483C4.17035 6.35104 4.3556 6.18476 4.55543 6.0389C4.75526 5.89303 4.97114 5.76905 5.19723 5.66986C5.42478 5.56922 5.66108 5.49482 5.90321 5.44523C6.01698 5.09078 6.18619 4.75821 6.40352 4.45773C6.62232 4.15725 6.88633 3.89324 7.18681 3.67445C7.48729 3.45711 7.81986 3.28791 8.17285 3.17267C8.52584 3.0589 8.89488 3.00056 9.26683 3.00201C9.51334 3.00056 9.76131 3.02535 10.0034 3.0764C10.2456 3.12746 10.4819 3.20331 10.708 3.30395C10.934 3.40606 11.1485 3.53004 11.3483 3.6759C11.5481 3.82323 11.7319 3.98951 11.8953 4.17476C12.2585 4.09745 12.6319 4.07849 13.0009 4.11641C13.37 4.15434 13.7303 4.25207 14.0701 4.40231C14.4085 4.554 14.7221 4.75675 14.9978 5.00618C15.2735 5.25415 15.5083 5.54442 15.6936 5.86678C15.8176 6.07974 15.9197 6.30583 15.997 6.54213C16.0743 6.77697 16.1268 7.0191 16.1516 7.26561C16.1778 7.51212 16.1778 7.76009 16.1501 8.0066C16.1239 8.25311 16.0699 8.49524 15.9926 8.73008C16.242 9.00576 16.4448 9.31791 16.5965 9.65778ZM11.7363 15.8847C12.0543 15.7534 12.3431 15.5594 12.5867 15.3158C12.8303 15.0722 13.0243 14.7834 13.1556 14.464C13.2868 14.146 13.3554 13.8047 13.3554 13.4604V10.2077C13.3544 10.2048 13.3534 10.2014 13.3525 10.1975C13.3515 10.1946 13.35 10.1916 13.3481 10.1887C13.3461 10.1858 13.3437 10.1834 13.3408 10.1814C13.3379 10.1785 13.335 10.1766 13.332 10.1756L12.1549 9.49587V13.4254C12.1549 13.4648 12.1491 13.5057 12.1389 13.5436C12.1287 13.583 12.1141 13.6194 12.0937 13.6544C12.0732 13.6894 12.0499 13.7215 12.0207 13.7493C11.9924 13.7775 11.9605 13.802 11.9259 13.8222L9.13847 15.4311C9.11513 15.4456 9.07575 15.4661 9.05533 15.4777C9.17056 15.5755 9.296 15.6615 9.42728 15.7374C9.56001 15.8132 9.69713 15.8774 9.84007 15.9299C9.98302 15.981 10.1303 16.0204 10.2791 16.0466C10.4294 16.0729 10.5811 16.086 10.7328 16.086C11.077 16.086 11.4183 16.0174 11.7363 15.8847ZM5.09804 13.6763C5.27162 13.9753 5.50063 14.235 5.77339 14.445C6.04762 14.6551 6.3583 14.8082 6.69087 14.8972C7.02344 14.9862 7.3706 15.0095 7.71192 14.9643C8.05324 14.9191 8.38143 14.8082 8.68046 14.6361L11.4985 13.0097L11.5058 13.0024C11.5078 13.0005 11.5092 12.9976 11.5102 12.9937C11.5122 12.9908 11.5136 12.9878 11.5146 12.9849V11.6138L8.11305 13.5815C8.07804 13.6019 8.04157 13.6165 8.00365 13.6282C7.96426 13.6384 7.92488 13.6428 7.88404 13.6428C7.84466 13.6428 7.80527 13.6384 7.76589 13.6282C7.72797 13.6165 7.69004 13.6019 7.65503 13.5815L4.86758 11.9712C4.84278 11.9566 4.80631 11.9347 4.78589 11.9216C4.75964 12.0718 4.74651 12.2235 4.74651 12.3752C4.74651 12.5269 4.7611 12.6786 4.78735 12.8289C4.81361 12.9776 4.85445 13.125 4.9055 13.2679C4.95801 13.4108 5.02219 13.548 5.09804 13.6792V13.6763ZM4.36581 7.5938C4.19369 7.89282 4.08283 8.22248 4.03761 8.5638C3.9924 8.90512 4.01573 9.25082 4.10471 9.58484C4.19369 9.91741 4.34684 10.2281 4.55689 10.5023C4.76693 10.7751 5.02803 11.0041 5.32559 11.1762L8.14222 12.8041C8.14514 12.805 8.14854 12.806 8.15243 12.807H8.16264C8.16653 12.807 8.16993 12.806 8.17285 12.8041C8.17577 12.8031 8.17868 12.8016 8.1816 12.7997L9.3631 12.117L5.96156 10.1537C5.92801 10.1333 5.89592 10.1085 5.86674 10.0808C5.83848 10.0524 5.81397 10.0206 5.79381 9.98597C5.77485 9.95096 5.75881 9.9145 5.74859 9.87511C5.73838 9.83719 5.73255 9.7978 5.73401 9.75696V6.4444C5.59106 6.49691 5.45249 6.56109 5.32121 6.63694C5.18994 6.71425 5.06595 6.80176 4.94926 6.89949C4.83403 6.99722 4.72609 7.10516 4.62836 7.22185C4.53063 7.33708 4.44457 7.46253 4.36872 7.5938H4.36581ZM14.0409 9.84594C14.076 9.86636 14.108 9.8897 14.1372 9.91887C14.1649 9.94659 14.1897 9.97868 14.2101 10.0137C14.2291 10.0487 14.2452 10.0866 14.2554 10.1245C14.2641 10.1639 14.27 10.2033 14.2685 10.2441V13.5567C14.7367 13.3846 15.1451 13.0827 15.4471 12.6859C15.7505 12.2892 15.9328 11.8151 15.9751 11.3192C16.0174 10.8232 15.9182 10.3244 15.6877 9.88241C15.4573 9.44044 15.1058 9.07286 14.674 8.82489L11.8574 7.19705C11.8544 7.19608 11.851 7.19511 11.8472 7.19414H11.8369C11.834 7.19511 11.8306 7.19608 11.8267 7.19705C11.8238 7.19803 11.8209 7.19949 11.818 7.20143L10.6423 7.88116L14.0439 9.84594H14.0409ZM15.2151 8.08099H15.2137V8.08245L15.2151 8.08099ZM15.2137 8.07953C15.2983 7.58943 15.2414 7.08474 15.0489 6.62527C14.8578 6.1658 14.5383 5.77051 14.1299 5.48461C13.7215 5.20018 13.2402 5.03681 12.7428 5.01493C12.2439 4.99451 11.7509 5.11558 11.3191 5.36355L8.5025 6.98993C8.49958 6.99187 8.49715 6.9943 8.49521 6.99722L8.48937 7.00597C8.4884 7.00889 8.48743 7.01229 8.48646 7.01618C8.48548 7.0191 8.485 7.0225 8.485 7.02639V8.38584L11.8865 6.42106C11.9215 6.40064 11.9595 6.38605 11.9974 6.37438C12.0368 6.36417 12.0762 6.3598 12.1155 6.3598C12.1564 6.3598 12.1958 6.36417 12.2352 6.37438C12.2731 6.38605 12.3095 6.40064 12.3446 6.42106L15.132 8.03139C15.1568 8.04598 15.1933 8.0664 15.2137 8.07953ZM7.8432 6.57422C7.8432 6.53483 7.84903 6.49545 7.85924 6.45607C7.86945 6.41814 7.88404 6.38022 7.90446 6.34521C7.92488 6.31166 7.94822 6.27957 7.97739 6.2504C8.00511 6.22268 8.0372 6.19789 8.0722 6.17893L10.8597 4.57005C10.8859 4.554 10.9224 4.53358 10.9428 4.52337C10.5606 4.20393 10.0939 3.99972 9.5994 3.937C9.10492 3.87282 8.60315 3.95159 8.15243 4.16309C7.70025 4.37459 7.31809 4.71154 7.05116 5.13162C6.78423 5.55317 6.64274 6.04036 6.64274 6.53921V9.79197C6.64371 9.79586 6.64468 9.79926 6.64566 9.80218C6.64663 9.8051 6.64809 9.80802 6.65003 9.81093C6.65198 9.81385 6.65441 9.81677 6.65733 9.81968C6.65927 9.82163 6.66219 9.82357 6.66608 9.82552L7.8432 10.5052V6.57422ZM8.48208 10.8728L9.9976 11.748L11.5131 10.8728V9.12391L9.99906 8.24873L8.48354 9.12391L8.48208 10.8728Z" fill="white"/>
+</svg>
diff --git a/app/components/header/assets/hugging-face.svg b/app/components/header/assets/hugging-face.svg
new file mode 100644
index 0000000..1f53ec0
--- /dev/null
+++ b/app/components/header/assets/hugging-face.svg
@@ -0,0 +1,21 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="24" height="24" rx="6" fill="white"/>
+<path d="M11.9514 17.4737C15.1838 17.4737 17.8041 14.8534 17.8041 11.6211C17.8041 8.38874 15.1838 5.76843 11.9514 5.76843C8.71913 5.76843 6.09882 8.38874 6.09882 11.6211C6.09882 14.8534 8.71913 17.4737 11.9514 17.4737Z" fill="#FFD21E"/>
+<path d="M17.8041 11.621C17.8041 8.38872 15.1838 5.76841 11.9515 5.76841C8.71917 5.76841 6.09886 8.38872 6.09886 11.621C6.09886 14.8534 8.71917 17.4737 11.9515 17.4737C15.1838 17.4737 17.8041 14.8534 17.8041 11.621ZM5.42517 11.621C5.42517 8.01666 8.3471 5.09473 11.9515 5.09473C15.5559 5.09473 18.4778 8.01666 18.4778 11.621C18.4778 15.2254 15.5559 18.1474 11.9515 18.1474C8.3471 18.1474 5.42517 15.2254 5.42517 11.621Z" fill="#FF9D0B"/>
+<path d="M13.853 10.028C14.0676 10.1038 14.1531 10.5451 14.3699 10.4298C14.7805 10.2114 14.9364 9.70155 14.7181 9.29091C14.4997 8.88028 13.9898 8.72439 13.5792 8.94273C13.1685 9.16107 13.0127 9.67097 13.231 10.0816C13.3341 10.2754 13.6611 9.96028 13.853 10.028Z" fill="#3A3B45"/>
+<path d="M9.88553 10.028C9.6709 10.1038 9.58551 10.5451 9.36868 10.4298C8.95804 10.2114 8.80215 9.70155 9.02049 9.29091C9.23883 8.88028 9.74873 8.72439 10.1594 8.94273C10.57 9.16107 10.7259 9.67097 10.5076 10.0816C10.4045 10.2754 10.0774 9.96028 9.88553 10.028Z" fill="#3A3B45"/>
+<path d="M11.9094 14.0697C13.5647 14.0697 14.0989 12.5938 14.0989 11.836C14.0989 11.4421 13.8341 11.5661 13.41 11.776C13.0181 11.97 12.4901 12.2375 11.9094 12.2375C10.7002 12.2375 9.71991 11.0781 9.71991 11.836C9.71991 12.5938 10.2541 14.0697 11.9094 14.0697Z" fill="#3A3B45"/>
+<mask id="mask0_3907_39368" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="9" y="11" width="6" height="4">
+<path d="M11.9094 14.0697C13.5647 14.0697 14.0989 12.5938 14.0989 11.836C14.0989 11.4421 13.8341 11.5661 13.41 11.776C13.0181 11.97 12.4901 12.2375 11.9094 12.2375C10.7002 12.2375 9.71991 11.0781 9.71991 11.836C9.71991 12.5938 10.2541 14.0697 11.9094 14.0697Z" fill="white"/>
+</mask>
+<g mask="url(#mask0_3907_39368)">
+<path d="M11.9515 15.7894C12.7582 15.7894 13.4122 15.1354 13.4122 14.3287C13.4122 13.7004 13.0154 13.1647 12.4588 12.9585C12.4383 12.9509 12.4176 12.9438 12.3967 12.9371C12.2563 12.8922 12.1068 13.3747 11.9515 13.3747C11.8064 13.3747 11.6663 12.8892 11.534 12.9285C10.9307 13.1081 10.4908 13.6671 10.4908 14.3287C10.4908 15.1354 11.1448 15.7894 11.9515 15.7894Z" fill="#F94040"/>
+</g>
+<path d="M15.9094 10.8211C16.2117 10.8211 16.4567 10.576 16.4567 10.2737C16.4567 9.97139 16.2117 9.72632 15.9094 9.72632C15.6071 9.72632 15.362 9.97139 15.362 10.2737C15.362 10.576 15.6071 10.8211 15.9094 10.8211Z" fill="#FF9D0B"/>
+<path d="M8.07776 10.8211C8.38006 10.8211 8.62513 10.576 8.62513 10.2737C8.62513 9.97139 8.38006 9.72632 8.07776 9.72632C7.77545 9.72632 7.5304 9.97139 7.5304 10.2737C7.5304 10.576 7.77545 10.8211 8.07776 10.8211Z" fill="#FF9D0B"/>
+<path d="M6.9514 12.6737C6.67872 12.6737 6.43502 12.7857 6.26508 12.9888C6.15999 13.1146 6.05018 13.3174 6.04125 13.6211C5.92689 13.5882 5.81691 13.5699 5.71418 13.5699C5.45312 13.5699 5.21733 13.6699 5.0506 13.8516C4.83636 14.0849 4.74121 14.3716 4.78264 14.6584C4.80234 14.795 4.84799 14.9174 4.9162 15.0308C4.77236 15.1471 4.66643 15.3092 4.61523 15.504C4.57514 15.6568 4.53405 15.9749 4.74862 16.3027C4.73498 16.3241 4.72218 16.3463 4.71022 16.369C4.58121 16.6139 4.57295 16.8906 4.68681 17.1483C4.85944 17.5389 5.28841 17.8466 6.12142 18.1769C6.63965 18.3823 7.11375 18.5137 7.11796 18.5149C7.8031 18.6926 8.42272 18.7828 8.95914 18.7828C9.94508 18.7828 10.6509 18.4809 11.0572 17.8853C11.711 16.9263 11.6175 16.0492 10.7715 15.2037C10.3033 14.7359 9.99207 14.046 9.92723 13.8946C9.79653 13.4463 9.45093 12.9479 8.87645 12.9479C8.82811 12.9479 8.7791 12.9518 8.73093 12.9593C8.47931 12.9989 8.25935 13.1438 8.10222 13.3617C7.93262 13.1508 7.7679 12.9831 7.61885 12.8884C7.39418 12.746 7.16967 12.6737 6.9514 12.6737ZM6.9514 13.3474C7.03729 13.3474 7.14222 13.3839 7.25792 13.4574C7.61716 13.6852 8.31039 14.8768 8.5642 15.3403C8.64925 15.4956 8.7946 15.5613 8.92546 15.5613C9.18516 15.5613 9.38794 15.3031 8.94921 14.975C8.2895 14.4814 8.52091 13.6745 8.83586 13.6248C8.84967 13.6226 8.86331 13.6216 8.87645 13.6216C9.16277 13.6216 9.28908 14.1151 9.28908 14.1151C9.28908 14.1151 9.65927 15.0447 10.2952 15.6802C10.9312 16.3158 10.964 16.826 10.5005 17.5057C10.1844 17.9692 9.57927 18.1092 8.95914 18.1092C8.31594 18.1092 7.65658 17.9586 7.28706 17.8628C7.26887 17.858 5.02163 17.2233 5.30626 16.683C5.35409 16.5922 5.43291 16.5558 5.53211 16.5558C5.93295 16.5558 6.66205 17.1524 6.97548 17.1524C7.04554 17.1524 7.09489 17.1225 7.1151 17.0498C7.24866 16.5706 5.08445 16.3692 5.26685 15.6751C5.29902 15.5524 5.38626 15.5025 5.50887 15.5027C6.03855 15.5027 7.22693 16.4342 7.47603 16.4342C7.49506 16.4342 7.5087 16.4287 7.51611 16.4169C7.64091 16.2154 7.57253 16.0748 6.69287 15.5424C5.81321 15.0099 5.19578 14.6895 5.54693 14.3072C5.58735 14.2631 5.64462 14.2436 5.71418 14.2436C6.24824 14.2437 7.51005 15.392 7.51005 15.392C7.51005 15.392 7.8506 15.7462 8.05658 15.7462C8.1039 15.7462 8.14415 15.7275 8.17144 15.6814C8.31746 15.4351 6.81514 14.2966 6.73043 13.8269C6.673 13.5086 6.77068 13.3474 6.9514 13.3474Z" fill="#FF9D0B"/>
+<path d="M10.5005 17.5057C10.964 16.8259 10.9312 16.3158 10.2952 15.6802C9.65925 15.0447 9.28906 14.115 9.28906 14.115C9.28906 14.115 9.15079 13.5751 8.83584 13.6247C8.5209 13.6744 8.28965 14.4813 8.94936 14.975C9.60907 15.4685 8.81799 15.8038 8.56418 15.3403C8.31037 14.8768 7.61732 13.6852 7.25791 13.4573C6.89866 13.2295 6.6457 13.3571 6.73041 13.8269C6.81513 14.2966 8.31761 15.4351 8.17142 15.6815C8.02523 15.9277 7.51003 15.392 7.51003 15.392C7.51003 15.392 5.89791 13.9249 5.54691 14.3072C5.19592 14.6895 5.81319 15.0098 6.69285 15.5424C7.57269 16.0748 7.6409 16.2154 7.5161 16.4168C7.39113 16.6183 5.44922 14.981 5.26682 15.6751C5.08459 16.3692 7.24864 16.5706 7.11509 17.0498C6.98153 17.5291 5.5907 16.1428 5.30624 16.6829C5.0216 17.2232 7.26885 17.858 7.28704 17.8627C8.01294 18.051 9.85648 18.45 10.5005 17.5057Z" fill="#FFD21E"/>
+<path d="M17.0358 12.6737C17.3084 12.6737 17.5521 12.7857 17.7221 12.9888C17.8272 13.1146 17.937 13.3174 17.9459 13.6211C18.0603 13.5882 18.1702 13.5699 18.273 13.5699C18.534 13.5699 18.7698 13.6699 18.9366 13.8516C19.1508 14.0849 19.2459 14.3716 19.2045 14.6584C19.1848 14.795 19.1392 14.9174 19.071 15.0308C19.2148 15.1471 19.3207 15.3092 19.3719 15.504C19.412 15.6568 19.4531 15.9749 19.2385 16.3027C19.2522 16.3241 19.265 16.3463 19.2769 16.369C19.4059 16.6139 19.4142 16.8906 19.3003 17.1483C19.1277 17.5389 18.6987 17.8466 17.8657 18.1769C17.3475 18.3823 16.8734 18.5137 16.8692 18.5149C16.1841 18.6926 15.5644 18.7828 15.028 18.7828C14.0421 18.7828 13.3362 18.4809 12.93 17.8853C12.2762 16.9263 12.3697 16.0492 13.2156 15.2037C13.6838 14.7359 13.9951 14.046 14.0599 13.8946C14.1906 13.4463 14.5362 12.9479 15.1107 12.9479C15.159 12.9479 15.2081 12.9518 15.2562 12.9593C15.5078 12.9989 15.7278 13.1438 15.8849 13.3617C16.0545 13.1508 16.2193 12.9831 16.3683 12.8884C16.593 12.746 16.8175 12.6737 17.0358 12.6737ZM17.0358 13.3474C16.9499 13.3474 16.8449 13.3839 16.7292 13.4574C16.37 13.6852 15.6768 14.8768 15.423 15.3403C15.3379 15.4956 15.1926 15.5613 15.0617 15.5613C14.802 15.5613 14.5992 15.3031 15.0379 14.975C15.6977 14.4814 15.4662 13.6745 15.1513 13.6248C15.1375 13.6226 15.1238 13.6216 15.1107 13.6216C14.8244 13.6216 14.6981 14.1151 14.6981 14.1151C14.6981 14.1151 14.3279 15.0447 13.6919 15.6802C13.056 16.3158 13.0231 16.826 13.4866 17.5057C13.8027 17.9692 14.4079 18.1092 15.028 18.1092C15.6712 18.1092 16.3306 17.9586 16.7001 17.8628C16.7183 17.858 18.9655 17.2233 18.6809 16.683C18.6331 16.5922 18.5542 16.5558 18.455 16.5558C18.0542 16.5558 17.3251 17.1524 17.0117 17.1524C16.9416 17.1524 16.8923 17.1225 16.8721 17.0498C16.7385 16.5706 18.9027 16.3692 18.7203 15.6751C18.6881 15.5524 18.6009 15.5025 18.4783 15.5027C17.9486 15.5027 16.7602 16.4342 16.5111 16.4342C16.4921 16.4342 16.4785 16.4287 16.471 16.4169C16.3462 16.2154 16.4146 16.0748 17.2943 15.5424C18.1739 15.0099 18.7914 14.6895 18.4402 14.3072C18.3998 14.2631 18.3425 14.2436 18.273 14.2436C17.7389 14.2437 16.4771 15.392 16.4771 15.392C16.4771 15.392 16.1366 15.7462 15.9306 15.7462C15.8833 15.7462 15.843 15.7275 15.8157 15.6814C15.6697 15.4351 17.172 14.2966 17.2567 13.8269C17.3142 13.5086 17.2165 13.3474 17.0358 13.3474Z" fill="#FF9D0B"/>
+<path d="M13.4867 17.5057C13.0232 16.8259 13.056 16.3158 13.692 15.6802C14.3279 15.0447 14.6981 14.115 14.6981 14.115C14.6981 14.115 14.8364 13.5751 15.1513 13.6247C15.4663 13.6744 15.6975 14.4813 15.0378 14.975C14.3781 15.4685 15.1692 15.8038 15.423 15.3403C15.6768 14.8768 16.3699 13.6852 16.7293 13.4573C17.0885 13.2295 17.3415 13.3571 17.2568 13.8269C17.1721 14.2966 15.6696 15.4351 15.8158 15.6815C15.962 15.9277 16.4772 15.392 16.4772 15.392C16.4772 15.392 18.0893 13.9249 18.4403 14.3072C18.7913 14.6895 18.174 15.0098 17.2943 15.5424C16.4145 16.0748 16.3463 16.2154 16.4711 16.4168C16.5961 16.6183 18.538 14.981 18.7204 15.6751C18.9026 16.3692 16.7385 16.5706 16.8721 17.0498C17.0057 17.5291 18.3965 16.1428 18.6809 16.6829C18.9656 17.2232 16.7183 17.858 16.7001 17.8627C15.9743 18.051 14.1307 18.45 13.4867 17.5057Z" fill="#FFD21E"/>
+<rect x="0.25" y="0.25" width="23.5" height="23.5" rx="5.75" stroke="black" stroke-opacity="0.05" stroke-width="0.5"/>
+</svg>
diff --git a/app/components/header/assets/notion.svg b/app/components/header/assets/notion.svg
new file mode 100644
index 0000000..eeda894
--- /dev/null
+++ b/app/components/header/assets/notion.svg
@@ -0,0 +1,12 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_5364_42310)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M3.5725 18.2611L1.4229 15.5832C0.905706 14.9389 0.625 14.1466 0.625 13.3312V3.63437C0.625 2.4129 1.60224 1.39936 2.86295 1.31328L12.8326 0.632614C13.5569 0.583164 14.2768 0.775682 14.8717 1.17794L18.3745 3.5462C19.0015 3.97012 19.375 4.66312 19.375 5.40266V16.427C19.375 17.6223 18.4141 18.6121 17.1798 18.688L6.11458 19.3692C5.12958 19.4298 4.17749 19.0148 3.5725 18.2611Z" fill="white"/>
+<path d="M7.03006 8.48663V8.35968C7.03006 8.03787 7.28779 7.77098 7.61997 7.7488L10.0396 7.58726L13.3857 12.5146V8.19003L12.5244 8.07522V8.01492C12.5244 7.68933 12.788 7.42068 13.1244 7.40344L15.326 7.29066V7.60749C15.326 7.75622 15.2154 7.88343 15.0638 7.90907L14.534 7.99868V15.0022L13.8691 15.2309C13.3136 15.4219 12.6952 15.2174 12.3772 14.7376L9.12879 9.83568V14.5143L10.1287 14.7056L10.1147 14.7984C10.0711 15.0889 9.82028 15.3086 9.51687 15.3221L7.03006 15.4328C6.99718 15.1204 7.23132 14.8409 7.55431 14.807L7.88143 14.7726V8.53447L7.03006 8.48663Z" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.9218 1.85418L2.95217 2.53485C2.35499 2.57562 1.89209 3.05572 1.89209 3.63431V13.3311C1.89209 13.8748 2.07923 14.4029 2.42402 14.8325L4.57362 17.5104C4.92117 17.9433 5.46812 18.1817 6.03397 18.1469L17.0991 17.4658C17.6663 17.4309 18.1078 16.9761 18.1078 16.4269V5.4026C18.1078 5.06281 17.9362 4.74441 17.6481 4.54963L14.1453 2.18137C13.7883 1.94002 13.3564 1.82451 12.9218 1.85418ZM3.44654 3.78556C3.30788 3.6829 3.37387 3.46903 3.54806 3.45654L12.9889 2.77938C13.2897 2.75781 13.5886 2.84064 13.8318 3.01299L15.7261 4.35502C15.798 4.40597 15.7642 4.51596 15.6752 4.5208L5.67742 5.06454C5.37485 5.081 5.0762 4.99211 4.83563 4.814L3.44654 3.78556ZM5.20848 6.76913C5.20848 6.44433 5.47088 6.17604 5.80642 6.15777L16.3769 5.5821C16.7039 5.56429 16.9792 5.81577 16.9792 6.13232V15.6782C16.9792 16.0024 16.7177 16.2705 16.3829 16.2895L5.8793 16.8871C5.51537 16.9079 5.20848 16.6282 5.20848 16.2759V6.76913Z" fill="black"/>
+</g>
+<defs>
+<clipPath id="clip0_5364_42310">
+<rect width="20" height="20" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/header/assets/salesforce.svg b/app/components/header/assets/salesforce.svg
new file mode 100644
index 0000000..1deebd9
--- /dev/null
+++ b/app/components/header/assets/salesforce.svg
@@ -0,0 +1,12 @@
+<svg width="24" height="17" viewBox="0 0 24 17" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_660_2015)">
+<path d="M9.98736 1.91633C10.7614 1.10782 11.839 0.60636 13.0308 0.60636C14.6151 0.60636 15.9973 1.49199 16.7334 2.80672C17.373 2.52021 18.0811 2.36082 18.826 2.36082C21.6834 2.36082 24 4.70345 24 7.59305C24 10.483 21.6834 12.8256 18.826 12.8256C18.4837 12.8258 18.1423 12.7917 17.8068 12.7238C17.1587 13.8829 15.9234 14.6661 14.5057 14.6661C13.9121 14.6661 13.3508 14.5287 12.851 14.2843C12.1939 15.8338 10.6629 16.9203 8.87863 16.9203C7.02052 16.9203 5.43692 15.7416 4.82907 14.0886C4.56344 14.1451 4.28822 14.1746 4.00581 14.1746C1.79351 14.1746 0 12.3581 0 10.117C0 8.61511 0.805814 7.30378 2.00308 6.6022C1.75659 6.03362 1.61948 5.40606 1.61948 4.74627C1.61948 2.1689 3.70667 0.0795898 6.28103 0.0795898C7.79248 0.0795898 9.13574 0.800021 9.98736 1.91633Z" fill="#00A1E0"/>
+<path d="M3.47612 8.81302C3.46109 8.85245 3.4816 8.86068 3.48638 8.86752C3.5315 8.90042 3.57734 8.9241 3.62349 8.95047C3.86827 9.08069 4.0994 9.11872 4.34111 9.11872C4.83341 9.11872 5.13904 8.8562 5.13904 8.4336V8.42539C5.13904 8.03464 4.79411 7.89276 4.47033 7.79028L4.42829 7.77658C4.18418 7.69705 3.97359 7.62854 3.97359 7.46744V7.45889C3.97359 7.3211 4.09666 7.21963 4.28744 7.21963C4.4994 7.21963 4.75103 7.29025 4.91307 7.38003C4.91307 7.38003 4.96059 7.41089 4.97803 7.36462C4.9876 7.33993 5.06966 7.11853 5.07821 7.09454C5.08744 7.06848 5.07103 7.04929 5.05429 7.039C4.86933 6.92624 4.61359 6.84912 4.34899 6.84912L4.29976 6.84946C3.84917 6.84946 3.53465 7.12228 3.53465 7.51334V7.52158C3.53465 7.93388 3.88165 8.06754 4.20679 8.16077L4.25909 8.17688C4.49602 8.24988 4.70012 8.3126 4.70012 8.47986V8.4881C4.70012 8.64096 4.56749 8.75474 4.35346 8.75474C4.27038 8.75474 4.00542 8.75303 3.71927 8.5717C3.68473 8.55147 3.66457 8.53675 3.6379 8.52064C3.6239 8.51173 3.58868 8.49629 3.5733 8.54292L3.47612 8.81302ZM10.6833 8.81302C10.6682 8.85245 10.6888 8.86068 10.6935 8.86752C10.7387 8.90042 10.7845 8.9241 10.8306 8.95047C11.0754 9.08069 11.3066 9.11872 11.5482 9.11872C12.0405 9.11872 12.3462 8.8562 12.3462 8.4336V8.42539C12.3462 8.03464 12.0012 7.89276 11.6775 7.79028L11.6354 7.77658C11.3913 7.69705 11.1807 7.62854 11.1807 7.46744V7.45889C11.1807 7.3211 11.3038 7.21963 11.4946 7.21963C11.7065 7.21963 11.9581 7.29025 12.1202 7.38003C12.1202 7.38003 12.1677 7.41089 12.1851 7.36462C12.1947 7.33993 12.2768 7.11853 12.2853 7.09454C12.2946 7.06848 12.2781 7.04929 12.2614 7.039C12.0764 6.92624 11.8207 6.84912 11.5561 6.84912L11.5069 6.84946C11.0563 6.84946 10.7417 7.12228 10.7417 7.51334V7.52158C10.7417 7.93388 11.0887 8.06754 11.4139 8.16077L11.4662 8.17688C11.7031 8.24988 11.9076 8.3126 11.9076 8.47986V8.4881C11.9076 8.64096 11.7746 8.75474 11.5605 8.75474C11.4775 8.75474 11.2125 8.75303 10.9264 8.5717C10.8918 8.55147 10.8713 8.53743 10.8454 8.52064C10.8365 8.51481 10.7948 8.4987 10.7804 8.54292L10.6833 8.81302ZM15.6034 7.98525C15.6034 8.22414 15.559 8.41228 15.4715 8.54528C15.385 8.6769 15.254 8.74099 15.0715 8.74099C14.8886 8.74099 14.7583 8.67724 14.6732 8.54528C14.587 8.41265 14.5433 8.22414 14.5433 7.98525C14.5433 7.74672 14.587 7.55888 14.6732 7.42726C14.7583 7.29704 14.8886 7.23363 15.0715 7.23363C15.254 7.23363 15.385 7.29704 15.4718 7.42726C15.559 7.55886 15.6034 7.74669 15.6034 7.98525ZM16.0144 7.54243C15.974 7.40566 15.9111 7.28502 15.8274 7.18461C15.7436 7.08385 15.6376 7.00297 15.5118 6.94401C15.3863 6.88542 15.238 6.8556 15.0715 6.8556C14.9046 6.8556 14.7563 6.88542 14.6308 6.94401C14.505 7.00297 14.399 7.08387 14.3149 7.18461C14.2315 7.28538 14.1686 7.40602 14.1279 7.54243C14.0879 7.67849 14.0677 7.82723 14.0677 7.98525C14.0677 8.14326 14.0879 8.29235 14.1279 8.42806C14.1686 8.56447 14.2312 8.68513 14.3153 8.78588C14.399 8.88665 14.5053 8.96718 14.6308 9.02441C14.7566 9.08166 14.9046 9.11077 15.0715 9.11077C15.238 9.11077 15.386 9.08166 15.5118 9.02441C15.6373 8.96718 15.7436 8.88662 15.8274 8.78588C15.9112 8.68545 15.974 8.56481 16.0144 8.42806C16.0548 8.29201 16.0749 8.1429 16.0749 7.98525C16.0749 7.82759 16.0547 7.67849 16.0144 7.54243ZM19.389 8.67719C19.3753 8.63709 19.3367 8.65216 19.3367 8.65216C19.2768 8.67514 19.2132 8.69638 19.1456 8.707C19.0768 8.7176 19.0013 8.72312 18.9202 8.72312C18.7213 8.72312 18.5633 8.66382 18.4502 8.5466C18.3367 8.42938 18.2731 8.23987 18.2737 7.98349C18.2744 7.75009 18.3305 7.57459 18.4314 7.44094C18.5315 7.30797 18.684 7.23974 18.8874 7.23974C19.057 7.23974 19.1862 7.25928 19.3216 7.30212C19.3216 7.30212 19.3541 7.31616 19.3695 7.27368C19.4053 7.17358 19.432 7.10196 19.4703 6.99194C19.4813 6.96075 19.4546 6.94738 19.445 6.9436C19.3917 6.9227 19.2659 6.88879 19.1708 6.87439C19.0819 6.86068 18.978 6.85348 18.8625 6.85348C18.6898 6.85348 18.5359 6.88296 18.4043 6.94192C18.273 7.00052 18.1616 7.08139 18.0734 7.18218C17.9852 7.28295 17.9182 7.40356 17.8734 7.53998C17.829 7.67603 17.8064 7.82547 17.8064 7.98349C17.8064 8.3252 17.8984 8.60142 18.0799 8.80365C18.2618 9.00656 18.535 9.10972 18.8912 9.10972C19.1018 9.10972 19.3179 9.06689 19.4731 9.00553C19.4731 9.00553 19.5028 8.99112 19.4898 8.95654L19.389 8.67719ZM20.108 7.7564C20.1275 7.62377 20.1641 7.51339 20.2205 7.42738C20.3056 7.2968 20.4355 7.22517 20.6181 7.22517C20.8007 7.22517 20.9213 7.29714 21.0078 7.42738C21.0653 7.51339 21.0902 7.62858 21.1001 7.7564H20.108ZM21.4916 7.46471C21.4567 7.33276 21.3702 7.19943 21.3135 7.13842C21.2239 7.04177 21.1364 6.97426 21.0495 6.93655C20.936 6.88787 20.7999 6.85567 20.6509 6.85567C20.4772 6.85567 20.3196 6.88481 20.1918 6.94512C20.0636 7.00545 19.9559 7.08772 19.8714 7.1902C19.7869 7.29232 19.7234 7.41399 19.683 7.55212C19.6423 7.68957 19.6218 7.83934 19.6218 7.99731C19.6218 8.15808 19.643 8.30785 19.6851 8.44253C19.7275 8.57827 19.7952 8.69788 19.8868 8.79691C19.9781 8.89667 20.0957 8.97482 20.2365 9.02927C20.3764 9.08344 20.5463 9.11155 20.7415 9.11118C21.1432 9.10981 21.3548 9.02003 21.442 8.97169C21.4574 8.96314 21.4721 8.94806 21.4536 8.90488L21.3627 8.64951C21.349 8.61149 21.3104 8.62553 21.3104 8.62553C21.2109 8.66254 21.0694 8.72904 20.7394 8.72837C20.5237 8.72803 20.3637 8.66428 20.2635 8.56452C20.1606 8.4624 20.1104 8.31226 20.1015 8.10047L21.4926 8.10184C21.4926 8.10184 21.5291 8.10116 21.5329 8.0655C21.5343 8.05047 21.5808 7.77901 21.4916 7.46471ZM8.9672 7.7564C8.98702 7.62377 9.02327 7.51339 9.07968 7.42738C9.1648 7.2968 9.29472 7.22517 9.47728 7.22517C9.65984 7.22517 9.78053 7.29714 9.86735 7.42738C9.92444 7.51339 9.9494 7.62858 9.95932 7.7564H8.9672ZM10.3504 7.46471C10.3156 7.33276 10.2294 7.19943 10.1727 7.13842C10.0831 7.04177 9.99557 6.97426 9.90875 6.93655C9.79524 6.88787 9.65919 6.85567 9.51012 6.85567C9.33678 6.85567 9.17883 6.88481 9.05097 6.94512C8.92278 7.00545 8.81508 7.08772 8.73063 7.1902C8.64619 7.29232 8.5826 7.41399 8.54226 7.55212C8.50193 7.68957 8.48107 7.83934 8.48107 7.99731C8.48107 8.15808 8.50226 8.30785 8.54433 8.44253C8.58673 8.57827 8.65443 8.69788 8.74603 8.79691C8.83733 8.89667 8.95492 8.97482 9.09578 9.02927C9.23562 9.08344 9.40552 9.11155 9.60074 9.11118C10.0024 9.10981 10.2141 9.02003 10.3013 8.97169C10.3167 8.96314 10.3313 8.94806 10.3129 8.90488L10.2223 8.64951C10.2083 8.61149 10.1696 8.62553 10.1696 8.62553C10.0702 8.66254 9.92895 8.72904 9.59836 8.72837C9.38298 8.72803 9.22298 8.66428 9.1228 8.56452C9.01988 8.4624 8.96965 8.31226 8.96074 8.10047L10.3518 8.10184C10.3518 8.10184 10.3884 8.10116 10.3922 8.0655C10.3935 8.05047 10.44 7.77901 10.3504 7.46471ZM5.96033 8.66955C5.90596 8.62601 5.89844 8.61505 5.87999 8.58694C5.85263 8.5441 5.83862 8.48309 5.83862 8.40564C5.83862 8.28293 5.87896 8.19485 5.96273 8.13556C5.96172 8.13592 6.08239 8.03103 6.36614 8.03479C6.56545 8.03753 6.74356 8.06701 6.74356 8.06701V8.70108H6.7439C6.7439 8.70108 6.56715 8.73911 6.36818 8.7511C6.08511 8.76825 5.9593 8.66922 5.96033 8.66955ZM6.51382 7.68966C6.45741 7.68554 6.38423 7.68313 6.29671 7.68313C6.17741 7.68313 6.06219 7.69821 5.95415 7.72735C5.84545 7.75647 5.74767 7.80209 5.66356 7.86237C5.57958 7.92246 5.51056 8.00116 5.46185 8.09235C5.41263 8.18421 5.38767 8.29251 5.38767 8.41385C5.38767 8.53723 5.40886 8.6445 5.45126 8.73227C5.49366 8.82034 5.55485 8.89368 5.63278 8.95025C5.71005 9.0068 5.80545 9.04825 5.9162 9.07328C6.02527 9.0983 6.14901 9.11097 6.28441 9.11097C6.42697 9.11097 6.56919 9.09934 6.70697 9.07566C6.84338 9.05235 7.0109 9.01841 7.05739 9.00782C7.08998 8.99994 7.12247 8.9916 7.15483 8.98279C7.18937 8.97424 7.18663 8.9372 7.18663 8.9372L7.18594 7.66189C7.18594 7.3822 7.11142 7.17484 6.96475 7.04632C6.81875 6.91815 6.60372 6.85334 6.32578 6.85334C6.22149 6.85334 6.05364 6.86776 5.95312 6.88797C5.95312 6.88797 5.64919 6.94693 5.52405 7.04495C5.52405 7.04495 5.49671 7.0621 5.51175 7.10049L5.61023 7.36578C5.62253 7.40005 5.6557 7.38839 5.6557 7.38839C5.6557 7.38839 5.6663 7.38427 5.67862 7.37707C5.94632 7.23107 6.28477 7.23553 6.28477 7.23553C6.43521 7.23553 6.55077 7.26568 6.6287 7.32565C6.70459 7.38391 6.74322 7.47199 6.74322 7.65775V7.71671C6.62356 7.69958 6.51382 7.68966 6.51382 7.68966ZM17.7337 6.97108C17.7443 6.93953 17.7221 6.92446 17.7129 6.92104C17.6893 6.91179 17.571 6.88677 17.4797 6.88094C17.305 6.87032 17.2079 6.89979 17.1211 6.93886C17.0349 6.97792 16.9392 7.04098 16.8859 7.11263V6.94298C16.8859 6.91933 16.8691 6.90047 16.8459 6.90047H16.4893C16.466 6.90047 16.4493 6.9193 16.4493 6.94298V9.02304C16.4493 9.04635 16.4684 9.06555 16.4917 9.06555H16.8571C16.8683 9.06548 16.879 9.06097 16.8869 9.053C16.8948 9.04503 16.8992 9.03426 16.8992 9.02304V7.98387C16.8992 7.84438 16.9146 7.70524 16.9454 7.61784C16.9754 7.53145 17.0165 7.46223 17.0671 7.41252C17.118 7.36318 17.1758 7.32857 17.239 7.30903C17.3036 7.28914 17.3751 7.28264 17.4257 7.28264C17.4985 7.28264 17.5785 7.30147 17.5785 7.30147C17.6052 7.30455 17.6202 7.2881 17.6291 7.26378C17.653 7.20003 17.7207 7.00911 17.7337 6.97108Z" fill="white"/>
+<path d="M14.3032 6.00677C14.2588 5.99307 14.2184 5.9838 14.1658 5.97387C14.1124 5.96429 14.0489 5.95947 13.9767 5.95947C13.7251 5.95947 13.5268 6.03076 13.3877 6.17127C13.2492 6.31113 13.1552 6.52396 13.108 6.80399L13.0909 6.89823H12.775C12.775 6.89823 12.7367 6.89685 12.7285 6.93869L12.6769 7.22898C12.6731 7.25641 12.6851 7.27387 12.722 7.27387H13.0294L12.7176 9.01909C12.6933 9.15962 12.6652 9.27513 12.6341 9.36284C12.6037 9.44923 12.574 9.51399 12.537 9.56129C12.5015 9.60655 12.468 9.64012 12.4098 9.65965C12.362 9.67577 12.3066 9.6833 12.2461 9.6833C12.2126 9.6833 12.1678 9.67779 12.1346 9.67095C12.1018 9.66442 12.0844 9.65725 12.0594 9.6466C12.0594 9.6466 12.0235 9.63292 12.0092 9.6689C11.9979 9.69872 11.9158 9.92456 11.9059 9.95235C11.8964 9.98009 11.91 10.0017 11.9274 10.0082C11.9685 10.0226 11.9989 10.0322 12.0546 10.0456C12.1319 10.0637 12.1972 10.0648 12.2584 10.0648C12.3862 10.0648 12.5032 10.0466 12.5999 10.0116C12.697 9.97634 12.7818 9.91497 12.857 9.83205C12.938 9.74224 12.989 9.64833 13.0375 9.51982C13.0857 9.39299 13.1271 9.23534 13.1599 9.05165L13.4734 7.27387H13.9315C13.9315 7.27387 13.9702 7.27524 13.9781 7.23309L14.03 6.94314C14.0334 6.9154 14.0218 6.89825 13.9845 6.89825H13.5397C13.5421 6.88833 13.5623 6.73132 13.6133 6.58364C13.6351 6.52092 13.6761 6.46984 13.7107 6.43487C13.7449 6.4006 13.7842 6.37627 13.8273 6.36221C13.8714 6.34781 13.9217 6.34097 13.9767 6.34097C14.0184 6.34097 14.0598 6.34576 14.0909 6.35226C14.1339 6.36153 14.1507 6.36633 14.162 6.36977C14.2075 6.38348 14.2136 6.37011 14.2225 6.34819L14.3289 6.0555C14.3398 6.0239 14.3128 6.01053 14.3032 6.00677ZM8.08869 9.02287C8.08869 9.04618 8.07194 9.06504 8.04869 9.06504H7.6798C7.65655 9.06504 7.64014 9.04618 7.64014 9.02287V6.04654C7.64014 6.02325 7.65655 6.00439 7.6798 6.00439H8.04869C8.07194 6.00439 8.08869 6.02325 8.08869 6.04654V9.02287Z" fill="white"/>
+</g>
+<defs>
+<clipPath id="clip0_660_2015">
+<rect width="24" height="16.8421" fill="white" transform="translate(0 0.0791016)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/components/header/assets/serpapi.png b/app/components/header/assets/serpapi.png
new file mode 100644
index 0000000..9650453
--- /dev/null
+++ b/app/components/header/assets/serpapi.png
Binary files differ
diff --git a/app/components/header/assets/sync.svg b/app/components/header/assets/sync.svg
new file mode 100644
index 0000000..795077a
--- /dev/null
+++ b/app/components/header/assets/sync.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.69773 13.1783C7.29715 13.8879 9.20212 13.8494 10.8334 12.9075C13.5438 11.3427 14.4724 7.87704 12.9076 5.16672L12.7409 4.87804M3.09233 10.8335C1.52752 8.12314 2.45615 4.65746 5.16647 3.09265C6.7978 2.15081 8.70277 2.11227 10.3022 2.82185M1.66226 10.8892L3.48363 11.3773L3.97166 9.5559M12.0284 6.44393L12.5164 4.62256L14.3378 5.1106" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/header/assets/trash.svg b/app/components/header/assets/trash.svg
new file mode 100644
index 0000000..00c2989
--- /dev/null
+++ b/app/components/header/assets/trash.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M6 2H10M2 4H14M12.6667 4L12.1991 11.0129C12.129 12.065 12.0939 12.5911 11.8667 12.99C11.6666 13.3412 11.3648 13.6235 11.0011 13.7998C10.588 14 10.0607 14 9.00623 14H6.99377C5.93927 14 5.41202 14 4.99889 13.7998C4.63517 13.6235 4.33339 13.3412 4.13332 12.99C3.90607 12.5911 3.871 12.065 3.80086 11.0129L3.33333 4M6.66667 7V10.3333M9.33333 7V10.3333" stroke="#667085" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/app/components/header/assets/twitter.svg b/app/components/header/assets/twitter.svg
new file mode 100644
index 0000000..3cdbcd0
--- /dev/null
+++ b/app/components/header/assets/twitter.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.03168 15.0003C11.0694 15.0003 14.3718 9.9981 14.3718 5.66018C14.3718 5.5181 14.3718 5.37666 14.3622 5.23586C15.0047 4.77117 15.5593 4.19579 16 3.53666C15.4009 3.80227 14.7654 3.97637 14.1146 4.05314C14.7999 3.64294 15.3128 2.99767 15.5578 2.23746C14.9134 2.61987 14.2084 2.88935 13.4733 3.03426C12.9783 2.50798 12.3237 2.15949 11.6108 2.04272C10.8978 1.92595 10.1663 2.04741 9.52931 2.3883C8.89234 2.72919 8.38548 3.27051 8.08716 3.9285C7.78884 4.58648 7.71569 5.32444 7.87904 6.02818C6.57393 5.96272 5.29717 5.62354 4.13164 5.03267C2.9661 4.4418 1.93784 3.61244 1.1136 2.59842C0.693819 3.32109 0.565248 4.17658 0.754066 4.99071C0.942885 5.80484 1.43489 6.51639 2.12992 6.9805C1.60749 6.9652 1.09643 6.82426 0.64 6.56962V6.61122C0.640207 7.36912 0.902567 8.10362 1.38258 8.69014C1.86259 9.27665 2.53071 9.67907 3.2736 9.82914C2.79032 9.96097 2.28325 9.98024 1.79136 9.88546C2.00121 10.5377 2.40962 11.108 2.95949 11.5168C3.50937 11.9255 4.17322 12.1522 4.85824 12.1651C4.17763 12.7001 3.39821 13.0957 2.56458 13.3291C1.73096 13.5626 0.859476 13.6294 0 13.5258C1.50122 14.4891 3.24795 15.0001 5.03168 14.9978" fill="#1DA1F2"/>
+</svg>
diff --git a/app/components/header/dataset-nav/index.tsx b/app/components/header/dataset-nav/index.tsx
new file mode 100644
index 0000000..8c997f2
--- /dev/null
+++ b/app/components/header/dataset-nav/index.tsx
@@ -0,0 +1,65 @@
+'use client'
+
+import { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useParams, useRouter } from 'next/navigation'
+import {
+  RiBook2Fill,
+  RiBook2Line,
+} from '@remixicon/react'
+import useSWR from 'swr'
+import useSWRInfinite from 'swr/infinite'
+import { flatten } from 'lodash-es'
+import Nav from '../nav'
+import type { NavItem } from '../nav/nav-selector'
+import { fetchDatasetDetail, fetchDatasets } from '@/service/datasets'
+import type { DataSetListResponse } from '@/models/datasets'
+
+const getKey = (pageIndex: number, previousPageData: DataSetListResponse) => {
+  if (!pageIndex || previousPageData.has_more)
+    return { url: 'datasets', params: { page: pageIndex + 1, limit: 30 } }
+  return null
+}
+
+const DatasetNav = () => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const { datasetId } = useParams()
+  const { data: currentDataset } = useSWR(
+    datasetId
+      ? {
+        url: 'fetchDatasetDetail',
+        datasetId,
+      }
+      : null,
+    apiParams => fetchDatasetDetail(apiParams.datasetId as string))
+  const { data: datasetsData, setSize } = useSWRInfinite(datasetId ? getKey : () => null, fetchDatasets, { revalidateFirstPage: false, revalidateAll: true })
+  const datasetItems = flatten(datasetsData?.map(datasetData => datasetData.data))
+
+  const handleLoadmore = useCallback(() => {
+    setSize(size => size + 1)
+  }, [setSize])
+
+  return (
+    <Nav
+      icon={<RiBook2Line className='h-4 w-4' />}
+      activeIcon={<RiBook2Fill className='h-4 w-4' />}
+      text={t('common.menus.datasets')}
+      activeSegment='datasets'
+      link='/datasets'
+      curNav={currentDataset as Omit<NavItem, 'link'>}
+      navs={datasetItems.map(dataset => ({
+        id: dataset.id,
+        name: dataset.name,
+        link: dataset.provider === 'external' ? `/datasets/${dataset.id}/hitTesting` : `/datasets/${dataset.id}/documents`,
+        icon: dataset.icon,
+        icon_background: dataset.icon_background,
+      })) as NavItem[]}
+      createText={t('common.menus.newDataset')}
+      onCreate={() => router.push('/datasets/create')}
+      onLoadmore={handleLoadmore}
+    />
+  )
+}
+
+export default DatasetNav
diff --git a/app/components/header/env-nav/index.tsx b/app/components/header/env-nav/index.tsx
new file mode 100644
index 0000000..cec933a
--- /dev/null
+++ b/app/components/header/env-nav/index.tsx
@@ -0,0 +1,46 @@
+'use client'
+
+import { useTranslation } from 'react-i18next'
+import { useAppContext } from '@/context/app-context'
+import { Beaker02 } from '@/app/components/base/icons/src/vender/solid/education'
+import { TerminalSquare } from '@/app/components/base/icons/src/vender/solid/development'
+
+const headerEnvClassName: { [k: string]: string } = {
+  DEVELOPMENT: 'bg-[#FEC84B] border-[#FDB022] text-[#93370D]',
+  TESTING: 'bg-[#A5F0FC] border-[#67E3F9] text-[#164C63]',
+}
+
+const EnvNav = () => {
+  const { t } = useTranslation()
+  const { langeniusVersionInfo } = useAppContext()
+  const showEnvTag = langeniusVersionInfo.current_env === 'TESTING' || langeniusVersionInfo.current_env === 'DEVELOPMENT'
+
+  if (!showEnvTag)
+    return null
+
+  return (
+    <div className={`
+      mr-4 flex h-[22px] items-center rounded-md border px-2 text-xs font-medium
+      ${headerEnvClassName[langeniusVersionInfo.current_env]}
+    `}>
+      {
+        langeniusVersionInfo.current_env === 'TESTING' && (
+          <>
+            <Beaker02 className='mr-1 h-3 w-3' />
+            {t('common.environment.testing')}
+          </>
+        )
+      }
+      {
+        langeniusVersionInfo.current_env === 'DEVELOPMENT' && (
+          <>
+            <TerminalSquare className='mr-1 h-3 w-3' />
+            {t('common.environment.development')}
+          </>
+        )
+      }
+    </div>
+  )
+}
+
+export default EnvNav
diff --git a/app/components/header/explore-nav/index.tsx b/app/components/header/explore-nav/index.tsx
new file mode 100644
index 0000000..b6ebf5d
--- /dev/null
+++ b/app/components/header/explore-nav/index.tsx
@@ -0,0 +1,38 @@
+'use client'
+
+import { useTranslation } from 'react-i18next'
+import Link from 'next/link'
+import { useSelectedLayoutSegment } from 'next/navigation'
+import {
+  RiPlanetFill,
+  RiPlanetLine,
+} from '@remixicon/react'
+import classNames from '@/utils/classnames'
+type ExploreNavProps = {
+  className?: string
+}
+
+const ExploreNav = ({
+  className,
+}: ExploreNavProps) => {
+  const { t } = useTranslation()
+  const selectedSegment = useSelectedLayoutSegment()
+  const activated = selectedSegment === 'explore'
+
+  return (
+    <Link href="/explore/apps" className={classNames(
+      className, 'group',
+      activated && 'bg-components-main-nav-nav-button-bg-active shadow-md',
+      activated ? 'text-components-main-nav-nav-button-text-active' : 'text-components-main-nav-nav-button-text hover:bg-components-main-nav-nav-button-bg-hover',
+    )}>
+      {
+        activated
+          ? <RiPlanetFill className='mr-2 h-4 w-4' />
+          : <RiPlanetLine className='mr-2 h-4 w-4' />
+      }
+      {t('common.menus.explore')}
+    </Link>
+  )
+}
+
+export default ExploreNav
diff --git a/app/components/header/github-star/index.tsx b/app/components/header/github-star/index.tsx
new file mode 100644
index 0000000..b087b9e
--- /dev/null
+++ b/app/components/header/github-star/index.tsx
@@ -0,0 +1,27 @@
+'use client'
+import { useQuery } from '@tanstack/react-query'
+import type { FC } from 'react'
+import type { GithubRepo } from '@/models/common'
+
+const getStar = async () => {
+  const res = await fetch('https://api.github.com/repos/langgenius/dify')
+
+  if (!res.ok)
+    throw new Error('Failed to fetch github star')
+
+  return res.json()
+}
+
+const GithubStar: FC<{ className: string }> = (props) => {
+  const { isFetching, data } = useQuery<GithubRepo>({
+    queryKey: ['github-star'],
+    queryFn: getStar,
+    enabled: process.env.NODE_ENV !== 'development',
+    initialData: { stargazers_count: 81204 },
+  })
+  if (isFetching)
+    return null
+  return <span {...props}>{data.stargazers_count.toLocaleString()}</span>
+}
+
+export default GithubStar
diff --git a/app/components/header/header-wrapper.tsx b/app/components/header/header-wrapper.tsx
new file mode 100644
index 0000000..dd0ec77
--- /dev/null
+++ b/app/components/header/header-wrapper.tsx
@@ -0,0 +1,27 @@
+'use client'
+import { usePathname } from 'next/navigation'
+import s from './index.module.css'
+import classNames from '@/utils/classnames'
+
+type HeaderWrapperProps = {
+  children: React.ReactNode
+}
+
+const HeaderWrapper = ({
+  children,
+}: HeaderWrapperProps) => {
+  const pathname = usePathname()
+  const isBordered = ['/apps', '/datasets', '/datasets/create', '/tools'].includes(pathname)
+
+  return (
+    <div className={classNames(
+      'sticky top-0 left-0 right-0 z-30 flex flex-col grow-0 shrink-0 basis-auto min-h-[56px]',
+      s.header,
+      isBordered ? 'border-b border-divider-regular' : '',
+    )}
+    >
+      {children}
+    </div>
+  )
+}
+export default HeaderWrapper
diff --git a/app/components/header/index.module.css b/app/components/header/index.module.css
new file mode 100644
index 0000000..9e23bc1
--- /dev/null
+++ b/app/components/header/index.module.css
@@ -0,0 +1,15 @@
+.header-DEVELOPMENT {
+  background: linear-gradient(180deg, rgba(253, 176, 34, 0.08) 0%, rgba(253, 176, 34, 0) 100%);
+  border-top: 4px solid #FDB022;
+}
+
+.header-TESTING {
+  background: linear-gradient(180deg, rgba(6, 174, 212, 0.08) 0%, rgba(6, 174, 212, 0) 100%);
+  border-top: 4px solid #06AED4;
+}
+
+.alpha {
+  width: 12px;
+  height: 12px;
+  background: url(./assets/alpha.svg) center center no-repeat;
+}
diff --git a/app/components/header/index.tsx b/app/components/header/index.tsx
new file mode 100644
index 0000000..c2345fb
--- /dev/null
+++ b/app/components/header/index.tsx
@@ -0,0 +1,115 @@
+'use client'
+import { useCallback, useEffect } from 'react'
+import Link from 'next/link'
+import { useBoolean } from 'ahooks'
+import { useSelectedLayoutSegment } from 'next/navigation'
+import { Bars3Icon } from '@heroicons/react/20/solid'
+import AccountDropdown from './account-dropdown'
+import AppNav from './app-nav'
+import DatasetNav from './dataset-nav'
+import EnvNav from './env-nav'
+import PluginsNav from './plugins-nav'
+import ExploreNav from './explore-nav'
+import ToolsNav from './tools-nav'
+import { WorkspaceProvider } from '@/context/workspace-context'
+import { useAppContext } from '@/context/app-context'
+import DifyLogo from '@/app/components/base/logo/dify-logo'
+import WorkplaceSelector from '@/app/components/header/account-dropdown/workplace-selector'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import { useProviderContext } from '@/context/provider-context'
+import { useModalContext } from '@/context/modal-context'
+import PlanBadge from './plan-badge'
+import LicenseNav from './license-env'
+import { Plan } from '../billing/type'
+
+const navClassName = `
+  flex items-center relative mr-0 sm:mr-3 px-3 h-8 rounded-xl
+  font-medium text-sm
+  cursor-pointer
+`
+
+const Header = () => {
+  const { isCurrentWorkspaceEditor, isCurrentWorkspaceDatasetOperator } = useAppContext()
+  const selectedSegment = useSelectedLayoutSegment()
+  const media = useBreakpoints()
+  const isMobile = media === MediaType.mobile
+  const [isShowNavMenu, { toggle, setFalse: hideNavMenu }] = useBoolean(false)
+  const { enableBilling, plan } = useProviderContext()
+  const { setShowPricingModal, setShowAccountSettingModal } = useModalContext()
+  const isFreePlan = plan.type === Plan.sandbox
+  const handlePlanClick = useCallback(() => {
+    if (isFreePlan)
+      setShowPricingModal()
+    else
+      setShowAccountSettingModal({ payload: 'billing' })
+  }, [isFreePlan, setShowAccountSettingModal, setShowPricingModal])
+
+  useEffect(() => {
+    hideNavMenu()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [selectedSegment])
+  return (
+    <div className='relative flex flex-1 items-center justify-between bg-background-body'>
+      <div className='flex items-center'>
+        {isMobile && <div
+          className='flex h-8 w-8 cursor-pointer items-center justify-center'
+          onClick={toggle}
+        >
+          <Bars3Icon className="h-4 w-4 text-gray-500" />
+        </div>}
+        {
+          !isMobile
+          && <div className='flex shrink-0 items-center gap-1.5 self-stretch pl-3'>
+            <Link href="/apps" className='flex h-8 w-[52px] shrink-0 items-center justify-center gap-2'>
+              <DifyLogo />
+            </Link>
+            <div className='font-light text-divider-deep'>/</div>
+            <div className='flex items-center gap-0.5'>
+              <WorkspaceProvider>
+                <WorkplaceSelector />
+              </WorkspaceProvider>
+              {enableBilling ? <PlanBadge allowHover sandboxAsUpgrade plan={plan.type} onClick={handlePlanClick} /> : <LicenseNav />}
+            </div>
+          </div>
+        }
+      </div >
+      {isMobile && (
+        <div className='flex'>
+          <Link href="/apps" className='mr-4 flex items-center'>
+            <DifyLogo />
+          </Link>
+          <div className='font-light text-divider-deep'>/</div>
+          {enableBilling ? <PlanBadge allowHover sandboxAsUpgrade plan={plan.type} onClick={handlePlanClick} /> : <LicenseNav />}
+        </div >
+      )}
+      {
+        !isMobile && (
+          <div className='absolute left-1/2 top-1/2 flex -translate-x-1/2 -translate-y-1/2 items-center'>
+            {!isCurrentWorkspaceDatasetOperator && <ExploreNav className={navClassName} />}
+            {!isCurrentWorkspaceDatasetOperator && <AppNav />}
+            {(isCurrentWorkspaceEditor || isCurrentWorkspaceDatasetOperator) && <DatasetNav />}
+            {!isCurrentWorkspaceDatasetOperator && <ToolsNav className={navClassName} />}
+          </div>
+        )
+      }
+      <div className='flex shrink-0 items-center pr-3'>
+        <EnvNav />
+        <div className='mr-2'>
+          <PluginsNav />
+        </div>
+        <AccountDropdown />
+      </div>
+      {
+        (isMobile && isShowNavMenu) && (
+          <div className='flex w-full flex-col gap-y-1 p-2'>
+            {!isCurrentWorkspaceDatasetOperator && <ExploreNav className={navClassName} />}
+            {!isCurrentWorkspaceDatasetOperator && <AppNav />}
+            {(isCurrentWorkspaceEditor || isCurrentWorkspaceDatasetOperator) && <DatasetNav />}
+            {!isCurrentWorkspaceDatasetOperator && <ToolsNav className={navClassName} />}
+          </div>
+        )
+      }
+    </div >
+  )
+}
+export default Header
diff --git a/app/components/header/indicator/index.tsx b/app/components/header/indicator/index.tsx
new file mode 100644
index 0000000..12629e9
--- /dev/null
+++ b/app/components/header/indicator/index.tsx
@@ -0,0 +1,59 @@
+'use client'
+
+import classNames from '@/utils/classnames'
+
+export type IndicatorProps = {
+  color?: 'green' | 'orange' | 'red' | 'blue' | 'yellow' | 'gray'
+  className?: string
+}
+
+export type ColorMap = {
+  green: string
+  orange: string
+  red: string
+  blue: string
+  yellow: string
+  gray: string
+}
+
+const BACKGROUND_MAP: ColorMap = {
+  green: 'bg-components-badge-status-light-success-bg',
+  orange: 'bg-components-badge-status-light-warning-bg',
+  red: 'bg-components-badge-status-light-error-bg',
+  blue: 'bg-components-badge-status-light-normal-bg',
+  yellow: 'bg-components-badge-status-light-warning-bg',
+  gray: 'bg-components-badge-status-light-disabled-bg',
+}
+const BORDER_MAP: ColorMap = {
+  green: 'border-components-badge-status-light-success-border-inner',
+  orange: 'border-components-badge-status-light-warning-border-inner',
+  red: 'border-components-badge-status-light-error-border-inner',
+  blue: 'border-components-badge-status-light-normal-border-inner',
+  yellow: 'border-components-badge-status-light-warning-border-inner',
+  gray: 'border-components-badge-status-light-disabled-border-inner',
+}
+const SHADOW_MAP: ColorMap = {
+  green: 'shadow-status-indicator-green-shadow',
+  orange: 'shadow-status-indicator-warning-shadow',
+  red: 'shadow-status-indicator-red-shadow',
+  blue: 'shadow-status-indicator-blue-shadow',
+  yellow: 'shadow-status-indicator-warning-shadow',
+  gray: 'shadow-status-indicator-gray-shadow',
+}
+
+export default function Indicator({
+  color = 'green',
+  className = '',
+}: IndicatorProps) {
+  return (
+    <div className={classNames(
+      'w-2 h-2 border border-solid rounded-[3px]',
+      BACKGROUND_MAP[color],
+      BORDER_MAP[color],
+      SHADOW_MAP[color],
+      className,
+    )}>
+
+    </div>
+  )
+}
diff --git a/app/components/header/license-env/index.tsx b/app/components/header/license-env/index.tsx
new file mode 100644
index 0000000..86c53d7
--- /dev/null
+++ b/app/components/header/license-env/index.tsx
@@ -0,0 +1,32 @@
+'use client'
+
+import AppContext from '@/context/app-context'
+import { LicenseStatus } from '@/types/feature'
+import { useTranslation } from 'react-i18next'
+import { useContextSelector } from 'use-context-selector'
+import dayjs from 'dayjs'
+import PremiumBadge from '../../base/premium-badge'
+import { RiHourglass2Fill } from '@remixicon/react'
+
+const LicenseNav = () => {
+  const { t } = useTranslation()
+  const systemFeatures = useContextSelector(AppContext, s => s.systemFeatures)
+
+  if (systemFeatures.license?.status === LicenseStatus.EXPIRING) {
+    const expiredAt = systemFeatures.license?.expired_at
+    const count = dayjs(expiredAt).diff(dayjs(), 'days')
+    return <PremiumBadge color='orange' className='select-none'>
+      <RiHourglass2Fill className='flex size-3 items-center pl-0.5 text-components-premium-badge-indigo-text-stop-0' />
+      {count <= 1 && <span className='system-xs-medium px-0.5'>{t('common.license.expiring', { count })}</span>}
+      {count > 1 && <span className='system-xs-medium px-0.5'>{t('common.license.expiring_plural', { count })}</span>}
+    </PremiumBadge>
+  }
+  if (systemFeatures.license.status === LicenseStatus.ACTIVE) {
+    return <PremiumBadge color="indigo" className='select-none'>
+      <span className='system-xs-medium px-1'>Enterprise</span>
+    </PremiumBadge>
+  }
+  return null
+}
+
+export default LicenseNav
diff --git a/app/components/header/maintenance-notice.tsx b/app/components/header/maintenance-notice.tsx
new file mode 100644
index 0000000..78715bb
--- /dev/null
+++ b/app/components/header/maintenance-notice.tsx
@@ -0,0 +1,39 @@
+import { useState } from 'react'
+import { useContext } from 'use-context-selector'
+import I18n from '@/context/i18n'
+import { X } from '@/app/components/base/icons/src/vender/line/general'
+import { NOTICE_I18N } from '@/i18n/language'
+
+const MaintenanceNotice = () => {
+  const { locale } = useContext(I18n)
+
+  const [showNotice, setShowNotice] = useState(localStorage.getItem('hide-maintenance-notice') !== '1')
+  const handleJumpNotice = () => {
+    window.open(NOTICE_I18N.href, '_blank')
+  }
+
+  const handleCloseNotice = () => {
+    localStorage.setItem('hide-maintenance-notice', '1')
+    setShowNotice(false)
+  }
+
+  const titleByLocale: { [key: string]: string } = NOTICE_I18N.title
+  const descByLocale: { [key: string]: string } = NOTICE_I18N.desc
+
+  if (!showNotice)
+    return null
+
+  return (
+    <div className='z-20 flex h-[38px] shrink-0 items-center border-[0.5px] border-b border-b-[#FEF0C7] bg-[#FFFAEB] px-4'>
+      <div className='mr-2 flex h-[22px] shrink-0 items-center rounded-xl bg-[#F79009] px-2 text-[11px] font-medium text-white'>{titleByLocale[locale]}</div>
+      {
+        (NOTICE_I18N.href && NOTICE_I18N.href !== '#')
+          ? <div className='grow cursor-pointer text-xs font-medium text-gray-700' onClick={handleJumpNotice}>{descByLocale[locale]}</div>
+          : <div className='grow text-xs font-medium text-gray-700'>{descByLocale[locale]}</div>
+      }
+      <X className='h-4 w-4 shrink-0 cursor-pointer text-gray-500' onClick={handleCloseNotice} />
+    </div>
+  )
+}
+
+export default MaintenanceNotice
diff --git a/app/components/header/nav/index.module.css b/app/components/header/nav/index.module.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/components/header/nav/index.module.css
diff --git a/app/components/header/nav/index.tsx b/app/components/header/nav/index.tsx
new file mode 100644
index 0000000..293c66a
--- /dev/null
+++ b/app/components/header/nav/index.tsx
@@ -0,0 +1,95 @@
+'use client'
+
+import React, { useEffect, useState } from 'react'
+import Link from 'next/link'
+import { usePathname, useSearchParams, useSelectedLayoutSegment } from 'next/navigation'
+import type { INavSelectorProps } from './nav-selector'
+import NavSelector from './nav-selector'
+import classNames from '@/utils/classnames'
+import { ArrowNarrowLeft } from '@/app/components/base/icons/src/vender/line/arrows'
+import { useStore as useAppStore } from '@/app/components/app/store'
+
+type INavProps = {
+  icon: React.ReactNode
+  activeIcon?: React.ReactNode
+  text: string
+  activeSegment: string | string[]
+  link: string
+  isApp: boolean
+} & INavSelectorProps
+
+const Nav = ({
+  icon,
+  activeIcon,
+  text,
+  activeSegment,
+  link,
+  curNav,
+  navs,
+  createText,
+  onCreate,
+  onLoadmore,
+  isApp,
+}: INavProps) => {
+  const setAppDetail = useAppStore(state => state.setAppDetail)
+  const [hovered, setHovered] = useState(false)
+  const segment = useSelectedLayoutSegment()
+  const isActivated = Array.isArray(activeSegment) ? activeSegment.includes(segment!) : segment === activeSegment
+  const pathname = usePathname()
+  const searchParams = useSearchParams()
+  const [linkLastSearchParams, setLinkLastSearchParams] = useState('')
+
+  useEffect(() => {
+    if (pathname === link)
+      setLinkLastSearchParams(searchParams.toString())
+  }, [pathname, searchParams])
+
+  return (
+    <div className={`
+      mr-0 flex h-8 shrink-0 items-center rounded-xl px-0.5 text-sm font-medium sm:mr-3
+      ${isActivated && 'bg-components-main-nav-nav-button-bg-active font-semibold shadow-md'}
+      ${!curNav && !isActivated && 'hover:bg-components-main-nav-nav-button-bg-hover'}
+    `}>
+      <Link href={link + (linkLastSearchParams && `?${linkLastSearchParams}`)}>
+        <div
+          onClick={() => setAppDetail()}
+          className={classNames(`
+            flex items-center h-7 px-2.5 cursor-pointer rounded-[10px]
+            ${isActivated ? 'text-components-main-nav-nav-button-text-active' : 'text-components-main-nav-nav-button-text'}
+            ${curNav && isActivated && 'hover:bg-components-main-nav-nav-button-bg-active-hover'}
+          `)}
+          onMouseEnter={() => setHovered(true)}
+          onMouseLeave={() => setHovered(false)}
+        >
+          <div className='mr-2'>
+            {
+              (hovered && curNav)
+                ? <ArrowNarrowLeft className='h-4 w-4' />
+                : isActivated
+                  ? activeIcon
+                  : icon
+            }
+          </div>
+          {text}
+        </div>
+      </Link>
+      {
+        curNav && isActivated && (
+          <>
+            <div className='font-light text-divider-deep'>/</div>
+            <NavSelector
+              isApp={isApp}
+              curNav={curNav}
+              navs={navs}
+              createText={createText}
+              onCreate={onCreate}
+              onLoadmore={onLoadmore}
+            />
+          </>
+        )
+      }
+    </div>
+  )
+}
+
+export default Nav
diff --git a/app/components/header/nav/nav-selector/index.tsx b/app/components/header/nav/nav-selector/index.tsx
new file mode 100644
index 0000000..65c7cb1
--- /dev/null
+++ b/app/components/header/nav/nav-selector/index.tsx
@@ -0,0 +1,189 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { Fragment, useCallback } from 'react'
+import {
+  RiAddLine,
+  RiArrowDownSLine,
+  RiArrowRightSLine,
+} from '@remixicon/react'
+import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react'
+import { useRouter } from 'next/navigation'
+import { debounce } from 'lodash-es'
+import cn from '@/utils/classnames'
+import AppIcon from '@/app/components/base/app-icon'
+import { AiText, ChatBot, CuteRobot } from '@/app/components/base/icons/src/vender/solid/communication'
+import { Route } from '@/app/components/base/icons/src/vender/solid/mapsAndTravel'
+import { useAppContext } from '@/context/app-context'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { FileArrow01, FilePlus01, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files'
+import type { AppIconType } from '@/types/app'
+
+export type NavItem = {
+  id: string
+  name: string
+  link: string
+  icon_type: AppIconType | null
+  icon: string
+  icon_background: string
+  icon_url: string | null
+  mode?: string
+}
+export type INavSelectorProps = {
+  navs: NavItem[]
+  curNav?: Omit<NavItem, 'link'>
+  createText: string
+  isApp?: boolean
+  onCreate: (state: string) => void
+  onLoadmore?: () => void
+}
+
+const NavSelector = ({ curNav, navs, createText, isApp, onCreate, onLoadmore }: INavSelectorProps) => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const { isCurrentWorkspaceEditor } = useAppContext()
+  const setAppDetail = useAppStore(state => state.setAppDetail)
+
+  const handleScroll = useCallback(debounce((e) => {
+    if (typeof onLoadmore === 'function') {
+      const { clientHeight, scrollHeight, scrollTop } = e.target
+
+      if (clientHeight + scrollTop > scrollHeight - 50)
+        onLoadmore()
+    }
+  }, 50), [])
+
+  return (
+    <div className="">
+      <Menu as="div" className="relative inline-block text-left">
+        {({ open }) => (
+          <>
+            <MenuButton className={cn(
+              'hover:hover:bg-components-main-nav-nav-button-bg-active-hover group inline-flex h-7 w-full items-center justify-center rounded-[10px] pl-2 pr-2.5 text-[14px] font-semibold text-components-main-nav-nav-button-text-active',
+              open && 'bg-components-main-nav-nav-button-bg-active',
+            )}>
+              <div className='max-w-[180px] truncate' title={curNav?.name}>{curNav?.name}</div>
+              <RiArrowDownSLine
+                className={cn('ml-1 h-3 w-3 shrink-0 opacity-50 group-hover:opacity-100', open && '!opacity-100')}
+                aria-hidden="true"
+              />
+            </MenuButton>
+            <MenuItems
+              className="
+                absolute -left-11 right-0 mt-1.5 w-60 max-w-80
+                origin-top-right divide-y divide-gray-100 rounded-lg bg-white
+                shadow-lg
+              "
+            >
+              <div className="overflow-auto px-1 py-1" style={{ maxHeight: '50vh' }} onScroll={handleScroll}>
+                {
+                  navs.map(nav => (
+                    <MenuItem key={nav.id}>
+                      <div className='flex w-full cursor-pointer items-center truncate rounded-lg px-3 py-[6px] text-[14px] font-normal text-gray-700 hover:bg-gray-100' onClick={() => {
+                        if (curNav?.id === nav.id)
+                          return
+                        setAppDetail()
+                        router.push(nav.link)
+                      }} title={nav.name}>
+                        <div className='relative mr-2 h-6 w-6 rounded-md'>
+                          <AppIcon size='tiny' iconType={nav.icon_type} icon={nav.icon} background={nav.icon_background} imageUrl={nav.icon_url} />
+                          {!!nav.mode && (
+                            <span className={cn(
+                              'absolute -bottom-0.5 -right-0.5 h-3.5 w-3.5 rounded border-[0.5px] border-[rgba(0,0,0,0.02)] bg-white p-0.5 shadow-sm',
+                            )}>
+                              {nav.mode === 'advanced-chat' && (
+                                <ChatBot className='h-2.5 w-2.5 text-[#1570EF]' />
+                              )}
+                              {nav.mode === 'agent-chat' && (
+                                <CuteRobot className='h-2.5 w-2.5 text-indigo-600' />
+                              )}
+                              {nav.mode === 'chat' && (
+                                <ChatBot className='h-2.5 w-2.5 text-[#1570EF]' />
+                              )}
+                              {nav.mode === 'completion' && (
+                                <AiText className='h-2.5 w-2.5 text-[#0E9384]' />
+                              )}
+                              {nav.mode === 'workflow' && (
+                                <Route className='h-2.5 w-2.5 text-[#f79009]' />
+                              )}
+                            </span>
+                          )}
+                        </div>
+                        <div className='truncate'>
+                          {nav.name}
+                        </div>
+                      </div>
+                    </MenuItem>
+                  ))
+                }
+              </div>
+              {!isApp && isCurrentWorkspaceEditor && (
+                <MenuItem as="div" className='w-full p-1'>
+                  <div onClick={() => onCreate('')} className={cn(
+                    'flex cursor-pointer items-center gap-2 rounded-lg px-3 py-[6px] hover:bg-gray-100',
+                  )}>
+                    <div className='flex h-6 w-6 shrink-0 items-center justify-center rounded-[6px] border border-[0.5px] border-gray-200 bg-gray-50'>
+                      <RiAddLine className='h-4 w-4 text-gray-500' />
+                    </div>
+                    <div className='grow text-left text-[14px] font-normal text-gray-700'>{createText}</div>
+                  </div>
+                </MenuItem>
+              )}
+              {isApp && isCurrentWorkspaceEditor && (
+                <Menu as="div" className="relative h-full w-full">
+                  {({ open }) => (
+                    <>
+                      <MenuButton className='w-full p-1'>
+                        <div className={cn(
+                          'flex cursor-pointer items-center gap-2 rounded-lg px-3 py-[6px] hover:bg-gray-100',
+                          open && '!bg-gray-100',
+                        )}>
+                          <div className='flex h-6 w-6 shrink-0 items-center justify-center rounded-[6px] border border-[0.5px] border-gray-200 bg-gray-50'>
+                            <RiAddLine className='h-4 w-4 text-gray-500' />
+                          </div>
+                          <div className='grow text-left text-[14px] font-normal text-gray-700'>{createText}</div>
+                          <RiArrowRightSLine className='h-3.5 w-3.5 shrink-0  text-gray-500' />
+                        </div>
+                      </MenuButton>
+                      <Transition
+                        as={Fragment}
+                        enter="transition ease-out duration-100"
+                        enterFrom="transform opacity-0 scale-95"
+                        enterTo="transform opacity-100 scale-100"
+                        leave="transition ease-in duration-75"
+                        leaveFrom="transform opacity-100 scale-100"
+                        leaveTo="transform opacity-0 scale-95"
+                      >
+                        <MenuItems className={cn(
+                          'absolute right-[-198px] top-[3px] z-10 min-w-[200px] rounded-lg border-[0.5px] border-gray-200 bg-white shadow-lg',
+                        )}>
+                          <div className='p-1'>
+                            <div className={cn('flex cursor-pointer items-center rounded-lg px-3 py-[6px] font-normal text-gray-700 hover:bg-gray-100')} onClick={() => onCreate('blank')}>
+                              <FilePlus01 className='mr-2 h-4 w-4 shrink-0 text-gray-600' />
+                              {t('app.newApp.startFromBlank')}
+                            </div>
+                            <div className={cn('flex cursor-pointer items-center rounded-lg px-3 py-[6px] font-normal text-gray-700 hover:bg-gray-100')} onClick={() => onCreate('template')}>
+                              <FilePlus02 className='mr-2 h-4 w-4 shrink-0 text-gray-600' />
+                              {t('app.newApp.startFromTemplate')}
+                            </div>
+                          </div>
+                          <div className='border-t border-gray-100 p-1'>
+                            <div className={cn('flex cursor-pointer items-center rounded-lg px-3 py-[6px] font-normal text-gray-700 hover:bg-gray-100')} onClick={() => onCreate('dsl')}>
+                              <FileArrow01 className='mr-2 h-4 w-4 shrink-0 text-gray-600' />
+                              {t('app.importDSL')}
+                            </div>
+                          </div>
+                        </MenuItems>
+                      </Transition>
+                    </>
+                  )}
+                </Menu>
+              )}
+            </MenuItems>
+          </>
+        )}
+      </Menu>
+    </div>
+  )
+}
+
+export default NavSelector
diff --git a/app/components/header/plan-badge/index.tsx b/app/components/header/plan-badge/index.tsx
new file mode 100644
index 0000000..292025c
--- /dev/null
+++ b/app/components/header/plan-badge/index.tsx
@@ -0,0 +1,64 @@
+import { useProviderContext } from '@/context/provider-context'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiGraduationCapFill,
+} from '@remixicon/react'
+import { SparklesSoft } from '../../base/icons/src/public/common'
+import PremiumBadge from '../../base/premium-badge'
+import { Plan } from '../../billing/type'
+
+type PlanBadgeProps = {
+  plan: Plan
+  allowHover?: boolean
+  sandboxAsUpgrade?: boolean
+  onClick?: () => void
+}
+
+const PlanBadge: FC<PlanBadgeProps> = ({ plan, allowHover, sandboxAsUpgrade = false, onClick }) => {
+  const { isFetchedPlan, isEducationWorkspace } = useProviderContext()
+  const { t } = useTranslation()
+
+  if (!isFetchedPlan) return null
+  if (plan === Plan.sandbox && sandboxAsUpgrade) {
+    return <PremiumBadge className='select-none' color='blue' allowHover={allowHover} onClick={onClick}>
+      <SparklesSoft className='flex h-3.5 w-3.5 items-center py-[1px] pl-[3px] text-components-premium-badge-indigo-text-stop-0' />
+      <div className='system-xs-medium'>
+        <span className='whitespace-nowrap p-1'>
+          {t('billing.upgradeBtn.encourageShort')}
+        </span>
+      </div>
+    </PremiumBadge>
+  }
+  if (plan === Plan.sandbox) {
+    return <PremiumBadge className='select-none' size='s' color='gray' allowHover={allowHover} onClick={onClick}>
+      <div className='system-2xs-medium-uppercase'>
+        <span className='p-1'>
+          {plan}
+        </span>
+      </div>
+    </PremiumBadge>
+  }
+  if (plan === Plan.professional) {
+    return <PremiumBadge className='select-none' size='s' color='blue' allowHover={allowHover} onClick={onClick}>
+      <div className='system-2xs-medium-uppercase'>
+        <span className='inline-flex items-center gap-1 p-1'>
+          {isEducationWorkspace && <RiGraduationCapFill className='h-3 w-3' />}
+          pro
+        </span>
+      </div>
+    </PremiumBadge>
+  }
+  if (plan === Plan.team) {
+    return <PremiumBadge className='select-none' size='s' color='indigo' allowHover={allowHover} onClick={onClick}>
+      <div className='system-2xs-medium-uppercase'>
+        <span className='p-1'>
+          {plan}
+        </span>
+      </div>
+    </PremiumBadge>
+  }
+  return null
+}
+
+export default PlanBadge
diff --git a/app/components/header/plugins-nav/downloading-icon.module.css b/app/components/header/plugins-nav/downloading-icon.module.css
new file mode 100644
index 0000000..bbd6a35
--- /dev/null
+++ b/app/components/header/plugins-nav/downloading-icon.module.css
@@ -0,0 +1,44 @@
+@keyframes realistic-blink {
+  0% { fill: #37ff37; opacity: 0.4; }
+  15% { fill: #37ff37; opacity: 0.9; }
+  25% { fill: #37ff37; opacity: 0.3; }
+  38% { fill: #ff4444; opacity: 0.8; }
+  42% { fill: #ff4444; opacity: 0.3; }
+  58% { fill: #37ff37; opacity: 0.9; }
+  65% { fill: #37ff37; opacity: 0.4; }
+  79% { fill: #ff4444; opacity: 0.8; }
+  84% { fill: #ff4444; opacity: 0.3; }
+  92% { fill: #37ff37; opacity: 0.8; }
+  100% { fill: #37ff37; opacity: 0.4; }
+}
+
+@keyframes drop {
+  0% {
+    transform: translateY(-4px);
+    opacity: 0;
+  }
+  5% {
+    transform: translateY(-4px);
+    opacity: 1;
+  }
+  65% {
+    transform: translateY(2px);
+    opacity: 1;
+  }
+  80% {
+    transform: translateY(2px);
+    opacity: 0;
+  }
+  100% {
+    transform: translateY(2px);
+    opacity: 0;
+  }
+}
+
+#downloadingIconLight {
+  animation: realistic-blink 3s infinite ease-in-out;
+}
+
+#downloadingIconArrow {
+  animation: drop 1.2s cubic-bezier(0.4, 0, 1, 1) infinite;
+}
diff --git a/app/components/header/plugins-nav/downloading-icon.tsx b/app/components/header/plugins-nav/downloading-icon.tsx
new file mode 100644
index 0000000..d3fc486
--- /dev/null
+++ b/app/components/header/plugins-nav/downloading-icon.tsx
@@ -0,0 +1,17 @@
+import s from './downloading-icon.module.css'
+
+const DownloadingIcon = () => {
+  return (
+    <div className="inline-flex text-components-button-secondary-text">
+      <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" className="install-icon">
+        <g id="install-line">
+          <path d="M8 2V4H5L4.999 14H18.999L19 4H16V2H20C20.5523 2 21 2.44772 21 3V21C21 21.5523 20.5523 22 20 22H4C3.44772 22 3 21.5523 3 21V3C3 2.44772 3.44772 2 4 2H8ZM18.999 16H4.999L5 20H19L18.999 16Z" fill="currentColor"/>
+          <path id={s.downloadingIconLight} d="M17 19V17H15V19H17Z"/>
+          <path id={s.downloadingIconArrow} d="M13 2V7H16L12 11L8 7H11V2H13Z" fill="currentColor"/>
+        </g>
+      </svg>
+    </div>
+  )
+}
+
+export default DownloadingIcon
diff --git a/app/components/header/plugins-nav/index.tsx b/app/components/header/plugins-nav/index.tsx
new file mode 100644
index 0000000..b22e717
--- /dev/null
+++ b/app/components/header/plugins-nav/index.tsx
@@ -0,0 +1,66 @@
+'use client'
+
+import { useTranslation } from 'react-i18next'
+import Link from 'next/link'
+import classNames from '@/utils/classnames'
+import { Group } from '@/app/components/base/icons/src/vender/other'
+import { useSelectedLayoutSegment } from 'next/navigation'
+import DownloadingIcon from './downloading-icon'
+import { usePluginTaskStatus } from '@/app/components/plugins/plugin-page/plugin-tasks/hooks'
+import Indicator from '@/app/components/header/indicator'
+
+type PluginsNavProps = {
+  className?: string
+}
+
+const PluginsNav = ({
+  className,
+}: PluginsNavProps) => {
+  const { t } = useTranslation()
+  const selectedSegment = useSelectedLayoutSegment()
+  const activated = selectedSegment === 'plugins'
+  const {
+    isInstalling,
+    isInstallingWithError,
+    isFailed,
+  } = usePluginTaskStatus()
+
+  return (
+    <Link href="/plugins" className={classNames(
+      className, 'group', 'plugins-nav-button', // used for use-fold-anim-into.ts
+    )}>
+      <div
+        className={classNames(
+          'relative flex flex-row h-8 p-1.5 gap-0.5 border border-transparent items-center justify-center rounded-xl system-sm-medium-uppercase',
+          activated && 'border-components-main-nav-nav-button-border bg-components-main-nav-nav-button-bg-active shadow-md text-components-main-nav-nav-button-text',
+          !activated && 'text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
+          (isInstallingWithError || isFailed) && !activated && 'border-components-panel-border-subtle',
+        )}
+      >
+        {
+          (isFailed || isInstallingWithError) && !activated && (
+            <Indicator
+              color='red'
+              className='absolute left-[-1px] top-[-1px]'
+            />
+          )
+        }
+        <div className='mr-0.5 flex h-5 w-5 items-center justify-center'>
+          {
+            (!(isInstalling || isInstallingWithError) || activated) && (
+              <Group className='h-4 w-4' />
+            )
+          }
+          {
+            (isInstalling || isInstallingWithError) && !activated && (
+              <DownloadingIcon />
+            )
+          }
+        </div>
+        <span className='px-0.5'>{t('common.menus.plugins')}</span>
+      </div>
+    </Link>
+  )
+}
+
+export default PluginsNav
diff --git a/app/components/header/tools-nav/index.tsx b/app/components/header/tools-nav/index.tsx
new file mode 100644
index 0000000..b873987
--- /dev/null
+++ b/app/components/header/tools-nav/index.tsx
@@ -0,0 +1,39 @@
+'use client'
+
+import { useTranslation } from 'react-i18next'
+import Link from 'next/link'
+import { useSelectedLayoutSegment } from 'next/navigation'
+import {
+  RiHammerFill,
+  RiHammerLine,
+} from '@remixicon/react'
+import classNames from '@/utils/classnames'
+type ToolsNavProps = {
+  className?: string
+}
+
+const ToolsNav = ({
+  className,
+}: ToolsNavProps) => {
+  const { t } = useTranslation()
+  const selectedSegment = useSelectedLayoutSegment()
+  const activated = selectedSegment === 'tools'
+
+  return (
+    <Link href="/tools" className={classNames(
+      'group text-sm font-medium',
+      activated && 'font-semibold bg-components-main-nav-nav-button-bg-active hover:bg-components-main-nav-nav-button-bg-active-hover shadow-md',
+      activated ? 'text-components-main-nav-nav-button-text-active' : 'text-components-main-nav-nav-button-text hover:bg-components-main-nav-nav-button-bg-hover',
+      className,
+    )}>
+      {
+        activated
+          ? <RiHammerFill className='mr-2 h-4 w-4' />
+          : <RiHammerLine className='mr-2 h-4 w-4' />
+      }
+      {t('common.menus.tools')}
+    </Link>
+  )
+}
+
+export default ToolsNav
diff --git a/app/components/header/utils/util.ts b/app/components/header/utils/util.ts
new file mode 100644
index 0000000..38a3bcd
--- /dev/null
+++ b/app/components/header/utils/util.ts
@@ -0,0 +1,25 @@
+export const generateMailToLink = (email: string, subject?: string, body?: string): string => {
+  let mailtoLink = `mailto:${email}`
+
+  if (subject)
+    mailtoLink += `?subject=${encodeURIComponent(subject)}`
+
+  if (body)
+    mailtoLink += `&body=${encodeURIComponent(body)}`
+
+  return mailtoLink
+}
+
+export const mailToSupport = (account: string, plan: string, version: string) => {
+  const subject = `Technical Support Request ${plan} ${account}`
+  const body = `
+    Please do not remove the following information:
+    -----------------------------------------------
+    Current Plan: ${plan}
+    Account: ${account}
+    Version: ${version}
+    Platform:
+    Problem Description:
+  `
+  return generateMailToLink('support@dify.ai', subject, body)
+}
diff --git a/app/components/i18n-server.tsx b/app/components/i18n-server.tsx
new file mode 100644
index 0000000..78d5ca4
--- /dev/null
+++ b/app/components/i18n-server.tsx
@@ -0,0 +1,22 @@
+import React from 'react'
+import I18N from './i18n'
+import { ToastProvider } from './base/toast'
+import { getLocaleOnServer } from '@/i18n/server'
+
+export type II18NServerProps = {
+  children: React.ReactNode
+}
+
+const I18NServer = async ({
+  children,
+}: II18NServerProps) => {
+  const locale = await getLocaleOnServer()
+
+  return (
+    <I18N {...{ locale }}>
+      <ToastProvider>{children}</ToastProvider>
+    </I18N>
+  )
+}
+
+export default I18NServer
diff --git a/app/components/i18n.tsx b/app/components/i18n.tsx
new file mode 100644
index 0000000..f04f8d6
--- /dev/null
+++ b/app/components/i18n.tsx
@@ -0,0 +1,31 @@
+'use client'
+
+import type { FC } from 'react'
+import React, { useEffect } from 'react'
+import I18NContext from '@/context/i18n'
+import type { Locale } from '@/i18n'
+import { setLocaleOnClient } from '@/i18n'
+
+export type II18nProps = {
+  locale: Locale
+  children: React.ReactNode
+}
+const I18n: FC<II18nProps> = ({
+  locale,
+  children,
+}) => {
+  useEffect(() => {
+    setLocaleOnClient(locale, false)
+  }, [locale])
+
+  return (
+    <I18NContext.Provider value={{
+      locale,
+      i18n: {},
+      setLocaleOnClient,
+    }}>
+      {children}
+    </I18NContext.Provider>
+  )
+}
+export default React.memo(I18n)
diff --git a/app/components/plugins/base/badges/icon-with-tooltip.tsx b/app/components/plugins/base/badges/icon-with-tooltip.tsx
new file mode 100644
index 0000000..60b164e
--- /dev/null
+++ b/app/components/plugins/base/badges/icon-with-tooltip.tsx
@@ -0,0 +1,37 @@
+import React, { type FC } from 'react'
+import cn from '@/utils/classnames'
+import Tooltip from '@/app/components/base/tooltip'
+import { Theme } from '@/types/app'
+
+type IconWithTooltipProps = {
+  className?: string
+  popupContent?: string
+  theme: Theme
+  BadgeIconLight: React.ElementType
+  BadgeIconDark: React.ElementType
+}
+
+const IconWithTooltip: FC<IconWithTooltipProps> = ({
+  className,
+  theme,
+  popupContent,
+  BadgeIconLight,
+  BadgeIconDark,
+}) => {
+  const isDark = theme === Theme.dark
+  const iconClassName = cn('h-5 w-5', className)
+  const Icon = isDark ? BadgeIconDark : BadgeIconLight
+
+  return (
+    <Tooltip
+      popupClassName='p-1.5 border-[0.5px] border-[0.5px] border-components-panel-border bg-components-tooltip-bg text-text-secondary system-xs-medium'
+      popupContent={popupContent}
+    >
+      <div className='flex shrink-0 items-center justify-center'>
+        <Icon className={iconClassName} />
+      </div>
+    </Tooltip>
+  )
+}
+
+export default React.memo(IconWithTooltip)
diff --git a/app/components/plugins/base/badges/partner.tsx b/app/components/plugins/base/badges/partner.tsx
new file mode 100644
index 0000000..8e649c5
--- /dev/null
+++ b/app/components/plugins/base/badges/partner.tsx
@@ -0,0 +1,29 @@
+import type { FC } from 'react'
+import IconWithTooltip from './icon-with-tooltip'
+import PartnerDark from '@/app/components/base/icons/src/public/plugins/PartnerDark'
+import PartnerLight from '@/app/components/base/icons/src/public/plugins/PartnerLight'
+import useTheme from '@/hooks/use-theme'
+
+type PartnerProps = {
+  className?: string
+  text: string
+}
+
+const Partner: FC<PartnerProps> = ({
+  className,
+  text,
+}) => {
+  const { theme } = useTheme()
+
+  return (
+    <IconWithTooltip
+      className={className}
+      theme={theme}
+      BadgeIconLight={PartnerLight}
+      BadgeIconDark={PartnerDark}
+      popupContent={text}
+    />
+  )
+}
+
+export default Partner
diff --git a/app/components/plugins/base/badges/verified.tsx b/app/components/plugins/base/badges/verified.tsx
new file mode 100644
index 0000000..bea45c0
--- /dev/null
+++ b/app/components/plugins/base/badges/verified.tsx
@@ -0,0 +1,29 @@
+import type { FC } from 'react'
+import IconWithTooltip from './icon-with-tooltip'
+import VerifiedDark from '@/app/components/base/icons/src/public/plugins/VerifiedDark'
+import VerifiedLight from '@/app/components/base/icons/src/public/plugins/VerifiedLight'
+import useTheme from '@/hooks/use-theme'
+
+type VerifiedProps = {
+  className?: string
+  text: string
+}
+
+const Verified: FC<VerifiedProps> = ({
+  className,
+  text,
+}) => {
+  const { theme } = useTheme()
+
+  return (
+    <IconWithTooltip
+      className={className}
+      theme={theme}
+      BadgeIconLight={VerifiedLight}
+      BadgeIconDark={VerifiedDark}
+      popupContent={text}
+    />
+  )
+}
+
+export default Verified
diff --git a/app/components/plugins/base/key-value-item.tsx b/app/components/plugins/base/key-value-item.tsx
new file mode 100644
index 0000000..cfc81aa
--- /dev/null
+++ b/app/components/plugins/base/key-value-item.tsx
@@ -0,0 +1,66 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
+import copy from 'copy-to-clipboard'
+import {
+  RiClipboardLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { ClipboardCheck } from '../../base/icons/src/vender/line/files'
+import Tooltip from '../../base/tooltip'
+import cn from '@/utils/classnames'
+import ActionButton from '@/app/components/base/action-button'
+
+type Props = {
+  label: string
+  labelWidthClassName?: string
+  value: string
+  maskedValue?: string
+  valueMaxWidthClassName?: string
+}
+
+const KeyValueItem: FC<Props> = ({
+  label,
+  labelWidthClassName = 'w-10',
+  value,
+  maskedValue,
+  valueMaxWidthClassName = 'max-w-[162px]',
+}) => {
+  const { t } = useTranslation()
+  const [isCopied, setIsCopied] = useState(false)
+  const handleCopy = useCallback(() => {
+    copy(value)
+    setIsCopied(true)
+  }, [value])
+
+  useEffect(() => {
+    if (isCopied) {
+      const timer = setTimeout(() => {
+        setIsCopied(false)
+      }, 2000)
+      return () => {
+        clearTimeout(timer)
+      }
+    }
+  }, [isCopied])
+
+  const CopyIcon = isCopied ? ClipboardCheck : RiClipboardLine
+
+  return (
+    <div className='flex items-center gap-1'>
+      <span className={cn('system-xs-medium flex flex-col items-start justify-center text-text-tertiary', labelWidthClassName)}>{label}</span>
+      <div className='flex items-center justify-center gap-0.5'>
+        <span className={cn(valueMaxWidthClassName, ' system-xs-medium truncate text-text-secondary')}>
+          {maskedValue || value}
+        </span>
+        <Tooltip popupContent={t(`common.operation.${isCopied ? 'copied' : 'copy'}`)} position='top'>
+          <ActionButton onClick={handleCopy}>
+            <CopyIcon className='h-3.5 w-3.5 shrink-0 text-text-tertiary' />
+          </ActionButton>
+        </Tooltip>
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(KeyValueItem)
diff --git a/app/components/plugins/card/base/card-icon.tsx b/app/components/plugins/card/base/card-icon.tsx
new file mode 100644
index 0000000..7f7468e
--- /dev/null
+++ b/app/components/plugins/card/base/card-icon.tsx
@@ -0,0 +1,66 @@
+import { RiCheckLine, RiCloseLine } from '@remixicon/react'
+import AppIcon from '@/app/components/base/app-icon'
+import cn from '@/utils/classnames'
+
+const iconSizeMap = {
+  xs: 'w-4 h-4 text-base',
+  tiny: 'w-6 h-6 text-base',
+  small: 'w-8 h-8',
+  medium: 'w-9 h-9',
+  large: 'w-10 h-10',
+}
+const Icon = ({
+  className,
+  src,
+  installed = false,
+  installFailed = false,
+  size = 'large',
+}: {
+  className?: string
+  src: string | {
+    content: string
+    background: string
+  }
+  installed?: boolean
+  installFailed?: boolean
+  size?: 'xs' | 'tiny' | 'small' | 'medium' | 'large'
+}) => {
+  const iconClassName = 'flex justify-center items-center gap-2 absolute bottom-[-4px] right-[-4px] w-[18px] h-[18px] rounded-full border-2 border-components-panel-bg'
+  if (typeof src === 'object') {
+    return (
+      <div className={cn('relative', className)}>
+        <AppIcon
+          size={size}
+          iconType={'emoji'}
+          icon={src.content}
+          background={src.background}
+          className='rounded-md'
+        />
+      </div>
+    )
+  }
+
+  return (
+    <div
+      className={cn('relative shrink-0 rounded-md bg-contain bg-center bg-no-repeat', iconSizeMap[size], className)}
+      style={{
+        backgroundImage: `url(${src})`,
+      }}
+    >
+      {
+        installed
+        && <div className={cn(iconClassName, 'bg-state-success-solid')}>
+          <RiCheckLine className='h-3 w-3 text-text-primary-on-surface' />
+        </div>
+      }
+      {
+        installFailed
+        && <div className={cn(iconClassName, 'bg-state-destructive-solid')}>
+          <RiCloseLine className='h-3 w-3 text-text-primary-on-surface' />
+        </div>
+      }
+    </div>
+  )
+}
+
+export default Icon
diff --git a/app/components/plugins/card/base/corner-mark.tsx b/app/components/plugins/card/base/corner-mark.tsx
new file mode 100644
index 0000000..43c515d
--- /dev/null
+++ b/app/components/plugins/card/base/corner-mark.tsx
@@ -0,0 +1,12 @@
+import { LeftCorner } from '../../../base/icons/src/vender/plugin'
+
+const CornerMark = ({ text }: { text: string }) => {
+  return (
+    <div className='absolute right-0 top-0 flex pl-[13px] '>
+      <LeftCorner className="text-background-section" />
+      <div className="system-2xs-medium-uppercase h-5 rounded-tr-xl bg-background-section pr-2 leading-5 text-text-tertiary">{text}</div>
+    </div>
+  )
+}
+
+export default CornerMark
diff --git a/app/components/plugins/card/base/description.tsx b/app/components/plugins/card/base/description.tsx
new file mode 100644
index 0000000..bffcde3
--- /dev/null
+++ b/app/components/plugins/card/base/description.tsx
@@ -0,0 +1,31 @@
+import type { FC } from 'react'
+import React, { useMemo } from 'react'
+import cn from '@/utils/classnames'
+
+type Props = {
+  className?: string
+  text: string
+  descriptionLineRows: number
+}
+
+const Description: FC<Props> = ({
+  className,
+  text,
+  descriptionLineRows,
+}) => {
+  const lineClassName = useMemo(() => {
+    if (descriptionLineRows === 1)
+      return 'h-4 truncate'
+    else if (descriptionLineRows === 2)
+      return 'h-8 line-clamp-2'
+    else
+      return 'h-12 line-clamp-3'
+  }, [descriptionLineRows])
+  return (
+    <div className={cn('system-xs-regular text-text-tertiary', lineClassName, className)}>
+      {text}
+    </div>
+  )
+}
+
+export default Description
diff --git a/app/components/plugins/card/base/download-count.tsx b/app/components/plugins/card/base/download-count.tsx
new file mode 100644
index 0000000..7b3ae4d
--- /dev/null
+++ b/app/components/plugins/card/base/download-count.tsx
@@ -0,0 +1,19 @@
+import { RiInstallLine } from '@remixicon/react'
+import { formatNumber } from '@/utils/format'
+
+type Props = {
+  downloadCount: number
+}
+
+const DownloadCount = ({
+  downloadCount,
+}: Props) => {
+  return (
+    <div className="flex items-center space-x-1 text-text-tertiary">
+      <RiInstallLine className="h-3 w-3 shrink-0" />
+      <div className="system-xs-regular">{formatNumber(downloadCount)}</div>
+    </div>
+  )
+}
+
+export default DownloadCount
diff --git a/app/components/plugins/card/base/org-info.tsx b/app/components/plugins/card/base/org-info.tsx
new file mode 100644
index 0000000..01561f1
--- /dev/null
+++ b/app/components/plugins/card/base/org-info.tsx
@@ -0,0 +1,30 @@
+import cn from '@/utils/classnames'
+type Props = {
+  className?: string
+  orgName?: string
+  packageName: string
+  packageNameClassName?: string
+}
+
+const OrgInfo = ({
+  className,
+  orgName,
+  packageName,
+  packageNameClassName,
+}: Props) => {
+  return (
+    <div className={cn('flex h-4 items-center space-x-0.5', className)}>
+      {orgName && (
+        <>
+          <span className='system-xs-regular shrink-0 text-text-tertiary'>{orgName}</span>
+          <span className='system-xs-regular shrink-0 text-text-quaternary'>/</span>
+        </>
+      )}
+      <span className={cn('system-xs-regular w-0 shrink-0 grow truncate text-text-tertiary', packageNameClassName)}>
+        {packageName}
+      </span>
+    </div>
+  )
+}
+
+export default OrgInfo
diff --git a/app/components/plugins/card/base/placeholder.tsx b/app/components/plugins/card/base/placeholder.tsx
new file mode 100644
index 0000000..4505be3
--- /dev/null
+++ b/app/components/plugins/card/base/placeholder.tsx
@@ -0,0 +1,51 @@
+import { Group } from '../../../base/icons/src/vender/other'
+import Title from './title'
+import { SkeletonContainer, SkeletonPoint, SkeletonRectangle, SkeletonRow } from '@/app/components/base/skeleton'
+import cn from '@/utils/classnames'
+
+type Props = {
+  wrapClassName: string
+  loadingFileName?: string
+}
+
+export const LoadingPlaceholder = ({ className }: { className?: string }) => (
+  <div className={cn('h-2 rounded-sm bg-text-quaternary opacity-20', className)} />
+)
+
+const Placeholder = ({
+  wrapClassName,
+  loadingFileName,
+}: Props) => {
+  return (
+    <div className={wrapClassName}>
+      <SkeletonRow>
+        <div
+          className='flex h-10 w-10 items-center justify-center gap-2 rounded-[10px] border-[0.5px]
+              border-components-panel-border bg-background-default p-1 backdrop-blur-sm'>
+          <div className='flex h-5 w-5 items-center justify-center'>
+            <Group className='text-text-tertiary' />
+          </div>
+        </div>
+        <div className="grow">
+          <SkeletonContainer>
+            <div className="flex h-5 items-center">
+              {loadingFileName ? (
+                <Title title={loadingFileName} />
+              ) : (
+                <SkeletonRectangle className="w-[260px]" />
+              )}
+            </div>
+            <SkeletonRow className="h-4">
+              <SkeletonRectangle className="w-[41px]" />
+              <SkeletonPoint />
+              <SkeletonRectangle className="w-[180px]" />
+            </SkeletonRow>
+          </SkeletonContainer>
+        </div>
+      </SkeletonRow>
+      <SkeletonRectangle className="mt-3 w-[420px]" />
+    </div>
+  )
+}
+
+export default Placeholder
diff --git a/app/components/plugins/card/base/title.tsx b/app/components/plugins/card/base/title.tsx
new file mode 100644
index 0000000..41e66e7
--- /dev/null
+++ b/app/components/plugins/card/base/title.tsx
@@ -0,0 +1,13 @@
+const Title = ({
+  title,
+}: {
+  title: string
+}) => {
+  return (
+    <div className='system-md-semibold truncate text-text-secondary'>
+      {title}
+    </div>
+  )
+}
+
+export default Title
diff --git a/app/components/plugins/card/card-more-info.tsx b/app/components/plugins/card/card-more-info.tsx
new file mode 100644
index 0000000..4853361
--- /dev/null
+++ b/app/components/plugins/card/card-more-info.tsx
@@ -0,0 +1,36 @@
+import DownloadCount from './base/download-count'
+
+type Props = {
+  downloadCount?: number
+  tags: string[]
+}
+
+const CardMoreInfo = ({
+  downloadCount,
+  tags,
+}: Props) => {
+  return (
+    <div className="flex h-5 items-center">
+      {downloadCount !== undefined && <DownloadCount downloadCount={downloadCount} />}
+      {downloadCount !== undefined && tags && tags.length > 0 && <div className="system-xs-regular mx-2 text-text-quaternary">路</div>}
+      {tags && tags.length > 0 && (
+        <>
+          <div className="flex h-4 flex-wrap space-x-2 overflow-hidden">
+            {tags.map(tag => (
+              <div
+                key={tag}
+                className="system-xs-regular flex max-w-[120px] space-x-1 overflow-hidden"
+                title={`# ${tag}`}
+              >
+                <span className="text-text-quaternary">#</span>
+                <span className="truncate text-text-tertiary">{tag}</span>
+              </div>
+            ))}
+          </div>
+        </>
+      )}
+    </div>
+  )
+}
+
+export default CardMoreInfo
diff --git a/app/components/plugins/card/index.tsx b/app/components/plugins/card/index.tsx
new file mode 100644
index 0000000..1cc18ac
--- /dev/null
+++ b/app/components/plugins/card/index.tsx
@@ -0,0 +1,97 @@
+'use client'
+import React from 'react'
+import type { Plugin } from '../types'
+import Icon from '../card/base/card-icon'
+import CornerMark from './base/corner-mark'
+import Title from './base/title'
+import OrgInfo from './base/org-info'
+import Description from './base/description'
+import Placeholder from './base/placeholder'
+import cn from '@/utils/classnames'
+import { useGetLanguage } from '@/context/i18n'
+import { getLanguage } from '@/i18n/language'
+import { useSingleCategories } from '../hooks'
+import { renderI18nObject } from '@/i18n'
+import { useMixedTranslation } from '@/app/components/plugins/marketplace/hooks'
+import Partner from '../base/badges/partner'
+import Verified from '../base/badges/verified'
+
+export type Props = {
+  className?: string
+  payload: Plugin
+  titleLeft?: React.ReactNode
+  installed?: boolean
+  installFailed?: boolean
+  hideCornerMark?: boolean
+  descriptionLineRows?: number
+  footer?: React.ReactNode
+  isLoading?: boolean
+  loadingFileName?: string
+  locale?: string
+}
+
+const Card = ({
+  className,
+  payload,
+  titleLeft,
+  installed,
+  installFailed,
+  hideCornerMark,
+  descriptionLineRows = 2,
+  footer,
+  isLoading = false,
+  loadingFileName,
+  locale: localeFromProps,
+}: Props) => {
+  const defaultLocale = useGetLanguage()
+  const locale = localeFromProps ? getLanguage(localeFromProps) : defaultLocale
+  const { t } = useMixedTranslation(localeFromProps)
+  const { categoriesMap } = useSingleCategories(t)
+  const { category, type, name, org, label, brief, icon, verified, badges = [] } = payload
+  const isBundle = !['plugin', 'model', 'tool', 'extension', 'agent-strategy'].includes(type)
+  const cornerMark = isBundle ? categoriesMap.bundle?.label : categoriesMap[category]?.label
+  const getLocalizedText = (obj: Record<string, string> | undefined) =>
+    obj ? renderI18nObject(obj, locale) : ''
+  const isPartner = badges.includes('partner')
+
+  const wrapClassName = cn('hover-bg-components-panel-on-panel-item-bg relative rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg p-4 pb-3 shadow-xs', className)
+  if (isLoading) {
+    return (
+      <Placeholder
+        wrapClassName={wrapClassName}
+        loadingFileName={loadingFileName!}
+      />
+    )
+  }
+
+  return (
+    <div className={wrapClassName}>
+      {!hideCornerMark && <CornerMark text={cornerMark} />}
+      {/* Header */}
+      <div className="flex">
+        <Icon src={icon} installed={installed} installFailed={installFailed} />
+        <div className="ml-3 w-0 grow">
+          <div className="flex h-5 items-center">
+            <Title title={getLocalizedText(label)} />
+            {isPartner && <Partner className='ml-0.5 h-4 w-4' text={t('plugin.marketplace.partnerTip')} />}
+            {verified && <Verified className='ml-0.5 h-4 w-4' text={t('plugin.marketplace.verifiedTip')} />}
+            {titleLeft} {/* This can be version badge */}
+          </div>
+          <OrgInfo
+            className="mt-0.5"
+            orgName={org}
+            packageName={name}
+          />
+        </div>
+      </div>
+      <Description
+        className="mt-3"
+        text={getLocalizedText(brief)}
+        descriptionLineRows={descriptionLineRows}
+      />
+      {footer && <div>{footer}</div>}
+    </div>
+  )
+}
+
+export default React.memo(Card)
diff --git a/app/components/plugins/constants.ts b/app/components/plugins/constants.ts
new file mode 100644
index 0000000..02439be
--- /dev/null
+++ b/app/components/plugins/constants.ts
@@ -0,0 +1,27 @@
+export const tagKeys = [
+  'agent',
+  'search',
+  'image',
+  'videos',
+  'weather',
+  'finance',
+  'design',
+  'travel',
+  'social',
+  'news',
+  'medical',
+  'productivity',
+  'education',
+  'business',
+  'entertainment',
+  'utilities',
+  'other',
+]
+
+export const categoryKeys = [
+  'model',
+  'tool',
+  'agent-strategy',
+  'extension',
+  'bundle',
+]
diff --git a/app/components/plugins/hooks.ts b/app/components/plugins/hooks.ts
new file mode 100644
index 0000000..0349c46
--- /dev/null
+++ b/app/components/plugins/hooks.ts
@@ -0,0 +1,108 @@
+import { useTranslation } from 'react-i18next'
+import type { TFunction } from 'i18next'
+import {
+  categoryKeys,
+  tagKeys,
+} from './constants'
+
+type Tag = {
+  name: string
+  label: string
+}
+
+export const useTags = (translateFromOut?: TFunction) => {
+  const { t: translation } = useTranslation()
+  const t = translateFromOut || translation
+
+  const tags = tagKeys.map((tag) => {
+    return {
+      name: tag,
+      label: t(`pluginTags.tags.${tag}`),
+    }
+  })
+
+  const tagsMap = tags.reduce((acc, tag) => {
+    acc[tag.name] = tag
+    return acc
+  }, {} as Record<string, Tag>)
+
+  return {
+    tags,
+    tagsMap,
+  }
+}
+
+type Category = {
+  name: string
+  label: string
+}
+
+export const useCategories = (translateFromOut?: TFunction) => {
+  const { t: translation } = useTranslation()
+  const t = translateFromOut || translation
+
+  const categories = categoryKeys.map((category) => {
+    if (category === 'agent-strategy') {
+      return {
+        name: 'agent-strategy',
+        label: t('plugin.category.agents'),
+      }
+    }
+    return {
+      name: category,
+      label: t(`plugin.category.${category}s`),
+    }
+  })
+
+  const categoriesMap = categories.reduce((acc, category) => {
+    acc[category.name] = category
+    return acc
+  }, {} as Record<string, Category>)
+
+  return {
+    categories,
+    categoriesMap,
+  }
+}
+
+export const useSingleCategories = (translateFromOut?: TFunction) => {
+  const { t: translation } = useTranslation()
+  const t = translateFromOut || translation
+
+  const categories = categoryKeys.map((category) => {
+    if (category === 'agent-strategy') {
+      return {
+        name: 'agent-strategy',
+        label: t('plugin.categorySingle.agent'),
+      }
+    }
+    return {
+      name: category,
+      label: t(`plugin.categorySingle.${category}`),
+    }
+  })
+
+  const categoriesMap = categories.reduce((acc, category) => {
+    acc[category.name] = category
+    return acc
+  }, {} as Record<string, Category>)
+
+  return {
+    categories,
+    categoriesMap,
+  }
+}
+
+export const PLUGIN_PAGE_TABS_MAP = {
+  plugins: 'plugins',
+  marketplace: 'discover',
+}
+
+export const usePluginPageTabs = () => {
+  const { t } = useTranslation()
+  const tabs = [
+    { value: PLUGIN_PAGE_TABS_MAP.plugins, text: t('common.menus.plugins') },
+    { value: PLUGIN_PAGE_TABS_MAP.marketplace, text: t('common.menus.exploreMarketplace') },
+  ]
+  return tabs
+}
diff --git a/app/components/plugins/install-plugin/base/check-task-status.ts b/app/components/plugins/install-plugin/base/check-task-status.ts
new file mode 100644
index 0000000..320f50d
--- /dev/null
+++ b/app/components/plugins/install-plugin/base/check-task-status.ts
@@ -0,0 +1,63 @@
+import { checkTaskStatus as fetchCheckTaskStatus } from '@/service/plugins'
+import type { PluginStatus } from '../../types'
+import { TaskStatus } from '../../types'
+import { sleep } from '@/utils'
+
+const INTERVAL = 10 * 1000 // 10 seconds
+
+type Params = {
+  taskId: string
+  pluginUniqueIdentifier: string
+}
+
+function checkTaskStatus() {
+  let nextStatus = TaskStatus.running
+  let isStop = false
+
+  const doCheckStatus = async ({
+    taskId,
+    pluginUniqueIdentifier,
+  }: Params) => {
+    if (isStop) {
+      return {
+        status: TaskStatus.success,
+      }
+    }
+    const res = await fetchCheckTaskStatus(taskId)
+    const { plugins } = res.task
+    const plugin = plugins.find((p: PluginStatus) => p.plugin_unique_identifier === pluginUniqueIdentifier)
+    if (!plugin) {
+      nextStatus = TaskStatus.failed
+      return {
+        status: TaskStatus.failed,
+        error: 'Plugin package not found',
+      }
+    }
+    nextStatus = plugin.status
+    if (nextStatus === TaskStatus.running) {
+      await sleep(INTERVAL)
+      return await doCheckStatus({
+        taskId,
+        pluginUniqueIdentifier,
+      })
+    }
+    if (nextStatus === TaskStatus.failed) {
+      return {
+        status: TaskStatus.failed,
+        error: plugin.message,
+      }
+    }
+    return ({
+      status: TaskStatus.success,
+    })
+  }
+
+  return {
+    check: doCheckStatus,
+    stop: () => {
+      isStop = true
+    },
+  }
+}
+
+export default checkTaskStatus
diff --git a/app/components/plugins/install-plugin/base/installed.tsx b/app/components/plugins/install-plugin/base/installed.tsx
new file mode 100644
index 0000000..4da06ef
--- /dev/null
+++ b/app/components/plugins/install-plugin/base/installed.tsx
@@ -0,0 +1,60 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import Card from '../../card'
+import Button from '@/app/components/base/button'
+import type { Plugin, PluginDeclaration, PluginManifestInMarket } from '../../types'
+import { pluginManifestInMarketToPluginProps, pluginManifestToCardPluginProps } from '../utils'
+import Badge, { BadgeState } from '@/app/components/base/badge/index'
+
+type Props = {
+  payload?: Plugin | PluginDeclaration | PluginManifestInMarket | null
+  isMarketPayload?: boolean
+  isFailed: boolean
+  errMsg?: string | null
+  onCancel: () => void
+}
+
+const Installed: FC<Props> = ({
+  payload,
+  isMarketPayload,
+  isFailed,
+  errMsg,
+  onCancel,
+}) => {
+  const { t } = useTranslation()
+
+  const handleClose = () => {
+    onCancel()
+  }
+  return (
+    <>
+      <div className='flex flex-col items-start justify-center gap-4 self-stretch px-6 py-3'>
+        <p className='system-md-regular text-text-secondary'>{(isFailed && errMsg) ? errMsg : t(`plugin.installModal.${isFailed ? 'installFailedDesc' : 'installedSuccessfullyDesc'}`)}</p>
+        {payload && (
+          <div className='flex flex-wrap content-start items-start gap-1 self-stretch rounded-2xl bg-background-section-burn p-2'>
+            <Card
+              className='w-full'
+              payload={isMarketPayload ? pluginManifestInMarketToPluginProps(payload as PluginManifestInMarket) : pluginManifestToCardPluginProps(payload as PluginDeclaration)}
+              installed={!isFailed}
+              installFailed={isFailed}
+              titleLeft={<Badge className='mx-1' size="s" state={BadgeState.Default}>{(payload as PluginDeclaration).version || (payload as PluginManifestInMarket).latest_version}</Badge>}
+            />
+          </div>
+        )}
+      </div>
+      {/* Action Buttons */}
+      <div className='flex items-center justify-end gap-2 self-stretch p-6 pt-5'>
+        <Button
+          variant='primary'
+          className='min-w-[72px]'
+          onClick={handleClose}
+        >
+          {t('common.operation.close')}
+        </Button>
+      </div>
+    </>
+  )
+}
+export default React.memo(Installed)
diff --git a/app/components/plugins/install-plugin/base/loading-error.tsx b/app/components/plugins/install-plugin/base/loading-error.tsx
new file mode 100644
index 0000000..a79a381
--- /dev/null
+++ b/app/components/plugins/install-plugin/base/loading-error.tsx
@@ -0,0 +1,45 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { Group } from '../../../base/icons/src/vender/other'
+import { LoadingPlaceholder } from '@/app/components/plugins/card/base/placeholder'
+import Checkbox from '@/app/components/base/checkbox'
+import { RiCloseLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+
+const LoadingError: FC = () => {
+  const { t } = useTranslation()
+  return (
+    <div className='flex items-center space-x-2'>
+      <Checkbox
+        className='shrink-0'
+        checked={false}
+        disabled
+      />
+      <div className='hover-bg-components-panel-on-panel-item-bg relative grow rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg p-4 pb-3 shadow-xs'>
+        <div className="flex">
+          <div
+            className='relative flex h-10 w-10 items-center justify-center gap-2 rounded-[10px] border-[0.5px]
+              border-state-destructive-border bg-state-destructive-hover p-1 backdrop-blur-sm'>
+            <div className='flex h-5 w-5 items-center justify-center'>
+              <Group className='text-text-quaternary' />
+            </div>
+            <div className='absolute bottom-[-4px] right-[-4px] rounded-full border-[2px] border-components-panel-bg bg-state-destructive-solid'>
+              <RiCloseLine className='h-3 w-3 text-text-primary-on-surface' />
+            </div>
+          </div>
+          <div className="ml-3 grow">
+            <div className="system-md-semibold flex h-5 items-center text-text-destructive">
+              {t('plugin.installModal.pluginLoadError')}
+            </div>
+            <div className='system-xs-regular mt-0.5 text-text-tertiary'>
+              {t('plugin.installModal.pluginLoadErrorDesc')}
+            </div>
+          </div>
+        </div>
+        <LoadingPlaceholder className="mt-3 w-[420px]" />
+      </div>
+    </div>
+  )
+}
+export default React.memo(LoadingError)
diff --git a/app/components/plugins/install-plugin/base/loading.tsx b/app/components/plugins/install-plugin/base/loading.tsx
new file mode 100644
index 0000000..61a91cb
--- /dev/null
+++ b/app/components/plugins/install-plugin/base/loading.tsx
@@ -0,0 +1,23 @@
+'use client'
+import React from 'react'
+import Placeholder from '../../card/base/placeholder'
+import Checkbox from '@/app/components/base/checkbox'
+
+const Loading = () => {
+  return (
+    <div className='flex items-center space-x-2'>
+      <Checkbox
+        className='shrink-0'
+        checked={false}
+        disabled
+      />
+      <div className='hover-bg-components-panel-on-panel-item-bg relative grow rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg p-4 pb-3 shadow-xs'>
+        <Placeholder
+          wrapClassName='w-full'
+        />
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Loading)
diff --git a/app/components/plugins/install-plugin/base/use-get-icon.ts b/app/components/plugins/install-plugin/base/use-get-icon.ts
new file mode 100644
index 0000000..bb46f27
--- /dev/null
+++ b/app/components/plugins/install-plugin/base/use-get-icon.ts
@@ -0,0 +1,16 @@
+import { useCallback } from 'react'
+import { apiPrefix } from '@/config'
+import { useSelector } from '@/context/app-context'
+
+const useGetIcon = () => {
+  const currentWorkspace = useSelector(s => s.currentWorkspace)
+  const getIconUrl = useCallback((fileName: string) => {
+    return `${apiPrefix}/workspaces/current/plugin/icon?tenant_id=${currentWorkspace.id}&filename=${fileName}`
+  }, [currentWorkspace.id])
+
+  return {
+    getIconUrl,
+  }
+}
+
+export default useGetIcon
diff --git a/app/components/plugins/install-plugin/base/version.tsx b/app/components/plugins/install-plugin/base/version.tsx
new file mode 100644
index 0000000..67bbc8e
--- /dev/null
+++ b/app/components/plugins/install-plugin/base/version.tsx
@@ -0,0 +1,34 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import Badge, { BadgeState } from '@/app/components/base/badge/index'
+import type { VersionProps } from '../../types'
+
+const Version: FC<VersionProps> = ({
+  hasInstalled,
+  installedVersion,
+  toInstallVersion,
+}) => {
+  return (
+    <>
+      {
+        !hasInstalled
+          ? (
+            <Badge className='mx-1' size="s" state={BadgeState.Default}>{toInstallVersion}</Badge>
+          )
+          : (
+            <>
+              <Badge className='mx-1' size="s" state={BadgeState.Warning}>
+                {`${installedVersion} -> ${toInstallVersion}`}
+              </Badge>
+              {/* <div className='flex px-0.5 justify-center items-center gap-0.5'>
+              <div className='text-text-warning system-xs-medium'>Used in 3 apps</div>
+              <RiInformation2Line className='w-4 h-4 text-text-tertiary' />
+            </div> */}
+            </>
+          )
+      }
+    </>
+  )
+}
+export default React.memo(Version)
diff --git a/app/components/plugins/install-plugin/hooks.ts b/app/components/plugins/install-plugin/hooks.ts
new file mode 100644
index 0000000..5da4c75
--- /dev/null
+++ b/app/components/plugins/install-plugin/hooks.ts
@@ -0,0 +1,107 @@
+import Toast, { type IToastProps } from '@/app/components/base/toast'
+import { uploadGitHub } from '@/service/plugins'
+import { compareVersion, getLatestVersion } from '@/utils/semver'
+import type { GitHubRepoReleaseResponse } from '../types'
+import { GITHUB_ACCESS_TOKEN } from '@/config'
+
+const formatReleases = (releases: any) => {
+  return releases.map((release: any) => ({
+    tag_name: release.tag_name,
+    assets: release.assets.map((asset: any) => ({
+      browser_download_url: asset.browser_download_url,
+      name: asset.name,
+    })),
+  }))
+}
+
+export const useGitHubReleases = () => {
+  const fetchReleases = async (owner: string, repo: string) => {
+    try {
+      if (!GITHUB_ACCESS_TOKEN) {
+        // Fetch releases without authentication from client
+        const res = await fetch(`https://api.github.com/repos/${owner}/${repo}/releases`)
+        if (!res.ok) throw new Error('Failed to fetch repository releases')
+        const data = await res.json()
+        return formatReleases(data)
+      }
+      else {
+        // Fetch releases with authentication from server
+        const res = await fetch(`/repos/${owner}/${repo}/releases`)
+        const bodyJson = await res.json()
+        if (bodyJson.status !== 200) throw new Error(bodyJson.data.message)
+        return formatReleases(bodyJson.data)
+      }
+    }
+    catch (error) {
+      if (error instanceof Error) {
+        Toast.notify({
+          type: 'error',
+          message: error.message,
+        })
+      }
+      else {
+        Toast.notify({
+          type: 'error',
+          message: 'Failed to fetch repository releases',
+        })
+      }
+      return []
+    }
+  }
+
+  const checkForUpdates = (fetchedReleases: GitHubRepoReleaseResponse[], currentVersion: string) => {
+    let needUpdate = false
+    const toastProps: IToastProps = {
+      type: 'info',
+      message: 'No new version available',
+    }
+    if (fetchedReleases.length === 0) {
+      toastProps.type = 'error'
+      toastProps.message = 'Input releases is empty'
+      return { needUpdate, toastProps }
+    }
+    const versions = fetchedReleases.map(release => release.tag_name)
+    const latestVersion = getLatestVersion(versions)
+    try {
+      needUpdate = compareVersion(latestVersion, currentVersion) === 1
+      if (needUpdate)
+        toastProps.message = `New version available: ${latestVersion}`
+    }
+    catch {
+      needUpdate = false
+      toastProps.type = 'error'
+      toastProps.message = 'Fail to compare versions, please check the version format'
+    }
+    return { needUpdate, toastProps }
+  }
+
+  return { fetchReleases, checkForUpdates }
+}
+
+export const useGitHubUpload = () => {
+  const handleUpload = async (
+    repoUrl: string,
+    selectedVersion: string,
+    selectedPackage: string,
+    onSuccess?: (GitHubPackage: { manifest: any; unique_identifier: string }) => void,
+  ) => {
+    try {
+      const response = await uploadGitHub(repoUrl, selectedVersion, selectedPackage)
+      const GitHubPackage = {
+        manifest: response.manifest,
+        unique_identifier: response.unique_identifier,
+      }
+      if (onSuccess) onSuccess(GitHubPackage)
+      return GitHubPackage
+    }
+    catch (error) {
+      Toast.notify({
+        type: 'error',
+        message: 'Error uploading package',
+      })
+      throw error
+    }
+  }
+
+  return { handleUpload }
+}
diff --git a/app/components/plugins/install-plugin/hooks/use-check-installed.tsx b/app/components/plugins/install-plugin/hooks/use-check-installed.tsx
new file mode 100644
index 0000000..e9d83c8
--- /dev/null
+++ b/app/components/plugins/install-plugin/hooks/use-check-installed.tsx
@@ -0,0 +1,33 @@
+import { useCheckInstalled as useDoCheckInstalled } from '@/service/use-plugins'
+
+import { useMemo } from 'react'
+import type { VersionInfo } from '../../types'
+type Props = {
+  pluginIds: string[],
+  enabled: boolean
+}
+const useCheckInstalled = (props: Props) => {
+  const { data, isLoading, error } = useDoCheckInstalled(props)
+
+  const installedInfo = useMemo(() => {
+    if (!data)
+      return undefined
+
+    const res: Record<string, VersionInfo> = {}
+    data?.plugins.forEach((plugin) => {
+      res[plugin.plugin_id] = {
+        installedId: plugin.id,
+        installedVersion: plugin.declaration.version,
+        uniqueIdentifier: plugin.plugin_unique_identifier,
+      }
+    })
+    return res
+  }, [data])
+  return {
+    installedInfo,
+    isLoading,
+    error,
+  }
+}
+
+export default useCheckInstalled
diff --git a/app/components/plugins/install-plugin/hooks/use-fold-anim-into.ts b/app/components/plugins/install-plugin/hooks/use-fold-anim-into.ts
new file mode 100644
index 0000000..4b8d5e8
--- /dev/null
+++ b/app/components/plugins/install-plugin/hooks/use-fold-anim-into.ts
@@ -0,0 +1,57 @@
+import { sleep } from '@/utils'
+
+const animTime = 750
+const modalClassName = 'install-modal'
+const COUNT_DOWN_TIME = 15000 // 15s
+
+function getElemCenter(elem: HTMLElement) {
+  const rect = elem.getBoundingClientRect()
+  return {
+    x: rect.left + rect.width / 2 + window.scrollX,
+    y: rect.top + rect.height / 2 + window.scrollY,
+  }
+}
+
+const useFoldAnimInto = (onClose: () => void) => {
+  let countDownRunId: number
+  const clearCountDown = () => {
+    clearTimeout(countDownRunId)
+  }
+  // modalElem fold into plugin install task btn
+  const foldIntoAnim = async () => {
+    clearCountDown()
+    const modalElem = document.querySelector(`.${modalClassName}`) as HTMLElement
+    const pluginTaskTriggerElem = document.getElementById('plugin-task-trigger') || document.querySelector('.plugins-nav-button')
+
+    if (!modalElem || !pluginTaskTriggerElem) {
+      onClose()
+      return
+    }
+
+    const modelCenter = getElemCenter(modalElem)
+    const modalElemRect = modalElem.getBoundingClientRect()
+    const pluginTaskTriggerCenter = getElemCenter(pluginTaskTriggerElem)
+    const xDiff = pluginTaskTriggerCenter.x - modelCenter.x
+    const yDiff = pluginTaskTriggerCenter.y - modelCenter.y
+    const scale = 1 / Math.max(modalElemRect.width, modalElemRect.height)
+    modalElem.style.transition = `all cubic-bezier(0.4, 0, 0.2, 1) ${animTime}ms`
+    modalElem.style.transform = `translate(${xDiff}px, ${yDiff}px) scale(${scale})`
+    await sleep(animTime)
+    onClose()
+  }
+
+  const countDownFoldIntoAnim = async () => {
+    countDownRunId = window.setTimeout(() => {
+      foldIntoAnim()
+    }, COUNT_DOWN_TIME)
+  }
+
+  return {
+    modalClassName,
+    foldIntoAnim,
+    clearCountDown,
+    countDownFoldIntoAnim,
+  }
+}
+
+export default useFoldAnimInto
diff --git a/app/components/plugins/install-plugin/hooks/use-hide-logic.ts b/app/components/plugins/install-plugin/hooks/use-hide-logic.ts
new file mode 100644
index 0000000..e5d2d18
--- /dev/null
+++ b/app/components/plugins/install-plugin/hooks/use-hide-logic.ts
@@ -0,0 +1,40 @@
+import { useCallback, useState } from 'react'
+import useFoldAnimInto from './use-fold-anim-into'
+
+const useHideLogic = (onClose: () => void) => {
+  const {
+    modalClassName,
+    foldIntoAnim: doFoldAnimInto,
+    clearCountDown,
+    countDownFoldIntoAnim,
+  } = useFoldAnimInto(onClose)
+
+  const [isInstalling, doSetIsInstalling] = useState(false)
+  const setIsInstalling = useCallback((isInstalling: boolean) => {
+    if (!isInstalling)
+      clearCountDown()
+    doSetIsInstalling(isInstalling)
+  }, [clearCountDown])
+
+  const foldAnimInto = useCallback(() => {
+    if (isInstalling) {
+      doFoldAnimInto()
+      return
+    }
+    onClose()
+  }, [doFoldAnimInto, isInstalling, onClose])
+
+  const handleStartToInstall = useCallback(() => {
+    setIsInstalling(true)
+    countDownFoldIntoAnim()
+  }, [countDownFoldIntoAnim, setIsInstalling])
+
+  return {
+    modalClassName,
+    foldAnimInto,
+    setIsInstalling,
+    handleStartToInstall,
+  }
+}
+
+export default useHideLogic
diff --git a/app/components/plugins/install-plugin/hooks/use-refresh-plugin-list.tsx b/app/components/plugins/install-plugin/hooks/use-refresh-plugin-list.tsx
new file mode 100644
index 0000000..ac26971
--- /dev/null
+++ b/app/components/plugins/install-plugin/hooks/use-refresh-plugin-list.tsx
@@ -0,0 +1,48 @@
+import { useModelList } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { useProviderContext } from '@/context/provider-context'
+import { useInvalidateInstalledPluginList } from '@/service/use-plugins'
+import { useInvalidateAllBuiltInTools, useInvalidateAllToolProviders } from '@/service/use-tools'
+import { useInvalidateStrategyProviders } from '@/service/use-strategy'
+import type { Plugin, PluginDeclaration, PluginManifestInMarket } from '../../types'
+import { PluginType } from '../../types'
+
+const useRefreshPluginList = () => {
+  const invalidateInstalledPluginList = useInvalidateInstalledPluginList()
+  const { mutate: refetchLLMModelList } = useModelList(ModelTypeEnum.textGeneration)
+  const { mutate: refetchEmbeddingModelList } = useModelList(ModelTypeEnum.textEmbedding)
+  const { mutate: refetchRerankModelList } = useModelList(ModelTypeEnum.rerank)
+  const { refreshModelProviders } = useProviderContext()
+
+  const invalidateAllToolProviders = useInvalidateAllToolProviders()
+  const invalidateAllBuiltInTools = useInvalidateAllBuiltInTools()
+
+  const invalidateStrategyProviders = useInvalidateStrategyProviders()
+  return {
+    refreshPluginList: (manifest?: PluginManifestInMarket | Plugin | PluginDeclaration | null, refreshAllType?: boolean) => {
+      // installed list
+      invalidateInstalledPluginList()
+
+      // tool page, tool select
+      if ((manifest && PluginType.tool.includes(manifest.category)) || refreshAllType) {
+        invalidateAllToolProviders()
+        invalidateAllBuiltInTools()
+        // TODO: update suggested tools. It's a function in hook useMarketplacePlugins,handleUpdatePlugins
+      }
+
+      // model select
+      if ((manifest && PluginType.model.includes(manifest.category)) || refreshAllType) {
+        refreshModelProviders()
+        refetchLLMModelList()
+        refetchEmbeddingModelList()
+        refetchRerankModelList()
+      }
+
+      // agent select
+      if ((manifest && PluginType.agent.includes(manifest.category)) || refreshAllType)
+        invalidateStrategyProviders()
+    },
+  }
+}
+
+export default useRefreshPluginList
diff --git a/app/components/plugins/install-plugin/install-bundle/index.tsx b/app/components/plugins/install-plugin/install-bundle/index.tsx
new file mode 100644
index 0000000..c6b4cdf
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-bundle/index.tsx
@@ -0,0 +1,75 @@
+'use client'
+import type { FC } from 'react'
+import Modal from '@/app/components/base/modal'
+import React, { useCallback, useState } from 'react'
+import { InstallStep } from '../../types'
+import type { Dependency } from '../../types'
+import ReadyToInstall from './ready-to-install'
+import { useTranslation } from 'react-i18next'
+import useHideLogic from '../hooks/use-hide-logic'
+import cn from '@/utils/classnames'
+
+const i18nPrefix = 'plugin.installModal'
+
+export enum InstallType {
+  fromLocal = 'fromLocal',
+  fromMarketplace = 'fromMarketplace',
+  fromDSL = 'fromDSL',
+}
+
+type Props = {
+  installType?: InstallType
+  fromDSLPayload: Dependency[]
+  // plugins?: PluginDeclaration[]
+  onClose: () => void
+}
+
+const InstallBundle: FC<Props> = ({
+  installType = InstallType.fromMarketplace,
+  fromDSLPayload,
+  onClose,
+}) => {
+  const { t } = useTranslation()
+  const [step, setStep] = useState<InstallStep>(installType === InstallType.fromMarketplace ? InstallStep.readyToInstall : InstallStep.uploading)
+
+  const {
+    modalClassName,
+    foldAnimInto,
+    setIsInstalling,
+    handleStartToInstall,
+  } = useHideLogic(onClose)
+
+  const getTitle = useCallback(() => {
+    if (step === InstallStep.uploadFailed)
+      return t(`${i18nPrefix}.uploadFailed`)
+    if (step === InstallStep.installed)
+      return t(`${i18nPrefix}.installComplete`)
+
+    return t(`${i18nPrefix}.installPlugin`)
+  }, [step, t])
+
+  return (
+    <Modal
+      isShow={true}
+      onClose={foldAnimInto}
+      className={cn(modalClassName, 'shadows-shadow-xl flex min-w-[560px] flex-col items-start rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg p-0')}
+      closable
+    >
+      <div className='flex items-start gap-2 self-stretch pb-3 pl-6 pr-14 pt-6'>
+        <div className='title-2xl-semi-bold self-stretch text-text-primary'>
+          {getTitle()}
+        </div>
+      </div>
+      <ReadyToInstall
+        step={step}
+        onStepChange={setStep}
+        onStartToInstall={handleStartToInstall}
+        setIsInstalling={setIsInstalling}
+        allPlugins={fromDSLPayload}
+        onClose={onClose}
+      />
+    </Modal>
+  )
+}
+
+export default React.memo(InstallBundle)
diff --git a/app/components/plugins/install-plugin/install-bundle/item/github-item.tsx b/app/components/plugins/install-plugin/install-bundle/item/github-item.tsx
new file mode 100644
index 0000000..96abaa2
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-bundle/item/github-item.tsx
@@ -0,0 +1,62 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect } from 'react'
+import type { GitHubItemAndMarketPlaceDependency, Plugin } from '../../../types'
+import { pluginManifestToCardPluginProps } from '../../utils'
+import { useUploadGitHub } from '@/service/use-plugins'
+import Loading from '../../base/loading'
+import LoadedItem from './loaded-item'
+import type { VersionProps } from '@/app/components/plugins/types'
+
+type Props = {
+  checked: boolean
+  onCheckedChange: (plugin: Plugin) => void
+  dependency: GitHubItemAndMarketPlaceDependency
+  versionInfo: VersionProps
+  onFetchedPayload: (payload: Plugin) => void
+  onFetchError: () => void
+}
+
+const Item: FC<Props> = ({
+  checked,
+  onCheckedChange,
+  dependency,
+  versionInfo,
+  onFetchedPayload,
+  onFetchError,
+}) => {
+  const info = dependency.value
+  const { data, error } = useUploadGitHub({
+    repo: info.repo!,
+    version: info.release! || info.version!,
+    package: info.packages! || info.package!,
+  })
+  const [payload, setPayload] = React.useState<Plugin | null>(null)
+  useEffect(() => {
+    if (data) {
+      const payload = {
+        ...pluginManifestToCardPluginProps(data.manifest),
+        plugin_id: data.unique_identifier,
+      }
+      onFetchedPayload(payload)
+      setPayload(payload)
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [data])
+  useEffect(() => {
+    if (error)
+      onFetchError()
+
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [error])
+  if (!payload) return <Loading />
+  return (
+    <LoadedItem
+      payload={payload}
+      versionInfo={versionInfo}
+      checked={checked}
+      onCheckedChange={onCheckedChange}
+    />
+  )
+}
+export default React.memo(Item)
diff --git a/app/components/plugins/install-plugin/install-bundle/item/loaded-item.tsx b/app/components/plugins/install-plugin/install-bundle/item/loaded-item.tsx
new file mode 100644
index 0000000..5eb4c94
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-bundle/item/loaded-item.tsx
@@ -0,0 +1,51 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { Plugin } from '../../../types'
+import Card from '../../../card'
+import Checkbox from '@/app/components/base/checkbox'
+import useGetIcon from '../../base/use-get-icon'
+import { MARKETPLACE_API_PREFIX } from '@/config'
+import Version from '../../base/version'
+import type { VersionProps } from '../../../types'
+
+type Props = {
+  checked: boolean
+  onCheckedChange: (plugin: Plugin) => void
+  payload: Plugin
+  isFromMarketPlace?: boolean
+  versionInfo: VersionProps
+}
+
+const LoadedItem: FC<Props> = ({
+  checked,
+  onCheckedChange,
+  payload,
+  isFromMarketPlace,
+  versionInfo: particleVersionInfo,
+}) => {
+  const { getIconUrl } = useGetIcon()
+  const versionInfo = {
+    ...particleVersionInfo,
+    toInstallVersion: payload.version,
+  }
+  return (
+    <div className='flex items-center space-x-2'>
+      <Checkbox
+        className='shrink-0'
+        checked={checked}
+        onCheck={() => onCheckedChange(payload)}
+      />
+      <Card
+        className='grow'
+        payload={{
+          ...payload,
+          icon: isFromMarketPlace ? `${MARKETPLACE_API_PREFIX}/plugins/${payload.org}/${payload.name}/icon` : getIconUrl(payload.icon),
+        }}
+        titleLeft={payload.version ? <Version {...versionInfo} /> : null}
+      />
+    </div>
+  )
+}
+
+export default React.memo(LoadedItem)
diff --git a/app/components/plugins/install-plugin/install-bundle/item/marketplace-item.tsx b/app/components/plugins/install-plugin/install-bundle/item/marketplace-item.tsx
new file mode 100644
index 0000000..3389bdb
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-bundle/item/marketplace-item.tsx
@@ -0,0 +1,36 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { Plugin } from '../../../types'
+import Loading from '../../base/loading'
+import LoadedItem from './loaded-item'
+import type { VersionProps } from '@/app/components/plugins/types'
+
+type Props = {
+  checked: boolean
+  onCheckedChange: (plugin: Plugin) => void
+  payload?: Plugin
+  version: string
+  versionInfo: VersionProps
+}
+
+const MarketPlaceItem: FC<Props> = ({
+  checked,
+  onCheckedChange,
+  payload,
+  version,
+  versionInfo,
+}) => {
+  if (!payload) return <Loading />
+  return (
+    <LoadedItem
+      checked={checked}
+      onCheckedChange={onCheckedChange}
+      payload={{ ...payload, version }}
+      isFromMarketPlace
+      versionInfo={versionInfo}
+    />
+  )
+}
+
+export default React.memo(MarketPlaceItem)
diff --git a/app/components/plugins/install-plugin/install-bundle/item/package-item.tsx b/app/components/plugins/install-plugin/install-bundle/item/package-item.tsx
new file mode 100644
index 0000000..101c8fa
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-bundle/item/package-item.tsx
@@ -0,0 +1,41 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { Plugin } from '../../../types'
+import type { PackageDependency } from '../../../types'
+import { pluginManifestToCardPluginProps } from '../../utils'
+import LoadedItem from './loaded-item'
+import LoadingError from '../../base/loading-error'
+import type { VersionProps } from '@/app/components/plugins/types'
+
+type Props = {
+  checked: boolean
+  onCheckedChange: (plugin: Plugin) => void
+  payload: PackageDependency
+  isFromMarketPlace?: boolean
+  versionInfo: VersionProps
+}
+
+const PackageItem: FC<Props> = ({
+  payload,
+  checked,
+  onCheckedChange,
+  isFromMarketPlace,
+  versionInfo,
+}) => {
+  if (!payload.value?.manifest)
+    return <LoadingError />
+
+  const plugin = pluginManifestToCardPluginProps(payload.value.manifest)
+  return (
+    <LoadedItem
+      payload={plugin}
+      checked={checked}
+      onCheckedChange={onCheckedChange}
+      isFromMarketPlace={isFromMarketPlace}
+      versionInfo={versionInfo}
+    />
+  )
+}
+
+export default React.memo(PackageItem)
diff --git a/app/components/plugins/install-plugin/install-bundle/ready-to-install.tsx b/app/components/plugins/install-plugin/install-bundle/ready-to-install.tsx
new file mode 100644
index 0000000..63c0b5b
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-bundle/ready-to-install.tsx
@@ -0,0 +1,57 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { InstallStep } from '../../types'
+import Install from './steps/install'
+import Installed from './steps/installed'
+import type { Dependency, InstallStatusResponse, Plugin } from '../../types'
+
+type Props = {
+  step: InstallStep
+  onStepChange: (step: InstallStep) => void,
+  onStartToInstall: () => void
+  setIsInstalling: (isInstalling: boolean) => void
+  allPlugins: Dependency[]
+  onClose: () => void
+  isFromMarketPlace?: boolean
+}
+
+const ReadyToInstall: FC<Props> = ({
+  step,
+  onStepChange,
+  onStartToInstall,
+  setIsInstalling,
+  allPlugins,
+  onClose,
+  isFromMarketPlace,
+}) => {
+  const [installedPlugins, setInstalledPlugins] = useState<Plugin[]>([])
+  const [installStatus, setInstallStatus] = useState<InstallStatusResponse[]>([])
+  const handleInstalled = useCallback((plugins: Plugin[], installStatus: InstallStatusResponse[]) => {
+    setInstallStatus(installStatus)
+    setInstalledPlugins(plugins)
+    onStepChange(InstallStep.installed)
+    setIsInstalling(false)
+  }, [onStepChange, setIsInstalling])
+  return (
+    <>
+      {step === InstallStep.readyToInstall && (
+        <Install
+          allPlugins={allPlugins}
+          onCancel={onClose}
+          onStartToInstall={onStartToInstall}
+          onInstalled={handleInstalled}
+          isFromMarketPlace={isFromMarketPlace}
+        />
+      )}
+      {step === InstallStep.installed && (
+        <Installed
+          list={installedPlugins}
+          installStatus={installStatus}
+          onCancel={onClose}
+        />
+      )}
+    </>
+  )
+}
+export default React.memo(ReadyToInstall)
diff --git a/app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx b/app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx
new file mode 100644
index 0000000..40be3e6
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx
@@ -0,0 +1,221 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useMemo, useState } from 'react'
+import type { Dependency, GitHubItemAndMarketPlaceDependency, PackageDependency, Plugin, VersionInfo } from '../../../types'
+import MarketplaceItem from '../item/marketplace-item'
+import GithubItem from '../item/github-item'
+import { useFetchPluginsInMarketPlaceByIds, useFetchPluginsInMarketPlaceByInfo } from '@/service/use-plugins'
+import useCheckInstalled from '@/app/components/plugins/install-plugin/hooks/use-check-installed'
+import produce from 'immer'
+import PackageItem from '../item/package-item'
+import LoadingError from '../../base/loading-error'
+
+type Props = {
+  allPlugins: Dependency[]
+  selectedPlugins: Plugin[]
+  onSelect: (plugin: Plugin, selectedIndex: number) => void
+  onLoadedAllPlugin: (installedInfo: Record<string, VersionInfo>) => void
+  isFromMarketPlace?: boolean
+}
+
+const InstallByDSLList: FC<Props> = ({
+  allPlugins,
+  selectedPlugins,
+  onSelect,
+  onLoadedAllPlugin,
+  isFromMarketPlace,
+}) => {
+  // DSL has id, to get plugin info to show more info
+  const { isLoading: isFetchingMarketplaceDataById, data: infoGetById, error: infoByIdError } = useFetchPluginsInMarketPlaceByIds(allPlugins.filter(d => d.type === 'marketplace').map(d => (d as GitHubItemAndMarketPlaceDependency).value.marketplace_plugin_unique_identifier!))
+  // has meta(org,name,version), to get id
+  const { isLoading: isFetchingDataByMeta, data: infoByMeta, error: infoByMetaError } = useFetchPluginsInMarketPlaceByInfo(allPlugins.filter(d => d.type === 'marketplace').map(d => (d as GitHubItemAndMarketPlaceDependency).value!))
+
+  const [plugins, doSetPlugins] = useState<(Plugin | undefined)[]>((() => {
+    const hasLocalPackage = allPlugins.some(d => d.type === 'package')
+    if (!hasLocalPackage)
+      return []
+
+    const _plugins = allPlugins.map((d) => {
+      if (d.type === 'package') {
+        return {
+          ...(d as any).value.manifest,
+          plugin_id: (d as any).value.unique_identifier,
+        }
+      }
+
+      return undefined
+    })
+    return _plugins
+  })())
+
+  const pluginsRef = React.useRef<(Plugin | undefined)[]>(plugins)
+
+  const setPlugins = useCallback((p: (Plugin | undefined)[]) => {
+    doSetPlugins(p)
+    pluginsRef.current = p
+  }, [])
+
+  const [errorIndexes, setErrorIndexes] = useState<number[]>([])
+
+  const handleGitHubPluginFetched = useCallback((index: number) => {
+    return (p: Plugin) => {
+      const nextPlugins = produce(pluginsRef.current, (draft) => {
+        draft[index] = p
+      })
+      setPlugins(nextPlugins)
+    }
+  }, [setPlugins])
+
+  const handleGitHubPluginFetchError = useCallback((index: number) => {
+    return () => {
+      setErrorIndexes([...errorIndexes, index])
+    }
+  }, [errorIndexes])
+
+  const marketPlaceInDSLIndex = useMemo(() => {
+    const res: number[] = []
+    allPlugins.forEach((d, index) => {
+      if (d.type === 'marketplace')
+        res.push(index)
+    })
+    return res
+  }, [allPlugins])
+
+  useEffect(() => {
+    if (!isFetchingMarketplaceDataById && infoGetById?.data.plugins) {
+      const payloads = infoGetById?.data.plugins
+      const failedIndex: number[] = []
+      const nextPlugins = produce(pluginsRef.current, (draft) => {
+        marketPlaceInDSLIndex.forEach((index, i) => {
+          if (payloads[i]) {
+            draft[index] = {
+              ...payloads[i],
+              version: payloads[i].version || payloads[i].latest_version,
+            }
+          }
+          else { failedIndex.push(index) }
+        })
+      })
+      setPlugins(nextPlugins)
+
+      if (failedIndex.length > 0)
+        setErrorIndexes([...errorIndexes, ...failedIndex])
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isFetchingMarketplaceDataById])
+
+  useEffect(() => {
+    if (!isFetchingDataByMeta && infoByMeta?.data.list) {
+      const payloads = infoByMeta?.data.list
+      const failedIndex: number[] = []
+      const nextPlugins = produce(pluginsRef.current, (draft) => {
+        marketPlaceInDSLIndex.forEach((index, i) => {
+          if (payloads[i]) {
+            const item = payloads[i]
+            draft[index] = {
+              ...item.plugin,
+              plugin_id: item.version.unique_identifier,
+            }
+          }
+          else {
+            failedIndex.push(index)
+          }
+        })
+      })
+      setPlugins(nextPlugins)
+      if (failedIndex.length > 0)
+        setErrorIndexes([...errorIndexes, ...failedIndex])
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isFetchingDataByMeta])
+
+  useEffect(() => {
+    // get info all failed
+    if (infoByMetaError || infoByIdError)
+      setErrorIndexes([...errorIndexes, ...marketPlaceInDSLIndex])
+
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [infoByMetaError, infoByIdError])
+
+  const isLoadedAllData = (plugins.filter(p => !!p).length + errorIndexes.length) === allPlugins.length
+
+  const { installedInfo } = useCheckInstalled({
+    pluginIds: plugins?.filter(p => !!p).map((d) => {
+      return `${d?.org || d?.author}/${d?.name}`
+    }) || [],
+    enabled: isLoadedAllData,
+  })
+
+  const getVersionInfo = useCallback((pluginId: string) => {
+    const pluginDetail = installedInfo?.[pluginId]
+    const hasInstalled = !!pluginDetail
+    return {
+      hasInstalled,
+      installedVersion: pluginDetail?.installedVersion,
+      toInstallVersion: '',
+    }
+  }, [installedInfo])
+
+  useEffect(() => {
+    if (isLoadedAllData && installedInfo)
+      onLoadedAllPlugin(installedInfo!)
+
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isLoadedAllData, installedInfo])
+
+  const handleSelect = useCallback((index: number) => {
+    return () => {
+      onSelect(plugins[index]!, index)
+    }
+  }, [onSelect, plugins])
+  return (
+    <>
+      {allPlugins.map((d, index) => {
+        if (errorIndexes.includes(index)) {
+          return (
+            <LoadingError key={index} />
+          )
+        }
+        const plugin = plugins[index]
+        if (d.type === 'github') {
+          return (<GithubItem
+            key={index}
+            checked={!!selectedPlugins.find(p => p.plugin_id === plugins[index]?.plugin_id)}
+            onCheckedChange={handleSelect(index)}
+            dependency={d as GitHubItemAndMarketPlaceDependency}
+            onFetchedPayload={handleGitHubPluginFetched(index)}
+            onFetchError={handleGitHubPluginFetchError(index)}
+            versionInfo={getVersionInfo(`${plugin?.org || plugin?.author}/${plugin?.name}`)}
+          />)
+        }
+
+        if (d.type === 'marketplace') {
+          return (
+            <MarketplaceItem
+              key={index}
+              checked={!!selectedPlugins.find(p => p.plugin_id === plugins[index]?.plugin_id)}
+              onCheckedChange={handleSelect(index)}
+              payload={plugin}
+              version={(d as GitHubItemAndMarketPlaceDependency).value.version! || plugin?.version || ''}
+              versionInfo={getVersionInfo(`${plugin?.org || plugin?.author}/${plugin?.name}`)}
+            />
+          )
+        }
+
+        // Local package
+        return (
+          <PackageItem
+            key={index}
+            checked={!!selectedPlugins.find(p => p.plugin_id === plugins[index]?.plugin_id)}
+            onCheckedChange={handleSelect(index)}
+            payload={d as PackageDependency}
+            isFromMarketPlace={isFromMarketPlace}
+            versionInfo={getVersionInfo(`${plugin?.org || plugin?.author}/${plugin?.name}`)}
+          />
+        )
+      })
+      }
+    </>
+  )
+}
+export default React.memo(InstallByDSLList)
diff --git a/app/components/plugins/install-plugin/install-bundle/steps/install.tsx b/app/components/plugins/install-plugin/install-bundle/steps/install.tsx
new file mode 100644
index 0000000..ee2699b
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-bundle/steps/install.tsx
@@ -0,0 +1,118 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import type { Dependency, InstallStatusResponse, Plugin, VersionInfo } from '../../../types'
+import Button from '@/app/components/base/button'
+import { RiLoader2Line } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import InstallMulti from './install-multi'
+import { useInstallOrUpdate } from '@/service/use-plugins'
+import useRefreshPluginList from '../../hooks/use-refresh-plugin-list'
+import { useCanInstallPluginFromMarketplace } from '@/app/components/plugins/plugin-page/use-permission'
+const i18nPrefix = 'plugin.installModal'
+
+type Props = {
+  allPlugins: Dependency[]
+  onStartToInstall?: () => void
+  onInstalled: (plugins: Plugin[], installStatus: InstallStatusResponse[]) => void
+  onCancel: () => void
+  isFromMarketPlace?: boolean
+  isHideButton?: boolean
+}
+
+const Install: FC<Props> = ({
+  allPlugins,
+  onStartToInstall,
+  onInstalled,
+  onCancel,
+  isFromMarketPlace,
+  isHideButton,
+}) => {
+  const { t } = useTranslation()
+  const [selectedPlugins, setSelectedPlugins] = React.useState<Plugin[]>([])
+  const [selectedIndexes, setSelectedIndexes] = React.useState<number[]>([])
+  const selectedPluginsNum = selectedPlugins.length
+  const { refreshPluginList } = useRefreshPluginList()
+  const handleSelect = (plugin: Plugin, selectedIndex: number) => {
+    const isSelected = !!selectedPlugins.find(p => p.plugin_id === plugin.plugin_id)
+    let nextSelectedPlugins
+    if (isSelected)
+      nextSelectedPlugins = selectedPlugins.filter(p => p.plugin_id !== plugin.plugin_id)
+    else
+      nextSelectedPlugins = [...selectedPlugins, plugin]
+    setSelectedPlugins(nextSelectedPlugins)
+    const nextSelectedIndexes = isSelected ? selectedIndexes.filter(i => i !== selectedIndex) : [...selectedIndexes, selectedIndex]
+    setSelectedIndexes(nextSelectedIndexes)
+  }
+
+  const [canInstall, setCanInstall] = React.useState(false)
+  const [installedInfo, setInstalledInfo] = useState<Record<string, VersionInfo> | undefined>(undefined)
+
+  const handleLoadedAllPlugin = useCallback((installedInfo: Record<string, VersionInfo> | undefined) => {
+    setInstalledInfo(installedInfo)
+    setCanInstall(true)
+  }, [])
+
+  // Install from marketplace and github
+  const { mutate: installOrUpdate, isPending: isInstalling } = useInstallOrUpdate({
+    onSuccess: (res: InstallStatusResponse[]) => {
+      onInstalled(selectedPlugins, res.map((r, i) => {
+        return ({
+          ...r,
+          isFromMarketPlace: allPlugins[selectedIndexes[i]].type === 'marketplace',
+        })
+      }))
+      const hasInstallSuccess = res.some(r => r.success)
+      if (hasInstallSuccess)
+        refreshPluginList(undefined, true)
+    },
+  })
+  const handleInstall = () => {
+    onStartToInstall?.()
+    installOrUpdate({
+      payload: allPlugins.filter((_d, index) => selectedIndexes.includes(index)),
+      plugin: selectedPlugins,
+      installedInfo: installedInfo!,
+    })
+  }
+  const { canInstallPluginFromMarketplace } = useCanInstallPluginFromMarketplace()
+  return (
+    <>
+      <div className='flex flex-col items-start justify-center gap-4 self-stretch px-6 py-3'>
+        <div className='system-md-regular text-text-secondary'>
+          <p>{t(`${i18nPrefix}.${selectedPluginsNum > 1 ? 'readyToInstallPackages' : 'readyToInstallPackage'}`, { num: selectedPluginsNum })}</p>
+        </div>
+        <div className='w-full space-y-1 rounded-2xl bg-background-section-burn p-2'>
+          <InstallMulti
+            allPlugins={allPlugins}
+            selectedPlugins={selectedPlugins}
+            onSelect={handleSelect}
+            onLoadedAllPlugin={handleLoadedAllPlugin}
+            isFromMarketPlace={isFromMarketPlace}
+          />
+        </div>
+      </div>
+      {/* Action Buttons */}
+      {!isHideButton && (
+        <div className='flex items-center justify-end gap-2 self-stretch p-6 pt-5'>
+          {!canInstall && (
+            <Button variant='secondary' className='min-w-[72px]' onClick={onCancel}>
+              {t('common.operation.cancel')}
+            </Button>
+          )}
+          <Button
+            variant='primary'
+            className='flex min-w-[72px] space-x-0.5'
+            disabled={!canInstall || isInstalling || selectedPlugins.length === 0 || !canInstallPluginFromMarketplace}
+            onClick={handleInstall}
+          >
+            {isInstalling && <RiLoader2Line className='h-4 w-4 animate-spin-slow' />}
+            <span>{t(`${i18nPrefix}.${isInstalling ? 'installing' : 'install'}`)}</span>
+          </Button>
+        </div>
+      )}
+
+    </>
+  )
+}
+export default React.memo(Install)
diff --git a/app/components/plugins/install-plugin/install-bundle/steps/installed.tsx b/app/components/plugins/install-plugin/install-bundle/steps/installed.tsx
new file mode 100644
index 0000000..4e16d20
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-bundle/steps/installed.tsx
@@ -0,0 +1,65 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { InstallStatusResponse, Plugin } from '../../../types'
+import Card from '@/app/components/plugins/card'
+import Button from '@/app/components/base/button'
+import { useTranslation } from 'react-i18next'
+import Badge, { BadgeState } from '@/app/components/base/badge/index'
+import useGetIcon from '../../base/use-get-icon'
+import { MARKETPLACE_API_PREFIX } from '@/config'
+
+type Props = {
+  list: Plugin[]
+  installStatus: InstallStatusResponse[]
+  onCancel: () => void
+  isHideButton?: boolean
+}
+
+const Installed: FC<Props> = ({
+  list,
+  installStatus,
+  onCancel,
+  isHideButton,
+}) => {
+  const { t } = useTranslation()
+  const { getIconUrl } = useGetIcon()
+  return (
+    <>
+      <div className='flex flex-col items-start justify-center gap-4 self-stretch px-6 py-3'>
+        {/* <p className='text-text-secondary system-md-regular'>{(isFailed && errMsg) ? errMsg : t(`plugin.installModal.${isFailed ? 'installFailedDesc' : 'installedSuccessfullyDesc'}`)}</p> */}
+        <div className='flex flex-wrap content-start items-start gap-1 space-y-1 self-stretch rounded-2xl bg-background-section-burn p-2'>
+          {list.map((plugin, index) => {
+            return (
+              <Card
+                key={plugin.plugin_id}
+                className='w-full'
+                payload={{
+                  ...plugin,
+                  icon: installStatus[index].isFromMarketPlace ? `${MARKETPLACE_API_PREFIX}/plugins/${plugin.org}/${plugin.name}/icon` : getIconUrl(plugin.icon),
+                }}
+                installed={installStatus[index].success}
+                installFailed={!installStatus[index].success}
+                titleLeft={plugin.version ? <Badge className='mx-1' size="s" state={BadgeState.Default}>{plugin.version}</Badge> : null}
+              />
+            )
+          })}
+        </div>
+      </div>
+      {/* Action Buttons */}
+      {!isHideButton && (
+        <div className='flex items-center justify-end gap-2 self-stretch p-6 pt-5'>
+          <Button
+            variant='primary'
+            className='min-w-[72px]'
+            onClick={onCancel}
+          >
+            {t('common.operation.close')}
+          </Button>
+        </div>
+      )}
+    </>
+  )
+}
+
+export default React.memo(Installed)
diff --git a/app/components/plugins/install-plugin/install-from-github/index.tsx b/app/components/plugins/install-plugin/install-from-github/index.tsx
new file mode 100644
index 0000000..ceb800d
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-from-github/index.tsx
@@ -0,0 +1,235 @@
+'use client'
+
+import React, { useCallback, useState } from 'react'
+import Modal from '@/app/components/base/modal'
+import type { Item } from '@/app/components/base/select'
+import type { InstallState } from '@/app/components/plugins/types'
+import { useGitHubReleases } from '../hooks'
+import { convertRepoToUrl, parseGitHubUrl } from '../utils'
+import type { PluginDeclaration, UpdateFromGitHubPayload } from '../../types'
+import { InstallStepFromGitHub } from '../../types'
+import Toast from '@/app/components/base/toast'
+import SetURL from './steps/setURL'
+import SelectPackage from './steps/selectPackage'
+import Installed from '../base/installed'
+import Loaded from './steps/loaded'
+import useGetIcon from '@/app/components/plugins/install-plugin/base/use-get-icon'
+import { useTranslation } from 'react-i18next'
+import useRefreshPluginList from '../hooks/use-refresh-plugin-list'
+import cn from '@/utils/classnames'
+import useHideLogic from '../hooks/use-hide-logic'
+
+const i18nPrefix = 'plugin.installFromGitHub'
+
+type InstallFromGitHubProps = {
+  updatePayload?: UpdateFromGitHubPayload
+  onClose: () => void
+  onSuccess: () => void
+}
+
+const InstallFromGitHub: React.FC<InstallFromGitHubProps> = ({ updatePayload, onClose, onSuccess }) => {
+  const { t } = useTranslation()
+  const { getIconUrl } = useGetIcon()
+  const { fetchReleases } = useGitHubReleases()
+  const { refreshPluginList } = useRefreshPluginList()
+
+  const {
+    modalClassName,
+    foldAnimInto,
+    setIsInstalling,
+    handleStartToInstall,
+  } = useHideLogic(onClose)
+
+  const [state, setState] = useState<InstallState>({
+    step: updatePayload ? InstallStepFromGitHub.selectPackage : InstallStepFromGitHub.setUrl,
+    repoUrl: updatePayload?.originalPackageInfo?.repo
+      ? convertRepoToUrl(updatePayload.originalPackageInfo.repo)
+      : '',
+    selectedVersion: '',
+    selectedPackage: '',
+    releases: updatePayload ? updatePayload.originalPackageInfo.releases : [],
+  })
+  const [uniqueIdentifier, setUniqueIdentifier] = useState<string | null>(null)
+  const [manifest, setManifest] = useState<PluginDeclaration | null>(null)
+  const [errorMsg, setErrorMsg] = useState<string | null>(null)
+
+  const versions: Item[] = state.releases.map(release => ({
+    value: release.tag_name,
+    name: release.tag_name,
+  }))
+
+  const packages: Item[] = state.selectedVersion
+    ? (state.releases
+      .find(release => release.tag_name === state.selectedVersion)
+      ?.assets
+      .map(asset => ({
+        value: asset.name,
+        name: asset.name,
+      })) || [])
+    : []
+
+  const getTitle = useCallback(() => {
+    if (state.step === InstallStepFromGitHub.installed)
+      return t(`${i18nPrefix}.installedSuccessfully`)
+    if (state.step === InstallStepFromGitHub.installFailed)
+      return t(`${i18nPrefix}.installFailed`)
+
+    return updatePayload ? t(`${i18nPrefix}.updatePlugin`) : t(`${i18nPrefix}.installPlugin`)
+  }, [state.step, t, updatePayload])
+
+  const handleUrlSubmit = async () => {
+    const { isValid, owner, repo } = parseGitHubUrl(state.repoUrl)
+    if (!isValid || !owner || !repo) {
+      Toast.notify({
+        type: 'error',
+        message: t('plugin.error.inValidGitHubUrl'),
+      })
+      return
+    }
+    try {
+      const fetchedReleases = await fetchReleases(owner, repo)
+      if (fetchedReleases.length > 0) {
+        setState(prevState => ({
+          ...prevState,
+          releases: fetchedReleases,
+          step: InstallStepFromGitHub.selectPackage,
+        }))
+      }
+      else {
+        Toast.notify({
+          type: 'error',
+          message: t('plugin.error.noReleasesFound'),
+        })
+      }
+    }
+    catch {
+      Toast.notify({
+        type: 'error',
+        message: t('plugin.error.fetchReleasesError'),
+      })
+    }
+  }
+
+  const handleError = (e: any, isInstall: boolean) => {
+    const message = e?.response?.message || t('plugin.installModal.installFailedDesc')
+    setErrorMsg(message)
+    setState(prevState => ({ ...prevState, step: isInstall ? InstallStepFromGitHub.installFailed : InstallStepFromGitHub.uploadFailed }))
+  }
+
+  const handleUploaded = async (GitHubPackage: any) => {
+    try {
+      const icon = await getIconUrl(GitHubPackage.manifest.icon)
+      setManifest({
+        ...GitHubPackage.manifest,
+        icon,
+      })
+      setUniqueIdentifier(GitHubPackage.uniqueIdentifier)
+      setState(prevState => ({ ...prevState, step: InstallStepFromGitHub.readyToInstall }))
+    }
+    catch (e) {
+      handleError(e, false)
+    }
+  }
+
+  const handleUploadFail = useCallback((errorMsg: string) => {
+    setErrorMsg(errorMsg)
+    setState(prevState => ({ ...prevState, step: InstallStepFromGitHub.uploadFailed }))
+  }, [])
+
+  const handleInstalled = useCallback((notRefresh?: boolean) => {
+    setState(prevState => ({ ...prevState, step: InstallStepFromGitHub.installed }))
+    if (!notRefresh)
+      refreshPluginList(manifest)
+    setIsInstalling(false)
+    onSuccess()
+  }, [manifest, onSuccess, refreshPluginList, setIsInstalling])
+
+  const handleFailed = useCallback((errorMsg?: string) => {
+    setState(prevState => ({ ...prevState, step: InstallStepFromGitHub.installFailed }))
+    setIsInstalling(false)
+    if (errorMsg)
+      setErrorMsg(errorMsg)
+  }, [setIsInstalling])
+
+  const handleBack = () => {
+    setState((prevState) => {
+      switch (prevState.step) {
+        case InstallStepFromGitHub.selectPackage:
+          return { ...prevState, step: InstallStepFromGitHub.setUrl }
+        case InstallStepFromGitHub.readyToInstall:
+          return { ...prevState, step: InstallStepFromGitHub.selectPackage }
+        default:
+          return prevState
+      }
+    })
+  }
+
+  return (
+    <Modal
+      isShow={true}
+      onClose={foldAnimInto}
+      className={cn(modalClassName, `shadows-shadow-xl flex min-w-[560px] flex-col items-start rounded-2xl border-[0.5px]
+        border-components-panel-border bg-components-panel-bg p-0`)}
+      closable
+    >
+      <div className='flex items-start gap-2 self-stretch pb-3 pl-6 pr-14 pt-6'>
+        <div className='flex grow flex-col items-start gap-1'>
+          <div className='title-2xl-semi-bold self-stretch text-text-primary'>
+            {getTitle()}
+          </div>
+          <div className='system-xs-regular self-stretch text-text-tertiary'>
+            {!([InstallStepFromGitHub.uploadFailed, InstallStepFromGitHub.installed, InstallStepFromGitHub.installFailed].includes(state.step)) && t('plugin.installFromGitHub.installNote')}
+          </div>
+        </div>
+      </div>
+      {([InstallStepFromGitHub.uploadFailed, InstallStepFromGitHub.installed, InstallStepFromGitHub.installFailed].includes(state.step))
+        ? <Installed
+          payload={manifest}
+          isFailed={[InstallStepFromGitHub.uploadFailed, InstallStepFromGitHub.installFailed].includes(state.step)}
+          errMsg={errorMsg}
+          onCancel={onClose}
+        />
+        : <div className={`flex flex-col items-start justify-center self-stretch px-6 py-3 ${state.step === InstallStepFromGitHub.installed ? 'gap-2' : 'gap-4'}`}>
+          {state.step === InstallStepFromGitHub.setUrl && (
+            <SetURL
+              repoUrl={state.repoUrl}
+              onChange={value => setState(prevState => ({ ...prevState, repoUrl: value }))}
+              onNext={handleUrlSubmit}
+              onCancel={onClose}
+            />
+          )}
+          {state.step === InstallStepFromGitHub.selectPackage && (
+            <SelectPackage
+              updatePayload={updatePayload!}
+              repoUrl={state.repoUrl}
+              selectedVersion={state.selectedVersion}
+              versions={versions}
+              onSelectVersion={item => setState(prevState => ({ ...prevState, selectedVersion: item.value as string }))}
+              selectedPackage={state.selectedPackage}
+              packages={packages}
+              onSelectPackage={item => setState(prevState => ({ ...prevState, selectedPackage: item.value as string }))}
+              onUploaded={handleUploaded}
+              onFailed={handleUploadFail}
+              onBack={handleBack}
+            />
+          )}
+          {state.step === InstallStepFromGitHub.readyToInstall && (
+            <Loaded
+              updatePayload={updatePayload!}
+              uniqueIdentifier={uniqueIdentifier!}
+              payload={manifest as any}
+              repoUrl={state.repoUrl}
+              selectedVersion={state.selectedVersion}
+              selectedPackage={state.selectedPackage}
+              onBack={handleBack}
+              onStartToInstall={handleStartToInstall}
+              onInstalled={handleInstalled}
+              onFailed={handleFailed}
+            />
+          )}
+        </div>}
+    </Modal>
+  )
+}
+
+export default InstallFromGitHub
diff --git a/app/components/plugins/install-plugin/install-from-github/steps/loaded.tsx b/app/components/plugins/install-plugin/install-from-github/steps/loaded.tsx
new file mode 100644
index 0000000..0764f03
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-from-github/steps/loaded.tsx
@@ -0,0 +1,180 @@
+'use client'
+
+import React, { useEffect } from 'react'
+import Button from '@/app/components/base/button'
+import { type Plugin, type PluginDeclaration, TaskStatus, type UpdateFromGitHubPayload } from '../../../types'
+import Card from '../../../card'
+import { pluginManifestToCardPluginProps } from '../../utils'
+import { useTranslation } from 'react-i18next'
+import { updateFromGitHub } from '@/service/plugins'
+import { useInstallPackageFromGitHub } from '@/service/use-plugins'
+import { RiLoader2Line } from '@remixicon/react'
+import { usePluginTaskList } from '@/service/use-plugins'
+import checkTaskStatus from '../../base/check-task-status'
+import useCheckInstalled from '@/app/components/plugins/install-plugin/hooks/use-check-installed'
+import { parseGitHubUrl } from '../../utils'
+import Version from '../../base/version'
+
+type LoadedProps = {
+  updatePayload: UpdateFromGitHubPayload
+  uniqueIdentifier: string
+  payload: PluginDeclaration | Plugin
+  repoUrl: string
+  selectedVersion: string
+  selectedPackage: string
+  onBack: () => void
+  onStartToInstall?: () => void
+  onInstalled: (notRefresh?: boolean) => void
+  onFailed: (message?: string) => void
+}
+
+const i18nPrefix = 'plugin.installModal'
+
+const Loaded: React.FC<LoadedProps> = ({
+  updatePayload,
+  uniqueIdentifier,
+  payload,
+  repoUrl,
+  selectedVersion,
+  selectedPackage,
+  onBack,
+  onStartToInstall,
+  onInstalled,
+  onFailed,
+}) => {
+  const { t } = useTranslation()
+  const toInstallVersion = payload.version
+  const pluginId = (payload as Plugin).plugin_id
+  const { installedInfo, isLoading } = useCheckInstalled({
+    pluginIds: [pluginId],
+    enabled: !!pluginId,
+  })
+  const installedInfoPayload = installedInfo?.[pluginId]
+  const installedVersion = installedInfoPayload?.installedVersion
+  const hasInstalled = !!installedVersion
+
+  const [isInstalling, setIsInstalling] = React.useState(false)
+  const { mutateAsync: installPackageFromGitHub } = useInstallPackageFromGitHub()
+  const { handleRefetch } = usePluginTaskList(payload.category)
+  const { check } = checkTaskStatus()
+
+  useEffect(() => {
+    if (hasInstalled && uniqueIdentifier === installedInfoPayload.uniqueIdentifier)
+      onInstalled()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [hasInstalled])
+
+  const handleInstall = async () => {
+    if (isInstalling) return
+    setIsInstalling(true)
+    onStartToInstall?.()
+
+    try {
+      const { owner, repo } = parseGitHubUrl(repoUrl)
+      let taskId
+      let isInstalled
+      if (updatePayload) {
+        const { all_installed, task_id } = await updateFromGitHub(
+          `${owner}/${repo}`,
+          selectedVersion,
+          selectedPackage,
+          updatePayload.originalPackageInfo.id,
+          uniqueIdentifier,
+        )
+
+        taskId = task_id
+        isInstalled = all_installed
+      }
+      else {
+        if (hasInstalled) {
+          const {
+            all_installed,
+            task_id,
+          } = await updateFromGitHub(
+            `${owner}/${repo}`,
+            selectedVersion,
+            selectedPackage,
+            installedInfoPayload.uniqueIdentifier,
+            uniqueIdentifier,
+          )
+          taskId = task_id
+          isInstalled = all_installed
+        }
+        else {
+          const { all_installed, task_id } = await installPackageFromGitHub({
+            repoUrl: `${owner}/${repo}`,
+            selectedVersion,
+            selectedPackage,
+            uniqueIdentifier,
+          })
+
+          taskId = task_id
+          isInstalled = all_installed
+        }
+      }
+      if (isInstalled) {
+        onInstalled()
+        return
+      }
+
+      handleRefetch()
+
+      const { status, error } = await check({
+        taskId,
+        pluginUniqueIdentifier: uniqueIdentifier,
+      })
+      if (status === TaskStatus.failed) {
+        onFailed(error)
+        return
+      }
+      onInstalled(true)
+    }
+    catch (e) {
+      if (typeof e === 'string') {
+        onFailed(e)
+        return
+      }
+      onFailed()
+    }
+    finally {
+      setIsInstalling(false)
+    }
+  }
+
+  return (
+    <>
+      <div className='system-md-regular text-text-secondary'>
+        <p>{t(`${i18nPrefix}.readyToInstall`)}</p>
+      </div>
+      <div className='flex flex-wrap content-start items-start gap-1 self-stretch rounded-2xl bg-background-section-burn p-2'>
+        <Card
+          className='w-full'
+          payload={pluginManifestToCardPluginProps(payload as PluginDeclaration)}
+          titleLeft={!isLoading && <Version
+            hasInstalled={hasInstalled}
+            installedVersion={installedVersion}
+            toInstallVersion={toInstallVersion}
+          />}
+        />
+      </div>
+      <div className='mt-4 flex items-center justify-end gap-2 self-stretch'>
+        {!isInstalling && (
+          <Button variant='secondary' className='min-w-[72px]' onClick={onBack}>
+            {t('plugin.installModal.back')}
+          </Button>
+        )}
+        <Button
+          variant='primary'
+          className='flex min-w-[72px] space-x-0.5'
+          onClick={handleInstall}
+          disabled={isInstalling || isLoading}
+        >
+          {isInstalling && <RiLoader2Line className='h-4 w-4 animate-spin-slow' />}
+          <span>{t(`${i18nPrefix}.${isInstalling ? 'installing' : 'install'}`)}</span>
+        </Button>
+      </div>
+    </>
+  )
+}
+
+export default Loaded
diff --git a/app/components/plugins/install-plugin/install-from-github/steps/selectPackage.tsx b/app/components/plugins/install-plugin/install-from-github/steps/selectPackage.tsx
new file mode 100644
index 0000000..24e1e39
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-from-github/steps/selectPackage.tsx
@@ -0,0 +1,125 @@
+'use client'
+
+import React from 'react'
+import type { Item } from '@/app/components/base/select'
+import { PortalSelect } from '@/app/components/base/select'
+import Button from '@/app/components/base/button'
+import type { PluginDeclaration, UpdateFromGitHubPayload } from '../../../types'
+import { useTranslation } from 'react-i18next'
+import { useGitHubUpload } from '../../hooks'
+
+const i18nPrefix = 'plugin.installFromGitHub'
+
+type SelectPackageProps = {
+  updatePayload: UpdateFromGitHubPayload
+  repoUrl: string
+  selectedVersion: string
+  versions: Item[]
+  onSelectVersion: (item: Item) => void
+  selectedPackage: string
+  packages: Item[]
+  onSelectPackage: (item: Item) => void
+  onUploaded: (result: {
+    uniqueIdentifier: string
+    manifest: PluginDeclaration
+  }) => void
+  onFailed: (errorMsg: string) => void
+  onBack: () => void
+}
+
+const SelectPackage: React.FC<SelectPackageProps> = ({
+  updatePayload,
+  repoUrl,
+  selectedVersion,
+  versions,
+  onSelectVersion,
+  selectedPackage,
+  packages,
+  onSelectPackage,
+  onUploaded,
+  onFailed,
+  onBack,
+}) => {
+  const { t } = useTranslation()
+  const isEdit = Boolean(updatePayload)
+  const [isUploading, setIsUploading] = React.useState(false)
+  const { handleUpload } = useGitHubUpload()
+
+  const handleUploadPackage = async () => {
+    if (isUploading) return
+    setIsUploading(true)
+    try {
+      const repo = repoUrl.replace('https://github.com/', '')
+      await handleUpload(repo, selectedVersion, selectedPackage, (GitHubPackage) => {
+        onUploaded({
+          uniqueIdentifier: GitHubPackage.unique_identifier,
+          manifest: GitHubPackage.manifest,
+        })
+      })
+    }
+    catch (e: any) {
+      if (e.response?.message)
+        onFailed(e.response?.message)
+      else
+        onFailed(t(`${i18nPrefix}.uploadFailed`))
+    }
+    finally {
+      setIsUploading(false)
+    }
+  }
+
+  return (
+    <>
+      <label
+        htmlFor='version'
+        className='flex flex-col items-start justify-center self-stretch text-text-secondary'
+      >
+        <span className='system-sm-semibold'>{t(`${i18nPrefix}.selectVersion`)}</span>
+      </label>
+      <PortalSelect
+        value={selectedVersion}
+        onSelect={onSelectVersion}
+        items={versions}
+        installedValue={updatePayload?.originalPackageInfo.version}
+        placeholder={t(`${i18nPrefix}.selectVersionPlaceholder`) || ''}
+        popupClassName='w-[512px] z-[1001]'
+      />
+      <label
+        htmlFor='package'
+        className='flex flex-col items-start justify-center self-stretch text-text-secondary'
+      >
+        <span className='system-sm-semibold'>{t(`${i18nPrefix}.selectPackage`)}</span>
+      </label>
+      <PortalSelect
+        value={selectedPackage}
+        onSelect={onSelectPackage}
+        items={packages}
+        readonly={!selectedVersion}
+        placeholder={t(`${i18nPrefix}.selectPackagePlaceholder`) || ''}
+        popupClassName='w-[512px] z-[1001]'
+      />
+      <div className='mt-4 flex items-center justify-end gap-2 self-stretch'>
+        {!isEdit
+          && <Button
+            variant='secondary'
+            className='min-w-[72px]'
+            onClick={onBack}
+            disabled={isUploading}
+          >
+            {t('plugin.installModal.back')}
+          </Button>
+        }
+        <Button
+          variant='primary'
+          className='min-w-[72px]'
+          onClick={handleUploadPackage}
+          disabled={!selectedVersion || !selectedPackage || isUploading}
+        >
+          {t('plugin.installModal.next')}
+        </Button>
+      </div>
+    </>
+  )
+}
+
+export default SelectPackage
diff --git a/app/components/plugins/install-plugin/install-from-github/steps/setURL.tsx b/app/components/plugins/install-plugin/install-from-github/steps/setURL.tsx
new file mode 100644
index 0000000..be8ac67
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-from-github/steps/setURL.tsx
@@ -0,0 +1,56 @@
+'use client'
+
+import React from 'react'
+import Button from '@/app/components/base/button'
+import { useTranslation } from 'react-i18next'
+
+type SetURLProps = {
+  repoUrl: string
+  onChange: (value: string) => void
+  onNext: () => void
+  onCancel: () => void
+}
+
+const SetURL: React.FC<SetURLProps> = ({ repoUrl, onChange, onNext, onCancel }) => {
+  const { t } = useTranslation()
+  return (
+    <>
+      <label
+        htmlFor='repoUrl'
+        className='flex flex-col items-start justify-center self-stretch text-text-secondary'
+      >
+        <span className='system-sm-semibold'>{t('plugin.installFromGitHub.gitHubRepo')}</span>
+      </label>
+      <input
+        type='url'
+        id='repoUrl'
+        name='repoUrl'
+        value={repoUrl}
+        onChange={e => onChange(e.target.value)}
+        className='shadows-shadow-xs system-sm-regular flex grow items-center gap-[2px]
+          self-stretch overflow-hidden text-ellipsis rounded-lg border border-components-input-border-active
+          bg-components-input-bg-active p-2 text-components-input-text-filled'
+        placeholder='Please enter GitHub repo URL'
+      />
+      <div className='mt-4 flex items-center justify-end gap-2 self-stretch'>
+        <Button
+          variant='secondary'
+          className='min-w-[72px]'
+          onClick={onCancel}
+        >
+          {t('plugin.installModal.cancel')}
+        </Button>
+        <Button
+          variant='primary'
+          className='min-w-[72px]'
+          onClick={onNext}
+          disabled={!repoUrl.trim()}
+        >
+          {t('plugin.installModal.next')}
+        </Button>
+      </div>
+    </>
+  )
+}
+
+export default SetURL
diff --git a/app/components/plugins/install-plugin/install-from-local-package/index.tsx b/app/components/plugins/install-plugin/install-from-local-package/index.tsx
new file mode 100644
index 0000000..e8e6cf8
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-from-local-package/index.tsx
@@ -0,0 +1,133 @@
+'use client'
+
+import React, { useCallback, useState } from 'react'
+import Modal from '@/app/components/base/modal'
+import type { Dependency, PluginDeclaration } from '../../types'
+import { InstallStep } from '../../types'
+import Uploading from './steps/uploading'
+import { useTranslation } from 'react-i18next'
+import useGetIcon from '@/app/components/plugins/install-plugin/base/use-get-icon'
+import ReadyToInstallPackage from './ready-to-install'
+import ReadyToInstallBundle from '../install-bundle/ready-to-install'
+import useHideLogic from '../hooks/use-hide-logic'
+import cn from '@/utils/classnames'
+
+const i18nPrefix = 'plugin.installModal'
+
+type InstallFromLocalPackageProps = {
+  file: File
+  onSuccess: () => void
+  onClose: () => void
+}
+
+const InstallFromLocalPackage: React.FC<InstallFromLocalPackageProps> = ({
+  file,
+  onClose,
+}) => {
+  const { t } = useTranslation()
+  // uploading -> !uploadFailed -> readyToInstall -> installed/failed
+  const [step, setStep] = useState<InstallStep>(InstallStep.uploading)
+  const [uniqueIdentifier, setUniqueIdentifier] = useState<string | null>(null)
+  const [manifest, setManifest] = useState<PluginDeclaration | null>(null)
+  const [errorMsg, setErrorMsg] = useState<string | null>(null)
+  const isBundle = file.name.endsWith('.difybndl')
+  const [dependencies, setDependencies] = useState<Dependency[]>([])
+
+  const {
+    modalClassName,
+    foldAnimInto,
+    setIsInstalling,
+    handleStartToInstall,
+  } = useHideLogic(onClose)
+
+  const getTitle = useCallback(() => {
+    if (step === InstallStep.uploadFailed)
+      return t(`${i18nPrefix}.uploadFailed`)
+    if (isBundle && step === InstallStep.installed)
+      return t(`${i18nPrefix}.installComplete`)
+    if (step === InstallStep.installed)
+      return t(`${i18nPrefix}.installedSuccessfully`)
+    if (step === InstallStep.installFailed)
+      return t(`${i18nPrefix}.installFailed`)
+
+    return t(`${i18nPrefix}.installPlugin`)
+  }, [isBundle, step, t])
+
+  const { getIconUrl } = useGetIcon()
+
+  const handlePackageUploaded = useCallback(async (result: {
+    uniqueIdentifier: string
+    manifest: PluginDeclaration
+  }) => {
+    const {
+      manifest,
+      uniqueIdentifier,
+    } = result
+    const icon = await getIconUrl(manifest!.icon)
+    setUniqueIdentifier(uniqueIdentifier)
+    setManifest({
+      ...manifest,
+      icon,
+    })
+    setStep(InstallStep.readyToInstall)
+  }, [getIconUrl])
+
+  const handleBundleUploaded = useCallback((result: Dependency[]) => {
+    setDependencies(result)
+    setStep(InstallStep.readyToInstall)
+  }, [])
+
+  const handleUploadFail = useCallback((errorMsg: string) => {
+    setErrorMsg(errorMsg)
+    setStep(InstallStep.uploadFailed)
+  }, [])
+
+  return (
+    <Modal
+      isShow={true}
+      onClose={foldAnimInto}
+      className={cn(modalClassName, 'shadows-shadow-xl flex min-w-[560px] flex-col items-start rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg p-0')}
+      closable
+    >
+      <div className='flex items-start gap-2 self-stretch pb-3 pl-6 pr-14 pt-6'>
+        <div className='title-2xl-semi-bold self-stretch text-text-primary'>
+          {getTitle()}
+        </div>
+      </div>
+      {step === InstallStep.uploading && (
+        <Uploading
+          isBundle={isBundle}
+          file={file}
+          onCancel={onClose}
+          onPackageUploaded={handlePackageUploaded}
+          onBundleUploaded={handleBundleUploaded}
+          onFailed={handleUploadFail}
+        />
+      )}
+      {isBundle ? (
+        <ReadyToInstallBundle
+          step={step}
+          onStepChange={setStep}
+          onStartToInstall={handleStartToInstall}
+          setIsInstalling={setIsInstalling}
+          onClose={onClose}
+          allPlugins={dependencies}
+        />
+      ) : (
+        <ReadyToInstallPackage
+          step={step}
+          onStepChange={setStep}
+          onStartToInstall={handleStartToInstall}
+          setIsInstalling={setIsInstalling}
+          onClose={onClose}
+          uniqueIdentifier={uniqueIdentifier}
+          manifest={manifest}
+          errorMsg={errorMsg}
+          onError={setErrorMsg}
+        />
+      )}
+    </Modal>
+  )
+}
+
+export default InstallFromLocalPackage
diff --git a/app/components/plugins/install-plugin/install-from-local-package/ready-to-install.tsx b/app/components/plugins/install-plugin/install-from-local-package/ready-to-install.tsx
new file mode 100644
index 0000000..f85cde1
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-from-local-package/ready-to-install.tsx
@@ -0,0 +1,76 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import type { PluginDeclaration } from '../../types'
+import { InstallStep } from '../../types'
+import Install from './steps/install'
+import Installed from '../base/installed'
+import useRefreshPluginList from '../hooks/use-refresh-plugin-list'
+
+type Props = {
+  step: InstallStep
+  onStepChange: (step: InstallStep) => void,
+  onStartToInstall: () => void
+  setIsInstalling: (isInstalling: boolean) => void
+  onClose: () => void
+  uniqueIdentifier: string | null,
+  manifest: PluginDeclaration | null,
+  errorMsg: string | null,
+  onError: (errorMsg: string) => void,
+}
+
+const ReadyToInstall: FC<Props> = ({
+  step,
+  onStepChange,
+  onStartToInstall,
+  setIsInstalling,
+  onClose,
+  uniqueIdentifier,
+  manifest,
+  errorMsg,
+  onError,
+}) => {
+  const { refreshPluginList } = useRefreshPluginList()
+
+  const handleInstalled = useCallback((notRefresh?: boolean) => {
+    onStepChange(InstallStep.installed)
+    if (!notRefresh)
+      refreshPluginList(manifest)
+    setIsInstalling(false)
+  }, [manifest, onStepChange, refreshPluginList, setIsInstalling])
+
+  const handleFailed = useCallback((errorMsg?: string) => {
+    onStepChange(InstallStep.installFailed)
+    setIsInstalling(false)
+    if (errorMsg)
+      onError(errorMsg)
+  }, [onError, onStepChange, setIsInstalling])
+
+  return (
+    <>
+      {
+        step === InstallStep.readyToInstall && (
+          <Install
+            uniqueIdentifier={uniqueIdentifier!}
+            payload={manifest!}
+            onCancel={onClose}
+            onInstalled={handleInstalled}
+            onFailed={handleFailed}
+            onStartToInstall={onStartToInstall}
+          />
+        )
+      }
+      {
+        ([InstallStep.uploadFailed, InstallStep.installed, InstallStep.installFailed].includes(step)) && (
+          <Installed
+            payload={manifest}
+            isFailed={[InstallStep.uploadFailed, InstallStep.installFailed].includes(step)}
+            errMsg={errorMsg}
+            onCancel={onClose}
+          />
+        )
+      }
+    </>
+  )
+}
+export default React.memo(ReadyToInstall)
diff --git a/app/components/plugins/install-plugin/install-from-local-package/steps/install.tsx b/app/components/plugins/install-plugin/install-from-local-package/steps/install.tsx
new file mode 100644
index 0000000..4125172
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-from-local-package/steps/install.tsx
@@ -0,0 +1,164 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useMemo } from 'react'
+import { type PluginDeclaration, TaskStatus } from '../../../types'
+import Card from '../../../card'
+import { pluginManifestToCardPluginProps } from '../../utils'
+import Button from '@/app/components/base/button'
+import { Trans, useTranslation } from 'react-i18next'
+import { RiLoader2Line } from '@remixicon/react'
+import checkTaskStatus from '../../base/check-task-status'
+import { useInstallPackageFromLocal, usePluginTaskList } from '@/service/use-plugins'
+import useCheckInstalled from '@/app/components/plugins/install-plugin/hooks/use-check-installed'
+import { uninstallPlugin } from '@/service/plugins'
+import Version from '../../base/version'
+import { useAppContext } from '@/context/app-context'
+import { gte } from 'semver'
+
+const i18nPrefix = 'plugin.installModal'
+
+type Props = {
+  uniqueIdentifier: string
+  payload: PluginDeclaration
+  onCancel: () => void
+  onStartToInstall?: () => void
+  onInstalled: (notRefresh?: boolean) => void
+  onFailed: (message?: string) => void
+}
+
+const Installed: FC<Props> = ({
+  uniqueIdentifier,
+  payload,
+  onCancel,
+  onStartToInstall,
+  onInstalled,
+  onFailed,
+}) => {
+  const { t } = useTranslation()
+  const toInstallVersion = payload.version
+  const pluginId = `${payload.author}/${payload.name}`
+  const { installedInfo, isLoading } = useCheckInstalled({
+    pluginIds: [pluginId],
+    enabled: !!pluginId,
+  })
+  const installedInfoPayload = installedInfo?.[pluginId]
+  const installedVersion = installedInfoPayload?.installedVersion
+  const hasInstalled = !!installedVersion
+
+  useEffect(() => {
+    if (hasInstalled && uniqueIdentifier === installedInfoPayload.uniqueIdentifier)
+      onInstalled()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [hasInstalled])
+
+  const [isInstalling, setIsInstalling] = React.useState(false)
+  const { mutateAsync: installPackageFromLocal } = useInstallPackageFromLocal()
+
+  const {
+    check,
+    stop,
+  } = checkTaskStatus()
+
+  const handleCancel = () => {
+    stop()
+    onCancel()
+  }
+
+  const { handleRefetch } = usePluginTaskList(payload.category)
+  const handleInstall = async () => {
+    if (isInstalling) return
+    setIsInstalling(true)
+    onStartToInstall?.()
+
+    try {
+      if (hasInstalled)
+        await uninstallPlugin(installedInfoPayload.installedId)
+
+      const {
+        all_installed,
+        task_id,
+      } = await installPackageFromLocal(uniqueIdentifier)
+      const taskId = task_id
+      const isInstalled = all_installed
+
+      if (isInstalled) {
+        onInstalled()
+        return
+      }
+      handleRefetch()
+      const { status, error } = await check({
+        taskId,
+        pluginUniqueIdentifier: uniqueIdentifier,
+      })
+      if (status === TaskStatus.failed) {
+        onFailed(error)
+        return
+      }
+      onInstalled(true)
+    }
+    catch (e) {
+      if (typeof e === 'string') {
+        onFailed(e)
+        return
+      }
+      onFailed()
+    }
+  }
+
+  const { langeniusVersionInfo } = useAppContext()
+  const isDifyVersionCompatible = useMemo(() => {
+    if (!langeniusVersionInfo.current_version)
+      return true
+    return gte(langeniusVersionInfo.current_version, payload.meta.minimum_dify_version ?? '0.0.0')
+  }, [langeniusVersionInfo.current_version, payload.meta.minimum_dify_version])
+
+  return (
+    <>
+      <div className='flex flex-col items-start justify-center gap-4 self-stretch px-6 py-3'>
+        <div className='system-md-regular text-text-secondary'>
+          <p>{t(`${i18nPrefix}.readyToInstall`)}</p>
+          <p>
+            <Trans
+              i18nKey={`${i18nPrefix}.fromTrustSource`}
+              components={{ trustSource: <span className='system-md-semibold' /> }}
+            />
+          </p>
+          {!isDifyVersionCompatible && (
+            <p className='system-md-regular flex items-center gap-1 text-text-secondary text-text-warning'>
+              {t('plugin.difyVersionNotCompatible', { minimalDifyVersion: payload.meta.minimum_dify_version })}
+            </p>
+          )}
+        </div>
+        <div className='flex flex-wrap content-start items-start gap-1 self-stretch rounded-2xl bg-background-section-burn p-2'>
+          <Card
+            className='w-full'
+            payload={pluginManifestToCardPluginProps(payload)}
+            titleLeft={!isLoading && <Version
+              hasInstalled={hasInstalled}
+              installedVersion={installedVersion}
+              toInstallVersion={toInstallVersion}
+            />}
+          />
+        </div>
+      </div>
+      {/* Action Buttons */}
+      <div className='flex items-center justify-end gap-2 self-stretch p-6 pt-5'>
+        {!isInstalling && (
+          <Button variant='secondary' className='min-w-[72px]' onClick={handleCancel}>
+            {t('common.operation.cancel')}
+          </Button>
+        )}
+        <Button
+          variant='primary'
+          className='flex min-w-[72px] space-x-0.5'
+          disabled={isInstalling || isLoading}
+          onClick={handleInstall}
+        >
+          {isInstalling && <RiLoader2Line className='h-4 w-4 animate-spin-slow' />}
+          <span>{t(`${i18nPrefix}.${isInstalling ? 'installing' : 'install'}`)}</span>
+        </Button>
+      </div>
+    </>
+  )
+}
+export default React.memo(Installed)
diff --git a/app/components/plugins/install-plugin/install-from-local-package/steps/uploading.tsx b/app/components/plugins/install-plugin/install-from-local-package/steps/uploading.tsx
new file mode 100644
index 0000000..5b1c478
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-from-local-package/steps/uploading.tsx
@@ -0,0 +1,99 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { RiLoader2Line } from '@remixicon/react'
+import Card from '../../../card'
+import type { Dependency, PluginDeclaration } from '../../../types'
+import Button from '@/app/components/base/button'
+import { useTranslation } from 'react-i18next'
+import { uploadFile } from '@/service/plugins'
+const i18nPrefix = 'plugin.installModal'
+
+type Props = {
+  isBundle: boolean
+  file: File
+  onCancel: () => void
+  onPackageUploaded: (result: {
+    uniqueIdentifier: string
+    manifest: PluginDeclaration
+  }) => void
+  onBundleUploaded: (result: Dependency[]) => void
+  onFailed: (errorMsg: string) => void
+}
+
+const Uploading: FC<Props> = ({
+  isBundle,
+  file,
+  onCancel,
+  onPackageUploaded,
+  onBundleUploaded,
+  onFailed,
+}) => {
+  const { t } = useTranslation()
+  const fileName = file.name
+  const handleUpload = async () => {
+    try {
+      await uploadFile(file, isBundle)
+    }
+    catch (e: any) {
+      if (e.response?.message) {
+        onFailed(e.response?.message)
+      }
+      else { // Why it would into this branch?
+        const res = e.response
+        if (isBundle) {
+          onBundleUploaded(res)
+          return
+        }
+        onPackageUploaded({
+          uniqueIdentifier: res.unique_identifier,
+          manifest: res.manifest,
+        })
+      }
+    }
+  }
+
+  React.useEffect(() => {
+    handleUpload()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+  return (
+    <>
+      <div className='flex flex-col items-start justify-center gap-4 self-stretch px-6 py-3'>
+        <div className='flex items-center gap-1 self-stretch'>
+          <RiLoader2Line className='h-4 w-4 animate-spin-slow text-text-accent' />
+          <div className='system-md-regular text-text-secondary'>
+            {t(`${i18nPrefix}.uploadingPackage`, {
+              packageName: fileName,
+            })}
+          </div>
+        </div>
+        <div className='flex flex-wrap content-start items-start gap-1 self-stretch rounded-2xl bg-background-section-burn p-2'>
+          <Card
+            className='w-full'
+            payload={{ name: fileName } as any}
+            isLoading
+            loadingFileName={fileName}
+            installed={false}
+          />
+        </div>
+      </div>
+
+      {/* Action Buttons */}
+      <div className='flex items-center justify-end gap-2 self-stretch p-6 pt-5'>
+        <Button variant='secondary' className='min-w-[72px]' onClick={onCancel}>
+          {t('common.operation.cancel')}
+        </Button>
+        <Button
+          variant='primary'
+          className='min-w-[72px]'
+          disabled
+        >
+          {t(`${i18nPrefix}.install`)}
+        </Button>
+      </div>
+    </>
+  )
+}
+
+export default React.memo(Uploading)
diff --git a/app/components/plugins/install-plugin/install-from-marketplace/index.tsx b/app/components/plugins/install-plugin/install-from-marketplace/index.tsx
new file mode 100644
index 0000000..f41cd61
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-from-marketplace/index.tsx
@@ -0,0 +1,125 @@
+'use client'
+
+import React, { useCallback, useState } from 'react'
+import Modal from '@/app/components/base/modal'
+import type { Dependency, Plugin, PluginManifestInMarket } from '../../types'
+import { InstallStep } from '../../types'
+import Install from './steps/install'
+import Installed from '../base/installed'
+import { useTranslation } from 'react-i18next'
+import useRefreshPluginList from '../hooks/use-refresh-plugin-list'
+import ReadyToInstallBundle from '../install-bundle/ready-to-install'
+import cn from '@/utils/classnames'
+import useHideLogic from '../hooks/use-hide-logic'
+
+const i18nPrefix = 'plugin.installModal'
+
+type InstallFromMarketplaceProps = {
+  uniqueIdentifier: string
+  manifest: PluginManifestInMarket | Plugin
+  isBundle?: boolean
+  dependencies?: Dependency[]
+  onSuccess: () => void
+  onClose: () => void
+}
+
+const InstallFromMarketplace: React.FC<InstallFromMarketplaceProps> = ({
+  uniqueIdentifier,
+  manifest,
+  isBundle,
+  dependencies,
+  onSuccess,
+  onClose,
+}) => {
+  const { t } = useTranslation()
+  // readyToInstall -> check installed -> installed/failed
+  const [step, setStep] = useState<InstallStep>(InstallStep.readyToInstall)
+  const [errorMsg, setErrorMsg] = useState<string | null>(null)
+  const { refreshPluginList } = useRefreshPluginList()
+
+  const {
+    modalClassName,
+    foldAnimInto,
+    setIsInstalling,
+    handleStartToInstall,
+  } = useHideLogic(onClose)
+
+  const getTitle = useCallback(() => {
+    if (isBundle && step === InstallStep.installed)
+      return t(`${i18nPrefix}.installComplete`)
+    if (step === InstallStep.installed)
+      return t(`${i18nPrefix}.installedSuccessfully`)
+    if (step === InstallStep.installFailed)
+      return t(`${i18nPrefix}.installFailed`)
+    return t(`${i18nPrefix}.installPlugin`)
+  }, [isBundle, step, t])
+
+  const handleInstalled = useCallback((notRefresh?: boolean) => {
+    setStep(InstallStep.installed)
+    if (!notRefresh)
+      refreshPluginList(manifest)
+    setIsInstalling(false)
+  }, [manifest, refreshPluginList, setIsInstalling])
+
+  const handleFailed = useCallback((errorMsg?: string) => {
+    setStep(InstallStep.installFailed)
+    setIsInstalling(false)
+    if (errorMsg)
+      setErrorMsg(errorMsg)
+  }, [setIsInstalling])
+
+  return (
+    <Modal
+      isShow={true}
+      onClose={foldAnimInto}
+      wrapperClassName='z-[9999]'
+      className={cn(modalClassName, 'shadows-shadow-xl flex min-w-[560px] flex-col items-start rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg p-0')}
+      closable
+    >
+      <div className='flex items-start gap-2 self-stretch pb-3 pl-6 pr-14 pt-6'>
+        <div className='title-2xl-semi-bold self-stretch text-text-primary'>
+          {getTitle()}
+        </div>
+      </div>
+      {
+        isBundle ? (
+          <ReadyToInstallBundle
+            step={step}
+            onStepChange={setStep}
+            onStartToInstall={handleStartToInstall}
+            setIsInstalling={setIsInstalling}
+            onClose={onClose}
+            allPlugins={dependencies!}
+            isFromMarketPlace
+          />
+        ) : (<>
+          {
+            step === InstallStep.readyToInstall && (
+              <Install
+                uniqueIdentifier={uniqueIdentifier}
+                payload={manifest!}
+                onCancel={onClose}
+                onInstalled={handleInstalled}
+                onFailed={handleFailed}
+                onStartToInstall={handleStartToInstall}
+              />
+            )}
+          {
+            [InstallStep.installed, InstallStep.installFailed].includes(step) && (
+              <Installed
+                payload={manifest!}
+                isMarketPayload
+                isFailed={step === InstallStep.installFailed}
+                errMsg={errorMsg}
+                onCancel={onSuccess}
+              />
+            )
+          }
+        </>
+        )
+      }
+    </Modal >
+  )
+}
+
+export default InstallFromMarketplace
diff --git a/app/components/plugins/install-plugin/install-from-marketplace/steps/install.tsx b/app/components/plugins/install-plugin/install-from-marketplace/steps/install.tsx
new file mode 100644
index 0000000..53f1f40
--- /dev/null
+++ b/app/components/plugins/install-plugin/install-from-marketplace/steps/install.tsx
@@ -0,0 +1,172 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useMemo } from 'react'
+// import { RiInformation2Line } from '@remixicon/react'
+import { type Plugin, type PluginManifestInMarket, TaskStatus } from '../../../types'
+import Card from '../../../card'
+import { pluginManifestInMarketToPluginProps } from '../../utils'
+import Button from '@/app/components/base/button'
+import { useTranslation } from 'react-i18next'
+import { RiLoader2Line } from '@remixicon/react'
+import { useInstallPackageFromMarketPlace, usePluginDeclarationFromMarketPlace, useUpdatePackageFromMarketPlace } from '@/service/use-plugins'
+import checkTaskStatus from '../../base/check-task-status'
+import useCheckInstalled from '@/app/components/plugins/install-plugin/hooks/use-check-installed'
+import Version from '../../base/version'
+import { usePluginTaskList } from '@/service/use-plugins'
+import { gte } from 'semver'
+import { useAppContext } from '@/context/app-context'
+
+const i18nPrefix = 'plugin.installModal'
+
+type Props = {
+  uniqueIdentifier: string
+  payload: PluginManifestInMarket | Plugin
+  onCancel: () => void
+  onStartToInstall?: () => void
+  onInstalled: (notRefresh?: boolean) => void
+  onFailed: (message?: string) => void
+}
+
+const Installed: FC<Props> = ({
+  uniqueIdentifier,
+  payload,
+  onCancel,
+  onStartToInstall,
+  onInstalled,
+  onFailed,
+}) => {
+  const { t } = useTranslation()
+  const toInstallVersion = payload.version || payload.latest_version
+  const pluginId = (payload as Plugin).plugin_id
+  const { installedInfo, isLoading } = useCheckInstalled({
+    pluginIds: [pluginId],
+    enabled: !!pluginId,
+  })
+  const installedInfoPayload = installedInfo?.[pluginId]
+  const installedVersion = installedInfoPayload?.installedVersion
+  const hasInstalled = !!installedVersion
+
+  const { mutateAsync: installPackageFromMarketPlace } = useInstallPackageFromMarketPlace()
+  const { mutateAsync: updatePackageFromMarketPlace } = useUpdatePackageFromMarketPlace()
+  const [isInstalling, setIsInstalling] = React.useState(false)
+  const {
+    check,
+    stop,
+  } = checkTaskStatus()
+  const { handleRefetch } = usePluginTaskList(payload.category)
+
+  useEffect(() => {
+    if (hasInstalled && uniqueIdentifier === installedInfoPayload.uniqueIdentifier)
+      onInstalled()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [hasInstalled])
+
+  const handleCancel = () => {
+    stop()
+    onCancel()
+  }
+
+  const handleInstall = async () => {
+    if (isInstalling) return
+    onStartToInstall?.()
+    setIsInstalling(true)
+    try {
+      let taskId
+      let isInstalled
+      if (hasInstalled) {
+        const {
+          all_installed,
+          task_id,
+        } = await updatePackageFromMarketPlace({
+          original_plugin_unique_identifier: installedInfoPayload.uniqueIdentifier,
+          new_plugin_unique_identifier: uniqueIdentifier,
+        })
+        taskId = task_id
+        isInstalled = all_installed
+      }
+      else {
+        const {
+          all_installed,
+          task_id,
+        } = await installPackageFromMarketPlace(uniqueIdentifier)
+        taskId = task_id
+        isInstalled = all_installed
+      }
+
+      if (isInstalled) {
+        onInstalled()
+        return
+      }
+
+      handleRefetch()
+
+      const { status, error } = await check({
+        taskId,
+        pluginUniqueIdentifier: uniqueIdentifier,
+      })
+      if (status === TaskStatus.failed) {
+        onFailed(error)
+        return
+      }
+      onInstalled(true)
+    }
+    catch (e) {
+      if (typeof e === 'string') {
+        onFailed(e)
+        return
+      }
+      onFailed()
+    }
+  }
+
+  const { langeniusVersionInfo } = useAppContext()
+  const { data: pluginDeclaration } = usePluginDeclarationFromMarketPlace(uniqueIdentifier)
+  const isDifyVersionCompatible = useMemo(() => {
+    if (!pluginDeclaration || !langeniusVersionInfo.current_version) return true
+    return gte(langeniusVersionInfo.current_version, pluginDeclaration?.manifest.meta.minimum_dify_version ?? '0.0.0')
+  }, [langeniusVersionInfo.current_version, pluginDeclaration?.manifest.meta.minimum_dify_version])
+
+  return (
+    <>
+      <div className='flex flex-col items-start justify-center gap-4 self-stretch px-6 py-3'>
+        <div className='system-md-regular text-text-secondary'>
+          <p>{t(`${i18nPrefix}.readyToInstall`)}</p>
+          {!isDifyVersionCompatible && (
+            <p className='system-md-regular text-text-secondary text-text-warning'>
+              {t('plugin.difyVersionNotCompatible', { minimalDifyVersion: pluginDeclaration?.manifest.meta.minimum_dify_version })}
+            </p>
+          )}
+        </div>
+        <div className='flex flex-wrap content-start items-start gap-1 self-stretch rounded-2xl bg-background-section-burn p-2'>
+          <Card
+            className='w-full'
+            payload={pluginManifestInMarketToPluginProps(payload as PluginManifestInMarket)}
+            titleLeft={!isLoading && <Version
+              hasInstalled={hasInstalled}
+              installedVersion={installedVersion}
+              toInstallVersion={toInstallVersion}
+            />}
+          />
+        </div>
+      </div>
+      {/* Action Buttons */}
+      <div className='flex items-center justify-end gap-2 self-stretch p-6 pt-5'>
+        {!isInstalling && (
+          <Button variant='secondary' className='min-w-[72px]' onClick={handleCancel}>
+            {t('common.operation.cancel')}
+          </Button>
+        )}
+        <Button
+          variant='primary'
+          className='flex min-w-[72px] space-x-0.5'
+          disabled={isInstalling || isLoading}
+          onClick={handleInstall}
+        >
+          {isInstalling && <RiLoader2Line className='h-4 w-4 animate-spin-slow' />}
+          <span>{t(`${i18nPrefix}.${isInstalling ? 'installing' : 'install'}`)}</span>
+        </Button>
+      </div>
+    </>
+  )
+}
+export default React.memo(Installed)
diff --git a/app/components/plugins/install-plugin/utils.ts b/app/components/plugins/install-plugin/utils.ts
new file mode 100644
index 0000000..eff5e3a
--- /dev/null
+++ b/app/components/plugins/install-plugin/utils.ts
@@ -0,0 +1,60 @@
+import type { Plugin, PluginDeclaration, PluginManifestInMarket } from '../types'
+import type { GitHubUrlInfo } from '@/app/components/plugins/types'
+
+export const pluginManifestToCardPluginProps = (pluginManifest: PluginDeclaration): Plugin => {
+  return {
+    plugin_id: pluginManifest.plugin_unique_identifier,
+    type: pluginManifest.category,
+    category: pluginManifest.category,
+    name: pluginManifest.name,
+    version: pluginManifest.version,
+    latest_version: '',
+    latest_package_identifier: '',
+    org: pluginManifest.author,
+    label: pluginManifest.label,
+    brief: pluginManifest.description,
+    icon: pluginManifest.icon,
+    verified: pluginManifest.verified,
+    introduction: '',
+    repository: '',
+    install_count: 0,
+    endpoint: {
+      settings: [],
+    },
+    tags: [],
+  }
+}
+
+export const pluginManifestInMarketToPluginProps = (pluginManifest: PluginManifestInMarket): Plugin => {
+  return {
+    plugin_id: pluginManifest.plugin_unique_identifier,
+    type: pluginManifest.category,
+    category: pluginManifest.category,
+    name: pluginManifest.name,
+    version: pluginManifest.latest_version,
+    latest_version: pluginManifest.latest_version,
+    latest_package_identifier: '',
+    org: pluginManifest.org,
+    label: pluginManifest.label,
+    brief: pluginManifest.brief,
+    icon: pluginManifest.icon,
+    verified: true,
+    introduction: pluginManifest.introduction,
+    repository: '',
+    install_count: 0,
+    endpoint: {
+      settings: [],
+    },
+    tags: [],
+    badges: pluginManifest.badges,
+  }
+}
+
+export const parseGitHubUrl = (url: string): GitHubUrlInfo => {
+  const match = url.match(/^https:\/\/github\.com\/([^\/]+)\/([^\/]+)\/?$/)
+  return match ? { isValid: true, owner: match[1], repo: match[2] } : { isValid: false }
+}
+
+export const convertRepoToUrl = (repo: string) => {
+  return repo ? `https://github.com/${repo}` : ''
+}
diff --git a/app/components/plugins/marketplace/constants.ts b/app/components/plugins/marketplace/constants.ts
new file mode 100644
index 0000000..6bd4e29
--- /dev/null
+++ b/app/components/plugins/marketplace/constants.ts
@@ -0,0 +1,4 @@
+export const DEFAULT_SORT = {
+  sortBy: 'install_count',
+  sortOrder: 'DESC',
+}
diff --git a/app/components/plugins/marketplace/context.tsx b/app/components/plugins/marketplace/context.tsx
new file mode 100644
index 0000000..91621af
--- /dev/null
+++ b/app/components/plugins/marketplace/context.tsx
@@ -0,0 +1,348 @@
+'use client'
+
+import type {
+  ReactNode,
+} from 'react'
+import {
+  useCallback,
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from 'react'
+import {
+  createContext,
+  useContextSelector,
+} from 'use-context-selector'
+import { PLUGIN_TYPE_SEARCH_MAP } from './plugin-type-switch'
+import type { Plugin } from '../types'
+import {
+  getValidCategoryKeys,
+  getValidTagKeys,
+} from '../utils'
+import type {
+  MarketplaceCollection,
+  PluginsSort,
+  SearchParams,
+  SearchParamsFromCollection,
+} from './types'
+import { DEFAULT_SORT } from './constants'
+import {
+  useMarketplaceCollectionsAndPlugins,
+  useMarketplaceContainerScroll,
+  useMarketplacePlugins,
+} from './hooks'
+import {
+  getMarketplaceListCondition,
+  getMarketplaceListFilterType,
+  updateSearchParams,
+} from './utils'
+import { useInstalledPluginList } from '@/service/use-plugins'
+import { debounce, noop } from 'lodash-es'
+
+export type MarketplaceContextValue = {
+  intersected: boolean
+  setIntersected: (intersected: boolean) => void
+  searchPluginText: string
+  handleSearchPluginTextChange: (text: string) => void
+  filterPluginTags: string[]
+  handleFilterPluginTagsChange: (tags: string[]) => void
+  activePluginType: string
+  handleActivePluginTypeChange: (type: string) => void
+  page: number
+  handlePageChange: (page: number) => void
+  plugins?: Plugin[]
+  pluginsTotal?: number
+  resetPlugins: () => void
+  sort: PluginsSort
+  handleSortChange: (sort: PluginsSort) => void
+  handleQueryPlugins: () => void
+  handleMoreClick: (searchParams: SearchParamsFromCollection) => void
+  marketplaceCollectionsFromClient?: MarketplaceCollection[]
+  setMarketplaceCollectionsFromClient: (collections: MarketplaceCollection[]) => void
+  marketplaceCollectionPluginsMapFromClient?: Record<string, Plugin[]>
+  setMarketplaceCollectionPluginsMapFromClient: (map: Record<string, Plugin[]>) => void
+  isLoading: boolean
+  isSuccessCollections: boolean
+}
+
+export const MarketplaceContext = createContext<MarketplaceContextValue>({
+  intersected: true,
+  setIntersected: noop,
+  searchPluginText: '',
+  handleSearchPluginTextChange: noop,
+  filterPluginTags: [],
+  handleFilterPluginTagsChange: noop,
+  activePluginType: 'all',
+  handleActivePluginTypeChange: noop,
+  page: 1,
+  handlePageChange: noop,
+  plugins: undefined,
+  pluginsTotal: 0,
+  resetPlugins: noop,
+  sort: DEFAULT_SORT,
+  handleSortChange: noop,
+  handleQueryPlugins: noop,
+  handleMoreClick: noop,
+  marketplaceCollectionsFromClient: [],
+  setMarketplaceCollectionsFromClient: noop,
+  marketplaceCollectionPluginsMapFromClient: {},
+  setMarketplaceCollectionPluginsMapFromClient: noop,
+  isLoading: false,
+  isSuccessCollections: false,
+})
+
+type MarketplaceContextProviderProps = {
+  children: ReactNode
+  searchParams?: SearchParams
+  shouldExclude?: boolean
+  scrollContainerId?: string
+  showSearchParams?: boolean
+}
+
+export function useMarketplaceContext(selector: (value: MarketplaceContextValue) => any) {
+  return useContextSelector(MarketplaceContext, selector)
+}
+
+export const MarketplaceContextProvider = ({
+  children,
+  searchParams,
+  shouldExclude,
+  scrollContainerId,
+  showSearchParams,
+}: MarketplaceContextProviderProps) => {
+  const { data, isSuccess } = useInstalledPluginList(!shouldExclude)
+  const exclude = useMemo(() => {
+    if (shouldExclude)
+      return data?.plugins.map(plugin => plugin.plugin_id)
+  }, [data?.plugins, shouldExclude])
+  const queryFromSearchParams = searchParams?.q || ''
+  const tagsFromSearchParams = searchParams?.tags ? getValidTagKeys(searchParams.tags.split(',')) : []
+  const hasValidTags = !!tagsFromSearchParams.length
+  const hasValidCategory = getValidCategoryKeys(searchParams?.category)
+  const categoryFromSearchParams = hasValidCategory || PLUGIN_TYPE_SEARCH_MAP.all
+  const [intersected, setIntersected] = useState(true)
+  const [searchPluginText, setSearchPluginText] = useState(queryFromSearchParams)
+  const searchPluginTextRef = useRef(searchPluginText)
+  const [filterPluginTags, setFilterPluginTags] = useState<string[]>(tagsFromSearchParams)
+  const filterPluginTagsRef = useRef(filterPluginTags)
+  const [activePluginType, setActivePluginType] = useState(categoryFromSearchParams)
+  const activePluginTypeRef = useRef(activePluginType)
+  const [page, setPage] = useState(1)
+  const pageRef = useRef(page)
+  const [sort, setSort] = useState(DEFAULT_SORT)
+  const sortRef = useRef(sort)
+  const {
+    marketplaceCollections: marketplaceCollectionsFromClient,
+    setMarketplaceCollections: setMarketplaceCollectionsFromClient,
+    marketplaceCollectionPluginsMap: marketplaceCollectionPluginsMapFromClient,
+    setMarketplaceCollectionPluginsMap: setMarketplaceCollectionPluginsMapFromClient,
+    queryMarketplaceCollectionsAndPlugins,
+    isLoading,
+    isSuccess: isSuccessCollections,
+  } = useMarketplaceCollectionsAndPlugins()
+  const {
+    plugins,
+    total: pluginsTotal,
+    resetPlugins,
+    queryPlugins,
+    queryPluginsWithDebounced,
+    cancelQueryPluginsWithDebounced,
+    isLoading: isPluginsLoading,
+  } = useMarketplacePlugins()
+
+  useEffect(() => {
+    if (queryFromSearchParams || hasValidTags || hasValidCategory) {
+      queryPlugins({
+        query: queryFromSearchParams,
+        category: hasValidCategory,
+        tags: hasValidTags ? tagsFromSearchParams : [],
+        sortBy: sortRef.current.sortBy,
+        sortOrder: sortRef.current.sortOrder,
+        type: getMarketplaceListFilterType(activePluginTypeRef.current),
+        page: pageRef.current,
+      })
+      const url = new URL(window.location.href)
+      if (searchParams?.language)
+        url.searchParams.set('language', searchParams?.language)
+      history.replaceState({}, '', url)
+    }
+    else {
+      if (shouldExclude && isSuccess) {
+        queryMarketplaceCollectionsAndPlugins({
+          exclude,
+          type: getMarketplaceListFilterType(activePluginTypeRef.current),
+        })
+      }
+    }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [queryPlugins, queryMarketplaceCollectionsAndPlugins, isSuccess, exclude])
+
+  const handleQueryMarketplaceCollectionsAndPlugins = useCallback(() => {
+    queryMarketplaceCollectionsAndPlugins({
+      category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current,
+      condition: getMarketplaceListCondition(activePluginTypeRef.current),
+      exclude,
+      type: getMarketplaceListFilterType(activePluginTypeRef.current),
+    })
+    resetPlugins()
+  }, [exclude, queryMarketplaceCollectionsAndPlugins, resetPlugins])
+
+  const debouncedUpdateSearchParams = useMemo(() => debounce(() => {
+    updateSearchParams({
+      query: searchPluginTextRef.current,
+      category: activePluginTypeRef.current,
+      tags: filterPluginTagsRef.current,
+    })
+  }, 500), [])
+
+  const handleUpdateSearchParams = useCallback((debounced?: boolean) => {
+    if (!showSearchParams)
+      return
+    if (debounced) {
+      debouncedUpdateSearchParams()
+    }
+    else {
+      updateSearchParams({
+        query: searchPluginTextRef.current,
+        category: activePluginTypeRef.current,
+        tags: filterPluginTagsRef.current,
+      })
+    }
+  }, [debouncedUpdateSearchParams, showSearchParams])
+
+  const handleQueryPlugins = useCallback((debounced?: boolean) => {
+    handleUpdateSearchParams(debounced)
+    if (debounced) {
+      queryPluginsWithDebounced({
+        query: searchPluginTextRef.current,
+        category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current,
+        tags: filterPluginTagsRef.current,
+        sortBy: sortRef.current.sortBy,
+        sortOrder: sortRef.current.sortOrder,
+        exclude,
+        type: getMarketplaceListFilterType(activePluginTypeRef.current),
+        page: pageRef.current,
+      })
+    }
+    else {
+      queryPlugins({
+        query: searchPluginTextRef.current,
+        category: activePluginTypeRef.current === PLUGIN_TYPE_SEARCH_MAP.all ? undefined : activePluginTypeRef.current,
+        tags: filterPluginTagsRef.current,
+        sortBy: sortRef.current.sortBy,
+        sortOrder: sortRef.current.sortOrder,
+        exclude,
+        type: getMarketplaceListFilterType(activePluginTypeRef.current),
+        page: pageRef.current,
+      })
+    }
+  }, [exclude, queryPluginsWithDebounced, queryPlugins, handleUpdateSearchParams])
+
+  const handleQuery = useCallback((debounced?: boolean) => {
+    if (!searchPluginTextRef.current && !filterPluginTagsRef.current.length) {
+      handleUpdateSearchParams(debounced)
+      cancelQueryPluginsWithDebounced()
+      handleQueryMarketplaceCollectionsAndPlugins()
+      return
+    }
+
+    handleQueryPlugins(debounced)
+  }, [handleQueryMarketplaceCollectionsAndPlugins, handleQueryPlugins, cancelQueryPluginsWithDebounced, handleUpdateSearchParams])
+
+  const handleSearchPluginTextChange = useCallback((text: string) => {
+    setSearchPluginText(text)
+    searchPluginTextRef.current = text
+    setPage(1)
+    pageRef.current = 1
+
+    handleQuery(true)
+  }, [handleQuery])
+
+  const handleFilterPluginTagsChange = useCallback((tags: string[]) => {
+    setFilterPluginTags(tags)
+    filterPluginTagsRef.current = tags
+    setPage(1)
+    pageRef.current = 1
+
+    handleQuery()
+  }, [handleQuery])
+
+  const handleActivePluginTypeChange = useCallback((type: string) => {
+    setActivePluginType(type)
+    activePluginTypeRef.current = type
+    setPage(1)
+    pageRef.current = 1
+
+    handleQuery()
+  }, [handleQuery])
+
+  const handleSortChange = useCallback((sort: PluginsSort) => {
+    setSort(sort)
+    sortRef.current = sort
+    setPage(1)
+    pageRef.current = 1
+
+    handleQueryPlugins()
+  }, [handleQueryPlugins])
+
+  const handlePageChange = useCallback(() => {
+    if (pluginsTotal && plugins && pluginsTotal > plugins.length) {
+      setPage(pageRef.current + 1)
+      pageRef.current++
+
+      handleQueryPlugins()
+    }
+  }, [handleQueryPlugins, plugins, pluginsTotal])
+
+  const handleMoreClick = useCallback((searchParams: SearchParamsFromCollection) => {
+    setSearchPluginText(searchParams?.query || '')
+    searchPluginTextRef.current = searchParams?.query || ''
+    setSort({
+      sortBy: searchParams?.sort_by || DEFAULT_SORT.sortBy,
+      sortOrder: searchParams?.sort_order || DEFAULT_SORT.sortOrder,
+    })
+    sortRef.current = {
+      sortBy: searchParams?.sort_by || DEFAULT_SORT.sortBy,
+      sortOrder: searchParams?.sort_order || DEFAULT_SORT.sortOrder,
+    }
+    setPage(1)
+    pageRef.current = 1
+
+    handleQueryPlugins()
+  }, [handleQueryPlugins])
+
+  useMarketplaceContainerScroll(handlePageChange, scrollContainerId)
+
+  return (
+    <MarketplaceContext.Provider
+      value={{
+        intersected,
+        setIntersected,
+        searchPluginText,
+        handleSearchPluginTextChange,
+        filterPluginTags,
+        handleFilterPluginTagsChange,
+        activePluginType,
+        handleActivePluginTypeChange,
+        page,
+        handlePageChange,
+        plugins,
+        pluginsTotal,
+        resetPlugins,
+        sort,
+        handleSortChange,
+        handleQueryPlugins,
+        handleMoreClick,
+        marketplaceCollectionsFromClient,
+        setMarketplaceCollectionsFromClient,
+        marketplaceCollectionPluginsMapFromClient,
+        setMarketplaceCollectionPluginsMapFromClient,
+        isLoading: isLoading || isPluginsLoading,
+        isSuccessCollections,
+      }}
+    >
+      {children}
+    </MarketplaceContext.Provider>
+  )
+}
diff --git a/app/components/plugins/marketplace/description/index.tsx b/app/components/plugins/marketplace/description/index.tsx
new file mode 100644
index 0000000..68a465d
--- /dev/null
+++ b/app/components/plugins/marketplace/description/index.tsx
@@ -0,0 +1,71 @@
+import {
+  getLocaleOnServer,
+  useTranslation as translate,
+} from '@/i18n/server'
+
+type DescriptionProps = {
+  locale?: string
+}
+const Description = async ({
+  locale: localeFromProps,
+}: DescriptionProps) => {
+  const localeDefault = await getLocaleOnServer()
+  const { t } = await translate(localeFromProps || localeDefault, 'plugin')
+  const { t: tCommon } = await translate(localeFromProps || localeDefault, 'common')
+  const isZhHans = localeFromProps === 'zh-Hans'
+
+  return (
+    <>
+      <h1 className='title-4xl-semi-bold mb-2 shrink-0 text-center text-text-primary'>
+        {t('marketplace.empower')}
+      </h1>
+      <h2 className='body-md-regular flex shrink-0 items-center justify-center text-center text-text-tertiary'>
+        {
+          isZhHans && (
+            <>
+              <span className='mr-1'>{tCommon('operation.in')}</span>
+              {t('marketplace.difyMarketplace')}
+              {t('marketplace.discover')}
+            </>
+          )
+        }
+        {
+          !isZhHans && (
+            <>
+              {t('marketplace.discover')}
+            </>
+          )
+        }
+        <span className="body-md-medium relative z-[1] ml-1 text-text-secondary after:absolute after:bottom-[1.5px] after:left-0 after:h-2 after:w-full after:bg-text-text-selected after:content-['']">
+          <span className='relative z-[2] lowercase'>{t('category.models')}</span>
+        </span>
+        ,
+        <span className="body-md-medium relative z-[1] ml-1 text-text-secondary after:absolute after:bottom-[1.5px] after:left-0 after:h-2 after:w-full after:bg-text-text-selected after:content-['']">
+          <span className='relative z-[2] lowercase'>{t('category.tools')}</span>
+        </span>
+        ,
+        <span className="body-md-medium relative z-[1] ml-1 text-text-secondary after:absolute after:bottom-[1.5px] after:left-0 after:h-2 after:w-full after:bg-text-text-selected after:content-['']">
+          <span className='relative z-[2] lowercase'>{t('category.agents')}</span>
+        </span>
+        ,
+        <span className="body-md-medium relative z-[1] ml-1 mr-1 text-text-secondary after:absolute after:bottom-[1.5px] after:left-0 after:h-2 after:w-full after:bg-text-text-selected after:content-['']">
+          <span className='relative z-[2] lowercase'>{t('category.extensions')}</span>
+        </span>
+        {t('marketplace.and')}
+        <span className="body-md-medium relative z-[1] ml-1 mr-1 text-text-secondary after:absolute after:bottom-[1.5px] after:left-0 after:h-2 after:w-full after:bg-text-text-selected after:content-['']">
+          <span className='relative z-[2] lowercase'>{t('category.bundles')}</span>
+        </span>
+        {
+          !isZhHans && (
+            <>
+              <span className='mr-1'>{tCommon('operation.in')}</span>
+              {t('marketplace.difyMarketplace')}
+            </>
+          )
+        }
+      </h2>
+    </>
+  )
+}
+
+export default Description
diff --git a/app/components/plugins/marketplace/empty/index.tsx b/app/components/plugins/marketplace/empty/index.tsx
new file mode 100644
index 0000000..441b100
--- /dev/null
+++ b/app/components/plugins/marketplace/empty/index.tsx
@@ -0,0 +1,63 @@
+'use client'
+import { Group } from '@/app/components/base/icons/src/vender/other'
+import Line from './line'
+import cn from '@/utils/classnames'
+import { useMixedTranslation } from '@/app/components/plugins/marketplace/hooks'
+
+type Props = {
+  text?: string
+  lightCard?: boolean
+  className?: string
+  locale?: string
+}
+
+const Empty = ({
+  text,
+  lightCard,
+  className,
+  locale,
+}: Props) => {
+  const { t } = useMixedTranslation(locale)
+
+  return (
+    <div
+      className={cn('relative flex h-0 grow flex-wrap overflow-hidden p-2', className)}
+    >
+      {
+        Array.from({ length: 16 }).map((_, index) => (
+          <div
+            key={index}
+            className={cn(
+              'mb-3 mr-3  h-[144px] w-[calc((100%-36px)/4)] rounded-xl bg-background-section-burn',
+              index % 4 === 3 && 'mr-0',
+              index > 11 && 'mb-0',
+              lightCard && 'bg-background-default-lighter opacity-75',
+            )}
+          >
+          </div>
+        ))
+      }
+      {
+        !lightCard && (
+          <div
+            className='absolute inset-0 z-[1] bg-marketplace-plugin-empty'
+          ></div>
+        )
+      }
+      <div className='absolute left-1/2 top-1/2 z-[2] flex -translate-x-1/2 -translate-y-1/2 flex-col items-center'>
+        <div className='relative mb-3 flex h-14 w-14 items-center justify-center rounded-xl border border-dashed border-divider-deep bg-components-card-bg shadow-lg'>
+          <Group className='h-5 w-5' />
+          <Line className='absolute right-[-1px] top-1/2 -translate-y-1/2' />
+          <Line className='absolute left-[-1px] top-1/2 -translate-y-1/2' />
+          <Line className='absolute left-1/2 top-0 -translate-x-1/2 -translate-y-1/2 rotate-90' />
+          <Line className='absolute left-1/2 top-full -translate-x-1/2 -translate-y-1/2 rotate-90' />
+        </div>
+        <div className='system-md-regular text-center text-text-tertiary'>
+          {text || t('plugin.marketplace.noPluginFound')}
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default Empty
diff --git a/app/components/plugins/marketplace/empty/line.tsx b/app/components/plugins/marketplace/empty/line.tsx
new file mode 100644
index 0000000..19837aa
--- /dev/null
+++ b/app/components/plugins/marketplace/empty/line.tsx
@@ -0,0 +1,21 @@
+type LineProps = {
+  className?: string
+}
+const Line = ({
+  className,
+}: LineProps) => {
+  return (
+    <svg xmlns="http://www.w3.org/2000/svg" width="2" height="241" viewBox="0 0 2 241" fill="none" className={className}>
+      <path d="M1 0.5L1 240.5" stroke="url(#paint0_linear_1989_74474)"/>
+      <defs>
+        <linearGradient id="paint0_linear_1989_74474" x1="-7.99584" y1="240.5" x2="-7.88094" y2="0.50004" gradientUnits="userSpaceOnUse">
+          <stop stopColor="white" stopOpacity="0.01"/>
+          <stop offset="0.503965" stopColor="#101828" stopOpacity="0.08"/>
+          <stop offset="1" stopColor="white" stopOpacity="0.01"/>
+        </linearGradient>
+      </defs>
+    </svg>
+  )
+}
+
+export default Line
diff --git a/app/components/plugins/marketplace/hooks.ts b/app/components/plugins/marketplace/hooks.ts
new file mode 100644
index 0000000..c581ee0
--- /dev/null
+++ b/app/components/plugins/marketplace/hooks.ts
@@ -0,0 +1,177 @@
+import {
+  useCallback,
+  useEffect,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { useDebounceFn } from 'ahooks'
+import type {
+  Plugin,
+} from '../types'
+import type {
+  CollectionsAndPluginsSearchParams,
+  MarketplaceCollection,
+  PluginsSearchParams,
+} from './types'
+import {
+  getFormattedPlugin,
+  getMarketplaceCollectionsAndPlugins,
+} from './utils'
+import i18n from '@/i18n/i18next-config'
+import {
+  useMutationPluginsFromMarketplace,
+} from '@/service/use-plugins'
+
+export const useMarketplaceCollectionsAndPlugins = () => {
+  const [isLoading, setIsLoading] = useState(false)
+  const [isSuccess, setIsSuccess] = useState(false)
+  const [marketplaceCollections, setMarketplaceCollections] = useState<MarketplaceCollection[]>()
+  const [marketplaceCollectionPluginsMap, setMarketplaceCollectionPluginsMap] = useState<Record<string, Plugin[]>>()
+
+  const queryMarketplaceCollectionsAndPlugins = useCallback(async (query?: CollectionsAndPluginsSearchParams) => {
+    try {
+      setIsLoading(true)
+      setIsSuccess(false)
+      const { marketplaceCollections, marketplaceCollectionPluginsMap } = await getMarketplaceCollectionsAndPlugins(query)
+      setIsLoading(false)
+      setIsSuccess(true)
+      setMarketplaceCollections(marketplaceCollections)
+      setMarketplaceCollectionPluginsMap(marketplaceCollectionPluginsMap)
+    }
+    // eslint-disable-next-line unused-imports/no-unused-vars
+    catch (e) {
+      setIsLoading(false)
+      setIsSuccess(false)
+    }
+  }, [])
+
+  return {
+    marketplaceCollections,
+    setMarketplaceCollections,
+    marketplaceCollectionPluginsMap,
+    setMarketplaceCollectionPluginsMap,
+    queryMarketplaceCollectionsAndPlugins,
+    isLoading,
+    isSuccess,
+  }
+}
+
+export const useMarketplacePlugins = () => {
+  const {
+    data,
+    mutateAsync,
+    reset,
+    isPending,
+  } = useMutationPluginsFromMarketplace()
+
+  const [prevPlugins, setPrevPlugins] = useState<Plugin[] | undefined>()
+  const resetPlugins = useCallback(() => {
+    reset()
+    setPrevPlugins(undefined)
+  }, [reset])
+  const handleUpdatePlugins = useCallback((pluginsSearchParams: PluginsSearchParams) => {
+    mutateAsync(pluginsSearchParams).then((res) => {
+      const currentPage = pluginsSearchParams.page || 1
+      const resPlugins = res.data.bundles || res.data.plugins
+      if (currentPage > 1) {
+        setPrevPlugins(prevPlugins => [...(prevPlugins || []), ...resPlugins.map((plugin) => {
+          return getFormattedPlugin(plugin)
+        })])
+      }
+      else {
+        setPrevPlugins(resPlugins.map((plugin) => {
+          return getFormattedPlugin(plugin)
+        }))
+      }
+    })
+  }, [mutateAsync])
+  const queryPlugins = useCallback((pluginsSearchParams: PluginsSearchParams) => {
+    handleUpdatePlugins(pluginsSearchParams)
+  }, [handleUpdatePlugins])
+
+  const { run: queryPluginsWithDebounced, cancel: cancelQueryPluginsWithDebounced } = useDebounceFn((pluginsSearchParams: PluginsSearchParams) => {
+    handleUpdatePlugins(pluginsSearchParams)
+  }, {
+    wait: 500,
+  })
+
+  return {
+    plugins: prevPlugins,
+    total: data?.data?.total,
+    resetPlugins,
+    queryPlugins,
+    queryPluginsWithDebounced,
+    cancelQueryPluginsWithDebounced,
+    isLoading: isPending,
+  }
+}
+
+export const useMixedTranslation = (localeFromOuter?: string) => {
+  let t = useTranslation().t
+
+  if (localeFromOuter)
+    t = i18n.getFixedT(localeFromOuter)
+
+  return {
+    t,
+  }
+}
+
+export const useMarketplaceContainerScroll = (
+  callback: () => void,
+  scrollContainerId = 'marketplace-container',
+) => {
+  const container = document.getElementById(scrollContainerId)
+
+  const handleScroll = useCallback((e: Event) => {
+    const target = e.target as HTMLDivElement
+    const {
+      scrollTop,
+      scrollHeight,
+      clientHeight,
+    } = target
+    if (scrollTop + clientHeight >= scrollHeight - 5 && scrollTop > 0)
+      callback()
+  }, [callback])
+
+  useEffect(() => {
+    if (container)
+      container.addEventListener('scroll', handleScroll)
+
+    return () => {
+      if (container)
+        container.removeEventListener('scroll', handleScroll)
+    }
+  }, [container, handleScroll])
+}
+
+export const useSearchBoxAutoAnimate = (searchBoxAutoAnimate?: boolean) => {
+  const [searchBoxCanAnimate, setSearchBoxCanAnimate] = useState(true)
+
+  const handleSearchBoxCanAnimateChange = useCallback(() => {
+    if (!searchBoxAutoAnimate) {
+      const clientWidth = document.documentElement.clientWidth
+
+      if (clientWidth < 1400)
+        setSearchBoxCanAnimate(false)
+      else
+        setSearchBoxCanAnimate(true)
+    }
+  }, [searchBoxAutoAnimate])
+
+  useEffect(() => {
+    handleSearchBoxCanAnimateChange()
+  }, [handleSearchBoxCanAnimateChange])
+
+  useEffect(() => {
+    window.addEventListener('resize', handleSearchBoxCanAnimateChange)
+
+    return () => {
+      window.removeEventListener('resize', handleSearchBoxCanAnimateChange)
+    }
+  }, [handleSearchBoxCanAnimateChange])
+
+  return {
+    searchBoxCanAnimate,
+  }
+}
diff --git a/app/components/plugins/marketplace/index.tsx b/app/components/plugins/marketplace/index.tsx
new file mode 100644
index 0000000..7a29556
--- /dev/null
+++ b/app/components/plugins/marketplace/index.tsx
@@ -0,0 +1,72 @@
+import { MarketplaceContextProvider } from './context'
+import Description from './description'
+import IntersectionLine from './intersection-line'
+import SearchBoxWrapper from './search-box/search-box-wrapper'
+import PluginTypeSwitch from './plugin-type-switch'
+import ListWrapper from './list/list-wrapper'
+import type { SearchParams } from './types'
+import { getMarketplaceCollectionsAndPlugins } from './utils'
+import { TanstackQueryIniter } from '@/context/query-client'
+
+type MarketplaceProps = {
+  locale: string
+  searchBoxAutoAnimate?: boolean
+  showInstallButton?: boolean
+  shouldExclude?: boolean
+  searchParams?: SearchParams
+  pluginTypeSwitchClassName?: string
+  intersectionContainerId?: string
+  scrollContainerId?: string
+  showSearchParams?: boolean
+}
+const Marketplace = async ({
+  locale,
+  searchBoxAutoAnimate = true,
+  showInstallButton = true,
+  shouldExclude,
+  searchParams,
+  pluginTypeSwitchClassName,
+  intersectionContainerId,
+  scrollContainerId,
+  showSearchParams = true,
+}: MarketplaceProps) => {
+  let marketplaceCollections: any = []
+  let marketplaceCollectionPluginsMap = {}
+  if (!shouldExclude) {
+    const marketplaceCollectionsAndPluginsData = await getMarketplaceCollectionsAndPlugins()
+    marketplaceCollections = marketplaceCollectionsAndPluginsData.marketplaceCollections
+    marketplaceCollectionPluginsMap = marketplaceCollectionsAndPluginsData.marketplaceCollectionPluginsMap
+  }
+
+  return (
+    <TanstackQueryIniter>
+      <MarketplaceContextProvider
+        searchParams={searchParams}
+        shouldExclude={shouldExclude}
+        scrollContainerId={scrollContainerId}
+        showSearchParams={showSearchParams}
+      >
+        <Description locale={locale} />
+        <IntersectionLine intersectionContainerId={intersectionContainerId} />
+        <SearchBoxWrapper
+          locale={locale}
+          searchBoxAutoAnimate={searchBoxAutoAnimate}
+        />
+        <PluginTypeSwitch
+          locale={locale}
+          className={pluginTypeSwitchClassName}
+          searchBoxAutoAnimate={searchBoxAutoAnimate}
+          showSearchParams={showSearchParams}
+        />
+        <ListWrapper
+          locale={locale}
+          marketplaceCollections={marketplaceCollections}
+          marketplaceCollectionPluginsMap={marketplaceCollectionPluginsMap}
+          showInstallButton={showInstallButton}
+        />
+      </MarketplaceContextProvider>
+    </TanstackQueryIniter>
+  )
+}
+
+export default Marketplace
diff --git a/app/components/plugins/marketplace/intersection-line/hooks.ts b/app/components/plugins/marketplace/intersection-line/hooks.ts
new file mode 100644
index 0000000..fe30b70
--- /dev/null
+++ b/app/components/plugins/marketplace/intersection-line/hooks.ts
@@ -0,0 +1,30 @@
+import { useEffect } from 'react'
+import { useMarketplaceContext } from '@/app/components/plugins/marketplace/context'
+
+export const useScrollIntersection = (
+  anchorRef: React.RefObject<HTMLDivElement>,
+  intersectionContainerId = 'marketplace-container',
+) => {
+  const intersected = useMarketplaceContext(v => v.intersected)
+  const setIntersected = useMarketplaceContext(v => v.setIntersected)
+
+  useEffect(() => {
+    const container = document.getElementById(intersectionContainerId)
+    let observer: IntersectionObserver | undefined
+    if (container && anchorRef.current) {
+      observer = new IntersectionObserver((entries) => {
+        const isIntersecting = entries[0].isIntersecting
+
+        if (isIntersecting && !intersected)
+          setIntersected(true)
+
+        if (!isIntersecting && intersected)
+          setIntersected(false)
+      }, {
+        root: container,
+      })
+      observer.observe(anchorRef.current)
+    }
+    return () => observer?.disconnect()
+  }, [anchorRef, intersected, setIntersected, intersectionContainerId])
+}
diff --git a/app/components/plugins/marketplace/intersection-line/index.tsx b/app/components/plugins/marketplace/intersection-line/index.tsx
new file mode 100644
index 0000000..1a728e1
--- /dev/null
+++ b/app/components/plugins/marketplace/intersection-line/index.tsx
@@ -0,0 +1,21 @@
+'use client'
+
+import { useRef } from 'react'
+import { useScrollIntersection } from './hooks'
+
+type IntersectionLineProps = {
+  intersectionContainerId?: string
+}
+const IntersectionLine = ({
+  intersectionContainerId,
+}: IntersectionLineProps) => {
+  const ref = useRef<HTMLDivElement>(null)
+
+  useScrollIntersection(ref, intersectionContainerId)
+
+  return (
+    <div ref={ref} className='mb-4 h-[1px] shrink-0 bg-transparent'></div>
+  )
+}
+
+export default IntersectionLine
diff --git a/app/components/plugins/marketplace/list/card-wrapper.tsx b/app/components/plugins/marketplace/list/card-wrapper.tsx
new file mode 100644
index 0000000..2751155
--- /dev/null
+++ b/app/components/plugins/marketplace/list/card-wrapper.tsx
@@ -0,0 +1,103 @@
+'use client'
+import { useTheme } from 'next-themes'
+import { RiArrowRightUpLine } from '@remixicon/react'
+import { getPluginLinkInMarketplace } from '../utils'
+import Card from '@/app/components/plugins/card'
+import CardMoreInfo from '@/app/components/plugins/card/card-more-info'
+import type { Plugin } from '@/app/components/plugins/types'
+import Button from '@/app/components/base/button'
+import { useMixedTranslation } from '@/app/components/plugins/marketplace/hooks'
+import InstallFromMarketplace from '@/app/components/plugins/install-plugin/install-from-marketplace'
+import { useBoolean } from 'ahooks'
+import { useI18N } from '@/context/i18n'
+import { useTags } from '@/app/components/plugins/hooks'
+
+type CardWrapperProps = {
+  plugin: Plugin
+  showInstallButton?: boolean
+  locale?: string
+}
+const CardWrapper = ({
+  plugin,
+  showInstallButton,
+  locale,
+}: CardWrapperProps) => {
+  const { t } = useMixedTranslation(locale)
+  const { theme } = useTheme()
+  const [isShowInstallFromMarketplace, {
+    setTrue: showInstallFromMarketplace,
+    setFalse: hideInstallFromMarketplace,
+  }] = useBoolean(false)
+  const { locale: localeFromLocale } = useI18N()
+  const { tagsMap } = useTags(t)
+
+  if (showInstallButton) {
+    return (
+      <div
+        className='group relative cursor-pointer rounded-xl  hover:bg-components-panel-on-panel-item-bg-hover'
+      >
+        <Card
+          key={plugin.name}
+          payload={plugin}
+          locale={locale}
+          footer={
+            <CardMoreInfo
+              downloadCount={plugin.install_count}
+              tags={plugin.tags.map(tag => tagsMap[tag.name].label)}
+            />
+          }
+        />
+        {
+          <div className='absolute bottom-0 hidden w-full items-center space-x-2 rounded-b-xl bg-gradient-to-tr from-components-panel-on-panel-item-bg to-background-gradient-mask-transparent px-4 pb-4 pt-8 group-hover:flex'>
+            <Button
+              variant='primary'
+              className='w-[calc(50%-4px)]'
+              onClick={showInstallFromMarketplace}
+            >
+              {t('plugin.detailPanel.operation.install')}
+            </Button>
+            <a href={`${getPluginLinkInMarketplace(plugin)}?language=${localeFromLocale}${theme ? `&theme=${theme}` : ''}`} target='_blank' className='block w-[calc(50%-4px)] flex-1 shrink-0'>
+              <Button
+                className='w-full gap-0.5'
+              >
+                {t('plugin.detailPanel.operation.detail')}
+                <RiArrowRightUpLine className='ml-1 h-4 w-4' />
+              </Button>
+            </a>
+          </div>
+        }
+        {
+          isShowInstallFromMarketplace && (
+            <InstallFromMarketplace
+              manifest={plugin}
+              uniqueIdentifier={plugin.latest_package_identifier}
+              onClose={hideInstallFromMarketplace}
+              onSuccess={hideInstallFromMarketplace}
+            />
+          )
+        }
+      </div>
+    )
+  }
+
+  return (
+    <a
+      className='group relative inline-block cursor-pointer rounded-xl'
+      href={getPluginLinkInMarketplace(plugin)}
+    >
+      <Card
+        key={plugin.name}
+        payload={plugin}
+        locale={locale}
+        footer={
+          <CardMoreInfo
+            downloadCount={plugin.install_count}
+            tags={plugin.tags.map(tag => tagsMap[tag.name].label)}
+          />
+        }
+      />
+    </a>
+  )
+}
+
+export default CardWrapper
diff --git a/app/components/plugins/marketplace/list/index.tsx b/app/components/plugins/marketplace/list/index.tsx
new file mode 100644
index 0000000..5651512
--- /dev/null
+++ b/app/components/plugins/marketplace/list/index.tsx
@@ -0,0 +1,79 @@
+'use client'
+import type { Plugin } from '../../types'
+import type { MarketplaceCollection } from '../types'
+import ListWithCollection from './list-with-collection'
+import CardWrapper from './card-wrapper'
+import Empty from '../empty'
+import cn from '@/utils/classnames'
+
+type ListProps = {
+  marketplaceCollections: MarketplaceCollection[]
+  marketplaceCollectionPluginsMap: Record<string, Plugin[]>
+  plugins?: Plugin[]
+  showInstallButton?: boolean
+  locale: string
+  cardContainerClassName?: string
+  cardRender?: (plugin: Plugin) => React.JSX.Element | null
+  onMoreClick?: () => void
+  emptyClassName?: string
+}
+const List = ({
+  marketplaceCollections,
+  marketplaceCollectionPluginsMap,
+  plugins,
+  showInstallButton,
+  locale,
+  cardContainerClassName,
+  cardRender,
+  onMoreClick,
+  emptyClassName,
+}: ListProps) => {
+  return (
+    <>
+      {
+        !plugins && (
+          <ListWithCollection
+            marketplaceCollections={marketplaceCollections}
+            marketplaceCollectionPluginsMap={marketplaceCollectionPluginsMap}
+            showInstallButton={showInstallButton}
+            locale={locale}
+            cardContainerClassName={cardContainerClassName}
+            cardRender={cardRender}
+            onMoreClick={onMoreClick}
+          />
+        )
+      }
+      {
+        plugins && !!plugins.length && (
+          <div className={cn(
+            'grid grid-cols-4 gap-3',
+            cardContainerClassName,
+          )}>
+            {
+              plugins.map((plugin) => {
+                if (cardRender)
+                  return cardRender(plugin)
+
+                return (
+                  <CardWrapper
+                    key={plugin.name}
+                    plugin={plugin}
+                    showInstallButton={showInstallButton}
+                    locale={locale}
+                  />
+                )
+              })
+            }
+          </div>
+        )
+      }
+      {
+        plugins && !plugins.length && (
+          <Empty className={emptyClassName} locale={locale} />
+        )
+      }
+    </>
+  )
+}
+
+export default List
diff --git a/app/components/plugins/marketplace/list/list-with-collection.tsx b/app/components/plugins/marketplace/list/list-with-collection.tsx
new file mode 100644
index 0000000..4c396c5
--- /dev/null
+++ b/app/components/plugins/marketplace/list/list-with-collection.tsx
@@ -0,0 +1,86 @@
+'use client'
+
+import { RiArrowRightSLine } from '@remixicon/react'
+import type { MarketplaceCollection } from '../types'
+import CardWrapper from './card-wrapper'
+import type { Plugin } from '@/app/components/plugins/types'
+import { getLanguage } from '@/i18n/language'
+import cn from '@/utils/classnames'
+import type { SearchParamsFromCollection } from '@/app/components/plugins/marketplace/types'
+import { useMixedTranslation } from '@/app/components/plugins/marketplace/hooks'
+
+type ListWithCollectionProps = {
+  marketplaceCollections: MarketplaceCollection[]
+  marketplaceCollectionPluginsMap: Record<string, Plugin[]>
+  showInstallButton?: boolean
+  locale: string
+  cardContainerClassName?: string
+  cardRender?: (plugin: Plugin) => React.JSX.Element | null
+  onMoreClick?: (searchParams?: SearchParamsFromCollection) => void
+}
+const ListWithCollection = ({
+  marketplaceCollections,
+  marketplaceCollectionPluginsMap,
+  showInstallButton,
+  locale,
+  cardContainerClassName,
+  cardRender,
+  onMoreClick,
+}: ListWithCollectionProps) => {
+  const { t } = useMixedTranslation(locale)
+
+  return (
+    <>
+      {
+        marketplaceCollections.filter((collection) => {
+          return marketplaceCollectionPluginsMap[collection.name]?.length
+        }).map(collection => (
+          <div
+            key={collection.name}
+            className='py-3'
+          >
+            <div className='flex items-end justify-between'>
+              <div>
+                <div className='title-xl-semi-bold text-text-primary'>{collection.label[getLanguage(locale)]}</div>
+                <div className='system-xs-regular text-text-tertiary'>{collection.description[getLanguage(locale)]}</div>
+              </div>
+              {
+                collection.searchable && onMoreClick && (
+                  <div
+                    className='system-xs-medium flex cursor-pointer items-center text-text-accent '
+                    onClick={() => onMoreClick?.(collection.search_params)}
+                  >
+                    {t('plugin.marketplace.viewMore')}
+                    <RiArrowRightSLine className='h-4 w-4' />
+                  </div>
+                )
+              }
+            </div>
+            <div className={cn(
+              'mt-2 grid grid-cols-4 gap-3',
+              cardContainerClassName,
+            )}>
+              {
+                marketplaceCollectionPluginsMap[collection.name].map((plugin) => {
+                  if (cardRender)
+                    return cardRender(plugin)
+
+                  return (
+                    <CardWrapper
+                      key={plugin.plugin_id}
+                      plugin={plugin}
+                      showInstallButton={showInstallButton}
+                      locale={locale}
+                    />
+                  )
+                })
+              }
+            </div>
+          </div>
+        ))
+      }
+    </>
+  )
+}
+
+export default ListWithCollection
diff --git a/app/components/plugins/marketplace/list/list-wrapper.tsx b/app/components/plugins/marketplace/list/list-wrapper.tsx
new file mode 100644
index 0000000..fa6521b
--- /dev/null
+++ b/app/components/plugins/marketplace/list/list-wrapper.tsx
@@ -0,0 +1,75 @@
+'use client'
+import { useEffect } from 'react'
+import type { Plugin } from '../../types'
+import type { MarketplaceCollection } from '../types'
+import { useMarketplaceContext } from '../context'
+import List from './index'
+import SortDropdown from '../sort-dropdown'
+import Loading from '@/app/components/base/loading'
+import { useMixedTranslation } from '@/app/components/plugins/marketplace/hooks'
+
+type ListWrapperProps = {
+  marketplaceCollections: MarketplaceCollection[]
+  marketplaceCollectionPluginsMap: Record<string, Plugin[]>
+  showInstallButton?: boolean
+  locale: string
+}
+const ListWrapper = ({
+  marketplaceCollections,
+  marketplaceCollectionPluginsMap,
+  showInstallButton,
+  locale,
+}: ListWrapperProps) => {
+  const { t } = useMixedTranslation(locale)
+  const plugins = useMarketplaceContext(v => v.plugins)
+  const pluginsTotal = useMarketplaceContext(v => v.pluginsTotal)
+  const marketplaceCollectionsFromClient = useMarketplaceContext(v => v.marketplaceCollectionsFromClient)
+  const marketplaceCollectionPluginsMapFromClient = useMarketplaceContext(v => v.marketplaceCollectionPluginsMapFromClient)
+  const isLoading = useMarketplaceContext(v => v.isLoading)
+  const isSuccessCollections = useMarketplaceContext(v => v.isSuccessCollections)
+  const handleQueryPlugins = useMarketplaceContext(v => v.handleQueryPlugins)
+  const page = useMarketplaceContext(v => v.page)
+  const handleMoreClick = useMarketplaceContext(v => v.handleMoreClick)
+
+  useEffect(() => {
+    if (!marketplaceCollectionsFromClient?.length && isSuccessCollections)
+      handleQueryPlugins()
+  }, [handleQueryPlugins, marketplaceCollections, marketplaceCollectionsFromClient, isSuccessCollections])
+
+  return (
+    <div
+      style={{ scrollbarGutter: 'stable' }}
+      className='relative flex grow flex-col bg-background-default-subtle px-12 py-2'>
+      {
+        plugins && (
+          <div className='mb-4 flex items-center pt-3'>
+            <div className='title-xl-semi-bold text-text-primary'>{t('plugin.marketplace.pluginsResult', { num: pluginsTotal })}</div>
+            <div className='mx-3 h-3.5 w-[1px] bg-divider-regular'></div>
+            <SortDropdown locale={locale} />
+          </div>
+        )
+      }
+      {
+        isLoading && page === 1 && (
+          <div className='absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2'>
+            <Loading />
+          </div>
+        )
+      }
+      {
+        (!isLoading || page > 1) && (
+          <List
+            marketplaceCollections={marketplaceCollectionsFromClient || marketplaceCollections}
+            marketplaceCollectionPluginsMap={marketplaceCollectionPluginsMapFromClient || marketplaceCollectionPluginsMap}
+            plugins={plugins}
+            showInstallButton={showInstallButton}
+            locale={locale}
+            onMoreClick={handleMoreClick}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default ListWrapper
diff --git a/app/components/plugins/marketplace/plugin-type-switch.tsx b/app/components/plugins/marketplace/plugin-type-switch.tsx
new file mode 100644
index 0000000..9c071c5
--- /dev/null
+++ b/app/components/plugins/marketplace/plugin-type-switch.tsx
@@ -0,0 +1,120 @@
+'use client'
+import {
+  RiArchive2Line,
+  RiBrain2Line,
+  RiHammerLine,
+  RiPuzzle2Line,
+  RiSpeakAiLine,
+} from '@remixicon/react'
+import { PluginType } from '../types'
+import { useMarketplaceContext } from './context'
+import {
+  useMixedTranslation,
+  useSearchBoxAutoAnimate,
+} from './hooks'
+import cn from '@/utils/classnames'
+import { useCallback, useEffect } from 'react'
+
+export const PLUGIN_TYPE_SEARCH_MAP = {
+  all: 'all',
+  model: PluginType.model,
+  tool: PluginType.tool,
+  agent: PluginType.agent,
+  extension: PluginType.extension,
+  bundle: 'bundle',
+}
+type PluginTypeSwitchProps = {
+  locale?: string
+  className?: string
+  searchBoxAutoAnimate?: boolean
+  showSearchParams?: boolean
+}
+const PluginTypeSwitch = ({
+  locale,
+  className,
+  searchBoxAutoAnimate,
+  showSearchParams,
+}: PluginTypeSwitchProps) => {
+  const { t } = useMixedTranslation(locale)
+  const activePluginType = useMarketplaceContext(s => s.activePluginType)
+  const handleActivePluginTypeChange = useMarketplaceContext(s => s.handleActivePluginTypeChange)
+  const { searchBoxCanAnimate } = useSearchBoxAutoAnimate(searchBoxAutoAnimate)
+
+  const options = [
+    {
+      value: PLUGIN_TYPE_SEARCH_MAP.all,
+      text: t('plugin.category.all'),
+      icon: null,
+    },
+    {
+      value: PLUGIN_TYPE_SEARCH_MAP.model,
+      text: t('plugin.category.models'),
+      icon: <RiBrain2Line className='mr-1.5 h-4 w-4' />,
+    },
+    {
+      value: PLUGIN_TYPE_SEARCH_MAP.tool,
+      text: t('plugin.category.tools'),
+      icon: <RiHammerLine className='mr-1.5 h-4 w-4' />,
+    },
+    {
+      value: PLUGIN_TYPE_SEARCH_MAP.agent,
+      text: t('plugin.category.agents'),
+      icon: <RiSpeakAiLine className='mr-1.5 h-4 w-4' />,
+    },
+    {
+      value: PLUGIN_TYPE_SEARCH_MAP.extension,
+      text: t('plugin.category.extensions'),
+      icon: <RiPuzzle2Line className='mr-1.5 h-4 w-4' />,
+    },
+    {
+      value: PLUGIN_TYPE_SEARCH_MAP.bundle,
+      text: t('plugin.category.bundles'),
+      icon: <RiArchive2Line className='mr-1.5 h-4 w-4' />,
+    },
+  ]
+
+  const handlePopState = useCallback(() => {
+    if (!showSearchParams)
+      return
+    const url = new URL(window.location.href)
+    const category = url.searchParams.get('category') || PLUGIN_TYPE_SEARCH_MAP.all
+    handleActivePluginTypeChange(category)
+  }, [showSearchParams, handleActivePluginTypeChange])
+
+  useEffect(() => {
+    window.addEventListener('popstate', () => {
+      handlePopState()
+    })
+    return () => {
+      window.removeEventListener('popstate', handlePopState)
+    }
+  }, [handlePopState])
+
+  return (
+    <div className={cn(
+      'flex shrink-0 items-center justify-center space-x-2 bg-background-body py-3',
+      searchBoxCanAnimate && 'sticky top-[56px] z-10',
+      className,
+    )}>
+      {
+        options.map(option => (
+          <div
+            key={option.value}
+            className={cn(
+              'system-md-medium flex h-8 cursor-pointer items-center rounded-xl border border-transparent px-3 text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
+              activePluginType === option.value && 'border-components-main-nav-nav-button-border !bg-components-main-nav-nav-button-bg-active !text-components-main-nav-nav-button-text-active shadow-xs',
+            )}
+            onClick={() => {
+              handleActivePluginTypeChange(option.value)
+            }}
+          >
+            {option.icon}
+            {option.text}
+          </div>
+        ))
+      }
+    </div>
+  )
+}
+
+export default PluginTypeSwitch
diff --git a/app/components/plugins/marketplace/search-box/index.tsx b/app/components/plugins/marketplace/search-box/index.tsx
new file mode 100644
index 0000000..2170078
--- /dev/null
+++ b/app/components/plugins/marketplace/search-box/index.tsx
@@ -0,0 +1,70 @@
+'use client'
+import { RiCloseLine } from '@remixicon/react'
+import TagsFilter from './tags-filter'
+import ActionButton from '@/app/components/base/action-button'
+import cn from '@/utils/classnames'
+
+type SearchBoxProps = {
+  search: string
+  onSearchChange: (search: string) => void
+  inputClassName?: string
+  tags: string[]
+  onTagsChange: (tags: string[]) => void
+  size?: 'small' | 'large'
+  placeholder?: string
+  locale?: string
+}
+const SearchBox = ({
+  search,
+  onSearchChange,
+  inputClassName,
+  tags,
+  onTagsChange,
+  size = 'small',
+  placeholder = '',
+  locale,
+}: SearchBoxProps) => {
+  return (
+    <div
+      className={cn(
+        'z-[11] flex items-center',
+        size === 'large' && 'rounded-xl border border-components-chat-input-border bg-components-panel-bg-blur p-1.5 shadow-md',
+        size === 'small' && 'rounded-lg bg-components-input-bg-normal p-0.5',
+        inputClassName,
+      )}
+    >
+      <TagsFilter
+        tags={tags}
+        onTagsChange={onTagsChange}
+        size={size}
+        locale={locale}
+      />
+      <div className='mx-1 h-3.5 w-[1px] bg-divider-regular'></div>
+      <div className='relative flex grow items-center p-1 pl-2'>
+        <div className='mr-2 flex w-full items-center'>
+          <input
+            className={cn(
+              'body-md-medium block grow appearance-none bg-transparent text-text-secondary outline-none',
+            )}
+            value={search}
+            onChange={(e) => {
+              onSearchChange(e.target.value)
+            }}
+            placeholder={placeholder}
+          />
+          {
+            search && (
+              <div className='absolute right-2 top-1/2 -translate-y-1/2'>
+                <ActionButton onClick={() => onSearchChange('')}>
+                  <RiCloseLine className='h-4 w-4' />
+                </ActionButton>
+              </div>
+            )
+          }
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default SearchBox
diff --git a/app/components/plugins/marketplace/search-box/search-box-wrapper.tsx b/app/components/plugins/marketplace/search-box/search-box-wrapper.tsx
new file mode 100644
index 0000000..772bd4c
--- /dev/null
+++ b/app/components/plugins/marketplace/search-box/search-box-wrapper.tsx
@@ -0,0 +1,45 @@
+'use client'
+
+import { useMarketplaceContext } from '../context'
+import {
+  useMixedTranslation,
+  useSearchBoxAutoAnimate,
+} from '../hooks'
+import SearchBox from './index'
+import cn from '@/utils/classnames'
+
+type SearchBoxWrapperProps = {
+  locale?: string
+  searchBoxAutoAnimate?: boolean
+}
+const SearchBoxWrapper = ({
+  locale,
+  searchBoxAutoAnimate,
+}: SearchBoxWrapperProps) => {
+  const { t } = useMixedTranslation(locale)
+  const intersected = useMarketplaceContext(v => v.intersected)
+  const searchPluginText = useMarketplaceContext(v => v.searchPluginText)
+  const handleSearchPluginTextChange = useMarketplaceContext(v => v.handleSearchPluginTextChange)
+  const filterPluginTags = useMarketplaceContext(v => v.filterPluginTags)
+  const handleFilterPluginTagsChange = useMarketplaceContext(v => v.handleFilterPluginTagsChange)
+  const { searchBoxCanAnimate } = useSearchBoxAutoAnimate(searchBoxAutoAnimate)
+
+  return (
+    <SearchBox
+      inputClassName={cn(
+        'z-[0] mx-auto w-[640px] shrink-0',
+        searchBoxCanAnimate && 'sticky top-3 z-[11]',
+        !intersected && searchBoxCanAnimate && 'w-[508px] transition-[width] duration-300',
+      )}
+      search={searchPluginText}
+      onSearchChange={handleSearchPluginTextChange}
+      tags={filterPluginTags}
+      onTagsChange={handleFilterPluginTagsChange}
+      size='large'
+      locale={locale}
+      placeholder={t('plugin.searchPlugins')}
+    />
+  )
+}
+
+export default SearchBoxWrapper
diff --git a/app/components/plugins/marketplace/search-box/tags-filter.tsx b/app/components/plugins/marketplace/search-box/tags-filter.tsx
new file mode 100644
index 0000000..edf50dc
--- /dev/null
+++ b/app/components/plugins/marketplace/search-box/tags-filter.tsx
@@ -0,0 +1,138 @@
+'use client'
+
+import { useState } from 'react'
+import {
+  RiArrowDownSLine,
+  RiCloseCircleFill,
+  RiFilter3Line,
+} from '@remixicon/react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Checkbox from '@/app/components/base/checkbox'
+import cn from '@/utils/classnames'
+import Input from '@/app/components/base/input'
+import { useTags } from '@/app/components/plugins/hooks'
+import { useMixedTranslation } from '@/app/components/plugins/marketplace/hooks'
+
+type TagsFilterProps = {
+  tags: string[]
+  onTagsChange: (tags: string[]) => void
+  size: 'small' | 'large'
+  locale?: string
+}
+const TagsFilter = ({
+  tags,
+  onTagsChange,
+  size,
+  locale,
+}: TagsFilterProps) => {
+  const { t } = useMixedTranslation(locale)
+  const [open, setOpen] = useState(false)
+  const [searchText, setSearchText] = useState('')
+  const { tags: options, tagsMap } = useTags(t)
+  const filteredOptions = options.filter(option => option.label.toLowerCase().includes(searchText.toLowerCase()))
+  const handleCheck = (id: string) => {
+    if (tags.includes(id))
+      onTagsChange(tags.filter((tag: string) => tag !== id))
+    else
+      onTagsChange([...tags, id])
+  }
+  const selectedTagsLength = tags.length
+
+  return (
+    <PortalToFollowElem
+      placement='bottom-start'
+      offset={{
+        mainAxis: 4,
+        crossAxis: -6,
+      }}
+      open={open}
+      onOpenChange={setOpen}
+    >
+      <PortalToFollowElemTrigger
+        className='shrink-0'
+        onClick={() => setOpen(v => !v)}
+      >
+        <div className={cn(
+          'flex cursor-pointer items-center rounded-lg text-text-tertiary hover:bg-state-base-hover',
+          size === 'large' && 'h-8 px-2 py-1',
+          size === 'small' && 'h-7 py-0.5 pl-1 pr-1.5 ',
+          selectedTagsLength && 'text-text-secondary',
+          open && 'bg-state-base-hover',
+        )}>
+          <div className='p-0.5'>
+            <RiFilter3Line className='h-4 w-4' />
+          </div>
+          <div className={cn(
+            'system-sm-medium flex items-center p-1',
+            size === 'large' && 'p-1',
+            size === 'small' && 'px-0.5 py-1',
+          )}>
+            {
+              !selectedTagsLength && t('pluginTags.allTags')
+            }
+            {
+              !!selectedTagsLength && tags.map(tag => tagsMap[tag].label).slice(0, 2).join(',')
+            }
+            {
+              selectedTagsLength > 2 && (
+                <div className='system-xs-medium ml-1 text-text-tertiary'>
+                  +{selectedTagsLength - 2}
+                </div>
+              )
+            }
+          </div>
+          {
+            !!selectedTagsLength && (
+              <RiCloseCircleFill
+                className='h-4 w-4 cursor-pointer text-text-quaternary'
+                onClick={() => onTagsChange([])}
+              />
+            )
+          }
+          {
+            !selectedTagsLength && (
+              <RiArrowDownSLine className='h-4 w-4' />
+            )
+          }
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[1000]'>
+        <div className='w-[240px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg'>
+          <div className='p-2 pb-1'>
+            <Input
+              showLeftIcon
+              value={searchText}
+              onChange={e => setSearchText(e.target.value)}
+              placeholder={t('pluginTags.searchTags') || ''}
+            />
+          </div>
+          <div className='max-h-[448px] overflow-y-auto p-1'>
+            {
+              filteredOptions.map(option => (
+                <div
+                  key={option.name}
+                  className='flex h-7 cursor-pointer items-center rounded-lg px-2 py-1.5 hover:bg-state-base-hover'
+                  onClick={() => handleCheck(option.name)}
+                >
+                  <Checkbox
+                    className='mr-1'
+                    checked={tags.includes(option.name)}
+                  />
+                  <div className='system-sm-medium px-1 text-text-secondary'>
+                    {option.label}
+                  </div>
+                </div>
+              ))
+            }
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default TagsFilter
diff --git a/app/components/plugins/marketplace/sort-dropdown/index.tsx b/app/components/plugins/marketplace/sort-dropdown/index.tsx
new file mode 100644
index 0000000..f78c506
--- /dev/null
+++ b/app/components/plugins/marketplace/sort-dropdown/index.tsx
@@ -0,0 +1,94 @@
+'use client'
+import { useState } from 'react'
+import {
+  RiArrowDownSLine,
+  RiCheckLine,
+} from '@remixicon/react'
+import { useMarketplaceContext } from '../context'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { useMixedTranslation } from '@/app/components/plugins/marketplace/hooks'
+
+type SortDropdownProps = {
+  locale?: string
+}
+const SortDropdown = ({
+  locale,
+}: SortDropdownProps) => {
+  const { t } = useMixedTranslation(locale)
+  const options = [
+    {
+      value: 'install_count',
+      order: 'DESC',
+      text: t('plugin.marketplace.sortOption.mostPopular'),
+    },
+    {
+      value: 'version_updated_at',
+      order: 'DESC',
+      text: t('plugin.marketplace.sortOption.recentlyUpdated'),
+    },
+    {
+      value: 'created_at',
+      order: 'DESC',
+      text: t('plugin.marketplace.sortOption.newlyReleased'),
+    },
+    {
+      value: 'created_at',
+      order: 'ASC',
+      text: t('plugin.marketplace.sortOption.firstReleased'),
+    },
+  ]
+  const sort = useMarketplaceContext(v => v.sort)
+  const handleSortChange = useMarketplaceContext(v => v.handleSortChange)
+  const [open, setOpen] = useState(false)
+  const selectedOption = options.find(option => option.value === sort.sortBy && option.order === sort.sortOrder)!
+
+  return (
+    <PortalToFollowElem
+      placement='bottom-start'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 0,
+      }}
+      open={open}
+      onOpenChange={setOpen}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+        <div className='flex h-8 cursor-pointer items-center rounded-lg bg-state-base-hover-alt px-2 pr-3'>
+          <span className='system-sm-regular mr-1 text-text-secondary'>
+            {t('plugin.marketplace.sortBy')}
+          </span>
+          <span className='system-sm-medium mr-1 text-text-primary'>
+            {selectedOption.text}
+          </span>
+          <RiArrowDownSLine className='h-4 w-4 text-text-tertiary' />
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent>
+        <div className='rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg backdrop-blur-sm'>
+          {
+            options.map(option => (
+              <div
+                key={`${option.value}-${option.order}`}
+                className='system-md-regular flex h-8 cursor-pointer items-center justify-between rounded-lg px-3 pr-2 text-text-primary hover:bg-components-panel-on-panel-item-bg-hover'
+                onClick={() => handleSortChange({ sortBy: option.value, sortOrder: option.order })}
+              >
+                {option.text}
+                {
+                  sort.sortBy === option.value && sort.sortOrder === option.order && (
+                    <RiCheckLine className='ml-2 h-4 w-4 text-text-accent' />
+                  )
+                }
+              </div>
+            ))
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default SortDropdown
diff --git a/app/components/plugins/marketplace/types.ts b/app/components/plugins/marketplace/types.ts
new file mode 100644
index 0000000..4145f69
--- /dev/null
+++ b/app/components/plugins/marketplace/types.ts
@@ -0,0 +1,59 @@
+import type { Plugin } from '../types'
+
+export type SearchParamsFromCollection = {
+  query?: string
+  sort_by?: string
+  sort_order?: string
+}
+
+export type MarketplaceCollection = {
+  name: string
+  label: Record<string, string>
+  description: Record<string, string>
+  rule: string
+  created_at: string
+  updated_at: string
+  searchable?: boolean
+  search_params?: SearchParamsFromCollection
+}
+
+export type MarketplaceCollectionsResponse = {
+  collections: MarketplaceCollection[]
+  total: number
+}
+
+export type MarketplaceCollectionPluginsResponse = {
+  plugins: Plugin[]
+  total: number
+}
+
+export type PluginsSearchParams = {
+  query: string
+  page?: number
+  pageSize?: number
+  sortBy?: string
+  sortOrder?: string
+  category?: string
+  tags?: string[]
+  exclude?: string[]
+  type?: 'plugin' | 'bundle'
+}
+
+export type PluginsSort = {
+  sortBy: string
+  sortOrder: string
+}
+
+export type CollectionsAndPluginsSearchParams = {
+  category?: string
+  condition?: string
+  exclude?: string[]
+  type?: 'plugin' | 'bundle'
+}
+
+export type SearchParams = {
+  language?: string
+  q?: string
+  tags?: string
+  category?: string
+}
diff --git a/app/components/plugins/marketplace/utils.ts b/app/components/plugins/marketplace/utils.ts
new file mode 100644
index 0000000..ef4822f
--- /dev/null
+++ b/app/components/plugins/marketplace/utils.ts
@@ -0,0 +1,147 @@
+import { PLUGIN_TYPE_SEARCH_MAP } from './plugin-type-switch'
+import type { Plugin } from '@/app/components/plugins/types'
+import { PluginType } from '@/app/components/plugins/types'
+import type {
+  CollectionsAndPluginsSearchParams,
+  MarketplaceCollection,
+  PluginsSearchParams,
+} from '@/app/components/plugins/marketplace/types'
+import {
+  MARKETPLACE_API_PREFIX,
+  MARKETPLACE_URL_PREFIX,
+} from '@/config'
+
+export const getPluginIconInMarketplace = (plugin: Plugin) => {
+  if (plugin.type === 'bundle')
+    return `${MARKETPLACE_API_PREFIX}/bundles/${plugin.org}/${plugin.name}/icon`
+  return `${MARKETPLACE_API_PREFIX}/plugins/${plugin.org}/${plugin.name}/icon`
+}
+
+export const getFormattedPlugin = (bundle: any) => {
+  if (bundle.type === 'bundle') {
+    return {
+      ...bundle,
+      icon: getPluginIconInMarketplace(bundle),
+      brief: bundle.description,
+      label: bundle.labels,
+    }
+  }
+  return {
+    ...bundle,
+    icon: getPluginIconInMarketplace(bundle),
+  }
+}
+
+export const getPluginLinkInMarketplace = (plugin: Plugin) => {
+  if (plugin.type === 'bundle')
+    return `${MARKETPLACE_URL_PREFIX}/bundles/${plugin.org}/${plugin.name}`
+  return `${MARKETPLACE_URL_PREFIX}/plugins/${plugin.org}/${plugin.name}`
+}
+
+export const getMarketplacePluginsByCollectionId = async (collectionId: string, query?: CollectionsAndPluginsSearchParams) => {
+  let plugins = [] as Plugin[]
+
+  try {
+    const url = `${MARKETPLACE_API_PREFIX}/collections/${collectionId}/plugins`
+    const marketplaceCollectionPluginsData = await globalThis.fetch(
+      url,
+      {
+        cache: 'no-store',
+        method: 'POST',
+        body: JSON.stringify({
+          category: query?.category,
+          exclude: query?.exclude,
+          type: query?.type,
+        }),
+      },
+    )
+    const marketplaceCollectionPluginsDataJson = await marketplaceCollectionPluginsData.json()
+    plugins = marketplaceCollectionPluginsDataJson.data.plugins.map((plugin: Plugin) => {
+      return getFormattedPlugin(plugin)
+    })
+  }
+  // eslint-disable-next-line unused-imports/no-unused-vars
+  catch (e) {
+    plugins = []
+  }
+
+  return plugins
+}
+
+export const getMarketplaceCollectionsAndPlugins = async (query?: CollectionsAndPluginsSearchParams) => {
+  let marketplaceCollections = [] as MarketplaceCollection[]
+  let marketplaceCollectionPluginsMap = {} as Record<string, Plugin[]>
+  try {
+    let marketplaceUrl = `${MARKETPLACE_API_PREFIX}/collections?page=1&page_size=100`
+    if (query?.condition)
+      marketplaceUrl += `&condition=${query.condition}`
+    if (query?.type)
+      marketplaceUrl += `&type=${query.type}`
+    const marketplaceCollectionsData = await globalThis.fetch(marketplaceUrl, { cache: 'no-store' })
+    const marketplaceCollectionsDataJson = await marketplaceCollectionsData.json()
+    marketplaceCollections = marketplaceCollectionsDataJson.data.collections
+    await Promise.all(marketplaceCollections.map(async (collection: MarketplaceCollection) => {
+      const plugins = await getMarketplacePluginsByCollectionId(collection.name, query)
+
+      marketplaceCollectionPluginsMap[collection.name] = plugins
+    }))
+  }
+  // eslint-disable-next-line unused-imports/no-unused-vars
+  catch (e) {
+    marketplaceCollections = []
+    marketplaceCollectionPluginsMap = {}
+  }
+
+  return {
+    marketplaceCollections,
+    marketplaceCollectionPluginsMap,
+  }
+}
+
+export const getMarketplaceListCondition = (pluginType: string) => {
+  if (pluginType === PluginType.tool)
+    return 'category=tool'
+
+  if (pluginType === PluginType.agent)
+    return 'category=agent-strategy'
+
+  if (pluginType === PluginType.model)
+    return 'category=model'
+
+  if (pluginType === PluginType.extension)
+    return 'category=endpoint'
+
+  if (pluginType === 'bundle')
+    return 'type=bundle'
+
+  return ''
+}
+
+export const getMarketplaceListFilterType = (category: string) => {
+  if (category === PLUGIN_TYPE_SEARCH_MAP.all)
+    return undefined
+
+  if (category === PLUGIN_TYPE_SEARCH_MAP.bundle)
+    return 'bundle'
+
+  return 'plugin'
+}
+
+export const updateSearchParams = (pluginsSearchParams: PluginsSearchParams) => {
+  const { query, category, tags } = pluginsSearchParams
+  const url = new URL(window.location.href)
+  const categoryChanged = url.searchParams.get('category') !== category
+  if (query)
+    url.searchParams.set('q', query)
+  else
+    url.searchParams.delete('q')
+  if (category)
+    url.searchParams.set('category', category)
+  else
+    url.searchParams.delete('category')
+  if (tags && tags.length)
+    url.searchParams.set('tags', tags.join(','))
+  else
+    url.searchParams.delete('tags')
+  history[`${categoryChanged ? 'pushState' : 'replaceState'}`]({}, '', url)
+}
diff --git a/app/components/plugins/permission-setting-modal/modal.tsx b/app/components/plugins/permission-setting-modal/modal.tsx
new file mode 100644
index 0000000..f56c079
--- /dev/null
+++ b/app/components/plugins/permission-setting-modal/modal.tsx
@@ -0,0 +1,93 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import Modal from '@/app/components/base/modal'
+import OptionCard from '@/app/components/workflow/nodes/_base/components/option-card'
+import Button from '@/app/components/base/button'
+import type { Permissions } from '@/app/components/plugins/types'
+import { PermissionType } from '@/app/components/plugins/types'
+
+const i18nPrefix = 'plugin.privilege'
+type Props = {
+  payload: Permissions
+  onHide: () => void
+  onSave: (payload: Permissions) => void
+}
+
+const PluginSettingModal: FC<Props> = ({
+  payload,
+  onHide,
+  onSave,
+}) => {
+  const { t } = useTranslation()
+  const [tempPrivilege, setTempPrivilege] = useState<Permissions>(payload)
+  const handlePrivilegeChange = useCallback((key: string) => {
+    return (value: PermissionType) => {
+      setTempPrivilege({
+        ...tempPrivilege,
+        [key]: value,
+      })
+    }
+  }, [tempPrivilege])
+
+  const handleSave = useCallback(async () => {
+    await onSave(tempPrivilege)
+    onHide()
+  }, [onHide, onSave, tempPrivilege])
+
+  return (
+    <Modal
+      isShow
+      onClose={onHide}
+      closable
+      className='w-[420px] !p-0'
+    >
+      <div className='shadows-shadow-xl flex w-[420px] flex-col items-start rounded-2xl border border-components-panel-border bg-components-panel-bg'>
+        <div className='flex items-start gap-2 self-stretch pb-3 pl-6 pr-14 pt-6'>
+          <span className='title-2xl-semi-bold self-stretch text-text-primary'>{t(`${i18nPrefix}.title`)}</span>
+        </div>
+        <div className='flex flex-col items-start justify-center gap-4 self-stretch px-6 py-3'>
+          {[
+            { title: t(`${i18nPrefix}.whoCanInstall`), key: 'install_permission', value: tempPrivilege.install_permission },
+            { title: t(`${i18nPrefix}.whoCanDebug`), key: 'debug_permission', value: tempPrivilege.debug_permission },
+          ].map(({ title, key, value }) => (
+            <div key={key} className='flex flex-col items-start gap-1 self-stretch'>
+              <div className='flex h-6 items-center gap-0.5'>
+                <span className='system-sm-semibold text-text-secondary'>{title}</span>
+              </div>
+              <div className='flex w-full items-start justify-between gap-2'>
+                {[PermissionType.everyone, PermissionType.admin, PermissionType.noOne].map(option => (
+                  <OptionCard
+                    key={option}
+                    title={t(`${i18nPrefix}.${option}`)}
+                    onSelect={() => handlePrivilegeChange(key)(option)}
+                    selected={value === option}
+                    className="flex-1"
+                  />
+                ))}
+              </div>
+            </div>
+          ))}
+        </div>
+        <div className='flex h-[76px] items-center justify-end gap-2 self-stretch p-6 pt-5'>
+          <Button
+            className='min-w-[72px]'
+            onClick={onHide}
+          >
+            {t('common.operation.cancel')}
+          </Button>
+          <Button
+            className='min-w-[72px]'
+            variant={'primary'}
+            onClick={handleSave}
+          >
+            {t('common.operation.save')}
+          </Button>
+        </div>
+      </div>
+    </Modal>
+  )
+}
+
+export default React.memo(PluginSettingModal)
diff --git a/app/components/plugins/permission-setting-modal/style.module.css b/app/components/plugins/permission-setting-modal/style.module.css
new file mode 100644
index 0000000..15bedd8
--- /dev/null
+++ b/app/components/plugins/permission-setting-modal/style.module.css
@@ -0,0 +1,7 @@
+.textGradient {
+  background: linear-gradient(92deg, #2250F2 -29.55%, #0EBCF3 75.22%);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+  text-fill-color: transparent;
+}
diff --git a/app/components/plugins/plugin-detail-panel/action-list.tsx b/app/components/plugins/plugin-detail-panel/action-list.tsx
new file mode 100644
index 0000000..eb47ce3
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/action-list.tsx
@@ -0,0 +1,112 @@
+import React, { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useAppContext } from '@/context/app-context'
+import Button from '@/app/components/base/button'
+import Toast from '@/app/components/base/toast'
+import Indicator from '@/app/components/header/indicator'
+import ToolItem from '@/app/components/tools/provider/tool-item'
+import ConfigCredential from '@/app/components/tools/setting/build-in/config-credentials'
+import {
+  useAllToolProviders,
+  useBuiltinTools,
+  useInvalidateAllToolProviders,
+  useRemoveProviderCredentials,
+  useUpdateProviderCredentials,
+} from '@/service/use-tools'
+import type { PluginDetail } from '@/app/components/plugins/types'
+
+type Props = {
+  detail: PluginDetail
+}
+
+const ActionList = ({
+  detail,
+}: Props) => {
+  const { t } = useTranslation()
+  const { isCurrentWorkspaceManager } = useAppContext()
+  const providerBriefInfo = detail.declaration.tool.identity
+  const providerKey = `${detail.plugin_id}/${providerBriefInfo.name}`
+  const { data: collectionList = [] } = useAllToolProviders()
+  const invalidateAllToolProviders = useInvalidateAllToolProviders()
+  const provider = useMemo(() => {
+    return collectionList.find(collection => collection.name === providerKey)
+  }, [collectionList, providerKey])
+  const { data } = useBuiltinTools(providerKey)
+
+  const [showSettingAuth, setShowSettingAuth] = useState(false)
+
+  const handleCredentialSettingUpdate = () => {
+    invalidateAllToolProviders()
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+    setShowSettingAuth(false)
+  }
+
+  const { mutate: updatePermission, isPending } = useUpdateProviderCredentials({
+    onSuccess: handleCredentialSettingUpdate,
+  })
+
+  const { mutate: removePermission } = useRemoveProviderCredentials({
+    onSuccess: handleCredentialSettingUpdate,
+  })
+
+  if (!data || !provider)
+    return null
+
+  return (
+    <div className='px-4 pb-4 pt-2'>
+      <div className='mb-1 py-1'>
+        <div className='system-sm-semibold-uppercase mb-1 flex h-6 items-center justify-between text-text-secondary'>
+          {t('plugin.detailPanel.actionNum', { num: data.length, action: data.length > 1 ? 'actions' : 'action' })}
+          {provider.is_team_authorization && provider.allow_delete && (
+            <Button
+              variant='secondary'
+              size='small'
+              onClick={() => setShowSettingAuth(true)}
+              disabled={!isCurrentWorkspaceManager}
+            >
+              <Indicator className='mr-2' color={'green'} />
+              {t('tools.auth.authorized')}
+            </Button>
+          )}
+        </div>
+        {!provider.is_team_authorization && provider.allow_delete && (
+          <Button
+            variant='primary'
+            className='w-full'
+            onClick={() => setShowSettingAuth(true)}
+            disabled={!isCurrentWorkspaceManager}
+          >{t('tools.auth.unauthorized')}</Button>
+        )}
+      </div>
+      <div className='flex flex-col gap-2'>
+        {data.map(tool => (
+          <ToolItem
+            key={`${detail.plugin_id}${tool.name}`}
+            disabled={false}
+            collection={provider}
+            tool={tool}
+            isBuiltIn={true}
+            isModel={false}
+          />
+        ))}
+      </div>
+      {showSettingAuth && (
+        <ConfigCredential
+          collection={provider}
+          onCancel={() => setShowSettingAuth(false)}
+          onSaved={async value => updatePermission({
+            providerName: provider.name,
+            credentials: value,
+          })}
+          onRemove={async () => removePermission(provider.name)}
+          isSaving={isPending}
+        />
+      )}
+    </div>
+  )
+}
+
+export default ActionList
diff --git a/app/components/plugins/plugin-detail-panel/agent-strategy-list.tsx b/app/components/plugins/plugin-detail-panel/agent-strategy-list.tsx
new file mode 100644
index 0000000..4c5153d
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/agent-strategy-list.tsx
@@ -0,0 +1,58 @@
+import React, { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import StrategyItem from '@/app/components/plugins/plugin-detail-panel/strategy-item'
+import {
+  useStrategyProviderDetail,
+} from '@/service/use-strategy'
+import type { PluginDetail } from '@/app/components/plugins/types'
+
+type Props = {
+  detail: PluginDetail
+}
+
+const AgentStrategyList = ({
+  detail,
+}: Props) => {
+  const { t } = useTranslation()
+  const providerBriefInfo = detail.declaration.agent_strategy.identity
+  const providerKey = `${detail.plugin_id}/${providerBriefInfo.name}`
+  const { data: strategyProviderDetail } = useStrategyProviderDetail(providerKey)
+
+  const providerDetail = useMemo(() => {
+    return {
+      ...strategyProviderDetail?.declaration.identity,
+      tenant_id: detail.tenant_id,
+    }
+  }, [detail.tenant_id, strategyProviderDetail?.declaration.identity])
+
+  const strategyList = useMemo(() => {
+    if (!strategyProviderDetail)
+      return []
+
+    return strategyProviderDetail.declaration.strategies
+  }, [strategyProviderDetail])
+
+  if (!strategyProviderDetail)
+    return null
+
+  return (
+    <div className='px-4 pb-4 pt-2'>
+      <div className='mb-1 py-1'>
+        <div className='system-sm-semibold-uppercase mb-1 flex h-6 items-center justify-between text-text-secondary'>
+          {t('plugin.detailPanel.strategyNum', { num: strategyList.length, strategy: strategyList.length > 1 ? 'strategies' : 'strategy' })}
+        </div>
+      </div>
+      <div className='flex flex-col gap-2'>
+        {strategyList.map(strategyDetail => (
+          <StrategyItem
+            key={`${strategyDetail.identity.provider}${strategyDetail.identity.name}`}
+            provider={providerDetail as any}
+            detail={strategyDetail}
+          />
+        ))}
+      </div>
+    </div>
+  )
+}
+
+export default AgentStrategyList
diff --git a/app/components/plugins/plugin-detail-panel/app-selector/app-inputs-form.tsx b/app/components/plugins/plugin-detail-panel/app-selector/app-inputs-form.tsx
new file mode 100644
index 0000000..edab648
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/app-selector/app-inputs-form.tsx
@@ -0,0 +1,125 @@
+import { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import { PortalSelect } from '@/app/components/base/select'
+import { InputVarType } from '@/app/components/workflow/types'
+import { FileUploaderInAttachmentWrapper } from '@/app/components/base/file-uploader'
+
+type Props = {
+  inputsForms: any[]
+  inputs: Record<string, any>
+  inputsRef: any
+  onFormChange: (value: Record<string, any>) => void
+}
+const AppInputsForm = ({
+  inputsForms,
+  inputs,
+  inputsRef,
+  onFormChange,
+}: Props) => {
+  const { t } = useTranslation()
+
+  const handleFormChange = useCallback((variable: string, value: any) => {
+    onFormChange({
+      ...inputsRef.current,
+      [variable]: value,
+    })
+  }, [onFormChange, inputsRef])
+
+  const renderField = (form: any) => {
+    const {
+      label,
+      variable,
+      options,
+    } = form
+    if (form.type === InputVarType.textInput) {
+      return (
+        <Input
+          value={inputs[variable] || ''}
+          onChange={e => handleFormChange(variable, e.target.value)}
+          placeholder={label}
+        />
+      )
+    }
+    if (form.type === InputVarType.number) {
+      return (
+        <Input
+          type="number"
+          value={inputs[variable] || ''}
+          onChange={e => handleFormChange(variable, e.target.value)}
+          placeholder={label}
+        />
+      )
+    }
+    if (form.type === InputVarType.paragraph) {
+      return (
+        <Textarea
+          value={inputs[variable] || ''}
+          onChange={e => handleFormChange(variable, e.target.value)}
+          placeholder={label}
+        />
+      )
+    }
+    if (form.type === InputVarType.select) {
+      return (
+        <PortalSelect
+          popupClassName="w-[356px] z-[1050]"
+          value={inputs[variable] || ''}
+          items={options.map((option: string) => ({ value: option, name: option }))}
+          onSelect={item => handleFormChange(variable, item.value as string)}
+          placeholder={label}
+        />
+      )
+    }
+    if (form.type === InputVarType.singleFile) {
+      return (
+        <FileUploaderInAttachmentWrapper
+          value={inputs[variable] ? [inputs[variable]] : []}
+          onChange={files => handleFormChange(variable, files[0])}
+          fileConfig={{
+            allowed_file_types: form.allowed_file_types,
+            allowed_file_extensions: form.allowed_file_extensions,
+            allowed_file_upload_methods: form.allowed_file_upload_methods,
+            number_limits: 1,
+            fileUploadConfig: (form as any).fileUploadConfig,
+          }}
+        />
+      )
+    }
+    if (form.type === InputVarType.multiFiles) {
+      return (
+        <FileUploaderInAttachmentWrapper
+          value={inputs[variable]}
+          onChange={files => handleFormChange(variable, files)}
+          fileConfig={{
+            allowed_file_types: form.allowed_file_types,
+            allowed_file_extensions: form.allowed_file_extensions,
+            allowed_file_upload_methods: form.allowed_file_upload_methods,
+            number_limits: form.max_length,
+            fileUploadConfig: (form as any).fileUploadConfig,
+          }}
+        />
+      )
+    }
+  }
+
+  if (!inputsForms.length)
+    return null
+
+  return (
+    <div className='flex flex-col gap-4 px-4 py-2'>
+      {inputsForms.map(form => (
+        <div key={form.variable}>
+          <div className='system-sm-semibold mb-1 flex h-6 items-center gap-1 text-text-secondary'>
+            <div className='truncate'>{form.label}</div>
+            {!form.required && <span className='system-xs-regular text-text-tertiary'>{t('workflow.panel.optional')}</span>}
+          </div>
+          {renderField(form)}
+        </div>
+      ))}
+    </div>
+  )
+}
+
+export default AppInputsForm
diff --git a/app/components/plugins/plugin-detail-panel/app-selector/app-inputs-panel.tsx b/app/components/plugins/plugin-detail-panel/app-selector/app-inputs-panel.tsx
new file mode 100644
index 0000000..b22f59f
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/app-selector/app-inputs-panel.tsx
@@ -0,0 +1,180 @@
+'use client'
+import React, { useMemo, useRef } from 'react'
+import { useTranslation } from 'react-i18next'
+import Loading from '@/app/components/base/loading'
+import AppInputsForm from '@/app/components/plugins/plugin-detail-panel/app-selector/app-inputs-form'
+import { useAppDetail } from '@/service/use-apps'
+import { useAppWorkflow } from '@/service/use-workflow'
+import { useFileUploadConfig } from '@/service/use-common'
+import { Resolution } from '@/types/app'
+import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'
+import type { App } from '@/types/app'
+import type { FileUpload } from '@/app/components/base/features/types'
+import { BlockEnum, InputVarType, SupportUploadFileTypes } from '@/app/components/workflow/types'
+
+import cn from '@/utils/classnames'
+
+type Props = {
+  value?: {
+    app_id: string
+    inputs: Record<string, any>
+  }
+  appDetail: App
+  onFormChange: (value: Record<string, any>) => void
+}
+
+const AppInputsPanel = ({
+  value,
+  appDetail,
+  onFormChange,
+}: Props) => {
+  const { t } = useTranslation()
+  const inputsRef = useRef<any>(value?.inputs || {})
+  const isBasicApp = appDetail.mode !== 'advanced-chat' && appDetail.mode !== 'workflow'
+  const { data: fileUploadConfig } = useFileUploadConfig()
+  const { data: currentApp, isFetching: isAppLoading } = useAppDetail(appDetail.id)
+  const { data: currentWorkflow, isFetching: isWorkflowLoading } = useAppWorkflow(isBasicApp ? '' : appDetail.id)
+  const isLoading = isAppLoading || isWorkflowLoading
+
+  const basicAppFileConfig = useMemo(() => {
+    let fileConfig: FileUpload
+    if (isBasicApp)
+      fileConfig = currentApp?.model_config?.file_upload as FileUpload
+    else
+      fileConfig = currentWorkflow?.features?.file_upload as FileUpload
+    return {
+      image: {
+        detail: fileConfig?.image?.detail || Resolution.high,
+        enabled: !!fileConfig?.image?.enabled,
+        number_limits: fileConfig?.image?.number_limits || 3,
+        transfer_methods: fileConfig?.image?.transfer_methods || ['local_file', 'remote_url'],
+      },
+      enabled: !!(fileConfig?.enabled || fileConfig?.image?.enabled),
+      allowed_file_types: fileConfig?.allowed_file_types || [SupportUploadFileTypes.image],
+      allowed_file_extensions: fileConfig?.allowed_file_extensions || [...FILE_EXTS[SupportUploadFileTypes.image]].map(ext => `.${ext}`),
+      allowed_file_upload_methods: fileConfig?.allowed_file_upload_methods || fileConfig?.image?.transfer_methods || ['local_file', 'remote_url'],
+      number_limits: fileConfig?.number_limits || fileConfig?.image?.number_limits || 3,
+    }
+  }, [currentApp?.model_config?.file_upload, currentWorkflow?.features?.file_upload, isBasicApp])
+
+  const inputFormSchema = useMemo(() => {
+    if (!currentApp)
+      return []
+    let inputFormSchema = []
+    if (isBasicApp) {
+      inputFormSchema = currentApp.model_config.user_input_form.filter((item: any) => !item.external_data_tool).map((item: any) => {
+        if (item.paragraph) {
+          return {
+            ...item.paragraph,
+            type: 'paragraph',
+            required: false,
+          }
+        }
+        if (item.number) {
+          return {
+            ...item.number,
+            type: 'number',
+            required: false,
+          }
+        }
+        if (item.select) {
+          return {
+            ...item.select,
+            type: 'select',
+            required: false,
+          }
+        }
+
+        if (item['file-list']) {
+          return {
+            ...item['file-list'],
+            type: 'file-list',
+            required: false,
+            fileUploadConfig,
+          }
+        }
+
+        if (item.file) {
+          return {
+            ...item.file,
+            type: 'file',
+            required: false,
+            fileUploadConfig,
+          }
+        }
+
+        return {
+          ...item['text-input'],
+          type: 'text-input',
+          required: false,
+        }
+      })
+    }
+    else {
+      const startNode = currentWorkflow?.graph.nodes.find(node => node.data.type === BlockEnum.Start) as any
+      inputFormSchema = startNode?.data.variables.map((variable: any) => {
+        if (variable.type === InputVarType.multiFiles) {
+          return {
+            ...variable,
+            required: false,
+            fileUploadConfig,
+          }
+        }
+
+        if (variable.type === InputVarType.singleFile) {
+          return {
+            ...variable,
+            required: false,
+            fileUploadConfig,
+          }
+        }
+        return {
+          ...variable,
+          required: false,
+        }
+      })
+    }
+    if ((currentApp.mode === 'completion' || currentApp.mode === 'workflow') && basicAppFileConfig.enabled) {
+      inputFormSchema.push({
+        label: 'Image Upload',
+        variable: '#image#',
+        type: InputVarType.singleFile,
+        required: false,
+        ...basicAppFileConfig,
+        fileUploadConfig,
+      })
+    }
+    return inputFormSchema
+  }, [basicAppFileConfig, currentApp, currentWorkflow, fileUploadConfig, isBasicApp])
+
+  const handleFormChange = (value: Record<string, any>) => {
+    inputsRef.current = value
+    onFormChange(value)
+  }
+
+  return (
+    <div className={cn('flex max-h-[240px] flex-col rounded-b-2xl border-t border-divider-subtle pb-4')}>
+      {isLoading && <div className='pt-3'><Loading type='app' /></div>}
+      {!isLoading && (
+        <div className='system-sm-semibold mb-2 mt-3 flex h-6 shrink-0 items-center px-4 text-text-secondary'>{t('app.appSelector.params')}</div>
+      )}
+      {!isLoading && !inputFormSchema.length && (
+        <div className='flex h-16 flex-col items-center justify-center'>
+          <div className='system-sm-regular text-text-tertiary'>{t('app.appSelector.noParams')}</div>
+        </div>
+      )}
+      {!isLoading && !!inputFormSchema.length && (
+        <div className='grow overflow-y-auto'>
+          <AppInputsForm
+            inputs={value?.inputs || {}}
+            inputsRef={inputsRef}
+            inputsForms={inputFormSchema}
+            onFormChange={handleFormChange}
+          />
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default AppInputsPanel
diff --git a/app/components/plugins/plugin-detail-panel/app-selector/app-picker.tsx b/app/components/plugins/plugin-detail-panel/app-selector/app-picker.tsx
new file mode 100644
index 0000000..2f57276
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/app-selector/app-picker.tsx
@@ -0,0 +1,123 @@
+'use client'
+import type { FC } from 'react'
+import React, { useMemo } from 'react'
+import { useState } from 'react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import type {
+  OffsetOptions,
+  Placement,
+} from '@floating-ui/react'
+import Input from '@/app/components/base/input'
+import AppIcon from '@/app/components/base/app-icon'
+import type { App } from '@/types/app'
+
+type Props = {
+  appList: App[]
+  scope: string
+  disabled: boolean
+  trigger: React.ReactNode
+  placement?: Placement
+  offset?: OffsetOptions
+  isShow: boolean
+  onShowChange: (isShow: boolean) => void
+  onSelect: (app: App) => void
+}
+
+const AppPicker: FC<Props> = ({
+  scope,
+  appList,
+  disabled,
+  trigger,
+  placement = 'right-start',
+  offset = 0,
+  isShow,
+  onShowChange,
+  onSelect,
+}) => {
+  const [searchText, setSearchText] = useState('')
+  const filteredAppList = useMemo(() => {
+    return (appList || [])
+      .filter(app => app.name.toLowerCase().includes(searchText.toLowerCase()))
+      .filter(app => (app.mode !== 'advanced-chat' && app.mode !== 'workflow') || !!app.workflow)
+      .filter(app => scope === 'all'
+      || (scope === 'completion' && app.mode === 'completion')
+      || (scope === 'workflow' && app.mode === 'workflow')
+      || (scope === 'chat' && app.mode === 'advanced-chat')
+      || (scope === 'chat' && app.mode === 'agent-chat')
+      || (scope === 'chat' && app.mode === 'chat'))
+  }, [appList, scope, searchText])
+  const getAppType = (app: App) => {
+    switch (app.mode) {
+      case 'advanced-chat':
+        return 'chatflow'
+      case 'agent-chat':
+        return 'agent'
+      case 'chat':
+        return 'chat'
+      case 'completion':
+        return 'completion'
+      case 'workflow':
+        return 'workflow'
+    }
+  }
+
+  const handleTriggerClick = () => {
+    if (disabled) return
+    onShowChange(true)
+  }
+
+  return (
+    <PortalToFollowElem
+      placement={placement}
+      offset={offset}
+      open={isShow}
+      onOpenChange={onShowChange}
+    >
+      <PortalToFollowElemTrigger
+        onClick={handleTriggerClick}
+      >
+        {trigger}
+      </PortalToFollowElemTrigger>
+
+      <PortalToFollowElemContent className='z-[1000]'>
+        <div className="relative min-h-20 w-[356px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg backdrop-blur-sm">
+          <div className='p-2 pb-1'>
+            <Input
+              showLeftIcon
+              showClearIcon
+              value={searchText}
+              onChange={e => setSearchText(e.target.value)}
+              onClear={() => setSearchText('')}
+            />
+          </div>
+          <div className='p-1'>
+            {filteredAppList.map(app => (
+              <div
+                key={app.id}
+                className='flex cursor-pointer items-center gap-3 rounded-lg py-1 pl-2 pr-3 hover:bg-state-base-hover'
+                onClick={() => onSelect(app)}
+              >
+                <AppIcon
+                  className='shrink-0'
+                  size='xs'
+                  iconType={app.icon_type}
+                  icon={app.icon}
+                  background={app.icon_background}
+                  imageUrl={app.icon_url}
+                />
+                <div title={app.name} className='system-sm-medium grow text-components-input-text-filled'>{app.name}</div>
+                <div className='system-2xs-medium-uppercase shrink-0 text-text-tertiary'>{getAppType(app)}</div>
+              </div>
+            ))}
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default React.memo(AppPicker)
diff --git a/app/components/plugins/plugin-detail-panel/app-selector/app-trigger.tsx b/app/components/plugins/plugin-detail-panel/app-selector/app-trigger.tsx
new file mode 100644
index 0000000..d2c11f0
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/app-selector/app-trigger.tsx
@@ -0,0 +1,48 @@
+'use client'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowDownSLine,
+} from '@remixicon/react'
+import AppIcon from '@/app/components/base/app-icon'
+import type { App } from '@/types/app'
+import cn from '@/utils/classnames'
+
+type Props = {
+  open: boolean
+  appDetail?: App
+}
+
+const AppTrigger = ({
+  open,
+  appDetail,
+}: Props) => {
+  const { t } = useTranslation()
+  return (
+    <div className={cn(
+      'group flex cursor-pointer items-center rounded-lg bg-components-input-bg-normal p-2 pl-3 hover:bg-state-base-hover-alt',
+      open && 'bg-state-base-hover-alt',
+      appDetail && 'py-1.5 pl-1.5',
+    )}>
+      {appDetail && (
+        <AppIcon
+          className='mr-2'
+          size='xs'
+          iconType={appDetail.icon_type}
+          icon={appDetail.icon}
+          background={appDetail.icon_background}
+          imageUrl={appDetail.icon_url}
+        />
+      )}
+      {appDetail && (
+        <div title={appDetail.name} className='system-sm-medium grow text-components-input-text-filled'>{appDetail.name}</div>
+      )}
+      {!appDetail && (
+        <div className='system-sm-regular grow truncate text-components-input-text-placeholder'>{t('app.appSelector.placeholder')}</div>
+      )}
+      <RiArrowDownSLine className={cn('ml-0.5 h-4 w-4 shrink-0 text-text-quaternary group-hover:text-text-secondary', open && 'text-text-secondary')} />
+    </div>
+  )
+}
+
+export default AppTrigger
diff --git a/app/components/plugins/plugin-detail-panel/app-selector/index.tsx b/app/components/plugins/plugin-detail-panel/app-selector/index.tsx
new file mode 100644
index 0000000..39ca957
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/app-selector/index.tsx
@@ -0,0 +1,143 @@
+'use client'
+import type { FC } from 'react'
+import React, { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import AppTrigger from '@/app/components/plugins/plugin-detail-panel/app-selector/app-trigger'
+import AppPicker from '@/app/components/plugins/plugin-detail-panel/app-selector/app-picker'
+import AppInputsPanel from '@/app/components/plugins/plugin-detail-panel/app-selector/app-inputs-panel'
+import { useAppFullList } from '@/service/use-apps'
+import type { App } from '@/types/app'
+import type {
+  OffsetOptions,
+  Placement,
+} from '@floating-ui/react'
+
+type Props = {
+  value?: {
+    app_id: string
+    inputs: Record<string, any>
+    files?: any[]
+  }
+  scope?: string
+  disabled?: boolean
+  placement?: Placement
+  offset?: OffsetOptions
+  onSelect: (app: {
+    app_id: string
+    inputs: Record<string, any>
+    files?: any[]
+  }) => void
+  supportAddCustomTool?: boolean
+}
+const AppSelector: FC<Props> = ({
+  value,
+  scope,
+  disabled,
+  placement = 'bottom',
+  offset = 4,
+  onSelect,
+}) => {
+  const { t } = useTranslation()
+  const [isShow, onShowChange] = useState(false)
+  const handleTriggerClick = () => {
+    if (disabled) return
+    onShowChange(true)
+  }
+
+  const { data: appList } = useAppFullList()
+  const currentAppInfo = useMemo(() => {
+    if (!appList?.data || !value)
+      return undefined
+    return appList.data.find(app => app.id === value.app_id)
+  }, [appList?.data, value])
+
+  const [isShowChooseApp, setIsShowChooseApp] = useState(false)
+  const handleSelectApp = (app: App) => {
+    const clearValue = app.id !== value?.app_id
+    const appValue = {
+      app_id: app.id,
+      inputs: clearValue ? {} : value?.inputs || {},
+      files: clearValue ? [] : value?.files || [],
+    }
+    onSelect(appValue)
+    setIsShowChooseApp(false)
+  }
+  const handleFormChange = (inputs: Record<string, any>) => {
+    const newFiles = inputs['#image#']
+    delete inputs['#image#']
+    const newValue = {
+      app_id: value?.app_id || '',
+      inputs,
+      files: newFiles ? [newFiles] : value?.files || [],
+    }
+    onSelect(newValue)
+  }
+
+  const formattedValue = useMemo(() => {
+    return {
+      app_id: value?.app_id || '',
+      inputs: {
+        ...value?.inputs,
+        ...(value?.files?.length ? { '#image#': value.files[0] } : {}),
+      },
+    }
+  }, [value])
+
+  return (
+    <>
+      <PortalToFollowElem
+        placement={placement}
+        offset={offset}
+        open={isShow}
+        onOpenChange={onShowChange}
+      >
+        <PortalToFollowElemTrigger
+          className='w-full'
+          onClick={handleTriggerClick}
+        >
+          <AppTrigger
+            open={isShow}
+            appDetail={currentAppInfo}
+          />
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[1000]'>
+          <div className="relative min-h-20 w-[389px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg backdrop-blur-sm">
+            <div className='flex flex-col gap-1 px-4 py-3'>
+              <div className='system-sm-semibold flex h-6 items-center text-text-secondary'>{t('app.appSelector.label')}</div>
+              <AppPicker
+                placement='bottom'
+                offset={offset}
+                trigger={
+                  <AppTrigger
+                    open={isShowChooseApp}
+                    appDetail={currentAppInfo}
+                  />
+                }
+                isShow={isShowChooseApp}
+                onShowChange={setIsShowChooseApp}
+                disabled={false}
+                appList={appList?.data || []}
+                onSelect={handleSelectApp}
+                scope={scope || 'all'}
+              />
+            </div>
+            {/* app inputs config panel */}
+            {currentAppInfo && (
+              <AppInputsPanel
+                value={formattedValue}
+                appDetail={currentAppInfo}
+                onFormChange={handleFormChange}
+              />
+            )}
+          </div>
+        </PortalToFollowElemContent>
+      </PortalToFollowElem>
+    </>
+  )
+}
+export default React.memo(AppSelector)
diff --git a/app/components/plugins/plugin-detail-panel/detail-header.tsx b/app/components/plugins/plugin-detail-panel/detail-header.tsx
new file mode 100644
index 0000000..7548c90
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/detail-header.tsx
@@ -0,0 +1,312 @@
+import React, { useCallback, useMemo, useState } from 'react'
+import { useTheme } from 'next-themes'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import {
+  RiArrowLeftRightLine,
+  RiBugLine,
+  RiCloseLine,
+  RiHardDrive3Line,
+  RiVerifiedBadgeLine,
+} from '@remixicon/react'
+import type { PluginDetail } from '../types'
+import { PluginSource, PluginType } from '../types'
+import Description from '../card/base/description'
+import Icon from '../card/base/card-icon'
+import Title from '../card/base/title'
+import OrgInfo from '../card/base/org-info'
+import { useGitHubReleases } from '../install-plugin/hooks'
+import PluginVersionPicker from '@/app/components/plugins/update-plugin/plugin-version-picker'
+import UpdateFromMarketplace from '@/app/components/plugins/update-plugin/from-market-place'
+import OperationDropdown from '@/app/components/plugins/plugin-detail-panel/operation-dropdown'
+import PluginInfo from '@/app/components/plugins/plugin-page/plugin-info'
+import ActionButton from '@/app/components/base/action-button'
+import Button from '@/app/components/base/button'
+import Badge from '@/app/components/base/badge'
+import Confirm from '@/app/components/base/confirm'
+import Tooltip from '@/app/components/base/tooltip'
+import Toast from '@/app/components/base/toast'
+import { BoxSparkleFill } from '@/app/components/base/icons/src/vender/plugin'
+import { Github } from '@/app/components/base/icons/src/public/common'
+import { uninstallPlugin } from '@/service/plugins'
+import { useGetLanguage } from '@/context/i18n'
+import { useModalContext } from '@/context/modal-context'
+import { useProviderContext } from '@/context/provider-context'
+import { useInvalidateAllToolProviders } from '@/service/use-tools'
+import { API_PREFIX, MARKETPLACE_URL_PREFIX } from '@/config'
+import cn from '@/utils/classnames'
+
+const i18nPrefix = 'plugin.action'
+
+type Props = {
+  detail: PluginDetail
+  onHide: () => void
+  onUpdate: (isDelete?: boolean) => void
+}
+
+const DetailHeader = ({
+  detail,
+  onHide,
+  onUpdate,
+}: Props) => {
+  const { t } = useTranslation()
+  const { theme } = useTheme()
+  const locale = useGetLanguage()
+  const { checkForUpdates, fetchReleases } = useGitHubReleases()
+  const { setShowUpdatePluginModal } = useModalContext()
+  const { refreshModelProviders } = useProviderContext()
+  const invalidateAllToolProviders = useInvalidateAllToolProviders()
+
+  const {
+    installation_id,
+    source,
+    tenant_id,
+    version,
+    latest_unique_identifier,
+    latest_version,
+    meta,
+    plugin_id,
+  } = detail
+  const { author, category, name, label, description, icon, verified } = detail.declaration
+  const isFromGitHub = source === PluginSource.github
+  const isFromMarketplace = source === PluginSource.marketplace
+
+  const [isShow, setIsShow] = useState(false)
+  const [targetVersion, setTargetVersion] = useState({
+    version: latest_version,
+    unique_identifier: latest_unique_identifier,
+  })
+  const hasNewVersion = useMemo(() => {
+    if (isFromMarketplace)
+      return !!latest_version && latest_version !== version
+
+    return false
+  }, [isFromMarketplace, latest_version, version])
+
+  const detailUrl = useMemo(() => {
+    if (isFromGitHub)
+      return `https://github.com/${meta!.repo}`
+    if (isFromMarketplace)
+      return `${MARKETPLACE_URL_PREFIX}/plugins/${author}/${name}${theme ? `?theme=${theme}` : ''}`
+    return ''
+  }, [author, isFromGitHub, isFromMarketplace, meta, name, theme])
+
+  const [isShowUpdateModal, {
+    setTrue: showUpdateModal,
+    setFalse: hideUpdateModal,
+  }] = useBoolean(false)
+
+  const handleUpdate = async () => {
+    if (isFromMarketplace) {
+      showUpdateModal()
+      return
+    }
+
+    const owner = meta!.repo.split('/')[0] || author
+    const repo = meta!.repo.split('/')[1] || name
+    const fetchedReleases = await fetchReleases(owner, repo)
+    if (fetchedReleases.length === 0) return
+    const { needUpdate, toastProps } = checkForUpdates(fetchedReleases, meta!.version)
+    Toast.notify(toastProps)
+    if (needUpdate) {
+      setShowUpdatePluginModal({
+        onSaveCallback: () => {
+          onUpdate()
+        },
+        payload: {
+          type: PluginSource.github,
+          category: detail.declaration.category,
+          github: {
+            originalPackageInfo: {
+              id: detail.plugin_unique_identifier,
+              repo: meta!.repo,
+              version: meta!.version,
+              package: meta!.package,
+              releases: fetchedReleases,
+            },
+          },
+        },
+      })
+    }
+  }
+
+  const handleUpdatedFromMarketplace = () => {
+    onUpdate()
+    hideUpdateModal()
+  }
+
+  const [isShowPluginInfo, {
+    setTrue: showPluginInfo,
+    setFalse: hidePluginInfo,
+  }] = useBoolean(false)
+
+  const [isShowDeleteConfirm, {
+    setTrue: showDeleteConfirm,
+    setFalse: hideDeleteConfirm,
+  }] = useBoolean(false)
+
+  const [deleting, {
+    setTrue: showDeleting,
+    setFalse: hideDeleting,
+  }] = useBoolean(false)
+
+  const handleDelete = useCallback(async () => {
+    showDeleting()
+    const res = await uninstallPlugin(installation_id)
+    hideDeleting()
+    if (res.success) {
+      hideDeleteConfirm()
+      onUpdate(true)
+      if (PluginType.model.includes(category))
+        refreshModelProviders()
+      if (PluginType.tool.includes(category))
+        invalidateAllToolProviders()
+    }
+  }, [showDeleting, installation_id, hideDeleting, hideDeleteConfirm, onUpdate, category, refreshModelProviders, invalidateAllToolProviders])
+
+  // #plugin TODO# used in apps
+  // const usedInApps = 3
+
+  return (
+    <div className={cn('shrink-0 border-b border-divider-subtle bg-components-panel-bg p-4 pb-3')}>
+      <div className="flex">
+        <div className='overflow-hidden rounded-xl border border-components-panel-border-subtle'>
+          <Icon src={`${API_PREFIX}/workspaces/current/plugin/icon?tenant_id=${tenant_id}&filename=${icon}`} />
+        </div>
+        <div className="ml-3 w-0 grow">
+          <div className="flex h-5 items-center">
+            <Title title={label[locale]} />
+            {verified && <RiVerifiedBadgeLine className="ml-0.5 h-4 w-4 shrink-0 text-text-accent" />}
+            <PluginVersionPicker
+              disabled={!isFromMarketplace}
+              isShow={isShow}
+              onShowChange={setIsShow}
+              pluginID={plugin_id}
+              currentVersion={version}
+              onSelect={(state) => {
+                setTargetVersion(state)
+                handleUpdate()
+              }}
+              trigger={
+                <Badge
+                  className={cn(
+                    'mx-1',
+                    isShow && 'bg-state-base-hover',
+                    (isShow || isFromMarketplace) && 'hover:bg-state-base-hover',
+                  )}
+                  uppercase={false}
+                  text={
+                    <>
+                      <div>{isFromGitHub ? meta!.version : version}</div>
+                      {isFromMarketplace && <RiArrowLeftRightLine className='ml-1 h-3 w-3 text-text-tertiary' />}
+                    </>
+                  }
+                  hasRedCornerMark={hasNewVersion}
+                />
+              }
+            />
+            {(hasNewVersion || isFromGitHub) && (
+              <Button variant='secondary-accent' size='small' className='!h-5' onClick={() => {
+                if (isFromMarketplace) {
+                  setTargetVersion({
+                    version: latest_version,
+                    unique_identifier: latest_unique_identifier,
+                  })
+                }
+                handleUpdate()
+              }}>{t('plugin.detailPanel.operation.update')}</Button>
+            )}
+          </div>
+          <div className='mb-1 flex h-4 items-center justify-between'>
+            <div className='mt-0.5 flex items-center'>
+              <OrgInfo
+                packageNameClassName='w-auto'
+                orgName={author}
+                packageName={name}
+              />
+              <div className='system-xs-regular ml-1 mr-0.5 text-text-quaternary'>路</div>
+              {detail.source === PluginSource.marketplace && (
+                <Tooltip popupContent={t('plugin.detailPanel.categoryTip.marketplace')} >
+                  <div><BoxSparkleFill className='h-3.5 w-3.5 text-text-tertiary hover:text-text-accent' /></div>
+                </Tooltip>
+              )}
+              {detail.source === PluginSource.github && (
+                <Tooltip popupContent={t('plugin.detailPanel.categoryTip.github')} >
+                  <div><Github className='h-3.5 w-3.5 text-text-secondary hover:text-text-primary' /></div>
+                </Tooltip>
+              )}
+              {detail.source === PluginSource.local && (
+                <Tooltip popupContent={t('plugin.detailPanel.categoryTip.local')} >
+                  <div><RiHardDrive3Line className='h-3.5 w-3.5 text-text-tertiary' /></div>
+                </Tooltip>
+              )}
+              {detail.source === PluginSource.debugging && (
+                <Tooltip popupContent={t('plugin.detailPanel.categoryTip.debugging')} >
+                  <div><RiBugLine className='h-3.5 w-3.5 text-text-tertiary hover:text-text-warning' /></div>
+                </Tooltip>
+              )}
+            </div>
+          </div>
+        </div>
+        <div className='flex gap-1'>
+          <OperationDropdown
+            source={detail.source}
+            onInfo={showPluginInfo}
+            onCheckVersion={handleUpdate}
+            onRemove={showDeleteConfirm}
+            detailUrl={detailUrl}
+          />
+          <ActionButton onClick={onHide}>
+            <RiCloseLine className='h-4 w-4' />
+          </ActionButton>
+        </div>
+      </div>
+      <Description className='mt-3' text={description[locale]} descriptionLineRows={2}></Description>
+      {isShowPluginInfo && (
+        <PluginInfo
+          repository={isFromGitHub ? meta?.repo : ''}
+          release={version}
+          packageName={meta?.package || ''}
+          onHide={hidePluginInfo}
+        />
+      )}
+      {isShowDeleteConfirm && (
+        <Confirm
+          isShow
+          title={t(`${i18nPrefix}.delete`)}
+          content={
+            <div>
+              {t(`${i18nPrefix}.deleteContentLeft`)}<span className='system-md-semibold'>{label[locale]}</span>{t(`${i18nPrefix}.deleteContentRight`)}<br />
+              {/* {usedInApps > 0 && t(`${i18nPrefix}.usedInApps`, { num: usedInApps })} */}
+            </div>
+          }
+          onCancel={hideDeleteConfirm}
+          onConfirm={handleDelete}
+          isLoading={deleting}
+          isDisabled={deleting}
+        />
+      )}
+      {
+        isShowUpdateModal && (
+          <UpdateFromMarketplace
+            payload={{
+              category: detail.declaration.category,
+              originalPackageInfo: {
+                id: detail.plugin_unique_identifier,
+                payload: detail.declaration,
+              },
+              targetPackageInfo: {
+                id: targetVersion.unique_identifier,
+                version: targetVersion.version,
+              },
+            }}
+            onCancel={hideUpdateModal}
+            onSave={handleUpdatedFromMarketplace}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default DetailHeader
diff --git a/app/components/plugins/plugin-detail-panel/endpoint-card.tsx b/app/components/plugins/plugin-detail-panel/endpoint-card.tsx
new file mode 100644
index 0000000..cc3688a
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/endpoint-card.tsx
@@ -0,0 +1,219 @@
+import React, { useEffect, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import copy from 'copy-to-clipboard'
+import { RiClipboardLine, RiDeleteBinLine, RiEditLine, RiLoginCircleLine } from '@remixicon/react'
+import type { EndpointListItem } from '../types'
+import EndpointModal from './endpoint-modal'
+import { NAME_FIELD } from './utils'
+import { addDefaultValue, toolCredentialToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
+import { ClipboardCheck } from '@/app/components/base/icons/src/vender/line/files'
+import ActionButton from '@/app/components/base/action-button'
+import Confirm from '@/app/components/base/confirm'
+import Indicator from '@/app/components/header/indicator'
+import Switch from '@/app/components/base/switch'
+import Toast from '@/app/components/base/toast'
+import Tooltip from '@/app/components/base/tooltip'
+import {
+  useDeleteEndpoint,
+  useDisableEndpoint,
+  useEnableEndpoint,
+  useUpdateEndpoint,
+} from '@/service/use-endpoints'
+
+type Props = {
+  data: EndpointListItem
+  handleChange: () => void
+}
+
+const EndpointCard = ({
+  data,
+  handleChange,
+}: Props) => {
+  const { t } = useTranslation()
+  const [active, setActive] = useState(data.enabled)
+  const endpointID = data.id
+
+  // switch
+  const [isShowDisableConfirm, {
+    setTrue: showDisableConfirm,
+    setFalse: hideDisableConfirm,
+  }] = useBoolean(false)
+  const { mutate: enableEndpoint } = useEnableEndpoint({
+    onSuccess: async () => {
+      await handleChange()
+    },
+    onError: () => {
+      Toast.notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+      setActive(false)
+    },
+  })
+  const { mutate: disableEndpoint } = useDisableEndpoint({
+    onSuccess: async () => {
+      await handleChange()
+      hideDisableConfirm()
+    },
+    onError: () => {
+      Toast.notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+      setActive(false)
+    },
+  })
+  const handleSwitch = (state: boolean) => {
+    if (state) {
+      setActive(true)
+      enableEndpoint(endpointID)
+    }
+    else {
+      setActive(false)
+      showDisableConfirm()
+    }
+  }
+
+  // delete
+  const [isShowDeleteConfirm, {
+    setTrue: showDeleteConfirm,
+    setFalse: hideDeleteConfirm,
+  }] = useBoolean(false)
+  const { mutate: deleteEndpoint } = useDeleteEndpoint({
+    onSuccess: async () => {
+      await handleChange()
+      hideDeleteConfirm()
+    },
+    onError: () => {
+      Toast.notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+    },
+  })
+
+  // update
+  const [isShowEndpointModal, {
+    setTrue: showEndpointModalConfirm,
+    setFalse: hideEndpointModalConfirm,
+  }] = useBoolean(false)
+  const formSchemas = useMemo(() => {
+    return toolCredentialToFormSchemas([NAME_FIELD, ...data.declaration.settings])
+  }, [data.declaration.settings])
+  const formValue = useMemo(() => {
+    const formValue = {
+      name: data.name,
+      ...data.settings,
+    }
+    return addDefaultValue(formValue, formSchemas)
+  }, [data.name, data.settings, formSchemas])
+  const { mutate: updateEndpoint } = useUpdateEndpoint({
+    onSuccess: async () => {
+      await handleChange()
+      hideEndpointModalConfirm()
+    },
+    onError: () => {
+      Toast.notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+    },
+  })
+  const handleUpdate = (state: Record<string, any>) => updateEndpoint({
+    endpointID,
+    state,
+  })
+
+  const [isCopied, setIsCopied] = useState(false)
+  const handleCopy = (value: string) => {
+    copy(value)
+    setIsCopied(true)
+  }
+
+  useEffect(() => {
+    if (isCopied) {
+      const timer = setTimeout(() => {
+        setIsCopied(false)
+      }, 2000)
+      return () => {
+        clearTimeout(timer)
+      }
+    }
+  }, [isCopied])
+
+  const CopyIcon = isCopied ? ClipboardCheck : RiClipboardLine
+
+  return (
+    <div className='rounded-xl bg-background-section-burn p-0.5'>
+      <div className='group rounded-[10px] border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg p-2.5 pl-3'>
+        <div className='flex items-center'>
+          <div className='system-md-semibold mb-1 flex h-6 grow items-center gap-1 text-text-secondary'>
+            <RiLoginCircleLine className='h-4 w-4' />
+            <div>{data.name}</div>
+          </div>
+          <div className='hidden items-center group-hover:flex'>
+            <ActionButton onClick={showEndpointModalConfirm}>
+              <RiEditLine className='h-4 w-4' />
+            </ActionButton>
+            <ActionButton onClick={showDeleteConfirm} className='text-text-tertiary hover:bg-state-destructive-hover hover:text-text-destructive'>
+              <RiDeleteBinLine className='h-4 w-4' />
+            </ActionButton>
+          </div>
+        </div>
+        {data.declaration.endpoints.filter(endpoint => !endpoint.hidden).map((endpoint, index) => (
+          <div key={index} className='flex h-6 items-center'>
+            <div className='system-xs-regular w-12 shrink-0 text-text-tertiary'>{endpoint.method}</div>
+            <div className='group/item system-xs-regular flex grow items-center truncate text-text-secondary'>
+              <div title={`${data.url}${endpoint.path}`} className='truncate'>{`${data.url}${endpoint.path}`}</div>
+              <Tooltip popupContent={t(`common.operation.${isCopied ? 'copied' : 'copy'}`)} position='top'>
+                <ActionButton className='ml-2 hidden shrink-0 group-hover/item:flex' onClick={() => handleCopy(`${data.url}${endpoint.path}`)}>
+                  <CopyIcon className='h-3.5 w-3.5 text-text-tertiary' />
+                </ActionButton>
+              </Tooltip>
+            </div>
+          </div>
+        ))}
+      </div>
+      <div className='flex items-center justify-between p-2 pl-3'>
+        {active && (
+          <div className='system-xs-semibold-uppercase flex items-center gap-1 text-util-colors-green-green-600'>
+            <Indicator color='green' />
+            {t('plugin.detailPanel.serviceOk')}
+          </div>
+        )}
+        {!active && (
+          <div className='system-xs-semibold-uppercase flex items-center gap-1 text-text-tertiary'>
+            <Indicator color='gray' />
+            {t('plugin.detailPanel.disabled')}
+          </div>
+        )}
+        <Switch
+          className='ml-3'
+          defaultValue={active}
+          onChange={handleSwitch}
+          size='sm'
+        />
+      </div>
+      {isShowDisableConfirm && (
+        <Confirm
+          isShow
+          title={t('plugin.detailPanel.endpointDisableTip')}
+          content={<div>{t('plugin.detailPanel.endpointDisableContent', { name: data.name })}</div>}
+          onCancel={() => {
+            hideDisableConfirm()
+            setActive(true)
+          }}
+          onConfirm={() => disableEndpoint(endpointID)}
+        />
+      )}
+      {isShowDeleteConfirm && (
+        <Confirm
+          isShow
+          title={t('plugin.detailPanel.endpointDeleteTip')}
+          content={<div>{t('plugin.detailPanel.endpointDeleteContent', { name: data.name })}</div>}
+          onCancel={hideDeleteConfirm}
+          onConfirm={() => deleteEndpoint(endpointID)}
+        />
+      )}
+      {isShowEndpointModal && (
+        <EndpointModal
+          formSchemas={formSchemas}
+          defaultValues={formValue}
+          onCancel={hideEndpointModalConfirm}
+          onSaved={handleUpdate}
+        />
+      )}
+    </div>
+  )
+}
+
+export default EndpointCard
diff --git a/app/components/plugins/plugin-detail-panel/endpoint-list.tsx b/app/components/plugins/plugin-detail-panel/endpoint-list.tsx
new file mode 100644
index 0000000..59a457e
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/endpoint-list.tsx
@@ -0,0 +1,122 @@
+import React, { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { useBoolean } from 'ahooks'
+import {
+  RiAddLine,
+  RiApps2AddLine,
+  RiBookOpenLine,
+} from '@remixicon/react'
+import EndpointModal from './endpoint-modal'
+import EndpointCard from './endpoint-card'
+import { NAME_FIELD } from './utils'
+import { toolCredentialToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
+import ActionButton from '@/app/components/base/action-button'
+import Tooltip from '@/app/components/base/tooltip'
+import Toast from '@/app/components/base/toast'
+import {
+  useCreateEndpoint,
+  useEndpointList,
+  useInvalidateEndpointList,
+} from '@/service/use-endpoints'
+import type { PluginDetail } from '@/app/components/plugins/types'
+import { LanguagesSupported } from '@/i18n/language'
+import I18n from '@/context/i18n'
+import cn from '@/utils/classnames'
+
+type Props = {
+  detail: PluginDetail
+}
+const EndpointList = ({ detail }: Props) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const pluginUniqueID = detail.plugin_unique_identifier
+  const declaration = detail.declaration.endpoint
+  const showTopBorder = detail.declaration.tool
+  const { data } = useEndpointList(detail.plugin_id)
+  const invalidateEndpointList = useInvalidateEndpointList()
+
+  const [isShowEndpointModal, {
+    setTrue: showEndpointModal,
+    setFalse: hideEndpointModal,
+  }] = useBoolean(false)
+
+  const formSchemas = useMemo(() => {
+    return toolCredentialToFormSchemas([NAME_FIELD, ...declaration.settings])
+  }, [declaration.settings])
+
+  const { mutate: createEndpoint } = useCreateEndpoint({
+    onSuccess: async () => {
+      await invalidateEndpointList(detail.plugin_id)
+      hideEndpointModal()
+    },
+    onError: () => {
+      Toast.notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })
+    },
+  })
+
+  const handleCreate = (state: Record<string, any>) => createEndpoint({
+    pluginUniqueID,
+    state,
+  })
+
+  if (!data)
+    return null
+
+  return (
+    <div className={cn('border-divider-subtle px-4 py-2', showTopBorder && 'border-t')}>
+      <div className='system-sm-semibold-uppercase mb-1 flex h-6 items-center justify-between text-text-secondary'>
+        <div className='flex items-center gap-0.5'>
+          {t('plugin.detailPanel.endpoints')}
+          <Tooltip
+            position='right'
+            needsDelay
+            popupClassName='w-[240px] p-4 rounded-xl bg-components-panel-bg-blur border-[0.5px] border-components-panel-border'
+            popupContent={
+              <div className='flex flex-col gap-2'>
+                <div className='flex h-8 w-8 items-center justify-center rounded-lg border-[0.5px] border-components-panel-border-subtle bg-background-default-subtle'>
+                  <RiApps2AddLine className='h-4 w-4 text-text-tertiary' />
+                </div>
+                <div className='system-xs-regular text-text-tertiary'>{t('plugin.detailPanel.endpointsTip')}</div>
+                <a
+                  href={`https://docs.dify.ai/${locale === LanguagesSupported[1] ? 'v/zh-hans/' : ''}plugins/schema-definition/endpoint`}
+                  target='_blank'
+                  rel='noopener noreferrer'
+                >
+                  <div className='system-xs-regular inline-flex cursor-pointer items-center gap-1 text-text-accent'>
+                    <RiBookOpenLine className='h-3 w-3' />
+                    {t('plugin.detailPanel.endpointsDocLink')}
+                  </div>
+                </a>
+              </div>
+            }
+          />
+        </div>
+        <ActionButton onClick={showEndpointModal}>
+          <RiAddLine className='h-4 w-4' />
+        </ActionButton>
+      </div>
+      {data.endpoints.length === 0 && (
+        <div className='system-xs-regular mb-1 flex justify-center rounded-[10px] bg-background-section p-3 text-text-tertiary'>{t('plugin.detailPanel.endpointsEmpty')}</div>
+      )}
+      <div className='flex flex-col gap-2'>
+        {data.endpoints.map((item, index) => (
+          <EndpointCard
+            key={index}
+            data={item}
+            handleChange={() => invalidateEndpointList(detail.plugin_id)}
+          />
+        ))}
+      </div>
+      {isShowEndpointModal && (
+        <EndpointModal
+          formSchemas={formSchemas}
+          onCancel={hideEndpointModal}
+          onSaved={handleCreate}
+        />
+      )}
+    </div>
+  )
+}
+
+export default EndpointList
diff --git a/app/components/plugins/plugin-detail-panel/endpoint-modal.tsx b/app/components/plugins/plugin-detail-panel/endpoint-modal.tsx
new file mode 100644
index 0000000..fd86272
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/endpoint-modal.tsx
@@ -0,0 +1,96 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowRightUpLine, RiCloseLine } from '@remixicon/react'
+import ActionButton from '@/app/components/base/action-button'
+import Button from '@/app/components/base/button'
+import Drawer from '@/app/components/base/drawer'
+import Form from '@/app/components/header/account-setting/model-provider-page/model-modal/Form'
+import Toast from '@/app/components/base/toast'
+import { useRenderI18nObject } from '@/hooks/use-i18n'
+import cn from '@/utils/classnames'
+
+type Props = {
+  formSchemas: any
+  defaultValues?: any
+  onCancel: () => void
+  onSaved: (value: Record<string, any>) => void
+}
+
+const EndpointModal: FC<Props> = ({
+  formSchemas,
+  defaultValues = {},
+  onCancel,
+  onSaved,
+}) => {
+  const getValueFromI18nObject = useRenderI18nObject()
+  const { t } = useTranslation()
+  const [tempCredential, setTempCredential] = React.useState<any>(defaultValues)
+
+  const handleSave = () => {
+    for (const field of formSchemas) {
+      if (field.required && !tempCredential[field.name]) {
+        Toast.notify({ type: 'error', message: t('common.errorMsg.fieldRequired', { field: getValueFromI18nObject(field.label) }) })
+        return
+      }
+    }
+    onSaved(tempCredential)
+  }
+
+  return (
+    <Drawer
+      isOpen
+      clickOutsideNotOpen={false}
+      onClose={onCancel}
+      footer={null}
+      mask
+      positionCenter={false}
+      panelClassName={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')}
+    >
+      <>
+        <div className='p-4 pb-2'>
+          <div className='flex items-center justify-between'>
+            <div className='system-xl-semibold text-text-primary'>{t('plugin.detailPanel.endpointModalTitle')}</div>
+            <ActionButton onClick={onCancel}>
+              <RiCloseLine className='h-4 w-4' />
+            </ActionButton>
+          </div>
+          <div className='system-xs-regular mt-0.5 text-text-tertiary'>{t('plugin.detailPanel.endpointModalDesc')}</div>
+        </div>
+        <div className='grow overflow-y-auto'>
+          <div className='px-4 py-2'>
+            <Form
+              value={tempCredential}
+              onChange={(v) => {
+                setTempCredential(v)
+              }}
+              formSchemas={formSchemas}
+              isEditMode={true}
+              showOnVariableMap={{}}
+              validating={false}
+              inputClassName='bg-components-input-bg-normal hover:bg-components-input-bg-hover'
+              fieldMoreInfo={item => item.url
+                ? (<a
+                  href={item.url}
+                  target='_blank' rel='noopener noreferrer'
+                  className='body-xs-regular inline-flex items-center text-text-accent-secondary'
+                >
+                  {t('tools.howToGet')}
+                  <RiArrowRightUpLine className='ml-1 h-3 w-3' />
+                </a>)
+                : null}
+            />
+          </div>
+          <div className={cn('flex justify-end p-4 pt-0')} >
+            <div className='flex gap-2'>
+              <Button onClick={onCancel}>{t('common.operation.cancel')}</Button>
+              <Button variant='primary' onClick={handleSave}>{t('common.operation.save')}</Button>
+            </div>
+          </div>
+        </div>
+      </>
+    </Drawer>
+  )
+}
+export default React.memo(EndpointModal)
diff --git a/app/components/plugins/plugin-detail-panel/index.tsx b/app/components/plugins/plugin-detail-panel/index.tsx
new file mode 100644
index 0000000..3ec867f
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/index.tsx
@@ -0,0 +1,62 @@
+'use client'
+import React from 'react'
+import type { FC } from 'react'
+import DetailHeader from './detail-header'
+import EndpointList from './endpoint-list'
+import ActionList from './action-list'
+import ModelList from './model-list'
+import AgentStrategyList from './agent-strategy-list'
+import Drawer from '@/app/components/base/drawer'
+import type { PluginDetail } from '@/app/components/plugins/types'
+import cn from '@/utils/classnames'
+
+type Props = {
+  detail?: PluginDetail
+  onUpdate: () => void
+  onHide: () => void
+}
+
+const PluginDetailPanel: FC<Props> = ({
+  detail,
+  onUpdate,
+  onHide,
+}) => {
+  const handleUpdate = (isDelete = false) => {
+    if (isDelete)
+      onHide()
+    onUpdate()
+  }
+
+  if (!detail)
+    return null
+
+  return (
+    <Drawer
+      isOpen={!!detail}
+      clickOutsideNotOpen={false}
+      onClose={onHide}
+      footer={null}
+      mask={false}
+      positionCenter={false}
+      panelClassName={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')}
+    >
+      {detail && (
+        <>
+          <DetailHeader
+            detail={detail}
+            onHide={onHide}
+            onUpdate={handleUpdate}
+          />
+          <div className='grow overflow-y-auto'>
+            {!!detail.declaration.tool && <ActionList detail={detail} />}
+            {!!detail.declaration.agent_strategy && <AgentStrategyList detail={detail} />}
+            {!!detail.declaration.endpoint && <EndpointList detail={detail} />}
+            {!!detail.declaration.model && <ModelList detail={detail} />}
+          </div>
+        </>
+      )}
+    </Drawer>
+  )
+}
+
+export default PluginDetailPanel
diff --git a/app/components/plugins/plugin-detail-panel/model-list.tsx b/app/components/plugins/plugin-detail-panel/model-list.tsx
new file mode 100644
index 0000000..251859e
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/model-list.tsx
@@ -0,0 +1,46 @@
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import ModelIcon from '@/app/components/header/account-setting/model-provider-page/model-icon'
+import ModelName from '@/app/components/header/account-setting/model-provider-page/model-name'
+import { useModelProviderModelList } from '@/service/use-models'
+import type { PluginDetail } from '@/app/components/plugins/types'
+
+type Props = {
+  detail: PluginDetail
+}
+
+const ModelList = ({
+  detail,
+}: Props) => {
+  const { t } = useTranslation()
+  const { data: res } = useModelProviderModelList(`${detail.plugin_id}/${detail.declaration.model.provider}`)
+
+  if (!res)
+    return null
+
+  return (
+    <div className='px-4 py-2'>
+      <div className='system-sm-semibold-uppercase mb-1 flex h-6 items-center text-text-secondary'>{t('plugin.detailPanel.modelNum', { num: res.data.length })}</div>
+      <div className='flex flex-col'>
+        {res.data.map(model => (
+          <div key={model.model} className='flex h-6 items-center py-1'>
+            <ModelIcon
+              className='mr-2 shrink-0'
+              provider={(model as any).provider}
+              modelName={model.model}
+            />
+            <ModelName
+              className='system-md-regular grow text-text-secondary'
+              modelItem={model}
+              showModelType
+              showMode
+              showContextSize
+            />
+          </div>
+        ))}
+      </div>
+    </div>
+  )
+}
+
+export default ModelList
diff --git a/app/components/plugins/plugin-detail-panel/model-selector/index.tsx b/app/components/plugins/plugin-detail-panel/model-selector/index.tsx
new file mode 100644
index 0000000..60c63db
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/model-selector/index.tsx
@@ -0,0 +1,251 @@
+import type {
+  FC,
+  ReactNode,
+} from 'react'
+import { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import type {
+  DefaultModel,
+  FormValue,
+} from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { ModelStatusEnum, ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
+import {
+  useModelList,
+} from '@/app/components/header/account-setting/model-provider-page/hooks'
+import AgentModelTrigger from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal/agent-model-trigger'
+import Trigger from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal/trigger'
+import type { TriggerProps } from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal/trigger'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import LLMParamsPanel from './llm-params-panel'
+import TTSParamsPanel from './tts-params-panel'
+import { useProviderContext } from '@/context/provider-context'
+import cn from '@/utils/classnames'
+
+export type ModelParameterModalProps = {
+  popupClassName?: string
+  portalToFollowElemContentClassName?: string
+  isAdvancedMode: boolean
+  value: any
+  setModel: (model: any) => void
+  renderTrigger?: (v: TriggerProps) => ReactNode
+  readonly?: boolean
+  isInWorkflow?: boolean
+  isAgentStrategy?: boolean
+  scope?: string
+}
+
+const ModelParameterModal: FC<ModelParameterModalProps> = ({
+  popupClassName,
+  portalToFollowElemContentClassName,
+  isAdvancedMode,
+  value,
+  setModel,
+  renderTrigger,
+  readonly,
+  isInWorkflow,
+  isAgentStrategy,
+  scope = ModelTypeEnum.textGeneration,
+}) => {
+  const { t } = useTranslation()
+  const { isAPIKeySet } = useProviderContext()
+  const [open, setOpen] = useState(false)
+  const scopeArray = scope.split('&')
+  const scopeFeatures = useMemo(() => {
+    if (scopeArray.includes('all'))
+      return []
+    return scopeArray.filter(item => ![
+      ModelTypeEnum.textGeneration,
+      ModelTypeEnum.textEmbedding,
+      ModelTypeEnum.rerank,
+      ModelTypeEnum.moderation,
+      ModelTypeEnum.speech2text,
+      ModelTypeEnum.tts,
+    ].includes(item as ModelTypeEnum))
+  }, [scopeArray])
+
+  const { data: textGenerationList } = useModelList(ModelTypeEnum.textGeneration)
+  const { data: textEmbeddingList } = useModelList(ModelTypeEnum.textEmbedding)
+  const { data: rerankList } = useModelList(ModelTypeEnum.rerank)
+  const { data: moderationList } = useModelList(ModelTypeEnum.moderation)
+  const { data: sttList } = useModelList(ModelTypeEnum.speech2text)
+  const { data: ttsList } = useModelList(ModelTypeEnum.tts)
+
+  const scopedModelList = useMemo(() => {
+    const resultList: any[] = []
+    if (scopeArray.includes('all')) {
+      return [
+        ...textGenerationList,
+        ...textEmbeddingList,
+        ...rerankList,
+        ...sttList,
+        ...ttsList,
+        ...moderationList,
+      ]
+    }
+    if (scopeArray.includes(ModelTypeEnum.textGeneration))
+      return textGenerationList
+    if (scopeArray.includes(ModelTypeEnum.textEmbedding))
+      return textEmbeddingList
+    if (scopeArray.includes(ModelTypeEnum.rerank))
+      return rerankList
+    if (scopeArray.includes(ModelTypeEnum.moderation))
+      return moderationList
+    if (scopeArray.includes(ModelTypeEnum.speech2text))
+      return sttList
+    if (scopeArray.includes(ModelTypeEnum.tts))
+      return ttsList
+    return resultList
+  }, [scopeArray, textGenerationList, textEmbeddingList, rerankList, sttList, ttsList, moderationList])
+
+  const { currentProvider, currentModel } = useMemo(() => {
+    const currentProvider = scopedModelList.find(item => item.provider === value?.provider)
+    const currentModel = currentProvider?.models.find((model: { model: string }) => model.model === value?.model)
+    return {
+      currentProvider,
+      currentModel,
+    }
+  }, [scopedModelList, value?.provider, value?.model])
+
+  const hasDeprecated = useMemo(() => {
+    return !currentProvider || !currentModel
+  }, [currentModel, currentProvider])
+  const modelDisabled = useMemo(() => {
+    return currentModel?.status !== ModelStatusEnum.active
+  }, [currentModel?.status])
+  const disabled = useMemo(() => {
+    return !isAPIKeySet || hasDeprecated || modelDisabled
+  }, [hasDeprecated, isAPIKeySet, modelDisabled])
+
+  const handleChangeModel = ({ provider, model }: DefaultModel) => {
+    const targetProvider = scopedModelList.find(modelItem => modelItem.provider === provider)
+    const targetModelItem = targetProvider?.models.find((modelItem: { model: string }) => modelItem.model === model)
+    const model_type = targetModelItem?.model_type as string
+    setModel({
+      provider,
+      model,
+      model_type,
+      ...(model_type === ModelTypeEnum.textGeneration ? {
+        mode: targetModelItem?.model_properties.mode as string,
+        completion_params: {},
+      } : {}),
+    })
+  }
+
+  const handleLLMParamsChange = (newParams: FormValue) => {
+    const newValue = {
+      ...(value?.completionParams || {}),
+      completion_params: newParams,
+    }
+    setModel({
+      ...value,
+      ...newValue,
+    })
+  }
+
+  const handleTTSParamsChange = (language: string, voice: string) => {
+    setModel({
+      ...value,
+      language,
+      voice,
+    })
+  }
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement={isInWorkflow ? 'left' : 'bottom-end'}
+      offset={4}
+    >
+      <div className='relative'>
+        <PortalToFollowElemTrigger
+          onClick={() => {
+            if (readonly)
+              return
+            setOpen(v => !v)
+          }}
+          className='block'
+        >
+          {
+            renderTrigger
+              ? renderTrigger({
+                open,
+                disabled,
+                modelDisabled,
+                hasDeprecated,
+                currentProvider,
+                currentModel,
+                providerName: value?.provider,
+                modelId: value?.model,
+              })
+              : (isAgentStrategy
+                ? <AgentModelTrigger
+                  disabled={disabled}
+                  hasDeprecated={hasDeprecated}
+                  currentProvider={currentProvider}
+                  currentModel={currentModel}
+                  providerName={value?.provider}
+                  modelId={value?.model}
+                  scope={scope}
+                />
+                : <Trigger
+                  disabled={disabled}
+                  isInWorkflow={isInWorkflow}
+                  modelDisabled={modelDisabled}
+                  hasDeprecated={hasDeprecated}
+                  currentProvider={currentProvider}
+                  currentModel={currentModel}
+                  providerName={value?.provider}
+                  modelId={value?.model}
+                />
+              )
+          }
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className={cn('z-50', portalToFollowElemContentClassName)}>
+          <div className={cn(popupClassName, 'w-[389px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-lg')}>
+            <div className={cn('max-h-[420px] overflow-y-auto p-4 pt-3')}>
+              <div className='relative'>
+                <div className={cn('system-sm-semibold mb-1 flex h-6 items-center text-text-secondary')}>
+                  {t('common.modelProvider.model').toLocaleUpperCase()}
+                </div>
+                <ModelSelector
+                  defaultModel={(value?.provider || value?.model) ? { provider: value?.provider, model: value?.model } : undefined}
+                  modelList={scopedModelList}
+                  scopeFeatures={scopeFeatures}
+                  onSelect={handleChangeModel}
+                />
+              </div>
+              {(currentModel?.model_type === ModelTypeEnum.textGeneration || currentModel?.model_type === ModelTypeEnum.tts) && (
+                <div className='my-3 h-[1px] bg-divider-subtle' />
+              )}
+              {currentModel?.model_type === ModelTypeEnum.textGeneration && (
+                <LLMParamsPanel
+                  provider={value?.provider}
+                  modelId={value?.model}
+                  completionParams={value?.completion_params || {}}
+                  onCompletionParamsChange={handleLLMParamsChange}
+                  isAdvancedMode={isAdvancedMode}
+                />
+              )}
+              {currentModel?.model_type === ModelTypeEnum.tts && (
+                <TTSParamsPanel
+                  currentModel={currentModel}
+                  language={value?.language}
+                  voice={value?.voice}
+                  onChange={handleTTSParamsChange}
+                />
+              )}
+            </div>
+          </div>
+        </PortalToFollowElemContent>
+      </div>
+    </PortalToFollowElem>
+  )
+}
+
+export default ModelParameterModal
diff --git a/app/components/plugins/plugin-detail-panel/model-selector/llm-params-panel.tsx b/app/components/plugins/plugin-detail-panel/model-selector/llm-params-panel.tsx
new file mode 100644
index 0000000..e44697b
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/model-selector/llm-params-panel.tsx
@@ -0,0 +1,126 @@
+import React, { useMemo } from 'react'
+import useSWR from 'swr'
+import { useTranslation } from 'react-i18next'
+import PresetsParameter from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal/presets-parameter'
+import ParameterItem from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal/parameter-item'
+import Loading from '@/app/components/base/loading'
+import type {
+  FormValue,
+  ModelParameterRule,
+} from '@/app/components/header/account-setting/model-provider-page/declarations'
+import type { ParameterValue } from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal/parameter-item'
+import { fetchModelParameterRules } from '@/service/common'
+import { TONE_LIST } from '@/config'
+import cn from '@/utils/classnames'
+
+const PROVIDER_WITH_PRESET_TONE = ['langgenius/openai/openai', 'langgenius/azure_openai/azure_openai']
+const stopParameterRule: ModelParameterRule = {
+  default: [],
+  help: {
+    en_US: 'Up to four sequences where the API聽will stop generating further tokens. The聽returned text will not contain the stop聽sequence.',
+    zh_Hans: '鏈�澶氬洓涓簭鍒楋紝API 灏嗗仠姝㈢敓鎴愭洿澶氱殑 token銆傝繑鍥炵殑鏂囨湰灏嗕笉鍖呭惈鍋滄搴忓垪銆�',
+  },
+  label: {
+    en_US: 'Stop sequences',
+    zh_Hans: '鍋滄搴忓垪',
+  },
+  name: 'stop',
+  required: false,
+  type: 'tag',
+  tagPlaceholder: {
+    en_US: 'Enter sequence and press Tab',
+    zh_Hans: '杈撳叆搴忓垪骞舵寜 Tab 閿�',
+  },
+}
+
+type Props = {
+  isAdvancedMode: boolean
+  provider: string
+  modelId: string
+  completionParams: FormValue
+  onCompletionParamsChange: (newParams: FormValue) => void
+}
+
+const LLMParamsPanel = ({
+  isAdvancedMode,
+  provider,
+  modelId,
+  completionParams,
+  onCompletionParamsChange,
+}: Props) => {
+  const { t } = useTranslation()
+  const { data: parameterRulesData, isLoading } = useSWR(
+    (provider && modelId)
+      ? `/workspaces/current/model-providers/${provider}/models/parameter-rules?model=${modelId}`
+      : null, fetchModelParameterRules,
+  )
+
+  const parameterRules: ModelParameterRule[] = useMemo(() => {
+    return parameterRulesData?.data || []
+  }, [parameterRulesData])
+
+  const handleSelectPresetParameter = (toneId: number) => {
+    const tone = TONE_LIST.find(tone => tone.id === toneId)
+    if (tone) {
+      onCompletionParamsChange({
+        ...completionParams,
+        ...tone.config,
+      })
+    }
+  }
+  const handleParamChange = (key: string, value: ParameterValue) => {
+    onCompletionParamsChange({
+      ...completionParams,
+      [key]: value,
+    })
+  }
+  const handleSwitch = (key: string, value: boolean, assignValue: ParameterValue) => {
+    if (!value) {
+      const newCompletionParams = { ...completionParams }
+      delete newCompletionParams[key]
+
+      onCompletionParamsChange(newCompletionParams)
+    }
+    if (value) {
+      onCompletionParamsChange({
+        ...completionParams,
+        [key]: assignValue,
+      })
+    }
+  }
+
+  if (isLoading) {
+    return (
+      <div className='mt-5'><Loading /></div>
+    )
+  }
+
+  return (
+    <>
+      <div className='mb-2 flex items-center justify-between'>
+        <div className={cn('system-sm-semibold flex h-6 items-center text-text-secondary')}>{t('common.modelProvider.parameters')}</div>
+        {
+          PROVIDER_WITH_PRESET_TONE.includes(provider) && (
+            <PresetsParameter onSelect={handleSelectPresetParameter} />
+          )
+        }
+      </div>
+      {!!parameterRules.length && (
+        [
+          ...parameterRules,
+          ...(isAdvancedMode ? [stopParameterRule] : []),
+        ].map(parameter => (
+          <ParameterItem
+            key={`${modelId}-${parameter.name}`}
+            parameterRule={parameter}
+            value={completionParams?.[parameter.name]}
+            onChange={v => handleParamChange(parameter.name, v)}
+            onSwitch={(checked, assignValue) => handleSwitch(parameter.name, checked, assignValue)}
+            isInWorkflow
+          />
+        )))}
+    </>
+  )
+}
+
+export default LLMParamsPanel
diff --git a/app/components/plugins/plugin-detail-panel/model-selector/tts-params-panel.tsx b/app/components/plugins/plugin-detail-panel/model-selector/tts-params-panel.tsx
new file mode 100644
index 0000000..5bd099b
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/model-selector/tts-params-panel.tsx
@@ -0,0 +1,67 @@
+import React, { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { languages } from '@/i18n/language'
+import { PortalSelect } from '@/app/components/base/select'
+import cn from '@/utils/classnames'
+
+type Props = {
+  currentModel: any
+  language: string
+  voice: string
+  onChange: (language: string, voice: string) => void
+}
+
+const TTSParamsPanel = ({
+  currentModel,
+  language,
+  voice,
+  onChange,
+}: Props) => {
+  const { t } = useTranslation()
+  const voiceList = useMemo(() => {
+    if (!currentModel)
+      return []
+    return currentModel.model_properties.voices.map((item: { mode: any }) => ({
+      ...item,
+      value: item.mode,
+    }))
+  }, [currentModel])
+  const setLanguage = (language: string) => {
+    onChange(language, voice)
+  }
+  const setVoice = (voice: string) => {
+    onChange(language, voice)
+  }
+  return (
+    <>
+      <div className='mb-3'>
+        <div className='system-sm-semibold mb-1 flex items-center py-1 text-text-secondary'>
+          {t('appDebug.voice.voiceSettings.language')}
+        </div>
+        <PortalSelect
+          triggerClassName='h-8'
+          popupClassName={cn('z-[1000]')}
+          popupInnerClassName={cn('w-[354px]')}
+          value={language}
+          items={languages.filter(item => item.supported)}
+          onSelect={item => setLanguage(item.value as string)}
+        />
+      </div>
+      <div className='mb-3'>
+        <div className='system-sm-semibold mb-1 flex items-center py-1 text-text-secondary'>
+          {t('appDebug.voice.voiceSettings.voice')}
+        </div>
+        <PortalSelect
+          triggerClassName='h-8'
+          popupClassName={cn('z-[1000]')}
+          popupInnerClassName={cn('w-[354px]')}
+          value={voice}
+          items={voiceList}
+          onSelect={item => setVoice(item.value as string)}
+        />
+      </div>
+    </>
+  )
+}
+
+export default TTSParamsPanel
diff --git a/app/components/plugins/plugin-detail-panel/multiple-tool-selector/index.tsx b/app/components/plugins/plugin-detail-panel/multiple-tool-selector/index.tsx
new file mode 100644
index 0000000..f243d30
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/multiple-tool-selector/index.tsx
@@ -0,0 +1,170 @@
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAddLine,
+  RiQuestionLine,
+} from '@remixicon/react'
+import ToolSelector from '@/app/components/plugins/plugin-detail-panel/tool-selector'
+import ActionButton from '@/app/components/base/action-button'
+import Tooltip from '@/app/components/base/tooltip'
+import Divider from '@/app/components/base/divider'
+import type { ToolValue } from '@/app/components/workflow/block-selector/types'
+import type { Node } from 'reactflow'
+import type { NodeOutPutVar } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+import { ArrowDownRoundFill } from '@/app/components/base/icons/src/vender/solid/general'
+
+type Props = {
+  disabled?: boolean
+  value: ToolValue[]
+  label: string
+  required?: boolean
+  tooltip?: any
+  supportCollapse?: boolean
+  scope?: string
+  onChange: (value: ToolValue[]) => void
+  nodeOutputVars: NodeOutPutVar[],
+  availableNodes: Node[],
+  nodeId?: string
+}
+
+const MultipleToolSelector = ({
+  disabled,
+  value = [],
+  label,
+  required,
+  tooltip,
+  supportCollapse,
+  scope,
+  onChange,
+  nodeOutputVars,
+  availableNodes,
+  nodeId,
+}: Props) => {
+  const { t } = useTranslation()
+  const enabledCount = value.filter(item => item.enabled).length
+  // collapse control
+  const [collapse, setCollapse] = React.useState(false)
+  const handleCollapse = () => {
+    if (supportCollapse)
+      setCollapse(!collapse)
+  }
+
+  // add tool
+  const [open, setOpen] = React.useState(false)
+  const [panelShowState, setPanelShowState] = React.useState(true)
+  const handleAdd = (val: ToolValue) => {
+    const newValue = [...value, val]
+    // deduplication
+    const deduplication = newValue.reduce((acc, cur) => {
+      if (!acc.find(item => item.provider_name === cur.provider_name && item.tool_name === cur.tool_name))
+        acc.push(cur)
+      return acc
+    }, [] as ToolValue[])
+    // update value
+    onChange(deduplication)
+    setOpen(false)
+  }
+
+  // delete tool
+  const handleDelete = (index: number) => {
+    const newValue = [...value]
+    newValue.splice(index, 1)
+    onChange(newValue)
+  }
+
+  // configure tool
+  const handleConfigure = (val: ToolValue, index: number) => {
+    const newValue = [...value]
+    newValue[index] = val
+    onChange(newValue)
+  }
+
+  return (
+    <>
+      <div className='mb-1 flex items-center'>
+        <div
+          className={cn('relative flex grow items-center gap-0.5', supportCollapse && 'cursor-pointer')}
+          onClick={handleCollapse}
+        >
+          <div className='system-sm-semibold-uppercase flex h-6 items-center text-text-secondary'>{label}</div>
+          {required && <div className='text-red-500'>*</div>}
+          {tooltip && (
+            <Tooltip
+              popupContent={tooltip}
+              needsDelay
+            >
+              <div><RiQuestionLine className='h-3.5 w-3.5 text-text-quaternary hover:text-text-tertiary' /></div>
+            </Tooltip>
+          )}
+          {supportCollapse && (
+            <ArrowDownRoundFill
+              className={cn(
+                'h-4 w-4 cursor-pointer text-text-quaternary group-hover/collapse:text-text-secondary',
+                collapse && 'rotate-[270deg]',
+              )}
+            />
+          )}
+        </div>
+        {value.length > 0 && (
+          <>
+            <div className='system-xs-medium flex items-center gap-1 text-text-tertiary'>
+              <span>{`${enabledCount}/${value.length}`}</span>
+              <span>{t('appDebug.agent.tools.enabled')}</span>
+            </div>
+            <Divider type='vertical' className='ml-3 mr-1 h-3' />
+          </>
+        )}
+        {!disabled && (
+          <ActionButton className='mx-1' onClick={() => {
+            setOpen(!open)
+            setPanelShowState(true)
+          }}>
+            <RiAddLine className='h-4 w-4' />
+          </ActionButton>
+        )}
+      </div>
+      {!collapse && (
+        <>
+          <ToolSelector
+            nodeId={nodeId}
+            nodeOutputVars={nodeOutputVars}
+            availableNodes={availableNodes}
+            scope={scope}
+            value={undefined}
+            selectedTools={value}
+            onSelect={handleAdd}
+            controlledState={open}
+            onControlledStateChange={setOpen}
+            trigger={
+              <div className=''></div>
+            }
+            panelShowState={panelShowState}
+            onPanelShowStateChange={setPanelShowState}
+
+          />
+          {value.length === 0 && (
+            <div className='system-xs-regular flex justify-center rounded-[10px] bg-background-section p-3 text-text-tertiary'>{t('plugin.detailPanel.toolSelector.empty')}</div>
+          )}
+          {value.length > 0 && value.map((item, index) => (
+            <div className='mb-1' key={index}>
+              <ToolSelector
+                nodeId={nodeId}
+                nodeOutputVars={nodeOutputVars}
+                availableNodes={availableNodes}
+                scope={scope}
+                value={item}
+                selectedTools={value}
+                onSelect={item => handleConfigure(item, index)}
+                onDelete={() => handleDelete(index)}
+                supportEnableSwitch
+              />
+            </div>
+          ))}
+        </>
+      )}
+    </>
+  )
+}
+
+export default MultipleToolSelector
diff --git a/app/components/plugins/plugin-detail-panel/operation-dropdown.tsx b/app/components/plugins/plugin-detail-panel/operation-dropdown.tsx
new file mode 100644
index 0000000..f8b4f63
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/operation-dropdown.tsx
@@ -0,0 +1,101 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { PluginSource } from '../types'
+import { RiArrowRightUpLine, RiMoreFill } from '@remixicon/react'
+import ActionButton from '@/app/components/base/action-button'
+// import Button from '@/app/components/base/button'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import cn from '@/utils/classnames'
+
+type Props = {
+  source: PluginSource
+  onInfo: () => void
+  onCheckVersion: () => void
+  onRemove: () => void
+  detailUrl: string
+}
+
+const OperationDropdown: FC<Props> = ({
+  source,
+  detailUrl,
+  onInfo,
+  onCheckVersion,
+  onRemove,
+}) => {
+  const { t } = useTranslation()
+  const [open, doSetOpen] = useState(false)
+  const openRef = useRef(open)
+  const setOpen = useCallback((v: boolean) => {
+    doSetOpen(v)
+    openRef.current = v
+  }, [doSetOpen])
+
+  const handleTrigger = useCallback(() => {
+    setOpen(!openRef.current)
+  }, [setOpen])
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: -12,
+        crossAxis: 36,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={handleTrigger}>
+        <div>
+          <ActionButton className={cn(open && 'bg-state-base-hover')}>
+            <RiMoreFill className='h-4 w-4' />
+          </ActionButton>
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-50'>
+        <div className='w-[160px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
+          {source === PluginSource.github && (
+            <div
+              onClick={() => {
+                onInfo()
+                handleTrigger()
+              }}
+              className='system-md-regular cursor-pointer rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover'
+            >{t('plugin.detailPanel.operation.info')}</div>
+          )}
+          {source === PluginSource.github && (
+            <div
+              onClick={() => {
+                onCheckVersion()
+                handleTrigger()
+              }}
+              className='system-md-regular cursor-pointer rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover'
+            >{t('plugin.detailPanel.operation.checkUpdate')}</div>
+          )}
+          {(source === PluginSource.marketplace || source === PluginSource.github) && (
+            <a href={detailUrl} target='_blank' className='system-md-regular flex cursor-pointer items-center rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover'>
+              <span className='grow'>{t('plugin.detailPanel.operation.viewDetail')}</span>
+              <RiArrowRightUpLine className='h-3.5 w-3.5 shrink-0 text-text-tertiary' />
+            </a>
+          )}
+          {(source === PluginSource.marketplace || source === PluginSource.github) && (
+            <div className='my-1 h-px bg-divider-subtle'></div>
+          )}
+          <div
+            onClick={() => {
+              onRemove()
+              handleTrigger()
+            }}
+            className='system-md-regular cursor-pointer rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-destructive-hover hover:text-text-destructive'
+          >{t('plugin.detailPanel.operation.remove')}</div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default React.memo(OperationDropdown)
diff --git a/app/components/plugins/plugin-detail-panel/strategy-detail.tsx b/app/components/plugins/plugin-detail-panel/strategy-detail.tsx
new file mode 100644
index 0000000..00794d8
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/strategy-detail.tsx
@@ -0,0 +1,164 @@
+'use client'
+import type { FC } from 'react'
+import React, { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowLeftLine,
+  RiCloseLine,
+} from '@remixicon/react'
+import Drawer from '@/app/components/base/drawer'
+import ActionButton from '@/app/components/base/action-button'
+import Icon from '@/app/components/plugins/card/base/card-icon'
+import Description from '@/app/components/plugins/card/base/description'
+import Divider from '@/app/components/base/divider'
+import type {
+  StrategyDetail as StrategyDetailType,
+} from '@/app/components/plugins/types'
+import type { Locale } from '@/i18n'
+import { useRenderI18nObject } from '@/hooks/use-i18n'
+import { API_PREFIX } from '@/config'
+import cn from '@/utils/classnames'
+
+type Props = {
+  provider: {
+    author: string
+    name: string
+    description: Record<Locale, string>
+    tenant_id: string
+    icon: string
+    label: Record<Locale, string>
+    tags: string[]
+  }
+  detail: StrategyDetailType
+  onHide: () => void
+}
+
+const StrategyDetail: FC<Props> = ({
+  provider,
+  detail,
+  onHide,
+}) => {
+  const getValueFromI18nObject = useRenderI18nObject()
+  const { t } = useTranslation()
+
+  const outputSchema = useMemo(() => {
+    const res: any[] = []
+    if (!detail.output_schema)
+      return []
+    Object.keys(detail.output_schema.properties).forEach((outputKey) => {
+      const output = detail.output_schema.properties[outputKey]
+      res.push({
+        name: outputKey,
+        type: output.type === 'array'
+          ? `Array[${output.items?.type.slice(0, 1).toLocaleUpperCase()}${output.items?.type.slice(1)}]`
+          : `${output.type.slice(0, 1).toLocaleUpperCase()}${output.type.slice(1)}`,
+        description: output.description,
+      })
+    })
+    return res
+  }, [detail.output_schema])
+
+  const getType = (type: string) => {
+    if (type === 'number-input')
+      return t('tools.setBuiltInTools.number')
+    if (type === 'text-input')
+      return t('tools.setBuiltInTools.string')
+    if (type === 'file')
+      return t('tools.setBuiltInTools.file')
+    if (type === 'array[tools]')
+      return 'multiple-tool-select'
+    return type
+  }
+
+  return (
+    <Drawer
+      isOpen
+      clickOutsideNotOpen={false}
+      onClose={onHide}
+      footer={null}
+      mask={false}
+      positionCenter={false}
+      panelClassName={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')}
+    >
+      <>
+        {/* header */}
+        <div className='relative border-b border-divider-subtle p-4 pb-3'>
+          <div className='absolute right-3 top-3'>
+            <ActionButton onClick={onHide}>
+              <RiCloseLine className='h-4 w-4' />
+            </ActionButton>
+          </div>
+          <div
+            className='system-xs-semibold-uppercase mb-2 flex cursor-pointer items-center gap-1 text-text-accent-secondary'
+            onClick={onHide}
+          >
+            <RiArrowLeftLine className='h-4 w-4' />
+            BACK
+          </div>
+          <div className='flex items-center gap-1'>
+            <Icon size='tiny' className='h-6 w-6' src={`${API_PREFIX}/workspaces/current/plugin/icon?tenant_id=${provider.tenant_id}&filename=${provider.icon}`} />
+            <div className=''>{getValueFromI18nObject(provider.label)}</div>
+          </div>
+          <div className='system-md-semibold mt-1 text-text-primary'>{getValueFromI18nObject(detail.identity.label)}</div>
+          <Description className='mt-3' text={getValueFromI18nObject(detail.description)} descriptionLineRows={2}></Description>
+        </div>
+        {/* form */}
+        <div className='h-full'>
+          <div className='flex h-full flex-col overflow-y-auto'>
+            <div className='system-sm-semibold-uppercase p-4 pb-1 text-text-primary'>{t('tools.setBuiltInTools.parameters')}</div>
+            <div className='px-4'>
+              {detail.parameters.length > 0 && (
+                <div className='space-y-1 py-2'>
+                  {detail.parameters.map((item: any, index) => (
+                    <div key={index} className='py-1'>
+                      <div className='flex items-center gap-2'>
+                        <div className='code-sm-semibold text-text-secondary'>{getValueFromI18nObject(item.label)}</div>
+                        <div className='system-xs-regular text-text-tertiary'>
+                          {getType(item.type)}
+                        </div>
+                        {item.required && (
+                          <div className='system-xs-medium text-text-warning-secondary'>{t('tools.setBuiltInTools.required')}</div>
+                        )}
+                      </div>
+                      {item.human_description && (
+                        <div className='system-xs-regular mt-0.5 text-text-tertiary'>
+                          {getValueFromI18nObject(item.human_description)}
+                        </div>
+                      )}
+                    </div>
+                  ))}
+                </div>
+              )}
+            </div>
+            {detail.output_schema && (
+              <>
+                <div className='px-4'>
+                  <Divider className="!mt-2" />
+                </div>
+                <div className='system-sm-semibold-uppercase p-4 pb-1 text-text-primary'>OUTPUT</div>
+                {outputSchema.length > 0 && (
+                  <div className='space-y-1 px-4 py-2'>
+                    {outputSchema.map((outputItem, index) => (
+                      <div key={index} className='py-1'>
+                        <div className='flex items-center gap-2'>
+                          <div className='code-sm-semibold text-text-secondary'>{outputItem.name}</div>
+                          <div className='system-xs-regular text-text-tertiary'>{outputItem.type}</div>
+                        </div>
+                        {outputItem.description && (
+                          <div className='system-xs-regular mt-0.5 text-text-tertiary'>
+                            {outputItem.description}
+                          </div>
+                        )}
+                      </div>
+                    ))}
+                  </div>
+                )}
+              </>
+            )}
+          </div>
+        </div>
+      </>
+    </Drawer>
+  )
+}
+export default StrategyDetail
diff --git a/app/components/plugins/plugin-detail-panel/strategy-item.tsx b/app/components/plugins/plugin-detail-panel/strategy-item.tsx
new file mode 100644
index 0000000..3b6a1d8
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/strategy-item.tsx
@@ -0,0 +1,50 @@
+'use client'
+import React, { useState } from 'react'
+import StrategyDetailPanel from './strategy-detail'
+import type {
+  StrategyDetail,
+} from '@/app/components/plugins/types'
+import type { Locale } from '@/i18n'
+import { useRenderI18nObject } from '@/hooks/use-i18n'
+import cn from '@/utils/classnames'
+
+type Props = {
+  provider: {
+    author: string
+    name: string
+    description: Record<Locale, string>
+    tenant_id: string
+    icon: string
+    label: Record<Locale, string>
+    tags: string[]
+  }
+  detail: StrategyDetail
+}
+
+const StrategyItem = ({
+  provider,
+  detail,
+}: Props) => {
+  const getValueFromI18nObject = useRenderI18nObject()
+  const [showDetail, setShowDetail] = useState(false)
+
+  return (
+    <>
+      <div
+        className={cn('bg-components-panel-item-bg mb-2 cursor-pointer rounded-xl border-[0.5px] border-components-panel-border-subtle px-4 py-3 shadow-xs hover:bg-components-panel-on-panel-item-bg-hover')}
+        onClick={() => setShowDetail(true)}
+      >
+        <div className='system-md-semibold pb-0.5 text-text-secondary'>{getValueFromI18nObject(detail.identity.label)}</div>
+        <div className='system-xs-regular line-clamp-2 text-text-tertiary' title={getValueFromI18nObject(detail.description)}>{getValueFromI18nObject(detail.description)}</div>
+      </div>
+      {showDetail && (
+        <StrategyDetailPanel
+          provider={provider}
+          detail={detail}
+          onHide={() => setShowDetail(false)}
+        />
+      )}
+    </>
+  )
+}
+export default StrategyItem
diff --git a/app/components/plugins/plugin-detail-panel/tool-selector/hooks.ts b/app/components/plugins/plugin-detail-panel/tool-selector/hooks.ts
new file mode 100644
index 0000000..57c1fbd
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/tool-selector/hooks.ts
@@ -0,0 +1,14 @@
+import {
+  usePluginManifestInfo,
+} from '@/service/use-plugins'
+
+export const usePluginInstalledCheck = (providerName = '') => {
+  const pluginID = providerName?.split('/').splice(0, 2).join('/')
+
+  const { data: manifest } = usePluginManifestInfo(pluginID)
+
+  return {
+    inMarketPlace: !!manifest,
+    manifest: manifest?.data.plugin,
+  }
+}
diff --git a/app/components/plugins/plugin-detail-panel/tool-selector/index.tsx b/app/components/plugins/plugin-detail-panel/tool-selector/index.tsx
new file mode 100644
index 0000000..577de19
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/tool-selector/index.tsx
@@ -0,0 +1,458 @@
+'use client'
+import type { FC } from 'react'
+import React, { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import Link from 'next/link'
+import {
+  RiArrowLeftLine,
+  RiArrowRightUpLine,
+} from '@remixicon/react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import ToolTrigger from '@/app/components/plugins/plugin-detail-panel/tool-selector/tool-trigger'
+import ToolItem from '@/app/components/plugins/plugin-detail-panel/tool-selector/tool-item'
+import ToolPicker from '@/app/components/workflow/block-selector/tool-picker'
+import Button from '@/app/components/base/button'
+import Indicator from '@/app/components/header/indicator'
+import ToolCredentialForm from '@/app/components/plugins/plugin-detail-panel/tool-selector/tool-credentials-form'
+import Toast from '@/app/components/base/toast'
+import Textarea from '@/app/components/base/textarea'
+import Divider from '@/app/components/base/divider'
+import TabSlider from '@/app/components/base/tab-slider-plain'
+import ReasoningConfigForm from '@/app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form'
+import Form from '@/app/components/header/account-setting/model-provider-page/model-modal/Form'
+import { generateFormValue, getPlainValue, getStructureValue, toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
+
+import { useAppContext } from '@/context/app-context'
+import {
+  useAllBuiltInTools,
+  useAllCustomTools,
+  useAllWorkflowTools,
+  useInvalidateAllBuiltInTools,
+  useUpdateProviderCredentials,
+} from '@/service/use-tools'
+import { useInvalidateInstalledPluginList } from '@/service/use-plugins'
+import { usePluginInstalledCheck } from '@/app/components/plugins/plugin-detail-panel/tool-selector/hooks'
+import { CollectionType } from '@/app/components/tools/types'
+import type { ToolDefaultValue, ToolValue } from '@/app/components/workflow/block-selector/types'
+import type {
+  OffsetOptions,
+  Placement,
+} from '@floating-ui/react'
+import { MARKETPLACE_API_PREFIX } from '@/config'
+import type { Node } from 'reactflow'
+import type { NodeOutPutVar } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+
+type Props = {
+  disabled?: boolean
+  placement?: Placement
+  offset?: OffsetOptions
+  scope?: string
+  value?: ToolValue
+  selectedTools?: ToolValue[]
+  onSelect: (tool: {
+    provider_name: string
+    tool_name: string
+    tool_label: string
+    settings?: Record<string, any>
+    parameters?: Record<string, any>
+    extra?: Record<string, any>
+  }) => void
+  onDelete?: () => void
+  supportEnableSwitch?: boolean
+  supportAddCustomTool?: boolean
+  trigger?: React.ReactNode
+  controlledState?: boolean
+  onControlledStateChange?: (state: boolean) => void
+  panelShowState?: boolean
+  onPanelShowStateChange?: (state: boolean) => void
+  nodeOutputVars: NodeOutPutVar[],
+  availableNodes: Node[],
+  nodeId?: string,
+}
+const ToolSelector: FC<Props> = ({
+  value,
+  selectedTools,
+  disabled,
+  placement = 'left',
+  offset = 4,
+  onSelect,
+  onDelete,
+  scope,
+  supportEnableSwitch,
+  trigger,
+  controlledState,
+  onControlledStateChange,
+  panelShowState,
+  onPanelShowStateChange,
+  nodeOutputVars,
+  availableNodes,
+  nodeId = '',
+}) => {
+  const { t } = useTranslation()
+  const [isShow, onShowChange] = useState(false)
+  const handleTriggerClick = () => {
+    if (disabled) return
+    onShowChange(true)
+  }
+
+  const { data: buildInTools } = useAllBuiltInTools()
+  const { data: customTools } = useAllCustomTools()
+  const { data: workflowTools } = useAllWorkflowTools()
+  const invalidateAllBuiltinTools = useInvalidateAllBuiltInTools()
+  const invalidateInstalledPluginList = useInvalidateInstalledPluginList()
+
+  // plugin info check
+  const { inMarketPlace, manifest } = usePluginInstalledCheck(value?.provider_name)
+
+  const currentProvider = useMemo(() => {
+    const mergedTools = [...(buildInTools || []), ...(customTools || []), ...(workflowTools || [])]
+    return mergedTools.find((toolWithProvider) => {
+      return toolWithProvider.id === value?.provider_name
+    })
+  }, [value, buildInTools, customTools, workflowTools])
+
+  const [isShowChooseTool, setIsShowChooseTool] = useState(false)
+  const handleSelectTool = (tool: ToolDefaultValue) => {
+    const settingValues = generateFormValue(tool.params, toolParametersToFormSchemas(tool.paramSchemas.filter(param => param.form !== 'llm') as any))
+    const paramValues = generateFormValue(tool.params, toolParametersToFormSchemas(tool.paramSchemas.filter(param => param.form === 'llm') as any), true)
+    const toolValue = {
+      provider_name: tool.provider_id,
+      type: tool.provider_type,
+      tool_name: tool.tool_name,
+      tool_label: tool.tool_label,
+      tool_description: tool.tool_description,
+      settings: settingValues,
+      parameters: paramValues,
+      enabled: tool.is_team_authorization,
+      extra: {
+        description: tool.tool_description,
+      },
+      schemas: tool.paramSchemas,
+    }
+    onSelect(toolValue)
+    // setIsShowChooseTool(false)
+  }
+
+  const handleDescriptionChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
+    onSelect({
+      ...value,
+      extra: {
+        ...value?.extra,
+        description: e.target.value || '',
+      },
+    } as any)
+  }
+
+  // tool settings & params
+  const currentToolSettings = useMemo(() => {
+    if (!currentProvider) return []
+    return currentProvider.tools.find(tool => tool.name === value?.tool_name)?.parameters.filter(param => param.form !== 'llm') || []
+  }, [currentProvider, value])
+  const currentToolParams = useMemo(() => {
+    if (!currentProvider) return []
+    return currentProvider.tools.find(tool => tool.name === value?.tool_name)?.parameters.filter(param => param.form === 'llm') || []
+  }, [currentProvider, value])
+  const [currType, setCurrType] = useState('settings')
+  const showTabSlider = currentToolSettings.length > 0 && currentToolParams.length > 0
+  const userSettingsOnly = currentToolSettings.length > 0 && !currentToolParams.length
+  const reasoningConfigOnly = currentToolParams.length > 0 && !currentToolSettings.length
+
+  const settingsFormSchemas = useMemo(() => toolParametersToFormSchemas(currentToolSettings), [currentToolSettings])
+  const paramsFormSchemas = useMemo(() => toolParametersToFormSchemas(currentToolParams), [currentToolParams])
+
+  const handleSettingsFormChange = (v: Record<string, any>) => {
+    const newValue = getStructureValue(v)
+
+    const toolValue = {
+      ...value,
+      settings: newValue,
+    }
+    onSelect(toolValue as any)
+  }
+  const handleParamsFormChange = (v: Record<string, any>) => {
+    const toolValue = {
+      ...value,
+      parameters: v,
+    }
+    onSelect(toolValue as any)
+  }
+
+  const handleEnabledChange = (state: boolean) => {
+    onSelect({
+      ...value,
+      enabled: state,
+    } as any)
+  }
+
+  // authorization
+  const { isCurrentWorkspaceManager } = useAppContext()
+  const [isShowSettingAuth, setShowSettingAuth] = useState(false)
+  const handleCredentialSettingUpdate = () => {
+    invalidateAllBuiltinTools()
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+    setShowSettingAuth(false)
+    onShowChange(false)
+  }
+
+  const { mutate: updatePermission } = useUpdateProviderCredentials({
+    onSuccess: handleCredentialSettingUpdate,
+  })
+
+  // install from marketplace
+  const currentTool = useMemo(() => {
+    return currentProvider?.tools.find(tool => tool.name === value?.tool_name)
+  }, [currentProvider?.tools, value?.tool_name])
+  const manifestIcon = useMemo(() => {
+    if (!manifest)
+      return ''
+    return `${MARKETPLACE_API_PREFIX}/plugins/${(manifest as any).plugin_id}/icon`
+  }, [manifest])
+  const handleInstall = async () => {
+    invalidateAllBuiltinTools()
+    invalidateInstalledPluginList()
+  }
+
+  return (
+    <>
+      <PortalToFollowElem
+        placement={placement}
+        offset={offset}
+        open={trigger ? controlledState : isShow}
+        onOpenChange={trigger ? onControlledStateChange : onShowChange}
+      >
+        <PortalToFollowElemTrigger
+          className='w-full'
+          onClick={() => {
+            if (!currentProvider || !currentTool) return
+            handleTriggerClick()
+          }}
+        >
+          {trigger}
+          {!trigger && !value?.provider_name && (
+            <ToolTrigger
+              isConfigure
+              open={isShow}
+              value={value}
+              provider={currentProvider}
+            />
+          )}
+          {!trigger && value?.provider_name && (
+            <ToolItem
+              open={isShow}
+              icon={currentProvider?.icon || manifestIcon}
+              providerName={value.provider_name}
+              toolLabel={value.tool_label || value.tool_name}
+              showSwitch={supportEnableSwitch}
+              switchValue={value.enabled}
+              onSwitchChange={handleEnabledChange}
+              onDelete={onDelete}
+              noAuth={currentProvider && currentTool && !currentProvider.is_team_authorization}
+              onAuth={() => setShowSettingAuth(true)}
+              uninstalled={!currentProvider && inMarketPlace}
+              versionMismatch={currentProvider && inMarketPlace && !currentTool}
+              installInfo={manifest?.latest_package_identifier}
+              onInstall={() => handleInstall()}
+              isError={(!currentProvider || !currentTool) && !inMarketPlace}
+              errorTip={
+                <div className='max-w-[240px] space-y-1 text-xs'>
+                  <h3 className='font-semibold text-text-primary'>{currentTool ? t('plugin.detailPanel.toolSelector.uninstalledTitle') : t('plugin.detailPanel.toolSelector.unsupportedTitle')}</h3>
+                  <p className='tracking-tight text-text-secondary'>{currentTool ? t('plugin.detailPanel.toolSelector.uninstalledContent') : t('plugin.detailPanel.toolSelector.unsupportedContent')}</p>
+                  <p>
+                    <Link href={'/plugins'} className='tracking-tight text-text-accent'>{t('plugin.detailPanel.toolSelector.uninstalledLink')}</Link>
+                  </p>
+                </div>
+              }
+            />
+          )}
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[1000]'>
+          <div className={cn('relative max-h-[642px] min-h-20 w-[361px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur pb-4 shadow-lg backdrop-blur-sm', !isShowSettingAuth && 'overflow-y-auto pb-2')}>
+            {!isShowSettingAuth && (
+              <>
+                <div className='system-xl-semibold px-4 pb-1 pt-3.5 text-text-primary'>{t('plugin.detailPanel.toolSelector.title')}</div>
+                {/* base form */}
+                <div className='flex flex-col gap-3 px-4 py-2'>
+                  <div className='flex flex-col gap-1'>
+                    <div className='system-sm-semibold flex h-6 items-center text-text-secondary'>{t('plugin.detailPanel.toolSelector.toolLabel')}</div>
+                    <ToolPicker
+                      panelClassName='w-[328px]'
+                      placement='bottom'
+                      offset={offset}
+                      trigger={
+                        <ToolTrigger
+                          open={panelShowState || isShowChooseTool}
+                          value={value}
+                          provider={currentProvider}
+                        />
+                      }
+                      isShow={panelShowState || isShowChooseTool}
+                      onShowChange={trigger ? onPanelShowStateChange as any : setIsShowChooseTool}
+                      disabled={false}
+                      supportAddCustomTool
+                      onSelect={handleSelectTool}
+                      scope={scope}
+                      selectedTools={selectedTools}
+                    />
+                  </div>
+                  <div className='flex flex-col gap-1'>
+                    <div className='system-sm-semibold flex h-6 items-center text-text-secondary'>{t('plugin.detailPanel.toolSelector.descriptionLabel')}</div>
+                    <Textarea
+                      className='resize-none'
+                      placeholder={t('plugin.detailPanel.toolSelector.descriptionPlaceholder')}
+                      value={value?.extra?.description || ''}
+                      onChange={handleDescriptionChange}
+                      disabled={!value?.provider_name}
+                    />
+                  </div>
+                </div>
+                {/* authorization */}
+                {currentProvider && currentProvider.type === CollectionType.builtIn && currentProvider.allow_delete && (
+                  <>
+                    <Divider className='my-1 w-full' />
+                    <div className='px-4 py-2'>
+                      {!currentProvider.is_team_authorization && (
+                        <Button
+                          variant='primary'
+                          className={cn('w-full shrink-0')}
+                          onClick={() => setShowSettingAuth(true)}
+                          disabled={!isCurrentWorkspaceManager}
+                        >
+                          {t('tools.auth.unauthorized')}
+                        </Button>
+                      )}
+                      {currentProvider.is_team_authorization && (
+                        <Button
+                          variant='secondary'
+                          className={cn('w-full shrink-0')}
+                          onClick={() => setShowSettingAuth(true)}
+                          disabled={!isCurrentWorkspaceManager}
+                        >
+                          <Indicator className='mr-2' color={'green'} />
+                          {t('tools.auth.authorized')}
+                        </Button>
+                      )}
+                    </div>
+                  </>
+                )}
+                {/* tool settings */}
+                {(currentToolSettings.length > 0 || currentToolParams.length > 0) && currentProvider?.is_team_authorization && (
+                  <>
+                    <Divider className='my-1 w-full' />
+                    {/* tabs */}
+                    {nodeId && showTabSlider && (
+                      <TabSlider
+                        className='mt-1 shrink-0 px-4'
+                        itemClassName='py-3'
+                        noBorderBottom
+                        smallItem
+                        value={currType}
+                        onChange={(value) => {
+                          setCurrType(value)
+                        }}
+                        options={[
+                          { value: 'settings', text: t('plugin.detailPanel.toolSelector.settings')! },
+                          { value: 'params', text: t('plugin.detailPanel.toolSelector.params')! },
+                        ]}
+                      />
+                    )}
+                    {nodeId && showTabSlider && currType === 'params' && (
+                      <div className='px-4 py-2'>
+                        <div className='system-xs-regular text-text-tertiary'>{t('plugin.detailPanel.toolSelector.paramsTip1')}</div>
+                        <div className='system-xs-regular text-text-tertiary'>{t('plugin.detailPanel.toolSelector.paramsTip2')}</div>
+                      </div>
+                    )}
+                    {/* user settings only */}
+                    {userSettingsOnly && (
+                      <div className='p-4 pb-1'>
+                        <div className='system-sm-semibold-uppercase text-text-primary'>{t('plugin.detailPanel.toolSelector.settings')}</div>
+                      </div>
+                    )}
+                    {/* reasoning config only */}
+                    {nodeId && reasoningConfigOnly && (
+                      <div className='mb-1 p-4 pb-1'>
+                        <div className='system-sm-semibold-uppercase text-text-primary'>{t('plugin.detailPanel.toolSelector.params')}</div>
+                        <div className='pb-1'>
+                          <div className='system-xs-regular text-text-tertiary'>{t('plugin.detailPanel.toolSelector.paramsTip1')}</div>
+                          <div className='system-xs-regular text-text-tertiary'>{t('plugin.detailPanel.toolSelector.paramsTip2')}</div>
+                        </div>
+                      </div>
+                    )}
+                    {/* user settings form */}
+                    {(currType === 'settings' || userSettingsOnly) && (
+                      <div className='px-4 py-2'>
+                        <Form
+                          value={getPlainValue(value?.settings || {})}
+                          onChange={handleSettingsFormChange}
+                          formSchemas={settingsFormSchemas as any}
+                          isEditMode={true}
+                          showOnVariableMap={{}}
+                          validating={false}
+                          inputClassName='bg-components-input-bg-normal hover:bg-components-input-bg-hover'
+                          fieldMoreInfo={item => item.url
+                            ? (<a
+                              href={item.url}
+                              target='_blank' rel='noopener noreferrer'
+                              className='inline-flex items-center text-xs text-text-accent'
+                            >
+                              {t('tools.howToGet')}
+                              <RiArrowRightUpLine className='ml-1 h-3 w-3' />
+                            </a>)
+                            : null}
+                        />
+                      </div>
+                    )}
+                    {/* reasoning config form */}
+                    {nodeId && (currType === 'params' || reasoningConfigOnly) && (
+                      <ReasoningConfigForm
+                        value={value?.parameters || {}}
+                        onChange={handleParamsFormChange}
+                        schemas={paramsFormSchemas as any}
+                        nodeOutputVars={nodeOutputVars}
+                        availableNodes={availableNodes}
+                        nodeId={nodeId}
+                      />
+                    )}
+                  </>
+                )}
+              </>
+            )}
+            {/* authorization panel */}
+            {isShowSettingAuth && currentProvider && (
+              <>
+                <div className='relative flex flex-col gap-1 pt-3.5'>
+                  <div className='absolute -top-2 left-2 w-[345px] rounded-t-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur pt-2 backdrop-blur-sm'></div>
+                  <div
+                    className='system-xs-semibold-uppercase flex h-6 cursor-pointer items-center gap-1 px-3 text-text-accent-secondary'
+                    onClick={() => setShowSettingAuth(false)}
+                  >
+                    <RiArrowLeftLine className='h-4 w-4' />
+                    BACK
+                  </div>
+                  <div className='system-xl-semibold px-4 text-text-primary'>{t('tools.auth.setupModalTitle')}</div>
+                  <div className='system-xs-regular px-4 text-text-tertiary'>{t('tools.auth.setupModalTitleDescription')}</div>
+                </div>
+                <ToolCredentialForm
+                  collection={currentProvider}
+                  onCancel={() => setShowSettingAuth(false)}
+                  onSaved={async value => updatePermission({
+                    providerName: currentProvider.name,
+                    credentials: value,
+                  })}
+                />
+              </>
+            )}
+          </div>
+        </PortalToFollowElemContent>
+      </PortalToFollowElem>
+    </>
+  )
+}
+export default React.memo(ToolSelector)
diff --git a/app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form.tsx b/app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form.tsx
new file mode 100644
index 0000000..750a8cf
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form.tsx
@@ -0,0 +1,275 @@
+import { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import {
+  RiArrowRightUpLine,
+} from '@remixicon/react'
+import Tooltip from '@/app/components/base/tooltip'
+import Switch from '@/app/components/base/switch'
+import Input from '@/app/components/workflow/nodes/_base/components/input-support-select-var'
+import VarReferencePicker from '@/app/components/workflow/nodes/_base/components/variable/var-reference-picker'
+import AppSelector from '@/app/components/plugins/plugin-detail-panel/app-selector'
+import ModelParameterModal from '@/app/components/plugins/plugin-detail-panel/model-selector'
+import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import type { Node } from 'reactflow'
+import type {
+  NodeOutPutVar,
+  ValueSelector,
+  Var,
+} from '@/app/components/workflow/types'
+import type { ToolVarInputs } from '@/app/components/workflow/nodes/tool/types'
+import { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types'
+import { VarType } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+
+type Props = {
+  value: Record<string, any>
+  onChange: (val: Record<string, any>) => void
+  schemas: any[]
+  nodeOutputVars: NodeOutPutVar[],
+  availableNodes: Node[],
+  nodeId: string
+}
+
+const ReasoningConfigForm: React.FC<Props> = ({
+  value,
+  onChange,
+  schemas,
+  nodeOutputVars,
+  availableNodes,
+  nodeId,
+}) => {
+  const { t } = useTranslation()
+  const language = useLanguage()
+  const handleAutomatic = (key: string, val: any) => {
+    onChange({
+      ...value,
+      [key]: {
+        value: val ? null : value[key]?.value,
+        auto: val ? 1 : 0,
+      },
+    })
+  }
+
+  const [inputsIsFocus, setInputsIsFocus] = useState<Record<string, boolean>>({})
+  const handleInputFocus = useCallback((variable: string) => {
+    return (value: boolean) => {
+      setInputsIsFocus((prev) => {
+        return {
+          ...prev,
+          [variable]: value,
+        }
+      })
+    }
+  }, [])
+  const handleNotMixedTypeChange = useCallback((variable: string) => {
+    return (varValue: ValueSelector | string, varKindType: VarKindType) => {
+      const newValue = produce(value, (draft: ToolVarInputs) => {
+        const target = draft[variable].value
+        if (target) {
+          target.type = varKindType
+          target.value = varValue
+        }
+        else {
+          draft[variable].value = {
+            type: varKindType,
+            value: varValue,
+          }
+        }
+      })
+      onChange(newValue)
+    }
+  }, [value, onChange])
+  const handleMixedTypeChange = useCallback((variable: string) => {
+    return (itemValue: string) => {
+      const newValue = produce(value, (draft: ToolVarInputs) => {
+        const target = draft[variable].value
+        if (target) {
+          target.value = itemValue
+        }
+        else {
+          draft[variable].value = {
+            type: VarKindType.mixed,
+            value: itemValue,
+          }
+        }
+      })
+      onChange(newValue)
+    }
+  }, [value, onChange])
+  const handleFileChange = useCallback((variable: string) => {
+    return (varValue: ValueSelector | string) => {
+      const newValue = produce(value, (draft: ToolVarInputs) => {
+        draft[variable].value = {
+          type: VarKindType.variable,
+          value: varValue,
+        }
+      })
+      onChange(newValue)
+    }
+  }, [value, onChange])
+  const handleAppChange = useCallback((variable: string) => {
+    return (app: {
+      app_id: string
+      inputs: Record<string, any>
+      files?: any[]
+    }) => {
+      const newValue = produce(value, (draft: ToolVarInputs) => {
+        draft[variable].value = app as any
+      })
+      onChange(newValue)
+    }
+  }, [onChange, value])
+  const handleModelChange = useCallback((variable: string) => {
+    return (model: any) => {
+      const newValue = produce(value, (draft: ToolVarInputs) => {
+        draft[variable].value = {
+          ...draft[variable].value,
+          ...model,
+        } as any
+      })
+      onChange(newValue)
+    }
+  }, [onChange, value])
+
+  const renderField = (schema: any) => {
+    const {
+      variable,
+      label,
+      required,
+      tooltip,
+      type,
+      scope,
+      url,
+    } = schema
+    const auto = value[variable]?.auto
+    const tooltipContent = (tooltip && (
+      <Tooltip
+        popupContent={<div className='w-[200px]'>
+          {tooltip[language] || tooltip.en_US}
+        </div>}
+        triggerClassName='ml-1 w-4 h-4'
+        asChild={false} />
+    ))
+    const varInput = value[variable].value
+    const isNumber = type === FormTypeEnum.textNumber
+    const isSelect = type === FormTypeEnum.select
+    const isFile = type === FormTypeEnum.file || type === FormTypeEnum.files
+    const isAppSelector = type === FormTypeEnum.appSelector
+    const isModelSelector = type === FormTypeEnum.modelSelector
+    // const isToolSelector = type === FormTypeEnum.toolSelector
+    const isString = !isNumber && !isSelect && !isFile && !isAppSelector && !isModelSelector
+    return (
+      <div key={variable} className='space-y-1'>
+        <div className='system-sm-semibold flex items-center justify-between py-2 text-text-secondary'>
+          <div className='flex items-center space-x-2'>
+            <span className={cn('code-sm-semibold text-text-secondary')}>{label[language] || label.en_US}</span>
+            {required && (
+              <span className='ml-1 text-red-500'>*</span>
+            )}
+            {tooltipContent}
+          </div>
+          <div className='flex cursor-pointer items-center gap-1 rounded-[6px] border border-divider-subtle bg-background-default-lighter px-2 py-1 hover:bg-state-base-hover' onClick={() => handleAutomatic(variable, !auto)}>
+            <span className='system-xs-medium text-text-secondary'>{t('plugin.detailPanel.toolSelector.auto')}</span>
+            <Switch
+              size='xs'
+              defaultValue={!!auto}
+              onChange={val => handleAutomatic(variable, val)}
+            />
+          </div>
+        </div>
+        {auto === 0 && (
+          <>
+            {isString && (
+              <Input
+                className={cn(inputsIsFocus[variable] ? 'border-components-input-border-active bg-components-input-bg-active shadow-xs' : 'border-components-input-border-hover bg-components-input-bg-normal', 'rounded-lg border px-3 py-[6px]')}
+                value={varInput?.value as string || ''}
+                onChange={handleMixedTypeChange(variable)}
+                nodesOutputVars={nodeOutputVars}
+                availableNodes={availableNodes}
+                onFocusChange={handleInputFocus(variable)}
+                placeholder={t('workflow.nodes.http.insertVarPlaceholder')!}
+                placeholderClassName='!leading-[21px]'
+              />
+            )}
+            {/* {isString && (
+              <VarReferencePicker
+                zIndex={1001}
+                readonly={false}
+                isShowNodeName
+                nodeId={nodeId}
+                value={varInput?.value || ''}
+                onChange={handleNotMixedTypeChange(variable)}
+                defaultVarKindType={VarKindType.variable}
+                filterVar={(varPayload: Var) => varPayload.type === VarType.number || varPayload.type === VarType.secret || varPayload.type === VarType.string}
+              />
+            )} */}
+            {(isNumber || isSelect) && (
+              <VarReferencePicker
+                zIndex={1001}
+                readonly={false}
+                isShowNodeName
+                nodeId={nodeId}
+                value={varInput?.type === VarKindType.constant ? (varInput?.value ?? '') : (varInput?.value ?? [])}
+                onChange={handleNotMixedTypeChange(variable)}
+                defaultVarKindType={varInput?.type || (isNumber ? VarKindType.constant : VarKindType.variable)}
+                isSupportConstantValue
+                filterVar={isNumber ? (varPayload: Var) => varPayload.type === schema._type : undefined}
+                availableVars={isSelect ? nodeOutputVars : undefined}
+                schema={schema}
+              />
+            )}
+            {isFile && (
+              <VarReferencePicker
+                zIndex={1001}
+                readonly={false}
+                isShowNodeName
+                nodeId={nodeId}
+                value={varInput?.value || []}
+                onChange={handleFileChange(variable)}
+                defaultVarKindType={VarKindType.variable}
+                filterVar={(varPayload: Var) => varPayload.type === VarType.file || varPayload.type === VarType.arrayFile}
+              />
+            )}
+            {isAppSelector && (
+              <AppSelector
+                disabled={false}
+                scope={scope || 'all'}
+                value={varInput as any}
+                onSelect={handleAppChange(variable)}
+              />
+            )}
+            {isModelSelector && (
+              <ModelParameterModal
+                popupClassName='!w-[387px]'
+                isAdvancedMode
+                isInWorkflow
+                value={varInput}
+                setModel={handleModelChange(variable)}
+                scope={scope}
+              />
+            )}
+          </>
+        )}
+        {url && (
+          <a
+            href={url}
+            target='_blank' rel='noopener noreferrer'
+            className='inline-flex items-center text-xs text-text-accent'
+          >
+            {t('tools.howToGet')}
+            <RiArrowRightUpLine className='ml-1 h-3 w-3' />
+          </a>
+        )}
+      </div>
+    )
+  }
+  return (
+    <div className='space-y-3 px-4 py-2'>
+      {schemas.map(schema => renderField(schema))}
+    </div>
+  )
+}
+
+export default ReasoningConfigForm
diff --git a/app/components/plugins/plugin-detail-panel/tool-selector/tool-credentials-form.tsx b/app/components/plugins/plugin-detail-panel/tool-selector/tool-credentials-form.tsx
new file mode 100644
index 0000000..fd7ec61
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/tool-selector/tool-credentials-form.tsx
@@ -0,0 +1,97 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowRightUpLine,
+} from '@remixicon/react'
+import { addDefaultValue, toolCredentialToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
+import type { Collection } from '@/app/components/tools/types'
+import Button from '@/app/components/base/button'
+import Toast from '@/app/components/base/toast'
+import { fetchBuiltInToolCredential, fetchBuiltInToolCredentialSchema } from '@/service/tools'
+import Loading from '@/app/components/base/loading'
+import Form from '@/app/components/header/account-setting/model-provider-page/model-modal/Form'
+import { useRenderI18nObject } from '@/hooks/use-i18n'
+import cn from '@/utils/classnames'
+
+type Props = {
+  collection: Collection
+  onCancel: () => void
+  onSaved: (value: Record<string, any>) => void
+}
+
+const ToolCredentialForm: FC<Props> = ({
+  collection,
+  onCancel,
+  onSaved,
+}) => {
+  const getValueFromI18nObject = useRenderI18nObject()
+  const { t } = useTranslation()
+  const [credentialSchema, setCredentialSchema] = useState<any>(null)
+  const { name: collectionName } = collection
+  const [tempCredential, setTempCredential] = React.useState<any>({})
+  useEffect(() => {
+    fetchBuiltInToolCredentialSchema(collectionName).then(async (res) => {
+      const toolCredentialSchemas = toolCredentialToFormSchemas(res)
+      const credentialValue = await fetchBuiltInToolCredential(collectionName)
+      setTempCredential(credentialValue)
+      const defaultCredentials = addDefaultValue(credentialValue, toolCredentialSchemas)
+      setCredentialSchema(toolCredentialSchemas)
+      setTempCredential(defaultCredentials)
+    })
+  }, [])
+
+  const handleSave = () => {
+    for (const field of credentialSchema) {
+      if (field.required && !tempCredential[field.name]) {
+        Toast.notify({ type: 'error', message: t('common.errorMsg.fieldRequired', { field: getValueFromI18nObject(field.label) }) })
+        return
+      }
+    }
+    onSaved(tempCredential)
+  }
+
+  return (
+    <>
+      {!credentialSchema
+        ? <div className='pt-3'><Loading type='app' /></div>
+        : (
+          <>
+            <div className='max-h-[464px] overflow-y-auto px-4'>
+              <Form
+                value={tempCredential}
+                onChange={(v) => {
+                  setTempCredential(v)
+                }}
+                formSchemas={credentialSchema}
+                isEditMode={true}
+                showOnVariableMap={{}}
+                validating={false}
+                inputClassName='bg-components-input-bg-normal hover:bg-components-input-bg-hover'
+                fieldMoreInfo={item => item.url
+                  ? (<a
+                    href={item.url}
+                    target='_blank' rel='noopener noreferrer'
+                    className='inline-flex items-center text-xs text-text-accent'
+                  >
+                    {t('tools.howToGet')}
+                    <RiArrowRightUpLine className='ml-1 h-3 w-3' />
+                  </a>)
+                  : null}
+              />
+            </div>
+            <div className={cn('mt-1 flex justify-end px-4')} >
+              <div className='flex space-x-2'>
+                <Button onClick={onCancel}>{t('common.operation.cancel')}</Button>
+                <Button variant='primary' onClick={handleSave}>{t('common.operation.save')}</Button>
+              </div>
+            </div>
+          </>
+        )
+      }
+
+    </>
+  )
+}
+export default React.memo(ToolCredentialForm)
diff --git a/app/components/plugins/plugin-detail-panel/tool-selector/tool-item.tsx b/app/components/plugins/plugin-detail-panel/tool-selector/tool-item.tsx
new file mode 100644
index 0000000..d74fccf
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/tool-selector/tool-item.tsx
@@ -0,0 +1,163 @@
+'use client'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiDeleteBinLine,
+  RiEqualizer2Line,
+  RiErrorWarningFill,
+} from '@remixicon/react'
+import { Group } from '@/app/components/base/icons/src/vender/other'
+import AppIcon from '@/app/components/base/app-icon'
+import Switch from '@/app/components/base/switch'
+import Button from '@/app/components/base/button'
+import Indicator from '@/app/components/header/indicator'
+import ActionButton from '@/app/components/base/action-button'
+import Tooltip from '@/app/components/base/tooltip'
+import { ToolTipContent } from '@/app/components/base/tooltip/content'
+import { InstallPluginButton } from '@/app/components/workflow/nodes/_base/components/install-plugin-button'
+import { SwitchPluginVersion } from '@/app/components/workflow/nodes/_base/components/switch-plugin-version'
+import cn from '@/utils/classnames'
+
+type Props = {
+  icon?: any
+  providerName?: string
+  toolLabel?: string
+  showSwitch?: boolean
+  switchValue?: boolean
+  onSwitchChange?: (value: boolean) => void
+  onDelete?: () => void
+  noAuth?: boolean
+  onAuth?: () => void
+  isError?: boolean
+  errorTip?: any
+  uninstalled?: boolean
+  installInfo?: string
+  onInstall?: () => void
+  versionMismatch?: boolean
+  open: boolean
+}
+
+const ToolItem = ({
+  open,
+  icon,
+  providerName,
+  toolLabel,
+  showSwitch,
+  switchValue,
+  onSwitchChange,
+  onDelete,
+  noAuth,
+  onAuth,
+  uninstalled,
+  installInfo,
+  onInstall,
+  isError,
+  errorTip,
+  versionMismatch,
+}: Props) => {
+  const { t } = useTranslation()
+  const providerNameText = providerName?.split('/').pop()
+  const isTransparent = uninstalled || versionMismatch || isError
+  const [isDeleting, setIsDeleting] = useState(false)
+
+  return (
+    <div className={cn(
+      'group flex cursor-default items-center gap-1 rounded-lg border-[0.5px] border-components-panel-border-subtle bg-components-panel-on-panel-item-bg p-1.5 pr-2 shadow-xs hover:bg-components-panel-on-panel-item-bg-hover hover:shadow-sm',
+      open && 'bg-components-panel-on-panel-item-bg-hover shadow-sm',
+      isDeleting && 'border-state-destructive-border shadow-xs hover:bg-state-destructive-hover',
+    )}>
+      {icon && (
+        <div className={cn('shrink-0', isTransparent && 'opacity-50')}>
+          {typeof icon === 'string' && <div className='h-7 w-7 rounded-lg border-[0.5px] border-components-panel-border-subtle bg-background-default-dodge bg-cover bg-center' style={{ backgroundImage: `url(${icon})` }} />}
+          {typeof icon !== 'string' && <AppIcon className='h-7 w-7 rounded-lg border-[0.5px] border-components-panel-border-subtle bg-background-default-dodge' size='xs' icon={icon?.content} background={icon?.background} />}
+        </div>
+      )}
+      {!icon && (
+        <div className={cn(
+          'flex h-7 w-7 items-center justify-center rounded-md border-[0.5px] border-components-panel-border-subtle bg-background-default-subtle',
+        )}>
+          <div className='flex h-5 w-5 items-center justify-center opacity-35'>
+            <Group className='text-text-tertiary' />
+          </div>
+        </div>
+      )}
+      <div className={cn('grow truncate pl-0.5', isTransparent && 'opacity-50')}>
+        <div className='system-2xs-medium-uppercase text-text-tertiary'>{providerNameText}</div>
+        <div className='system-xs-medium text-text-secondary'>{toolLabel}</div>
+      </div>
+      <div className='hidden items-center gap-1 group-hover:flex'>
+        {!noAuth && !isError && !uninstalled && !versionMismatch && (
+          <ActionButton>
+            <RiEqualizer2Line className='h-4 w-4' />
+          </ActionButton>
+        )}
+        <div
+          className='cursor-pointer rounded-md p-1 text-text-tertiary hover:text-text-destructive'
+          onClick={(e) => {
+            e.stopPropagation()
+            onDelete?.()
+          }}
+          onMouseOver={() => setIsDeleting(true)}
+          onMouseLeave={() => setIsDeleting(false)}
+        >
+          <RiDeleteBinLine className='h-4 w-4' />
+        </div>
+      </div>
+      {!isError && !uninstalled && !noAuth && !versionMismatch && showSwitch && (
+        <div className='mr-1' onClick={e => e.stopPropagation()}>
+          <Switch
+            size='md'
+            defaultValue={switchValue}
+            onChange={onSwitchChange}
+          />
+        </div>
+      )}
+      {!isError && !uninstalled && !versionMismatch && noAuth && (
+        <Button variant='secondary' size='small' onClick={onAuth}>
+          {t('tools.notAuthorized')}
+          <Indicator className='ml-2' color='orange' />
+        </Button>
+      )}
+      {!isError && !uninstalled && versionMismatch && installInfo && (
+        <div onClick={e => e.stopPropagation()}>
+          <SwitchPluginVersion
+            className='-mt-1'
+            uniqueIdentifier={installInfo}
+            tooltip={
+              <ToolTipContent
+                title={t('plugin.detailPanel.toolSelector.unsupportedTitle')}
+              >
+                {`${t('plugin.detailPanel.toolSelector.unsupportedContent')} ${t('plugin.detailPanel.toolSelector.unsupportedContent2')}`}
+              </ToolTipContent>
+            }
+            onChange={() => {
+              onInstall?.()
+            }}
+          />
+        </div>
+      )}
+      {!isError && uninstalled && installInfo && (
+        <InstallPluginButton
+          onClick={e => e.stopPropagation()}
+          size={'small'}
+          uniqueIdentifier={installInfo}
+          onSuccess={() => {
+            onInstall?.()
+          }}
+        />
+      )}
+      {isError && (
+        <Tooltip
+          popupContent={errorTip}
+          needsDelay
+        >
+          <div>
+            <RiErrorWarningFill className='h-4 w-4 text-text-destructive' />
+          </div>
+        </Tooltip>
+      )}
+    </div>
+  )
+}
+
+export default ToolItem
diff --git a/app/components/plugins/plugin-detail-panel/tool-selector/tool-trigger.tsx b/app/components/plugins/plugin-detail-panel/tool-selector/tool-trigger.tsx
new file mode 100644
index 0000000..94c5148
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/tool-selector/tool-trigger.tsx
@@ -0,0 +1,63 @@
+'use client'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowDownSLine,
+  RiEqualizer2Line,
+} from '@remixicon/react'
+import BlockIcon from '@/app/components/workflow/block-icon'
+import { BlockEnum } from '@/app/components/workflow/types'
+import type { ToolWithProvider } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+
+type Props = {
+  open: boolean
+  provider?: ToolWithProvider
+  value?: {
+    provider_name: string
+    tool_name: string
+  }
+  isConfigure?: boolean
+}
+
+const ToolTrigger = ({
+  open,
+  provider,
+  value,
+  isConfigure,
+}: Props) => {
+  const { t } = useTranslation()
+  return (
+    <div className={cn(
+      'group flex cursor-pointer items-center rounded-lg bg-components-input-bg-normal p-2 pl-3 hover:bg-state-base-hover-alt',
+      open && 'bg-state-base-hover-alt',
+      value?.provider_name && 'py-1.5 pl-1.5',
+    )}>
+      {value?.provider_name && provider && (
+        <div className='mr-1 shrink-0 rounded-lg border border-components-panel-border bg-components-panel-bg p-px'>
+          <BlockIcon
+            className='!h-4 !w-4'
+            type={BlockEnum.Tool}
+            toolIcon={provider.icon}
+          />
+        </div>
+      )}
+      {value?.tool_name && (
+        <div className='system-sm-medium grow text-components-input-text-filled'>{value.tool_name}</div>
+      )}
+      {!value?.provider_name && (
+        <div className='system-sm-regular grow text-components-input-text-placeholder'>
+          {!isConfigure ? t('plugin.detailPanel.toolSelector.placeholder') : t('plugin.detailPanel.configureTool')}
+        </div>
+      )}
+      {isConfigure && (
+        <RiEqualizer2Line className={cn('ml-0.5 h-4 w-4 shrink-0 text-text-quaternary group-hover:text-text-secondary', open && 'text-text-secondary')} />
+      )}
+      {!isConfigure && (
+        <RiArrowDownSLine className={cn('ml-0.5 h-4 w-4 shrink-0 text-text-quaternary group-hover:text-text-secondary', open && 'text-text-secondary')} />
+      )}
+    </div>
+  )
+}
+
+export default ToolTrigger
diff --git a/app/components/plugins/plugin-detail-panel/utils.ts b/app/components/plugins/plugin-detail-panel/utils.ts
new file mode 100644
index 0000000..fd51142
--- /dev/null
+++ b/app/components/plugins/plugin-detail-panel/utils.ts
@@ -0,0 +1,21 @@
+import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+
+export const NAME_FIELD = {
+  type: FormTypeEnum.textInput,
+  name: 'name',
+  label: {
+    en_US: 'Endpoint Name',
+    zh_Hans: '绔偣鍚嶇О',
+    ja_JP: '銈ㄣ兂銉夈儩銈ゃ兂銉堝悕',
+    pt_BR: 'Nome do ponto final',
+  },
+  placeholder: {
+    en_US: 'Endpoint Name',
+    zh_Hans: '绔偣鍚嶇О',
+    ja_JP: '銈ㄣ兂銉夈儩銈ゃ兂銉堝悕',
+    pt_BR: 'Nome do ponto final',
+  },
+  required: true,
+  default: '',
+  help: null,
+}
diff --git a/app/components/plugins/plugin-item/action.tsx b/app/components/plugins/plugin-item/action.tsx
new file mode 100644
index 0000000..21c1764
--- /dev/null
+++ b/app/components/plugins/plugin-item/action.tsx
@@ -0,0 +1,165 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { type MetaData, PluginSource } from '../types'
+import { RiDeleteBinLine, RiInformation2Line, RiLoopLeftLine } from '@remixicon/react'
+import { useBoolean } from 'ahooks'
+import { useTranslation } from 'react-i18next'
+import PluginInfo from '../plugin-page/plugin-info'
+import ActionButton from '../../base/action-button'
+import Tooltip from '../../base/tooltip'
+import Confirm from '../../base/confirm'
+import { uninstallPlugin } from '@/service/plugins'
+import { useGitHubReleases } from '../install-plugin/hooks'
+import Toast from '@/app/components/base/toast'
+import { useModalContext } from '@/context/modal-context'
+import { useInvalidateInstalledPluginList } from '@/service/use-plugins'
+import type { PluginType } from '@/app/components/plugins/types'
+
+const i18nPrefix = 'plugin.action'
+
+type Props = {
+  author: string
+  installationId: string
+  pluginUniqueIdentifier: string
+  pluginName: string
+  category: PluginType
+  usedInApps: number
+  isShowFetchNewVersion: boolean
+  isShowInfo: boolean
+  isShowDelete: boolean
+  onDelete: () => void
+  meta?: MetaData
+}
+const Action: FC<Props> = ({
+  author,
+  installationId,
+  pluginUniqueIdentifier,
+  pluginName,
+  category,
+  isShowFetchNewVersion,
+  isShowInfo,
+  isShowDelete,
+  onDelete,
+  meta,
+}) => {
+  const { t } = useTranslation()
+  const [isShowPluginInfo, {
+    setTrue: showPluginInfo,
+    setFalse: hidePluginInfo,
+  }] = useBoolean(false)
+  const [deleting, {
+    setTrue: showDeleting,
+    setFalse: hideDeleting,
+  }] = useBoolean(false)
+  const { checkForUpdates, fetchReleases } = useGitHubReleases()
+  const { setShowUpdatePluginModal } = useModalContext()
+  const invalidateInstalledPluginList = useInvalidateInstalledPluginList()
+
+  const handleFetchNewVersion = async () => {
+    const owner = meta!.repo.split('/')[0] || author
+    const repo = meta!.repo.split('/')[1] || pluginName
+    const fetchedReleases = await fetchReleases(owner, repo)
+    if (fetchedReleases.length === 0) return
+    const { needUpdate, toastProps } = checkForUpdates(fetchedReleases, meta!.version)
+    Toast.notify(toastProps)
+    if (needUpdate) {
+      setShowUpdatePluginModal({
+        onSaveCallback: () => {
+          invalidateInstalledPluginList()
+        },
+        payload: {
+          type: PluginSource.github,
+          category,
+          github: {
+            originalPackageInfo: {
+              id: pluginUniqueIdentifier,
+              repo: meta!.repo,
+              version: meta!.version,
+              package: meta!.package,
+              releases: fetchedReleases,
+            },
+          },
+        },
+      })
+    }
+  }
+
+  const [isShowDeleteConfirm, {
+    setTrue: showDeleteConfirm,
+    setFalse: hideDeleteConfirm,
+  }] = useBoolean(false)
+
+  const handleDelete = useCallback(async () => {
+    showDeleting()
+    const res = await uninstallPlugin(installationId)
+    hideDeleting()
+    if (res.success) {
+      hideDeleteConfirm()
+      onDelete()
+    }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [installationId, onDelete])
+  return (
+    <div className='flex space-x-1'>
+      {/* Only plugin installed from GitHub need to check if it's the new version  */}
+      {isShowFetchNewVersion
+        && (
+          <Tooltip popupContent={t(`${i18nPrefix}.checkForUpdates`)}>
+            <ActionButton onClick={handleFetchNewVersion}>
+              <RiLoopLeftLine className='h-4 w-4 text-text-tertiary' />
+            </ActionButton>
+          </Tooltip>
+        )
+      }
+      {
+        isShowInfo
+        && (
+          <Tooltip popupContent={t(`${i18nPrefix}.pluginInfo`)}>
+            <ActionButton onClick={showPluginInfo}>
+              <RiInformation2Line className='h-4 w-4 text-text-tertiary' />
+            </ActionButton>
+          </Tooltip>
+        )
+      }
+      {
+        isShowDelete
+        && (
+          <Tooltip popupContent={t(`${i18nPrefix}.delete`)}>
+            <ActionButton
+              className='text-text-tertiary hover:bg-state-destructive-hover hover:text-text-destructive'
+              onClick={showDeleteConfirm}
+            >
+              <RiDeleteBinLine className='h-4 w-4' />
+            </ActionButton>
+          </Tooltip>
+        )
+      }
+
+      {isShowPluginInfo && (
+        <PluginInfo
+          repository={meta!.repo}
+          release={meta!.version}
+          packageName={meta!.package}
+          onHide={hidePluginInfo}
+        />
+      )}
+      <Confirm
+        isShow={isShowDeleteConfirm}
+        title={t(`${i18nPrefix}.delete`)}
+        content={
+          <div>
+            {t(`${i18nPrefix}.deleteContentLeft`)}<span className='system-md-semibold'>{pluginName}</span>{t(`${i18nPrefix}.deleteContentRight`)}<br />
+            {/* // todo: add usedInApps */}
+            {/* {usedInApps > 0 && t(`${i18nPrefix}.usedInApps`, { num: usedInApps })} */}
+          </div>
+        }
+        onCancel={hideDeleteConfirm}
+        onConfirm={handleDelete}
+        isLoading={deleting}
+        isDisabled={deleting}
+      />
+    </div>
+  )
+}
+export default React.memo(Action)
diff --git a/app/components/plugins/plugin-item/index.tsx b/app/components/plugins/plugin-item/index.tsx
new file mode 100644
index 0000000..efc635e
--- /dev/null
+++ b/app/components/plugins/plugin-item/index.tsx
@@ -0,0 +1,197 @@
+'use client'
+import type { FC } from 'react'
+import React, { useMemo } from 'react'
+import { useTheme } from 'next-themes'
+import {
+  RiArrowRightUpLine,
+  RiBugLine,
+  RiErrorWarningLine,
+  RiHardDrive3Line,
+  RiLoginCircleLine,
+  RiVerifiedBadgeLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { usePluginPageContext } from '../plugin-page/context'
+import { Github } from '../../base/icons/src/public/common'
+import Badge from '../../base/badge'
+import { type PluginDetail, PluginSource, PluginType } from '../types'
+import CornerMark from '../card/base/corner-mark'
+import Description from '../card/base/description'
+import OrgInfo from '../card/base/org-info'
+import Title from '../card/base/title'
+import Action from './action'
+import cn from '@/utils/classnames'
+import { API_PREFIX, MARKETPLACE_URL_PREFIX } from '@/config'
+import { useSingleCategories } from '../hooks'
+import { useRenderI18nObject } from '@/hooks/use-i18n'
+import useRefreshPluginList from '@/app/components/plugins/install-plugin/hooks/use-refresh-plugin-list'
+import { useAppContext } from '@/context/app-context'
+import { gte } from 'semver'
+import Tooltip from '@/app/components/base/tooltip'
+
+type Props = {
+  className?: string
+  plugin: PluginDetail
+}
+
+const PluginItem: FC<Props> = ({
+  className,
+  plugin,
+}) => {
+  const { t } = useTranslation()
+  const { theme } = useTheme()
+  const { categoriesMap } = useSingleCategories()
+  const currentPluginID = usePluginPageContext(v => v.currentPluginID)
+  const setCurrentPluginID = usePluginPageContext(v => v.setCurrentPluginID)
+  const { refreshPluginList } = useRefreshPluginList()
+
+  const {
+    source,
+    tenant_id,
+    installation_id,
+    plugin_unique_identifier,
+    endpoints_active,
+    meta,
+    plugin_id,
+  } = plugin
+  const { category, author, name, label, description, icon, verified, meta: declarationMeta } = plugin.declaration
+
+  const orgName = useMemo(() => {
+    return [PluginSource.github, PluginSource.marketplace].includes(source) ? author : ''
+  }, [source, author])
+
+  const { langeniusVersionInfo } = useAppContext()
+
+  const isDifyVersionCompatible = useMemo(() => {
+    if (!langeniusVersionInfo.current_version)
+      return true
+    return gte(langeniusVersionInfo.current_version, declarationMeta.minimum_dify_version ?? '0.0.0')
+  }, [declarationMeta.minimum_dify_version, langeniusVersionInfo.current_version])
+
+  const handleDelete = () => {
+    refreshPluginList({ category } as any)
+  }
+  const getValueFromI18nObject = useRenderI18nObject()
+  const title = getValueFromI18nObject(label)
+  const descriptionText = getValueFromI18nObject(description)
+
+  return (
+    <div
+      className={cn(
+        'rounded-xl border-[1.5px] border-background-section-burn p-1',
+        currentPluginID === plugin_id && 'border-components-option-card-option-selected-border',
+        source === PluginSource.debugging
+          ? 'bg-[repeating-linear-gradient(-45deg,rgba(16,24,40,0.04),rgba(16,24,40,0.04)_5px,rgba(0,0,0,0.02)_5px,rgba(0,0,0,0.02)_10px)]'
+          : 'bg-background-section-burn',
+      )}
+      onClick={() => {
+        setCurrentPluginID(plugin.plugin_id)
+      }}
+    >
+      <div className={cn('hover-bg-components-panel-on-panel-item-bg relative rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg p-4 pb-3 shadow-xs', className)}>
+        <CornerMark text={categoriesMap[category].label} />
+        {/* Header */}
+        <div className="flex">
+          <div className='flex h-10 w-10 items-center justify-center overflow-hidden rounded-xl border-[1px] border-components-panel-border-subtle'>
+            <img
+              className='h-full w-full'
+              src={`${API_PREFIX}/workspaces/current/plugin/icon?tenant_id=${tenant_id}&filename=${icon}`}
+              alt={`plugin-${plugin_unique_identifier}-logo`}
+            />
+          </div>
+          <div className="ml-3 w-0 grow">
+            <div className="flex h-5 items-center">
+              <Title title={title} />
+              {verified && <RiVerifiedBadgeLine className="ml-0.5 h-4 w-4 shrink-0 text-text-accent" />}
+              {!isDifyVersionCompatible && <Tooltip popupContent={
+                t('plugin.difyVersionNotCompatible', { minimalDifyVersion: declarationMeta.minimum_dify_version })
+              }><RiErrorWarningLine color='red' className="ml-0.5 h-4 w-4 shrink-0 text-text-accent" /></Tooltip>}
+              <Badge className='ml-1 shrink-0'
+                text={source === PluginSource.github ? plugin.meta!.version : plugin.version}
+                hasRedCornerMark={(source === PluginSource.marketplace) && !!plugin.latest_unique_identifier && plugin.latest_unique_identifier !== plugin_unique_identifier}
+              />
+            </div>
+            <div className='flex items-center justify-between'>
+              <Description text={descriptionText} descriptionLineRows={1}></Description>
+              <div onClick={e => e.stopPropagation()}>
+                <Action
+                  pluginUniqueIdentifier={plugin_unique_identifier}
+                  installationId={installation_id}
+                  author={author}
+                  pluginName={name}
+                  usedInApps={5}
+                  isShowFetchNewVersion={source === PluginSource.github}
+                  isShowInfo={source === PluginSource.github}
+                  isShowDelete
+                  meta={meta}
+                  onDelete={handleDelete}
+                  category={category}
+                />
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div className='mb-1 mt-1.5 flex h-4 items-center justify-between px-4'>
+        <div className='flex items-center'>
+          <OrgInfo
+            className="mt-0.5"
+            orgName={orgName}
+            packageName={name}
+            packageNameClassName='w-auto max-w-[150px]'
+          />
+          {category === PluginType.extension && (
+            <>
+              <div className='system-xs-regular mx-2 text-text-quaternary'>路</div>
+              <div className='system-xs-regular flex space-x-1 text-text-tertiary'>
+                <RiLoginCircleLine className='h-4 w-4' />
+                <span>{t('plugin.endpointsEnabled', { num: endpoints_active })}</span>
+              </div>
+            </>
+          )}
+        </div>
+
+        <div className='flex items-center'>
+          {source === PluginSource.github
+            && <>
+              <a href={`https://github.com/${meta!.repo}`} target='_blank' className='flex items-center gap-1'>
+                <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('plugin.from')}</div>
+                <div className='flex items-center space-x-0.5 text-text-secondary'>
+                  <Github className='h-3 w-3' />
+                  <div className='system-2xs-semibold-uppercase'>GitHub</div>
+                  <RiArrowRightUpLine className='h-3 w-3' />
+                </div>
+              </a>
+            </>
+          }
+          {source === PluginSource.marketplace
+            && <>
+              <a href={`${MARKETPLACE_URL_PREFIX}/plugins/${author}/${name}${theme ? `?theme=${theme}` : ''}`} target='_blank' className='flex items-center gap-0.5'>
+                <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('plugin.from')} <span className='text-text-secondary'>marketplace</span></div>
+                <RiArrowRightUpLine className='h-3 w-3 text-text-tertiary' />
+              </a>
+            </>
+          }
+          {source === PluginSource.local
+            && <>
+              <div className='flex items-center gap-1'>
+                <RiHardDrive3Line className='h-3 w-3 text-text-tertiary' />
+                <div className='system-2xs-medium-uppercase text-text-tertiary'>Local Plugin</div>
+              </div>
+            </>
+          }
+          {source === PluginSource.debugging
+            && <>
+              <div className='flex items-center gap-1'>
+                <RiBugLine className='h-3 w-3 text-text-warning' />
+                <div className='system-2xs-medium-uppercase text-text-warning'>Debugging Plugin</div>
+              </div>
+            </>
+          }
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(PluginItem)
diff --git a/app/components/plugins/plugin-mutation-model/index.tsx b/app/components/plugins/plugin-mutation-model/index.tsx
new file mode 100644
index 0000000..8b6d8a2
--- /dev/null
+++ b/app/components/plugins/plugin-mutation-model/index.tsx
@@ -0,0 +1,79 @@
+import type { FC, ReactNode } from 'react'
+import React, { memo } from 'react'
+import Card from '@/app/components/plugins/card'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import type { Plugin } from '../types'
+import type { UseMutationResult } from '@tanstack/react-query'
+
+type Props = {
+  plugin: Plugin
+  onCancel: () => void
+  mutation: Pick<UseMutationResult, 'isSuccess' | 'isPending'>
+  mutate: () => void
+  confirmButtonText: ReactNode
+  cancelButtonText: ReactNode
+  modelTitle: ReactNode
+  description: ReactNode
+  cardTitleLeft: ReactNode
+  modalBottomLeft?: ReactNode
+}
+
+const PluginMutationModal: FC<Props> = ({
+  plugin,
+  onCancel,
+  mutation,
+  confirmButtonText,
+  cancelButtonText,
+  modelTitle,
+  description,
+  cardTitleLeft,
+  mutate,
+  modalBottomLeft,
+}: Props) => {
+  return (
+    <Modal
+      isShow={true}
+      onClose={onCancel}
+      className='min-w-[560px]'
+      closable
+      title={modelTitle}
+    >
+      <div className='system-md-regular mb-2 mt-3 text-text-secondary'>
+        {description}
+      </div>
+      <div className='flex flex-wrap content-start items-start gap-1 self-stretch rounded-2xl bg-background-section-burn p-2'>
+        <Card
+          installed={mutation.isSuccess}
+          payload={plugin}
+          className='w-full'
+          titleLeft={cardTitleLeft}
+        />
+      </div>
+      <div className='flex items-center gap-2 self-stretch pt-5'>
+        <div>
+          {modalBottomLeft}
+        </div>
+        <div className='ml-auto flex gap-2'>
+          {!mutation.isPending && (
+            <Button onClick={onCancel}>
+              {cancelButtonText}
+            </Button>
+          )}
+          <Button
+            variant='primary'
+            loading={mutation.isPending}
+            onClick={mutate}
+            disabled={mutation.isPending}
+          >
+            {confirmButtonText}
+          </Button>
+        </div>
+      </div>
+    </Modal>
+  )
+}
+
+PluginMutationModal.displayName = 'PluginMutationModal'
+
+export default memo(PluginMutationModal)
diff --git a/app/components/plugins/plugin-page/context.tsx b/app/components/plugins/plugin-page/context.tsx
new file mode 100644
index 0000000..ae1ad7d
--- /dev/null
+++ b/app/components/plugins/plugin-page/context.tsx
@@ -0,0 +1,89 @@
+'use client'
+
+import type { ReactNode } from 'react'
+import {
+  useMemo,
+  useRef,
+  useState,
+} from 'react'
+import {
+  createContext,
+  useContextSelector,
+} from 'use-context-selector'
+import { useSelector as useAppContextSelector } from '@/context/app-context'
+import type { FilterState } from './filter-management'
+import { useTabSearchParams } from '@/hooks/use-tab-searchparams'
+import { noop } from 'lodash-es'
+import { PLUGIN_PAGE_TABS_MAP, usePluginPageTabs } from '../hooks'
+
+export type PluginPageContextValue = {
+  containerRef: React.RefObject<HTMLDivElement>
+  currentPluginID: string | undefined
+  setCurrentPluginID: (pluginID?: string) => void
+  filters: FilterState
+  setFilters: (filter: FilterState) => void
+  activeTab: string
+  setActiveTab: (tab: string) => void
+  options: Array<{ value: string, text: string }>
+}
+
+export const PluginPageContext = createContext<PluginPageContextValue>({
+  containerRef: { current: null },
+  currentPluginID: undefined,
+  setCurrentPluginID: noop,
+  filters: {
+    categories: [],
+    tags: [],
+    searchQuery: '',
+  },
+  setFilters: noop,
+  activeTab: '',
+  setActiveTab: noop,
+  options: [],
+})
+
+type PluginPageContextProviderProps = {
+  children: ReactNode
+}
+
+export function usePluginPageContext(selector: (value: PluginPageContextValue) => any) {
+  return useContextSelector(PluginPageContext, selector)
+}
+
+export const PluginPageContextProvider = ({
+  children,
+}: PluginPageContextProviderProps) => {
+  const containerRef = useRef<HTMLDivElement>(null)
+  const [filters, setFilters] = useState<FilterState>({
+    categories: [],
+    tags: [],
+    searchQuery: '',
+  })
+  const [currentPluginID, setCurrentPluginID] = useState<string | undefined>()
+
+  const { enable_marketplace } = useAppContextSelector(s => s.systemFeatures)
+  const tabs = usePluginPageTabs()
+  const options = useMemo(() => {
+    return enable_marketplace ? tabs : tabs.filter(tab => tab.value !== PLUGIN_PAGE_TABS_MAP.marketplace)
+  }, [tabs, enable_marketplace])
+  const [activeTab, setActiveTab] = useTabSearchParams({
+    defaultTab: options[0].value,
+  })
+
+  return (
+    <PluginPageContext.Provider
+      value={{
+        containerRef,
+        currentPluginID,
+        setCurrentPluginID,
+        filters,
+        setFilters,
+        activeTab,
+        setActiveTab,
+        options,
+      }}
+    >
+      {children}
+    </PluginPageContext.Provider>
+  )
+}
diff --git a/app/components/plugins/plugin-page/debug-info.tsx b/app/components/plugins/plugin-page/debug-info.tsx
new file mode 100644
index 0000000..28b8a7f
--- /dev/null
+++ b/app/components/plugins/plugin-page/debug-info.tsx
@@ -0,0 +1,67 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useContext } from 'use-context-selector'
+import I18n from '@/context/i18n'
+import {
+  RiArrowRightUpLine,
+  RiBugLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import KeyValueItem from '../base/key-value-item'
+import Tooltip from '@/app/components/base/tooltip'
+import Button from '@/app/components/base/button'
+import { getDocsUrl } from '@/app/components/plugins/utils'
+import { useDebugKey } from '@/service/use-plugins'
+
+const i18nPrefix = 'plugin.debugInfo'
+
+const DebugInfo: FC = () => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const { data: info, isLoading } = useDebugKey()
+
+  // info.key likes 4580bdb7-b878-471c-a8a4-bfd760263a53 mask the middle part using *.
+  const maskedKey = info?.key?.replace(/(.{8})(.*)(.{8})/, '$1********$3')
+
+  if (isLoading) return null
+
+  return (
+    <Tooltip
+      triggerMethod='click'
+      disabled={!info}
+      popupContent={
+        <>
+          <div className='flex items-center gap-1 self-stretch'>
+            <span className='system-sm-semibold flex shrink-0 grow basis-0 flex-col items-start justify-center text-text-secondary'>{t(`${i18nPrefix}.title`)}</span>
+            <a href={getDocsUrl(locale, '/plugins/quick-start/debug-plugin')} target='_blank' className='flex cursor-pointer items-center gap-0.5 text-text-accent-light-mode-only'>
+              <span className='system-xs-medium'>{t(`${i18nPrefix}.viewDocs`)}</span>
+              <RiArrowRightUpLine className='h-3 w-3' />
+            </a>
+          </div>
+          <div className='space-y-0.5'>
+            <KeyValueItem
+              label={'URL'}
+              value={`${info?.host}:${info?.port}`}
+            />
+            <KeyValueItem
+              label={'Key'}
+              value={info?.key || ''}
+              maskedValue={maskedKey}
+            />
+          </div>
+        </>
+      }
+      popupClassName='flex flex-col items-start w-[256px] px-4 py-3.5 gap-1 border border-components-panel-border
+        rounded-xl bg-components-tooltip-bg shadows-shadow-lg z-50'
+      asChild={false}
+      position='bottom'
+    >
+      <Button className='h-full w-full p-2 text-components-button-secondary-text'>
+        <RiBugLine className='h-4 w-4' />
+      </Button>
+    </Tooltip>
+  )
+}
+
+export default React.memo(DebugInfo)
diff --git a/app/components/plugins/plugin-page/empty/index.tsx b/app/components/plugins/plugin-page/empty/index.tsx
new file mode 100644
index 0000000..53a00dc
--- /dev/null
+++ b/app/components/plugins/plugin-page/empty/index.tsx
@@ -0,0 +1,121 @@
+import React, { useMemo, useRef, useState } from 'react'
+import { MagicBox } from '@/app/components/base/icons/src/vender/solid/mediaAndDevices'
+import { FileZip } from '@/app/components/base/icons/src/vender/solid/files'
+import { Github } from '@/app/components/base/icons/src/vender/solid/general'
+import InstallFromGitHub from '@/app/components/plugins/install-plugin/install-from-github'
+import InstallFromLocalPackage from '@/app/components/plugins/install-plugin/install-from-local-package'
+import { usePluginPageContext } from '../context'
+import { Group } from '@/app/components/base/icons/src/vender/other'
+import { useSelector as useAppContextSelector } from '@/context/app-context'
+import Line from '../../marketplace/empty/line'
+import { useInstalledPluginList } from '@/service/use-plugins'
+import { useTranslation } from 'react-i18next'
+import { SUPPORT_INSTALL_LOCAL_FILE_EXTENSIONS } from '@/config'
+import { noop } from 'lodash-es'
+
+const Empty = () => {
+  const { t } = useTranslation()
+  const fileInputRef = useRef<HTMLInputElement>(null)
+  const [selectedAction, setSelectedAction] = useState<string | null>(null)
+  const [selectedFile, setSelectedFile] = useState<File | null>(null)
+  const { enable_marketplace } = useAppContextSelector(s => s.systemFeatures)
+  const setActiveTab = usePluginPageContext(v => v.setActiveTab)
+
+  const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {
+    const file = event.target.files?.[0]
+    if (file) {
+      setSelectedFile(file)
+      setSelectedAction('local')
+    }
+  }
+  const filters = usePluginPageContext(v => v.filters)
+  const { data: pluginList } = useInstalledPluginList()
+
+  const text = useMemo(() => {
+    if (pluginList?.plugins.length === 0)
+      return t('plugin.list.noInstalled')
+    if (filters.categories.length > 0 || filters.tags.length > 0 || filters.searchQuery)
+      return t('plugin.list.notFound')
+  }, [pluginList?.plugins.length, t, filters.categories.length, filters.tags.length, filters.searchQuery])
+
+  return (
+    <div className='relative z-0 w-full grow'>
+      {/* skeleton */}
+      <div className='absolute top-0 z-10 grid h-full w-full grid-cols-2 gap-2 overflow-hidden px-12'>
+        {Array.from({ length: 20 }).fill(0).map((_, i) => (
+          <div key={i} className='h-[100px] rounded-xl bg-components-card-bg' />
+        ))}
+      </div>
+      {/* mask */}
+      <div className='absolute z-20 h-full w-full bg-gradient-to-b from-components-panel-bg-transparent to-components-panel-bg' />
+      <div className='relative z-30 flex h-full items-center justify-center'>
+        <div className='flex flex-col items-center gap-y-3'>
+          <div className='relative -z-10 flex h-[52px] w-[52px] items-center justify-center rounded-xl
+          border-[1px] border-dashed border-divider-deep bg-components-card-bg shadow-xl shadow-shadow-shadow-5'>
+            <Group className='h-5 w-5 text-text-tertiary' />
+            <Line className='absolute right-[-1px] top-1/2 -translate-y-1/2' />
+            <Line className='absolute left-[-1px] top-1/2 -translate-y-1/2' />
+            <Line className='absolute left-1/2 top-0 -translate-x-1/2 -translate-y-1/2 rotate-90' />
+            <Line className='absolute left-1/2 top-full -translate-x-1/2 -translate-y-1/2 rotate-90' />
+          </div>
+          <div className='text-sm font-normal text-text-tertiary'>
+            {text}
+          </div>
+          <div className='flex w-[240px] flex-col'>
+            <input
+              type='file'
+              ref={fileInputRef}
+              style={{ display: 'none' }}
+              onChange={handleFileChange}
+              accept={SUPPORT_INSTALL_LOCAL_FILE_EXTENSIONS}
+            />
+            <div className='flex w-full flex-col gap-y-1'>
+              {[
+                ...(
+                  (enable_marketplace)
+                    ? [{ icon: MagicBox, text: t('plugin.list.source.marketplace'), action: 'marketplace' }]
+                    : []
+                ),
+                { icon: Github, text: t('plugin.list.source.github'), action: 'github' },
+                { icon: FileZip, text: t('plugin.list.source.local'), action: 'local' },
+              ].map(({ icon: Icon, text, action }) => (
+                <div
+                  key={action}
+                  className='flex cursor-pointer items-center gap-x-1 rounded-lg border-[0.5px] bg-components-button-secondary-bg
+                  px-3 py-2 shadow-xs shadow-shadow-shadow-3 hover:bg-state-base-hover'
+                  onClick={() => {
+                    if (action === 'local')
+                      fileInputRef.current?.click()
+                    else if (action === 'marketplace')
+                      setActiveTab('discover')
+                    else
+                      setSelectedAction(action)
+                  }}
+                >
+                  <Icon className="h-4 w-4 text-text-tertiary" />
+                  <span className='system-md-regular text-text-secondary'>{text}</span>
+                </div>
+              ))}
+            </div>
+          </div>
+        </div>
+        {selectedAction === 'github' && <InstallFromGitHub
+          onSuccess={noop}
+          onClose={() => setSelectedAction(null)}
+        />}
+        {selectedAction === 'local' && selectedFile
+          && (<InstallFromLocalPackage
+            file={selectedFile}
+            onClose={() => setSelectedAction(null)}
+            onSuccess={noop}
+          />
+          )
+        }
+      </div>
+    </div>
+  )
+}
+
+Empty.displayName = 'Empty'
+
+export default React.memo(Empty)
diff --git a/app/components/plugins/plugin-page/filter-management/category-filter.tsx b/app/components/plugins/plugin-page/filter-management/category-filter.tsx
new file mode 100644
index 0000000..edebe68
--- /dev/null
+++ b/app/components/plugins/plugin-page/filter-management/category-filter.tsx
@@ -0,0 +1,127 @@
+'use client'
+
+import { useState } from 'react'
+import {
+  RiArrowDownSLine,
+  RiCloseCircleFill,
+} from '@remixicon/react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Checkbox from '@/app/components/base/checkbox'
+import cn from '@/utils/classnames'
+import Input from '@/app/components/base/input'
+import { useCategories } from '../../hooks'
+import { useTranslation } from 'react-i18next'
+
+type CategoriesFilterProps = {
+  value: string[]
+  onChange: (categories: string[]) => void
+}
+const CategoriesFilter = ({
+  value,
+  onChange,
+}: CategoriesFilterProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const [searchText, setSearchText] = useState('')
+  const { categories: options, categoriesMap } = useCategories()
+  const filteredOptions = options.filter(option => option.name.toLowerCase().includes(searchText.toLowerCase()))
+  const handleCheck = (id: string) => {
+    if (value.includes(id))
+      onChange(value.filter(tag => tag !== id))
+    else
+      onChange([...value, id])
+  }
+  const selectedTagsLength = value.length
+
+  return (
+    <PortalToFollowElem
+      placement='bottom-start'
+      offset={{
+        mainAxis: 4,
+      }}
+      open={open}
+      onOpenChange={setOpen}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+        <div className={cn(
+          'flex h-8 cursor-pointer items-center rounded-lg bg-components-input-bg-normal px-2 py-1 text-text-tertiary hover:bg-state-base-hover-alt',
+          selectedTagsLength && 'text-text-secondary',
+          open && 'bg-state-base-hover',
+        )}>
+          <div className={cn(
+            'system-sm-medium flex items-center p-1',
+          )}>
+            {
+              !selectedTagsLength && t('plugin.allCategories')
+            }
+            {
+              !!selectedTagsLength && value.map(val => categoriesMap[val].label).slice(0, 2).join(',')
+            }
+            {
+              selectedTagsLength > 2 && (
+                <div className='system-xs-medium ml-1 text-text-tertiary'>
+                  +{selectedTagsLength - 2}
+                </div>
+              )
+            }
+          </div>
+          {
+            !!selectedTagsLength && (
+              <RiCloseCircleFill
+                className='h-4 w-4 cursor-pointer text-text-quaternary'
+                onClick={
+                  (e) => {
+                    e.stopPropagation()
+                    onChange([])
+                  }
+                }
+              />
+            )
+          }
+          {
+            !selectedTagsLength && (
+              <RiArrowDownSLine className='h-4 w-4' />
+            )
+          }
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-10'>
+        <div className='w-[240px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg'>
+          <div className='p-2 pb-1'>
+            <Input
+              showLeftIcon
+              value={searchText}
+              onChange={e => setSearchText(e.target.value)}
+              placeholder={t('plugin.searchCategories')}
+            />
+          </div>
+          <div className='max-h-[448px] overflow-y-auto p-1'>
+            {
+              filteredOptions.map(option => (
+                <div
+                  key={option.name}
+                  className='flex h-7 cursor-pointer items-center rounded-lg px-2 py-1.5 hover:bg-state-base-hover'
+                  onClick={() => handleCheck(option.name)}
+                >
+                  <Checkbox
+                    className='mr-1'
+                    checked={value.includes(option.name)}
+                  />
+                  <div className='system-sm-medium px-1 text-text-secondary'>
+                    {option.label}
+                  </div>
+                </div>
+              ))
+            }
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default CategoriesFilter
diff --git a/app/components/plugins/plugin-page/filter-management/constant.ts b/app/components/plugins/plugin-page/filter-management/constant.ts
new file mode 100644
index 0000000..80f7862
--- /dev/null
+++ b/app/components/plugins/plugin-page/filter-management/constant.ts
@@ -0,0 +1,11 @@
+export type Tag = {
+  id: string
+  name: string
+  type: string
+  binding_count: number
+}
+
+export type Category = {
+  name: 'model' | 'tool' | 'extension' | 'bundle'
+  binding_count: number
+}
diff --git a/app/components/plugins/plugin-page/filter-management/index.tsx b/app/components/plugins/plugin-page/filter-management/index.tsx
new file mode 100644
index 0000000..c7a0bc7
--- /dev/null
+++ b/app/components/plugins/plugin-page/filter-management/index.tsx
@@ -0,0 +1,45 @@
+import React, { useState } from 'react'
+import CategoriesFilter from './category-filter'
+import TagFilter from './tag-filter'
+import SearchBox from './search-box'
+import { usePluginPageContext } from '../context'
+
+export type FilterState = {
+  categories: string[]
+  tags: string[]
+  searchQuery: string
+}
+
+type FilterManagementProps = {
+  onFilterChange: (filters: FilterState) => void
+}
+
+const FilterManagement: React.FC<FilterManagementProps> = ({ onFilterChange }) => {
+  const initFilters = usePluginPageContext(v => v.filters) as FilterState
+  const [filters, setFilters] = useState<FilterState>(initFilters)
+
+  const updateFilters = (newFilters: Partial<FilterState>) => {
+    const updatedFilters = { ...filters, ...newFilters }
+    setFilters(updatedFilters)
+    onFilterChange(updatedFilters)
+  }
+
+  return (
+    <div className='flex items-center gap-2 self-stretch'>
+      <CategoriesFilter
+        value={filters.categories}
+        onChange={categories => updateFilters({ categories })}
+      />
+      <TagFilter
+        value={filters.tags}
+        onChange={tags => updateFilters({ tags })}
+      />
+      <SearchBox
+        searchQuery={filters.searchQuery}
+        onChange={searchQuery => updateFilters({ searchQuery })}
+      />
+    </div>
+  )
+}
+
+export default FilterManagement
diff --git a/app/components/plugins/plugin-page/filter-management/search-box.tsx b/app/components/plugins/plugin-page/filter-management/search-box.tsx
new file mode 100644
index 0000000..ad3547e
--- /dev/null
+++ b/app/components/plugins/plugin-page/filter-management/search-box.tsx
@@ -0,0 +1,30 @@
+'use client'
+
+import Input from '@/app/components/base/input'
+import { useTranslation } from 'react-i18next'
+type SearchBoxProps = {
+  searchQuery: string
+  onChange: (query: string) => void
+}
+
+const SearchBox: React.FC<SearchBoxProps> = ({
+  searchQuery,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <Input
+      wrapperClassName='flex w-[200px] items-center rounded-lg'
+      className='bg-components-input-bg-normal'
+      showLeftIcon
+      value={searchQuery}
+      placeholder={t('plugin.search')}
+      onChange={(e) => {
+        onChange(e.target.value)
+      }}
+    />
+  )
+}
+
+export default SearchBox
diff --git a/app/components/plugins/plugin-page/filter-management/store.ts b/app/components/plugins/plugin-page/filter-management/store.ts
new file mode 100644
index 0000000..4b55bf2
--- /dev/null
+++ b/app/components/plugins/plugin-page/filter-management/store.ts
@@ -0,0 +1,27 @@
+import { create } from 'zustand'
+import type { Category, Tag } from './constant'
+
+type State = {
+  tagList: Tag[]
+  categoryList: Category[]
+  showTagManagementModal: boolean
+  showCategoryManagementModal: boolean
+}
+
+type Action = {
+  setTagList: (tagList?: Tag[]) => void
+  setCategoryList: (categoryList?: Category[]) => void
+  setShowTagManagementModal: (showTagManagementModal: boolean) => void
+  setShowCategoryManagementModal: (showCategoryManagementModal: boolean) => void
+}
+
+export const useStore = create<State & Action>(set => ({
+  tagList: [],
+  categoryList: [],
+  setTagList: tagList => set(() => ({ tagList })),
+  setCategoryList: categoryList => set(() => ({ categoryList })),
+  showTagManagementModal: false,
+  showCategoryManagementModal: false,
+  setShowTagManagementModal: showTagManagementModal => set(() => ({ showTagManagementModal })),
+  setShowCategoryManagementModal: showCategoryManagementModal => set(() => ({ showCategoryManagementModal })),
+}))
diff --git a/app/components/plugins/plugin-page/filter-management/tag-filter.tsx b/app/components/plugins/plugin-page/filter-management/tag-filter.tsx
new file mode 100644
index 0000000..f81f5e1
--- /dev/null
+++ b/app/components/plugins/plugin-page/filter-management/tag-filter.tsx
@@ -0,0 +1,122 @@
+'use client'
+
+import { useState } from 'react'
+import {
+  RiArrowDownSLine,
+  RiCloseCircleFill,
+} from '@remixicon/react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Checkbox from '@/app/components/base/checkbox'
+import cn from '@/utils/classnames'
+import Input from '@/app/components/base/input'
+import { useTags } from '../../hooks'
+import { useTranslation } from 'react-i18next'
+
+type TagsFilterProps = {
+  value: string[]
+  onChange: (tags: string[]) => void
+}
+const TagsFilter = ({
+  value,
+  onChange,
+}: TagsFilterProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const [searchText, setSearchText] = useState('')
+  const { tags: options, tagsMap } = useTags()
+  const filteredOptions = options.filter(option => option.name.toLowerCase().includes(searchText.toLowerCase()))
+  const handleCheck = (id: string) => {
+    if (value.includes(id))
+      onChange(value.filter(tag => tag !== id))
+    else
+      onChange([...value, id])
+  }
+  const selectedTagsLength = value.length
+
+  return (
+    <PortalToFollowElem
+      placement='bottom-start'
+      offset={{
+        mainAxis: 4,
+      }}
+      open={open}
+      onOpenChange={setOpen}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+        <div className={cn(
+          'flex h-8 cursor-pointer items-center rounded-lg bg-components-input-bg-normal px-2 py-1 text-text-tertiary hover:bg-state-base-hover-alt',
+          selectedTagsLength && 'text-text-secondary',
+          open && 'bg-state-base-hover',
+        )}>
+          <div className={cn(
+            'system-sm-medium flex items-center p-1',
+          )}>
+            {
+              !selectedTagsLength && t('pluginTags.allTags')
+            }
+            {
+              !!selectedTagsLength && value.map(val => tagsMap[val].label).slice(0, 2).join(',')
+            }
+            {
+              selectedTagsLength > 2 && (
+                <div className='system-xs-medium ml-1 text-text-tertiary'>
+                  +{selectedTagsLength - 2}
+                </div>
+              )
+            }
+          </div>
+          {
+            !!selectedTagsLength && (
+              <RiCloseCircleFill
+                className='h-4 w-4 cursor-pointer text-text-quaternary'
+                onClick={() => onChange([])}
+              />
+            )
+          }
+          {
+            !selectedTagsLength && (
+              <RiArrowDownSLine className='h-4 w-4' />
+            )
+          }
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-10'>
+        <div className='w-[240px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg'>
+          <div className='p-2 pb-1'>
+            <Input
+              showLeftIcon
+              value={searchText}
+              onChange={e => setSearchText(e.target.value)}
+              placeholder={t('pluginTags.searchTags')}
+            />
+          </div>
+          <div className='max-h-[448px] overflow-y-auto p-1'>
+            {
+              filteredOptions.map(option => (
+                <div
+                  key={option.name}
+                  className='flex h-7 cursor-pointer items-center rounded-lg px-2 py-1.5 hover:bg-state-base-hover'
+                  onClick={() => handleCheck(option.name)}
+                >
+                  <Checkbox
+                    className='mr-1'
+                    checked={value.includes(option.name)}
+                  />
+                  <div className='system-sm-medium px-1 text-text-secondary'>
+                    {option.label}
+                  </div>
+                </div>
+              ))
+            }
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default TagsFilter
diff --git a/app/components/plugins/plugin-page/index.tsx b/app/components/plugins/plugin-page/index.tsx
new file mode 100644
index 0000000..cb57b7f
--- /dev/null
+++ b/app/components/plugins/plugin-page/index.tsx
@@ -0,0 +1,299 @@
+'use client'
+
+import { useEffect, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import Link from 'next/link'
+import {
+  RiBookOpenLine,
+  RiDragDropLine,
+  RiEqualizer2Line,
+} from '@remixicon/react'
+import { useBoolean } from 'ahooks'
+import InstallFromLocalPackage from '../install-plugin/install-from-local-package'
+import {
+  PluginPageContextProvider,
+  usePluginPageContext,
+} from './context'
+import InstallPluginDropdown from './install-plugin-dropdown'
+import { useUploader } from './use-uploader'
+import usePermission from './use-permission'
+import DebugInfo from './debug-info'
+import PluginTasks from './plugin-tasks'
+import Button from '@/app/components/base/button'
+import TabSlider from '@/app/components/base/tab-slider'
+import Tooltip from '@/app/components/base/tooltip'
+import cn from '@/utils/classnames'
+import PermissionSetModal from '@/app/components/plugins/permission-setting-modal/modal'
+import { useSelector as useAppContextSelector } from '@/context/app-context'
+import InstallFromMarketplace from '../install-plugin/install-from-marketplace'
+import {
+  useRouter,
+  useSearchParams,
+} from 'next/navigation'
+import type { Dependency } from '../types'
+import type { PluginDeclaration, PluginManifestInMarket } from '../types'
+import { sleep } from '@/utils'
+import { getDocsUrl } from '@/app/components/plugins/utils'
+import { fetchBundleInfoFromMarketPlace, fetchManifestFromMarketPlace } from '@/service/plugins'
+import { marketplaceApiPrefix } from '@/config'
+import { SUPPORT_INSTALL_LOCAL_FILE_EXTENSIONS } from '@/config'
+import I18n from '@/context/i18n'
+import { noop } from 'lodash-es'
+import { PLUGIN_TYPE_SEARCH_MAP } from '../marketplace/plugin-type-switch'
+import { PLUGIN_PAGE_TABS_MAP } from '../hooks'
+
+const PACKAGE_IDS_KEY = 'package-ids'
+const BUNDLE_INFO_KEY = 'bundle-info'
+
+export type PluginPageProps = {
+  plugins: React.ReactNode
+  marketplace: React.ReactNode
+}
+const PluginPage = ({
+  plugins,
+  marketplace,
+}: PluginPageProps) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const searchParams = useSearchParams()
+  const { replace } = useRouter()
+
+  document.title = `${t('plugin.metadata.title')} - Dify`
+
+  // just support install one package now
+  const packageId = useMemo(() => {
+    const idStrings = searchParams.get(PACKAGE_IDS_KEY)
+    try {
+      return idStrings ? JSON.parse(idStrings)[0] : ''
+    }
+    catch {
+      return ''
+    }
+  }, [searchParams])
+
+  const [dependencies, setDependencies] = useState<Dependency[]>([])
+  const bundleInfo = useMemo(() => {
+    const info = searchParams.get(BUNDLE_INFO_KEY)
+    try {
+      return info ? JSON.parse(info) : undefined
+    }
+    catch {
+      return undefined
+    }
+  }, [searchParams])
+
+  const [isShowInstallFromMarketplace, {
+    setTrue: showInstallFromMarketplace,
+    setFalse: doHideInstallFromMarketplace,
+  }] = useBoolean(false)
+
+  const hideInstallFromMarketplace = () => {
+    doHideInstallFromMarketplace()
+    const url = new URL(window.location.href)
+    url.searchParams.delete(PACKAGE_IDS_KEY)
+    url.searchParams.delete(BUNDLE_INFO_KEY)
+    replace(url.toString())
+  }
+  const [manifest, setManifest] = useState<PluginDeclaration | PluginManifestInMarket | null>(null)
+
+  useEffect(() => {
+    (async () => {
+      await sleep(100)
+      if (packageId) {
+        const { data } = await fetchManifestFromMarketPlace(encodeURIComponent(packageId))
+        const { plugin, version } = data
+        setManifest({
+          ...plugin,
+          version: version.version,
+          icon: `${marketplaceApiPrefix}/plugins/${plugin.org}/${plugin.name}/icon`,
+        })
+        showInstallFromMarketplace()
+        return
+      }
+      if (bundleInfo) {
+        const { data } = await fetchBundleInfoFromMarketPlace(bundleInfo)
+        setDependencies(data.version.dependencies)
+        showInstallFromMarketplace()
+      }
+    })()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [packageId, bundleInfo])
+
+  const {
+    canManagement,
+    canDebugger,
+    canSetPermissions,
+    permissions,
+    setPermissions,
+  } = usePermission()
+  const [showPluginSettingModal, {
+    setTrue: setShowPluginSettingModal,
+    setFalse: setHidePluginSettingModal,
+  }] = useBoolean()
+  const [currentFile, setCurrentFile] = useState<File | null>(null)
+  const containerRef = usePluginPageContext(v => v.containerRef)
+  const options = usePluginPageContext(v => v.options)
+  const activeTab = usePluginPageContext(v => v.activeTab)
+  const setActiveTab = usePluginPageContext(v => v.setActiveTab)
+  const { enable_marketplace } = useAppContextSelector(s => s.systemFeatures)
+
+  const isPluginsTab = useMemo(() => activeTab === PLUGIN_PAGE_TABS_MAP.plugins, [activeTab])
+  const isExploringMarketplace = useMemo(() => {
+    const values = Object.values(PLUGIN_TYPE_SEARCH_MAP)
+    return activeTab === PLUGIN_PAGE_TABS_MAP.marketplace || values.includes(activeTab)
+  }, [activeTab])
+
+  const handleFileChange = (file: File | null) => {
+    if (!file || !file.name.endsWith('.difypkg')) {
+      setCurrentFile(null)
+      return
+    }
+
+    setCurrentFile(file)
+  }
+  const uploaderProps = useUploader({
+    onFileChange: handleFileChange,
+    containerRef,
+    enabled: isPluginsTab && canManagement,
+  })
+
+  const { dragging, fileUploader, fileChangeHandle, removeFile } = uploaderProps
+  return (
+    <div
+      id='marketplace-container'
+      ref={containerRef}
+      style={{ scrollbarGutter: 'stable' }}
+      className={cn('relative flex grow flex-col overflow-y-auto border-t border-divider-subtle', isPluginsTab
+        ? 'rounded-t-xl bg-components-panel-bg'
+        : 'bg-background-body',
+      )}
+    >
+      <div
+        className={cn(
+          'sticky top-0 z-10 flex min-h-[60px] items-center gap-1 self-stretch bg-components-panel-bg px-12 pb-2 pt-4', isExploringMarketplace && 'bg-background-body',
+        )}
+      >
+        <div className='flex w-full items-center justify-between'>
+          <div className='flex-1'>
+            <TabSlider
+              value={isPluginsTab ? PLUGIN_PAGE_TABS_MAP.plugins : PLUGIN_PAGE_TABS_MAP.marketplace}
+              onChange={setActiveTab}
+              options={options}
+            />
+          </div>
+          <div className='flex shrink-0 items-center gap-1'>
+            {
+              isExploringMarketplace && (
+                <>
+                  <Link
+                    href={getDocsUrl(locale, '/plugins/publish-plugins/publish-to-dify-marketplace/README')}
+                    target='_blank'
+                  >
+                    <Button
+                      className='px-3'
+                      variant='secondary-accent'
+                    >
+                      <RiBookOpenLine className='mr-1 h-4 w-4' />
+                      {t('plugin.submitPlugin')}
+                    </Button>
+                  </Link>
+                  <div className='mx-2 h-3.5 w-[1px] bg-divider-regular'></div>
+                </>
+              )
+            }
+            <PluginTasks />
+            {canManagement && (
+              <InstallPluginDropdown
+                onSwitchToMarketplaceTab={() => setActiveTab('discover')}
+              />
+            )}
+            {
+              canDebugger && (
+                <DebugInfo />
+              )
+            }
+            {
+              canSetPermissions && (
+                <Tooltip
+                  popupContent={t('plugin.privilege.title')}
+                >
+                  <Button
+                    className='group h-full w-full p-2 text-components-button-secondary-text'
+                    onClick={setShowPluginSettingModal}
+                  >
+                    <RiEqualizer2Line className='h-4 w-4' />
+                  </Button>
+                </Tooltip>
+              )
+            }
+          </div>
+        </div>
+      </div>
+      {isPluginsTab && (
+        <>
+          {plugins}
+          {dragging && (
+            <div
+              className="absolute inset-0 m-0.5 rounded-2xl border-2 border-dashed border-components-dropzone-border-accent
+                  bg-[rgba(21,90,239,0.14)] p-2">
+            </div>
+          )}
+          <div className={`flex items-center justify-center gap-2 py-4 ${dragging ? 'text-text-accent' : 'text-text-quaternary'}`}>
+            <RiDragDropLine className="h-4 w-4" />
+            <span className="system-xs-regular">{t('plugin.installModal.dropPluginToInstall')}</span>
+          </div>
+          {currentFile && (
+            <InstallFromLocalPackage
+              file={currentFile}
+              onClose={removeFile ?? noop}
+              onSuccess={noop}
+            />
+          )}
+          <input
+            ref={fileUploader}
+            className="hidden"
+            type="file"
+            id="fileUploader"
+            accept={SUPPORT_INSTALL_LOCAL_FILE_EXTENSIONS}
+            onChange={fileChangeHandle ?? noop}
+          />
+        </>
+      )}
+      {
+        isExploringMarketplace && enable_marketplace && marketplace
+      }
+
+      {showPluginSettingModal && (
+        <PermissionSetModal
+          payload={permissions!}
+          onHide={setHidePluginSettingModal}
+          onSave={setPermissions}
+        />
+      )}
+
+      {
+        isShowInstallFromMarketplace && (
+          <InstallFromMarketplace
+            manifest={manifest! as PluginManifestInMarket}
+            uniqueIdentifier={packageId}
+            isBundle={!!bundleInfo}
+            dependencies={dependencies}
+            onClose={hideInstallFromMarketplace}
+            onSuccess={hideInstallFromMarketplace}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+const PluginPageWithContext = (props: PluginPageProps) => {
+  return (
+    <PluginPageContextProvider>
+      <PluginPage {...props} />
+    </PluginPageContextProvider>
+  )
+}
+
+export default PluginPageWithContext
diff --git a/app/components/plugins/plugin-page/install-plugin-dropdown.tsx b/app/components/plugins/plugin-page/install-plugin-dropdown.tsx
new file mode 100644
index 0000000..875cbd0
--- /dev/null
+++ b/app/components/plugins/plugin-page/install-plugin-dropdown.tsx
@@ -0,0 +1,140 @@
+'use client'
+
+import { useRef, useState } from 'react'
+import { RiAddLine, RiArrowDownSLine } from '@remixicon/react'
+import Button from '@/app/components/base/button'
+import { MagicBox } from '@/app/components/base/icons/src/vender/solid/mediaAndDevices'
+import { FileZip } from '@/app/components/base/icons/src/vender/solid/files'
+import { Github } from '@/app/components/base/icons/src/vender/solid/general'
+import InstallFromGitHub from '@/app/components/plugins/install-plugin/install-from-github'
+import InstallFromLocalPackage from '@/app/components/plugins/install-plugin/install-from-local-package'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { useSelector as useAppContextSelector } from '@/context/app-context'
+import { useTranslation } from 'react-i18next'
+import { SUPPORT_INSTALL_LOCAL_FILE_EXTENSIONS } from '@/config'
+import { noop } from 'lodash-es'
+
+type Props = {
+  onSwitchToMarketplaceTab: () => void
+}
+const InstallPluginDropdown = ({
+  onSwitchToMarketplaceTab,
+}: Props) => {
+  const { t } = useTranslation()
+  const fileInputRef = useRef<HTMLInputElement>(null)
+  const [isMenuOpen, setIsMenuOpen] = useState(false)
+  const [selectedAction, setSelectedAction] = useState<string | null>(null)
+  const [selectedFile, setSelectedFile] = useState<File | null>(null)
+  const { enable_marketplace } = useAppContextSelector(s => s.systemFeatures)
+
+  const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {
+    const file = event.target.files?.[0]
+    if (file) {
+      setSelectedFile(file)
+      setSelectedAction('local')
+      setIsMenuOpen(false)
+    }
+  }
+
+  // TODO TEST INSTALL : uninstall
+  // const [pluginLists, setPluginLists] = useState<any>([])
+  // useEffect(() => {
+  //   (async () => {
+  //     const list: any = await get('workspaces/current/plugin/list')
+  //   })()
+  // })
+
+  // const handleUninstall = async (id: string) => {
+  //   const res = await post('workspaces/current/plugin/uninstall', { body: { plugin_installation_id: id } })
+  //   console.log(res)
+  // }
+
+  return (
+    <PortalToFollowElem
+      open={isMenuOpen}
+      onOpenChange={setIsMenuOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <div className="relative">
+        <PortalToFollowElemTrigger onClick={() => setIsMenuOpen(v => !v)}>
+          <Button
+            className={cn('h-full w-full p-2 text-components-button-secondary-text', isMenuOpen && 'bg-state-base-hover')}
+          >
+            <RiAddLine className='h-4 w-4' />
+            <span className='pl-1'>{t('plugin.installPlugin')}</span>
+            <RiArrowDownSLine className='ml-1 h-4 w-4' />
+          </Button>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[1002]'>
+          <div className='shadows-shadow-lg flex w-[200px] flex-col items-start rounded-xl border border-components-panel-border bg-components-panel-bg-blur p-1 pb-2'>
+            <span className='system-xs-medium-uppercase flex items-start self-stretch pb-0.5 pl-2 pr-3 pt-1 text-text-tertiary'>
+              {t('plugin.installFrom')}
+            </span>
+            <input
+              type='file'
+              ref={fileInputRef}
+              style={{ display: 'none' }}
+              onChange={handleFileChange}
+              accept={SUPPORT_INSTALL_LOCAL_FILE_EXTENSIONS}
+            />
+            <div className='w-full'>
+              {[
+                ...(
+                  (enable_marketplace)
+                    ? [{ icon: MagicBox, text: t('plugin.source.marketplace'), action: 'marketplace' }]
+                    : []
+                ),
+                { icon: Github, text: t('plugin.source.github'), action: 'github' },
+                { icon: FileZip, text: t('plugin.source.local'), action: 'local' },
+              ].map(({ icon: Icon, text, action }) => (
+                <div
+                  key={action}
+                  className='flex w-full !cursor-pointer items-center gap-1 rounded-lg px-2 py-1.5 hover:bg-state-base-hover'
+                  onClick={() => {
+                    if (action === 'local') {
+                      fileInputRef.current?.click()
+                    }
+                    else if (action === 'marketplace') {
+                      onSwitchToMarketplaceTab()
+                      setIsMenuOpen(false)
+                    }
+                    else {
+                      setSelectedAction(action)
+                      setIsMenuOpen(false)
+                    }
+                  }}
+                >
+                  <Icon className="h-4 w-4 text-text-tertiary" />
+                  <span className='system-md-regular px-1 text-text-secondary'>{text}</span>
+                </div>
+              ))}
+            </div>
+          </div>
+        </PortalToFollowElemContent>
+      </div>
+      {selectedAction === 'github' && <InstallFromGitHub
+        onSuccess={noop}
+        onClose={() => setSelectedAction(null)}
+      />}
+      {selectedAction === 'local' && selectedFile
+        && (<InstallFromLocalPackage
+          file={selectedFile}
+          onClose={() => setSelectedAction(null)}
+          onSuccess={noop}
+        />
+        )
+      }
+      {/* {pluginLists.map((item: any) => (
+        <div key={item.id} onClick={() => handleUninstall(item.id)}>{item.name} 鍗歌浇</div>
+      ))} */}
+    </PortalToFollowElem>
+  )
+}
+
+export default InstallPluginDropdown
diff --git a/app/components/plugins/plugin-page/list/index.tsx b/app/components/plugins/plugin-page/list/index.tsx
new file mode 100644
index 0000000..9e9cf00
--- /dev/null
+++ b/app/components/plugins/plugin-page/list/index.tsx
@@ -0,0 +1,23 @@
+import type { FC } from 'react'
+import PluginItem from '../../plugin-item'
+import type { PluginDetail } from '../../types'
+
+type IPluginListProps = {
+  pluginList: PluginDetail[]
+}
+
+const PluginList: FC<IPluginListProps> = ({ pluginList }) => {
+  return (
+    <div className='pb-3'>
+      <div className='grid grid-cols-2 gap-3'>
+        {pluginList.map(plugin => (
+          <PluginItem
+            key={plugin.plugin_id}
+            plugin={plugin}
+          />
+        ))}
+      </div>
+    </div>
+  )
+}
+export default PluginList
diff --git a/app/components/plugins/plugin-page/plugin-info.tsx b/app/components/plugins/plugin-page/plugin-info.tsx
new file mode 100644
index 0000000..abd2979
--- /dev/null
+++ b/app/components/plugins/plugin-page/plugin-info.tsx
@@ -0,0 +1,41 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import KeyValueItem from '../base/key-value-item'
+import Modal from '../../base/modal'
+import { convertRepoToUrl } from '../install-plugin/utils'
+
+const i18nPrefix = 'plugin.pluginInfoModal'
+type Props = {
+  repository?: string
+  release?: string
+  packageName?: string
+  onHide: () => void
+}
+
+const PlugInfo: FC<Props> = ({
+  repository,
+  release,
+  packageName,
+  onHide,
+}) => {
+  const { t } = useTranslation()
+  const labelWidthClassName = 'w-[96px]'
+  return (
+    <Modal
+      title={t(`${i18nPrefix}.title`)}
+      className='w-[480px]'
+      isShow
+      onClose={onHide}
+      closable
+    >
+      <div className='mt-5 space-y-3'>
+        {repository && <KeyValueItem label={t(`${i18nPrefix}.repository`)} labelWidthClassName={labelWidthClassName} value={`${convertRepoToUrl(repository)}`} valueMaxWidthClassName='max-w-[190px]' />}
+        {release && <KeyValueItem label={t(`${i18nPrefix}.release`)} labelWidthClassName={labelWidthClassName} value={release} />}
+        {packageName && <KeyValueItem label={t(`${i18nPrefix}.packageName`)} labelWidthClassName={labelWidthClassName} value={packageName} />}
+      </div>
+    </Modal>
+  )
+}
+export default React.memo(PlugInfo)
diff --git a/app/components/plugins/plugin-page/plugin-tasks/hooks.ts b/app/components/plugins/plugin-page/plugin-tasks/hooks.ts
new file mode 100644
index 0000000..fba7dad
--- /dev/null
+++ b/app/components/plugins/plugin-page/plugin-tasks/hooks.ts
@@ -0,0 +1,100 @@
+import {
+  useCallback,
+  useEffect,
+  useRef,
+  useState,
+} from 'react'
+import { TaskStatus } from '@/app/components/plugins/types'
+import type { PluginStatus } from '@/app/components/plugins/types'
+import {
+  useMutationClearAllTaskPlugin,
+  useMutationClearTaskPlugin,
+  usePluginTaskList,
+} from '@/service/use-plugins'
+
+export const usePluginTaskStatus = () => {
+  const {
+    pluginTasks,
+    handleRefetch,
+  } = usePluginTaskList()
+  const { mutateAsync } = useMutationClearTaskPlugin()
+  const { mutateAsync: mutateAsyncClearAll } = useMutationClearAllTaskPlugin()
+  const allPlugins = pluginTasks.map(task => task.plugins.map((plugin) => {
+    return {
+      ...plugin,
+      taskId: task.id,
+    }
+  })).flat()
+  const errorPlugins: PluginStatus[] = []
+  const successPlugins: PluginStatus[] = []
+  const runningPlugins: PluginStatus[] = []
+
+  allPlugins.forEach((plugin) => {
+    if (plugin.status === TaskStatus.running)
+      runningPlugins.push(plugin)
+    if (plugin.status === TaskStatus.failed)
+      errorPlugins.push(plugin)
+    if (plugin.status === TaskStatus.success)
+      successPlugins.push(plugin)
+  })
+
+  const handleClearErrorPlugin = useCallback(async (taskId: string, pluginId: string) => {
+    await mutateAsync({
+      taskId,
+      pluginId,
+    })
+    handleRefetch()
+  }, [mutateAsync, handleRefetch])
+  const handleClearAllErrorPlugin = useCallback(async () => {
+    await mutateAsyncClearAll()
+    handleRefetch()
+  }, [mutateAsyncClearAll, handleRefetch])
+  const totalPluginsLength = allPlugins.length
+  const runningPluginsLength = runningPlugins.length
+  const errorPluginsLength = errorPlugins.length
+  const successPluginsLength = successPlugins.length
+
+  const isInstalling = runningPluginsLength > 0 && errorPluginsLength === 0 && successPluginsLength === 0
+  const isInstallingWithSuccess = runningPluginsLength > 0 && successPluginsLength > 0 && errorPluginsLength === 0
+  const isInstallingWithError = runningPluginsLength > 0 && errorPluginsLength > 0
+  const isSuccess = successPluginsLength === totalPluginsLength && totalPluginsLength > 0
+  const isFailed = runningPluginsLength === 0 && (errorPluginsLength + successPluginsLength) === totalPluginsLength && totalPluginsLength > 0 && errorPluginsLength > 0
+
+  const [opacity, setOpacity] = useState(1)
+  const timerRef = useRef<NodeJS.Timeout | null>(null)
+
+  useEffect(() => {
+    if (isSuccess) {
+      if (timerRef.current) {
+        clearTimeout(timerRef.current)
+        timerRef.current = null
+      }
+      if (opacity > 0) {
+        timerRef.current = setTimeout(() => {
+          setOpacity(v => v - 0.1)
+        }, 200)
+      }
+    }
+
+    if (!isSuccess)
+      setOpacity(1)
+  }, [isSuccess, opacity])
+
+  return {
+    errorPlugins,
+    successPlugins,
+    runningPlugins,
+    runningPluginsLength,
+    errorPluginsLength,
+    successPluginsLength,
+    totalPluginsLength,
+    isInstalling,
+    isInstallingWithSuccess,
+    isInstallingWithError,
+    isSuccess,
+    isFailed,
+    handleClearErrorPlugin,
+    handleClearAllErrorPlugin,
+    opacity,
+  }
+}
diff --git a/app/components/plugins/plugin-page/plugin-tasks/index.tsx b/app/components/plugins/plugin-page/plugin-tasks/index.tsx
new file mode 100644
index 0000000..3ddc2be
--- /dev/null
+++ b/app/components/plugins/plugin-page/plugin-tasks/index.tsx
@@ -0,0 +1,194 @@
+import {
+  useMemo,
+  useState,
+} from 'react'
+import {
+  RiCheckboxCircleFill,
+  RiErrorWarningFill,
+  RiInstallLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { usePluginTaskStatus } from './hooks'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Tooltip from '@/app/components/base/tooltip'
+import Button from '@/app/components/base/button'
+import ProgressCircle from '@/app/components/base/progress-bar/progress-circle'
+import CardIcon from '@/app/components/plugins/card/base/card-icon'
+import cn from '@/utils/classnames'
+import { useGetLanguage } from '@/context/i18n'
+import useGetIcon from '@/app/components/plugins/install-plugin/base/use-get-icon'
+import DownloadingIcon from '@/app/components/header/plugins-nav/downloading-icon'
+
+const PluginTasks = () => {
+  const { t } = useTranslation()
+  const language = useGetLanguage()
+  const [open, setOpen] = useState(false)
+  const {
+    errorPlugins,
+    runningPluginsLength,
+    successPluginsLength,
+    errorPluginsLength,
+    totalPluginsLength,
+    isInstalling,
+    isInstallingWithSuccess,
+    isInstallingWithError,
+    isSuccess,
+    isFailed,
+    handleClearErrorPlugin,
+    handleClearAllErrorPlugin,
+    opacity,
+  } = usePluginTaskStatus()
+  const { getIconUrl } = useGetIcon()
+
+  const tip = useMemo(() => {
+    if (isInstalling)
+      return t('plugin.task.installing', { installingLength: runningPluginsLength })
+
+    if (isInstallingWithSuccess)
+      return t('plugin.task.installingWithSuccess', { installingLength: runningPluginsLength, successLength: successPluginsLength })
+
+    if (isInstallingWithError)
+      return t('plugin.task.installingWithError', { installingLength: runningPluginsLength, successLength: successPluginsLength, errorLength: errorPluginsLength })
+
+    if (isFailed)
+      return t('plugin.task.installError', { errorLength: errorPluginsLength })
+  }, [isInstalling, isInstallingWithSuccess, isInstallingWithError, isFailed, errorPluginsLength, runningPluginsLength, successPluginsLength, t])
+
+  if (!totalPluginsLength)
+    return null
+
+  return (
+    <div
+      className='flex items-center'
+      style={{ opacity }}
+    >
+      <PortalToFollowElem
+        open={open}
+        onOpenChange={setOpen}
+        placement='bottom-start'
+        offset={{
+          mainAxis: 4,
+          crossAxis: 79,
+        }}
+      >
+        <PortalToFollowElemTrigger
+          onClick={() => {
+            if (isFailed)
+              setOpen(v => !v)
+          }}
+        >
+          <Tooltip popupContent={tip}>
+            <div
+              className={cn(
+                'relative flex h-8 w-8 items-center justify-center rounded-lg border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg shadow-xs hover:bg-components-button-secondary-bg-hover',
+                (isInstallingWithError || isFailed) && 'cursor-pointer border-components-button-destructive-secondary-border-hover bg-state-destructive-hover hover:bg-state-destructive-hover-alt',
+              )}
+              id="plugin-task-trigger"
+            >
+              {
+                (isInstalling || isInstallingWithError) && (
+                  <DownloadingIcon />
+                )
+              }
+              {
+                !(isInstalling || isInstallingWithError) && (
+                  <RiInstallLine
+                    className={cn(
+                      'h-4 w-4 text-components-button-secondary-text',
+                      (isInstallingWithError || isFailed) && 'text-components-button-destructive-secondary-text',
+                    )}
+                  />
+                )
+              }
+              <div className='absolute -right-1 -top-1'>
+                {
+                  (isInstalling || isInstallingWithSuccess) && (
+                    <ProgressCircle
+                      percentage={successPluginsLength / totalPluginsLength * 100}
+                      circleFillColor='fill-components-progress-brand-bg'
+                    />
+                  )
+                }
+                {
+                  isInstallingWithError && (
+                    <ProgressCircle
+                      percentage={runningPluginsLength / totalPluginsLength * 100}
+                      circleFillColor='fill-components-progress-brand-bg'
+                      sectorFillColor='fill-components-progress-error-border'
+                      circleStrokeColor='stroke-components-progress-error-border'
+                    />
+                  )
+                }
+                {
+                  isSuccess && (
+                    <RiCheckboxCircleFill className='h-3.5 w-3.5 text-text-success' />
+                  )
+                }
+                {
+                  isFailed && (
+                    <RiErrorWarningFill className='h-3.5 w-3.5 text-text-destructive' />
+                  )
+                }
+              </div>
+            </div>
+          </Tooltip>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[11]'>
+          <div className='w-[320px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 pb-2 shadow-lg'>
+            <div className='system-sm-semibold-uppercase sticky top-0 flex h-7 items-center justify-between px-2 pt-1'>
+              {t('plugin.task.installedError', { errorLength: errorPluginsLength })}
+              <Button
+                className='shrink-0'
+                size='small'
+                variant='ghost'
+                onClick={() => handleClearAllErrorPlugin()}
+              >
+                {t('plugin.task.clearAll')}
+              </Button>
+            </div>
+            <div className='max-h-[400px] overflow-y-auto'>
+              {
+                errorPlugins.map(errorPlugin => (
+                  <div
+                    key={errorPlugin.plugin_unique_identifier}
+                    className='flex rounded-lg p-2 hover:bg-state-base-hover'
+                  >
+                    <div className='relative mr-2 flex h-6 w-6 items-center justify-center rounded-md border-[0.5px] border-components-panel-border-subtle bg-background-default-dodge'>
+                      <RiErrorWarningFill className='absolute -bottom-0.5 -right-0.5 z-10 h-3 w-3 text-text-destructive' />
+                      <CardIcon
+                        size='tiny'
+                        src={getIconUrl(errorPlugin.icon)}
+                      />
+                    </div>
+                    <div className='grow'>
+                      <div className='system-md-regular truncate text-text-secondary'>
+                        {errorPlugin.labels[language]}
+                      </div>
+                      <div className='system-xs-regular break-all text-text-destructive'>
+                        {errorPlugin.message}
+                      </div>
+                    </div>
+                    <Button
+                      className='shrink-0'
+                      size='small'
+                      variant='ghost'
+                      onClick={() => handleClearErrorPlugin(errorPlugin.taskId, errorPlugin.plugin_unique_identifier)}
+                    >
+                      {t('common.operation.clear')}
+                    </Button>
+                  </div>
+                ))
+              }
+            </div>
+          </div>
+        </PortalToFollowElemContent>
+      </PortalToFollowElem>
+    </div>
+  )
+}
+
+export default PluginTasks
diff --git a/app/components/plugins/plugin-page/plugins-panel.tsx b/app/components/plugins/plugin-page/plugins-panel.tsx
new file mode 100644
index 0000000..125e6f0
--- /dev/null
+++ b/app/components/plugins/plugin-page/plugins-panel.tsx
@@ -0,0 +1,84 @@
+'use client'
+import { useMemo } from 'react'
+import type { FilterState } from './filter-management'
+import FilterManagement from './filter-management'
+import List from './list'
+import { useInstalledLatestVersion, useInstalledPluginList, useInvalidateInstalledPluginList } from '@/service/use-plugins'
+import PluginDetailPanel from '@/app/components/plugins/plugin-detail-panel'
+import { usePluginPageContext } from './context'
+import { useDebounceFn } from 'ahooks'
+import Empty from './empty'
+import Loading from '../../base/loading'
+import { PluginSource } from '../types'
+
+const PluginsPanel = () => {
+  const filters = usePluginPageContext(v => v.filters) as FilterState
+  const setFilters = usePluginPageContext(v => v.setFilters)
+  const { data: pluginList, isLoading: isPluginListLoading } = useInstalledPluginList()
+  const { data: installedLatestVersion } = useInstalledLatestVersion(
+    pluginList?.plugins
+      .filter(plugin => plugin.source === PluginSource.marketplace)
+      .map(plugin => plugin.plugin_id) ?? [],
+  )
+  const invalidateInstalledPluginList = useInvalidateInstalledPluginList()
+  const currentPluginID = usePluginPageContext(v => v.currentPluginID)
+  const setCurrentPluginID = usePluginPageContext(v => v.setCurrentPluginID)
+
+  const { run: handleFilterChange } = useDebounceFn((filters: FilterState) => {
+    setFilters(filters)
+  }, { wait: 500 })
+
+  const pluginListWithLatestVersion = useMemo(() => {
+    return pluginList?.plugins.map(plugin => ({
+      ...plugin,
+      latest_version: installedLatestVersion?.versions[plugin.plugin_id]?.version ?? '',
+      latest_unique_identifier: installedLatestVersion?.versions[plugin.plugin_id]?.unique_identifier ?? '',
+    })) || []
+  }, [pluginList, installedLatestVersion])
+
+  const filteredList = useMemo(() => {
+    const { categories, searchQuery, tags } = filters
+    const filteredList = pluginListWithLatestVersion.filter((plugin) => {
+      return (
+        (categories.length === 0 || categories.includes(plugin.declaration.category))
+        && (tags.length === 0 || tags.some(tag => plugin.declaration.tags.includes(tag)))
+        && (searchQuery === '' || plugin.plugin_id.toLowerCase().includes(searchQuery.toLowerCase()))
+      )
+    })
+    return filteredList
+  }, [pluginListWithLatestVersion, filters])
+
+  const currentPluginDetail = useMemo(() => {
+    const detail = pluginListWithLatestVersion.find(plugin => plugin.plugin_id === currentPluginID)
+    return detail
+  }, [currentPluginID, pluginListWithLatestVersion])
+
+  const handleHide = () => setCurrentPluginID(undefined)
+
+  return (
+    <>
+      <div className='flex flex-col items-start justify-center gap-3 self-stretch px-12 pb-3 pt-1'>
+        <div className='h-px self-stretch bg-divider-subtle'></div>
+        <FilterManagement
+          onFilterChange={handleFilterChange}
+        />
+      </div>
+      {isPluginListLoading ? <Loading type='app' /> : (filteredList?.length ?? 0) > 0 ? (
+        <div className='flex grow flex-wrap content-start items-start gap-2 self-stretch px-12'>
+          <div className='w-full'>
+            <List pluginList={filteredList || []} />
+          </div>
+        </div>
+      ) : (
+        <Empty />
+      )}
+      <PluginDetailPanel
+        detail={currentPluginDetail}
+        onUpdate={() => invalidateInstalledPluginList()}
+        onHide={handleHide}
+      />
+    </>
+  )
+}
+
+export default PluginsPanel
diff --git a/app/components/plugins/plugin-page/use-permission.ts b/app/components/plugins/plugin-page/use-permission.ts
new file mode 100644
index 0000000..93c96a8
--- /dev/null
+++ b/app/components/plugins/plugin-page/use-permission.ts
@@ -0,0 +1,61 @@
+import { PermissionType } from '../types'
+import { useAppContext } from '@/context/app-context'
+import Toast from '../../base/toast'
+import { useTranslation } from 'react-i18next'
+import { useInvalidatePermissions, useMutationPermissions, usePermissions } from '@/service/use-plugins'
+import { useSelector as useAppContextSelector } from '@/context/app-context'
+import { useMemo } from 'react'
+
+const hasPermission = (permission: PermissionType | undefined, isAdmin: boolean) => {
+  if (!permission)
+    return false
+
+  if (permission === PermissionType.noOne)
+    return false
+
+  if (permission === PermissionType.everyone)
+    return true
+
+  return isAdmin
+}
+
+const usePermission = () => {
+  const { t } = useTranslation()
+  const { isCurrentWorkspaceManager, isCurrentWorkspaceOwner } = useAppContext()
+  const { data: permissions } = usePermissions()
+  const invalidatePermissions = useInvalidatePermissions()
+  const { mutate: updatePermission, isPending: isUpdatePending } = useMutationPermissions({
+    onSuccess: () => {
+      invalidatePermissions()
+      Toast.notify({
+        type: 'success',
+        message: t('common.api.actionSuccess'),
+      })
+    },
+  })
+  const isAdmin = isCurrentWorkspaceManager || isCurrentWorkspaceOwner
+
+  return {
+    canManagement: hasPermission(permissions?.install_permission, isAdmin),
+    canDebugger: hasPermission(permissions?.debug_permission, isAdmin),
+    canSetPermissions: isAdmin,
+    permissions,
+    setPermissions: updatePermission,
+    isUpdatePending,
+  }
+}
+
+export const useCanInstallPluginFromMarketplace = () => {
+  const { enable_marketplace } = useAppContextSelector(s => s.systemFeatures)
+  const { canManagement } = usePermission()
+
+  const canInstallPluginFromMarketplace = useMemo(() => {
+    return enable_marketplace && canManagement
+  }, [enable_marketplace, canManagement])
+
+  return {
+    canInstallPluginFromMarketplace,
+  }
+}
+
+export default usePermission
diff --git a/app/components/plugins/plugin-page/use-uploader.ts b/app/components/plugins/plugin-page/use-uploader.ts
new file mode 100644
index 0000000..fb3974c
--- /dev/null
+++ b/app/components/plugins/plugin-page/use-uploader.ts
@@ -0,0 +1,86 @@
+import { useEffect, useRef, useState } from 'react'
+
+type UploaderHookProps = {
+  onFileChange: (file: File | null) => void
+  containerRef: React.RefObject<HTMLDivElement>
+  enabled?: boolean
+}
+
+export const useUploader = ({ onFileChange, containerRef, enabled = true }: UploaderHookProps) => {
+  const [dragging, setDragging] = useState(false)
+  const fileUploader = useRef<HTMLInputElement>(null)
+
+  const handleDragEnter = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+    if (e.dataTransfer?.types.includes('Files'))
+      setDragging(true)
+  }
+
+  const handleDragOver = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+  }
+
+  const handleDragLeave = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+    if (e.relatedTarget === null || !containerRef.current?.contains(e.relatedTarget as Node))
+      setDragging(false)
+  }
+
+  const handleDrop = (e: DragEvent) => {
+    e.preventDefault()
+    e.stopPropagation()
+    setDragging(false)
+    if (!e.dataTransfer)
+      return
+    const files = [...e.dataTransfer.files]
+    if (files.length > 0)
+      onFileChange(files[0])
+  }
+
+  const fileChangeHandle = enabled
+    ? (e: React.ChangeEvent<HTMLInputElement>) => {
+      const file = e.target.files?.[0] || null
+      onFileChange(file)
+    }
+    : null
+
+  const removeFile = enabled
+    ? () => {
+      if (fileUploader.current)
+        fileUploader.current.value = ''
+
+      onFileChange(null)
+    }
+    : null
+
+  useEffect(() => {
+    if (!enabled)
+      return
+
+    const current = containerRef.current
+    if (current) {
+      current.addEventListener('dragenter', handleDragEnter)
+      current.addEventListener('dragover', handleDragOver)
+      current.addEventListener('dragleave', handleDragLeave)
+      current.addEventListener('drop', handleDrop)
+    }
+    return () => {
+      if (current) {
+        current.removeEventListener('dragenter', handleDragEnter)
+        current.removeEventListener('dragover', handleDragOver)
+        current.removeEventListener('dragleave', handleDragLeave)
+        current.removeEventListener('drop', handleDrop)
+      }
+    }
+  }, [containerRef, enabled])
+
+  return {
+    dragging: enabled ? dragging : false,
+    fileUploader,
+    fileChangeHandle,
+    removeFile,
+  }
+}
diff --git a/app/components/plugins/provider-card.tsx b/app/components/plugins/provider-card.tsx
new file mode 100644
index 0000000..c8555ff
--- /dev/null
+++ b/app/components/plugins/provider-card.tsx
@@ -0,0 +1,99 @@
+'use client'
+import React from 'react'
+import type { FC } from 'react'
+import { useTheme } from 'next-themes'
+import { useTranslation } from 'react-i18next'
+import { RiArrowRightUpLine } from '@remixicon/react'
+import Badge from '../base/badge'
+import type { Plugin } from './types'
+import Description from './card/base/description'
+import Icon from './card/base/card-icon'
+import Title from './card/base/title'
+import DownloadCount from './card/base/download-count'
+import Button from '@/app/components/base/button'
+import InstallFromMarketplace from '@/app/components/plugins/install-plugin/install-from-marketplace'
+import cn from '@/utils/classnames'
+import { useBoolean } from 'ahooks'
+import { getPluginLinkInMarketplace } from '@/app/components/plugins/marketplace/utils'
+import { useI18N } from '@/context/i18n'
+import { useRenderI18nObject } from '@/hooks/use-i18n'
+
+type Props = {
+  className?: string
+  payload: Plugin
+}
+
+const ProviderCard: FC<Props> = ({
+  className,
+  payload,
+}) => {
+  const getValueFromI18nObject = useRenderI18nObject()
+  const { t } = useTranslation()
+  const { theme } = useTheme()
+  const [isShowInstallFromMarketplace, {
+    setTrue: showInstallFromMarketplace,
+    setFalse: hideInstallFromMarketplace,
+  }] = useBoolean(false)
+  const { org, label } = payload
+  const { locale } = useI18N()
+
+  return (
+    <div className={cn('group relative rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg p-4 pb-3 shadow-xs hover:bg-components-panel-on-panel-item-bg', className)}>
+      {/* Header */}
+      <div className="flex">
+        <Icon src={payload.icon} />
+        <div className="ml-3 w-0 grow">
+          <div className="flex h-5 items-center">
+            <Title title={getValueFromI18nObject(label)} />
+            {/* <RiVerifiedBadgeLine className="shrink-0 ml-0.5 w-4 h-4 text-text-accent" /> */}
+          </div>
+          <div className='mb-1 flex h-4 items-center justify-between'>
+            <div className='flex items-center'>
+              <div className='system-xs-regular text-text-tertiary'>{org}</div>
+              <div className='system-xs-regular mx-2 text-text-quaternary'>路</div>
+              <DownloadCount downloadCount={payload.install_count || 0} />
+            </div>
+          </div>
+        </div>
+      </div>
+      <Description className='mt-3' text={getValueFromI18nObject(payload.brief)} descriptionLineRows={2}></Description>
+      <div className='mt-3 flex space-x-0.5'>
+        {payload.tags.map(tag => (
+          <Badge key={tag.name} text={tag.name} />
+        ))}
+      </div>
+      <div
+        className='absolute bottom-0 left-0 right-0 hidden items-center gap-2 rounded-xl bg-gradient-to-tr from-components-panel-on-panel-item-bg to-background-gradient-mask-transparent p-4 pt-8 group-hover:flex'
+      >
+        <Button
+          className='grow'
+          variant='primary'
+          onClick={showInstallFromMarketplace}
+        >
+          {t('plugin.detailPanel.operation.install')}
+        </Button>
+        <Button
+          className='grow'
+          variant='secondary'
+        >
+          <a href={`${getPluginLinkInMarketplace(payload)}?language=${locale}${theme ? `&theme=${theme}` : ''}`} target='_blank' className='flex items-center gap-0.5'>
+            {t('plugin.detailPanel.operation.detail')}
+            <RiArrowRightUpLine className='h-4 w-4' />
+          </a>
+        </Button>
+      </div>
+      {
+        isShowInstallFromMarketplace && (
+          <InstallFromMarketplace
+            manifest={payload}
+            uniqueIdentifier={payload.latest_package_identifier}
+            onClose={hideInstallFromMarketplace}
+            onSuccess={() => hideInstallFromMarketplace()}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default ProviderCard
diff --git a/app/components/plugins/types.ts b/app/components/plugins/types.ts
new file mode 100644
index 0000000..f552d7c
--- /dev/null
+++ b/app/components/plugins/types.ts
@@ -0,0 +1,457 @@
+import type { CredentialFormSchemaBase } from '../header/account-setting/model-provider-page/declarations'
+import type { ToolCredential } from '@/app/components/tools/types'
+import type { Locale } from '@/i18n'
+import type { AgentFeature } from '@/app/components/workflow/nodes/agent/types'
+export enum PluginType {
+  tool = 'tool',
+  model = 'model',
+  extension = 'extension',
+  agent = 'agent-strategy',
+}
+
+export enum PluginSource {
+  marketplace = 'marketplace',
+  github = 'github',
+  local = 'package',
+  debugging = 'remote',
+}
+
+export type PluginToolDeclaration = {
+  identity: {
+    author: string
+    name: string
+    description: Record<Locale, string>
+    icon: string
+    label: Record<Locale, string>
+    tags: string[]
+  }
+  credentials_schema: ToolCredential[] // TODO
+}
+
+export type PluginEndpointDeclaration = {
+  settings: ToolCredential[]
+  endpoints: EndpointItem[]
+}
+
+export type EndpointItem = {
+  path: string
+  method: string
+  hidden?: boolean
+}
+
+export type EndpointListItem = {
+  id: string
+  created_at: string
+  updated_at: string
+  settings: Record<string, any>
+  tenant_id: string
+  plugin_id: string
+  expired_at: string
+  declaration: PluginEndpointDeclaration
+  name: string
+  enabled: boolean
+  url: string
+  hook_id: string
+}
+
+export type PluginDeclarationMeta = {
+  version: string
+  minimum_dify_version?: string
+}
+
+// Plugin manifest
+export type PluginDeclaration = {
+  plugin_unique_identifier: string
+  version: string
+  author: string
+  icon: string
+  name: string
+  category: PluginType
+  label: Record<Locale, string>
+  description: Record<Locale, string>
+  created_at: string
+  resource: any // useless in frontend
+  plugins: any // useless in frontend
+  verified: boolean
+  endpoint: PluginEndpointDeclaration
+  tool: PluginToolDeclaration
+  model: any
+  tags: string[]
+  agent_strategy: any
+  meta: PluginDeclarationMeta
+}
+
+export type PluginManifestInMarket = {
+  plugin_unique_identifier: string
+  name: string
+  org: string
+  icon: string
+  label: Record<Locale, string>
+  category: PluginType
+  version: string // combine the other place to it
+  latest_version: string
+  brief: Record<Locale, string>
+  introduction: string
+  verified: boolean
+  install_count: number
+  badges: string[]
+}
+
+export type PluginDetail = {
+  id: string
+  created_at: string
+  updated_at: string
+  name: string
+  plugin_id: string
+  plugin_unique_identifier: string
+  declaration: PluginDeclaration
+  installation_id: string
+  tenant_id: string
+  endpoints_setups: number
+  endpoints_active: number
+  version: string
+  latest_version: string
+  latest_unique_identifier: string
+  source: PluginSource
+  meta?: MetaData
+}
+
+export type PluginInfoFromMarketPlace = {
+  category: PluginType
+  latest_package_identifier: string
+  latest_version: string
+}
+
+export type Plugin = {
+  type: 'plugin' | 'bundle' | 'model' | 'extension' | 'tool' | 'agent_strategy'
+  org: string
+  author?: string
+  name: string
+  plugin_id: string
+  version: string
+  latest_version: string
+  latest_package_identifier: string
+  icon: string
+  verified: boolean
+  label: Record<Locale, string>
+  brief: Record<Locale, string>
+  description: Record<Locale, string>
+  // Repo readme.md content
+  introduction: string
+  repository: string
+  category: PluginType
+  install_count: number
+  endpoint: {
+    settings: CredentialFormSchemaBase[]
+  }
+  tags: { name: string }[]
+  badges: string[]
+}
+
+export enum PermissionType {
+  everyone = 'everyone',
+  admin = 'admins',
+  noOne = 'noone',
+}
+
+export type Permissions = {
+  install_permission: PermissionType
+  debug_permission: PermissionType
+}
+
+export type UpdateFromMarketPlacePayload = {
+  category: PluginType
+  originalPackageInfo: {
+    id: string
+    payload: PluginDeclaration
+  },
+  targetPackageInfo: {
+    id: string
+    version: string
+  }
+}
+
+export type UpdateFromGitHubPayload = {
+  originalPackageInfo: {
+    id: string
+    repo: string
+    version: string
+    package: string
+    releases: GitHubRepoReleaseResponse[]
+  }
+}
+
+export type UpdatePluginPayload = {
+  type: PluginSource
+  category: PluginType
+  marketPlace?: UpdateFromMarketPlacePayload
+  github?: UpdateFromGitHubPayload
+}
+
+export type UpdatePluginModalType = UpdatePluginPayload & {
+  onCancel: () => void
+  onSave: () => void
+}
+
+export enum InstallStepFromGitHub {
+  setUrl = 'url',
+  selectPackage = 'selecting',
+  readyToInstall = 'readyToInstall',
+  uploadFailed = 'uploadFailed',
+  installed = 'installed',
+  installFailed = 'failed',
+}
+
+export type InstallState = {
+  step: InstallStepFromGitHub
+  repoUrl: string
+  selectedVersion: string
+  selectedPackage: string
+  releases: GitHubRepoReleaseResponse[]
+}
+
+export type GitHubUrlInfo = {
+  isValid: boolean
+  owner?: string
+  repo?: string
+}
+
+// endpoint
+export type EndpointOperationResponse = {
+  result: 'success' | 'error'
+}
+
+export type EndpointsResponse = {
+  endpoints: EndpointListItem[]
+  has_more: boolean
+  limit: number
+  total: number
+  page: number
+}
+export type UpdateEndpointRequest = {
+  endpoint_id: string
+  settings: Record<string, any>
+  name: string
+}
+
+export enum InstallStep {
+  uploading = 'uploading',
+  uploadFailed = 'uploadFailed',
+  readyToInstall = 'readyToInstall',
+  installing = 'installing',
+  installed = 'installed',
+  installFailed = 'failed',
+}
+
+export type GitHubAsset = {
+  id: number
+  name: string
+  browser_download_url: string
+}
+
+export type GitHubRepoReleaseResponse = {
+  tag_name: string
+  assets: GitHubAsset[]
+}
+
+export type InstallPackageResponse = {
+  plugin_unique_identifier: string
+  all_installed: boolean
+  task_id: string
+}
+
+export type InstallStatusResponse = {
+  success: boolean,
+  isFromMarketPlace?: boolean
+}
+
+export type updatePackageResponse = {
+  all_installed: boolean
+  task_id: string
+}
+
+export type uploadGitHubResponse = {
+  unique_identifier: string
+  manifest: PluginDeclaration
+}
+
+export type DebugInfo = {
+  key: string
+  host: string
+  port: number
+}
+
+export enum TaskStatus {
+  running = 'running',
+  success = 'success',
+  failed = 'failed',
+}
+
+export type PluginStatus = {
+  plugin_unique_identifier: string
+  plugin_id: string
+  status: TaskStatus
+  message: string
+  icon: string
+  labels: Record<Locale, string>
+  taskId: string
+}
+
+export type PluginTask = {
+  id: string
+  created_at: string
+  updated_at: string
+  status: string
+  total_plugins: number
+  completed_plugins: number
+  plugins: PluginStatus[]
+}
+
+export type TaskStatusResponse = {
+  task: PluginTask
+}
+
+export type PluginTasksResponse = {
+  tasks: PluginTask[]
+}
+
+export type MetaData = {
+  repo: string
+  version: string
+  package: string
+}
+
+export type InstalledPluginListResponse = {
+  plugins: PluginDetail[]
+}
+
+export type InstalledLatestVersionResponse = {
+  versions: {
+    [plugin_id: string]: {
+      unique_identifier: string
+      version: string
+    } | null
+  }
+}
+
+export type UninstallPluginResponse = {
+  success: boolean
+}
+
+export type PluginsFromMarketplaceResponse = {
+  plugins: Plugin[]
+  bundles?: Plugin[]
+  total: number
+}
+export type PluginsFromMarketplaceByInfoResponse = {
+  list: {
+    plugin: Plugin
+    version: {
+      plugin_name: string
+      plugin_org: string
+      unique_identifier: string
+    }
+  }[]
+}
+
+export type GitHubItemAndMarketPlaceDependency = {
+  type: 'github' | 'marketplace' | 'package'
+  value: {
+    repo?: string
+    version?: string // from app DSL
+    package?: string // from app DSL
+    release?: string // from local package. same to the version
+    packages?: string // from local package. same to the package
+    github_plugin_unique_identifier?: string
+    marketplace_plugin_unique_identifier?: string
+    plugin_unique_identifier?: string
+  }
+}
+
+export type PackageDependency = {
+  type: 'github' | 'marketplace' | 'package'
+  value: {
+    unique_identifier: string
+    manifest: PluginDeclaration
+  }
+}
+
+export type Dependency = GitHubItemAndMarketPlaceDependency | PackageDependency
+
+export type Version = {
+  plugin_org: string
+  plugin_name: string
+  version: string
+  file_name: string
+  checksum: string
+  created_at: string
+  unique_identifier: string
+}
+
+export type VersionListResponse = {
+  versions: Version[]
+}
+
+export type VersionInfo = {
+  installedId: string, // use to uninstall
+  installedVersion: string,
+  uniqueIdentifier: string
+}
+
+export type VersionProps = {
+  hasInstalled: boolean
+  installedVersion?: string
+  toInstallVersion: string
+}
+
+export type StrategyParamItem = {
+  name: string
+  label: Record<Locale, string>
+  help: Record<Locale, string>
+  placeholder: Record<Locale, string>
+  type: string
+  scope: string
+  required: boolean
+  default: any
+  options: any[]
+  template: {
+    enabled: boolean
+  },
+  auto_generate: {
+    type: string
+  }
+}
+
+export type StrategyDetail = {
+  identity: {
+    author: string
+    name: string
+    icon: string
+    label: Record<Locale, string>
+    provider: string
+  },
+  parameters: StrategyParamItem[]
+  description: Record<Locale, string>
+  output_schema: Record<string, any>
+  features: AgentFeature[]
+}
+
+export type StrategyDeclaration = {
+  identity: {
+    author: string
+    name: string
+    description: Record<Locale, string>
+    icon: string
+    label: Record<Locale, string>
+    tags: string[]
+  },
+  plugin_id: string
+  strategies: StrategyDetail[]
+}
+
+export type StrategyPluginDetail = {
+  provider: string
+  plugin_unique_identifier: string
+  plugin_id: string
+  declaration: StrategyDeclaration
+}
diff --git a/app/components/plugins/update-plugin/from-github.tsx b/app/components/plugins/update-plugin/from-github.tsx
new file mode 100644
index 0000000..9bc2f2a
--- /dev/null
+++ b/app/components/plugins/update-plugin/from-github.tsx
@@ -0,0 +1,26 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { UpdateFromGitHubPayload } from '../types'
+import InstallFromGitHub from '../install-plugin/install-from-github'
+
+type Props = {
+  payload: UpdateFromGitHubPayload
+  onSave: () => void
+  onCancel: () => void
+}
+
+const FromGitHub: FC<Props> = ({
+  payload,
+  onSave,
+  onCancel,
+}) => {
+  return (
+    <InstallFromGitHub
+      updatePayload={payload}
+      onClose={onCancel}
+      onSuccess={onSave}
+    />
+  )
+}
+export default React.memo(FromGitHub)
diff --git a/app/components/plugins/update-plugin/from-market-place.tsx b/app/components/plugins/update-plugin/from-market-place.tsx
new file mode 100644
index 0000000..98994d9
--- /dev/null
+++ b/app/components/plugins/update-plugin/from-market-place.tsx
@@ -0,0 +1,154 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import Card from '@/app/components/plugins/card'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import Badge, { BadgeState } from '@/app/components/base/badge/index'
+import { TaskStatus, type UpdateFromMarketPlacePayload } from '../types'
+import { pluginManifestToCardPluginProps } from '@/app/components/plugins/install-plugin/utils'
+import useGetIcon from '../install-plugin/base/use-get-icon'
+import { updateFromMarketPlace } from '@/service/plugins'
+import checkTaskStatus from '@/app/components/plugins/install-plugin/base/check-task-status'
+import { usePluginTaskList } from '@/service/use-plugins'
+import Toast from '../../base/toast'
+
+const i18nPrefix = 'plugin.upgrade'
+
+type Props = {
+  payload: UpdateFromMarketPlacePayload
+  onSave: () => void
+  onCancel: () => void
+}
+
+enum UploadStep {
+  notStarted = 'notStarted',
+  upgrading = 'upgrading',
+  installed = 'installed',
+}
+
+const UpdatePluginModal: FC<Props> = ({
+  payload,
+  onSave,
+  onCancel,
+}) => {
+  const {
+    originalPackageInfo,
+    targetPackageInfo,
+  } = payload
+  const { t } = useTranslation()
+  const { getIconUrl } = useGetIcon()
+  const [icon, setIcon] = useState<string>(originalPackageInfo.payload.icon)
+  useEffect(() => {
+    (async () => {
+      const icon = await getIconUrl(originalPackageInfo.payload.icon)
+      setIcon(icon)
+    })()
+  }, [originalPackageInfo, getIconUrl])
+  const {
+    check,
+    stop,
+  } = checkTaskStatus()
+  const handleCancel = () => {
+    stop()
+    onCancel()
+  }
+
+  const [uploadStep, setUploadStep] = useState<UploadStep>(UploadStep.notStarted)
+  const { handleRefetch } = usePluginTaskList(payload.category)
+
+  const configBtnText = useMemo(() => {
+    return ({
+      [UploadStep.notStarted]: t(`${i18nPrefix}.upgrade`),
+      [UploadStep.upgrading]: t(`${i18nPrefix}.upgrading`),
+      [UploadStep.installed]: t(`${i18nPrefix}.close`),
+    })[uploadStep]
+  }, [t, uploadStep])
+
+  const handleConfirm = useCallback(async () => {
+    if (uploadStep === UploadStep.notStarted) {
+      setUploadStep(UploadStep.upgrading)
+      try {
+        const {
+          all_installed: isInstalled,
+          task_id: taskId,
+        } = await updateFromMarketPlace({
+          original_plugin_unique_identifier: originalPackageInfo.id,
+          new_plugin_unique_identifier: targetPackageInfo.id,
+        })
+
+        if (isInstalled) {
+          onSave()
+          return
+        }
+        handleRefetch()
+        const { status, error } = await check({
+          taskId,
+          pluginUniqueIdentifier: targetPackageInfo.id,
+        })
+        if (status === TaskStatus.failed) {
+          Toast.notify({ type: 'error', message: error! })
+          return
+        }
+        onSave()
+      }
+      // eslint-disable-next-line unused-imports/no-unused-vars
+      catch (e) {
+        setUploadStep(UploadStep.notStarted)
+      }
+      return
+    }
+    if (uploadStep === UploadStep.installed)
+      onSave()
+  }, [onSave, uploadStep, check, originalPackageInfo.id, handleRefetch, targetPackageInfo.id])
+
+  return (
+    <Modal
+      isShow={true}
+      onClose={onCancel}
+      className='min-w-[560px]'
+      closable
+      title={t(`${i18nPrefix}.${uploadStep === UploadStep.installed ? 'successfulTitle' : 'title'}`)}
+    >
+      <div className='system-md-regular mb-2 mt-3 text-text-secondary'>
+        {t(`${i18nPrefix}.description`)}
+      </div>
+      <div className='flex flex-wrap content-start items-start gap-1 self-stretch rounded-2xl bg-background-section-burn p-2'>
+        <Card
+          installed={uploadStep === UploadStep.installed}
+          payload={pluginManifestToCardPluginProps({
+            ...originalPackageInfo.payload,
+            icon: icon!,
+          })}
+          className='w-full'
+          titleLeft={
+            <>
+              <Badge className='mx-1' size="s" state={BadgeState.Warning}>
+                {`${originalPackageInfo.payload.version} -> ${targetPackageInfo.version}`}
+              </Badge>
+            </>
+          }
+        />
+      </div>
+      <div className='flex items-center justify-end gap-2 self-stretch pt-5'>
+        {uploadStep === UploadStep.notStarted && (
+          <Button
+            onClick={handleCancel}
+          >
+            {t('common.operation.cancel')}
+          </Button>
+        )}
+        <Button
+          variant='primary'
+          loading={uploadStep === UploadStep.upgrading}
+          onClick={handleConfirm}
+          disabled={uploadStep === UploadStep.upgrading}
+        >
+          {configBtnText}
+        </Button>
+      </div>
+    </Modal>
+  )
+}
+export default React.memo(UpdatePluginModal)
diff --git a/app/components/plugins/update-plugin/index.tsx b/app/components/plugins/update-plugin/index.tsx
new file mode 100644
index 0000000..f9b49a6
--- /dev/null
+++ b/app/components/plugins/update-plugin/index.tsx
@@ -0,0 +1,33 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { UpdatePluginModalType } from '../types'
+import { PluginSource } from '../types'
+import UpdateFromGitHub from './from-github'
+import UpdateFromMarketplace from './from-market-place'
+
+const UpdatePlugin: FC<UpdatePluginModalType> = ({
+  type,
+  marketPlace,
+  github,
+  onCancel,
+  onSave,
+}) => {
+  if (type === PluginSource.github) {
+    return (
+      <UpdateFromGitHub
+        payload={github!}
+        onSave={onSave}
+        onCancel={onCancel}
+      />
+    )
+  }
+  return (
+    <UpdateFromMarketplace
+      payload={marketPlace!}
+      onSave={onSave}
+      onCancel={onCancel}
+    />
+  )
+}
+export default React.memo(UpdatePlugin)
diff --git a/app/components/plugins/update-plugin/plugin-version-picker.tsx b/app/components/plugins/update-plugin/plugin-version-picker.tsx
new file mode 100644
index 0000000..424f76d
--- /dev/null
+++ b/app/components/plugins/update-plugin/plugin-version-picker.tsx
@@ -0,0 +1,118 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Badge from '@/app/components/base/badge'
+import type {
+  OffsetOptions,
+  Placement,
+} from '@floating-ui/react'
+import { useVersionListOfPlugin } from '@/service/use-plugins'
+import useTimestamp from '@/hooks/use-timestamp'
+import cn from '@/utils/classnames'
+
+type Props = {
+  disabled?: boolean
+  isShow: boolean
+  onShowChange: (isShow: boolean) => void
+  pluginID: string
+  currentVersion: string
+  trigger: React.ReactNode
+  placement?: Placement
+  offset?: OffsetOptions
+  onSelect: ({
+    version,
+    unique_identifier,
+  }: {
+    version: string
+    unique_identifier: string
+  }) => void
+}
+
+const PluginVersionPicker: FC<Props> = ({
+  disabled = false,
+  isShow,
+  onShowChange,
+  pluginID,
+  currentVersion,
+  trigger,
+  placement = 'bottom-start',
+  offset = {
+    mainAxis: 4,
+    crossAxis: -16,
+  },
+  onSelect,
+}) => {
+  const { t } = useTranslation()
+  const format = t('appLog.dateTimeFormat').split(' ')[0]
+  const { formatDate } = useTimestamp()
+
+  const handleTriggerClick = () => {
+    if (disabled) return
+    onShowChange(true)
+  }
+
+  const { data: res } = useVersionListOfPlugin(pluginID)
+
+  const handleSelect = useCallback(({ version, unique_identifier }: {
+    version: string
+    unique_identifier: string
+  }) => {
+    if (currentVersion === version)
+      return
+    onSelect({ version, unique_identifier })
+    onShowChange(false)
+  }, [currentVersion, onSelect, onShowChange])
+
+  return (
+    <PortalToFollowElem
+      placement={placement}
+      offset={offset}
+      open={isShow}
+      onOpenChange={onShowChange}
+    >
+      <PortalToFollowElemTrigger
+        className={cn('inline-flex cursor-pointer items-center', disabled && 'cursor-default')}
+        onClick={handleTriggerClick}
+      >
+        {trigger}
+      </PortalToFollowElemTrigger>
+
+      <PortalToFollowElemContent className='z-[1000]'>
+        <div className="relative w-[209px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg">
+          <div className='system-xs-medium-uppercase px-3 pb-0.5 pt-1 text-text-tertiary'>
+            {t('plugin.detailPanel.switchVersion')}
+          </div>
+          <div className='relative'>
+            {res?.data.versions.map(version => (
+              <div
+                key={version.unique_identifier}
+                className={cn(
+                  'flex h-7 cursor-pointer items-center gap-1 rounded-lg px-3 py-1 hover:bg-state-base-hover',
+                  currentVersion === version.version && 'cursor-default opacity-30 hover:bg-transparent',
+                )}
+                onClick={() => handleSelect({
+                  version: version.version,
+                  unique_identifier: version.unique_identifier,
+                })}
+              >
+                <div className='flex grow items-center'>
+                  <div className='system-sm-medium text-text-secondary'>{version.version}</div>
+                  {currentVersion === version.version && <Badge className='ml-1' text='CURRENT'/>}
+                </div>
+                <div className='system-xs-regular shrink-0 text-text-tertiary'>{formatDate(version.created_at, format)}</div>
+              </div>
+            ))}
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default React.memo(PluginVersionPicker)
diff --git a/app/components/plugins/utils.ts b/app/components/plugins/utils.ts
new file mode 100644
index 0000000..1b84e3e
--- /dev/null
+++ b/app/components/plugins/utils.ts
@@ -0,0 +1,26 @@
+import { LanguagesSupported } from '@/i18n/language'
+
+import {
+  categoryKeys,
+  tagKeys,
+} from './constants'
+
+export const getValidTagKeys = (tags: string[]) => {
+  return tags.filter(tag => tagKeys.includes(tag))
+}
+
+export const getValidCategoryKeys = (category?: string) => {
+  return categoryKeys.find(key => key === category)
+}
+
+export const getDocsUrl = (locale: string, path: string) => {
+  let localePath = 'en'
+
+  if (locale === LanguagesSupported[1])
+    localePath = 'zh-hans'
+
+  else if (locale === LanguagesSupported[7])
+    localePath = 'ja-jp'
+
+  return `https://docs.dify.ai/${localePath}${path}`
+}
diff --git a/app/components/sentry-initor.tsx b/app/components/sentry-initor.tsx
new file mode 100644
index 0000000..457a1cf
--- /dev/null
+++ b/app/components/sentry-initor.tsx
@@ -0,0 +1,29 @@
+'use client'
+
+import { useEffect } from 'react'
+import * as Sentry from '@sentry/react'
+
+const isDevelopment = process.env.NODE_ENV === 'development'
+
+const SentryInit = ({
+  children,
+}: { children: React.ReactNode }) => {
+  useEffect(() => {
+    const SENTRY_DSN = document?.body?.getAttribute('data-public-sentry-dsn')
+    if (!isDevelopment && SENTRY_DSN) {
+      Sentry.init({
+        dsn: SENTRY_DSN,
+        integrations: [
+          Sentry.browserTracingIntegration(),
+          Sentry.replayIntegration(),
+        ],
+        tracesSampleRate: 0.1,
+        replaysSessionSampleRate: 0.1,
+        replaysOnErrorSampleRate: 1.0,
+      })
+    }
+  }, [])
+  return children
+}
+
+export default SentryInit
diff --git a/app/components/share/text-generation/icons/star.svg b/app/components/share/text-generation/icons/star.svg
new file mode 100644
index 0000000..e86a142
--- /dev/null
+++ b/app/components/share/text-generation/icons/star.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M3.66699 1.33366C3.66699 0.965469 3.36852 0.666992 3.00033 0.666992C2.63214 0.666992 2.33366 0.965469 2.33366 1.33366V2.33366H1.33366C0.965469 2.33366 0.666992 2.63214 0.666992 3.00033C0.666992 3.36852 0.965469 3.66699 1.33366 3.66699H2.33366V4.66699C2.33366 5.03518 2.63214 5.33366 3.00033 5.33366C3.36852 5.33366 3.66699 5.03518 3.66699 4.66699V3.66699H4.66699C5.03518 3.66699 5.33366 3.36852 5.33366 3.00033C5.33366 2.63214 5.03518 2.33366 4.66699 2.33366H3.66699V1.33366Z" fill="#444CE7"/>
+<path d="M3.66699 11.3337C3.66699 10.9655 3.36852 10.667 3.00033 10.667C2.63214 10.667 2.33366 10.9655 2.33366 11.3337V12.3337H1.33366C0.965469 12.3337 0.666992 12.6321 0.666992 13.0003C0.666992 13.3685 0.965469 13.667 1.33366 13.667H2.33366V14.667C2.33366 15.0352 2.63214 15.3337 3.00033 15.3337C3.36852 15.3337 3.66699 15.0352 3.66699 14.667V13.667H4.66699C5.03518 13.667 5.33366 13.3685 5.33366 13.0003C5.33366 12.6321 5.03518 12.3337 4.66699 12.3337H3.66699V11.3337Z" fill="#444CE7"/>
+<path d="M9.28922 1.76101C9.1902 1.50354 8.94284 1.33366 8.66699 1.33366C8.39114 1.33366 8.14378 1.50354 8.04476 1.76101L6.88864 4.76691C6.68837 5.28761 6.62544 5.43766 6.53936 5.55872C6.45299 5.68019 6.34686 5.78632 6.22539 5.87269C6.10432 5.95878 5.95428 6.02171 5.43358 6.22198L2.42767 7.37809C2.17021 7.47712 2.00033 7.72448 2.00033 8.00033C2.00033 8.27617 2.17021 8.52353 2.42767 8.62256L5.43358 9.77867C5.95428 9.97894 6.10432 10.0419 6.22539 10.128C6.34686 10.2143 6.45299 10.3205 6.53936 10.4419C6.62544 10.563 6.68837 10.713 6.88864 11.2337L8.04476 14.2396C8.14379 14.4971 8.39114 14.667 8.66699 14.667C8.94284 14.667 9.1902 14.4971 9.28922 14.2396L10.4453 11.2337C10.6456 10.713 10.7085 10.563 10.7946 10.4419C10.881 10.3205 10.9871 10.2143 11.1086 10.128C11.2297 10.0419 11.3797 9.97894 11.9004 9.77867L14.9063 8.62256C15.1638 8.52353 15.3337 8.27617 15.3337 8.00033C15.3337 7.72448 15.1638 7.47712 14.9063 7.37809L11.9004 6.22198C11.3797 6.02171 11.2297 5.95878 11.1086 5.87269C10.9871 5.78632 10.881 5.68019 10.7946 5.55872C10.7085 5.43766 10.6456 5.28761 10.4453 4.76691L9.28922 1.76101Z" fill="#444CE7"/>
+</svg>
diff --git a/app/components/share/text-generation/index.tsx b/app/components/share/text-generation/index.tsx
new file mode 100644
index 0000000..5751092
--- /dev/null
+++ b/app/components/share/text-generation/index.tsx
@@ -0,0 +1,676 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiBookmark3Line,
+  RiErrorWarningFill,
+} from '@remixicon/react'
+import { useBoolean } from 'ahooks'
+import { usePathname, useRouter, useSearchParams } from 'next/navigation'
+import TabHeader from '../../base/tab-header'
+import { checkOrSetAccessToken } from '../utils'
+import MenuDropdown from './menu-dropdown'
+import RunBatch from './run-batch'
+import ResDownload from './run-batch/res-download'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import RunOnce from '@/app/components/share/text-generation/run-once'
+import { fetchSavedMessage as doFetchSavedMessage, fetchAppInfo, fetchAppParams, removeMessage, saveMessage } from '@/service/share'
+import type { SiteInfo } from '@/models/share'
+import type {
+  MoreLikeThisConfig,
+  PromptConfig,
+  SavedMessage,
+  TextToSpeechConfig,
+} from '@/models/debug'
+import AppIcon from '@/app/components/base/app-icon'
+import Badge from '@/app/components/base/badge'
+import { changeLanguage } from '@/i18n/i18next-config'
+import Loading from '@/app/components/base/loading'
+import { userInputsFormToPromptVariables } from '@/utils/model-config'
+import Res from '@/app/components/share/text-generation/result'
+import SavedItems from '@/app/components/app/text-generate/saved-items'
+import type { InstalledApp } from '@/models/explore'
+import { DEFAULT_VALUE_MAX_LEN, appDefaultIconBackground } from '@/config'
+import Toast from '@/app/components/base/toast'
+import type { VisionFile, VisionSettings } from '@/types/app'
+import { Resolution, TransferMethod } from '@/types/app'
+import { useAppFavicon } from '@/hooks/use-app-favicon'
+import DifyLogo from '@/app/components/base/logo/dify-logo'
+import cn from '@/utils/classnames'
+
+const GROUP_SIZE = 5 // to avoid RPM(Request per minute) limit. The group task finished then the next group.
+enum TaskStatus {
+  pending = 'pending',
+  running = 'running',
+  completed = 'completed',
+  failed = 'failed',
+}
+
+type TaskParam = {
+  inputs: Record<string, any>
+}
+
+type Task = {
+  id: number
+  status: TaskStatus
+  params: TaskParam
+}
+
+export type IMainProps = {
+  isInstalledApp?: boolean
+  installedAppInfo?: InstalledApp
+  isWorkflow?: boolean
+}
+
+const TextGeneration: FC<IMainProps> = ({
+  isInstalledApp = false,
+  installedAppInfo,
+  isWorkflow = false,
+}) => {
+  const { notify } = Toast
+
+  const { t } = useTranslation()
+  const media = useBreakpoints()
+  const isPC = media === MediaType.pc
+
+  const searchParams = useSearchParams()
+  const mode = searchParams.get('mode') || 'create'
+  const [currentTab, setCurrentTab] = useState<string>(['create', 'batch'].includes(mode) ? mode : 'create')
+
+  const router = useRouter()
+  const pathname = usePathname()
+  useEffect(() => {
+    const params = new URLSearchParams(searchParams)
+    if (params.has('mode')) {
+      params.delete('mode')
+      router.replace(`${pathname}?${params.toString()}`)
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  // Notice this situation isCallBatchAPI but not in batch tab
+  const [isCallBatchAPI, setIsCallBatchAPI] = useState(false)
+  const isInBatchTab = currentTab === 'batch'
+  const [inputs, doSetInputs] = useState<Record<string, any>>({})
+  const inputsRef = useRef(inputs)
+  const setInputs = useCallback((newInputs: Record<string, any>) => {
+    doSetInputs(newInputs)
+    inputsRef.current = newInputs
+  }, [])
+  const [appId, setAppId] = useState<string>('')
+  const [siteInfo, setSiteInfo] = useState<SiteInfo | null>(null)
+  const [canReplaceLogo, setCanReplaceLogo] = useState<boolean>(false)
+  const [customConfig, setCustomConfig] = useState<Record<string, any> | null>(null)
+  const [promptConfig, setPromptConfig] = useState<PromptConfig | null>(null)
+  const [moreLikeThisConfig, setMoreLikeThisConfig] = useState<MoreLikeThisConfig | null>(null)
+  const [textToSpeechConfig, setTextToSpeechConfig] = useState<TextToSpeechConfig | null>(null)
+
+  // save message
+  const [savedMessages, setSavedMessages] = useState<SavedMessage[]>([])
+  const fetchSavedMessage = async () => {
+    const res: any = await doFetchSavedMessage(isInstalledApp, installedAppInfo?.id)
+    setSavedMessages(res.data)
+  }
+  const handleSaveMessage = async (messageId: string) => {
+    await saveMessage(messageId, isInstalledApp, installedAppInfo?.id)
+    notify({ type: 'success', message: t('common.api.saved') })
+    fetchSavedMessage()
+  }
+  const handleRemoveSavedMessage = async (messageId: string) => {
+    await removeMessage(messageId, isInstalledApp, installedAppInfo?.id)
+    notify({ type: 'success', message: t('common.api.remove') })
+    fetchSavedMessage()
+  }
+
+  // send message task
+  const [controlSend, setControlSend] = useState(0)
+  const [controlStopResponding, setControlStopResponding] = useState(0)
+  const [visionConfig, setVisionConfig] = useState<VisionSettings>({
+    enabled: false,
+    number_limits: 2,
+    detail: Resolution.low,
+    transfer_methods: [TransferMethod.local_file],
+  })
+  const [completionFiles, setCompletionFiles] = useState<VisionFile[]>([])
+
+  const handleSend = () => {
+    setIsCallBatchAPI(false)
+    setControlSend(Date.now())
+
+    // eslint-disable-next-line ts/no-use-before-define
+    setAllTaskList([]) // clear batch task running status
+
+    // eslint-disable-next-line ts/no-use-before-define
+    showResultPanel()
+  }
+
+  const [controlRetry, setControlRetry] = useState(0)
+  const handleRetryAllFailedTask = () => {
+    setControlRetry(Date.now())
+  }
+  const [allTaskList, doSetAllTaskList] = useState<Task[]>([])
+  const allTaskListRef = useRef<Task[]>([])
+  const getLatestTaskList = () => allTaskListRef.current
+  const setAllTaskList = (taskList: Task[]) => {
+    doSetAllTaskList(taskList)
+    allTaskListRef.current = taskList
+  }
+  const pendingTaskList = allTaskList.filter(task => task.status === TaskStatus.pending)
+  const noPendingTask = pendingTaskList.length === 0
+  const showTaskList = allTaskList.filter(task => task.status !== TaskStatus.pending)
+  const [currGroupNum, doSetCurrGroupNum] = useState(0)
+  const currGroupNumRef = useRef(0)
+  const setCurrGroupNum = (num: number) => {
+    doSetCurrGroupNum(num)
+    currGroupNumRef.current = num
+  }
+  const getCurrGroupNum = () => {
+    return currGroupNumRef.current
+  }
+  const allSuccessTaskList = allTaskList.filter(task => task.status === TaskStatus.completed)
+  const allFailedTaskList = allTaskList.filter(task => task.status === TaskStatus.failed)
+  const allTasksFinished = allTaskList.every(task => task.status === TaskStatus.completed)
+  const allTasksRun = allTaskList.every(task => [TaskStatus.completed, TaskStatus.failed].includes(task.status))
+  const [batchCompletionRes, doSetBatchCompletionRes] = useState<Record<string, string>>({})
+  const batchCompletionResRef = useRef<Record<string, string>>({})
+  const setBatchCompletionRes = (res: Record<string, string>) => {
+    doSetBatchCompletionRes(res)
+    batchCompletionResRef.current = res
+  }
+  const getBatchCompletionRes = () => batchCompletionResRef.current
+  const exportRes = allTaskList.map((task) => {
+    const batchCompletionResLatest = getBatchCompletionRes()
+    const res: Record<string, string> = {}
+    const { inputs } = task.params
+    promptConfig?.prompt_variables.forEach((v) => {
+      res[v.name] = inputs[v.key]
+    })
+    let result = batchCompletionResLatest[task.id]
+    // task might return multiple fields, should marshal object to string
+    if (typeof batchCompletionResLatest[task.id] === 'object')
+      result = JSON.stringify(result)
+
+    res[t('share.generation.completionResult')] = result
+    return res
+  })
+  const checkBatchInputs = (data: string[][]) => {
+    if (!data || data.length === 0) {
+      notify({ type: 'error', message: t('share.generation.errorMsg.empty') })
+      return false
+    }
+    const headerData = data[0]
+    let isMapVarName = true
+    promptConfig?.prompt_variables.forEach((item, index) => {
+      if (!isMapVarName)
+        return
+
+      if (item.name !== headerData[index])
+        isMapVarName = false
+    })
+
+    if (!isMapVarName) {
+      notify({ type: 'error', message: t('share.generation.errorMsg.fileStructNotMatch') })
+      return false
+    }
+
+    let payloadData = data.slice(1)
+    if (payloadData.length === 0) {
+      notify({ type: 'error', message: t('share.generation.errorMsg.atLeastOne') })
+      return false
+    }
+
+    // check middle empty line
+    const allEmptyLineIndexes = payloadData.filter(item => item.every(i => i === '')).map(item => payloadData.indexOf(item))
+    if (allEmptyLineIndexes.length > 0) {
+      let hasMiddleEmptyLine = false
+      let startIndex = allEmptyLineIndexes[0] - 1
+      allEmptyLineIndexes.forEach((index) => {
+        if (hasMiddleEmptyLine)
+          return
+
+        if (startIndex + 1 !== index) {
+          hasMiddleEmptyLine = true
+          return
+        }
+        startIndex++
+      })
+
+      if (hasMiddleEmptyLine) {
+        notify({ type: 'error', message: t('share.generation.errorMsg.emptyLine', { rowIndex: startIndex + 2 }) })
+        return false
+      }
+    }
+
+    // check row format
+    payloadData = payloadData.filter(item => !item.every(i => i === ''))
+    // after remove empty rows in the end, checked again
+    if (payloadData.length === 0) {
+      notify({ type: 'error', message: t('share.generation.errorMsg.atLeastOne') })
+      return false
+    }
+    let errorRowIndex = 0
+    let requiredVarName = ''
+    let moreThanMaxLengthVarName = ''
+    let maxLength = 0
+    payloadData.forEach((item, index) => {
+      if (errorRowIndex !== 0)
+        return
+
+      promptConfig?.prompt_variables.forEach((varItem, varIndex) => {
+        if (errorRowIndex !== 0)
+          return
+        if (varItem.type === 'string') {
+          const maxLen = varItem.max_length || DEFAULT_VALUE_MAX_LEN
+          if (item[varIndex].length > maxLen) {
+            moreThanMaxLengthVarName = varItem.name
+            maxLength = maxLen
+            errorRowIndex = index + 1
+            return
+          }
+        }
+        if (!varItem.required)
+          return
+
+        if (item[varIndex].trim() === '') {
+          requiredVarName = varItem.name
+          errorRowIndex = index + 1
+        }
+      })
+    })
+
+    if (errorRowIndex !== 0) {
+      if (requiredVarName)
+        notify({ type: 'error', message: t('share.generation.errorMsg.invalidLine', { rowIndex: errorRowIndex + 1, varName: requiredVarName }) })
+
+      if (moreThanMaxLengthVarName)
+        notify({ type: 'error', message: t('share.generation.errorMsg.moreThanMaxLengthLine', { rowIndex: errorRowIndex + 1, varName: moreThanMaxLengthVarName, maxLength }) })
+
+      return false
+    }
+    return true
+  }
+  const handleRunBatch = (data: string[][]) => {
+    if (!checkBatchInputs(data))
+      return
+    if (!allTasksFinished) {
+      notify({ type: 'info', message: t('appDebug.errorMessage.waitForBatchResponse') })
+      return
+    }
+
+    const payloadData = data.filter(item => !item.every(i => i === '')).slice(1)
+    const varLen = promptConfig?.prompt_variables.length || 0
+    setIsCallBatchAPI(true)
+    const allTaskList: Task[] = payloadData.map((item, i) => {
+      const inputs: Record<string, any> = {}
+      if (varLen > 0) {
+        item.slice(0, varLen).forEach((input, index) => {
+          const varSchema = promptConfig?.prompt_variables[index]
+          inputs[varSchema?.key as string] = input
+          if (!input) {
+            if (varSchema?.type === 'string' || varSchema?.type === 'paragraph')
+              inputs[varSchema?.key as string] = ''
+            else
+              inputs[varSchema?.key as string] = undefined
+          }
+        })
+      }
+      return {
+        id: i + 1,
+        status: i < GROUP_SIZE ? TaskStatus.running : TaskStatus.pending,
+        params: {
+          inputs,
+        },
+      }
+    })
+    setAllTaskList(allTaskList)
+    setCurrGroupNum(0)
+    setControlSend(Date.now())
+    // clear run once task status
+    setControlStopResponding(Date.now())
+
+    // eslint-disable-next-line ts/no-use-before-define
+    showResultPanel()
+  }
+  const handleCompleted = (completionRes: string, taskId?: number, isSuccess?: boolean) => {
+    const allTaskListLatest = getLatestTaskList()
+    const batchCompletionResLatest = getBatchCompletionRes()
+    const pendingTaskList = allTaskListLatest.filter(task => task.status === TaskStatus.pending)
+    const runTasksCount = 1 + allTaskListLatest.filter(task => [TaskStatus.completed, TaskStatus.failed].includes(task.status)).length
+    const needToAddNextGroupTask = (getCurrGroupNum() !== runTasksCount) && pendingTaskList.length > 0 && (runTasksCount % GROUP_SIZE === 0 || (allTaskListLatest.length - runTasksCount < GROUP_SIZE))
+    // avoid add many task at the same time
+    if (needToAddNextGroupTask)
+      setCurrGroupNum(runTasksCount)
+
+    const nextPendingTaskIds = needToAddNextGroupTask ? pendingTaskList.slice(0, GROUP_SIZE).map(item => item.id) : []
+    const newAllTaskList = allTaskListLatest.map((item) => {
+      if (item.id === taskId) {
+        return {
+          ...item,
+          status: isSuccess ? TaskStatus.completed : TaskStatus.failed,
+        }
+      }
+      if (needToAddNextGroupTask && nextPendingTaskIds.includes(item.id)) {
+        return {
+          ...item,
+          status: TaskStatus.running,
+        }
+      }
+      return item
+    })
+    setAllTaskList(newAllTaskList)
+    if (taskId) {
+      setBatchCompletionRes({
+        ...batchCompletionResLatest,
+        [`${taskId}`]: completionRes,
+      })
+    }
+  }
+
+  const fetchInitData = async () => {
+    if (!isInstalledApp)
+      await checkOrSetAccessToken()
+
+    return Promise.all([
+      isInstalledApp
+        ? {
+          app_id: installedAppInfo?.id,
+          site: {
+            title: installedAppInfo?.app.name,
+            prompt_public: false,
+            copyright: '',
+            icon: installedAppInfo?.app.icon,
+            icon_background: installedAppInfo?.app.icon_background,
+          },
+          plan: 'basic',
+        }
+        : fetchAppInfo(),
+      fetchAppParams(isInstalledApp, installedAppInfo?.id),
+      !isWorkflow
+        ? fetchSavedMessage()
+        : {},
+    ])
+  }
+
+  useEffect(() => {
+    (async () => {
+      const [appData, appParams]: any = await fetchInitData()
+      const { app_id: appId, site: siteInfo, can_replace_logo, custom_config } = appData
+      setAppId(appId)
+      setSiteInfo(siteInfo as SiteInfo)
+      setCanReplaceLogo(can_replace_logo)
+      setCustomConfig(custom_config)
+      changeLanguage(siteInfo.default_language)
+
+      const { user_input_form, more_like_this, file_upload, text_to_speech }: any = appParams
+      setVisionConfig({
+        // legacy of image upload compatible
+        ...file_upload,
+        transfer_methods: file_upload.allowed_file_upload_methods || file_upload.allowed_upload_methods,
+        // legacy of image upload compatible
+        image_file_size_limit: appParams?.system_parameters?.image_file_size_limit,
+        fileUploadConfig: appParams?.system_parameters,
+      })
+      const prompt_variables = userInputsFormToPromptVariables(user_input_form)
+      setPromptConfig({
+        prompt_template: '', // placeholder for future
+        prompt_variables,
+      } as PromptConfig)
+      setMoreLikeThisConfig(more_like_this)
+      setTextToSpeechConfig(text_to_speech)
+    })()
+  }, [])
+
+  // Can Use metadata(https://beta.nextjs.org/docs/api-reference/metadata) to set title. But it only works in server side client.
+  useEffect(() => {
+    if (siteInfo?.title) {
+      if (canReplaceLogo)
+        document.title = `${siteInfo.title}`
+      else
+        document.title = `${siteInfo.title} - Powered by Dify`
+    }
+  }, [siteInfo?.title, canReplaceLogo])
+
+  useAppFavicon({
+    enable: !isInstalledApp,
+    icon_type: siteInfo?.icon_type,
+    icon: siteInfo?.icon,
+    icon_background: siteInfo?.icon_background,
+    icon_url: siteInfo?.icon_url,
+  })
+
+  const [isShowResultPanel, { setTrue: doShowResultPanel, setFalse: hideResultPanel }] = useBoolean(false)
+  const showResultPanel = () => {
+    // fix: useClickAway hideResSidebar will close sidebar
+    setTimeout(() => {
+      doShowResultPanel()
+    }, 0)
+  }
+  const [resultExisted, setResultExisted] = useState(false)
+
+  const renderRes = (task?: Task) => (<Res
+    key={task?.id}
+    isWorkflow={isWorkflow}
+    isCallBatchAPI={isCallBatchAPI}
+    isPC={isPC}
+    isMobile={!isPC}
+    isInstalledApp={isInstalledApp}
+    installedAppInfo={installedAppInfo}
+    isError={task?.status === TaskStatus.failed}
+    promptConfig={promptConfig}
+    moreLikeThisEnabled={!!moreLikeThisConfig?.enabled}
+    inputs={isCallBatchAPI ? (task as Task).params.inputs : inputs}
+    controlSend={controlSend}
+    controlRetry={task?.status === TaskStatus.failed ? controlRetry : 0}
+    controlStopResponding={controlStopResponding}
+    onShowRes={showResultPanel}
+    handleSaveMessage={handleSaveMessage}
+    taskId={task?.id}
+    onCompleted={handleCompleted}
+    visionConfig={visionConfig}
+    completionFiles={completionFiles}
+    isShowTextToSpeech={!!textToSpeechConfig?.enabled}
+    siteInfo={siteInfo}
+    onRunStart={() => setResultExisted(true)}
+  />)
+
+  const renderBatchRes = () => {
+    return (showTaskList.map(task => renderRes(task)))
+  }
+
+  const renderResWrap = (
+    <div
+      className={cn(
+        'relative flex h-full flex-col',
+        !isPC && 'h-[calc(100vh_-_36px)] rounded-t-2xl shadow-lg backdrop-blur-sm',
+        !isPC
+          ? isShowResultPanel
+            ? 'bg-background-default-burn'
+            : 'border-t-[0.5px] border-divider-regular bg-components-panel-bg'
+          : 'bg-chatbot-bg',
+      )}
+    >
+      {isCallBatchAPI && (
+        <div className={cn(
+          'flex shrink-0 items-center justify-between px-14 pb-2 pt-9',
+          !isPC && 'px-4 pb-1 pt-3',
+        )}>
+          <div className='system-md-semibold-uppercase text-text-primary'>{t('share.generation.executions', { num: allTaskList.length })}</div>
+          {allSuccessTaskList.length > 0 && (
+            <ResDownload
+              isMobile={!isPC}
+              values={exportRes}
+            />
+          )}
+        </div>
+      )}
+      <div className={cn(
+        'flex h-0 grow flex-col overflow-y-auto',
+        isPC && 'px-14 py-8',
+        isPC && isCallBatchAPI && 'pt-0',
+        !isPC && 'p-0 pb-2',
+      )}>
+        {!isCallBatchAPI ? renderRes() : renderBatchRes()}
+        {!noPendingTask && (
+          <div className='mt-4'>
+            <Loading type='area' />
+          </div>
+        )}
+      </div>
+      {isCallBatchAPI && allFailedTaskList.length > 0 && (
+        <div className='absolute bottom-6 left-1/2 z-10 flex -translate-x-1/2 items-center gap-2 rounded-xl border border-components-panel-border bg-components-panel-bg-blur p-3 shadow-lg backdrop-blur-sm'>
+          <RiErrorWarningFill className='h-4 w-4 text-text-destructive' />
+          <div className='system-sm-medium text-text-secondary'>{t('share.generation.batchFailed.info', { num: allFailedTaskList.length })}</div>
+          <div className='h-3.5 w-px bg-divider-regular'></div>
+          <div onClick={handleRetryAllFailedTask} className='system-sm-semibold-uppercase cursor-pointer text-text-accent'>{t('share.generation.batchFailed.retry')}</div>
+        </div>
+      )}
+    </div>
+  )
+
+  if (!appId || !siteInfo || !promptConfig) {
+    return (
+      <div className='flex h-screen items-center'>
+        <Loading type='app' />
+      </div>)
+  }
+
+  return (
+    <div className={cn(
+      'bg-background-default-burn',
+      isPC && 'flex',
+      !isPC && 'flex-col',
+      isInstalledApp ? 'h-full rounded-2xl shadow-md' : 'h-screen',
+    )}>
+      {/* Left */}
+      <div className={cn(
+        'relative flex h-full shrink-0 flex-col',
+        isPC ? 'w-[600px] max-w-[50%]' : resultExisted ? 'h-[calc(100%_-_64px)]' : '',
+        isInstalledApp && 'rounded-l-2xl',
+      )}>
+        {/* header */}
+        <div className={cn('shrink-0 space-y-4 border-b border-divider-subtle', isPC ? 'bg-components-panel-bg p-8 pb-0' : 'p-4 pb-0')}>
+          <div className='flex items-center gap-3'>
+            <AppIcon
+              size={isPC ? 'large' : 'small'}
+              iconType={siteInfo.icon_type}
+              icon={siteInfo.icon}
+              background={siteInfo.icon_background || appDefaultIconBackground}
+              imageUrl={siteInfo.icon_url}
+            />
+            <div className='system-md-semibold grow truncate text-text-secondary'>{siteInfo.title}</div>
+            <MenuDropdown data={siteInfo} />
+          </div>
+          {siteInfo.description && (
+            <div className='system-xs-regular text-text-tertiary'>{siteInfo.description}</div>
+          )}
+          <TabHeader
+            items={[
+              { id: 'create', name: t('share.generation.tabs.create') },
+              { id: 'batch', name: t('share.generation.tabs.batch') },
+              ...(!isWorkflow
+                ? [{
+                  id: 'saved',
+                  name: t('share.generation.tabs.saved'),
+                  isRight: true,
+                  icon: <RiBookmark3Line className='h-4 w-4' />,
+                  extra: savedMessages.length > 0
+                    ? (
+                      <Badge className='ml-1'>
+                        {savedMessages.length}
+                      </Badge>
+                    )
+                    : null,
+                }]
+                : []),
+            ]}
+            value={currentTab}
+            onChange={setCurrentTab}
+          />
+        </div>
+        {/* form */}
+        <div className={cn(
+          'h-0 grow overflow-y-auto bg-components-panel-bg',
+          isPC ? 'px-8' : 'px-4',
+          !isPC && resultExisted && customConfig?.remove_webapp_brand && 'rounded-b-2xl border-b-[0.5px] border-divider-regular',
+        )}>
+          <div className={cn(currentTab === 'create' ? 'block' : 'hidden')}>
+            <RunOnce
+              siteInfo={siteInfo}
+              inputs={inputs}
+              inputsRef={inputsRef}
+              onInputsChange={setInputs}
+              promptConfig={promptConfig}
+              onSend={handleSend}
+              visionConfig={visionConfig}
+              onVisionFilesChange={setCompletionFiles}
+            />
+          </div>
+          <div className={cn(isInBatchTab ? 'block' : 'hidden')}>
+            <RunBatch
+              vars={promptConfig.prompt_variables}
+              onSend={handleRunBatch}
+              isAllFinished={allTasksRun}
+            />
+          </div>
+          {currentTab === 'saved' && (
+            <SavedItems
+              className={cn(isPC ? 'mt-6' : 'mt-4')}
+              isShowTextToSpeech={textToSpeechConfig?.enabled}
+              list={savedMessages}
+              onRemove={handleRemoveSavedMessage}
+              onStartCreateContent={() => setCurrentTab('create')}
+            />
+          )}
+        </div>
+        {/* powered by */}
+        {!customConfig?.remove_webapp_brand && (
+          <div className={cn(
+            'flex shrink-0 items-center gap-1.5 bg-components-panel-bg py-3',
+            isPC ? 'px-8' : 'px-4',
+            !isPC && resultExisted && 'rounded-b-2xl border-b-[0.5px] border-divider-regular',
+          )}>
+            <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('share.chat.poweredBy')}</div>
+            {customConfig?.replace_webapp_logo && (
+              <img src={customConfig?.replace_webapp_logo} alt='logo' className='block h-5 w-auto' />
+            )}
+            {!customConfig?.replace_webapp_logo && (
+              <DifyLogo size='small' />
+            )}
+          </div>
+        )}
+      </div>
+      {/* Result */}
+      <div className={cn(
+        isPC
+          ? 'h-full w-0 grow'
+          : isShowResultPanel
+            ? 'fixed inset-0 z-50 bg-background-overlay backdrop-blur-sm'
+            : resultExisted
+              ? 'relative h-16 shrink-0 overflow-hidden bg-background-default-burn pt-2.5'
+              : '',
+      )}>
+        {!isPC && (
+          <div
+            className={cn(
+              isShowResultPanel
+                ? 'flex items-center justify-center p-2 pt-6'
+                : 'absolute left-0 top-0 z-10 flex w-full items-center justify-center px-2 pb-[57px] pt-[3px]',
+            )}
+            onClick={() => {
+              if (isShowResultPanel)
+                hideResultPanel()
+              else
+                showResultPanel()
+            }}
+          >
+            <div className='h-1 w-8 cursor-grab rounded bg-divider-solid' />
+          </div>
+        )}
+        {renderResWrap}
+      </div>
+    </div>
+  )
+}
+
+export default TextGeneration
diff --git a/app/components/share/text-generation/info-modal.tsx b/app/components/share/text-generation/info-modal.tsx
new file mode 100644
index 0000000..9ed584b
--- /dev/null
+++ b/app/components/share/text-generation/info-modal.tsx
@@ -0,0 +1,49 @@
+import React from 'react'
+import Modal from '@/app/components/base/modal'
+import AppIcon from '@/app/components/base/app-icon'
+import type { SiteInfo } from '@/models/share'
+import { appDefaultIconBackground } from '@/config'
+import cn from 'classnames'
+
+type Props = {
+  data?: SiteInfo
+  isShow: boolean
+  onClose: () => void
+}
+
+const InfoModal = ({
+  isShow,
+  onClose,
+  data,
+}: Props) => {
+  return (
+    <Modal
+      isShow={isShow}
+      onClose={onClose}
+      className='min-w-[400px] max-w-[400px] !p-0'
+      closable
+    >
+      <div className={cn('flex flex-col items-center gap-4 px-4 pb-8 pt-10')}>
+        <AppIcon
+          size='xxl'
+          iconType={data?.icon_type}
+          icon={data?.icon}
+          background={data?.icon_background || appDefaultIconBackground}
+          imageUrl={data?.icon_url}
+        />
+        <div className='system-xl-semibold text-text-secondary'>{data?.title}</div>
+        <div className='system-xs-regular text-text-tertiary'>
+          {/* copyright */}
+          {data?.copyright && (
+            <div>漏 {(new Date()).getFullYear()} {data?.copyright}</div>
+          )}
+          {data?.custom_disclaimer && (
+            <div className='mt-2'>{data.custom_disclaimer}</div>
+          )}
+        </div>
+      </div>
+    </Modal>
+  )
+}
+
+export default InfoModal
diff --git a/app/components/share/text-generation/menu-dropdown.tsx b/app/components/share/text-generation/menu-dropdown.tsx
new file mode 100644
index 0000000..d038b94
--- /dev/null
+++ b/app/components/share/text-generation/menu-dropdown.tsx
@@ -0,0 +1,100 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { Placement } from '@floating-ui/react'
+import {
+  RiEqualizer2Line,
+} from '@remixicon/react'
+import ActionButton from '@/app/components/base/action-button'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Divider from '@/app/components/base/divider'
+import ThemeSwitcher from '@/app/components/base/theme-switcher'
+import InfoModal from './info-modal'
+import type { SiteInfo } from '@/models/share'
+import cn from '@/utils/classnames'
+
+type Props = {
+  data?: SiteInfo
+  placement?: Placement
+}
+
+const MenuDropdown: FC<Props> = ({
+  data,
+  placement,
+}) => {
+  const { t } = useTranslation()
+  const [open, doSetOpen] = useState(false)
+  const openRef = useRef(open)
+  const setOpen = useCallback((v: boolean) => {
+    doSetOpen(v)
+    openRef.current = v
+  }, [doSetOpen])
+
+  const handleTrigger = useCallback(() => {
+    setOpen(!openRef.current)
+  }, [setOpen])
+
+  const [show, setShow] = useState(false)
+
+  return (
+    <>
+      <PortalToFollowElem
+        open={open}
+        onOpenChange={setOpen}
+        placement={placement || 'bottom-end'}
+        offset={{
+          mainAxis: 4,
+          crossAxis: -4,
+        }}
+      >
+        <PortalToFollowElemTrigger onClick={handleTrigger}>
+          <div>
+            <ActionButton size='l' className={cn(open && 'bg-state-base-hover')}>
+              <RiEqualizer2Line className='h-[18px] w-[18px]' />
+            </ActionButton>
+          </div>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-50'>
+          <div className='w-[224px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg backdrop-blur-sm'>
+            <div className='p-1'>
+              <div className={cn('system-md-regular flex cursor-pointer items-center rounded-lg py-1.5 pl-3 pr-2 text-text-secondary')}>
+                <div className='grow'>{t('common.theme.theme')}</div>
+                <ThemeSwitcher/>
+              </div>
+            </div>
+            <Divider type='horizontal' className='my-0' />
+            <div className='p-1'>
+              {data?.privacy_policy && (
+                <a href={data.privacy_policy} target='_blank' className='system-md-regular flex cursor-pointer items-center rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover'>
+                  <span className='grow'>{t('share.chat.privacyPolicyMiddle')}</span>
+                </a>
+              )}
+              <div
+                onClick={() => {
+                  handleTrigger()
+                  setShow(true)
+                }}
+                className='system-md-regular cursor-pointer rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover'
+              >{t('common.userProfile.about')}</div>
+            </div>
+          </div>
+        </PortalToFollowElemContent>
+      </PortalToFollowElem>
+      {show && (
+        <InfoModal
+          isShow={show}
+          onClose={() => {
+            setShow(false)
+          }}
+          data={data}
+        />
+      )}
+    </>
+  )
+}
+export default React.memo(MenuDropdown)
diff --git a/app/components/share/text-generation/no-data/index.tsx b/app/components/share/text-generation/no-data/index.tsx
new file mode 100644
index 0000000..b24ca71
--- /dev/null
+++ b/app/components/share/text-generation/no-data/index.tsx
@@ -0,0 +1,22 @@
+import type { FC } from 'react'
+import React from 'react'
+import {
+  RiSparklingFill,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+
+export type INoDataProps = {}
+const NoData: FC<INoDataProps> = () => {
+  const { t } = useTranslation()
+  return (
+    <div className='flex h-full w-full flex-col items-center justify-center'>
+      <RiSparklingFill className='h-12 w-12 text-text-empty-state-icon' />
+      <div
+        className='system-sm-regular mt-2 text-text-quaternary'
+      >
+        {t('share.generation.noData')}
+      </div>
+    </div>
+  )
+}
+export default React.memo(NoData)
diff --git a/app/components/share/text-generation/result/content.tsx b/app/components/share/text-generation/result/content.tsx
new file mode 100644
index 0000000..f294b12
--- /dev/null
+++ b/app/components/share/text-generation/result/content.tsx
@@ -0,0 +1,34 @@
+import type { FC } from 'react'
+import React from 'react'
+import Header from './header'
+import type { FeedbackType } from '@/app/components/base/chat/chat/type'
+import { format } from '@/service/base'
+
+export type IResultProps = {
+  content: string
+  showFeedback: boolean
+  feedback: FeedbackType
+  onFeedback: (feedback: FeedbackType) => void
+}
+const Result: FC<IResultProps> = ({
+  content,
+  showFeedback,
+  feedback,
+  onFeedback,
+}) => {
+  return (
+    <div className='h-max basis-3/4'>
+      <Header result={content} showFeedback={showFeedback} feedback={feedback} onFeedback={onFeedback} />
+      <div
+        className='mt-4 flex w-full overflow-scroll text-sm font-normal leading-5 text-gray-900'
+        style={{
+          maxHeight: '70vh',
+        }}
+        dangerouslySetInnerHTML={{
+          __html: format(content),
+        }}
+      ></div>
+    </div>
+  )
+}
+export default React.memo(Result)
diff --git a/app/components/share/text-generation/result/header.tsx b/app/components/share/text-generation/result/header.tsx
new file mode 100644
index 0000000..351b500
--- /dev/null
+++ b/app/components/share/text-generation/result/header.tsx
@@ -0,0 +1,113 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { ClipboardDocumentIcon, HandThumbDownIcon, HandThumbUpIcon } from '@heroicons/react/24/outline'
+import copy from 'copy-to-clipboard'
+import type { FeedbackType } from '@/app/components/base/chat/chat/type'
+import Button from '@/app/components/base/button'
+import Toast from '@/app/components/base/toast'
+import Tooltip from '@/app/components/base/tooltip'
+
+type IResultHeaderProps = {
+  result: string
+  showFeedback: boolean
+  feedback: FeedbackType
+  onFeedback: (feedback: FeedbackType) => void
+}
+
+const Header: FC<IResultHeaderProps> = ({
+  feedback,
+  showFeedback,
+  onFeedback,
+  result,
+}) => {
+  const { t } = useTranslation()
+  return (
+    <div className='flex w-full items-center justify-between '>
+      <div className='text-2xl font-normal leading-4 text-gray-800'>{t('share.generation.resultTitle')}</div>
+      <div className='flex items-center space-x-2'>
+        <Button
+          className='h-7 p-[2px] pr-2'
+          onClick={() => {
+            copy(result)
+            Toast.notify({ type: 'success', message: 'copied' })
+          }}
+        >
+          <>
+            <ClipboardDocumentIcon className='mr-1 h-3 w-4 text-gray-500' />
+            <span className='text-xs leading-3 text-gray-500'>{t('share.generation.copy')}</span>
+          </>
+        </Button>
+
+        {showFeedback && feedback.rating && feedback.rating === 'like' && (
+          <Tooltip
+            popupContent="Undo Great Rating"
+          >
+            <div
+              onClick={() => {
+                onFeedback({
+                  rating: null,
+                })
+              }}
+              className='flex h-7 w-7 cursor-pointer items-center justify-center rounded-md  border border-primary-200 bg-primary-100 !text-primary-600 hover:border-primary-300 hover:bg-primary-200'>
+              <HandThumbUpIcon width={16} height={16} />
+            </div>
+          </Tooltip>
+        )}
+
+        {showFeedback && feedback.rating && feedback.rating === 'dislike' && (
+          <Tooltip
+            popupContent="Undo Undesirable Response"
+          >
+            <div
+              onClick={() => {
+                onFeedback({
+                  rating: null,
+                })
+              }}
+              className='flex h-7 w-7 cursor-pointer items-center justify-center rounded-md  border border-red-200 bg-red-100 !text-red-600 hover:border-red-300 hover:bg-red-200'>
+              <HandThumbDownIcon width={16} height={16} />
+            </div>
+          </Tooltip>
+        )}
+
+        {showFeedback && !feedback.rating && (
+          <div className='flex space-x-1 rounded-lg border border-gray-200 p-[1px]'>
+            <Tooltip
+              popupContent="Great Rating"
+              needsDelay={false}
+            >
+              <div
+                onClick={() => {
+                  onFeedback({
+                    rating: 'like',
+                  })
+                }}
+                className='flex h-6 w-6 cursor-pointer items-center justify-center rounded-md hover:bg-gray-100'>
+                <HandThumbUpIcon width={16} height={16} />
+              </div>
+            </Tooltip>
+            <Tooltip
+              popupContent="Undesirable Response"
+              needsDelay={false}
+            >
+              <div
+                onClick={() => {
+                  onFeedback({
+                    rating: 'dislike',
+                  })
+                }}
+                className='flex h-6 w-6 cursor-pointer items-center justify-center rounded-md hover:bg-gray-100'>
+                <HandThumbDownIcon width={16} height={16} />
+              </div>
+            </Tooltip>
+          </div>
+        )}
+      </div>
+
+    </div>
+  )
+}
+
+export default React.memo(Header)
diff --git a/app/components/share/text-generation/result/index.tsx b/app/components/share/text-generation/result/index.tsx
new file mode 100644
index 0000000..97a3a77
--- /dev/null
+++ b/app/components/share/text-generation/result/index.tsx
@@ -0,0 +1,466 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useRef, useState } from 'react'
+import { useBoolean } from 'ahooks'
+import { t } from 'i18next'
+import produce from 'immer'
+import TextGenerationRes from '@/app/components/app/text-generate/item'
+import NoData from '@/app/components/share/text-generation/no-data'
+import Toast from '@/app/components/base/toast'
+import { sendCompletionMessage, sendWorkflowMessage, updateFeedback } from '@/service/share'
+import type { FeedbackType } from '@/app/components/base/chat/chat/type'
+import Loading from '@/app/components/base/loading'
+import type { PromptConfig } from '@/models/debug'
+import type { InstalledApp } from '@/models/explore'
+import { TransferMethod, type VisionFile, type VisionSettings } from '@/types/app'
+import { NodeRunningStatus, WorkflowRunningStatus } from '@/app/components/workflow/types'
+import type { WorkflowProcess } from '@/app/components/base/chat/types'
+import { sleep } from '@/utils'
+import type { SiteInfo } from '@/models/share'
+import { TEXT_GENERATION_TIMEOUT_MS } from '@/config'
+import {
+  getFilesInLogs,
+} from '@/app/components/base/file-uploader/utils'
+
+export type IResultProps = {
+  isWorkflow: boolean
+  isCallBatchAPI: boolean
+  isPC: boolean
+  isMobile: boolean
+  isInstalledApp: boolean
+  installedAppInfo?: InstalledApp
+  isError: boolean
+  isShowTextToSpeech: boolean
+  promptConfig: PromptConfig | null
+  moreLikeThisEnabled: boolean
+  inputs: Record<string, any>
+  controlSend?: number
+  controlRetry?: number
+  controlStopResponding?: number
+  onShowRes: () => void
+  handleSaveMessage: (messageId: string) => void
+  taskId?: number
+  onCompleted: (completionRes: string, taskId?: number, success?: boolean) => void
+  visionConfig: VisionSettings
+  completionFiles: VisionFile[]
+  siteInfo: SiteInfo | null
+  onRunStart: () => void
+}
+
+const Result: FC<IResultProps> = ({
+  isWorkflow,
+  isCallBatchAPI,
+  isPC,
+  isMobile,
+  isInstalledApp,
+  installedAppInfo,
+  isError,
+  isShowTextToSpeech,
+  promptConfig,
+  moreLikeThisEnabled,
+  inputs,
+  controlSend,
+  controlRetry,
+  controlStopResponding,
+  onShowRes,
+  handleSaveMessage,
+  taskId,
+  onCompleted,
+  visionConfig,
+  completionFiles,
+  siteInfo,
+  onRunStart,
+}) => {
+  const [isResponding, { setTrue: setRespondingTrue, setFalse: setRespondingFalse }] = useBoolean(false)
+  useEffect(() => {
+    if (controlStopResponding)
+      setRespondingFalse()
+  }, [controlStopResponding])
+
+  const [completionRes, doSetCompletionRes] = useState<any>('')
+  const completionResRef = useRef<any>()
+  const setCompletionRes = (res: any) => {
+    completionResRef.current = res
+    doSetCompletionRes(res)
+  }
+  const getCompletionRes = () => completionResRef.current
+  const [workflowProcessData, doSetWorkflowProcessData] = useState<WorkflowProcess>()
+  const workflowProcessDataRef = useRef<WorkflowProcess>()
+  const setWorkflowProcessData = (data: WorkflowProcess) => {
+    workflowProcessDataRef.current = data
+    doSetWorkflowProcessData(data)
+  }
+  const getWorkflowProcessData = () => workflowProcessDataRef.current
+
+  const { notify } = Toast
+  const isNoData = !completionRes
+
+  const [messageId, setMessageId] = useState<string | null>(null)
+  const [feedback, setFeedback] = useState<FeedbackType>({
+    rating: null,
+  })
+
+  const handleFeedback = async (feedback: FeedbackType) => {
+    await updateFeedback({ url: `/messages/${messageId}/feedbacks`, body: { rating: feedback.rating } }, isInstalledApp, installedAppInfo?.id)
+    setFeedback(feedback)
+  }
+
+  const logError = (message: string) => {
+    notify({ type: 'error', message })
+  }
+
+  const checkCanSend = () => {
+    // batch will check outer
+    if (isCallBatchAPI)
+      return true
+
+    const prompt_variables = promptConfig?.prompt_variables
+    if (!prompt_variables || prompt_variables?.length === 0) {
+      if (completionFiles.find(item => item.transfer_method === TransferMethod.local_file && !item.upload_file_id)) {
+        notify({ type: 'info', message: t('appDebug.errorMessage.waitForFileUpload') })
+        return false
+      }
+      return true
+    }
+
+    let hasEmptyInput = ''
+    const requiredVars = prompt_variables?.filter(({ key, name, required }) => {
+      const res = (!key || !key.trim()) || (!name || !name.trim()) || (required || required === undefined || required === null)
+      return res
+    }) || [] // compatible with old version
+    requiredVars.forEach(({ key, name }) => {
+      if (hasEmptyInput)
+        return
+
+      if (!inputs[key])
+        hasEmptyInput = name
+    })
+
+    if (hasEmptyInput) {
+      logError(t('appDebug.errorMessage.valueOfVarRequired', { key: hasEmptyInput }))
+      return false
+    }
+
+    if (completionFiles.find(item => item.transfer_method === TransferMethod.local_file && !item.upload_file_id)) {
+      notify({ type: 'info', message: t('appDebug.errorMessage.waitForFileUpload') })
+      return false
+    }
+    return !hasEmptyInput
+  }
+
+  const handleSend = async () => {
+    if (isResponding) {
+      notify({ type: 'info', message: t('appDebug.errorMessage.waitForResponse') })
+      return false
+    }
+
+    if (!checkCanSend())
+      return
+
+    const data: Record<string, any> = {
+      inputs,
+    }
+    if (visionConfig.enabled && completionFiles && completionFiles?.length > 0) {
+      data.files = completionFiles.map((item) => {
+        if (item.transfer_method === TransferMethod.local_file) {
+          return {
+            ...item,
+            url: '',
+          }
+        }
+        return item
+      })
+    }
+
+    setMessageId(null)
+    setFeedback({
+      rating: null,
+    })
+    setCompletionRes('')
+
+    let res: string[] = []
+    let tempMessageId = ''
+
+    if (!isPC) {
+      onShowRes()
+      onRunStart()
+    }
+
+    setRespondingTrue()
+    let isEnd = false
+    let isTimeout = false;
+    (async () => {
+      await sleep(TEXT_GENERATION_TIMEOUT_MS)
+      if (!isEnd) {
+        setRespondingFalse()
+        onCompleted(getCompletionRes(), taskId, false)
+        isTimeout = true
+      }
+    })()
+
+    if (isWorkflow) {
+      sendWorkflowMessage(
+        data,
+        {
+          onWorkflowStarted: ({ workflow_run_id }) => {
+            tempMessageId = workflow_run_id
+            setWorkflowProcessData({
+              status: WorkflowRunningStatus.Running,
+              tracing: [],
+              expand: false,
+              resultText: '',
+            })
+          },
+          onIterationStart: ({ data }) => {
+            setWorkflowProcessData(produce(getWorkflowProcessData()!, (draft) => {
+              draft.expand = true
+              draft.tracing!.push({
+                ...data,
+                status: NodeRunningStatus.Running,
+                expand: true,
+              })
+            }))
+          },
+          onIterationNext: () => {
+            setWorkflowProcessData(produce(getWorkflowProcessData()!, (draft) => {
+              draft.expand = true
+              const iterations = draft.tracing.find(item => item.node_id === data.node_id
+                && (item.execution_metadata?.parallel_id === data.execution_metadata?.parallel_id || item.parallel_id === data.execution_metadata?.parallel_id))!
+              iterations?.details!.push([])
+            }))
+          },
+          onIterationFinish: ({ data }) => {
+            setWorkflowProcessData(produce(getWorkflowProcessData()!, (draft) => {
+              draft.expand = true
+              const iterationsIndex = draft.tracing.findIndex(item => item.node_id === data.node_id
+                && (item.execution_metadata?.parallel_id === data.execution_metadata?.parallel_id || item.parallel_id === data.execution_metadata?.parallel_id))!
+              draft.tracing[iterationsIndex] = {
+                ...data,
+                expand: !!data.error,
+              }
+            }))
+          },
+          onLoopStart: ({ data }) => {
+            setWorkflowProcessData(produce(getWorkflowProcessData()!, (draft) => {
+              draft.expand = true
+              draft.tracing!.push({
+                ...data,
+                status: NodeRunningStatus.Running,
+                expand: true,
+              })
+            }))
+          },
+          onLoopNext: () => {
+            setWorkflowProcessData(produce(getWorkflowProcessData()!, (draft) => {
+              draft.expand = true
+              const loops = draft.tracing.find(item => item.node_id === data.node_id
+                && (item.execution_metadata?.parallel_id === data.execution_metadata?.parallel_id || item.parallel_id === data.execution_metadata?.parallel_id))!
+              loops?.details!.push([])
+            }))
+          },
+          onLoopFinish: ({ data }) => {
+            setWorkflowProcessData(produce(getWorkflowProcessData()!, (draft) => {
+              draft.expand = true
+              const loopsIndex = draft.tracing.findIndex(item => item.node_id === data.node_id
+                && (item.execution_metadata?.parallel_id === data.execution_metadata?.parallel_id || item.parallel_id === data.execution_metadata?.parallel_id))!
+              draft.tracing[loopsIndex] = {
+                ...data,
+                expand: !!data.error,
+              }
+            }))
+          },
+          onNodeStarted: ({ data }) => {
+            if (data.iteration_id)
+              return
+
+            if (data.loop_id)
+              return
+
+            setWorkflowProcessData(produce(getWorkflowProcessData()!, (draft) => {
+              draft.expand = true
+              draft.tracing!.push({
+                ...data,
+                status: NodeRunningStatus.Running,
+                expand: true,
+              })
+            }))
+          },
+          onNodeFinished: ({ data }) => {
+            if (data.iteration_id)
+              return
+
+            if (data.loop_id)
+              return
+
+            setWorkflowProcessData(produce(getWorkflowProcessData()!, (draft) => {
+              const currentIndex = draft.tracing!.findIndex(trace => trace.node_id === data.node_id
+                && (trace.execution_metadata?.parallel_id === data.execution_metadata?.parallel_id || trace.parallel_id === data.execution_metadata?.parallel_id))
+              if (currentIndex > -1 && draft.tracing) {
+                draft.tracing[currentIndex] = {
+                  ...(draft.tracing[currentIndex].extras
+                    ? { extras: draft.tracing[currentIndex].extras }
+                    : {}),
+                  ...data,
+                  expand: !!data.error,
+                }
+              }
+            }))
+          },
+          onWorkflowFinished: ({ data }) => {
+            if (isTimeout) {
+              notify({ type: 'warning', message: t('appDebug.warningMessage.timeoutExceeded') })
+              return
+            }
+            if (data.error) {
+              notify({ type: 'error', message: data.error })
+              setWorkflowProcessData(produce(getWorkflowProcessData()!, (draft) => {
+                draft.status = WorkflowRunningStatus.Failed
+              }))
+              setRespondingFalse()
+              onCompleted(getCompletionRes(), taskId, false)
+              isEnd = true
+              return
+            }
+            setWorkflowProcessData(produce(getWorkflowProcessData()!, (draft) => {
+              draft.status = WorkflowRunningStatus.Succeeded
+              draft.files = getFilesInLogs(data.outputs || []) as any[]
+            }))
+            if (!data.outputs) {
+              setCompletionRes('')
+            }
+            else {
+              setCompletionRes(data.outputs)
+              const isStringOutput = Object.keys(data.outputs).length === 1 && typeof data.outputs[Object.keys(data.outputs)[0]] === 'string'
+              if (isStringOutput) {
+                setWorkflowProcessData(produce(getWorkflowProcessData()!, (draft) => {
+                  draft.resultText = data.outputs[Object.keys(data.outputs)[0]]
+                }))
+              }
+            }
+            setRespondingFalse()
+            setMessageId(tempMessageId)
+            onCompleted(getCompletionRes(), taskId, true)
+            isEnd = true
+          },
+          onTextChunk: (params) => {
+            const { data: { text } } = params
+            setWorkflowProcessData(produce(getWorkflowProcessData()!, (draft) => {
+              draft.resultText += text
+            }))
+          },
+          onTextReplace: (params) => {
+            const { data: { text } } = params
+            setWorkflowProcessData(produce(getWorkflowProcessData()!, (draft) => {
+              draft.resultText = text
+            }))
+          },
+        },
+        isInstalledApp,
+        installedAppInfo?.id,
+      )
+    }
+    else {
+      sendCompletionMessage(data, {
+        onData: (data: string, _isFirstMessage: boolean, { messageId }) => {
+          tempMessageId = messageId
+          res.push(data)
+          setCompletionRes(res.join(''))
+        },
+        onCompleted: () => {
+          if (isTimeout) {
+            notify({ type: 'warning', message: t('appDebug.warningMessage.timeoutExceeded') })
+            return
+          }
+          setRespondingFalse()
+          setMessageId(tempMessageId)
+          onCompleted(getCompletionRes(), taskId, true)
+          isEnd = true
+        },
+        onMessageReplace: (messageReplace) => {
+          res = [messageReplace.answer]
+          setCompletionRes(res.join(''))
+        },
+        onError() {
+          if (isTimeout) {
+            notify({ type: 'warning', message: t('appDebug.warningMessage.timeoutExceeded') })
+            return
+          }
+          setRespondingFalse()
+          onCompleted(getCompletionRes(), taskId, false)
+          isEnd = true
+        },
+      }, isInstalledApp, installedAppInfo?.id)
+    }
+  }
+
+  const [controlClearMoreLikeThis, setControlClearMoreLikeThis] = useState(0)
+  useEffect(() => {
+    if (controlSend) {
+      handleSend()
+      setControlClearMoreLikeThis(Date.now())
+    }
+  }, [controlSend])
+
+  useEffect(() => {
+    if (controlRetry)
+      handleSend()
+  }, [controlRetry])
+
+  const renderTextGenerationRes = () => (
+    <TextGenerationRes
+      isWorkflow={isWorkflow}
+      workflowProcessData={workflowProcessData}
+      isError={isError}
+      onRetry={handleSend}
+      content={completionRes}
+      messageId={messageId}
+      isInWebApp
+      moreLikeThis={moreLikeThisEnabled}
+      onFeedback={handleFeedback}
+      feedback={feedback}
+      onSave={handleSaveMessage}
+      isMobile={isMobile}
+      isInstalledApp={isInstalledApp}
+      installedAppId={installedAppInfo?.id}
+      isLoading={isCallBatchAPI ? (!completionRes && isResponding) : false}
+      taskId={isCallBatchAPI ? ((taskId as number) < 10 ? `0${taskId}` : `${taskId}`) : undefined}
+      controlClearMoreLikeThis={controlClearMoreLikeThis}
+      isShowTextToSpeech={isShowTextToSpeech}
+      hideProcessDetail
+      siteInfo={siteInfo}
+    />
+  )
+
+  return (
+    <>
+      {!isCallBatchAPI && !isWorkflow && (
+        (isResponding && !completionRes)
+          ? (
+            <div className='flex h-full w-full items-center justify-center'>
+              <Loading type='area' />
+            </div>)
+          : (
+            <>
+              {(isNoData)
+                ? <NoData />
+                : renderTextGenerationRes()
+              }
+            </>
+          )
+      )}
+      {!isCallBatchAPI && isWorkflow && (
+        (isResponding && !workflowProcessData)
+          ? (
+            <div className='flex h-full w-full items-center justify-center'>
+              <Loading type='area' />
+            </div>
+          )
+          : !workflowProcessData
+            ? <NoData />
+            : renderTextGenerationRes()
+      )}
+      {isCallBatchAPI && renderTextGenerationRes()}
+    </>
+  )
+}
+export default React.memo(Result)
diff --git a/app/components/share/text-generation/run-batch/csv-download/index.tsx b/app/components/share/text-generation/run-batch/csv-download/index.tsx
new file mode 100644
index 0000000..54a5a6d
--- /dev/null
+++ b/app/components/share/text-generation/run-batch/csv-download/index.tsx
@@ -0,0 +1,70 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import {
+  useCSVDownloader,
+} from 'react-papaparse'
+import { useTranslation } from 'react-i18next'
+import { Download02 as DownloadIcon } from '@/app/components/base/icons/src/vender/solid/general'
+
+export type ICSVDownloadProps = {
+  vars: { name: string }[]
+}
+
+const CSVDownload: FC<ICSVDownloadProps> = ({
+  vars,
+}) => {
+  const { t } = useTranslation()
+  const { CSVDownloader, Type } = useCSVDownloader()
+  const addQueryContentVars = [...vars]
+  const template = (() => {
+    const res: Record<string, string> = {}
+    addQueryContentVars.forEach((item) => {
+      res[item.name] = ''
+    })
+    return res
+  })()
+
+  return (
+    <div className='mt-6'>
+      <div className='system-sm-medium text-text-primary'>{t('share.generation.csvStructureTitle')}</div>
+      <div className='mt-2 max-h-[500px] overflow-auto'>
+        <table className='w-full table-fixed border-separate border-spacing-0 rounded-lg border border-divider-regular text-xs'>
+          <thead className='text-text-tertiary'>
+            <tr>
+              {addQueryContentVars.map((item, i) => (
+                <td key={i} className='h-9 border-b border-divider-regular pl-3 pr-2'>{item.name}</td>
+              ))}
+            </tr>
+          </thead>
+          <tbody className='text-text-secondary'>
+            <tr>
+              {addQueryContentVars.map((item, i) => (
+                <td key={i} className='h-9 pl-4'>{item.name} {t('share.generation.field')}</td>
+              ))}
+            </tr>
+          </tbody>
+        </table>
+      </div>
+      <CSVDownloader
+        className="mt-2 block cursor-pointer"
+        type={Type.Link}
+        filename={'template'}
+        bom={true}
+        config={{
+          // delimiter: ';',
+        }}
+        data={[
+          template,
+        ]}
+      >
+        <div className='system-xs-medium flex h-[18px] items-center space-x-1 text-text-accent'>
+          <DownloadIcon className='h-3 w-3' />
+          <span>{t('share.generation.downloadTemplate')}</span>
+        </div>
+      </CSVDownloader>
+    </div>
+
+  )
+}
+export default React.memo(CSVDownload)
diff --git a/app/components/share/text-generation/run-batch/csv-reader/index.tsx b/app/components/share/text-generation/run-batch/csv-reader/index.tsx
new file mode 100644
index 0000000..c19ec21
--- /dev/null
+++ b/app/components/share/text-generation/run-batch/csv-reader/index.tsx
@@ -0,0 +1,73 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import {
+  useCSVReader,
+} from 'react-papaparse'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+import { Csv as CSVIcon } from '@/app/components/base/icons/src/public/files'
+
+export type Props = {
+  onParsed: (data: string[][]) => void
+}
+
+const CSVReader: FC<Props> = ({
+  onParsed,
+}) => {
+  const { t } = useTranslation()
+  const { CSVReader } = useCSVReader()
+  const [zoneHover, setZoneHover] = useState(false)
+  return (
+    <CSVReader
+      onUploadAccepted={(results: any) => {
+        onParsed(results.data)
+        setZoneHover(false)
+      }}
+      onDragOver={(event: DragEvent) => {
+        event.preventDefault()
+        setZoneHover(true)
+      }}
+      onDragLeave={(event: DragEvent) => {
+        event.preventDefault()
+        setZoneHover(false)
+      }}
+    >
+      {({
+        getRootProps,
+        acceptedFile,
+      }: any) => (
+        <>
+          <div
+            {...getRootProps()}
+            className={cn(
+              'system-sm-regular flex h-20 items-center rounded-xl border border-dashed border-components-dropzone-border bg-components-dropzone-bg',
+              acceptedFile && 'border-solid border-components-panel-border bg-components-panel-on-panel-item-bg px-6 hover:border-components-panel-bg-blur hover:bg-components-panel-on-panel-item-bg-hover',
+              zoneHover && 'border border-components-dropzone-border-accent bg-components-dropzone-bg-accent',
+            )}
+          >
+            {
+              acceptedFile
+                ? (
+                  <div className='flex w-full items-center space-x-2'>
+                    <CSVIcon className="shrink-0" />
+                    <div className='flex w-0 grow'>
+                      <span className='max-w-[calc(100%_-_30px)] truncate text-text-secondary'>{acceptedFile.name.replace(/.csv$/, '')}</span>
+                      <span className='shrink-0 text-text-tertiary'>.csv</span>
+                    </div>
+                  </div>
+                )
+                : (
+                  <div className='flex w-full items-center justify-center space-x-2'>
+                    <CSVIcon className="shrink-0" />
+                    <div className='text-text-tertiary'>{t('share.generation.csvUploadTitle')}<span className='cursor-pointer text-text-accent'>{t('share.generation.browse')}</span></div>
+                  </div>
+                )}
+          </div>
+        </>
+      )}
+    </CSVReader>
+  )
+}
+
+export default React.memo(CSVReader)
diff --git a/app/components/share/text-generation/run-batch/index.tsx b/app/components/share/text-generation/run-batch/index.tsx
new file mode 100644
index 0000000..eaaa31f
--- /dev/null
+++ b/app/components/share/text-generation/run-batch/index.tsx
@@ -0,0 +1,59 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiLoader2Line,
+  RiPlayLargeLine,
+} from '@remixicon/react'
+import CSVReader from './csv-reader'
+import CSVDownload from './csv-download'
+import Button from '@/app/components/base/button'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import cn from '@/utils/classnames'
+export type IRunBatchProps = {
+  vars: { name: string }[]
+  onSend: (data: string[][]) => void
+  isAllFinished: boolean
+}
+
+const RunBatch: FC<IRunBatchProps> = ({
+  vars,
+  onSend,
+  isAllFinished,
+}) => {
+  const { t } = useTranslation()
+  const media = useBreakpoints()
+  const isPC = media === MediaType.pc
+
+  const [csvData, setCsvData] = React.useState<string[][]>([])
+  const [isParsed, setIsParsed] = React.useState(false)
+  const handleParsed = (data: string[][]) => {
+    setCsvData(data)
+    // console.log(data)
+    setIsParsed(true)
+  }
+
+  const handleSend = () => {
+    onSend(csvData)
+  }
+  const Icon = isAllFinished ? RiPlayLargeLine : RiLoader2Line
+  return (
+    <div className='pt-4'>
+      <CSVReader onParsed={handleParsed} />
+      <CSVDownload vars={vars} />
+      <div className='flex justify-end'>
+        <Button
+          variant="primary"
+          className={cn('mt-4 pl-3 pr-4', !isPC && 'grow')}
+          onClick={handleSend}
+          disabled={!isParsed || !isAllFinished}
+        >
+          <Icon className={cn(!isAllFinished && 'animate-spin', 'mr-1 h-4 w-4 shrink-0')} aria-hidden="true" />
+          <span className='text-[13px] uppercase'>{t('share.generation.run')}</span>
+        </Button>
+      </div>
+    </div>
+  )
+}
+export default React.memo(RunBatch)
diff --git a/app/components/share/text-generation/run-batch/res-download/index.tsx b/app/components/share/text-generation/run-batch/res-download/index.tsx
new file mode 100644
index 0000000..8915cfe
--- /dev/null
+++ b/app/components/share/text-generation/run-batch/res-download/index.tsx
@@ -0,0 +1,50 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { RiDownloadLine } from '@remixicon/react'
+import {
+  useCSVDownloader,
+} from 'react-papaparse'
+import { useTranslation } from 'react-i18next'
+import ActionButton from '@/app/components/base/action-button'
+import Button from '@/app/components/base/button'
+import cn from '@/utils/classnames'
+
+export type IResDownloadProps = {
+  isMobile: boolean
+  values: Record<string, string>[]
+}
+
+const ResDownload: FC<IResDownloadProps> = ({
+  isMobile,
+  values,
+}) => {
+  const { t } = useTranslation()
+  const { CSVDownloader, Type } = useCSVDownloader()
+
+  return (
+    <CSVDownloader
+      className="block cursor-pointer"
+      type={Type.Link}
+      filename={'result'}
+      bom={true}
+      config={{
+        // delimiter: ';',
+      }}
+      data={values}
+    >
+      {isMobile && (
+        <ActionButton>
+          <RiDownloadLine className='h-4 w-4' />
+        </ActionButton>
+      )}
+      {!isMobile && (
+        <Button className={cn('space-x-1')}>
+          <RiDownloadLine className='h-4 w-4' />
+          <span>{t('common.operation.download')}</span>
+        </Button>
+      )}
+    </CSVDownloader>
+  )
+}
+export default React.memo(ResDownload)
diff --git a/app/components/share/text-generation/run-once/index.tsx b/app/components/share/text-generation/run-once/index.tsx
new file mode 100644
index 0000000..546b21d
--- /dev/null
+++ b/app/components/share/text-generation/run-once/index.tsx
@@ -0,0 +1,184 @@
+import type { ChangeEvent, FC, FormEvent } from 'react'
+import { useEffect } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiPlayLargeLine,
+} from '@remixicon/react'
+import Select from '@/app/components/base/select'
+import type { SiteInfo } from '@/models/share'
+import type { PromptConfig } from '@/models/debug'
+import Button from '@/app/components/base/button'
+import Textarea from '@/app/components/base/textarea'
+import Input from '@/app/components/base/input'
+import { DEFAULT_VALUE_MAX_LEN } from '@/config'
+import TextGenerationImageUploader from '@/app/components/base/image-uploader/text-generation-image-uploader'
+import type { VisionFile, VisionSettings } from '@/types/app'
+import { FileUploaderInAttachmentWrapper } from '@/app/components/base/file-uploader'
+import { getProcessedFiles } from '@/app/components/base/file-uploader/utils'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import cn from '@/utils/classnames'
+
+export type IRunOnceProps = {
+  siteInfo: SiteInfo
+  promptConfig: PromptConfig
+  inputs: Record<string, any>
+  inputsRef: React.MutableRefObject<Record<string, any>>
+  onInputsChange: (inputs: Record<string, any>) => void
+  onSend: () => void
+  visionConfig: VisionSettings
+  onVisionFilesChange: (files: VisionFile[]) => void
+}
+const RunOnce: FC<IRunOnceProps> = ({
+  promptConfig,
+  inputs,
+  inputsRef,
+  onInputsChange,
+  onSend,
+  visionConfig,
+  onVisionFilesChange,
+}) => {
+  const { t } = useTranslation()
+  const media = useBreakpoints()
+  const isPC = media === MediaType.pc
+
+  const onClear = () => {
+    const newInputs: Record<string, any> = {}
+    promptConfig.prompt_variables.forEach((item) => {
+      if (item.type === 'string' || item.type === 'paragraph')
+        newInputs[item.key] = ''
+      else
+        newInputs[item.key] = undefined
+    })
+    onInputsChange(newInputs)
+  }
+
+  const onSubmit = (e: FormEvent<HTMLFormElement>) => {
+    e.preventDefault()
+    onSend()
+  }
+
+  const handleInputsChange = useCallback((newInputs: Record<string, any>) => {
+    onInputsChange(newInputs)
+    inputsRef.current = newInputs
+  }, [onInputsChange, inputsRef])
+
+  useEffect(() => {
+    const newInputs: Record<string, any> = {}
+    promptConfig.prompt_variables.forEach((item) => {
+      if (item.type === 'string' || item.type === 'paragraph')
+        newInputs[item.key] = ''
+      else
+        newInputs[item.key] = undefined
+    })
+    onInputsChange(newInputs)
+  }, [promptConfig.prompt_variables, onInputsChange])
+
+  return (
+    <div className="">
+      <section>
+        {/* input form */}
+        <form onSubmit={onSubmit}>
+          {(inputs === null || inputs === undefined || Object.keys(inputs).length === 0) ? null
+            : promptConfig.prompt_variables.map(item => (
+              <div className='mt-4 w-full' key={item.key}>
+                <label className='system-md-semibold flex h-6 items-center text-text-secondary'>{item.name}</label>
+                <div className='mt-1'>
+                  {item.type === 'select' && (
+                    <Select
+                      className='w-full'
+                      defaultValue={inputs[item.key]}
+                      onSelect={(i) => { handleInputsChange({ ...inputsRef.current, [item.key]: i.value }) }}
+                      items={(item.options || []).map(i => ({ name: i, value: i }))}
+                      allowSearch={false}
+                    />
+                  )}
+                  {item.type === 'string' && (
+                    <Input
+                      type="text"
+                      placeholder={`${item.name}${!item.required ? `(${t('appDebug.variableTable.optional')})` : ''}`}
+                      value={inputs[item.key]}
+                      onChange={(e: ChangeEvent<HTMLInputElement>) => { handleInputsChange({ ...inputsRef.current, [item.key]: e.target.value }) }}
+                      maxLength={item.max_length || DEFAULT_VALUE_MAX_LEN}
+                    />
+                  )}
+                  {item.type === 'paragraph' && (
+                    <Textarea
+                      className='h-[104px] sm:text-xs'
+                      placeholder={`${item.name}${!item.required ? `(${t('appDebug.variableTable.optional')})` : ''}`}
+                      value={inputs[item.key]}
+                      onChange={(e: ChangeEvent<HTMLInputElement>) => { handleInputsChange({ ...inputsRef.current, [item.key]: e.target.value }) }}
+                    />
+                  )}
+                  {item.type === 'number' && (
+                    <Input
+                      type="number"
+                      placeholder={`${item.name}${!item.required ? `(${t('appDebug.variableTable.optional')})` : ''}`}
+                      value={inputs[item.key]}
+                      onChange={(e: ChangeEvent<HTMLInputElement>) => { handleInputsChange({ ...inputsRef.current, [item.key]: e.target.value }) }}
+                    />
+                  )}
+                  {item.type === 'file' && (
+                    <FileUploaderInAttachmentWrapper
+                      onChange={(files) => { handleInputsChange({ ...inputsRef.current, [item.key]: getProcessedFiles(files)[0] }) }}
+                      fileConfig={{
+                        ...item.config,
+                        fileUploadConfig: (visionConfig as any).fileUploadConfig,
+                      }}
+                    />
+                  )}
+                  {item.type === 'file-list' && (
+                    <FileUploaderInAttachmentWrapper
+                      onChange={(files) => { handleInputsChange({ ...inputsRef.current, [item.key]: getProcessedFiles(files) }) }}
+                      fileConfig={{
+                        ...item.config,
+                        fileUploadConfig: (visionConfig as any).fileUploadConfig,
+                      }}
+                    />
+                  )}
+                </div>
+              </div>
+            ))}
+          {
+            visionConfig?.enabled && (
+              <div className="mt-4 w-full">
+                <div className="system-md-semibold flex h-6 items-center text-text-secondary">{t('common.imageUploader.imageUpload')}</div>
+                <div className='mt-1'>
+                  <TextGenerationImageUploader
+                    settings={visionConfig}
+                    onFilesChange={files => onVisionFilesChange(files.filter(file => file.progress !== -1).map(fileItem => ({
+                      type: 'image',
+                      transfer_method: fileItem.type,
+                      url: fileItem.url,
+                      upload_file_id: fileItem.fileId,
+                    })))}
+                  />
+                </div>
+              </div>
+            )
+          }
+          <div className='mb-3 mt-6 w-full'>
+            <div className="flex items-center justify-between gap-2">
+              <Button
+                onClick={onClear}
+                disabled={false}
+              >
+                <span className='text-[13px]'>{t('common.operation.clear')}</span>
+              </Button>
+              <Button
+                className={cn(!isPC && 'grow')}
+                type='submit'
+                variant="primary"
+                disabled={false}
+              >
+                <RiPlayLargeLine className="mr-1 h-4 w-4 shrink-0" aria-hidden="true" />
+                <span className='text-[13px]'>{t('share.generation.run')}</span>
+              </Button>
+            </div>
+          </div>
+        </form>
+      </section>
+    </div>
+  )
+}
+export default React.memo(RunOnce)
diff --git a/app/components/share/utils.ts b/app/components/share/utils.ts
new file mode 100644
index 0000000..9ce891a
--- /dev/null
+++ b/app/components/share/utils.ts
@@ -0,0 +1,75 @@
+import { CONVERSATION_ID_INFO } from '../base/chat/constants'
+import { fetchAccessToken } from '@/service/share'
+import { getProcessedSystemVariablesFromUrlParams } from '../base/chat/utils'
+
+export const isTokenV1 = (token: Record<string, any>) => {
+  return !token.version
+}
+
+export const getInitialTokenV2 = (): Record<string, any> => ({
+  version: 2,
+})
+
+export const checkOrSetAccessToken = async () => {
+  const sharedToken = globalThis.location.pathname.split('/').slice(-1)[0]
+  const userId = (await getProcessedSystemVariablesFromUrlParams()).user_id
+  const accessToken = localStorage.getItem('token') || JSON.stringify(getInitialTokenV2())
+  let accessTokenJson = getInitialTokenV2()
+  try {
+    accessTokenJson = JSON.parse(accessToken)
+    if (isTokenV1(accessTokenJson))
+      accessTokenJson = getInitialTokenV2()
+  }
+  catch {
+
+  }
+  if (!accessTokenJson[sharedToken]?.[userId || 'DEFAULT']) {
+    const res = await fetchAccessToken(sharedToken, userId)
+    accessTokenJson[sharedToken] = {
+      ...accessTokenJson[sharedToken],
+      [userId || 'DEFAULT']: res.access_token,
+    }
+    localStorage.setItem('token', JSON.stringify(accessTokenJson))
+  }
+}
+
+export const setAccessToken = async (sharedToken: string, token: string, user_id?: string) => {
+  const accessToken = localStorage.getItem('token') || JSON.stringify(getInitialTokenV2())
+  let accessTokenJson = getInitialTokenV2()
+  try {
+    accessTokenJson = JSON.parse(accessToken)
+    if (isTokenV1(accessTokenJson))
+      accessTokenJson = getInitialTokenV2()
+  }
+  catch {
+
+  }
+
+  localStorage.removeItem(CONVERSATION_ID_INFO)
+
+  accessTokenJson[sharedToken] = {
+    ...accessTokenJson[sharedToken],
+    [user_id || 'DEFAULT']: token,
+  }
+  localStorage.setItem('token', JSON.stringify(accessTokenJson))
+}
+
+export const removeAccessToken = () => {
+  const sharedToken = globalThis.location.pathname.split('/').slice(-1)[0]
+
+  const accessToken = localStorage.getItem('token') || JSON.stringify(getInitialTokenV2())
+  let accessTokenJson = getInitialTokenV2()
+  try {
+    accessTokenJson = JSON.parse(accessToken)
+    if (isTokenV1(accessTokenJson))
+      accessTokenJson = getInitialTokenV2()
+  }
+  catch {
+
+  }
+
+  localStorage.removeItem(CONVERSATION_ID_INFO)
+
+  delete accessTokenJson[sharedToken]
+  localStorage.setItem('token', JSON.stringify(accessTokenJson))
+}
diff --git a/app/components/signin/countdown.tsx b/app/components/signin/countdown.tsx
new file mode 100644
index 0000000..5fd6a29
--- /dev/null
+++ b/app/components/signin/countdown.tsx
@@ -0,0 +1,41 @@
+'use client'
+import { useCountDown } from 'ahooks'
+import { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+
+export const COUNT_DOWN_TIME_MS = 59000
+export const COUNT_DOWN_KEY = 'leftTime'
+
+type CountdownProps = {
+  onResend?: () => void
+}
+
+export default function Countdown({ onResend }: CountdownProps) {
+  const { t } = useTranslation()
+  const [leftTime, setLeftTime] = useState(Number(localStorage.getItem(COUNT_DOWN_KEY) || COUNT_DOWN_TIME_MS))
+  const [time] = useCountDown({
+    leftTime,
+    onEnd: () => {
+      setLeftTime(0)
+      localStorage.removeItem(COUNT_DOWN_KEY)
+    },
+  })
+
+  const resend = async function () {
+    setLeftTime(COUNT_DOWN_TIME_MS)
+    localStorage.setItem(COUNT_DOWN_KEY, `${COUNT_DOWN_TIME_MS}`)
+    onResend?.()
+  }
+
+  useEffect(() => {
+    localStorage.setItem(COUNT_DOWN_KEY, `${time}`)
+  }, [time])
+
+  return <p className='system-xs-regular text-text-tertiary'>
+    <span>{t('login.checkCode.didNotReceiveCode')}</span>
+    {time > 0 && <span>{Math.round(time / 1000)}s</span>}
+    {
+      time <= 0 && <span className='system-xs-medium cursor-pointer text-text-accent-secondary' onClick={resend}>{t('login.checkCode.resend')}</span>
+    }
+  </p>
+}
diff --git a/app/components/swr-initor.tsx b/app/components/swr-initor.tsx
new file mode 100644
index 0000000..8f9c5b4
--- /dev/null
+++ b/app/components/swr-initor.tsx
@@ -0,0 +1,89 @@
+'use client'
+
+import { SWRConfig } from 'swr'
+import { useCallback, useEffect, useState } from 'react'
+import type { ReactNode } from 'react'
+import { usePathname, useRouter, useSearchParams } from 'next/navigation'
+import { fetchSetupStatus } from '@/service/common'
+import {
+  EDUCATION_VERIFYING_LOCALSTORAGE_ITEM,
+  EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION,
+} from '@/app/education-apply/constants'
+
+type SwrInitorProps = {
+  children: ReactNode
+}
+const SwrInitor = ({
+  children,
+}: SwrInitorProps) => {
+  const router = useRouter()
+  const searchParams = useSearchParams()
+  const consoleToken = decodeURIComponent(searchParams.get('access_token') || '')
+  const refreshToken = decodeURIComponent(searchParams.get('refresh_token') || '')
+  const consoleTokenFromLocalStorage = localStorage?.getItem('console_token')
+  const refreshTokenFromLocalStorage = localStorage?.getItem('refresh_token')
+  const pathname = usePathname()
+  const [init, setInit] = useState(false)
+
+  const isSetupFinished = useCallback(async () => {
+    try {
+      if (localStorage.getItem('setup_status') === 'finished')
+        return true
+      const setUpStatus = await fetchSetupStatus()
+      if (setUpStatus.step !== 'finished') {
+        localStorage.removeItem('setup_status')
+        return false
+      }
+      localStorage.setItem('setup_status', 'finished')
+      return true
+    }
+    catch (error) {
+      console.error(error)
+      return false
+    }
+  }, [])
+
+  useEffect(() => {
+    (async () => {
+      const action = searchParams.get('action')
+
+      if (action === EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION)
+        localStorage.setItem(EDUCATION_VERIFYING_LOCALSTORAGE_ITEM, 'yes')
+
+      try {
+        const isFinished = await isSetupFinished()
+        if (!isFinished) {
+          router.replace('/install')
+          return
+        }
+        if (!((consoleToken && refreshToken) || (consoleTokenFromLocalStorage && refreshTokenFromLocalStorage))) {
+          router.replace('/signin')
+          return
+        }
+        if (searchParams.has('access_token') || searchParams.has('refresh_token')) {
+          consoleToken && localStorage.setItem('console_token', consoleToken)
+          refreshToken && localStorage.setItem('refresh_token', refreshToken)
+          router.replace(pathname)
+        }
+
+        setInit(true)
+      }
+      catch {
+        router.replace('/signin')
+      }
+    })()
+  }, [isSetupFinished, router, pathname, searchParams, consoleToken, refreshToken, consoleTokenFromLocalStorage, refreshTokenFromLocalStorage])
+
+  return init
+    ? (
+      <SWRConfig value={{
+        shouldRetryOnError: false,
+        revalidateOnFocus: false,
+      }}>
+        {children}
+      </SWRConfig>
+    )
+    : null
+}
+
+export default SwrInitor
diff --git a/app/components/tools/add-tool-modal/D.png b/app/components/tools/add-tool-modal/D.png
new file mode 100644
index 0000000..70b829c
--- /dev/null
+++ b/app/components/tools/add-tool-modal/D.png
Binary files differ
diff --git a/app/components/tools/add-tool-modal/category.tsx b/app/components/tools/add-tool-modal/category.tsx
new file mode 100644
index 0000000..bfad270
--- /dev/null
+++ b/app/components/tools/add-tool-modal/category.tsx
@@ -0,0 +1,69 @@
+'use client'
+import { useRef } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { useMount } from 'ahooks'
+import cn from '@/utils/classnames'
+import { Apps02 } from '@/app/components/base/icons/src/vender/line/others'
+import I18n from '@/context/i18n'
+import { getLanguage } from '@/i18n/language'
+import { useStore as useLabelStore } from '@/app/components/tools/labels/store'
+import { fetchLabelList } from '@/service/tools'
+
+type Props = {
+  value: string
+  onSelect: (type: string) => void
+}
+
+const Icon = ({ svgString, active }: { svgString: string; active: boolean }) => {
+  const svgRef = useRef<SVGSVGElement | null>(null)
+  const SVGParser = (svg: string) => {
+    if (!svg)
+      return null
+    const parser = new DOMParser()
+    const doc = parser.parseFromString(svg, 'image/svg+xml')
+    return doc.documentElement
+  }
+  useMount(() => {
+    const svgElement = SVGParser(svgString)
+    if (svgRef.current && svgElement)
+      svgRef.current.appendChild(svgElement)
+  })
+  return <svg className={cn('h-4 w-4 text-gray-700', active && '!text-primary-600')} ref={svgRef} />
+}
+
+const Category = ({
+  value,
+  onSelect,
+}: Props) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const language = getLanguage(locale)
+  const labelList = useLabelStore(s => s.labelList)
+  const setLabelList = useLabelStore(s => s.setLabelList)
+
+  useMount(() => {
+    fetchLabelList().then((res) => {
+      setLabelList(res)
+    })
+  })
+
+  return (
+    <div className='mb-3'>
+      <div className='px-3 py-0.5 text-xs font-medium leading-[18px] text-gray-500'>{t('tools.addToolModal.category').toLocaleUpperCase()}</div>
+      <div className={cn('mb-0.5 flex cursor-pointer items-center rounded-lg p-1 pl-3 text-sm leading-5 text-gray-700 hover:bg-white', value === '' && '!bg-white font-medium !text-primary-600')} onClick={() => onSelect('')}>
+        <Apps02 className='mr-2 h-4 w-4 shrink-0' />
+        {t('tools.type.all')}
+      </div>
+      {labelList.map(label => (
+        <div key={label.name} title={label.label[language]} className={cn('mb-0.5 flex cursor-pointer items-center overflow-hidden truncate rounded-lg p-1 pl-3 text-sm leading-5 text-gray-700 hover:bg-white', value === label.name && '!bg-white font-medium !text-primary-600')} onClick={() => onSelect(label.name)}>
+          <div className='mr-2 h-4 w-4 shrink-0'>
+            <Icon active={value === label.name} svgString={label.icon} />
+          </div>
+          {label.label[language]}
+        </div>
+      ))}
+    </div>
+  )
+}
+export default Category
diff --git a/app/components/tools/add-tool-modal/empty.png b/app/components/tools/add-tool-modal/empty.png
new file mode 100644
index 0000000..da4007e
--- /dev/null
+++ b/app/components/tools/add-tool-modal/empty.png
Binary files differ
diff --git a/app/components/tools/add-tool-modal/empty.tsx b/app/components/tools/add-tool-modal/empty.tsx
new file mode 100644
index 0000000..540d263
--- /dev/null
+++ b/app/components/tools/add-tool-modal/empty.tsx
@@ -0,0 +1,21 @@
+'use client'
+import { useSearchParams } from 'next/navigation'
+import { useTranslation } from 'react-i18next'
+const Empty = () => {
+  const { t } = useTranslation()
+  const searchParams = useSearchParams()
+
+  return (
+    <div className='flex flex-col items-center'>
+      <div className="h-[149px] w-[163px] shrink-0 bg-[url('~@/app/components/tools/add-tool-modal/empty.png')] bg-cover bg-no-repeat"></div>
+      <div className='mb-1 text-[13px] font-medium leading-[18px] text-text-primary'>
+        {t(`tools.addToolModal.${searchParams.get('category') === 'workflow' ? 'emptyTitle' : 'emptyTitleCustom'}`)}
+      </div>
+      <div className='text-[13px] leading-[18px] text-text-tertiary'>
+        {t(`tools.addToolModal.${searchParams.get('category') === 'workflow' ? 'emptyTip' : 'emptyTipCustom'}`)}
+      </div>
+    </div>
+  )
+}
+
+export default Empty
diff --git a/app/components/tools/add-tool-modal/index.tsx b/app/components/tools/add-tool-modal/index.tsx
new file mode 100644
index 0000000..c45313f
--- /dev/null
+++ b/app/components/tools/add-tool-modal/index.tsx
@@ -0,0 +1,257 @@
+'use client'
+import type { FC } from 'react'
+import React, { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import produce from 'immer'
+import {
+  RiAddLine,
+  RiCloseLine,
+} from '@remixicon/react'
+import { useMount } from 'ahooks'
+import type { Collection, CustomCollectionBackend, Tool } from '../types'
+import Type from './type'
+import Category from './category'
+import Tools from './tools'
+import cn from '@/utils/classnames'
+import { basePath } from '@/utils/var'
+import I18n from '@/context/i18n'
+import Drawer from '@/app/components/base/drawer'
+import Button from '@/app/components/base/button'
+import Loading from '@/app/components/base/loading'
+import Input from '@/app/components/base/input'
+import EditCustomToolModal from '@/app/components/tools/edit-custom-collection-modal'
+import ConfigCredential from '@/app/components/tools/setting/build-in/config-credentials'
+import {
+  createCustomCollection,
+  fetchAllBuiltInTools,
+  fetchAllCustomTools,
+  fetchAllWorkflowTools,
+  removeBuiltInToolCredential,
+  updateBuiltInToolCredential,
+} from '@/service/tools'
+import type { ToolWithProvider } from '@/app/components/workflow/types'
+import Toast from '@/app/components/base/toast'
+import ConfigContext from '@/context/debug-configuration'
+import type { ModelConfig } from '@/models/debug'
+
+type Props = {
+  onHide: () => void
+}
+// Add and Edit
+const AddToolModal: FC<Props> = ({
+  onHide,
+}) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const [currentType, setCurrentType] = useState('builtin')
+  const [currentCategory, setCurrentCategory] = useState('')
+  const [keywords, setKeywords] = useState<string>('')
+  const handleKeywordsChange = (value: string) => {
+    setKeywords(value)
+  }
+  const isMatchingKeywords = (text: string, keywords: string) => {
+    return text.toLowerCase().includes(keywords.toLowerCase())
+  }
+  const [toolList, setToolList] = useState<ToolWithProvider[]>([])
+  const [listLoading, setListLoading] = useState(true)
+  const getAllTools = async () => {
+    setListLoading(true)
+    const buildInTools = await fetchAllBuiltInTools()
+    if (basePath) {
+      buildInTools.forEach((item) => {
+        if (typeof item.icon == 'string' && !item.icon.includes(basePath))
+          item.icon = `${basePath}${item.icon}`
+      })
+    }
+    const customTools = await fetchAllCustomTools()
+    const workflowTools = await fetchAllWorkflowTools()
+    const mergedToolList = [
+      ...buildInTools,
+      ...customTools,
+      ...workflowTools.filter((toolWithProvider) => {
+        return !toolWithProvider.tools.some((tool) => {
+          return !!tool.parameters.find(item => item.name === '__image')
+        })
+      }),
+    ]
+    setToolList(mergedToolList)
+    setListLoading(false)
+  }
+  const filteredList = useMemo(() => {
+    return toolList.filter((toolWithProvider) => {
+      if (currentType === 'all')
+        return true
+      else
+        return toolWithProvider.type === currentType
+    }).filter((toolWithProvider) => {
+      if (!currentCategory)
+        return true
+      else
+        return toolWithProvider.labels.includes(currentCategory)
+    }).filter((toolWithProvider) => {
+      return (
+        isMatchingKeywords(toolWithProvider.name, keywords)
+        || toolWithProvider.tools.some((tool) => {
+          return Object.values(tool.label).some((label) => {
+            return isMatchingKeywords(label, keywords)
+          })
+        })
+      )
+    })
+  }, [currentType, currentCategory, toolList, keywords])
+
+  const {
+    modelConfig,
+    setModelConfig,
+  } = useContext(ConfigContext)
+
+  const [isShowEditCollectionToolModal, setIsShowEditCustomCollectionModal] = useState(false)
+  const doCreateCustomToolCollection = async (data: CustomCollectionBackend) => {
+    await createCustomCollection(data)
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+    setIsShowEditCustomCollectionModal(false)
+    getAllTools()
+  }
+  const [showSettingAuth, setShowSettingAuth] = useState(false)
+  const [collection, setCollection] = useState<Collection>()
+  const toolSelectHandle = (collection: Collection, tool: Tool) => {
+    const parameters: Record<string, string> = {}
+    if (tool.parameters) {
+      tool.parameters.forEach((item) => {
+        parameters[item.name] = ''
+      })
+    }
+
+    const nexModelConfig = produce(modelConfig, (draft: ModelConfig) => {
+      draft.agentConfig.tools.push({
+        provider_id: collection.id || collection.name,
+        provider_type: collection.type,
+        provider_name: collection.name,
+        tool_name: tool.name,
+        tool_label: tool.label[locale] || tool.label[locale.replaceAll('-', '_')],
+        tool_parameters: parameters,
+        enabled: true,
+      })
+    })
+    setModelConfig(nexModelConfig)
+  }
+  const authSelectHandle = (provider: Collection) => {
+    setCollection(provider)
+    setShowSettingAuth(true)
+  }
+  const updateBuiltinAuth = async (value: Record<string, any>) => {
+    if (!collection)
+      return
+    await updateBuiltInToolCredential(collection.name, value)
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+    await getAllTools()
+    setShowSettingAuth(false)
+  }
+  const removeBuiltinAuth = async () => {
+    if (!collection)
+      return
+    await removeBuiltInToolCredential(collection.name)
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+    await getAllTools()
+    setShowSettingAuth(false)
+  }
+
+  useMount(() => {
+    getAllTools()
+  })
+
+  return (
+    <>
+      <Drawer
+        isOpen
+        mask
+        clickOutsideNotOpen
+        onClose={onHide}
+        footer={null}
+        panelClassName={cn('mx-2 mb-3 mt-16 rounded-xl !p-0 sm:mr-2', 'mt-2 !w-[640px]', '!max-w-[640px]')}
+      >
+        <div
+          className='flex w-full rounded-xl border-[0.5px] border-gray-200 bg-white shadow-xl'
+          style={{
+            height: 'calc(100vh - 16px)',
+          }}
+        >
+          <div className='relative w-[200px] shrink-0 overflow-y-auto rounded-l-xl border-r-[0.5px] border-black/2 bg-gray-100 pb-3'>
+            <div className='sticky left-0 right-0 top-0'>
+              <div className='text-md sticky left-0 right-0 top-0 px-5 py-3 font-semibold text-gray-900'>{t('tools.addTool')}</div>
+              <div className='px-3 pb-4 pt-2'>
+                <Button variant='primary' className='w-[176px]' onClick={() => setIsShowEditCustomCollectionModal(true)}>
+                  <RiAddLine className='mr-1 h-4 w-4' />
+                  {t('tools.createCustomTool')}
+                </Button>
+              </div>
+            </div>
+            <div className='px-2 py-1'>
+              <Type value={currentType} onSelect={setCurrentType} />
+              <Category value={currentCategory} onSelect={setCurrentCategory} />
+            </div>
+          </div>
+          <div className='relative grow overflow-y-auto rounded-r-xl bg-white'>
+            <div className='sticky left-0 right-0 top-0 z-10 flex items-center gap-1 bg-white p-2'>
+              <div className='grow'>
+                <Input
+                  showLeftIcon
+                  showClearIcon
+                  value={keywords}
+                  onChange={e => handleKeywordsChange(e.target.value)}
+                  onClear={() => handleKeywordsChange('')}
+                />
+              </div>
+              <div className='ml-2 mr-1 h-4 w-[1px] bg-gray-200'></div>
+              <div className='cursor-pointer p-2' onClick={onHide}>
+                <RiCloseLine className='h-4 w-4 text-gray-500' />
+              </div>
+            </div>
+            {listLoading && (
+              <div className='flex h-[200px] items-center justify-center bg-white'>
+                <Loading />
+              </div>
+            )}
+            {!listLoading && (
+              <Tools
+                showWorkflowEmpty={currentType === 'workflow'}
+                tools={filteredList}
+                addedTools={(modelConfig?.agentConfig?.tools as any) || []}
+                onSelect={toolSelectHandle}
+                onAuthSetup={authSelectHandle}
+              />
+            )}
+          </div>
+        </div>
+      </Drawer>
+      {isShowEditCollectionToolModal && (
+        <EditCustomToolModal
+          positionLeft
+          payload={null}
+          onHide={() => setIsShowEditCustomCollectionModal(false)}
+          onAdd={doCreateCustomToolCollection}
+        />
+      )}
+      {showSettingAuth && collection && (
+        <ConfigCredential
+          collection={collection}
+          onCancel={() => setShowSettingAuth(false)}
+          onSaved={updateBuiltinAuth}
+          onRemove={removeBuiltinAuth}
+        />
+      )}
+    </>
+
+  )
+}
+export default React.memo(AddToolModal)
diff --git a/app/components/tools/add-tool-modal/tools.tsx b/app/components/tools/add-tool-modal/tools.tsx
new file mode 100644
index 0000000..4cf0fb7
--- /dev/null
+++ b/app/components/tools/add-tool-modal/tools.tsx
@@ -0,0 +1,150 @@
+import {
+  memo,
+  useCallback,
+} from 'react'
+import Link from 'next/link'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAddLine,
+} from '@remixicon/react'
+import cn from '@/utils/classnames'
+import { ArrowUpRight } from '@/app/components/base/icons/src/vender/line/arrows'
+import { Check } from '@/app/components/base/icons/src/vender/line/general'
+import { Tag01 } from '@/app/components/base/icons/src/vender/line/financeAndECommerce'
+import type { ToolWithProvider } from '@/app/components/workflow/types'
+import { BlockEnum } from '@/app/components/workflow/types'
+import BlockIcon from '@/app/components/workflow/block-icon'
+import Tooltip from '@/app/components/base/tooltip'
+import Button from '@/app/components/base/button'
+import { useGetLanguage } from '@/context/i18n'
+import { useStore as useLabelStore } from '@/app/components/tools/labels/store'
+import Empty from '@/app/components/tools/add-tool-modal/empty'
+import type { Tool } from '@/app/components/tools/types'
+import { CollectionType } from '@/app/components/tools/types'
+import type { AgentTool } from '@/types/app'
+import { MAX_TOOLS_NUM } from '@/config'
+
+type ToolsProps = {
+  showWorkflowEmpty: boolean
+  tools: ToolWithProvider[]
+  addedTools: AgentTool[]
+  onSelect: (provider: ToolWithProvider, tool: Tool) => void
+  onAuthSetup: (provider: ToolWithProvider) => void
+}
+const Blocks = ({
+  showWorkflowEmpty,
+  tools,
+  addedTools,
+  onSelect,
+  onAuthSetup,
+}: ToolsProps) => {
+  const { t } = useTranslation()
+  const language = useGetLanguage()
+  const labelList = useLabelStore(s => s.labelList)
+  const addable = addedTools.length < MAX_TOOLS_NUM
+
+  const renderGroup = useCallback((toolWithProvider: ToolWithProvider) => {
+    const list = toolWithProvider.tools
+    const needAuth = toolWithProvider.allow_delete && !toolWithProvider.is_team_authorization && toolWithProvider.type === CollectionType.builtIn
+
+    return (
+      <div
+        key={toolWithProvider.id}
+        className='group mb-1 last-of-type:mb-0'
+      >
+        <div className='flex h-[22px] w-full items-center justify-between pl-3 pr-1 text-xs font-medium text-gray-500'>
+          {toolWithProvider.label[language]}
+          <Link className='hidden cursor-pointer items-center group-hover:flex' href={`/tools?category=${toolWithProvider.type}`} target='_blank'>{t('tools.addToolModal.manageInTools')}<ArrowUpRight className='ml-0.5 h-3 w-3' /></Link>
+        </div>
+        {list.map((tool) => {
+          const labelContent = (() => {
+            if (!tool.labels)
+              return ''
+            return tool.labels.map((name) => {
+              const label = labelList.find(item => item.name === name)
+              return label?.label[language]
+            }).filter(Boolean).join(', ')
+          })()
+          const added = !!addedTools?.find(v => v.provider_id === toolWithProvider.id && v.provider_type === toolWithProvider.type && v.tool_name === tool.name)
+          return (
+            <Tooltip
+              key={tool.name}
+              position='bottom'
+              popupClassName='!p-0 !px-3 !py-2.5 !w-[210px] !leading-[18px] !text-xs !text-gray-700 !border-[0.5px] !border-black/5 !bg-transparent !rounded-xl !shadow-lg translate-x-[108px]'
+              popupContent={(
+                <div>
+                  <BlockIcon
+                    size='md'
+                    className='mb-2'
+                    type={BlockEnum.Tool}
+                    toolIcon={toolWithProvider.icon}
+                  />
+                  <div className='mb-1 text-sm leading-5 text-gray-900'>{tool.label[language]}</div>
+                  <div className='text-xs leading-[18px] text-gray-700'>{tool.description[language]}</div>
+                  {tool.labels?.length > 0 && (
+                    <div className='mt-1 flex shrink-0 items-center'>
+                      <div className='relative flex w-full items-center gap-1 rounded-md py-1 text-gray-500' title={labelContent}>
+                        <Tag01 className='h-3 w-3 shrink-0 text-gray-500' />
+                        <div className='grow truncate text-start text-xs font-normal leading-[18px]'>{labelContent}</div>
+                      </div>
+                    </div>
+                  )}
+                </div>
+              )}
+            >
+              <div className='group/item flex h-8 w-full cursor-pointer items-center rounded-lg pl-3 pr-1 hover:bg-gray-50'>
+                <BlockIcon
+                  className={cn('mr-2 shrink-0', needAuth && 'opacity-30')}
+                  type={BlockEnum.Tool}
+                  toolIcon={toolWithProvider.icon}
+                />
+                <div className={cn('grow truncate text-sm text-gray-900', needAuth && 'opacity-30')}>{tool.label[language]}</div>
+                {!needAuth && added && (
+                  <div className='flex items-center gap-1 rounded-[6px] border border-gray-100 bg-white px-2 py-[3px] text-xs font-medium leading-[18px] text-gray-300'>
+                    <Check className='h-3 w-3' />
+                    {t('tools.addToolModal.added').toLocaleUpperCase()}
+                  </div>
+                )}
+                {!needAuth && !added && addable && (
+                  <Button
+                    variant='secondary-accent'
+                    size='small'
+                    className={cn('hidden shrink-0 items-center group-hover/item:flex')}
+                    onClick={() => onSelect(toolWithProvider, tool)}
+                  >
+                    <RiAddLine className='h-3 w-3' />
+                    {t('tools.addToolModal.add').toLocaleUpperCase()}
+                  </Button>
+                )}
+                {needAuth && (
+                  <Button
+                    variant='secondary-accent'
+                    size='small'
+                    className={cn('hidden shrink-0 group-hover/item:flex')}
+                    onClick={() => onAuthSetup(toolWithProvider)}
+                  >{t('tools.auth.setup')}</Button>
+                )}
+              </div>
+            </Tooltip>
+          )
+        })}
+      </div>
+    )
+  }, [addable, language, t, labelList, addedTools, onAuthSetup, onSelect])
+
+  return (
+    <div className='max-w-[440px] p-1 pb-6'>
+      {!tools.length && !showWorkflowEmpty && (
+        <div className='flex h-[22px] items-center px-3 text-xs font-medium text-gray-500'>{t('workflow.tabs.noResult')}</div>
+      )}
+      {!tools.length && showWorkflowEmpty && (
+        <div className='pt-[280px]'>
+          <Empty />
+        </div>
+      )}
+      {!!tools.length && tools.map(renderGroup)}
+    </div>
+  )
+}
+
+export default memo(Blocks)
diff --git a/app/components/tools/add-tool-modal/type.tsx b/app/components/tools/add-tool-modal/type.tsx
new file mode 100644
index 0000000..26e78a7
--- /dev/null
+++ b/app/components/tools/add-tool-modal/type.tsx
@@ -0,0 +1,34 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+import { Exchange02, FileCode } from '@/app/components/base/icons/src/vender/line/others'
+
+type Props = {
+  value: string
+  onSelect: (type: string) => void
+}
+
+const Types = ({
+  value,
+  onSelect,
+}: Props) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='mb-3'>
+      <div className={cn('mb-0.5 flex cursor-pointer items-center rounded-lg p-1 pl-3 text-sm leading-5 hover:bg-white', value === 'builtin' && '!bg-white font-medium')} onClick={() => onSelect('builtin')}>
+        <div className="mr-2 h-4 w-4 shrink-0 bg-[url('~@/app/components/tools/add-tool-modal/D.png')] bg-cover bg-no-repeat" />
+        <span className={cn('text-gray-700', value === 'builtin' && '!text-primary-600')}>{t('tools.type.builtIn')}</span>
+      </div>
+      <div className={cn('mb-0.5 flex cursor-pointer items-center rounded-lg p-1 pl-3 text-sm leading-5 text-gray-700 hover:bg-white', value === 'api' && '!bg-white font-medium !text-primary-600')} onClick={() => onSelect('api')}>
+        <FileCode className='mr-2 h-4 w-4 shrink-0' />
+        {t('tools.type.custom')}
+      </div>
+      <div className={cn('mb-0.5 flex cursor-pointer items-center rounded-lg p-1 pl-3 text-sm leading-5 text-gray-700 hover:bg-white', value === 'workflow' && '!bg-white font-medium !text-primary-600')} onClick={() => onSelect('workflow')}>
+        <Exchange02 className='mr-2 h-4 w-4 shrink-0' />
+        {t('tools.type.workflow')}
+      </div>
+    </div>
+  )
+}
+export default Types
diff --git a/app/components/tools/edit-custom-collection-modal/config-credentials.tsx b/app/components/tools/edit-custom-collection-modal/config-credentials.tsx
new file mode 100644
index 0000000..cbf1048
--- /dev/null
+++ b/app/components/tools/edit-custom-collection-modal/config-credentials.tsx
@@ -0,0 +1,154 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import Tooltip from '@/app/components/base/tooltip'
+import cn from '@/utils/classnames'
+import type { Credential } from '@/app/components/tools/types'
+import Input from '@/app/components/base/input'
+import Drawer from '@/app/components/base/drawer-plus'
+import Button from '@/app/components/base/button'
+import Radio from '@/app/components/base/radio/ui'
+import { AuthHeaderPrefix, AuthType } from '@/app/components/tools/types'
+
+type Props = {
+  positionCenter?: boolean
+  credential: Credential
+  onChange: (credential: Credential) => void
+  onHide: () => void
+}
+
+type ItemProps = {
+  text: string
+  value: AuthType | AuthHeaderPrefix
+  isChecked: boolean
+  onClick: (value: AuthType | AuthHeaderPrefix) => void
+}
+
+const SelectItem: FC<ItemProps> = ({ text, value, isChecked, onClick }) => {
+  return (
+    <div
+      className={cn(isChecked ? 'border-[2px] border-util-colors-indigo-indigo-600 bg-components-panel-on-panel-item-bg shadow-sm' : 'border border-components-card-border', 'mb-2 flex h-9 w-[150px] cursor-pointer items-center space-x-2 rounded-xl bg-components-panel-on-panel-item-bg pl-3 hover:bg-components-panel-on-panel-item-bg-hover')}
+      onClick={() => onClick(value)}
+    >
+      <Radio isChecked={isChecked} />
+      <div className='system-sm-regular text-text-primary'>{text}</div>
+    </div>
+  )
+}
+
+const ConfigCredential: FC<Props> = ({
+  positionCenter,
+  credential,
+  onChange,
+  onHide,
+}) => {
+  const { t } = useTranslation()
+  const [tempCredential, setTempCredential] = React.useState<Credential>(credential)
+
+  return (
+    <Drawer
+      isShow
+      positionCenter={positionCenter}
+      onHide={onHide}
+      title={t('tools.createTool.authMethod.title')!}
+      dialogClassName='z-[60]'
+      dialogBackdropClassName='z-[70]'
+      panelClassName='mt-2 !w-[520px] h-fit z-[80]'
+      maxWidthClassName='!max-w-[520px]'
+      height={'fit-content'}
+      headerClassName='!border-b-divider-regular'
+      body={
+        <div className='px-6 pt-2'>
+          <div className='space-y-4'>
+            <div>
+              <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.authMethod.type')}</div>
+              <div className='flex space-x-3'>
+                <SelectItem
+                  text={t('tools.createTool.authMethod.types.none')}
+                  value={AuthType.none}
+                  isChecked={tempCredential.auth_type === AuthType.none}
+                  onClick={value => setTempCredential({ ...tempCredential, auth_type: value as AuthType })}
+                />
+                <SelectItem
+                  text={t('tools.createTool.authMethod.types.api_key')}
+                  value={AuthType.apiKey}
+                  isChecked={tempCredential.auth_type === AuthType.apiKey}
+                  onClick={value => setTempCredential({
+                    ...tempCredential,
+                    auth_type: value as AuthType,
+                    api_key_header: tempCredential.api_key_header || 'Authorization',
+                    api_key_value: tempCredential.api_key_value || '',
+                    api_key_header_prefix: tempCredential.api_key_header_prefix || AuthHeaderPrefix.custom,
+                  })}
+                />
+              </div>
+            </div>
+            {tempCredential.auth_type === AuthType.apiKey && (
+              <>
+                <div>
+                  <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.authHeaderPrefix.title')}</div>
+                  <div className='flex space-x-3'>
+                    <SelectItem
+                      text={t('tools.createTool.authHeaderPrefix.types.basic')}
+                      value={AuthHeaderPrefix.basic}
+                      isChecked={tempCredential.api_key_header_prefix === AuthHeaderPrefix.basic}
+                      onClick={value => setTempCredential({ ...tempCredential, api_key_header_prefix: value as AuthHeaderPrefix })}
+                    />
+                    <SelectItem
+                      text={t('tools.createTool.authHeaderPrefix.types.bearer')}
+                      value={AuthHeaderPrefix.bearer}
+                      isChecked={tempCredential.api_key_header_prefix === AuthHeaderPrefix.bearer}
+                      onClick={value => setTempCredential({ ...tempCredential, api_key_header_prefix: value as AuthHeaderPrefix })}
+                    />
+                    <SelectItem
+                      text={t('tools.createTool.authHeaderPrefix.types.custom')}
+                      value={AuthHeaderPrefix.custom}
+                      isChecked={tempCredential.api_key_header_prefix === AuthHeaderPrefix.custom}
+                      onClick={value => setTempCredential({ ...tempCredential, api_key_header_prefix: value as AuthHeaderPrefix })}
+                    />
+                  </div>
+                </div>
+                <div>
+                  <div className='system-sm-medium flex items-center py-2 text-text-primary'>
+                    {t('tools.createTool.authMethod.key')}
+                    <Tooltip
+                      popupContent={
+                        <div className='w-[261px] text-text-tertiary'>
+                          {t('tools.createTool.authMethod.keyTooltip')}
+                        </div>
+                      }
+                      triggerClassName='ml-0.5 w-4 h-4'
+                    />
+                  </div>
+                  <Input
+                    value={tempCredential.api_key_header}
+                    onChange={e => setTempCredential({ ...tempCredential, api_key_header: e.target.value })}
+                    placeholder={t('tools.createTool.authMethod.types.apiKeyPlaceholder')!}
+                  />
+                </div>
+                <div>
+                  <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.authMethod.value')}</div>
+                  <Input
+                    value={tempCredential.api_key_value}
+                    onChange={e => setTempCredential({ ...tempCredential, api_key_value: e.target.value })}
+                    placeholder={t('tools.createTool.authMethod.types.apiValuePlaceholder')!}
+                  />
+                </div>
+              </>)}
+
+          </div>
+
+          <div className='mt-4 flex shrink-0 justify-end space-x-2 py-4'>
+            <Button onClick={onHide}>{t('common.operation.cancel')}</Button>
+            <Button variant='primary' onClick={() => {
+              onChange(tempCredential)
+              onHide()
+            }}>{t('common.operation.save')}</Button>
+          </div>
+        </div>
+      }
+    />
+  )
+}
+export default React.memo(ConfigCredential)
diff --git a/app/components/tools/edit-custom-collection-modal/examples.ts b/app/components/tools/edit-custom-collection-modal/examples.ts
new file mode 100644
index 0000000..0d8369c
--- /dev/null
+++ b/app/components/tools/edit-custom-collection-modal/examples.ts
@@ -0,0 +1,181 @@
+const examples = [
+  {
+    key: 'json',
+    content: `{
+      "openapi": "3.1.0",
+      "info": {
+        "title": "Get weather data",
+        "description": "Retrieves current weather data for a location.",
+        "version": "v1.0.0"
+      },
+      "servers": [
+        {
+          "url": "https://weather.example.com"
+        }
+      ],
+      "paths": {
+        "/location": {
+          "get": {
+            "description": "Get temperature for a specific location",
+            "operationId": "GetCurrentWeather",
+            "parameters": [
+              {
+                "name": "location",
+                "in": "query",
+                "description": "The city and state to retrieve the weather for",
+                "required": true,
+                "schema": {
+                  "type": "string"
+                }
+              }
+            ],
+            "deprecated": false
+          }
+        }
+      },
+      "components": {
+        "schemas": {}
+      }
+    }`,
+  },
+  {
+    key: 'yaml',
+    content: `# Taken from https://github.com/OAI/OpenAPI-Specification/blob/main/examples/v3.0/petstore.yaml
+
+    openapi: "3.0.0"
+    info:
+      version: 1.0.0
+      title: Swagger Petstore
+      license:
+        name: MIT
+    servers:
+      - url: https://petstore.swagger.io/v1
+    paths:
+      /pets:
+        get:
+          summary: List all pets
+          operationId: listPets
+          tags:
+            - pets
+          parameters:
+            - name: limit
+              in: query
+              description: How many items to return at one time (max 100)
+              required: false
+              schema:
+                type: integer
+                maximum: 100
+                format: int32
+          responses:
+            '200':
+              description: A paged array of pets
+              headers:
+                x-next:
+                  description: A link to the next page of responses
+                  schema:
+                    type: string
+              content:
+                application/json:
+                  schema:
+                    $ref: "#/components/schemas/Pets"
+            default:
+              description: unexpected error
+              content:
+                application/json:
+                  schema:
+                    $ref: "#/components/schemas/Error"
+        post:
+          summary: Create a pet
+          operationId: createPets
+          tags:
+            - pets
+          responses:
+            '201':
+              description: Null response
+            default:
+              description: unexpected error
+              content:
+                application/json:
+                  schema:
+                    $ref: "#/components/schemas/Error"
+      /pets/{petId}:
+        get:
+          summary: Info for a specific pet
+          operationId: showPetById
+          tags:
+            - pets
+          parameters:
+            - name: petId
+              in: path
+              required: true
+              description: The id of the pet to retrieve
+              schema:
+                type: string
+          responses:
+            '200':
+              description: Expected response to a valid request
+              content:
+                application/json:
+                  schema:
+                    $ref: "#/components/schemas/Pet"
+            default:
+              description: unexpected error
+              content:
+                application/json:
+                  schema:
+                    $ref: "#/components/schemas/Error"
+    components:
+      schemas:
+        Pet:
+          type: object
+          required:
+            - id
+            - name
+          properties:
+            id:
+              type: integer
+              format: int64
+            name:
+              type: string
+            tag:
+              type: string
+        Pets:
+          type: array
+          maxItems: 100
+          items:
+            $ref: "#/components/schemas/Pet"
+        Error:
+          type: object
+          required:
+            - code
+            - message
+          properties:
+            code:
+              type: integer
+              format: int32
+            message:
+              type: string`,
+  },
+  {
+    key: 'blankTemplate',
+    content: `{
+      "openapi": "3.1.0",
+      "info": {
+        "title": "Untitled",
+        "description": "Your OpenAPI specification",
+        "version": "v1.0.0"
+      },
+      "servers": [
+        {
+          "url": ""
+        }
+      ],
+      "paths": {},
+      "components": {
+        "schemas": {}
+      }
+    }`,
+  },
+]
+
+export default examples
diff --git a/app/components/tools/edit-custom-collection-modal/get-schema.tsx b/app/components/tools/edit-custom-collection-modal/get-schema.tsx
new file mode 100644
index 0000000..1d67dc7
--- /dev/null
+++ b/app/components/tools/edit-custom-collection-modal/get-schema.tsx
@@ -0,0 +1,123 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useClickAway } from 'ahooks'
+import {
+  RiAddLine,
+  RiArrowDownSLine,
+} from '@remixicon/react'
+import Toast from '../../base/toast'
+import examples from './examples'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import { importSchemaFromURL } from '@/service/tools'
+
+type Props = {
+  onChange: (value: string) => void
+}
+
+const GetSchema: FC<Props> = ({
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const [showImportFromUrl, setShowImportFromUrl] = useState(false)
+  const [importUrl, setImportUrl] = useState('')
+  const [isParsing, setIsParsing] = useState(false)
+  const handleImportFromUrl = async () => {
+    if (!importUrl.startsWith('http://') && !importUrl.startsWith('https://')) {
+      Toast.notify({
+        type: 'error',
+        message: t('tools.createTool.urlError'),
+      })
+      return
+    }
+    setIsParsing(true)
+    try {
+      const { schema } = await importSchemaFromURL(importUrl) as any
+      setImportUrl('')
+      onChange(schema)
+    }
+    finally {
+      setIsParsing(false)
+      setShowImportFromUrl(false)
+    }
+  }
+
+  const importURLRef = React.useRef(null)
+  useClickAway(() => {
+    setShowImportFromUrl(false)
+  }, importURLRef)
+
+  const [showExamples, setShowExamples] = useState(false)
+  const showExamplesRef = React.useRef(null)
+  useClickAway(() => {
+    setShowExamples(false)
+  }, showExamplesRef)
+
+  return (
+    <div className='relative flex w-[224px] justify-end space-x-1'>
+      <div ref={importURLRef}>
+        <Button
+          size='small'
+          className='space-x-1 '
+          onClick={() => { setShowImportFromUrl(!showImportFromUrl) }}
+        >
+          <RiAddLine className='h-3 w-3' />
+          <div className='system-xs-medium text-text-secondary'>{t('tools.createTool.importFromUrl')}</div>
+        </Button>
+        {showImportFromUrl && (
+          <div className=' absolute left-[-35px] top-[26px] rounded-lg border border-components-panel-border bg-components-panel-bg p-2 shadow-lg'>
+            <div className='relative'>
+              <Input
+                type='text'
+                className='w-[244px]'
+                placeholder={t('tools.createTool.importFromUrlPlaceHolder')!}
+                value={importUrl}
+                onChange={e => setImportUrl(e.target.value)}
+              />
+              <Button
+                className='absolute right-1 top-1'
+                size='small'
+                variant='primary'
+                disabled={!importUrl}
+                onClick={handleImportFromUrl}
+                loading={isParsing}
+              >
+                {isParsing ? '' : t('common.operation.ok')}
+              </Button>
+            </div>
+          </div>
+        )}
+      </div>
+      <div className='relative -mt-0.5' ref={showExamplesRef}>
+        <Button
+          size='small'
+          className='space-x-1'
+          onClick={() => { setShowExamples(!showExamples) }}
+        >
+          <div className='system-xs-medium text-text-secondary'>{t('tools.createTool.examples')}</div>
+          <RiArrowDownSLine className='h-3 w-3' />
+        </Button>
+        {showExamples && (
+          <div className='absolute right-0 top-7 rounded-lg bg-components-panel-bg p-1 shadow-sm'>
+            {examples.map(item => (
+              <div
+                key={item.key}
+                onClick={() => {
+                  onChange(item.content)
+                  setShowExamples(false)
+                }}
+                className='system-sm-regular cursor-pointer whitespace-nowrap rounded-lg px-3 py-1.5 leading-5 text-text-secondary hover:bg-components-panel-on-panel-item-bg-hover'
+              >
+                {t(`tools.createTool.exampleOptions.${item.key}`)}
+              </div>
+            ))}
+          </div>
+        )}
+
+      </div>
+    </div>
+  )
+}
+export default React.memo(GetSchema)
diff --git a/app/components/tools/edit-custom-collection-modal/index.tsx b/app/components/tools/edit-custom-collection-modal/index.tsx
new file mode 100644
index 0000000..b9a29ef
--- /dev/null
+++ b/app/components/tools/edit-custom-collection-modal/index.tsx
@@ -0,0 +1,366 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useDebounce, useGetState } from 'ahooks'
+import { RiSettings2Line } from '@remixicon/react'
+import produce from 'immer'
+import { LinkExternal02 } from '../../base/icons/src/vender/line/general'
+import type { Credential, CustomCollectionBackend, CustomParamSchema, Emoji } from '../types'
+import { AuthHeaderPrefix, AuthType } from '../types'
+import GetSchema from './get-schema'
+import ConfigCredentials from './config-credentials'
+import TestApi from './test-api'
+import cn from '@/utils/classnames'
+import Drawer from '@/app/components/base/drawer-plus'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import EmojiPicker from '@/app/components/base/emoji-picker'
+import AppIcon from '@/app/components/base/app-icon'
+import { parseParamsSchema } from '@/service/tools'
+import LabelSelector from '@/app/components/tools/labels/selector'
+import Toast from '@/app/components/base/toast'
+
+type Props = {
+  positionLeft?: boolean
+  payload: any
+  onHide: () => void
+  onAdd?: (payload: CustomCollectionBackend) => void
+  onRemove?: () => void
+  onEdit?: (payload: CustomCollectionBackend) => void
+}
+// Add and Edit
+const EditCustomCollectionModal: FC<Props> = ({
+  positionLeft,
+  payload,
+  onHide,
+  onAdd,
+  onEdit,
+  onRemove,
+}) => {
+  const { t } = useTranslation()
+  const isAdd = !payload
+  const isEdit = !!payload
+
+  const [editFirst, setEditFirst] = useState(!isAdd)
+  const [paramsSchemas, setParamsSchemas] = useState<CustomParamSchema[]>(payload?.tools || [])
+  const [customCollection, setCustomCollection, getCustomCollection] = useGetState<CustomCollectionBackend>(isAdd
+    ? {
+      provider: '',
+      credentials: {
+        auth_type: AuthType.none,
+        api_key_header: 'Authorization',
+        api_key_header_prefix: AuthHeaderPrefix.basic,
+      },
+      icon: {
+        content: '馃暤锔�',
+        background: '#FEF7C3',
+      },
+      schema_type: '',
+      schema: '',
+    }
+    : payload)
+
+  const originalProvider = isEdit ? payload.provider : ''
+
+  const [showEmojiPicker, setShowEmojiPicker] = useState(false)
+  const emoji = customCollection.icon
+  const setEmoji = (emoji: Emoji) => {
+    const newCollection = produce(customCollection, (draft) => {
+      draft.icon = emoji
+    })
+    setCustomCollection(newCollection)
+  }
+  const schema = customCollection.schema
+  const debouncedSchema = useDebounce(schema, { wait: 500 })
+  const setSchema = (schema: any) => {
+    const newCollection = produce(customCollection, (draft) => {
+      draft.schema = schema
+    })
+    setCustomCollection(newCollection)
+  }
+
+  useEffect(() => {
+    if (!debouncedSchema)
+      return
+    if (isEdit && editFirst) {
+      setEditFirst(false)
+      return
+    }
+    (async () => {
+      try {
+        const { parameters_schema, schema_type } = await parseParamsSchema(debouncedSchema)
+        const customCollection = getCustomCollection()
+        const newCollection = produce(customCollection, (draft) => {
+          draft.schema_type = schema_type
+        })
+        setCustomCollection(newCollection)
+        setParamsSchemas(parameters_schema)
+      }
+      catch {
+        const customCollection = getCustomCollection()
+        const newCollection = produce(customCollection, (draft) => {
+          draft.schema_type = ''
+        })
+        setCustomCollection(newCollection)
+        setParamsSchemas([])
+      }
+    })()
+  }, [debouncedSchema])
+
+  const [credentialsModalShow, setCredentialsModalShow] = useState(false)
+  const credential = customCollection.credentials
+  const setCredential = (credential: Credential) => {
+    const newCollection = produce(customCollection, (draft) => {
+      draft.credentials = credential
+    })
+    setCustomCollection(newCollection)
+  }
+
+  const [currTool, setCurrTool] = useState<CustomParamSchema | null>(null)
+  const [isShowTestApi, setIsShowTestApi] = useState(false)
+
+  const [labels, setLabels] = useState<string[]>(payload?.labels || [])
+  const handleLabelSelect = (value: string[]) => {
+    setLabels(value)
+  }
+
+  const handleSave = () => {
+    // const postData = clone(customCollection)
+    const postData = produce(customCollection, (draft) => {
+      delete draft.tools
+
+      if (draft.credentials.auth_type === AuthType.none) {
+        delete draft.credentials.api_key_header
+        delete draft.credentials.api_key_header_prefix
+        delete draft.credentials.api_key_value
+      }
+
+      draft.labels = labels
+    })
+
+    let errorMessage = ''
+    if (!postData.provider)
+      errorMessage = t('common.errorMsg.fieldRequired', { field: t('tools.createTool.name') })
+
+    if (!postData.schema)
+      errorMessage = t('common.errorMsg.fieldRequired', { field: t('tools.createTool.schema') })
+
+    if (errorMessage) {
+      Toast.notify({
+        type: 'error',
+        message: errorMessage,
+      })
+      return
+    }
+
+    if (isAdd) {
+      onAdd?.(postData)
+      return
+    }
+
+    onEdit?.({
+      ...postData,
+      original_provider: originalProvider,
+    })
+  }
+
+  const getPath = (url: string) => {
+    if (!url)
+      return ''
+
+    try {
+      const path = decodeURI(new URL(url).pathname)
+      return path || ''
+    }
+    catch {
+      return url
+    }
+  }
+
+  return (
+    <>
+      <Drawer
+        isShow
+        positionCenter={isAdd && !positionLeft}
+        onHide={onHide}
+        title={t(`tools.createTool.${isAdd ? 'title' : 'editTitle'}`)!}
+        panelClassName='mt-2 !w-[640px]'
+        maxWidthClassName='!max-w-[640px]'
+        height='calc(100vh - 16px)'
+        headerClassName='!border-b-divider-regular'
+        body={
+          <div className='flex h-full flex-col'>
+            <div className='h-0 grow space-y-4 overflow-y-auto px-6 py-3'>
+              <div>
+                <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.name')} <span className='ml-1 text-red-500'>*</span></div>
+                <div className='flex items-center justify-between gap-3'>
+                  <AppIcon size='large' onClick={() => { setShowEmojiPicker(true) }} className='cursor-pointer' icon={emoji.content} background={emoji.background} />
+                  <Input
+                    className='h-10 grow' placeholder={t('tools.createTool.toolNamePlaceHolder')!}
+                    value={customCollection.provider}
+                    onChange={(e) => {
+                      const newCollection = produce(customCollection, (draft) => {
+                        draft.provider = e.target.value
+                      })
+                      setCustomCollection(newCollection)
+                    }}
+                  />
+                </div>
+              </div>
+
+              {/* Schema */}
+              <div className='select-none'>
+                <div className='flex items-center justify-between'>
+                  <div className='flex items-center'>
+                    <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.schema')}<span className='ml-1 text-red-500'>*</span></div>
+                    <div className='mx-2 h-3 w-px bg-divider-regular'></div>
+                    <a
+                      href="https://swagger.io/specification/"
+                      target='_blank' rel='noopener noreferrer'
+                      className='flex h-[18px] items-center space-x-1  text-text-accent'
+                    >
+                      <div className='text-xs font-normal'>{t('tools.createTool.viewSchemaSpec')}</div>
+                      <LinkExternal02 className='h-3 w-3' />
+                    </a>
+                  </div>
+                  <GetSchema onChange={setSchema} />
+
+                </div>
+                <Textarea
+                  className='h-[240px] resize-none'
+                  value={schema}
+                  onChange={e => setSchema(e.target.value)}
+                  placeholder={t('tools.createTool.schemaPlaceHolder')!}
+                />
+              </div>
+
+              {/* Available Tools  */}
+              <div>
+                <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.availableTools.title')}</div>
+                <div className='w-full overflow-x-auto rounded-lg border border-divider-regular'>
+                  <table className='system-xs-regular w-full text-text-secondary'>
+                    <thead className='uppercase text-text-tertiary'>
+                      <tr className={cn(paramsSchemas.length > 0 && 'border-b', 'border-divider-regular')}>
+                        <th className="p-2 pl-3 font-medium">{t('tools.createTool.availableTools.name')}</th>
+                        <th className="w-[236px] p-2 pl-3 font-medium">{t('tools.createTool.availableTools.description')}</th>
+                        <th className="p-2 pl-3 font-medium">{t('tools.createTool.availableTools.method')}</th>
+                        <th className="p-2 pl-3 font-medium">{t('tools.createTool.availableTools.path')}</th>
+                        <th className="w-[54px] p-2 pl-3 font-medium">{t('tools.createTool.availableTools.action')}</th>
+                      </tr>
+                    </thead>
+                    <tbody>
+                      {paramsSchemas.map((item, index) => (
+                        <tr key={index} className='border-b border-divider-regular last:border-0'>
+                          <td className="p-2 pl-3">{item.operation_id}</td>
+                          <td className="w-[236px] p-2 pl-3">{item.summary}</td>
+                          <td className="p-2 pl-3">{item.method}</td>
+                          <td className="p-2 pl-3">{getPath(item.server_url)}</td>
+                          <td className="w-[62px] p-2 pl-3">
+                            <Button
+                              size='small'
+                              onClick={() => {
+                                setCurrTool(item)
+                                setIsShowTestApi(true)
+                              }}
+                            >
+                              {t('tools.createTool.availableTools.test')}
+                            </Button>
+                          </td>
+                        </tr>
+                      ))}
+                    </tbody>
+                  </table>
+                </div>
+              </div>
+
+              {/* Authorization method */}
+              <div>
+                <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.authMethod.title')}</div>
+                <div className='flex h-9 cursor-pointer items-center justify-between rounded-lg bg-components-input-bg-normal px-2.5' onClick={() => setCredentialsModalShow(true)}>
+                  <div className='system-xs-regular text-text-primary'>{t(`tools.createTool.authMethod.types.${credential.auth_type}`)}</div>
+                  <RiSettings2Line className='h-4 w-4 text-text-secondary' />
+                </div>
+              </div>
+
+              {/* Labels */}
+              <div>
+                <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.toolInput.label')}</div>
+                <LabelSelector value={labels} onChange={handleLabelSelect} />
+              </div>
+
+              {/* Privacy Policy */}
+              <div>
+                <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.privacyPolicy')}</div>
+                <Input
+                  value={customCollection.privacy_policy}
+                  onChange={(e) => {
+                    const newCollection = produce(customCollection, (draft) => {
+                      draft.privacy_policy = e.target.value
+                    })
+                    setCustomCollection(newCollection)
+                  }}
+                  className='h-10 grow' placeholder={t('tools.createTool.privacyPolicyPlaceholder') || ''} />
+              </div>
+
+              <div>
+                <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.customDisclaimer')}</div>
+                <Input
+                  value={customCollection.custom_disclaimer}
+                  onChange={(e) => {
+                    const newCollection = produce(customCollection, (draft) => {
+                      draft.custom_disclaimer = e.target.value
+                    })
+                    setCustomCollection(newCollection)
+                  }}
+                  className='h-10 grow' placeholder={t('tools.createTool.customDisclaimerPlaceholder') || ''} />
+              </div>
+
+            </div>
+            <div className={cn(isEdit ? 'justify-between' : 'justify-end', 'mt-2 flex shrink-0 rounded-b-[10px] border-t border-divider-regular bg-background-section-burn px-6 py-4')} >
+              {
+                isEdit && (
+                  <Button variant='warning' onClick={onRemove}>{t('common.operation.delete')}</Button>
+                )
+              }
+              <div className='flex space-x-2 '>
+                <Button onClick={onHide}>{t('common.operation.cancel')}</Button>
+                <Button variant='primary' onClick={handleSave}>{t('common.operation.save')}</Button>
+              </div>
+            </div>
+            {showEmojiPicker && <EmojiPicker
+              onSelect={(icon, icon_background) => {
+                setEmoji({ content: icon, background: icon_background })
+                setShowEmojiPicker(false)
+              }}
+              onClose={() => {
+                setShowEmojiPicker(false)
+              }}
+            />}
+            {credentialsModalShow && (
+              <ConfigCredentials
+                positionCenter={isAdd}
+                credential={credential}
+                onChange={setCredential}
+                onHide={() => setCredentialsModalShow(false)}
+              />)
+            }
+            {isShowTestApi && (
+              <TestApi
+                positionCenter={isAdd}
+                tool={currTool as CustomParamSchema}
+                customCollection={customCollection}
+                onHide={() => setIsShowTestApi(false)}
+              />
+            )}
+          </div>
+        }
+        isShowMask={true}
+        clickOutsideNotOpen={true}
+      />
+    </>
+
+  )
+}
+export default React.memo(EditCustomCollectionModal)
diff --git a/app/components/tools/edit-custom-collection-modal/modal.tsx b/app/components/tools/edit-custom-collection-modal/modal.tsx
new file mode 100644
index 0000000..190c727
--- /dev/null
+++ b/app/components/tools/edit-custom-collection-modal/modal.tsx
@@ -0,0 +1,360 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useDebounce, useGetState } from 'ahooks'
+import produce from 'immer'
+import { LinkExternal02, Settings01 } from '../../base/icons/src/vender/line/general'
+import type { Credential, CustomCollectionBackend, CustomParamSchema, Emoji } from '../types'
+import { AuthHeaderPrefix, AuthType } from '../types'
+import GetSchema from './get-schema'
+import ConfigCredentials from './config-credentials'
+import TestApi from './test-api'
+import cn from '@/utils/classnames'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import EmojiPicker from '@/app/components/base/emoji-picker'
+import AppIcon from '@/app/components/base/app-icon'
+import { parseParamsSchema } from '@/service/tools'
+import LabelSelector from '@/app/components/tools/labels/selector'
+import Toast from '@/app/components/base/toast'
+import Modal from '../../base/modal'
+import Button from '@/app/components/base/button'
+
+type Props = {
+  positionLeft?: boolean
+  payload: any
+  onHide: () => void
+  onAdd?: (payload: CustomCollectionBackend) => void
+  onRemove?: () => void
+  onEdit?: (payload: CustomCollectionBackend) => void
+}
+// Add and Edit
+const EditCustomCollectionModal: FC<Props> = ({
+  payload,
+  onHide,
+  onAdd,
+  onEdit,
+  onRemove,
+}) => {
+  const { t } = useTranslation()
+  const isAdd = !payload
+  const isEdit = !!payload
+
+  const [editFirst, setEditFirst] = useState(!isAdd)
+  const [paramsSchemas, setParamsSchemas] = useState<CustomParamSchema[]>(payload?.tools || [])
+  const [customCollection, setCustomCollection, getCustomCollection] = useGetState<CustomCollectionBackend>(isAdd
+    ? {
+      provider: '',
+      credentials: {
+        auth_type: AuthType.none,
+        api_key_header: 'Authorization',
+        api_key_header_prefix: AuthHeaderPrefix.basic,
+      },
+      icon: {
+        content: '馃暤锔�',
+        background: '#FEF7C3',
+      },
+      schema_type: '',
+      schema: '',
+    }
+    : payload)
+
+  const originalProvider = isEdit ? payload.provider : ''
+
+  const [showEmojiPicker, setShowEmojiPicker] = useState(false)
+  const emoji = customCollection.icon
+  const setEmoji = (emoji: Emoji) => {
+    const newCollection = produce(customCollection, (draft) => {
+      draft.icon = emoji
+    })
+    setCustomCollection(newCollection)
+  }
+  const schema = customCollection.schema
+  const debouncedSchema = useDebounce(schema, { wait: 500 })
+  const setSchema = (schema: any) => {
+    const newCollection = produce(customCollection, (draft) => {
+      draft.schema = schema
+    })
+    setCustomCollection(newCollection)
+  }
+
+  useEffect(() => {
+    if (!debouncedSchema)
+      return
+    if (isEdit && editFirst) {
+      setEditFirst(false)
+      return
+    }
+    (async () => {
+      try {
+        const { parameters_schema, schema_type } = await parseParamsSchema(debouncedSchema)
+        const customCollection = getCustomCollection()
+        const newCollection = produce(customCollection, (draft) => {
+          draft.schema_type = schema_type
+        })
+        setCustomCollection(newCollection)
+        setParamsSchemas(parameters_schema)
+      }
+      catch {
+        const customCollection = getCustomCollection()
+        const newCollection = produce(customCollection, (draft) => {
+          draft.schema_type = ''
+        })
+        setCustomCollection(newCollection)
+        setParamsSchemas([])
+      }
+    })()
+  }, [debouncedSchema])
+
+  const [credentialsModalShow, setCredentialsModalShow] = useState(false)
+  const credential = customCollection.credentials
+  const setCredential = (credential: Credential) => {
+    const newCollection = produce(customCollection, (draft) => {
+      draft.credentials = credential
+    })
+    setCustomCollection(newCollection)
+  }
+
+  const [currTool, setCurrTool] = useState<CustomParamSchema | null>(null)
+  const [isShowTestApi, setIsShowTestApi] = useState(false)
+
+  const [labels, setLabels] = useState<string[]>(payload?.labels || [])
+  const handleLabelSelect = (value: string[]) => {
+    setLabels(value)
+  }
+
+  const handleSave = () => {
+    // const postData = clone(customCollection)
+    const postData = produce(customCollection, (draft) => {
+      delete draft.tools
+
+      if (draft.credentials.auth_type === AuthType.none) {
+        delete draft.credentials.api_key_header
+        delete draft.credentials.api_key_header_prefix
+        delete draft.credentials.api_key_value
+      }
+
+      draft.labels = labels
+    })
+
+    let errorMessage = ''
+    if (!postData.provider)
+      errorMessage = t('common.errorMsg.fieldRequired', { field: t('tools.createTool.name') })
+
+    if (!postData.schema)
+      errorMessage = t('common.errorMsg.fieldRequired', { field: t('tools.createTool.schema') })
+
+    if (errorMessage) {
+      Toast.notify({
+        type: 'error',
+        message: errorMessage,
+      })
+      return
+    }
+
+    if (isAdd) {
+      onAdd?.(postData)
+      return
+    }
+
+    onEdit?.({
+      ...postData,
+      original_provider: originalProvider,
+    })
+  }
+
+  const getPath = (url: string) => {
+    if (!url)
+      return ''
+
+    try {
+      const path = decodeURI(new URL(url).pathname)
+      return path || ''
+    }
+    catch {
+      return url
+    }
+  }
+
+  return (
+    <>
+      <Modal
+        isShow
+        onClose={onHide}
+        closable
+        className='!h-[calc(100vh-16px)] !max-w-[630px] !p-0'
+      >
+        <div className='flex h-full flex-col'>
+          <div className='ml-6 mt-6 text-base font-semibold text-text-primary'>
+            {t('tools.createTool.title')}
+          </div>
+          <div className='h-0 grow space-y-4 overflow-y-auto px-6 py-3'>
+            <div>
+              <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.name')} <span className='ml-1 text-red-500'>*</span></div>
+              <div className='flex items-center justify-between gap-3'>
+                <AppIcon size='large' onClick={() => { setShowEmojiPicker(true) }} className='cursor-pointer' icon={emoji.content} background={emoji.background} />
+                <Input
+                  className='h-10 grow' placeholder={t('tools.createTool.toolNamePlaceHolder')!}
+                  value={customCollection.provider}
+                  onChange={(e) => {
+                    const newCollection = produce(customCollection, (draft) => {
+                      draft.provider = e.target.value
+                    })
+                    setCustomCollection(newCollection)
+                  }}
+                />
+              </div>
+            </div>
+
+            {/* Schema */}
+            <div className='select-none'>
+              <div className='flex items-center justify-between'>
+                <div className='flex items-center'>
+                  <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.schema')}<span className='ml-1 text-red-500'>*</span></div>
+                  <div className='mx-2 h-3 w-px bg-divider-regular'></div>
+                  <a
+                    href="https://swagger.io/specification/"
+                    target='_blank' rel='noopener noreferrer'
+                    className='flex h-[18px] items-center space-x-1  text-text-accent'
+                  >
+                    <div className='text-xs font-normal'>{t('tools.createTool.viewSchemaSpec')}</div>
+                    <LinkExternal02 className='h-3 w-3' />
+                  </a>
+                </div>
+                <GetSchema onChange={setSchema} />
+
+              </div>
+              <Textarea
+                className='h-[240px] resize-none'
+                value={schema}
+                onChange={e => setSchema(e.target.value)}
+                placeholder={t('tools.createTool.schemaPlaceHolder')!}
+              />
+            </div>
+
+            {/* Available Tools  */}
+            <div>
+              <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.availableTools.title')}</div>
+              <div className='w-full overflow-x-auto rounded-lg border border-divider-regular'>
+                <table className='system-xs-regular w-full text-text-secondary'>
+                  <thead className='uppercase text-text-tertiary'>
+                    <tr className={cn(paramsSchemas.length > 0 && 'border-b', 'border-divider-regular')}>
+                      <th className="p-2 pl-3 font-medium">{t('tools.createTool.availableTools.name')}</th>
+                      <th className="w-[236px] p-2 pl-3 font-medium">{t('tools.createTool.availableTools.description')}</th>
+                      <th className="p-2 pl-3 font-medium">{t('tools.createTool.availableTools.method')}</th>
+                      <th className="p-2 pl-3 font-medium">{t('tools.createTool.availableTools.path')}</th>
+                      <th className="w-[54px] p-2 pl-3 font-medium">{t('tools.createTool.availableTools.action')}</th>
+                    </tr>
+                  </thead>
+                  <tbody>
+                    {paramsSchemas.map((item, index) => (
+                      <tr key={index} className='border-b border-divider-regular last:border-0'>
+                        <td className="p-2 pl-3">{item.operation_id}</td>
+                        <td className="w-[236px] p-2 pl-3">{item.summary}</td>
+                        <td className="p-2 pl-3">{item.method}</td>
+                        <td className="p-2 pl-3">{getPath(item.server_url)}</td>
+                        <td className="w-[62px] p-2 pl-3">
+                          <Button
+                            size='small'
+                            onClick={() => {
+                              setCurrTool(item)
+                              setIsShowTestApi(true)
+                            }}
+                          >
+                            {t('tools.createTool.availableTools.test')}
+                          </Button>
+                        </td>
+                      </tr>
+                    ))}
+                  </tbody>
+                </table>
+              </div>
+            </div>
+
+            {/* Authorization method */}
+            <div>
+              <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.authMethod.title')}</div>
+              <div className='flex h-9 cursor-pointer items-center justify-between rounded-lg bg-components-input-bg-normal px-2.5' onClick={() => setCredentialsModalShow(true)}>
+                <div className='system-xs-regular text-text-primary'>{t(`tools.createTool.authMethod.types.${credential.auth_type}`)}</div>
+                <Settings01 className='h-4 w-4 text-text-secondary' />
+              </div>
+            </div>
+
+            {/* Labels */}
+            <div>
+              <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.toolInput.label')}</div>
+              <LabelSelector value={labels} onChange={handleLabelSelect} />
+            </div>
+
+            {/* Privacy Policy */}
+            <div>
+              <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.privacyPolicy')}</div>
+              <Input
+                value={customCollection.privacy_policy}
+                onChange={(e) => {
+                  const newCollection = produce(customCollection, (draft) => {
+                    draft.privacy_policy = e.target.value
+                  })
+                  setCustomCollection(newCollection)
+                }}
+                className='h-10 grow' placeholder={t('tools.createTool.privacyPolicyPlaceholder') || ''} />
+            </div>
+
+            <div>
+              <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.customDisclaimer')}</div>
+              <Input
+                value={customCollection.custom_disclaimer}
+                onChange={(e) => {
+                  const newCollection = produce(customCollection, (draft) => {
+                    draft.custom_disclaimer = e.target.value
+                  })
+                  setCustomCollection(newCollection)
+                }}
+                className='h-10 grow' placeholder={t('tools.createTool.customDisclaimerPlaceholder') || ''} />
+            </div>
+
+          </div>
+          <div className={cn(isEdit ? 'justify-between' : 'justify-end', 'mt-2 flex shrink-0 rounded-b-[10px] border-t border-divider-regular bg-background-section-burn px-6 py-4')} >
+            {
+              isEdit && (
+                <Button variant='warning' onClick={onRemove}>{t('common.operation.delete')}</Button>
+              )
+            }
+            <div className='flex space-x-2 '>
+              <Button onClick={onHide}>{t('common.operation.cancel')}</Button>
+              <Button variant='primary' onClick={handleSave}>{t('common.operation.save')}</Button>
+            </div>
+          </div>
+          {showEmojiPicker && <EmojiPicker
+            onSelect={(icon, icon_background) => {
+              setEmoji({ content: icon, background: icon_background })
+              setShowEmojiPicker(false)
+            }}
+            onClose={() => {
+              setShowEmojiPicker(false)
+            }}
+          />}
+          {credentialsModalShow && (
+            <ConfigCredentials
+              positionCenter={isAdd}
+              credential={credential}
+              onChange={setCredential}
+              onHide={() => setCredentialsModalShow(false)}
+            />)
+          }
+          {isShowTestApi && (
+            <TestApi
+              positionCenter={isAdd}
+              tool={currTool as CustomParamSchema}
+              customCollection={customCollection}
+              onHide={() => setIsShowTestApi(false)}
+            />
+          )}
+        </div>
+      </Modal>
+    </>
+
+  )
+}
+export default React.memo(EditCustomCollectionModal)
diff --git a/app/components/tools/edit-custom-collection-modal/test-api.tsx b/app/components/tools/edit-custom-collection-modal/test-api.tsx
new file mode 100644
index 0000000..0079bad
--- /dev/null
+++ b/app/components/tools/edit-custom-collection-modal/test-api.tsx
@@ -0,0 +1,134 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { RiSettings2Line } from '@remixicon/react'
+import ConfigCredentials from './config-credentials'
+import { AuthType, type Credential, type CustomCollectionBackend, type CustomParamSchema } from '@/app/components/tools/types'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Drawer from '@/app/components/base/drawer-plus'
+import I18n from '@/context/i18n'
+import { testAPIAvailable } from '@/service/tools'
+import { getLanguage } from '@/i18n/language'
+
+type Props = {
+  positionCenter?: boolean
+  customCollection: CustomCollectionBackend
+  tool: CustomParamSchema
+  onHide: () => void
+}
+
+const TestApi: FC<Props> = ({
+  positionCenter,
+  customCollection,
+  tool,
+  onHide,
+}) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const language = getLanguage(locale)
+  const [credentialsModalShow, setCredentialsModalShow] = useState(false)
+  const [tempCredential, setTempCredential] = React.useState<Credential>(customCollection.credentials)
+  const [result, setResult] = useState<string>('')
+  const { operation_id: toolName, parameters } = tool
+  const [parametersValue, setParametersValue] = useState<Record<string, string>>({})
+  const handleTest = async () => {
+    // clone test schema
+    const credentials = JSON.parse(JSON.stringify(tempCredential)) as Credential
+    if (credentials.auth_type === AuthType.none) {
+      delete credentials.api_key_header_prefix
+      delete credentials.api_key_header
+      delete credentials.api_key_value
+    }
+    const data = {
+      provider_name: customCollection.provider,
+      tool_name: toolName,
+      credentials,
+      schema_type: customCollection.schema_type,
+      schema: customCollection.schema,
+      parameters: parametersValue,
+    }
+    const res = await testAPIAvailable(data) as any
+    setResult(res.error || res.result)
+  }
+
+  return (
+    <>
+      <Drawer
+        isShow
+        positionCenter={positionCenter}
+        onHide={onHide}
+        title={`${t('tools.test.title')}  ${toolName}`}
+        panelClassName='mt-2 !w-[600px]'
+        maxWidthClassName='!max-w-[600px]'
+        height='calc(100vh - 16px)'
+        headerClassName='!border-b-divider-regular'
+        body={
+          <div className='overflow-y-auto px-6 pt-2'>
+            <div className='space-y-4'>
+              <div>
+                <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.authMethod.title')}</div>
+                <div className='flex h-9 cursor-pointer items-center justify-between rounded-lg bg-components-input-bg-normal px-2.5' onClick={() => setCredentialsModalShow(true)}>
+                  <div className='system-xs-regular text-text-primary'>{t(`tools.createTool.authMethod.types.${tempCredential.auth_type}`)}</div>
+                  <RiSettings2Line className='h-4 w-4 text-text-secondary' />
+                </div>
+              </div>
+
+              <div>
+                <div className='system-sm-medium py-2 text-text-primary'>{t('tools.test.parametersValue')}</div>
+                <div className='rounded-lg border border-divider-regular'>
+                  <table className='system-xs-regular w-full font-normal text-text-secondary'>
+                    <thead className='uppercase text-text-tertiary'>
+                      <tr className='border-b border-divider-regular'>
+                        <th className="p-2 pl-3 font-medium">{t('tools.test.parameters')}</th>
+                        <th className="p-2 pl-3 font-medium">{t('tools.test.value')}</th>
+                      </tr>
+                    </thead>
+                    <tbody>
+                      {parameters.map((item, index) => (
+                        <tr key={index} className='border-b border-divider-regular last:border-0'>
+                          <td className="py-2 pl-3 pr-2.5">
+                            {item.label[language]}
+                          </td>
+                          <td className="">
+                            <Input
+                              value={parametersValue[item.name] || ''}
+                              onChange={e => setParametersValue({ ...parametersValue, [item.name]: e.target.value })}
+                              type='text'
+                              className='!hover:border-transparent !hover:bg-transparent !focus:border-transparent !focus:bg-transparent !border-transparent !bg-transparent' />
+                          </td>
+                        </tr>
+                      ))}
+                    </tbody>
+                  </table>
+                </div>
+              </div>
+
+            </div>
+            <Button variant='primary' className=' mt-4 h-10 w-full' onClick={handleTest}>{t('tools.test.title')}</Button>
+            <div className='mt-6'>
+              <div className='flex items-center space-x-3'>
+                <div className='system-xs-semibold text-text-tertiary'>{t('tools.test.testResult')}</div>
+                <div className='bg-[rgb(243, 244, 246)] h-px w-0 grow'></div>
+              </div>
+              <div className='system-xs-regular mt-2 h-[200px] overflow-y-auto overflow-x-hidden rounded-lg bg-components-input-bg-normal px-3 py-2 text-text-secondary'>
+                {result || <span className='text-text-quaternary'>{t('tools.test.testResultPlaceholder')}</span>}
+              </div>
+            </div>
+          </div>
+        }
+      />
+      {credentialsModalShow && (
+        <ConfigCredentials
+          positionCenter={positionCenter}
+          credential={tempCredential}
+          onChange={setTempCredential}
+          onHide={() => setCredentialsModalShow(false)}
+        />)
+      }
+    </>
+  )
+}
+export default React.memo(TestApi)
diff --git a/app/components/tools/labels/constant.ts b/app/components/tools/labels/constant.ts
new file mode 100644
index 0000000..ad4836e
--- /dev/null
+++ b/app/components/tools/labels/constant.ts
@@ -0,0 +1,4 @@
+export type Label = {
+  name: string
+  label: string
+}
diff --git a/app/components/tools/labels/filter.tsx b/app/components/tools/labels/filter.tsx
new file mode 100644
index 0000000..78e350d
--- /dev/null
+++ b/app/components/tools/labels/filter.tsx
@@ -0,0 +1,136 @@
+import type { FC } from 'react'
+import { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useDebounceFn } from 'ahooks'
+import { RiArrowDownSLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Input from '@/app/components/base/input'
+import { Tag01, Tag03 } from '@/app/components/base/icons/src/vender/line/financeAndECommerce'
+import { Check } from '@/app/components/base/icons/src/vender/line/general'
+import { XCircle } from '@/app/components/base/icons/src/vender/solid/general'
+import type { Label } from '@/app/components/tools/labels/constant'
+import { useTags } from '@/app/components/plugins/hooks'
+
+type LabelFilterProps = {
+  value: string[]
+  onChange: (v: string[]) => void
+}
+const LabelFilter: FC<LabelFilterProps> = ({
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const { tags: labelList } = useTags()
+
+  const [keywords, setKeywords] = useState('')
+  const [searchKeywords, setSearchKeywords] = useState('')
+  const { run: handleSearch } = useDebounceFn(() => {
+    setSearchKeywords(keywords)
+  }, { wait: 500 })
+  const handleKeywordsChange = (value: string) => {
+    setKeywords(value)
+    handleSearch()
+  }
+
+  const filteredLabelList = useMemo(() => {
+    return labelList.filter(label => label.name.includes(searchKeywords))
+  }, [labelList, searchKeywords])
+
+  const currentLabel = useMemo(() => {
+    return labelList.find(label => label.name === value[0])
+  }, [value, labelList])
+
+  const selectLabel = (label: Label) => {
+    if (value.includes(label.name))
+      onChange(value.filter(v => v !== label.name))
+    else
+      onChange([...value, label.name])
+  }
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <div className='relative'>
+        <PortalToFollowElemTrigger
+          onClick={() => setOpen(v => !v)}
+          className='block'
+        >
+          <div className={cn(
+            'flex h-8 cursor-pointer items-center gap-1 rounded-lg border-[0.5px] border-transparent bg-components-input-bg-normal px-2 hover:bg-components-input-bg-hover',
+            !open && !!value.length && 'shadow-xs',
+            open && !!value.length && 'shadow-xs',
+          )}>
+            <div className='p-[1px]'>
+              <Tag01 className='h-3.5 w-3.5 text-text-tertiary' />
+            </div>
+            <div className='text-[13px] leading-[18px] text-text-tertiary'>
+              {!value.length && t('common.tag.placeholder')}
+              {!!value.length && currentLabel?.label}
+            </div>
+            {value.length > 1 && (
+              <div className='text-xs font-medium leading-[18px] text-text-tertiary'>{`+${value.length - 1}`}</div>
+            )}
+            {!value.length && (
+              <div className='p-[1px]'>
+                <RiArrowDownSLine className='h-3.5 w-3.5 text-text-tertiary' />
+              </div>
+            )}
+            {!!value.length && (
+              <div className='group/clear cursor-pointer p-[1px]' onClick={(e) => {
+                e.stopPropagation()
+                onChange([])
+              }}>
+                <XCircle className='h-3.5 w-3.5 text-text-tertiary group-hover/clear:text-text-secondary' />
+              </div>
+            )}
+          </div>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[1002]'>
+          <div className='relative w-[240px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg  backdrop-blur-[5px]'>
+            <div className='p-2'>
+              <Input
+                showLeftIcon
+                showClearIcon
+                value={keywords}
+                onChange={e => handleKeywordsChange(e.target.value)}
+                onClear={() => handleKeywordsChange('')}
+              />
+            </div>
+            <div className='p-1'>
+              {filteredLabelList.map(label => (
+                <div
+                  key={label.name}
+                  className='flex cursor-pointer items-center gap-2 rounded-lg py-[6px] pl-3 pr-2 hover:bg-state-base-hover'
+                  onClick={() => selectLabel(label)}
+                >
+                  <div title={label.label} className='grow truncate text-sm leading-5 text-text-secondary'>{label.label}</div>
+                  {value.includes(label.name) && <Check className='h-4 w-4 shrink-0 text-text-accent' />}
+                </div>
+              ))}
+              {!filteredLabelList.length && (
+                <div className='flex flex-col items-center gap-1 p-3'>
+                  <Tag03 className='h-6 w-6 text-text-quaternary' />
+                  <div className='text-xs leading-[14px] text-text-tertiary'>{t('common.tag.noTag')}</div>
+                </div>
+              )}
+            </div>
+          </div>
+        </PortalToFollowElemContent>
+      </div>
+    </PortalToFollowElem>
+
+  )
+}
+
+export default LabelFilter
diff --git a/app/components/tools/labels/selector.tsx b/app/components/tools/labels/selector.tsx
new file mode 100644
index 0000000..587c204
--- /dev/null
+++ b/app/components/tools/labels/selector.tsx
@@ -0,0 +1,122 @@
+import type { FC } from 'react'
+import { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useDebounceFn } from 'ahooks'
+import { RiArrowDownSLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Input from '@/app/components/base/input'
+import { Tag03 } from '@/app/components/base/icons/src/vender/line/financeAndECommerce'
+import Checkbox from '@/app/components/base/checkbox'
+import type { Label } from '@/app/components/tools/labels/constant'
+import { useTags } from '@/app/components/plugins/hooks'
+import { noop } from 'lodash-es'
+
+type LabelSelectorProps = {
+  value: string[]
+  onChange: (v: string[]) => void
+}
+const LabelSelector: FC<LabelSelectorProps> = ({
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const { tags: labelList } = useTags()
+
+  const [keywords, setKeywords] = useState('')
+  const [searchKeywords, setSearchKeywords] = useState('')
+  const { run: handleSearch } = useDebounceFn(() => {
+    setSearchKeywords(keywords)
+  }, { wait: 500 })
+  const handleKeywordsChange = (value: string) => {
+    setKeywords(value)
+    handleSearch()
+  }
+
+  const filteredLabelList = useMemo(() => {
+    return labelList.filter(label => label.name.includes(searchKeywords))
+  }, [labelList, searchKeywords])
+
+  const selectedLabels = useMemo(() => {
+    return value.map(v => labelList.find(l => l.name === v)?.label).join(', ')
+  }, [value, labelList])
+
+  const selectLabel = (label: Label) => {
+    if (value.includes(label.name))
+      onChange(value.filter(v => v !== label.name))
+    else
+      onChange([...value, label.name])
+  }
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <div className='relative'>
+        <PortalToFollowElemTrigger
+          onClick={() => setOpen(v => !v)}
+          className='block'
+        >
+          <div className={cn(
+            'flex h-10 cursor-pointer items-center gap-1 rounded-lg border-[0.5px] border-transparent bg-components-input-bg-normal px-3 hover:bg-components-input-bg-hover',
+            open && '!hover:bg-components-input-bg-hover hover:bg-components-input-bg-hover',
+          )}>
+            <div title={value.length > 0 ? selectedLabels : ''} className={cn('grow truncate text-[13px] leading-[18px] text-text-secondary', !value.length && '!text-text-quaternary')}>
+              {!value.length && t('tools.createTool.toolInput.labelPlaceholder')}
+              {!!value.length && selectedLabels}
+            </div>
+            <div className='ml-1 shrink-0 text-text-secondary opacity-60'>
+              <RiArrowDownSLine className='h-4 w-4' />
+            </div>
+          </div>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[1040]'>
+          <div className='relative w-[591px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg  backdrop-blur-[5px]'>
+            <div className='border-b-[0.5px] border-divider-regular p-2'>
+              <Input
+                showLeftIcon
+                showClearIcon
+                value={keywords}
+                onChange={e => handleKeywordsChange(e.target.value)}
+                onClear={() => handleKeywordsChange('')}
+              />
+            </div>
+            <div className='max-h-[264px] overflow-y-auto p-1'>
+              {filteredLabelList.map(label => (
+                <div
+                  key={label.name}
+                  className='flex cursor-pointer items-center gap-2 rounded-lg py-[6px] pl-3 pr-2 hover:bg-components-panel-on-panel-item-bg-hover'
+                  onClick={() => selectLabel(label)}
+                >
+                  <Checkbox
+                    className='shrink-0'
+                    checked={value.includes(label.name)}
+                    onCheck={noop}
+                  />
+                  <div title={label.label} className='grow truncate text-sm leading-5 text-text-secondary'>{label.label}</div>
+                </div>
+              ))}
+              {!filteredLabelList.length && (
+                <div className='flex flex-col items-center gap-1 p-3'>
+                  <Tag03 className='h-6 w-6 text-text-quaternary' />
+                  <div className='text-xs leading-[14px] text-text-tertiary'>{t('common.tag.noTag')}</div>
+                </div>
+              )}
+            </div>
+          </div>
+        </PortalToFollowElemContent>
+      </div>
+    </PortalToFollowElem>
+  )
+}
+
+export default LabelSelector
diff --git a/app/components/tools/marketplace/hooks.ts b/app/components/tools/marketplace/hooks.ts
new file mode 100644
index 0000000..0790d52
--- /dev/null
+++ b/app/components/tools/marketplace/hooks.ts
@@ -0,0 +1,117 @@
+import {
+  useCallback,
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from 'react'
+import {
+  useMarketplaceCollectionsAndPlugins,
+  useMarketplacePlugins,
+} from '@/app/components/plugins/marketplace/hooks'
+import { PluginType } from '@/app/components/plugins/types'
+import { getMarketplaceListCondition } from '@/app/components/plugins/marketplace/utils'
+import { useAllToolProviders } from '@/service/use-tools'
+
+export const useMarketplace = (searchPluginText: string, filterPluginTags: string[]) => {
+  const { data: toolProvidersData, isSuccess } = useAllToolProviders()
+  const exclude = useMemo(() => {
+    if (isSuccess)
+      return toolProvidersData?.filter(toolProvider => !!toolProvider.plugin_id).map(toolProvider => toolProvider.plugin_id!)
+  }, [isSuccess, toolProvidersData])
+  const {
+    isLoading,
+    marketplaceCollections,
+    marketplaceCollectionPluginsMap,
+    queryMarketplaceCollectionsAndPlugins,
+  } = useMarketplaceCollectionsAndPlugins()
+  const {
+    plugins,
+    resetPlugins,
+    queryPlugins,
+    queryPluginsWithDebounced,
+    isLoading: isPluginsLoading,
+    total: pluginsTotal,
+  } = useMarketplacePlugins()
+  const [page, setPage] = useState(1)
+  const pageRef = useRef(page)
+  const searchPluginTextRef = useRef(searchPluginText)
+  const filterPluginTagsRef = useRef(filterPluginTags)
+
+  useEffect(() => {
+    searchPluginTextRef.current = searchPluginText
+    filterPluginTagsRef.current = filterPluginTags
+  }, [searchPluginText, filterPluginTags])
+  useEffect(() => {
+    if ((searchPluginText || filterPluginTags.length) && isSuccess) {
+      setPage(1)
+      pageRef.current = 1
+
+      if (searchPluginText) {
+        queryPluginsWithDebounced({
+          category: PluginType.tool,
+          query: searchPluginText,
+          tags: filterPluginTags,
+          exclude,
+          type: 'plugin',
+          page: pageRef.current,
+        })
+        return
+      }
+      queryPlugins({
+        category: PluginType.tool,
+        query: searchPluginText,
+        tags: filterPluginTags,
+        exclude,
+        type: 'plugin',
+        page: pageRef.current,
+      })
+    }
+    else {
+      if (isSuccess) {
+        queryMarketplaceCollectionsAndPlugins({
+          category: PluginType.tool,
+          condition: getMarketplaceListCondition(PluginType.tool),
+          exclude,
+          type: 'plugin',
+        })
+        resetPlugins()
+      }
+    }
+  }, [searchPluginText, filterPluginTags, queryPlugins, queryMarketplaceCollectionsAndPlugins, queryPluginsWithDebounced, resetPlugins, exclude, isSuccess])
+
+  const handleScroll = useCallback((e: Event) => {
+    const target = e.target as HTMLDivElement
+    const {
+      scrollTop,
+      scrollHeight,
+      clientHeight,
+    } = target
+    if (scrollTop + clientHeight >= scrollHeight - 5 && scrollTop > 0) {
+      const searchPluginText = searchPluginTextRef.current
+      const filterPluginTags = filterPluginTagsRef.current
+      if (pluginsTotal && plugins && pluginsTotal > plugins.length && (!!searchPluginText || !!filterPluginTags.length)) {
+        setPage(pageRef.current + 1)
+        pageRef.current++
+
+        queryPlugins({
+          category: PluginType.tool,
+          query: searchPluginText,
+          tags: filterPluginTags,
+          exclude,
+          type: 'plugin',
+          page: pageRef.current,
+        })
+      }
+    }
+  }, [exclude, plugins, pluginsTotal, queryPlugins])
+
+  return {
+    isLoading: isLoading || isPluginsLoading,
+    marketplaceCollections,
+    marketplaceCollectionPluginsMap,
+    plugins,
+    handleScroll,
+    page,
+  }
+}
diff --git a/app/components/tools/marketplace/index.tsx b/app/components/tools/marketplace/index.tsx
new file mode 100644
index 0000000..8c805e1
--- /dev/null
+++ b/app/components/tools/marketplace/index.tsx
@@ -0,0 +1,118 @@
+import {
+  useEffect,
+  useRef,
+} from 'react'
+import { useTheme } from 'next-themes'
+import {
+  RiArrowRightUpLine,
+  RiArrowUpDoubleLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useMarketplace } from './hooks'
+import List from '@/app/components/plugins/marketplace/list'
+import Loading from '@/app/components/base/loading'
+import { getLocaleOnClient } from '@/i18n'
+import { MARKETPLACE_URL_PREFIX } from '@/config'
+
+type MarketplaceProps = {
+  searchPluginText: string
+  filterPluginTags: string[]
+  onMarketplaceScroll: () => void
+}
+const Marketplace = ({
+  searchPluginText,
+  filterPluginTags,
+  onMarketplaceScroll,
+}: MarketplaceProps) => {
+  const locale = getLocaleOnClient()
+  const { t } = useTranslation()
+  const { theme } = useTheme()
+  const {
+    isLoading,
+    marketplaceCollections,
+    marketplaceCollectionPluginsMap,
+    plugins,
+    handleScroll,
+    page,
+  } = useMarketplace(searchPluginText, filterPluginTags)
+  const containerRef = useRef<HTMLDivElement>(null)
+
+  useEffect(() => {
+    const container = containerRef.current
+    if (container)
+      container.addEventListener('scroll', handleScroll)
+
+    return () => {
+      if (container)
+        container.removeEventListener('scroll', handleScroll)
+    }
+  }, [handleScroll])
+
+  return (
+    <div
+      ref={containerRef}
+      className='sticky bottom-[-442px] flex h-[530px] shrink-0 grow flex-col overflow-y-auto bg-background-default-subtle px-12 py-2 pt-0'
+    >
+      <RiArrowUpDoubleLine
+        className='absolute left-1/2 top-2 h-4 w-4 -translate-x-1/2 cursor-pointer text-text-quaternary'
+        onClick={() => onMarketplaceScroll()}
+      />
+      <div className='sticky top-0 z-10 bg-background-default-subtle pb-3 pt-5'>
+        <div className='title-2xl-semi-bold bg-gradient-to-r from-[rgba(11,165,236,0.95)] to-[rgba(21,90,239,0.95)] bg-clip-text text-transparent'>
+          {t('plugin.marketplace.moreFrom')}
+        </div>
+        <div className='body-md-regular flex items-center text-center text-text-tertiary'>
+          {t('plugin.marketplace.discover')}
+          <span className="body-md-medium relative ml-1 text-text-secondary after:absolute after:bottom-[1.5px] after:left-0 after:h-2 after:w-full after:bg-text-text-selected after:content-['']">
+            {t('plugin.category.models')}
+          </span>
+          ,
+          <span className="body-md-medium relative ml-1 text-text-secondary after:absolute after:bottom-[1.5px] after:left-0 after:h-2 after:w-full after:bg-text-text-selected after:content-['']">
+            {t('plugin.category.tools')}
+          </span>
+          ,
+          <span className="body-md-medium relative ml-1 text-text-secondary after:absolute after:bottom-[1.5px] after:left-0 after:h-2 after:w-full after:bg-text-text-selected after:content-['']">
+            {t('plugin.category.agents')}
+          </span>
+          ,
+          <span className="body-md-medium relative ml-1 mr-1 text-text-secondary after:absolute after:bottom-[1.5px] after:left-0 after:h-2 after:w-full after:bg-text-text-selected after:content-['']">
+            {t('plugin.category.extensions')}
+          </span>
+          {t('plugin.marketplace.and')}
+          <span className="body-md-medium relative ml-1 mr-1 text-text-secondary after:absolute after:bottom-[1.5px] after:left-0 after:h-2 after:w-full after:bg-text-text-selected after:content-['']">
+            {t('plugin.category.bundles')}
+          </span>
+          {t('common.operation.in')}
+          <a
+            href={`${MARKETPLACE_URL_PREFIX}?language=${locale}&q=${searchPluginText}&tags=${filterPluginTags.join(',')}${theme ? `&theme=${theme}` : ''}`}
+            className='system-sm-medium ml-1 flex items-center text-text-accent'
+            target='_blank'
+          >
+            {t('plugin.marketplace.difyMarketplace')}
+            <RiArrowRightUpLine className='h-4 w-4' />
+          </a>
+        </div>
+      </div>
+      {
+        isLoading && page === 1 && (
+          <div className='absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2'>
+            <Loading />
+          </div>
+        )
+      }
+      {
+        (!isLoading || page > 1) && (
+          <List
+            marketplaceCollections={marketplaceCollections || []}
+            marketplaceCollectionPluginsMap={marketplaceCollectionPluginsMap || {}}
+            plugins={plugins}
+            showInstallButton
+            locale={locale}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default Marketplace
diff --git a/app/components/tools/provider-list.tsx b/app/components/tools/provider-list.tsx
new file mode 100644
index 0000000..b1da6d5
--- /dev/null
+++ b/app/components/tools/provider-list.tsx
@@ -0,0 +1,165 @@
+'use client'
+import { useMemo, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { Collection } from './types'
+import Marketplace from './marketplace'
+import cn from '@/utils/classnames'
+import { useTabSearchParams } from '@/hooks/use-tab-searchparams'
+import TabSliderNew from '@/app/components/base/tab-slider-new'
+import LabelFilter from '@/app/components/tools/labels/filter'
+import Input from '@/app/components/base/input'
+import ProviderDetail from '@/app/components/tools/provider/detail'
+import Empty from '@/app/components/plugins/marketplace/empty'
+import CustomCreateCard from '@/app/components/tools/provider/custom-create-card'
+import WorkflowToolEmpty from '@/app/components/tools/add-tool-modal/empty'
+import Card from '@/app/components/plugins/card'
+import CardMoreInfo from '@/app/components/plugins/card/card-more-info'
+import PluginDetailPanel from '@/app/components/plugins/plugin-detail-panel'
+import { useSelector as useAppContextSelector } from '@/context/app-context'
+import { useAllToolProviders } from '@/service/use-tools'
+import { useInstalledPluginList, useInvalidateInstalledPluginList } from '@/service/use-plugins'
+
+const ProviderList = () => {
+  const { t } = useTranslation()
+  const containerRef = useRef<HTMLDivElement>(null)
+  const { enable_marketplace } = useAppContextSelector(s => s.systemFeatures)
+
+  const [activeTab, setActiveTab] = useTabSearchParams({
+    defaultTab: 'builtin',
+  })
+  const options = [
+    { value: 'builtin', text: t('tools.type.builtIn') },
+    { value: 'api', text: t('tools.type.custom') },
+    { value: 'workflow', text: t('tools.type.workflow') },
+  ]
+  const [tagFilterValue, setTagFilterValue] = useState<string[]>([])
+  const handleTagsChange = (value: string[]) => {
+    setTagFilterValue(value)
+  }
+  const [keywords, setKeywords] = useState<string>('')
+  const handleKeywordsChange = (value: string) => {
+    setKeywords(value)
+  }
+  const { data: collectionList = [], refetch } = useAllToolProviders()
+  const filteredCollectionList = useMemo(() => {
+    return collectionList.filter((collection) => {
+      if (collection.type !== activeTab)
+        return false
+      if (tagFilterValue.length > 0 && (!collection.labels || collection.labels.every(label => !tagFilterValue.includes(label))))
+        return false
+      if (keywords)
+        return Object.values(collection.label).some(value => value.toLowerCase().includes(keywords.toLowerCase()))
+      return true
+    })
+  }, [activeTab, tagFilterValue, keywords, collectionList])
+
+  const [currentProviderId, setCurrentProviderId] = useState<string | undefined>()
+  const currentProvider = useMemo<Collection | undefined>(() => {
+    return filteredCollectionList.find(collection => collection.id === currentProviderId)
+  }, [currentProviderId, filteredCollectionList])
+  const { data: pluginList } = useInstalledPluginList()
+  const invalidateInstalledPluginList = useInvalidateInstalledPluginList()
+  const currentPluginDetail = useMemo(() => {
+    const detail = pluginList?.plugins.find(plugin => plugin.plugin_id === currentProvider?.plugin_id)
+    return detail
+  }, [currentProvider?.plugin_id, pluginList?.plugins])
+
+  return (
+    <>
+      <div className='relative flex h-0 shrink-0 grow overflow-hidden'>
+        <div
+          ref={containerRef}
+          className='relative flex grow flex-col overflow-y-auto bg-background-body'
+        >
+          <div className={cn(
+            'sticky top-0 z-20 flex flex-wrap items-center justify-between gap-y-2 bg-background-body px-12 pb-2 pt-4 leading-[56px]',
+            currentProviderId && 'pr-6',
+          )}>
+            <TabSliderNew
+              value={activeTab}
+              onChange={(state) => {
+                setActiveTab(state)
+                if (state !== activeTab)
+                  setCurrentProviderId(undefined)
+              }}
+              options={options}
+            />
+            <div className='flex items-center gap-2'>
+              <LabelFilter value={tagFilterValue} onChange={handleTagsChange} />
+              <Input
+                showLeftIcon
+                showClearIcon
+                wrapperClassName='w-[200px]'
+                value={keywords}
+                onChange={e => handleKeywordsChange(e.target.value)}
+                onClear={() => handleKeywordsChange('')}
+              />
+            </div>
+          </div>
+          {(filteredCollectionList.length > 0 || activeTab !== 'builtin') && (
+            <div className={cn(
+              'relative grid shrink-0 grid-cols-1 content-start gap-4 px-12 pb-4 pt-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4',
+              !filteredCollectionList.length && activeTab === 'workflow' && 'grow',
+            )}>
+              {activeTab === 'api' && <CustomCreateCard onRefreshData={refetch} />}
+              {filteredCollectionList.map(collection => (
+                <div
+                  key={collection.id}
+                  onClick={() => setCurrentProviderId(collection.id)}
+                >
+                  <Card
+                    className={cn(
+                      'cursor-pointer border-[1.5px] border-transparent',
+                      currentProviderId === collection.id && 'border-components-option-card-option-selected-border',
+                    )}
+                    hideCornerMark
+                    payload={{
+                      ...collection,
+                      brief: collection.description,
+                      org: collection.plugin_id ? collection.plugin_id.split('/')[0] : '',
+                      name: collection.plugin_id ? collection.plugin_id.split('/')[1] : collection.name,
+                    } as any}
+                    footer={
+                      <CardMoreInfo
+                        tags={collection.labels}
+                      />
+                    }
+                  />
+                </div>
+              ))}
+              {!filteredCollectionList.length && activeTab === 'workflow' && <div className='absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2'><WorkflowToolEmpty /></div>}
+            </div>
+          )}
+          {!filteredCollectionList.length && activeTab === 'builtin' && (
+            <Empty lightCard text={t('tools.noTools')} className='h-[224px] px-12' />
+          )}
+          {
+            enable_marketplace && activeTab === 'builtin' && (
+              <Marketplace
+                onMarketplaceScroll={() => {
+                  containerRef.current?.scrollTo({ top: containerRef.current.scrollHeight, behavior: 'smooth' })
+                }}
+                searchPluginText={keywords}
+                filterPluginTags={tagFilterValue}
+              />
+            )
+          }
+        </div>
+      </div>
+      {currentProvider && !currentProvider.plugin_id && (
+        <ProviderDetail
+          collection={currentProvider}
+          onHide={() => setCurrentProviderId(undefined)}
+          onRefreshData={refetch}
+        />
+      )}
+      <PluginDetailPanel
+        detail={currentPluginDetail}
+        onUpdate={() => invalidateInstalledPluginList()}
+        onHide={() => setCurrentProviderId(undefined)}
+      />
+    </>
+  )
+}
+ProviderList.displayName = 'ToolProviderList'
+export default ProviderList
diff --git a/app/components/tools/provider/custom-create-card.tsx b/app/components/tools/provider/custom-create-card.tsx
new file mode 100644
index 0000000..6dd268c
--- /dev/null
+++ b/app/components/tools/provider/custom-create-card.tsx
@@ -0,0 +1,76 @@
+'use client'
+import { useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import {
+  RiAddLine,
+} from '@remixicon/react'
+import type { CustomCollectionBackend } from '../types'
+import I18n from '@/context/i18n'
+import { getLanguage } from '@/i18n/language'
+import { BookOpen01 } from '@/app/components/base/icons/src/vender/line/education'
+import { ArrowUpRight } from '@/app/components/base/icons/src/vender/line/arrows'
+import EditCustomToolModal from '@/app/components/tools/edit-custom-collection-modal'
+import { createCustomCollection } from '@/service/tools'
+import Toast from '@/app/components/base/toast'
+import { useAppContext } from '@/context/app-context'
+
+type Props = {
+  onRefreshData: () => void
+}
+
+const Contribute = ({ onRefreshData }: Props) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const language = getLanguage(locale)
+  const { isCurrentWorkspaceManager } = useAppContext()
+
+  const linkUrl = useMemo(() => {
+    if (language.startsWith('zh_'))
+      return 'https://docs.dify.ai/zh-hans/guides/tools#ru-he-chuang-jian-zi-ding-yi-gong-ju'
+    return 'https://docs.dify.ai/en/guides/tools#how-to-create-custom-tools'
+  }, [language])
+
+  const [isShowEditCollectionToolModal, setIsShowEditCustomCollectionModal] = useState(false)
+  const doCreateCustomToolCollection = async (data: CustomCollectionBackend) => {
+    await createCustomCollection(data)
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+    setIsShowEditCustomCollectionModal(false)
+    onRefreshData()
+  }
+
+  return (
+    <>
+      {isCurrentWorkspaceManager && (
+        <div className='col-span-1 flex min-h-[135px] cursor-pointer flex-col rounded-xl border-[0.5px] border-divider-subtle bg-components-panel-on-panel-item-bg transition-all duration-200 ease-in-out hover:bg-components-panel-on-panel-item-bg-hover hover:shadow-lg'>
+          <div className='group grow rounded-t-xl hover:bg-background-body' onClick={() => setIsShowEditCustomCollectionModal(true)}>
+            <div className='flex shrink-0 items-center p-4 pb-3'>
+              <div className='flex h-10 w-10 items-center justify-center rounded-lg border border-components-option-card-option-border bg-components-option-card-option-bg group-hover:border-components-option-card-option-border-hover group-hover:bg-components-option-card-option-bg-hover'>
+                <RiAddLine className='h-4 w-4 text-text-tertiary group-hover:text-text-accent'/>
+              </div>
+              <div className='ml-3 text-sm font-semibold leading-5 text-text-primary group-hover:text-text-accent'>{t('tools.createCustomTool')}</div>
+            </div>
+          </div>
+          <div className='rounded-b-xl border-t-[0.5px] border-divider-regular px-4 py-3 text-text-tertiary hover:bg-background-body hover:text-text-accent'>
+            <a href={linkUrl} target='_blank' rel='noopener noreferrer' className='flex items-center space-x-1'>
+              <BookOpen01 className='h-3 w-3 shrink-0' />
+              <div className='grow truncate text-xs font-normal leading-[18px]' title={t('tools.customToolTip') || ''}>{t('tools.customToolTip')}</div>
+              <ArrowUpRight className='h-3 w-3 shrink-0' />
+            </a>
+          </div>
+        </div>
+      )}
+      {isShowEditCollectionToolModal && (
+        <EditCustomToolModal
+          payload={null}
+          onHide={() => setIsShowEditCustomCollectionModal(false)}
+          onAdd={doCreateCustomToolCollection}
+        />
+      )}
+    </>
+  )
+}
+export default Contribute
diff --git a/app/components/tools/provider/detail.tsx b/app/components/tools/provider/detail.tsx
new file mode 100644
index 0000000..045d6f1
--- /dev/null
+++ b/app/components/tools/provider/detail.tsx
@@ -0,0 +1,430 @@
+'use client'
+import React, { useCallback, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import {
+  RiCloseLine,
+} from '@remixicon/react'
+import { AuthHeaderPrefix, AuthType, CollectionType } from '../types'
+import Link from 'next/link'
+import type { Collection, CustomCollectionBackend, Tool, WorkflowToolProviderRequest, WorkflowToolProviderResponse } from '../types'
+import ToolItem from './tool-item'
+import cn from '@/utils/classnames'
+import I18n from '@/context/i18n'
+import { getLanguage } from '@/i18n/language'
+import Confirm from '@/app/components/base/confirm'
+import Button from '@/app/components/base/button'
+import Indicator from '@/app/components/header/indicator'
+import { LinkExternal02, Settings01 } from '@/app/components/base/icons/src/vender/line/general'
+import Icon from '@/app/components/plugins/card/base/card-icon'
+import Title from '@/app/components/plugins/card/base/title'
+import OrgInfo from '@/app/components/plugins/card/base/org-info'
+import Description from '@/app/components/plugins/card/base/description'
+import ConfigCredential from '@/app/components/tools/setting/build-in/config-credentials'
+import EditCustomToolModal from '@/app/components/tools/edit-custom-collection-modal'
+import WorkflowToolModal from '@/app/components/tools/workflow-tool'
+import Toast from '@/app/components/base/toast'
+import Drawer from '@/app/components/base/drawer'
+import ActionButton from '@/app/components/base/action-button'
+
+import {
+  deleteWorkflowTool,
+  fetchBuiltInToolList,
+  fetchCustomCollection,
+  fetchCustomToolList,
+  fetchModelToolList,
+  fetchWorkflowToolDetail,
+  removeBuiltInToolCredential,
+  removeCustomCollection,
+  saveWorkflowToolProvider,
+  updateBuiltInToolCredential,
+  updateCustomCollection,
+} from '@/service/tools'
+import { useModalContext } from '@/context/modal-context'
+import { useProviderContext } from '@/context/provider-context'
+import { ConfigurationMethodEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import Loading from '@/app/components/base/loading'
+import { useAppContext } from '@/context/app-context'
+import { useInvalidateAllWorkflowTools } from '@/service/use-tools'
+
+type Props = {
+  collection: Collection
+  onHide: () => void
+  onRefreshData: () => void
+}
+
+const ProviderDetail = ({
+  collection,
+  onHide,
+  onRefreshData,
+}: Props) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const language = getLanguage(locale)
+
+  const needAuth = collection.allow_delete || collection.type === CollectionType.model
+  const isAuthed = collection.is_team_authorization
+  const isBuiltIn = collection.type === CollectionType.builtIn
+  const isModel = collection.type === CollectionType.model
+  const { isCurrentWorkspaceManager } = useAppContext()
+  const invalidateAllWorkflowTools = useInvalidateAllWorkflowTools()
+  const [isDetailLoading, setIsDetailLoading] = useState(false)
+
+  // built in provider
+  const [showSettingAuth, setShowSettingAuth] = useState(false)
+  const { setShowModelModal } = useModalContext()
+  const { modelProviders: providers } = useProviderContext()
+  const showSettingAuthModal = () => {
+    if (isModel) {
+      const provider = providers.find(item => item.provider === collection?.id)
+      if (provider) {
+        setShowModelModal({
+          payload: {
+            currentProvider: provider,
+            currentConfigurationMethod: ConfigurationMethodEnum.predefinedModel,
+            currentCustomConfigurationModelFixedFields: undefined,
+          },
+          onSaveCallback: () => {
+            onRefreshData()
+          },
+        })
+      }
+    }
+    else {
+      setShowSettingAuth(true)
+    }
+  }
+  // custom provider
+  const [customCollection, setCustomCollection] = useState<CustomCollectionBackend | WorkflowToolProviderResponse | null>(null)
+  const [isShowEditCollectionToolModal, setIsShowEditCustomCollectionModal] = useState(false)
+  const [showConfirmDelete, setShowConfirmDelete] = useState(false)
+  const [deleteAction, setDeleteAction] = useState('')
+  const doUpdateCustomToolCollection = async (data: CustomCollectionBackend) => {
+    await updateCustomCollection(data)
+    onRefreshData()
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+    setIsShowEditCustomCollectionModal(false)
+  }
+  const doRemoveCustomToolCollection = async () => {
+    await removeCustomCollection(collection?.name as string)
+    onRefreshData()
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+    setIsShowEditCustomCollectionModal(false)
+  }
+  const getCustomProvider = useCallback(async () => {
+    setIsDetailLoading(true)
+    const res = await fetchCustomCollection(collection.name)
+    if (res.credentials.auth_type === AuthType.apiKey && !res.credentials.api_key_header_prefix) {
+      if (res.credentials.api_key_value)
+        res.credentials.api_key_header_prefix = AuthHeaderPrefix.custom
+    }
+    setCustomCollection({
+      ...res,
+      labels: collection.labels,
+      provider: collection.name,
+    })
+    setIsDetailLoading(false)
+  }, [collection.labels, collection.name])
+  // workflow provider
+  const [isShowEditWorkflowToolModal, setIsShowEditWorkflowToolModal] = useState(false)
+  const getWorkflowToolProvider = useCallback(async () => {
+    setIsDetailLoading(true)
+    const res = await fetchWorkflowToolDetail(collection.id)
+    const payload = {
+      ...res,
+      parameters: res.tool?.parameters.map((item) => {
+        return {
+          name: item.name,
+          description: item.llm_description,
+          form: item.form,
+          required: item.required,
+          type: item.type,
+        }
+      }) || [],
+      labels: res.tool?.labels || [],
+    }
+    setCustomCollection(payload)
+    setIsDetailLoading(false)
+  }, [collection.id])
+  const removeWorkflowToolProvider = async () => {
+    await deleteWorkflowTool(collection.id)
+    onRefreshData()
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+    setIsShowEditWorkflowToolModal(false)
+  }
+  const updateWorkflowToolProvider = async (data: WorkflowToolProviderRequest & Partial<{
+    workflow_app_id: string
+    workflow_tool_id: string
+  }>) => {
+    await saveWorkflowToolProvider(data)
+    invalidateAllWorkflowTools()
+    onRefreshData()
+    getWorkflowToolProvider()
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+    setIsShowEditWorkflowToolModal(false)
+  }
+  const onClickCustomToolDelete = () => {
+    setDeleteAction('customTool')
+    setShowConfirmDelete(true)
+  }
+  const onClickWorkflowToolDelete = () => {
+    setDeleteAction('workflowTool')
+    setShowConfirmDelete(true)
+  }
+  const handleConfirmDelete = () => {
+    if (deleteAction === 'customTool')
+      doRemoveCustomToolCollection()
+
+    else if (deleteAction === 'workflowTool')
+      removeWorkflowToolProvider()
+
+    setShowConfirmDelete(false)
+  }
+
+  // ToolList
+  const [toolList, setToolList] = useState<Tool[]>([])
+  const getProviderToolList = useCallback(async () => {
+    setIsDetailLoading(true)
+    try {
+      if (collection.type === CollectionType.builtIn) {
+        const list = await fetchBuiltInToolList(collection.name)
+        setToolList(list)
+      }
+      else if (collection.type === CollectionType.model) {
+        const list = await fetchModelToolList(collection.name)
+        setToolList(list)
+      }
+      else if (collection.type === CollectionType.workflow) {
+        setToolList([])
+      }
+      else {
+        const list = await fetchCustomToolList(collection.name)
+        setToolList(list)
+      }
+    }
+    catch { }
+    setIsDetailLoading(false)
+  }, [collection.name, collection.type])
+
+  useEffect(() => {
+    if (collection.type === CollectionType.custom)
+      getCustomProvider()
+    if (collection.type === CollectionType.workflow)
+      getWorkflowToolProvider()
+    getProviderToolList()
+  }, [collection.name, collection.type, getCustomProvider, getProviderToolList, getWorkflowToolProvider])
+
+  return (
+    <Drawer
+      isOpen={!!collection}
+      clickOutsideNotOpen={false}
+      onClose={onHide}
+      footer={null}
+      mask={false}
+      positionCenter={false}
+      panelClassName={cn('mb-2 mr-2 mt-[64px] !w-[420px] !max-w-[420px] justify-start rounded-2xl border-[0.5px] border-components-panel-border !bg-components-panel-bg !p-0 shadow-xl')}
+    >
+      <div className='flex h-full flex-col p-4'>
+        <div className="shrink-0">
+          <div className='mb-3 flex'>
+            <Icon src={collection.icon} />
+            <div className="ml-3 w-0 grow">
+              <div className="flex h-5 items-center">
+                <Title title={collection.label[language]} />
+              </div>
+              <div className='mb-1 flex h-4 items-center justify-between'>
+                <OrgInfo
+                  className="mt-0.5"
+                  packageNameClassName='w-auto'
+                  orgName={collection.author}
+                  packageName={collection.name}
+                />
+              </div>
+            </div>
+            <div className='flex gap-1'>
+              <ActionButton onClick={onHide}>
+                <RiCloseLine className='h-4 w-4' />
+              </ActionButton>
+            </div>
+          </div>
+        </div>
+        {!!collection.description[language] && (
+          <Description text={collection.description[language]} descriptionLineRows={2}></Description>
+        )}
+        <div className='flex gap-1 border-b-[0.5px] border-divider-subtle'>
+          {collection.type === CollectionType.custom && !isDetailLoading && (
+            <Button
+              className={cn('my-3 w-full shrink-0')}
+              onClick={() => setIsShowEditCustomCollectionModal(true)}
+            >
+              <Settings01 className='mr-1 h-4 w-4 text-text-tertiary' />
+              <div className='system-sm-medium text-text-secondary'>{t('tools.createTool.editAction')}</div>
+            </Button>
+          )}
+          {collection.type === CollectionType.workflow && !isDetailLoading && customCollection && (
+            <>
+              <Button
+                variant='primary'
+                className={cn('my-3 w-[183px] shrink-0')}
+              >
+                <Link className='flex items-center' href={`/app/${(customCollection as WorkflowToolProviderResponse).workflow_app_id}/workflow`} rel='noreferrer' target='_blank'>
+                  <div className='system-sm-medium'>{t('tools.openInStudio')}</div>
+                  <LinkExternal02 className='ml-1 h-4 w-4' />
+                </Link>
+              </Button>
+              <Button
+                className={cn('my-3 w-[183px] shrink-0')}
+                onClick={() => setIsShowEditWorkflowToolModal(true)}
+                disabled={!isCurrentWorkspaceManager}
+              >
+                <div className='system-sm-medium text-text-secondary'>{t('tools.createTool.editAction')}</div>
+              </Button>
+            </>
+          )}
+        </div>
+        <div className='flex min-h-0 flex-1 flex-col pt-3'>
+          {isDetailLoading && <div className='flex h-[200px]'><Loading type='app' /></div>}
+          {!isDetailLoading && (
+            <>
+              <div className="shrink-0">
+                {(collection.type === CollectionType.builtIn || collection.type === CollectionType.model) && isAuthed && (
+                  <div className='system-sm-semibold-uppercase mb-1 flex h-6 items-center justify-between text-text-secondary'>
+                    {t('plugin.detailPanel.actionNum', { num: toolList.length, action: toolList.length > 1 ? 'actions' : 'action' })}
+                    {needAuth && (
+                      <Button
+                        variant='secondary'
+                        size='small'
+                        onClick={() => {
+                          if (collection.type === CollectionType.builtIn || collection.type === CollectionType.model)
+                            showSettingAuthModal()
+                        }}
+                        disabled={!isCurrentWorkspaceManager}
+                      >
+                        <Indicator className='mr-2' color={'green'} />
+                        {t('tools.auth.authorized')}
+                      </Button>
+                    )}
+                  </div>
+                )}
+                {(collection.type === CollectionType.builtIn || collection.type === CollectionType.model) && needAuth && !isAuthed && (
+                  <>
+                    <div className='system-sm-semibold-uppercase text-text-secondary'>
+                      <span className=''>{t('tools.includeToolNum', { num: toolList.length, action: toolList.length > 1 ? 'actions' : 'action' }).toLocaleUpperCase()}</span>
+                      <span className='px-1'>路</span>
+                      <span className='text-util-colors-orange-orange-600'>{t('tools.auth.setup').toLocaleUpperCase()}</span>
+                    </div>
+                    <Button
+                      variant='primary'
+                      className={cn('my-3 w-full shrink-0')}
+                      onClick={() => {
+                        if (collection.type === CollectionType.builtIn || collection.type === CollectionType.model)
+                          showSettingAuthModal()
+                      }}
+                      disabled={!isCurrentWorkspaceManager}
+                    >
+                      {t('tools.auth.unauthorized')}
+                    </Button>
+                  </>
+                )}
+                {(collection.type === CollectionType.custom) && (
+                  <div className='system-sm-semibold-uppercase text-text-secondary'>
+                    <span className=''>{t('tools.includeToolNum', { num: toolList.length, action: toolList.length > 1 ? 'actions' : 'action' }).toLocaleUpperCase()}</span>
+                  </div>
+                )}
+                {(collection.type === CollectionType.workflow) && (
+                  <div className='system-sm-semibold-uppercase text-text-secondary'>
+                    <span className=''>{t('tools.createTool.toolInput.title').toLocaleUpperCase()}</span>
+                  </div>
+                )}
+              </div>
+              <div className='mt-1 flex-1 overflow-y-auto py-2'>
+                {collection.type !== CollectionType.workflow && toolList.map(tool => (
+                  <ToolItem
+                    key={tool.name}
+                    disabled={false}
+                    collection={collection}
+                    tool={tool}
+                    isBuiltIn={isBuiltIn}
+                    isModel={isModel}
+                  />
+                ))}
+                {collection.type === CollectionType.workflow && (customCollection as WorkflowToolProviderResponse)?.tool?.parameters.map(item => (
+                  <div key={item.name} className='mb-1 py-1'>
+                    <div className='mb-1 flex items-center gap-2'>
+                      <span className='code-sm-semibold text-text-secondary'>{item.name}</span>
+                      <span className='system-xs-regular text-text-tertiary'>{item.type}</span>
+                      <span className='system-xs-medium text-text-warning-secondary'>{item.required ? t('tools.createTool.toolInput.required') : ''}</span>
+                    </div>
+                    <div className='system-xs-regular text-text-tertiary'>{item.llm_description}</div>
+                  </div>
+                ))}
+              </div>
+            </>
+          )}
+        </div>
+        {showSettingAuth && (
+          <ConfigCredential
+            collection={collection}
+            onCancel={() => setShowSettingAuth(false)}
+            onSaved={async (value) => {
+              await updateBuiltInToolCredential(collection.name, value)
+              Toast.notify({
+                type: 'success',
+                message: t('common.api.actionSuccess'),
+              })
+              await onRefreshData()
+              setShowSettingAuth(false)
+            }}
+            onRemove={async () => {
+              await removeBuiltInToolCredential(collection.name)
+              Toast.notify({
+                type: 'success',
+                message: t('common.api.actionSuccess'),
+              })
+              await onRefreshData()
+              setShowSettingAuth(false)
+            }}
+          />
+        )}
+        {isShowEditCollectionToolModal && (
+          <EditCustomToolModal
+            payload={customCollection}
+            onHide={() => setIsShowEditCustomCollectionModal(false)}
+            onEdit={doUpdateCustomToolCollection}
+            onRemove={onClickCustomToolDelete}
+          />
+        )}
+        {isShowEditWorkflowToolModal && (
+          <WorkflowToolModal
+            payload={customCollection}
+            onHide={() => setIsShowEditWorkflowToolModal(false)}
+            onRemove={onClickWorkflowToolDelete}
+            onSave={updateWorkflowToolProvider}
+          />
+        )}
+        {showConfirmDelete && (
+          <Confirm
+            title={t('tools.createTool.deleteToolConfirmTitle')}
+            content={t('tools.createTool.deleteToolConfirmContent')}
+            isShow={showConfirmDelete}
+            onConfirm={handleConfirmDelete}
+            onCancel={() => setShowConfirmDelete(false)}
+          />
+        )}
+      </div>
+    </Drawer>
+  )
+}
+export default ProviderDetail
diff --git a/app/components/tools/provider/tool-item.tsx b/app/components/tools/provider/tool-item.tsx
new file mode 100644
index 0000000..161b629
--- /dev/null
+++ b/app/components/tools/provider/tool-item.tsx
@@ -0,0 +1,54 @@
+'use client'
+import React, { useState } from 'react'
+import { useContext } from 'use-context-selector'
+import type { Collection, Tool } from '../types'
+import cn from '@/utils/classnames'
+import I18n from '@/context/i18n'
+import { getLanguage } from '@/i18n/language'
+import SettingBuiltInTool from '@/app/components/app/configuration/config/agent/agent-tools/setting-built-in-tool'
+
+type Props = {
+  disabled?: boolean
+  collection: Collection
+  tool: Tool
+  isBuiltIn: boolean
+  isModel: boolean
+}
+
+const ToolItem = ({
+  disabled,
+  collection,
+  tool,
+  isBuiltIn,
+  isModel,
+}: Props) => {
+  const { locale } = useContext(I18n)
+  const language = getLanguage(locale)
+  const [showDetail, setShowDetail] = useState(false)
+
+  return (
+    <>
+      <div
+        className={cn('bg-components-panel-item-bg mb-2 cursor-pointer rounded-xl border-[0.5px] border-components-panel-border-subtle px-4 py-3 shadow-xs hover:bg-components-panel-on-panel-item-bg-hover', disabled && '!cursor-not-allowed opacity-50')}
+        onClick={() => !disabled && setShowDetail(true)}
+      >
+        <div className='system-md-semibold pb-0.5 text-text-secondary'>{tool.label[language]}</div>
+        <div className='system-xs-regular line-clamp-2 text-text-tertiary' title={tool.description[language]}>{tool.description[language]}</div>
+      </div>
+      {showDetail && (
+        <SettingBuiltInTool
+          showBackButton
+          collection={collection}
+          toolName={tool.name}
+          readonly
+          onHide={() => {
+            setShowDetail(false)
+          }}
+          isBuiltIn={isBuiltIn}
+          isModel={isModel}
+        />
+      )}
+    </>
+  )
+}
+export default ToolItem
diff --git a/app/components/tools/setting/build-in/config-credentials.tsx b/app/components/tools/setting/build-in/config-credentials.tsx
new file mode 100644
index 0000000..3ce3f62
--- /dev/null
+++ b/app/components/tools/setting/build-in/config-credentials.tsx
@@ -0,0 +1,130 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { addDefaultValue, toolCredentialToFormSchemas } from '../../utils/to-form-schema'
+import type { Collection } from '../../types'
+import cn from '@/utils/classnames'
+import Drawer from '@/app/components/base/drawer-plus'
+import Button from '@/app/components/base/button'
+import Toast from '@/app/components/base/toast'
+import { fetchBuiltInToolCredential, fetchBuiltInToolCredentialSchema } from '@/service/tools'
+import Loading from '@/app/components/base/loading'
+import Form from '@/app/components/header/account-setting/model-provider-page/model-modal/Form'
+import { LinkExternal02 } from '@/app/components/base/icons/src/vender/line/general'
+import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { noop } from 'lodash-es'
+
+type Props = {
+  collection: Collection
+  onCancel: () => void
+  onSaved: (value: Record<string, any>) => void
+  isHideRemoveBtn?: boolean
+  onRemove?: () => void
+  isSaving?: boolean
+}
+
+const ConfigCredential: FC<Props> = ({
+  collection,
+  onCancel,
+  onSaved,
+  isHideRemoveBtn,
+  onRemove = noop,
+  isSaving,
+}) => {
+  const { t } = useTranslation()
+  const language = useLanguage()
+  const [credentialSchema, setCredentialSchema] = useState<any>(null)
+  const { name: collectionName } = collection
+  const [tempCredential, setTempCredential] = React.useState<any>({})
+  const [isLoading, setIsLoading] = React.useState(false)
+  useEffect(() => {
+    fetchBuiltInToolCredentialSchema(collectionName).then(async (res) => {
+      const toolCredentialSchemas = toolCredentialToFormSchemas(res)
+      const credentialValue = await fetchBuiltInToolCredential(collectionName)
+      setTempCredential(credentialValue)
+      const defaultCredentials = addDefaultValue(credentialValue, toolCredentialSchemas)
+      setCredentialSchema(toolCredentialSchemas)
+      setTempCredential(defaultCredentials)
+    })
+  }, [])
+
+  const handleSave = async () => {
+    for (const field of credentialSchema) {
+      if (field.required && !tempCredential[field.name]) {
+        Toast.notify({ type: 'error', message: t('common.errorMsg.fieldRequired', { field: field.label[language] || field.label.en_US }) })
+        return
+      }
+    }
+    setIsLoading(true)
+    try {
+      await onSaved(tempCredential)
+      setIsLoading(false)
+    }
+    finally {
+      setIsLoading(false)
+    }
+  }
+
+  return (
+    <Drawer
+      isShow
+      onHide={onCancel}
+      title={t('tools.auth.setupModalTitle') as string}
+      titleDescription={t('tools.auth.setupModalTitleDescription') as string}
+      panelClassName='mt-[64px] mb-2 !w-[420px] border-components-panel-border'
+      maxWidthClassName='!max-w-[420px]'
+      height='calc(100vh - 64px)'
+      contentClassName='!bg-components-panel-bg'
+      headerClassName='!border-b-divider-subtle'
+      body={
+
+        <div className='h-full px-6 py-3'>
+          {!credentialSchema
+            ? <Loading type='app' />
+            : (
+              <>
+                <Form
+                  value={tempCredential}
+                  onChange={(v) => {
+                    setTempCredential(v)
+                  }}
+                  formSchemas={credentialSchema}
+                  isEditMode={true}
+                  showOnVariableMap={{}}
+                  validating={false}
+                  inputClassName='!bg-components-input-bg-normal'
+                  fieldMoreInfo={item => item.url
+                    ? (<a
+                      href={item.url}
+                      target='_blank' rel='noopener noreferrer'
+                      className='inline-flex items-center text-xs text-text-accent'
+                    >
+                      {t('tools.howToGet')}
+                      <LinkExternal02 className='ml-1 h-3 w-3' />
+                    </a>)
+                    : null}
+                />
+                <div className={cn((collection.is_team_authorization && !isHideRemoveBtn) ? 'justify-between' : 'justify-end', 'mt-2 flex ')} >
+                  {
+                    (collection.is_team_authorization && !isHideRemoveBtn) && (
+                      <Button onClick={onRemove}>{t('common.operation.remove')}</Button>
+                    )
+                  }
+                  < div className='flex space-x-2'>
+                    <Button onClick={onCancel}>{t('common.operation.cancel')}</Button>
+                    <Button loading={isLoading || isSaving} disabled={isLoading || isSaving} variant='primary' onClick={handleSave}>{t('common.operation.save')}</Button>
+                  </div>
+                </div>
+              </>
+            )
+          }
+
+        </div >
+      }
+      isShowMask={true}
+      clickOutsideNotOpen={false}
+    />
+  )
+}
+export default React.memo(ConfigCredential)
diff --git a/app/components/tools/types.ts b/app/components/tools/types.ts
new file mode 100644
index 0000000..32c468c
--- /dev/null
+++ b/app/components/tools/types.ts
@@ -0,0 +1,170 @@
+import type { TypeWithI18N } from '../header/account-setting/model-provider-page/declarations'
+
+export enum LOC {
+  tools = 'tools',
+  app = 'app',
+}
+
+export enum AuthType {
+  none = 'none',
+  apiKey = 'api_key',
+}
+
+export enum AuthHeaderPrefix {
+  basic = 'basic',
+  bearer = 'bearer',
+  custom = 'custom',
+}
+
+export type Credential = {
+  auth_type: AuthType
+  api_key_header?: string
+  api_key_value?: string
+  api_key_header_prefix?: AuthHeaderPrefix
+}
+
+export enum CollectionType {
+  all = 'all',
+  builtIn = 'builtin',
+  custom = 'api',
+  model = 'model',
+  workflow = 'workflow',
+}
+
+export type Emoji = {
+  background: string
+  content: string
+}
+
+export type Collection = {
+  id: string
+  name: string
+  author: string
+  description: TypeWithI18N
+  icon: string | Emoji
+  label: TypeWithI18N
+  type: CollectionType
+  team_credentials: Record<string, any>
+  is_team_authorization: boolean
+  allow_delete: boolean
+  labels: string[]
+  plugin_id?: string
+  letter?: string
+}
+
+export type ToolParameter = {
+  name: string
+  label: TypeWithI18N
+  human_description: TypeWithI18N
+  type: string
+  form: string
+  llm_description: string
+  required: boolean
+  default: string
+  options?: {
+    label: TypeWithI18N
+    value: string
+  }[]
+  min?: number
+  max?: number
+}
+
+// Action
+export type Tool = {
+  name: string
+  author: string
+  label: TypeWithI18N
+  description: any
+  parameters: ToolParameter[]
+  labels: string[]
+  output_schema: Record<string, any>
+}
+
+export type ToolCredential = {
+  name: string
+  label: TypeWithI18N
+  help: TypeWithI18N | null
+  placeholder: TypeWithI18N
+  type: string
+  required: boolean
+  default: string
+  options?: {
+    label: TypeWithI18N
+    value: string
+  }[]
+}
+
+export type CustomCollectionBackend = {
+  provider: string
+  original_provider?: string
+  credentials: Credential
+  icon: Emoji
+  schema_type: string
+  schema: string
+  privacy_policy: string
+  custom_disclaimer: string
+  tools?: ParamItem[]
+  id: string
+  labels: string[]
+}
+
+export type ParamItem = {
+  name: string
+  label: TypeWithI18N
+  human_description: TypeWithI18N
+  llm_description: string
+  type: string
+  form: string
+  required: boolean
+  default: string
+  min?: number
+  max?: number
+  options?: {
+    label: TypeWithI18N
+    value: string
+  }[]
+}
+
+export type CustomParamSchema = {
+  operation_id: string // name
+  summary: string
+  server_url: string
+  method: string
+  parameters: ParamItem[]
+}
+
+export type WorkflowToolProviderParameter = {
+  name: string
+  form: string
+  description: string
+  required?: boolean
+  type?: string
+}
+
+export type WorkflowToolProviderRequest = {
+  name: string
+  icon: Emoji
+  description: string
+  parameters: WorkflowToolProviderParameter[]
+  labels: string[]
+  privacy_policy: string
+}
+
+export type WorkflowToolProviderResponse = {
+  workflow_app_id: string
+  workflow_tool_id: string
+  label: string
+  name: string
+  icon: Emoji
+  description: string
+  synced: boolean
+  tool: {
+    author: string
+    name: string
+    label: TypeWithI18N
+    description: TypeWithI18N
+    labels: string[]
+    parameters: ParamItem[]
+  }
+  privacy_policy: string
+}
diff --git a/app/components/tools/utils/index.ts b/app/components/tools/utils/index.ts
new file mode 100644
index 0000000..ced9ca1
--- /dev/null
+++ b/app/components/tools/utils/index.ts
@@ -0,0 +1,27 @@
+import type { ThoughtItem } from '@/app/components/base/chat/chat/type'
+import type { FileEntity } from '@/app/components/base/file-uploader/types'
+import type { VisionFile } from '@/types/app'
+
+export const sortAgentSorts = (list: ThoughtItem[]) => {
+  if (!list)
+    return list
+  if (list.some(item => item.position === undefined))
+    return list
+  const temp = [...list]
+  temp.sort((a, b) => a.position - b.position)
+  return temp
+}
+
+export const addFileInfos = (list: ThoughtItem[], messageFiles: (FileEntity | VisionFile)[]) => {
+  if (!list || !messageFiles)
+    return list
+  return list.map((item) => {
+    if (item.files && item.files?.length > 0) {
+      return {
+        ...item,
+        message_files: item.files.map(fileId => messageFiles.find(file => file.id === fileId)) as FileEntity[],
+      }
+    }
+    return item
+  })
+}
diff --git a/app/components/tools/utils/to-form-schema.ts b/app/components/tools/utils/to-form-schema.ts
new file mode 100644
index 0000000..179f590
--- /dev/null
+++ b/app/components/tools/utils/to-form-schema.ts
@@ -0,0 +1,96 @@
+import type { ToolCredential, ToolParameter } from '../types'
+export const toType = (type: string) => {
+  switch (type) {
+    case 'string':
+      return 'text-input'
+    case 'number':
+      return 'number-input'
+    default:
+      return type
+  }
+}
+export const toolParametersToFormSchemas = (parameters: ToolParameter[]) => {
+  if (!parameters)
+    return []
+
+  const formSchemas = parameters.map((parameter) => {
+    return {
+      ...parameter,
+      variable: parameter.name,
+      type: toType(parameter.type),
+      _type: parameter.type,
+      show_on: [],
+      options: parameter.options?.map((option) => {
+        return {
+          ...option,
+          show_on: [],
+        }
+      }),
+      tooltip: parameter.human_description,
+    }
+  })
+  return formSchemas
+}
+
+export const toolCredentialToFormSchemas = (parameters: ToolCredential[]) => {
+  if (!parameters)
+    return []
+
+  const formSchemas = parameters.map((parameter) => {
+    return {
+      ...parameter,
+      variable: parameter.name,
+      label: parameter.label,
+      tooltip: parameter.help,
+      show_on: [],
+      options: parameter.options?.map((option) => {
+        return {
+          ...option,
+          show_on: [],
+        }
+      }),
+    }
+  })
+  return formSchemas
+}
+
+export const addDefaultValue = (value: Record<string, any>, formSchemas: { variable: string; default?: any }[]) => {
+  const newValues = { ...value }
+  formSchemas.forEach((formSchema) => {
+    const itemValue = value[formSchema.variable]
+    if ((formSchema.default !== undefined) && (value === undefined || itemValue === null || itemValue === '' || itemValue === undefined))
+      newValues[formSchema.variable] = formSchema.default
+  })
+  return newValues
+}
+
+export const generateFormValue = (value: Record<string, any>, formSchemas: { variable: string; default?: any }[], isReasoning = false) => {
+  const newValues = {} as any
+  formSchemas.forEach((formSchema) => {
+    const itemValue = value[formSchema.variable]
+    if ((formSchema.default !== undefined) && (value === undefined || itemValue === null || itemValue === '' || itemValue === undefined)) {
+      newValues[formSchema.variable] = {
+        ...(isReasoning ? { value: null, auto: 1 } : { value: formSchema.default }),
+      }
+    }
+  })
+  return newValues
+}
+
+export const getPlainValue = (value: Record<string, any>) => {
+  const plainValue = { ...value }
+  Object.keys(plainValue).forEach((key) => {
+    plainValue[key] = value[key].value
+  })
+  return plainValue
+}
+
+export const getStructureValue = (value: Record<string, any>) => {
+  const newValue = { ...value } as any
+  Object.keys(newValue).forEach((key) => {
+    newValue[key] = {
+      value: value[key],
+    }
+  })
+  return newValue
+}
diff --git a/app/components/tools/workflow-tool/configure-button.tsx b/app/components/tools/workflow-tool/configure-button.tsx
new file mode 100644
index 0000000..0c72f82
--- /dev/null
+++ b/app/components/tools/workflow-tool/configure-button.tsx
@@ -0,0 +1,258 @@
+'use client'
+import React, { useCallback, useEffect, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useRouter } from 'next/navigation'
+import { RiArrowRightUpLine, RiHammerLine } from '@remixicon/react'
+import Divider from '../../base/divider'
+import cn from '@/utils/classnames'
+import Button from '@/app/components/base/button'
+import Indicator from '@/app/components/header/indicator'
+import WorkflowToolModal from '@/app/components/tools/workflow-tool'
+import Loading from '@/app/components/base/loading'
+import Toast from '@/app/components/base/toast'
+import { createWorkflowToolProvider, fetchWorkflowToolDetailByAppID, saveWorkflowToolProvider } from '@/service/tools'
+import type { Emoji, WorkflowToolProviderParameter, WorkflowToolProviderRequest, WorkflowToolProviderResponse } from '@/app/components/tools/types'
+import type { InputVar } from '@/app/components/workflow/types'
+import type { PublishWorkflowParams } from '@/types/workflow'
+import { useAppContext } from '@/context/app-context'
+import { useInvalidateAllWorkflowTools } from '@/service/use-tools'
+
+type Props = {
+  disabled: boolean
+  published: boolean
+  detailNeedUpdate: boolean
+  workflowAppId: string
+  icon: Emoji
+  name: string
+  description: string
+  inputs?: InputVar[]
+  handlePublish: (params?: PublishWorkflowParams) => Promise<void>
+  onRefreshData?: () => void
+}
+
+const WorkflowToolConfigureButton = ({
+  disabled,
+  published,
+  detailNeedUpdate,
+  workflowAppId,
+  icon,
+  name,
+  description,
+  inputs,
+  handlePublish,
+  onRefreshData,
+}: Props) => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const [showModal, setShowModal] = useState(false)
+  const [isLoading, setIsLoading] = useState(false)
+  const [detail, setDetail] = useState<WorkflowToolProviderResponse>()
+  const { isCurrentWorkspaceManager } = useAppContext()
+  const invalidateAllWorkflowTools = useInvalidateAllWorkflowTools()
+
+  const outdated = useMemo(() => {
+    if (!detail)
+      return false
+    if (detail.tool.parameters.length !== inputs?.length) {
+      return true
+    }
+    else {
+      for (const item of inputs || []) {
+        const param = detail.tool.parameters.find(toolParam => toolParam.name === item.variable)
+        if (!param) {
+          return true
+        }
+        else if (param.required !== item.required) {
+          return true
+        }
+        else {
+          if (item.type === 'paragraph' && param.type !== 'string')
+            return true
+          if (item.type === 'text-input' && param.type !== 'string')
+            return true
+        }
+      }
+    }
+    return false
+  }, [detail, inputs])
+
+  const payload = useMemo(() => {
+    let parameters: WorkflowToolProviderParameter[] = []
+    if (!published) {
+      parameters = (inputs || []).map((item) => {
+        return {
+          name: item.variable,
+          description: '',
+          form: 'llm',
+          required: item.required,
+          type: item.type,
+        }
+      })
+    }
+    else if (detail && detail.tool) {
+      parameters = (inputs || []).map((item) => {
+        return {
+          name: item.variable,
+          required: item.required,
+          type: item.type === 'paragraph' ? 'string' : item.type,
+          description: detail.tool.parameters.find(param => param.name === item.variable)?.llm_description || '',
+          form: detail.tool.parameters.find(param => param.name === item.variable)?.form || 'llm',
+        }
+      })
+    }
+    return {
+      icon: detail?.icon || icon,
+      label: detail?.label || name,
+      name: detail?.name || '',
+      description: detail?.description || description,
+      parameters,
+      labels: detail?.tool?.labels || [],
+      privacy_policy: detail?.privacy_policy || '',
+      ...(published
+        ? {
+          workflow_tool_id: detail?.workflow_tool_id,
+        }
+        : {
+          workflow_app_id: workflowAppId,
+        }),
+    }
+  }, [detail, published, workflowAppId, icon, name, description, inputs])
+
+  const getDetail = useCallback(async (workflowAppId: string) => {
+    setIsLoading(true)
+    const res = await fetchWorkflowToolDetailByAppID(workflowAppId)
+    setDetail(res)
+    setIsLoading(false)
+  }, [])
+
+  useEffect(() => {
+    if (published)
+      getDetail(workflowAppId)
+  }, [getDetail, published, workflowAppId])
+
+  useEffect(() => {
+    if (detailNeedUpdate)
+      getDetail(workflowAppId)
+  }, [detailNeedUpdate, getDetail, workflowAppId])
+
+  const createHandle = async (data: WorkflowToolProviderRequest & { workflow_app_id: string }) => {
+    try {
+      await createWorkflowToolProvider(data)
+      invalidateAllWorkflowTools()
+      onRefreshData?.()
+      getDetail(workflowAppId)
+      Toast.notify({
+        type: 'success',
+        message: t('common.api.actionSuccess'),
+      })
+      setShowModal(false)
+    }
+    catch (e) {
+      Toast.notify({ type: 'error', message: (e as Error).message })
+    }
+  }
+
+  const updateWorkflowToolProvider = async (data: WorkflowToolProviderRequest & Partial<{
+    workflow_app_id: string
+    workflow_tool_id: string
+  }>) => {
+    try {
+      await handlePublish()
+      await saveWorkflowToolProvider(data)
+      onRefreshData?.()
+      invalidateAllWorkflowTools()
+      getDetail(workflowAppId)
+      Toast.notify({
+        type: 'success',
+        message: t('common.api.actionSuccess'),
+      })
+      setShowModal(false)
+    }
+    catch (e) {
+      Toast.notify({ type: 'error', message: (e as Error).message })
+    }
+  }
+
+  return (
+    <>
+      <Divider type='horizontal' className='h-[1px] bg-divider-subtle' />
+      {(!published || !isLoading) && (
+        <div className={cn(
+          'group rounded-lg bg-background-section-burn transition-colors',
+          disabled ? 'cursor-not-allowed opacity-30 shadow-xs' : 'cursor-pointer',
+          !disabled && !published && 'hover:bg-state-accent-hover',
+        )}>
+          {isCurrentWorkspaceManager
+            ? (
+              <div
+                className='flex items-center justify-start gap-2 p-2 pl-2.5'
+                onClick={() => !disabled && !published && setShowModal(true)}
+              >
+                <RiHammerLine className={cn('relative h-4 w-4 text-text-secondary', !disabled && !published && 'group-hover:text-text-accent')} />
+                <div
+                  title={t('workflow.common.workflowAsTool') || ''}
+                  className={cn('system-sm-medium shrink grow basis-0 truncate text-text-secondary', !disabled && !published && 'group-hover:text-text-accent')}
+                >
+                  {t('workflow.common.workflowAsTool')}
+                </div>
+                {!published && (
+                  <span className='system-2xs-medium-uppercase shrink-0 rounded-[5px] border border-divider-deep bg-components-badge-bg-dimm px-1 py-0.5 text-text-tertiary'>
+                    {t('workflow.common.configureRequired')}
+                  </span>
+                )}
+              </div>)
+            : (
+              <div
+                className='flex items-center justify-start gap-2 p-2 pl-2.5'
+              >
+                <RiHammerLine className='h-4 w-4 text-text-tertiary' />
+                <div
+                  title={t('workflow.common.workflowAsTool') || ''}
+                  className='system-sm-medium shrink grow basis-0 truncate text-text-tertiary'
+                >
+                  {t('workflow.common.workflowAsTool')}
+                </div>
+              </div>
+            )}
+          {published && (
+            <div className='border-t-[0.5px] border-divider-regular px-2.5 py-2'>
+              <div className='flex justify-between gap-x-2'>
+                <Button
+                  size='small'
+                  className='w-[140px]'
+                  onClick={() => setShowModal(true)}
+                  disabled={!isCurrentWorkspaceManager}
+                >
+                  {t('workflow.common.configure')}
+                  {outdated && <Indicator className='ml-1' color={'yellow'} />}
+                </Button>
+                <Button
+                  size='small'
+                  className='w-[140px]'
+                  onClick={() => router.push('/tools?category=workflow')}
+                >
+                  {t('workflow.common.manageInTools')}
+                  <RiArrowRightUpLine className='ml-1 h-4 w-4' />
+                </Button>
+              </div>
+              {outdated && <div className='mt-1 text-xs leading-[18px] text-text-warning'>
+                {t('workflow.common.workflowAsToolTip')}
+              </div>}
+            </div>
+          )}
+        </div>
+      )}
+      {published && isLoading && <div className='pt-2'><Loading type='app' /></div>}
+      {showModal && (
+        <WorkflowToolModal
+          isAdd={!published}
+          payload={payload}
+          onHide={() => setShowModal(false)}
+          onCreate={createHandle}
+          onSave={updateWorkflowToolProvider}
+        />
+      )}
+    </>
+  )
+}
+export default WorkflowToolConfigureButton
diff --git a/app/components/tools/workflow-tool/confirm-modal/index.tsx b/app/components/tools/workflow-tool/confirm-modal/index.tsx
new file mode 100644
index 0000000..1327adc
--- /dev/null
+++ b/app/components/tools/workflow-tool/confirm-modal/index.tsx
@@ -0,0 +1,46 @@
+'use client'
+
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import Button from '@/app/components/base/button'
+import Modal from '@/app/components/base/modal'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback'
+import { noop } from 'lodash-es'
+
+type ConfirmModalProps = {
+  show: boolean
+  onConfirm?: () => void
+  onClose: () => void
+}
+
+const ConfirmModal = ({ show, onConfirm, onClose }: ConfirmModalProps) => {
+  const { t } = useTranslation()
+
+  return (
+    <Modal
+      className={cn('w-[600px] max-w-[600px] p-8')}
+      isShow={show}
+      onClose={noop}
+    >
+      <div className='absolute right-4 top-4 cursor-pointer p-2' onClick={onClose}>
+        <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+      </div>
+      <div className='h-12 w-12 rounded-xl border-[0.5px] border-divider-regular bg-background-section p-3 shadow-xl'>
+        <AlertTriangle className='h-6 w-6 text-[rgb(247,144,9)]' />
+      </div>
+      <div className='relative mt-3 text-xl font-semibold leading-[30px] text-text-primary'>{t('tools.createTool.confirmTitle')}</div>
+      <div className='my-1 text-sm leading-5 text-text-tertiary'>
+        {t('tools.createTool.confirmTip')}
+      </div>
+      <div className='flex items-center justify-end pt-6'>
+        <div className='flex items-center'>
+          <Button className='mr-2' onClick={onClose}>{t('common.operation.cancel')}</Button>
+          <Button variant="warning" onClick={onConfirm}>{t('common.operation.confirm')}</Button>
+        </div>
+      </div>
+    </Modal>
+  )
+}
+
+export default ConfirmModal
diff --git a/app/components/tools/workflow-tool/index.tsx b/app/components/tools/workflow-tool/index.tsx
new file mode 100644
index 0000000..30afc1a
--- /dev/null
+++ b/app/components/tools/workflow-tool/index.tsx
@@ -0,0 +1,282 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import type { Emoji, WorkflowToolProviderParameter, WorkflowToolProviderRequest } from '../types'
+import cn from '@/utils/classnames'
+import Drawer from '@/app/components/base/drawer-plus'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import Button from '@/app/components/base/button'
+import Toast from '@/app/components/base/toast'
+import EmojiPicker from '@/app/components/base/emoji-picker'
+import AppIcon from '@/app/components/base/app-icon'
+import MethodSelector from '@/app/components/tools/workflow-tool/method-selector'
+import LabelSelector from '@/app/components/tools/labels/selector'
+import ConfirmModal from '@/app/components/tools/workflow-tool/confirm-modal'
+import Tooltip from '@/app/components/base/tooltip'
+
+type Props = {
+  isAdd?: boolean
+  payload: any
+  onHide: () => void
+  onRemove?: () => void
+  onCreate?: (payload: WorkflowToolProviderRequest & { workflow_app_id: string }) => void
+  onSave?: (payload: WorkflowToolProviderRequest & Partial<{
+    workflow_app_id: string
+    workflow_tool_id: string
+  }>) => void
+}
+// Add and Edit
+const WorkflowToolAsModal: FC<Props> = ({
+  isAdd,
+  payload,
+  onHide,
+  onRemove,
+  onSave,
+  onCreate,
+}) => {
+  const { t } = useTranslation()
+
+  const [showEmojiPicker, setShowEmojiPicker] = useState<boolean>(false)
+  const [emoji, setEmoji] = useState<Emoji>(payload.icon)
+  const [label, setLabel] = useState<string>(payload.label)
+  const [name, setName] = useState(payload.name)
+  const [description, setDescription] = useState(payload.description)
+  const [parameters, setParameters] = useState<WorkflowToolProviderParameter[]>(payload.parameters)
+  const handleParameterChange = (key: string, value: string, index: number) => {
+    const newData = produce(parameters, (draft: WorkflowToolProviderParameter[]) => {
+      if (key === 'description')
+        draft[index].description = value
+      else
+        draft[index].form = value
+    })
+    setParameters(newData)
+  }
+  const [labels, setLabels] = useState<string[]>(payload.labels)
+  const handleLabelSelect = (value: string[]) => {
+    setLabels(value)
+  }
+  const [privacyPolicy, setPrivacyPolicy] = useState(payload.privacy_policy)
+  const [showModal, setShowModal] = useState(false)
+
+  const isNameValid = (name: string) => {
+    // when the user has not input anything, no need for a warning
+    if (name === '')
+      return true
+
+    return /^\w+$/.test(name)
+  }
+
+  const onConfirm = () => {
+    let errorMessage = ''
+    if (!label)
+      errorMessage = t('common.errorMsg.fieldRequired', { field: t('tools.createTool.name') })
+
+    if (!name)
+      errorMessage = t('common.errorMsg.fieldRequired', { field: t('tools.createTool.nameForToolCall') })
+
+    if (!isNameValid(name))
+      errorMessage = t('tools.createTool.nameForToolCall') + t('tools.createTool.nameForToolCallTip')
+
+    if (errorMessage) {
+      Toast.notify({
+        type: 'error',
+        message: errorMessage,
+      })
+      return
+    }
+
+    const requestParams = {
+      name,
+      description,
+      icon: emoji,
+      label,
+      parameters: parameters.map(item => ({
+        name: item.name,
+        description: item.description,
+        form: item.form,
+      })),
+      labels,
+      privacy_policy: privacyPolicy,
+    }
+    if (!isAdd) {
+      onSave?.({
+        ...requestParams,
+        workflow_tool_id: payload.workflow_tool_id,
+      })
+    }
+    else {
+      onCreate?.({
+        ...requestParams,
+        workflow_app_id: payload.workflow_app_id,
+      })
+    }
+  }
+
+  return (
+    <>
+      <Drawer
+        isShow
+        onHide={onHide}
+        title={t('workflow.common.workflowAsTool')!}
+        panelClassName='mt-2 !w-[640px]'
+        maxWidthClassName='!max-w-[640px]'
+        height='calc(100vh - 16px)'
+        headerClassName='!border-b-divider'
+        body={
+          <div className='flex h-full flex-col'>
+            <div className='h-0 grow space-y-4 overflow-y-auto px-6 py-3'>
+              {/* name & icon */}
+              <div>
+                <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.name')} <span className='ml-1 text-red-500'>*</span></div>
+                <div className='flex items-center justify-between gap-3'>
+                  <AppIcon size='large' onClick={() => { setShowEmojiPicker(true) }} className='cursor-pointer' iconType='emoji' icon={emoji.content} background={emoji.background} />
+                  <Input
+                    className='h-10 grow'
+                    placeholder={t('tools.createTool.toolNamePlaceHolder')!}
+                    value={label}
+                    onChange={e => setLabel(e.target.value)}
+                  />
+                </div>
+              </div>
+              {/* name for tool call */}
+              <div>
+                <div className='system-sm-medium flex items-center py-2 text-text-primary'>
+                  {t('tools.createTool.nameForToolCall')} <span className='ml-1 text-red-500'>*</span>
+                  <Tooltip
+                    popupContent={
+                      <div className='w-[180px]'>
+                        {t('tools.createTool.nameForToolCallPlaceHolder')}
+                      </div>
+                    }
+                  />
+                </div>
+                <Input
+                  className='h-10'
+                  placeholder={t('tools.createTool.nameForToolCallPlaceHolder')!}
+                  value={name}
+                  onChange={e => setName(e.target.value)}
+                />
+                {!isNameValid(name) && (
+                  <div className='text-xs leading-[18px] text-red-500'>{t('tools.createTool.nameForToolCallTip')}</div>
+                )}
+              </div>
+              {/* description */}
+              <div>
+                <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.description')}</div>
+                <Textarea
+                  placeholder={t('tools.createTool.descriptionPlaceholder') || ''}
+                  value={description}
+                  onChange={e => setDescription(e.target.value)}
+                />
+              </div>
+              {/* Tool Input  */}
+              <div>
+                <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.toolInput.title')}</div>
+                <div className='w-full overflow-x-auto rounded-lg border border-divider-regular'>
+                  <table className='w-full text-xs font-normal leading-[18px] text-text-secondary'>
+                    <thead className='uppercase text-text-tertiary'>
+                      <tr className='border-b border-divider-regular'>
+                        <th className="w-[156px] p-2 pl-3 font-medium">{t('tools.createTool.toolInput.name')}</th>
+                        <th className="w-[102px] p-2 pl-3 font-medium">{t('tools.createTool.toolInput.method')}</th>
+                        <th className="p-2 pl-3 font-medium">{t('tools.createTool.toolInput.description')}</th>
+                      </tr>
+                    </thead>
+                    <tbody>
+                      {parameters.map((item, index) => (
+                        <tr key={index} className='border-b border-divider-regular last:border-0'>
+                          <td className="max-w-[156px] p-2 pl-3">
+                            <div className='text-[13px] leading-[18px]'>
+                              <div title={item.name} className='flex'>
+                                <span className='truncate font-medium text-text-primary'>{item.name}</span>
+                                <span className='shrink-0 pl-1 text-xs leading-[18px] text-[#ec4a0a]'>{item.required ? t('tools.createTool.toolInput.required') : ''}</span>
+                              </div>
+                              <div className='text-text-tertiary'>{item.type}</div>
+                            </div>
+                          </td>
+                          <td>
+                            {item.name === '__image' && (
+                              <div className={cn(
+                                'flex h-9 min-h-[56px] cursor-default items-center gap-1 bg-transparent px-3 py-2',
+                              )}>
+                                <div className={cn('grow truncate text-[13px] leading-[18px] text-text-secondary')}>
+                                  {t('tools.createTool.toolInput.methodParameter')}
+                                </div>
+                              </div>
+                            )}
+                            {item.name !== '__image' && (
+                              <MethodSelector value={item.form} onChange={value => handleParameterChange('form', value, index)} />
+                            )}
+                          </td>
+                          <td className="w-[236px] p-2 pl-3 text-text-tertiary">
+                            <input
+                              type='text'
+                              className='w-full appearance-none bg-transparent text-[13px] font-normal leading-[18px] text-text-secondary caret-primary-600 outline-none placeholder:text-text-quaternary'
+                              placeholder={t('tools.createTool.toolInput.descriptionPlaceholder')!}
+                              value={item.description}
+                              onChange={e => handleParameterChange('description', e.target.value, index)}
+                            />
+                          </td>
+                        </tr>
+                      ))}
+                    </tbody>
+                  </table>
+                </div>
+              </div>
+              {/* Tags */}
+              <div>
+                <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.toolInput.label')}</div>
+                <LabelSelector value={labels} onChange={handleLabelSelect} />
+              </div>
+              {/* Privacy Policy */}
+              <div>
+                <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.privacyPolicy')}</div>
+                <Input
+                  className='h-10'
+                  value={privacyPolicy}
+                  onChange={e => setPrivacyPolicy(e.target.value)}
+                  placeholder={t('tools.createTool.privacyPolicyPlaceholder') || ''} />
+              </div>
+            </div>
+            <div className={cn((!isAdd && onRemove) ? 'justify-between' : 'justify-end', 'mt-2 flex shrink-0 rounded-b-[10px] border-t border-divider-regular bg-background-section-burn px-6 py-4')} >
+              {!isAdd && onRemove && (
+                <Button variant='warning' onClick={onRemove}>{t('common.operation.delete')}</Button>
+              )}
+              <div className='flex space-x-2 '>
+                <Button onClick={onHide}>{t('common.operation.cancel')}</Button>
+                <Button variant='primary' onClick={() => {
+                  if (isAdd)
+                    onConfirm()
+                  else
+                    setShowModal(true)
+                }}>{t('common.operation.save')}</Button>
+              </div>
+            </div>
+          </div>
+        }
+        isShowMask={true}
+        clickOutsideNotOpen={true}
+      />
+      {showEmojiPicker && <EmojiPicker
+        onSelect={(icon, icon_background) => {
+          setEmoji({ content: icon, background: icon_background })
+          setShowEmojiPicker(false)
+        }}
+        onClose={() => {
+          setShowEmojiPicker(false)
+        }}
+      />}
+      {showModal && (
+        <ConfirmModal
+          show={showModal}
+          onClose={() => setShowModal(false)}
+          onConfirm={onConfirm}
+        />
+      )}
+    </>
+
+  )
+}
+export default React.memo(WorkflowToolAsModal)
diff --git a/app/components/tools/workflow-tool/method-selector.tsx b/app/components/tools/workflow-tool/method-selector.tsx
new file mode 100644
index 0000000..4edaa6c
--- /dev/null
+++ b/app/components/tools/workflow-tool/method-selector.tsx
@@ -0,0 +1,77 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { Check } from '@/app/components/base/icons/src/vender/line/general'
+
+type MethodSelectorProps = {
+  value?: string
+  onChange: (v: string) => void
+}
+const MethodSelector: FC<MethodSelectorProps> = ({
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <div className='relative'>
+        <PortalToFollowElemTrigger
+          onClick={() => setOpen(v => !v)}
+          className='block'
+        >
+          <div className={cn(
+            'flex h-9 min-h-[56px] cursor-pointer items-center gap-1 bg-transparent px-3 py-2 hover:bg-background-section-burn',
+            open && '!bg-background-section-burn hover:bg-background-section-burn',
+          )}>
+            <div className={cn('grow truncate text-[13px] leading-[18px] text-text-secondary')}>
+              {value === 'llm' ? t('tools.createTool.toolInput.methodParameter') : t('tools.createTool.toolInput.methodSetting')}
+            </div>
+            <div className='ml-1 shrink-0 text-text-secondary opacity-60'>
+              <RiArrowDownSLine className='h-4 w-4' />
+            </div>
+          </div>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[1040]'>
+          <div className='relative w-[320px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg  backdrop-blur-sm'>
+            <div className='p-1'>
+              <div className='cursor-pointer rounded-lg py-2.5 pl-3 pr-2 hover:bg-components-panel-on-panel-item-bg-hover' onClick={() => onChange('llm')}>
+                <div className='item-center flex gap-1'>
+                  <div className='h-4 w-4 shrink-0'>
+                    {value === 'llm' && <Check className='h-4 w-4 shrink-0 text-text-accent' />}
+                  </div>
+                  <div className='text-[13px] font-medium leading-[18px] text-text-secondary'>{t('tools.createTool.toolInput.methodParameter')}</div>
+                </div>
+                <div className='pl-5 text-[13px] leading-[18px] text-text-tertiary'>{t('tools.createTool.toolInput.methodParameterTip')}</div>
+              </div>
+              <div className='cursor-pointer rounded-lg py-2.5 pl-3 pr-2 hover:bg-components-panel-on-panel-item-bg-hover' onClick={() => onChange('form')}>
+                <div className='item-center flex gap-1'>
+                  <div className='h-4 w-4 shrink-0'>
+                    {value === 'form' && <Check className='h-4 w-4 shrink-0 text-text-accent' />}
+                  </div>
+                  <div className='text-[13px] font-medium leading-[18px] text-text-secondary'>{t('tools.createTool.toolInput.methodSetting')}</div>
+                </div>
+                <div className='pl-5 text-[13px] leading-[18px] text-text-tertiary'>{t('tools.createTool.toolInput.methodSettingTip')}</div>
+              </div>
+            </div>
+          </div>
+        </PortalToFollowElemContent>
+      </div>
+    </PortalToFollowElem>
+  )
+}
+
+export default MethodSelector
diff --git a/app/components/with-i18n.tsx b/app/components/with-i18n.tsx
new file mode 100644
index 0000000..b06024d
--- /dev/null
+++ b/app/components/with-i18n.tsx
@@ -0,0 +1,20 @@
+'use client'
+
+import type { ReactNode } from 'react'
+import { useContext } from 'use-context-selector'
+import I18NContext from '@/context/i18n'
+
+export type II18NHocProps = {
+  children: ReactNode
+}
+
+const withI18N = (Component: any) => {
+  return (props: any) => {
+    const { i18n } = useContext(I18NContext)
+    return (
+      <Component {...props} i18n={i18n} />
+    )
+  }
+}
+
+export default withI18N
diff --git a/app/components/workflow-app/components/workflow-children.tsx b/app/components/workflow-app/components/workflow-children.tsx
new file mode 100644
index 0000000..6a6bbcd
--- /dev/null
+++ b/app/components/workflow-app/components/workflow-children.tsx
@@ -0,0 +1,69 @@
+import {
+  memo,
+  useState,
+} from 'react'
+import type { EnvironmentVariable } from '@/app/components/workflow/types'
+import { DSL_EXPORT_CHECK } from '@/app/components/workflow/constants'
+import { useStore } from '@/app/components/workflow/store'
+import Features from '@/app/components/workflow/features'
+import PluginDependency from '@/app/components/workflow/plugin-dependency'
+import UpdateDSLModal from '@/app/components/workflow/update-dsl-modal'
+import DSLExportConfirmModal from '@/app/components/workflow/dsl-export-confirm-modal'
+import {
+  useDSL,
+  usePanelInteractions,
+} from '@/app/components/workflow/hooks'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import WorkflowHeader from './workflow-header'
+import WorkflowPanel from './workflow-panel'
+
+const WorkflowChildren = () => {
+  const { eventEmitter } = useEventEmitterContextContext()
+  const [secretEnvList, setSecretEnvList] = useState<EnvironmentVariable[]>([])
+  const showFeaturesPanel = useStore(s => s.showFeaturesPanel)
+  const showImportDSLModal = useStore(s => s.showImportDSLModal)
+  const setShowImportDSLModal = useStore(s => s.setShowImportDSLModal)
+  const {
+    handlePaneContextmenuCancel,
+  } = usePanelInteractions()
+  const {
+    exportCheck,
+    handleExportDSL,
+  } = useDSL()
+
+  eventEmitter?.useSubscription((v: any) => {
+    if (v.type === DSL_EXPORT_CHECK)
+      setSecretEnvList(v.payload.data as EnvironmentVariable[])
+  })
+
+  return (
+    <>
+      <PluginDependency />
+      {
+        showFeaturesPanel && <Features />
+      }
+      {
+        showImportDSLModal && (
+          <UpdateDSLModal
+            onCancel={() => setShowImportDSLModal(false)}
+            onBackup={exportCheck}
+            onImport={handlePaneContextmenuCancel}
+          />
+        )
+      }
+      {
+        secretEnvList.length > 0 && (
+          <DSLExportConfirmModal
+            envList={secretEnvList}
+            onConfirm={handleExportDSL}
+            onClose={() => setSecretEnvList([])}
+          />
+        )
+      }
+      <WorkflowHeader />
+      <WorkflowPanel />
+    </>
+  )
+}
+
+export default memo(WorkflowChildren)
diff --git a/app/components/workflow-app/components/workflow-header/chat-variable-trigger.tsx b/app/components/workflow-app/components/workflow-header/chat-variable-trigger.tsx
new file mode 100644
index 0000000..0299d53
--- /dev/null
+++ b/app/components/workflow-app/components/workflow-header/chat-variable-trigger.tsx
@@ -0,0 +1,17 @@
+import { memo } from 'react'
+import ChatVariableButton from '@/app/components/workflow/header/chat-variable-button'
+import {
+  useNodesReadOnly,
+} from '@/app/components/workflow/hooks'
+import { useIsChatMode } from '../../hooks'
+
+const ChatVariableTrigger = () => {
+  const { nodesReadOnly } = useNodesReadOnly()
+  const isChatMode = useIsChatMode()
+
+  if (!isChatMode)
+    return null
+
+  return <ChatVariableButton disabled={nodesReadOnly} />
+}
+export default memo(ChatVariableTrigger)
diff --git a/app/components/workflow-app/components/workflow-header/features-trigger.tsx b/app/components/workflow-app/components/workflow-header/features-trigger.tsx
new file mode 100644
index 0000000..da64409
--- /dev/null
+++ b/app/components/workflow-app/components/workflow-header/features-trigger.tsx
@@ -0,0 +1,152 @@
+import {
+  memo,
+  useCallback,
+  useMemo,
+} from 'react'
+import { useNodes } from 'reactflow'
+import { RiApps2AddLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import {
+  useStore,
+  useWorkflowStore,
+} from '@/app/components/workflow/store'
+import {
+  useChecklistBeforePublish,
+  useNodesReadOnly,
+  useNodesSyncDraft,
+} from '@/app/components/workflow/hooks'
+import Button from '@/app/components/base/button'
+import AppPublisher from '@/app/components/app/app-publisher'
+import { useFeatures } from '@/app/components/base/features/hooks'
+import {
+  BlockEnum,
+  InputVarType,
+} from '@/app/components/workflow/types'
+import type { StartNodeType } from '@/app/components/workflow/nodes/start/types'
+import { useToastContext } from '@/app/components/base/toast'
+import { usePublishWorkflow, useResetWorkflowVersionHistory } from '@/service/use-workflow'
+import type { PublishWorkflowParams } from '@/types/workflow'
+import { fetchAppDetail, fetchAppSSO } from '@/service/apps'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { useSelector as useAppSelector } from '@/context/app-context'
+
+const FeaturesTrigger = () => {
+  const { t } = useTranslation()
+  const workflowStore = useWorkflowStore()
+  const appDetail = useAppStore(s => s.appDetail)
+  const appID = appDetail?.id
+  const setAppDetail = useAppStore(s => s.setAppDetail)
+  const systemFeatures = useAppSelector(state => state.systemFeatures)
+  const {
+    nodesReadOnly,
+    getNodesReadOnly,
+  } = useNodesReadOnly()
+  const publishedAt = useStore(s => s.publishedAt)
+  const draftUpdatedAt = useStore(s => s.draftUpdatedAt)
+  const toolPublished = useStore(s => s.toolPublished)
+  const nodes = useNodes<StartNodeType>()
+  const startNode = nodes.find(node => node.data.type === BlockEnum.Start)
+  const startVariables = startNode?.data.variables
+  const fileSettings = useFeatures(s => s.features.file)
+  const variables = useMemo(() => {
+    const data = startVariables || []
+    if (fileSettings?.image?.enabled) {
+      return [
+        ...data,
+        {
+          type: InputVarType.files,
+          variable: '__image',
+          required: false,
+          label: 'files',
+        },
+      ]
+    }
+
+    return data
+  }, [fileSettings?.image?.enabled, startVariables])
+
+  const { handleCheckBeforePublish } = useChecklistBeforePublish()
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+  const { notify } = useToastContext()
+
+  const handleShowFeatures = useCallback(() => {
+    const {
+      showFeaturesPanel,
+      isRestoring,
+      setShowFeaturesPanel,
+    } = workflowStore.getState()
+    if (getNodesReadOnly() && !isRestoring)
+      return
+    setShowFeaturesPanel(!showFeaturesPanel)
+  }, [workflowStore, getNodesReadOnly])
+
+  const resetWorkflowVersionHistory = useResetWorkflowVersionHistory(appDetail!.id)
+
+  const updateAppDetail = useCallback(async () => {
+    try {
+      const res = await fetchAppDetail({ url: '/apps', id: appID! })
+      if (systemFeatures.enable_web_sso_switch_component) {
+        const ssoRes = await fetchAppSSO({ appId: appID! })
+        setAppDetail({ ...res, enable_sso: ssoRes.enabled })
+      }
+      else {
+        setAppDetail({ ...res })
+      }
+    }
+    catch (error) {
+      console.error(error)
+    }
+  }, [appID, setAppDetail, systemFeatures.enable_web_sso_switch_component])
+  const { mutateAsync: publishWorkflow } = usePublishWorkflow(appID!)
+  const onPublish = useCallback(async (params?: PublishWorkflowParams) => {
+    if (await handleCheckBeforePublish()) {
+      const res = await publishWorkflow({
+        title: params?.title || '',
+        releaseNotes: params?.releaseNotes || '',
+      })
+
+      if (res) {
+        notify({ type: 'success', message: t('common.api.actionSuccess') })
+        updateAppDetail()
+        workflowStore.getState().setPublishedAt(res.created_at)
+        resetWorkflowVersionHistory()
+      }
+    }
+    else {
+      throw new Error('Checklist failed')
+    }
+  }, [handleCheckBeforePublish, notify, t, workflowStore, publishWorkflow, resetWorkflowVersionHistory, updateAppDetail])
+
+  const onPublisherToggle = useCallback((state: boolean) => {
+    if (state)
+      handleSyncWorkflowDraft(true)
+  }, [handleSyncWorkflowDraft])
+
+  const handleToolConfigureUpdate = useCallback(() => {
+    workflowStore.setState({ toolPublished: true })
+  }, [workflowStore])
+
+  return (
+    <>
+      <Button className='text-components-button-secondary-text' onClick={handleShowFeatures}>
+        <RiApps2AddLine className='mr-1 h-4 w-4 text-components-button-secondary-text' />
+        {t('workflow.common.features')}
+      </Button>
+      <AppPublisher
+        {...{
+          publishedAt,
+          draftUpdatedAt,
+          disabled: nodesReadOnly,
+          toolPublished,
+          inputs: variables,
+          onRefreshData: handleToolConfigureUpdate,
+          onPublish,
+          onToggle: onPublisherToggle,
+          crossAxisOffset: 4,
+        }}
+      />
+    </>
+  )
+}
+
+export default memo(FeaturesTrigger)
diff --git a/app/components/workflow-app/components/workflow-header/index.tsx b/app/components/workflow-app/components/workflow-header/index.tsx
new file mode 100644
index 0000000..4eb8df7
--- /dev/null
+++ b/app/components/workflow-app/components/workflow-header/index.tsx
@@ -0,0 +1,31 @@
+import { useMemo } from 'react'
+import type { HeaderProps } from '@/app/components/workflow/header'
+import Header from '@/app/components/workflow/header'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import ChatVariableTrigger from './chat-variable-trigger'
+import FeaturesTrigger from './features-trigger'
+import { useResetWorkflowVersionHistory } from '@/service/use-workflow'
+
+const WorkflowHeader = () => {
+  const appDetail = useAppStore(s => s.appDetail)
+  const resetWorkflowVersionHistory = useResetWorkflowVersionHistory(appDetail!.id)
+
+  const headerProps: HeaderProps = useMemo(() => {
+    return {
+      normal: {
+        components: {
+          left: <ChatVariableTrigger />,
+          middle: <FeaturesTrigger />,
+        },
+      },
+      restoring: {
+        onRestoreSettled: resetWorkflowVersionHistory,
+      },
+    }
+  }, [resetWorkflowVersionHistory])
+  return (
+    <Header {...headerProps} />
+  )
+}
+
+export default WorkflowHeader
diff --git a/app/components/workflow-app/components/workflow-main.tsx b/app/components/workflow-app/components/workflow-main.tsx
new file mode 100644
index 0000000..2f2295c
--- /dev/null
+++ b/app/components/workflow-app/components/workflow-main.tsx
@@ -0,0 +1,91 @@
+import {
+  useCallback,
+  useMemo,
+} from 'react'
+import { useFeaturesStore } from '@/app/components/base/features/hooks'
+import { WorkflowWithInnerContext } from '@/app/components/workflow'
+import type { WorkflowProps } from '@/app/components/workflow'
+import WorkflowChildren from './workflow-children'
+import {
+  useNodesSyncDraft,
+  useWorkflowRefreshDraft,
+  useWorkflowRun,
+  useWorkflowStartRun,
+} from '../hooks'
+
+type WorkflowMainProps = Pick<WorkflowProps, 'nodes' | 'edges' | 'viewport'>
+const WorkflowMain = ({
+  nodes,
+  edges,
+  viewport,
+}: WorkflowMainProps) => {
+  const featuresStore = useFeaturesStore()
+
+  const handleWorkflowDataUpdate = useCallback((payload: any) => {
+    if (payload.features && featuresStore) {
+      const { setFeatures } = featuresStore.getState()
+
+      setFeatures(payload.features)
+    }
+  }, [featuresStore])
+
+  const {
+    doSyncWorkflowDraft,
+    syncWorkflowDraftWhenPageClose,
+  } = useNodesSyncDraft()
+  const { handleRefreshWorkflowDraft } = useWorkflowRefreshDraft()
+  const {
+    handleBackupDraft,
+    handleLoadBackupDraft,
+    handleRestoreFromPublishedWorkflow,
+    handleRun,
+    handleStopRun,
+  } = useWorkflowRun()
+  const {
+    handleStartWorkflowRun,
+    handleWorkflowStartRunInChatflow,
+    handleWorkflowStartRunInWorkflow,
+  } = useWorkflowStartRun()
+
+  const hooksStore = useMemo(() => {
+    return {
+      syncWorkflowDraftWhenPageClose,
+      doSyncWorkflowDraft,
+      handleRefreshWorkflowDraft,
+      handleBackupDraft,
+      handleLoadBackupDraft,
+      handleRestoreFromPublishedWorkflow,
+      handleRun,
+      handleStopRun,
+      handleStartWorkflowRun,
+      handleWorkflowStartRunInChatflow,
+      handleWorkflowStartRunInWorkflow,
+    }
+  }, [
+    syncWorkflowDraftWhenPageClose,
+    doSyncWorkflowDraft,
+    handleRefreshWorkflowDraft,
+    handleBackupDraft,
+    handleLoadBackupDraft,
+    handleRestoreFromPublishedWorkflow,
+    handleRun,
+    handleStopRun,
+    handleStartWorkflowRun,
+    handleWorkflowStartRunInChatflow,
+    handleWorkflowStartRunInWorkflow,
+  ])
+
+  return (
+    <WorkflowWithInnerContext
+      nodes={nodes}
+      edges={edges}
+      viewport={viewport}
+      onWorkflowDataUpdate={handleWorkflowDataUpdate}
+      hooksStore={hooksStore}
+    >
+      <WorkflowChildren />
+    </WorkflowWithInnerContext>
+  )
+}
+
+export default WorkflowMain
diff --git a/app/components/workflow-app/components/workflow-panel.tsx b/app/components/workflow-app/components/workflow-panel.tsx
new file mode 100644
index 0000000..dd36866
--- /dev/null
+++ b/app/components/workflow-app/components/workflow-panel.tsx
@@ -0,0 +1,109 @@
+import { useMemo } from 'react'
+import { useShallow } from 'zustand/react/shallow'
+import { useStore } from '@/app/components/workflow/store'
+import {
+  useIsChatMode,
+} from '../hooks'
+import DebugAndPreview from '@/app/components/workflow/panel/debug-and-preview'
+import Record from '@/app/components/workflow/panel/record'
+import WorkflowPreview from '@/app/components/workflow/panel/workflow-preview'
+import ChatRecord from '@/app/components/workflow/panel/chat-record'
+import ChatVariablePanel from '@/app/components/workflow/panel/chat-variable-panel'
+import GlobalVariablePanel from '@/app/components/workflow/panel/global-variable-panel'
+import VersionHistoryPanel from '@/app/components/workflow/panel/version-history-panel'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import MessageLogModal from '@/app/components/base/message-log-modal'
+import type { PanelProps } from '@/app/components/workflow/panel'
+import Panel from '@/app/components/workflow/panel'
+
+const WorkflowPanelOnLeft = () => {
+  const { currentLogItem, setCurrentLogItem, showMessageLogModal, setShowMessageLogModal, currentLogModalActiveTab } = useAppStore(useShallow(state => ({
+    currentLogItem: state.currentLogItem,
+    setCurrentLogItem: state.setCurrentLogItem,
+    showMessageLogModal: state.showMessageLogModal,
+    setShowMessageLogModal: state.setShowMessageLogModal,
+    currentLogModalActiveTab: state.currentLogModalActiveTab,
+  })))
+  return (
+    <>
+      {
+        showMessageLogModal && (
+          <MessageLogModal
+            fixedWidth
+            width={400}
+            currentLogItem={currentLogItem}
+            onCancel={() => {
+              setCurrentLogItem()
+              setShowMessageLogModal(false)
+            }}
+            defaultTab={currentLogModalActiveTab}
+          />
+        )
+      }
+    </>
+  )
+}
+const WorkflowPanelOnRight = () => {
+  const isChatMode = useIsChatMode()
+  const historyWorkflowData = useStore(s => s.historyWorkflowData)
+  const showDebugAndPreviewPanel = useStore(s => s.showDebugAndPreviewPanel)
+  const showChatVariablePanel = useStore(s => s.showChatVariablePanel)
+  const showGlobalVariablePanel = useStore(s => s.showGlobalVariablePanel)
+  const showWorkflowVersionHistoryPanel = useStore(s => s.showWorkflowVersionHistoryPanel)
+
+  return (
+    <>
+      {
+        historyWorkflowData && !isChatMode && (
+          <Record />
+        )
+      }
+      {
+        historyWorkflowData && isChatMode && (
+          <ChatRecord />
+        )
+      }
+      {
+        showDebugAndPreviewPanel && isChatMode && (
+          <DebugAndPreview />
+        )
+      }
+      {
+        showDebugAndPreviewPanel && !isChatMode && (
+          <WorkflowPreview />
+        )
+      }
+      {
+        showChatVariablePanel && isChatMode && (
+          <ChatVariablePanel />
+        )
+      }
+      {
+        showGlobalVariablePanel && (
+          <GlobalVariablePanel />
+        )
+      }
+      {
+        showWorkflowVersionHistoryPanel && (
+          <VersionHistoryPanel/>
+        )
+      }
+    </>
+  )
+}
+const WorkflowPanel = () => {
+  const panelProps: PanelProps = useMemo(() => {
+    return {
+      components: {
+        left: <WorkflowPanelOnLeft />,
+        right: <WorkflowPanelOnRight />,
+      },
+    }
+  }, [])
+
+  return (
+    <Panel {...panelProps} />
+  )
+}
+
+export default WorkflowPanel
diff --git a/app/components/workflow-app/hooks/index.ts b/app/components/workflow-app/hooks/index.ts
new file mode 100644
index 0000000..6373a85
--- /dev/null
+++ b/app/components/workflow-app/hooks/index.ts
@@ -0,0 +1,7 @@
+export * from './use-workflow-init'
+export * from './use-workflow-template'
+export * from './use-nodes-sync-draft'
+export * from './use-workflow-run'
+export * from './use-workflow-start-run'
+export * from './use-is-chat-mode'
+export * from './use-workflow-refresh-draft'
diff --git a/app/components/workflow-app/hooks/use-is-chat-mode.ts b/app/components/workflow-app/hooks/use-is-chat-mode.ts
new file mode 100644
index 0000000..3cdfc77
--- /dev/null
+++ b/app/components/workflow-app/hooks/use-is-chat-mode.ts
@@ -0,0 +1,7 @@
+import { useStore as useAppStore } from '@/app/components/app/store'
+
+export const useIsChatMode = () => {
+  const appDetail = useAppStore(s => s.appDetail)
+
+  return appDetail?.mode === 'advanced-chat'
+}
diff --git a/app/components/workflow-app/hooks/use-nodes-sync-draft.ts b/app/components/workflow-app/hooks/use-nodes-sync-draft.ts
new file mode 100644
index 0000000..db21cfb
--- /dev/null
+++ b/app/components/workflow-app/hooks/use-nodes-sync-draft.ts
@@ -0,0 +1,148 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import { useStoreApi } from 'reactflow'
+import { useParams } from 'next/navigation'
+import {
+  useWorkflowStore,
+} from '@/app/components/workflow/store'
+import { BlockEnum } from '@/app/components/workflow/types'
+import {
+  useNodesReadOnly,
+} from '@/app/components/workflow/hooks/use-workflow'
+import { syncWorkflowDraft } from '@/service/workflow'
+import { useFeaturesStore } from '@/app/components/base/features/hooks'
+import { API_PREFIX } from '@/config'
+import { useWorkflowRefreshDraft } from '.'
+
+export const useNodesSyncDraft = () => {
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+  const featuresStore = useFeaturesStore()
+  const { getNodesReadOnly } = useNodesReadOnly()
+  const { handleRefreshWorkflowDraft } = useWorkflowRefreshDraft()
+  const params = useParams()
+
+  const getPostParams = useCallback(() => {
+    const {
+      getNodes,
+      edges,
+      transform,
+    } = store.getState()
+    const [x, y, zoom] = transform
+    const {
+      appId,
+      conversationVariables,
+      environmentVariables,
+      syncWorkflowDraftHash,
+    } = workflowStore.getState()
+
+    if (appId) {
+      const nodes = getNodes()
+      const hasStartNode = nodes.find(node => node.data.type === BlockEnum.Start)
+
+      if (!hasStartNode)
+        return
+
+      const features = featuresStore!.getState().features
+      const producedNodes = produce(nodes, (draft) => {
+        draft.forEach((node) => {
+          Object.keys(node.data).forEach((key) => {
+            if (key.startsWith('_'))
+              delete node.data[key]
+          })
+        })
+      })
+      const producedEdges = produce(edges, (draft) => {
+        draft.forEach((edge) => {
+          Object.keys(edge.data).forEach((key) => {
+            if (key.startsWith('_'))
+              delete edge.data[key]
+          })
+        })
+      })
+      return {
+        url: `/apps/${appId}/workflows/draft`,
+        params: {
+          graph: {
+            nodes: producedNodes,
+            edges: producedEdges,
+            viewport: {
+              x,
+              y,
+              zoom,
+            },
+          },
+          features: {
+            opening_statement: features.opening?.enabled ? (features.opening?.opening_statement || '') : '',
+            suggested_questions: features.opening?.enabled ? (features.opening?.suggested_questions || []) : [],
+            suggested_questions_after_answer: features.suggested,
+            text_to_speech: features.text2speech,
+            speech_to_text: features.speech2text,
+            retriever_resource: features.citation,
+            sensitive_word_avoidance: features.moderation,
+            file_upload: features.file,
+          },
+          environment_variables: environmentVariables,
+          conversation_variables: conversationVariables,
+          hash: syncWorkflowDraftHash,
+        },
+      }
+    }
+  }, [store, featuresStore, workflowStore])
+
+  const syncWorkflowDraftWhenPageClose = useCallback(() => {
+    if (getNodesReadOnly())
+      return
+    const postParams = getPostParams()
+
+    if (postParams) {
+      navigator.sendBeacon(
+        `${API_PREFIX}/apps/${params.appId}/workflows/draft?_token=${localStorage.getItem('console_token')}`,
+        JSON.stringify(postParams.params),
+      )
+    }
+  }, [getPostParams, params.appId, getNodesReadOnly])
+
+  const doSyncWorkflowDraft = useCallback(async (
+    notRefreshWhenSyncError?: boolean,
+    callback?: {
+      onSuccess?: () => void
+      onError?: () => void
+      onSettled?: () => void
+    },
+  ) => {
+    if (getNodesReadOnly())
+      return
+    const postParams = getPostParams()
+
+    if (postParams) {
+      const {
+        setSyncWorkflowDraftHash,
+        setDraftUpdatedAt,
+      } = workflowStore.getState()
+      try {
+        const res = await syncWorkflowDraft(postParams)
+        setSyncWorkflowDraftHash(res.hash)
+        setDraftUpdatedAt(res.updated_at)
+        callback?.onSuccess && callback.onSuccess()
+      }
+      catch (error: any) {
+        if (error && error.json && !error.bodyUsed) {
+          error.json().then((err: any) => {
+            if (err.code === 'draft_workflow_not_sync' && !notRefreshWhenSyncError)
+              handleRefreshWorkflowDraft()
+          })
+        }
+        callback?.onError && callback.onError()
+      }
+      finally {
+        callback?.onSettled && callback.onSettled()
+      }
+    }
+  }, [workflowStore, getPostParams, getNodesReadOnly, handleRefreshWorkflowDraft])
+
+  return {
+    doSyncWorkflowDraft,
+    syncWorkflowDraftWhenPageClose,
+  }
+}
diff --git a/app/components/workflow-app/hooks/use-workflow-init.ts b/app/components/workflow-app/hooks/use-workflow-init.ts
new file mode 100644
index 0000000..e1c4c25
--- /dev/null
+++ b/app/components/workflow-app/hooks/use-workflow-init.ts
@@ -0,0 +1,123 @@
+import {
+  useCallback,
+  useEffect,
+  useState,
+} from 'react'
+import {
+  useStore,
+  useWorkflowStore,
+} from '@/app/components/workflow/store'
+import { useWorkflowTemplate } from './use-workflow-template'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import {
+  fetchNodesDefaultConfigs,
+  fetchPublishedWorkflow,
+  fetchWorkflowDraft,
+  syncWorkflowDraft,
+} from '@/service/workflow'
+import type { FetchWorkflowDraftResponse } from '@/types/workflow'
+import { useWorkflowConfig } from '@/service/use-workflow'
+
+export const useWorkflowInit = () => {
+  const workflowStore = useWorkflowStore()
+  const {
+    nodes: nodesTemplate,
+    edges: edgesTemplate,
+  } = useWorkflowTemplate()
+  const appDetail = useAppStore(state => state.appDetail)!
+  const setSyncWorkflowDraftHash = useStore(s => s.setSyncWorkflowDraftHash)
+  const [data, setData] = useState<FetchWorkflowDraftResponse>()
+  const [isLoading, setIsLoading] = useState(true)
+  useEffect(() => {
+    workflowStore.setState({ appId: appDetail.id })
+  }, [appDetail.id, workflowStore])
+
+  const handleUpdateWorkflowConfig = useCallback((config: Record<string, any>) => {
+    const { setWorkflowConfig } = workflowStore.getState()
+
+    setWorkflowConfig(config)
+  }, [workflowStore])
+  useWorkflowConfig(appDetail.id, handleUpdateWorkflowConfig)
+
+  const handleGetInitialWorkflowData = useCallback(async () => {
+    try {
+      const res = await fetchWorkflowDraft(`/apps/${appDetail.id}/workflows/draft`)
+      setData(res)
+      workflowStore.setState({
+        envSecrets: (res.environment_variables || []).filter(env => env.value_type === 'secret').reduce((acc, env) => {
+          acc[env.id] = env.value
+          return acc
+        }, {} as Record<string, string>),
+        environmentVariables: res.environment_variables?.map(env => env.value_type === 'secret' ? { ...env, value: '[__HIDDEN__]' } : env) || [],
+        conversationVariables: res.conversation_variables || [],
+      })
+      setSyncWorkflowDraftHash(res.hash)
+      setIsLoading(false)
+    }
+    catch (error: any) {
+      if (error && error.json && !error.bodyUsed && appDetail) {
+        error.json().then((err: any) => {
+          if (err.code === 'draft_workflow_not_exist') {
+            workflowStore.setState({ notInitialWorkflow: true })
+            syncWorkflowDraft({
+              url: `/apps/${appDetail.id}/workflows/draft`,
+              params: {
+                graph: {
+                  nodes: nodesTemplate,
+                  edges: edgesTemplate,
+                },
+                features: {
+                  retriever_resource: { enabled: true },
+                },
+                environment_variables: [],
+                conversation_variables: [],
+              },
+            }).then((res) => {
+              workflowStore.getState().setDraftUpdatedAt(res.updated_at)
+              handleGetInitialWorkflowData()
+            })
+          }
+        })
+      }
+    }
+  }, [appDetail, nodesTemplate, edgesTemplate, workflowStore, setSyncWorkflowDraftHash])
+
+  useEffect(() => {
+    handleGetInitialWorkflowData()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  const handleFetchPreloadData = useCallback(async () => {
+    try {
+      const nodesDefaultConfigsData = await fetchNodesDefaultConfigs(`/apps/${appDetail?.id}/workflows/default-workflow-block-configs`)
+      const publishedWorkflow = await fetchPublishedWorkflow(`/apps/${appDetail?.id}/workflows/publish`)
+      workflowStore.setState({
+        nodesDefaultConfigs: nodesDefaultConfigsData.reduce((acc, block) => {
+          if (!acc[block.type])
+            acc[block.type] = { ...block.config }
+          return acc
+        }, {} as Record<string, any>),
+      })
+      workflowStore.getState().setPublishedAt(publishedWorkflow?.created_at)
+    }
+    catch (e) {
+      console.error(e)
+    }
+  }, [workflowStore, appDetail])
+
+  useEffect(() => {
+    handleFetchPreloadData()
+  }, [handleFetchPreloadData])
+
+  useEffect(() => {
+    if (data) {
+      workflowStore.getState().setDraftUpdatedAt(data.updated_at)
+      workflowStore.getState().setToolPublished(data.tool_published)
+    }
+  }, [data, workflowStore])
+
+  return {
+    data,
+    isLoading,
+  }
+}
diff --git a/app/components/workflow-app/hooks/use-workflow-refresh-draft.ts b/app/components/workflow-app/hooks/use-workflow-refresh-draft.ts
new file mode 100644
index 0000000..c944e10
--- /dev/null
+++ b/app/components/workflow-app/hooks/use-workflow-refresh-draft.ts
@@ -0,0 +1,36 @@
+import { useCallback } from 'react'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+import { fetchWorkflowDraft } from '@/service/workflow'
+import type { WorkflowDataUpdater } from '@/app/components/workflow/types'
+import { useWorkflowUpdate } from '@/app/components/workflow/hooks'
+
+export const useWorkflowRefreshDraft = () => {
+  const workflowStore = useWorkflowStore()
+  const { handleUpdateWorkflowCanvas } = useWorkflowUpdate()
+
+  const handleRefreshWorkflowDraft = useCallback(() => {
+    const {
+      appId,
+      setSyncWorkflowDraftHash,
+      setIsSyncingWorkflowDraft,
+      setEnvironmentVariables,
+      setEnvSecrets,
+      setConversationVariables,
+    } = workflowStore.getState()
+    setIsSyncingWorkflowDraft(true)
+    fetchWorkflowDraft(`/apps/${appId}/workflows/draft`).then((response) => {
+      handleUpdateWorkflowCanvas(response.graph as WorkflowDataUpdater)
+      setSyncWorkflowDraftHash(response.hash)
+      setEnvSecrets((response.environment_variables || []).filter(env => env.value_type === 'secret').reduce((acc, env) => {
+        acc[env.id] = env.value
+        return acc
+      }, {} as Record<string, string>))
+      setEnvironmentVariables(response.environment_variables?.map(env => env.value_type === 'secret' ? { ...env, value: '[__HIDDEN__]' } : env) || [])
+      setConversationVariables(response.conversation_variables || [])
+    }).finally(() => setIsSyncingWorkflowDraft(false))
+  }, [handleUpdateWorkflowCanvas, workflowStore])
+
+  return {
+    handleRefreshWorkflowDraft,
+  }
+}
diff --git a/app/components/workflow-app/hooks/use-workflow-run.ts b/app/components/workflow-app/hooks/use-workflow-run.ts
new file mode 100644
index 0000000..1e484d0
--- /dev/null
+++ b/app/components/workflow-app/hooks/use-workflow-run.ts
@@ -0,0 +1,357 @@
+import { useCallback } from 'react'
+import {
+  useReactFlow,
+  useStoreApi,
+} from 'reactflow'
+import produce from 'immer'
+import { v4 as uuidV4 } from 'uuid'
+import { usePathname } from 'next/navigation'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+import { WorkflowRunningStatus } from '@/app/components/workflow/types'
+import { useWorkflowUpdate } from '@/app/components/workflow/hooks/use-workflow-interactions'
+import { useWorkflowRunEvent } from '@/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import type { IOtherOptions } from '@/service/base'
+import { ssePost } from '@/service/base'
+import { stopWorkflowRun } from '@/service/workflow'
+import { useFeaturesStore } from '@/app/components/base/features/hooks'
+import { AudioPlayerManager } from '@/app/components/base/audio-btn/audio.player.manager'
+import type { VersionHistory } from '@/types/workflow'
+import { noop } from 'lodash-es'
+import { useNodesSyncDraft } from './use-nodes-sync-draft'
+
+export const useWorkflowRun = () => {
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+  const reactflow = useReactFlow()
+  const featuresStore = useFeaturesStore()
+  const { doSyncWorkflowDraft } = useNodesSyncDraft()
+  const { handleUpdateWorkflowCanvas } = useWorkflowUpdate()
+  const pathname = usePathname()
+
+  const {
+    handleWorkflowStarted,
+    handleWorkflowFinished,
+    handleWorkflowFailed,
+    handleWorkflowNodeStarted,
+    handleWorkflowNodeFinished,
+    handleWorkflowNodeIterationStarted,
+    handleWorkflowNodeIterationNext,
+    handleWorkflowNodeIterationFinished,
+    handleWorkflowNodeLoopStarted,
+    handleWorkflowNodeLoopNext,
+    handleWorkflowNodeLoopFinished,
+    handleWorkflowNodeRetry,
+    handleWorkflowAgentLog,
+    handleWorkflowTextChunk,
+    handleWorkflowTextReplace,
+  } = useWorkflowRunEvent()
+
+  const handleBackupDraft = useCallback(() => {
+    const {
+      getNodes,
+      edges,
+    } = store.getState()
+    const { getViewport } = reactflow
+    const {
+      backupDraft,
+      setBackupDraft,
+      environmentVariables,
+    } = workflowStore.getState()
+    const { features } = featuresStore!.getState()
+
+    if (!backupDraft) {
+      setBackupDraft({
+        nodes: getNodes(),
+        edges,
+        viewport: getViewport(),
+        features,
+        environmentVariables,
+      })
+      doSyncWorkflowDraft()
+    }
+  }, [reactflow, workflowStore, store, featuresStore, doSyncWorkflowDraft])
+
+  const handleLoadBackupDraft = useCallback(() => {
+    const {
+      backupDraft,
+      setBackupDraft,
+      setEnvironmentVariables,
+    } = workflowStore.getState()
+
+    if (backupDraft) {
+      const {
+        nodes,
+        edges,
+        viewport,
+        features,
+        environmentVariables,
+      } = backupDraft
+      handleUpdateWorkflowCanvas({
+        nodes,
+        edges,
+        viewport,
+      })
+      setEnvironmentVariables(environmentVariables)
+      featuresStore!.setState({ features })
+      setBackupDraft(undefined)
+    }
+  }, [handleUpdateWorkflowCanvas, workflowStore, featuresStore])
+
+  const handleRun = useCallback(async (
+    params: any,
+    callback?: IOtherOptions,
+  ) => {
+    const {
+      getNodes,
+      setNodes,
+    } = store.getState()
+    const newNodes = produce(getNodes(), (draft) => {
+      draft.forEach((node) => {
+        node.data.selected = false
+        node.data._runningStatus = undefined
+      })
+    })
+    setNodes(newNodes)
+    await doSyncWorkflowDraft()
+
+    const {
+      onWorkflowStarted,
+      onWorkflowFinished,
+      onNodeStarted,
+      onNodeFinished,
+      onIterationStart,
+      onIterationNext,
+      onIterationFinish,
+      onLoopStart,
+      onLoopNext,
+      onLoopFinish,
+      onNodeRetry,
+      onAgentLog,
+      onError,
+      ...restCallback
+    } = callback || {}
+    workflowStore.setState({ historyWorkflowData: undefined })
+    const appDetail = useAppStore.getState().appDetail
+    const workflowContainer = document.getElementById('workflow-container')
+
+    const {
+      clientWidth,
+      clientHeight,
+    } = workflowContainer!
+
+    let url = ''
+    if (appDetail?.mode === 'advanced-chat')
+      url = `/apps/${appDetail.id}/advanced-chat/workflows/draft/run`
+
+    if (appDetail?.mode === 'workflow')
+      url = `/apps/${appDetail.id}/workflows/draft/run`
+
+    const {
+      setWorkflowRunningData,
+    } = workflowStore.getState()
+    setWorkflowRunningData({
+      result: {
+        status: WorkflowRunningStatus.Running,
+      },
+      tracing: [],
+      resultText: '',
+    })
+
+    let ttsUrl = ''
+    let ttsIsPublic = false
+    if (params.token) {
+      ttsUrl = '/text-to-audio'
+      ttsIsPublic = true
+    }
+    else if (params.appId) {
+      if (pathname.search('explore/installed') > -1)
+        ttsUrl = `/installed-apps/${params.appId}/text-to-audio`
+      else
+        ttsUrl = `/apps/${params.appId}/text-to-audio`
+    }
+    const player = AudioPlayerManager.getInstance().getAudioPlayer(ttsUrl, ttsIsPublic, uuidV4(), 'none', 'none', noop)
+
+    ssePost(
+      url,
+      {
+        body: params,
+      },
+      {
+        onWorkflowStarted: (params) => {
+          handleWorkflowStarted(params)
+
+          if (onWorkflowStarted)
+            onWorkflowStarted(params)
+        },
+        onWorkflowFinished: (params) => {
+          handleWorkflowFinished(params)
+
+          if (onWorkflowFinished)
+            onWorkflowFinished(params)
+        },
+        onError: (params) => {
+          handleWorkflowFailed()
+
+          if (onError)
+            onError(params)
+        },
+        onNodeStarted: (params) => {
+          handleWorkflowNodeStarted(
+            params,
+            {
+              clientWidth,
+              clientHeight,
+            },
+          )
+
+          if (onNodeStarted)
+            onNodeStarted(params)
+        },
+        onNodeFinished: (params) => {
+          handleWorkflowNodeFinished(params)
+
+          if (onNodeFinished)
+            onNodeFinished(params)
+        },
+        onIterationStart: (params) => {
+          handleWorkflowNodeIterationStarted(
+            params,
+            {
+              clientWidth,
+              clientHeight,
+            },
+          )
+
+          if (onIterationStart)
+            onIterationStart(params)
+        },
+        onIterationNext: (params) => {
+          handleWorkflowNodeIterationNext(params)
+
+          if (onIterationNext)
+            onIterationNext(params)
+        },
+        onIterationFinish: (params) => {
+          handleWorkflowNodeIterationFinished(params)
+
+          if (onIterationFinish)
+            onIterationFinish(params)
+        },
+        onLoopStart: (params) => {
+          handleWorkflowNodeLoopStarted(
+            params,
+            {
+              clientWidth,
+              clientHeight,
+            },
+          )
+
+          if (onLoopStart)
+            onLoopStart(params)
+        },
+        onLoopNext: (params) => {
+          handleWorkflowNodeLoopNext(params)
+
+          if (onLoopNext)
+            onLoopNext(params)
+        },
+        onLoopFinish: (params) => {
+          handleWorkflowNodeLoopFinished(params)
+
+          if (onLoopFinish)
+            onLoopFinish(params)
+        },
+        onNodeRetry: (params) => {
+          handleWorkflowNodeRetry(params)
+
+          if (onNodeRetry)
+            onNodeRetry(params)
+        },
+        onAgentLog: (params) => {
+          handleWorkflowAgentLog(params)
+
+          if (onAgentLog)
+            onAgentLog(params)
+        },
+        onTextChunk: (params) => {
+          handleWorkflowTextChunk(params)
+        },
+        onTextReplace: (params) => {
+          handleWorkflowTextReplace(params)
+        },
+        onTTSChunk: (messageId: string, audio: string) => {
+          if (!audio || audio === '')
+            return
+          player.playAudioWithAudio(audio, true)
+          AudioPlayerManager.getInstance().resetMsgId(messageId)
+        },
+        onTTSEnd: (messageId: string, audio: string) => {
+          player.playAudioWithAudio(audio, false)
+        },
+        ...restCallback,
+      },
+    )
+  }, [
+    store,
+    workflowStore,
+    doSyncWorkflowDraft,
+    handleWorkflowStarted,
+    handleWorkflowFinished,
+    handleWorkflowFailed,
+    handleWorkflowNodeStarted,
+    handleWorkflowNodeFinished,
+    handleWorkflowNodeIterationStarted,
+    handleWorkflowNodeIterationNext,
+    handleWorkflowNodeIterationFinished,
+    handleWorkflowNodeLoopStarted,
+    handleWorkflowNodeLoopNext,
+    handleWorkflowNodeLoopFinished,
+    handleWorkflowNodeRetry,
+    handleWorkflowTextChunk,
+    handleWorkflowTextReplace,
+    handleWorkflowAgentLog,
+    pathname],
+  )
+
+  const handleStopRun = useCallback((taskId: string) => {
+    const appId = useAppStore.getState().appDetail?.id
+
+    stopWorkflowRun(`/apps/${appId}/workflow-runs/tasks/${taskId}/stop`)
+  }, [])
+
+  const handleRestoreFromPublishedWorkflow = useCallback((publishedWorkflow: VersionHistory) => {
+    const nodes = publishedWorkflow.graph.nodes.map(node => ({ ...node, selected: false, data: { ...node.data, selected: false } }))
+    const edges = publishedWorkflow.graph.edges
+    const viewport = publishedWorkflow.graph.viewport!
+    handleUpdateWorkflowCanvas({
+      nodes,
+      edges,
+      viewport,
+    })
+    const mappedFeatures = {
+      opening: {
+        enabled: !!publishedWorkflow.features.opening_statement || !!publishedWorkflow.features.suggested_questions.length,
+        opening_statement: publishedWorkflow.features.opening_statement,
+        suggested_questions: publishedWorkflow.features.suggested_questions,
+      },
+      suggested: publishedWorkflow.features.suggested_questions_after_answer,
+      text2speech: publishedWorkflow.features.text_to_speech,
+      speech2text: publishedWorkflow.features.speech_to_text,
+      citation: publishedWorkflow.features.retriever_resource,
+      moderation: publishedWorkflow.features.sensitive_word_avoidance,
+      file: publishedWorkflow.features.file_upload,
+    }
+
+    featuresStore?.setState({ features: mappedFeatures })
+    workflowStore.getState().setEnvironmentVariables(publishedWorkflow.environment_variables || [])
+  }, [featuresStore, handleUpdateWorkflowCanvas, workflowStore])
+
+  return {
+    handleBackupDraft,
+    handleLoadBackupDraft,
+    handleRun,
+    handleStopRun,
+    handleRestoreFromPublishedWorkflow,
+  }
+}
diff --git a/app/components/workflow-app/hooks/use-workflow-start-run.tsx b/app/components/workflow-app/hooks/use-workflow-start-run.tsx
new file mode 100644
index 0000000..3f5ea1c
--- /dev/null
+++ b/app/components/workflow-app/hooks/use-workflow-start-run.tsx
@@ -0,0 +1,96 @@
+import { useCallback } from 'react'
+import { useStoreApi } from 'reactflow'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+import {
+  BlockEnum,
+  WorkflowRunningStatus,
+} from '@/app/components/workflow/types'
+import { useWorkflowInteractions } from '@/app/components/workflow/hooks'
+import { useFeaturesStore } from '@/app/components/base/features/hooks'
+import {
+  useIsChatMode,
+  useNodesSyncDraft,
+  useWorkflowRun,
+} from '.'
+
+export const useWorkflowStartRun = () => {
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+  const featuresStore = useFeaturesStore()
+  const isChatMode = useIsChatMode()
+  const { handleCancelDebugAndPreviewPanel } = useWorkflowInteractions()
+  const { handleRun } = useWorkflowRun()
+  const { doSyncWorkflowDraft } = useNodesSyncDraft()
+
+  const handleWorkflowStartRunInWorkflow = useCallback(async () => {
+    const {
+      workflowRunningData,
+    } = workflowStore.getState()
+
+    if (workflowRunningData?.result.status === WorkflowRunningStatus.Running)
+      return
+
+    const { getNodes } = store.getState()
+    const nodes = getNodes()
+    const startNode = nodes.find(node => node.data.type === BlockEnum.Start)
+    const startVariables = startNode?.data.variables || []
+    const fileSettings = featuresStore!.getState().features.file
+    const {
+      showDebugAndPreviewPanel,
+      setShowDebugAndPreviewPanel,
+      setShowInputsPanel,
+      setShowEnvPanel,
+    } = workflowStore.getState()
+
+    setShowEnvPanel(false)
+
+    if (showDebugAndPreviewPanel) {
+      handleCancelDebugAndPreviewPanel()
+      return
+    }
+
+    if (!startVariables.length && !fileSettings?.image?.enabled) {
+      await doSyncWorkflowDraft()
+      handleRun({ inputs: {}, files: [] })
+      setShowDebugAndPreviewPanel(true)
+      setShowInputsPanel(false)
+    }
+    else {
+      setShowDebugAndPreviewPanel(true)
+      setShowInputsPanel(true)
+    }
+  }, [store, workflowStore, featuresStore, handleCancelDebugAndPreviewPanel, handleRun, doSyncWorkflowDraft])
+
+  const handleWorkflowStartRunInChatflow = useCallback(async () => {
+    const {
+      showDebugAndPreviewPanel,
+      setShowDebugAndPreviewPanel,
+      setHistoryWorkflowData,
+      setShowEnvPanel,
+      setShowChatVariablePanel,
+    } = workflowStore.getState()
+
+    setShowEnvPanel(false)
+    setShowChatVariablePanel(false)
+
+    if (showDebugAndPreviewPanel)
+      handleCancelDebugAndPreviewPanel()
+    else
+      setShowDebugAndPreviewPanel(true)
+
+    setHistoryWorkflowData(undefined)
+  }, [workflowStore, handleCancelDebugAndPreviewPanel])
+
+  const handleStartWorkflowRun = useCallback(() => {
+    if (!isChatMode)
+      handleWorkflowStartRunInWorkflow()
+    else
+      handleWorkflowStartRunInChatflow()
+  }, [isChatMode, handleWorkflowStartRunInWorkflow, handleWorkflowStartRunInChatflow])
+
+  return {
+    handleStartWorkflowRun,
+    handleWorkflowStartRunInWorkflow,
+    handleWorkflowStartRunInChatflow,
+  }
+}
diff --git a/app/components/workflow-app/hooks/use-workflow-template.ts b/app/components/workflow-app/hooks/use-workflow-template.ts
new file mode 100644
index 0000000..9f47b98
--- /dev/null
+++ b/app/components/workflow-app/hooks/use-workflow-template.ts
@@ -0,0 +1,74 @@
+import { generateNewNode } from '@/app/components/workflow/utils'
+import {
+  NODE_WIDTH_X_OFFSET,
+  START_INITIAL_POSITION,
+} from '@/app/components/workflow/constants'
+import { useNodesInitialData } from '@/app/components/workflow/hooks'
+import { useIsChatMode } from './use-is-chat-mode'
+
+export const useWorkflowTemplate = () => {
+  const isChatMode = useIsChatMode()
+  const nodesInitialData = useNodesInitialData()
+
+  const { newNode: startNode } = generateNewNode({
+    data: nodesInitialData.start,
+    position: START_INITIAL_POSITION,
+  })
+
+  if (isChatMode) {
+    const { newNode: llmNode } = generateNewNode({
+      id: 'llm',
+      data: {
+        ...nodesInitialData.llm,
+        memory: {
+          window: { enabled: false, size: 10 },
+          query_prompt_template: '{{#sys.query#}}',
+        },
+        selected: true,
+      },
+      position: {
+        x: START_INITIAL_POSITION.x + NODE_WIDTH_X_OFFSET,
+        y: START_INITIAL_POSITION.y,
+      },
+    } as any)
+
+    const { newNode: answerNode } = generateNewNode({
+      id: 'answer',
+      data: {
+        ...nodesInitialData.answer,
+        answer: `{{#${llmNode.id}.text#}}`,
+      },
+      position: {
+        x: START_INITIAL_POSITION.x + NODE_WIDTH_X_OFFSET * 2,
+        y: START_INITIAL_POSITION.y,
+      },
+    } as any)
+
+    const startToLlmEdge = {
+      id: `${startNode.id}-${llmNode.id}`,
+      source: startNode.id,
+      sourceHandle: 'source',
+      target: llmNode.id,
+      targetHandle: 'target',
+    }
+
+    const llmToAnswerEdge = {
+      id: `${llmNode.id}-${answerNode.id}`,
+      source: llmNode.id,
+      sourceHandle: 'source',
+      target: answerNode.id,
+      targetHandle: 'target',
+    }
+
+    return {
+      nodes: [startNode, llmNode, answerNode],
+      edges: [startToLlmEdge, llmToAnswerEdge],
+    }
+  }
+  else {
+    return {
+      nodes: [startNode],
+      edges: [],
+    }
+  }
+}
diff --git a/app/components/workflow-app/index.tsx b/app/components/workflow-app/index.tsx
new file mode 100644
index 0000000..761a7f2
--- /dev/null
+++ b/app/components/workflow-app/index.tsx
@@ -0,0 +1,108 @@
+import {
+  useMemo,
+} from 'react'
+import useSWR from 'swr'
+import {
+  SupportUploadFileTypes,
+} from '@/app/components/workflow/types'
+import {
+  useWorkflowInit,
+} from './hooks'
+import {
+  initialEdges,
+  initialNodes,
+} from '@/app/components/workflow/utils'
+import Loading from '@/app/components/base/loading'
+import { FeaturesProvider } from '@/app/components/base/features'
+import type { Features as FeaturesData } from '@/app/components/base/features/types'
+import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'
+import { fetchFileUploadConfig } from '@/service/common'
+import WorkflowWithDefaultContext from '@/app/components/workflow'
+import {
+  WorkflowContextProvider,
+} from '@/app/components/workflow/context'
+import { createWorkflowSlice } from './store/workflow/workflow-slice'
+import WorkflowAppMain from './components/workflow-main'
+
+const WorkflowAppWithAdditionalContext = () => {
+  const {
+    data,
+    isLoading,
+  } = useWorkflowInit()
+  const { data: fileUploadConfigResponse } = useSWR({ url: '/files/upload' }, fetchFileUploadConfig)
+
+  const nodesData = useMemo(() => {
+    if (data)
+      return initialNodes(data.graph.nodes, data.graph.edges)
+
+    return []
+  }, [data])
+  const edgesData = useMemo(() => {
+    if (data)
+      return initialEdges(data.graph.edges, data.graph.nodes)
+
+    return []
+  }, [data])
+
+  if (!data || isLoading) {
+    return (
+      <div className='relative flex h-full w-full items-center justify-center'>
+        <Loading />
+      </div>
+    )
+  }
+
+  const features = data.features || {}
+  const initialFeatures: FeaturesData = {
+    file: {
+      image: {
+        enabled: !!features.file_upload?.image?.enabled,
+        number_limits: features.file_upload?.image?.number_limits || 3,
+        transfer_methods: features.file_upload?.image?.transfer_methods || ['local_file', 'remote_url'],
+      },
+      enabled: !!(features.file_upload?.enabled || features.file_upload?.image?.enabled),
+      allowed_file_types: features.file_upload?.allowed_file_types || [SupportUploadFileTypes.image],
+      allowed_file_extensions: features.file_upload?.allowed_file_extensions || FILE_EXTS[SupportUploadFileTypes.image].map(ext => `.${ext}`),
+      allowed_file_upload_methods: features.file_upload?.allowed_file_upload_methods || features.file_upload?.image?.transfer_methods || ['local_file', 'remote_url'],
+      number_limits: features.file_upload?.number_limits || features.file_upload?.image?.number_limits || 3,
+      fileUploadConfig: fileUploadConfigResponse,
+    },
+    opening: {
+      enabled: !!features.opening_statement,
+      opening_statement: features.opening_statement,
+      suggested_questions: features.suggested_questions,
+    },
+    suggested: features.suggested_questions_after_answer || { enabled: false },
+    speech2text: features.speech_to_text || { enabled: false },
+    text2speech: features.text_to_speech || { enabled: false },
+    citation: features.retriever_resource || { enabled: false },
+    moderation: features.sensitive_word_avoidance || { enabled: false },
+  }
+
+  return (
+    <WorkflowWithDefaultContext
+      edges={edgesData}
+      nodes={nodesData}
+    >
+      <FeaturesProvider features={initialFeatures}>
+        <WorkflowAppMain
+          nodes={nodesData}
+          edges={edgesData}
+          viewport={data.graph.viewport}
+        />
+      </FeaturesProvider>
+    </WorkflowWithDefaultContext>
+  )
+}
+
+const WorkflowAppWrapper = () => {
+  return (
+    <WorkflowContextProvider
+      injectWorkflowStoreSliceFn={createWorkflowSlice}
+    >
+      <WorkflowAppWithAdditionalContext />
+    </WorkflowContextProvider>
+  )
+}
+
+export default WorkflowAppWrapper
diff --git a/app/components/workflow-app/store/workflow/workflow-slice.ts b/app/components/workflow-app/store/workflow/workflow-slice.ts
new file mode 100644
index 0000000..77626e5
--- /dev/null
+++ b/app/components/workflow-app/store/workflow/workflow-slice.ts
@@ -0,0 +1,18 @@
+import type { StateCreator } from 'zustand'
+
+export type WorkflowSliceShape = {
+  appId: string
+  notInitialWorkflow: boolean
+  setNotInitialWorkflow: (notInitialWorkflow: boolean) => void
+  nodesDefaultConfigs: Record<string, any>
+  setNodesDefaultConfigs: (nodesDefaultConfigs: Record<string, any>) => void
+}
+
+export type CreateWorkflowSlice = StateCreator<WorkflowSliceShape>
+export const createWorkflowSlice: StateCreator<WorkflowSliceShape> = set => ({
+  appId: '',
+  notInitialWorkflow: false,
+  setNotInitialWorkflow: notInitialWorkflow => set(() => ({ notInitialWorkflow })),
+  nodesDefaultConfigs: {},
+  setNodesDefaultConfigs: nodesDefaultConfigs => set(() => ({ nodesDefaultConfigs })),
+})
diff --git a/app/components/workflow/block-icon.tsx b/app/components/workflow/block-icon.tsx
new file mode 100644
index 0000000..1e76efc
--- /dev/null
+++ b/app/components/workflow/block-icon.tsx
@@ -0,0 +1,147 @@
+import type { FC } from 'react'
+import { memo } from 'react'
+import { BlockEnum } from './types'
+import {
+  Agent,
+  Answer,
+  Assigner,
+  Code,
+  DocsExtractor,
+  End,
+  Home,
+  Http,
+  IfElse,
+  Iteration,
+  KnowledgeRetrieval,
+  ListFilter,
+  Llm,
+  Loop,
+  LoopEnd,
+  ParameterExtractor,
+  QuestionClassifier,
+  TemplatingTransform,
+  VariableX,
+} from '@/app/components/base/icons/src/vender/workflow'
+import AppIcon from '@/app/components/base/app-icon'
+
+type BlockIconProps = {
+  type: BlockEnum
+  size?: string
+  className?: string
+  toolIcon?: string | { content: string; background: string }
+}
+const ICON_CONTAINER_CLASSNAME_SIZE_MAP: Record<string, string> = {
+  xs: 'w-4 h-4 rounded-[5px] shadow-xs',
+  sm: 'w-5 h-5 rounded-md shadow-xs',
+  md: 'w-6 h-6 rounded-lg shadow-md',
+}
+const getIcon = (type: BlockEnum, className: string) => {
+  return {
+    [BlockEnum.Start]: <Home className={className} />,
+    [BlockEnum.LLM]: <Llm className={className} />,
+    [BlockEnum.Code]: <Code className={className} />,
+    [BlockEnum.End]: <End className={className} />,
+    [BlockEnum.IfElse]: <IfElse className={className} />,
+    [BlockEnum.HttpRequest]: <Http className={className} />,
+    [BlockEnum.Answer]: <Answer className={className} />,
+    [BlockEnum.KnowledgeRetrieval]: <KnowledgeRetrieval className={className} />,
+    [BlockEnum.QuestionClassifier]: <QuestionClassifier className={className} />,
+    [BlockEnum.TemplateTransform]: <TemplatingTransform className={className} />,
+    [BlockEnum.VariableAssigner]: <VariableX className={className} />,
+    [BlockEnum.VariableAggregator]: <VariableX className={className} />,
+    [BlockEnum.Assigner]: <Assigner className={className} />,
+    [BlockEnum.Tool]: <VariableX className={className} />,
+    [BlockEnum.IterationStart]: <VariableX className={className} />,
+    [BlockEnum.Iteration]: <Iteration className={className} />,
+    [BlockEnum.LoopStart]: <VariableX className={className} />,
+    [BlockEnum.Loop]: <Loop className={className} />,
+    [BlockEnum.LoopEnd]: <LoopEnd className={className} />,
+    [BlockEnum.ParameterExtractor]: <ParameterExtractor className={className} />,
+    [BlockEnum.DocExtractor]: <DocsExtractor className={className} />,
+    [BlockEnum.ListFilter]: <ListFilter className={className} />,
+    [BlockEnum.Agent]: <Agent className={className} />,
+  }[type]
+}
+const ICON_CONTAINER_BG_COLOR_MAP: Record<string, string> = {
+  [BlockEnum.Start]: 'bg-util-colors-blue-brand-blue-brand-500',
+  [BlockEnum.LLM]: 'bg-util-colors-indigo-indigo-500',
+  [BlockEnum.Code]: 'bg-util-colors-blue-blue-500',
+  [BlockEnum.End]: 'bg-util-colors-warning-warning-500',
+  [BlockEnum.IfElse]: 'bg-util-colors-cyan-cyan-500',
+  [BlockEnum.Iteration]: 'bg-util-colors-cyan-cyan-500',
+  [BlockEnum.Loop]: 'bg-util-colors-cyan-cyan-500',
+  [BlockEnum.LoopEnd]: 'bg-util-colors-warning-warning-500',
+  [BlockEnum.HttpRequest]: 'bg-util-colors-violet-violet-500',
+  [BlockEnum.Answer]: 'bg-util-colors-warning-warning-500',
+  [BlockEnum.KnowledgeRetrieval]: 'bg-util-colors-green-green-500',
+  [BlockEnum.QuestionClassifier]: 'bg-util-colors-green-green-500',
+  [BlockEnum.TemplateTransform]: 'bg-util-colors-blue-blue-500',
+  [BlockEnum.VariableAssigner]: 'bg-util-colors-blue-blue-500',
+  [BlockEnum.VariableAggregator]: 'bg-util-colors-blue-blue-500',
+  [BlockEnum.Assigner]: 'bg-util-colors-blue-blue-500',
+  [BlockEnum.ParameterExtractor]: 'bg-util-colors-blue-blue-500',
+  [BlockEnum.DocExtractor]: 'bg-util-colors-green-green-500',
+  [BlockEnum.ListFilter]: 'bg-util-colors-cyan-cyan-500',
+  [BlockEnum.Agent]: 'bg-util-colors-indigo-indigo-500',
+}
+const BlockIcon: FC<BlockIconProps> = ({
+  type,
+  size = 'sm',
+  className,
+  toolIcon,
+}) => {
+  return (
+    <div className={`
+      flex items-center justify-center border-[0.5px] border-white/2 text-white
+      ${ICON_CONTAINER_CLASSNAME_SIZE_MAP[size]}
+      ${ICON_CONTAINER_BG_COLOR_MAP[type]}
+      ${toolIcon && '!shadow-none'}
+      ${className}
+    `}
+    >
+      {
+        type !== BlockEnum.Tool && (
+          getIcon(type, size === 'xs' ? 'w-3 h-3' : 'w-3.5 h-3.5')
+        )
+      }
+      {
+        type === BlockEnum.Tool && toolIcon && (
+          <>
+            {
+              typeof toolIcon === 'string'
+                ? (
+                  <div
+                    className='h-full w-full shrink-0 rounded-md bg-cover bg-center'
+                    style={{
+                      backgroundImage: `url(${toolIcon})`,
+                    }}
+                  ></div>
+                )
+                : (
+                  <AppIcon
+                    className='!h-full !w-full shrink-0'
+                    size='tiny'
+                    icon={toolIcon?.content}
+                    background={toolIcon?.background}
+                  />
+                )
+            }
+          </>
+        )
+      }
+    </div>
+  )
+}
+
+export const VarBlockIcon: FC<BlockIconProps> = ({
+  type,
+  className,
+}) => {
+  return (
+    <>
+      {getIcon(type, `w-3 h-3 ${className}`)}
+    </>
+  )
+}
+
+export default memo(BlockIcon)
diff --git a/app/components/workflow/block-selector/all-tools.tsx b/app/components/workflow/block-selector/all-tools.tsx
new file mode 100644
index 0000000..3ad0a41
--- /dev/null
+++ b/app/components/workflow/block-selector/all-tools.tsx
@@ -0,0 +1,168 @@
+import {
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from 'react'
+import type {
+  OnSelectBlock,
+  ToolWithProvider,
+} from '../types'
+import type { ToolValue } from './types'
+import { ToolTypeEnum } from './types'
+import Tools from './tools'
+import { useToolTabs } from './hooks'
+import ViewTypeSelect, { ViewType } from './view-type-select'
+import cn from '@/utils/classnames'
+import { useGetLanguage } from '@/context/i18n'
+import type { ListRef } from '@/app/components/workflow/block-selector/market-place-plugin/list'
+import PluginList, { type ListProps } from '@/app/components/workflow/block-selector/market-place-plugin/list'
+import ActionButton from '../../base/action-button'
+import { RiAddLine } from '@remixicon/react'
+import { PluginType } from '../../plugins/types'
+import { useMarketplacePlugins } from '../../plugins/marketplace/hooks'
+import { useSelector as useAppContextSelector } from '@/context/app-context'
+
+type AllToolsProps = {
+  className?: string
+  toolContentClassName?: string
+  searchText: string
+  tags: ListProps['tags']
+  buildInTools: ToolWithProvider[]
+  customTools: ToolWithProvider[]
+  workflowTools: ToolWithProvider[]
+  onSelect: OnSelectBlock
+  supportAddCustomTool?: boolean
+  onAddedCustomTool?: () => void
+  onShowAddCustomCollectionModal?: () => void
+  selectedTools?: ToolValue[]
+}
+
+const DEFAULT_TAGS: AllToolsProps['tags'] = []
+
+const AllTools = ({
+  className,
+  toolContentClassName,
+  searchText,
+  tags = DEFAULT_TAGS,
+  onSelect,
+  buildInTools,
+  workflowTools,
+  customTools,
+  supportAddCustomTool,
+  onShowAddCustomCollectionModal,
+  selectedTools,
+}: AllToolsProps) => {
+  const language = useGetLanguage()
+  const tabs = useToolTabs()
+  const [activeTab, setActiveTab] = useState(ToolTypeEnum.All)
+  const [activeView, setActiveView] = useState<ViewType>(ViewType.flat)
+  const hasFilter = searchText || tags.length > 0
+  const isMatchingKeywords = (text: string, keywords: string) => {
+    return text.toLowerCase().includes(keywords.toLowerCase())
+  }
+  const tools = useMemo(() => {
+    let mergedTools: ToolWithProvider[] = []
+    if (activeTab === ToolTypeEnum.All)
+      mergedTools = [...buildInTools, ...customTools, ...workflowTools]
+    if (activeTab === ToolTypeEnum.BuiltIn)
+      mergedTools = buildInTools
+    if (activeTab === ToolTypeEnum.Custom)
+      mergedTools = customTools
+    if (activeTab === ToolTypeEnum.Workflow)
+      mergedTools = workflowTools
+
+    if (!hasFilter)
+      return mergedTools.filter(toolWithProvider => toolWithProvider.tools.length > 0)
+
+    return mergedTools.filter((toolWithProvider) => {
+      return isMatchingKeywords(toolWithProvider.name, searchText) || toolWithProvider.tools.some((tool) => {
+        return tool.label[language].toLowerCase().includes(searchText.toLowerCase()) || tool.name.toLowerCase().includes(searchText.toLowerCase())
+      })
+    })
+  }, [activeTab, buildInTools, customTools, workflowTools, searchText, language, hasFilter])
+
+  const {
+    queryPluginsWithDebounced: fetchPlugins,
+    plugins: notInstalledPlugins = [],
+  } = useMarketplacePlugins()
+
+  const { enable_marketplace } = useAppContextSelector(s => s.systemFeatures)
+
+  useEffect(() => {
+    if (enable_marketplace) return
+    if (searchText || tags.length > 0) {
+      fetchPlugins({
+        query: searchText,
+        tags,
+        category: PluginType.tool,
+      })
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [searchText, tags, enable_marketplace])
+
+  const pluginRef = useRef<ListRef>(null)
+  const wrapElemRef = useRef<HTMLDivElement>(null)
+
+  return (
+    <div className={cn(className)}>
+      <div className='flex items-center justify-between border-b-[0.5px] border-divider-subtle bg-background-default-hover px-3 shadow-xs'>
+        <div className='flex h-8 items-center space-x-1'>
+          {
+            tabs.map(tab => (
+              <div
+                className={cn(
+                  'flex h-6 cursor-pointer items-center rounded-md px-2 hover:bg-state-base-hover',
+                  'text-xs font-medium text-text-secondary',
+                  activeTab === tab.key && 'bg-state-base-hover-alt',
+                )}
+                key={tab.key}
+                onClick={() => setActiveTab(tab.key)}
+              >
+                {tab.name}
+              </div>
+            ))
+          }
+        </div>
+        <ViewTypeSelect viewType={activeView} onChange={setActiveView} />
+        {supportAddCustomTool && (
+          <div className='flex items-center'>
+            <div className='mr-1.5 h-3.5 w-px  bg-divider-regular'></div>
+            <ActionButton
+              className='bg-components-button-primary-bg text-components-button-primary-text hover:bg-components-button-primary-bg hover:text-components-button-primary-text'
+              onClick={onShowAddCustomCollectionModal}
+            >
+              <RiAddLine className='h-4 w-4' />
+            </ActionButton>
+          </div>
+        )}
+      </div>
+      <div
+        ref={wrapElemRef}
+        className='max-h-[464px] overflow-y-auto'
+        onScroll={pluginRef.current?.handleScroll}
+      >
+        <Tools
+          className={toolContentClassName}
+          showWorkflowEmpty={activeTab === ToolTypeEnum.Workflow}
+          tools={tools}
+          onSelect={onSelect}
+          viewType={activeView}
+          hasSearchText={!!searchText}
+          selectedTools={selectedTools}
+        />
+        {/* Plugins from marketplace */}
+        {enable_marketplace && <PluginList
+          ref={pluginRef}
+          wrapElemRef={wrapElemRef}
+          list={notInstalledPlugins}
+          searchText={searchText}
+          toolContentClassName={toolContentClassName}
+          tags={tags}
+        />}
+      </div>
+    </div>
+  )
+}
+
+export default AllTools
diff --git a/app/components/workflow/block-selector/blocks.tsx b/app/components/workflow/block-selector/blocks.tsx
new file mode 100644
index 0000000..4182530
--- /dev/null
+++ b/app/components/workflow/block-selector/blocks.tsx
@@ -0,0 +1,125 @@
+import {
+  memo,
+  useCallback,
+  useMemo,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { groupBy } from 'lodash-es'
+import BlockIcon from '../block-icon'
+import { BlockEnum } from '../types'
+import {
+  useIsChatMode,
+  useNodesExtraData,
+} from '../hooks'
+import { BLOCK_CLASSIFICATIONS } from './constants'
+import { useBlocks } from './hooks'
+import type { ToolDefaultValue } from './types'
+import Tooltip from '@/app/components/base/tooltip'
+import Badge from '@/app/components/base/badge'
+
+type BlocksProps = {
+  searchText: string
+  onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
+  availableBlocksTypes?: BlockEnum[]
+}
+const Blocks = ({
+  searchText,
+  onSelect,
+  availableBlocksTypes = [],
+}: BlocksProps) => {
+  const { t } = useTranslation()
+  const isChatMode = useIsChatMode()
+  const nodesExtraData = useNodesExtraData()
+  const blocks = useBlocks()
+
+  const groups = useMemo(() => {
+    return BLOCK_CLASSIFICATIONS.reduce((acc, classification) => {
+      const list = groupBy(blocks, 'classification')[classification].filter((block) => {
+        if (block.type === BlockEnum.Answer && !isChatMode)
+          return false
+
+        return block.title.toLowerCase().includes(searchText.toLowerCase()) && availableBlocksTypes.includes(block.type)
+      })
+
+      return {
+        ...acc,
+        [classification]: list,
+      }
+    }, {} as Record<string, typeof blocks>)
+  }, [blocks, isChatMode, searchText, availableBlocksTypes])
+  const isEmpty = Object.values(groups).every(list => !list.length)
+
+  const renderGroup = useCallback((classification: string) => {
+    const list = groups[classification]
+
+    return (
+      <div
+        key={classification}
+        className='mb-1 last-of-type:mb-0'
+      >
+        {
+          classification !== '-' && !!list.length && (
+            <div className='flex h-[22px] items-start px-3 text-xs font-medium text-text-tertiary'>
+              {t(`workflow.tabs.${classification}`)}
+            </div>
+          )
+        }
+        {
+          list.map(block => (
+            <Tooltip
+              key={block.type}
+              position='right'
+              popupClassName='w-[200px]'
+              popupContent={(
+                <div>
+                  <BlockIcon
+                    size='md'
+                    className='mb-2'
+                    type={block.type}
+                  />
+                  <div className='system-md-medium mb-1 text-text-primary'>{block.title}</div>
+                  <div className='system-xs-regular text-text-tertiary'>{nodesExtraData[block.type].about}</div>
+                </div>
+              )}
+            >
+              <div
+                key={block.type}
+                className='flex h-8 w-full cursor-pointer items-center rounded-lg px-3 hover:bg-state-base-hover'
+                onClick={() => onSelect(block.type)}
+              >
+                <BlockIcon
+                  className='mr-2 shrink-0'
+                  type={block.type}
+                />
+                <div className='grow text-sm text-text-secondary'>{block.title}</div>
+                {
+                  block.type === BlockEnum.LoopEnd && (
+                    <Badge
+                      text={t('workflow.nodes.loop.loopNode')}
+                      className='ml-2 shrink-0'
+                    />
+                  )
+                }
+              </div>
+            </Tooltip>
+          ))
+        }
+      </div>
+    )
+  }, [groups, nodesExtraData, onSelect, t])
+
+  return (
+    <div className='p-1'>
+      {
+        isEmpty && (
+          <div className='flex h-[22px] items-center px-3 text-xs font-medium text-text-tertiary'>{t('workflow.tabs.noResult')}</div>
+        )
+      }
+      {
+        !isEmpty && BLOCK_CLASSIFICATIONS.map(renderGroup)
+      }
+    </div>
+  )
+}
+
+export default memo(Blocks)
diff --git a/app/components/workflow/block-selector/constants.tsx b/app/components/workflow/block-selector/constants.tsx
new file mode 100644
index 0000000..680cbf4
--- /dev/null
+++ b/app/components/workflow/block-selector/constants.tsx
@@ -0,0 +1,111 @@
+import type { Block } from '../types'
+import { BlockEnum } from '../types'
+import { BlockClassificationEnum } from './types'
+
+export const BLOCKS: Block[] = [
+  {
+    classification: BlockClassificationEnum.Default,
+    type: BlockEnum.Start,
+    title: 'Start',
+    description: '',
+  },
+  {
+    classification: BlockClassificationEnum.Default,
+    type: BlockEnum.LLM,
+    title: 'LLM',
+  },
+  {
+    classification: BlockClassificationEnum.Default,
+    type: BlockEnum.KnowledgeRetrieval,
+    title: 'Knowledge Retrieval',
+  },
+  {
+    classification: BlockClassificationEnum.Default,
+    type: BlockEnum.End,
+    title: 'End',
+  },
+  {
+    classification: BlockClassificationEnum.Default,
+    type: BlockEnum.Answer,
+    title: 'Direct Answer',
+  },
+  {
+    classification: BlockClassificationEnum.QuestionUnderstand,
+    type: BlockEnum.QuestionClassifier,
+    title: 'Question Classifier',
+  },
+  {
+    classification: BlockClassificationEnum.Logic,
+    type: BlockEnum.IfElse,
+    title: 'IF/ELSE',
+  },
+  {
+    classification: BlockClassificationEnum.Logic,
+    type: BlockEnum.LoopEnd,
+    title: 'Exit Loop',
+    description: '',
+  },
+  {
+    classification: BlockClassificationEnum.Logic,
+    type: BlockEnum.Iteration,
+    title: 'Iteration',
+  },
+  {
+    classification: BlockClassificationEnum.Logic,
+    type: BlockEnum.Loop,
+    title: 'Loop',
+  },
+  {
+    classification: BlockClassificationEnum.Transform,
+    type: BlockEnum.Code,
+    title: 'Code',
+  },
+  {
+    classification: BlockClassificationEnum.Transform,
+    type: BlockEnum.TemplateTransform,
+    title: 'Templating Transform',
+  },
+  {
+    classification: BlockClassificationEnum.Transform,
+    type: BlockEnum.VariableAggregator,
+    title: 'Variable Aggregator',
+  },
+  {
+    classification: BlockClassificationEnum.Transform,
+    type: BlockEnum.DocExtractor,
+    title: 'Doc Extractor',
+  },
+  {
+    classification: BlockClassificationEnum.Transform,
+    type: BlockEnum.Assigner,
+    title: 'Variable Assigner',
+  },
+  {
+    classification: BlockClassificationEnum.Transform,
+    type: BlockEnum.ParameterExtractor,
+    title: 'Parameter Extractor',
+  },
+  {
+    classification: BlockClassificationEnum.Utilities,
+    type: BlockEnum.HttpRequest,
+    title: 'HTTP Request',
+  },
+  {
+    classification: BlockClassificationEnum.Utilities,
+    type: BlockEnum.ListFilter,
+    title: 'List Filter',
+  },
+  {
+    classification: BlockClassificationEnum.Default,
+    type: BlockEnum.Agent,
+    title: 'Agent',
+  },
+]
+
+export const BLOCK_CLASSIFICATIONS: string[] = [
+  BlockClassificationEnum.Default,
+  BlockClassificationEnum.QuestionUnderstand,
+  BlockClassificationEnum.Logic,
+  BlockClassificationEnum.Transform,
+  BlockClassificationEnum.Utilities,
+]
diff --git a/app/components/workflow/block-selector/hooks.ts b/app/components/workflow/block-selector/hooks.ts
new file mode 100644
index 0000000..a8b1759
--- /dev/null
+++ b/app/components/workflow/block-selector/hooks.ts
@@ -0,0 +1,55 @@
+import { useTranslation } from 'react-i18next'
+import { BLOCKS } from './constants'
+import {
+  TabsEnum,
+  ToolTypeEnum,
+} from './types'
+
+export const useBlocks = () => {
+  const { t } = useTranslation()
+
+  return BLOCKS.map((block) => {
+    return {
+      ...block,
+      title: t(`workflow.blocks.${block.type}`),
+    }
+  })
+}
+
+export const useTabs = () => {
+  const { t } = useTranslation()
+
+  return [
+    {
+      key: TabsEnum.Blocks,
+      name: t('workflow.tabs.blocks'),
+    },
+    {
+      key: TabsEnum.Tools,
+      name: t('workflow.tabs.tools'),
+    },
+  ]
+}
+
+export const useToolTabs = () => {
+  const { t } = useTranslation()
+
+  return [
+    {
+      key: ToolTypeEnum.All,
+      name: t('workflow.tabs.allTool'),
+    },
+    {
+      key: ToolTypeEnum.BuiltIn,
+      name: t('workflow.tabs.plugin'),
+    },
+    {
+      key: ToolTypeEnum.Custom,
+      name: t('workflow.tabs.customTool'),
+    },
+    {
+      key: ToolTypeEnum.Workflow,
+      name: t('workflow.tabs.workflowTool'),
+    },
+  ]
+}
diff --git a/app/components/workflow/block-selector/index-bar.tsx b/app/components/workflow/block-selector/index-bar.tsx
new file mode 100644
index 0000000..4d8bedf
--- /dev/null
+++ b/app/components/workflow/block-selector/index-bar.tsx
@@ -0,0 +1,97 @@
+import { pinyin } from 'pinyin-pro'
+import type { FC, RefObject } from 'react'
+import type { ToolWithProvider } from '../types'
+import { CollectionType } from '../../tools/types'
+import classNames from '@/utils/classnames'
+
+export const CUSTOM_GROUP_NAME = '@@@custom@@@'
+export const WORKFLOW_GROUP_NAME = '@@@workflow@@@'
+export const AGENT_GROUP_NAME = '@@@agent@@@'
+/*
+{
+  A: {
+    'google': [ // plugin organize name
+      ...tools
+    ],
+    'custom': [ // custom tools
+      ...tools
+    ],
+    'workflow': [ // workflow as tools
+      ...tools
+    ]
+  }
+}
+*/
+export const groupItems = (items: ToolWithProvider[], getFirstChar: (item: ToolWithProvider) => string) => {
+  const groups = items.reduce((acc: Record<string, Record<string, ToolWithProvider[]>>, item) => {
+    const firstChar = getFirstChar(item)
+    if (!firstChar || firstChar.length === 0)
+      return acc
+
+    let letter
+
+    // transform Chinese to pinyin
+    if (/[\u4E00-\u9FA5]/.test(firstChar))
+      letter = pinyin(firstChar, { pattern: 'first', toneType: 'none' })[0].toUpperCase()
+    else
+      letter = firstChar.toUpperCase()
+
+    if (!/[A-Z]/.test(letter))
+      letter = '#'
+
+    if (!acc[letter])
+      acc[letter] = {}
+
+    let groupName: string = ''
+    if (item.type === CollectionType.builtIn)
+      groupName = item.author
+    else if (item.type === CollectionType.custom)
+      groupName = CUSTOM_GROUP_NAME
+    else if (item.type === CollectionType.workflow)
+      groupName = WORKFLOW_GROUP_NAME
+    else
+      groupName = AGENT_GROUP_NAME
+
+    if (!acc[letter][groupName])
+      acc[letter][groupName] = []
+
+    acc[letter][groupName].push(item)
+
+    return acc
+  }, {})
+
+  const letters = Object.keys(groups).sort()
+  // move '#' to the end
+  const hashIndex = letters.indexOf('#')
+  if (hashIndex !== -1) {
+    letters.splice(hashIndex, 1)
+    letters.push('#')
+  }
+  return { letters, groups }
+}
+
+type IndexBarProps = {
+  letters: string[]
+  itemRefs: RefObject<{ [key: string]: HTMLElement | null }>
+  className?: string
+}
+
+const IndexBar: FC<IndexBarProps> = ({ letters, itemRefs, className }) => {
+  const handleIndexClick = (letter: string) => {
+    const element = itemRefs.current?.[letter]
+    if (element)
+      element.scrollIntoView({ behavior: 'smooth' })
+  }
+  return (
+    <div className={classNames('index-bar absolute right-0 top-36 flex flex-col items-center w-6 justify-center text-xs font-medium text-text-quaternary', className)}>
+      <div className='absolute left-0 top-0 h-full w-px bg-[linear-gradient(270deg,rgba(255,255,255,0)_0%,rgba(16,24,40,0.08)_30%,rgba(16,24,40,0.08)_50%,rgba(16,24,40,0.08)_70.5%,rgba(255,255,255,0)_100%)]'></div>
+      {letters.map(letter => (
+        <div className="cursor-pointer hover:text-text-secondary" key={letter} onClick={() => handleIndexClick(letter)}>
+          {letter}
+        </div>
+      ))}
+    </div>
+  )
+}
+
+export default IndexBar
diff --git a/app/components/workflow/block-selector/index.tsx b/app/components/workflow/block-selector/index.tsx
new file mode 100644
index 0000000..9e55a24
--- /dev/null
+++ b/app/components/workflow/block-selector/index.tsx
@@ -0,0 +1,171 @@
+import type {
+  FC,
+  MouseEventHandler,
+} from 'react'
+import {
+  memo,
+  useCallback,
+  useMemo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import type {
+  OffsetOptions,
+  Placement,
+} from '@floating-ui/react'
+import type { BlockEnum, OnSelectBlock } from '../types'
+import Tabs from './tabs'
+import { TabsEnum } from './types'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Input from '@/app/components/base/input'
+import SearchBox from '@/app/components/plugins/marketplace/search-box'
+
+import {
+  Plus02,
+} from '@/app/components/base/icons/src/vender/line/general'
+
+type NodeSelectorProps = {
+  open?: boolean
+  onOpenChange?: (open: boolean) => void
+  onSelect: OnSelectBlock
+  trigger?: (open: boolean) => React.ReactNode
+  placement?: Placement
+  offset?: OffsetOptions
+  triggerStyle?: React.CSSProperties
+  triggerClassName?: (open: boolean) => string
+  triggerInnerClassName?: string
+  popupClassName?: string
+  asChild?: boolean
+  availableBlocksTypes?: BlockEnum[]
+  disabled?: boolean
+  noBlocks?: boolean
+}
+const NodeSelector: FC<NodeSelectorProps> = ({
+  open: openFromProps,
+  onOpenChange,
+  onSelect,
+  trigger,
+  placement = 'right',
+  offset = 6,
+  triggerClassName,
+  triggerInnerClassName,
+  triggerStyle,
+  popupClassName,
+  asChild,
+  availableBlocksTypes,
+  disabled,
+  noBlocks = false,
+}) => {
+  const { t } = useTranslation()
+  const [searchText, setSearchText] = useState('')
+  const [tags, setTags] = useState<string[]>([])
+  const [localOpen, setLocalOpen] = useState(false)
+  const open = openFromProps === undefined ? localOpen : openFromProps
+  const handleOpenChange = useCallback((newOpen: boolean) => {
+    setLocalOpen(newOpen)
+
+    if (!newOpen)
+      setSearchText('')
+
+    if (onOpenChange)
+      onOpenChange(newOpen)
+  }, [onOpenChange])
+  const handleTrigger = useCallback<MouseEventHandler<HTMLDivElement>>((e) => {
+    if (disabled)
+      return
+    e.stopPropagation()
+    handleOpenChange(!open)
+  }, [handleOpenChange, open, disabled])
+  const handleSelect = useCallback<OnSelectBlock>((type, toolDefaultValue) => {
+    handleOpenChange(false)
+    onSelect(type, toolDefaultValue)
+  }, [handleOpenChange, onSelect])
+
+  const [activeTab, setActiveTab] = useState(noBlocks ? TabsEnum.Tools : TabsEnum.Blocks)
+  const handleActiveTabChange = useCallback((newActiveTab: TabsEnum) => {
+    setActiveTab(newActiveTab)
+  }, [])
+  const searchPlaceholder = useMemo(() => {
+    if (activeTab === TabsEnum.Blocks)
+      return t('workflow.tabs.searchBlock')
+
+    if (activeTab === TabsEnum.Tools)
+      return t('workflow.tabs.searchTool')
+    return ''
+  }, [activeTab, t])
+
+  return (
+    <PortalToFollowElem
+      placement={placement}
+      offset={offset}
+      open={open}
+      onOpenChange={handleOpenChange}
+    >
+      <PortalToFollowElemTrigger
+        asChild={asChild}
+        onClick={handleTrigger}
+        className={triggerInnerClassName}
+      >
+        {
+          trigger
+            ? trigger(open)
+            : (
+              <div
+                className={`
+                  z-10 flex h-4
+                  w-4 cursor-pointer items-center justify-center rounded-full bg-components-button-primary-bg text-text-primary-on-surface hover:bg-components-button-primary-bg-hover
+                  ${triggerClassName?.(open)}
+                `}
+                style={triggerStyle}
+              >
+                <Plus02 className='h-2.5 w-2.5' />
+              </div>
+            )
+        }
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[1000]'>
+        <div className={`rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-lg ${popupClassName}`}>
+          <div className='px-2 pt-2' onClick={e => e.stopPropagation()}>
+            {activeTab === TabsEnum.Blocks && (
+              <Input
+                showLeftIcon
+                showClearIcon
+                autoFocus
+                value={searchText}
+                placeholder={searchPlaceholder}
+                onChange={e => setSearchText(e.target.value)}
+                onClear={() => setSearchText('')}
+              />
+            )}
+            {activeTab === TabsEnum.Tools && (
+              <SearchBox
+                search={searchText}
+                onSearchChange={setSearchText}
+                tags={tags}
+                onTagsChange={setTags}
+                size='small'
+                placeholder={t('plugin.searchTools')!}
+              />
+            )}
+
+          </div>
+          <Tabs
+            activeTab={activeTab}
+            onActiveTabChange={handleActiveTabChange}
+            onSelect={handleSelect}
+            searchText={searchText}
+            tags={tags}
+            availableBlocksTypes={availableBlocksTypes}
+            noBlocks={noBlocks}
+          />
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default memo(NodeSelector)
diff --git a/app/components/workflow/block-selector/market-place-plugin/action.tsx b/app/components/workflow/block-selector/market-place-plugin/action.tsx
new file mode 100644
index 0000000..9c3c69d
--- /dev/null
+++ b/app/components/workflow/block-selector/market-place-plugin/action.tsx
@@ -0,0 +1,89 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useRef, useState } from 'react'
+import { useTheme } from 'next-themes'
+import { useTranslation } from 'react-i18next'
+import { RiMoreFill } from '@remixicon/react'
+import ActionButton from '@/app/components/base/action-button'
+// import Button from '@/app/components/base/button'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import cn from '@/utils/classnames'
+import { MARKETPLACE_URL_PREFIX } from '@/config'
+import { useDownloadPlugin } from '@/service/use-plugins'
+import { downloadFile } from '@/utils/format'
+
+type Props = {
+  open: boolean
+  onOpenChange: (v: boolean) => void
+  author: string
+  name: string
+  version: string
+}
+
+const OperationDropdown: FC<Props> = ({
+  open,
+  onOpenChange,
+  author,
+  name,
+  version,
+}) => {
+  const { t } = useTranslation()
+  const { theme } = useTheme()
+  const openRef = useRef(open)
+  const setOpen = useCallback((v: boolean) => {
+    onOpenChange(v)
+    openRef.current = v
+  }, [onOpenChange])
+
+  const handleTrigger = useCallback(() => {
+    setOpen(!openRef.current)
+  }, [setOpen])
+
+  const [needDownload, setNeedDownload] = useState(false)
+  const { data: blob, isLoading } = useDownloadPlugin({
+    organization: author,
+    pluginName: name,
+    version,
+  }, needDownload)
+  const handleDownload = useCallback(() => {
+    if (isLoading) return
+    setNeedDownload(true)
+  }, [isLoading])
+
+  useEffect(() => {
+    if (blob) {
+      const fileName = `${author}-${name}_${version}.zip`
+      downloadFile({ data: blob, fileName })
+      setNeedDownload(false)
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [blob])
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: 0,
+        crossAxis: 0,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={handleTrigger}>
+        <ActionButton className={cn(open && 'bg-state-base-hover')}>
+          <RiMoreFill className='h-4 w-4 text-components-button-secondary-accent-text' />
+        </ActionButton>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[9999]'>
+        <div className='w-[112px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
+          <div onClick={handleDownload} className='system-md-regular cursor-pointer rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover'>{t('common.operation.download')}</div>
+          <a href={`${MARKETPLACE_URL_PREFIX}/plugins/${author}/${name}${theme ? `?theme=${theme}` : ''}`} target='_blank' className='system-md-regular block cursor-pointer rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover'>{t('common.operation.viewDetails')}</a>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default React.memo(OperationDropdown)
diff --git a/app/components/workflow/block-selector/market-place-plugin/item.tsx b/app/components/workflow/block-selector/market-place-plugin/item.tsx
new file mode 100644
index 0000000..4826108
--- /dev/null
+++ b/app/components/workflow/block-selector/market-place-plugin/item.tsx
@@ -0,0 +1,77 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import Action from './action'
+import type { Plugin } from '@/app/components/plugins/types.ts'
+import InstallFromMarketplace from '@/app/components/plugins/install-plugin/install-from-marketplace'
+import I18n from '@/context/i18n'
+import cn from '@/utils/classnames'
+
+import { formatNumber } from '@/utils/format'
+import { useBoolean } from 'ahooks'
+
+enum ActionType {
+  install = 'install',
+  download = 'download',
+  // viewDetail = 'viewDetail', // wait for marketplace api
+}
+type Props = {
+  payload: Plugin
+  onAction: (type: ActionType) => void
+}
+
+const Item: FC<Props> = ({
+  payload,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = React.useState(false)
+  const { locale } = useContext(I18n)
+  const getLocalizedText = (obj: Record<string, string> | undefined) =>
+    obj?.[locale] || obj?.['en-US'] || obj?.en_US || ''
+  const [isShowInstallModal, {
+    setTrue: showInstallModal,
+    setFalse: hideInstallModal,
+  }] = useBoolean(false)
+
+  return (
+    <div className='group/plugin flex rounded-lg py-1 pl-3 pr-1 hover:bg-state-base-hover'>
+      <div
+        className='relative h-6 w-6 shrink-0 rounded-md border-[0.5px] border-components-panel-border-subtle bg-contain bg-center bg-no-repeat'
+        style={{ backgroundImage: `url(${payload.icon})` }}
+      />
+      <div className='ml-2 flex w-0 grow'>
+        <div className='w-0 grow'>
+          <div className='system-sm-medium h-4 truncate leading-4 text-text-primary '>{getLocalizedText(payload.label)}</div>
+          <div className='system-xs-regular h-5 truncate leading-5 text-text-tertiary'>{getLocalizedText(payload.brief)}</div>
+          <div className='system-xs-regular flex space-x-1 text-text-tertiary'>
+            <div>{payload.org}</div>
+            <div>路</div>
+            <div>{t('plugin.install', { num: formatNumber(payload.install_count || 0) })}</div>
+          </div>
+        </div>
+        {/* Action */}
+        <div className={cn(!open ? 'hidden' : 'flex', 'system-xs-medium  h-4 items-center space-x-1 text-components-button-secondary-accent-text group-hover/plugin:flex')}>
+          <div className='cursor-pointer px-1.5' onClick={showInstallModal}>{t('plugin.installAction')}</div>
+          <Action
+            open={open}
+            onOpenChange={setOpen}
+            author={payload.org}
+            name={payload.name}
+            version={payload.latest_version}
+          />
+        </div>
+        {isShowInstallModal && (
+          <InstallFromMarketplace
+            uniqueIdentifier={payload.latest_package_identifier}
+            manifest={payload}
+            onSuccess={hideInstallModal}
+            onClose={hideInstallModal}
+          />
+        )}
+      </div>
+    </div>
+  )
+}
+export default React.memo(Item)
diff --git a/app/components/workflow/block-selector/market-place-plugin/list.tsx b/app/components/workflow/block-selector/market-place-plugin/list.tsx
new file mode 100644
index 0000000..27cd2ae
--- /dev/null
+++ b/app/components/workflow/block-selector/market-place-plugin/list.tsx
@@ -0,0 +1,131 @@
+'use client'
+import React, { forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from 'react'
+import { useTranslation } from 'react-i18next'
+import useStickyScroll, { ScrollPosition } from '../use-sticky-scroll'
+import Item from './item'
+import type { Plugin } from '@/app/components/plugins/types.ts'
+import cn from '@/utils/classnames'
+import Link from 'next/link'
+import { marketplaceUrlPrefix } from '@/config'
+import { RiArrowRightUpLine, RiSearchLine } from '@remixicon/react'
+import { noop } from 'lodash-es'
+
+export type ListProps = {
+  wrapElemRef: React.RefObject<HTMLElement>
+  list: Plugin[]
+  searchText: string
+  tags: string[]
+  toolContentClassName?: string
+  disableMaxWidth?: boolean
+}
+
+export type ListRef = { handleScroll: () => void }
+
+const List = forwardRef<ListRef, ListProps>(({
+  wrapElemRef,
+  searchText,
+  tags,
+  list,
+  toolContentClassName,
+  disableMaxWidth = false,
+}, ref) => {
+  const { t } = useTranslation()
+  const hasFilter = !searchText
+  const hasRes = list.length > 0
+  const urlWithSearchText = `${marketplaceUrlPrefix}/?q=${searchText}&tags=${tags.join(',')}`
+  const nextToStickyELemRef = useRef<HTMLDivElement>(null)
+
+  const { handleScroll, scrollPosition } = useStickyScroll({
+    wrapElemRef,
+    nextToStickyELemRef,
+  })
+  const stickyClassName = useMemo(() => {
+    switch (scrollPosition) {
+      case ScrollPosition.aboveTheWrap:
+        return 'top-0 h-9 pt-3 pb-2 shadow-xs bg-components-panel-bg-blur cursor-pointer'
+      case ScrollPosition.showing:
+        return 'bottom-0 pt-3 pb-1'
+      case ScrollPosition.belowTheWrap:
+        return 'bottom-0 items-center rounded-b-xl border-t border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg rounded-b-lg cursor-pointer'
+    }
+  }, [scrollPosition])
+
+  useImperativeHandle(ref, () => ({
+    handleScroll,
+  }))
+
+  useEffect(() => {
+    handleScroll()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [list])
+
+  const handleHeadClick = () => {
+    if (scrollPosition === ScrollPosition.belowTheWrap) {
+      nextToStickyELemRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' })
+      return
+    }
+    window.open(urlWithSearchText, '_blank')
+  }
+
+  if (hasFilter) {
+    return (
+      <Link
+        className='system-sm-medium sticky bottom-0 z-10 flex h-8 cursor-pointer items-center rounded-b-lg border-[0.5px] border-t border-components-panel-border bg-components-panel-bg-blur px-4 py-1 text-text-accent-light-mode-only shadow-lg'
+        href={`${marketplaceUrlPrefix}/`}
+        target='_blank'
+      >
+        <span>{t('plugin.findMoreInMarketplace')}</span>
+        <RiArrowRightUpLine className='ml-0.5 h-3 w-3' />
+      </Link>
+    )
+  }
+
+  const maxWidthClassName = toolContentClassName || 'max-w-[300px]'
+
+  return (
+    <>
+      {hasRes && (
+        <div
+          className={cn('system-sm-medium sticky z-10 flex h-8 cursor-pointer justify-between px-4 py-1 text-text-primary', stickyClassName, !disableMaxWidth && maxWidthClassName)}
+          onClick={handleHeadClick}
+        >
+          <span>{t('plugin.fromMarketplace')}</span>
+          <Link
+            href={urlWithSearchText}
+            target='_blank'
+            className='flex items-center text-text-accent-light-mode-only'
+            onClick={e => e.stopPropagation()}
+          >
+            <span>{t('plugin.searchInMarketplace')}</span>
+            <RiArrowRightUpLine className='ml-0.5 h-3 w-3' />
+          </Link>
+        </div>
+      )}
+      <div className={cn('p-1', !disableMaxWidth && maxWidthClassName)} ref={nextToStickyELemRef}>
+        {list.map((item, index) => (
+          <Item
+            key={index}
+            payload={item}
+            onAction={noop}
+          />
+        ))}
+        <div className='mb-3 mt-2 flex items-center justify-center space-x-2'>
+          <div className="h-[2px] w-[90px] bg-gradient-to-l from-[rgba(16,24,40,0.08)] to-[rgba(255,255,255,0.01)]"></div>
+          <Link
+            href={urlWithSearchText}
+            target='_blank'
+            className='system-sm-medium flex h-4 shrink-0 items-center text-text-accent-light-mode-only'
+          >
+            <RiSearchLine className='mr-0.5 h-3 w-3' />
+            <span>{t('plugin.searchInMarketplace')}</span>
+          </Link>
+          <div className="h-[2px] w-[90px] bg-gradient-to-l from-[rgba(255,255,255,0.01)] to-[rgba(16,24,40,0.08)]"></div>
+        </div>
+      </div>
+    </>
+  )
+})
+
+List.displayName = 'List'
+
+export default List
diff --git a/app/components/workflow/block-selector/tabs.tsx b/app/components/workflow/block-selector/tabs.tsx
new file mode 100644
index 0000000..67aaaba
--- /dev/null
+++ b/app/components/workflow/block-selector/tabs.tsx
@@ -0,0 +1,85 @@
+import type { FC } from 'react'
+import { memo } from 'react'
+import { useAllBuiltInTools, useAllCustomTools, useAllWorkflowTools } from '@/service/use-tools'
+import type { BlockEnum } from '../types'
+import { useTabs } from './hooks'
+import type { ToolDefaultValue } from './types'
+import { TabsEnum } from './types'
+import Blocks from './blocks'
+import AllTools from './all-tools'
+import cn from '@/utils/classnames'
+
+export type TabsProps = {
+  activeTab: TabsEnum
+  onActiveTabChange: (activeTab: TabsEnum) => void
+  searchText: string
+  tags: string[]
+  onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
+  availableBlocksTypes?: BlockEnum[]
+  noBlocks?: boolean
+}
+const Tabs: FC<TabsProps> = ({
+  activeTab,
+  onActiveTabChange,
+  tags,
+  searchText,
+  onSelect,
+  availableBlocksTypes,
+  noBlocks,
+}) => {
+  const tabs = useTabs()
+  const { data: buildInTools } = useAllBuiltInTools()
+  const { data: customTools } = useAllCustomTools()
+  const { data: workflowTools } = useAllWorkflowTools()
+
+  return (
+    <div onClick={e => e.stopPropagation()}>
+      {
+        !noBlocks && (
+          <div className='flex items-center border-b-[0.5px] border-divider-subtle px-3'>
+            {
+              tabs.map(tab => (
+                <div
+                  key={tab.key}
+                  className={cn(
+                    'system-sm-medium relative mr-4 cursor-pointer pb-2 pt-1',
+                    activeTab === tab.key
+                      ? 'text-text-primary after:absolute after:bottom-0 after:left-0 after:h-0.5 after:w-full after:bg-util-colors-blue-brand-blue-brand-600'
+                      : 'text-text-tertiary',
+                  )}
+                  onClick={() => onActiveTabChange(tab.key)}
+                >
+                  {tab.name}
+                </div>
+              ))
+            }
+          </div>
+        )
+      }
+      {
+        activeTab === TabsEnum.Blocks && !noBlocks && (
+          <Blocks
+            searchText={searchText}
+            onSelect={onSelect}
+            availableBlocksTypes={availableBlocksTypes}
+          />
+        )
+      }
+      {
+        activeTab === TabsEnum.Tools && (
+          <AllTools
+            className='w-[315px]'
+            searchText={searchText}
+            onSelect={onSelect}
+            tags={tags}
+            buildInTools={buildInTools || []}
+            customTools={customTools || []}
+            workflowTools={workflowTools || []}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default memo(Tabs)
diff --git a/app/components/workflow/block-selector/tool-picker.tsx b/app/components/workflow/block-selector/tool-picker.tsx
new file mode 100644
index 0000000..dbb49fd
--- /dev/null
+++ b/app/components/workflow/block-selector/tool-picker.tsx
@@ -0,0 +1,176 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useMemo, useState } from 'react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import type {
+  OffsetOptions,
+  Placement,
+} from '@floating-ui/react'
+import AllTools from '@/app/components/workflow/block-selector/all-tools'
+import type { ToolDefaultValue, ToolValue } from './types'
+import type { BlockEnum } from '@/app/components/workflow/types'
+import SearchBox from '@/app/components/plugins/marketplace/search-box'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import EditCustomToolModal from '@/app/components/tools/edit-custom-collection-modal/modal'
+import {
+  createCustomCollection,
+} from '@/service/tools'
+import type { CustomCollectionBackend } from '@/app/components/tools/types'
+import Toast from '@/app/components/base/toast'
+import { useAllBuiltInTools, useAllCustomTools, useAllWorkflowTools, useInvalidateAllCustomTools } from '@/service/use-tools'
+import cn from '@/utils/classnames'
+
+type Props = {
+  panelClassName?: string
+  disabled: boolean
+  trigger: React.ReactNode
+  placement?: Placement
+  offset?: OffsetOptions
+  isShow: boolean
+  onShowChange: (isShow: boolean) => void
+  onSelect: (tool: ToolDefaultValue) => void
+  supportAddCustomTool?: boolean
+  scope?: string
+  selectedTools?: ToolValue[]
+}
+
+const ToolPicker: FC<Props> = ({
+  disabled,
+  trigger,
+  placement = 'right-start',
+  offset = 0,
+  isShow,
+  onShowChange,
+  onSelect,
+  supportAddCustomTool,
+  scope = 'all',
+  selectedTools,
+  panelClassName,
+}) => {
+  const { t } = useTranslation()
+  const [searchText, setSearchText] = useState('')
+  const [tags, setTags] = useState<string[]>([])
+
+  const { data: buildInTools } = useAllBuiltInTools()
+  const { data: customTools } = useAllCustomTools()
+  const invalidateCustomTools = useInvalidateAllCustomTools()
+  const { data: workflowTools } = useAllWorkflowTools()
+
+  const { builtinToolList, customToolList, workflowToolList } = useMemo(() => {
+    if (scope === 'plugins') {
+      return {
+        builtinToolList: buildInTools,
+        customToolList: [],
+        workflowToolList: [],
+      }
+    }
+    if (scope === 'custom') {
+      return {
+        builtinToolList: [],
+        customToolList: customTools,
+        workflowToolList: [],
+      }
+    }
+    if (scope === 'workflow') {
+      return {
+        builtinToolList: [],
+        customToolList: [],
+        workflowToolList: workflowTools,
+      }
+    }
+    return {
+      builtinToolList: buildInTools,
+      customToolList: customTools,
+      workflowToolList: workflowTools,
+    }
+  }, [scope, buildInTools, customTools, workflowTools])
+
+  const handleAddedCustomTool = invalidateCustomTools
+
+  const handleTriggerClick = () => {
+    if (disabled) return
+    onShowChange(true)
+  }
+
+  const handleSelect = (_type: BlockEnum, tool?: ToolDefaultValue) => {
+    onSelect(tool!)
+  }
+
+  const [isShowEditCollectionToolModal, {
+    setFalse: hideEditCustomCollectionModal,
+    setTrue: showEditCustomCollectionModal,
+  }] = useBoolean(false)
+
+  const doCreateCustomToolCollection = async (data: CustomCollectionBackend) => {
+    await createCustomCollection(data)
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+    hideEditCustomCollectionModal()
+    handleAddedCustomTool()
+  }
+
+  if (isShowEditCollectionToolModal) {
+    return (
+      <EditCustomToolModal
+        positionLeft
+        payload={null}
+        onHide={hideEditCustomCollectionModal}
+        onAdd={doCreateCustomToolCollection}
+      />
+    )
+  }
+
+  return (
+    <PortalToFollowElem
+      placement={placement}
+      offset={offset}
+      open={isShow}
+      onOpenChange={onShowChange}
+    >
+      <PortalToFollowElemTrigger
+        onClick={handleTriggerClick}
+      >
+        {trigger}
+      </PortalToFollowElemTrigger>
+
+      <PortalToFollowElemContent className='z-[1000]'>
+        <div className={cn('relative min-h-20 w-[356px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg backdrop-blur-sm', panelClassName)}>
+          <div className='p-2 pb-1'>
+            <SearchBox
+              search={searchText}
+              onSearchChange={setSearchText}
+              tags={tags}
+              onTagsChange={setTags}
+              size='small'
+              placeholder={t('plugin.searchTools')!}
+            />
+          </div>
+          <AllTools
+            className='mt-1'
+            toolContentClassName='max-w-[360px]'
+            tags={tags}
+            searchText={searchText}
+            onSelect={handleSelect}
+            buildInTools={builtinToolList || []}
+            customTools={customToolList || []}
+            workflowTools={workflowToolList || []}
+            supportAddCustomTool={supportAddCustomTool}
+            onAddedCustomTool={handleAddedCustomTool}
+            onShowAddCustomCollectionModal={showEditCustomCollectionModal}
+            selectedTools={selectedTools}
+          />
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default React.memo(ToolPicker)
diff --git a/app/components/workflow/block-selector/tool/action-item.tsx b/app/components/workflow/block-selector/tool/action-item.tsx
new file mode 100644
index 0000000..dc9b9b9
--- /dev/null
+++ b/app/components/workflow/block-selector/tool/action-item.tsx
@@ -0,0 +1,90 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { ToolWithProvider } from '../../types'
+import { BlockEnum } from '../../types'
+import type { ToolDefaultValue } from '../types'
+import Tooltip from '@/app/components/base/tooltip'
+import type { Tool } from '@/app/components/tools/types'
+import { useGetLanguage } from '@/context/i18n'
+import BlockIcon from '../../block-icon'
+import cn from '@/utils/classnames'
+import { useTranslation } from 'react-i18next'
+import { RiCheckLine } from '@remixicon/react'
+import Badge from '@/app/components/base/badge'
+
+type Props = {
+  provider: ToolWithProvider
+  payload: Tool
+  disabled?: boolean
+  onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
+}
+
+const ToolItem: FC<Props> = ({
+  provider,
+  payload,
+  onSelect,
+  disabled,
+}) => {
+  const { t } = useTranslation()
+
+  const language = useGetLanguage()
+
+  return (
+    <Tooltip
+      key={payload.name}
+      position='right'
+      popupClassName='!p-0 !px-3 !py-2.5 !w-[200px] !leading-[18px] !text-xs !text-gray-700 !border-[0.5px] !border-black/5 !rounded-xl !shadow-lg'
+      popupContent={(
+        <div>
+          <BlockIcon
+            size='md'
+            className='mb-2'
+            type={BlockEnum.Tool}
+            toolIcon={provider.icon}
+          />
+          <div className='mb-1 text-sm leading-5 text-text-primary'>{payload.label[language]}</div>
+          <div className='text-xs leading-[18px] text-text-secondary'>{payload.description[language]}</div>
+        </div>
+      )}
+    >
+      <div
+        key={payload.name}
+        className='flex cursor-pointer items-center justify-between rounded-lg pl-[21px] pr-1 hover:bg-state-base-hover'
+        onClick={() => {
+          if (disabled) return
+          const params: Record<string, string> = {}
+          if (payload.parameters) {
+            payload.parameters.forEach((item) => {
+              params[item.name] = ''
+            })
+          }
+          onSelect(BlockEnum.Tool, {
+            provider_id: provider.id,
+            provider_type: provider.type,
+            provider_name: provider.name,
+            tool_name: payload.name,
+            tool_label: payload.label[language],
+            tool_description: payload.description[language],
+            title: payload.label[language],
+            is_team_authorization: provider.is_team_authorization,
+            output_schema: payload.output_schema,
+            paramSchemas: payload.parameters,
+            params,
+          })
+        }}
+      >
+        <div className={cn('system-sm-medium h-8 truncate border-l-2 border-divider-subtle pl-4 leading-8 text-text-secondary', disabled && 'opacity-30')}>{payload.label[language]}</div>
+        {disabled && <Badge
+          className='flex h-5 items-center space-x-0.5 text-text-tertiary'
+          uppercase
+        >
+          <RiCheckLine className='h-3 w-3 ' />
+          <div>{t('tools.addToolModal.added')}</div>
+        </Badge>
+        }
+      </div>
+    </Tooltip >
+  )
+}
+export default React.memo(ToolItem)
diff --git a/app/components/workflow/block-selector/tool/tool-list-flat-view/list.tsx b/app/components/workflow/block-selector/tool/tool-list-flat-view/list.tsx
new file mode 100644
index 0000000..ef671ca
--- /dev/null
+++ b/app/components/workflow/block-selector/tool/tool-list-flat-view/list.tsx
@@ -0,0 +1,64 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { ToolWithProvider } from '../../../types'
+import type { BlockEnum } from '../../../types'
+import type { ToolDefaultValue, ToolValue } from '../../types'
+import Tool from '../tool'
+import { ViewType } from '../../view-type-select'
+import { useMemo } from 'react'
+
+type Props = {
+  payload: ToolWithProvider[]
+  isShowLetterIndex: boolean
+  hasSearchText: boolean
+  onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
+  letters: string[]
+  toolRefs: any
+  selectedTools?: ToolValue[]
+}
+
+const ToolViewFlatView: FC<Props> = ({
+  letters,
+  payload,
+  isShowLetterIndex,
+  hasSearchText,
+  onSelect,
+  toolRefs,
+  selectedTools,
+}) => {
+  const firstLetterToolIds = useMemo(() => {
+    const res: Record<string, string> = {}
+    letters.forEach((letter) => {
+      const firstToolId = payload.find(tool => tool.letter === letter)?.id
+      if (firstToolId)
+        res[firstToolId] = letter
+    })
+    return res
+  }, [payload, letters])
+  return (
+    <div>
+      {payload.map(tool => (
+        <div
+          key={tool.id}
+          ref={(el) => {
+            const letter = firstLetterToolIds[tool.id]
+            if (letter)
+              toolRefs.current[letter] = el
+          }}
+        >
+          <Tool
+            payload={tool}
+            viewType={ViewType.flat}
+            isShowLetterIndex={isShowLetterIndex}
+            hasSearchText={hasSearchText}
+            onSelect={onSelect}
+            selectedTools={selectedTools}
+          />
+        </div>
+      ))}
+    </div>
+  )
+}
+
+export default React.memo(ToolViewFlatView)
diff --git a/app/components/workflow/block-selector/tool/tool-list-tree-view/item.tsx b/app/components/workflow/block-selector/tool/tool-list-tree-view/item.tsx
new file mode 100644
index 0000000..d6c567f
--- /dev/null
+++ b/app/components/workflow/block-selector/tool/tool-list-tree-view/item.tsx
@@ -0,0 +1,47 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { ToolWithProvider } from '../../../types'
+import Tool from '../tool'
+import type { BlockEnum } from '../../../types'
+import { ViewType } from '../../view-type-select'
+import type { ToolDefaultValue, ToolValue } from '../../types'
+
+type Props = {
+  groupName: string
+  toolList: ToolWithProvider[]
+  hasSearchText: boolean
+  onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
+  selectedTools?: ToolValue[]
+}
+
+const Item: FC<Props> = ({
+  groupName,
+  toolList,
+  hasSearchText,
+  onSelect,
+  selectedTools,
+}) => {
+  return (
+    <div>
+      <div className='flex h-[22px] items-center px-3 text-xs font-medium text-text-tertiary'>
+        {groupName}
+      </div>
+      <div>
+        {toolList.map((tool: ToolWithProvider) => (
+          <Tool
+            key={tool.id}
+            payload={tool}
+            viewType={ViewType.tree}
+            isShowLetterIndex={false}
+            hasSearchText={hasSearchText}
+            onSelect={onSelect}
+            selectedTools={selectedTools}
+          />
+        ))}
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Item)
diff --git a/app/components/workflow/block-selector/tool/tool-list-tree-view/list.tsx b/app/components/workflow/block-selector/tool/tool-list-tree-view/list.tsx
new file mode 100644
index 0000000..f3f9827
--- /dev/null
+++ b/app/components/workflow/block-selector/tool/tool-list-tree-view/list.tsx
@@ -0,0 +1,56 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import type { ToolWithProvider } from '../../../types'
+import type { BlockEnum } from '../../../types'
+import type { ToolDefaultValue, ToolValue } from '../../types'
+import Item from './item'
+import { useTranslation } from 'react-i18next'
+import { AGENT_GROUP_NAME, CUSTOM_GROUP_NAME, WORKFLOW_GROUP_NAME } from '../../index-bar'
+
+type Props = {
+  payload: Record<string, ToolWithProvider[]>
+  hasSearchText: boolean
+  onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
+  selectedTools?: ToolValue[]
+}
+
+const ToolListTreeView: FC<Props> = ({
+  payload,
+  hasSearchText,
+  onSelect,
+  selectedTools,
+}) => {
+  const { t } = useTranslation()
+  const getI18nGroupName = useCallback((name: string) => {
+    if (name === CUSTOM_GROUP_NAME)
+      return t('workflow.tabs.customTool')
+
+    if (name === WORKFLOW_GROUP_NAME)
+      return t('workflow.tabs.workflowTool')
+
+    if (name === AGENT_GROUP_NAME)
+      return t('workflow.tabs.agent')
+
+    return name
+  }, [t])
+
+  if (!payload) return null
+
+  return (
+    <div>
+      {Object.keys(payload).map(groupName => (
+        <Item
+          key={groupName}
+          groupName={getI18nGroupName(groupName)}
+          toolList={payload[groupName]}
+          hasSearchText={hasSearchText}
+          onSelect={onSelect}
+          selectedTools={selectedTools}
+        />
+      ))}
+    </div>
+  )
+}
+
+export default React.memo(ToolListTreeView)
diff --git a/app/components/workflow/block-selector/tool/tool.tsx b/app/components/workflow/block-selector/tool/tool.tsx
new file mode 100644
index 0000000..f135b5b
--- /dev/null
+++ b/app/components/workflow/block-selector/tool/tool.tsx
@@ -0,0 +1,134 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useMemo } from 'react'
+import cn from '@/utils/classnames'
+import { RiArrowDownSLine, RiArrowRightSLine } from '@remixicon/react'
+import { useGetLanguage } from '@/context/i18n'
+import type { Tool as ToolType } from '../../../tools/types'
+import { CollectionType } from '../../../tools/types'
+import type { ToolWithProvider } from '../../types'
+import { BlockEnum } from '../../types'
+import type { ToolDefaultValue, ToolValue } from '../types'
+import { ViewType } from '../view-type-select'
+import ActonItem from './action-item'
+import BlockIcon from '../../block-icon'
+import { useTranslation } from 'react-i18next'
+
+type Props = {
+  className?: string
+  payload: ToolWithProvider
+  viewType: ViewType
+  isShowLetterIndex: boolean
+  hasSearchText: boolean
+  onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
+  selectedTools?: ToolValue[]
+}
+
+const Tool: FC<Props> = ({
+  className,
+  payload,
+  viewType,
+  isShowLetterIndex,
+  hasSearchText,
+  onSelect,
+  selectedTools,
+}) => {
+  const { t } = useTranslation()
+  const language = useGetLanguage()
+  const isFlatView = viewType === ViewType.flat
+  const actions = payload.tools
+  const hasAction = true // Now always support actions
+  const [isFold, setFold] = React.useState<boolean>(true)
+  const getIsDisabled = (tool: ToolType) => {
+    if (!selectedTools || !selectedTools.length) return false
+    return selectedTools.some(selectedTool => selectedTool.provider_name === payload.name && selectedTool.tool_name === tool.name)
+  }
+  useEffect(() => {
+    if (hasSearchText && isFold) {
+      setFold(false)
+      return
+    }
+    if (!hasSearchText && !isFold)
+      setFold(true)
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [hasSearchText])
+
+  const FoldIcon = isFold ? RiArrowRightSLine : RiArrowDownSLine
+
+  const groupName = useMemo(() => {
+    if (payload.type === CollectionType.builtIn)
+      return payload.author
+
+    if (payload.type === CollectionType.custom)
+      return t('workflow.tabs.customTool')
+
+    if (payload.type === CollectionType.workflow)
+      return t('workflow.tabs.workflowTool')
+
+    return ''
+  }, [payload.author, payload.type, t])
+
+  return (
+    <div
+      key={payload.id}
+      className={cn('mb-1 last-of-type:mb-0', isShowLetterIndex && 'mr-6')}
+    >
+      <div className={cn(className)}>
+        <div
+          className='flex w-full cursor-pointer select-none items-center justify-between rounded-lg pl-3 pr-1 hover:bg-state-base-hover'
+          onClick={() => {
+            if (hasAction)
+              setFold(!isFold)
+
+            // Now always support actions
+            // if (payload.parameters) {
+            //   payload.parameters.forEach((item) => {
+            //     params[item.name] = ''
+            //   })
+            // }
+            // onSelect(BlockEnum.Tool, {
+            //   provider_id: payload.id,
+            //   provider_type: payload.type,
+            //   provider_name: payload.name,
+            //   tool_name: payload.name,
+            //   tool_label: payload.label[language],
+            //   title: payload.label[language],
+            //   params: {},
+            // })
+          }}
+        >
+          <div className='flex h-8 grow items-center'>
+            <BlockIcon
+              className='shrink-0'
+              type={BlockEnum.Tool}
+              toolIcon={payload.icon}
+            />
+            <div className='ml-2 w-0 flex-1 grow truncate text-sm text-text-primary'>{payload.label[language]}</div>
+          </div>
+
+          <div className='flex items-center'>
+            {isFlatView && (
+              <div className='system-xs-regular text-text-tertiary'>{groupName}</div>
+            )}
+            {hasAction && (
+              <FoldIcon className={cn('h-4 w-4 shrink-0 text-text-quaternary', isFold && 'text-text-tertiary')} />
+            )}
+          </div>
+        </div>
+
+        {hasAction && !isFold && (
+          actions.map(action => (
+            <ActonItem
+              key={action.name}
+              provider={payload}
+              payload={action}
+              onSelect={onSelect}
+              disabled={getIsDisabled(action)}
+            />
+          ))
+        )}
+      </div>
+    </div>
+  )
+}
+export default React.memo(Tool)
diff --git a/app/components/workflow/block-selector/tools.tsx b/app/components/workflow/block-selector/tools.tsx
new file mode 100644
index 0000000..2562501
--- /dev/null
+++ b/app/components/workflow/block-selector/tools.tsx
@@ -0,0 +1,127 @@
+import {
+  memo,
+  useMemo,
+  useRef,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import type { BlockEnum, ToolWithProvider } from '../types'
+import IndexBar, { groupItems } from './index-bar'
+import type { ToolDefaultValue, ToolValue } from './types'
+import { ViewType } from './view-type-select'
+import Empty from '@/app/components/tools/add-tool-modal/empty'
+import { useGetLanguage } from '@/context/i18n'
+import ToolListTreeView from './tool/tool-list-tree-view/list'
+import ToolListFlatView from './tool/tool-list-flat-view/list'
+import classNames from '@/utils/classnames'
+
+type ToolsProps = {
+  showWorkflowEmpty: boolean
+  onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
+  tools: ToolWithProvider[]
+  viewType: ViewType
+  hasSearchText: boolean
+  className?: string
+  indexBarClassName?: string
+  selectedTools?: ToolValue[]
+}
+const Blocks = ({
+  showWorkflowEmpty,
+  onSelect,
+  tools,
+  viewType,
+  hasSearchText,
+  className,
+  indexBarClassName,
+  selectedTools,
+}: ToolsProps) => {
+  const { t } = useTranslation()
+  const language = useGetLanguage()
+  const isFlatView = viewType === ViewType.flat
+  const isShowLetterIndex = isFlatView && tools.length > 10
+
+  /*
+  treeViewToolsData:
+  {
+    A: {
+      'google': [ // plugin organize name
+        ...tools
+      ],
+      'custom': [ // custom tools
+        ...tools
+      ],
+      'workflow': [ // workflow as tools
+        ...tools
+      ]
+    }
+  }
+  */
+  const { letters, groups: withLetterAndGroupViewToolsData } = groupItems(tools, tool => tool.label[language][0])
+  const treeViewToolsData = useMemo(() => {
+    const result: Record<string, ToolWithProvider[]> = {}
+    Object.keys(withLetterAndGroupViewToolsData).forEach((letter) => {
+      Object.keys(withLetterAndGroupViewToolsData[letter]).forEach((groupName) => {
+        if (!result[groupName])
+          result[groupName] = []
+        result[groupName].push(...withLetterAndGroupViewToolsData[letter][groupName])
+      })
+    })
+    return result
+  }, [withLetterAndGroupViewToolsData])
+
+  const listViewToolData = useMemo(() => {
+    const result: ToolWithProvider[] = []
+    letters.forEach((letter) => {
+      Object.keys(withLetterAndGroupViewToolsData[letter]).forEach((groupName) => {
+        result.push(...withLetterAndGroupViewToolsData[letter][groupName].map((item) => {
+          return {
+            ...item,
+            letter,
+          }
+        }))
+      })
+    })
+
+    return result
+  }, [withLetterAndGroupViewToolsData, letters])
+
+  const toolRefs = useRef({})
+
+  return (
+    <div className={classNames('p-1 max-w-[320px]', className)}>
+      {
+        !tools.length && !showWorkflowEmpty && (
+          <div className='flex h-[22px] items-center px-3 text-xs font-medium text-text-tertiary'>{t('workflow.tabs.noResult')}</div>
+        )
+      }
+      {!tools.length && showWorkflowEmpty && (
+        <div className='py-10'>
+          <Empty />
+        </div>
+      )}
+      {!!tools.length && (
+        isFlatView ? (
+          <ToolListFlatView
+            toolRefs={toolRefs}
+            letters={letters}
+            payload={listViewToolData}
+            isShowLetterIndex={isShowLetterIndex}
+            hasSearchText={hasSearchText}
+            onSelect={onSelect}
+            selectedTools={selectedTools}
+          />
+        ) : (
+          <ToolListTreeView
+            payload={treeViewToolsData}
+            hasSearchText={hasSearchText}
+            onSelect={onSelect}
+            selectedTools={selectedTools}
+          />
+        )
+      )}
+
+      {isShowLetterIndex && <IndexBar letters={letters} itemRefs={toolRefs} className={indexBarClassName} />}
+    </div>
+  )
+}
+
+export default memo(Blocks)
diff --git a/app/components/workflow/block-selector/types.ts b/app/components/workflow/block-selector/types.ts
new file mode 100644
index 0000000..0abf7b9
--- /dev/null
+++ b/app/components/workflow/block-selector/types.ts
@@ -0,0 +1,44 @@
+export enum TabsEnum {
+  Blocks = 'blocks',
+  Tools = 'tools',
+}
+
+export enum ToolTypeEnum {
+  All = 'all',
+  BuiltIn = 'built-in',
+  Custom = 'custom',
+  Workflow = 'workflow',
+}
+
+export enum BlockClassificationEnum {
+  Default = '-',
+  QuestionUnderstand = 'question-understand',
+  Logic = 'logic',
+  Transform = 'transform',
+  Utilities = 'utilities',
+}
+
+export type ToolDefaultValue = {
+  provider_id: string
+  provider_type: string
+  provider_name: string
+  tool_name: string
+  tool_label: string
+  tool_description: string
+  title: string
+  is_team_authorization: boolean
+  params: Record<string, any>
+  paramSchemas: Record<string, any>[]
+  output_schema: Record<string, any>
+}
+
+export type ToolValue = {
+  provider_name: string
+  tool_name: string
+  tool_label: string
+  tool_description: string
+  settings?: Record<string, any>
+  parameters?: Record<string, any>
+  enabled?: boolean
+  extra?: Record<string, any>
+}
diff --git a/app/components/workflow/block-selector/use-sticky-scroll.ts b/app/components/workflow/block-selector/use-sticky-scroll.ts
new file mode 100644
index 0000000..405ecdb
--- /dev/null
+++ b/app/components/workflow/block-selector/use-sticky-scroll.ts
@@ -0,0 +1,45 @@
+import React from 'react'
+import { useThrottleFn } from 'ahooks'
+
+export enum ScrollPosition {
+  belowTheWrap = 'belowTheWrap',
+  showing = 'showing',
+  aboveTheWrap = 'aboveTheWrap',
+}
+
+type Params = {
+  wrapElemRef: React.RefObject<HTMLElement>
+  nextToStickyELemRef: React.RefObject<HTMLElement>
+}
+const useStickyScroll = ({
+  wrapElemRef,
+  nextToStickyELemRef,
+}: Params) => {
+  const [scrollPosition, setScrollPosition] = React.useState<ScrollPosition>(ScrollPosition.belowTheWrap)
+  const { run: handleScroll } = useThrottleFn(() => {
+    const wrapDom = wrapElemRef.current
+    const stickyDOM = nextToStickyELemRef.current
+    if (!wrapDom || !stickyDOM)
+      return
+    const { height: wrapHeight, top: wrapTop } = wrapDom.getBoundingClientRect()
+    const { top: nextToStickyTop } = stickyDOM.getBoundingClientRect()
+    let scrollPositionNew = ScrollPosition.belowTheWrap
+
+    if (nextToStickyTop - wrapTop >= wrapHeight)
+      scrollPositionNew = ScrollPosition.belowTheWrap
+    else if (nextToStickyTop <= wrapTop)
+      scrollPositionNew = ScrollPosition.aboveTheWrap
+    else
+      scrollPositionNew = ScrollPosition.showing
+
+    if (scrollPosition !== scrollPositionNew)
+      setScrollPosition(scrollPositionNew)
+  }, { wait: 100 })
+
+  return {
+    handleScroll,
+    scrollPosition,
+  }
+}
+
+export default useStickyScroll
diff --git a/app/components/workflow/block-selector/view-type-select.tsx b/app/components/workflow/block-selector/view-type-select.tsx
new file mode 100644
index 0000000..f241257
--- /dev/null
+++ b/app/components/workflow/block-selector/view-type-select.tsx
@@ -0,0 +1,58 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { RiNodeTree, RiSortAlphabetAsc } from '@remixicon/react'
+import cn from '@/utils/classnames'
+
+export enum ViewType {
+  flat = 'flat',
+  tree = 'tree',
+}
+
+type Props = {
+  viewType: ViewType
+  onChange: (viewType: ViewType) => void
+}
+
+const ViewTypeSelect: FC<Props> = ({
+  viewType,
+  onChange,
+}) => {
+  const handleChange = useCallback((nextViewType: ViewType) => {
+    return () => {
+      if (nextViewType === viewType)
+        return
+      onChange(nextViewType)
+    }
+  }, [viewType, onChange])
+
+  return (
+    <div className='flex items-center rounded-lg bg-components-segmented-control-bg-normal p-px'>
+      <div
+        className={
+          cn('rounded-lg p-[3px]',
+            viewType === ViewType.flat
+              ? 'bg-components-segmented-control-item-active-bg text-text-accent-light-mode-only shadow-xs'
+              : 'cursor-pointer text-text-tertiary',
+          )
+        }
+        onClick={handleChange(ViewType.flat)}
+      >
+        <RiSortAlphabetAsc className='h-4 w-4' />
+      </div>
+      <div
+        className={
+          cn('rounded-lg p-[3px]',
+            viewType === ViewType.tree
+              ? 'bg-components-segmented-control-item-active-bg text-text-accent-light-mode-only shadow-xs'
+              : 'cursor-pointer text-text-tertiary',
+          )
+        }
+        onClick={handleChange(ViewType.tree)}
+      >
+        <RiNodeTree className='h-4 w-4 ' />
+      </div>
+    </div>
+  )
+}
+export default React.memo(ViewTypeSelect)
diff --git a/app/components/workflow/blocks.tsx b/app/components/workflow/blocks.tsx
new file mode 100644
index 0000000..334ddbf
--- /dev/null
+++ b/app/components/workflow/blocks.tsx
@@ -0,0 +1,5 @@
+import { BlockEnum } from './types'
+
+export const ALL_AVAILABLE_BLOCKS = Object.values(BlockEnum)
+export const ALL_CHAT_AVAILABLE_BLOCKS = ALL_AVAILABLE_BLOCKS.filter(key => key !== BlockEnum.End && key !== BlockEnum.Start) as BlockEnum[]
+export const ALL_COMPLETION_AVAILABLE_BLOCKS = ALL_AVAILABLE_BLOCKS.filter(key => key !== BlockEnum.Answer && key !== BlockEnum.Start) as BlockEnum[]
diff --git a/app/components/workflow/candidate-node.tsx b/app/components/workflow/candidate-node.tsx
new file mode 100644
index 0000000..eb59a46
--- /dev/null
+++ b/app/components/workflow/candidate-node.tsx
@@ -0,0 +1,111 @@
+import {
+  memo,
+} from 'react'
+import produce from 'immer'
+import {
+  useReactFlow,
+  useStoreApi,
+  useViewport,
+} from 'reactflow'
+import { useEventListener } from 'ahooks'
+import {
+  useStore,
+  useWorkflowStore,
+} from './store'
+import { WorkflowHistoryEvent, useNodesInteractions, useWorkflowHistory } from './hooks'
+import { CUSTOM_NODE } from './constants'
+import { getIterationStartNode, getLoopStartNode } from './utils'
+import CustomNode from './nodes'
+import CustomNoteNode from './note-node'
+import { CUSTOM_NOTE_NODE } from './note-node/constants'
+import { BlockEnum } from './types'
+
+const CandidateNode = () => {
+  const store = useStoreApi()
+  const reactflow = useReactFlow()
+  const workflowStore = useWorkflowStore()
+  const candidateNode = useStore(s => s.candidateNode)
+  const mousePosition = useStore(s => s.mousePosition)
+  const { zoom } = useViewport()
+  const { handleNodeSelect } = useNodesInteractions()
+  const { saveStateToHistory } = useWorkflowHistory()
+
+  useEventListener('click', (e) => {
+    const { candidateNode, mousePosition } = workflowStore.getState()
+
+    if (candidateNode) {
+      e.preventDefault()
+      const {
+        getNodes,
+        setNodes,
+      } = store.getState()
+      const { screenToFlowPosition } = reactflow
+      const nodes = getNodes()
+      const { x, y } = screenToFlowPosition({ x: mousePosition.pageX, y: mousePosition.pageY })
+      const newNodes = produce(nodes, (draft) => {
+        draft.push({
+          ...candidateNode,
+          data: {
+            ...candidateNode.data,
+            _isCandidate: false,
+          },
+          position: {
+            x,
+            y,
+          },
+        })
+        if (candidateNode.data.type === BlockEnum.Iteration)
+          draft.push(getIterationStartNode(candidateNode.id))
+
+        if (candidateNode.data.type === BlockEnum.Loop)
+          draft.push(getLoopStartNode(candidateNode.id))
+      })
+      setNodes(newNodes)
+      if (candidateNode.type === CUSTOM_NOTE_NODE)
+        saveStateToHistory(WorkflowHistoryEvent.NoteAdd)
+      else
+        saveStateToHistory(WorkflowHistoryEvent.NodeAdd)
+
+      workflowStore.setState({ candidateNode: undefined })
+
+      if (candidateNode.type === CUSTOM_NOTE_NODE)
+        handleNodeSelect(candidateNode.id)
+    }
+  })
+
+  useEventListener('contextmenu', (e) => {
+    const { candidateNode } = workflowStore.getState()
+    if (candidateNode) {
+      e.preventDefault()
+      workflowStore.setState({ candidateNode: undefined })
+    }
+  })
+
+  if (!candidateNode)
+    return null
+
+  return (
+    <div
+      className='absolute z-10'
+      style={{
+        left: mousePosition.elementX,
+        top: mousePosition.elementY,
+        transform: `scale(${zoom})`,
+        transformOrigin: '0 0',
+      }}
+    >
+      {
+        candidateNode.type === CUSTOM_NODE && (
+          <CustomNode {...candidateNode as any} />
+        )
+      }
+      {
+        candidateNode.type === CUSTOM_NOTE_NODE && (
+          <CustomNoteNode {...candidateNode as any} />
+        )
+      }
+    </div>
+  )
+}
+
+export default memo(CandidateNode)
diff --git a/app/components/workflow/constants.ts b/app/components/workflow/constants.ts
new file mode 100644
index 0000000..cdfd963
--- /dev/null
+++ b/app/components/workflow/constants.ts
@@ -0,0 +1,597 @@
+import type { Var } from './types'
+import { BlockEnum, VarType } from './types'
+import StartNodeDefault from './nodes/start/default'
+import AnswerDefault from './nodes/answer/default'
+import LLMDefault from './nodes/llm/default'
+import KnowledgeRetrievalDefault from './nodes/knowledge-retrieval/default'
+import QuestionClassifierDefault from './nodes/question-classifier/default'
+import IfElseDefault from './nodes/if-else/default'
+import CodeDefault from './nodes/code/default'
+import TemplateTransformDefault from './nodes/template-transform/default'
+import HttpRequestDefault from './nodes/http/default'
+import ParameterExtractorDefault from './nodes/parameter-extractor/default'
+import ToolDefault from './nodes/tool/default'
+import VariableAssignerDefault from './nodes/variable-assigner/default'
+import AssignerDefault from './nodes/assigner/default'
+import EndNodeDefault from './nodes/end/default'
+import IterationDefault from './nodes/iteration/default'
+import LoopDefault from './nodes/loop/default'
+import DocExtractorDefault from './nodes/document-extractor/default'
+import ListFilterDefault from './nodes/list-operator/default'
+import IterationStartDefault from './nodes/iteration-start/default'
+import AgentDefault from './nodes/agent/default'
+import LoopStartDefault from './nodes/loop-start/default'
+import LoopEndDefault from './nodes/loop-end/default'
+
+type NodesExtraData = {
+  author: string
+  about: string
+  availablePrevNodes: BlockEnum[]
+  availableNextNodes: BlockEnum[]
+  getAvailablePrevNodes: (isChatMode: boolean) => BlockEnum[]
+  getAvailableNextNodes: (isChatMode: boolean) => BlockEnum[]
+  checkValid: any
+}
+export const NODES_EXTRA_DATA: Record<BlockEnum, NodesExtraData> = {
+  [BlockEnum.Start]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: StartNodeDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: StartNodeDefault.getAvailableNextNodes,
+    checkValid: StartNodeDefault.checkValid,
+  },
+  [BlockEnum.End]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: EndNodeDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: EndNodeDefault.getAvailableNextNodes,
+    checkValid: EndNodeDefault.checkValid,
+  },
+  [BlockEnum.Answer]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: AnswerDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: AnswerDefault.getAvailableNextNodes,
+    checkValid: AnswerDefault.checkValid,
+  },
+  [BlockEnum.LLM]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: LLMDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: LLMDefault.getAvailableNextNodes,
+    checkValid: LLMDefault.checkValid,
+  },
+  [BlockEnum.KnowledgeRetrieval]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: KnowledgeRetrievalDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: KnowledgeRetrievalDefault.getAvailableNextNodes,
+    checkValid: KnowledgeRetrievalDefault.checkValid,
+  },
+  [BlockEnum.IfElse]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: IfElseDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: IfElseDefault.getAvailableNextNodes,
+    checkValid: IfElseDefault.checkValid,
+  },
+  [BlockEnum.Iteration]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: IterationDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: IterationDefault.getAvailableNextNodes,
+    checkValid: IterationDefault.checkValid,
+  },
+  [BlockEnum.IterationStart]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: IterationStartDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: IterationStartDefault.getAvailableNextNodes,
+    checkValid: IterationStartDefault.checkValid,
+  },
+  [BlockEnum.Loop]: {
+    author: 'AICT-Team',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: LoopDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: LoopDefault.getAvailableNextNodes,
+    checkValid: LoopDefault.checkValid,
+  },
+  [BlockEnum.LoopStart]: {
+    author: 'AICT-Team',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: LoopStartDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: LoopStartDefault.getAvailableNextNodes,
+    checkValid: LoopStartDefault.checkValid,
+  },
+  [BlockEnum.LoopEnd]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: LoopEndDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: LoopEndDefault.getAvailableNextNodes,
+    checkValid: LoopEndDefault.checkValid,
+  },
+  [BlockEnum.Code]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: CodeDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: CodeDefault.getAvailableNextNodes,
+    checkValid: CodeDefault.checkValid,
+  },
+  [BlockEnum.TemplateTransform]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: TemplateTransformDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: TemplateTransformDefault.getAvailableNextNodes,
+    checkValid: TemplateTransformDefault.checkValid,
+  },
+  [BlockEnum.QuestionClassifier]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: QuestionClassifierDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: QuestionClassifierDefault.getAvailableNextNodes,
+    checkValid: QuestionClassifierDefault.checkValid,
+  },
+  [BlockEnum.HttpRequest]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: HttpRequestDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: HttpRequestDefault.getAvailableNextNodes,
+    checkValid: HttpRequestDefault.checkValid,
+  },
+  [BlockEnum.VariableAssigner]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: VariableAssignerDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: VariableAssignerDefault.getAvailableNextNodes,
+    checkValid: VariableAssignerDefault.checkValid,
+  },
+  [BlockEnum.Assigner]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: AssignerDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: AssignerDefault.getAvailableNextNodes,
+    checkValid: AssignerDefault.checkValid,
+  },
+  [BlockEnum.VariableAggregator]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: VariableAssignerDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: VariableAssignerDefault.getAvailableNextNodes,
+    checkValid: VariableAssignerDefault.checkValid,
+  },
+  [BlockEnum.ParameterExtractor]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: ParameterExtractorDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: ParameterExtractorDefault.getAvailableNextNodes,
+    checkValid: ParameterExtractorDefault.checkValid,
+  },
+  [BlockEnum.Tool]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: ToolDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: ToolDefault.getAvailableNextNodes,
+    checkValid: ToolDefault.checkValid,
+  },
+  [BlockEnum.DocExtractor]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: DocExtractorDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: DocExtractorDefault.getAvailableNextNodes,
+    checkValid: DocExtractorDefault.checkValid,
+  },
+  [BlockEnum.ListFilter]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: ListFilterDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: ListFilterDefault.getAvailableNextNodes,
+    checkValid: ListFilterDefault.checkValid,
+  },
+  [BlockEnum.Agent]: {
+    author: 'Dify',
+    about: '',
+    availablePrevNodes: [],
+    availableNextNodes: [],
+    getAvailablePrevNodes: ListFilterDefault.getAvailablePrevNodes,
+    getAvailableNextNodes: ListFilterDefault.getAvailableNextNodes,
+    checkValid: AgentDefault.checkValid,
+  },
+}
+
+export const NODES_INITIAL_DATA = {
+  [BlockEnum.Start]: {
+    type: BlockEnum.Start,
+    title: '',
+    desc: '',
+    ...StartNodeDefault.defaultValue,
+  },
+  [BlockEnum.End]: {
+    type: BlockEnum.End,
+    title: '',
+    desc: '',
+    ...EndNodeDefault.defaultValue,
+  },
+  [BlockEnum.Answer]: {
+    type: BlockEnum.Answer,
+    title: '',
+    desc: '',
+    ...AnswerDefault.defaultValue,
+  },
+  [BlockEnum.LLM]: {
+    type: BlockEnum.LLM,
+    title: '',
+    desc: '',
+    variables: [],
+    ...LLMDefault.defaultValue,
+  },
+  [BlockEnum.KnowledgeRetrieval]: {
+    type: BlockEnum.KnowledgeRetrieval,
+    title: '',
+    desc: '',
+    query_variable_selector: [],
+    dataset_ids: [],
+    retrieval_mode: 'single',
+    ...KnowledgeRetrievalDefault.defaultValue,
+  },
+  [BlockEnum.IfElse]: {
+    type: BlockEnum.IfElse,
+    title: '',
+    desc: '',
+    ...IfElseDefault.defaultValue,
+  },
+  [BlockEnum.Iteration]: {
+    type: BlockEnum.Iteration,
+    title: '',
+    desc: '',
+    ...IterationDefault.defaultValue,
+  },
+  [BlockEnum.IterationStart]: {
+    type: BlockEnum.IterationStart,
+    title: '',
+    desc: '',
+    ...IterationStartDefault.defaultValue,
+  },
+  [BlockEnum.Loop]: {
+    type: BlockEnum.Loop,
+    title: '',
+    desc: '',
+    ...LoopDefault.defaultValue,
+  },
+  [BlockEnum.LoopStart]: {
+    type: BlockEnum.LoopStart,
+    title: '',
+    desc: '',
+    ...LoopStartDefault.defaultValue,
+  },
+  [BlockEnum.LoopEnd]: {
+    type: BlockEnum.LoopEnd,
+    title: '',
+    desc: '',
+    ...LoopEndDefault.defaultValue,
+  },
+  [BlockEnum.Code]: {
+    type: BlockEnum.Code,
+    title: '',
+    desc: '',
+    variables: [],
+    code_language: 'python3',
+    code: '',
+    outputs: [],
+    ...CodeDefault.defaultValue,
+  },
+  [BlockEnum.TemplateTransform]: {
+    type: BlockEnum.TemplateTransform,
+    title: '',
+    desc: '',
+    variables: [],
+    template: '',
+    ...TemplateTransformDefault.defaultValue,
+  },
+  [BlockEnum.QuestionClassifier]: {
+    type: BlockEnum.QuestionClassifier,
+    title: '',
+    desc: '',
+    query_variable_selector: [],
+    topics: [],
+    ...QuestionClassifierDefault.defaultValue,
+  },
+  [BlockEnum.HttpRequest]: {
+    type: BlockEnum.HttpRequest,
+    title: '',
+    desc: '',
+    variables: [],
+    ...HttpRequestDefault.defaultValue,
+  },
+  [BlockEnum.ParameterExtractor]: {
+    type: BlockEnum.ParameterExtractor,
+    title: '',
+    desc: '',
+    variables: [],
+    ...ParameterExtractorDefault.defaultValue,
+  },
+  [BlockEnum.VariableAssigner]: {
+    type: BlockEnum.VariableAssigner,
+    title: '',
+    desc: '',
+    variables: [],
+    output_type: '',
+    ...VariableAssignerDefault.defaultValue,
+  },
+  [BlockEnum.VariableAggregator]: {
+    type: BlockEnum.VariableAggregator,
+    title: '',
+    desc: '',
+    variables: [],
+    output_type: '',
+    ...VariableAssignerDefault.defaultValue,
+  },
+  [BlockEnum.Assigner]: {
+    type: BlockEnum.Assigner,
+    title: '',
+    desc: '',
+    ...AssignerDefault.defaultValue,
+  },
+  [BlockEnum.Tool]: {
+    type: BlockEnum.Tool,
+    title: '',
+    desc: '',
+    ...ToolDefault.defaultValue,
+  },
+  [BlockEnum.DocExtractor]: {
+    type: BlockEnum.DocExtractor,
+    title: '',
+    desc: '',
+    ...DocExtractorDefault.defaultValue,
+  },
+  [BlockEnum.ListFilter]: {
+    type: BlockEnum.ListFilter,
+    title: '',
+    desc: '',
+    ...ListFilterDefault.defaultValue,
+  },
+  [BlockEnum.Agent]: {
+    type: BlockEnum.Agent,
+    title: '',
+    desc: '',
+    ...AgentDefault.defaultValue,
+  },
+}
+export const MAX_ITERATION_PARALLEL_NUM = 10
+export const MIN_ITERATION_PARALLEL_NUM = 1
+export const DEFAULT_ITER_TIMES = 1
+export const DEFAULT_LOOP_TIMES = 1
+export const NODE_WIDTH = 240
+export const X_OFFSET = 60
+export const NODE_WIDTH_X_OFFSET = NODE_WIDTH + X_OFFSET
+export const Y_OFFSET = 39
+export const MAX_TREE_DEPTH = 50
+export const START_INITIAL_POSITION = { x: 80, y: 282 }
+export const AUTO_LAYOUT_OFFSET = {
+  x: -42,
+  y: 243,
+}
+export const ITERATION_NODE_Z_INDEX = 1
+export const ITERATION_CHILDREN_Z_INDEX = 1002
+export const ITERATION_PADDING = {
+  top: 65,
+  right: 16,
+  bottom: 20,
+  left: 16,
+}
+
+export const LOOP_NODE_Z_INDEX = 1
+export const LOOP_CHILDREN_Z_INDEX = 1002
+export const LOOP_PADDING = {
+  top: 65,
+  right: 16,
+  bottom: 20,
+  left: 16,
+}
+
+export const NODE_LAYOUT_HORIZONTAL_PADDING = 60
+export const NODE_LAYOUT_VERTICAL_PADDING = 60
+export const NODE_LAYOUT_MIN_DISTANCE = 100
+
+let maxParallelLimit = 10
+
+if (process.env.NEXT_PUBLIC_MAX_PARALLEL_LIMIT && process.env.NEXT_PUBLIC_MAX_PARALLEL_LIMIT !== '')
+  maxParallelLimit = Number.parseInt(process.env.NEXT_PUBLIC_MAX_PARALLEL_LIMIT)
+else if (globalThis.document?.body?.getAttribute('data-public-max-parallel-limit') && globalThis.document.body.getAttribute('data-public-max-parallel-limit') !== '')
+  maxParallelLimit = Number.parseInt(globalThis.document.body.getAttribute('data-public-max-parallel-limit') as string)
+
+export const PARALLEL_LIMIT = maxParallelLimit
+export const PARALLEL_DEPTH_LIMIT = 3
+
+export const RETRIEVAL_OUTPUT_STRUCT = `{
+  "content": "",
+  "title": "",
+  "url": "",
+  "icon": "",
+  "metadata": {
+    "dataset_id": "",
+    "dataset_name": "",
+    "document_id": [],
+    "document_name": "",
+    "document_data_source_type": "",
+    "segment_id": "",
+    "segment_position": "",
+    "segment_word_count": "",
+    "segment_hit_count": "",
+    "segment_index_node_hash": "",
+    "score": ""
+  }
+}`
+
+export const SUPPORT_OUTPUT_VARS_NODE = [
+  BlockEnum.Start, BlockEnum.LLM, BlockEnum.KnowledgeRetrieval, BlockEnum.Code, BlockEnum.TemplateTransform,
+  BlockEnum.HttpRequest, BlockEnum.Tool, BlockEnum.VariableAssigner, BlockEnum.VariableAggregator, BlockEnum.QuestionClassifier,
+  BlockEnum.ParameterExtractor, BlockEnum.Iteration, BlockEnum.Loop,
+  BlockEnum.DocExtractor, BlockEnum.ListFilter,
+  BlockEnum.Agent,
+]
+
+export const LLM_OUTPUT_STRUCT: Var[] = [
+  {
+    variable: 'text',
+    type: VarType.string,
+  },
+]
+
+export const KNOWLEDGE_RETRIEVAL_OUTPUT_STRUCT: Var[] = [
+  {
+    variable: 'result',
+    type: VarType.arrayObject,
+  },
+]
+
+export const TEMPLATE_TRANSFORM_OUTPUT_STRUCT: Var[] = [
+  {
+    variable: 'output',
+    type: VarType.string,
+  },
+]
+
+export const QUESTION_CLASSIFIER_OUTPUT_STRUCT = [
+  {
+    variable: 'class_name',
+    type: VarType.string,
+  },
+]
+
+export const HTTP_REQUEST_OUTPUT_STRUCT: Var[] = [
+  {
+    variable: 'body',
+    type: VarType.string,
+  },
+  {
+    variable: 'status_code',
+    type: VarType.number,
+  },
+  {
+    variable: 'headers',
+    type: VarType.object,
+  },
+  {
+    variable: 'files',
+    type: VarType.arrayFile,
+  },
+]
+
+export const TOOL_OUTPUT_STRUCT: Var[] = [
+  {
+    variable: 'text',
+    type: VarType.string,
+  },
+  {
+    variable: 'files',
+    type: VarType.arrayFile,
+  },
+  {
+    variable: 'json',
+    type: VarType.arrayObject,
+  },
+]
+
+export const PARAMETER_EXTRACTOR_COMMON_STRUCT: Var[] = [
+  {
+    variable: '__is_success',
+    type: VarType.number,
+  },
+  {
+    variable: '__reason',
+    type: VarType.string,
+  },
+]
+
+export const FILE_STRUCT: Var[] = [
+  {
+    variable: 'name',
+    type: VarType.string,
+  },
+  {
+    variable: 'size',
+    type: VarType.number,
+  },
+  {
+    variable: 'type',
+    type: VarType.string,
+  },
+  {
+    variable: 'extension',
+    type: VarType.string,
+  },
+  {
+    variable: 'mime_type',
+    type: VarType.string,
+  },
+  {
+    variable: 'transfer_method',
+    type: VarType.string,
+  },
+  {
+    variable: 'url',
+    type: VarType.string,
+  },
+  {
+    variable: 'related_id',
+    type: VarType.string,
+  },
+]
+
+export const DEFAULT_FILE_UPLOAD_SETTING = {
+  allowed_file_upload_methods: ['local_file', 'remote_url'],
+  max_length: 5,
+  allowed_file_types: ['image'],
+  allowed_file_extensions: [],
+}
+
+export const WORKFLOW_DATA_UPDATE = 'WORKFLOW_DATA_UPDATE'
+export const CUSTOM_NODE = 'custom'
+export const CUSTOM_EDGE = 'custom'
+export const DSL_EXPORT_CHECK = 'DSL_EXPORT_CHECK'
+export const DEFAULT_RETRY_MAX = 3
+export const DEFAULT_RETRY_INTERVAL = 100
diff --git a/app/components/workflow/context.tsx b/app/components/workflow/context.tsx
new file mode 100644
index 0000000..cae14fc
--- /dev/null
+++ b/app/components/workflow/context.tsx
@@ -0,0 +1,29 @@
+import {
+  createContext,
+  useRef,
+} from 'react'
+import {
+  createWorkflowStore,
+} from './store'
+import type { StateCreator } from 'zustand'
+import type { WorkflowSliceShape } from '@/app/components/workflow-app/store/workflow/workflow-slice'
+
+type WorkflowStore = ReturnType<typeof createWorkflowStore>
+export const WorkflowContext = createContext<WorkflowStore | null>(null)
+
+export type WorkflowProviderProps = {
+  children: React.ReactNode
+  injectWorkflowStoreSliceFn?: StateCreator<WorkflowSliceShape>
+}
+export const WorkflowContextProvider = ({ children, injectWorkflowStoreSliceFn }: WorkflowProviderProps) => {
+  const storeRef = useRef<WorkflowStore | undefined>(undefined)
+
+  if (!storeRef.current)
+    storeRef.current = createWorkflowStore({ injectWorkflowStoreSliceFn })
+
+  return (
+    <WorkflowContext.Provider value={storeRef.current}>
+      {children}
+    </WorkflowContext.Provider>
+  )
+}
diff --git a/app/components/workflow/custom-connection-line.tsx b/app/components/workflow/custom-connection-line.tsx
new file mode 100644
index 0000000..c187f16
--- /dev/null
+++ b/app/components/workflow/custom-connection-line.tsx
@@ -0,0 +1,40 @@
+import { memo } from 'react'
+import type { ConnectionLineComponentProps } from 'reactflow'
+import {
+  Position,
+  getBezierPath,
+} from 'reactflow'
+
+const CustomConnectionLine = ({ fromX, fromY, toX, toY }: ConnectionLineComponentProps) => {
+  const [
+    edgePath,
+  ] = getBezierPath({
+    sourceX: fromX,
+    sourceY: fromY,
+    sourcePosition: Position.Right,
+    targetX: toX,
+    targetY: toY,
+    targetPosition: Position.Left,
+    curvature: 0.16,
+  })
+
+  return (
+    <g>
+      <path
+        fill="none"
+        stroke='#D0D5DD'
+        strokeWidth={2}
+        d={edgePath}
+      />
+      <rect
+        x={toX}
+        y={toY - 4}
+        width={2}
+        height={8}
+        fill='#2970FF'
+      />
+    </g>
+  )
+}
+
+export default memo(CustomConnectionLine)
diff --git a/app/components/workflow/custom-edge-linear-gradient-render.tsx b/app/components/workflow/custom-edge-linear-gradient-render.tsx
new file mode 100644
index 0000000..b799bb3
--- /dev/null
+++ b/app/components/workflow/custom-edge-linear-gradient-render.tsx
@@ -0,0 +1,53 @@
+type CustomEdgeLinearGradientRenderProps = {
+  id: string
+  startColor: string
+  stopColor: string
+  position: {
+    x1: number
+    x2: number
+    y1: number
+    y2: number
+  }
+}
+const CustomEdgeLinearGradientRender = ({
+  id,
+  startColor,
+  stopColor,
+  position,
+}: CustomEdgeLinearGradientRenderProps) => {
+  const {
+    x1,
+    x2,
+    y1,
+    y2,
+  } = position
+  return (
+    <defs>
+      <linearGradient
+        id={id}
+        gradientUnits='userSpaceOnUse'
+        x1={x1}
+        y1={y1}
+        x2={x2}
+        y2={y2}
+      >
+        <stop
+          offset='0%'
+          style={{
+            stopColor: startColor,
+            stopOpacity: 1,
+          }}
+        />
+        <stop
+          offset='100%'
+          style={{
+            stopColor,
+            stopOpacity: 1,
+          }}
+        />
+      </linearGradient>
+    </defs>
+  )
+}
+
+export default CustomEdgeLinearGradientRender
diff --git a/app/components/workflow/custom-edge.tsx b/app/components/workflow/custom-edge.tsx
new file mode 100644
index 0000000..4467b0a
--- /dev/null
+++ b/app/components/workflow/custom-edge.tsx
@@ -0,0 +1,170 @@
+import {
+  memo,
+  useCallback,
+  useMemo,
+  useState,
+} from 'react'
+import { intersection } from 'lodash-es'
+import type { EdgeProps } from 'reactflow'
+import {
+  BaseEdge,
+  EdgeLabelRenderer,
+  Position,
+  getBezierPath,
+} from 'reactflow'
+import {
+  useAvailableBlocks,
+  useNodesInteractions,
+} from './hooks'
+import BlockSelector from './block-selector'
+import type {
+  Edge,
+  OnSelectBlock,
+} from './types'
+import { NodeRunningStatus } from './types'
+import { getEdgeColor } from './utils'
+import { ITERATION_CHILDREN_Z_INDEX, LOOP_CHILDREN_Z_INDEX } from './constants'
+import CustomEdgeLinearGradientRender from './custom-edge-linear-gradient-render'
+import cn from '@/utils/classnames'
+import { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/components/error-handle/types'
+
+const CustomEdge = ({
+  id,
+  data,
+  source,
+  sourceHandleId,
+  target,
+  targetHandleId,
+  sourceX,
+  sourceY,
+  targetX,
+  targetY,
+  selected,
+}: EdgeProps) => {
+  const [
+    edgePath,
+    labelX,
+    labelY,
+  ] = getBezierPath({
+    sourceX: sourceX - 8,
+    sourceY,
+    sourcePosition: Position.Right,
+    targetX: targetX + 8,
+    targetY,
+    targetPosition: Position.Left,
+    curvature: 0.16,
+  })
+  const [open, setOpen] = useState(false)
+  const { handleNodeAdd } = useNodesInteractions()
+  const { availablePrevBlocks } = useAvailableBlocks((data as Edge['data'])!.targetType, (data as Edge['data'])?.isInIteration, (data as Edge['data'])?.isInLoop)
+  const { availableNextBlocks } = useAvailableBlocks((data as Edge['data'])!.sourceType, (data as Edge['data'])?.isInIteration, (data as Edge['data'])?.isInLoop)
+  const {
+    _sourceRunningStatus,
+    _targetRunningStatus,
+  } = data
+
+  const linearGradientId = useMemo(() => {
+    if (
+      (
+        _sourceRunningStatus === NodeRunningStatus.Succeeded
+        || _sourceRunningStatus === NodeRunningStatus.Failed
+        || _sourceRunningStatus === NodeRunningStatus.Exception
+      ) && (
+        _targetRunningStatus === NodeRunningStatus.Succeeded
+        || _targetRunningStatus === NodeRunningStatus.Failed
+        || _targetRunningStatus === NodeRunningStatus.Exception
+        || _targetRunningStatus === NodeRunningStatus.Running
+      )
+    )
+      return id
+  }, [_sourceRunningStatus, _targetRunningStatus, id])
+
+  const handleOpenChange = useCallback((v: boolean) => {
+    setOpen(v)
+  }, [])
+
+  const handleInsert = useCallback<OnSelectBlock>((nodeType, toolDefaultValue) => {
+    handleNodeAdd(
+      {
+        nodeType,
+        toolDefaultValue,
+      },
+      {
+        prevNodeId: source,
+        prevNodeSourceHandle: sourceHandleId || 'source',
+        nextNodeId: target,
+        nextNodeTargetHandle: targetHandleId || 'target',
+      },
+    )
+  }, [handleNodeAdd, source, sourceHandleId, target, targetHandleId])
+
+  const stroke = useMemo(() => {
+    if (selected)
+      return getEdgeColor(NodeRunningStatus.Running)
+
+    if (linearGradientId)
+      return `url(#${linearGradientId})`
+
+    if (data?._connectedNodeIsHovering)
+      return getEdgeColor(NodeRunningStatus.Running, sourceHandleId === ErrorHandleTypeEnum.failBranch)
+
+    return getEdgeColor()
+  }, [data._connectedNodeIsHovering, linearGradientId, selected, sourceHandleId])
+
+  return (
+    <>
+      {
+        linearGradientId && (
+          <CustomEdgeLinearGradientRender
+            id={linearGradientId}
+            startColor={getEdgeColor(_sourceRunningStatus)}
+            stopColor={getEdgeColor(_targetRunningStatus)}
+            position={{
+              x1: sourceX,
+              y1: sourceY,
+              x2: targetX,
+              y2: targetY,
+            }}
+          />
+        )
+      }
+      <BaseEdge
+        id={id}
+        path={edgePath}
+        style={{
+          stroke,
+          strokeWidth: 2,
+          opacity: data._waitingRun ? 0.7 : 1,
+        }}
+      />
+      <EdgeLabelRenderer>
+        <div
+          className={cn(
+            'nopan nodrag hover:scale-125',
+            data?._hovering ? 'block' : 'hidden',
+            open && '!block',
+            data.isInIteration && `z-[${ITERATION_CHILDREN_Z_INDEX}]`,
+            data.isInLoop && `z-[${LOOP_CHILDREN_Z_INDEX}]`,
+          )}
+          style={{
+            position: 'absolute',
+            transform: `translate(-50%, -50%) translate(${labelX}px, ${labelY}px)`,
+            pointerEvents: 'all',
+            opacity: data._waitingRun ? 0.7 : 1,
+          }}
+        >
+          <BlockSelector
+            open={open}
+            onOpenChange={handleOpenChange}
+            asChild
+            onSelect={handleInsert}
+            availableBlocksTypes={intersection(availablePrevBlocks, availableNextBlocks)}
+            triggerClassName={() => 'hover:scale-150 transition-all'}
+          />
+        </div>
+      </EdgeLabelRenderer>
+    </>
+  )
+}
+
+export default memo(CustomEdge)
diff --git a/app/components/workflow/datasets-detail-store/provider.tsx b/app/components/workflow/datasets-detail-store/provider.tsx
new file mode 100644
index 0000000..7d6ede8
--- /dev/null
+++ b/app/components/workflow/datasets-detail-store/provider.tsx
@@ -0,0 +1,53 @@
+import type { FC } from 'react'
+import { createContext, useCallback, useEffect, useRef } from 'react'
+import { createDatasetsDetailStore } from './store'
+import type { CommonNodeType, Node } from '../types'
+import { BlockEnum } from '../types'
+import type { KnowledgeRetrievalNodeType } from '../nodes/knowledge-retrieval/types'
+import { fetchDatasets } from '@/service/datasets'
+
+type DatasetsDetailStoreApi = ReturnType<typeof createDatasetsDetailStore>
+
+type DatasetsDetailContextType = DatasetsDetailStoreApi | undefined
+
+export const DatasetsDetailContext = createContext<DatasetsDetailContextType>(undefined)
+
+type DatasetsDetailProviderProps = {
+  nodes: Node[]
+  children: React.ReactNode
+}
+
+const DatasetsDetailProvider: FC<DatasetsDetailProviderProps> = ({
+  nodes,
+  children,
+}) => {
+  const storeRef = useRef<DatasetsDetailStoreApi>()
+
+  if (!storeRef.current)
+    storeRef.current = createDatasetsDetailStore()
+
+  const updateDatasetsDetail = useCallback(async (datasetIds: string[]) => {
+    const { data: datasetsDetail } = await fetchDatasets({ url: '/datasets', params: { page: 1, ids: datasetIds } })
+    if (datasetsDetail && datasetsDetail.length > 0)
+      storeRef.current!.getState().updateDatasetsDetail(datasetsDetail)
+  }, [])
+
+  useEffect(() => {
+    if (!storeRef.current) return
+    const knowledgeRetrievalNodes = nodes.filter(node => node.data.type === BlockEnum.KnowledgeRetrieval)
+    const allDatasetIds = knowledgeRetrievalNodes.reduce<string[]>((acc, node) => {
+      return Array.from(new Set([...acc, ...(node.data as CommonNodeType<KnowledgeRetrievalNodeType>).dataset_ids]))
+    }, [])
+    if (allDatasetIds.length === 0) return
+    updateDatasetsDetail(allDatasetIds)
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  return (
+    <DatasetsDetailContext.Provider value={storeRef.current!}>
+      {children}
+    </DatasetsDetailContext.Provider>
+  )
+}
+
+export default DatasetsDetailProvider
diff --git a/app/components/workflow/datasets-detail-store/store.ts b/app/components/workflow/datasets-detail-store/store.ts
new file mode 100644
index 0000000..4bc8c33
--- /dev/null
+++ b/app/components/workflow/datasets-detail-store/store.ts
@@ -0,0 +1,38 @@
+import { useContext } from 'react'
+import { createStore, useStore } from 'zustand'
+import type { DataSet } from '@/models/datasets'
+import { DatasetsDetailContext } from './provider'
+import produce from 'immer'
+
+type DatasetsDetailStore = {
+  datasetsDetail: Record<string, DataSet>
+  updateDatasetsDetail: (datasetsDetail: DataSet[]) => void
+}
+
+export const createDatasetsDetailStore = () => {
+  return createStore<DatasetsDetailStore>((set, get) => ({
+    datasetsDetail: {},
+    updateDatasetsDetail: (datasets: DataSet[]) => {
+      const oldDatasetsDetail = get().datasetsDetail
+      const datasetsDetail = datasets.reduce<Record<string, DataSet>>((acc, dataset) => {
+        acc[dataset.id] = dataset
+        return acc
+      }, {})
+      // Merge new datasets detail into old one
+      const newDatasetsDetail = produce(oldDatasetsDetail, (draft) => {
+        Object.entries(datasetsDetail).forEach(([key, value]) => {
+          draft[key] = value
+        })
+      })
+      set({ datasetsDetail: newDatasetsDetail })
+    },
+  }))
+}
+
+export const useDatasetsDetailStore = <T>(selector: (state: DatasetsDetailStore) => T): T => {
+  const store = useContext(DatasetsDetailContext)
+  if (!store)
+    throw new Error('Missing DatasetsDetailContext.Provider in the tree')
+
+  return useStore(store, selector)
+}
diff --git a/app/components/workflow/dsl-export-confirm-modal.tsx b/app/components/workflow/dsl-export-confirm-modal.tsx
new file mode 100644
index 0000000..e9c51de
--- /dev/null
+++ b/app/components/workflow/dsl-export-confirm-modal.tsx
@@ -0,0 +1,86 @@
+'use client'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine, RiLock2Line } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import { Env } from '@/app/components/base/icons/src/vender/line/others'
+import Modal from '@/app/components/base/modal'
+import Checkbox from '@/app/components/base/checkbox'
+import Button from '@/app/components/base/button'
+import type { EnvironmentVariable } from '@/app/components/workflow/types'
+import { noop } from 'lodash-es'
+
+export type DSLExportConfirmModalProps = {
+  envList: EnvironmentVariable[]
+  onConfirm: (state: boolean) => void
+  onClose: () => void
+}
+
+const DSLExportConfirmModal = ({
+  envList = [],
+  onConfirm,
+  onClose,
+}: DSLExportConfirmModalProps) => {
+  const { t } = useTranslation()
+
+  const [exportSecrets, setExportSecrets] = useState<boolean>(false)
+
+  const submit = () => {
+    onConfirm(exportSecrets)
+    onClose()
+  }
+
+  return (
+    <Modal
+      isShow={true}
+      onClose={noop}
+      className={cn('w-[480px] max-w-[480px]')}
+    >
+      <div className='title-2xl-semi-bold relative pb-6 text-text-primary'>{t('workflow.env.export.title')}</div>
+      <div className='absolute right-4 top-4 cursor-pointer p-2' onClick={onClose}>
+        <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+      </div>
+      <div className='relative'>
+        <table className='radius-md w-full border-separate border-spacing-0 border border-divider-regular shadow-xs'>
+          <thead className='system-xs-medium-uppercase text-text-tertiary'>
+            <tr>
+              <td width={220} className='h-7 border-b border-r border-divider-regular pl-3'>NAME</td>
+              <td className='h-7 border-b border-divider-regular pl-3'>VALUE</td>
+            </tr>
+          </thead>
+          <tbody>
+            {envList.map((env, index) => (
+              <tr key={env.name}>
+                <td className={cn('system-xs-medium h-7 border-r pl-3', index + 1 !== envList.length && 'border-b')}>
+                  <div className='flex w-[200px] items-center gap-1'>
+                    <Env className='h-4 w-4 shrink-0 text-util-colors-violet-violet-600' />
+                    <div className='truncate text-text-primary'>{env.name}</div>
+                    <div className='shrink-0 text-text-tertiary'>Secret</div>
+                    <RiLock2Line className='h-3 w-3 shrink-0 text-text-tertiary' />
+                  </div>
+                </td>
+                <td className={cn('h-7 pl-3', index + 1 !== envList.length && 'border-b')}>
+                  <div className='system-xs-regular truncate text-text-secondary'>{env.value}</div>
+                </td>
+              </tr>
+            ))}
+          </tbody>
+        </table>
+      </div>
+      <div className='mt-4 flex gap-2'>
+        <Checkbox
+          className='shrink-0'
+          checked={exportSecrets}
+          onCheck={() => setExportSecrets(!exportSecrets)}
+        />
+        <div className='system-sm-medium cursor-pointer text-text-primary' onClick={() => setExportSecrets(!exportSecrets)}>{t('workflow.env.export.checkbox')}</div>
+      </div>
+      <div className='flex flex-row-reverse pt-6'>
+        <Button className='ml-2' variant='primary' onClick={submit}>{exportSecrets ? t('workflow.env.export.export') : t('workflow.env.export.ignore')}</Button>
+        <Button onClick={onClose}>{t('common.operation.cancel')}</Button>
+      </div>
+    </Modal>
+  )
+}
+
+export default DSLExportConfirmModal
diff --git a/app/components/workflow/features.tsx b/app/components/workflow/features.tsx
new file mode 100644
index 0000000..b54ffdf
--- /dev/null
+++ b/app/components/workflow/features.tsx
@@ -0,0 +1,60 @@
+import {
+  memo,
+  useCallback,
+} from 'react'
+import { useNodes } from 'reactflow'
+import { useStore } from './store'
+import {
+  useIsChatMode,
+  useNodesReadOnly,
+  useNodesSyncDraft,
+} from './hooks'
+import { type CommonNodeType, type InputVar, InputVarType, type Node } from './types'
+import useConfig from './nodes/start/use-config'
+import type { StartNodeType } from './nodes/start/types'
+import type { PromptVariable } from '@/models/debug'
+import NewFeaturePanel from '@/app/components/base/features/new-feature-panel'
+
+const Features = () => {
+  const setShowFeaturesPanel = useStore(s => s.setShowFeaturesPanel)
+  const isChatMode = useIsChatMode()
+  const { nodesReadOnly } = useNodesReadOnly()
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+  const nodes = useNodes<CommonNodeType>()
+
+  const startNode = nodes.find(node => node.data.type === 'start')
+  const { id, data } = startNode as Node<StartNodeType>
+  const { handleAddVariable } = useConfig(id, data)
+
+  const handleAddOpeningStatementVariable = (variables: PromptVariable[]) => {
+    const newVariable = variables[0]
+    const startNodeVariable: InputVar = {
+      variable: newVariable.key,
+      label: newVariable.name,
+      type: InputVarType.textInput,
+      max_length: newVariable.max_length,
+      required: newVariable.required || false,
+      options: [],
+    }
+    handleAddVariable(startNodeVariable)
+  }
+
+  const handleFeaturesChange = useCallback(() => {
+    handleSyncWorkflowDraft()
+    setShowFeaturesPanel(true)
+  }, [handleSyncWorkflowDraft, setShowFeaturesPanel])
+
+  return (
+    <NewFeaturePanel
+      show
+      isChatMode={isChatMode}
+      disabled={nodesReadOnly}
+      onChange={handleFeaturesChange}
+      onClose={() => setShowFeaturesPanel(false)}
+      onAutoAddPromptVariable={handleAddOpeningStatementVariable}
+      workflowVariables={data.variables}
+    />
+  )
+}
+
+export default memo(Features)
diff --git a/app/components/workflow/header/chat-variable-button.tsx b/app/components/workflow/header/chat-variable-button.tsx
new file mode 100644
index 0000000..b816e44
--- /dev/null
+++ b/app/components/workflow/header/chat-variable-button.tsx
@@ -0,0 +1,24 @@
+import { memo } from 'react'
+import Button from '@/app/components/base/button'
+import { BubbleX } from '@/app/components/base/icons/src/vender/line/others'
+import { useStore } from '@/app/components/workflow/store'
+
+const ChatVariableButton = ({ disabled }: { disabled: boolean }) => {
+  const setShowChatVariablePanel = useStore(s => s.setShowChatVariablePanel)
+  const setShowEnvPanel = useStore(s => s.setShowEnvPanel)
+  const setShowDebugAndPreviewPanel = useStore(s => s.setShowDebugAndPreviewPanel)
+
+  const handleClick = () => {
+    setShowChatVariablePanel(true)
+    setShowEnvPanel(false)
+    setShowDebugAndPreviewPanel(false)
+  }
+
+  return (
+    <Button className='p-2' disabled={disabled} onClick={handleClick}>
+      <BubbleX className='h-4 w-4 text-components-button-secondary-text' />
+    </Button>
+  )
+}
+
+export default memo(ChatVariableButton)
diff --git a/app/components/workflow/header/checklist.tsx b/app/components/workflow/header/checklist.tsx
new file mode 100644
index 0000000..9da16c5
--- /dev/null
+++ b/app/components/workflow/header/checklist.tsx
@@ -0,0 +1,166 @@
+import {
+  memo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  useEdges,
+  useNodes,
+} from 'reactflow'
+import {
+  RiCloseLine,
+  RiListCheck3,
+} from '@remixicon/react'
+import BlockIcon from '../block-icon'
+import {
+  useChecklist,
+  useNodesInteractions,
+} from '../hooks'
+import type {
+  CommonEdgeType,
+  CommonNodeType,
+} from '../types'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import {
+  ChecklistSquare,
+} from '@/app/components/base/icons/src/vender/line/general'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/line/alertsAndFeedback'
+
+type WorkflowChecklistProps = {
+  disabled: boolean
+}
+const WorkflowChecklist = ({
+  disabled,
+}: WorkflowChecklistProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const nodes = useNodes<CommonNodeType>()
+  const edges = useEdges<CommonEdgeType>()
+  const needWarningNodes = useChecklist(nodes, edges)
+  const { handleNodeSelect } = useNodesInteractions()
+
+  return (
+    <PortalToFollowElem
+      placement='bottom-end'
+      offset={{
+        mainAxis: 12,
+        crossAxis: 4,
+      }}
+      open={open}
+      onOpenChange={setOpen}
+    >
+      <PortalToFollowElemTrigger onClick={() => !disabled && setOpen(v => !v)}>
+        <div
+          className={cn(
+            'relative ml-0.5 flex h-7 w-7 items-center justify-center rounded-md',
+            disabled && 'cursor-not-allowed opacity-50',
+          )}
+        >
+          <div
+            className={cn('group flex h-full w-full cursor-pointer items-center justify-center rounded-md hover:bg-state-accent-hover', open && 'bg-state-accent-hover')}
+          >
+            <RiListCheck3
+              className={cn('h-4 w-4 group-hover:text-components-button-secondary-accent-text', open ? 'text-components-button-secondary-accent-text' : 'text-components-button-ghost-text')}
+            />
+          </div>
+          {
+            !!needWarningNodes.length && (
+              <div className='absolute -right-1.5 -top-1.5 flex h-[18px] min-w-[18px] items-center justify-center rounded-full border border-gray-100 bg-[#F79009] text-[11px] font-semibold text-white'>
+                {needWarningNodes.length}
+              </div>
+            )
+          }
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[12]'>
+        <div
+          className='w-[420px] overflow-y-auto rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-lg'
+          style={{
+            maxHeight: 'calc(2 / 3 * 100vh)',
+          }}
+        >
+          <div className='text-md sticky top-0 z-[1] flex h-[44px] items-center bg-components-panel-bg pl-4 pr-3 pt-3 font-semibold text-text-primary'>
+            <div className='grow'>{t('workflow.panel.checklist')}{needWarningNodes.length ? `(${needWarningNodes.length})` : ''}</div>
+            <div
+              className='flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center'
+              onClick={() => setOpen(false)}
+            >
+              <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+            </div>
+          </div>
+          <div className='py-2'>
+            {
+              !!needWarningNodes.length && (
+                <>
+                  <div className='px-4 text-xs text-text-tertiary'>{t('workflow.panel.checklistTip')}</div>
+                  <div className='px-4 py-2'>
+                    {
+                      needWarningNodes.map(node => (
+                        <div
+                          key={node.id}
+                          className='mb-2 cursor-pointer rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xs last-of-type:mb-0'
+                          onClick={() => {
+                            handleNodeSelect(node.id)
+                            setOpen(false)
+                          }}
+                        >
+                          <div className='flex h-9 items-center p-2 text-xs font-medium text-text-secondary'>
+                            <BlockIcon
+                              type={node.type}
+                              className='mr-1.5'
+                              toolIcon={node.toolIcon}
+                            />
+                            <span className='grow truncate'>
+                              {node.title}
+                            </span>
+                          </div>
+                          <div className='border-t-[0.5px] border-divider-regular'>
+                            {
+                              node.unConnected && (
+                                <div className='px-3 py-2 last:rounded-b-lg'>
+                                  <div className='flex text-xs leading-[18px] text-text-tertiary'>
+                                    <AlertTriangle className='mr-2 mt-[3px] h-3 w-3 text-[#F79009]' />
+                                    {t('workflow.common.needConnectTip')}
+                                  </div>
+                                </div>
+                              )
+                            }
+                            {
+                              node.errorMessage && (
+                                <div className='px-3 py-2 last:rounded-b-lg'>
+                                  <div className='flex text-xs leading-[18px] text-text-tertiary'>
+                                    <AlertTriangle className='mr-2 mt-[3px] h-3 w-3 text-[#F79009]' />
+                                    {node.errorMessage}
+                                  </div>
+                                </div>
+                              )
+                            }
+                          </div>
+                        </div>
+                      ))
+                    }
+                  </div>
+                </>
+              )
+            }
+            {
+              !needWarningNodes.length && (
+                <div className='mx-4 mb-3 rounded-lg bg-components-panel-bg py-4 text-center text-xs text-text-tertiary'>
+                  <ChecklistSquare className='mx-auto mb-[5px] h-8 w-8 text-text-quaternary' />
+                  {t('workflow.panel.checklistResolved')}
+                </div>
+              )
+            }
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default memo(WorkflowChecklist)
diff --git a/app/components/workflow/header/editing-title.tsx b/app/components/workflow/header/editing-title.tsx
new file mode 100644
index 0000000..2444cf8
--- /dev/null
+++ b/app/components/workflow/header/editing-title.tsx
@@ -0,0 +1,42 @@
+import { memo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useFormatTimeFromNow } from '../hooks'
+import { useStore } from '@/app/components/workflow/store'
+import useTimestamp from '@/hooks/use-timestamp'
+
+const EditingTitle = () => {
+  const { t } = useTranslation()
+  const { formatTime } = useTimestamp()
+  const { formatTimeFromNow } = useFormatTimeFromNow()
+  const draftUpdatedAt = useStore(state => state.draftUpdatedAt)
+  const publishedAt = useStore(state => state.publishedAt)
+  const isSyncingWorkflowDraft = useStore(s => s.isSyncingWorkflowDraft)
+
+  return (
+    <div className='system-xs-regular flex h-[18px] items-center text-text-tertiary'>
+      {
+        !!draftUpdatedAt && (
+          <>
+            {t('workflow.common.autoSaved')} {formatTime(draftUpdatedAt / 1000, 'HH:mm:ss')}
+          </>
+        )
+      }
+      <span className='mx-1 flex items-center'>路</span>
+      {
+        publishedAt
+          ? `${t('workflow.common.published')} ${formatTimeFromNow(publishedAt)}`
+          : t('workflow.common.unpublished')
+      }
+      {
+        isSyncingWorkflowDraft && (
+          <>
+            <span className='mx-1 flex items-center'>路</span>
+            {t('workflow.common.syncingData')}
+          </>
+        )
+      }
+    </div>
+  )
+}
+
+export default memo(EditingTitle)
diff --git a/app/components/workflow/header/env-button.tsx b/app/components/workflow/header/env-button.tsx
new file mode 100644
index 0000000..e3196ee
--- /dev/null
+++ b/app/components/workflow/header/env-button.tsx
@@ -0,0 +1,24 @@
+import { memo } from 'react'
+import Button from '@/app/components/base/button'
+import { Env } from '@/app/components/base/icons/src/vender/line/others'
+import { useStore } from '@/app/components/workflow/store'
+
+const EnvButton = ({ disabled }: { disabled: boolean }) => {
+  const setShowChatVariablePanel = useStore(s => s.setShowChatVariablePanel)
+  const setShowEnvPanel = useStore(s => s.setShowEnvPanel)
+  const setShowDebugAndPreviewPanel = useStore(s => s.setShowDebugAndPreviewPanel)
+
+  const handleClick = () => {
+    setShowEnvPanel(true)
+    setShowChatVariablePanel(false)
+    setShowDebugAndPreviewPanel(false)
+  }
+
+  return (
+    <Button className='p-2' disabled={disabled} onClick={handleClick}>
+      <Env className='h-4 w-4 text-components-button-secondary-text' />
+    </Button>
+  )
+}
+
+export default memo(EnvButton)
diff --git a/app/components/workflow/header/global-variable-button.tsx b/app/components/workflow/header/global-variable-button.tsx
new file mode 100644
index 0000000..597c916
--- /dev/null
+++ b/app/components/workflow/header/global-variable-button.tsx
@@ -0,0 +1,20 @@
+import { memo } from 'react'
+import Button from '@/app/components/base/button'
+import { GlobalVariable } from '@/app/components/base/icons/src/vender/line/others'
+import { useStore } from '@/app/components/workflow/store'
+
+const GlobalVariableButton = ({ disabled }: { disabled: boolean }) => {
+  const setShowPanel = useStore(s => s.setShowGlobalVariablePanel)
+
+  const handleClick = () => {
+    setShowPanel(true)
+  }
+
+  return (
+    <Button className='p-2' disabled={disabled} onClick={handleClick}>
+      <GlobalVariable className='h-4 w-4 text-components-button-secondary-text' />
+    </Button>
+  )
+}
+
+export default memo(GlobalVariableButton)
diff --git a/app/components/workflow/header/header-in-normal.tsx b/app/components/workflow/header/header-in-normal.tsx
new file mode 100644
index 0000000..ec016b1
--- /dev/null
+++ b/app/components/workflow/header/header-in-normal.tsx
@@ -0,0 +1,69 @@
+import {
+  useCallback,
+} from 'react'
+import { useNodes } from 'reactflow'
+import {
+  useStore,
+  useWorkflowStore,
+} from '../store'
+import type { StartNodeType } from '../nodes/start/types'
+import {
+  useNodesInteractions,
+  useNodesReadOnly,
+  useWorkflowRun,
+} from '../hooks'
+import Divider from '../../base/divider'
+import RunAndHistory from './run-and-history'
+import EditingTitle from './editing-title'
+import EnvButton from './env-button'
+import VersionHistoryButton from './version-history-button'
+
+export type HeaderInNormalProps = {
+  components?: {
+    left?: React.ReactNode
+    middle?: React.ReactNode
+  }
+}
+const HeaderInNormal = ({
+  components,
+}: HeaderInNormalProps) => {
+  const workflowStore = useWorkflowStore()
+  const { nodesReadOnly } = useNodesReadOnly()
+  const { handleNodeSelect } = useNodesInteractions()
+  const setShowWorkflowVersionHistoryPanel = useStore(s => s.setShowWorkflowVersionHistoryPanel)
+  const setShowEnvPanel = useStore(s => s.setShowEnvPanel)
+  const setShowDebugAndPreviewPanel = useStore(s => s.setShowDebugAndPreviewPanel)
+  const nodes = useNodes<StartNodeType>()
+  const selectedNode = nodes.find(node => node.data.selected)
+  const { handleBackupDraft } = useWorkflowRun()
+
+  const onStartRestoring = useCallback(() => {
+    workflowStore.setState({ isRestoring: true })
+    handleBackupDraft()
+    // clear right panel
+    if (selectedNode)
+      handleNodeSelect(selectedNode.id, true)
+    setShowWorkflowVersionHistoryPanel(true)
+    setShowEnvPanel(false)
+    setShowDebugAndPreviewPanel(false)
+  }, [handleBackupDraft, workflowStore, handleNodeSelect, selectedNode,
+    setShowWorkflowVersionHistoryPanel, setShowEnvPanel, setShowDebugAndPreviewPanel])
+
+  return (
+    <>
+      <div>
+        <EditingTitle />
+      </div>
+      <div className='flex items-center gap-2'>
+        {components?.left}
+        <EnvButton disabled={nodesReadOnly} />
+        <Divider type='vertical' className='mx-auto h-3.5' />
+        <RunAndHistory />
+        {components?.middle}
+        <VersionHistoryButton onClick={onStartRestoring} />
+      </div>
+    </>
+  )
+}
+
+export default HeaderInNormal
diff --git a/app/components/workflow/header/header-in-restoring.tsx b/app/components/workflow/header/header-in-restoring.tsx
new file mode 100644
index 0000000..4d19545
--- /dev/null
+++ b/app/components/workflow/header/header-in-restoring.tsx
@@ -0,0 +1,93 @@
+import {
+  useCallback,
+} from 'react'
+import { RiHistoryLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import {
+  useStore,
+  useWorkflowStore,
+} from '../store'
+import {
+  WorkflowVersion,
+} from '../types'
+import {
+  useNodesSyncDraft,
+  useWorkflowRun,
+} from '../hooks'
+import Toast from '../../base/toast'
+import RestoringTitle from './restoring-title'
+import Button from '@/app/components/base/button'
+
+export type HeaderInRestoringProps = {
+  onRestoreSettled?: () => void
+}
+const HeaderInRestoring = ({
+  onRestoreSettled,
+}: HeaderInRestoringProps) => {
+  const { t } = useTranslation()
+  const workflowStore = useWorkflowStore()
+  const currentVersion = useStore(s => s.currentVersion)
+  const setShowWorkflowVersionHistoryPanel = useStore(s => s.setShowWorkflowVersionHistoryPanel)
+
+  const {
+    handleLoadBackupDraft,
+  } = useWorkflowRun()
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+
+  const handleCancelRestore = useCallback(() => {
+    handleLoadBackupDraft()
+    workflowStore.setState({ isRestoring: false })
+    setShowWorkflowVersionHistoryPanel(false)
+  }, [workflowStore, handleLoadBackupDraft, setShowWorkflowVersionHistoryPanel])
+
+  const handleRestore = useCallback(() => {
+    setShowWorkflowVersionHistoryPanel(false)
+    workflowStore.setState({ isRestoring: false })
+    workflowStore.setState({ backupDraft: undefined })
+    handleSyncWorkflowDraft(true, false, {
+      onSuccess: () => {
+        Toast.notify({
+          type: 'success',
+          message: t('workflow.versionHistory.action.restoreSuccess'),
+        })
+      },
+      onError: () => {
+        Toast.notify({
+          type: 'error',
+          message: t('workflow.versionHistory.action.restoreFailure'),
+        })
+      },
+      onSettled: () => {
+        onRestoreSettled?.()
+      },
+    })
+  }, [handleSyncWorkflowDraft, workflowStore, setShowWorkflowVersionHistoryPanel, onRestoreSettled, t])
+
+  return (
+    <>
+      <div>
+        <RestoringTitle />
+      </div>
+      <div className='flex items-center justify-end gap-x-2'>
+        <Button
+          onClick={handleRestore}
+          disabled={!currentVersion || currentVersion.version === WorkflowVersion.Draft}
+          variant='primary'
+        >
+          {t('workflow.common.restore')}
+        </Button>
+        <Button
+          className='text-components-button-secondary-accent-text'
+          onClick={handleCancelRestore}
+        >
+          <div className='flex items-center gap-x-0.5'>
+            <RiHistoryLine className='h-4 w-4' />
+            <span className='px-0.5'>{t('workflow.common.exitVersions')}</span>
+          </div>
+        </Button>
+      </div>
+    </>
+  )
+}
+
+export default HeaderInRestoring
diff --git a/app/components/workflow/header/header-in-view-history.tsx b/app/components/workflow/header/header-in-view-history.tsx
new file mode 100644
index 0000000..81858cc
--- /dev/null
+++ b/app/components/workflow/header/header-in-view-history.tsx
@@ -0,0 +1,50 @@
+import {
+  useCallback,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  useWorkflowStore,
+} from '../store'
+import {
+  useWorkflowRun,
+} from '../hooks'
+import Divider from '../../base/divider'
+import RunningTitle from './running-title'
+import ViewHistory from './view-history'
+import Button from '@/app/components/base/button'
+import { ArrowNarrowLeft } from '@/app/components/base/icons/src/vender/line/arrows'
+
+const HeaderInHistory = () => {
+  const { t } = useTranslation()
+  const workflowStore = useWorkflowStore()
+
+  const {
+    handleLoadBackupDraft,
+  } = useWorkflowRun()
+
+  const handleGoBackToEdit = useCallback(() => {
+    handleLoadBackupDraft()
+    workflowStore.setState({ historyWorkflowData: undefined })
+  }, [workflowStore, handleLoadBackupDraft])
+
+  return (
+    <>
+      <div>
+        <RunningTitle />
+      </div>
+      <div className='flex items-center space-x-2'>
+        <ViewHistory withText />
+        <Divider type='vertical' className='mx-auto h-3.5' />
+        <Button
+          variant='primary'
+          onClick={handleGoBackToEdit}
+        >
+          <ArrowNarrowLeft className='mr-1 h-4 w-4' />
+          {t('workflow.common.goBackToEdit')}
+        </Button>
+      </div>
+    </>
+  )
+}
+
+export default HeaderInHistory
diff --git a/app/components/workflow/header/index.tsx b/app/components/workflow/header/index.tsx
new file mode 100644
index 0000000..e5391af
--- /dev/null
+++ b/app/components/workflow/header/index.tsx
@@ -0,0 +1,51 @@
+import {
+  useWorkflowMode,
+} from '../hooks'
+import type { HeaderInNormalProps } from './header-in-normal'
+import HeaderInNormal from './header-in-normal'
+import HeaderInHistory from './header-in-view-history'
+import type { HeaderInRestoringProps } from './header-in-restoring'
+import HeaderInRestoring from './header-in-restoring'
+
+export type HeaderProps = {
+  normal?: HeaderInNormalProps
+  restoring?: HeaderInRestoringProps
+}
+const Header = ({
+  normal: normalProps,
+  restoring: restoringProps,
+}: HeaderProps) => {
+  const {
+    normal,
+    restoring,
+    viewHistory,
+  } = useWorkflowMode()
+
+  return (
+    <div
+      className='absolute left-0 top-0 z-10 flex h-14 w-full items-center justify-between bg-mask-top2bottom-gray-50-to-transparent px-3'
+    >
+      {
+        normal && (
+          <HeaderInNormal
+            {...normalProps}
+          />
+        )
+      }
+      {
+        viewHistory && (
+          <HeaderInHistory />
+        )
+      }
+      {
+        restoring && (
+          <HeaderInRestoring
+            {...restoringProps}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default Header
diff --git a/app/components/workflow/header/restoring-title.tsx b/app/components/workflow/header/restoring-title.tsx
new file mode 100644
index 0000000..26cdd79
--- /dev/null
+++ b/app/components/workflow/header/restoring-title.tsx
@@ -0,0 +1,49 @@
+import { memo, useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useFormatTimeFromNow } from '../hooks'
+import { useStore } from '../store'
+import { WorkflowVersion } from '../types'
+import useTimestamp from '@/hooks/use-timestamp'
+
+const RestoringTitle = () => {
+  const { t } = useTranslation()
+  const { formatTimeFromNow } = useFormatTimeFromNow()
+  const { formatTime } = useTimestamp()
+  const currentVersion = useStore(state => state.currentVersion)
+  const isDraft = currentVersion?.version === WorkflowVersion.Draft
+  const publishStatus = isDraft ? t('workflow.common.unpublished') : t('workflow.common.published')
+
+  const versionName = useMemo(() => {
+    if (isDraft)
+      return t('workflow.versionHistory.currentDraft')
+    return currentVersion?.marked_name || t('workflow.versionHistory.defaultName')
+  }, [currentVersion, t, isDraft])
+
+  return (
+    <div className='flex flex-col gap-y-0.5'>
+      <div className='flex items-center gap-x-1'>
+        <span className='system-sm-semibold text-text-primary'>
+          {versionName}
+        </span>
+        <span className='system-2xs-medium-uppercase rounded-[5px] border border-text-accent-secondary bg-components-badge-bg-dimm px-1 py-0.5 text-text-accent-secondary'>
+          {t('workflow.common.viewOnly')}
+        </span>
+      </div>
+      <div className='system-xs-regular flex h-4 items-center gap-x-1 text-text-tertiary'>
+        {
+          currentVersion && (
+            <>
+              <span>{publishStatus}</span>
+              <span>路</span>
+              <span>{`${formatTimeFromNow((isDraft ? currentVersion.updated_at : currentVersion.created_at) * 1000)} ${formatTime(currentVersion.created_at, 'HH:mm:ss')}`}</span>
+              <span>路</span>
+              <span>{currentVersion?.created_by?.name || ''}</span>
+            </>
+          )
+        }
+      </div>
+    </div>
+  )
+}
+
+export default memo(RestoringTitle)
diff --git a/app/components/workflow/header/run-and-history.tsx b/app/components/workflow/header/run-and-history.tsx
new file mode 100644
index 0000000..19ed87d
--- /dev/null
+++ b/app/components/workflow/header/run-and-history.tsx
@@ -0,0 +1,111 @@
+import type { FC } from 'react'
+import { memo } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiLoader2Line,
+  RiPlayLargeLine,
+} from '@remixicon/react'
+import { useStore } from '../store'
+import {
+  useIsChatMode,
+  useNodesReadOnly,
+  useWorkflowRun,
+  useWorkflowStartRun,
+} from '../hooks'
+import { WorkflowRunningStatus } from '../types'
+import ViewHistory from './view-history'
+import Checklist from './checklist'
+import cn from '@/utils/classnames'
+import {
+  StopCircle,
+} from '@/app/components/base/icons/src/vender/line/mediaAndDevices'
+
+const RunMode = memo(() => {
+  const { t } = useTranslation()
+  const { handleWorkflowStartRunInWorkflow } = useWorkflowStartRun()
+  const { handleStopRun } = useWorkflowRun()
+  const workflowRunningData = useStore(s => s.workflowRunningData)
+  const isRunning = workflowRunningData?.result.status === WorkflowRunningStatus.Running
+
+  return (
+    <>
+      <div
+        className={cn(
+          'flex h-7 items-center rounded-md px-2.5 text-[13px] font-medium text-components-button-secondary-accent-text',
+          'cursor-pointer hover:bg-state-accent-hover',
+          isRunning && '!cursor-not-allowed bg-state-accent-hover',
+        )}
+        onClick={() => {
+          handleWorkflowStartRunInWorkflow()
+        }}
+      >
+        {
+          isRunning
+            ? (
+              <>
+                <RiLoader2Line className='mr-1 h-4 w-4 animate-spin' />
+                {t('workflow.common.running')}
+              </>
+            )
+            : (
+              <>
+                <RiPlayLargeLine className='mr-1 h-4 w-4' />
+                {t('workflow.common.run')}
+              </>
+            )
+        }
+      </div>
+      {
+        isRunning && (
+          <div
+            className='ml-0.5 flex h-7 w-7 cursor-pointer items-center justify-center rounded-md hover:bg-black/5'
+            onClick={() => handleStopRun(workflowRunningData?.task_id || '')}
+          >
+            <StopCircle className='h-4 w-4 text-components-button-ghost-text' />
+          </div>
+        )
+      }
+    </>
+  )
+})
+RunMode.displayName = 'RunMode'
+
+const PreviewMode = memo(() => {
+  const { t } = useTranslation()
+  const { handleWorkflowStartRunInChatflow } = useWorkflowStartRun()
+
+  return (
+    <div
+      className={cn(
+        'flex h-7 items-center rounded-md px-2.5 text-[13px] font-medium text-components-button-secondary-accent-text',
+        'cursor-pointer hover:bg-state-accent-hover',
+      )}
+      onClick={() => handleWorkflowStartRunInChatflow()}
+    >
+      <RiPlayLargeLine className='mr-1 h-4 w-4' />
+      {t('workflow.common.debugAndPreview')}
+    </div>
+  )
+})
+PreviewMode.displayName = 'PreviewMode'
+
+const RunAndHistory: FC = () => {
+  const isChatMode = useIsChatMode()
+  const { nodesReadOnly } = useNodesReadOnly()
+
+  return (
+    <div className='flex h-8 items-center rounded-lg border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-0.5 shadow-xs'>
+      {
+        !isChatMode && <RunMode />
+      }
+      {
+        isChatMode && <PreviewMode />
+      }
+      <div className='mx-0.5 h-3.5 w-[1px] bg-divider-regular'></div>
+      <ViewHistory />
+      <Checklist disabled={nodesReadOnly} />
+    </div>
+  )
+}
+
+export default memo(RunAndHistory)
diff --git a/app/components/workflow/header/running-title.tsx b/app/components/workflow/header/running-title.tsx
new file mode 100644
index 0000000..0460a96
--- /dev/null
+++ b/app/components/workflow/header/running-title.tsx
@@ -0,0 +1,24 @@
+import { memo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useIsChatMode } from '../hooks'
+import { useStore } from '../store'
+import { ClockPlay } from '@/app/components/base/icons/src/vender/line/time'
+
+const RunningTitle = () => {
+  const { t } = useTranslation()
+  const isChatMode = useIsChatMode()
+  const historyWorkflowData = useStore(s => s.historyWorkflowData)
+
+  return (
+    <div className='flex h-[18px] items-center text-xs text-gray-500'>
+      <ClockPlay className='mr-1 h-3 w-3 text-gray-500' />
+      <span>{isChatMode ? `Test Chat#${historyWorkflowData?.sequence_number}` : `Test Run#${historyWorkflowData?.sequence_number}`}</span>
+      <span className='mx-1'>路</span>
+      <span className='ml-1 flex h-[18px] items-center rounded-[5px] border border-indigo-300 bg-white/[0.48] px-1 text-[10px] font-semibold uppercase text-indigo-600'>
+        {t('workflow.common.viewOnly')}
+      </span>
+    </div>
+  )
+}
+
+export default memo(RunningTitle)
diff --git a/app/components/workflow/header/undo-redo.tsx b/app/components/workflow/header/undo-redo.tsx
new file mode 100644
index 0000000..9beb655
--- /dev/null
+++ b/app/components/workflow/header/undo-redo.tsx
@@ -0,0 +1,66 @@
+import type { FC } from 'react'
+import { memo, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowGoBackLine,
+  RiArrowGoForwardFill,
+} from '@remixicon/react'
+import TipPopup from '../operator/tip-popup'
+import { useWorkflowHistoryStore } from '../workflow-history-store'
+import Divider from '../../base/divider'
+import { useNodesReadOnly } from '@/app/components/workflow/hooks'
+import ViewWorkflowHistory from '@/app/components/workflow/header/view-workflow-history'
+import classNames from '@/utils/classnames'
+
+export type UndoRedoProps = { handleUndo: () => void; handleRedo: () => void }
+const UndoRedo: FC<UndoRedoProps> = ({ handleUndo, handleRedo }) => {
+  const { t } = useTranslation()
+  const { store } = useWorkflowHistoryStore()
+  const [buttonsDisabled, setButtonsDisabled] = useState({ undo: true, redo: true })
+
+  useEffect(() => {
+    const unsubscribe = store.temporal.subscribe((state) => {
+      setButtonsDisabled({
+        undo: state.pastStates.length === 0,
+        redo: state.futureStates.length === 0,
+      })
+    })
+    return () => unsubscribe()
+  }, [store])
+
+  const { nodesReadOnly } = useNodesReadOnly()
+
+  return (
+    <div className='flex items-center space-x-0.5 rounded-lg border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg p-0.5 shadow-lg backdrop-blur-[5px]'>
+      <TipPopup title={t('workflow.common.undo')!} shortcuts={['ctrl', 'z']}>
+        <div
+          data-tooltip-id='workflow.undo'
+          className={
+            classNames('flex items-center px-1.5 w-8 h-8 rounded-md system-sm-medium text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary cursor-pointer select-none',
+              (nodesReadOnly || buttonsDisabled.undo)
+              && 'hover:bg-transparent text-text-disabled hover:text-text-disabled cursor-not-allowed')}
+          onClick={() => !nodesReadOnly && !buttonsDisabled.undo && handleUndo()}
+        >
+          <RiArrowGoBackLine className='h-4 w-4' />
+        </div>
+      </TipPopup >
+      <TipPopup title={t('workflow.common.redo')!} shortcuts={['ctrl', 'y']}>
+        <div
+          data-tooltip-id='workflow.redo'
+          className={
+            classNames('flex items-center px-1.5 w-8 h-8 rounded-md system-sm-medium text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary cursor-pointer select-none',
+              (nodesReadOnly || buttonsDisabled.redo)
+              && 'hover:bg-transparent text-text-disabled hover:text-text-disabled cursor-not-allowed',
+            )}
+          onClick={() => !nodesReadOnly && !buttonsDisabled.redo && handleRedo()}
+        >
+          <RiArrowGoForwardFill className='h-4 w-4' />
+        </div>
+      </TipPopup>
+      <Divider type='vertical' className="mx-0.5 h-3.5" />
+      <ViewWorkflowHistory />
+    </div >
+  )
+}
+
+export default memo(UndoRedo)
diff --git a/app/components/workflow/header/version-history-button.tsx b/app/components/workflow/header/version-history-button.tsx
new file mode 100644
index 0000000..5a84205
--- /dev/null
+++ b/app/components/workflow/header/version-history-button.tsx
@@ -0,0 +1,66 @@
+import React, { type FC, useCallback } from 'react'
+import { RiHistoryLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useKeyPress } from 'ahooks'
+import Button from '../../base/button'
+import Tooltip from '../../base/tooltip'
+import { getKeyboardKeyCodeBySystem } from '../utils'
+
+type VersionHistoryButtonProps = {
+  onClick: () => Promise<unknown> | unknown
+}
+
+const VERSION_HISTORY_SHORTCUT = ['鈱�', '鈬�', 'H']
+
+const PopupContent = React.memo(() => {
+  const { t } = useTranslation()
+  return (
+    <div className='flex items-center gap-x-1'>
+      <div className='system-xs-medium px-0.5 text-text-secondary'>
+        {t('workflow.common.versionHistory')}
+      </div>
+      <div className='flex items-center gap-x-0.5'>
+        {VERSION_HISTORY_SHORTCUT.map(key => (
+          <span
+            key={key}
+            className='system-kbd rounded-[4px] bg-components-kbd-bg-white px-[1px] text-text-tertiary'
+          >
+            {key}
+          </span>
+        ))}
+      </div>
+    </div>
+  )
+})
+
+PopupContent.displayName = 'PopupContent'
+
+const VersionHistoryButton: FC<VersionHistoryButtonProps> = ({
+  onClick,
+}) => {
+  const handleViewVersionHistory = useCallback(async () => {
+    await onClick?.()
+  }, [onClick])
+
+  useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.shift.h`, (e) => {
+    e.preventDefault()
+    handleViewVersionHistory()
+  },
+  { exactMatch: true, useCapture: true })
+
+  return <Tooltip
+    popupContent={<PopupContent />}
+    noDecoration
+    popupClassName='rounded-lg border-[0.5px] border-components-panel-border bg-components-tooltip-bg
+    shadow-lg shadow-shadow-shadow-5 backdrop-blur-[5px] p-1.5'
+  >
+    <Button
+      className={'p-2'}
+      onClick={handleViewVersionHistory}
+    >
+      <RiHistoryLine className='h-4 w-4 text-components-button-secondary-text' />
+    </Button>
+  </Tooltip>
+}
+
+export default VersionHistoryButton
diff --git a/app/components/workflow/header/view-history.tsx b/app/components/workflow/header/view-history.tsx
new file mode 100644
index 0000000..21b4462
--- /dev/null
+++ b/app/components/workflow/header/view-history.tsx
@@ -0,0 +1,221 @@
+import {
+  memo,
+  useState,
+} from 'react'
+import useSWR from 'swr'
+import { useTranslation } from 'react-i18next'
+import { useShallow } from 'zustand/react/shallow'
+import {
+  RiCheckboxCircleLine,
+  RiCloseLine,
+  RiErrorWarningLine,
+} from '@remixicon/react'
+import {
+  useFormatTimeFromNow,
+  useIsChatMode,
+  useNodesInteractions,
+  useWorkflowInteractions,
+  useWorkflowRun,
+} from '../hooks'
+import { ControlMode, WorkflowRunningStatus } from '../types'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Tooltip from '@/app/components/base/tooltip'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import {
+  ClockPlay,
+  ClockPlaySlim,
+} from '@/app/components/base/icons/src/vender/line/time'
+import { AlertTriangle } from '@/app/components/base/icons/src/vender/line/alertsAndFeedback'
+import {
+  fetchChatRunHistory,
+  fetchWorkflowRunHistory,
+} from '@/service/workflow'
+import Loading from '@/app/components/base/loading'
+import {
+  useStore,
+  useWorkflowStore,
+} from '@/app/components/workflow/store'
+
+type ViewHistoryProps = {
+  withText?: boolean
+}
+const ViewHistory = ({
+  withText,
+}: ViewHistoryProps) => {
+  const { t } = useTranslation()
+  const isChatMode = useIsChatMode()
+  const [open, setOpen] = useState(false)
+  const { formatTimeFromNow } = useFormatTimeFromNow()
+  const {
+    handleNodesCancelSelected,
+  } = useNodesInteractions()
+  const {
+    handleCancelDebugAndPreviewPanel,
+  } = useWorkflowInteractions()
+  const workflowStore = useWorkflowStore()
+  const setControlMode = useStore(s => s.setControlMode)
+  const { appDetail, setCurrentLogItem, setShowMessageLogModal } = useAppStore(useShallow(state => ({
+    appDetail: state.appDetail,
+    setCurrentLogItem: state.setCurrentLogItem,
+    setShowMessageLogModal: state.setShowMessageLogModal,
+  })))
+  const historyWorkflowData = useStore(s => s.historyWorkflowData)
+  const { handleBackupDraft } = useWorkflowRun()
+  const { data: runList, isLoading: runListLoading } = useSWR((appDetail && !isChatMode && open) ? `/apps/${appDetail.id}/workflow-runs` : null, fetchWorkflowRunHistory)
+  const { data: chatList, isLoading: chatListLoading } = useSWR((appDetail && isChatMode && open) ? `/apps/${appDetail.id}/advanced-chat/workflow-runs` : null, fetchChatRunHistory)
+
+  const data = isChatMode ? chatList : runList
+  const isLoading = isChatMode ? chatListLoading : runListLoading
+
+  return (
+    (
+      <PortalToFollowElem
+        placement={withText ? 'bottom-start' : 'bottom-end'}
+        offset={{
+          mainAxis: 4,
+          crossAxis: withText ? -8 : 10,
+        }}
+        open={open}
+        onOpenChange={setOpen}
+      >
+        <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+          {
+            withText && (
+              <div className={cn(
+                'flex h-8 items-center rounded-lg border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-3 shadow-xs',
+                'cursor-pointer text-[13px] font-medium text-components-button-secondary-text hover:bg-components-button-secondary-bg-hover',
+                open && 'bg-components-button-secondary-bg-hover',
+              )}>
+                <ClockPlay
+                  className={'mr-1 h-4 w-4'}
+                />
+                {t('workflow.common.showRunHistory')}
+              </div>
+            )
+          }
+          {
+            !withText && (
+              <Tooltip
+                popupContent={t('workflow.common.viewRunHistory')}
+              >
+                <div
+                  className={cn('group flex h-7 w-7 cursor-pointer items-center justify-center rounded-md hover:bg-state-accent-hover', open && 'bg-state-accent-hover')}
+                  onClick={() => {
+                    setCurrentLogItem()
+                    setShowMessageLogModal(false)
+                  }}
+                >
+                  <ClockPlay className={cn('h-4 w-4 group-hover:text-components-button-secondary-accent-text', open ? 'text-components-button-secondary-accent-text' : 'text-components-button-ghost-text')} />
+                </div>
+              </Tooltip>
+            )
+          }
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[12]'>
+          <div
+            className='ml-2 flex w-[240px] flex-col overflow-y-auto rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl'
+            style={{
+              maxHeight: 'calc(2 / 3 * 100vh)',
+            }}
+          >
+            <div className='sticky top-0 flex items-center justify-between bg-components-panel-bg px-4 pt-3 text-base font-semibold text-text-primary'>
+              <div className='grow'>{t('workflow.common.runHistory')}</div>
+              <div
+                className='flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center'
+                onClick={() => {
+                  setCurrentLogItem()
+                  setShowMessageLogModal(false)
+                  setOpen(false)
+                }}
+              >
+                <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+              </div>
+            </div>
+            {
+              isLoading && (
+                <div className='flex h-10 items-center justify-center'>
+                  <Loading />
+                </div>
+              )
+            }
+            {
+              !isLoading && (
+                <div className='p-2'>
+                  {
+                    !data?.data.length && (
+                      <div className='py-12'>
+                        <ClockPlaySlim className='mx-auto mb-2 h-8 w-8 text-text-quaternary' />
+                        <div className='text-center text-[13px] text-text-quaternary'>
+                          {t('workflow.common.notRunning')}
+                        </div>
+                      </div>
+                    )
+                  }
+                  {
+                    data?.data.map(item => (
+                      <div
+                        key={item.id}
+                        className={cn(
+                          'mb-0.5 flex cursor-pointer rounded-lg px-2 py-[7px] hover:bg-state-base-hover',
+                          item.id === historyWorkflowData?.id && 'bg-state-accent-hover hover:bg-state-accent-hover',
+                        )}
+                        onClick={() => {
+                          workflowStore.setState({
+                            historyWorkflowData: item,
+                            showInputsPanel: false,
+                            showEnvPanel: false,
+                          })
+                          handleBackupDraft()
+                          setOpen(false)
+                          handleNodesCancelSelected()
+                          handleCancelDebugAndPreviewPanel()
+                          setControlMode(ControlMode.Hand)
+                        }}
+                      >
+                        {
+                          !isChatMode && item.status === WorkflowRunningStatus.Stopped && (
+                            <AlertTriangle className='mr-1.5 mt-0.5 h-3.5 w-3.5 text-[#F79009]' />
+                          )
+                        }
+                        {
+                          !isChatMode && item.status === WorkflowRunningStatus.Failed && (
+                            <RiErrorWarningLine className='mr-1.5 mt-0.5 h-3.5 w-3.5 text-[#F04438]' />
+                          )
+                        }
+                        {
+                          !isChatMode && item.status === WorkflowRunningStatus.Succeeded && (
+                            <RiCheckboxCircleLine className='mr-1.5 mt-0.5 h-3.5 w-3.5 text-[#12B76A]' />
+                          )
+                        }
+                        <div>
+                          <div
+                            className={cn(
+                              'flex items-center text-[13px] font-medium leading-[18px] text-text-primary',
+                              item.id === historyWorkflowData?.id && 'text-text-accent',
+                            )}
+                          >
+                            {`Test ${isChatMode ? 'Chat' : 'Run'} #${item.sequence_number}`}
+                          </div>
+                          <div className='flex items-center text-xs leading-[18px] text-text-tertiary'>
+                            {item.created_by_account?.name} 路 {formatTimeFromNow((item.finished_at || item.created_at) * 1000)}
+                          </div>
+                        </div>
+                      </div>
+                    ))
+                  }
+                </div>
+              )
+            }
+          </div>
+        </PortalToFollowElemContent>
+      </PortalToFollowElem>
+    )
+  )
+}
+
+export default memo(ViewHistory)
diff --git a/app/components/workflow/header/view-workflow-history.tsx b/app/components/workflow/header/view-workflow-history.tsx
new file mode 100644
index 0000000..fe1c819
--- /dev/null
+++ b/app/components/workflow/header/view-workflow-history.tsx
@@ -0,0 +1,273 @@
+import {
+  memo,
+  useCallback,
+  useMemo,
+  useState,
+} from 'react'
+import {
+  RiCloseLine,
+  RiHistoryLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useShallow } from 'zustand/react/shallow'
+import { useStoreApi } from 'reactflow'
+import {
+  useNodesReadOnly,
+  useWorkflowHistory,
+} from '../hooks'
+import TipPopup from '../operator/tip-popup'
+import type { WorkflowHistoryState } from '../workflow-history-store'
+import Divider from '../../base/divider'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import classNames from '@/utils/classnames'
+
+type ChangeHistoryEntry = {
+  label: string
+  index: number
+  state: Partial<WorkflowHistoryState>
+}
+
+type ChangeHistoryList = {
+  pastStates: ChangeHistoryEntry[]
+  futureStates: ChangeHistoryEntry[]
+  statesCount: number
+}
+
+const ViewWorkflowHistory = () => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const { nodesReadOnly } = useNodesReadOnly()
+  const { setCurrentLogItem, setShowMessageLogModal } = useAppStore(useShallow(state => ({
+    appDetail: state.appDetail,
+    setCurrentLogItem: state.setCurrentLogItem,
+    setShowMessageLogModal: state.setShowMessageLogModal,
+  })))
+  const reactFlowStore = useStoreApi()
+  const { store, getHistoryLabel } = useWorkflowHistory()
+
+  const { pastStates, futureStates, undo, redo, clear } = store.temporal.getState()
+  const [currentHistoryStateIndex, setCurrentHistoryStateIndex] = useState<number>(0)
+
+  const handleClearHistory = useCallback(() => {
+    clear()
+    setCurrentHistoryStateIndex(0)
+  }, [clear])
+
+  const handleSetState = useCallback(({ index }: ChangeHistoryEntry) => {
+    const { setEdges, setNodes } = reactFlowStore.getState()
+    const diff = currentHistoryStateIndex + index
+    if (diff === 0)
+      return
+
+    if (diff < 0)
+      undo(diff * -1)
+    else
+      redo(diff)
+
+    const { edges, nodes } = store.getState()
+    if (edges.length === 0 && nodes.length === 0)
+      return
+
+    setEdges(edges)
+    setNodes(nodes)
+  }, [currentHistoryStateIndex, reactFlowStore, redo, store, undo])
+
+  const calculateStepLabel = useCallback((index: number) => {
+    if (!index)
+      return
+
+    const count = index < 0 ? index * -1 : index
+    return `${index > 0 ? t('workflow.changeHistory.stepForward', { count }) : t('workflow.changeHistory.stepBackward', { count })}`
+  }, [t])
+
+  const calculateChangeList: ChangeHistoryList = useMemo(() => {
+    const filterList = (list: any, startIndex = 0, reverse = false) => list.map((state: Partial<WorkflowHistoryState>, index: number) => {
+      return {
+        label: state.workflowHistoryEvent && getHistoryLabel(state.workflowHistoryEvent),
+        index: reverse ? list.length - 1 - index - startIndex : index - startIndex,
+        state,
+      }
+    }).filter(Boolean)
+
+    const historyData = {
+      pastStates: filterList(pastStates, pastStates.length).reverse(),
+      futureStates: filterList([...futureStates, (!pastStates.length && !futureStates.length) ? undefined : store.getState()].filter(Boolean), 0, true),
+      statesCount: 0,
+    }
+
+    historyData.statesCount = pastStates.length + futureStates.length
+
+    return {
+      ...historyData,
+      statesCount: pastStates.length + futureStates.length,
+    }
+  }, [futureStates, getHistoryLabel, pastStates, store])
+
+  return (
+    (
+      <PortalToFollowElem
+        placement='bottom-end'
+        offset={{
+          mainAxis: 4,
+          crossAxis: 131,
+        }}
+        open={open}
+        onOpenChange={setOpen}
+      >
+        <PortalToFollowElemTrigger onClick={() => !nodesReadOnly && setOpen(v => !v)}>
+          <TipPopup
+            title={t('workflow.changeHistory.title')}
+          >
+            <div
+              className={
+                classNames('flex items-center justify-center w-8 h-8 rounded-md text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary cursor-pointer',
+                  open && 'bg-state-accent-active text-text-accent',
+                  nodesReadOnly && 'cursor-not-allowed text-text-disabled hover:bg-transparent hover:text-text-disabled',
+                )}
+              onClick={() => {
+                if (nodesReadOnly)
+                  return
+                setCurrentLogItem()
+                setShowMessageLogModal(false)
+              }}
+            >
+              <RiHistoryLine className='h-4 w-4' />
+            </div>
+          </TipPopup>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[12]'>
+          <div
+            className='ml-2 flex min-w-[240px] max-w-[360px] flex-col overflow-y-auto rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-xl backdrop-blur-[5px]'
+          >
+            <div className='sticky top-0 flex items-center justify-between px-4 pt-3'>
+              <div className='system-mg-regular grow text-text-secondary'>{t('workflow.changeHistory.title')}</div>
+              <div
+                className='flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center'
+                onClick={() => {
+                  setCurrentLogItem()
+                  setShowMessageLogModal(false)
+                  setOpen(false)
+                }}
+              >
+                <RiCloseLine className='h-4 w-4 text-text-secondary' />
+              </div>
+            </div>
+            {
+              (
+                <div
+                  className='overflow-y-auto p-2'
+                  style={{
+                    maxHeight: 'calc(1 / 2 * 100vh)',
+                  }}
+                >
+                  {
+                    !calculateChangeList.statesCount && (
+                      <div className='py-12'>
+                        <RiHistoryLine className='mx-auto mb-2 h-8 w-8 text-text-tertiary' />
+                        <div className='text-center text-[13px] text-text-tertiary'>
+                          {t('workflow.changeHistory.placeholder')}
+                        </div>
+                      </div>
+                    )
+                  }
+                  <div className='flex flex-col'>
+                    {
+                      calculateChangeList.futureStates.map((item: ChangeHistoryEntry) => (
+                        <div
+                          key={item?.index}
+                          className={cn(
+                            'mb-0.5 flex cursor-pointer rounded-lg px-2 py-[7px] text-text-secondary hover:bg-state-base-hover',
+                            item?.index === currentHistoryStateIndex && 'bg-state-base-hover',
+                          )}
+                          onClick={() => {
+                            handleSetState(item)
+                            setOpen(false)
+                          }}
+                        >
+                          <div>
+                            <div
+                              className={cn(
+                                'flex items-center text-[13px] font-medium leading-[18px] text-text-secondary',
+                              )}
+                            >
+                              {item?.label || t('workflow.changeHistory.sessionStart')} ({calculateStepLabel(item?.index)}{item?.index === currentHistoryStateIndex && t('workflow.changeHistory.currentState')})
+                            </div>
+                          </div>
+                        </div>
+                      ))
+                    }
+                    {
+                      calculateChangeList.pastStates.map((item: ChangeHistoryEntry) => (
+                        <div
+                          key={item?.index}
+                          className={cn(
+                            'mb-0.5 flex cursor-pointer rounded-lg px-2 py-[7px] hover:bg-state-base-hover',
+                            item?.index === calculateChangeList.statesCount - 1 && 'bg-state-base-hover',
+                          )}
+                          onClick={() => {
+                            handleSetState(item)
+                            setOpen(false)
+                          }}
+                        >
+                          <div>
+                            <div
+                              className={cn(
+                                'flex items-center text-[13px] font-medium leading-[18px] text-text-secondary',
+                              )}
+                            >
+                              {item?.label || t('workflow.changeHistory.sessionStart')} ({calculateStepLabel(item?.index)})
+                            </div>
+                          </div>
+                        </div>
+                      ))
+                    }
+                  </div>
+                </div>
+              )
+            }
+            {
+              !!calculateChangeList.statesCount && (
+                <div className='px-0.5'>
+                  <Divider className='m-0' />
+                  <div
+                    className={cn(
+                      'my-0.5 flex cursor-pointer rounded-lg px-2 py-[7px] text-text-secondary',
+                      'hover:bg-state-base-hover',
+                    )}
+                    onClick={() => {
+                      handleClearHistory()
+                      setOpen(false)
+                    }}
+                  >
+                    <div>
+                      <div
+                        className={cn(
+                          'flex items-center text-[13px] font-medium leading-[18px]',
+                        )}
+                      >
+                        {t('workflow.changeHistory.clearHistory')}
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              )
+            }
+            <div className="w-[240px] px-3 py-2 text-xs text-text-tertiary" >
+              <div className="mb-1 flex h-[22px] items-center font-medium uppercase">{t('workflow.changeHistory.hint')}</div>
+              <div className="mb-1 leading-[18px] text-text-tertiary">{t('workflow.changeHistory.hintText')}</div>
+            </div>
+          </div>
+        </PortalToFollowElemContent>
+      </PortalToFollowElem>
+    )
+  )
+}
+
+export default memo(ViewWorkflowHistory)
diff --git a/app/components/workflow/help-line/index.tsx b/app/components/workflow/help-line/index.tsx
new file mode 100644
index 0000000..935b0dc
--- /dev/null
+++ b/app/components/workflow/help-line/index.tsx
@@ -0,0 +1,72 @@
+import { memo } from 'react'
+import { useViewport } from 'reactflow'
+import { useStore } from '../store'
+import type {
+  HelpLineHorizontalPosition,
+  HelpLineVerticalPosition,
+} from './types'
+
+const HelpLineHorizontal = memo(({
+  top,
+  left,
+  width,
+}: HelpLineHorizontalPosition) => {
+  const { x, y, zoom } = useViewport()
+
+  return (
+    <div
+      className='absolute z-[9] h-[1px] bg-primary-300'
+      style={{
+        top: top * zoom + y,
+        left: left * zoom + x,
+        width: width * zoom,
+      }}
+    />
+  )
+})
+HelpLineHorizontal.displayName = 'HelpLineBase'
+
+const HelpLineVertical = memo(({
+  top,
+  left,
+  height,
+}: HelpLineVerticalPosition) => {
+  const { x, y, zoom } = useViewport()
+
+  return (
+    <div
+      className='absolute z-[9] w-[1px] bg-primary-300'
+      style={{
+        top: top * zoom + y,
+        left: left * zoom + x,
+        height: height * zoom,
+      }}
+    />
+  )
+})
+HelpLineVertical.displayName = 'HelpLineVertical'
+
+const HelpLine = () => {
+  const helpLineHorizontal = useStore(s => s.helpLineHorizontal)
+  const helpLineVertical = useStore(s => s.helpLineVertical)
+
+  if (!helpLineHorizontal && !helpLineVertical)
+    return null
+
+  return (
+    <>
+      {
+        helpLineHorizontal && (
+          <HelpLineHorizontal {...helpLineHorizontal} />
+        )
+      }
+      {
+        helpLineVertical && (
+          <HelpLineVertical {...helpLineVertical} />
+        )
+      }
+    </>
+  )
+}
+
+export default memo(HelpLine)
diff --git a/app/components/workflow/help-line/types.ts b/app/components/workflow/help-line/types.ts
new file mode 100644
index 0000000..0e8253d
--- /dev/null
+++ b/app/components/workflow/help-line/types.ts
@@ -0,0 +1,11 @@
+export type HelpLineHorizontalPosition = {
+  top: number
+  left: number
+  width: number
+}
+
+export type HelpLineVerticalPosition = {
+  top: number
+  left: number
+  height: number
+}
diff --git a/app/components/workflow/hooks-store/index.ts b/app/components/workflow/hooks-store/index.ts
new file mode 100644
index 0000000..40b4132
--- /dev/null
+++ b/app/components/workflow/hooks-store/index.ts
@@ -0,0 +1,2 @@
+export * from './provider'
+export * from './store'
diff --git a/app/components/workflow/hooks-store/provider.tsx b/app/components/workflow/hooks-store/provider.tsx
new file mode 100644
index 0000000..c1090ae
--- /dev/null
+++ b/app/components/workflow/hooks-store/provider.tsx
@@ -0,0 +1,36 @@
+import {
+  createContext,
+  useEffect,
+  useRef,
+} from 'react'
+import { useStore } from 'reactflow'
+import {
+  createHooksStore,
+} from './store'
+import type { Shape } from './store'
+
+type HooksStore = ReturnType<typeof createHooksStore>
+export const HooksStoreContext = createContext<HooksStore | null | undefined>(null)
+type HooksStoreContextProviderProps = Partial<Shape> & {
+  children: React.ReactNode
+}
+export const HooksStoreContextProvider = ({ children, ...restProps }: HooksStoreContextProviderProps) => {
+  const storeRef = useRef<HooksStore | undefined>(undefined)
+  const d3Selection = useStore(s => s.d3Selection)
+  const d3Zoom = useStore(s => s.d3Zoom)
+
+  useEffect(() => {
+    if (storeRef.current && d3Selection && d3Zoom)
+      storeRef.current.getState().refreshAll(restProps)
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [d3Selection, d3Zoom])
+
+  if (!storeRef.current)
+    storeRef.current = createHooksStore(restProps)
+
+  return (
+    <HooksStoreContext.Provider value={storeRef.current}>
+      {children}
+    </HooksStoreContext.Provider>
+  )
+}
diff --git a/app/components/workflow/hooks-store/store.ts b/app/components/workflow/hooks-store/store.ts
new file mode 100644
index 0000000..9f5e1a6
--- /dev/null
+++ b/app/components/workflow/hooks-store/store.ts
@@ -0,0 +1,75 @@
+import { useContext } from 'react'
+import {
+  noop,
+} from 'lodash-es'
+import {
+  useStore as useZustandStore,
+} from 'zustand'
+import { createStore } from 'zustand/vanilla'
+import { HooksStoreContext } from './provider'
+
+type CommonHooksFnMap = {
+  doSyncWorkflowDraft: (
+    notRefreshWhenSyncError?: boolean,
+    callback?: {
+      onSuccess?: () => void
+      onError?: () => void
+      onSettled?: () => void
+    }
+  ) => Promise<void>
+  syncWorkflowDraftWhenPageClose: () => void
+  handleRefreshWorkflowDraft: () => void
+  handleBackupDraft: () => void
+  handleLoadBackupDraft: () => void
+  handleRestoreFromPublishedWorkflow: (...args: any[]) => void
+  handleRun: (...args: any[]) => void
+  handleStopRun: (...args: any[]) => void
+  handleStartWorkflowRun: () => void
+  handleWorkflowStartRunInWorkflow: () => void
+  handleWorkflowStartRunInChatflow: () => void
+}
+
+export type Shape = {
+  refreshAll: (props: Partial<CommonHooksFnMap>) => void
+} & CommonHooksFnMap
+
+export const createHooksStore = ({
+  doSyncWorkflowDraft = async () => noop(),
+  syncWorkflowDraftWhenPageClose = noop,
+  handleRefreshWorkflowDraft = noop,
+  handleBackupDraft = noop,
+  handleLoadBackupDraft = noop,
+  handleRestoreFromPublishedWorkflow = noop,
+  handleRun = noop,
+  handleStopRun = noop,
+  handleStartWorkflowRun = noop,
+  handleWorkflowStartRunInWorkflow = noop,
+  handleWorkflowStartRunInChatflow = noop,
+}: Partial<Shape>) => {
+  return createStore<Shape>(set => ({
+    refreshAll: props => set(state => ({ ...state, ...props })),
+    doSyncWorkflowDraft,
+    syncWorkflowDraftWhenPageClose,
+    handleRefreshWorkflowDraft,
+    handleBackupDraft,
+    handleLoadBackupDraft,
+    handleRestoreFromPublishedWorkflow,
+    handleRun,
+    handleStopRun,
+    handleStartWorkflowRun,
+    handleWorkflowStartRunInWorkflow,
+    handleWorkflowStartRunInChatflow,
+  }))
+}
+
+export function useHooksStore<T>(selector: (state: Shape) => T): T {
+  const store = useContext(HooksStoreContext)
+  if (!store)
+    throw new Error('Missing HooksStoreContext.Provider in the tree')
+
+  return useZustandStore(store, selector)
+}
+
+export const useHooksStoreApi = () => {
+  return useContext(HooksStoreContext)!
+}
diff --git a/app/components/workflow/hooks/index.ts b/app/components/workflow/hooks/index.ts
new file mode 100644
index 0000000..fda0f50
--- /dev/null
+++ b/app/components/workflow/hooks/index.ts
@@ -0,0 +1,19 @@
+export * from './use-edges-interactions'
+export * from './use-node-data-update'
+export * from './use-nodes-interactions'
+export * from './use-nodes-data'
+export * from './use-nodes-sync-draft'
+export * from './use-workflow'
+export * from './use-workflow-run'
+export * from './use-checklist'
+export * from './use-selection-interactions'
+export * from './use-panel-interactions'
+export * from './use-workflow-start-run'
+export * from './use-nodes-layout'
+export * from './use-workflow-history'
+export * from './use-workflow-variables'
+export * from './use-shortcuts'
+export * from './use-workflow-interactions'
+export * from './use-workflow-mode'
+export * from './use-format-time-from-now'
+export * from './use-workflow-refresh-draft'
diff --git a/app/components/workflow/hooks/use-checklist.ts b/app/components/workflow/hooks/use-checklist.ts
new file mode 100644
index 0000000..c1b0189
--- /dev/null
+++ b/app/components/workflow/hooks/use-checklist.ts
@@ -0,0 +1,260 @@
+import {
+  useCallback,
+  useMemo,
+  useRef,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { useStoreApi } from 'reactflow'
+import type {
+  CommonNodeType,
+  Edge,
+  Node,
+} from '../types'
+import { BlockEnum } from '../types'
+import { useStore } from '../store'
+import {
+  getToolCheckParams,
+  getValidTreeNodes,
+} from '../utils'
+import {
+  CUSTOM_NODE,
+  MAX_TREE_DEPTH,
+} from '../constants'
+import type { ToolNodeType } from '../nodes/tool/types'
+import { useIsChatMode } from './use-workflow'
+import { useNodesExtraData } from './use-nodes-data'
+import { useToastContext } from '@/app/components/base/toast'
+import { CollectionType } from '@/app/components/tools/types'
+import { useGetLanguage } from '@/context/i18n'
+import type { AgentNodeType } from '../nodes/agent/types'
+import { useStrategyProviders } from '@/service/use-strategy'
+import { canFindTool } from '@/utils'
+import { useDatasetsDetailStore } from '../datasets-detail-store/store'
+import type { KnowledgeRetrievalNodeType } from '../nodes/knowledge-retrieval/types'
+import type { DataSet } from '@/models/datasets'
+import { fetchDatasets } from '@/service/datasets'
+
+export const useChecklist = (nodes: Node[], edges: Edge[]) => {
+  const { t } = useTranslation()
+  const language = useGetLanguage()
+  const nodesExtraData = useNodesExtraData()
+  const isChatMode = useIsChatMode()
+  const buildInTools = useStore(s => s.buildInTools)
+  const customTools = useStore(s => s.customTools)
+  const workflowTools = useStore(s => s.workflowTools)
+  const { data: strategyProviders } = useStrategyProviders()
+  const datasetsDetail = useDatasetsDetailStore(s => s.datasetsDetail)
+
+  const getCheckData = useCallback((data: CommonNodeType<{}>) => {
+    let checkData = data
+    if (data.type === BlockEnum.KnowledgeRetrieval) {
+      const datasetIds = (data as CommonNodeType<KnowledgeRetrievalNodeType>).dataset_ids
+      const _datasets = datasetIds.reduce<DataSet[]>((acc, id) => {
+        if (datasetsDetail[id])
+          acc.push(datasetsDetail[id])
+        return acc
+      }, [])
+      checkData = {
+        ...data,
+        _datasets,
+      } as CommonNodeType<KnowledgeRetrievalNodeType>
+    }
+    return checkData
+  }, [datasetsDetail])
+
+  const needWarningNodes = useMemo(() => {
+    const list = []
+    const { validNodes } = getValidTreeNodes(nodes.filter(node => node.type === CUSTOM_NODE), edges)
+
+    for (let i = 0; i < nodes.length; i++) {
+      const node = nodes[i]
+      let toolIcon
+      let moreDataForCheckValid
+
+      if (node.data.type === BlockEnum.Tool) {
+        const { provider_type } = node.data
+
+        moreDataForCheckValid = getToolCheckParams(node.data as ToolNodeType, buildInTools, customTools, workflowTools, language)
+        if (provider_type === CollectionType.builtIn)
+          toolIcon = buildInTools.find(tool => canFindTool(tool.id, node.data.provider_id || ''))?.icon
+
+        if (provider_type === CollectionType.custom)
+          toolIcon = customTools.find(tool => tool.id === node.data.provider_id)?.icon
+
+        if (provider_type === CollectionType.workflow)
+          toolIcon = workflowTools.find(tool => tool.id === node.data.provider_id)?.icon
+      }
+
+      if (node.data.type === BlockEnum.Agent) {
+        const data = node.data as AgentNodeType
+        const isReadyForCheckValid = !!strategyProviders
+        const provider = strategyProviders?.find(provider => provider.declaration.identity.name === data.agent_strategy_provider_name)
+        const strategy = provider?.declaration.strategies?.find(s => s.identity.name === data.agent_strategy_name)
+        moreDataForCheckValid = {
+          provider,
+          strategy,
+          language,
+          isReadyForCheckValid,
+        }
+      }
+
+      if (node.type === CUSTOM_NODE) {
+        const checkData = getCheckData(node.data)
+        const { errorMessage } = nodesExtraData[node.data.type].checkValid(checkData, t, moreDataForCheckValid)
+
+        if (errorMessage || !validNodes.find(n => n.id === node.id)) {
+          list.push({
+            id: node.id,
+            type: node.data.type,
+            title: node.data.title,
+            toolIcon,
+            unConnected: !validNodes.find(n => n.id === node.id),
+            errorMessage,
+          })
+        }
+      }
+    }
+
+    if (isChatMode && !nodes.find(node => node.data.type === BlockEnum.Answer)) {
+      list.push({
+        id: 'answer-need-added',
+        type: BlockEnum.Answer,
+        title: t('workflow.blocks.answer'),
+        errorMessage: t('workflow.common.needAnswerNode'),
+      })
+    }
+
+    if (!isChatMode && !nodes.find(node => node.data.type === BlockEnum.End)) {
+      list.push({
+        id: 'end-need-added',
+        type: BlockEnum.End,
+        title: t('workflow.blocks.end'),
+        errorMessage: t('workflow.common.needEndNode'),
+      })
+    }
+
+    return list
+  }, [nodes, edges, isChatMode, buildInTools, customTools, workflowTools, language, nodesExtraData, t, strategyProviders, getCheckData])
+
+  return needWarningNodes
+}
+
+export const useChecklistBeforePublish = () => {
+  const { t } = useTranslation()
+  const language = useGetLanguage()
+  const buildInTools = useStore(s => s.buildInTools)
+  const customTools = useStore(s => s.customTools)
+  const workflowTools = useStore(s => s.workflowTools)
+  const { notify } = useToastContext()
+  const isChatMode = useIsChatMode()
+  const store = useStoreApi()
+  const nodesExtraData = useNodesExtraData()
+  const { data: strategyProviders } = useStrategyProviders()
+  const updateDatasetsDetail = useDatasetsDetailStore(s => s.updateDatasetsDetail)
+  const updateTime = useRef(0)
+
+  const getCheckData = useCallback((data: CommonNodeType<{}>, datasets: DataSet[]) => {
+    let checkData = data
+    if (data.type === BlockEnum.KnowledgeRetrieval) {
+      const datasetIds = (data as CommonNodeType<KnowledgeRetrievalNodeType>).dataset_ids
+      const datasetsDetail = datasets.reduce<Record<string, DataSet>>((acc, dataset) => {
+        acc[dataset.id] = dataset
+        return acc
+      }, {})
+      const _datasets = datasetIds.reduce<DataSet[]>((acc, id) => {
+        if (datasetsDetail[id])
+          acc.push(datasetsDetail[id])
+        return acc
+      }, [])
+      checkData = {
+        ...data,
+        _datasets,
+      } as CommonNodeType<KnowledgeRetrievalNodeType>
+    }
+    return checkData
+  }, [])
+
+  const handleCheckBeforePublish = useCallback(async () => {
+    const {
+      getNodes,
+      edges,
+    } = store.getState()
+    const nodes = getNodes().filter(node => node.type === CUSTOM_NODE)
+    const {
+      validNodes,
+      maxDepth,
+    } = getValidTreeNodes(nodes.filter(node => node.type === CUSTOM_NODE), edges)
+
+    if (maxDepth > MAX_TREE_DEPTH) {
+      notify({ type: 'error', message: t('workflow.common.maxTreeDepth', { depth: MAX_TREE_DEPTH }) })
+      return false
+    }
+    // Before publish, we need to fetch datasets detail, in case of the settings of datasets have been changed
+    const knowledgeRetrievalNodes = nodes.filter(node => node.data.type === BlockEnum.KnowledgeRetrieval)
+    const allDatasetIds = knowledgeRetrievalNodes.reduce<string[]>((acc, node) => {
+      return Array.from(new Set([...acc, ...(node.data as CommonNodeType<KnowledgeRetrievalNodeType>).dataset_ids]))
+    }, [])
+    let datasets: DataSet[] = []
+    if (allDatasetIds.length > 0) {
+      updateTime.current = updateTime.current + 1
+      const currUpdateTime = updateTime.current
+      const { data: datasetsDetail } = await fetchDatasets({ url: '/datasets', params: { page: 1, ids: allDatasetIds } })
+      if (datasetsDetail && datasetsDetail.length > 0) {
+        // avoid old data to overwrite the new data
+        if (currUpdateTime < updateTime.current)
+          return false
+        datasets = datasetsDetail
+        updateDatasetsDetail(datasetsDetail)
+      }
+    }
+
+    for (let i = 0; i < nodes.length; i++) {
+      const node = nodes[i]
+      let moreDataForCheckValid
+      if (node.data.type === BlockEnum.Tool)
+        moreDataForCheckValid = getToolCheckParams(node.data as ToolNodeType, buildInTools, customTools, workflowTools, language)
+
+      if (node.data.type === BlockEnum.Agent) {
+        const data = node.data as AgentNodeType
+        const isReadyForCheckValid = !!strategyProviders
+        const provider = strategyProviders?.find(provider => provider.declaration.identity.name === data.agent_strategy_provider_name)
+        const strategy = provider?.declaration.strategies?.find(s => s.identity.name === data.agent_strategy_name)
+        moreDataForCheckValid = {
+          provider,
+          strategy,
+          language,
+          isReadyForCheckValid,
+        }
+      }
+
+      const checkData = getCheckData(node.data, datasets)
+      const { errorMessage } = nodesExtraData[node.data.type as BlockEnum].checkValid(checkData, t, moreDataForCheckValid)
+
+      if (errorMessage) {
+        notify({ type: 'error', message: `[${node.data.title}] ${errorMessage}` })
+        return false
+      }
+
+      if (!validNodes.find(n => n.id === node.id)) {
+        notify({ type: 'error', message: `[${node.data.title}] ${t('workflow.common.needConnectTip')}` })
+        return false
+      }
+    }
+
+    if (isChatMode && !nodes.find(node => node.data.type === BlockEnum.Answer)) {
+      notify({ type: 'error', message: t('workflow.common.needAnswerNode') })
+      return false
+    }
+
+    if (!isChatMode && !nodes.find(node => node.data.type === BlockEnum.End)) {
+      notify({ type: 'error', message: t('workflow.common.needEndNode') })
+      return false
+    }
+
+    return true
+  }, [store, isChatMode, notify, t, buildInTools, customTools, workflowTools, language, nodesExtraData, strategyProviders, updateDatasetsDetail, getCheckData])
+
+  return {
+    handleCheckBeforePublish,
+  }
+}
diff --git a/app/components/workflow/hooks/use-config-vision.ts b/app/components/workflow/hooks/use-config-vision.ts
new file mode 100644
index 0000000..a3cddbc
--- /dev/null
+++ b/app/components/workflow/hooks/use-config-vision.ts
@@ -0,0 +1,88 @@
+import produce from 'immer'
+import { useCallback } from 'react'
+import { useIsChatMode } from './use-workflow'
+import type { ModelConfig, VisionSetting } from '@/app/components/workflow/types'
+import { useTextGenerationCurrentProviderAndModelAndModelList } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import {
+  ModelFeatureEnum,
+} from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { Resolution } from '@/types/app'
+
+type Payload = {
+  enabled: boolean
+  configs?: VisionSetting
+}
+
+type Params = {
+  payload: Payload
+  onChange: (payload: Payload) => void
+}
+const useConfigVision = (model: ModelConfig, {
+  payload = {
+    enabled: false,
+  },
+  onChange,
+}: Params) => {
+  const {
+    currentModel: currModel,
+  } = useTextGenerationCurrentProviderAndModelAndModelList(
+    {
+      provider: model.provider,
+      model: model.name,
+    },
+  )
+
+  const isChatMode = useIsChatMode()
+
+  const getIsVisionModel = useCallback(() => {
+    return !!currModel?.features?.includes(ModelFeatureEnum.vision)
+  }, [currModel])
+
+  const isVisionModel = getIsVisionModel()
+
+  const handleVisionResolutionEnabledChange = useCallback((enabled: boolean) => {
+    const newPayload = produce(payload, (draft) => {
+      draft.enabled = enabled
+      if (enabled && isChatMode) {
+        draft.configs = {
+          detail: Resolution.high,
+          variable_selector: ['sys', 'files'],
+        }
+      }
+    })
+    onChange(newPayload)
+  }, [isChatMode, onChange, payload])
+
+  const handleVisionResolutionChange = useCallback((config: VisionSetting) => {
+    const newPayload = produce(payload, (draft) => {
+      draft.configs = config
+    })
+    onChange(newPayload)
+  }, [onChange, payload])
+
+  const handleModelChanged = useCallback(() => {
+    const isVisionModel = getIsVisionModel()
+    if (!isVisionModel) {
+      handleVisionResolutionEnabledChange(false)
+      return
+    }
+    if (payload.enabled) {
+      onChange({
+        enabled: true,
+        configs: {
+          detail: Resolution.high,
+          variable_selector: [],
+        },
+      })
+    }
+  }, [getIsVisionModel, handleVisionResolutionEnabledChange, onChange, payload.enabled])
+
+  return {
+    isVisionModel,
+    handleVisionResolutionEnabledChange,
+    handleVisionResolutionChange,
+    handleModelChanged,
+  }
+}
+
+export default useConfigVision
diff --git a/app/components/workflow/hooks/use-edges-interactions-without-sync.ts b/app/components/workflow/hooks/use-edges-interactions-without-sync.ts
new file mode 100644
index 0000000..c4c709c
--- /dev/null
+++ b/app/components/workflow/hooks/use-edges-interactions-without-sync.ts
@@ -0,0 +1,27 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import { useStoreApi } from 'reactflow'
+
+export const useEdgesInteractionsWithoutSync = () => {
+  const store = useStoreApi()
+
+  const handleEdgeCancelRunningStatus = useCallback(() => {
+    const {
+      edges,
+      setEdges,
+    } = store.getState()
+
+    const newEdges = produce(edges, (draft) => {
+      draft.forEach((edge) => {
+        edge.data._sourceRunningStatus = undefined
+        edge.data._targetRunningStatus = undefined
+        edge.data._waitingRun = false
+      })
+    })
+    setEdges(newEdges)
+  }, [store])
+
+  return {
+    handleEdgeCancelRunningStatus,
+  }
+}
diff --git a/app/components/workflow/hooks/use-edges-interactions.ts b/app/components/workflow/hooks/use-edges-interactions.ts
new file mode 100644
index 0000000..306af1e
--- /dev/null
+++ b/app/components/workflow/hooks/use-edges-interactions.ts
@@ -0,0 +1,161 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import type {
+  EdgeMouseHandler,
+  OnEdgesChange,
+} from 'reactflow'
+import {
+  useStoreApi,
+} from 'reactflow'
+import type {
+  Node,
+} from '../types'
+import { getNodesConnectedSourceOrTargetHandleIdsMap } from '../utils'
+import { useNodesSyncDraft } from './use-nodes-sync-draft'
+import { useNodesReadOnly } from './use-workflow'
+import { WorkflowHistoryEvent, useWorkflowHistory } from './use-workflow-history'
+
+export const useEdgesInteractions = () => {
+  const store = useStoreApi()
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+  const { getNodesReadOnly } = useNodesReadOnly()
+  const { saveStateToHistory } = useWorkflowHistory()
+
+  const handleEdgeEnter = useCallback<EdgeMouseHandler>((_, edge) => {
+    if (getNodesReadOnly())
+      return
+
+    const {
+      edges,
+      setEdges,
+    } = store.getState()
+    const newEdges = produce(edges, (draft) => {
+      const currentEdge = draft.find(e => e.id === edge.id)!
+
+      currentEdge.data._hovering = true
+    })
+    setEdges(newEdges)
+  }, [store, getNodesReadOnly])
+
+  const handleEdgeLeave = useCallback<EdgeMouseHandler>((_, edge) => {
+    if (getNodesReadOnly())
+      return
+
+    const {
+      edges,
+      setEdges,
+    } = store.getState()
+    const newEdges = produce(edges, (draft) => {
+      const currentEdge = draft.find(e => e.id === edge.id)!
+
+      currentEdge.data._hovering = false
+    })
+    setEdges(newEdges)
+  }, [store, getNodesReadOnly])
+
+  const handleEdgeDeleteByDeleteBranch = useCallback((nodeId: string, branchId: string) => {
+    if (getNodesReadOnly())
+      return
+
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+    const edgeWillBeDeleted = edges.filter(edge => edge.source === nodeId && edge.sourceHandle === branchId)
+
+    if (!edgeWillBeDeleted.length)
+      return
+
+    const nodes = getNodes()
+    const nodesConnectedSourceOrTargetHandleIdsMap = getNodesConnectedSourceOrTargetHandleIdsMap(
+      edgeWillBeDeleted.map(edge => ({ type: 'remove', edge })),
+      nodes,
+    )
+    const newNodes = produce(nodes, (draft: Node[]) => {
+      draft.forEach((node) => {
+        if (nodesConnectedSourceOrTargetHandleIdsMap[node.id]) {
+          node.data = {
+            ...node.data,
+            ...nodesConnectedSourceOrTargetHandleIdsMap[node.id],
+          }
+        }
+      })
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      return draft.filter(edge => !edgeWillBeDeleted.find(e => e.id === edge.id))
+    })
+    setEdges(newEdges)
+    handleSyncWorkflowDraft()
+    saveStateToHistory(WorkflowHistoryEvent.EdgeDeleteByDeleteBranch)
+  }, [getNodesReadOnly, store, handleSyncWorkflowDraft, saveStateToHistory])
+
+  const handleEdgeDelete = useCallback(() => {
+    if (getNodesReadOnly())
+      return
+
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+    const currentEdgeIndex = edges.findIndex(edge => edge.selected)
+
+    if (currentEdgeIndex < 0)
+      return
+    const currentEdge = edges[currentEdgeIndex]
+    const nodes = getNodes()
+    const nodesConnectedSourceOrTargetHandleIdsMap = getNodesConnectedSourceOrTargetHandleIdsMap(
+      [
+        { type: 'remove', edge: currentEdge },
+      ],
+      nodes,
+    )
+    const newNodes = produce(nodes, (draft: Node[]) => {
+      draft.forEach((node) => {
+        if (nodesConnectedSourceOrTargetHandleIdsMap[node.id]) {
+          node.data = {
+            ...node.data,
+            ...nodesConnectedSourceOrTargetHandleIdsMap[node.id],
+          }
+        }
+      })
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      draft.splice(currentEdgeIndex, 1)
+    })
+    setEdges(newEdges)
+    handleSyncWorkflowDraft()
+    saveStateToHistory(WorkflowHistoryEvent.EdgeDelete)
+  }, [getNodesReadOnly, store, handleSyncWorkflowDraft, saveStateToHistory])
+
+  const handleEdgesChange = useCallback<OnEdgesChange>((changes) => {
+    if (getNodesReadOnly())
+      return
+
+    const {
+      edges,
+      setEdges,
+    } = store.getState()
+
+    const newEdges = produce(edges, (draft) => {
+      changes.forEach((change) => {
+        if (change.type === 'select')
+          draft.find(edge => edge.id === change.id)!.selected = change.selected
+      })
+    })
+    setEdges(newEdges)
+  }, [store, getNodesReadOnly])
+
+  return {
+    handleEdgeEnter,
+    handleEdgeLeave,
+    handleEdgeDeleteByDeleteBranch,
+    handleEdgeDelete,
+    handleEdgesChange,
+  }
+}
diff --git a/app/components/workflow/hooks/use-format-time-from-now.ts b/app/components/workflow/hooks/use-format-time-from-now.ts
new file mode 100644
index 0000000..b2b5215
--- /dev/null
+++ b/app/components/workflow/hooks/use-format-time-from-now.ts
@@ -0,0 +1,12 @@
+import dayjs from 'dayjs'
+import { useCallback } from 'react'
+import { useI18N } from '@/context/i18n'
+
+export const useFormatTimeFromNow = () => {
+  const { locale } = useI18N()
+  const formatTimeFromNow = useCallback((time: number) => {
+    return dayjs(time).locale(locale === 'zh-Hans' ? 'zh-cn' : locale).fromNow()
+  }, [locale])
+
+  return { formatTimeFromNow }
+}
diff --git a/app/components/workflow/hooks/use-helpline.ts b/app/components/workflow/hooks/use-helpline.ts
new file mode 100644
index 0000000..2eed71a
--- /dev/null
+++ b/app/components/workflow/hooks/use-helpline.ts
@@ -0,0 +1,127 @@
+import { useCallback } from 'react'
+import { useStoreApi } from 'reactflow'
+import type { Node } from '../types'
+import { useWorkflowStore } from '../store'
+
+export const useHelpline = () => {
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+
+  const handleSetHelpline = useCallback((node: Node) => {
+    const { getNodes } = store.getState()
+    const nodes = getNodes()
+    const {
+      setHelpLineHorizontal,
+      setHelpLineVertical,
+    } = workflowStore.getState()
+
+    if (node.data.isInIteration) {
+      return {
+        showHorizontalHelpLineNodes: [],
+        showVerticalHelpLineNodes: [],
+      }
+    }
+
+    if (node.data.isInLoop) {
+      return {
+        showHorizontalHelpLineNodes: [],
+        showVerticalHelpLineNodes: [],
+      }
+    }
+
+    const showHorizontalHelpLineNodes = nodes.filter((n) => {
+      if (n.id === node.id)
+        return false
+
+      if (n.data.isInIteration)
+        return false
+
+      if (n.data.isInLoop)
+        return false
+
+      const nY = Math.ceil(n.position.y)
+      const nodeY = Math.ceil(node.position.y)
+
+      if (nY - nodeY < 5 && nY - nodeY > -5)
+        return true
+
+      return false
+    }).sort((a, b) => a.position.x - b.position.x)
+
+    const showHorizontalHelpLineNodesLength = showHorizontalHelpLineNodes.length
+    if (showHorizontalHelpLineNodesLength > 0) {
+      const first = showHorizontalHelpLineNodes[0]
+      const last = showHorizontalHelpLineNodes[showHorizontalHelpLineNodesLength - 1]
+
+      const helpLine = {
+        top: first.position.y,
+        left: first.position.x,
+        width: last.position.x + last.width! - first.position.x,
+      }
+
+      if (node.position.x < first.position.x) {
+        helpLine.left = node.position.x
+        helpLine.width = first.position.x + first.width! - node.position.x
+      }
+
+      if (node.position.x > last.position.x)
+        helpLine.width = node.position.x + node.width! - first.position.x
+
+      setHelpLineHorizontal(helpLine)
+    }
+    else {
+      setHelpLineHorizontal()
+    }
+
+    const showVerticalHelpLineNodes = nodes.filter((n) => {
+      if (n.id === node.id)
+        return false
+      if (n.data.isInIteration)
+        return false
+      if (n.data.isInLoop)
+        return false
+
+      const nX = Math.ceil(n.position.x)
+      const nodeX = Math.ceil(node.position.x)
+
+      if (nX - nodeX < 5 && nX - nodeX > -5)
+        return true
+
+      return false
+    }).sort((a, b) => a.position.x - b.position.x)
+    const showVerticalHelpLineNodesLength = showVerticalHelpLineNodes.length
+
+    if (showVerticalHelpLineNodesLength > 0) {
+      const first = showVerticalHelpLineNodes[0]
+      const last = showVerticalHelpLineNodes[showVerticalHelpLineNodesLength - 1]
+
+      const helpLine = {
+        top: first.position.y,
+        left: first.position.x,
+        height: last.position.y + last.height! - first.position.y,
+      }
+
+      if (node.position.y < first.position.y) {
+        helpLine.top = node.position.y
+        helpLine.height = first.position.y + first.height! - node.position.y
+      }
+
+      if (node.position.y > last.position.y)
+        helpLine.height = node.position.y + node.height! - first.position.y
+
+      setHelpLineVertical(helpLine)
+    }
+    else {
+      setHelpLineVertical()
+    }
+
+    return {
+      showHorizontalHelpLineNodes,
+      showVerticalHelpLineNodes,
+    }
+  }, [store, workflowStore])
+
+  return {
+    handleSetHelpline,
+  }
+}
diff --git a/app/components/workflow/hooks/use-node-data-update.ts b/app/components/workflow/hooks/use-node-data-update.ts
new file mode 100644
index 0000000..c59c858
--- /dev/null
+++ b/app/components/workflow/hooks/use-node-data-update.ts
@@ -0,0 +1,43 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import { useStoreApi } from 'reactflow'
+import { useNodesSyncDraft } from './use-nodes-sync-draft'
+import { useNodesReadOnly } from './use-workflow'
+
+type NodeDataUpdatePayload = {
+  id: string
+  data: Record<string, any>
+}
+
+export const useNodeDataUpdate = () => {
+  const store = useStoreApi()
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+  const { getNodesReadOnly } = useNodesReadOnly()
+
+  const handleNodeDataUpdate = useCallback(({ id, data }: NodeDataUpdatePayload) => {
+    const {
+      getNodes,
+      setNodes,
+    } = store.getState()
+    const newNodes = produce(getNodes(), (draft) => {
+      const currentNode = draft.find(node => node.id === id)!
+
+      if (currentNode)
+        currentNode.data = { ...currentNode.data, ...data }
+    })
+    setNodes(newNodes)
+  }, [store])
+
+  const handleNodeDataUpdateWithSyncDraft = useCallback((payload: NodeDataUpdatePayload) => {
+    if (getNodesReadOnly())
+      return
+
+    handleNodeDataUpdate(payload)
+    handleSyncWorkflowDraft()
+  }, [handleSyncWorkflowDraft, handleNodeDataUpdate, getNodesReadOnly])
+
+  return {
+    handleNodeDataUpdate,
+    handleNodeDataUpdateWithSyncDraft,
+  }
+}
diff --git a/app/components/workflow/hooks/use-nodes-data.ts b/app/components/workflow/hooks/use-nodes-data.ts
new file mode 100644
index 0000000..aeb45dd
--- /dev/null
+++ b/app/components/workflow/hooks/use-nodes-data.ts
@@ -0,0 +1,77 @@
+import { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { BlockEnum } from '../types'
+import {
+  NODES_EXTRA_DATA,
+  NODES_INITIAL_DATA,
+} from '../constants'
+import { useIsChatMode } from './use-workflow'
+
+export const useNodesInitialData = () => {
+  const { t } = useTranslation()
+
+  return useMemo(() => produce(NODES_INITIAL_DATA, (draft) => {
+    Object.keys(draft).forEach((key) => {
+      draft[key as BlockEnum].title = t(`workflow.blocks.${key}`)
+    })
+  }), [t])
+}
+
+export const useNodesExtraData = () => {
+  const { t } = useTranslation()
+  const isChatMode = useIsChatMode()
+
+  return useMemo(() => produce(NODES_EXTRA_DATA, (draft) => {
+    Object.keys(draft).forEach((key) => {
+      draft[key as BlockEnum].about = t(`workflow.blocksAbout.${key}`)
+      draft[key as BlockEnum].availablePrevNodes = draft[key as BlockEnum].getAvailablePrevNodes(isChatMode)
+      draft[key as BlockEnum].availableNextNodes = draft[key as BlockEnum].getAvailableNextNodes(isChatMode)
+    })
+  }), [t, isChatMode])
+}
+
+export const useAvailableBlocks = (nodeType?: BlockEnum, isInIteration?: boolean, isInLoop?: boolean) => {
+  const nodesExtraData = useNodesExtraData()
+  const availablePrevBlocks = useMemo(() => {
+    if (!nodeType)
+      return []
+    return nodesExtraData[nodeType].availablePrevNodes || []
+  }, [nodeType, nodesExtraData])
+
+  const availableNextBlocks = useMemo(() => {
+    if (!nodeType)
+      return []
+
+    return nodesExtraData[nodeType].availableNextNodes || []
+  }, [nodeType, nodesExtraData])
+
+  return useMemo(() => {
+    return {
+      availablePrevBlocks: availablePrevBlocks.filter((nType) => {
+        if (isInIteration && (nType === BlockEnum.Iteration || nType === BlockEnum.Loop || nType === BlockEnum.End))
+          return false
+
+        if (isInLoop && (nType === BlockEnum.Iteration || nType === BlockEnum.Loop || nType === BlockEnum.End))
+          return false
+
+        if (!isInLoop && nType === BlockEnum.LoopEnd)
+          return false
+
+        return true
+      }),
+      availableNextBlocks: availableNextBlocks.filter((nType) => {
+        if (isInIteration && (nType === BlockEnum.Iteration || nType === BlockEnum.Loop || nType === BlockEnum.End))
+          return false
+
+        if (isInLoop && (nType === BlockEnum.Iteration || nType === BlockEnum.Loop || nType === BlockEnum.End))
+          return false
+
+        if (!isInLoop && nType === BlockEnum.LoopEnd)
+          return false
+
+        return true
+      }),
+    }
+  }, [isInIteration, availablePrevBlocks, availableNextBlocks, isInLoop])
+}
diff --git a/app/components/workflow/hooks/use-nodes-interactions-without-sync.ts b/app/components/workflow/hooks/use-nodes-interactions-without-sync.ts
new file mode 100644
index 0000000..7fbf0ce
--- /dev/null
+++ b/app/components/workflow/hooks/use-nodes-interactions-without-sync.ts
@@ -0,0 +1,27 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import { useStoreApi } from 'reactflow'
+
+export const useNodesInteractionsWithoutSync = () => {
+  const store = useStoreApi()
+
+  const handleNodeCancelRunningStatus = useCallback(() => {
+    const {
+      getNodes,
+      setNodes,
+    } = store.getState()
+
+    const nodes = getNodes()
+    const newNodes = produce(nodes, (draft) => {
+      draft.forEach((node) => {
+        node.data._runningStatus = undefined
+        node.data._waitingRun = false
+      })
+    })
+    setNodes(newNodes)
+  }, [store])
+
+  return {
+    handleNodeCancelRunningStatus,
+  }
+}
diff --git a/app/components/workflow/hooks/use-nodes-interactions.ts b/app/components/workflow/hooks/use-nodes-interactions.ts
new file mode 100644
index 0000000..94b10c9
--- /dev/null
+++ b/app/components/workflow/hooks/use-nodes-interactions.ts
@@ -0,0 +1,1552 @@
+import type { MouseEvent } from 'react'
+import { useCallback, useRef } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import type {
+  NodeDragHandler,
+  NodeMouseHandler,
+  OnConnect,
+  OnConnectEnd,
+  OnConnectStart,
+  ResizeParamsWithDirection,
+} from 'reactflow'
+import {
+  getConnectedEdges,
+  getOutgoers,
+  useReactFlow,
+  useStoreApi,
+} from 'reactflow'
+import { unionBy } from 'lodash-es'
+import type { ToolDefaultValue } from '../block-selector/types'
+import type {
+  Edge,
+  Node,
+  OnNodeAdd,
+} from '../types'
+import { BlockEnum } from '../types'
+import { useWorkflowStore } from '../store'
+import {
+  CUSTOM_EDGE,
+  ITERATION_CHILDREN_Z_INDEX,
+  ITERATION_PADDING,
+  LOOP_CHILDREN_Z_INDEX,
+  LOOP_PADDING,
+  NODES_INITIAL_DATA,
+  NODE_WIDTH_X_OFFSET,
+  X_OFFSET,
+  Y_OFFSET,
+} from '../constants'
+import {
+  genNewNodeTitleFromOld,
+  generateNewNode,
+  getNodeCustomTypeByNodeDataType,
+  getNodesConnectedSourceOrTargetHandleIdsMap,
+  getTopLeftNodePosition,
+} from '../utils'
+import { CUSTOM_NOTE_NODE } from '../note-node/constants'
+import type { IterationNodeType } from '../nodes/iteration/types'
+import type { LoopNodeType } from '../nodes/loop/types'
+import { CUSTOM_ITERATION_START_NODE } from '../nodes/iteration-start/constants'
+import { CUSTOM_LOOP_START_NODE } from '../nodes/loop-start/constants'
+import type { VariableAssignerNodeType } from '../nodes/variable-assigner/types'
+import { useNodeIterationInteractions } from '../nodes/iteration/use-interactions'
+import { useNodeLoopInteractions } from '../nodes/loop/use-interactions'
+import { useWorkflowHistoryStore } from '../workflow-history-store'
+import { useNodesSyncDraft } from './use-nodes-sync-draft'
+import { useHelpline } from './use-helpline'
+import {
+  useNodesReadOnly,
+  useWorkflow,
+  useWorkflowReadOnly,
+} from './use-workflow'
+import { WorkflowHistoryEvent, useWorkflowHistory } from './use-workflow-history'
+
+export const useNodesInteractions = () => {
+  const { t } = useTranslation()
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+  const reactflow = useReactFlow()
+  const { store: workflowHistoryStore } = useWorkflowHistoryStore()
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+  const {
+    checkNestedParallelLimit,
+    getAfterNodesInSameBranch,
+  } = useWorkflow()
+  const { getNodesReadOnly } = useNodesReadOnly()
+  const { getWorkflowReadOnly } = useWorkflowReadOnly()
+  const { handleSetHelpline } = useHelpline()
+  const {
+    handleNodeIterationChildDrag,
+    handleNodeIterationChildrenCopy,
+  } = useNodeIterationInteractions()
+  const {
+    handleNodeLoopChildDrag,
+    handleNodeLoopChildrenCopy,
+  } = useNodeLoopInteractions()
+  const dragNodeStartPosition = useRef({ x: 0, y: 0 } as { x: number; y: number })
+
+  const { saveStateToHistory, undo, redo } = useWorkflowHistory()
+
+  const handleNodeDragStart = useCallback<NodeDragHandler>((_, node) => {
+    workflowStore.setState({ nodeAnimation: false })
+
+    if (getNodesReadOnly())
+      return
+
+    if (node.type === CUSTOM_ITERATION_START_NODE || node.type === CUSTOM_NOTE_NODE)
+      return
+
+    if (node.type === CUSTOM_LOOP_START_NODE || node.type === CUSTOM_NOTE_NODE)
+      return
+
+    dragNodeStartPosition.current = { x: node.position.x, y: node.position.y }
+  }, [workflowStore, getNodesReadOnly])
+
+  const handleNodeDrag = useCallback<NodeDragHandler>((e, node: Node) => {
+    if (getNodesReadOnly())
+      return
+
+    if (node.type === CUSTOM_ITERATION_START_NODE)
+      return
+
+    if (node.type === CUSTOM_LOOP_START_NODE)
+      return
+
+    const {
+      getNodes,
+      setNodes,
+    } = store.getState()
+    e.stopPropagation()
+
+    const nodes = getNodes()
+
+    const { restrictPosition } = handleNodeIterationChildDrag(node)
+    const { restrictPosition: restrictLoopPosition } = handleNodeLoopChildDrag(node)
+
+    const {
+      showHorizontalHelpLineNodes,
+      showVerticalHelpLineNodes,
+    } = handleSetHelpline(node)
+    const showHorizontalHelpLineNodesLength = showHorizontalHelpLineNodes.length
+    const showVerticalHelpLineNodesLength = showVerticalHelpLineNodes.length
+
+    const newNodes = produce(nodes, (draft) => {
+      const currentNode = draft.find(n => n.id === node.id)!
+
+      if (showVerticalHelpLineNodesLength > 0)
+        currentNode.position.x = showVerticalHelpLineNodes[0].position.x
+      else if (restrictPosition.x !== undefined)
+        currentNode.position.x = restrictPosition.x
+      else if (restrictLoopPosition.x !== undefined)
+        currentNode.position.x = restrictLoopPosition.x
+      else
+        currentNode.position.x = node.position.x
+
+      if (showHorizontalHelpLineNodesLength > 0)
+        currentNode.position.y = showHorizontalHelpLineNodes[0].position.y
+      else if (restrictPosition.y !== undefined)
+        currentNode.position.y = restrictPosition.y
+      else if (restrictLoopPosition.y !== undefined)
+        currentNode.position.y = restrictLoopPosition.y
+      else
+        currentNode.position.y = node.position.y
+    })
+    setNodes(newNodes)
+  }, [getNodesReadOnly, store, handleNodeIterationChildDrag, handleNodeLoopChildDrag, handleSetHelpline])
+
+  const handleNodeDragStop = useCallback<NodeDragHandler>((_, node) => {
+    const {
+      setHelpLineHorizontal,
+      setHelpLineVertical,
+    } = workflowStore.getState()
+
+    if (getNodesReadOnly())
+      return
+
+    const { x, y } = dragNodeStartPosition.current
+    if (!(x === node.position.x && y === node.position.y)) {
+      setHelpLineHorizontal()
+      setHelpLineVertical()
+      handleSyncWorkflowDraft()
+
+      if (x !== 0 && y !== 0) {
+        // selecting a note will trigger a drag stop event with x and y as 0
+        saveStateToHistory(WorkflowHistoryEvent.NodeDragStop)
+      }
+    }
+  }, [workflowStore, getNodesReadOnly, saveStateToHistory, handleSyncWorkflowDraft])
+
+  const handleNodeEnter = useCallback<NodeMouseHandler>((_, node) => {
+    if (getNodesReadOnly())
+      return
+
+    if (node.type === CUSTOM_NOTE_NODE || node.type === CUSTOM_ITERATION_START_NODE)
+      return
+
+    if (node.type === CUSTOM_LOOP_START_NODE || node.type === CUSTOM_NOTE_NODE)
+      return
+
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+    const nodes = getNodes()
+    const {
+      connectingNodePayload,
+      setEnteringNodePayload,
+    } = workflowStore.getState()
+
+    if (connectingNodePayload) {
+      if (connectingNodePayload.nodeId === node.id)
+        return
+      const connectingNode: Node = nodes.find(n => n.id === connectingNodePayload.nodeId)!
+      const sameLevel = connectingNode.parentId === node.parentId
+
+      if (sameLevel) {
+        setEnteringNodePayload({
+          nodeId: node.id,
+          nodeData: node.data as VariableAssignerNodeType,
+        })
+        const fromType = connectingNodePayload.handleType
+
+        const newNodes = produce(nodes, (draft) => {
+          draft.forEach((n) => {
+            if (n.id === node.id && fromType === 'source' && (node.data.type === BlockEnum.VariableAssigner || node.data.type === BlockEnum.VariableAggregator)) {
+              if (!node.data.advanced_settings?.group_enabled)
+                n.data._isEntering = true
+            }
+            if (n.id === node.id && fromType === 'target' && (connectingNode.data.type === BlockEnum.VariableAssigner || connectingNode.data.type === BlockEnum.VariableAggregator) && node.data.type !== BlockEnum.IfElse && node.data.type !== BlockEnum.QuestionClassifier)
+              n.data._isEntering = true
+          })
+        })
+        setNodes(newNodes)
+      }
+    }
+    const newEdges = produce(edges, (draft) => {
+      const connectedEdges = getConnectedEdges([node], edges)
+
+      connectedEdges.forEach((edge) => {
+        const currentEdge = draft.find(e => e.id === edge.id)
+        if (currentEdge)
+          currentEdge.data._connectedNodeIsHovering = true
+      })
+    })
+    setEdges(newEdges)
+    const connectedEdges = getConnectedEdges([node], edges).filter(edge => edge.target === node.id)
+
+    const targetNodes: Node[] = []
+    for (let i = 0; i < connectedEdges.length; i++) {
+      const sourceConnectedEdges = getConnectedEdges([{ id: connectedEdges[i].source } as Node], edges).filter(edge => edge.source === connectedEdges[i].source && edge.sourceHandle === connectedEdges[i].sourceHandle)
+      targetNodes.push(...sourceConnectedEdges.map(edge => nodes.find(n => n.id === edge.target)!))
+    }
+    const uniqTargetNodes = unionBy(targetNodes, 'id')
+    if (uniqTargetNodes.length > 1) {
+      const newNodes = produce(nodes, (draft) => {
+        draft.forEach((n) => {
+          if (uniqTargetNodes.some(targetNode => n.id === targetNode.id))
+            n.data._inParallelHovering = true
+        })
+      })
+      setNodes(newNodes)
+    }
+  }, [store, workflowStore, getNodesReadOnly])
+
+  const handleNodeLeave = useCallback<NodeMouseHandler>((_, node) => {
+    if (getNodesReadOnly())
+      return
+
+    if (node.type === CUSTOM_NOTE_NODE || node.type === CUSTOM_ITERATION_START_NODE)
+      return
+
+    if (node.type === CUSTOM_NOTE_NODE || node.type === CUSTOM_LOOP_START_NODE)
+      return
+
+    const {
+      setEnteringNodePayload,
+    } = workflowStore.getState()
+    setEnteringNodePayload(undefined)
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+    const newNodes = produce(getNodes(), (draft) => {
+      draft.forEach((node) => {
+        node.data._isEntering = false
+        node.data._inParallelHovering = false
+      })
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      draft.forEach((edge) => {
+        edge.data._connectedNodeIsHovering = false
+      })
+    })
+    setEdges(newEdges)
+  }, [store, workflowStore, getNodesReadOnly])
+
+  const handleNodeSelect = useCallback((nodeId: string, cancelSelection?: boolean) => {
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+
+    const nodes = getNodes()
+    const selectedNode = nodes.find(node => node.data.selected)
+
+    if (!cancelSelection && selectedNode?.id === nodeId)
+      return
+
+    const newNodes = produce(nodes, (draft) => {
+      draft.forEach((node) => {
+        if (node.id === nodeId)
+          node.data.selected = !cancelSelection
+        else
+          node.data.selected = false
+      })
+    })
+    setNodes(newNodes)
+
+    const connectedEdges = getConnectedEdges([{ id: nodeId } as Node], edges).map(edge => edge.id)
+    const newEdges = produce(edges, (draft) => {
+      draft.forEach((edge) => {
+        if (connectedEdges.includes(edge.id)) {
+          edge.data = {
+            ...edge.data,
+            _connectedNodeIsSelected: !cancelSelection,
+          }
+        }
+        else {
+          edge.data = {
+            ...edge.data,
+            _connectedNodeIsSelected: false,
+          }
+        }
+      })
+    })
+    setEdges(newEdges)
+
+    handleSyncWorkflowDraft()
+  }, [store, handleSyncWorkflowDraft])
+
+  const handleNodeClick = useCallback<NodeMouseHandler>((_, node) => {
+    if (node.type === CUSTOM_ITERATION_START_NODE)
+      return
+    if (node.type === CUSTOM_LOOP_START_NODE)
+      return
+    handleNodeSelect(node.id)
+  }, [handleNodeSelect])
+
+  const handleNodeConnect = useCallback<OnConnect>(({
+    source,
+    sourceHandle,
+    target,
+    targetHandle,
+  }) => {
+    if (source === target)
+      return
+    if (getNodesReadOnly())
+      return
+
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+    const nodes = getNodes()
+    const targetNode = nodes.find(node => node.id === target!)
+    const sourceNode = nodes.find(node => node.id === source!)
+
+    if (targetNode?.parentId !== sourceNode?.parentId)
+      return
+
+    if (sourceNode?.type === CUSTOM_NOTE_NODE || targetNode?.type === CUSTOM_NOTE_NODE)
+      return
+
+    if (edges.find(edge => edge.source === source && edge.sourceHandle === sourceHandle && edge.target === target && edge.targetHandle === targetHandle))
+      return
+
+    const parendNode = nodes.find(node => node.id === targetNode?.parentId)
+    const isInIteration = parendNode && parendNode.data.type === BlockEnum.Iteration
+    const isInLoop = !!parendNode && parendNode.data.type === BlockEnum.Loop
+
+    const newEdge = {
+      id: `${source}-${sourceHandle}-${target}-${targetHandle}`,
+      type: CUSTOM_EDGE,
+      source: source!,
+      target: target!,
+      sourceHandle,
+      targetHandle,
+      data: {
+        sourceType: nodes.find(node => node.id === source)!.data.type,
+        targetType: nodes.find(node => node.id === target)!.data.type,
+        isInIteration,
+        iteration_id: isInIteration ? targetNode?.parentId : undefined,
+        isInLoop,
+        loop_id: isInLoop ? targetNode?.parentId : undefined,
+      },
+      zIndex: targetNode?.parentId ? (isInIteration ? ITERATION_CHILDREN_Z_INDEX : LOOP_CHILDREN_Z_INDEX) : 0,
+    }
+    const nodesConnectedSourceOrTargetHandleIdsMap = getNodesConnectedSourceOrTargetHandleIdsMap(
+      [
+        { type: 'add', edge: newEdge },
+      ],
+      nodes,
+    )
+    const newNodes = produce(nodes, (draft: Node[]) => {
+      draft.forEach((node) => {
+        if (nodesConnectedSourceOrTargetHandleIdsMap[node.id]) {
+          node.data = {
+            ...node.data,
+            ...nodesConnectedSourceOrTargetHandleIdsMap[node.id],
+          }
+        }
+      })
+    })
+    const newEdges = produce(edges, (draft) => {
+      draft.push(newEdge)
+    })
+
+    if (checkNestedParallelLimit(newNodes, newEdges, targetNode?.parentId)) {
+      setNodes(newNodes)
+      setEdges(newEdges)
+
+      handleSyncWorkflowDraft()
+      saveStateToHistory(WorkflowHistoryEvent.NodeConnect)
+    }
+    else {
+      const {
+        setConnectingNodePayload,
+        setEnteringNodePayload,
+      } = workflowStore.getState()
+      setConnectingNodePayload(undefined)
+      setEnteringNodePayload(undefined)
+    }
+  }, [getNodesReadOnly, store, workflowStore, handleSyncWorkflowDraft, saveStateToHistory, checkNestedParallelLimit])
+
+  const handleNodeConnectStart = useCallback<OnConnectStart>((_, { nodeId, handleType, handleId }) => {
+    if (getNodesReadOnly())
+      return
+
+    if (nodeId && handleType) {
+      const { setConnectingNodePayload } = workflowStore.getState()
+      const { getNodes } = store.getState()
+      const node = getNodes().find(n => n.id === nodeId)!
+
+      if (node.type === CUSTOM_NOTE_NODE)
+        return
+
+      if (node.data.type === BlockEnum.VariableAggregator || node.data.type === BlockEnum.VariableAssigner) {
+        if (handleType === 'target')
+          return
+      }
+
+      setConnectingNodePayload({
+        nodeId,
+        nodeType: node.data.type,
+        handleType,
+        handleId,
+      })
+    }
+  }, [store, workflowStore, getNodesReadOnly])
+
+  const handleNodeConnectEnd = useCallback<OnConnectEnd>((e: any) => {
+    if (getNodesReadOnly())
+      return
+
+    const {
+      connectingNodePayload,
+      setConnectingNodePayload,
+      enteringNodePayload,
+      setEnteringNodePayload,
+    } = workflowStore.getState()
+    if (connectingNodePayload && enteringNodePayload) {
+      const {
+        setShowAssignVariablePopup,
+        hoveringAssignVariableGroupId,
+      } = workflowStore.getState()
+      const { screenToFlowPosition } = reactflow
+      const {
+        getNodes,
+        setNodes,
+      } = store.getState()
+      const nodes = getNodes()
+      const fromHandleType = connectingNodePayload.handleType
+      const fromHandleId = connectingNodePayload.handleId
+      const fromNode = nodes.find(n => n.id === connectingNodePayload.nodeId)!
+      const toNode = nodes.find(n => n.id === enteringNodePayload.nodeId)!
+      const toParentNode = nodes.find(n => n.id === toNode.parentId)
+
+      if (fromNode.parentId !== toNode.parentId)
+        return
+
+      const { x, y } = screenToFlowPosition({ x: e.x, y: e.y })
+
+      if (fromHandleType === 'source' && (toNode.data.type === BlockEnum.VariableAssigner || toNode.data.type === BlockEnum.VariableAggregator)) {
+        const groupEnabled = toNode.data.advanced_settings?.group_enabled
+        const firstGroupId = toNode.data.advanced_settings?.groups[0].groupId
+        let handleId = 'target'
+
+        if (groupEnabled) {
+          if (hoveringAssignVariableGroupId)
+            handleId = hoveringAssignVariableGroupId
+          else
+            handleId = firstGroupId
+        }
+        const newNodes = produce(nodes, (draft) => {
+          draft.forEach((node) => {
+            if (node.id === toNode.id) {
+              node.data._showAddVariablePopup = true
+              node.data._holdAddVariablePopup = true
+            }
+          })
+        })
+        setNodes(newNodes)
+        setShowAssignVariablePopup({
+          nodeId: fromNode.id,
+          nodeData: fromNode.data,
+          variableAssignerNodeId: toNode.id,
+          variableAssignerNodeData: toNode.data,
+          variableAssignerNodeHandleId: handleId,
+          parentNode: toParentNode,
+          x: x - toNode.positionAbsolute!.x,
+          y: y - toNode.positionAbsolute!.y,
+        })
+        handleNodeConnect({
+          source: fromNode.id,
+          sourceHandle: fromHandleId,
+          target: toNode.id,
+          targetHandle: 'target',
+        })
+      }
+    }
+    setConnectingNodePayload(undefined)
+    setEnteringNodePayload(undefined)
+  }, [store, handleNodeConnect, getNodesReadOnly, workflowStore, reactflow])
+
+  const handleNodeDelete = useCallback((nodeId: string) => {
+    if (getNodesReadOnly())
+      return
+
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+
+    const nodes = getNodes()
+    const currentNodeIndex = nodes.findIndex(node => node.id === nodeId)
+    const currentNode = nodes[currentNodeIndex]
+
+    if (!currentNode)
+      return
+
+    if (currentNode.data.type === BlockEnum.Start)
+      return
+
+    if (currentNode.data.type === BlockEnum.Iteration) {
+      const iterationChildren = nodes.filter(node => node.parentId === currentNode.id)
+
+      if (iterationChildren.length) {
+        if (currentNode.data._isBundled) {
+          iterationChildren.forEach((child) => {
+            handleNodeDelete(child.id)
+          })
+          return handleNodeDelete(nodeId)
+        }
+        else {
+          if (iterationChildren.length === 1) {
+            handleNodeDelete(iterationChildren[0].id)
+            handleNodeDelete(nodeId)
+
+            return
+          }
+          const { setShowConfirm, showConfirm } = workflowStore.getState()
+
+          if (!showConfirm) {
+            setShowConfirm({
+              title: t('workflow.nodes.iteration.deleteTitle'),
+              desc: t('workflow.nodes.iteration.deleteDesc') || '',
+              onConfirm: () => {
+                iterationChildren.forEach((child) => {
+                  handleNodeDelete(child.id)
+                })
+                handleNodeDelete(nodeId)
+                handleSyncWorkflowDraft()
+                setShowConfirm(undefined)
+              },
+            })
+            return
+          }
+        }
+      }
+    }
+
+    if (currentNode.data.type === BlockEnum.Loop) {
+      const loopChildren = nodes.filter(node => node.parentId === currentNode.id)
+
+      if (loopChildren.length) {
+        if (currentNode.data._isBundled) {
+          loopChildren.forEach((child) => {
+            handleNodeDelete(child.id)
+          })
+          return handleNodeDelete(nodeId)
+        }
+        else {
+          if (loopChildren.length === 1) {
+            handleNodeDelete(loopChildren[0].id)
+            handleNodeDelete(nodeId)
+
+            return
+          }
+          const { setShowConfirm, showConfirm } = workflowStore.getState()
+
+          if (!showConfirm) {
+            setShowConfirm({
+              title: t('workflow.nodes.loop.deleteTitle'),
+              desc: t('workflow.nodes.loop.deleteDesc') || '',
+              onConfirm: () => {
+                loopChildren.forEach((child) => {
+                  handleNodeDelete(child.id)
+                })
+                handleNodeDelete(nodeId)
+                handleSyncWorkflowDraft()
+                setShowConfirm(undefined)
+              },
+            })
+            return
+          }
+        }
+      }
+    }
+
+    const connectedEdges = getConnectedEdges([{ id: nodeId } as Node], edges)
+    const nodesConnectedSourceOrTargetHandleIdsMap = getNodesConnectedSourceOrTargetHandleIdsMap(connectedEdges.map(edge => ({ type: 'remove', edge })), nodes)
+    const newNodes = produce(nodes, (draft: Node[]) => {
+      draft.forEach((node) => {
+        if (nodesConnectedSourceOrTargetHandleIdsMap[node.id]) {
+          node.data = {
+            ...node.data,
+            ...nodesConnectedSourceOrTargetHandleIdsMap[node.id],
+          }
+        }
+
+        if (node.id === currentNode.parentId)
+          node.data._children = node.data._children?.filter(child => child.nodeId !== nodeId)
+      })
+      draft.splice(currentNodeIndex, 1)
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      return draft.filter(edge => !connectedEdges.find(connectedEdge => connectedEdge.id === edge.id))
+    })
+    setEdges(newEdges)
+    handleSyncWorkflowDraft()
+
+    if (currentNode.type === CUSTOM_NOTE_NODE)
+      saveStateToHistory(WorkflowHistoryEvent.NoteDelete)
+
+    else
+      saveStateToHistory(WorkflowHistoryEvent.NodeDelete)
+  }, [getNodesReadOnly, store, handleSyncWorkflowDraft, saveStateToHistory, workflowStore, t])
+
+  const handleNodeAdd = useCallback<OnNodeAdd>((
+    {
+      nodeType,
+      sourceHandle = 'source',
+      targetHandle = 'target',
+      toolDefaultValue,
+    },
+    {
+      prevNodeId,
+      prevNodeSourceHandle,
+      nextNodeId,
+      nextNodeTargetHandle,
+    },
+  ) => {
+    if (getNodesReadOnly())
+      return
+
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+    const nodes = getNodes()
+    const nodesWithSameType = nodes.filter(node => node.data.type === nodeType)
+    const {
+      newNode,
+      newIterationStartNode,
+      newLoopStartNode,
+    } = generateNewNode({
+      type: getNodeCustomTypeByNodeDataType(nodeType),
+      data: {
+        ...NODES_INITIAL_DATA[nodeType],
+        title: nodesWithSameType.length > 0 ? `${t(`workflow.blocks.${nodeType}`)} ${nodesWithSameType.length + 1}` : t(`workflow.blocks.${nodeType}`),
+        ...(toolDefaultValue || {}),
+        selected: true,
+        _showAddVariablePopup: (nodeType === BlockEnum.VariableAssigner || nodeType === BlockEnum.VariableAggregator) && !!prevNodeId,
+        _holdAddVariablePopup: false,
+      },
+      position: {
+        x: 0,
+        y: 0,
+      },
+    })
+    if (prevNodeId && !nextNodeId) {
+      const prevNodeIndex = nodes.findIndex(node => node.id === prevNodeId)
+      const prevNode = nodes[prevNodeIndex]
+      const outgoers = getOutgoers(prevNode, nodes, edges).sort((a, b) => a.position.y - b.position.y)
+      const lastOutgoer = outgoers[outgoers.length - 1]
+
+      newNode.data._connectedTargetHandleIds = [targetHandle]
+      newNode.data._connectedSourceHandleIds = []
+      newNode.position = {
+        x: lastOutgoer ? lastOutgoer.position.x : prevNode.position.x + prevNode.width! + X_OFFSET,
+        y: lastOutgoer ? lastOutgoer.position.y + lastOutgoer.height! + Y_OFFSET : prevNode.position.y,
+      }
+      newNode.parentId = prevNode.parentId
+      newNode.extent = prevNode.extent
+
+      const parentNode = nodes.find(node => node.id === prevNode.parentId) || null
+      const isInIteration = !!parentNode && parentNode.data.type === BlockEnum.Iteration
+      const isInLoop = !!parentNode && parentNode.data.type === BlockEnum.Loop
+
+      if (prevNode.parentId) {
+        newNode.data.isInIteration = isInIteration
+        newNode.data.isInLoop = isInLoop
+        if (isInIteration) {
+          newNode.data.iteration_id = parentNode.id
+          newNode.zIndex = ITERATION_CHILDREN_Z_INDEX
+        }
+        if (isInLoop) {
+          newNode.data.loop_id = parentNode.id
+          newNode.zIndex = LOOP_CHILDREN_Z_INDEX
+        }
+        if (isInIteration && (newNode.data.type === BlockEnum.Answer || newNode.data.type === BlockEnum.Tool || newNode.data.type === BlockEnum.Assigner)) {
+          const iterNodeData: IterationNodeType = parentNode.data
+          iterNodeData._isShowTips = true
+        }
+        if (isInLoop && (newNode.data.type === BlockEnum.Answer || newNode.data.type === BlockEnum.Tool || newNode.data.type === BlockEnum.Assigner)) {
+          const iterNodeData: IterationNodeType = parentNode.data
+          iterNodeData._isShowTips = true
+        }
+      }
+
+      const newEdge: Edge = {
+        id: `${prevNodeId}-${prevNodeSourceHandle}-${newNode.id}-${targetHandle}`,
+        type: CUSTOM_EDGE,
+        source: prevNodeId,
+        sourceHandle: prevNodeSourceHandle,
+        target: newNode.id,
+        targetHandle,
+        data: {
+          sourceType: prevNode.data.type,
+          targetType: newNode.data.type,
+          isInIteration,
+          isInLoop,
+          iteration_id: isInIteration ? prevNode.parentId : undefined,
+          loop_id: isInLoop ? prevNode.parentId : undefined,
+          _connectedNodeIsSelected: true,
+        },
+        zIndex: prevNode.parentId ? (isInIteration ? ITERATION_CHILDREN_Z_INDEX : LOOP_CHILDREN_Z_INDEX) : 0,
+      }
+      const nodesConnectedSourceOrTargetHandleIdsMap = getNodesConnectedSourceOrTargetHandleIdsMap(
+        [
+          { type: 'add', edge: newEdge },
+        ],
+        nodes,
+      )
+      const newNodes = produce(nodes, (draft: Node[]) => {
+        draft.forEach((node) => {
+          node.data.selected = false
+
+          if (nodesConnectedSourceOrTargetHandleIdsMap[node.id]) {
+            node.data = {
+              ...node.data,
+              ...nodesConnectedSourceOrTargetHandleIdsMap[node.id],
+            }
+          }
+
+          if (node.data.type === BlockEnum.Iteration && prevNode.parentId === node.id)
+            node.data._children?.push({ nodeId: newNode.id, nodeType: newNode.data.type })
+
+          if (node.data.type === BlockEnum.Loop && prevNode.parentId === node.id)
+            node.data._children?.push({ nodeId: newNode.id, nodeType: newNode.data.type })
+        })
+        draft.push(newNode)
+
+        if (newIterationStartNode)
+          draft.push(newIterationStartNode)
+
+        if (newLoopStartNode)
+          draft.push(newLoopStartNode)
+      })
+
+      if (newNode.data.type === BlockEnum.VariableAssigner || newNode.data.type === BlockEnum.VariableAggregator) {
+        const { setShowAssignVariablePopup } = workflowStore.getState()
+
+        setShowAssignVariablePopup({
+          nodeId: prevNode.id,
+          nodeData: prevNode.data,
+          variableAssignerNodeId: newNode.id,
+          variableAssignerNodeData: (newNode.data as VariableAssignerNodeType),
+          variableAssignerNodeHandleId: targetHandle,
+          parentNode: nodes.find(node => node.id === newNode.parentId),
+          x: -25,
+          y: 44,
+        })
+      }
+      const newEdges = produce(edges, (draft) => {
+        draft.forEach((item) => {
+          item.data = {
+            ...item.data,
+            _connectedNodeIsSelected: false,
+          }
+        })
+        draft.push(newEdge)
+      })
+
+      if (checkNestedParallelLimit(newNodes, newEdges, prevNode.parentId)) {
+        setNodes(newNodes)
+        setEdges(newEdges)
+      }
+      else {
+        return false
+      }
+    }
+    if (!prevNodeId && nextNodeId) {
+      const nextNodeIndex = nodes.findIndex(node => node.id === nextNodeId)
+      const nextNode = nodes[nextNodeIndex]!
+      if ((nodeType !== BlockEnum.IfElse) && (nodeType !== BlockEnum.QuestionClassifier))
+        newNode.data._connectedSourceHandleIds = [sourceHandle]
+      newNode.data._connectedTargetHandleIds = []
+      newNode.position = {
+        x: nextNode.position.x,
+        y: nextNode.position.y,
+      }
+      newNode.parentId = nextNode.parentId
+      newNode.extent = nextNode.extent
+
+      const parentNode = nodes.find(node => node.id === nextNode.parentId) || null
+      const isInIteration = !!parentNode && parentNode.data.type === BlockEnum.Iteration
+      const isInLoop = !!parentNode && parentNode.data.type === BlockEnum.Loop
+
+      if (parentNode && nextNode.parentId) {
+        newNode.data.isInIteration = isInIteration
+        newNode.data.isInLoop = isInLoop
+        if (isInIteration) {
+          newNode.data.iteration_id = parentNode.id
+          newNode.zIndex = ITERATION_CHILDREN_Z_INDEX
+        }
+        if (isInLoop) {
+          newNode.data.loop_id = parentNode.id
+          newNode.zIndex = LOOP_CHILDREN_Z_INDEX
+        }
+      }
+
+      let newEdge
+
+      if ((nodeType !== BlockEnum.IfElse) && (nodeType !== BlockEnum.QuestionClassifier) && (nodeType !== BlockEnum.LoopEnd)) {
+        newEdge = {
+          id: `${newNode.id}-${sourceHandle}-${nextNodeId}-${nextNodeTargetHandle}`,
+          type: CUSTOM_EDGE,
+          source: newNode.id,
+          sourceHandle,
+          target: nextNodeId,
+          targetHandle: nextNodeTargetHandle,
+          data: {
+            sourceType: newNode.data.type,
+            targetType: nextNode.data.type,
+            isInIteration,
+            isInLoop,
+            iteration_id: isInIteration ? nextNode.parentId : undefined,
+            loop_id: isInLoop ? nextNode.parentId : undefined,
+            _connectedNodeIsSelected: true,
+          },
+          zIndex: nextNode.parentId ? (isInIteration ? ITERATION_CHILDREN_Z_INDEX : LOOP_CHILDREN_Z_INDEX) : 0,
+        }
+      }
+
+      let nodesConnectedSourceOrTargetHandleIdsMap: Record<string, any>
+      if (newEdge) {
+        nodesConnectedSourceOrTargetHandleIdsMap = getNodesConnectedSourceOrTargetHandleIdsMap(
+          [
+            { type: 'add', edge: newEdge },
+          ],
+          nodes,
+        )
+      }
+
+      const afterNodesInSameBranch = getAfterNodesInSameBranch(nextNodeId!)
+      const afterNodesInSameBranchIds = afterNodesInSameBranch.map(node => node.id)
+      const newNodes = produce(nodes, (draft) => {
+        draft.forEach((node) => {
+          node.data.selected = false
+
+          if (afterNodesInSameBranchIds.includes(node.id))
+            node.position.x += NODE_WIDTH_X_OFFSET
+
+          if (nodesConnectedSourceOrTargetHandleIdsMap?.[node.id]) {
+            node.data = {
+              ...node.data,
+              ...nodesConnectedSourceOrTargetHandleIdsMap[node.id],
+            }
+          }
+
+          if (node.data.type === BlockEnum.Iteration && nextNode.parentId === node.id)
+            node.data._children?.push({ nodeId: newNode.id, nodeType: newNode.data.type })
+
+          if (node.data.type === BlockEnum.Iteration && node.data.start_node_id === nextNodeId) {
+            node.data.start_node_id = newNode.id
+            node.data.startNodeType = newNode.data.type
+          }
+
+          if (node.data.type === BlockEnum.Loop && nextNode.parentId === node.id)
+            node.data._children?.push({ nodeId: newNode.id, nodeType: newNode.data.type })
+
+          if (node.data.type === BlockEnum.Loop && node.data.start_node_id === nextNodeId) {
+            node.data.start_node_id = newNode.id
+            node.data.startNodeType = newNode.data.type
+          }
+        })
+        draft.push(newNode)
+        if (newIterationStartNode)
+          draft.push(newIterationStartNode)
+        if (newLoopStartNode)
+          draft.push(newLoopStartNode)
+      })
+      if (newEdge) {
+        const newEdges = produce(edges, (draft) => {
+          draft.forEach((item) => {
+            item.data = {
+              ...item.data,
+              _connectedNodeIsSelected: false,
+            }
+          })
+          draft.push(newEdge)
+        })
+
+        if (checkNestedParallelLimit(newNodes, newEdges, nextNode.parentId)) {
+          setNodes(newNodes)
+          setEdges(newEdges)
+        }
+        else {
+          return false
+        }
+      }
+      else {
+        if (checkNestedParallelLimit(newNodes, edges))
+          setNodes(newNodes)
+
+        else
+          return false
+      }
+    }
+    if (prevNodeId && nextNodeId) {
+      const prevNode = nodes.find(node => node.id === prevNodeId)!
+      const nextNode = nodes.find(node => node.id === nextNodeId)!
+
+      newNode.data._connectedTargetHandleIds = [targetHandle]
+      newNode.data._connectedSourceHandleIds = [sourceHandle]
+      newNode.position = {
+        x: nextNode.position.x,
+        y: nextNode.position.y,
+      }
+      newNode.parentId = prevNode.parentId
+      newNode.extent = prevNode.extent
+
+      const parentNode = nodes.find(node => node.id === prevNode.parentId) || null
+      const isInIteration = !!parentNode && parentNode.data.type === BlockEnum.Iteration
+      const isInLoop = !!parentNode && parentNode.data.type === BlockEnum.Loop
+
+      if (parentNode && prevNode.parentId) {
+        newNode.data.isInIteration = isInIteration
+        newNode.data.isInLoop = isInLoop
+        if (isInIteration) {
+          newNode.data.iteration_id = parentNode.id
+          newNode.zIndex = ITERATION_CHILDREN_Z_INDEX
+        }
+        if (isInLoop) {
+          newNode.data.loop_id = parentNode.id
+          newNode.zIndex = LOOP_CHILDREN_Z_INDEX
+        }
+      }
+
+      const currentEdgeIndex = edges.findIndex(edge => edge.source === prevNodeId && edge.target === nextNodeId)
+      const newPrevEdge = {
+        id: `${prevNodeId}-${prevNodeSourceHandle}-${newNode.id}-${targetHandle}`,
+        type: CUSTOM_EDGE,
+        source: prevNodeId,
+        sourceHandle: prevNodeSourceHandle,
+        target: newNode.id,
+        targetHandle,
+        data: {
+          sourceType: prevNode.data.type,
+          targetType: newNode.data.type,
+          isInIteration,
+          isInLoop,
+          iteration_id: isInIteration ? prevNode.parentId : undefined,
+          loop_id: isInLoop ? prevNode.parentId : undefined,
+          _connectedNodeIsSelected: true,
+        },
+        zIndex: prevNode.parentId ? (isInIteration ? ITERATION_CHILDREN_Z_INDEX : LOOP_CHILDREN_Z_INDEX) : 0,
+      }
+      let newNextEdge: Edge | null = null
+
+      const nextNodeParentNode = nodes.find(node => node.id === nextNode.parentId) || null
+      const isNextNodeInIteration = !!nextNodeParentNode && nextNodeParentNode.data.type === BlockEnum.Iteration
+      const isNextNodeInLoop = !!nextNodeParentNode && nextNodeParentNode.data.type === BlockEnum.Loop
+
+      if (nodeType !== BlockEnum.IfElse && nodeType !== BlockEnum.QuestionClassifier && nodeType !== BlockEnum.LoopEnd) {
+        newNextEdge = {
+          id: `${newNode.id}-${sourceHandle}-${nextNodeId}-${nextNodeTargetHandle}`,
+          type: CUSTOM_EDGE,
+          source: newNode.id,
+          sourceHandle,
+          target: nextNodeId,
+          targetHandle: nextNodeTargetHandle,
+          data: {
+            sourceType: newNode.data.type,
+            targetType: nextNode.data.type,
+            isInIteration: isNextNodeInIteration,
+            isInLoop: isNextNodeInLoop,
+            iteration_id: isNextNodeInIteration ? nextNode.parentId : undefined,
+            loop_id: isNextNodeInLoop ? nextNode.parentId : undefined,
+            _connectedNodeIsSelected: true,
+          },
+          zIndex: nextNode.parentId ? (isNextNodeInIteration ? ITERATION_CHILDREN_Z_INDEX : LOOP_CHILDREN_Z_INDEX) : 0,
+        }
+      }
+      const nodesConnectedSourceOrTargetHandleIdsMap = getNodesConnectedSourceOrTargetHandleIdsMap(
+        [
+          { type: 'remove', edge: edges[currentEdgeIndex] },
+          { type: 'add', edge: newPrevEdge },
+          ...(newNextEdge ? [{ type: 'add', edge: newNextEdge }] : []),
+        ],
+        [...nodes, newNode],
+      )
+
+      const afterNodesInSameBranch = getAfterNodesInSameBranch(nextNodeId!)
+      const afterNodesInSameBranchIds = afterNodesInSameBranch.map(node => node.id)
+      const newNodes = produce(nodes, (draft) => {
+        draft.forEach((node) => {
+          node.data.selected = false
+
+          if (nodesConnectedSourceOrTargetHandleIdsMap[node.id]) {
+            node.data = {
+              ...node.data,
+              ...nodesConnectedSourceOrTargetHandleIdsMap[node.id],
+            }
+          }
+          if (afterNodesInSameBranchIds.includes(node.id))
+            node.position.x += NODE_WIDTH_X_OFFSET
+
+          if (node.data.type === BlockEnum.Iteration && prevNode.parentId === node.id)
+            node.data._children?.push({ nodeId: newNode.id, nodeType: newNode.data.type })
+          if (node.data.type === BlockEnum.Loop && prevNode.parentId === node.id)
+            node.data._children?.push({ nodeId: newNode.id, nodeType: newNode.data.type })
+        })
+        draft.push(newNode)
+        if (newIterationStartNode)
+          draft.push(newIterationStartNode)
+        if (newLoopStartNode)
+          draft.push(newLoopStartNode)
+      })
+      setNodes(newNodes)
+      if (newNode.data.type === BlockEnum.VariableAssigner || newNode.data.type === BlockEnum.VariableAggregator) {
+        const { setShowAssignVariablePopup } = workflowStore.getState()
+
+        setShowAssignVariablePopup({
+          nodeId: prevNode.id,
+          nodeData: prevNode.data,
+          variableAssignerNodeId: newNode.id,
+          variableAssignerNodeData: newNode.data as VariableAssignerNodeType,
+          variableAssignerNodeHandleId: targetHandle,
+          parentNode: nodes.find(node => node.id === newNode.parentId),
+          x: -25,
+          y: 44,
+        })
+      }
+      const newEdges = produce(edges, (draft) => {
+        draft.splice(currentEdgeIndex, 1)
+        draft.forEach((item) => {
+          item.data = {
+            ...item.data,
+            _connectedNodeIsSelected: false,
+          }
+        })
+        draft.push(newPrevEdge)
+
+        if (newNextEdge)
+          draft.push(newNextEdge)
+      })
+      setEdges(newEdges)
+    }
+    handleSyncWorkflowDraft()
+    saveStateToHistory(WorkflowHistoryEvent.NodeAdd)
+  }, [getNodesReadOnly, store, t, handleSyncWorkflowDraft, saveStateToHistory, workflowStore, getAfterNodesInSameBranch, checkNestedParallelLimit])
+
+  const handleNodeChange = useCallback((
+    currentNodeId: string,
+    nodeType: BlockEnum,
+    sourceHandle: string,
+    toolDefaultValue?: ToolDefaultValue,
+  ) => {
+    if (getNodesReadOnly())
+      return
+
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+    const nodes = getNodes()
+    const currentNode = nodes.find(node => node.id === currentNodeId)!
+    const connectedEdges = getConnectedEdges([currentNode], edges)
+    const nodesWithSameType = nodes.filter(node => node.data.type === nodeType)
+    const {
+      newNode: newCurrentNode,
+      newIterationStartNode,
+      newLoopStartNode,
+    } = generateNewNode({
+      type: getNodeCustomTypeByNodeDataType(nodeType),
+      data: {
+        ...NODES_INITIAL_DATA[nodeType],
+        title: nodesWithSameType.length > 0 ? `${t(`workflow.blocks.${nodeType}`)} ${nodesWithSameType.length + 1}` : t(`workflow.blocks.${nodeType}`),
+        ...(toolDefaultValue || {}),
+        _connectedSourceHandleIds: [],
+        _connectedTargetHandleIds: [],
+        selected: currentNode.data.selected,
+        isInIteration: currentNode.data.isInIteration,
+        isInLoop: currentNode.data.isInLoop,
+        iteration_id: currentNode.data.iteration_id,
+        loop_id: currentNode.data.loop_id,
+      },
+      position: {
+        x: currentNode.position.x,
+        y: currentNode.position.y,
+      },
+      parentId: currentNode.parentId,
+      extent: currentNode.extent,
+      zIndex: currentNode.zIndex,
+    })
+    const nodesConnectedSourceOrTargetHandleIdsMap = getNodesConnectedSourceOrTargetHandleIdsMap(
+      [
+        ...connectedEdges.map(edge => ({ type: 'remove', edge })),
+      ],
+      nodes,
+    )
+    const newNodes = produce(nodes, (draft) => {
+      draft.forEach((node) => {
+        node.data.selected = false
+
+        if (nodesConnectedSourceOrTargetHandleIdsMap[node.id]) {
+          node.data = {
+            ...node.data,
+            ...nodesConnectedSourceOrTargetHandleIdsMap[node.id],
+          }
+        }
+      })
+      const index = draft.findIndex(node => node.id === currentNodeId)
+
+      draft.splice(index, 1, newCurrentNode)
+      if (newIterationStartNode)
+        draft.push(newIterationStartNode)
+      if (newLoopStartNode)
+        draft.push(newLoopStartNode)
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      const filtered = draft.filter(edge => !connectedEdges.find(connectedEdge => connectedEdge.id === edge.id))
+
+      return filtered
+    })
+    setEdges(newEdges)
+    handleSyncWorkflowDraft()
+
+    saveStateToHistory(WorkflowHistoryEvent.NodeChange)
+  }, [getNodesReadOnly, store, t, handleSyncWorkflowDraft, saveStateToHistory])
+
+  const handleNodesCancelSelected = useCallback(() => {
+    const {
+      getNodes,
+      setNodes,
+    } = store.getState()
+
+    const nodes = getNodes()
+    const newNodes = produce(nodes, (draft) => {
+      draft.forEach((node) => {
+        node.data.selected = false
+      })
+    })
+    setNodes(newNodes)
+  }, [store])
+
+  const handleNodeContextMenu = useCallback((e: MouseEvent, node: Node) => {
+    if (node.type === CUSTOM_NOTE_NODE || node.type === CUSTOM_ITERATION_START_NODE)
+      return
+
+    if (node.type === CUSTOM_NOTE_NODE || node.type === CUSTOM_LOOP_START_NODE)
+      return
+
+    e.preventDefault()
+    const container = document.querySelector('#workflow-container')
+    const { x, y } = container!.getBoundingClientRect()
+    workflowStore.setState({
+      nodeMenu: {
+        top: e.clientY - y,
+        left: e.clientX - x,
+        nodeId: node.id,
+      },
+    })
+    handleNodeSelect(node.id)
+  }, [workflowStore, handleNodeSelect])
+
+  const handleNodesCopy = useCallback((nodeId?: string) => {
+    if (getNodesReadOnly())
+      return
+
+    const { setClipboardElements } = workflowStore.getState()
+
+    const {
+      getNodes,
+    } = store.getState()
+
+    const nodes = getNodes()
+
+    if (nodeId) {
+      // If nodeId is provided, copy that specific node
+      const nodeToCopy = nodes.find(node => node.id === nodeId && node.data.type !== BlockEnum.Start
+        && node.type !== CUSTOM_ITERATION_START_NODE && node.type !== CUSTOM_LOOP_START_NODE && node.data.type !== BlockEnum.LoopEnd)
+      if (nodeToCopy)
+        setClipboardElements([nodeToCopy])
+    }
+    else {
+      // If no nodeId is provided, fall back to the current behavior
+      const bundledNodes = nodes.filter(node => node.data._isBundled && node.data.type !== BlockEnum.Start
+        && !node.data.isInIteration && !node.data.isInLoop)
+
+      if (bundledNodes.length) {
+        setClipboardElements(bundledNodes)
+        return
+      }
+
+      const selectedNode = nodes.find(node => node.data.selected && node.data.type !== BlockEnum.Start && node.data.type !== BlockEnum.LoopEnd)
+
+      if (selectedNode)
+        setClipboardElements([selectedNode])
+    }
+  }, [getNodesReadOnly, store, workflowStore])
+
+  const handleNodesPaste = useCallback(() => {
+    if (getNodesReadOnly())
+      return
+
+    const {
+      clipboardElements,
+      mousePosition,
+    } = workflowStore.getState()
+
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+
+    const nodesToPaste: Node[] = []
+    const edgesToPaste: Edge[] = []
+    const nodes = getNodes()
+
+    if (clipboardElements.length) {
+      const { x, y } = getTopLeftNodePosition(clipboardElements)
+      const { screenToFlowPosition } = reactflow
+      const currentPosition = screenToFlowPosition({ x: mousePosition.pageX, y: mousePosition.pageY })
+      const offsetX = currentPosition.x - x
+      const offsetY = currentPosition.y - y
+      let idMapping: Record<string, string> = {}
+      clipboardElements.forEach((nodeToPaste, index) => {
+        const nodeType = nodeToPaste.data.type
+
+        const {
+          newNode,
+          newIterationStartNode,
+          newLoopStartNode,
+        } = generateNewNode({
+          type: nodeToPaste.type,
+          data: {
+            ...NODES_INITIAL_DATA[nodeType],
+            ...nodeToPaste.data,
+            selected: false,
+            _isBundled: false,
+            _connectedSourceHandleIds: [],
+            _connectedTargetHandleIds: [],
+            title: genNewNodeTitleFromOld(nodeToPaste.data.title),
+          },
+          position: {
+            x: nodeToPaste.position.x + offsetX,
+            y: nodeToPaste.position.y + offsetY,
+          },
+          extent: nodeToPaste.extent,
+          zIndex: nodeToPaste.zIndex,
+        })
+        newNode.id = newNode.id + index
+        // This new node is movable and can be placed anywhere
+        let newChildren: Node[] = []
+        if (nodeToPaste.data.type === BlockEnum.Iteration) {
+          newIterationStartNode!.parentId = newNode.id;
+          (newNode.data as IterationNodeType).start_node_id = newIterationStartNode!.id
+
+          const oldIterationStartNode = nodes
+            .find(n => n.parentId === nodeToPaste.id && n.type === CUSTOM_ITERATION_START_NODE)
+          idMapping[oldIterationStartNode!.id] = newIterationStartNode!.id
+
+          const { copyChildren, newIdMapping } = handleNodeIterationChildrenCopy(nodeToPaste.id, newNode.id, idMapping)
+          newChildren = copyChildren
+          idMapping = newIdMapping
+          newChildren.forEach((child) => {
+            newNode.data._children?.push({ nodeId: child.id, nodeType: child.data.type })
+          })
+          newChildren.push(newIterationStartNode!)
+        }
+
+        if (nodeToPaste.data.type === BlockEnum.Loop) {
+          newLoopStartNode!.parentId = newNode.id;
+          (newNode.data as LoopNodeType).start_node_id = newLoopStartNode!.id
+
+          newChildren = handleNodeLoopChildrenCopy(nodeToPaste.id, newNode.id)
+          newChildren.forEach((child) => {
+            newNode.data._children?.push({ nodeId: child.id, nodeType: child.data.type })
+          })
+          newChildren.push(newLoopStartNode!)
+        }
+
+        nodesToPaste.push(newNode)
+
+        if (newChildren.length)
+          nodesToPaste.push(...newChildren)
+      })
+
+      edges.forEach((edge) => {
+        const sourceId = idMapping[edge.source]
+        const targetId = idMapping[edge.target]
+
+        if (sourceId && targetId) {
+          const newEdge: Edge = {
+            ...edge,
+            id: `${sourceId}-${edge.sourceHandle}-${targetId}-${edge.targetHandle}`,
+            source: sourceId,
+            target: targetId,
+            data: {
+              ...edge.data,
+              _connectedNodeIsSelected: false,
+            },
+          }
+          edgesToPaste.push(newEdge)
+        }
+      })
+
+      setNodes([...nodes, ...nodesToPaste])
+      setEdges([...edges, ...edgesToPaste])
+      saveStateToHistory(WorkflowHistoryEvent.NodePaste)
+      handleSyncWorkflowDraft()
+    }
+  }, [getNodesReadOnly, workflowStore, store, reactflow, saveStateToHistory, handleSyncWorkflowDraft, handleNodeIterationChildrenCopy, handleNodeLoopChildrenCopy])
+
+  const handleNodesDuplicate = useCallback((nodeId?: string) => {
+    if (getNodesReadOnly())
+      return
+
+    handleNodesCopy(nodeId)
+    handleNodesPaste()
+  }, [getNodesReadOnly, handleNodesCopy, handleNodesPaste])
+
+  const handleNodesDelete = useCallback(() => {
+    if (getNodesReadOnly())
+      return
+
+    const {
+      getNodes,
+      edges,
+    } = store.getState()
+
+    const nodes = getNodes()
+    const bundledNodes = nodes.filter(node => node.data._isBundled && node.data.type !== BlockEnum.Start)
+
+    if (bundledNodes.length) {
+      bundledNodes.forEach(node => handleNodeDelete(node.id))
+
+      return
+    }
+
+    const edgeSelected = edges.some(edge => edge.selected)
+    if (edgeSelected)
+      return
+
+    const selectedNode = nodes.find(node => node.data.selected && node.data.type !== BlockEnum.Start)
+
+    if (selectedNode)
+      handleNodeDelete(selectedNode.id)
+  }, [store, getNodesReadOnly, handleNodeDelete])
+
+  const handleNodeResize = useCallback((nodeId: string, params: ResizeParamsWithDirection) => {
+    if (getNodesReadOnly())
+      return
+
+    const {
+      getNodes,
+      setNodes,
+    } = store.getState()
+    const { x, y, width, height } = params
+
+    const nodes = getNodes()
+    const currentNode = nodes.find(n => n.id === nodeId)!
+    const childrenNodes = nodes.filter(n => currentNode.data._children?.find((c: any) => c.nodeId === n.id))
+    let rightNode: Node
+    let bottomNode: Node
+
+    childrenNodes.forEach((n) => {
+      if (rightNode) {
+        if (n.position.x + n.width! > rightNode.position.x + rightNode.width!)
+          rightNode = n
+      }
+      else {
+        rightNode = n
+      }
+      if (bottomNode) {
+        if (n.position.y + n.height! > bottomNode.position.y + bottomNode.height!)
+          bottomNode = n
+      }
+      else {
+        bottomNode = n
+      }
+    })
+
+    if (rightNode! && bottomNode!) {
+      const parentNode = nodes.find(n => n.id === rightNode.parentId)
+      const paddingMap = parentNode?.data.type === BlockEnum.Iteration ? ITERATION_PADDING : LOOP_PADDING
+
+      if (width < rightNode!.position.x + rightNode.width! + paddingMap.right)
+        return
+      if (height < bottomNode.position.y + bottomNode.height! + paddingMap.bottom)
+        return
+    }
+    const newNodes = produce(nodes, (draft) => {
+      draft.forEach((n) => {
+        if (n.id === nodeId) {
+          n.data.width = width
+          n.data.height = height
+          n.width = width
+          n.height = height
+          n.position.x = x
+          n.position.y = y
+        }
+      })
+    })
+    setNodes(newNodes)
+    handleSyncWorkflowDraft()
+    saveStateToHistory(WorkflowHistoryEvent.NodeResize)
+  }, [getNodesReadOnly, store, handleSyncWorkflowDraft, saveStateToHistory])
+
+  const handleNodeDisconnect = useCallback((nodeId: string) => {
+    if (getNodesReadOnly())
+      return
+
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+    const nodes = getNodes()
+    const currentNode = nodes.find(node => node.id === nodeId)!
+    const connectedEdges = getConnectedEdges([currentNode], edges)
+    const nodesConnectedSourceOrTargetHandleIdsMap = getNodesConnectedSourceOrTargetHandleIdsMap(
+      connectedEdges.map(edge => ({ type: 'remove', edge })),
+      nodes,
+    )
+    const newNodes = produce(nodes, (draft: Node[]) => {
+      draft.forEach((node) => {
+        if (nodesConnectedSourceOrTargetHandleIdsMap[node.id]) {
+          node.data = {
+            ...node.data,
+            ...nodesConnectedSourceOrTargetHandleIdsMap[node.id],
+          }
+        }
+      })
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      return draft.filter(edge => !connectedEdges.find(connectedEdge => connectedEdge.id === edge.id))
+    })
+    setEdges(newEdges)
+    handleSyncWorkflowDraft()
+    saveStateToHistory(WorkflowHistoryEvent.EdgeDelete)
+  }, [store, getNodesReadOnly, handleSyncWorkflowDraft, saveStateToHistory])
+
+  const handleHistoryBack = useCallback(() => {
+    if (getNodesReadOnly() || getWorkflowReadOnly())
+      return
+
+    const { setEdges, setNodes } = store.getState()
+    undo()
+
+    const { edges, nodes } = workflowHistoryStore.getState()
+    if (edges.length === 0 && nodes.length === 0)
+      return
+
+    setEdges(edges)
+    setNodes(nodes)
+  }, [store, undo, workflowHistoryStore, getNodesReadOnly, getWorkflowReadOnly])
+
+  const handleHistoryForward = useCallback(() => {
+    if (getNodesReadOnly() || getWorkflowReadOnly())
+      return
+
+    const { setEdges, setNodes } = store.getState()
+    redo()
+
+    const { edges, nodes } = workflowHistoryStore.getState()
+    if (edges.length === 0 && nodes.length === 0)
+      return
+
+    setEdges(edges)
+    setNodes(nodes)
+  }, [redo, store, workflowHistoryStore, getNodesReadOnly, getWorkflowReadOnly])
+
+  return {
+    handleNodeDragStart,
+    handleNodeDrag,
+    handleNodeDragStop,
+    handleNodeEnter,
+    handleNodeLeave,
+    handleNodeSelect,
+    handleNodeClick,
+    handleNodeConnect,
+    handleNodeConnectStart,
+    handleNodeConnectEnd,
+    handleNodeDelete,
+    handleNodeChange,
+    handleNodeAdd,
+    handleNodesCancelSelected,
+    handleNodeContextMenu,
+    handleNodesCopy,
+    handleNodesPaste,
+    handleNodesDuplicate,
+    handleNodesDelete,
+    handleNodeResize,
+    handleNodeDisconnect,
+    handleHistoryBack,
+    handleHistoryForward,
+  }
+}
diff --git a/app/components/workflow/hooks/use-nodes-layout.ts b/app/components/workflow/hooks/use-nodes-layout.ts
new file mode 100644
index 0000000..594ac8b
--- /dev/null
+++ b/app/components/workflow/hooks/use-nodes-layout.ts
@@ -0,0 +1,96 @@
+import { useCallback } from 'react'
+import ELK from 'elkjs/lib/elk.bundled.js'
+import {
+  useReactFlow,
+  useStoreApi,
+} from 'reactflow'
+import { cloneDeep } from 'lodash-es'
+import type {
+  Edge,
+  Node,
+} from '../types'
+import { useWorkflowStore } from '../store'
+import { AUTO_LAYOUT_OFFSET } from '../constants'
+import { useNodesSyncDraft } from './use-nodes-sync-draft'
+
+const layoutOptions = {
+  'elk.algorithm': 'layered',
+  'elk.direction': 'RIGHT',
+  'elk.layered.spacing.nodeNodeBetweenLayers': '60',
+  'elk.spacing.nodeNode': '40',
+  'elk.layered.nodePlacement.strategy': 'SIMPLE',
+}
+
+const elk = new ELK()
+
+export const getLayoutedNodes = async (nodes: Node[], edges: Edge[]) => {
+  const graph = {
+    id: 'root',
+    layoutOptions,
+    children: nodes.map((n) => {
+      return {
+        ...n,
+        width: n.width ?? 150,
+        height: n.height ?? 50,
+        targetPosition: 'left',
+        sourcePosition: 'right',
+      }
+    }),
+    edges: cloneDeep(edges),
+  }
+
+  const layoutedGraph = await elk.layout(graph as any)
+  const layoutedNodes = nodes.map((node) => {
+    const layoutedNode = layoutedGraph.children?.find(
+      lgNode => lgNode.id === node.id,
+    )
+
+    return {
+      ...node,
+      position: {
+        x: (layoutedNode?.x ?? 0) + AUTO_LAYOUT_OFFSET.x,
+        y: (layoutedNode?.y ?? 0) + AUTO_LAYOUT_OFFSET.y,
+      },
+    }
+  })
+
+  return {
+    layoutedNodes,
+  }
+}
+
+export const useNodesLayout = () => {
+  const store = useStoreApi()
+  const reactflow = useReactFlow()
+  const workflowStore = useWorkflowStore()
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+
+  const handleNodesLayout = useCallback(async () => {
+    workflowStore.setState({ nodeAnimation: true })
+    const {
+      getNodes,
+      edges,
+      setNodes,
+    } = store.getState()
+    const { setViewport } = reactflow
+    const nodes = getNodes()
+    const {
+      layoutedNodes,
+    } = await getLayoutedNodes(nodes, edges)
+
+    setNodes(layoutedNodes)
+    const zoom = 0.7
+    setViewport({
+      x: 0,
+      y: 0,
+      zoom,
+    })
+    setTimeout(() => {
+      handleSyncWorkflowDraft()
+    })
+  }, [store, reactflow, handleSyncWorkflowDraft, workflowStore])
+
+  return {
+    handleNodesLayout,
+  }
+}
diff --git a/app/components/workflow/hooks/use-nodes-sync-draft.ts b/app/components/workflow/hooks/use-nodes-sync-draft.ts
new file mode 100644
index 0000000..e6cc3a9
--- /dev/null
+++ b/app/components/workflow/hooks/use-nodes-sync-draft.ts
@@ -0,0 +1,39 @@
+import { useCallback } from 'react'
+import {
+  useStore,
+} from '../store'
+import {
+  useNodesReadOnly,
+} from './use-workflow'
+import { useHooksStore } from '@/app/components/workflow/hooks-store'
+
+export const useNodesSyncDraft = () => {
+  const { getNodesReadOnly } = useNodesReadOnly()
+  const debouncedSyncWorkflowDraft = useStore(s => s.debouncedSyncWorkflowDraft)
+  const doSyncWorkflowDraft = useHooksStore(s => s.doSyncWorkflowDraft)
+  const syncWorkflowDraftWhenPageClose = useHooksStore(s => s.syncWorkflowDraftWhenPageClose)
+
+  const handleSyncWorkflowDraft = useCallback((
+    sync?: boolean,
+    notRefreshWhenSyncError?: boolean,
+    callback?: {
+      onSuccess?: () => void
+      onError?: () => void
+      onSettled?: () => void
+    },
+  ) => {
+    if (getNodesReadOnly())
+      return
+
+    if (sync)
+      doSyncWorkflowDraft(notRefreshWhenSyncError, callback)
+    else
+      debouncedSyncWorkflowDraft(doSyncWorkflowDraft)
+  }, [debouncedSyncWorkflowDraft, doSyncWorkflowDraft, getNodesReadOnly])
+
+  return {
+    doSyncWorkflowDraft,
+    handleSyncWorkflowDraft,
+    syncWorkflowDraftWhenPageClose,
+  }
+}
diff --git a/app/components/workflow/hooks/use-panel-interactions.ts b/app/components/workflow/hooks/use-panel-interactions.ts
new file mode 100644
index 0000000..1f02ac7
--- /dev/null
+++ b/app/components/workflow/hooks/use-panel-interactions.ts
@@ -0,0 +1,37 @@
+import type { MouseEvent } from 'react'
+import { useCallback } from 'react'
+import { useWorkflowStore } from '../store'
+
+export const usePanelInteractions = () => {
+  const workflowStore = useWorkflowStore()
+
+  const handlePaneContextMenu = useCallback((e: MouseEvent) => {
+    e.preventDefault()
+    const container = document.querySelector('#workflow-container')
+    const { x, y } = container!.getBoundingClientRect()
+    workflowStore.setState({
+      panelMenu: {
+        top: e.clientY - y,
+        left: e.clientX - x,
+      },
+    })
+  }, [workflowStore])
+
+  const handlePaneContextmenuCancel = useCallback(() => {
+    workflowStore.setState({
+      panelMenu: undefined,
+    })
+  }, [workflowStore])
+
+  const handleNodeContextmenuCancel = useCallback(() => {
+    workflowStore.setState({
+      nodeMenu: undefined,
+    })
+  }, [workflowStore])
+
+  return {
+    handlePaneContextMenu,
+    handlePaneContextmenuCancel,
+    handleNodeContextmenuCancel,
+  }
+}
diff --git a/app/components/workflow/hooks/use-selection-interactions.ts b/app/components/workflow/hooks/use-selection-interactions.ts
new file mode 100644
index 0000000..36aa048
--- /dev/null
+++ b/app/components/workflow/hooks/use-selection-interactions.ts
@@ -0,0 +1,140 @@
+import type { MouseEvent } from 'react'
+import {
+  useCallback,
+} from 'react'
+import produce from 'immer'
+import type {
+  OnSelectionChangeFunc,
+} from 'reactflow'
+import { useStoreApi } from 'reactflow'
+import { useWorkflowStore } from '../store'
+import type { Node } from '../types'
+
+export const useSelectionInteractions = () => {
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+
+  const handleSelectionStart = useCallback(() => {
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+      userSelectionRect,
+    } = store.getState()
+
+    if (!userSelectionRect?.width || !userSelectionRect?.height) {
+      const nodes = getNodes()
+      const newNodes = produce(nodes, (draft) => {
+        draft.forEach((node) => {
+          if (node.data._isBundled)
+            node.data._isBundled = false
+        })
+      })
+      setNodes(newNodes)
+      const newEdges = produce(edges, (draft) => {
+        draft.forEach((edge) => {
+          if (edge.data._isBundled)
+            edge.data._isBundled = false
+        })
+      })
+      setEdges(newEdges)
+    }
+  }, [store])
+
+  const handleSelectionChange = useCallback<OnSelectionChangeFunc>(({ nodes: nodesInSelection, edges: edgesInSelection }) => {
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+      userSelectionRect,
+    } = store.getState()
+
+    const nodes = getNodes()
+
+    if (!userSelectionRect?.width || !userSelectionRect?.height)
+      return
+
+    const newNodes = produce(nodes, (draft) => {
+      draft.forEach((node) => {
+        const nodeInSelection = nodesInSelection.find(n => n.id === node.id)
+
+        if (nodeInSelection)
+          node.data._isBundled = true
+        else
+          node.data._isBundled = false
+      })
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      draft.forEach((edge) => {
+        const edgeInSelection = edgesInSelection.find(e => e.id === edge.id)
+
+        if (edgeInSelection)
+          edge.data._isBundled = true
+        else
+          edge.data._isBundled = false
+      })
+    })
+    setEdges(newEdges)
+  }, [store])
+
+  const handleSelectionDrag = useCallback((_: MouseEvent, nodesWithDrag: Node[]) => {
+    const {
+      getNodes,
+      setNodes,
+    } = store.getState()
+
+    workflowStore.setState({
+      nodeAnimation: false,
+    })
+    const nodes = getNodes()
+    const newNodes = produce(nodes, (draft) => {
+      draft.forEach((node) => {
+        const dragNode = nodesWithDrag.find(n => n.id === node.id)
+
+        if (dragNode)
+          node.position = dragNode.position
+      })
+    })
+    setNodes(newNodes)
+  }, [store, workflowStore])
+
+  const handleSelectionCancel = useCallback(() => {
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+
+    store.setState({
+      userSelectionRect: null,
+      userSelectionActive: true,
+    })
+
+    const nodes = getNodes()
+    const newNodes = produce(nodes, (draft) => {
+      draft.forEach((node) => {
+        if (node.data._isBundled)
+          node.data._isBundled = false
+      })
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      draft.forEach((edge) => {
+        if (edge.data._isBundled)
+          edge.data._isBundled = false
+      })
+    })
+    setEdges(newEdges)
+  }, [store])
+
+  return {
+    handleSelectionStart,
+    handleSelectionChange,
+    handleSelectionDrag,
+    handleSelectionCancel,
+  }
+}
diff --git a/app/components/workflow/hooks/use-shortcuts.ts b/app/components/workflow/hooks/use-shortcuts.ts
new file mode 100644
index 0000000..8b1003e
--- /dev/null
+++ b/app/components/workflow/hooks/use-shortcuts.ts
@@ -0,0 +1,202 @@
+import { useReactFlow } from 'reactflow'
+import { useKeyPress } from 'ahooks'
+import { useCallback } from 'react'
+import {
+  getKeyboardKeyCodeBySystem,
+  isEventTargetInputArea,
+} from '../utils'
+import { useWorkflowHistoryStore } from '../workflow-history-store'
+import { useWorkflowStore } from '../store'
+import {
+  useEdgesInteractions,
+  useNodesInteractions,
+  useNodesSyncDraft,
+  useWorkflowMoveMode,
+  useWorkflowOrganize,
+  useWorkflowStartRun,
+} from '.'
+
+export const useShortcuts = (): void => {
+  const {
+    handleNodesCopy,
+    handleNodesPaste,
+    handleNodesDuplicate,
+    handleNodesDelete,
+    handleHistoryBack,
+    handleHistoryForward,
+  } = useNodesInteractions()
+  const { handleStartWorkflowRun } = useWorkflowStartRun()
+  const { shortcutsEnabled: workflowHistoryShortcutsEnabled } = useWorkflowHistoryStore()
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+  const { handleEdgeDelete } = useEdgesInteractions()
+  const workflowStore = useWorkflowStore()
+  const {
+    handleModeHand,
+    handleModePointer,
+  } = useWorkflowMoveMode()
+  const { handleLayout } = useWorkflowOrganize()
+
+  const {
+    zoomTo,
+    getZoom,
+    fitView,
+  } = useReactFlow()
+
+  // Zoom out to a minimum of 0.5 for shortcut
+  const constrainedZoomOut = () => {
+    const currentZoom = getZoom()
+    const newZoom = Math.max(currentZoom - 0.1, 0.5)
+    zoomTo(newZoom)
+  }
+
+  // Zoom in to a maximum of 1 for shortcut
+  const constrainedZoomIn = () => {
+    const currentZoom = getZoom()
+    const newZoom = Math.min(currentZoom + 0.1, 1)
+    zoomTo(newZoom)
+  }
+
+  const shouldHandleShortcut = useCallback((e: KeyboardEvent) => {
+    const { showFeaturesPanel } = workflowStore.getState()
+    return !showFeaturesPanel && !isEventTargetInputArea(e.target as HTMLElement)
+  }, [workflowStore])
+
+  useKeyPress(['delete', 'backspace'], (e) => {
+    if (shouldHandleShortcut(e)) {
+      e.preventDefault()
+      handleNodesDelete()
+      handleEdgeDelete()
+    }
+  })
+
+  useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.c`, (e) => {
+    const { showDebugAndPreviewPanel } = workflowStore.getState()
+    if (shouldHandleShortcut(e) && !showDebugAndPreviewPanel) {
+      e.preventDefault()
+      handleNodesCopy()
+    }
+  }, { exactMatch: true, useCapture: true })
+
+  useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.v`, (e) => {
+    const { showDebugAndPreviewPanel } = workflowStore.getState()
+    if (shouldHandleShortcut(e) && !showDebugAndPreviewPanel) {
+      e.preventDefault()
+      handleNodesPaste()
+    }
+  }, { exactMatch: true, useCapture: true })
+
+  useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.d`, (e) => {
+    if (shouldHandleShortcut(e)) {
+      e.preventDefault()
+      handleNodesDuplicate()
+    }
+  }, { exactMatch: true, useCapture: true })
+
+  useKeyPress(`${getKeyboardKeyCodeBySystem('alt')}.r`, (e) => {
+    if (shouldHandleShortcut(e)) {
+      e.preventDefault()
+      handleStartWorkflowRun()
+    }
+  }, { exactMatch: true, useCapture: true })
+
+  useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.z`, (e) => {
+    const { showDebugAndPreviewPanel } = workflowStore.getState()
+    if (shouldHandleShortcut(e) && !showDebugAndPreviewPanel) {
+      e.preventDefault()
+      workflowHistoryShortcutsEnabled && handleHistoryBack()
+    }
+  }, { exactMatch: true, useCapture: true })
+
+  useKeyPress(
+    [`${getKeyboardKeyCodeBySystem('ctrl')}.y`, `${getKeyboardKeyCodeBySystem('ctrl')}.shift.z`],
+    (e) => {
+      if (shouldHandleShortcut(e)) {
+        e.preventDefault()
+        workflowHistoryShortcutsEnabled && handleHistoryForward()
+      }
+    },
+    { exactMatch: true, useCapture: true },
+  )
+
+  useKeyPress('h', (e) => {
+    if (shouldHandleShortcut(e)) {
+      e.preventDefault()
+      handleModeHand()
+    }
+  }, {
+    exactMatch: true,
+    useCapture: true,
+  })
+
+  useKeyPress('v', (e) => {
+    if (shouldHandleShortcut(e)) {
+      e.preventDefault()
+      handleModePointer()
+    }
+  }, {
+    exactMatch: true,
+    useCapture: true,
+  })
+
+  useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.o`, (e) => {
+    if (shouldHandleShortcut(e)) {
+      e.preventDefault()
+      handleLayout()
+    }
+  }, { exactMatch: true, useCapture: true })
+
+  useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.1`, (e) => {
+    if (shouldHandleShortcut(e)) {
+      e.preventDefault()
+      fitView()
+      handleSyncWorkflowDraft()
+    }
+  }, {
+    exactMatch: true,
+    useCapture: true,
+  })
+
+  useKeyPress('shift.1', (e) => {
+    if (shouldHandleShortcut(e)) {
+      e.preventDefault()
+      zoomTo(1)
+      handleSyncWorkflowDraft()
+    }
+  }, {
+    exactMatch: true,
+    useCapture: true,
+  })
+
+  useKeyPress('shift.5', (e) => {
+    if (shouldHandleShortcut(e)) {
+      e.preventDefault()
+      zoomTo(0.5)
+      handleSyncWorkflowDraft()
+    }
+  }, {
+    exactMatch: true,
+    useCapture: true,
+  })
+
+  useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.dash`, (e) => {
+    if (shouldHandleShortcut(e)) {
+      e.preventDefault()
+      constrainedZoomOut()
+      handleSyncWorkflowDraft()
+    }
+  }, {
+    exactMatch: true,
+    useCapture: true,
+  })
+
+  useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.equalsign`, (e) => {
+    if (shouldHandleShortcut(e)) {
+      e.preventDefault()
+      constrainedZoomIn()
+      handleSyncWorkflowDraft()
+    }
+  }, {
+    exactMatch: true,
+    useCapture: true,
+  })
+}
diff --git a/app/components/workflow/hooks/use-workflow-history.ts b/app/components/workflow/hooks/use-workflow-history.ts
new file mode 100644
index 0000000..592c0b0
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-history.ts
@@ -0,0 +1,150 @@
+import {
+  useCallback,
+  useRef, useState,
+} from 'react'
+import { debounce } from 'lodash-es'
+import {
+  useStoreApi,
+} from 'reactflow'
+import { useTranslation } from 'react-i18next'
+import { useWorkflowHistoryStore } from '../workflow-history-store'
+
+/**
+ * All supported Events that create a new history state.
+ * Current limitations:
+ * - InputChange events in Node Panels do not trigger state changes.
+ * - Resizing UI elements does not trigger state changes.
+ */
+export enum WorkflowHistoryEvent {
+  NodeTitleChange = 'NodeTitleChange',
+  NodeDescriptionChange = 'NodeDescriptionChange',
+  NodeDragStop = 'NodeDragStop',
+  NodeChange = 'NodeChange',
+  NodeConnect = 'NodeConnect',
+  NodePaste = 'NodePaste',
+  NodeDelete = 'NodeDelete',
+  EdgeDelete = 'EdgeDelete',
+  EdgeDeleteByDeleteBranch = 'EdgeDeleteByDeleteBranch',
+  NodeAdd = 'NodeAdd',
+  NodeResize = 'NodeResize',
+  NoteAdd = 'NoteAdd',
+  NoteChange = 'NoteChange',
+  NoteDelete = 'NoteDelete',
+  LayoutOrganize = 'LayoutOrganize',
+}
+
+export const useWorkflowHistory = () => {
+  const store = useStoreApi()
+  const { store: workflowHistoryStore } = useWorkflowHistoryStore()
+  const { t } = useTranslation()
+
+  const [undoCallbacks, setUndoCallbacks] = useState<any[]>([])
+  const [redoCallbacks, setRedoCallbacks] = useState<any[]>([])
+
+  const onUndo = useCallback((callback: unknown) => {
+    setUndoCallbacks((prev: any) => [...prev, callback])
+    return () => setUndoCallbacks(prev => prev.filter(cb => cb !== callback))
+  }, [])
+
+  const onRedo = useCallback((callback: unknown) => {
+    setRedoCallbacks((prev: any) => [...prev, callback])
+    return () => setRedoCallbacks(prev => prev.filter(cb => cb !== callback))
+  }, [])
+
+  const undo = useCallback(() => {
+    workflowHistoryStore.temporal.getState().undo()
+    undoCallbacks.forEach(callback => callback())
+  }, [undoCallbacks, workflowHistoryStore.temporal])
+
+  const redo = useCallback(() => {
+    workflowHistoryStore.temporal.getState().redo()
+    redoCallbacks.forEach(callback => callback())
+  }, [redoCallbacks, workflowHistoryStore.temporal])
+
+  // Some events may be triggered multiple times in a short period of time.
+  // We debounce the history state update to avoid creating multiple history states
+  // with minimal changes.
+  const saveStateToHistoryRef = useRef(debounce((event: WorkflowHistoryEvent) => {
+    workflowHistoryStore.setState({
+      workflowHistoryEvent: event,
+      nodes: store.getState().getNodes(),
+      edges: store.getState().edges,
+    })
+  }, 500))
+
+  const saveStateToHistory = useCallback((event: WorkflowHistoryEvent) => {
+    switch (event) {
+      case WorkflowHistoryEvent.NoteChange:
+        // Hint: Note change does not trigger when note text changes,
+        // because the note editors have their own history states.
+        saveStateToHistoryRef.current(event)
+        break
+      case WorkflowHistoryEvent.NodeTitleChange:
+      case WorkflowHistoryEvent.NodeDescriptionChange:
+      case WorkflowHistoryEvent.NodeDragStop:
+      case WorkflowHistoryEvent.NodeChange:
+      case WorkflowHistoryEvent.NodeConnect:
+      case WorkflowHistoryEvent.NodePaste:
+      case WorkflowHistoryEvent.NodeDelete:
+      case WorkflowHistoryEvent.EdgeDelete:
+      case WorkflowHistoryEvent.EdgeDeleteByDeleteBranch:
+      case WorkflowHistoryEvent.NodeAdd:
+      case WorkflowHistoryEvent.NodeResize:
+      case WorkflowHistoryEvent.NoteAdd:
+      case WorkflowHistoryEvent.LayoutOrganize:
+      case WorkflowHistoryEvent.NoteDelete:
+        saveStateToHistoryRef.current(event)
+        break
+      default:
+        // We do not create a history state for every event.
+        // Some events of reactflow may change things the user would not want to undo/redo.
+        // For example: UI state changes like selecting a node.
+        break
+    }
+  }, [])
+
+  const getHistoryLabel = useCallback((event: WorkflowHistoryEvent) => {
+    switch (event) {
+      case WorkflowHistoryEvent.NodeTitleChange:
+        return t('workflow.changeHistory.nodeTitleChange')
+      case WorkflowHistoryEvent.NodeDescriptionChange:
+        return t('workflow.changeHistory.nodeDescriptionChange')
+      case WorkflowHistoryEvent.LayoutOrganize:
+      case WorkflowHistoryEvent.NodeDragStop:
+        return t('workflow.changeHistory.nodeDragStop')
+      case WorkflowHistoryEvent.NodeChange:
+        return t('workflow.changeHistory.nodeChange')
+      case WorkflowHistoryEvent.NodeConnect:
+        return t('workflow.changeHistory.nodeConnect')
+      case WorkflowHistoryEvent.NodePaste:
+        return t('workflow.changeHistory.nodePaste')
+      case WorkflowHistoryEvent.NodeDelete:
+        return t('workflow.changeHistory.nodeDelete')
+      case WorkflowHistoryEvent.NodeAdd:
+        return t('workflow.changeHistory.nodeAdd')
+      case WorkflowHistoryEvent.EdgeDelete:
+      case WorkflowHistoryEvent.EdgeDeleteByDeleteBranch:
+        return t('workflow.changeHistory.edgeDelete')
+      case WorkflowHistoryEvent.NodeResize:
+        return t('workflow.changeHistory.nodeResize')
+      case WorkflowHistoryEvent.NoteAdd:
+        return t('workflow.changeHistory.noteAdd')
+      case WorkflowHistoryEvent.NoteChange:
+        return t('workflow.changeHistory.noteChange')
+      case WorkflowHistoryEvent.NoteDelete:
+        return t('workflow.changeHistory.noteDelete')
+      default:
+        return 'Unknown Event'
+    }
+  }, [t])
+
+  return {
+    store: workflowHistoryStore,
+    saveStateToHistory,
+    getHistoryLabel,
+    undo,
+    redo,
+    onUndo,
+    onRedo,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-interactions.ts b/app/components/workflow/hooks/use-workflow-interactions.ts
new file mode 100644
index 0000000..636d3b9
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-interactions.ts
@@ -0,0 +1,403 @@
+import {
+  useCallback,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { useReactFlow, useStoreApi } from 'reactflow'
+import produce from 'immer'
+import { useStore, useWorkflowStore } from '../store'
+import {
+  CUSTOM_NODE, DSL_EXPORT_CHECK,
+  NODE_LAYOUT_HORIZONTAL_PADDING,
+  NODE_LAYOUT_VERTICAL_PADDING,
+  WORKFLOW_DATA_UPDATE,
+} from '../constants'
+import type { Node, WorkflowDataUpdater } from '../types'
+import { BlockEnum, ControlMode } from '../types'
+import {
+  getLayoutByDagre,
+  getLayoutForChildNodes,
+  initialEdges,
+  initialNodes,
+} from '../utils'
+import {
+  useNodesReadOnly,
+  useSelectionInteractions,
+  useWorkflowReadOnly,
+} from '../hooks'
+import { useEdgesInteractionsWithoutSync } from './use-edges-interactions-without-sync'
+import { useNodesInteractionsWithoutSync } from './use-nodes-interactions-without-sync'
+import { useNodesSyncDraft } from './use-nodes-sync-draft'
+import { WorkflowHistoryEvent, useWorkflowHistory } from './use-workflow-history'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { fetchWorkflowDraft } from '@/service/workflow'
+import { exportAppConfig } from '@/service/apps'
+import { useToastContext } from '@/app/components/base/toast'
+import { useStore as useAppStore } from '@/app/components/app/store'
+
+export const useWorkflowInteractions = () => {
+  const workflowStore = useWorkflowStore()
+  const { handleNodeCancelRunningStatus } = useNodesInteractionsWithoutSync()
+  const { handleEdgeCancelRunningStatus } = useEdgesInteractionsWithoutSync()
+
+  const handleCancelDebugAndPreviewPanel = useCallback(() => {
+    workflowStore.setState({
+      showDebugAndPreviewPanel: false,
+      workflowRunningData: undefined,
+    })
+    handleNodeCancelRunningStatus()
+    handleEdgeCancelRunningStatus()
+  }, [workflowStore, handleNodeCancelRunningStatus, handleEdgeCancelRunningStatus])
+
+  return {
+    handleCancelDebugAndPreviewPanel,
+  }
+}
+
+export const useWorkflowMoveMode = () => {
+  const setControlMode = useStore(s => s.setControlMode)
+  const {
+    getNodesReadOnly,
+  } = useNodesReadOnly()
+  const { handleSelectionCancel } = useSelectionInteractions()
+
+  const handleModePointer = useCallback(() => {
+    if (getNodesReadOnly())
+      return
+
+    setControlMode(ControlMode.Pointer)
+  }, [getNodesReadOnly, setControlMode])
+
+  const handleModeHand = useCallback(() => {
+    if (getNodesReadOnly())
+      return
+
+    setControlMode(ControlMode.Hand)
+    handleSelectionCancel()
+  }, [getNodesReadOnly, setControlMode, handleSelectionCancel])
+
+  return {
+    handleModePointer,
+    handleModeHand,
+  }
+}
+
+export const useWorkflowOrganize = () => {
+  const workflowStore = useWorkflowStore()
+  const store = useStoreApi()
+  const reactflow = useReactFlow()
+  const { getNodesReadOnly } = useNodesReadOnly()
+  const { saveStateToHistory } = useWorkflowHistory()
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+
+  const handleLayout = useCallback(async () => {
+    if (getNodesReadOnly())
+      return
+    workflowStore.setState({ nodeAnimation: true })
+    const {
+      getNodes,
+      edges,
+      setNodes,
+    } = store.getState()
+    const { setViewport } = reactflow
+    const nodes = getNodes()
+
+    const loopAndIterationNodes = nodes.filter(
+      node => (node.data.type === BlockEnum.Loop || node.data.type === BlockEnum.Iteration)
+              && !node.parentId
+              && node.type === CUSTOM_NODE,
+    )
+
+    const childLayoutsMap: Record<string, any> = {}
+    loopAndIterationNodes.forEach((node) => {
+      childLayoutsMap[node.id] = getLayoutForChildNodes(node.id, nodes, edges)
+    })
+
+    const containerSizeChanges: Record<string, { width: number, height: number }> = {}
+
+    loopAndIterationNodes.forEach((parentNode) => {
+      const childLayout = childLayoutsMap[parentNode.id]
+      if (!childLayout) return
+
+      let minX = Infinity
+      let minY = Infinity
+      let maxX = -Infinity
+      let maxY = -Infinity
+      let hasChildren = false
+
+      const childNodes = nodes.filter(node => node.parentId === parentNode.id)
+
+      childNodes.forEach((node) => {
+        if (childLayout.node(node.id)) {
+          hasChildren = true
+          const childNodeWithPosition = childLayout.node(node.id)
+
+          const nodeX = childNodeWithPosition.x - node.width! / 2
+          const nodeY = childNodeWithPosition.y - node.height! / 2
+
+          minX = Math.min(minX, nodeX)
+          minY = Math.min(minY, nodeY)
+          maxX = Math.max(maxX, nodeX + node.width!)
+          maxY = Math.max(maxY, nodeY + node.height!)
+        }
+      })
+
+      if (hasChildren) {
+        const requiredWidth = maxX - minX + NODE_LAYOUT_HORIZONTAL_PADDING * 2
+        const requiredHeight = maxY - minY + NODE_LAYOUT_VERTICAL_PADDING * 2
+
+        containerSizeChanges[parentNode.id] = {
+          width: Math.max(parentNode.width || 0, requiredWidth),
+          height: Math.max(parentNode.height || 0, requiredHeight),
+        }
+      }
+    })
+
+    const nodesWithUpdatedSizes = produce(nodes, (draft) => {
+      draft.forEach((node) => {
+        if ((node.data.type === BlockEnum.Loop || node.data.type === BlockEnum.Iteration)
+            && containerSizeChanges[node.id]) {
+          node.width = containerSizeChanges[node.id].width
+          node.height = containerSizeChanges[node.id].height
+
+          if (node.data.type === BlockEnum.Loop) {
+            node.data.width = containerSizeChanges[node.id].width
+            node.data.height = containerSizeChanges[node.id].height
+          }
+          else if (node.data.type === BlockEnum.Iteration) {
+            node.data.width = containerSizeChanges[node.id].width
+            node.data.height = containerSizeChanges[node.id].height
+          }
+        }
+      })
+    })
+
+    const layout = getLayoutByDagre(nodesWithUpdatedSizes, edges)
+
+    const rankMap = {} as Record<string, Node>
+    nodesWithUpdatedSizes.forEach((node) => {
+      if (!node.parentId && node.type === CUSTOM_NODE) {
+        const rank = layout.node(node.id).rank!
+
+        if (!rankMap[rank]) {
+          rankMap[rank] = node
+        }
+        else {
+          if (rankMap[rank].position.y > node.position.y)
+            rankMap[rank] = node
+        }
+      }
+    })
+
+    const newNodes = produce(nodesWithUpdatedSizes, (draft) => {
+      draft.forEach((node) => {
+        if (!node.parentId && node.type === CUSTOM_NODE) {
+          const nodeWithPosition = layout.node(node.id)
+
+          node.position = {
+            x: nodeWithPosition.x - node.width! / 2,
+            y: nodeWithPosition.y - node.height! / 2 + rankMap[nodeWithPosition.rank!].height! / 2,
+          }
+        }
+      })
+
+      loopAndIterationNodes.forEach((parentNode) => {
+        const childLayout = childLayoutsMap[parentNode.id]
+        if (!childLayout) return
+
+        const childNodes = draft.filter(node => node.parentId === parentNode.id)
+
+        let minX = Infinity
+        let minY = Infinity
+
+        childNodes.forEach((node) => {
+          if (childLayout.node(node.id)) {
+            const childNodeWithPosition = childLayout.node(node.id)
+            const nodeX = childNodeWithPosition.x - node.width! / 2
+            const nodeY = childNodeWithPosition.y - node.height! / 2
+
+            minX = Math.min(minX, nodeX)
+            minY = Math.min(minY, nodeY)
+          }
+        })
+
+        childNodes.forEach((node) => {
+          if (childLayout.node(node.id)) {
+            const childNodeWithPosition = childLayout.node(node.id)
+
+            node.position = {
+              x: NODE_LAYOUT_HORIZONTAL_PADDING + (childNodeWithPosition.x - node.width! / 2 - minX),
+              y: NODE_LAYOUT_VERTICAL_PADDING + (childNodeWithPosition.y - node.height! / 2 - minY),
+            }
+          }
+        })
+      })
+    })
+
+    setNodes(newNodes)
+    const zoom = 0.7
+    setViewport({
+      x: 0,
+      y: 0,
+      zoom,
+    })
+    saveStateToHistory(WorkflowHistoryEvent.LayoutOrganize)
+    setTimeout(() => {
+      handleSyncWorkflowDraft()
+    })
+  }, [getNodesReadOnly, store, reactflow, workflowStore, handleSyncWorkflowDraft, saveStateToHistory])
+
+  return {
+    handleLayout,
+  }
+}
+
+export const useWorkflowZoom = () => {
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+  const { getWorkflowReadOnly } = useWorkflowReadOnly()
+  const {
+    zoomIn,
+    zoomOut,
+    zoomTo,
+    fitView,
+  } = useReactFlow()
+
+  const handleFitView = useCallback(() => {
+    if (getWorkflowReadOnly())
+      return
+
+    fitView()
+    handleSyncWorkflowDraft()
+  }, [getWorkflowReadOnly, fitView, handleSyncWorkflowDraft])
+
+  const handleBackToOriginalSize = useCallback(() => {
+    if (getWorkflowReadOnly())
+      return
+
+    zoomTo(1)
+    handleSyncWorkflowDraft()
+  }, [getWorkflowReadOnly, zoomTo, handleSyncWorkflowDraft])
+
+  const handleSizeToHalf = useCallback(() => {
+    if (getWorkflowReadOnly())
+      return
+
+    zoomTo(0.5)
+    handleSyncWorkflowDraft()
+  }, [getWorkflowReadOnly, zoomTo, handleSyncWorkflowDraft])
+
+  const handleZoomOut = useCallback(() => {
+    if (getWorkflowReadOnly())
+      return
+
+    zoomOut()
+    handleSyncWorkflowDraft()
+  }, [getWorkflowReadOnly, zoomOut, handleSyncWorkflowDraft])
+
+  const handleZoomIn = useCallback(() => {
+    if (getWorkflowReadOnly())
+      return
+
+    zoomIn()
+    handleSyncWorkflowDraft()
+  }, [getWorkflowReadOnly, zoomIn, handleSyncWorkflowDraft])
+
+  return {
+    handleFitView,
+    handleBackToOriginalSize,
+    handleSizeToHalf,
+    handleZoomOut,
+    handleZoomIn,
+  }
+}
+
+export const useWorkflowUpdate = () => {
+  const reactflow = useReactFlow()
+  const { eventEmitter } = useEventEmitterContextContext()
+
+  const handleUpdateWorkflowCanvas = useCallback((payload: WorkflowDataUpdater) => {
+    const {
+      nodes,
+      edges,
+      viewport,
+    } = payload
+    const { setViewport } = reactflow
+    eventEmitter?.emit({
+      type: WORKFLOW_DATA_UPDATE,
+      payload: {
+        nodes: initialNodes(nodes, edges),
+        edges: initialEdges(edges, nodes),
+      },
+    } as any)
+    setViewport(viewport)
+  }, [eventEmitter, reactflow])
+
+  return {
+    handleUpdateWorkflowCanvas,
+  }
+}
+
+export const useDSL = () => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const { eventEmitter } = useEventEmitterContextContext()
+  const [exporting, setExporting] = useState(false)
+  const { doSyncWorkflowDraft } = useNodesSyncDraft()
+
+  const appDetail = useAppStore(s => s.appDetail)
+
+  const handleExportDSL = useCallback(async (include = false) => {
+    if (!appDetail)
+      return
+
+    if (exporting)
+      return
+
+    try {
+      setExporting(true)
+      await doSyncWorkflowDraft()
+      const { data } = await exportAppConfig({
+        appID: appDetail.id,
+        include,
+      })
+      const a = document.createElement('a')
+      const file = new Blob([data], { type: 'application/yaml' })
+      a.href = URL.createObjectURL(file)
+      a.download = `${appDetail.name}.yml`
+      a.click()
+    }
+    catch {
+      notify({ type: 'error', message: t('app.exportFailed') })
+    }
+    finally {
+      setExporting(false)
+    }
+  }, [appDetail, notify, t, doSyncWorkflowDraft, exporting])
+
+  const exportCheck = useCallback(async () => {
+    if (!appDetail)
+      return
+    try {
+      const workflowDraft = await fetchWorkflowDraft(`/apps/${appDetail?.id}/workflows/draft`)
+      const list = (workflowDraft.environment_variables || []).filter(env => env.value_type === 'secret')
+      if (list.length === 0) {
+        handleExportDSL()
+        return
+      }
+      eventEmitter?.emit({
+        type: DSL_EXPORT_CHECK,
+        payload: {
+          data: list,
+        },
+      } as any)
+    }
+    catch {
+      notify({ type: 'error', message: t('app.exportFailed') })
+    }
+  }, [appDetail, eventEmitter, handleExportDSL, notify, t])
+
+  return {
+    exportCheck,
+    handleExportDSL,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-mode.ts b/app/components/workflow/hooks/use-workflow-mode.ts
new file mode 100644
index 0000000..5ac0f63
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-mode.ts
@@ -0,0 +1,14 @@
+import { useMemo } from 'react'
+import { useStore } from '../store'
+
+export const useWorkflowMode = () => {
+  const historyWorkflowData = useStore(s => s.historyWorkflowData)
+  const isRestoring = useStore(s => s.isRestoring)
+  return useMemo(() => {
+    return {
+      normal: !historyWorkflowData && !isRestoring,
+      restoring: isRestoring,
+      viewHistory: !!historyWorkflowData,
+    }
+  }, [historyWorkflowData, isRestoring])
+}
diff --git a/app/components/workflow/hooks/use-workflow-refresh-draft.ts b/app/components/workflow/hooks/use-workflow-refresh-draft.ts
new file mode 100644
index 0000000..1948bd4
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-refresh-draft.ts
@@ -0,0 +1,9 @@
+import { useHooksStore } from '@/app/components/workflow/hooks-store'
+
+export const useWorkflowRefreshDraft = () => {
+  const handleRefreshWorkflowDraft = useHooksStore(s => s.handleRefreshWorkflowDraft)
+
+  return {
+    handleRefreshWorkflowDraft,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/index.ts b/app/components/workflow/hooks/use-workflow-run-event/index.ts
new file mode 100644
index 0000000..67bc6c1
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/index.ts
@@ -0,0 +1,15 @@
+export * from './use-workflow-started'
+export * from './use-workflow-finished'
+export * from './use-workflow-failed'
+export * from './use-workflow-node-started'
+export * from './use-workflow-node-finished'
+export * from './use-workflow-node-iteration-started'
+export * from './use-workflow-node-iteration-next'
+export * from './use-workflow-node-iteration-finished'
+export * from './use-workflow-node-loop-started'
+export * from './use-workflow-node-loop-next'
+export * from './use-workflow-node-loop-finished'
+export * from './use-workflow-node-retry'
+export * from './use-workflow-text-chunk'
+export * from './use-workflow-text-replace'
+export * from './use-workflow-agent-log'
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-agent-log.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-agent-log.ts
new file mode 100644
index 0000000..9a9fa62
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-agent-log.ts
@@ -0,0 +1,50 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import type { AgentLogResponse } from '@/types/workflow'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+
+export const useWorkflowAgentLog = () => {
+  const workflowStore = useWorkflowStore()
+
+  const handleWorkflowAgentLog = useCallback((params: AgentLogResponse) => {
+    const { data } = params
+    const {
+      workflowRunningData,
+      setWorkflowRunningData,
+    } = workflowStore.getState()
+
+    setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
+      const currentIndex = draft.tracing!.findIndex(item => item.node_id === data.node_id)
+      if (currentIndex > -1) {
+        const current = draft.tracing![currentIndex]
+
+        if (current.execution_metadata) {
+          if (current.execution_metadata.agent_log) {
+            const currentLogIndex = current.execution_metadata.agent_log.findIndex(log => log.id === data.id)
+            if (currentLogIndex > -1) {
+              current.execution_metadata.agent_log[currentLogIndex] = {
+                ...current.execution_metadata.agent_log[currentLogIndex],
+                ...data,
+              }
+            }
+            else {
+              current.execution_metadata.agent_log.push(data)
+            }
+          }
+          else {
+            current.execution_metadata.agent_log = [data]
+          }
+        }
+        else {
+          current.execution_metadata = {
+            agent_log: [data],
+          } as any
+        }
+      }
+    }))
+  }, [workflowStore])
+
+  return {
+    handleWorkflowAgentLog,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-failed.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-failed.ts
new file mode 100644
index 0000000..733f015
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-failed.ts
@@ -0,0 +1,26 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+import { WorkflowRunningStatus } from '@/app/components/workflow/types'
+
+export const useWorkflowFailed = () => {
+  const workflowStore = useWorkflowStore()
+
+  const handleWorkflowFailed = useCallback(() => {
+    const {
+      workflowRunningData,
+      setWorkflowRunningData,
+    } = workflowStore.getState()
+
+    setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
+      draft.result = {
+        ...draft.result,
+        status: WorkflowRunningStatus.Failed,
+      }
+    }))
+  }, [workflowStore])
+
+  return {
+    handleWorkflowFailed,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-finished.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-finished.ts
new file mode 100644
index 0000000..f447031
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-finished.ts
@@ -0,0 +1,35 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import type { WorkflowFinishedResponse } from '@/types/workflow'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+import { getFilesInLogs } from '@/app/components/base/file-uploader/utils'
+
+export const useWorkflowFinished = () => {
+  const workflowStore = useWorkflowStore()
+
+  const handleWorkflowFinished = useCallback((params: WorkflowFinishedResponse) => {
+    const { data } = params
+    const {
+      workflowRunningData,
+      setWorkflowRunningData,
+    } = workflowStore.getState()
+
+    const isStringOutput = data.outputs && Object.keys(data.outputs).length === 1 && typeof data.outputs[Object.keys(data.outputs)[0]] === 'string'
+
+    setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
+      draft.result = {
+        ...draft.result,
+        ...data,
+        files: getFilesInLogs(data.outputs),
+      } as any
+      if (isStringOutput) {
+        draft.resultTabActive = true
+        draft.resultText = data.outputs[Object.keys(data.outputs)[0]]
+      }
+    }))
+  }, [workflowStore])
+
+  return {
+    handleWorkflowFinished,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-finished.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-finished.ts
new file mode 100644
index 0000000..85382e5
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-finished.ts
@@ -0,0 +1,72 @@
+import { useCallback } from 'react'
+import { useStoreApi } from 'reactflow'
+import produce from 'immer'
+import type { NodeFinishedResponse } from '@/types/workflow'
+import {
+  BlockEnum,
+  NodeRunningStatus,
+} from '@/app/components/workflow/types'
+import { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/components/error-handle/types'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+
+export const useWorkflowNodeFinished = () => {
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+
+  const handleWorkflowNodeFinished = useCallback((params: NodeFinishedResponse) => {
+    const { data } = params
+    const {
+      workflowRunningData,
+      setWorkflowRunningData,
+    } = workflowStore.getState()
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+    const nodes = getNodes()
+    setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
+      const currentIndex = draft.tracing!.findIndex(item => item.id === data.id)
+      if (currentIndex > -1) {
+        draft.tracing![currentIndex] = {
+          ...draft.tracing![currentIndex],
+          ...data,
+        }
+      }
+    }))
+
+    const newNodes = produce(nodes, (draft) => {
+      const currentNode = draft.find(node => node.id === data.node_id)!
+      currentNode.data._runningStatus = data.status
+      if (data.status === NodeRunningStatus.Exception) {
+        if (data.execution_metadata?.error_strategy === ErrorHandleTypeEnum.failBranch)
+          currentNode.data._runningBranchId = ErrorHandleTypeEnum.failBranch
+      }
+      else {
+        if (data.node_type === BlockEnum.IfElse)
+          currentNode.data._runningBranchId = data?.outputs?.selected_case_id
+
+        if (data.node_type === BlockEnum.QuestionClassifier)
+          currentNode.data._runningBranchId = data?.outputs?.class_id
+      }
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      const incomeEdges = draft.filter((edge) => {
+        return edge.target === data.node_id
+      })
+      incomeEdges.forEach((edge) => {
+        edge.data = {
+          ...edge.data,
+          _targetRunningStatus: data.status,
+        }
+      })
+    })
+    setEdges(newEdges)
+  }, [store, workflowStore])
+
+  return {
+    handleWorkflowNodeFinished,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-finished.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-finished.ts
new file mode 100644
index 0000000..7da8665
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-finished.ts
@@ -0,0 +1,60 @@
+import { useCallback } from 'react'
+import { useStoreApi } from 'reactflow'
+import produce from 'immer'
+import type { IterationFinishedResponse } from '@/types/workflow'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+import { DEFAULT_ITER_TIMES } from '@/app/components/workflow/constants'
+
+export const useWorkflowNodeIterationFinished = () => {
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+
+  const handleWorkflowNodeIterationFinished = useCallback((params: IterationFinishedResponse) => {
+    const { data } = params
+    const {
+      workflowRunningData,
+      setWorkflowRunningData,
+      setIterTimes,
+    } = workflowStore.getState()
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+    const nodes = getNodes()
+    setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
+      const currentIndex = draft.tracing!.findIndex(item => item.id === data.id)
+
+      if (currentIndex > -1) {
+        draft.tracing![currentIndex] = {
+          ...draft.tracing![currentIndex],
+          ...data,
+        }
+      }
+    }))
+    setIterTimes(DEFAULT_ITER_TIMES)
+    const newNodes = produce(nodes, (draft) => {
+      const currentNode = draft.find(node => node.id === data.node_id)!
+
+      currentNode.data._runningStatus = data.status
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      const incomeEdges = draft.filter((edge) => {
+        return edge.target === data.node_id
+      })
+      incomeEdges.forEach((edge) => {
+        edge.data = {
+          ...edge.data,
+          _targetRunningStatus: data.status,
+        }
+      })
+    })
+    setEdges(newEdges)
+  }, [workflowStore, store])
+
+  return {
+    handleWorkflowNodeIterationFinished,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-next.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-next.ts
new file mode 100644
index 0000000..454f822
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-next.ts
@@ -0,0 +1,35 @@
+import { useCallback } from 'react'
+import { useStoreApi } from 'reactflow'
+import produce from 'immer'
+import type { IterationNextResponse } from '@/types/workflow'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+
+export const useWorkflowNodeIterationNext = () => {
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+
+  const handleWorkflowNodeIterationNext = useCallback((params: IterationNextResponse) => {
+    const {
+      iterTimes,
+      setIterTimes,
+    } = workflowStore.getState()
+
+    const { data } = params
+    const {
+      getNodes,
+      setNodes,
+    } = store.getState()
+
+    const nodes = getNodes()
+    const newNodes = produce(nodes, (draft) => {
+      const currentNode = draft.find(node => node.id === data.node_id)!
+      currentNode.data._iterationIndex = iterTimes
+      setIterTimes(iterTimes + 1)
+    })
+    setNodes(newNodes)
+  }, [workflowStore, store])
+
+  return {
+    handleWorkflowNodeIterationNext,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-started.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-started.ts
new file mode 100644
index 0000000..0308f62
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-iteration-started.ts
@@ -0,0 +1,85 @@
+import { useCallback } from 'react'
+import {
+  useReactFlow,
+  useStoreApi,
+} from 'reactflow'
+import produce from 'immer'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+import type { IterationStartedResponse } from '@/types/workflow'
+import { NodeRunningStatus } from '@/app/components/workflow/types'
+import { DEFAULT_ITER_TIMES } from '@/app/components/workflow/constants'
+
+export const useWorkflowNodeIterationStarted = () => {
+  const store = useStoreApi()
+  const reactflow = useReactFlow()
+  const workflowStore = useWorkflowStore()
+
+  const handleWorkflowNodeIterationStarted = useCallback((
+    params: IterationStartedResponse,
+    containerParams: {
+      clientWidth: number,
+      clientHeight: number,
+    },
+  ) => {
+    const { data } = params
+    const {
+      workflowRunningData,
+      setWorkflowRunningData,
+      setIterTimes,
+    } = workflowStore.getState()
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+      transform,
+    } = store.getState()
+    const nodes = getNodes()
+    setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
+      draft.tracing!.push({
+        ...data,
+        status: NodeRunningStatus.Running,
+      })
+    }))
+    setIterTimes(DEFAULT_ITER_TIMES)
+
+    const {
+      setViewport,
+    } = reactflow
+    const currentNodeIndex = nodes.findIndex(node => node.id === data.node_id)
+    const currentNode = nodes[currentNodeIndex]
+    const position = currentNode.position
+    const zoom = transform[2]
+
+    if (!currentNode.parentId) {
+      setViewport({
+        x: (containerParams.clientWidth - 400 - currentNode.width! * zoom) / 2 - position.x * zoom,
+        y: (containerParams.clientHeight - currentNode.height! * zoom) / 2 - position.y * zoom,
+        zoom: transform[2],
+      })
+    }
+    const newNodes = produce(nodes, (draft) => {
+      draft[currentNodeIndex].data._runningStatus = NodeRunningStatus.Running
+      draft[currentNodeIndex].data._iterationLength = data.metadata.iterator_length
+      draft[currentNodeIndex].data._waitingRun = false
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      const incomeEdges = draft.filter(edge => edge.target === data.node_id)
+
+      incomeEdges.forEach((edge) => {
+        edge.data = {
+          ...edge.data,
+          _sourceRunningStatus: nodes.find(node => node.id === edge.source)!.data._runningStatus,
+          _targetRunningStatus: NodeRunningStatus.Running,
+          _waitingRun: false,
+        }
+      })
+    })
+    setEdges(newEdges)
+  }, [workflowStore, store, reactflow])
+
+  return {
+    handleWorkflowNodeIterationStarted,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-finished.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-finished.ts
new file mode 100644
index 0000000..5b6c7f0
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-finished.ts
@@ -0,0 +1,57 @@
+import { useCallback } from 'react'
+import { useStoreApi } from 'reactflow'
+import produce from 'immer'
+import type { LoopFinishedResponse } from '@/types/workflow'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+
+export const useWorkflowNodeLoopFinished = () => {
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+
+  const handleWorkflowNodeLoopFinished = useCallback((params: LoopFinishedResponse) => {
+    const { data } = params
+    const {
+      workflowRunningData,
+      setWorkflowRunningData,
+    } = workflowStore.getState()
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+    const nodes = getNodes()
+    setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
+      const currentIndex = draft.tracing!.findIndex(item => item.id === data.id)
+
+      if (currentIndex > -1) {
+        draft.tracing![currentIndex] = {
+          ...draft.tracing![currentIndex],
+          ...data,
+        }
+      }
+    }))
+    const newNodes = produce(nodes, (draft) => {
+      const currentNode = draft.find(node => node.id === data.node_id)!
+
+      currentNode.data._runningStatus = data.status
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      const incomeEdges = draft.filter((edge) => {
+        return edge.target === data.node_id
+      })
+      incomeEdges.forEach((edge) => {
+        edge.data = {
+          ...edge.data,
+          _targetRunningStatus: data.status,
+        }
+      })
+    })
+    setEdges(newEdges)
+  }, [workflowStore, store])
+
+  return {
+    handleWorkflowNodeLoopFinished,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-next.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-next.ts
new file mode 100644
index 0000000..8525e28
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-next.ts
@@ -0,0 +1,35 @@
+import { useCallback } from 'react'
+import { useStoreApi } from 'reactflow'
+import produce from 'immer'
+import type { LoopNextResponse } from '@/types/workflow'
+import { NodeRunningStatus } from '@/app/components/workflow/types'
+
+export const useWorkflowNodeLoopNext = () => {
+  const store = useStoreApi()
+
+  const handleWorkflowNodeLoopNext = useCallback((params: LoopNextResponse) => {
+    const { data } = params
+    const {
+      getNodes,
+      setNodes,
+    } = store.getState()
+
+    const nodes = getNodes()
+    const newNodes = produce(nodes, (draft) => {
+      const currentNode = draft.find(node => node.id === data.node_id)!
+      currentNode.data._loopIndex = data.index
+
+      draft.forEach((node) => {
+        if (node.parentId === data.node_id) {
+          node.data._waitingRun = true
+          node.data._runningStatus = NodeRunningStatus.Waiting
+        }
+      })
+    })
+    setNodes(newNodes)
+  }, [store])
+
+  return {
+    handleWorkflowNodeLoopNext,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-started.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-started.ts
new file mode 100644
index 0000000..1745f43
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-loop-started.ts
@@ -0,0 +1,82 @@
+import { useCallback } from 'react'
+import {
+  useReactFlow,
+  useStoreApi,
+} from 'reactflow'
+import produce from 'immer'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+import type { LoopStartedResponse } from '@/types/workflow'
+import { NodeRunningStatus } from '@/app/components/workflow/types'
+
+export const useWorkflowNodeLoopStarted = () => {
+  const store = useStoreApi()
+  const reactflow = useReactFlow()
+  const workflowStore = useWorkflowStore()
+
+  const handleWorkflowNodeLoopStarted = useCallback((
+    params: LoopStartedResponse,
+    containerParams: {
+      clientWidth: number,
+      clientHeight: number,
+    },
+  ) => {
+    const { data } = params
+    const {
+      workflowRunningData,
+      setWorkflowRunningData,
+    } = workflowStore.getState()
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+      transform,
+    } = store.getState()
+    const nodes = getNodes()
+    setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
+      draft.tracing!.push({
+        ...data,
+        status: NodeRunningStatus.Running,
+      })
+    }))
+
+    const {
+      setViewport,
+    } = reactflow
+    const currentNodeIndex = nodes.findIndex(node => node.id === data.node_id)
+    const currentNode = nodes[currentNodeIndex]
+    const position = currentNode.position
+    const zoom = transform[2]
+
+    if (!currentNode.parentId) {
+      setViewport({
+        x: (containerParams.clientWidth - 400 - currentNode.width! * zoom) / 2 - position.x * zoom,
+        y: (containerParams.clientHeight - currentNode.height! * zoom) / 2 - position.y * zoom,
+        zoom: transform[2],
+      })
+    }
+    const newNodes = produce(nodes, (draft) => {
+      draft[currentNodeIndex].data._runningStatus = NodeRunningStatus.Running
+      draft[currentNodeIndex].data._loopLength = data.metadata.loop_length
+      draft[currentNodeIndex].data._waitingRun = false
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      const incomeEdges = draft.filter(edge => edge.target === data.node_id)
+
+      incomeEdges.forEach((edge) => {
+        edge.data = {
+          ...edge.data,
+          _sourceRunningStatus: nodes.find(node => node.id === edge.source)!.data._runningStatus,
+          _targetRunningStatus: NodeRunningStatus.Running,
+          _waitingRun: false,
+        }
+      })
+    })
+    setEdges(newEdges)
+  }, [workflowStore, store, reactflow])
+
+  return {
+    handleWorkflowNodeLoopStarted,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-retry.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-retry.ts
new file mode 100644
index 0000000..a57bfbc
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-retry.ts
@@ -0,0 +1,39 @@
+import { useCallback } from 'react'
+import { useStoreApi } from 'reactflow'
+import produce from 'immer'
+import type {
+  NodeFinishedResponse,
+} from '@/types/workflow'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+
+export const useWorkflowNodeRetry = () => {
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+
+  const handleWorkflowNodeRetry = useCallback((params: NodeFinishedResponse) => {
+    const { data } = params
+    const {
+      workflowRunningData,
+      setWorkflowRunningData,
+    } = workflowStore.getState()
+    const {
+      getNodes,
+      setNodes,
+    } = store.getState()
+
+    const nodes = getNodes()
+    setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
+      draft.tracing!.push(data)
+    }))
+    const newNodes = produce(nodes, (draft) => {
+      const currentNode = draft.find(node => node.id === data.node_id)!
+
+      currentNode.data._retryIndex = data.retry_index
+    })
+    setNodes(newNodes)
+  }, [workflowStore, store])
+
+  return {
+    handleWorkflowNodeRetry,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-started.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-started.ts
new file mode 100644
index 0000000..f1f184d
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-node-started.ts
@@ -0,0 +1,92 @@
+import { useCallback } from 'react'
+import {
+  useReactFlow,
+  useStoreApi,
+} from 'reactflow'
+import produce from 'immer'
+import type { NodeStartedResponse } from '@/types/workflow'
+import { NodeRunningStatus } from '@/app/components/workflow/types'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+
+export const useWorkflowNodeStarted = () => {
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+  const reactflow = useReactFlow()
+
+  const handleWorkflowNodeStarted = useCallback((
+    params: NodeStartedResponse,
+    containerParams: {
+      clientWidth: number,
+      clientHeight: number,
+    },
+  ) => {
+    const { data } = params
+    const {
+      workflowRunningData,
+      setWorkflowRunningData,
+    } = workflowStore.getState()
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+      transform,
+    } = store.getState()
+    const nodes = getNodes()
+    setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
+      draft.tracing!.push({
+        ...data,
+        status: NodeRunningStatus.Running,
+      })
+    }))
+
+    const {
+      setViewport,
+    } = reactflow
+    const currentNodeIndex = nodes.findIndex(node => node.id === data.node_id)
+    const currentNode = nodes[currentNodeIndex]
+    const position = currentNode.position
+    const zoom = transform[2]
+
+    if (!currentNode.parentId) {
+      setViewport({
+        x: (containerParams.clientWidth - 400 - currentNode.width! * zoom) / 2 - position.x * zoom,
+        y: (containerParams.clientHeight - currentNode.height! * zoom) / 2 - position.y * zoom,
+        zoom: transform[2],
+      })
+    }
+    const newNodes = produce(nodes, (draft) => {
+      draft[currentNodeIndex].data._runningStatus = NodeRunningStatus.Running
+      draft[currentNodeIndex].data._waitingRun = false
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      const incomeEdges = draft.filter((edge) => {
+        return edge.target === data.node_id
+      })
+
+      incomeEdges.forEach((edge) => {
+        const incomeNode = nodes.find(node => node.id === edge.source)!
+        if (!incomeNode || !('data' in incomeNode))
+           return
+
+        if (
+          (!incomeNode.data._runningBranchId && edge.sourceHandle === 'source')
+          || (incomeNode.data._runningBranchId && edge.sourceHandle === incomeNode.data._runningBranchId)
+        ) {
+          edge.data = {
+            ...edge.data,
+            _sourceRunningStatus: incomeNode.data._runningStatus,
+            _targetRunningStatus: NodeRunningStatus.Running,
+            _waitingRun: false,
+          }
+        }
+      })
+    })
+    setEdges(newEdges)
+  }, [workflowStore, store, reactflow])
+
+  return {
+    handleWorkflowNodeStarted,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts
new file mode 100644
index 0000000..6488307
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-run-event.ts
@@ -0,0 +1,53 @@
+import {
+  useWorkflowAgentLog,
+  useWorkflowFailed,
+  useWorkflowFinished,
+  useWorkflowNodeFinished,
+  useWorkflowNodeIterationFinished,
+  useWorkflowNodeIterationNext,
+  useWorkflowNodeIterationStarted,
+  useWorkflowNodeLoopFinished,
+  useWorkflowNodeLoopNext,
+  useWorkflowNodeLoopStarted,
+  useWorkflowNodeRetry,
+  useWorkflowNodeStarted,
+  useWorkflowStarted,
+  useWorkflowTextChunk,
+  useWorkflowTextReplace,
+} from '.'
+
+export const useWorkflowRunEvent = () => {
+  const { handleWorkflowStarted } = useWorkflowStarted()
+  const { handleWorkflowFinished } = useWorkflowFinished()
+  const { handleWorkflowFailed } = useWorkflowFailed()
+  const { handleWorkflowNodeStarted } = useWorkflowNodeStarted()
+  const { handleWorkflowNodeFinished } = useWorkflowNodeFinished()
+  const { handleWorkflowNodeIterationStarted } = useWorkflowNodeIterationStarted()
+  const { handleWorkflowNodeIterationNext } = useWorkflowNodeIterationNext()
+  const { handleWorkflowNodeIterationFinished } = useWorkflowNodeIterationFinished()
+  const { handleWorkflowNodeLoopStarted } = useWorkflowNodeLoopStarted()
+  const { handleWorkflowNodeLoopNext } = useWorkflowNodeLoopNext()
+  const { handleWorkflowNodeLoopFinished } = useWorkflowNodeLoopFinished()
+  const { handleWorkflowNodeRetry } = useWorkflowNodeRetry()
+  const { handleWorkflowTextChunk } = useWorkflowTextChunk()
+  const { handleWorkflowTextReplace } = useWorkflowTextReplace()
+  const { handleWorkflowAgentLog } = useWorkflowAgentLog()
+
+  return {
+    handleWorkflowStarted,
+    handleWorkflowFinished,
+    handleWorkflowFailed,
+    handleWorkflowNodeStarted,
+    handleWorkflowNodeFinished,
+    handleWorkflowNodeIterationStarted,
+    handleWorkflowNodeIterationNext,
+    handleWorkflowNodeIterationFinished,
+    handleWorkflowNodeLoopStarted,
+    handleWorkflowNodeLoopNext,
+    handleWorkflowNodeLoopFinished,
+    handleWorkflowNodeRetry,
+    handleWorkflowTextChunk,
+    handleWorkflowTextReplace,
+    handleWorkflowAgentLog,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-started.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-started.ts
new file mode 100644
index 0000000..f991131
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-started.ts
@@ -0,0 +1,58 @@
+import { useCallback } from 'react'
+import { useStoreApi } from 'reactflow'
+import produce from 'immer'
+import type { WorkflowStartedResponse } from '@/types/workflow'
+import { WorkflowRunningStatus } from '@/app/components/workflow/types'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+
+export const useWorkflowStarted = () => {
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+
+  const handleWorkflowStarted = useCallback((params: WorkflowStartedResponse) => {
+    const { task_id, data } = params
+    const {
+      workflowRunningData,
+      setWorkflowRunningData,
+      setIterParallelLogMap,
+    } = workflowStore.getState()
+    const {
+      getNodes,
+      setNodes,
+      edges,
+      setEdges,
+    } = store.getState()
+    setIterParallelLogMap(new Map())
+    setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
+      draft.task_id = task_id
+      draft.result = {
+        ...draft?.result,
+        ...data,
+        status: WorkflowRunningStatus.Running,
+      }
+    }))
+    const nodes = getNodes()
+    const newNodes = produce(nodes, (draft) => {
+      draft.forEach((node) => {
+        node.data._waitingRun = true
+        node.data._runningBranchId = undefined
+      })
+    })
+    setNodes(newNodes)
+    const newEdges = produce(edges, (draft) => {
+      draft.forEach((edge) => {
+        edge.data = {
+          ...edge.data,
+          _sourceRunningStatus: undefined,
+          _targetRunningStatus: undefined,
+          _waitingRun: true,
+        }
+      })
+    })
+    setEdges(newEdges)
+  }, [workflowStore, store])
+
+  return {
+    handleWorkflowStarted,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-chunk.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-chunk.ts
new file mode 100644
index 0000000..c086e57
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-chunk.ts
@@ -0,0 +1,25 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import type { TextChunkResponse } from '@/types/workflow'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+
+export const useWorkflowTextChunk = () => {
+  const workflowStore = useWorkflowStore()
+
+  const handleWorkflowTextChunk = useCallback((params: TextChunkResponse) => {
+    const { data: { text } } = params
+    const {
+      workflowRunningData,
+      setWorkflowRunningData,
+    } = workflowStore.getState()
+
+    setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
+      draft.resultTabActive = true
+      draft.resultText += text
+    }))
+  }, [workflowStore])
+
+  return {
+    handleWorkflowTextChunk,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-replace.ts b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-replace.ts
new file mode 100644
index 0000000..a005309
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run-event/use-workflow-text-replace.ts
@@ -0,0 +1,23 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import type { TextReplaceResponse } from '@/types/workflow'
+import { useWorkflowStore } from '@/app/components/workflow/store'
+
+export const useWorkflowTextReplace = () => {
+  const workflowStore = useWorkflowStore()
+
+  const handleWorkflowTextReplace = useCallback((params: TextReplaceResponse) => {
+    const { data: { text } } = params
+    const {
+      workflowRunningData,
+      setWorkflowRunningData,
+    } = workflowStore.getState()
+    setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
+      draft.resultText = text
+    }))
+  }, [workflowStore])
+
+  return {
+    handleWorkflowTextReplace,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-run.ts b/app/components/workflow/hooks/use-workflow-run.ts
new file mode 100644
index 0000000..05a60eb
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-run.ts
@@ -0,0 +1,17 @@
+import { useHooksStore } from '@/app/components/workflow/hooks-store'
+
+export const useWorkflowRun = () => {
+  const handleBackupDraft = useHooksStore(s => s.handleBackupDraft)
+  const handleLoadBackupDraft = useHooksStore(s => s.handleLoadBackupDraft)
+  const handleRestoreFromPublishedWorkflow = useHooksStore(s => s.handleRestoreFromPublishedWorkflow)
+  const handleRun = useHooksStore(s => s.handleRun)
+  const handleStopRun = useHooksStore(s => s.handleStopRun)
+
+  return {
+    handleBackupDraft,
+    handleLoadBackupDraft,
+    handleRun,
+    handleStopRun,
+    handleRestoreFromPublishedWorkflow,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-start-run.tsx b/app/components/workflow/hooks/use-workflow-start-run.tsx
new file mode 100644
index 0000000..0f4e68f
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-start-run.tsx
@@ -0,0 +1,13 @@
+import { useHooksStore } from '@/app/components/workflow/hooks-store'
+
+export const useWorkflowStartRun = () => {
+  const handleStartWorkflowRun = useHooksStore(s => s.handleStartWorkflowRun)
+  const handleWorkflowStartRunInWorkflow = useHooksStore(s => s.handleWorkflowStartRunInWorkflow)
+  const handleWorkflowStartRunInChatflow = useHooksStore(s => s.handleWorkflowStartRunInChatflow)
+
+  return {
+    handleStartWorkflowRun,
+    handleWorkflowStartRunInWorkflow,
+    handleWorkflowStartRunInChatflow,
+  }
+}
diff --git a/app/components/workflow/hooks/use-workflow-variables.ts b/app/components/workflow/hooks/use-workflow-variables.ts
new file mode 100644
index 0000000..35637bc
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow-variables.ts
@@ -0,0 +1,113 @@
+import { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useStore } from '../store'
+import { getVarType, toNodeAvailableVars } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+import type {
+  Node,
+  NodeOutPutVar,
+  ValueSelector,
+  Var,
+} from '@/app/components/workflow/types'
+import { useIsChatMode } from './use-workflow'
+import { useStoreApi } from 'reactflow'
+
+export const useWorkflowVariables = () => {
+  const { t } = useTranslation()
+  const environmentVariables = useStore(s => s.environmentVariables)
+  const conversationVariables = useStore(s => s.conversationVariables)
+
+  const getNodeAvailableVars = useCallback(({
+    parentNode,
+    beforeNodes,
+    isChatMode,
+    filterVar,
+    hideEnv,
+    hideChatVar,
+  }: {
+    parentNode?: Node | null
+    beforeNodes: Node[]
+    isChatMode: boolean
+    filterVar: (payload: Var, selector: ValueSelector) => boolean
+    hideEnv?: boolean
+    hideChatVar?: boolean
+  }): NodeOutPutVar[] => {
+    return toNodeAvailableVars({
+      parentNode,
+      t,
+      beforeNodes,
+      isChatMode,
+      environmentVariables: hideEnv ? [] : environmentVariables,
+      conversationVariables: (isChatMode && !hideChatVar) ? conversationVariables : [],
+      filterVar,
+    })
+  }, [conversationVariables, environmentVariables, t])
+
+  const getCurrentVariableType = useCallback(({
+    parentNode,
+    valueSelector,
+    isIterationItem,
+    isLoopItem,
+    availableNodes,
+    isChatMode,
+    isConstant,
+  }: {
+    valueSelector: ValueSelector
+    parentNode?: Node | null
+    isIterationItem?: boolean
+    isLoopItem?: boolean
+    availableNodes: any[]
+    isChatMode: boolean
+    isConstant?: boolean
+  }) => {
+    return getVarType({
+      parentNode,
+      valueSelector,
+      isIterationItem,
+      isLoopItem,
+      availableNodes,
+      isChatMode,
+      isConstant,
+      environmentVariables,
+      conversationVariables,
+    })
+  }, [conversationVariables, environmentVariables])
+
+  return {
+    getNodeAvailableVars,
+    getCurrentVariableType,
+  }
+}
+
+export const useWorkflowVariableType = () => {
+  const store = useStoreApi()
+  const {
+    getNodes,
+  } = store.getState()
+  const { getCurrentVariableType } = useWorkflowVariables()
+
+  const isChatMode = useIsChatMode()
+
+  const getVarType = ({
+    nodeId,
+    valueSelector,
+  }: {
+    nodeId: string,
+    valueSelector: ValueSelector,
+  }) => {
+    const node = getNodes().find(n => n.id === nodeId)
+    const isInIteration = !!node?.data.isInIteration
+    const iterationNode = isInIteration ? getNodes().find(n => n.id === node.parentId) : null
+    const availableNodes = [node]
+
+    const type = getCurrentVariableType({
+      parentNode: iterationNode,
+      valueSelector,
+      availableNodes,
+      isChatMode,
+      isConstant: false,
+    })
+    return type
+  }
+
+  return getVarType
+}
diff --git a/app/components/workflow/hooks/use-workflow.ts b/app/components/workflow/hooks/use-workflow.ts
new file mode 100644
index 0000000..99dce4d
--- /dev/null
+++ b/app/components/workflow/hooks/use-workflow.ts
@@ -0,0 +1,559 @@
+import {
+  useCallback,
+  useMemo,
+} from 'react'
+import { uniqBy } from 'lodash-es'
+import { useTranslation } from 'react-i18next'
+import {
+  getIncomers,
+  getOutgoers,
+  useStoreApi,
+} from 'reactflow'
+import type {
+  Connection,
+} from 'reactflow'
+import type {
+  Edge,
+  Node,
+  ValueSelector,
+} from '../types'
+import {
+  BlockEnum,
+  WorkflowRunningStatus,
+} from '../types'
+import {
+  useStore,
+  useWorkflowStore,
+} from '../store'
+import {
+  getParallelInfo,
+} from '../utils'
+import {
+  PARALLEL_DEPTH_LIMIT,
+  PARALLEL_LIMIT,
+  SUPPORT_OUTPUT_VARS_NODE,
+} from '../constants'
+import { CUSTOM_NOTE_NODE } from '../note-node/constants'
+import { findUsedVarNodes, getNodeOutputVars, updateNodeVars } from '../nodes/_base/components/variable/utils'
+import { useNodesExtraData } from './use-nodes-data'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import {
+  fetchAllBuiltInTools,
+  fetchAllCustomTools,
+  fetchAllWorkflowTools,
+} from '@/service/tools'
+import { CollectionType } from '@/app/components/tools/types'
+import { CUSTOM_ITERATION_START_NODE } from '@/app/components/workflow/nodes/iteration-start/constants'
+import { CUSTOM_LOOP_START_NODE } from '@/app/components/workflow/nodes/loop-start/constants'
+import { basePath } from '@/utils/var'
+import { canFindTool } from '@/utils'
+
+export const useIsChatMode = () => {
+  const appDetail = useAppStore(s => s.appDetail)
+
+  return appDetail?.mode === 'advanced-chat'
+}
+
+export const useWorkflow = () => {
+  const { t } = useTranslation()
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+  const nodesExtraData = useNodesExtraData()
+  const setPanelWidth = useCallback((width: number) => {
+    localStorage.setItem('workflow-node-panel-width', `${width}`)
+    workflowStore.setState({ panelWidth: width })
+  }, [workflowStore])
+
+  const getTreeLeafNodes = useCallback((nodeId: string) => {
+    const {
+      getNodes,
+      edges,
+    } = store.getState()
+    const nodes = getNodes()
+    let startNode = nodes.find(node => node.data.type === BlockEnum.Start)
+    const currentNode = nodes.find(node => node.id === nodeId)
+
+    if (currentNode?.parentId)
+      startNode = nodes.find(node => node.parentId === currentNode.parentId && (node.type === CUSTOM_ITERATION_START_NODE || node.type === CUSTOM_LOOP_START_NODE))
+
+    if (!startNode)
+      return []
+
+    const list: Node[] = []
+    const preOrder = (root: Node, callback: (node: Node) => void) => {
+      if (root.id === nodeId)
+        return
+      const outgoers = getOutgoers(root, nodes, edges)
+
+      if (outgoers.length) {
+        outgoers.forEach((outgoer) => {
+          preOrder(outgoer, callback)
+        })
+      }
+      else {
+        if (root.id !== nodeId)
+          callback(root)
+      }
+    }
+    preOrder(startNode, (node) => {
+      list.push(node)
+    })
+
+    const incomers = getIncomers({ id: nodeId } as Node, nodes, edges)
+
+    list.push(...incomers)
+
+    return uniqBy(list, 'id').filter((item: Node) => {
+      return SUPPORT_OUTPUT_VARS_NODE.includes(item.data.type)
+    })
+  }, [store])
+
+  const getBeforeNodesInSameBranch = useCallback((nodeId: string, newNodes?: Node[], newEdges?: Edge[]) => {
+    const {
+      getNodes,
+      edges,
+    } = store.getState()
+    const nodes = newNodes || getNodes()
+    const currentNode = nodes.find(node => node.id === nodeId)
+
+    const list: Node[] = []
+
+    if (!currentNode)
+      return list
+
+    if (currentNode.parentId) {
+      const parentNode = nodes.find(node => node.id === currentNode.parentId)
+      if (parentNode) {
+        const parentList = getBeforeNodesInSameBranch(parentNode.id)
+
+        list.push(...parentList)
+      }
+    }
+
+    const traverse = (root: Node, callback: (node: Node) => void) => {
+      if (root) {
+        const incomers = getIncomers(root, nodes, newEdges || edges)
+
+        if (incomers.length) {
+          incomers.forEach((node) => {
+            if (!list.find(n => node.id === n.id)) {
+              callback(node)
+              traverse(node, callback)
+            }
+          })
+        }
+      }
+    }
+    traverse(currentNode, (node) => {
+      list.push(node)
+    })
+
+    const length = list.length
+    if (length) {
+      return uniqBy(list, 'id').reverse().filter((item: Node) => {
+        return SUPPORT_OUTPUT_VARS_NODE.includes(item.data.type)
+      })
+    }
+
+    return []
+  }, [store])
+
+  const getBeforeNodesInSameBranchIncludeParent = useCallback((nodeId: string, newNodes?: Node[], newEdges?: Edge[]) => {
+    const nodes = getBeforeNodesInSameBranch(nodeId, newNodes, newEdges)
+    const {
+      getNodes,
+    } = store.getState()
+    const allNodes = getNodes()
+    const node = allNodes.find(n => n.id === nodeId)
+    const parentNodeId = node?.parentId
+    const parentNode = allNodes.find(n => n.id === parentNodeId)
+    if (parentNode)
+      nodes.push(parentNode)
+
+    return nodes
+  }, [getBeforeNodesInSameBranch, store])
+
+  const getAfterNodesInSameBranch = useCallback((nodeId: string) => {
+    const {
+      getNodes,
+      edges,
+    } = store.getState()
+    const nodes = getNodes()
+    const currentNode = nodes.find(node => node.id === nodeId)!
+
+    if (!currentNode)
+      return []
+    const list: Node[] = [currentNode]
+
+    const traverse = (root: Node, callback: (node: Node) => void) => {
+      if (root) {
+        const outgoers = getOutgoers(root, nodes, edges)
+
+        if (outgoers.length) {
+          outgoers.forEach((node) => {
+            callback(node)
+            traverse(node, callback)
+          })
+        }
+      }
+    }
+    traverse(currentNode, (node) => {
+      list.push(node)
+    })
+
+    return uniqBy(list, 'id')
+  }, [store])
+
+  const getBeforeNodeById = useCallback((nodeId: string) => {
+    const {
+      getNodes,
+      edges,
+    } = store.getState()
+    const nodes = getNodes()
+    const node = nodes.find(node => node.id === nodeId)!
+
+    return getIncomers(node, nodes, edges)
+  }, [store])
+
+  const getIterationNodeChildren = useCallback((nodeId: string) => {
+    const {
+      getNodes,
+    } = store.getState()
+    const nodes = getNodes()
+
+    return nodes.filter(node => node.parentId === nodeId)
+  }, [store])
+
+  const getLoopNodeChildren = useCallback((nodeId: string) => {
+    const {
+      getNodes,
+    } = store.getState()
+    const nodes = getNodes()
+
+    return nodes.filter(node => node.parentId === nodeId)
+  }, [store])
+
+  const isFromStartNode = useCallback((nodeId: string) => {
+    const { getNodes } = store.getState()
+    const nodes = getNodes()
+    const currentNode = nodes.find(node => node.id === nodeId)
+
+    if (!currentNode)
+      return false
+
+    if (currentNode.data.type === BlockEnum.Start)
+      return true
+
+    const checkPreviousNodes = (node: Node) => {
+      const previousNodes = getBeforeNodeById(node.id)
+
+      for (const prevNode of previousNodes) {
+        if (prevNode.data.type === BlockEnum.Start)
+          return true
+        if (checkPreviousNodes(prevNode))
+          return true
+      }
+
+      return false
+    }
+
+    return checkPreviousNodes(currentNode)
+  }, [store, getBeforeNodeById])
+
+  const handleOutVarRenameChange = useCallback((nodeId: string, oldValeSelector: ValueSelector, newVarSelector: ValueSelector) => {
+    const { getNodes, setNodes } = store.getState()
+    const afterNodes = getAfterNodesInSameBranch(nodeId)
+    const effectNodes = findUsedVarNodes(oldValeSelector, afterNodes)
+    if (effectNodes.length > 0) {
+      const newNodes = getNodes().map((node) => {
+        if (effectNodes.find(n => n.id === node.id))
+          return updateNodeVars(node, oldValeSelector, newVarSelector)
+
+        return node
+      })
+      setNodes(newNodes)
+    }
+
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [store])
+
+  const isVarUsedInNodes = useCallback((varSelector: ValueSelector) => {
+    const nodeId = varSelector[0]
+    const afterNodes = getAfterNodesInSameBranch(nodeId)
+    const effectNodes = findUsedVarNodes(varSelector, afterNodes)
+    return effectNodes.length > 0
+  }, [getAfterNodesInSameBranch])
+
+  const removeUsedVarInNodes = useCallback((varSelector: ValueSelector) => {
+    const nodeId = varSelector[0]
+    const { getNodes, setNodes } = store.getState()
+    const afterNodes = getAfterNodesInSameBranch(nodeId)
+    const effectNodes = findUsedVarNodes(varSelector, afterNodes)
+    if (effectNodes.length > 0) {
+      const newNodes = getNodes().map((node) => {
+        if (effectNodes.find(n => n.id === node.id))
+          return updateNodeVars(node, varSelector, [])
+
+        return node
+      })
+      setNodes(newNodes)
+    }
+  }, [getAfterNodesInSameBranch, store])
+
+  const isNodeVarsUsedInNodes = useCallback((node: Node, isChatMode: boolean) => {
+    const outputVars = getNodeOutputVars(node, isChatMode)
+    const isUsed = outputVars.some((varSelector) => {
+      return isVarUsedInNodes(varSelector)
+    })
+    return isUsed
+  }, [isVarUsedInNodes])
+
+  const checkParallelLimit = useCallback((nodeId: string, nodeHandle = 'source') => {
+    const {
+      edges,
+    } = store.getState()
+    const connectedEdges = edges.filter(edge => edge.source === nodeId && edge.sourceHandle === nodeHandle)
+    if (connectedEdges.length > PARALLEL_LIMIT - 1) {
+      const { setShowTips } = workflowStore.getState()
+      setShowTips(t('workflow.common.parallelTip.limit', { num: PARALLEL_LIMIT }))
+      return false
+    }
+
+    return true
+  }, [store, workflowStore, t])
+
+  const checkNestedParallelLimit = useCallback((nodes: Node[], edges: Edge[], parentNodeId?: string) => {
+    const {
+      parallelList,
+      hasAbnormalEdges,
+    } = getParallelInfo(nodes, edges, parentNodeId)
+    const { workflowConfig } = workflowStore.getState()
+
+    if (hasAbnormalEdges)
+      return false
+
+    for (let i = 0; i < parallelList.length; i++) {
+      const parallel = parallelList[i]
+
+      if (parallel.depth > (workflowConfig?.parallel_depth_limit || PARALLEL_DEPTH_LIMIT)) {
+        const { setShowTips } = workflowStore.getState()
+        setShowTips(t('workflow.common.parallelTip.depthLimit', { num: (workflowConfig?.parallel_depth_limit || PARALLEL_DEPTH_LIMIT) }))
+        return false
+      }
+    }
+
+    return true
+  }, [t, workflowStore])
+
+  const isValidConnection = useCallback(({ source, sourceHandle, target }: Connection) => {
+    const {
+      edges,
+      getNodes,
+    } = store.getState()
+    const nodes = getNodes()
+    const sourceNode: Node = nodes.find(node => node.id === source)!
+    const targetNode: Node = nodes.find(node => node.id === target)!
+
+    if (!checkParallelLimit(source!, sourceHandle || 'source'))
+      return false
+
+    if (sourceNode.type === CUSTOM_NOTE_NODE || targetNode.type === CUSTOM_NOTE_NODE)
+      return false
+
+    if (sourceNode.parentId !== targetNode.parentId)
+      return false
+
+    if (sourceNode && targetNode) {
+      const sourceNodeAvailableNextNodes = nodesExtraData[sourceNode.data.type].availableNextNodes
+      const targetNodeAvailablePrevNodes = [...nodesExtraData[targetNode.data.type].availablePrevNodes, BlockEnum.Start]
+
+      if (!sourceNodeAvailableNextNodes.includes(targetNode.data.type))
+        return false
+
+      if (!targetNodeAvailablePrevNodes.includes(sourceNode.data.type))
+        return false
+    }
+
+    const hasCycle = (node: Node, visited = new Set()) => {
+      if (visited.has(node.id))
+        return false
+
+      visited.add(node.id)
+
+      for (const outgoer of getOutgoers(node, nodes, edges)) {
+        if (outgoer.id === source)
+          return true
+        if (hasCycle(outgoer, visited))
+          return true
+      }
+    }
+
+    return !hasCycle(targetNode)
+  }, [store, nodesExtraData, checkParallelLimit])
+
+  const getNode = useCallback((nodeId?: string) => {
+    const { getNodes } = store.getState()
+    const nodes = getNodes()
+
+    return nodes.find(node => node.id === nodeId) || nodes.find(node => node.data.type === BlockEnum.Start)
+  }, [store])
+
+  return {
+    setPanelWidth,
+    getTreeLeafNodes,
+    getBeforeNodesInSameBranch,
+    getBeforeNodesInSameBranchIncludeParent,
+    getAfterNodesInSameBranch,
+    handleOutVarRenameChange,
+    isVarUsedInNodes,
+    removeUsedVarInNodes,
+    isNodeVarsUsedInNodes,
+    checkParallelLimit,
+    checkNestedParallelLimit,
+    isValidConnection,
+    isFromStartNode,
+    getNode,
+    getBeforeNodeById,
+    getIterationNodeChildren,
+    getLoopNodeChildren,
+  }
+}
+
+export const useFetchToolsData = () => {
+  const workflowStore = useWorkflowStore()
+
+  const handleFetchAllTools = useCallback(async (type: string) => {
+    if (type === 'builtin') {
+      const buildInTools = await fetchAllBuiltInTools()
+
+      if (basePath) {
+        buildInTools.forEach((item) => {
+          if (typeof item.icon == 'string' && !item.icon.includes(basePath))
+            item.icon = `${basePath}${item.icon}`
+        })
+      }
+      workflowStore.setState({
+        buildInTools: buildInTools || [],
+      })
+    }
+    if (type === 'custom') {
+      const customTools = await fetchAllCustomTools()
+
+      workflowStore.setState({
+        customTools: customTools || [],
+      })
+    }
+    if (type === 'workflow') {
+      const workflowTools = await fetchAllWorkflowTools()
+
+      workflowStore.setState({
+        workflowTools: workflowTools || [],
+      })
+    }
+  }, [workflowStore])
+
+  return {
+    handleFetchAllTools,
+  }
+}
+
+export const useWorkflowReadOnly = () => {
+  const workflowStore = useWorkflowStore()
+  const workflowRunningData = useStore(s => s.workflowRunningData)
+
+  const getWorkflowReadOnly = useCallback(() => {
+    return workflowStore.getState().workflowRunningData?.result.status === WorkflowRunningStatus.Running
+  }, [workflowStore])
+
+  return {
+    workflowReadOnly: workflowRunningData?.result.status === WorkflowRunningStatus.Running,
+    getWorkflowReadOnly,
+  }
+}
+export const useNodesReadOnly = () => {
+  const workflowStore = useWorkflowStore()
+  const workflowRunningData = useStore(s => s.workflowRunningData)
+  const historyWorkflowData = useStore(s => s.historyWorkflowData)
+  const isRestoring = useStore(s => s.isRestoring)
+
+  const getNodesReadOnly = useCallback(() => {
+    const {
+      workflowRunningData,
+      historyWorkflowData,
+      isRestoring,
+    } = workflowStore.getState()
+
+    return workflowRunningData?.result.status === WorkflowRunningStatus.Running || historyWorkflowData || isRestoring
+  }, [workflowStore])
+
+  return {
+    nodesReadOnly: !!(workflowRunningData?.result.status === WorkflowRunningStatus.Running || historyWorkflowData || isRestoring),
+    getNodesReadOnly,
+  }
+}
+
+export const useToolIcon = (data: Node['data']) => {
+  const buildInTools = useStore(s => s.buildInTools)
+  const customTools = useStore(s => s.customTools)
+  const workflowTools = useStore(s => s.workflowTools)
+  const toolIcon = useMemo(() => {
+    if (data.type === BlockEnum.Tool) {
+      let targetTools = buildInTools
+      if (data.provider_type === CollectionType.builtIn)
+        targetTools = buildInTools
+      else if (data.provider_type === CollectionType.custom)
+        targetTools = customTools
+      else
+        targetTools = workflowTools
+      return targetTools.find(toolWithProvider => canFindTool(toolWithProvider.id, data.provider_id))?.icon
+    }
+  }, [data, buildInTools, customTools, workflowTools])
+
+  return toolIcon
+}
+
+export const useIsNodeInIteration = (iterationId: string) => {
+  const store = useStoreApi()
+
+  const isNodeInIteration = useCallback((nodeId: string) => {
+    const {
+      getNodes,
+    } = store.getState()
+    const nodes = getNodes()
+    const node = nodes.find(node => node.id === nodeId)
+
+    if (!node)
+      return false
+
+    if (node.parentId === iterationId)
+      return true
+
+    return false
+  }, [iterationId, store])
+  return {
+    isNodeInIteration,
+  }
+}
+
+export const useIsNodeInLoop = (loopId: string) => {
+  const store = useStoreApi()
+
+  const isNodeInLoop = useCallback((nodeId: string) => {
+    const {
+      getNodes,
+    } = store.getState()
+    const nodes = getNodes()
+    const node = nodes.find(node => node.id === nodeId)
+
+    if (!node)
+      return false
+
+    if (node.parentId === loopId)
+      return true
+
+    return false
+  }, [loopId, store])
+  return {
+    isNodeInLoop,
+  }
+}
diff --git a/app/components/workflow/index.tsx b/app/components/workflow/index.tsx
new file mode 100644
index 0000000..549117f
--- /dev/null
+++ b/app/components/workflow/index.tsx
@@ -0,0 +1,379 @@
+'use client'
+
+import type { FC } from 'react'
+import {
+  memo,
+  useCallback,
+  useEffect,
+  useRef,
+} from 'react'
+import { setAutoFreeze } from 'immer'
+import {
+  useEventListener,
+} from 'ahooks'
+import ReactFlow, {
+  Background,
+  ReactFlowProvider,
+  SelectionMode,
+  useEdgesState,
+  useNodesState,
+  useOnViewportChange,
+  useReactFlow,
+  useStoreApi,
+} from 'reactflow'
+import type {
+  Viewport,
+} from 'reactflow'
+import 'reactflow/dist/style.css'
+import './style.css'
+import type {
+  Edge,
+  Node,
+} from './types'
+import {
+  ControlMode,
+} from './types'
+import {
+  useEdgesInteractions,
+  useFetchToolsData,
+  useNodesInteractions,
+  useNodesReadOnly,
+  useNodesSyncDraft,
+  usePanelInteractions,
+  useSelectionInteractions,
+  useShortcuts,
+  useWorkflow,
+  useWorkflowReadOnly,
+  useWorkflowRefreshDraft,
+} from './hooks'
+import CustomNode from './nodes'
+import CustomNoteNode from './note-node'
+import { CUSTOM_NOTE_NODE } from './note-node/constants'
+import CustomIterationStartNode from './nodes/iteration-start'
+import { CUSTOM_ITERATION_START_NODE } from './nodes/iteration-start/constants'
+import CustomLoopStartNode from './nodes/loop-start'
+import { CUSTOM_LOOP_START_NODE } from './nodes/loop-start/constants'
+import CustomSimpleNode from './simple-node'
+import { CUSTOM_SIMPLE_NODE } from './simple-node/constants'
+import Operator from './operator'
+import CustomEdge from './custom-edge'
+import CustomConnectionLine from './custom-connection-line'
+import HelpLine from './help-line'
+import CandidateNode from './candidate-node'
+import PanelContextmenu from './panel-contextmenu'
+import NodeContextmenu from './node-contextmenu'
+import SyncingDataModal from './syncing-data-modal'
+import LimitTips from './limit-tips'
+import {
+  useStore,
+  useWorkflowStore,
+} from './store'
+import {
+  CUSTOM_EDGE,
+  CUSTOM_NODE,
+  ITERATION_CHILDREN_Z_INDEX,
+  WORKFLOW_DATA_UPDATE,
+} from './constants'
+import { WorkflowHistoryProvider } from './workflow-history-store'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import Confirm from '@/app/components/base/confirm'
+import DatasetsDetailProvider from './datasets-detail-store/provider'
+import { HooksStoreContextProvider } from './hooks-store'
+import type { Shape as HooksStoreShape } from './hooks-store'
+
+const nodeTypes = {
+  [CUSTOM_NODE]: CustomNode,
+  [CUSTOM_NOTE_NODE]: CustomNoteNode,
+  [CUSTOM_SIMPLE_NODE]: CustomSimpleNode,
+  [CUSTOM_ITERATION_START_NODE]: CustomIterationStartNode,
+  [CUSTOM_LOOP_START_NODE]: CustomLoopStartNode,
+}
+const edgeTypes = {
+  [CUSTOM_EDGE]: CustomEdge,
+}
+
+export type WorkflowProps = {
+  nodes: Node[]
+  edges: Edge[]
+  viewport?: Viewport
+  children?: React.ReactNode
+  onWorkflowDataUpdate?: (v: any) => void
+}
+export const Workflow: FC<WorkflowProps> = memo(({
+  nodes: originalNodes,
+  edges: originalEdges,
+  viewport,
+  children,
+  onWorkflowDataUpdate,
+}) => {
+  const workflowContainerRef = useRef<HTMLDivElement>(null)
+  const workflowStore = useWorkflowStore()
+  const reactflow = useReactFlow()
+  const [nodes, setNodes] = useNodesState(originalNodes)
+  const [edges, setEdges] = useEdgesState(originalEdges)
+  const controlMode = useStore(s => s.controlMode)
+  const nodeAnimation = useStore(s => s.nodeAnimation)
+  const showConfirm = useStore(s => s.showConfirm)
+
+  const {
+    setShowConfirm,
+    setControlPromptEditorRerenderKey,
+    setSyncWorkflowDraftHash,
+  } = workflowStore.getState()
+  const {
+    handleSyncWorkflowDraft,
+    syncWorkflowDraftWhenPageClose,
+  } = useNodesSyncDraft()
+  const { workflowReadOnly } = useWorkflowReadOnly()
+  const { nodesReadOnly } = useNodesReadOnly()
+  const { eventEmitter } = useEventEmitterContextContext()
+
+  eventEmitter?.useSubscription((v: any) => {
+    if (v.type === WORKFLOW_DATA_UPDATE) {
+      setNodes(v.payload.nodes)
+      setEdges(v.payload.edges)
+
+      if (v.payload.viewport)
+        reactflow.setViewport(v.payload.viewport)
+
+      if (v.payload.hash)
+        setSyncWorkflowDraftHash(v.payload.hash)
+
+      onWorkflowDataUpdate?.(v.payload)
+
+      setTimeout(() => setControlPromptEditorRerenderKey(Date.now()))
+    }
+  })
+
+  useEffect(() => {
+    setAutoFreeze(false)
+
+    return () => {
+      setAutoFreeze(true)
+    }
+  }, [])
+
+  useEffect(() => {
+    return () => {
+      handleSyncWorkflowDraft(true, true)
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  const { handleRefreshWorkflowDraft } = useWorkflowRefreshDraft()
+  const handleSyncWorkflowDraftWhenPageClose = useCallback(() => {
+    if (document.visibilityState === 'hidden')
+      syncWorkflowDraftWhenPageClose()
+    else if (document.visibilityState === 'visible')
+      setTimeout(() => handleRefreshWorkflowDraft(), 500)
+  }, [syncWorkflowDraftWhenPageClose, handleRefreshWorkflowDraft])
+
+  useEffect(() => {
+    document.addEventListener('visibilitychange', handleSyncWorkflowDraftWhenPageClose)
+
+    return () => {
+      document.removeEventListener('visibilitychange', handleSyncWorkflowDraftWhenPageClose)
+    }
+  }, [handleSyncWorkflowDraftWhenPageClose])
+
+  useEventListener('keydown', (e) => {
+    if ((e.key === 'd' || e.key === 'D') && (e.ctrlKey || e.metaKey))
+      e.preventDefault()
+    if ((e.key === 'z' || e.key === 'Z') && (e.ctrlKey || e.metaKey))
+      e.preventDefault()
+    if ((e.key === 'y' || e.key === 'Y') && (e.ctrlKey || e.metaKey))
+      e.preventDefault()
+    if ((e.key === 's' || e.key === 'S') && (e.ctrlKey || e.metaKey))
+      e.preventDefault()
+  })
+  useEventListener('mousemove', (e) => {
+    const containerClientRect = workflowContainerRef.current?.getBoundingClientRect()
+
+    if (containerClientRect) {
+      workflowStore.setState({
+        mousePosition: {
+          pageX: e.clientX,
+          pageY: e.clientY,
+          elementX: e.clientX - containerClientRect.left,
+          elementY: e.clientY - containerClientRect.top,
+        },
+      })
+    }
+  })
+  const { handleFetchAllTools } = useFetchToolsData()
+  useEffect(() => {
+    handleFetchAllTools('builtin')
+    handleFetchAllTools('custom')
+    handleFetchAllTools('workflow')
+  }, [handleFetchAllTools])
+
+  const {
+    handleNodeDragStart,
+    handleNodeDrag,
+    handleNodeDragStop,
+    handleNodeEnter,
+    handleNodeLeave,
+    handleNodeClick,
+    handleNodeConnect,
+    handleNodeConnectStart,
+    handleNodeConnectEnd,
+    handleNodeContextMenu,
+    handleHistoryBack,
+    handleHistoryForward,
+  } = useNodesInteractions()
+  const {
+    handleEdgeEnter,
+    handleEdgeLeave,
+    handleEdgesChange,
+  } = useEdgesInteractions()
+  const {
+    handleSelectionStart,
+    handleSelectionChange,
+    handleSelectionDrag,
+  } = useSelectionInteractions()
+  const {
+    handlePaneContextMenu,
+  } = usePanelInteractions()
+  const {
+    isValidConnection,
+  } = useWorkflow()
+
+  useOnViewportChange({
+    onEnd: () => {
+      handleSyncWorkflowDraft()
+    },
+  })
+
+  useShortcuts()
+
+  const store = useStoreApi()
+  if (process.env.NODE_ENV === 'development') {
+    store.getState().onError = (code, message) => {
+      if (code === '002')
+        return
+      console.warn(message)
+    }
+  }
+
+  return (
+    <div
+      id='workflow-container'
+      className={`
+        relative h-full w-full min-w-[960px]
+        ${workflowReadOnly && 'workflow-panel-animation'}
+        ${nodeAnimation && 'workflow-node-animation'}
+      `}
+      ref={workflowContainerRef}
+    >
+      <SyncingDataModal />
+      <CandidateNode />
+      <Operator handleRedo={handleHistoryForward} handleUndo={handleHistoryBack} />
+      <PanelContextmenu />
+      <NodeContextmenu />
+      <HelpLine />
+      {
+        !!showConfirm && (
+          <Confirm
+            isShow
+            onCancel={() => setShowConfirm(undefined)}
+            onConfirm={showConfirm.onConfirm}
+            title={showConfirm.title}
+            content={showConfirm.desc}
+          />
+        )
+      }
+      <LimitTips />
+      {children}
+      <ReactFlow
+        nodeTypes={nodeTypes}
+        edgeTypes={edgeTypes}
+        nodes={nodes}
+        edges={edges}
+        onNodeDragStart={handleNodeDragStart}
+        onNodeDrag={handleNodeDrag}
+        onNodeDragStop={handleNodeDragStop}
+        onNodeMouseEnter={handleNodeEnter}
+        onNodeMouseLeave={handleNodeLeave}
+        onNodeClick={handleNodeClick}
+        onNodeContextMenu={handleNodeContextMenu}
+        onConnect={handleNodeConnect}
+        onConnectStart={handleNodeConnectStart}
+        onConnectEnd={handleNodeConnectEnd}
+        onEdgeMouseEnter={handleEdgeEnter}
+        onEdgeMouseLeave={handleEdgeLeave}
+        onEdgesChange={handleEdgesChange}
+        onSelectionStart={handleSelectionStart}
+        onSelectionChange={handleSelectionChange}
+        onSelectionDrag={handleSelectionDrag}
+        onPaneContextMenu={handlePaneContextMenu}
+        connectionLineComponent={CustomConnectionLine}
+        // TODO: For LOOP node, how to distinguish between ITERATION and LOOP here? Maybe both are the same?
+        connectionLineContainerStyle={{ zIndex: ITERATION_CHILDREN_Z_INDEX }}
+        defaultViewport={viewport}
+        multiSelectionKeyCode={null}
+        deleteKeyCode={null}
+        nodesDraggable={!nodesReadOnly}
+        nodesConnectable={!nodesReadOnly}
+        nodesFocusable={!nodesReadOnly}
+        edgesFocusable={!nodesReadOnly}
+        panOnScroll={false}
+        panOnDrag={controlMode === ControlMode.Hand && !workflowReadOnly}
+        zoomOnPinch={!workflowReadOnly}
+        zoomOnScroll={!workflowReadOnly}
+        zoomOnDoubleClick={!workflowReadOnly}
+        isValidConnection={isValidConnection}
+        selectionKeyCode={null}
+        selectionMode={SelectionMode.Partial}
+        selectionOnDrag={controlMode === ControlMode.Pointer && !workflowReadOnly}
+        minZoom={0.25}
+      >
+        <Background
+          gap={[14, 14]}
+          size={2}
+          className="bg-workflow-canvas-workflow-bg"
+          color='var(--color-workflow-canvas-workflow-dot-color)'
+        />
+      </ReactFlow>
+    </div>
+  )
+})
+
+type WorkflowWithInnerContextProps = WorkflowProps & {
+  hooksStore?: Partial<HooksStoreShape>
+}
+export const WorkflowWithInnerContext = memo(({
+  hooksStore,
+  ...restProps
+}: WorkflowWithInnerContextProps) => {
+  return (
+    <HooksStoreContextProvider {...hooksStore}>
+      <Workflow {...restProps} />
+    </HooksStoreContextProvider>
+  )
+})
+
+type WorkflowWithDefaultContextProps =
+  Pick<WorkflowProps, 'edges' | 'nodes'>
+  & {
+    children: React.ReactNode
+  }
+
+const WorkflowWithDefaultContext = ({
+  nodes,
+  edges,
+  children,
+}: WorkflowWithDefaultContextProps) => {
+  return (
+    <ReactFlowProvider>
+      <WorkflowHistoryProvider
+        nodes={nodes}
+        edges={edges} >
+        <DatasetsDetailProvider nodes={nodes}>
+          {children}
+        </DatasetsDetailProvider>
+      </WorkflowHistoryProvider>
+    </ReactFlowProvider>
+  )
+}
+
+export default memo(WorkflowWithDefaultContext)
diff --git a/app/components/workflow/limit-tips.tsx b/app/components/workflow/limit-tips.tsx
new file mode 100644
index 0000000..f0181bc
--- /dev/null
+++ b/app/components/workflow/limit-tips.tsx
@@ -0,0 +1,39 @@
+import {
+  RiAlertFill,
+  RiCloseLine,
+} from '@remixicon/react'
+import { useStore } from './store'
+import ActionButton from '@/app/components/base/action-button'
+
+const LimitTips = () => {
+  const showTips = useStore(s => s.showTips)
+  const setShowTips = useStore(s => s.setShowTips)
+
+  if (!showTips)
+    return null
+
+  return (
+    <div className='absolute bottom-16 left-1/2 z-[9] flex h-10 -translate-x-1/2 items-center rounded-xl border border-components-panel-border bg-components-panel-bg-blur p-2 shadow-md'>
+      <div
+        className='absolute inset-0 rounded-xl opacity-[0.4]'
+        style={{
+          background: 'linear-gradient(92deg, rgba(247, 144, 9, 0.25) 0%, rgba(255, 255, 255, 0.00) 100%)',
+        }}
+      ></div>
+      <div className='flex h-5 w-5 items-center justify-center'>
+        <RiAlertFill className='h-4 w-4 text-text-warning-secondary' />
+      </div>
+      <div className='system-xs-medium mx-1 px-1 text-text-primary'>
+        {showTips}
+      </div>
+      <ActionButton
+        className='z-[1]'
+        onClick={() => setShowTips('')}
+      >
+        <RiCloseLine className='h-4 w-4' />
+      </ActionButton>
+    </div>
+  )
+}
+
+export default LimitTips
diff --git a/app/components/workflow/node-contextmenu.tsx b/app/components/workflow/node-contextmenu.tsx
new file mode 100644
index 0000000..311bf1f
--- /dev/null
+++ b/app/components/workflow/node-contextmenu.tsx
@@ -0,0 +1,51 @@
+import {
+  memo,
+  useEffect,
+  useRef,
+} from 'react'
+import { useClickAway } from 'ahooks'
+import { useNodes } from 'reactflow'
+import PanelOperatorPopup from './nodes/_base/components/panel-operator/panel-operator-popup'
+import type { Node } from './types'
+import { useStore } from './store'
+import { usePanelInteractions } from './hooks'
+
+const NodeContextmenu = () => {
+  const ref = useRef(null)
+  const nodes = useNodes()
+  const { handleNodeContextmenuCancel, handlePaneContextmenuCancel } = usePanelInteractions()
+  const nodeMenu = useStore(s => s.nodeMenu)
+  const currentNode = nodes.find(node => node.id === nodeMenu?.nodeId) as Node
+
+  useEffect(() => {
+    if (nodeMenu)
+      handlePaneContextmenuCancel()
+  }, [nodeMenu, handlePaneContextmenuCancel])
+
+  useClickAway(() => {
+    handleNodeContextmenuCancel()
+  }, ref)
+
+  if (!nodeMenu || !currentNode)
+    return null
+
+  return (
+    <div
+      className='absolute z-[9]'
+      style={{
+        left: nodeMenu.left,
+        top: nodeMenu.top,
+      }}
+      ref={ref}
+    >
+      <PanelOperatorPopup
+        id={currentNode.id}
+        data={currentNode.data}
+        onClosePopup={() => handleNodeContextmenuCancel()}
+        showHelpLink
+      />
+    </div>
+  )
+}
+
+export default memo(NodeContextmenu)
diff --git a/app/components/workflow/nodes/_base/components/add-button.tsx b/app/components/workflow/nodes/_base/components/add-button.tsx
new file mode 100644
index 0000000..5b75726
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/add-button.tsx
@@ -0,0 +1,33 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import {
+  RiAddLine,
+} from '@remixicon/react'
+import cn from '@/utils/classnames'
+import Button from '@/app/components/base/button'
+
+type Props = {
+  className?: string
+  text: string
+  onClick: () => void
+}
+
+const AddButton: FC<Props> = ({
+  className,
+  text,
+  onClick,
+}) => {
+  return (
+    <Button
+      className={cn('w-full', className)}
+      variant='tertiary'
+      size='medium'
+      onClick={onClick}
+    >
+      <RiAddLine className='mr-1 h-3.5 w-3.5' />
+      <div>{text}</div>
+    </Button>
+  )
+}
+export default React.memo(AddButton)
diff --git a/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx b/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx
new file mode 100644
index 0000000..d0f971f
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx
@@ -0,0 +1,130 @@
+import {
+  memo,
+  useCallback,
+  useMemo,
+  useRef,
+} from 'react'
+import { useClickAway } from 'ahooks'
+import { useStore } from '../../../store'
+import {
+  useIsChatMode,
+  useNodeDataUpdate,
+  useWorkflow,
+  useWorkflowVariables,
+} from '../../../hooks'
+import type {
+  ValueSelector,
+  Var,
+  VarType,
+} from '../../../types'
+import { useVariableAssigner } from '../../variable-assigner/hooks'
+import { filterVar } from '../../variable-assigner/utils'
+import AddVariablePopup from './add-variable-popup'
+
+type AddVariablePopupWithPositionProps = {
+  nodeId: string
+  nodeData: any
+}
+const AddVariablePopupWithPosition = ({
+  nodeId,
+  nodeData,
+}: AddVariablePopupWithPositionProps) => {
+  const ref = useRef<HTMLDivElement>(null)
+  const showAssignVariablePopup = useStore(s => s.showAssignVariablePopup)
+  const setShowAssignVariablePopup = useStore(s => s.setShowAssignVariablePopup)
+  const { handleNodeDataUpdate } = useNodeDataUpdate()
+  const { handleAddVariableInAddVariablePopupWithPosition } = useVariableAssigner()
+  const isChatMode = useIsChatMode()
+  const { getBeforeNodesInSameBranch } = useWorkflow()
+  const { getNodeAvailableVars } = useWorkflowVariables()
+
+  const outputType = useMemo(() => {
+    if (!showAssignVariablePopup)
+      return ''
+
+    const groupEnabled = showAssignVariablePopup.variableAssignerNodeData.advanced_settings?.group_enabled
+
+    if (!groupEnabled)
+      return showAssignVariablePopup.variableAssignerNodeData.output_type
+
+    const group = showAssignVariablePopup.variableAssignerNodeData.advanced_settings?.groups.find(group => group.groupId === showAssignVariablePopup.variableAssignerNodeHandleId)
+    return group?.output_type || ''
+  }, [showAssignVariablePopup])
+  const availableVars = useMemo(() => {
+    if (!showAssignVariablePopup)
+      return []
+
+    return getNodeAvailableVars({
+      parentNode: showAssignVariablePopup.parentNode,
+      beforeNodes: [
+        ...getBeforeNodesInSameBranch(showAssignVariablePopup.nodeId),
+        {
+          id: showAssignVariablePopup.nodeId,
+          data: showAssignVariablePopup.nodeData,
+        } as any,
+      ],
+      hideEnv: true,
+      hideChatVar: true,
+      isChatMode,
+      filterVar: filterVar(outputType as VarType),
+    })
+      .map(node => ({
+        ...node,
+        vars: node.isStartNode ? node.vars.filter(v => !v.variable.startsWith('sys.')) : node.vars,
+      }))
+      .filter(item => item.vars.length > 0)
+  }, [showAssignVariablePopup, getNodeAvailableVars, getBeforeNodesInSameBranch, isChatMode, outputType])
+
+  useClickAway(() => {
+    if (nodeData._holdAddVariablePopup) {
+      handleNodeDataUpdate({
+        id: nodeId,
+        data: {
+          _holdAddVariablePopup: false,
+        },
+      })
+    }
+    else {
+      handleNodeDataUpdate({
+        id: nodeId,
+        data: {
+          _showAddVariablePopup: false,
+        },
+      })
+      setShowAssignVariablePopup(undefined)
+    }
+  }, ref)
+
+  const handleAddVariable = useCallback((value: ValueSelector, varDetail: Var) => {
+    if (showAssignVariablePopup) {
+      handleAddVariableInAddVariablePopupWithPosition(
+        showAssignVariablePopup.nodeId,
+        showAssignVariablePopup.variableAssignerNodeId,
+        showAssignVariablePopup.variableAssignerNodeHandleId,
+        value,
+        varDetail,
+      )
+    }
+  }, [showAssignVariablePopup, handleAddVariableInAddVariablePopupWithPosition])
+
+  if (!showAssignVariablePopup)
+    return null
+
+  return (
+    <div
+      className='absolute z-10'
+      style={{
+        left: showAssignVariablePopup.x,
+        top: showAssignVariablePopup.y,
+      }}
+      ref={ref}
+    >
+      <AddVariablePopup
+        availableVars={availableVars}
+        onSelect={handleAddVariable}
+      />
+    </div>
+  )
+}
+
+export default memo(AddVariablePopupWithPosition)
diff --git a/app/components/workflow/nodes/_base/components/add-variable-popup.tsx b/app/components/workflow/nodes/_base/components/add-variable-popup.tsx
new file mode 100644
index 0000000..a7a3a89
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/add-variable-popup.tsx
@@ -0,0 +1,36 @@
+import { memo } from 'react'
+import { useTranslation } from 'react-i18next'
+import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars'
+import type {
+  NodeOutPutVar,
+  ValueSelector,
+  Var,
+} from '@/app/components/workflow/types'
+
+export type AddVariablePopupProps = {
+  availableVars: NodeOutPutVar[]
+  onSelect: (value: ValueSelector, item: Var) => void
+}
+export const AddVariablePopup = ({
+  availableVars,
+  onSelect,
+}: AddVariablePopupProps) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='w-[240px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-lg'>
+      <div className='flex h-[34px] items-center border-b-[0.5px] border-b-divider-regular px-4 text-[13px] font-semibold text-text-secondary'>
+        {t('workflow.nodes.variableAssigner.setAssignVariable')}
+      </div>
+      <div className='p-1'>
+        <VarReferenceVars
+          hideSearch
+          vars={availableVars}
+          onChange={onSelect}
+        />
+      </div>
+    </div>
+  )
+}
+
+export default memo(AddVariablePopup)
diff --git a/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx b/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx
new file mode 100644
index 0000000..dd6a1c6
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx
@@ -0,0 +1,232 @@
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+import type { ReactNode } from 'react'
+import { memo, useEffect, useMemo, useRef, useState } from 'react'
+import type { Strategy } from './agent-strategy'
+import classNames from '@/utils/classnames'
+import { RiArrowDownSLine, RiErrorWarningFill } from '@remixicon/react'
+import Tooltip from '@/app/components/base/tooltip'
+import Link from 'next/link'
+import { InstallPluginButton } from './install-plugin-button'
+import ViewTypeSelect, { ViewType } from '../../../block-selector/view-type-select'
+import SearchInput from '@/app/components/base/search-input'
+import Tools from '../../../block-selector/tools'
+import { useTranslation } from 'react-i18next'
+import { useStrategyProviders } from '@/service/use-strategy'
+import { PluginType, type StrategyPluginDetail } from '@/app/components/plugins/types'
+import type { ToolWithProvider } from '../../../types'
+import { CollectionType } from '@/app/components/tools/types'
+import useGetIcon from '@/app/components/plugins/install-plugin/base/use-get-icon'
+import { useStrategyInfo } from '../../agent/use-config'
+import { SwitchPluginVersion } from './switch-plugin-version'
+import type { ListRef } from '@/app/components/workflow/block-selector/market-place-plugin/list'
+import PluginList, { type ListProps } from '@/app/components/workflow/block-selector/market-place-plugin/list'
+import { useMarketplacePlugins } from '@/app/components/plugins/marketplace/hooks'
+import { ToolTipContent } from '@/app/components/base/tooltip/content'
+
+const DEFAULT_TAGS: ListProps['tags'] = []
+
+const NotFoundWarn = (props: {
+  title: ReactNode,
+  description: ReactNode
+}) => {
+  const { title, description } = props
+
+  const { t } = useTranslation()
+  return <Tooltip
+    popupContent={
+      <div className='space-y-1 text-xs'>
+        <h3 className='font-semibold text-text-primary'>
+          {title}
+        </h3>
+        <p className='tracking-tight text-text-secondary'>
+          {description}
+        </p>
+        <p>
+          <Link href={'/plugins'} className='tracking-tight text-text-accent'>
+            {t('workflow.nodes.agent.linkToPlugin')}
+          </Link>
+        </p>
+      </div>
+    }
+    needsDelay
+  >
+    <div>
+      <RiErrorWarningFill className='size-4 text-text-destructive' />
+    </div>
+  </Tooltip>
+}
+
+function formatStrategy(input: StrategyPluginDetail[], getIcon: (i: string) => string): ToolWithProvider[] {
+  return input.map((item) => {
+    const res: ToolWithProvider = {
+      id: item.plugin_unique_identifier,
+      author: item.declaration.identity.author,
+      name: item.declaration.identity.name,
+      description: item.declaration.identity.description as any,
+      plugin_id: item.plugin_id,
+      icon: getIcon(item.declaration.identity.icon),
+      label: item.declaration.identity.label as any,
+      type: CollectionType.all,
+      tools: item.declaration.strategies.map(strategy => ({
+        name: strategy.identity.name,
+        author: strategy.identity.author,
+        label: strategy.identity.label as any,
+        description: strategy.description,
+        parameters: strategy.parameters as any,
+        output_schema: strategy.output_schema,
+        labels: [],
+      })),
+      team_credentials: {},
+      is_team_authorization: true,
+      allow_delete: false,
+      labels: [],
+    }
+    return res
+  })
+}
+
+export type AgentStrategySelectorProps = {
+  value?: Strategy,
+  onChange: (value?: Strategy) => void,
+}
+
+export const AgentStrategySelector = memo((props: AgentStrategySelectorProps) => {
+  const { value, onChange } = props
+  const [open, setOpen] = useState(false)
+  const [viewType, setViewType] = useState<ViewType>(ViewType.flat)
+  const [query, setQuery] = useState('')
+  const stra = useStrategyProviders()
+  const { getIconUrl } = useGetIcon()
+  const list = stra.data ? formatStrategy(stra.data, getIconUrl) : undefined
+  const filteredTools = useMemo(() => {
+    if (!list) return []
+    return list.filter(tool => tool.name.toLowerCase().includes(query.toLowerCase()))
+  }, [query, list])
+  const { strategyStatus, refetch: refetchStrategyInfo } = useStrategyInfo(
+    value?.agent_strategy_provider_name,
+    value?.agent_strategy_name,
+  )
+
+  const showPluginNotInstalledWarn = strategyStatus?.plugin?.source === 'external'
+    && !strategyStatus.plugin.installed && !!value
+
+  const showUnsupportedStrategy = strategyStatus?.plugin.source === 'external'
+    && !strategyStatus?.isExistInPlugin && !!value
+
+  const showSwitchVersion = !strategyStatus?.isExistInPlugin
+    && strategyStatus?.plugin.source === 'marketplace' && strategyStatus.plugin.installed && !!value
+
+  const showInstallButton = !strategyStatus?.isExistInPlugin
+    && strategyStatus?.plugin.source === 'marketplace' && !strategyStatus.plugin.installed && !!value
+
+  const icon = list?.find(
+    coll => coll.tools?.find(tool => tool.name === value?.agent_strategy_name),
+  )?.icon as string | undefined
+  const { t } = useTranslation()
+
+  const wrapElemRef = useRef<HTMLDivElement>(null)
+
+  const {
+    queryPluginsWithDebounced: fetchPlugins,
+    plugins: notInstalledPlugins = [],
+  } = useMarketplacePlugins()
+
+  useEffect(() => {
+    if (query) {
+      fetchPlugins({
+        query,
+        category: PluginType.agent,
+      })
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [query])
+
+  const pluginRef = useRef<ListRef>(null)
+
+  return <PortalToFollowElem open={open} onOpenChange={setOpen} placement='bottom'>
+    <PortalToFollowElemTrigger className='w-full'>
+      <div
+        className='flex h-8 w-full select-none items-center gap-0.5 rounded-lg bg-components-input-bg-normal p-1 hover:bg-state-base-hover-alt'
+        onClick={() => setOpen(o => !o)}
+      >
+        { }
+        {icon && <div className='flex h-6 w-6 items-center justify-center'><img
+          src={icon}
+          width={20}
+          height={20}
+          className='rounded-md border-[0.5px] border-components-panel-border-subtle bg-background-default-dodge'
+          alt='icon'
+        /></div>}
+        <p
+          className={classNames(value ? 'text-components-input-text-filled' : 'text-components-input-text-placeholder', 'text-xs px-1')}
+        >
+          {value?.agent_strategy_label || t('workflow.nodes.agent.strategy.selectTip')}
+        </p>
+        <div className='ml-auto flex items-center gap-1'>
+          {showInstallButton && value && <InstallPluginButton
+            onClick={e => e.stopPropagation()}
+            size={'small'}
+            uniqueIdentifier={value.plugin_unique_identifier}
+          />}
+          {showPluginNotInstalledWarn
+            ? <NotFoundWarn
+              title={t('workflow.nodes.agent.pluginNotInstalled')}
+              description={t('workflow.nodes.agent.pluginNotInstalledDesc')}
+            />
+            : showUnsupportedStrategy
+              ? <NotFoundWarn
+                title={t('workflow.nodes.agent.unsupportedStrategy')}
+                description={t('workflow.nodes.agent.strategyNotFoundDesc')}
+              />
+              : <RiArrowDownSLine className='size-4 text-text-tertiary' />
+          }
+          {showSwitchVersion && <SwitchPluginVersion
+            uniqueIdentifier={value.plugin_unique_identifier}
+            tooltip={<ToolTipContent
+              title={t('workflow.nodes.agent.unsupportedStrategy')}>
+              {t('workflow.nodes.agent.strategyNotFoundDescAndSwitchVersion')}
+            </ToolTipContent>}
+            onChange={() => {
+              refetchStrategyInfo()
+            }}
+          />}
+        </div>
+      </div>
+    </PortalToFollowElemTrigger>
+    <PortalToFollowElemContent className='z-10'>
+      <div className='w-[388px] overflow-hidden rounded-md border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow'>
+        <header className='flex gap-1 p-2'>
+          <SearchInput placeholder={t('workflow.nodes.agent.strategy.searchPlaceholder')} value={query} onChange={setQuery} className={'w-full'} />
+          <ViewTypeSelect viewType={viewType} onChange={setViewType} />
+        </header>
+        <main className="relative flex w-full flex-col overflow-hidden md:max-h-[300px] xl:max-h-[400px] 2xl:max-h-[564px]" ref={wrapElemRef}>
+          <Tools
+            tools={filteredTools}
+            viewType={viewType}
+            onSelect={(_, tool) => {
+              onChange({
+                agent_strategy_name: tool!.tool_name,
+                agent_strategy_provider_name: tool!.provider_name,
+                agent_strategy_label: tool!.tool_label,
+                agent_output_schema: tool!.output_schema,
+                plugin_unique_identifier: tool!.provider_id,
+              })
+              setOpen(false)
+            }}
+            className='h-full max-h-full max-w-none overflow-y-auto'
+            indexBarClassName='top-0 xl:top-36' showWorkflowEmpty={false} hasSearchText={false} />
+          <PluginList
+            ref={pluginRef}
+            wrapElemRef={wrapElemRef}
+            list={notInstalledPlugins}
+            searchText={query}
+            tags={DEFAULT_TAGS}
+            disableMaxWidth
+          />
+        </main>
+      </div>
+    </PortalToFollowElemContent>
+  </PortalToFollowElem>
+})
+
+AgentStrategySelector.displayName = 'AgentStrategySelector'
diff --git a/app/components/workflow/nodes/_base/components/agent-strategy.tsx b/app/components/workflow/nodes/_base/components/agent-strategy.tsx
new file mode 100644
index 0000000..de23602
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/agent-strategy.tsx
@@ -0,0 +1,239 @@
+import type { CredentialFormSchemaNumberInput, CredentialFormSchemaTextInput } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { type CredentialFormSchema, FormTypeEnum, ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import type { ToolVarInputs } from '../../tool/types'
+import ListEmpty from '@/app/components/base/list-empty'
+import { AgentStrategySelector } from './agent-strategy-selector'
+import Link from 'next/link'
+import { useTranslation } from 'react-i18next'
+import Form from '@/app/components/header/account-setting/model-provider-page/model-modal/Form'
+import { Agent } from '@/app/components/base/icons/src/vender/workflow'
+import { InputNumber } from '@/app/components/base/input-number'
+import Slider from '@/app/components/base/slider'
+import ToolSelector from '@/app/components/plugins/plugin-detail-panel/tool-selector'
+import MultipleToolSelector from '@/app/components/plugins/plugin-detail-panel/multiple-tool-selector'
+import Field from './field'
+import { type ComponentProps, memo } from 'react'
+import { useDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import Editor from './prompt/editor'
+import { useWorkflowStore } from '../../../store'
+import { useRenderI18nObject } from '@/hooks/use-i18n'
+import type { NodeOutPutVar } from '../../../types'
+import type { Node } from 'reactflow'
+import { useContext } from 'use-context-selector'
+import I18n from '@/context/i18n'
+import { LanguagesSupported } from '@/i18n/language'
+
+export type Strategy = {
+  agent_strategy_provider_name: string
+  agent_strategy_name: string
+  agent_strategy_label: string
+  agent_output_schema: Record<string, any>
+  plugin_unique_identifier: string
+}
+
+export type AgentStrategyProps = {
+  strategy?: Strategy
+  onStrategyChange: (strategy?: Strategy) => void
+  formSchema: CredentialFormSchema[]
+  formValue: ToolVarInputs
+  onFormValueChange: (value: ToolVarInputs) => void
+  nodeOutputVars?: NodeOutPutVar[],
+  availableNodes?: Node[],
+  nodeId?: string
+}
+
+type CustomSchema<Type, Field = {}> = Omit<CredentialFormSchema, 'type'> & { type: Type } & Field
+
+type ToolSelectorSchema = CustomSchema<'tool-selector'>
+type MultipleToolSelectorSchema = CustomSchema<'array[tools]'>
+
+type CustomField = ToolSelectorSchema | MultipleToolSelectorSchema
+
+export const AgentStrategy = memo((props: AgentStrategyProps) => {
+  const { strategy, onStrategyChange, formSchema, formValue, onFormValueChange, nodeOutputVars, availableNodes, nodeId } = props
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const defaultModel = useDefaultModel(ModelTypeEnum.textGeneration)
+  const renderI18nObject = useRenderI18nObject()
+  const workflowStore = useWorkflowStore()
+  const {
+    setControlPromptEditorRerenderKey,
+  } = workflowStore.getState()
+  const override: ComponentProps<typeof Form<CustomField>>['override'] = [
+    [FormTypeEnum.textNumber, FormTypeEnum.textInput],
+    (schema, props) => {
+      switch (schema.type) {
+        case FormTypeEnum.textInput: {
+          const def = schema as CredentialFormSchemaTextInput
+          const value = props.value[schema.variable] || schema.default
+          const instanceId = schema.variable
+          const onChange = (value: string) => {
+            props.onChange({ ...props.value, [schema.variable]: value })
+          }
+          const handleGenerated = (value: string) => {
+            onChange(value)
+            setControlPromptEditorRerenderKey(Math.random())
+          }
+          return <Editor
+            value={value}
+            onChange={onChange}
+            onGenerated={handleGenerated}
+            instanceId={instanceId}
+            key={instanceId}
+            title={renderI18nObject(schema.label)}
+            headerClassName='bg-transparent px-0 text-text-secondary system-sm-semibold-uppercase'
+            containerBackgroundClassName='bg-transparent'
+            gradientBorder={false}
+            isSupportPromptGenerator={!!def.auto_generate?.type}
+            titleTooltip={schema.tooltip && renderI18nObject(schema.tooltip)}
+            editorContainerClassName='px-0'
+            availableNodes={availableNodes}
+            nodesOutputVars={nodeOutputVars}
+            isSupportJinja={def.template?.enabled}
+            required={def.required}
+            varList={[]}
+            modelConfig={
+              defaultModel.data
+                ? {
+                  mode: 'chat',
+                  name: defaultModel.data.model,
+                  provider: defaultModel.data.provider.provider,
+                  completion_params: {},
+                } : undefined
+            }
+            placeholderClassName='px-2 py-1'
+            titleClassName='system-sm-semibold-uppercase text-text-secondary text-[13px]'
+            inputClassName='px-2 py-1 bg-components-input-bg-normal focus:bg-components-input-bg-active focus:border-components-input-border-active focus:border rounded-lg'
+          />
+        }
+        case FormTypeEnum.textNumber: {
+          const def = schema as CredentialFormSchemaNumberInput
+          if (!def.max || !def.min)
+            return false
+
+          const defaultValue = schema.default ? Number.parseInt(schema.default) : 1
+          const value = props.value[schema.variable] || defaultValue
+          const onChange = (value: number) => {
+            props.onChange({ ...props.value, [schema.variable]: value })
+          }
+          return <Field
+            title={<>
+              {renderI18nObject(def.label)} {def.required && <span className='text-red-500'>*</span>}
+            </>}
+            tooltip={def.tooltip && renderI18nObject(def.tooltip)}
+            inline
+          >
+            <div className='flex w-[200px] items-center gap-3'>
+              <Slider
+                value={value}
+                onChange={onChange}
+                className='w-full'
+                min={def.min}
+                max={def.max}
+              />
+              <InputNumber
+                value={value}
+                // TODO: maybe empty, handle this
+                onChange={onChange as any}
+                defaultValue={defaultValue}
+                size='regular'
+                min={def.min}
+                max={def.max}
+                className='w-12'
+              />
+            </div>
+          </Field>
+        }
+      }
+    },
+  ]
+  const renderField: ComponentProps<typeof Form<CustomField>>['customRenderField'] = (schema, props) => {
+    switch (schema.type) {
+      case FormTypeEnum.toolSelector: {
+        const value = props.value[schema.variable]
+        const onChange = (value: any) => {
+          props.onChange({ ...props.value, [schema.variable]: value })
+        }
+        return (
+          <Field
+            title={<>
+              {renderI18nObject(schema.label)} {schema.required && <span className='text-red-500'>*</span>}
+            </>}
+            tooltip={schema.tooltip && renderI18nObject(schema.tooltip)}
+          >
+            <ToolSelector
+              nodeId={props.nodeId || ''}
+              nodeOutputVars={props.nodeOutputVars || []}
+              availableNodes={props.availableNodes || []}
+              scope={schema.scope}
+              value={value}
+              onSelect={item => onChange(item)}
+              onDelete={() => onChange(null)}
+            />
+          </Field>
+        )
+      }
+      case FormTypeEnum.multiToolSelector: {
+        const value = props.value[schema.variable]
+        const onChange = (value: any) => {
+          props.onChange({ ...props.value, [schema.variable]: value })
+        }
+        return (
+          <MultipleToolSelector
+            nodeId={props.nodeId || ''}
+            nodeOutputVars={props.nodeOutputVars || []}
+            availableNodes={props.availableNodes || []}
+            scope={schema.scope}
+            value={value || []}
+            label={renderI18nObject(schema.label)}
+            tooltip={schema.tooltip && renderI18nObject(schema.tooltip)}
+            onChange={onChange}
+            supportCollapse
+            required={schema.required}
+          />
+        )
+      }
+    }
+  }
+  return <div className='space-y-2'>
+    <AgentStrategySelector value={strategy} onChange={onStrategyChange} />
+    {
+      strategy
+        ? <div>
+          <Form<CustomField>
+            formSchemas={[
+              ...formSchema,
+            ]}
+            value={formValue}
+            onChange={onFormValueChange}
+            validating={false}
+            showOnVariableMap={{}}
+            isEditMode={true}
+            isAgentStrategy={true}
+            fieldLabelClassName='uppercase'
+            customRenderField={renderField}
+            override={override}
+            nodeId={nodeId}
+            nodeOutputVars={nodeOutputVars || []}
+            availableNodes={availableNodes || []}
+          />
+        </div>
+        : <ListEmpty
+          icon={<Agent className='h-5 w-5 shrink-0 text-text-accent' />}
+          title={t('workflow.nodes.agent.strategy.configureTip')}
+          description={<div className='text-xs text-text-tertiary'>
+            {t('workflow.nodes.agent.strategy.configureTipDesc')} <br />
+            <Link href={
+              locale === LanguagesSupported[1]
+                ? 'https://docs.dify.ai/zh-hans/guides/workflow/node/agent#xuan-ze-agent-ce-le'
+                : 'https://docs.dify.ai/en/guides/workflow/node/agent#select-an-agent-strategy'
+            } className='text-text-accent-secondary' target='_blank'>
+              {t('workflow.nodes.agent.learnMore')}
+            </Link>
+          </div>}
+        />
+    }
+  </div>
+})
+
+AgentStrategy.displayName = 'AgentStrategy'
diff --git a/app/components/workflow/nodes/_base/components/before-run-form/form-item.tsx b/app/components/workflow/nodes/_base/components/before-run-form/form-item.tsx
new file mode 100644
index 0000000..9f415ad
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/before-run-form/form-item.tsx
@@ -0,0 +1,301 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import {
+  RiDeleteBinLine,
+} from '@remixicon/react'
+import type { InputVar } from '../../../../types'
+import { BlockEnum, InputVarType, SupportUploadFileTypes } from '../../../../types'
+import CodeEditor from '../editor/code-editor'
+import { CodeLanguage } from '../../../code/types'
+import TextEditor from '../editor/text-editor'
+import Select from '@/app/components/base/select'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import TextGenerationImageUploader from '@/app/components/base/image-uploader/text-generation-image-uploader'
+import { FileUploaderInAttachmentWrapper } from '@/app/components/base/file-uploader'
+import { Resolution, TransferMethod } from '@/types/app'
+import { useFeatures } from '@/app/components/base/features/hooks'
+import { VarBlockIcon } from '@/app/components/workflow/block-icon'
+import { Line3 } from '@/app/components/base/icons/src/public/common'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import { BubbleX } from '@/app/components/base/icons/src/vender/line/others'
+import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'
+import cn from '@/utils/classnames'
+import type { FileEntity } from '@/app/components/base/file-uploader/types'
+
+type Props = {
+  payload: InputVar
+  value: any
+  onChange: (value: any) => void
+  className?: string
+  autoFocus?: boolean
+  inStepRun?: boolean
+}
+
+const FormItem: FC<Props> = ({
+  payload,
+  value,
+  onChange,
+  className,
+  autoFocus,
+  inStepRun = false,
+}) => {
+  const { t } = useTranslation()
+  const { type } = payload
+  const fileSettings = useFeatures(s => s.features.file)
+  const handleArrayItemChange = useCallback((index: number) => {
+    return (newValue: any) => {
+      const newValues = produce(value, (draft: any) => {
+        draft[index] = newValue
+      })
+      onChange(newValues)
+    }
+  }, [value, onChange])
+
+  const handleArrayItemRemove = useCallback((index: number) => {
+    return () => {
+      const newValues = produce(value, (draft: any) => {
+        draft.splice(index, 1)
+      })
+      onChange(newValues)
+    }
+  }, [value, onChange])
+  const nodeKey = (() => {
+    if (typeof payload.label === 'object') {
+      const { nodeType, nodeName, variable, isChatVar } = payload.label
+      return (
+        <div className='flex h-full items-center'>
+          {!isChatVar && (
+            <div className='flex items-center'>
+              <div className='p-[1px]'>
+                <VarBlockIcon type={nodeType || BlockEnum.Start} />
+              </div>
+              <div className='mx-0.5 max-w-[150px] truncate text-xs font-medium text-gray-700' title={nodeName}>
+                {nodeName}
+              </div>
+              <Line3 className='mr-0.5'></Line3>
+            </div>
+          )}
+          <div className='flex items-center text-primary-600'>
+            {!isChatVar && <Variable02 className='h-3.5 w-3.5' />}
+            {isChatVar && <BubbleX className='h-3.5 w-3.5 text-util-colors-teal-teal-700' />}
+            <div className={cn('ml-0.5 max-w-[150px] truncate text-xs font-medium', isChatVar && 'text-text-secondary')} title={variable} >
+              {variable}
+            </div>
+          </div>
+        </div>
+      )
+    }
+    return ''
+  })()
+
+  const isArrayLikeType = [InputVarType.contexts, InputVarType.iterator].includes(type)
+  const isContext = type === InputVarType.contexts
+  const isIterator = type === InputVarType.iterator
+  const singleFileValue = useMemo(() => {
+    if (payload.variable === '#files#')
+      return value?.[0] || []
+
+    return value ? [value] : []
+  }, [payload.variable, value])
+  const handleSingleFileChange = useCallback((files: FileEntity[]) => {
+    if (payload.variable === '#files#')
+      onChange(files)
+    else if (files.length)
+      onChange(files[0])
+    else
+      onChange(null)
+  }, [onChange, payload.variable])
+
+  return (
+    <div className={cn(className)}>
+      {!isArrayLikeType && (
+        <div className='system-sm-semibold mb-1 flex h-6 items-center gap-1 text-text-secondary'>
+          <div className='truncate'>{typeof payload.label === 'object' ? nodeKey : payload.label}</div>
+          {!payload.required && <span className='system-xs-regular text-text-tertiary'>{t('workflow.panel.optional')}</span>}
+        </div>
+      )}
+      <div className='grow'>
+        {
+          type === InputVarType.textInput && (
+            <Input
+              value={value || ''}
+              onChange={e => onChange(e.target.value)}
+              placeholder={t('appDebug.variableConfig.inputPlaceholder')!}
+              autoFocus={autoFocus}
+            />
+          )
+        }
+
+        {
+          type === InputVarType.number && (
+            <Input
+              type="number"
+              value={value || ''}
+              onChange={e => onChange(e.target.value)}
+              placeholder={t('appDebug.variableConfig.inputPlaceholder')!}
+              autoFocus={autoFocus}
+            />
+          )
+        }
+
+        {
+          type === InputVarType.paragraph && (
+            <Textarea
+              value={value || ''}
+              onChange={e => onChange(e.target.value)}
+              placeholder={t('appDebug.variableConfig.inputPlaceholder')!}
+              autoFocus={autoFocus}
+            />
+          )
+        }
+
+        {
+          type === InputVarType.select && (
+            <Select
+              className="w-full"
+              defaultValue={value || ''}
+              items={payload.options?.map(option => ({ name: option, value: option })) || []}
+              onSelect={i => onChange(i.value)}
+              allowSearch={false}
+            />
+          )
+        }
+
+        {
+          type === InputVarType.json && (
+            <CodeEditor
+              value={value}
+              title={<span>JSON</span>}
+              language={CodeLanguage.json}
+              onChange={onChange}
+            />
+          )
+        }
+        {(type === InputVarType.singleFile) && (
+          <FileUploaderInAttachmentWrapper
+            value={singleFileValue}
+            onChange={handleSingleFileChange}
+            fileConfig={{
+              allowed_file_types: inStepRun
+                ? [
+                  SupportUploadFileTypes.image,
+                  SupportUploadFileTypes.document,
+                  SupportUploadFileTypes.audio,
+                  SupportUploadFileTypes.video,
+                ]
+                : payload.allowed_file_types,
+              allowed_file_extensions: inStepRun
+                ? [
+                  ...FILE_EXTS[SupportUploadFileTypes.image],
+                  ...FILE_EXTS[SupportUploadFileTypes.document],
+                  ...FILE_EXTS[SupportUploadFileTypes.audio],
+                  ...FILE_EXTS[SupportUploadFileTypes.video],
+                ]
+                : payload.allowed_file_extensions,
+              allowed_file_upload_methods: inStepRun ? [TransferMethod.local_file, TransferMethod.remote_url] : payload.allowed_file_upload_methods,
+              number_limits: 1,
+              fileUploadConfig: fileSettings?.fileUploadConfig,
+            }}
+          />
+        )}
+        {(type === InputVarType.multiFiles) && (
+          <FileUploaderInAttachmentWrapper
+            value={value}
+            onChange={files => onChange(files)}
+            fileConfig={{
+              allowed_file_types: inStepRun
+                ? [
+                  SupportUploadFileTypes.image,
+                  SupportUploadFileTypes.document,
+                  SupportUploadFileTypes.audio,
+                  SupportUploadFileTypes.video,
+                ]
+                : payload.allowed_file_types,
+              allowed_file_extensions: inStepRun
+                ? [
+                  ...FILE_EXTS[SupportUploadFileTypes.image],
+                  ...FILE_EXTS[SupportUploadFileTypes.document],
+                  ...FILE_EXTS[SupportUploadFileTypes.audio],
+                  ...FILE_EXTS[SupportUploadFileTypes.video],
+                ]
+                : payload.allowed_file_extensions,
+              allowed_file_upload_methods: inStepRun ? [TransferMethod.local_file, TransferMethod.remote_url] : payload.allowed_file_upload_methods,
+              number_limits: inStepRun ? 5 : payload.max_length,
+              fileUploadConfig: fileSettings?.fileUploadConfig,
+            }}
+          />
+        )}
+        {
+          type === InputVarType.files && (
+            <TextGenerationImageUploader
+              settings={{
+                ...fileSettings,
+                detail: fileSettings?.image?.detail || Resolution.high,
+                transfer_methods: fileSettings?.allowed_file_upload_methods || [],
+              } as any}
+              onFilesChange={files => onChange(files.filter(file => file.progress !== -1).map(fileItem => ({
+                type: 'image',
+                transfer_method: fileItem.type,
+                url: fileItem.url,
+                upload_file_id: fileItem.fileId,
+              })))}
+            />
+          )
+        }
+
+        {
+          isContext && (
+            <div className='space-y-2'>
+              {(value || []).map((item: any, index: number) => (
+                <CodeEditor
+                  key={index}
+                  value={item}
+                  title={<span>JSON</span>}
+                  headerRight={
+                    (value as any).length > 1
+                      ? (<RiDeleteBinLine
+                        onClick={handleArrayItemRemove(index)}
+                        className='mr-1 h-3.5 w-3.5 cursor-pointer text-text-tertiary'
+                      />)
+                      : undefined
+                  }
+                  language={CodeLanguage.json}
+                  onChange={handleArrayItemChange(index)}
+                />
+              ))}
+            </div>
+          )
+        }
+
+        {
+          isIterator && (
+            <div className='space-y-2'>
+              {(value || []).map((item: any, index: number) => (
+                <TextEditor
+                  key={index}
+                  isInNode
+                  value={item}
+                  title={<span>{t('appDebug.variableConfig.content')} {index + 1} </span>}
+                  onChange={handleArrayItemChange(index)}
+                  headerRight={
+                    (value as any).length > 1
+                      ? (<RiDeleteBinLine
+                        onClick={handleArrayItemRemove(index)}
+                        className='mr-1 h-3.5 w-3.5 cursor-pointer text-text-tertiary'
+                      />)
+                      : undefined
+                  }
+                />
+              ))}
+            </div>
+          )
+        }
+      </div>
+    </div>
+  )
+}
+export default React.memo(FormItem)
diff --git a/app/components/workflow/nodes/_base/components/before-run-form/form.tsx b/app/components/workflow/nodes/_base/components/before-run-form/form.tsx
new file mode 100644
index 0000000..884729c
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/before-run-form/form.tsx
@@ -0,0 +1,97 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useMemo, useRef } from 'react'
+import produce from 'immer'
+import type { InputVar } from '../../../../types'
+import FormItem from './form-item'
+import cn from '@/utils/classnames'
+import { InputVarType } from '@/app/components/workflow/types'
+import AddButton from '@/app/components/base/button/add-button'
+import { RETRIEVAL_OUTPUT_STRUCT } from '@/app/components/workflow/constants'
+
+export type Props = {
+  className?: string
+  label?: string
+  inputs: InputVar[]
+  values: Record<string, string>
+  onChange: (newValues: Record<string, any>) => void
+}
+
+const Form: FC<Props> = ({
+  className,
+  label,
+  inputs,
+  values,
+  onChange,
+}) => {
+  const mapKeysWithSameValueSelector = useMemo(() => {
+    const keysWithSameValueSelector = (key: string) => {
+      const targetValueSelector = inputs.find(
+        item => item.variable === key,
+      )?.value_selector
+      if (!targetValueSelector)
+        return [key]
+
+      const result: string[] = []
+      inputs.forEach((item) => {
+        if (item.value_selector?.join('.') === targetValueSelector.join('.'))
+          result.push(item.variable)
+      })
+      return result
+    }
+
+    const m = new Map()
+    for (const input of inputs)
+      m.set(input.variable, keysWithSameValueSelector(input.variable))
+
+    return m
+  }, [inputs])
+  const valuesRef = useRef(values)
+  useEffect(() => {
+    valuesRef.current = values
+  }, [values])
+  const handleChange = useCallback((key: string) => {
+    const mKeys = mapKeysWithSameValueSelector.get(key) ?? [key]
+    return (value: any) => {
+      const newValues = produce(valuesRef.current, (draft) => {
+        for (const k of mKeys)
+          draft[k] = value
+      })
+      onChange(newValues)
+    }
+  }, [valuesRef, onChange, mapKeysWithSameValueSelector])
+  const isArrayLikeType = [InputVarType.contexts, InputVarType.iterator].includes(inputs[0]?.type)
+  const isContext = inputs[0]?.type === InputVarType.contexts
+  const handleAddContext = useCallback(() => {
+    const newValues = produce(values, (draft: any) => {
+      const key = inputs[0].variable
+      draft[key].push(isContext ? RETRIEVAL_OUTPUT_STRUCT : '')
+    })
+    onChange(newValues)
+  }, [values, onChange, inputs, isContext])
+
+  return (
+    <div className={cn(className, 'space-y-2')}>
+      {label && (
+        <div className='mb-1 flex items-center justify-between'>
+          <div className='system-xs-medium-uppercase flex h-6 items-center text-text-tertiary'>{label}</div>
+          {isArrayLikeType && (
+            <AddButton onClick={handleAddContext} />
+          )}
+        </div>
+      )}
+      {inputs.map((input, index) => {
+        return (
+          <FormItem
+            inStepRun
+            key={index}
+            payload={input}
+            value={values[input.variable]}
+            onChange={handleChange(input.variable)}
+          />
+        )
+      })}
+    </div>
+  )
+}
+export default React.memo(Form)
diff --git a/app/components/workflow/nodes/_base/components/before-run-form/index.tsx b/app/components/workflow/nodes/_base/components/before-run-form/index.tsx
new file mode 100644
index 0000000..ad8d0b9
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/before-run-form/index.tsx
@@ -0,0 +1,205 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiCloseLine,
+  RiLoader2Line,
+} from '@remixicon/react'
+import type { Props as FormProps } from './form'
+import Form from './form'
+import cn from '@/utils/classnames'
+import Button from '@/app/components/base/button'
+import { StopCircle } from '@/app/components/base/icons/src/vender/solid/mediaAndDevices'
+import Split from '@/app/components/workflow/nodes/_base/components/split'
+import { InputVarType, NodeRunningStatus } from '@/app/components/workflow/types'
+import ResultPanel from '@/app/components/workflow/run/result-panel'
+import Toast from '@/app/components/base/toast'
+import { TransferMethod } from '@/types/app'
+import { getProcessedFiles } from '@/app/components/base/file-uploader/utils'
+import type { BlockEnum } from '@/app/components/workflow/types'
+import type { Emoji } from '@/app/components/tools/types'
+import type { SpecialResultPanelProps } from '@/app/components/workflow/run/special-result-panel'
+import SpecialResultPanel from '@/app/components/workflow/run/special-result-panel'
+
+const i18nPrefix = 'workflow.singleRun'
+
+type BeforeRunFormProps = {
+  nodeName: string
+  nodeType?: BlockEnum
+  toolIcon?: string | Emoji
+  onHide: () => void
+  onRun: (submitData: Record<string, any>) => void
+  onStop: () => void
+  runningStatus: NodeRunningStatus
+  result?: React.JSX.Element
+  forms: FormProps[]
+  showSpecialResultPanel?: boolean
+} & Partial<SpecialResultPanelProps>
+
+function formatValue(value: string | any, type: InputVarType) {
+  if (type === InputVarType.number)
+    return Number.parseFloat(value)
+  if (type === InputVarType.json)
+    return JSON.parse(value)
+  if (type === InputVarType.contexts) {
+    return value.map((item: any) => {
+      return JSON.parse(item)
+    })
+  }
+  if (type === InputVarType.multiFiles)
+    return getProcessedFiles(value)
+
+  if (type === InputVarType.singleFile) {
+    if (Array.isArray(value))
+      return getProcessedFiles(value)
+    return getProcessedFiles([value])[0]
+  }
+
+  return value
+}
+const BeforeRunForm: FC<BeforeRunFormProps> = ({
+  nodeName,
+  nodeType,
+  toolIcon,
+  onHide,
+  onRun,
+  onStop,
+  runningStatus,
+  result,
+  forms,
+  showSpecialResultPanel,
+  ...restResultPanelParams
+}) => {
+  const { t } = useTranslation()
+
+  const isFinished = runningStatus === NodeRunningStatus.Succeeded || runningStatus === NodeRunningStatus.Failed || runningStatus === NodeRunningStatus.Exception
+  const isRunning = runningStatus === NodeRunningStatus.Running
+  const isFileLoaded = (() => {
+    // system files
+    const filesForm = forms.find(item => !!item.values['#files#'])
+    if (!filesForm)
+      return true
+
+    const files = filesForm.values['#files#'] as any
+    if (files?.some((item: any) => item.transfer_method === TransferMethod.local_file && !item.upload_file_id))
+      return false
+
+    return true
+  })()
+  const handleRun = useCallback(() => {
+    let errMsg = ''
+    forms.forEach((form) => {
+      form.inputs.forEach((input) => {
+        const value = form.values[input.variable] as any
+        if (!errMsg && input.required && (value === '' || value === undefined || value === null || (input.type === InputVarType.files && value.length === 0)))
+          errMsg = t('workflow.errorMsg.fieldRequired', { field: typeof input.label === 'object' ? input.label.variable : input.label })
+
+        if (!errMsg && (input.type === InputVarType.singleFile || input.type === InputVarType.multiFiles) && value) {
+          let fileIsUploading = false
+          if (Array.isArray(value))
+            fileIsUploading = value.find(item => item.transferMethod === TransferMethod.local_file && !item.uploadedId)
+          else
+            fileIsUploading = value.transferMethod === TransferMethod.local_file && !value.uploadedId
+
+          if (fileIsUploading)
+            errMsg = t('appDebug.errorMessage.waitForFileUpload')
+        }
+      })
+    })
+    if (errMsg) {
+      Toast.notify({
+        message: errMsg,
+        type: 'error',
+      })
+      return
+    }
+
+    const submitData: Record<string, any> = {}
+    let parseErrorJsonField = ''
+    forms.forEach((form) => {
+      form.inputs.forEach((input) => {
+        try {
+          const value = formatValue(form.values[input.variable], input.type)
+          submitData[input.variable] = value
+        }
+        catch {
+          parseErrorJsonField = input.variable
+        }
+      })
+    })
+    if (parseErrorJsonField) {
+      Toast.notify({
+        message: t('workflow.errorMsg.invalidJson', { field: parseErrorJsonField }),
+        type: 'error',
+      })
+      return
+    }
+
+    onRun(submitData)
+  }, [forms, onRun, t])
+  return (
+    <div className='absolute inset-0 z-10 rounded-2xl bg-background-overlay-alt pt-10'>
+      <div className='flex h-full flex-col rounded-2xl bg-components-panel-bg'>
+        <div className='flex h-8 shrink-0 items-center justify-between pl-4 pr-3 pt-3'>
+          <div className='truncate text-base font-semibold text-text-primary'>
+            {t(`${i18nPrefix}.testRun`)} {nodeName}
+          </div>
+          <div className='ml-2 shrink-0 cursor-pointer p-1' onClick={() => {
+            onHide()
+          }}>
+            <RiCloseLine className='h-4 w-4 text-text-tertiary ' />
+          </div>
+        </div>
+        {
+          showSpecialResultPanel && (
+            <div className='h-0 grow overflow-y-auto pb-4'>
+              <SpecialResultPanel {...restResultPanelParams} />
+            </div>
+          )
+        }
+        {
+          !showSpecialResultPanel && (
+            <div className='h-0 grow overflow-y-auto pb-4'>
+              <div className='mt-3 space-y-4 px-4'>
+                {forms.map((form, index) => (
+                  <div key={index}>
+                    <Form
+                      key={index}
+                      className={cn(index < forms.length - 1 && 'mb-4')}
+                      {...form}
+                    />
+                    {index < forms.length - 1 && <Split />}
+                  </div>
+                ))}
+              </div>
+              <div className='mt-4 flex justify-between space-x-2 px-4' >
+                {isRunning && (
+                  <div
+                    className='cursor-pointer rounded-lg border border-divider-regular bg-components-button-secondary-bg p-2 shadow-xs'
+                    onClick={onStop}
+                  >
+                    <StopCircle className='h-4 w-4 text-text-tertiary' />
+                  </div>
+                )}
+                <Button disabled={!isFileLoaded || isRunning} variant='primary' className='w-0 grow space-x-2' onClick={handleRun}>
+                  {isRunning && <RiLoader2Line className='h-4 w-4 animate-spin' />}
+                  <div>{t(`${i18nPrefix}.${isRunning ? 'running' : 'startRun'}`)}</div>
+                </Button>
+              </div>
+              {isRunning && (
+                <ResultPanel status='running' showSteps={false} />
+              )}
+              {isFinished && (
+                <>
+                  {result}
+                </>
+              )}
+            </div>
+          )
+        }
+      </div>
+    </div>
+  )
+}
+export default React.memo(BeforeRunForm)
diff --git a/app/components/workflow/nodes/_base/components/code-generator-button.tsx b/app/components/workflow/nodes/_base/components/code-generator-button.tsx
new file mode 100644
index 0000000..42671e6
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/code-generator-button.tsx
@@ -0,0 +1,48 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useBoolean } from 'ahooks'
+import cn from 'classnames'
+import type { CodeLanguage } from '../../code/types'
+import { Generator } from '@/app/components/base/icons/src/vender/other'
+import { ActionButton } from '@/app/components/base/action-button'
+import { AppType } from '@/types/app'
+import type { CodeGenRes } from '@/service/debug'
+import { GetCodeGeneratorResModal } from '@/app/components/app/configuration/config/code-generator/get-code-generator-res'
+
+type Props = {
+  className?: string
+  onGenerated?: (prompt: string) => void
+  codeLanguages: CodeLanguage
+}
+
+const CodeGenerateBtn: FC<Props> = ({
+  className,
+  codeLanguages,
+  onGenerated,
+}) => {
+  const [showAutomatic, { setTrue: showAutomaticTrue, setFalse: showAutomaticFalse }] = useBoolean(false)
+  const handleAutomaticRes = useCallback((res: CodeGenRes) => {
+    onGenerated?.(res.code)
+    showAutomaticFalse()
+  }, [onGenerated, showAutomaticFalse])
+  return (
+    <div className={cn(className)}>
+      <ActionButton
+        className='hover:bg-[#155EFF]/8'
+        onClick={showAutomaticTrue}>
+        <Generator className='h-4 w-4 text-primary-600' />
+      </ActionButton>
+      {showAutomatic && (
+        <GetCodeGeneratorResModal
+          mode={AppType.chat}
+          isShow={showAutomatic}
+          codeLanguages={codeLanguages}
+          onClose={showAutomaticFalse}
+          onFinished={handleAutomaticRes}
+        />
+      )}
+    </div>
+  )
+}
+export default React.memo(CodeGenerateBtn)
diff --git a/app/components/workflow/nodes/_base/components/collapse/field-collapse.tsx b/app/components/workflow/nodes/_base/components/collapse/field-collapse.tsx
new file mode 100644
index 0000000..2390dfd
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/collapse/field-collapse.tsx
@@ -0,0 +1,36 @@
+import type { ReactNode } from 'react'
+import Collapse from '.'
+
+type FieldCollapseProps = {
+  title: string
+  children: ReactNode
+  collapsed?: boolean
+  onCollapse?: (collapsed: boolean) => void
+  operations?: ReactNode
+}
+const FieldCollapse = ({
+  title,
+  children,
+  collapsed,
+  onCollapse,
+  operations,
+}: FieldCollapseProps) => {
+  return (
+    <div className='py-4'>
+      <Collapse
+        trigger={
+          <div className='system-sm-semibold-uppercase flex h-6 cursor-pointer items-center text-text-secondary'>{title}</div>
+        }
+        operations={operations}
+        collapsed={collapsed}
+        onCollapse={onCollapse}
+      >
+        <div className='px-4'>
+          {children}
+        </div>
+      </Collapse>
+    </div>
+  )
+}
+
+export default FieldCollapse
diff --git a/app/components/workflow/nodes/_base/components/collapse/index.tsx b/app/components/workflow/nodes/_base/components/collapse/index.tsx
new file mode 100644
index 0000000..16fba88
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/collapse/index.tsx
@@ -0,0 +1,69 @@
+import type { ReactNode } from 'react'
+import { useMemo, useState } from 'react'
+import { ArrowDownRoundFill } from '@/app/components/base/icons/src/vender/solid/general'
+import cn from '@/utils/classnames'
+
+export { default as FieldCollapse } from './field-collapse'
+
+type CollapseProps = {
+  disabled?: boolean
+  trigger: React.JSX.Element | ((collapseIcon: React.JSX.Element | null) => React.JSX.Element)
+  children: React.JSX.Element
+  collapsed?: boolean
+  onCollapse?: (collapsed: boolean) => void
+  operations?: ReactNode
+  hideCollapseIcon?: boolean
+}
+const Collapse = ({
+  disabled,
+  trigger,
+  children,
+  collapsed,
+  onCollapse,
+  operations,
+  hideCollapseIcon,
+}: CollapseProps) => {
+  const [collapsedLocal, setCollapsedLocal] = useState(true)
+  const collapsedMerged = collapsed !== undefined ? collapsed : collapsedLocal
+  const collapseIcon = useMemo(() => {
+    if (disabled)
+      return null
+
+    return (
+      <ArrowDownRoundFill
+        className={cn(
+          'h-4 w-4 cursor-pointer text-text-quaternary group-hover/collapse:text-text-secondary',
+          collapsedMerged && 'rotate-[270deg]',
+        )}
+      />
+    )
+  }, [collapsedMerged, disabled])
+  return (
+    <>
+      <div className='group/collapse flex items-center'>
+        <div
+          className='ml-4 flex grow items-center'
+          onClick={() => {
+            if (!disabled) {
+              setCollapsedLocal(!collapsedMerged)
+              onCollapse?.(!collapsedMerged)
+            }
+          }}
+        >
+          {typeof trigger === 'function' ? trigger(collapseIcon) : trigger}
+          {!hideCollapseIcon && (
+            <div className='h-4 w-4 shrink-0'>
+              {collapseIcon}
+            </div>
+          )}
+        </div>
+        {operations}
+      </div>
+      {
+        !collapsedMerged && children
+      }
+    </>
+  )
+}
+
+export default Collapse
diff --git a/app/components/workflow/nodes/_base/components/config-vision.tsx b/app/components/workflow/nodes/_base/components/config-vision.tsx
new file mode 100644
index 0000000..56cd1a5
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/config-vision.tsx
@@ -0,0 +1,91 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import VarReferencePicker from './variable/var-reference-picker'
+import ResolutionPicker from '@/app/components/workflow/nodes/llm/components/resolution-picker'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import Switch from '@/app/components/base/switch'
+import { type ValueSelector, type Var, VarType, type VisionSetting } from '@/app/components/workflow/types'
+import { Resolution } from '@/types/app'
+import Tooltip from '@/app/components/base/tooltip'
+const i18nPrefix = 'workflow.nodes.llm'
+
+type Props = {
+  isVisionModel: boolean
+  readOnly: boolean
+  enabled: boolean
+  onEnabledChange: (enabled: boolean) => void
+  nodeId: string
+  config?: VisionSetting
+  onConfigChange: (config: VisionSetting) => void
+}
+
+const ConfigVision: FC<Props> = ({
+  isVisionModel,
+  readOnly,
+  enabled,
+  onEnabledChange,
+  nodeId,
+  config = {
+    detail: Resolution.high,
+    variable_selector: [],
+  },
+  onConfigChange,
+}) => {
+  const { t } = useTranslation()
+
+  const filterVar = useCallback((payload: Var) => {
+    return [VarType.file, VarType.arrayFile].includes(payload.type)
+  }, [])
+  const handleVisionResolutionChange = useCallback((resolution: Resolution) => {
+    const newConfig = produce(config, (draft) => {
+      draft.detail = resolution
+    })
+    onConfigChange(newConfig)
+  }, [config, onConfigChange])
+
+  const handleVarSelectorChange = useCallback((valueSelector: ValueSelector | string) => {
+    const newConfig = produce(config, (draft) => {
+      draft.variable_selector = valueSelector as ValueSelector
+    })
+    onConfigChange(newConfig)
+  }, [config, onConfigChange])
+
+  return (
+    <Field
+      title={t(`${i18nPrefix}.vision`)}
+      tooltip={t('appDebug.vision.description')!}
+      operations={
+        <Tooltip
+          popupContent={t('appDebug.vision.onlySupportVisionModelTip')!}
+          disabled={isVisionModel}
+        >
+          <Switch disabled={readOnly || !isVisionModel} size='md' defaultValue={!isVisionModel ? false : enabled} onChange={onEnabledChange} />
+        </Tooltip>
+      }
+    >
+      {(enabled && isVisionModel)
+        ? (
+          <div>
+            <VarReferencePicker
+              className='mb-4'
+              filterVar={filterVar}
+              nodeId={nodeId}
+              value={config.variable_selector || []}
+              onChange={handleVarSelectorChange}
+              readonly={readOnly}
+            />
+            <ResolutionPicker
+              value={config.detail}
+              onChange={handleVisionResolutionChange}
+            />
+          </div>
+        )
+        : null}
+
+    </Field>
+  )
+}
+export default React.memo(ConfigVision)
diff --git a/app/components/workflow/nodes/_base/components/editor/base.tsx b/app/components/workflow/nodes/_base/components/editor/base.tsx
new file mode 100644
index 0000000..38968b2
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/editor/base.tsx
@@ -0,0 +1,123 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useRef, useState } from 'react'
+import copy from 'copy-to-clipboard'
+import ToggleExpandBtn from '../toggle-expand-btn'
+import CodeGeneratorButton from '../code-generator-button'
+import type { CodeLanguage } from '../../../code/types'
+import Wrap from './wrap'
+import cn from '@/utils/classnames'
+import PromptEditorHeightResizeWrap from '@/app/components/app/configuration/config-prompt/prompt-editor-height-resize-wrap'
+import {
+  Clipboard,
+  ClipboardCheck,
+} from '@/app/components/base/icons/src/vender/line/files'
+import useToggleExpend from '@/app/components/workflow/nodes/_base/hooks/use-toggle-expend'
+import type { FileEntity } from '@/app/components/base/file-uploader/types'
+import FileListInLog from '@/app/components/base/file-uploader/file-list-in-log'
+
+type Props = {
+  className?: string
+  title: React.JSX.Element | string
+  headerRight?: React.JSX.Element
+  children: React.JSX.Element
+  minHeight?: number
+  value: string
+  isFocus: boolean
+  isInNode?: boolean
+  onGenerated?: (prompt: string) => void
+  codeLanguages?: CodeLanguage
+  fileList?: {
+    varName: string
+    list: FileEntity[]
+  }[]
+  showFileList?: boolean
+  showCodeGenerator?: boolean
+  tip?: React.JSX.Element
+}
+
+const Base: FC<Props> = ({
+  className,
+  title,
+  headerRight,
+  children,
+  minHeight = 120,
+  value,
+  isFocus,
+  isInNode,
+  onGenerated,
+  codeLanguages,
+  fileList = [],
+  showFileList,
+  showCodeGenerator = false,
+  tip,
+}) => {
+  const ref = useRef<HTMLDivElement>(null)
+  const {
+    wrapClassName,
+    wrapStyle,
+    isExpand,
+    setIsExpand,
+    editorExpandHeight,
+  } = useToggleExpend({ ref, hasFooter: false, isInNode })
+
+  const editorContentMinHeight = minHeight - 28
+  const [editorContentHeight, setEditorContentHeight] = useState(editorContentMinHeight)
+
+  const [isCopied, setIsCopied] = React.useState(false)
+  const handleCopy = useCallback(() => {
+    copy(value)
+    setIsCopied(true)
+    setTimeout(() => {
+      setIsCopied(false)
+    }, 2000)
+  }, [value])
+
+  return (
+    <Wrap className={cn(wrapClassName)} style={wrapStyle} isInNode={isInNode} isExpand={isExpand}>
+      <div ref={ref} className={cn(className, isExpand && 'h-full', 'rounded-lg border', isFocus ? 'border-transparent bg-components-input-bg-normal' : 'overflow-hidden border-components-input-border-hover bg-components-input-bg-hover')}>
+        <div className='flex h-7 items-center justify-between pl-3 pr-2 pt-1'>
+          <div className='system-xs-semibold-uppercase text-text-secondary'>{title}</div>
+          <div className='flex items-center' onClick={(e) => {
+            e.nativeEvent.stopImmediatePropagation()
+            e.stopPropagation()
+          }}>
+            {headerRight}
+            {showCodeGenerator && codeLanguages && (
+              <div className='ml-1'>
+                <CodeGeneratorButton onGenerated={onGenerated} codeLanguages={codeLanguages} />
+              </div>
+            )}
+            {!isCopied
+              ? (
+                <Clipboard className='mx-1 h-3.5 w-3.5 cursor-pointer text-text-tertiary' onClick={handleCopy} />
+              )
+              : (
+                <ClipboardCheck className='mx-1 h-3.5 w-3.5 text-text-tertiary' />
+              )
+            }
+
+            <div className='ml-1'>
+              <ToggleExpandBtn isExpand={isExpand} onExpandChange={setIsExpand} />
+            </div>
+          </div>
+        </div>
+        {tip && <div className='px-1 py-0.5'>{tip}</div>}
+        <PromptEditorHeightResizeWrap
+          height={isExpand ? editorExpandHeight : editorContentHeight}
+          minHeight={editorContentMinHeight}
+          onHeightChange={setEditorContentHeight}
+          hideResize={isExpand}
+        >
+          <div className='h-full pb-2 pl-2'>
+            {children}
+          </div>
+        </PromptEditorHeightResizeWrap>
+        {showFileList && fileList.length > 0 && (
+          <FileListInLog fileList={fileList} />
+        )}
+      </div>
+    </Wrap>
+  )
+}
+export default React.memo(Base)
diff --git a/app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars.tsx b/app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars.tsx
new file mode 100644
index 0000000..7798ed3
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars.tsx
@@ -0,0 +1,170 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useRef, useState } from 'react'
+import { useBoolean } from 'ahooks'
+import { useTranslation } from 'react-i18next'
+import type { Props as EditorProps } from '.'
+import Editor from '.'
+import cn from '@/utils/classnames'
+import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars'
+import type { NodeOutPutVar, Variable } from '@/app/components/workflow/types'
+
+const TO_WINDOW_OFFSET = 8
+
+type Props = {
+  availableVars: NodeOutPutVar[]
+  varList: Variable[]
+  onAddVar?: (payload: Variable) => void
+} & EditorProps
+
+const CodeEditor: FC<Props> = ({
+  availableVars,
+  varList,
+  onAddVar,
+  ...editorProps
+}) => {
+  const { t } = useTranslation()
+
+  const isLeftBraceRef = useRef(false)
+
+  const editorRef = useRef(null)
+  const monacoRef = useRef(null)
+
+  const popupRef = useRef<HTMLDivElement>(null)
+  const [isShowVarPicker, {
+    setTrue: showVarPicker,
+    setFalse: hideVarPicker,
+  }] = useBoolean(false)
+
+  const [popupPosition, setPopupPosition] = useState({ x: 0, y: 0 })
+
+  // Listen for cursor position changes
+  const handleCursorPositionChange = (event: any) => {
+    const editor: any = editorRef.current
+    const { position } = event
+    const text = editor.getModel().getLineContent(position.lineNumber)
+    const charBefore = text[position.column - 2]
+    if (['/', '{'].includes(charBefore)) {
+      isLeftBraceRef.current = charBefore === '{'
+      const editorRect = editor.getDomNode().getBoundingClientRect()
+      const cursorCoords = editor.getScrolledVisiblePosition(position)
+
+      const popupX = editorRect.left + cursorCoords.left
+      const popupY = editorRect.top + cursorCoords.top + 20 // Adjust the vertical position as needed
+
+      setPopupPosition({ x: popupX, y: popupY })
+      showVarPicker()
+    }
+    else {
+      hideVarPicker()
+    }
+  }
+
+  useEffect(() => {
+    if (isShowVarPicker && popupRef.current) {
+      const windowWidth = window.innerWidth
+      const { width, height } = popupRef.current!.getBoundingClientRect()
+      const newPopupPosition = { ...popupPosition }
+      if (popupPosition.x + width > windowWidth - TO_WINDOW_OFFSET)
+        newPopupPosition.x = windowWidth - width - TO_WINDOW_OFFSET
+
+      if (popupPosition.y + height > window.innerHeight - TO_WINDOW_OFFSET)
+        newPopupPosition.y = window.innerHeight - height - TO_WINDOW_OFFSET
+
+      if (newPopupPosition.x !== popupPosition.x || newPopupPosition.y !== popupPosition.y)
+        setPopupPosition(newPopupPosition)
+    }
+  }, [isShowVarPicker, popupPosition])
+
+  const onEditorMounted = (editor: any, monaco: any) => {
+    editorRef.current = editor
+    monacoRef.current = monaco
+    editor.onDidChangeCursorPosition(handleCursorPositionChange)
+  }
+
+  const getUniqVarName = (varName: string) => {
+    if (varList.find(v => v.variable === varName)) {
+      const match = varName.match(/_(\d+)$/)
+
+      const index = (() => {
+        if (match)
+          return Number.parseInt(match[1]!) + 1
+
+        return 1
+      })()
+      return getUniqVarName(`${varName.replace(/_(\d+)$/, '')}_${index}`)
+    }
+    return varName
+  }
+
+  const getVarName = (varValue: string[]) => {
+    const existVar = varList.find(v => Array.isArray(v.value_selector) && v.value_selector.join('@@@') === varValue.join('@@@'))
+    if (existVar) {
+      return {
+        name: existVar.variable,
+        isExist: true,
+      }
+    }
+    const varName = varValue.slice(-1)[0]
+    return {
+      name: getUniqVarName(varName),
+      isExist: false,
+    }
+  }
+
+  const handleSelectVar = (varValue: string[]) => {
+    const { name, isExist } = getVarName(varValue)
+    if (!isExist) {
+      const newVar: Variable = {
+        variable: name,
+        value_selector: varValue,
+      }
+
+      onAddVar?.(newVar)
+    }
+    const editor: any = editorRef.current
+    const monaco: any = monacoRef.current
+    const position = editor?.getPosition()
+
+    // Insert the content at the cursor position
+    editor?.executeEdits('', [
+      {
+        // position.column - 1 to remove the text before the cursor
+        range: new monaco.Range(position.lineNumber, position.column - 1, position.lineNumber, position.column),
+        text: `{{ ${name} }${!isLeftBraceRef.current ? '}' : ''}`, // left brace would auto add one right brace
+      },
+    ])
+
+    hideVarPicker()
+  }
+
+  return (
+    <div className={cn(editorProps.isExpand && 'h-full')}>
+      <Editor
+        {...editorProps}
+        onMount={onEditorMounted}
+        placeholder={t('workflow.common.jinjaEditorPlaceholder')!}
+      />
+      {isShowVarPicker && (
+        <div
+          ref={popupRef}
+          className='w-[228px] space-y-1 rounded-lg border border-gray-200 bg-white p-1 shadow-lg'
+          style={{
+            position: 'fixed',
+            top: popupPosition.y,
+            left: popupPosition.x,
+            zIndex: 100,
+          }}
+        >
+          <VarReferenceVars
+            hideSearch
+            vars={availableVars}
+            onChange={handleSelectVar}
+            isSupportFileVar={false}
+          />
+        </div>
+      )}
+    </div>
+  )
+}
+export default React.memo(CodeEditor)
diff --git a/app/components/workflow/nodes/_base/components/editor/code-editor/index.tsx b/app/components/workflow/nodes/_base/components/editor/code-editor/index.tsx
new file mode 100644
index 0000000..1fac467
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/editor/code-editor/index.tsx
@@ -0,0 +1,197 @@
+'use client'
+import type { FC } from 'react'
+import Editor, { loader } from '@monaco-editor/react'
+import React, { useEffect, useMemo, useRef, useState } from 'react'
+import Base from '../base'
+import { WEB_PREFIX } from '@/config'
+import cn from '@/utils/classnames'
+import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+import {
+  getFilesInLogs,
+} from '@/app/components/base/file-uploader/utils'
+import { Theme } from '@/types/app'
+import useTheme from '@/hooks/use-theme'
+import './style.css'
+import { noop } from 'lodash-es'
+
+// load file from local instead of cdn https://github.com/suren-atoyan/monaco-react/issues/482
+loader.config({ paths: { vs: `${WEB_PREFIX}/vs` } })
+
+const CODE_EDITOR_LINE_HEIGHT = 18
+
+export type Props = {
+  value?: string | object
+  placeholder?: React.JSX.Element | string
+  onChange?: (value: string) => void
+  title?: React.JSX.Element
+  language: CodeLanguage
+  headerRight?: React.JSX.Element
+  readOnly?: boolean
+  isJSONStringifyBeauty?: boolean
+  height?: number
+  isInNode?: boolean
+  onMount?: (editor: any, monaco: any) => void
+  noWrapper?: boolean
+  isExpand?: boolean
+  showFileList?: boolean
+  onGenerated?: (value: string) => void
+  showCodeGenerator?: boolean
+  className?: string
+  tip?: React.JSX.Element
+}
+
+export const languageMap = {
+  [CodeLanguage.javascript]: 'javascript',
+  [CodeLanguage.python3]: 'python',
+  [CodeLanguage.json]: 'json',
+}
+
+const CodeEditor: FC<Props> = ({
+  value = '',
+  placeholder = '',
+  onChange = noop,
+  title = '',
+  headerRight,
+  language,
+  readOnly,
+  isJSONStringifyBeauty,
+  height,
+  isInNode,
+  onMount,
+  noWrapper,
+  isExpand,
+  showFileList,
+  onGenerated,
+  showCodeGenerator = false,
+  className,
+  tip,
+}) => {
+  const [isFocus, setIsFocus] = React.useState(false)
+  const [isMounted, setIsMounted] = React.useState(false)
+  const minHeight = height || 200
+  const [editorContentHeight, setEditorContentHeight] = useState(56)
+  const { theme: appTheme } = useTheme()
+  const valueRef = useRef(value)
+  useEffect(() => {
+    valueRef.current = value
+  }, [value])
+
+  const fileList = useMemo(() => {
+    if (typeof value === 'object')
+      return getFilesInLogs(value)
+    return []
+  }, [value])
+
+  const editorRef = useRef<any>(null)
+  const resizeEditorToContent = () => {
+    if (editorRef.current) {
+      const contentHeight = editorRef.current.getContentHeight() // Math.max(, minHeight)
+      setEditorContentHeight(contentHeight)
+    }
+  }
+
+  const handleEditorChange = (value: string | undefined) => {
+    onChange(value || '')
+    setTimeout(() => {
+      resizeEditorToContent()
+    }, 10)
+  }
+
+  const handleEditorDidMount = (editor: any, monaco: any) => {
+    editorRef.current = editor
+    resizeEditorToContent()
+
+    editor.onDidFocusEditorText(() => {
+      setIsFocus(true)
+    })
+    editor.onDidBlurEditorText(() => {
+      setIsFocus(false)
+    })
+
+    monaco.editor.setTheme(appTheme === Theme.light ? 'light' : 'vs-dark') // Fix: sometimes not load the default theme
+
+    onMount?.(editor, monaco)
+    setIsMounted(true)
+  }
+
+  const outPutValue = (() => {
+    if (!isJSONStringifyBeauty)
+      return value as string
+    try {
+      return JSON.stringify(value as object, null, 2)
+    }
+    catch {
+      return value as string
+    }
+  })()
+
+  const theme = useMemo(() => {
+    if (appTheme === Theme.light)
+      return 'light'
+    return 'vs-dark'
+  }, [appTheme])
+
+  const main = (
+    <>
+      {/* https://www.npmjs.com/package/@monaco-editor/react */}
+      <Editor
+        // className='min-h-[100%]' // h-full
+        // language={language === CodeLanguage.javascript ? 'javascript' : 'python'}
+        language={languageMap[language] || 'javascript'}
+        theme={isMounted ? theme : 'default-theme'} // sometimes not load the default theme
+        value={outPutValue}
+        onChange={handleEditorChange}
+        // https://microsoft.github.io/monaco-editor/typedoc/interfaces/editor.IEditorOptions.html
+        options={{
+          readOnly,
+          domReadOnly: true,
+          quickSuggestions: false,
+          minimap: { enabled: false },
+          lineNumbersMinChars: 1, // would change line num width
+          wordWrap: 'on', // auto line wrap
+          // lineNumbers: (num) => {
+          //   return <div>{num}</div>
+          // }
+          // hide ambiguousCharacters warning
+          unicodeHighlight: {
+            ambiguousCharacters: false,
+          },
+        }}
+        onMount={handleEditorDidMount}
+      />
+      {!outPutValue && !isFocus && <div className='pointer-events-none absolute left-[36px] top-0 text-[13px] font-normal leading-[18px] text-gray-300'>{placeholder}</div>}
+    </>
+  )
+
+  return (
+    <div className={cn(isExpand && 'h-full', className)}>
+      {noWrapper
+        ? <div className='no-wrapper relative' style={{
+          height: isExpand ? '100%' : (editorContentHeight) / 2 + CODE_EDITOR_LINE_HEIGHT, // In IDE, the last line can always be in lop line. So there is some blank space in the bottom.
+          minHeight: CODE_EDITOR_LINE_HEIGHT,
+        }}>
+          {main}
+        </div>
+        : (
+          <Base
+            className='relative'
+            title={title}
+            value={outPutValue}
+            headerRight={headerRight}
+            isFocus={isFocus && !readOnly}
+            minHeight={minHeight}
+            isInNode={isInNode}
+            onGenerated={onGenerated}
+            codeLanguages={language}
+            fileList={fileList as any}
+            showFileList={showFileList}
+            showCodeGenerator={showCodeGenerator}
+            tip={tip}
+          >
+            {main}
+          </Base>
+        )}
+    </div>
+  )
+}
+export default React.memo(CodeEditor)
diff --git a/app/components/workflow/nodes/_base/components/editor/code-editor/style.css b/app/components/workflow/nodes/_base/components/editor/code-editor/style.css
new file mode 100644
index 0000000..d364c1f
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/editor/code-editor/style.css
@@ -0,0 +1,16 @@
+
+.monaco-editor {
+  background-color: transparent !important;
+  outline: none !important;
+}
+.monaco-editor .monaco-editor-background {
+  background-color: transparent !important;
+}
+.monaco-editor .margin {
+  background-color: transparent !important;
+}
+
+/* hide readonly tooltip */
+.monaco-editor-overlaymessage {
+  display: none !important;
+}
diff --git a/app/components/workflow/nodes/_base/components/editor/text-editor.tsx b/app/components/workflow/nodes/_base/components/editor/text-editor.tsx
new file mode 100644
index 0000000..252f69c
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/editor/text-editor.tsx
@@ -0,0 +1,63 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useBoolean } from 'ahooks'
+import Base from './base'
+
+type Props = {
+  value: string
+  onChange: (value: string) => void
+  title: React.JSX.Element | string
+  headerRight?: React.JSX.Element
+  minHeight?: number
+  onBlur?: () => void
+  placeholder?: string
+  readonly?: boolean
+  isInNode?: boolean
+}
+
+const TextEditor: FC<Props> = ({
+  value,
+  onChange,
+  title,
+  headerRight,
+  minHeight,
+  onBlur,
+  placeholder,
+  readonly,
+  isInNode,
+}) => {
+  const [isFocus, {
+    setTrue: setIsFocus,
+    setFalse: setIsNotFocus,
+  }] = useBoolean(false)
+
+  const handleBlur = useCallback(() => {
+    setIsNotFocus()
+    onBlur?.()
+  }, [setIsNotFocus, onBlur])
+
+  return (
+    <div>
+      <Base
+        title={title}
+        value={value}
+        headerRight={headerRight}
+        isFocus={isFocus}
+        minHeight={minHeight}
+        isInNode={isInNode}
+      >
+        <textarea
+          value={value}
+          onChange={e => onChange(e.target.value)}
+          onFocus={setIsFocus}
+          onBlur={handleBlur}
+          className='h-full w-full resize-none border-none bg-transparent px-3 text-[13px] font-normal leading-[18px] text-gray-900 placeholder:text-gray-300 focus:outline-none'
+          placeholder={placeholder}
+          readOnly={readonly}
+        />
+      </Base>
+    </div>
+  )
+}
+export default React.memo(TextEditor)
diff --git a/app/components/workflow/nodes/_base/components/editor/wrap.tsx b/app/components/workflow/nodes/_base/components/editor/wrap.tsx
new file mode 100644
index 0000000..700f5a4
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/editor/wrap.tsx
@@ -0,0 +1,48 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useStore } from '@/app/components/workflow/store'
+
+type Props = {
+  isInNode?: boolean
+  isExpand: boolean
+  className: string
+  style: React.CSSProperties
+  children: React.ReactNode
+}
+
+// It doesn't has workflow store
+const WrapInWebApp = ({
+  className,
+  style,
+  children,
+}: Props) => {
+  return <div className={className} style={style}>{children}</div>
+}
+
+const Wrap = ({
+  className,
+  style,
+  isExpand,
+  children,
+}: Props) => {
+  const panelWidth = useStore(state => state.panelWidth)
+  const wrapStyle = (() => {
+    if (isExpand) {
+      return {
+        ...style,
+        width: panelWidth - 1,
+      }
+    }
+    return style
+  })()
+  return <div className={className} style={wrapStyle}>{children}</div>
+}
+
+const Main: FC<Props> = ({
+  isInNode,
+  ...otherProps
+}: Props) => {
+  return isInNode ? <Wrap {...otherProps} /> : <WrapInWebApp {...otherProps} />
+}
+export default React.memo(Main)
diff --git a/app/components/workflow/nodes/_base/components/error-handle/default-value.tsx b/app/components/workflow/nodes/_base/components/error-handle/default-value.tsx
new file mode 100644
index 0000000..51969f8
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/error-handle/default-value.tsx
@@ -0,0 +1,89 @@
+import { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { DefaultValueForm } from './types'
+import Input from '@/app/components/base/input'
+import { VarType } from '@/app/components/workflow/types'
+import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
+
+type DefaultValueProps = {
+  forms: DefaultValueForm[]
+  onFormChange: (form: DefaultValueForm) => void
+}
+const DefaultValue = ({
+  forms,
+  onFormChange,
+}: DefaultValueProps) => {
+  const { t } = useTranslation()
+  const getFormChangeHandler = useCallback(({ key, type }: DefaultValueForm) => {
+    return (payload: any) => {
+      let value
+      if (type === VarType.string || type === VarType.number)
+        value = payload.target.value
+
+      if (type === VarType.array || type === VarType.arrayNumber || type === VarType.arrayString || type === VarType.arrayObject || type === VarType.arrayFile || type === VarType.object)
+        value = payload
+
+      onFormChange({ key, type, value })
+    }
+  }, [onFormChange])
+
+  return (
+    <div className='px-4 pt-2'>
+      <div className='body-xs-regular mb-2 text-text-tertiary'>
+        {t('workflow.nodes.common.errorHandle.defaultValue.desc')}
+        &nbsp;
+        <a
+          href='https://docs.dify.ai/en/guides/workflow/error-handling/README'
+          target='_blank'
+          className='text-text-accent'
+        >
+          {t('workflow.common.learnMore')}
+        </a>
+      </div>
+      <div className='space-y-1'>
+        {
+          forms.map((form, index) => {
+            return (
+              <div
+                key={index}
+                className='py-1'
+              >
+                <div className='mb-1 flex items-center'>
+                  <div className='system-sm-medium mr-1 text-text-primary'>{form.key}</div>
+                  <div className='system-xs-regular text-text-tertiary'>{form.type}</div>
+                </div>
+                {
+                  (form.type === VarType.string || form.type === VarType.number) && (
+                    <Input
+                      type={form.type}
+                      value={form.value || (form.type === VarType.string ? '' : 0)}
+                      onChange={getFormChangeHandler({ key: form.key, type: form.type })}
+                    />
+                  )
+                }
+                {
+                  (
+                    form.type === VarType.array
+                    || form.type === VarType.arrayNumber
+                    || form.type === VarType.arrayString
+                    || form.type === VarType.arrayObject
+                    || form.type === VarType.object
+                  ) && (
+                    <CodeEditor
+                      language={CodeLanguage.json}
+                      value={form.value}
+                      onChange={getFormChangeHandler({ key: form.key, type: form.type })}
+                    />
+                  )
+                }
+              </div>
+            )
+          })
+        }
+      </div>
+    </div>
+  )
+}
+
+export default DefaultValue
diff --git a/app/components/workflow/nodes/_base/components/error-handle/error-handle-on-node.tsx b/app/components/workflow/nodes/_base/components/error-handle/error-handle-on-node.tsx
new file mode 100644
index 0000000..b9a1745
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/error-handle/error-handle-on-node.tsx
@@ -0,0 +1,67 @@
+import { useEffect } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useUpdateNodeInternals } from 'reactflow'
+import { NodeSourceHandle } from '../node-handle'
+import { ErrorHandleTypeEnum } from './types'
+import type { Node } from '@/app/components/workflow/types'
+import { NodeRunningStatus } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+
+type ErrorHandleOnNodeProps = Pick<Node, 'id' | 'data'>
+const ErrorHandleOnNode = ({
+  id,
+  data,
+}: ErrorHandleOnNodeProps) => {
+  const { t } = useTranslation()
+  const { error_strategy } = data
+  const updateNodeInternals = useUpdateNodeInternals()
+
+  useEffect(() => {
+    if (error_strategy === ErrorHandleTypeEnum.failBranch)
+      updateNodeInternals(id)
+  }, [error_strategy, id, updateNodeInternals])
+
+  if (!error_strategy)
+    return null
+
+  return (
+    <div className='relative px-3 pb-2 pt-1'>
+      <div className={cn(
+        'relative flex h-6 items-center justify-between rounded-md bg-workflow-block-parma-bg px-[5px]',
+        data._runningStatus === NodeRunningStatus.Exception && 'border-[0.5px] border-components-badge-status-light-warning-halo bg-state-warning-hover',
+      )}>
+        <div className='system-xs-medium-uppercase text-text-tertiary'>
+          {t('workflow.common.onFailure')}
+        </div>
+        <div className={cn(
+          'system-xs-medium text-text-secondary',
+          data._runningStatus === NodeRunningStatus.Exception && 'text-text-warning',
+        )}>
+          {
+            error_strategy === ErrorHandleTypeEnum.defaultValue && (
+              t('workflow.nodes.common.errorHandle.defaultValue.output')
+            )
+          }
+          {
+            error_strategy === ErrorHandleTypeEnum.failBranch && (
+              t('workflow.nodes.common.errorHandle.failBranch.title')
+            )
+          }
+        </div>
+        {
+          error_strategy === ErrorHandleTypeEnum.failBranch && (
+            <NodeSourceHandle
+              id={id}
+              data={data}
+              handleId={ErrorHandleTypeEnum.failBranch}
+              handleClassName='!top-1/2 !-right-[21px] !-translate-y-1/2 after:!bg-workflow-link-line-failure-button-bg'
+              nodeSelectorClassName='!bg-workflow-link-line-failure-button-bg'
+            />
+          )
+        }
+      </div>
+    </div>
+  )
+}
+
+export default ErrorHandleOnNode
diff --git a/app/components/workflow/nodes/_base/components/error-handle/error-handle-on-panel.tsx b/app/components/workflow/nodes/_base/components/error-handle/error-handle-on-panel.tsx
new file mode 100644
index 0000000..cfcbae8
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/error-handle/error-handle-on-panel.tsx
@@ -0,0 +1,91 @@
+import { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import Collapse from '../collapse'
+import { ErrorHandleTypeEnum } from './types'
+import ErrorHandleTypeSelector from './error-handle-type-selector'
+import FailBranchCard from './fail-branch-card'
+import DefaultValue from './default-value'
+import {
+  useDefaultValue,
+  useErrorHandle,
+} from './hooks'
+import type { DefaultValueForm } from './types'
+import type {
+  CommonNodeType,
+  Node,
+} from '@/app/components/workflow/types'
+import Tooltip from '@/app/components/base/tooltip'
+
+type ErrorHandleProps = Pick<Node, 'id' | 'data'>
+const ErrorHandle = ({
+  id,
+  data,
+}: ErrorHandleProps) => {
+  const { t } = useTranslation()
+  const { error_strategy, default_value } = data
+  const {
+    collapsed,
+    setCollapsed,
+    handleErrorHandleTypeChange,
+  } = useErrorHandle(id, data)
+  const { handleFormChange } = useDefaultValue(id)
+
+  const getHandleErrorHandleTypeChange = useCallback((data: CommonNodeType) => {
+    return (value: ErrorHandleTypeEnum) => {
+      handleErrorHandleTypeChange(value, data)
+    }
+  }, [handleErrorHandleTypeChange])
+
+  const getHandleFormChange = useCallback((data: CommonNodeType) => {
+    return (v: DefaultValueForm) => {
+      handleFormChange(v, data)
+    }
+  }, [handleFormChange])
+
+  return (
+    <>
+      <div className='py-4'>
+        <Collapse
+          disabled={!error_strategy}
+          collapsed={collapsed}
+          onCollapse={setCollapsed}
+          hideCollapseIcon
+          trigger={
+            collapseIcon => (
+              <div className='flex grow items-center justify-between pr-4'>
+                <div className='flex items-center'>
+                  <div className='system-sm-semibold-uppercase mr-0.5 text-text-secondary'>
+                    {t('workflow.nodes.common.errorHandle.title')}
+                  </div>
+                  <Tooltip popupContent={t('workflow.nodes.common.errorHandle.tip')} />
+                  {collapseIcon}
+                </div>
+                <ErrorHandleTypeSelector
+                  value={error_strategy || ErrorHandleTypeEnum.none}
+                  onSelected={getHandleErrorHandleTypeChange(data)}
+                />
+              </div>
+            )}
+        >
+          <>
+            {
+              error_strategy === ErrorHandleTypeEnum.failBranch && !collapsed && (
+                <FailBranchCard />
+              )
+            }
+            {
+              error_strategy === ErrorHandleTypeEnum.defaultValue && !collapsed && !!default_value?.length && (
+                <DefaultValue
+                  forms={default_value}
+                  onFormChange={getHandleFormChange(data)}
+                />
+              )
+            }
+          </>
+        </Collapse>
+      </div>
+    </>
+  )
+}
+
+export default ErrorHandle
diff --git a/app/components/workflow/nodes/_base/components/error-handle/error-handle-tip.tsx b/app/components/workflow/nodes/_base/components/error-handle/error-handle-tip.tsx
new file mode 100644
index 0000000..b444885
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/error-handle/error-handle-tip.tsx
@@ -0,0 +1,43 @@
+import { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiAlertFill } from '@remixicon/react'
+import { ErrorHandleTypeEnum } from './types'
+
+type ErrorHandleTipProps = {
+  type?: ErrorHandleTypeEnum
+}
+const ErrorHandleTip = ({
+  type,
+}: ErrorHandleTipProps) => {
+  const { t } = useTranslation()
+
+  const text = useMemo(() => {
+    if (type === ErrorHandleTypeEnum.failBranch)
+      return t('workflow.nodes.common.errorHandle.failBranch.inLog')
+
+    if (type === ErrorHandleTypeEnum.defaultValue)
+      return t('workflow.nodes.common.errorHandle.defaultValue.inLog')
+  }, [])
+
+  if (!type)
+    return null
+
+  return (
+    <div
+      className='relative flex rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-2 pr-[52px] shadow-xs'
+    >
+      <div
+        className='absolute inset-0 rounded-lg opacity-40'
+        style={{
+          background: 'linear-gradient(92deg, rgba(247, 144, 9, 0.25) 0%, rgba(255, 255, 255, 0.00) 100%)',
+        }}
+      ></div>
+      <RiAlertFill className='mr-1 h-4 w-4 shrink-0 text-text-warning-secondary' />
+      <div className='system-xs-medium grow text-text-primary'>
+        {text}
+      </div>
+    </div>
+  )
+}
+
+export default ErrorHandleTip
diff --git a/app/components/workflow/nodes/_base/components/error-handle/error-handle-type-selector.tsx b/app/components/workflow/nodes/_base/components/error-handle/error-handle-type-selector.tsx
new file mode 100644
index 0000000..d9516df
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/error-handle/error-handle-type-selector.tsx
@@ -0,0 +1,97 @@
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowDownSLine,
+  RiCheckLine,
+} from '@remixicon/react'
+import { ErrorHandleTypeEnum } from './types'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Button from '@/app/components/base/button'
+
+type ErrorHandleTypeSelectorProps = {
+  value: ErrorHandleTypeEnum
+  onSelected: (value: ErrorHandleTypeEnum) => void
+}
+const ErrorHandleTypeSelector = ({
+  value,
+  onSelected,
+}: ErrorHandleTypeSelectorProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const options = [
+    {
+      value: ErrorHandleTypeEnum.none,
+      label: t('workflow.nodes.common.errorHandle.none.title'),
+      description: t('workflow.nodes.common.errorHandle.none.desc'),
+    },
+    {
+      value: ErrorHandleTypeEnum.defaultValue,
+      label: t('workflow.nodes.common.errorHandle.defaultValue.title'),
+      description: t('workflow.nodes.common.errorHandle.defaultValue.desc'),
+    },
+    {
+      value: ErrorHandleTypeEnum.failBranch,
+      label: t('workflow.nodes.common.errorHandle.failBranch.title'),
+      description: t('workflow.nodes.common.errorHandle.failBranch.desc'),
+    },
+  ]
+  const selectedOption = options.find(option => option.value === value)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={4}
+    >
+      <PortalToFollowElemTrigger onClick={(e) => {
+        e.stopPropagation()
+        e.nativeEvent.stopImmediatePropagation()
+        setOpen(v => !v)
+      }}>
+        <Button
+          size='small'
+        >
+          {selectedOption?.label}
+          <RiArrowDownSLine className='h-3.5 w-3.5' />
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[11]'>
+        <div className='w-[280px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
+          {
+            options.map(option => (
+              <div
+                key={option.value}
+                className='flex cursor-pointer rounded-lg p-2 pr-3 hover:bg-state-base-hover'
+                onClick={(e) => {
+                  e.stopPropagation()
+                  e.nativeEvent.stopImmediatePropagation()
+                  onSelected(option.value)
+                  setOpen(false)
+                }}
+              >
+                <div className='mr-1 w-4 shrink-0'>
+                  {
+                    value === option.value && (
+                      <RiCheckLine className='h-4 w-4 text-text-accent' />
+                    )
+                  }
+                </div>
+                <div className='grow'>
+                  <div className='system-sm-semibold mb-0.5 text-text-secondary'>{option.label}</div>
+                  <div className='system-xs-regular text-text-tertiary'>{option.description}</div>
+                </div>
+              </div>
+            ))
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default ErrorHandleTypeSelector
diff --git a/app/components/workflow/nodes/_base/components/error-handle/fail-branch-card.tsx b/app/components/workflow/nodes/_base/components/error-handle/fail-branch-card.tsx
new file mode 100644
index 0000000..05a6cb9
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/error-handle/fail-branch-card.tsx
@@ -0,0 +1,32 @@
+import { RiMindMap } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+
+const FailBranchCard = () => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='px-4 pt-2'>
+      <div className='rounded-[10px] bg-workflow-process-bg p-4'>
+        <div className='mb-2 flex h-8 w-8 items-center justify-center rounded-[10px] border-[0.5px] border-components-card-border bg-components-card-bg shadow-lg'>
+          <RiMindMap className='h-5 w-5 text-text-tertiary' />
+        </div>
+        <div className='system-sm-medium mb-1 text-text-secondary'>
+          {t('workflow.nodes.common.errorHandle.failBranch.customize')}
+        </div>
+        <div className='system-xs-regular text-text-tertiary'>
+          {t('workflow.nodes.common.errorHandle.failBranch.customizeTip')}
+          &nbsp;
+          <a
+            href='https://docs.dify.ai/guides/workflow/error-handling'
+            target='_blank'
+            className='text-text-accent'
+          >
+            {t('workflow.common.learnMore')}
+          </a>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default FailBranchCard
diff --git a/app/components/workflow/nodes/_base/components/error-handle/hooks.ts b/app/components/workflow/nodes/_base/components/error-handle/hooks.ts
new file mode 100644
index 0000000..06eb4fc
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/error-handle/hooks.ts
@@ -0,0 +1,123 @@
+import {
+  useCallback,
+  useMemo,
+  useState,
+} from 'react'
+import { ErrorHandleTypeEnum } from './types'
+import type { DefaultValueForm } from './types'
+import { getDefaultValue } from './utils'
+import type {
+  CommonNodeType,
+} from '@/app/components/workflow/types'
+import {
+  useEdgesInteractions,
+  useNodeDataUpdate,
+} from '@/app/components/workflow/hooks'
+
+export const useDefaultValue = (
+  id: string,
+) => {
+  const { handleNodeDataUpdateWithSyncDraft } = useNodeDataUpdate()
+  const handleFormChange = useCallback((
+    {
+      key,
+      value,
+      type,
+    }: DefaultValueForm,
+    data: CommonNodeType,
+  ) => {
+    const default_value = data.default_value || []
+    const index = default_value.findIndex(form => form.key === key)
+
+    if (index > -1) {
+      const newDefaultValue = [...default_value]
+      newDefaultValue[index].value = value
+      handleNodeDataUpdateWithSyncDraft({
+        id,
+        data: {
+          default_value: newDefaultValue,
+        },
+      })
+      return
+    }
+
+    handleNodeDataUpdateWithSyncDraft({
+      id,
+      data: {
+        default_value: [
+          ...default_value,
+          {
+            key,
+            value,
+            type,
+          },
+        ],
+      },
+    })
+  }, [handleNodeDataUpdateWithSyncDraft, id])
+
+  return {
+    handleFormChange,
+  }
+}
+
+export const useErrorHandle = (
+  id: string,
+  data: CommonNodeType,
+) => {
+  const initCollapsed = useMemo(() => {
+    if (data.error_strategy === ErrorHandleTypeEnum.none)
+      return true
+
+    return false
+  }, [data.error_strategy])
+  const [collapsed, setCollapsed] = useState(initCollapsed)
+  const { handleNodeDataUpdateWithSyncDraft } = useNodeDataUpdate()
+  const { handleEdgeDeleteByDeleteBranch } = useEdgesInteractions()
+
+  const handleErrorHandleTypeChange = useCallback((value: ErrorHandleTypeEnum, data: CommonNodeType) => {
+    if (data.error_strategy === value)
+      return
+
+    if (value === ErrorHandleTypeEnum.none) {
+      handleNodeDataUpdateWithSyncDraft({
+        id,
+        data: {
+          error_strategy: undefined,
+          default_value: undefined,
+        },
+      })
+      setCollapsed(true)
+      handleEdgeDeleteByDeleteBranch(id, ErrorHandleTypeEnum.failBranch)
+    }
+
+    if (value === ErrorHandleTypeEnum.failBranch) {
+      handleNodeDataUpdateWithSyncDraft({
+        id,
+        data: {
+          error_strategy: value,
+          default_value: undefined,
+        },
+      })
+      setCollapsed(false)
+    }
+
+    if (value === ErrorHandleTypeEnum.defaultValue) {
+      handleNodeDataUpdateWithSyncDraft({
+        id,
+        data: {
+          error_strategy: value,
+          default_value: getDefaultValue(data),
+        },
+      })
+      setCollapsed(false)
+      handleEdgeDeleteByDeleteBranch(id, ErrorHandleTypeEnum.failBranch)
+    }
+  }, [id, handleNodeDataUpdateWithSyncDraft, handleEdgeDeleteByDeleteBranch])
+
+  return {
+    collapsed,
+    setCollapsed,
+    handleErrorHandleTypeChange,
+  }
+}
diff --git a/app/components/workflow/nodes/_base/components/error-handle/types.ts b/app/components/workflow/nodes/_base/components/error-handle/types.ts
new file mode 100644
index 0000000..2949364
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/error-handle/types.ts
@@ -0,0 +1,13 @@
+import type { VarType } from '@/app/components/workflow/types'
+
+export enum ErrorHandleTypeEnum {
+  none = 'none',
+  failBranch = 'fail-branch',
+  defaultValue = 'default-value',
+}
+
+export type DefaultValueForm = {
+  key: string
+  type: VarType
+  value?: any
+}
diff --git a/app/components/workflow/nodes/_base/components/error-handle/utils.ts b/app/components/workflow/nodes/_base/components/error-handle/utils.ts
new file mode 100644
index 0000000..eef9677
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/error-handle/utils.ts
@@ -0,0 +1,83 @@
+import type { CommonNodeType } from '@/app/components/workflow/types'
+import {
+  BlockEnum,
+  VarType,
+} from '@/app/components/workflow/types'
+import type { CodeNodeType } from '@/app/components/workflow/nodes/code/types'
+
+const getDefaultValueByType = (type: VarType) => {
+  if (type === VarType.string)
+    return ''
+
+  if (type === VarType.number)
+    return 0
+
+  if (type === VarType.object)
+    return '{}'
+
+  if (type === VarType.arrayObject || type === VarType.arrayString || type === VarType.arrayNumber || type === VarType.arrayFile)
+    return '[]'
+
+  return ''
+}
+
+export const getDefaultValue = (data: CommonNodeType) => {
+  const { type } = data
+
+  if (type === BlockEnum.LLM) {
+    return [{
+      key: 'text',
+      type: VarType.string,
+      value: getDefaultValueByType(VarType.string),
+    }]
+  }
+
+  if (type === BlockEnum.HttpRequest) {
+    return [
+      {
+        key: 'body',
+        type: VarType.string,
+        value: getDefaultValueByType(VarType.string),
+      },
+      {
+        key: 'status_code',
+        type: VarType.number,
+        value: getDefaultValueByType(VarType.number),
+      },
+      {
+        key: 'headers',
+        type: VarType.object,
+        value: getDefaultValueByType(VarType.object),
+      },
+    ]
+  }
+
+  if (type === BlockEnum.Tool) {
+    return [
+      {
+        key: 'text',
+        type: VarType.string,
+        value: getDefaultValueByType(VarType.string),
+      },
+      {
+        key: 'json',
+        type: VarType.arrayObject,
+        value: getDefaultValueByType(VarType.arrayObject),
+      },
+    ]
+  }
+
+  if (type === BlockEnum.Code) {
+    const { outputs } = data as CodeNodeType
+
+    return Object.keys(outputs).map((key) => {
+      return {
+        key,
+        type: outputs[key].type,
+        value: getDefaultValueByType(outputs[key].type),
+      }
+    })
+  }
+
+  return []
+}
diff --git a/app/components/workflow/nodes/_base/components/field.tsx b/app/components/workflow/nodes/_base/components/field.tsx
new file mode 100644
index 0000000..aadcea1
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/field.tsx
@@ -0,0 +1,65 @@
+'use client'
+import type { FC, ReactNode } from 'react'
+import React from 'react'
+import {
+  RiArrowDownSLine,
+} from '@remixicon/react'
+import { useBoolean } from 'ahooks'
+import cn from '@/utils/classnames'
+import Tooltip from '@/app/components/base/tooltip'
+
+type Props = {
+  className?: string
+  title: ReactNode
+  tooltip?: ReactNode
+  isSubTitle?: boolean
+  supportFold?: boolean
+  children?: React.JSX.Element | string | null
+  operations?: React.JSX.Element
+  inline?: boolean
+  required?: boolean
+}
+
+const Field: FC<Props> = ({
+  className,
+  title,
+  isSubTitle,
+  tooltip,
+  children,
+  operations,
+  inline,
+  supportFold,
+  required,
+}) => {
+  const [fold, {
+    toggle: toggleFold,
+  }] = useBoolean(true)
+  return (
+    <div className={cn(className, inline && 'flex w-full items-center justify-between')}>
+      <div
+        onClick={() => supportFold && toggleFold()}
+        className={cn('flex items-center justify-between', supportFold && 'cursor-pointer')}>
+        <div className='flex h-6 items-center'>
+          <div className={cn(isSubTitle ? 'system-xs-medium-uppercase text-text-tertiary' : 'system-sm-semibold-uppercase text-text-secondary')}>
+            {title} {required && <span className='text-text-destructive'>*</span>}
+          </div>
+          {tooltip && (
+            <Tooltip
+              popupContent={tooltip}
+              popupClassName='ml-1'
+              triggerClassName='w-4 h-4 ml-1'
+            />
+          )}
+        </div>
+        <div className='flex'>
+          {operations && <div>{operations}</div>}
+          {supportFold && (
+            <RiArrowDownSLine className='h-4 w-4 cursor-pointer text-text-tertiary transition-transform' style={{ transform: fold ? 'rotate(-90deg)' : 'rotate(0deg)' }} />
+          )}
+        </div>
+      </div>
+      {children && (!supportFold || (supportFold && !fold)) && <div className={cn(!inline && 'mt-1')}>{children}</div>}
+    </div>
+  )
+}
+export default React.memo(Field)
diff --git a/app/components/workflow/nodes/_base/components/file-type-item.tsx b/app/components/workflow/nodes/_base/components/file-type-item.tsx
new file mode 100644
index 0000000..6791dbb
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/file-type-item.tsx
@@ -0,0 +1,78 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import { SupportUploadFileTypes } from '../../../types'
+import cn from '@/utils/classnames'
+import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'
+import TagInput from '@/app/components/base/tag-input'
+import Checkbox from '@/app/components/base/checkbox'
+import { FileTypeIcon } from '@/app/components/base/file-uploader'
+import { noop } from 'lodash-es'
+
+type Props = {
+  type: SupportUploadFileTypes.image | SupportUploadFileTypes.document | SupportUploadFileTypes.audio | SupportUploadFileTypes.video | SupportUploadFileTypes.custom
+  selected: boolean
+  onToggle: (type: SupportUploadFileTypes) => void
+  onCustomFileTypesChange?: (customFileTypes: string[]) => void
+  customFileTypes?: string[]
+}
+
+const FileTypeItem: FC<Props> = ({
+  type,
+  selected,
+  onToggle,
+  customFileTypes = [],
+  onCustomFileTypesChange = noop,
+}) => {
+  const { t } = useTranslation()
+
+  const handleOnSelect = useCallback(() => {
+    onToggle(type)
+  }, [onToggle, type])
+
+  const isCustomSelected = type === SupportUploadFileTypes.custom && selected
+
+  return (
+    <div
+      className={cn(
+        'cursor-pointer select-none rounded-lg border border-components-option-card-option-border bg-components-option-card-option-bg',
+        !isCustomSelected && 'px-3 py-2',
+        selected && 'border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg',
+        !selected && 'hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover',
+      )}
+      onClick={handleOnSelect}
+    >
+      {isCustomSelected
+        ? (
+          <div>
+            <div className='flex items-center border-b border-divider-subtle p-3 pb-2'>
+              <FileTypeIcon className='shrink-0' type={type} size='md' />
+              <div className='system-sm-medium mx-2 grow text-text-primary'>{t(`appDebug.variableConfig.file.${type}.name`)}</div>
+              <Checkbox className='shrink-0' checked={selected} />
+            </div>
+            <div className='p-3' onClick={e => e.stopPropagation()}>
+              <TagInput
+                items={customFileTypes}
+                onChange={onCustomFileTypesChange}
+                placeholder={t('appDebug.variableConfig.file.custom.createPlaceholder')!}
+              />
+            </div>
+          </div>
+        )
+        : (
+          <div className='flex items-center'>
+            <FileTypeIcon className='shrink-0' type={type} size='md' />
+            <div className='mx-2 grow'>
+              <div className='system-sm-medium text-text-primary'>{t(`appDebug.variableConfig.file.${type}.name`)}</div>
+              <div className='system-2xs-regular-uppercase mt-1 text-text-tertiary'>{type !== SupportUploadFileTypes.custom ? FILE_EXTS[type].join(', ') : t('appDebug.variableConfig.file.custom.description')}</div>
+            </div>
+            <Checkbox className='shrink-0' checked={selected} />
+          </div>
+        )}
+
+    </div>
+  )
+}
+
+export default React.memo(FileTypeItem)
diff --git a/app/components/workflow/nodes/_base/components/file-upload-setting.tsx b/app/components/workflow/nodes/_base/components/file-upload-setting.tsx
new file mode 100644
index 0000000..8613ee5
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/file-upload-setting.tsx
@@ -0,0 +1,199 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import useSWR from 'swr'
+import produce from 'immer'
+import { useTranslation } from 'react-i18next'
+import type { UploadFileSetting } from '../../../types'
+import { SupportUploadFileTypes } from '../../../types'
+import OptionCard from './option-card'
+import FileTypeItem from './file-type-item'
+import InputNumberWithSlider from './input-number-with-slider'
+import Field from '@/app/components/app/configuration/config-var/config-modal/field'
+import { TransferMethod } from '@/types/app'
+import { fetchFileUploadConfig } from '@/service/common'
+import { useFileSizeLimit } from '@/app/components/base/file-uploader/hooks'
+import { formatFileSize } from '@/utils/format'
+
+type Props = {
+  payload: UploadFileSetting
+  isMultiple: boolean
+  inFeaturePanel?: boolean
+  hideSupportFileType?: boolean
+  onChange: (payload: UploadFileSetting) => void
+}
+
+const FileUploadSetting: FC<Props> = ({
+  payload,
+  isMultiple,
+  inFeaturePanel = false,
+  hideSupportFileType = false,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    allowed_file_upload_methods,
+    max_length,
+    allowed_file_types,
+    allowed_file_extensions,
+  } = payload
+  const { data: fileUploadConfigResponse } = useSWR({ url: '/files/upload' }, fetchFileUploadConfig)
+  const {
+    imgSizeLimit,
+    docSizeLimit,
+    audioSizeLimit,
+    videoSizeLimit,
+    maxFileUploadLimit,
+  } = useFileSizeLimit(fileUploadConfigResponse)
+
+  const handleSupportFileTypeChange = useCallback((type: SupportUploadFileTypes) => {
+    const newPayload = produce(payload, (draft) => {
+      if (type === SupportUploadFileTypes.custom) {
+        if (!draft.allowed_file_types.includes(SupportUploadFileTypes.custom))
+          draft.allowed_file_types = [SupportUploadFileTypes.custom]
+
+        else
+          draft.allowed_file_types = draft.allowed_file_types.filter(v => v !== type)
+      }
+      else {
+        draft.allowed_file_types = draft.allowed_file_types.filter(v => v !== SupportUploadFileTypes.custom)
+        if (draft.allowed_file_types.includes(type))
+          draft.allowed_file_types = draft.allowed_file_types.filter(v => v !== type)
+        else
+          draft.allowed_file_types.push(type)
+      }
+    })
+    onChange(newPayload)
+  }, [onChange, payload])
+
+  const handleUploadMethodChange = useCallback((method: TransferMethod) => {
+    return () => {
+      const newPayload = produce(payload, (draft) => {
+        if (method === TransferMethod.all)
+          draft.allowed_file_upload_methods = [TransferMethod.local_file, TransferMethod.remote_url]
+        else
+          draft.allowed_file_upload_methods = [method]
+      })
+      onChange(newPayload)
+    }
+  }, [onChange, payload])
+
+  const handleCustomFileTypesChange = useCallback((customFileTypes: string[]) => {
+    const newPayload = produce(payload, (draft) => {
+      draft.allowed_file_extensions = customFileTypes.map((v) => {
+        return v
+      })
+    })
+    onChange(newPayload)
+  }, [onChange, payload])
+
+  const handleMaxUploadNumLimitChange = useCallback((value: number) => {
+    const newPayload = produce(payload, (draft) => {
+      draft.max_length = value
+    })
+    onChange(newPayload)
+  }, [onChange, payload])
+
+  return (
+    <div>
+      {!inFeaturePanel && (
+        <Field
+          title={t('appDebug.variableConfig.file.supportFileTypes')}
+        >
+          <div className='space-y-1'>
+            {
+              [SupportUploadFileTypes.document, SupportUploadFileTypes.image, SupportUploadFileTypes.audio, SupportUploadFileTypes.video].map((type: SupportUploadFileTypes) => (
+                <FileTypeItem
+                  key={type}
+                  type={type as SupportUploadFileTypes.image | SupportUploadFileTypes.document | SupportUploadFileTypes.audio | SupportUploadFileTypes.video}
+                  selected={allowed_file_types.includes(type)}
+                  onToggle={handleSupportFileTypeChange}
+                />
+              ))
+            }
+            <FileTypeItem
+              type={SupportUploadFileTypes.custom}
+              selected={allowed_file_types.includes(SupportUploadFileTypes.custom)}
+              onToggle={handleSupportFileTypeChange}
+              customFileTypes={allowed_file_extensions}
+              onCustomFileTypesChange={handleCustomFileTypesChange}
+            />
+          </div>
+        </Field>
+      )}
+      <Field
+        title={t('appDebug.variableConfig.uploadFileTypes')}
+        className='mt-4'
+      >
+        <div className='grid grid-cols-3 gap-2'>
+          <OptionCard
+            title={t('appDebug.variableConfig.localUpload')}
+            selected={allowed_file_upload_methods.length === 1 && allowed_file_upload_methods.includes(TransferMethod.local_file)}
+            onSelect={handleUploadMethodChange(TransferMethod.local_file)}
+          />
+          <OptionCard
+            title="URL"
+            selected={allowed_file_upload_methods.length === 1 && allowed_file_upload_methods.includes(TransferMethod.remote_url)}
+            onSelect={handleUploadMethodChange(TransferMethod.remote_url)}
+          />
+          <OptionCard
+            title={t('appDebug.variableConfig.both')}
+            selected={allowed_file_upload_methods.includes(TransferMethod.local_file) && allowed_file_upload_methods.includes(TransferMethod.remote_url)}
+            onSelect={handleUploadMethodChange(TransferMethod.all)}
+          />
+        </div>
+      </Field>
+      {isMultiple && (
+        <Field
+          className='mt-4'
+          title={t('appDebug.variableConfig.maxNumberOfUploads')!}
+        >
+          <div>
+            <div className='body-xs-regular mb-1.5 text-text-tertiary'>{t('appDebug.variableConfig.maxNumberTip', {
+              imgLimit: formatFileSize(imgSizeLimit),
+              docLimit: formatFileSize(docSizeLimit),
+              audioLimit: formatFileSize(audioSizeLimit),
+              videoLimit: formatFileSize(videoSizeLimit),
+            })}</div>
+
+            <InputNumberWithSlider
+              value={max_length}
+              min={1}
+              max={maxFileUploadLimit}
+              onChange={handleMaxUploadNumLimitChange}
+            />
+          </div>
+        </Field>
+      )}
+      {inFeaturePanel && !hideSupportFileType && (
+        <Field
+          title={t('appDebug.variableConfig.file.supportFileTypes')}
+          className='mt-4'
+        >
+          <div className='space-y-1'>
+            {
+              [SupportUploadFileTypes.document, SupportUploadFileTypes.image, SupportUploadFileTypes.audio, SupportUploadFileTypes.video].map((type: SupportUploadFileTypes) => (
+                <FileTypeItem
+                  key={type}
+                  type={type as SupportUploadFileTypes.image | SupportUploadFileTypes.document | SupportUploadFileTypes.audio | SupportUploadFileTypes.video}
+                  selected={allowed_file_types.includes(type)}
+                  onToggle={handleSupportFileTypeChange}
+                />
+              ))
+            }
+            <FileTypeItem
+              type={SupportUploadFileTypes.custom}
+              selected={allowed_file_types.includes(SupportUploadFileTypes.custom)}
+              onToggle={handleSupportFileTypeChange}
+              customFileTypes={allowed_file_extensions}
+              onCustomFileTypesChange={handleCustomFileTypesChange}
+            />
+          </div>
+        </Field>
+      )}
+
+    </div>
+  )
+}
+export default React.memo(FileUploadSetting)
diff --git a/app/components/workflow/nodes/_base/components/group.tsx b/app/components/workflow/nodes/_base/components/group.tsx
new file mode 100644
index 0000000..79f67c6
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/group.tsx
@@ -0,0 +1,25 @@
+import classNames from '@/utils/classnames'
+import type { ComponentProps, FC, PropsWithChildren, ReactNode } from 'react'
+
+export type GroupLabelProps = ComponentProps<'div'>
+
+export const GroupLabel: FC<GroupLabelProps> = (props) => {
+  const { children, className, ...rest } = props
+  return <div {...rest} className={classNames('mb-1 system-2xs-medium-uppercase text-text-tertiary', className)}>
+    {children}
+  </div>
+}
+
+export type GroupProps = PropsWithChildren<{
+  label: ReactNode
+}>
+
+export const Group: FC<GroupProps> = (props) => {
+  const { children, label } = props
+  return <div className={classNames('py-1')}>
+    {label}
+    <div className='space-y-0.5'>
+      {children}
+    </div>
+  </div>
+}
diff --git a/app/components/workflow/nodes/_base/components/help-link.tsx b/app/components/workflow/nodes/_base/components/help-link.tsx
new file mode 100644
index 0000000..2e75520
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/help-link.tsx
@@ -0,0 +1,36 @@
+import { memo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiBookOpenLine } from '@remixicon/react'
+import { useNodeHelpLink } from '../hooks/use-node-help-link'
+import TooltipPlus from '@/app/components/base/tooltip'
+import type { BlockEnum } from '@/app/components/workflow/types'
+
+type HelpLinkProps = {
+  nodeType: BlockEnum
+}
+const HelpLink = ({
+  nodeType,
+}: HelpLinkProps) => {
+  const { t } = useTranslation()
+  const link = useNodeHelpLink(nodeType)
+
+  if (!link)
+    return null
+
+  return (
+    <TooltipPlus
+      popupContent={t('common.userProfile.helpCenter')}
+    >
+      <a
+        href={link}
+        target='_blank'
+        className='mr-1 flex h-6 w-6 items-center justify-center'
+      >
+        <RiBookOpenLine className='h-4 w-4 text-gray-500' />
+      </a>
+    </TooltipPlus>
+
+  )
+}
+
+export default memo(HelpLink)
diff --git a/app/components/workflow/nodes/_base/components/info-panel.tsx b/app/components/workflow/nodes/_base/components/info-panel.tsx
new file mode 100644
index 0000000..88511b1
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/info-panel.tsx
@@ -0,0 +1,27 @@
+'use client'
+import type { FC, ReactNode } from 'react'
+import React from 'react'
+
+type Props = {
+  title: string
+  content: ReactNode
+}
+
+const InfoPanel: FC<Props> = ({
+  title,
+  content,
+}) => {
+  return (
+    <div>
+      <div className='flex flex-col gap-y-0.5 rounded-md bg-workflow-block-parma-bg px-[5px] py-[3px]'>
+        <div className='system-2xs-semibold-uppercase uppercase text-text-secondary'>
+          {title}
+        </div>
+        <div className='system-xs-regular break-words text-text-tertiary'>
+          {content}
+        </div>
+      </div>
+    </div>
+  )
+}
+export default React.memo(InfoPanel)
diff --git a/app/components/workflow/nodes/_base/components/input-number-with-slider.tsx b/app/components/workflow/nodes/_base/components/input-number-with-slider.tsx
new file mode 100644
index 0000000..e0762df
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/input-number-with-slider.tsx
@@ -0,0 +1,65 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import Slider from '@/app/components/base/slider'
+
+type Props = {
+  value: number
+  defaultValue?: number
+  min?: number
+  max?: number
+  readonly?: boolean
+  onChange: (value: number) => void
+}
+
+const InputNumberWithSlider: FC<Props> = ({
+  value,
+  defaultValue = 0,
+  min,
+  max,
+  readonly,
+  onChange,
+}) => {
+  const handleBlur = useCallback(() => {
+    if (value === undefined || value === null) {
+      onChange(defaultValue)
+      return
+    }
+    if (max !== undefined && value > max) {
+      onChange(max)
+      return
+    }
+    if (min !== undefined && value < min)
+      onChange(min)
+  }, [defaultValue, max, min, onChange, value])
+
+  const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
+    onChange(Number.parseFloat(e.target.value))
+  }, [onChange])
+
+  return (
+    <div className='flex h-8 items-center justify-between space-x-2'>
+      <input
+        value={value}
+        className='block h-8 w-12 shrink-0 appearance-none rounded-lg bg-components-input-bg-normal pl-3 text-[13px] text-components-input-text-filled outline-none'
+        type='number'
+        min={min}
+        max={max}
+        step={1}
+        onChange={handleChange}
+        onBlur={handleBlur}
+        disabled={readonly}
+      />
+      <Slider
+        className='grow'
+        value={value}
+        min={min}
+        max={max}
+        step={1}
+        onChange={onChange}
+        disabled={readonly}
+      />
+    </div>
+  )
+}
+export default React.memo(InputNumberWithSlider)
diff --git a/app/components/workflow/nodes/_base/components/input-support-select-var.tsx b/app/components/workflow/nodes/_base/components/input-support-select-var.tsx
new file mode 100644
index 0000000..aab14bb
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/input-support-select-var.tsx
@@ -0,0 +1,126 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect } from 'react'
+import { useBoolean } from 'ahooks'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+import type {
+  Node,
+  NodeOutPutVar,
+} from '@/app/components/workflow/types'
+import { BlockEnum } from '@/app/components/workflow/types'
+import PromptEditor from '@/app/components/base/prompt-editor'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import Tooltip from '@/app/components/base/tooltip'
+import { noop } from 'lodash-es'
+
+type Props = {
+  instanceId?: string
+  className?: string
+  placeholder?: string
+  placeholderClassName?: string
+  promptMinHeightClassName?: string
+  value: string
+  onChange: (value: string) => void
+  onFocusChange?: (value: boolean) => void
+  readOnly?: boolean
+  justVar?: boolean
+  nodesOutputVars?: NodeOutPutVar[]
+  availableNodes?: Node[]
+  insertVarTipToLeft?: boolean
+}
+
+const Editor: FC<Props> = ({
+  instanceId,
+  className,
+  placeholder,
+  placeholderClassName,
+  promptMinHeightClassName = 'min-h-[20px]',
+  value,
+  onChange,
+  onFocusChange,
+  readOnly,
+  nodesOutputVars,
+  availableNodes = [],
+  insertVarTipToLeft,
+}) => {
+  const { t } = useTranslation()
+
+  const [isFocus, {
+    setTrue: setFocus,
+    setFalse: setBlur,
+  }] = useBoolean(false)
+
+  useEffect(() => {
+    onFocusChange?.(isFocus)
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isFocus])
+
+  return (
+    <div className={cn(className, 'relative')}>
+      <>
+        <PromptEditor
+          instanceId={instanceId}
+          className={cn(promptMinHeightClassName, '!leading-[18px]')}
+          placeholder={placeholder}
+          placeholderClassName={placeholderClassName}
+          value={value}
+          contextBlock={{
+            show: false,
+            selectable: false,
+            datasets: [],
+            onAddContext: noop,
+          }}
+          historyBlock={{
+            show: false,
+            selectable: false,
+            history: {
+              user: 'Human',
+              assistant: 'Assistant',
+            },
+            onEditRole: noop,
+          }}
+          queryBlock={{
+            show: false,
+            selectable: false,
+          }}
+          workflowVariableBlock={{
+            show: true,
+            variables: nodesOutputVars || [],
+            workflowNodesMap: availableNodes.reduce((acc, node) => {
+              acc[node.id] = {
+                title: node.data.title,
+                type: node.data.type,
+              }
+              if (node.data.type === BlockEnum.Start) {
+                acc.sys = {
+                  title: t('workflow.blocks.start'),
+                  type: BlockEnum.Start,
+                }
+              }
+              return acc
+            }, {} as any),
+          }}
+          onChange={onChange}
+          editable={!readOnly}
+          onBlur={setBlur}
+          onFocus={setFocus}
+        />
+        {/* to patch Editor not support dynamic change editable status */}
+        {readOnly && <div className='absolute inset-0 z-10'></div>}
+        {isFocus && (
+          <div className={cn('absolute z-10', insertVarTipToLeft ? 'left-[-12px] top-1.5' : ' right-1 top-[-9px]')}>
+            <Tooltip
+              popupContent={`${t('workflow.common.insertVarTip')}`}
+            >
+              <div className='cursor-pointer rounded-[5px] border-[0.5px] border-divider-regular bg-components-badge-white-to-dark p-0.5 shadow-lg'>
+                <Variable02 className='h-3.5 w-3.5 text-components-button-secondary-accent-text' />
+              </div>
+            </Tooltip>
+          </div>
+        )}
+      </>
+    </div >
+  )
+}
+export default React.memo(Editor)
diff --git a/app/components/workflow/nodes/_base/components/input-var-type-icon.tsx b/app/components/workflow/nodes/_base/components/input-var-type-icon.tsx
new file mode 100644
index 0000000..d3cc1db
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/input-var-type-icon.tsx
@@ -0,0 +1,32 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { RiAlignLeft, RiCheckboxMultipleLine, RiFileCopy2Line, RiFileList2Line, RiHashtag, RiTextSnippet } from '@remixicon/react'
+import { InputVarType } from '../../../types'
+
+type Props = {
+  className?: string
+  type: InputVarType
+}
+
+const getIcon = (type: InputVarType) => {
+  return ({
+    [InputVarType.textInput]: RiTextSnippet,
+    [InputVarType.paragraph]: RiAlignLeft,
+    [InputVarType.select]: RiCheckboxMultipleLine,
+    [InputVarType.number]: RiHashtag,
+    [InputVarType.singleFile]: RiFileList2Line,
+    [InputVarType.multiFiles]: RiFileCopy2Line,
+  } as any)[type] || RiTextSnippet
+}
+
+const InputVarTypeIcon: FC<Props> = ({
+  className,
+  type,
+}) => {
+  const Icon = getIcon(type)
+  return (
+    <Icon className={className} />
+  )
+}
+export default React.memo(InputVarTypeIcon)
diff --git a/app/components/workflow/nodes/_base/components/install-plugin-button.tsx b/app/components/workflow/nodes/_base/components/install-plugin-button.tsx
new file mode 100644
index 0000000..23119f0
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/install-plugin-button.tsx
@@ -0,0 +1,45 @@
+import Button from '@/app/components/base/button'
+import { RiInstallLine, RiLoader2Line } from '@remixicon/react'
+import type { ComponentProps, MouseEventHandler } from 'react'
+import classNames from '@/utils/classnames'
+import { useTranslation } from 'react-i18next'
+import { useCheckInstalled, useInstallPackageFromMarketPlace } from '@/service/use-plugins'
+
+type InstallPluginButtonProps = Omit<ComponentProps<typeof Button>, 'children' | 'loading'> & {
+  uniqueIdentifier: string
+  onSuccess?: () => void
+}
+
+export const InstallPluginButton = (props: InstallPluginButtonProps) => {
+  const { className, uniqueIdentifier, onSuccess, ...rest } = props
+  const { t } = useTranslation()
+  const manifest = useCheckInstalled({
+    pluginIds: [uniqueIdentifier],
+    enabled: !!uniqueIdentifier,
+  })
+  const install = useInstallPackageFromMarketPlace()
+  const isLoading = manifest.isLoading || install.isPending
+  // await for refetch to get the new installed plugin, when manifest refetch, this component will unmount
+  || install.isSuccess
+  const handleInstall: MouseEventHandler = (e) => {
+    e.stopPropagation()
+    install.mutate(uniqueIdentifier, {
+      onSuccess: async () => {
+        await manifest.refetch()
+        onSuccess?.()
+      },
+    })
+  }
+  if (!manifest.data) return null
+  if (manifest.data.plugins.some(plugin => plugin.id === uniqueIdentifier)) return null
+  return <Button
+    variant={'secondary'}
+    disabled={isLoading}
+    {...rest}
+    onClick={handleInstall}
+    className={classNames('flex items-center', className)}
+  >
+    {!isLoading ? t('workflow.nodes.agent.pluginInstaller.install') : t('workflow.nodes.agent.pluginInstaller.installing')}
+    {!isLoading ? <RiInstallLine className='ml-1 size-3.5' /> : <RiLoader2Line className='ml-1 size-3.5 animate-spin' />}
+  </Button>
+}
diff --git a/app/components/workflow/nodes/_base/components/list-no-data-placeholder.tsx b/app/components/workflow/nodes/_base/components/list-no-data-placeholder.tsx
new file mode 100644
index 0000000..d4a7f07
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/list-no-data-placeholder.tsx
@@ -0,0 +1,18 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+
+type Props = {
+  children: React.ReactNode
+}
+
+const ListNoDataPlaceholder: FC<Props> = ({
+  children,
+}) => {
+  return (
+    <div className='system-xs-regular flex min-h-[42px] w-full items-center justify-center rounded-[10px] bg-background-section text-text-tertiary'>
+      {children}
+    </div>
+  )
+}
+export default React.memo(ListNoDataPlaceholder)
diff --git a/app/components/workflow/nodes/_base/components/memory-config.tsx b/app/components/workflow/nodes/_base/components/memory-config.tsx
new file mode 100644
index 0000000..446fcfa
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/memory-config.tsx
@@ -0,0 +1,207 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import type { Memory } from '../../../types'
+import { MemoryRole } from '../../../types'
+import cn from '@/utils/classnames'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import Switch from '@/app/components/base/switch'
+import Slider from '@/app/components/base/slider'
+import Input from '@/app/components/base/input'
+
+const i18nPrefix = 'workflow.nodes.common.memory'
+const WINDOW_SIZE_MIN = 1
+const WINDOW_SIZE_MAX = 100
+const WINDOW_SIZE_DEFAULT = 50
+type RoleItemProps = {
+  readonly: boolean
+  title: string
+  value: string
+  onChange: (value: string) => void
+}
+const RoleItem: FC<RoleItemProps> = ({
+  readonly,
+  title,
+  value,
+  onChange,
+}) => {
+  const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
+    onChange(e.target.value)
+  }, [onChange])
+  return (
+    <div className='flex items-center justify-between'>
+      <div className='text-[13px] font-normal text-text-secondary'>{title}</div>
+      <Input
+        readOnly={readonly}
+        value={value}
+        onChange={handleChange}
+        className='h-8 w-[200px]'
+        type='text' />
+    </div>
+  )
+}
+
+type Props = {
+  className?: string
+  readonly: boolean
+  config: { data?: Memory }
+  onChange: (memory?: Memory) => void
+  canSetRoleName?: boolean
+}
+
+const MEMORY_DEFAULT: Memory = {
+  window: { enabled: false, size: WINDOW_SIZE_DEFAULT },
+  query_prompt_template: '{{#sys.query#}}',
+}
+
+const MemoryConfig: FC<Props> = ({
+  className,
+  readonly,
+  config = { data: MEMORY_DEFAULT },
+  onChange,
+  canSetRoleName = false,
+}) => {
+  const { t } = useTranslation()
+  const payload = config.data
+  const handleMemoryEnabledChange = useCallback((enabled: boolean) => {
+    onChange(enabled ? MEMORY_DEFAULT : undefined)
+  }, [onChange])
+  const handleWindowEnabledChange = useCallback((enabled: boolean) => {
+    const newPayload = produce(config.data || MEMORY_DEFAULT, (draft) => {
+      if (!draft.window)
+        draft.window = { enabled: false, size: WINDOW_SIZE_DEFAULT }
+
+      draft.window.enabled = enabled
+    })
+
+    onChange(newPayload)
+  }, [config, onChange])
+
+  const handleWindowSizeChange = useCallback((size: number | string) => {
+    const newPayload = produce(payload || MEMORY_DEFAULT, (draft) => {
+      if (!draft.window)
+        draft.window = { enabled: true, size: WINDOW_SIZE_DEFAULT }
+      let limitedSize: null | string | number = size
+      if (limitedSize === '') {
+        limitedSize = null
+      }
+      else {
+        limitedSize = Number.parseInt(limitedSize as string, 10)
+        if (isNaN(limitedSize))
+          limitedSize = WINDOW_SIZE_DEFAULT
+
+        if (limitedSize < WINDOW_SIZE_MIN)
+          limitedSize = WINDOW_SIZE_MIN
+
+        if (limitedSize > WINDOW_SIZE_MAX)
+          limitedSize = WINDOW_SIZE_MAX
+      }
+
+      draft.window.size = limitedSize as number
+    })
+    onChange(newPayload)
+  }, [payload, onChange])
+
+  const handleBlur = useCallback(() => {
+    const payload = config.data
+    if (!payload)
+      return
+
+    if (payload.window.size === '' || payload.window.size === null)
+      handleWindowSizeChange(WINDOW_SIZE_DEFAULT)
+  }, [handleWindowSizeChange, config])
+
+  const handleRolePrefixChange = useCallback((role: MemoryRole) => {
+    return (value: string) => {
+      const newPayload = produce(config.data || MEMORY_DEFAULT, (draft) => {
+        if (!draft.role_prefix) {
+          draft.role_prefix = {
+            user: '',
+            assistant: '',
+          }
+        }
+        draft.role_prefix[role] = value
+      })
+      onChange(newPayload)
+    }
+  }, [config, onChange])
+  return (
+    <div className={cn(className)}>
+      <Field
+        title={t(`${i18nPrefix}.memory`)}
+        tooltip={t(`${i18nPrefix}.memoryTip`)!}
+        operations={
+          <Switch
+            defaultValue={!!payload}
+            onChange={handleMemoryEnabledChange}
+            size='md'
+            disabled={readonly}
+          />
+        }
+      >
+        {payload && (
+          <>
+            {/* window size */}
+            <div className='flex justify-between'>
+              <div className='flex h-8 items-center space-x-2'>
+                <Switch
+                  defaultValue={payload?.window?.enabled}
+                  onChange={handleWindowEnabledChange}
+                  size='md'
+                  disabled={readonly}
+                />
+                <div className='system-xs-medium-uppercase text-text-tertiary'>{t(`${i18nPrefix}.windowSize`)}</div>
+              </div>
+              <div className='flex h-8 items-center space-x-2'>
+                <Slider
+                  className='w-[144px]'
+                  value={(payload.window?.size || WINDOW_SIZE_DEFAULT) as number}
+                  min={WINDOW_SIZE_MIN}
+                  max={WINDOW_SIZE_MAX}
+                  step={1}
+                  onChange={handleWindowSizeChange}
+                  disabled={readonly || !payload.window?.enabled}
+                />
+                <Input
+                  value={(payload.window?.size || WINDOW_SIZE_DEFAULT) as number}
+                  wrapperClassName='w-12'
+                  className='appearance-none pr-0'
+                  type='number'
+                  min={WINDOW_SIZE_MIN}
+                  max={WINDOW_SIZE_MAX}
+                  step={1}
+                  onChange={e => handleWindowSizeChange(e.target.value)}
+                  onBlur={handleBlur}
+                  disabled={readonly || !payload.window?.enabled}
+                />
+              </div>
+            </div>
+            {canSetRoleName && (
+              <div className='mt-4'>
+                <div className='text-xs font-medium uppercase leading-6 text-text-tertiary'>{t(`${i18nPrefix}.conversationRoleName`)}</div>
+                <div className='mt-1 space-y-2'>
+                  <RoleItem
+                    readonly={readonly}
+                    title={t(`${i18nPrefix}.user`)}
+                    value={payload.role_prefix?.user || ''}
+                    onChange={handleRolePrefixChange(MemoryRole.user)}
+                  />
+                  <RoleItem
+                    readonly={readonly}
+                    title={t(`${i18nPrefix}.assistant`)}
+                    value={payload.role_prefix?.assistant || ''}
+                    onChange={handleRolePrefixChange(MemoryRole.assistant)}
+                  />
+                </div>
+              </div>
+            )}
+          </>
+        )}
+
+      </Field>
+    </div>
+  )
+}
+export default React.memo(MemoryConfig)
diff --git a/app/components/workflow/nodes/_base/components/next-step/add.tsx b/app/components/workflow/nodes/_base/components/next-step/add.tsx
new file mode 100644
index 0000000..de5fbac
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/next-step/add.tsx
@@ -0,0 +1,108 @@
+import {
+  memo,
+  useCallback,
+  useMemo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAddLine,
+} from '@remixicon/react'
+import {
+  useAvailableBlocks,
+  useNodesInteractions,
+  useNodesReadOnly,
+  useWorkflow,
+} from '@/app/components/workflow/hooks'
+import BlockSelector from '@/app/components/workflow/block-selector'
+import type {
+  CommonNodeType,
+  OnSelectBlock,
+} from '@/app/components/workflow/types'
+
+type AddProps = {
+  nodeId: string
+  nodeData: CommonNodeType
+  sourceHandle: string
+  isParallel?: boolean
+  isFailBranch?: boolean
+}
+const Add = ({
+  nodeId,
+  nodeData,
+  sourceHandle,
+  isParallel,
+  isFailBranch,
+}: AddProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const { handleNodeAdd } = useNodesInteractions()
+  const { nodesReadOnly } = useNodesReadOnly()
+  const { availableNextBlocks } = useAvailableBlocks(nodeData.type, nodeData.isInIteration, nodeData.isInLoop)
+  const { checkParallelLimit } = useWorkflow()
+
+  const handleSelect = useCallback<OnSelectBlock>((type, toolDefaultValue) => {
+    handleNodeAdd(
+      {
+        nodeType: type,
+        toolDefaultValue,
+      },
+      {
+        prevNodeId: nodeId,
+        prevNodeSourceHandle: sourceHandle,
+      },
+    )
+  }, [nodeId, sourceHandle, handleNodeAdd])
+
+  const handleOpenChange = useCallback((newOpen: boolean) => {
+    if (newOpen && !checkParallelLimit(nodeId, sourceHandle))
+      return
+
+    setOpen(newOpen)
+  }, [checkParallelLimit, nodeId, sourceHandle])
+
+  const tip = useMemo(() => {
+    if (isFailBranch)
+      return t('workflow.common.addFailureBranch')
+
+    if (isParallel)
+      return t('workflow.common.addParallelNode')
+
+    return t('workflow.panel.selectNextStep')
+  }, [isFailBranch, isParallel, t])
+  const renderTrigger = useCallback((open: boolean) => {
+    return (
+      <div
+        className={`
+          bg-dropzone-bg hover:bg-dropzone-bg-hover relative flex h-9 cursor-pointer items-center rounded-lg border border-dashed
+          border-divider-regular px-2 text-xs text-text-placeholder
+          ${open && '!bg-components-dropzone-bg-alt'}
+          ${nodesReadOnly && '!cursor-not-allowed'}
+        `}
+      >
+        <div className='bg-background-default-dimm mr-1.5 flex h-5 w-5 items-center justify-center rounded-[5px]'>
+          <RiAddLine className='h-3 w-3' />
+        </div>
+        <div className='flex items-center uppercase'>
+          {tip}
+        </div>
+      </div>
+    )
+  }, [nodesReadOnly, tip])
+
+  return (
+    <BlockSelector
+      open={open}
+      onOpenChange={handleOpenChange}
+      disabled={nodesReadOnly}
+      onSelect={handleSelect}
+      placement='top'
+      offset={0}
+      trigger={renderTrigger}
+      popupClassName='!w-[328px]'
+      availableBlocksTypes={availableNextBlocks}
+    />
+  )
+}
+
+export default memo(Add)
diff --git a/app/components/workflow/nodes/_base/components/next-step/container.tsx b/app/components/workflow/nodes/_base/components/next-step/container.tsx
new file mode 100644
index 0000000..a419710
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/next-step/container.tsx
@@ -0,0 +1,65 @@
+import Add from './add'
+import Item from './item'
+import type {
+  CommonNodeType,
+  Node,
+} from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+
+type ContainerProps = {
+  nodeId: string
+  nodeData: CommonNodeType
+  sourceHandle: string
+  nextNodes: Node[]
+  branchName?: string
+  isFailBranch?: boolean
+}
+
+const Container = ({
+  nodeId,
+  nodeData,
+  sourceHandle,
+  nextNodes,
+  branchName,
+  isFailBranch,
+}: ContainerProps) => {
+  return (
+    <div className={cn(
+      'space-y-0.5 rounded-[10px] bg-background-section-burn p-0.5',
+      isFailBranch && 'border-[0.5px] border-state-warning-hover-alt bg-state-warning-hover',
+    )}>
+      {
+        branchName && (
+          <div
+            className={cn(
+              'system-2xs-semibold-uppercase flex items-center truncate px-2 text-text-tertiary',
+              isFailBranch && 'text-text-warning',
+            )}
+            title={branchName}
+          >
+            {branchName}
+          </div>
+        )
+      }
+      {
+        nextNodes.map(nextNode => (
+          <Item
+            key={nextNode.id}
+            nodeId={nextNode.id}
+            data={nextNode.data}
+            sourceHandle='source'
+          />
+        ))
+      }
+      <Add
+        isParallel={!!nextNodes.length}
+        isFailBranch={isFailBranch}
+        nodeId={nodeId}
+        nodeData={nodeData}
+        sourceHandle={sourceHandle}
+      />
+    </div>
+  )
+}
+
+export default Container
diff --git a/app/components/workflow/nodes/_base/components/next-step/index.tsx b/app/components/workflow/nodes/_base/components/next-step/index.tsx
new file mode 100644
index 0000000..afb6429
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/next-step/index.tsx
@@ -0,0 +1,114 @@
+import { memo, useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  getConnectedEdges,
+  getOutgoers,
+  useEdges,
+  useStoreApi,
+} from 'reactflow'
+import { useToolIcon } from '../../../../hooks'
+import BlockIcon from '../../../../block-icon'
+import type {
+  Node,
+} from '../../../../types'
+import { BlockEnum } from '../../../../types'
+import Line from './line'
+import Container from './container'
+import { hasErrorHandleNode } from '@/app/components/workflow/utils'
+import { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/components/error-handle/types'
+
+type NextStepProps = {
+  selectedNode: Node
+}
+const NextStep = ({
+  selectedNode,
+}: NextStepProps) => {
+  const { t } = useTranslation()
+  const data = selectedNode.data
+  const toolIcon = useToolIcon(data)
+  const store = useStoreApi()
+  const branches = useMemo(() => {
+    return data._targetBranches || []
+  }, [data])
+  const edges = useEdges()
+  const outgoers = getOutgoers(selectedNode as Node, store.getState().getNodes(), edges)
+  const connectedEdges = getConnectedEdges([selectedNode] as Node[], edges).filter(edge => edge.source === selectedNode!.id)
+
+  const list = useMemo(() => {
+    let items = []
+    if (branches?.length) {
+      items = branches.map((branch, index) => {
+        const connected = connectedEdges.filter(edge => edge.sourceHandle === branch.id)
+        const nextNodes = connected.map(edge => outgoers.find(outgoer => outgoer.id === edge.target)!)
+
+        return {
+          branch: {
+            ...branch,
+            name: data.type === BlockEnum.QuestionClassifier ? `${t('workflow.nodes.questionClassifiers.class')} ${index + 1}` : branch.name,
+          },
+          nextNodes,
+        }
+      })
+    }
+    else {
+      const connected = connectedEdges.filter(edge => edge.sourceHandle === 'source')
+      const nextNodes = connected.map(edge => outgoers.find(outgoer => outgoer.id === edge.target)!)
+
+      items = [{
+        branch: {
+          id: '',
+          name: '',
+        },
+        nextNodes,
+      }]
+
+      if (data.error_strategy === ErrorHandleTypeEnum.failBranch && hasErrorHandleNode(data.type)) {
+        const connected = connectedEdges.filter(edge => edge.sourceHandle === ErrorHandleTypeEnum.failBranch)
+        const nextNodes = connected.map(edge => outgoers.find(outgoer => outgoer.id === edge.target)!)
+
+        items.push({
+          branch: {
+            id: ErrorHandleTypeEnum.failBranch,
+            name: t('workflow.common.onFailure'),
+          },
+          nextNodes,
+        })
+      }
+    }
+
+    return items
+  }, [branches, connectedEdges, data.error_strategy, data.type, outgoers, t])
+
+  return (
+    <div className='flex py-1'>
+      <div className='relative flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border-[0.5px] border-divider-regular bg-background-default shadow-xs'>
+        <BlockIcon
+          type={selectedNode!.data.type}
+          toolIcon={toolIcon}
+        />
+      </div>
+      <Line
+        list={list.length ? list.map(item => item.nextNodes.length + 1) : [1]}
+      />
+      <div className='grow space-y-2'>
+        {
+          list.map((item, index) => {
+            return (
+              <Container
+                key={index}
+                nodeId={selectedNode!.id}
+                nodeData={selectedNode!.data}
+                sourceHandle={item.branch.id}
+                nextNodes={item.nextNodes}
+                branchName={item.branch.name}
+                isFailBranch={item.branch.id === ErrorHandleTypeEnum.failBranch}
+              />
+            )
+          })
+        }
+      </div>
+    </div>
+  )
+}
+
+export default memo(NextStep)
diff --git a/app/components/workflow/nodes/_base/components/next-step/item.tsx b/app/components/workflow/nodes/_base/components/next-step/item.tsx
new file mode 100644
index 0000000..85a4b28
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/next-step/item.tsx
@@ -0,0 +1,86 @@
+import {
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import Operator from './operator'
+import type {
+  CommonNodeType,
+} from '@/app/components/workflow/types'
+import BlockIcon from '@/app/components/workflow/block-icon'
+import {
+  useNodesInteractions,
+  useNodesReadOnly,
+  useToolIcon,
+} from '@/app/components/workflow/hooks'
+import Button from '@/app/components/base/button'
+import cn from '@/utils/classnames'
+
+type ItemProps = {
+  nodeId: string
+  sourceHandle: string
+  data: CommonNodeType
+}
+const Item = ({
+  nodeId,
+  sourceHandle,
+  data,
+}: ItemProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const { nodesReadOnly } = useNodesReadOnly()
+  const { handleNodeSelect } = useNodesInteractions()
+  const toolIcon = useToolIcon(data)
+
+  const handleOpenChange = useCallback((v: boolean) => {
+    setOpen(v)
+  }, [])
+
+  return (
+    <div
+      className='group relative flex h-9 cursor-pointer items-center rounded-lg border-[0.5px] border-divider-regular bg-background-default px-2 text-xs text-text-secondary shadow-xs last-of-type:mb-0 hover:bg-background-default-hover'
+    >
+      <BlockIcon
+        type={data.type}
+        toolIcon={toolIcon}
+        className='mr-1.5 shrink-0'
+      />
+      <div
+        className='system-xs-medium grow truncate text-text-secondary'
+        title={data.title}
+      >
+        {data.title}
+      </div>
+      {
+        !nodesReadOnly && (
+          <>
+            <Button
+              className='mr-1 hidden shrink-0 group-hover:flex'
+              size='small'
+              onClick={() => handleNodeSelect(nodeId)}
+            >
+              {t('workflow.common.jumpToNode')}
+            </Button>
+            <div
+              className={cn(
+                'hidden shrink-0 items-center group-hover:flex',
+                open && 'flex',
+              )}
+            >
+              <Operator
+                data={data}
+                nodeId={nodeId}
+                sourceHandle={sourceHandle}
+                open={open}
+                onOpenChange={handleOpenChange}
+              />
+            </div>
+          </>
+        )
+      }
+    </div>
+  )
+}
+
+export default memo(Item)
diff --git a/app/components/workflow/nodes/_base/components/next-step/line.tsx b/app/components/workflow/nodes/_base/components/next-step/line.tsx
new file mode 100644
index 0000000..35b0a73
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/next-step/line.tsx
@@ -0,0 +1,73 @@
+import { memo } from 'react'
+
+type LineProps = {
+  list: number[]
+}
+const Line = ({
+  list,
+}: LineProps) => {
+  const listHeight = list.map((item) => {
+    return item * 36 + (item - 1) * 2 + 12 + 6
+  })
+  const processedList = listHeight.map((item, index) => {
+    if (index === 0)
+      return item
+
+    return listHeight.slice(0, index).reduce((acc, cur) => acc + cur, 0) + item
+  })
+  const processedListLength = processedList.length
+  const svgHeight = processedList[processedListLength - 1] + (processedListLength - 1) * 8
+
+  return (
+    <svg className='w-6 shrink-0' style={{ height: svgHeight }}>
+      {
+        processedList.map((item, index) => {
+          const prevItem = index > 0 ? processedList[index - 1] : 0
+          const space = prevItem + index * 8 + 16
+          return (
+            <g key={index}>
+              {
+                index === 0 && (
+                  <>
+                    <path
+                      d='M0,18 L24,18'
+                      strokeWidth={1}
+                      fill='none'
+                      className='stroke-divider-solid'
+                    />
+                    <rect
+                      x={0}
+                      y={16}
+                      width={1}
+                      height={4}
+                      className='fill-divider-solid-alt'
+                    />
+                  </>
+                )
+              }
+              {
+                index > 0 && (
+                  <path
+                    d={`M0,18 Q12,18 12,28 L12,${space - 10 + 2} Q12,${space + 2} 24,${space + 2}`}
+                    strokeWidth={1}
+                    fill='none'
+                    className='stroke-divider-solid'
+                  />
+                )
+              }
+              <rect
+                x={23}
+                y={space}
+                width={1}
+                height={4}
+                className='fill-divider-solid-alt'
+              />
+            </g>
+          )
+        })
+      }
+    </svg>
+  )
+}
+
+export default memo(Line)
diff --git a/app/components/workflow/nodes/_base/components/next-step/operator.tsx b/app/components/workflow/nodes/_base/components/next-step/operator.tsx
new file mode 100644
index 0000000..565db02
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/next-step/operator.tsx
@@ -0,0 +1,129 @@
+import {
+  useCallback,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiMoreFill } from '@remixicon/react'
+import { intersection } from 'lodash-es'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Button from '@/app/components/base/button'
+import BlockSelector from '@/app/components/workflow/block-selector'
+import {
+  useAvailableBlocks,
+  useNodesInteractions,
+} from '@/app/components/workflow/hooks'
+import type {
+  CommonNodeType,
+  OnSelectBlock,
+} from '@/app/components/workflow/types'
+
+type ChangeItemProps = {
+  data: CommonNodeType
+  nodeId: string
+  sourceHandle: string
+}
+const ChangeItem = ({
+  data,
+  nodeId,
+  sourceHandle,
+}: ChangeItemProps) => {
+  const { t } = useTranslation()
+
+  const { handleNodeChange } = useNodesInteractions()
+  const {
+    availablePrevBlocks,
+    availableNextBlocks,
+  } = useAvailableBlocks(data.type, data.isInIteration, data.isInLoop)
+
+  const handleSelect = useCallback<OnSelectBlock>((type, toolDefaultValue) => {
+    handleNodeChange(nodeId, type, sourceHandle, toolDefaultValue)
+  }, [nodeId, sourceHandle, handleNodeChange])
+
+  const renderTrigger = useCallback(() => {
+    return (
+      <div className='flex h-8 cursor-pointer items-center rounded-lg px-2 hover:bg-state-base-hover'>
+        {t('workflow.panel.change')}
+      </div>
+    )
+  }, [t])
+
+  return (
+    <BlockSelector
+      onSelect={handleSelect}
+      placement='top-end'
+      offset={{
+        mainAxis: 6,
+        crossAxis: 8,
+      }}
+      trigger={renderTrigger}
+      popupClassName='!w-[328px]'
+      availableBlocksTypes={intersection(availablePrevBlocks, availableNextBlocks).filter(item => item !== data.type)}
+    />
+  )
+}
+
+type OperatorProps = {
+  open: boolean
+  onOpenChange: (v: boolean) => void
+  data: CommonNodeType
+  nodeId: string
+  sourceHandle: string
+}
+const Operator = ({
+  open,
+  onOpenChange,
+  data,
+  nodeId,
+  sourceHandle,
+}: OperatorProps) => {
+  const { t } = useTranslation()
+  const {
+    handleNodeDelete,
+    handleNodeDisconnect,
+  } = useNodesInteractions()
+
+  return (
+    <PortalToFollowElem
+      placement='bottom-end'
+      offset={{ mainAxis: 4, crossAxis: -4 }}
+      open={open}
+      onOpenChange={onOpenChange}
+    >
+      <PortalToFollowElemTrigger onClick={() => onOpenChange(!open)}>
+        <Button className='h-6 w-6 p-0'>
+          <RiMoreFill className='h-4 w-4' />
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-10'>
+        <div className='system-md-regular min-w-[120px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur text-text-secondary shadow-lg'>
+          <div className='p-1'>
+            <ChangeItem
+              data={data}
+              nodeId={nodeId}
+              sourceHandle={sourceHandle}
+            />
+            <div
+              className='flex h-8 cursor-pointer items-center rounded-lg px-2 hover:bg-state-base-hover'
+              onClick={() => handleNodeDisconnect(nodeId)}
+            >
+              {t('workflow.common.disconnect')}
+            </div>
+          </div>
+          <div className='p-1'>
+            <div
+              className='flex h-8 cursor-pointer items-center rounded-lg px-2 hover:bg-state-base-hover'
+              onClick={() => handleNodeDelete(nodeId)}
+            >
+              {t('common.operation.delete')}
+            </div>
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default Operator
diff --git a/app/components/workflow/nodes/_base/components/node-control.tsx b/app/components/workflow/nodes/_base/components/node-control.tsx
new file mode 100644
index 0000000..a85c417
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/node-control.tsx
@@ -0,0 +1,94 @@
+import type { FC } from 'react'
+import {
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiPlayLargeLine,
+} from '@remixicon/react'
+import {
+  useNodeDataUpdate,
+  useNodesInteractions,
+  useNodesSyncDraft,
+} from '../../../hooks'
+import type { Node } from '../../../types'
+import { canRunBySingle } from '../../../utils'
+import PanelOperator from './panel-operator'
+import {
+  Stop,
+} from '@/app/components/base/icons/src/vender/line/mediaAndDevices'
+import Tooltip from '@/app/components/base/tooltip'
+
+type NodeControlProps = Pick<Node, 'id' | 'data'>
+const NodeControl: FC<NodeControlProps> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const { handleNodeDataUpdate } = useNodeDataUpdate()
+  const { handleNodeSelect } = useNodesInteractions()
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+
+  const handleOpenChange = useCallback((newOpen: boolean) => {
+    setOpen(newOpen)
+  }, [])
+
+  return (
+    <div
+      className={`
+      absolute -top-7 right-0 hidden h-7 pb-1 group-hover:flex
+      ${data.selected && '!flex'}
+      ${open && '!flex'}
+      `}
+    >
+      <div
+        className='flex h-6 items-center rounded-lg border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg px-0.5 text-text-tertiary shadow-md backdrop-blur-[5px]'
+        onClick={e => e.stopPropagation()}
+      >
+        {
+          canRunBySingle(data.type) && (
+            <div
+              className='flex h-5 w-5 cursor-pointer items-center justify-center rounded-md hover:bg-state-base-hover'
+              onClick={() => {
+                handleNodeDataUpdate({
+                  id,
+                  data: {
+                    _isSingleRun: !data._isSingleRun,
+                  },
+                })
+                handleNodeSelect(id)
+                if (!data._isSingleRun)
+                  handleSyncWorkflowDraft(true)
+              }}
+            >
+              {
+                data._isSingleRun
+                  ? <Stop className='h-3 w-3' />
+                  : (
+                    <Tooltip
+                      popupContent={t('workflow.panel.runThisStep')}
+                      asChild={false}
+                    >
+                      <RiPlayLargeLine className='h-3 w-3' />
+                    </Tooltip>
+                  )
+              }
+            </div>
+          )
+        }
+        <PanelOperator
+          id={id}
+          data={data}
+          offset={0}
+          onOpenChange={handleOpenChange}
+          triggerClassName='!w-5 !h-5'
+        />
+      </div>
+    </div>
+  )
+}
+
+export default memo(NodeControl)
diff --git a/app/components/workflow/nodes/_base/components/node-handle.tsx b/app/components/workflow/nodes/_base/components/node-handle.tsx
new file mode 100644
index 0000000..d8754cd
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/node-handle.tsx
@@ -0,0 +1,215 @@
+import type { MouseEvent } from 'react'
+import {
+  memo,
+  useCallback,
+  useEffect,
+  useState,
+} from 'react'
+import {
+  Handle,
+  Position,
+} from 'reactflow'
+import { useTranslation } from 'react-i18next'
+import {
+  BlockEnum,
+  NodeRunningStatus,
+} from '../../../types'
+import type { Node } from '../../../types'
+import BlockSelector from '../../../block-selector'
+import type { ToolDefaultValue } from '../../../block-selector/types'
+import {
+  useAvailableBlocks,
+  useIsChatMode,
+  useNodesInteractions,
+  useNodesReadOnly,
+  useWorkflow,
+} from '../../../hooks'
+import {
+  useStore,
+} from '../../../store'
+import cn from '@/utils/classnames'
+
+type NodeHandleProps = {
+  handleId: string
+  handleClassName?: string
+  nodeSelectorClassName?: string
+  showExceptionStatus?: boolean
+} & Pick<Node, 'id' | 'data'>
+
+export const NodeTargetHandle = memo(({
+  id,
+  data,
+  handleId,
+  handleClassName,
+  nodeSelectorClassName,
+}: NodeHandleProps) => {
+  const [open, setOpen] = useState(false)
+  const { handleNodeAdd } = useNodesInteractions()
+  const { getNodesReadOnly } = useNodesReadOnly()
+  const connected = data._connectedTargetHandleIds?.includes(handleId)
+  const { availablePrevBlocks } = useAvailableBlocks(data.type, data.isInIteration, data.isInLoop)
+  const isConnectable = !!availablePrevBlocks.length
+
+  const handleOpenChange = useCallback((v: boolean) => {
+    setOpen(v)
+  }, [])
+  const handleHandleClick = useCallback((e: MouseEvent) => {
+    e.stopPropagation()
+    if (!connected)
+      setOpen(v => !v)
+  }, [connected])
+  const handleSelect = useCallback((type: BlockEnum, toolDefaultValue?: ToolDefaultValue) => {
+    handleNodeAdd(
+      {
+        nodeType: type,
+        toolDefaultValue,
+      },
+      {
+        nextNodeId: id,
+        nextNodeTargetHandle: handleId,
+      },
+    )
+  }, [handleNodeAdd, id, handleId])
+
+  return (
+    <>
+      <Handle
+        id={handleId}
+        type='target'
+        position={Position.Left}
+        className={cn(
+          'z-[1] !h-4 !w-4 !rounded-none !border-none !bg-transparent !outline-none',
+          'after:absolute after:left-1.5 after:top-1 after:h-2 after:w-0.5 after:bg-workflow-link-line-handle',
+          'transition-all hover:scale-125',
+          data._runningStatus === NodeRunningStatus.Succeeded && 'after:bg-workflow-link-line-success-handle',
+          data._runningStatus === NodeRunningStatus.Failed && 'after:bg-workflow-link-line-error-handle',
+          data._runningStatus === NodeRunningStatus.Exception && 'after:bg-workflow-link-line-failure-handle',
+          !connected && 'after:opacity-0',
+          data.type === BlockEnum.Start && 'opacity-0',
+          handleClassName,
+        )}
+        isConnectable={isConnectable}
+        onClick={handleHandleClick}
+      >
+        {
+          !connected && isConnectable && !getNodesReadOnly() && (
+            <BlockSelector
+              open={open}
+              onOpenChange={handleOpenChange}
+              onSelect={handleSelect}
+              asChild
+              placement='left'
+              triggerClassName={open => `
+                hidden absolute left-0 top-0 pointer-events-none
+                ${nodeSelectorClassName}
+                group-hover:!flex
+                ${data.selected && '!flex'}
+                ${open && '!flex'}
+              `}
+              availableBlocksTypes={availablePrevBlocks}
+            />
+          )
+        }
+      </Handle>
+    </>
+  )
+})
+NodeTargetHandle.displayName = 'NodeTargetHandle'
+
+export const NodeSourceHandle = memo(({
+  id,
+  data,
+  handleId,
+  handleClassName,
+  nodeSelectorClassName,
+  showExceptionStatus,
+}: NodeHandleProps) => {
+  const { t } = useTranslation()
+  const notInitialWorkflow = useStore(s => s.notInitialWorkflow)
+  const [open, setOpen] = useState(false)
+  const { handleNodeAdd } = useNodesInteractions()
+  const { getNodesReadOnly } = useNodesReadOnly()
+  const { availableNextBlocks } = useAvailableBlocks(data.type, data.isInIteration, data.isInLoop)
+  const isConnectable = !!availableNextBlocks.length
+  const isChatMode = useIsChatMode()
+  const { checkParallelLimit } = useWorkflow()
+
+  const connected = data._connectedSourceHandleIds?.includes(handleId)
+  const handleOpenChange = useCallback((v: boolean) => {
+    setOpen(v)
+  }, [])
+  const handleHandleClick = useCallback((e: MouseEvent) => {
+    e.stopPropagation()
+    if (checkParallelLimit(id, handleId))
+      setOpen(v => !v)
+  }, [checkParallelLimit, id, handleId])
+  const handleSelect = useCallback((type: BlockEnum, toolDefaultValue?: ToolDefaultValue) => {
+    handleNodeAdd(
+      {
+        nodeType: type,
+        toolDefaultValue,
+      },
+      {
+        prevNodeId: id,
+        prevNodeSourceHandle: handleId,
+      },
+    )
+  }, [handleNodeAdd, id, handleId])
+
+  useEffect(() => {
+    if (notInitialWorkflow && data.type === BlockEnum.Start && !isChatMode)
+      setOpen(true)
+  }, [notInitialWorkflow, data.type, isChatMode])
+
+  return (
+    <Handle
+      id={handleId}
+      type='source'
+      position={Position.Right}
+      className={cn(
+        'group/handle z-[1] !h-4 !w-4 !rounded-none !border-none !bg-transparent !outline-none',
+        'after:absolute after:right-1.5 after:top-1 after:h-2 after:w-0.5 after:bg-workflow-link-line-handle',
+        'transition-all hover:scale-125',
+        data._runningStatus === NodeRunningStatus.Succeeded && 'after:bg-workflow-link-line-success-handle',
+        data._runningStatus === NodeRunningStatus.Failed && 'after:bg-workflow-link-line-error-handle',
+        showExceptionStatus && data._runningStatus === NodeRunningStatus.Exception && 'after:bg-workflow-link-line-failure-handle',
+        !connected && 'after:opacity-0',
+        handleClassName,
+      )}
+      isConnectable={isConnectable}
+      onClick={handleHandleClick}
+    >
+      <div className='absolute -top-1 left-1/2 hidden -translate-x-1/2 -translate-y-full rounded-lg border-[0.5px] border-components-panel-border bg-components-tooltip-bg p-1.5 shadow-lg group-hover/handle:block'>
+        <div className='system-xs-regular text-text-tertiary'>
+          <div className=' whitespace-nowrap'>
+            <span className='system-xs-medium text-text-secondary'>{t('workflow.common.parallelTip.click.title')}</span>
+            {t('workflow.common.parallelTip.click.desc')}
+          </div>
+          <div>
+            <span className='system-xs-medium text-text-secondary'>{t('workflow.common.parallelTip.drag.title')}</span>
+            {t('workflow.common.parallelTip.drag.desc')}
+          </div>
+        </div>
+      </div>
+      {
+        isConnectable && !getNodesReadOnly() && (
+          <BlockSelector
+            open={open}
+            onOpenChange={handleOpenChange}
+            onSelect={handleSelect}
+            asChild
+            triggerClassName={open => `
+              hidden absolute top-0 left-0 pointer-events-none
+              ${nodeSelectorClassName}
+              group-hover:!flex
+              ${data.selected && '!flex'}
+              ${open && '!flex'}
+            `}
+            availableBlocksTypes={availableNextBlocks}
+          />
+        )
+      }
+    </Handle>
+  )
+})
+NodeSourceHandle.displayName = 'NodeSourceHandle'
diff --git a/app/components/workflow/nodes/_base/components/node-resizer.tsx b/app/components/workflow/nodes/_base/components/node-resizer.tsx
new file mode 100644
index 0000000..7f83414
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/node-resizer.tsx
@@ -0,0 +1,60 @@
+import {
+  memo,
+  useCallback,
+} from 'react'
+import type { OnResize } from 'reactflow'
+import { NodeResizeControl } from 'reactflow'
+import { useNodesInteractions } from '../../../hooks'
+import type { CommonNodeType } from '../../../types'
+import cn from '@/utils/classnames'
+
+const Icon = () => {
+  return (
+    <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
+      <path d="M5.19009 11.8398C8.26416 10.6196 10.7144 8.16562 11.9297 5.08904" stroke="black" strokeOpacity="0.16" strokeWidth="2" strokeLinecap="round" />
+    </svg>
+  )
+}
+
+type NodeResizerProps = {
+  nodeId: string
+  nodeData: CommonNodeType
+  icon?: React.JSX.Element
+  minWidth?: number
+  minHeight?: number
+  maxWidth?: number
+}
+const NodeResizer = ({
+  nodeId,
+  nodeData,
+  icon = <Icon />,
+  minWidth = 258,
+  minHeight = 152,
+  maxWidth,
+}: NodeResizerProps) => {
+  const { handleNodeResize } = useNodesInteractions()
+
+  const handleResize = useCallback<OnResize>((_, params) => {
+    handleNodeResize(nodeId, params)
+  }, [nodeId, handleNodeResize])
+
+  return (
+    <div className={cn(
+      'hidden group-hover:block',
+      nodeData.selected && '!block',
+    )}>
+      <NodeResizeControl
+        position='bottom-right'
+        className='!border-none !bg-transparent'
+        onResize={handleResize}
+        minWidth={minWidth}
+        minHeight={minHeight}
+        maxWidth={maxWidth}
+      >
+        <div className='absolute bottom-[1px] right-[1px]'>{icon}</div>
+      </NodeResizeControl>
+    </div>
+  )
+}
+
+export default memo(NodeResizer)
diff --git a/app/components/workflow/nodes/_base/components/node-status-icon.tsx b/app/components/workflow/nodes/_base/components/node-status-icon.tsx
new file mode 100644
index 0000000..3ab65b8
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/node-status-icon.tsx
@@ -0,0 +1,43 @@
+import {
+  RiAlertFill,
+  RiCheckboxCircleFill,
+  RiErrorWarningLine,
+  RiLoader2Line,
+} from '@remixicon/react'
+import cn from '@/utils/classnames'
+
+type NodeStatusIconProps = {
+  status: string
+  className?: string
+}
+const NodeStatusIcon = ({
+  status,
+  className,
+}: NodeStatusIconProps) => {
+  return (
+    <>
+      {
+        status === 'succeeded' && (
+          <RiCheckboxCircleFill className={cn('h-4 w-4 shrink-0 text-text-success', className)} />
+        )
+      }
+      {
+        status === 'failed' && (
+          <RiErrorWarningLine className={cn('h-4 w-4 shrink-0 text-text-warning', className)} />
+        )
+      }
+      {
+        (status === 'stopped' || status === 'exception') && (
+          <RiAlertFill className={cn('h-4 w-4 shrink-0 text-text-warning-secondary', className)} />
+        )
+      }
+      {
+        status === 'running' && (
+          <RiLoader2Line className={cn('h-4 w-4 shrink-0 animate-spin text-text-accent', className)} />
+        )
+      }
+    </>
+  )
+}
+
+export default NodeStatusIcon
diff --git a/app/components/workflow/nodes/_base/components/option-card.tsx b/app/components/workflow/nodes/_base/components/option-card.tsx
new file mode 100644
index 0000000..79c8987
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/option-card.tsx
@@ -0,0 +1,74 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import type { VariantProps } from 'class-variance-authority'
+import { cva } from 'class-variance-authority'
+import cn from '@/utils/classnames'
+import Tooltip from '@/app/components/base/tooltip'
+
+const variants = cva([], {
+  variants: {
+    align: {
+      left: 'justify-start',
+      center: 'justify-center',
+      right: 'justify-end',
+    },
+  },
+  defaultVariants: {
+    align: 'center',
+  },
+},
+)
+
+type Props = {
+  className?: string
+  title: string
+  onSelect: () => void
+  selected: boolean
+  disabled?: boolean
+  align?: 'left' | 'center' | 'right'
+  tooltip?: string
+} & VariantProps<typeof variants>
+
+const OptionCard: FC<Props> = ({
+  className,
+  title,
+  onSelect,
+  selected,
+  disabled,
+  align = 'center',
+  tooltip,
+}) => {
+  const handleSelect = useCallback(() => {
+    if (selected || disabled)
+      return
+    onSelect()
+  }, [onSelect, selected, disabled])
+
+  return (
+    <div
+      className={cn(
+        'system-sm-regular flex h-8 cursor-default items-center rounded-md border border-components-option-card-option-border bg-components-option-card-option-bg px-2 text-text-secondary',
+        (!selected && !disabled) && 'cursor-pointer hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs',
+        selected && 'system-sm-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg shadow-xs',
+        disabled && 'text-text-disabled',
+        variants({ align }),
+        className,
+      )}
+      onClick={handleSelect}
+    >
+      <span>{title}</span>
+      {tooltip
+        && <Tooltip
+          popupContent={
+            <div className='w-[240px]'>
+              {tooltip}
+            </div>
+          }
+        />
+      }
+    </div>
+  )
+}
+
+export default React.memo(OptionCard)
diff --git a/app/components/workflow/nodes/_base/components/output-vars.tsx b/app/components/workflow/nodes/_base/components/output-vars.tsx
new file mode 100644
index 0000000..ca075f2
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/output-vars.tsx
@@ -0,0 +1,85 @@
+'use client'
+import type { FC, ReactNode } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { FieldCollapse } from '@/app/components/workflow/nodes/_base/components/collapse'
+import TreeIndentLine from './variable/object-child-tree-panel/tree-indent-line'
+import cn from '@/utils/classnames'
+
+type Props = {
+  className?: string
+  title?: string
+  children: ReactNode
+  operations?: ReactNode
+  collapsed?: boolean
+  onCollapse?: (collapsed: boolean) => void
+}
+
+const OutputVars: FC<Props> = ({
+  title,
+  children,
+  operations,
+  collapsed,
+  onCollapse,
+}) => {
+  const { t } = useTranslation()
+  return (
+    <FieldCollapse
+      title={title || t('workflow.nodes.common.outputVars')}
+      operations={operations}
+      collapsed={collapsed}
+      onCollapse={onCollapse}
+    >
+      {children}
+    </FieldCollapse>
+  )
+}
+type VarItemProps = {
+  name: string
+  type: string
+  description: string
+  subItems?: {
+    name: string
+    type: string
+    description: string
+  }[]
+  isIndent?: boolean
+}
+
+export const VarItem: FC<VarItemProps> = ({
+  name,
+  type,
+  description,
+  subItems,
+  isIndent,
+}) => {
+  return (
+    <div className={cn('flex', isIndent && 'relative left-[-7px]')}>
+      {isIndent && <TreeIndentLine depth={1} />}
+      <div className='py-1'>
+        <div className='flex'>
+          <div className='flex items-center leading-[18px]'>
+            <div className='code-sm-semibold text-text-secondary'>{name}</div>
+            <div className='system-xs-regular ml-2 text-text-tertiary'>{type}</div>
+          </div>
+        </div>
+        <div className='system-xs-regular mt-0.5 text-text-tertiary'>
+          {description}
+          {subItems && (
+            <div className='ml-2 border-l border-gray-200 pl-2'>
+              {subItems.map((item, index) => (
+                <VarItem
+                  key={index}
+                  name={item.name}
+                  type={item.type}
+                  description={item.description}
+                />
+              ))}
+            </div>
+          )}
+        </div>
+      </div>
+    </div>
+  )
+}
+export default React.memo(OutputVars)
diff --git a/app/components/workflow/nodes/_base/components/panel-operator/change-block.tsx b/app/components/workflow/nodes/_base/components/panel-operator/change-block.tsx
new file mode 100644
index 0000000..90f9dae
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/panel-operator/change-block.tsx
@@ -0,0 +1,71 @@
+import {
+  memo,
+  useCallback,
+  useMemo,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { intersection } from 'lodash-es'
+import BlockSelector from '@/app/components/workflow/block-selector'
+import {
+  useAvailableBlocks,
+  useNodesInteractions,
+} from '@/app/components/workflow/hooks'
+import type {
+  Node,
+  OnSelectBlock,
+} from '@/app/components/workflow/types'
+
+type ChangeBlockProps = {
+  nodeId: string
+  nodeData: Node['data']
+  sourceHandle: string
+}
+const ChangeBlock = ({
+  nodeId,
+  nodeData,
+  sourceHandle,
+}: ChangeBlockProps) => {
+  const { t } = useTranslation()
+  const { handleNodeChange } = useNodesInteractions()
+  const {
+    availablePrevBlocks,
+    availableNextBlocks,
+  } = useAvailableBlocks(nodeData.type, nodeData.isInIteration, nodeData.isInLoop)
+
+  const availableNodes = useMemo(() => {
+    if (availablePrevBlocks.length && availableNextBlocks.length)
+      return intersection(availablePrevBlocks, availableNextBlocks)
+    else if (availablePrevBlocks.length)
+      return availablePrevBlocks
+    else
+      return availableNextBlocks
+  }, [availablePrevBlocks, availableNextBlocks])
+
+  const handleSelect = useCallback<OnSelectBlock>((type, toolDefaultValue) => {
+    handleNodeChange(nodeId, type, sourceHandle, toolDefaultValue)
+  }, [handleNodeChange, nodeId, sourceHandle])
+
+  const renderTrigger = useCallback(() => {
+    return (
+      <div className='flex h-8 w-[232px] cursor-pointer items-center rounded-lg px-3 text-sm text-text-secondary hover:bg-state-base-hover'>
+        {t('workflow.panel.changeBlock')}
+      </div>
+    )
+  }, [t])
+
+  return (
+    <BlockSelector
+      placement='bottom-end'
+      offset={{
+        mainAxis: -36,
+        crossAxis: 4,
+      }}
+      onSelect={handleSelect}
+      trigger={renderTrigger}
+      popupClassName='min-w-[240px]'
+      availableBlocksTypes={availableNodes}
+    />
+  )
+}
+
+export default memo(ChangeBlock)
diff --git a/app/components/workflow/nodes/_base/components/panel-operator/index.tsx b/app/components/workflow/nodes/_base/components/panel-operator/index.tsx
new file mode 100644
index 0000000..cf05eb9
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/panel-operator/index.tsx
@@ -0,0 +1,77 @@
+import {
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import { RiMoreFill } from '@remixicon/react'
+import type { OffsetOptions } from '@floating-ui/react'
+import PanelOperatorPopup from './panel-operator-popup'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import type { Node } from '@/app/components/workflow/types'
+
+type PanelOperatorProps = {
+  id: string
+  data: Node['data']
+  triggerClassName?: string
+  offset?: OffsetOptions
+  onOpenChange?: (open: boolean) => void
+  inNode?: boolean
+  showHelpLink?: boolean
+}
+const PanelOperator = ({
+  id,
+  data,
+  triggerClassName,
+  offset = {
+    mainAxis: 4,
+    crossAxis: 53,
+  },
+  onOpenChange,
+  inNode,
+  showHelpLink = true,
+}: PanelOperatorProps) => {
+  const [open, setOpen] = useState(false)
+
+  const handleOpenChange = useCallback((newOpen: boolean) => {
+    setOpen(newOpen)
+
+    if (onOpenChange)
+      onOpenChange(newOpen)
+  }, [onOpenChange])
+
+  return (
+    <PortalToFollowElem
+      placement='bottom-end'
+      offset={offset}
+      open={open}
+      onOpenChange={handleOpenChange}
+    >
+      <PortalToFollowElemTrigger onClick={() => handleOpenChange(!open)}>
+        <div
+          className={`
+            flex h-6 w-6 cursor-pointer items-center justify-center rounded-md
+            hover:bg-state-base-hover
+            ${open && 'bg-state-base-hover'}
+            ${triggerClassName}
+          `}
+        >
+          <RiMoreFill className={'h-4 w-4 text-text-tertiary'} />
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[11]'>
+        <PanelOperatorPopup
+          id={id}
+          data={data}
+          onClosePopup={() => setOpen(false)}
+          showHelpLink={showHelpLink}
+        />
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default memo(PanelOperator)
diff --git a/app/components/workflow/nodes/_base/components/panel-operator/panel-operator-popup.tsx b/app/components/workflow/nodes/_base/components/panel-operator/panel-operator-popup.tsx
new file mode 100644
index 0000000..28d7358
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/panel-operator/panel-operator-popup.tsx
@@ -0,0 +1,197 @@
+import {
+  memo,
+  useMemo,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { useEdges } from 'reactflow'
+import { useNodeHelpLink } from '../../hooks/use-node-help-link'
+import ChangeBlock from './change-block'
+import {
+  canRunBySingle,
+} from '@/app/components/workflow/utils'
+import { useStore } from '@/app/components/workflow/store'
+import {
+  useNodeDataUpdate,
+  useNodesExtraData,
+  useNodesInteractions,
+  useNodesReadOnly,
+  useNodesSyncDraft,
+} from '@/app/components/workflow/hooks'
+import ShortcutsName from '@/app/components/workflow/shortcuts-name'
+import type { Node } from '@/app/components/workflow/types'
+import { BlockEnum } from '@/app/components/workflow/types'
+import { useGetLanguage } from '@/context/i18n'
+import { CollectionType } from '@/app/components/tools/types'
+import { canFindTool } from '@/utils'
+
+type PanelOperatorPopupProps = {
+  id: string
+  data: Node['data']
+  onClosePopup: () => void
+  showHelpLink?: boolean
+}
+const PanelOperatorPopup = ({
+  id,
+  data,
+  onClosePopup,
+  showHelpLink,
+}: PanelOperatorPopupProps) => {
+  const { t } = useTranslation()
+  const language = useGetLanguage()
+  const edges = useEdges()
+  const {
+    handleNodeDelete,
+    handleNodesDuplicate,
+    handleNodeSelect,
+    handleNodesCopy,
+  } = useNodesInteractions()
+  const { handleNodeDataUpdate } = useNodeDataUpdate()
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+  const { nodesReadOnly } = useNodesReadOnly()
+  const nodesExtraData = useNodesExtraData()
+  const buildInTools = useStore(s => s.buildInTools)
+  const customTools = useStore(s => s.customTools)
+  const workflowTools = useStore(s => s.workflowTools)
+  const edge = edges.find(edge => edge.target === id)
+  const author = useMemo(() => {
+    if (data.type !== BlockEnum.Tool)
+      return nodesExtraData[data.type].author
+
+    if (data.provider_type === CollectionType.builtIn)
+      return buildInTools.find(toolWithProvider => canFindTool(toolWithProvider.id, data.provider_id))?.author
+
+    if (data.provider_type === CollectionType.workflow)
+      return workflowTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.author
+
+    return customTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.author
+  }, [data, nodesExtraData, buildInTools, customTools, workflowTools])
+
+  const about = useMemo(() => {
+    if (data.type !== BlockEnum.Tool)
+      return nodesExtraData[data.type].about
+
+    if (data.provider_type === CollectionType.builtIn)
+      return buildInTools.find(toolWithProvider => canFindTool(toolWithProvider.id, data.provider_id))?.description[language]
+
+    if (data.provider_type === CollectionType.workflow)
+      return workflowTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.description[language]
+
+    return customTools.find(toolWithProvider => toolWithProvider.id === data.provider_id)?.description[language]
+  }, [data, nodesExtraData, language, buildInTools, customTools, workflowTools])
+
+  const showChangeBlock = data.type !== BlockEnum.Start && !nodesReadOnly && data.type !== BlockEnum.Iteration && data.type !== BlockEnum.Loop
+
+  const link = useNodeHelpLink(data.type)
+
+  return (
+    <div className='w-[240px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl'>
+      {
+        (showChangeBlock || canRunBySingle(data.type)) && (
+          <>
+            <div className='p-1'>
+              {
+                canRunBySingle(data.type) && (
+                  <div
+                    className={`
+                      flex h-8 cursor-pointer items-center rounded-lg px-3 text-sm text-text-secondary
+                      hover:bg-state-base-hover
+                    `}
+                    onClick={() => {
+                      handleNodeSelect(id)
+                      handleNodeDataUpdate({ id, data: { _isSingleRun: true } })
+                      handleSyncWorkflowDraft(true)
+                      onClosePopup()
+                    }}
+                  >
+                    {t('workflow.panel.runThisStep')}
+                  </div>
+                )
+              }
+              {
+                showChangeBlock && (
+                  <ChangeBlock
+                    nodeId={id}
+                    nodeData={data}
+                    sourceHandle={edge?.sourceHandle || 'source'}
+                  />
+                )
+              }
+            </div>
+            <div className='h-[1px] bg-divider-regular'></div>
+          </>
+        )
+      }
+      {
+        data.type !== BlockEnum.Start && !nodesReadOnly && (
+          <>
+            <div className='p-1'>
+              <div
+                className='flex h-8 cursor-pointer items-center justify-between rounded-lg px-3 text-sm text-text-secondary hover:bg-state-base-hover'
+                onClick={() => {
+                  onClosePopup()
+                  handleNodesCopy(id)
+                }}
+              >
+                {t('workflow.common.copy')}
+                <ShortcutsName keys={['ctrl', 'c']} />
+              </div>
+              <div
+                className='flex h-8 cursor-pointer items-center justify-between rounded-lg px-3 text-sm text-text-secondary hover:bg-state-base-hover'
+                onClick={() => {
+                  onClosePopup()
+                  handleNodesDuplicate(id)
+                }}
+              >
+                {t('workflow.common.duplicate')}
+                <ShortcutsName keys={['ctrl', 'd']} />
+              </div>
+            </div>
+            <div className='h-[1px] bg-divider-regular'></div>
+            <div className='p-1'>
+              <div
+                className={`
+                flex h-8 cursor-pointer items-center justify-between rounded-lg px-3 text-sm text-text-secondary
+                hover:bg-state-destructive-hover hover:text-red-500
+                `}
+                onClick={() => handleNodeDelete(id)}
+              >
+                {t('common.operation.delete')}
+                <ShortcutsName keys={['del']} />
+              </div>
+            </div>
+            <div className='h-[1px] bg-divider-regular'></div>
+          </>
+        )
+      }
+      {
+        showHelpLink && link && (
+          <>
+            <div className='p-1'>
+              <a
+                href={link}
+                target='_blank'
+                className='flex h-8 cursor-pointer items-center rounded-lg px-3 text-sm text-text-secondary hover:bg-state-base-hover'
+              >
+                {t('workflow.panel.helpLink')}
+              </a>
+            </div>
+            <div className='h-[1px] bg-divider-regular'></div>
+          </>
+        )
+      }
+      <div className='p-1'>
+        <div className='px-3 py-2 text-xs text-text-tertiary'>
+          <div className='mb-1 flex h-[22px] items-center font-medium'>
+            {t('workflow.panel.about').toLocaleUpperCase()}
+          </div>
+          <div className='mb-1 leading-[18px] text-text-secondary'>{about}</div>
+          <div className='leading-[18px]'>
+            {t('workflow.panel.createdBy')} {author}
+          </div>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default memo(PanelOperatorPopup)
diff --git a/app/components/workflow/nodes/_base/components/prompt/editor.tsx b/app/components/workflow/nodes/_base/components/prompt/editor.tsx
new file mode 100644
index 0000000..c6233ff
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/prompt/editor.tsx
@@ -0,0 +1,306 @@
+'use client'
+import type { FC, ReactNode } from 'react'
+import React, { useCallback, useRef } from 'react'
+import {
+  RiDeleteBinLine,
+} from '@remixicon/react'
+import copy from 'copy-to-clipboard'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import { BlockEnum, EditionType } from '../../../../types'
+import type {
+  ModelConfig,
+  Node,
+  NodeOutPutVar,
+  Variable,
+} from '../../../../types'
+
+import Wrap from '../editor/wrap'
+import { CodeLanguage } from '../../../code/types'
+import PromptGeneratorBtn from '../../../llm/components/prompt-generator-btn'
+import cn from '@/utils/classnames'
+import ToggleExpandBtn from '@/app/components/workflow/nodes/_base/components/toggle-expand-btn'
+import useToggleExpend from '@/app/components/workflow/nodes/_base/hooks/use-toggle-expend'
+import PromptEditor from '@/app/components/base/prompt-editor'
+import {
+  Clipboard,
+  ClipboardCheck,
+} from '@/app/components/base/icons/src/vender/line/files'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { PROMPT_EDITOR_INSERT_QUICKLY } from '@/app/components/base/prompt-editor/plugins/update-block'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import ActionButton from '@/app/components/base/action-button'
+import Tooltip from '@/app/components/base/tooltip'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars'
+import Switch from '@/app/components/base/switch'
+import { Jinja } from '@/app/components/base/icons/src/vender/workflow'
+import { useStore } from '@/app/components/workflow/store'
+import { useWorkflowVariableType } from '@/app/components/workflow/hooks'
+
+type Props = {
+  className?: string
+  headerClassName?: string
+  instanceId?: string
+  title: string | React.JSX.Element
+  value: string
+  onChange: (value: string) => void
+  readOnly?: boolean
+  showRemove?: boolean
+  onRemove?: () => void
+  justVar?: boolean
+  isChatModel?: boolean
+  isChatApp?: boolean
+  isShowContext?: boolean
+  hasSetBlockStatus?: {
+    context: boolean
+    history: boolean
+    query: boolean
+  }
+  nodesOutputVars?: NodeOutPutVar[]
+  availableNodes?: Node[]
+  isSupportFileVar?: boolean
+  isSupportPromptGenerator?: boolean
+  onGenerated?: (prompt: string) => void
+  modelConfig?: ModelConfig
+  // for jinja
+  isSupportJinja?: boolean
+  editionType?: EditionType
+  onEditionTypeChange?: (editionType: EditionType) => void
+  varList?: Variable[]
+  handleAddVariable?: (payload: any) => void
+  containerBackgroundClassName?: string
+  gradientBorder?: boolean
+  titleTooltip?: ReactNode
+  inputClassName?: string
+  editorContainerClassName?: string
+  placeholder?: string
+  placeholderClassName?: string
+  titleClassName?: string
+  required?: boolean
+}
+
+const Editor: FC<Props> = ({
+  className,
+  headerClassName,
+  instanceId,
+  title,
+  value,
+  onChange,
+  readOnly,
+  showRemove,
+  onRemove,
+  justVar,
+  isChatModel,
+  isChatApp,
+  isShowContext,
+  hasSetBlockStatus,
+  nodesOutputVars,
+  availableNodes = [],
+  isSupportFileVar,
+  isSupportPromptGenerator,
+  isSupportJinja,
+  editionType,
+  onEditionTypeChange,
+  varList = [],
+  handleAddVariable,
+  onGenerated,
+  modelConfig,
+  containerBackgroundClassName: containerClassName,
+  gradientBorder = true,
+  titleTooltip,
+  inputClassName,
+  placeholder,
+  placeholderClassName,
+  titleClassName,
+  editorContainerClassName,
+  required,
+}) => {
+  const { t } = useTranslation()
+  const { eventEmitter } = useEventEmitterContextContext()
+  const controlPromptEditorRerenderKey = useStore(s => s.controlPromptEditorRerenderKey)
+
+  const isShowHistory = !isChatModel && isChatApp
+
+  const ref = useRef<HTMLDivElement>(null)
+  const {
+    wrapClassName,
+    wrapStyle,
+    isExpand,
+    setIsExpand,
+    editorExpandHeight,
+  } = useToggleExpend({ ref, isInNode: true })
+  const [isCopied, setIsCopied] = React.useState(false)
+  const handleCopy = useCallback(() => {
+    copy(value)
+    setIsCopied(true)
+  }, [value])
+
+  const [isFocus, {
+    setTrue: setFocus,
+    setFalse: setBlur,
+  }] = useBoolean(false)
+
+  const handleInsertVariable = () => {
+    setFocus()
+    eventEmitter?.emit({ type: PROMPT_EDITOR_INSERT_QUICKLY, instanceId } as any)
+  }
+
+  const getVarType = useWorkflowVariableType()
+
+  return (
+    <Wrap className={cn(className, wrapClassName)} style={wrapStyle} isInNode isExpand={isExpand}>
+      <div ref={ref} className={cn(isFocus ? (gradientBorder && 'bg-gradient-to-r from-components-input-border-active-prompt-1 to-components-input-border-active-prompt-2') : 'bg-transparent', isExpand && 'h-full', '!rounded-[9px] p-0.5', containerClassName)}>
+        <div className={cn(isFocus ? 'bg-background-default' : 'bg-components-input-bg-normal', isExpand && 'flex h-full flex-col', 'rounded-lg', containerClassName)}>
+          <div className={cn('flex items-center justify-between pl-3 pr-2 pt-1', headerClassName)}>
+            <div className='flex gap-2'>
+              <div className={cn('text-xs font-semibold uppercase leading-4 text-text-secondary', titleClassName)}>{title} {required && <span className='text-text-destructive'>*</span>}</div>
+              {titleTooltip && <Tooltip popupContent={titleTooltip} />}
+            </div>
+            <div className='flex items-center'>
+              <div className='text-xs font-medium leading-[18px] text-text-tertiary'>{value?.length || 0}</div>
+              {isSupportPromptGenerator && (
+                <PromptGeneratorBtn className='ml-[5px]' onGenerated={onGenerated} modelConfig={modelConfig} />
+              )}
+
+              <div className='ml-2 mr-2 h-3 w-px bg-divider-regular'></div>
+              {/* Operations */}
+              <div className='flex items-center space-x-[2px]'>
+                {isSupportJinja && (
+                  <Tooltip
+                    popupContent={
+                      <div>
+                        <div>{t('workflow.common.enableJinja')}</div>
+                        <a className='text-text-accent' target='_blank' href='https://jinja.palletsprojects.com/en/2.10.x/'>{t('workflow.common.learnMore')}</a>
+                      </div>
+                    }
+                    needsDelay
+                  >
+                    <div className={cn(editionType === EditionType.jinja2 && 'border-components-button-ghost-bg-hover bg-components-button-ghost-bg-hover', 'flex h-[22px] items-center space-x-0.5 rounded-[5px] border border-transparent px-1.5 hover:border-components-button-ghost-bg-hover')}>
+                      <Jinja className='h-3 w-6 text-text-quaternary' />
+                      <Switch
+                        size='sm'
+                        defaultValue={editionType === EditionType.jinja2}
+                        onChange={(checked) => {
+                          onEditionTypeChange?.(checked ? EditionType.jinja2 : EditionType.basic)
+                        }}
+                      />
+                    </div>
+                  </Tooltip>
+
+                )}
+                {!readOnly && (
+                  <Tooltip
+                    popupContent={`${t('workflow.common.insertVarTip')}`}
+                  >
+                    <ActionButton onClick={handleInsertVariable}>
+                      <Variable02 className='h-4 w-4' />
+                    </ActionButton>
+                  </Tooltip>
+                )}
+                {showRemove && (
+                  <ActionButton onClick={onRemove}>
+                    <RiDeleteBinLine className='h-4 w-4' />
+                  </ActionButton>
+                )}
+                {!isCopied
+                  ? (
+                    <ActionButton onClick={handleCopy}>
+                      <Clipboard className='h-4 w-4' />
+                    </ActionButton>
+                  )
+                  : (
+                    <ActionButton>
+                      <ClipboardCheck className='h-4 w-4' />
+                    </ActionButton>
+                  )
+                }
+                <ToggleExpandBtn isExpand={isExpand} onExpandChange={setIsExpand} />
+              </div>
+
+            </div>
+          </div>
+
+          {/* Min: 80 Max: 560. Header: 24 */}
+          <div className={cn('pb-2', isExpand && 'flex grow flex-col')}>
+            {!(isSupportJinja && editionType === EditionType.jinja2)
+              ? (
+                <div className={cn(isExpand ? 'grow' : 'max-h-[536px]', 'relative min-h-[56px] overflow-y-auto  px-3', editorContainerClassName)}>
+                  <PromptEditor
+                    key={controlPromptEditorRerenderKey}
+                    placeholder={placeholder}
+                    placeholderClassName={placeholderClassName}
+                    instanceId={instanceId}
+                    compact
+                    className={cn('min-h-[56px]', inputClassName)}
+                    style={isExpand ? { height: editorExpandHeight - 5 } : {}}
+                    value={value}
+                    contextBlock={{
+                      show: justVar ? false : isShowContext,
+                      selectable: !hasSetBlockStatus?.context,
+                      canNotAddContext: true,
+                    }}
+                    historyBlock={{
+                      show: justVar ? false : isShowHistory,
+                      selectable: !hasSetBlockStatus?.history,
+                      history: {
+                        user: 'Human',
+                        assistant: 'Assistant',
+                      },
+                    }}
+                    queryBlock={{
+                      show: false, // use [sys.query] instead of query block
+                      selectable: false,
+                    }}
+                    workflowVariableBlock={{
+                      show: true,
+                      variables: nodesOutputVars || [],
+                      getVarType,
+                      workflowNodesMap: availableNodes.reduce((acc, node) => {
+                        acc[node.id] = {
+                          title: node.data.title,
+                          type: node.data.type,
+                        }
+                        if (node.data.type === BlockEnum.Start) {
+                          acc.sys = {
+                            title: t('workflow.blocks.start'),
+                            type: BlockEnum.Start,
+                          }
+                        }
+                        return acc
+                      }, {} as any),
+                    }}
+                    onChange={onChange}
+                    onBlur={setBlur}
+                    onFocus={setFocus}
+                    editable={!readOnly}
+                    isSupportFileVar={isSupportFileVar}
+                  />
+                  {/* to patch Editor not support dynamic change editable status */}
+                  {readOnly && <div className='absolute inset-0 z-10'></div>}
+                </div>
+              )
+              : (
+                <div className={cn(isExpand ? 'grow' : 'max-h-[536px]', 'relative min-h-[56px] overflow-y-auto  px-3', editorContainerClassName)}>
+                  <CodeEditor
+                    availableVars={nodesOutputVars || []}
+                    varList={varList}
+                    onAddVar={handleAddVariable}
+                    isInNode
+                    readOnly={readOnly}
+                    language={CodeLanguage.python3}
+                    value={value}
+                    onChange={onChange}
+                    noWrapper
+                    isExpand={isExpand}
+                    className={inputClassName}
+                  />
+                </div>
+              )}
+          </div>
+        </div>
+      </div>
+    </Wrap>
+
+  )
+}
+export default React.memo(Editor)
diff --git a/app/components/workflow/nodes/_base/components/readonly-input-with-select-var.tsx b/app/components/workflow/nodes/_base/components/readonly-input-with-select-var.tsx
new file mode 100644
index 0000000..4a4ca45
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/readonly-input-with-select-var.tsx
@@ -0,0 +1,90 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from 'classnames'
+import { useWorkflow } from '../../../hooks'
+import { BlockEnum } from '../../../types'
+import { VarBlockIcon } from '../../../block-icon'
+import { getNodeInfoById, isConversationVar, isENV, isSystemVar } from './variable/utils'
+import { Line3 } from '@/app/components/base/icons/src/public/common'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import { BubbleX, Env } from '@/app/components/base/icons/src/vender/line/others'
+import { RiMoreLine } from '@remixicon/react'
+type Props = {
+  nodeId: string
+  value: string
+  className?: string
+}
+
+const VAR_PLACEHOLDER = '@#!@#!'
+
+const ReadonlyInputWithSelectVar: FC<Props> = ({
+  nodeId,
+  value,
+  className,
+}) => {
+  const { getBeforeNodesInSameBranchIncludeParent } = useWorkflow()
+  const availableNodes = getBeforeNodesInSameBranchIncludeParent(nodeId)
+  const startNode = availableNodes.find((node: any) => {
+    return node.data.type === BlockEnum.Start
+  })
+
+  const res = (() => {
+    const vars: string[] = []
+    const strWithVarPlaceholder = value.replaceAll(/{{#([^#]*)#}}/g, (_match, p1) => {
+      vars.push(p1)
+      return VAR_PLACEHOLDER
+    })
+
+    const html: React.JSX.Element[] = strWithVarPlaceholder.split(VAR_PLACEHOLDER).map((str, index) => {
+      if (!vars[index])
+        return <span className='relative top-[-3px] leading-[16px]' key={index}>{str}</span>
+
+      const value = vars[index].split('.')
+      const isSystem = isSystemVar(value)
+      const isEnv = isENV(value)
+      const isChatVar = isConversationVar(value)
+      const node = (isSystem ? startNode : getNodeInfoById(availableNodes, value[0]))?.data
+      const varName = `${isSystem ? 'sys.' : ''}${value[value.length - 1]}`
+      const isShowAPart = value.length > 2
+
+      return (<span key={index}>
+        <span className='relative top-[-3px] leading-[16px]'>{str}</span>
+        <div className=' inline-flex h-[16px] items-center rounded-[5px] bg-components-badge-white-to-dark px-1.5'>
+          {!isEnv && !isChatVar && (
+            <div className='flex items-center'>
+              <div className='p-[1px]'>
+                <VarBlockIcon
+                  className='!text-text-primary'
+                  type={node?.type || BlockEnum.Start}
+                />
+              </div>
+              <div className='mx-0.5 max-w-[60px] truncate text-xs font-medium text-text-secondary' title={node?.title}>{node?.title}</div>
+              <Line3 className='mr-0.5'></Line3>
+            </div>
+          )}
+          {isShowAPart && (
+            <div className='flex items-center'>
+              <RiMoreLine className='h-3 w-3 text-text-secondary' />
+              <Line3 className='mr-0.5 text-divider-deep'></Line3>
+            </div>
+          )}
+          <div className='flex items-center text-text-accent'>
+            {!isEnv && !isChatVar && <Variable02 className='h-3.5 w-3.5 shrink-0' />}
+            {isEnv && <Env className='h-3.5 w-3.5 shrink-0 text-util-colors-violet-violet-600' />}
+            {isChatVar && <BubbleX className='h-3.5 w-3.5 text-util-colors-teal-teal-700' />}
+            <div className={cn('ml-0.5 max-w-[50px] truncate text-xs font-medium', (isEnv || isChatVar) && 'text-text-primary')} title={varName}>{varName}</div>
+          </div>
+        </div>
+      </span>)
+    })
+    return html
+  })()
+
+  return (
+    <div className={cn('break-all text-xs', className)}>
+      {res}
+    </div>
+  )
+}
+export default React.memo(ReadonlyInputWithSelectVar)
diff --git a/app/components/workflow/nodes/_base/components/remove-button.tsx b/app/components/workflow/nodes/_base/components/remove-button.tsx
new file mode 100644
index 0000000..62381f8
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/remove-button.tsx
@@ -0,0 +1,21 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { RiDeleteBinLine } from '@remixicon/react'
+import ActionButton from '@/app/components/base/action-button'
+
+type Props = {
+  className?: string
+  onClick: (e: React.MouseEvent) => void
+}
+
+const Remove: FC<Props> = ({
+  onClick,
+}) => {
+  return (
+    <ActionButton size='l' className='group shrink-0 hover:!bg-state-destructive-hover' onClick={onClick}>
+      <RiDeleteBinLine className='h-4 w-4 text-text-tertiary group-hover:text-text-destructive' />
+    </ActionButton>
+  )
+}
+export default React.memo(Remove)
diff --git a/app/components/workflow/nodes/_base/components/remove-effect-var-confirm.tsx b/app/components/workflow/nodes/_base/components/remove-effect-var-confirm.tsx
new file mode 100644
index 0000000..bf3fd86
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/remove-effect-var-confirm.tsx
@@ -0,0 +1,31 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import Confirm from '@/app/components/base/confirm'
+
+type Props = {
+  isShow: boolean
+  onConfirm: () => void
+  onCancel: () => void
+}
+const i18nPrefix = 'workflow.common.effectVarConfirm'
+
+const RemoveVarConfirm: FC<Props> = ({
+  isShow,
+  onConfirm,
+  onCancel,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <Confirm
+      isShow={isShow}
+      title={t(`${i18nPrefix}.title`)}
+      content={t(`${i18nPrefix}.content`)}
+      onConfirm={onConfirm}
+      onCancel={onCancel}
+    />
+  )
+}
+export default React.memo(RemoveVarConfirm)
diff --git a/app/components/workflow/nodes/_base/components/retry/hooks.ts b/app/components/workflow/nodes/_base/components/retry/hooks.ts
new file mode 100644
index 0000000..f828535
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/retry/hooks.ts
@@ -0,0 +1,41 @@
+import {
+  useCallback,
+  useState,
+} from 'react'
+import type { WorkflowRetryConfig } from './types'
+import {
+  useNodeDataUpdate,
+} from '@/app/components/workflow/hooks'
+import type { NodeTracing } from '@/types/workflow'
+
+export const useRetryConfig = (
+  id: string,
+) => {
+  const { handleNodeDataUpdateWithSyncDraft } = useNodeDataUpdate()
+
+  const handleRetryConfigChange = useCallback((value?: WorkflowRetryConfig) => {
+    handleNodeDataUpdateWithSyncDraft({
+      id,
+      data: {
+        retry_config: value,
+      },
+    })
+  }, [id, handleNodeDataUpdateWithSyncDraft])
+
+  return {
+    handleRetryConfigChange,
+  }
+}
+
+export const useRetryDetailShowInSingleRun = () => {
+  const [retryDetails, setRetryDetails] = useState<NodeTracing[] | undefined>()
+
+  const handleRetryDetailsChange = useCallback((details: NodeTracing[] | undefined) => {
+    setRetryDetails(details)
+  }, [])
+
+  return {
+    retryDetails,
+    handleRetryDetailsChange,
+  }
+}
diff --git a/app/components/workflow/nodes/_base/components/retry/retry-on-node.tsx b/app/components/workflow/nodes/_base/components/retry/retry-on-node.tsx
new file mode 100644
index 0000000..e25e116
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/retry/retry-on-node.tsx
@@ -0,0 +1,91 @@
+import { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAlertFill,
+  RiCheckboxCircleFill,
+  RiLoader2Line,
+} from '@remixicon/react'
+import type { Node } from '@/app/components/workflow/types'
+import { NodeRunningStatus } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+
+type RetryOnNodeProps = Pick<Node, 'id' | 'data'>
+const RetryOnNode = ({
+  data,
+}: RetryOnNodeProps) => {
+  const { t } = useTranslation()
+  const { retry_config } = data
+  const showSelectedBorder = data.selected || data._isBundled || data._isEntering
+  const {
+    isRunning,
+    isSuccessful,
+    isException,
+    isFailed,
+  } = useMemo(() => {
+    return {
+      isRunning: data._runningStatus === NodeRunningStatus.Running && !showSelectedBorder,
+      isSuccessful: data._runningStatus === NodeRunningStatus.Succeeded && !showSelectedBorder,
+      isFailed: data._runningStatus === NodeRunningStatus.Failed && !showSelectedBorder,
+      isException: data._runningStatus === NodeRunningStatus.Exception && !showSelectedBorder,
+    }
+  }, [data._runningStatus, showSelectedBorder])
+  const showDefault = !isRunning && !isSuccessful && !isException && !isFailed
+
+  if (!retry_config?.retry_enabled)
+    return null
+
+  if (!showDefault && !data._retryIndex)
+    return null
+
+  return (
+    <div className='mb-1 px-3'>
+      <div className={cn(
+        'system-xs-medium-uppercase flex items-center justify-between rounded-md border-[0.5px] border-transparent bg-workflow-block-parma-bg px-[5px] py-1 text-text-tertiary',
+        isRunning && 'border-state-accent-active bg-state-accent-hover text-text-accent',
+        isSuccessful && 'border-state-success-active bg-state-success-hover text-text-success',
+        (isException || isFailed) && 'border-state-warning-active bg-state-warning-hover text-text-warning',
+      )}>
+        <div className='flex items-center'>
+          {
+            showDefault && (
+              t('workflow.nodes.common.retry.retryTimes', { times: retry_config.max_retries })
+            )
+          }
+          {
+            isRunning && (
+              <>
+                <RiLoader2Line className='mr-1 h-3.5 w-3.5 animate-spin' />
+                {t('workflow.nodes.common.retry.retrying')}
+              </>
+            )
+          }
+          {
+            isSuccessful && (
+              <>
+                <RiCheckboxCircleFill className='mr-1 h-3.5 w-3.5' />
+                {t('workflow.nodes.common.retry.retrySuccessful')}
+              </>
+            )
+          }
+          {
+            (isFailed || isException) && (
+              <>
+                <RiAlertFill className='mr-1 h-3.5 w-3.5' />
+                {t('workflow.nodes.common.retry.retryFailed')}
+              </>
+            )
+          }
+        </div>
+        {
+          !showDefault && !!data._retryIndex && (
+            <div>
+              {data._retryIndex}/{data.retry_config?.max_retries}
+            </div>
+          )
+        }
+      </div>
+    </div>
+  )
+}
+
+export default RetryOnNode
diff --git a/app/components/workflow/nodes/_base/components/retry/retry-on-panel.tsx b/app/components/workflow/nodes/_base/components/retry/retry-on-panel.tsx
new file mode 100644
index 0000000..0e5b807
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/retry/retry-on-panel.tsx
@@ -0,0 +1,117 @@
+import { useTranslation } from 'react-i18next'
+import { useRetryConfig } from './hooks'
+import s from './style.module.css'
+import Switch from '@/app/components/base/switch'
+import Slider from '@/app/components/base/slider'
+import Input from '@/app/components/base/input'
+import type {
+  Node,
+} from '@/app/components/workflow/types'
+import Split from '@/app/components/workflow/nodes/_base/components/split'
+
+type RetryOnPanelProps = Pick<Node, 'id' | 'data'>
+const RetryOnPanel = ({
+  id,
+  data,
+}: RetryOnPanelProps) => {
+  const { t } = useTranslation()
+  const { handleRetryConfigChange } = useRetryConfig(id)
+  const { retry_config } = data
+
+  const handleRetryEnabledChange = (value: boolean) => {
+    handleRetryConfigChange({
+      retry_enabled: value,
+      max_retries: retry_config?.max_retries || 3,
+      retry_interval: retry_config?.retry_interval || 1000,
+    })
+  }
+
+  const handleMaxRetriesChange = (value: number) => {
+    if (value > 10)
+      value = 10
+    else if (value < 1)
+      value = 1
+    handleRetryConfigChange({
+      retry_enabled: true,
+      max_retries: value,
+      retry_interval: retry_config?.retry_interval || 1000,
+    })
+  }
+
+  const handleRetryIntervalChange = (value: number) => {
+    if (value > 5000)
+      value = 5000
+    else if (value < 100)
+      value = 100
+    handleRetryConfigChange({
+      retry_enabled: true,
+      max_retries: retry_config?.max_retries || 3,
+      retry_interval: value,
+    })
+  }
+
+  return (
+    <>
+      <div className='pt-2'>
+        <div className='flex h-10 items-center justify-between px-4 py-2'>
+          <div className='flex items-center'>
+            <div className='system-sm-semibold-uppercase mr-0.5 text-text-secondary'>{t('workflow.nodes.common.retry.retryOnFailure')}</div>
+          </div>
+          <Switch
+            defaultValue={retry_config?.retry_enabled}
+            onChange={v => handleRetryEnabledChange(v)}
+          />
+        </div>
+        {
+          retry_config?.retry_enabled && (
+            <div className='px-4 pb-2'>
+              <div className='mb-1 flex w-full items-center'>
+                <div className='system-xs-medium-uppercase mr-2 grow text-text-secondary'>{t('workflow.nodes.common.retry.maxRetries')}</div>
+                <Slider
+                  className='mr-3 w-[108px]'
+                  value={retry_config?.max_retries || 3}
+                  onChange={handleMaxRetriesChange}
+                  min={1}
+                  max={10}
+                />
+                <Input
+                  type='number'
+                  wrapperClassName='w-[80px]'
+                  value={retry_config?.max_retries || 3}
+                  onChange={e => handleMaxRetriesChange(e.target.value as any)}
+                  min={1}
+                  max={10}
+                  unit={t('workflow.nodes.common.retry.times') || ''}
+                  className={s.input}
+                />
+              </div>
+              <div className='flex items-center'>
+                <div className='system-xs-medium-uppercase mr-2 grow text-text-secondary'>{t('workflow.nodes.common.retry.retryInterval')}</div>
+                <Slider
+                  className='mr-3 w-[108px]'
+                  value={retry_config?.retry_interval || 1000}
+                  onChange={handleRetryIntervalChange}
+                  min={100}
+                  max={5000}
+                />
+                <Input
+                  type='number'
+                  wrapperClassName='w-[80px]'
+                  value={retry_config?.retry_interval || 1000}
+                  onChange={e => handleRetryIntervalChange(e.target.value as any)}
+                  min={100}
+                  max={5000}
+                  unit={t('workflow.nodes.common.retry.ms') || ''}
+                  className={s.input}
+                />
+              </div>
+            </div>
+          )
+        }
+      </div>
+      <Split className='mx-4 mt-2' />
+    </>
+  )
+}
+
+export default RetryOnPanel
diff --git a/app/components/workflow/nodes/_base/components/retry/style.module.css b/app/components/workflow/nodes/_base/components/retry/style.module.css
new file mode 100644
index 0000000..2ce4e7b
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/retry/style.module.css
@@ -0,0 +1,5 @@
+.input::-webkit-inner-spin-button,
+.input::-webkit-outer-spin-button {
+  -webkit-appearance: none;
+  margin: 0;
+}
diff --git a/app/components/workflow/nodes/_base/components/retry/types.ts b/app/components/workflow/nodes/_base/components/retry/types.ts
new file mode 100644
index 0000000..bb5f593
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/retry/types.ts
@@ -0,0 +1,5 @@
+export type WorkflowRetryConfig = {
+  max_retries: number
+  retry_interval: number
+  retry_enabled: boolean
+}
diff --git a/app/components/workflow/nodes/_base/components/retry/utils.ts b/app/components/workflow/nodes/_base/components/retry/utils.ts
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/retry/utils.ts
diff --git a/app/components/workflow/nodes/_base/components/selector.tsx b/app/components/workflow/nodes/_base/components/selector.tsx
new file mode 100644
index 0000000..b14741f
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/selector.tsx
@@ -0,0 +1,96 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useBoolean, useClickAway } from 'ahooks'
+import cn from '@/utils/classnames'
+import { ChevronSelectorVertical } from '@/app/components/base/icons/src/vender/line/arrows'
+import { Check } from '@/app/components/base/icons/src/vender/line/general'
+type Item = {
+  value: string
+  label: string
+}
+type Props = {
+  className?: string
+  trigger?: React.JSX.Element
+  DropDownIcon?: any
+  noLeft?: boolean
+  options: Item[]
+  allOptions?: Item[]
+  value: string
+  placeholder?: string
+  onChange: (value: any) => void
+  uppercase?: boolean
+  popupClassName?: string
+  triggerClassName?: string
+  itemClassName?: string
+  readonly?: boolean
+  showChecked?: boolean
+}
+
+const TypeSelector: FC<Props> = ({
+  className,
+  trigger,
+  DropDownIcon = ChevronSelectorVertical,
+  noLeft,
+  options: list,
+  allOptions,
+  value,
+  placeholder = '',
+  onChange,
+  uppercase,
+  triggerClassName,
+  popupClassName,
+  itemClassName,
+  readonly,
+  showChecked,
+}) => {
+  const noValue = value === '' || value === undefined || value === null
+  const item = allOptions ? allOptions.find(item => item.value === value) : list.find(item => item.value === value)
+  const [showOption, { setFalse: setHide, toggle: toggleShow }] = useBoolean(false)
+  const ref = React.useRef(null)
+  useClickAway(() => {
+    setHide()
+  }, ref)
+  return (
+    <div className={cn(!trigger && !noLeft && 'left-[-8px]', 'relative select-none', className)} ref={ref}>
+      {trigger
+        ? (
+          <div
+            onClick={toggleShow}
+            className={cn(!readonly && 'cursor-pointer')}
+          >
+            {trigger}
+          </div>
+        )
+        : (
+          <div
+            onClick={toggleShow}
+            className={cn(showOption && 'bg-state-base-hover', 'flex h-5 cursor-pointer items-center rounded-md pl-1 pr-0.5 text-xs font-semibold text-text-secondary hover:bg-state-base-hover')}>
+            <div className={cn('text-sm font-semibold', uppercase && 'uppercase', noValue && 'text-text-tertiary', triggerClassName)}>{!noValue ? item?.label : placeholder}</div>
+            {!readonly && <DropDownIcon className='h-3 w-3 ' />}
+          </div>
+        )}
+
+      {(showOption && !readonly) && (
+        <div className={cn('absolute top-[24px] z-10 w-[120px]  select-none rounded-lg border border-components-panel-border bg-components-panel-bg p-1 shadow-lg', popupClassName)}>
+          {list.map(item => (
+            <div
+              key={item.value}
+              onClick={() => {
+                setHide()
+                onChange(item.value)
+              }}
+              className={cn(itemClassName, uppercase && 'uppercase', 'flex h-[30px] min-w-[44px] cursor-pointer items-center justify-between rounded-lg px-3 text-[13px] font-medium text-text-secondary hover:bg-state-base-hover')}
+            >
+              <div>{item.label}</div>
+              {showChecked && item.value === value && <Check className='h-4 w-4 text-text-primary' />}
+            </div>
+          ))
+          }
+        </div>
+      )
+      }
+    </div>
+  )
+}
+export default React.memo(TypeSelector)
diff --git a/app/components/workflow/nodes/_base/components/setting-item.tsx b/app/components/workflow/nodes/_base/components/setting-item.tsx
new file mode 100644
index 0000000..134bf4a
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/setting-item.tsx
@@ -0,0 +1,28 @@
+import Tooltip from '@/app/components/base/tooltip'
+import Indicator from '@/app/components/header/indicator'
+import classNames from '@/utils/classnames'
+import { type ComponentProps, type PropsWithChildren, type ReactNode, memo } from 'react'
+
+export type SettingItemProps = PropsWithChildren<{
+  label: string
+  status?: 'error' | 'warning'
+  tooltip?: ReactNode
+}>
+
+export const SettingItem = memo(({ label, children, status, tooltip }: SettingItemProps) => {
+  const indicator: ComponentProps<typeof Indicator>['color'] = status === 'error' ? 'red' : status === 'warning' ? 'yellow' : undefined
+  const needTooltip = ['error', 'warning'].includes(status as any)
+  return <div className='relative flex items-center justify-between space-x-1 rounded-md bg-workflow-block-parma-bg px-1.5 py-1 text-xs font-normal'>
+    <div className={classNames('shrink-0 truncate text-text-tertiary system-xs-medium-uppercase', !!children && 'max-w-[100px]')}>
+      {label}
+    </div>
+    <Tooltip popupContent={tooltip} disabled={!needTooltip}>
+      <div className='system-xs-medium truncate text-right text-text-secondary'>
+        {children}
+      </div>
+    </Tooltip>
+    {indicator && <Indicator color={indicator} className='absolute -right-0.5 -top-0.5' />}
+  </div>
+})
+
+SettingItem.displayName = 'SettingItem'
diff --git a/app/components/workflow/nodes/_base/components/split.tsx b/app/components/workflow/nodes/_base/components/split.tsx
new file mode 100644
index 0000000..28cd05f
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/split.tsx
@@ -0,0 +1,18 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+
+type Props = {
+  className?: string
+}
+
+const Split: FC<Props> = ({
+  className,
+}) => {
+  return (
+    <div className={cn(className, 'h-[0.5px] bg-divider-subtle')}>
+    </div>
+  )
+}
+export default React.memo(Split)
diff --git a/app/components/workflow/nodes/_base/components/support-var-input/index.tsx b/app/components/workflow/nodes/_base/components/support-var-input/index.tsx
new file mode 100644
index 0000000..6999a97
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/support-var-input/index.tsx
@@ -0,0 +1,52 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+import { varHighlightHTML } from '@/app/components/app/configuration/base/var-highlight'
+type Props = {
+  isFocus?: boolean
+  onFocus?: () => void
+  value: string
+  children?: React.ReactNode
+  wrapClassName?: string
+  textClassName?: string
+  readonly?: boolean
+}
+
+const SupportVarInput: FC<Props> = ({
+  isFocus,
+  onFocus,
+  children,
+  value,
+  wrapClassName,
+  textClassName,
+  readonly,
+}) => {
+  const withHightContent = (value || '')
+    .replace(/</g, '&lt;')
+    .replace(/>/g, '&gt;')
+    .replace(/\{\{([^}]+)\}\}/g, varHighlightHTML({ name: '$1', className: '!mb-0' })) // `<span class="${highLightClassName}">{{$1}}</span>`
+    .replace(/\n/g, '<br />')
+
+  return (
+    <div
+      className={
+        cn(wrapClassName, 'flex h-full w-full')
+      } onClick={onFocus}
+    >
+      {(isFocus && !readonly && children)
+        ? (
+          children
+        )
+        : (
+          <div
+            className={cn(textClassName, 'h-full w-0 grow truncate whitespace-nowrap')}
+            title={value}
+            dangerouslySetInnerHTML={{
+              __html: withHightContent,
+            }}></div>
+        )}
+    </div>
+  )
+}
+export default React.memo(SupportVarInput)
diff --git a/app/components/workflow/nodes/_base/components/switch-plugin-version.tsx b/app/components/workflow/nodes/_base/components/switch-plugin-version.tsx
new file mode 100644
index 0000000..ceb38fb
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/switch-plugin-version.tsx
@@ -0,0 +1,126 @@
+'use client'
+
+import Badge from '@/app/components/base/badge'
+import Tooltip from '@/app/components/base/tooltip'
+import PluginVersionPicker from '@/app/components/plugins/update-plugin/plugin-version-picker'
+import { RiArrowLeftRightLine, RiExternalLinkLine } from '@remixicon/react'
+import type { ReactNode } from 'react'
+import { type FC, useCallback, useState } from 'react'
+import { useBoolean } from 'ahooks'
+import { useCheckInstalled, useUpdatePackageFromMarketPlace } from '@/service/use-plugins'
+import cn from '@/utils/classnames'
+import PluginMutationModel from '@/app/components/plugins/plugin-mutation-model'
+import useGetIcon from '@/app/components/plugins/install-plugin/base/use-get-icon'
+import { pluginManifestToCardPluginProps } from '@/app/components/plugins/install-plugin/utils'
+import { Badge as Badge2, BadgeState } from '@/app/components/base/badge/index'
+import Link from 'next/link'
+import { useTranslation } from 'react-i18next'
+import { marketplaceUrlPrefix } from '@/config'
+
+export type SwitchPluginVersionProps = {
+  uniqueIdentifier: string
+  tooltip?: ReactNode
+  onChange?: (version: string) => void
+  className?: string
+}
+
+export const SwitchPluginVersion: FC<SwitchPluginVersionProps> = (props) => {
+  const { uniqueIdentifier, tooltip, onChange, className } = props
+  const [pluginId] = uniqueIdentifier.split(':')
+  const [isShow, setIsShow] = useState(false)
+  const [isShowUpdateModal, { setTrue: showUpdateModal, setFalse: hideUpdateModal }] = useBoolean(false)
+  const [target, setTarget] = useState<{
+    version: string,
+    pluginUniqueIden: string;
+  }>()
+  const pluginDetails = useCheckInstalled({
+    pluginIds: [pluginId],
+    enabled: true,
+  })
+  const pluginDetail = pluginDetails.data?.plugins.at(0)
+
+  const handleUpdatedFromMarketplace = useCallback(() => {
+    hideUpdateModal()
+    pluginDetails.refetch()
+    onChange?.(target!.version)
+  }, [hideUpdateModal, onChange, pluginDetails, target])
+  const { getIconUrl } = useGetIcon()
+  const icon = pluginDetail?.declaration.icon ? getIconUrl(pluginDetail.declaration.icon) : undefined
+  const mutation = useUpdatePackageFromMarketPlace()
+  const install = () => {
+    mutation.mutate(
+      {
+        new_plugin_unique_identifier: target!.pluginUniqueIden,
+        original_plugin_unique_identifier: uniqueIdentifier,
+      },
+      {
+        onSuccess() {
+          handleUpdatedFromMarketplace()
+        },
+      })
+  }
+  const { t } = useTranslation()
+  return <Tooltip popupContent={!isShow && !isShowUpdateModal && tooltip} triggerMethod='hover'>
+    <div className={cn('flex w-fit items-center justify-center', className)} onClick={e => e.stopPropagation()}>
+      {isShowUpdateModal && pluginDetail && <PluginMutationModel
+        onCancel={hideUpdateModal}
+        plugin={pluginManifestToCardPluginProps({
+          ...pluginDetail.declaration,
+          icon: icon!,
+        })}
+        mutation={mutation}
+        mutate={install}
+        confirmButtonText={t('workflow.nodes.agent.installPlugin.install')}
+        cancelButtonText={t('workflow.nodes.agent.installPlugin.cancel')}
+        modelTitle={t('workflow.nodes.agent.installPlugin.title')}
+        description={t('workflow.nodes.agent.installPlugin.desc')}
+        cardTitleLeft={<>
+          <Badge2 className='mx-1' size="s" state={BadgeState.Warning}>
+            {`${pluginDetail.version} -> ${target!.version}`}
+          </Badge2>
+        </>}
+        modalBottomLeft={
+          <Link
+            className='flex items-center justify-center gap-1'
+            href={`${marketplaceUrlPrefix}/plugins/${pluginDetail.declaration.author}/${pluginDetail.declaration.name}`}
+            target='_blank'
+          >
+            <span className='system-xs-regular text-xs text-text-accent'>
+              {t('workflow.nodes.agent.installPlugin.changelog')}
+            </span>
+            <RiExternalLinkLine className='size-3 text-text-accent' />
+          </Link>
+        }
+      />}
+      {pluginDetail && <PluginVersionPicker
+        isShow={isShow}
+        onShowChange={setIsShow}
+        pluginID={pluginId}
+        currentVersion={pluginDetail.version}
+        onSelect={(state) => {
+          setTarget({
+            pluginUniqueIden: state.unique_identifier,
+            version: state.version,
+          })
+          showUpdateModal()
+        }}
+        trigger={
+          <Badge
+            className={cn(
+              'mx-1 flex hover:bg-state-base-hover',
+              isShow && 'bg-state-base-hover',
+            )}
+            uppercase={true}
+            text={
+              <>
+                <div>{pluginDetail.version}</div>
+                <RiArrowLeftRightLine className='ml-1 h-3 w-3 text-text-tertiary' />
+              </>
+            }
+            hasRedCornerMark={true}
+          />
+        }
+      />}
+    </div>
+  </Tooltip>
+}
diff --git a/app/components/workflow/nodes/_base/components/title-description-input.tsx b/app/components/workflow/nodes/_base/components/title-description-input.tsx
new file mode 100644
index 0000000..062190a
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/title-description-input.tsx
@@ -0,0 +1,87 @@
+import {
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import Textarea from 'react-textarea-autosize'
+import { useTranslation } from 'react-i18next'
+
+type TitleInputProps = {
+  value: string
+  onBlur: (value: string) => void
+}
+
+export const TitleInput = memo(({
+  value,
+  onBlur,
+}: TitleInputProps) => {
+  const { t } = useTranslation()
+  const [localValue, setLocalValue] = useState(value)
+
+  const handleBlur = () => {
+    if (!localValue) {
+      setLocalValue(value)
+      onBlur(value)
+      return
+    }
+
+    onBlur(localValue)
+  }
+
+  return (
+    <input
+      value={localValue}
+      onChange={e => setLocalValue(e.target.value)}
+      className={`
+        system-xl-semibold mr-2 h-7 min-w-0 grow appearance-none rounded-md border border-transparent bg-transparent px-1 text-text-primary
+        outline-none focus:shadow-xs
+      `}
+      placeholder={t('workflow.common.addTitle') || ''}
+      onBlur={handleBlur}
+    />
+  )
+})
+TitleInput.displayName = 'TitleInput'
+
+type DescriptionInputProps = {
+  value: string
+  onChange: (value: string) => void
+}
+export const DescriptionInput = memo(({
+  value,
+  onChange,
+}: DescriptionInputProps) => {
+  const { t } = useTranslation()
+  const [focus, setFocus] = useState(false)
+  const handleFocus = useCallback(() => {
+    setFocus(true)
+  }, [])
+  const handleBlur = useCallback(() => {
+    setFocus(false)
+  }, [])
+
+  return (
+    <div
+      className={`
+        leading-0 group flex max-h-[60px] overflow-y-auto rounded-lg bg-components-panel-bg
+        px-2 py-[5px]
+        ${focus && '!shadow-xs'}
+      `}
+    >
+      <Textarea
+        value={value}
+        onChange={e => onChange(e.target.value)}
+        minRows={1}
+        onFocus={handleFocus}
+        onBlur={handleBlur}
+        className={`
+          w-full resize-none appearance-none bg-transparent text-xs
+          leading-[18px] text-text-primary caret-[#295EFF]
+          outline-none placeholder:text-text-quaternary
+        `}
+        placeholder={t('workflow.common.addDescription') || ''}
+      />
+    </div>
+  )
+})
+DescriptionInput.displayName = 'DescriptionInput'
diff --git a/app/components/workflow/nodes/_base/components/toggle-expand-btn.tsx b/app/components/workflow/nodes/_base/components/toggle-expand-btn.tsx
new file mode 100644
index 0000000..f597b24
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/toggle-expand-btn.tsx
@@ -0,0 +1,30 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import {
+  RiCollapseDiagonalLine,
+  RiExpandDiagonalLine,
+} from '@remixicon/react'
+import ActionButton from '@/app/components/base/action-button'
+
+type Props = {
+  isExpand: boolean
+  onExpandChange: (isExpand: boolean) => void
+}
+
+const ExpandBtn: FC<Props> = ({
+  isExpand,
+  onExpandChange,
+}) => {
+  const handleToggle = useCallback(() => {
+    onExpandChange(!isExpand)
+  }, [isExpand])
+
+  const Icon = isExpand ? RiCollapseDiagonalLine : RiExpandDiagonalLine
+  return (
+    <ActionButton onClick={handleToggle}>
+      <Icon className='h-4 w-4' />
+    </ActionButton>
+  )
+}
+export default React.memo(ExpandBtn)
diff --git a/app/components/workflow/nodes/_base/components/variable-tag.tsx b/app/components/workflow/nodes/_base/components/variable-tag.tsx
new file mode 100644
index 0000000..83b0771
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable-tag.tsx
@@ -0,0 +1,94 @@
+import { useMemo } from 'react'
+import { useNodes } from 'reactflow'
+import { capitalize } from 'lodash-es'
+import { useTranslation } from 'react-i18next'
+import { RiErrorWarningFill } from '@remixicon/react'
+import { VarBlockIcon } from '@/app/components/workflow/block-icon'
+import type {
+  CommonNodeType,
+  Node,
+  ValueSelector,
+  VarType,
+} from '@/app/components/workflow/types'
+import { BlockEnum } from '@/app/components/workflow/types'
+import { Line3 } from '@/app/components/base/icons/src/public/common'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import { BubbleX, Env } from '@/app/components/base/icons/src/vender/line/others'
+import { getNodeInfoById, isConversationVar, isENV, isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+import Tooltip from '@/app/components/base/tooltip'
+import cn from '@/utils/classnames'
+import { isExceptionVariable } from '@/app/components/workflow/utils'
+
+type VariableTagProps = {
+  valueSelector: ValueSelector
+  varType: VarType
+  isShort?: boolean
+  availableNodes?: Node[]
+}
+const VariableTag = ({
+  valueSelector,
+  varType,
+  isShort,
+  availableNodes,
+}: VariableTagProps) => {
+  const nodes = useNodes<CommonNodeType>()
+  const node = useMemo(() => {
+    if (isSystemVar(valueSelector)) {
+      const startNode = availableNodes?.find(n => n.data.type === BlockEnum.Start)
+      if (startNode)
+        return startNode
+    }
+    return getNodeInfoById(availableNodes || nodes, valueSelector[0])
+  }, [nodes, valueSelector, availableNodes])
+
+  const isEnv = isENV(valueSelector)
+  const isChatVar = isConversationVar(valueSelector)
+  const isValid = Boolean(node) || isEnv || isChatVar
+
+  const variableName = isSystemVar(valueSelector) ? valueSelector.slice(0).join('.') : valueSelector.slice(1).join('.')
+  const isException = isExceptionVariable(variableName, node?.data.type)
+
+  const { t } = useTranslation()
+  return (
+    <Tooltip popupContent={!isValid && t('workflow.errorMsg.invalidVariable')}>
+      <div className={cn('border-[rgba(16, 2440,0.08)] inline-flex h-6 max-w-full items-center rounded-md border-[0.5px] border-divider-subtle bg-components-badge-white-to-dark px-1.5 text-xs shadow-xs',
+        !isValid && 'border-red-400 !bg-[#FEF3F2]',
+      )}>
+        {(!isEnv && !isChatVar && <>
+          {node && (
+            <>
+              <VarBlockIcon
+                type={node.data.type || BlockEnum.Start}
+                className='mr-0.5 !text-text-primary'
+              />
+              <div
+                className='max-w-[60px] truncate font-medium text-text-secondary'
+                title={node?.data.title}
+              >
+                {node?.data.title}
+              </div>
+            </>
+          )}
+          <Line3 className='mx-0.5 shrink-0' />
+          <Variable02 className={cn('mr-0.5 h-3.5 w-3.5 shrink-0 text-text-accent', isException && 'text-text-warning')} />
+        </>)}
+        {isEnv && <Env className='mr-0.5 h-3.5 w-3.5 shrink-0 text-util-colors-violet-violet-600' />}
+        {isChatVar && <BubbleX className='h-3.5 w-3.5 text-util-colors-teal-teal-700' />}
+        <div
+          className={cn('ml-0.5 truncate font-medium text-text-accent', (isEnv || isChatVar) && 'text-text-secondary', isException && 'text-text-warning')}
+          title={variableName}
+        >
+          {variableName}
+        </div>
+        {
+          !isShort && varType && (
+            <div className='ml-0.5 shrink-0 text-text-tertiary'>{capitalize(varType)}</div>
+          )
+        }
+        {!isValid && <RiErrorWarningFill className='ml-0.5 h-3 w-3 text-[#D92D20]' />}
+      </div>
+    </Tooltip>
+  )
+}
+
+export default VariableTag
diff --git a/app/components/workflow/nodes/_base/components/variable/assigned-var-reference-popup.tsx b/app/components/workflow/nodes/_base/components/variable/assigned-var-reference-popup.tsx
new file mode 100644
index 0000000..0e086fa
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/assigned-var-reference-popup.tsx
@@ -0,0 +1,39 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import VarReferenceVars from './var-reference-vars'
+import type { NodeOutPutVar, ValueSelector, Var } from '@/app/components/workflow/types'
+import ListEmpty from '@/app/components/base/list-empty'
+
+type Props = {
+  vars: NodeOutPutVar[]
+  onChange: (value: ValueSelector, varDetail: Var) => void
+  itemWidth?: number
+}
+const AssignedVarReferencePopup: FC<Props> = ({
+  vars,
+  onChange,
+  itemWidth,
+}) => {
+  const { t } = useTranslation()
+  // max-h-[300px] overflow-y-auto todo: use portal to handle long list
+  return (
+    <div className='bg-components-panel-bg-bur w-[352px] rounded-lg border-[0.5px] border-components-panel-border p-1 shadow-lg' >
+      {(!vars || vars.length === 0)
+        ? <ListEmpty
+          title={t('workflow.nodes.assigner.noAssignedVars') || ''}
+          description={t('workflow.nodes.assigner.assignedVarsDescription')}
+        />
+        : <VarReferenceVars
+          searchBoxClassName='mt-1'
+          vars={vars}
+          onChange={onChange}
+          itemWidth={itemWidth}
+          isSupportFileVar
+        />
+      }
+    </div >
+  )
+}
+export default React.memo(AssignedVarReferencePopup)
diff --git a/app/components/workflow/nodes/_base/components/variable/constant-field.tsx b/app/components/workflow/nodes/_base/components/variable/constant-field.tsx
new file mode 100644
index 0000000..52d2675
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/constant-field.tsx
@@ -0,0 +1,65 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import type { CredentialFormSchema, CredentialFormSchemaNumberInput, CredentialFormSchemaSelect } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types'
+import type { Var } from '@/app/components/workflow/types'
+import { SimpleSelect } from '@/app/components/base/select'
+
+type Props = {
+  schema: Partial<CredentialFormSchema>
+  readonly: boolean
+  value: string
+  onChange: (value: string | number, varKindType: VarKindType, varInfo?: Var) => void
+}
+
+const DEFAULT_SCHEMA = {} as CredentialFormSchema
+
+const ConstantField: FC<Props> = ({
+  schema = DEFAULT_SCHEMA,
+  readonly,
+  value,
+  onChange,
+}) => {
+  const language = useLanguage()
+  const placeholder = (schema as CredentialFormSchemaSelect).placeholder
+  const handleStaticChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
+    const value = e.target.value === '' ? '' : Number.parseFloat(e.target.value)
+    onChange(value, VarKindType.constant)
+  }, [onChange])
+  const handleSelectChange = useCallback((value: string | number) => {
+    value = value === null ? '' : value
+    onChange(value as string, VarKindType.constant)
+  }, [onChange])
+
+  return (
+    <>
+      {schema.type === FormTypeEnum.select && (
+        <SimpleSelect
+          wrapperClassName='w-full !h-8'
+          className='flex items-center'
+          disabled={readonly}
+          defaultValue={value}
+          items={(schema as CredentialFormSchemaSelect).options.map(option => ({ value: option.value, name: option.label[language] || option.label.en_US }))}
+          onSelect={item => handleSelectChange(item.value)}
+          placeholder={placeholder?.[language] || placeholder?.en_US}
+        />
+      )}
+      {schema.type === FormTypeEnum.textNumber && (
+        <input
+          type='number'
+          className='h-8 w-full overflow-hidden rounded-lg bg-gray-100 p-2 text-[13px] font-normal leading-8 text-gray-900 placeholder:text-gray-400 focus:outline-none'
+          value={value}
+          onChange={handleStaticChange}
+          readOnly={readonly}
+          placeholder={placeholder?.[language] || placeholder?.en_US}
+          min={(schema as CredentialFormSchemaNumberInput).min}
+          max={(schema as CredentialFormSchemaNumberInput).max}
+        />
+      )}
+    </>
+  )
+}
+export default React.memo(ConstantField)
diff --git a/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/picker/field.tsx b/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/picker/field.tsx
new file mode 100644
index 0000000..f90f30e
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/picker/field.tsx
@@ -0,0 +1,77 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { Type } from '../../../../../llm/types'
+import { getFieldType } from '../../../../../llm/utils'
+import type { Field as FieldType } from '../../../../../llm/types'
+import cn from '@/utils/classnames'
+import TreeIndentLine from '../tree-indent-line'
+import { RiMoreFill } from '@remixicon/react'
+import Tooltip from '@/app/components/base/tooltip'
+import type { ValueSelector } from '@/app/components/workflow/types'
+import { useTranslation } from 'react-i18next'
+
+const MAX_DEPTH = 10
+
+type Props = {
+  valueSelector: ValueSelector
+  name: string,
+  payload: FieldType,
+  depth?: number
+  readonly?: boolean
+  onSelect?: (valueSelector: ValueSelector) => void
+}
+
+const Field: FC<Props> = ({
+  valueSelector,
+  name,
+  payload,
+  depth = 1,
+  readonly,
+  onSelect,
+}) => {
+  const { t } = useTranslation()
+  const isLastFieldHighlight = readonly
+  const hasChildren = payload.type === Type.object && payload.properties
+  const isHighlight = isLastFieldHighlight && !hasChildren
+  if (depth > MAX_DEPTH + 1)
+    return null
+  return (
+    <div>
+      <Tooltip popupContent={t('app.structOutput.moreFillTip')} disabled={depth !== MAX_DEPTH + 1}>
+        <div
+          className={cn('flex items-center justify-between rounded-md pr-2', !readonly && 'hover:bg-state-base-hover', depth !== MAX_DEPTH + 1 && 'cursor-pointer')}
+          onClick={() => !readonly && onSelect?.([...valueSelector, name])}
+        >
+          <div className='flex grow items-stretch'>
+            <TreeIndentLine depth={depth} />
+            {depth === MAX_DEPTH + 1 ? (
+              <RiMoreFill className='h-3 w-3 text-text-tertiary' />
+            ) : (<div className={cn('system-sm-medium h-6 w-0 grow truncate leading-6 text-text-secondary', isHighlight && 'text-text-accent')}>{name}</div>)}
+
+          </div>
+          {depth < MAX_DEPTH + 1 && (
+            <div className='system-xs-regular ml-2 shrink-0 text-text-tertiary'>{getFieldType(payload)}</div>
+          )}
+        </div>
+      </Tooltip>
+
+      {depth <= MAX_DEPTH && payload.type === Type.object && payload.properties && (
+        <div>
+          {Object.keys(payload.properties).map(propName => (
+            <Field
+              key={propName}
+              name={propName}
+              payload={payload.properties?.[propName] as FieldType}
+              depth={depth + 1}
+              readonly={readonly}
+              valueSelector={[...valueSelector, name]}
+              onSelect={onSelect}
+            />
+          ))}
+        </div>
+      )}
+    </div>
+  )
+}
+export default React.memo(Field)
diff --git a/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/picker/index.tsx b/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/picker/index.tsx
new file mode 100644
index 0000000..302ed3c
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/picker/index.tsx
@@ -0,0 +1,82 @@
+'use client'
+import type { FC } from 'react'
+import React, { useRef } from 'react'
+import type { StructuredOutput } from '../../../../../llm/types'
+import Field from './field'
+import cn from '@/utils/classnames'
+import { useHover } from 'ahooks'
+import type { ValueSelector } from '@/app/components/workflow/types'
+
+type Props = {
+  className?: string
+  root: { nodeId?: string, nodeName?: string, attrName: string }
+  payload: StructuredOutput
+  readonly?: boolean
+  onSelect?: (valueSelector: ValueSelector) => void
+  onHovering?: (value: boolean) => void
+}
+
+export const PickerPanelMain: FC<Props> = ({
+  className,
+  root,
+  payload,
+  readonly,
+  onHovering,
+  onSelect,
+}) => {
+  const ref = useRef<HTMLDivElement>(null)
+  useHover(ref, {
+    onChange: (hovering) => {
+      if (hovering) {
+        onHovering?.(true)
+      }
+      else {
+        setTimeout(() => {
+          onHovering?.(false)
+        }, 100)
+      }
+    },
+  })
+  const schema = payload.schema
+  const fieldNames = Object.keys(schema.properties)
+  return (
+    <div className={cn(className)} ref={ref}>
+      {/* Root info */}
+      <div className='flex items-center justify-between px-2 py-1'>
+        <div className='flex'>
+          {root.nodeName && (
+            <>
+              <div className='system-sm-medium max-w-[100px] truncate text-text-tertiary'>{root.nodeName}</div>
+              <div className='system-sm-medium text-text-tertiary'>.</div>
+            </>
+          )}
+          <div className='system-sm-medium text-text-secondary'>{root.attrName}</div>
+        </div>
+        {/* It must be object */}
+        <div className='system-xs-regular ml-2 shrink-0 text-text-tertiary'>object</div>
+      </div>
+      {fieldNames.map(name => (
+        <Field
+          key={name}
+          name={name}
+          payload={schema.properties[name]}
+          readonly={readonly}
+          valueSelector={[root.nodeId!, root.attrName]}
+          onSelect={onSelect}
+        />
+      ))}
+    </div>
+  )
+}
+
+const PickerPanel: FC<Props> = ({
+  className,
+  ...props
+}) => {
+  return (
+    <div className={cn('w-[296px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 pb-0 shadow-lg backdrop-blur-[5px]', className)}>
+      <PickerPanelMain {...props} />
+    </div>
+  )
+}
+export default React.memo(PickerPanel)
diff --git a/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/show/field.tsx b/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/show/field.tsx
new file mode 100644
index 0000000..63b4880
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/show/field.tsx
@@ -0,0 +1,74 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { Type } from '../../../../../llm/types'
+import { getFieldType } from '../../../../../llm/utils'
+import type { Field as FieldType } from '../../../../../llm/types'
+import cn from '@/utils/classnames'
+import TreeIndentLine from '../tree-indent-line'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import { RiArrowDropDownLine } from '@remixicon/react'
+
+type Props = {
+  name: string,
+  payload: FieldType,
+  required: boolean,
+  depth?: number,
+  rootClassName?: string
+}
+
+const Field: FC<Props> = ({
+  name,
+  payload,
+  depth = 1,
+  required,
+  rootClassName,
+}) => {
+  const { t } = useTranslation()
+  const isRoot = depth === 1
+  const hasChildren = payload.type === Type.object && payload.properties
+  const [fold, {
+    toggle: toggleFold,
+  }] = useBoolean(false)
+  return (
+    <div>
+      <div className={cn('flex pr-2')}>
+        <TreeIndentLine depth={depth} />
+        <div className='w-0 grow'>
+          <div className='relative flex select-none'>
+            {hasChildren && (
+              <RiArrowDropDownLine
+                className={cn('absolute left-[-18px] top-[50%] h-4 w-4 translate-y-[-50%] cursor-pointer bg-components-panel-bg text-text-tertiary', fold && 'rotate-[270deg] text-text-accent')}
+                onClick={toggleFold}
+              />
+            )}
+            <div className={cn('system-sm-medium ml-[7px] h-6 truncate leading-6 text-text-secondary', isRoot && rootClassName)}>{name}</div>
+            <div className='system-xs-regular ml-3 shrink-0 leading-6 text-text-tertiary'>{getFieldType(payload)}</div>
+            {required && <div className='system-2xs-medium-uppercase ml-3 leading-6 text-text-warning'>{t('app.structOutput.required')}</div>}
+          </div>
+          {payload.description && (
+            <div className='ml-[7px] flex'>
+              <div className='system-xs-regular w-0 grow truncate text-text-tertiary'>{payload.description}</div>
+            </div>
+          )}
+        </div>
+      </div>
+
+      {hasChildren && !fold && (
+        <div>
+          {Object.keys(payload.properties!).map(name => (
+            <Field
+              key={name}
+              name={name}
+              payload={payload.properties?.[name] as FieldType}
+              depth={depth + 1}
+              required={!!payload.required?.includes(name)}
+            />
+          ))}
+        </div>
+      )}
+    </div>
+  )
+}
+export default React.memo(Field)
diff --git a/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/show/index.tsx b/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/show/index.tsx
new file mode 100644
index 0000000..86f707a
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/show/index.tsx
@@ -0,0 +1,39 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { StructuredOutput } from '../../../../../llm/types'
+import Field from './field'
+import { useTranslation } from 'react-i18next'
+
+type Props = {
+  payload: StructuredOutput
+  rootClassName?: string
+}
+
+const ShowPanel: FC<Props> = ({
+  payload,
+  rootClassName,
+}) => {
+  const { t } = useTranslation()
+  const schema = {
+    ...payload,
+    schema: {
+      ...payload.schema,
+      description: t('app.structOutput.LLMResponse'),
+    },
+  }
+  return (
+    <div className='relative left-[-7px]'>
+      {Object.keys(schema.schema.properties!).map(name => (
+        <Field
+          key={name}
+          name={name}
+          payload={schema.schema.properties![name]}
+          required={!!schema.schema.required?.includes(name)}
+          rootClassName={rootClassName}
+        />
+      ))}
+    </div>
+  )
+}
+export default React.memo(ShowPanel)
diff --git a/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/tree-indent-line.tsx b/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/tree-indent-line.tsx
new file mode 100644
index 0000000..475c119
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/tree-indent-line.tsx
@@ -0,0 +1,24 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import cn from '@/utils/classnames'
+
+type Props = {
+  depth?: number,
+  className?: string,
+}
+
+const TreeIndentLine: FC<Props> = ({
+  depth = 1,
+  className,
+}) => {
+  const depthArray = Array.from({ length: depth }, (_, index) => index)
+  return (
+    <div className={cn('flex', className)}>
+      {depthArray.map(d => (
+        <div key={d} className={cn('ml-2.5 mr-2.5 w-px bg-divider-regular')}></div>
+      ))}
+    </div>
+  )
+}
+export default React.memo(TreeIndentLine)
diff --git a/app/components/workflow/nodes/_base/components/variable/output-var-list.tsx b/app/components/workflow/nodes/_base/components/variable/output-var-list.tsx
new file mode 100644
index 0000000..dba93aa
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/output-var-list.tsx
@@ -0,0 +1,109 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import produce from 'immer'
+import { useTranslation } from 'react-i18next'
+import type { OutputVar } from '../../../code/types'
+import RemoveButton from '../remove-button'
+import VarTypePicker from './var-type-picker'
+import Input from '@/app/components/base/input'
+import type { VarType } from '@/app/components/workflow/types'
+import { checkKeys } from '@/utils/var'
+import Toast from '@/app/components/base/toast'
+
+type Props = {
+  readonly: boolean
+  outputs: OutputVar
+  outputKeyOrders: string[]
+  onChange: (payload: OutputVar, changedIndex?: number, newKey?: string) => void
+  onRemove: (index: number) => void
+}
+
+const OutputVarList: FC<Props> = ({
+  readonly,
+  outputs,
+  outputKeyOrders,
+  onChange,
+  onRemove,
+}) => {
+  const { t } = useTranslation()
+
+  const list = outputKeyOrders.map((key) => {
+    return {
+      variable: key,
+      variable_type: outputs[key]?.type,
+    }
+  })
+  const handleVarNameChange = useCallback((index: number) => {
+    return (e: React.ChangeEvent<HTMLInputElement>) => {
+      const oldKey = list[index].variable
+      const newKey = e.target.value
+
+      const { isValid, errorKey, errorMessageKey } = checkKeys([newKey], true)
+      if (!isValid) {
+        Toast.notify({
+          type: 'error',
+          message: t(`appDebug.varKeyError.${errorMessageKey}`, { key: errorKey }),
+        })
+        return
+      }
+
+      if (list.map(item => item.variable?.trim()).includes(newKey.trim())) {
+        Toast.notify({
+          type: 'error',
+          message: t('appDebug.varKeyError.keyAlreadyExists', { key: newKey }),
+        })
+        return
+      }
+
+      const newOutputs = produce(outputs, (draft) => {
+        draft[newKey] = draft[oldKey]
+        delete draft[oldKey]
+      })
+      onChange(newOutputs, index, newKey)
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [list, onChange, outputs, outputKeyOrders])
+
+  const handleVarTypeChange = useCallback((index: number) => {
+    return (value: string) => {
+      const key = list[index].variable
+      const newOutputs = produce(outputs, (draft) => {
+        draft[key].type = value as VarType
+      })
+      onChange(newOutputs)
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [list, onChange, outputs, outputKeyOrders])
+
+  const handleVarRemove = useCallback((index: number) => {
+    return () => {
+      onRemove(index)
+    }
+  }, [onRemove])
+
+  return (
+    <div className='space-y-2'>
+      {list.map((item, index) => (
+        <div className='flex items-center space-x-1' key={index}>
+          <Input
+            readOnly={readonly}
+            value={item.variable}
+            onChange={handleVarNameChange(index)}
+            wrapperClassName='grow'
+          />
+          <VarTypePicker
+            readonly={readonly}
+            value={item.variable_type}
+            onChange={handleVarTypeChange(index)}
+          />
+          <RemoveButton
+            className='!bg-gray-100 !p-2 hover:!bg-gray-200'
+            onClick={handleVarRemove(index)}
+          />
+        </div>
+      ))}
+    </div>
+  )
+}
+export default React.memo(OutputVarList)
diff --git a/app/components/workflow/nodes/_base/components/variable/utils.ts b/app/components/workflow/nodes/_base/components/variable/utils.ts
new file mode 100644
index 0000000..428c204
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/utils.ts
@@ -0,0 +1,1496 @@
+import produce from 'immer'
+import { isArray, uniq } from 'lodash-es'
+import type { CodeNodeType } from '../../../code/types'
+import type { EndNodeType } from '../../../end/types'
+import type { AnswerNodeType } from '../../../answer/types'
+import { type LLMNodeType, type StructuredOutput, Type } from '../../../llm/types'
+import type { KnowledgeRetrievalNodeType } from '../../../knowledge-retrieval/types'
+import type { IfElseNodeType } from '../../../if-else/types'
+import type { TemplateTransformNodeType } from '../../../template-transform/types'
+import type { QuestionClassifierNodeType } from '../../../question-classifier/types'
+import type { HttpNodeType } from '../../../http/types'
+import { VarType as ToolVarType } from '../../../tool/types'
+import type { ToolNodeType } from '../../../tool/types'
+import type { ParameterExtractorNodeType } from '../../../parameter-extractor/types'
+import type { IterationNodeType } from '../../../iteration/types'
+import type { LoopNodeType } from '../../../loop/types'
+import type { ListFilterNodeType } from '../../../list-operator/types'
+import { OUTPUT_FILE_SUB_VARIABLES } from '../../../constants'
+import type { DocExtractorNodeType } from '../../../document-extractor/types'
+import { BlockEnum, InputVarType, VarType } from '@/app/components/workflow/types'
+import type { StartNodeType } from '@/app/components/workflow/nodes/start/types'
+import type { ConversationVariable, EnvironmentVariable, Node, NodeOutPutVar, ValueSelector, Var } from '@/app/components/workflow/types'
+import type { VariableAssignerNodeType } from '@/app/components/workflow/nodes/variable-assigner/types'
+import type { Field as StructField } from '@/app/components/workflow/nodes/llm/types'
+
+import {
+  HTTP_REQUEST_OUTPUT_STRUCT,
+  KNOWLEDGE_RETRIEVAL_OUTPUT_STRUCT,
+  LLM_OUTPUT_STRUCT,
+  PARAMETER_EXTRACTOR_COMMON_STRUCT,
+  QUESTION_CLASSIFIER_OUTPUT_STRUCT,
+  SUPPORT_OUTPUT_VARS_NODE,
+  TEMPLATE_TRANSFORM_OUTPUT_STRUCT,
+  TOOL_OUTPUT_STRUCT,
+} from '@/app/components/workflow/constants'
+import type { PromptItem } from '@/models/debug'
+import { VAR_REGEX } from '@/config'
+import type { AgentNodeType } from '../../../agent/types'
+
+export const isSystemVar = (valueSelector: ValueSelector) => {
+  return valueSelector[0] === 'sys' || valueSelector[1] === 'sys'
+}
+
+export const isENV = (valueSelector: ValueSelector) => {
+  return valueSelector[0] === 'env'
+}
+
+export const isConversationVar = (valueSelector: ValueSelector) => {
+  return valueSelector[0] === 'conversation'
+}
+
+const inputVarTypeToVarType = (type: InputVarType): VarType => {
+  return ({
+    [InputVarType.number]: VarType.number,
+    [InputVarType.singleFile]: VarType.file,
+    [InputVarType.multiFiles]: VarType.arrayFile,
+  } as any)[type] || VarType.string
+}
+
+const structTypeToVarType = (type: Type, isArray?: boolean): VarType => {
+  if (isArray) {
+    return ({
+      [Type.string]: VarType.arrayString,
+      [Type.number]: VarType.arrayNumber,
+      [Type.object]: VarType.arrayObject,
+    } as any)[type] || VarType.string
+  }
+  return ({
+    [Type.string]: VarType.string,
+    [Type.number]: VarType.number,
+    [Type.boolean]: VarType.boolean,
+    [Type.object]: VarType.object,
+    [Type.array]: VarType.array,
+  } as any)[type] || VarType.string
+}
+
+export const varTypeToStructType = (type: VarType): Type => {
+  return ({
+    [VarType.string]: Type.string,
+    [VarType.number]: Type.number,
+    [VarType.boolean]: Type.boolean,
+    [VarType.object]: Type.object,
+    [VarType.array]: Type.array,
+  } as any)[type] || Type.string
+}
+
+const findExceptVarInStructuredProperties = (properties: Record<string, StructField>, filterVar: (payload: Var, selector: ValueSelector) => boolean): Record<string, StructField> => {
+  const res = produce(properties, (draft) => {
+    Object.keys(properties).forEach((key) => {
+      const item = properties[key]
+      const isObj = item.type === Type.object
+      const isArray = item.type === Type.array
+      const arrayType = item.items?.type
+
+      if (!isObj && !filterVar({
+        variable: key,
+        type: structTypeToVarType(isArray ? arrayType! : item.type, isArray),
+      }, [key])) {
+        delete properties[key]
+        return
+      }
+      if (item.type === Type.object && item.properties)
+        item.properties = findExceptVarInStructuredProperties(item.properties, filterVar)
+    })
+    return draft
+  })
+  return res
+}
+
+const findExceptVarInStructuredOutput = (structuredOutput: StructuredOutput, filterVar: (payload: Var, selector: ValueSelector) => boolean): StructuredOutput => {
+  const res = produce(structuredOutput, (draft) => {
+    const properties = draft.schema.properties
+    Object.keys(properties).forEach((key) => {
+      const item = properties[key]
+      const isObj = item.type === Type.object
+      const isArray = item.type === Type.array
+      const arrayType = item.items?.type
+      if (!isObj && !filterVar({
+        variable: key,
+        type: structTypeToVarType(isArray ? arrayType! : item.type, isArray),
+      }, [key])) {
+        delete properties[key]
+        return
+      }
+      if (item.type === Type.object && item.properties)
+        item.properties = findExceptVarInStructuredProperties(item.properties, filterVar)
+    })
+    return draft
+  })
+  return res
+}
+
+const findExceptVarInObject = (obj: any, filterVar: (payload: Var, selector: ValueSelector) => boolean, value_selector: ValueSelector, isFile?: boolean): Var => {
+  const { children } = obj
+  const isStructuredOutput = !!(children as StructuredOutput)?.schema?.properties
+
+  let childrenResult: Var[] | StructuredOutput | undefined
+
+  if (isStructuredOutput) {
+    childrenResult = findExceptVarInStructuredOutput(children, filterVar)
+  }
+ else if (Array.isArray(children)) {
+    childrenResult = children.filter((item: Var) => {
+      const { children: itemChildren } = item
+      const currSelector = [...value_selector, item.variable]
+
+      if (!itemChildren)
+        return filterVar(item, currSelector)
+
+      const filteredObj = findExceptVarInObject(item, filterVar, currSelector, false) // File doesn't contain file children
+      return filteredObj.children && (filteredObj.children as Var[])?.length > 0
+    })
+  }
+ else {
+    childrenResult = []
+  }
+
+  const res: Var = {
+    variable: obj.variable,
+    type: isFile ? VarType.file : VarType.object,
+    children: childrenResult,
+  }
+
+  return res
+}
+
+const formatItem = (
+  item: any,
+  isChatMode: boolean,
+  filterVar: (payload: Var, selector: ValueSelector) => boolean,
+): NodeOutPutVar => {
+  const { id, data } = item
+
+  const res: NodeOutPutVar = {
+    nodeId: id,
+    title: data.title,
+    vars: [],
+  }
+  switch (data.type) {
+    case BlockEnum.Start: {
+      const {
+        variables,
+      } = data as StartNodeType
+      res.vars = variables.map((v) => {
+        return {
+          variable: v.variable,
+          type: inputVarTypeToVarType(v.type),
+          isParagraph: v.type === InputVarType.paragraph,
+          isSelect: v.type === InputVarType.select,
+          options: v.options,
+          required: v.required,
+        }
+      })
+      if (isChatMode) {
+        res.vars.push({
+          variable: 'sys.query',
+          type: VarType.string,
+        })
+        res.vars.push({
+          variable: 'sys.dialogue_count',
+          type: VarType.number,
+        })
+        res.vars.push({
+          variable: 'sys.conversation_id',
+          type: VarType.string,
+        })
+      }
+      res.vars.push({
+        variable: 'sys.user_id',
+        type: VarType.string,
+      })
+      res.vars.push({
+        variable: 'sys.files',
+        type: VarType.arrayFile,
+      })
+      res.vars.push({
+        variable: 'sys.app_id',
+        type: VarType.string,
+      })
+      res.vars.push({
+        variable: 'sys.workflow_id',
+        type: VarType.string,
+      })
+      res.vars.push({
+        variable: 'sys.workflow_run_id',
+        type: VarType.string,
+      })
+
+      break
+    }
+
+    case BlockEnum.LLM: {
+      res.vars = [...LLM_OUTPUT_STRUCT]
+      if (data.structured_output_enabled && data.structured_output?.schema?.properties && Object.keys(data.structured_output.schema.properties).length > 0) {
+        res.vars.push({
+          variable: 'structured_output',
+          type: VarType.object,
+          children: data.structured_output,
+        })
+      }
+
+      break
+    }
+    case BlockEnum.KnowledgeRetrieval: {
+      res.vars = KNOWLEDGE_RETRIEVAL_OUTPUT_STRUCT
+      break
+    }
+
+    case BlockEnum.Code: {
+      const {
+        outputs,
+      } = data as CodeNodeType
+      res.vars = outputs
+        ? Object.keys(outputs).map((key) => {
+          return {
+            variable: key,
+            type: outputs[key].type,
+          }
+        })
+        : []
+      break
+    }
+
+    case BlockEnum.TemplateTransform: {
+      res.vars = TEMPLATE_TRANSFORM_OUTPUT_STRUCT
+      break
+    }
+
+    case BlockEnum.QuestionClassifier: {
+      res.vars = QUESTION_CLASSIFIER_OUTPUT_STRUCT
+      break
+    }
+
+    case BlockEnum.HttpRequest: {
+      res.vars = HTTP_REQUEST_OUTPUT_STRUCT
+      break
+    }
+
+    case BlockEnum.VariableAssigner: {
+      const {
+        output_type,
+        advanced_settings,
+      } = data as VariableAssignerNodeType
+      const isGroup = !!advanced_settings?.group_enabled
+      if (!isGroup) {
+        res.vars = [
+          {
+            variable: 'output',
+            type: output_type,
+          },
+        ]
+      }
+      else {
+        res.vars = advanced_settings?.groups.map((group) => {
+          return {
+            variable: group.group_name,
+            type: VarType.object,
+            children: [{
+              variable: 'output',
+              type: group.output_type,
+            }],
+          }
+        })
+      }
+      break
+    }
+
+    // eslint-disable-next-line sonarjs/no-duplicated-branches
+    case BlockEnum.VariableAggregator: {
+      const {
+        output_type,
+        advanced_settings,
+      } = data as VariableAssignerNodeType
+      const isGroup = !!advanced_settings?.group_enabled
+      if (!isGroup) {
+        res.vars = [
+          {
+            variable: 'output',
+            type: output_type,
+          },
+        ]
+      }
+      else {
+        res.vars = advanced_settings?.groups.map((group) => {
+          return {
+            variable: group.group_name,
+            type: VarType.object,
+            children: [{
+              variable: 'output',
+              type: group.output_type,
+            }],
+          }
+        })
+      }
+      break
+    }
+
+    case BlockEnum.Tool: {
+      const {
+        output_schema,
+      } = data as ToolNodeType
+      if (!output_schema) {
+        res.vars = TOOL_OUTPUT_STRUCT
+      }
+      else {
+        const outputSchema: any[] = []
+        Object.keys(output_schema.properties).forEach((outputKey) => {
+          const output = output_schema.properties[outputKey]
+          const dataType = output.type
+          outputSchema.push({
+            variable: outputKey,
+            type: dataType === 'array'
+              ? `array[${output.items?.type.slice(0, 1).toLocaleLowerCase()}${output.items?.type.slice(1)}]`
+              : `${output.type.slice(0, 1).toLocaleLowerCase()}${output.type.slice(1)}`,
+            description: output.description,
+            children: output.type === 'object' ? {
+              schema: {
+                type: 'object',
+                properties: output.properties,
+              },
+            } : undefined,
+          })
+        })
+        res.vars = [
+          ...TOOL_OUTPUT_STRUCT,
+          ...outputSchema,
+        ]
+      }
+      break
+    }
+
+    case BlockEnum.ParameterExtractor: {
+      res.vars = [
+        ...((data as ParameterExtractorNodeType).parameters || []).map((p) => {
+          return {
+            variable: p.name,
+            type: p.type as unknown as VarType,
+          }
+        }),
+        ...PARAMETER_EXTRACTOR_COMMON_STRUCT,
+      ]
+      break
+    }
+
+    case BlockEnum.Iteration: {
+      res.vars = [
+        {
+          variable: 'output',
+          type: (data as IterationNodeType).output_type || VarType.arrayString,
+        },
+      ]
+      break
+    }
+
+    case BlockEnum.Loop: {
+      const { loop_variables } = data as LoopNodeType
+      res.isLoop = true
+      res.vars = loop_variables?.map((v) => {
+        return {
+          variable: v.label,
+          type: v.var_type,
+          isLoopVariable: true,
+          nodeId: res.nodeId,
+        }
+      }) || []
+
+      break
+    }
+
+    case BlockEnum.DocExtractor: {
+      res.vars = [
+        {
+          variable: 'text',
+          type: (data as DocExtractorNodeType).is_array_file ? VarType.arrayString : VarType.string,
+        },
+      ]
+      break
+    }
+
+    case BlockEnum.ListFilter: {
+      if (!(data as ListFilterNodeType).var_type)
+        break
+
+      res.vars = [
+        {
+          variable: 'result',
+          type: (data as ListFilterNodeType).var_type,
+        },
+        {
+          variable: 'first_record',
+          type: (data as ListFilterNodeType).item_var_type,
+        },
+        {
+          variable: 'last_record',
+          type: (data as ListFilterNodeType).item_var_type,
+        },
+      ]
+      break
+    }
+
+    case BlockEnum.Agent: {
+      const payload = data as AgentNodeType
+      const outputs: Var[] = []
+      Object.keys(payload.output_schema?.properties || {}).forEach((outputKey) => {
+        const output = payload.output_schema.properties[outputKey]
+        outputs.push({
+          variable: outputKey,
+          type: output.type === 'array'
+            ? `Array[${output.items?.type.slice(0, 1).toLocaleUpperCase()}${output.items?.type.slice(1)}]` as VarType
+            : `${output.type.slice(0, 1).toLocaleUpperCase()}${output.type.slice(1)}` as VarType,
+        })
+      })
+      res.vars = [
+        ...outputs,
+        ...TOOL_OUTPUT_STRUCT,
+      ]
+      break
+    }
+
+    case 'env': {
+      res.vars = data.envList.map((env: EnvironmentVariable) => {
+        return {
+          variable: `env.${env.name}`,
+          type: env.value_type,
+        }
+      }) as Var[]
+      break
+    }
+
+    case 'conversation': {
+      res.vars = data.chatVarList.map((chatVar: ConversationVariable) => {
+        return {
+          variable: `conversation.${chatVar.name}`,
+          type: chatVar.value_type,
+          des: chatVar.description,
+        }
+      }) as Var[]
+      break
+    }
+  }
+
+  const { error_strategy } = data
+
+  if (error_strategy) {
+    res.vars = [
+      ...res.vars,
+      {
+        variable: 'error_message',
+        type: VarType.string,
+        isException: true,
+      },
+      {
+        variable: 'error_type',
+        type: VarType.string,
+        isException: true,
+      },
+    ]
+  }
+
+  const selector = [id]
+  res.vars = res.vars.filter((v) => {
+    const isCurrentMatched = filterVar(v, (() => {
+      const variableArr = v.variable.split('.')
+      const [first] = variableArr
+      if (first === 'sys' || first === 'env' || first === 'conversation')
+        return variableArr
+
+      return [...selector, ...variableArr]
+    })())
+    if (isCurrentMatched)
+      return true
+
+    const isFile = v.type === VarType.file
+    const children = (() => {
+      if (isFile) {
+        return OUTPUT_FILE_SUB_VARIABLES.map((key) => {
+          return {
+            variable: key,
+            type: key === 'size' ? VarType.number : VarType.string,
+          }
+        })
+      }
+      return v.children
+    })()
+    if (!children)
+      return false
+
+    const obj = findExceptVarInObject(isFile ? { ...v, children } : v, filterVar, selector, isFile)
+    return obj?.children && ((obj?.children as Var[]).length > 0 || Object.keys((obj?.children as StructuredOutput)?.schema?.properties || {}).length > 0)
+  }).map((v) => {
+    const isFile = v.type === VarType.file
+
+    const { children } = (() => {
+      if (isFile) {
+        return {
+          children: OUTPUT_FILE_SUB_VARIABLES.map((key) => {
+            return {
+              variable: key,
+              type: key === 'size' ? VarType.number : VarType.string,
+            }
+          }),
+        }
+      }
+      return v
+    })()
+
+    if (!children)
+      return v
+
+    return findExceptVarInObject(isFile ? { ...v, children } : v, filterVar, selector, isFile)
+  })
+
+  return res
+}
+export const toNodeOutputVars = (
+  nodes: any[],
+  isChatMode: boolean,
+  filterVar = (_payload: Var, _selector: ValueSelector) => true,
+  environmentVariables: EnvironmentVariable[] = [],
+  conversationVariables: ConversationVariable[] = [],
+): NodeOutPutVar[] => {
+  // ENV_NODE data format
+  const ENV_NODE = {
+    id: 'env',
+    data: {
+      title: 'ENVIRONMENT',
+      type: 'env',
+      envList: environmentVariables,
+    },
+  }
+  // CHAT_VAR_NODE data format
+  const CHAT_VAR_NODE = {
+    id: 'conversation',
+    data: {
+      title: 'CONVERSATION',
+      type: 'conversation',
+      chatVarList: conversationVariables,
+    },
+  }
+  // Sort nodes in reverse chronological order (most recent first)
+  const sortedNodes = [...nodes].sort((a, b) => {
+    if (a.data.type === BlockEnum.Start) return 1
+    if (b.data.type === BlockEnum.Start) return -1
+    if (a.data.type === 'env') return 1
+    if (b.data.type === 'env') return -1
+    if (a.data.type === 'conversation') return 1
+    if (b.data.type === 'conversation') return -1
+    // sort nodes by x position
+    return (b.position?.x || 0) - (a.position?.x || 0)
+  })
+
+  const res = [
+    ...sortedNodes.filter(node => SUPPORT_OUTPUT_VARS_NODE.includes(node?.data?.type)),
+    ...(environmentVariables.length > 0 ? [ENV_NODE] : []),
+    ...((isChatMode && conversationVariables.length > 0) ? [CHAT_VAR_NODE] : []),
+  ].map((node) => {
+    return {
+      ...formatItem(node, isChatMode, filterVar),
+      isStartNode: node.data.type === BlockEnum.Start,
+    }
+  }).filter(item => item.vars.length > 0)
+  return res
+}
+
+const getIterationItemType = ({
+  valueSelector,
+  beforeNodesOutputVars,
+}: {
+  valueSelector: ValueSelector
+  beforeNodesOutputVars: NodeOutPutVar[]
+}): VarType => {
+  const outputVarNodeId = valueSelector[0]
+  const isSystem = isSystemVar(valueSelector)
+
+  const targetVar = isSystem ? beforeNodesOutputVars.find(v => v.isStartNode) : beforeNodesOutputVars.find(v => v.nodeId === outputVarNodeId)
+
+  if (!targetVar)
+    return VarType.string
+
+  let arrayType: VarType = VarType.string
+
+  let curr: any = targetVar.vars
+  if (isSystem) {
+    arrayType = curr.find((v: any) => v.variable === (valueSelector).join('.'))?.type
+  }
+  else {
+    for (let i = 1; i < valueSelector.length; i++) {
+      const key = valueSelector[i]
+      const isLast = i === valueSelector.length - 1
+      curr = Array.isArray(curr) ? curr.find(v => v.variable === key) : []
+
+      if (isLast)
+      arrayType = curr?.type
+      else if (curr?.type === VarType.object || curr?.type === VarType.file)
+      curr = curr.children || []
+    }
+  }
+
+  switch (arrayType as VarType) {
+    case VarType.arrayString:
+      return VarType.string
+    case VarType.arrayNumber:
+      return VarType.number
+    case VarType.arrayObject:
+      return VarType.object
+    case VarType.array:
+      return VarType.any
+    case VarType.arrayFile:
+      return VarType.file
+    default:
+      return VarType.string
+  }
+}
+
+const getLoopItemType = ({
+  valueSelector,
+  beforeNodesOutputVars,
+}: {
+  valueSelector: ValueSelector
+  beforeNodesOutputVars: NodeOutPutVar[]
+
+}): VarType => {
+  const outputVarNodeId = valueSelector[0]
+  const isSystem = isSystemVar(valueSelector)
+
+  const targetVar = isSystem ? beforeNodesOutputVars.find(v => v.isStartNode) : beforeNodesOutputVars.find(v => v.nodeId === outputVarNodeId)
+  if (!targetVar)
+    return VarType.string
+
+  let arrayType: VarType = VarType.string
+
+  let curr: any = targetVar.vars
+  if (isSystem) {
+    arrayType = curr.find((v: any) => v.variable === (valueSelector).join('.'))?.type
+  }
+  else {
+    (valueSelector).slice(1).forEach((key, i) => {
+      const isLast = i === valueSelector.length - 2
+      curr = curr?.find((v: any) => v.variable === key)
+      if (isLast) {
+        arrayType = curr?.type
+      }
+      else {
+        if (curr?.type === VarType.object || curr?.type === VarType.file)
+          curr = curr.children
+      }
+    })
+  }
+
+  switch (arrayType as VarType) {
+    case VarType.arrayString:
+      return VarType.string
+    case VarType.arrayNumber:
+      return VarType.number
+    case VarType.arrayObject:
+      return VarType.object
+    case VarType.array:
+      return VarType.any
+    case VarType.arrayFile:
+      return VarType.file
+    default:
+      return VarType.string
+  }
+}
+
+export const getVarType = ({
+  parentNode,
+  valueSelector,
+  isIterationItem,
+  isLoopItem,
+  availableNodes,
+  isChatMode,
+  isConstant,
+  environmentVariables = [],
+  conversationVariables = [],
+}: {
+  valueSelector: ValueSelector
+  parentNode?: Node | null
+  isIterationItem?: boolean
+  isLoopItem?: boolean
+  availableNodes: any[]
+  isChatMode: boolean
+  isConstant?: boolean
+  environmentVariables?: EnvironmentVariable[]
+  conversationVariables?: ConversationVariable[]
+}): VarType => {
+  if (isConstant)
+    return VarType.string
+
+  const beforeNodesOutputVars = toNodeOutputVars(
+    availableNodes,
+    isChatMode,
+    undefined,
+    environmentVariables,
+    conversationVariables,
+  )
+
+  const isIterationInnerVar = parentNode?.data.type === BlockEnum.Iteration
+  if (isIterationItem) {
+    return getIterationItemType({
+      valueSelector,
+      beforeNodesOutputVars,
+    })
+  }
+  if (isIterationInnerVar) {
+    if (valueSelector[1] === 'item') {
+      const itemType = getIterationItemType({
+        valueSelector: (parentNode?.data as any).iterator_selector || [],
+        beforeNodesOutputVars,
+      })
+      return itemType
+    }
+    if (valueSelector[1] === 'index')
+      return VarType.number
+  }
+
+  const isLoopInnerVar = parentNode?.data.type === BlockEnum.Loop
+  if (isLoopItem) {
+    return getLoopItemType({
+      valueSelector,
+      beforeNodesOutputVars,
+    })
+  }
+  if (isLoopInnerVar) {
+    if (valueSelector[1] === 'item') {
+      const itemType = getLoopItemType({
+        valueSelector: (parentNode?.data as any).iterator_selector || [],
+        beforeNodesOutputVars,
+      })
+      return itemType
+    }
+    if (valueSelector[1] === 'index')
+      return VarType.number
+  }
+
+  const isSystem = isSystemVar(valueSelector)
+  const isEnv = isENV(valueSelector)
+  const isChatVar = isConversationVar(valueSelector)
+  const startNode = availableNodes.find((node: any) => {
+    return node?.data.type === BlockEnum.Start
+  })
+
+  const targetVarNodeId = isSystem ? startNode?.id : valueSelector[0]
+  const targetVar = beforeNodesOutputVars.find(v => v.nodeId === targetVarNodeId)
+
+  if (!targetVar)
+    return VarType.string
+
+  let type: VarType = VarType.string
+  let curr: any = targetVar.vars
+
+  if (isSystem || isEnv || isChatVar) {
+    return curr.find((v: any) => v.variable === (valueSelector as ValueSelector).join('.'))?.type
+  }
+  else {
+    const targetVar = curr.find((v: any) => v.variable === valueSelector[1])
+    if (!targetVar)
+      return VarType.string
+
+    const isStructuredOutputVar = !!targetVar.children?.schema?.properties
+    if (isStructuredOutputVar) {
+      if (valueSelector.length === 2) { // root
+        return VarType.object
+      }
+      let currProperties = targetVar.children.schema;
+      (valueSelector as ValueSelector).slice(2).forEach((key, i) => {
+        const isLast = i === valueSelector.length - 3
+        if (!currProperties)
+          return
+
+        currProperties = currProperties.properties[key]
+        if (isLast)
+          type = structTypeToVarType(currProperties?.type)
+      })
+      return type
+    }
+
+    (valueSelector as ValueSelector).slice(1).forEach((key, i) => {
+      const isLast = i === valueSelector.length - 2
+      if (Array.isArray(curr))
+        curr = curr?.find((v: any) => v.variable === key)
+
+      if (isLast) {
+        type = curr?.type
+      }
+      else {
+        if (curr?.type === VarType.object || curr?.type === VarType.file)
+          curr = curr.children
+      }
+    })
+    return type
+  }
+}
+
+// node output vars + parent inner vars(if in iteration or other wrap node)
+export const toNodeAvailableVars = ({
+  parentNode,
+  t,
+  beforeNodes,
+  isChatMode,
+  environmentVariables,
+  conversationVariables,
+  filterVar,
+}: {
+  parentNode?: Node | null
+  t?: any
+  // to get those nodes output vars
+  beforeNodes: Node[]
+  isChatMode: boolean
+  // env
+  environmentVariables?: EnvironmentVariable[]
+  // chat var
+  conversationVariables?: ConversationVariable[]
+  filterVar: (payload: Var, selector: ValueSelector) => boolean
+}): NodeOutPutVar[] => {
+  const beforeNodesOutputVars = toNodeOutputVars(
+    beforeNodes,
+    isChatMode,
+    filterVar,
+    environmentVariables,
+    conversationVariables,
+  )
+  const isInIteration = parentNode?.data.type === BlockEnum.Iteration
+  if (isInIteration) {
+    const iterationNode: any = parentNode
+    const itemType = getVarType({
+      parentNode: iterationNode,
+      isIterationItem: true,
+      valueSelector: iterationNode?.data.iterator_selector || [],
+      availableNodes: beforeNodes,
+      isChatMode,
+      environmentVariables,
+      conversationVariables,
+    })
+    const itemChildren = itemType === VarType.file
+      ? {
+        children: OUTPUT_FILE_SUB_VARIABLES.map((key) => {
+          return {
+            variable: key,
+            type: key === 'size' ? VarType.number : VarType.string,
+          }
+        }),
+      }
+      : {}
+    const iterationVar = {
+      nodeId: iterationNode?.id,
+      title: t('workflow.nodes.iteration.currentIteration'),
+      vars: [
+        {
+          variable: 'item',
+          type: itemType,
+          ...itemChildren,
+        },
+        {
+          variable: 'index',
+          type: VarType.number,
+        },
+      ],
+    }
+    const iterationIndex = beforeNodesOutputVars.findIndex(v => v.nodeId === iterationNode?.id)
+    if (iterationIndex > -1)
+      beforeNodesOutputVars.splice(iterationIndex, 1)
+    beforeNodesOutputVars.unshift(iterationVar)
+  }
+  return beforeNodesOutputVars
+}
+
+export const getNodeInfoById = (nodes: any, id: string) => {
+  if (!isArray(nodes))
+    return
+  return nodes.find((node: any) => node.id === id)
+}
+
+const matchNotSystemVars = (prompts: string[]) => {
+  if (!prompts)
+    return []
+
+  const allVars: string[] = []
+  prompts.forEach((prompt) => {
+    VAR_REGEX.lastIndex = 0
+    if (typeof prompt !== 'string')
+      return
+    allVars.push(...(prompt.match(VAR_REGEX) || []))
+  })
+  const uniqVars = uniq(allVars).map(v => v.replaceAll('{{#', '').replace('#}}', '').split('.'))
+  return uniqVars
+}
+
+const replaceOldVarInText = (text: string, oldVar: ValueSelector, newVar: ValueSelector) => {
+  if (!text || typeof text !== 'string')
+    return text
+
+  if (!newVar || newVar.length === 0)
+    return text
+
+  return text.replaceAll(`{{#${oldVar.join('.')}#}}`, `{{#${newVar.join('.')}#}}`)
+}
+
+export const getNodeUsedVars = (node: Node): ValueSelector[] => {
+  const { data } = node
+  const { type } = data
+  let res: ValueSelector[] = []
+  switch (type) {
+    case BlockEnum.End: {
+      res = (data as EndNodeType).outputs?.map((output) => {
+        return output.value_selector
+      })
+      break
+    }
+    case BlockEnum.Answer: {
+      res = (data as AnswerNodeType).variables?.map((v) => {
+        return v.value_selector
+      })
+      break
+    }
+    case BlockEnum.LLM: {
+      const payload = data as LLMNodeType
+      const isChatModel = payload.model?.mode === 'chat'
+      let prompts: string[] = []
+      if (isChatModel) {
+        prompts = (payload.prompt_template as PromptItem[])?.map(p => p.text) || []
+        if (payload.memory?.query_prompt_template)
+          prompts.push(payload.memory.query_prompt_template)
+      }
+      else { prompts = [(payload.prompt_template as PromptItem).text] }
+
+      const inputVars: ValueSelector[] = matchNotSystemVars(prompts)
+      const contextVar = (data as LLMNodeType).context?.variable_selector ? [(data as LLMNodeType).context?.variable_selector] : []
+      res = [...inputVars, ...contextVar]
+      break
+    }
+    case BlockEnum.KnowledgeRetrieval: {
+      res = [(data as KnowledgeRetrievalNodeType).query_variable_selector]
+      break
+    }
+    case BlockEnum.IfElse: {
+      res = (data as IfElseNodeType).conditions?.map((c) => {
+        return c.variable_selector || []
+      }) || []
+      break
+    }
+    case BlockEnum.Code: {
+      res = (data as CodeNodeType).variables?.map((v) => {
+        return v.value_selector
+      })
+      break
+    }
+    case BlockEnum.TemplateTransform: {
+      res = (data as TemplateTransformNodeType).variables?.map((v: any) => {
+        return v.value_selector
+      })
+      break
+    }
+    case BlockEnum.QuestionClassifier: {
+      const payload = data as QuestionClassifierNodeType
+      res = [payload.query_variable_selector]
+      const varInInstructions = matchNotSystemVars([payload.instruction || ''])
+      res.push(...varInInstructions)
+      break
+    }
+    case BlockEnum.HttpRequest: {
+      const payload = data as HttpNodeType
+      res = matchNotSystemVars([payload.url, payload.headers, payload.params, typeof payload.body.data === 'string' ? payload.body.data : payload.body.data.map(d => d.value).join('')])
+      break
+    }
+    case BlockEnum.Tool: {
+      const payload = data as ToolNodeType
+      const mixVars = matchNotSystemVars(Object.keys(payload.tool_parameters)?.filter(key => payload.tool_parameters[key].type === ToolVarType.mixed).map(key => payload.tool_parameters[key].value) as string[])
+      const vars = Object.keys(payload.tool_parameters).filter(key => payload.tool_parameters[key].type === ToolVarType.variable).map(key => payload.tool_parameters[key].value as string) || []
+      res = [...(mixVars as ValueSelector[]), ...(vars as any)]
+      break
+    }
+
+    case BlockEnum.VariableAssigner: {
+      res = (data as VariableAssignerNodeType)?.variables
+      break
+    }
+
+    case BlockEnum.VariableAggregator: {
+      res = (data as VariableAssignerNodeType)?.variables
+      break
+    }
+
+    case BlockEnum.ParameterExtractor: {
+      const payload = data as ParameterExtractorNodeType
+      res = [payload.query]
+      const varInInstructions = matchNotSystemVars([payload.instruction || ''])
+      res.push(...varInInstructions)
+      break
+    }
+
+    case BlockEnum.Iteration: {
+      res = [(data as IterationNodeType).iterator_selector]
+      break
+    }
+
+    case BlockEnum.Loop: {
+      const payload = data as LoopNodeType
+      res = payload.break_conditions?.map((c) => {
+        return c.variable_selector || []
+      }) || []
+      break
+    }
+
+    case BlockEnum.ListFilter: {
+      res = [(data as ListFilterNodeType).variable]
+      break
+    }
+
+    case BlockEnum.Agent: {
+      const payload = data as AgentNodeType
+      const valueSelectors: ValueSelector[] = []
+      if (!payload.agent_parameters)
+        break
+
+      Object.keys(payload.agent_parameters || {}).forEach((key) => {
+        const { value } = payload.agent_parameters![key]
+        if (typeof value === 'string')
+          valueSelectors.push(...matchNotSystemVars([value]))
+      })
+      res = valueSelectors
+      break
+    }
+  }
+  return res || []
+}
+
+// can be used in iteration node
+export const getNodeUsedVarPassToServerKey = (node: Node, valueSelector: ValueSelector): string | string[] => {
+  const { data } = node
+  const { type } = data
+  let res: string | string[] = ''
+  switch (type) {
+    case BlockEnum.LLM: {
+      const payload = data as LLMNodeType
+      res = [`#${valueSelector.join('.')}#`]
+      if (payload.context?.variable_selector.join('.') === valueSelector.join('.'))
+        res.push('#context#')
+
+      break
+    }
+    case BlockEnum.KnowledgeRetrieval: {
+      res = 'query'
+      break
+    }
+    case BlockEnum.IfElse: {
+      const targetVar = (data as IfElseNodeType).conditions?.find(c => c.variable_selector?.join('.') === valueSelector.join('.'))
+      if (targetVar)
+        res = `#${valueSelector.join('.')}#`
+      break
+    }
+    case BlockEnum.Code: {
+      const targetVar = (data as CodeNodeType).variables?.find(v => v.value_selector.join('.') === valueSelector.join('.'))
+      if (targetVar)
+        res = targetVar.variable
+      break
+    }
+    case BlockEnum.TemplateTransform: {
+      const targetVar = (data as TemplateTransformNodeType).variables?.find(v => v.value_selector.join('.') === valueSelector.join('.'))
+      if (targetVar)
+        res = targetVar.variable
+      break
+    }
+    case BlockEnum.QuestionClassifier: {
+      res = 'query'
+      break
+    }
+    case BlockEnum.HttpRequest: {
+      res = `#${valueSelector.join('.')}#`
+      break
+    }
+
+    case BlockEnum.Tool: {
+      res = `#${valueSelector.join('.')}#`
+      break
+    }
+
+    case BlockEnum.VariableAssigner: {
+      res = `#${valueSelector.join('.')}#`
+      break
+    }
+
+    case BlockEnum.VariableAggregator: {
+      res = `#${valueSelector.join('.')}#`
+      break
+    }
+
+    case BlockEnum.ParameterExtractor: {
+      res = 'query'
+      break
+    }
+  }
+  return res
+}
+
+export const findUsedVarNodes = (varSelector: ValueSelector, availableNodes: Node[]): Node[] => {
+  const res: Node[] = []
+  availableNodes.forEach((node) => {
+    const vars = getNodeUsedVars(node)
+    if (vars.find(v => v.join('.') === varSelector.join('.')))
+      res.push(node)
+  })
+  return res
+}
+
+export const updateNodeVars = (oldNode: Node, oldVarSelector: ValueSelector, newVarSelector: ValueSelector): Node => {
+  const newNode = produce(oldNode, (draft: any) => {
+    const { data } = draft
+    const { type } = data
+
+    switch (type) {
+      case BlockEnum.End: {
+        const payload = data as EndNodeType
+        if (payload.outputs) {
+          payload.outputs = payload.outputs.map((output) => {
+            if (output.value_selector.join('.') === oldVarSelector.join('.'))
+              output.value_selector = newVarSelector
+            return output
+          })
+        }
+        break
+      }
+      case BlockEnum.Answer: {
+        const payload = data as AnswerNodeType
+        if (payload.variables) {
+          payload.variables = payload.variables.map((v) => {
+            if (v.value_selector.join('.') === oldVarSelector.join('.'))
+              v.value_selector = newVarSelector
+            return v
+          })
+        }
+        break
+      }
+      case BlockEnum.LLM: {
+        const payload = data as LLMNodeType
+        const isChatModel = payload.model?.mode === 'chat'
+        if (isChatModel) {
+          payload.prompt_template = (payload.prompt_template as PromptItem[]).map((prompt) => {
+            return {
+              ...prompt,
+              text: replaceOldVarInText(prompt.text, oldVarSelector, newVarSelector),
+            }
+          })
+          if (payload.memory?.query_prompt_template)
+            payload.memory.query_prompt_template = replaceOldVarInText(payload.memory.query_prompt_template, oldVarSelector, newVarSelector)
+        }
+        else {
+          payload.prompt_template = {
+            ...payload.prompt_template,
+            text: replaceOldVarInText((payload.prompt_template as PromptItem).text, oldVarSelector, newVarSelector),
+          }
+        }
+        if (payload.context?.variable_selector?.join('.') === oldVarSelector.join('.'))
+          payload.context.variable_selector = newVarSelector
+
+        break
+      }
+      case BlockEnum.KnowledgeRetrieval: {
+        const payload = data as KnowledgeRetrievalNodeType
+        if (payload.query_variable_selector.join('.') === oldVarSelector.join('.'))
+          payload.query_variable_selector = newVarSelector
+        break
+      }
+      case BlockEnum.IfElse: {
+        const payload = data as IfElseNodeType
+        if (payload.conditions) {
+          payload.conditions = payload.conditions.map((c) => {
+            if (c.variable_selector?.join('.') === oldVarSelector.join('.'))
+              c.variable_selector = newVarSelector
+            return c
+          })
+        }
+        break
+      }
+      case BlockEnum.Code: {
+        const payload = data as CodeNodeType
+        if (payload.variables) {
+          payload.variables = payload.variables.map((v) => {
+            if (v.value_selector.join('.') === oldVarSelector.join('.'))
+              v.value_selector = newVarSelector
+            return v
+          })
+        }
+        break
+      }
+      case BlockEnum.TemplateTransform: {
+        const payload = data as TemplateTransformNodeType
+        if (payload.variables) {
+          payload.variables = payload.variables.map((v: any) => {
+            if (v.value_selector.join('.') === oldVarSelector.join('.'))
+              v.value_selector = newVarSelector
+            return v
+          })
+        }
+        break
+      }
+      case BlockEnum.QuestionClassifier: {
+        const payload = data as QuestionClassifierNodeType
+        if (payload.query_variable_selector.join('.') === oldVarSelector.join('.'))
+          payload.query_variable_selector = newVarSelector
+        payload.instruction = replaceOldVarInText(payload.instruction, oldVarSelector, newVarSelector)
+        break
+      }
+      case BlockEnum.HttpRequest: {
+        const payload = data as HttpNodeType
+        payload.url = replaceOldVarInText(payload.url, oldVarSelector, newVarSelector)
+        payload.headers = replaceOldVarInText(payload.headers, oldVarSelector, newVarSelector)
+        payload.params = replaceOldVarInText(payload.params, oldVarSelector, newVarSelector)
+        if (typeof payload.body.data === 'string') {
+          payload.body.data = replaceOldVarInText(payload.body.data, oldVarSelector, newVarSelector)
+        }
+        else {
+          payload.body.data = payload.body.data.map((d) => {
+            return {
+              ...d,
+              value: replaceOldVarInText(d.value || '', oldVarSelector, newVarSelector),
+            }
+          })
+        }
+        break
+      }
+      case BlockEnum.Tool: {
+        const payload = data as ToolNodeType
+        const hasShouldRenameVar = Object.keys(payload.tool_parameters)?.filter(key => payload.tool_parameters[key].type !== ToolVarType.constant)
+        if (hasShouldRenameVar) {
+          Object.keys(payload.tool_parameters).forEach((key) => {
+            const value = payload.tool_parameters[key]
+            const { type } = value
+            if (type === ToolVarType.variable) {
+              payload.tool_parameters[key] = {
+                ...value,
+                value: newVarSelector,
+              }
+            }
+
+            if (type === ToolVarType.mixed) {
+              payload.tool_parameters[key] = {
+                ...value,
+                value: replaceOldVarInText(payload.tool_parameters[key].value as string, oldVarSelector, newVarSelector),
+              }
+            }
+          })
+        }
+        break
+      }
+      case BlockEnum.VariableAssigner: {
+        const payload = data as VariableAssignerNodeType
+        if (payload.variables) {
+          payload.variables = payload.variables.map((v) => {
+            if (v.join('.') === oldVarSelector.join('.'))
+              v = newVarSelector
+            return v
+          })
+        }
+        break
+      }
+      // eslint-disable-next-line sonarjs/no-duplicated-branches
+      case BlockEnum.VariableAggregator: {
+        const payload = data as VariableAssignerNodeType
+        if (payload.variables) {
+          payload.variables = payload.variables.map((v) => {
+            if (v.join('.') === oldVarSelector.join('.'))
+              v = newVarSelector
+            return v
+          })
+        }
+        break
+      }
+      case BlockEnum.ParameterExtractor: {
+        const payload = data as ParameterExtractorNodeType
+        if (payload.query.join('.') === oldVarSelector.join('.'))
+          payload.query = newVarSelector
+        payload.instruction = replaceOldVarInText(payload.instruction, oldVarSelector, newVarSelector)
+        break
+      }
+      case BlockEnum.Iteration: {
+        const payload = data as IterationNodeType
+        if (payload.iterator_selector.join('.') === oldVarSelector.join('.'))
+          payload.iterator_selector = newVarSelector
+
+        break
+      }
+      case BlockEnum.Loop: {
+        const payload = data as LoopNodeType
+        if (payload.break_conditions) {
+          payload.break_conditions = payload.break_conditions.map((c) => {
+            if (c.variable_selector?.join('.') === oldVarSelector.join('.'))
+              c.variable_selector = newVarSelector
+            return c
+          })
+        }
+        break
+      }
+      case BlockEnum.ListFilter: {
+        const payload = data as ListFilterNodeType
+        if (payload.variable.join('.') === oldVarSelector.join('.'))
+          payload.variable = newVarSelector
+        break
+      }
+    }
+  })
+  return newNode
+}
+
+const varToValueSelectorList = (v: Var, parentValueSelector: ValueSelector, res: ValueSelector[]) => {
+  if (!v.variable)
+    return
+
+  res.push([...parentValueSelector, v.variable])
+  const isStructuredOutput = !!(v.children as StructuredOutput)?.schema?.properties
+
+  if ((v.children as Var[])?.length > 0) {
+    (v.children as Var[]).forEach((child) => {
+      varToValueSelectorList(child, [...parentValueSelector, v.variable], res)
+    })
+  }
+  if (isStructuredOutput) {
+    Object.keys((v.children as StructuredOutput)?.schema?.properties || {}).forEach((key) => {
+      const type = (v.children as StructuredOutput)?.schema?.properties[key].type
+      const isArray = type === Type.array
+      const arrayType = (v.children as StructuredOutput)?.schema?.properties[key].items?.type
+      varToValueSelectorList({
+        variable: key,
+        type: structTypeToVarType(isArray ? arrayType! : type, isArray),
+      }, [...parentValueSelector, v.variable], res)
+    })
+  }
+}
+
+const varsToValueSelectorList = (vars: Var | Var[], parentValueSelector: ValueSelector, res: ValueSelector[]) => {
+  if (Array.isArray(vars)) {
+    vars.forEach((v) => {
+      varToValueSelectorList(v, parentValueSelector, res)
+    })
+  }
+  varToValueSelectorList(vars as Var, parentValueSelector, res)
+}
+
+export const getNodeOutputVars = (node: Node, isChatMode: boolean): ValueSelector[] => {
+  const { data, id } = node
+  const { type } = data
+  let res: ValueSelector[] = []
+
+  switch (type) {
+    case BlockEnum.Start: {
+      const {
+        variables,
+      } = data as StartNodeType
+      res = variables.map((v) => {
+        return [id, v.variable]
+      })
+
+      if (isChatMode) {
+        res.push([id, 'sys', 'query'])
+        res.push([id, 'sys', 'files'])
+      }
+      break
+    }
+
+    case BlockEnum.LLM: {
+      const vars = [...LLM_OUTPUT_STRUCT]
+      const llmNodeData = data as LLMNodeType
+      if (llmNodeData.structured_output_enabled && llmNodeData.structured_output?.schema?.properties && Object.keys(llmNodeData.structured_output.schema.properties).length > 0) {
+        vars.push({
+          variable: 'structured_output',
+          type: VarType.object,
+          children: llmNodeData.structured_output,
+        })
+      }
+      varsToValueSelectorList(vars, [id], res)
+      break
+    }
+
+    case BlockEnum.KnowledgeRetrieval: {
+      varsToValueSelectorList(KNOWLEDGE_RETRIEVAL_OUTPUT_STRUCT, [id], res)
+      break
+    }
+
+    case BlockEnum.Code: {
+      const {
+        outputs,
+      } = data as CodeNodeType
+      Object.keys(outputs).forEach((key) => {
+        res.push([id, key])
+      })
+      break
+    }
+
+    case BlockEnum.TemplateTransform: {
+      varsToValueSelectorList(TEMPLATE_TRANSFORM_OUTPUT_STRUCT, [id], res)
+      break
+    }
+
+    case BlockEnum.QuestionClassifier: {
+      varsToValueSelectorList(QUESTION_CLASSIFIER_OUTPUT_STRUCT, [id], res)
+      break
+    }
+
+    case BlockEnum.HttpRequest: {
+      varsToValueSelectorList(HTTP_REQUEST_OUTPUT_STRUCT, [id], res)
+      break
+    }
+
+    case BlockEnum.VariableAssigner: {
+      res.push([id, 'output'])
+      break
+    }
+
+    case BlockEnum.VariableAggregator: {
+      res.push([id, 'output'])
+      break
+    }
+
+    case BlockEnum.Tool: {
+      varsToValueSelectorList(TOOL_OUTPUT_STRUCT, [id], res)
+      break
+    }
+
+    case BlockEnum.ParameterExtractor: {
+      const {
+        parameters,
+      } = data as ParameterExtractorNodeType
+      if (parameters?.length > 0) {
+        parameters.forEach((p) => {
+          res.push([id, p.name])
+        })
+      }
+
+      break
+    }
+
+    case BlockEnum.Iteration: {
+      res.push([id, 'output'])
+      break
+    }
+
+    case BlockEnum.Loop: {
+      res.push([id, 'output'])
+      break
+    }
+
+    case BlockEnum.DocExtractor: {
+      res.push([id, 'text'])
+      break
+    }
+
+    case BlockEnum.ListFilter: {
+      res.push([id, 'result'])
+      res.push([id, 'first_record'])
+      res.push([id, 'last_record'])
+      break
+    }
+  }
+
+  return res
+}
diff --git a/app/components/workflow/nodes/_base/components/variable/var-full-path-panel.tsx b/app/components/workflow/nodes/_base/components/variable/var-full-path-panel.tsx
new file mode 100644
index 0000000..54e27b5
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/var-full-path-panel.tsx
@@ -0,0 +1,59 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { Field, StructuredOutput, TypeWithArray } from '../../../llm/types'
+import { Type } from '../../../llm/types'
+import { PickerPanelMain as Panel } from '@/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/picker'
+import BlockIcon from '@/app/components/workflow/block-icon'
+import { BlockEnum } from '@/app/components/workflow/types'
+
+type Props = {
+  nodeName: string
+  path: string[]
+  varType: TypeWithArray
+  nodeType?: BlockEnum
+}
+
+const VarFullPathPanel: FC<Props> = ({
+  nodeName,
+  path,
+  varType,
+  nodeType = BlockEnum.LLM,
+}) => {
+  const schema: StructuredOutput = (() => {
+    const schema: StructuredOutput['schema'] = {
+      type: Type.object,
+      properties: {} as { [key: string]: Field },
+      required: [],
+      additionalProperties: false,
+    }
+    let current = schema
+    for (let i = 1; i < path.length; i++) {
+      const isLast = i === path.length - 1
+      const name = path[i]
+      current.properties[name] = {
+        type: isLast ? varType : Type.object,
+        properties: {},
+      } as Field
+      current = current.properties[name] as { type: Type.object; properties: { [key: string]: Field; }; required: never[]; additionalProperties: false; }
+    }
+    return {
+      schema,
+    }
+  })()
+  return (
+    <div className='w-[280px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur pb-0 shadow-lg backdrop-blur-[5px]'>
+      <div className='flex space-x-1 border-b-[0.5px] border-divider-subtle p-3 pb-2 '>
+        <BlockIcon size='xs' type={nodeType} />
+        <div className='system-xs-medium w-0 grow truncate text-text-secondary'>{nodeName}</div>
+      </div>
+      <Panel
+        className='px-1 pb-3 pt-2'
+        root={{ attrName: path[0] }}
+        payload={schema}
+        readonly
+      />
+    </div>
+  )
+}
+export default React.memo(VarFullPathPanel)
diff --git a/app/components/workflow/nodes/_base/components/variable/var-list.tsx b/app/components/workflow/nodes/_base/components/variable/var-list.tsx
new file mode 100644
index 0000000..72e9384
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/var-list.tsx
@@ -0,0 +1,109 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import RemoveButton from '../remove-button'
+import VarReferencePicker from './var-reference-picker'
+import Input from '@/app/components/base/input'
+import type { ValueSelector, Var, Variable } from '@/app/components/workflow/types'
+import { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types'
+
+type Props = {
+  nodeId: string
+  readonly: boolean
+  list: Variable[]
+  onChange: (list: Variable[]) => void
+  onVarNameChange?: (oldName: string, newName: string) => void
+  isSupportConstantValue?: boolean
+  onlyLeafNodeVar?: boolean
+  filterVar?: (payload: Var, valueSelector: ValueSelector) => boolean
+  isSupportFileVar?: boolean
+}
+
+const VarList: FC<Props> = ({
+  nodeId,
+  readonly,
+  list,
+  onChange,
+  onVarNameChange,
+  isSupportConstantValue,
+  onlyLeafNodeVar,
+  filterVar,
+  isSupportFileVar = true,
+}) => {
+  const { t } = useTranslation()
+
+  const handleVarNameChange = useCallback((index: number) => {
+    return (e: React.ChangeEvent<HTMLInputElement>) => {
+      onVarNameChange?.(list[index].variable, e.target.value)
+      const newList = produce(list, (draft) => {
+        draft[index].variable = e.target.value
+      })
+      onChange(newList)
+    }
+  }, [list, onVarNameChange, onChange])
+
+  const handleVarReferenceChange = useCallback((index: number) => {
+    return (value: ValueSelector | string, varKindType: VarKindType) => {
+      const newList = produce(list, (draft) => {
+        if (!isSupportConstantValue || varKindType === VarKindType.variable) {
+          draft[index].value_selector = value as ValueSelector
+          if (isSupportConstantValue)
+            draft[index].variable_type = VarKindType.variable
+
+          if (!draft[index].variable)
+            draft[index].variable = value[value.length - 1]
+        }
+        else {
+          draft[index].variable_type = VarKindType.constant
+          draft[index].value_selector = value as ValueSelector
+          draft[index].value = value as string
+        }
+      })
+      onChange(newList)
+    }
+  }, [isSupportConstantValue, list, onChange])
+
+  const handleVarRemove = useCallback((index: number) => {
+    return () => {
+      const newList = produce(list, (draft) => {
+        draft.splice(index, 1)
+      })
+      onChange(newList)
+    }
+  }, [list, onChange])
+
+  return (
+    <div className='space-y-2'>
+      {list.map((item, index) => (
+        <div className='flex items-center space-x-1' key={index}>
+          <Input
+            wrapperClassName='w-[120px]'
+            disabled={readonly}
+            value={list[index].variable}
+            onChange={handleVarNameChange(index)}
+            placeholder={t('workflow.common.variableNamePlaceholder')!}
+          />
+          <VarReferencePicker
+            nodeId={nodeId}
+            readonly={readonly}
+            isShowNodeName
+            className='grow'
+            value={item.variable_type === VarKindType.constant ? (item.value || '') : (item.value_selector || [])}
+            isSupportConstantValue={isSupportConstantValue}
+            onChange={handleVarReferenceChange(index)}
+            defaultVarKindType={item.variable_type}
+            onlyLeafNodeVar={onlyLeafNodeVar}
+            filterVar={filterVar}
+            isSupportFileVar={isSupportFileVar}
+          />
+          {!readonly && (
+            <RemoveButton onClick={handleVarRemove(index)}/>
+          )}
+        </div>
+      ))}
+    </div>
+  )
+}
+export default React.memo(VarList)
diff --git a/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx b/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx
new file mode 100644
index 0000000..789da34
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx
@@ -0,0 +1,447 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowDownSLine,
+  RiCloseLine,
+  RiErrorWarningFill,
+  RiMoreLine,
+} from '@remixicon/react'
+import produce from 'immer'
+import { useStoreApi } from 'reactflow'
+import RemoveButton from '../remove-button'
+import useAvailableVarList from '../../hooks/use-available-var-list'
+import VarReferencePopup from './var-reference-popup'
+import { getNodeInfoById, isConversationVar, isENV, isSystemVar, varTypeToStructType } from './utils'
+import ConstantField from './constant-field'
+import cn from '@/utils/classnames'
+import type { Node, NodeOutPutVar, ValueSelector, Var } from '@/app/components/workflow/types'
+import type { CredentialFormSchema } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { BlockEnum } from '@/app/components/workflow/types'
+import { VarBlockIcon } from '@/app/components/workflow/block-icon'
+import { Line3 } from '@/app/components/base/icons/src/public/common'
+import { BubbleX, Env } from '@/app/components/base/icons/src/vender/line/others'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import {
+  useIsChatMode,
+  useWorkflowVariables,
+} from '@/app/components/workflow/hooks'
+import { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types'
+import TypeSelector from '@/app/components/workflow/nodes/_base/components/selector'
+import AddButton from '@/app/components/base/button/add-button'
+import Badge from '@/app/components/base/badge'
+import Tooltip from '@/app/components/base/tooltip'
+import { isExceptionVariable } from '@/app/components/workflow/utils'
+import VarFullPathPanel from './var-full-path-panel'
+import { noop } from 'lodash-es'
+
+const TRIGGER_DEFAULT_WIDTH = 227
+
+type Props = {
+  className?: string
+  nodeId: string
+  isShowNodeName?: boolean
+  readonly: boolean
+  value: ValueSelector | string
+  onChange: (value: ValueSelector | string, varKindType: VarKindType, varInfo?: Var) => void
+  onOpen?: () => void
+  isSupportConstantValue?: boolean
+  defaultVarKindType?: VarKindType
+  onlyLeafNodeVar?: boolean
+  filterVar?: (payload: Var, valueSelector: ValueSelector) => boolean
+  availableNodes?: Node[]
+  availableVars?: NodeOutPutVar[]
+  isAddBtnTrigger?: boolean
+  schema?: Partial<CredentialFormSchema>
+  valueTypePlaceHolder?: string
+  isInTable?: boolean
+  onRemove?: () => void
+  typePlaceHolder?: string
+  isSupportFileVar?: boolean
+  placeholder?: string
+  minWidth?: number
+  popupFor?: 'assigned' | 'toAssigned'
+  zIndex?: number
+}
+
+const DEFAULT_VALUE_SELECTOR: Props['value'] = []
+
+const VarReferencePicker: FC<Props> = ({
+  nodeId,
+  readonly,
+  className,
+  isShowNodeName = true,
+  value = DEFAULT_VALUE_SELECTOR,
+  onOpen = noop,
+  onChange,
+  isSupportConstantValue,
+  defaultVarKindType = VarKindType.constant,
+  onlyLeafNodeVar,
+  filterVar = () => true,
+  availableNodes: passedInAvailableNodes,
+  availableVars: passedInAvailableVars,
+  isAddBtnTrigger,
+  schema,
+  valueTypePlaceHolder,
+  isInTable,
+  onRemove,
+  typePlaceHolder,
+  isSupportFileVar = true,
+  placeholder,
+  minWidth,
+  popupFor,
+  zIndex,
+}) => {
+  const { t } = useTranslation()
+  const store = useStoreApi()
+  const {
+    getNodes,
+  } = store.getState()
+  const isChatMode = useIsChatMode()
+
+  const { getCurrentVariableType } = useWorkflowVariables()
+  const { availableVars, availableNodesWithParent: availableNodes } = useAvailableVarList(nodeId, {
+    onlyLeafNodeVar,
+    passedInAvailableNodes,
+    filterVar,
+  })
+  const startNode = availableNodes.find((node: any) => {
+    return node.data.type === BlockEnum.Start
+  })
+
+  const node = getNodes().find(n => n.id === nodeId)
+  const isInIteration = !!node?.data.isInIteration
+  const iterationNode = isInIteration ? getNodes().find(n => n.id === node.parentId) : null
+
+  const isInLoop = !!node?.data.isInLoop
+  const loopNode = isInLoop ? getNodes().find(n => n.id === node.parentId) : null
+
+  const triggerRef = useRef<HTMLDivElement>(null)
+  const [triggerWidth, setTriggerWidth] = useState(TRIGGER_DEFAULT_WIDTH)
+  useEffect(() => {
+    if (triggerRef.current)
+      setTriggerWidth(triggerRef.current.clientWidth)
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [triggerRef.current])
+
+  const [varKindType, setVarKindType] = useState<VarKindType>(defaultVarKindType)
+  const isConstant = isSupportConstantValue && varKindType === VarKindType.constant
+
+  const outputVars = useMemo(() => (passedInAvailableVars || availableVars), [passedInAvailableVars, availableVars])
+
+  const [open, setOpen] = useState(false)
+  useEffect(() => {
+    onOpen()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [open])
+  const hasValue = !isConstant && value.length > 0
+
+  const isIterationVar = useMemo(() => {
+    if (!isInIteration)
+      return false
+    if (value[0] === node?.parentId && ['item', 'index'].includes(value[1]))
+      return true
+    return false
+  }, [isInIteration, value, node])
+
+  const isLoopVar = useMemo(() => {
+    if (!isInLoop)
+      return false
+    if (value[0] === node?.parentId && ['item', 'index'].includes(value[1]))
+      return true
+    return false
+  }, [isInLoop, value, node])
+
+  const outputVarNodeId = hasValue ? value[0] : ''
+  const outputVarNode = useMemo(() => {
+    if (!hasValue || isConstant)
+      return null
+
+    if (isIterationVar)
+      return iterationNode?.data
+
+    if (isLoopVar)
+      return loopNode?.data
+
+    if (isSystemVar(value as ValueSelector))
+      return startNode?.data
+
+    return getNodeInfoById(availableNodes, outputVarNodeId)?.data
+  }, [value, hasValue, isConstant, isIterationVar, iterationNode, availableNodes, outputVarNodeId, startNode, isLoopVar, loopNode])
+
+  const isShowAPart = (value as ValueSelector).length > 2
+
+  const varName = useMemo(() => {
+    if (!hasValue)
+      return ''
+
+    const isSystem = isSystemVar(value as ValueSelector)
+    const varName = Array.isArray(value) ? value[(value as ValueSelector).length - 1] : ''
+    return `${isSystem ? 'sys.' : ''}${varName}`
+  }, [hasValue, value])
+
+  const varKindTypes = [
+    {
+      label: 'Variable',
+      value: VarKindType.variable,
+    },
+    {
+      label: 'Constant',
+      value: VarKindType.constant,
+    },
+  ]
+
+  const handleVarKindTypeChange = useCallback((value: VarKindType) => {
+    setVarKindType(value)
+    if (value === VarKindType.constant)
+      onChange('', value)
+    else
+      onChange([], value)
+  }, [onChange])
+
+  const inputRef = useRef<HTMLInputElement>(null)
+  const [isFocus, setIsFocus] = useState(false)
+  const [controlFocus, setControlFocus] = useState(0)
+  useEffect(() => {
+    if (controlFocus && inputRef.current) {
+      inputRef.current.focus()
+      setIsFocus(true)
+    }
+  }, [controlFocus])
+
+  const handleVarReferenceChange = useCallback((value: ValueSelector, varInfo: Var) => {
+    // sys var not passed to backend
+    const newValue = produce(value, (draft) => {
+      if (draft[1] && draft[1].startsWith('sys.')) {
+        draft.shift()
+        const paths = draft[0].split('.')
+        paths.forEach((p, i) => {
+          draft[i] = p
+        })
+      }
+    })
+    onChange(newValue, varKindType, varInfo)
+    setOpen(false)
+  }, [onChange, varKindType])
+
+  const handleClearVar = useCallback(() => {
+    if (varKindType === VarKindType.constant)
+      onChange('', varKindType)
+    else
+      onChange([], varKindType)
+  }, [onChange, varKindType])
+
+  const type = getCurrentVariableType({
+    parentNode: isInIteration ? iterationNode : loopNode,
+    valueSelector: value as ValueSelector,
+    availableNodes,
+    isChatMode,
+    isConstant: !!isConstant,
+  })
+
+  const { isEnv, isChatVar, isValidVar, isException } = useMemo(() => {
+    const isEnv = isENV(value as ValueSelector)
+    const isChatVar = isConversationVar(value as ValueSelector)
+    const isValidVar = Boolean(outputVarNode) || isEnv || isChatVar
+    const isException = isExceptionVariable(varName, outputVarNode?.type)
+    return {
+      isEnv,
+      isChatVar,
+      isValidVar,
+      isException,
+    }
+  }, [value, outputVarNode, varName])
+
+  // 8(left/right-padding) + 14(icon) + 4 + 14 + 2 = 42 + 17 buff
+  const availableWidth = triggerWidth - 56
+  const [maxNodeNameWidth, maxVarNameWidth, maxTypeWidth] = (() => {
+    const totalTextLength = ((outputVarNode?.title || '') + (varName || '') + (type || '')).length
+    const PRIORITY_WIDTH = 15
+    const maxNodeNameWidth = PRIORITY_WIDTH + Math.floor((outputVarNode?.title?.length || 0) / totalTextLength * availableWidth)
+    const maxVarNameWidth = -PRIORITY_WIDTH + Math.floor((varName?.length || 0) / totalTextLength * availableWidth)
+    const maxTypeWidth = Math.floor((type?.length || 0) / totalTextLength * availableWidth)
+    return [maxNodeNameWidth, maxVarNameWidth, maxTypeWidth]
+  })()
+
+  const WrapElem = isSupportConstantValue ? 'div' : PortalToFollowElemTrigger
+  const VarPickerWrap = !isSupportConstantValue ? 'div' : PortalToFollowElemTrigger
+
+  const tooltipPopup = useMemo(() => {
+    if (isValidVar && isShowAPart) {
+      return (
+        <VarFullPathPanel
+          nodeName={outputVarNode?.title}
+          path={(value as ValueSelector).slice(1)}
+          varType={varTypeToStructType(type)}
+          nodeType={outputVarNode?.type}
+        />)
+    }
+    if (!isValidVar && hasValue)
+      return t('workflow.errorMsg.invalidVariable')
+
+    return null
+  }, [isValidVar, isShowAPart, hasValue, t, outputVarNode?.title, outputVarNode?.type, value, type])
+  return (
+    <div className={cn(className, !readonly && 'cursor-pointer')}>
+      <PortalToFollowElem
+        open={open}
+        onOpenChange={setOpen}
+        placement={isAddBtnTrigger ? 'bottom-end' : 'bottom-start'}
+      >
+        <WrapElem onClick={() => {
+          if (readonly)
+            return
+          !isConstant ? setOpen(!open) : setControlFocus(Date.now())
+        }} className='group/picker-trigger-wrap relative !flex'>
+          <>
+            {isAddBtnTrigger
+              ? (
+                <div>
+                  <AddButton onClick={noop}></AddButton>
+                </div>
+              )
+              : (<div ref={!isSupportConstantValue ? triggerRef : null} className={cn((open || isFocus) ? 'border-gray-300' : 'border-gray-100', 'group/wrap relative flex h-8 w-full items-center', !isSupportConstantValue && 'rounded-lg bg-components-input-bg-normal p-1', isInTable && 'border-none bg-transparent', readonly && 'bg-components-input-bg-disabled')}>
+                {isSupportConstantValue
+                  ? <div onClick={(e) => {
+                    e.stopPropagation()
+                    setOpen(false)
+                    setControlFocus(Date.now())
+                  }} className='mr-1 flex h-full items-center space-x-1'>
+                    <TypeSelector
+                      noLeft
+                      trigger={
+                        <div className='radius-md flex h-8 items-center bg-components-input-bg-normal px-2'>
+                          <div className='system-sm-regular mr-1 text-components-input-text-filled'>{varKindTypes.find(item => item.value === varKindType)?.label}</div>
+                          <RiArrowDownSLine className='h-4 w-4 text-text-quaternary' />
+                        </div>
+                      }
+                      popupClassName='top-8'
+                      readonly={readonly}
+                      value={varKindType}
+                      options={varKindTypes}
+                      onChange={handleVarKindTypeChange}
+                      showChecked
+                    />
+                  </div>
+                  : (!hasValue && <div className='ml-1.5 mr-1'>
+                    <Variable02 className={`h-4 w-4 ${readonly ? 'text-components-input-text-disabled' : 'text-components-input-text-placeholder'}`} />
+                  </div>)}
+                {isConstant
+                  ? (
+                    <ConstantField
+                      value={value as string}
+                      onChange={onChange as ((value: string | number, varKindType: VarKindType, varInfo?: Var) => void)}
+                      schema={schema as CredentialFormSchema}
+                      readonly={readonly}
+                    />
+                  )
+                  : (
+                    <VarPickerWrap
+                      onClick={() => {
+                        if (readonly)
+                          return
+                        !isConstant ? setOpen(!open) : setControlFocus(Date.now())
+                      }}
+                      className='h-full grow'
+                    >
+                      <div ref={isSupportConstantValue ? triggerRef : null} className={cn('h-full', isSupportConstantValue && 'flex items-center rounded-lg bg-components-panel-bg py-1 pl-1')}>
+                        <Tooltip noDecoration={isShowAPart} popupContent={tooltipPopup}>
+                          <div className={cn('h-full items-center rounded-[5px] px-1.5', hasValue ? 'inline-flex bg-components-badge-white-to-dark' : 'flex')}>
+                            {hasValue
+                              ? (
+                                <>
+                                  {isShowNodeName && !isEnv && !isChatVar && (
+                                    <div className='flex items-center'>
+                                      <div className='h-3 px-[1px]'>
+                                        {outputVarNode?.type && <VarBlockIcon
+                                          className='!text-text-primary'
+                                          type={outputVarNode.type}
+                                        />}
+                                      </div>
+                                      <div className='mx-0.5 truncate text-xs font-medium text-text-secondary' title={outputVarNode?.title} style={{
+                                        maxWidth: maxNodeNameWidth,
+                                      }}>{outputVarNode?.title}</div>
+                                      <Line3 className='mr-0.5'></Line3>
+                                    </div>
+                                  )}
+                                  {isShowAPart && (
+                                    <div className='flex items-center'>
+                                      <RiMoreLine className='h-3 w-3 text-text-secondary' />
+                                      <Line3 className='mr-0.5 text-divider-deep'></Line3>
+                                    </div>
+                                  )}
+                                  <div className='flex items-center text-text-accent'>
+                                    {!hasValue && <Variable02 className='h-3.5 w-3.5' />}
+                                    {isEnv && <Env className='h-3.5 w-3.5 text-util-colors-violet-violet-600' />}
+                                    {isChatVar && <BubbleX className='h-3.5 w-3.5 text-util-colors-teal-teal-700' />}
+                                    <div className={cn('ml-0.5 truncate text-xs font-medium', isEnv && '!text-text-secondary', isChatVar && 'text-util-colors-teal-teal-700', isException && 'text-text-warning')} title={varName} style={{
+                                      maxWidth: maxVarNameWidth,
+                                    }}>{varName}</div>
+                                  </div>
+                                  <div className='system-xs-regular ml-0.5 truncate text-center capitalize text-text-tertiary' title={type} style={{
+                                    maxWidth: maxTypeWidth,
+                                  }}>{type}</div>
+                                  {!isValidVar && <RiErrorWarningFill className='ml-0.5 h-3 w-3 text-text-destructive' />}
+                                </>
+                              )
+                              : <div className={`overflow-hidden ${readonly ? 'text-components-input-text-disabled' : 'text-components-input-text-placeholder'} system-sm-regular text-ellipsis`}>{placeholder ?? t('workflow.common.setVarValuePlaceholder')}</div>}
+                          </div>
+                        </Tooltip>
+                      </div>
+
+                    </VarPickerWrap>
+                  )}
+                {(hasValue && !readonly && !isInTable) && (<div
+                  className='group invisible absolute right-1 top-[50%] h-5 translate-y-[-50%] cursor-pointer rounded-md p-1 hover:bg-state-base-hover group-hover/wrap:visible'
+                  onClick={handleClearVar}
+                >
+                  <RiCloseLine className='h-3.5 w-3.5 text-text-tertiary group-hover:text-text-secondary' />
+                </div>)}
+                {!hasValue && valueTypePlaceHolder && (
+                  <Badge
+                    className=' absolute right-1 top-[50%] translate-y-[-50%] capitalize'
+                    text={valueTypePlaceHolder}
+                    uppercase={false}
+                  />
+                )}
+              </div>)}
+            {!readonly && isInTable && (
+              <RemoveButton
+                className='absolute right-1 top-0.5 hidden group-hover/picker-trigger-wrap:block'
+                onClick={() => onRemove?.()}
+              />
+            )}
+
+            {!hasValue && typePlaceHolder && (
+              <Badge
+                className='absolute right-2 top-1.5'
+                text={typePlaceHolder}
+                uppercase={false}
+              />
+            )}
+          </>
+        </WrapElem>
+        <PortalToFollowElemContent style={{
+          zIndex: zIndex || 100,
+        }} className='mt-1'>
+          {!isConstant && (
+            <VarReferencePopup
+              vars={outputVars}
+              popupFor={popupFor}
+              onChange={handleVarReferenceChange}
+              itemWidth={isAddBtnTrigger ? 260 : (minWidth || triggerWidth)}
+              isSupportFileVar={isSupportFileVar}
+            />
+          )}
+        </PortalToFollowElemContent>
+      </PortalToFollowElem>
+    </div >
+  )
+}
+export default React.memo(VarReferencePicker)
diff --git a/app/components/workflow/nodes/_base/components/variable/var-reference-popup.tsx b/app/components/workflow/nodes/_base/components/variable/var-reference-popup.tsx
new file mode 100644
index 0000000..e35977a
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/var-reference-popup.tsx
@@ -0,0 +1,65 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import VarReferenceVars from './var-reference-vars'
+import type { NodeOutPutVar, ValueSelector, Var } from '@/app/components/workflow/types'
+import ListEmpty from '@/app/components/base/list-empty'
+import { LanguagesSupported } from '@/i18n/language'
+import I18n from '@/context/i18n'
+
+type Props = {
+  vars: NodeOutPutVar[]
+  popupFor?: 'assigned' | 'toAssigned'
+  onChange: (value: ValueSelector, varDetail: Var) => void
+  itemWidth?: number
+  isSupportFileVar?: boolean
+}
+const VarReferencePopup: FC<Props> = ({
+  vars,
+  popupFor,
+  onChange,
+  itemWidth,
+  isSupportFileVar = true,
+}) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  // max-h-[300px] overflow-y-auto todo: use portal to handle long list
+  return (
+    <div className='space-y-1 rounded-lg border border-components-panel-border bg-components-panel-bg p-1 shadow-lg' style={{
+      width: itemWidth || 228,
+    }}>
+      {((!vars || vars.length === 0) && popupFor)
+        ? (popupFor === 'toAssigned'
+          ? (
+            <ListEmpty
+              title={t('workflow.variableReference.noAvailableVars') || ''}
+              description={<div className='system-xs-regular text-text-tertiary'>
+                {t('workflow.variableReference.noVarsForOperation')}
+              </div>}
+            />
+          )
+          : (
+            <ListEmpty
+              title={t('workflow.variableReference.noAssignedVars') || ''}
+              description={<div className='system-xs-regular text-text-tertiary'>
+                {t('workflow.variableReference.assignedVarsDescription')}
+                <a target='_blank' rel='noopener noreferrer'
+                  className='text-text-accent-secondary'
+                  href={locale !== LanguagesSupported[1] ? 'https://docs.dify.ai/guides/workflow/variables#conversation-variables' : `https://docs.dify.ai/${locale.toLowerCase()}/guides/workflow/variables#hui-hua-bian-liang`}>{t('workflow.variableReference.conversationVars')}</a>
+              </div>}
+            />
+          ))
+        : <VarReferenceVars
+          searchBoxClassName='mt-1'
+          vars={vars}
+          onChange={onChange}
+          itemWidth={itemWidth}
+          isSupportFileVar={isSupportFileVar}
+        />
+      }
+    </div >
+  )
+}
+export default React.memo(VarReferencePopup)
diff --git a/app/components/workflow/nodes/_base/components/variable/var-reference-vars.tsx b/app/components/workflow/nodes/_base/components/variable/var-reference-vars.tsx
new file mode 100644
index 0000000..023916e
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/var-reference-vars.tsx
@@ -0,0 +1,367 @@
+'use client'
+import type { FC } from 'react'
+import React, { useEffect, useMemo, useRef, useState } from 'react'
+import { useHover } from 'ahooks'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+import { type NodeOutPutVar, type ValueSelector, type Var, VarType } from '@/app/components/workflow/types'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import { ChevronRight } from '@/app/components/base/icons/src/vender/line/arrows'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Input from '@/app/components/base/input'
+import { BubbleX, Env } from '@/app/components/base/icons/src/vender/line/others'
+import { checkKeys } from '@/utils/var'
+import type { StructuredOutput } from '../../../llm/types'
+import { Type } from '../../../llm/types'
+import PickerStructurePanel from '@/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/picker'
+import { varTypeToStructType } from './utils'
+import type { Field } from '@/app/components/workflow/nodes/llm/types'
+import { FILE_STRUCT } from '@/app/components/workflow/constants'
+import { Loop } from '@/app/components/base/icons/src/vender/workflow'
+import { noop } from 'lodash-es'
+
+type ObjectChildrenProps = {
+  nodeId: string
+  title: string
+  data: Var[]
+  objPath: string[]
+  onChange: (value: ValueSelector, item: Var) => void
+  onHovering?: (value: boolean) => void
+  itemWidth?: number
+  isSupportFileVar?: boolean
+}
+
+type ItemProps = {
+  nodeId: string
+  title: string
+  objPath: string[]
+  itemData: Var
+  onChange: (value: ValueSelector, item: Var) => void
+  onHovering?: (value: boolean) => void
+  itemWidth?: number
+  isSupportFileVar?: boolean
+  isException?: boolean
+  isLoopVar?: boolean
+}
+
+const objVarTypes = [VarType.object, VarType.file]
+
+const Item: FC<ItemProps> = ({
+  nodeId,
+  title,
+  objPath,
+  itemData,
+  onChange,
+  onHovering,
+  isSupportFileVar,
+  isException,
+  isLoopVar,
+}) => {
+  const isStructureOutput = itemData.type === VarType.object && (itemData.children as StructuredOutput)?.schema?.properties
+  const isFile = itemData.type === VarType.file && !isStructureOutput
+  const isObj = ([VarType.object, VarType.file].includes(itemData.type) && itemData.children && (itemData.children as Var[]).length > 0)
+  const isSys = itemData.variable.startsWith('sys.')
+  const isEnv = itemData.variable.startsWith('env.')
+  const isChatVar = itemData.variable.startsWith('conversation.')
+
+  const objStructuredOutput: StructuredOutput | null = useMemo(() => {
+    if (!isObj) return null
+    const properties: Record<string, Field> = {};
+    (isFile ? FILE_STRUCT : (itemData.children as Var[])).forEach((c) => {
+      properties[c.variable] = {
+        type: varTypeToStructType(c.type),
+      }
+    })
+    return {
+      schema: {
+        type: Type.object,
+        properties,
+        required: [],
+        additionalProperties: false,
+      },
+    }
+  }, [isFile, isObj, itemData.children])
+
+  const structuredOutput = (() => {
+    if (isStructureOutput)
+      return itemData.children as StructuredOutput
+    return objStructuredOutput
+  })()
+
+  const itemRef = useRef<HTMLDivElement>(null)
+  const [isItemHovering, setIsItemHovering] = useState(false)
+  useHover(itemRef, {
+    onChange: (hovering) => {
+      if (hovering) {
+        setIsItemHovering(true)
+      }
+      else {
+        if (isObj || isStructureOutput) {
+          setTimeout(() => {
+            setIsItemHovering(false)
+          }, 100)
+        }
+        else {
+          setIsItemHovering(false)
+        }
+      }
+    },
+  })
+  const [isChildrenHovering, setIsChildrenHovering] = useState(false)
+  const isHovering = isItemHovering || isChildrenHovering
+  const open = (isObj || isStructureOutput) && isHovering
+  useEffect(() => {
+    onHovering && onHovering(isHovering)
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isHovering])
+  const handleChosen = (e: React.MouseEvent) => {
+    e.stopPropagation()
+    if (!isSupportFileVar && isFile)
+      return
+
+    if (isSys || isEnv || isChatVar) { // system variable | environment variable | conversation variable
+      onChange([...objPath, ...itemData.variable.split('.')], itemData)
+    }
+    else {
+      onChange([nodeId, ...objPath, itemData.variable], itemData)
+    }
+  }
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={noop}
+      placement='left-start'
+    >
+      <PortalToFollowElemTrigger className='w-full'>
+        <div
+          ref={itemRef}
+          className={cn(
+            (isObj || isStructureOutput) ? ' pr-1' : 'pr-[18px]',
+            isHovering && ((isObj || isStructureOutput) ? 'bg-primary-50' : 'bg-state-base-hover'),
+            'relative flex h-6 w-full cursor-pointer items-center  rounded-md pl-3')
+          }
+          onClick={handleChosen}
+          onMouseDown={e => e.preventDefault()}
+        >
+          <div className='flex w-0 grow items-center'>
+            {!isEnv && !isChatVar && !isLoopVar && <Variable02 className={cn('h-3.5 w-3.5 shrink-0 text-text-accent', isException && 'text-text-warning')} />}
+            {isEnv && <Env className='h-3.5 w-3.5 shrink-0 text-util-colors-violet-violet-600' />}
+            {isChatVar && <BubbleX className='h-3.5 w-3.5 shrink-0 text-util-colors-teal-teal-700' />}
+            {isLoopVar && <Loop className='h-3.5 w-3.5 shrink-0 text-util-colors-cyan-cyan-500' />}
+            {!isEnv && !isChatVar && (
+              <div title={itemData.variable} className='system-sm-medium ml-1 w-0 grow truncate text-text-secondary'>{itemData.variable}</div>
+            )}
+            {isEnv && (
+              <div title={itemData.variable} className='system-sm-medium ml-1 w-0 grow truncate text-text-secondary'>{itemData.variable.replace('env.', '')}</div>
+            )}
+            {isChatVar && (
+              <div title={itemData.des} className='system-sm-medium ml-1 w-0 grow truncate text-text-secondary'>{itemData.variable.replace('conversation.', '')}</div>
+            )}
+          </div>
+          <div className='ml-1 shrink-0 text-xs font-normal capitalize text-text-tertiary'>{itemData.type}</div>
+          {
+            (isObj || isStructureOutput) && (
+              <ChevronRight className={cn('ml-0.5 h-3 w-3 text-text-quaternary', isHovering && 'text-text-tertiary')} />
+            )
+          }
+        </div >
+      </PortalToFollowElemTrigger >
+      <PortalToFollowElemContent style={{
+        zIndex: 100,
+      }}>
+        {(isStructureOutput || isObj) && (
+          <PickerStructurePanel
+            root={{ nodeId, nodeName: title, attrName: itemData.variable }}
+            payload={structuredOutput!}
+            onHovering={setIsChildrenHovering}
+            onSelect={(valueSelector) => {
+              onChange(valueSelector, itemData)
+            }}
+          />
+        )}
+      </PortalToFollowElemContent>
+    </PortalToFollowElem >
+  )
+}
+
+const ObjectChildren: FC<ObjectChildrenProps> = ({
+  title,
+  nodeId,
+  objPath,
+  data,
+  onChange,
+  onHovering,
+  itemWidth,
+  isSupportFileVar,
+}) => {
+  const currObjPath = objPath
+  const itemRef = useRef<HTMLDivElement>(null)
+  const [isItemHovering, setIsItemHovering] = useState(false)
+  useHover(itemRef, {
+    onChange: (hovering) => {
+      if (hovering) {
+        setIsItemHovering(true)
+      }
+      else {
+        setTimeout(() => {
+          setIsItemHovering(false)
+        }, 100)
+      }
+    },
+  })
+  const [isChildrenHovering, setIsChildrenHovering] = useState(false)
+  const isHovering = isItemHovering || isChildrenHovering
+  useEffect(() => {
+    onHovering && onHovering(isHovering)
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isHovering])
+  useEffect(() => {
+    onHovering && onHovering(isItemHovering)
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isItemHovering])
+  // absolute top-[-2px]
+  return (
+    <div ref={itemRef} className=' space-y-1 rounded-lg border border-gray-200 bg-white shadow-lg' style={{
+      right: itemWidth ? itemWidth - 10 : 215,
+      minWidth: 252,
+    }}>
+      <div className='flex h-[22px] items-center px-3 text-xs font-normal text-gray-700'><span className='text-gray-500'>{title}.</span>{currObjPath.join('.')}</div>
+      {
+        (data && data.length > 0)
+        && data.map((v, i) => (
+          <Item
+            key={i}
+            nodeId={nodeId}
+            title={title}
+            objPath={objPath}
+            itemData={v}
+            onChange={onChange}
+            onHovering={setIsChildrenHovering}
+            isSupportFileVar={isSupportFileVar}
+            isException={v.isException}
+          />
+        ))
+      }
+    </div>
+  )
+}
+
+type Props = {
+  hideSearch?: boolean
+  searchBoxClassName?: string
+  vars: NodeOutPutVar[]
+  isSupportFileVar?: boolean
+  onChange: (value: ValueSelector, item: Var) => void
+  itemWidth?: number
+  maxHeightClass?: string
+  onClose?: () => void
+  onBlur?: () => void
+}
+const VarReferenceVars: FC<Props> = ({
+  hideSearch,
+  searchBoxClassName,
+  vars,
+  isSupportFileVar,
+  onChange,
+  itemWidth,
+  maxHeightClass,
+  onClose,
+  onBlur,
+}) => {
+  const { t } = useTranslation()
+  const [searchText, setSearchText] = useState('')
+
+  const handleKeyDown = (e: React.KeyboardEvent) => {
+    if (e.key === 'Escape') {
+      e.preventDefault()
+      onClose?.()
+    }
+  }
+
+  const filteredVars = vars.filter((v) => {
+    const children = v.vars.filter(v => checkKeys([v.variable], false).isValid || v.variable.startsWith('sys.') || v.variable.startsWith('env.') || v.variable.startsWith('conversation.'))
+    return children.length > 0
+  }).filter((node) => {
+    if (!searchText)
+      return node
+    const children = node.vars.filter((v) => {
+      const searchTextLower = searchText.toLowerCase()
+      return v.variable.toLowerCase().includes(searchTextLower) || node.title.toLowerCase().includes(searchTextLower)
+    })
+    return children.length > 0
+  }).map((node) => {
+    let vars = node.vars.filter(v => checkKeys([v.variable], false).isValid || v.variable.startsWith('sys.') || v.variable.startsWith('env.') || v.variable.startsWith('conversation.'))
+    if (searchText) {
+      const searchTextLower = searchText.toLowerCase()
+      if (!node.title.toLowerCase().includes(searchTextLower))
+        vars = vars.filter(v => v.variable.toLowerCase().includes(searchText.toLowerCase()))
+    }
+
+    return {
+      ...node,
+      vars,
+    }
+  })
+
+  return (
+    <>
+      {
+        !hideSearch && (
+          <>
+            <div className={cn('var-search-input-wrapper mx-2 mb-1 mt-2', searchBoxClassName)} onClick={e => e.stopPropagation()}>
+              <Input
+                className='var-search-input'
+                showLeftIcon
+                showClearIcon
+                value={searchText}
+                placeholder={t('workflow.common.searchVar') || ''}
+                onChange={e => setSearchText(e.target.value)}
+                onKeyDown={handleKeyDown}
+                onClear={() => setSearchText('')}
+                onBlur={onBlur}
+                autoFocus
+              />
+            </div>
+            <div className='relative left-[-4px] h-[0.5px] bg-black/5' style={{
+              width: 'calc(100% + 8px)',
+            }}></div>
+          </>
+        )
+      }
+
+      {filteredVars.length > 0
+        ? <div className={cn('max-h-[85vh] overflow-y-auto', maxHeightClass)}>
+
+          {
+            filteredVars.map((item, i) => (
+              <div key={i}>
+                <div
+                  className='system-xs-medium-uppercase truncate px-3 leading-[22px] text-text-tertiary'
+                  title={item.title}
+                >{item.title}</div>
+                {item.vars.map((v, j) => (
+                  <Item
+                    key={j}
+                    title={item.title}
+                    nodeId={item.nodeId}
+                    objPath={[]}
+                    itemData={v}
+                    onChange={onChange}
+                    itemWidth={itemWidth}
+                    isSupportFileVar={isSupportFileVar}
+                    isException={v.isException}
+                    isLoopVar={item.isLoop}
+                  />
+                ))}
+              </div>))
+          }
+        </div>
+        : <div className='pl-3 text-xs font-medium uppercase leading-[18px] text-gray-500'>{t('workflow.common.noVar')}</div>}
+    </>
+  )
+}
+export default React.memo(VarReferenceVars)
diff --git a/app/components/workflow/nodes/_base/components/variable/var-type-picker.tsx b/app/components/workflow/nodes/_base/components/variable/var-type-picker.tsx
new file mode 100644
index 0000000..926d7ac
--- /dev/null
+++ b/app/components/workflow/nodes/_base/components/variable/var-type-picker.tsx
@@ -0,0 +1,71 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { RiArrowDownSLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { Check } from '@/app/components/base/icons/src/vender/line/general'
+import { VarType } from '@/app/components/workflow/types'
+
+type Props = {
+  className?: string
+  readonly: boolean
+  value: string
+  onChange: (value: string) => void
+}
+
+const TYPES = [VarType.string, VarType.number, VarType.arrayNumber, VarType.arrayString, VarType.arrayObject, VarType.object]
+const VarReferencePicker: FC<Props> = ({
+  readonly,
+  className,
+  value,
+  onChange,
+}) => {
+  const [open, setOpen] = useState(false)
+
+  const handleChange = useCallback((type: string) => {
+    return () => {
+      setOpen(false)
+      onChange(type)
+    }
+  }, [onChange])
+
+  return (
+    <div className={cn(className, !readonly && 'cursor-pointer select-none')}>
+      <PortalToFollowElem
+        open={open}
+        onOpenChange={setOpen}
+        placement='bottom-start'
+        offset={4}
+      >
+        <PortalToFollowElemTrigger onClick={() => setOpen(!open)} className='w-[120px] cursor-pointer'>
+          <div className='flex h-8 items-center justify-between rounded-lg border-0 bg-components-button-secondary-bg px-2.5 text-[13px] text-text-primary'>
+            <div className='w-0 grow truncate capitalize' title={value}>{value}</div>
+            <RiArrowDownSLine className='h-3.5 w-3.5 shrink-0 text-text-secondary' />
+          </div>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent style={{
+          zIndex: 100,
+        }}>
+          <div className='w-[120px] rounded-lg bg-components-panel-bg p-1 shadow-sm'>
+            {TYPES.map(type => (
+              <div
+                key={type}
+                className='flex h-[30px] cursor-pointer items-center justify-between rounded-lg pl-3 pr-2 text-[13px] text-text-primary hover:bg-state-base-hover'
+                onClick={handleChange(type)}
+              >
+                <div className='w-0 grow truncate capitalize'>{type}</div>
+                {type === value && <Check className='h-4 w-4 shrink-0 text-text-accent' />}
+              </div>
+            ))}
+          </div>
+        </PortalToFollowElemContent>
+      </PortalToFollowElem>
+    </div>
+  )
+}
+export default React.memo(VarReferencePicker)
diff --git a/app/components/workflow/nodes/_base/hooks/use-available-var-list.ts b/app/components/workflow/nodes/_base/hooks/use-available-var-list.ts
new file mode 100644
index 0000000..e1a6a8b
--- /dev/null
+++ b/app/components/workflow/nodes/_base/hooks/use-available-var-list.ts
@@ -0,0 +1,53 @@
+import useNodeInfo from './use-node-info'
+import {
+  useIsChatMode,
+  useWorkflow,
+  useWorkflowVariables,
+} from '@/app/components/workflow/hooks'
+import type { Node, ValueSelector, Var } from '@/app/components/workflow/types'
+type Params = {
+  onlyLeafNodeVar?: boolean
+  hideEnv?: boolean
+  hideChatVar?: boolean
+  filterVar: (payload: Var, selector: ValueSelector) => boolean
+  passedInAvailableNodes?: Node[]
+}
+
+// TODO: loop type?
+const useAvailableVarList = (nodeId: string, {
+  onlyLeafNodeVar,
+  filterVar,
+  hideEnv,
+  hideChatVar,
+  passedInAvailableNodes,
+}: Params = {
+  onlyLeafNodeVar: false,
+  filterVar: () => true,
+}) => {
+  const { getTreeLeafNodes, getBeforeNodesInSameBranchIncludeParent } = useWorkflow()
+  const { getNodeAvailableVars } = useWorkflowVariables()
+  const isChatMode = useIsChatMode()
+
+  const availableNodes = passedInAvailableNodes || (onlyLeafNodeVar ? getTreeLeafNodes(nodeId) : getBeforeNodesInSameBranchIncludeParent(nodeId))
+
+  const {
+    parentNode: iterationNode,
+  } = useNodeInfo(nodeId)
+
+  const availableVars = getNodeAvailableVars({
+    parentNode: iterationNode,
+    beforeNodes: availableNodes,
+    isChatMode,
+    filterVar,
+    hideEnv,
+    hideChatVar,
+  })
+
+  return {
+    availableVars,
+    availableNodes,
+    availableNodesWithParent: availableNodes,
+  }
+}
+
+export default useAvailableVarList
diff --git a/app/components/workflow/nodes/_base/hooks/use-node-crud.ts b/app/components/workflow/nodes/_base/hooks/use-node-crud.ts
new file mode 100644
index 0000000..51d2fdb
--- /dev/null
+++ b/app/components/workflow/nodes/_base/hooks/use-node-crud.ts
@@ -0,0 +1,19 @@
+import { useNodeDataUpdate } from '@/app/components/workflow/hooks'
+import type { CommonNodeType } from '@/app/components/workflow/types'
+const useNodeCrud = <T>(id: string, data: CommonNodeType<T>) => {
+  const { handleNodeDataUpdateWithSyncDraft } = useNodeDataUpdate()
+
+  const setInputs = (newInputs: CommonNodeType<T>) => {
+    handleNodeDataUpdateWithSyncDraft({
+      id,
+      data: newInputs,
+    })
+  }
+
+  return {
+    inputs: data,
+    setInputs,
+  }
+}
+
+export default useNodeCrud
diff --git a/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts b/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts
new file mode 100644
index 0000000..daad6ff
--- /dev/null
+++ b/app/components/workflow/nodes/_base/hooks/use-node-help-link.ts
@@ -0,0 +1,69 @@
+import { useMemo } from 'react'
+import { useGetLanguage } from '@/context/i18n'
+import { BlockEnum } from '@/app/components/workflow/types'
+
+export const useNodeHelpLink = (nodeType: BlockEnum) => {
+  const language = useGetLanguage()
+  const prefixLink = useMemo(() => {
+    if (language === 'zh_Hans')
+      return 'https://docs.dify.ai/zh-hans/guides/workflow/node/'
+
+    return 'https://docs.dify.ai/en/guides/workflow/node/'
+  }, [language])
+  const linkMap = useMemo(() => {
+    if (language === 'zh_Hans') {
+      return {
+        [BlockEnum.Start]: 'start',
+        [BlockEnum.End]: 'end',
+        [BlockEnum.Answer]: 'answer',
+        [BlockEnum.LLM]: 'llm',
+        [BlockEnum.KnowledgeRetrieval]: 'knowledge-retrieval',
+        [BlockEnum.QuestionClassifier]: 'question-classifier',
+        [BlockEnum.IfElse]: 'ifelse',
+        [BlockEnum.Code]: 'code',
+        [BlockEnum.TemplateTransform]: 'template',
+        [BlockEnum.VariableAssigner]: 'variable-assigner',
+        [BlockEnum.VariableAggregator]: 'variable-aggregator',
+        [BlockEnum.Assigner]: 'variable-assigner',
+        [BlockEnum.Iteration]: 'iteration',
+        [BlockEnum.Loop]: 'loop',
+        [BlockEnum.ParameterExtractor]: 'parameter-extractor',
+        [BlockEnum.HttpRequest]: 'http-request',
+        [BlockEnum.Tool]: 'tools',
+        [BlockEnum.DocExtractor]: 'doc-extractor',
+        [BlockEnum.ListFilter]: 'list-operator',
+        [BlockEnum.Agent]: 'agent',
+      }
+    }
+
+    return {
+      [BlockEnum.Start]: 'start',
+      [BlockEnum.End]: 'end',
+      [BlockEnum.Answer]: 'answer',
+      [BlockEnum.LLM]: 'llm',
+      [BlockEnum.KnowledgeRetrieval]: 'knowledge-retrieval',
+      [BlockEnum.QuestionClassifier]: 'question-classifier',
+      [BlockEnum.IfElse]: 'ifelse',
+      [BlockEnum.Code]: 'code',
+      [BlockEnum.TemplateTransform]: 'template',
+      [BlockEnum.VariableAssigner]: 'variable-assigner',
+      [BlockEnum.VariableAggregator]: 'variable-aggregator',
+      [BlockEnum.Assigner]: 'variable-assigner',
+      [BlockEnum.Iteration]: 'iteration',
+      [BlockEnum.Loop]: 'loop',
+      [BlockEnum.ParameterExtractor]: 'parameter-extractor',
+      [BlockEnum.HttpRequest]: 'http-request',
+      [BlockEnum.Tool]: 'tools',
+      [BlockEnum.DocExtractor]: 'doc-extractor',
+      [BlockEnum.ListFilter]: 'list-operator',
+      [BlockEnum.Agent]: 'agent',
+    }
+  }, [language]) as Record<string, string>
+
+  const link = linkMap[nodeType]
+
+  if (!link)
+    return ''
+
+  return `${prefixLink}${link}`
+}
diff --git a/app/components/workflow/nodes/_base/hooks/use-node-info.ts b/app/components/workflow/nodes/_base/hooks/use-node-info.ts
new file mode 100644
index 0000000..a66e0f1
--- /dev/null
+++ b/app/components/workflow/nodes/_base/hooks/use-node-info.ts
@@ -0,0 +1,22 @@
+import { useStoreApi } from 'reactflow'
+
+const useNodeInfo = (nodeId: string) => {
+  const store = useStoreApi()
+  const {
+    getNodes,
+  } = store.getState()
+  const allNodes = getNodes()
+  const node = allNodes.find(n => n.id === nodeId)
+  const isInIteration = !!node?.data.isInIteration
+  const isInLoop = !!node?.data.isInLoop
+  const parentNodeId = node?.parentId
+  const parentNode = allNodes.find(n => n.id === parentNodeId)
+  return {
+    node,
+    isInIteration,
+    isInLoop,
+    parentNode,
+  }
+}
+
+export default useNodeInfo
diff --git a/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts b/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts
new file mode 100644
index 0000000..f23af58
--- /dev/null
+++ b/app/components/workflow/nodes/_base/hooks/use-one-step-run.ts
@@ -0,0 +1,543 @@
+import { useCallback, useEffect, useRef, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { unionBy } from 'lodash-es'
+import produce from 'immer'
+import {
+  useIsChatMode,
+  useNodeDataUpdate,
+  useWorkflow,
+} from '@/app/components/workflow/hooks'
+import { getNodeInfoById, isConversationVar, isENV, isSystemVar, toNodeOutputVars } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+
+import type { CommonNodeType, InputVar, ValueSelector, Var, Variable } from '@/app/components/workflow/types'
+import { BlockEnum, InputVarType, NodeRunningStatus, VarType } from '@/app/components/workflow/types'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { useStore, useWorkflowStore } from '@/app/components/workflow/store'
+import { getIterationSingleNodeRunUrl, getLoopSingleNodeRunUrl, singleNodeRun } from '@/service/workflow'
+import Toast from '@/app/components/base/toast'
+import LLMDefault from '@/app/components/workflow/nodes/llm/default'
+import KnowledgeRetrievalDefault from '@/app/components/workflow/nodes/knowledge-retrieval/default'
+import IfElseDefault from '@/app/components/workflow/nodes/if-else/default'
+import CodeDefault from '@/app/components/workflow/nodes/code/default'
+import TemplateTransformDefault from '@/app/components/workflow/nodes/template-transform/default'
+import QuestionClassifyDefault from '@/app/components/workflow/nodes/question-classifier/default'
+import HTTPDefault from '@/app/components/workflow/nodes/http/default'
+import ToolDefault from '@/app/components/workflow/nodes/tool/default'
+import VariableAssigner from '@/app/components/workflow/nodes/variable-assigner/default'
+import Assigner from '@/app/components/workflow/nodes/assigner/default'
+import ParameterExtractorDefault from '@/app/components/workflow/nodes/parameter-extractor/default'
+import IterationDefault from '@/app/components/workflow/nodes/iteration/default'
+import DocumentExtractorDefault from '@/app/components/workflow/nodes/document-extractor/default'
+import LoopDefault from '@/app/components/workflow/nodes/loop/default'
+import { ssePost } from '@/service/base'
+import { noop } from 'lodash-es'
+import { getInputVars as doGetInputVars } from '@/app/components/base/prompt-editor/constants'
+import type { NodeTracing } from '@/types/workflow'
+const { checkValid: checkLLMValid } = LLMDefault
+const { checkValid: checkKnowledgeRetrievalValid } = KnowledgeRetrievalDefault
+const { checkValid: checkIfElseValid } = IfElseDefault
+const { checkValid: checkCodeValid } = CodeDefault
+const { checkValid: checkTemplateTransformValid } = TemplateTransformDefault
+const { checkValid: checkQuestionClassifyValid } = QuestionClassifyDefault
+const { checkValid: checkHttpValid } = HTTPDefault
+const { checkValid: checkToolValid } = ToolDefault
+const { checkValid: checkVariableAssignerValid } = VariableAssigner
+const { checkValid: checkAssignerValid } = Assigner
+const { checkValid: checkParameterExtractorValid } = ParameterExtractorDefault
+const { checkValid: checkIterationValid } = IterationDefault
+const { checkValid: checkDocumentExtractorValid } = DocumentExtractorDefault
+const { checkValid: checkLoopValid } = LoopDefault
+
+// eslint-disable-next-line ts/no-unsafe-function-type
+const checkValidFns: Record<BlockEnum, Function> = {
+  [BlockEnum.LLM]: checkLLMValid,
+  [BlockEnum.KnowledgeRetrieval]: checkKnowledgeRetrievalValid,
+  [BlockEnum.IfElse]: checkIfElseValid,
+  [BlockEnum.Code]: checkCodeValid,
+  [BlockEnum.TemplateTransform]: checkTemplateTransformValid,
+  [BlockEnum.QuestionClassifier]: checkQuestionClassifyValid,
+  [BlockEnum.HttpRequest]: checkHttpValid,
+  [BlockEnum.Tool]: checkToolValid,
+  [BlockEnum.VariableAssigner]: checkAssignerValid,
+  [BlockEnum.VariableAggregator]: checkVariableAssignerValid,
+  [BlockEnum.ParameterExtractor]: checkParameterExtractorValid,
+  [BlockEnum.Iteration]: checkIterationValid,
+  [BlockEnum.DocExtractor]: checkDocumentExtractorValid,
+  [BlockEnum.Loop]: checkLoopValid,
+} as any
+
+type Params<T> = {
+  id: string
+  data: CommonNodeType<T>
+  defaultRunInputData: Record<string, any>
+  moreDataForCheckValid?: any
+  iteratorInputKey?: string
+  loopInputKey?: string
+}
+
+const varTypeToInputVarType = (type: VarType, {
+  isSelect,
+  isParagraph,
+}: {
+  isSelect: boolean
+  isParagraph: boolean
+}) => {
+  if (isSelect)
+    return InputVarType.select
+  if (isParagraph)
+    return InputVarType.paragraph
+  if (type === VarType.number)
+    return InputVarType.number
+  if ([VarType.object, VarType.array, VarType.arrayNumber, VarType.arrayString, VarType.arrayObject].includes(type))
+    return InputVarType.json
+  if (type === VarType.file)
+    return InputVarType.singleFile
+  if (type === VarType.arrayFile)
+    return InputVarType.multiFiles
+
+  return InputVarType.textInput
+}
+
+const useOneStepRun = <T>({
+  id,
+  data,
+  defaultRunInputData,
+  moreDataForCheckValid,
+  iteratorInputKey,
+  loopInputKey,
+}: Params<T>) => {
+  const { t } = useTranslation()
+  const { getBeforeNodesInSameBranch, getBeforeNodesInSameBranchIncludeParent } = useWorkflow() as any
+  const conversationVariables = useStore(s => s.conversationVariables)
+  const isChatMode = useIsChatMode()
+  const isIteration = data.type === BlockEnum.Iteration
+  const isLoop = data.type === BlockEnum.Loop
+
+  const availableNodes = getBeforeNodesInSameBranch(id)
+  const availableNodesIncludeParent = getBeforeNodesInSameBranchIncludeParent(id)
+  const allOutputVars = toNodeOutputVars(availableNodes, isChatMode, undefined, undefined, conversationVariables)
+  const getVar = (valueSelector: ValueSelector): Var | undefined => {
+    const isSystem = valueSelector[0] === 'sys'
+    const targetVar = allOutputVars.find(item => isSystem ? !!item.isStartNode : item.nodeId === valueSelector[0])
+    if (!targetVar)
+      return undefined
+
+    if (isSystem)
+      return targetVar.vars.find(item => item.variable.split('.')[1] === valueSelector[1])
+
+    let curr: any = targetVar.vars
+    for (let i = 1; i < valueSelector.length; i++) {
+      const key = valueSelector[i]
+      const isLast = i === valueSelector.length - 1
+
+      if (Array.isArray(curr))
+        curr = curr.find((v: any) => v.variable.replace('conversation.', '') === key)
+
+      if (isLast)
+        return curr
+      else if (curr?.type === VarType.object || curr?.type === VarType.file)
+        curr = curr.children
+    }
+
+    return undefined
+  }
+
+  const checkValid = checkValidFns[data.type]
+  const appId = useAppStore.getState().appDetail?.id
+  const [runInputData, setRunInputData] = useState<Record<string, any>>(defaultRunInputData || {})
+  const runInputDataRef = useRef(runInputData)
+  const handleSetRunInputData = useCallback((data: Record<string, any>) => {
+    runInputDataRef.current = data
+    setRunInputData(data)
+  }, [])
+  const iterationTimes = iteratorInputKey ? runInputData[iteratorInputKey].length : 0
+  const loopTimes = loopInputKey ? runInputData[loopInputKey].length : 0
+  const [runResult, setRunResult] = useState<any>(null)
+
+  const { handleNodeDataUpdate }: { handleNodeDataUpdate: (data: any) => void } = useNodeDataUpdate()
+  const [canShowSingleRun, setCanShowSingleRun] = useState(false)
+  const isShowSingleRun = data._isSingleRun && canShowSingleRun
+  const [iterationRunResult, setIterationRunResult] = useState<NodeTracing[]>([])
+  const [loopRunResult, setLoopRunResult] = useState<NodeTracing[]>([])
+
+  useEffect(() => {
+    if (!checkValid) {
+      setCanShowSingleRun(true)
+      return
+    }
+
+    if (data._isSingleRun) {
+      const { isValid, errorMessage } = checkValid(data, t, moreDataForCheckValid)
+      setCanShowSingleRun(isValid)
+      if (!isValid) {
+        handleNodeDataUpdate({
+          id,
+          data: {
+            ...data,
+            _isSingleRun: false,
+          },
+        })
+        Toast.notify({
+          type: 'error',
+          message: errorMessage,
+        })
+      }
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [data._isSingleRun])
+
+  const workflowStore = useWorkflowStore()
+  useEffect(() => {
+    workflowStore.getState().setShowSingleRunPanel(!!isShowSingleRun)
+  }, [isShowSingleRun, workflowStore])
+
+  const hideSingleRun = () => {
+    handleNodeDataUpdate({
+      id,
+      data: {
+        ...data,
+        _isSingleRun: false,
+      },
+    })
+  }
+  const showSingleRun = () => {
+    handleNodeDataUpdate({
+      id,
+      data: {
+        ...data,
+        _isSingleRun: true,
+      },
+    })
+  }
+  const runningStatus = data._singleRunningStatus || NodeRunningStatus.NotStart
+  const isCompleted = runningStatus === NodeRunningStatus.Succeeded || runningStatus === NodeRunningStatus.Failed
+
+  const handleRun = async (submitData: Record<string, any>) => {
+    handleNodeDataUpdate({
+      id,
+      data: {
+        ...data,
+        _singleRunningStatus: NodeRunningStatus.Running,
+      },
+    })
+    let res: any
+    try {
+      if (!isIteration && !isLoop) {
+        res = await singleNodeRun(appId!, id, { inputs: submitData }) as any
+      }
+      else if (isIteration) {
+        setIterationRunResult([])
+        let _iterationResult: NodeTracing[] = []
+        let _runResult: any = null
+        ssePost(
+          getIterationSingleNodeRunUrl(isChatMode, appId!, id),
+          { body: { inputs: submitData } },
+          {
+            onWorkflowStarted: noop,
+            onWorkflowFinished: (params) => {
+              handleNodeDataUpdate({
+                id,
+                data: {
+                  ...data,
+                  _singleRunningStatus: NodeRunningStatus.Succeeded,
+                },
+              })
+              const { data: iterationData } = params
+              _runResult.created_by = iterationData.created_by.name
+              setRunResult(_runResult)
+            },
+            onIterationStart: (params) => {
+              const newIterationRunResult = produce(_iterationResult, (draft) => {
+                draft.push({
+                  ...params.data,
+                  status: NodeRunningStatus.Running,
+                })
+              })
+              _iterationResult = newIterationRunResult
+              setIterationRunResult(newIterationRunResult)
+            },
+            onIterationNext: () => {
+              // iteration next trigger time is triggered one more time than iterationTimes
+              if (_iterationResult.length >= iterationTimes!)
+                return _iterationResult.length >= iterationTimes!
+            },
+            onIterationFinish: (params) => {
+              _runResult = params.data
+              setRunResult(_runResult)
+              const iterationRunResult = _iterationResult
+              const currentIndex = iterationRunResult.findIndex(trace => trace.id === params.data.id)
+              const newIterationRunResult = produce(iterationRunResult, (draft) => {
+                if (currentIndex > -1) {
+                  draft[currentIndex] = {
+                    ...draft[currentIndex],
+                    ...data,
+                  }
+                }
+              })
+              _iterationResult = newIterationRunResult
+              setIterationRunResult(newIterationRunResult)
+            },
+            onNodeStarted: (params) => {
+              const newIterationRunResult = produce(_iterationResult, (draft) => {
+                draft.push({
+                  ...params.data,
+                  status: NodeRunningStatus.Running,
+                })
+              })
+              _iterationResult = newIterationRunResult
+              setIterationRunResult(newIterationRunResult)
+            },
+            onNodeFinished: (params) => {
+              const iterationRunResult = _iterationResult
+
+              const { data } = params
+              const currentIndex = iterationRunResult.findIndex(trace => trace.id === data.id)
+              const newIterationRunResult = produce(iterationRunResult, (draft) => {
+                if (currentIndex > -1) {
+                  draft[currentIndex] = {
+                    ...draft[currentIndex],
+                    ...data,
+                  }
+                }
+              })
+              _iterationResult = newIterationRunResult
+              setIterationRunResult(newIterationRunResult)
+            },
+            onNodeRetry: (params) => {
+              const newIterationRunResult = produce(_iterationResult, (draft) => {
+                draft.push(params.data)
+              })
+              _iterationResult = newIterationRunResult
+              setIterationRunResult(newIterationRunResult)
+            },
+            onError: () => {
+              handleNodeDataUpdate({
+                id,
+                data: {
+                  ...data,
+                  _singleRunningStatus: NodeRunningStatus.Failed,
+                },
+              })
+            },
+          },
+        )
+      }
+      else if (isLoop) {
+        setLoopRunResult([])
+        let _loopResult: NodeTracing[] = []
+        let _runResult: any = null
+        ssePost(
+          getLoopSingleNodeRunUrl(isChatMode, appId!, id),
+          { body: { inputs: submitData } },
+          {
+            onWorkflowStarted: noop,
+            onWorkflowFinished: (params) => {
+              handleNodeDataUpdate({
+                id,
+                data: {
+                  ...data,
+                  _singleRunningStatus: NodeRunningStatus.Succeeded,
+                },
+              })
+              const { data: loopData } = params
+              _runResult.created_by = loopData.created_by.name
+              setRunResult(_runResult)
+            },
+            onLoopStart: (params) => {
+              const newLoopRunResult = produce(_loopResult, (draft) => {
+                draft.push({
+                  ...params.data,
+                  status: NodeRunningStatus.Running,
+                })
+              })
+              _loopResult = newLoopRunResult
+              setLoopRunResult(newLoopRunResult)
+            },
+            onLoopNext: () => {
+              // loop next trigger time is triggered one more time than loopTimes
+              if (_loopResult.length >= loopTimes!)
+                return _loopResult.length >= loopTimes!
+            },
+            onLoopFinish: (params) => {
+              _runResult = params.data
+              setRunResult(_runResult)
+
+              const loopRunResult = _loopResult
+              const currentIndex = loopRunResult.findIndex(trace => trace.id === params.data.id)
+              const newLoopRunResult = produce(loopRunResult, (draft) => {
+                if (currentIndex > -1) {
+                  draft[currentIndex] = {
+                    ...draft[currentIndex],
+                    ...data,
+                  }
+                }
+              })
+              _loopResult = newLoopRunResult
+              setLoopRunResult(newLoopRunResult)
+            },
+            onNodeStarted: (params) => {
+              const newLoopRunResult = produce(_loopResult, (draft) => {
+                draft.push({
+                  ...params.data,
+                  status: NodeRunningStatus.Running,
+                })
+              })
+              _loopResult = newLoopRunResult
+              setLoopRunResult(newLoopRunResult)
+            },
+            onNodeFinished: (params) => {
+              const loopRunResult = _loopResult
+
+              const { data } = params
+              const currentIndex = loopRunResult.findIndex(trace => trace.id === data.id)
+              const newLoopRunResult = produce(loopRunResult, (draft) => {
+                if (currentIndex > -1) {
+                  draft[currentIndex] = {
+                    ...draft[currentIndex],
+                    ...data,
+                  }
+                }
+              })
+              _loopResult = newLoopRunResult
+              setLoopRunResult(newLoopRunResult)
+            },
+            onNodeRetry: (params) => {
+              const newLoopRunResult = produce(_loopResult, (draft) => {
+                draft.push(params.data)
+              })
+              _loopResult = newLoopRunResult
+              setLoopRunResult(newLoopRunResult)
+            },
+            onError: () => {
+              handleNodeDataUpdate({
+                id,
+                data: {
+                  ...data,
+                  _singleRunningStatus: NodeRunningStatus.Failed,
+                },
+              })
+            },
+          },
+        )
+      }
+      if (res && res.error)
+        throw new Error(res.error)
+    }
+    catch (e: any) {
+      console.error(e)
+      if (!isIteration && !isLoop) {
+        handleNodeDataUpdate({
+          id,
+          data: {
+            ...data,
+            _singleRunningStatus: NodeRunningStatus.Failed,
+          },
+        })
+        return false
+      }
+    }
+    finally {
+      if (!isIteration && !isLoop) {
+        setRunResult({
+          ...res,
+          total_tokens: res.execution_metadata?.total_tokens || 0,
+          created_by: res.created_by_account?.name || '',
+        })
+      }
+    }
+    if (!isIteration && !isLoop) {
+      handleNodeDataUpdate({
+        id,
+        data: {
+          ...data,
+          _singleRunningStatus: NodeRunningStatus.Succeeded,
+        },
+      })
+    }
+  }
+
+  const handleStop = () => {
+    handleNodeDataUpdate({
+      id,
+      data: {
+        ...data,
+        _singleRunningStatus: NodeRunningStatus.NotStart,
+      },
+    })
+  }
+
+  const toVarInputs = (variables: Variable[]): InputVar[] => {
+    if (!variables)
+      return []
+
+    const varInputs = variables.filter(item => !isENV(item.value_selector)).map((item) => {
+      const originalVar = getVar(item.value_selector)
+      if (!originalVar) {
+        return {
+          label: item.label || item.variable,
+          variable: item.variable,
+          type: InputVarType.textInput,
+          required: true,
+          value_selector: item.value_selector,
+        }
+      }
+      return {
+        label: item.label || item.variable,
+        variable: item.variable,
+        type: varTypeToInputVarType(originalVar.type, {
+          isSelect: !!originalVar.isSelect,
+          isParagraph: !!originalVar.isParagraph,
+        }),
+        required: item.required !== false,
+        options: originalVar.options,
+      }
+    })
+
+    return varInputs
+  }
+
+  const getInputVars = (textList: string[]) => {
+    const valueSelectors: ValueSelector[] = []
+    textList.forEach((text) => {
+      valueSelectors.push(...doGetInputVars(text))
+    })
+
+    const variables = unionBy(valueSelectors, item => item.join('.')).map((item) => {
+      const varInfo = getNodeInfoById(availableNodesIncludeParent, item[0])?.data
+
+      return {
+        label: {
+          nodeType: varInfo?.type,
+          nodeName: varInfo?.title || availableNodesIncludeParent[0]?.data.title, // default start node title
+          variable: isSystemVar(item) ? item.join('.') : item[item.length - 1],
+          isChatVar: isConversationVar(item),
+        },
+        variable: `#${item.join('.')}#`,
+        value_selector: item,
+      }
+    })
+
+    const varInputs = toVarInputs(variables)
+    return varInputs
+  }
+
+  return {
+    isShowSingleRun,
+    hideSingleRun,
+    showSingleRun,
+    toVarInputs,
+    getInputVars,
+    runningStatus,
+    isCompleted,
+    handleRun,
+    handleStop,
+    runInputData,
+    runInputDataRef,
+    setRunInputData: handleSetRunInputData,
+    runResult,
+    iterationRunResult,
+    loopRunResult,
+  }
+}
+
+export default useOneStepRun
diff --git a/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts b/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts
new file mode 100644
index 0000000..839cd14
--- /dev/null
+++ b/app/components/workflow/nodes/_base/hooks/use-output-var-list.ts
@@ -0,0 +1,121 @@
+import { useCallback, useState } from 'react'
+import produce from 'immer'
+import { useBoolean } from 'ahooks'
+import type {
+  CodeNodeType,
+  OutputVar,
+} from '../../code/types'
+import type {
+  ValueSelector,
+} from '@/app/components/workflow/types'
+import {
+  BlockEnum,
+  VarType,
+} from '@/app/components/workflow/types'
+import {
+  useWorkflow,
+} from '@/app/components/workflow/hooks'
+import { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/components/error-handle/types'
+import { getDefaultValue } from '@/app/components/workflow/nodes/_base/components/error-handle/utils'
+
+type Params<T> = {
+  id: string
+  inputs: T
+  setInputs: (newInputs: T) => void
+  varKey?: string
+  outputKeyOrders: string[]
+  onOutputKeyOrdersChange: (newOutputKeyOrders: string[]) => void
+}
+function useOutputVarList<T>({
+  id,
+  inputs,
+  setInputs,
+  varKey = 'outputs',
+  outputKeyOrders = [],
+  onOutputKeyOrdersChange,
+}: Params<T>) {
+  const { handleOutVarRenameChange, isVarUsedInNodes, removeUsedVarInNodes } = useWorkflow()
+
+  const handleVarsChange = useCallback((newVars: OutputVar, changedIndex?: number, newKey?: string) => {
+    const newInputs = produce(inputs, (draft: any) => {
+      draft[varKey] = newVars
+
+      if ((inputs as CodeNodeType).type === BlockEnum.Code && (inputs as CodeNodeType).error_strategy === ErrorHandleTypeEnum.defaultValue && varKey === 'outputs')
+        draft.default_value = getDefaultValue(draft as any)
+    })
+    setInputs(newInputs)
+
+    if (changedIndex !== undefined) {
+      const newOutputKeyOrders = produce(outputKeyOrders, (draft) => {
+        draft[changedIndex] = newKey!
+      })
+      onOutputKeyOrdersChange(newOutputKeyOrders)
+    }
+
+    if (newKey)
+      handleOutVarRenameChange(id, [id, outputKeyOrders[changedIndex!]], [id, newKey])
+  }, [inputs, setInputs, handleOutVarRenameChange, id, outputKeyOrders, varKey, onOutputKeyOrdersChange])
+
+  const generateNewKey = useCallback(() => {
+    let keyIndex = Object.keys((inputs as any)[varKey]).length + 1
+    while (((inputs as any)[varKey])[`var_${keyIndex}`])
+      keyIndex++
+    return `var_${keyIndex}`
+  }, [inputs, varKey])
+  const handleAddVariable = useCallback(() => {
+    const newKey = generateNewKey()
+    const newInputs = produce(inputs, (draft: any) => {
+      draft[varKey] = {
+        ...draft[varKey],
+        [newKey]: {
+          type: VarType.string,
+          children: null,
+        },
+      }
+
+      if ((inputs as CodeNodeType).type === BlockEnum.Code && (inputs as CodeNodeType).error_strategy === ErrorHandleTypeEnum.defaultValue && varKey === 'outputs')
+        draft.default_value = getDefaultValue(draft as any)
+    })
+    setInputs(newInputs)
+    onOutputKeyOrdersChange([...outputKeyOrders, newKey])
+  }, [generateNewKey, inputs, setInputs, onOutputKeyOrdersChange, outputKeyOrders, varKey])
+
+  const [isShowRemoveVarConfirm, {
+    setTrue: showRemoveVarConfirm,
+    setFalse: hideRemoveVarConfirm,
+  }] = useBoolean(false)
+  const [removedVar, setRemovedVar] = useState<ValueSelector>([])
+  const removeVarInNode = useCallback(() => {
+    removeUsedVarInNodes(removedVar)
+    hideRemoveVarConfirm()
+  }, [hideRemoveVarConfirm, removeUsedVarInNodes, removedVar])
+  const handleRemoveVariable = useCallback((index: number) => {
+    const key = outputKeyOrders[index]
+
+    if (isVarUsedInNodes([id, key])) {
+      showRemoveVarConfirm()
+      setRemovedVar([id, key])
+      return
+    }
+
+    const newInputs = produce(inputs, (draft: any) => {
+      delete draft[varKey][key]
+
+      if ((inputs as CodeNodeType).type === BlockEnum.Code && (inputs as CodeNodeType).error_strategy === ErrorHandleTypeEnum.defaultValue && varKey === 'outputs')
+        draft.default_value = getDefaultValue(draft as any)
+    })
+    setInputs(newInputs)
+    onOutputKeyOrdersChange(outputKeyOrders.filter((_, i) => i !== index))
+  }, [outputKeyOrders, isVarUsedInNodes, id, inputs, setInputs, onOutputKeyOrdersChange, showRemoveVarConfirm, varKey])
+
+  return {
+    handleVarsChange,
+    handleAddVariable,
+    handleRemoveVariable,
+    isShowRemoveVarConfirm,
+    hideRemoveVarConfirm,
+    onRemoveVarConfirm: removeVarInNode,
+  }
+}
+
+export default useOutputVarList
diff --git a/app/components/workflow/nodes/_base/hooks/use-resize-panel.ts b/app/components/workflow/nodes/_base/hooks/use-resize-panel.ts
new file mode 100644
index 0000000..f2259a0
--- /dev/null
+++ b/app/components/workflow/nodes/_base/hooks/use-resize-panel.ts
@@ -0,0 +1,121 @@
+import {
+  useCallback,
+  useEffect,
+  useRef,
+  useState,
+} from 'react'
+
+export type UseResizePanelParams = {
+  direction?: 'horizontal' | 'vertical' | 'both'
+  triggerDirection?: 'top' | 'right' | 'bottom' | 'left' | 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left'
+  minWidth?: number
+  maxWidth?: number
+  minHeight?: number
+  maxHeight?: number
+  onResized?: (width: number, height: number) => void
+  onResize?: (width: number, height: number) => void
+}
+export const useResizePanel = (params?: UseResizePanelParams) => {
+  const {
+    direction = 'both',
+    triggerDirection = 'bottom-right',
+    minWidth = -Infinity,
+    maxWidth = Infinity,
+    minHeight = -Infinity,
+    maxHeight = Infinity,
+    onResized,
+    onResize,
+  } = params || {}
+  const triggerRef = useRef<HTMLDivElement>(null)
+  const containerRef = useRef<HTMLDivElement>(null)
+  const initXRef = useRef(0)
+  const initYRef = useRef(0)
+  const initContainerWidthRef = useRef(0)
+  const initContainerHeightRef = useRef(0)
+  const isResizingRef = useRef(false)
+  const [prevUserSelectStyle, setPrevUserSelectStyle] = useState(getComputedStyle(document.body).userSelect)
+
+  const handleStartResize = useCallback((e: MouseEvent) => {
+    initXRef.current = e.clientX
+    initYRef.current = e.clientY
+    initContainerWidthRef.current = containerRef.current?.offsetWidth || minWidth
+    initContainerHeightRef.current = containerRef.current?.offsetHeight || minHeight
+    isResizingRef.current = true
+    setPrevUserSelectStyle(getComputedStyle(document.body).userSelect)
+    document.body.style.userSelect = 'none'
+  }, [minWidth, minHeight])
+
+  const handleResize = useCallback((e: MouseEvent) => {
+    if (!isResizingRef.current)
+      return
+
+    if (!containerRef.current)
+      return
+
+    if (direction === 'horizontal' || direction === 'both') {
+      const offsetX = e.clientX - initXRef.current
+      let width = 0
+      if (triggerDirection === 'left' || triggerDirection === 'top-left' || triggerDirection === 'bottom-left')
+        width = initContainerWidthRef.current - offsetX
+      else if (triggerDirection === 'right' || triggerDirection === 'top-right' || triggerDirection === 'bottom-right')
+        width = initContainerWidthRef.current + offsetX
+
+      if (width < minWidth)
+        width = minWidth
+      if (width > maxWidth)
+        width = maxWidth
+      containerRef.current.style.width = `${width}px`
+      onResize?.(width, 0)
+    }
+
+    if (direction === 'vertical' || direction === 'both') {
+      const offsetY = e.clientY - initYRef.current
+      let height = 0
+      if (triggerDirection === 'top' || triggerDirection === 'top-left' || triggerDirection === 'top-right')
+        height = initContainerHeightRef.current - offsetY
+      else if (triggerDirection === 'bottom' || triggerDirection === 'bottom-left' || triggerDirection === 'bottom-right')
+        height = initContainerHeightRef.current + offsetY
+
+      if (height < minHeight)
+        height = minHeight
+      if (height > maxHeight)
+        height = maxHeight
+
+      containerRef.current.style.height = `${height}px`
+      onResize?.(0, height)
+    }
+  }, [
+    direction,
+    triggerDirection,
+    minWidth,
+    maxWidth,
+    minHeight,
+    maxHeight,
+    onResize,
+  ])
+
+  const handleStopResize = useCallback(() => {
+    isResizingRef.current = false
+    document.body.style.userSelect = prevUserSelectStyle
+
+    if (onResized && containerRef.current)
+      onResized(containerRef.current.offsetWidth, containerRef.current.offsetHeight)
+  }, [prevUserSelectStyle, onResized])
+
+  useEffect(() => {
+    const element = triggerRef.current
+    element?.addEventListener('mousedown', handleStartResize)
+    document.addEventListener('mousemove', handleResize)
+    document.addEventListener('mouseup', handleStopResize)
+    return () => {
+      if (element)
+        element.removeEventListener('mousedown', handleStartResize)
+      document.removeEventListener('mousemove', handleResize)
+    }
+  }, [handleStartResize, handleResize, handleStopResize])
+
+  return {
+    triggerRef,
+    containerRef,
+  }
+}
diff --git a/app/components/workflow/nodes/_base/hooks/use-toggle-expend.ts b/app/components/workflow/nodes/_base/hooks/use-toggle-expend.ts
new file mode 100644
index 0000000..e90f079
--- /dev/null
+++ b/app/components/workflow/nodes/_base/hooks/use-toggle-expend.ts
@@ -0,0 +1,41 @@
+import { useEffect, useState } from 'react'
+
+type Params = {
+  ref: React.RefObject<HTMLDivElement>
+  hasFooter?: boolean
+  isInNode?: boolean
+}
+
+const useToggleExpend = ({ ref, hasFooter = true, isInNode }: Params) => {
+  const [isExpand, setIsExpand] = useState(false)
+  const [wrapHeight, setWrapHeight] = useState(ref.current?.clientHeight)
+  const editorExpandHeight = isExpand ? wrapHeight! - (hasFooter ? 56 : 29) : 0
+  useEffect(() => {
+    setWrapHeight(ref.current?.clientHeight)
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isExpand])
+
+  const wrapClassName = (() => {
+    if (!isExpand)
+      return ''
+
+    if (isInNode)
+      return 'fixed z-10  right-[9px] top-[166px] bottom-[8px]  p-4 bg-components-panel-bg rounded-xl'
+
+    return 'absolute z-10 left-4 right-6 top-[52px] bottom-0 pb-4 bg-components-panel-bg'
+  })()
+  const wrapStyle = isExpand
+    ? {
+      boxShadow: '0px 0px 12px -4px rgba(16, 24, 40, 0.05), 0px -3px 6px -2px rgba(16, 24, 40, 0.03)',
+    }
+    : {}
+  return {
+    wrapClassName,
+    wrapStyle,
+    editorExpandHeight,
+    isExpand,
+    setIsExpand,
+  }
+}
+
+export default useToggleExpend
diff --git a/app/components/workflow/nodes/_base/hooks/use-var-list.ts b/app/components/workflow/nodes/_base/hooks/use-var-list.ts
new file mode 100644
index 0000000..63d284f
--- /dev/null
+++ b/app/components/workflow/nodes/_base/hooks/use-var-list.ts
@@ -0,0 +1,37 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import type { Variable } from '@/app/components/workflow/types'
+
+type Params<T> = {
+  inputs: T
+  setInputs: (newInputs: T) => void
+  varKey?: string
+}
+function useVarList<T>({
+  inputs,
+  setInputs,
+  varKey = 'variables',
+}: Params<T>) {
+  const handleVarListChange = useCallback((newList: Variable[] | string) => {
+    const newInputs = produce(inputs, (draft: any) => {
+      draft[varKey] = newList as Variable[]
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs, varKey])
+
+  const handleAddVariable = useCallback(() => {
+    const newInputs = produce(inputs, (draft: any) => {
+      draft[varKey].push({
+        variable: '',
+        value_selector: [],
+      })
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs, varKey])
+  return {
+    handleVarListChange,
+    handleAddVariable,
+  }
+}
+
+export default useVarList
diff --git a/app/components/workflow/nodes/_base/node.tsx b/app/components/workflow/nodes/_base/node.tsx
new file mode 100644
index 0000000..527b2f0
--- /dev/null
+++ b/app/components/workflow/nodes/_base/node.tsx
@@ -0,0 +1,323 @@
+import type {
+  FC,
+  ReactElement,
+} from 'react'
+import {
+  cloneElement,
+  memo,
+  useEffect,
+  useMemo,
+  useRef,
+} from 'react'
+import {
+  RiAlertFill,
+  RiCheckboxCircleFill,
+  RiErrorWarningFill,
+  RiLoader2Line,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import type { NodeProps } from '../../types'
+import {
+  BlockEnum,
+  NodeRunningStatus,
+} from '../../types'
+import {
+  useNodesReadOnly,
+  useToolIcon,
+} from '../../hooks'
+import {
+  hasErrorHandleNode,
+  hasRetryNode,
+} from '../../utils'
+import { useNodeIterationInteractions } from '../iteration/use-interactions'
+import { useNodeLoopInteractions } from '../loop/use-interactions'
+import type { IterationNodeType } from '../iteration/types'
+import {
+  NodeSourceHandle,
+  NodeTargetHandle,
+} from './components/node-handle'
+import NodeResizer from './components/node-resizer'
+import NodeControl from './components/node-control'
+import ErrorHandleOnNode from './components/error-handle/error-handle-on-node'
+import RetryOnNode from './components/retry/retry-on-node'
+import AddVariablePopupWithPosition from './components/add-variable-popup-with-position'
+import cn from '@/utils/classnames'
+import BlockIcon from '@/app/components/workflow/block-icon'
+import Tooltip from '@/app/components/base/tooltip'
+
+type BaseNodeProps = {
+  children: ReactElement
+} & NodeProps
+
+const BaseNode: FC<BaseNodeProps> = ({
+  id,
+  data,
+  children,
+}) => {
+  const { t } = useTranslation()
+  const nodeRef = useRef<HTMLDivElement>(null)
+  const { nodesReadOnly } = useNodesReadOnly()
+  const { handleNodeIterationChildSizeChange } = useNodeIterationInteractions()
+  const { handleNodeLoopChildSizeChange } = useNodeLoopInteractions()
+  const toolIcon = useToolIcon(data)
+
+  useEffect(() => {
+    if (nodeRef.current && data.selected && data.isInIteration) {
+      const resizeObserver = new ResizeObserver(() => {
+        handleNodeIterationChildSizeChange(id)
+      })
+
+      resizeObserver.observe(nodeRef.current)
+
+      return () => {
+        resizeObserver.disconnect()
+      }
+    }
+  }, [data.isInIteration, data.selected, id, handleNodeIterationChildSizeChange])
+
+  useEffect(() => {
+    if (nodeRef.current && data.selected && data.isInLoop) {
+      const resizeObserver = new ResizeObserver(() => {
+        handleNodeLoopChildSizeChange(id)
+      })
+
+      resizeObserver.observe(nodeRef.current)
+
+      return () => {
+        resizeObserver.disconnect()
+      }
+    }
+  }, [data.isInLoop, data.selected, id, handleNodeLoopChildSizeChange])
+
+  const showSelectedBorder = data.selected || data._isBundled || data._isEntering
+  const {
+    showRunningBorder,
+    showSuccessBorder,
+    showFailedBorder,
+    showExceptionBorder,
+  } = useMemo(() => {
+    return {
+      showRunningBorder: data._runningStatus === NodeRunningStatus.Running && !showSelectedBorder,
+      showSuccessBorder: data._runningStatus === NodeRunningStatus.Succeeded && !showSelectedBorder,
+      showFailedBorder: data._runningStatus === NodeRunningStatus.Failed && !showSelectedBorder,
+      showExceptionBorder: data._runningStatus === NodeRunningStatus.Exception && !showSelectedBorder,
+    }
+  }, [data._runningStatus, showSelectedBorder])
+
+  const LoopIndex = useMemo(() => {
+    let text = ''
+
+    if (data._runningStatus === NodeRunningStatus.Running)
+      text = t('workflow.nodes.loop.currentLoopCount', { count: data._loopIndex })
+    if (data._runningStatus === NodeRunningStatus.Succeeded || data._runningStatus === NodeRunningStatus.Failed)
+      text = t('workflow.nodes.loop.totalLoopCount', { count: data._loopIndex })
+
+    if (text) {
+      return (
+        <div
+          className={cn(
+            'system-xs-medium mr-2 text-text-tertiary',
+            data._runningStatus === NodeRunningStatus.Running && 'text-text-accent',
+          )}
+        >
+          {text}
+        </div>
+      )
+    }
+
+    return null
+  }, [data._loopIndex, data._runningStatus, t])
+
+  return (
+    <div
+      className={cn(
+        'flex rounded-2xl border-[2px]',
+        showSelectedBorder ? 'border-components-option-card-option-selected-border' : 'border-transparent',
+        !showSelectedBorder && data._inParallelHovering && 'border-workflow-block-border-highlight',
+        data._waitingRun && 'opacity-70',
+      )}
+      ref={nodeRef}
+      style={{
+        width: (data.type === BlockEnum.Iteration || data.type === BlockEnum.Loop) ? data.width : 'auto',
+        height: (data.type === BlockEnum.Iteration || data.type === BlockEnum.Loop) ? data.height : 'auto',
+      }}
+    >
+      <div
+        className={cn(
+          'group relative pb-1 shadow-xs',
+          'rounded-[15px] border border-transparent',
+          (data.type !== BlockEnum.Iteration && data.type !== BlockEnum.Loop) && 'w-[240px] bg-workflow-block-bg',
+          (data.type === BlockEnum.Iteration || data.type === BlockEnum.Loop) && 'flex h-full w-full flex-col border-workflow-block-border bg-workflow-block-bg-transparent',
+          !data._runningStatus && 'hover:shadow-lg',
+          showRunningBorder && '!border-state-accent-solid',
+          showSuccessBorder && '!border-state-success-solid',
+          showFailedBorder && '!border-state-destructive-solid',
+          showExceptionBorder && '!border-state-warning-solid',
+          data._isBundled && '!shadow-lg',
+        )}
+      >
+        {
+          data._inParallelHovering && (
+            <div className='top system-2xs-medium-uppercase absolute -top-2.5 left-2 z-10 text-text-tertiary'>
+              {t('workflow.common.parallelRun')}
+            </div>
+          )
+        }
+        {
+          data._showAddVariablePopup && (
+            <AddVariablePopupWithPosition
+              nodeId={id}
+              nodeData={data}
+            />
+          )
+        }
+        {
+          data.type === BlockEnum.Iteration && (
+            <NodeResizer
+              nodeId={id}
+              nodeData={data}
+            />
+          )
+        }
+        {
+          data.type === BlockEnum.Loop && (
+            <NodeResizer
+              nodeId={id}
+              nodeData={data}
+            />
+          )
+        }
+        {
+          !data._isCandidate && (
+            <NodeTargetHandle
+              id={id}
+              data={data}
+              handleClassName='!top-4 !-left-[9px] !translate-y-0'
+              handleId='target'
+            />
+          )
+        }
+        {
+          data.type !== BlockEnum.IfElse && data.type !== BlockEnum.QuestionClassifier && !data._isCandidate && (
+            <NodeSourceHandle
+              id={id}
+              data={data}
+              handleClassName='!top-4 !-right-[9px] !translate-y-0'
+              handleId='source'
+            />
+          )
+        }
+        {
+          !data._runningStatus && !nodesReadOnly && !data._isCandidate && (
+            <NodeControl
+              id={id}
+              data={data}
+            />
+          )
+        }
+        <div className={cn(
+          'flex items-center rounded-t-2xl px-3 pb-2 pt-3',
+          (data.type === BlockEnum.Iteration || data.type === BlockEnum.Loop) && 'bg-transparent',
+        )}>
+          <BlockIcon
+            className='mr-2 shrink-0'
+            type={data.type}
+            size='md'
+            toolIcon={toolIcon}
+          />
+          <div
+            title={data.title}
+            className='system-sm-semibold-uppercase mr-1 flex grow items-center truncate text-text-primary'
+          >
+            <div>
+              {data.title}
+            </div>
+            {
+              data.type === BlockEnum.Iteration && (data as IterationNodeType).is_parallel && (
+                <Tooltip popupContent={
+                  <div className='w-[180px]'>
+                    <div className='font-extrabold'>
+                      {t('workflow.nodes.iteration.parallelModeEnableTitle')}
+                    </div>
+                    {t('workflow.nodes.iteration.parallelModeEnableDesc')}
+                  </div>}
+                >
+                  <div className='system-2xs-medium-uppercase ml-1 flex items-center justify-center rounded-[5px] border-[1px] border-text-warning px-[5px] py-[3px] text-text-warning '>
+                    {t('workflow.nodes.iteration.parallelModeUpper')}
+                  </div>
+                </Tooltip>
+              )
+            }
+          </div>
+          {
+            data._iterationLength && data._iterationIndex && data._runningStatus === NodeRunningStatus.Running && (
+              <div className='mr-1.5 text-xs font-medium text-text-accent'>
+                {data._iterationIndex > data._iterationLength ? data._iterationLength : data._iterationIndex}/{data._iterationLength}
+              </div>
+            )
+          }
+          {
+            data.type === BlockEnum.Loop && data._loopIndex && LoopIndex
+          }
+          {
+            (data._runningStatus === NodeRunningStatus.Running || data._singleRunningStatus === NodeRunningStatus.Running) && (
+              <RiLoader2Line className='h-3.5 w-3.5 animate-spin text-text-accent' />
+            )
+          }
+          {
+            data._runningStatus === NodeRunningStatus.Succeeded && (
+              <RiCheckboxCircleFill className='h-3.5 w-3.5 text-text-success' />
+            )
+          }
+          {
+            data._runningStatus === NodeRunningStatus.Failed && (
+              <RiErrorWarningFill className='h-3.5 w-3.5 text-text-destructive' />
+            )
+          }
+          {
+            data._runningStatus === NodeRunningStatus.Exception && (
+              <RiAlertFill className='h-3.5 w-3.5 text-text-warning-secondary' />
+            )
+          }
+        </div>
+        {
+          data.type !== BlockEnum.Iteration && data.type !== BlockEnum.Loop && (
+            cloneElement(children, { id, data })
+          )
+        }
+        {
+          (data.type === BlockEnum.Iteration || data.type === BlockEnum.Loop) && (
+            <div className='grow pb-1 pl-1 pr-1'>
+              {cloneElement(children, { id, data })}
+            </div>
+          )
+        }
+        {
+          hasRetryNode(data.type) && (
+            <RetryOnNode
+              id={id}
+              data={data}
+            />
+          )
+        }
+        {
+          hasErrorHandleNode(data.type) && (
+            <ErrorHandleOnNode
+              id={id}
+              data={data}
+            />
+          )
+        }
+        {
+          data.desc && data.type !== BlockEnum.Iteration && data.type !== BlockEnum.Loop && (
+            <div className='system-xs-regular whitespace-pre-line break-words px-3 pb-2 pt-1 text-text-tertiary'>
+              {data.desc}
+            </div>
+          )
+        }
+      </div>
+    </div>
+  )
+}
+
+export default memo(BaseNode)
diff --git a/app/components/workflow/nodes/_base/panel.tsx b/app/components/workflow/nodes/_base/panel.tsx
new file mode 100644
index 0000000..2ee39a3
--- /dev/null
+++ b/app/components/workflow/nodes/_base/panel.tsx
@@ -0,0 +1,209 @@
+import type {
+  FC,
+  ReactNode,
+} from 'react'
+import {
+  cloneElement,
+  memo,
+  useCallback,
+} from 'react'
+import {
+  RiCloseLine,
+  RiPlayLargeLine,
+} from '@remixicon/react'
+import { useShallow } from 'zustand/react/shallow'
+import { useTranslation } from 'react-i18next'
+import NextStep from './components/next-step'
+import PanelOperator from './components/panel-operator'
+import HelpLink from './components/help-link'
+import {
+  DescriptionInput,
+  TitleInput,
+} from './components/title-description-input'
+import ErrorHandleOnPanel from './components/error-handle/error-handle-on-panel'
+import RetryOnPanel from './components/retry/retry-on-panel'
+import { useResizePanel } from './hooks/use-resize-panel'
+import cn from '@/utils/classnames'
+import BlockIcon from '@/app/components/workflow/block-icon'
+import Split from '@/app/components/workflow/nodes/_base/components/split'
+import {
+  WorkflowHistoryEvent,
+  useAvailableBlocks,
+  useNodeDataUpdate,
+  useNodesInteractions,
+  useNodesReadOnly,
+  useNodesSyncDraft,
+  useToolIcon,
+  useWorkflow,
+  useWorkflowHistory,
+} from '@/app/components/workflow/hooks'
+import {
+  canRunBySingle,
+  hasErrorHandleNode,
+  hasRetryNode,
+} from '@/app/components/workflow/utils'
+import Tooltip from '@/app/components/base/tooltip'
+import type { Node } from '@/app/components/workflow/types'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { useStore } from '@/app/components/workflow/store'
+
+type BasePanelProps = {
+  children: ReactNode
+} & Node
+
+const BasePanel: FC<BasePanelProps> = ({
+  id,
+  data,
+  children,
+}) => {
+  const { t } = useTranslation()
+  const { showMessageLogModal } = useAppStore(useShallow(state => ({
+    showMessageLogModal: state.showMessageLogModal,
+  })))
+  const showSingleRunPanel = useStore(s => s.showSingleRunPanel)
+  const panelWidth = localStorage.getItem('workflow-node-panel-width') ? Number.parseFloat(localStorage.getItem('workflow-node-panel-width')!) : 420
+  const {
+    setPanelWidth,
+  } = useWorkflow()
+  const { handleNodeSelect } = useNodesInteractions()
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+  const { nodesReadOnly } = useNodesReadOnly()
+  const { availableNextBlocks } = useAvailableBlocks(data.type, data.isInIteration, data.isInLoop)
+  const toolIcon = useToolIcon(data)
+
+  const handleResize = useCallback((width: number) => {
+    setPanelWidth(width)
+  }, [setPanelWidth])
+
+  const {
+    triggerRef,
+    containerRef,
+  } = useResizePanel({
+    direction: 'horizontal',
+    triggerDirection: 'left',
+    minWidth: 420,
+    maxWidth: 720,
+    onResize: handleResize,
+  })
+
+  const { saveStateToHistory } = useWorkflowHistory()
+
+  const {
+    handleNodeDataUpdate,
+    handleNodeDataUpdateWithSyncDraft,
+  } = useNodeDataUpdate()
+
+  const handleTitleBlur = useCallback((title: string) => {
+    handleNodeDataUpdateWithSyncDraft({ id, data: { title } })
+    saveStateToHistory(WorkflowHistoryEvent.NodeTitleChange)
+  }, [handleNodeDataUpdateWithSyncDraft, id, saveStateToHistory])
+  const handleDescriptionChange = useCallback((desc: string) => {
+    handleNodeDataUpdateWithSyncDraft({ id, data: { desc } })
+    saveStateToHistory(WorkflowHistoryEvent.NodeDescriptionChange)
+  }, [handleNodeDataUpdateWithSyncDraft, id, saveStateToHistory])
+
+  return (
+    <div className={cn(
+      'relative mr-2 h-full',
+      showMessageLogModal && '!absolute -top-[5px] right-[416px] z-0 !mr-0 w-[384px] overflow-hidden rounded-2xl border-[0.5px] border-components-panel-border shadow-lg transition-all',
+    )}>
+      <div
+        ref={triggerRef}
+        className='absolute -left-2 top-1/2 h-6 w-3 -translate-y-1/2 cursor-col-resize resize-x'>
+        <div className='h-6 w-1 rounded-sm bg-divider-regular'></div>
+      </div>
+      <div
+        ref={containerRef}
+        className={cn('h-full rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-lg', showSingleRunPanel ? 'overflow-hidden' : 'overflow-y-auto')}
+        style={{
+          width: `${panelWidth}px`,
+        }}
+      >
+        <div className='sticky top-0 z-10 border-b-[0.5px] border-divider-regular bg-components-panel-bg'>
+          <div className='flex items-center px-4 pb-1 pt-4'>
+            <BlockIcon
+              className='mr-1 shrink-0'
+              type={data.type}
+              toolIcon={toolIcon}
+              size='md'
+            />
+            <TitleInput
+              value={data.title || ''}
+              onBlur={handleTitleBlur}
+            />
+            <div className='flex shrink-0 items-center text-text-tertiary'>
+              {
+                canRunBySingle(data.type) && !nodesReadOnly && (
+                  <Tooltip
+                    popupContent={t('workflow.panel.runThisStep')}
+                    popupClassName='mr-1'
+                  >
+                    <div
+                      className='mr-1 flex h-6 w-6 cursor-pointer items-center justify-center rounded-md hover:bg-state-base-hover'
+                      onClick={() => {
+                        handleNodeDataUpdate({ id, data: { _isSingleRun: true } })
+                        handleSyncWorkflowDraft(true)
+                      }}
+                    >
+                      <RiPlayLargeLine className='h-4 w-4 text-text-tertiary' />
+                    </div>
+                  </Tooltip>
+                )
+              }
+              <HelpLink nodeType={data.type} />
+              <PanelOperator id={id} data={data} showHelpLink={false} />
+              <div className='mx-3 h-3.5 w-[1px] bg-divider-regular' />
+              <div
+                className='flex h-6 w-6 cursor-pointer items-center justify-center'
+                onClick={() => handleNodeSelect(id, true)}
+              >
+                <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+              </div>
+            </div>
+          </div>
+          <div className='p-2'>
+            <DescriptionInput
+              value={data.desc || ''}
+              onChange={handleDescriptionChange}
+            />
+          </div>
+        </div>
+        <div>
+          {cloneElement(children as any, { id, data })}
+        </div>
+        <Split />
+        {
+          hasRetryNode(data.type) && (
+            <RetryOnPanel
+              id={id}
+              data={data}
+            />
+          )
+        }
+        {
+          hasErrorHandleNode(data.type) && (
+            <ErrorHandleOnPanel
+              id={id}
+              data={data}
+            />
+          )
+        }
+        {
+          !!availableNextBlocks.length && (
+            <div className='border-t-[0.5px] border-divider-regular p-4'>
+              <div className='system-sm-semibold-uppercase mb-1 flex items-center text-text-secondary'>
+                {t('workflow.panel.nextStep').toLocaleUpperCase()}
+              </div>
+              <div className='system-xs-regular mb-2 text-text-tertiary'>
+                {t('workflow.panel.addNextStep')}
+              </div>
+              <NextStep selectedNode={{ id, data } as Node} />
+            </div>
+          )
+        }
+      </div>
+    </div>
+  )
+}
+
+export default memo(BasePanel)
diff --git a/app/components/workflow/nodes/agent/components/model-bar.tsx b/app/components/workflow/nodes/agent/components/model-bar.tsx
new file mode 100644
index 0000000..1b20070
--- /dev/null
+++ b/app/components/workflow/nodes/agent/components/model-bar.tsx
@@ -0,0 +1,75 @@
+import Tooltip from '@/app/components/base/tooltip'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { useModelList } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
+import Indicator from '@/app/components/header/indicator'
+import { type FC, useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+
+export type ModelBarProps = {
+  provider: string
+  model: string
+} | {}
+
+const useAllModel = () => {
+  const { data: textGeneration } = useModelList(ModelTypeEnum.textGeneration)
+  const { data: moderation } = useModelList(ModelTypeEnum.moderation)
+  const { data: rerank } = useModelList(ModelTypeEnum.rerank)
+  const { data: speech2text } = useModelList(ModelTypeEnum.speech2text)
+  const { data: textEmbedding } = useModelList(ModelTypeEnum.textEmbedding)
+  const { data: tts } = useModelList(ModelTypeEnum.tts)
+  const models = useMemo(() => {
+    return textGeneration
+      .concat(moderation)
+      .concat(rerank)
+      .concat(speech2text)
+      .concat(textEmbedding)
+      .concat(tts)
+  }, [textGeneration, moderation, rerank, speech2text, textEmbedding, tts])
+  if (!textGeneration || !moderation || !rerank || !speech2text || !textEmbedding || !tts)
+    return undefined
+  return models
+}
+
+export const ModelBar: FC<ModelBarProps> = (props) => {
+  const { t } = useTranslation()
+  const modelList = useAllModel()
+  if (!('provider' in props)) {
+    return <Tooltip
+      popupContent={t('workflow.nodes.agent.modelNotSelected')}
+      triggerMethod='hover'
+    >
+      <div className='relative'>
+        <ModelSelector
+          modelList={[]}
+          triggerClassName='bg-workflow-block-parma-bg !h-6 !rounded-md'
+          defaultModel={undefined}
+          showDeprecatedWarnIcon={false}
+          readonly
+          deprecatedClassName='opacity-50'
+        />
+        <Indicator color={'red'} className='absolute -right-0.5 -top-0.5' />
+      </div>
+    </Tooltip>
+  }
+  const modelInstalled = modelList?.some(
+    provider => provider.provider === props.provider && provider.models.some(model => model.model === props.model))
+  const showWarn = modelList && !modelInstalled
+  return modelList && <Tooltip
+    popupContent={t('workflow.nodes.agent.modelNotInstallTooltip')}
+    triggerMethod='hover'
+    disabled={!modelList || modelInstalled}
+  >
+    <div className='relative'>
+      <ModelSelector
+        modelList={modelList}
+        triggerClassName='bg-workflow-block-parma-bg !h-6 !rounded-md'
+        defaultModel={props}
+        showDeprecatedWarnIcon={false}
+        readonly
+        deprecatedClassName='opacity-50'
+      />
+      {showWarn && <Indicator color={'red'} className='absolute -right-0.5 -top-0.5' />}
+    </div>
+  </Tooltip>
+}
diff --git a/app/components/workflow/nodes/agent/components/tool-icon.tsx b/app/components/workflow/nodes/agent/components/tool-icon.tsx
new file mode 100644
index 0000000..b942588
--- /dev/null
+++ b/app/components/workflow/nodes/agent/components/tool-icon.tsx
@@ -0,0 +1,83 @@
+import Tooltip from '@/app/components/base/tooltip'
+import Indicator from '@/app/components/header/indicator'
+import classNames from '@/utils/classnames'
+import { memo, useMemo, useRef, useState } from 'react'
+import { useAllBuiltInTools, useAllCustomTools, useAllWorkflowTools } from '@/service/use-tools'
+import { getIconFromMarketPlace } from '@/utils/get-icon'
+import { useTranslation } from 'react-i18next'
+import { Group } from '@/app/components/base/icons/src/vender/other'
+
+type Status = 'not-installed' | 'not-authorized' | undefined
+
+export type ToolIconProps = {
+  id: string
+  providerName: string
+}
+
+export const ToolIcon = memo(({ providerName }: ToolIconProps) => {
+  const containerRef = useRef<HTMLDivElement>(null)
+  const { data: buildInTools } = useAllBuiltInTools()
+  const { data: customTools } = useAllCustomTools()
+  const { data: workflowTools } = useAllWorkflowTools()
+  const isDataReady = !!buildInTools && !!customTools && !!workflowTools
+  const currentProvider = useMemo(() => {
+    const mergedTools = [...(buildInTools || []), ...(customTools || []), ...(workflowTools || [])]
+    return mergedTools.find((toolWithProvider) => {
+      return toolWithProvider.name === providerName
+    })
+  }, [buildInTools, customTools, providerName, workflowTools])
+  const providerNameParts = providerName.split('/')
+  const author = providerNameParts[0]
+  const name = providerNameParts[1]
+  const icon = useMemo(() => {
+    if (!isDataReady) return ''
+    if (currentProvider) return currentProvider.icon as string
+    const iconFromMarketPlace = getIconFromMarketPlace(`${author}/${name}`)
+    return iconFromMarketPlace
+  }, [author, currentProvider, name, isDataReady])
+  const status: Status = useMemo(() => {
+    if (!isDataReady) return undefined
+    if (!currentProvider) return 'not-installed'
+    if (currentProvider.is_team_authorization === false) return 'not-authorized'
+    return undefined
+  }, [currentProvider, isDataReady])
+  const indicator = status === 'not-installed' ? 'red' : status === 'not-authorized' ? 'yellow' : undefined
+  const notSuccess = (['not-installed', 'not-authorized'] as Array<Status>).includes(status)
+  const { t } = useTranslation()
+  const tooltip = useMemo(() => {
+    if (!notSuccess) return undefined
+    if (status === 'not-installed') return t('workflow.nodes.agent.toolNotInstallTooltip', { tool: name })
+    if (status === 'not-authorized') return t('workflow.nodes.agent.toolNotAuthorizedTooltip', { tool: name })
+    throw new Error('Unknown status')
+  }, [name, notSuccess, status, t])
+  const [iconFetchError, setIconFetchError] = useState(false)
+  return <Tooltip
+    triggerMethod='hover'
+    popupContent={tooltip}
+    disabled={!notSuccess}
+  >
+    <div
+      className={classNames(
+        'size-5 border-[0.5px] border-components-panel-border-subtle bg-background-default-dodge relative flex items-center justify-center rounded-[6px]',
+      )}
+      ref={containerRef}
+    >
+      {(!iconFetchError && isDataReady)
+
+        ? <img
+          src={icon}
+          alt='tool icon'
+          className={classNames(
+            'w-full h-full size-3.5 object-cover',
+            notSuccess && 'opacity-50',
+          )}
+          onError={() => setIconFetchError(true)}
+        />
+        : <Group className="h-3 w-3 opacity-35" />
+      }
+      {indicator && <Indicator color={indicator} className="absolute right-[-1px] top-[-1px]" />}
+    </div>
+  </Tooltip>
+})
+
+ToolIcon.displayName = 'ToolIcon'
diff --git a/app/components/workflow/nodes/agent/default.ts b/app/components/workflow/nodes/agent/default.ts
new file mode 100644
index 0000000..4e7b447
--- /dev/null
+++ b/app/components/workflow/nodes/agent/default.ts
@@ -0,0 +1,143 @@
+import type { StrategyDetail, StrategyPluginDetail } from '@/app/components/plugins/types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+import type { NodeDefault } from '../../types'
+import type { AgentNodeType } from './types'
+import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { renderI18nObject } from '@/i18n'
+
+const nodeDefault: NodeDefault<AgentNodeType> = {
+  defaultValue: {
+  },
+  getAvailablePrevNodes(isChatMode) {
+    return isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS
+  },
+  getAvailableNextNodes(isChatMode) {
+    return isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS
+  },
+  checkValid(payload, t, moreDataForCheckValid: {
+    strategyProvider?: StrategyPluginDetail,
+    strategy?: StrategyDetail
+    language: string
+    isReadyForCheckValid: boolean
+  }) {
+    const { strategy, language, isReadyForCheckValid } = moreDataForCheckValid
+    if (!isReadyForCheckValid) {
+      return {
+        isValid: true,
+        errorMessage: '',
+      }
+    }
+    if (!strategy) {
+      return {
+        isValid: false,
+        errorMessage: t('workflow.nodes.agent.checkList.strategyNotSelected'),
+      }
+    }
+    for (const param of strategy.parameters) {
+      // single tool
+      if (param.required && param.type === FormTypeEnum.toolSelector) {
+        // no value
+        const toolValue = payload.agent_parameters?.[param.name]?.value
+        if (!toolValue) {
+          return {
+            isValid: false,
+            errorMessage: t('workflow.errorMsg.fieldRequired', { field: renderI18nObject(param.label, language) }),
+          }
+        }
+        // not enabled
+        else if (!toolValue.enabled) {
+          return {
+            isValid: false,
+            errorMessage: t('workflow.errorMsg.noValidTool', { field: renderI18nObject(param.label, language) }),
+          }
+        }
+        // check form of tool
+        else {
+          const schemas = toolValue.schemas || []
+          const userSettings = toolValue.settings
+          const reasoningConfig = toolValue.parameters
+          schemas.forEach((schema: any) => {
+            if (schema?.required) {
+              if (schema.form === 'form' && !userSettings[schema.name]?.value) {
+                return {
+                  isValid: false,
+                  errorMessage: t('workflow.errorMsg.toolParameterRequired', { field: renderI18nObject(param.label, language), param: renderI18nObject(schema.label, language) }),
+                }
+              }
+              if (schema.form === 'llm' && reasoningConfig[schema.name].auto === 0 && !userSettings[schema.name]?.value) {
+                return {
+                  isValid: false,
+                  errorMessage: t('workflow.errorMsg.toolParameterRequired', { field: renderI18nObject(param.label, language), param: renderI18nObject(schema.label, language) }),
+                }
+              }
+            }
+          })
+        }
+      }
+      // multiple tools
+      if (param.required && param.type === FormTypeEnum.multiToolSelector) {
+        const tools = payload.agent_parameters?.[param.name]?.value || []
+        // no value
+        if (!tools.length) {
+          return {
+            isValid: false,
+            errorMessage: t('workflow.errorMsg.fieldRequired', { field: renderI18nObject(param.label, language) }),
+          }
+        }
+        // not enabled
+        else if (tools.every((tool: any) => !tool.enabled)) {
+          return {
+            isValid: false,
+            errorMessage: t('workflow.errorMsg.noValidTool', { field: renderI18nObject(param.label, language) }),
+          }
+        }
+        // check form of tools
+        else {
+          const validState = {
+            isValid: true,
+            errorMessage: '',
+          }
+          for (const tool of tools) {
+            const schemas = tool.schemas || []
+            const userSettings = tool.settings
+            const reasoningConfig = tool.parameters
+            schemas.forEach((schema: any) => {
+              if (schema?.required) {
+                if (schema.form === 'form' && !userSettings[schema.name]?.value) {
+                  return {
+                    isValid: false,
+                    errorMessage: t('workflow.errorMsg.toolParameterRequired', { field: renderI18nObject(param.label, language), param: renderI18nObject(schema.label, language) }),
+                  }
+                }
+                if (schema.form === 'llm' && reasoningConfig[schema.name]?.auto === 0 && !reasoningConfig[schema.name]?.value) {
+                  return {
+                    isValid: false,
+                    errorMessage: t('workflow.errorMsg.toolParameterRequired', { field: renderI18nObject(param.label, language), param: renderI18nObject(schema.label, language) }),
+                  }
+                }
+              }
+            })
+          }
+          return validState
+        }
+      }
+      // common params
+      if (param.required && !payload.agent_parameters?.[param.name]?.value) {
+        return {
+          isValid: false,
+          errorMessage: t('workflow.errorMsg.fieldRequired', { field: renderI18nObject(param.label, language) }),
+        }
+      }
+    }
+    return {
+      isValid: true,
+      errorMessage: '',
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/agent/node.tsx b/app/components/workflow/nodes/agent/node.tsx
new file mode 100644
index 0000000..57ad2a0
--- /dev/null
+++ b/app/components/workflow/nodes/agent/node.tsx
@@ -0,0 +1,115 @@
+import { type FC, memo, useMemo } from 'react'
+import type { NodeProps } from '../../types'
+import type { AgentNodeType } from './types'
+import { SettingItem } from '../_base/components/setting-item'
+import { Group, GroupLabel } from '../_base/components/group'
+import type { ToolIconProps } from './components/tool-icon'
+import { ToolIcon } from './components/tool-icon'
+import useConfig from './use-config'
+import { useTranslation } from 'react-i18next'
+import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { useRenderI18nObject } from '@/hooks/use-i18n'
+import { ModelBar } from './components/model-bar'
+
+const AgentNode: FC<NodeProps<AgentNodeType>> = (props) => {
+  const { inputs, currentStrategy, currentStrategyStatus, pluginDetail } = useConfig(props.id, props.data)
+  const renderI18nObject = useRenderI18nObject()
+  const { t } = useTranslation()
+  const models = useMemo(() => {
+    if (!inputs) return []
+    // if selected, show in node
+    // if required and not selected, show empty selector
+    // if not required and not selected, show nothing
+    const models = currentStrategy?.parameters
+      .filter(param => param.type === FormTypeEnum.modelSelector)
+      .reduce((acc, param) => {
+        const item = inputs.agent_parameters?.[param.name]?.value
+        if (!item) {
+          if (param.required) {
+            acc.push({ param: param.name })
+            return acc
+          }
+          else { return acc }
+        }
+        acc.push({ provider: item.provider, model: item.model, param: param.name })
+        return acc
+      }, [] as Array<{ param: string } | { provider: string, model: string, param: string }>) || []
+    return models
+  }, [currentStrategy, inputs])
+
+  const tools = useMemo(() => {
+    const tools: Array<ToolIconProps> = []
+    currentStrategy?.parameters.forEach((param, i) => {
+      if (param.type === FormTypeEnum.toolSelector) {
+        const field = param.name
+        const value = inputs.agent_parameters?.[field]?.value
+        if (value) {
+          tools.push({
+            id: `${param.name}-${i}`,
+            providerName: value.provider_name as any,
+          })
+        }
+      }
+      if (param.type === FormTypeEnum.multiToolSelector) {
+        const field = param.name
+        const value = inputs.agent_parameters?.[field]?.value
+        if (value) {
+          (value as unknown as any[]).forEach((item) => {
+            tools.push({
+              id: `${param.name}-${i}`,
+              providerName: item.provider_name,
+            })
+          })
+        }
+      }
+    })
+    return tools
+  }, [currentStrategy?.parameters, inputs.agent_parameters])
+  return <div className='mb-1 space-y-1 px-3 py-1'>
+    {inputs.agent_strategy_name
+      ? <SettingItem
+        label={t('workflow.nodes.agent.strategy.shortLabel')}
+        status={
+          currentStrategyStatus && !currentStrategyStatus.isExistInPlugin
+            ? 'error'
+            : undefined
+        }
+        tooltip={
+          (currentStrategyStatus && !currentStrategyStatus.isExistInPlugin)
+            ? t('workflow.nodes.agent.strategyNotInstallTooltip', {
+              plugin: pluginDetail?.declaration.label
+                ? renderI18nObject(pluginDetail?.declaration.label)
+                : undefined,
+              strategy: inputs.agent_strategy_label,
+            })
+            : undefined
+        }
+      >
+        {inputs.agent_strategy_label}
+      </SettingItem>
+      : <SettingItem label={t('workflow.nodes.agent.strategyNotSet')} />}
+    {models.length > 0 && <Group
+      label={<GroupLabel className='mt-1'>
+        {t('workflow.nodes.agent.model')}
+      </GroupLabel>}
+    >
+      {models.map((model) => {
+        return <ModelBar
+          {...model}
+          key={model.param}
+        />
+      })}
+    </Group>}
+    {tools.length > 0 && <Group label={<GroupLabel className='mt-1'>
+      {t('workflow.nodes.agent.toolbox')}
+    </GroupLabel>}>
+      <div className='grid grid-cols-10 gap-0.5'>
+        {tools.map(tool => <ToolIcon {...tool} key={tool.id} />)}
+      </div>
+    </Group>}
+  </div>
+}
+
+AgentNode.displayName = 'AgentNode'
+
+export default memo(AgentNode)
diff --git a/app/components/workflow/nodes/agent/panel.tsx b/app/components/workflow/nodes/agent/panel.tsx
new file mode 100644
index 0000000..f92e92d
--- /dev/null
+++ b/app/components/workflow/nodes/agent/panel.tsx
@@ -0,0 +1,177 @@
+import type { FC } from 'react'
+import { memo, useMemo } from 'react'
+import type { NodePanelProps } from '../../types'
+import { AgentFeature, type AgentNodeType } from './types'
+import Field from '../_base/components/field'
+import { AgentStrategy } from '../_base/components/agent-strategy'
+import useConfig from './use-config'
+import { useTranslation } from 'react-i18next'
+import OutputVars, { VarItem } from '../_base/components/output-vars'
+import type { StrategyParamItem } from '@/app/components/plugins/types'
+import type { CredentialFormSchema } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
+import ResultPanel from '@/app/components/workflow/run/result-panel'
+import formatTracing from '@/app/components/workflow/run/utils/format-log'
+import { useLogs } from '@/app/components/workflow/run/hooks'
+import type { Props as FormProps } from '@/app/components/workflow/nodes/_base/components/before-run-form/form'
+import { toType } from '@/app/components/tools/utils/to-form-schema'
+import { useStore } from '../../store'
+import Split from '../_base/components/split'
+import MemoryConfig from '../_base/components/memory-config'
+
+const i18nPrefix = 'workflow.nodes.agent'
+
+export function strategyParamToCredientialForm(param: StrategyParamItem): CredentialFormSchema {
+  return {
+    ...param as any,
+    variable: param.name,
+    show_on: [],
+    type: toType(param.type),
+    tooltip: param.help,
+  }
+}
+
+const AgentPanel: FC<NodePanelProps<AgentNodeType>> = (props) => {
+  const {
+    inputs,
+    setInputs,
+    currentStrategy,
+    formData,
+    onFormChange,
+    isChatMode,
+    availableNodesWithParent,
+    availableVars,
+    readOnly,
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runResult,
+    runInputData,
+    setRunInputData,
+    varInputs,
+    outputSchema,
+    handleMemoryChange,
+  } = useConfig(props.id, props.data)
+  const { t } = useTranslation()
+  const nodeInfo = useMemo(() => {
+    if (!runResult)
+      return
+    return formatTracing([runResult], t)[0]
+  }, [runResult, t])
+  const logsParams = useLogs()
+  const singleRunForms = (() => {
+    const forms: FormProps[] = []
+
+    if (varInputs.length > 0) {
+      forms.push(
+        {
+          label: t(`${i18nPrefix}.singleRun.variable`)!,
+          inputs: varInputs,
+          values: runInputData,
+          onChange: setRunInputData,
+        },
+      )
+    }
+
+    return forms
+  })()
+
+  const resetEditor = useStore(s => s.setControlPromptEditorRerenderKey)
+
+  return <div className='my-2'>
+    <Field
+    required
+    title={t('workflow.nodes.agent.strategy.label')}
+    className='px-4 py-2'
+    tooltip={t('workflow.nodes.agent.strategy.tooltip')} >
+      <AgentStrategy
+        strategy={inputs.agent_strategy_name ? {
+          agent_strategy_provider_name: inputs.agent_strategy_provider_name!,
+          agent_strategy_name: inputs.agent_strategy_name!,
+          agent_strategy_label: inputs.agent_strategy_label!,
+          agent_output_schema: inputs.output_schema,
+          plugin_unique_identifier: inputs.plugin_unique_identifier!,
+        } : undefined}
+        onStrategyChange={(strategy) => {
+          setInputs({
+            ...inputs,
+            agent_strategy_provider_name: strategy?.agent_strategy_provider_name,
+            agent_strategy_name: strategy?.agent_strategy_name,
+            agent_strategy_label: strategy?.agent_strategy_label,
+            output_schema: strategy!.agent_output_schema,
+            plugin_unique_identifier: strategy!.plugin_unique_identifier,
+          })
+          resetEditor(Date.now())
+        }}
+        formSchema={currentStrategy?.parameters?.map(strategyParamToCredientialForm) || []}
+        formValue={formData}
+        onFormValueChange={onFormChange}
+        nodeOutputVars={availableVars}
+        availableNodes={availableNodesWithParent}
+        nodeId={props.id}
+      />
+    </Field>
+    <div className='px-4 py-2'>
+      {isChatMode && currentStrategy?.features?.includes(AgentFeature.HISTORY_MESSAGES) && (
+        <>
+          <Split />
+          <MemoryConfig
+            className='mt-4'
+            readonly={readOnly}
+            config={{ data: inputs.memory }}
+            onChange={handleMemoryChange}
+            canSetRoleName={false}
+          />
+        </>
+      )}
+    </div>
+    <div>
+      <OutputVars>
+        <VarItem
+          name='text'
+          type='String'
+          description={t(`${i18nPrefix}.outputVars.text`)}
+        />
+        <VarItem
+          name='files'
+          type='Array[File]'
+          description={t(`${i18nPrefix}.outputVars.files.title`)}
+        />
+        <VarItem
+          name='json'
+          type='Array[Object]'
+          description={t(`${i18nPrefix}.outputVars.json`)}
+        />
+        {outputSchema.map(({ name, type, description }) => (
+          <VarItem
+            key={name}
+            name={name}
+            type={type}
+            description={description}
+          />
+        ))}
+      </OutputVars>
+    </div>
+    {
+      isShowSingleRun && (
+        <BeforeRunForm
+          nodeName={inputs.title}
+          nodeType={inputs.type}
+          onHide={hideSingleRun}
+          forms={singleRunForms}
+          runningStatus={runningStatus}
+          onRun={handleRun}
+          onStop={handleStop}
+          {...logsParams}
+          result={<ResultPanel {...runResult} nodeInfo={nodeInfo} showSteps={false} {...logsParams} />}
+        />
+      )
+    }
+  </div>
+}
+
+AgentPanel.displayName = 'AgentPanel'
+
+export default memo(AgentPanel)
diff --git a/app/components/workflow/nodes/agent/types.ts b/app/components/workflow/nodes/agent/types.ts
new file mode 100644
index 0000000..ca8bb5e
--- /dev/null
+++ b/app/components/workflow/nodes/agent/types.ts
@@ -0,0 +1,16 @@
+import type { CommonNodeType, Memory } from '@/app/components/workflow/types'
+import type { ToolVarInputs } from '../tool/types'
+
+export type AgentNodeType = CommonNodeType & {
+  agent_strategy_provider_name?: string
+  agent_strategy_name?: string
+  agent_strategy_label?: string
+  agent_parameters?: ToolVarInputs
+  output_schema: Record<string, any>
+  plugin_unique_identifier?: string
+  memory?: Memory
+}
+
+export enum AgentFeature {
+  HISTORY_MESSAGES = 'history-messages',
+}
diff --git a/app/components/workflow/nodes/agent/use-config.ts b/app/components/workflow/nodes/agent/use-config.ts
new file mode 100644
index 0000000..8196caa
--- /dev/null
+++ b/app/components/workflow/nodes/agent/use-config.ts
@@ -0,0 +1,220 @@
+import { useStrategyProviderDetail } from '@/service/use-strategy'
+import useNodeCrud from '../_base/hooks/use-node-crud'
+import useVarList from '../_base/hooks/use-var-list'
+import useOneStepRun from '../_base/hooks/use-one-step-run'
+import type { AgentNodeType } from './types'
+import {
+  useIsChatMode,
+  useNodesReadOnly,
+} from '@/app/components/workflow/hooks'
+import { useCallback, useMemo } from 'react'
+import { type ToolVarInputs, VarType } from '../tool/types'
+import { useCheckInstalled, useFetchPluginsInMarketPlaceByIds } from '@/service/use-plugins'
+import type { Memory, Var } from '../../types'
+import { VarType as VarKindType } from '../../types'
+import useAvailableVarList from '../_base/hooks/use-available-var-list'
+import produce from 'immer'
+
+export type StrategyStatus = {
+  plugin: {
+    source: 'external' | 'marketplace'
+    installed: boolean
+  }
+  isExistInPlugin: boolean
+}
+
+export const useStrategyInfo = (
+  strategyProviderName?: string,
+  strategyName?: string,
+) => {
+  const strategyProvider = useStrategyProviderDetail(
+    strategyProviderName || '',
+    { retry: false },
+  )
+  const strategy = strategyProvider.data?.declaration.strategies.find(
+    str => str.identity.name === strategyName,
+  )
+  const marketplace = useFetchPluginsInMarketPlaceByIds([strategyProviderName!], {
+    retry: false,
+  })
+  const strategyStatus: StrategyStatus | undefined = useMemo(() => {
+    if (strategyProvider.isLoading || marketplace.isLoading)
+      return undefined
+    const strategyExist = !!strategy
+    const isPluginInstalled = !strategyProvider.isError
+    const isInMarketplace = !!marketplace.data?.data.plugins.at(0)
+    return {
+      plugin: {
+        source: isInMarketplace ? 'marketplace' : 'external',
+        installed: isPluginInstalled,
+      },
+      isExistInPlugin: strategyExist,
+    }
+  }, [strategy, marketplace, strategyProvider.isError, strategyProvider.isLoading])
+  const refetch = useCallback(() => {
+    strategyProvider.refetch()
+    marketplace.refetch()
+  }, [marketplace, strategyProvider])
+  return {
+    strategyProvider,
+    strategy,
+    strategyStatus,
+    refetch,
+  }
+}
+
+const useConfig = (id: string, payload: AgentNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const { inputs, setInputs } = useNodeCrud<AgentNodeType>(id, payload)
+  // variables
+  const { handleVarListChange, handleAddVariable } = useVarList<AgentNodeType>({
+    inputs,
+    setInputs,
+  })
+  const {
+    strategyStatus: currentStrategyStatus,
+    strategy: currentStrategy,
+    strategyProvider,
+  } = useStrategyInfo(
+    inputs.agent_strategy_provider_name,
+    inputs.agent_strategy_name,
+  )
+  const pluginId = inputs.agent_strategy_provider_name?.split('/').splice(0, 2).join('/')
+  const pluginDetail = useCheckInstalled({
+    pluginIds: [pluginId!],
+    enabled: Boolean(pluginId),
+  })
+  const formData = useMemo(() => {
+    const paramNameList = (currentStrategy?.parameters || []).map(item => item.name)
+    return Object.fromEntries(
+      Object.entries(inputs.agent_parameters || {}).filter(([name]) => paramNameList.includes(name)).map(([key, value]) => {
+        return [key, value.value]
+      }),
+    )
+  }, [inputs.agent_parameters, currentStrategy?.parameters])
+  const onFormChange = (value: Record<string, any>) => {
+    const res: ToolVarInputs = {}
+    Object.entries(value).forEach(([key, val]) => {
+      res[key] = {
+        type: VarType.constant,
+        value: val,
+      }
+    })
+    setInputs({
+      ...inputs,
+      agent_parameters: res,
+    })
+  }
+
+  // vars
+
+  const filterMemoryPromptVar = useCallback((varPayload: Var) => {
+    return [
+      VarKindType.arrayObject,
+      VarKindType.array,
+      VarKindType.number,
+      VarKindType.string,
+      VarKindType.secret,
+      VarKindType.arrayString,
+      VarKindType.arrayNumber,
+      VarKindType.file,
+      VarKindType.arrayFile,
+    ].includes(varPayload.type)
+  }, [])
+
+  const {
+    availableVars,
+    availableNodesWithParent,
+  } = useAvailableVarList(id, {
+    onlyLeafNodeVar: false,
+    filterVar: filterMemoryPromptVar,
+  })
+
+  // single run
+  const {
+    isShowSingleRun,
+    showSingleRun,
+    hideSingleRun,
+    toVarInputs,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runInputData,
+    setRunInputData,
+    runResult,
+    getInputVars,
+  } = useOneStepRun<AgentNodeType>({
+    id,
+    data: inputs,
+    defaultRunInputData: {},
+  })
+  const allVarStrArr = (() => {
+    const arr = currentStrategy?.parameters.filter(item => item.type === 'string').map((item) => {
+      return formData[item.name]
+    }) || []
+
+    return arr
+  })()
+  const varInputs = (() => {
+    const vars = getInputVars(allVarStrArr)
+
+    return vars
+  })()
+
+  const outputSchema = useMemo(() => {
+    const res: any[] = []
+    if (!inputs.output_schema)
+      return []
+    Object.keys(inputs.output_schema.properties).forEach((outputKey) => {
+      const output = inputs.output_schema.properties[outputKey]
+      res.push({
+        name: outputKey,
+        type: output.type === 'array'
+          ? `Array[${output.items?.type.slice(0, 1).toLocaleUpperCase()}${output.items?.type.slice(1)}]`
+          : `${output.type.slice(0, 1).toLocaleUpperCase()}${output.type.slice(1)}`,
+        description: output.description,
+      })
+    })
+    return res
+  }, [inputs.output_schema])
+
+  const handleMemoryChange = useCallback((newMemory?: Memory) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.memory = newMemory
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+  const isChatMode = useIsChatMode()
+  return {
+    readOnly,
+    inputs,
+    setInputs,
+    handleVarListChange,
+    handleAddVariable,
+    currentStrategy,
+    formData,
+    onFormChange,
+    currentStrategyStatus,
+    strategyProvider: strategyProvider.data,
+    pluginDetail: pluginDetail.data?.plugins.at(0),
+    availableVars,
+    availableNodesWithParent,
+
+    isShowSingleRun,
+    showSingleRun,
+    hideSingleRun,
+    toVarInputs,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runInputData,
+    setRunInputData,
+    runResult,
+    varInputs,
+    outputSchema,
+    handleMemoryChange,
+    isChatMode,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/answer/default.ts b/app/components/workflow/nodes/answer/default.ts
new file mode 100644
index 0000000..4ff6e49
--- /dev/null
+++ b/app/components/workflow/nodes/answer/default.ts
@@ -0,0 +1,36 @@
+import { BlockEnum } from '../../types'
+import type { NodeDefault } from '../../types'
+import type { AnswerNodeType } from './types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+
+const nodeDefault: NodeDefault<AnswerNodeType> = {
+  defaultValue: {
+    variables: [],
+    answer: '',
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: AnswerNodeType, t: any) {
+    let errorMessages = ''
+    const { answer } = payload
+    if (!answer)
+      errorMessages = t('workflow.errorMsg.fieldRequired', { field: t('workflow.nodes.answer.answer') })
+
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/answer/node.tsx b/app/components/workflow/nodes/answer/node.tsx
new file mode 100644
index 0000000..bb28066
--- /dev/null
+++ b/app/components/workflow/nodes/answer/node.tsx
@@ -0,0 +1,26 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import InfoPanel from '../_base/components/info-panel'
+import ReadonlyInputWithSelectVar from '../_base/components/readonly-input-with-select-var'
+import type { AnswerNodeType } from './types'
+import type { NodeProps } from '@/app/components/workflow/types'
+const Node: FC<NodeProps<AnswerNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='mb-1 px-3 py-1'>
+      <InfoPanel title={t('workflow.nodes.answer.answer')} content={
+        <ReadonlyInputWithSelectVar
+          value={data.answer}
+          nodeId={id}
+        />
+      } />
+    </div>
+  )
+}
+
+export default React.memo(Node)
diff --git a/app/components/workflow/nodes/answer/panel.tsx b/app/components/workflow/nodes/answer/panel.tsx
new file mode 100644
index 0000000..2a4b70e
--- /dev/null
+++ b/app/components/workflow/nodes/answer/panel.tsx
@@ -0,0 +1,47 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import useConfig from './use-config'
+import type { AnswerNodeType } from './types'
+import Editor from '@/app/components/workflow/nodes/_base/components/prompt/editor'
+import type { NodePanelProps } from '@/app/components/workflow/types'
+import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
+const i18nPrefix = 'workflow.nodes.answer'
+
+const Panel: FC<NodePanelProps<AnswerNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    readOnly,
+    inputs,
+    handleAnswerChange,
+    filterVar,
+  } = useConfig(id, data)
+
+  const { availableVars, availableNodesWithParent } = useAvailableVarList(id, {
+    onlyLeafNodeVar: false,
+    hideChatVar: false,
+    hideEnv: false,
+    filterVar,
+  })
+
+  return (
+    <div className='mb-2 mt-2 space-y-4 px-4'>
+      <Editor
+        readOnly={readOnly}
+        justVar
+        title={t(`${i18nPrefix}.answer`)!}
+        value={inputs.answer}
+        onChange={handleAnswerChange}
+        nodesOutputVars={availableVars}
+        availableNodes={availableNodesWithParent}
+        isSupportFileVar
+      />
+    </div>
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/answer/types.ts b/app/components/workflow/nodes/answer/types.ts
new file mode 100644
index 0000000..8f1b3cb
--- /dev/null
+++ b/app/components/workflow/nodes/answer/types.ts
@@ -0,0 +1,6 @@
+import type { CommonNodeType, Variable } from '@/app/components/workflow/types'
+
+export type AnswerNodeType = CommonNodeType & {
+  variables: Variable[]
+  answer: string
+}
diff --git a/app/components/workflow/nodes/answer/use-config.ts b/app/components/workflow/nodes/answer/use-config.ts
new file mode 100644
index 0000000..269d953
--- /dev/null
+++ b/app/components/workflow/nodes/answer/use-config.ts
@@ -0,0 +1,41 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import useVarList from '../_base/hooks/use-var-list'
+import type { Var } from '../../types'
+import { VarType } from '../../types'
+import type { AnswerNodeType } from './types'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import {
+  useNodesReadOnly,
+} from '@/app/components/workflow/hooks'
+
+const useConfig = (id: string, payload: AnswerNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const { inputs, setInputs } = useNodeCrud<AnswerNodeType>(id, payload)
+  // variables
+  const { handleVarListChange, handleAddVariable } = useVarList<AnswerNodeType>({
+    inputs,
+    setInputs,
+  })
+
+  const handleAnswerChange = useCallback((value: string) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.answer = value
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const filterVar = useCallback((varPayload: Var) => {
+    return varPayload.type !== VarType.arrayObject
+  }, [])
+  return {
+    readOnly,
+    inputs,
+    handleVarListChange,
+    handleAddVariable,
+    handleAnswerChange,
+    filterVar,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/answer/utils.ts b/app/components/workflow/nodes/answer/utils.ts
new file mode 100644
index 0000000..8c34248
--- /dev/null
+++ b/app/components/workflow/nodes/answer/utils.ts
@@ -0,0 +1,5 @@
+import type { AnswerNodeType } from './types'
+
+export const checkNodeValid = (payload: AnswerNodeType) => {
+  return true
+}
diff --git a/app/components/workflow/nodes/assigner/components/operation-selector.tsx b/app/components/workflow/nodes/assigner/components/operation-selector.tsx
new file mode 100644
index 0000000..98acb61
--- /dev/null
+++ b/app/components/workflow/nodes/assigner/components/operation-selector.tsx
@@ -0,0 +1,128 @@
+import type { FC } from 'react'
+import { useState } from 'react'
+import {
+  RiArrowDownSLine,
+  RiCheckLine,
+} from '@remixicon/react'
+import classNames from 'classnames'
+import { useTranslation } from 'react-i18next'
+import type { WriteMode } from '../types'
+import { getOperationItems } from '../utils'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import type { VarType } from '@/app/components/workflow/types'
+import Divider from '@/app/components/base/divider'
+
+type Item = {
+  value: string | number
+  name: string
+}
+
+type OperationSelectorProps = {
+  value: string | number
+  onSelect: (value: Item) => void
+  placeholder?: string
+  disabled?: boolean
+  className?: string
+  popupClassName?: string
+  assignedVarType?: VarType
+  writeModeTypes?: WriteMode[]
+  writeModeTypesArr?: WriteMode[]
+  writeModeTypesNum?: WriteMode[]
+}
+
+const i18nPrefix = 'workflow.nodes.assigner'
+
+const OperationSelector: FC<OperationSelectorProps> = ({
+  value,
+  onSelect,
+  disabled = false,
+  className,
+  popupClassName,
+  assignedVarType,
+  writeModeTypes,
+  writeModeTypesArr,
+  writeModeTypesNum,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const items = getOperationItems(assignedVarType, writeModeTypes, writeModeTypesArr, writeModeTypesNum)
+
+  const selectedItem = items.find(item => item.value === value)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <PortalToFollowElemTrigger
+        onClick={() => !disabled && setOpen(v => !v)}
+      >
+        <div
+          className={classNames(
+            'flex items-center px-2 py-1 gap-0.5 rounded-lg bg-components-input-bg-normal',
+            disabled ? 'cursor-not-allowed !bg-components-input-bg-disabled' : 'cursor-pointer hover:bg-state-base-hover-alt',
+            open && 'bg-state-base-hover-alt',
+            className,
+          )}
+        >
+          <div className='flex items-center p-1'>
+            <span
+              className={`system-sm-regular overflow-hidden truncate text-ellipsis
+                ${selectedItem ? 'text-components-input-text-filled' : 'text-components-input-text-disabled'}`}
+            >
+              {selectedItem?.name ? t(`${i18nPrefix}.operations.${selectedItem?.name}`) : t(`${i18nPrefix}.operations.title`)}
+            </span>
+          </div>
+          <RiArrowDownSLine className={`h-4 w-4 text-text-quaternary ${disabled && 'text-components-input-text-placeholder'} ${open && 'text-text-secondary'}`} />
+        </div>
+      </PortalToFollowElemTrigger>
+
+      <PortalToFollowElemContent className={`z-20 ${popupClassName}`}>
+        <div className='flex w-[140px] flex-col items-start rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg'>
+          <div className='flex flex-col items-start self-stretch p-1'>
+            <div className='flex items-start self-stretch px-3 pb-0.5 pt-1'>
+              <div className='system-xs-medium-uppercase flex grow text-text-tertiary'>{t(`${i18nPrefix}.operations.title`)}</div>
+            </div>
+            {items.map(item => (
+              item.value === 'divider'
+                ? (
+                  <Divider key="divider" className="my-1" />
+                )
+                : (
+                  <div
+                    key={item.value}
+                    className={classNames(
+                      'flex items-center px-2 py-1 gap-1 self-stretch rounded-lg',
+                      'cursor-pointer hover:bg-state-base-hover',
+                    )}
+                    onClick={() => {
+                      onSelect(item)
+                      setOpen(false)
+                    }}
+                  >
+                    <div className='flex min-h-5 grow items-center gap-1 px-1'>
+                      <span className={'system-sm-medium flex grow text-text-secondary'}>{t(`${i18nPrefix}.operations.${item.name}`)}</span>
+                    </div>
+                    {item.value === value && (
+                      <div className='flex items-center justify-center'>
+                        <RiCheckLine className='h-4 w-4 text-text-accent' />
+                      </div>
+                    )}
+                  </div>
+                )
+            ))}
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default OperationSelector
diff --git a/app/components/workflow/nodes/assigner/components/var-list/index.tsx b/app/components/workflow/nodes/assigner/components/var-list/index.tsx
new file mode 100644
index 0000000..f34a143
--- /dev/null
+++ b/app/components/workflow/nodes/assigner/components/var-list/index.tsx
@@ -0,0 +1,225 @@
+'use client'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import React, { useCallback } from 'react'
+import produce from 'immer'
+import { RiDeleteBinLine } from '@remixicon/react'
+import OperationSelector from '../operation-selector'
+import { AssignerNodeInputType, WriteMode } from '../../types'
+import type { AssignerNodeOperation } from '../../types'
+import ListNoDataPlaceholder from '@/app/components/workflow/nodes/_base/components/list-no-data-placeholder'
+import VarReferencePicker from '@/app/components/workflow/nodes/_base/components/variable/var-reference-picker'
+import type { ValueSelector, Var, VarType } from '@/app/components/workflow/types'
+import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+import ActionButton from '@/app/components/base/action-button'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
+import { noop } from 'lodash-es'
+
+type Props = {
+  readonly: boolean
+  nodeId: string
+  list: AssignerNodeOperation[]
+  onChange: (list: AssignerNodeOperation[], value?: ValueSelector) => void
+  onOpen?: (index: number) => void
+  filterVar?: (payload: Var, valueSelector: ValueSelector) => boolean
+  filterToAssignedVar?: (payload: Var, assignedVarType: VarType, write_mode: WriteMode) => boolean
+  getAssignedVarType?: (valueSelector: ValueSelector) => VarType
+  getToAssignedVarType?: (assignedVarType: VarType, write_mode: WriteMode) => VarType
+  writeModeTypes?: WriteMode[]
+  writeModeTypesArr?: WriteMode[]
+  writeModeTypesNum?: WriteMode[]
+}
+
+const VarList: FC<Props> = ({
+  readonly,
+  nodeId,
+  list,
+  onChange,
+  onOpen = noop,
+  filterVar,
+  filterToAssignedVar,
+  getAssignedVarType,
+  getToAssignedVarType,
+  writeModeTypes,
+  writeModeTypesArr,
+  writeModeTypesNum,
+}) => {
+  const { t } = useTranslation()
+  const handleAssignedVarChange = useCallback((index: number) => {
+    return (value: ValueSelector | string) => {
+      const newList = produce(list, (draft) => {
+        draft[index].variable_selector = value as ValueSelector
+        draft[index].operation = WriteMode.overwrite
+        draft[index].value = undefined
+      })
+      onChange(newList, value as ValueSelector)
+    }
+  }, [list, onChange])
+
+  const handleOperationChange = useCallback((index: number) => {
+    return (item: { value: string | number }) => {
+      const newList = produce(list, (draft) => {
+        draft[index].operation = item.value as WriteMode
+        draft[index].value = '' // Clear value when operation changes
+        if (item.value === WriteMode.set || item.value === WriteMode.increment || item.value === WriteMode.decrement
+          || item.value === WriteMode.multiply || item.value === WriteMode.divide)
+          draft[index].input_type = AssignerNodeInputType.constant
+        else
+          draft[index].input_type = AssignerNodeInputType.variable
+      })
+      onChange(newList)
+    }
+  }, [list, onChange])
+
+  const handleToAssignedVarChange = useCallback((index: number) => {
+    return (value: ValueSelector | string | number) => {
+      const newList = produce(list, (draft) => {
+        draft[index].value = value as ValueSelector
+      })
+      onChange(newList, value as ValueSelector)
+    }
+  }, [list, onChange])
+
+  const handleVarRemove = useCallback((index: number) => {
+    return () => {
+      const newList = produce(list, (draft) => {
+        draft.splice(index, 1)
+      })
+      onChange(newList)
+    }
+  }, [list, onChange])
+
+  const handleOpen = useCallback((index: number) => {
+    return () => onOpen(index)
+  }, [onOpen])
+
+  const handleFilterToAssignedVar = useCallback((index: number) => {
+    return (payload: Var) => {
+      const { variable_selector, operation } = list[index]
+      if (!variable_selector || !operation || !filterToAssignedVar) return true
+
+      const assignedVarType = getAssignedVarType?.(variable_selector)
+      const isSameVariable = Array.isArray(variable_selector) && variable_selector.join('.') === `${payload.nodeId}.${payload.variable}`
+
+      return !isSameVariable && (!assignedVarType || filterToAssignedVar(payload, assignedVarType, operation))
+    }
+  }, [list, filterToAssignedVar, getAssignedVarType])
+
+  if (list.length === 0) {
+    return (
+      <ListNoDataPlaceholder>
+        {t('workflow.nodes.assigner.noVarTip')}
+      </ListNoDataPlaceholder>
+    )
+  }
+
+  return (
+    <div className='flex flex-col items-start gap-4 self-stretch'>
+      {list.map((item, index) => {
+        const assignedVarType = item.variable_selector ? getAssignedVarType?.(item.variable_selector) : undefined
+        const toAssignedVarType = (assignedVarType && item.operation && getToAssignedVarType)
+          ? getToAssignedVarType(assignedVarType, item.operation)
+          : undefined
+
+        return (
+          <div className='flex items-start gap-1 self-stretch' key={index}>
+            <div className='flex grow flex-col items-start gap-1'>
+              <div className='flex items-center gap-1 self-stretch'>
+                <VarReferencePicker
+                  readonly={readonly}
+                  nodeId={nodeId}
+                  isShowNodeName
+                  value={item.variable_selector || []}
+                  onChange={handleAssignedVarChange(index)}
+                  onOpen={handleOpen(index)}
+                  filterVar={filterVar}
+                  placeholder={t('workflow.nodes.assigner.selectAssignedVariable') as string}
+                  minWidth={352}
+                  popupFor='assigned'
+                  className='w-full'
+                />
+                <OperationSelector
+                  value={item.operation}
+                  placeholder='Operation'
+                  disabled={!item.variable_selector || item.variable_selector.length === 0}
+                  onSelect={handleOperationChange(index)}
+                  assignedVarType={assignedVarType}
+                  writeModeTypes={writeModeTypes}
+                  writeModeTypesArr={writeModeTypesArr}
+                  writeModeTypesNum={writeModeTypesNum}
+                />
+              </div>
+              {item.operation !== WriteMode.clear && item.operation !== WriteMode.set
+                && item.operation !== WriteMode.removeFirst && item.operation !== WriteMode.removeLast
+                && !writeModeTypesNum?.includes(item.operation)
+                && (
+                  <VarReferencePicker
+                    readonly={readonly || !item.variable_selector || !item.operation}
+                    nodeId={nodeId}
+                    isShowNodeName
+                    value={item.value}
+                    onChange={handleToAssignedVarChange(index)}
+                    filterVar={handleFilterToAssignedVar(index)}
+                    valueTypePlaceHolder={toAssignedVarType}
+                    placeholder={t('workflow.nodes.assigner.setParameter') as string}
+                    minWidth={352}
+                    popupFor='toAssigned'
+                    className='w-full'
+                  />
+                )
+              }
+              {item.operation === WriteMode.set && assignedVarType && (
+                <>
+                  {assignedVarType === 'number' && (
+                    <Input
+                      type="number"
+                      value={item.value as number}
+                      onChange={e => handleToAssignedVarChange(index)(Number(e.target.value))}
+                      className='w-full'
+                    />
+                  )}
+                  {assignedVarType === 'string' && (
+                    <Textarea
+                      value={item.value as string}
+                      onChange={e => handleToAssignedVarChange(index)(e.target.value)}
+                      className='w-full'
+                    />
+                  )}
+                  {assignedVarType === 'object' && (
+                    <CodeEditor
+                      value={item.value as string}
+                      language={CodeLanguage.json}
+                      onChange={value => handleToAssignedVarChange(index)(value)}
+                      className='w-full'
+                      readOnly={readonly}
+                    />
+                  )}
+                </>
+              )}
+              {writeModeTypesNum?.includes(item.operation)
+                && <Input
+                  type="number"
+                  value={item.value as number}
+                  onChange={e => handleToAssignedVarChange(index)(Number(e.target.value))}
+                  placeholder="Enter number value..."
+                  className='w-full'
+                />
+              }
+            </div>
+            <ActionButton
+              size='l'
+              className='group shrink-0 hover:!bg-state-destructive-hover'
+              onClick={handleVarRemove(index)}
+            >
+              <RiDeleteBinLine className='h-4 w-4 text-text-tertiary group-hover:text-text-destructive' />
+            </ActionButton>
+          </div>
+        )
+      },
+      )}
+    </div>
+  )
+}
+export default React.memo(VarList)
diff --git a/app/components/workflow/nodes/assigner/components/var-list/use-var-list.ts b/app/components/workflow/nodes/assigner/components/var-list/use-var-list.ts
new file mode 100644
index 0000000..1ae53ce
--- /dev/null
+++ b/app/components/workflow/nodes/assigner/components/var-list/use-var-list.ts
@@ -0,0 +1,39 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import type { AssignerNodeOperation, AssignerNodeType } from '../../types'
+import { AssignerNodeInputType, WriteMode } from '../../types'
+
+type Params = {
+  id: string
+  inputs: AssignerNodeType
+  setInputs: (newInputs: AssignerNodeType) => void
+}
+function useVarList({
+  inputs,
+  setInputs,
+}: Params) {
+  const handleVarListChange = useCallback((newList: AssignerNodeOperation[]) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.items = newList
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleAddVariable = useCallback(() => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.items.push({
+        variable_selector: [],
+        input_type: AssignerNodeInputType.constant,
+        operation: WriteMode.overwrite,
+        value: '',
+      })
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+  return {
+    handleVarListChange,
+    handleAddVariable,
+  }
+}
+
+export default useVarList
diff --git a/app/components/workflow/nodes/assigner/default.ts b/app/components/workflow/nodes/assigner/default.ts
new file mode 100644
index 0000000..6341305
--- /dev/null
+++ b/app/components/workflow/nodes/assigner/default.ts
@@ -0,0 +1,52 @@
+import { BlockEnum } from '../../types'
+import type { NodeDefault } from '../../types'
+import { type AssignerNodeType, WriteMode } from './types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+const i18nPrefix = 'workflow.errorMsg'
+
+const nodeDefault: NodeDefault<AssignerNodeType> = {
+  defaultValue: {
+    version: '2',
+    items: [],
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: AssignerNodeType, t: any) {
+    let errorMessages = ''
+    const {
+      items: operationItems,
+    } = payload
+
+    operationItems?.forEach((value) => {
+      if (!errorMessages && !value.variable_selector?.length)
+        errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t('workflow.nodes.assigner.assignedVariable') })
+
+      if (!errorMessages && value.operation !== WriteMode.clear && value.operation !== WriteMode.removeFirst && value.operation !== WriteMode.removeLast) {
+        if (value.operation === WriteMode.set || value.operation === WriteMode.increment
+          || value.operation === WriteMode.decrement || value.operation === WriteMode.multiply
+          || value.operation === WriteMode.divide) {
+          if (!value.value && typeof value.value !== 'number')
+            errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t('workflow.nodes.assigner.variable') })
+        }
+        else if (!value.value?.length) {
+          errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t('workflow.nodes.assigner.variable') })
+        }
+      }
+    })
+
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/assigner/hooks.ts b/app/components/workflow/nodes/assigner/hooks.ts
new file mode 100644
index 0000000..d0600e5
--- /dev/null
+++ b/app/components/workflow/nodes/assigner/hooks.ts
@@ -0,0 +1,70 @@
+import { useCallback } from 'react'
+import {
+  useNodes,
+} from 'reactflow'
+import { uniqBy } from 'lodash-es'
+import {
+  useIsChatMode,
+  useWorkflow,
+  useWorkflowVariables,
+} from '../../hooks'
+import type {
+  Node,
+  Var,
+} from '../../types'
+import { AssignerNodeInputType, WriteMode } from './types'
+
+export const useGetAvailableVars = () => {
+  const nodes: Node[] = useNodes()
+  const { getBeforeNodesInSameBranchIncludeParent } = useWorkflow()
+  const { getNodeAvailableVars } = useWorkflowVariables()
+  const isChatMode = useIsChatMode()
+  const getAvailableVars = useCallback((nodeId: string, handleId: string, filterVar: (v: Var) => boolean, hideEnv = false) => {
+    const availableNodes: Node[] = []
+    const currentNode = nodes.find(node => node.id === nodeId)!
+
+    if (!currentNode)
+      return []
+
+    const beforeNodes = getBeforeNodesInSameBranchIncludeParent(nodeId)
+    availableNodes.push(...beforeNodes)
+    const parentNode = nodes.find(node => node.id === currentNode.parentId)
+
+    if (hideEnv) {
+      return getNodeAvailableVars({
+        parentNode,
+        beforeNodes: uniqBy(availableNodes, 'id').filter(node => node.id !== nodeId),
+        isChatMode,
+        hideEnv,
+        hideChatVar: hideEnv,
+        filterVar,
+      })
+        .map(node => ({
+          ...node,
+          vars: node.isStartNode ? node.vars.filter(v => !v.variable.startsWith('sys.')) : node.vars,
+        }))
+        .filter(item => item.vars.length > 0)
+    }
+
+    return getNodeAvailableVars({
+      parentNode,
+      beforeNodes: uniqBy(availableNodes, 'id').filter(node => node.id !== nodeId),
+      isChatMode,
+      filterVar,
+    })
+  }, [nodes, getBeforeNodesInSameBranchIncludeParent, getNodeAvailableVars, isChatMode])
+
+  return getAvailableVars
+}
+
+export const useHandleAddOperationItem = () => {
+  return useCallback((list: any[]) => {
+    const newItem = {
+      variable_selector: [],
+      write_mode: WriteMode.overwrite,
+      input_type: AssignerNodeInputType.variable,
+      value: '',
+    }
+    return [...list, newItem]
+  }, [])
+}
diff --git a/app/components/workflow/nodes/assigner/node.tsx b/app/components/workflow/nodes/assigner/node.tsx
new file mode 100644
index 0000000..2dd1ead
--- /dev/null
+++ b/app/components/workflow/nodes/assigner/node.tsx
@@ -0,0 +1,86 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useNodes } from 'reactflow'
+import { useTranslation } from 'react-i18next'
+import NodeVariableItem from '../variable-assigner/components/node-variable-item'
+import type { AssignerNodeType } from './types'
+import { isConversationVar, isENV, isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+import { BlockEnum, type Node, type NodeProps } from '@/app/components/workflow/types'
+
+const i18nPrefix = 'workflow.nodes.assigner'
+
+const NodeComponent: FC<NodeProps<AssignerNodeType>> = ({
+  data,
+}) => {
+  const { t } = useTranslation()
+  const nodes: Node[] = useNodes()
+  if (data.version === '2') {
+    const { items: operationItems } = data
+    const validOperationItems = operationItems?.filter(item =>
+      item.variable_selector && item.variable_selector.length > 0,
+    ) || []
+
+    if (validOperationItems.length === 0) {
+      return (
+        <div className='relative flex flex-col items-start gap-0.5 self-stretch px-3 py-1'>
+          <div className='flex flex-col items-start gap-1 self-stretch'>
+            <div className='flex items-center gap-1 self-stretch rounded-md bg-workflow-block-parma-bg px-[5px] py-1'>
+              <div className='system-xs-medium flex-1 text-text-tertiary'>{t(`${i18nPrefix}.varNotSet`)}</div>
+            </div>
+          </div>
+        </div>
+      )
+    }
+    return (
+      <div className='relative flex flex-col items-start gap-0.5 self-stretch px-3 py-1'>
+        {operationItems.map((value, index) => {
+          const variable = value.variable_selector
+          if (!variable || variable.length === 0)
+            return null
+          const isSystem = isSystemVar(variable)
+          const isEnv = isENV(variable)
+          const isChatVar = isConversationVar(variable)
+          const node = isSystem ? nodes.find(node => node.data.type === BlockEnum.Start) : nodes.find(node => node.id === variable[0])
+          const varName = isSystem ? `sys.${variable[variable.length - 1]}` : variable.slice(1).join('.')
+          return (
+            <NodeVariableItem
+              key={index}
+              node={node as Node}
+              isEnv={isEnv}
+              isChatVar={isChatVar}
+              writeMode={value.operation}
+              varName={varName}
+              className='bg-workflow-block-parma-bg'
+            />
+          )
+        })}
+      </div>
+    )
+  }
+  // Legacy version
+  const { assigned_variable_selector: variable, write_mode: writeMode } = data as any
+
+  if (!variable || variable.length === 0)
+    return null
+  const isSystem = isSystemVar(variable)
+  const isEnv = isENV(variable)
+  const isChatVar = isConversationVar(variable)
+
+  const node = isSystem ? nodes.find(node => node.data.type === BlockEnum.Start) : nodes.find(node => node.id === variable[0])
+  const varName = isSystem ? `sys.${variable[variable.length - 1]}` : variable.slice(1).join('.')
+
+  return (
+    <div className='relative flex flex-col items-start gap-0.5 self-stretch px-3 py-1'>
+      <NodeVariableItem
+        node={node as Node}
+        isEnv={isEnv}
+        isChatVar={isChatVar}
+        varName={varName}
+        writeMode={writeMode}
+        className='bg-workflow-block-parma-bg'
+      />
+    </div>
+  )
+}
+
+export default React.memo(NodeComponent)
diff --git a/app/components/workflow/nodes/assigner/panel.tsx b/app/components/workflow/nodes/assigner/panel.tsx
new file mode 100644
index 0000000..430f1ae
--- /dev/null
+++ b/app/components/workflow/nodes/assigner/panel.tsx
@@ -0,0 +1,68 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAddLine,
+} from '@remixicon/react'
+import VarList from './components/var-list'
+import useConfig from './use-config'
+import type { AssignerNodeType } from './types'
+import type { NodePanelProps } from '@/app/components/workflow/types'
+import { useHandleAddOperationItem } from './hooks'
+import ActionButton from '@/app/components/base/action-button'
+
+const i18nPrefix = 'workflow.nodes.assigner'
+
+const Panel: FC<NodePanelProps<AssignerNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+  const handleAddOperationItem = useHandleAddOperationItem()
+  const {
+    readOnly,
+    inputs,
+    handleOperationListChanges,
+    getAssignedVarType,
+    getToAssignedVarType,
+    writeModeTypesNum,
+    writeModeTypesArr,
+    writeModeTypes,
+    filterAssignedVar,
+    filterToAssignedVar,
+  } = useConfig(id, data)
+  const handleAddOperation = () => {
+    const newList = handleAddOperationItem(inputs.items || [])
+    handleOperationListChanges(newList)
+  }
+
+  return (
+    <div className='flex flex-col items-start self-stretch py-2'>
+      <div className='flex w-full flex-col items-start justify-center gap-1 self-stretch px-4 py-2'>
+        <div className='flex items-start gap-2 self-stretch'>
+          <div className='system-sm-semibold-uppercase flex grow flex-col items-start justify-center text-text-secondary'>{t(`${i18nPrefix}.variables`)}</div>
+          <ActionButton onClick={handleAddOperation}>
+            <RiAddLine className='h-4 w-4 shrink-0 text-text-tertiary' />
+          </ActionButton>
+        </div>
+        <VarList
+          readonly={readOnly}
+          nodeId={id}
+          list={inputs.items || []}
+          onChange={(newList) => {
+            handleOperationListChanges(newList)
+          }}
+          filterVar={filterAssignedVar}
+          filterToAssignedVar={filterToAssignedVar}
+          getAssignedVarType={getAssignedVarType}
+          writeModeTypes={writeModeTypes}
+          writeModeTypesArr={writeModeTypesArr}
+          writeModeTypesNum={writeModeTypesNum}
+          getToAssignedVarType={getToAssignedVarType}
+        />
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/assigner/types.ts b/app/components/workflow/nodes/assigner/types.ts
new file mode 100644
index 0000000..85d2b28
--- /dev/null
+++ b/app/components/workflow/nodes/assigner/types.ts
@@ -0,0 +1,32 @@
+import type { CommonNodeType, ValueSelector } from '@/app/components/workflow/types'
+
+export enum WriteMode {
+  overwrite = 'over-write',
+  clear = 'clear',
+  append = 'append',
+  extend = 'extend',
+  set = 'set',
+  increment = '+=',
+  decrement = '-=',
+  multiply = '*=',
+  divide = '/=',
+  removeFirst = 'remove-first',
+  removeLast = 'remove-last',
+}
+
+export enum AssignerNodeInputType {
+  variable = 'variable',
+  constant = 'constant',
+}
+
+export type AssignerNodeOperation = {
+  variable_selector: ValueSelector
+  input_type: AssignerNodeInputType
+  operation: WriteMode
+  value: any
+}
+
+export type AssignerNodeType = CommonNodeType & {
+  version?: '1' | '2'
+  items: AssignerNodeOperation[]
+}
diff --git a/app/components/workflow/nodes/assigner/use-config.ts b/app/components/workflow/nodes/assigner/use-config.ts
new file mode 100644
index 0000000..cbd5475
--- /dev/null
+++ b/app/components/workflow/nodes/assigner/use-config.ts
@@ -0,0 +1,133 @@
+import { useCallback, useMemo } from 'react'
+import produce from 'immer'
+import { useStoreApi } from 'reactflow'
+import { VarType } from '../../types'
+import type { ValueSelector, Var } from '../../types'
+import { WriteMode } from './types'
+import type { AssignerNodeOperation, AssignerNodeType } from './types'
+import { useGetAvailableVars } from './hooks'
+import { convertV1ToV2 } from './utils'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import {
+  useIsChatMode,
+  useNodesReadOnly,
+  useWorkflow,
+  useWorkflowVariables,
+} from '@/app/components/workflow/hooks'
+
+const useConfig = (id: string, rawPayload: AssignerNodeType) => {
+  const payload = useMemo(() => convertV1ToV2(rawPayload), [rawPayload])
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const isChatMode = useIsChatMode()
+  const getAvailableVars = useGetAvailableVars()
+  const filterVar = (varType: VarType) => {
+    return (v: Var) => {
+      if (varType === VarType.any)
+        return true
+      if (v.type === VarType.any)
+        return true
+      return v.type === varType
+    }
+  }
+
+  const store = useStoreApi()
+  const { getBeforeNodesInSameBranchIncludeParent } = useWorkflow()
+
+  const {
+    getNodes,
+  } = store.getState()
+  const currentNode = getNodes().find(n => n.id === id)
+  const isInIteration = payload.isInIteration
+  const iterationNode = isInIteration ? getNodes().find(n => n.id === currentNode!.parentId) : null
+  const availableNodes = useMemo(() => {
+    return getBeforeNodesInSameBranchIncludeParent(id)
+  }, [getBeforeNodesInSameBranchIncludeParent, id])
+  const { inputs, setInputs } = useNodeCrud<AssignerNodeType>(id, payload)
+  const newSetInputs = useCallback((newInputs: AssignerNodeType) => {
+    const finalInputs = produce(newInputs, (draft) => {
+      if (draft.version !== '2')
+        draft.version = '2'
+    })
+    setInputs(finalInputs)
+  }, [setInputs])
+
+  const { getCurrentVariableType } = useWorkflowVariables()
+  const getAssignedVarType = useCallback((valueSelector: ValueSelector) => {
+    return getCurrentVariableType({
+      parentNode: isInIteration ? iterationNode : null,
+      valueSelector: valueSelector || [],
+      availableNodes,
+      isChatMode,
+      isConstant: false,
+    })
+  }, [getCurrentVariableType, isInIteration, iterationNode, availableNodes, isChatMode])
+
+  const handleOperationListChanges = useCallback((items: AssignerNodeOperation[]) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.items = [...items]
+    })
+    newSetInputs(newInputs)
+  }, [inputs, newSetInputs])
+
+  const writeModeTypesArr = [WriteMode.overwrite, WriteMode.clear, WriteMode.append, WriteMode.extend, WriteMode.removeFirst, WriteMode.removeLast]
+  const writeModeTypes = [WriteMode.overwrite, WriteMode.clear, WriteMode.set]
+  const writeModeTypesNum = [WriteMode.increment, WriteMode.decrement, WriteMode.multiply, WriteMode.divide]
+
+  const getToAssignedVarType = useCallback((assignedVarType: VarType, write_mode: WriteMode) => {
+    if (write_mode === WriteMode.overwrite || write_mode === WriteMode.increment || write_mode === WriteMode.decrement
+      || write_mode === WriteMode.multiply || write_mode === WriteMode.divide || write_mode === WriteMode.extend)
+      return assignedVarType
+    if (write_mode === WriteMode.append) {
+      if (assignedVarType === VarType.arrayString)
+        return VarType.string
+      if (assignedVarType === VarType.arrayNumber)
+        return VarType.number
+      if (assignedVarType === VarType.arrayObject)
+        return VarType.object
+    }
+    return VarType.string
+  }, [])
+
+  const filterAssignedVar = useCallback((varPayload: Var, selector: ValueSelector) => {
+    if (varPayload.isLoopVariable)
+      return true
+    return selector.join('.').startsWith('conversation')
+  }, [])
+
+  const filterToAssignedVar = useCallback((varPayload: Var, assignedVarType: VarType, write_mode: WriteMode) => {
+    if (write_mode === WriteMode.overwrite || write_mode === WriteMode.extend || write_mode === WriteMode.increment
+      || write_mode === WriteMode.decrement || write_mode === WriteMode.multiply || write_mode === WriteMode.divide) {
+      return varPayload.type === assignedVarType
+    }
+    else if (write_mode === WriteMode.append) {
+      switch (assignedVarType) {
+        case VarType.arrayString:
+          return varPayload.type === VarType.string
+        case VarType.arrayNumber:
+          return varPayload.type === VarType.number
+        case VarType.arrayObject:
+          return varPayload.type === VarType.object
+        default:
+          return false
+      }
+    }
+    return true
+  }, [])
+
+  return {
+    readOnly,
+    inputs,
+    handleOperationListChanges,
+    getAssignedVarType,
+    getToAssignedVarType,
+    writeModeTypes,
+    writeModeTypesArr,
+    writeModeTypesNum,
+    filterAssignedVar,
+    filterToAssignedVar,
+    getAvailableVars,
+    filterVar,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/assigner/utils.ts b/app/components/workflow/nodes/assigner/utils.ts
new file mode 100644
index 0000000..c9fe123
--- /dev/null
+++ b/app/components/workflow/nodes/assigner/utils.ts
@@ -0,0 +1,83 @@
+import type { AssignerNodeType } from './types'
+import { AssignerNodeInputType, WriteMode } from './types'
+
+export const checkNodeValid = (payload: AssignerNodeType) => {
+  return true
+}
+
+export const formatOperationName = (type: string) => {
+  if (type === 'over-write')
+    return 'Overwrite'
+  return type.charAt(0).toUpperCase() + type.slice(1)
+}
+
+type Item = {
+  value: string | number
+  name: string
+}
+
+export const getOperationItems = (
+  assignedVarType?: string,
+  writeModeTypes?: WriteMode[],
+  writeModeTypesArr?: WriteMode[],
+  writeModeTypesNum?: WriteMode[],
+): Item[] => {
+  if (assignedVarType?.startsWith('array') && writeModeTypesArr) {
+    return writeModeTypesArr.map(type => ({
+      value: type,
+      name: type,
+    }))
+  }
+
+  if (assignedVarType === 'number' && writeModeTypes && writeModeTypesNum) {
+    return [
+      ...writeModeTypes.map(type => ({
+        value: type,
+        name: type,
+      })),
+      { value: 'divider', name: 'divider' } as Item,
+      ...writeModeTypesNum.map(type => ({
+        value: type,
+        name: type,
+      })),
+    ]
+  }
+
+  if (writeModeTypes && ['string', 'object'].includes(assignedVarType || '')) {
+    return writeModeTypes.map(type => ({
+      value: type,
+      name: type,
+    }))
+  }
+
+  return []
+}
+
+const convertOldWriteMode = (oldMode: string): WriteMode => {
+  switch (oldMode) {
+    case 'over-write':
+      return WriteMode.overwrite
+    case 'append':
+      return WriteMode.append
+    case 'clear':
+      return WriteMode.clear
+    default:
+      return WriteMode.overwrite
+  }
+}
+
+export const convertV1ToV2 = (payload: any): AssignerNodeType => {
+  if (payload.version === '2' && payload.items)
+    return payload as AssignerNodeType
+
+  return {
+    version: '2',
+    items: [{
+      variable_selector: payload.assigned_variable_selector || [],
+      input_type: AssignerNodeInputType.variable,
+      operation: convertOldWriteMode(payload.write_mode),
+      value: payload.input_variable_selector || [],
+    }],
+    ...payload,
+  }
+}
diff --git a/app/components/workflow/nodes/code/code-parser.spec.ts b/app/components/workflow/nodes/code/code-parser.spec.ts
new file mode 100644
index 0000000..b5d28dd
--- /dev/null
+++ b/app/components/workflow/nodes/code/code-parser.spec.ts
@@ -0,0 +1,326 @@
+import { VarType } from '../../types'
+import { extractFunctionParams, extractReturnType } from './code-parser'
+import { CodeLanguage } from './types'
+
+const SAMPLE_CODES = {
+  python3: {
+    noParams: 'def main():',
+    singleParam: 'def main(param1):',
+    multipleParams: `def main(param1, param2, param3):
+      return {"result": param1}`,
+    withTypes: `def main(param1: str, param2: int, param3: List[str]):
+      result = process_data(param1, param2)
+      return {"output": result}`,
+    withDefaults: `def main(param1: str = "default", param2: int = 0):
+      return {"data": param1}`,
+  },
+  javascript: {
+    noParams: 'function main() {',
+    singleParam: 'function main(param1) {',
+    multipleParams: `function main(param1, param2, param3) {
+      return { result: param1 }
+    }`,
+    withComments: `// Main function
+    function main(param1, param2) {
+      // Process data
+      return { output: process(param1, param2) }
+    }`,
+    withSpaces: 'function main(  param1  ,   param2  ) {',
+  },
+}
+
+describe('extractFunctionParams', () => {
+  describe('Python3', () => {
+    test('handles no parameters', () => {
+      const result = extractFunctionParams(SAMPLE_CODES.python3.noParams, CodeLanguage.python3)
+      expect(result).toEqual([])
+    })
+
+    test('extracts single parameter', () => {
+      const result = extractFunctionParams(SAMPLE_CODES.python3.singleParam, CodeLanguage.python3)
+      expect(result).toEqual(['param1'])
+    })
+
+    test('extracts multiple parameters', () => {
+      const result = extractFunctionParams(SAMPLE_CODES.python3.multipleParams, CodeLanguage.python3)
+      expect(result).toEqual(['param1', 'param2', 'param3'])
+    })
+
+    test('handles type hints', () => {
+      const result = extractFunctionParams(SAMPLE_CODES.python3.withTypes, CodeLanguage.python3)
+      expect(result).toEqual(['param1', 'param2', 'param3'])
+    })
+
+    test('handles default values', () => {
+      const result = extractFunctionParams(SAMPLE_CODES.python3.withDefaults, CodeLanguage.python3)
+      expect(result).toEqual(['param1', 'param2'])
+    })
+  })
+
+  // JavaScript銇儐銈广儓銈便兗銈�
+  describe('JavaScript', () => {
+    test('handles no parameters', () => {
+      const result = extractFunctionParams(SAMPLE_CODES.javascript.noParams, CodeLanguage.javascript)
+      expect(result).toEqual([])
+    })
+
+    test('extracts single parameter', () => {
+      const result = extractFunctionParams(SAMPLE_CODES.javascript.singleParam, CodeLanguage.javascript)
+      expect(result).toEqual(['param1'])
+    })
+
+    test('extracts multiple parameters', () => {
+      const result = extractFunctionParams(SAMPLE_CODES.javascript.multipleParams, CodeLanguage.javascript)
+      expect(result).toEqual(['param1', 'param2', 'param3'])
+    })
+
+    test('handles comments in code', () => {
+      const result = extractFunctionParams(SAMPLE_CODES.javascript.withComments, CodeLanguage.javascript)
+      expect(result).toEqual(['param1', 'param2'])
+    })
+
+    test('handles whitespace', () => {
+      const result = extractFunctionParams(SAMPLE_CODES.javascript.withSpaces, CodeLanguage.javascript)
+      expect(result).toEqual(['param1', 'param2'])
+    })
+  })
+})
+
+const RETURN_TYPE_SAMPLES = {
+  python3: {
+    singleReturn: `
+def main(param1):
+    return {"result": "value"}`,
+
+    multipleReturns: `
+def main(param1, param2):
+    return {"result": "value", "status": "success"}`,
+
+    noReturn: `
+def main():
+    print("Hello")`,
+
+    complexReturn: `
+def main():
+    data = process()
+    return {"result": data, "count": 42, "messages": ["hello"]}`,
+    nestedObject: `
+    def main(name, age, city):
+        return {
+            'personal_info': {
+                'name': name,
+                'age': age,
+                'city': city
+            },
+            'timestamp': int(time.time()),
+            'status': 'active'
+        }`,
+  },
+
+  javascript: {
+    singleReturn: `
+function main(param1) {
+    return { result: "value" }
+}`,
+
+    multipleReturns: `
+function main(param1) {
+    return { result: "value", status: "success" }
+}`,
+
+    withParentheses: `
+function main() {
+    return ({ result: "value", status: "success" })
+}`,
+
+    noReturn: `
+function main() {
+    console.log("Hello")
+}`,
+
+    withQuotes: `
+function main() {
+    return { "result": 'value', 'status': "success" }
+}`,
+    nestedObject: `
+function main(name, age, city) {
+    return {
+        personal_info: {
+            name: name,
+            age: age,
+            city: city
+        },
+        timestamp: Date.now(),
+        status: 'active'
+    }
+}`,
+    withJSDoc: `
+/**
+ * Creates a user profile with personal information and metadata
+ * @param {string} name - The user's name
+ * @param {number} age - The user's age
+ * @param {string} city - The user's city of residence
+ * @returns {Object} An object containing the user profile
+ */
+function main(name, age, city) {
+    return {
+        result: {
+            personal_info: {
+                name: name,
+                age: age,
+                city: city
+            },
+            timestamp: Date.now(),
+            status: 'active'
+        }
+    };
+}`,
+
+  },
+}
+
+describe('extractReturnType', () => {
+  // Python3銇儐銈广儓
+  describe('Python3', () => {
+    test('extracts single return value', () => {
+      const result = extractReturnType(RETURN_TYPE_SAMPLES.python3.singleReturn, CodeLanguage.python3)
+      expect(result).toEqual({
+        result: {
+          type: VarType.string,
+          children: null,
+        },
+      })
+    })
+
+    test('extracts multiple return values', () => {
+      const result = extractReturnType(RETURN_TYPE_SAMPLES.python3.multipleReturns, CodeLanguage.python3)
+      expect(result).toEqual({
+        result: {
+          type: VarType.string,
+          children: null,
+        },
+        status: {
+          type: VarType.string,
+          children: null,
+        },
+      })
+    })
+
+    test('returns empty object when no return statement', () => {
+      const result = extractReturnType(RETURN_TYPE_SAMPLES.python3.noReturn, CodeLanguage.python3)
+      expect(result).toEqual({})
+    })
+
+    test('handles complex return statement', () => {
+      const result = extractReturnType(RETURN_TYPE_SAMPLES.python3.complexReturn, CodeLanguage.python3)
+      expect(result).toEqual({
+        result: {
+          type: VarType.string,
+          children: null,
+        },
+        count: {
+          type: VarType.string,
+          children: null,
+        },
+        messages: {
+          type: VarType.string,
+          children: null,
+        },
+      })
+    })
+    test('handles nested object structure', () => {
+      const result = extractReturnType(RETURN_TYPE_SAMPLES.python3.nestedObject, CodeLanguage.python3)
+      expect(result).toEqual({
+        personal_info: {
+          type: VarType.string,
+          children: null,
+        },
+        timestamp: {
+          type: VarType.string,
+          children: null,
+        },
+        status: {
+          type: VarType.string,
+          children: null,
+        },
+      })
+    })
+  })
+
+  // JavaScript銇儐銈广儓
+  describe('JavaScript', () => {
+    test('extracts single return value', () => {
+      const result = extractReturnType(RETURN_TYPE_SAMPLES.javascript.singleReturn, CodeLanguage.javascript)
+      expect(result).toEqual({
+        result: {
+          type: VarType.string,
+          children: null,
+        },
+      })
+    })
+
+    test('extracts multiple return values', () => {
+      const result = extractReturnType(RETURN_TYPE_SAMPLES.javascript.multipleReturns, CodeLanguage.javascript)
+      expect(result).toEqual({
+        result: {
+          type: VarType.string,
+          children: null,
+        },
+        status: {
+          type: VarType.string,
+          children: null,
+        },
+      })
+    })
+
+    test('handles return with parentheses', () => {
+      const result = extractReturnType(RETURN_TYPE_SAMPLES.javascript.withParentheses, CodeLanguage.javascript)
+      expect(result).toEqual({
+        result: {
+          type: VarType.string,
+          children: null,
+        },
+        status: {
+          type: VarType.string,
+          children: null,
+        },
+      })
+    })
+
+    test('returns empty object when no return statement', () => {
+      const result = extractReturnType(RETURN_TYPE_SAMPLES.javascript.noReturn, CodeLanguage.javascript)
+      expect(result).toEqual({})
+    })
+
+    test('handles quoted keys', () => {
+      const result = extractReturnType(RETURN_TYPE_SAMPLES.javascript.withQuotes, CodeLanguage.javascript)
+      expect(result).toEqual({
+        result: {
+          type: VarType.string,
+          children: null,
+        },
+        status: {
+          type: VarType.string,
+          children: null,
+        },
+      })
+    })
+    test('handles nested object structure', () => {
+      const result = extractReturnType(RETURN_TYPE_SAMPLES.javascript.nestedObject, CodeLanguage.javascript)
+      expect(result).toEqual({
+        personal_info: {
+          type: VarType.string,
+          children: null,
+        },
+        timestamp: {
+          type: VarType.string,
+          children: null,
+        },
+        status: {
+          type: VarType.string,
+          children: null,
+        },
+      })
+    })
+  })
+})
diff --git a/app/components/workflow/nodes/code/code-parser.ts b/app/components/workflow/nodes/code/code-parser.ts
new file mode 100644
index 0000000..0973a01
--- /dev/null
+++ b/app/components/workflow/nodes/code/code-parser.ts
@@ -0,0 +1,86 @@
+import { VarType } from '../../types'
+import type { OutputVar } from './types'
+import { CodeLanguage } from './types'
+
+export const extractFunctionParams = (code: string, language: CodeLanguage) => {
+  if (language === CodeLanguage.json)
+    return []
+
+  const patterns: Record<Exclude<CodeLanguage, CodeLanguage.json>, RegExp> = {
+    [CodeLanguage.python3]: /def\s+main\s*\((.*?)\)/,
+    [CodeLanguage.javascript]: /function\s+main\s*\((.*?)\)/,
+  }
+  const match = code.match(patterns[language])
+  const params: string[] = []
+
+  if (match?.[1]) {
+    params.push(...match[1].split(',')
+      .map(p => p.trim())
+      .filter(Boolean)
+      .map(p => p.split(':')[0].trim()),
+    )
+  }
+
+  return params
+}
+export const extractReturnType = (code: string, language: CodeLanguage): OutputVar => {
+  const codeWithoutComments = code.replace(/\/\*\*[\s\S]*?\*\//, '')
+  // console.log(codeWithoutComments)
+
+  const returnIndex = codeWithoutComments.indexOf('return')
+  if (returnIndex === -1)
+    return {}
+
+  // return銇嬨倝濮嬨伨銈嬮儴鍒嗘枃瀛楀垪銈掑彇寰�
+  const codeAfterReturn = codeWithoutComments.slice(returnIndex)
+
+  let bracketCount = 0
+  let startIndex = codeAfterReturn.indexOf('{')
+
+  if (language === CodeLanguage.javascript && startIndex === -1) {
+    const parenStart = codeAfterReturn.indexOf('(')
+    if (parenStart !== -1)
+      startIndex = codeAfterReturn.indexOf('{', parenStart)
+  }
+
+  if (startIndex === -1)
+    return {}
+
+  let endIndex = -1
+
+  for (let i = startIndex; i < codeAfterReturn.length; i++) {
+    if (codeAfterReturn[i] === '{')
+      bracketCount++
+    if (codeAfterReturn[i] === '}') {
+      bracketCount--
+      if (bracketCount === 0) {
+        endIndex = i + 1
+        break
+      }
+    }
+  }
+
+  if (endIndex === -1)
+    return {}
+
+  const returnContent = codeAfterReturn.slice(startIndex + 1, endIndex - 1)
+  // console.log(returnContent)
+
+  const result: OutputVar = {}
+
+  const keyRegex = /['"]?(\w+)['"]?\s*:(?![^{]*})/g
+  const matches = returnContent.matchAll(keyRegex)
+
+  for (const match of matches) {
+    // console.log(`Found key: "${match[1]}" from match: "${match[0]}"`)
+    const key = match[1]
+    result[key] = {
+      type: VarType.string,
+      children: null,
+    }
+  }
+
+  // console.log(result)
+
+  return result
+}
diff --git a/app/components/workflow/nodes/code/default.ts b/app/components/workflow/nodes/code/default.ts
new file mode 100644
index 0000000..5f90c18
--- /dev/null
+++ b/app/components/workflow/nodes/code/default.ts
@@ -0,0 +1,43 @@
+import { BlockEnum } from '../../types'
+import type { NodeDefault } from '../../types'
+import { CodeLanguage, type CodeNodeType } from './types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+
+const i18nPrefix = 'workflow.errorMsg'
+
+const nodeDefault: NodeDefault<CodeNodeType> = {
+  defaultValue: {
+    code: '',
+    code_language: CodeLanguage.python3,
+    variables: [],
+    outputs: {},
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: CodeNodeType, t: any) {
+    let errorMessages = ''
+    const { code, variables } = payload
+    if (!errorMessages && variables.filter(v => !v.variable).length > 0)
+      errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variable`) })
+    if (!errorMessages && variables.filter(v => !v.value_selector.length).length > 0)
+      errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variableValue`) })
+    if (!errorMessages && !code)
+      errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.code`) })
+
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/code/dependency-picker.tsx b/app/components/workflow/nodes/code/dependency-picker.tsx
new file mode 100644
index 0000000..a302a21
--- /dev/null
+++ b/app/components/workflow/nodes/code/dependency-picker.tsx
@@ -0,0 +1,85 @@
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { t } from 'i18next'
+import {
+  RiArrowDownSLine,
+} from '@remixicon/react'
+import type { CodeDependency } from './types'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+import Input from '@/app/components/base/input'
+import { Check } from '@/app/components/base/icons/src/vender/line/general'
+
+type Props = {
+  value: CodeDependency
+  available_dependencies: CodeDependency[]
+  onChange: (dependency: CodeDependency) => void
+}
+
+const DependencyPicker: FC<Props> = ({
+  available_dependencies,
+  value,
+  onChange,
+}) => {
+  const [open, setOpen] = useState(false)
+  const [searchText, setSearchText] = useState('')
+
+  const handleChange = useCallback((dependency: CodeDependency) => {
+    return () => {
+      setOpen(false)
+      onChange(dependency)
+    }
+  }, [onChange])
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={4}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(!open)} className='grow cursor-pointer'>
+        <div className='flex h-8 items-center justify-between rounded-lg border-0 bg-gray-100 px-2.5 text-[13px] text-gray-900'>
+          <div className='w-0 grow truncate' title={value.name}>{value.name}</div>
+          <RiArrowDownSLine className='h-3.5 w-3.5 shrink-0 text-gray-700' />
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent style={{
+        zIndex: 100,
+      }}>
+        <div className='rounded-lg bg-white p-1 shadow-sm' style={{
+          width: 350,
+        }}>
+          <div className='mx-1 mb-2'>
+            <Input
+              showLeftIcon
+              showClearIcon
+              value={searchText}
+              placeholder={t('workflow.nodes.code.searchDependencies') || ''}
+              onChange={e => setSearchText(e.target.value)}
+              onClear={() => setSearchText('')}
+              autoFocus
+            />
+          </div>
+          <div className='max-h-[30vh] overflow-y-auto'>
+            {available_dependencies.filter((v) => {
+              if (!searchText)
+                return true
+              return v.name.toLowerCase().includes(searchText.toLowerCase())
+            }).map(dependency => (
+              <div
+                key={dependency.name}
+                className='flex h-[30px] cursor-pointer items-center justify-between rounded-lg pl-3 pr-2 text-[13px] text-gray-900 hover:bg-gray-100'
+                onClick={handleChange(dependency)}
+              >
+                <div className='w-0 grow truncate'>{dependency.name}</div>
+                {dependency.name === value.name && <Check className='h-4 w-4 shrink-0 text-primary-600' />}
+              </div>
+            ))}
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default React.memo(DependencyPicker)
diff --git a/app/components/workflow/nodes/code/node.tsx b/app/components/workflow/nodes/code/node.tsx
new file mode 100644
index 0000000..03e16f5
--- /dev/null
+++ b/app/components/workflow/nodes/code/node.tsx
@@ -0,0 +1,13 @@
+import type { FC } from 'react'
+import React from 'react'
+import type { CodeNodeType } from './types'
+import type { NodeProps } from '@/app/components/workflow/types'
+
+const Node: FC<NodeProps<CodeNodeType>> = () => {
+  return (
+    // No summary content
+    <div></div>
+  )
+}
+
+export default React.memo(Node)
diff --git a/app/components/workflow/nodes/code/panel.tsx b/app/components/workflow/nodes/code/panel.tsx
new file mode 100644
index 0000000..a0b7535
--- /dev/null
+++ b/app/components/workflow/nodes/code/panel.tsx
@@ -0,0 +1,159 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import RemoveEffectVarConfirm from '../_base/components/remove-effect-var-confirm'
+import useConfig from './use-config'
+import type { CodeNodeType } from './types'
+import { CodeLanguage } from './types'
+import { extractFunctionParams, extractReturnType } from './code-parser'
+import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list'
+import OutputVarList from '@/app/components/workflow/nodes/_base/components/variable/output-var-list'
+import AddButton from '@/app/components/base/button/add-button'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import Split from '@/app/components/workflow/nodes/_base/components/split'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
+import TypeSelector from '@/app/components/workflow/nodes/_base/components/selector'
+import type { NodePanelProps } from '@/app/components/workflow/types'
+import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
+import ResultPanel from '@/app/components/workflow/run/result-panel'
+const i18nPrefix = 'workflow.nodes.code'
+
+const codeLanguages = [
+  {
+    label: 'Python3',
+    value: CodeLanguage.python3,
+  },
+  {
+    label: 'JavaScript',
+    value: CodeLanguage.javascript,
+  },
+]
+const Panel: FC<NodePanelProps<CodeNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    readOnly,
+    inputs,
+    outputKeyOrders,
+    handleCodeAndVarsChange,
+    handleVarListChange,
+    handleAddVariable,
+    handleRemoveVariable,
+    handleCodeChange,
+    handleCodeLanguageChange,
+    handleVarsChange,
+    handleAddOutputVariable,
+    filterVar,
+    isShowRemoveVarConfirm,
+    hideRemoveVarConfirm,
+    onRemoveVarConfirm,
+    // single run
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runResult,
+    varInputs,
+    inputVarValues,
+    setInputVarValues,
+  } = useConfig(id, data)
+
+  const handleGeneratedCode = (value: string) => {
+    const params = extractFunctionParams(value, inputs.code_language)
+    const codeNewInput = params.map((p) => {
+      return {
+        variable: p,
+        value_selector: [],
+      }
+    })
+    const returnTypes = extractReturnType(value, inputs.code_language)
+    handleCodeAndVarsChange(value, codeNewInput, returnTypes)
+  }
+
+  return (
+    <div className='mt-2'>
+      <div className='space-y-4 px-4 pb-4'>
+        <Field
+          title={t(`${i18nPrefix}.inputVars`)}
+          operations={
+            !readOnly ? <AddButton onClick={handleAddVariable} /> : undefined
+          }
+        >
+          <VarList
+            readonly={readOnly}
+            nodeId={id}
+            list={inputs.variables}
+            onChange={handleVarListChange}
+            filterVar={filterVar}
+            isSupportFileVar={false}
+          />
+        </Field>
+        <Split />
+        <CodeEditor
+          isInNode
+          readOnly={readOnly}
+          title={
+            <TypeSelector
+              options={codeLanguages}
+              value={inputs.code_language}
+              onChange={handleCodeLanguageChange}
+            />
+          }
+          language={inputs.code_language}
+          value={inputs.code}
+          onChange={handleCodeChange}
+          onGenerated={handleGeneratedCode}
+          showCodeGenerator={true}
+        />
+      </div>
+      <Split />
+      <div className='px-4 pb-2 pt-4'>
+        <Field
+          title={t(`${i18nPrefix}.outputVars`)}
+          operations={
+            <AddButton onClick={handleAddOutputVariable} />
+          }
+          required
+        >
+          <OutputVarList
+            readonly={readOnly}
+            outputs={inputs.outputs}
+            outputKeyOrders={outputKeyOrders}
+            onChange={handleVarsChange}
+            onRemove={handleRemoveVariable}
+          />
+        </Field>
+      </div>
+      {
+        isShowSingleRun && (
+          <BeforeRunForm
+            nodeName={inputs.title}
+            onHide={hideSingleRun}
+            forms={[
+              {
+                inputs: varInputs,
+                values: inputVarValues,
+                onChange: setInputVarValues,
+              },
+            ]}
+            runningStatus={runningStatus}
+            onRun={handleRun}
+            onStop={handleStop}
+            result={<ResultPanel {...runResult} showSteps={false} />}
+          />
+        )
+      }
+      <RemoveEffectVarConfirm
+        isShow={isShowRemoveVarConfirm}
+        onCancel={hideRemoveVarConfirm}
+        onConfirm={onRemoveVarConfirm}
+      />
+    </div >
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/code/types.ts b/app/components/workflow/nodes/code/types.ts
new file mode 100644
index 0000000..9c055f3
--- /dev/null
+++ b/app/components/workflow/nodes/code/types.ts
@@ -0,0 +1,19 @@
+import type { CommonNodeType, VarType, Variable } from '@/app/components/workflow/types'
+
+export enum CodeLanguage {
+  python3 = 'python3',
+  javascript = 'javascript',
+  json = 'json',
+}
+
+export type OutputVar = Record<string, {
+  type: VarType
+  children: null // support nest in the future,
+}>
+
+export type CodeNodeType = CommonNodeType & {
+  variables: Variable[]
+  code_language: CodeLanguage
+  code: string
+  outputs: OutputVar
+}
diff --git a/app/components/workflow/nodes/code/use-config.ts b/app/components/workflow/nodes/code/use-config.ts
new file mode 100644
index 0000000..13b8962
--- /dev/null
+++ b/app/components/workflow/nodes/code/use-config.ts
@@ -0,0 +1,178 @@
+import { useCallback, useEffect, useState } from 'react'
+import produce from 'immer'
+import useVarList from '../_base/hooks/use-var-list'
+import useOutputVarList from '../_base/hooks/use-output-var-list'
+import { BlockEnum, VarType } from '../../types'
+import type { Var, Variable } from '../../types'
+import { useStore } from '../../store'
+import type { CodeNodeType, OutputVar } from './types'
+import { CodeLanguage } from './types'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run'
+import { fetchNodeDefault } from '@/service/workflow'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import {
+  useNodesReadOnly,
+} from '@/app/components/workflow/hooks'
+
+const useConfig = (id: string, payload: CodeNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+
+  const appId = useAppStore.getState().appDetail?.id
+
+  const [allLanguageDefault, setAllLanguageDefault] = useState<Record<CodeLanguage, CodeNodeType> | null>(null)
+  useEffect(() => {
+    if (appId) {
+      (async () => {
+        const { config: javaScriptConfig } = await fetchNodeDefault(appId, BlockEnum.Code, { code_language: CodeLanguage.javascript }) as any
+        const { config: pythonConfig } = await fetchNodeDefault(appId, BlockEnum.Code, { code_language: CodeLanguage.python3 }) as any
+        setAllLanguageDefault({
+          [CodeLanguage.javascript]: javaScriptConfig as CodeNodeType,
+          [CodeLanguage.python3]: pythonConfig as CodeNodeType,
+        } as any)
+      })()
+    }
+  }, [appId])
+
+  const defaultConfig = useStore(s => s.nodesDefaultConfigs)[payload.type]
+  const { inputs, setInputs } = useNodeCrud<CodeNodeType>(id, payload)
+  const { handleVarListChange, handleAddVariable } = useVarList<CodeNodeType>({
+    inputs,
+    setInputs,
+  })
+
+  const [outputKeyOrders, setOutputKeyOrders] = useState<string[]>([])
+  const syncOutputKeyOrders = useCallback((outputs: OutputVar) => {
+    setOutputKeyOrders(Object.keys(outputs))
+  }, [])
+  useEffect(() => {
+    if (inputs.code) {
+      if (inputs.outputs && Object.keys(inputs.outputs).length > 0)
+        syncOutputKeyOrders(inputs.outputs)
+
+      return
+    }
+
+    const isReady = defaultConfig && Object.keys(defaultConfig).length > 0
+    if (isReady) {
+      setInputs({
+        ...inputs,
+        ...defaultConfig,
+      })
+      syncOutputKeyOrders(defaultConfig.outputs)
+    }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [defaultConfig])
+
+  const handleCodeChange = useCallback((code: string) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.code = code
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleCodeLanguageChange = useCallback((codeLanguage: CodeLanguage) => {
+    const currDefaultConfig = allLanguageDefault?.[codeLanguage]
+
+    const newInputs = produce(inputs, (draft) => {
+      draft.code_language = codeLanguage
+      if (!currDefaultConfig)
+        return
+      draft.code = currDefaultConfig.code
+      draft.variables = currDefaultConfig.variables
+      draft.outputs = currDefaultConfig.outputs
+    })
+    setInputs(newInputs)
+  }, [allLanguageDefault, inputs, setInputs])
+
+  const {
+    handleVarsChange,
+    handleAddVariable: handleAddOutputVariable,
+    handleRemoveVariable,
+    isShowRemoveVarConfirm,
+    hideRemoveVarConfirm,
+    onRemoveVarConfirm,
+  } = useOutputVarList<CodeNodeType>({
+    id,
+    inputs,
+    setInputs,
+    outputKeyOrders,
+    onOutputKeyOrdersChange: setOutputKeyOrders,
+  })
+
+  const filterVar = useCallback((varPayload: Var) => {
+    return [VarType.string, VarType.number, VarType.secret, VarType.object, VarType.array, VarType.arrayNumber, VarType.arrayString, VarType.arrayObject, VarType.file, VarType.arrayFile].includes(varPayload.type)
+  }, [])
+
+  // single run
+  const {
+    isShowSingleRun,
+    hideSingleRun,
+    toVarInputs,
+    runningStatus,
+    isCompleted,
+    handleRun,
+    handleStop,
+    runInputData,
+    setRunInputData,
+    runResult,
+  } = useOneStepRun<CodeNodeType>({
+    id,
+    data: inputs,
+    defaultRunInputData: {},
+  })
+
+  const varInputs = toVarInputs(inputs.variables)
+
+  const inputVarValues = (() => {
+    const vars: Record<string, any> = {}
+    Object.keys(runInputData)
+      .forEach((key) => {
+        vars[key] = runInputData[key]
+      })
+    return vars
+  })()
+
+  const setInputVarValues = useCallback((newPayload: Record<string, any>) => {
+    setRunInputData(newPayload)
+  }, [setRunInputData])
+  const handleCodeAndVarsChange = useCallback((code: string, inputVariables: Variable[], outputVariables: OutputVar) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.code = code
+      draft.variables = inputVariables
+      draft.outputs = outputVariables
+    })
+    setInputs(newInputs)
+    syncOutputKeyOrders(outputVariables)
+  }, [inputs, setInputs, syncOutputKeyOrders])
+  return {
+    readOnly,
+    inputs,
+    outputKeyOrders,
+    handleVarListChange,
+    handleAddVariable,
+    handleRemoveVariable,
+    handleCodeChange,
+    handleCodeLanguageChange,
+    handleVarsChange,
+    filterVar,
+    handleAddOutputVariable,
+    isShowRemoveVarConfirm,
+    hideRemoveVarConfirm,
+    onRemoveVarConfirm,
+    // single run
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    isCompleted,
+    handleRun,
+    handleStop,
+    varInputs,
+    inputVarValues,
+    setInputVarValues,
+    runResult,
+    handleCodeAndVarsChange,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/code/utils.ts b/app/components/workflow/nodes/code/utils.ts
new file mode 100644
index 0000000..da9c115
--- /dev/null
+++ b/app/components/workflow/nodes/code/utils.ts
@@ -0,0 +1,3 @@
+export const checkNodeValid = () => {
+  return true
+}
diff --git a/app/components/workflow/nodes/constants.ts b/app/components/workflow/nodes/constants.ts
new file mode 100644
index 0000000..0cd6922
--- /dev/null
+++ b/app/components/workflow/nodes/constants.ts
@@ -0,0 +1,104 @@
+import type { ComponentType } from 'react'
+import { BlockEnum } from '../types'
+import StartNode from './start/node'
+import StartPanel from './start/panel'
+import EndNode from './end/node'
+import EndPanel from './end/panel'
+import AnswerNode from './answer/node'
+import AnswerPanel from './answer/panel'
+import LLMNode from './llm/node'
+import LLMPanel from './llm/panel'
+import KnowledgeRetrievalNode from './knowledge-retrieval/node'
+import KnowledgeRetrievalPanel from './knowledge-retrieval/panel'
+import QuestionClassifierNode from './question-classifier/node'
+import QuestionClassifierPanel from './question-classifier/panel'
+import IfElseNode from './if-else/node'
+import IfElsePanel from './if-else/panel'
+import CodeNode from './code/node'
+import CodePanel from './code/panel'
+import TemplateTransformNode from './template-transform/node'
+import TemplateTransformPanel from './template-transform/panel'
+import HttpNode from './http/node'
+import HttpPanel from './http/panel'
+import ToolNode from './tool/node'
+import ToolPanel from './tool/panel'
+import VariableAssignerNode from './variable-assigner/node'
+import VariableAssignerPanel from './variable-assigner/panel'
+import AssignerNode from './assigner/node'
+import AssignerPanel from './assigner/panel'
+import ParameterExtractorNode from './parameter-extractor/node'
+import ParameterExtractorPanel from './parameter-extractor/panel'
+import IterationNode from './iteration/node'
+import IterationPanel from './iteration/panel'
+import LoopNode from './loop/node'
+import LoopPanel from './loop/panel'
+import DocExtractorNode from './document-extractor/node'
+import DocExtractorPanel from './document-extractor/panel'
+import ListFilterNode from './list-operator/node'
+import ListFilterPanel from './list-operator/panel'
+import AgentNode from './agent/node'
+import AgentPanel from './agent/panel'
+import { TransferMethod } from '@/types/app'
+
+export const NodeComponentMap: Record<string, ComponentType<any>> = {
+  [BlockEnum.Start]: StartNode,
+  [BlockEnum.End]: EndNode,
+  [BlockEnum.Answer]: AnswerNode,
+  [BlockEnum.LLM]: LLMNode,
+  [BlockEnum.KnowledgeRetrieval]: KnowledgeRetrievalNode,
+  [BlockEnum.QuestionClassifier]: QuestionClassifierNode,
+  [BlockEnum.IfElse]: IfElseNode,
+  [BlockEnum.Code]: CodeNode,
+  [BlockEnum.TemplateTransform]: TemplateTransformNode,
+  [BlockEnum.HttpRequest]: HttpNode,
+  [BlockEnum.Tool]: ToolNode,
+  [BlockEnum.VariableAssigner]: VariableAssignerNode,
+  [BlockEnum.Assigner]: AssignerNode,
+  [BlockEnum.VariableAggregator]: VariableAssignerNode,
+  [BlockEnum.ParameterExtractor]: ParameterExtractorNode,
+  [BlockEnum.Iteration]: IterationNode,
+  [BlockEnum.Loop]: LoopNode,
+  [BlockEnum.DocExtractor]: DocExtractorNode,
+  [BlockEnum.ListFilter]: ListFilterNode,
+  [BlockEnum.Agent]: AgentNode,
+}
+
+export const PanelComponentMap: Record<string, ComponentType<any>> = {
+  [BlockEnum.Start]: StartPanel,
+  [BlockEnum.End]: EndPanel,
+  [BlockEnum.Answer]: AnswerPanel,
+  [BlockEnum.LLM]: LLMPanel,
+  [BlockEnum.KnowledgeRetrieval]: KnowledgeRetrievalPanel,
+  [BlockEnum.QuestionClassifier]: QuestionClassifierPanel,
+  [BlockEnum.IfElse]: IfElsePanel,
+  [BlockEnum.Code]: CodePanel,
+  [BlockEnum.TemplateTransform]: TemplateTransformPanel,
+  [BlockEnum.HttpRequest]: HttpPanel,
+  [BlockEnum.Tool]: ToolPanel,
+  [BlockEnum.VariableAssigner]: VariableAssignerPanel,
+  [BlockEnum.VariableAggregator]: VariableAssignerPanel,
+  [BlockEnum.Assigner]: AssignerPanel,
+  [BlockEnum.ParameterExtractor]: ParameterExtractorPanel,
+  [BlockEnum.Iteration]: IterationPanel,
+  [BlockEnum.Loop]: LoopPanel,
+  [BlockEnum.DocExtractor]: DocExtractorPanel,
+  [BlockEnum.ListFilter]: ListFilterPanel,
+  [BlockEnum.Agent]: AgentPanel,
+}
+
+export const CUSTOM_NODE_TYPE = 'custom'
+
+export const FILE_TYPE_OPTIONS = [
+  { value: 'image', i18nKey: 'image' },
+  { value: 'document', i18nKey: 'doc' },
+  { value: 'audio', i18nKey: 'audio' },
+  { value: 'video', i18nKey: 'video' },
+]
+
+export const TRANSFER_METHOD = [
+  { value: TransferMethod.local_file, i18nKey: 'localUpload' },
+  { value: TransferMethod.remote_url, i18nKey: 'url' },
+]
+
+export const SUB_VARIABLES = ['type', 'size', 'name', 'url', 'extension', 'mime_type', 'transfer_method', 'related_id']
+export const OUTPUT_FILE_SUB_VARIABLES = SUB_VARIABLES.filter(key => key !== 'transfer_method')
diff --git a/app/components/workflow/nodes/document-extractor/default.ts b/app/components/workflow/nodes/document-extractor/default.ts
new file mode 100644
index 0000000..e141844
--- /dev/null
+++ b/app/components/workflow/nodes/document-extractor/default.ts
@@ -0,0 +1,36 @@
+import { BlockEnum } from '../../types'
+import type { NodeDefault } from '../../types'
+import type { DocExtractorNodeType } from './types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+const i18nPrefix = 'workflow.errorMsg'
+
+const nodeDefault: NodeDefault<DocExtractorNodeType> = {
+  defaultValue: {
+    variable_selector: [],
+    is_array_file: false,
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: DocExtractorNodeType, t: any) {
+    let errorMessages = ''
+    const { variable_selector: variable } = payload
+
+    if (!errorMessages && !variable?.length)
+      errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t('workflow.nodes.assigner.assignedVariable') })
+
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/document-extractor/node.tsx b/app/components/workflow/nodes/document-extractor/node.tsx
new file mode 100644
index 0000000..6b1d434
--- /dev/null
+++ b/app/components/workflow/nodes/document-extractor/node.tsx
@@ -0,0 +1,42 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useNodes } from 'reactflow'
+import { useTranslation } from 'react-i18next'
+import NodeVariableItem from '../variable-assigner/components/node-variable-item'
+import type { DocExtractorNodeType } from './types'
+import { isConversationVar, isENV, isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+import { BlockEnum, type Node, type NodeProps } from '@/app/components/workflow/types'
+
+const i18nPrefix = 'workflow.nodes.docExtractor'
+
+const NodeComponent: FC<NodeProps<DocExtractorNodeType>> = ({
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const nodes: Node[] = useNodes()
+  const { variable_selector: variable } = data
+
+  if (!variable || variable.length === 0)
+    return null
+
+  const isSystem = isSystemVar(variable)
+  const isEnv = isENV(variable)
+  const isChatVar = isConversationVar(variable)
+  const node = isSystem ? nodes.find(node => node.data.type === BlockEnum.Start) : nodes.find(node => node.id === variable[0])
+  const varName = isSystem ? `sys.${variable[variable.length - 1]}` : variable.slice(1).join('.')
+  return (
+    <div className='relative px-3'>
+      <div className='system-2xs-medium-uppercase mb-1 text-text-tertiary'>{t(`${i18nPrefix}.inputVar`)}</div>
+      <NodeVariableItem
+        node={node as Node}
+        isEnv={isEnv}
+        isChatVar={isChatVar}
+        varName={varName}
+        className='bg-workflow-block-parma-bg'
+      />
+    </div>
+  )
+}
+
+export default React.memo(NodeComponent)
diff --git a/app/components/workflow/nodes/document-extractor/panel.tsx b/app/components/workflow/nodes/document-extractor/panel.tsx
new file mode 100644
index 0000000..5ed1425
--- /dev/null
+++ b/app/components/workflow/nodes/document-extractor/panel.tsx
@@ -0,0 +1,124 @@
+import type { FC } from 'react'
+import React from 'react'
+import useSWR from 'swr'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import VarReferencePicker from '../_base/components/variable/var-reference-picker'
+import OutputVars, { VarItem } from '../_base/components/output-vars'
+import Split from '../_base/components/split'
+import { useNodeHelpLink } from '../_base/hooks/use-node-help-link'
+import useConfig from './use-config'
+import type { DocExtractorNodeType } from './types'
+import { fetchSupportFileTypes } from '@/service/datasets'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import { BlockEnum, InputVarType, type NodePanelProps } from '@/app/components/workflow/types'
+import I18n from '@/context/i18n'
+import { LanguagesSupported } from '@/i18n/language'
+import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
+import ResultPanel from '@/app/components/workflow/run/result-panel'
+
+const i18nPrefix = 'workflow.nodes.docExtractor'
+
+const Panel: FC<NodePanelProps<DocExtractorNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const link = useNodeHelpLink(BlockEnum.DocExtractor)
+  const { data: supportFileTypesResponse } = useSWR({ url: '/files/support-type' }, fetchSupportFileTypes)
+  const supportTypes = supportFileTypesResponse?.allowed_extensions || []
+  const supportTypesShowNames = (() => {
+    const extensionMap: { [key: string]: string } = {
+      md: 'markdown',
+      pptx: 'pptx',
+      htm: 'html',
+      xlsx: 'xlsx',
+      docx: 'docx',
+    }
+
+    return [...supportTypes]
+      .map(item => extensionMap[item] || item) // map to standardized extension
+      .map(item => item.toLowerCase()) // convert to lower case
+      .filter((item, index, self) => self.indexOf(item) === index) // remove duplicates
+      .join(locale !== LanguagesSupported[1] ? ', ' : '銆� ')
+  })()
+  const {
+    readOnly,
+    inputs,
+    handleVarChanges,
+    filterVar,
+    // single run
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runResult,
+    files,
+    setFiles,
+  } = useConfig(id, data)
+
+  return (
+    <div className='mt-2'>
+      <div className='space-y-4 px-4 pb-4'>
+        <Field
+          title={t(`${i18nPrefix}.inputVar`)}
+          required
+        >
+          <>
+            <VarReferencePicker
+              readonly={readOnly}
+              nodeId={id}
+              isShowNodeName
+              value={inputs.variable_selector || []}
+              onChange={handleVarChanges}
+              filterVar={filterVar}
+              typePlaceHolder='File | Array[File]'
+            />
+            <div className='body-xs-regular mt-1 py-0.5 text-text-tertiary'>
+              {t(`${i18nPrefix}.supportFileTypes`, { types: supportTypesShowNames })}
+              <a className='text-text-accent' href={link} target='_blank'>{t(`${i18nPrefix}.learnMore`)}</a>
+            </div>
+          </>
+        </Field>
+      </div>
+      <Split />
+      <div>
+        <OutputVars>
+          <VarItem
+            name='text'
+            type={inputs.is_array_file ? 'array[string]' : 'string'}
+            description={t(`${i18nPrefix}.outputVars.text`)}
+          />
+        </OutputVars>
+      </div>
+      {
+        isShowSingleRun && (
+          <BeforeRunForm
+            nodeName={inputs.title}
+            onHide={hideSingleRun}
+            forms={[
+              {
+                inputs: [{
+                  label: t(`${i18nPrefix}.inputVar`)!,
+                  variable: 'files',
+                  type: InputVarType.multiFiles,
+                  required: true,
+                }],
+                values: { files },
+                onChange: keyValue => setFiles(keyValue.files),
+              },
+            ]}
+            runningStatus={runningStatus}
+            onRun={handleRun}
+            onStop={handleStop}
+            result={<ResultPanel {...runResult} showSteps={false} />}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/document-extractor/types.ts b/app/components/workflow/nodes/document-extractor/types.ts
new file mode 100644
index 0000000..8ab7592
--- /dev/null
+++ b/app/components/workflow/nodes/document-extractor/types.ts
@@ -0,0 +1,6 @@
+import type { CommonNodeType, ValueSelector } from '@/app/components/workflow/types'
+
+export type DocExtractorNodeType = CommonNodeType & {
+  variable_selector: ValueSelector
+  is_array_file: boolean
+}
diff --git a/app/components/workflow/nodes/document-extractor/use-config.ts b/app/components/workflow/nodes/document-extractor/use-config.ts
new file mode 100644
index 0000000..8ceb153
--- /dev/null
+++ b/app/components/workflow/nodes/document-extractor/use-config.ts
@@ -0,0 +1,111 @@
+import { useCallback, useMemo } from 'react'
+import produce from 'immer'
+import { useStoreApi } from 'reactflow'
+
+import type { ValueSelector, Var } from '../../types'
+import { InputVarType, VarType } from '../../types'
+import type { DocExtractorNodeType } from './types'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run'
+import {
+  useIsChatMode,
+  useNodesReadOnly,
+  useWorkflow,
+  useWorkflowVariables,
+} from '@/app/components/workflow/hooks'
+
+const useConfig = (id: string, payload: DocExtractorNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const { inputs, setInputs } = useNodeCrud<DocExtractorNodeType>(id, payload)
+
+  const filterVar = useCallback((varPayload: Var) => {
+    return varPayload.type === VarType.file || varPayload.type === VarType.arrayFile
+  }, [])
+
+  const isChatMode = useIsChatMode()
+
+  const store = useStoreApi()
+  const { getBeforeNodesInSameBranch } = useWorkflow()
+  const {
+    getNodes,
+  } = store.getState()
+  const currentNode = getNodes().find(n => n.id === id)
+  const isInIteration = payload.isInIteration
+  const iterationNode = isInIteration ? getNodes().find(n => n.id === currentNode!.parentId) : null
+  const isInLoop = payload.isInLoop
+  const loopNode = isInLoop ? getNodes().find(n => n.id === currentNode!.parentId) : null
+  const availableNodes = useMemo(() => {
+    return getBeforeNodesInSameBranch(id)
+  }, [getBeforeNodesInSameBranch, id])
+
+  const { getCurrentVariableType } = useWorkflowVariables()
+  const getType = useCallback((variable?: ValueSelector) => {
+    const varType = getCurrentVariableType({
+      parentNode: isInIteration ? iterationNode : loopNode,
+      valueSelector: variable || [],
+      availableNodes,
+      isChatMode,
+      isConstant: false,
+    })
+    return varType
+  }, [getCurrentVariableType, isInIteration, availableNodes, isChatMode, iterationNode, loopNode])
+
+  const handleVarChanges = useCallback((variable: ValueSelector | string) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.variable_selector = variable as ValueSelector
+      draft.is_array_file = getType(draft.variable_selector) === VarType.arrayFile
+    })
+    setInputs(newInputs)
+  }, [getType, inputs, setInputs])
+
+  // single run
+  const {
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    isCompleted,
+    handleRun,
+    handleStop,
+    runInputData,
+    setRunInputData,
+    runResult,
+  } = useOneStepRun<DocExtractorNodeType>({
+    id,
+    data: inputs,
+    defaultRunInputData: { files: [] },
+  })
+  const varInputs = [{
+    label: inputs.title,
+    variable: 'files',
+    type: InputVarType.multiFiles,
+    required: true,
+  }]
+
+  const files = runInputData.files
+  const setFiles = useCallback((newFiles: []) => {
+    setRunInputData({
+      ...runInputData,
+      files: newFiles,
+    })
+  }, [runInputData, setRunInputData])
+
+  return {
+    readOnly,
+    inputs,
+    filterVar,
+    handleVarChanges,
+    // single run
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    isCompleted,
+    handleRun,
+    handleStop,
+    varInputs,
+    files,
+    setFiles,
+    runResult,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/end/default.ts b/app/components/workflow/nodes/end/default.ts
new file mode 100644
index 0000000..e8fbb94
--- /dev/null
+++ b/app/components/workflow/nodes/end/default.ts
@@ -0,0 +1,27 @@
+import { BlockEnum } from '../../types'
+import type { NodeDefault } from '../../types'
+import type { EndNodeType } from './types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+
+const nodeDefault: NodeDefault<EndNodeType> = {
+  defaultValue: {
+    outputs: [],
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes() {
+    return []
+  },
+  checkValid() {
+    return {
+      isValid: true,
+      errorMessage: '',
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/end/node.tsx b/app/components/workflow/nodes/end/node.tsx
new file mode 100644
index 0000000..6906e0f
--- /dev/null
+++ b/app/components/workflow/nodes/end/node.tsx
@@ -0,0 +1,88 @@
+import type { FC } from 'react'
+import React from 'react'
+import cn from 'classnames'
+import type { EndNodeType } from './types'
+import type { NodeProps, Variable } from '@/app/components/workflow/types'
+import { isConversationVar, isENV, isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+import {
+  useIsChatMode,
+  useWorkflow,
+  useWorkflowVariables,
+} from '@/app/components/workflow/hooks'
+import { VarBlockIcon } from '@/app/components/workflow/block-icon'
+import { Line3 } from '@/app/components/base/icons/src/public/common'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import { BubbleX, Env } from '@/app/components/base/icons/src/vender/line/others'
+import { BlockEnum } from '@/app/components/workflow/types'
+
+const Node: FC<NodeProps<EndNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { getBeforeNodesInSameBranch } = useWorkflow()
+  const availableNodes = getBeforeNodesInSameBranch(id)
+  const { getCurrentVariableType } = useWorkflowVariables()
+  const isChatMode = useIsChatMode()
+
+  const startNode = availableNodes.find((node: any) => {
+    return node.data.type === BlockEnum.Start
+  })
+
+  const getNode = (id: string) => {
+    return availableNodes.find(node => node.id === id) || startNode
+  }
+
+  const { outputs } = data
+  const filteredOutputs = (outputs as Variable[]).filter(({ value_selector }) => value_selector.length > 0)
+
+  if (!filteredOutputs.length)
+    return null
+
+  return (
+    <div className='mb-1 space-y-0.5 px-3 py-1'>
+      {filteredOutputs.map(({ value_selector }, index) => {
+        const node = getNode(value_selector[0])
+        const isSystem = isSystemVar(value_selector)
+        const isEnv = isENV(value_selector)
+        const isChatVar = isConversationVar(value_selector)
+        const varName = isSystem ? `sys.${value_selector[value_selector.length - 1]}` : value_selector[value_selector.length - 1]
+        const varType = getCurrentVariableType({
+          valueSelector: value_selector,
+          availableNodes,
+          isChatMode,
+        })
+        return (
+          <div key={index} className='flex h-6 items-center justify-between space-x-1 rounded-md  bg-workflow-block-parma-bg px-1 text-xs font-normal text-text-secondary'>
+            <div className='flex items-center text-xs font-medium text-text-tertiary'>
+              {!isEnv && !isChatVar && (
+                <>
+                  <div className='p-[1px]'>
+                    <VarBlockIcon
+                      className='!text-text-primary'
+                      type={node?.data.type || BlockEnum.Start}
+                    />
+                  </div>
+                  <div className='max-w-[75px] truncate'>{node?.data.title}</div>
+                  <Line3 className='mr-0.5'></Line3>
+                </>
+              )}
+              <div className='flex items-center text-text-accent'>
+                {!isEnv && !isChatVar && <Variable02 className='h-3.5 w-3.5 shrink-0 text-text-accent' />}
+                {isEnv && <Env className='h-3.5 w-3.5 shrink-0 text-util-colors-violet-violet-600' />}
+                {isChatVar && <BubbleX className='h-3.5 w-3.5 text-util-colors-teal-teal-700' />}
+
+                <div className={cn('ml-0.5 max-w-[50px] truncate text-xs font-medium', (isEnv || isChatVar) && '!max-w-[70px] text-text-primary')}>{varName}</div>
+              </div>
+            </div>
+            <div className='text-xs font-normal text-text-secondary'>
+              <div className='ml-0.5 max-w-[42px] truncate text-xs font-normal capitalize text-text-tertiary' title={varType}>{varType}</div>
+            </div>
+          </div>
+        )
+      })}
+
+    </div>
+  )
+}
+
+export default React.memo(Node)
diff --git a/app/components/workflow/nodes/end/panel.tsx b/app/components/workflow/nodes/end/panel.tsx
new file mode 100644
index 0000000..2ad90ff
--- /dev/null
+++ b/app/components/workflow/nodes/end/panel.tsx
@@ -0,0 +1,49 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import useConfig from './use-config'
+import type { EndNodeType } from './types'
+import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import AddButton from '@/app/components/base/button/add-button'
+import type { NodePanelProps } from '@/app/components/workflow/types'
+
+const i18nPrefix = 'workflow.nodes.end'
+
+const Panel: FC<NodePanelProps<EndNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    readOnly,
+    inputs,
+    handleVarListChange,
+    handleAddVariable,
+  } = useConfig(id, data)
+
+  const outputs = inputs.outputs
+  return (
+    <div className='mt-2'>
+      <div className='space-y-4 px-4 pb-4'>
+
+        <Field
+          title={t(`${i18nPrefix}.output.variable`)}
+          operations={
+            !readOnly ? <AddButton onClick={handleAddVariable} /> : undefined
+          }
+        >
+          <VarList
+            nodeId={id}
+            readonly={readOnly}
+            list={outputs}
+            onChange={handleVarListChange}
+          />
+        </Field>
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/end/types.ts b/app/components/workflow/nodes/end/types.ts
new file mode 100644
index 0000000..e2c30fb
--- /dev/null
+++ b/app/components/workflow/nodes/end/types.ts
@@ -0,0 +1,5 @@
+import type { CommonNodeType, Variable } from '@/app/components/workflow/types'
+
+export type EndNodeType = CommonNodeType & {
+  outputs: Variable[]
+}
diff --git a/app/components/workflow/nodes/end/use-config.ts b/app/components/workflow/nodes/end/use-config.ts
new file mode 100644
index 0000000..b9876f9
--- /dev/null
+++ b/app/components/workflow/nodes/end/use-config.ts
@@ -0,0 +1,27 @@
+import useVarList from '../_base/hooks/use-var-list'
+import type { EndNodeType } from './types'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import {
+  useNodesReadOnly,
+} from '@/app/components/workflow/hooks'
+const useConfig = (id: string, payload: EndNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const { inputs, setInputs } = useNodeCrud<EndNodeType>(id, payload)
+
+  const { handleVarListChange, handleAddVariable } = useVarList<EndNodeType>({
+    inputs,
+    setInputs: (newInputs) => {
+      setInputs(newInputs)
+    },
+    varKey: 'outputs',
+  })
+
+  return {
+    readOnly,
+    inputs,
+    handleVarListChange,
+    handleAddVariable,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/end/utils.ts b/app/components/workflow/nodes/end/utils.ts
new file mode 100644
index 0000000..f214d30
--- /dev/null
+++ b/app/components/workflow/nodes/end/utils.ts
@@ -0,0 +1,5 @@
+import type { EndNodeType } from './types'
+
+export const checkNodeValid = (payload: EndNodeType) => {
+  return true
+}
diff --git a/app/components/workflow/nodes/http/components/api-input.tsx b/app/components/workflow/nodes/http/components/api-input.tsx
new file mode 100644
index 0000000..000011e
--- /dev/null
+++ b/app/components/workflow/nodes/http/components/api-input.tsx
@@ -0,0 +1,81 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine } from '@remixicon/react'
+import { Method } from '../types'
+import Selector from '../../_base/components/selector'
+import useAvailableVarList from '../../_base/hooks/use-available-var-list'
+import { VarType } from '../../../types'
+import type { Var } from '../../../types'
+import cn from '@/utils/classnames'
+import Input from '@/app/components/workflow/nodes/_base/components/input-support-select-var'
+
+const MethodOptions = [
+  { label: 'GET', value: Method.get },
+  { label: 'POST', value: Method.post },
+  { label: 'HEAD', value: Method.head },
+  { label: 'PATCH', value: Method.patch },
+  { label: 'PUT', value: Method.put },
+  { label: 'DELETE', value: Method.delete },
+]
+type Props = {
+  nodeId: string
+  readonly: boolean
+  method: Method
+  onMethodChange: (method: Method) => void
+  url: string
+  onUrlChange: (url: string) => void
+}
+
+const ApiInput: FC<Props> = ({
+  nodeId,
+  readonly,
+  method,
+  onMethodChange,
+  url,
+  onUrlChange,
+}) => {
+  const { t } = useTranslation()
+
+  const [isFocus, setIsFocus] = useState(false)
+  const { availableVars, availableNodesWithParent } = useAvailableVarList(nodeId, {
+    onlyLeafNodeVar: false,
+    filterVar: (varPayload: Var) => {
+      return [VarType.string, VarType.number, VarType.secret].includes(varPayload.type)
+    },
+  })
+
+  return (
+    <div className='flex items-start  space-x-1'>
+      <Selector
+        value={method}
+        onChange={onMethodChange}
+        options={MethodOptions}
+        trigger={
+          <div className={cn(readonly && 'cursor-pointer', 'flex h-8 shrink-0 items-center rounded-lg border border-components-button-secondary-border bg-components-button-secondary-bg px-2.5')} >
+            <div className='w-12 pl-0.5 text-xs font-medium uppercase leading-[18px] text-text-primary'>{method}</div>
+            {!readonly && <RiArrowDownSLine className='ml-1 h-3.5 w-3.5 text-text-secondary' />}
+          </div>
+        }
+        popupClassName='top-[34px] w-[108px]'
+        showChecked
+        readonly={readonly}
+      />
+
+      <Input
+        instanceId='http-api-url'
+        className={cn(isFocus ? 'border-components-input-border-active bg-components-input-bg-active shadow-xs' : 'border-components-input-border-hover bg-components-input-bg-normal', 'w-0 grow rounded-lg border px-3 py-[6px]')}
+        value={url}
+        onChange={onUrlChange}
+        readOnly={readonly}
+        nodesOutputVars={availableVars}
+        availableNodes={availableNodesWithParent}
+        onFocusChange={setIsFocus}
+        placeholder={!readonly ? t('workflow.nodes.http.apiPlaceholder')! : ''}
+        placeholderClassName='!leading-[21px]'
+      />
+    </div >
+  )
+}
+export default React.memo(ApiInput)
diff --git a/app/components/workflow/nodes/http/components/authorization/index.tsx b/app/components/workflow/nodes/http/components/authorization/index.tsx
new file mode 100644
index 0000000..b2de919
--- /dev/null
+++ b/app/components/workflow/nodes/http/components/authorization/index.tsx
@@ -0,0 +1,183 @@
+'use client'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import React, { useCallback, useState } from 'react'
+import produce from 'immer'
+import type { Authorization as AuthorizationPayloadType } from '../../types'
+import { APIType, AuthorizationType } from '../../types'
+import RadioGroup from './radio-group'
+import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
+import { VarType } from '@/app/components/workflow/types'
+import type { Var } from '@/app/components/workflow/types'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/workflow/nodes/_base/components/input-support-select-var'
+import BaseInput from '@/app/components/base/input'
+import cn from '@/utils/classnames'
+
+const i18nPrefix = 'workflow.nodes.http.authorization'
+
+type Props = {
+  nodeId: string
+  payload: AuthorizationPayloadType
+  onChange: (payload: AuthorizationPayloadType) => void
+  isShow: boolean
+  onHide: () => void
+}
+
+const Field = ({ title, isRequired, children }: { title: string; isRequired?: boolean; children: React.JSX.Element }) => {
+  return (
+    <div>
+      <div className='text-[13px] font-medium leading-8 text-text-secondary'>
+        {title}
+        {isRequired && <span className='ml-0.5 text-text-destructive'>*</span>}
+      </div>
+      <div>{children}</div>
+    </div>
+  )
+}
+
+const Authorization: FC<Props> = ({
+  nodeId,
+  payload,
+  onChange,
+  isShow,
+  onHide,
+}) => {
+  const { t } = useTranslation()
+
+  const [isFocus, setIsFocus] = useState(false)
+  const { availableVars, availableNodesWithParent } = useAvailableVarList(nodeId, {
+    onlyLeafNodeVar: false,
+    filterVar: (varPayload: Var) => {
+      return [VarType.string, VarType.number, VarType.secret].includes(varPayload.type)
+    },
+  })
+
+  const [tempPayload, setTempPayload] = React.useState<AuthorizationPayloadType>(payload)
+  const handleAuthTypeChange = useCallback((type: string) => {
+    const newPayload = produce(tempPayload, (draft: AuthorizationPayloadType) => {
+      draft.type = type as AuthorizationType
+      if (draft.type === AuthorizationType.apiKey && !draft.config) {
+        draft.config = {
+          type: APIType.basic,
+          api_key: '',
+        }
+      }
+    })
+    setTempPayload(newPayload)
+  }, [tempPayload, setTempPayload])
+
+  const handleAuthAPITypeChange = useCallback((type: string) => {
+    const newPayload = produce(tempPayload, (draft: AuthorizationPayloadType) => {
+      if (!draft.config) {
+        draft.config = {
+          type: APIType.basic,
+          api_key: '',
+        }
+      }
+      draft.config.type = type as APIType
+    })
+    setTempPayload(newPayload)
+  }, [tempPayload, setTempPayload])
+
+  const handleAPIKeyOrHeaderChange = useCallback((type: 'api_key' | 'header') => {
+    return (e: React.ChangeEvent<HTMLInputElement>) => {
+      const newPayload = produce(tempPayload, (draft: AuthorizationPayloadType) => {
+        if (!draft.config) {
+          draft.config = {
+            type: APIType.basic,
+            api_key: '',
+          }
+        }
+        draft.config[type] = e.target.value
+      })
+      setTempPayload(newPayload)
+    }
+  }, [tempPayload, setTempPayload])
+
+  const handleAPIKeyChange = useCallback((str: string) => {
+    const newPayload = produce(tempPayload, (draft: AuthorizationPayloadType) => {
+      if (!draft.config) {
+        draft.config = {
+          type: APIType.basic,
+          api_key: '',
+        }
+      }
+      draft.config.api_key = str
+    })
+    setTempPayload(newPayload)
+  }, [tempPayload, setTempPayload])
+
+  const handleConfirm = useCallback(() => {
+    onChange(tempPayload)
+    onHide()
+  }, [tempPayload, onChange, onHide])
+  return (
+    <Modal
+      title={t(`${i18nPrefix}.authorization`)}
+      isShow={isShow}
+      onClose={onHide}
+    >
+      <div>
+        <div className='space-y-2'>
+          <Field title={t(`${i18nPrefix}.authorizationType`)}>
+            <RadioGroup
+              options={[
+                { value: AuthorizationType.none, label: t(`${i18nPrefix}.no-auth`) },
+                { value: AuthorizationType.apiKey, label: t(`${i18nPrefix}.api-key`) },
+              ]}
+              value={tempPayload.type}
+              onChange={handleAuthTypeChange}
+            />
+          </Field>
+
+          {tempPayload.type === AuthorizationType.apiKey && (
+            <>
+              <Field title={t(`${i18nPrefix}.auth-type`)}>
+                <RadioGroup
+                  options={[
+                    { value: APIType.basic, label: t(`${i18nPrefix}.basic`) },
+                    { value: APIType.bearer, label: t(`${i18nPrefix}.bearer`) },
+                    { value: APIType.custom, label: t(`${i18nPrefix}.custom`) },
+                  ]}
+                  value={tempPayload.config?.type || APIType.basic}
+                  onChange={handleAuthAPITypeChange}
+                />
+              </Field>
+              {tempPayload.config?.type === APIType.custom && (
+                <Field title={t(`${i18nPrefix}.header`)} isRequired>
+                  <BaseInput
+                    value={tempPayload.config?.header || ''}
+                    onChange={handleAPIKeyOrHeaderChange('header')}
+                  />
+                </Field>
+              )}
+
+              <Field title={t(`${i18nPrefix}.api-key-title`)} isRequired>
+                <div className='flex'>
+                  <Input
+                    instanceId='http-api-key'
+                    className={cn(isFocus ? 'border-components-input-border-active bg-components-input-bg-active shadow-xs' : 'border-components-input-border-hover bg-components-input-bg-normal', 'w-0 grow rounded-lg border px-3 py-[6px]')}
+                    value={tempPayload.config?.api_key || ''}
+                    onChange={handleAPIKeyChange}
+                    nodesOutputVars={availableVars}
+                    availableNodes={availableNodesWithParent}
+                    onFocusChange={setIsFocus}
+                    placeholder={' '}
+                    placeholderClassName='!leading-[21px]'
+                  />
+                </div>
+              </Field>
+            </>
+          )}
+        </div>
+        <div className='mt-6 flex justify-end space-x-2'>
+          <Button onClick={onHide}>{t('common.operation.cancel')}</Button>
+          <Button variant='primary' onClick={handleConfirm}>{t('common.operation.save')}</Button>
+        </div>
+      </div>
+    </Modal>
+  )
+}
+export default React.memo(Authorization)
diff --git a/app/components/workflow/nodes/http/components/authorization/radio-group.tsx b/app/components/workflow/nodes/http/components/authorization/radio-group.tsx
new file mode 100644
index 0000000..fe58ce2
--- /dev/null
+++ b/app/components/workflow/nodes/http/components/authorization/radio-group.tsx
@@ -0,0 +1,62 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import cn from '@/utils/classnames'
+
+type Option = {
+  value: string
+  label: string
+}
+
+type ItemProps = {
+  title: string
+  onClick: () => void
+  isSelected: boolean
+}
+const Item: FC<ItemProps> = ({
+  title,
+  onClick,
+  isSelected,
+}) => {
+  return (
+    <div
+      className={cn(
+        'system-sm-regular flex h-8 grow cursor-default items-center rounded-md border border-components-option-card-option-border bg-components-option-card-option-bg px-2 text-text-secondary',
+        !isSelected && 'cursor-pointer hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs',
+        isSelected && 'system-sm-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg shadow-xs',
+      )}
+      onClick={onClick}
+    >
+      {title}
+    </div>
+  )
+}
+
+type Props = {
+  options: Option[]
+  value: string
+  onChange: (value: string) => void
+}
+
+const RadioGroup: FC<Props> = ({
+  options,
+  value,
+  onChange,
+}) => {
+  const handleChange = useCallback((value: string) => {
+    return () => onChange(value)
+  }, [onChange])
+  return (
+    <div className='flex space-x-2'>
+      {options.map(option => (
+        <Item
+          key={option.value}
+          title={option.label}
+          onClick={handleChange(option.value)}
+          isSelected={option.value === value}
+        />
+      ))}
+    </div>
+  )
+}
+export default React.memo(RadioGroup)
diff --git a/app/components/workflow/nodes/http/components/curl-panel.tsx b/app/components/workflow/nodes/http/components/curl-panel.tsx
new file mode 100644
index 0000000..52e28d7
--- /dev/null
+++ b/app/components/workflow/nodes/http/components/curl-panel.tsx
@@ -0,0 +1,160 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { BodyType, type HttpNodeType, Method } from '../types'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import Textarea from '@/app/components/base/textarea'
+import Toast from '@/app/components/base/toast'
+import { useNodesInteractions } from '@/app/components/workflow/hooks'
+
+type Props = {
+  nodeId: string
+  isShow: boolean
+  onHide: () => void
+  handleCurlImport: (node: HttpNodeType) => void
+}
+
+const parseCurl = (curlCommand: string): { node: HttpNodeType | null; error: string | null } => {
+  if (!curlCommand.trim().toLowerCase().startsWith('curl'))
+    return { node: null, error: 'Invalid cURL command. Command must start with "curl".' }
+
+  const node: Partial<HttpNodeType> = {
+    title: 'HTTP Request',
+    desc: 'Imported from cURL',
+    method: undefined,
+    url: '',
+    headers: '',
+    params: '',
+    body: { type: BodyType.none, data: '' },
+  }
+  const args = curlCommand.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g) || []
+  let hasData = false
+
+  for (let i = 1; i < args.length; i++) {
+    const arg = args[i].replace(/^['"]|['"]$/g, '')
+    switch (arg) {
+      case '-X':
+      case '--request':
+        if (i + 1 >= args.length)
+          return { node: null, error: 'Missing HTTP method after -X or --request.' }
+        node.method = (args[++i].replace(/^['"]|['"]$/g, '') as Method) || Method.get
+        hasData = true
+        break
+      case '-H':
+      case '--header':
+        if (i + 1 >= args.length)
+          return { node: null, error: 'Missing header value after -H or --header.' }
+        node.headers += (node.headers ? '\n' : '') + args[++i].replace(/^['"]|['"]$/g, '')
+        break
+      case '-d':
+      case '--data':
+      case '--data-raw':
+      case '--data-binary':
+        if (i + 1 >= args.length)
+          return { node: null, error: 'Missing data value after -d, --data, --data-raw, or --data-binary.' }
+        node.body = { type: BodyType.rawText, data: args[++i].replace(/^['"]|['"]$/g, '') }
+        break
+      case '-F':
+      case '--form': {
+        if (i + 1 >= args.length)
+          return { node: null, error: 'Missing form data after -F or --form.' }
+        if (node.body?.type !== BodyType.formData)
+          node.body = { type: BodyType.formData, data: '' }
+        const formData = args[++i].replace(/^['"]|['"]$/g, '')
+        const [key, ...valueParts] = formData.split('=')
+        if (!key)
+          return { node: null, error: 'Invalid form data format.' }
+        let value = valueParts.join('=')
+
+        // To support command like `curl -F "file=@/path/to/file;type=application/zip"`
+        // the `;type=application/zip` should translate to `Content-Type: application/zip`
+        const typeMatch = value.match(/^(.+?);type=(.+)$/)
+        if (typeMatch) {
+          const [, actualValue, mimeType] = typeMatch
+          value = actualValue
+          node.headers += `${node.headers ? '\n' : ''}Content-Type: ${mimeType}`
+        }
+
+        node.body.data += `${node.body.data ? '\n' : ''}${key}:${value}`
+        break
+      }
+      case '--json':
+        if (i + 1 >= args.length)
+          return { node: null, error: 'Missing JSON data after --json.' }
+        node.body = { type: BodyType.json, data: args[++i].replace(/^['"]|['"]$/g, '') }
+        break
+      default:
+        if (arg.startsWith('http') && !node.url)
+          node.url = arg
+        break
+    }
+  }
+
+  // Determine final method
+  node.method = node.method || (hasData ? Method.post : Method.get)
+
+  if (!node.url)
+    return { node: null, error: 'Missing URL or url not start with http.' }
+
+  // Extract query params from URL
+  const urlParts = node.url?.split('?') || []
+  if (urlParts.length > 1) {
+    node.url = urlParts[0]
+    node.params = urlParts[1].replace(/&/g, '\n').replace(/=/g, ': ')
+  }
+
+  return { node: node as HttpNodeType, error: null }
+}
+
+const CurlPanel: FC<Props> = ({ nodeId, isShow, onHide, handleCurlImport }) => {
+  const [inputString, setInputString] = useState('')
+  const { handleNodeSelect } = useNodesInteractions()
+  const { t } = useTranslation()
+
+  const handleSave = useCallback(() => {
+    const { node, error } = parseCurl(inputString)
+    if (error) {
+      Toast.notify({
+        type: 'error',
+        message: error,
+      })
+      return
+    }
+    if (!node)
+      return
+
+    onHide()
+    handleCurlImport(node)
+    // Close the panel then open it again to make the panel re-render
+    handleNodeSelect(nodeId, true)
+    setTimeout(() => {
+      handleNodeSelect(nodeId)
+    }, 0)
+  }, [onHide, nodeId, inputString, handleNodeSelect, handleCurlImport])
+
+  return (
+    <Modal
+      title={t('workflow.nodes.http.curl.title')}
+      isShow={isShow}
+      onClose={onHide}
+      className='!w-[400px] !max-w-[400px] !p-4'
+    >
+      <div>
+        <Textarea
+          value={inputString}
+          className='my-3 h-40 w-full grow'
+          onChange={e => setInputString(e.target.value)}
+          placeholder={t('workflow.nodes.http.curl.placeholder')!}
+        />
+      </div>
+      <div className='mt-4 flex justify-end space-x-2'>
+        <Button className='!w-[95px]' onClick={onHide} >{t('common.operation.cancel')}</Button>
+        <Button className='!w-[95px]' variant='primary' onClick={handleSave} > {t('common.operation.save')}</Button>
+      </div>
+    </Modal>
+  )
+}
+
+export default React.memo(CurlPanel)
diff --git a/app/components/workflow/nodes/http/components/edit-body/index.tsx b/app/components/workflow/nodes/http/components/edit-body/index.tsx
new file mode 100644
index 0000000..bfdb0b3
--- /dev/null
+++ b/app/components/workflow/nodes/http/components/edit-body/index.tsx
@@ -0,0 +1,204 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useMemo } from 'react'
+import produce from 'immer'
+import { uniqueId } from 'lodash-es'
+import type { Body, BodyPayload, KeyValue as KeyValueType } from '../../types'
+import { BodyPayloadValueType, BodyType } from '../../types'
+import KeyValue from '../key-value'
+import useAvailableVarList from '../../../_base/hooks/use-available-var-list'
+import VarReferencePicker from '../../../_base/components/variable/var-reference-picker'
+import cn from '@/utils/classnames'
+import InputWithVar from '@/app/components/workflow/nodes/_base/components/prompt/editor'
+import type { ValueSelector, Var } from '@/app/components/workflow/types'
+import { VarType } from '@/app/components/workflow/types'
+
+const UNIQUE_ID_PREFIX = 'key-value-'
+
+type Props = {
+  readonly: boolean
+  nodeId: string
+  payload: Body
+  onChange: (payload: Body) => void
+}
+
+const allTypes = [
+  BodyType.none,
+  BodyType.formData,
+  BodyType.xWwwFormUrlencoded,
+  BodyType.json,
+  BodyType.rawText,
+  BodyType.binary,
+]
+const bodyTextMap = {
+  [BodyType.none]: 'none',
+  [BodyType.formData]: 'form-data',
+  [BodyType.xWwwFormUrlencoded]: 'x-www-form-urlencoded',
+  [BodyType.rawText]: 'raw',
+  [BodyType.json]: 'JSON',
+  [BodyType.binary]: 'binary',
+}
+
+const EditBody: FC<Props> = ({
+  readonly,
+  nodeId,
+  payload,
+  onChange,
+}) => {
+  const { type, data } = payload
+  const bodyPayload = useMemo(() => {
+    if (typeof data === 'string') { // old data
+      return []
+    }
+    return data
+  }, [data])
+  const stringValue = [BodyType.formData, BodyType.xWwwFormUrlencoded].includes(type) ? '' : (bodyPayload[0]?.value || '')
+
+  const { availableVars, availableNodes } = useAvailableVarList(nodeId, {
+    onlyLeafNodeVar: false,
+    filterVar: (varPayload: Var) => {
+      return [VarType.string, VarType.number, VarType.secret, VarType.arrayNumber, VarType.arrayString].includes(varPayload.type)
+    },
+  })
+
+  const handleTypeChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
+    const newType = e.target.value as BodyType
+    const hasKeyValue = [BodyType.formData, BodyType.xWwwFormUrlencoded].includes(newType)
+    onChange({
+      type: newType,
+      data: hasKeyValue
+        ? [
+          {
+            id: uniqueId(UNIQUE_ID_PREFIX),
+            type: BodyPayloadValueType.text,
+            key: '',
+            value: '',
+          },
+        ]
+        : [],
+    })
+  }, [onChange])
+
+  const handleAddBody = useCallback(() => {
+    const newPayload = produce(payload, (draft) => {
+      (draft.data as BodyPayload).push({
+        id: uniqueId(UNIQUE_ID_PREFIX),
+        type: BodyPayloadValueType.text,
+        key: '',
+        value: '',
+      })
+    })
+    onChange(newPayload)
+  }, [onChange, payload])
+
+  const handleBodyPayloadChange = useCallback((newList: KeyValueType[]) => {
+    const newPayload = produce(payload, (draft) => {
+      draft.data = newList as BodyPayload
+    })
+    onChange(newPayload)
+  }, [onChange, payload])
+
+  const filterOnlyFileVariable = (varPayload: Var) => {
+    return [VarType.file, VarType.arrayFile].includes(varPayload.type)
+  }
+
+  const handleBodyValueChange = useCallback((value: string) => {
+    const newBody = produce(payload, (draft: Body) => {
+      if ((draft.data as BodyPayload).length === 0) {
+        (draft.data as BodyPayload).push({
+          id: uniqueId(UNIQUE_ID_PREFIX),
+          type: BodyPayloadValueType.text,
+          key: '',
+          value: '',
+        })
+      }
+      (draft.data as BodyPayload)[0].value = value
+    })
+    onChange(newBody)
+  }, [onChange, payload])
+
+  const handleFileChange = useCallback((value: ValueSelector | string) => {
+    const newBody = produce(payload, (draft: Body) => {
+      if ((draft.data as BodyPayload).length === 0) {
+        (draft.data as BodyPayload).push({
+          id: uniqueId(UNIQUE_ID_PREFIX),
+          type: BodyPayloadValueType.file,
+        })
+      }
+      (draft.data as BodyPayload)[0].file = value as ValueSelector
+    })
+    onChange(newBody)
+  }, [onChange, payload])
+
+  return (
+    <div>
+      {/* body type */}
+      <div className='flex flex-wrap'>
+        {allTypes.map(t => (
+          <label key={t} htmlFor={`body-type-${t}`} className='mr-4 flex h-7 items-center space-x-2'>
+            <input
+              type="radio"
+              id={`body-type-${t}`}
+              value={t}
+              checked={type === t}
+              onChange={handleTypeChange}
+              disabled={readonly}
+            />
+            <div className='text-[13px] font-normal leading-[18px] text-text-secondary'>{bodyTextMap[t]}</div>
+          </label>
+        ))}
+      </div>
+      {/* body value */}
+      <div className={cn(type !== BodyType.none && 'mt-1')}>
+        {type === BodyType.none && null}
+        {(type === BodyType.formData || type === BodyType.xWwwFormUrlencoded) && (
+          <KeyValue
+            readonly={readonly}
+            nodeId={nodeId}
+            list={bodyPayload as KeyValueType[]}
+            onChange={handleBodyPayloadChange}
+            onAdd={handleAddBody}
+            isSupportFile={type === BodyType.formData}
+          />
+        )}
+
+        {type === BodyType.rawText && (
+          <InputWithVar
+            instanceId={'http-body-raw'}
+            title={<div className='uppercase'>Raw text</div>}
+            onChange={handleBodyValueChange}
+            value={stringValue}
+            justVar
+            nodesOutputVars={availableVars}
+            availableNodes={availableNodes}
+            readOnly={readonly}
+          />
+        )}
+
+        {type === BodyType.json && (
+          <InputWithVar
+            instanceId={'http-body-json'}
+            title='JSON'
+            value={stringValue}
+            onChange={handleBodyValueChange}
+            justVar
+            nodesOutputVars={availableVars}
+            availableNodes={availableNodes}
+            readOnly={readonly}
+          />
+        )}
+
+        {type === BodyType.binary && (
+          <VarReferencePicker
+            nodeId={nodeId}
+            readonly={readonly}
+            value={bodyPayload[0]?.file || []}
+            onChange={handleFileChange}
+            filterVar={filterOnlyFileVariable}
+          />
+        )}
+      </div>
+    </div>
+  )
+}
+export default React.memo(EditBody)
diff --git a/app/components/workflow/nodes/http/components/key-value/bulk-edit/index.tsx b/app/components/workflow/nodes/http/components/key-value/bulk-edit/index.tsx
new file mode 100644
index 0000000..43c766c
--- /dev/null
+++ b/app/components/workflow/nodes/http/components/key-value/bulk-edit/index.tsx
@@ -0,0 +1,62 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import TextEditor from '@/app/components/workflow/nodes/_base/components/editor/text-editor'
+import { LayoutGrid02 } from '@/app/components/base/icons/src/vender/line/layout'
+
+const i18nPrefix = 'workflow.nodes.http'
+
+type Props = {
+  value: string
+  onChange: (value: string) => void
+  onSwitchToKeyValueEdit: () => void
+}
+
+const BulkEdit: FC<Props> = ({
+  value,
+  onChange,
+  onSwitchToKeyValueEdit,
+}) => {
+  const { t } = useTranslation()
+  const [tempValue, setTempValue] = React.useState(value)
+
+  const handleChange = useCallback((value: string) => {
+    setTempValue(value)
+  }, [])
+
+  const handleBlur = useCallback(() => {
+    onChange(tempValue)
+  }, [tempValue, onChange])
+
+  const handleSwitchToKeyValueEdit = useCallback(() => {
+    onChange(tempValue)
+    onSwitchToKeyValueEdit()
+  }, [tempValue, onChange, onSwitchToKeyValueEdit])
+
+  return (
+    <div>
+      <TextEditor
+        isInNode
+        title={<div className='uppercase'>{t(`${i18nPrefix}.bulkEdit`)}</div>}
+        value={tempValue}
+        onChange={handleChange}
+        onBlur={handleBlur}
+        headerRight={
+          <div className='flex h-[18px] items-center'>
+            <div
+              className='flex cursor-pointer items-center space-x-1'
+              onClick={handleSwitchToKeyValueEdit}
+            >
+              <LayoutGrid02 className='h-3 w-3 text-gray-500' />
+              <div className='text-xs font-normal leading-[18px] text-gray-500'>{t(`${i18nPrefix}.keyValueEdit`)}</div>
+            </div>
+            <div className='ml-3 mr-1.5 h-3 w-px bg-gray-200'></div>
+          </div>
+        }
+        minHeight={150}
+      />
+    </div>
+  )
+}
+export default React.memo(BulkEdit)
diff --git a/app/components/workflow/nodes/http/components/key-value/index.tsx b/app/components/workflow/nodes/http/components/key-value/index.tsx
new file mode 100644
index 0000000..e930114
--- /dev/null
+++ b/app/components/workflow/nodes/http/components/key-value/index.tsx
@@ -0,0 +1,62 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import type { KeyValue } from '../../types'
+import KeyValueEdit from './key-value-edit'
+
+type Props = {
+  readonly: boolean
+  nodeId: string
+  list: KeyValue[]
+  onChange: (newList: KeyValue[]) => void
+  onAdd: () => void
+  isSupportFile?: boolean
+  // toggleKeyValueEdit: () => void
+}
+
+const KeyValueList: FC<Props> = ({
+  readonly,
+  nodeId,
+  list,
+  onChange,
+  onAdd,
+  isSupportFile,
+  // toggleKeyValueEdit,
+}) => {
+  // const handleBulkValueChange = useCallback((value: string) => {
+  //   const newList = value.split('\n').map((item) => {
+  //     const [key, value] = item.split(':')
+  //     return {
+  //       key: key ? key.trim() : '',
+  //       value: value ? value.trim() : '',
+  //     }
+  //   })
+  //   onChange(newList)
+  // }, [onChange])
+
+  // const bulkList = (() => {
+  //   const res = list.map((item) => {
+  //     if (!item.key && !item.value)
+  //       return ''
+  //     if (!item.value)
+  //       return item.key
+  //     return `${item.key}:${item.value}`
+  //   }).join('\n')
+  //   return res
+  // })()
+  return <KeyValueEdit
+    readonly={readonly}
+    nodeId={nodeId}
+    list={list}
+    onChange={onChange}
+    onAdd={onAdd}
+    isSupportFile={isSupportFile}
+  // onSwitchToBulkEdit={toggleKeyValueEdit}
+  />
+  // : <BulkEdit
+  //   value={bulkList}
+  //   onChange={handleBulkValueChange}
+  //   onSwitchToKeyValueEdit={toggleKeyValueEdit}
+  // />
+}
+export default React.memo(KeyValueList)
diff --git a/app/components/workflow/nodes/http/components/key-value/key-value-edit/index.tsx b/app/components/workflow/nodes/http/components/key-value/key-value-edit/index.tsx
new file mode 100644
index 0000000..b333bd6
--- /dev/null
+++ b/app/components/workflow/nodes/http/components/key-value/key-value-edit/index.tsx
@@ -0,0 +1,87 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import produce from 'immer'
+import { useTranslation } from 'react-i18next'
+import type { KeyValue } from '../../../types'
+import KeyValueItem from './item'
+import cn from '@/utils/classnames'
+
+const i18nPrefix = 'workflow.nodes.http'
+
+type Props = {
+  readonly: boolean
+  nodeId: string
+  list: KeyValue[]
+  onChange: (newList: KeyValue[]) => void
+  onAdd: () => void
+  isSupportFile?: boolean
+  // onSwitchToBulkEdit: () => void
+  keyNotSupportVar?: boolean
+  insertVarTipToLeft?: boolean
+}
+
+const KeyValueList: FC<Props> = ({
+  readonly,
+  nodeId,
+  list,
+  onChange,
+  onAdd,
+  isSupportFile,
+  // onSwitchToBulkEdit,
+  keyNotSupportVar,
+  insertVarTipToLeft,
+}) => {
+  const { t } = useTranslation()
+
+  const handleChange = useCallback((index: number) => {
+    return (newItem: KeyValue) => {
+      const newList = produce(list, (draft: any) => {
+        draft[index] = newItem
+      })
+      onChange(newList)
+    }
+  }, [list, onChange])
+
+  const handleRemove = useCallback((index: number) => {
+    return () => {
+      const newList = produce(list, (draft: any) => {
+        draft.splice(index, 1)
+      })
+      onChange(newList)
+    }
+  }, [list, onChange])
+
+  if (!Array.isArray(list))
+    return null
+
+  return (
+    <div className='overflow-hidden rounded-lg border border-divider-regular'>
+      <div className={cn('system-xs-medium-uppercase flex h-7 items-center leading-7 text-text-tertiary')}>
+        <div className={cn('h-full border-r border-divider-regular pl-3', isSupportFile ? 'w-[140px]' : 'w-1/2')}>{t(`${i18nPrefix}.key`)}</div>
+        {isSupportFile && <div className='h-full w-[70px] shrink-0 border-r border-divider-regular pl-3'>{t(`${i18nPrefix}.type`)}</div>}
+        <div className={cn('h-full items-center justify-between pl-3 pr-1', isSupportFile ? 'grow' : 'w-1/2')}>{t(`${i18nPrefix}.value`)}</div>
+      </div>
+      {
+        list.map((item, index) => (
+          <KeyValueItem
+            key={item.id}
+            instanceId={item.id!}
+            nodeId={nodeId}
+            payload={item}
+            onChange={handleChange(index)}
+            onRemove={handleRemove(index)}
+            isLastItem={index === list.length - 1}
+            onAdd={onAdd}
+            readonly={readonly}
+            canRemove={list.length > 1}
+            isSupportFile={isSupportFile}
+            keyNotSupportVar={keyNotSupportVar}
+            insertVarTipToLeft={insertVarTipToLeft}
+          />
+        ))
+      }
+    </div>
+  )
+}
+export default React.memo(KeyValueList)
diff --git a/app/components/workflow/nodes/http/components/key-value/key-value-edit/input-item.tsx b/app/components/workflow/nodes/http/components/key-value/key-value-edit/input-item.tsx
new file mode 100644
index 0000000..79171df
--- /dev/null
+++ b/app/components/workflow/nodes/http/components/key-value/key-value-edit/input-item.tsx
@@ -0,0 +1,109 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import useAvailableVarList from '../../../../_base/hooks/use-available-var-list'
+import cn from '@/utils/classnames'
+import RemoveButton from '@/app/components/workflow/nodes/_base/components/remove-button'
+import Input from '@/app/components/workflow/nodes/_base/components/input-support-select-var'
+import type { Var } from '@/app/components/workflow/types'
+import { VarType } from '@/app/components/workflow/types'
+type Props = {
+  className?: string
+  instanceId?: string
+  nodeId: string
+  value: string
+  onChange: (newValue: string) => void
+  hasRemove: boolean
+  onRemove?: () => void
+  placeholder?: string
+  readOnly?: boolean
+  isSupportFile?: boolean
+  insertVarTipToLeft?: boolean
+}
+
+const InputItem: FC<Props> = ({
+  className,
+  instanceId,
+  nodeId,
+  value,
+  onChange,
+  hasRemove,
+  onRemove,
+  placeholder,
+  readOnly,
+  isSupportFile,
+  insertVarTipToLeft,
+}) => {
+  const { t } = useTranslation()
+
+  const hasValue = !!value
+
+  const [isFocus, setIsFocus] = useState(false)
+  const { availableVars, availableNodesWithParent } = useAvailableVarList(nodeId, {
+    onlyLeafNodeVar: false,
+    filterVar: (varPayload: Var) => {
+      const supportVarTypes = [VarType.string, VarType.number, VarType.secret]
+      if (isSupportFile)
+        supportVarTypes.push(...[VarType.file, VarType.arrayFile])
+
+      return supportVarTypes.includes(varPayload.type)
+    },
+  })
+
+  const handleRemove = useCallback((e: React.MouseEvent) => {
+    e.stopPropagation()
+    onRemove?.()
+  }, [onRemove])
+
+  return (
+    <div className={cn(className, 'hover:cursor-text hover:bg-state-base-hover', 'relative flex h-full')}>
+      {(!readOnly)
+        ? (
+          <Input
+            instanceId={instanceId}
+            className={cn(isFocus ? 'bg-components-input-bg-active' : 'bg-width', 'w-0 grow px-3 py-1')}
+            value={value}
+            onChange={onChange}
+            readOnly={readOnly}
+            nodesOutputVars={availableVars}
+            availableNodes={availableNodesWithParent}
+            onFocusChange={setIsFocus}
+            placeholder={t('workflow.nodes.http.insertVarPlaceholder')!}
+            placeholderClassName='!leading-[21px]'
+            promptMinHeightClassName='h-full'
+            insertVarTipToLeft={insertVarTipToLeft}
+          />
+        )
+        : <div
+          className="h-[18px] w-full pl-0.5 leading-[18px]"
+        >
+          {!hasValue && <div className='text-xs font-normal text-text-quaternary'>{placeholder}</div>}
+          {hasValue && (
+            <Input
+              instanceId={instanceId}
+              className={cn(isFocus ? 'border-components-input-border-active bg-components-input-bg-active shadow-xs' : 'border-components-input-border-hover bg-components-input-bg-normal', 'w-0 grow rounded-lg border px-3 py-[6px]')}
+              value={value}
+              onChange={onChange}
+              readOnly={readOnly}
+              nodesOutputVars={availableVars}
+              availableNodes={availableNodesWithParent}
+              onFocusChange={setIsFocus}
+              placeholder={t('workflow.nodes.http.insertVarPlaceholder')!}
+              placeholderClassName='!leading-[21px]'
+              promptMinHeightClassName='h-full'
+              insertVarTipToLeft={insertVarTipToLeft}
+            />
+          )}
+
+        </div>}
+      {hasRemove && !isFocus && (
+        <RemoveButton
+          className='absolute right-1 top-0.5 hidden group-hover:block'
+          onClick={handleRemove}
+        />
+      )}
+    </div>
+  )
+}
+export default React.memo(InputItem)
diff --git a/app/components/workflow/nodes/http/components/key-value/key-value-edit/item.tsx b/app/components/workflow/nodes/http/components/key-value/key-value-edit/item.tsx
new file mode 100644
index 0000000..b2df1cb
--- /dev/null
+++ b/app/components/workflow/nodes/http/components/key-value/key-value-edit/item.tsx
@@ -0,0 +1,135 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import type { KeyValue } from '../../../types'
+import VarReferencePicker from '../../../../_base/components/variable/var-reference-picker'
+import InputItem from './input-item'
+import cn from '@/utils/classnames'
+import { PortalSelect } from '@/app/components/base/select'
+import type { ValueSelector, Var } from '@/app/components/workflow/types'
+import { VarType } from '@/app/components/workflow/types'
+// import Input from '@/app/components/base/input'
+
+const i18nPrefix = 'workflow.nodes.http'
+
+type Props = {
+  instanceId: string
+  className?: string
+  nodeId: string
+  readonly: boolean
+  canRemove: boolean
+  payload: KeyValue
+  onChange: (newPayload: KeyValue) => void
+  onRemove: () => void
+  isLastItem: boolean
+  onAdd: () => void
+  isSupportFile?: boolean
+  keyNotSupportVar?: boolean
+  insertVarTipToLeft?: boolean
+}
+
+const KeyValueItem: FC<Props> = ({
+  instanceId,
+  className,
+  nodeId,
+  readonly,
+  canRemove,
+  payload,
+  onChange,
+  onRemove,
+  isLastItem,
+  onAdd,
+  isSupportFile,
+  keyNotSupportVar,
+  insertVarTipToLeft,
+}) => {
+  const { t } = useTranslation()
+
+  const handleChange = useCallback((key: string) => {
+    return (value: string | ValueSelector) => {
+      const newPayload = produce(payload, (draft: any) => {
+        draft[key] = value
+      })
+      onChange(newPayload)
+    }
+  }, [onChange, payload])
+
+  const filterOnlyFileVariable = (varPayload: Var) => {
+    return [VarType.file, VarType.arrayFile].includes(varPayload.type)
+  }
+
+  return (
+    // group class name is for hover row show remove button
+    <div className={cn(className, 'h-min-7 group flex border-t border-divider-regular')}>
+      <div className={cn('shrink-0 border-r border-divider-regular', isSupportFile ? 'w-[140px]' : 'w-1/2')}>
+        {!keyNotSupportVar
+          ? (
+            <InputItem
+              instanceId={`http-key-${instanceId}`}
+              nodeId={nodeId}
+              value={payload.key}
+              onChange={handleChange('key')}
+              hasRemove={false}
+              placeholder={t(`${i18nPrefix}.key`)!}
+              readOnly={readonly}
+              insertVarTipToLeft={insertVarTipToLeft}
+            />
+          )
+          : (
+            <input
+              className='system-sm-regular focus:bg-gray-100! appearance-none rounded-none border-none bg-transparent outline-none hover:bg-components-input-bg-hover focus:ring-0'
+              value={payload.key}
+              onChange={e => handleChange('key')(e.target.value)}
+            />
+          )}
+      </div>
+      {isSupportFile && (
+        <div className='w-[70px] shrink-0 border-r border-divider-regular'>
+          <PortalSelect
+            value={payload.type!}
+            onSelect={item => handleChange('type')(item.value as string)}
+            items={[
+              { name: 'text', value: 'text' },
+              { name: 'file', value: 'file' },
+            ]}
+            readonly={readonly}
+            triggerClassName='rounded-none h-7 text-text-primary'
+            triggerClassNameFn={isOpen => isOpen ? 'bg-state-base-hover' : 'bg-transparent'}
+            popupClassName='w-[80px] h-7'
+          />
+        </div>)}
+      <div className={cn(isSupportFile ? 'grow' : 'w-1/2')} onClick={() => isLastItem && onAdd()}>
+        {(isSupportFile && payload.type === 'file')
+          ? (
+            <VarReferencePicker
+              nodeId={nodeId}
+              readonly={readonly}
+              value={payload.file || []}
+              onChange={handleChange('file')}
+              filterVar={filterOnlyFileVariable}
+              isInTable
+              onRemove={onRemove}
+            />
+          )
+          : (
+            <InputItem
+              instanceId={`http-value-${instanceId}`}
+              nodeId={nodeId}
+              value={payload.value}
+              onChange={handleChange('value')}
+              hasRemove={!readonly && canRemove}
+              onRemove={onRemove}
+              placeholder={t(`${i18nPrefix}.value`)!}
+              readOnly={readonly}
+              isSupportFile={isSupportFile}
+              insertVarTipToLeft={insertVarTipToLeft}
+            />
+          )}
+
+      </div>
+    </div>
+  )
+}
+export default React.memo(KeyValueItem)
diff --git a/app/components/workflow/nodes/http/components/timeout/index.tsx b/app/components/workflow/nodes/http/components/timeout/index.tsx
new file mode 100644
index 0000000..b0fd3b2
--- /dev/null
+++ b/app/components/workflow/nodes/http/components/timeout/index.tsx
@@ -0,0 +1,93 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import type { Timeout as TimeoutPayloadType } from '../../types'
+import Input from '@/app/components/base/input'
+import { FieldCollapse } from '@/app/components/workflow/nodes/_base/components/collapse'
+
+type Props = {
+  readonly: boolean
+  nodeId: string
+  payload: TimeoutPayloadType
+  onChange: (payload: TimeoutPayloadType) => void
+}
+
+const i18nPrefix = 'workflow.nodes.http'
+
+const InputField: FC<{
+  title: string
+  description: string
+  placeholder: string
+  value?: number
+  onChange: (value: number) => void
+  readOnly?: boolean
+  min: number
+  max: number
+}> = ({ title, description, placeholder, value, onChange, readOnly, min, max }) => {
+  return (
+    <div className="space-y-1">
+      <div className="flex h-[18px] items-center space-x-2">
+        <span className="text-[13px] font-medium text-text-primary">{title}</span>
+        <span className="text-xs font-normal text-text-tertiary">{description}</span>
+      </div>
+      <Input
+        type='number'
+        value={value}
+        onChange={(e) => {
+          const value = Math.max(min, Math.min(max, Number.parseInt(e.target.value, 10)))
+          onChange(value)
+        }}
+        placeholder={placeholder}
+        readOnly={readOnly}
+        min={min}
+        max={max}
+      />
+    </div>
+  )
+}
+
+const Timeout: FC<Props> = ({ readonly, payload, onChange }) => {
+  const { t } = useTranslation()
+  const { connect, read, write, max_connect_timeout, max_read_timeout, max_write_timeout } = payload ?? {}
+
+  return (
+    <FieldCollapse title={t(`${i18nPrefix}.timeout.title`)}>
+      <div className='mt-2 space-y-1'>
+        <div className="space-y-3">
+          <InputField
+            title={t('workflow.nodes.http.timeout.connectLabel')!}
+            description={t('workflow.nodes.http.timeout.connectPlaceholder')!}
+            placeholder={t('workflow.nodes.http.timeout.connectPlaceholder')!}
+            readOnly={readonly}
+            value={connect}
+            onChange={v => onChange?.({ ...payload, connect: v })}
+            min={1}
+            max={max_connect_timeout || 300}
+          />
+          <InputField
+            title={t('workflow.nodes.http.timeout.readLabel')!}
+            description={t('workflow.nodes.http.timeout.readPlaceholder')!}
+            placeholder={t('workflow.nodes.http.timeout.readPlaceholder')!}
+            readOnly={readonly}
+            value={read}
+            onChange={v => onChange?.({ ...payload, read: v })}
+            min={1}
+            max={max_read_timeout || 600}
+          />
+          <InputField
+            title={t('workflow.nodes.http.timeout.writeLabel')!}
+            description={t('workflow.nodes.http.timeout.writePlaceholder')!}
+            placeholder={t('workflow.nodes.http.timeout.writePlaceholder')!}
+            readOnly={readonly}
+            value={write}
+            onChange={v => onChange?.({ ...payload, write: v })}
+            min={1}
+            max={max_write_timeout || 600}
+          />
+        </div>
+      </div>
+    </FieldCollapse>
+  )
+}
+export default React.memo(Timeout)
diff --git a/app/components/workflow/nodes/http/default.ts b/app/components/workflow/nodes/http/default.ts
new file mode 100644
index 0000000..1bd584e
--- /dev/null
+++ b/app/components/workflow/nodes/http/default.ts
@@ -0,0 +1,65 @@
+import { BlockEnum } from '../../types'
+import type { NodeDefault } from '../../types'
+import { AuthorizationType, BodyType, Method } from './types'
+import type { BodyPayload, HttpNodeType } from './types'
+import {
+  ALL_CHAT_AVAILABLE_BLOCKS,
+  ALL_COMPLETION_AVAILABLE_BLOCKS,
+} from '@/app/components/workflow/blocks'
+
+const nodeDefault: NodeDefault<HttpNodeType> = {
+  defaultValue: {
+    variables: [],
+    method: Method.get,
+    url: '',
+    authorization: {
+      type: AuthorizationType.none,
+      config: null,
+    },
+    headers: '',
+    params: '',
+    body: {
+      type: BodyType.none,
+      data: [],
+    },
+    timeout: {
+      max_connect_timeout: 0,
+      max_read_timeout: 0,
+      max_write_timeout: 0,
+    },
+    retry_config: {
+      retry_enabled: true,
+      max_retries: 3,
+      retry_interval: 100,
+    },
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: HttpNodeType, t: any) {
+    let errorMessages = ''
+
+    if (!errorMessages && !payload.url)
+      errorMessages = t('workflow.errorMsg.fieldRequired', { field: t('workflow.nodes.http.api') })
+
+    if (!errorMessages
+        && payload.body.type === BodyType.binary
+        && ((!(payload.body.data as BodyPayload)[0]?.file) || (payload.body.data as BodyPayload)[0]?.file?.length === 0)
+    )
+      errorMessages = t('workflow.errorMsg.fieldRequired', { field: t('workflow.nodes.http.binaryFileVariable') })
+
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/http/hooks/use-key-value-list.ts b/app/components/workflow/nodes/http/hooks/use-key-value-list.ts
new file mode 100644
index 0000000..3892461
--- /dev/null
+++ b/app/components/workflow/nodes/http/hooks/use-key-value-list.ts
@@ -0,0 +1,58 @@
+import { useCallback, useEffect, useState } from 'react'
+import { useBoolean } from 'ahooks'
+import { uniqueId } from 'lodash-es'
+import type { KeyValue } from '../types'
+
+const UNIQUE_ID_PREFIX = 'key-value-'
+const strToKeyValueList = (value: string) => {
+  return value.split('\n').map((item) => {
+    const [key, ...others] = item.split(':')
+    return {
+      id: uniqueId(UNIQUE_ID_PREFIX),
+      key: key.trim(),
+      value: others.join(':').trim(),
+    }
+  })
+}
+
+const useKeyValueList = (value: string, onChange: (value: string) => void, noFilter?: boolean) => {
+  const [list, doSetList] = useState<KeyValue[]>(value ? strToKeyValueList(value) : [])
+  const setList = (l: KeyValue[]) => {
+    doSetList(l.map((item) => {
+      return {
+        ...item,
+        id: item.id || uniqueId(UNIQUE_ID_PREFIX),
+      }
+    }))
+  }
+  useEffect(() => {
+    if (noFilter)
+      return
+    const newValue = list.filter(item => item.key && item.value).map(item => `${item.key}:${item.value}`).join('\n')
+    if (newValue !== value)
+      onChange(newValue)
+
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [list, noFilter])
+  const addItem = useCallback(() => {
+    setList([...list, {
+      id: uniqueId(UNIQUE_ID_PREFIX),
+      key: '',
+      value: '',
+    }])
+  }, [list])
+
+  const [isKeyValueEdit, {
+    toggle: toggleIsKeyValueEdit,
+  }] = useBoolean(true)
+
+  return {
+    list: list.length === 0 ? [{ id: uniqueId(UNIQUE_ID_PREFIX), key: '', value: '' }] : list, // no item can not add new item
+    setList,
+    addItem,
+    isKeyValueEdit,
+    toggleIsKeyValueEdit,
+  }
+}
+
+export default useKeyValueList
diff --git a/app/components/workflow/nodes/http/node.tsx b/app/components/workflow/nodes/http/node.tsx
new file mode 100644
index 0000000..ad4b5f5
--- /dev/null
+++ b/app/components/workflow/nodes/http/node.tsx
@@ -0,0 +1,30 @@
+import type { FC } from 'react'
+import React from 'react'
+import ReadonlyInputWithSelectVar from '../_base/components/readonly-input-with-select-var'
+import type { HttpNodeType } from './types'
+import type { NodeProps } from '@/app/components/workflow/types'
+const Node: FC<NodeProps<HttpNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { method, url } = data
+  if (!url)
+    return null
+
+  return (
+    <div className='mb-1 px-3 py-1'>
+      <div className='flex items-start rounded-md bg-workflow-block-parma-bg p-1'>
+        <div className='flex h-4 shrink-0 items-center rounded bg-components-badge-white-to-dark px-1 text-xs font-semibold uppercase text-text-secondary'>{method}</div>
+        <div className='pl-1 pt-1'>
+          <ReadonlyInputWithSelectVar
+            className='text-text-secondary'
+            value={url}
+            nodeId={id}
+          />
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Node)
diff --git a/app/components/workflow/nodes/http/panel.tsx b/app/components/workflow/nodes/http/panel.tsx
new file mode 100644
index 0000000..60f3de8
--- /dev/null
+++ b/app/components/workflow/nodes/http/panel.tsx
@@ -0,0 +1,213 @@
+import type { FC } from 'react'
+import { memo } from 'react'
+import { useTranslation } from 'react-i18next'
+import useConfig from './use-config'
+import ApiInput from './components/api-input'
+import KeyValue from './components/key-value'
+import EditBody from './components/edit-body'
+import AuthorizationModal from './components/authorization'
+import type { HttpNodeType } from './types'
+import Timeout from './components/timeout'
+import CurlPanel from './components/curl-panel'
+import cn from '@/utils/classnames'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import Split from '@/app/components/workflow/nodes/_base/components/split'
+import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
+import { Settings01 } from '@/app/components/base/icons/src/vender/line/general'
+import { FileArrow01 } from '@/app/components/base/icons/src/vender/line/files'
+import type { NodePanelProps } from '@/app/components/workflow/types'
+import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
+import ResultPanel from '@/app/components/workflow/run/result-panel'
+
+const i18nPrefix = 'workflow.nodes.http'
+
+const Panel: FC<NodePanelProps<HttpNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    readOnly,
+    isDataReady,
+    inputs,
+    handleMethodChange,
+    handleUrlChange,
+    headers,
+    setHeaders,
+    addHeader,
+    params,
+    setParams,
+    addParam,
+    setBody,
+    isShowAuthorization,
+    showAuthorization,
+    hideAuthorization,
+    setAuthorization,
+    setTimeout,
+    // single run
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    varInputs,
+    inputVarValues,
+    setInputVarValues,
+    runResult,
+    isShowCurlPanel,
+    showCurlPanel,
+    hideCurlPanel,
+    handleCurlImport,
+  } = useConfig(id, data)
+  // To prevent prompt editor in body not update data.
+  if (!isDataReady)
+    return null
+
+  return (
+    <div className='pt-2'>
+      <div className='space-y-4 px-4 pb-4'>
+        <Field
+          title={t(`${i18nPrefix}.api`)}
+          required
+          operations={
+            <div className='flex'>
+              <div
+                onClick={showAuthorization}
+                className={cn(!readOnly && 'cursor-pointer hover:bg-state-base-hover', 'flex h-6 items-center space-x-1 rounded-md px-2 ')}
+              >
+                {!readOnly && <Settings01 className='h-3 w-3 text-text-tertiary' />}
+                <div className='text-xs font-medium text-text-tertiary'>
+                  {t(`${i18nPrefix}.authorization.authorization`)}
+                  <span className='ml-1 text-text-secondary'>{t(`${i18nPrefix}.authorization.${inputs.authorization.type}`)}</span>
+                </div>
+              </div>
+              <div
+                onClick={showCurlPanel}
+                className={cn(!readOnly && 'cursor-pointer hover:bg-state-base-hover', 'flex h-6 items-center space-x-1 rounded-md px-2 ')}
+              >
+                {!readOnly && <FileArrow01 className='h-3 w-3 text-text-tertiary' />}
+                <div className='text-xs font-medium text-text-tertiary'>
+                  {t(`${i18nPrefix}.curl.title`)}
+                </div>
+              </div>
+            </div>
+          }
+        >
+          <ApiInput
+            nodeId={id}
+            readonly={readOnly}
+            method={inputs.method}
+            onMethodChange={handleMethodChange}
+            url={inputs.url}
+            onUrlChange={handleUrlChange}
+          />
+        </Field>
+        <Field
+          title={t(`${i18nPrefix}.headers`)}
+        >
+          <KeyValue
+            nodeId={id}
+            list={headers}
+            onChange={setHeaders}
+            onAdd={addHeader}
+            readonly={readOnly}
+          />
+        </Field>
+        <Field
+          title={t(`${i18nPrefix}.params`)}
+        >
+          <KeyValue
+            nodeId={id}
+            list={params}
+            onChange={setParams}
+            onAdd={addParam}
+            readonly={readOnly}
+          />
+        </Field>
+        <Field
+          title={t(`${i18nPrefix}.body`)}
+          required
+        >
+          <EditBody
+            nodeId={id}
+            readonly={readOnly}
+            payload={inputs.body}
+            onChange={setBody}
+          />
+        </Field>
+      </div>
+      <Split />
+      <Timeout
+        nodeId={id}
+        readonly={readOnly}
+        payload={inputs.timeout}
+        onChange={setTimeout}
+      />
+      {(isShowAuthorization && !readOnly) && (
+        <AuthorizationModal
+          nodeId={id}
+          isShow
+          onHide={hideAuthorization}
+          payload={inputs.authorization}
+          onChange={setAuthorization}
+        />
+      )}
+      <Split />
+      <div className=''>
+        <OutputVars>
+          <>
+            <VarItem
+              name='body'
+              type='string'
+              description={t(`${i18nPrefix}.outputVars.body`)}
+            />
+            <VarItem
+              name='status_code'
+              type='number'
+              description={t(`${i18nPrefix}.outputVars.statusCode`)}
+            />
+            <VarItem
+              name='headers'
+              type='object'
+              description={t(`${i18nPrefix}.outputVars.headers`)}
+            />
+            <VarItem
+              name='files'
+              type='Array[File]'
+              description={t(`${i18nPrefix}.outputVars.files`)}
+            />
+          </>
+        </OutputVars>
+      </div>
+      {isShowSingleRun && (
+        <BeforeRunForm
+          nodeName={inputs.title}
+          nodeType={inputs.type}
+          onHide={hideSingleRun}
+          forms={[
+            {
+              inputs: varInputs,
+              values: inputVarValues,
+              onChange: setInputVarValues,
+            },
+          ]}
+          runningStatus={runningStatus}
+          onRun={handleRun}
+          onStop={handleStop}
+          result={<ResultPanel {...runResult} showSteps={false} />}
+        />
+      )}
+      {(isShowCurlPanel && !readOnly) && (
+        <CurlPanel
+          nodeId={id}
+          isShow
+          onHide={hideCurlPanel}
+          handleCurlImport={handleCurlImport}
+        />
+      )}
+    </div>
+  )
+}
+
+export default memo(Panel)
diff --git a/app/components/workflow/nodes/http/types.ts b/app/components/workflow/nodes/http/types.ts
new file mode 100644
index 0000000..f1937ec
--- /dev/null
+++ b/app/components/workflow/nodes/http/types.ts
@@ -0,0 +1,84 @@
+import type { CommonNodeType, ValueSelector, Variable } from '@/app/components/workflow/types'
+
+export enum Method {
+  get = 'get',
+  post = 'post',
+  head = 'head',
+  patch = 'patch',
+  put = 'put',
+  delete = 'delete',
+}
+
+export enum BodyType {
+  none = 'none',
+  formData = 'form-data',
+  xWwwFormUrlencoded = 'x-www-form-urlencoded',
+  rawText = 'raw-text',
+  json = 'json',
+  binary = 'binary',
+}
+
+export type KeyValue = {
+  id?: string
+  key: string
+  value: string
+  type?: string
+  file?: ValueSelector
+}
+
+export enum BodyPayloadValueType {
+  text = 'text',
+  file = 'file',
+}
+
+export type BodyPayload = {
+  id?: string
+  key?: string
+  type: BodyPayloadValueType
+  file?: ValueSelector // when type is file
+  value?: string // when type is text
+}[]
+export type Body = {
+  type: BodyType
+  data: string | BodyPayload // string is deprecated, it would convert to BodyPayload after loaded
+}
+
+export enum AuthorizationType {
+  none = 'no-auth',
+  apiKey = 'api-key',
+}
+
+export enum APIType {
+  basic = 'basic',
+  bearer = 'bearer',
+  custom = 'custom',
+}
+
+export type Authorization = {
+  type: AuthorizationType
+  config?: {
+    type: APIType
+    api_key: string
+    header?: string
+  } | null
+}
+
+export type Timeout = {
+  connect?: number
+  read?: number
+  write?: number
+  max_connect_timeout?: number
+  max_read_timeout?: number
+  max_write_timeout?: number
+}
+
+export type HttpNodeType = CommonNodeType & {
+  variables: Variable[]
+  method: Method
+  url: string
+  headers: string
+  params: string
+  body: Body
+  authorization: Authorization
+  timeout: Timeout
+}
diff --git a/app/components/workflow/nodes/http/use-config.ts b/app/components/workflow/nodes/http/use-config.ts
new file mode 100644
index 0000000..68c0a89
--- /dev/null
+++ b/app/components/workflow/nodes/http/use-config.ts
@@ -0,0 +1,235 @@
+import { useCallback, useEffect, useMemo, useState } from 'react'
+import produce from 'immer'
+import { useBoolean } from 'ahooks'
+import useVarList from '../_base/hooks/use-var-list'
+import { VarType } from '../../types'
+import type { Var } from '../../types'
+import { useStore } from '../../store'
+import { type Authorization, type Body, BodyType, type HttpNodeType, type Method, type Timeout } from './types'
+import useKeyValueList from './hooks/use-key-value-list'
+import { transformToBodyPayload } from './utils'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run'
+import {
+  useNodesReadOnly,
+} from '@/app/components/workflow/hooks'
+
+const useConfig = (id: string, payload: HttpNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+
+  const defaultConfig = useStore(s => s.nodesDefaultConfigs)[payload.type]
+
+  const { inputs, setInputs } = useNodeCrud<HttpNodeType>(id, payload)
+
+  const { handleVarListChange, handleAddVariable } = useVarList<HttpNodeType>({
+    inputs,
+    setInputs,
+  })
+
+  const [isDataReady, setIsDataReady] = useState(false)
+
+  useEffect(() => {
+    const isReady = defaultConfig && Object.keys(defaultConfig).length > 0
+    if (isReady) {
+      const newInputs = {
+        ...defaultConfig,
+        ...inputs,
+      }
+      const bodyData = newInputs.body.data
+      if (typeof bodyData === 'string') {
+        newInputs.body = {
+          ...newInputs.body,
+          data: transformToBodyPayload(bodyData, [BodyType.formData, BodyType.xWwwFormUrlencoded].includes(newInputs.body.type)),
+        }
+      }
+
+      setInputs(newInputs)
+      setIsDataReady(true)
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [defaultConfig])
+
+  const handleMethodChange = useCallback((method: Method) => {
+    const newInputs = produce(inputs, (draft: HttpNodeType) => {
+      draft.method = method
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleUrlChange = useCallback((url: string) => {
+    const newInputs = produce(inputs, (draft: HttpNodeType) => {
+      draft.url = url
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleFieldChange = useCallback((field: string) => {
+    return (value: string) => {
+      const newInputs = produce(inputs, (draft: HttpNodeType) => {
+        (draft as any)[field] = value
+      })
+      setInputs(newInputs)
+    }
+  }, [inputs, setInputs])
+
+  const {
+    list: headers,
+    setList: setHeaders,
+    addItem: addHeader,
+    isKeyValueEdit: isHeaderKeyValueEdit,
+    toggleIsKeyValueEdit: toggleIsHeaderKeyValueEdit,
+  } = useKeyValueList(inputs.headers, handleFieldChange('headers'))
+
+  const {
+    list: params,
+    setList: setParams,
+    addItem: addParam,
+    isKeyValueEdit: isParamKeyValueEdit,
+    toggleIsKeyValueEdit: toggleIsParamKeyValueEdit,
+  } = useKeyValueList(inputs.params, handleFieldChange('params'))
+
+  const setBody = useCallback((data: Body) => {
+    const newInputs = produce(inputs, (draft: HttpNodeType) => {
+      draft.body = data
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  // authorization
+  const [isShowAuthorization, {
+    setTrue: showAuthorization,
+    setFalse: hideAuthorization,
+  }] = useBoolean(false)
+
+  const setAuthorization = useCallback((authorization: Authorization) => {
+    const newInputs = produce(inputs, (draft: HttpNodeType) => {
+      draft.authorization = authorization
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const setTimeout = useCallback((timeout: Timeout) => {
+    const newInputs = produce(inputs, (draft: HttpNodeType) => {
+      draft.timeout = timeout
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const filterVar = useCallback((varPayload: Var) => {
+    return [VarType.string, VarType.number, VarType.secret].includes(varPayload.type)
+  }, [])
+
+  // single run
+  const {
+    isShowSingleRun,
+    hideSingleRun,
+    getInputVars,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runInputData,
+    setRunInputData,
+    runResult,
+  } = useOneStepRun<HttpNodeType>({
+    id,
+    data: inputs,
+    defaultRunInputData: {},
+  })
+
+  const fileVarInputs = useMemo(() => {
+    if (!Array.isArray(inputs.body.data))
+      return ''
+
+    const res = inputs.body.data
+      .filter(item => item.file?.length)
+      .map(item => item.file ? `{{#${item.file.join('.')}#}}` : '')
+      .join(' ')
+    return res
+  }, [inputs.body.data])
+
+  const varInputs = getInputVars([
+    inputs.url,
+    inputs.headers,
+    inputs.params,
+    typeof inputs.body.data === 'string' ? inputs.body.data : inputs.body.data.map(item => item.value).join(''),
+    fileVarInputs,
+  ])
+
+  const inputVarValues = (() => {
+    const vars: Record<string, any> = {}
+    Object.keys(runInputData)
+      .forEach((key) => {
+        vars[key] = runInputData[key]
+      })
+    return vars
+  })()
+
+  const setInputVarValues = useCallback((newPayload: Record<string, any>) => {
+    setRunInputData(newPayload)
+  }, [setRunInputData])
+
+  // curl import panel
+  const [isShowCurlPanel, {
+    setTrue: showCurlPanel,
+    setFalse: hideCurlPanel,
+  }] = useBoolean(false)
+
+  const handleCurlImport = useCallback((newNode: HttpNodeType) => {
+    const newInputs = produce(inputs, (draft: HttpNodeType) => {
+      draft.method = newNode.method
+      draft.url = newNode.url
+      draft.headers = newNode.headers
+      draft.params = newNode.params
+      draft.body = newNode.body
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  return {
+    readOnly,
+    isDataReady,
+    inputs,
+    handleVarListChange,
+    handleAddVariable,
+    filterVar,
+    handleMethodChange,
+    handleUrlChange,
+    // headers
+    headers,
+    setHeaders,
+    addHeader,
+    isHeaderKeyValueEdit,
+    toggleIsHeaderKeyValueEdit,
+    // params
+    params,
+    setParams,
+    addParam,
+    isParamKeyValueEdit,
+    toggleIsParamKeyValueEdit,
+    // body
+    setBody,
+    // authorization
+    isShowAuthorization,
+    showAuthorization,
+    hideAuthorization,
+    setAuthorization,
+    setTimeout,
+    // single run
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    varInputs,
+    inputVarValues,
+    setInputVarValues,
+    runResult,
+    // curl import
+    isShowCurlPanel,
+    showCurlPanel,
+    hideCurlPanel,
+    handleCurlImport,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/http/utils.ts b/app/components/workflow/nodes/http/utils.ts
new file mode 100644
index 0000000..ffb474f
--- /dev/null
+++ b/app/components/workflow/nodes/http/utils.ts
@@ -0,0 +1,21 @@
+import { type BodyPayload, BodyPayloadValueType } from './types'
+
+export const transformToBodyPayload = (old: string, hasKey: boolean): BodyPayload => {
+  if (!hasKey) {
+    return [
+      {
+        type: BodyPayloadValueType.text,
+        value: old,
+      },
+    ]
+  }
+  const bodyPayload = old.split('\n').map((item) => {
+    const [key, value] = item.split(':')
+    return {
+      key: key || '',
+      type: BodyPayloadValueType.text,
+      value: value || '',
+    }
+  })
+  return bodyPayload
+}
diff --git a/app/components/workflow/nodes/if-else/components/condition-add.tsx b/app/components/workflow/nodes/if-else/components/condition-add.tsx
new file mode 100644
index 0000000..9b6ad27
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/components/condition-add.tsx
@@ -0,0 +1,76 @@
+import {
+  useCallback,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiAddLine } from '@remixicon/react'
+import type { HandleAddCondition } from '../types'
+import Button from '@/app/components/base/button'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars'
+import type {
+  NodeOutPutVar,
+  ValueSelector,
+  Var,
+} from '@/app/components/workflow/types'
+
+type ConditionAddProps = {
+  className?: string
+  caseId: string
+  variables: NodeOutPutVar[]
+  onSelectVariable: HandleAddCondition
+  disabled?: boolean
+}
+const ConditionAdd = ({
+  className,
+  caseId,
+  variables,
+  onSelectVariable,
+  disabled,
+}: ConditionAddProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const handleSelectVariable = useCallback((valueSelector: ValueSelector, varItem: Var) => {
+    onSelectVariable(caseId, valueSelector, varItem)
+    setOpen(false)
+  }, [caseId, onSelectVariable, setOpen])
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 0,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(!open)}>
+        <Button
+          size='small'
+          className={className}
+          disabled={disabled}
+        >
+          <RiAddLine className='mr-1 h-3.5 w-3.5' />
+          {t('workflow.nodes.ifElse.addCondition')}
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[1000]'>
+        <div className='w-[296px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg'>
+          <VarReferenceVars
+            vars={variables}
+            isSupportFileVar
+            onChange={handleSelectVariable}
+          />
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default ConditionAdd
diff --git a/app/components/workflow/nodes/if-else/components/condition-files-list-value.tsx b/app/components/workflow/nodes/if-else/components/condition-files-list-value.tsx
new file mode 100644
index 0000000..ac347a0
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/components/condition-files-list-value.tsx
@@ -0,0 +1,115 @@
+import {
+  memo,
+  useCallback,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { ComparisonOperator, type Condition } from '../types'
+import {
+  comparisonOperatorNotRequireValue,
+  isComparisonOperatorNeedTranslate,
+  isEmptyRelatedOperator,
+} from '../utils'
+import { FILE_TYPE_OPTIONS, TRANSFER_METHOD } from '../../constants'
+import type { ValueSelector } from '../../../types'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import { BubbleX, Env } from '@/app/components/base/icons/src/vender/line/others'
+import cn from '@/utils/classnames'
+import { isConversationVar, isENV, isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+const i18nPrefix = 'workflow.nodes.ifElse'
+
+type ConditionValueProps = {
+  condition: Condition
+}
+const ConditionValue = ({
+  condition,
+}: ConditionValueProps) => {
+  const { t } = useTranslation()
+  const {
+    variable_selector,
+    comparison_operator: operator,
+    sub_variable_condition,
+  } = condition
+
+  const variableSelector = variable_selector as ValueSelector
+
+  const variableName = (isSystemVar(variableSelector) ? variableSelector.slice(0).join('.') : variableSelector.slice(1).join('.'))
+  const operatorName = isComparisonOperatorNeedTranslate(operator) ? t(`workflow.nodes.ifElse.comparisonOperator.${operator}`) : operator
+  const notHasValue = comparisonOperatorNotRequireValue(operator)
+  const isEnvVar = isENV(variableSelector)
+  const isChatVar = isConversationVar(variableSelector)
+  const formatValue = useCallback((c: Condition) => {
+    const notHasValue = comparisonOperatorNotRequireValue(c.comparison_operator)
+    if (notHasValue)
+      return ''
+
+    const value = c.value as string
+    return value.replace(/{{#([^#]*)#}}/g, (a, b) => {
+      const arr: string[] = b.split('.')
+      if (isSystemVar(arr))
+        return `{{${b}}}`
+
+      return `{{${arr.slice(1).join('.')}}}`
+    })
+  }, [])
+
+  const isSelect = useCallback((c: Condition) => {
+    return c.comparison_operator === ComparisonOperator.in || c.comparison_operator === ComparisonOperator.notIn
+  }, [])
+
+  const selectName = useCallback((c: Condition) => {
+    const isSelect = c.comparison_operator === ComparisonOperator.in || c.comparison_operator === ComparisonOperator.notIn
+    if (isSelect) {
+      const name = [...FILE_TYPE_OPTIONS, ...TRANSFER_METHOD].filter(item => item.value === (Array.isArray(c.value) ? c.value[0] : c.value))[0]
+      return name
+        ? t(`workflow.nodes.ifElse.optionName.${name.i18nKey}`).replace(/{{#([^#]*)#}}/g, (a, b) => {
+          const arr: string[] = b.split('.')
+          if (isSystemVar(arr))
+            return `{{${b}}}`
+
+          return `{{${arr.slice(1).join('.')}}}`
+        })
+        : ''
+    }
+    return ''
+  }, [t])
+
+  return (
+    <div className='rounded-md bg-workflow-block-parma-bg'>
+      <div className='flex h-6 items-center px-1 '>
+        {!isEnvVar && !isChatVar && <Variable02 className='mr-1 h-3.5 w-3.5 shrink-0 text-text-accent' />}
+        {isEnvVar && <Env className='mr-1 h-3.5 w-3.5 shrink-0 text-util-colors-violet-violet-600' />}
+        {isChatVar && <BubbleX className='h-3.5 w-3.5 text-util-colors-teal-teal-700' />}
+
+        <div
+          className={cn(
+            'shrink-0  truncate text-xs font-medium text-text-accent',
+            !notHasValue && 'max-w-[70px]',
+          )}
+          title={variableName}
+        >
+          {variableName}
+        </div>
+        <div
+          className='mx-1 shrink-0 text-xs font-medium text-text-primary'
+          title={operatorName}
+        >
+          {operatorName}
+        </div>
+      </div>
+      <div className='ml-[10px] border-l border-divider-regular pl-[10px]'>
+        {
+          sub_variable_condition?.conditions.map((c: Condition, index) => (
+            <div className='relative flex h-6 items-center space-x-1' key={c.id}>
+              <div className='system-xs-medium text-text-accent'>{c.key}</div>
+              <div className='system-xs-medium text-text-primary'>{isComparisonOperatorNeedTranslate(c.comparison_operator) ? t(`workflow.nodes.ifElse.comparisonOperator.${c.comparison_operator}`) : c.comparison_operator}</div>
+              {c.comparison_operator && !isEmptyRelatedOperator(c.comparison_operator) && <div className='system-xs-regular text-text-secondary'>{isSelect(c) ? selectName(c) : formatValue(c)}</div>}
+              {index !== sub_variable_condition.conditions.length - 1 && (<div className='absolute bottom-[-10px] right-1 z-10 text-[10px] font-medium uppercase leading-4 text-text-accent'>{t(`${i18nPrefix}.${sub_variable_condition.logical_operator}`)}</div>)}
+            </div>
+          ))
+        }
+      </div>
+    </div>
+  )
+}
+
+export default memo(ConditionValue)
diff --git a/app/components/workflow/nodes/if-else/components/condition-list/condition-input.tsx b/app/components/workflow/nodes/if-else/components/condition-list/condition-input.tsx
new file mode 100644
index 0000000..c393aaa
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/components/condition-list/condition-input.tsx
@@ -0,0 +1,56 @@
+import { useTranslation } from 'react-i18next'
+import { useStore } from '@/app/components/workflow/store'
+import PromptEditor from '@/app/components/base/prompt-editor'
+import { BlockEnum } from '@/app/components/workflow/types'
+import type {
+  Node,
+  NodeOutPutVar,
+} from '@/app/components/workflow/types'
+
+type ConditionInputProps = {
+  disabled?: boolean
+  value: string
+  onChange: (value: string) => void
+  nodesOutputVars: NodeOutPutVar[]
+  availableNodes: Node[]
+}
+const ConditionInput = ({
+  value,
+  onChange,
+  disabled,
+  nodesOutputVars,
+  availableNodes,
+}: ConditionInputProps) => {
+  const { t } = useTranslation()
+  const controlPromptEditorRerenderKey = useStore(s => s.controlPromptEditorRerenderKey)
+
+  return (
+    <PromptEditor
+      key={controlPromptEditorRerenderKey}
+      compact
+      value={value}
+      placeholder={t('workflow.nodes.ifElse.enterValue') || ''}
+      workflowVariableBlock={{
+        show: true,
+        variables: nodesOutputVars || [],
+        workflowNodesMap: availableNodes.reduce((acc, node) => {
+          acc[node.id] = {
+            title: node.data.title,
+            type: node.data.type,
+          }
+          if (node.data.type === BlockEnum.Start) {
+            acc.sys = {
+              title: t('workflow.blocks.start'),
+              type: BlockEnum.Start,
+            }
+          }
+          return acc
+        }, {} as any),
+      }}
+      onChange={onChange}
+      editable={!disabled}
+    />
+  )
+}
+
+export default ConditionInput
diff --git a/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx b/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx
new file mode 100644
index 0000000..ef94f7c
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx
@@ -0,0 +1,336 @@
+import {
+  useCallback,
+  useMemo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiDeleteBinLine } from '@remixicon/react'
+import produce from 'immer'
+import type { VarType as NumberVarType } from '../../../tool/types'
+import type {
+  Condition,
+  HandleAddSubVariableCondition,
+  HandleRemoveCondition,
+  HandleToggleSubVariableConditionLogicalOperator,
+  HandleUpdateCondition,
+  HandleUpdateSubVariableCondition,
+  handleRemoveSubVariableCondition,
+} from '../../types'
+import {
+  ComparisonOperator,
+} from '../../types'
+import { comparisonOperatorNotRequireValue, getOperators } from '../../utils'
+import ConditionNumberInput from '../condition-number-input'
+import { FILE_TYPE_OPTIONS, SUB_VARIABLES, TRANSFER_METHOD } from '../../../constants'
+import ConditionWrap from '../condition-wrap'
+import ConditionOperator from './condition-operator'
+import ConditionInput from './condition-input'
+
+import ConditionVarSelector from './condition-var-selector'
+import type {
+  Node,
+  NodeOutPutVar,
+  ValueSelector,
+  Var,
+} from '@/app/components/workflow/types'
+import { VarType } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+import { SimpleSelect as Select } from '@/app/components/base/select'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+const optionNameI18NPrefix = 'workflow.nodes.ifElse.optionName'
+
+type ConditionItemProps = {
+  className?: string
+  disabled?: boolean
+  caseId: string
+  conditionId: string // in isSubVariableKey it's the value of the parent condition's id
+  condition: Condition // condition may the condition of case or condition of sub variable
+  file?: { key: string }
+  isSubVariableKey?: boolean
+  isValueFieldShort?: boolean
+  onRemoveCondition?: HandleRemoveCondition
+  onUpdateCondition?: HandleUpdateCondition
+  onAddSubVariableCondition?: HandleAddSubVariableCondition
+  onRemoveSubVariableCondition?: handleRemoveSubVariableCondition
+  onUpdateSubVariableCondition?: HandleUpdateSubVariableCondition
+  onToggleSubVariableConditionLogicalOperator?: HandleToggleSubVariableConditionLogicalOperator
+  nodeId: string
+  nodesOutputVars: NodeOutPutVar[]
+  availableNodes: Node[]
+  numberVariables: NodeOutPutVar[]
+  filterVar: (varPayload: Var) => boolean
+}
+const ConditionItem = ({
+  className,
+  disabled,
+  caseId,
+  conditionId,
+  condition,
+  file,
+  isSubVariableKey,
+  isValueFieldShort,
+  onRemoveCondition,
+  onUpdateCondition,
+  onAddSubVariableCondition,
+  onRemoveSubVariableCondition,
+  onUpdateSubVariableCondition,
+  onToggleSubVariableConditionLogicalOperator,
+  nodeId,
+  nodesOutputVars,
+  availableNodes,
+  numberVariables,
+  filterVar,
+}: ConditionItemProps) => {
+  const { t } = useTranslation()
+
+  const [isHovered, setIsHovered] = useState(false)
+  const [open, setOpen] = useState(false)
+
+  const doUpdateCondition = useCallback((newCondition: Condition) => {
+    if (isSubVariableKey)
+      onUpdateSubVariableCondition?.(caseId, conditionId, condition.id, newCondition)
+    else
+      onUpdateCondition?.(caseId, condition.id, newCondition)
+  }, [caseId, condition, conditionId, isSubVariableKey, onUpdateCondition, onUpdateSubVariableCondition])
+
+  const canChooseOperator = useMemo(() => {
+    if (disabled)
+      return false
+
+    if (isSubVariableKey)
+      return !!condition.key
+
+    return true
+  }, [condition.key, disabled, isSubVariableKey])
+  const handleUpdateConditionOperator = useCallback((value: ComparisonOperator) => {
+    const newCondition = {
+      ...condition,
+      comparison_operator: value,
+    }
+    doUpdateCondition(newCondition)
+  }, [condition, doUpdateCondition])
+
+  const handleUpdateConditionNumberVarType = useCallback((numberVarType: NumberVarType) => {
+    const newCondition = {
+      ...condition,
+      numberVarType,
+      value: '',
+    }
+    doUpdateCondition(newCondition)
+  }, [condition, doUpdateCondition])
+
+  const isSubVariable = condition.varType === VarType.arrayFile && [ComparisonOperator.contains, ComparisonOperator.notContains, ComparisonOperator.allOf].includes(condition.comparison_operator!)
+  const fileAttr = useMemo(() => {
+    if (file)
+      return file
+    if (isSubVariableKey) {
+      return {
+        key: condition.key!,
+      }
+    }
+    return undefined
+  }, [condition.key, file, isSubVariableKey])
+
+  const isArrayValue = fileAttr?.key === 'transfer_method' || fileAttr?.key === 'type'
+
+  const handleUpdateConditionValue = useCallback((value: string) => {
+    if (value === condition.value || (isArrayValue && value === condition.value?.[0]))
+      return
+    const newCondition = {
+      ...condition,
+      value: isArrayValue ? [value] : value,
+    }
+    doUpdateCondition(newCondition)
+  }, [condition, doUpdateCondition, isArrayValue])
+
+  const isSelect = condition.comparison_operator && [ComparisonOperator.in, ComparisonOperator.notIn].includes(condition.comparison_operator)
+  const selectOptions = useMemo(() => {
+    if (isSelect) {
+      if (fileAttr?.key === 'type' || condition.comparison_operator === ComparisonOperator.allOf) {
+        return FILE_TYPE_OPTIONS.map(item => ({
+          name: t(`${optionNameI18NPrefix}.${item.i18nKey}`),
+          value: item.value,
+        }))
+      }
+      if (fileAttr?.key === 'transfer_method') {
+        return TRANSFER_METHOD.map(item => ({
+          name: t(`${optionNameI18NPrefix}.${item.i18nKey}`),
+          value: item.value,
+        }))
+      }
+      return []
+    }
+    return []
+  }, [condition.comparison_operator, fileAttr?.key, isSelect, t])
+
+  const isNotInput = isSelect || isSubVariable
+
+  const isSubVarSelect = isSubVariableKey
+  const subVarOptions = SUB_VARIABLES.map(item => ({
+    name: item,
+    value: item,
+  }))
+
+  const handleSubVarKeyChange = useCallback((key: string) => {
+    const newCondition = produce(condition, (draft) => {
+      draft.key = key
+      if (key === 'size')
+        draft.varType = VarType.number
+      else
+        draft.varType = VarType.string
+
+      draft.value = ''
+      draft.comparison_operator = getOperators(undefined, { key })[0]
+    })
+
+    onUpdateSubVariableCondition?.(caseId, conditionId, condition.id, newCondition)
+  }, [caseId, condition, conditionId, onUpdateSubVariableCondition])
+
+  const doRemoveCondition = useCallback(() => {
+    if (isSubVariableKey)
+      onRemoveSubVariableCondition?.(caseId, conditionId, condition.id)
+    else
+      onRemoveCondition?.(caseId, condition.id)
+  }, [caseId, condition, conditionId, isSubVariableKey, onRemoveCondition, onRemoveSubVariableCondition])
+
+  const handleVarChange = useCallback((valueSelector: ValueSelector, varItem: Var) => {
+    const newCondition = produce(condition, (draft) => {
+      draft.variable_selector = valueSelector
+      draft.varType = varItem.type
+      draft.value = ''
+      draft.comparison_operator = getOperators(varItem.type)[0]
+    })
+    doUpdateCondition(newCondition)
+    setOpen(false)
+  }, [condition, doUpdateCondition])
+
+  return (
+    <div className={cn('mb-1 flex last-of-type:mb-0', className)}>
+      <div className={cn(
+        'grow rounded-lg bg-components-input-bg-normal',
+        isHovered && 'bg-state-destructive-hover',
+      )}>
+        <div className='flex items-center p-1'>
+          <div className='w-0 grow'>
+            {isSubVarSelect
+              ? (
+                <Select
+                  wrapperClassName='h-6'
+                  className='pl-0 text-xs'
+                  optionWrapClassName='w-[165px] max-h-none'
+                  defaultValue={condition.key}
+                  items={subVarOptions}
+                  onSelect={item => handleSubVarKeyChange(item.value as string)}
+                  renderTrigger={item => (
+                    item
+                      ? <div className='flex cursor-pointer justify-start'>
+                        <div className='inline-flex h-6 max-w-full items-center rounded-md border-[0.5px] border-components-panel-border-subtle bg-components-badge-white-to-dark px-1.5 text-text-accent shadow-xs'>
+                          <Variable02 className='h-3.5 w-3.5 shrink-0 text-text-accent' />
+                          <div className='system-xs-medium ml-0.5 truncate'>{item?.name}</div>
+                        </div>
+                      </div>
+                      : <div className='system-sm-regular text-left text-components-input-text-placeholder'>{t('common.placeholder.select')}</div>
+                  )}
+                  hideChecked
+                />
+              )
+              : (
+                <ConditionVarSelector
+                  open={open}
+                  onOpenChange={setOpen}
+                  valueSelector={condition.variable_selector || []}
+                  varType={condition.varType}
+                  availableNodes={availableNodes}
+                  nodesOutputVars={nodesOutputVars}
+                  onChange={handleVarChange}
+                />
+              )}
+
+          </div>
+          <div className='mx-1 h-3 w-[1px] bg-divider-regular'></div>
+          <ConditionOperator
+            disabled={!canChooseOperator}
+            varType={condition.varType}
+            value={condition.comparison_operator}
+            onSelect={handleUpdateConditionOperator}
+            file={fileAttr}
+          />
+        </div>
+        {
+          !comparisonOperatorNotRequireValue(condition.comparison_operator) && !isNotInput && condition.varType !== VarType.number && (
+            <div className='max-h-[100px] overflow-y-auto border-t border-t-divider-subtle px-2 py-1'>
+              <ConditionInput
+                disabled={disabled}
+                value={condition.value as string}
+                onChange={handleUpdateConditionValue}
+                nodesOutputVars={nodesOutputVars}
+                availableNodes={availableNodes}
+              />
+            </div>
+          )
+        }
+        {
+          !comparisonOperatorNotRequireValue(condition.comparison_operator) && !isNotInput && condition.varType === VarType.number && (
+            <div className='border-t border-t-divider-subtle px-2 py-1 pt-[3px]'>
+              <ConditionNumberInput
+                numberVarType={condition.numberVarType}
+                onNumberVarTypeChange={handleUpdateConditionNumberVarType}
+                value={condition.value as string}
+                onValueChange={handleUpdateConditionValue}
+                variables={numberVariables}
+                isShort={isValueFieldShort}
+                unit={fileAttr?.key === 'size' ? 'Byte' : undefined}
+              />
+            </div>
+          )
+        }
+        {
+          !comparisonOperatorNotRequireValue(condition.comparison_operator) && isSelect && (
+            <div className='border-t border-t-divider-subtle'>
+              <Select
+                wrapperClassName='h-8'
+                className='rounded-t-none px-2 text-xs'
+                defaultValue={isArrayValue ? (condition.value as string[])?.[0] : (condition.value as string)}
+                items={selectOptions}
+                onSelect={item => handleUpdateConditionValue(item.value as string)}
+                hideChecked
+                notClearable
+              />
+            </div>
+          )
+        }
+        {
+          !comparisonOperatorNotRequireValue(condition.comparison_operator) && isSubVariable && (
+            <div className='p-1'>
+              <ConditionWrap
+                isSubVariable
+                caseId={caseId}
+                conditionId={conditionId}
+                readOnly={!!disabled}
+                cases={condition.sub_variable_condition ? [condition.sub_variable_condition] : []}
+                handleAddSubVariableCondition={onAddSubVariableCondition}
+                handleRemoveSubVariableCondition={onRemoveSubVariableCondition}
+                handleUpdateSubVariableCondition={onUpdateSubVariableCondition}
+                handleToggleSubVariableConditionLogicalOperator={onToggleSubVariableConditionLogicalOperator}
+                nodeId={nodeId}
+                nodesOutputVars={nodesOutputVars}
+                availableNodes={availableNodes}
+                filterVar={filterVar}
+              />
+            </div>
+          )
+        }
+      </div>
+      <div
+        className='ml-1 mt-1 flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-lg text-text-tertiary hover:bg-state-destructive-hover hover:text-text-destructive'
+        onMouseEnter={() => setIsHovered(true)}
+        onMouseLeave={() => setIsHovered(false)}
+        onClick={doRemoveCondition}
+      >
+        <RiDeleteBinLine className='h-4 w-4' />
+      </div>
+    </div>
+  )
+}
+
+export default ConditionItem
diff --git a/app/components/workflow/nodes/if-else/components/condition-list/condition-operator.tsx b/app/components/workflow/nodes/if-else/components/condition-list/condition-operator.tsx
new file mode 100644
index 0000000..9036e04
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/components/condition-list/condition-operator.tsx
@@ -0,0 +1,94 @@
+import {
+  useMemo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine } from '@remixicon/react'
+import { getOperators, isComparisonOperatorNeedTranslate } from '../../utils'
+import type { ComparisonOperator } from '../../types'
+import Button from '@/app/components/base/button'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import type { VarType } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+const i18nPrefix = 'workflow.nodes.ifElse'
+
+type ConditionOperatorProps = {
+  className?: string
+  disabled?: boolean
+  varType: VarType
+  file?: { key: string }
+  value?: string
+  onSelect: (value: ComparisonOperator) => void
+}
+const ConditionOperator = ({
+  className,
+  disabled,
+  varType,
+  file,
+  value,
+  onSelect,
+}: ConditionOperatorProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const options = useMemo(() => {
+    return getOperators(varType, file).map((o) => {
+      return {
+        label: isComparisonOperatorNeedTranslate(o) ? t(`${i18nPrefix}.comparisonOperator.${o}`) : o,
+        value: o,
+      }
+    })
+  }, [t, varType, file])
+  const selectedOption = options.find(o => Array.isArray(value) ? o.value === value[0] : o.value === value)
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 0,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+        <Button
+          className={cn('shrink-0', !selectedOption && 'opacity-50', className)}
+          size='small'
+          variant='ghost'
+          disabled={disabled}
+        >
+          {
+            selectedOption
+              ? selectedOption.label
+              : t(`${i18nPrefix}.select`)
+          }
+          <RiArrowDownSLine className='ml-1 h-3.5 w-3.5' />
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-10'>
+        <div className='rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
+          {
+            options.map(option => (
+              <div
+                key={option.value}
+                className='flex h-7 cursor-pointer items-center rounded-lg px-3 py-1.5 text-[13px] font-medium text-text-secondary hover:bg-state-base-hover'
+                onClick={() => {
+                  onSelect(option.value)
+                  setOpen(false)
+                }}
+              >
+                {option.label}
+              </div>
+            ))
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default ConditionOperator
diff --git a/app/components/workflow/nodes/if-else/components/condition-list/condition-var-selector.tsx b/app/components/workflow/nodes/if-else/components/condition-list/condition-var-selector.tsx
new file mode 100644
index 0000000..c05e733
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/components/condition-list/condition-var-selector.tsx
@@ -0,0 +1,58 @@
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+import VariableTag from '@/app/components/workflow/nodes/_base/components/variable-tag'
+import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars'
+import type { Node, NodeOutPutVar, ValueSelector, Var, VarType } from '@/app/components/workflow/types'
+
+type ConditionVarSelectorProps = {
+  open: boolean
+  onOpenChange: (open: boolean) => void
+  valueSelector: ValueSelector
+  varType: VarType
+  availableNodes: Node[]
+  nodesOutputVars: NodeOutPutVar[]
+  onChange: (valueSelector: ValueSelector, varItem: Var) => void
+}
+
+const ConditionVarSelector = ({
+  open,
+  onOpenChange,
+  valueSelector,
+  varType,
+  availableNodes,
+  nodesOutputVars,
+  onChange,
+}: ConditionVarSelectorProps) => {
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={onOpenChange}
+      placement='bottom-start'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 0,
+      }}
+    >
+      <PortalToFollowElemTrigger asChild onClick={() => onOpenChange(!open)}>
+        <div className="w-full cursor-pointer">
+          <VariableTag
+            valueSelector={valueSelector}
+            varType={varType}
+            availableNodes={availableNodes}
+            isShort
+          />
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[1000]'>
+        <div className='w-[296px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg'>
+          <VarReferenceVars
+            vars={nodesOutputVars}
+            isSupportFileVar
+            onChange={onChange}
+          />
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default ConditionVarSelector
diff --git a/app/components/workflow/nodes/if-else/components/condition-list/index.tsx b/app/components/workflow/nodes/if-else/components/condition-list/index.tsx
new file mode 100644
index 0000000..9d8c813
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/components/condition-list/index.tsx
@@ -0,0 +1,136 @@
+import { RiLoopLeftLine } from '@remixicon/react'
+import { useCallback, useMemo } from 'react'
+import {
+  type CaseItem,
+  type HandleAddSubVariableCondition,
+  type HandleRemoveCondition,
+  type HandleToggleConditionLogicalOperator,
+  type HandleToggleSubVariableConditionLogicalOperator,
+  type HandleUpdateCondition,
+  type HandleUpdateSubVariableCondition,
+  LogicalOperator,
+  type handleRemoveSubVariableCondition,
+} from '../../types'
+import ConditionItem from './condition-item'
+import type {
+  Node,
+  NodeOutPutVar,
+  Var,
+} from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+
+type ConditionListProps = {
+  isSubVariable?: boolean
+  disabled?: boolean
+  caseId: string
+  conditionId?: string
+  caseItem: CaseItem
+  onRemoveCondition?: HandleRemoveCondition
+  onUpdateCondition?: HandleUpdateCondition
+  onToggleConditionLogicalOperator?: HandleToggleConditionLogicalOperator
+  nodeId: string
+  nodesOutputVars: NodeOutPutVar[]
+  availableNodes: Node[]
+  numberVariables: NodeOutPutVar[]
+  filterVar: (varPayload: Var) => boolean
+  varsIsVarFileAttribute: Record<string, boolean>
+  onAddSubVariableCondition?: HandleAddSubVariableCondition
+  onRemoveSubVariableCondition?: handleRemoveSubVariableCondition
+  onUpdateSubVariableCondition?: HandleUpdateSubVariableCondition
+  onToggleSubVariableConditionLogicalOperator?: HandleToggleSubVariableConditionLogicalOperator
+}
+const ConditionList = ({
+  isSubVariable,
+  disabled,
+  caseId,
+  conditionId,
+  caseItem,
+  onUpdateCondition,
+  onRemoveCondition,
+  onToggleConditionLogicalOperator,
+  onAddSubVariableCondition,
+  onRemoveSubVariableCondition,
+  onUpdateSubVariableCondition,
+  onToggleSubVariableConditionLogicalOperator,
+  nodeId,
+  nodesOutputVars,
+  availableNodes,
+  numberVariables,
+  varsIsVarFileAttribute,
+  filterVar,
+}: ConditionListProps) => {
+  const { conditions, logical_operator } = caseItem
+
+  const doToggleConditionLogicalOperator = useCallback(() => {
+    if (isSubVariable)
+      onToggleSubVariableConditionLogicalOperator?.(caseId!, conditionId!)
+    else
+      onToggleConditionLogicalOperator?.(caseId)
+  }, [caseId, conditionId, isSubVariable, onToggleConditionLogicalOperator, onToggleSubVariableConditionLogicalOperator])
+
+  const isValueFieldShort = useMemo(() => {
+    if (isSubVariable && conditions.length > 1)
+      return true
+
+    return false
+  }, [conditions.length, isSubVariable])
+  const conditionItemClassName = useMemo(() => {
+    if (!isSubVariable)
+      return ''
+    if (conditions.length < 2)
+      return ''
+    return logical_operator === LogicalOperator.and ? 'pl-[51px]' : 'pl-[42px]'
+  }, [conditions.length, isSubVariable, logical_operator])
+
+  return (
+    <div className={cn('relative', !isSubVariable && 'pl-[60px]')}>
+      {
+        conditions.length > 1 && (
+          <div className={cn(
+            'absolute bottom-0 left-0 top-0 w-[60px]',
+            isSubVariable && logical_operator === LogicalOperator.and && 'left-[-10px]',
+            isSubVariable && logical_operator === LogicalOperator.or && 'left-[-18px]',
+          )}>
+            <div className='absolute bottom-4 left-[46px] top-4 w-2.5 rounded-l-[8px] border border-r-0 border-divider-deep'></div>
+            <div className='absolute right-0 top-1/2 h-[29px] w-4 -translate-y-1/2 bg-components-panel-bg'></div>
+            <div
+              className='absolute right-1 top-1/2 flex h-[21px] -translate-y-1/2 cursor-pointer select-none items-center rounded-md border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-1 text-[10px] font-semibold text-text-accent-secondary shadow-xs'
+              onClick={doToggleConditionLogicalOperator}
+            >
+              {logical_operator.toUpperCase()}
+              <RiLoopLeftLine className='ml-0.5 h-3 w-3' />
+            </div>
+          </div>
+        )
+      }
+      {
+        caseItem.conditions.map(condition => (
+          <ConditionItem
+            key={condition.id}
+            className={conditionItemClassName}
+            disabled={disabled}
+            caseId={caseId}
+            conditionId={isSubVariable ? conditionId! : condition.id}
+            condition={condition}
+            isValueFieldShort={isValueFieldShort}
+            onUpdateCondition={onUpdateCondition}
+            onRemoveCondition={onRemoveCondition}
+            onAddSubVariableCondition={onAddSubVariableCondition}
+            onRemoveSubVariableCondition={onRemoveSubVariableCondition}
+            onUpdateSubVariableCondition={onUpdateSubVariableCondition}
+            onToggleSubVariableConditionLogicalOperator={onToggleSubVariableConditionLogicalOperator}
+            nodeId={nodeId}
+            nodesOutputVars={nodesOutputVars}
+            availableNodes={availableNodes}
+            filterVar={filterVar}
+            numberVariables={numberVariables}
+            file={varsIsVarFileAttribute[condition.id] ? { key: (condition.variable_selector || []).slice(-1)[0] } : undefined}
+            isSubVariableKey={isSubVariable}
+          />
+        ))
+      }
+    </div>
+  )
+}
+
+export default ConditionList
diff --git a/app/components/workflow/nodes/if-else/components/condition-number-input.tsx b/app/components/workflow/nodes/if-else/components/condition-number-input.tsx
new file mode 100644
index 0000000..ee13894
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/components/condition-number-input.tsx
@@ -0,0 +1,168 @@
+import {
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine } from '@remixicon/react'
+import { capitalize } from 'lodash-es'
+import { useBoolean } from 'ahooks'
+import { VarType as NumberVarType } from '../../tool/types'
+import VariableTag from '../../_base/components/variable-tag'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Button from '@/app/components/base/button'
+import cn from '@/utils/classnames'
+import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars'
+import type {
+  NodeOutPutVar,
+  ValueSelector,
+} from '@/app/components/workflow/types'
+import { VarType } from '@/app/components/workflow/types'
+import { variableTransformer } from '@/app/components/workflow/utils'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+
+const options = [
+  NumberVarType.variable,
+  NumberVarType.constant,
+]
+
+type ConditionNumberInputProps = {
+  numberVarType?: NumberVarType
+  onNumberVarTypeChange: (v: NumberVarType) => void
+  value: string
+  onValueChange: (v: string) => void
+  variables: NodeOutPutVar[]
+  isShort?: boolean
+  unit?: string
+}
+const ConditionNumberInput = ({
+  numberVarType = NumberVarType.constant,
+  onNumberVarTypeChange,
+  value,
+  onValueChange,
+  variables,
+  isShort,
+  unit,
+}: ConditionNumberInputProps) => {
+  const { t } = useTranslation()
+  const [numberVarTypeVisible, setNumberVarTypeVisible] = useState(false)
+  const [variableSelectorVisible, setVariableSelectorVisible] = useState(false)
+  const [isFocus, {
+    setTrue: setFocus,
+    setFalse: setBlur,
+  }] = useBoolean()
+
+  const handleSelectVariable = useCallback((valueSelector: ValueSelector) => {
+    onValueChange(variableTransformer(valueSelector) as string)
+    setVariableSelectorVisible(false)
+  }, [onValueChange])
+
+  return (
+    <div className='flex cursor-pointer items-center'>
+      <PortalToFollowElem
+        open={numberVarTypeVisible}
+        onOpenChange={setNumberVarTypeVisible}
+        placement='bottom-start'
+        offset={{ mainAxis: 2, crossAxis: 0 }}
+      >
+        <PortalToFollowElemTrigger onClick={() => setNumberVarTypeVisible(v => !v)}>
+          <Button
+            className='shrink-0'
+            variant='ghost'
+            size='small'
+          >
+            {capitalize(numberVarType)}
+            <RiArrowDownSLine className='ml-[1px] h-3.5 w-3.5' />
+          </Button>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[1000]'>
+          <div className='w-[112px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
+            {
+              options.map(option => (
+                <div
+                  key={option}
+                  className={cn(
+                    'flex h-7 cursor-pointer items-center rounded-md px-3 hover:bg-state-base-hover',
+                    'text-[13px] font-medium text-text-secondary',
+                    numberVarType === option && 'bg-state-base-hover',
+                  )}
+                  onClick={() => {
+                    onNumberVarTypeChange(option)
+                    setNumberVarTypeVisible(false)
+                  }}
+                >
+                  {capitalize(option)}
+                </div>
+              ))
+            }
+          </div>
+        </PortalToFollowElemContent>
+      </PortalToFollowElem>
+      <div className='mx-1 h-4 w-[1px] bg-divider-regular'></div>
+      <div className='ml-0.5 w-0 grow'>
+        {
+          numberVarType === NumberVarType.variable && (
+            <PortalToFollowElem
+              open={variableSelectorVisible}
+              onOpenChange={setVariableSelectorVisible}
+              placement='bottom-start'
+              offset={{ mainAxis: 2, crossAxis: 0 }}
+            >
+              <PortalToFollowElemTrigger
+                className='w-full'
+                onClick={() => setVariableSelectorVisible(v => !v)}>
+                {
+                  value && (
+                    <VariableTag
+                      valueSelector={variableTransformer(value) as string[]}
+                      varType={VarType.number}
+                      isShort={isShort}
+                    />
+                  )
+                }
+                {
+                  !value && (
+                    <div className='flex h-6 items-center p-1 text-[13px] text-components-input-text-placeholder'>
+                      <Variable02 className='mr-1 h-4 w-4 shrink-0' />
+                      <div className='w-0 grow truncate'>{t('workflow.nodes.ifElse.selectVariable')}</div>
+                    </div>
+                  )
+                }
+              </PortalToFollowElemTrigger>
+              <PortalToFollowElemContent className='z-[1000]'>
+                <div className={cn('w-[296px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur pt-1 shadow-lg', isShort && 'w-[200px]')}>
+                  <VarReferenceVars
+                    vars={variables}
+                    onChange={handleSelectVariable}
+                  />
+                </div>
+              </PortalToFollowElemContent>
+            </PortalToFollowElem>
+          )
+        }
+        {
+          numberVarType === NumberVarType.constant && (
+            <div className=' relative'>
+              <input
+                className={cn('block w-full appearance-none bg-transparent px-2 text-[13px] text-components-input-text-filled outline-none placeholder:text-components-input-text-placeholder', unit && 'pr-6')}
+                type='number'
+                value={value}
+                onChange={e => onValueChange(e.target.value)}
+                placeholder={t('workflow.nodes.ifElse.enterValue') || ''}
+                onFocus={setFocus}
+                onBlur={setBlur}
+              />
+              {!isFocus && unit && <div className='system-sm-regular absolute right-2 top-[50%] translate-y-[-50%] text-text-tertiary'>{unit}</div>}
+            </div>
+          )
+        }
+      </div>
+    </div>
+  )
+}
+
+export default memo(ConditionNumberInput)
diff --git a/app/components/workflow/nodes/if-else/components/condition-value.tsx b/app/components/workflow/nodes/if-else/components/condition-value.tsx
new file mode 100644
index 0000000..53dac65
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/components/condition-value.tsx
@@ -0,0 +1,108 @@
+import {
+  memo,
+  useMemo,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { useNodes } from 'reactflow'
+import { ComparisonOperator } from '../types'
+import {
+  comparisonOperatorNotRequireValue,
+  isComparisonOperatorNeedTranslate,
+} from '../utils'
+import { FILE_TYPE_OPTIONS, TRANSFER_METHOD } from '../../constants'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import { BubbleX, Env } from '@/app/components/base/icons/src/vender/line/others'
+import cn from '@/utils/classnames'
+import { isConversationVar, isENV, isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+import { isExceptionVariable } from '@/app/components/workflow/utils'
+import type {
+  CommonNodeType,
+  Node,
+} from '@/app/components/workflow/types'
+
+type ConditionValueProps = {
+  variableSelector: string[]
+  labelName?: string
+  operator: ComparisonOperator
+  value: string | string[]
+}
+const ConditionValue = ({
+  variableSelector,
+  labelName,
+  operator,
+  value,
+}: ConditionValueProps) => {
+  const { t } = useTranslation()
+  const nodes = useNodes()
+  const variableName = labelName || (isSystemVar(variableSelector) ? variableSelector.slice(0).join('.') : variableSelector.slice(1).join('.'))
+  const operatorName = isComparisonOperatorNeedTranslate(operator) ? t(`workflow.nodes.ifElse.comparisonOperator.${operator}`) : operator
+  const notHasValue = comparisonOperatorNotRequireValue(operator)
+  const isEnvVar = isENV(variableSelector)
+  const isChatVar = isConversationVar(variableSelector)
+  const node: Node<CommonNodeType> | undefined = nodes.find(n => n.id === variableSelector[0]) as Node<CommonNodeType>
+  const isException = isExceptionVariable(variableName, node?.data.type)
+  const formatValue = useMemo(() => {
+    if (notHasValue)
+      return ''
+
+    if (Array.isArray(value)) // transfer method
+      return value[0]
+
+    return value.replace(/{{#([^#]*)#}}/g, (a, b) => {
+      const arr: string[] = b.split('.')
+      if (isSystemVar(arr))
+        return `{{${b}}}`
+
+      return `{{${arr.slice(1).join('.')}}}`
+    })
+  }, [notHasValue, value])
+
+  const isSelect = operator === ComparisonOperator.in || operator === ComparisonOperator.notIn
+  const selectName = useMemo(() => {
+    if (isSelect) {
+      const name = [...FILE_TYPE_OPTIONS, ...TRANSFER_METHOD].filter(item => item.value === (Array.isArray(value) ? value[0] : value))[0]
+      return name
+        ? t(`workflow.nodes.ifElse.optionName.${name.i18nKey}`).replace(/{{#([^#]*)#}}/g, (a, b) => {
+          const arr: string[] = b.split('.')
+          if (isSystemVar(arr))
+            return `{{${b}}}`
+
+          return `{{${arr.slice(1).join('.')}}}`
+        })
+        : ''
+    }
+    return ''
+  }, [isSelect, t, value])
+
+  return (
+    <div className='flex h-6 items-center rounded-md bg-workflow-block-parma-bg px-1'>
+      {!isEnvVar && !isChatVar && <Variable02 className={cn('mr-1 h-3.5 w-3.5 shrink-0 text-text-accent', isException && 'text-text-warning')} />}
+      {isEnvVar && <Env className='mr-1 h-3.5 w-3.5 shrink-0 text-util-colors-violet-violet-600' />}
+      {isChatVar && <BubbleX className='h-3.5 w-3.5 shrink-0 text-util-colors-teal-teal-700' />}
+
+      <div
+        className={cn(
+          'ml-0.5 shrink-[2] truncate text-xs font-medium text-text-accent',
+          !notHasValue && 'max-w-[70px]',
+          isException && 'text-text-warning',
+        )}
+        title={variableName}
+      >
+        {variableName}
+      </div>
+      <div
+        className='mx-1 shrink-0 text-xs font-medium text-text-primary'
+        title={operatorName}
+      >
+        {operatorName}
+      </div>
+      {
+        !notHasValue && (
+          <div className='shrink-[3] truncate text-xs text-text-secondary' title={formatValue}>{isSelect ? selectName : formatValue}</div>
+        )
+      }
+    </div>
+  )
+}
+
+export default memo(ConditionValue)
diff --git a/app/components/workflow/nodes/if-else/components/condition-wrap.tsx b/app/components/workflow/nodes/if-else/components/condition-wrap.tsx
new file mode 100644
index 0000000..ec6f474
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/components/condition-wrap.tsx
@@ -0,0 +1,226 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { ReactSortable } from 'react-sortablejs'
+import {
+  RiAddLine,
+  RiDeleteBinLine,
+  RiDraggable,
+} from '@remixicon/react'
+import type { CaseItem, HandleAddCondition, HandleAddSubVariableCondition, HandleRemoveCondition, HandleToggleConditionLogicalOperator, HandleToggleSubVariableConditionLogicalOperator, HandleUpdateCondition, HandleUpdateSubVariableCondition, handleRemoveSubVariableCondition } from '../types'
+import type { Node, NodeOutPutVar, Var } from '../../../types'
+import { VarType } from '../../../types'
+import { useGetAvailableVars } from '../../variable-assigner/hooks'
+import { SUB_VARIABLES } from '../../constants'
+import ConditionList from './condition-list'
+import ConditionAdd from './condition-add'
+import cn from '@/utils/classnames'
+import Button from '@/app/components/base/button'
+import { PortalSelect as Select } from '@/app/components/base/select'
+import { noop } from 'lodash-es'
+
+type Props = {
+  isSubVariable?: boolean
+  caseId?: string
+  conditionId?: string
+  cases: CaseItem[]
+  readOnly: boolean
+  handleSortCase?: (sortedCases: (CaseItem & { id: string })[]) => void
+  handleRemoveCase?: (caseId: string) => void
+  handleAddCondition?: HandleAddCondition
+  handleRemoveCondition?: HandleRemoveCondition
+  handleUpdateCondition?: HandleUpdateCondition
+  handleToggleConditionLogicalOperator?: HandleToggleConditionLogicalOperator
+  handleAddSubVariableCondition?: HandleAddSubVariableCondition
+  handleRemoveSubVariableCondition?: handleRemoveSubVariableCondition
+  handleUpdateSubVariableCondition?: HandleUpdateSubVariableCondition
+  handleToggleSubVariableConditionLogicalOperator?: HandleToggleSubVariableConditionLogicalOperator
+  nodeId: string
+  nodesOutputVars: NodeOutPutVar[]
+  availableNodes: Node[]
+  varsIsVarFileAttribute?: Record<string, boolean>
+  filterVar: (varPayload: Var) => boolean
+}
+
+const ConditionWrap: FC<Props> = ({
+  isSubVariable,
+  caseId,
+  conditionId,
+  nodeId: id = '',
+  cases = [],
+  readOnly,
+  handleSortCase = noop,
+  handleRemoveCase,
+  handleUpdateCondition,
+  handleAddCondition,
+  handleRemoveCondition,
+  handleToggleConditionLogicalOperator,
+  handleAddSubVariableCondition,
+  handleRemoveSubVariableCondition,
+  handleUpdateSubVariableCondition,
+  handleToggleSubVariableConditionLogicalOperator,
+  nodesOutputVars = [],
+  availableNodes = [],
+  varsIsVarFileAttribute = {},
+  filterVar = () => true,
+}) => {
+  const { t } = useTranslation()
+
+  const getAvailableVars = useGetAvailableVars()
+
+  const [willDeleteCaseId, setWillDeleteCaseId] = useState('')
+  const casesLength = cases.length
+
+  const filterNumberVar = useCallback((varPayload: Var) => {
+    return varPayload.type === VarType.number
+  }, [])
+
+  const subVarOptions = SUB_VARIABLES.map(item => ({
+    name: item,
+    value: item,
+  }))
+
+  return (
+    <>
+      <ReactSortable
+        list={cases.map(caseItem => ({ ...caseItem, id: caseItem.case_id }))}
+        setList={handleSortCase}
+        handle='.handle'
+        ghostClass='bg-components-panel-bg'
+        animation={150}
+        disabled={readOnly || isSubVariable}
+      >
+        {
+          cases.map((item, index) => (
+            <div key={item.case_id}>
+              <div
+                className={cn(
+                  'group relative rounded-[10px] bg-components-panel-bg',
+                  willDeleteCaseId === item.case_id && 'bg-state-destructive-hover',
+                  !isSubVariable && 'min-h-[40px] px-3 py-1 ',
+                  isSubVariable && 'px-1 py-2',
+                )}
+              >
+                {!isSubVariable && (
+                  <>
+                    <RiDraggable className={cn(
+                      'handle absolute left-1 top-2 hidden h-3 w-3 cursor-pointer text-text-quaternary',
+                      casesLength > 1 && 'group-hover:block',
+                    )} />
+                    <div className={cn(
+                      'absolute left-4 text-[13px] font-semibold leading-4 text-text-secondary',
+                      casesLength === 1 ? 'top-2.5' : 'top-1',
+                    )}>
+                      {
+                        index === 0 ? 'IF' : 'ELIF'
+                      }
+                      {
+                        casesLength > 1 && (
+                          <div className='text-[10px] font-medium text-text-tertiary'>CASE {index + 1}</div>
+                        )
+                      }
+                    </div>
+                  </>
+                )}
+
+                {
+                  !!item.conditions.length && (
+                    <div className='mb-2'>
+                      <ConditionList
+                        disabled={readOnly}
+                        caseItem={item}
+                        caseId={isSubVariable ? caseId! : item.case_id}
+                        conditionId={conditionId}
+                        onUpdateCondition={handleUpdateCondition}
+                        onRemoveCondition={handleRemoveCondition}
+                        onToggleConditionLogicalOperator={handleToggleConditionLogicalOperator}
+                        nodeId={id}
+                        nodesOutputVars={nodesOutputVars}
+                        availableNodes={availableNodes}
+                        filterVar={filterVar}
+                        numberVariables={getAvailableVars(id, '', filterNumberVar)}
+                        varsIsVarFileAttribute={varsIsVarFileAttribute}
+                        onAddSubVariableCondition={handleAddSubVariableCondition}
+                        onRemoveSubVariableCondition={handleRemoveSubVariableCondition}
+                        onUpdateSubVariableCondition={handleUpdateSubVariableCondition}
+                        onToggleSubVariableConditionLogicalOperator={handleToggleSubVariableConditionLogicalOperator}
+                        isSubVariable={isSubVariable}
+                      />
+                    </div>
+                  )
+                }
+
+                <div className={cn(
+                  'flex items-center justify-between pr-[30px]',
+                  !item.conditions.length && !isSubVariable && 'mt-1',
+                  !item.conditions.length && isSubVariable && 'mt-2',
+                  !isSubVariable && ' pl-[60px]',
+                )}>
+                  {isSubVariable
+                    ? (
+                      <Select
+                        popupInnerClassName='w-[165px] max-h-none'
+                        onSelect={value => handleAddSubVariableCondition?.(caseId!, conditionId!, value.value as string)}
+                        items={subVarOptions}
+                        value=''
+                        renderTrigger={() => (
+                          <Button
+                            size='small'
+                            disabled={readOnly}
+                          >
+                            <RiAddLine className='mr-1 h-3.5 w-3.5' />
+                            {t('workflow.nodes.ifElse.addSubVariable')}
+                          </Button>
+                        )}
+                        hideChecked
+                      />
+                    )
+                    : (
+                      <ConditionAdd
+                        disabled={readOnly}
+                        caseId={item.case_id}
+                        variables={getAvailableVars(id, '', filterVar)}
+                        onSelectVariable={handleAddCondition!}
+                      />
+                    )}
+
+                  {
+                    ((index === 0 && casesLength > 1) || (index > 0)) && (
+                      <Button
+                        className='hover:bg-components-button-destructive-ghost-bg-hover hover:text-components-button-destructive-ghost-text'
+                        size='small'
+                        variant='ghost'
+                        disabled={readOnly}
+                        onClick={() => handleRemoveCase?.(item.case_id)}
+                        onMouseEnter={() => setWillDeleteCaseId(item.case_id)}
+                        onMouseLeave={() => setWillDeleteCaseId('')}
+                      >
+                        <RiDeleteBinLine className='mr-1 h-3.5 w-3.5' />
+                        {t('common.operation.remove')}
+                      </Button>
+                    )
+                  }
+                </div>
+              </div>
+              {!isSubVariable && (
+                <div className='mx-3 my-2 h-[1px] bg-divider-subtle'></div>
+              )}
+            </div>
+          ))
+        }
+      </ReactSortable>
+      {(cases.length === 0) && (
+        <Button
+          size='small'
+          disabled={readOnly}
+          onClick={() => handleAddSubVariableCondition?.(caseId!, conditionId!)}
+        >
+          <RiAddLine className='mr-1 h-3.5 w-3.5' />
+          {t('workflow.nodes.ifElse.addSubVariable')}
+        </Button>
+      )}
+    </>
+  )
+}
+export default React.memo(ConditionWrap)
diff --git a/app/components/workflow/nodes/if-else/default.ts b/app/components/workflow/nodes/if-else/default.ts
new file mode 100644
index 0000000..1be8059
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/default.ts
@@ -0,0 +1,80 @@
+import { BlockEnum, type NodeDefault } from '../../types'
+import { type IfElseNodeType, LogicalOperator } from './types'
+import { isEmptyRelatedOperator } from './utils'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+const i18nPrefix = 'workflow.errorMsg'
+
+const nodeDefault: NodeDefault<IfElseNodeType> = {
+  defaultValue: {
+    _targetBranches: [
+      {
+        id: 'true',
+        name: 'IF',
+      },
+      {
+        id: 'false',
+        name: 'ELSE',
+      },
+    ],
+    cases: [
+      {
+        case_id: 'true',
+        logical_operator: LogicalOperator.and,
+        conditions: [],
+      },
+    ],
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: IfElseNodeType, t: any) {
+    let errorMessages = ''
+    const { cases } = payload
+    if (!cases || cases.length === 0)
+      errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: 'IF' })
+
+    cases.forEach((caseItem, index) => {
+      if (!caseItem.conditions.length)
+        errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: index === 0 ? 'IF' : 'ELIF' })
+
+      caseItem.conditions.forEach((condition) => {
+        if (!errorMessages && (!condition.variable_selector || condition.variable_selector.length === 0))
+          errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variable`) })
+        if (!errorMessages && !condition.comparison_operator)
+          errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t('workflow.nodes.ifElse.operator') })
+        if (!errorMessages) {
+          if (condition.sub_variable_condition) {
+            const isSet = condition.sub_variable_condition.conditions.every((c) => {
+              if (!c.comparison_operator)
+                return false
+
+              if (isEmptyRelatedOperator(c.comparison_operator!))
+                return true
+
+              return !!c.value
+            })
+            if (!isSet)
+              errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variableValue`) })
+          }
+          else {
+            if (!isEmptyRelatedOperator(condition.comparison_operator!) && !condition.value)
+              errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variableValue`) })
+          }
+        }
+      })
+    })
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/if-else/node.tsx b/app/components/workflow/nodes/if-else/node.tsx
new file mode 100644
index 0000000..6bc2e5c
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/node.tsx
@@ -0,0 +1,103 @@
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { NodeProps } from 'reactflow'
+import { NodeSourceHandle } from '../_base/components/node-handle'
+import { isEmptyRelatedOperator } from './utils'
+import type { Condition, IfElseNodeType } from './types'
+import ConditionValue from './components/condition-value'
+import ConditionFilesListValue from './components/condition-files-list-value'
+const i18nPrefix = 'workflow.nodes.ifElse'
+
+const IfElseNode: FC<NodeProps<IfElseNodeType>> = (props) => {
+  const { data } = props
+  const { t } = useTranslation()
+  const { cases } = data
+  const casesLength = cases.length
+  const checkIsConditionSet = useCallback((condition: Condition) => {
+    if (!condition.variable_selector || condition.variable_selector.length === 0)
+      return false
+
+    if (condition.sub_variable_condition) {
+      const isSet = condition.sub_variable_condition.conditions.every((c) => {
+        if (!c.comparison_operator)
+          return false
+
+        if (isEmptyRelatedOperator(c.comparison_operator!))
+          return true
+
+        return !!c.value
+      })
+      return isSet
+    }
+    else {
+      if (isEmptyRelatedOperator(condition.comparison_operator!))
+        return true
+
+      return !!condition.value
+    }
+  }, [])
+  const conditionNotSet = (<div className='flex h-6 items-center space-x-1 rounded-md bg-workflow-block-parma-bg px-1 text-xs font-normal text-text-secondary'>
+    {t(`${i18nPrefix}.conditionNotSetup`)}
+  </div>)
+
+  return (
+    <div className='px-3'>
+      {
+        cases.map((caseItem, index) => (
+          <div key={caseItem.case_id}>
+            <div className='relative flex h-6 items-center px-1'>
+              <div className='flex w-full items-center justify-between'>
+                <div className='text-[10px] font-semibold text-text-tertiary'>
+                  {casesLength > 1 && `CASE ${index + 1}`}
+                </div>
+                <div className='text-[12px] font-semibold text-text-secondary'>{index === 0 ? 'IF' : 'ELIF'}</div>
+              </div>
+              <NodeSourceHandle
+                {...props}
+                handleId={caseItem.case_id}
+                handleClassName='!top-1/2 !-right-[21px] !-translate-y-1/2'
+              />
+            </div>
+            <div className='space-y-0.5'>
+              {caseItem.conditions.map((condition, i) => (
+                <div key={condition.id} className='relative'>
+                  {
+                    checkIsConditionSet(condition)
+                      ? (
+                        (!isEmptyRelatedOperator(condition.comparison_operator!) && condition.sub_variable_condition)
+                          ? (
+                            <ConditionFilesListValue condition={condition} />
+                          )
+                          : (
+                            <ConditionValue
+                              variableSelector={condition.variable_selector!}
+                              operator={condition.comparison_operator!}
+                              value={condition.value}
+                            />
+                          )
+
+                      )
+                      : conditionNotSet}
+                  {i !== caseItem.conditions.length - 1 && (
+                    <div className='absolute bottom-[-10px] right-1 z-10 text-[10px] font-medium uppercase leading-4 text-text-accent'>{t(`${i18nPrefix}.${caseItem.logical_operator}`)}</div>
+                  )}
+                </div>
+              ))}
+            </div>
+          </div>
+        ))
+      }
+      <div className='relative flex h-6 items-center px-1'>
+        <div className='w-full text-right text-xs font-semibold text-text-secondary'>ELSE</div>
+        <NodeSourceHandle
+          {...props}
+          handleId='false'
+          handleClassName='!top-1/2 !-right-[21px] !-translate-y-1/2'
+        />
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(IfElseNode)
diff --git a/app/components/workflow/nodes/if-else/panel.tsx b/app/components/workflow/nodes/if-else/panel.tsx
new file mode 100644
index 0000000..c708920
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/panel.tsx
@@ -0,0 +1,87 @@
+import type { FC } from 'react'
+import {
+  memo,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAddLine,
+} from '@remixicon/react'
+import useConfig from './use-config'
+import type { IfElseNodeType } from './types'
+import ConditionWrap from './components/condition-wrap'
+import Button from '@/app/components/base/button'
+import type { NodePanelProps } from '@/app/components/workflow/types'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+
+const i18nPrefix = 'workflow.nodes.ifElse'
+
+const Panel: FC<NodePanelProps<IfElseNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+  const {
+    readOnly,
+    inputs,
+    filterVar,
+    handleAddCase,
+    handleRemoveCase,
+    handleSortCase,
+    handleAddCondition,
+    handleUpdateCondition,
+    handleRemoveCondition,
+    handleToggleConditionLogicalOperator,
+    handleAddSubVariableCondition,
+    handleRemoveSubVariableCondition,
+    handleUpdateSubVariableCondition,
+    handleToggleSubVariableConditionLogicalOperator,
+    nodesOutputVars,
+    availableNodes,
+    varsIsVarFileAttribute,
+  } = useConfig(id, data)
+  const cases = inputs.cases || []
+
+  return (
+    <div className='p-1'>
+      <ConditionWrap
+        nodeId={id}
+        cases={cases}
+        readOnly={readOnly}
+        handleSortCase={handleSortCase}
+        handleRemoveCase={handleRemoveCase}
+        handleAddCondition={handleAddCondition}
+        handleRemoveCondition={handleRemoveCondition}
+        handleUpdateCondition={handleUpdateCondition}
+        handleToggleConditionLogicalOperator={handleToggleConditionLogicalOperator}
+        handleAddSubVariableCondition={handleAddSubVariableCondition}
+        handleRemoveSubVariableCondition={handleRemoveSubVariableCondition}
+        handleUpdateSubVariableCondition={handleUpdateSubVariableCondition}
+        handleToggleSubVariableConditionLogicalOperator={handleToggleSubVariableConditionLogicalOperator}
+        nodesOutputVars={nodesOutputVars}
+        availableNodes={availableNodes}
+        varsIsVarFileAttribute={varsIsVarFileAttribute}
+        filterVar={filterVar}
+      />
+      <div className='px-4 py-2'>
+        <Button
+          className='w-full'
+          variant='tertiary'
+          onClick={() => handleAddCase()}
+          disabled={readOnly}
+        >
+          <RiAddLine className='mr-1 h-4 w-4' />
+          ELIF
+        </Button>
+      </div>
+      <div className='mx-3 my-2 h-[1px] bg-divider-subtle'></div>
+      <Field
+        title={t(`${i18nPrefix}.else`)}
+        className='px-4 py-2'
+      >
+        <div className='text-xs font-normal leading-[18px] text-text-tertiary'>{t(`${i18nPrefix}.elseDescription`)}</div>
+      </Field>
+    </div>
+  )
+}
+
+export default memo(Panel)
diff --git a/app/components/workflow/nodes/if-else/types.ts b/app/components/workflow/nodes/if-else/types.ts
new file mode 100644
index 0000000..0559b94
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/types.ts
@@ -0,0 +1,71 @@
+import type { VarType as NumberVarType } from '../tool/types'
+import type {
+  CommonNodeType,
+  ValueSelector,
+  Var,
+  VarType,
+} from '@/app/components/workflow/types'
+
+export enum LogicalOperator {
+  and = 'and',
+  or = 'or',
+}
+
+export enum ComparisonOperator {
+  contains = 'contains',
+  notContains = 'not contains',
+  startWith = 'start with',
+  endWith = 'end with',
+  is = 'is',
+  isNot = 'is not',
+  empty = 'empty',
+  notEmpty = 'not empty',
+  equal = '=',
+  notEqual = '鈮�',
+  largerThan = '>',
+  lessThan = '<',
+  largerThanOrEqual = '鈮�',
+  lessThanOrEqual = '鈮�',
+  isNull = 'is null',
+  isNotNull = 'is not null',
+  in = 'in',
+  notIn = 'not in',
+  allOf = 'all of',
+  exists = 'exists',
+  notExists = 'not exists',
+}
+
+export type Condition = {
+  id: string
+  varType: VarType
+  variable_selector?: ValueSelector
+  key?: string // sub variable key
+  comparison_operator?: ComparisonOperator
+  value: string | string[]
+  numberVarType?: NumberVarType
+  sub_variable_condition?: CaseItem
+}
+
+export type CaseItem = {
+  case_id: string
+  logical_operator: LogicalOperator
+  conditions: Condition[]
+}
+
+export type IfElseNodeType = CommonNodeType & {
+  logical_operator?: LogicalOperator
+  conditions?: Condition[]
+  cases: CaseItem[]
+  isInIteration: boolean
+  isInLoop: boolean
+}
+
+export type HandleAddCondition = (caseId: string, valueSelector: ValueSelector, varItem: Var) => void
+export type HandleRemoveCondition = (caseId: string, conditionId: string) => void
+export type HandleUpdateCondition = (caseId: string, conditionId: string, newCondition: Condition) => void
+export type HandleToggleConditionLogicalOperator = (caseId: string) => void
+
+export type HandleAddSubVariableCondition = (caseId: string, conditionId: string, key?: string) => void
+export type handleRemoveSubVariableCondition = (caseId: string, conditionId: string, subConditionId: string) => void
+export type HandleUpdateSubVariableCondition = (caseId: string, conditionId: string, subConditionId: string, newSubCondition: Condition) => void
+export type HandleToggleSubVariableConditionLogicalOperator = (caseId: string, conditionId: string) => void
diff --git a/app/components/workflow/nodes/if-else/use-config.ts b/app/components/workflow/nodes/if-else/use-config.ts
new file mode 100644
index 0000000..276d017
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/use-config.ts
@@ -0,0 +1,278 @@
+import { useCallback, useMemo } from 'react'
+import produce from 'immer'
+import { v4 as uuid4 } from 'uuid'
+import { useUpdateNodeInternals } from 'reactflow'
+import type {
+  Var,
+} from '../../types'
+import { VarType } from '../../types'
+import { LogicalOperator } from './types'
+import type {
+  CaseItem,
+  HandleAddCondition,
+  HandleAddSubVariableCondition,
+  HandleRemoveCondition,
+  HandleToggleConditionLogicalOperator,
+  HandleToggleSubVariableConditionLogicalOperator,
+  HandleUpdateCondition,
+  HandleUpdateSubVariableCondition,
+  IfElseNodeType,
+} from './types'
+import {
+  branchNameCorrect,
+  getOperators,
+} from './utils'
+import useIsVarFileAttribute from './use-is-var-file-attribute'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import {
+  useEdgesInteractions,
+  useNodesReadOnly,
+} from '@/app/components/workflow/hooks'
+import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
+
+const useConfig = (id: string, payload: IfElseNodeType) => {
+  const updateNodeInternals = useUpdateNodeInternals()
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const { handleEdgeDeleteByDeleteBranch } = useEdgesInteractions()
+  const { inputs, setInputs } = useNodeCrud<IfElseNodeType>(id, payload)
+
+  const filterVar = useCallback(() => {
+    return true
+  }, [])
+
+  const {
+    availableVars,
+    availableNodesWithParent,
+  } = useAvailableVarList(id, {
+    onlyLeafNodeVar: false,
+    filterVar,
+  })
+
+  const filterNumberVar = useCallback((varPayload: Var) => {
+    return varPayload.type === VarType.number
+  }, [])
+
+  const {
+    getIsVarFileAttribute,
+  } = useIsVarFileAttribute({
+    nodeId: id,
+    isInIteration: payload.isInIteration,
+    isInLoop: payload.isInLoop,
+  })
+
+  const varsIsVarFileAttribute = useMemo(() => {
+    const conditions: Record<string, boolean> = {}
+    inputs.cases?.forEach((c) => {
+      c.conditions.forEach((condition) => {
+        conditions[condition.id] = getIsVarFileAttribute(condition.variable_selector!)
+      })
+    })
+    return conditions
+  }, [inputs.cases, getIsVarFileAttribute])
+
+  const {
+    availableVars: availableNumberVars,
+    availableNodesWithParent: availableNumberNodesWithParent,
+  } = useAvailableVarList(id, {
+    onlyLeafNodeVar: false,
+    filterVar: filterNumberVar,
+  })
+
+  const handleAddCase = useCallback(() => {
+    const newInputs = produce(inputs, (draft) => {
+      if (draft.cases) {
+        const case_id = uuid4()
+        draft.cases.push({
+          case_id,
+          logical_operator: LogicalOperator.and,
+          conditions: [],
+        })
+        if (draft._targetBranches) {
+          const elseCaseIndex = draft._targetBranches.findIndex(branch => branch.id === 'false')
+          if (elseCaseIndex > -1) {
+            draft._targetBranches = branchNameCorrect([
+              ...draft._targetBranches.slice(0, elseCaseIndex),
+              {
+                id: case_id,
+                name: '',
+              },
+              ...draft._targetBranches.slice(elseCaseIndex),
+            ])
+          }
+        }
+      }
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleRemoveCase = useCallback((caseId: string) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.cases = draft.cases?.filter(item => item.case_id !== caseId)
+
+      if (draft._targetBranches)
+        draft._targetBranches = branchNameCorrect(draft._targetBranches.filter(branch => branch.id !== caseId))
+
+      handleEdgeDeleteByDeleteBranch(id, caseId)
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs, id, handleEdgeDeleteByDeleteBranch])
+
+  const handleSortCase = useCallback((newCases: (CaseItem & { id: string })[]) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.cases = newCases.filter(Boolean).map(item => ({
+        id: item.id,
+        case_id: item.case_id,
+        logical_operator: item.logical_operator,
+        conditions: item.conditions,
+      }))
+
+      draft._targetBranches = branchNameCorrect([
+        ...newCases.filter(Boolean).map(item => ({ id: item.case_id, name: '' })),
+        { id: 'false', name: '' },
+      ])
+    })
+    setInputs(newInputs)
+    updateNodeInternals(id)
+  }, [id, inputs, setInputs, updateNodeInternals])
+
+  const handleAddCondition = useCallback<HandleAddCondition>((caseId, valueSelector, varItem) => {
+    const newInputs = produce(inputs, (draft) => {
+      const targetCase = draft.cases?.find(item => item.case_id === caseId)
+      if (targetCase) {
+        targetCase.conditions.push({
+          id: uuid4(),
+          varType: varItem.type,
+          variable_selector: valueSelector,
+          comparison_operator: getOperators(varItem.type, getIsVarFileAttribute(valueSelector) ? { key: valueSelector.slice(-1)[0] } : undefined)[0],
+          value: '',
+        })
+      }
+    })
+    setInputs(newInputs)
+  }, [getIsVarFileAttribute, inputs, setInputs])
+
+  const handleRemoveCondition = useCallback<HandleRemoveCondition>((caseId, conditionId) => {
+    const newInputs = produce(inputs, (draft) => {
+      const targetCase = draft.cases?.find(item => item.case_id === caseId)
+      if (targetCase)
+        targetCase.conditions = targetCase.conditions.filter(item => item.id !== conditionId)
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleUpdateCondition = useCallback<HandleUpdateCondition>((caseId, conditionId, newCondition) => {
+    const newInputs = produce(inputs, (draft) => {
+      const targetCase = draft.cases?.find(item => item.case_id === caseId)
+      if (targetCase) {
+        const targetCondition = targetCase.conditions.find(item => item.id === conditionId)
+        if (targetCondition)
+          Object.assign(targetCondition, newCondition)
+      }
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleToggleConditionLogicalOperator = useCallback<HandleToggleConditionLogicalOperator>((caseId) => {
+    const newInputs = produce(inputs, (draft) => {
+      const targetCase = draft.cases?.find(item => item.case_id === caseId)
+      if (targetCase)
+        targetCase.logical_operator = targetCase.logical_operator === LogicalOperator.and ? LogicalOperator.or : LogicalOperator.and
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleAddSubVariableCondition = useCallback<HandleAddSubVariableCondition>((caseId: string, conditionId: string, key?: string) => {
+    const newInputs = produce(inputs, (draft) => {
+      const condition = draft.cases?.find(item => item.case_id === caseId)?.conditions.find(item => item.id === conditionId)
+      if (!condition)
+        return
+      if (!condition?.sub_variable_condition) {
+        condition.sub_variable_condition = {
+          case_id: uuid4(),
+          logical_operator: LogicalOperator.and,
+          conditions: [],
+        }
+      }
+      const subVarCondition = condition.sub_variable_condition
+      if (subVarCondition) {
+        if (!subVarCondition.conditions)
+          subVarCondition.conditions = []
+
+        subVarCondition.conditions.push({
+          id: uuid4(),
+          key: key || '',
+          varType: VarType.string,
+          comparison_operator: undefined,
+          value: '',
+        })
+      }
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleRemoveSubVariableCondition = useCallback((caseId: string, conditionId: string, subConditionId: string) => {
+    const newInputs = produce(inputs, (draft) => {
+      const condition = draft.cases?.find(item => item.case_id === caseId)?.conditions.find(item => item.id === conditionId)
+      if (!condition)
+        return
+      if (!condition?.sub_variable_condition)
+        return
+      const subVarCondition = condition.sub_variable_condition
+      if (subVarCondition)
+        subVarCondition.conditions = subVarCondition.conditions.filter(item => item.id !== subConditionId)
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleUpdateSubVariableCondition = useCallback<HandleUpdateSubVariableCondition>((caseId, conditionId, subConditionId, newSubCondition) => {
+    const newInputs = produce(inputs, (draft) => {
+      const targetCase = draft.cases?.find(item => item.case_id === caseId)
+      if (targetCase) {
+        const targetCondition = targetCase.conditions.find(item => item.id === conditionId)
+        if (targetCondition && targetCondition.sub_variable_condition) {
+          const targetSubCondition = targetCondition.sub_variable_condition.conditions.find(item => item.id === subConditionId)
+          if (targetSubCondition)
+            Object.assign(targetSubCondition, newSubCondition)
+        }
+      }
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleToggleSubVariableConditionLogicalOperator = useCallback<HandleToggleSubVariableConditionLogicalOperator>((caseId, conditionId) => {
+    const newInputs = produce(inputs, (draft) => {
+      const targetCase = draft.cases?.find(item => item.case_id === caseId)
+      if (targetCase) {
+        const targetCondition = targetCase.conditions.find(item => item.id === conditionId)
+        if (targetCondition && targetCondition.sub_variable_condition)
+          targetCondition.sub_variable_condition.logical_operator = targetCondition.sub_variable_condition.logical_operator === LogicalOperator.and ? LogicalOperator.or : LogicalOperator.and
+      }
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  return {
+    readOnly,
+    inputs,
+    filterVar,
+    filterNumberVar,
+    handleAddCase,
+    handleRemoveCase,
+    handleSortCase,
+    handleAddCondition,
+    handleRemoveCondition,
+    handleUpdateCondition,
+    handleToggleConditionLogicalOperator,
+    handleAddSubVariableCondition,
+    handleUpdateSubVariableCondition,
+    handleRemoveSubVariableCondition,
+    handleToggleSubVariableConditionLogicalOperator,
+    nodesOutputVars: availableVars,
+    availableNodes: availableNodesWithParent,
+    nodesOutputNumberVars: availableNumberVars,
+    availableNumberNodes: availableNumberNodesWithParent,
+    varsIsVarFileAttribute,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/if-else/use-is-var-file-attribute.ts b/app/components/workflow/nodes/if-else/use-is-var-file-attribute.ts
new file mode 100644
index 0000000..c0cf8cf
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/use-is-var-file-attribute.ts
@@ -0,0 +1,48 @@
+import { useStoreApi } from 'reactflow'
+import { useMemo } from 'react'
+import { useIsChatMode, useWorkflow, useWorkflowVariables } from '../../hooks'
+import type { ValueSelector } from '../../types'
+import { VarType } from '../../types'
+
+type Params = {
+  nodeId: string
+  isInIteration: boolean
+  isInLoop: boolean
+}
+const useIsVarFileAttribute = ({
+  nodeId,
+  isInIteration,
+  isInLoop,
+}: Params) => {
+  const isChatMode = useIsChatMode()
+  const store = useStoreApi()
+  const { getBeforeNodesInSameBranch } = useWorkflow()
+  const {
+    getNodes,
+  } = store.getState()
+  const currentNode = getNodes().find(n => n.id === nodeId)
+  const iterationNode = isInIteration ? getNodes().find(n => n.id === currentNode!.parentId) : null
+  const loopNode = isInLoop ? getNodes().find(n => n.id === currentNode!.parentId) : null
+  const availableNodes = useMemo(() => {
+    return getBeforeNodesInSameBranch(nodeId)
+  }, [getBeforeNodesInSameBranch, nodeId])
+  const { getCurrentVariableType } = useWorkflowVariables()
+  const getIsVarFileAttribute = (variable: ValueSelector) => {
+    if (variable.length !== 3)
+      return false
+    const parentVariable = variable.slice(0, 2)
+    const varType = getCurrentVariableType({
+      parentNode: isInIteration ? iterationNode : loopNode,
+      valueSelector: parentVariable,
+      availableNodes,
+      isChatMode,
+      isConstant: false,
+    })
+    return varType === VarType.file
+  }
+  return {
+    getIsVarFileAttribute,
+  }
+}
+
+export default useIsVarFileAttribute
diff --git a/app/components/workflow/nodes/if-else/utils.ts b/app/components/workflow/nodes/if-else/utils.ts
new file mode 100644
index 0000000..de01498
--- /dev/null
+++ b/app/components/workflow/nodes/if-else/utils.ts
@@ -0,0 +1,174 @@
+import { ComparisonOperator } from './types'
+import { VarType } from '@/app/components/workflow/types'
+import type { Branch } from '@/app/components/workflow/types'
+
+export const isEmptyRelatedOperator = (operator: ComparisonOperator) => {
+  return [ComparisonOperator.empty, ComparisonOperator.notEmpty, ComparisonOperator.isNull, ComparisonOperator.isNotNull, ComparisonOperator.exists, ComparisonOperator.notExists].includes(operator)
+}
+
+const notTranslateKey = [
+  ComparisonOperator.equal, ComparisonOperator.notEqual,
+  ComparisonOperator.largerThan, ComparisonOperator.largerThanOrEqual,
+  ComparisonOperator.lessThan, ComparisonOperator.lessThanOrEqual,
+]
+
+export const isComparisonOperatorNeedTranslate = (operator?: ComparisonOperator) => {
+  if (!operator)
+    return false
+  return !notTranslateKey.includes(operator)
+}
+
+export const getOperators = (type?: VarType, file?: { key: string }) => {
+  const isFile = !!file
+  if (isFile) {
+    const { key } = file
+
+    switch (key) {
+      case 'name':
+        return [
+          ComparisonOperator.contains,
+          ComparisonOperator.notContains,
+          ComparisonOperator.startWith,
+          ComparisonOperator.endWith,
+          ComparisonOperator.is,
+          ComparisonOperator.isNot,
+          ComparisonOperator.empty,
+          ComparisonOperator.notEmpty,
+        ]
+      case 'type':
+        return [
+          ComparisonOperator.in,
+          ComparisonOperator.notIn,
+        ]
+      case 'size':
+        return [
+          ComparisonOperator.largerThan,
+          ComparisonOperator.largerThanOrEqual,
+          ComparisonOperator.lessThan,
+          ComparisonOperator.lessThanOrEqual,
+        ]
+      case 'extension':
+        return [
+          ComparisonOperator.is,
+          ComparisonOperator.isNot,
+          ComparisonOperator.contains,
+          ComparisonOperator.notContains,
+        ]
+      case 'mime_type':
+        return [
+          ComparisonOperator.contains,
+          ComparisonOperator.notContains,
+          ComparisonOperator.startWith,
+          ComparisonOperator.endWith,
+          ComparisonOperator.is,
+          ComparisonOperator.isNot,
+          ComparisonOperator.empty,
+          ComparisonOperator.notEmpty,
+        ]
+      case 'transfer_method':
+        return [
+          ComparisonOperator.in,
+          ComparisonOperator.notIn,
+        ]
+      case 'url':
+        return [
+          ComparisonOperator.contains,
+          ComparisonOperator.notContains,
+          ComparisonOperator.startWith,
+          ComparisonOperator.endWith,
+          ComparisonOperator.is,
+          ComparisonOperator.isNot,
+          ComparisonOperator.empty,
+          ComparisonOperator.notEmpty,
+        ]
+    }
+    return []
+  }
+  switch (type) {
+    case VarType.string:
+      return [
+        ComparisonOperator.contains,
+        ComparisonOperator.notContains,
+        ComparisonOperator.startWith,
+        ComparisonOperator.endWith,
+        ComparisonOperator.is,
+        ComparisonOperator.isNot,
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+    case VarType.number:
+      return [
+        ComparisonOperator.equal,
+        ComparisonOperator.notEqual,
+        ComparisonOperator.largerThan,
+        ComparisonOperator.lessThan,
+        ComparisonOperator.largerThanOrEqual,
+        ComparisonOperator.lessThanOrEqual,
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+    case VarType.file:
+      return [
+        ComparisonOperator.exists,
+        ComparisonOperator.notExists,
+      ]
+    case VarType.arrayString:
+    case VarType.arrayNumber:
+      return [
+        ComparisonOperator.contains,
+        ComparisonOperator.notContains,
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+    case VarType.array:
+    case VarType.arrayObject:
+      return [
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+    case VarType.arrayFile:
+      return [
+        ComparisonOperator.contains,
+        ComparisonOperator.notContains,
+        ComparisonOperator.allOf,
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+    default:
+      return [
+        ComparisonOperator.is,
+        ComparisonOperator.isNot,
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+  }
+}
+
+export const comparisonOperatorNotRequireValue = (operator?: ComparisonOperator) => {
+  if (!operator)
+    return false
+
+  return [ComparisonOperator.empty, ComparisonOperator.notEmpty, ComparisonOperator.isNull, ComparisonOperator.isNotNull, ComparisonOperator.exists, ComparisonOperator.notExists].includes(operator)
+}
+
+export const branchNameCorrect = (branches: Branch[]) => {
+  const branchLength = branches.length
+  if (branchLength < 2)
+    throw new Error('if-else node branch number must than 2')
+
+  if (branchLength === 2) {
+    return branches.map((branch) => {
+      return {
+        ...branch,
+        name: branch.id === 'false' ? 'ELSE' : 'IF',
+      }
+    })
+  }
+
+  return branches.map((branch, index) => {
+    return {
+      ...branch,
+      name: branch.id === 'false' ? 'ELSE' : `CASE ${index + 1}`,
+    }
+  })
+}
diff --git a/app/components/workflow/nodes/index.tsx b/app/components/workflow/nodes/index.tsx
new file mode 100644
index 0000000..bebc140
--- /dev/null
+++ b/app/components/workflow/nodes/index.tsx
@@ -0,0 +1,52 @@
+import {
+  memo,
+  useMemo,
+} from 'react'
+import type { NodeProps } from 'reactflow'
+import type { Node } from '../types'
+import { CUSTOM_NODE } from '../constants'
+import {
+  NodeComponentMap,
+  PanelComponentMap,
+} from './constants'
+import BaseNode from './_base/node'
+import BasePanel from './_base/panel'
+
+const CustomNode = (props: NodeProps) => {
+  const nodeData = props.data
+  const NodeComponent = NodeComponentMap[nodeData.type]
+
+  return (
+    <>
+      <BaseNode { ...props }>
+        <NodeComponent />
+      </BaseNode>
+    </>
+  )
+}
+CustomNode.displayName = 'CustomNode'
+
+export const Panel = memo((props: Node) => {
+  const nodeClass = props.type
+  const nodeData = props.data
+  const PanelComponent = useMemo(() => {
+    if (nodeClass === CUSTOM_NODE)
+      return PanelComponentMap[nodeData.type]
+
+    return () => null
+  }, [nodeClass, nodeData.type])
+
+  if (nodeClass === CUSTOM_NODE) {
+    return (
+      <BasePanel key={props.id} {...props}>
+        <PanelComponent />
+      </BasePanel>
+    )
+  }
+
+  return null
+})
+
+Panel.displayName = 'Panel'
+
+export default memo(CustomNode)
diff --git a/app/components/workflow/nodes/iteration-start/constants.ts b/app/components/workflow/nodes/iteration-start/constants.ts
new file mode 100644
index 0000000..94e3ccb
--- /dev/null
+++ b/app/components/workflow/nodes/iteration-start/constants.ts
@@ -0,0 +1 @@
+export const CUSTOM_ITERATION_START_NODE = 'custom-iteration-start'
diff --git a/app/components/workflow/nodes/iteration-start/default.ts b/app/components/workflow/nodes/iteration-start/default.ts
new file mode 100644
index 0000000..c93b472
--- /dev/null
+++ b/app/components/workflow/nodes/iteration-start/default.ts
@@ -0,0 +1,21 @@
+import type { NodeDefault } from '../../types'
+import type { IterationStartNodeType } from './types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+
+const nodeDefault: NodeDefault<IterationStartNodeType> = {
+  defaultValue: {},
+  getAvailablePrevNodes() {
+    return []
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid() {
+    return {
+      isValid: true,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/iteration-start/index.tsx b/app/components/workflow/nodes/iteration-start/index.tsx
new file mode 100644
index 0000000..6f880c9
--- /dev/null
+++ b/app/components/workflow/nodes/iteration-start/index.tsx
@@ -0,0 +1,42 @@
+import { memo } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { NodeProps } from 'reactflow'
+import { RiHome5Fill } from '@remixicon/react'
+import Tooltip from '@/app/components/base/tooltip'
+import { NodeSourceHandle } from '@/app/components/workflow/nodes/_base/components/node-handle'
+
+const IterationStartNode = ({ id, data }: NodeProps) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='nodrag group mt-1 flex h-11 w-11 items-center justify-center rounded-2xl border border-workflow-block-border bg-workflow-block-bg shadow-xs'>
+      <Tooltip popupContent={t('workflow.blocks.iteration-start')} asChild={false}>
+        <div className='flex h-6 w-6 items-center justify-center rounded-full border-[0.5px] border-components-panel-border-subtle bg-util-colors-blue-brand-blue-brand-500'>
+          <RiHome5Fill className='h-3 w-3 text-text-primary-on-surface' />
+        </div>
+      </Tooltip>
+      <NodeSourceHandle
+        id={id}
+        data={data}
+        handleClassName='!top-1/2 !-right-[9px] !-translate-y-1/2'
+        handleId='source'
+      />
+    </div>
+  )
+}
+
+export const IterationStartNodeDumb = () => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='nodrag relative left-[17px] top-[21px] z-[11] flex h-11 w-11 items-center justify-center rounded-2xl border border-workflow-block-border bg-workflow-block-bg'>
+      <Tooltip popupContent={t('workflow.blocks.iteration-start')} asChild={false}>
+        <div className='flex h-6 w-6 items-center justify-center rounded-full border-[0.5px] border-components-panel-border-subtle bg-util-colors-blue-brand-blue-brand-500'>
+          <RiHome5Fill className='h-3 w-3 text-text-primary-on-surface' />
+        </div>
+      </Tooltip>
+    </div>
+  )
+}
+
+export default memo(IterationStartNode)
diff --git a/app/components/workflow/nodes/iteration-start/types.ts b/app/components/workflow/nodes/iteration-start/types.ts
new file mode 100644
index 0000000..319cce0
--- /dev/null
+++ b/app/components/workflow/nodes/iteration-start/types.ts
@@ -0,0 +1,3 @@
+import type { CommonNodeType } from '@/app/components/workflow/types'
+
+export type IterationStartNodeType = CommonNodeType
diff --git a/app/components/workflow/nodes/iteration/add-block.tsx b/app/components/workflow/nodes/iteration/add-block.tsx
new file mode 100644
index 0000000..10aa8bb
--- /dev/null
+++ b/app/components/workflow/nodes/iteration/add-block.tsx
@@ -0,0 +1,79 @@
+import {
+  memo,
+  useCallback,
+} from 'react'
+import {
+  RiAddLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import {
+  useAvailableBlocks,
+  useNodesInteractions,
+  useNodesReadOnly,
+} from '../../hooks'
+import type { IterationNodeType } from './types'
+import cn from '@/utils/classnames'
+import BlockSelector from '@/app/components/workflow/block-selector'
+import type {
+  OnSelectBlock,
+} from '@/app/components/workflow/types'
+import {
+  BlockEnum,
+} from '@/app/components/workflow/types'
+
+type AddBlockProps = {
+  iterationNodeId: string
+  iterationNodeData: IterationNodeType
+}
+const AddBlock = ({
+  iterationNodeData,
+}: AddBlockProps) => {
+  const { t } = useTranslation()
+  const { nodesReadOnly } = useNodesReadOnly()
+  const { handleNodeAdd } = useNodesInteractions()
+  const { availableNextBlocks } = useAvailableBlocks(BlockEnum.Start, true)
+
+  const handleSelect = useCallback<OnSelectBlock>((type, toolDefaultValue) => {
+    handleNodeAdd(
+      {
+        nodeType: type,
+        toolDefaultValue,
+      },
+      {
+        prevNodeId: iterationNodeData.start_node_id,
+        prevNodeSourceHandle: 'source',
+      },
+    )
+  }, [handleNodeAdd, iterationNodeData.start_node_id])
+
+  const renderTriggerElement = useCallback((open: boolean) => {
+    return (
+      <div className={cn(
+        'system-sm-medium relative inline-flex h-8 cursor-pointer items-center rounded-lg border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-3 text-components-button-secondary-text shadow-xs backdrop-blur-[5px] hover:bg-components-button-secondary-bg-hover',
+        `${nodesReadOnly && '!cursor-not-allowed bg-components-button-secondary-bg-disabled'}`,
+        open && 'bg-components-button-secondary-bg-hover',
+      )}>
+        <RiAddLine className='mr-1 h-4 w-4' />
+        {t('workflow.common.addBlock')}
+      </div>
+    )
+  }, [nodesReadOnly, t])
+
+  return (
+    <div className='absolute left-14 top-7 z-10 flex h-8 items-center'>
+      <div className='group/insert relative h-0.5 w-16 bg-gray-300'>
+        <div className='absolute right-0 top-1/2 h-2 w-0.5 -translate-y-1/2 bg-primary-500'></div>
+      </div>
+      <BlockSelector
+        disabled={nodesReadOnly}
+        onSelect={handleSelect}
+        trigger={renderTriggerElement}
+        triggerInnerClassName='inline-flex'
+        popupClassName='!min-w-[256px]'
+        availableBlocksTypes={availableNextBlocks}
+      />
+    </div>
+  )
+}
+
+export default memo(AddBlock)
diff --git a/app/components/workflow/nodes/iteration/default.ts b/app/components/workflow/nodes/iteration/default.ts
new file mode 100644
index 0000000..0ef8382
--- /dev/null
+++ b/app/components/workflow/nodes/iteration/default.ts
@@ -0,0 +1,63 @@
+import { BlockEnum, ErrorHandleMode } from '../../types'
+import type { NodeDefault } from '../../types'
+import type { IterationNodeType } from './types'
+import {
+  ALL_CHAT_AVAILABLE_BLOCKS,
+  ALL_COMPLETION_AVAILABLE_BLOCKS,
+} from '@/app/components/workflow/blocks'
+const i18nPrefix = 'workflow'
+
+const nodeDefault: NodeDefault<IterationNodeType> = {
+  defaultValue: {
+    start_node_id: '',
+    iterator_selector: [],
+    output_selector: [],
+    _children: [],
+    _isShowTips: false,
+    is_parallel: false,
+    parallel_nums: 10,
+    error_handle_mode: ErrorHandleMode.Terminated,
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(
+        type => type !== BlockEnum.End,
+      )
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: IterationNodeType, t: any) {
+    let errorMessages = ''
+
+    if (
+      !errorMessages
+      && (!payload.iterator_selector || payload.iterator_selector.length === 0)
+    ) {
+      errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, {
+        field: t(`${i18nPrefix}.nodes.iteration.input`),
+      })
+    }
+
+    if (
+      !errorMessages
+      && (!payload.output_selector || payload.output_selector.length === 0)
+    ) {
+      errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, {
+        field: t(`${i18nPrefix}.nodes.iteration.output`),
+      })
+    }
+
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/iteration/node.tsx b/app/components/workflow/nodes/iteration/node.tsx
new file mode 100644
index 0000000..0232c87
--- /dev/null
+++ b/app/components/workflow/nodes/iteration/node.tsx
@@ -0,0 +1,72 @@
+import type { FC } from 'react'
+import {
+  memo,
+  useEffect,
+} from 'react'
+import {
+  Background,
+  useNodesInitialized,
+  useViewport,
+} from 'reactflow'
+import { useTranslation } from 'react-i18next'
+import { IterationStartNodeDumb } from '../iteration-start'
+import { useNodeIterationInteractions } from './use-interactions'
+import type { IterationNodeType } from './types'
+import AddBlock from './add-block'
+import cn from '@/utils/classnames'
+import type { NodeProps } from '@/app/components/workflow/types'
+import Toast from '@/app/components/base/toast'
+
+const i18nPrefix = 'workflow.nodes.iteration'
+
+const Node: FC<NodeProps<IterationNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { zoom } = useViewport()
+  const nodesInitialized = useNodesInitialized()
+  const { handleNodeIterationRerender } = useNodeIterationInteractions()
+  const { t } = useTranslation()
+
+  useEffect(() => {
+    if (nodesInitialized)
+      handleNodeIterationRerender(id)
+    if (data.is_parallel && data._isShowTips) {
+      Toast.notify({
+        type: 'warning',
+        message: t(`${i18nPrefix}.answerNodeWarningDesc`),
+        duration: 5000,
+      })
+      data._isShowTips = false
+    }
+  }, [nodesInitialized, id, handleNodeIterationRerender, data, t])
+
+  return (
+    <div className={cn(
+      'relative h-full min-h-[90px] w-full min-w-[240px] rounded-2xl bg-workflow-canvas-workflow-bg',
+    )}>
+      <Background
+        id={`iteration-background-${id}`}
+        className='!z-0 rounded-2xl'
+        gap={[14 / zoom, 14 / zoom]}
+        size={2 / zoom}
+        color='var(--color-workflow-canvas-workflow-dot-color)'
+      />
+      {
+        data._isCandidate && (
+          <IterationStartNodeDumb />
+        )
+      }
+      {
+        data._children!.length === 1 && (
+          <AddBlock
+            iterationNodeId={id}
+            iterationNodeData={data}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default memo(Node)
diff --git a/app/components/workflow/nodes/iteration/panel.tsx b/app/components/workflow/nodes/iteration/panel.tsx
new file mode 100644
index 0000000..1f29a07
--- /dev/null
+++ b/app/components/workflow/nodes/iteration/panel.tsx
@@ -0,0 +1,176 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import VarReferencePicker from '../_base/components/variable/var-reference-picker'
+import Split from '../_base/components/split'
+import ResultPanel from '../../run/result-panel'
+import { MAX_ITERATION_PARALLEL_NUM, MIN_ITERATION_PARALLEL_NUM } from '../../constants'
+import type { IterationNodeType } from './types'
+import useConfig from './use-config'
+import { ErrorHandleMode, InputVarType, type NodePanelProps } from '@/app/components/workflow/types'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
+import Switch from '@/app/components/base/switch'
+import Select from '@/app/components/base/select'
+import Slider from '@/app/components/base/slider'
+import Input from '@/app/components/base/input'
+import formatTracing from '@/app/components/workflow/run/utils/format-log'
+
+import { useLogs } from '@/app/components/workflow/run/hooks'
+
+const i18nPrefix = 'workflow.nodes.iteration'
+
+const Panel: FC<NodePanelProps<IterationNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+  const responseMethod = [
+    {
+      value: ErrorHandleMode.Terminated,
+      name: t(`${i18nPrefix}.ErrorMethod.operationTerminated`),
+    },
+    {
+      value: ErrorHandleMode.ContinueOnError,
+      name: t(`${i18nPrefix}.ErrorMethod.continueOnError`),
+    },
+    {
+      value: ErrorHandleMode.RemoveAbnormalOutput,
+      name: t(`${i18nPrefix}.ErrorMethod.removeAbnormalOutput`),
+    },
+  ]
+  const {
+    readOnly,
+    inputs,
+    filterInputVar,
+    handleInputChange,
+    childrenNodeVars,
+    iterationChildrenNodes,
+    handleOutputVarChange,
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runResult,
+    inputVarValues,
+    setInputVarValues,
+    usedOutVars,
+    iterator,
+    setIterator,
+    iteratorInputKey,
+    iterationRunResult,
+    changeParallel,
+    changeErrorResponseMode,
+    changeParallelNums,
+  } = useConfig(id, data)
+
+  const nodeInfo = formatTracing(iterationRunResult, t)[0]
+  const logsParams = useLogs()
+
+  return (
+    <div className='pb-2 pt-2'>
+      <div className='space-y-4 px-4 pb-4'>
+        <Field
+          title={t(`${i18nPrefix}.input`)}
+          required
+          operations={(
+            <div className='system-2xs-medium-uppercase flex h-[18px] items-center rounded-[5px] border border-divider-deep px-1 capitalize text-text-tertiary'>Array</div>
+          )}
+        >
+          <VarReferencePicker
+            readonly={readOnly}
+            nodeId={id}
+            isShowNodeName
+            value={inputs.iterator_selector || []}
+            onChange={handleInputChange}
+            filterVar={filterInputVar}
+          />
+        </Field>
+      </div>
+      <Split />
+      <div className='mt-2 space-y-4 px-4 pb-4'>
+        <Field
+          title={t(`${i18nPrefix}.output`)}
+          required
+          operations={(
+            <div className='system-2xs-medium-uppercase flex h-[18px] items-center rounded-[5px] border border-divider-deep px-1 capitalize text-text-tertiary'>Array</div>
+          )}
+        >
+          <VarReferencePicker
+            readonly={readOnly}
+            nodeId={id}
+            isShowNodeName
+            value={inputs.output_selector || []}
+            onChange={handleOutputVarChange}
+            availableNodes={iterationChildrenNodes}
+            availableVars={childrenNodeVars}
+          />
+        </Field>
+      </div>
+      <div className='px-4 pb-2'>
+        <Field title={t(`${i18nPrefix}.parallelMode`)} tooltip={<div className='w-[230px]'>{t(`${i18nPrefix}.parallelPanelDesc`)}</div>} inline>
+          <Switch defaultValue={inputs.is_parallel} onChange={changeParallel} />
+        </Field>
+      </div>
+      {
+        inputs.is_parallel && (<div className='px-4 pb-2'>
+          <Field title={t(`${i18nPrefix}.MaxParallelismTitle`)} isSubTitle tooltip={<div className='w-[230px]'>{t(`${i18nPrefix}.MaxParallelismDesc`)}</div>}>
+            <div className='row flex'>
+              <Input type='number' wrapperClassName='w-18 mr-4 ' max={MAX_ITERATION_PARALLEL_NUM} min={MIN_ITERATION_PARALLEL_NUM} value={inputs.parallel_nums} onChange={(e) => { changeParallelNums(Number(e.target.value)) }} />
+              <Slider
+                value={inputs.parallel_nums}
+                onChange={changeParallelNums}
+                max={MAX_ITERATION_PARALLEL_NUM}
+                min={MIN_ITERATION_PARALLEL_NUM}
+                className=' mt-4 flex-1 shrink-0'
+              />
+            </div>
+
+          </Field>
+        </div>)
+      }
+      <Split />
+
+      <div className='px-4 py-2'>
+        <Field title={t(`${i18nPrefix}.errorResponseMethod`)} >
+          <Select items={responseMethod} defaultValue={inputs.error_handle_mode} onSelect={changeErrorResponseMode} allowSearch={false} />
+        </Field>
+      </div>
+
+      {isShowSingleRun && (
+        <BeforeRunForm
+          nodeName={inputs.title}
+          onHide={hideSingleRun}
+          forms={[
+            {
+              inputs: [...usedOutVars],
+              values: inputVarValues,
+              onChange: setInputVarValues,
+            },
+            {
+              label: t(`${i18nPrefix}.input`)!,
+              inputs: [{
+                label: '',
+                variable: iteratorInputKey,
+                type: InputVarType.iterator,
+                required: false,
+              }],
+              values: { [iteratorInputKey]: iterator },
+              onChange: keyValue => setIterator(keyValue[iteratorInputKey]),
+            },
+          ]}
+          runningStatus={runningStatus}
+          onRun={handleRun}
+          onStop={handleStop}
+          {...logsParams}
+          result={
+            <ResultPanel {...runResult} showSteps={false} nodeInfo={nodeInfo} {...logsParams} />
+          }
+        />
+      )}
+    </div>
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/iteration/types.ts b/app/components/workflow/nodes/iteration/types.ts
new file mode 100644
index 0000000..4a20dbd
--- /dev/null
+++ b/app/components/workflow/nodes/iteration/types.ts
@@ -0,0 +1,20 @@
+import type {
+  BlockEnum,
+  CommonNodeType,
+  ErrorHandleMode,
+  ValueSelector,
+  VarType,
+} from '@/app/components/workflow/types'
+
+export type IterationNodeType = CommonNodeType & {
+  startNodeType?: BlockEnum
+  start_node_id: string // start node id in the iteration
+  iteration_id?: string
+  iterator_selector: ValueSelector
+  output_selector: ValueSelector
+  output_type: VarType // output type.
+  is_parallel: boolean // open the parallel mode or not
+  parallel_nums: number // the numbers of parallel
+  error_handle_mode: ErrorHandleMode // how to handle error in the iteration
+  _isShowTips: boolean // when answer node in parallel mode iteration show tips
+}
diff --git a/app/components/workflow/nodes/iteration/use-config.ts b/app/components/workflow/nodes/iteration/use-config.ts
new file mode 100644
index 0000000..fd69fec
--- /dev/null
+++ b/app/components/workflow/nodes/iteration/use-config.ts
@@ -0,0 +1,245 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import { useBoolean } from 'ahooks'
+import {
+  useIsChatMode,
+  useIsNodeInIteration,
+  useNodesReadOnly,
+  useWorkflow,
+} from '../../hooks'
+import { VarType } from '../../types'
+import type { ErrorHandleMode, ValueSelector, Var } from '../../types'
+import useNodeCrud from '../_base/hooks/use-node-crud'
+import { getNodeInfoById, getNodeUsedVarPassToServerKey, getNodeUsedVars, isSystemVar, toNodeOutputVars } from '../_base/components/variable/utils'
+import useOneStepRun from '../_base/hooks/use-one-step-run'
+import type { IterationNodeType } from './types'
+import type { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types'
+import type { Item } from '@/app/components/base/select'
+
+const DELIMITER = '@@@@@'
+const useConfig = (id: string, payload: IterationNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const { isNodeInIteration } = useIsNodeInIteration(id)
+  const isChatMode = useIsChatMode()
+
+  const { inputs, setInputs } = useNodeCrud<IterationNodeType>(id, payload)
+
+  const filterInputVar = useCallback((varPayload: Var) => {
+    return [VarType.array, VarType.arrayString, VarType.arrayNumber, VarType.arrayObject, VarType.arrayFile].includes(varPayload.type)
+  }, [])
+
+  const handleInputChange = useCallback((input: ValueSelector | string) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.iterator_selector = input as ValueSelector || []
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  // output
+  const { getIterationNodeChildren, getBeforeNodesInSameBranch } = useWorkflow()
+  const beforeNodes = getBeforeNodesInSameBranch(id)
+  const iterationChildrenNodes = getIterationNodeChildren(id)
+  const canChooseVarNodes = [...beforeNodes, ...iterationChildrenNodes]
+  const childrenNodeVars = toNodeOutputVars(iterationChildrenNodes, isChatMode)
+
+  const handleOutputVarChange = useCallback((output: ValueSelector | string, _varKindType: VarKindType, varInfo?: Var) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.output_selector = output as ValueSelector || []
+      const outputItemType = varInfo?.type || VarType.string
+
+      draft.output_type = ({
+        [VarType.string]: VarType.arrayString,
+        [VarType.number]: VarType.arrayNumber,
+        [VarType.object]: VarType.arrayObject,
+        [VarType.file]: VarType.arrayFile,
+        // list operator node can output array
+        [VarType.array]: VarType.array,
+        [VarType.arrayFile]: VarType.arrayFile,
+        [VarType.arrayString]: VarType.arrayString,
+        [VarType.arrayNumber]: VarType.arrayNumber,
+        [VarType.arrayObject]: VarType.arrayObject,
+      } as Record<VarType, VarType>)[outputItemType] || VarType.arrayString
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  // single run
+  const iteratorInputKey = `${id}.input_selector`
+  const {
+    isShowSingleRun,
+    showSingleRun,
+    hideSingleRun,
+    toVarInputs,
+    runningStatus,
+    handleRun: doHandleRun,
+    handleStop,
+    runInputData,
+    setRunInputData,
+    runResult,
+    iterationRunResult,
+  } = useOneStepRun<IterationNodeType>({
+    id,
+    data: inputs,
+    iteratorInputKey,
+    defaultRunInputData: {
+      [iteratorInputKey]: [''],
+    },
+  })
+
+  const [isShowIterationDetail, {
+    setTrue: doShowIterationDetail,
+    setFalse: doHideIterationDetail,
+  }] = useBoolean(false)
+
+  const hideIterationDetail = useCallback(() => {
+    hideSingleRun()
+    doHideIterationDetail()
+  }, [doHideIterationDetail, hideSingleRun])
+
+  const showIterationDetail = useCallback(() => {
+    doShowIterationDetail()
+  }, [doShowIterationDetail])
+
+  const backToSingleRun = useCallback(() => {
+    hideIterationDetail()
+    showSingleRun()
+  }, [hideIterationDetail, showSingleRun])
+
+  const { usedOutVars, allVarObject } = (() => {
+    const vars: ValueSelector[] = []
+    const varObjs: Record<string, boolean> = {}
+    const allVarObject: Record<string, {
+      inSingleRunPassedKey: string
+    }> = {}
+    iterationChildrenNodes.forEach((node) => {
+      const nodeVars = getNodeUsedVars(node).filter(item => item && item.length > 0)
+      nodeVars.forEach((varSelector) => {
+        if (varSelector[0] === id) { // skip iteration node itself variable: item, index
+          return
+        }
+        const isInIteration = isNodeInIteration(varSelector[0])
+        if (isInIteration) // not pass iteration inner variable
+          return
+
+        const varSectorStr = varSelector.join('.')
+        if (!varObjs[varSectorStr]) {
+          varObjs[varSectorStr] = true
+          vars.push(varSelector)
+        }
+        let passToServerKeys = getNodeUsedVarPassToServerKey(node, varSelector)
+        if (typeof passToServerKeys === 'string')
+          passToServerKeys = [passToServerKeys]
+
+        passToServerKeys.forEach((key: string, index: number) => {
+          allVarObject[[varSectorStr, node.id, index].join(DELIMITER)] = {
+            inSingleRunPassedKey: key,
+          }
+        })
+      })
+    })
+    const res = toVarInputs(vars.map((item) => {
+      const varInfo = getNodeInfoById(canChooseVarNodes, item[0])
+      return {
+        label: {
+          nodeType: varInfo?.data.type,
+          nodeName: varInfo?.data.title || canChooseVarNodes[0]?.data.title, // default start node title
+          variable: isSystemVar(item) ? item.join('.') : item[item.length - 1],
+        },
+        variable: `${item.join('.')}`,
+        value_selector: item,
+      }
+    }))
+    return {
+      usedOutVars: res,
+      allVarObject,
+    }
+  })()
+
+  const handleRun = useCallback((data: Record<string, any>) => {
+    const formattedData: Record<string, any> = {}
+    Object.keys(allVarObject).forEach((key) => {
+      const [varSectorStr, nodeId] = key.split(DELIMITER)
+      formattedData[`${nodeId}.${allVarObject[key].inSingleRunPassedKey}`] = data[varSectorStr]
+    })
+    formattedData[iteratorInputKey] = data[iteratorInputKey]
+    doHandleRun(formattedData)
+  }, [allVarObject, doHandleRun, iteratorInputKey])
+
+  const inputVarValues = (() => {
+    const vars: Record<string, any> = {}
+    Object.keys(runInputData)
+      .filter(key => ![iteratorInputKey].includes(key))
+      .forEach((key) => {
+        vars[key] = runInputData[key]
+      })
+    return vars
+  })()
+
+  const setInputVarValues = useCallback((newPayload: Record<string, any>) => {
+    const newVars = {
+      ...newPayload,
+      [iteratorInputKey]: runInputData[iteratorInputKey],
+    }
+    setRunInputData(newVars)
+  }, [iteratorInputKey, runInputData, setRunInputData])
+
+  const iterator = runInputData[iteratorInputKey]
+  const setIterator = useCallback((newIterator: string[]) => {
+    setRunInputData({
+      ...runInputData,
+      [iteratorInputKey]: newIterator,
+    })
+  }, [iteratorInputKey, runInputData, setRunInputData])
+
+  const changeParallel = useCallback((value: boolean) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.is_parallel = value
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const changeErrorResponseMode = useCallback((item: Item) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.error_handle_mode = item.value as ErrorHandleMode
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+  const changeParallelNums = useCallback((num: number) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.parallel_nums = num
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+  return {
+    readOnly,
+    inputs,
+    filterInputVar,
+    handleInputChange,
+    childrenNodeVars,
+    iterationChildrenNodes,
+    handleOutputVarChange,
+    isShowSingleRun,
+    showSingleRun,
+    hideSingleRun,
+    isShowIterationDetail,
+    showIterationDetail,
+    hideIterationDetail,
+    backToSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runResult,
+    inputVarValues,
+    setInputVarValues,
+    usedOutVars,
+    iterator,
+    setIterator,
+    iteratorInputKey,
+    iterationRunResult,
+    changeParallel,
+    changeErrorResponseMode,
+    changeParallelNums,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/iteration/use-interactions.ts b/app/components/workflow/nodes/iteration/use-interactions.ts
new file mode 100644
index 0000000..c294cfd
--- /dev/null
+++ b/app/components/workflow/nodes/iteration/use-interactions.ts
@@ -0,0 +1,155 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import { useTranslation } from 'react-i18next'
+import { useStoreApi } from 'reactflow'
+import type {
+  BlockEnum,
+  Node,
+} from '../../types'
+import {
+  generateNewNode,
+  getNodeCustomTypeByNodeDataType,
+} from '../../utils'
+import {
+  ITERATION_PADDING,
+  NODES_INITIAL_DATA,
+} from '../../constants'
+import { CUSTOM_ITERATION_START_NODE } from '../iteration-start/constants'
+
+export const useNodeIterationInteractions = () => {
+  const { t } = useTranslation()
+  const store = useStoreApi()
+
+  const handleNodeIterationRerender = useCallback((nodeId: string) => {
+    const {
+      getNodes,
+      setNodes,
+    } = store.getState()
+
+    const nodes = getNodes()
+    const currentNode = nodes.find(n => n.id === nodeId)!
+    const childrenNodes = nodes.filter(n => n.parentId === nodeId)
+    let rightNode: Node
+    let bottomNode: Node
+
+    childrenNodes.forEach((n) => {
+      if (rightNode) {
+        if (n.position.x + n.width! > rightNode.position.x + rightNode.width!)
+          rightNode = n
+      }
+      else {
+        rightNode = n
+      }
+      if (bottomNode) {
+        if (n.position.y + n.height! > bottomNode.position.y + bottomNode.height!)
+          bottomNode = n
+      }
+      else {
+        bottomNode = n
+      }
+    })
+
+    const widthShouldExtend = rightNode! && currentNode.width! < rightNode.position.x + rightNode.width!
+    const heightShouldExtend = bottomNode! && currentNode.height! < bottomNode.position.y + bottomNode.height!
+
+    if (widthShouldExtend || heightShouldExtend) {
+      const newNodes = produce(nodes, (draft) => {
+        draft.forEach((n) => {
+          if (n.id === nodeId) {
+            if (widthShouldExtend) {
+              n.data.width = rightNode.position.x + rightNode.width! + ITERATION_PADDING.right
+              n.width = rightNode.position.x + rightNode.width! + ITERATION_PADDING.right
+            }
+            if (heightShouldExtend) {
+              n.data.height = bottomNode.position.y + bottomNode.height! + ITERATION_PADDING.bottom
+              n.height = bottomNode.position.y + bottomNode.height! + ITERATION_PADDING.bottom
+            }
+          }
+        })
+      })
+
+      setNodes(newNodes)
+    }
+  }, [store])
+
+  const handleNodeIterationChildDrag = useCallback((node: Node) => {
+    const { getNodes } = store.getState()
+    const nodes = getNodes()
+
+    const restrictPosition: { x?: number; y?: number } = { x: undefined, y: undefined }
+
+    if (node.data.isInIteration) {
+      const parentNode = nodes.find(n => n.id === node.parentId)
+
+      if (parentNode) {
+        if (node.position.y < ITERATION_PADDING.top)
+          restrictPosition.y = ITERATION_PADDING.top
+        if (node.position.x < ITERATION_PADDING.left)
+          restrictPosition.x = ITERATION_PADDING.left
+        if (node.position.x + node.width! > parentNode!.width! - ITERATION_PADDING.right)
+          restrictPosition.x = parentNode!.width! - ITERATION_PADDING.right - node.width!
+        if (node.position.y + node.height! > parentNode!.height! - ITERATION_PADDING.bottom)
+          restrictPosition.y = parentNode!.height! - ITERATION_PADDING.bottom - node.height!
+      }
+    }
+
+    return {
+      restrictPosition,
+    }
+  }, [store])
+
+  const handleNodeIterationChildSizeChange = useCallback((nodeId: string) => {
+    const { getNodes } = store.getState()
+    const nodes = getNodes()
+    const currentNode = nodes.find(n => n.id === nodeId)!
+    const parentId = currentNode.parentId
+
+    if (parentId)
+      handleNodeIterationRerender(parentId)
+  }, [store, handleNodeIterationRerender])
+
+  const handleNodeIterationChildrenCopy = useCallback((nodeId: string, newNodeId: string, idMapping: Record<string, string>) => {
+    const { getNodes } = store.getState()
+    const nodes = getNodes()
+    const childrenNodes = nodes.filter(n => n.parentId === nodeId && n.type !== CUSTOM_ITERATION_START_NODE)
+    const newIdMapping = { ...idMapping }
+
+    const copyChildren = childrenNodes.map((child, index) => {
+      const childNodeType = child.data.type as BlockEnum
+      const nodesWithSameType = nodes.filter(node => node.data.type === childNodeType)
+      const { newNode } = generateNewNode({
+        type: getNodeCustomTypeByNodeDataType(childNodeType),
+        data: {
+          ...NODES_INITIAL_DATA[childNodeType],
+          ...child.data,
+          selected: false,
+          _isBundled: false,
+          _connectedSourceHandleIds: [],
+          _connectedTargetHandleIds: [],
+          title: nodesWithSameType.length > 0 ? `${t(`workflow.blocks.${childNodeType}`)} ${nodesWithSameType.length + 1}` : t(`workflow.blocks.${childNodeType}`),
+          iteration_id: newNodeId,
+        },
+        position: child.position,
+        positionAbsolute: child.positionAbsolute,
+        parentId: newNodeId,
+        extent: child.extent,
+        zIndex: child.zIndex,
+      })
+      newNode.id = `${newNodeId}${newNode.id + index}`
+      newIdMapping[child.id] = newNode.id
+      return newNode
+    })
+
+    return {
+      copyChildren,
+      newIdMapping,
+    }
+  }, [store, t])
+
+  return {
+    handleNodeIterationRerender,
+    handleNodeIterationChildDrag,
+    handleNodeIterationChildSizeChange,
+    handleNodeIterationChildrenCopy,
+  }
+}
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/add-dataset.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/add-dataset.tsx
new file mode 100644
index 0000000..010ecbb
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/add-dataset.tsx
@@ -0,0 +1,41 @@
+'use client'
+import { useBoolean } from 'ahooks'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import AddButton from '@/app/components/base/button/add-button'
+import SelectDataset from '@/app/components/app/configuration/dataset-config/select-dataset'
+import type { DataSet } from '@/models/datasets'
+
+type Props = {
+  selectedIds: string[]
+  onChange: (dataSets: DataSet[]) => void
+}
+
+const AddDataset: FC<Props> = ({
+  selectedIds,
+  onChange,
+}) => {
+  const [isShowModal, {
+    setTrue: showModal,
+    setFalse: hideModal,
+  }] = useBoolean(false)
+
+  const handleSelect = useCallback((datasets: DataSet[]) => {
+    onChange(datasets)
+    hideModal()
+  }, [onChange, hideModal])
+  return (
+    <div>
+      <AddButton onClick={showModal} />
+      {isShowModal && (
+        <SelectDataset
+          isShow={isShowModal}
+          onClose={hideModal}
+          selectedIds={selectedIds}
+          onSelect={handleSelect}
+        />
+      )}
+    </div>
+  )
+}
+export default React.memo(AddDataset)
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/dataset-item.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/dataset-item.tsx
new file mode 100644
index 0000000..bee387d
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/dataset-item.tsx
@@ -0,0 +1,125 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useBoolean } from 'ahooks'
+import {
+  RiDeleteBinLine,
+  RiEditLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import type { DataSet } from '@/models/datasets'
+import { DataSourceType } from '@/models/datasets'
+import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
+import FileIcon from '@/app/components/base/file-icon'
+import { Folder } from '@/app/components/base/icons/src/vender/solid/files'
+import SettingsModal from '@/app/components/app/configuration/dataset-config/settings-modal'
+import Drawer from '@/app/components/base/drawer'
+import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
+import Badge from '@/app/components/base/badge'
+import { useKnowledge } from '@/hooks/use-knowledge'
+
+type Props = {
+  payload: DataSet
+  onRemove: () => void
+  onChange: (dataSet: DataSet) => void
+  readonly?: boolean
+  editable?: boolean
+}
+
+const DatasetItem: FC<Props> = ({
+  payload,
+  onRemove,
+  onChange,
+  readonly,
+  editable = true,
+}) => {
+  const media = useBreakpoints()
+  const { t } = useTranslation()
+  const isMobile = media === MediaType.mobile
+  const { formatIndexingTechniqueAndMethod } = useKnowledge()
+  const [isDeleteHovered, setIsDeleteHovered] = useState(false)
+
+  const [isShowSettingsModal, {
+    setTrue: showSettingsModal,
+    setFalse: hideSettingsModal,
+  }] = useBoolean(false)
+
+  const handleSave = useCallback((newDataset: DataSet) => {
+    onChange(newDataset)
+    hideSettingsModal()
+  }, [hideSettingsModal, onChange])
+
+  const handleRemove = useCallback((e: React.MouseEvent) => {
+    e.stopPropagation()
+    onRemove()
+  }, [onRemove])
+
+  return (
+    <div className={`group/dataset-item flex h-10 cursor-pointer items-center justify-between rounded-lg
+      border-[0.5px] border-components-panel-border-subtle px-2
+      ${isDeleteHovered
+      ? 'border-state-destructive-border bg-state-destructive-hover'
+      : 'bg-components-panel-on-panel-item-bg hover:bg-components-panel-on-panel-item-bg-hover'
+    }`}>
+      <div className='flex w-0 grow items-center space-x-1.5'>
+        {
+          payload.data_source_type === DataSourceType.NOTION
+            ? (
+              <div className='flex h-6 w-6 shrink-0 items-center justify-center rounded-md border-[0.5px] border-[#EAECF5]'>
+                <FileIcon type='notion' className='h-4 w-4' />
+              </div>
+            )
+            : <div className='flex h-6 w-6 shrink-0 items-center justify-center rounded-md border-[0.5px] border-[#E0EAFF] bg-[#F5F8FF]'>
+              <Folder className='h-4 w-4 text-[#444CE7]' />
+            </div>
+        }
+        <div className='system-sm-medium w-0 grow truncate text-text-secondary'>{payload.name}</div>
+      </div>
+      {!readonly && (
+        <div className='ml-2 hidden shrink-0 items-center  space-x-1 group-hover/dataset-item:flex'>
+          {
+            editable && <ActionButton
+              onClick={(e) => {
+                e.stopPropagation()
+                showSettingsModal()
+              }}
+            >
+              <RiEditLine className='h-4 w-4 shrink-0 text-text-tertiary' />
+            </ActionButton>
+          }
+          <ActionButton
+            onClick={handleRemove}
+            state={isDeleteHovered ? ActionButtonState.Destructive : ActionButtonState.Default}
+            onMouseEnter={() => setIsDeleteHovered(true)}
+            onMouseLeave={() => setIsDeleteHovered(false)}
+          >
+            <RiDeleteBinLine className={`h-4 w-4 shrink-0 ${isDeleteHovered ? 'text-text-destructive' : 'text-text-tertiary'}`} />
+          </ActionButton>
+        </div>
+      )}
+      {
+        payload.indexing_technique && <Badge
+          className='shrink-0 group-hover/dataset-item:hidden'
+          text={formatIndexingTechniqueAndMethod(payload.indexing_technique, payload.retrieval_model_dict?.search_method)}
+        />
+      }
+      {
+        payload.provider === 'external' && <Badge
+          className='shrink-0 group-hover/dataset-item:hidden'
+          text={t('dataset.externalTag') as string}
+        />
+      }
+
+      {isShowSettingsModal && (
+        <Drawer isOpen={isShowSettingsModal} onClose={hideSettingsModal} footer={null} mask={isMobile} panelClassName='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[640px] rounded-xl'>
+          <SettingsModal
+            currentDataset={payload}
+            onCancel={hideSettingsModal}
+            onSave={handleSave}
+          />
+        </Drawer>
+      )}
+    </div>
+  )
+}
+export default React.memo(DatasetItem)
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/dataset-list.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/dataset-list.tsx
new file mode 100644
index 0000000..bf18dbf
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/dataset-list.tsx
@@ -0,0 +1,82 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useMemo } from 'react'
+import produce from 'immer'
+import { useTranslation } from 'react-i18next'
+import Item from './dataset-item'
+import type { DataSet } from '@/models/datasets'
+import { useSelector as useAppContextSelector } from '@/context/app-context'
+import { hasEditPermissionForDataset } from '@/utils/permission'
+
+type Props = {
+  list: DataSet[]
+  onChange: (list: DataSet[]) => void
+  readonly?: boolean
+}
+
+const DatasetList: FC<Props> = ({
+  list,
+  onChange,
+  readonly,
+}) => {
+  const { t } = useTranslation()
+  const userProfile = useAppContextSelector(s => s.userProfile)
+
+  const handleRemove = useCallback((index: number) => {
+    return () => {
+      const newList = produce(list, (draft) => {
+        draft.splice(index, 1)
+      })
+      onChange(newList)
+    }
+  }, [list, onChange])
+
+  const handleChange = useCallback((index: number) => {
+    return (value: DataSet) => {
+      const newList = produce(list, (draft) => {
+        draft[index] = value
+      })
+      onChange(newList)
+    }
+  }, [list, onChange])
+
+  const formattedList = useMemo(() => {
+    return list.map((item) => {
+      const datasetConfig = {
+        createdBy: item.created_by,
+        partialMemberList: item.partial_member_list || [],
+        permission: item.permission,
+      }
+      return {
+        ...item,
+        editable: hasEditPermissionForDataset(userProfile?.id || '', datasetConfig),
+      }
+    })
+  }, [list, userProfile?.id])
+
+  return (
+    <div className='space-y-1'>
+      {formattedList.length
+        ? formattedList.map((item, index) => {
+          return (
+            <Item
+              key={index}
+              payload={item}
+              onRemove={handleRemove(index)}
+              onChange={handleChange(index)}
+              readonly={readonly}
+              editable={item.editable}
+            />
+          )
+        })
+        : (
+          <div className='cursor-default select-none rounded-lg bg-background-section p-3 text-center text-xs text-text-tertiary'>
+            {t('appDebug.datasetConfig.knowledgeTip')}
+          </div>
+        )
+      }
+
+    </div>
+  )
+}
+export default React.memo(DatasetList)
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/add-condition.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/add-condition.tsx
new file mode 100644
index 0000000..ed6b4c6
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/add-condition.tsx
@@ -0,0 +1,95 @@
+import {
+  useCallback,
+  useMemo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAddLine,
+} from '@remixicon/react'
+import MetadataIcon from './metadata-icon'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import type { MetadataShape } from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+import type { MetadataInDoc } from '@/models/datasets'
+
+const AddCondition = ({
+  metadataList,
+  handleAddCondition,
+}: Pick<MetadataShape, 'handleAddCondition' | 'metadataList'>) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const [searchText, setSearchText] = useState('')
+
+  const filteredMetadataList = useMemo(() => {
+    return metadataList?.filter(metadata => metadata.name.includes(searchText))
+  }, [metadataList, searchText])
+
+  const handleAddConditionWrapped = useCallback((item: MetadataInDoc) => {
+    handleAddCondition?.(item)
+    setOpen(false)
+  }, [handleAddCondition])
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={{
+        mainAxis: 3,
+        crossAxis: 0,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(!open)}>
+        <Button
+          size='small'
+          variant='secondary'
+        >
+          <RiAddLine className='h-3.5 w-3.5' />
+          {t('workflow.nodes.knowledgeRetrieval.metadata.panel.add')}
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-10'>
+        <div className='w-[320px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg'>
+          <div className='p-2 pb-1'>
+            <Input
+              showLeftIcon
+              placeholder={t('workflow.nodes.knowledgeRetrieval.metadata.panel.search')}
+              value={searchText}
+              onChange={e => setSearchText(e.target.value)}
+            />
+          </div>
+          <div className='p-1'>
+            {
+              filteredMetadataList?.map(metadata => (
+                <div
+                  key={metadata.name}
+                  className='system-sm-medium flex h-6 cursor-pointer items-center rounded-md px-3 text-text-secondary hover:bg-state-base-hover'
+                >
+                  <div className='mr-1 p-[1px]'>
+                    <MetadataIcon type={metadata.type} />
+                  </div>
+                  <div
+                    className='grow truncate'
+                    title={metadata.name}
+                    onClick={() => handleAddConditionWrapped(metadata)}
+                  >
+                    {metadata.name}
+                  </div>
+                  <div className='system-xs-regular shrink-0 text-text-tertiary'>{metadata.type}</div>
+                </div>
+              ))
+            }
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default AddCondition
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-common-variable-selector.tsx.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-common-variable-selector.tsx.tsx
new file mode 100644
index 0000000..00ba306
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-common-variable-selector.tsx.tsx
@@ -0,0 +1,91 @@
+import { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import type { VarType } from '@/app/components/workflow/types'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+
+type ConditionCommonVariableSelectorProps = {
+  variables?: { name: string; type: string }[]
+  value?: string | number
+  varType?: VarType
+  onChange: (v: string) => void
+}
+
+const ConditionCommonVariableSelector = ({
+  variables = [],
+  value,
+  onChange,
+  varType,
+}: ConditionCommonVariableSelectorProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const selected = variables.find(v => v.name === value)
+  const handleChange = useCallback((v: string) => {
+    onChange(v)
+    setOpen(false)
+  }, [onChange])
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 0,
+      }}
+    >
+      <PortalToFollowElemTrigger asChild onClick={() => {
+        if (!variables.length) return
+        setOpen(!open)
+      }}>
+        <div className="flex h-6 grow cursor-pointer items-center">
+          {
+            selected && (
+              <div className='system-xs-medium inline-flex h-6 items-center rounded-md border-[0.5px] border-components-panel-border-subtle bg-components-badge-white-to-dark pl-[5px] pr-1.5 text-text-secondary shadow-xs'>
+                <Variable02 className='mr-1 h-3.5 w-3.5 text-text-accent' />
+                {selected.name}
+              </div>
+            )
+          }
+          {
+            !selected && (
+              <>
+                <div className='system-sm-regular flex grow items-center text-components-input-text-placeholder'>
+                  <Variable02 className='mr-1 h-4 w-4' />
+                  {t('workflow.nodes.knowledgeRetrieval.metadata.panel.select')}
+                </div>
+                <div className='system-2xs-medium flex h-5 shrink-0 items-center rounded-[5px] border border-divider-deep px-[5px] text-text-tertiary'>
+                  {varType}
+                </div>
+              </>
+            )
+          }
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[1000]'>
+        <div className='w-[200px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
+          {
+            variables.map(v => (
+              <div
+                key={v.name}
+                className='system-xs-medium flex h-6 cursor-pointer items-center rounded-md px-2 text-text-secondary hover:bg-state-base-hover'
+                onClick={() => handleChange(v.name)}
+              >
+                <Variable02 className='mr-1 h-4 w-4 text-text-accent' />
+                {v.name}
+              </div>
+            ))
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default ConditionCommonVariableSelector
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-date.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-date.tsx
new file mode 100644
index 0000000..eda0401
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-date.tsx
@@ -0,0 +1,86 @@
+import { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import dayjs from 'dayjs'
+import {
+  RiCalendarLine,
+  RiCloseCircleFill,
+} from '@remixicon/react'
+import DatePicker from '@/app/components/base/date-and-time-picker/date-picker'
+import type { TriggerProps } from '@/app/components/base/date-and-time-picker/types'
+import cn from '@/utils/classnames'
+import { useAppContext } from '@/context/app-context'
+
+type ConditionDateProps = {
+  value?: number
+  onChange: (date?: number) => void
+}
+const ConditionDate = ({
+  value,
+  onChange,
+}: ConditionDateProps) => {
+  const { t } = useTranslation()
+  const { userProfile: { timezone } } = useAppContext()
+
+  const handleDateChange = useCallback((date?: dayjs.Dayjs) => {
+    if (date)
+      onChange(date.unix())
+    else
+      onChange()
+  }, [onChange])
+
+  const renderTrigger = useCallback(({
+    handleClickTrigger,
+  }: TriggerProps) => {
+    return (
+      <div className='group flex items-center' onClick={handleClickTrigger}>
+        <div
+          className={cn(
+            'system-sm-regular mr-0.5 flex h-6 grow cursor-pointer items-center px-1',
+            value ? 'text-text-secondary' : 'text-text-tertiary',
+          )}
+        >
+          {
+            value
+              ? dayjs(value * 1000).tz(timezone).format('MMMM DD YYYY HH:mm A')
+              : t('workflow.nodes.knowledgeRetrieval.metadata.panel.datePlaceholder')
+          }
+        </div>
+        {
+          value && (
+            <RiCloseCircleFill
+              className={cn(
+                'hidden h-4 w-4 shrink-0 cursor-pointer hover:text-components-input-text-filled group-hover:block',
+                value && 'text-text-quaternary',
+              )}
+              onClick={(e) => {
+                e.stopPropagation()
+                handleDateChange()
+              }}
+            />
+          )
+        }
+        <RiCalendarLine
+          className={cn(
+            'block h-4 w-4 shrink-0',
+            value ? 'text-text-quaternary' : 'text-text-tertiary',
+            value && 'group-hover:hidden',
+          )}
+        />
+      </div>
+    )
+  }, [value, handleDateChange, timezone, t])
+
+  return (
+    <div className='h-8 px-2 py-1'>
+      <DatePicker
+        timezone={timezone}
+        value={value ? dayjs(value * 1000) : undefined}
+        onChange={handleDateChange}
+        onClear={handleDateChange}
+        renderTrigger={renderTrigger}
+      />
+    </div>
+  )
+}
+
+export default ConditionDate
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-item.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-item.tsx
new file mode 100644
index 0000000..398a229
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-item.tsx
@@ -0,0 +1,196 @@
+import {
+  useCallback,
+  useMemo,
+  useState,
+} from 'react'
+import {
+  RiDeleteBinLine,
+} from '@remixicon/react'
+import MetadataIcon from '../metadata-icon'
+import {
+  COMMON_VARIABLE_REGEX,
+  VARIABLE_REGEX,
+  comparisonOperatorNotRequireValue,
+} from './utils'
+import ConditionOperator from './condition-operator'
+import ConditionString from './condition-string'
+import ConditionNumber from './condition-number'
+import ConditionDate from './condition-date'
+import type {
+  ComparisonOperator,
+  HandleRemoveCondition,
+  HandleUpdateCondition,
+  MetadataFilteringCondition,
+  MetadataShape,
+} from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+import { MetadataFilteringVariableType } from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+import cn from '@/utils/classnames'
+
+type ConditionItemProps = {
+  className?: string
+  disabled?: boolean
+  condition: MetadataFilteringCondition // condition may the condition of case or condition of sub variable
+  onRemoveCondition?: HandleRemoveCondition
+  onUpdateCondition?: HandleUpdateCondition
+} & Pick<MetadataShape, 'metadataList' | 'availableStringVars' | 'availableStringNodesWithParent' | 'availableNumberVars' | 'availableNumberNodesWithParent' | 'isCommonVariable' | 'availableCommonStringVars' | 'availableCommonNumberVars'>
+const ConditionItem = ({
+  className,
+  disabled,
+  condition,
+  onRemoveCondition,
+  onUpdateCondition,
+  metadataList = [],
+  availableStringVars = [],
+  availableStringNodesWithParent = [],
+  availableNumberVars = [],
+  availableNumberNodesWithParent = [],
+  isCommonVariable,
+  availableCommonStringVars = [],
+  availableCommonNumberVars = [],
+}: ConditionItemProps) => {
+  const [isHovered, setIsHovered] = useState(false)
+
+  const canChooseOperator = useMemo(() => {
+    if (disabled)
+      return false
+
+    return true
+  }, [disabled])
+
+  const doRemoveCondition = useCallback(() => {
+    onRemoveCondition?.(condition.id)
+  }, [onRemoveCondition, condition.id])
+
+  const currentMetadata = useMemo(() => {
+    return metadataList.find(metadata => metadata.name === condition.name)
+  }, [metadataList, condition.name])
+
+  const handleConditionOperatorChange = useCallback((operator: ComparisonOperator) => {
+    onUpdateCondition?.(
+      condition.id,
+      {
+        ...condition,
+        value: comparisonOperatorNotRequireValue(condition.comparison_operator) ? undefined : condition.value,
+        comparison_operator: operator,
+      })
+  }, [onUpdateCondition, condition])
+
+  const valueAndValueMethod = useMemo(() => {
+    if (
+      (currentMetadata?.type === MetadataFilteringVariableType.string
+       || currentMetadata?.type === MetadataFilteringVariableType.number
+       || currentMetadata?.type === MetadataFilteringVariableType.select)
+      && typeof condition.value === 'string'
+    ) {
+      const regex = isCommonVariable ? COMMON_VARIABLE_REGEX : VARIABLE_REGEX
+      const matchedStartNumber = isCommonVariable ? 2 : 3
+      const matched = condition.value.match(regex)
+
+      if (matched?.length) {
+        return {
+          value: matched[0].slice(matchedStartNumber, -matchedStartNumber),
+          valueMethod: 'variable',
+        }
+      }
+      else {
+        return {
+          value: condition.value,
+          valueMethod: 'constant',
+        }
+      }
+    }
+
+    return {
+      value: condition.value,
+      valueMethod: 'constant',
+    }
+  }, [currentMetadata, condition.value, isCommonVariable])
+  const [localValueMethod, setLocalValueMethod] = useState(valueAndValueMethod.valueMethod)
+
+  const handleValueMethodChange = useCallback((v: string) => {
+    setLocalValueMethod(v)
+    onUpdateCondition?.(condition.id, { ...condition, value: undefined })
+  }, [condition, onUpdateCondition])
+
+  const handleValueChange = useCallback((v: any) => {
+    onUpdateCondition?.(condition.id, { ...condition, value: v })
+  }, [condition, onUpdateCondition])
+
+  return (
+    <div className={cn('mb-1 flex last-of-type:mb-0', className)}>
+      <div className={cn(
+        'grow rounded-lg bg-components-input-bg-normal',
+        isHovered && 'bg-state-destructive-hover',
+      )}>
+        <div className='flex items-center p-1'>
+          <div className='w-0 grow'>
+            <div className='inline-flex h-6 items-center rounded-md border-[0.5px] border-components-panel-border-subtle bg-components-badge-white-to-dark pl-1 pr-1.5 shadow-xs'>
+              <div className='mr-0.5 p-[1px]'>
+                <MetadataIcon type={currentMetadata?.type} className='h-3 w-3' />
+              </div>
+              <div className='system-xs-medium mr-0.5 text-text-secondary'>{currentMetadata?.name}</div>
+              <div className='system-xs-regular text-text-tertiary'>{currentMetadata?.type}</div>
+            </div>
+          </div>
+          <div className='mx-1 h-3 w-[1px] bg-divider-regular'></div>
+          <ConditionOperator
+            disabled={!canChooseOperator}
+            variableType={currentMetadata?.type || MetadataFilteringVariableType.string}
+            value={condition.comparison_operator}
+            onSelect={handleConditionOperatorChange}
+          />
+        </div>
+        <div className='border-t border-t-divider-subtle'>
+          {
+            !comparisonOperatorNotRequireValue(condition.comparison_operator)
+            && (currentMetadata?.type === MetadataFilteringVariableType.string
+             || currentMetadata?.type === MetadataFilteringVariableType.select) && (
+              <ConditionString
+                valueMethod={localValueMethod}
+                onValueMethodChange={handleValueMethodChange}
+                nodesOutputVars={availableStringVars}
+                availableNodes={availableStringNodesWithParent}
+                value={valueAndValueMethod.value as string}
+                onChange={handleValueChange}
+                isCommonVariable={isCommonVariable}
+                commonVariables={availableCommonStringVars}
+              />
+            )
+          }
+          {
+            !comparisonOperatorNotRequireValue(condition.comparison_operator) && currentMetadata?.type === MetadataFilteringVariableType.number && (
+              <ConditionNumber
+                valueMethod={localValueMethod}
+                onValueMethodChange={handleValueMethodChange}
+                nodesOutputVars={availableNumberVars}
+                availableNodes={availableNumberNodesWithParent}
+                value={valueAndValueMethod.value}
+                onChange={handleValueChange}
+                isCommonVariable={isCommonVariable}
+                commonVariables={availableCommonNumberVars}
+              />
+            )
+          }
+          {
+            !comparisonOperatorNotRequireValue(condition.comparison_operator) && currentMetadata?.type === MetadataFilteringVariableType.time && (
+              <ConditionDate
+                value={condition.value as number}
+                onChange={handleValueChange}
+              />
+            )
+          }
+        </div>
+      </div>
+      <div
+        className='ml-1 mt-1 flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-lg text-text-tertiary hover:bg-state-destructive-hover hover:text-text-destructive'
+        onMouseEnter={() => setIsHovered(true)}
+        onMouseLeave={() => setIsHovered(false)}
+        onClick={doRemoveCondition}
+      >
+        <RiDeleteBinLine className='h-4 w-4' />
+      </div>
+    </div>
+  )
+}
+
+export default ConditionItem
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-number.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-number.tsx
new file mode 100644
index 0000000..32fd64d
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-number.tsx
@@ -0,0 +1,88 @@
+import { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import ConditionValueMethod from './condition-value-method'
+import type { ConditionValueMethodProps } from './condition-value-method'
+import ConditionVariableSelector from './condition-variable-selector'
+import ConditionCommonVariableSelector from './condition-common-variable-selector.tsx'
+import type {
+  Node,
+  NodeOutPutVar,
+  ValueSelector,
+} from '@/app/components/workflow/types'
+import { VarType } from '@/app/components/workflow/types'
+import Input from '@/app/components/base/input'
+
+type ConditionNumberProps = {
+  value?: string | number
+  onChange: (value?: string | number) => void
+  nodesOutputVars: NodeOutPutVar[]
+  availableNodes: Node[]
+  isCommonVariable?: boolean
+  commonVariables: { name: string, type: string }[]
+} & ConditionValueMethodProps
+const ConditionNumber = ({
+  value,
+  onChange,
+  valueMethod,
+  onValueMethodChange,
+  nodesOutputVars,
+  availableNodes,
+  isCommonVariable,
+  commonVariables,
+}: ConditionNumberProps) => {
+  const { t } = useTranslation()
+  const handleVariableValueChange = useCallback((v: ValueSelector) => {
+    onChange(`{{#${v.join('.')}#}}`)
+  }, [onChange])
+
+  const handleCommonVariableValueChange = useCallback((v: string) => {
+    onChange(`{{${v}}}`)
+  }, [onChange])
+
+  return (
+    <div className='flex h-8 items-center pl-1 pr-2'>
+      <ConditionValueMethod
+        valueMethod={valueMethod}
+        onValueMethodChange={onValueMethodChange}
+      />
+      <div className='ml-1 mr-1.5 h-4 w-[1px] bg-divider-regular'></div>
+      {
+        valueMethod === 'variable' && !isCommonVariable && (
+          <ConditionVariableSelector
+            valueSelector={value ? (value as string).split('.') : []}
+            onChange={handleVariableValueChange}
+            nodesOutputVars={nodesOutputVars}
+            availableNodes={availableNodes}
+            varType={VarType.number}
+          />
+        )
+      }
+      {
+        valueMethod === 'variable' && isCommonVariable && (
+          <ConditionCommonVariableSelector
+            variables={commonVariables}
+            value={value}
+            onChange={handleCommonVariableValueChange}
+            varType={VarType.number}
+          />
+        )
+      }
+      {
+        valueMethod === 'constant' && (
+          <Input
+            className='border-none bg-transparent outline-none hover:bg-transparent focus:bg-transparent focus:shadow-none'
+            value={value}
+            onChange={(e) => {
+              const v = e.target.value
+              onChange(v ? Number(e.target.value) : undefined)
+            }}
+            placeholder={t('workflow.nodes.knowledgeRetrieval.metadata.panel.placeholder')}
+            type='number'
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default ConditionNumber
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-operator.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-operator.tsx
new file mode 100644
index 0000000..0e0367c
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-operator.tsx
@@ -0,0 +1,98 @@
+import {
+  useMemo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine } from '@remixicon/react'
+import {
+  getOperators,
+  isComparisonOperatorNeedTranslate,
+} from './utils'
+import Button from '@/app/components/base/button'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import cn from '@/utils/classnames'
+import type {
+  ComparisonOperator,
+  MetadataFilteringVariableType,
+} from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+
+const i18nPrefix = 'workflow.nodes.ifElse'
+
+type ConditionOperatorProps = {
+  className?: string
+  disabled?: boolean
+  variableType: MetadataFilteringVariableType
+  value?: string
+  onSelect: (value: ComparisonOperator) => void
+}
+const ConditionOperator = ({
+  className,
+  disabled,
+  variableType,
+  value,
+  onSelect,
+}: ConditionOperatorProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const options = useMemo(() => {
+    return getOperators(variableType).map((o) => {
+      return {
+        label: isComparisonOperatorNeedTranslate(o) ? t(`${i18nPrefix}.comparisonOperator.${o}`) : o,
+        value: o,
+      }
+    })
+  }, [t, variableType])
+  const selectedOption = options.find(o => Array.isArray(value) ? o.value === value[0] : o.value === value)
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 0,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+        <Button
+          className={cn('shrink-0', !selectedOption && 'opacity-50', className)}
+          size='small'
+          variant='ghost'
+          disabled={disabled}
+        >
+          {
+            selectedOption
+              ? selectedOption.label
+              : t(`${i18nPrefix}.select`)
+          }
+          <RiArrowDownSLine className='ml-1 h-3.5 w-3.5' />
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-10'>
+        <div className='rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
+          {
+            options.map(option => (
+              <div
+                key={option.value}
+                className='flex h-7 cursor-pointer items-center rounded-lg px-3 py-1.5 text-[13px] font-medium text-text-secondary hover:bg-state-base-hover'
+                onClick={() => {
+                  onSelect(option.value)
+                  setOpen(false)
+                }}
+              >
+                {option.label}
+              </div>
+            ))
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default ConditionOperator
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-string.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-string.tsx
new file mode 100644
index 0000000..f376ee5
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-string.tsx
@@ -0,0 +1,84 @@
+import { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import ConditionValueMethod from './condition-value-method'
+import type { ConditionValueMethodProps } from './condition-value-method'
+import ConditionVariableSelector from './condition-variable-selector'
+import ConditionCommonVariableSelector from './condition-common-variable-selector.tsx'
+import type {
+  Node,
+  NodeOutPutVar,
+  ValueSelector,
+} from '@/app/components/workflow/types'
+import Input from '@/app/components/base/input'
+import { VarType } from '@/app/components/workflow/types'
+
+type ConditionStringProps = {
+  value?: string
+  onChange: (value: string) => void
+  nodesOutputVars: NodeOutPutVar[]
+  availableNodes: Node[]
+  isCommonVariable?: boolean
+  commonVariables: { name: string, type: string }[]
+} & ConditionValueMethodProps
+const ConditionString = ({
+  value,
+  onChange,
+  valueMethod = 'constant',
+  onValueMethodChange,
+  nodesOutputVars,
+  availableNodes,
+  isCommonVariable,
+  commonVariables,
+}: ConditionStringProps) => {
+  const { t } = useTranslation()
+  const handleVariableValueChange = useCallback((v: ValueSelector) => {
+    onChange(`{{#${v.join('.')}#}}`)
+  }, [onChange])
+
+  const handleCommonVariableValueChange = useCallback((v: string) => {
+    onChange(`{{${v}}}`)
+  }, [onChange])
+
+  return (
+    <div className='flex h-8 items-center pl-1 pr-2'>
+      <ConditionValueMethod
+        valueMethod={valueMethod}
+        onValueMethodChange={onValueMethodChange}
+      />
+      <div className='ml-1 mr-1.5 h-4 w-[1px] bg-divider-regular'></div>
+      {
+        valueMethod === 'variable' && !isCommonVariable && (
+          <ConditionVariableSelector
+            valueSelector={value ? value!.split('.') : []}
+            onChange={handleVariableValueChange}
+            nodesOutputVars={nodesOutputVars}
+            availableNodes={availableNodes}
+            varType={VarType.string}
+          />
+        )
+      }
+      {
+        valueMethod === 'variable' && isCommonVariable && (
+          <ConditionCommonVariableSelector
+            variables={commonVariables}
+            value={value}
+            onChange={handleCommonVariableValueChange}
+            varType={VarType.string}
+          />
+        )
+      }
+      {
+        valueMethod === 'constant' && (
+          <Input
+            className='border-none bg-transparent outline-none hover:bg-transparent focus:bg-transparent focus:shadow-none'
+            value={value}
+            onChange={e => onChange(e.target.value)}
+            placeholder={t('workflow.nodes.knowledgeRetrieval.metadata.panel.placeholder')}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default ConditionString
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-value-method.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-value-method.tsx
new file mode 100644
index 0000000..917cb0e
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-value-method.tsx
@@ -0,0 +1,71 @@
+import { useState } from 'react'
+import { capitalize } from 'lodash-es'
+import { RiArrowDownSLine } from '@remixicon/react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Button from '@/app/components/base/button'
+import cn from '@/utils/classnames'
+
+export type ConditionValueMethodProps = {
+  valueMethod?: string
+  onValueMethodChange: (v: string) => void
+}
+const options = [
+  'variable',
+  'constant',
+]
+const ConditionValueMethod = ({
+  valueMethod = 'variable',
+  onValueMethodChange,
+}: ConditionValueMethodProps) => {
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={{ mainAxis: 4, crossAxis: 0 }}
+    >
+      <PortalToFollowElemTrigger asChild onClick={() => setOpen(v => !v)}>
+        <Button
+          className='shrink-0'
+          variant='ghost'
+          size='small'
+        >
+          {capitalize(valueMethod)}
+          <RiArrowDownSLine className='ml-[1px] h-3.5 w-3.5' />
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[1000]'>
+        <div className='w-[112px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
+          {
+            options.map(option => (
+              <div
+                key={option}
+                className={cn(
+                  'flex h-7 cursor-pointer items-center rounded-md px-3 hover:bg-state-base-hover',
+                  'text-[13px] font-medium text-text-secondary',
+                  valueMethod === option && 'bg-state-base-hover',
+                )}
+                onClick={() => {
+                  if (valueMethod === option)
+                    return
+                  onValueMethodChange(option)
+                  setOpen(false)
+                }}
+              >
+                {capitalize(option)}
+              </div>
+            ))
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default ConditionValueMethod
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-variable-selector.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-variable-selector.tsx
new file mode 100644
index 0000000..7908f6a
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-variable-selector.tsx
@@ -0,0 +1,92 @@
+import { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import VariableTag from '@/app/components/workflow/nodes/_base/components/variable-tag'
+import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars'
+import type {
+  Node,
+  NodeOutPutVar,
+  ValueSelector,
+  Var,
+} from '@/app/components/workflow/types'
+import { VarType } from '@/app/components/workflow/types'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+
+type ConditionVariableSelectorProps = {
+  valueSelector?: ValueSelector
+  varType?: VarType
+  availableNodes?: Node[]
+  nodesOutputVars?: NodeOutPutVar[]
+  onChange: (valueSelector: ValueSelector, varItem: Var) => void
+}
+
+const ConditionVariableSelector = ({
+  valueSelector = [],
+  varType = VarType.string,
+  availableNodes = [],
+  nodesOutputVars = [],
+  onChange,
+}: ConditionVariableSelectorProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const handleChange = useCallback((valueSelector: ValueSelector, varItem: Var) => {
+    onChange(valueSelector, varItem)
+    setOpen(false)
+  }, [onChange])
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 0,
+      }}
+    >
+      <PortalToFollowElemTrigger asChild onClick={() => setOpen(!open)}>
+        <div className="flex h-6 grow cursor-pointer items-center">
+          {
+            !!valueSelector.length && (
+              <VariableTag
+                valueSelector={valueSelector}
+                varType={varType}
+                availableNodes={availableNodes}
+                isShort
+              />
+            )
+          }
+          {
+            !valueSelector.length && (
+              <>
+                <div className='system-sm-regular flex grow items-center text-components-input-text-placeholder'>
+                  <Variable02 className='mr-1 h-4 w-4' />
+                  {t('workflow.nodes.knowledgeRetrieval.metadata.panel.select')}
+                </div>
+                <div className='system-2xs-medium flex h-5 shrink-0 items-center rounded-[5px] border border-divider-deep px-[5px] text-text-tertiary'>
+                  {varType}
+                </div>
+              </>
+            )
+          }
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[1000]'>
+        <div className='w-[296px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg'>
+          <VarReferenceVars
+            vars={nodesOutputVars}
+            isSupportFileVar
+            onChange={handleChange}
+          />
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default ConditionVariableSelector
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/index.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/index.tsx
new file mode 100644
index 0000000..4b129f4
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/index.tsx
@@ -0,0 +1,75 @@
+import { RiLoopLeftLine } from '@remixicon/react'
+import ConditionItem from './condition-item'
+import cn from '@/utils/classnames'
+import type { MetadataShape } from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+import { LogicalOperator } from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+
+type ConditionListProps = {
+  disabled?: boolean
+} & Omit<MetadataShape, 'handleAddCondition'>
+
+const ConditionList = ({
+  disabled,
+  metadataList = [],
+  metadataFilteringConditions = {
+    conditions: [],
+    logical_operator: LogicalOperator.and,
+  },
+  handleRemoveCondition,
+  handleToggleConditionLogicalOperator,
+  handleUpdateCondition,
+  availableStringVars,
+  availableStringNodesWithParent,
+  availableNumberVars,
+  availableNumberNodesWithParent,
+  isCommonVariable,
+  availableCommonNumberVars,
+  availableCommonStringVars,
+}: ConditionListProps) => {
+  const { conditions, logical_operator } = metadataFilteringConditions
+
+  return (
+    <div className={cn('relative')}>
+      {
+        conditions.length > 1 && (
+          <div className={cn(
+            'absolute bottom-0 left-0 top-0 w-[44px]',
+          )}>
+            <div className='absolute bottom-4 right-1 top-4 w-2.5 rounded-l-[8px] border border-r-0 border-divider-deep'></div>
+            <div className='absolute right-0 top-1/2 h-[29px] w-4 -translate-y-1/2 bg-components-panel-bg'></div>
+            <div
+              className='absolute right-1 top-1/2 flex h-[21px] -translate-y-1/2 cursor-pointer select-none items-center rounded-md border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-1 text-[10px] font-semibold text-text-accent-secondary shadow-xs'
+              onClick={() => handleToggleConditionLogicalOperator()}
+            >
+              {logical_operator.toUpperCase()}
+              <RiLoopLeftLine className='ml-0.5 h-3 w-3' />
+            </div>
+          </div>
+        )
+      }
+      <div className={cn(conditions.length > 1 && 'pl-[44px]')}>
+        {
+          conditions.map(condition => (
+            <ConditionItem
+              key={`${condition.id}`}
+              disabled={disabled}
+              condition={condition}
+              onUpdateCondition={handleUpdateCondition}
+              onRemoveCondition={handleRemoveCondition}
+              metadataList={metadataList}
+              availableStringVars={availableStringVars}
+              availableStringNodesWithParent={availableStringNodesWithParent}
+              availableNumberVars={availableNumberVars}
+              availableNumberNodesWithParent={availableNumberNodesWithParent}
+              isCommonVariable={isCommonVariable}
+              availableCommonStringVars={availableCommonStringVars}
+              availableCommonNumberVars={availableCommonNumberVars}
+            />
+          ))
+        }
+      </div>
+    </div>
+  )
+}
+
+export default ConditionList
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/utils.ts b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/utils.ts
new file mode 100644
index 0000000..6397023
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/utils.ts
@@ -0,0 +1,66 @@
+import {
+  ComparisonOperator,
+  MetadataFilteringVariableType,
+} from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+
+export const isEmptyRelatedOperator = (operator: ComparisonOperator) => {
+  return [ComparisonOperator.empty, ComparisonOperator.notEmpty, ComparisonOperator.isNull, ComparisonOperator.isNotNull, ComparisonOperator.exists, ComparisonOperator.notExists].includes(operator)
+}
+
+const notTranslateKey = [
+  ComparisonOperator.equal, ComparisonOperator.notEqual,
+  ComparisonOperator.largerThan, ComparisonOperator.largerThanOrEqual,
+  ComparisonOperator.lessThan, ComparisonOperator.lessThanOrEqual,
+]
+
+export const isComparisonOperatorNeedTranslate = (operator?: ComparisonOperator) => {
+  if (!operator)
+    return false
+  return !notTranslateKey.includes(operator)
+}
+
+export const getOperators = (type?: MetadataFilteringVariableType) => {
+  switch (type) {
+    case MetadataFilteringVariableType.string:
+    case MetadataFilteringVariableType.select:
+      return [
+        ComparisonOperator.is,
+        ComparisonOperator.isNot,
+        ComparisonOperator.contains,
+        ComparisonOperator.notContains,
+        ComparisonOperator.startWith,
+        ComparisonOperator.endWith,
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+    case MetadataFilteringVariableType.number:
+      return [
+        ComparisonOperator.equal,
+        ComparisonOperator.notEqual,
+        ComparisonOperator.largerThan,
+        ComparisonOperator.lessThan,
+        ComparisonOperator.largerThanOrEqual,
+        ComparisonOperator.lessThanOrEqual,
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+    default:
+      return [
+        ComparisonOperator.is,
+        ComparisonOperator.before,
+        ComparisonOperator.after,
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+  }
+}
+
+export const comparisonOperatorNotRequireValue = (operator?: ComparisonOperator) => {
+  if (!operator)
+    return false
+
+  return [ComparisonOperator.empty, ComparisonOperator.notEmpty, ComparisonOperator.isNull, ComparisonOperator.isNotNull, ComparisonOperator.exists, ComparisonOperator.notExists].includes(operator)
+}
+
+export const VARIABLE_REGEX = /\{\{(#[a-zA-Z0-9_-]{1,50}(\.[a-zA-Z_]\w{0,29}){1,10}#)\}\}/gi
+export const COMMON_VARIABLE_REGEX = /\{\{([a-zA-Z0-9_-]{1,50})\}\}/gi
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-filter/index.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-filter/index.tsx
new file mode 100644
index 0000000..8ea313d
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-filter/index.tsx
@@ -0,0 +1,105 @@
+import {
+  useCallback,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import MetadataTrigger from '../metadata-trigger'
+import MetadataFilterSelector from './metadata-filter-selector'
+import Collapse from '@/app/components/workflow/nodes/_base/components/collapse'
+import Tooltip from '@/app/components/base/tooltip'
+import type { MetadataShape } from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+import { MetadataFilteringModeEnum } from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal'
+import { noop } from 'lodash-es'
+
+type MetadataFilterProps = {
+  metadataFilterMode?: MetadataFilteringModeEnum
+  handleMetadataFilterModeChange: (mode: MetadataFilteringModeEnum) => void
+} & MetadataShape
+const MetadataFilter = ({
+  metadataFilterMode = MetadataFilteringModeEnum.disabled,
+  handleMetadataFilterModeChange,
+  metadataModelConfig,
+  handleMetadataModelChange,
+  handleMetadataCompletionParamsChange,
+  ...restProps
+}: MetadataFilterProps) => {
+  const { t } = useTranslation()
+  const [collapsed, setCollapsed] = useState(true)
+
+  const handleMetadataFilterModeChangeWrapped = useCallback((mode: MetadataFilteringModeEnum) => {
+    if (mode === MetadataFilteringModeEnum.automatic)
+      setCollapsed(false)
+
+    handleMetadataFilterModeChange(mode)
+  }, [handleMetadataFilterModeChange])
+
+  return (
+    <Collapse
+      disabled={metadataFilterMode === MetadataFilteringModeEnum.disabled || metadataFilterMode === MetadataFilteringModeEnum.manual}
+      collapsed={collapsed}
+      onCollapse={setCollapsed}
+      hideCollapseIcon
+      trigger={collapseIcon => (
+        <div className='flex grow items-center justify-between pr-4'>
+          <div className='flex items-center'>
+            <div className='system-sm-semibold-uppercase mr-0.5 text-text-secondary'>
+              {t('workflow.nodes.knowledgeRetrieval.metadata.title')}
+            </div>
+            <Tooltip
+              popupContent={(
+                <div className='w-[200px]'>
+                  {t('workflow.nodes.knowledgeRetrieval.metadata.tip')}
+                </div>
+              )}
+            />
+            {collapseIcon}
+          </div>
+          <div className='flex items-center'>
+            <MetadataFilterSelector
+              value={metadataFilterMode}
+              onSelect={handleMetadataFilterModeChangeWrapped}
+            />
+            {
+              metadataFilterMode === MetadataFilteringModeEnum.manual && (
+                <div className='ml-1'>
+                  <MetadataTrigger {...restProps} />
+                </div>
+              )
+            }
+          </div>
+        </div>
+      )}
+    >
+      <>
+        {
+          metadataFilterMode === MetadataFilteringModeEnum.automatic && (
+            <>
+              <div className='body-xs-regular px-4 text-text-tertiary'>
+                {t('workflow.nodes.knowledgeRetrieval.metadata.options.automatic.desc')}
+              </div>
+              <div className='mt-1 px-4'>
+                <ModelParameterModal
+                  portalToFollowElemContentClassName='z-[50]'
+                  popupClassName='!w-[387px]'
+                  isInWorkflow
+                  isAdvancedMode={true}
+                  mode={metadataModelConfig?.mode || 'chat'}
+                  provider={metadataModelConfig?.provider || ''}
+                  completionParams={metadataModelConfig?.completion_params || { temperature: 0.7 }}
+                  modelId={metadataModelConfig?.name || ''}
+                  setModel={handleMetadataModelChange || noop}
+                  onCompletionParamsChange={handleMetadataCompletionParamsChange || noop}
+                  hideDebugWithMultipleModel
+                  debugWithMultipleModel={false}
+                />
+              </div>
+            </>
+          )
+        }
+      </>
+    </Collapse>
+  )
+}
+
+export default MetadataFilter
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-filter/metadata-filter-selector.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-filter/metadata-filter-selector.tsx
new file mode 100644
index 0000000..7183e68
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-filter/metadata-filter-selector.tsx
@@ -0,0 +1,106 @@
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowDownSLine,
+  RiCheckLine,
+} from '@remixicon/react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Button from '@/app/components/base/button'
+import { MetadataFilteringModeEnum } from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+
+type MetadataFilterSelectorProps = {
+  value?: MetadataFilteringModeEnum
+  onSelect: (value: MetadataFilteringModeEnum) => void
+}
+const MetadataFilterSelector = ({
+  value = MetadataFilteringModeEnum.disabled,
+  onSelect,
+}: MetadataFilterSelectorProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const options = [
+    {
+      key: MetadataFilteringModeEnum.disabled,
+      value: t('workflow.nodes.knowledgeRetrieval.metadata.options.disabled.title'),
+      desc: t('workflow.nodes.knowledgeRetrieval.metadata.options.disabled.subTitle'),
+    },
+    {
+      key: MetadataFilteringModeEnum.automatic,
+      value: t('workflow.nodes.knowledgeRetrieval.metadata.options.automatic.title'),
+      desc: t('workflow.nodes.knowledgeRetrieval.metadata.options.automatic.subTitle'),
+    },
+    {
+      key: MetadataFilteringModeEnum.manual,
+      value: t('workflow.nodes.knowledgeRetrieval.metadata.options.manual.title'),
+      desc: t('workflow.nodes.knowledgeRetrieval.metadata.options.manual.subTitle'),
+    },
+  ]
+
+  const selectedOption = options.find(option => option.key === value)!
+
+  return (
+    <PortalToFollowElem
+      placement='bottom-end'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 0,
+      }}
+      open={open}
+      onOpenChange={setOpen}
+    >
+      <PortalToFollowElemTrigger
+        onClick={(e) => {
+          e.stopPropagation()
+          setOpen(!open)
+        }}
+        asChild
+      >
+        <Button
+          variant='secondary'
+          size='small'
+        >
+          {selectedOption.value}
+          <RiArrowDownSLine className='h-3.5 w-3.5' />
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-10'>
+        <div className='w-[280px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
+          {
+            options.map(option => (
+              <div
+                key={option.key}
+                className='flex cursor-pointer rounded-lg p-2 pr-3 hover:bg-state-base-hover'
+                onClick={() => {
+                  onSelect(option.key)
+                  setOpen(false)
+                }}
+              >
+                <div className='w-4 shrink-0'>
+                  {
+                    option.key === value && (
+                      <RiCheckLine className='h-4 w-4 text-text-accent' />
+                    )
+                  }
+                </div>
+                <div className='grow'>
+                  <div className='system-sm-semibold text-text-secondary'>
+                    {option.value}
+                  </div>
+                  <div className='system-xs-regular text-text-tertiary'>
+                    {option.desc}
+                  </div>
+                </div>
+              </div>
+            ))
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default MetadataFilterSelector
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-icon.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-icon.tsx
new file mode 100644
index 0000000..4a3f539
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-icon.tsx
@@ -0,0 +1,39 @@
+import { memo } from 'react'
+import {
+  RiHashtag,
+  RiTextSnippet,
+  RiTimeLine,
+} from '@remixicon/react'
+import { MetadataFilteringVariableType } from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+import cn from '@/utils/classnames'
+
+type MetadataIconProps = {
+  type?: MetadataFilteringVariableType
+  className?: string
+}
+const MetadataIcon = ({
+  type,
+  className,
+}: MetadataIconProps) => {
+  return (
+    <>
+      {
+        (type === MetadataFilteringVariableType.string || type === MetadataFilteringVariableType.select) && (
+          <RiTextSnippet className={cn('h-3.5 w-3.5', className)} />
+        )
+      }
+      {
+        type === MetadataFilteringVariableType.number && (
+          <RiHashtag className={cn('h-3.5 w-3.5', className)} />
+        )
+      }
+      {
+        type === MetadataFilteringVariableType.time && (
+          <RiTimeLine className={cn('h-3.5 w-3.5', className)} />
+        )
+      }
+    </>
+  )
+}
+
+export default memo(MetadataIcon)
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-panel.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-panel.tsx
new file mode 100644
index 0000000..fd390ab
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-panel.tsx
@@ -0,0 +1,51 @@
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import AddCondition from './add-condition'
+import ConditionList from './condition-list'
+import type { MetadataShape } from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+
+type MetadataPanelProps = {
+  onCancel: () => void
+} & MetadataShape
+const MetadataPanel = ({
+  metadataFilteringConditions,
+  metadataList,
+  onCancel,
+  handleAddCondition,
+  ...restProps
+}: MetadataPanelProps) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='w-[420px] rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-2xl'>
+      <div className='relative px-3 pt-3.5'>
+        <div className='system-xl-semibold text-text-primary'>
+          {t('workflow.nodes.knowledgeRetrieval.metadata.panel.title')}
+        </div>
+        <div
+          className='absolute bottom-0 right-2.5 flex h-8 w-8 cursor-pointer items-center justify-center'
+          onClick={onCancel}
+        >
+          <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+        </div>
+      </div>
+      <div className='px-1 py-2'>
+        <div className='px-3 py-1'>
+          <div className='pb-2'>
+            <ConditionList
+              metadataList={metadataList}
+              metadataFilteringConditions={metadataFilteringConditions}
+              {...restProps}
+            />
+          </div>
+          <AddCondition
+            metadataList={metadataList}
+            handleAddCondition={handleAddCondition}
+          />
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default MetadataPanel
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-trigger.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-trigger.tsx
new file mode 100644
index 0000000..3381a1f
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/metadata/metadata-trigger.tsx
@@ -0,0 +1,69 @@
+import {
+  useEffect,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiFilter3Line } from '@remixicon/react'
+import MetadataPanel from './metadata-panel'
+import Button from '@/app/components/base/button'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import type { MetadataShape } from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+
+const MetadataTrigger = ({
+  metadataFilteringConditions,
+  metadataList = [],
+  handleRemoveCondition,
+  selectedDatasetsLoaded,
+  ...restProps
+}: MetadataShape) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const conditions = metadataFilteringConditions?.conditions || []
+
+  useEffect(() => {
+    if (selectedDatasetsLoaded) {
+      conditions.forEach((condition) => {
+        if (!metadataList.find(metadata => metadata.name === condition.name))
+          handleRemoveCondition(condition.id)
+      })
+    }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [metadataList, handleRemoveCondition, selectedDatasetsLoaded])
+
+  return (
+    <PortalToFollowElem
+      placement='left'
+      offset={4}
+      open={open}
+      onOpenChange={setOpen}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(!open)}>
+        <Button
+          variant='secondary-accent'
+          size='small'
+        >
+          <RiFilter3Line className='mr-1 h-3.5 w-3.5' />
+          {t('workflow.nodes.knowledgeRetrieval.metadata.panel.conditions')}
+          <div className='system-2xs-medium-uppercase ml-1 flex items-center rounded-[5px] border border-divider-deep px-1 text-text-tertiary'>
+            {metadataFilteringConditions?.conditions.length || 0}
+          </div>
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-10'>
+        <MetadataPanel
+          metadataFilteringConditions={metadataFilteringConditions}
+          onCancel={() => setOpen(false)}
+          metadataList={metadataList}
+          handleRemoveCondition={handleRemoveCondition}
+          {...restProps}
+        />
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default MetadataTrigger
diff --git a/app/components/workflow/nodes/knowledge-retrieval/components/retrieval-config.tsx b/app/components/workflow/nodes/knowledge-retrieval/components/retrieval-config.tsx
new file mode 100644
index 0000000..8a3dc1e
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/components/retrieval-config.tsx
@@ -0,0 +1,156 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { RiEqualizer2Line } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import type { MultipleRetrievalConfig, SingleRetrievalConfig } from '../types'
+import type { ModelConfig } from '../../../types'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import ConfigRetrievalContent from '@/app/components/app/configuration/dataset-config/params-config/config-content'
+import { RETRIEVE_TYPE } from '@/types/app'
+import { DATASET_DEFAULT } from '@/config'
+import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import Button from '@/app/components/base/button'
+import type { DatasetConfigs } from '@/models/debug'
+import type { DataSet } from '@/models/datasets'
+
+type Props = {
+  payload: {
+    retrieval_mode: RETRIEVE_TYPE
+    multiple_retrieval_config?: MultipleRetrievalConfig
+    single_retrieval_config?: SingleRetrievalConfig
+  }
+  onRetrievalModeChange: (mode: RETRIEVE_TYPE) => void
+  onMultipleRetrievalConfigChange: (config: MultipleRetrievalConfig) => void
+  singleRetrievalModelConfig?: ModelConfig
+  onSingleRetrievalModelChange?: (config: ModelConfig) => void
+  onSingleRetrievalModelParamsChange?: (config: ModelConfig) => void
+  readonly?: boolean
+  openFromProps?: boolean
+  onOpenFromPropsChange?: (openFromProps: boolean) => void
+  selectedDatasets: DataSet[]
+}
+
+const RetrievalConfig: FC<Props> = ({
+  payload,
+  onRetrievalModeChange,
+  onMultipleRetrievalConfigChange,
+  singleRetrievalModelConfig,
+  onSingleRetrievalModelChange,
+  onSingleRetrievalModelParamsChange,
+  readonly,
+  openFromProps,
+  onOpenFromPropsChange,
+  selectedDatasets,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const mergedOpen = openFromProps !== undefined ? openFromProps : open
+
+  const handleOpen = useCallback((newOpen: boolean) => {
+    setOpen(newOpen)
+    onOpenFromPropsChange?.(newOpen)
+  }, [onOpenFromPropsChange])
+
+  const {
+    currentProvider: validRerankDefaultProvider,
+    currentModel: validRerankDefaultModel,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
+
+  const { multiple_retrieval_config } = payload
+  const handleChange = useCallback((configs: DatasetConfigs, isRetrievalModeChange?: boolean) => {
+    if (isRetrievalModeChange) {
+      onRetrievalModeChange(configs.retrieval_model)
+      return
+    }
+    onMultipleRetrievalConfigChange({
+      top_k: configs.top_k,
+      score_threshold: configs.score_threshold_enabled ? (configs.score_threshold ?? DATASET_DEFAULT.score_threshold) : null,
+      reranking_model: payload.retrieval_mode === RETRIEVE_TYPE.oneWay
+        ? undefined
+        : (!configs.reranking_model?.reranking_provider_name
+          ? {
+            provider: validRerankDefaultProvider?.provider || '',
+            model: validRerankDefaultModel?.model || '',
+          }
+          : {
+            provider: configs.reranking_model?.reranking_provider_name,
+            model: configs.reranking_model?.reranking_model_name,
+          }),
+      reranking_mode: configs.reranking_mode,
+      weights: configs.weights,
+      reranking_enable: configs.reranking_enable,
+    })
+  }, [onMultipleRetrievalConfigChange, payload.retrieval_mode, validRerankDefaultProvider, validRerankDefaultModel, onRetrievalModeChange])
+
+  return (
+    <PortalToFollowElem
+      open={mergedOpen}
+      onOpenChange={handleOpen}
+      placement='bottom-end'
+      offset={{
+        crossAxis: -2,
+      }}
+    >
+      <PortalToFollowElemTrigger
+        onClick={() => {
+          if (readonly)
+            return
+          handleOpen(!mergedOpen)
+        }}
+      >
+        <Button
+          variant='ghost'
+          size='small'
+          disabled={readonly}
+          className={cn(open && 'bg-components-button-ghost-bg-hover')}
+        >
+          <RiEqualizer2Line className='mr-1 h-3.5 w-3.5' />
+          {t('dataset.retrievalSettings')}
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent style={{ zIndex: 1001 }}>
+        <div className='w-[404px] rounded-2xl border border-components-panel-border bg-components-panel-bg  px-4 pb-4 pt-3  shadow-xl'>
+          <ConfigRetrievalContent
+            datasetConfigs={
+              {
+                retrieval_model: payload.retrieval_mode,
+                reranking_model: multiple_retrieval_config?.reranking_model?.provider
+                  ? {
+                    reranking_provider_name: multiple_retrieval_config.reranking_model?.provider,
+                    reranking_model_name: multiple_retrieval_config.reranking_model?.model,
+                  }
+                  : {
+                    reranking_provider_name: '',
+                    reranking_model_name: '',
+                  },
+                top_k: multiple_retrieval_config?.top_k || DATASET_DEFAULT.top_k,
+                score_threshold_enabled: !(multiple_retrieval_config?.score_threshold === undefined || multiple_retrieval_config.score_threshold === null),
+                score_threshold: multiple_retrieval_config?.score_threshold,
+                datasets: {
+                  datasets: [],
+                },
+                reranking_mode: multiple_retrieval_config?.reranking_mode,
+                weights: multiple_retrieval_config?.weights,
+                reranking_enable: multiple_retrieval_config?.reranking_enable,
+              }
+            }
+            onChange={handleChange}
+            isInWorkflow
+            singleRetrievalModelConfig={singleRetrievalModelConfig}
+            onSingleRetrievalModelChange={onSingleRetrievalModelChange}
+            onSingleRetrievalModelParamsChange={onSingleRetrievalModelParamsChange}
+            selectedDatasets={selectedDatasets}
+          />
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+export default React.memo(RetrievalConfig)
diff --git a/app/components/workflow/nodes/knowledge-retrieval/default.ts b/app/components/workflow/nodes/knowledge-retrieval/default.ts
new file mode 100644
index 0000000..09da8dd
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/default.ts
@@ -0,0 +1,57 @@
+import { BlockEnum } from '../../types'
+import type { NodeDefault } from '../../types'
+import type { KnowledgeRetrievalNodeType } from './types'
+import { checkoutRerankModelConfigedInRetrievalSettings } from './utils'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+import { DATASET_DEFAULT } from '@/config'
+import { RETRIEVE_TYPE } from '@/types/app'
+const i18nPrefix = 'workflow'
+
+const nodeDefault: NodeDefault<KnowledgeRetrievalNodeType> = {
+  defaultValue: {
+    query_variable_selector: [],
+    dataset_ids: [],
+    retrieval_mode: RETRIEVE_TYPE.multiWay,
+    multiple_retrieval_config: {
+      top_k: DATASET_DEFAULT.top_k,
+      score_threshold: undefined,
+      reranking_enable: false,
+    },
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: KnowledgeRetrievalNodeType, t: any) {
+    let errorMessages = ''
+    if (!errorMessages && (!payload.query_variable_selector || payload.query_variable_selector.length === 0))
+      errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.knowledgeRetrieval.queryVariable`) })
+
+    if (!errorMessages && (!payload.dataset_ids || payload.dataset_ids.length === 0))
+      errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.knowledgeRetrieval.knowledge`) })
+
+    if (!errorMessages && payload.retrieval_mode === RETRIEVE_TYPE.oneWay && !payload.single_retrieval_config?.model?.provider)
+      errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t('common.modelProvider.systemReasoningModel.key') })
+
+    const { _datasets, multiple_retrieval_config, retrieval_mode } = payload
+    if (retrieval_mode === RETRIEVE_TYPE.multiWay) {
+      const checked = checkoutRerankModelConfigedInRetrievalSettings(_datasets || [], multiple_retrieval_config)
+
+      if (!errorMessages && !checked)
+        errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.errorMsg.fields.rerankModel`) })
+    }
+
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/knowledge-retrieval/hooks.ts b/app/components/workflow/nodes/knowledge-retrieval/hooks.ts
new file mode 100644
index 0000000..139ac87
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/hooks.ts
@@ -0,0 +1,14 @@
+import { useMemo } from 'react'
+import { getSelectedDatasetsMode } from './utils'
+import type {
+  DataSet,
+  SelectedDatasetsMode,
+} from '@/models/datasets'
+
+export const useSelectedDatasetsMode = (datasets: DataSet[]) => {
+  const selectedDatasetsMode: SelectedDatasetsMode = useMemo(() => {
+    return getSelectedDatasetsMode(datasets)
+  }, [datasets])
+
+  return selectedDatasetsMode
+}
diff --git a/app/components/workflow/nodes/knowledge-retrieval/node.tsx b/app/components/workflow/nodes/knowledge-retrieval/node.tsx
new file mode 100644
index 0000000..c24c3e0
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/node.tsx
@@ -0,0 +1,50 @@
+import { type FC, useEffect, useState } from 'react'
+import React from 'react'
+import type { KnowledgeRetrievalNodeType } from './types'
+import { Folder } from '@/app/components/base/icons/src/vender/solid/files'
+import type { NodeProps } from '@/app/components/workflow/types'
+import type { DataSet } from '@/models/datasets'
+import { useDatasetsDetailStore } from '../../datasets-detail-store/store'
+
+const Node: FC<NodeProps<KnowledgeRetrievalNodeType>> = ({
+  data,
+}) => {
+  const [selectedDatasets, setSelectedDatasets] = useState<DataSet[]>([])
+  const datasetsDetail = useDatasetsDetailStore(s => s.datasetsDetail)
+
+  useEffect(() => {
+    if (data.dataset_ids?.length > 0) {
+      const dataSetsWithDetail = data.dataset_ids.reduce<DataSet[]>((acc, id) => {
+        if (datasetsDetail[id])
+          acc.push(datasetsDetail[id])
+        return acc
+      }, [])
+      setSelectedDatasets(dataSetsWithDetail)
+    }
+    else {
+      setSelectedDatasets([])
+    }
+  }, [data.dataset_ids, datasetsDetail])
+
+  if (!selectedDatasets.length)
+    return null
+
+  return (
+    <div className='mb-1 px-3 py-1'>
+      <div className='space-y-0.5'>
+        {selectedDatasets.map(({ id, name }) => (
+          <div key={id} className='flex h-[26px] items-center rounded-md bg-workflow-block-parma-bg  px-1 text-xs font-normal text-gray-700'>
+            <div className='mr-1 shrink-0 rounded-md border-[0.5px] border-[#E0EAFF] bg-[#F5F8FF] p-1'>
+              <Folder className='h-3 w-3 text-[#444CE7]' />
+            </div>
+            <div className='system-xs-regular w-0 grow truncate text-text-secondary'>
+              {name}
+            </div>
+          </div>
+        ))}
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Node)
diff --git a/app/components/workflow/nodes/knowledge-retrieval/panel.tsx b/app/components/workflow/nodes/knowledge-retrieval/panel.tsx
new file mode 100644
index 0000000..3b5eefd
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/panel.tsx
@@ -0,0 +1,221 @@
+import type { FC } from 'react'
+import {
+  memo,
+  useCallback,
+  useMemo,
+} from 'react'
+import { intersectionBy } from 'lodash-es'
+import { useTranslation } from 'react-i18next'
+import VarReferencePicker from '../_base/components/variable/var-reference-picker'
+import useConfig from './use-config'
+import RetrievalConfig from './components/retrieval-config'
+import AddKnowledge from './components/add-dataset'
+import DatasetList from './components/dataset-list'
+import MetadataFilter from './components/metadata/metadata-filter'
+import type { KnowledgeRetrievalNodeType } from './types'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import Split from '@/app/components/workflow/nodes/_base/components/split'
+import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
+import { InputVarType, type NodePanelProps } from '@/app/components/workflow/types'
+import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
+import ResultPanel from '@/app/components/workflow/run/result-panel'
+
+const i18nPrefix = 'workflow.nodes.knowledgeRetrieval'
+
+const Panel: FC<NodePanelProps<KnowledgeRetrievalNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    readOnly,
+    inputs,
+    handleQueryVarChange,
+    filterVar,
+    handleModelChanged,
+    handleCompletionParamsChange,
+    handleRetrievalModeChange,
+    handleMultipleRetrievalConfigChange,
+    selectedDatasets,
+    selectedDatasetsLoaded,
+    handleOnDatasetsChange,
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    query,
+    setQuery,
+    runResult,
+    rerankModelOpen,
+    setRerankModelOpen,
+    handleAddCondition,
+    handleMetadataFilterModeChange,
+    handleRemoveCondition,
+    handleToggleConditionLogicalOperator,
+    handleUpdateCondition,
+    handleMetadataModelChange,
+    handleMetadataCompletionParamsChange,
+    availableStringVars,
+    availableStringNodesWithParent,
+    availableNumberVars,
+    availableNumberNodesWithParent,
+  } = useConfig(id, data)
+
+  const handleOpenFromPropsChange = useCallback((openFromProps: boolean) => {
+    setRerankModelOpen(openFromProps)
+  }, [setRerankModelOpen])
+
+  const metadataList = useMemo(() => {
+    return intersectionBy(...selectedDatasets.filter((dataset) => {
+      return !!dataset.doc_metadata
+    }).map((dataset) => {
+      return dataset.doc_metadata!
+    }), 'name')
+  }, [selectedDatasets])
+
+  return (
+    <div className='pt-2'>
+      <div className='space-y-4 px-4 pb-2'>
+        {/* {JSON.stringify(inputs, null, 2)} */}
+        <Field
+          title={t(`${i18nPrefix}.queryVariable`)}
+          required
+        >
+          <VarReferencePicker
+            nodeId={id}
+            readonly={readOnly}
+            isShowNodeName
+            value={inputs.query_variable_selector}
+            onChange={handleQueryVarChange}
+            filterVar={filterVar}
+          />
+        </Field>
+
+        <Field
+          title={t(`${i18nPrefix}.knowledge`)}
+          required
+          operations={
+            <div className='flex items-center space-x-1'>
+              <RetrievalConfig
+                payload={{
+                  retrieval_mode: inputs.retrieval_mode,
+                  multiple_retrieval_config: inputs.multiple_retrieval_config,
+                  single_retrieval_config: inputs.single_retrieval_config,
+                }}
+                onRetrievalModeChange={handleRetrievalModeChange}
+                onMultipleRetrievalConfigChange={handleMultipleRetrievalConfigChange}
+                singleRetrievalModelConfig={inputs.single_retrieval_config?.model}
+                onSingleRetrievalModelChange={handleModelChanged as any}
+                onSingleRetrievalModelParamsChange={handleCompletionParamsChange}
+                readonly={readOnly || !selectedDatasets.length}
+                openFromProps={rerankModelOpen}
+                onOpenFromPropsChange={handleOpenFromPropsChange}
+                selectedDatasets={selectedDatasets}
+              />
+              {!readOnly && (<div className='h-3 w-px bg-divider-regular'></div>)}
+              {!readOnly && (
+                <AddKnowledge
+                  selectedIds={inputs.dataset_ids}
+                  onChange={handleOnDatasetsChange}
+                />
+              )}
+            </div>
+          }
+        >
+          <DatasetList
+            list={selectedDatasets}
+            onChange={handleOnDatasetsChange}
+            readonly={readOnly}
+          />
+        </Field>
+      </div>
+      <div className='mb-2 py-2'>
+        <MetadataFilter
+          metadataList={metadataList}
+          selectedDatasetsLoaded={selectedDatasetsLoaded}
+          metadataFilterMode={inputs.metadata_filtering_mode}
+          metadataFilteringConditions={inputs.metadata_filtering_conditions}
+          handleAddCondition={handleAddCondition}
+          handleMetadataFilterModeChange={handleMetadataFilterModeChange}
+          handleRemoveCondition={handleRemoveCondition}
+          handleToggleConditionLogicalOperator={handleToggleConditionLogicalOperator}
+          handleUpdateCondition={handleUpdateCondition}
+          metadataModelConfig={inputs.metadata_model_config}
+          handleMetadataModelChange={handleMetadataModelChange}
+          handleMetadataCompletionParamsChange={handleMetadataCompletionParamsChange}
+          availableStringVars={availableStringVars}
+          availableStringNodesWithParent={availableStringNodesWithParent}
+          availableNumberVars={availableNumberVars}
+          availableNumberNodesWithParent={availableNumberNodesWithParent}
+        />
+      </div>
+      <Split />
+      <div>
+        <OutputVars>
+          <>
+            <VarItem
+              name='result'
+              type='Array[Object]'
+              description={t(`${i18nPrefix}.outputVars.output`)}
+              subItems={[
+                {
+                  name: 'content',
+                  type: 'string',
+                  description: t(`${i18nPrefix}.outputVars.content`),
+                },
+                // url, title, link like bing search reference result: link, link page title, link page icon
+                {
+                  name: 'title',
+                  type: 'string',
+                  description: t(`${i18nPrefix}.outputVars.title`),
+                },
+                {
+                  name: 'url',
+                  type: 'string',
+                  description: t(`${i18nPrefix}.outputVars.url`),
+                },
+                {
+                  name: 'icon',
+                  type: 'string',
+                  description: t(`${i18nPrefix}.outputVars.icon`),
+                },
+                {
+                  name: 'metadata',
+                  type: 'object',
+                  description: t(`${i18nPrefix}.outputVars.metadata`),
+                },
+              ]}
+            />
+
+          </>
+        </OutputVars>
+        {isShowSingleRun && (
+          <BeforeRunForm
+            nodeName={inputs.title}
+            onHide={hideSingleRun}
+            forms={[
+              {
+                inputs: [{
+                  label: t(`${i18nPrefix}.queryVariable`)!,
+                  variable: 'query',
+                  type: InputVarType.paragraph,
+                  required: true,
+                }],
+                values: { query },
+                onChange: keyValue => setQuery(keyValue.query),
+              },
+            ]}
+            runningStatus={runningStatus}
+            onRun={handleRun}
+            onStop={handleStop}
+            result={<ResultPanel {...runResult} showSteps={false} />}
+          />
+        )}
+      </div>
+    </div>
+  )
+}
+
+export default memo(Panel)
diff --git a/app/components/workflow/nodes/knowledge-retrieval/types.ts b/app/components/workflow/nodes/knowledge-retrieval/types.ts
new file mode 100644
index 0000000..1cae4ec
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/types.ts
@@ -0,0 +1,133 @@
+import type {
+  CommonNodeType,
+  ModelConfig,
+  Node,
+  NodeOutPutVar,
+  ValueSelector,
+} from '@/app/components/workflow/types'
+import type { RETRIEVE_TYPE } from '@/types/app'
+import type {
+  DataSet,
+  MetadataInDoc,
+  RerankingModeEnum,
+  WeightedScoreEnum,
+} from '@/models/datasets'
+
+export type MultipleRetrievalConfig = {
+  top_k: number
+  score_threshold: number | null | undefined
+  reranking_model?: {
+    provider: string
+    model: string
+  }
+  reranking_mode?: RerankingModeEnum
+  weights?: {
+    weight_type: WeightedScoreEnum
+    vector_setting: {
+      vector_weight: number
+      embedding_provider_name: string
+      embedding_model_name: string
+    }
+    keyword_setting: {
+      keyword_weight: number
+    }
+  }
+  reranking_enable?: boolean
+}
+
+export type SingleRetrievalConfig = {
+  model: ModelConfig
+}
+
+export enum LogicalOperator {
+  and = 'and',
+  or = 'or',
+}
+
+export enum ComparisonOperator {
+  contains = 'contains',
+  notContains = 'not contains',
+  startWith = 'start with',
+  endWith = 'end with',
+  is = 'is',
+  isNot = 'is not',
+  empty = 'empty',
+  notEmpty = 'not empty',
+  equal = '=',
+  notEqual = '鈮�',
+  largerThan = '>',
+  lessThan = '<',
+  largerThanOrEqual = '鈮�',
+  lessThanOrEqual = '鈮�',
+  isNull = 'is null',
+  isNotNull = 'is not null',
+  in = 'in',
+  notIn = 'not in',
+  allOf = 'all of',
+  exists = 'exists',
+  notExists = 'not exists',
+  before = 'before',
+  after = 'after',
+}
+
+export enum MetadataFilteringModeEnum {
+  disabled = 'disabled',
+  automatic = 'automatic',
+  manual = 'manual',
+}
+
+export enum MetadataFilteringVariableType {
+  string = 'string',
+  number = 'number',
+  time = 'time',
+  select = 'select',
+}
+
+export type MetadataFilteringCondition = {
+  id: string
+  name: string
+  comparison_operator: ComparisonOperator
+  value?: string | number
+}
+
+export type MetadataFilteringConditions = {
+  logical_operator: LogicalOperator
+  conditions: MetadataFilteringCondition[]
+}
+
+export type KnowledgeRetrievalNodeType = CommonNodeType & {
+  query_variable_selector: ValueSelector
+  dataset_ids: string[]
+  retrieval_mode: RETRIEVE_TYPE
+  multiple_retrieval_config?: MultipleRetrievalConfig
+  single_retrieval_config?: SingleRetrievalConfig
+  _datasets?: DataSet[]
+  metadata_filtering_mode?: MetadataFilteringModeEnum
+  metadata_filtering_conditions?: MetadataFilteringConditions
+  metadata_model_config?: ModelConfig
+}
+
+export type HandleAddCondition = (metadataItem: MetadataInDoc) => void
+export type HandleRemoveCondition = (id: string) => void
+export type HandleUpdateCondition = (id: string, newCondition: MetadataFilteringCondition) => void
+export type HandleToggleConditionLogicalOperator = () => void
+
+export type MetadataShape = {
+  metadataList?: MetadataInDoc[]
+  selectedDatasetsLoaded?: boolean
+  metadataFilteringConditions?: MetadataFilteringConditions
+  handleAddCondition: HandleAddCondition
+  handleRemoveCondition: HandleRemoveCondition
+  handleToggleConditionLogicalOperator: HandleToggleConditionLogicalOperator
+  handleUpdateCondition: HandleUpdateCondition
+  metadataModelConfig?: ModelConfig
+  handleMetadataModelChange?: (model: { modelId: string; provider: string; mode?: string; features?: string[] }) => void
+  handleMetadataCompletionParamsChange?: (params: Record<string, any>) => void
+  availableStringVars?: NodeOutPutVar[]
+  availableStringNodesWithParent?: Node[]
+  availableNumberVars?: NodeOutPutVar[]
+  availableNumberNodesWithParent?: Node[]
+  isCommonVariable?: boolean
+  availableCommonStringVars?: { name: string; type: string; }[]
+  availableCommonNumberVars?: { name: string; type: string; }[]
+}
diff --git a/app/components/workflow/nodes/knowledge-retrieval/use-config.ts b/app/components/workflow/nodes/knowledge-retrieval/use-config.ts
new file mode 100644
index 0000000..42aa7de
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/use-config.ts
@@ -0,0 +1,452 @@
+import {
+  useCallback,
+  useEffect,
+  useRef,
+  useState,
+} from 'react'
+import produce from 'immer'
+import { isEqual } from 'lodash-es'
+import { v4 as uuid4 } from 'uuid'
+import type { ValueSelector, Var } from '../../types'
+import { BlockEnum, VarType } from '../../types'
+import {
+  useIsChatMode,
+  useNodesReadOnly,
+  useWorkflow,
+} from '../../hooks'
+import type {
+  HandleAddCondition,
+  HandleRemoveCondition,
+  HandleToggleConditionLogicalOperator,
+  HandleUpdateCondition,
+  KnowledgeRetrievalNodeType,
+  MetadataFilteringModeEnum,
+  MultipleRetrievalConfig,
+} from './types'
+import {
+  ComparisonOperator,
+  LogicalOperator,
+  MetadataFilteringVariableType,
+} from './types'
+import {
+  getMultipleRetrievalConfig,
+  getSelectedDatasetsMode,
+} from './utils'
+import { RETRIEVE_TYPE } from '@/types/app'
+import { DATASET_DEFAULT } from '@/config'
+import type { DataSet } from '@/models/datasets'
+import { fetchDatasets } from '@/service/datasets'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run'
+import { useCurrentProviderAndModel, useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
+import { useDatasetsDetailStore } from '../../datasets-detail-store/store'
+
+const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const isChatMode = useIsChatMode()
+  const { getBeforeNodesInSameBranch } = useWorkflow()
+  const startNode = getBeforeNodesInSameBranch(id).find(node => node.data.type === BlockEnum.Start)
+  const startNodeId = startNode?.id
+  const { inputs, setInputs: doSetInputs } = useNodeCrud<KnowledgeRetrievalNodeType>(id, payload)
+  const updateDatasetsDetail = useDatasetsDetailStore(s => s.updateDatasetsDetail)
+
+  const inputRef = useRef(inputs)
+
+  const setInputs = useCallback((s: KnowledgeRetrievalNodeType) => {
+    const newInputs = produce(s, (draft) => {
+      if (s.retrieval_mode === RETRIEVE_TYPE.multiWay)
+        delete draft.single_retrieval_config
+      else
+        delete draft.multiple_retrieval_config
+    })
+    // not work in pass to draft...
+    doSetInputs(newInputs)
+    inputRef.current = newInputs
+  }, [doSetInputs])
+
+  const handleQueryVarChange = useCallback((newVar: ValueSelector | string) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.query_variable_selector = newVar as ValueSelector
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const {
+    currentProvider,
+    currentModel,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.textGeneration)
+
+  const {
+    modelList: rerankModelList,
+    defaultModel: rerankDefaultModel,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
+
+  const {
+    currentModel: currentRerankModel,
+    currentProvider: currentRerankProvider,
+  } = useCurrentProviderAndModel(
+    rerankModelList,
+    rerankDefaultModel
+      ? {
+        ...rerankDefaultModel,
+        provider: rerankDefaultModel.provider.provider,
+      }
+      : undefined,
+  )
+
+  const handleModelChanged = useCallback((model: { provider: string; modelId: string; mode?: string }) => {
+    const newInputs = produce(inputRef.current, (draft) => {
+      if (!draft.single_retrieval_config) {
+        draft.single_retrieval_config = {
+          model: {
+            provider: '',
+            name: '',
+            mode: '',
+            completion_params: {},
+          },
+        }
+      }
+      const draftModel = draft.single_retrieval_config?.model
+      draftModel.provider = model.provider
+      draftModel.name = model.modelId
+      draftModel.mode = model.mode!
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  const handleCompletionParamsChange = useCallback((newParams: Record<string, any>) => {
+    // inputRef.current.single_retrieval_config?.model is old  when change the provider...
+    if (isEqual(newParams, inputRef.current.single_retrieval_config?.model.completion_params))
+      return
+
+    const newInputs = produce(inputRef.current, (draft) => {
+      if (!draft.single_retrieval_config) {
+        draft.single_retrieval_config = {
+          model: {
+            provider: '',
+            name: '',
+            mode: '',
+            completion_params: {},
+          },
+        }
+      }
+      draft.single_retrieval_config.model.completion_params = newParams
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  // set defaults models
+  useEffect(() => {
+    const inputs = inputRef.current
+    if (inputs.retrieval_mode === RETRIEVE_TYPE.multiWay && inputs.multiple_retrieval_config?.reranking_model?.provider && currentRerankModel && rerankDefaultModel)
+      return
+
+    if (inputs.retrieval_mode === RETRIEVE_TYPE.oneWay && inputs.single_retrieval_config?.model?.provider)
+      return
+
+    const newInput = produce(inputs, (draft) => {
+      if (currentProvider?.provider && currentModel?.model) {
+        const hasSetModel = draft.single_retrieval_config?.model?.provider
+        if (!hasSetModel) {
+          draft.single_retrieval_config = {
+            model: {
+              provider: currentProvider?.provider,
+              name: currentModel?.model,
+              mode: currentModel?.model_properties?.mode as string,
+              completion_params: {},
+            },
+          }
+        }
+      }
+      const multipleRetrievalConfig = draft.multiple_retrieval_config
+      draft.multiple_retrieval_config = {
+        top_k: multipleRetrievalConfig?.top_k || DATASET_DEFAULT.top_k,
+        score_threshold: multipleRetrievalConfig?.score_threshold,
+        reranking_model: multipleRetrievalConfig?.reranking_model,
+        reranking_mode: multipleRetrievalConfig?.reranking_mode,
+        weights: multipleRetrievalConfig?.weights,
+        reranking_enable: multipleRetrievalConfig?.reranking_enable !== undefined
+          ? multipleRetrievalConfig.reranking_enable
+          : Boolean(currentRerankModel && rerankDefaultModel),
+      }
+    })
+    setInputs(newInput)
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [currentProvider?.provider, currentModel, currentRerankModel, rerankDefaultModel])
+  const [selectedDatasets, setSelectedDatasets] = useState<DataSet[]>([])
+  const [rerankModelOpen, setRerankModelOpen] = useState(false)
+  const handleRetrievalModeChange = useCallback((newMode: RETRIEVE_TYPE) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.retrieval_mode = newMode
+      if (newMode === RETRIEVE_TYPE.multiWay) {
+        const multipleRetrievalConfig = draft.multiple_retrieval_config
+        draft.multiple_retrieval_config = getMultipleRetrievalConfig(multipleRetrievalConfig!, selectedDatasets, selectedDatasets, {
+          provider: currentRerankProvider?.provider,
+          model: currentRerankModel?.model,
+        })
+      }
+      else {
+        const hasSetModel = draft.single_retrieval_config?.model?.provider
+        if (!hasSetModel) {
+          draft.single_retrieval_config = {
+            model: {
+              provider: currentProvider?.provider || '',
+              name: currentModel?.model || '',
+              mode: currentModel?.model_properties?.mode as string,
+              completion_params: {},
+            },
+          }
+        }
+      }
+    })
+    setInputs(newInputs)
+  }, [currentModel?.model, currentModel?.model_properties?.mode, currentProvider?.provider, inputs, setInputs, selectedDatasets, currentRerankModel, currentRerankProvider])
+
+  const handleMultipleRetrievalConfigChange = useCallback((newConfig: MultipleRetrievalConfig) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.multiple_retrieval_config = getMultipleRetrievalConfig(newConfig!, selectedDatasets, selectedDatasets, {
+        provider: currentRerankProvider?.provider,
+        model: currentRerankModel?.model,
+      })
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs, selectedDatasets, currentRerankModel, currentRerankProvider])
+
+  const [selectedDatasetsLoaded, setSelectedDatasetsLoaded] = useState(false)
+  // datasets
+  useEffect(() => {
+    (async () => {
+      const inputs = inputRef.current
+      const datasetIds = inputs.dataset_ids
+      if (datasetIds?.length > 0) {
+        const { data: dataSetsWithDetail } = await fetchDatasets({ url: '/datasets', params: { page: 1, ids: datasetIds } as any })
+        setSelectedDatasets(dataSetsWithDetail)
+      }
+      const newInputs = produce(inputs, (draft) => {
+        draft.dataset_ids = datasetIds
+      })
+      setInputs(newInputs)
+      setSelectedDatasetsLoaded(true)
+    })()
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  useEffect(() => {
+    const inputs = inputRef.current
+    let query_variable_selector: ValueSelector = inputs.query_variable_selector
+    if (isChatMode && inputs.query_variable_selector.length === 0 && startNodeId)
+      query_variable_selector = [startNodeId, 'sys.query']
+
+    setInputs(produce(inputs, (draft) => {
+      draft.query_variable_selector = query_variable_selector
+    }))
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  const handleOnDatasetsChange = useCallback((newDatasets: DataSet[]) => {
+    const {
+      mixtureHighQualityAndEconomic,
+      mixtureInternalAndExternal,
+      inconsistentEmbeddingModel,
+      allInternal,
+      allExternal,
+    } = getSelectedDatasetsMode(newDatasets)
+    const newInputs = produce(inputs, (draft) => {
+      draft.dataset_ids = newDatasets.map(d => d.id)
+
+      if (payload.retrieval_mode === RETRIEVE_TYPE.multiWay && newDatasets.length > 0) {
+        const multipleRetrievalConfig = draft.multiple_retrieval_config
+        draft.multiple_retrieval_config = getMultipleRetrievalConfig(multipleRetrievalConfig!, newDatasets, selectedDatasets, {
+          provider: currentRerankProvider?.provider,
+          model: currentRerankModel?.model,
+        })
+      }
+    })
+    updateDatasetsDetail(newDatasets)
+    setInputs(newInputs)
+    setSelectedDatasets(newDatasets)
+
+    if (
+      (allInternal && (mixtureHighQualityAndEconomic || inconsistentEmbeddingModel))
+      || mixtureInternalAndExternal
+      || allExternal
+    )
+      setRerankModelOpen(true)
+  }, [inputs, setInputs, payload.retrieval_mode, selectedDatasets, currentRerankModel, currentRerankProvider, updateDatasetsDetail])
+
+  const filterVar = useCallback((varPayload: Var) => {
+    return varPayload.type === VarType.string
+  }, [])
+
+  // single run
+  const {
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runInputData,
+    setRunInputData,
+    runResult,
+  } = useOneStepRun<KnowledgeRetrievalNodeType>({
+    id,
+    data: inputs,
+    defaultRunInputData: {
+      query: '',
+    },
+  })
+
+  const query = runInputData.query
+  const setQuery = useCallback((newQuery: string) => {
+    setRunInputData({
+      ...runInputData,
+      query: newQuery,
+    })
+  }, [runInputData, setRunInputData])
+
+  const handleMetadataFilterModeChange = useCallback((newMode: MetadataFilteringModeEnum) => {
+    setInputs(produce(inputRef.current, (draft) => {
+      draft.metadata_filtering_mode = newMode
+    }))
+  }, [setInputs])
+
+  const handleAddCondition = useCallback<HandleAddCondition>(({ name, type }) => {
+    let operator: ComparisonOperator = ComparisonOperator.is
+
+    if (type === MetadataFilteringVariableType.number)
+      operator = ComparisonOperator.equal
+
+    const newCondition = {
+      id: uuid4(),
+      name,
+      comparison_operator: operator,
+    }
+
+    const newInputs = produce(inputRef.current, (draft) => {
+      if (draft.metadata_filtering_conditions) {
+        draft.metadata_filtering_conditions.conditions.push(newCondition)
+      }
+      else {
+        draft.metadata_filtering_conditions = {
+          logical_operator: LogicalOperator.and,
+          conditions: [newCondition],
+        }
+      }
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  const handleRemoveCondition = useCallback<HandleRemoveCondition>((id) => {
+    const conditions = inputRef.current.metadata_filtering_conditions?.conditions || []
+    const index = conditions.findIndex(c => c.id === id)
+    const newInputs = produce(inputRef.current, (draft) => {
+      if (index > -1)
+        draft.metadata_filtering_conditions?.conditions.splice(index, 1)
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  const handleUpdateCondition = useCallback<HandleUpdateCondition>((id, newCondition) => {
+    const conditions = inputRef.current.metadata_filtering_conditions?.conditions || []
+    const index = conditions.findIndex(c => c.id === id)
+    const newInputs = produce(inputRef.current, (draft) => {
+      if (index > -1)
+        draft.metadata_filtering_conditions!.conditions[index] = newCondition
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  const handleToggleConditionLogicalOperator = useCallback<HandleToggleConditionLogicalOperator>(() => {
+    const oldLogicalOperator = inputRef.current.metadata_filtering_conditions?.logical_operator
+    const newLogicalOperator = oldLogicalOperator === LogicalOperator.and ? LogicalOperator.or : LogicalOperator.and
+    const newInputs = produce(inputRef.current, (draft) => {
+      draft.metadata_filtering_conditions!.logical_operator = newLogicalOperator
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  const handleMetadataModelChange = useCallback((model: { provider: string; modelId: string; mode?: string }) => {
+    const newInputs = produce(inputRef.current, (draft) => {
+      draft.metadata_model_config = {
+        provider: model.provider,
+        name: model.modelId,
+        mode: model.mode || 'chat',
+        completion_params: draft.metadata_model_config?.completion_params || { temperature: 0.7 },
+      }
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  const handleMetadataCompletionParamsChange = useCallback((newParams: Record<string, any>) => {
+    const newInputs = produce(inputRef.current, (draft) => {
+      draft.metadata_model_config = {
+        ...draft.metadata_model_config!,
+        completion_params: newParams,
+      }
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  const filterStringVar = useCallback((varPayload: Var) => {
+    return [VarType.string].includes(varPayload.type)
+  }, [])
+
+  const {
+    availableVars: availableStringVars,
+    availableNodesWithParent: availableStringNodesWithParent,
+  } = useAvailableVarList(id, {
+    onlyLeafNodeVar: false,
+    filterVar: filterStringVar,
+  })
+
+  const filterNumberVar = useCallback((varPayload: Var) => {
+    return [VarType.number].includes(varPayload.type)
+  }, [])
+
+  const {
+    availableVars: availableNumberVars,
+    availableNodesWithParent: availableNumberNodesWithParent,
+  } = useAvailableVarList(id, {
+    onlyLeafNodeVar: false,
+    filterVar: filterNumberVar,
+  })
+
+  return {
+    readOnly,
+    inputs,
+    handleQueryVarChange,
+    filterVar,
+    handleRetrievalModeChange,
+    handleMultipleRetrievalConfigChange,
+    handleModelChanged,
+    handleCompletionParamsChange,
+    selectedDatasets: selectedDatasets.filter(d => d.name),
+    selectedDatasetsLoaded,
+    handleOnDatasetsChange,
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    query,
+    setQuery,
+    runResult,
+    rerankModelOpen,
+    setRerankModelOpen,
+    handleMetadataFilterModeChange,
+    handleUpdateCondition,
+    handleAddCondition,
+    handleRemoveCondition,
+    handleToggleConditionLogicalOperator,
+    handleMetadataModelChange,
+    handleMetadataCompletionParamsChange,
+    availableStringVars,
+    availableStringNodesWithParent,
+    availableNumberVars,
+    availableNumberNodesWithParent,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/knowledge-retrieval/utils.ts b/app/components/workflow/nodes/knowledge-retrieval/utils.ts
new file mode 100644
index 0000000..3821a7a
--- /dev/null
+++ b/app/components/workflow/nodes/knowledge-retrieval/utils.ts
@@ -0,0 +1,244 @@
+import {
+  uniq,
+  xorBy,
+} from 'lodash-es'
+import type { MultipleRetrievalConfig } from './types'
+import type {
+  DataSet,
+  SelectedDatasetsMode,
+} from '@/models/datasets'
+import {
+  DEFAULT_WEIGHTED_SCORE,
+  RerankingModeEnum,
+} from '@/models/datasets'
+import { RETRIEVE_METHOD } from '@/types/app'
+import { DATASET_DEFAULT } from '@/config'
+
+export const checkNodeValid = () => {
+  return true
+}
+
+export const getSelectedDatasetsMode = (datasets: DataSet[] = []) => {
+  if (datasets === null)
+    datasets = []
+  let allHighQuality = true
+  let allHighQualityVectorSearch = true
+  let allHighQualityFullTextSearch = true
+  let allEconomic = true
+  let mixtureHighQualityAndEconomic = true
+  let allExternal = true
+  let allInternal = true
+  let mixtureInternalAndExternal = true
+  let inconsistentEmbeddingModel = false
+  if (!datasets.length) {
+    allHighQuality = false
+    allHighQualityVectorSearch = false
+    allHighQualityFullTextSearch = false
+    allEconomic = false
+    mixtureHighQualityAndEconomic = false
+    allExternal = false
+    allInternal = false
+    mixtureInternalAndExternal = false
+  }
+  datasets.forEach((dataset) => {
+    if (dataset.indexing_technique === 'economy') {
+      allHighQuality = false
+      allHighQualityVectorSearch = false
+      allHighQualityFullTextSearch = false
+    }
+    if (dataset.indexing_technique === 'high_quality') {
+      allEconomic = false
+
+      if (dataset.retrieval_model_dict.search_method !== RETRIEVE_METHOD.semantic)
+        allHighQualityVectorSearch = false
+
+      if (dataset.retrieval_model_dict.search_method !== RETRIEVE_METHOD.fullText)
+        allHighQualityFullTextSearch = false
+    }
+    if (dataset.provider !== 'external') {
+      allExternal = false
+    }
+    else {
+      allInternal = false
+      allHighQuality = false
+      allHighQualityVectorSearch = false
+      allHighQualityFullTextSearch = false
+      mixtureHighQualityAndEconomic = false
+    }
+  })
+
+  if (allExternal || allInternal)
+    mixtureInternalAndExternal = false
+
+  if (allHighQuality || allEconomic)
+    mixtureHighQualityAndEconomic = false
+
+  if (allHighQuality)
+    inconsistentEmbeddingModel = uniq(datasets.map(item => item.embedding_model)).length > 1
+
+  return {
+    allHighQuality,
+    allHighQualityVectorSearch,
+    allHighQualityFullTextSearch,
+    allEconomic,
+    mixtureHighQualityAndEconomic,
+    allInternal,
+    allExternal,
+    mixtureInternalAndExternal,
+    inconsistentEmbeddingModel,
+  } as SelectedDatasetsMode
+}
+
+export const getMultipleRetrievalConfig = (
+  multipleRetrievalConfig: MultipleRetrievalConfig,
+  selectedDatasets: DataSet[],
+  originalDatasets: DataSet[],
+  validRerankModel?: { provider?: string; model?: string },
+) => {
+  const shouldSetWeightDefaultValue = xorBy(selectedDatasets, originalDatasets, 'id').length > 0
+  const rerankModelIsValid = validRerankModel?.provider && validRerankModel?.model
+
+  const {
+    allHighQuality,
+    allHighQualityVectorSearch,
+    allHighQualityFullTextSearch,
+    allEconomic,
+    mixtureHighQualityAndEconomic,
+    allInternal,
+    allExternal,
+    mixtureInternalAndExternal,
+    inconsistentEmbeddingModel,
+  } = getSelectedDatasetsMode(selectedDatasets)
+
+  const {
+    top_k = DATASET_DEFAULT.top_k,
+    score_threshold,
+    reranking_mode,
+    reranking_model,
+    weights,
+    reranking_enable,
+  } = multipleRetrievalConfig || { top_k: DATASET_DEFAULT.top_k }
+
+  const result = {
+    top_k,
+    score_threshold,
+    reranking_mode,
+    reranking_model,
+    weights,
+    reranking_enable: ((allInternal && allEconomic) || allExternal) ? reranking_enable : shouldSetWeightDefaultValue,
+  }
+
+  const setDefaultWeights = () => {
+    result.weights = {
+      vector_setting: {
+        vector_weight: allHighQualityVectorSearch
+          ? DEFAULT_WEIGHTED_SCORE.allHighQualityVectorSearch.semantic
+          : allHighQualityFullTextSearch
+            ? DEFAULT_WEIGHTED_SCORE.allHighQualityFullTextSearch.semantic
+            : DEFAULT_WEIGHTED_SCORE.other.semantic,
+        embedding_provider_name: selectedDatasets[0].embedding_model_provider,
+        embedding_model_name: selectedDatasets[0].embedding_model,
+      },
+      keyword_setting: {
+        keyword_weight: allHighQualityVectorSearch
+          ? DEFAULT_WEIGHTED_SCORE.allHighQualityVectorSearch.keyword
+          : allHighQualityFullTextSearch
+            ? DEFAULT_WEIGHTED_SCORE.allHighQualityFullTextSearch.keyword
+            : DEFAULT_WEIGHTED_SCORE.other.keyword,
+      },
+    }
+  }
+
+  if (allEconomic || mixtureHighQualityAndEconomic || inconsistentEmbeddingModel || allExternal || mixtureInternalAndExternal) {
+    result.reranking_mode = RerankingModeEnum.RerankingModel
+    if (!result.reranking_model?.provider || !result.reranking_model?.model) {
+      if (rerankModelIsValid) {
+        result.reranking_enable = reranking_enable !== false
+
+        result.reranking_model = {
+          provider: validRerankModel?.provider || '',
+          model: validRerankModel?.model || '',
+        }
+      }
+      else {
+        result.reranking_model = {
+          provider: '',
+          model: '',
+        }
+      }
+    }
+    else {
+      result.reranking_enable = reranking_enable !== false
+    }
+  }
+
+  if (allHighQuality && !inconsistentEmbeddingModel && allInternal) {
+    if (!reranking_mode) {
+      if (validRerankModel?.provider && validRerankModel?.model) {
+        result.reranking_mode = RerankingModeEnum.RerankingModel
+        result.reranking_enable = reranking_enable !== false
+
+        result.reranking_model = {
+          provider: validRerankModel.provider,
+          model: validRerankModel.model,
+        }
+      }
+      else {
+        result.reranking_mode = RerankingModeEnum.WeightedScore
+        setDefaultWeights()
+      }
+    }
+
+    if (reranking_mode === RerankingModeEnum.WeightedScore && !weights)
+      setDefaultWeights()
+
+    if (reranking_mode === RerankingModeEnum.WeightedScore && weights && shouldSetWeightDefaultValue) {
+      if (rerankModelIsValid) {
+        result.reranking_mode = RerankingModeEnum.RerankingModel
+        result.reranking_enable = reranking_enable !== false
+
+        result.reranking_model = {
+          provider: validRerankModel.provider || '',
+          model: validRerankModel.model || '',
+        }
+      }
+      else {
+        setDefaultWeights()
+      }
+    }
+    if (reranking_mode === RerankingModeEnum.RerankingModel && !rerankModelIsValid && shouldSetWeightDefaultValue) {
+      result.reranking_mode = RerankingModeEnum.WeightedScore
+      setDefaultWeights()
+    }
+  }
+
+  return result
+}
+
+export const checkoutRerankModelConfigedInRetrievalSettings = (
+  datasets: DataSet[],
+  multipleRetrievalConfig?: MultipleRetrievalConfig,
+) => {
+  if (!multipleRetrievalConfig)
+    return true
+
+  const {
+    allEconomic,
+    allExternal,
+  } = getSelectedDatasetsMode(datasets)
+
+  const {
+    reranking_enable,
+    reranking_mode,
+    reranking_model,
+  } = multipleRetrievalConfig
+
+  if (reranking_mode === RerankingModeEnum.RerankingModel && (!reranking_model?.provider || !reranking_model?.model)) {
+    if ((allEconomic || allExternal) && !reranking_enable)
+      return true
+
+    return false
+  }
+
+  return true
+}
diff --git a/app/components/workflow/nodes/list-operator/components/extract-input.tsx b/app/components/workflow/nodes/list-operator/components/extract-input.tsx
new file mode 100644
index 0000000..38931f0
--- /dev/null
+++ b/app/components/workflow/nodes/list-operator/components/extract-input.tsx
@@ -0,0 +1,51 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { VarType } from '../../../types'
+import type { Var } from '../../../types'
+import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
+import cn from '@/utils/classnames'
+import Input from '@/app/components/workflow/nodes/_base/components/input-support-select-var'
+
+type Props = {
+  nodeId: string
+  readOnly: boolean
+  value: string
+  onChange: (value: string) => void
+}
+
+const ExtractInput: FC<Props> = ({
+  nodeId,
+  readOnly,
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  const [isFocus, setIsFocus] = useState(false)
+  const { availableVars, availableNodesWithParent } = useAvailableVarList(nodeId, {
+    onlyLeafNodeVar: false,
+    filterVar: (varPayload: Var) => {
+      return [VarType.number].includes(varPayload.type)
+    },
+  })
+
+  return (
+    <div className='flex items-start  space-x-1'>
+      <Input
+        instanceId='http-extract-number'
+        className={cn(isFocus ? 'border-components-input-border-active bg-components-input-bg-active shadow-xs' : 'border-components-input-border-hover bg-components-input-bg-normal', 'w-0 grow rounded-lg border px-3 py-[6px]')}
+        value={value}
+        onChange={onChange}
+        readOnly={readOnly}
+        nodesOutputVars={availableVars}
+        availableNodes={availableNodesWithParent}
+        onFocusChange={setIsFocus}
+        placeholder={!readOnly ? t('workflow.nodes.http.extractListPlaceholder')! : ''}
+        placeholderClassName='!leading-[21px]'
+      />
+    </div >
+  )
+}
+export default React.memo(ExtractInput)
diff --git a/app/components/workflow/nodes/list-operator/components/filter-condition.tsx b/app/components/workflow/nodes/list-operator/components/filter-condition.tsx
new file mode 100644
index 0000000..0c261a7
--- /dev/null
+++ b/app/components/workflow/nodes/list-operator/components/filter-condition.tsx
@@ -0,0 +1,113 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import ConditionOperator from '../../if-else/components/condition-list/condition-operator'
+import { VarType } from '../../../types'
+import type { Condition } from '../types'
+import { ComparisonOperator } from '../../if-else/types'
+import { comparisonOperatorNotRequireValue, getOperators } from '../../if-else/utils'
+import SubVariablePicker from './sub-variable-picker'
+import Input from '@/app/components/base/input'
+import { FILE_TYPE_OPTIONS, TRANSFER_METHOD } from '@/app/components/workflow/nodes/constants'
+import { SimpleSelect as Select } from '@/app/components/base/select'
+
+const optionNameI18NPrefix = 'workflow.nodes.ifElse.optionName'
+type Props = {
+  condition: Condition
+  onChange: (condition: Condition) => void
+  varType: VarType
+  hasSubVariable: boolean
+  readOnly: boolean
+}
+
+const FilterCondition: FC<Props> = ({
+  condition = { key: '', comparison_operator: ComparisonOperator.equal, value: '' },
+  varType,
+  onChange,
+  hasSubVariable,
+  readOnly,
+}) => {
+  const { t } = useTranslation()
+  const isSelect = [ComparisonOperator.in, ComparisonOperator.notIn, ComparisonOperator.allOf].includes(condition.comparison_operator)
+  const isArrayValue = condition.key === 'transfer_method' || condition.key === 'type'
+  const selectOptions = useMemo(() => {
+    if (isSelect) {
+      if (condition.key === 'type' || condition.comparison_operator === ComparisonOperator.allOf) {
+        return FILE_TYPE_OPTIONS.map(item => ({
+          name: t(`${optionNameI18NPrefix}.${item.i18nKey}`),
+          value: item.value,
+        }))
+      }
+      if (condition.key === 'transfer_method') {
+        return TRANSFER_METHOD.map(item => ({
+          name: t(`${optionNameI18NPrefix}.${item.i18nKey}`),
+          value: item.value,
+        }))
+      }
+      return []
+    }
+    return []
+  }, [condition.comparison_operator, condition.key, isSelect, t])
+  const handleChange = useCallback((key: string) => {
+    return (value: any) => {
+      onChange({
+        ...condition,
+        [key]: (isArrayValue && key === 'value') ? [value] : value,
+      })
+    }
+  }, [condition, onChange, isArrayValue])
+
+  const handleSubVariableChange = useCallback((value: string) => {
+    onChange({
+      key: value,
+      comparison_operator: getOperators(varType, { key: value })[0],
+      value: '',
+    })
+  }, [onChange, varType])
+
+  return (
+    <div>
+      {hasSubVariable && (
+        <SubVariablePicker
+          className="mb-2"
+          value={condition.key}
+          onChange={handleSubVariableChange}
+        />
+      )}
+      <div className='flex space-x-1'>
+        <ConditionOperator
+          className='h-8 bg-components-input-bg-normal'
+          varType={varType}
+          value={condition.comparison_operator}
+          onSelect={handleChange('comparison_operator')}
+          file={hasSubVariable ? { key: condition.key } : undefined}
+          disabled={readOnly}
+        />
+        {!comparisonOperatorNotRequireValue(condition.comparison_operator) && (
+          <>
+            {isSelect && (
+              <Select
+                items={selectOptions}
+                defaultValue={isArrayValue ? (condition.value as string[])[0] : condition.value as string}
+                onSelect={item => handleChange('value')(item.value)}
+                className='!text-[13px]'
+                wrapperClassName='grow h-8'
+                placeholder='Select value'
+              />
+            )}
+            {!isSelect && (
+              <Input
+                type={((hasSubVariable && condition.key === 'size') || (!hasSubVariable && varType === VarType.number)) ? 'number' : 'text'}
+                className='grow'
+                value={condition.value}
+                onChange={e => handleChange('value')(e.target.value)}
+              />
+            )}
+          </>
+        )}
+      </div>
+    </div>
+  )
+}
+export default React.memo(FilterCondition)
diff --git a/app/components/workflow/nodes/list-operator/components/limit-config.tsx b/app/components/workflow/nodes/list-operator/components/limit-config.tsx
new file mode 100644
index 0000000..b8812d3
--- /dev/null
+++ b/app/components/workflow/nodes/list-operator/components/limit-config.tsx
@@ -0,0 +1,80 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { Limit } from '../types'
+import InputNumberWithSlider from '../../_base/components/input-number-with-slider'
+import cn from '@/utils/classnames'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import Switch from '@/app/components/base/switch'
+
+const i18nPrefix = 'workflow.nodes.listFilter'
+const LIMIT_SIZE_MIN = 1
+const LIMIT_SIZE_MAX = 20
+const LIMIT_SIZE_DEFAULT = 10
+
+type Props = {
+  className?: string
+  readonly: boolean
+  config: Limit
+  onChange: (limit: Limit) => void
+  canSetRoleName?: boolean
+}
+
+const LIMIT_DEFAULT: Limit = {
+  enabled: false,
+  size: LIMIT_SIZE_DEFAULT,
+}
+
+const LimitConfig: FC<Props> = ({
+  className,
+  readonly,
+  config = LIMIT_DEFAULT,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const payload = config
+
+  const handleLimitEnabledChange = useCallback((enabled: boolean) => {
+    onChange({
+      ...config,
+      enabled,
+    })
+  }, [config, onChange])
+
+  const handleLimitSizeChange = useCallback((size: number | string) => {
+    onChange({
+      ...config,
+      size: Number.parseInt(size as string),
+    })
+  }, [onChange, config])
+
+  return (
+    <div className={cn(className)}>
+      <Field
+        title={t(`${i18nPrefix}.limit`)}
+        operations={
+          <Switch
+            defaultValue={payload.enabled}
+            onChange={handleLimitEnabledChange}
+            size='md'
+            disabled={readonly}
+          />
+        }
+      >
+        {payload?.enabled
+          ? (
+            <InputNumberWithSlider
+              value={payload?.size || LIMIT_SIZE_DEFAULT}
+              min={LIMIT_SIZE_MIN}
+              max={LIMIT_SIZE_MAX}
+              onChange={handleLimitSizeChange}
+              readonly={readonly || !payload?.enabled}
+            />
+          )
+          : null}
+      </Field>
+    </div>
+  )
+}
+export default React.memo(LimitConfig)
diff --git a/app/components/workflow/nodes/list-operator/components/sub-variable-picker.tsx b/app/components/workflow/nodes/list-operator/components/sub-variable-picker.tsx
new file mode 100644
index 0000000..88e1067
--- /dev/null
+++ b/app/components/workflow/nodes/list-operator/components/sub-variable-picker.tsx
@@ -0,0 +1,73 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import { SUB_VARIABLES } from '../../constants'
+import type { Item } from '@/app/components/base/select'
+import { SimpleSelect as Select } from '@/app/components/base/select'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import cn from '@/utils/classnames'
+
+type Props = {
+  value: string
+  onChange: (value: string) => void
+  className?: string
+}
+
+const SubVariablePicker: FC<Props> = ({
+  value,
+  onChange,
+  className,
+}) => {
+  const { t } = useTranslation()
+  const subVarOptions = SUB_VARIABLES.map(item => ({
+    value: item,
+    name: item,
+  }))
+
+  const renderOption = ({ item }: { item: Record<string, any> }) => {
+    return (
+      <div className='flex h-6 items-center justify-between'>
+        <div className='flex h-full items-center'>
+          <Variable02 className='mr-[5px] h-3.5 w-3.5 text-text-accent' />
+          <span className='system-sm-medium text-text-secondary'>{item.name}</span>
+        </div>
+        <span className='system-xs-regular text-text-tertiary'>{item.type}</span>
+      </div>
+    )
+  }
+
+  const handleChange = useCallback(({ value }: Item) => {
+    onChange(value as string)
+  }, [onChange])
+
+  return (
+    <div className={cn(className)}>
+      <Select
+        items={subVarOptions}
+        defaultValue={value}
+        onSelect={handleChange}
+        className='!text-[13px]'
+        placeholder={t('workflow.nodes.listFilter.selectVariableKeyPlaceholder')!}
+        optionClassName='pl-1 pr-5 py-0'
+        renderOption={renderOption}
+        renderTrigger={item => (
+          <div className='group/sub-variable-picker flex h-8 items-center rounded-lg bg-components-input-bg-normal pl-1 hover:bg-state-base-hover-alt'>
+            {item
+              ? <div className='flex cursor-pointer justify-start'>
+                <div className='inline-flex h-6 max-w-full items-center rounded-md border-[0.5px] border-components-panel-border-subtle bg-components-badge-white-to-dark px-1.5 text-text-accent shadow-xs'>
+                  <Variable02 className='h-3.5 w-3.5 shrink-0 text-text-accent' />
+                  <div className='system-xs-medium ml-0.5 truncate'>{item?.name}</div>
+                </div>
+              </div>
+              : <div className='system-sm-regular flex pl-1 text-components-input-text-placeholder  group-hover/sub-variable-picker:text-text-tertiary'>
+                <Variable02 className='mr-1 h-4 w-4 shrink-0' />
+                <span>{t('common.placeholder.select')}</span>
+              </div>}
+          </div>
+        )}
+      />
+    </div>
+  )
+}
+export default React.memo(SubVariablePicker)
diff --git a/app/components/workflow/nodes/list-operator/default.ts b/app/components/workflow/nodes/list-operator/default.ts
new file mode 100644
index 0000000..0256cb8
--- /dev/null
+++ b/app/components/workflow/nodes/list-operator/default.ts
@@ -0,0 +1,65 @@
+import { BlockEnum, VarType } from '../../types'
+import type { NodeDefault } from '../../types'
+import { comparisonOperatorNotRequireValue } from '../if-else/utils'
+import { type ListFilterNodeType, OrderBy } from './types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+const i18nPrefix = 'workflow.errorMsg'
+
+const nodeDefault: NodeDefault<ListFilterNodeType> = {
+  defaultValue: {
+    variable: [],
+    filter_by: {
+      enabled: false,
+      conditions: [],
+    },
+    extract_by: {
+      enabled: false,
+      serial: '1',
+    },
+    order_by: {
+      enabled: false,
+      key: '',
+      value: OrderBy.ASC,
+    },
+    limit: {
+      enabled: false,
+      size: 10,
+    },
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: ListFilterNodeType, t: any) {
+    let errorMessages = ''
+    const { variable, var_type, filter_by } = payload
+
+    if (!errorMessages && !variable?.length)
+      errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t('workflow.nodes.listFilter.inputVar') })
+
+    // Check filter condition
+    if (!errorMessages && filter_by?.enabled) {
+      if (var_type === VarType.arrayFile && !filter_by.conditions[0]?.key)
+        errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t('workflow.nodes.listFilter.filterConditionKey') })
+
+      if (!errorMessages && !filter_by.conditions[0]?.comparison_operator)
+        errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t('workflow.nodes.listFilter.filterConditionComparisonOperator') })
+
+      if (!errorMessages && !comparisonOperatorNotRequireValue(filter_by.conditions[0]?.comparison_operator) && !filter_by.conditions[0]?.value)
+        errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t('workflow.nodes.listFilter.filterConditionComparisonValue') })
+    }
+
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/list-operator/node.tsx b/app/components/workflow/nodes/list-operator/node.tsx
new file mode 100644
index 0000000..4c3596f
--- /dev/null
+++ b/app/components/workflow/nodes/list-operator/node.tsx
@@ -0,0 +1,42 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useNodes } from 'reactflow'
+import { useTranslation } from 'react-i18next'
+import NodeVariableItem from '../variable-assigner/components/node-variable-item'
+import type { ListFilterNodeType } from './types'
+import { isConversationVar, isENV, isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+import { BlockEnum, type Node, type NodeProps } from '@/app/components/workflow/types'
+
+const i18nPrefix = 'workflow.nodes.listFilter'
+
+const NodeComponent: FC<NodeProps<ListFilterNodeType>> = ({
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const nodes: Node[] = useNodes()
+  const { variable } = data
+
+  if (!variable || variable.length === 0)
+    return null
+
+  const isSystem = isSystemVar(variable)
+  const isEnv = isENV(variable)
+  const isChatVar = isConversationVar(variable)
+  const node = isSystem ? nodes.find(node => node.data.type === BlockEnum.Start) : nodes.find(node => node.id === variable[0])
+  const varName = isSystem ? `sys.${variable[variable.length - 1]}` : variable.slice(1).join('.')
+  return (
+    <div className='relative px-3'>
+      <div className='system-2xs-medium-uppercase mb-1 text-text-tertiary'>{t(`${i18nPrefix}.inputVar`)}</div>
+      <NodeVariableItem
+        node={node as Node}
+        isEnv={isEnv}
+        isChatVar={isChatVar}
+        varName={varName}
+        className='bg-workflow-block-parma-bg'
+      />
+    </div>
+  )
+}
+
+export default React.memo(NodeComponent)
diff --git a/app/components/workflow/nodes/list-operator/panel.tsx b/app/components/workflow/nodes/list-operator/panel.tsx
new file mode 100644
index 0000000..d93a793
--- /dev/null
+++ b/app/components/workflow/nodes/list-operator/panel.tsx
@@ -0,0 +1,184 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import VarReferencePicker from '../_base/components/variable/var-reference-picker'
+import OutputVars, { VarItem } from '../_base/components/output-vars'
+import OptionCard from '../_base/components/option-card'
+import Split from '../_base/components/split'
+import useConfig from './use-config'
+import SubVariablePicker from './components/sub-variable-picker'
+import { type ListFilterNodeType, OrderBy } from './types'
+import LimitConfig from './components/limit-config'
+import FilterCondition from './components/filter-condition'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import type { NodePanelProps } from '@/app/components/workflow/types'
+import Switch from '@/app/components/base/switch'
+import ExtractInput from '@/app/components/workflow/nodes/list-operator/components/extract-input'
+
+const i18nPrefix = 'workflow.nodes.listFilter'
+
+const Panel: FC<NodePanelProps<ListFilterNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    readOnly,
+    inputs,
+    itemVarType,
+    itemVarTypeShowName,
+    hasSubVariable,
+    handleVarChanges,
+    filterVar,
+    handleFilterEnabledChange,
+    handleFilterChange,
+    handleExtractsEnabledChange,
+    handleExtractsChange,
+    handleLimitChange,
+    handleOrderByEnabledChange,
+    handleOrderByKeyChange,
+    handleOrderByTypeChange,
+  } = useConfig(id, data)
+
+  return (
+    <div className='pt-2'>
+      <div className='space-y-4 px-4'>
+        <Field
+          title={t(`${i18nPrefix}.inputVar`)}
+          required
+        >
+          <VarReferencePicker
+            readonly={readOnly}
+            nodeId={id}
+            isShowNodeName
+            value={inputs.variable || []}
+            onChange={handleVarChanges}
+            filterVar={filterVar}
+            typePlaceHolder='Array'
+          />
+        </Field>
+
+        <Field
+          title={t(`${i18nPrefix}.filterCondition`)}
+          operations={
+            <Switch
+              defaultValue={inputs.filter_by?.enabled}
+              onChange={handleFilterEnabledChange}
+              size='md'
+              disabled={readOnly}
+            />
+          }
+        >
+          {inputs.filter_by?.enabled
+            ? (
+              <FilterCondition
+                condition={inputs.filter_by.conditions[0]}
+                onChange={handleFilterChange}
+                varType={itemVarType}
+                hasSubVariable={hasSubVariable}
+                readOnly={readOnly}
+              />
+            )
+            : null}
+        </Field>
+        <Split />
+        <Field
+          title={t(`${i18nPrefix}.extractsCondition`)}
+          operations={
+            <Switch
+              defaultValue={inputs.extract_by?.enabled}
+              onChange={handleExtractsEnabledChange}
+              size='md'
+              disabled={readOnly}
+            />
+          }
+        >
+          {inputs.extract_by?.enabled
+            ? (
+              <div className='flex items-center justify-between'>
+                <div className='mr-2 grow'>
+                  <ExtractInput
+                    value={inputs.extract_by.serial as string}
+                    onChange={handleExtractsChange}
+                    readOnly={readOnly}
+                    nodeId={id}
+                  />
+                </div>
+              </div>
+            )
+            : null}
+        </Field>
+        <Split />
+        <LimitConfig
+          config={inputs.limit}
+          onChange={handleLimitChange}
+          readonly={readOnly}
+        />
+        <Split />
+        <Field
+          title={t(`${i18nPrefix}.orderBy`)}
+          operations={
+            <Switch
+              defaultValue={inputs.order_by?.enabled}
+              onChange={handleOrderByEnabledChange}
+              size='md'
+              disabled={readOnly}
+            />
+          }
+        >
+          {inputs.order_by?.enabled
+            ? (
+              <div className='flex items-center justify-between'>
+                {hasSubVariable && (
+                  <div className='mr-2 grow'>
+                    <SubVariablePicker
+                      value={inputs.order_by.key as string}
+                      onChange={handleOrderByKeyChange}
+                    />
+                  </div>
+                )}
+                <div className={!hasSubVariable ? 'grid w-full grid-cols-2 gap-1' : 'flex shrink-0 space-x-1'}>
+                  <OptionCard
+                    title={t(`${i18nPrefix}.asc`)}
+                    onSelect={handleOrderByTypeChange(OrderBy.ASC)}
+                    selected={inputs.order_by.value === OrderBy.ASC}
+                  />
+                  <OptionCard
+                    title={t(`${i18nPrefix}.desc`)}
+                    onSelect={handleOrderByTypeChange(OrderBy.DESC)}
+                    selected={inputs.order_by.value === OrderBy.DESC}
+                  />
+                </div>
+              </div>
+            )
+            : null}
+        </Field>
+        <Split />
+      </div>
+      <div>
+        <OutputVars>
+          <>
+            <VarItem
+              name='result'
+              type={`Array[${itemVarTypeShowName}]`}
+              description={t(`${i18nPrefix}.outputVars.result`)}
+            />
+            <VarItem
+              name='first_record'
+              type={itemVarTypeShowName}
+              description={t(`${i18nPrefix}.outputVars.first_record`)}
+            />
+            <VarItem
+              name='last_record'
+              type={itemVarTypeShowName}
+              description={t(`${i18nPrefix}.outputVars.last_record`)}
+            />
+          </>
+        </OutputVars>
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/list-operator/types.ts b/app/components/workflow/nodes/list-operator/types.ts
new file mode 100644
index 0000000..7705903
--- /dev/null
+++ b/app/components/workflow/nodes/list-operator/types.ts
@@ -0,0 +1,38 @@
+import type { ComparisonOperator } from '../if-else/types'
+import type { CommonNodeType, ValueSelector, VarType } from '@/app/components/workflow/types'
+
+export enum OrderBy {
+  ASC = 'asc',
+  DESC = 'desc',
+}
+
+export type Limit = {
+  enabled: boolean
+  size?: number
+}
+
+export type Condition = {
+  key: string
+  comparison_operator: ComparisonOperator
+  value: string | number | string[]
+}
+
+export type ListFilterNodeType = CommonNodeType & {
+  variable: ValueSelector
+  var_type: VarType // Cache for the type of output variable
+  item_var_type: VarType // Cache for the type of output variable
+  filter_by: {
+    enabled: boolean
+    conditions: Condition[]
+  }
+  extract_by: {
+    enabled: boolean
+    serial?: string
+  }
+  order_by: {
+    enabled: boolean
+    key: ValueSelector | string
+    value: OrderBy
+  }
+  limit: Limit
+}
diff --git a/app/components/workflow/nodes/list-operator/use-config.ts b/app/components/workflow/nodes/list-operator/use-config.ts
new file mode 100644
index 0000000..efbf32b
--- /dev/null
+++ b/app/components/workflow/nodes/list-operator/use-config.ts
@@ -0,0 +1,188 @@
+import { useCallback, useMemo } from 'react'
+import produce from 'immer'
+import { useStoreApi } from 'reactflow'
+import type { ValueSelector, Var } from '../../types'
+import { VarType } from '../../types'
+import { getOperators } from '../if-else/utils'
+import { OrderBy } from './types'
+import type { Condition, Limit, ListFilterNodeType } from './types'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import {
+  useIsChatMode,
+  useNodesReadOnly,
+  useWorkflow,
+  useWorkflowVariables,
+} from '@/app/components/workflow/hooks'
+
+const useConfig = (id: string, payload: ListFilterNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const isChatMode = useIsChatMode()
+
+  const store = useStoreApi()
+  const { getBeforeNodesInSameBranch } = useWorkflow()
+
+  const {
+    getNodes,
+  } = store.getState()
+  const currentNode = getNodes().find(n => n.id === id)
+  const isInIteration = payload.isInIteration
+  const iterationNode = isInIteration ? getNodes().find(n => n.id === currentNode!.parentId) : null
+  const isInLoop = payload.isInLoop
+  const loopNode = isInLoop ? getNodes().find(n => n.id === currentNode!.parentId) : null
+  const availableNodes = useMemo(() => {
+    return getBeforeNodesInSameBranch(id)
+  }, [getBeforeNodesInSameBranch, id])
+
+  const { inputs, setInputs } = useNodeCrud<ListFilterNodeType>(id, payload)
+
+  const { getCurrentVariableType } = useWorkflowVariables()
+  const getType = useCallback((variable?: ValueSelector) => {
+    const varType = getCurrentVariableType({
+      parentNode: isInIteration ? iterationNode : loopNode,
+      valueSelector: variable || inputs.variable || [],
+      availableNodes,
+      isChatMode,
+      isConstant: false,
+    })
+    let itemVarType = VarType.string
+    switch (varType) {
+      case VarType.arrayNumber:
+        itemVarType = VarType.number
+        break
+      case VarType.arrayString:
+        itemVarType = VarType.string
+        break
+      case VarType.arrayFile:
+        itemVarType = VarType.file
+        break
+      case VarType.arrayObject:
+        itemVarType = VarType.object
+        break
+      default:
+        itemVarType = varType
+    }
+    return { varType, itemVarType }
+  }, [availableNodes, getCurrentVariableType, inputs.variable, isChatMode, isInIteration, iterationNode, loopNode])
+
+  const { varType, itemVarType } = getType()
+
+  const itemVarTypeShowName = useMemo(() => {
+    if (!inputs.variable)
+      return '?'
+    return [(itemVarType || VarType.string).substring(0, 1).toUpperCase(), (itemVarType || VarType.string).substring(1)].join('')
+  }, [inputs.variable, itemVarType])
+
+  const hasSubVariable = [VarType.arrayFile].includes(varType)
+
+  const handleVarChanges = useCallback((variable: ValueSelector | string) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.variable = variable as ValueSelector
+      const { varType, itemVarType } = getType(draft.variable)
+      const isFileArray = varType === VarType.arrayFile
+
+      draft.var_type = varType
+      draft.item_var_type = itemVarType
+      draft.filter_by.conditions = [{
+        key: (isFileArray && !draft.filter_by.conditions[0]?.key) ? 'name' : '',
+        comparison_operator: getOperators(itemVarType, isFileArray ? { key: 'name' } : undefined)[0],
+        value: '',
+      }]
+      if (isFileArray && draft.order_by.enabled && !draft.order_by.key)
+        draft.order_by.key = 'name'
+    })
+    setInputs(newInputs)
+  }, [getType, inputs, setInputs])
+
+  const filterVar = useCallback((varPayload: Var) => {
+    // Don't know the item struct of VarType.arrayObject, so not support it
+    return [VarType.arrayNumber, VarType.arrayString, VarType.arrayFile].includes(varPayload.type)
+  }, [])
+
+  const handleFilterEnabledChange = useCallback((enabled: boolean) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.filter_by.enabled = enabled
+      if (enabled && !draft.filter_by.conditions)
+        draft.filter_by.conditions = []
+    })
+    setInputs(newInputs)
+  }, [hasSubVariable, inputs, setInputs])
+
+  const handleFilterChange = useCallback((condition: Condition) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.filter_by.conditions[0] = condition
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleLimitChange = useCallback((limit: Limit) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.limit = limit
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleExtractsEnabledChange = useCallback((enabled: boolean) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.extract_by.enabled = enabled
+      if (enabled)
+        draft.extract_by.serial = '1'
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleExtractsChange = useCallback((value: string) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.extract_by.serial = value
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleOrderByEnabledChange = useCallback((enabled: boolean) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.order_by.enabled = enabled
+      if (enabled) {
+        draft.order_by.value = OrderBy.ASC
+        if (hasSubVariable && !draft.order_by.key)
+          draft.order_by.key = 'name'
+      }
+    })
+    setInputs(newInputs)
+  }, [hasSubVariable, inputs, setInputs])
+
+  const handleOrderByKeyChange = useCallback((key: string) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.order_by.key = key
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleOrderByTypeChange = useCallback((type: OrderBy) => {
+    return () => {
+      const newInputs = produce(inputs, (draft) => {
+        draft.order_by.value = type
+      })
+      setInputs(newInputs)
+    }
+  }, [inputs, setInputs])
+
+  return {
+    readOnly,
+    inputs,
+    filterVar,
+    varType,
+    itemVarType,
+    itemVarTypeShowName,
+    hasSubVariable,
+    handleVarChanges,
+    handleFilterEnabledChange,
+    handleFilterChange,
+    handleLimitChange,
+    handleOrderByEnabledChange,
+    handleOrderByKeyChange,
+    handleOrderByTypeChange,
+    handleExtractsEnabledChange,
+    handleExtractsChange,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/llm/components/config-prompt-item.tsx b/app/components/workflow/nodes/llm/components/config-prompt-item.tsx
new file mode 100644
index 0000000..0e6ceda
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/config-prompt-item.tsx
@@ -0,0 +1,151 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
+import { uniqueId } from 'lodash-es'
+import { useTranslation } from 'react-i18next'
+import type { ModelConfig, PromptItem, Variable } from '../../../types'
+import { EditionType } from '../../../types'
+import { useWorkflowStore } from '../../../store'
+import Editor from '@/app/components/workflow/nodes/_base/components/prompt/editor'
+import TypeSelector from '@/app/components/workflow/nodes/_base/components/selector'
+import Tooltip from '@/app/components/base/tooltip'
+import { PromptRole } from '@/models/debug'
+
+const i18nPrefix = 'workflow.nodes.llm'
+
+type Props = {
+  className?: string
+  headerClassName?: string
+  canNotChooseSystemRole?: boolean
+  readOnly: boolean
+  id: string
+  canRemove: boolean
+  isChatModel: boolean
+  isChatApp: boolean
+  payload: PromptItem
+  handleChatModeMessageRoleChange: (role: PromptRole) => void
+  onPromptChange: (p: string) => void
+  onEditionTypeChange: (editionType: EditionType) => void
+  onRemove: () => void
+  isShowContext: boolean
+  hasSetBlockStatus: {
+    context: boolean
+    history: boolean
+    query: boolean
+  }
+  availableVars: any
+  availableNodes: any
+  varList: Variable[]
+  handleAddVariable: (payload: any) => void
+  modelConfig?: ModelConfig
+}
+
+const roleOptions = [
+  {
+    label: 'system',
+    value: PromptRole.system,
+  },
+  {
+    label: 'user',
+    value: PromptRole.user,
+  },
+  {
+    label: 'assistant',
+    value: PromptRole.assistant,
+  },
+]
+
+const roleOptionsWithoutSystemRole = roleOptions.filter(item => item.value !== PromptRole.system)
+
+const ConfigPromptItem: FC<Props> = ({
+  className,
+  headerClassName,
+  canNotChooseSystemRole,
+  readOnly,
+  id,
+  canRemove,
+  handleChatModeMessageRoleChange,
+  isChatModel,
+  isChatApp,
+  payload,
+  onPromptChange,
+  onEditionTypeChange,
+  onRemove,
+  isShowContext,
+  hasSetBlockStatus,
+  availableVars,
+  availableNodes,
+  varList,
+  handleAddVariable,
+  modelConfig,
+}) => {
+  const { t } = useTranslation()
+  const workflowStore = useWorkflowStore()
+  const {
+    setControlPromptEditorRerenderKey,
+  } = workflowStore.getState()
+  const [instanceId, setInstanceId] = useState(uniqueId())
+  useEffect(() => {
+    setInstanceId(`${id}-${uniqueId()}`)
+  }, [id])
+
+  const handleGenerated = useCallback((prompt: string) => {
+    onPromptChange(prompt)
+    setTimeout(() => setControlPromptEditorRerenderKey(Date.now()))
+  }, [onPromptChange, setControlPromptEditorRerenderKey])
+
+  return (
+    <Editor
+      className={className}
+      headerClassName={headerClassName}
+      instanceId={instanceId}
+      key={instanceId}
+      title={
+        <div className='relative left-1 flex items-center'>
+          {payload.role === PromptRole.system
+            ? (<div className='relative left-[-4px] text-xs font-semibold uppercase text-text-secondary'>
+              SYSTEM
+            </div>)
+            : (
+              <TypeSelector
+                value={payload.role as string}
+                allOptions={roleOptions}
+                options={canNotChooseSystemRole ? roleOptionsWithoutSystemRole : roleOptions}
+                onChange={handleChatModeMessageRoleChange}
+                triggerClassName='text-xs font-semibold text-text-secondary uppercase'
+                itemClassName='text-[13px] font-medium text-text-secondary'
+              />
+            )}
+
+          <Tooltip
+            popupContent={
+              <div className='max-w-[180px]'>{t(`${i18nPrefix}.roleDescription.${payload.role}`)}</div>
+            }
+            triggerClassName='w-4 h-4'
+          />
+        </div>
+      }
+      value={payload.edition_type === EditionType.jinja2 ? (payload.jinja2_text || '') : payload.text}
+      onChange={onPromptChange}
+      readOnly={readOnly}
+      showRemove={canRemove}
+      onRemove={onRemove}
+      isChatModel={isChatModel}
+      isChatApp={isChatApp}
+      isShowContext={isShowContext}
+      hasSetBlockStatus={hasSetBlockStatus}
+      nodesOutputVars={availableVars}
+      availableNodes={availableNodes}
+      isSupportPromptGenerator={payload.role === PromptRole.system}
+      onGenerated={handleGenerated}
+      modelConfig={modelConfig}
+      isSupportJinja
+      editionType={payload.edition_type}
+      onEditionTypeChange={onEditionTypeChange}
+      varList={varList}
+      handleAddVariable={handleAddVariable}
+      isSupportFileVar
+    />
+  )
+}
+export default React.memo(ConfigPromptItem)
diff --git a/app/components/workflow/nodes/llm/components/config-prompt.tsx b/app/components/workflow/nodes/llm/components/config-prompt.tsx
new file mode 100644
index 0000000..eb14f30
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/config-prompt.tsx
@@ -0,0 +1,247 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { ReactSortable } from 'react-sortablejs'
+import { v4 as uuid4 } from 'uuid'
+import type { ModelConfig, PromptItem, ValueSelector, Var, Variable } from '../../../types'
+import { EditionType, PromptRole } from '../../../types'
+import useAvailableVarList from '../../_base/hooks/use-available-var-list'
+import { useWorkflowStore } from '../../../store'
+import ConfigPromptItem from './config-prompt-item'
+import cn from '@/utils/classnames'
+import Editor from '@/app/components/workflow/nodes/_base/components/prompt/editor'
+import AddButton from '@/app/components/workflow/nodes/_base/components/add-button'
+import { DragHandle } from '@/app/components/base/icons/src/vender/line/others'
+
+const i18nPrefix = 'workflow.nodes.llm'
+
+type Props = {
+  readOnly: boolean
+  nodeId: string
+  filterVar: (payload: Var, selector: ValueSelector) => boolean
+  isChatModel: boolean
+  isChatApp: boolean
+  payload: PromptItem | PromptItem[]
+  onChange: (payload: PromptItem | PromptItem[]) => void
+  isShowContext: boolean
+  hasSetBlockStatus: {
+    context: boolean
+    history: boolean
+    query: boolean
+  }
+  varList?: Variable[]
+  handleAddVariable: (payload: any) => void
+  modelConfig: ModelConfig
+}
+
+const ConfigPrompt: FC<Props> = ({
+  readOnly,
+  nodeId,
+  filterVar,
+  isChatModel,
+  isChatApp,
+  payload,
+  onChange,
+  isShowContext,
+  hasSetBlockStatus,
+  varList = [],
+  handleAddVariable,
+  modelConfig,
+}) => {
+  const { t } = useTranslation()
+  const workflowStore = useWorkflowStore()
+  const {
+    setControlPromptEditorRerenderKey,
+  } = workflowStore.getState()
+  const payloadWithIds = (isChatModel && Array.isArray(payload))
+    ? payload.map((item) => {
+      const id = uuid4()
+      return {
+        id: item.id || id,
+        p: {
+          ...item,
+          id: item.id || id,
+        },
+      }
+    })
+    : []
+  const {
+    availableVars,
+    availableNodesWithParent,
+  } = useAvailableVarList(nodeId, {
+    onlyLeafNodeVar: false,
+    filterVar,
+  })
+
+  const handleChatModePromptChange = useCallback((index: number) => {
+    return (prompt: string) => {
+      const newPrompt = produce(payload as PromptItem[], (draft) => {
+        draft[index][draft[index].edition_type === EditionType.jinja2 ? 'jinja2_text' : 'text'] = prompt
+      })
+      onChange(newPrompt)
+    }
+  }, [onChange, payload])
+
+  const handleChatModeEditionTypeChange = useCallback((index: number) => {
+    return (editionType: EditionType) => {
+      const newPrompt = produce(payload as PromptItem[], (draft) => {
+        draft[index].edition_type = editionType
+      })
+      onChange(newPrompt)
+    }
+  }, [onChange, payload])
+
+  const handleChatModeMessageRoleChange = useCallback((index: number) => {
+    return (role: PromptRole) => {
+      const newPrompt = produce(payload as PromptItem[], (draft) => {
+        draft[index].role = role
+      })
+      onChange(newPrompt)
+    }
+  }, [onChange, payload])
+
+  const handleAddPrompt = useCallback(() => {
+    const newPrompt = produce(payload as PromptItem[], (draft) => {
+      if (draft.length === 0) {
+        draft.push({ role: PromptRole.system, text: '' })
+
+        return
+      }
+      const isLastItemUser = draft[draft.length - 1].role === PromptRole.user
+      draft.push({ role: isLastItemUser ? PromptRole.assistant : PromptRole.user, text: '' })
+    })
+    onChange(newPrompt)
+  }, [onChange, payload])
+
+  const handleRemove = useCallback((index: number) => {
+    return () => {
+      const newPrompt = produce(payload as PromptItem[], (draft) => {
+        draft.splice(index, 1)
+      })
+      onChange(newPrompt)
+    }
+  }, [onChange, payload])
+
+  const handleCompletionPromptChange = useCallback((prompt: string) => {
+    const newPrompt = produce(payload as PromptItem, (draft) => {
+      draft[draft.edition_type === EditionType.jinja2 ? 'jinja2_text' : 'text'] = prompt
+    })
+    onChange(newPrompt)
+  }, [onChange, payload])
+
+  const handleGenerated = useCallback((prompt: string) => {
+    handleCompletionPromptChange(prompt)
+    setTimeout(() => setControlPromptEditorRerenderKey(Date.now()))
+  }, [handleCompletionPromptChange, setControlPromptEditorRerenderKey])
+
+  const handleCompletionEditionTypeChange = useCallback((editionType: EditionType) => {
+    const newPrompt = produce(payload as PromptItem, (draft) => {
+      draft.edition_type = editionType
+    })
+    onChange(newPrompt)
+  }, [onChange, payload])
+
+  const canChooseSystemRole = (() => {
+    if (isChatModel && Array.isArray(payload))
+      return !payload.find(item => item.role === PromptRole.system)
+
+    return false
+  })()
+  return (
+    <div>
+      {(isChatModel && Array.isArray(payload))
+        ? (
+          <div>
+            <div className='space-y-2'>
+              <ReactSortable className="space-y-1"
+                list={payloadWithIds}
+                setList={(list) => {
+                  if ((payload as PromptItem[])?.[0]?.role === PromptRole.system && list[0].p?.role !== PromptRole.system)
+                    return
+
+                  onChange(list.map(item => item.p))
+                }}
+                handle='.handle'
+                ghostClass="opacity-50"
+                animation={150}
+              >
+                {
+                  (payload as PromptItem[]).map((item, index) => {
+                    const canDrag = (() => {
+                      if (readOnly)
+                        return false
+
+                      if (index === 0 && item.role === PromptRole.system)
+                        return false
+
+                      return true
+                    })()
+                    return (
+                      <div key={item.id || index} className='group relative'>
+                        {canDrag && <DragHandle className='absolute left-[-14px] top-2 hidden h-3.5 w-3.5 text-text-quaternary group-hover:block' />}
+                        <ConfigPromptItem
+                          className={cn(canDrag && 'handle')}
+                          headerClassName={cn(canDrag && 'cursor-grab')}
+                          canNotChooseSystemRole={!canChooseSystemRole}
+                          canRemove={payload.length > 1 && !(index === 0 && item.role === PromptRole.system)}
+                          readOnly={readOnly}
+                          id={item.id!}
+                          handleChatModeMessageRoleChange={handleChatModeMessageRoleChange(index)}
+                          isChatModel={isChatModel}
+                          isChatApp={isChatApp}
+                          payload={item}
+                          onPromptChange={handleChatModePromptChange(index)}
+                          onEditionTypeChange={handleChatModeEditionTypeChange(index)}
+                          onRemove={handleRemove(index)}
+                          isShowContext={isShowContext}
+                          hasSetBlockStatus={hasSetBlockStatus}
+                          availableVars={availableVars}
+                          availableNodes={availableNodesWithParent}
+                          varList={varList}
+                          handleAddVariable={handleAddVariable}
+                          modelConfig={modelConfig}
+                        />
+                      </div>
+                    )
+                  })
+                }
+              </ReactSortable>
+            </div>
+            <AddButton
+              className='mt-2'
+              text={t(`${i18nPrefix}.addMessage`)}
+              onClick={handleAddPrompt}
+            />
+          </div>
+        )
+        : (
+          <div>
+            <Editor
+              instanceId={`${nodeId}-chat-workflow-llm-prompt-editor`}
+              title={<span className='capitalize'>{t(`${i18nPrefix}.prompt`)}</span>}
+              value={((payload as PromptItem).edition_type === EditionType.basic || !(payload as PromptItem).edition_type) ? (payload as PromptItem).text : ((payload as PromptItem).jinja2_text || '')}
+              onChange={handleCompletionPromptChange}
+              readOnly={readOnly}
+              isChatModel={isChatModel}
+              isChatApp={isChatApp}
+              isShowContext={isShowContext}
+              hasSetBlockStatus={hasSetBlockStatus}
+              nodesOutputVars={availableVars}
+              availableNodes={availableNodesWithParent}
+              isSupportPromptGenerator
+              isSupportJinja
+              editionType={(payload as PromptItem).edition_type}
+              varList={varList}
+              onEditionTypeChange={handleCompletionEditionTypeChange}
+              handleAddVariable={handleAddVariable}
+              onGenerated={handleGenerated}
+              modelConfig={modelConfig}
+            />
+          </div>
+        )}
+    </div>
+  )
+}
+export default React.memo(ConfigPrompt)
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/code-editor.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/code-editor.tsx
new file mode 100644
index 0000000..a3c2552
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/code-editor.tsx
@@ -0,0 +1,140 @@
+import React, { type FC, useCallback, useEffect, useRef } from 'react'
+import useTheme from '@/hooks/use-theme'
+import { Theme } from '@/types/app'
+import classNames from '@/utils/classnames'
+import { Editor } from '@monaco-editor/react'
+import { RiClipboardLine, RiIndentIncrease } from '@remixicon/react'
+import copy from 'copy-to-clipboard'
+import Tooltip from '@/app/components/base/tooltip'
+import { useTranslation } from 'react-i18next'
+
+type CodeEditorProps = {
+  value: string
+  onUpdate?: (value: string) => void
+  showFormatButton?: boolean
+  editorWrapperClassName?: string
+  readOnly?: boolean
+} & React.HTMLAttributes<HTMLDivElement>
+
+const CodeEditor: FC<CodeEditorProps> = ({
+  value,
+  onUpdate,
+  showFormatButton = true,
+  editorWrapperClassName,
+  readOnly = false,
+  className,
+}) => {
+  const { t } = useTranslation()
+  const { theme } = useTheme()
+  const monacoRef = useRef<any>(null)
+  const editorRef = useRef<any>(null)
+
+  useEffect(() => {
+    if (monacoRef.current) {
+      if (theme === Theme.light)
+        monacoRef.current.editor.setTheme('light-theme')
+      else
+        monacoRef.current.editor.setTheme('dark-theme')
+    }
+  }, [theme])
+
+  const handleEditorDidMount = useCallback((editor: any, monaco: any) => {
+    editorRef.current = editor
+    monacoRef.current = monaco
+    monaco.editor.defineTheme('light-theme', {
+      base: 'vs',
+      inherit: true,
+      rules: [],
+      colors: {
+        'editor.background': '#00000000',
+        'editor.lineHighlightBackground': '#00000000',
+        'focusBorder': '#00000000',
+      },
+    })
+    monaco.editor.defineTheme('dark-theme', {
+      base: 'vs-dark',
+      inherit: true,
+      rules: [],
+      colors: {
+        'editor.background': '#00000000',
+        'editor.lineHighlightBackground': '#00000000',
+        'focusBorder': '#00000000',
+      },
+    })
+    monaco.editor.setTheme('light-theme')
+  }, [])
+
+  const formatJsonContent = useCallback(() => {
+    if (editorRef.current)
+      editorRef.current.getAction('editor.action.formatDocument')?.run()
+  }, [])
+
+  const handleEditorChange = useCallback((value: string | undefined) => {
+    if (value !== undefined)
+      onUpdate?.(value)
+  }, [onUpdate])
+
+  return (
+    <div className={classNames('flex flex-col h-full bg-components-input-bg-normal overflow-hidden', className)}>
+      <div className='flex items-center justify-between pl-2 pr-1 pt-1'>
+        <div className='system-xs-semibold-uppercase py-0.5 text-text-secondary'>
+          <span className='px-1 py-0.5'>JSON</span>
+        </div>
+        <div className='flex items-center gap-x-0.5'>
+          {showFormatButton && (
+            <Tooltip popupContent={t('common.operation.format')}>
+              <button
+                type='button'
+                className='flex h-6 w-6 items-center justify-center'
+                onClick={formatJsonContent}
+              >
+                <RiIndentIncrease className='h-4 w-4 text-text-tertiary' />
+              </button>
+            </Tooltip>
+          )}
+          <Tooltip popupContent={t('common.operation.copy')}>
+            <button
+              type='button'
+              className='flex h-6 w-6 items-center justify-center'
+              onClick={() => copy(value)}>
+              <RiClipboardLine className='h-4 w-4 text-text-tertiary' />
+            </button>
+          </Tooltip>
+        </div>
+      </div>
+      <div className={classNames('relative', editorWrapperClassName)}>
+        <Editor
+          height='100%'
+          defaultLanguage='json'
+          value={value}
+          onChange={handleEditorChange}
+          onMount={handleEditorDidMount}
+          options={{
+            readOnly,
+            domReadOnly: true,
+            minimap: { enabled: false },
+            tabSize: 2,
+            scrollBeyondLastLine: false,
+            wordWrap: 'on',
+            wrappingIndent: 'same',
+            // Add these options
+            overviewRulerBorder: false,
+            hideCursorInOverviewRuler: true,
+            renderLineHighlightOnlyWhenFocus: false,
+            renderLineHighlight: 'none',
+            // Hide scrollbar borders
+            scrollbar: {
+              vertical: 'hidden',
+              horizontal: 'hidden',
+              verticalScrollbarSize: 0,
+              horizontalScrollbarSize: 0,
+              alwaysConsumeMouseWheel: false,
+            },
+          }}
+        />
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(CodeEditor)
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/error-message.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/error-message.tsx
new file mode 100644
index 0000000..2685182
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/error-message.tsx
@@ -0,0 +1,27 @@
+import React from 'react'
+import type { FC } from 'react'
+import { RiErrorWarningFill } from '@remixicon/react'
+import classNames from '@/utils/classnames'
+
+type ErrorMessageProps = {
+  message: string
+} & React.HTMLAttributes<HTMLDivElement>
+
+const ErrorMessage: FC<ErrorMessageProps> = ({
+  message,
+  className,
+}) => {
+  return (
+    <div className={classNames(
+      'flex gap-x-1 mt-1 p-2 rounded-lg border-[0.5px] border-components-panel-border bg-toast-error-bg',
+      className,
+    )}>
+      <RiErrorWarningFill className='h-4 w-4 shrink-0 text-text-destructive' />
+      <div className='system-xs-medium max-h-12 grow overflow-y-auto break-words text-text-primary'>
+        {message}
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(ErrorMessage)
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/index.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/index.tsx
new file mode 100644
index 0000000..d34836d
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/index.tsx
@@ -0,0 +1,34 @@
+import React, { type FC } from 'react'
+import Modal from '../../../../../base/modal'
+import type { SchemaRoot } from '../../types'
+import JsonSchemaConfig from './json-schema-config'
+
+type JsonSchemaConfigModalProps = {
+  isShow: boolean
+  defaultSchema?: SchemaRoot
+  onSave: (schema: SchemaRoot) => void
+  onClose: () => void
+}
+
+const JsonSchemaConfigModal: FC<JsonSchemaConfigModalProps> = ({
+  isShow,
+  defaultSchema,
+  onSave,
+  onClose,
+}) => {
+  return (
+    <Modal
+      isShow={isShow}
+      onClose={onClose}
+      className='h-[800px] max-w-[960px] p-0'
+    >
+      <JsonSchemaConfig
+        defaultSchema={defaultSchema}
+        onSave={onSave}
+        onClose={onClose}
+      />
+    </Modal>
+  )
+}
+
+export default JsonSchemaConfigModal
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-importer.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-importer.tsx
new file mode 100644
index 0000000..643059a
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-importer.tsx
@@ -0,0 +1,136 @@
+import React, { type FC, useCallback, useEffect, useRef, useState } from 'react'
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+import cn from '@/utils/classnames'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import Button from '@/app/components/base/button'
+import { checkJsonDepth } from '../../utils'
+import { JSON_SCHEMA_MAX_DEPTH } from '@/config'
+import CodeEditor from './code-editor'
+import ErrorMessage from './error-message'
+import { useVisualEditorStore } from './visual-editor/store'
+import { useMittContext } from './visual-editor/context'
+
+type JsonImporterProps = {
+  onSubmit: (schema: any) => void
+  updateBtnWidth: (width: number) => void
+}
+
+const JsonImporter: FC<JsonImporterProps> = ({
+  onSubmit,
+  updateBtnWidth,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const [json, setJson] = useState('')
+  const [parseError, setParseError] = useState<any>(null)
+  const importBtnRef = useRef<HTMLButtonElement>(null)
+  const advancedEditing = useVisualEditorStore(state => state.advancedEditing)
+  const isAddingNewField = useVisualEditorStore(state => state.isAddingNewField)
+  const { emit } = useMittContext()
+
+  useEffect(() => {
+    if (importBtnRef.current) {
+      const rect = importBtnRef.current.getBoundingClientRect()
+      updateBtnWidth(rect.width)
+    }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  const handleTrigger = useCallback((e: React.MouseEvent<HTMLElement, MouseEvent>) => {
+    e.stopPropagation()
+    if (advancedEditing || isAddingNewField)
+      emit('quitEditing', {})
+    setOpen(!open)
+  }, [open, advancedEditing, isAddingNewField, emit])
+
+  const onClose = useCallback(() => {
+    setOpen(false)
+  }, [])
+
+  const handleSubmit = useCallback(() => {
+    try {
+      const parsedJSON = JSON.parse(json)
+      if (typeof parsedJSON !== 'object' || Array.isArray(parsedJSON)) {
+        setParseError(new Error('Root must be an object, not an array or primitive value.'))
+        return
+      }
+      const maxDepth = checkJsonDepth(parsedJSON)
+      if (maxDepth > JSON_SCHEMA_MAX_DEPTH) {
+        setParseError({
+          type: 'error',
+          message: `Schema exceeds maximum depth of ${JSON_SCHEMA_MAX_DEPTH}.`,
+        })
+        return
+      }
+      onSubmit(parsedJSON)
+      setParseError(null)
+      setOpen(false)
+    }
+    catch (e: any) {
+      if (e instanceof Error)
+        setParseError(e)
+      else
+        setParseError(new Error('Invalid JSON'))
+    }
+  }, [onSubmit, json])
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 16,
+      }}
+    >
+      <PortalToFollowElemTrigger ref={importBtnRef} onClick={handleTrigger}>
+        <button
+          type='button'
+          className={cn(
+            'system-xs-medium flex shrink-0 rounded-md px-1.5 py-1 text-text-tertiary hover:bg-components-button-ghost-bg-hover',
+            open && 'bg-components-button-ghost-bg-hover',
+          )}
+        >
+          <span className='px-0.5'>{t('workflow.nodes.llm.jsonSchema.import')}</span>
+        </button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[100]'>
+        <div className='flex w-[400px] flex-col rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-2xl shadow-shadow-shadow-9'>
+          {/* Title */}
+          <div className='relative px-3 pb-1 pt-3.5'>
+            <div className='absolute bottom-0 right-2.5 flex h-8 w-8 items-center justify-center' onClick={onClose}>
+              <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+            </div>
+            <div className='system-xl-semibold flex pl-1 pr-8 text-text-primary'>
+              {t('workflow.nodes.llm.jsonSchema.import')}
+            </div>
+          </div>
+          {/* Content */}
+          <div className='px-4 py-2'>
+            <CodeEditor
+              className='rounded-lg'
+              editorWrapperClassName='h-[340px]'
+              value={json}
+              onUpdate={setJson}
+              showFormatButton={false}
+            />
+            {parseError && <ErrorMessage message={parseError.message} />}
+          </div>
+          {/* Footer */}
+          <div className='flex items-center justify-end gap-x-2 p-4 pt-2'>
+            <Button variant='secondary' onClick={onClose}>
+              {t('common.operation.cancel')}
+            </Button>
+            <Button variant='primary' onClick={handleSubmit}>
+              {t('common.operation.submit')}
+            </Button>
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default JsonImporter
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-config.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-config.tsx
new file mode 100644
index 0000000..344d02c
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-config.tsx
@@ -0,0 +1,301 @@
+import React, { type FC, useCallback, useState } from 'react'
+import { type SchemaRoot, Type } from '../../types'
+import { RiBracesLine, RiCloseLine, RiExternalLinkLine, RiTimelineView } from '@remixicon/react'
+import { SegmentedControl } from '../../../../../base/segmented-control'
+import JsonSchemaGenerator from './json-schema-generator'
+import Divider from '@/app/components/base/divider'
+import JsonImporter from './json-importer'
+import { useTranslation } from 'react-i18next'
+import Button from '@/app/components/base/button'
+import VisualEditor from './visual-editor'
+import SchemaEditor from './schema-editor'
+import {
+  checkJsonSchemaDepth,
+  convertBooleanToString,
+  getValidationErrorMessage,
+  jsonToSchema,
+  preValidateSchema,
+  validateSchemaAgainstDraft7,
+} from '../../utils'
+import { MittProvider, VisualEditorContextProvider, useMittContext } from './visual-editor/context'
+import ErrorMessage from './error-message'
+import { useVisualEditorStore } from './visual-editor/store'
+import Toast from '@/app/components/base/toast'
+import { useGetLanguage } from '@/context/i18n'
+import { JSON_SCHEMA_MAX_DEPTH } from '@/config'
+
+type JsonSchemaConfigProps = {
+  defaultSchema?: SchemaRoot
+  onSave: (schema: SchemaRoot) => void
+  onClose: () => void
+}
+
+enum SchemaView {
+  VisualEditor = 'visualEditor',
+  JsonSchema = 'jsonSchema',
+}
+
+const VIEW_TABS = [
+  { Icon: RiTimelineView, text: 'Visual Editor', value: SchemaView.VisualEditor },
+  { Icon: RiBracesLine, text: 'JSON Schema', value: SchemaView.JsonSchema },
+]
+
+const DEFAULT_SCHEMA: SchemaRoot = {
+  type: Type.object,
+  properties: {},
+  required: [],
+  additionalProperties: false,
+}
+
+const HELP_DOC_URL = {
+  zh_Hans: 'https://docs.dify.ai/zh-hans/guides/workflow/structured-outputs',
+  en_US: 'https://docs.dify.ai/en/guides/workflow/structured-outputs',
+  ja_JP: 'https://docs.dify.ai/ja-jp/guides/workflow/structured-outputs',
+}
+
+type LocaleKey = keyof typeof HELP_DOC_URL
+
+const JsonSchemaConfig: FC<JsonSchemaConfigProps> = ({
+  defaultSchema,
+  onSave,
+  onClose,
+}) => {
+  const { t } = useTranslation()
+  const locale = useGetLanguage() as LocaleKey
+  const [currentTab, setCurrentTab] = useState(SchemaView.VisualEditor)
+  const [jsonSchema, setJsonSchema] = useState(defaultSchema || DEFAULT_SCHEMA)
+  const [json, setJson] = useState(JSON.stringify(jsonSchema, null, 2))
+  const [btnWidth, setBtnWidth] = useState(0)
+  const [parseError, setParseError] = useState<Error | null>(null)
+  const [validationError, setValidationError] = useState<string>('')
+  const advancedEditing = useVisualEditorStore(state => state.advancedEditing)
+  const setAdvancedEditing = useVisualEditorStore(state => state.setAdvancedEditing)
+  const isAddingNewField = useVisualEditorStore(state => state.isAddingNewField)
+  const setIsAddingNewField = useVisualEditorStore(state => state.setIsAddingNewField)
+  const setHoveringProperty = useVisualEditorStore(state => state.setHoveringProperty)
+  const { emit } = useMittContext()
+
+  const updateBtnWidth = useCallback((width: number) => {
+    setBtnWidth(width + 32)
+  }, [])
+
+  const handleTabChange = useCallback((value: SchemaView) => {
+    if (currentTab === value) return
+    if (currentTab === SchemaView.JsonSchema) {
+      try {
+        const schema = JSON.parse(json)
+        setParseError(null)
+        const result = preValidateSchema(schema)
+        if (!result.success) {
+          setValidationError(result.error.message)
+          return
+        }
+        const schemaDepth = checkJsonSchemaDepth(schema)
+        if (schemaDepth > JSON_SCHEMA_MAX_DEPTH) {
+          setValidationError(`Schema exceeds maximum depth of ${JSON_SCHEMA_MAX_DEPTH}.`)
+          return
+        }
+        convertBooleanToString(schema)
+        const validationErrors = validateSchemaAgainstDraft7(schema)
+        if (validationErrors.length > 0) {
+          setValidationError(getValidationErrorMessage(validationErrors))
+          return
+        }
+        setJsonSchema(schema)
+        setValidationError('')
+      }
+      catch (error) {
+        setValidationError('')
+        if (error instanceof Error)
+          setParseError(error)
+        else
+          setParseError(new Error('Invalid JSON'))
+        return
+      }
+    }
+    else if (currentTab === SchemaView.VisualEditor) {
+      if (advancedEditing || isAddingNewField)
+        emit('quitEditing', { callback: (backup: SchemaRoot) => setJson(JSON.stringify(backup || jsonSchema, null, 2)) })
+      else
+        setJson(JSON.stringify(jsonSchema, null, 2))
+    }
+
+    setCurrentTab(value)
+  }, [currentTab, jsonSchema, json, advancedEditing, isAddingNewField, emit])
+
+  const handleApplySchema = useCallback((schema: SchemaRoot) => {
+    if (currentTab === SchemaView.VisualEditor)
+      setJsonSchema(schema)
+    else if (currentTab === SchemaView.JsonSchema)
+      setJson(JSON.stringify(schema, null, 2))
+  }, [currentTab])
+
+  const handleSubmit = useCallback((schema: any) => {
+    const jsonSchema = jsonToSchema(schema) as SchemaRoot
+    if (currentTab === SchemaView.VisualEditor)
+      setJsonSchema(jsonSchema)
+    else if (currentTab === SchemaView.JsonSchema)
+      setJson(JSON.stringify(jsonSchema, null, 2))
+  }, [currentTab])
+
+  const handleVisualEditorUpdate = useCallback((schema: SchemaRoot) => {
+    setJsonSchema(schema)
+  }, [])
+
+  const handleSchemaEditorUpdate = useCallback((schema: string) => {
+    setJson(schema)
+  }, [])
+
+  const handleResetDefaults = useCallback(() => {
+    if (currentTab === SchemaView.VisualEditor) {
+      setHoveringProperty(null)
+      advancedEditing && setAdvancedEditing(false)
+      isAddingNewField && setIsAddingNewField(false)
+    }
+    setJsonSchema(DEFAULT_SCHEMA)
+    setJson(JSON.stringify(DEFAULT_SCHEMA, null, 2))
+  }, [currentTab, advancedEditing, isAddingNewField, setAdvancedEditing, setIsAddingNewField, setHoveringProperty])
+
+  const handleCancel = useCallback(() => {
+    onClose()
+  }, [onClose])
+
+  const handleSave = useCallback(() => {
+    let schema = jsonSchema
+    if (currentTab === SchemaView.JsonSchema) {
+      try {
+        schema = JSON.parse(json)
+        setParseError(null)
+        const result = preValidateSchema(schema)
+        if (!result.success) {
+          setValidationError(result.error.message)
+          return
+        }
+        const schemaDepth = checkJsonSchemaDepth(schema)
+        if (schemaDepth > JSON_SCHEMA_MAX_DEPTH) {
+          setValidationError(`Schema exceeds maximum depth of ${JSON_SCHEMA_MAX_DEPTH}.`)
+          return
+        }
+        convertBooleanToString(schema)
+        const validationErrors = validateSchemaAgainstDraft7(schema)
+        if (validationErrors.length > 0) {
+          setValidationError(getValidationErrorMessage(validationErrors))
+          return
+        }
+        setJsonSchema(schema)
+        setValidationError('')
+      }
+      catch (error) {
+        setValidationError('')
+        if (error instanceof Error)
+          setParseError(error)
+        else
+          setParseError(new Error('Invalid JSON'))
+        return
+      }
+    }
+    else if (currentTab === SchemaView.VisualEditor) {
+      if (advancedEditing || isAddingNewField) {
+        Toast.notify({
+          type: 'warning',
+          message: t('workflow.nodes.llm.jsonSchema.warningTips.saveSchema'),
+        })
+        return
+      }
+    }
+    onSave(schema)
+    onClose()
+  }, [currentTab, jsonSchema, json, onSave, onClose, advancedEditing, isAddingNewField, t])
+
+  return (
+    <div className='flex h-full flex-col'>
+      {/* Header */}
+      <div className='relative flex p-6 pb-3 pr-14'>
+        <div className='title-2xl-semi-bold grow truncate text-text-primary'>
+          {t('workflow.nodes.llm.jsonSchema.title')}
+        </div>
+        <div className='absolute right-5 top-5 flex h-8 w-8 items-center justify-center p-1.5' onClick={onClose}>
+          <RiCloseLine className='h-[18px] w-[18px] text-text-tertiary' />
+        </div>
+      </div>
+      {/* Content */}
+      <div className='flex items-center justify-between px-6 py-2'>
+        {/* Tab */}
+        <SegmentedControl<SchemaView>
+          options={VIEW_TABS}
+          value={currentTab}
+          onChange={handleTabChange}
+        />
+        <div className='flex items-center gap-x-0.5'>
+          {/* JSON Schema Generator */}
+          <JsonSchemaGenerator
+            crossAxisOffset={btnWidth}
+            onApply={handleApplySchema}
+          />
+          <Divider type='vertical' className='h-3' />
+          {/* JSON Schema Importer */}
+          <JsonImporter
+            updateBtnWidth={updateBtnWidth}
+            onSubmit={handleSubmit}
+          />
+        </div>
+      </div>
+      <div className='flex grow flex-col gap-y-1 overflow-hidden px-6'>
+        {currentTab === SchemaView.VisualEditor && (
+          <VisualEditor
+            schema={jsonSchema}
+            onChange={handleVisualEditorUpdate}
+          />
+        )}
+        {currentTab === SchemaView.JsonSchema && (
+          <SchemaEditor
+            schema={json}
+            onUpdate={handleSchemaEditorUpdate}
+          />
+        )}
+        {parseError && <ErrorMessage message={parseError.message} />}
+        {validationError && <ErrorMessage message={validationError} />}
+      </div>
+      {/* Footer */}
+      <div className='flex items-center gap-x-2 p-6 pt-5'>
+        <a
+          className='flex grow items-center gap-x-1 text-text-accent'
+          href={HELP_DOC_URL[locale]}
+          target='_blank'
+          rel='noopener noreferrer'
+        >
+          <span className='system-xs-regular'>{t('workflow.nodes.llm.jsonSchema.doc')}</span>
+          <RiExternalLinkLine className='h-3 w-3' />
+        </a>
+        <div className='flex items-center gap-x-3'>
+          <div className='flex items-center gap-x-2'>
+            <Button variant='secondary' onClick={handleResetDefaults}>
+              {t('workflow.nodes.llm.jsonSchema.resetDefaults')}
+            </Button>
+            <Divider type='vertical' className='ml-1 mr-0 h-4' />
+          </div>
+          <div className='flex items-center gap-x-2'>
+            <Button variant='secondary' onClick={handleCancel}>
+              {t('common.operation.cancel')}
+            </Button>
+            <Button variant='primary' onClick={handleSave}>
+              {t('common.operation.save')}
+            </Button>
+          </div>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+const JsonSchemaConfigWrapper: FC<JsonSchemaConfigProps> = (props) => {
+  return (
+    <MittProvider>
+      <VisualEditorContextProvider>
+        <JsonSchemaConfig {...props} />
+      </VisualEditorContextProvider>
+    </MittProvider>
+  )
+}
+
+export default JsonSchemaConfigWrapper
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/assets/index.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/assets/index.tsx
new file mode 100644
index 0000000..5f1f117
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/assets/index.tsx
@@ -0,0 +1,7 @@
+import SchemaGeneratorLight from './schema-generator-light'
+import SchemaGeneratorDark from './schema-generator-dark'
+
+export {
+  SchemaGeneratorLight,
+  SchemaGeneratorDark,
+}
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/assets/schema-generator-dark.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/assets/schema-generator-dark.tsx
new file mode 100644
index 0000000..ac4793b
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/assets/schema-generator-dark.tsx
@@ -0,0 +1,15 @@
+const SchemaGeneratorDark = () => {
+  return (
+    <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
+      <path d="M9.33329 2.95825C10.2308 2.95825 10.9583 2.23071 10.9583 1.33325H11.7083C11.7083 2.23071 12.4358 2.95825 13.3333 2.95825V3.70825C12.4358 3.70825 11.7083 4.43579 11.7083 5.33325H10.9583C10.9583 4.43579 10.2308 3.70825 9.33329 3.70825V2.95825ZM0.666626 7.33325C2.87577 7.33325 4.66663 5.54239 4.66663 3.33325H5.99996C5.99996 5.54239 7.79083 7.33325 9.99996 7.33325V8.66659C7.79083 8.66659 5.99996 10.4575 5.99996 12.6666H4.66663C4.66663 10.4575 2.87577 8.66659 0.666626 8.66659V7.33325ZM11.5 9.33325C11.5 10.5299 10.5299 11.4999 9.33329 11.4999V12.4999C10.5299 12.4999 11.5 13.47 11.5 14.6666H12.5C12.5 13.47 13.47 12.4999 14.6666 12.4999V11.4999C13.47 11.4999 12.5 10.5299 12.5 9.33325H11.5Z" fill="url(#paint0_linear_13059_32065)" fillOpacity="0.95" />
+      <defs>
+        <linearGradient id="paint0_linear_13059_32065" x1="14.9996" y1="15" x2="-2.55847" y2="16.6207" gradientUnits="userSpaceOnUse">
+          <stop stopColor="#36BFFA" />
+          <stop offset="1" stopColor="#296DFF" />
+        </linearGradient>
+      </defs>
+    </svg>
+  )
+}
+
+export default SchemaGeneratorDark
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/assets/schema-generator-light.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/assets/schema-generator-light.tsx
new file mode 100644
index 0000000..8b898bd
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/assets/schema-generator-light.tsx
@@ -0,0 +1,15 @@
+const SchemaGeneratorLight = () => {
+  return (
+    <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
+      <path d="M9.33329 2.95837C10.2308 2.95837 10.9583 2.23083 10.9583 1.33337H11.7083C11.7083 2.23083 12.4358 2.95837 13.3333 2.95837V3.70837C12.4358 3.70837 11.7083 4.43591 11.7083 5.33337H10.9583C10.9583 4.43591 10.2308 3.70837 9.33329 3.70837V2.95837ZM0.666626 7.33337C2.87577 7.33337 4.66663 5.54251 4.66663 3.33337H5.99996C5.99996 5.54251 7.79083 7.33337 9.99996 7.33337V8.66671C7.79083 8.66671 5.99996 10.4576 5.99996 12.6667H4.66663C4.66663 10.4576 2.87577 8.66671 0.666626 8.66671V7.33337ZM11.5 9.33337C11.5 10.53 10.5299 11.5 9.33329 11.5V12.5C10.5299 12.5 11.5 13.4701 11.5 14.6667H12.5C12.5 13.4701 13.47 12.5 14.6666 12.5V11.5C13.47 11.5 12.5 10.53 12.5 9.33337H11.5Z" fill="url(#paint0_linear_13059_18704)" fillOpacity="0.95" />
+      <defs>
+        <linearGradient id="paint0_linear_13059_18704" x1="14.9996" y1="15.0001" x2="-2.55847" y2="16.6209" gradientUnits="userSpaceOnUse">
+          <stop stopColor="#0BA5EC" />
+          <stop offset="1" stopColor="#155AEF" />
+        </linearGradient>
+      </defs>
+    </svg>
+  )
+}
+
+export default SchemaGeneratorLight
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/generated-result.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/generated-result.tsx
new file mode 100644
index 0000000..00f5723
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/generated-result.tsx
@@ -0,0 +1,121 @@
+import React, { type FC, useCallback, useMemo, useState } from 'react'
+import type { SchemaRoot } from '../../../types'
+import { RiArrowLeftLine, RiCloseLine, RiSparklingLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import Button from '@/app/components/base/button'
+import CodeEditor from '../code-editor'
+import ErrorMessage from '../error-message'
+import { getValidationErrorMessage, validateSchemaAgainstDraft7 } from '../../../utils'
+import Loading from '@/app/components/base/loading'
+
+type GeneratedResultProps = {
+  schema: SchemaRoot
+  isGenerating: boolean
+  onBack: () => void
+  onRegenerate: () => void
+  onClose: () => void
+  onApply: () => void
+}
+
+const GeneratedResult: FC<GeneratedResultProps> = ({
+  schema,
+  isGenerating,
+  onBack,
+  onRegenerate,
+  onClose,
+  onApply,
+}) => {
+  const { t } = useTranslation()
+  const [parseError, setParseError] = useState<Error | null>(null)
+  const [validationError, setValidationError] = useState<string>('')
+
+  const formatJSON = (json: SchemaRoot) => {
+    try {
+      const schema = JSON.stringify(json, null, 2)
+      setParseError(null)
+      return schema
+    }
+    catch (e) {
+      if (e instanceof Error)
+        setParseError(e)
+      else
+        setParseError(new Error('Invalid JSON'))
+      return ''
+    }
+  }
+
+  const jsonSchema = useMemo(() => formatJSON(schema), [schema])
+
+  const handleApply = useCallback(() => {
+    const validationErrors = validateSchemaAgainstDraft7(schema)
+    if (validationErrors.length > 0) {
+      setValidationError(getValidationErrorMessage(validationErrors))
+      return
+    }
+    onApply()
+    setValidationError('')
+  }, [schema, onApply])
+
+  return (
+    <div className='flex w-[480px] flex-col rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-2xl shadow-shadow-shadow-9'>
+      {
+        isGenerating ? (
+          <div className='flex h-[600px] flex-col items-center justify-center gap-y-3'>
+            <Loading type='area' />
+            <div className='system-xs-regular text-text-tertiary'>{t('workflow.nodes.llm.jsonSchema.generating')}</div>
+          </div>
+        ) : (
+          <>
+            <div className='absolute right-2.5 top-2.5 flex h-8 w-8 items-center justify-center' onClick={onClose}>
+              <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+            </div>
+            {/* Title */}
+            <div className='flex flex-col gap-y-[0.5px] px-3 pb-1 pt-3.5'>
+              <div className='system-xl-semibold flex pl-1 pr-8 text-text-primary'>
+                {t('workflow.nodes.llm.jsonSchema.generatedResult')}
+              </div>
+              <div className='system-xs-regular flex px-1 text-text-tertiary'>
+                {t('workflow.nodes.llm.jsonSchema.resultTip')}
+              </div>
+            </div>
+            {/* Content */}
+            <div className='px-4 py-2'>
+              <CodeEditor
+                className='rounded-lg'
+                editorWrapperClassName='h-[424px]'
+                value={jsonSchema}
+                readOnly
+                showFormatButton={false}
+              />
+              {parseError && <ErrorMessage message={parseError.message} />}
+              {validationError && <ErrorMessage message={validationError} />}
+            </div>
+            {/* Footer */}
+            <div className='flex items-center justify-between p-4 pt-2'>
+              <Button variant='secondary' className='flex items-center gap-x-0.5' onClick={onBack}>
+                <RiArrowLeftLine className='h-4 w-4' />
+                <span>{t('workflow.nodes.llm.jsonSchema.back')}</span>
+              </Button>
+              <div className='flex items-center gap-x-2'>
+                <Button
+                  variant='secondary'
+                  className='flex items-center gap-x-0.5'
+                  onClick={onRegenerate}
+                >
+                  <RiSparklingLine className='h-4 w-4' />
+                  <span>{t('workflow.nodes.llm.jsonSchema.regenerate')}</span>
+                </Button>
+                <Button variant='primary' onClick={handleApply}>
+                  {t('workflow.nodes.llm.jsonSchema.apply')}
+                </Button>
+              </div>
+            </div>
+
+          </>
+        )
+      }
+    </div>
+  )
+}
+
+export default React.memo(GeneratedResult)
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/index.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/index.tsx
new file mode 100644
index 0000000..4732499
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/index.tsx
@@ -0,0 +1,183 @@
+import React, { type FC, useCallback, useEffect, useState } from 'react'
+import type { SchemaRoot } from '../../../types'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import useTheme from '@/hooks/use-theme'
+import type { CompletionParams, Model } from '@/types/app'
+import { ModelModeType } from '@/types/app'
+import { Theme } from '@/types/app'
+import { SchemaGeneratorDark, SchemaGeneratorLight } from './assets'
+import cn from '@/utils/classnames'
+import type { ModelInfo } from './prompt-editor'
+import PromptEditor from './prompt-editor'
+import GeneratedResult from './generated-result'
+import { useGenerateStructuredOutputRules } from '@/service/use-common'
+import Toast from '@/app/components/base/toast'
+import { type FormValue, ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { useVisualEditorStore } from '../visual-editor/store'
+import { useTranslation } from 'react-i18next'
+import { useMittContext } from '../visual-editor/context'
+
+type JsonSchemaGeneratorProps = {
+  onApply: (schema: SchemaRoot) => void
+  crossAxisOffset?: number
+}
+
+enum GeneratorView {
+  promptEditor = 'promptEditor',
+  result = 'result',
+}
+
+export const JsonSchemaGenerator: FC<JsonSchemaGeneratorProps> = ({
+  onApply,
+  crossAxisOffset,
+}) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const [view, setView] = useState(GeneratorView.promptEditor)
+  const [model, setModel] = useState<Model>({
+    name: '',
+    provider: '',
+    mode: ModelModeType.completion,
+    completion_params: {} as CompletionParams,
+  })
+  const [instruction, setInstruction] = useState('')
+  const [schema, setSchema] = useState<SchemaRoot | null>(null)
+  const { theme } = useTheme()
+  const {
+    defaultModel,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.textGeneration)
+  const advancedEditing = useVisualEditorStore(state => state.advancedEditing)
+  const isAddingNewField = useVisualEditorStore(state => state.isAddingNewField)
+  const { emit } = useMittContext()
+  const SchemaGenerator = theme === Theme.light ? SchemaGeneratorLight : SchemaGeneratorDark
+
+  useEffect(() => {
+    if (defaultModel) {
+      setModel(prev => ({
+        ...prev,
+        name: defaultModel.model,
+        provider: defaultModel.provider.provider,
+      }))
+    }
+  }, [defaultModel])
+
+  const handleTrigger = useCallback((e: React.MouseEvent<HTMLElement, MouseEvent>) => {
+    e.stopPropagation()
+    if (advancedEditing || isAddingNewField)
+      emit('quitEditing', {})
+    setOpen(!open)
+  }, [open, advancedEditing, isAddingNewField, emit])
+
+  const onClose = useCallback(() => {
+    setOpen(false)
+  }, [])
+
+  const handleModelChange = useCallback((model: ModelInfo) => {
+    setModel(prev => ({
+      ...prev,
+      provider: model.provider,
+      name: model.modelId,
+      mode: model.mode as ModelModeType,
+    }))
+  }, [])
+
+  const handleCompletionParamsChange = useCallback((newParams: FormValue) => {
+    setModel(prev => ({
+      ...prev,
+      completion_params: newParams as CompletionParams,
+    }),
+    )
+  }, [])
+
+  const { mutateAsync: generateStructuredOutputRules, isPending: isGenerating } = useGenerateStructuredOutputRules()
+
+  const generateSchema = useCallback(async () => {
+    const { output, error } = await generateStructuredOutputRules({ instruction, model_config: model! })
+    if (error) {
+      Toast.notify({
+        type: 'error',
+        message: error,
+      })
+      setSchema(null)
+      setView(GeneratorView.promptEditor)
+      return
+    }
+    return output
+  }, [instruction, model, generateStructuredOutputRules])
+
+  const handleGenerate = useCallback(async () => {
+    setView(GeneratorView.result)
+    const output = await generateSchema()
+    if (output === undefined) return
+    setSchema(JSON.parse(output))
+  }, [generateSchema])
+
+  const goBackToPromptEditor = () => {
+    setView(GeneratorView.promptEditor)
+  }
+
+  const handleRegenerate = useCallback(async () => {
+    const output = await generateSchema()
+    if (output === undefined) return
+    setSchema(JSON.parse(output))
+  }, [generateSchema])
+
+  const handleApply = () => {
+    onApply(schema!)
+    setOpen(false)
+  }
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: 4,
+        crossAxis: crossAxisOffset ?? 0,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={handleTrigger}>
+        <button
+          type='button'
+          className={cn(
+            'flex h-6 w-6 items-center justify-center rounded-md p-0.5 hover:bg-state-accent-hover',
+            open && 'bg-state-accent-active',
+          )}
+        >
+          <SchemaGenerator />
+        </button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[100]'>
+        {view === GeneratorView.promptEditor && (
+          <PromptEditor
+            instruction={instruction}
+            model={model}
+            onInstructionChange={setInstruction}
+            onCompletionParamsChange={handleCompletionParamsChange}
+            onGenerate={handleGenerate}
+            onClose={onClose}
+            onModelChange={handleModelChange}
+          />
+        )}
+        {view === GeneratorView.result && (
+          <GeneratedResult
+            schema={schema!}
+            isGenerating={isGenerating}
+            onBack={goBackToPromptEditor}
+            onRegenerate={handleRegenerate}
+            onApply={handleApply}
+            onClose={onClose}
+          />
+        )}
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default JsonSchemaGenerator
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/prompt-editor.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/prompt-editor.tsx
new file mode 100644
index 0000000..9387813
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/prompt-editor.tsx
@@ -0,0 +1,108 @@
+import React, { useCallback } from 'react'
+import type { FC } from 'react'
+import { RiCloseLine, RiSparklingFill } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import Textarea from '@/app/components/base/textarea'
+import Tooltip from '@/app/components/base/tooltip'
+import Button from '@/app/components/base/button'
+import type { FormValue } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal'
+import type { Model } from '@/types/app'
+
+export type ModelInfo = {
+  modelId: string
+  provider: string
+  mode?: string
+  features?: string[]
+}
+
+type PromptEditorProps = {
+  instruction: string
+  model: Model
+  onInstructionChange: (instruction: string) => void
+  onCompletionParamsChange: (newParams: FormValue) => void
+  onModelChange: (model: ModelInfo) => void
+  onClose: () => void
+  onGenerate: () => void
+}
+
+const PromptEditor: FC<PromptEditorProps> = ({
+  instruction,
+  model,
+  onInstructionChange,
+  onCompletionParamsChange,
+  onClose,
+  onGenerate,
+  onModelChange,
+}) => {
+  const { t } = useTranslation()
+
+  const handleInstructionChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {
+    onInstructionChange(e.target.value)
+  }, [onInstructionChange])
+
+  return (
+    <div className='relative flex w-[480px] flex-col rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-2xl shadow-shadow-shadow-9'>
+      <div className='absolute right-2.5 top-2.5 flex h-8 w-8 items-center justify-center' onClick={onClose}>
+        <RiCloseLine className='h-4 w-4 text-text-tertiary'/>
+      </div>
+      {/* Title */}
+      <div className='flex flex-col gap-y-[0.5px] px-3 pb-1 pt-3.5'>
+        <div className='system-xl-semibold flex pl-1 pr-8 text-text-primary'>
+          {t('workflow.nodes.llm.jsonSchema.generateJsonSchema')}
+        </div>
+        <div className='system-xs-regular flex px-1 text-text-tertiary'>
+          {t('workflow.nodes.llm.jsonSchema.generationTip')}
+        </div>
+      </div>
+      {/* Content */}
+      <div className='flex flex-col gap-y-1 px-4 py-2'>
+        <div className='system-sm-semibold-uppercase flex h-6 items-center text-text-secondary'>
+          {t('common.modelProvider.model')}
+        </div>
+        <ModelParameterModal
+          popupClassName='!w-[448px]'
+          portalToFollowElemContentClassName='z-[1000]'
+          isAdvancedMode={true}
+          provider={model.provider}
+          mode={model.mode}
+          completionParams={model.completion_params}
+          modelId={model.name}
+          setModel={onModelChange}
+          onCompletionParamsChange={onCompletionParamsChange}
+          hideDebugWithMultipleModel
+        />
+      </div>
+      <div className='flex flex-col gap-y-1 px-4 py-2'>
+        <div className='system-sm-semibold-uppercase flex h-6 items-center text-text-secondary'>
+          <span>{t('workflow.nodes.llm.jsonSchema.instruction')}</span>
+          <Tooltip popupContent={t('workflow.nodes.llm.jsonSchema.promptTooltip')} />
+        </div>
+        <div className='flex items-center'>
+          <Textarea
+            className='h-[364px] resize-none px-2 py-1'
+            value={instruction}
+            placeholder={t('workflow.nodes.llm.jsonSchema.promptPlaceholder')}
+            onChange={handleInstructionChange}
+          />
+        </div>
+      </div>
+      {/* Footer */}
+      <div className='flex justify-end gap-x-2 p-4 pt-2'>
+        <Button variant='secondary' onClick={onClose}>
+          {t('common.operation.cancel')}
+        </Button>
+        <Button
+          variant='primary'
+          className='flex items-center gap-x-0.5'
+          onClick={onGenerate}
+        >
+          <RiSparklingFill className='h-4 w-4' />
+          <span>{t('workflow.nodes.llm.jsonSchema.generate')}</span>
+        </Button>
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(PromptEditor)
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/schema-editor.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/schema-editor.tsx
new file mode 100644
index 0000000..e78b922
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/schema-editor.tsx
@@ -0,0 +1,23 @@
+import React, { type FC } from 'react'
+import CodeEditor from './code-editor'
+
+type SchemaEditorProps = {
+  schema: string
+  onUpdate: (schema: string) => void
+}
+
+const SchemaEditor: FC<SchemaEditorProps> = ({
+  schema,
+  onUpdate,
+}) => {
+  return (
+    <CodeEditor
+      className='rounded-xl'
+      editorWrapperClassName='grow'
+      value={schema}
+      onUpdate={onUpdate}
+    />
+  )
+}
+
+export default SchemaEditor
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/add-field.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/add-field.tsx
new file mode 100644
index 0000000..ab28233
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/add-field.tsx
@@ -0,0 +1,33 @@
+import React, { useCallback } from 'react'
+import Button from '@/app/components/base/button'
+import { RiAddCircleFill } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useVisualEditorStore } from './store'
+import { useMittContext } from './context'
+
+const AddField = () => {
+  const { t } = useTranslation()
+  const setIsAddingNewField = useVisualEditorStore(state => state.setIsAddingNewField)
+  const { emit } = useMittContext()
+
+  const handleAddField = useCallback(() => {
+    setIsAddingNewField(true)
+    emit('addField', { path: [] })
+  }, [setIsAddingNewField, emit])
+
+  return (
+    <div className='py-2 pl-5'>
+      <Button
+        size='small'
+        variant='secondary-accent'
+        className='flex items-center gap-x-[1px]'
+        onClick={handleAddField}
+      >
+        <RiAddCircleFill className='h-3.5 w-3.5'/>
+        <span className='px-[3px]'>{t('workflow.nodes.llm.jsonSchema.addField')}</span>
+      </Button>
+    </div>
+  )
+}
+
+export default React.memo(AddField)
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/card.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/card.tsx
new file mode 100644
index 0000000..4f53f6b
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/card.tsx
@@ -0,0 +1,46 @@
+import React, { type FC } from 'react'
+import { useTranslation } from 'react-i18next'
+
+type CardProps = {
+  name: string
+  type: string
+  required: boolean
+  description?: string
+}
+
+const Card: FC<CardProps> = ({
+  name,
+  type,
+  required,
+  description,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex flex-col py-0.5'>
+      <div className='flex h-6 items-center gap-x-1 pl-1 pr-0.5'>
+        <div className='system-sm-semibold truncate border border-transparent px-1 py-px text-text-primary'>
+          {name}
+        </div>
+        <div className='system-xs-medium px-1 py-0.5 text-text-tertiary'>
+          {type}
+        </div>
+        {
+          required && (
+            <div className='system-2xs-medium-uppercase px-1 py-0.5 text-text-warning'>
+              {t('workflow.nodes.llm.jsonSchema.required')}
+            </div>
+          )
+        }
+      </div>
+
+      {description && (
+        <div className='system-xs-regular truncate px-2 pb-1 text-text-tertiary'>
+          {description}
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default React.memo(Card)
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/context.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/context.tsx
new file mode 100644
index 0000000..5bf4b22
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/context.tsx
@@ -0,0 +1,50 @@
+import {
+  createContext,
+  useContext,
+  useRef,
+} from 'react'
+import { createVisualEditorStore } from './store'
+import { useMitt } from '@/hooks/use-mitt'
+import { noop } from 'lodash-es'
+
+type VisualEditorStore = ReturnType<typeof createVisualEditorStore>
+
+type VisualEditorContextType = VisualEditorStore | null
+
+type VisualEditorProviderProps = {
+  children: React.ReactNode
+}
+
+export const VisualEditorContext = createContext<VisualEditorContextType>(null)
+
+export const VisualEditorContextProvider = ({ children }: VisualEditorProviderProps) => {
+  const storeRef = useRef<VisualEditorStore>()
+
+  if (!storeRef.current)
+    storeRef.current = createVisualEditorStore()
+
+  return (
+    <VisualEditorContext.Provider value={storeRef.current}>
+      {children}
+    </VisualEditorContext.Provider>
+  )
+}
+
+export const MittContext = createContext<ReturnType<typeof useMitt>>({
+  emit: noop,
+  useSubscribe: noop,
+})
+
+export const MittProvider = ({ children }: { children: React.ReactNode }) => {
+  const mitt = useMitt()
+
+  return (
+    <MittContext.Provider value={mitt}>
+      {children}
+    </MittContext.Provider>
+  )
+}
+
+export const useMittContext = () => {
+  return useContext(MittContext)
+}
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/actions.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/actions.tsx
new file mode 100644
index 0000000..3f693c2
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/actions.tsx
@@ -0,0 +1,56 @@
+import type { FC } from 'react'
+import React from 'react'
+import Tooltip from '@/app/components/base/tooltip'
+import { RiAddCircleLine, RiDeleteBinLine, RiEditLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+
+type ActionsProps = {
+  disableAddBtn: boolean
+  onAddChildField: () => void
+  onEdit: () => void
+  onDelete: () => void
+}
+
+const Actions: FC<ActionsProps> = ({
+  disableAddBtn,
+  onAddChildField,
+  onEdit,
+  onDelete,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex items-center gap-x-0.5'>
+      <Tooltip popupContent={t('workflow.nodes.llm.jsonSchema.addChildField')}>
+        <button
+          type='button'
+          className='flex h-6 w-6 items-center justify-center rounded-md text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary disabled:cursor-not-allowed disabled:text-text-disabled'
+          onClick={onAddChildField}
+          disabled={disableAddBtn}
+        >
+          <RiAddCircleLine className='h-4 w-4'/>
+        </button>
+      </Tooltip>
+      <Tooltip popupContent={t('common.operation.edit')}>
+        <button
+          type='button'
+          className='flex h-6 w-6 items-center justify-center rounded-md text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary'
+          onClick={onEdit}
+        >
+          <RiEditLine className='h-4 w-4' />
+        </button>
+      </Tooltip>
+      <Tooltip popupContent={t('common.operation.remove')}>
+        <button
+          type='button'
+          className='flex h-6 w-6 items-center justify-center rounded-md text-text-tertiary hover:bg-state-destructive-hover hover:text-text-destructive'
+          onClick={onDelete}
+        >
+          <RiDeleteBinLine className='h-4 w-4' />
+        </button>
+      </Tooltip>
+    </div>
+  )
+}
+
+export default React.memo(Actions)
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/advanced-actions.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/advanced-actions.tsx
new file mode 100644
index 0000000..e065406
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/advanced-actions.tsx
@@ -0,0 +1,59 @@
+import React, { type FC } from 'react'
+import Button from '@/app/components/base/button'
+import { useTranslation } from 'react-i18next'
+import { getKeyboardKeyCodeBySystem, getKeyboardKeyNameBySystem } from '@/app/components/workflow/utils'
+import { useKeyPress } from 'ahooks'
+
+type AdvancedActionsProps = {
+  isConfirmDisabled: boolean
+  onCancel: () => void
+  onConfirm: () => void
+}
+
+const Key = (props: { keyName: string }) => {
+  const { keyName } = props
+  return (
+    <kbd className='system-kbd flex h-4 min-w-4 items-center justify-center rounded-[4px] bg-components-kbd-bg-white px-px text-text-primary-on-surface'>
+      {keyName}
+    </kbd>
+  )
+}
+
+const AdvancedActions: FC<AdvancedActionsProps> = ({
+  isConfirmDisabled,
+  onCancel,
+  onConfirm,
+}) => {
+  const { t } = useTranslation()
+
+  useKeyPress([`${getKeyboardKeyCodeBySystem('ctrl')}.enter`], (e) => {
+    e.preventDefault()
+    onConfirm()
+  }, {
+    exactMatch: true,
+    useCapture: true,
+  })
+
+  return (
+    <div className='flex items-center gap-x-1'>
+      <Button size='small' variant='secondary' onClick={onCancel}>
+        {t('common.operation.cancel')}
+      </Button>
+      <Button
+        className='flex items-center gap-x-1'
+        disabled={isConfirmDisabled}
+        size='small'
+        variant='primary'
+        onClick={onConfirm}
+      >
+        <span>{t('common.operation.confirm')}</span>
+        <div className='flex items-center gap-x-0.5'>
+          <Key keyName={getKeyboardKeyNameBySystem('ctrl')} />
+          <Key keyName='鈴�' />
+        </div>
+      </Button>
+    </div>
+  )
+}
+
+export default React.memo(AdvancedActions)
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/advanced-options.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/advanced-options.tsx
new file mode 100644
index 0000000..cd06fc8
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/advanced-options.tsx
@@ -0,0 +1,77 @@
+import React, { type FC, useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import Divider from '@/app/components/base/divider'
+import Textarea from '@/app/components/base/textarea'
+
+export type AdvancedOptionsType = {
+  enum: string
+}
+
+type AdvancedOptionsProps = {
+  options: AdvancedOptionsType
+  onChange: (options: AdvancedOptionsType) => void
+}
+
+const AdvancedOptions: FC<AdvancedOptionsProps> = ({
+  onChange,
+  options,
+}) => {
+  const { t } = useTranslation()
+  // const [showAdvancedOptions, setShowAdvancedOptions] = useState(false)
+  const [enumValue, setEnumValue] = useState(options.enum)
+
+  const handleEnumChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {
+    setEnumValue(e.target.value)
+  }, [])
+
+  const handleEnumBlur = useCallback((e: React.FocusEvent<HTMLTextAreaElement>) => {
+    onChange({ enum: e.target.value })
+  }, [onChange])
+
+  // const handleToggleAdvancedOptions = useCallback(() => {
+  //   setShowAdvancedOptions(prev => !prev)
+  // }, [])
+
+  return (
+    <div className='border-t border-divider-subtle'>
+      {/* {showAdvancedOptions ? ( */}
+      <div className='flex flex-col gap-y-1 px-2 py-1.5'>
+        <div className='flex w-full items-center gap-x-2'>
+          <span className='system-2xs-medium-uppercase text-text-tertiary'>
+            {t('workflow.nodes.llm.jsonSchema.stringValidations')}
+          </span>
+          <div className='grow'>
+            <Divider type='horizontal' className='my-0 h-px bg-line-divider-bg' />
+          </div>
+        </div>
+        <div className='flex flex-col'>
+          <div className='system-xs-medium flex h-6 items-center text-text-secondary'>
+            Enum
+          </div>
+          <Textarea
+            size='small'
+            className='min-h-6'
+            value={enumValue}
+            onChange={handleEnumChange}
+            onBlur={handleEnumBlur}
+            placeholder={'abcd, 1, 1.5, etc.'}
+          />
+        </div>
+      </div>
+      {/* ) : (
+        <button
+          type='button'
+          className='flex items-center gap-x-0.5 pb-1 pl-1.5 pr-2 pt-2'
+          onClick={handleToggleAdvancedOptions}
+        >
+          <RiArrowDownDoubleLine className='h-3 w-3 text-text-tertiary' />
+          <span className='system-xs-regular text-text-tertiary'>
+            {t('workflow.nodes.llm.jsonSchema.showAdvancedOptions')}
+          </span>
+        </button>
+      )} */}
+    </div>
+  )
+}
+
+export default React.memo(AdvancedOptions)
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/auto-width-input.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/auto-width-input.tsx
new file mode 100644
index 0000000..af4a82c
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/auto-width-input.tsx
@@ -0,0 +1,81 @@
+import React, { useEffect, useState } from 'react'
+import type { FC } from 'react'
+import cn from '@/utils/classnames'
+
+type AutoWidthInputProps = {
+  value: string
+  placeholder: string
+  onChange: (event: React.ChangeEvent<HTMLInputElement>) => void
+  onBlur: () => void
+  minWidth?: number
+  maxWidth?: number
+} & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange'>
+
+const AutoWidthInput: FC<AutoWidthInputProps> = ({
+  value,
+  placeholder,
+  onChange,
+  onBlur,
+  minWidth = 60,
+  maxWidth = 300,
+  className,
+  ...props
+}) => {
+  const [width, setWidth] = useState(minWidth)
+  const textRef = React.useRef<HTMLSpanElement>(null)
+
+  useEffect(() => {
+    if (textRef.current) {
+      textRef.current.textContent = value || placeholder
+      const textWidth = textRef.current.offsetWidth
+      const newWidth = Math.max(minWidth, Math.min(textWidth + 16, maxWidth))
+      if (width !== newWidth)
+        setWidth(newWidth)
+    }
+  }, [value, placeholder, minWidth, maxWidth, width])
+
+  // Handle Enter key
+  const handleKeyUp = (e: React.KeyboardEvent<HTMLInputElement>) => {
+    if (e.key === 'Enter' && e.currentTarget.blur)
+      e.currentTarget.blur()
+    if (props.onKeyUp)
+      props.onKeyUp(e)
+  }
+
+  return (
+    <div className='relative inline-flex items-center'>
+      {/* Hidden measurement span */}
+      <span
+        ref={textRef}
+        className='system-sm-semibold invisible absolute left-0 top-0 -z-10 whitespace-pre px-1'
+        aria-hidden="true"
+      >
+        {value || placeholder}
+      </span>
+
+      {/* Actual input element */}
+      <input
+        value={value}
+        className={cn(
+          'system-sm-semibold placeholder:system-sm-semibold h-5 rounded-[5px] border border-transparent px-1',
+          'py-px text-text-primary caret-[#295EFF] shadow-shadow-shadow-3 outline-none',
+          'placeholder:text-text-placeholder hover:bg-state-base-hover focus:border-components-input-border-active focus:bg-components-input-bg-active focus:shadow-xs',
+          className,
+        )}
+        style={{
+          width: `${width}px`,
+          minWidth: `${minWidth}px`,
+          maxWidth: `${maxWidth}px`,
+          transition: 'width 100ms ease-out',
+        }}
+        placeholder={placeholder}
+        onChange={onChange}
+        onBlur={onBlur}
+        onKeyUp={handleKeyUp}
+        {...props}
+      />
+    </div>
+  )
+}
+
+export default React.memo(AutoWidthInput)
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/index.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/index.tsx
new file mode 100644
index 0000000..4023a93
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/index.tsx
@@ -0,0 +1,277 @@
+import React, { type FC, useCallback, useMemo, useRef, useState } from 'react'
+import type { SchemaEnumType } from '../../../../types'
+import { ArrayType, Type } from '../../../../types'
+import type { TypeItem } from './type-selector'
+import TypeSelector from './type-selector'
+import RequiredSwitch from './required-switch'
+import Divider from '@/app/components/base/divider'
+import Actions from './actions'
+import AdvancedActions from './advanced-actions'
+import AdvancedOptions, { type AdvancedOptionsType } from './advanced-options'
+import { useTranslation } from 'react-i18next'
+import classNames from '@/utils/classnames'
+import { useVisualEditorStore } from '../store'
+import { useMittContext } from '../context'
+import { useUnmount } from 'ahooks'
+import { JSON_SCHEMA_MAX_DEPTH } from '@/config'
+import AutoWidthInput from './auto-width-input'
+
+export type EditData = {
+  name: string
+  type: Type | ArrayType
+  required: boolean
+  description?: string
+  enum?: SchemaEnumType
+}
+
+type Options = {
+  description?: string
+  enum?: SchemaEnumType
+}
+
+type EditCardProps = {
+  fields: EditData
+  depth: number
+  path: string[]
+  parentPath: string[]
+}
+
+const TYPE_OPTIONS = [
+  { value: Type.string, text: 'string' },
+  { value: Type.number, text: 'number' },
+  // { value: Type.boolean, text: 'boolean' },
+  { value: Type.object, text: 'object' },
+  { value: ArrayType.string, text: 'array[string]' },
+  { value: ArrayType.number, text: 'array[number]' },
+  // { value: ArrayType.boolean, text: 'array[boolean]' },
+  { value: ArrayType.object, text: 'array[object]' },
+]
+
+const MAXIMUM_DEPTH_TYPE_OPTIONS = [
+  { value: Type.string, text: 'string' },
+  { value: Type.number, text: 'number' },
+  // { value: Type.boolean, text: 'boolean' },
+  { value: ArrayType.string, text: 'array[string]' },
+  { value: ArrayType.number, text: 'array[number]' },
+  // { value: ArrayType.boolean, text: 'array[boolean]' },
+]
+
+const EditCard: FC<EditCardProps> = ({
+  fields,
+  depth,
+  path,
+  parentPath,
+}) => {
+  const { t } = useTranslation()
+  const [currentFields, setCurrentFields] = useState(fields)
+  const [backupFields, setBackupFields] = useState<EditData | null>(null)
+  const isAddingNewField = useVisualEditorStore(state => state.isAddingNewField)
+  const setIsAddingNewField = useVisualEditorStore(state => state.setIsAddingNewField)
+  const advancedEditing = useVisualEditorStore(state => state.advancedEditing)
+  const setAdvancedEditing = useVisualEditorStore(state => state.setAdvancedEditing)
+  const { emit, useSubscribe } = useMittContext()
+  const blurWithActions = useRef(false)
+
+  const maximumDepthReached = depth === JSON_SCHEMA_MAX_DEPTH
+  const disableAddBtn = maximumDepthReached || (currentFields.type !== Type.object && currentFields.type !== ArrayType.object)
+  const hasAdvancedOptions = currentFields.type === Type.string || currentFields.type === Type.number
+  const isAdvancedEditing = advancedEditing || isAddingNewField
+
+  const advancedOptions = useMemo(() => {
+    let enumValue = ''
+    if (currentFields.type === Type.string || currentFields.type === Type.number)
+      enumValue = (currentFields.enum || []).join(', ')
+    return { enum: enumValue }
+  }, [currentFields.type, currentFields.enum])
+
+  useSubscribe('restorePropertyName', () => {
+    setCurrentFields(prev => ({ ...prev, name: fields.name }))
+  })
+
+  useSubscribe('fieldChangeSuccess', () => {
+    isAddingNewField && setIsAddingNewField(false)
+    advancedEditing && setAdvancedEditing(false)
+  })
+
+  const emitPropertyNameChange = useCallback(() => {
+    emit('propertyNameChange', { path, parentPath, oldFields: fields, fields: currentFields })
+  }, [fields, currentFields, path, parentPath, emit])
+
+  const emitPropertyTypeChange = useCallback((type: Type | ArrayType) => {
+    emit('propertyTypeChange', { path, parentPath, oldFields: fields, fields: { ...currentFields, type } })
+  }, [fields, currentFields, path, parentPath, emit])
+
+  const emitPropertyRequiredToggle = useCallback(() => {
+    emit('propertyRequiredToggle', { path, parentPath, oldFields: fields, fields: currentFields })
+  }, [emit, path, parentPath, fields, currentFields])
+
+  const emitPropertyOptionsChange = useCallback((options: Options) => {
+    emit('propertyOptionsChange', { path, parentPath, oldFields: fields, fields: { ...currentFields, ...options } })
+  }, [emit, path, parentPath, fields, currentFields])
+
+  const emitPropertyDelete = useCallback(() => {
+    emit('propertyDelete', { path, parentPath, oldFields: fields, fields: currentFields })
+  }, [emit, path, parentPath, fields, currentFields])
+
+  const emitPropertyAdd = useCallback(() => {
+    emit('addField', { path })
+  }, [emit, path])
+
+  const emitFieldChange = useCallback(() => {
+    emit('fieldChange', { path, parentPath, oldFields: fields, fields: currentFields })
+  }, [emit, path, parentPath, fields, currentFields])
+
+  const handlePropertyNameChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
+    setCurrentFields(prev => ({ ...prev, name: e.target.value }))
+  }, [])
+
+  const handlePropertyNameBlur = useCallback(() => {
+    if (isAdvancedEditing) return
+    emitPropertyNameChange()
+  }, [isAdvancedEditing, emitPropertyNameChange])
+
+  const handleTypeChange = useCallback((item: TypeItem) => {
+    setCurrentFields(prev => ({ ...prev, type: item.value }))
+    if (isAdvancedEditing) return
+    emitPropertyTypeChange(item.value)
+  }, [isAdvancedEditing, emitPropertyTypeChange])
+
+  const toggleRequired = useCallback(() => {
+    setCurrentFields(prev => ({ ...prev, required: !prev.required }))
+    if (isAdvancedEditing) return
+    emitPropertyRequiredToggle()
+  }, [isAdvancedEditing, emitPropertyRequiredToggle])
+
+  const handleDescriptionChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {
+    setCurrentFields(prev => ({ ...prev, description: e.target.value }))
+  }, [])
+
+  const handleDescriptionBlur = useCallback(() => {
+    if (isAdvancedEditing) return
+    emitPropertyOptionsChange({ description: currentFields.description, enum: currentFields.enum })
+  }, [isAdvancedEditing, emitPropertyOptionsChange, currentFields])
+
+  const handleAdvancedOptionsChange = useCallback((options: AdvancedOptionsType) => {
+    let enumValue: any = options.enum
+    if (enumValue === '') {
+      enumValue = undefined
+    }
+    else {
+      enumValue = options.enum.replace(/\s/g, '').split(',')
+      if (currentFields.type === Type.number)
+        enumValue = (enumValue as SchemaEnumType).map(value => Number(value)).filter(num => !Number.isNaN(num))
+    }
+    setCurrentFields(prev => ({ ...prev, enum: enumValue }))
+    if (isAdvancedEditing) return
+    emitPropertyOptionsChange({ description: currentFields.description, enum: enumValue })
+  }, [isAdvancedEditing, emitPropertyOptionsChange, currentFields])
+
+  const handleDelete = useCallback(() => {
+    blurWithActions.current = true
+    emitPropertyDelete()
+  }, [emitPropertyDelete])
+
+  const handleAdvancedEdit = useCallback(() => {
+    setBackupFields({ ...currentFields })
+    setAdvancedEditing(true)
+  }, [currentFields, setAdvancedEditing])
+
+  const handleAddChildField = useCallback(() => {
+    blurWithActions.current = true
+    emitPropertyAdd()
+  }, [emitPropertyAdd])
+
+  const handleConfirm = useCallback(() => {
+    emitFieldChange()
+  }, [emitFieldChange])
+
+  const handleCancel = useCallback(() => {
+    if (isAddingNewField) {
+      blurWithActions.current = true
+      emit('restoreSchema')
+      setIsAddingNewField(false)
+      return
+    }
+    if (backupFields) {
+      setCurrentFields(backupFields)
+      setBackupFields(null)
+    }
+    setAdvancedEditing(false)
+  }, [isAddingNewField, emit, setIsAddingNewField, setAdvancedEditing, backupFields])
+
+  useUnmount(() => {
+    if (isAdvancedEditing || blurWithActions.current) return
+    emitFieldChange()
+  })
+
+  return (
+    <div className='flex flex-col rounded-lg bg-components-panel-bg py-0.5 shadow-sm shadow-shadow-shadow-4'>
+      <div className='flex h-6 items-center pl-1 pr-0.5'>
+        <div className='flex grow items-center gap-x-1'>
+          <AutoWidthInput
+            value={currentFields.name}
+            placeholder={t('workflow.nodes.llm.jsonSchema.fieldNamePlaceholder')}
+            minWidth={80}
+            maxWidth={300}
+            onChange={handlePropertyNameChange}
+            onBlur={handlePropertyNameBlur}
+          />
+          <TypeSelector
+            currentValue={currentFields.type}
+            items={maximumDepthReached ? MAXIMUM_DEPTH_TYPE_OPTIONS : TYPE_OPTIONS}
+            onSelect={handleTypeChange}
+            popupClassName={'z-[1000]'}
+          />
+          {
+            currentFields.required && (
+              <div className='system-2xs-medium-uppercase px-1 py-0.5 text-text-warning'>
+                {t('workflow.nodes.llm.jsonSchema.required')}
+              </div>
+            )
+          }
+        </div>
+        <RequiredSwitch
+          defaultValue={currentFields.required}
+          toggleRequired={toggleRequired}
+        />
+        <Divider type='vertical' className='h-3' />
+        {isAdvancedEditing ? (
+          <AdvancedActions
+            isConfirmDisabled={currentFields.name === ''}
+            onCancel={handleCancel}
+            onConfirm={handleConfirm}
+          />
+        ) : (
+          <Actions
+            disableAddBtn={disableAddBtn}
+            onAddChildField={handleAddChildField}
+            onDelete={handleDelete}
+            onEdit={handleAdvancedEdit}
+          />
+        )}
+      </div>
+
+      {(fields.description || isAdvancedEditing) && (
+        <div className={classNames('flex', isAdvancedEditing ? 'p-2 pt-1' : 'px-2 pb-1')}>
+          <input
+            value={currentFields.description}
+            className='system-xs-regular placeholder:system-xs-regular h-4 w-full p-0 text-text-tertiary caret-[#295EFF] outline-none placeholder:text-text-placeholder'
+            placeholder={t('workflow.nodes.llm.jsonSchema.descriptionPlaceholder')}
+            onChange={handleDescriptionChange}
+            onBlur={handleDescriptionBlur}
+            onKeyUp={e => e.key === 'Enter' && e.currentTarget.blur()}
+          />
+        </div>
+      )}
+
+      {isAdvancedEditing && hasAdvancedOptions && (
+        <AdvancedOptions
+          options={advancedOptions}
+          onChange={handleAdvancedOptionsChange}
+        />
+      )}
+    </div>
+  )
+}
+
+export default EditCard
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/required-switch.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/required-switch.tsx
new file mode 100644
index 0000000..c717940
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/required-switch.tsx
@@ -0,0 +1,25 @@
+import React from 'react'
+import type { FC } from 'react'
+import Switch from '@/app/components/base/switch'
+import { useTranslation } from 'react-i18next'
+
+type RequiredSwitchProps = {
+  defaultValue: boolean
+  toggleRequired: () => void
+}
+
+const RequiredSwitch: FC<RequiredSwitchProps> = ({
+  defaultValue,
+  toggleRequired,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex items-center gap-x-1 rounded-[5px] border border-divider-subtle bg-background-default-lighter px-1.5 py-1'>
+      <span className='system-2xs-medium-uppercase text-text-secondary'>{t('workflow.nodes.llm.jsonSchema.required')}</span>
+      <Switch size='xs' defaultValue={defaultValue} onChange={toggleRequired} />
+    </div>
+  )
+}
+
+export default React.memo(RequiredSwitch)
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/type-selector.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/type-selector.tsx
new file mode 100644
index 0000000..84d75e1
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/type-selector.tsx
@@ -0,0 +1,69 @@
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+import type { ArrayType, Type } from '../../../../types'
+import type { FC } from 'react'
+import { useState } from 'react'
+import { RiArrowDownSLine, RiCheckLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+
+export type TypeItem = {
+  value: Type | ArrayType
+  text: string
+}
+
+type TypeSelectorProps = {
+  items: TypeItem[]
+  currentValue: Type | ArrayType
+  onSelect: (item: TypeItem) => void
+  popupClassName?: string
+}
+
+const TypeSelector: FC<TypeSelectorProps> = ({
+  items,
+  currentValue,
+  onSelect,
+  popupClassName,
+}) => {
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={{
+        mainAxis: 4,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+        <div className={cn(
+          'flex items-center rounded-[5px] p-0.5 pl-1 hover:bg-state-base-hover',
+          open && 'bg-state-base-hover',
+        )}>
+          <span className='system-xs-medium text-text-tertiary'>{currentValue}</span>
+          <RiArrowDownSLine className='h-4 w-4 text-text-tertiary' />
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className={popupClassName}>
+        <div className='w-40 rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg p-1 shadow-lg shadow-shadow-shadow-5'>
+          {items.map((item) => {
+            const isSelected = item.value === currentValue
+            return (<div
+              key={item.value}
+              className={'flex items-center gap-x-1 rounded-lg px-2 py-1 hover:bg-state-base-hover'}
+              onClick={() => {
+                onSelect(item)
+                setOpen(false)
+              }}
+            >
+              <span className='system-sm-medium px-1 text-text-secondary'>{item.text}</span>
+              {isSelected && <RiCheckLine className='h-4 w-4 text-text-accent' />}
+            </div>
+            )
+          })}
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default TypeSelector
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/hooks.ts b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/hooks.ts
new file mode 100644
index 0000000..470a322
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/hooks.ts
@@ -0,0 +1,441 @@
+import produce from 'immer'
+import type { VisualEditorProps } from '.'
+import { useMittContext } from './context'
+import { useVisualEditorStore } from './store'
+import type { EditData } from './edit-card'
+import { ArrayType, type Field, Type } from '../../../types'
+import Toast from '@/app/components/base/toast'
+import { findPropertyWithPath } from '../../../utils'
+
+type ChangeEventParams = {
+  path: string[],
+  parentPath: string[],
+  oldFields: EditData,
+  fields: EditData,
+}
+
+type AddEventParams = {
+  path: string[]
+}
+
+export const useSchemaNodeOperations = (props: VisualEditorProps) => {
+  const { schema: jsonSchema, onChange } = props
+  const backupSchema = useVisualEditorStore(state => state.backupSchema)
+  const setBackupSchema = useVisualEditorStore(state => state.setBackupSchema)
+  const isAddingNewField = useVisualEditorStore(state => state.isAddingNewField)
+  const setIsAddingNewField = useVisualEditorStore(state => state.setIsAddingNewField)
+  const advancedEditing = useVisualEditorStore(state => state.advancedEditing)
+  const setAdvancedEditing = useVisualEditorStore(state => state.setAdvancedEditing)
+  const setHoveringProperty = useVisualEditorStore(state => state.setHoveringProperty)
+  const { emit, useSubscribe } = useMittContext()
+
+  useSubscribe('restoreSchema', () => {
+    if (backupSchema) {
+      onChange(backupSchema)
+      setBackupSchema(null)
+    }
+  })
+
+  useSubscribe('quitEditing', (params) => {
+    const { callback } = params as any
+    callback?.(backupSchema)
+    if (backupSchema) {
+      onChange(backupSchema)
+      setBackupSchema(null)
+    }
+    isAddingNewField && setIsAddingNewField(false)
+    advancedEditing && setAdvancedEditing(false)
+    setHoveringProperty(null)
+  })
+
+  useSubscribe('propertyNameChange', (params) => {
+    const { parentPath, oldFields, fields } = params as ChangeEventParams
+    const { name: oldName } = oldFields
+    const { name: newName } = fields
+    const newSchema = produce(jsonSchema, (draft) => {
+      if (oldName === newName) return
+      const schema = findPropertyWithPath(draft, parentPath) as Field
+
+      if (schema.type === Type.object) {
+        const properties = schema.properties || {}
+        if (properties[newName]) {
+          Toast.notify({
+            type: 'error',
+            message: 'Property name already exists',
+          })
+          emit('restorePropertyName')
+          return
+        }
+
+        const newProperties = Object.entries(properties).reduce((acc, [key, value]) => {
+          acc[key === oldName ? newName : key] = value
+          return acc
+        }, {} as Record<string, Field>)
+
+        const required = schema.required || []
+        const newRequired = produce(required, (draft) => {
+          const index = draft.indexOf(oldName)
+          if (index !== -1)
+            draft.splice(index, 1, newName)
+        })
+
+        schema.properties = newProperties
+        schema.required = newRequired
+      }
+
+      if (schema.type === Type.array && schema.items && schema.items.type === Type.object) {
+        const properties = schema.items.properties || {}
+        if (properties[newName]) {
+          Toast.notify({
+            type: 'error',
+            message: 'Property name already exists',
+          })
+          emit('restorePropertyName')
+          return
+        }
+
+        const newProperties = Object.entries(properties).reduce((acc, [key, value]) => {
+          acc[key === oldName ? newName : key] = value
+          return acc
+        }, {} as Record<string, Field>)
+        const required = schema.items.required || []
+        const newRequired = produce(required, (draft) => {
+          const index = draft.indexOf(oldName)
+          if (index !== -1)
+            draft.splice(index, 1, newName)
+        })
+
+        schema.items.properties = newProperties
+        schema.items.required = newRequired
+      }
+    })
+    onChange(newSchema)
+  })
+
+  useSubscribe('propertyTypeChange', (params) => {
+    const { path, oldFields, fields } = params as ChangeEventParams
+    const { type: oldType } = oldFields
+    const { type: newType } = fields
+    if (oldType === newType) return
+    const newSchema = produce(jsonSchema, (draft) => {
+      const schema = findPropertyWithPath(draft, path) as Field
+
+      if (schema.type === Type.object) {
+        delete schema.properties
+        delete schema.required
+      }
+      if (schema.type === Type.array)
+        delete schema.items
+      switch (newType) {
+        case Type.object:
+          schema.type = Type.object
+          schema.properties = {}
+          schema.required = []
+          schema.additionalProperties = false
+          break
+        case ArrayType.string:
+          schema.type = Type.array
+          schema.items = {
+            type: Type.string,
+          }
+          break
+        case ArrayType.number:
+          schema.type = Type.array
+          schema.items = {
+            type: Type.number,
+          }
+          break
+        // case ArrayType.boolean:
+        //   schema.type = Type.array
+        //   schema.items = {
+        //     type: Type.boolean,
+        //   }
+        //   break
+        case ArrayType.object:
+          schema.type = Type.array
+          schema.items = {
+            type: Type.object,
+            properties: {},
+            required: [],
+            additionalProperties: false,
+          }
+          break
+        default:
+          schema.type = newType as Type
+      }
+    })
+    onChange(newSchema)
+  })
+
+  useSubscribe('propertyRequiredToggle', (params) => {
+    const { parentPath, fields } = params as ChangeEventParams
+    const { name } = fields
+    const newSchema = produce(jsonSchema, (draft) => {
+      const schema = findPropertyWithPath(draft, parentPath) as Field
+
+      if (schema.type === Type.object) {
+        const required = schema.required || []
+        const newRequired = required.includes(name)
+          ? required.filter(item => item !== name)
+          : [...required, name]
+        schema.required = newRequired
+      }
+      if (schema.type === Type.array && schema.items && schema.items.type === Type.object) {
+        const required = schema.items.required || []
+        const newRequired = required.includes(name)
+          ? required.filter(item => item !== name)
+          : [...required, name]
+        schema.items.required = newRequired
+      }
+    })
+    onChange(newSchema)
+  })
+
+  useSubscribe('propertyOptionsChange', (params) => {
+    const { path, fields } = params as ChangeEventParams
+    const newSchema = produce(jsonSchema, (draft) => {
+      const schema = findPropertyWithPath(draft, path) as Field
+      schema.description = fields.description
+      schema.enum = fields.enum
+    })
+    onChange(newSchema)
+  })
+
+  useSubscribe('propertyDelete', (params) => {
+    const { parentPath, fields } = params as ChangeEventParams
+    const { name } = fields
+    const newSchema = produce(jsonSchema, (draft) => {
+      const schema = findPropertyWithPath(draft, parentPath) as Field
+      if (schema.type === Type.object && schema.properties) {
+        delete schema.properties[name]
+        schema.required = schema.required?.filter(item => item !== name)
+      }
+      if (schema.type === Type.array && schema.items?.properties && schema.items?.type === Type.object) {
+        delete schema.items.properties[name]
+        schema.items.required = schema.items.required?.filter(item => item !== name)
+      }
+    })
+    onChange(newSchema)
+  })
+
+  useSubscribe('addField', (params) => {
+    advancedEditing && setAdvancedEditing(false)
+    setBackupSchema(jsonSchema)
+    const { path } = params as AddEventParams
+    setIsAddingNewField(true)
+    const newSchema = produce(jsonSchema, (draft) => {
+      const schema = findPropertyWithPath(draft, path) as Field
+      if (schema.type === Type.object) {
+        schema.properties = {
+          ...(schema.properties || {}),
+          '': {
+            type: Type.string,
+          },
+        }
+        setHoveringProperty([...path, 'properties', ''].join('.'))
+      }
+      if (schema.type === Type.array && schema.items && schema.items.type === Type.object) {
+        schema.items.properties = {
+          ...(schema.items.properties || {}),
+          '': {
+            type: Type.string,
+          },
+        }
+        setHoveringProperty([...path, 'items', 'properties', ''].join('.'))
+      }
+    })
+    onChange(newSchema)
+  })
+
+  useSubscribe('fieldChange', (params) => {
+    let samePropertyNameError = false
+    const { parentPath, oldFields, fields } = params as ChangeEventParams
+    const newSchema = produce(jsonSchema, (draft) => {
+      const parentSchema = findPropertyWithPath(draft, parentPath) as Field
+      const { name: oldName, type: oldType, required: oldRequired } = oldFields
+      const { name: newName, type: newType, required: newRequired } = fields
+      if (parentSchema.type === Type.object && parentSchema.properties) {
+        // name change
+        if (oldName !== newName) {
+          const properties = parentSchema.properties
+          if (properties[newName]) {
+            Toast.notify({
+              type: 'error',
+              message: 'Property name already exists',
+            })
+            samePropertyNameError = true
+          }
+
+          const newProperties = Object.entries(properties).reduce((acc, [key, value]) => {
+            acc[key === oldName ? newName : key] = value
+            return acc
+          }, {} as Record<string, Field>)
+
+          const requiredProperties = parentSchema.required || []
+          const newRequiredProperties = produce(requiredProperties, (draft) => {
+            const index = draft.indexOf(oldName)
+            if (index !== -1)
+              draft.splice(index, 1, newName)
+          })
+
+          parentSchema.properties = newProperties
+          parentSchema.required = newRequiredProperties
+        }
+
+        // required change
+        if (oldRequired !== newRequired) {
+          const required = parentSchema.required || []
+          const newRequired = required.includes(newName)
+            ? required.filter(item => item !== newName)
+            : [...required, newName]
+          parentSchema.required = newRequired
+        }
+
+        const schema = parentSchema.properties[newName]
+
+        // type change
+        if (oldType !== newType) {
+          if (schema.type === Type.object) {
+            delete schema.properties
+            delete schema.required
+          }
+          if (schema.type === Type.array)
+            delete schema.items
+          switch (newType) {
+            case Type.object:
+              schema.type = Type.object
+              schema.properties = {}
+              schema.required = []
+              schema.additionalProperties = false
+              break
+            case ArrayType.string:
+              schema.type = Type.array
+              schema.items = {
+                type: Type.string,
+              }
+              break
+            case ArrayType.number:
+              schema.type = Type.array
+              schema.items = {
+                type: Type.number,
+              }
+              break
+            // case ArrayType.boolean:
+            //   schema.type = Type.array
+            //   schema.items = {
+            //     type: Type.boolean,
+            //   }
+            //   break
+            case ArrayType.object:
+              schema.type = Type.array
+              schema.items = {
+                type: Type.object,
+                properties: {},
+                required: [],
+                additionalProperties: false,
+              }
+              break
+            default:
+              schema.type = newType as Type
+          }
+        }
+
+        // other options change
+        schema.description = fields.description
+        schema.enum = fields.enum
+      }
+
+      if (parentSchema.type === Type.array && parentSchema.items && parentSchema.items.type === Type.object && parentSchema.items.properties) {
+        // name change
+        if (oldName !== newName) {
+          const properties = parentSchema.items.properties || {}
+          if (properties[newName]) {
+            Toast.notify({
+              type: 'error',
+              message: 'Property name already exists',
+            })
+            samePropertyNameError = true
+          }
+
+          const newProperties = Object.entries(properties).reduce((acc, [key, value]) => {
+            acc[key === oldName ? newName : key] = value
+            return acc
+          }, {} as Record<string, Field>)
+          const required = parentSchema.items.required || []
+          const newRequired = produce(required, (draft) => {
+            const index = draft.indexOf(oldName)
+            if (index !== -1)
+              draft.splice(index, 1, newName)
+          })
+
+          parentSchema.items.properties = newProperties
+          parentSchema.items.required = newRequired
+        }
+
+        // required change
+        if (oldRequired !== newRequired) {
+          const required = parentSchema.items.required || []
+          const newRequired = required.includes(newName)
+            ? required.filter(item => item !== newName)
+            : [...required, newName]
+          parentSchema.items.required = newRequired
+        }
+
+        const schema = parentSchema.items.properties[newName]
+        // type change
+        if (oldType !== newType) {
+          if (schema.type === Type.object) {
+            delete schema.properties
+            delete schema.required
+          }
+          if (schema.type === Type.array)
+            delete schema.items
+          switch (newType) {
+            case Type.object:
+              schema.type = Type.object
+              schema.properties = {}
+              schema.required = []
+              schema.additionalProperties = false
+              break
+            case ArrayType.string:
+              schema.type = Type.array
+              schema.items = {
+                type: Type.string,
+              }
+              break
+            case ArrayType.number:
+              schema.type = Type.array
+              schema.items = {
+                type: Type.number,
+              }
+              break
+            // case ArrayType.boolean:
+            //   schema.type = Type.array
+            //   schema.items = {
+            //     type: Type.boolean,
+            //   }
+            //   break
+            case ArrayType.object:
+              schema.type = Type.array
+              schema.items = {
+                type: Type.object,
+                properties: {},
+                required: [],
+                additionalProperties: false,
+              }
+              break
+            default:
+              schema.type = newType as Type
+          }
+        }
+
+        // other options change
+        schema.description = fields.description
+        schema.enum = fields.enum
+      }
+    })
+    if (samePropertyNameError) return
+    onChange(newSchema)
+    emit('fieldChangeSuccess')
+  })
+}
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/index.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/index.tsx
new file mode 100644
index 0000000..1df4253
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/index.tsx
@@ -0,0 +1,28 @@
+import type { FC } from 'react'
+import type { SchemaRoot } from '../../../types'
+import SchemaNode from './schema-node'
+import { useSchemaNodeOperations } from './hooks'
+
+export type VisualEditorProps = {
+  schema: SchemaRoot
+  onChange: (schema: SchemaRoot) => void
+}
+
+const VisualEditor: FC<VisualEditorProps> = (props) => {
+  const { schema } = props
+  useSchemaNodeOperations(props)
+
+  return (
+    <div className='h-full overflow-auto rounded-xl bg-background-section-burn p-1 pl-2'>
+      <SchemaNode
+        name='structured_output'
+        schema={schema}
+        required={false}
+        path={[]}
+        depth={0}
+      />
+    </div>
+  )
+}
+
+export default VisualEditor
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/schema-node.tsx b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/schema-node.tsx
new file mode 100644
index 0000000..70a6b86
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/schema-node.tsx
@@ -0,0 +1,194 @@
+import type { FC } from 'react'
+import React, { useMemo, useState } from 'react'
+import { type Field, Type } from '../../../types'
+import classNames from '@/utils/classnames'
+import { RiArrowDropDownLine, RiArrowDropRightLine } from '@remixicon/react'
+import { getFieldType, getHasChildren } from '../../../utils'
+import Divider from '@/app/components/base/divider'
+import EditCard from './edit-card'
+import Card from './card'
+import { useVisualEditorStore } from './store'
+import { useDebounceFn } from 'ahooks'
+import AddField from './add-field'
+import { JSON_SCHEMA_MAX_DEPTH } from '@/config'
+
+type SchemaNodeProps = {
+  name: string
+  required: boolean
+  schema: Field
+  path: string[]
+  parentPath?: string[]
+  depth: number
+}
+
+// Support 10 levels of indentation
+const indentPadding: Record<number, string> = {
+  0: 'pl-0',
+  1: 'pl-[20px]',
+  2: 'pl-[40px]',
+  3: 'pl-[60px]',
+  4: 'pl-[80px]',
+  5: 'pl-[100px]',
+  6: 'pl-[120px]',
+  7: 'pl-[140px]',
+  8: 'pl-[160px]',
+  9: 'pl-[180px]',
+  10: 'pl-[200px]',
+}
+
+const indentLeft: Record<number, string> = {
+  0: 'left-0',
+  1: 'left-[20px]',
+  2: 'left-[40px]',
+  3: 'left-[60px]',
+  4: 'left-[80px]',
+  5: 'left-[100px]',
+  6: 'left-[120px]',
+  7: 'left-[140px]',
+  8: 'left-[160px]',
+  9: 'left-[180px]',
+  10: 'left-[200px]',
+}
+
+const SchemaNode: FC<SchemaNodeProps> = ({
+  name,
+  required,
+  schema,
+  path,
+  parentPath,
+  depth,
+}) => {
+  const [isExpanded, setIsExpanded] = useState(true)
+  const hoveringProperty = useVisualEditorStore(state => state.hoveringProperty)
+  const setHoveringProperty = useVisualEditorStore(state => state.setHoveringProperty)
+  const isAddingNewField = useVisualEditorStore(state => state.isAddingNewField)
+  const advancedEditing = useVisualEditorStore(state => state.advancedEditing)
+
+  const { run: setHoveringPropertyDebounced } = useDebounceFn((path: string | null) => {
+    setHoveringProperty(path)
+  }, { wait: 50 })
+
+  const hasChildren = useMemo(() => getHasChildren(schema), [schema])
+  const type = useMemo(() => getFieldType(schema), [schema])
+  const isHovering = hoveringProperty === path.join('.')
+
+  const handleExpand = () => {
+    setIsExpanded(!isExpanded)
+  }
+
+  const handleMouseEnter = () => {
+    if (advancedEditing || isAddingNewField) return
+    setHoveringPropertyDebounced(path.join('.'))
+  }
+
+  const handleMouseLeave = () => {
+    if (advancedEditing || isAddingNewField) return
+    setHoveringPropertyDebounced(null)
+  }
+
+  return (
+    <div className='relative'>
+      <div className={classNames('relative z-10', indentPadding[depth])}>
+        {depth > 0 && hasChildren && (
+          <div className={classNames(
+            'flex items-center absolute top-0 w-5 h-7 px-0.5 z-10 bg-background-section-burn',
+            indentLeft[depth - 1],
+          )}>
+            <button
+              onClick={handleExpand}
+              className='py-0.5 text-text-tertiary hover:text-text-accent'
+            >
+              {
+                isExpanded
+                  ? <RiArrowDropDownLine className='h-4 w-4' />
+                  : <RiArrowDropRightLine className='h-4 w-4' />
+              }
+            </button>
+          </div>
+        )}
+
+        <div
+          onMouseEnter={handleMouseEnter}
+          onMouseLeave={handleMouseLeave}
+        >
+          {(isHovering && depth > 0) ? (
+            <EditCard
+              fields={{
+                name,
+                type,
+                required,
+                description: schema.description,
+                enum: schema.enum,
+              }}
+              path={path}
+              parentPath={parentPath!}
+              depth={depth}
+            />
+          ) : (
+            <Card
+              name={name}
+              type={type}
+              required={required}
+              description={schema.description}
+            />
+          )}
+        </div>
+      </div>
+
+      <div className={classNames(
+        'flex justify-center w-5 absolute z-0',
+        schema.description ? 'h-[calc(100%-3rem)] top-12' : 'h-[calc(100%-1.75rem)] top-7',
+        indentLeft[depth],
+      )}>
+        <Divider
+          type='vertical'
+          className={classNames('mx-0', isHovering ? 'bg-divider-deep' : 'bg-divider-subtle')}
+        />
+      </div>
+
+      {isExpanded && hasChildren && depth < JSON_SCHEMA_MAX_DEPTH && (
+        <>
+          {schema.type === Type.object && schema.properties && (
+            Object.entries(schema.properties).map(([key, childSchema]) => (
+              <SchemaNode
+                key={key}
+                name={key}
+                required={!!schema.required?.includes(key)}
+                schema={childSchema}
+                path={[...path, 'properties', key]}
+                parentPath={path}
+                depth={depth + 1}
+              />
+            ))
+          )}
+
+          {schema.type === Type.array
+            && schema.items
+            && schema.items.type === Type.object
+            && schema.items.properties
+            && (
+              Object.entries(schema.items.properties).map(([key, childSchema]) => (
+                <SchemaNode
+                  key={key}
+                  name={key}
+                  required={!!schema.items?.required?.includes(key)}
+                  schema={childSchema}
+                  path={[...path, 'items', 'properties', key]}
+                  parentPath={path}
+                  depth={depth + 1}
+                />
+              ))
+            )}
+        </>
+      )}
+
+      {
+        depth === 0 && !isAddingNewField && (
+          <AddField />
+        )
+      }
+    </div>
+  )
+}
+
+export default React.memo(SchemaNode)
diff --git a/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/store.ts b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/store.ts
new file mode 100644
index 0000000..3dbd667
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/store.ts
@@ -0,0 +1,34 @@
+import { useContext } from 'react'
+import { createStore, useStore } from 'zustand'
+import type { SchemaRoot } from '../../../types'
+import { VisualEditorContext } from './context'
+
+type VisualEditorStore = {
+  hoveringProperty: string | null
+  setHoveringProperty: (propertyPath: string | null) => void
+  isAddingNewField: boolean
+  setIsAddingNewField: (isAdding: boolean) => void
+  advancedEditing: boolean
+  setAdvancedEditing: (isEditing: boolean) => void
+  backupSchema: SchemaRoot | null
+  setBackupSchema: (schema: SchemaRoot | null) => void
+}
+
+export const createVisualEditorStore = () => createStore<VisualEditorStore>(set => ({
+  hoveringProperty: null,
+  setHoveringProperty: (propertyPath: string | null) => set({ hoveringProperty: propertyPath }),
+  isAddingNewField: false,
+  setIsAddingNewField: (isAdding: boolean) => set({ isAddingNewField: isAdding }),
+  advancedEditing: false,
+  setAdvancedEditing: (isEditing: boolean) => set({ advancedEditing: isEditing }),
+  backupSchema: null,
+  setBackupSchema: (schema: SchemaRoot | null) => set({ backupSchema: schema }),
+}))
+
+export const useVisualEditorStore = <T>(selector: (state: VisualEditorStore) => T): T => {
+  const store = useContext(VisualEditorContext)
+  if (!store)
+    throw new Error('Missing VisualEditorContext.Provider in the tree')
+
+  return useStore(store, selector)
+}
diff --git a/app/components/workflow/nodes/llm/components/prompt-generator-btn.tsx b/app/components/workflow/nodes/llm/components/prompt-generator-btn.tsx
new file mode 100644
index 0000000..804478d
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/prompt-generator-btn.tsx
@@ -0,0 +1,51 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useBoolean } from 'ahooks'
+import cn from 'classnames'
+import { Generator } from '@/app/components/base/icons/src/vender/other'
+import { ActionButton } from '@/app/components/base/action-button'
+import GetAutomaticResModal from '@/app/components/app/configuration/config/automatic/get-automatic-res'
+import { AppType } from '@/types/app'
+import type { AutomaticRes } from '@/service/debug'
+import type { ModelConfig } from '@/app/components/workflow/types'
+import type { Model } from '@/types/app'
+
+type Props = {
+  className?: string
+  onGenerated?: (prompt: string) => void
+  modelConfig?: ModelConfig
+}
+
+const PromptGeneratorBtn: FC<Props> = ({
+  className,
+  onGenerated,
+  modelConfig,
+}) => {
+  const [showAutomatic, { setTrue: showAutomaticTrue, setFalse: showAutomaticFalse }] = useBoolean(false)
+  const handleAutomaticRes = useCallback((res: AutomaticRes) => {
+    onGenerated?.(res.prompt)
+    showAutomaticFalse()
+  }, [onGenerated, showAutomaticFalse])
+  return (
+    <div className={cn(className)}>
+      <ActionButton
+        className='hover:bg-[#155EFF]/8'
+        onClick={showAutomaticTrue}>
+        <Generator className='h-4 w-4 text-primary-600' />
+      </ActionButton>
+      {showAutomatic && (
+        <GetAutomaticResModal
+          mode={AppType.chat}
+          isShow={showAutomatic}
+          onClose={showAutomaticFalse}
+          onFinished={handleAutomaticRes}
+          model={modelConfig as Model}
+          isInLLMNode
+        />
+      )}
+    </div>
+  )
+}
+
+export default React.memo(PromptGeneratorBtn)
diff --git a/app/components/workflow/nodes/llm/components/resolution-picker.tsx b/app/components/workflow/nodes/llm/components/resolution-picker.tsx
new file mode 100644
index 0000000..191b9bf
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/resolution-picker.tsx
@@ -0,0 +1,44 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import OptionCard from '@/app/components/workflow/nodes/_base/components/option-card'
+import { Resolution } from '@/types/app'
+
+const i18nPrefix = 'workflow.nodes.llm'
+
+type Props = {
+  value: Resolution
+  onChange: (value: Resolution) => void
+}
+
+const ResolutionPicker: FC<Props> = ({
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  const handleOnChange = useCallback((value: Resolution) => {
+    return () => {
+      onChange(value)
+    }
+  }, [onChange])
+  return (
+    <div className='flex items-center justify-between'>
+      <div className='mr-2 text-xs font-medium uppercase text-text-secondary'>{t(`${i18nPrefix}.resolution.name`)}</div>
+      <div className='flex items-center space-x-1'>
+        <OptionCard
+          title={t(`${i18nPrefix}.resolution.high`)}
+          onSelect={handleOnChange(Resolution.high)}
+          selected={value === Resolution.high}
+        />
+        <OptionCard
+          title={t(`${i18nPrefix}.resolution.low`)}
+          onSelect={handleOnChange(Resolution.low)}
+          selected={value === Resolution.low}
+        />
+      </div>
+    </div>
+  )
+}
+export default React.memo(ResolutionPicker)
diff --git a/app/components/workflow/nodes/llm/components/structure-output.tsx b/app/components/workflow/nodes/llm/components/structure-output.tsx
new file mode 100644
index 0000000..b20820d
--- /dev/null
+++ b/app/components/workflow/nodes/llm/components/structure-output.tsx
@@ -0,0 +1,75 @@
+'use client'
+import Button from '@/app/components/base/button'
+import { RiEditLine } from '@remixicon/react'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { type SchemaRoot, type StructuredOutput, Type } from '../types'
+import ShowPanel from '@/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/show'
+import { useBoolean } from 'ahooks'
+import JsonSchemaConfigModal from './json-schema-config-modal'
+import cn from '@/utils/classnames'
+import { useTranslation } from 'react-i18next'
+
+type Props = {
+  className?: string
+  value?: StructuredOutput
+  onChange: (value: StructuredOutput) => void,
+}
+
+const StructureOutput: FC<Props> = ({
+  className,
+  value,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const [showConfig, {
+    setTrue: showConfigModal,
+    setFalse: hideConfigModal,
+  }] = useBoolean(false)
+
+  const handleChange = useCallback((value: SchemaRoot) => {
+    onChange({
+      schema: value,
+    })
+  }, [onChange])
+  return (
+    <div className={cn(className)}>
+      <div className='flex justify-between'>
+        <div className='flex items-center leading-[18px]'>
+          <div className='code-sm-semibold text-text-secondary'>structured_output</div>
+          <div className='system-xs-regular ml-2 text-text-tertiary'>object</div>
+        </div>
+        <Button
+          size='small'
+          variant='secondary'
+          className='flex'
+          onClick={showConfigModal}
+        >
+          <RiEditLine className='mr-1 size-3.5' />
+          <div className='system-xs-medium text-components-button-secondary-text'>{t('app.structOutput.configure')}</div>
+        </Button>
+      </div>
+      {(value?.schema && value.schema.properties && Object.keys(value.schema.properties).length > 0) ? (
+        <ShowPanel
+          payload={value}
+        />) : (
+        <div className='system-xs-regular mt-1.5 flex h-10 cursor-pointer items-center justify-center rounded-[10px] bg-background-section text-text-tertiary' onClick={showConfigModal}>{t('app.structOutput.notConfiguredTip')}</div>
+      )}
+
+      {showConfig && (
+        <JsonSchemaConfigModal
+          isShow
+          defaultSchema={(value?.schema || {
+            type: Type.object,
+            properties: {},
+            required: [],
+            additionalProperties: false,
+          }) as any} // wait for types change
+          onSave={handleChange as any} // wait for types change
+          onClose={hideConfigModal}
+        />
+      )}
+    </div>
+  )
+}
+export default React.memo(StructureOutput)
diff --git a/app/components/workflow/nodes/llm/default.ts b/app/components/workflow/nodes/llm/default.ts
new file mode 100644
index 0000000..92377f7
--- /dev/null
+++ b/app/components/workflow/nodes/llm/default.ts
@@ -0,0 +1,91 @@
+import { BlockEnum, EditionType } from '../../types'
+import { type NodeDefault, type PromptItem, PromptRole } from '../../types'
+import type { LLMNodeType } from './types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+
+const i18nPrefix = 'workflow.errorMsg'
+
+const nodeDefault: NodeDefault<LLMNodeType> = {
+  defaultValue: {
+    model: {
+      provider: '',
+      name: '',
+      mode: 'chat',
+      completion_params: {
+        temperature: 0.7,
+      },
+    },
+    prompt_template: [{
+      role: PromptRole.system,
+      text: '',
+    }],
+    context: {
+      enabled: false,
+      variable_selector: [],
+    },
+    vision: {
+      enabled: false,
+    },
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: LLMNodeType, t: any) {
+    let errorMessages = ''
+    if (!errorMessages && !payload.model.provider)
+      errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.model`) })
+
+    if (!errorMessages && !payload.memory) {
+      const isChatModel = payload.model.mode === 'chat'
+      const isPromptEmpty = isChatModel
+        ? !(payload.prompt_template as PromptItem[]).some((t) => {
+          if (t.edition_type === EditionType.jinja2)
+            return t.jinja2_text !== ''
+
+          return t.text !== ''
+        })
+        : ((payload.prompt_template as PromptItem).edition_type === EditionType.jinja2 ? (payload.prompt_template as PromptItem).jinja2_text === '' : (payload.prompt_template as PromptItem).text === '')
+      if (isPromptEmpty)
+        errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t('workflow.nodes.llm.prompt') })
+    }
+
+    if (!errorMessages && !!payload.memory) {
+      const isChatModel = payload.model.mode === 'chat'
+      // payload.memory.query_prompt_template not pass is default: {{#sys.query#}}
+      if (isChatModel && !!payload.memory.query_prompt_template && !payload.memory.query_prompt_template.includes('{{#sys.query#}}'))
+        errorMessages = t('workflow.nodes.llm.sysQueryInUser')
+    }
+
+    if (!errorMessages) {
+      const isChatModel = payload.model.mode === 'chat'
+      const isShowVars = (() => {
+        if (isChatModel)
+          return (payload.prompt_template as PromptItem[]).some(item => item.edition_type === EditionType.jinja2)
+        return (payload.prompt_template as PromptItem).edition_type === EditionType.jinja2
+      })()
+      if (isShowVars && payload.prompt_config?.jinja2_variables) {
+        payload.prompt_config?.jinja2_variables.forEach((i) => {
+          if (!errorMessages && !i.variable)
+            errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variable`) })
+          if (!errorMessages && !i.value_selector.length)
+            errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variableValue`) })
+        })
+      }
+    }
+    if (!errorMessages && payload.vision?.enabled && !payload.vision.configs?.variable_selector?.length)
+      errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.visionVariable`) })
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/llm/node.tsx b/app/components/workflow/nodes/llm/node.tsx
new file mode 100644
index 0000000..ce676ba
--- /dev/null
+++ b/app/components/workflow/nodes/llm/node.tsx
@@ -0,0 +1,36 @@
+import type { FC } from 'react'
+import React from 'react'
+import type { LLMNodeType } from './types'
+import {
+  useTextGenerationCurrentProviderAndModelAndModelList,
+} from '@/app/components/header/account-setting/model-provider-page/hooks'
+import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
+import type { NodeProps } from '@/app/components/workflow/types'
+
+const Node: FC<NodeProps<LLMNodeType>> = ({
+  data,
+}) => {
+  const { provider, name: modelId } = data.model || {}
+  const {
+    textGenerationModelList,
+  } = useTextGenerationCurrentProviderAndModelAndModelList()
+  const hasSetModel = provider && modelId
+
+  if (!hasSetModel)
+    return null
+
+  return (
+    <div className='mb-1 px-3 py-1'>
+      {hasSetModel && (
+        <ModelSelector
+          defaultModel={{ provider, model: modelId }}
+          modelList={textGenerationModelList}
+          triggerClassName='!h-6 !rounded-md'
+          readonly
+        />
+      )}
+    </div>
+  )
+}
+
+export default React.memo(Node)
diff --git a/app/components/workflow/nodes/llm/panel.tsx b/app/components/workflow/nodes/llm/panel.tsx
new file mode 100644
index 0000000..29fb4fb
--- /dev/null
+++ b/app/components/workflow/nodes/llm/panel.tsx
@@ -0,0 +1,363 @@
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import MemoryConfig from '../_base/components/memory-config'
+import VarReferencePicker from '../_base/components/variable/var-reference-picker'
+import ConfigVision from '../_base/components/config-vision'
+import useConfig from './use-config'
+import { findVariableWhenOnLLMVision } from '../utils'
+import type { LLMNodeType } from './types'
+import ConfigPrompt from './components/config-prompt'
+import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list'
+import AddButton2 from '@/app/components/base/button/add-button'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import Split from '@/app/components/workflow/nodes/_base/components/split'
+import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal'
+import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
+import { InputVarType, type NodePanelProps } from '@/app/components/workflow/types'
+import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
+import type { Props as FormProps } from '@/app/components/workflow/nodes/_base/components/before-run-form/form'
+import ResultPanel from '@/app/components/workflow/run/result-panel'
+import Tooltip from '@/app/components/base/tooltip'
+import Editor from '@/app/components/workflow/nodes/_base/components/prompt/editor'
+import StructureOutput from './components/structure-output'
+import Switch from '@/app/components/base/switch'
+import { RiAlertFill, RiQuestionLine } from '@remixicon/react'
+
+const i18nPrefix = 'workflow.nodes.llm'
+
+const Panel: FC<NodePanelProps<LLMNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    readOnly,
+    inputs,
+    isChatModel,
+    isChatMode,
+    isCompletionModel,
+    shouldShowContextTip,
+    isVisionModel,
+    handleModelChanged,
+    hasSetBlockStatus,
+    handleCompletionParamsChange,
+    handleContextVarChange,
+    filterInputVar,
+    filterVar,
+    availableVars,
+    availableNodesWithParent,
+    isShowVars,
+    handlePromptChange,
+    handleAddEmptyVariable,
+    handleAddVariable,
+    handleVarListChange,
+    handleVarNameChange,
+    handleSyeQueryChange,
+    handleMemoryChange,
+    handleVisionResolutionEnabledChange,
+    handleVisionResolutionChange,
+    isShowSingleRun,
+    hideSingleRun,
+    inputVarValues,
+    setInputVarValues,
+    visionFiles,
+    setVisionFiles,
+    contexts,
+    setContexts,
+    runningStatus,
+    isModelSupportStructuredOutput,
+    structuredOutputCollapsed,
+    setStructuredOutputCollapsed,
+    handleStructureOutputEnableChange,
+    handleStructureOutputChange,
+    handleRun,
+    handleStop,
+    varInputs,
+    runResult,
+    filterJinjia2InputVar,
+  } = useConfig(id, data)
+
+  const model = inputs.model
+
+  const singleRunForms = (() => {
+    const forms: FormProps[] = []
+
+    if (varInputs.length > 0) {
+      forms.push(
+        {
+          label: t(`${i18nPrefix}.singleRun.variable`)!,
+          inputs: varInputs,
+          values: inputVarValues,
+          onChange: setInputVarValues,
+        },
+      )
+    }
+
+    if (inputs.context?.variable_selector && inputs.context?.variable_selector.length > 0) {
+      forms.push(
+        {
+          label: t(`${i18nPrefix}.context`)!,
+          inputs: [{
+            label: '',
+            variable: '#context#',
+            type: InputVarType.contexts,
+            required: false,
+          }],
+          values: { '#context#': contexts },
+          onChange: keyValue => setContexts(keyValue['#context#']),
+        },
+      )
+    }
+
+    if (isVisionModel && data.vision?.enabled && data.vision?.configs?.variable_selector) {
+      const currentVariable = findVariableWhenOnLLMVision(data.vision.configs.variable_selector, availableVars)
+
+      forms.push(
+        {
+          label: t(`${i18nPrefix}.vision`)!,
+          inputs: [{
+            label: currentVariable?.variable as any,
+            variable: '#files#',
+            type: currentVariable?.formType as any,
+            required: false,
+          }],
+          values: { '#files#': visionFiles },
+          onChange: keyValue => setVisionFiles((keyValue as any)['#files#']),
+        },
+      )
+    }
+
+    return forms
+  })()
+
+  const handleModelChange = useCallback((model: {
+    provider: string
+    modelId: string
+    mode?: string
+  }) => {
+    handleCompletionParamsChange({})
+    handleModelChanged(model)
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  return (
+    <div className='mt-2'>
+      <div className='space-y-4 px-4 pb-4'>
+        <Field
+          title={t(`${i18nPrefix}.model`)}
+          required
+        >
+          <ModelParameterModal
+            popupClassName='!w-[387px]'
+            isInWorkflow
+            isAdvancedMode={true}
+            mode={model?.mode}
+            provider={model?.provider}
+            completionParams={model?.completion_params}
+            modelId={model?.name}
+            setModel={handleModelChange}
+            onCompletionParamsChange={handleCompletionParamsChange}
+            hideDebugWithMultipleModel
+            debugWithMultipleModel={false}
+            readonly={readOnly}
+          />
+        </Field>
+
+        {/* knowledge */}
+        <Field
+          title={t(`${i18nPrefix}.context`)}
+          tooltip={t(`${i18nPrefix}.contextTooltip`)!}
+        >
+          <>
+            <VarReferencePicker
+              readonly={readOnly}
+              nodeId={id}
+              isShowNodeName
+              value={inputs.context?.variable_selector || []}
+              onChange={handleContextVarChange}
+              filterVar={filterVar}
+            />
+            {shouldShowContextTip && (
+              <div className='text-xs font-normal leading-[18px] text-[#DC6803]'>{t(`${i18nPrefix}.notSetContextInPromptTip`)}</div>
+            )}
+          </>
+        </Field>
+
+        {/* Prompt */}
+        {model.name && (
+          <ConfigPrompt
+            readOnly={readOnly}
+            nodeId={id}
+            filterVar={filterInputVar}
+            isChatModel={isChatModel}
+            isChatApp={isChatMode}
+            isShowContext
+            payload={inputs.prompt_template}
+            onChange={handlePromptChange}
+            hasSetBlockStatus={hasSetBlockStatus}
+            varList={inputs.prompt_config?.jinja2_variables || []}
+            handleAddVariable={handleAddVariable}
+            modelConfig={model}
+          />
+        )}
+
+        {isShowVars && (
+          <Field
+            title={t('workflow.nodes.templateTransform.inputVars')}
+            operations={
+              !readOnly ? <AddButton2 onClick={handleAddEmptyVariable} /> : undefined
+            }
+          >
+            <VarList
+              nodeId={id}
+              readonly={readOnly}
+              list={inputs.prompt_config?.jinja2_variables || []}
+              onChange={handleVarListChange}
+              onVarNameChange={handleVarNameChange}
+              filterVar={filterJinjia2InputVar}
+              isSupportFileVar={false}
+            />
+          </Field>
+        )}
+
+        {/* Memory put place examples. */}
+        {isChatMode && isChatModel && !!inputs.memory && (
+          <div className='mt-4'>
+            <div className='flex h-8 items-center justify-between rounded-lg bg-components-input-bg-normal pl-3 pr-2'>
+              <div className='flex items-center space-x-1'>
+                <div className='text-xs font-semibold uppercase text-text-secondary'>{t('workflow.nodes.common.memories.title')}</div>
+                <Tooltip
+                  popupContent={t('workflow.nodes.common.memories.tip')}
+                  triggerClassName='w-4 h-4'
+                />
+              </div>
+              <div className='flex h-[18px] items-center rounded-[5px] border border-divider-deep bg-components-badge-bg-dimm px-1 text-xs font-semibold uppercase text-text-tertiary'>{t('workflow.nodes.common.memories.builtIn')}</div>
+            </div>
+            {/* Readonly User Query */}
+            <div className='mt-4'>
+              <Editor
+                title={<div className='flex items-center space-x-1'>
+                  <div className='text-xs font-semibold uppercase text-text-secondary'>user</div>
+                  <Tooltip
+                    popupContent={
+                      <div className='max-w-[180px]'>{t('workflow.nodes.llm.roleDescription.user')}</div>
+                    }
+                    triggerClassName='w-4 h-4'
+                  />
+                </div>}
+                value={inputs.memory.query_prompt_template || '{{#sys.query#}}'}
+                onChange={handleSyeQueryChange}
+                readOnly={readOnly}
+                isShowContext={false}
+                isChatApp
+                isChatModel
+                hasSetBlockStatus={hasSetBlockStatus}
+                nodesOutputVars={availableVars}
+                availableNodes={availableNodesWithParent}
+                isSupportFileVar
+              />
+
+              {inputs.memory.query_prompt_template && !inputs.memory.query_prompt_template.includes('{{#sys.query#}}') && (
+                <div className='text-xs font-normal leading-[18px] text-[#DC6803]'>{t(`${i18nPrefix}.sysQueryInUser`)}</div>
+              )}
+            </div>
+          </div>
+        )}
+
+        {/* Memory */}
+        {isChatMode && (
+          <>
+            <Split />
+            <MemoryConfig
+              readonly={readOnly}
+              config={{ data: inputs.memory }}
+              onChange={handleMemoryChange}
+              canSetRoleName={isCompletionModel}
+            />
+          </>
+        )}
+
+        {/* Vision: GPT4-vision and so on */}
+        <ConfigVision
+          nodeId={id}
+          readOnly={readOnly}
+          isVisionModel={isVisionModel}
+          enabled={inputs.vision?.enabled}
+          onEnabledChange={handleVisionResolutionEnabledChange}
+          config={inputs.vision?.configs}
+          onConfigChange={handleVisionResolutionChange}
+        />
+      </div>
+      <Split />
+      <OutputVars
+        collapsed={structuredOutputCollapsed}
+        onCollapse={setStructuredOutputCollapsed}
+        operations={
+          <div className='mr-4 flex shrink-0 items-center'>
+            {(!isModelSupportStructuredOutput && !!inputs.structured_output_enabled) && (
+              <Tooltip noDecoration popupContent={
+                <div className='w-[232px] rounded-xl border-[0.5px] border-components-panel-border bg-components-tooltip-bg px-4 py-3.5 shadow-lg backdrop-blur-[5px]'>
+                  <div className='title-xs-semi-bold text-text-primary'>{t('app.structOutput.modelNotSupported')}</div>
+                  <div className='body-xs-regular mt-1 text-text-secondary'>{t('app.structOutput.modelNotSupportedTip')}</div>
+                </div>
+              }>
+                <div>
+                  <RiAlertFill className='mr-1 size-4 text-text-warning-secondary' />
+                </div>
+              </Tooltip>
+            )}
+            <div className='system-xs-medium-uppercase mr-0.5 text-text-tertiary'>{t('app.structOutput.structured')}</div>
+            <Tooltip popupContent={
+              <div className='max-w-[150px]'>{t('app.structOutput.structuredTip')}</div>
+            }>
+              <div>
+                <RiQuestionLine className='size-3.5 text-text-quaternary' />
+              </div>
+            </Tooltip>
+            <Switch
+              className='ml-2'
+              defaultValue={!!inputs.structured_output_enabled}
+              onChange={handleStructureOutputEnableChange}
+              size='md'
+              disabled={readOnly}
+            />
+          </div>
+        }
+      >
+        <>
+          <VarItem
+            name='text'
+            type='string'
+            description={t(`${i18nPrefix}.outputVars.output`)}
+          />
+          {inputs.structured_output_enabled && (
+            <>
+              <Split className='mt-3' />
+              <StructureOutput
+                className='mt-4'
+                value={inputs.structured_output}
+                onChange={handleStructureOutputChange}
+              />
+            </>
+          )}
+        </>
+      </OutputVars>
+      {isShowSingleRun && (
+        <BeforeRunForm
+          nodeName={inputs.title}
+          nodeType={inputs.type}
+          onHide={hideSingleRun}
+          forms={singleRunForms}
+          runningStatus={runningStatus}
+          onRun={handleRun}
+          onStop={handleStop}
+          result={<ResultPanel {...runResult} showSteps={false} />}
+        />
+      )}
+    </div>
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/llm/types.ts b/app/components/workflow/nodes/llm/types.ts
new file mode 100644
index 0000000..c1d33a2
--- /dev/null
+++ b/app/components/workflow/nodes/llm/types.ts
@@ -0,0 +1,68 @@
+import type { CommonNodeType, Memory, ModelConfig, PromptItem, ValueSelector, Variable, VisionSetting } from '@/app/components/workflow/types'
+
+export type LLMNodeType = CommonNodeType & {
+  model: ModelConfig
+  prompt_template: PromptItem[] | PromptItem
+  prompt_config?: {
+    jinja2_variables?: Variable[]
+  }
+  memory?: Memory
+  context: {
+    enabled: boolean
+    variable_selector: ValueSelector
+  }
+  vision: {
+    enabled: boolean
+    configs?: VisionSetting
+  }
+  structured_output_enabled?: boolean
+  structured_output?: StructuredOutput
+}
+
+export enum Type {
+  string = 'string',
+  number = 'number',
+  boolean = 'boolean',
+  object = 'object',
+  array = 'array',
+  arrayString = 'array[string]',
+  arrayNumber = 'array[number]',
+  arrayObject = 'array[object]',
+}
+
+export enum ArrayType {
+  string = 'array[string]',
+  number = 'array[number]',
+  boolean = 'array[boolean]',
+  object = 'array[object]',
+}
+
+export type TypeWithArray = Type | ArrayType
+
+type ArrayItemType = Exclude<Type, Type.array>
+export type ArrayItems = Omit<Field, 'type'> & { type: ArrayItemType }
+
+export type SchemaEnumType = string[] | number[]
+
+export type Field = {
+  type: Type
+  properties?: { // Object has properties
+    [key: string]: Field
+  }
+  required?: string[] // Key of required properties in object
+  description?: string
+  items?: ArrayItems // Array has items. Define the item type
+  enum?: SchemaEnumType // Enum values
+  additionalProperties?: false // Required in object by api. Just set false
+}
+
+export type StructuredOutput = {
+  schema: SchemaRoot
+}
+
+export type SchemaRoot = {
+  type: Type.object
+  properties: Record<string, Field>
+  required?: string[]
+  additionalProperties: false
+}
diff --git a/app/components/workflow/nodes/llm/use-config.ts b/app/components/workflow/nodes/llm/use-config.ts
new file mode 100644
index 0000000..13db9e4
--- /dev/null
+++ b/app/components/workflow/nodes/llm/use-config.ts
@@ -0,0 +1,448 @@
+import { useCallback, useEffect, useRef, useState } from 'react'
+import produce from 'immer'
+import { EditionType, VarType } from '../../types'
+import type { Memory, PromptItem, ValueSelector, Var, Variable } from '../../types'
+import { useStore } from '../../store'
+import {
+  useIsChatMode,
+  useNodesReadOnly,
+} from '../../hooks'
+import useAvailableVarList from '../_base/hooks/use-available-var-list'
+import useConfigVision from '../../hooks/use-config-vision'
+import type { LLMNodeType, StructuredOutput } from './types'
+import { useModelList, useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import {
+  ModelFeatureEnum,
+  ModelTypeEnum,
+} from '@/app/components/header/account-setting/model-provider-page/declarations'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run'
+import { RETRIEVAL_OUTPUT_STRUCT } from '@/app/components/workflow/constants'
+import { checkHasContextBlock, checkHasHistoryBlock, checkHasQueryBlock } from '@/app/components/base/prompt-editor/constants'
+
+const useConfig = (id: string, payload: LLMNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const isChatMode = useIsChatMode()
+
+  const defaultConfig = useStore(s => s.nodesDefaultConfigs)[payload.type]
+  const [defaultRolePrefix, setDefaultRolePrefix] = useState<{ user: string; assistant: string }>({ user: '', assistant: '' })
+  const { inputs, setInputs: doSetInputs } = useNodeCrud<LLMNodeType>(id, payload)
+  const inputRef = useRef(inputs)
+
+  const setInputs = useCallback((newInputs: LLMNodeType) => {
+    if (newInputs.memory && !newInputs.memory.role_prefix) {
+      const newPayload = produce(newInputs, (draft) => {
+        draft.memory!.role_prefix = defaultRolePrefix
+      })
+      doSetInputs(newPayload)
+      inputRef.current = newPayload
+      return
+    }
+    doSetInputs(newInputs)
+    inputRef.current = newInputs
+  }, [doSetInputs, defaultRolePrefix])
+
+  // model
+  const model = inputs.model
+  const modelMode = inputs.model?.mode
+  const isChatModel = modelMode === 'chat'
+
+  const isCompletionModel = !isChatModel
+
+  const hasSetBlockStatus = (() => {
+    const promptTemplate = inputs.prompt_template
+    const hasSetContext = isChatModel ? (promptTemplate as PromptItem[]).some(item => checkHasContextBlock(item.text)) : checkHasContextBlock((promptTemplate as PromptItem).text)
+    if (!isChatMode) {
+      return {
+        history: false,
+        query: false,
+        context: hasSetContext,
+      }
+    }
+    if (isChatModel) {
+      return {
+        history: false,
+        query: (promptTemplate as PromptItem[]).some(item => checkHasQueryBlock(item.text)),
+        context: hasSetContext,
+      }
+    }
+    else {
+      return {
+        history: checkHasHistoryBlock((promptTemplate as PromptItem).text),
+        query: checkHasQueryBlock((promptTemplate as PromptItem).text),
+        context: hasSetContext,
+      }
+    }
+  })()
+
+  const shouldShowContextTip = !hasSetBlockStatus.context && inputs.context.enabled
+
+  const appendDefaultPromptConfig = useCallback((draft: LLMNodeType, defaultConfig: any, passInIsChatMode?: boolean) => {
+    const promptTemplates = defaultConfig.prompt_templates
+    if (passInIsChatMode === undefined ? isChatModel : passInIsChatMode) {
+      draft.prompt_template = promptTemplates.chat_model.prompts
+    }
+    else {
+      draft.prompt_template = promptTemplates.completion_model.prompt
+
+      setDefaultRolePrefix({
+        user: promptTemplates.completion_model.conversation_histories_role.user_prefix,
+        assistant: promptTemplates.completion_model.conversation_histories_role.assistant_prefix,
+      })
+    }
+  }, [isChatModel])
+  useEffect(() => {
+    const isReady = defaultConfig && Object.keys(defaultConfig).length > 0
+
+    if (isReady && !inputs.prompt_template) {
+      const newInputs = produce(inputs, (draft) => {
+        appendDefaultPromptConfig(draft, defaultConfig)
+      })
+      setInputs(newInputs)
+    }
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [defaultConfig, isChatModel])
+
+  const [modelChanged, setModelChanged] = useState(false)
+  const {
+    currentProvider,
+    currentModel,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.textGeneration)
+
+  const {
+    isVisionModel,
+    handleVisionResolutionEnabledChange,
+    handleVisionResolutionChange,
+    handleModelChanged: handleVisionConfigAfterModelChanged,
+  } = useConfigVision(model, {
+    payload: inputs.vision,
+    onChange: (newPayload) => {
+      const newInputs = produce(inputs, (draft) => {
+        draft.vision = newPayload
+      })
+      setInputs(newInputs)
+    },
+  })
+
+  const handleModelChanged = useCallback((model: { provider: string; modelId: string; mode?: string }) => {
+    const newInputs = produce(inputRef.current, (draft) => {
+      draft.model.provider = model.provider
+      draft.model.name = model.modelId
+      draft.model.mode = model.mode!
+      const isModeChange = model.mode !== inputRef.current.model.mode
+      if (isModeChange && defaultConfig && Object.keys(defaultConfig).length > 0)
+        appendDefaultPromptConfig(draft, defaultConfig, model.mode === 'chat')
+    })
+    setInputs(newInputs)
+    setModelChanged(true)
+  }, [setInputs, defaultConfig, appendDefaultPromptConfig])
+
+  useEffect(() => {
+    if (currentProvider?.provider && currentModel?.model && !model.provider) {
+      handleModelChanged({
+        provider: currentProvider?.provider,
+        modelId: currentModel?.model,
+        mode: currentModel?.model_properties?.mode as string,
+      })
+    }
+  }, [model.provider, currentProvider, currentModel, handleModelChanged])
+
+  const handleCompletionParamsChange = useCallback((newParams: Record<string, any>) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.model.completion_params = newParams
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  // change to vision model to set vision enabled, else disabled
+  useEffect(() => {
+    if (!modelChanged)
+      return
+    setModelChanged(false)
+    handleVisionConfigAfterModelChanged()
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isVisionModel, modelChanged])
+
+  // variables
+  const isShowVars = (() => {
+    if (isChatModel)
+      return (inputs.prompt_template as PromptItem[]).some(item => item.edition_type === EditionType.jinja2)
+
+    return (inputs.prompt_template as PromptItem).edition_type === EditionType.jinja2
+  })()
+  const handleAddEmptyVariable = useCallback(() => {
+    const newInputs = produce(inputRef.current, (draft) => {
+      if (!draft.prompt_config) {
+        draft.prompt_config = {
+          jinja2_variables: [],
+        }
+      }
+      if (!draft.prompt_config.jinja2_variables)
+        draft.prompt_config.jinja2_variables = []
+
+      draft.prompt_config.jinja2_variables.push({
+        variable: '',
+        value_selector: [],
+      })
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  const handleAddVariable = useCallback((payload: Variable) => {
+    const newInputs = produce(inputRef.current, (draft) => {
+      if (!draft.prompt_config) {
+        draft.prompt_config = {
+          jinja2_variables: [],
+        }
+      }
+      if (!draft.prompt_config.jinja2_variables)
+        draft.prompt_config.jinja2_variables = []
+
+      draft.prompt_config.jinja2_variables.push(payload)
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  const handleVarListChange = useCallback((newList: Variable[]) => {
+    const newInputs = produce(inputRef.current, (draft) => {
+      if (!draft.prompt_config) {
+        draft.prompt_config = {
+          jinja2_variables: [],
+        }
+      }
+      if (!draft.prompt_config.jinja2_variables)
+        draft.prompt_config.jinja2_variables = []
+
+      draft.prompt_config.jinja2_variables = newList
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  const handleVarNameChange = useCallback((oldName: string, newName: string) => {
+    const newInputs = produce(inputRef.current, (draft) => {
+      if (isChatModel) {
+        const promptTemplate = draft.prompt_template as PromptItem[]
+        promptTemplate.filter(item => item.edition_type === EditionType.jinja2).forEach((item) => {
+          item.jinja2_text = (item.jinja2_text || '').replaceAll(`{{ ${oldName} }}`, `{{ ${newName} }}`)
+        })
+      }
+      else {
+        if ((draft.prompt_template as PromptItem).edition_type !== EditionType.jinja2)
+          return
+
+        const promptTemplate = draft.prompt_template as PromptItem
+        promptTemplate.jinja2_text = (promptTemplate.jinja2_text || '').replaceAll(`{{ ${oldName} }}`, `{{ ${newName} }}`)
+      }
+    })
+    setInputs(newInputs)
+  }, [isChatModel, setInputs])
+
+  // context
+  const handleContextVarChange = useCallback((newVar: ValueSelector | string) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.context.variable_selector = newVar as ValueSelector || []
+      draft.context.enabled = !!(newVar && newVar.length > 0)
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handlePromptChange = useCallback((newPrompt: PromptItem[] | PromptItem) => {
+    const newInputs = produce(inputRef.current, (draft) => {
+      draft.prompt_template = newPrompt
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  const handleMemoryChange = useCallback((newMemory?: Memory) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.memory = newMemory
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleSyeQueryChange = useCallback((newQuery: string) => {
+    const newInputs = produce(inputs, (draft) => {
+      if (!draft.memory) {
+        draft.memory = {
+          window: {
+            enabled: false,
+            size: 10,
+          },
+          query_prompt_template: newQuery,
+        }
+      }
+      else {
+        draft.memory.query_prompt_template = newQuery
+      }
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  // structure output
+  const { data: modelList } = useModelList(ModelTypeEnum.textGeneration)
+  const isModelSupportStructuredOutput = modelList
+    ?.find(provideItem => provideItem.provider === model?.provider)
+    ?.models.find(modelItem => modelItem.model === model?.name)
+    ?.features?.includes(ModelFeatureEnum.StructuredOutput)
+
+  const [structuredOutputCollapsed, setStructuredOutputCollapsed] = useState(true)
+  const handleStructureOutputEnableChange = useCallback((enabled: boolean) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.structured_output_enabled = enabled
+    })
+    setInputs(newInputs)
+    if (enabled)
+      setStructuredOutputCollapsed(false)
+  }, [inputs, setInputs])
+
+  const handleStructureOutputChange = useCallback((newOutput: StructuredOutput) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.structured_output = newOutput
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const filterInputVar = useCallback((varPayload: Var) => {
+    return [VarType.number, VarType.string, VarType.secret, VarType.arrayString, VarType.arrayNumber, VarType.file, VarType.arrayFile].includes(varPayload.type)
+  }, [])
+
+  const filterJinjia2InputVar = useCallback((varPayload: Var) => {
+    return [VarType.number, VarType.string, VarType.secret, VarType.arrayString, VarType.arrayNumber].includes(varPayload.type)
+  }, [])
+
+  const filterMemoryPromptVar = useCallback((varPayload: Var) => {
+    return [VarType.arrayObject, VarType.array, VarType.number, VarType.string, VarType.secret, VarType.arrayString, VarType.arrayNumber, VarType.file, VarType.arrayFile].includes(varPayload.type)
+  }, [])
+
+  const {
+    availableVars,
+    availableNodesWithParent,
+  } = useAvailableVarList(id, {
+    onlyLeafNodeVar: false,
+    filterVar: filterMemoryPromptVar,
+  })
+
+  // single run
+  const {
+    isShowSingleRun,
+    hideSingleRun,
+    getInputVars,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runInputData,
+    runInputDataRef,
+    setRunInputData,
+    runResult,
+    toVarInputs,
+  } = useOneStepRun<LLMNodeType>({
+    id,
+    data: inputs,
+    defaultRunInputData: {
+      '#context#': [RETRIEVAL_OUTPUT_STRUCT],
+      '#files#': [],
+    },
+  })
+
+  const inputVarValues = (() => {
+    const vars: Record<string, any> = {}
+    Object.keys(runInputData)
+      .filter(key => !['#context#', '#files#'].includes(key))
+      .forEach((key) => {
+        vars[key] = runInputData[key]
+      })
+    return vars
+  })()
+
+  const setInputVarValues = useCallback((newPayload: Record<string, any>) => {
+    const newVars = {
+      ...newPayload,
+      '#context#': runInputDataRef.current['#context#'],
+      '#files#': runInputDataRef.current['#files#'],
+    }
+    setRunInputData(newVars)
+  }, [runInputDataRef, setRunInputData])
+
+  const contexts = runInputData['#context#']
+  const setContexts = useCallback((newContexts: string[]) => {
+    setRunInputData({
+      ...runInputDataRef.current,
+      '#context#': newContexts,
+    })
+  }, [runInputDataRef, setRunInputData])
+
+  const visionFiles = runInputData['#files#']
+  const setVisionFiles = useCallback((newFiles: any[]) => {
+    setRunInputData({
+      ...runInputDataRef.current,
+      '#files#': newFiles,
+    })
+  }, [runInputDataRef, setRunInputData])
+
+  const allVarStrArr = (() => {
+    const arr = isChatModel ? (inputs.prompt_template as PromptItem[]).filter(item => item.edition_type !== EditionType.jinja2).map(item => item.text) : [(inputs.prompt_template as PromptItem).text]
+    if (isChatMode && isChatModel && !!inputs.memory) {
+      arr.push('{{#sys.query#}}')
+      arr.push(inputs.memory.query_prompt_template)
+    }
+
+    return arr
+  })()
+
+  const varInputs = (() => {
+    const vars = getInputVars(allVarStrArr)
+    if (isShowVars)
+      return [...vars, ...toVarInputs(inputs.prompt_config?.jinja2_variables || [])]
+
+    return vars
+  })()
+
+  return {
+    readOnly,
+    isChatMode,
+    inputs,
+    isChatModel,
+    isCompletionModel,
+    hasSetBlockStatus,
+    shouldShowContextTip,
+    isVisionModel,
+    handleModelChanged,
+    handleCompletionParamsChange,
+    isShowVars,
+    handleVarListChange,
+    handleVarNameChange,
+    handleAddVariable,
+    handleAddEmptyVariable,
+    handleContextVarChange,
+    filterInputVar,
+    filterVar: filterMemoryPromptVar,
+    availableVars,
+    availableNodesWithParent,
+    handlePromptChange,
+    handleMemoryChange,
+    handleSyeQueryChange,
+    handleVisionResolutionEnabledChange,
+    handleVisionResolutionChange,
+    isShowSingleRun,
+    hideSingleRun,
+    inputVarValues,
+    setInputVarValues,
+    visionFiles,
+    setVisionFiles,
+    contexts,
+    setContexts,
+    varInputs,
+    runningStatus,
+    isModelSupportStructuredOutput,
+    handleStructureOutputChange,
+    structuredOutputCollapsed,
+    setStructuredOutputCollapsed,
+    handleStructureOutputEnableChange,
+    handleRun,
+    handleStop,
+    runResult,
+    filterJinjia2InputVar,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/llm/utils.ts b/app/components/workflow/nodes/llm/utils.ts
new file mode 100644
index 0000000..b29646d
--- /dev/null
+++ b/app/components/workflow/nodes/llm/utils.ts
@@ -0,0 +1,336 @@
+import { ArrayType, Type } from './types'
+import type { ArrayItems, Field, LLMNodeType } from './types'
+import type { Schema, ValidationError } from 'jsonschema'
+import { Validator } from 'jsonschema'
+import produce from 'immer'
+import { z } from 'zod'
+
+export const checkNodeValid = (payload: LLMNodeType) => {
+  return true
+}
+
+export const getFieldType = (field: Field) => {
+  const { type, items } = field
+  if (type !== Type.array || !items)
+    return type
+
+  return ArrayType[items.type]
+}
+
+export const getHasChildren = (schema: Field) => {
+  const complexTypes = [Type.object, Type.array]
+  if (!complexTypes.includes(schema.type))
+    return false
+  if (schema.type === Type.object)
+    return schema.properties && Object.keys(schema.properties).length > 0
+  if (schema.type === Type.array)
+    return schema.items && schema.items.type === Type.object && schema.items.properties && Object.keys(schema.items.properties).length > 0
+}
+
+export const getTypeOf = (target: any) => {
+  if (target === null) return 'null'
+  if (typeof target !== 'object') {
+    return typeof target
+  }
+  else {
+    return Object.prototype.toString
+      .call(target)
+      .slice(8, -1)
+      .toLocaleLowerCase()
+  }
+}
+
+export const inferType = (value: any): Type => {
+  const type = getTypeOf(value)
+  if (type === 'array') return Type.array
+  // type boolean will be treated as string
+  if (type === 'boolean') return Type.string
+  if (type === 'number') return Type.number
+  if (type === 'string') return Type.string
+  if (type === 'object') return Type.object
+  return Type.string
+}
+
+export const jsonToSchema = (json: any): Field => {
+  const schema: Field = {
+    type: inferType(json),
+  }
+
+  if (schema.type === Type.object) {
+    schema.properties = {}
+    schema.required = []
+    schema.additionalProperties = false
+
+    Object.entries(json).forEach(([key, value]) => {
+      schema.properties![key] = jsonToSchema(value)
+      schema.required!.push(key)
+    })
+  }
+  else if (schema.type === Type.array) {
+    schema.items = jsonToSchema(json[0]) as ArrayItems
+  }
+
+  return schema
+}
+
+export const checkJsonDepth = (json: any) => {
+  if (!json || getTypeOf(json) !== 'object')
+    return 0
+
+  let maxDepth = 0
+
+  if (getTypeOf(json) === 'array') {
+    if (json[0] && getTypeOf(json[0]) === 'object')
+      maxDepth = checkJsonDepth(json[0])
+  }
+  else if (getTypeOf(json) === 'object') {
+    const propertyDepths = Object.values(json).map(value => checkJsonDepth(value))
+    maxDepth = propertyDepths.length ? Math.max(...propertyDepths) + 1 : 1
+  }
+
+  return maxDepth
+}
+
+export const checkJsonSchemaDepth = (schema: Field) => {
+  if (!schema || getTypeOf(schema) !== 'object')
+    return 0
+
+  let maxDepth = 0
+
+  if (schema.type === Type.object && schema.properties) {
+    const propertyDepths = Object.values(schema.properties).map(value => checkJsonSchemaDepth(value))
+    maxDepth = propertyDepths.length ? Math.max(...propertyDepths) + 1 : 1
+  }
+  else if (schema.type === Type.array && schema.items && schema.items.type === Type.object) {
+    maxDepth = checkJsonSchemaDepth(schema.items) + 1
+  }
+
+  return maxDepth
+}
+
+export const findPropertyWithPath = (target: any, path: string[]) => {
+  let current = target
+  for (const key of path)
+    current = current[key]
+  return current
+}
+
+const draft07MetaSchema = {
+  $schema: 'http://json-schema.org/draft-07/schema#',
+  $id: 'http://json-schema.org/draft-07/schema#',
+  title: 'Core schema meta-schema',
+  definitions: {
+    schemaArray: {
+      type: 'array',
+      minItems: 1,
+      items: { $ref: '#' },
+    },
+    nonNegativeInteger: {
+      type: 'integer',
+      minimum: 0,
+    },
+    nonNegativeIntegerDefault0: {
+      allOf: [
+        { $ref: '#/definitions/nonNegativeInteger' },
+        { default: 0 },
+      ],
+    },
+    simpleTypes: {
+      enum: [
+        'array',
+        'boolean',
+        'integer',
+        'null',
+        'number',
+        'object',
+        'string',
+      ],
+    },
+    stringArray: {
+      type: 'array',
+      items: { type: 'string' },
+      uniqueItems: true,
+      default: [],
+    },
+  },
+  type: ['object', 'boolean'],
+  properties: {
+    $id: {
+      type: 'string',
+      format: 'uri-reference',
+    },
+    $schema: {
+      type: 'string',
+      format: 'uri',
+    },
+    $ref: {
+      type: 'string',
+      format: 'uri-reference',
+    },
+    title: {
+      type: 'string',
+    },
+    description: {
+      type: 'string',
+    },
+    default: true,
+    readOnly: {
+      type: 'boolean',
+      default: false,
+    },
+    examples: {
+      type: 'array',
+      items: true,
+    },
+    multipleOf: {
+      type: 'number',
+      exclusiveMinimum: 0,
+    },
+    maximum: {
+      type: 'number',
+    },
+    exclusiveMaximum: {
+      type: 'number',
+    },
+    minimum: {
+      type: 'number',
+    },
+    exclusiveMinimum: {
+      type: 'number',
+    },
+    maxLength: { $ref: '#/definitions/nonNegativeInteger' },
+    minLength: { $ref: '#/definitions/nonNegativeIntegerDefault0' },
+    pattern: {
+      type: 'string',
+      format: 'regex',
+    },
+    additionalItems: { $ref: '#' },
+    items: {
+      anyOf: [
+        { $ref: '#' },
+        { $ref: '#/definitions/schemaArray' },
+      ],
+      default: true,
+    },
+    maxItems: { $ref: '#/definitions/nonNegativeInteger' },
+    minItems: { $ref: '#/definitions/nonNegativeIntegerDefault0' },
+    uniqueItems: {
+      type: 'boolean',
+      default: false,
+    },
+    contains: { $ref: '#' },
+    maxProperties: { $ref: '#/definitions/nonNegativeInteger' },
+    minProperties: { $ref: '#/definitions/nonNegativeIntegerDefault0' },
+    required: { $ref: '#/definitions/stringArray' },
+    additionalProperties: { $ref: '#' },
+    definitions: {
+      type: 'object',
+      additionalProperties: { $ref: '#' },
+      default: {},
+    },
+    properties: {
+      type: 'object',
+      additionalProperties: { $ref: '#' },
+      default: {},
+    },
+    patternProperties: {
+      type: 'object',
+      additionalProperties: { $ref: '#' },
+      propertyNames: { format: 'regex' },
+      default: {},
+    },
+    dependencies: {
+      type: 'object',
+      additionalProperties: {
+        anyOf: [
+          { $ref: '#' },
+          { $ref: '#/definitions/stringArray' },
+        ],
+      },
+    },
+    propertyNames: { $ref: '#' },
+    const: true,
+    enum: {
+      type: 'array',
+      items: true,
+      minItems: 1,
+      uniqueItems: true,
+    },
+    type: {
+      anyOf: [
+        { $ref: '#/definitions/simpleTypes' },
+        {
+          type: 'array',
+          items: { $ref: '#/definitions/simpleTypes' },
+          minItems: 1,
+          uniqueItems: true,
+        },
+      ],
+    },
+    format: { type: 'string' },
+    allOf: { $ref: '#/definitions/schemaArray' },
+    anyOf: { $ref: '#/definitions/schemaArray' },
+    oneOf: { $ref: '#/definitions/schemaArray' },
+    not: { $ref: '#' },
+  },
+  default: true,
+} as unknown as Schema
+
+const validator = new Validator()
+
+export const validateSchemaAgainstDraft7 = (schemaToValidate: any) => {
+  const schema = produce(schemaToValidate, (draft: any) => {
+  // Make sure the schema has the $schema property for draft-07
+    if (!draft.$schema)
+      draft.$schema = 'http://json-schema.org/draft-07/schema#'
+  })
+
+  const result = validator.validate(schema, draft07MetaSchema, {
+    nestedErrors: true,
+    throwError: false,
+  })
+
+  // Access errors from the validation result
+  const errors = result.valid ? [] : result.errors || []
+
+  return errors
+}
+
+export const getValidationErrorMessage = (errors: ValidationError[]) => {
+  const message = errors.map((error) => {
+    return `Error: ${error.path.join('.')} ${error.message} Details: ${JSON.stringify(error.stack)}`
+  }).join('; ')
+  return message
+}
+
+export const convertBooleanToString = (schema: any) => {
+  if (schema.type === Type.boolean)
+    schema.type = Type.string
+  if (schema.type === Type.array && schema.items && schema.items.type === Type.boolean)
+    schema.items.type = Type.string
+  if (schema.type === Type.object) {
+    schema.properties = Object.entries(schema.properties).reduce((acc, [key, value]) => {
+      acc[key] = convertBooleanToString(value)
+      return acc
+    }, {} as any)
+  }
+  if (schema.type === Type.array && schema.items && schema.items.type === Type.object) {
+    schema.items.properties = Object.entries(schema.items.properties).reduce((acc, [key, value]) => {
+      acc[key] = convertBooleanToString(value)
+      return acc
+    }, {} as any)
+  }
+  return schema
+}
+
+const schemaRootObject = z.object({
+  type: z.literal('object'),
+  properties: z.record(z.string(), z.any()),
+  required: z.array(z.string()),
+  additionalProperties: z.boolean().optional(),
+})
+
+export const preValidateSchema = (schema: any) => {
+  const result = schemaRootObject.safeParse(schema)
+  return result
+}
diff --git a/app/components/workflow/nodes/loop-end/default.ts b/app/components/workflow/nodes/loop-end/default.ts
new file mode 100644
index 0000000..c136704
--- /dev/null
+++ b/app/components/workflow/nodes/loop-end/default.ts
@@ -0,0 +1,23 @@
+import type { NodeDefault } from '../../types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+import type {
+  SimpleNodeType,
+} from '@/app/components/workflow/simple-node/types'
+
+const nodeDefault: NodeDefault<SimpleNodeType> = {
+  defaultValue: {},
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  getAvailableNextNodes() {
+    return []
+  },
+  checkValid() {
+    return {
+      isValid: true,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/loop-start/constants.ts b/app/components/workflow/nodes/loop-start/constants.ts
new file mode 100644
index 0000000..3185b84
--- /dev/null
+++ b/app/components/workflow/nodes/loop-start/constants.ts
@@ -0,0 +1 @@
+export const CUSTOM_LOOP_START_NODE = 'custom-loop-start'
diff --git a/app/components/workflow/nodes/loop-start/default.ts b/app/components/workflow/nodes/loop-start/default.ts
new file mode 100644
index 0000000..685f227
--- /dev/null
+++ b/app/components/workflow/nodes/loop-start/default.ts
@@ -0,0 +1,21 @@
+import type { NodeDefault } from '../../types'
+import type { LoopStartNodeType } from './types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+
+const nodeDefault: NodeDefault<LoopStartNodeType> = {
+  defaultValue: {},
+  getAvailablePrevNodes() {
+    return []
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid() {
+    return {
+      isValid: true,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/loop-start/index.tsx b/app/components/workflow/nodes/loop-start/index.tsx
new file mode 100644
index 0000000..a48cc5f
--- /dev/null
+++ b/app/components/workflow/nodes/loop-start/index.tsx
@@ -0,0 +1,42 @@
+import { memo } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { NodeProps } from 'reactflow'
+import { RiHome5Fill } from '@remixicon/react'
+import Tooltip from '@/app/components/base/tooltip'
+import { NodeSourceHandle } from '@/app/components/workflow/nodes/_base/components/node-handle'
+
+const LoopStartNode = ({ id, data }: NodeProps) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='nodrag group mt-1 flex h-11 w-11 items-center justify-center rounded-2xl border border-workflow-block-border bg-workflow-block-bg'>
+      <Tooltip popupContent={t('workflow.blocks.loop-start')} asChild={false}>
+        <div className='flex h-6 w-6 items-center justify-center rounded-full border-[0.5px] border-components-panel-border-subtle bg-util-colors-blue-brand-blue-brand-500'>
+          <RiHome5Fill className='h-3 w-3 text-text-primary-on-surface' />
+        </div>
+      </Tooltip>
+      <NodeSourceHandle
+        id={id}
+        data={data}
+        handleClassName='!top-1/2 !-right-[9px] !-translate-y-1/2'
+        handleId='source'
+      />
+    </div>
+  )
+}
+
+export const LoopStartNodeDumb = () => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='nodrag relative left-[17px] top-[21px] z-[11] flex h-11 w-11 items-center justify-center rounded-2xl border border-workflow-block-border bg-workflow-block-bg'>
+      <Tooltip popupContent={t('workflow.blocks.loop-start')} asChild={false}>
+        <div className='flex h-6 w-6 items-center justify-center rounded-full border-[0.5px] border-components-panel-border-subtle bg-util-colors-blue-brand-blue-brand-500'>
+          <RiHome5Fill className='h-3 w-3 text-text-primary-on-surface' />
+        </div>
+      </Tooltip>
+    </div>
+  )
+}
+
+export default memo(LoopStartNode)
diff --git a/app/components/workflow/nodes/loop-start/types.ts b/app/components/workflow/nodes/loop-start/types.ts
new file mode 100644
index 0000000..1ba7136
--- /dev/null
+++ b/app/components/workflow/nodes/loop-start/types.ts
@@ -0,0 +1,3 @@
+import type { CommonNodeType } from '@/app/components/workflow/types'
+
+export type LoopStartNodeType = CommonNodeType
diff --git a/app/components/workflow/nodes/loop/add-block.tsx b/app/components/workflow/nodes/loop/add-block.tsx
new file mode 100644
index 0000000..accee12
--- /dev/null
+++ b/app/components/workflow/nodes/loop/add-block.tsx
@@ -0,0 +1,80 @@
+import {
+  memo,
+  useCallback,
+} from 'react'
+import {
+  RiAddLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import {
+  useAvailableBlocks,
+  useNodesInteractions,
+  useNodesReadOnly,
+} from '../../hooks'
+import type { LoopNodeType } from './types'
+import cn from '@/utils/classnames'
+import BlockSelector from '@/app/components/workflow/block-selector'
+
+import type {
+  OnSelectBlock,
+} from '@/app/components/workflow/types'
+import {
+  BlockEnum,
+} from '@/app/components/workflow/types'
+
+type AddBlockProps = {
+  loopNodeId: string
+  loopNodeData: LoopNodeType
+}
+const AddBlock = ({
+  loopNodeData,
+}: AddBlockProps) => {
+  const { t } = useTranslation()
+  const { nodesReadOnly } = useNodesReadOnly()
+  const { handleNodeAdd } = useNodesInteractions()
+  const { availableNextBlocks } = useAvailableBlocks(BlockEnum.Start, false, true)
+
+  const handleSelect = useCallback<OnSelectBlock>((type, toolDefaultValue) => {
+    handleNodeAdd(
+      {
+        nodeType: type,
+        toolDefaultValue,
+      },
+      {
+        prevNodeId: loopNodeData.start_node_id,
+        prevNodeSourceHandle: 'source',
+      },
+    )
+  }, [handleNodeAdd, loopNodeData.start_node_id])
+
+  const renderTriggerElement = useCallback((open: boolean) => {
+    return (
+      <div className={cn(
+        'system-sm-medium relative inline-flex h-8 cursor-pointer items-center rounded-lg border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-3 text-components-button-secondary-text shadow-xs backdrop-blur-[5px] hover:bg-components-button-secondary-bg-hover',
+        `${nodesReadOnly && '!cursor-not-allowed bg-components-button-secondary-bg-disabled'}`,
+        open && 'bg-components-button-secondary-bg-hover',
+      )}>
+        <RiAddLine className='mr-1 h-4 w-4' />
+        {t('workflow.common.addBlock')}
+      </div>
+    )
+  }, [nodesReadOnly, t])
+
+  return (
+    <div className='absolute left-14 top-7 z-10 flex h-8 items-center'>
+      <div className='group/insert relative h-0.5 w-16 bg-gray-300'>
+        <div className='absolute right-0 top-1/2 h-2 w-0.5 -translate-y-1/2 bg-primary-500'></div>
+      </div>
+      <BlockSelector
+        disabled={nodesReadOnly}
+        onSelect={handleSelect}
+        trigger={renderTriggerElement}
+        triggerInnerClassName='inline-flex'
+        popupClassName='!min-w-[256px]'
+        availableBlocksTypes={availableNextBlocks}
+      />
+    </div>
+  )
+}
+
+export default memo(AddBlock)
diff --git a/app/components/workflow/nodes/loop/components/condition-add.tsx b/app/components/workflow/nodes/loop/components/condition-add.tsx
new file mode 100644
index 0000000..cd5be85
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/condition-add.tsx
@@ -0,0 +1,74 @@
+import {
+  useCallback,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiAddLine } from '@remixicon/react'
+import type { HandleAddCondition } from '../types'
+import Button from '@/app/components/base/button'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars'
+import type {
+  NodeOutPutVar,
+  ValueSelector,
+  Var,
+} from '@/app/components/workflow/types'
+
+type ConditionAddProps = {
+  className?: string
+  variables: NodeOutPutVar[]
+  onSelectVariable: HandleAddCondition
+  disabled?: boolean
+}
+const ConditionAdd = ({
+  className,
+  variables,
+  onSelectVariable,
+  disabled,
+}: ConditionAddProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const handleSelectVariable = useCallback((valueSelector: ValueSelector, varItem: Var) => {
+    onSelectVariable(valueSelector, varItem)
+    setOpen(false)
+  }, [onSelectVariable, setOpen])
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-start'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 0,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(!open)}>
+        <Button
+          size='small'
+          className={className}
+          disabled={disabled}
+        >
+          <RiAddLine className='mr-1 h-3.5 w-3.5' />
+          {t('workflow.nodes.ifElse.addCondition')}
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[1000]'>
+        <div className='w-[296px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg'>
+          <VarReferenceVars
+            vars={variables}
+            isSupportFileVar
+            onChange={handleSelectVariable}
+          />
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default ConditionAdd
diff --git a/app/components/workflow/nodes/loop/components/condition-files-list-value.tsx b/app/components/workflow/nodes/loop/components/condition-files-list-value.tsx
new file mode 100644
index 0000000..772b960
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/condition-files-list-value.tsx
@@ -0,0 +1,115 @@
+import {
+  memo,
+  useCallback,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { ComparisonOperator, type Condition } from '../types'
+import {
+  comparisonOperatorNotRequireValue,
+  isComparisonOperatorNeedTranslate,
+  isEmptyRelatedOperator,
+} from '../utils'
+import type { ValueSelector } from '../../../types'
+import { FILE_TYPE_OPTIONS, TRANSFER_METHOD } from './../default'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import { BubbleX, Env } from '@/app/components/base/icons/src/vender/line/others'
+import cn from '@/utils/classnames'
+import { isConversationVar, isENV, isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+const i18nPrefix = 'workflow.nodes.ifElse'
+
+type ConditionValueProps = {
+  condition: Condition
+}
+const ConditionValue = ({
+  condition,
+}: ConditionValueProps) => {
+  const { t } = useTranslation()
+  const {
+    variable_selector,
+    comparison_operator: operator,
+    sub_variable_condition,
+  } = condition
+
+  const variableSelector = variable_selector as ValueSelector
+
+  const variableName = (isSystemVar(variableSelector) ? variableSelector.slice(0).join('.') : variableSelector.slice(1).join('.'))
+  const operatorName = isComparisonOperatorNeedTranslate(operator) ? t(`workflow.nodes.ifElse.comparisonOperator.${operator}`) : operator
+  const notHasValue = comparisonOperatorNotRequireValue(operator)
+  const isEnvVar = isENV(variableSelector)
+  const isChatVar = isConversationVar(variableSelector)
+  const formatValue = useCallback((c: Condition) => {
+    const notHasValue = comparisonOperatorNotRequireValue(c.comparison_operator)
+    if (notHasValue)
+      return ''
+
+    const value = c.value as string
+    return value.replace(/{{#([^#]*)#}}/g, (a, b) => {
+      const arr: string[] = b.split('.')
+      if (isSystemVar(arr))
+        return `{{${b}}}`
+
+      return `{{${arr.slice(1).join('.')}}}`
+    })
+  }, [])
+
+  const isSelect = useCallback((c: Condition) => {
+    return c.comparison_operator === ComparisonOperator.in || c.comparison_operator === ComparisonOperator.notIn
+  }, [])
+
+  const selectName = useCallback((c: Condition) => {
+    const isSelect = c.comparison_operator === ComparisonOperator.in || c.comparison_operator === ComparisonOperator.notIn
+    if (isSelect) {
+      const name = [...FILE_TYPE_OPTIONS, ...TRANSFER_METHOD].filter(item => item.value === (Array.isArray(c.value) ? c.value[0] : c.value))[0]
+      return name
+        ? t(`workflow.nodes.ifElse.optionName.${name.i18nKey}`).replace(/{{#([^#]*)#}}/g, (a, b) => {
+          const arr: string[] = b.split('.')
+          if (isSystemVar(arr))
+            return `{{${b}}}`
+
+          return `{{${arr.slice(1).join('.')}}}`
+        })
+        : ''
+    }
+    return ''
+  }, [t])
+
+  return (
+    <div className='rounded-md bg-workflow-block-parma-bg'>
+      <div className='flex h-6 items-center px-1 '>
+        {!isEnvVar && !isChatVar && <Variable02 className='mr-1 h-3.5 w-3.5 shrink-0 text-text-accent' />}
+        {isEnvVar && <Env className='mr-1 h-3.5 w-3.5 shrink-0 text-util-colors-violet-violet-600' />}
+        {isChatVar && <BubbleX className='h-3.5 w-3.5 text-util-colors-teal-teal-700' />}
+
+        <div
+          className={cn(
+            'shrink-0  truncate text-xs font-medium text-text-accent',
+            !notHasValue && 'max-w-[70px]',
+          )}
+          title={variableName}
+        >
+          {variableName}
+        </div>
+        <div
+          className='mx-1 shrink-0 text-xs font-medium text-text-primary'
+          title={operatorName}
+        >
+          {operatorName}
+        </div>
+      </div>
+      <div className='ml-[10px] border-l border-divider-regular pl-[10px]'>
+        {
+          sub_variable_condition?.conditions.map((c: Condition, index) => (
+            <div className='relative flex h-6 items-center space-x-1' key={c.id}>
+              <div className='system-xs-medium text-text-accent'>{c.key}</div>
+              <div className='system-xs-medium text-text-primary'>{isComparisonOperatorNeedTranslate(c.comparison_operator) ? t(`workflow.nodes.ifElse.comparisonOperator.${c.comparison_operator}`) : c.comparison_operator}</div>
+              {c.comparison_operator && !isEmptyRelatedOperator(c.comparison_operator) && <div className='system-xs-regular text-text-secondary'>{isSelect(c) ? selectName(c) : formatValue(c)}</div>}
+              {index !== sub_variable_condition.conditions.length - 1 && (<div className='absolute bottom-[-10px] right-1 z-10 text-[10px] font-medium uppercase leading-4 text-text-accent'>{t(`${i18nPrefix}.${sub_variable_condition.logical_operator}`)}</div>)}
+            </div>
+          ))
+        }
+      </div>
+    </div>
+  )
+}
+
+export default memo(ConditionValue)
diff --git a/app/components/workflow/nodes/loop/components/condition-list/condition-input.tsx b/app/components/workflow/nodes/loop/components/condition-list/condition-input.tsx
new file mode 100644
index 0000000..5c02f14
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/condition-list/condition-input.tsx
@@ -0,0 +1,53 @@
+import { useTranslation } from 'react-i18next'
+import { useStore } from '@/app/components/workflow/store'
+import PromptEditor from '@/app/components/base/prompt-editor'
+import { BlockEnum } from '@/app/components/workflow/types'
+import type {
+  Node,
+} from '@/app/components/workflow/types'
+
+type ConditionInputProps = {
+  disabled?: boolean
+  value: string
+  onChange: (value: string) => void
+  availableNodes: Node[]
+}
+const ConditionInput = ({
+  value,
+  onChange,
+  disabled,
+  availableNodes,
+}: ConditionInputProps) => {
+  const { t } = useTranslation()
+  const controlPromptEditorRerenderKey = useStore(s => s.controlPromptEditorRerenderKey)
+
+  return (
+    <PromptEditor
+      key={controlPromptEditorRerenderKey}
+      compact
+      value={value}
+      placeholder={t('workflow.nodes.ifElse.enterValue') || ''}
+      workflowVariableBlock={{
+        show: true,
+        variables: [],
+        workflowNodesMap: availableNodes.reduce((acc, node) => {
+          acc[node.id] = {
+            title: node.data.title,
+            type: node.data.type,
+          }
+          if (node.data.type === BlockEnum.Start) {
+            acc.sys = {
+              title: t('workflow.blocks.start'),
+              type: BlockEnum.Start,
+            }
+          }
+          return acc
+        }, {} as any),
+      }}
+      onChange={onChange}
+      editable={!disabled}
+    />
+  )
+}
+
+export default ConditionInput
diff --git a/app/components/workflow/nodes/loop/components/condition-list/condition-item.tsx b/app/components/workflow/nodes/loop/components/condition-list/condition-item.tsx
new file mode 100644
index 0000000..b3ce67b
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/condition-list/condition-item.tsx
@@ -0,0 +1,330 @@
+import {
+  useCallback,
+  useMemo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiDeleteBinLine } from '@remixicon/react'
+import produce from 'immer'
+import type { VarType as NumberVarType } from '../../../tool/types'
+import type {
+  Condition,
+  HandleAddSubVariableCondition,
+  HandleRemoveCondition,
+  HandleToggleSubVariableConditionLogicalOperator,
+  HandleUpdateCondition,
+  HandleUpdateSubVariableCondition,
+  handleRemoveSubVariableCondition,
+} from '../../types'
+import {
+  ComparisonOperator,
+} from '../../types'
+import ConditionNumberInput from '../condition-number-input'
+import ConditionWrap from '../condition-wrap'
+import { comparisonOperatorNotRequireValue, getOperators } from './../../utils'
+import ConditionOperator from './condition-operator'
+import ConditionInput from './condition-input'
+import { FILE_TYPE_OPTIONS, SUB_VARIABLES, TRANSFER_METHOD } from './../../default'
+import type {
+  Node,
+  NodeOutPutVar,
+  ValueSelector,
+  Var,
+} from '@/app/components/workflow/types'
+import { VarType } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+import { SimpleSelect as Select } from '@/app/components/base/select'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import ConditionVarSelector from './condition-var-selector'
+
+const optionNameI18NPrefix = 'workflow.nodes.ifElse.optionName'
+
+type ConditionItemProps = {
+  className?: string
+  disabled?: boolean
+  conditionId: string // in isSubVariableKey it's the value of the parent condition's id
+  condition: Condition // condition may the condition of case or condition of sub variable
+  file?: { key: string }
+  isSubVariableKey?: boolean
+  isValueFieldShort?: boolean
+  onRemoveCondition?: HandleRemoveCondition
+  onUpdateCondition?: HandleUpdateCondition
+  onAddSubVariableCondition?: HandleAddSubVariableCondition
+  onRemoveSubVariableCondition?: handleRemoveSubVariableCondition
+  onUpdateSubVariableCondition?: HandleUpdateSubVariableCondition
+  onToggleSubVariableConditionLogicalOperator?: HandleToggleSubVariableConditionLogicalOperator
+  nodeId: string
+  availableNodes: Node[]
+  numberVariables: NodeOutPutVar[]
+  availableVars: NodeOutPutVar[]
+}
+const ConditionItem = ({
+  className,
+  disabled,
+  conditionId,
+  condition,
+  file,
+  isSubVariableKey,
+  isValueFieldShort,
+  onRemoveCondition,
+  onUpdateCondition,
+  onAddSubVariableCondition,
+  onRemoveSubVariableCondition,
+  onUpdateSubVariableCondition,
+  onToggleSubVariableConditionLogicalOperator,
+  nodeId,
+  availableNodes,
+  numberVariables,
+  availableVars,
+}: ConditionItemProps) => {
+  const { t } = useTranslation()
+
+  const [isHovered, setIsHovered] = useState(false)
+  const [open, setOpen] = useState(false)
+
+  const doUpdateCondition = useCallback((newCondition: Condition) => {
+    if (isSubVariableKey)
+      onUpdateSubVariableCondition?.(conditionId, condition.id, newCondition)
+    else
+      onUpdateCondition?.(condition.id, newCondition)
+  }, [condition, conditionId, isSubVariableKey, onUpdateCondition, onUpdateSubVariableCondition])
+
+  const canChooseOperator = useMemo(() => {
+    if (disabled)
+      return false
+
+    if (isSubVariableKey)
+      return !!condition.key
+
+    return true
+  }, [condition.key, disabled, isSubVariableKey])
+  const handleUpdateConditionOperator = useCallback((value: ComparisonOperator) => {
+    const newCondition = {
+      ...condition,
+      comparison_operator: value,
+    }
+    doUpdateCondition(newCondition)
+  }, [condition, doUpdateCondition])
+
+  const handleUpdateConditionNumberVarType = useCallback((numberVarType: NumberVarType) => {
+    const newCondition = {
+      ...condition,
+      numberVarType,
+      value: '',
+    }
+    doUpdateCondition(newCondition)
+  }, [condition, doUpdateCondition])
+
+  const isSubVariable = condition.varType === VarType.arrayFile && [ComparisonOperator.contains, ComparisonOperator.notContains, ComparisonOperator.allOf].includes(condition.comparison_operator!)
+  const fileAttr = useMemo(() => {
+    if (file)
+      return file
+    if (isSubVariableKey) {
+      return {
+        key: condition.key!,
+      }
+    }
+    return undefined
+  }, [condition.key, file, isSubVariableKey])
+
+  const isArrayValue = fileAttr?.key === 'transfer_method' || fileAttr?.key === 'type'
+
+  const handleUpdateConditionValue = useCallback((value: string) => {
+    if (value === condition.value || (isArrayValue && value === condition.value?.[0]))
+      return
+    const newCondition = {
+      ...condition,
+      value: isArrayValue ? [value] : value,
+    }
+    doUpdateCondition(newCondition)
+  }, [condition, doUpdateCondition, isArrayValue])
+
+  const isSelect = condition.comparison_operator && [ComparisonOperator.in, ComparisonOperator.notIn].includes(condition.comparison_operator)
+  const selectOptions = useMemo(() => {
+    if (isSelect) {
+      if (fileAttr?.key === 'type' || condition.comparison_operator === ComparisonOperator.allOf) {
+        return FILE_TYPE_OPTIONS.map(item => ({
+          name: t(`${optionNameI18NPrefix}.${item.i18nKey}`),
+          value: item.value,
+        }))
+      }
+      if (fileAttr?.key === 'transfer_method') {
+        return TRANSFER_METHOD.map(item => ({
+          name: t(`${optionNameI18NPrefix}.${item.i18nKey}`),
+          value: item.value,
+        }))
+      }
+      return []
+    }
+    return []
+  }, [condition.comparison_operator, fileAttr?.key, isSelect, t])
+
+  const isNotInput = isSelect || isSubVariable
+
+  const isSubVarSelect = isSubVariableKey
+  const subVarOptions = SUB_VARIABLES.map(item => ({
+    name: item,
+    value: item,
+  }))
+
+  const handleSubVarKeyChange = useCallback((key: string) => {
+    const newCondition = produce(condition, (draft) => {
+      draft.key = key
+      if (key === 'size')
+        draft.varType = VarType.number
+      else
+        draft.varType = VarType.string
+
+      draft.value = ''
+      draft.comparison_operator = getOperators(undefined, { key })[0]
+    })
+
+    onUpdateSubVariableCondition?.(conditionId, condition.id, newCondition)
+  }, [condition, conditionId, onUpdateSubVariableCondition])
+
+  const doRemoveCondition = useCallback(() => {
+    if (isSubVariableKey)
+      onRemoveSubVariableCondition?.(conditionId, condition.id)
+    else
+      onRemoveCondition?.(condition.id)
+  }, [condition, conditionId, isSubVariableKey, onRemoveCondition, onRemoveSubVariableCondition])
+
+  const handleVarChange = useCallback((valueSelector: ValueSelector, varItem: Var) => {
+    const newCondition = produce(condition, (draft) => {
+      draft.variable_selector = valueSelector
+      draft.varType = varItem.type
+      draft.value = ''
+      draft.comparison_operator = getOperators(varItem.type)[0]
+    })
+    doUpdateCondition(newCondition)
+    setOpen(false)
+  }, [condition, doUpdateCondition])
+
+  return (
+    <div className={cn('mb-1 flex last-of-type:mb-0', className)}>
+      <div className={cn(
+        'grow rounded-lg bg-components-input-bg-normal',
+        isHovered && 'bg-state-destructive-hover',
+      )}>
+        <div className='flex items-center p-1'>
+          <div className='w-0 grow'>
+            {isSubVarSelect
+              ? (
+                <Select
+                  wrapperClassName='h-6'
+                  className='pl-0 text-xs'
+                  optionWrapClassName='w-[165px] max-h-none'
+                  defaultValue={condition.key}
+                  items={subVarOptions}
+                  onSelect={item => handleSubVarKeyChange(item.value as string)}
+                  renderTrigger={item => (
+                    item
+                      ? <div className='flex cursor-pointer justify-start'>
+                        <div className='inline-flex h-6 max-w-full items-center rounded-md border-[0.5px] border-components-panel-border-subtle bg-components-badge-white-to-dark px-1.5 text-text-accent shadow-xs'>
+                          <Variable02 className='h-3.5 w-3.5 shrink-0 text-text-accent' />
+                          <div className='system-xs-medium ml-0.5 truncate'>{item?.name}</div>
+                        </div>
+                      </div>
+                      : <div className='system-sm-regular text-left text-components-input-text-placeholder'>{t('common.placeholder.select')}</div>
+                  )}
+                  hideChecked
+                />
+              )
+              : (
+                <ConditionVarSelector
+                  open={open}
+                  onOpenChange={setOpen}
+                  valueSelector={condition.variable_selector || []}
+                  varType={condition.varType}
+                  availableNodes={availableNodes}
+                  nodesOutputVars={availableVars}
+                  onChange={handleVarChange}
+                />
+              )}
+
+          </div>
+          <div className='mx-1 h-3 w-[1px] bg-divider-regular'></div>
+          <ConditionOperator
+            disabled={!canChooseOperator}
+            varType={condition.varType}
+            value={condition.comparison_operator}
+            onSelect={handleUpdateConditionOperator}
+            file={fileAttr}
+          />
+        </div>
+        {
+          !comparisonOperatorNotRequireValue(condition.comparison_operator) && !isNotInput && condition.varType !== VarType.number && (
+            <div className='max-h-[100px] overflow-y-auto border-t border-t-divider-subtle px-2 py-1'>
+              <ConditionInput
+                disabled={disabled}
+                value={condition.value as string}
+                onChange={handleUpdateConditionValue}
+                availableNodes={availableNodes}
+              />
+            </div>
+          )
+        }
+        {
+          !comparisonOperatorNotRequireValue(condition.comparison_operator) && !isNotInput && condition.varType === VarType.number && (
+            <div className='border-t border-t-divider-subtle px-2 py-1 pt-[3px]'>
+              <ConditionNumberInput
+                numberVarType={condition.numberVarType}
+                onNumberVarTypeChange={handleUpdateConditionNumberVarType}
+                value={condition.value as string}
+                onValueChange={handleUpdateConditionValue}
+                variables={numberVariables}
+                isShort={isValueFieldShort}
+                unit={fileAttr?.key === 'size' ? 'Byte' : undefined}
+              />
+            </div>
+          )
+        }
+        {
+          !comparisonOperatorNotRequireValue(condition.comparison_operator) && isSelect && (
+            <div className='border-t border-t-divider-subtle'>
+              <Select
+                wrapperClassName='h-8'
+                className='rounded-t-none px-2 text-xs'
+                defaultValue={isArrayValue ? (condition.value as string[])?.[0] : (condition.value as string)}
+                items={selectOptions}
+                onSelect={item => handleUpdateConditionValue(item.value as string)}
+                hideChecked
+                notClearable
+              />
+            </div>
+          )
+        }
+        {
+          !comparisonOperatorNotRequireValue(condition.comparison_operator) && isSubVariable && (
+            <div className='p-1'>
+              <ConditionWrap
+                isSubVariable
+                conditions={condition.sub_variable_condition?.conditions || []}
+                logicalOperator={condition.sub_variable_condition?.logical_operator}
+                conditionId={conditionId}
+                readOnly={!!disabled}
+                handleAddSubVariableCondition={onAddSubVariableCondition}
+                handleRemoveSubVariableCondition={onRemoveSubVariableCondition}
+                handleUpdateSubVariableCondition={onUpdateSubVariableCondition}
+                handleToggleSubVariableConditionLogicalOperator={onToggleSubVariableConditionLogicalOperator}
+                nodeId={nodeId}
+                availableNodes={availableNodes}
+                availableVars={availableVars}
+              />
+            </div>
+          )
+        }
+      </div>
+      <div
+        className='ml-1 mt-1 flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-lg text-text-tertiary hover:bg-state-destructive-hover hover:text-text-destructive'
+        onMouseEnter={() => setIsHovered(true)}
+        onMouseLeave={() => setIsHovered(false)}
+        onClick={doRemoveCondition}
+      >
+        <RiDeleteBinLine className='h-4 w-4' />
+      </div>
+    </div>
+  )
+}
+
+export default ConditionItem
diff --git a/app/components/workflow/nodes/loop/components/condition-list/condition-operator.tsx b/app/components/workflow/nodes/loop/components/condition-list/condition-operator.tsx
new file mode 100644
index 0000000..9036e04
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/condition-list/condition-operator.tsx
@@ -0,0 +1,94 @@
+import {
+  useMemo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine } from '@remixicon/react'
+import { getOperators, isComparisonOperatorNeedTranslate } from '../../utils'
+import type { ComparisonOperator } from '../../types'
+import Button from '@/app/components/base/button'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import type { VarType } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+const i18nPrefix = 'workflow.nodes.ifElse'
+
+type ConditionOperatorProps = {
+  className?: string
+  disabled?: boolean
+  varType: VarType
+  file?: { key: string }
+  value?: string
+  onSelect: (value: ComparisonOperator) => void
+}
+const ConditionOperator = ({
+  className,
+  disabled,
+  varType,
+  file,
+  value,
+  onSelect,
+}: ConditionOperatorProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  const options = useMemo(() => {
+    return getOperators(varType, file).map((o) => {
+      return {
+        label: isComparisonOperatorNeedTranslate(o) ? t(`${i18nPrefix}.comparisonOperator.${o}`) : o,
+        value: o,
+      }
+    })
+  }, [t, varType, file])
+  const selectedOption = options.find(o => Array.isArray(value) ? o.value === value[0] : o.value === value)
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 0,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+        <Button
+          className={cn('shrink-0', !selectedOption && 'opacity-50', className)}
+          size='small'
+          variant='ghost'
+          disabled={disabled}
+        >
+          {
+            selectedOption
+              ? selectedOption.label
+              : t(`${i18nPrefix}.select`)
+          }
+          <RiArrowDownSLine className='ml-1 h-3.5 w-3.5' />
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-10'>
+        <div className='rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
+          {
+            options.map(option => (
+              <div
+                key={option.value}
+                className='flex h-7 cursor-pointer items-center rounded-lg px-3 py-1.5 text-[13px] font-medium text-text-secondary hover:bg-state-base-hover'
+                onClick={() => {
+                  onSelect(option.value)
+                  setOpen(false)
+                }}
+              >
+                {option.label}
+              </div>
+            ))
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default ConditionOperator
diff --git a/app/components/workflow/nodes/loop/components/condition-list/condition-var-selector.tsx b/app/components/workflow/nodes/loop/components/condition-list/condition-var-selector.tsx
new file mode 100644
index 0000000..4cb82b4
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/condition-list/condition-var-selector.tsx
@@ -0,0 +1,58 @@
+import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '@/app/components/base/portal-to-follow-elem'
+import VariableTag from '@/app/components/workflow/nodes/_base/components/variable-tag'
+import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars'
+import type { Node, NodeOutPutVar, ValueSelector, Var, VarType } from '@/app/components/workflow/types'
+
+type ConditionVarSelectorProps = {
+  open: boolean
+  onOpenChange: (open: boolean) => void
+  valueSelector: ValueSelector
+  varType: VarType
+  availableNodes: Node[]
+  nodesOutputVars: NodeOutPutVar[]
+  onChange: (valueSelector: ValueSelector, varItem: Var) => void
+}
+
+const ConditionVarSelector = ({
+  open,
+  onOpenChange,
+  valueSelector,
+  varType,
+  availableNodes,
+  nodesOutputVars,
+  onChange,
+}: ConditionVarSelectorProps) => {
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={onOpenChange}
+      placement='bottom-start'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 0,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={() => onOpenChange(!open)}>
+        <div className="cursor-pointer">
+          <VariableTag
+            valueSelector={valueSelector}
+            varType={varType}
+            availableNodes={availableNodes}
+            isShort
+          />
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[1000]'>
+        <div className='w-[296px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg'>
+          <VarReferenceVars
+            vars={nodesOutputVars}
+            isSupportFileVar
+            onChange={onChange}
+          />
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default ConditionVarSelector
diff --git a/app/components/workflow/nodes/loop/components/condition-list/index.tsx b/app/components/workflow/nodes/loop/components/condition-list/index.tsx
new file mode 100644
index 0000000..987452d
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/condition-list/index.tsx
@@ -0,0 +1,126 @@
+import { RiLoopLeftLine } from '@remixicon/react'
+import { useCallback, useMemo } from 'react'
+import {
+  type Condition,
+  type HandleAddSubVariableCondition,
+  type HandleRemoveCondition,
+  type HandleToggleConditionLogicalOperator,
+  type HandleToggleSubVariableConditionLogicalOperator,
+  type HandleUpdateCondition,
+  type HandleUpdateSubVariableCondition,
+  LogicalOperator,
+  type handleRemoveSubVariableCondition,
+} from '../../types'
+import ConditionItem from './condition-item'
+import type {
+  Node,
+  NodeOutPutVar,
+} from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+
+type ConditionListProps = {
+  isSubVariable?: boolean
+  disabled?: boolean
+  conditionId?: string
+  conditions: Condition[]
+  logicalOperator?: LogicalOperator
+  onRemoveCondition?: HandleRemoveCondition
+  onUpdateCondition?: HandleUpdateCondition
+  onToggleConditionLogicalOperator?: HandleToggleConditionLogicalOperator
+  nodeId: string
+  availableNodes: Node[]
+  numberVariables: NodeOutPutVar[]
+  onAddSubVariableCondition?: HandleAddSubVariableCondition
+  onRemoveSubVariableCondition?: handleRemoveSubVariableCondition
+  onUpdateSubVariableCondition?: HandleUpdateSubVariableCondition
+  onToggleSubVariableConditionLogicalOperator?: HandleToggleSubVariableConditionLogicalOperator
+  availableVars: NodeOutPutVar[]
+}
+const ConditionList = ({
+  isSubVariable,
+  disabled,
+  conditionId,
+  conditions,
+  logicalOperator,
+  onUpdateCondition,
+  onRemoveCondition,
+  onToggleConditionLogicalOperator,
+  onAddSubVariableCondition,
+  onRemoveSubVariableCondition,
+  onUpdateSubVariableCondition,
+  onToggleSubVariableConditionLogicalOperator,
+  nodeId,
+  availableNodes,
+  numberVariables,
+  availableVars,
+}: ConditionListProps) => {
+  const doToggleConditionLogicalOperator = useCallback((conditionId?: string) => {
+    if (isSubVariable && conditionId)
+      onToggleSubVariableConditionLogicalOperator?.(conditionId)
+    else
+      onToggleConditionLogicalOperator?.()
+  }, [isSubVariable, onToggleConditionLogicalOperator, onToggleSubVariableConditionLogicalOperator])
+
+  const isValueFieldShort = useMemo(() => {
+    if (isSubVariable && conditions.length > 1)
+      return true
+
+    return false
+  }, [conditions.length, isSubVariable])
+  const conditionItemClassName = useMemo(() => {
+    if (!isSubVariable)
+      return ''
+    if (conditions.length < 2)
+      return ''
+    return logicalOperator === LogicalOperator.and ? 'pl-[51px]' : 'pl-[42px]'
+  }, [conditions.length, isSubVariable, logicalOperator])
+
+  return (
+    <div className={cn('relative', conditions.length > 1 && !isSubVariable && 'pl-[60px]')}>
+      {
+        conditions.length > 1 && (
+          <div className={cn(
+            'absolute bottom-0 left-0 top-0 w-[60px]',
+            isSubVariable && logicalOperator === LogicalOperator.and && 'left-[-10px]',
+            isSubVariable && logicalOperator === LogicalOperator.or && 'left-[-18px]',
+          )}>
+            <div className='absolute bottom-4 left-[46px] top-4 w-2.5 rounded-l-[8px] border border-r-0 border-divider-deep'></div>
+            <div className='absolute right-0 top-1/2 h-[29px] w-4 -translate-y-1/2 bg-components-panel-bg'></div>
+            <div
+              className='absolute right-1 top-1/2 flex h-[21px] -translate-y-1/2 cursor-pointer select-none items-center rounded-md border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-1 text-[10px] font-semibold text-text-accent-secondary shadow-xs'
+              onClick={() => doToggleConditionLogicalOperator(conditionId)}
+            >
+              {logicalOperator && logicalOperator.toUpperCase()}
+              <RiLoopLeftLine className='ml-0.5 h-3 w-3' />
+            </div>
+          </div>
+        )
+      }
+      {
+        conditions.map(condition => (
+          <ConditionItem
+            key={condition.id}
+            className={conditionItemClassName}
+            disabled={disabled}
+            conditionId={isSubVariable ? conditionId! : condition.id}
+            condition={condition}
+            isValueFieldShort={isValueFieldShort}
+            onUpdateCondition={onUpdateCondition}
+            onRemoveCondition={onRemoveCondition}
+            onAddSubVariableCondition={onAddSubVariableCondition}
+            onRemoveSubVariableCondition={onRemoveSubVariableCondition}
+            onUpdateSubVariableCondition={onUpdateSubVariableCondition}
+            onToggleSubVariableConditionLogicalOperator={onToggleSubVariableConditionLogicalOperator}
+            nodeId={nodeId}
+            availableNodes={availableNodes}
+            numberVariables={numberVariables}
+            isSubVariableKey={isSubVariable}
+            availableVars={availableVars}
+          />
+        ))
+      }
+    </div>
+  )
+}
+
+export default ConditionList
diff --git a/app/components/workflow/nodes/loop/components/condition-number-input.tsx b/app/components/workflow/nodes/loop/components/condition-number-input.tsx
new file mode 100644
index 0000000..ee13894
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/condition-number-input.tsx
@@ -0,0 +1,168 @@
+import {
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine } from '@remixicon/react'
+import { capitalize } from 'lodash-es'
+import { useBoolean } from 'ahooks'
+import { VarType as NumberVarType } from '../../tool/types'
+import VariableTag from '../../_base/components/variable-tag'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Button from '@/app/components/base/button'
+import cn from '@/utils/classnames'
+import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars'
+import type {
+  NodeOutPutVar,
+  ValueSelector,
+} from '@/app/components/workflow/types'
+import { VarType } from '@/app/components/workflow/types'
+import { variableTransformer } from '@/app/components/workflow/utils'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+
+const options = [
+  NumberVarType.variable,
+  NumberVarType.constant,
+]
+
+type ConditionNumberInputProps = {
+  numberVarType?: NumberVarType
+  onNumberVarTypeChange: (v: NumberVarType) => void
+  value: string
+  onValueChange: (v: string) => void
+  variables: NodeOutPutVar[]
+  isShort?: boolean
+  unit?: string
+}
+const ConditionNumberInput = ({
+  numberVarType = NumberVarType.constant,
+  onNumberVarTypeChange,
+  value,
+  onValueChange,
+  variables,
+  isShort,
+  unit,
+}: ConditionNumberInputProps) => {
+  const { t } = useTranslation()
+  const [numberVarTypeVisible, setNumberVarTypeVisible] = useState(false)
+  const [variableSelectorVisible, setVariableSelectorVisible] = useState(false)
+  const [isFocus, {
+    setTrue: setFocus,
+    setFalse: setBlur,
+  }] = useBoolean()
+
+  const handleSelectVariable = useCallback((valueSelector: ValueSelector) => {
+    onValueChange(variableTransformer(valueSelector) as string)
+    setVariableSelectorVisible(false)
+  }, [onValueChange])
+
+  return (
+    <div className='flex cursor-pointer items-center'>
+      <PortalToFollowElem
+        open={numberVarTypeVisible}
+        onOpenChange={setNumberVarTypeVisible}
+        placement='bottom-start'
+        offset={{ mainAxis: 2, crossAxis: 0 }}
+      >
+        <PortalToFollowElemTrigger onClick={() => setNumberVarTypeVisible(v => !v)}>
+          <Button
+            className='shrink-0'
+            variant='ghost'
+            size='small'
+          >
+            {capitalize(numberVarType)}
+            <RiArrowDownSLine className='ml-[1px] h-3.5 w-3.5' />
+          </Button>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[1000]'>
+          <div className='w-[112px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
+            {
+              options.map(option => (
+                <div
+                  key={option}
+                  className={cn(
+                    'flex h-7 cursor-pointer items-center rounded-md px-3 hover:bg-state-base-hover',
+                    'text-[13px] font-medium text-text-secondary',
+                    numberVarType === option && 'bg-state-base-hover',
+                  )}
+                  onClick={() => {
+                    onNumberVarTypeChange(option)
+                    setNumberVarTypeVisible(false)
+                  }}
+                >
+                  {capitalize(option)}
+                </div>
+              ))
+            }
+          </div>
+        </PortalToFollowElemContent>
+      </PortalToFollowElem>
+      <div className='mx-1 h-4 w-[1px] bg-divider-regular'></div>
+      <div className='ml-0.5 w-0 grow'>
+        {
+          numberVarType === NumberVarType.variable && (
+            <PortalToFollowElem
+              open={variableSelectorVisible}
+              onOpenChange={setVariableSelectorVisible}
+              placement='bottom-start'
+              offset={{ mainAxis: 2, crossAxis: 0 }}
+            >
+              <PortalToFollowElemTrigger
+                className='w-full'
+                onClick={() => setVariableSelectorVisible(v => !v)}>
+                {
+                  value && (
+                    <VariableTag
+                      valueSelector={variableTransformer(value) as string[]}
+                      varType={VarType.number}
+                      isShort={isShort}
+                    />
+                  )
+                }
+                {
+                  !value && (
+                    <div className='flex h-6 items-center p-1 text-[13px] text-components-input-text-placeholder'>
+                      <Variable02 className='mr-1 h-4 w-4 shrink-0' />
+                      <div className='w-0 grow truncate'>{t('workflow.nodes.ifElse.selectVariable')}</div>
+                    </div>
+                  )
+                }
+              </PortalToFollowElemTrigger>
+              <PortalToFollowElemContent className='z-[1000]'>
+                <div className={cn('w-[296px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur pt-1 shadow-lg', isShort && 'w-[200px]')}>
+                  <VarReferenceVars
+                    vars={variables}
+                    onChange={handleSelectVariable}
+                  />
+                </div>
+              </PortalToFollowElemContent>
+            </PortalToFollowElem>
+          )
+        }
+        {
+          numberVarType === NumberVarType.constant && (
+            <div className=' relative'>
+              <input
+                className={cn('block w-full appearance-none bg-transparent px-2 text-[13px] text-components-input-text-filled outline-none placeholder:text-components-input-text-placeholder', unit && 'pr-6')}
+                type='number'
+                value={value}
+                onChange={e => onValueChange(e.target.value)}
+                placeholder={t('workflow.nodes.ifElse.enterValue') || ''}
+                onFocus={setFocus}
+                onBlur={setBlur}
+              />
+              {!isFocus && unit && <div className='system-sm-regular absolute right-2 top-[50%] translate-y-[-50%] text-text-tertiary'>{unit}</div>}
+            </div>
+          )
+        }
+      </div>
+    </div>
+  )
+}
+
+export default memo(ConditionNumberInput)
diff --git a/app/components/workflow/nodes/loop/components/condition-value.tsx b/app/components/workflow/nodes/loop/components/condition-value.tsx
new file mode 100644
index 0000000..cc37a05
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/condition-value.tsx
@@ -0,0 +1,98 @@
+import {
+  memo,
+  useMemo,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { ComparisonOperator } from '../types'
+import {
+  comparisonOperatorNotRequireValue,
+  isComparisonOperatorNeedTranslate,
+} from '../utils'
+import { FILE_TYPE_OPTIONS, TRANSFER_METHOD } from './../default'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import { BubbleX, Env } from '@/app/components/base/icons/src/vender/line/others'
+import cn from '@/utils/classnames'
+import { isConversationVar, isENV, isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+
+type ConditionValueProps = {
+  variableSelector: string[]
+  labelName?: string
+  operator: ComparisonOperator
+  value: string | string[]
+}
+const ConditionValue = ({
+  variableSelector,
+  labelName,
+  operator,
+  value,
+}: ConditionValueProps) => {
+  const { t } = useTranslation()
+  const variableName = labelName || (isSystemVar(variableSelector) ? variableSelector.slice(0).join('.') : variableSelector.slice(1).join('.'))
+  const operatorName = isComparisonOperatorNeedTranslate(operator) ? t(`workflow.nodes.ifElse.comparisonOperator.${operator}`) : operator
+  const notHasValue = comparisonOperatorNotRequireValue(operator)
+  const isEnvVar = isENV(variableSelector)
+  const isChatVar = isConversationVar(variableSelector)
+  const formatValue = useMemo(() => {
+    if (notHasValue)
+      return ''
+
+    if (Array.isArray(value)) // transfer method
+      return value[0]
+
+    return value.replace(/{{#([^#]*)#}}/g, (a, b) => {
+      const arr: string[] = b.split('.')
+      if (isSystemVar(arr))
+        return `{{${b}}}`
+
+      return `{{${arr.slice(1).join('.')}}}`
+    })
+  }, [notHasValue, value])
+
+  const isSelect = operator === ComparisonOperator.in || operator === ComparisonOperator.notIn
+  const selectName = useMemo(() => {
+    if (isSelect) {
+      const name = [...FILE_TYPE_OPTIONS, ...TRANSFER_METHOD].filter(item => item.value === (Array.isArray(value) ? value[0] : value))[0]
+      return name
+        ? t(`workflow.nodes.ifElse.optionName.${name.i18nKey}`).replace(/{{#([^#]*)#}}/g, (a, b) => {
+          const arr: string[] = b.split('.')
+          if (isSystemVar(arr))
+            return `{{${b}}}`
+
+          return `{{${arr.slice(1).join('.')}}}`
+        })
+        : ''
+    }
+    return ''
+  }, [isSelect, t, value])
+
+  return (
+    <div className='flex h-6 items-center rounded-md bg-workflow-block-parma-bg px-1'>
+      {!isEnvVar && !isChatVar && <Variable02 className='mr-1 h-3.5 w-3.5 shrink-0 text-text-accent' />}
+      {isEnvVar && <Env className='mr-1 h-3.5 w-3.5 shrink-0 text-util-colors-violet-violet-600' />}
+      {isChatVar && <BubbleX className='h-3.5 w-3.5 text-util-colors-teal-teal-700' />}
+
+      <div
+        className={cn(
+          'shrink-0  truncate text-xs font-medium text-text-accent',
+          !notHasValue && 'max-w-[70px]',
+        )}
+        title={variableName}
+      >
+        {variableName}
+      </div>
+      <div
+        className='mx-1 shrink-0 text-xs font-medium text-text-primary'
+        title={operatorName}
+      >
+        {operatorName}
+      </div>
+      {
+        !notHasValue && (
+          <div className='truncate text-xs text-text-secondary' title={formatValue}>{isSelect ? selectName : formatValue}</div>
+        )
+      }
+    </div>
+  )
+}
+
+export default memo(ConditionValue)
diff --git a/app/components/workflow/nodes/loop/components/condition-wrap.tsx b/app/components/workflow/nodes/loop/components/condition-wrap.tsx
new file mode 100644
index 0000000..7aef364
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/condition-wrap.tsx
@@ -0,0 +1,146 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAddLine,
+} from '@remixicon/react'
+import type { Condition, HandleAddCondition, HandleAddSubVariableCondition, HandleRemoveCondition, HandleToggleConditionLogicalOperator, HandleToggleSubVariableConditionLogicalOperator, HandleUpdateCondition, HandleUpdateSubVariableCondition, LogicalOperator, handleRemoveSubVariableCondition } from '../types'
+import type { Node, NodeOutPutVar, Var } from '../../../types'
+import { VarType } from '../../../types'
+import { useGetAvailableVars } from '../../variable-assigner/hooks'
+import ConditionList from './condition-list'
+import ConditionAdd from './condition-add'
+import { SUB_VARIABLES } from './../default'
+import cn from '@/utils/classnames'
+import Button from '@/app/components/base/button'
+import { PortalSelect as Select } from '@/app/components/base/select'
+
+type Props = {
+  isSubVariable?: boolean
+  conditionId?: string
+  conditions: Condition[]
+  logicalOperator: LogicalOperator | undefined
+  readOnly: boolean
+  handleAddCondition?: HandleAddCondition
+  handleRemoveCondition?: HandleRemoveCondition
+  handleUpdateCondition?: HandleUpdateCondition
+  handleToggleConditionLogicalOperator?: HandleToggleConditionLogicalOperator
+  handleAddSubVariableCondition?: HandleAddSubVariableCondition
+  handleRemoveSubVariableCondition?: handleRemoveSubVariableCondition
+  handleUpdateSubVariableCondition?: HandleUpdateSubVariableCondition
+  handleToggleSubVariableConditionLogicalOperator?: HandleToggleSubVariableConditionLogicalOperator
+  nodeId: string
+  availableNodes: Node[]
+  availableVars: NodeOutPutVar[]
+}
+
+const ConditionWrap: FC<Props> = ({
+  isSubVariable,
+  conditionId,
+  conditions,
+  logicalOperator,
+  nodeId: id = '',
+  readOnly,
+  handleUpdateCondition,
+  handleAddCondition,
+  handleRemoveCondition,
+  handleToggleConditionLogicalOperator,
+  handleAddSubVariableCondition,
+  handleRemoveSubVariableCondition,
+  handleUpdateSubVariableCondition,
+  handleToggleSubVariableConditionLogicalOperator,
+  availableNodes = [],
+  availableVars = [],
+}) => {
+  const { t } = useTranslation()
+
+  const getAvailableVars = useGetAvailableVars()
+
+  const filterNumberVar = useCallback((varPayload: Var) => {
+    return varPayload.type === VarType.number
+  }, [])
+
+  const subVarOptions = SUB_VARIABLES.map(item => ({
+    name: item,
+    value: item,
+  }))
+
+  if (!conditions)
+    return <div />
+
+  return (
+    <>
+      <div>
+        <div
+          className={cn(
+            'group relative rounded-[10px] bg-components-panel-bg',
+            !isSubVariable && 'min-h-[40px] px-3 py-1 ',
+            isSubVariable && 'px-1 py-2',
+          )}
+        >
+          {
+            conditions && !!conditions.length && (
+              <div className='mb-2'>
+                <ConditionList
+                  disabled={readOnly}
+                  conditionId={conditionId}
+                  conditions={conditions}
+                  logicalOperator={logicalOperator}
+                  onUpdateCondition={handleUpdateCondition}
+                  onRemoveCondition={handleRemoveCondition}
+                  onToggleConditionLogicalOperator={handleToggleConditionLogicalOperator}
+                  nodeId={id}
+                  availableNodes={availableNodes}
+                  numberVariables={getAvailableVars(id, '', filterNumberVar)}
+                  onAddSubVariableCondition={handleAddSubVariableCondition}
+                  onRemoveSubVariableCondition={handleRemoveSubVariableCondition}
+                  onUpdateSubVariableCondition={handleUpdateSubVariableCondition}
+                  onToggleSubVariableConditionLogicalOperator={handleToggleSubVariableConditionLogicalOperator}
+                  isSubVariable={isSubVariable}
+                  availableVars={availableVars}
+                />
+              </div>
+            )
+          }
+
+          <div className={cn(
+            'flex items-center justify-between pr-[30px]',
+            !conditions.length && !isSubVariable && 'mt-1',
+            !conditions.length && isSubVariable && 'mt-2',
+            conditions.length > 1 && !isSubVariable && 'ml-[60px]',
+          )}>
+            {isSubVariable
+              ? (
+                <Select
+                  popupInnerClassName='w-[165px] max-h-none'
+                  onSelect={value => handleAddSubVariableCondition?.(conditionId!, value.value as string)}
+                  items={subVarOptions}
+                  value=''
+                  renderTrigger={() => (
+                    <Button
+                      size='small'
+                      disabled={readOnly}
+                    >
+                      <RiAddLine className='mr-1 h-3.5 w-3.5' />
+                      {t('workflow.nodes.ifElse.addSubVariable')}
+                    </Button>
+                  )}
+                  hideChecked
+                />
+              )
+              : (
+                <ConditionAdd
+                  disabled={readOnly}
+                  variables={availableVars}
+                  onSelectVariable={handleAddCondition!}
+                />
+              )}
+          </div>
+        </div>
+      </div>
+    </>
+  )
+}
+
+export default React.memo(ConditionWrap)
diff --git a/app/components/workflow/nodes/loop/components/loop-variables/empty.tsx b/app/components/workflow/nodes/loop/components/loop-variables/empty.tsx
new file mode 100644
index 0000000..6fe4aa0
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/loop-variables/empty.tsx
@@ -0,0 +1,13 @@
+import { useTranslation } from 'react-i18next'
+
+const Empty = () => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='system-xs-regular flex h-10 items-center justify-center rounded-[10px] bg-background-section text-text-tertiary'>
+      {t('workflow.nodes.loop.setLoopVariables')}
+    </div>
+  )
+}
+
+export default Empty
diff --git a/app/components/workflow/nodes/loop/components/loop-variables/form-item.tsx b/app/components/workflow/nodes/loop/components/loop-variables/form-item.tsx
new file mode 100644
index 0000000..4a05e45
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/loop-variables/form-item.tsx
@@ -0,0 +1,144 @@
+import {
+  useCallback,
+  useMemo,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import VarReferencePicker from '@/app/components/workflow/nodes/_base/components/variable/var-reference-picker'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
+import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+import type {
+  LoopVariable,
+} from '@/app/components/workflow/nodes/loop/types'
+import type {
+  Var,
+} from '@/app/components/workflow/types'
+import {
+  ValueType,
+  VarType,
+} from '@/app/components/workflow/types'
+
+const objectPlaceholder = `#  example
+#  {
+#     "name": "ray",
+#     "age": 20
+#  }`
+const arrayStringPlaceholder = `#  example
+#  [
+#     "value1",
+#     "value2"
+#  ]`
+const arrayNumberPlaceholder = `#  example
+#  [
+#     100,
+#     200
+#  ]`
+const arrayObjectPlaceholder = `#  example
+#  [
+#     {
+#       "name": "ray",
+#       "age": 20
+#     },
+#     {
+#       "name": "lily",
+#       "age": 18
+#     }
+#  ]`
+
+type FormItemProps = {
+  nodeId: string
+  item: LoopVariable
+  onChange: (value: any) => void
+}
+const FormItem = ({
+  nodeId,
+  item,
+  onChange,
+}: FormItemProps) => {
+  const { t } = useTranslation()
+  const { value_type, var_type, value } = item
+
+  const handleInputChange = useCallback((e: any) => {
+    onChange(e.target.value)
+  }, [onChange])
+
+  const handleChange = useCallback((value: any) => {
+    onChange(value)
+  }, [onChange])
+
+  const filterVar = useCallback((variable: Var) => {
+    return variable.type === var_type
+  }, [var_type])
+
+  const editorMinHeight = useMemo(() => {
+    if (var_type === VarType.arrayObject)
+      return '240px'
+    return '120px'
+  }, [var_type])
+  const placeholder = useMemo(() => {
+    if (var_type === VarType.arrayString)
+      return arrayStringPlaceholder
+    if (var_type === VarType.arrayNumber)
+      return arrayNumberPlaceholder
+    if (var_type === VarType.arrayObject)
+      return arrayObjectPlaceholder
+    return objectPlaceholder
+  }, [var_type])
+
+  return (
+    <div>
+      {
+        value_type === ValueType.variable && (
+          <VarReferencePicker
+            readonly={false}
+            nodeId={nodeId}
+            isShowNodeName
+            value={value}
+            onChange={handleChange}
+            filterVar={filterVar}
+            placeholder={t('workflow.nodes.assigner.setParameter') as string}
+          />
+        )
+      }
+      {
+        value_type === ValueType.constant && var_type === VarType.string && (
+          <Textarea
+            value={value}
+            onChange={handleInputChange}
+            className='min-h-12 w-full'
+          />
+        )
+      }
+      {
+        value_type === ValueType.constant && var_type === VarType.number && (
+          <Input
+            type="number"
+            value={value}
+            onChange={handleInputChange}
+            className='w-full'
+          />
+        )
+      }
+      {
+        value_type === ValueType.constant
+        && (var_type === VarType.object || var_type === VarType.arrayString || var_type === VarType.arrayNumber || var_type === VarType.arrayObject)
+        && (
+          <div className='w-full rounded-[10px] bg-components-input-bg-normal py-2 pl-3 pr-1' style={{ height: editorMinHeight }}>
+            <CodeEditor
+              value={value}
+              isExpand
+              noWrapper
+              language={CodeLanguage.json}
+              onChange={handleChange}
+              className='w-full'
+              placeholder={<div className='whitespace-pre'>{placeholder}</div>}
+            />
+          </div>
+        )
+      }
+    </div>
+  )
+}
+
+export default FormItem
diff --git a/app/components/workflow/nodes/loop/components/loop-variables/index.tsx b/app/components/workflow/nodes/loop/components/loop-variables/index.tsx
new file mode 100644
index 0000000..26251e3
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/loop-variables/index.tsx
@@ -0,0 +1,28 @@
+import Empty from './empty'
+import Item from './item'
+import type {
+  LoopVariable,
+  LoopVariablesComponentShape,
+} from '@/app/components/workflow/nodes/loop/types'
+
+type LoopVariableProps = {
+  variables?: LoopVariable[]
+} & LoopVariablesComponentShape
+
+const LoopVariableComponent = ({
+  variables = [],
+  ...restProps
+}: LoopVariableProps) => {
+  if (!variables.length)
+    return <Empty />
+
+  return variables.map(variable => (
+    <Item
+      key={variable.id}
+      item={variable}
+      {...restProps}
+    />
+  ))
+}
+
+export default LoopVariableComponent
diff --git a/app/components/workflow/nodes/loop/components/loop-variables/input-mode-selec.tsx b/app/components/workflow/nodes/loop/components/loop-variables/input-mode-selec.tsx
new file mode 100644
index 0000000..96f3515
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/loop-variables/input-mode-selec.tsx
@@ -0,0 +1,37 @@
+import { useTranslation } from 'react-i18next'
+import PureSelect from '@/app/components/base/select/pure'
+
+type InputModeSelectProps = {
+  value?: string
+  onChange: (value: string) => void
+}
+const InputModeSelect = ({
+  value,
+  onChange,
+}: InputModeSelectProps) => {
+  const { t } = useTranslation()
+  const options = [
+    {
+      label: 'Variable',
+      value: 'variable',
+    },
+    {
+      label: 'Constant',
+      value: 'constant',
+    },
+  ]
+
+  return (
+    <PureSelect
+      options={options}
+      value={value}
+      onChange={onChange}
+      popupProps={{
+        title: t('workflow.nodes.loop.inputMode'),
+        className: 'w-[132px]',
+      }}
+    />
+  )
+}
+
+export default InputModeSelect
diff --git a/app/components/workflow/nodes/loop/components/loop-variables/item.tsx b/app/components/workflow/nodes/loop/components/loop-variables/item.tsx
new file mode 100644
index 0000000..d33e936
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/loop-variables/item.tsx
@@ -0,0 +1,78 @@
+import { useCallback } from 'react'
+import { RiDeleteBinLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import InputModeSelect from './input-mode-selec'
+import VariableTypeSelect from './variable-type-select'
+import FormItem from './form-item'
+import ActionButton from '@/app/components/base/action-button'
+import Input from '@/app/components/base/input'
+import type {
+  LoopVariable,
+  LoopVariablesComponentShape,
+} from '@/app/components/workflow/nodes/loop/types'
+
+type ItemProps = {
+  item: LoopVariable
+} & LoopVariablesComponentShape
+const Item = ({
+  nodeId,
+  item,
+  handleRemoveLoopVariable,
+  handleUpdateLoopVariable,
+}: ItemProps) => {
+  const { t } = useTranslation()
+  const handleUpdateItemLabel = useCallback((e: any) => {
+    handleUpdateLoopVariable(item.id, { label: e.target.value })
+  }, [item.id, handleUpdateLoopVariable])
+
+  const handleUpdateItemVarType = useCallback((value: any) => {
+    handleUpdateLoopVariable(item.id, { var_type: value, value: undefined })
+  }, [item.id, handleUpdateLoopVariable])
+
+  const handleUpdateItemValueType = useCallback((value: any) => {
+    handleUpdateLoopVariable(item.id, { value_type: value, value: undefined })
+  }, [item.id, handleUpdateLoopVariable])
+
+  const handleUpdateItemValue = useCallback((value: any) => {
+    handleUpdateLoopVariable(item.id, { value })
+  }, [item.id, handleUpdateLoopVariable])
+
+  return (
+    <div className='mb-4 flex last-of-type:mb-0'>
+      <div className='w-0 grow'>
+        <div className='mb-1 grid grid-cols-3 gap-1'>
+          <Input
+            value={item.label}
+            onChange={handleUpdateItemLabel}
+            autoFocus={!item.label}
+            placeholder={t('workflow.nodes.loop.variableName')}
+          />
+          <VariableTypeSelect
+            value={item.var_type}
+            onChange={handleUpdateItemVarType}
+          />
+          <InputModeSelect
+            value={item.value_type}
+            onChange={handleUpdateItemValueType}
+          />
+        </div>
+        <div>
+          <FormItem
+            nodeId={nodeId}
+            item={item}
+            onChange={handleUpdateItemValue}
+          />
+        </div>
+      </div>
+      <ActionButton
+        className='shrink-0'
+        size='l'
+        onClick={() => handleRemoveLoopVariable(item.id)}
+      >
+        <RiDeleteBinLine className='h-4 w-4 text-text-tertiary' />
+      </ActionButton>
+    </div>
+  )
+}
+
+export default Item
diff --git a/app/components/workflow/nodes/loop/components/loop-variables/variable-type-select.tsx b/app/components/workflow/nodes/loop/components/loop-variables/variable-type-select.tsx
new file mode 100644
index 0000000..5271660
--- /dev/null
+++ b/app/components/workflow/nodes/loop/components/loop-variables/variable-type-select.tsx
@@ -0,0 +1,51 @@
+import PureSelect from '@/app/components/base/select/pure'
+import { VarType } from '@/app/components/workflow/types'
+
+type VariableTypeSelectProps = {
+  value?: string
+  onChange: (value: string) => void
+}
+const VariableTypeSelect = ({
+  value,
+  onChange,
+}: VariableTypeSelectProps) => {
+  const options = [
+    {
+      label: 'String',
+      value: VarType.string,
+    },
+    {
+      label: 'Number',
+      value: VarType.number,
+    },
+    {
+      label: 'Object',
+      value: VarType.object,
+    },
+    {
+      label: 'Array[string]',
+      value: VarType.arrayString,
+    },
+    {
+      label: 'Array[number]',
+      value: VarType.arrayNumber,
+    },
+    {
+      label: 'Array[object]',
+      value: VarType.arrayObject,
+    },
+  ]
+
+  return (
+    <PureSelect
+      options={options}
+      value={value}
+      onChange={onChange}
+      popupProps={{
+        className: 'w-[132px]',
+      }}
+    />
+  )
+}
+
+export default VariableTypeSelect
diff --git a/app/components/workflow/nodes/loop/default.ts b/app/components/workflow/nodes/loop/default.ts
new file mode 100644
index 0000000..b446432
--- /dev/null
+++ b/app/components/workflow/nodes/loop/default.ts
@@ -0,0 +1,94 @@
+import { BlockEnum } from '../../types'
+import type { NodeDefault } from '../../types'
+import { ComparisonOperator, LogicalOperator, type LoopNodeType } from './types'
+import { isEmptyRelatedOperator } from './utils'
+import { TransferMethod } from '@/types/app'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+import { LOOP_NODE_MAX_COUNT } from '@/config'
+const i18nPrefix = 'workflow.errorMsg'
+
+const nodeDefault: NodeDefault<LoopNodeType> = {
+  defaultValue: {
+    start_node_id: '',
+    break_conditions: [],
+    loop_count: 10,
+    _children: [],
+    logical_operator: LogicalOperator.and,
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: LoopNodeType, t: any) {
+    let errorMessages = ''
+
+    payload.loop_variables?.forEach((variable) => {
+      if (!variable.label)
+        errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variable`) })
+    })
+
+    payload.break_conditions!.forEach((condition) => {
+      if (!errorMessages && (!condition.variable_selector || condition.variable_selector.length === 0))
+        errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variable`) })
+      if (!errorMessages && !condition.comparison_operator)
+        errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t('workflow.nodes.ifElse.operator') })
+      if (!errorMessages) {
+        if (condition.sub_variable_condition
+          && ![ComparisonOperator.empty, ComparisonOperator.notEmpty].includes(condition.comparison_operator!)) {
+          const isSet = condition.sub_variable_condition.conditions.every((c) => {
+            if (!c.comparison_operator)
+              return false
+
+            if (isEmptyRelatedOperator(c.comparison_operator!))
+              return true
+
+            return !!c.value
+          })
+
+          if (!isSet)
+            errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variableValue`) })
+        }
+        else {
+          if (!isEmptyRelatedOperator(condition.comparison_operator!) && !condition.value)
+            errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variableValue`) })
+        }
+      }
+    })
+
+    if (!errorMessages && (
+      Number.isNaN(Number(payload.loop_count))
+      || !Number.isInteger(Number(payload.loop_count))
+      || payload.loop_count < 1
+      || payload.loop_count > LOOP_NODE_MAX_COUNT
+    ))
+      errorMessages = t('workflow.nodes.loop.loopMaxCountError', { maxCount: LOOP_NODE_MAX_COUNT })
+
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export const FILE_TYPE_OPTIONS = [
+  { value: 'image', i18nKey: 'image' },
+  { value: 'document', i18nKey: 'doc' },
+  { value: 'audio', i18nKey: 'audio' },
+  { value: 'video', i18nKey: 'video' },
+]
+
+export const TRANSFER_METHOD = [
+  { value: TransferMethod.local_file, i18nKey: 'localUpload' },
+  { value: TransferMethod.remote_url, i18nKey: 'url' },
+]
+
+export const SUB_VARIABLES = ['type', 'size', 'name', 'url', 'extension', 'mime_type', 'transfer_method', 'related_id']
+export const OUTPUT_FILE_SUB_VARIABLES = SUB_VARIABLES.filter(key => key !== 'transfer_method')
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/loop/insert-block.tsx b/app/components/workflow/nodes/loop/insert-block.tsx
new file mode 100644
index 0000000..c4f4348
--- /dev/null
+++ b/app/components/workflow/nodes/loop/insert-block.tsx
@@ -0,0 +1,61 @@
+import {
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import cn from 'classnames'
+import { useNodesInteractions } from '../../hooks'
+import type {
+  BlockEnum,
+  OnSelectBlock,
+} from '../../types'
+import BlockSelector from '../../block-selector'
+
+type InsertBlockProps = {
+  startNodeId: string
+  availableBlocksTypes: BlockEnum[]
+}
+const InsertBlock = ({
+  startNodeId,
+  availableBlocksTypes,
+}: InsertBlockProps) => {
+  const [open, setOpen] = useState(false)
+  const { handleNodeAdd } = useNodesInteractions()
+
+  const handleOpenChange = useCallback((v: boolean) => {
+    setOpen(v)
+  }, [])
+  const handleInsert = useCallback<OnSelectBlock>((nodeType, toolDefaultValue) => {
+    handleNodeAdd(
+      {
+        nodeType,
+        toolDefaultValue,
+      },
+      {
+        nextNodeId: startNodeId,
+        nextNodeTargetHandle: 'target',
+      },
+    )
+  }, [startNodeId, handleNodeAdd])
+
+  return (
+    <div
+      className={cn(
+        'nopan nodrag',
+        'absolute left-1/2 top-1/2 hidden -translate-x-1/2 -translate-y-1/2 group-hover/insert:block',
+        open && '!block',
+      )}
+    >
+      <BlockSelector
+        open={open}
+        onOpenChange={handleOpenChange}
+        asChild
+        onSelect={handleInsert}
+        availableBlocksTypes={availableBlocksTypes}
+        triggerClassName={() => 'hover:scale-125 transition-all'}
+      />
+    </div>
+  )
+}
+
+export default memo(InsertBlock)
diff --git a/app/components/workflow/nodes/loop/node.tsx b/app/components/workflow/nodes/loop/node.tsx
new file mode 100644
index 0000000..57be10b
--- /dev/null
+++ b/app/components/workflow/nodes/loop/node.tsx
@@ -0,0 +1,61 @@
+import type { FC } from 'react'
+import {
+  memo,
+  useEffect,
+} from 'react'
+import {
+  Background,
+  useNodesInitialized,
+  useViewport,
+} from 'reactflow'
+import { LoopStartNodeDumb } from '../loop-start'
+import { useNodeLoopInteractions } from './use-interactions'
+import type { LoopNodeType } from './types'
+import AddBlock from './add-block'
+import cn from '@/utils/classnames'
+
+import type { NodeProps } from '@/app/components/workflow/types'
+
+const Node: FC<NodeProps<LoopNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { zoom } = useViewport()
+  const nodesInitialized = useNodesInitialized()
+  const { handleNodeLoopRerender } = useNodeLoopInteractions()
+
+  useEffect(() => {
+    if (nodesInitialized)
+      handleNodeLoopRerender(id)
+  }, [nodesInitialized, id, handleNodeLoopRerender])
+
+  return (
+    <div className={cn(
+      'relative h-full min-h-[90px] w-full min-w-[240px] rounded-2xl bg-workflow-canvas-workflow-bg',
+    )}>
+      <Background
+        id={`loop-background-${id}`}
+        className='!z-0 rounded-2xl'
+        gap={[14 / zoom, 14 / zoom]}
+        size={2 / zoom}
+        color='var(--color-workflow-canvas-workflow-dot-color)'
+      />
+      {
+        data._isCandidate && (
+          <LoopStartNodeDumb />
+        )
+      }
+      {
+        data._children!.length === 1 && (
+          <AddBlock
+            loopNodeId={id}
+            loopNodeData={data}
+          />
+        )
+      }
+
+    </div>
+  )
+}
+
+export default memo(Node)
diff --git a/app/components/workflow/nodes/loop/panel.tsx b/app/components/workflow/nodes/loop/panel.tsx
new file mode 100644
index 0000000..8114160
--- /dev/null
+++ b/app/components/workflow/nodes/loop/panel.tsx
@@ -0,0 +1,160 @@
+import type { FC } from 'react'
+import React, { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiAddLine } from '@remixicon/react'
+import Split from '../_base/components/split'
+import ResultPanel from '../../run/result-panel'
+import InputNumberWithSlider from '../_base/components/input-number-with-slider'
+import type { LoopNodeType } from './types'
+import useConfig from './use-config'
+import ConditionWrap from './components/condition-wrap'
+import LoopVariable from './components/loop-variables'
+import type { NodePanelProps } from '@/app/components/workflow/types'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
+import formatTracing from '@/app/components/workflow/run/utils/format-log'
+
+import { useLogs } from '@/app/components/workflow/run/hooks'
+import { LOOP_NODE_MAX_COUNT } from '@/config'
+
+const i18nPrefix = 'workflow.nodes.loop'
+
+const Panel: FC<NodePanelProps<LoopNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    readOnly,
+    inputs,
+    childrenNodeVars,
+    loopChildrenNodes,
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runResult,
+    loopRunResult,
+    handleAddCondition,
+    handleUpdateCondition,
+    handleRemoveCondition,
+    handleToggleConditionLogicalOperator,
+    handleAddSubVariableCondition,
+    handleRemoveSubVariableCondition,
+    handleUpdateSubVariableCondition,
+    handleToggleSubVariableConditionLogicalOperator,
+    handleUpdateLoopCount,
+    handleAddLoopVariable,
+    handleRemoveLoopVariable,
+    handleUpdateLoopVariable,
+  } = useConfig(id, data)
+
+  const nodeInfo = useMemo(() => {
+    const formattedNodeInfo = formatTracing(loopRunResult, t)[0]
+
+    if (runResult && formattedNodeInfo) {
+      return {
+        ...formattedNodeInfo,
+        execution_metadata: {
+          ...runResult.execution_metadata,
+          ...formattedNodeInfo.execution_metadata,
+        },
+      }
+    }
+
+    return formattedNodeInfo
+  }, [runResult, loopRunResult, t])
+  const logsParams = useLogs()
+
+  return (
+    <div className='mt-2'>
+      <div>
+        <Field
+          title={<div className='pl-3'>{t('workflow.nodes.loop.loopVariables')}</div>}
+          operations={
+            <div
+              className='mr-4 flex h-5 w-5 cursor-pointer items-center justify-center'
+              onClick={handleAddLoopVariable}
+            >
+              <RiAddLine className='h-4 w-4 text-text-tertiary' />
+            </div>
+          }
+        >
+          <div className='px-4'>
+            <LoopVariable
+              variables={inputs.loop_variables}
+              nodeId={id}
+              handleRemoveLoopVariable={handleRemoveLoopVariable}
+              handleUpdateLoopVariable={handleUpdateLoopVariable}
+            />
+          </div>
+        </Field>
+        <Split className='my-2' />
+        <Field
+          title={<div className='pl-3'>{t(`${i18nPrefix}.breakCondition`)}</div>}
+          tooltip={t(`${i18nPrefix}.breakConditionTip`)}
+        >
+          <ConditionWrap
+            nodeId={id}
+            readOnly={readOnly}
+            handleAddCondition={handleAddCondition}
+            handleRemoveCondition={handleRemoveCondition}
+            handleUpdateCondition={handleUpdateCondition}
+            handleToggleConditionLogicalOperator={handleToggleConditionLogicalOperator}
+            handleAddSubVariableCondition={handleAddSubVariableCondition}
+            handleRemoveSubVariableCondition={handleRemoveSubVariableCondition}
+            handleUpdateSubVariableCondition={handleUpdateSubVariableCondition}
+            handleToggleSubVariableConditionLogicalOperator={handleToggleSubVariableConditionLogicalOperator}
+            availableNodes={loopChildrenNodes}
+            availableVars={childrenNodeVars}
+            conditions={inputs.break_conditions || []}
+            logicalOperator={inputs.logical_operator!}
+          />
+        </Field>
+        <Split className='mt-2' />
+        <div className='mt-2'>
+          <Field
+            title={<div className='pl-3'>{t(`${i18nPrefix}.loopMaxCount`)}</div>}
+          >
+            <div className='px-3 py-2'>
+              <InputNumberWithSlider
+                min={1}
+                max={LOOP_NODE_MAX_COUNT}
+                value={inputs.loop_count}
+                onChange={(val) => {
+                  const roundedVal = Math.round(val)
+                  handleUpdateLoopCount(Number.isNaN(roundedVal) ? 1 : roundedVal)
+                }}
+              />
+            </div>
+          </Field>
+        </div>
+      </div>
+      {/* Error handling for the Loop node is currently not considered. */}
+      {/* <div className='px-4 py-2'>
+        <Field title={t(`${i18nPrefix}.errorResponseMethod`)} >
+          <Select items={responseMethod} defaultValue={inputs.error_handle_mode} onSelect={changeErrorResponseMode} allowSearch={false}>
+          </Select>
+        </Field>
+      </div> */}
+      {isShowSingleRun && (
+        <BeforeRunForm
+          nodeName={inputs.title}
+          onHide={hideSingleRun}
+          forms={[]}
+          runningStatus={runningStatus}
+          onRun={handleRun}
+          onStop={handleStop}
+          {...logsParams}
+          result={
+            <ResultPanel {...runResult} showSteps={false} nodeInfo={nodeInfo} {...logsParams} />
+          }
+        />
+      )}
+    </div>
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/loop/types.ts b/app/components/workflow/nodes/loop/types.ts
new file mode 100644
index 0000000..80c7d51
--- /dev/null
+++ b/app/components/workflow/nodes/loop/types.ts
@@ -0,0 +1,94 @@
+import type { VarType as NumberVarType } from '../tool/types'
+import type {
+  BlockEnum,
+  CommonNodeType,
+  ErrorHandleMode,
+  ValueSelector,
+  ValueType,
+  Var,
+  VarType,
+} from '@/app/components/workflow/types'
+
+export enum LogicalOperator {
+  and = 'and',
+  or = 'or',
+}
+
+export enum ComparisonOperator {
+  contains = 'contains',
+  notContains = 'not contains',
+  startWith = 'start with',
+  endWith = 'end with',
+  is = 'is',
+  isNot = 'is not',
+  empty = 'empty',
+  notEmpty = 'not empty',
+  equal = '=',
+  notEqual = '鈮�',
+  largerThan = '>',
+  lessThan = '<',
+  largerThanOrEqual = '鈮�',
+  lessThanOrEqual = '鈮�',
+  isNull = 'is null',
+  isNotNull = 'is not null',
+  in = 'in',
+  notIn = 'not in',
+  allOf = 'all of',
+  exists = 'exists',
+  notExists = 'not exists',
+}
+
+export type Condition = {
+  id: string
+  varType: VarType
+  variable_selector?: ValueSelector
+  key?: string // sub variable key
+  comparison_operator?: ComparisonOperator
+  value: string | string[]
+  numberVarType?: NumberVarType
+  sub_variable_condition?: CaseItem
+}
+
+export type CaseItem = {
+  logical_operator: LogicalOperator
+  conditions: Condition[]
+}
+
+export type HandleAddCondition = (valueSelector: ValueSelector, varItem: Var) => void
+export type HandleRemoveCondition = (conditionId: string) => void
+export type HandleUpdateCondition = (conditionId: string, newCondition: Condition) => void
+export type HandleUpdateConditionLogicalOperator = (value: LogicalOperator) => void
+
+export type HandleToggleConditionLogicalOperator = () => void
+
+export type HandleAddSubVariableCondition = (conditionId: string, key?: string) => void
+export type handleRemoveSubVariableCondition = (conditionId: string, subConditionId: string) => void
+export type HandleUpdateSubVariableCondition = (conditionId: string, subConditionId: string, newSubCondition: Condition) => void
+export type HandleToggleSubVariableConditionLogicalOperator = (conditionId: string) => void
+
+export type LoopVariable = {
+  id: string
+  label: string
+  var_type: VarType
+  value_type: ValueType
+  value: any
+}
+export type LoopNodeType = CommonNodeType & {
+  startNodeType?: BlockEnum
+  start_node_id: string
+  loop_id?: string
+  logical_operator?: LogicalOperator
+  break_conditions?: Condition[]
+  loop_count: number
+  error_handle_mode: ErrorHandleMode // how to handle error in the iteration
+  loop_variables?: LoopVariable[]
+}
+
+export type HandleUpdateLoopVariable = (id: string, updateData: Partial<LoopVariable>) => void
+export type HandleRemoveLoopVariable = (id: string) => void
+
+export type LoopVariablesComponentShape = {
+  nodeId: string
+  handleRemoveLoopVariable: HandleRemoveLoopVariable
+  handleUpdateLoopVariable: HandleUpdateLoopVariable
+}
diff --git a/app/components/workflow/nodes/loop/use-config.ts b/app/components/workflow/nodes/loop/use-config.ts
new file mode 100644
index 0000000..fbd350c
--- /dev/null
+++ b/app/components/workflow/nodes/loop/use-config.ts
@@ -0,0 +1,379 @@
+import {
+  useCallback,
+  useRef,
+} from 'react'
+import produce from 'immer'
+import { useBoolean } from 'ahooks'
+import { v4 as uuid4 } from 'uuid'
+import {
+  useIsChatMode,
+  useIsNodeInLoop,
+  useNodesReadOnly,
+  useWorkflow,
+} from '../../hooks'
+import { ValueType, VarType } from '../../types'
+import type { ErrorHandleMode, ValueSelector, Var } from '../../types'
+import useNodeCrud from '../_base/hooks/use-node-crud'
+import { getNodeInfoById, getNodeUsedVarPassToServerKey, getNodeUsedVars, isSystemVar, toNodeOutputVars } from '../_base/components/variable/utils'
+import useOneStepRun from '../_base/hooks/use-one-step-run'
+import { getOperators } from './utils'
+import { LogicalOperator } from './types'
+import type { HandleAddCondition, HandleAddSubVariableCondition, HandleRemoveCondition, HandleToggleConditionLogicalOperator, HandleToggleSubVariableConditionLogicalOperator, HandleUpdateCondition, HandleUpdateSubVariableCondition, LoopNodeType } from './types'
+import useIsVarFileAttribute from './use-is-var-file-attribute'
+import { useStore } from '@/app/components/workflow/store'
+
+const DELIMITER = '@@@@@'
+const useConfig = (id: string, payload: LoopNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const { isNodeInLoop } = useIsNodeInLoop(id)
+  const isChatMode = useIsChatMode()
+  const conversationVariables = useStore(s => s.conversationVariables)
+
+  const { inputs, setInputs } = useNodeCrud<LoopNodeType>(id, payload)
+  const inputsRef = useRef(inputs)
+  const handleInputsChange = useCallback((newInputs: LoopNodeType) => {
+    inputsRef.current = newInputs
+    setInputs(newInputs)
+  }, [setInputs])
+
+  const filterInputVar = useCallback((varPayload: Var) => {
+    return [VarType.array, VarType.arrayString, VarType.arrayNumber, VarType.arrayObject, VarType.arrayFile].includes(varPayload.type)
+  }, [])
+
+  // output
+  const { getLoopNodeChildren, getBeforeNodesInSameBranch } = useWorkflow()
+  const beforeNodes = getBeforeNodesInSameBranch(id)
+  const loopChildrenNodes = [{ id, data: payload } as any, ...getLoopNodeChildren(id)]
+  const canChooseVarNodes = [...beforeNodes, ...loopChildrenNodes]
+  const childrenNodeVars = toNodeOutputVars(loopChildrenNodes, isChatMode, undefined, [], conversationVariables)
+
+  // single run
+  const loopInputKey = `${id}.input_selector`
+  const {
+    isShowSingleRun,
+    showSingleRun,
+    hideSingleRun,
+    toVarInputs,
+    runningStatus,
+    handleRun: doHandleRun,
+    handleStop,
+    runInputData,
+    setRunInputData,
+    runResult,
+    loopRunResult,
+  } = useOneStepRun<LoopNodeType>({
+    id,
+    data: inputs,
+    loopInputKey,
+    defaultRunInputData: {
+      [loopInputKey]: [''],
+    },
+  })
+
+  const [isShowLoopDetail, {
+    setTrue: doShowLoopDetail,
+    setFalse: doHideLoopDetail,
+  }] = useBoolean(false)
+
+  const hideLoopDetail = useCallback(() => {
+    hideSingleRun()
+    doHideLoopDetail()
+  }, [doHideLoopDetail, hideSingleRun])
+
+  const showLoopDetail = useCallback(() => {
+    doShowLoopDetail()
+  }, [doShowLoopDetail])
+
+  const backToSingleRun = useCallback(() => {
+    hideLoopDetail()
+    showSingleRun()
+  }, [hideLoopDetail, showSingleRun])
+
+  const {
+    getIsVarFileAttribute,
+  } = useIsVarFileAttribute({
+    nodeId: id,
+  })
+
+  const { usedOutVars, allVarObject } = (() => {
+    const vars: ValueSelector[] = []
+    const varObjs: Record<string, boolean> = {}
+    const allVarObject: Record<string, {
+      inSingleRunPassedKey: string
+    }> = {}
+    loopChildrenNodes.forEach((node) => {
+      const nodeVars = getNodeUsedVars(node).filter(item => item && item.length > 0)
+      nodeVars.forEach((varSelector) => {
+        if (varSelector[0] === id) { // skip Loop node itself variable: item, index
+          return
+        }
+        const isInLoop = isNodeInLoop(varSelector[0])
+        if (isInLoop) // not pass loop inner variable
+          return
+
+        const varSectorStr = varSelector.join('.')
+        if (!varObjs[varSectorStr]) {
+          varObjs[varSectorStr] = true
+          vars.push(varSelector)
+        }
+        let passToServerKeys = getNodeUsedVarPassToServerKey(node, varSelector)
+        if (typeof passToServerKeys === 'string')
+          passToServerKeys = [passToServerKeys]
+
+        passToServerKeys.forEach((key: string, index: number) => {
+          allVarObject[[varSectorStr, node.id, index].join(DELIMITER)] = {
+            inSingleRunPassedKey: key,
+          }
+        })
+      })
+    })
+    const res = toVarInputs(vars.map((item) => {
+      const varInfo = getNodeInfoById(canChooseVarNodes, item[0])
+      return {
+        label: {
+          nodeType: varInfo?.data.type,
+          nodeName: varInfo?.data.title || canChooseVarNodes[0]?.data.title, // default start node title
+          variable: isSystemVar(item) ? item.join('.') : item[item.length - 1],
+        },
+        variable: `${item.join('.')}`,
+        value_selector: item,
+      }
+    }))
+    return {
+      usedOutVars: res,
+      allVarObject,
+    }
+  })()
+
+  const handleRun = useCallback((data: Record<string, any>) => {
+    const formattedData: Record<string, any> = {}
+    Object.keys(allVarObject).forEach((key) => {
+      const [varSectorStr, nodeId] = key.split(DELIMITER)
+      formattedData[`${nodeId}.${allVarObject[key].inSingleRunPassedKey}`] = data[varSectorStr]
+    })
+    formattedData[loopInputKey] = data[loopInputKey]
+    doHandleRun(formattedData)
+  }, [allVarObject, doHandleRun, loopInputKey])
+
+  const inputVarValues = (() => {
+    const vars: Record<string, any> = {}
+    Object.keys(runInputData)
+      .filter(key => ![loopInputKey].includes(key))
+      .forEach((key) => {
+        vars[key] = runInputData[key]
+      })
+    return vars
+  })()
+
+  const setInputVarValues = useCallback((newPayload: Record<string, any>) => {
+    const newVars = {
+      ...newPayload,
+      [loopInputKey]: runInputData[loopInputKey],
+    }
+    setRunInputData(newVars)
+  }, [loopInputKey, runInputData, setRunInputData])
+
+  const loop = runInputData[loopInputKey]
+  const setLoop = useCallback((newLoop: string[]) => {
+    setRunInputData({
+      ...runInputData,
+      [loopInputKey]: newLoop,
+    })
+  }, [loopInputKey, runInputData, setRunInputData])
+
+  const changeErrorResponseMode = useCallback((item: { value: unknown }) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.error_handle_mode = item.value as ErrorHandleMode
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleAddCondition = useCallback<HandleAddCondition>((valueSelector, varItem) => {
+    const newInputs = produce(inputs, (draft) => {
+      if (!draft.break_conditions)
+        draft.break_conditions = []
+
+      draft.break_conditions?.push({
+        id: uuid4(),
+        varType: varItem.type,
+        variable_selector: valueSelector,
+        comparison_operator: getOperators(varItem.type, getIsVarFileAttribute(valueSelector) ? { key: valueSelector.slice(-1)[0] } : undefined)[0],
+        value: '',
+      })
+    })
+    setInputs(newInputs)
+  }, [getIsVarFileAttribute, inputs, setInputs])
+
+  const handleRemoveCondition = useCallback<HandleRemoveCondition>((conditionId) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.break_conditions = draft.break_conditions?.filter(item => item.id !== conditionId)
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleUpdateCondition = useCallback<HandleUpdateCondition>((conditionId, newCondition) => {
+    const newInputs = produce(inputs, (draft) => {
+      const targetCondition = draft.break_conditions?.find(item => item.id === conditionId)
+      if (targetCondition)
+        Object.assign(targetCondition, newCondition)
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleToggleConditionLogicalOperator = useCallback<HandleToggleConditionLogicalOperator>(() => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.logical_operator = draft.logical_operator === LogicalOperator.and ? LogicalOperator.or : LogicalOperator.and
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleAddSubVariableCondition = useCallback<HandleAddSubVariableCondition>((conditionId: string, key?: string) => {
+    const newInputs = produce(inputs, (draft) => {
+      const condition = draft.break_conditions?.find(item => item.id === conditionId)
+      if (!condition)
+        return
+      if (!condition?.sub_variable_condition) {
+        condition.sub_variable_condition = {
+          logical_operator: LogicalOperator.and,
+          conditions: [],
+        }
+      }
+      const subVarCondition = condition.sub_variable_condition
+      if (subVarCondition) {
+        if (!subVarCondition.conditions)
+          subVarCondition.conditions = []
+
+        const svcComparisonOperators = getOperators(VarType.string, { key: key || '' })
+
+        subVarCondition.conditions.push({
+          id: uuid4(),
+          key: key || '',
+          varType: VarType.string,
+          comparison_operator: (svcComparisonOperators && svcComparisonOperators.length) ? svcComparisonOperators[0] : undefined,
+          value: '',
+        })
+      }
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleRemoveSubVariableCondition = useCallback((conditionId: string, subConditionId: string) => {
+    const newInputs = produce(inputs, (draft) => {
+      const condition = draft.break_conditions?.find(item => item.id === conditionId)
+      if (!condition)
+        return
+      if (!condition?.sub_variable_condition)
+        return
+      const subVarCondition = condition.sub_variable_condition
+      if (subVarCondition)
+        subVarCondition.conditions = subVarCondition.conditions.filter(item => item.id !== subConditionId)
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleUpdateSubVariableCondition = useCallback<HandleUpdateSubVariableCondition>((conditionId, subConditionId, newSubCondition) => {
+    const newInputs = produce(inputs, (draft) => {
+      const targetCondition = draft.break_conditions?.find(item => item.id === conditionId)
+      if (targetCondition && targetCondition.sub_variable_condition) {
+        const targetSubCondition = targetCondition.sub_variable_condition.conditions.find(item => item.id === subConditionId)
+        if (targetSubCondition)
+          Object.assign(targetSubCondition, newSubCondition)
+      }
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleToggleSubVariableConditionLogicalOperator = useCallback<HandleToggleSubVariableConditionLogicalOperator>((conditionId) => {
+    const newInputs = produce(inputs, (draft) => {
+      const targetCondition = draft.break_conditions?.find(item => item.id === conditionId)
+      if (targetCondition && targetCondition.sub_variable_condition)
+        targetCondition.sub_variable_condition.logical_operator = targetCondition.sub_variable_condition.logical_operator === LogicalOperator.and ? LogicalOperator.or : LogicalOperator.and
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleUpdateLoopCount = useCallback((value: number) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.loop_count = value
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleAddLoopVariable = useCallback(() => {
+    const newInputs = produce(inputsRef.current, (draft) => {
+      if (!draft.loop_variables)
+        draft.loop_variables = []
+
+      draft.loop_variables.push({
+        id: uuid4(),
+        label: '',
+        var_type: VarType.string,
+        value_type: ValueType.constant,
+        value: '',
+      })
+    })
+    handleInputsChange(newInputs)
+  }, [handleInputsChange])
+
+  const handleRemoveLoopVariable = useCallback((id: string) => {
+    const newInputs = produce(inputsRef.current, (draft) => {
+      draft.loop_variables = draft.loop_variables?.filter(item => item.id !== id)
+    })
+    handleInputsChange(newInputs)
+  }, [handleInputsChange])
+
+  const handleUpdateLoopVariable = useCallback((id: string, updateData: any) => {
+    const loopVariables = inputsRef.current.loop_variables || []
+    const index = loopVariables.findIndex(item => item.id === id)
+    const newInputs = produce(inputsRef.current, (draft) => {
+      if (index > -1) {
+        draft.loop_variables![index] = {
+          ...draft.loop_variables![index],
+          ...updateData,
+        }
+      }
+    })
+    handleInputsChange(newInputs)
+  }, [handleInputsChange])
+
+  return {
+    readOnly,
+    inputs,
+    filterInputVar,
+    childrenNodeVars,
+    loopChildrenNodes,
+    isShowSingleRun,
+    showSingleRun,
+    hideSingleRun,
+    isShowLoopDetail,
+    showLoopDetail,
+    hideLoopDetail,
+    backToSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runResult,
+    inputVarValues,
+    setInputVarValues,
+    usedOutVars,
+    loop,
+    setLoop,
+    loopInputKey,
+    loopRunResult,
+    handleAddCondition,
+    handleRemoveCondition,
+    handleUpdateCondition,
+    handleToggleConditionLogicalOperator,
+    handleAddSubVariableCondition,
+    handleUpdateSubVariableCondition,
+    handleRemoveSubVariableCondition,
+    handleToggleSubVariableConditionLogicalOperator,
+    handleUpdateLoopCount,
+    changeErrorResponseMode,
+    handleAddLoopVariable,
+    handleRemoveLoopVariable,
+    handleUpdateLoopVariable,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/loop/use-interactions.ts b/app/components/workflow/nodes/loop/use-interactions.ts
new file mode 100644
index 0000000..83a3210
--- /dev/null
+++ b/app/components/workflow/nodes/loop/use-interactions.ts
@@ -0,0 +1,149 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import { useTranslation } from 'react-i18next'
+import { useStoreApi } from 'reactflow'
+import type {
+  BlockEnum,
+  Node,
+} from '../../types'
+import {
+  generateNewNode,
+  getNodeCustomTypeByNodeDataType,
+} from '../../utils'
+import {
+  LOOP_PADDING,
+  NODES_INITIAL_DATA,
+} from '../../constants'
+import { CUSTOM_LOOP_START_NODE } from '../loop-start/constants'
+
+export const useNodeLoopInteractions = () => {
+  const { t } = useTranslation()
+  const store = useStoreApi()
+
+  const handleNodeLoopRerender = useCallback((nodeId: string) => {
+    const {
+      getNodes,
+      setNodes,
+    } = store.getState()
+
+    const nodes = getNodes()
+    const currentNode = nodes.find(n => n.id === nodeId)!
+    const childrenNodes = nodes.filter(n => n.parentId === nodeId)
+    let rightNode: Node
+    let bottomNode: Node
+
+    childrenNodes.forEach((n) => {
+      if (rightNode) {
+        if (n.position.x + n.width! > rightNode.position.x + rightNode.width!)
+          rightNode = n
+      }
+      else {
+        rightNode = n
+      }
+      if (bottomNode) {
+        if (n.position.y + n.height! > bottomNode.position.y + bottomNode.height!)
+          bottomNode = n
+      }
+      else {
+        bottomNode = n
+      }
+    })
+
+    const widthShouldExtend = rightNode! && currentNode.width! < rightNode.position.x + rightNode.width!
+    const heightShouldExtend = bottomNode! && currentNode.height! < bottomNode.position.y + bottomNode.height!
+
+    if (widthShouldExtend || heightShouldExtend) {
+      const newNodes = produce(nodes, (draft) => {
+        draft.forEach((n) => {
+          if (n.id === nodeId) {
+            if (widthShouldExtend) {
+              n.data.width = rightNode.position.x + rightNode.width! + LOOP_PADDING.right
+              n.width = rightNode.position.x + rightNode.width! + LOOP_PADDING.right
+            }
+            if (heightShouldExtend) {
+              n.data.height = bottomNode.position.y + bottomNode.height! + LOOP_PADDING.bottom
+              n.height = bottomNode.position.y + bottomNode.height! + LOOP_PADDING.bottom
+            }
+          }
+        })
+      })
+
+      setNodes(newNodes)
+    }
+  }, [store])
+
+  const handleNodeLoopChildDrag = useCallback((node: Node) => {
+    const { getNodes } = store.getState()
+    const nodes = getNodes()
+
+    const restrictPosition: { x?: number; y?: number } = { x: undefined, y: undefined }
+
+    if (node.data.isInLoop) {
+      const parentNode = nodes.find(n => n.id === node.parentId)
+
+      if (parentNode) {
+        if (node.position.y < LOOP_PADDING.top)
+          restrictPosition.y = LOOP_PADDING.top
+        if (node.position.x < LOOP_PADDING.left)
+          restrictPosition.x = LOOP_PADDING.left
+        if (node.position.x + node.width! > parentNode!.width! - LOOP_PADDING.right)
+          restrictPosition.x = parentNode!.width! - LOOP_PADDING.right - node.width!
+        if (node.position.y + node.height! > parentNode!.height! - LOOP_PADDING.bottom)
+          restrictPosition.y = parentNode!.height! - LOOP_PADDING.bottom - node.height!
+      }
+    }
+
+    return {
+      restrictPosition,
+    }
+  }, [store])
+
+  const handleNodeLoopChildSizeChange = useCallback((nodeId: string) => {
+    const { getNodes } = store.getState()
+    const nodes = getNodes()
+    const currentNode = nodes.find(n => n.id === nodeId)!
+    const parentId = currentNode.parentId
+
+    if (parentId)
+      handleNodeLoopRerender(parentId)
+  }, [store, handleNodeLoopRerender])
+
+  const handleNodeLoopChildrenCopy = useCallback((nodeId: string, newNodeId: string) => {
+    const { getNodes } = store.getState()
+    const nodes = getNodes()
+    const childrenNodes = nodes.filter(n => n.parentId === nodeId && n.type !== CUSTOM_LOOP_START_NODE)
+
+    return childrenNodes.map((child, index) => {
+      const childNodeType = child.data.type as BlockEnum
+      const nodesWithSameType = nodes.filter(node => node.data.type === childNodeType)
+      const { newNode } = generateNewNode({
+        type: getNodeCustomTypeByNodeDataType(childNodeType),
+        data: {
+          ...NODES_INITIAL_DATA[childNodeType],
+          ...child.data,
+          selected: false,
+          _isBundled: false,
+          _connectedSourceHandleIds: [],
+          _connectedTargetHandleIds: [],
+          title: nodesWithSameType.length > 0 ? `${t(`workflow.blocks.${childNodeType}`)} ${nodesWithSameType.length + 1}` : t(`workflow.blocks.${childNodeType}`),
+          loop_id: newNodeId,
+
+        },
+        position: child.position,
+        positionAbsolute: child.positionAbsolute,
+        parentId: newNodeId,
+        extent: child.extent,
+        zIndex: child.zIndex,
+      })
+      newNode.id = `${newNodeId}${newNode.id + index}`
+      return newNode
+    })
+  }, [store, t])
+
+  return {
+    handleNodeLoopRerender,
+    handleNodeLoopChildDrag,
+    handleNodeLoopChildSizeChange,
+    handleNodeLoopChildrenCopy,
+  }
+}
diff --git a/app/components/workflow/nodes/loop/use-is-var-file-attribute.ts b/app/components/workflow/nodes/loop/use-is-var-file-attribute.ts
new file mode 100644
index 0000000..b354d31
--- /dev/null
+++ b/app/components/workflow/nodes/loop/use-is-var-file-attribute.ts
@@ -0,0 +1,35 @@
+import { useMemo } from 'react'
+import { useIsChatMode, useWorkflow, useWorkflowVariables } from '../../hooks'
+import type { ValueSelector } from '../../types'
+import { VarType } from '../../types'
+
+type Params = {
+  nodeId: string
+}
+const useIsVarFileAttribute = ({
+  nodeId,
+}: Params) => {
+  const isChatMode = useIsChatMode()
+  const { getBeforeNodesInSameBranch } = useWorkflow()
+  const availableNodes = useMemo(() => {
+    return getBeforeNodesInSameBranch(nodeId)
+  }, [getBeforeNodesInSameBranch, nodeId])
+  const { getCurrentVariableType } = useWorkflowVariables()
+  const getIsVarFileAttribute = (variable: ValueSelector) => {
+    if (variable.length !== 3)
+      return false
+    const parentVariable = variable.slice(0, 2)
+    const varType = getCurrentVariableType({
+      valueSelector: parentVariable,
+      availableNodes,
+      isChatMode,
+      isConstant: false,
+    })
+    return varType === VarType.file
+  }
+  return {
+    getIsVarFileAttribute,
+  }
+}
+
+export default useIsVarFileAttribute
diff --git a/app/components/workflow/nodes/loop/utils.ts b/app/components/workflow/nodes/loop/utils.ts
new file mode 100644
index 0000000..2bc9d89
--- /dev/null
+++ b/app/components/workflow/nodes/loop/utils.ts
@@ -0,0 +1,179 @@
+import { ComparisonOperator } from './types'
+import { VarType } from '@/app/components/workflow/types'
+import type { Branch } from '@/app/components/workflow/types'
+
+export const isEmptyRelatedOperator = (operator: ComparisonOperator) => {
+  return [ComparisonOperator.empty, ComparisonOperator.notEmpty, ComparisonOperator.isNull, ComparisonOperator.isNotNull, ComparisonOperator.exists, ComparisonOperator.notExists].includes(operator)
+}
+
+const notTranslateKey = [
+  ComparisonOperator.equal, ComparisonOperator.notEqual,
+  ComparisonOperator.largerThan, ComparisonOperator.largerThanOrEqual,
+  ComparisonOperator.lessThan, ComparisonOperator.lessThanOrEqual,
+]
+
+export const isComparisonOperatorNeedTranslate = (operator?: ComparisonOperator) => {
+  if (!operator)
+    return false
+  return !notTranslateKey.includes(operator)
+}
+
+export const getOperators = (type?: VarType, file?: { key: string }) => {
+  const isFile = !!file
+  if (isFile) {
+    const { key } = file
+
+    switch (key) {
+      case 'name':
+        return [
+          ComparisonOperator.contains,
+          ComparisonOperator.notContains,
+          ComparisonOperator.startWith,
+          ComparisonOperator.endWith,
+          ComparisonOperator.is,
+          ComparisonOperator.isNot,
+          ComparisonOperator.empty,
+          ComparisonOperator.notEmpty,
+        ]
+      case 'type':
+        return [
+          ComparisonOperator.in,
+          ComparisonOperator.notIn,
+        ]
+      case 'size':
+        return [
+          ComparisonOperator.largerThan,
+          ComparisonOperator.largerThanOrEqual,
+          ComparisonOperator.lessThan,
+          ComparisonOperator.lessThanOrEqual,
+        ]
+      case 'extension':
+        return [
+          ComparisonOperator.is,
+          ComparisonOperator.isNot,
+          ComparisonOperator.contains,
+          ComparisonOperator.notContains,
+        ]
+      case 'mime_type':
+        return [
+          ComparisonOperator.contains,
+          ComparisonOperator.notContains,
+          ComparisonOperator.startWith,
+          ComparisonOperator.endWith,
+          ComparisonOperator.is,
+          ComparisonOperator.isNot,
+          ComparisonOperator.empty,
+          ComparisonOperator.notEmpty,
+        ]
+      case 'transfer_method':
+        return [
+          ComparisonOperator.in,
+          ComparisonOperator.notIn,
+        ]
+      case 'url':
+        return [
+          ComparisonOperator.contains,
+          ComparisonOperator.notContains,
+          ComparisonOperator.startWith,
+          ComparisonOperator.endWith,
+          ComparisonOperator.is,
+          ComparisonOperator.isNot,
+          ComparisonOperator.empty,
+          ComparisonOperator.notEmpty,
+        ]
+    }
+    return []
+  }
+  switch (type) {
+    case VarType.string:
+      return [
+        ComparisonOperator.contains,
+        ComparisonOperator.notContains,
+        ComparisonOperator.startWith,
+        ComparisonOperator.endWith,
+        ComparisonOperator.is,
+        ComparisonOperator.isNot,
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+    case VarType.number:
+      return [
+        ComparisonOperator.equal,
+        ComparisonOperator.notEqual,
+        ComparisonOperator.largerThan,
+        ComparisonOperator.lessThan,
+        ComparisonOperator.largerThanOrEqual,
+        ComparisonOperator.lessThanOrEqual,
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+    case VarType.object:
+      return [
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+    case VarType.file:
+      return [
+        ComparisonOperator.exists,
+        ComparisonOperator.notExists,
+      ]
+    case VarType.arrayString:
+    case VarType.arrayNumber:
+      return [
+        ComparisonOperator.contains,
+        ComparisonOperator.notContains,
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+    case VarType.array:
+    case VarType.arrayObject:
+      return [
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+    case VarType.arrayFile:
+      return [
+        ComparisonOperator.contains,
+        ComparisonOperator.notContains,
+        ComparisonOperator.allOf,
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+    default:
+      return [
+        ComparisonOperator.is,
+        ComparisonOperator.isNot,
+        ComparisonOperator.empty,
+        ComparisonOperator.notEmpty,
+      ]
+  }
+}
+
+export const comparisonOperatorNotRequireValue = (operator?: ComparisonOperator) => {
+  if (!operator)
+    return false
+
+  return [ComparisonOperator.empty, ComparisonOperator.notEmpty, ComparisonOperator.isNull, ComparisonOperator.isNotNull, ComparisonOperator.exists, ComparisonOperator.notExists].includes(operator)
+}
+
+export const branchNameCorrect = (branches: Branch[]) => {
+  const branchLength = branches.length
+  if (branchLength < 2)
+    throw new Error('if-else node branch number must than 2')
+
+  if (branchLength === 2) {
+    return branches.map((branch) => {
+      return {
+        ...branch,
+        name: branch.id === 'false' ? 'ELSE' : 'IF',
+      }
+    })
+  }
+
+  return branches.map((branch, index) => {
+    return {
+      ...branch,
+      name: branch.id === 'false' ? 'ELSE' : `CASE ${index + 1}`,
+    }
+  })
+}
diff --git a/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/import-from-tool.tsx b/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/import-from-tool.tsx
new file mode 100644
index 0000000..bfb664a
--- /dev/null
+++ b/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/import-from-tool.tsx
@@ -0,0 +1,93 @@
+'use client'
+import type { FC } from 'react'
+import {
+  memo,
+  useCallback,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import BlockSelector from '../../../../block-selector'
+import type { Param, ParamType } from '../../types'
+import cn from '@/utils/classnames'
+import { useStore } from '@/app/components/workflow/store'
+import type { ToolDefaultValue } from '@/app/components/workflow/block-selector/types'
+import type { ToolParameter } from '@/app/components/tools/types'
+import { CollectionType } from '@/app/components/tools/types'
+import type { BlockEnum } from '@/app/components/workflow/types'
+import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { canFindTool } from '@/utils'
+
+const i18nPrefix = 'workflow.nodes.parameterExtractor'
+
+type Props = {
+  onImport: (params: Param[]) => void
+}
+
+function toParmExactParams(toolParams: ToolParameter[], lan: string): Param[] {
+  return toolParams.map((item) => {
+    return {
+      name: item.name,
+      type: item.type as ParamType,
+      required: item.required,
+      description: item.llm_description,
+      options: item.options?.map(option => option.label[lan] || option.label.en_US) || [],
+    }
+  })
+}
+const ImportFromTool: FC<Props> = ({
+  onImport,
+}) => {
+  const { t } = useTranslation()
+  const language = useLanguage()
+
+  const buildInTools = useStore(s => s.buildInTools)
+  const customTools = useStore(s => s.customTools)
+  const workflowTools = useStore(s => s.workflowTools)
+
+  const handleSelectTool = useCallback((_type: BlockEnum, toolInfo?: ToolDefaultValue) => {
+    const { provider_id, provider_type, tool_name } = toolInfo!
+    const currentTools = (() => {
+      switch (provider_type) {
+        case CollectionType.builtIn:
+          return buildInTools
+        case CollectionType.custom:
+          return customTools
+        case CollectionType.workflow:
+          return workflowTools
+        default:
+          return []
+      }
+    })()
+    const currCollection = currentTools.find(item => canFindTool(item.id, provider_id))
+    const currTool = currCollection?.tools.find(tool => tool.name === tool_name)
+    const toExactParams = (currTool?.parameters || []).filter(item => item.form === 'llm')
+    const formattedParams = toParmExactParams(toExactParams, language)
+    onImport(formattedParams)
+  }, [buildInTools, customTools, language, onImport, workflowTools])
+
+  const renderTrigger = useCallback((open: boolean) => {
+    return (
+      <div>
+        <div className={cn(
+          'flex h-6 cursor-pointer items-center rounded-md px-2 text-xs font-medium text-text-tertiary hover:bg-state-base-hover',
+          open && 'bg-state-base-hover',
+        )}>
+          {t(`${i18nPrefix}.importFromTool`)}
+        </div>
+      </div>
+    )
+  }, [t])
+
+  return (
+    <BlockSelector
+      placement='bottom-end'
+      offset={{
+        mainAxis: 4,
+        crossAxis: 52,
+      }}
+      trigger={renderTrigger}
+      onSelect={handleSelectTool}
+      noBlocks
+    />
+  )
+}
+export default memo(ImportFromTool)
diff --git a/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/item.tsx b/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/item.tsx
new file mode 100644
index 0000000..dae4322
--- /dev/null
+++ b/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/item.tsx
@@ -0,0 +1,59 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiDeleteBinLine,
+  RiEditLine,
+} from '@remixicon/react'
+import type { Param } from '../../types'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+const i18nPrefix = 'workflow.nodes.parameterExtractor'
+
+type Props = {
+  payload: Param
+  onEdit: () => void
+  onDelete: () => void
+}
+
+const Item: FC<Props> = ({
+  payload,
+  onEdit,
+  onDelete,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='group relative rounded-lg bg-components-input-bg-normal px-2.5 py-2 hover:shadow-xs'>
+      <div className='flex justify-between'>
+        <div className='flex items-center'>
+          <Variable02 className='h-3.5 w-3.5 text-text-accent-secondary' />
+          <div className='ml-1 text-[13px] font-medium text-text-primary'>{payload.name}</div>
+          <div className='ml-2 text-xs font-normal capitalize text-text-tertiary'>{payload.type}</div>
+        </div>
+        {payload.required && (
+          <div className='text-xs font-normal uppercase leading-4 text-text-tertiary'>{t(`${i18nPrefix}.addExtractParameterContent.required`)}</div>
+        )}
+      </div>
+      <div className='mt-0.5 text-xs font-normal leading-[18px] text-text-tertiary'>{payload.description}</div>
+      <div
+        className='absolute right-0 top-0 hidden h-full w-[119px] items-center justify-end space-x-1 rounded-lg bg-gradient-to-l from-components-panel-on-panel-item-bg to-background-gradient-mask-transparent pr-1 group-hover:flex'
+      >
+        <div
+          className='cursor-pointer rounded-md p-1 hover:bg-state-base-hover'
+          onClick={onEdit}
+        >
+          <RiEditLine className='h-4 w-4 text-text-tertiary' />
+        </div>
+
+        <div
+          className='group shrink-0 cursor-pointer rounded-md p-1 hover:!bg-state-destructive-hover'
+          onClick={onDelete}
+        >
+          <RiDeleteBinLine className='h-4 w-4 text-text-tertiary group-hover:text-text-destructive' />
+        </div>
+      </div>
+    </div>
+  )
+}
+export default React.memo(Item)
diff --git a/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/list.tsx b/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/list.tsx
new file mode 100644
index 0000000..eacb78e
--- /dev/null
+++ b/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/list.tsx
@@ -0,0 +1,85 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useBoolean } from 'ahooks'
+import type { Param } from '../../types'
+import ListNoDataPlaceholder from '../../../_base/components/list-no-data-placeholder'
+import Item from './item'
+import EditParam from './update'
+import type { MoreInfo } from '@/app/components/workflow/types'
+
+const i18nPrefix = 'workflow.nodes.parameterExtractor'
+
+type Props = {
+  readonly: boolean
+  list: Param[]
+  onChange: (list: Param[], moreInfo?: MoreInfo) => void
+}
+
+const List: FC<Props> = ({
+  list,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const [isShowEditModal, {
+    setTrue: showEditModal,
+    setFalse: hideEditModal,
+  }] = useBoolean(false)
+
+  const handleItemChange = useCallback((index: number) => {
+    return (payload: Param, moreInfo?: MoreInfo) => {
+      const newList = list.map((item, i) => {
+        if (i === index)
+          return payload
+
+        return item
+      })
+      onChange(newList, moreInfo)
+      hideEditModal()
+    }
+  }, [hideEditModal, list, onChange])
+
+  const [currEditItemIndex, setCurrEditItemIndex] = useState<number>(-1)
+
+  const handleItemEdit = useCallback((index: number) => {
+    return () => {
+      setCurrEditItemIndex(index)
+      showEditModal()
+    }
+  }, [showEditModal])
+
+  const handleItemDelete = useCallback((index: number) => {
+    return () => {
+      const newList = list.filter((_, i) => i !== index)
+      onChange(newList)
+    }
+  }, [list, onChange])
+
+  if (list.length === 0) {
+    return (
+      <ListNoDataPlaceholder >{t(`${i18nPrefix}.extractParametersNotSet`)}</ListNoDataPlaceholder>
+    )
+  }
+  return (
+    <div className='space-y-1'>
+      {list.map((item, index) => (
+        <Item
+          key={index}
+          payload={item}
+          onDelete={handleItemDelete(index)}
+          onEdit={handleItemEdit(index)}
+        />
+      ))}
+      {isShowEditModal && (
+        <EditParam
+          type='edit'
+          payload={list[currEditItemIndex]}
+          onSave={handleItemChange(currEditItemIndex)}
+          onCancel={hideEditModal}
+        />
+      )}
+    </div>
+  )
+}
+export default React.memo(List)
diff --git a/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/update.tsx b/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/update.tsx
new file mode 100644
index 0000000..46b3ac3
--- /dev/null
+++ b/app/components/workflow/nodes/parameter-extractor/components/extract-parameter/update.tsx
@@ -0,0 +1,189 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useBoolean } from 'ahooks'
+import { useTranslation } from 'react-i18next'
+import type { Param } from '../../types'
+import { ParamType } from '../../types'
+import AddButton from '@/app/components/base/button/add-button'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import Field from '@/app/components/app/configuration/config-var/config-modal/field'
+import Input from '@/app/components/base/input'
+import Textarea from '@/app/components/base/textarea'
+import Select from '@/app/components/base/select'
+import Switch from '@/app/components/base/switch'
+import Toast from '@/app/components/base/toast'
+import ConfigSelect from '@/app/components/app/configuration/config-var/config-select'
+import { ChangeType, type MoreInfo } from '@/app/components/workflow/types'
+import { checkKeys } from '@/utils/var'
+
+const i18nPrefix = 'workflow.nodes.parameterExtractor'
+const errorI18nPrefix = 'workflow.errorMsg'
+
+const DEFAULT_PARAM: Param = {
+  name: '',
+  type: ParamType.string,
+  description: '',
+  required: false,
+}
+
+type Props = {
+  type: 'add' | 'edit'
+  payload?: Param
+  onSave: (payload: Param, moreInfo?: MoreInfo) => void
+  onCancel?: () => void
+}
+
+const TYPES = [ParamType.string, ParamType.number, ParamType.arrayString, ParamType.arrayNumber, ParamType.arrayObject]
+
+const AddExtractParameter: FC<Props> = ({
+  type,
+  payload,
+  onSave,
+  onCancel,
+}) => {
+  const { t } = useTranslation()
+  const isAdd = type === 'add'
+  const [param, setParam] = useState<Param>(isAdd ? DEFAULT_PARAM : payload as Param)
+  const [renameInfo, setRenameInfo] = useState<MoreInfo | undefined>(undefined)
+  const handleParamChange = useCallback((key: string) => {
+    return (value: any) => {
+      if (key === 'name') {
+        const { isValid, errorKey, errorMessageKey } = checkKeys([value], true)
+        if (!isValid) {
+          Toast.notify({
+            type: 'error',
+            message: t(`appDebug.varKeyError.${errorMessageKey}`, { key: errorKey }),
+          })
+          return
+        }
+      }
+      setRenameInfo(key === 'name'
+        ? {
+          type: ChangeType.changeVarName,
+          payload: {
+            beforeKey: param.name,
+            afterKey: value,
+          },
+        }
+        : undefined)
+      setParam((prev) => {
+        return {
+          ...prev,
+          [key]: value,
+        }
+      })
+    }
+  }, [param.name, t])
+
+  const [isShowModal, {
+    setTrue: doShowModal,
+    setFalse: doHideModal,
+  }] = useBoolean(!isAdd)
+
+  const hideModal = useCallback(() => {
+    doHideModal()
+    onCancel?.()
+  }, [onCancel, doHideModal])
+
+  const showAddModal = useCallback(() => {
+    if (isAdd)
+      setParam(DEFAULT_PARAM)
+
+    doShowModal()
+  }, [isAdd, doShowModal])
+
+  const checkValid = useCallback(() => {
+    let errMessage = ''
+    if (!param.name)
+      errMessage = t(`${errorI18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.addExtractParameterContent.name`) })
+    if (!errMessage && param.type === ParamType.select && (!param.options || param.options.length === 0))
+      errMessage = t(`${errorI18nPrefix}.fieldRequired`, { field: t('appDebug.variableConfig.options') })
+    if (!errMessage && !param.description)
+      errMessage = t(`${errorI18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.addExtractParameterContent.description`) })
+
+    if (errMessage) {
+      Toast.notify({
+        type: 'error',
+        message: errMessage,
+      })
+      return false
+    }
+    return true
+  }, [param, t])
+
+  const handleSave = useCallback(() => {
+    if (!checkValid())
+      return
+
+    onSave(param, renameInfo)
+    hideModal()
+  }, [checkValid, onSave, param, hideModal, renameInfo])
+
+  return (
+    <div>
+      {isAdd && (
+        <AddButton className='mx-1' onClick={showAddModal} />
+      )}
+      {isShowModal && (
+        <Modal
+          title={t(`${i18nPrefix}.addExtractParameter`)}
+          isShow
+          onClose={hideModal}
+          className='!w-[400px] !max-w-[400px] !p-4'
+        >
+          <div>
+            <div className='space-y-2'>
+              <Field title={t(`${i18nPrefix}.addExtractParameterContent.name`)}>
+                <Input
+                  value={param.name}
+                  onChange={e => handleParamChange('name')(e.target.value)}
+                  placeholder={t(`${i18nPrefix}.addExtractParameterContent.namePlaceholder`)!}
+                />
+              </Field>
+              <Field title={t(`${i18nPrefix}.addExtractParameterContent.type`)}>
+                <Select
+                  defaultValue={param.type}
+                  allowSearch={false}
+                  // bgClassName='bg-gray-100'
+                  onSelect={v => handleParamChange('type')(v.value)}
+                  optionClassName='capitalize'
+                  items={
+                    TYPES.map(type => ({
+                      value: type,
+                      name: type,
+                    }))
+                  }
+                />
+              </Field>
+              {param.type === ParamType.select && (
+                <Field title={t('appDebug.variableConfig.options')}>
+                  <ConfigSelect options={param.options || []} onChange={handleParamChange('options')} />
+                </Field>
+              )}
+              <Field title={t(`${i18nPrefix}.addExtractParameterContent.description`)}>
+                <Textarea
+                  value={param.description}
+                  onChange={e => handleParamChange('description')(e.target.value)}
+                  placeholder={t(`${i18nPrefix}.addExtractParameterContent.descriptionPlaceholder`)!}
+                />
+              </Field>
+              <Field title={t(`${i18nPrefix}.addExtractParameterContent.required`)}>
+                <>
+                  <div className='mb-1.5 text-xs font-normal leading-[18px] text-text-tertiary'>{t(`${i18nPrefix}.addExtractParameterContent.requiredContent`)}</div>
+                  <Switch size='l' defaultValue={param.required} onChange={handleParamChange('required')} />
+                </>
+              </Field>
+            </div>
+            <div className='mt-4 flex justify-end space-x-2'>
+              <Button className='!w-[95px]' onClick={hideModal} >{t('common.operation.cancel')}</Button>
+              <Button className='!w-[95px]' variant='primary' onClick={handleSave} >{isAdd ? t('common.operation.add') : t('common.operation.save')}</Button>
+            </div>
+          </div>
+        </Modal>
+      )}
+    </div>
+  )
+}
+export default React.memo(AddExtractParameter)
diff --git a/app/components/workflow/nodes/parameter-extractor/components/reasoning-mode-picker.tsx b/app/components/workflow/nodes/parameter-extractor/components/reasoning-mode-picker.tsx
new file mode 100644
index 0000000..f4fd6e8
--- /dev/null
+++ b/app/components/workflow/nodes/parameter-extractor/components/reasoning-mode-picker.tsx
@@ -0,0 +1,49 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import { ReasoningModeType } from '../types'
+import Field from '../../_base/components/field'
+import OptionCard from '../../_base/components/option-card'
+
+const i18nPrefix = 'workflow.nodes.parameterExtractor'
+
+type Props = {
+  type: ReasoningModeType
+  onChange: (type: ReasoningModeType) => void
+}
+
+const ReasoningModePicker: FC<Props> = ({
+  type,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  const handleChange = useCallback((type: ReasoningModeType) => {
+    return () => {
+      onChange(type)
+    }
+  }, [onChange])
+
+  return (
+    <Field
+      title={t(`${i18nPrefix}.reasoningMode`)}
+      tooltip={t(`${i18nPrefix}.reasoningModeTip`)!}
+    >
+      <div className='grid grid-cols-2 gap-x-1'>
+        <OptionCard
+          title='Function/Tool Calling'
+          onSelect={handleChange(ReasoningModeType.functionCall)}
+          selected={type === ReasoningModeType.functionCall}
+        />
+        <OptionCard
+          title='Prompt'
+          selected={type === ReasoningModeType.prompt}
+          onSelect={handleChange(ReasoningModeType.prompt)}
+        />
+      </div>
+    </Field>
+
+  )
+}
+export default React.memo(ReasoningModePicker)
diff --git a/app/components/workflow/nodes/parameter-extractor/default.ts b/app/components/workflow/nodes/parameter-extractor/default.ts
new file mode 100644
index 0000000..0e3b707
--- /dev/null
+++ b/app/components/workflow/nodes/parameter-extractor/default.ts
@@ -0,0 +1,69 @@
+import { BlockEnum } from '../../types'
+import type { NodeDefault } from '../../types'
+import { type ParameterExtractorNodeType, ReasoningModeType } from './types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+const i18nPrefix = 'workflow'
+
+const nodeDefault: NodeDefault<ParameterExtractorNodeType> = {
+  defaultValue: {
+    query: [],
+    model: {
+      provider: '',
+      name: '',
+      mode: 'chat',
+      completion_params: {
+        temperature: 0.7,
+      },
+    },
+    reasoning_mode: ReasoningModeType.prompt,
+    vision: {
+      enabled: false,
+    },
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: ParameterExtractorNodeType, t: any) {
+    let errorMessages = ''
+    if (!errorMessages && (!payload.query || payload.query.length === 0))
+      errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.parameterExtractor.inputVar`) })
+
+    if (!errorMessages && !payload.model.provider)
+      errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.parameterExtractor.model`) })
+
+    if (!errorMessages && (!payload.parameters || payload.parameters.length === 0))
+      errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.parameterExtractor.extractParameters`) })
+
+    if (!errorMessages) {
+      payload.parameters.forEach((param) => {
+        if (errorMessages)
+          return
+        if (!param.name) {
+          errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.parameterExtractor.addExtractParameterContent.namePlaceholder`) })
+          return
+        }
+        if (!param.type) {
+          errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.parameterExtractor.addExtractParameterContent.typePlaceholder`) })
+          return
+        }
+        if (!param.description)
+          errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.parameterExtractor.addExtractParameterContent.descriptionPlaceholder`) })
+      })
+    }
+    if (!errorMessages && payload.vision?.enabled && !payload.vision.configs?.variable_selector?.length)
+      errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.errorMsg.fields.visionVariable`) })
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/parameter-extractor/node.tsx b/app/components/workflow/nodes/parameter-extractor/node.tsx
new file mode 100644
index 0000000..d79ae71
--- /dev/null
+++ b/app/components/workflow/nodes/parameter-extractor/node.tsx
@@ -0,0 +1,32 @@
+import type { FC } from 'react'
+import React from 'react'
+import type { ParameterExtractorNodeType } from './types'
+import {
+  useTextGenerationCurrentProviderAndModelAndModelList,
+} from '@/app/components/header/account-setting/model-provider-page/hooks'
+import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
+import type { NodeProps } from '@/app/components/workflow/types'
+
+const Node: FC<NodeProps<ParameterExtractorNodeType>> = ({
+  data,
+}) => {
+  const { provider, name: modelId } = data.model || {}
+  const {
+    textGenerationModelList,
+  } = useTextGenerationCurrentProviderAndModelAndModelList()
+  const hasSetModel = provider && modelId
+  return (
+    <div className='mb-1 px-3 py-1'>
+      {hasSetModel && (
+        <ModelSelector
+          defaultModel={{ provider, model: modelId }}
+          modelList={textGenerationModelList}
+          triggerClassName='!h-6 !rounded-md'
+          readonly
+        />
+      )}
+    </div>
+  )
+}
+
+export default React.memo(Node)
diff --git a/app/components/workflow/nodes/parameter-extractor/panel.tsx b/app/components/workflow/nodes/parameter-extractor/panel.tsx
new file mode 100644
index 0000000..d03f1d9
--- /dev/null
+++ b/app/components/workflow/nodes/parameter-extractor/panel.tsx
@@ -0,0 +1,273 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import MemoryConfig from '../_base/components/memory-config'
+import VarReferencePicker from '../_base/components/variable/var-reference-picker'
+import Editor from '../_base/components/prompt/editor'
+import ResultPanel from '../../run/result-panel'
+import ConfigVision from '../_base/components/config-vision'
+import { findVariableWhenOnLLMVision } from '../utils'
+import useConfig from './use-config'
+import type { ParameterExtractorNodeType } from './types'
+import ExtractParameter from './components/extract-parameter/list'
+import ImportFromTool from './components/extract-parameter/import-from-tool'
+import AddExtractParameter from './components/extract-parameter/update'
+import ReasoningModePicker from './components/reasoning-mode-picker'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import Split from '@/app/components/workflow/nodes/_base/components/split'
+import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal'
+import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
+import { InputVarType, type NodePanelProps } from '@/app/components/workflow/types'
+import Tooltip from '@/app/components/base/tooltip'
+import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
+import { VarType } from '@/app/components/workflow/types'
+import { FieldCollapse } from '@/app/components/workflow/nodes/_base/components/collapse'
+import type { Props as FormProps } from '@/app/components/workflow/nodes/_base/components/before-run-form/form'
+
+const i18nPrefix = 'workflow.nodes.parameterExtractor'
+const i18nCommonPrefix = 'workflow.common'
+
+const Panel: FC<NodePanelProps<ParameterExtractorNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    readOnly,
+    inputs,
+    handleInputVarChange,
+    filterVar,
+    isChatModel,
+    isChatMode,
+    isCompletionModel,
+    handleModelChanged,
+    handleImportFromTool,
+    handleCompletionParamsChange,
+    addExtractParameter,
+    handleExactParamsChange,
+    handleInstructionChange,
+    hasSetBlockStatus,
+    handleMemoryChange,
+    isSupportFunctionCall,
+    handleReasoningModeChange,
+    availableVars,
+    availableNodesWithParent,
+    availableVisionVars,
+    inputVarValues,
+    varInputs,
+    isVisionModel,
+    handleVisionResolutionChange,
+    handleVisionResolutionEnabledChange,
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runResult,
+    setInputVarValues,
+    visionFiles,
+    setVisionFiles,
+  } = useConfig(id, data)
+
+  const model = inputs.model
+
+  const singleRunForms = (() => {
+    const forms: FormProps[] = []
+
+    forms.push(
+      {
+        label: t('workflow.nodes.llm.singleRun.variable')!,
+        inputs: [{
+          label: t(`${i18nPrefix}.inputVar`)!,
+          variable: 'query',
+          type: InputVarType.paragraph,
+          required: true,
+        }, ...varInputs],
+        values: inputVarValues,
+        onChange: setInputVarValues,
+      },
+    )
+
+    if (isVisionModel && data.vision?.enabled && data.vision?.configs?.variable_selector) {
+      const currentVariable = findVariableWhenOnLLMVision(data.vision.configs.variable_selector, availableVisionVars)
+
+      forms.push(
+        {
+          label: t('workflow.nodes.llm.vision')!,
+          inputs: [{
+            label: currentVariable?.variable as any,
+            variable: '#files#',
+            type: currentVariable?.formType as any,
+            required: false,
+          }],
+          values: { '#files#': visionFiles },
+          onChange: keyValue => setVisionFiles((keyValue as any)['#files#']),
+        },
+      )
+    }
+
+    return forms
+  })()
+
+  return (
+    <div className='pt-2'>
+      <div className='space-y-4 px-4'>
+        <Field
+          title={t(`${i18nCommonPrefix}.model`)}
+          required
+        >
+          <ModelParameterModal
+            popupClassName='!w-[387px]'
+            isInWorkflow
+            isAdvancedMode={true}
+            mode={model?.mode}
+            provider={model?.provider}
+            completionParams={model?.completion_params}
+            modelId={model?.name}
+            setModel={handleModelChanged}
+            onCompletionParamsChange={handleCompletionParamsChange}
+            hideDebugWithMultipleModel
+            debugWithMultipleModel={false}
+            readonly={readOnly}
+          />
+        </Field>
+        <Field
+          title={t(`${i18nPrefix}.inputVar`)}
+          required
+        >
+          <>
+            <VarReferencePicker
+              readonly={readOnly}
+              nodeId={id}
+              isShowNodeName
+              value={inputs.query || []}
+              onChange={handleInputVarChange}
+              filterVar={filterVar}
+            />
+          </>
+        </Field>
+        <Split />
+        <ConfigVision
+          nodeId={id}
+          readOnly={readOnly}
+          isVisionModel={isVisionModel}
+          enabled={inputs.vision?.enabled}
+          onEnabledChange={handleVisionResolutionEnabledChange}
+          config={inputs.vision?.configs}
+          onConfigChange={handleVisionResolutionChange}
+        />
+        <Field
+          title={t(`${i18nPrefix}.extractParameters`)}
+          required
+          operations={
+            !readOnly
+              ? (
+                <div className='flex items-center space-x-1'>
+                  {!readOnly && (
+                    <ImportFromTool onImport={handleImportFromTool} />
+                  )}
+                  {!readOnly && (<div className='h-3 w-px bg-divider-regular'></div>)}
+                  <AddExtractParameter type='add' onSave={addExtractParameter} />
+                </div>
+              )
+              : undefined
+          }
+        >
+          <ExtractParameter
+            readonly={readOnly}
+            list={inputs.parameters || []}
+            onChange={handleExactParamsChange}
+          />
+        </Field>
+        <Editor
+          title={
+            <div className='flex items-center space-x-1'>
+              <span className='uppercase'>{t(`${i18nPrefix}.instruction`)}</span>
+              <Tooltip
+                popupContent={
+                  <div className='w-[120px]'>
+                    {t(`${i18nPrefix}.instructionTip`)}
+                  </div>
+                }
+                triggerClassName='w-3.5 h-3.5 ml-0.5'
+              />
+            </div>
+          }
+          value={inputs.instruction}
+          onChange={handleInstructionChange}
+          readOnly={readOnly}
+          isChatModel={isChatModel}
+          isChatApp={isChatMode}
+          isShowContext={false}
+          hasSetBlockStatus={hasSetBlockStatus}
+          nodesOutputVars={availableVars}
+          availableNodes={availableNodesWithParent}
+        />
+      </div>
+      <FieldCollapse title={t(`${i18nPrefix}.advancedSetting`)}>
+        <>
+          {/* Memory */}
+          {isChatMode && (
+            <div className='mt-4'>
+              <MemoryConfig
+                readonly={readOnly}
+                config={{ data: inputs.memory }}
+                onChange={handleMemoryChange}
+                canSetRoleName={isCompletionModel}
+              />
+            </div>
+          )}
+          {isSupportFunctionCall && (
+            <div className='mt-2'>
+              <ReasoningModePicker
+                type={inputs.reasoning_mode}
+                onChange={handleReasoningModeChange}
+              />
+            </div>
+          )}
+        </>
+      </FieldCollapse>
+      {inputs.parameters?.length > 0 && (<>
+        <Split />
+        <div>
+          <OutputVars>
+            <>
+              {inputs.parameters.map((param, index) => (
+                <VarItem
+                  key={index}
+                  name={param.name}
+                  type={param.type}
+                  description={param.description}
+                />
+              ))}
+              <VarItem
+                name='__is_success'
+                type={VarType.number}
+                description={t(`${i18nPrefix}.isSuccess`)}
+              />
+              <VarItem
+                name='__reason'
+                type={VarType.string}
+                description={t(`${i18nPrefix}.errorReason`)}
+              />
+            </>
+          </OutputVars>
+        </div>
+      </>)}
+      {isShowSingleRun && (
+        <BeforeRunForm
+          nodeName={inputs.title}
+          onHide={hideSingleRun}
+          forms={singleRunForms}
+          runningStatus={runningStatus}
+          onRun={handleRun}
+          onStop={handleStop}
+          result={<ResultPanel {...runResult} showSteps={false} />}
+        />
+      )}
+    </div>
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/parameter-extractor/types.ts b/app/components/workflow/nodes/parameter-extractor/types.ts
new file mode 100644
index 0000000..f5ba717
--- /dev/null
+++ b/app/components/workflow/nodes/parameter-extractor/types.ts
@@ -0,0 +1,37 @@
+import type { CommonNodeType, Memory, ModelConfig, ValueSelector, VisionSetting } from '@/app/components/workflow/types'
+
+export enum ParamType {
+  string = 'string',
+  number = 'number',
+  bool = 'bool',
+  select = 'select',
+  arrayString = 'array[string]',
+  arrayNumber = 'array[number]',
+  arrayObject = 'array[object]',
+}
+
+export type Param = {
+  name: string
+  type: ParamType
+  options?: string[]
+  description: string
+  required?: boolean
+}
+
+export enum ReasoningModeType {
+  prompt = 'prompt',
+  functionCall = 'function_call',
+}
+
+export type ParameterExtractorNodeType = CommonNodeType & {
+  model: ModelConfig
+  query: ValueSelector
+  reasoning_mode: ReasoningModeType
+  parameters: Param[]
+  instruction: string
+  memory?: Memory
+  vision: {
+    enabled: boolean
+    configs?: VisionSetting
+  }
+}
diff --git a/app/components/workflow/nodes/parameter-extractor/use-config.ts b/app/components/workflow/nodes/parameter-extractor/use-config.ts
new file mode 100644
index 0000000..045737b
--- /dev/null
+++ b/app/components/workflow/nodes/parameter-extractor/use-config.ts
@@ -0,0 +1,307 @@
+import { useCallback, useEffect, useRef, useState } from 'react'
+import produce from 'immer'
+import type { Memory, MoreInfo, ValueSelector, Var } from '../../types'
+import { ChangeType, VarType } from '../../types'
+import { useStore } from '../../store'
+import {
+  useIsChatMode,
+  useNodesReadOnly,
+  useWorkflow,
+} from '../../hooks'
+import useOneStepRun from '../_base/hooks/use-one-step-run'
+import useConfigVision from '../../hooks/use-config-vision'
+import type { Param, ParameterExtractorNodeType, ReasoningModeType } from './types'
+import { useModelListAndDefaultModelAndCurrentProviderAndModel, useTextGenerationCurrentProviderAndModelAndModelList } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import { checkHasQueryBlock } from '@/app/components/base/prompt-editor/constants'
+import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
+import { supportFunctionCall } from '@/utils/tool-call'
+
+const useConfig = (id: string, payload: ParameterExtractorNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const { handleOutVarRenameChange } = useWorkflow()
+  const isChatMode = useIsChatMode()
+
+  const defaultConfig = useStore(s => s.nodesDefaultConfigs)[payload.type]
+
+  const [defaultRolePrefix, setDefaultRolePrefix] = useState<{ user: string; assistant: string }>({ user: '', assistant: '' })
+  const { inputs, setInputs: doSetInputs } = useNodeCrud<ParameterExtractorNodeType>(id, payload)
+  const inputRef = useRef(inputs)
+
+  const setInputs = useCallback((newInputs: ParameterExtractorNodeType) => {
+    if (newInputs.memory && !newInputs.memory.role_prefix) {
+      const newPayload = produce(newInputs, (draft) => {
+        draft.memory!.role_prefix = defaultRolePrefix
+      })
+      doSetInputs(newPayload)
+      inputRef.current = newPayload
+      return
+    }
+    doSetInputs(newInputs)
+    inputRef.current = newInputs
+  }, [doSetInputs, defaultRolePrefix])
+
+  const filterVar = useCallback((varPayload: Var) => {
+    return [VarType.string].includes(varPayload.type)
+  }, [])
+
+  const handleInputVarChange = useCallback((newInputVar: ValueSelector | string) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.query = newInputVar as ValueSelector || []
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleExactParamsChange = useCallback((newParams: Param[], moreInfo?: MoreInfo) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.parameters = newParams
+    })
+    setInputs(newInputs)
+
+    if (moreInfo && moreInfo?.type === ChangeType.changeVarName && moreInfo.payload)
+      handleOutVarRenameChange(id, [id, moreInfo.payload.beforeKey], [id, moreInfo.payload.afterKey!])
+  }, [handleOutVarRenameChange, id, inputs, setInputs])
+
+  const addExtractParameter = useCallback((payload: Param) => {
+    const newInputs = produce(inputs, (draft) => {
+      if (!draft.parameters)
+        draft.parameters = []
+      draft.parameters.push(payload)
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  // model
+  const model = inputs.model || {
+    provider: '',
+    name: '',
+    mode: 'chat',
+    completion_params: {
+      temperature: 0.7,
+    },
+  }
+  const modelMode = inputs.model?.mode
+  const isChatModel = modelMode === 'chat'
+  const isCompletionModel = !isChatModel
+
+  const {
+    isVisionModel,
+    handleVisionResolutionEnabledChange,
+    handleVisionResolutionChange,
+    handleModelChanged: handleVisionConfigAfterModelChanged,
+  } = useConfigVision(model, {
+    payload: inputs.vision,
+    onChange: (newPayload) => {
+      const newInputs = produce(inputs, (draft) => {
+        draft.vision = newPayload
+      })
+      setInputs(newInputs)
+    },
+  })
+
+  const appendDefaultPromptConfig = useCallback((draft: ParameterExtractorNodeType, defaultConfig: any, _passInIsChatMode?: boolean) => {
+    const promptTemplates = defaultConfig.prompt_templates
+    if (!isChatModel) {
+      setDefaultRolePrefix({
+        user: promptTemplates.completion_model.conversation_histories_role.user_prefix,
+        assistant: promptTemplates.completion_model.conversation_histories_role.assistant_prefix,
+      })
+    }
+  }, [isChatModel])
+
+  const [modelChanged, setModelChanged] = useState(false)
+  const {
+    currentProvider,
+    currentModel,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.textGeneration)
+
+  const handleModelChanged = useCallback((model: { provider: string; modelId: string; mode?: string }) => {
+    const newInputs = produce(inputRef.current, (draft) => {
+      draft.model.provider = model.provider
+      draft.model.name = model.modelId
+      draft.model.mode = model.mode!
+      const isModeChange = model.mode !== inputRef.current.model?.mode
+      if (isModeChange && defaultConfig && Object.keys(defaultConfig).length > 0)
+        appendDefaultPromptConfig(draft, defaultConfig, model.mode === 'chat')
+    })
+    setInputs(newInputs)
+    setModelChanged(true)
+  }, [setInputs, defaultConfig, appendDefaultPromptConfig])
+
+  useEffect(() => {
+    if (currentProvider?.provider && currentModel?.model && !model.provider) {
+      handleModelChanged({
+        provider: currentProvider?.provider,
+        modelId: currentModel?.model,
+        mode: currentModel?.model_properties?.mode as string,
+      })
+    }
+  }, [model?.provider, currentProvider, currentModel, handleModelChanged])
+
+  // change to vision model to set vision enabled, else disabled
+  useEffect(() => {
+    if (!modelChanged)
+      return
+    setModelChanged(false)
+    handleVisionConfigAfterModelChanged()
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isVisionModel, modelChanged])
+
+  const {
+    currentModel: currModel,
+  } = useTextGenerationCurrentProviderAndModelAndModelList(
+    {
+      provider: model.provider,
+      model: model.name,
+    },
+  )
+
+  const isSupportFunctionCall = supportFunctionCall(currModel?.features)
+
+  const filterInputVar = useCallback((varPayload: Var) => {
+    return [VarType.number, VarType.string].includes(varPayload.type)
+  }, [])
+
+  const filterVisionInputVar = useCallback((varPayload: Var) => {
+    return [VarType.file, VarType.arrayFile].includes(varPayload.type)
+  }, [])
+
+  const {
+    availableVars,
+    availableNodesWithParent,
+  } = useAvailableVarList(id, {
+    onlyLeafNodeVar: false,
+    filterVar: filterInputVar,
+  })
+
+  const {
+    availableVars: availableVisionVars,
+  } = useAvailableVarList(id, {
+    onlyLeafNodeVar: false,
+    filterVar: filterVisionInputVar,
+  })
+
+  const handleCompletionParamsChange = useCallback((newParams: Record<string, any>) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.model.completion_params = newParams
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleInstructionChange = useCallback((newInstruction: string) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.instruction = newInstruction
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const hasSetBlockStatus = {
+    history: false,
+    query: isChatMode ? checkHasQueryBlock(inputs.instruction) : false,
+    context: false,
+  }
+
+  const handleMemoryChange = useCallback((newMemory?: Memory) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.memory = newMemory
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleReasoningModeChange = useCallback((newReasoningMode: ReasoningModeType) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.reasoning_mode = newReasoningMode
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleImportFromTool = useCallback((params: Param[]) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.parameters = params
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  // single run
+  const {
+    isShowSingleRun,
+    hideSingleRun,
+    getInputVars,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runInputData,
+    runInputDataRef,
+    setRunInputData,
+    runResult,
+  } = useOneStepRun<ParameterExtractorNodeType>({
+    id,
+    data: inputs,
+    defaultRunInputData: {
+      'query': '',
+      '#files#': [],
+    },
+  })
+
+  const varInputs = getInputVars([inputs.instruction])
+  const inputVarValues = (() => {
+    const vars: Record<string, any> = {}
+    Object.keys(runInputData)
+      .forEach((key) => {
+        vars[key] = runInputData[key]
+      })
+    return vars
+  })()
+
+  const setInputVarValues = useCallback((newPayload: Record<string, any>) => {
+    setRunInputData(newPayload)
+  }, [setRunInputData])
+
+  const visionFiles = runInputData['#files#']
+  const setVisionFiles = useCallback((newFiles: any[]) => {
+    setRunInputData({
+      ...runInputDataRef.current,
+      '#files#': newFiles,
+    })
+  }, [runInputDataRef, setRunInputData])
+
+  return {
+    readOnly,
+    handleInputVarChange,
+    filterVar,
+    isChatMode,
+    inputs,
+    isChatModel,
+    isCompletionModel,
+    handleModelChanged,
+    handleCompletionParamsChange,
+    handleImportFromTool,
+    handleExactParamsChange,
+    addExtractParameter,
+    handleInstructionChange,
+    hasSetBlockStatus,
+    availableVars,
+    availableNodesWithParent,
+    availableVisionVars,
+    isSupportFunctionCall,
+    handleReasoningModeChange,
+    handleMemoryChange,
+    varInputs,
+    inputVarValues,
+    isVisionModel,
+    handleVisionResolutionEnabledChange,
+    handleVisionResolutionChange,
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runResult,
+    setInputVarValues,
+    visionFiles,
+    setVisionFiles,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/question-classifier/components/advanced-setting.tsx b/app/components/workflow/nodes/question-classifier/components/advanced-setting.tsx
new file mode 100644
index 0000000..dc65460
--- /dev/null
+++ b/app/components/workflow/nodes/question-classifier/components/advanced-setting.tsx
@@ -0,0 +1,82 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import MemoryConfig from '../../_base/components/memory-config'
+import Editor from '@/app/components/workflow/nodes/_base/components/prompt/editor'
+import type { Memory, Node, NodeOutPutVar } from '@/app/components/workflow/types'
+import Tooltip from '@/app/components/base/tooltip'
+const i18nPrefix = 'workflow.nodes.questionClassifiers'
+
+type Props = {
+  instruction: string
+  onInstructionChange: (instruction: string) => void
+  hideMemorySetting: boolean
+  memory?: Memory
+  onMemoryChange: (memory?: Memory) => void
+  readonly?: boolean
+  isChatModel: boolean
+  isChatApp: boolean
+  hasSetBlockStatus?: {
+    context: boolean
+    history: boolean
+    query: boolean
+  }
+  nodesOutputVars: NodeOutPutVar[]
+  availableNodes: Node[]
+}
+
+const AdvancedSetting: FC<Props> = ({
+  instruction,
+  onInstructionChange,
+  hideMemorySetting,
+  memory,
+  onMemoryChange,
+  readonly,
+  isChatModel,
+  isChatApp,
+  hasSetBlockStatus,
+  nodesOutputVars,
+  availableNodes,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <>
+      <Editor
+        title={
+          <div className='flex items-center space-x-1'>
+            <span className='uppercase'>{t(`${i18nPrefix}.instruction`)}</span>
+            <Tooltip
+              popupContent={
+                <div className='w-[120px]'>
+                  {t(`${i18nPrefix}.instructionTip`)}
+                </div>
+              }
+              triggerClassName='w-3.5 h-3.5 ml-0.5'
+            />
+          </div>
+        }
+        value={instruction}
+        onChange={onInstructionChange}
+        readOnly={readonly}
+        isChatModel={isChatModel}
+        isChatApp={isChatApp}
+        isShowContext={false}
+        hasSetBlockStatus={hasSetBlockStatus}
+        nodesOutputVars={nodesOutputVars}
+        availableNodes={availableNodes}
+      />
+      {!hideMemorySetting && (
+        <MemoryConfig
+          className='mt-4'
+          readonly={false}
+          config={{ data: memory }}
+          onChange={onMemoryChange}
+          canSetRoleName={false}
+        />
+      )}
+    </>
+  )
+}
+export default React.memo(AdvancedSetting)
diff --git a/app/components/workflow/nodes/question-classifier/components/class-item.tsx b/app/components/workflow/nodes/question-classifier/components/class-item.tsx
new file mode 100644
index 0000000..6065037
--- /dev/null
+++ b/app/components/workflow/nodes/question-classifier/components/class-item.tsx
@@ -0,0 +1,60 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import type { Topic } from '../types'
+import Editor from '@/app/components/workflow/nodes/_base/components/prompt/editor'
+import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
+import type { ValueSelector, Var } from '@/app/components/workflow/types'
+
+const i18nPrefix = 'workflow.nodes.questionClassifiers'
+
+type Props = {
+  nodeId: string
+  payload: Topic
+  onChange: (payload: Topic) => void
+  onRemove: () => void
+  index: number
+  readonly?: boolean
+  filterVar: (payload: Var, valueSelector: ValueSelector) => boolean
+}
+
+const ClassItem: FC<Props> = ({
+  nodeId,
+  payload,
+  onChange,
+  onRemove,
+  index,
+  readonly,
+  filterVar,
+}) => {
+  const { t } = useTranslation()
+
+  const handleNameChange = useCallback((value: string) => {
+    onChange({ ...payload, name: value })
+  }, [onChange, payload])
+
+  const { availableVars, availableNodesWithParent } = useAvailableVarList(nodeId, {
+    onlyLeafNodeVar: false,
+    hideChatVar: false,
+    hideEnv: false,
+    filterVar,
+  })
+
+  return (
+    <Editor
+      title={`${t(`${i18nPrefix}.class`)} ${index}`}
+      placeholder={t(`${i18nPrefix}.topicPlaceholder`)!}
+      value={payload.name}
+      onChange={handleNameChange}
+      showRemove
+      onRemove={onRemove}
+      nodesOutputVars={availableVars}
+      availableNodes={availableNodesWithParent}
+      readOnly={readonly} // ?
+      justVar // ?
+      isSupportFileVar // ?
+    />
+  )
+}
+export default React.memo(ClassItem)
diff --git a/app/components/workflow/nodes/question-classifier/components/class-list.tsx b/app/components/workflow/nodes/question-classifier/components/class-list.tsx
new file mode 100644
index 0000000..f152917
--- /dev/null
+++ b/app/components/workflow/nodes/question-classifier/components/class-list.tsx
@@ -0,0 +1,87 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import produce from 'immer'
+import { useTranslation } from 'react-i18next'
+import { useEdgesInteractions } from '../../../hooks'
+import AddButton from '../../_base/components/add-button'
+import Item from './class-item'
+import type { Topic } from '@/app/components/workflow/nodes/question-classifier/types'
+import type { ValueSelector, Var } from '@/app/components/workflow/types'
+
+const i18nPrefix = 'workflow.nodes.questionClassifiers'
+
+type Props = {
+  nodeId: string
+  list: Topic[]
+  onChange: (list: Topic[]) => void
+  readonly?: boolean
+  filterVar: (payload: Var, valueSelector: ValueSelector) => boolean
+}
+
+const ClassList: FC<Props> = ({
+  nodeId,
+  list,
+  onChange,
+  readonly,
+  filterVar,
+}) => {
+  const { t } = useTranslation()
+  const { handleEdgeDeleteByDeleteBranch } = useEdgesInteractions()
+
+  const handleClassChange = useCallback((index: number) => {
+    return (value: Topic) => {
+      const newList = produce(list, (draft) => {
+        draft[index] = value
+      })
+      onChange(newList)
+    }
+  }, [list, onChange])
+
+  const handleAddClass = useCallback(() => {
+    const newList = produce(list, (draft) => {
+      draft.push({ id: `${Date.now()}`, name: '' })
+    })
+    onChange(newList)
+  }, [list, onChange])
+
+  const handleRemoveClass = useCallback((index: number) => {
+    return () => {
+      handleEdgeDeleteByDeleteBranch(nodeId, list[index].id)
+      const newList = produce(list, (draft) => {
+        draft.splice(index, 1)
+      })
+      onChange(newList)
+    }
+  }, [list, onChange, handleEdgeDeleteByDeleteBranch, nodeId])
+
+  // Todo Remove; edit topic name
+  return (
+    <div className='space-y-2'>
+      {
+        list.map((item, index) => {
+          return (
+            <Item
+              nodeId={nodeId}
+              key={list[index].id}
+              payload={item}
+              onChange={handleClassChange(index)}
+              onRemove={handleRemoveClass(index)}
+              index={index + 1}
+              readonly={readonly}
+              filterVar={filterVar}
+            />
+          )
+        })
+      }
+      {!readonly && (
+        <AddButton
+          onClick={handleAddClass}
+          text={t(`${i18nPrefix}.addClass`)}
+        />
+      )}
+
+    </div>
+  )
+}
+export default React.memo(ClassList)
diff --git a/app/components/workflow/nodes/question-classifier/default.ts b/app/components/workflow/nodes/question-classifier/default.ts
new file mode 100644
index 0000000..2729c53
--- /dev/null
+++ b/app/components/workflow/nodes/question-classifier/default.ts
@@ -0,0 +1,76 @@
+import type { NodeDefault } from '../../types'
+import { BlockEnum } from '../../types'
+import type { QuestionClassifierNodeType } from './types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+
+const i18nPrefix = 'workflow'
+
+const nodeDefault: NodeDefault<QuestionClassifierNodeType> = {
+  defaultValue: {
+    query_variable_selector: [],
+    model: {
+      provider: '',
+      name: '',
+      mode: 'chat',
+      completion_params: {
+        temperature: 0.7,
+      },
+    },
+    classes: [
+      {
+        id: '1',
+        name: '',
+      },
+      {
+        id: '2',
+        name: '',
+      },
+    ],
+    _targetBranches: [
+      {
+        id: '1',
+        name: '',
+      },
+      {
+        id: '2',
+        name: '',
+      },
+    ],
+    vision: {
+      enabled: false,
+    },
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: QuestionClassifierNodeType, t: any) {
+    let errorMessages = ''
+    if (!errorMessages && (!payload.query_variable_selector || payload.query_variable_selector.length === 0))
+      errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.questionClassifiers.inputVars`) })
+
+    if (!errorMessages && !payload.model.provider)
+      errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.questionClassifiers.model`) })
+
+    if (!errorMessages && (!payload.classes || payload.classes.length === 0))
+      errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.questionClassifiers.class`) })
+
+    if (!errorMessages && (payload.classes.some(item => !item.name)))
+      errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.questionClassifiers.topicName`) })
+
+    if (!errorMessages && payload.vision?.enabled && !payload.vision.configs?.variable_selector?.length)
+      errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.errorMsg.fields.visionVariable`) })
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/question-classifier/node.tsx b/app/components/workflow/nodes/question-classifier/node.tsx
new file mode 100644
index 0000000..87ec68b
--- /dev/null
+++ b/app/components/workflow/nodes/question-classifier/node.tsx
@@ -0,0 +1,72 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import type { NodeProps } from 'reactflow'
+import InfoPanel from '../_base/components/info-panel'
+import { NodeSourceHandle } from '../_base/components/node-handle'
+import type { QuestionClassifierNodeType } from './types'
+import {
+  useTextGenerationCurrentProviderAndModelAndModelList,
+} from '@/app/components/header/account-setting/model-provider-page/hooks'
+import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
+import ReadonlyInputWithSelectVar from '../_base/components/readonly-input-with-select-var'
+
+const i18nPrefix = 'workflow.nodes.questionClassifiers'
+
+const Node: FC<NodeProps<QuestionClassifierNodeType>> = (props) => {
+  const { t } = useTranslation()
+
+  const { data, id } = props
+  const { provider, name: modelId } = data.model
+  // const tempTopics = data.topics
+  const topics = data.classes
+  const {
+    textGenerationModelList,
+  } = useTextGenerationCurrentProviderAndModelAndModelList()
+  const hasSetModel = provider && modelId
+
+  if (!hasSetModel && !topics.length)
+    return null
+
+  return (
+    <div className='mb-1 px-3 py-1'>
+      {hasSetModel && (
+        <ModelSelector
+          defaultModel={{ provider, model: modelId }}
+          triggerClassName='!h-6 !rounded-md'
+          modelList={textGenerationModelList}
+          readonly
+        />
+      )}
+      {
+        !!topics.length && (
+          <div className='mt-2 space-y-0.5'>
+            {topics.map((topic, index) => (
+              <div
+                key={index}
+                className='relative'
+              >
+                <InfoPanel
+                  title={`${t(`${i18nPrefix}.class`)} ${index + 1}`}
+                  content={
+                    <ReadonlyInputWithSelectVar
+                      value={topic.name}
+                      nodeId={id}
+                    />
+                  }
+                />
+                <NodeSourceHandle
+                  {...props}
+                  handleId={topic.id}
+                  handleClassName='!top-1/2 !-translate-y-1/2 !-right-[21px]'
+                />
+              </div>
+            ))}
+          </div>
+        )
+      }
+    </div>
+  )
+}
+
+export default React.memo(Node)
diff --git a/app/components/workflow/nodes/question-classifier/panel.tsx b/app/components/workflow/nodes/question-classifier/panel.tsx
new file mode 100644
index 0000000..d2e0fb0
--- /dev/null
+++ b/app/components/workflow/nodes/question-classifier/panel.tsx
@@ -0,0 +1,204 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import VarReferencePicker from '../_base/components/variable/var-reference-picker'
+import ConfigVision from '../_base/components/config-vision'
+import { findVariableWhenOnLLMVision } from '../utils'
+import useConfig from './use-config'
+import ClassList from './components/class-list'
+import AdvancedSetting from './components/advanced-setting'
+import type { QuestionClassifierNodeType } from './types'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal'
+import { InputVarType, type NodePanelProps } from '@/app/components/workflow/types'
+import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
+import ResultPanel from '@/app/components/workflow/run/result-panel'
+import Split from '@/app/components/workflow/nodes/_base/components/split'
+import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
+import { FieldCollapse } from '@/app/components/workflow/nodes/_base/components/collapse'
+import type { Props as FormProps } from '@/app/components/workflow/nodes/_base/components/before-run-form/form'
+
+const i18nPrefix = 'workflow.nodes.questionClassifiers'
+
+const Panel: FC<NodePanelProps<QuestionClassifierNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    readOnly,
+    inputs,
+    handleModelChanged,
+    isChatMode,
+    isChatModel,
+    handleCompletionParamsChange,
+    handleQueryVarChange,
+    handleTopicsChange,
+    hasSetBlockStatus,
+    availableVars,
+    availableNodesWithParent,
+    availableVisionVars,
+    handleInstructionChange,
+    inputVarValues,
+    varInputs,
+    setInputVarValues,
+    handleMemoryChange,
+    isVisionModel,
+    handleVisionResolutionChange,
+    handleVisionResolutionEnabledChange,
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runResult,
+    filterVar,
+    visionFiles,
+    setVisionFiles,
+  } = useConfig(id, data)
+
+  const model = inputs.model
+
+  const singleRunForms = (() => {
+    const forms: FormProps[] = []
+
+    forms.push(
+      {
+        label: t('workflow.nodes.llm.singleRun.variable')!,
+        inputs: [{
+          label: t(`${i18nPrefix}.inputVars`)!,
+          variable: 'query',
+          type: InputVarType.paragraph,
+          required: true,
+        }, ...varInputs],
+        values: inputVarValues,
+        onChange: setInputVarValues,
+      },
+    )
+
+    if (isVisionModel && data.vision?.enabled && data.vision?.configs?.variable_selector) {
+      const currentVariable = findVariableWhenOnLLMVision(data.vision.configs.variable_selector, availableVisionVars)
+
+      forms.push(
+        {
+          label: t('workflow.nodes.llm.vision')!,
+          inputs: [{
+            label: currentVariable?.variable as any,
+            variable: '#files#',
+            type: currentVariable?.formType as any,
+            required: false,
+          }],
+          values: { '#files#': visionFiles },
+          onChange: keyValue => setVisionFiles(keyValue['#files#']),
+        },
+      )
+    }
+
+    return forms
+  })()
+
+  return (
+    <div className='pt-2'>
+      <div className='space-y-4 px-4'>
+        <Field
+          title={t(`${i18nPrefix}.model`)}
+          required
+        >
+          <ModelParameterModal
+            popupClassName='!w-[387px]'
+            isInWorkflow
+            isAdvancedMode={true}
+            mode={model?.mode}
+            provider={model?.provider}
+            completionParams={model.completion_params}
+            modelId={model.name}
+            setModel={handleModelChanged}
+            onCompletionParamsChange={handleCompletionParamsChange}
+            hideDebugWithMultipleModel
+            debugWithMultipleModel={false}
+            readonly={readOnly}
+          />
+        </Field>
+        <Field
+          title={t(`${i18nPrefix}.inputVars`)}
+          required
+        >
+          <VarReferencePicker
+            readonly={readOnly}
+            isShowNodeName
+            nodeId={id}
+            value={inputs.query_variable_selector}
+            onChange={handleQueryVarChange}
+            filterVar={filterVar}
+          />
+        </Field>
+        <Split />
+        <ConfigVision
+          nodeId={id}
+          readOnly={readOnly}
+          isVisionModel={isVisionModel}
+          enabled={inputs.vision?.enabled}
+          onEnabledChange={handleVisionResolutionEnabledChange}
+          config={inputs.vision?.configs}
+          onConfigChange={handleVisionResolutionChange}
+        />
+        <Field
+          title={t(`${i18nPrefix}.class`)}
+          required
+        >
+          <ClassList
+            nodeId={id}
+            list={inputs.classes}
+            onChange={handleTopicsChange}
+            readonly={readOnly}
+            filterVar={filterVar}
+          />
+        </Field>
+        <Split />
+      </div>
+      <FieldCollapse
+        title={t(`${i18nPrefix}.advancedSetting`)}
+      >
+        <AdvancedSetting
+          hideMemorySetting={!isChatMode}
+          instruction={inputs.instruction}
+          onInstructionChange={handleInstructionChange}
+          memory={inputs.memory}
+          onMemoryChange={handleMemoryChange}
+          readonly={readOnly}
+          isChatApp={isChatMode}
+          isChatModel={isChatModel}
+          hasSetBlockStatus={hasSetBlockStatus}
+          nodesOutputVars={availableVars}
+          availableNodes={availableNodesWithParent}
+        />
+      </FieldCollapse>
+      <Split />
+      <div>
+        <OutputVars>
+          <>
+            <VarItem
+              name='class_name'
+              type='string'
+              description={t(`${i18nPrefix}.outputVars.className`)}
+            />
+          </>
+        </OutputVars>
+      </div>
+      {isShowSingleRun && (
+        <BeforeRunForm
+          nodeName={inputs.title}
+          onHide={hideSingleRun}
+          forms={singleRunForms}
+          runningStatus={runningStatus}
+          onRun={handleRun}
+          onStop={handleStop}
+          result={<ResultPanel {...runResult} showSteps={false} />}
+        />
+      )}
+    </div>
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/question-classifier/types.ts b/app/components/workflow/nodes/question-classifier/types.ts
new file mode 100644
index 0000000..ddc16b4
--- /dev/null
+++ b/app/components/workflow/nodes/question-classifier/types.ts
@@ -0,0 +1,18 @@
+import type { CommonNodeType, Memory, ModelConfig, ValueSelector, VisionSetting } from '@/app/components/workflow/types'
+
+export type Topic = {
+  id: string
+  name: string
+}
+
+export type QuestionClassifierNodeType = CommonNodeType & {
+  query_variable_selector: ValueSelector
+  model: ModelConfig
+  classes: Topic[]
+  instruction: string
+  memory?: Memory
+  vision: {
+    enabled: boolean
+    configs?: VisionSetting
+  }
+}
diff --git a/app/components/workflow/nodes/question-classifier/use-config.ts b/app/components/workflow/nodes/question-classifier/use-config.ts
new file mode 100644
index 0000000..7df8293
--- /dev/null
+++ b/app/components/workflow/nodes/question-classifier/use-config.ts
@@ -0,0 +1,258 @@
+import { useCallback, useEffect, useRef, useState } from 'react'
+import produce from 'immer'
+import { BlockEnum, VarType } from '../../types'
+import type { Memory, ValueSelector, Var } from '../../types'
+import {
+  useIsChatMode, useNodesReadOnly,
+  useWorkflow,
+} from '../../hooks'
+import { useStore } from '../../store'
+import useAvailableVarList from '../_base/hooks/use-available-var-list'
+import useConfigVision from '../../hooks/use-config-vision'
+import type { QuestionClassifierNodeType } from './types'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run'
+import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { checkHasQueryBlock } from '@/app/components/base/prompt-editor/constants'
+
+const useConfig = (id: string, payload: QuestionClassifierNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const isChatMode = useIsChatMode()
+  const defaultConfig = useStore(s => s.nodesDefaultConfigs)[payload.type]
+  const { getBeforeNodesInSameBranch } = useWorkflow()
+  const startNode = getBeforeNodesInSameBranch(id).find(node => node.data.type === BlockEnum.Start)
+  const startNodeId = startNode?.id
+  const { inputs, setInputs } = useNodeCrud<QuestionClassifierNodeType>(id, payload)
+  const inputRef = useRef(inputs)
+  useEffect(() => {
+    inputRef.current = inputs
+  }, [inputs])
+
+  const [modelChanged, setModelChanged] = useState(false)
+  const {
+    currentProvider,
+    currentModel,
+  } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.textGeneration)
+
+  const model = inputs.model
+  const modelMode = inputs.model?.mode
+  const isChatModel = modelMode === 'chat'
+
+  const {
+    isVisionModel,
+    handleVisionResolutionEnabledChange,
+    handleVisionResolutionChange,
+    handleModelChanged: handleVisionConfigAfterModelChanged,
+  } = useConfigVision(model, {
+    payload: inputs.vision,
+    onChange: (newPayload) => {
+      const newInputs = produce(inputs, (draft) => {
+        draft.vision = newPayload
+      })
+      setInputs(newInputs)
+    },
+  })
+
+  const handleModelChanged = useCallback((model: { provider: string; modelId: string; mode?: string }) => {
+    const newInputs = produce(inputRef.current, (draft) => {
+      draft.model.provider = model.provider
+      draft.model.name = model.modelId
+      draft.model.mode = model.mode!
+    })
+    setInputs(newInputs)
+    setModelChanged(true)
+  }, [setInputs])
+
+  useEffect(() => {
+    if (currentProvider?.provider && currentModel?.model && !model.provider) {
+      handleModelChanged({
+        provider: currentProvider?.provider,
+        modelId: currentModel?.model,
+        mode: currentModel?.model_properties?.mode as string,
+      })
+    }
+  }, [model.provider, currentProvider, currentModel, handleModelChanged])
+
+  const handleCompletionParamsChange = useCallback((newParams: Record<string, any>) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.model.completion_params = newParams
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  // change to vision model to set vision enabled, else disabled
+  useEffect(() => {
+    if (!modelChanged)
+      return
+    setModelChanged(false)
+    handleVisionConfigAfterModelChanged()
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isVisionModel, modelChanged])
+
+  const handleQueryVarChange = useCallback((newVar: ValueSelector | string) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.query_variable_selector = newVar as ValueSelector
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  useEffect(() => {
+    const isReady = defaultConfig && Object.keys(defaultConfig).length > 0
+    if (isReady) {
+      let query_variable_selector: ValueSelector = []
+      if (isChatMode && inputs.query_variable_selector.length === 0 && startNodeId)
+        query_variable_selector = [startNodeId, 'sys.query']
+      setInputs({
+        ...inputs,
+        ...defaultConfig,
+        query_variable_selector: inputs.query_variable_selector.length > 0 ? inputs.query_variable_selector : query_variable_selector,
+      })
+    }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [defaultConfig])
+
+  const handleClassesChange = useCallback((newClasses: any) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.classes = newClasses
+      draft._targetBranches = newClasses
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const filterInputVar = useCallback((varPayload: Var) => {
+    return [VarType.number, VarType.string].includes(varPayload.type)
+  }, [])
+
+  const filterVisionInputVar = useCallback((varPayload: Var) => {
+    return [VarType.file, VarType.arrayFile].includes(varPayload.type)
+  }, [])
+
+  const {
+    availableVars,
+    availableNodesWithParent,
+  } = useAvailableVarList(id, {
+    onlyLeafNodeVar: false,
+    filterVar: filterInputVar,
+  })
+
+  const {
+    availableVars: availableVisionVars,
+  } = useAvailableVarList(id, {
+    onlyLeafNodeVar: false,
+    filterVar: filterVisionInputVar,
+  })
+
+  const hasSetBlockStatus = {
+    history: false,
+    query: isChatMode ? checkHasQueryBlock(inputs.instruction) : false,
+    context: false,
+  }
+
+  const handleInstructionChange = useCallback((instruction: string) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.instruction = instruction
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleMemoryChange = useCallback((memory?: Memory) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.memory = memory
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  // single run
+  const {
+    isShowSingleRun,
+    hideSingleRun,
+    getInputVars,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runInputData,
+    runInputDataRef,
+    setRunInputData,
+    runResult,
+  } = useOneStepRun<QuestionClassifierNodeType>({
+    id,
+    data: inputs,
+    defaultRunInputData: {
+      'query': '',
+      '#files#': [],
+    },
+  })
+
+  const query = runInputData.query
+  const setQuery = useCallback((newQuery: string) => {
+    setRunInputData({
+      ...runInputData,
+      query: newQuery,
+    })
+  }, [runInputData, setRunInputData])
+
+  const varInputs = getInputVars([inputs.instruction])
+  const inputVarValues = (() => {
+    const vars: Record<string, any> = {
+      query,
+    }
+    Object.keys(runInputData)
+      .forEach((key) => {
+        vars[key] = runInputData[key]
+      })
+    return vars
+  })()
+
+  const setInputVarValues = useCallback((newPayload: Record<string, any>) => {
+    setRunInputData(newPayload)
+  }, [setRunInputData])
+
+  const visionFiles = runInputData['#files#']
+  const setVisionFiles = useCallback((newFiles: any[]) => {
+    setRunInputData({
+      ...runInputDataRef.current,
+      '#files#': newFiles,
+    })
+  }, [runInputDataRef, setRunInputData])
+
+  const filterVar = useCallback((varPayload: Var) => {
+    return varPayload.type === VarType.string
+  }, [])
+
+  return {
+    readOnly,
+    inputs,
+    handleModelChanged,
+    isChatMode,
+    isChatModel,
+    handleCompletionParamsChange,
+    handleQueryVarChange,
+    filterVar,
+    handleTopicsChange: handleClassesChange,
+    hasSetBlockStatus,
+    availableVars,
+    availableNodesWithParent,
+    availableVisionVars,
+    handleInstructionChange,
+    varInputs,
+    inputVarValues,
+    setInputVarValues,
+    handleMemoryChange,
+    isVisionModel,
+    handleVisionResolutionEnabledChange,
+    handleVisionResolutionChange,
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    query,
+    setQuery,
+    runResult,
+    visionFiles,
+    setVisionFiles,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/question-classifier/utils.ts b/app/components/workflow/nodes/question-classifier/utils.ts
new file mode 100644
index 0000000..da9c115
--- /dev/null
+++ b/app/components/workflow/nodes/question-classifier/utils.ts
@@ -0,0 +1,3 @@
+export const checkNodeValid = () => {
+  return true
+}
diff --git a/app/components/workflow/nodes/start/components/var-item.tsx b/app/components/workflow/nodes/start/components/var-item.tsx
new file mode 100644
index 0000000..68dc141
--- /dev/null
+++ b/app/components/workflow/nodes/start/components/var-item.tsx
@@ -0,0 +1,103 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useRef } from 'react'
+import { useBoolean, useHover } from 'ahooks'
+import { useTranslation } from 'react-i18next'
+import {
+  RiDeleteBinLine,
+} from '@remixicon/react'
+import InputVarTypeIcon from '../../_base/components/input-var-type-icon'
+import type { InputVar, MoreInfo } from '@/app/components/workflow/types'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import { Edit03 } from '@/app/components/base/icons/src/vender/solid/general'
+import Badge from '@/app/components/base/badge'
+import ConfigVarModal from '@/app/components/app/configuration/config-var/config-modal'
+import { noop } from 'lodash-es'
+
+type Props = {
+  readonly: boolean
+  payload: InputVar
+  onChange?: (item: InputVar, moreInfo?: MoreInfo) => void
+  onRemove?: () => void
+  rightContent?: React.JSX.Element
+  varKeys?: string[]
+  showLegacyBadge?: boolean
+}
+
+const VarItem: FC<Props> = ({
+  readonly,
+  payload,
+  onChange = noop,
+  onRemove = noop,
+  rightContent,
+  varKeys = [],
+  showLegacyBadge = false,
+}) => {
+  const { t } = useTranslation()
+
+  const ref = useRef(null)
+  const isHovering = useHover(ref)
+  const [isShowEditVarModal, {
+    setTrue: showEditVarModal,
+    setFalse: hideEditVarModal,
+  }] = useBoolean(false)
+
+  const handlePayloadChange = useCallback((payload: InputVar, moreInfo?: MoreInfo) => {
+    onChange(payload, moreInfo)
+    hideEditVarModal()
+  }, [onChange, hideEditVarModal])
+  return (
+    <div ref={ref} className='flex h-8 cursor-pointer items-center justify-between rounded-lg border border-components-panel-border-subtle bg-components-panel-on-panel-item-bg px-2.5 shadow-xs hover:shadow-md'>
+      <div className='flex w-0 grow items-center space-x-1'>
+        <Variable02 className='h-3.5 w-3.5 text-text-accent' />
+        <div title={payload.variable} className='max-w-[130px] shrink-0 truncate text-[13px] font-medium text-text-secondary'>{payload.variable}</div>
+        {payload.label && (<><div className='shrink-0 text-xs font-medium text-text-quaternary'>路</div>
+          <div title={payload.label as string} className='max-w-[130px] truncate text-[13px] font-medium text-text-tertiary'>{payload.label as string}</div>
+        </>)}
+        {showLegacyBadge && (
+          <Badge
+            text='LEGACY'
+            className='shrink-0 border-text-accent-secondary text-text-accent-secondary'
+          />
+        )}
+      </div>
+      <div className='ml-2 flex shrink-0 items-center'>
+        {rightContent || (<>
+          {(!isHovering || readonly)
+            ? (
+              <>
+                {payload.required && (
+                  <div className='mr-2 text-xs font-normal text-text-tertiary'>{t('workflow.nodes.start.required')}</div>
+                )}
+                <InputVarTypeIcon type={payload.type} className='h-3.5 w-3.5 text-text-tertiary' />
+              </>
+            )
+            : (!readonly && (
+              <>
+                <div onClick={showEditVarModal} className='mr-1 cursor-pointer rounded-md p-1 hover:bg-state-base-hover'>
+                  <Edit03 className='h-4 w-4 text-text-tertiary' />
+                </div>
+                <div onClick={onRemove} className='group cursor-pointer rounded-md p-1 hover:bg-state-destructive-hover'>
+                  <RiDeleteBinLine className='h-4 w-4 text-text-tertiary group-hover:text-text-destructive' />
+                </div>
+              </>
+            ))}
+        </>)}
+
+      </div>
+      {
+        isShowEditVarModal && (
+          <ConfigVarModal
+            isShow
+            supportFile
+            payload={payload}
+            onClose={hideEditVarModal}
+            onConfirm={handlePayloadChange}
+            varKeys={varKeys}
+          />
+        )
+      }
+    </div>
+  )
+}
+export default React.memo(VarItem)
diff --git a/app/components/workflow/nodes/start/components/var-list.tsx b/app/components/workflow/nodes/start/components/var-list.tsx
new file mode 100644
index 0000000..7eccbec
--- /dev/null
+++ b/app/components/workflow/nodes/start/components/var-list.tsx
@@ -0,0 +1,70 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import produce from 'immer'
+import { useTranslation } from 'react-i18next'
+import VarItem from './var-item'
+import { ChangeType, type InputVar, type MoreInfo } from '@/app/components/workflow/types'
+type Props = {
+  readonly: boolean
+  list: InputVar[]
+  onChange: (list: InputVar[], moreInfo?: { index: number; payload: MoreInfo }) => void
+}
+
+const VarList: FC<Props> = ({
+  readonly,
+  list,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  const handleVarChange = useCallback((index: number) => {
+    return (payload: InputVar, moreInfo?: MoreInfo) => {
+      const newList = produce(list, (draft) => {
+        draft[index] = payload
+      })
+      onChange(newList, moreInfo ? { index, payload: moreInfo } : undefined)
+    }
+  }, [list, onChange])
+
+  const handleVarRemove = useCallback((index: number) => {
+    return () => {
+      const newList = produce(list, (draft) => {
+        draft.splice(index, 1)
+      })
+      onChange(newList, {
+        index,
+        payload: {
+          type: ChangeType.remove,
+          payload: {
+            beforeKey: list[index].variable,
+          },
+        },
+      })
+    }
+  }, [list, onChange])
+
+  if (list.length === 0) {
+    return (
+      <div className='flex h-[42px] items-center justify-center rounded-md bg-components-panel-bg text-xs font-normal leading-[18px] text-text-tertiary'>
+        {t('workflow.nodes.start.noVarTip')}
+      </div>
+    )
+  }
+
+  return (
+    <div className='space-y-1'>
+      {list.map((item, index) => (
+        <VarItem
+          key={index}
+          readonly={readonly}
+          payload={item}
+          onChange={handleVarChange(index)}
+          onRemove={handleVarRemove(index)}
+          varKeys={list.map(item => item.variable)}
+        />
+      ))}
+    </div>
+  )
+}
+export default React.memo(VarList)
diff --git a/app/components/workflow/nodes/start/default.ts b/app/components/workflow/nodes/start/default.ts
new file mode 100644
index 0000000..98f24c5
--- /dev/null
+++ b/app/components/workflow/nodes/start/default.ts
@@ -0,0 +1,23 @@
+import type { NodeDefault } from '../../types'
+import type { StartNodeType } from './types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+
+const nodeDefault: NodeDefault<StartNodeType> = {
+  defaultValue: {
+    variables: [],
+  },
+  getAvailablePrevNodes() {
+    return []
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid() {
+    return {
+      isValid: true,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/start/node.tsx b/app/components/workflow/nodes/start/node.tsx
new file mode 100644
index 0000000..7c02858
--- /dev/null
+++ b/app/components/workflow/nodes/start/node.tsx
@@ -0,0 +1,40 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import InputVarTypeIcon from '../_base/components/input-var-type-icon'
+import type { StartNodeType } from './types'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import type { NodeProps } from '@/app/components/workflow/types'
+const i18nPrefix = 'workflow.nodes.start'
+
+const Node: FC<NodeProps<StartNodeType>> = ({
+  data,
+}) => {
+  const { t } = useTranslation()
+  const { variables } = data
+
+  if (!variables.length)
+    return null
+
+  return (
+    <div className='mb-1 px-3 py-1'>
+      <div className='space-y-0.5'>
+        {variables.map(variable => (
+          <div key={variable.variable} className='flex h-6 items-center justify-between space-x-1 rounded-md  bg-workflow-block-parma-bg px-1'>
+            <div className='flex w-0 grow items-center space-x-1'>
+              <Variable02 className='h-3.5 w-3.5 shrink-0 text-text-accent' />
+              <span className='system-xs-regular w-0 grow truncate text-text-secondary'>{variable.variable}</span>
+            </div>
+
+            <div className='ml-1 flex items-center space-x-1'>
+              {variable.required && <span className='system-2xs-regular-uppercase text-text-tertiary'>{t(`${i18nPrefix}.required`)}</span>}
+              <InputVarTypeIcon type={variable.type} className='h-3 w-3 text-text-tertiary' />
+            </div>
+          </div>
+        ))}
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Node)
diff --git a/app/components/workflow/nodes/start/panel.tsx b/app/components/workflow/nodes/start/panel.tsx
new file mode 100644
index 0000000..eb04ecb
--- /dev/null
+++ b/app/components/workflow/nodes/start/panel.tsx
@@ -0,0 +1,184 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import RemoveEffectVarConfirm from '../_base/components/remove-effect-var-confirm'
+import VarList from './components/var-list'
+import VarItem from './components/var-item'
+import useConfig from './use-config'
+import type { StartNodeType } from './types'
+import Split from '@/app/components/workflow/nodes/_base/components/split'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import AddButton from '@/app/components/base/button/add-button'
+import ConfigVarModal from '@/app/components/app/configuration/config-var/config-modal'
+import type { InputVar, NodePanelProps } from '@/app/components/workflow/types'
+
+const i18nPrefix = 'workflow.nodes.start'
+
+const Panel: FC<NodePanelProps<StartNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+  const {
+    readOnly,
+    isChatMode,
+    inputs,
+    isShowAddVarModal,
+    showAddVarModal,
+    handleAddVariable,
+    hideAddVarModal,
+    handleVarListChange,
+    isShowRemoveVarConfirm,
+    hideRemoveVarConfirm,
+    onRemoveVarConfirm,
+  } = useConfig(id, data)
+
+  const handleAddVarConfirm = (payload: InputVar) => {
+    handleAddVariable(payload)
+    hideAddVarModal()
+  }
+
+  return (
+    <div className='mt-2'>
+      <div className='space-y-4 px-4 pb-2'>
+        <Field
+          title={t(`${i18nPrefix}.inputField`)}
+          operations={
+            !readOnly ? <AddButton onClick={showAddVarModal} /> : undefined
+          }
+        >
+          <>
+            <VarList
+              readonly={readOnly}
+              list={inputs.variables || []}
+              onChange={handleVarListChange}
+            />
+
+            <div className='mt-1 space-y-1'>
+              <Split className='my-2' />
+              {
+                isChatMode && (
+                  <VarItem
+                    readonly
+                    payload={{
+                      variable: 'sys.query',
+                    } as any}
+                    rightContent={
+                      <div className='text-xs font-normal text-text-tertiary'>
+                        String
+                      </div>
+                    }
+                  />)
+              }
+
+              <VarItem
+                readonly
+                showLegacyBadge={!isChatMode}
+                payload={{
+                  variable: 'sys.files',
+                } as any}
+                rightContent={
+                  <div className='text-xs font-normal text-text-tertiary'>
+                    Array[File]
+                  </div>
+                }
+              />
+              {
+                isChatMode && (
+                  <>
+                    <VarItem
+                      readonly
+                      payload={{
+                        variable: 'sys.dialogue_count',
+                      } as any}
+                      rightContent={
+                        <div className='text-xs font-normal text-text-tertiary'>
+                          Number
+                        </div>
+                      }
+                    />
+                    <VarItem
+                      readonly
+                      payload={{
+                        variable: 'sys.conversation_id',
+                      } as any}
+                      rightContent={
+                        <div className='text-xs font-normal text-text-tertiary'>
+                          String
+                        </div>
+                      }
+                    />
+                  </>
+                )
+              }
+              <VarItem
+                readonly
+                payload={{
+                  variable: 'sys.user_id',
+                } as any}
+                rightContent={
+                  <div className='text-xs font-normal text-text-tertiary'>
+                    String
+                  </div>
+                }
+              />
+              <VarItem
+                readonly
+                payload={{
+                  variable: 'sys.app_id',
+                } as any}
+                rightContent={
+                  <div className='text-xs font-normal text-text-tertiary'>
+                    String
+                  </div>
+                }
+              />
+              <VarItem
+                readonly
+                payload={{
+                  variable: 'sys.workflow_id',
+                } as any}
+                rightContent={
+                  <div className='text-xs font-normal text-text-tertiary'>
+                    String
+                  </div>
+                }
+              />
+              <VarItem
+                readonly
+                payload={{
+                  variable: 'sys.workflow_run_id',
+                } as any}
+                rightContent={
+                  <div className='text-xs font-normal text-text-tertiary'>
+                    String
+                  </div>
+                }
+              />
+            </div>
+
+          </>
+        </Field>
+      </div>
+
+      {isShowAddVarModal && (
+        <ConfigVarModal
+          isCreate
+          supportFile
+          isShow={isShowAddVarModal}
+          onClose={hideAddVarModal}
+          onConfirm={handleAddVarConfirm}
+          varKeys={inputs.variables.map(v => v.variable)}
+        />
+      )}
+
+      <RemoveEffectVarConfirm
+        isShow={isShowRemoveVarConfirm}
+        onCancel={hideRemoveVarConfirm}
+        onConfirm={onRemoveVarConfirm}
+      />
+    </div>
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/start/types.ts b/app/components/workflow/nodes/start/types.ts
new file mode 100644
index 0000000..18834b8
--- /dev/null
+++ b/app/components/workflow/nodes/start/types.ts
@@ -0,0 +1,5 @@
+import type { CommonNodeType, InputVar } from '@/app/components/workflow/types'
+
+export type StartNodeType = CommonNodeType & {
+  variables: InputVar[]
+}
diff --git a/app/components/workflow/nodes/start/use-config.ts b/app/components/workflow/nodes/start/use-config.ts
new file mode 100644
index 0000000..e30e8c2
--- /dev/null
+++ b/app/components/workflow/nodes/start/use-config.ts
@@ -0,0 +1,82 @@
+import { useCallback, useState } from 'react'
+import produce from 'immer'
+import { useBoolean } from 'ahooks'
+import type { StartNodeType } from './types'
+import { ChangeType } from '@/app/components/workflow/types'
+import type { InputVar, MoreInfo, ValueSelector } from '@/app/components/workflow/types'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import {
+  useIsChatMode,
+  useNodesReadOnly,
+  useWorkflow,
+} from '@/app/components/workflow/hooks'
+
+const useConfig = (id: string, payload: StartNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const { handleOutVarRenameChange, isVarUsedInNodes, removeUsedVarInNodes } = useWorkflow()
+  const isChatMode = useIsChatMode()
+
+  const { inputs, setInputs } = useNodeCrud<StartNodeType>(id, payload)
+
+  const [isShowAddVarModal, {
+    setTrue: showAddVarModal,
+    setFalse: hideAddVarModal,
+  }] = useBoolean(false)
+
+  const [isShowRemoveVarConfirm, {
+    setTrue: showRemoveVarConfirm,
+    setFalse: hideRemoveVarConfirm,
+  }] = useBoolean(false)
+  const [removedVar, setRemovedVar] = useState<ValueSelector>([])
+  const [removedIndex, setRemoveIndex] = useState(0)
+  const handleVarListChange = useCallback((newList: InputVar[], moreInfo?: { index: number; payload: MoreInfo }) => {
+    if (moreInfo?.payload?.type === ChangeType.remove) {
+      if (isVarUsedInNodes([id, moreInfo?.payload?.payload?.beforeKey || ''])) {
+        showRemoveVarConfirm()
+        setRemovedVar([id, moreInfo?.payload?.payload?.beforeKey || ''])
+        setRemoveIndex(moreInfo?.index as number)
+        return
+      }
+    }
+
+    const newInputs = produce(inputs, (draft: any) => {
+      draft.variables = newList
+    })
+    setInputs(newInputs)
+    if (moreInfo?.payload?.type === ChangeType.changeVarName) {
+      const changedVar = newList[moreInfo.index]
+      handleOutVarRenameChange(id, [id, inputs.variables[moreInfo.index].variable], [id, changedVar.variable])
+    }
+  }, [handleOutVarRenameChange, id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm])
+
+  const removeVarInNode = useCallback(() => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.variables.splice(removedIndex, 1)
+    })
+    setInputs(newInputs)
+    removeUsedVarInNodes(removedVar)
+    hideRemoveVarConfirm()
+  }, [hideRemoveVarConfirm, inputs, removeUsedVarInNodes, removedIndex, removedVar, setInputs])
+
+  const handleAddVariable = useCallback((payload: InputVar) => {
+    const newInputs = produce(inputs, (draft: StartNodeType) => {
+      draft.variables.push(payload)
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+  return {
+    readOnly,
+    isChatMode,
+    inputs,
+    isShowAddVarModal,
+    showAddVarModal,
+    hideAddVarModal,
+    handleVarListChange,
+    handleAddVariable,
+    isShowRemoveVarConfirm,
+    hideRemoveVarConfirm,
+    onRemoveVarConfirm: removeVarInNode,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/start/utils.ts b/app/components/workflow/nodes/start/utils.ts
new file mode 100644
index 0000000..037b52a
--- /dev/null
+++ b/app/components/workflow/nodes/start/utils.ts
@@ -0,0 +1,5 @@
+import type { StartNodeType } from './types'
+
+export const checkNodeValid = (payload: StartNodeType) => {
+  return true
+}
diff --git a/app/components/workflow/nodes/template-transform/default.ts b/app/components/workflow/nodes/template-transform/default.ts
new file mode 100644
index 0000000..c698680
--- /dev/null
+++ b/app/components/workflow/nodes/template-transform/default.ts
@@ -0,0 +1,38 @@
+import { BlockEnum } from '../../types'
+import type { NodeDefault } from '../../types'
+import type { TemplateTransformNodeType } from './types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+const i18nPrefix = 'workflow.errorMsg'
+
+const nodeDefault: NodeDefault<TemplateTransformNodeType> = {
+  defaultValue: {
+    variables: [],
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: TemplateTransformNodeType, t: any) {
+    let errorMessages = ''
+    const { template, variables } = payload
+
+    if (!errorMessages && variables.filter(v => !v.variable).length > 0)
+      errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variable`) })
+    if (!errorMessages && variables.filter(v => !v.value_selector.length).length > 0)
+      errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t(`${i18nPrefix}.fields.variableValue`) })
+    if (!errorMessages && !template)
+      errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: t('workflow.nodes.templateTransform.code') })
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/template-transform/node.tsx b/app/components/workflow/nodes/template-transform/node.tsx
new file mode 100644
index 0000000..e6925c4
--- /dev/null
+++ b/app/components/workflow/nodes/template-transform/node.tsx
@@ -0,0 +1,13 @@
+import type { FC } from 'react'
+import React from 'react'
+import type { TemplateTransformNodeType } from './types'
+import type { NodeProps } from '@/app/components/workflow/types'
+
+const Node: FC<NodeProps<TemplateTransformNodeType>> = () => {
+  return (
+    // No summary content
+    <div></div>
+  )
+}
+
+export default React.memo(Node)
diff --git a/app/components/workflow/nodes/template-transform/panel.tsx b/app/components/workflow/nodes/template-transform/panel.tsx
new file mode 100644
index 0000000..e120482
--- /dev/null
+++ b/app/components/workflow/nodes/template-transform/panel.tsx
@@ -0,0 +1,130 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiQuestionLine,
+} from '@remixicon/react'
+import { CodeLanguage } from '../code/types'
+import useConfig from './use-config'
+import type { TemplateTransformNodeType } from './types'
+import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list'
+import AddButton from '@/app/components/base/button/add-button'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import Split from '@/app/components/workflow/nodes/_base/components/split'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars'
+import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
+import type { NodePanelProps } from '@/app/components/workflow/types'
+import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
+import ResultPanel from '@/app/components/workflow/run/result-panel'
+
+const i18nPrefix = 'workflow.nodes.templateTransform'
+
+const Panel: FC<NodePanelProps<TemplateTransformNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    readOnly,
+    inputs,
+    availableVars,
+    handleVarListChange,
+    handleVarNameChange,
+    handleAddVariable,
+    handleAddEmptyVariable,
+    handleCodeChange,
+    filterVar,
+    // single run
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    varInputs,
+    inputVarValues,
+    setInputVarValues,
+    runResult,
+  } = useConfig(id, data)
+
+  return (
+    <div className='mt-2'>
+      <div className='space-y-4 px-4 pb-4'>
+
+        <Field
+          title={t(`${i18nPrefix}.inputVars`)}
+          operations={
+            !readOnly ? <AddButton onClick={handleAddEmptyVariable} /> : undefined
+          }
+        >
+          <VarList
+            nodeId={id}
+            readonly={readOnly}
+            list={inputs.variables}
+            onChange={handleVarListChange}
+            onVarNameChange={handleVarNameChange}
+            filterVar={filterVar}
+            isSupportFileVar={false}
+          />
+        </Field>
+        <Split />
+        <CodeEditor
+          availableVars={availableVars}
+          varList={inputs.variables}
+          onAddVar={handleAddVariable}
+          isInNode
+          readOnly={readOnly}
+          language={CodeLanguage.python3}
+          title={
+            <div className='uppercase'>{t(`${i18nPrefix}.code`)}</div>
+          }
+          headerRight={
+            <div className='flex items-center'>
+              <a
+                className='flex h-[18px] items-center space-x-0.5 text-xs font-normal text-text-tertiary'
+                href="https://jinja.palletsprojects.com/en/3.1.x/templates/"
+                target='_blank'>
+                <span>{t(`${i18nPrefix}.codeSupportTip`)}</span>
+                <RiQuestionLine className='h-3 w-3' />
+              </a>
+              <div className='mx-1.5 h-3 w-px bg-divider-regular'></div>
+            </div>
+          }
+          value={inputs.template}
+          onChange={handleCodeChange}
+        />
+      </div>
+      <Split />
+      <div>
+        <OutputVars>
+          <>
+            <VarItem
+              name='output'
+              type='string'
+              description={t(`${i18nPrefix}.outputVars.output`)}
+            />
+          </>
+        </OutputVars>
+      </div>
+      {isShowSingleRun && (
+        <BeforeRunForm
+          nodeName={inputs.title}
+          onHide={hideSingleRun}
+          forms={[
+            {
+              inputs: varInputs,
+              values: inputVarValues,
+              onChange: setInputVarValues,
+            },
+          ]}
+          runningStatus={runningStatus}
+          onRun={handleRun}
+          onStop={handleStop}
+          result={<ResultPanel {...runResult} showSteps={false} />}
+        />
+      )}
+    </div>
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/template-transform/types.ts b/app/components/workflow/nodes/template-transform/types.ts
new file mode 100644
index 0000000..6e4115e
--- /dev/null
+++ b/app/components/workflow/nodes/template-transform/types.ts
@@ -0,0 +1,6 @@
+import type { CommonNodeType, Variable } from '@/app/components/workflow/types'
+
+export type TemplateTransformNodeType = CommonNodeType & {
+  variables: Variable[]
+  template: string
+}
diff --git a/app/components/workflow/nodes/template-transform/use-config.ts b/app/components/workflow/nodes/template-transform/use-config.ts
new file mode 100644
index 0000000..e0c41ac
--- /dev/null
+++ b/app/components/workflow/nodes/template-transform/use-config.ts
@@ -0,0 +1,137 @@
+import { useCallback, useEffect, useRef } from 'react'
+import produce from 'immer'
+import useVarList from '../_base/hooks/use-var-list'
+import type { Var, Variable } from '../../types'
+import { VarType } from '../../types'
+import { useStore } from '../../store'
+import type { TemplateTransformNodeType } from './types'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run'
+import {
+  useNodesReadOnly,
+} from '@/app/components/workflow/hooks'
+import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
+
+const useConfig = (id: string, payload: TemplateTransformNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const defaultConfig = useStore(s => s.nodesDefaultConfigs)[payload.type]
+
+  const { inputs, setInputs: doSetInputs } = useNodeCrud<TemplateTransformNodeType>(id, payload)
+  const inputsRef = useRef(inputs)
+  const setInputs = useCallback((newPayload: TemplateTransformNodeType) => {
+    doSetInputs(newPayload)
+    inputsRef.current = newPayload
+  }, [doSetInputs])
+
+  const { availableVars } = useAvailableVarList(id, {
+    onlyLeafNodeVar: false,
+    filterVar: () => true,
+  })
+
+  const { handleAddVariable: handleAddEmptyVariable } = useVarList<TemplateTransformNodeType>({
+    inputs,
+    setInputs,
+  })
+
+  const handleVarListChange = useCallback((newList: Variable[]) => {
+    const newInputs = produce(inputsRef.current, (draft: any) => {
+      draft.variables = newList
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  const handleAddVariable = useCallback((payload: Variable) => {
+    const newInputs = produce(inputsRef.current, (draft: any) => {
+      draft.variables.push(payload)
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  // rename var in code
+  const handleVarNameChange = useCallback((oldName: string, newName: string) => {
+    const newInputs = produce(inputsRef.current, (draft: any) => {
+      draft.template = draft.template.replaceAll(`{{ ${oldName} }}`, `{{ ${newName} }}`)
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  useEffect(() => {
+    if (inputs.template)
+      return
+
+    const isReady = defaultConfig && Object.keys(defaultConfig).length > 0
+    if (isReady) {
+      setInputs({
+        ...inputs,
+        ...defaultConfig,
+      })
+    }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [defaultConfig])
+
+  const handleCodeChange = useCallback((template: string) => {
+    const newInputs = produce(inputsRef.current, (draft: any) => {
+      draft.template = template
+    })
+    setInputs(newInputs)
+  }, [setInputs])
+
+  // single run
+  const {
+    isShowSingleRun,
+    hideSingleRun,
+    toVarInputs,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runInputData,
+    setRunInputData,
+    runResult,
+  } = useOneStepRun<TemplateTransformNodeType>({
+    id,
+    data: inputs,
+    defaultRunInputData: {},
+  })
+  const varInputs = toVarInputs(inputs.variables)
+
+  const inputVarValues = (() => {
+    const vars: Record<string, any> = {}
+    Object.keys(runInputData)
+      .forEach((key) => {
+        vars[key] = runInputData[key]
+      })
+    return vars
+  })()
+
+  const setInputVarValues = useCallback((newPayload: Record<string, any>) => {
+    setRunInputData(newPayload)
+  }, [setRunInputData])
+
+  const filterVar = useCallback((varPayload: Var) => {
+    return [VarType.string, VarType.number, VarType.object, VarType.array, VarType.arrayNumber, VarType.arrayString, VarType.arrayObject].includes(varPayload.type)
+  }, [])
+
+  return {
+    readOnly,
+    inputs,
+    availableVars,
+    handleVarListChange,
+    handleVarNameChange,
+    handleAddVariable,
+    handleAddEmptyVariable,
+    handleCodeChange,
+    filterVar,
+    // single run
+    isShowSingleRun,
+    hideSingleRun,
+    runningStatus,
+    handleRun,
+    handleStop,
+    varInputs,
+    inputVarValues,
+    setInputVarValues,
+    runResult,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/template-transform/utils.ts b/app/components/workflow/nodes/template-transform/utils.ts
new file mode 100644
index 0000000..0ca4849
--- /dev/null
+++ b/app/components/workflow/nodes/template-transform/utils.ts
@@ -0,0 +1,5 @@
+import type { TemplateTransformNodeType } from './types'
+
+export const checkNodeValid = (payload: TemplateTransformNodeType) => {
+  return true
+}
diff --git a/app/components/workflow/nodes/tool/components/input-var-list.tsx b/app/components/workflow/nodes/tool/components/input-var-list.tsx
new file mode 100644
index 0000000..1a609c5
--- /dev/null
+++ b/app/components/workflow/nodes/tool/components/input-var-list.tsx
@@ -0,0 +1,247 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import produce from 'immer'
+import { useTranslation } from 'react-i18next'
+import type { ToolVarInputs } from '../types'
+import { VarType as VarKindType } from '../types'
+import cn from '@/utils/classnames'
+import type { ValueSelector, Var } from '@/app/components/workflow/types'
+import type { CredentialFormSchema } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import VarReferencePicker from '@/app/components/workflow/nodes/_base/components/variable/var-reference-picker'
+import Input from '@/app/components/workflow/nodes/_base/components/input-support-select-var'
+import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
+import { VarType } from '@/app/components/workflow/types'
+import AppSelector from '@/app/components/plugins/plugin-detail-panel/app-selector'
+import ModelParameterModal from '@/app/components/plugins/plugin-detail-panel/model-selector'
+import { noop } from 'lodash-es'
+
+type Props = {
+  readOnly: boolean
+  nodeId: string
+  schema: CredentialFormSchema[]
+  value: ToolVarInputs
+  onChange: (value: ToolVarInputs) => void
+  onOpen?: (index: number) => void
+  isSupportConstantValue?: boolean
+  filterVar?: (payload: Var, valueSelector: ValueSelector) => boolean
+}
+
+const InputVarList: FC<Props> = ({
+  readOnly,
+  nodeId,
+  schema,
+  value,
+  onChange,
+  onOpen = noop,
+  isSupportConstantValue,
+  filterVar,
+}) => {
+  const language = useLanguage()
+  const { t } = useTranslation()
+  const { availableVars, availableNodesWithParent } = useAvailableVarList(nodeId, {
+    onlyLeafNodeVar: false,
+    filterVar: (varPayload: Var) => {
+      return [VarType.string, VarType.number, VarType.secret].includes(varPayload.type)
+    },
+  })
+  const paramType = (type: string) => {
+    if (type === FormTypeEnum.textNumber)
+      return 'Number'
+    else if (type === FormTypeEnum.file || type === FormTypeEnum.files)
+      return 'Files'
+    else if (type === FormTypeEnum.appSelector)
+      return 'AppSelector'
+    else if (type === FormTypeEnum.modelSelector)
+      return 'ModelSelector'
+    else if (type === FormTypeEnum.toolSelector)
+      return 'ToolSelector'
+    else
+      return 'String'
+  }
+
+  const handleNotMixedTypeChange = useCallback((variable: string) => {
+    return (varValue: ValueSelector | string, varKindType: VarKindType) => {
+      const newValue = produce(value, (draft: ToolVarInputs) => {
+        const target = draft[variable]
+        if (target) {
+          target.type = varKindType
+          target.value = varValue
+        }
+        else {
+          draft[variable] = {
+            type: varKindType,
+            value: varValue,
+          }
+        }
+      })
+      onChange(newValue)
+    }
+  }, [value, onChange])
+
+  const handleMixedTypeChange = useCallback((variable: string) => {
+    return (itemValue: string) => {
+      const newValue = produce(value, (draft: ToolVarInputs) => {
+        const target = draft[variable]
+        if (target) {
+          target.value = itemValue
+        }
+        else {
+          draft[variable] = {
+            type: VarKindType.mixed,
+            value: itemValue,
+          }
+        }
+      })
+      onChange(newValue)
+    }
+  }, [value, onChange])
+
+  const handleFileChange = useCallback((variable: string) => {
+    return (varValue: ValueSelector | string) => {
+      const newValue = produce(value, (draft: ToolVarInputs) => {
+        draft[variable] = {
+          type: VarKindType.variable,
+          value: varValue,
+        }
+      })
+      onChange(newValue)
+    }
+  }, [value, onChange])
+
+  const handleAppChange = useCallback((variable: string) => {
+    return (app: {
+      app_id: string
+      inputs: Record<string, any>
+      files?: any[]
+    }) => {
+      const newValue = produce(value, (draft: ToolVarInputs) => {
+        draft[variable] = app as any
+      })
+      onChange(newValue)
+    }
+  }, [onChange, value])
+  const handleModelChange = useCallback((variable: string) => {
+    return (model: any) => {
+      const newValue = produce(value, (draft: ToolVarInputs) => {
+        draft[variable] = {
+          ...draft[variable],
+          ...model,
+        } as any
+      })
+      onChange(newValue)
+    }
+  }, [onChange, value])
+
+  const [inputsIsFocus, setInputsIsFocus] = useState<Record<string, boolean>>({})
+  const handleInputFocus = useCallback((variable: string) => {
+    return (value: boolean) => {
+      setInputsIsFocus((prev) => {
+        return {
+          ...prev,
+          [variable]: value,
+        }
+      })
+    }
+  }, [])
+  const handleOpen = useCallback((index: number) => {
+    return () => onOpen(index)
+  }, [onOpen])
+  return (
+    <div className='space-y-3'>
+      {
+        schema.map((schema, index) => {
+          const {
+            variable,
+            label,
+            type,
+            required,
+            tooltip,
+            scope,
+          } = schema
+          const varInput = value[variable]
+          const isNumber = type === FormTypeEnum.textNumber
+          const isSelect = type === FormTypeEnum.select
+          const isFile = type === FormTypeEnum.file || type === FormTypeEnum.files
+          const isAppSelector = type === FormTypeEnum.appSelector
+          const isModelSelector = type === FormTypeEnum.modelSelector
+          // const isToolSelector = type === FormTypeEnum.toolSelector
+          const isString = !isNumber && !isSelect && !isFile && !isAppSelector && !isModelSelector
+
+          return (
+            <div key={variable} className='space-y-1'>
+              <div className='flex h-[18px] items-center space-x-2'>
+                <span className='code-sm-semibold text-text-secondary'>{label[language] || label.en_US}</span>
+                <span className='system-xs-regular text-text-tertiary'>{paramType(type)}</span>
+                {required && <span className='system-xs-regular text-util-colors-orange-dark-orange-dark-600'>Required</span>}
+              </div>
+              {isString && (
+                <Input
+                  className={cn(inputsIsFocus[variable] ? 'border-components-input-border-active bg-components-input-bg-active shadow-xs' : 'border-components-input-border-hover bg-components-input-bg-normal', 'rounded-lg border px-3 py-[6px]')}
+                  value={varInput?.value as string || ''}
+                  onChange={handleMixedTypeChange(variable)}
+                  readOnly={readOnly}
+                  nodesOutputVars={availableVars}
+                  availableNodes={availableNodesWithParent}
+                  onFocusChange={handleInputFocus(variable)}
+                  placeholder={t('workflow.nodes.http.insertVarPlaceholder')!}
+                  placeholderClassName='!leading-[21px]'
+                />
+              )}
+              {(isNumber || isSelect) && (
+                <VarReferencePicker
+                  readonly={readOnly}
+                  isShowNodeName
+                  nodeId={nodeId}
+                  value={varInput?.type === VarKindType.constant ? (varInput?.value ?? '') : (varInput?.value ?? [])}
+                  onChange={handleNotMixedTypeChange(variable)}
+                  onOpen={handleOpen(index)}
+                  defaultVarKindType={varInput?.type || (isNumber ? VarKindType.constant : VarKindType.variable)}
+                  isSupportConstantValue={isSupportConstantValue}
+                  filterVar={isNumber ? filterVar : undefined}
+                  availableVars={isSelect ? availableVars : undefined}
+                  schema={schema}
+                />
+              )}
+              {isFile && (
+                <VarReferencePicker
+                  readonly={readOnly}
+                  isShowNodeName
+                  nodeId={nodeId}
+                  value={varInput?.value || []}
+                  onChange={handleFileChange(variable)}
+                  onOpen={handleOpen(index)}
+                  defaultVarKindType={VarKindType.variable}
+                  filterVar={(varPayload: Var) => varPayload.type === VarType.file || varPayload.type === VarType.arrayFile}
+                />
+              )}
+              {isAppSelector && (
+                <AppSelector
+                  disabled={readOnly}
+                  scope={scope || 'all'}
+                  value={varInput as any}
+                  onSelect={handleAppChange(variable)}
+                />
+              )}
+              {isModelSelector && (
+                <ModelParameterModal
+                  popupClassName='!w-[387px]'
+                  isAdvancedMode
+                  isInWorkflow
+                  value={varInput as any}
+                  setModel={handleModelChange(variable)}
+                  readonly={readOnly}
+                  scope={scope}
+                />
+              )}
+              {tooltip && <div className='body-xs-regular text-text-tertiary'>{tooltip[language] || tooltip.en_US}</div>}
+            </div>
+          )
+        })
+      }
+    </div>
+  )
+}
+export default React.memo(InputVarList)
diff --git a/app/components/workflow/nodes/tool/default.ts b/app/components/workflow/nodes/tool/default.ts
new file mode 100644
index 0000000..f245929
--- /dev/null
+++ b/app/components/workflow/nodes/tool/default.ts
@@ -0,0 +1,68 @@
+import { BlockEnum } from '../../types'
+import type { NodeDefault } from '../../types'
+import type { ToolNodeType } from './types'
+import { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+
+const i18nPrefix = 'workflow.errorMsg'
+
+const nodeDefault: NodeDefault<ToolNodeType> = {
+  defaultValue: {
+    tool_parameters: {},
+    tool_configurations: {},
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: ToolNodeType, t: any, moreDataForCheckValid: any) {
+    const { toolInputsSchema, toolSettingSchema, language, notAuthed } = moreDataForCheckValid
+    let errorMessages = ''
+    if (notAuthed)
+      errorMessages = t(`${i18nPrefix}.authRequired`)
+
+    if (!errorMessages) {
+      toolInputsSchema.filter((field: any) => {
+        return field.required
+      }).forEach((field: any) => {
+        const targetVar = payload.tool_parameters[field.variable]
+        if (!targetVar) {
+          errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: field.label })
+          return
+        }
+        const { type: variable_type, value } = targetVar
+        if (variable_type === VarKindType.variable) {
+          if (!errorMessages && (!value || value.length === 0))
+            errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: field.label })
+        }
+        else {
+          if (!errorMessages && (value === undefined || value === null || value === ''))
+            errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: field.label })
+        }
+      })
+    }
+
+    if (!errorMessages) {
+      toolSettingSchema.filter((field: any) => {
+        return field.required
+      }).forEach((field: any) => {
+        const value = payload.tool_configurations[field.variable]
+        if (!errorMessages && (value === undefined || value === null || value === ''))
+          errorMessages = t(`${i18nPrefix}.fieldRequired`, { field: field.label[language] })
+      })
+    }
+
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/tool/node.tsx b/app/components/workflow/nodes/tool/node.tsx
new file mode 100644
index 0000000..f3cb4d9
--- /dev/null
+++ b/app/components/workflow/nodes/tool/node.tsx
@@ -0,0 +1,53 @@
+import type { FC } from 'react'
+import React from 'react'
+import type { ToolNodeType } from './types'
+import type { NodeProps } from '@/app/components/workflow/types'
+import { FormTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+
+const Node: FC<NodeProps<ToolNodeType>> = ({
+  data,
+}) => {
+  const { tool_configurations, paramSchemas } = data
+  const toolConfigs = Object.keys(tool_configurations || {})
+
+  if (!toolConfigs.length)
+    return null
+
+  return (
+    <div className='mb-1 px-3 py-1'>
+      <div className='space-y-0.5'>
+        {toolConfigs.map((key, index) => (
+          <div key={index} className='flex h-6 items-center justify-between space-x-1 rounded-md  bg-workflow-block-parma-bg px-1 text-xs font-normal text-text-secondary'>
+            <div title={key} className='max-w-[100px] shrink-0 truncate text-xs font-medium uppercase text-text-tertiary'>
+              {key}
+            </div>
+            {typeof tool_configurations[key] === 'string' && (
+              <div title={tool_configurations[key]} className='w-0 shrink-0 grow truncate text-right text-xs font-normal text-text-secondary'>
+                {paramSchemas?.find(i => i.name === key)?.type === FormTypeEnum.secretInput ? '********' : tool_configurations[key]}
+              </div>
+            )}
+            {typeof tool_configurations[key] === 'number' && (
+              <div title={tool_configurations[key].toString()} className='w-0 shrink-0 grow truncate text-right text-xs font-normal text-text-secondary'>
+                {tool_configurations[key]}
+              </div>
+            )}
+            {typeof tool_configurations[key] !== 'string' && tool_configurations[key]?.type === FormTypeEnum.modelSelector && (
+              <div title={tool_configurations[key].model} className='w-0 shrink-0 grow truncate text-right text-xs font-normal text-text-secondary'>
+                {tool_configurations[key].model}
+              </div>
+            )}
+            {/* {typeof tool_configurations[key] !== 'string' && tool_configurations[key]?.type === FormTypeEnum.appSelector && (
+              <div title={tool_configurations[key].app_id} className='grow w-0 shrink-0 truncate text-right text-xs font-normal text-gray-700'>
+                {tool_configurations[key].app_id}
+              </div>
+            )} */}
+          </div>
+
+        ))}
+
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(Node)
diff --git a/app/components/workflow/nodes/tool/panel.tsx b/app/components/workflow/nodes/tool/panel.tsx
new file mode 100644
index 0000000..8596644
--- /dev/null
+++ b/app/components/workflow/nodes/tool/panel.tsx
@@ -0,0 +1,202 @@
+import type { FC } from 'react'
+import React, { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import Split from '../_base/components/split'
+import type { ToolNodeType } from './types'
+import useConfig from './use-config'
+import InputVarList from './components/input-var-list'
+import Button from '@/app/components/base/button'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import type { NodePanelProps } from '@/app/components/workflow/types'
+import Form from '@/app/components/header/account-setting/model-provider-page/model-modal/Form'
+import ConfigCredential from '@/app/components/tools/setting/build-in/config-credentials'
+import Loading from '@/app/components/base/loading'
+import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
+import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
+import ResultPanel from '@/app/components/workflow/run/result-panel'
+import { useToolIcon } from '@/app/components/workflow/hooks'
+import { useLogs } from '@/app/components/workflow/run/hooks'
+import formatToTracingNodeList from '@/app/components/workflow/run/utils/format-log'
+import StructureOutputItem from '@/app/components/workflow/nodes/_base/components/variable/object-child-tree-panel/show'
+import { Type } from '../llm/types'
+
+const i18nPrefix = 'workflow.nodes.tool'
+
+const Panel: FC<NodePanelProps<ToolNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    readOnly,
+    inputs,
+    toolInputVarSchema,
+    setInputVar,
+    handleOnVarOpen,
+    filterVar,
+    toolSettingSchema,
+    toolSettingValue,
+    setToolSettingValue,
+    currCollection,
+    isShowAuthBtn,
+    showSetAuth,
+    showSetAuthModal,
+    hideSetAuthModal,
+    handleSaveAuth,
+    isLoading,
+    isShowSingleRun,
+    hideSingleRun,
+    singleRunForms,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runResult,
+    outputSchema,
+    hasObjectOutput,
+  } = useConfig(id, data)
+  const toolIcon = useToolIcon(data)
+  const logsParams = useLogs()
+  const nodeInfo = useMemo(() => {
+    if (!runResult)
+      return null
+    return formatToTracingNodeList([runResult], t)[0]
+  }, [runResult, t])
+
+  if (isLoading) {
+    return <div className='flex h-[200px] items-center justify-center'>
+      <Loading />
+    </div>
+  }
+
+  return (
+    <div className='pt-2'>
+      {!readOnly && isShowAuthBtn && (
+        <>
+          <div className='px-4'>
+            <Button
+              variant='primary'
+              className='w-full'
+              onClick={showSetAuthModal}
+            >
+              {t(`${i18nPrefix}.toAuthorize`)}
+            </Button>
+          </div>
+        </>
+      )}
+      {!isShowAuthBtn && <>
+        <div className='space-y-4 px-4'>
+          {toolInputVarSchema.length > 0 && (
+            <Field
+              title={t(`${i18nPrefix}.inputVars`)}
+            >
+              <InputVarList
+                readOnly={readOnly}
+                nodeId={id}
+                schema={toolInputVarSchema as any}
+                value={inputs.tool_parameters}
+                onChange={setInputVar}
+                filterVar={filterVar}
+                isSupportConstantValue
+                onOpen={handleOnVarOpen}
+              />
+            </Field>
+          )}
+
+          {toolInputVarSchema.length > 0 && toolSettingSchema.length > 0 && (
+            <Split />
+          )}
+
+          <Form
+            className='space-y-4'
+            itemClassName='!py-0'
+            fieldLabelClassName='!text-[13px] !font-semibold !text-text-secondary uppercase'
+            value={toolSettingValue}
+            onChange={setToolSettingValue}
+            formSchemas={toolSettingSchema as any}
+            isEditMode={false}
+            showOnVariableMap={{}}
+            validating={false}
+            // inputClassName='!bg-gray-50'
+            readonly={readOnly}
+          />
+        </div>
+      </>}
+
+      {showSetAuth && (
+        <ConfigCredential
+          collection={currCollection!}
+          onCancel={hideSetAuthModal}
+          onSaved={handleSaveAuth}
+          isHideRemoveBtn
+        />
+      )}
+
+      <div>
+        <OutputVars>
+          <>
+            <VarItem
+              name='text'
+              type='string'
+              description={t(`${i18nPrefix}.outputVars.text`)}
+              isIndent={hasObjectOutput}
+            />
+            <VarItem
+              name='files'
+              type='array[file]'
+              description={t(`${i18nPrefix}.outputVars.files.title`)}
+              isIndent={hasObjectOutput}
+            />
+            <VarItem
+              name='json'
+              type='array[object]'
+              description={t(`${i18nPrefix}.outputVars.json`)}
+              isIndent={hasObjectOutput}
+            />
+            {outputSchema.map(outputItem => (
+              <div key={outputItem.name}>
+                {outputItem.value?.type === 'object' ? (
+                  <StructureOutputItem
+                    rootClassName='code-sm-semibold text-text-secondary'
+                    payload={{
+                      schema: {
+                        type: Type.object,
+                        properties: {
+                          [outputItem.name]: outputItem.value,
+                        },
+                        additionalProperties: false,
+                      },
+                    }} />
+                ) : (
+                  <VarItem
+                    name={outputItem.name}
+                    type={outputItem.type.toLocaleLowerCase()}
+                    description={outputItem.description}
+                    isIndent={hasObjectOutput}
+                  />
+                )}
+              </div>
+            ))}
+          </>
+        </OutputVars>
+      </div>
+
+      {isShowSingleRun && (
+        <BeforeRunForm
+          nodeName={inputs.title}
+          nodeType={inputs.type}
+          toolIcon={toolIcon}
+          onHide={hideSingleRun}
+          forms={singleRunForms}
+          runningStatus={runningStatus}
+          onRun={handleRun}
+          onStop={handleStop}
+          {...logsParams}
+          result={<ResultPanel {...runResult} showSteps={false} {...logsParams} nodeInfo={nodeInfo} />}
+        />
+      )}
+    </div>
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/tool/types.ts b/app/components/workflow/nodes/tool/types.ts
new file mode 100644
index 0000000..4b78c53
--- /dev/null
+++ b/app/components/workflow/nodes/tool/types.ts
@@ -0,0 +1,25 @@
+import type { CollectionType } from '@/app/components/tools/types'
+import type { CommonNodeType, ValueSelector } from '@/app/components/workflow/types'
+
+export enum VarType {
+  variable = 'variable',
+  constant = 'constant',
+  mixed = 'mixed',
+}
+
+export type ToolVarInputs = Record<string, {
+  type: VarType
+  value?: string | ValueSelector | any
+}>
+
+export type ToolNodeType = CommonNodeType & {
+  provider_id: string
+  provider_type: CollectionType
+  provider_name: string
+  tool_name: string
+  tool_label: string
+  tool_parameters: ToolVarInputs
+  tool_configurations: Record<string, any>
+  output_schema: Record<string, any>
+  paramSchemas?: Record<string, any>[]
+}
diff --git a/app/components/workflow/nodes/tool/use-config.ts b/app/components/workflow/nodes/tool/use-config.ts
new file mode 100644
index 0000000..38ca5b5
--- /dev/null
+++ b/app/components/workflow/nodes/tool/use-config.ts
@@ -0,0 +1,325 @@
+import { useCallback, useEffect, useMemo, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { useBoolean } from 'ahooks'
+import { useStore } from '../../store'
+import { type ToolNodeType, type ToolVarInputs, VarType } from './types'
+import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+import { CollectionType } from '@/app/components/tools/types'
+import { updateBuiltInToolCredential } from '@/service/tools'
+import { addDefaultValue, toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
+import Toast from '@/app/components/base/toast'
+import type { Props as FormProps } from '@/app/components/workflow/nodes/_base/components/before-run-form/form'
+import { VarType as VarVarType } from '@/app/components/workflow/types'
+import type { InputVar, ValueSelector, Var } from '@/app/components/workflow/types'
+import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run'
+import {
+  useFetchToolsData,
+  useNodesReadOnly,
+} from '@/app/components/workflow/hooks'
+import { canFindTool } from '@/utils'
+
+const useConfig = (id: string, payload: ToolNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const { handleFetchAllTools } = useFetchToolsData()
+  const { t } = useTranslation()
+
+  const language = useLanguage()
+  const { inputs, setInputs: doSetInputs } = useNodeCrud<ToolNodeType>(id, payload)
+  /*
+  * tool_configurations: tool setting, not dynamic setting
+  * tool_parameters: tool dynamic setting(by user)
+  * output_schema: tool dynamic output
+  */
+  const { provider_id, provider_type, tool_name, tool_configurations, output_schema } = inputs
+  const isBuiltIn = provider_type === CollectionType.builtIn
+  const buildInTools = useStore(s => s.buildInTools)
+  const customTools = useStore(s => s.customTools)
+  const workflowTools = useStore(s => s.workflowTools)
+
+  const currentTools = (() => {
+    switch (provider_type) {
+      case CollectionType.builtIn:
+        return buildInTools
+      case CollectionType.custom:
+        return customTools
+      case CollectionType.workflow:
+        return workflowTools
+      default:
+        return []
+    }
+  })()
+  const currCollection = currentTools.find(item => canFindTool(item.id, provider_id))
+
+  // Auth
+  const needAuth = !!currCollection?.allow_delete
+  const isAuthed = !!currCollection?.is_team_authorization
+  const isShowAuthBtn = isBuiltIn && needAuth && !isAuthed
+  const [showSetAuth, {
+    setTrue: showSetAuthModal,
+    setFalse: hideSetAuthModal,
+  }] = useBoolean(false)
+
+  const handleSaveAuth = useCallback(async (value: any) => {
+    await updateBuiltInToolCredential(currCollection?.name as string, value)
+
+    Toast.notify({
+      type: 'success',
+      message: t('common.api.actionSuccess'),
+    })
+    handleFetchAllTools(provider_type)
+    hideSetAuthModal()
+  }, [currCollection?.name, hideSetAuthModal, t, handleFetchAllTools, provider_type])
+
+  const currTool = currCollection?.tools.find(tool => tool.name === tool_name)
+  const formSchemas = useMemo(() => {
+    return currTool ? toolParametersToFormSchemas(currTool.parameters) : []
+  }, [currTool])
+  const toolInputVarSchema = formSchemas.filter((item: any) => item.form === 'llm')
+  // use setting
+  const toolSettingSchema = formSchemas.filter((item: any) => item.form !== 'llm')
+  const hasShouldTransferTypeSettingInput = toolSettingSchema.some(item => item.type === 'boolean' || item.type === 'number-input')
+
+  const setInputs = useCallback((value: ToolNodeType) => {
+    if (!hasShouldTransferTypeSettingInput) {
+      doSetInputs(value)
+      return
+    }
+    const newInputs = produce(value, (draft) => {
+      const newConfig = { ...draft.tool_configurations }
+      Object.keys(draft.tool_configurations).forEach((key) => {
+        const schema = formSchemas.find(item => item.variable === key)
+        const value = newConfig[key]
+        if (schema?.type === 'boolean') {
+          if (typeof value === 'string')
+            newConfig[key] = Number.parseInt(value, 10)
+
+          if (typeof value === 'boolean')
+            newConfig[key] = value ? 1 : 0
+        }
+
+        if (schema?.type === 'number-input') {
+          if (typeof value === 'string' && value !== '')
+            newConfig[key] = Number.parseFloat(value)
+        }
+      })
+      draft.tool_configurations = newConfig
+    })
+    doSetInputs(newInputs)
+  }, [doSetInputs, formSchemas, hasShouldTransferTypeSettingInput])
+  const [notSetDefaultValue, setNotSetDefaultValue] = useState(false)
+  const toolSettingValue = (() => {
+    if (notSetDefaultValue)
+      return tool_configurations
+
+    return addDefaultValue(tool_configurations, toolSettingSchema)
+  })()
+  const setToolSettingValue = useCallback((value: Record<string, any>) => {
+    setNotSetDefaultValue(true)
+    setInputs({
+      ...inputs,
+      tool_configurations: value,
+    })
+  }, [inputs, setInputs])
+
+  useEffect(() => {
+    if (!currTool)
+      return
+    const inputsWithDefaultValue = produce(inputs, (draft) => {
+      if (!draft.tool_configurations || Object.keys(draft.tool_configurations).length === 0)
+        draft.tool_configurations = addDefaultValue(tool_configurations, toolSettingSchema)
+
+      if (!draft.tool_parameters)
+        draft.tool_parameters = {}
+    })
+    setInputs(inputsWithDefaultValue)
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [currTool])
+
+  // setting when call
+  const setInputVar = useCallback((value: ToolVarInputs) => {
+    setInputs({
+      ...inputs,
+      tool_parameters: value,
+    })
+  }, [inputs, setInputs])
+
+  const [currVarIndex, setCurrVarIndex] = useState(-1)
+  const currVarType = toolInputVarSchema[currVarIndex]?._type
+  const handleOnVarOpen = useCallback((index: number) => {
+    setCurrVarIndex(index)
+  }, [])
+
+  const filterVar = useCallback((varPayload: Var) => {
+    if (currVarType)
+      return varPayload.type === currVarType
+
+    return varPayload.type !== VarVarType.arrayFile
+  }, [currVarType])
+
+  const isLoading = currTool && (isBuiltIn ? !currCollection : false)
+
+  // single run
+  const [inputVarValues, doSetInputVarValues] = useState<Record<string, any>>({})
+  const setInputVarValues = (value: Record<string, any>) => {
+    doSetInputVarValues(value)
+    // eslint-disable-next-line ts/no-use-before-define
+    setRunInputData(value)
+  }
+  // fill single run form variable with constant value first time
+  const inputVarValuesWithConstantValue = () => {
+    const res = produce(inputVarValues, (draft) => {
+      Object.keys(inputs.tool_parameters).forEach((key: string) => {
+        const { type, value } = inputs.tool_parameters[key]
+        if (type === VarType.constant && (value === undefined || value === null))
+          draft.tool_parameters[key].value = value
+      })
+    })
+    return res
+  }
+
+  const {
+    isShowSingleRun,
+    hideSingleRun,
+    getInputVars,
+    runningStatus,
+    setRunInputData,
+    handleRun: doHandleRun,
+    handleStop,
+    runResult,
+  } = useOneStepRun<ToolNodeType>({
+    id,
+    data: inputs,
+    defaultRunInputData: {},
+    moreDataForCheckValid: {
+      toolInputsSchema: (() => {
+        const formInputs: InputVar[] = []
+        toolInputVarSchema.forEach((item: any) => {
+          formInputs.push({
+            label: item.label[language] || item.label.en_US,
+            variable: item.variable,
+            type: item.type,
+            required: item.required,
+          })
+        })
+        return formInputs
+      })(),
+      notAuthed: isShowAuthBtn,
+      toolSettingSchema,
+      language,
+    },
+  })
+
+  const hadVarParams = Object.keys(inputs.tool_parameters)
+    .filter(key => inputs.tool_parameters[key].type !== VarType.constant)
+    .map(k => inputs.tool_parameters[k])
+
+  const varInputs = getInputVars(hadVarParams.map((p) => {
+    if (p.type === VarType.variable) {
+      // handle the old wrong value not crash the page
+      if (!(p.value as any).join)
+        return `{{#${p.value}#}}`
+
+      return `{{#${(p.value as ValueSelector).join('.')}#}}`
+    }
+
+    return p.value as string
+  }))
+
+  const singleRunForms = (() => {
+    const forms: FormProps[] = [{
+      inputs: varInputs,
+      values: inputVarValuesWithConstantValue(),
+      onChange: setInputVarValues,
+    }]
+    return forms
+  })()
+
+  const handleRun = (submitData: Record<string, any>) => {
+    const varTypeInputKeys = Object.keys(inputs.tool_parameters)
+      .filter(key => inputs.tool_parameters[key].type === VarType.variable)
+    const shouldAdd = varTypeInputKeys.length > 0
+    if (!shouldAdd) {
+      doHandleRun(submitData)
+      return
+    }
+    const addMissedVarData = { ...submitData }
+    Object.keys(submitData).forEach((key) => {
+      const value = submitData[key]
+      varTypeInputKeys.forEach((inputKey) => {
+        const inputValue = inputs.tool_parameters[inputKey].value as ValueSelector
+        if (`#${inputValue.join('.')}#` === key)
+          addMissedVarData[inputKey] = value
+      })
+    })
+    doHandleRun(addMissedVarData)
+  }
+
+  const outputSchema = useMemo(() => {
+    const res: any[] = []
+    if (!output_schema)
+      return []
+    Object.keys(output_schema.properties).forEach((outputKey) => {
+      const output = output_schema.properties[outputKey]
+      const type = output.type
+      if (type === 'object') {
+        res.push({
+          name: outputKey,
+          value: output,
+        })
+      }
+      else {
+        res.push({
+          name: outputKey,
+          type: output.type === 'array'
+            ? `Array[${output.items?.type.slice(0, 1).toLocaleUpperCase()}${output.items?.type.slice(1)}]`
+            : `${output.type.slice(0, 1).toLocaleUpperCase()}${output.type.slice(1)}`,
+          description: output.description,
+        })
+      }
+    })
+    return res
+  }, [output_schema])
+
+  const hasObjectOutput = useMemo(() => {
+    if (!output_schema)
+      return false
+    const properties = output_schema.properties
+    return Object.keys(properties).some(key => properties[key].type === 'object')
+  }, [output_schema])
+
+  return {
+    readOnly,
+    inputs,
+    currTool,
+    toolSettingSchema,
+    toolSettingValue,
+    setToolSettingValue,
+    toolInputVarSchema,
+    setInputVar,
+    handleOnVarOpen,
+    filterVar,
+    currCollection,
+    isShowAuthBtn,
+    showSetAuth,
+    showSetAuthModal,
+    hideSetAuthModal,
+    handleSaveAuth,
+    isLoading,
+    isShowSingleRun,
+    hideSingleRun,
+    inputVarValues,
+    varInputs,
+    setInputVarValues,
+    singleRunForms,
+    runningStatus,
+    handleRun,
+    handleStop,
+    runResult,
+    outputSchema,
+    hasObjectOutput,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/tool/utils.ts b/app/components/workflow/nodes/tool/utils.ts
new file mode 100644
index 0000000..5ef2c53
--- /dev/null
+++ b/app/components/workflow/nodes/tool/utils.ts
@@ -0,0 +1,5 @@
+import type { ToolNodeType } from './types'
+
+export const checkNodeValid = (payload: ToolNodeType) => {
+  return true
+}
diff --git a/app/components/workflow/nodes/utils.ts b/app/components/workflow/nodes/utils.ts
new file mode 100644
index 0000000..262dde6
--- /dev/null
+++ b/app/components/workflow/nodes/utils.ts
@@ -0,0 +1,30 @@
+import type {
+  NodeOutPutVar,
+  ValueSelector,
+} from '@/app/components/workflow/types'
+import { InputVarType } from '@/app/components/workflow/types'
+
+export const findVariableWhenOnLLMVision = (valueSelector: ValueSelector, availableVars: NodeOutPutVar[]) => {
+  const currentVariableNode = availableVars.find((availableVar) => {
+    if (valueSelector[0] === 'sys' && availableVar.isStartNode)
+      return true
+
+    return valueSelector[0] === availableVar.nodeId
+  })
+  const currentVariable = currentVariableNode?.vars.find((variable) => {
+    if (valueSelector[0] === 'sys' && variable.variable === `sys.${valueSelector[1]}`)
+      return true
+    return variable.variable === valueSelector[1]
+  })
+
+  let formType = ''
+  if (currentVariable?.type === 'array[file]')
+    formType = InputVarType.multiFiles
+  if (currentVariable?.type === 'file')
+    formType = InputVarType.singleFile
+
+  return currentVariable && {
+    ...currentVariable,
+    formType,
+  }
+}
diff --git a/app/components/workflow/nodes/variable-assigner/components/add-variable/index.tsx b/app/components/workflow/nodes/variable-assigner/components/add-variable/index.tsx
new file mode 100644
index 0000000..09f4454
--- /dev/null
+++ b/app/components/workflow/nodes/variable-assigner/components/add-variable/index.tsx
@@ -0,0 +1,89 @@
+import {
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import { useVariableAssigner } from '../../hooks'
+import type { VariableAssignerNodeType } from '../../types'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { Plus02 } from '@/app/components/base/icons/src/vender/line/general'
+import AddVariablePopup from '@/app/components/workflow/nodes/_base/components/add-variable-popup'
+import type {
+  NodeOutPutVar,
+  ValueSelector,
+  Var,
+} from '@/app/components/workflow/types'
+
+export type AddVariableProps = {
+  variableAssignerNodeId: string
+  variableAssignerNodeData: VariableAssignerNodeType
+  availableVars: NodeOutPutVar[]
+  handleId?: string
+}
+const AddVariable = ({
+  availableVars,
+  variableAssignerNodeId,
+  variableAssignerNodeData,
+  handleId,
+}: AddVariableProps) => {
+  const [open, setOpen] = useState(false)
+  const { handleAssignVariableValueChange } = useVariableAssigner()
+
+  const handleSelectVariable = useCallback((v: ValueSelector, varDetail: Var) => {
+    handleAssignVariableValueChange(
+      variableAssignerNodeId,
+      v,
+      varDetail,
+      handleId,
+    )
+    setOpen(false)
+  }, [handleAssignVariableValueChange, variableAssignerNodeId, handleId, setOpen])
+
+  return (
+    <div className={cn(
+      open && '!flex',
+      variableAssignerNodeData.selected && '!flex',
+    )}>
+      <PortalToFollowElem
+        placement={'right'}
+        offset={4}
+        open={open}
+        onOpenChange={setOpen}
+      >
+        <PortalToFollowElemTrigger
+          onClick={() => setOpen(!open)}
+        >
+          <div
+            className={cn(
+              'group/addvariable flex items-center justify-center',
+              'h-4 w-4 cursor-pointer',
+              'hover:rounded-full hover:bg-primary-600',
+              open && '!rounded-full !bg-primary-600',
+            )}
+          >
+            <Plus02
+              className={cn(
+                'h-2.5 w-2.5 text-text-tertiary',
+                'group-hover/addvariable:text-text-primary',
+                open && '!text-text-primary',
+              )}
+            />
+          </div>
+        </PortalToFollowElemTrigger>
+        <PortalToFollowElemContent className='z-[1000]'>
+          <AddVariablePopup
+            onSelect={handleSelectVariable}
+            availableVars={availableVars}
+          />
+        </PortalToFollowElemContent>
+      </PortalToFollowElem>
+    </div>
+  )
+}
+
+export default memo(AddVariable)
diff --git a/app/components/workflow/nodes/variable-assigner/components/node-group-item.tsx b/app/components/workflow/nodes/variable-assigner/components/node-group-item.tsx
new file mode 100644
index 0000000..e6984b9
--- /dev/null
+++ b/app/components/workflow/nodes/variable-assigner/components/node-group-item.tsx
@@ -0,0 +1,151 @@
+import {
+  memo,
+  useMemo,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { useNodes } from 'reactflow'
+import { useStore } from '../../../store'
+import { BlockEnum } from '../../../types'
+import type {
+  Node,
+  ValueSelector,
+  VarType,
+} from '../../../types'
+import type { VariableAssignerNodeType } from '../types'
+import {
+  useGetAvailableVars,
+  useVariableAssigner,
+} from '../hooks'
+import { filterVar } from '../utils'
+import AddVariable from './add-variable'
+import NodeVariableItem from './node-variable-item'
+import { isConversationVar, isENV, isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+import cn from '@/utils/classnames'
+import { isExceptionVariable } from '@/app/components/workflow/utils'
+
+const i18nPrefix = 'workflow.nodes.variableAssigner'
+type GroupItem = {
+  groupEnabled: boolean
+  targetHandleId: string
+  title: string
+  type: string
+  variables: ValueSelector[]
+  variableAssignerNodeId: string
+  variableAssignerNodeData: VariableAssignerNodeType
+}
+type NodeGroupItemProps = {
+  item: GroupItem
+}
+const NodeGroupItem = ({
+  item,
+}: NodeGroupItemProps) => {
+  const { t } = useTranslation()
+  const enteringNodePayload = useStore(s => s.enteringNodePayload)
+  const hoveringAssignVariableGroupId = useStore(s => s.hoveringAssignVariableGroupId)
+  const nodes: Node[] = useNodes()
+  const {
+    handleGroupItemMouseEnter,
+    handleGroupItemMouseLeave,
+  } = useVariableAssigner()
+  const getAvailableVars = useGetAvailableVars()
+  const groupEnabled = item.groupEnabled
+  const outputType = useMemo(() => {
+    if (!groupEnabled)
+      return item.variableAssignerNodeData.output_type
+
+    const group = item.variableAssignerNodeData.advanced_settings?.groups.find(group => group.groupId === item.targetHandleId)
+    return group?.output_type || ''
+  }, [item.variableAssignerNodeData, item.targetHandleId, groupEnabled])
+  const availableVars = getAvailableVars(item.variableAssignerNodeId, item.targetHandleId, filterVar(outputType as VarType), true)
+  const showSelectionBorder = useMemo(() => {
+    if (groupEnabled && enteringNodePayload?.nodeId === item.variableAssignerNodeId) {
+      if (hoveringAssignVariableGroupId)
+        return hoveringAssignVariableGroupId !== item.targetHandleId
+      else
+        return enteringNodePayload?.nodeData.advanced_settings?.groups[0].groupId !== item.targetHandleId
+    }
+
+    return false
+  }, [enteringNodePayload, groupEnabled, hoveringAssignVariableGroupId, item.targetHandleId, item.variableAssignerNodeId])
+  const showSelectedBorder = useMemo(() => {
+    if (groupEnabled && enteringNodePayload?.nodeId === item.variableAssignerNodeId) {
+      if (hoveringAssignVariableGroupId)
+        return hoveringAssignVariableGroupId === item.targetHandleId
+      else
+        return enteringNodePayload?.nodeData.advanced_settings?.groups[0].groupId === item.targetHandleId
+    }
+
+    return false
+  }, [enteringNodePayload, groupEnabled, hoveringAssignVariableGroupId, item.targetHandleId, item.variableAssignerNodeId])
+
+  return (
+    <div
+      className={cn(
+        'relative rounded-lg border-[1.5px] border-transparent px-1.5 pb-1.5 pt-1',
+        showSelectionBorder && '!border-dashed !border-divider-subtle bg-state-base-hover',
+        showSelectedBorder && '!border-text-accent !bg-util-colors-blue-blue-50',
+      )}
+      onMouseEnter={() => groupEnabled && handleGroupItemMouseEnter(item.targetHandleId)}
+      onMouseLeave={handleGroupItemMouseLeave}
+    >
+      <div className='flex h-4 items-center justify-between text-[10px] font-medium text-text-tertiary'>
+        <span
+          className={cn(
+            'grow truncate uppercase',
+            showSelectedBorder && 'text-text-accent',
+          )}
+          title={item.title}
+        >
+          {item.title}
+        </span>
+        <div className='flex items-center'>
+          <span className='ml-2 shrink-0'>{item.type}</span>
+          <div className='ml-2 mr-1 h-2.5 w-[1px] bg-divider-regular'></div>
+          <AddVariable
+            availableVars={availableVars}
+            variableAssignerNodeId={item.variableAssignerNodeId}
+            variableAssignerNodeData={item.variableAssignerNodeData}
+            handleId={item.targetHandleId}
+          />
+        </div>
+      </div>
+      {
+        !item.variables.length && (
+          <div
+            className={cn(
+              'relative flex h-[22px] items-center justify-between space-x-1 rounded-md bg-workflow-block-parma-bg px-1 text-[10px] font-normal uppercase text-text-tertiary',
+              (showSelectedBorder || showSelectionBorder) && '!bg-black/[0.02]',
+            )}
+          >
+            {t(`${i18nPrefix}.varNotSet`)}
+          </div>
+        )
+      }
+      {
+        !!item.variables.length && item.variables.map((variable = [], index) => {
+          const isSystem = isSystemVar(variable)
+          const isEnv = isENV(variable)
+          const isChatVar = isConversationVar(variable)
+
+          const node = isSystem ? nodes.find(node => node.data.type === BlockEnum.Start) : nodes.find(node => node.id === variable[0])
+          const varName = isSystem ? `sys.${variable[variable.length - 1]}` : variable.slice(1).join('.')
+          const isException = isExceptionVariable(varName, node?.data.type)
+
+          return (
+            <NodeVariableItem
+              key={index}
+              isEnv={isEnv}
+              isChatVar={isChatVar}
+              isException={isException}
+              node={node as Node}
+              varName={varName}
+              showBorder={showSelectedBorder || showSelectionBorder}
+            />
+          )
+        })
+      }
+    </div>
+  )
+}
+
+export default memo(NodeGroupItem)
diff --git a/app/components/workflow/nodes/variable-assigner/components/node-variable-item.tsx b/app/components/workflow/nodes/variable-assigner/components/node-variable-item.tsx
new file mode 100644
index 0000000..f5d05aa
--- /dev/null
+++ b/app/components/workflow/nodes/variable-assigner/components/node-variable-item.tsx
@@ -0,0 +1,111 @@
+import {
+  memo,
+  useMemo,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+import { VarBlockIcon } from '@/app/components/workflow/block-icon'
+import { Line3 } from '@/app/components/base/icons/src/public/common'
+import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
+import { BubbleX, Env } from '@/app/components/base/icons/src/vender/line/others'
+import Badge from '@/app/components/base/badge'
+import type { Node } from '@/app/components/workflow/types'
+
+type NodeVariableItemProps = {
+  isEnv: boolean
+  isChatVar: boolean
+  node: Node
+  varName: string
+  writeMode?: string
+  showBorder?: boolean
+  className?: string
+  isException?: boolean
+}
+
+const i18nPrefix = 'workflow.nodes.assigner'
+
+const NodeVariableItem = ({
+  isEnv,
+  isChatVar,
+  node,
+  varName,
+  writeMode,
+  showBorder,
+  className,
+  isException,
+}: NodeVariableItemProps) => {
+  const { t } = useTranslation()
+
+  const VariableIcon = useMemo(() => {
+    if (isEnv) {
+      return (
+        <Env className='h-3.5 w-3.5 shrink-0 text-util-colors-violet-violet-600' />
+      )
+    }
+
+    if (isChatVar) {
+      return (
+        <BubbleX className='h-3.5 w-3.5 shrink-0 text-util-colors-teal-teal-700' />
+      )
+    }
+
+    return (
+      <Variable02
+        className={cn(
+          'h-3.5 w-3.5 shrink-0 text-text-accent',
+          isException && 'text-text-warning',
+        )}
+      />
+    )
+  }, [isEnv, isChatVar, isException])
+
+  const VariableName = useMemo(() => {
+    return (
+      <div
+        className={cn(
+          'system-xs-medium ml-0.5 shrink truncate text-text-accent',
+          isEnv && 'text-text-primary',
+          isException && 'text-text-warning',
+          isChatVar && 'text-util-colors-teal-teal-700',
+        )}
+        title={varName}
+      >
+        {varName}
+      </div>
+    )
+  }, [isEnv, isChatVar, varName, isException])
+  return (
+    <div className={cn(
+      'relative flex items-center gap-1 self-stretch rounded-md bg-workflow-block-parma-bg p-[3px] pl-[5px]',
+      showBorder && '!bg-state-base-hover',
+      className,
+    )}>
+      <div className='flex w-0 grow items-center'>
+        {
+          node && (
+            <>
+              <div className='shrink-0 p-[1px]'>
+                <VarBlockIcon
+                  className='!text-text-primary'
+                  type={node.data.type}
+                />
+              </div>
+              <div
+                className='mx-0.5 shrink-[1000] truncate text-xs font-medium text-text-secondary'
+                title={node?.data.title}
+              >
+                {node?.data.title}
+              </div>
+              <Line3 className='mr-0.5 shrink-0'></Line3>
+            </>
+          )
+        }
+        {VariableIcon}
+        {VariableName}
+      </div>
+      {writeMode && <Badge className='shrink-0' text={t(`${i18nPrefix}.operations.${writeMode}`)} />}
+    </div>
+  )
+}
+
+export default memo(NodeVariableItem)
diff --git a/app/components/workflow/nodes/variable-assigner/components/var-group-item.tsx b/app/components/workflow/nodes/variable-assigner/components/var-group-item.tsx
new file mode 100644
index 0000000..cf9d415
--- /dev/null
+++ b/app/components/workflow/nodes/variable-assigner/components/var-group-item.tsx
@@ -0,0 +1,178 @@
+'use client'
+import React, { useCallback } from 'react'
+import type { ChangeEvent, FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { useBoolean } from 'ahooks'
+import {
+  RiDeleteBinLine,
+} from '@remixicon/react'
+import type { VarGroupItem as VarGroupItemType } from '../types'
+import VarReferencePicker from '../../_base/components/variable/var-reference-picker'
+import VarList from '../components/var-list'
+import Field from '@/app/components/workflow/nodes/_base/components/field'
+import { VarType } from '@/app/components/workflow/types'
+import type { NodeOutPutVar, ValueSelector, Var } from '@/app/components/workflow/types'
+import { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types'
+import { Folder } from '@/app/components/base/icons/src/vender/line/files'
+import { checkKeys } from '@/utils/var'
+import Toast from '@/app/components/base/toast'
+
+const i18nPrefix = 'workflow.nodes.variableAssigner'
+
+type Payload = VarGroupItemType & {
+  group_name?: string
+}
+
+type Props = {
+  readOnly: boolean
+  nodeId: string
+  payload: Payload
+  onChange: (newPayload: Payload) => void
+  groupEnabled: boolean
+  onGroupNameChange?: (value: string) => void
+  canRemove?: boolean
+  onRemove?: () => void
+  availableVars: NodeOutPutVar[]
+}
+
+const VarGroupItem: FC<Props> = ({
+  readOnly,
+  nodeId,
+  payload,
+  onChange,
+  groupEnabled,
+  onGroupNameChange,
+  canRemove,
+  onRemove,
+  availableVars,
+}) => {
+  const { t } = useTranslation()
+
+  const handleAddVariable = useCallback((value: ValueSelector | string, _varKindType: VarKindType, varInfo?: Var) => {
+    const chosenVariables = payload.variables
+    if (chosenVariables.some(item => item.join('.') === (value as ValueSelector).join('.')))
+      return
+
+    const newPayload = produce(payload, (draft: Payload) => {
+      draft.variables.push(value as ValueSelector)
+      if (varInfo && varInfo.type !== VarType.any)
+        draft.output_type = varInfo.type
+    })
+    onChange(newPayload)
+  }, [onChange, payload])
+
+  const handleListChange = useCallback((newList: ValueSelector[], changedItem?: ValueSelector) => {
+    if (changedItem) {
+      const chosenVariables = payload.variables
+      if (chosenVariables.some(item => item.join('.') === (changedItem as ValueSelector).join('.')))
+        return
+    }
+
+    const newPayload = produce(payload, (draft) => {
+      draft.variables = newList
+      if (newList.length === 0)
+        draft.output_type = VarType.any
+    })
+    onChange(newPayload)
+  }, [onChange, payload])
+
+  const filterVar = useCallback((varPayload: Var) => {
+    if (payload.output_type === VarType.any)
+      return true
+    return varPayload.type === payload.output_type
+  }, [payload.output_type])
+
+  const [isEditGroupName, {
+    setTrue: setEditGroupName,
+    setFalse: setNotEditGroupName,
+  }] = useBoolean(false)
+
+  const handleGroupNameChange = useCallback((e: ChangeEvent<any>) => {
+    const value = e.target.value
+    const { isValid, errorKey, errorMessageKey } = checkKeys([value], false)
+    if (!isValid) {
+      Toast.notify({
+        type: 'error',
+        message: t(`appDebug.varKeyError.${errorMessageKey}`, { key: errorKey }),
+      })
+      return
+    }
+    onGroupNameChange?.(value)
+  }, [onGroupNameChange, t])
+
+  return (
+    <Field
+      className='group'
+      title={groupEnabled
+        ? <div className='flex items-center'>
+          <div className='flex items-center !normal-case'>
+            <Folder className='mr-0.5 h-3.5 w-3.5' />
+            {(!isEditGroupName)
+              ? (
+                <div className='system-sm-semibold flex h-6 cursor-text items-center rounded-lg px-1 text-text-secondary hover:bg-gray-100' onClick={setEditGroupName}>
+                  {payload.group_name}
+                </div>
+              )
+              : (
+                <input
+                  type='text'
+                  className='h-6 rounded-lg border border-gray-300 bg-white px-1 focus:outline-none'
+                  // style={{
+                  //   width: `${((payload.group_name?.length || 0) + 1) / 2}em`,
+                  // }}
+                  size={payload.group_name?.length} // to fit the input width
+                  autoFocus
+                  value={payload.group_name}
+                  onChange={handleGroupNameChange}
+                  onBlur={setNotEditGroupName}
+                  maxLength={30}
+                />)}
+
+          </div>
+          {canRemove && (
+            <div
+              className='ml-0.5 hidden cursor-pointer rounded-md p-1 text-text-tertiary hover:bg-state-destructive-hover hover:text-text-destructive group-hover:block'
+              onClick={onRemove}
+            >
+              <RiDeleteBinLine
+                className='h-4 w-4'
+              />
+            </div>
+          )}
+        </div>
+        : t(`${i18nPrefix}.title`)!}
+      operations={
+        <div className='flex h-6 items-center  space-x-2'>
+          {payload.variables.length > 0 && (
+            <div className='system-2xs-medium-uppercase flex h-[18px] items-center rounded-[5px] border border-divider-deep px-1 text-text-tertiary'>{payload.output_type}</div>
+          )}
+          {
+            !readOnly
+              ? <VarReferencePicker
+                isAddBtnTrigger
+                readonly={false}
+                nodeId={nodeId}
+                isShowNodeName
+                value={[]}
+                onChange={handleAddVariable}
+                defaultVarKindType={VarKindType.variable}
+                filterVar={filterVar}
+                availableVars={availableVars}
+              />
+              : undefined
+          }
+        </div>
+      }
+    >
+      <VarList
+        readonly={readOnly}
+        nodeId={nodeId}
+        list={payload.variables}
+        onChange={handleListChange}
+        filterVar={filterVar}
+      />
+    </Field>
+  )
+}
+export default React.memo(VarGroupItem)
diff --git a/app/components/workflow/nodes/variable-assigner/components/var-list/index.tsx b/app/components/workflow/nodes/variable-assigner/components/var-list/index.tsx
new file mode 100644
index 0000000..a007463
--- /dev/null
+++ b/app/components/workflow/nodes/variable-assigner/components/var-list/index.tsx
@@ -0,0 +1,86 @@
+'use client'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import React, { useCallback } from 'react'
+import produce from 'immer'
+import RemoveButton from '../../../_base/components/remove-button'
+import ListNoDataPlaceholder from '../../../_base/components/list-no-data-placeholder'
+import VarReferencePicker from '@/app/components/workflow/nodes/_base/components/variable/var-reference-picker'
+import type { ValueSelector, Var } from '@/app/components/workflow/types'
+import { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types'
+import { noop } from 'lodash-es'
+
+type Props = {
+  readonly: boolean
+  nodeId: string
+  list: ValueSelector[]
+  onChange: (list: ValueSelector[], value?: ValueSelector) => void
+  onOpen?: (index: number) => void
+  filterVar?: (payload: Var, valueSelector: ValueSelector) => boolean
+}
+
+const VarList: FC<Props> = ({
+  readonly,
+  nodeId,
+  list,
+  onChange,
+  onOpen = noop,
+  filterVar,
+}) => {
+  const { t } = useTranslation()
+  const handleVarReferenceChange = useCallback((index: number) => {
+    return (value: ValueSelector | string) => {
+      const newList = produce(list, (draft) => {
+        draft[index] = value as ValueSelector
+      })
+      onChange(newList, value as ValueSelector)
+    }
+  }, [list, onChange])
+
+  const handleVarRemove = useCallback((index: number) => {
+    return () => {
+      const newList = produce(list, (draft) => {
+        draft.splice(index, 1)
+      })
+      onChange(newList)
+    }
+  }, [list, onChange])
+
+  const handleOpen = useCallback((index: number) => {
+    return () => onOpen(index)
+  }, [onOpen])
+
+  if (list.length === 0) {
+    return (
+      <ListNoDataPlaceholder>
+        {t('workflow.nodes.variableAssigner.noVarTip')}
+      </ListNoDataPlaceholder>
+    )
+  }
+
+  return (
+    <div className='space-y-2'>
+      {list.map((item, index) => (
+        <div className='flex items-center space-x-1' key={index}>
+          <VarReferencePicker
+            readonly={readonly}
+            nodeId={nodeId}
+            isShowNodeName
+            className='grow'
+            value={item}
+            onChange={handleVarReferenceChange(index)}
+            onOpen={handleOpen(index)}
+            filterVar={filterVar}
+            defaultVarKindType={VarKindType.variable}
+          />
+          {!readonly && (
+            <RemoveButton
+              onClick={handleVarRemove(index)}
+            />
+          )}
+        </div>
+      ))}
+    </div>
+  )
+}
+export default React.memo(VarList)
diff --git a/app/components/workflow/nodes/variable-assigner/components/var-list/use-var-list.ts b/app/components/workflow/nodes/variable-assigner/components/var-list/use-var-list.ts
new file mode 100644
index 0000000..5686f1a
--- /dev/null
+++ b/app/components/workflow/nodes/variable-assigner/components/var-list/use-var-list.ts
@@ -0,0 +1,34 @@
+import { useCallback } from 'react'
+import produce from 'immer'
+import type { VariableAssignerNodeType } from '../../types'
+import type { ValueSelector } from '@/app/components/workflow/types'
+
+type Params = {
+  id: string
+  inputs: VariableAssignerNodeType
+  setInputs: (newInputs: VariableAssignerNodeType) => void
+}
+function useVarList({
+  inputs,
+  setInputs,
+}: Params) {
+  const handleVarListChange = useCallback((newList: ValueSelector[]) => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.variables = newList
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleAddVariable = useCallback(() => {
+    const newInputs = produce(inputs, (draft) => {
+      draft.variables.push([])
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+  return {
+    handleVarListChange,
+    handleAddVariable,
+  }
+}
+
+export default useVarList
diff --git a/app/components/workflow/nodes/variable-assigner/default.ts b/app/components/workflow/nodes/variable-assigner/default.ts
new file mode 100644
index 0000000..60c7c27
--- /dev/null
+++ b/app/components/workflow/nodes/variable-assigner/default.ts
@@ -0,0 +1,59 @@
+import { type NodeDefault, VarType } from '../../types'
+import { BlockEnum } from '../../types'
+import type { VariableAssignerNodeType } from './types'
+import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/blocks'
+
+const i18nPrefix = 'workflow'
+
+const nodeDefault: NodeDefault<VariableAssignerNodeType> = {
+  defaultValue: {
+    output_type: VarType.any,
+    variables: [],
+  },
+  getAvailablePrevNodes(isChatMode: boolean) {
+    const nodes = isChatMode
+      ? ALL_CHAT_AVAILABLE_BLOCKS
+      : ALL_COMPLETION_AVAILABLE_BLOCKS.filter(type => type !== BlockEnum.End)
+    return nodes
+  },
+  getAvailableNextNodes(isChatMode: boolean) {
+    const nodes = isChatMode ? ALL_CHAT_AVAILABLE_BLOCKS : ALL_COMPLETION_AVAILABLE_BLOCKS
+    return nodes
+  },
+  checkValid(payload: VariableAssignerNodeType, t: any) {
+    let errorMessages = ''
+    const { variables, advanced_settings } = payload
+    const { group_enabled = false, groups = [] } = advanced_settings || {}
+    // enable group
+    const validateVariables = (variables: any[], field: string) => {
+      variables.forEach((variable) => {
+        if (!variable || variable.length === 0)
+          errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(field) })
+      })
+    }
+
+    if (group_enabled) {
+      if (!groups || groups.length === 0) {
+        errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.variableAssigner.title`) })
+      }
+      else if (!errorMessages) {
+        groups.forEach((group) => {
+          validateVariables(group.variables || [], `${i18nPrefix}.errorMsg.fields.variableValue`)
+        })
+      }
+    }
+    else {
+      if (!variables || variables.length === 0)
+        errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.variableAssigner.title`) })
+      else if (!errorMessages)
+        validateVariables(variables, `${i18nPrefix}.errorMsg.fields.variableValue`)
+    }
+
+    return {
+      isValid: !errorMessages,
+      errorMessage: errorMessages,
+    }
+  },
+}
+
+export default nodeDefault
diff --git a/app/components/workflow/nodes/variable-assigner/hooks.ts b/app/components/workflow/nodes/variable-assigner/hooks.ts
new file mode 100644
index 0000000..0e5e10c
--- /dev/null
+++ b/app/components/workflow/nodes/variable-assigner/hooks.ts
@@ -0,0 +1,165 @@
+import { useCallback } from 'react'
+import {
+  useNodes,
+  useStoreApi,
+} from 'reactflow'
+import { uniqBy } from 'lodash-es'
+import produce from 'immer'
+import {
+  useIsChatMode,
+  useNodeDataUpdate,
+  useWorkflow,
+  useWorkflowVariables,
+} from '../../hooks'
+import type {
+  Node,
+  ValueSelector,
+  Var,
+} from '../../types'
+import { useWorkflowStore } from '../../store'
+import type {
+  VarGroupItem,
+  VariableAssignerNodeType,
+} from './types'
+
+export const useVariableAssigner = () => {
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+  const { handleNodeDataUpdate } = useNodeDataUpdate()
+
+  const handleAssignVariableValueChange = useCallback((nodeId: string, value: ValueSelector, varDetail: Var, groupId?: string) => {
+    const { getNodes } = store.getState()
+    const nodes = getNodes()
+    const node: Node<VariableAssignerNodeType> = nodes.find(node => node.id === nodeId)!
+
+    let payload
+    if (groupId && groupId !== 'target') {
+      payload = {
+        advanced_settings: {
+          ...node.data.advanced_settings,
+          groups: node.data.advanced_settings?.groups.map((group: VarGroupItem & { groupId: string }) => {
+            if (group.groupId === groupId && !group.variables.some(item => item.join('.') === (value as ValueSelector).join('.'))) {
+              return {
+                ...group,
+                variables: [...group.variables, value],
+                output_type: varDetail.type,
+              }
+            }
+            return group
+          }),
+        },
+      }
+    }
+    else {
+      if (node.data.variables.some(item => item.join('.') === (value as ValueSelector).join('.')))
+        return
+      payload = {
+        variables: [...node.data.variables, value],
+        output_type: varDetail.type,
+      }
+    }
+    handleNodeDataUpdate({
+      id: nodeId,
+      data: payload,
+    })
+  }, [store, handleNodeDataUpdate])
+
+  const handleAddVariableInAddVariablePopupWithPosition = useCallback((
+    nodeId: string,
+    variableAssignerNodeId: string,
+    variableAssignerNodeHandleId: string,
+    value: ValueSelector,
+    varDetail: Var,
+  ) => {
+    const {
+      getNodes,
+      setNodes,
+    } = store.getState()
+    const {
+      setShowAssignVariablePopup,
+    } = workflowStore.getState()
+
+    const newNodes = produce(getNodes(), (draft) => {
+      draft.forEach((node) => {
+        if (node.id === nodeId || node.id === variableAssignerNodeId) {
+          node.data = {
+            ...node.data,
+            _showAddVariablePopup: false,
+            _holdAddVariablePopup: false,
+          }
+        }
+      })
+    })
+    setNodes(newNodes)
+    setShowAssignVariablePopup(undefined)
+    handleAssignVariableValueChange(variableAssignerNodeId, value, varDetail, variableAssignerNodeHandleId)
+  }, [store, workflowStore, handleAssignVariableValueChange])
+
+  const handleGroupItemMouseEnter = useCallback((groupId: string) => {
+    const {
+      setHoveringAssignVariableGroupId,
+    } = workflowStore.getState()
+
+    setHoveringAssignVariableGroupId(groupId)
+  }, [workflowStore])
+
+  const handleGroupItemMouseLeave = useCallback(() => {
+    const {
+      connectingNodePayload,
+      setHoveringAssignVariableGroupId,
+    } = workflowStore.getState()
+
+    if (connectingNodePayload)
+      setHoveringAssignVariableGroupId(undefined)
+  }, [workflowStore])
+
+  return {
+    handleAddVariableInAddVariablePopupWithPosition,
+    handleGroupItemMouseEnter,
+    handleGroupItemMouseLeave,
+    handleAssignVariableValueChange,
+  }
+}
+
+export const useGetAvailableVars = () => {
+  const nodes: Node[] = useNodes()
+  const { getBeforeNodesInSameBranchIncludeParent } = useWorkflow()
+  const { getNodeAvailableVars } = useWorkflowVariables()
+  const isChatMode = useIsChatMode()
+  const getAvailableVars = useCallback((nodeId: string, handleId: string, filterVar: (v: Var) => boolean, hideEnv = false) => {
+    const availableNodes: Node[] = []
+    const currentNode = nodes.find(node => node.id === nodeId)!
+
+    if (!currentNode)
+      return []
+
+    const beforeNodes = getBeforeNodesInSameBranchIncludeParent(nodeId)
+    availableNodes.push(...beforeNodes)
+    const parentNode = nodes.find(node => node.id === currentNode.parentId)
+
+    if (hideEnv) {
+      return getNodeAvailableVars({
+        parentNode,
+        beforeNodes: uniqBy(availableNodes, 'id').filter(node => node.id !== nodeId),
+        isChatMode,
+        hideEnv,
+        hideChatVar: hideEnv,
+        filterVar,
+      })
+        .map(node => ({
+          ...node,
+          vars: node.isStartNode ? node.vars.filter(v => !v.variable.startsWith('sys.')) : node.vars,
+        }))
+        .filter(item => item.vars.length > 0)
+    }
+
+    return getNodeAvailableVars({
+      parentNode,
+      beforeNodes: uniqBy(availableNodes, 'id').filter(node => node.id !== nodeId),
+      isChatMode,
+      filterVar,
+    })
+  }, [nodes, getBeforeNodesInSameBranchIncludeParent, getNodeAvailableVars, isChatMode])
+
+  return getAvailableVars
+}
diff --git a/app/components/workflow/nodes/variable-assigner/node.tsx b/app/components/workflow/nodes/variable-assigner/node.tsx
new file mode 100644
index 0000000..5246ba2
--- /dev/null
+++ b/app/components/workflow/nodes/variable-assigner/node.tsx
@@ -0,0 +1,61 @@
+import type { FC } from 'react'
+import {
+  memo,
+  useMemo,
+  useRef,
+} from 'react'
+import type { NodeProps } from 'reactflow'
+import { useTranslation } from 'react-i18next'
+import NodeGroupItem from './components/node-group-item'
+import type { VariableAssignerNodeType } from './types'
+
+const i18nPrefix = 'workflow.nodes.variableAssigner'
+
+const Node: FC<NodeProps<VariableAssignerNodeType>> = (props) => {
+  const { t } = useTranslation()
+  const ref = useRef<HTMLDivElement>(null)
+  const { id, data } = props
+  const { advanced_settings } = data
+
+  const groups = useMemo(() => {
+    if (!advanced_settings?.group_enabled) {
+      return [{
+        groupEnabled: false,
+        targetHandleId: 'target',
+        title: t(`${i18nPrefix}.title`),
+        type: data.output_type,
+        variables: data.variables,
+        variableAssignerNodeId: id,
+        variableAssignerNodeData: data,
+      }]
+    }
+    return advanced_settings.groups.map((group) => {
+      return {
+        groupEnabled: true,
+        targetHandleId: group.groupId,
+        title: group.group_name,
+        type: group.output_type,
+        variables: group.variables,
+        variableAssignerNodeId: id,
+        variableAssignerNodeData: data,
+      }
+    })
+  }, [t, advanced_settings, data, id])
+
+  return (
+    <div className='relative mb-1 space-y-0.5 px-1' ref={ref}>
+      {
+        groups.map((item) => {
+          return (
+            <NodeGroupItem
+              key={item.title}
+              item={item}
+            />
+          )
+        })
+      }
+    </div >
+  )
+}
+
+export default memo(Node)
diff --git a/app/components/workflow/nodes/variable-assigner/panel.tsx b/app/components/workflow/nodes/variable-assigner/panel.tsx
new file mode 100644
index 0000000..67ec102
--- /dev/null
+++ b/app/components/workflow/nodes/variable-assigner/panel.tsx
@@ -0,0 +1,127 @@
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import Field from '../_base/components/field'
+import RemoveEffectVarConfirm from '../_base/components/remove-effect-var-confirm'
+import useConfig from './use-config'
+import type { VariableAssignerNodeType } from './types'
+import VarGroupItem from './components/var-group-item'
+import cn from '@/utils/classnames'
+import type { NodePanelProps } from '@/app/components/workflow/types'
+import Split from '@/app/components/workflow/nodes/_base/components/split'
+import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
+import Switch from '@/app/components/base/switch'
+import AddButton from '@/app/components/workflow/nodes/_base/components/add-button'
+
+const i18nPrefix = 'workflow.nodes.variableAssigner'
+const Panel: FC<NodePanelProps<VariableAssignerNodeType>> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+
+  const {
+    readOnly,
+    inputs,
+    handleListOrTypeChange,
+    isEnableGroup,
+    handleGroupEnabledChange,
+    handleAddGroup,
+    handleListOrTypeChangeInGroup,
+    handleGroupRemoved,
+    handleVarGroupNameChange,
+    isShowRemoveVarConfirm,
+    hideRemoveVarConfirm,
+    onRemoveVarConfirm,
+    getAvailableVars,
+    filterVar,
+  } = useConfig(id, data)
+
+  return (
+    <div className='mt-2'>
+      <div className='space-y-4 px-4 pb-4'>
+        {!isEnableGroup
+          ? (
+            <VarGroupItem
+              readOnly={readOnly}
+              nodeId={id}
+              payload={{
+                output_type: inputs.output_type,
+                variables: inputs.variables,
+              }}
+              onChange={handleListOrTypeChange}
+              groupEnabled={false}
+              availableVars={getAvailableVars(id, 'target', filterVar(inputs.output_type), true)}
+            />
+          )
+          : (<div>
+            <div className='space-y-2'>
+              {inputs.advanced_settings?.groups.map((item, index) => (
+                <div key={item.groupId}>
+                  <VarGroupItem
+                    readOnly={readOnly}
+                    nodeId={id}
+                    payload={item}
+                    onChange={handleListOrTypeChangeInGroup(item.groupId)}
+                    groupEnabled
+                    canRemove={!readOnly && inputs.advanced_settings?.groups.length > 1}
+                    onRemove={handleGroupRemoved(item.groupId)}
+                    onGroupNameChange={handleVarGroupNameChange(item.groupId)}
+                    availableVars={getAvailableVars(id, item.groupId, filterVar(item.output_type), true)}
+                  />
+                  {index !== inputs.advanced_settings?.groups.length - 1 && <Split className='my-4' />}
+                </div>
+
+              ))}
+            </div>
+            <AddButton
+              className='mt-2'
+              text={t(`${i18nPrefix}.addGroup`)}
+              onClick={handleAddGroup}
+            />
+          </div>)}
+      </div>
+      <Split />
+      <div className={cn('px-4 pt-4', isEnableGroup ? 'pb-4' : 'pb-2')}>
+        <Field
+          title={t(`${i18nPrefix}.aggregationGroup`)}
+          tooltip={t(`${i18nPrefix}.aggregationGroupTip`)!}
+          operations={
+            <Switch
+              defaultValue={isEnableGroup}
+              onChange={handleGroupEnabledChange}
+              size='md'
+              disabled={readOnly}
+            />
+          }
+        />
+      </div>
+      {isEnableGroup && (
+        <>
+          <Split />
+          <OutputVars>
+            <>
+              {inputs.advanced_settings?.groups.map((item, index) => (
+                <VarItem
+                  key={index}
+                  name={`${item.group_name}.output`}
+                  type={item.output_type}
+                  description={t(`${i18nPrefix}.outputVars.varDescribe`, {
+                    groupName: item.group_name,
+                  })}
+                />
+              ))}
+            </>
+          </OutputVars>
+        </>
+      )}
+      <RemoveEffectVarConfirm
+        isShow={isShowRemoveVarConfirm}
+        onCancel={hideRemoveVarConfirm}
+        onConfirm={onRemoveVarConfirm}
+      />
+    </div>
+  )
+}
+
+export default React.memo(Panel)
diff --git a/app/components/workflow/nodes/variable-assigner/types.ts b/app/components/workflow/nodes/variable-assigner/types.ts
new file mode 100644
index 0000000..0bfc6f5
--- /dev/null
+++ b/app/components/workflow/nodes/variable-assigner/types.ts
@@ -0,0 +1,15 @@
+import type { CommonNodeType, ValueSelector, VarType } from '@/app/components/workflow/types'
+
+export type VarGroupItem = {
+  output_type: VarType
+  variables: ValueSelector[]
+}
+export type VariableAssignerNodeType = CommonNodeType & VarGroupItem & {
+  advanced_settings: {
+    group_enabled: boolean
+    groups: ({
+      group_name: string
+      groupId: string
+    } & VarGroupItem)[]
+  }
+}
diff --git a/app/components/workflow/nodes/variable-assigner/use-config.ts b/app/components/workflow/nodes/variable-assigner/use-config.ts
new file mode 100644
index 0000000..f5a7a09
--- /dev/null
+++ b/app/components/workflow/nodes/variable-assigner/use-config.ts
@@ -0,0 +1,190 @@
+import { useCallback, useState } from 'react'
+import produce from 'immer'
+import { useBoolean } from 'ahooks'
+import { v4 as uuid4 } from 'uuid'
+import type { ValueSelector, Var } from '../../types'
+import { VarType } from '../../types'
+import type { VarGroupItem, VariableAssignerNodeType } from './types'
+import { useGetAvailableVars } from './hooks'
+import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
+
+import {
+  useNodesReadOnly,
+  useWorkflow,
+} from '@/app/components/workflow/hooks'
+
+const useConfig = (id: string, payload: VariableAssignerNodeType) => {
+  const { nodesReadOnly: readOnly } = useNodesReadOnly()
+  const { handleOutVarRenameChange, isVarUsedInNodes, removeUsedVarInNodes } = useWorkflow()
+
+  const { inputs, setInputs } = useNodeCrud<VariableAssignerNodeType>(id, payload)
+  const isEnableGroup = !!inputs.advanced_settings?.group_enabled
+
+  // Not Enable Group
+  const handleListOrTypeChange = useCallback((payload: VarGroupItem) => {
+    setInputs({
+      ...inputs,
+      ...payload,
+    })
+  }, [inputs, setInputs])
+
+  const handleListOrTypeChangeInGroup = useCallback((groupId: string) => {
+    return (payload: VarGroupItem) => {
+      const index = inputs.advanced_settings.groups.findIndex(item => item.groupId === groupId)
+      const newInputs = produce(inputs, (draft) => {
+        draft.advanced_settings.groups[index] = {
+          ...draft.advanced_settings.groups[index],
+          ...payload,
+        }
+      })
+      setInputs(newInputs)
+    }
+  }, [inputs, setInputs])
+
+  const getAvailableVars = useGetAvailableVars()
+  const filterVar = (varType: VarType) => {
+    return (v: Var) => {
+      if (varType === VarType.any)
+        return true
+      if (v.type === VarType.any)
+        return true
+      return v.type === varType
+    }
+  }
+
+  const [isShowRemoveVarConfirm, {
+    setTrue: showRemoveVarConfirm,
+    setFalse: hideRemoveVarConfirm,
+  }] = useBoolean(false)
+
+  const [removedVars, setRemovedVars] = useState<ValueSelector[]>([])
+  const [removeType, setRemoveType] = useState<'group' | 'enableChanged'>('group')
+  const [removedGroupIndex, setRemovedGroupIndex] = useState<number>(-1)
+  const handleGroupRemoved = useCallback((groupId: string) => {
+    return () => {
+      const index = inputs.advanced_settings.groups.findIndex(item => item.groupId === groupId)
+      if (isVarUsedInNodes([id, inputs.advanced_settings.groups[index].group_name, 'output'])) {
+        showRemoveVarConfirm()
+        setRemovedVars([[id, inputs.advanced_settings.groups[index].group_name, 'output']])
+        setRemoveType('group')
+        setRemovedGroupIndex(index)
+        return
+      }
+      const newInputs = produce(inputs, (draft) => {
+        draft.advanced_settings.groups.splice(index, 1)
+      })
+      setInputs(newInputs)
+    }
+  }, [id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm])
+
+  const handleGroupEnabledChange = useCallback((enabled: boolean) => {
+    const newInputs = produce(inputs, (draft) => {
+      if (!draft.advanced_settings)
+        draft.advanced_settings = { group_enabled: false, groups: [] }
+      if (enabled) {
+        if (draft.advanced_settings.groups.length === 0) {
+          const DEFAULT_GROUP_NAME = 'Group1'
+          draft.advanced_settings.groups = [{
+            output_type: draft.output_type,
+            variables: draft.variables,
+            group_name: DEFAULT_GROUP_NAME,
+            groupId: uuid4(),
+          }]
+
+          handleOutVarRenameChange(id, [id, 'output'], [id, DEFAULT_GROUP_NAME, 'output'])
+        }
+      }
+      else {
+        if (draft.advanced_settings.groups.length > 0) {
+          if (draft.advanced_settings.groups.length > 1) {
+            const useVars = draft.advanced_settings.groups.filter((item, index) => index > 0 && isVarUsedInNodes([id, item.group_name, 'output']))
+            if (useVars.length > 0) {
+              showRemoveVarConfirm()
+              setRemovedVars(useVars.map(item => [id, item.group_name, 'output']))
+              setRemoveType('enableChanged')
+              return
+            }
+          }
+          draft.output_type = draft.advanced_settings.groups[0].output_type
+          draft.variables = draft.advanced_settings.groups[0].variables
+          handleOutVarRenameChange(id, [id, draft.advanced_settings.groups[0].group_name, 'output'], [id, 'output'])
+        }
+      }
+      draft.advanced_settings.group_enabled = enabled
+    })
+    setInputs(newInputs)
+  }, [handleOutVarRenameChange, id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm])
+
+  const handleAddGroup = useCallback(() => {
+    let maxInGroupName = 1
+    inputs.advanced_settings.groups.forEach((item) => {
+      const match = item.group_name.match(/(\d+)$/)
+      if (match) {
+        const num = Number.parseInt(match[1], 10)
+        if (num > maxInGroupName)
+          maxInGroupName = num
+      }
+    })
+    const newInputs = produce(inputs, (draft) => {
+      draft.advanced_settings.groups.push({
+        output_type: VarType.any,
+        variables: [],
+        group_name: `Group${maxInGroupName + 1}`,
+        groupId: uuid4(),
+      })
+    })
+    setInputs(newInputs)
+  }, [inputs, setInputs])
+
+  const handleVarGroupNameChange = useCallback((groupId: string) => {
+    return (name: string) => {
+      const index = inputs.advanced_settings.groups.findIndex(item => item.groupId === groupId)
+      const newInputs = produce(inputs, (draft) => {
+        draft.advanced_settings.groups[index].group_name = name
+      })
+      handleOutVarRenameChange(id, [id, inputs.advanced_settings.groups[index].group_name, 'output'], [id, name, 'output'])
+      setInputs(newInputs)
+    }
+  }, [handleOutVarRenameChange, id, inputs, setInputs])
+
+  const onRemoveVarConfirm = useCallback(() => {
+    removedVars.forEach((v) => {
+      removeUsedVarInNodes(v)
+    })
+    hideRemoveVarConfirm()
+    if (removeType === 'group') {
+      const newInputs = produce(inputs, (draft) => {
+        draft.advanced_settings.groups.splice(removedGroupIndex, 1)
+      })
+      setInputs(newInputs)
+    }
+    else {
+      // removeType === 'enableChanged' to enabled
+      const newInputs = produce(inputs, (draft) => {
+        draft.advanced_settings.group_enabled = false
+        draft.output_type = draft.advanced_settings.groups[0].output_type
+        draft.variables = draft.advanced_settings.groups[0].variables
+      })
+      setInputs(newInputs)
+    }
+  }, [removedVars, hideRemoveVarConfirm, removeType, removeUsedVarInNodes, inputs, setInputs, removedGroupIndex])
+
+  return {
+    readOnly,
+    inputs,
+    handleListOrTypeChange,
+    isEnableGroup,
+    handleGroupEnabledChange,
+    handleAddGroup,
+    handleListOrTypeChangeInGroup,
+    handleGroupRemoved,
+    handleVarGroupNameChange,
+    isShowRemoveVarConfirm,
+    hideRemoveVarConfirm,
+    onRemoveVarConfirm,
+    getAvailableVars,
+    filterVar,
+  }
+}
+
+export default useConfig
diff --git a/app/components/workflow/nodes/variable-assigner/utils.ts b/app/components/workflow/nodes/variable-assigner/utils.ts
new file mode 100644
index 0000000..a41acf9
--- /dev/null
+++ b/app/components/workflow/nodes/variable-assigner/utils.ts
@@ -0,0 +1,16 @@
+import type { Var } from '../../types'
+import { VarType } from '../../types'
+
+export const checkNodeValid = () => {
+  return true
+}
+
+export const filterVar = (varType: VarType) => {
+  return (v: Var) => {
+    if (varType === VarType.any)
+      return true
+    if (v.type === VarType.any)
+      return true
+    return v.type === varType
+  }
+}
diff --git a/app/components/workflow/note-node/constants.ts b/app/components/workflow/note-node/constants.ts
new file mode 100644
index 0000000..223ce72
--- /dev/null
+++ b/app/components/workflow/note-node/constants.ts
@@ -0,0 +1,42 @@
+import { NoteTheme } from './types'
+
+export const CUSTOM_NOTE_NODE = 'custom-note'
+
+export const THEME_MAP: Record<string, { outer: string; title: string; bg: string; border: string }> = {
+  [NoteTheme.blue]: {
+    outer: 'border-util-colors-blue-blue-500',
+    title: 'bg-util-colors-blue-blue-100',
+    bg: 'bg-util-colors-blue-blue-50',
+    border: 'border-util-colors-blue-blue-300',
+  },
+  [NoteTheme.cyan]: {
+    outer: 'border-util-colors-cyan-cyan-500',
+    title: 'bg-util-colors-cyan-cyan-100',
+    bg: 'bg-util-colors-cyan-cyan-50',
+    border: 'border-util-colors-cyan-cyan-300',
+  },
+  [NoteTheme.green]: {
+    outer: 'border-util-colors-green-green-500',
+    title: 'bg-util-colors-green-green-100',
+    bg: 'bg-util-colors-green-green-50',
+    border: 'border-util-colors-green-green-300',
+  },
+  [NoteTheme.yellow]: {
+    outer: 'border-util-colors-yellow-yellow-500',
+    title: 'bg-util-colors-yellow-yellow-100',
+    bg: 'bg-util-colors-yellow-yellow-50',
+    border: 'border-util-colors-yellow-yellow-300',
+  },
+  [NoteTheme.pink]: {
+    outer: 'border-util-colors-pink-pink-500',
+    title: 'bg-util-colors-pink-pink-100',
+    bg: 'bg-util-colors-pink-pink-50',
+    border: 'border-util-colors-pink-pink-300',
+  },
+  [NoteTheme.violet]: {
+    outer: 'border-util-colors-violet-violet-500',
+    title: 'bg-util-colors-violet-violet-100',
+    bg: 'bg-util-colors-violet-violet-100',
+    border: 'border-util-colors-violet-violet-300',
+  },
+}
diff --git a/app/components/workflow/note-node/hooks.ts b/app/components/workflow/note-node/hooks.ts
new file mode 100644
index 0000000..04e8081
--- /dev/null
+++ b/app/components/workflow/note-node/hooks.ts
@@ -0,0 +1,32 @@
+import { useCallback } from 'react'
+import type { EditorState } from 'lexical'
+import { WorkflowHistoryEvent, useNodeDataUpdate, useWorkflowHistory } from '../hooks'
+import type { NoteTheme } from './types'
+
+export const useNote = (id: string) => {
+  const { handleNodeDataUpdateWithSyncDraft } = useNodeDataUpdate()
+  const { saveStateToHistory } = useWorkflowHistory()
+
+  const handleThemeChange = useCallback((theme: NoteTheme) => {
+    handleNodeDataUpdateWithSyncDraft({ id, data: { theme } })
+    saveStateToHistory(WorkflowHistoryEvent.NoteChange)
+  }, [handleNodeDataUpdateWithSyncDraft, id, saveStateToHistory])
+
+  const handleEditorChange = useCallback((editorState: EditorState) => {
+    if (!editorState?.isEmpty())
+      handleNodeDataUpdateWithSyncDraft({ id, data: { text: JSON.stringify(editorState) } })
+    else
+      handleNodeDataUpdateWithSyncDraft({ id, data: { text: '' } })
+  }, [handleNodeDataUpdateWithSyncDraft, id])
+
+  const handleShowAuthorChange = useCallback((showAuthor: boolean) => {
+    handleNodeDataUpdateWithSyncDraft({ id, data: { showAuthor } })
+    saveStateToHistory(WorkflowHistoryEvent.NoteChange)
+  }, [handleNodeDataUpdateWithSyncDraft, id, saveStateToHistory])
+
+  return {
+    handleThemeChange,
+    handleEditorChange,
+    handleShowAuthorChange,
+  }
+}
diff --git a/app/components/workflow/note-node/index.tsx b/app/components/workflow/note-node/index.tsx
new file mode 100644
index 0000000..aa8793f
--- /dev/null
+++ b/app/components/workflow/note-node/index.tsx
@@ -0,0 +1,130 @@
+import {
+  memo,
+  useCallback,
+  useRef,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { useClickAway } from 'ahooks'
+import type { NodeProps } from 'reactflow'
+import NodeResizer from '../nodes/_base/components/node-resizer'
+import {
+  useNodeDataUpdate,
+  useNodesInteractions,
+} from '../hooks'
+import { useStore } from '../store'
+import {
+  NoteEditor,
+  NoteEditorContextProvider,
+  NoteEditorToolbar,
+} from './note-editor'
+import { THEME_MAP } from './constants'
+import { useNote } from './hooks'
+import type { NoteNodeType } from './types'
+import cn from '@/utils/classnames'
+
+const Icon = () => {
+  return (
+    <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none">
+      <path fillRule="evenodd" clipRule="evenodd" d="M12 9.75V6H13.5V9.75C13.5 11.8211 11.8211 13.5 9.75 13.5H6V12H9.75C10.9926 12 12 10.9926 12 9.75Z" fill="black" fillOpacity="0.16" />
+    </svg>
+  )
+}
+
+const NoteNode = ({
+  id,
+  data,
+}: NodeProps<NoteNodeType>) => {
+  const { t } = useTranslation()
+  const controlPromptEditorRerenderKey = useStore(s => s.controlPromptEditorRerenderKey)
+  const ref = useRef<HTMLDivElement | null>(null)
+  const theme = data.theme
+  const {
+    handleThemeChange,
+    handleEditorChange,
+    handleShowAuthorChange,
+  } = useNote(id)
+  const {
+    handleNodesCopy,
+    handleNodesDuplicate,
+    handleNodeDelete,
+  } = useNodesInteractions()
+  const { handleNodeDataUpdateWithSyncDraft } = useNodeDataUpdate()
+
+  const handleDeleteNode = useCallback(() => {
+    handleNodeDelete(id)
+  }, [id, handleNodeDelete])
+
+  useClickAway(() => {
+    handleNodeDataUpdateWithSyncDraft({ id, data: { selected: false } })
+  }, ref)
+
+  return (
+    <div
+      className={cn(
+        'relative flex flex-col rounded-md border shadow-xs hover:shadow-md',
+        THEME_MAP[theme].bg,
+        data.selected ? THEME_MAP[theme].border : 'border-black/5',
+      )}
+      style={{
+        width: data.width,
+        height: data.height,
+      }}
+      ref={ref}
+    >
+      <NoteEditorContextProvider
+        key={controlPromptEditorRerenderKey}
+        value={data.text}
+      >
+        <>
+          <NodeResizer
+            nodeId={id}
+            nodeData={data}
+            icon={<Icon />}
+            minWidth={240}
+            minHeight={88}
+          />
+          <div
+            className={cn(
+              'h-2 shrink-0 rounded-t-md opacity-50',
+              THEME_MAP[theme].title,
+            )}></div>
+          {
+            data.selected && (
+              <div className='absolute left-1/2 top-[-41px] -translate-x-1/2'>
+                <NoteEditorToolbar
+                  theme={theme}
+                  onThemeChange={handleThemeChange}
+                  onCopy={handleNodesCopy}
+                  onDuplicate={handleNodesDuplicate}
+                  onDelete={handleDeleteNode}
+                  showAuthor={data.showAuthor}
+                  onShowAuthorChange={handleShowAuthorChange}
+                />
+              </div>
+            )
+          }
+          <div className='grow overflow-y-auto px-3 py-2.5'>
+            <div className={cn(
+              data.selected && 'nodrag nopan nowheel cursor-text',
+            )}>
+              <NoteEditor
+                containerElement={ref.current}
+                placeholder={t('workflow.nodes.note.editor.placeholder') || ''}
+                onChange={handleEditorChange}
+              />
+            </div>
+          </div>
+          {
+            data.showAuthor && (
+              <div className='p-3 pt-0 text-xs text-text-tertiary'>
+                {data.author}
+              </div>
+            )
+          }
+        </>
+      </NoteEditorContextProvider>
+    </div>
+  )
+}
+
+export default memo(NoteNode)
diff --git a/app/components/workflow/note-node/note-editor/context.tsx b/app/components/workflow/note-node/note-editor/context.tsx
new file mode 100644
index 0000000..0349746
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/context.tsx
@@ -0,0 +1,65 @@
+'use client'
+
+import {
+  createContext,
+  memo,
+  useRef,
+} from 'react'
+import { LexicalComposer } from '@lexical/react/LexicalComposer'
+import { LinkNode } from '@lexical/link'
+import {
+  ListItemNode,
+  ListNode,
+} from '@lexical/list'
+import { createNoteEditorStore } from './store'
+import theme from './theme'
+
+type NoteEditorStore = ReturnType<typeof createNoteEditorStore>
+const NoteEditorContext = createContext<NoteEditorStore | null>(null)
+
+type NoteEditorContextProviderProps = {
+  value: string
+  children: React.JSX.Element | string | (React.JSX.Element | string)[]
+}
+export const NoteEditorContextProvider = memo(({
+  value,
+  children,
+}: NoteEditorContextProviderProps) => {
+  const storeRef = useRef<NoteEditorStore | undefined>(undefined)
+
+  if (!storeRef.current)
+    storeRef.current = createNoteEditorStore()
+
+  let initialValue = null
+  try {
+    initialValue = JSON.parse(value)
+  }
+  catch {
+
+  }
+
+  const initialConfig = {
+    namespace: 'note-editor',
+    nodes: [
+      LinkNode,
+      ListNode,
+      ListItemNode,
+    ],
+    editorState: !initialValue?.root.children.length ? null : JSON.stringify(initialValue),
+    onError: (error: Error) => {
+      throw error
+    },
+    theme,
+  }
+
+  return (
+    <NoteEditorContext.Provider value={storeRef.current}>
+      <LexicalComposer initialConfig={{ ...initialConfig }}>
+        {children}
+      </LexicalComposer>
+    </NoteEditorContext.Provider>
+  )
+})
+NoteEditorContextProvider.displayName = 'NoteEditorContextProvider'
+
+export default NoteEditorContext
diff --git a/app/components/workflow/note-node/note-editor/editor.tsx b/app/components/workflow/note-node/note-editor/editor.tsx
new file mode 100644
index 0000000..e10ca7b
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/editor.tsx
@@ -0,0 +1,66 @@
+'use client'
+
+import {
+  memo,
+  useCallback,
+} from 'react'
+import type { EditorState } from 'lexical'
+import { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin'
+import { ContentEditable } from '@lexical/react/LexicalContentEditable'
+import { ClickableLinkPlugin } from '@lexical/react/LexicalClickableLinkPlugin'
+import { LinkPlugin } from '@lexical/react/LexicalLinkPlugin'
+import { ListPlugin } from '@lexical/react/LexicalListPlugin'
+import { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary'
+import { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin'
+import { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin'
+import { useWorkflowHistoryStore } from '../../workflow-history-store'
+import LinkEditorPlugin from './plugins/link-editor-plugin'
+import FormatDetectorPlugin from './plugins/format-detector-plugin'
+// import TreeView from '@/app/components/base/prompt-editor/plugins/tree-view'
+import Placeholder from '@/app/components/base/prompt-editor/plugins/placeholder'
+
+type EditorProps = {
+  placeholder?: string
+  onChange?: (editorState: EditorState) => void
+  containerElement: HTMLDivElement | null
+}
+const Editor = ({
+  placeholder = 'write you note...',
+  onChange,
+  containerElement,
+}: EditorProps) => {
+  const handleEditorChange = useCallback((editorState: EditorState) => {
+    onChange?.(editorState)
+  }, [onChange])
+
+  const { setShortcutsEnabled } = useWorkflowHistoryStore()
+
+  return (
+    <div className='relative'>
+      <RichTextPlugin
+        contentEditable={
+          <div>
+            <ContentEditable
+              onFocus={() => setShortcutsEnabled(false)}
+              onBlur={() => setShortcutsEnabled(true)}
+              spellCheck={false}
+              className='h-full w-full text-text-secondary caret-primary-600 outline-none'
+            />
+          </div>
+        }
+        placeholder={<Placeholder value={placeholder} compact />}
+        ErrorBoundary={LexicalErrorBoundary}
+      />
+      <ClickableLinkPlugin disabled />
+      <LinkPlugin />
+      <ListPlugin />
+      <LinkEditorPlugin containerElement={containerElement} />
+      <FormatDetectorPlugin />
+      <HistoryPlugin />
+      <OnChangePlugin onChange={handleEditorChange} />
+      {/* <TreeView /> */}
+    </div>
+  )
+}
+
+export default memo(Editor)
diff --git a/app/components/workflow/note-node/note-editor/index.tsx b/app/components/workflow/note-node/note-editor/index.tsx
new file mode 100644
index 0000000..f3c7364
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/index.tsx
@@ -0,0 +1,3 @@
+export { NoteEditorContextProvider } from './context'
+export { default as NoteEditor } from './editor'
+export { default as NoteEditorToolbar } from './toolbar'
diff --git a/app/components/workflow/note-node/note-editor/plugins/format-detector-plugin/hooks.ts b/app/components/workflow/note-node/note-editor/plugins/format-detector-plugin/hooks.ts
new file mode 100644
index 0000000..bc7e855
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/plugins/format-detector-plugin/hooks.ts
@@ -0,0 +1,78 @@
+import {
+  useCallback,
+  useEffect,
+} from 'react'
+import {
+  $getSelection,
+  $isRangeSelection,
+} from 'lexical'
+import { mergeRegister } from '@lexical/utils'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import type { LinkNode } from '@lexical/link'
+import { $isLinkNode } from '@lexical/link'
+import { $isListItemNode } from '@lexical/list'
+import { getSelectedNode } from '../../utils'
+import { useNoteEditorStore } from '../../store'
+
+export const useFormatDetector = () => {
+  const [editor] = useLexicalComposerContext()
+  const noteEditorStore = useNoteEditorStore()
+
+  const handleFormat = useCallback(() => {
+    editor.getEditorState().read(() => {
+      if (editor.isComposing())
+        return
+
+      const selection = $getSelection()
+
+      if ($isRangeSelection(selection)) {
+        const node = getSelectedNode(selection)
+        const {
+          setSelectedIsBold,
+          setSelectedIsItalic,
+          setSelectedIsStrikeThrough,
+          setSelectedLinkUrl,
+          setSelectedIsLink,
+          setSelectedIsBullet,
+        } = noteEditorStore.getState()
+        setSelectedIsBold(selection.hasFormat('bold'))
+        setSelectedIsItalic(selection.hasFormat('italic'))
+        setSelectedIsStrikeThrough(selection.hasFormat('strikethrough'))
+        const parent = node.getParent()
+        if ($isLinkNode(parent) || $isLinkNode(node)) {
+          const linkUrl = ($isLinkNode(parent) ? parent : node as LinkNode).getURL()
+          setSelectedLinkUrl(linkUrl)
+          setSelectedIsLink(true)
+        }
+        else {
+          setSelectedLinkUrl('')
+          setSelectedIsLink(false)
+        }
+
+        if ($isListItemNode(parent) || $isListItemNode(node))
+          setSelectedIsBullet(true)
+        else
+          setSelectedIsBullet(false)
+      }
+    })
+  }, [editor, noteEditorStore])
+
+  useEffect(() => {
+    document.addEventListener('selectionchange', handleFormat)
+    return () => {
+      document.removeEventListener('selectionchange', handleFormat)
+    }
+  }, [handleFormat])
+
+  useEffect(() => {
+    return mergeRegister(
+      editor.registerUpdateListener(() => {
+        handleFormat()
+      }),
+    )
+  }, [editor, handleFormat])
+
+  return {
+    handleFormat,
+  }
+}
diff --git a/app/components/workflow/note-node/note-editor/plugins/format-detector-plugin/index.tsx b/app/components/workflow/note-node/note-editor/plugins/format-detector-plugin/index.tsx
new file mode 100644
index 0000000..3a2585c
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/plugins/format-detector-plugin/index.tsx
@@ -0,0 +1,9 @@
+import { useFormatDetector } from './hooks'
+
+const FormatDetectorPlugin = () => {
+  useFormatDetector()
+
+  return null
+}
+
+export default FormatDetectorPlugin
diff --git a/app/components/workflow/note-node/note-editor/plugins/link-editor-plugin/component.tsx b/app/components/workflow/note-node/note-editor/plugins/link-editor-plugin/component.tsx
new file mode 100644
index 0000000..2dcd295
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/plugins/link-editor-plugin/component.tsx
@@ -0,0 +1,149 @@
+import {
+  memo,
+  useEffect,
+  useState,
+} from 'react'
+import { escape } from 'lodash-es'
+import {
+  FloatingPortal,
+  flip,
+  offset,
+  shift,
+  useFloating,
+} from '@floating-ui/react'
+import { useTranslation } from 'react-i18next'
+import { useClickAway } from 'ahooks'
+import {
+  RiEditLine,
+  RiExternalLinkLine,
+  RiLinkUnlinkM,
+} from '@remixicon/react'
+import { useStore } from '../../store'
+import { useLink } from './hooks'
+import cn from '@/utils/classnames'
+import Button from '@/app/components/base/button'
+
+type LinkEditorComponentProps = {
+  containerElement: HTMLDivElement | null
+}
+const LinkEditorComponent = ({
+  containerElement,
+}: LinkEditorComponentProps) => {
+  const { t } = useTranslation()
+  const {
+    handleSaveLink,
+    handleUnlink,
+  } = useLink()
+  const selectedLinkUrl = useStore(s => s.selectedLinkUrl)
+  const linkAnchorElement = useStore(s => s.linkAnchorElement)
+  const linkOperatorShow = useStore(s => s.linkOperatorShow)
+  const setLinkAnchorElement = useStore(s => s.setLinkAnchorElement)
+  const setLinkOperatorShow = useStore(s => s.setLinkOperatorShow)
+  const [url, setUrl] = useState(selectedLinkUrl)
+  const { refs, floatingStyles, elements } = useFloating({
+    placement: 'top',
+    middleware: [
+      offset(4),
+      shift(),
+      flip(),
+    ],
+  })
+
+  useClickAway(() => {
+    setLinkAnchorElement()
+  }, linkAnchorElement)
+
+  useEffect(() => {
+    setUrl(selectedLinkUrl)
+  }, [selectedLinkUrl])
+
+  useEffect(() => {
+    if (linkAnchorElement)
+      refs.setReference(linkAnchorElement)
+  }, [linkAnchorElement, refs])
+
+  return (
+    <>
+      {
+        elements.reference && (
+          <FloatingPortal root={containerElement}>
+            <div
+              className={cn(
+                'nodrag nopan z-10 inline-flex w-max items-center rounded-md border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg',
+                !linkOperatorShow && 'p-1 shadow-md',
+                linkOperatorShow && 'system-xs-medium p-0.5 text-text-tertiary shadow-sm',
+              )}
+              style={floatingStyles}
+              ref={refs.setFloating}
+            >
+              {
+                !linkOperatorShow && (
+                  <>
+                    <input
+                      className='mr-0.5 h-6 w-[196px] appearance-none rounded-sm bg-transparent p-1 text-[13px] text-components-input-text-filled outline-none'
+                      value={url}
+                      onChange={e => setUrl(e.target.value)}
+                      placeholder={t('workflow.nodes.note.editor.enterUrl') || ''}
+                      autoFocus
+                    />
+                    <Button
+                      variant='primary'
+                      size='small'
+                      disabled={!url}
+                      onClick={() => handleSaveLink(url)}
+                    >
+                      {t('common.operation.ok')}
+                    </Button>
+                  </>
+                )
+              }
+              {
+                linkOperatorShow && (
+                  <>
+                    <a
+                      className='flex h-6 items-center rounded-md px-2 hover:bg-state-base-hover'
+                      href={escape(url)}
+                      target='_blank'
+                      rel='noreferrer'
+                    >
+                      <RiExternalLinkLine className='mr-1 h-3 w-3' />
+                      <div className='mr-1'>
+                        {t('workflow.nodes.note.editor.openLink')}
+                      </div>
+                      <div
+                        title={escape(url)}
+                        className='max-w-[140px] truncate text-text-accent'
+                      >
+                        {escape(url)}
+                      </div>
+                    </a>
+                    <div className='mx-1 h-3.5 w-[1px] bg-divider-regular'></div>
+                    <div
+                      className='mr-0.5 flex h-6 cursor-pointer items-center rounded-md px-2 hover:bg-state-base-hover'
+                      onClick={(e) => {
+                        e.stopPropagation()
+                        setLinkOperatorShow(false)
+                      }}
+                    >
+                      <RiEditLine className='mr-1 h-3 w-3' />
+                      {t('common.operation.edit')}
+                    </div>
+                    <div
+                      className='flex h-6 cursor-pointer items-center rounded-md px-2 hover:bg-state-base-hover'
+                      onClick={handleUnlink}
+                    >
+                      <RiLinkUnlinkM className='mr-1 h-3 w-3' />
+                      {t('workflow.nodes.note.editor.unlink')}
+                    </div>
+                  </>
+                )
+              }
+            </div>
+          </FloatingPortal>
+        )
+      }
+    </>
+  )
+}
+
+export default memo(LinkEditorComponent)
diff --git a/app/components/workflow/note-node/note-editor/plugins/link-editor-plugin/hooks.ts b/app/components/workflow/note-node/note-editor/plugins/link-editor-plugin/hooks.ts
new file mode 100644
index 0000000..8be8b55
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/plugins/link-editor-plugin/hooks.ts
@@ -0,0 +1,115 @@
+import {
+  useCallback,
+  useEffect,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  CLICK_COMMAND,
+  COMMAND_PRIORITY_LOW,
+} from 'lexical'
+import {
+  mergeRegister,
+} from '@lexical/utils'
+import {
+  TOGGLE_LINK_COMMAND,
+} from '@lexical/link'
+import { escape } from 'lodash-es'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import { useNoteEditorStore } from '../../store'
+import { urlRegExp } from '../../utils'
+import { useToastContext } from '@/app/components/base/toast'
+
+export const useOpenLink = () => {
+  const [editor] = useLexicalComposerContext()
+  const noteEditorStore = useNoteEditorStore()
+
+  useEffect(() => {
+    return mergeRegister(
+      editor.registerUpdateListener(() => {
+        setTimeout(() => {
+          const {
+            selectedLinkUrl,
+            selectedIsLink,
+            setLinkAnchorElement,
+            setLinkOperatorShow,
+          } = noteEditorStore.getState()
+
+          if (selectedIsLink) {
+            setLinkAnchorElement(true)
+
+            if (selectedLinkUrl)
+              setLinkOperatorShow(true)
+            else
+              setLinkOperatorShow(false)
+          }
+          else {
+            setLinkAnchorElement()
+            setLinkOperatorShow(false)
+          }
+        })
+      }),
+      editor.registerCommand(
+        CLICK_COMMAND,
+        (payload) => {
+          setTimeout(() => {
+            const {
+              selectedLinkUrl,
+              selectedIsLink,
+              setLinkAnchorElement,
+              setLinkOperatorShow,
+            } = noteEditorStore.getState()
+
+            if (selectedIsLink) {
+              if ((payload.metaKey || payload.ctrlKey) && selectedLinkUrl) {
+                window.open(selectedLinkUrl, '_blank')
+                return true
+              }
+              setLinkAnchorElement(true)
+
+              if (selectedLinkUrl)
+                setLinkOperatorShow(true)
+              else
+                setLinkOperatorShow(false)
+            }
+            else {
+              setLinkAnchorElement()
+              setLinkOperatorShow(false)
+            }
+          })
+          return false
+        },
+        COMMAND_PRIORITY_LOW,
+      ),
+    )
+  }, [editor, noteEditorStore])
+}
+
+export const useLink = () => {
+  const { t } = useTranslation()
+  const [editor] = useLexicalComposerContext()
+  const noteEditorStore = useNoteEditorStore()
+  const { notify } = useToastContext()
+
+  const handleSaveLink = useCallback((url: string) => {
+    if (url && !urlRegExp.test(url)) {
+      notify({ type: 'error', message: t('workflow.nodes.note.editor.invalidUrl') })
+      return
+    }
+    editor.dispatchCommand(TOGGLE_LINK_COMMAND, escape(url))
+
+    const { setLinkAnchorElement } = noteEditorStore.getState()
+    setLinkAnchorElement()
+  }, [editor, noteEditorStore, notify, t])
+
+  const handleUnlink = useCallback(() => {
+    editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)
+
+    const { setLinkAnchorElement } = noteEditorStore.getState()
+    setLinkAnchorElement()
+  }, [editor, noteEditorStore])
+
+  return {
+    handleSaveLink,
+    handleUnlink,
+  }
+}
diff --git a/app/components/workflow/note-node/note-editor/plugins/link-editor-plugin/index.tsx b/app/components/workflow/note-node/note-editor/plugins/link-editor-plugin/index.tsx
new file mode 100644
index 0000000..a5b3df6
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/plugins/link-editor-plugin/index.tsx
@@ -0,0 +1,25 @@
+import {
+  memo,
+} from 'react'
+import { useStore } from '../../store'
+import { useOpenLink } from './hooks'
+import LinkEditorComponent from './component'
+
+type LinkEditorPluginProps = {
+  containerElement: HTMLDivElement | null
+}
+const LinkEditorPlugin = ({
+  containerElement,
+}: LinkEditorPluginProps) => {
+  useOpenLink()
+  const linkAnchorElement = useStore(s => s.linkAnchorElement)
+
+  if (!linkAnchorElement)
+    return null
+
+  return (
+    <LinkEditorComponent containerElement={containerElement} />
+  )
+}
+
+export default memo(LinkEditorPlugin)
diff --git a/app/components/workflow/note-node/note-editor/store.ts b/app/components/workflow/note-node/note-editor/store.ts
new file mode 100644
index 0000000..3507bb7
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/store.ts
@@ -0,0 +1,72 @@
+import { useContext } from 'react'
+import {
+  useStore as useZustandStore,
+} from 'zustand'
+import { createStore } from 'zustand/vanilla'
+import NoteEditorContext from './context'
+
+type Shape = {
+  linkAnchorElement: HTMLElement | null
+  setLinkAnchorElement: (open?: boolean) => void
+  linkOperatorShow: boolean
+  setLinkOperatorShow: (linkOperatorShow: boolean) => void
+  selectedIsBold: boolean
+  setSelectedIsBold: (selectedIsBold: boolean) => void
+  selectedIsItalic: boolean
+  setSelectedIsItalic: (selectedIsItalic: boolean) => void
+  selectedIsStrikeThrough: boolean
+  setSelectedIsStrikeThrough: (selectedIsStrikeThrough: boolean) => void
+  selectedLinkUrl: string
+  setSelectedLinkUrl: (selectedLinkUrl: string) => void
+  selectedIsLink: boolean
+  setSelectedIsLink: (selectedIsLink: boolean) => void
+  selectedIsBullet: boolean
+  setSelectedIsBullet: (selectedIsBullet: boolean) => void
+}
+
+export const createNoteEditorStore = () => {
+  return createStore<Shape>(set => ({
+    linkAnchorElement: null,
+    setLinkAnchorElement: (open) => {
+      if (open) {
+        setTimeout(() => {
+          const nativeSelection = window.getSelection()
+
+          if (nativeSelection?.focusNode) {
+            const parent = nativeSelection.focusNode.parentElement
+            set(() => ({ linkAnchorElement: parent }))
+          }
+        })
+      }
+      else {
+        set(() => ({ linkAnchorElement: null }))
+      }
+    },
+    linkOperatorShow: false,
+    setLinkOperatorShow: linkOperatorShow => set(() => ({ linkOperatorShow })),
+    selectedIsBold: false,
+    setSelectedIsBold: selectedIsBold => set(() => ({ selectedIsBold })),
+    selectedIsItalic: false,
+    setSelectedIsItalic: selectedIsItalic => set(() => ({ selectedIsItalic })),
+    selectedIsStrikeThrough: false,
+    setSelectedIsStrikeThrough: selectedIsStrikeThrough => set(() => ({ selectedIsStrikeThrough })),
+    selectedLinkUrl: '',
+    setSelectedLinkUrl: selectedLinkUrl => set(() => ({ selectedLinkUrl })),
+    selectedIsLink: false,
+    setSelectedIsLink: selectedIsLink => set(() => ({ selectedIsLink })),
+    selectedIsBullet: false,
+    setSelectedIsBullet: selectedIsBullet => set(() => ({ selectedIsBullet })),
+  }))
+}
+
+export function useStore<T>(selector: (state: Shape) => T): T {
+  const store = useContext(NoteEditorContext)
+  if (!store)
+    throw new Error('Missing NoteEditorContext.Provider in the tree')
+
+  return useZustandStore(store, selector)
+}
+
+export const useNoteEditorStore = () => {
+  return useContext(NoteEditorContext)!
+}
diff --git a/app/components/workflow/note-node/note-editor/theme/index.ts b/app/components/workflow/note-node/note-editor/theme/index.ts
new file mode 100644
index 0000000..5cb8dec
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/theme/index.ts
@@ -0,0 +1,18 @@
+import type { EditorThemeClasses } from 'lexical'
+
+import './theme.css'
+
+const theme: EditorThemeClasses = {
+  paragraph: 'note-editor-theme_paragraph',
+  list: {
+    ul: 'note-editor-theme_list-ul',
+    listitem: 'note-editor-theme_list-li',
+  },
+  link: 'note-editor-theme_link',
+  text: {
+    italic: 'note-editor-theme_text-italic',
+    strikethrough: 'note-editor-theme_text-strikethrough',
+  },
+}
+
+export default theme
diff --git a/app/components/workflow/note-node/note-editor/theme/theme.css b/app/components/workflow/note-node/note-editor/theme/theme.css
new file mode 100644
index 0000000..77b745c
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/theme/theme.css
@@ -0,0 +1,32 @@
+.note-editor-theme_paragraph {
+  font-size: 12px;
+}
+
+.note-editor-theme_list-ul {
+  font-size: 12px;
+  margin: 0;
+  padding: 0;
+  list-style: disc;
+}
+
+.note-editor-theme_list-li {
+  margin-left: 18px;
+  margin-right: 8px;
+}
+
+.note-editor-theme_link {
+  cursor: pointer;
+  color: var(--text-text-selected);
+}
+
+.note-editor-theme_link:hover {
+  text-decoration: underline;
+}
+
+.note-editor-theme_text-strikethrough {
+  text-decoration: line-through;
+}
+
+.note-editor-theme_text-italic {
+  font-style: italic;
+}
diff --git a/app/components/workflow/note-node/note-editor/toolbar/color-picker.tsx b/app/components/workflow/note-node/note-editor/toolbar/color-picker.tsx
new file mode 100644
index 0000000..00f242f
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/toolbar/color-picker.tsx
@@ -0,0 +1,111 @@
+import {
+  memo,
+  useState,
+} from 'react'
+import { NoteTheme } from '../../types'
+import { THEME_MAP } from '../../constants'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+
+export const COLOR_LIST = [
+  {
+    key: NoteTheme.blue,
+    inner: THEME_MAP[NoteTheme.blue].title,
+    outer: THEME_MAP[NoteTheme.blue].outer,
+  },
+  {
+    key: NoteTheme.cyan,
+    inner: THEME_MAP[NoteTheme.cyan].title,
+    outer: THEME_MAP[NoteTheme.cyan].outer,
+  },
+  {
+    key: NoteTheme.green,
+    inner: THEME_MAP[NoteTheme.green].title,
+    outer: THEME_MAP[NoteTheme.green].outer,
+  },
+  {
+    key: NoteTheme.yellow,
+    inner: THEME_MAP[NoteTheme.yellow].title,
+    outer: THEME_MAP[NoteTheme.yellow].outer,
+  },
+  {
+    key: NoteTheme.pink,
+    inner: THEME_MAP[NoteTheme.pink].title,
+    outer: THEME_MAP[NoteTheme.pink].outer,
+  },
+  {
+    key: NoteTheme.violet,
+    inner: THEME_MAP[NoteTheme.violet].title,
+    outer: THEME_MAP[NoteTheme.violet].outer,
+  },
+]
+
+export type ColorPickerProps = {
+  theme: NoteTheme
+  onThemeChange: (theme: NoteTheme) => void
+}
+const ColorPicker = ({
+  theme,
+  onThemeChange,
+}: ColorPickerProps) => {
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='top'
+      offset={4}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(!open)}>
+        <div className={cn(
+          'flex h-8 w-8 cursor-pointer items-center justify-center rounded-md hover:bg-black/5',
+          open && 'bg-black/5',
+        )}>
+          <div
+            className={cn(
+              'h-4 w-4 rounded-full border border-black/5',
+              THEME_MAP[theme].title,
+            )}
+          ></div>
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent>
+        <div className='grid grid-cols-3 grid-rows-2 gap-0.5 rounded-lg border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg p-0.5 shadow-lg'>
+          {
+            COLOR_LIST.map(color => (
+              <div
+                key={color.key}
+                className='group relative flex h-8 w-8 cursor-pointer items-center justify-center rounded-md'
+                onClick={(e) => {
+                  e.stopPropagation()
+                  onThemeChange(color.key)
+                  setOpen(false)
+                }}
+              >
+                <div
+                  className={cn(
+                    'absolute left-1/2 top-1/2 hidden h-5 w-5 -translate-x-1/2 -translate-y-1/2 rounded-full border-[1.5px] group-hover:block',
+                    color.outer,
+                  )}
+                ></div>
+                <div
+                  className={cn(
+                    'absolute left-1/2 top-1/2 h-4 w-4 -translate-x-1/2 -translate-y-1/2 rounded-full border border-black/5',
+                    color.inner,
+                  )}
+                ></div>
+              </div>
+            ))
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default memo(ColorPicker)
diff --git a/app/components/workflow/note-node/note-editor/toolbar/command.tsx b/app/components/workflow/note-node/note-editor/toolbar/command.tsx
new file mode 100644
index 0000000..b07989e
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/toolbar/command.tsx
@@ -0,0 +1,83 @@
+import {
+  memo,
+  useMemo,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiBold,
+  RiItalic,
+  RiLink,
+  RiListUnordered,
+  RiStrikethrough,
+} from '@remixicon/react'
+import { useStore } from '../store'
+import { useCommand } from './hooks'
+import cn from '@/utils/classnames'
+import Tooltip from '@/app/components/base/tooltip'
+
+type CommandProps = {
+  type: 'bold' | 'italic' | 'strikethrough' | 'link' | 'bullet'
+}
+const Command = ({
+  type,
+}: CommandProps) => {
+  const { t } = useTranslation()
+  const selectedIsBold = useStore(s => s.selectedIsBold)
+  const selectedIsItalic = useStore(s => s.selectedIsItalic)
+  const selectedIsStrikeThrough = useStore(s => s.selectedIsStrikeThrough)
+  const selectedIsLink = useStore(s => s.selectedIsLink)
+  const selectedIsBullet = useStore(s => s.selectedIsBullet)
+  const { handleCommand } = useCommand()
+
+  const icon = useMemo(() => {
+    switch (type) {
+      case 'bold':
+        return <RiBold className={cn('h-4 w-4', selectedIsBold && 'text-primary-600')} />
+      case 'italic':
+        return <RiItalic className={cn('h-4 w-4', selectedIsItalic && 'text-primary-600')} />
+      case 'strikethrough':
+        return <RiStrikethrough className={cn('h-4 w-4', selectedIsStrikeThrough && 'text-primary-600')} />
+      case 'link':
+        return <RiLink className={cn('h-4 w-4', selectedIsLink && 'text-primary-600')} />
+      case 'bullet':
+        return <RiListUnordered className={cn('h-4 w-4', selectedIsBullet && 'text-primary-600')} />
+    }
+  }, [type, selectedIsBold, selectedIsItalic, selectedIsStrikeThrough, selectedIsLink, selectedIsBullet])
+
+  const tip = useMemo(() => {
+    switch (type) {
+      case 'bold':
+        return t('workflow.nodes.note.editor.bold')
+      case 'italic':
+        return t('workflow.nodes.note.editor.italic')
+      case 'strikethrough':
+        return t('workflow.nodes.note.editor.strikethrough')
+      case 'link':
+        return t('workflow.nodes.note.editor.link')
+      case 'bullet':
+        return t('workflow.nodes.note.editor.bulletList')
+    }
+  }, [type, t])
+
+  return (
+    <Tooltip
+      popupContent={tip}
+    >
+      <div
+        className={cn(
+          'flex h-8 w-8 cursor-pointer items-center justify-center rounded-md text-text-tertiary hover:bg-state-accent-active hover:text-text-accent',
+          type === 'bold' && selectedIsBold && 'bg-state-accent-active',
+          type === 'italic' && selectedIsItalic && 'bg-state-accent-active',
+          type === 'strikethrough' && selectedIsStrikeThrough && 'bg-state-accent-active',
+          type === 'link' && selectedIsLink && 'bg-state-accent-active',
+          type === 'bullet' && selectedIsBullet && 'bg-state-accent-active',
+        )}
+        onClick={() => handleCommand(type)}
+      >
+        {icon}
+      </div>
+    </Tooltip>
+  )
+}
+
+export default memo(Command)
diff --git a/app/components/workflow/note-node/note-editor/toolbar/divider.tsx b/app/components/workflow/note-node/note-editor/toolbar/divider.tsx
new file mode 100644
index 0000000..a6554b3
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/toolbar/divider.tsx
@@ -0,0 +1,7 @@
+const Divider = () => {
+  return (
+    <div className='mx-1 h-3.5 w-[1px] bg-divider-regular'></div>
+  )
+}
+
+export default Divider
diff --git a/app/components/workflow/note-node/note-editor/toolbar/font-size-selector.tsx b/app/components/workflow/note-node/note-editor/toolbar/font-size-selector.tsx
new file mode 100644
index 0000000..7b530c1
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/toolbar/font-size-selector.tsx
@@ -0,0 +1,84 @@
+import { memo } from 'react'
+import { RiFontSize } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useFontSize } from './hooks'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import { Check } from '@/app/components/base/icons/src/vender/line/general'
+
+const FontSizeSelector = () => {
+  const { t } = useTranslation()
+  const FONT_SIZE_LIST = [
+    {
+      key: '12px',
+      value: t('workflow.nodes.note.editor.small'),
+    },
+    {
+      key: '14px',
+      value: t('workflow.nodes.note.editor.medium'),
+    },
+    {
+      key: '16px',
+      value: t('workflow.nodes.note.editor.large'),
+    },
+  ]
+  const {
+    fontSizeSelectorShow,
+    handleOpenFontSizeSelector,
+    fontSize,
+    handleFontSize,
+  } = useFontSize()
+
+  return (
+    <PortalToFollowElem
+      open={fontSizeSelectorShow}
+      onOpenChange={handleOpenFontSizeSelector}
+      placement='bottom-start'
+      offset={2}
+    >
+      <PortalToFollowElemTrigger onClick={() => handleOpenFontSizeSelector(!fontSizeSelectorShow)}>
+        <div className={cn(
+          'flex h-8 cursor-pointer items-center rounded-md pl-2 pr-1.5 text-[13px] font-medium text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
+          fontSizeSelectorShow && 'bg-state-base-hover text-text-secondary',
+        )}>
+          <RiFontSize className='mr-1 h-4 w-4' />
+          {FONT_SIZE_LIST.find(font => font.key === fontSize)?.value || t('workflow.nodes.note.editor.small')}
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent>
+        <div className='w-[120px] rounded-md border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 text-text-secondary shadow-xl'>
+          {
+            FONT_SIZE_LIST.map(font => (
+              <div
+                key={font.key}
+                className='flex h-8 cursor-pointer items-center justify-between rounded-md pl-3 pr-2 hover:bg-state-base-hover'
+                onClick={(e) => {
+                  e.stopPropagation()
+                  handleFontSize(font.key)
+                  handleOpenFontSizeSelector(false)
+                }}
+              >
+                <div
+                  style={{ fontSize: font.key }}
+                >
+                  {font.value}
+                </div>
+                {
+                  fontSize === font.key && (
+                    <Check className='h-4 w-4 text-text-accent' />
+                  )
+                }
+              </div>
+            ))
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default memo(FontSizeSelector)
diff --git a/app/components/workflow/note-node/note-editor/toolbar/hooks.ts b/app/components/workflow/note-node/note-editor/toolbar/hooks.ts
new file mode 100644
index 0000000..8ed942d
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/toolbar/hooks.ts
@@ -0,0 +1,147 @@
+import {
+  useCallback,
+  useEffect,
+  useState,
+} from 'react'
+import {
+  $createParagraphNode,
+  $getSelection,
+  $isRangeSelection,
+  $setSelection,
+  COMMAND_PRIORITY_CRITICAL,
+  FORMAT_TEXT_COMMAND,
+  SELECTION_CHANGE_COMMAND,
+} from 'lexical'
+import {
+  $getSelectionStyleValueForProperty,
+  $patchStyleText,
+  $setBlocksType,
+} from '@lexical/selection'
+import { INSERT_UNORDERED_LIST_COMMAND } from '@lexical/list'
+import { mergeRegister } from '@lexical/utils'
+import {
+  $isLinkNode,
+  TOGGLE_LINK_COMMAND,
+} from '@lexical/link'
+import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'
+import { useNoteEditorStore } from '../store'
+import { getSelectedNode } from '../utils'
+
+export const useCommand = () => {
+  const [editor] = useLexicalComposerContext()
+  const noteEditorStore = useNoteEditorStore()
+
+  const handleCommand = useCallback((type: string) => {
+    if (type === 'bold')
+      editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold')
+
+    if (type === 'italic')
+      editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic')
+
+    if (type === 'strikethrough')
+      editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough')
+
+    if (type === 'link') {
+      editor.update(() => {
+        const selection = $getSelection()
+
+        if ($isRangeSelection(selection)) {
+          const node = getSelectedNode(selection)
+          const parent = node.getParent()
+          const { setLinkAnchorElement } = noteEditorStore.getState()
+
+          if ($isLinkNode(parent) || $isLinkNode(node)) {
+            editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)
+            setLinkAnchorElement()
+          }
+          else {
+            editor.dispatchCommand(TOGGLE_LINK_COMMAND, '')
+            setLinkAnchorElement(true)
+          }
+        }
+      })
+    }
+
+    if (type === 'bullet') {
+      const { selectedIsBullet } = noteEditorStore.getState()
+
+      if (selectedIsBullet) {
+        editor.update(() => {
+          const selection = $getSelection()
+          if ($isRangeSelection(selection))
+            $setBlocksType(selection, () => $createParagraphNode())
+        })
+      }
+      else {
+        editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)
+      }
+    }
+  }, [editor, noteEditorStore])
+
+  return {
+    handleCommand,
+  }
+}
+
+export const useFontSize = () => {
+  const [editor] = useLexicalComposerContext()
+  const [fontSize, setFontSize] = useState('12px')
+  const [fontSizeSelectorShow, setFontSizeSelectorShow] = useState(false)
+
+  const handleFontSize = useCallback((fontSize: string) => {
+    editor.update(() => {
+      const selection = $getSelection()
+
+      if ($isRangeSelection(selection))
+        $patchStyleText(selection, { 'font-size': fontSize })
+    })
+  }, [editor])
+
+  const handleOpenFontSizeSelector = useCallback((newFontSizeSelectorShow: boolean) => {
+    if (newFontSizeSelectorShow) {
+      editor.update(() => {
+        const selection = $getSelection()
+
+        if ($isRangeSelection(selection))
+          $setSelection(selection.clone())
+      })
+    }
+    setFontSizeSelectorShow(newFontSizeSelectorShow)
+  }, [editor])
+
+  useEffect(() => {
+    return mergeRegister(
+      editor.registerUpdateListener(() => {
+        editor.getEditorState().read(() => {
+          const selection = $getSelection()
+
+          if ($isRangeSelection(selection)) {
+            const fontSize = $getSelectionStyleValueForProperty(selection, 'font-size', '12px')
+            setFontSize(fontSize)
+          }
+        })
+      }),
+      editor.registerCommand(
+        SELECTION_CHANGE_COMMAND,
+        () => {
+          const selection = $getSelection()
+
+          if ($isRangeSelection(selection)) {
+            const fontSize = $getSelectionStyleValueForProperty(selection, 'font-size', '12px')
+            setFontSize(fontSize)
+          }
+
+          return false
+        },
+        COMMAND_PRIORITY_CRITICAL,
+      ),
+    )
+  }, [editor])
+
+  return {
+    fontSize,
+    handleFontSize,
+    fontSizeSelectorShow,
+    handleOpenFontSizeSelector,
+  }
+}
diff --git a/app/components/workflow/note-node/note-editor/toolbar/index.tsx b/app/components/workflow/note-node/note-editor/toolbar/index.tsx
new file mode 100644
index 0000000..fd2613d
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/toolbar/index.tsx
@@ -0,0 +1,48 @@
+import { memo } from 'react'
+import Divider from './divider'
+import type { ColorPickerProps } from './color-picker'
+import ColorPicker from './color-picker'
+import FontSizeSelector from './font-size-selector'
+import Command from './command'
+import type { OperatorProps } from './operator'
+import Operator from './operator'
+
+type ToolbarProps = ColorPickerProps & OperatorProps
+const Toolbar = ({
+  theme,
+  onThemeChange,
+  onCopy,
+  onDuplicate,
+  onDelete,
+  showAuthor,
+  onShowAuthorChange,
+}: ToolbarProps) => {
+  return (
+    <div className='inline-flex items-center rounded-lg border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg p-0.5 shadow-sm'>
+      <ColorPicker
+        theme={theme}
+        onThemeChange={onThemeChange}
+      />
+      <Divider />
+      <FontSizeSelector />
+      <Divider />
+      <div className='flex items-center space-x-0.5'>
+        <Command type='bold' />
+        <Command type='italic' />
+        <Command type='strikethrough' />
+        <Command type='link' />
+        <Command type='bullet' />
+      </div>
+      <Divider />
+      <Operator
+        onCopy={onCopy}
+        onDuplicate={onDuplicate}
+        onDelete={onDelete}
+        showAuthor={showAuthor}
+        onShowAuthorChange={onShowAuthorChange}
+      />
+    </div>
+  )
+}
+
+export default memo(Toolbar)
diff --git a/app/components/workflow/note-node/note-editor/toolbar/operator.tsx b/app/components/workflow/note-node/note-editor/toolbar/operator.tsx
new file mode 100644
index 0000000..d936517
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/toolbar/operator.tsx
@@ -0,0 +1,107 @@
+import {
+  memo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiMoreFill } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import ShortcutsName from '@/app/components/workflow/shortcuts-name'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Switch from '@/app/components/base/switch'
+
+export type OperatorProps = {
+  onCopy: () => void
+  onDuplicate: () => void
+  onDelete: () => void
+  showAuthor: boolean
+  onShowAuthorChange: (showAuthor: boolean) => void
+}
+const Operator = ({
+  onCopy,
+  onDelete,
+  onDuplicate,
+  showAuthor,
+  onShowAuthorChange,
+}: OperatorProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom-end'
+      offset={4}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(!open)}>
+        <div
+          className={cn(
+            'flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
+            open && 'bg-state-base-hover text-text-secondary',
+          )}
+        >
+          <RiMoreFill className='h-4 w-4' />
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent>
+        <div className='min-w-[192px] rounded-md border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-xl'>
+          <div className='p-1'>
+            <div
+              className='flex h-8 cursor-pointer items-center justify-between rounded-md px-3 text-sm text-text-secondary hover:bg-state-base-hover'
+              onClick={() => {
+                onCopy()
+                setOpen(false)
+              }}
+            >
+              {t('workflow.common.copy')}
+              <ShortcutsName keys={['ctrl', 'c']} />
+            </div>
+            <div
+              className='flex h-8 cursor-pointer items-center justify-between rounded-md px-3 text-sm text-text-secondary hover:bg-state-base-hover'
+              onClick={() => {
+                onDuplicate()
+                setOpen(false)
+              }}
+            >
+              {t('workflow.common.duplicate')}
+              <ShortcutsName keys={['ctrl', 'd']} />
+            </div>
+          </div>
+          <div className='h-[1px] bg-divider-subtle'></div>
+          <div className='p-1'>
+            <div
+              className='flex h-8 cursor-pointer items-center justify-between rounded-md px-3 text-sm text-text-secondary hover:bg-state-base-hover'
+              onClick={e => e.stopPropagation()}
+            >
+              <div>{t('workflow.nodes.note.editor.showAuthor')}</div>
+              <Switch
+                size='l'
+                defaultValue={showAuthor}
+                onChange={onShowAuthorChange}
+              />
+            </div>
+          </div>
+          <div className='h-[1px] bg-divider-subtle'></div>
+          <div className='p-1'>
+            <div
+              className='flex h-8 cursor-pointer items-center justify-between rounded-md px-3 text-sm text-text-secondary hover:bg-state-destructive-hover hover:text-text-destructive'
+              onClick={() => {
+                onDelete()
+                setOpen(false)
+              }}
+            >
+              {t('common.operation.delete')}
+              <ShortcutsName keys={['del']} />
+            </div>
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default memo(Operator)
diff --git a/app/components/workflow/note-node/note-editor/utils.ts b/app/components/workflow/note-node/note-editor/utils.ts
new file mode 100644
index 0000000..c241e93
--- /dev/null
+++ b/app/components/workflow/note-node/note-editor/utils.ts
@@ -0,0 +1,22 @@
+import { $isAtNodeEnd } from '@lexical/selection'
+import type { ElementNode, RangeSelection, TextNode } from 'lexical'
+
+export function getSelectedNode(
+  selection: RangeSelection,
+): TextNode | ElementNode {
+  const anchor = selection.anchor
+  const focus = selection.focus
+  const anchorNode = selection.anchor.getNode()
+  const focusNode = selection.focus.getNode()
+  if (anchorNode === focusNode)
+    return anchorNode
+
+  const isBackward = selection.isBackward()
+  if (isBackward)
+    return $isAtNodeEnd(focus) ? anchorNode : focusNode
+  else
+    return $isAtNodeEnd(anchor) ? anchorNode : focusNode
+}
+
+// eslint-disable-next-line sonarjs/empty-string-repetition
+export const urlRegExp = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))?)/
diff --git a/app/components/workflow/note-node/types.ts b/app/components/workflow/note-node/types.ts
new file mode 100644
index 0000000..ad68bd0
--- /dev/null
+++ b/app/components/workflow/note-node/types.ts
@@ -0,0 +1,17 @@
+import type { CommonNodeType } from '../types'
+
+export enum NoteTheme {
+  blue = 'blue',
+  cyan = 'cyan',
+  green = 'green',
+  yellow = 'yellow',
+  pink = 'pink',
+  violet = 'violet',
+}
+
+export type NoteNodeType = CommonNodeType & {
+  text: string
+  theme: NoteTheme
+  author: string
+  showAuthor: boolean
+}
diff --git a/app/components/workflow/operator/add-block.tsx b/app/components/workflow/operator/add-block.tsx
new file mode 100644
index 0000000..d35a5be
--- /dev/null
+++ b/app/components/workflow/operator/add-block.tsx
@@ -0,0 +1,111 @@
+import {
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import { RiAddCircleFill } from '@remixicon/react'
+import { useStoreApi } from 'reactflow'
+import { useTranslation } from 'react-i18next'
+import type { OffsetOptions } from '@floating-ui/react'
+import {
+  generateNewNode,
+  getNodeCustomTypeByNodeDataType,
+} from '../utils'
+import {
+  useAvailableBlocks,
+  useNodesReadOnly,
+  usePanelInteractions,
+} from '../hooks'
+import { NODES_INITIAL_DATA } from '../constants'
+import { useWorkflowStore } from '../store'
+import TipPopup from './tip-popup'
+import cn from '@/utils/classnames'
+import BlockSelector from '@/app/components/workflow/block-selector'
+import type {
+  OnSelectBlock,
+} from '@/app/components/workflow/types'
+import {
+  BlockEnum,
+} from '@/app/components/workflow/types'
+
+type AddBlockProps = {
+  renderTrigger?: (open: boolean) => React.ReactNode
+  offset?: OffsetOptions
+}
+const AddBlock = ({
+  renderTrigger,
+  offset,
+}: AddBlockProps) => {
+  const { t } = useTranslation()
+  const store = useStoreApi()
+  const workflowStore = useWorkflowStore()
+  const { nodesReadOnly } = useNodesReadOnly()
+  const { handlePaneContextmenuCancel } = usePanelInteractions()
+  const [open, setOpen] = useState(false)
+  const { availableNextBlocks } = useAvailableBlocks(BlockEnum.Start, false)
+
+  const handleOpenChange = useCallback((open: boolean) => {
+    setOpen(open)
+    if (!open)
+      handlePaneContextmenuCancel()
+  }, [handlePaneContextmenuCancel])
+
+  const handleSelect = useCallback<OnSelectBlock>((type, toolDefaultValue) => {
+    const {
+      getNodes,
+    } = store.getState()
+    const nodes = getNodes()
+    const nodesWithSameType = nodes.filter(node => node.data.type === type)
+    const { newNode } = generateNewNode({
+      type: getNodeCustomTypeByNodeDataType(type),
+      data: {
+        ...NODES_INITIAL_DATA[type],
+        title: nodesWithSameType.length > 0 ? `${t(`workflow.blocks.${type}`)} ${nodesWithSameType.length + 1}` : t(`workflow.blocks.${type}`),
+        ...(toolDefaultValue || {}),
+        _isCandidate: true,
+      },
+      position: {
+        x: 0,
+        y: 0,
+      },
+    })
+    workflowStore.setState({
+      candidateNode: newNode,
+    })
+  }, [store, workflowStore, t])
+
+  const renderTriggerElement = useCallback((open: boolean) => {
+    return (
+      <TipPopup
+        title={t('workflow.common.addBlock')}
+      >
+        <div className={cn(
+          'flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary',
+          `${nodesReadOnly && 'cursor-not-allowed text-text-disabled hover:bg-transparent hover:text-text-disabled'}`,
+          open && 'bg-state-accent-active text-text-accent',
+        )}>
+          <RiAddCircleFill className='h-4 w-4' />
+        </div>
+      </TipPopup>
+    )
+  }, [nodesReadOnly, t])
+
+  return (
+    <BlockSelector
+      open={open}
+      onOpenChange={handleOpenChange}
+      disabled={nodesReadOnly}
+      onSelect={handleSelect}
+      placement='top-start'
+      offset={offset ?? {
+        mainAxis: 4,
+        crossAxis: -8,
+      }}
+      trigger={renderTrigger || renderTriggerElement}
+      popupClassName='!min-w-[256px]'
+      availableBlocksTypes={availableNextBlocks}
+    />
+  )
+}
+
+export default memo(AddBlock)
diff --git a/app/components/workflow/operator/control.tsx b/app/components/workflow/operator/control.tsx
new file mode 100644
index 0000000..5f7d19a
--- /dev/null
+++ b/app/components/workflow/operator/control.tsx
@@ -0,0 +1,103 @@
+import type { MouseEvent } from 'react'
+import {
+  memo,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiCursorLine,
+  RiFunctionAddLine,
+  RiHand,
+  RiStickyNoteAddLine,
+} from '@remixicon/react'
+import {
+  useNodesReadOnly,
+  useWorkflowMoveMode,
+  useWorkflowOrganize,
+} from '../hooks'
+import {
+  ControlMode,
+} from '../types'
+import { useStore } from '../store'
+import Divider from '../../base/divider'
+import AddBlock from './add-block'
+import TipPopup from './tip-popup'
+import ExportImage from './export-image'
+import { useOperator } from './hooks'
+import cn from '@/utils/classnames'
+
+const Control = () => {
+  const { t } = useTranslation()
+  const controlMode = useStore(s => s.controlMode)
+  const { handleModePointer, handleModeHand } = useWorkflowMoveMode()
+  const { handleLayout } = useWorkflowOrganize()
+  const { handleAddNote } = useOperator()
+  const {
+    nodesReadOnly,
+    getNodesReadOnly,
+  } = useNodesReadOnly()
+
+  const addNote = (e: MouseEvent<HTMLDivElement>) => {
+    if (getNodesReadOnly())
+      return
+
+    e.stopPropagation()
+    handleAddNote()
+  }
+
+  return (
+    <div className='flex items-center rounded-lg border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg p-0.5 text-text-tertiary shadow-lg'>
+      <AddBlock />
+      <TipPopup title={t('workflow.nodes.note.addNote')}>
+        <div
+          className={cn(
+            'ml-[1px] flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg hover:bg-state-base-hover hover:text-text-secondary',
+            `${nodesReadOnly && 'cursor-not-allowed text-text-disabled hover:bg-transparent hover:text-text-disabled'}`,
+          )}
+          onClick={addNote}
+        >
+          <RiStickyNoteAddLine className='h-4 w-4' />
+        </div>
+      </TipPopup>
+      <Divider type='vertical' className='mx-0.5 h-3.5' />
+      <TipPopup title={t('workflow.common.pointerMode')} shortcuts={['v']}>
+        <div
+          className={cn(
+            'mr-[1px] flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg',
+            controlMode === ControlMode.Pointer ? 'bg-state-accent-active text-text-accent' : 'hover:bg-state-base-hover hover:text-text-secondary',
+            `${nodesReadOnly && 'cursor-not-allowed text-text-disabled hover:bg-transparent hover:text-text-disabled'}`,
+          )}
+          onClick={handleModePointer}
+        >
+          <RiCursorLine className='h-4 w-4' />
+        </div>
+      </TipPopup>
+      <TipPopup title={t('workflow.common.handMode')} shortcuts={['h']}>
+        <div
+          className={cn(
+            'flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg',
+            controlMode === ControlMode.Hand ? 'bg-state-accent-active text-text-accent' : 'hover:bg-state-base-hover hover:text-text-secondary',
+            `${nodesReadOnly && 'cursor-not-allowed text-text-disabled hover:bg-transparent hover:text-text-disabled'}`,
+          )}
+          onClick={handleModeHand}
+        >
+          <RiHand className='h-4 w-4' />
+        </div>
+      </TipPopup>
+      <Divider type='vertical' className='mx-0.5 h-3.5' />
+      <ExportImage />
+      <TipPopup title={t('workflow.panel.organizeBlocks')} shortcuts={['ctrl', 'o']}>
+        <div
+          className={cn(
+            'flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg hover:bg-state-base-hover hover:text-text-secondary',
+            `${nodesReadOnly && 'cursor-not-allowed text-text-disabled hover:bg-transparent hover:text-text-disabled'}`,
+          )}
+          onClick={handleLayout}
+        >
+          <RiFunctionAddLine className='h-4 w-4' />
+        </div>
+      </TipPopup>
+    </div>
+  )
+}
+
+export default memo(Control)
diff --git a/app/components/workflow/operator/export-image.tsx b/app/components/workflow/operator/export-image.tsx
new file mode 100644
index 0000000..f59f0cd
--- /dev/null
+++ b/app/components/workflow/operator/export-image.tsx
@@ -0,0 +1,131 @@
+import type { FC } from 'react'
+import {
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { toJpeg, toPng, toSvg } from 'html-to-image'
+import { useNodesReadOnly } from '../hooks'
+import TipPopup from './tip-popup'
+import { RiExportLine } from '@remixicon/react'
+import cn from '@/utils/classnames'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+
+const ExportImage: FC = () => {
+  const { t } = useTranslation()
+  const { getNodesReadOnly } = useNodesReadOnly()
+
+  const appDetail = useAppStore(s => s.appDetail)
+  const [open, setOpen] = useState(false)
+
+  const handleExportImage = useCallback(async (type: 'png' | 'jpeg' | 'svg') => {
+    if (!appDetail)
+      return
+
+    if (getNodesReadOnly())
+      return
+
+    setOpen(false)
+    const flowElement = document.querySelector('.react-flow__viewport') as HTMLElement
+    if (!flowElement) return
+
+    try {
+      const filter = (node: HTMLElement) => {
+        if (node instanceof HTMLImageElement)
+          return node.complete && node.naturalHeight !== 0
+
+        return true
+      }
+
+      let dataUrl
+      switch (type) {
+        case 'png':
+          dataUrl = await toPng(flowElement, { filter })
+          break
+        case 'jpeg':
+          dataUrl = await toJpeg(flowElement, { filter })
+          break
+        case 'svg':
+          dataUrl = await toSvg(flowElement, { filter })
+          break
+        default:
+          dataUrl = await toPng(flowElement, { filter })
+      }
+
+      const link = document.createElement('a')
+      link.href = dataUrl
+      link.download = `${appDetail.name}.${type}`
+      document.body.appendChild(link)
+      link.click()
+      document.body.removeChild(link)
+    }
+    catch (error) {
+      console.error('Export image failed:', error)
+    }
+  }, [getNodesReadOnly, appDetail])
+
+  const handleTrigger = useCallback(() => {
+    if (getNodesReadOnly())
+      return
+
+    setOpen(v => !v)
+  }, [getNodesReadOnly])
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement="top-start"
+      offset={{
+        mainAxis: 4,
+        crossAxis: -8,
+      }}
+    >
+      <PortalToFollowElemTrigger>
+        <TipPopup title={t('workflow.common.exportImage')}>
+          <div
+            className={cn(
+              'flex h-8 w-8 cursor-pointer items-center justify-center rounded-lg hover:bg-state-base-hover hover:text-text-secondary',
+              `${getNodesReadOnly() && 'cursor-not-allowed text-text-disabled hover:bg-transparent hover:text-text-disabled'}`,
+            )}
+            onClick={handleTrigger}
+          >
+            <RiExportLine className='h-4 w-4' />
+          </div>
+        </TipPopup>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-10'>
+        <div className='min-w-[120px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur text-text-secondary shadow-lg'>
+          <div className='p-1'>
+            <div
+              className='system-md-regular flex h-8 cursor-pointer items-center rounded-lg px-2 hover:bg-state-base-hover'
+              onClick={() => handleExportImage('png')}
+            >
+              {t('workflow.common.exportPNG')}
+            </div>
+            <div
+              className='system-md-regular flex h-8 cursor-pointer items-center rounded-lg px-2 hover:bg-state-base-hover'
+              onClick={() => handleExportImage('jpeg')}
+            >
+              {t('workflow.common.exportJPEG')}
+            </div>
+            <div
+              className='system-md-regular flex h-8 cursor-pointer items-center rounded-lg px-2 hover:bg-state-base-hover'
+              onClick={() => handleExportImage('svg')}
+            >
+              {t('workflow.common.exportSVG')}
+            </div>
+          </div>
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default memo(ExportImage)
diff --git a/app/components/workflow/operator/hooks.ts b/app/components/workflow/operator/hooks.ts
new file mode 100644
index 0000000..edec10b
--- /dev/null
+++ b/app/components/workflow/operator/hooks.ts
@@ -0,0 +1,41 @@
+import { useCallback } from 'react'
+import { generateNewNode } from '../utils'
+import { useWorkflowStore } from '../store'
+import type { NoteNodeType } from '../note-node/types'
+import { CUSTOM_NOTE_NODE } from '../note-node/constants'
+import { NoteTheme } from '../note-node/types'
+import { useAppContext } from '@/context/app-context'
+
+export const useOperator = () => {
+  const workflowStore = useWorkflowStore()
+  const { userProfile } = useAppContext()
+
+  const handleAddNote = useCallback(() => {
+    const { newNode } = generateNewNode({
+      type: CUSTOM_NOTE_NODE,
+      data: {
+        title: '',
+        desc: '',
+        type: '' as any,
+        text: '',
+        theme: NoteTheme.blue,
+        author: userProfile?.name || '',
+        showAuthor: true,
+        width: 240,
+        height: 88,
+        _isCandidate: true,
+      } as NoteNodeType,
+      position: {
+        x: 0,
+        y: 0,
+      },
+    })
+    workflowStore.setState({
+      candidateNode: newNode,
+    })
+  }, [workflowStore, userProfile])
+
+  return {
+    handleAddNote,
+  }
+}
diff --git a/app/components/workflow/operator/index.tsx b/app/components/workflow/operator/index.tsx
new file mode 100644
index 0000000..94ea814
--- /dev/null
+++ b/app/components/workflow/operator/index.tsx
@@ -0,0 +1,35 @@
+import { memo } from 'react'
+import { MiniMap } from 'reactflow'
+import UndoRedo from '../header/undo-redo'
+import ZoomInOut from './zoom-in-out'
+import Control from './control'
+
+export type OperatorProps = {
+  handleUndo: () => void
+  handleRedo: () => void
+}
+
+const Operator = ({ handleUndo, handleRedo }: OperatorProps) => {
+  return (
+    <>
+      <MiniMap
+        pannable
+        zoomable
+        style={{
+          width: 102,
+          height: 72,
+        }}
+        maskColor='var(--color-workflow-minimap-bg)'
+        className='!absolute !bottom-14 !left-4 z-[9] !m-0 !h-[72px] !w-[102px] !rounded-lg !border-[0.5px]
+        !border-divider-subtle !bg-background-default-subtle !shadow-md !shadow-shadow-shadow-5'
+      />
+      <div className='absolute bottom-4 left-4 z-[9] mt-1 flex items-center gap-2'>
+        <ZoomInOut />
+        <UndoRedo handleUndo={handleUndo} handleRedo={handleRedo} />
+        <Control />
+      </div>
+    </>
+  )
+}
+
+export default memo(Operator)
diff --git a/app/components/workflow/operator/tip-popup.tsx b/app/components/workflow/operator/tip-popup.tsx
new file mode 100644
index 0000000..7946e1d
--- /dev/null
+++ b/app/components/workflow/operator/tip-popup.tsx
@@ -0,0 +1,33 @@
+import { memo } from 'react'
+import ShortcutsName from '../shortcuts-name'
+import Tooltip from '@/app/components/base/tooltip'
+
+type TipPopupProps = {
+  title: string
+  children: React.ReactNode
+  shortcuts?: string[]
+}
+const TipPopup = ({
+  title,
+  children,
+  shortcuts,
+}: TipPopupProps) => {
+  return (
+    <Tooltip
+      offset={4}
+      popupClassName='p-0 bg-transparent'
+      popupContent={
+        <div className='flex items-center gap-1 rounded-lg border-[0.5px] border-components-panel-border bg-components-tooltip-bg p-1.5 shadow-lg backdrop-blur-[5px]'>
+          <span className='system-xs-medium text-text-secondary'>{title}</span>
+          {
+            shortcuts && <ShortcutsName keys={shortcuts} />
+          }
+        </div>
+      }
+    >
+      {children}
+    </Tooltip>
+  )
+}
+
+export default memo(TipPopup)
diff --git a/app/components/workflow/operator/zoom-in-out.tsx b/app/components/workflow/operator/zoom-in-out.tsx
new file mode 100644
index 0000000..19d8eef
--- /dev/null
+++ b/app/components/workflow/operator/zoom-in-out.tsx
@@ -0,0 +1,229 @@
+import type { FC } from 'react'
+import {
+  Fragment,
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import {
+  RiZoomInLine,
+  RiZoomOutLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import {
+  useReactFlow,
+  useViewport,
+} from 'reactflow'
+import {
+  useNodesSyncDraft,
+  useWorkflowReadOnly,
+} from '../hooks'
+
+import ShortcutsName from '../shortcuts-name'
+import Divider from '../../base/divider'
+import TipPopup from './tip-popup'
+import cn from '@/utils/classnames'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+
+enum ZoomType {
+  zoomIn = 'zoomIn',
+  zoomOut = 'zoomOut',
+  zoomToFit = 'zoomToFit',
+  zoomTo25 = 'zoomTo25',
+  zoomTo50 = 'zoomTo50',
+  zoomTo75 = 'zoomTo75',
+  zoomTo100 = 'zoomTo100',
+  zoomTo200 = 'zoomTo200',
+}
+
+const ZoomInOut: FC = () => {
+  const { t } = useTranslation()
+  const {
+    zoomIn,
+    zoomOut,
+    zoomTo,
+    fitView,
+  } = useReactFlow()
+  const { zoom } = useViewport()
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+  const [open, setOpen] = useState(false)
+  const {
+    workflowReadOnly,
+    getWorkflowReadOnly,
+  } = useWorkflowReadOnly()
+
+  const ZOOM_IN_OUT_OPTIONS = [
+    [
+      {
+        key: ZoomType.zoomTo200,
+        text: '200%',
+      },
+      {
+        key: ZoomType.zoomTo100,
+        text: '100%',
+      },
+      {
+        key: ZoomType.zoomTo75,
+        text: '75%',
+      },
+      {
+        key: ZoomType.zoomTo50,
+        text: '50%',
+      },
+      {
+        key: ZoomType.zoomTo25,
+        text: '25%',
+      },
+    ],
+    [
+      {
+        key: ZoomType.zoomToFit,
+        text: t('workflow.operator.zoomToFit'),
+      },
+    ],
+  ]
+
+  const handleZoom = (type: string) => {
+    if (workflowReadOnly)
+      return
+
+    if (type === ZoomType.zoomToFit)
+      fitView()
+
+    if (type === ZoomType.zoomTo25)
+      zoomTo(0.25)
+
+    if (type === ZoomType.zoomTo50)
+      zoomTo(0.5)
+
+    if (type === ZoomType.zoomTo75)
+      zoomTo(0.75)
+
+    if (type === ZoomType.zoomTo100)
+      zoomTo(1)
+
+    if (type === ZoomType.zoomTo200)
+      zoomTo(2)
+
+    handleSyncWorkflowDraft()
+  }
+
+  const handleTrigger = useCallback(() => {
+    if (getWorkflowReadOnly())
+      return
+
+    setOpen(v => !v)
+  }, [getWorkflowReadOnly])
+
+  return (
+    <PortalToFollowElem
+      placement='top-start'
+      open={open}
+      onOpenChange={setOpen}
+      offset={{
+        mainAxis: 4,
+        crossAxis: -2,
+      }}
+    >
+      <PortalToFollowElemTrigger asChild>
+        <div className={`
+          h-9 cursor-pointer rounded-lg border-[0.5px] border-components-actionbar-border bg-components-actionbar-bg
+          p-0.5 text-[13px] shadow-lg backdrop-blur-[5px]
+          hover:bg-state-base-hover
+          ${workflowReadOnly && '!cursor-not-allowed opacity-50'}
+        `}>
+          <div className={cn(
+            'flex h-8 w-[98px] items-center justify-between rounded-lg',
+          )}>
+            <TipPopup
+              title={t('workflow.operator.zoomOut')}
+              shortcuts={['ctrl', '-']}
+            >
+              <div
+                className={`flex h-8 w-8 items-center justify-center rounded-lg ${zoom <= 0.25 ? 'cursor-not-allowed' : 'cursor-pointer hover:bg-black/5'}`}
+                onClick={(e) => {
+                  if (zoom <= 0.25)
+                    return
+
+                  e.stopPropagation()
+                  zoomOut()
+                }}
+              >
+                <RiZoomOutLine className='h-4 w-4 text-text-tertiary hover:text-text-secondary' />
+              </div>
+            </TipPopup>
+            <div onClick={handleTrigger} className={cn('system-sm-medium w-[34px] text-text-tertiary hover:text-text-secondary')}>{Number.parseFloat(`${zoom * 100}`).toFixed(0)}%</div>
+            <TipPopup
+              title={t('workflow.operator.zoomIn')}
+              shortcuts={['ctrl', '+']}
+            >
+              <div
+                className={`flex h-8 w-8 items-center justify-center rounded-lg ${zoom >= 2 ? 'cursor-not-allowed' : 'cursor-pointer hover:bg-black/5'}`}
+                onClick={(e) => {
+                  if (zoom >= 2)
+                    return
+
+                  e.stopPropagation()
+                  zoomIn()
+                }}
+              >
+                <RiZoomInLine className='h-4 w-4 text-text-tertiary hover:text-text-secondary' />
+              </div>
+            </TipPopup>
+          </div>
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-10'>
+        <div className='w-[145px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg backdrop-blur-[5px]'>
+          {
+            ZOOM_IN_OUT_OPTIONS.map((options, i) => (
+              <Fragment key={i}>
+                {
+                  i !== 0 && (
+                    <Divider className='m-0' />
+                  )
+                }
+                <div className='p-1'>
+                  {
+                    options.map(option => (
+                      <div
+                        key={option.key}
+                        className='system-md-regular flex h-8 cursor-pointer items-center justify-between space-x-1 rounded-lg py-1.5 pl-3 pr-2 text-text-secondary hover:bg-state-base-hover'
+                        onClick={() => handleZoom(option.key)}
+                      >
+                        <span>{option.text}</span>
+                        <div className='flex items-center space-x-0.5'>
+                          {
+                            option.key === ZoomType.zoomToFit && (
+                              <ShortcutsName keys={['ctrl', '1']} />
+                            )
+                          }
+                          {
+                            option.key === ZoomType.zoomTo50 && (
+                              <ShortcutsName keys={['shift', '5']} />
+                            )
+                          }
+                          {
+                            option.key === ZoomType.zoomTo100 && (
+                              <ShortcutsName keys={['shift', '1']} />
+                            )
+                          }
+                        </div>
+                      </div>
+                    ))
+                  }
+                </div>
+              </Fragment>
+            ))
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default memo(ZoomInOut)
diff --git a/app/components/workflow/panel-contextmenu.tsx b/app/components/workflow/panel-contextmenu.tsx
new file mode 100644
index 0000000..0a09452
--- /dev/null
+++ b/app/components/workflow/panel-contextmenu.tsx
@@ -0,0 +1,130 @@
+import {
+  memo,
+  useEffect,
+  useRef,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { useClickAway } from 'ahooks'
+import Divider from '../base/divider'
+import ShortcutsName from './shortcuts-name'
+import { useStore } from './store'
+import {
+  useDSL,
+  useNodesInteractions,
+  usePanelInteractions,
+  useWorkflowStartRun,
+} from './hooks'
+import AddBlock from './operator/add-block'
+import { useOperator } from './operator/hooks'
+import cn from '@/utils/classnames'
+
+const PanelContextmenu = () => {
+  const { t } = useTranslation()
+  const ref = useRef(null)
+  const panelMenu = useStore(s => s.panelMenu)
+  const clipboardElements = useStore(s => s.clipboardElements)
+  const setShowImportDSLModal = useStore(s => s.setShowImportDSLModal)
+  const { handleNodesPaste } = useNodesInteractions()
+  const { handlePaneContextmenuCancel, handleNodeContextmenuCancel } = usePanelInteractions()
+  const { handleStartWorkflowRun } = useWorkflowStartRun()
+  const { handleAddNote } = useOperator()
+  const { exportCheck } = useDSL()
+
+  useEffect(() => {
+    if (panelMenu)
+      handleNodeContextmenuCancel()
+  }, [panelMenu, handleNodeContextmenuCancel])
+
+  useClickAway(() => {
+    handlePaneContextmenuCancel()
+  }, ref)
+
+  const renderTrigger = () => {
+    return (
+      <div
+        className='flex h-8 cursor-pointer items-center justify-between rounded-lg px-3 text-sm text-text-secondary hover:bg-state-base-hover'
+      >
+        {t('workflow.common.addBlock')}
+      </div>
+    )
+  }
+
+  if (!panelMenu)
+    return null
+
+  return (
+    <div
+      className='absolute z-[9] w-[200px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg'
+      style={{
+        left: panelMenu.left,
+        top: panelMenu.top,
+      }}
+      ref={ref}
+    >
+      <div className='p-1'>
+        <AddBlock
+          renderTrigger={renderTrigger}
+          offset={{
+            mainAxis: -36,
+            crossAxis: -4,
+          }}
+        />
+        <div
+          className='flex h-8 cursor-pointer items-center justify-between rounded-lg px-3 text-sm text-text-secondary hover:bg-state-base-hover'
+          onClick={(e) => {
+            e.stopPropagation()
+            handleAddNote()
+            handlePaneContextmenuCancel()
+          }}
+        >
+          {t('workflow.nodes.note.addNote')}
+        </div>
+        <div
+          className='flex h-8 cursor-pointer items-center justify-between rounded-lg px-3 text-sm text-text-secondary hover:bg-state-base-hover'
+          onClick={() => {
+            handleStartWorkflowRun()
+            handlePaneContextmenuCancel()
+          }}
+        >
+          {t('workflow.common.run')}
+          <ShortcutsName keys={['alt', 'r']} />
+        </div>
+      </div>
+      <Divider className='m-0' />
+      <div className='p-1'>
+        <div
+          className={cn(
+            'flex h-8 cursor-pointer items-center justify-between rounded-lg px-3 text-sm text-text-secondary',
+            !clipboardElements.length ? 'cursor-not-allowed opacity-50' : 'hover:bg-state-base-hover',
+          )}
+          onClick={() => {
+            if (clipboardElements.length) {
+              handleNodesPaste()
+              handlePaneContextmenuCancel()
+            }
+          }}
+        >
+          {t('workflow.common.pasteHere')}
+          <ShortcutsName keys={['ctrl', 'v']} />
+        </div>
+      </div>
+      <Divider className='m-0' />
+      <div className='p-1'>
+        <div
+          className='flex h-8 cursor-pointer items-center justify-between rounded-lg px-3 text-sm text-text-secondary hover:bg-state-base-hover'
+          onClick={() => exportCheck()}
+        >
+          {t('app.export')}
+        </div>
+        <div
+          className='flex h-8 cursor-pointer items-center justify-between rounded-lg px-3 text-sm text-text-secondary hover:bg-state-base-hover'
+          onClick={() => setShowImportDSLModal(true)}
+        >
+          {t('workflow.common.importDSL')}
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default memo(PanelContextmenu)
diff --git a/app/components/workflow/panel/chat-record/index.tsx b/app/components/workflow/panel/chat-record/index.tsx
new file mode 100644
index 0000000..bf8a061
--- /dev/null
+++ b/app/components/workflow/panel/chat-record/index.tsx
@@ -0,0 +1,138 @@
+import {
+  memo,
+  useCallback,
+  useEffect,
+  useState,
+} from 'react'
+import { RiCloseLine } from '@remixicon/react'
+import {
+  useStore,
+  useWorkflowStore,
+} from '../../store'
+import { useWorkflowRun } from '../../hooks'
+import UserInput from './user-input'
+import Chat from '@/app/components/base/chat/chat'
+import type { ChatItem, ChatItemInTree } from '@/app/components/base/chat/types'
+import { fetchConversationMessages } from '@/service/debug'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import Loading from '@/app/components/base/loading'
+import { getProcessedFilesFromResponse } from '@/app/components/base/file-uploader/utils'
+import type { IChatItem } from '@/app/components/base/chat/chat/type'
+import { buildChatItemTree, getThreadMessages } from '@/app/components/base/chat/utils'
+
+function getFormattedChatList(messages: any[]) {
+  const res: ChatItem[] = []
+  messages.forEach((item: any) => {
+    const questionFiles = item.message_files?.filter((file: any) => file.belongs_to === 'user') || []
+    res.push({
+      id: `question-${item.id}`,
+      content: item.query,
+      isAnswer: false,
+      message_files: getProcessedFilesFromResponse(questionFiles.map((item: any) => ({ ...item, related_id: item.id }))),
+      parentMessageId: item.parent_message_id || undefined,
+    })
+    const answerFiles = item.message_files?.filter((file: any) => file.belongs_to === 'assistant') || []
+    res.push({
+      id: item.id,
+      content: item.answer,
+      feedback: item.feedback,
+      isAnswer: true,
+      citation: item.metadata?.retriever_resources,
+      message_files: getProcessedFilesFromResponse(answerFiles.map((item: any) => ({ ...item, related_id: item.id }))),
+      workflow_run_id: item.workflow_run_id,
+      parentMessageId: `question-${item.id}`,
+    })
+  })
+  return res
+}
+
+const ChatRecord = () => {
+  const [fetched, setFetched] = useState(false)
+  const [chatItemTree, setChatItemTree] = useState<ChatItemInTree[]>([])
+  const [threadChatItems, setThreadChatItems] = useState<IChatItem[]>([])
+  const appDetail = useAppStore(s => s.appDetail)
+  const workflowStore = useWorkflowStore()
+  const { handleLoadBackupDraft } = useWorkflowRun()
+  const historyWorkflowData = useStore(s => s.historyWorkflowData)
+  const currentConversationID = historyWorkflowData?.conversation_id
+
+  const handleFetchConversationMessages = useCallback(async () => {
+    if (appDetail && currentConversationID) {
+      try {
+        setFetched(false)
+        const res = await fetchConversationMessages(appDetail.id, currentConversationID)
+
+        const newAllChatItems = getFormattedChatList((res as any).data)
+
+        const tree = buildChatItemTree(newAllChatItems)
+        setChatItemTree(tree)
+        setThreadChatItems(getThreadMessages(tree, newAllChatItems.at(-1)?.id))
+      }
+      catch {
+      }
+      finally {
+        setFetched(true)
+      }
+    }
+  }, [appDetail, currentConversationID])
+
+  useEffect(() => {
+    handleFetchConversationMessages()
+  }, [currentConversationID, appDetail, handleFetchConversationMessages])
+
+  const switchSibling = useCallback((siblingMessageId: string) => {
+    setThreadChatItems(getThreadMessages(chatItemTree, siblingMessageId))
+  }, [chatItemTree])
+
+  return (
+    <div
+      className='flex h-full w-[420px] flex-col rounded-l-2xl border border-components-panel-border bg-chatbot-bg shadow-xl'
+      // style={{
+      //   background: 'linear-gradient(156deg, rgba(242, 244, 247, 0.80) 0%, rgba(242, 244, 247, 0.00) 99.43%), var(--white, #FFF)',
+      // }}
+    >
+      {!fetched && (
+        <div className='flex h-full items-center justify-center'>
+          <Loading />
+        </div>
+      )}
+      {fetched && (
+        <>
+          <div className='flex shrink-0 items-center justify-between p-4 pb-1 text-base font-semibold text-text-primary'>
+            {`TEST CHAT#${historyWorkflowData?.sequence_number}`}
+            <div
+              className='flex h-6 w-6 cursor-pointer items-center justify-center'
+              onClick={() => {
+                handleLoadBackupDraft()
+                workflowStore.setState({ historyWorkflowData: undefined })
+              }}
+            >
+              <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+            </div>
+          </div>
+          <div className='h-0 grow'>
+            <Chat
+              config={{
+                supportCitationHitInfo: true,
+              } as any}
+              chatList={threadChatItems}
+              chatContainerClassName='px-3'
+              chatContainerInnerClassName='pt-6 w-full max-w-full mx-auto'
+              chatFooterClassName='px-4 rounded-b-2xl'
+              chatFooterInnerClassName='pb-4 w-full max-w-full mx-auto'
+              chatNode={<UserInput />}
+              noChatInput
+              allToolIcons={{}}
+              showPromptLog
+              switchSibling={switchSibling}
+              noSpacing
+              chatAnswerContainerInner='!pr-2'
+            />
+          </div>
+        </>
+      )}
+    </div>
+  )
+}
+
+export default memo(ChatRecord)
diff --git a/app/components/workflow/panel/chat-record/user-input.tsx b/app/components/workflow/panel/chat-record/user-input.tsx
new file mode 100644
index 0000000..7b90435
--- /dev/null
+++ b/app/components/workflow/panel/chat-record/user-input.tsx
@@ -0,0 +1,56 @@
+import {
+  memo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownSLine } from '@remixicon/react'
+
+const UserInput = () => {
+  const { t } = useTranslation()
+  const [expanded, setExpanded] = useState(true)
+  const variables: any = []
+
+  if (!variables.length)
+    return null
+
+  return (
+    <div
+      className={`
+        rounded-xl border
+        ${!expanded ? 'border-components-panel-border-subtle bg-components-panel-on-panel-item-bg shadow-none' : 'border-transparent bg-white shadow-xs'}
+      `}
+    >
+      <div
+        className={`
+          flex h-[18px] cursor-pointer items-center px-2 pt-4 text-[13px] font-semibold
+          ${!expanded ? 'text-text-accent-secondary' : 'text-text-secondary'}
+        `}
+        onClick={() => setExpanded(!expanded)}
+      >
+        <RiArrowDownSLine
+          className={`mr-1 h-3 w-3 ${!expanded ? '-rotate-90 text-text-accent' : 'text-text-tertiary'}`}
+        />
+        {t('workflow.panel.userInputField').toLocaleUpperCase()}
+      </div>
+      <div className='px-2 pb-3 pt-1'>
+        {
+          expanded && (
+            <div className='py-2 text-[13px] text-text-primary'>
+              {
+                variables.map((variable: any) => (
+                  <div
+                    key={variable.variable}
+                    className='mb-2 last-of-type:mb-0'
+                  >
+                  </div>
+                ))
+              }
+            </div>
+          )
+        }
+      </div>
+    </div>
+  )
+}
+
+export default memo(UserInput)
diff --git a/app/components/workflow/panel/chat-variable-panel/components/array-value-list.tsx b/app/components/workflow/panel/chat-variable-panel/components/array-value-list.tsx
new file mode 100644
index 0000000..302b8ff
--- /dev/null
+++ b/app/components/workflow/panel/chat-variable-panel/components/array-value-list.tsx
@@ -0,0 +1,72 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiAddLine } from '@remixicon/react'
+import produce from 'immer'
+import RemoveButton from '@/app/components/workflow/nodes/_base/components/remove-button'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+
+type Props = {
+  isString: boolean
+  list: any[]
+  onChange: (list: any[]) => void
+}
+
+const ArrayValueList: FC<Props> = ({
+  isString = true,
+  list,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  const handleNameChange = useCallback((index: number) => {
+    return (e: React.ChangeEvent<HTMLInputElement>) => {
+      const newList = produce(list, (draft: any[]) => {
+        draft[index] = isString ? e.target.value : Number(e.target.value)
+      })
+      onChange(newList)
+    }
+  }, [isString, list, onChange])
+
+  const handleItemRemove = useCallback((index: number) => {
+    return () => {
+      const newList = produce(list, (draft) => {
+        draft.splice(index, 1)
+      })
+      onChange(newList)
+    }
+  }, [list, onChange])
+
+  const handleItemAdd = useCallback(() => {
+    const newList = produce(list, (draft: any[]) => {
+      draft.push(undefined)
+    })
+    onChange(newList)
+  }, [list, onChange])
+
+  return (
+    <div className='w-full space-y-2'>
+      {list.map((item, index) => (
+        <div className='flex items-center space-x-1' key={index}>
+          <Input
+            placeholder={t('workflow.chatVariable.modal.arrayValue') || ''}
+            value={list[index]}
+            onChange={handleNameChange(index)}
+            type={isString ? 'text' : 'number'}
+          />
+          <RemoveButton
+            className='!bg-gray-100 !p-2 hover:!bg-gray-200'
+            onClick={handleItemRemove(index)}
+          />
+        </div>
+      ))}
+      <Button variant='tertiary' className='w-full' onClick={handleItemAdd}>
+        <RiAddLine className='mr-1 h-4 w-4' />
+        <span>{t('workflow.chatVariable.modal.addArrayValue')}</span>
+      </Button>
+    </div>
+  )
+}
+export default React.memo(ArrayValueList)
diff --git a/app/components/workflow/panel/chat-variable-panel/components/object-value-item.tsx b/app/components/workflow/panel/chat-variable-panel/components/object-value-item.tsx
new file mode 100644
index 0000000..2649cfb
--- /dev/null
+++ b/app/components/workflow/panel/chat-variable-panel/components/object-value-item.tsx
@@ -0,0 +1,135 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import produce from 'immer'
+import { useContext } from 'use-context-selector'
+import { ToastContext } from '@/app/components/base/toast'
+import VariableTypeSelector from '@/app/components/workflow/panel/chat-variable-panel/components/variable-type-select'
+import RemoveButton from '@/app/components/workflow/nodes/_base/components/remove-button'
+import { ChatVarType } from '@/app/components/workflow/panel/chat-variable-panel/type'
+
+type Props = {
+  index: number
+  list: any[]
+  onChange: (list: any[]) => void
+}
+
+const typeList = [
+  ChatVarType.String,
+  ChatVarType.Number,
+]
+
+export const DEFAULT_OBJECT_VALUE = {
+  key: '',
+  type: ChatVarType.String,
+  value: undefined,
+}
+
+const ObjectValueItem: FC<Props> = ({
+  index,
+  list,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const [isFocus, setIsFocus] = useState(false)
+
+  const handleKeyChange = useCallback((index: number) => {
+    return (e: React.ChangeEvent<HTMLInputElement>) => {
+      const newList = produce(list, (draft: any[]) => {
+        if (!/^\w+$/.test(e.target.value))
+          return notify({ type: 'error', message: 'key is can only contain letters, numbers and underscores' })
+        draft[index].key = e.target.value
+      })
+      onChange(newList)
+    }
+  }, [list, notify, onChange])
+
+  const handleTypeChange = useCallback((index: number) => {
+    return (type: ChatVarType) => {
+      const newList = produce(list, (draft) => {
+        draft[index].type = type
+        if (type === ChatVarType.Number)
+          draft[index].value = isNaN(Number(draft[index].value)) ? undefined : Number(draft[index].value)
+        else
+          draft[index].value = draft[index].value ? String(draft[index].value) : undefined
+      })
+      onChange(newList)
+    }
+  }, [list, onChange])
+
+  const handleValueChange = useCallback((index: number) => {
+    return (e: React.ChangeEvent<HTMLInputElement>) => {
+      const newList = produce(list, (draft: any[]) => {
+        draft[index].value = draft[index].type === ChatVarType.String ? e.target.value : isNaN(Number(e.target.value)) ? undefined : Number(e.target.value)
+      })
+      onChange(newList)
+    }
+  }, [list, onChange])
+
+  const handleItemRemove = useCallback((index: number) => {
+    return () => {
+      const newList = produce(list, (draft) => {
+        draft.splice(index, 1)
+      })
+      onChange(newList)
+    }
+  }, [list, onChange])
+
+  const handleItemAdd = useCallback(() => {
+    const newList = produce(list, (draft: any[]) => {
+      draft.push(DEFAULT_OBJECT_VALUE)
+    })
+    onChange(newList)
+  }, [list, onChange])
+
+  const handleFocusChange = useCallback(() => {
+    setIsFocus(true)
+    if (index === list.length - 1)
+      handleItemAdd()
+  }, [handleItemAdd, index, list.length])
+
+  return (
+    <div className='group flex border-t border-gray-200'>
+      {/* Key */}
+      <div className='w-[120px] border-r border-gray-200'>
+        <input
+          className='system-xs-regular placeholder:system-xs-regular block h-7 w-full appearance-none px-2 text-text-secondary caret-primary-600 outline-none placeholder:text-components-input-text-placeholder  hover:bg-state-base-hover focus:bg-components-input-bg-active'
+          placeholder={t('workflow.chatVariable.modal.objectKey') || ''}
+          value={list[index].key}
+          onChange={handleKeyChange(index)}
+        />
+      </div>
+      {/* Type */}
+      <div className='w-[96px] border-r border-gray-200'>
+        <VariableTypeSelector
+          inCell
+          value={list[index].type}
+          list={typeList}
+          onSelect={handleTypeChange(index)}
+          popupClassName='w-[120px]'
+        />
+      </div>
+      {/* Value */}
+      <div className='relative w-[230px]'>
+        <input
+          className='system-xs-regular placeholder:system-xs-regular block h-7 w-full appearance-none px-2 text-text-secondary caret-primary-600 outline-none placeholder:text-components-input-text-placeholder  hover:bg-state-base-hover focus:bg-components-input-bg-active'
+          placeholder={t('workflow.chatVariable.modal.objectValue') || ''}
+          value={list[index].value}
+          onChange={handleValueChange(index)}
+          onFocus={() => handleFocusChange()}
+          onBlur={() => setIsFocus(false)}
+          type={list[index].type === ChatVarType.Number ? 'number' : 'text'}
+        />
+        {list.length > 1 && !isFocus && (
+          <RemoveButton
+            className='absolute right-1 top-0.5 z-10 hidden group-hover:block'
+            onClick={handleItemRemove(index)}
+          />
+        )}
+      </div>
+    </div>
+  )
+}
+export default React.memo(ObjectValueItem)
diff --git a/app/components/workflow/panel/chat-variable-panel/components/object-value-list.tsx b/app/components/workflow/panel/chat-variable-panel/components/object-value-list.tsx
new file mode 100644
index 0000000..830cf94
--- /dev/null
+++ b/app/components/workflow/panel/chat-variable-panel/components/object-value-list.tsx
@@ -0,0 +1,36 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import ObjectValueItem from '@/app/components/workflow/panel/chat-variable-panel/components/object-value-item'
+
+type Props = {
+  list: any[]
+  onChange: (list: any[]) => void
+}
+
+const ObjectValueList: FC<Props> = ({
+  list,
+  onChange,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='w-full overflow-hidden rounded-lg border border-gray-200'>
+      <div className='system-xs-medium flex h-7 items-center uppercase text-text-tertiary'>
+        <div className='flex h-full w-[120px] items-center border-r border-gray-200 pl-2'>{t('workflow.chatVariable.modal.objectKey')}</div>
+        <div className='flex h-full w-[96px] items-center border-r border-gray-200 pl-2'>{t('workflow.chatVariable.modal.objectType')}</div>
+        <div className='flex h-full w-[230px] items-center pl-2 pr-1'>{t('workflow.chatVariable.modal.objectValue')}</div>
+      </div>
+      {list.map((item, index) => (
+        <ObjectValueItem
+          key={index}
+          index={index}
+          list={list}
+          onChange={onChange}
+        />
+      ))}
+    </div>
+  )
+}
+export default React.memo(ObjectValueList)
diff --git a/app/components/workflow/panel/chat-variable-panel/components/variable-item.tsx b/app/components/workflow/panel/chat-variable-panel/components/variable-item.tsx
new file mode 100644
index 0000000..3e46b7a
--- /dev/null
+++ b/app/components/workflow/panel/chat-variable-panel/components/variable-item.tsx
@@ -0,0 +1,49 @@
+import { memo, useState } from 'react'
+import { capitalize } from 'lodash-es'
+import { RiDeleteBinLine, RiEditLine } from '@remixicon/react'
+import { BubbleX } from '@/app/components/base/icons/src/vender/line/others'
+import type { ConversationVariable } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+
+type VariableItemProps = {
+  item: ConversationVariable
+  onEdit: (item: ConversationVariable) => void
+  onDelete: (item: ConversationVariable) => void
+}
+
+const VariableItem = ({
+  item,
+  onEdit,
+  onDelete,
+}: VariableItemProps) => {
+  const [destructive, setDestructive] = useState(false)
+  return (
+    <div className={cn(
+      'radius-md mb-1 border border-components-panel-border-subtle bg-components-panel-on-panel-item-bg px-2.5 py-2 shadow-xs hover:bg-components-panel-on-panel-item-bg-hover',
+      destructive && 'border-state-destructive-border hover:bg-state-destructive-hover',
+    )}>
+      <div className='flex items-center justify-between'>
+        <div className='flex grow items-center gap-1'>
+          <BubbleX className='h-4 w-4 text-util-colors-teal-teal-700' />
+          <div className='system-sm-medium text-text-primary'>{item.name}</div>
+          <div className='system-xs-medium text-text-tertiary'>{capitalize(item.value_type)}</div>
+        </div>
+        <div className='flex shrink-0 items-center gap-1 text-text-tertiary'>
+          <div className='radius-md cursor-pointer p-1 hover:bg-state-base-hover hover:text-text-secondary'>
+            <RiEditLine className='h-4 w-4' onClick={() => onEdit(item)}/>
+          </div>
+          <div
+            className='radius-md cursor-pointer p-1 hover:bg-state-destructive-hover hover:text-text-destructive'
+            onMouseOver={() => setDestructive(true)}
+            onMouseOut={() => setDestructive(false)}
+          >
+            <RiDeleteBinLine className='h-4 w-4' onClick={() => onDelete(item)}/>
+          </div>
+        </div>
+      </div>
+      <div className='system-xs-regular truncate text-text-tertiary'>{item.description}</div>
+    </div>
+  )
+}
+
+export default memo(VariableItem)
diff --git a/app/components/workflow/panel/chat-variable-panel/components/variable-modal-trigger.tsx b/app/components/workflow/panel/chat-variable-panel/components/variable-modal-trigger.tsx
new file mode 100644
index 0000000..07eb79a
--- /dev/null
+++ b/app/components/workflow/panel/chat-variable-panel/components/variable-modal-trigger.tsx
@@ -0,0 +1,69 @@
+'use client'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiAddLine } from '@remixicon/react'
+import Button from '@/app/components/base/button'
+import VariableModal from '@/app/components/workflow/panel/chat-variable-panel/components/variable-modal'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import type { ConversationVariable } from '@/app/components/workflow/types'
+
+type Props = {
+  open: boolean
+  setOpen: (value: React.SetStateAction<boolean>) => void
+  showTip: boolean
+  chatVar?: ConversationVariable
+  onClose: () => void
+  onSave: (env: ConversationVariable) => void
+}
+
+const VariableModalTrigger = ({
+  open,
+  setOpen,
+  showTip,
+  chatVar,
+  onClose,
+  onSave,
+}: Props) => {
+  const { t } = useTranslation()
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={() => {
+        setOpen(v => !v)
+        open && onClose()
+      }}
+      placement='left-start'
+      offset={{
+        mainAxis: 8,
+        alignmentAxis: showTip ? -278 : -48,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={() => {
+        setOpen(v => !v)
+        open && onClose()
+      }}>
+        <Button variant='primary'>
+          <RiAddLine className='mr-1 h-4 w-4' />
+          <span className='system-sm-medium'>{t('workflow.chatVariable.button')}</span>
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[11]'>
+        <VariableModal
+          chatVar={chatVar}
+          onSave={onSave}
+          onClose={() => {
+            onClose()
+            setOpen(false)
+          }}
+        />
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default VariableModalTrigger
diff --git a/app/components/workflow/panel/chat-variable-panel/components/variable-modal.tsx b/app/components/workflow/panel/chat-variable-panel/components/variable-modal.tsx
new file mode 100644
index 0000000..d8da0e6
--- /dev/null
+++ b/app/components/workflow/panel/chat-variable-panel/components/variable-modal.tsx
@@ -0,0 +1,398 @@
+import React, { useCallback, useEffect, useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useContext } from 'use-context-selector'
+import { v4 as uuid4 } from 'uuid'
+import { RiCloseLine, RiDraftLine, RiInputField } from '@remixicon/react'
+import VariableTypeSelector from '@/app/components/workflow/panel/chat-variable-panel/components/variable-type-select'
+import ObjectValueList from '@/app/components/workflow/panel/chat-variable-panel/components/object-value-list'
+import { DEFAULT_OBJECT_VALUE } from '@/app/components/workflow/panel/chat-variable-panel/components/object-value-item'
+import ArrayValueList from '@/app/components/workflow/panel/chat-variable-panel/components/array-value-list'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
+import { ToastContext } from '@/app/components/base/toast'
+import { useStore } from '@/app/components/workflow/store'
+import type { ConversationVariable } from '@/app/components/workflow/types'
+import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+import { ChatVarType } from '@/app/components/workflow/panel/chat-variable-panel/type'
+import cn from '@/utils/classnames'
+import { checkKeys } from '@/utils/var'
+
+export type ModalPropsType = {
+  chatVar?: ConversationVariable
+  onClose: () => void
+  onSave: (chatVar: ConversationVariable) => void
+}
+
+type ObjectValueItem = {
+  key: string
+  type: ChatVarType
+  value: string | number | undefined
+}
+
+const typeList = [
+  ChatVarType.String,
+  ChatVarType.Number,
+  ChatVarType.Object,
+  ChatVarType.ArrayString,
+  ChatVarType.ArrayNumber,
+  ChatVarType.ArrayObject,
+]
+
+const objectPlaceholder = `#  example
+#  {
+#     "name": "ray",
+#     "age": 20
+#  }`
+const arrayStringPlaceholder = `#  example
+#  [
+#     "value1",
+#     "value2"
+#  ]`
+const arrayNumberPlaceholder = `#  example
+#  [
+#     100,
+#     200
+#  ]`
+const arrayObjectPlaceholder = `#  example
+#  [
+#     {
+#       "name": "ray",
+#       "age": 20
+#     },
+#     {
+#       "name": "lily",
+#       "age": 18
+#     }
+#  ]`
+
+const ChatVariableModal = ({
+  chatVar,
+  onClose,
+  onSave,
+}: ModalPropsType) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const varList = useStore(s => s.conversationVariables)
+  const [name, setName] = React.useState('')
+  const [type, setType] = React.useState<ChatVarType>(ChatVarType.String)
+  const [value, setValue] = React.useState<any>()
+  const [objectValue, setObjectValue] = React.useState<ObjectValueItem[]>([DEFAULT_OBJECT_VALUE])
+  const [editorContent, setEditorContent] = React.useState<string>()
+  const [editInJSON, setEditInJSON] = React.useState(false)
+  const [des, setDes] = React.useState<string>('')
+
+  const editorMinHeight = useMemo(() => {
+    if (type === ChatVarType.ArrayObject)
+      return '240px'
+    return '120px'
+  }, [type])
+  const placeholder = useMemo(() => {
+    if (type === ChatVarType.ArrayString)
+      return arrayStringPlaceholder
+    if (type === ChatVarType.ArrayNumber)
+      return arrayNumberPlaceholder
+    if (type === ChatVarType.ArrayObject)
+      return arrayObjectPlaceholder
+    return objectPlaceholder
+  }, [type])
+  const getObjectValue = useCallback(() => {
+    if (!chatVar || Object.keys(chatVar.value).length === 0)
+      return [DEFAULT_OBJECT_VALUE]
+
+    return Object.keys(chatVar.value).map((key) => {
+      return {
+        key,
+        type: typeof chatVar.value[key] === 'string' ? ChatVarType.String : ChatVarType.Number,
+        value: chatVar.value[key],
+      }
+    })
+  }, [chatVar])
+  const formatValueFromObject = useCallback((list: ObjectValueItem[]) => {
+    return list.reduce((acc: any, curr) => {
+      if (curr.key)
+        acc[curr.key] = curr.value || null
+      return acc
+    }, {})
+  }, [])
+
+  const formatValue = (value: any) => {
+    switch (type) {
+      case ChatVarType.String:
+        return value || ''
+      case ChatVarType.Number:
+        return value || 0
+      case ChatVarType.Object:
+        return editInJSON ? value : formatValueFromObject(objectValue)
+      case ChatVarType.ArrayString:
+      case ChatVarType.ArrayNumber:
+      case ChatVarType.ArrayObject:
+        return value?.filter(Boolean) || []
+    }
+  }
+
+  const checkVariableName = (value: string) => {
+    const { isValid, errorMessageKey } = checkKeys([value], false)
+    if (!isValid) {
+      notify({
+        type: 'error',
+        message: t(`appDebug.varKeyError.${errorMessageKey}`, { key: t('workflow.env.modal.name') }),
+      })
+      return false
+    }
+    return true
+  }
+
+  const handleTypeChange = (v: ChatVarType) => {
+    setValue(undefined)
+    setEditorContent(undefined)
+    if (v === ChatVarType.ArrayObject)
+      setEditInJSON(true)
+    if (v === ChatVarType.String || v === ChatVarType.Number || v === ChatVarType.Object)
+      setEditInJSON(false)
+    setType(v)
+  }
+
+  const handleEditorChange = (editInJSON: boolean) => {
+    if (type === ChatVarType.Object) {
+      if (editInJSON) {
+        const newValue = !objectValue[0].key ? undefined : formatValueFromObject(objectValue)
+        setValue(newValue)
+        setEditorContent(JSON.stringify(newValue))
+      }
+      else {
+        if (!editorContent) {
+          setValue(undefined)
+          setObjectValue([DEFAULT_OBJECT_VALUE])
+        }
+        else {
+          try {
+            const newValue = JSON.parse(editorContent)
+            setValue(newValue)
+            const newObjectValue = Object.keys(newValue).map((key) => {
+              return {
+                key,
+                type: typeof newValue[key] === 'string' ? ChatVarType.String : ChatVarType.Number,
+                value: newValue[key],
+              }
+            })
+            setObjectValue(newObjectValue)
+          }
+          catch {
+            // ignore JSON.parse errors
+          }
+        }
+      }
+    }
+    if (type === ChatVarType.ArrayString || type === ChatVarType.ArrayNumber) {
+      if (editInJSON) {
+        const newValue = (value?.length && value.filter(Boolean).length) ? value.filter(Boolean) : undefined
+        setValue(newValue)
+        if (!editorContent)
+          setEditorContent(JSON.stringify(newValue))
+      }
+      else {
+        setValue(value?.length ? value : [undefined])
+      }
+    }
+    setEditInJSON(editInJSON)
+  }
+
+  const handleEditorValueChange = (content: string) => {
+    if (!content) {
+      setEditorContent(content)
+      return setValue(undefined)
+    }
+    else {
+      setEditorContent(content)
+      try {
+        const newValue = JSON.parse(content)
+        setValue(newValue)
+      }
+      catch {
+        // ignore JSON.parse errors
+      }
+    }
+  }
+
+  const handleSave = () => {
+    if (!checkVariableName(name))
+      return
+    if (!chatVar && varList.some(chatVar => chatVar.name === name))
+      return notify({ type: 'error', message: 'name is existed' })
+    // if (type !== ChatVarType.Object && !value)
+    //   return notify({ type: 'error', message: 'value can not be empty' })
+    if (type === ChatVarType.Object && objectValue.some(item => !item.key && !!item.value))
+      return notify({ type: 'error', message: 'object key can not be empty' })
+
+    onSave({
+      id: chatVar ? chatVar.id : uuid4(),
+      name,
+      value_type: type,
+      value: formatValue(value),
+      description: des,
+    })
+    onClose()
+  }
+
+  useEffect(() => {
+    if (chatVar) {
+      setName(chatVar.name)
+      setType(chatVar.value_type)
+      setValue(chatVar.value)
+      setDes(chatVar.description)
+      setObjectValue(getObjectValue())
+      if (chatVar.value_type === ChatVarType.ArrayObject) {
+        setEditorContent(JSON.stringify(chatVar.value))
+        setEditInJSON(true)
+      }
+      else {
+        setEditInJSON(false)
+      }
+    }
+  }, [chatVar, getObjectValue])
+
+  return (
+    <div
+      className={cn('flex h-full w-[360px] flex-col rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-2xl', type === ChatVarType.Object && 'w-[480px]')}
+    >
+      <div className='system-xl-semibold mb-3 flex shrink-0 items-center justify-between p-4 pb-0 text-text-primary'>
+        {!chatVar ? t('workflow.chatVariable.modal.title') : t('workflow.chatVariable.modal.editTitle')}
+        <div className='flex items-center'>
+          <div
+            className='flex h-6 w-6 cursor-pointer items-center justify-center'
+            onClick={onClose}
+          >
+            <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+        </div>
+      </div>
+      <div className='max-h-[480px] overflow-y-auto px-4 py-2'>
+        {/* name */}
+        <div className='mb-4'>
+          <div className='system-sm-semibold mb-1 flex h-6 items-center text-text-secondary'>{t('workflow.chatVariable.modal.name')}</div>
+          <div className='flex'>
+            <Input
+              placeholder={t('workflow.chatVariable.modal.namePlaceholder') || ''}
+              value={name}
+              onChange={e => setName(e.target.value || '')}
+              onBlur={e => checkVariableName(e.target.value)}
+              type='text'
+            />
+          </div>
+        </div>
+        {/* type */}
+        <div className='mb-4'>
+          <div className='system-sm-semibold mb-1 flex h-6 items-center text-text-secondary'>{t('workflow.chatVariable.modal.type')}</div>
+          <div className='flex'>
+            <VariableTypeSelector
+              value={type}
+              list={typeList}
+              onSelect={handleTypeChange}
+              popupClassName='w-[327px]'
+            />
+          </div>
+        </div>
+        {/* default value */}
+        <div className='mb-4'>
+          <div className='system-sm-semibold mb-1 flex h-6 items-center justify-between text-text-secondary'>
+            <div>{t('workflow.chatVariable.modal.value')}</div>
+            {(type === ChatVarType.ArrayString || type === ChatVarType.ArrayNumber) && (
+              <Button
+                variant='ghost'
+                size='small'
+                className='text-text-tertiary'
+                onClick={() => handleEditorChange(!editInJSON)}
+              >
+                {editInJSON ? <RiInputField className='mr-1 h-3.5 w-3.5' /> : <RiDraftLine className='mr-1 h-3.5 w-3.5' />}
+                {editInJSON ? t('workflow.chatVariable.modal.oneByOne') : t('workflow.chatVariable.modal.editInJSON')}
+              </Button>
+            )}
+            {type === ChatVarType.Object && (
+              <Button
+                variant='ghost'
+                size='small'
+                className='text-text-tertiary'
+                onClick={() => handleEditorChange(!editInJSON)}
+              >
+                {editInJSON ? <RiInputField className='mr-1 h-3.5 w-3.5' /> : <RiDraftLine className='mr-1 h-3.5 w-3.5' />}
+                {editInJSON ? t('workflow.chatVariable.modal.editInForm') : t('workflow.chatVariable.modal.editInJSON')}
+              </Button>
+            )}
+          </div>
+          <div className='flex'>
+            {type === ChatVarType.String && (
+              // Input will remove \n\r, so use Textarea just like description area
+              <textarea
+                className='system-sm-regular placeholder:system-sm-regular block h-20 w-full resize-none appearance-none rounded-lg border border-transparent bg-components-input-bg-normal p-2 caret-primary-600 outline-none placeholder:text-components-input-text-placeholder hover:border-components-input-border-hover hover:bg-components-input-bg-hover focus:border-components-input-border-active focus:bg-components-input-bg-active focus:shadow-xs'
+                value={value}
+                placeholder={t('workflow.chatVariable.modal.valuePlaceholder') || ''}
+                onChange={e => setValue(e.target.value)}
+              />
+            )}
+            {type === ChatVarType.Number && (
+              <Input
+                placeholder={t('workflow.chatVariable.modal.valuePlaceholder') || ''}
+                value={value}
+                onChange={e => setValue(Number(e.target.value))}
+                type='number'
+              />
+            )}
+            {type === ChatVarType.Object && !editInJSON && (
+              <ObjectValueList
+                list={objectValue}
+                onChange={setObjectValue}
+              />
+            )}
+            {type === ChatVarType.ArrayString && !editInJSON && (
+              <ArrayValueList
+                isString
+                list={value || [undefined]}
+                onChange={setValue}
+              />
+            )}
+            {type === ChatVarType.ArrayNumber && !editInJSON && (
+              <ArrayValueList
+                isString={false}
+                list={value || [undefined]}
+                onChange={setValue}
+              />
+            )}
+            {editInJSON && (
+              <div className='w-full rounded-[10px] bg-components-input-bg-normal py-2 pl-3 pr-1' style={{ height: editorMinHeight }}>
+                <CodeEditor
+                  isExpand
+                  noWrapper
+                  language={CodeLanguage.json}
+                  value={editorContent}
+                  placeholder={<div className='whitespace-pre'>{placeholder}</div>}
+                  onChange={handleEditorValueChange}
+                />
+              </div>
+            )}
+          </div>
+        </div>
+        {/* description */}
+        <div className=''>
+          <div className='system-sm-semibold mb-1 flex h-6 items-center text-text-secondary'>{t('workflow.chatVariable.modal.description')}</div>
+          <div className='flex'>
+            <textarea
+              className='system-sm-regular placeholder:system-sm-regular block h-20 w-full resize-none appearance-none rounded-lg border border-transparent bg-components-input-bg-normal p-2 caret-primary-600 outline-none placeholder:text-components-input-text-placeholder hover:border-components-input-border-hover hover:bg-components-input-bg-hover focus:border-components-input-border-active focus:bg-components-input-bg-active focus:shadow-xs'
+              value={des}
+              placeholder={t('workflow.chatVariable.modal.descriptionPlaceholder') || ''}
+              onChange={e => setDes(e.target.value)}
+            />
+          </div>
+        </div>
+      </div>
+      <div className='flex flex-row-reverse rounded-b-2xl p-4 pt-2'>
+        <div className='flex gap-2'>
+          <Button onClick={onClose}>{t('common.operation.cancel')}</Button>
+          <Button variant='primary' onClick={handleSave}>{t('common.operation.save')}</Button>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default ChatVariableModal
diff --git a/app/components/workflow/panel/chat-variable-panel/components/variable-type-select.tsx b/app/components/workflow/panel/chat-variable-panel/components/variable-type-select.tsx
new file mode 100644
index 0000000..eea0ec2
--- /dev/null
+++ b/app/components/workflow/panel/chat-variable-panel/components/variable-type-select.tsx
@@ -0,0 +1,66 @@
+'use client'
+import React, { useState } from 'react'
+import { RiArrowDownSLine, RiCheckLine } from '@remixicon/react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import cn from '@/utils/classnames'
+
+type Props = {
+  inCell?: boolean
+  value?: any
+  list: any
+  onSelect: (value: any) => void
+  popupClassName?: string
+}
+
+const VariableTypeSelector = ({
+  inCell = false,
+  value,
+  list,
+  onSelect,
+  popupClassName,
+}: Props) => {
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={() => setOpen(v => !v)}
+      placement='bottom'
+    >
+      <PortalToFollowElemTrigger className='w-full' onClick={() => setOpen(v => !v)}>
+        <div className={cn(
+          'flex w-full cursor-pointer items-center px-2',
+          !inCell && 'radius-md bg-components-input-bg-normal py-1 hover:bg-state-base-hover-alt',
+          inCell && 'py-0.5 hover:bg-state-base-hover',
+          open && !inCell && 'bg-state-base-hover-alt hover:bg-state-base-hover-alt',
+          open && inCell && 'bg-state-base-hover hover:bg-state-base-hover',
+        )}>
+          <div className={cn(
+            'system-sm-regular grow truncate p-1 text-components-input-text-filled',
+            inCell && 'system-xs-regular text-text-secondary',
+          )}>{value}</div>
+          <RiArrowDownSLine className='ml-0.5 h-4 w-4 text-text-quaternary' />
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className={cn('z-[11] w-full', popupClassName)}>
+        <div className='radius-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
+          {list.map((item: any) => (
+            <div key={item} className='radius-md flex cursor-pointer items-center gap-2 py-[6px] pl-3 pr-2 hover:bg-state-base-hover' onClick={() => {
+              onSelect(item)
+              setOpen(false)
+            }}>
+              <div className='system-md-regular grow truncate text-text-secondary'>{item}</div>
+              {value === item && <RiCheckLine className='h-4 w-4 text-text-accent' />}
+            </div>
+          ))}
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default VariableTypeSelector
diff --git a/app/components/workflow/panel/chat-variable-panel/index.tsx b/app/components/workflow/panel/chat-variable-panel/index.tsx
new file mode 100644
index 0000000..ad00bdd
--- /dev/null
+++ b/app/components/workflow/panel/chat-variable-panel/index.tsx
@@ -0,0 +1,202 @@
+import {
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import { useContext } from 'use-context-selector'
+import {
+  useStoreApi,
+} from 'reactflow'
+import { RiBookOpenLine, RiCloseLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useStore } from '@/app/components/workflow/store'
+import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
+import { BubbleX, LongArrowLeft, LongArrowRight } from '@/app/components/base/icons/src/vender/line/others'
+import BlockIcon from '@/app/components/workflow/block-icon'
+import VariableModalTrigger from '@/app/components/workflow/panel/chat-variable-panel/components/variable-modal-trigger'
+import VariableItem from '@/app/components/workflow/panel/chat-variable-panel/components/variable-item'
+import RemoveEffectVarConfirm from '@/app/components/workflow/nodes/_base/components/remove-effect-var-confirm'
+import type {
+  ConversationVariable,
+} from '@/app/components/workflow/types'
+import { findUsedVarNodes, updateNodeVars } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+import { useNodesSyncDraft } from '@/app/components/workflow/hooks/use-nodes-sync-draft'
+import { BlockEnum } from '@/app/components/workflow/types'
+import I18n from '@/context/i18n'
+import { LanguagesSupported } from '@/i18n/language'
+import cn from '@/utils/classnames'
+
+const ChatVariablePanel = () => {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18n)
+  const store = useStoreApi()
+  const setShowChatVariablePanel = useStore(s => s.setShowChatVariablePanel)
+  const varList = useStore(s => s.conversationVariables) as ConversationVariable[]
+  const updateChatVarList = useStore(s => s.setConversationVariables)
+  const { doSyncWorkflowDraft } = useNodesSyncDraft()
+
+  const [showTip, setShowTip] = useState(true)
+  const [showVariableModal, setShowVariableModal] = useState(false)
+  const [currentVar, setCurrentVar] = useState<ConversationVariable>()
+
+  const [showRemoveVarConfirm, setShowRemoveConfirm] = useState(false)
+  const [cacheForDelete, setCacheForDelete] = useState<ConversationVariable>()
+
+  const getEffectedNodes = useCallback((chatVar: ConversationVariable) => {
+    const { getNodes } = store.getState()
+    const allNodes = getNodes()
+    return findUsedVarNodes(
+      ['conversation', chatVar.name],
+      allNodes,
+    )
+  }, [store])
+
+  const removeUsedVarInNodes = useCallback((chatVar: ConversationVariable) => {
+    const { getNodes, setNodes } = store.getState()
+    const effectedNodes = getEffectedNodes(chatVar)
+    const newNodes = getNodes().map((node) => {
+      if (effectedNodes.find(n => n.id === node.id))
+        return updateNodeVars(node, ['conversation', chatVar.name], [])
+
+      return node
+    })
+    setNodes(newNodes)
+  }, [getEffectedNodes, store])
+
+  const handleEdit = (chatVar: ConversationVariable) => {
+    setCurrentVar(chatVar)
+    setShowVariableModal(true)
+  }
+
+  const handleDelete = useCallback((chatVar: ConversationVariable) => {
+    removeUsedVarInNodes(chatVar)
+    updateChatVarList(varList.filter(v => v.id !== chatVar.id))
+    setCacheForDelete(undefined)
+    setShowRemoveConfirm(false)
+    doSyncWorkflowDraft()
+  }, [doSyncWorkflowDraft, removeUsedVarInNodes, updateChatVarList, varList])
+
+  const deleteCheck = useCallback((chatVar: ConversationVariable) => {
+    const effectedNodes = getEffectedNodes(chatVar)
+    if (effectedNodes.length > 0) {
+      setCacheForDelete(chatVar)
+      setShowRemoveConfirm(true)
+    }
+    else {
+      handleDelete(chatVar)
+    }
+  }, [getEffectedNodes, handleDelete])
+
+  const handleSave = useCallback(async (chatVar: ConversationVariable) => {
+    // add chatVar
+    if (!currentVar) {
+      const newList = [chatVar, ...varList]
+      updateChatVarList(newList)
+      doSyncWorkflowDraft()
+      return
+    }
+    // edit chatVar
+    const newList = varList.map(v => v.id === currentVar.id ? chatVar : v)
+    updateChatVarList(newList)
+    // side effects of rename env
+    if (currentVar.name !== chatVar.name) {
+      const { getNodes, setNodes } = store.getState()
+      const effectedNodes = getEffectedNodes(currentVar)
+      const newNodes = getNodes().map((node) => {
+        if (effectedNodes.find(n => n.id === node.id))
+          return updateNodeVars(node, ['conversation', currentVar.name], ['conversation', chatVar.name])
+
+        return node
+      })
+      setNodes(newNodes)
+    }
+    doSyncWorkflowDraft()
+  }, [currentVar, doSyncWorkflowDraft, getEffectedNodes, store, updateChatVarList, varList])
+
+  return (
+    <div
+      className={cn(
+        'relative flex h-full w-[420px] flex-col rounded-l-2xl border border-components-panel-border bg-components-panel-bg-alt',
+      )}
+    >
+      <div className='system-xl-semibold flex shrink-0 items-center justify-between p-4 pb-0 text-text-primary'>
+        {t('workflow.chatVariable.panelTitle')}
+        <div className='flex items-center gap-1'>
+          <ActionButton state={showTip ? ActionButtonState.Active : undefined} onClick={() => setShowTip(!showTip)}>
+            <RiBookOpenLine className='h-4 w-4' />
+          </ActionButton>
+          <div
+            className='flex h-6 w-6 cursor-pointer items-center justify-center'
+            onClick={() => setShowChatVariablePanel(false)}
+          >
+            <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+        </div>
+      </div>
+      {showTip && (
+        <div className='shrink-0 px-3 pb-2 pt-2.5'>
+          <div className='radius-2xl relative bg-background-section-burn p-3'>
+            <div className='system-2xs-medium-uppercase inline-block rounded-[5px] border border-divider-deep px-[5px] py-[3px] text-text-tertiary'>TIPS</div>
+            <div className='system-sm-regular mb-4 mt-1 text-text-secondary'>
+              {t('workflow.chatVariable.panelDescription')}
+              <a target='_blank' rel='noopener noreferrer' className='text-text-accent' href={locale !== LanguagesSupported[1] ? 'https://docs.dify.ai/guides/workflow/variables#conversation-variables' : `https://docs.dify.ai/${locale.toLowerCase()}/guides/workflow/variables#hui-hua-bian-liang`}>{t('workflow.chatVariable.docLink')}</a>
+            </div>
+            <div className='flex items-center gap-2'>
+              <div className='radius-lg flex flex-col border border-workflow-block-border bg-workflow-block-bg p-3 pb-4 shadow-md'>
+                <BubbleX className='mb-1 h-4 w-4 shrink-0 text-util-colors-teal-teal-700' />
+                <div className='system-xs-semibold text-text-secondary'>conversation_var</div>
+                <div className='system-2xs-regular text-text-tertiary'>String</div>
+              </div>
+              <div className='grow'>
+                <div className='mb-2 flex items-center gap-2 py-1'>
+                  <div className='flex h-3 w-16 shrink-0 items-center gap-1 px-1'>
+                    <LongArrowLeft className='h-2 grow text-text-quaternary' />
+                    <div className='system-2xs-medium shrink-0 text-text-tertiary'>WRITE</div>
+                  </div>
+                  <BlockIcon className='shrink-0' type={BlockEnum.Assigner} />
+                  <div className='system-xs-semibold grow truncate text-text-secondary'>{t('workflow.blocks.assigner')}</div>
+                </div>
+                <div className='flex items-center gap-2 py-1'>
+                  <div className='flex h-3 w-16 shrink-0 items-center gap-1 px-1'>
+                    <div className='system-2xs-medium shrink-0 text-text-tertiary'>READ</div>
+                    <LongArrowRight className='h-2 grow text-text-quaternary' />
+                  </div>
+                  <BlockIcon className='shrink-0' type={BlockEnum.LLM} />
+                  <div className='system-xs-semibold grow truncate text-text-secondary'>{t('workflow.blocks.llm')}</div>
+                </div>
+              </div>
+            </div>
+            <div className='absolute right-[38px] top-[-4px] z-10 h-3 w-3 rotate-45 bg-background-section-burn'/>
+          </div>
+        </div>
+      )}
+      <div className='shrink-0 px-4 pb-3 pt-2'>
+        <VariableModalTrigger
+          open={showVariableModal}
+          setOpen={setShowVariableModal}
+          showTip={showTip}
+          chatVar={currentVar}
+          onSave={handleSave}
+          onClose={() => setCurrentVar(undefined)}
+        />
+      </div>
+      <div className='grow overflow-y-auto rounded-b-2xl px-4'>
+        {varList.map(chatVar => (
+          <VariableItem
+            key={chatVar.id}
+            item={chatVar}
+            onEdit={handleEdit}
+            onDelete={deleteCheck}
+          />
+        ))}
+      </div>
+      <RemoveEffectVarConfirm
+        isShow={showRemoveVarConfirm}
+        onCancel={() => setShowRemoveConfirm(false)}
+        onConfirm={() => cacheForDelete && handleDelete(cacheForDelete)}
+      />
+    </div>
+  )
+}
+
+export default memo(ChatVariablePanel)
diff --git a/app/components/workflow/panel/chat-variable-panel/type.ts b/app/components/workflow/panel/chat-variable-panel/type.ts
new file mode 100644
index 0000000..2a4e776
--- /dev/null
+++ b/app/components/workflow/panel/chat-variable-panel/type.ts
@@ -0,0 +1,8 @@
+export enum ChatVarType {
+  Number = 'number',
+  String = 'string',
+  Object = 'object',
+  ArrayString = 'array[string]',
+  ArrayNumber = 'array[number]',
+  ArrayObject = 'array[object]',
+}
diff --git a/app/components/workflow/panel/debug-and-preview/chat-wrapper.tsx b/app/components/workflow/panel/debug-and-preview/chat-wrapper.tsx
new file mode 100644
index 0000000..8f45bc5
--- /dev/null
+++ b/app/components/workflow/panel/debug-and-preview/chat-wrapper.tsx
@@ -0,0 +1,168 @@
+import { memo, useCallback, useEffect, useImperativeHandle, useMemo } from 'react'
+import { useNodes } from 'reactflow'
+import { BlockEnum } from '../../types'
+import {
+  useStore,
+  useWorkflowStore,
+} from '../../store'
+import type { StartNodeType } from '../../nodes/start/types'
+import Empty from './empty'
+import UserInput from './user-input'
+import ConversationVariableModal from './conversation-variable-modal'
+import { useChat } from './hooks'
+import type { ChatWrapperRefType } from './index'
+import Chat from '@/app/components/base/chat/chat'
+import type { ChatItem, ChatItemInTree, OnSend } from '@/app/components/base/chat/types'
+import { useFeatures } from '@/app/components/base/features/hooks'
+import {
+  fetchSuggestedQuestions,
+  stopChatMessageResponding,
+} from '@/service/debug'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { getLastAnswer, isValidGeneratedAnswer } from '@/app/components/base/chat/utils'
+import type { FileEntity } from '@/app/components/base/file-uploader/types'
+
+type ChatWrapperProps = {
+  showConversationVariableModal: boolean
+  onConversationModalHide: () => void
+  showInputsFieldsPanel: boolean
+  onHide: () => void
+}
+
+const ChatWrapper = (
+  {
+    ref,
+    showConversationVariableModal,
+    onConversationModalHide,
+    showInputsFieldsPanel,
+    onHide,
+  }: ChatWrapperProps & {
+    ref: React.RefObject<ChatWrapperRefType>;
+  },
+) => {
+  const nodes = useNodes<StartNodeType>()
+  const startNode = nodes.find(node => node.data.type === BlockEnum.Start)
+  const startVariables = startNode?.data.variables
+  const appDetail = useAppStore(s => s.appDetail)
+  const workflowStore = useWorkflowStore()
+  const inputs = useStore(s => s.inputs)
+  const features = useFeatures(s => s.features)
+  const config = useMemo(() => {
+    return {
+      opening_statement: features.opening?.enabled ? (features.opening?.opening_statement || '') : '',
+      suggested_questions: features.opening?.enabled ? (features.opening?.suggested_questions || []) : [],
+      suggested_questions_after_answer: features.suggested,
+      text_to_speech: features.text2speech,
+      speech_to_text: features.speech2text,
+      retriever_resource: features.citation,
+      sensitive_word_avoidance: features.moderation,
+      file_upload: features.file,
+    }
+  }, [features.opening, features.suggested, features.text2speech, features.speech2text, features.citation, features.moderation, features.file])
+  const setShowFeaturesPanel = useStore(s => s.setShowFeaturesPanel)
+
+  const {
+    conversationId,
+    chatList,
+    handleStop,
+    isResponding,
+    suggestedQuestions,
+    handleSend,
+    handleRestart,
+    setTargetMessageId,
+  } = useChat(
+    config,
+    {
+      inputs,
+      inputsForm: (startVariables || []) as any,
+    },
+    [],
+    taskId => stopChatMessageResponding(appDetail!.id, taskId),
+  )
+
+  const doSend: OnSend = useCallback((message, files, isRegenerate = false, parentAnswer: ChatItem | null = null) => {
+    handleSend(
+      {
+        query: message,
+        files,
+        inputs: workflowStore.getState().inputs,
+        conversation_id: conversationId,
+        parent_message_id: (isRegenerate ? parentAnswer?.id : getLastAnswer(chatList)?.id) || undefined,
+      },
+      {
+        onGetSuggestedQuestions: (messageId, getAbortController) => fetchSuggestedQuestions(appDetail!.id, messageId, getAbortController),
+      },
+    )
+  }, [handleSend, workflowStore, conversationId, chatList, appDetail])
+
+  const doRegenerate = useCallback((chatItem: ChatItemInTree, editedQuestion?: { message: string, files?: FileEntity[] }) => {
+    const question = editedQuestion ? chatItem : chatList.find(item => item.id === chatItem.parentMessageId)!
+    const parentAnswer = chatList.find(item => item.id === question.parentMessageId)
+    doSend(editedQuestion ? editedQuestion.message : question.content,
+      editedQuestion ? editedQuestion.files : question.message_files,
+      true,
+      isValidGeneratedAnswer(parentAnswer) ? parentAnswer : null,
+    )
+  }, [chatList, doSend])
+
+  useImperativeHandle(ref, () => {
+    return {
+      handleRestart,
+    }
+  }, [handleRestart])
+
+  useEffect(() => {
+    if (isResponding)
+      onHide()
+  }, [isResponding, onHide])
+
+  return (
+    <>
+      <Chat
+        config={{
+          ...config,
+          supportCitationHitInfo: true,
+        } as any}
+        chatList={chatList}
+        isResponding={isResponding}
+        chatContainerClassName='px-3'
+        chatContainerInnerClassName='pt-6 w-full max-w-full mx-auto'
+        chatFooterClassName='px-4 rounded-bl-2xl'
+        chatFooterInnerClassName='pb-0'
+        showFileUpload
+        showFeatureBar
+        onFeatureBarClick={setShowFeaturesPanel}
+        onSend={doSend}
+        inputs={inputs}
+        inputsForm={(startVariables || []) as any}
+        onRegenerate={doRegenerate}
+        onStopResponding={handleStop}
+        chatNode={(
+          <>
+            {showInputsFieldsPanel && <UserInput />}
+            {
+              !chatList.length && (
+                <Empty />
+              )
+            }
+          </>
+        )}
+        noSpacing
+        suggestedQuestions={suggestedQuestions}
+        showPromptLog
+        chatAnswerContainerInner='!pr-2'
+        switchSibling={setTargetMessageId}
+      />
+      {showConversationVariableModal && (
+        <ConversationVariableModal
+          conversationID={conversationId}
+          onHide={onConversationModalHide}
+        />
+      )}
+    </>
+  )
+}
+
+ChatWrapper.displayName = 'ChatWrapper'
+
+export default memo(ChatWrapper)
diff --git a/app/components/workflow/panel/debug-and-preview/conversation-variable-modal.tsx b/app/components/workflow/panel/debug-and-preview/conversation-variable-modal.tsx
new file mode 100644
index 0000000..57fe461
--- /dev/null
+++ b/app/components/workflow/panel/debug-and-preview/conversation-variable-modal.tsx
@@ -0,0 +1,156 @@
+'use client'
+import React, { useCallback } from 'react'
+import { useMount } from 'ahooks'
+import { useTranslation } from 'react-i18next'
+import { capitalize } from 'lodash-es'
+import copy from 'copy-to-clipboard'
+import { RiCloseLine } from '@remixicon/react'
+import Modal from '@/app/components/base/modal'
+import { BubbleX } from '@/app/components/base/icons/src/vender/line/others'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
+import {
+  Clipboard,
+  ClipboardCheck,
+} from '@/app/components/base/icons/src/vender/line/files'
+import { useStore } from '@/app/components/workflow/store'
+import type {
+  ConversationVariable,
+} from '@/app/components/workflow/types'
+import { ChatVarType } from '@/app/components/workflow/panel/chat-variable-panel/type'
+import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+import useTimestamp from '@/hooks/use-timestamp'
+import { fetchCurrentValueOfConversationVariable } from '@/service/workflow'
+import cn from '@/utils/classnames'
+import { noop } from 'lodash-es'
+
+export type Props = {
+  conversationID: string
+  onHide: () => void
+}
+
+const ConversationVariableModal = ({
+  conversationID,
+  onHide,
+}: Props) => {
+  const { t } = useTranslation()
+  const { formatTime } = useTimestamp()
+  const varList = useStore(s => s.conversationVariables) as ConversationVariable[]
+  const appID = useStore(s => s.appId)
+  const [currentVar, setCurrentVar] = React.useState<ConversationVariable>(varList[0])
+  const [latestValueMap, setLatestValueMap] = React.useState<Record<string, string>>({})
+  const [latestValueTimestampMap, setLatestValueTimestampMap] = React.useState<Record<string, number>>({})
+
+  const getChatVarLatestValues = useCallback(async () => {
+    if (conversationID && varList.length > 0) {
+      const res = await fetchCurrentValueOfConversationVariable({
+        url: `/apps/${appID}/conversation-variables`,
+        params: { conversation_id: conversationID },
+      })
+      if (res.data.length > 0) {
+        const valueMap = res.data.reduce((acc: any, cur) => {
+          acc[cur.id] = cur.value
+          return acc
+        }, {})
+        setLatestValueMap(valueMap)
+        const timestampMap = res.data.reduce((acc: any, cur) => {
+          acc[cur.id] = cur.updated_at
+          return acc
+        }, {})
+        setLatestValueTimestampMap(timestampMap)
+      }
+    }
+  }, [appID, conversationID, varList.length])
+
+  const [isCopied, setIsCopied] = React.useState(false)
+  const handleCopy = useCallback(() => {
+    copy(currentVar.value)
+    setIsCopied(true)
+    setTimeout(() => {
+      setIsCopied(false)
+    }, 2000)
+  }, [currentVar.value])
+
+  useMount(() => {
+    getChatVarLatestValues()
+  })
+
+  return (
+    <Modal
+      isShow
+      onClose={noop}
+      className={cn('h-[640px] w-[920px] max-w-[920px] p-0')}
+    >
+      <div className='absolute right-4 top-4 cursor-pointer p-2' onClick={onHide}>
+        <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+      </div>
+      <div className='flex h-full w-full'>
+        {/* LEFT */}
+        <div className='flex h-full w-[224px] shrink-0 flex-col border-r border-divider-burn bg-background-sidenav-bg'>
+          <div className='system-xl-semibold shrink-0 pb-3 pl-5 pr-4 pt-5 text-text-primary'>{t('workflow.chatVariable.panelTitle')}</div>
+          <div className='grow overflow-y-auto px-3 py-2'>
+            {varList.map(chatVar => (
+              <div key={chatVar.id} className={cn('radius-md group mb-0.5 flex cursor-pointer items-center p-2 hover:bg-state-base-hover', currentVar.id === chatVar.id && 'bg-state-base-hover')} onClick={() => setCurrentVar(chatVar)}>
+                <BubbleX className={cn('mr-1 h-4 w-4 shrink-0 text-text-tertiary group-hover:text-util-colors-teal-teal-700', currentVar.id === chatVar.id && 'text-util-colors-teal-teal-700')} />
+                <div title={chatVar.name} className={cn('system-sm-medium truncate text-text-tertiary group-hover:text-util-colors-teal-teal-700', currentVar.id === chatVar.id && 'text-util-colors-teal-teal-700')}>{chatVar.name}</div>
+              </div>
+            ))}
+          </div>
+        </div>
+        {/* RIGHT */}
+        <div className='flex h-full w-0 grow flex-col bg-components-panel-bg'>
+          <div className='shrink-0 p-4 pb-2'>
+            <div className='flex items-center gap-1 py-1'>
+              <div className='system-xl-semibold text-text-primary'>{currentVar.name}</div>
+              <div className='system-xs-medium text-text-tertiary'>{capitalize(currentVar.value_type)}</div>
+            </div>
+          </div>
+          <div className='flex h-0 grow flex-col p-4 pt-2'>
+            <div className='mb-2 flex shrink-0 items-center gap-2'>
+              <div className='system-xs-medium-uppercase shrink-0 text-text-tertiary'>{t('workflow.chatVariable.storedContent').toLocaleUpperCase()}</div>
+              <div className='h-[1px] grow' style={{
+                background: 'linear-gradient(to right, rgba(16, 24, 40, 0.08) 0%, rgba(255, 255, 255) 100%)',
+              }}></div>
+              {latestValueTimestampMap[currentVar.id] && (
+                <div className='system-xs-regular shrink-0 text-text-tertiary'>{t('workflow.chatVariable.updatedAt')}{formatTime(latestValueTimestampMap[currentVar.id], t('appLog.dateTimeFormat') as string)}</div>
+              )}
+            </div>
+            <div className='grow overflow-y-auto'>
+              {currentVar.value_type !== ChatVarType.Number && currentVar.value_type !== ChatVarType.String && (
+                <div className='flex h-full flex-col rounded-lg bg-components-input-bg-normal px-2 pb-2'>
+                  <div className='flex h-7 shrink-0 items-center justify-between pl-3 pr-2 pt-1'>
+                    <div className='system-xs-semibold text-text-secondary'>JSON</div>
+                    <div className='flex items-center p-1'>
+                      {!isCopied
+                        ? (
+                          <Clipboard className='h-4 w-4 cursor-pointer text-text-tertiary' onClick={handleCopy} />
+                        )
+                        : (
+                          <ClipboardCheck className='h-4 w-4 text-text-tertiary' />
+                        )
+                      }
+                    </div>
+                  </div>
+                  <div className='grow pl-4'>
+                    <CodeEditor
+                      readOnly
+                      noWrapper
+                      isExpand
+                      language={CodeLanguage.json}
+                      value={latestValueMap[currentVar.id] || ''}
+                      isJSONStringifyBeauty
+                    />
+                  </div>
+                </div>
+              )}
+              {(currentVar.value_type === ChatVarType.Number || currentVar.value_type === ChatVarType.String) && (
+                <div className='system-md-regular h-full overflow-y-auto overflow-x-hidden rounded-lg bg-components-input-bg-normal px-4 py-3 text-components-input-text-filled'>{latestValueMap[currentVar.id] || ''}</div>
+              )}
+            </div>
+          </div>
+        </div>
+      </div>
+    </Modal>
+  )
+}
+
+export default ConversationVariableModal
diff --git a/app/components/workflow/panel/debug-and-preview/empty.tsx b/app/components/workflow/panel/debug-and-preview/empty.tsx
new file mode 100644
index 0000000..7f120c3
--- /dev/null
+++ b/app/components/workflow/panel/debug-and-preview/empty.tsx
@@ -0,0 +1,19 @@
+import { useTranslation } from 'react-i18next'
+import { ChatBotSlim } from '@/app/components/base/icons/src/vender/line/communication'
+
+const Empty = () => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2'>
+      <div className='mb-2 flex justify-center'>
+        <ChatBotSlim className='h-12 w-12 text-gray-300' />
+      </div>
+      <div className='w-[256px] text-center text-[13px] text-gray-400'>
+        {t('workflow.common.previewPlaceholder')}
+      </div>
+    </div>
+  )
+}
+
+export default Empty
diff --git a/app/components/workflow/panel/debug-and-preview/hooks.ts b/app/components/workflow/panel/debug-and-preview/hooks.ts
new file mode 100644
index 0000000..4ef33a6
--- /dev/null
+++ b/app/components/workflow/panel/debug-and-preview/hooks.ts
@@ -0,0 +1,506 @@
+import {
+  useCallback,
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { produce, setAutoFreeze } from 'immer'
+import { uniqBy } from 'lodash-es'
+import { useWorkflowRun } from '../../hooks'
+import { NodeRunningStatus, WorkflowRunningStatus } from '../../types'
+import { useWorkflowStore } from '../../store'
+import { DEFAULT_ITER_TIMES, DEFAULT_LOOP_TIMES } from '../../constants'
+import type {
+  ChatItem,
+  ChatItemInTree,
+  Inputs,
+} from '@/app/components/base/chat/types'
+import type { InputForm } from '@/app/components/base/chat/chat/type'
+import {
+  getProcessedInputs,
+  processOpeningStatement,
+} from '@/app/components/base/chat/chat/utils'
+import { useToastContext } from '@/app/components/base/toast'
+import { TransferMethod } from '@/types/app'
+import {
+  getProcessedFiles,
+  getProcessedFilesFromResponse,
+} from '@/app/components/base/file-uploader/utils'
+import type { FileEntity } from '@/app/components/base/file-uploader/types'
+import { getThreadMessages } from '@/app/components/base/chat/utils'
+
+type GetAbortController = (abortController: AbortController) => void
+type SendCallback = {
+  onGetSuggestedQuestions?: (responseItemId: string, getAbortController: GetAbortController) => Promise<any>
+}
+export const useChat = (
+  config: any,
+  formSettings?: {
+    inputs: Inputs
+    inputsForm: InputForm[]
+  },
+  prevChatTree?: ChatItemInTree[],
+  stopChat?: (taskId: string) => void,
+) => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const { handleRun } = useWorkflowRun()
+  const hasStopResponded = useRef(false)
+  const workflowStore = useWorkflowStore()
+  const conversationId = useRef('')
+  const taskIdRef = useRef('')
+  const [isResponding, setIsResponding] = useState(false)
+  const isRespondingRef = useRef(false)
+  const [suggestedQuestions, setSuggestQuestions] = useState<string[]>([])
+  const suggestedQuestionsAbortControllerRef = useRef<AbortController | null>(null)
+  const {
+    setIterTimes,
+    setLoopTimes,
+  } = workflowStore.getState()
+
+  const handleResponding = useCallback((isResponding: boolean) => {
+    setIsResponding(isResponding)
+    isRespondingRef.current = isResponding
+  }, [])
+
+  const [chatTree, setChatTree] = useState<ChatItemInTree[]>(prevChatTree || [])
+  const chatTreeRef = useRef<ChatItemInTree[]>(chatTree)
+  const [targetMessageId, setTargetMessageId] = useState<string>()
+  const threadMessages = useMemo(() => getThreadMessages(chatTree, targetMessageId), [chatTree, targetMessageId])
+
+  const getIntroduction = useCallback((str: string) => {
+    return processOpeningStatement(str, formSettings?.inputs || {}, formSettings?.inputsForm || [])
+  }, [formSettings?.inputs, formSettings?.inputsForm])
+
+  /** Final chat list that will be rendered */
+  const chatList = useMemo(() => {
+    const ret = [...threadMessages]
+    if (config?.opening_statement) {
+      const index = threadMessages.findIndex(item => item.isOpeningStatement)
+
+      if (index > -1) {
+        ret[index] = {
+          ...ret[index],
+          content: getIntroduction(config.opening_statement),
+          suggestedQuestions: config.suggested_questions,
+        }
+      }
+      else {
+        ret.unshift({
+          id: `${Date.now()}`,
+          content: getIntroduction(config.opening_statement),
+          isAnswer: true,
+          isOpeningStatement: true,
+          suggestedQuestions: config.suggested_questions,
+        })
+      }
+    }
+    return ret
+  }, [threadMessages, config?.opening_statement, getIntroduction, config?.suggested_questions])
+
+  useEffect(() => {
+    setAutoFreeze(false)
+    return () => {
+      setAutoFreeze(true)
+    }
+  }, [])
+
+  /** Find the target node by bfs and then operate on it */
+  const produceChatTreeNode = useCallback((targetId: string, operation: (node: ChatItemInTree) => void) => {
+    return produce(chatTreeRef.current, (draft) => {
+      const queue: ChatItemInTree[] = [...draft]
+      while (queue.length > 0) {
+        const current = queue.shift()!
+        if (current.id === targetId) {
+          operation(current)
+          break
+        }
+        if (current.children)
+          queue.push(...current.children)
+      }
+    })
+  }, [])
+
+  const handleStop = useCallback(() => {
+    hasStopResponded.current = true
+    handleResponding(false)
+    if (stopChat && taskIdRef.current)
+      stopChat(taskIdRef.current)
+    setIterTimes(DEFAULT_ITER_TIMES)
+    setLoopTimes(DEFAULT_LOOP_TIMES)
+    if (suggestedQuestionsAbortControllerRef.current)
+      suggestedQuestionsAbortControllerRef.current.abort()
+  }, [handleResponding, setIterTimes, setLoopTimes, stopChat])
+
+  const handleRestart = useCallback(() => {
+    conversationId.current = ''
+    taskIdRef.current = ''
+    handleStop()
+    setIterTimes(DEFAULT_ITER_TIMES)
+    setLoopTimes(DEFAULT_LOOP_TIMES)
+    setChatTree([])
+    setSuggestQuestions([])
+  }, [
+    handleStop,
+    setIterTimes,
+    setLoopTimes,
+  ])
+
+  const updateCurrentQAOnTree = useCallback(({
+    parentId,
+    responseItem,
+    placeholderQuestionId,
+    questionItem,
+  }: {
+    parentId?: string
+    responseItem: ChatItem
+    placeholderQuestionId: string
+    questionItem: ChatItem
+  }) => {
+    let nextState: ChatItemInTree[]
+    const currentQA = { ...questionItem, children: [{ ...responseItem, children: [] }] }
+    if (!parentId && !chatTree.some(item => [placeholderQuestionId, questionItem.id].includes(item.id))) {
+      // QA whose parent is not provided is considered as a first message of the conversation,
+      // and it should be a root node of the chat tree
+      nextState = produce(chatTree, (draft) => {
+        draft.push(currentQA)
+      })
+    }
+    else {
+      // find the target QA in the tree and update it; if not found, insert it to its parent node
+      nextState = produceChatTreeNode(parentId!, (parentNode) => {
+        const questionNodeIndex = parentNode.children!.findIndex(item => [placeholderQuestionId, questionItem.id].includes(item.id))
+        if (questionNodeIndex === -1)
+          parentNode.children!.push(currentQA)
+        else
+          parentNode.children![questionNodeIndex] = currentQA
+      })
+    }
+    setChatTree(nextState)
+    chatTreeRef.current = nextState
+  }, [chatTree, produceChatTreeNode])
+
+  const handleSend = useCallback((
+    params: {
+      query: string
+      files?: FileEntity[]
+      parent_message_id?: string
+      [key: string]: any
+    },
+    {
+      onGetSuggestedQuestions,
+    }: SendCallback,
+  ) => {
+    if (isRespondingRef.current) {
+      notify({ type: 'info', message: t('appDebug.errorMessage.waitForResponse') })
+      return false
+    }
+
+    const parentMessage = threadMessages.find(item => item.id === params.parent_message_id)
+
+    const placeholderQuestionId = `question-${Date.now()}`
+    const questionItem = {
+      id: placeholderQuestionId,
+      content: params.query,
+      isAnswer: false,
+      message_files: params.files,
+      parentMessageId: params.parent_message_id,
+    }
+
+    const placeholderAnswerId = `answer-placeholder-${Date.now()}`
+    const placeholderAnswerItem = {
+      id: placeholderAnswerId,
+      content: '',
+      isAnswer: true,
+      parentMessageId: questionItem.id,
+      siblingIndex: parentMessage?.children?.length ?? chatTree.length,
+    }
+
+    setTargetMessageId(parentMessage?.id)
+    updateCurrentQAOnTree({
+      parentId: params.parent_message_id,
+      responseItem: placeholderAnswerItem,
+      placeholderQuestionId,
+      questionItem,
+    })
+
+    // answer
+    const responseItem: ChatItem = {
+      id: placeholderAnswerId,
+      content: '',
+      agent_thoughts: [],
+      message_files: [],
+      isAnswer: true,
+      parentMessageId: questionItem.id,
+      siblingIndex: parentMessage?.children?.length ?? chatTree.length,
+    }
+
+    handleResponding(true)
+
+    const { files, inputs, ...restParams } = params
+    const bodyParams = {
+      files: getProcessedFiles(files || []),
+      inputs: getProcessedInputs(inputs || {}, formSettings?.inputsForm || []),
+      ...restParams,
+    }
+    if (bodyParams?.files?.length) {
+      bodyParams.files = bodyParams.files.map((item) => {
+        if (item.transfer_method === TransferMethod.local_file) {
+          return {
+            ...item,
+            url: '',
+          }
+        }
+        return item
+      })
+    }
+
+    let hasSetResponseId = false
+
+    handleRun(
+      bodyParams,
+      {
+        onData: (message: string, isFirstMessage: boolean, { conversationId: newConversationId, messageId, taskId }: any) => {
+          responseItem.content = responseItem.content + message
+
+          if (messageId && !hasSetResponseId) {
+            questionItem.id = `question-${messageId}`
+            responseItem.id = messageId
+            responseItem.parentMessageId = questionItem.id
+            hasSetResponseId = true
+          }
+
+          if (isFirstMessage && newConversationId)
+            conversationId.current = newConversationId
+
+          taskIdRef.current = taskId
+          if (messageId)
+            responseItem.id = messageId
+
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: params.parent_message_id,
+          })
+        },
+        async onCompleted(hasError?: boolean, errorMessage?: string) {
+          handleResponding(false)
+
+          if (hasError) {
+            if (errorMessage) {
+              responseItem.content = errorMessage
+              responseItem.isError = true
+              updateCurrentQAOnTree({
+                placeholderQuestionId,
+                questionItem,
+                responseItem,
+                parentId: params.parent_message_id,
+              })
+            }
+            return
+          }
+
+          if (config?.suggested_questions_after_answer?.enabled && !hasStopResponded.current && onGetSuggestedQuestions) {
+            try {
+              const { data }: any = await onGetSuggestedQuestions(
+                responseItem.id,
+                newAbortController => suggestedQuestionsAbortControllerRef.current = newAbortController,
+              )
+              setSuggestQuestions(data)
+            }
+            // eslint-disable-next-line unused-imports/no-unused-vars
+            catch (error) {
+              setSuggestQuestions([])
+            }
+          }
+        },
+        onMessageEnd: (messageEnd) => {
+          responseItem.citation = messageEnd.metadata?.retriever_resources || []
+          const processedFilesFromResponse = getProcessedFilesFromResponse(messageEnd.files || [])
+          responseItem.allFiles = uniqBy([...(responseItem.allFiles || []), ...(processedFilesFromResponse || [])], 'id')
+
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: params.parent_message_id,
+          })
+        },
+        onMessageReplace: (messageReplace) => {
+          responseItem.content = messageReplace.answer
+        },
+        onError() {
+          handleResponding(false)
+        },
+        onWorkflowStarted: ({ workflow_run_id, task_id }) => {
+          taskIdRef.current = task_id
+          responseItem.workflow_run_id = workflow_run_id
+          responseItem.workflowProcess = {
+            status: WorkflowRunningStatus.Running,
+            tracing: [],
+          }
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: params.parent_message_id,
+          })
+        },
+        onWorkflowFinished: ({ data }) => {
+          responseItem.workflowProcess!.status = data.status as WorkflowRunningStatus
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: params.parent_message_id,
+          })
+        },
+        onIterationStart: ({ data }) => {
+          responseItem.workflowProcess!.tracing!.push({
+            ...data,
+            status: NodeRunningStatus.Running,
+          })
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: params.parent_message_id,
+          })
+        },
+        onIterationFinish: ({ data }) => {
+          const currentTracingIndex = responseItem.workflowProcess!.tracing!.findIndex(item => item.id === data.id)
+          if (currentTracingIndex > -1) {
+            responseItem.workflowProcess!.tracing[currentTracingIndex] = {
+              ...responseItem.workflowProcess!.tracing[currentTracingIndex],
+              ...data,
+            }
+            updateCurrentQAOnTree({
+              placeholderQuestionId,
+              questionItem,
+              responseItem,
+              parentId: params.parent_message_id,
+            })
+          }
+        },
+        onLoopStart: ({ data }) => {
+          responseItem.workflowProcess!.tracing!.push({
+            ...data,
+            status: NodeRunningStatus.Running,
+          })
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: params.parent_message_id,
+          })
+        },
+        onLoopFinish: ({ data }) => {
+          const currentTracingIndex = responseItem.workflowProcess!.tracing!.findIndex(item => item.id === data.id)
+          if (currentTracingIndex > -1) {
+            responseItem.workflowProcess!.tracing[currentTracingIndex] = {
+              ...responseItem.workflowProcess!.tracing[currentTracingIndex],
+              ...data,
+            }
+            updateCurrentQAOnTree({
+              placeholderQuestionId,
+              questionItem,
+              responseItem,
+              parentId: params.parent_message_id,
+            })
+          }
+        },
+        onNodeStarted: ({ data }) => {
+          responseItem.workflowProcess!.tracing!.push({
+            ...data,
+            status: NodeRunningStatus.Running,
+          } as any)
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: params.parent_message_id,
+          })
+        },
+        onNodeRetry: ({ data }) => {
+          responseItem.workflowProcess!.tracing!.push(data)
+
+          updateCurrentQAOnTree({
+            placeholderQuestionId,
+            questionItem,
+            responseItem,
+            parentId: params.parent_message_id,
+          })
+        },
+        onNodeFinished: ({ data }) => {
+          const currentTracingIndex = responseItem.workflowProcess!.tracing!.findIndex(item => item.id === data.id)
+          if (currentTracingIndex > -1) {
+            responseItem.workflowProcess!.tracing[currentTracingIndex] = {
+              ...responseItem.workflowProcess!.tracing[currentTracingIndex],
+              ...data,
+            }
+            updateCurrentQAOnTree({
+              placeholderQuestionId,
+              questionItem,
+              responseItem,
+              parentId: params.parent_message_id,
+            })
+          }
+        },
+        onAgentLog: ({ data }) => {
+          const currentNodeIndex = responseItem.workflowProcess!.tracing!.findIndex(item => item.node_id === data.node_id)
+          if (currentNodeIndex > -1) {
+            const current = responseItem.workflowProcess!.tracing![currentNodeIndex]
+
+            if (current.execution_metadata) {
+              if (current.execution_metadata.agent_log) {
+                const currentLogIndex = current.execution_metadata.agent_log.findIndex(log => log.id === data.id)
+                if (currentLogIndex > -1) {
+                  current.execution_metadata.agent_log[currentLogIndex] = {
+                    ...current.execution_metadata.agent_log[currentLogIndex],
+                    ...data,
+                  }
+                }
+                else {
+                  current.execution_metadata.agent_log.push(data)
+                }
+              }
+              else {
+                current.execution_metadata.agent_log = [data]
+              }
+            }
+            else {
+              current.execution_metadata = {
+                agent_log: [data],
+              } as any
+            }
+
+            responseItem.workflowProcess!.tracing[currentNodeIndex] = {
+              ...current,
+            }
+
+            updateCurrentQAOnTree({
+              placeholderQuestionId,
+              questionItem,
+              responseItem,
+              parentId: params.parent_message_id,
+            })
+          }
+        },
+      },
+    )
+  }, [threadMessages, chatTree.length, updateCurrentQAOnTree, handleResponding, formSettings?.inputsForm, handleRun, notify, t, config?.suggested_questions_after_answer?.enabled])
+
+  return {
+    conversationId: conversationId.current,
+    chatList,
+    setTargetMessageId,
+    handleSend,
+    handleStop,
+    handleRestart,
+    isResponding,
+    suggestedQuestions,
+  }
+}
diff --git a/app/components/workflow/panel/debug-and-preview/index.tsx b/app/components/workflow/panel/debug-and-preview/index.tsx
new file mode 100644
index 0000000..b63b7af
--- /dev/null
+++ b/app/components/workflow/panel/debug-and-preview/index.tsx
@@ -0,0 +1,144 @@
+import {
+  memo,
+  useCallback,
+  useEffect,
+  useRef,
+  useState,
+} from 'react'
+
+import { RiCloseLine, RiEqualizer2Line } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useNodes } from 'reactflow'
+import {
+  useWorkflowInteractions,
+} from '../../hooks'
+import { useEdgesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-edges-interactions-without-sync'
+import { useNodesInteractionsWithoutSync } from '@/app/components/workflow/hooks/use-nodes-interactions-without-sync'
+import { BlockEnum } from '../../types'
+import type { StartNodeType } from '../../nodes/start/types'
+import ChatWrapper from './chat-wrapper'
+import cn from '@/utils/classnames'
+import { RefreshCcw01 } from '@/app/components/base/icons/src/vender/line/arrows'
+import { BubbleX } from '@/app/components/base/icons/src/vender/line/others'
+import Tooltip from '@/app/components/base/tooltip'
+import ActionButton, { ActionButtonState } from '@/app/components/base/action-button'
+import { useStore } from '@/app/components/workflow/store'
+import { noop } from 'lodash-es'
+
+export type ChatWrapperRefType = {
+  handleRestart: () => void
+}
+const DebugAndPreview = () => {
+  const { t } = useTranslation()
+  const chatRef = useRef({ handleRestart: noop })
+  const { handleCancelDebugAndPreviewPanel } = useWorkflowInteractions()
+  const { handleNodeCancelRunningStatus } = useNodesInteractionsWithoutSync()
+  const { handleEdgeCancelRunningStatus } = useEdgesInteractionsWithoutSync()
+  const varList = useStore(s => s.conversationVariables)
+  const [expanded, setExpanded] = useState(true)
+  const nodes = useNodes<StartNodeType>()
+  const startNode = nodes.find(node => node.data.type === BlockEnum.Start)
+  const variables = startNode?.data.variables || []
+
+  const [showConversationVariableModal, setShowConversationVariableModal] = useState(false)
+
+  const handleRestartChat = () => {
+    handleNodeCancelRunningStatus()
+    handleEdgeCancelRunningStatus()
+    chatRef.current.handleRestart()
+  }
+
+  const [panelWidth, setPanelWidth] = useState(420)
+  const [isResizing, setIsResizing] = useState(false)
+
+  const startResizing = useCallback((e: React.MouseEvent) => {
+    e.preventDefault()
+    setIsResizing(true)
+  }, [])
+
+  const stopResizing = useCallback(() => {
+    setIsResizing(false)
+  }, [])
+
+  const resize = useCallback((e: MouseEvent) => {
+    if (isResizing) {
+      const newWidth = window.innerWidth - e.clientX
+      if (newWidth > 420 && newWidth < 1024)
+        setPanelWidth(newWidth)
+    }
+  }, [isResizing])
+
+  useEffect(() => {
+    window.addEventListener('mousemove', resize)
+    window.addEventListener('mouseup', stopResizing)
+    return () => {
+      window.removeEventListener('mousemove', resize)
+      window.removeEventListener('mouseup', stopResizing)
+    }
+  }, [resize, stopResizing])
+
+  return (
+    <div
+      className={cn(
+        'relative flex h-full flex-col rounded-l-2xl border border-r-0 border-components-panel-border bg-chatbot-bg shadow-xl',
+      )}
+      style={{ width: `${panelWidth}px` }}
+    >
+      <div
+        className="absolute bottom-0 left-[3px] top-1/2 z-50 h-6 w-[3px] cursor-col-resize rounded bg-gray-300"
+        onMouseDown={startResizing}
+      />
+      <div className='system-xl-semibold flex shrink-0 items-center justify-between px-4 pb-2 pt-3 text-text-primary'>
+        <div className='h-8'>{t('workflow.common.debugAndPreview').toLocaleUpperCase()}</div>
+        <div className='flex items-center gap-1'>
+          <Tooltip
+            popupContent={t('common.operation.refresh')}
+          >
+            <ActionButton onClick={() => handleRestartChat()}>
+              <RefreshCcw01 className='h-4 w-4' />
+            </ActionButton>
+          </Tooltip>
+          {varList.length > 0 && (
+            <Tooltip
+              popupContent={t('workflow.chatVariable.panelTitle')}
+            >
+              <ActionButton onClick={() => setShowConversationVariableModal(true)}>
+                <BubbleX className='h-4 w-4' />
+              </ActionButton>
+            </Tooltip>
+          )}
+          {variables.length > 0 && (
+            <div className='relative'>
+              <Tooltip
+                popupContent={t('workflow.panel.userInputField')}
+              >
+                <ActionButton state={expanded ? ActionButtonState.Active : undefined} onClick={() => setExpanded(!expanded)}>
+                  <RiEqualizer2Line className='h-4 w-4' />
+                </ActionButton>
+              </Tooltip>
+              {expanded && <div className='absolute bottom-[-17px] right-[5px] z-10 h-3 w-3 rotate-45 border-l-[0.5px] border-t-[0.5px] border-components-panel-border-subtle bg-components-panel-on-panel-item-bg' />}
+            </div>
+          )}
+          <div className='mx-3 h-3.5 w-[1px] bg-divider-regular'></div>
+          <div
+            className='flex h-6 w-6 cursor-pointer items-center justify-center'
+            onClick={handleCancelDebugAndPreviewPanel}
+          >
+            <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+        </div>
+      </div>
+      <div className='grow overflow-y-auto rounded-b-2xl'>
+        <ChatWrapper
+          ref={chatRef}
+          showConversationVariableModal={showConversationVariableModal}
+          onConversationModalHide={() => setShowConversationVariableModal(false)}
+          showInputsFieldsPanel={expanded}
+          onHide={() => setExpanded(false)}
+        />
+      </div>
+    </div>
+  )
+}
+
+export default memo(DebugAndPreview)
diff --git a/app/components/workflow/panel/debug-and-preview/user-input.tsx b/app/components/workflow/panel/debug-and-preview/user-input.tsx
new file mode 100644
index 0000000..0b1b451
--- /dev/null
+++ b/app/components/workflow/panel/debug-and-preview/user-input.tsx
@@ -0,0 +1,56 @@
+import {
+  memo,
+} from 'react'
+import { useNodes } from 'reactflow'
+import FormItem from '../../nodes/_base/components/before-run-form/form-item'
+import { BlockEnum } from '../../types'
+import {
+  useStore,
+  useWorkflowStore,
+} from '../../store'
+import type { StartNodeType } from '../../nodes/start/types'
+import cn from '@/utils/classnames'
+
+const UserInput = () => {
+  const workflowStore = useWorkflowStore()
+  const inputs = useStore(s => s.inputs)
+  const nodes = useNodes<StartNodeType>()
+  const startNode = nodes.find(node => node.data.type === BlockEnum.Start)
+  const variables = startNode?.data.variables || []
+
+  const handleValueChange = (variable: string, v: string) => {
+    const {
+      inputs,
+      setInputs,
+    } = workflowStore.getState()
+    setInputs({
+      ...inputs,
+      [variable]: v,
+    })
+  }
+
+  if (!variables.length)
+    return null
+
+  return (
+    <div className={cn('sticky top-0 z-[1] rounded-xl border-[0.5px] border-components-panel-border-subtle bg-components-panel-on-panel-item-bg shadow-xs')}>
+      <div className='px-4 pb-4 pt-3'>
+        {variables.map((variable, index) => (
+          <div
+            key={variable.variable}
+            className='mb-4 last-of-type:mb-0'
+          >
+            <FormItem
+              autoFocus={index === 0}
+              payload={variable}
+              value={inputs[variable.variable]}
+              onChange={v => handleValueChange(variable.variable, v)}
+            />
+          </div>
+        ))}
+      </div>
+    </div>
+  )
+}
+
+export default memo(UserInput)
diff --git a/app/components/workflow/panel/env-panel/env-item.tsx b/app/components/workflow/panel/env-panel/env-item.tsx
new file mode 100644
index 0000000..91abafa
--- /dev/null
+++ b/app/components/workflow/panel/env-panel/env-item.tsx
@@ -0,0 +1,53 @@
+import { memo, useState } from 'react'
+import { capitalize } from 'lodash-es'
+import { RiDeleteBinLine, RiEditLine, RiLock2Line } from '@remixicon/react'
+import { Env } from '@/app/components/base/icons/src/vender/line/others'
+import { useStore } from '@/app/components/workflow/store'
+import type { EnvironmentVariable } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+
+type EnvItemProps = {
+  env: EnvironmentVariable
+  onEdit: (env: EnvironmentVariable) => void
+  onDelete: (env: EnvironmentVariable) => void
+}
+
+const EnvItem = ({
+  env,
+  onEdit,
+  onDelete,
+}: EnvItemProps) => {
+  const envSecrets = useStore(s => s.envSecrets)
+  const [destructive, setDestructive] = useState(false)
+
+  return (
+    <div className={cn(
+      'radius-md mb-1 border border-components-panel-border-subtle bg-components-panel-on-panel-item-bg px-2.5 py-2 shadow-xs hover:bg-components-panel-on-panel-item-bg-hover',
+      destructive && 'border-state-destructive-border hover:bg-state-destructive-hover',
+    )}>
+      <div className='flex items-center justify-between'>
+        <div className='flex grow items-center gap-1'>
+          <Env className='h-4 w-4 text-util-colors-violet-violet-600' />
+          <div className='system-sm-medium text-text-primary'>{env.name}</div>
+          <div className='system-xs-medium text-text-tertiary'>{capitalize(env.value_type)}</div>
+          {env.value_type === 'secret' && <RiLock2Line className='h-3 w-3 text-text-tertiary' />}
+        </div>
+        <div className='flex shrink-0 items-center gap-1 text-text-tertiary'>
+          <div className='radius-md cursor-pointer p-1 hover:bg-state-base-hover hover:text-text-secondary'>
+            <RiEditLine className='h-4 w-4' onClick={() => onEdit(env)}/>
+          </div>
+          <div
+            className='radius-md cursor-pointer p-1 hover:bg-state-destructive-hover hover:text-text-destructive'
+            onMouseOver={() => setDestructive(true)}
+            onMouseOut={() => setDestructive(false)}
+          >
+            <RiDeleteBinLine className='h-4 w-4' onClick={() => onDelete(env)} />
+          </div>
+        </div>
+      </div>
+      <div className='system-xs-regular truncate text-text-tertiary'>{env.value_type === 'secret' ? envSecrets[env.id] : env.value}</div>
+    </div>
+  )
+}
+
+export default memo(EnvItem)
diff --git a/app/components/workflow/panel/env-panel/index.tsx b/app/components/workflow/panel/env-panel/index.tsx
new file mode 100644
index 0000000..135f581
--- /dev/null
+++ b/app/components/workflow/panel/env-panel/index.tsx
@@ -0,0 +1,195 @@
+import {
+  memo,
+  useCallback,
+  useState,
+} from 'react'
+import {
+  useStoreApi,
+} from 'reactflow'
+import { RiCloseLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useStore } from '@/app/components/workflow/store'
+import VariableTrigger from '@/app/components/workflow/panel/env-panel/variable-trigger'
+import EnvItem from '@/app/components/workflow/panel/env-panel/env-item'
+import type {
+  EnvironmentVariable,
+} from '@/app/components/workflow/types'
+import { findUsedVarNodes, updateNodeVars } from '@/app/components/workflow/nodes/_base/components/variable/utils'
+import RemoveEffectVarConfirm from '@/app/components/workflow/nodes/_base/components/remove-effect-var-confirm'
+import cn from '@/utils/classnames'
+import { useNodesSyncDraft } from '@/app/components/workflow/hooks/use-nodes-sync-draft'
+
+const EnvPanel = () => {
+  const { t } = useTranslation()
+  const store = useStoreApi()
+  const setShowEnvPanel = useStore(s => s.setShowEnvPanel)
+  const envList = useStore(s => s.environmentVariables) as EnvironmentVariable[]
+  const envSecrets = useStore(s => s.envSecrets)
+  const updateEnvList = useStore(s => s.setEnvironmentVariables)
+  const setEnvSecrets = useStore(s => s.setEnvSecrets)
+  const { doSyncWorkflowDraft } = useNodesSyncDraft()
+
+  const [showVariableModal, setShowVariableModal] = useState(false)
+  const [currentVar, setCurrentVar] = useState<EnvironmentVariable>()
+
+  const [showRemoveVarConfirm, setShowRemoveConfirm] = useState(false)
+  const [cacheForDelete, setCacheForDelete] = useState<EnvironmentVariable>()
+
+  const formatSecret = (s: string) => {
+    return s.length > 8 ? `${s.slice(0, 6)}************${s.slice(-2)}` : '********************'
+  }
+
+  const getEffectedNodes = useCallback((env: EnvironmentVariable) => {
+    const { getNodes } = store.getState()
+    const allNodes = getNodes()
+    return findUsedVarNodes(
+      ['env', env.name],
+      allNodes,
+    )
+  }, [store])
+
+  const removeUsedVarInNodes = useCallback((env: EnvironmentVariable) => {
+    const { getNodes, setNodes } = store.getState()
+    const effectedNodes = getEffectedNodes(env)
+    const newNodes = getNodes().map((node) => {
+      if (effectedNodes.find(n => n.id === node.id))
+        return updateNodeVars(node, ['env', env.name], [])
+
+      return node
+    })
+    setNodes(newNodes)
+  }, [getEffectedNodes, store])
+
+  const handleEdit = (env: EnvironmentVariable) => {
+    setCurrentVar(env)
+    setShowVariableModal(true)
+  }
+
+  const handleDelete = useCallback((env: EnvironmentVariable) => {
+    removeUsedVarInNodes(env)
+    updateEnvList(envList.filter(e => e.id !== env.id))
+    setCacheForDelete(undefined)
+    setShowRemoveConfirm(false)
+    doSyncWorkflowDraft()
+    if (env.value_type === 'secret') {
+      const newMap = { ...envSecrets }
+      delete newMap[env.id]
+      setEnvSecrets(newMap)
+    }
+  }, [doSyncWorkflowDraft, envList, envSecrets, removeUsedVarInNodes, setEnvSecrets, updateEnvList])
+
+  const deleteCheck = useCallback((env: EnvironmentVariable) => {
+    const effectedNodes = getEffectedNodes(env)
+    if (effectedNodes.length > 0) {
+      setCacheForDelete(env)
+      setShowRemoveConfirm(true)
+    }
+    else {
+      handleDelete(env)
+    }
+  }, [getEffectedNodes, handleDelete])
+
+  const handleSave = useCallback(async (env: EnvironmentVariable) => {
+    // add env
+    let newEnv = env
+    if (!currentVar) {
+      if (env.value_type === 'secret') {
+        setEnvSecrets({
+          ...envSecrets,
+          [env.id]: formatSecret(env.value),
+        })
+      }
+      const newList = [env, ...envList]
+      updateEnvList(newList)
+      await doSyncWorkflowDraft()
+      updateEnvList(newList.map(e => (e.id === env.id && env.value_type === 'secret') ? { ...e, value: '[__HIDDEN__]' } : e))
+      return
+    }
+    else if (currentVar.value_type === 'secret') {
+      if (env.value_type === 'secret') {
+        if (envSecrets[currentVar.id] !== env.value) {
+          newEnv = env
+          setEnvSecrets({
+            ...envSecrets,
+            [env.id]: formatSecret(env.value),
+          })
+        }
+        else {
+          newEnv = { ...env, value: '[__HIDDEN__]' }
+        }
+      }
+    }
+    else {
+      if (env.value_type === 'secret') {
+        newEnv = env
+        setEnvSecrets({
+          ...envSecrets,
+          [env.id]: formatSecret(env.value),
+        })
+      }
+    }
+    const newList = envList.map(e => e.id === currentVar.id ? newEnv : e)
+    updateEnvList(newList)
+    // side effects of rename env
+    if (currentVar.name !== env.name) {
+      const { getNodes, setNodes } = store.getState()
+      const effectedNodes = getEffectedNodes(currentVar)
+      const newNodes = getNodes().map((node) => {
+        if (effectedNodes.find(n => n.id === node.id))
+          return updateNodeVars(node, ['env', currentVar.name], ['env', env.name])
+
+        return node
+      })
+      setNodes(newNodes)
+    }
+    await doSyncWorkflowDraft()
+    updateEnvList(newList.map(e => (e.id === env.id && env.value_type === 'secret') ? { ...e, value: '[__HIDDEN__]' } : e))
+  }, [currentVar, doSyncWorkflowDraft, envList, envSecrets, getEffectedNodes, setEnvSecrets, store, updateEnvList])
+
+  return (
+    <div
+      className={cn(
+        'relative flex h-full w-[420px] flex-col rounded-l-2xl border border-components-panel-border bg-components-panel-bg-alt',
+      )}
+    >
+      <div className='system-xl-semibold flex shrink-0 items-center justify-between p-4 pb-0 text-text-primary'>
+        {t('workflow.env.envPanelTitle')}
+        <div className='flex items-center'>
+          <div
+            className='flex h-6 w-6 cursor-pointer items-center justify-center'
+            onClick={() => setShowEnvPanel(false)}
+          >
+            <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+        </div>
+      </div>
+      <div className='system-sm-regular shrink-0 px-4 py-1 text-text-tertiary'>{t('workflow.env.envDescription')}</div>
+      <div className='shrink-0 px-4 pb-3 pt-2'>
+        <VariableTrigger
+          open={showVariableModal}
+          setOpen={setShowVariableModal}
+          env={currentVar}
+          onSave={handleSave}
+          onClose={() => setCurrentVar(undefined)}
+        />
+      </div>
+      <div className='grow overflow-y-auto rounded-b-2xl px-4'>
+        {envList.map(env => (
+          <EnvItem
+            key={env.id}
+            env={env}
+            onEdit={handleEdit}
+            onDelete={deleteCheck}
+          />
+        ))}
+      </div>
+      <RemoveEffectVarConfirm
+        isShow={showRemoveVarConfirm}
+        onCancel={() => setShowRemoveConfirm(false)}
+        onConfirm={() => cacheForDelete && handleDelete(cacheForDelete)}
+      />
+    </div>
+  )
+}
+
+export default memo(EnvPanel)
diff --git a/app/components/workflow/panel/env-panel/variable-modal.tsx b/app/components/workflow/panel/env-panel/variable-modal.tsx
new file mode 100644
index 0000000..4546aab
--- /dev/null
+++ b/app/components/workflow/panel/env-panel/variable-modal.tsx
@@ -0,0 +1,167 @@
+import React, { useEffect } from 'react'
+import { useTranslation } from 'react-i18next'
+import { v4 as uuid4 } from 'uuid'
+import { RiCloseLine } from '@remixicon/react'
+import { useContext } from 'use-context-selector'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Tooltip from '@/app/components/base/tooltip'
+import { ToastContext } from '@/app/components/base/toast'
+import { useStore } from '@/app/components/workflow/store'
+import type { EnvironmentVariable } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+import { checkKeys } from '@/utils/var'
+
+export type ModalPropsType = {
+  env?: EnvironmentVariable
+  onClose: () => void
+  onSave: (env: EnvironmentVariable) => void
+}
+const VariableModal = ({
+  env,
+  onClose,
+  onSave,
+}: ModalPropsType) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const envList = useStore(s => s.environmentVariables)
+  const envSecrets = useStore(s => s.envSecrets)
+  const [type, setType] = React.useState<'string' | 'number' | 'secret'>('string')
+  const [name, setName] = React.useState('')
+  const [value, setValue] = React.useState<any>()
+
+  const checkVariableName = (value: string) => {
+    const { isValid, errorMessageKey } = checkKeys([value], false)
+    if (!isValid) {
+      notify({
+        type: 'error',
+        message: t(`appDebug.varKeyError.${errorMessageKey}`, { key: t('workflow.env.modal.name') }),
+      })
+      return false
+    }
+    return true
+  }
+
+  const handleSave = () => {
+    if (!checkVariableName(name))
+      return
+    if (!value)
+      return notify({ type: 'error', message: 'value can not be empty' })
+
+    // Add check for duplicate name when editing
+    if (env && env.name !== name && envList.some(e => e.name === name))
+      return notify({ type: 'error', message: 'name is existed' })
+    // Original check for create new variable
+    if (!env && envList.some(e => e.name === name))
+      return notify({ type: 'error', message: 'name is existed' })
+
+    onSave({
+      id: env ? env.id : uuid4(),
+      value_type: type,
+      name,
+      value: type === 'number' ? Number(value) : value,
+    })
+    onClose()
+  }
+
+  useEffect(() => {
+    if (env) {
+      setType(env.value_type)
+      setName(env.name)
+      setValue(env.value_type === 'secret' ? envSecrets[env.id] : env.value)
+    }
+  }, [env, envSecrets])
+
+  return (
+    <div
+      className={cn('flex h-full w-[360px] flex-col rounded-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-2xl')}
+    >
+      <div className='system-xl-semibold mb-3 flex shrink-0 items-center justify-between p-4 pb-0 text-text-primary'>
+        {!env ? t('workflow.env.modal.title') : t('workflow.env.modal.editTitle')}
+        <div className='flex items-center'>
+          <div
+            className='flex h-6 w-6 cursor-pointer items-center justify-center'
+            onClick={onClose}
+          >
+            <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+        </div>
+      </div>
+      <div className='px-4 py-2'>
+        {/* type */}
+        <div className='mb-4'>
+          <div className='system-sm-semibold mb-1 flex h-6 items-center text-text-secondary'>{t('workflow.env.modal.type')}</div>
+          <div className='flex gap-2'>
+            <div className={cn(
+              'radius-md system-sm-regular flex w-[106px] cursor-pointer items-center justify-center border border-components-option-card-option-border bg-components-option-card-option-bg p-2 text-text-secondary hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs',
+              type === 'string' && 'system-sm-medium border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg text-text-primary shadow-xs hover:border-components-option-card-option-selected-border',
+            )} onClick={() => setType('string')}>String</div>
+            <div className={cn(
+              'radius-md system-sm-regular flex w-[106px] cursor-pointer items-center justify-center border border-components-option-card-option-border bg-components-option-card-option-bg p-2 text-text-secondary hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs',
+              type === 'number' && 'border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg font-medium text-text-primary shadow-xs hover:border-components-option-card-option-selected-border',
+            )} onClick={() => {
+              setType('number')
+              if (!(/^\d$/).test(value))
+                setValue('')
+            }}>Number</div>
+            <div className={cn(
+              'radius-md system-sm-regular flex w-[106px] cursor-pointer items-center justify-center border border-components-option-card-option-border bg-components-option-card-option-bg p-2 text-text-secondary hover:border-components-option-card-option-border-hover hover:bg-components-option-card-option-bg-hover hover:shadow-xs',
+              type === 'secret' && 'border-[1.5px] border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg font-medium text-text-primary shadow-xs hover:border-components-option-card-option-selected-border',
+            )} onClick={() => setType('secret')}>
+              <span>Secret</span>
+              <Tooltip
+                popupContent={
+                  <div className='w-[240px]'>
+                    {t('workflow.env.modal.secretTip')}
+                  </div>
+                }
+                triggerClassName='ml-0.5 w-3.5 h-3.5'
+              />
+            </div>
+          </div>
+        </div>
+        {/* name */}
+        <div className='mb-4'>
+          <div className='system-sm-semibold mb-1 flex h-6 items-center text-text-secondary'>{t('workflow.env.modal.name')}</div>
+          <div className='flex'>
+            <Input
+              placeholder={t('workflow.env.modal.namePlaceholder') || ''}
+              value={name}
+              onChange={e => setName(e.target.value || '')}
+              onBlur={e => checkVariableName(e.target.value)}
+              type='text'
+            />
+          </div>
+        </div>
+        {/* value */}
+        <div className=''>
+          <div className='system-sm-semibold mb-1 flex h-6 items-center text-text-secondary'>{t('workflow.env.modal.value')}</div>
+          <div className='flex'>
+            {
+              type !== 'number' ? <textarea
+                className='system-sm-regular placeholder:system-sm-regular block h-20 w-full resize-none appearance-none rounded-lg border border-transparent bg-components-input-bg-normal p-2 caret-primary-600 outline-none placeholder:text-components-input-text-placeholder hover:border-components-input-border-hover hover:bg-components-input-bg-hover focus:border-components-input-border-active focus:bg-components-input-bg-active focus:shadow-xs'
+                value={value}
+                placeholder={t('workflow.env.modal.valuePlaceholder') || ''}
+                onChange={e => setValue(e.target.value)}
+              />
+                : <Input
+                  placeholder={t('workflow.env.modal.valuePlaceholder') || ''}
+                  value={value}
+                  onChange={e => setValue(e.target.value)}
+                  type="number"
+                />
+            }
+          </div>
+        </div>
+      </div>
+      <div className='flex flex-row-reverse rounded-b-2xl p-4 pt-2'>
+        <div className='flex gap-2'>
+          <Button onClick={onClose}>{t('common.operation.cancel')}</Button>
+          <Button variant='primary' onClick={handleSave}>{t('common.operation.save')}</Button>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default VariableModal
diff --git a/app/components/workflow/panel/env-panel/variable-trigger.tsx b/app/components/workflow/panel/env-panel/variable-trigger.tsx
new file mode 100644
index 0000000..5247486
--- /dev/null
+++ b/app/components/workflow/panel/env-panel/variable-trigger.tsx
@@ -0,0 +1,67 @@
+'use client'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiAddLine } from '@remixicon/react'
+import Button from '@/app/components/base/button'
+import VariableModal from '@/app/components/workflow/panel/env-panel/variable-modal'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import type { EnvironmentVariable } from '@/app/components/workflow/types'
+
+type Props = {
+  open: boolean
+  setOpen: (value: React.SetStateAction<boolean>) => void
+  env?: EnvironmentVariable
+  onClose: () => void
+  onSave: (env: EnvironmentVariable) => void
+}
+
+const VariableTrigger = ({
+  open,
+  setOpen,
+  env,
+  onClose,
+  onSave,
+}: Props) => {
+  const { t } = useTranslation()
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={() => {
+        setOpen(v => !v)
+        open && onClose()
+      }}
+      placement='left-start'
+      offset={{
+        mainAxis: 8,
+        alignmentAxis: -104,
+      }}
+    >
+      <PortalToFollowElemTrigger onClick={() => {
+        setOpen(v => !v)
+        open && onClose()
+      }}>
+        <Button variant='primary'>
+          <RiAddLine className='mr-1 h-4 w-4' />
+          <span className='system-sm-medium'>{t('workflow.env.envPanelButton')}</span>
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[11]'>
+        <VariableModal
+          env={env}
+          onSave={onSave}
+          onClose={() => {
+            onClose()
+            setOpen(false)
+          }}
+        />
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default VariableTrigger
diff --git a/app/components/workflow/panel/global-variable-panel/index.tsx b/app/components/workflow/panel/global-variable-panel/index.tsx
new file mode 100644
index 0000000..ad7996a
--- /dev/null
+++ b/app/components/workflow/panel/global-variable-panel/index.tsx
@@ -0,0 +1,54 @@
+import {
+  memo,
+} from 'react'
+
+import { RiCloseLine } from '@remixicon/react'
+import type { GlobalVariable } from '../../types'
+import Item from './item'
+import { useStore } from '@/app/components/workflow/store'
+
+import cn from '@/utils/classnames'
+
+const Panel = () => {
+  const setShowPanel = useStore(s => s.setShowGlobalVariablePanel)
+
+  const globalVariableList: GlobalVariable[] = [
+    {
+      name: 'conversation_id',
+      value_type: 'string',
+      description: 'conversation id',
+    },
+  ]
+
+  return (
+    <div
+      className={cn(
+        'relative flex h-full w-[420px] flex-col rounded-l-2xl border border-components-panel-border bg-components-panel-bg-alt',
+      )}
+    >
+      <div className='system-xl-semibold flex shrink-0 items-center justify-between p-4 pb-0 text-text-primary'>
+        Global Variables(Current not show)
+        <div className='flex items-center'>
+          <div
+            className='flex h-6 w-6 cursor-pointer items-center justify-center'
+            onClick={() => setShowPanel(false)}
+          >
+            <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+        </div>
+      </div>
+      <div className='system-sm-regular shrink-0 px-4 py-1 text-text-tertiary'>...</div>
+
+      <div className='grow overflow-y-auto rounded-b-2xl px-4'>
+        {globalVariableList.map(item => (
+          <Item
+            key={item.name}
+            payload={item}
+          />
+        ))}
+      </div>
+    </div>
+  )
+}
+
+export default memo(Panel)
diff --git a/app/components/workflow/panel/global-variable-panel/item.tsx b/app/components/workflow/panel/global-variable-panel/item.tsx
new file mode 100644
index 0000000..ddf9abe
--- /dev/null
+++ b/app/components/workflow/panel/global-variable-panel/item.tsx
@@ -0,0 +1,30 @@
+import { memo } from 'react'
+import { capitalize } from 'lodash-es'
+import { Env } from '@/app/components/base/icons/src/vender/line/others'
+import type { GlobalVariable } from '@/app/components/workflow/types'
+import cn from '@/utils/classnames'
+
+type Props = {
+  payload: GlobalVariable
+}
+
+const Item = ({
+  payload,
+}: Props) => {
+  return (
+    <div className={cn(
+      'radius-md mb-1 border border-components-panel-border-subtle bg-components-panel-on-panel-item-bg px-2.5 py-2 shadow-xs hover:bg-components-panel-on-panel-item-bg-hover',
+    )}>
+      <div className='flex items-center justify-between'>
+        <div className='flex grow items-center gap-1'>
+          <Env className='h-4 w-4 text-util-colors-violet-violet-600' />
+          <div className='system-sm-medium text-text-primary'>{payload.name}</div>
+          <div className='system-xs-medium text-text-tertiary'>{capitalize(payload.value_type)}</div>
+        </div>
+      </div>
+      <div className='system-xs-regular truncate text-text-tertiary'>{payload.description}</div>
+    </div>
+  )
+}
+
+export default memo(Item)
diff --git a/app/components/workflow/panel/index.tsx b/app/components/workflow/panel/index.tsx
new file mode 100644
index 0000000..8e510f4
--- /dev/null
+++ b/app/components/workflow/panel/index.tsx
@@ -0,0 +1,50 @@
+import type { FC } from 'react'
+import { memo } from 'react'
+import { useNodes } from 'reactflow'
+import type { CommonNodeType } from '../types'
+import { Panel as NodePanel } from '../nodes'
+import { useStore } from '../store'
+import EnvPanel from './env-panel'
+import cn from '@/utils/classnames'
+
+export type PanelProps = {
+  components?: {
+    left?: React.ReactNode
+    right?: React.ReactNode
+  }
+}
+const Panel: FC<PanelProps> = ({
+  components,
+}) => {
+  const nodes = useNodes<CommonNodeType>()
+  const selectedNode = nodes.find(node => node.data.selected)
+  const showEnvPanel = useStore(s => s.showEnvPanel)
+  const isRestoring = useStore(s => s.isRestoring)
+
+  return (
+    <div
+      tabIndex={-1}
+      className={cn('absolute bottom-2 right-0 top-14 z-10 flex outline-none')}
+      key={`${isRestoring}`}
+    >
+      {
+        components?.left
+      }
+      {
+        !!selectedNode && (
+          <NodePanel {...selectedNode!} />
+        )
+      }
+      {
+        components?.right
+      }
+      {
+        showEnvPanel && (
+          <EnvPanel />
+        )
+      }
+    </div>
+  )
+}
+
+export default memo(Panel)
diff --git a/app/components/workflow/panel/inputs-panel.tsx b/app/components/workflow/panel/inputs-panel.tsx
new file mode 100644
index 0000000..8be8d81
--- /dev/null
+++ b/app/components/workflow/panel/inputs-panel.tsx
@@ -0,0 +1,130 @@
+import {
+  memo,
+  useCallback,
+  useMemo,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { useNodes } from 'reactflow'
+import FormItem from '../nodes/_base/components/before-run-form/form-item'
+import {
+  BlockEnum,
+  InputVarType,
+  WorkflowRunningStatus,
+} from '../types'
+import {
+  useStore,
+  useWorkflowStore,
+} from '../store'
+import { useWorkflowRun } from '../hooks'
+import type { StartNodeType } from '../nodes/start/types'
+import { TransferMethod } from '../../base/text-generation/types'
+import Button from '@/app/components/base/button'
+import { useFeatures } from '@/app/components/base/features/hooks'
+import {
+  getProcessedInputs,
+} from '@/app/components/base/chat/chat/utils'
+import { useCheckInputsForms } from '@/app/components/base/chat/chat/check-input-forms-hooks'
+
+type Props = {
+  onRun: () => void
+}
+
+const InputsPanel = ({ onRun }: Props) => {
+  const { t } = useTranslation()
+  const workflowStore = useWorkflowStore()
+  const fileSettings = useFeatures(s => s.features.file)
+  const nodes = useNodes<StartNodeType>()
+  const inputs = useStore(s => s.inputs)
+  const files = useStore(s => s.files)
+  const workflowRunningData = useStore(s => s.workflowRunningData)
+  const {
+    handleRun,
+  } = useWorkflowRun()
+  const startNode = nodes.find(node => node.data.type === BlockEnum.Start)
+  const startVariables = startNode?.data.variables
+  const { checkInputsForm } = useCheckInputsForms()
+
+  const variables = useMemo(() => {
+    const data = startVariables || []
+    if (fileSettings?.image?.enabled) {
+      return [
+        ...data,
+        {
+          type: InputVarType.files,
+          variable: '__image',
+          required: false,
+          label: 'files',
+        },
+      ]
+    }
+
+    return data
+  }, [fileSettings?.image?.enabled, startVariables])
+
+  const handleValueChange = (variable: string, v: any) => {
+    const {
+      inputs,
+      setInputs,
+    } = workflowStore.getState()
+    if (variable === '__image') {
+      workflowStore.setState({
+        files: v,
+      })
+    }
+    else {
+      setInputs({
+        ...inputs,
+        [variable]: v,
+      })
+    }
+  }
+
+  const doRun = useCallback(() => {
+    if (!checkInputsForm(inputs, variables as any))
+      return
+    onRun()
+    handleRun({ inputs: getProcessedInputs(inputs, variables as any), files })
+  }, [files, handleRun, inputs, onRun, variables, checkInputsForm])
+
+  const canRun = useMemo(() => {
+    if (files?.some(item => (item.transfer_method as any) === TransferMethod.local_file && !item.upload_file_id))
+      return false
+
+    return true
+  }, [files])
+
+  return (
+    <>
+      <div className='px-4 pb-2 pt-3'>
+        {
+          variables.map((variable, index) => (
+            <div
+              key={variable.variable}
+              className='mb-2 last-of-type:mb-0'
+            >
+              <FormItem
+                autoFocus={index === 0}
+                className='!block'
+                payload={variable}
+                value={inputs[variable.variable]}
+                onChange={v => handleValueChange(variable.variable, v)}
+              />
+            </div>
+          ))
+        }
+      </div>
+      <div className='flex items-center justify-between px-4 py-2'>
+        <Button
+          variant='primary'
+          disabled={!canRun || workflowRunningData?.result?.status === WorkflowRunningStatus.Running}
+          className='w-full'
+          onClick={doRun}
+        >
+          {t('workflow.singleRun.startRun')}
+        </Button>
+      </div>
+    </>
+  )
+}
+
+export default memo(InputsPanel)
diff --git a/app/components/workflow/panel/record.tsx b/app/components/workflow/panel/record.tsx
new file mode 100644
index 0000000..70fe9c4
--- /dev/null
+++ b/app/components/workflow/panel/record.tsx
@@ -0,0 +1,33 @@
+import { memo, useCallback } from 'react'
+import type { WorkflowDataUpdater } from '../types'
+import Run from '../run'
+import { useStore } from '../store'
+import { useWorkflowUpdate } from '../hooks'
+
+const Record = () => {
+  const historyWorkflowData = useStore(s => s.historyWorkflowData)
+  const { handleUpdateWorkflowCanvas } = useWorkflowUpdate()
+
+  const handleResultCallback = useCallback((res: any) => {
+    const graph: WorkflowDataUpdater = res.graph
+    handleUpdateWorkflowCanvas({
+      nodes: graph.nodes,
+      edges: graph.edges,
+      viewport: graph.viewport,
+    })
+  }, [handleUpdateWorkflowCanvas])
+
+  return (
+    <div className='flex h-full w-[400px] flex-col rounded-l-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl'>
+      <div className='system-xl-semibold flex items-center justify-between p-4 pb-0 text-text-primary'>
+        {`Test Run#${historyWorkflowData?.sequence_number}`}
+      </div>
+      <Run
+        runID={historyWorkflowData?.id || ''}
+        getResultCallback={handleResultCallback}
+      />
+    </div>
+  )
+}
+
+export default memo(Record)
diff --git a/app/components/workflow/panel/version-history-panel/context-menu/index.tsx b/app/components/workflow/panel/version-history-panel/context-menu/index.tsx
new file mode 100644
index 0000000..4d4f21d
--- /dev/null
+++ b/app/components/workflow/panel/version-history-panel/context-menu/index.tsx
@@ -0,0 +1,84 @@
+import React, { type FC, useCallback } from 'react'
+import { RiMoreFill } from '@remixicon/react'
+import { VersionHistoryContextMenuOptions } from '../../../types'
+import MenuItem from './menu-item'
+import useContextMenu from './use-context-menu'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Button from '@/app/components/base/button'
+import Divider from '@/app/components/base/divider'
+
+export type ContextMenuProps = {
+  isShowDelete: boolean
+  isNamedVersion: boolean
+  open: boolean
+  setOpen: React.Dispatch<React.SetStateAction<boolean>>
+  handleClickMenuItem: (operation: VersionHistoryContextMenuOptions) => void
+}
+
+const ContextMenu: FC<ContextMenuProps> = (props: ContextMenuProps) => {
+  const { isShowDelete, handleClickMenuItem, open, setOpen } = props
+  const {
+    deleteOperation,
+    options,
+  } = useContextMenu(props)
+
+  const handleClickTrigger = useCallback((e: React.MouseEvent<HTMLButtonElement>) => {
+    e.stopPropagation()
+    setOpen(v => !v)
+  }, [setOpen])
+
+  return (
+    <PortalToFollowElem
+      placement={'bottom-end'}
+      offset={{
+        mainAxis: 4,
+        crossAxis: 0,
+      }}
+      open={open}
+      onOpenChange={setOpen}
+    >
+      <PortalToFollowElemTrigger>
+        <Button size='small' className='px-1' onClick={handleClickTrigger}>
+          <RiMoreFill className='h-4 w-4' />
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-10'>
+        <div className='flex w-[184px] flex-col rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg shadow-shadow-shadow-5 backdrop-blur-[5px]'>
+          <div className='flex flex-col p-1'>
+            {
+              options.map((option) => {
+                return (
+                  <MenuItem
+                    key={option.key}
+                    item={option}
+                    onClick={handleClickMenuItem.bind(null, option.key)}
+                  />
+                )
+              })
+            }
+          </div>
+          {
+            isShowDelete && (
+              <>
+                <Divider type='horizontal' className='my-0 h-[1px] bg-divider-subtle' />
+                <div className='p-1'>
+                  <MenuItem
+                    item={deleteOperation}
+                    isDestructive
+                    onClick={handleClickMenuItem.bind(null, VersionHistoryContextMenuOptions.delete)}
+                  />
+                </div>
+              </>
+            )
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default React.memo(ContextMenu)
diff --git a/app/components/workflow/panel/version-history-panel/context-menu/menu-item.tsx b/app/components/workflow/panel/version-history-panel/context-menu/menu-item.tsx
new file mode 100644
index 0000000..dcfcb24
--- /dev/null
+++ b/app/components/workflow/panel/version-history-panel/context-menu/menu-item.tsx
@@ -0,0 +1,39 @@
+import React, { type FC } from 'react'
+import type { VersionHistoryContextMenuOptions } from '../../../types'
+import cn from '@/utils/classnames'
+
+type MenuItemProps = {
+  item: {
+    key: VersionHistoryContextMenuOptions
+    name: string
+  }
+  onClick: (operation: VersionHistoryContextMenuOptions) => void
+  isDestructive?: boolean
+}
+
+const MenuItem: FC<MenuItemProps> = ({
+  item,
+  onClick,
+  isDestructive = false,
+}) => {
+  return (
+    <div
+      className={cn(
+        'flex cursor-pointer items-center justify-between rounded-lg px-2 py-1.5 ',
+        isDestructive ? 'hover:bg-state-destructive-hover' : 'hover:bg-state-base-hover',
+      )}
+      onClick={() => {
+        onClick(item.key)
+      }}
+    >
+      <div className={cn(
+        'system-md-regular flex-1 text-text-primary',
+        isDestructive && 'hover:text-text-destructive',
+      )}>
+        {item.name}
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(MenuItem)
diff --git a/app/components/workflow/panel/version-history-panel/context-menu/use-context-menu.ts b/app/components/workflow/panel/version-history-panel/context-menu/use-context-menu.ts
new file mode 100644
index 0000000..3b01db7
--- /dev/null
+++ b/app/components/workflow/panel/version-history-panel/context-menu/use-context-menu.ts
@@ -0,0 +1,42 @@
+import { useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
+import { VersionHistoryContextMenuOptions } from '../../../types'
+import type { ContextMenuProps } from './index'
+
+const useContextMenu = (props: ContextMenuProps) => {
+  const {
+    isNamedVersion,
+  } = props
+  const { t } = useTranslation()
+
+  const deleteOperation = {
+    key: VersionHistoryContextMenuOptions.delete,
+    name: t('common.operation.delete'),
+  }
+
+  const options = useMemo(() => {
+    return [
+      {
+        key: VersionHistoryContextMenuOptions.restore,
+        name: t('workflow.common.restore'),
+      },
+      isNamedVersion
+        ? {
+          key: VersionHistoryContextMenuOptions.edit,
+          name: t('workflow.versionHistory.editVersionInfo'),
+        }
+        : {
+          key: VersionHistoryContextMenuOptions.edit,
+          name: t('workflow.versionHistory.nameThisVersion'),
+        },
+    ]
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isNamedVersion])
+
+  return {
+    deleteOperation,
+    options,
+  }
+}
+
+export default useContextMenu
diff --git a/app/components/workflow/panel/version-history-panel/delete-confirm-modal.tsx b/app/components/workflow/panel/version-history-panel/delete-confirm-modal.tsx
new file mode 100644
index 0000000..8ba1494
--- /dev/null
+++ b/app/components/workflow/panel/version-history-panel/delete-confirm-modal.tsx
@@ -0,0 +1,42 @@
+import React, { type FC } from 'react'
+import Modal from '@/app/components/base/modal'
+import type { VersionHistory } from '@/types/workflow'
+import { useTranslation } from 'react-i18next'
+import Button from '@/app/components/base/button'
+
+type DeleteConfirmModalProps = {
+  isOpen: boolean
+  versionInfo: VersionHistory
+  onClose: () => void
+  onDelete: (id: string) => void
+}
+
+const DeleteConfirmModal: FC<DeleteConfirmModalProps> = ({
+  isOpen,
+  versionInfo,
+  onClose,
+  onDelete,
+}) => {
+  const { t } = useTranslation()
+
+  return <Modal className='p-0' isShow={isOpen} onClose={onClose}>
+    <div className='flex flex-col gap-y-2 p-6 pb-4 '>
+      <div className='title-2xl-semi-bold text-text-primary'>
+        {`${t('common.operation.delete')} ${versionInfo.marked_name || t('workflow.versionHistory.defaultName')}`}
+      </div>
+      <p className='system-md-regular text-text-secondary'>
+        {t('workflow.versionHistory.deletionTip')}
+      </p>
+    </div>
+    <div className='flex items-center justify-end gap-x-2 p-6'>
+      <Button onClick={onClose}>
+        {t('common.operation.cancel')}
+      </Button>
+      <Button variant='warning' onClick={onDelete.bind(null, versionInfo.id)}>
+        {t('common.operation.delete')}
+      </Button>
+    </div>
+  </Modal>
+}
+
+export default DeleteConfirmModal
diff --git a/app/components/workflow/panel/version-history-panel/empty.tsx b/app/components/workflow/panel/version-history-panel/empty.tsx
new file mode 100644
index 0000000..e3f3a6e
--- /dev/null
+++ b/app/components/workflow/panel/version-history-panel/empty.tsx
@@ -0,0 +1,30 @@
+import Button from '@/app/components/base/button'
+import { RiHistoryLine } from '@remixicon/react'
+import React, { type FC } from 'react'
+import { useTranslation } from 'react-i18next'
+
+type EmptyProps = {
+  onResetFilter: () => void
+}
+
+const Empty: FC<EmptyProps> = ({
+  onResetFilter,
+}) => {
+  const { t } = useTranslation()
+
+  return <div className='flex h-5/6 w-full flex-col justify-center gap-y-2'>
+    <div className='flex justify-center'>
+      <RiHistoryLine className='h-10 w-10 text-text-empty-state-icon' />
+    </div>
+    <div className='system-xs-regular flex justify-center text-text-tertiary'>
+      {t('workflow.versionHistory.filter.empty')}
+    </div>
+    <div className='flex justify-center'>
+      <Button size='small' onClick={onResetFilter}>
+        {t('workflow.versionHistory.filter.reset')}
+      </Button>
+    </div>
+  </div>
+}
+
+export default React.memo(Empty)
diff --git a/app/components/workflow/panel/version-history-panel/filter/filter-item.tsx b/app/components/workflow/panel/version-history-panel/filter/filter-item.tsx
new file mode 100644
index 0000000..4301a8e
--- /dev/null
+++ b/app/components/workflow/panel/version-history-panel/filter/filter-item.tsx
@@ -0,0 +1,32 @@
+import { RiCheckLine } from '@remixicon/react'
+import React, { type FC } from 'react'
+import type { WorkflowVersionFilterOptions } from '../../../types'
+
+type FilterItemProps = {
+  item: {
+    key: WorkflowVersionFilterOptions
+    name: string
+  }
+  isSelected?: boolean
+  onClick: (value: WorkflowVersionFilterOptions) => void
+}
+
+const FilterItem: FC<FilterItemProps> = ({
+  item,
+  isSelected = false,
+  onClick,
+}) => {
+  return (
+    <div
+      className='flex cursor-pointer items-center justify-between gap-x-1 rounded-lg px-2 py-1.5 hover:bg-state-base-hover'
+      onClick={() => {
+        onClick(item.key)
+      }}
+    >
+      <div className='system-md-regular flex-1 text-text-primary'>{item.name}</div>
+      {isSelected && <RiCheckLine className='h-4 w-4 shrink-0 text-text-accent' />}
+    </div>
+  )
+}
+
+export default React.memo(FilterItem)
diff --git a/app/components/workflow/panel/version-history-panel/filter/filter-switch.tsx b/app/components/workflow/panel/version-history-panel/filter/filter-switch.tsx
new file mode 100644
index 0000000..0eabd50
--- /dev/null
+++ b/app/components/workflow/panel/version-history-panel/filter/filter-switch.tsx
@@ -0,0 +1,33 @@
+import React, { type FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import Switch from '@/app/components/base/switch'
+
+type FilterSwitchProps = {
+  enabled: boolean
+  handleSwitch: (value: boolean) => void
+}
+
+const FilterSwitch: FC<FilterSwitchProps> = ({
+  enabled,
+  handleSwitch,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div className='flex items-center p-1'>
+      <div className='flex w-full items-center gap-x-1 px-2 py-1.5'>
+        <div className='system-md-regular flex-1 px-1 text-text-secondary'>
+          {t('workflow.versionHistory.filter.onlyShowNamedVersions')}
+        </div>
+        <Switch
+          defaultValue={enabled}
+          onChange={v => handleSwitch(v)}
+          size='md'
+          className='shrink-0'
+        />
+      </div>
+    </div>
+  )
+}
+
+export default React.memo(FilterSwitch)
diff --git a/app/components/workflow/panel/version-history-panel/filter/index.tsx b/app/components/workflow/panel/version-history-panel/filter/index.tsx
new file mode 100644
index 0000000..12f2a72
--- /dev/null
+++ b/app/components/workflow/panel/version-history-panel/filter/index.tsx
@@ -0,0 +1,81 @@
+import React, { type FC, useCallback, useState } from 'react'
+import { RiFilter3Line } from '@remixicon/react'
+import { WorkflowVersionFilterOptions } from '../../../types'
+import { useFilterOptions } from './use-filter'
+import FilterItem from './filter-item'
+import FilterSwitch from './filter-switch'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Divider from '@/app/components/base/divider'
+import cn from '@/utils/classnames'
+
+type FilterProps = {
+  filterValue: WorkflowVersionFilterOptions
+  isOnlyShowNamedVersions: boolean
+  onClickFilterItem: (filter: WorkflowVersionFilterOptions) => void
+  handleSwitch: (isOnlyShowNamedVersions: boolean) => void
+}
+
+const Filter: FC<FilterProps> = ({
+  filterValue,
+  isOnlyShowNamedVersions,
+  onClickFilterItem,
+  handleSwitch,
+}) => {
+  const [open, setOpen] = useState(false)
+  const options = useFilterOptions()
+
+  const handleOnClick = useCallback((value: WorkflowVersionFilterOptions) => {
+    onClickFilterItem(value)
+  }, [onClickFilterItem])
+
+  const isFiltering = filterValue !== WorkflowVersionFilterOptions.all || isOnlyShowNamedVersions
+
+  return (
+    <PortalToFollowElem
+      placement={'bottom-end'}
+      offset={{
+        mainAxis: 4,
+        crossAxis: 55,
+      }}
+      open={open}
+      onOpenChange={setOpen}
+    >
+      <PortalToFollowElemTrigger onClick={() => setOpen(v => !v)}>
+        <div
+          className={cn(
+            'flex h-6 w-6 cursor-pointer items-center justify-center rounded-md p-0.5',
+            isFiltering ? 'bg-state-accent-active-alt' : 'hover:bg-state-base-hover',
+          )}
+        >
+          <RiFilter3Line className={cn('h-4 w-4', isFiltering ? 'text-text-accent' : ' text-text-tertiary')} />
+        </div>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[12]'>
+        <div className='flex w-[248px] flex-col rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg shadow-shadow-shadow-5 backdrop-blur-[5px]'>
+          <div className='flex flex-col p-1'>
+            {
+              options.map((option) => {
+                return (
+                  <FilterItem
+                    key={option.key}
+                    item={option}
+                    isSelected={filterValue === option.key}
+                    onClick={handleOnClick}
+                  />
+                )
+              })
+            }
+          </div>
+          <Divider type='horizontal' className='my-0 h-[1px] bg-divider-subtle' />
+          <FilterSwitch enabled={isOnlyShowNamedVersions} handleSwitch={handleSwitch} />
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default Filter
diff --git a/app/components/workflow/panel/version-history-panel/filter/use-filter.ts b/app/components/workflow/panel/version-history-panel/filter/use-filter.ts
new file mode 100644
index 0000000..1bc5571
--- /dev/null
+++ b/app/components/workflow/panel/version-history-panel/filter/use-filter.ts
@@ -0,0 +1,17 @@
+import { useTranslation } from 'react-i18next'
+import { WorkflowVersionFilterOptions } from '../../../types'
+
+export const useFilterOptions = () => {
+  const { t } = useTranslation()
+
+  return [
+    {
+      key: WorkflowVersionFilterOptions.all,
+      name: t('workflow.versionHistory.filter.all'),
+    },
+    {
+      key: WorkflowVersionFilterOptions.onlyYours,
+      name: t('workflow.versionHistory.filter.onlyYours'),
+    },
+  ]
+}
diff --git a/app/components/workflow/panel/version-history-panel/index.tsx b/app/components/workflow/panel/version-history-panel/index.tsx
new file mode 100644
index 0000000..a42eb0f
--- /dev/null
+++ b/app/components/workflow/panel/version-history-panel/index.tsx
@@ -0,0 +1,279 @@
+'use client'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiArrowDownDoubleLine, RiCloseLine, RiLoader2Line } from '@remixicon/react'
+import { useNodesSyncDraft, useWorkflowRun } from '../../hooks'
+import { useStore, useWorkflowStore } from '../../store'
+import { VersionHistoryContextMenuOptions, WorkflowVersionFilterOptions } from '../../types'
+import VersionHistoryItem from './version-history-item'
+import Filter from './filter'
+import type { VersionHistory } from '@/types/workflow'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { useDeleteWorkflow, useResetWorkflowVersionHistory, useUpdateWorkflow, useWorkflowVersionHistory } from '@/service/use-workflow'
+import Divider from '@/app/components/base/divider'
+import Loading from './loading'
+import Empty from './empty'
+import { useSelector as useAppContextSelector } from '@/context/app-context'
+import RestoreConfirmModal from './restore-confirm-modal'
+import DeleteConfirmModal from './delete-confirm-modal'
+import VersionInfoModal from '@/app/components/app/app-publisher/version-info-modal'
+import Toast from '@/app/components/base/toast'
+
+const HISTORY_PER_PAGE = 10
+const INITIAL_PAGE = 1
+
+const VersionHistoryPanel = () => {
+  const [filterValue, setFilterValue] = useState(WorkflowVersionFilterOptions.all)
+  const [isOnlyShowNamedVersions, setIsOnlyShowNamedVersions] = useState(false)
+  const [operatedItem, setOperatedItem] = useState<VersionHistory>()
+  const [restoreConfirmOpen, setRestoreConfirmOpen] = useState(false)
+  const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false)
+  const [editModalOpen, setEditModalOpen] = useState(false)
+  const workflowStore = useWorkflowStore()
+  const { handleSyncWorkflowDraft } = useNodesSyncDraft()
+  const { handleRestoreFromPublishedWorkflow, handleLoadBackupDraft } = useWorkflowRun()
+  const appDetail = useAppStore.getState().appDetail
+  const setShowWorkflowVersionHistoryPanel = useStore(s => s.setShowWorkflowVersionHistoryPanel)
+  const currentVersion = useStore(s => s.currentVersion)
+  const setCurrentVersion = useStore(s => s.setCurrentVersion)
+  const userProfile = useAppContextSelector(s => s.userProfile)
+  const { t } = useTranslation()
+
+  const {
+    data: versionHistory,
+    fetchNextPage,
+    hasNextPage,
+    isFetching,
+  } = useWorkflowVersionHistory({
+    appId: appDetail!.id,
+    initialPage: INITIAL_PAGE,
+    limit: HISTORY_PER_PAGE,
+    userId: filterValue === WorkflowVersionFilterOptions.onlyYours ? userProfile.id : '',
+    namedOnly: isOnlyShowNamedVersions,
+  })
+
+  const handleVersionClick = useCallback((item: VersionHistory) => {
+    if (item.id !== currentVersion?.id) {
+      setCurrentVersion(item)
+      handleRestoreFromPublishedWorkflow(item)
+    }
+  }, [currentVersion?.id, setCurrentVersion, handleRestoreFromPublishedWorkflow])
+
+  const handleNextPage = () => {
+    if (hasNextPage)
+      fetchNextPage()
+  }
+
+  const handleClose = () => {
+    handleLoadBackupDraft()
+    workflowStore.setState({ isRestoring: false })
+    setShowWorkflowVersionHistoryPanel(false)
+  }
+
+  const handleClickFilterItem = useCallback((value: WorkflowVersionFilterOptions) => {
+    setFilterValue(value)
+  }, [])
+
+  const handleSwitch = useCallback((value: boolean) => {
+    setIsOnlyShowNamedVersions(value)
+  }, [])
+
+  const handleResetFilter = useCallback(() => {
+    setFilterValue(WorkflowVersionFilterOptions.all)
+    setIsOnlyShowNamedVersions(false)
+  }, [])
+
+  const handleClickMenuItem = useCallback((item: VersionHistory, operation: VersionHistoryContextMenuOptions) => {
+    setOperatedItem(item)
+    switch (operation) {
+      case VersionHistoryContextMenuOptions.restore:
+        setRestoreConfirmOpen(true)
+        break
+      case VersionHistoryContextMenuOptions.edit:
+        setEditModalOpen(true)
+        break
+      case VersionHistoryContextMenuOptions.delete:
+        setDeleteConfirmOpen(true)
+        break
+    }
+  }, [])
+
+  const handleCancel = useCallback((operation: VersionHistoryContextMenuOptions) => {
+    switch (operation) {
+      case VersionHistoryContextMenuOptions.restore:
+        setRestoreConfirmOpen(false)
+        break
+      case VersionHistoryContextMenuOptions.edit:
+        setEditModalOpen(false)
+        break
+      case VersionHistoryContextMenuOptions.delete:
+        setDeleteConfirmOpen(false)
+        break
+    }
+  }, [])
+
+  const resetWorkflowVersionHistory = useResetWorkflowVersionHistory(appDetail!.id)
+
+  const handleRestore = useCallback((item: VersionHistory) => {
+    setShowWorkflowVersionHistoryPanel(false)
+    handleRestoreFromPublishedWorkflow(item)
+    workflowStore.setState({ isRestoring: false })
+    workflowStore.setState({ backupDraft: undefined })
+    handleSyncWorkflowDraft(true, false, {
+      onSuccess: () => {
+        Toast.notify({
+          type: 'success',
+          message: t('workflow.versionHistory.action.restoreSuccess'),
+        })
+      },
+      onError: () => {
+        Toast.notify({
+          type: 'error',
+          message: t('workflow.versionHistory.action.restoreFailure'),
+        })
+      },
+      onSettled: () => {
+        resetWorkflowVersionHistory()
+      },
+    })
+  }, [setShowWorkflowVersionHistoryPanel, handleSyncWorkflowDraft, workflowStore, handleRestoreFromPublishedWorkflow, resetWorkflowVersionHistory, t])
+
+  const { mutateAsync: deleteWorkflow } = useDeleteWorkflow(appDetail!.id)
+
+  const handleDelete = useCallback(async (id: string) => {
+    await deleteWorkflow(id, {
+      onSuccess: () => {
+        setDeleteConfirmOpen(false)
+        Toast.notify({
+          type: 'success',
+          message: t('workflow.versionHistory.action.deleteSuccess'),
+        })
+        resetWorkflowVersionHistory()
+      },
+      onError: () => {
+        Toast.notify({
+          type: 'error',
+          message: t('workflow.versionHistory.action.deleteFailure'),
+        })
+      },
+      onSettled: () => {
+        setDeleteConfirmOpen(false)
+      },
+    })
+  }, [t, deleteWorkflow, resetWorkflowVersionHistory])
+
+  const { mutateAsync: updateWorkflow } = useUpdateWorkflow(appDetail!.id)
+
+  const handleUpdateWorkflow = useCallback(async (params: { id?: string, title: string, releaseNotes: string }) => {
+    const { id, ...rest } = params
+    await updateWorkflow({
+      workflowId: id!,
+      ...rest,
+    }, {
+      onSuccess: () => {
+        setEditModalOpen(false)
+        Toast.notify({
+          type: 'success',
+          message: t('workflow.versionHistory.action.updateSuccess'),
+        })
+        resetWorkflowVersionHistory()
+      },
+      onError: () => {
+        Toast.notify({
+          type: 'error',
+          message: t('workflow.versionHistory.action.updateFailure'),
+        })
+      },
+      onSettled: () => {
+        setEditModalOpen(false)
+      },
+    })
+  }, [t, updateWorkflow, resetWorkflowVersionHistory])
+
+  return (
+    <div className='flex h-full w-[268px] flex-col rounded-l-2xl border-y-[0.5px] border-l-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl shadow-shadow-shadow-5'>
+      <div className='flex items-center gap-x-2 px-4 pt-3'>
+        <div className='system-xl-semibold flex-1 py-1 text-text-primary'>{t('workflow.versionHistory.title')}</div>
+        <Filter
+          filterValue={filterValue}
+          isOnlyShowNamedVersions={isOnlyShowNamedVersions}
+          onClickFilterItem={handleClickFilterItem}
+          handleSwitch={handleSwitch}
+        />
+        <Divider type='vertical' className='mx-1 h-3.5' />
+        <div
+          className='flex h-6 w-6 cursor-pointer items-center justify-center p-0.5'
+          onClick={handleClose}
+        >
+          <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+        </div>
+      </div>
+      <div className="flex h-0 flex-1 flex-col">
+        <div className="flex-1 overflow-y-auto px-3 py-2">
+          {(isFetching && !versionHistory?.pages?.length)
+            ? (
+              <Loading />
+            )
+            : (
+              <>
+                {versionHistory?.pages?.map((page, pageNumber) => (
+                  page.items?.map((item, idx) => {
+                    const isLast = pageNumber === versionHistory.pages.length - 1 && idx === page.items.length - 1
+                    return <VersionHistoryItem
+                      key={item.id}
+                      item={item}
+                      currentVersion={currentVersion}
+                      latestVersionId={appDetail!.workflow!.id}
+                      onClick={handleVersionClick}
+                      handleClickMenuItem={handleClickMenuItem.bind(null, item)}
+                      isLast={isLast}
+                    />
+                  })
+                ))}
+                {!isFetching && (!versionHistory?.pages?.length || !versionHistory.pages[0].items.length) && (
+                  <Empty onResetFilter={handleResetFilter} />
+                )}
+              </>
+            )}
+        </div>
+        {hasNextPage && (
+          <div className='p-2'>
+            <div
+              className='flex cursor-pointer items-center gap-x-1'
+              onClick={handleNextPage}
+            >
+              <div className='item-center flex justify-center p-0.5'>
+                {isFetching
+                  ? <RiLoader2Line className='h-3.5 w-3.5 animate-spin text-text-accent' />
+                  : <RiArrowDownDoubleLine className='h-3.5 w-3.5 text-text-accent' />}
+              </div>
+              <div className='system-xs-medium-uppercase py-[1px] text-text-accent'>
+                {t('workflow.common.loadMore')}
+              </div>
+            </div>
+          </div>
+        )}
+      </div>
+      {restoreConfirmOpen && (<RestoreConfirmModal
+        isOpen={restoreConfirmOpen}
+        versionInfo={operatedItem!}
+        onClose={handleCancel.bind(null, VersionHistoryContextMenuOptions.restore)}
+        onRestore={handleRestore}
+      />)}
+      {deleteConfirmOpen && (<DeleteConfirmModal
+        isOpen={deleteConfirmOpen}
+        versionInfo={operatedItem!}
+        onClose={handleCancel.bind(null, VersionHistoryContextMenuOptions.delete)}
+        onDelete={handleDelete}
+      />)}
+      {editModalOpen && (<VersionInfoModal
+        isOpen={editModalOpen}
+        versionInfo={operatedItem}
+        onClose={handleCancel.bind(null, VersionHistoryContextMenuOptions.edit)}
+        onPublish={handleUpdateWorkflow}
+      />)}
+    </div>
+  )
+}
+
+export default React.memo(VersionHistoryPanel)
diff --git a/app/components/workflow/panel/version-history-panel/loading/index.tsx b/app/components/workflow/panel/version-history-panel/loading/index.tsx
new file mode 100644
index 0000000..2c4db66
--- /dev/null
+++ b/app/components/workflow/panel/version-history-panel/loading/index.tsx
@@ -0,0 +1,19 @@
+import Item from './item'
+
+const itemConfig = Array.from({ length: 8 }).map((_, index) => {
+  return {
+    isFirst: index === 0,
+    isLast: index === 7,
+    titleWidth: (index + 1) % 2 === 0 ? 'w-1/3' : 'w-2/5',
+    releaseNotesWidth: (index + 1) % 2 === 0 ? 'w-3/4' : 'w-4/6',
+  }
+})
+
+const Loading = () => {
+  return <div className='relative w-full overflow-y-hidden'>
+    <div className='absolute left-0 top-0 z-10 h-full w-full bg-dataset-chunk-list-mask-bg' />
+    {itemConfig.map((config, index) => <Item key={index} {...config} />)}
+  </div>
+}
+
+export default Loading
diff --git a/app/components/workflow/panel/version-history-panel/loading/item.tsx b/app/components/workflow/panel/version-history-panel/loading/item.tsx
new file mode 100644
index 0000000..96d1fde
--- /dev/null
+++ b/app/components/workflow/panel/version-history-panel/loading/item.tsx
@@ -0,0 +1,40 @@
+import React, { type FC } from 'react'
+import cn from '@/utils/classnames'
+
+type ItemProps = {
+  titleWidth: string
+  releaseNotesWidth: string
+  isFirst: boolean
+  isLast: boolean
+}
+
+const Item: FC<ItemProps> = ({
+  titleWidth,
+  releaseNotesWidth,
+  isFirst,
+  isLast,
+}) => {
+  return (
+    <div className='relative flex gap-x-1 p-2' >
+      {!isLast && <div className='absolute left-4 top-6 h-[calc(100%-0.75rem)] w-0.5 bg-divider-subtle' />}
+      <div className=' flex h-5 w-[18px] shrink-0 items-center justify-center'>
+        <div className='h-2 w-2 rounded-lg border-[2px] border-text-quaternary' />
+      </div>
+      <div className='flex grow flex-col gap-y-0.5'>
+        <div className='flex h-3.5 items-center'>
+          <div className={cn('h-2 w-full rounded-sm bg-text-quaternary opacity-20', titleWidth)} />
+        </div>
+        {
+          !isFirst && (
+            <div className='flex h-3 items-center'>
+              <div className={cn('h-1.5 w-full rounded-sm bg-text-quaternary opacity-20', releaseNotesWidth)} />
+            </div>
+          )
+        }
+      </div>
+    </div>
+
+  )
+}
+
+export default React.memo(Item)
diff --git a/app/components/workflow/panel/version-history-panel/restore-confirm-modal.tsx b/app/components/workflow/panel/version-history-panel/restore-confirm-modal.tsx
new file mode 100644
index 0000000..d8394d2
--- /dev/null
+++ b/app/components/workflow/panel/version-history-panel/restore-confirm-modal.tsx
@@ -0,0 +1,42 @@
+import React, { type FC } from 'react'
+import Modal from '@/app/components/base/modal'
+import type { VersionHistory } from '@/types/workflow'
+import { useTranslation } from 'react-i18next'
+import Button from '@/app/components/base/button'
+
+type RestoreConfirmModalProps = {
+  isOpen: boolean
+  versionInfo: VersionHistory
+  onClose: () => void
+  onRestore: (item: VersionHistory) => void
+}
+
+const RestoreConfirmModal: FC<RestoreConfirmModalProps> = ({
+  isOpen,
+  versionInfo,
+  onClose,
+  onRestore,
+}) => {
+  const { t } = useTranslation()
+
+  return <Modal className='p-0' isShow={isOpen} onClose={onClose}>
+    <div className='flex flex-col gap-y-2 p-6 pb-4 '>
+      <div className='title-2xl-semi-bold text-text-primary'>
+        {`${t('workflow.common.restore')} ${versionInfo.marked_name || t('workflow.versionHistory.defaultName')}`}
+      </div>
+      <p className='system-md-regular text-text-secondary'>
+        {t('workflow.versionHistory.restorationTip')}
+      </p>
+    </div>
+    <div className='flex items-center justify-end gap-x-2 p-6'>
+      <Button onClick={onClose}>
+        {t('common.operation.cancel')}
+      </Button>
+      <Button variant='primary' onClick={onRestore.bind(null, versionInfo)}>
+        {t('workflow.common.restore')}
+      </Button>
+    </div>
+  </Modal>
+}
+
+export default RestoreConfirmModal
diff --git a/app/components/workflow/panel/version-history-panel/version-history-item.tsx b/app/components/workflow/panel/version-history-panel/version-history-item.tsx
new file mode 100644
index 0000000..98fd7ce
--- /dev/null
+++ b/app/components/workflow/panel/version-history-panel/version-history-item.tsx
@@ -0,0 +1,137 @@
+import React, { useEffect, useState } from 'react'
+import dayjs from 'dayjs'
+import { useTranslation } from 'react-i18next'
+import ContextMenu from './context-menu'
+import cn from '@/utils/classnames'
+import type { VersionHistory } from '@/types/workflow'
+import { type VersionHistoryContextMenuOptions, WorkflowVersion } from '../../types'
+
+type VersionHistoryItemProps = {
+  item: VersionHistory
+  currentVersion: VersionHistory | null
+  latestVersionId: string
+  onClick: (item: VersionHistory) => void
+  handleClickMenuItem: (operation: VersionHistoryContextMenuOptions) => void
+  isLast: boolean
+}
+
+const formatVersion = (versionHistory: VersionHistory, latestVersionId: string): string => {
+  const { version, id } = versionHistory
+  if (version === WorkflowVersion.Draft)
+    return WorkflowVersion.Draft
+  if (id === latestVersionId)
+    return WorkflowVersion.Latest
+  try {
+    const date = new Date(version)
+    if (Number.isNaN(date.getTime()))
+      return version
+
+    // format as YYYY-MM-DD HH:mm:ss
+    return date.toISOString().slice(0, 19).replace('T', ' ')
+  }
+  catch {
+    return version
+  }
+}
+
+const VersionHistoryItem: React.FC<VersionHistoryItemProps> = ({
+  item,
+  currentVersion,
+  latestVersionId,
+  onClick,
+  handleClickMenuItem,
+  isLast,
+}) => {
+  const { t } = useTranslation()
+  const [isHovering, setIsHovering] = useState(false)
+  const [open, setOpen] = useState(false)
+
+  const formatTime = (time: number) => dayjs.unix(time).format('YYYY-MM-DD HH:mm')
+  const formattedVersion = formatVersion(item, latestVersionId)
+  const isSelected = item.version === currentVersion?.version
+  const isDraft = formattedVersion === WorkflowVersion.Draft
+  const isLatest = formattedVersion === WorkflowVersion.Latest
+
+  useEffect(() => {
+    if (isDraft)
+      onClick(item)
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [])
+
+  const handleClickItem = () => {
+    if (isSelected)
+      return
+    onClick(item)
+  }
+
+  return (
+    <div
+      className={cn(
+        'group relative flex gap-x-1 rounded-lg p-2',
+        isSelected ? 'cursor-not-allowed bg-state-accent-active' : 'cursor-pointer hover:bg-state-base-hover',
+      )}
+      onClick={handleClickItem}
+      onMouseEnter={() => setIsHovering(true)}
+      onMouseLeave={() => {
+        setIsHovering(false)
+        setOpen(false)
+      }}
+      onContextMenu={(e) => {
+        e.preventDefault()
+        setOpen(true)
+      }}
+    >
+      {!isLast && <div className='absolute left-4 top-6 h-[calc(100%-0.75rem)] w-0.5 bg-divider-subtle' />}
+      <div className=' flex h-5 w-[18px] shrink-0 items-center justify-center'>
+        <div className={cn(
+          'h-2 w-2 rounded-lg border-[2px]',
+          isSelected ? 'border-text-accent' : 'border-text-quaternary',
+        )}/>
+      </div>
+      <div className='flex grow flex-col gap-y-0.5 overflow-hidden'>
+        <div className='mr-6 flex h-5 items-center gap-x-1'>
+          <div className={cn(
+            'system-sm-semibold truncate py-[1px]',
+            isSelected ? 'text-text-accent' : 'text-text-secondary',
+          )}>
+            {isDraft ? t('workflow.versionHistory.currentDraft') : item.marked_name || t('workflow.versionHistory.defaultName')}
+          </div>
+          {isLatest && (
+            <div className='system-2xs-medium-uppercase flex h-5 shrink-0 items-center rounded-md border border-text-accent-secondary
+            bg-components-badge-bg-dimm px-[5px] text-text-accent-secondary'>
+              {t('workflow.versionHistory.latest')}
+            </div>
+          )}
+        </div>
+        {
+          !isDraft && (
+            <div className='system-xs-regular break-words text-text-secondary'>
+              {item.marked_comment || ''}
+            </div>
+          )
+        }
+        {
+          !isDraft && (
+            <div className='system-xs-regular truncate text-text-tertiary'>
+              {`${formatTime(item.created_at)} 路 ${item.created_by.name}`}
+            </div>
+          )
+        }
+      </div>
+      {/* Context Menu */}
+      {!isDraft && isHovering && (
+        <div className='absolute right-1 top-1'>
+          <ContextMenu
+            isShowDelete={!isLatest}
+            isNamedVersion={!!item.marked_name}
+            open={open}
+            setOpen={setOpen}
+            handleClickMenuItem={handleClickMenuItem}
+          />
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default React.memo(VersionHistoryItem)
diff --git a/app/components/workflow/panel/workflow-preview.tsx b/app/components/workflow/panel/workflow-preview.tsx
new file mode 100644
index 0000000..34b0ec6
--- /dev/null
+++ b/app/components/workflow/panel/workflow-preview.tsx
@@ -0,0 +1,213 @@
+import {
+  memo,
+  useCallback,
+  useEffect,
+  useState,
+} from 'react'
+import {
+  RiClipboardLine,
+  RiCloseLine,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import copy from 'copy-to-clipboard'
+import ResultText from '../run/result-text'
+import ResultPanel from '../run/result-panel'
+import TracingPanel from '../run/tracing-panel'
+import {
+  useWorkflowInteractions,
+} from '../hooks'
+import { useStore } from '../store'
+import {
+  WorkflowRunningStatus,
+} from '../types'
+import Toast from '../../base/toast'
+import InputsPanel from './inputs-panel'
+import cn from '@/utils/classnames'
+import Loading from '@/app/components/base/loading'
+import Button from '@/app/components/base/button'
+
+const WorkflowPreview = () => {
+  const { t } = useTranslation()
+  const { handleCancelDebugAndPreviewPanel } = useWorkflowInteractions()
+  const workflowRunningData = useStore(s => s.workflowRunningData)
+  const showInputsPanel = useStore(s => s.showInputsPanel)
+  const showDebugAndPreviewPanel = useStore(s => s.showDebugAndPreviewPanel)
+  const [currentTab, setCurrentTab] = useState<string>(showInputsPanel ? 'INPUT' : 'TRACING')
+
+  const switchTab = async (tab: string) => {
+    setCurrentTab(tab)
+  }
+
+  useEffect(() => {
+    if (showDebugAndPreviewPanel && showInputsPanel)
+      setCurrentTab('INPUT')
+  }, [showDebugAndPreviewPanel, showInputsPanel])
+
+  useEffect(() => {
+    if ((workflowRunningData?.result.status === WorkflowRunningStatus.Succeeded || workflowRunningData?.result.status === WorkflowRunningStatus.Failed) && !workflowRunningData.resultText && !workflowRunningData.result.files?.length)
+      switchTab('DETAIL')
+  }, [workflowRunningData])
+
+  const [panelWidth, setPanelWidth] = useState(420)
+  const [isResizing, setIsResizing] = useState(false)
+
+  const startResizing = useCallback((e: React.MouseEvent) => {
+    e.preventDefault()
+    setIsResizing(true)
+  }, [])
+
+  const stopResizing = useCallback(() => {
+    setIsResizing(false)
+  }, [])
+
+  const resize = useCallback((e: MouseEvent) => {
+    if (isResizing) {
+      const newWidth = window.innerWidth - e.clientX
+      if (newWidth > 420 && newWidth < 1024)
+        setPanelWidth(newWidth)
+    }
+  }, [isResizing])
+
+  useEffect(() => {
+    window.addEventListener('mousemove', resize)
+    window.addEventListener('mouseup', stopResizing)
+    return () => {
+      window.removeEventListener('mousemove', resize)
+      window.removeEventListener('mouseup', stopResizing)
+    }
+  }, [resize, stopResizing])
+
+  return (
+    <div className={`
+      relative flex h-full flex-col rounded-l-2xl border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl
+    `}
+      style={{ width: `${panelWidth}px` }}
+    >
+      <div
+        className="absolute bottom-0 left-[3px] top-1/2 z-50 h-6 w-[3px] cursor-col-resize rounded bg-gray-300"
+        onMouseDown={startResizing}
+      />
+      <div className='flex items-center justify-between p-4 pb-1 text-base font-semibold text-text-primary'>
+        {`Test Run${!workflowRunningData?.result.sequence_number ? '' : `#${workflowRunningData?.result.sequence_number}`}`}
+        <div className='cursor-pointer p-1' onClick={() => handleCancelDebugAndPreviewPanel()}>
+          <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+        </div>
+      </div>
+      <div className='relative flex grow flex-col'>
+        <div className='flex shrink-0 items-center border-b-[0.5px] border-divider-subtle px-4'>
+          {showInputsPanel && (
+            <div
+              className={cn(
+                'mr-6 cursor-pointer border-b-2 border-transparent py-3 text-[13px] font-semibold leading-[18px] text-text-tertiary',
+                currentTab === 'INPUT' && '!border-[rgb(21,94,239)] text-text-secondary',
+              )}
+              onClick={() => switchTab('INPUT')}
+            >{t('runLog.input')}</div>
+          )}
+          <div
+            className={cn(
+              'mr-6 cursor-pointer border-b-2 border-transparent py-3 text-[13px] font-semibold leading-[18px] text-text-tertiary',
+              currentTab === 'RESULT' && '!border-[rgb(21,94,239)] text-text-secondary',
+              !workflowRunningData && '!cursor-not-allowed opacity-30',
+            )}
+            onClick={() => {
+              if (!workflowRunningData)
+                return
+              switchTab('RESULT')
+            }}
+          >{t('runLog.result')}</div>
+          <div
+            className={cn(
+              'mr-6 cursor-pointer border-b-2 border-transparent py-3 text-[13px] font-semibold leading-[18px] text-text-tertiary',
+              currentTab === 'DETAIL' && '!border-[rgb(21,94,239)] text-text-secondary',
+              !workflowRunningData && '!cursor-not-allowed opacity-30',
+            )}
+            onClick={() => {
+              if (!workflowRunningData)
+                return
+              switchTab('DETAIL')
+            }}
+          >{t('runLog.detail')}</div>
+          <div
+            className={cn(
+              'mr-6 cursor-pointer border-b-2 border-transparent py-3 text-[13px] font-semibold leading-[18px] text-text-tertiary',
+              currentTab === 'TRACING' && '!border-[rgb(21,94,239)] text-text-secondary',
+              !workflowRunningData && '!cursor-not-allowed opacity-30',
+            )}
+            onClick={() => {
+              if (!workflowRunningData)
+                return
+              switchTab('TRACING')
+            }}
+          >{t('runLog.tracing')}</div>
+        </div>
+        <div className={cn(
+          'h-0 grow overflow-y-auto rounded-b-2xl bg-components-panel-bg',
+          (currentTab === 'RESULT' || currentTab === 'TRACING') && '!bg-background-section-burn',
+        )}>
+          {currentTab === 'INPUT' && showInputsPanel && (
+            <InputsPanel onRun={() => switchTab('RESULT')} />
+          )}
+          {currentTab === 'RESULT' && (
+            <>
+              <ResultText
+                isRunning={workflowRunningData?.result?.status === WorkflowRunningStatus.Running || !workflowRunningData?.result}
+                outputs={workflowRunningData?.resultText}
+                allFiles={workflowRunningData?.result?.files}
+                error={workflowRunningData?.result?.error}
+                onClick={() => switchTab('DETAIL')}
+              />
+              {(workflowRunningData?.result.status === WorkflowRunningStatus.Succeeded && workflowRunningData?.resultText && typeof workflowRunningData?.resultText === 'string') && (
+                <Button
+                  className={cn('mb-4 ml-4 space-x-1')}
+                  onClick={() => {
+                    const content = workflowRunningData?.resultText
+                    if (typeof content === 'string')
+                      copy(content)
+                    else
+                      copy(JSON.stringify(content))
+                    Toast.notify({ type: 'success', message: t('common.actionMsg.copySuccessfully') })
+                  }}>
+                  <RiClipboardLine className='h-3.5 w-3.5' />
+                  <div>{t('common.operation.copy')}</div>
+                </Button>
+              )}
+            </>
+          )}
+          {currentTab === 'DETAIL' && (
+            <ResultPanel
+              inputs={workflowRunningData?.result?.inputs}
+              outputs={workflowRunningData?.result?.outputs}
+              status={workflowRunningData?.result?.status || ''}
+              error={workflowRunningData?.result?.error}
+              elapsed_time={workflowRunningData?.result?.elapsed_time}
+              total_tokens={workflowRunningData?.result?.total_tokens}
+              created_at={workflowRunningData?.result?.created_at}
+              created_by={(workflowRunningData?.result?.created_by as any)?.name}
+              steps={workflowRunningData?.result?.total_steps}
+              exceptionCounts={workflowRunningData?.result?.exceptions_count}
+            />
+          )}
+          {currentTab === 'DETAIL' && !workflowRunningData?.result && (
+            <div className='flex h-full items-center justify-center bg-components-panel-bg'>
+              <Loading />
+            </div>
+          )}
+          {currentTab === 'TRACING' && (
+            <TracingPanel
+              className='bg-background-section-burn'
+              list={workflowRunningData?.tracing || []}
+            />
+          )}
+          {currentTab === 'TRACING' && !workflowRunningData?.tracing?.length && (
+            <div className='flex h-full items-center justify-center !bg-background-section-burn'>
+              <Loading />
+            </div>
+          )}
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default memo(WorkflowPreview)
diff --git a/app/components/workflow/plugin-dependency/hooks.ts b/app/components/workflow/plugin-dependency/hooks.ts
new file mode 100644
index 0000000..1aa52cf
--- /dev/null
+++ b/app/components/workflow/plugin-dependency/hooks.ts
@@ -0,0 +1,17 @@
+import { useCallback } from 'react'
+import { useStore as usePluginDependenciesStore } from './store'
+import { useMutationCheckDependencies } from '@/service/use-plugins'
+
+export const usePluginDependencies = () => {
+  const { mutateAsync } = useMutationCheckDependencies()
+
+  const handleCheckPluginDependencies = useCallback(async (appId: string) => {
+    const { leaked_dependencies } = await mutateAsync(appId)
+    const { setDependencies } = usePluginDependenciesStore.getState()
+    setDependencies(leaked_dependencies)
+  }, [mutateAsync])
+
+  return {
+    handleCheckPluginDependencies,
+  }
+}
diff --git a/app/components/workflow/plugin-dependency/index.tsx b/app/components/workflow/plugin-dependency/index.tsx
new file mode 100644
index 0000000..185722e
--- /dev/null
+++ b/app/components/workflow/plugin-dependency/index.tsx
@@ -0,0 +1,24 @@
+import { useCallback } from 'react'
+import { useStore } from './store'
+import InstallBundle from '@/app/components/plugins/install-plugin/install-bundle'
+
+const PluginDependency = () => {
+  const dependencies = useStore(s => s.dependencies)
+
+  const handleCancelInstallBundle = useCallback(() => {
+    const { setDependencies } = useStore.getState()
+    setDependencies([])
+  }, [])
+
+  if (!dependencies.length)
+    return null
+
+  return (
+    <InstallBundle
+      fromDSLPayload={dependencies}
+      onClose={handleCancelInstallBundle}
+    />
+  )
+}
+
+export default PluginDependency
diff --git a/app/components/workflow/plugin-dependency/store.ts b/app/components/workflow/plugin-dependency/store.ts
new file mode 100644
index 0000000..a8e1d81
--- /dev/null
+++ b/app/components/workflow/plugin-dependency/store.ts
@@ -0,0 +1,11 @@
+import { create } from 'zustand'
+import type { Dependency } from '@/app/components/plugins/types'
+
+type Shape = {
+  dependencies: Dependency[]
+  setDependencies: (dependencies: Dependency[]) => void
+}
+export const useStore = create<Shape>(set => ({
+  dependencies: [],
+  setDependencies: dependencies => set({ dependencies }),
+}))
diff --git a/app/components/workflow/run/agent-log/agent-log-item.tsx b/app/components/workflow/run/agent-log/agent-log-item.tsx
new file mode 100644
index 0000000..ce81e36
--- /dev/null
+++ b/app/components/workflow/run/agent-log/agent-log-item.tsx
@@ -0,0 +1,126 @@
+import {
+  useMemo,
+  useState,
+} from 'react'
+import {
+  RiArrowRightSLine,
+  RiListView,
+} from '@remixicon/react'
+import cn from '@/utils/classnames'
+import Button from '@/app/components/base/button'
+import type { AgentLogItemWithChildren } from '@/types/workflow'
+import NodeStatusIcon from '@/app/components/workflow/nodes/_base/components/node-status-icon'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
+import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+import BlockIcon from '@/app/components/workflow/block-icon'
+import { BlockEnum } from '@/app/components/workflow/types'
+import useGetIcon from '@/app/components/plugins/install-plugin/base/use-get-icon'
+
+type AgentLogItemProps = {
+  item: AgentLogItemWithChildren
+  onShowAgentOrToolLog: (detail: AgentLogItemWithChildren) => void
+}
+const AgentLogItem = ({
+  item,
+  onShowAgentOrToolLog,
+}: AgentLogItemProps) => {
+  const {
+    label,
+    status,
+    children,
+    data,
+    metadata,
+  } = item
+  const [expanded, setExpanded] = useState(false)
+  const { getIconUrl } = useGetIcon()
+  const toolIcon = useMemo(() => {
+    const icon = metadata?.icon
+
+    if (icon) {
+      if (icon.includes('http'))
+        return icon
+
+      return getIconUrl(icon)
+    }
+
+    return ''
+  }, [getIconUrl, metadata?.icon])
+
+  const mergeStatus = useMemo(() => {
+    if (status === 'start')
+      return 'running'
+
+    return status
+  }, [status])
+
+  return (
+    <div className='rounded-[10px] border-[0.5px] border-components-panel-border bg-background-default'>
+      <div
+        className={cn(
+          'flex cursor-pointer items-center pb-2 pl-1.5 pr-3 pt-2',
+          expanded && 'pb-1',
+        )}
+        onClick={() => setExpanded(!expanded)}
+      >
+        {
+          expanded
+            ? <RiArrowRightSLine className='h-4 w-4 shrink-0 rotate-90 text-text-quaternary' />
+            : <RiArrowRightSLine className='h-4 w-4 shrink-0 text-text-quaternary' />
+        }
+        <BlockIcon
+          className='mr-1.5 shrink-0'
+          type={toolIcon ? BlockEnum.Tool : BlockEnum.Agent}
+          toolIcon={toolIcon}
+        />
+        <div
+          className='system-sm-semibold-uppercase grow truncate text-text-secondary'
+          title={label}
+        >
+          {label}
+        </div>
+        {
+          metadata?.elapsed_time && (
+            <div className='system-xs-regular mr-2 shrink-0 text-text-tertiary'>{metadata?.elapsed_time?.toFixed(3)}s</div>
+          )
+        }
+        <NodeStatusIcon status={mergeStatus} />
+      </div>
+      {
+        expanded && (
+          <div className='p-1 pt-0'>
+            {
+              !!children?.length && (
+                <Button
+                  className='mb-1 flex w-full items-center justify-between'
+                  variant='tertiary'
+                  onClick={() => onShowAgentOrToolLog(item)}
+                >
+                  <div className='flex items-center'>
+                    <RiListView className='mr-1 h-4 w-4 shrink-0 text-components-button-tertiary-text' />
+                    {`${children.length} Action Logs`}
+                  </div>
+                  <div className='flex'>
+                    <RiArrowRightSLine className='h-4 w-4 shrink-0 text-components-button-tertiary-text' />
+                  </div>
+                </Button>
+              )
+            }
+            {
+              data && (
+                <CodeEditor
+                  readOnly
+                  title={<div>{'data'.toLocaleUpperCase()}</div>}
+                  language={CodeLanguage.json}
+                  value={data}
+                  isJSONStringifyBeauty
+                />
+              )
+            }
+          </div>
+        )
+      }
+    </div>
+  )
+}
+
+export default AgentLogItem
diff --git a/app/components/workflow/run/agent-log/agent-log-nav-more.tsx b/app/components/workflow/run/agent-log/agent-log-nav-more.tsx
new file mode 100644
index 0000000..9f14aa1
--- /dev/null
+++ b/app/components/workflow/run/agent-log/agent-log-nav-more.tsx
@@ -0,0 +1,61 @@
+import { useState } from 'react'
+import { RiMoreLine } from '@remixicon/react'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+import Button from '@/app/components/base/button'
+import type { AgentLogItemWithChildren } from '@/types/workflow'
+
+type AgentLogNavMoreProps = {
+  options: { id: string; label: string }[]
+  onShowAgentOrToolLog: (detail?: AgentLogItemWithChildren) => void
+}
+const AgentLogNavMore = ({
+  options,
+  onShowAgentOrToolLog,
+}: AgentLogNavMoreProps) => {
+  const [open, setOpen] = useState(false)
+
+  return (
+    <PortalToFollowElem
+      placement='bottom-start'
+      offset={{
+        mainAxis: 2,
+        crossAxis: -54,
+      }}
+      open={open}
+      onOpenChange={setOpen}
+    >
+      <PortalToFollowElemTrigger>
+        <Button
+          className='h-6 w-6'
+          variant='ghost-accent'
+        >
+          <RiMoreLine className='h-4 w-4' />
+        </Button>
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent>
+        <div className='w-[136px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
+          {
+            options.map(option => (
+              <div
+                key={option.id}
+                className='system-md-regular flex h-8 cursor-pointer items-center rounded-lg px-2 text-text-secondary hover:bg-state-base-hover'
+                onClick={() => {
+                  onShowAgentOrToolLog(option as AgentLogItemWithChildren)
+                  setOpen(false)
+                }}
+              >
+                {option.label}
+              </div>
+            ))
+          }
+        </div>
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default AgentLogNavMore
diff --git a/app/components/workflow/run/agent-log/agent-log-nav.tsx b/app/components/workflow/run/agent-log/agent-log-nav.tsx
new file mode 100644
index 0000000..9307f31
--- /dev/null
+++ b/app/components/workflow/run/agent-log/agent-log-nav.tsx
@@ -0,0 +1,78 @@
+import { RiArrowLeftLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import AgentLogNavMore from './agent-log-nav-more'
+import Button from '@/app/components/base/button'
+import type { AgentLogItemWithChildren } from '@/types/workflow'
+
+type AgentLogNavProps = {
+  agentOrToolLogItemStack: AgentLogItemWithChildren[]
+  onShowAgentOrToolLog: (detail?: AgentLogItemWithChildren) => void
+}
+const AgentLogNav = ({
+  agentOrToolLogItemStack,
+  onShowAgentOrToolLog,
+}: AgentLogNavProps) => {
+  const { t } = useTranslation()
+  const agentOrToolLogItemStackLength = agentOrToolLogItemStack.length
+  const first = agentOrToolLogItemStack[0]
+  const mid = agentOrToolLogItemStack.slice(1, -1)
+  const end = agentOrToolLogItemStack.at(-1)
+
+  return (
+    <div className='flex h-8 items-center bg-components-panel-bg p-1 pr-3'>
+      <Button
+        className='shrink-0 px-[5px]'
+        size='small'
+        variant='ghost-accent'
+        onClick={() => {
+          onShowAgentOrToolLog()
+        }}
+      >
+        <RiArrowLeftLine className='mr-1 h-3.5 w-3.5' />
+        AGENT
+      </Button>
+      <div className='system-xs-regular mx-0.5 shrink-0 text-divider-deep'>/</div>
+      {
+        agentOrToolLogItemStackLength > 1
+          ? (
+            <Button
+              className='shrink-0 px-[5px]'
+              size='small'
+              variant='ghost-accent'
+              onClick={() => onShowAgentOrToolLog(first)}
+            >
+              {t('workflow.nodes.agent.strategy.label')}
+            </Button>
+          )
+          : (
+            <div className='system-xs-medium-uppercase flex items-center px-[5px] text-text-tertiary'>
+              {t('workflow.nodes.agent.strategy.label')}
+            </div>
+          )
+      }
+      {
+        !!mid.length && (
+          <>
+            <div className='system-xs-regular mx-0.5 shrink-0 text-divider-deep'>/</div>
+            <AgentLogNavMore
+              options={mid}
+              onShowAgentOrToolLog={onShowAgentOrToolLog}
+            />
+          </>
+        )
+      }
+      {
+        !!end && agentOrToolLogItemStackLength > 1 && (
+          <>
+            <div className='system-xs-regular mx-0.5 shrink-0 text-divider-deep'>/</div>
+            <div className='system-xs-medium-uppercase flex items-center px-[5px] text-text-tertiary'>
+              {end.label}
+            </div>
+          </>
+        )
+      }
+    </div>
+  )
+}
+
+export default AgentLogNav
diff --git a/app/components/workflow/run/agent-log/agent-log-trigger.tsx b/app/components/workflow/run/agent-log/agent-log-trigger.tsx
new file mode 100644
index 0000000..60b4097
--- /dev/null
+++ b/app/components/workflow/run/agent-log/agent-log-trigger.tsx
@@ -0,0 +1,49 @@
+import { RiArrowRightLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import type {
+  AgentLogItemWithChildren,
+  NodeTracing,
+} from '@/types/workflow'
+
+type AgentLogTriggerProps = {
+  nodeInfo: NodeTracing
+  onShowAgentOrToolLog: (detail?: AgentLogItemWithChildren) => void
+}
+const AgentLogTrigger = ({
+  nodeInfo,
+  onShowAgentOrToolLog,
+}: AgentLogTriggerProps) => {
+  const { t } = useTranslation()
+  const { agentLog, execution_metadata } = nodeInfo
+  const agentStrategy = execution_metadata?.tool_info?.agent_strategy
+
+  return (
+    <div
+      className='cursor-pointer rounded-[10px] bg-components-button-tertiary-bg'
+      onClick={() => {
+        onShowAgentOrToolLog({ id: nodeInfo.id, children: agentLog || [] } as AgentLogItemWithChildren)
+      }}
+    >
+      <div className='system-2xs-medium-uppercase flex items-center px-3 pt-2 text-text-tertiary'>
+        {t('workflow.nodes.agent.strategy.label')}
+      </div>
+      <div className='flex items-center pb-1.5 pl-3 pr-2 pt-1'>
+        {
+          agentStrategy && (
+            <div className='system-xs-medium grow text-text-secondary'>
+              {agentStrategy}
+            </div>
+          )
+        }
+        <div
+          className='system-xs-regular-uppercase flex shrink-0 cursor-pointer items-center px-[1px] text-text-tertiary'
+        >
+          {t('runLog.detail')}
+          <RiArrowRightLine className='ml-0.5 h-3.5 w-3.5' />
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default AgentLogTrigger
diff --git a/app/components/workflow/run/agent-log/agent-result-panel.tsx b/app/components/workflow/run/agent-log/agent-result-panel.tsx
new file mode 100644
index 0000000..c2fbac7
--- /dev/null
+++ b/app/components/workflow/run/agent-log/agent-result-panel.tsx
@@ -0,0 +1,60 @@
+import { RiAlertFill } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import AgentLogItem from './agent-log-item'
+import AgentLogNav from './agent-log-nav'
+import type { AgentLogItemWithChildren } from '@/types/workflow'
+
+type AgentResultPanelProps = {
+  agentOrToolLogItemStack: AgentLogItemWithChildren[]
+  agentOrToolLogListMap: Record<string, AgentLogItemWithChildren[]>
+  onShowAgentOrToolLog: (detail?: AgentLogItemWithChildren) => void
+}
+const AgentResultPanel = ({
+  agentOrToolLogItemStack,
+  agentOrToolLogListMap,
+  onShowAgentOrToolLog,
+}: AgentResultPanelProps) => {
+  const { t } = useTranslation()
+  const top = agentOrToolLogItemStack[agentOrToolLogItemStack.length - 1]
+  const list = agentOrToolLogListMap[top.id]
+
+  return (
+    <div className='overflow-y-auto bg-background-section'>
+      <AgentLogNav
+        agentOrToolLogItemStack={agentOrToolLogItemStack}
+        onShowAgentOrToolLog={onShowAgentOrToolLog}
+      />
+      {
+        <div className='space-y-1 p-2'>
+          {
+            list.map(item => (
+              <AgentLogItem
+                key={item.id}
+                item={item}
+                onShowAgentOrToolLog={onShowAgentOrToolLog}
+              />
+            ))
+          }
+        </div>
+      }
+      {
+        top.hasCircle && (
+          <div className='mt-1 flex items-center rounded-xl border border-components-panel-border bg-components-panel-bg-blur px-3 pr-2 shadow-md'>
+            <div
+              className='absolute inset-0 rounded-xl opacity-[0.4]'
+              style={{
+                background: 'linear-gradient(92deg, rgba(247, 144, 9, 0.25) 0%, rgba(255, 255, 255, 0.00) 100%)',
+              }}
+            ></div>
+            <RiAlertFill className='mr-1.5 h-4 w-4 text-text-warning-secondary' />
+            <div className='system-xs-medium text-text-primary'>
+              {t('runLog.circularInvocationTip')}
+            </div>
+          </div>
+        )
+      }
+    </div>
+  )
+}
+
+export default AgentResultPanel
diff --git a/app/components/workflow/run/agent-log/index.tsx b/app/components/workflow/run/agent-log/index.tsx
new file mode 100644
index 0000000..a39f541
--- /dev/null
+++ b/app/components/workflow/run/agent-log/index.tsx
@@ -0,0 +1,2 @@
+export { default as AgentLogTrigger } from './agent-log-trigger'
+export { default as AgentResultPanel } from './agent-result-panel'
diff --git a/app/components/workflow/run/assets/bg-line-error.svg b/app/components/workflow/run/assets/bg-line-error.svg
new file mode 100644
index 0000000..bf29aa0
--- /dev/null
+++ b/app/components/workflow/run/assets/bg-line-error.svg
@@ -0,0 +1,3 @@
+<svg width="368" height="52" viewBox="0 0 368 52" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.5" d="M0 0H368M0 2H368M0 4H368M0 6H368M0 8H368M0 10H368M0 12H368M0 14H368M0 16H368M0 18H368M0 20H368M0 22H368M0 24H368M0 26H368M0 28H368M0 30H368M0 32H368M0 34H368M0 36H368M0 38H368M0 40H368M0 42H368M0 44H368M0 46H368M0 48H368M0 50H368M0 52H368M0 54H368M0 56H368M0 58H368M0 60H368M0 62H368M0 64H368M0 66H368M0 68H368M0 70H368M0 72H368M0 74H368M0 76H368M0 78H368M0 80H368M0 82H368M0 84H368M0 86H368M0 88H368M0 90H368M0 92H368M0 94H368M0 96H368M0 98H368M0 100H368M0 102H368M0 104H368M0 106H368M0 108H368M0 110H368M0 112H368M0 114H368M0 116H368M0 118H368M0 120H368M0 122H368M0 124H368M0 126H368M0 128H368M0 130H368M0 132H368M0 134H368M0 136H368M0 138H368M0 140H368M0 142H368M0 144H368M0 146H368M0 148H368M0 150H368M0 152H368M0 154H368M0 156H368M0 158H368M0 160H368M0 162H368M0 164H368M0 166H368M0 168H368M0 170H368M0 172H368M0 174H368M0 176H368M0 178H368M0 180H368M0 182H368M0 184H368M0 186H368M0 188H368M0 190H368M0 192H368M0 194H368M0 196H368M0 198H368M0 200H368M0 202H368M0 204H368M0 206H368M0 208H368M0 210H368M0 212H368M0 214H368M0 216H368M0 218H368M0 220H368M0 222H368M0 224H368M0 226H368" stroke="#F04438" stroke-opacity="0.3" stroke-width="0.5"/>
+</svg>
diff --git a/app/components/workflow/run/assets/bg-line-running.svg b/app/components/workflow/run/assets/bg-line-running.svg
new file mode 100644
index 0000000..c66ba70
--- /dev/null
+++ b/app/components/workflow/run/assets/bg-line-running.svg
@@ -0,0 +1,3 @@
+<svg width="368" height="52" viewBox="0 0 368 52" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.5" d="M0 0.5H368M0 2.5H368M0 4.5H368M0 6.5H368M0 8.5H368M0 10.5H368M0 12.5H368M0 14.5H368M0 16.5H368M0 18.5H368M0 20.5H368M0 22.5H368M0 24.5H368M0 26.5H368M0 28.5H368M0 30.5H368M0 32.5H368M0 34.5H368M0 36.5H368M0 38.5H368M0 40.5H368M0 42.5H368M0 44.5H368M0 46.5H368M0 48.5H368M0 50.5H368M0 52.5H368M0 54.5H368M0 56.5H368M0 58.5H368M0 60.5H368M0 62.5H368M0 64.5H368M0 66.5H368M0 68.5H368M0 70.5H368M0 72.5H368M0 74.5H368M0 76.5H368M0 78.5H368M0 80.5H368M0 82.5H368M0 84.5H368M0 86.5H368M0 88.5H368M0 90.5H368M0 92.5H368M0 94.5H368M0 96.5H368M0 98.5H368M0 100.5H368M0 102.5H368M0 104.5H368M0 106.5H368M0 108.5H368M0 110.5H368M0 112.5H368M0 114.5H368M0 116.5H368M0 118.5H368M0 120.5H368M0 122.5H368M0 124.5H368M0 126.5H368M0 128.5H368M0 130.5H368M0 132.5H368M0 134.5H368M0 136.5H368M0 138.5H368M0 140.5H368M0 142.5H368M0 144.5H368M0 146.5H368M0 148.5H368M0 150.5H368M0 152.5H368M0 154.5H368M0 156.5H368M0 158.5H368M0 160.5H368M0 162.5H368M0 164.5H368M0 166.5H368M0 168.5H368M0 170.5H368M0 172.5H368M0 174.5H368M0 176.5H368M0 178.5H368M0 180.5H368M0 182.5H368M0 184.5H368M0 186.5H368M0 188.5H368M0 190.5H368M0 192.5H368M0 194.5H368M0 196.5H368M0 198.5H368M0 200.5H368M0 202.5H368M0 204.5H368M0 206.5H368M0 208.5H368M0 210.5H368M0 212.5H368M0 214.5H368M0 216.5H368M0 218.5H368M0 220.5H368M0 222.5H368M0 224.5H368M0 226.5H368" stroke="#0BA5EC" stroke-opacity="0.3" stroke-width="0.5"/>
+</svg>
diff --git a/app/components/workflow/run/assets/bg-line-success.svg b/app/components/workflow/run/assets/bg-line-success.svg
new file mode 100644
index 0000000..3720a26
--- /dev/null
+++ b/app/components/workflow/run/assets/bg-line-success.svg
@@ -0,0 +1,3 @@
+<svg width="368" height="52" viewBox="0 0 368 52" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.5" d="M0 0H368M0 2H368M0 4H368M0 6H368M0 8H368M0 10H368M0 12H368M0 14H368M0 16H368M0 18H368M0 20H368M0 22H368M0 24H368M0 26H368M0 28H368M0 30H368M0 32H368M0 34H368M0 36H368M0 38H368M0 40H368M0 42H368M0 44H368M0 46H368M0 48H368M0 50H368M0 52H368M0 54H368M0 56H368M0 58H368M0 60H368M0 62H368M0 64H368M0 66H368M0 68H368M0 70H368M0 72H368M0 74H368M0 76H368M0 78H368M0 80H368M0 82H368M0 84H368M0 86H368M0 88H368M0 90H368M0 92H368M0 94H368M0 96H368M0 98H368M0 100H368M0 102H368M0 104H368M0 106H368M0 108H368M0 110H368M0 112H368M0 114H368M0 116H368M0 118H368M0 120H368M0 122H368M0 124H368M0 126H368M0 128H368M0 130H368M0 132H368M0 134H368M0 136H368M0 138H368M0 140H368M0 142H368M0 144H368M0 146H368M0 148H368M0 150H368M0 152H368M0 154H368M0 156H368M0 158H368M0 160H368M0 162H368M0 164H368M0 166H368M0 168H368M0 170H368M0 172H368M0 174H368M0 176H368M0 178H368M0 180H368M0 182H368M0 184H368M0 186H368M0 188H368M0 190H368M0 192H368M0 194H368M0 196H368M0 198H368M0 200H368M0 202H368M0 204H368M0 206H368M0 208H368M0 210H368M0 212H368M0 214H368M0 216H368M0 218H368M0 220H368M0 222H368M0 224H368M0 226H368" stroke="#17B26A" stroke-opacity="0.3" stroke-width="0.5"/>
+</svg>
diff --git a/app/components/workflow/run/assets/bg-line-warning.svg b/app/components/workflow/run/assets/bg-line-warning.svg
new file mode 100644
index 0000000..21aec57
--- /dev/null
+++ b/app/components/workflow/run/assets/bg-line-warning.svg
@@ -0,0 +1,3 @@
+<svg width="368" height="52" viewBox="0 0 368 52" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.5" d="M0 0.5H368M0 2.5H368M0 4.5H368M0 6.5H368M0 8.5H368M0 10.5H368M0 12.5H368M0 14.5H368M0 16.5H368M0 18.5H368M0 20.5H368M0 22.5H368M0 24.5H368M0 26.5H368M0 28.5H368M0 30.5H368M0 32.5H368M0 34.5H368M0 36.5H368M0 38.5H368M0 40.5H368M0 42.5H368M0 44.5H368M0 46.5H368M0 48.5H368M0 50.5H368M0 52.5H368M0 54.5H368M0 56.5H368M0 58.5H368M0 60.5H368M0 62.5H368M0 64.5H368M0 66.5H368M0 68.5H368M0 70.5H368M0 72.5H368M0 74.5H368M0 76.5H368M0 78.5H368M0 80.5H368M0 82.5H368M0 84.5H368M0 86.5H368M0 88.5H368M0 90.5H368M0 92.5H368M0 94.5H368M0 96.5H368M0 98.5H368M0 100.5H368M0 102.5H368M0 104.5H368M0 106.5H368M0 108.5H368M0 110.5H368M0 112.5H368M0 114.5H368M0 116.5H368M0 118.5H368M0 120.5H368M0 122.5H368M0 124.5H368M0 126.5H368M0 128.5H368M0 130.5H368M0 132.5H368M0 134.5H368M0 136.5H368M0 138.5H368M0 140.5H368M0 142.5H368M0 144.5H368M0 146.5H368M0 148.5H368M0 150.5H368M0 152.5H368M0 154.5H368M0 156.5H368M0 158.5H368M0 160.5H368M0 162.5H368M0 164.5H368M0 166.5H368M0 168.5H368M0 170.5H368M0 172.5H368M0 174.5H368M0 176.5H368M0 178.5H368M0 180.5H368M0 182.5H368M0 184.5H368M0 186.5H368M0 188.5H368M0 190.5H368M0 192.5H368M0 194.5H368M0 196.5H368M0 198.5H368M0 200.5H368M0 202.5H368M0 204.5H368M0 206.5H368M0 208.5H368M0 210.5H368M0 212.5H368M0 214.5H368M0 216.5H368M0 218.5H368M0 220.5H368M0 222.5H368M0 224.5H368M0 226.5H368" stroke="#F79009" stroke-opacity="0.3" stroke-width="0.5"/>
+</svg>
diff --git a/app/components/workflow/run/assets/highlight-dark.svg b/app/components/workflow/run/assets/highlight-dark.svg
new file mode 100644
index 0000000..472da3d
--- /dev/null
+++ b/app/components/workflow/run/assets/highlight-dark.svg
@@ -0,0 +1,9 @@
+<svg width="237" height="50" viewBox="0 0 237 50" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.5" d="M0 8C0 3.58172 3.58172 0 8 0H237L215.033 50H8C3.58172 50 0 46.4183 0 42V8Z" fill="url(#paint0_linear_3552_29170)"/>
+<defs>
+<linearGradient id="paint0_linear_3552_29170" x1="-4.89158e-08" y1="4.62963" x2="168.013" y2="23.1752" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.03"/>
+<stop offset="1" stop-color="white" stop-opacity="0.05"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/components/workflow/run/assets/highlight.svg b/app/components/workflow/run/assets/highlight.svg
new file mode 100644
index 0000000..720ae25
--- /dev/null
+++ b/app/components/workflow/run/assets/highlight.svg
@@ -0,0 +1,9 @@
+<svg width="237" height="50" viewBox="0 0 237 50" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.5" d="M0 8C0 3.58172 3.58172 0 8 0H237L215.033 50H8C3.58172 50 0 46.4183 0 42V8Z" fill="url(#paint0_linear_3552_29170)"/>
+<defs>
+<linearGradient id="paint0_linear_3552_29170" x1="-4.89158e-08" y1="4.62963" x2="168.013" y2="23.1752" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0.12"/>
+<stop offset="1" stop-color="white" stop-opacity="0.5"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/components/workflow/run/hooks.ts b/app/components/workflow/run/hooks.ts
new file mode 100644
index 0000000..1835eb5
--- /dev/null
+++ b/app/components/workflow/run/hooks.ts
@@ -0,0 +1,115 @@
+import {
+  useCallback,
+  useRef,
+  useState,
+} from 'react'
+import { useBoolean } from 'ahooks'
+import type {
+  AgentLogItemWithChildren,
+  IterationDurationMap,
+  LoopDurationMap,
+  LoopVariableMap,
+  NodeTracing,
+} from '@/types/workflow'
+
+export const useLogs = () => {
+  const [showRetryDetail, {
+    setTrue: setShowRetryDetailTrue,
+    setFalse: setShowRetryDetailFalse,
+  }] = useBoolean(false)
+  const [retryResultList, setRetryResultList] = useState<NodeTracing[]>([])
+  const handleShowRetryResultList = useCallback((detail: NodeTracing[]) => {
+    setShowRetryDetailTrue()
+    setRetryResultList(detail)
+  }, [setShowRetryDetailTrue, setRetryResultList])
+
+  const [showIteratingDetail, {
+    setTrue: setShowIteratingDetailTrue,
+    setFalse: setShowIteratingDetailFalse,
+  }] = useBoolean(false)
+  const [iterationResultList, setIterationResultList] = useState<NodeTracing[][]>([])
+  const [iterationResultDurationMap, setIterationResultDurationMap] = useState<IterationDurationMap>({})
+  const handleShowIterationResultList = useCallback((detail: NodeTracing[][], iterDurationMap: IterationDurationMap) => {
+    setShowIteratingDetailTrue()
+    setIterationResultList(detail)
+    setIterationResultDurationMap(iterDurationMap)
+  }, [setShowIteratingDetailTrue, setIterationResultList, setIterationResultDurationMap])
+
+  const [showLoopingDetail, {
+    setTrue: setShowLoopingDetailTrue,
+    setFalse: setShowLoopingDetailFalse,
+  }] = useBoolean(false)
+  const [loopResultList, setLoopResultList] = useState<NodeTracing[][]>([])
+  const [loopResultDurationMap, setLoopResultDurationMap] = useState<LoopDurationMap>({})
+  const [loopResultVariableMap, setLoopResultVariableMap] = useState<Record<string, any>>({})
+  const handleShowLoopResultList = useCallback((detail: NodeTracing[][], loopDurationMap: LoopDurationMap, loopVariableMap: LoopVariableMap) => {
+    setShowLoopingDetailTrue()
+    setLoopResultList(detail)
+    setLoopResultDurationMap(loopDurationMap)
+    setLoopResultVariableMap(loopVariableMap)
+  }, [setShowLoopingDetailTrue, setLoopResultList, setLoopResultDurationMap])
+
+  const [agentOrToolLogItemStack, setAgentOrToolLogItemStack] = useState<AgentLogItemWithChildren[]>([])
+  const agentOrToolLogItemStackRef = useRef(agentOrToolLogItemStack)
+  const [agentOrToolLogListMap, setAgentOrToolLogListMap] = useState<Record<string, AgentLogItemWithChildren[]>>({})
+  const agentOrToolLogListMapRef = useRef(agentOrToolLogListMap)
+  const handleShowAgentOrToolLog = useCallback((detail?: AgentLogItemWithChildren) => {
+    if (!detail) {
+      setAgentOrToolLogItemStack([])
+      agentOrToolLogItemStackRef.current = []
+      return
+    }
+    const { id, children } = detail
+    let currentAgentOrToolLogItemStack = agentOrToolLogItemStackRef.current.slice()
+    const index = currentAgentOrToolLogItemStack.findIndex(logItem => logItem.id === id)
+
+    if (index > -1)
+      currentAgentOrToolLogItemStack = currentAgentOrToolLogItemStack.slice(0, index + 1)
+    else
+      currentAgentOrToolLogItemStack = [...currentAgentOrToolLogItemStack.slice(), detail]
+
+    setAgentOrToolLogItemStack(currentAgentOrToolLogItemStack)
+    agentOrToolLogItemStackRef.current = currentAgentOrToolLogItemStack
+
+    if (children) {
+      setAgentOrToolLogListMap({
+        ...agentOrToolLogListMapRef.current,
+        [id]: children,
+      })
+    }
+  }, [setAgentOrToolLogItemStack, setAgentOrToolLogListMap])
+
+  return {
+    showSpecialResultPanel: showRetryDetail || showIteratingDetail || showLoopingDetail || !!agentOrToolLogItemStack.length,
+    showRetryDetail,
+    setShowRetryDetailTrue,
+    setShowRetryDetailFalse,
+    retryResultList,
+    setRetryResultList,
+    handleShowRetryResultList,
+
+    showIteratingDetail,
+    setShowIteratingDetailTrue,
+    setShowIteratingDetailFalse,
+    iterationResultList,
+    setIterationResultList,
+    iterationResultDurationMap,
+    setIterationResultDurationMap,
+    handleShowIterationResultList,
+
+    showLoopingDetail,
+    setShowLoopingDetailTrue,
+    setShowLoopingDetailFalse,
+    loopResultList,
+    setLoopResultList,
+    loopResultDurationMap,
+    setLoopResultDurationMap,
+    loopResultVariableMap,
+    setLoopResultVariableMap,
+    handleShowLoopResultList,
+
+    agentOrToolLogItemStack,
+    agentOrToolLogListMap,
+    handleShowAgentOrToolLog,
+  }
+}
diff --git a/app/components/workflow/run/index.tsx b/app/components/workflow/run/index.tsx
new file mode 100644
index 0000000..8b99603
--- /dev/null
+++ b/app/components/workflow/run/index.tsx
@@ -0,0 +1,172 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import OutputPanel from './output-panel'
+import ResultPanel from './result-panel'
+import TracingPanel from './tracing-panel'
+import cn from '@/utils/classnames'
+import { ToastContext } from '@/app/components/base/toast'
+import Loading from '@/app/components/base/loading'
+import { fetchRunDetail, fetchTracingList } from '@/service/log'
+import type { NodeTracing } from '@/types/workflow'
+import type { WorkflowRunDetailResponse } from '@/models/log'
+import { useStore as useAppStore } from '@/app/components/app/store'
+export type RunProps = {
+  hideResult?: boolean
+  activeTab?: 'RESULT' | 'DETAIL' | 'TRACING'
+  runID: string
+  getResultCallback?: (result: WorkflowRunDetailResponse) => void
+}
+
+const RunPanel: FC<RunProps> = ({ hideResult, activeTab = 'RESULT', runID, getResultCallback }) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const [currentTab, setCurrentTab] = useState<string>(activeTab)
+  const appDetail = useAppStore(state => state.appDetail)
+  const [loading, setLoading] = useState<boolean>(true)
+  const [runDetail, setRunDetail] = useState<WorkflowRunDetailResponse>()
+  const [list, setList] = useState<NodeTracing[]>([])
+
+  const executor = useMemo(() => {
+    if (runDetail?.created_by_role === 'account')
+      return runDetail.created_by_account?.name || ''
+    if (runDetail?.created_by_role === 'end_user')
+      return runDetail.created_by_end_user?.session_id || ''
+    return 'N/A'
+  }, [runDetail])
+
+  const getResult = useCallback(async (appID: string, runID: string) => {
+    try {
+      const res = await fetchRunDetail({
+        appID,
+        runID,
+      })
+      setRunDetail(res)
+      if (getResultCallback)
+        getResultCallback(res)
+    }
+    catch (err) {
+      notify({
+        type: 'error',
+        message: `${err}`,
+      })
+    }
+  }, [notify, getResultCallback])
+
+  const getTracingList = useCallback(async (appID: string, runID: string) => {
+    try {
+      const { data: nodeList } = await fetchTracingList({
+        url: `/apps/${appID}/workflow-runs/${runID}/node-executions`,
+      })
+      setList(nodeList)
+    }
+    catch (err) {
+      notify({
+        type: 'error',
+        message: `${err}`,
+      })
+    }
+  }, [notify])
+
+  const getData = async (appID: string, runID: string) => {
+    setLoading(true)
+    await getResult(appID, runID)
+    await getTracingList(appID, runID)
+    setLoading(false)
+  }
+
+  const switchTab = async (tab: string) => {
+    setCurrentTab(tab)
+    if (tab === 'RESULT')
+      appDetail?.id && await getResult(appDetail.id, runID)
+    appDetail?.id && await getTracingList(appDetail.id, runID)
+  }
+
+  useEffect(() => {
+    // fetch data
+    if (appDetail && runID)
+      getData(appDetail.id, runID)
+  }, [appDetail, runID])
+
+  const [height, setHeight] = useState(0)
+  const ref = useRef<HTMLDivElement>(null)
+
+  const adjustResultHeight = () => {
+    if (ref.current)
+      setHeight(ref.current?.clientHeight - 16 - 16 - 2 - 1)
+  }
+
+  useEffect(() => {
+    adjustResultHeight()
+  }, [loading])
+
+  return (
+    <div className='relative flex grow flex-col'>
+      {/* tab */}
+      <div className='flex shrink-0 items-center border-b-[0.5px] border-divider-subtle px-4'>
+        {!hideResult && (
+          <div
+            className={cn(
+              'system-sm-semibold-uppercase mr-6 cursor-pointer border-b-2 border-transparent py-3 text-text-tertiary',
+              currentTab === 'RESULT' && '!border-util-colors-blue-brand-blue-brand-600 text-text-primary',
+            )}
+            onClick={() => switchTab('RESULT')}
+          >{t('runLog.result')}</div>
+        )}
+        <div
+          className={cn(
+            'system-sm-semibold-uppercase mr-6 cursor-pointer border-b-2 border-transparent py-3 text-text-tertiary',
+            currentTab === 'DETAIL' && '!border-util-colors-blue-brand-blue-brand-600 text-text-primary',
+          )}
+          onClick={() => switchTab('DETAIL')}
+        >{t('runLog.detail')}</div>
+        <div
+          className={cn(
+            'system-sm-semibold-uppercase mr-6 cursor-pointer border-b-2 border-transparent py-3 text-text-tertiary',
+            currentTab === 'TRACING' && '!border-util-colors-blue-brand-blue-brand-600 text-text-primary',
+          )}
+          onClick={() => switchTab('TRACING')}
+        >{t('runLog.tracing')}</div>
+      </div>
+      {/* panel detail */}
+      <div ref={ref} className={cn('relative h-0 grow overflow-y-auto rounded-b-2xl bg-components-panel-bg')}>
+        {loading && (
+          <div className='flex h-full items-center justify-center bg-components-panel-bg'>
+            <Loading />
+          </div>
+        )}
+        {!loading && currentTab === 'RESULT' && runDetail && (
+          <OutputPanel
+            outputs={runDetail.outputs}
+            error={runDetail.error}
+            height={height}
+          />
+        )}
+        {!loading && currentTab === 'DETAIL' && runDetail && (
+          <ResultPanel
+            inputs={runDetail.inputs}
+            outputs={runDetail.outputs}
+            status={runDetail.status}
+            error={runDetail.error}
+            elapsed_time={runDetail.elapsed_time}
+            total_tokens={runDetail.total_tokens}
+            created_at={runDetail.created_at}
+            created_by={executor}
+            steps={runDetail.total_steps}
+            exceptionCounts={runDetail.exceptions_count}
+          />
+        )}
+        {!loading && currentTab === 'TRACING' && (
+          <TracingPanel
+            className='bg-background-section-burn'
+            list={list}
+          />
+        )}
+      </div>
+    </div>
+  )
+}
+
+export default RunPanel
diff --git a/app/components/workflow/run/iteration-log/index.tsx b/app/components/workflow/run/iteration-log/index.tsx
new file mode 100644
index 0000000..5cbe70f
--- /dev/null
+++ b/app/components/workflow/run/iteration-log/index.tsx
@@ -0,0 +1,2 @@
+export { default as IterationLogTrigger } from './iteration-log-trigger'
+export { default as IterationResultPanel } from './iteration-result-panel'
diff --git a/app/components/workflow/run/iteration-log/iteration-log-trigger.tsx b/app/components/workflow/run/iteration-log/iteration-log-trigger.tsx
new file mode 100644
index 0000000..91bcaf9
--- /dev/null
+++ b/app/components/workflow/run/iteration-log/iteration-log-trigger.tsx
@@ -0,0 +1,103 @@
+import { useTranslation } from 'react-i18next'
+import { RiArrowRightSLine } from '@remixicon/react'
+import Button from '@/app/components/base/button'
+import type {
+  IterationDurationMap,
+  NodeTracing,
+} from '@/types/workflow'
+import { Iteration } from '@/app/components/base/icons/src/vender/workflow'
+
+type IterationLogTriggerProps = {
+  nodeInfo: NodeTracing
+  allExecutions?: NodeTracing[]
+  onShowIterationResultList: (iterationResultList: NodeTracing[][], iterationResultDurationMap: IterationDurationMap) => void
+}
+const IterationLogTrigger = ({
+  nodeInfo,
+  allExecutions,
+  onShowIterationResultList,
+}: IterationLogTriggerProps) => {
+  const { t } = useTranslation()
+
+  const filterNodesForInstance = (key: string): NodeTracing[] => {
+    if (!allExecutions) return []
+
+    const parallelNodes = allExecutions.filter(exec =>
+      exec.execution_metadata?.parallel_mode_run_id === key,
+    )
+    if (parallelNodes.length > 0)
+      return parallelNodes
+
+    const serialIndex = parseInt(key, 10)
+    if (!isNaN(serialIndex)) {
+      const serialNodes = allExecutions.filter(exec =>
+        exec.execution_metadata?.iteration_id === nodeInfo.node_id
+        && exec.execution_metadata?.iteration_index === serialIndex,
+      )
+      if (serialNodes.length > 0)
+        return serialNodes
+    }
+
+    return []
+  }
+
+  const handleOnShowIterationDetail = (e: React.MouseEvent<HTMLButtonElement>) => {
+    e.stopPropagation()
+    e.nativeEvent.stopImmediatePropagation()
+
+    const iterationNodeMeta = nodeInfo.execution_metadata
+    const iterDurationMap = nodeInfo?.iterDurationMap || iterationNodeMeta?.iteration_duration_map || {}
+
+    let structuredList: NodeTracing[][] = []
+
+    if (iterationNodeMeta?.iteration_duration_map) {
+      const instanceKeys = Object.keys(iterationNodeMeta.iteration_duration_map)
+      structuredList = instanceKeys
+        .map(key => filterNodesForInstance(key))
+        .filter(branchNodes => branchNodes.length > 0)
+    }
+    else if (nodeInfo.details?.length) {
+      structuredList = nodeInfo.details
+    }
+
+    onShowIterationResultList(structuredList, iterDurationMap)
+  }
+
+  let displayIterationCount = 0
+  const iterMap = nodeInfo.execution_metadata?.iteration_duration_map
+  if (iterMap)
+    displayIterationCount = Object.keys(iterMap).length
+  else if (nodeInfo.details?.length)
+    displayIterationCount = nodeInfo.details.length
+  else if (nodeInfo.metadata?.iterator_length)
+    displayIterationCount = nodeInfo.metadata.iterator_length
+
+  const getErrorCount = (details: NodeTracing[][] | undefined) => {
+    if (!details || details.length === 0)
+      return 0
+    return details.reduce((acc, iteration) => {
+      if (iteration.some(item => item.status === 'failed'))
+        acc++
+      return acc
+    }, 0)
+  }
+  const errorCount = getErrorCount(nodeInfo.details)
+
+  return (
+    <Button
+      className='flex w-full cursor-pointer items-center gap-2 self-stretch rounded-lg border-none bg-components-button-tertiary-bg-hover px-3 py-2 hover:bg-components-button-tertiary-bg-hover'
+      onClick={handleOnShowIterationDetail}
+    >
+      <Iteration className='h-4 w-4 shrink-0 text-components-button-tertiary-text' />
+      <div className='system-sm-medium flex-1 text-left text-components-button-tertiary-text'>{t('workflow.nodes.iteration.iteration', { count: displayIterationCount })}{errorCount > 0 && (
+        <>
+          {t('workflow.nodes.iteration.comma')}
+          {t('workflow.nodes.iteration.error', { count: errorCount })}
+        </>
+      )}</div>
+      <RiArrowRightSLine className='h-4 w-4 shrink-0 text-components-button-tertiary-text' />
+    </Button>
+  )
+}
+
+export default IterationLogTrigger
diff --git a/app/components/workflow/run/iteration-log/iteration-result-panel.tsx b/app/components/workflow/run/iteration-log/iteration-result-panel.tsx
new file mode 100644
index 0000000..3d9ad87
--- /dev/null
+++ b/app/components/workflow/run/iteration-log/iteration-result-panel.tsx
@@ -0,0 +1,128 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowLeftLine,
+  RiArrowRightSLine,
+  RiErrorWarningLine,
+  RiLoader2Line,
+} from '@remixicon/react'
+import { NodeRunningStatus } from '@/app/components/workflow/types'
+import TracingPanel from '@/app/components/workflow/run/tracing-panel'
+import { Iteration } from '@/app/components/base/icons/src/vender/workflow'
+import cn from '@/utils/classnames'
+import type { IterationDurationMap, NodeTracing } from '@/types/workflow'
+const i18nPrefix = 'workflow.singleRun'
+
+type Props = {
+  list: NodeTracing[][]
+  onBack: () => void
+  iterDurationMap?: IterationDurationMap
+}
+
+const IterationResultPanel: FC<Props> = ({
+  list,
+  onBack,
+  iterDurationMap,
+}) => {
+  const { t } = useTranslation()
+  const [expandedIterations, setExpandedIterations] = useState<Record<number, boolean>>({})
+
+  const toggleIteration = useCallback((index: number) => {
+    setExpandedIterations(prev => ({
+      ...prev,
+      [index]: !prev[index],
+    }))
+  }, [])
+  const countIterDuration = (iteration: NodeTracing[], iterDurationMap: IterationDurationMap): string => {
+    const IterRunIndex = iteration[0]?.execution_metadata?.iteration_index as number
+    const iterRunId = iteration[0]?.execution_metadata?.parallel_mode_run_id
+    const iterItem = iterDurationMap[iterRunId || IterRunIndex]
+    const duration = iterItem
+    return `${(duration && duration > 0.01) ? duration.toFixed(2) : 0.01}s`
+  }
+  const iterationStatusShow = (index: number, iteration: NodeTracing[], iterDurationMap?: IterationDurationMap) => {
+    const hasFailed = iteration.some(item => item.status === NodeRunningStatus.Failed)
+    const isRunning = iteration.some(item => item.status === NodeRunningStatus.Running)
+    const hasDurationMap = iterDurationMap && Object.keys(iterDurationMap).length !== 0
+
+    if (hasFailed)
+      return <RiErrorWarningLine className='h-4 w-4 text-text-destructive' />
+
+    if (isRunning)
+      return <RiLoader2Line className='h-3.5 w-3.5 animate-spin text-primary-600' />
+
+    return (
+      <>
+        {hasDurationMap && (
+          <div className='system-xs-regular text-text-tertiary'>
+            {countIterDuration(iteration, iterDurationMap)}
+          </div>
+        )}
+        <RiArrowRightSLine
+          className={cn(
+            'h-4 w-4 shrink-0 text-text-tertiary transition-transform duration-200',
+            expandedIterations[index] && 'rotate-90',
+          )}
+        />
+      </>
+    )
+  }
+
+  return (
+    <div className='bg-components-panel-bg'>
+      <div
+        className='flex h-8 cursor-pointer items-center border-b-[0.5px] border-b-divider-regular px-4 text-text-accent-secondary'
+        onClick={(e) => {
+          e.stopPropagation()
+          e.nativeEvent.stopImmediatePropagation()
+          onBack()
+        }}
+      >
+        <RiArrowLeftLine className='mr-1 h-4 w-4' />
+        <div className='system-sm-medium'>{t(`${i18nPrefix}.back`)}</div>
+      </div>
+      {/* List */}
+      <div className='bg-components-panel-bg p-2'>
+        {list.map((iteration, index) => (
+          <div key={index} className={cn('mb-1 overflow-hidden rounded-xl border-none bg-background-section-burn')}>
+            <div
+              className={cn(
+                'flex w-full cursor-pointer items-center justify-between px-3',
+                expandedIterations[index] ? 'pb-2 pt-3' : 'py-3',
+                'rounded-xl text-left',
+              )}
+              onClick={() => toggleIteration(index)}
+            >
+              <div className={cn('flex grow items-center gap-2')}>
+                <div className='flex h-4 w-4 shrink-0 items-center justify-center rounded-[5px] border-divider-subtle bg-util-colors-cyan-cyan-500'>
+                  <Iteration className='h-3 w-3 text-text-primary-on-surface' />
+                </div>
+                <span className='system-sm-semibold-uppercase grow text-text-primary'>
+                  {t(`${i18nPrefix}.iteration`)} {index + 1}
+                </span>
+                {iterationStatusShow(index, iteration, iterDurationMap)}
+              </div>
+            </div>
+            {expandedIterations[index] && <div
+              className="h-px grow bg-divider-subtle"
+            ></div>}
+            <div className={cn(
+              'transition-all duration-200',
+              expandedIterations[index]
+                ? 'opacity-100'
+                : 'max-h-0 overflow-hidden opacity-0',
+            )}>
+              <TracingPanel
+                list={iteration}
+                className='bg-background-section-burn'
+              />
+            </div>
+          </div>
+        ))}
+      </div>
+    </div>
+  )
+}
+export default React.memo(IterationResultPanel)
diff --git a/app/components/workflow/run/loop-log/index.tsx b/app/components/workflow/run/loop-log/index.tsx
new file mode 100644
index 0000000..b80a24d
--- /dev/null
+++ b/app/components/workflow/run/loop-log/index.tsx
@@ -0,0 +1,2 @@
+export { default as LoopLogTrigger } from './loop-log-trigger'
+export { default as LoopResultPanel } from './loop-result-panel'
diff --git a/app/components/workflow/run/loop-log/loop-log-trigger.tsx b/app/components/workflow/run/loop-log/loop-log-trigger.tsx
new file mode 100644
index 0000000..76619ff
--- /dev/null
+++ b/app/components/workflow/run/loop-log/loop-log-trigger.tsx
@@ -0,0 +1,109 @@
+import { useTranslation } from 'react-i18next'
+import { RiArrowRightSLine } from '@remixicon/react'
+import Button from '@/app/components/base/button'
+import type {
+  LoopDurationMap,
+  LoopVariableMap,
+  NodeTracing,
+} from '@/types/workflow'
+import { Loop } from '@/app/components/base/icons/src/vender/workflow'
+
+type LoopLogTriggerProps = {
+  nodeInfo: NodeTracing
+  allExecutions?: NodeTracing[]
+  onShowLoopResultList: (loopResultList: NodeTracing[][], loopResultDurationMap: LoopDurationMap, loopVariableMap: LoopVariableMap) => void
+}
+const LoopLogTrigger = ({
+  nodeInfo,
+  allExecutions,
+  onShowLoopResultList,
+}: LoopLogTriggerProps) => {
+  const { t } = useTranslation()
+
+  const filterNodesForInstance = (key: string): NodeTracing[] => {
+    if (!allExecutions) return []
+
+    const parallelNodes = allExecutions.filter(exec =>
+      exec.execution_metadata?.parallel_mode_run_id === key,
+    )
+    if (parallelNodes.length > 0)
+      return parallelNodes
+
+    const serialIndex = parseInt(key, 10)
+    if (!isNaN(serialIndex)) {
+      const serialNodes = allExecutions.filter(exec =>
+        exec.execution_metadata?.loop_id === nodeInfo.node_id
+        && exec.execution_metadata?.loop_index === serialIndex,
+      )
+      if (serialNodes.length > 0)
+        return serialNodes
+    }
+
+    return []
+  }
+
+  const handleOnShowLoopDetail = (e: React.MouseEvent<HTMLButtonElement>) => {
+    e.stopPropagation()
+    e.nativeEvent.stopImmediatePropagation()
+
+    const loopNodeMeta = nodeInfo.execution_metadata
+    const loopDurMap = nodeInfo?.loopDurationMap || loopNodeMeta?.loop_duration_map || {}
+    const loopVarMap = loopNodeMeta?.loop_variable_map || {}
+
+    let structuredList: NodeTracing[][] = []
+
+    if (loopNodeMeta?.loop_duration_map) {
+      const instanceKeys = Object.keys(loopNodeMeta.loop_duration_map)
+      structuredList = instanceKeys
+        .map(key => filterNodesForInstance(key))
+        .filter(branchNodes => branchNodes.length > 0)
+    }
+    else if (nodeInfo.details?.length) {
+      structuredList = nodeInfo.details
+    }
+
+    onShowLoopResultList(
+      structuredList,
+      loopDurMap,
+      loopVarMap,
+    )
+  }
+
+  let displayLoopCount = 0
+  const loopMap = nodeInfo.execution_metadata?.loop_duration_map
+  if (loopMap)
+    displayLoopCount = Object.keys(loopMap).length
+  else if (nodeInfo.details?.length)
+    displayLoopCount = nodeInfo.details.length
+  else if (nodeInfo.metadata?.loop_length)
+    displayLoopCount = nodeInfo.metadata.loop_length
+
+  const getErrorCount = (details: NodeTracing[][] | undefined) => {
+    if (!details || details.length === 0)
+      return 0
+    return details.reduce((acc, loop) => {
+      if (loop.some(item => item.status === 'failed'))
+        acc++
+      return acc
+    }, 0)
+  }
+  const errorCount = getErrorCount(nodeInfo.details)
+
+  return (
+    <Button
+      className='flex w-full cursor-pointer items-center gap-2 self-stretch rounded-lg border-none bg-components-button-tertiary-bg-hover px-3 py-2 hover:bg-components-button-tertiary-bg-hover'
+      onClick={handleOnShowLoopDetail}
+    >
+      <Loop className='h-4 w-4 shrink-0 text-components-button-tertiary-text' />
+      <div className='system-sm-medium flex-1 text-left text-components-button-tertiary-text'>{t('workflow.nodes.loop.loop', { count: displayLoopCount })}{errorCount > 0 && (
+        <>
+          {t('workflow.nodes.loop.comma')}
+          {t('workflow.nodes.loop.error', { count: errorCount })}
+        </>
+      )}</div>
+      <RiArrowRightSLine className='h-4 w-4 shrink-0 text-components-button-tertiary-text' />
+    </Button>
+  )
+}
+
+export default LoopLogTrigger
diff --git a/app/components/workflow/run/loop-log/loop-result-panel.tsx b/app/components/workflow/run/loop-log/loop-result-panel.tsx
new file mode 100644
index 0000000..1887153
--- /dev/null
+++ b/app/components/workflow/run/loop-log/loop-result-panel.tsx
@@ -0,0 +1,148 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowLeftLine,
+  RiArrowRightSLine,
+  RiErrorWarningLine,
+  RiLoader2Line,
+} from '@remixicon/react'
+import { NodeRunningStatus } from '@/app/components/workflow/types'
+import TracingPanel from '@/app/components/workflow/run/tracing-panel'
+import { Loop } from '@/app/components/base/icons/src/vender/workflow'
+import cn from '@/utils/classnames'
+import type { LoopDurationMap, LoopVariableMap, NodeTracing } from '@/types/workflow'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
+import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+const i18nPrefix = 'workflow.singleRun'
+
+type Props = {
+  list: NodeTracing[][]
+  onBack: () => void
+  loopDurationMap?: LoopDurationMap
+  loopVariableMap?: LoopVariableMap
+}
+
+const LoopResultPanel: FC<Props> = ({
+  list,
+  onBack,
+  loopDurationMap,
+  loopVariableMap,
+}) => {
+  const { t } = useTranslation()
+  const [expandedLoops, setExpandedLoops] = useState<Record<number, boolean>>({})
+
+  const toggleLoop = useCallback((index: number) => {
+    setExpandedLoops(prev => ({
+      ...prev,
+      [index]: !prev[index],
+    }))
+  }, [])
+
+  const countLoopDuration = (loop: NodeTracing[], loopDurationMap: LoopDurationMap): string => {
+    const loopRunIndex = loop[0]?.execution_metadata?.loop_index as number
+    const loopRunId = loop[0]?.execution_metadata?.parallel_mode_run_id
+    const loopItem = loopDurationMap[loopRunId || loopRunIndex]
+    const duration = loopItem
+    return `${(duration && duration > 0.01) ? duration.toFixed(2) : 0.01}s`
+  }
+
+  const loopStatusShow = (index: number, loop: NodeTracing[], loopDurationMap?: LoopDurationMap) => {
+    const hasFailed = loop.some(item => item.status === NodeRunningStatus.Failed)
+    const isRunning = loop.some(item => item.status === NodeRunningStatus.Running)
+    const hasDurationMap = loopDurationMap && Object.keys(loopDurationMap).length !== 0
+
+    if (hasFailed)
+      return <RiErrorWarningLine className='h-4 w-4 text-text-destructive' />
+
+    if (isRunning)
+      return <RiLoader2Line className='h-3.5 w-3.5 animate-spin text-primary-600' />
+
+    return (
+      <>
+        {hasDurationMap && (
+          <div className='system-xs-regular text-text-tertiary'>
+            {countLoopDuration(loop, loopDurationMap)}
+          </div>
+        )}
+        <RiArrowRightSLine
+          className={cn(
+            'h-4 w-4 shrink-0 text-text-tertiary transition-transform duration-200',
+            expandedLoops[index] && 'rotate-90',
+          )}
+        />
+      </>
+    )
+  }
+
+  return (
+    <div className='bg-components-panel-bg'>
+      <div
+        className='flex h-8 cursor-pointer items-center border-b-[0.5px] border-b-divider-regular px-4 text-text-accent-secondary'
+        onClick={(e) => {
+          e.stopPropagation()
+          e.nativeEvent.stopImmediatePropagation()
+          onBack()
+        }}
+      >
+        <RiArrowLeftLine className='mr-1 h-4 w-4' />
+        <div className='system-sm-medium'>{t(`${i18nPrefix}.back`)}</div>
+      </div>
+      {/* List */}
+      <div className='bg-components-panel-bg p-2'>
+        {list.map((loop, index) => (
+          <div key={index} className={cn('mb-1 overflow-hidden rounded-xl border-none bg-background-section-burn')}>
+            <div
+              className={cn(
+                'flex w-full cursor-pointer items-center justify-between px-3',
+                expandedLoops[index] ? 'pb-2 pt-3' : 'py-3',
+                'rounded-xl text-left',
+              )}
+              onClick={() => toggleLoop(index)}
+            >
+              <div className={cn('flex grow items-center gap-2')}>
+                <div className='flex h-4 w-4 shrink-0 items-center justify-center rounded-[5px] border-divider-subtle bg-util-colors-cyan-cyan-500'>
+                  <Loop className='h-3 w-3 text-text-primary-on-surface' />
+                </div>
+                <span className='system-sm-semibold-uppercase grow text-text-primary'>
+                  {t(`${i18nPrefix}.loop`)} {index + 1}
+                </span>
+                {loopStatusShow(index, loop, loopDurationMap)}
+              </div>
+            </div>
+            {expandedLoops[index] && <div
+              className="h-px grow bg-divider-subtle"
+            ></div>}
+            <div className={cn(
+              'transition-all duration-200',
+              expandedLoops[index]
+                ? 'opacity-100'
+                : 'max-h-0 overflow-hidden opacity-0',
+            )}>
+              {
+                loopVariableMap?.[index] && (
+                  <div className='p-2 pb-0'>
+                    <CodeEditor
+                      readOnly
+                      title={<div>{t('workflow.nodes.loop.loopVariables').toLocaleUpperCase()}</div>}
+                      language={CodeLanguage.json}
+                      height={112}
+                      value={loopVariableMap[index]}
+                      isJSONStringifyBeauty
+                    />
+                  </div>
+                )
+              }
+              <TracingPanel
+                list={loop}
+                className='bg-background-section-burn'
+              />
+            </div>
+          </div>
+        ))}
+      </div>
+    </div>
+  )
+}
+export default React.memo(LoopResultPanel)
diff --git a/app/components/workflow/run/loop-result-panel.tsx b/app/components/workflow/run/loop-result-panel.tsx
new file mode 100644
index 0000000..836bef8
--- /dev/null
+++ b/app/components/workflow/run/loop-result-panel.tsx
@@ -0,0 +1,124 @@
+'use client'
+import type { FC } from 'react'
+import React, { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowRightSLine,
+  RiCloseLine,
+} from '@remixicon/react'
+import { ArrowNarrowLeft } from '../../base/icons/src/vender/line/arrows'
+import TracingPanel from './tracing-panel'
+import { Loop } from '@/app/components/base/icons/src/vender/workflow'
+import cn from '@/utils/classnames'
+import type { NodeTracing } from '@/types/workflow'
+
+const i18nPrefix = 'workflow.singleRun'
+
+type Props = {
+  list: NodeTracing[][]
+  onHide: () => void
+  onBack: () => void
+  noWrap?: boolean
+}
+
+const LoopResultPanel: FC<Props> = ({
+  list,
+  onHide,
+  onBack,
+  noWrap,
+}) => {
+  const { t } = useTranslation()
+  const [expandedLoops, setExpandedLoops] = useState<Record<number, boolean>>([])
+
+  const toggleLoop = useCallback((index: number) => {
+    setExpandedLoops(prev => ({
+      ...prev,
+      [index]: !prev[index],
+    }))
+  }, [])
+
+  const main = (
+    <>
+      <div className={cn(!noWrap && 'shrink-0 ', 'px-4 pt-3')}>
+        <div className='flex h-8 shrink-0 items-center justify-between'>
+          <div className='system-xl-semibold truncate text-text-primary'>
+            {t(`${i18nPrefix}.testRunLoop`)}
+          </div>
+          <div className='ml-2 shrink-0 cursor-pointer p-1' onClick={onHide}>
+            <RiCloseLine className='h-4 w-4 text-text-tertiary' />
+          </div>
+        </div>
+        <div className='flex cursor-pointer items-center space-x-1 py-2 text-text-accent-secondary' onClick={onBack}>
+          <ArrowNarrowLeft className='h-4 w-4' />
+          <div className='system-sm-medium'>{t(`${i18nPrefix}.back`)}</div>
+        </div>
+      </div>
+      {/* List */}
+      <div className={cn(!noWrap ? 'grow overflow-auto' : 'max-h-full', 'bg-components-panel-bg p-2')}>
+        {list.map((loop, index) => (
+          <div key={index} className={cn('mb-1 overflow-hidden rounded-xl border-none bg-background-section-burn')}>
+            <div
+              className={cn(
+                'flex w-full cursor-pointer items-center justify-between px-3',
+                expandedLoops[index] ? 'pb-2 pt-3' : 'py-3',
+                'rounded-xl text-left',
+              )}
+              onClick={() => toggleLoop(index)}
+            >
+              <div className={cn('flex grow items-center gap-2')}>
+                <div className='flex h-4 w-4 shrink-0 items-center justify-center rounded-[5px] border-divider-subtle bg-util-colors-cyan-cyan-500'>
+                  <Loop className='h-3 w-3 text-text-primary-on-surface' />
+                </div>
+                <span className='system-sm-semibold-uppercase grow text-text-primary'>
+                  {t(`${i18nPrefix}.loop`)} {index + 1}
+                </span>
+                <RiArrowRightSLine className={cn(
+                  'h-4 w-4 shrink-0 text-text-tertiary transition-transform duration-200',
+                  expandedLoops[index] && 'rotate-90',
+                )} />
+              </div>
+            </div>
+            {expandedLoops[index] && <div
+              className="h-px grow bg-divider-subtle"
+            ></div>}
+            <div className={cn(
+              'transition-all duration-200',
+              expandedLoops[index]
+                ? 'opacity-100'
+                : 'max-h-0 overflow-hidden opacity-0',
+            )}>
+              <TracingPanel
+                list={loop}
+                className='bg-background-section-burn'
+              />
+
+            </div>
+          </div>
+        ))}
+      </div>
+    </>
+  )
+  const handleNotBubble = useCallback((e: React.MouseEvent) => {
+    // if not do this, it will trigger the message log modal disappear(useClickAway)
+    e.stopPropagation()
+    e.nativeEvent.stopImmediatePropagation()
+  }, [])
+
+  if (noWrap)
+    return main
+
+  return (
+    <div
+      className='absolute inset-0 z-10 rounded-2xl pt-10'
+      style={{
+        backgroundColor: 'rgba(16, 24, 40, 0.20)',
+      }}
+      onClick={handleNotBubble}
+    >
+      <div className='flex h-full flex-col rounded-2xl bg-components-panel-bg'>
+        {main}
+      </div>
+    </div >
+  )
+}
+export default React.memo(LoopResultPanel)
diff --git a/app/components/workflow/run/meta.tsx b/app/components/workflow/run/meta.tsx
new file mode 100644
index 0000000..13c35a4
--- /dev/null
+++ b/app/components/workflow/run/meta.tsx
@@ -0,0 +1,117 @@
+'use client'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import useTimestamp from '@/hooks/use-timestamp'
+
+type Props = {
+  status: string
+  executor?: string
+  startTime?: number
+  time?: number
+  tokens?: number
+  steps?: number
+  showSteps?: boolean
+}
+
+const MetaData: FC<Props> = ({
+  status,
+  executor,
+  startTime,
+  time,
+  tokens,
+  steps = 1,
+  showSteps = true,
+}) => {
+  const { t } = useTranslation()
+  const { formatTime } = useTimestamp()
+
+  return (
+    <div className='relative'>
+      <div className='system-xs-medium-uppercase h-6 py-1 text-text-tertiary'>{t('runLog.meta.title')}</div>
+      <div className='py-1'>
+        <div className='flex'>
+          <div className='system-xs-regular w-[104px] shrink-0 truncate px-2 py-1.5 text-text-tertiary'>{t('runLog.meta.status')}</div>
+          <div className='system-xs-regular grow px-2 py-1.5 text-text-secondary'>
+            {status === 'running' && (
+              <div className='my-1 h-2 w-16 rounded-sm bg-text-quaternary'/>
+            )}
+            {status === 'succeeded' && (
+              <span>SUCCESS</span>
+            )}
+            {status === 'partial-succeeded' && (
+              <span>PARTIAL SUCCESS</span>
+            )}
+            {status === 'exception' && (
+              <span>EXCEPTION</span>
+            )}
+            {status === 'failed' && (
+              <span>FAIL</span>
+            )}
+            {status === 'stopped' && (
+              <span>STOP</span>
+            )}
+          </div>
+        </div>
+        <div className='flex'>
+          <div className='system-xs-regular w-[104px] shrink-0 truncate px-2 py-1.5 text-text-tertiary'>{t('runLog.meta.executor')}</div>
+          <div className='system-xs-regular grow px-2 py-1.5 text-text-secondary'>
+            {status === 'running' && (
+              <div className='my-1 h-2 w-[88px] rounded-sm bg-text-quaternary'/>
+            )}
+            {status !== 'running' && (
+              <span>{executor || 'N/A'}</span>
+            )}
+          </div>
+        </div>
+        <div className='flex'>
+          <div className='system-xs-regular w-[104px] shrink-0 truncate px-2 py-1.5 text-text-tertiary'>{t('runLog.meta.startTime')}</div>
+          <div className='system-xs-regular grow px-2 py-1.5 text-text-secondary'>
+            {status === 'running' && (
+              <div className='my-1 h-2 w-[72px] rounded-sm bg-text-quaternary'/>
+            )}
+            {status !== 'running' && (
+              <span>{startTime ? formatTime(startTime, t('appLog.dateTimeFormat') as string) : '-'}</span>
+            )}
+          </div>
+        </div>
+        <div className='flex'>
+          <div className='system-xs-regular w-[104px] shrink-0 truncate px-2 py-1.5 text-text-tertiary'>{t('runLog.meta.time')}</div>
+          <div className='system-xs-regular grow px-2 py-1.5 text-text-secondary'>
+            {status === 'running' && (
+              <div className='my-1 h-2 w-[72px] rounded-sm bg-text-quaternary'/>
+            )}
+            {status !== 'running' && (
+              <span>{time ? `${time.toFixed(3)}s` : '-'}</span>
+            )}
+          </div>
+        </div>
+        <div className='flex'>
+          <div className='system-xs-regular w-[104px] shrink-0 truncate px-2 py-1.5 text-text-tertiary'>{t('runLog.meta.tokens')}</div>
+          <div className='system-xs-regular grow px-2 py-1.5 text-text-secondary'>
+            {status === 'running' && (
+              <div className='my-1 h-2 w-[48px] rounded-sm bg-text-quaternary'/>
+            )}
+            {status !== 'running' && (
+              <span>{`${tokens || 0} Tokens`}</span>
+            )}
+          </div>
+        </div>
+        {showSteps && (
+          <div className='flex'>
+            <div className='system-xs-regular w-[104px] shrink-0 truncate px-2 py-1.5 text-text-tertiary'>{t('runLog.meta.steps')}</div>
+            <div className='system-xs-regular grow px-2 py-1.5 text-text-secondary'>
+              {status === 'running' && (
+                <div className='my-1 h-2 w-[24px] rounded-sm bg-text-quaternary'/>
+              )}
+              {status !== 'running' && (
+                <span>{steps}</span>
+              )}
+            </div>
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+
+export default MetaData
diff --git a/app/components/workflow/run/node.tsx b/app/components/workflow/run/node.tsx
new file mode 100644
index 0000000..10f641c
--- /dev/null
+++ b/app/components/workflow/run/node.tsx
@@ -0,0 +1,258 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import type { FC } from 'react'
+import { useCallback, useEffect, useMemo, useState } from 'react'
+import {
+  RiAlertFill,
+  RiArrowRightSLine,
+  RiCheckboxCircleFill,
+  RiErrorWarningLine,
+  RiLoader2Line,
+} from '@remixicon/react'
+import BlockIcon from '../block-icon'
+import { BlockEnum } from '../types'
+import { RetryLogTrigger } from './retry-log'
+import { IterationLogTrigger } from './iteration-log'
+import { LoopLogTrigger } from './loop-log'
+import { AgentLogTrigger } from './agent-log'
+import cn from '@/utils/classnames'
+import StatusContainer from '@/app/components/workflow/run/status-container'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
+import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+import type {
+  AgentLogItemWithChildren,
+  IterationDurationMap,
+  LoopDurationMap,
+  LoopVariableMap,
+  NodeTracing,
+} from '@/types/workflow'
+import ErrorHandleTip from '@/app/components/workflow/nodes/_base/components/error-handle/error-handle-tip'
+import { hasRetryNode } from '@/app/components/workflow/utils'
+
+type Props = {
+  className?: string
+  nodeInfo: NodeTracing
+  allExecutions?: NodeTracing[]
+  inMessage?: boolean
+  hideInfo?: boolean
+  hideProcessDetail?: boolean
+  onShowIterationDetail?: (detail: NodeTracing[][], iterDurationMap: IterationDurationMap) => void
+  onShowLoopDetail?: (detail: NodeTracing[][], loopDurationMap: LoopDurationMap, loopVariableMap: LoopVariableMap) => void
+  onShowRetryDetail?: (detail: NodeTracing[]) => void
+  onShowAgentOrToolLog?: (detail?: AgentLogItemWithChildren) => void
+  notShowIterationNav?: boolean
+  notShowLoopNav?: boolean
+}
+
+const NodePanel: FC<Props> = ({
+  className,
+  nodeInfo,
+  allExecutions,
+  inMessage = false,
+  hideInfo = false,
+  hideProcessDetail,
+  onShowIterationDetail,
+  onShowLoopDetail,
+  onShowRetryDetail,
+  onShowAgentOrToolLog,
+  notShowIterationNav,
+  notShowLoopNav,
+}) => {
+  const [collapseState, doSetCollapseState] = useState<boolean>(true)
+  const setCollapseState = useCallback((state: boolean) => {
+    if (hideProcessDetail)
+      return
+    doSetCollapseState(state)
+  }, [hideProcessDetail])
+  const { t } = useTranslation()
+
+  const getTime = (time: number) => {
+    if (time < 1)
+      return `${(time * 1000).toFixed(3)} ms`
+    if (time > 60)
+      return `${Number.parseInt(Math.round(time / 60).toString())} m ${(time % 60).toFixed(3)} s`
+    return `${time.toFixed(3)} s`
+  }
+
+  const getTokenCount = (tokens: number) => {
+    if (tokens < 1000)
+      return tokens
+    if (tokens >= 1000 && tokens < 1000000)
+      return `${Number.parseFloat((tokens / 1000).toFixed(3))}K`
+    if (tokens >= 1000000)
+      return `${Number.parseFloat((tokens / 1000000).toFixed(3))}M`
+  }
+
+  useEffect(() => {
+    setCollapseState(!nodeInfo.expand)
+  }, [nodeInfo.expand, setCollapseState])
+
+  const isIterationNode = nodeInfo.node_type === BlockEnum.Iteration && !!nodeInfo.details?.length
+  const isLoopNode = nodeInfo.node_type === BlockEnum.Loop && !!nodeInfo.details?.length
+  const isRetryNode = hasRetryNode(nodeInfo.node_type) && !!nodeInfo.retryDetail?.length
+  const isAgentNode = nodeInfo.node_type === BlockEnum.Agent && !!nodeInfo.agentLog?.length
+  const isToolNode = nodeInfo.node_type === BlockEnum.Tool && !!nodeInfo.agentLog?.length
+
+  const inputsTitle = useMemo(() => {
+    let text = t('workflow.common.input')
+    if (nodeInfo.node_type === BlockEnum.Loop)
+      text = t('workflow.nodes.loop.initialLoopVariables')
+    return text.toLocaleUpperCase()
+  }, [nodeInfo.node_type, t])
+  const processDataTitle = t('workflow.common.processData').toLocaleUpperCase()
+  const outputTitle = useMemo(() => {
+    let text = t('workflow.common.output')
+    if (nodeInfo.node_type === BlockEnum.Loop)
+      text = t('workflow.nodes.loop.finalLoopVariables')
+    return text.toLocaleUpperCase()
+  }, [nodeInfo.node_type, t])
+
+  return (
+    <div className={cn('px-2 py-1', className)}>
+      <div className='group rounded-[10px] border border-components-panel-border bg-background-default shadow-xs transition-all hover:shadow-md'>
+        <div
+          className={cn(
+            'flex cursor-pointer items-center pl-1 pr-3',
+            hideInfo ? 'py-2 pl-2' : 'py-1.5',
+            !collapseState && (hideInfo ? '!pb-1' : '!pb-1.5'),
+          )}
+          onClick={() => setCollapseState(!collapseState)}
+        >
+          {!hideProcessDetail && (
+            <RiArrowRightSLine
+              className={cn(
+                'mr-1 h-4 w-4 shrink-0 text-text-quaternary transition-all group-hover:text-text-tertiary',
+                !collapseState && 'rotate-90',
+              )}
+            />
+          )}
+          <BlockIcon size={inMessage ? 'xs' : 'sm'} className={cn('mr-2 shrink-0', inMessage && '!mr-1')} type={nodeInfo.node_type} toolIcon={nodeInfo.extras?.icon || nodeInfo.extras} />
+          <div className={cn(
+            'system-xs-semibold-uppercase grow truncate text-text-secondary',
+            hideInfo && '!text-xs',
+          )} title={nodeInfo.title}>{nodeInfo.title}</div>
+          {nodeInfo.status !== 'running' && !hideInfo && (
+            <div className='system-xs-regular shrink-0 text-text-tertiary'>{nodeInfo.execution_metadata?.total_tokens ? `${getTokenCount(nodeInfo.execution_metadata?.total_tokens || 0)} tokens 路 ` : ''}{`${getTime(nodeInfo.elapsed_time || 0)}`}</div>
+          )}
+          {nodeInfo.status === 'succeeded' && (
+            <RiCheckboxCircleFill className='ml-2 h-3.5 w-3.5 shrink-0 text-text-success' />
+          )}
+          {nodeInfo.status === 'failed' && (
+            <RiErrorWarningLine className='ml-2 h-3.5 w-3.5 shrink-0 text-text-warning' />
+          )}
+          {nodeInfo.status === 'stopped' && (
+            <RiAlertFill className={cn('ml-2 h-4 w-4 shrink-0 text-text-warning-secondary', inMessage && 'h-3.5 w-3.5')} />
+          )}
+          {nodeInfo.status === 'exception' && (
+            <RiAlertFill className={cn('ml-2 h-4 w-4 shrink-0 text-text-warning-secondary', inMessage && 'h-3.5 w-3.5')} />
+          )}
+          {nodeInfo.status === 'running' && (
+            <div className='flex shrink-0 items-center text-[13px] font-medium leading-[16px] text-text-accent'>
+              <span className='mr-2 text-xs font-normal'>Running</span>
+              <RiLoader2Line className='h-3.5 w-3.5 animate-spin' />
+            </div>
+          )}
+        </div>
+        {!collapseState && !hideProcessDetail && (
+          <div className='px-1 pb-1'>
+            {/* The nav to the iteration detail */}
+            {isIterationNode && !notShowIterationNav && onShowIterationDetail && (
+              <IterationLogTrigger
+                nodeInfo={nodeInfo}
+                allExecutions={allExecutions}
+                onShowIterationResultList={onShowIterationDetail}
+              />
+            )}
+            {/* The nav to the Loop detail */}
+            {isLoopNode && !notShowLoopNav && onShowLoopDetail && (
+              <LoopLogTrigger
+                nodeInfo={nodeInfo}
+                allExecutions={allExecutions}
+                onShowLoopResultList={onShowLoopDetail}
+              />
+            )}
+            {isRetryNode && onShowRetryDetail && (
+              <RetryLogTrigger
+                nodeInfo={nodeInfo}
+                onShowRetryResultList={onShowRetryDetail}
+              />
+            )}
+            {
+              (isAgentNode || isToolNode) && onShowAgentOrToolLog && (
+                <AgentLogTrigger
+                  nodeInfo={nodeInfo}
+                  onShowAgentOrToolLog={onShowAgentOrToolLog}
+                />
+              )
+            }
+            <div className={cn('mb-1', hideInfo && '!px-2 !py-0.5')}>
+              {(nodeInfo.status === 'stopped') && (
+                <StatusContainer status='stopped'>
+                  {t('workflow.tracing.stopBy', { user: nodeInfo.created_by ? nodeInfo.created_by.name : 'N/A' })}
+                </StatusContainer>
+              )}
+              {(nodeInfo.status === 'exception') && (
+                <StatusContainer status='stopped'>
+                  {nodeInfo.error}
+                  <a
+                    href='https://docs.dify.ai/guides/workflow/error-handling/error-type'
+                    target='_blank'
+                    className='text-text-accent'
+                  >
+                    {t('workflow.common.learnMore')}
+                  </a>
+                </StatusContainer>
+              )}
+              {nodeInfo.status === 'failed' && (
+                <StatusContainer status='failed'>
+                  {nodeInfo.error}
+                </StatusContainer>
+              )}
+              {nodeInfo.status === 'retry' && (
+                <StatusContainer status='failed'>
+                  {nodeInfo.error}
+                </StatusContainer>
+              )}
+            </div>
+            {nodeInfo.inputs && (
+              <div className={cn('mb-1')}>
+                <CodeEditor
+                  readOnly
+                  title={<div>{inputsTitle}</div>}
+                  language={CodeLanguage.json}
+                  value={nodeInfo.inputs}
+                  isJSONStringifyBeauty
+                />
+              </div>
+            )}
+            {nodeInfo.process_data && (
+              <div className={cn('mb-1')}>
+                <CodeEditor
+                  readOnly
+                  title={<div>{processDataTitle}</div>}
+                  language={CodeLanguage.json}
+                  value={nodeInfo.process_data}
+                  isJSONStringifyBeauty
+                />
+              </div>
+            )}
+            {nodeInfo.outputs && (
+              <div>
+                <CodeEditor
+                  readOnly
+                  title={<div>{outputTitle}</div>}
+                  language={CodeLanguage.json}
+                  value={nodeInfo.outputs}
+                  isJSONStringifyBeauty
+                  tip={<ErrorHandleTip type={nodeInfo.execution_metadata?.error_strategy} />}
+                />
+              </div>
+            )}
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+
+export default NodePanel
diff --git a/app/components/workflow/run/output-panel.tsx b/app/components/workflow/run/output-panel.tsx
new file mode 100644
index 0000000..ad776a1
--- /dev/null
+++ b/app/components/workflow/run/output-panel.tsx
@@ -0,0 +1,111 @@
+'use client'
+import type { FC } from 'react'
+import { useMemo } from 'react'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
+import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+import { Markdown } from '@/app/components/base/markdown'
+import LoadingAnim from '@/app/components/base/chat/chat/loading-anim'
+import { FileList } from '@/app/components/base/file-uploader'
+import StatusContainer from '@/app/components/workflow/run/status-container'
+import { getProcessedFilesFromResponse } from '@/app/components/base/file-uploader/utils'
+
+type OutputPanelProps = {
+  isRunning?: boolean
+  outputs?: any
+  error?: string
+  height?: number
+}
+
+const OutputPanel: FC<OutputPanelProps> = ({
+  isRunning,
+  outputs,
+  error,
+  height,
+}) => {
+  const isTextOutput = useMemo(() => {
+    if (!outputs || typeof outputs !== 'object')
+      return false
+    const keys = Object.keys(outputs)
+    const value = outputs[keys[0]]
+    return keys.length === 1 && (
+      typeof value === 'string'
+      || (Array.isArray(value) && value.every(item => typeof item === 'string'))
+    )
+  }, [outputs])
+
+  const fileList = useMemo(() => {
+    const fileList: any[] = []
+    if (!outputs)
+      return fileList
+    if (Object.keys(outputs).length > 1)
+      return fileList
+    for (const key in outputs) {
+      if (Array.isArray(outputs[key])) {
+        outputs[key].map((output: any) => {
+          if (output?.dify_model_identity === '__dify__file__')
+            fileList.push(output)
+          return null
+        })
+      }
+      else if (outputs[key]?.dify_model_identity === '__dify__file__') {
+        fileList.push(outputs[key])
+      }
+    }
+    return getProcessedFilesFromResponse(fileList)
+  }, [outputs])
+  return (
+    <div className='p-2'>
+      {isRunning && (
+        <div className='pl-[26px] pt-4'>
+          <LoadingAnim type='text' />
+        </div>
+      )}
+      {!isRunning && error && (
+        <div className='px-4'>
+          <StatusContainer status='failed'>{error}</StatusContainer>
+        </div>
+      )}
+      {!isRunning && !outputs && (
+        <div className='px-4 py-2'>
+          <Markdown content='No Output' />
+        </div>
+      )}
+      {isTextOutput && (
+        <div className='px-4 py-2'>
+          <Markdown
+            content={
+              Array.isArray(outputs[Object.keys(outputs)[0]])
+                ? outputs[Object.keys(outputs)[0]].join('\n')
+                : (outputs[Object.keys(outputs)[0]] || '')
+            }
+          />
+        </div>
+      )}
+      {fileList.length > 0 && (
+        <div className='px-4 py-2'>
+          <FileList
+            files={fileList}
+            showDeleteAction={false}
+            showDownloadAction
+            canPreview
+          />
+        </div>
+      )}
+      {!isTextOutput && outputs && Object.keys(outputs).length > 0 && height! > 0 && (
+        <div className='flex flex-col gap-2'>
+          <CodeEditor
+            showFileList
+            readOnly
+            title={<div tabIndex={0}>Output</div>}
+            language={CodeLanguage.json}
+            value={JSON.stringify(outputs, null, 2)}
+            isJSONStringifyBeauty
+            height={height ? (height - 16) / 2 : undefined}
+          />
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default OutputPanel
diff --git a/app/components/workflow/run/result-panel.tsx b/app/components/workflow/run/result-panel.tsx
new file mode 100644
index 0000000..096a825
--- /dev/null
+++ b/app/components/workflow/run/result-panel.tsx
@@ -0,0 +1,160 @@
+'use client'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import StatusPanel from './status'
+import MetaData from './meta'
+import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
+import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
+import ErrorHandleTip from '@/app/components/workflow/nodes/_base/components/error-handle/error-handle-tip'
+import type {
+  AgentLogItemWithChildren,
+  NodeTracing,
+} from '@/types/workflow'
+import { BlockEnum } from '@/app/components/workflow/types'
+import { hasRetryNode } from '@/app/components/workflow/utils'
+import { IterationLogTrigger } from '@/app/components/workflow/run/iteration-log'
+import { LoopLogTrigger } from '@/app/components/workflow/run/loop-log'
+import { RetryLogTrigger } from '@/app/components/workflow/run/retry-log'
+import { AgentLogTrigger } from '@/app/components/workflow/run/agent-log'
+
+type ResultPanelProps = {
+  nodeInfo?: NodeTracing
+  inputs?: string
+  process_data?: string
+  outputs?: string
+  status: string
+  error?: string
+  elapsed_time?: number
+  total_tokens?: number
+  created_at?: number
+  created_by?: string
+  finished_at?: number
+  steps?: number
+  showSteps?: boolean
+  exceptionCounts?: number
+  execution_metadata?: any
+  handleShowIterationResultList?: (detail: NodeTracing[][], iterDurationMap: any) => void
+  handleShowLoopResultList?: (detail: NodeTracing[][], loopDurationMap: any) => void
+  onShowRetryDetail?: (detail: NodeTracing[]) => void
+  handleShowAgentOrToolLog?: (detail?: AgentLogItemWithChildren) => void
+}
+
+const ResultPanel: FC<ResultPanelProps> = ({
+  nodeInfo,
+  inputs,
+  process_data,
+  outputs,
+  status,
+  error,
+  elapsed_time,
+  total_tokens,
+  created_at,
+  created_by,
+  steps,
+  showSteps,
+  exceptionCounts,
+  execution_metadata,
+  handleShowIterationResultList,
+  handleShowLoopResultList,
+  onShowRetryDetail,
+  handleShowAgentOrToolLog,
+}) => {
+  const { t } = useTranslation()
+  const isIterationNode = nodeInfo?.node_type === BlockEnum.Iteration && !!nodeInfo?.details?.length
+  const isLoopNode = nodeInfo?.node_type === BlockEnum.Loop && !!nodeInfo?.details?.length
+  const isRetryNode = hasRetryNode(nodeInfo?.node_type) && !!nodeInfo?.retryDetail?.length
+  const isAgentNode = nodeInfo?.node_type === BlockEnum.Agent && !!nodeInfo?.agentLog?.length
+  const isToolNode = nodeInfo?.node_type === BlockEnum.Tool && !!nodeInfo?.agentLog?.length
+
+  return (
+    <div className='bg-components-panel-bg py-2'>
+      <div className='px-4 py-2'>
+        <StatusPanel
+          status={status}
+          time={elapsed_time}
+          tokens={total_tokens}
+          error={error}
+          exceptionCounts={exceptionCounts}
+        />
+      </div>
+      <div className='px-4'>
+        {
+          isIterationNode && handleShowIterationResultList && (
+            <IterationLogTrigger
+              nodeInfo={nodeInfo}
+              onShowIterationResultList={handleShowIterationResultList}
+            />
+          )
+        }
+        {
+          isLoopNode && handleShowLoopResultList && (
+            <LoopLogTrigger
+              nodeInfo={nodeInfo}
+              onShowLoopResultList={handleShowLoopResultList}
+            />
+          )
+        }
+        {
+          isRetryNode && onShowRetryDetail && (
+            <RetryLogTrigger
+              nodeInfo={nodeInfo}
+              onShowRetryResultList={onShowRetryDetail}
+            />
+          )
+        }
+        {
+          (isAgentNode || isToolNode) && handleShowAgentOrToolLog && (
+            <AgentLogTrigger
+              nodeInfo={nodeInfo}
+              onShowAgentOrToolLog={handleShowAgentOrToolLog}
+            />
+          )
+        }
+      </div>
+      <div className='flex flex-col gap-2 px-4 py-2'>
+        <CodeEditor
+          readOnly
+          title={<div>{t('workflow.common.input').toLocaleUpperCase()}</div>}
+          language={CodeLanguage.json}
+          value={inputs}
+          isJSONStringifyBeauty
+        />
+        {process_data && (
+          <CodeEditor
+            readOnly
+            title={<div>{t('workflow.common.processData').toLocaleUpperCase()}</div>}
+            language={CodeLanguage.json}
+            value={process_data}
+            isJSONStringifyBeauty
+          />
+        )}
+        {(outputs || status === 'running') && (
+          <CodeEditor
+            readOnly
+            title={<div>{t('workflow.common.output').toLocaleUpperCase()}</div>}
+            language={CodeLanguage.json}
+            value={outputs}
+            isJSONStringifyBeauty
+            tip={<ErrorHandleTip type={execution_metadata?.error_strategy} />}
+          />
+        )}
+      </div>
+      <div className='px-4 py-2'>
+        <div className='divider-subtle h-[0.5px]' />
+      </div>
+      <div className='px-4 py-2'>
+        <MetaData
+          status={status}
+          executor={created_by}
+          startTime={created_at}
+          time={elapsed_time}
+          tokens={total_tokens}
+          steps={steps}
+          showSteps={showSteps}
+        />
+      </div>
+    </div>
+  )
+}
+
+export default ResultPanel
diff --git a/app/components/workflow/run/result-text.tsx b/app/components/workflow/run/result-text.tsx
new file mode 100644
index 0000000..cf99c60
--- /dev/null
+++ b/app/components/workflow/run/result-text.tsx
@@ -0,0 +1,75 @@
+'use client'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import { ImageIndentLeft } from '@/app/components/base/icons/src/vender/line/editor'
+import { Markdown } from '@/app/components/base/markdown'
+import LoadingAnim from '@/app/components/base/chat/chat/loading-anim'
+import StatusContainer from '@/app/components/workflow/run/status-container'
+import { FileList } from '@/app/components/base/file-uploader'
+
+type ResultTextProps = {
+  isRunning?: boolean
+  outputs?: any
+  error?: string
+  onClick?: () => void
+  allFiles?: any[]
+}
+
+const ResultText: FC<ResultTextProps> = ({
+  isRunning,
+  outputs,
+  error,
+  onClick,
+  allFiles,
+}) => {
+  const { t } = useTranslation()
+  return (
+    <div className='bg-background-section-burn'>
+      {isRunning && !outputs && (
+        <div className='pl-[26px] pt-4'>
+          <LoadingAnim type='text' />
+        </div>
+      )}
+      {!isRunning && error && (
+        <div className='px-4 py-2'>
+          <StatusContainer status='failed'>
+            {error}
+          </StatusContainer>
+        </div>
+      )}
+      {!isRunning && !outputs && !error && !allFiles?.length && (
+        <div className='mt-[120px] flex flex-col items-center px-4 py-2 text-[13px] leading-[18px] text-gray-500'>
+          <ImageIndentLeft className='h-6 w-6 text-gray-400' />
+          <div className='mr-2'>{t('runLog.resultEmpty.title')}</div>
+          <div>
+            {t('runLog.resultEmpty.tipLeft')}
+            <span onClick={onClick} className='cursor-pointer text-primary-600'>{t('runLog.resultEmpty.link')}</span>
+            {t('runLog.resultEmpty.tipRight')}
+          </div>
+        </div>
+      )}
+      {(outputs || !!allFiles?.length) && (
+        <>
+          {outputs && (
+            <div className='px-4 py-2'>
+              <Markdown content={outputs} />
+            </div>
+          )}
+          {!!allFiles?.length && allFiles.map(item => (
+            <div key={item.varName} className='system-xs-regular flex flex-col gap-1 px-4 py-2'>
+              <div className='py-1 text-text-tertiary '>{item.varName}</div>
+              <FileList
+                files={item.list}
+                showDeleteAction={false}
+                showDownloadAction
+                canPreview
+              />
+            </div>
+          ))}
+        </>
+      )}
+    </div>
+  )
+}
+
+export default ResultText
diff --git a/app/components/workflow/run/retry-log/index.tsx b/app/components/workflow/run/retry-log/index.tsx
new file mode 100644
index 0000000..ee83f1a
--- /dev/null
+++ b/app/components/workflow/run/retry-log/index.tsx
@@ -0,0 +1,2 @@
+export { default as RetryLogTrigger } from './retry-log-trigger'
+export { default as RetryResultPanel } from './retry-result-panel'
diff --git a/app/components/workflow/run/retry-log/retry-log-trigger.tsx b/app/components/workflow/run/retry-log/retry-log-trigger.tsx
new file mode 100644
index 0000000..0a39e4f
--- /dev/null
+++ b/app/components/workflow/run/retry-log/retry-log-trigger.tsx
@@ -0,0 +1,41 @@
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowRightSLine,
+  RiRestartFill,
+} from '@remixicon/react'
+import Button from '@/app/components/base/button'
+import type { NodeTracing } from '@/types/workflow'
+
+type RetryLogTriggerProps = {
+  nodeInfo: NodeTracing
+  onShowRetryResultList: (detail: NodeTracing[]) => void
+}
+const RetryLogTrigger = ({
+  nodeInfo,
+  onShowRetryResultList,
+}: RetryLogTriggerProps) => {
+  const { t } = useTranslation()
+  const { retryDetail } = nodeInfo
+
+  const handleShowRetryResultList = (e: React.MouseEvent<HTMLButtonElement>) => {
+    e.stopPropagation()
+    e.nativeEvent.stopImmediatePropagation()
+    onShowRetryResultList(retryDetail || [])
+  }
+
+  return (
+    <Button
+      className='mb-1 flex w-full items-center justify-between'
+      variant='tertiary'
+      onClick={handleShowRetryResultList}
+    >
+      <div className='flex items-center'>
+        <RiRestartFill className='mr-0.5 h-4 w-4 shrink-0 text-components-button-tertiary-text' />
+        {t('workflow.nodes.common.retry.retries', { num: retryDetail?.length })}
+      </div>
+      <RiArrowRightSLine className='h-4 w-4 shrink-0 text-components-button-tertiary-text' />
+    </Button>
+  )
+}
+
+export default RetryLogTrigger
diff --git a/app/components/workflow/run/retry-log/retry-result-panel.tsx b/app/components/workflow/run/retry-log/retry-result-panel.tsx
new file mode 100644
index 0000000..3d1eb77
--- /dev/null
+++ b/app/components/workflow/run/retry-log/retry-result-panel.tsx
@@ -0,0 +1,46 @@
+'use client'
+
+import type { FC } from 'react'
+import { memo } from 'react'
+import { useTranslation } from 'react-i18next'
+import {
+  RiArrowLeftLine,
+} from '@remixicon/react'
+import TracingPanel from '../tracing-panel'
+import type { NodeTracing } from '@/types/workflow'
+
+type Props = {
+  list: NodeTracing[]
+  onBack: () => void
+}
+
+const RetryResultPanel: FC<Props> = ({
+  list,
+  onBack,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <div>
+      <div
+        className='system-sm-medium flex h-8 cursor-pointer items-center bg-components-panel-bg px-4 text-text-accent-secondary'
+        onClick={(e) => {
+          e.stopPropagation()
+          e.nativeEvent.stopImmediatePropagation()
+          onBack()
+        }}
+      >
+        <RiArrowLeftLine className='mr-1 h-4 w-4' />
+        {t('workflow.singleRun.back')}
+      </div>
+      <TracingPanel
+        list={list.map((item, index) => ({
+          ...item,
+          title: `${t('workflow.nodes.common.retry.retry')} ${index + 1}`,
+        }))}
+        className='bg-background-section-burn'
+      />
+    </div >
+  )
+}
+export default memo(RetryResultPanel)
diff --git a/app/components/workflow/run/special-result-panel.tsx b/app/components/workflow/run/special-result-panel.tsx
new file mode 100644
index 0000000..d985950
--- /dev/null
+++ b/app/components/workflow/run/special-result-panel.tsx
@@ -0,0 +1,98 @@
+import { RetryResultPanel } from './retry-log'
+import { IterationResultPanel } from './iteration-log'
+import { LoopResultPanel } from './loop-log'
+import { AgentResultPanel } from './agent-log'
+import type {
+  AgentLogItemWithChildren,
+  IterationDurationMap,
+  LoopDurationMap,
+  LoopVariableMap,
+  NodeTracing,
+} from '@/types/workflow'
+
+export type SpecialResultPanelProps = {
+  showRetryDetail?: boolean
+  setShowRetryDetailFalse?: () => void
+  retryResultList?: NodeTracing[]
+
+  showIteratingDetail?: boolean
+  setShowIteratingDetailFalse?: () => void
+  iterationResultList?: NodeTracing[][]
+  iterationResultDurationMap?: IterationDurationMap
+
+  showLoopingDetail?: boolean
+  setShowLoopingDetailFalse?: () => void
+  loopResultList?: NodeTracing[][]
+  loopResultDurationMap?: LoopDurationMap
+  loopResultVariableMap?: LoopVariableMap
+
+  agentOrToolLogItemStack?: AgentLogItemWithChildren[]
+  agentOrToolLogListMap?: Record<string, AgentLogItemWithChildren[]>
+  handleShowAgentOrToolLog?: (detail?: AgentLogItemWithChildren) => void
+}
+const SpecialResultPanel = ({
+  showRetryDetail,
+  setShowRetryDetailFalse,
+  retryResultList,
+
+  showIteratingDetail,
+  setShowIteratingDetailFalse,
+  iterationResultList,
+  iterationResultDurationMap,
+
+  showLoopingDetail,
+  setShowLoopingDetailFalse,
+  loopResultList,
+  loopResultDurationMap,
+  loopResultVariableMap,
+
+  agentOrToolLogItemStack,
+  agentOrToolLogListMap,
+  handleShowAgentOrToolLog,
+}: SpecialResultPanelProps) => {
+  return (
+    <div onClick={(e) => {
+      e.stopPropagation()
+      e.nativeEvent.stopImmediatePropagation()
+    }}>
+      {
+        !!showRetryDetail && !!retryResultList?.length && setShowRetryDetailFalse && (
+          <RetryResultPanel
+            list={retryResultList}
+            onBack={setShowRetryDetailFalse}
+          />
+        )
+      }
+      {
+        showIteratingDetail && !!iterationResultList?.length && setShowIteratingDetailFalse && (
+          <IterationResultPanel
+            list={iterationResultList}
+            onBack={setShowIteratingDetailFalse}
+            iterDurationMap={iterationResultDurationMap}
+          />
+        )
+      }
+      {
+        showLoopingDetail && !!loopResultList?.length && setShowLoopingDetailFalse && (
+          <LoopResultPanel
+            list={loopResultList}
+            onBack={setShowLoopingDetailFalse}
+            loopDurationMap={loopResultDurationMap}
+            loopVariableMap={loopResultVariableMap}
+          />
+        )
+      }
+      {
+        !!agentOrToolLogItemStack?.length && agentOrToolLogListMap && handleShowAgentOrToolLog && (
+          <AgentResultPanel
+            agentOrToolLogItemStack={agentOrToolLogItemStack}
+            agentOrToolLogListMap={agentOrToolLogListMap}
+            onShowAgentOrToolLog={handleShowAgentOrToolLog}
+          />
+        )
+      }
+    </div>
+  )
+}
+
+export default SpecialResultPanel
diff --git a/app/components/workflow/run/status-container.tsx b/app/components/workflow/run/status-container.tsx
new file mode 100644
index 0000000..47890da
--- /dev/null
+++ b/app/components/workflow/run/status-container.tsx
@@ -0,0 +1,51 @@
+'use client'
+import type { FC } from 'react'
+import { Theme } from '@/types/app'
+import cn from '@/utils/classnames'
+import useTheme from '@/hooks/use-theme'
+
+type Props = {
+  status: string
+  children?: React.ReactNode
+}
+
+const StatusContainer: FC<Props> = ({
+  status,
+  children,
+}) => {
+  const { theme } = useTheme()
+  return (
+    <div
+      className={cn(
+        'system-xs-regular relative break-all rounded-lg border px-3 py-2.5',
+        status === 'succeeded' && 'border-[rgba(23,178,106,0.8)] bg-workflow-display-success-bg bg-[url(~@/app/components/workflow/run/assets/bg-line-success.svg)] text-text-success',
+        status === 'succeeded' && theme === Theme.light && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.5),inset_0_1px_3px_0_rgba(0,0,0,0.12),inset_0_2px_24px_0_rgba(23,178,106,0.2),0_1px_2px_0_rgba(9,9,11,0.05),0_0_0_1px_rgba(0,0,0,0.05)]',
+        status === 'succeeded' && theme === Theme.dark && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.12),inset_0_1px_3px_0_rgba(0,0,0,0.4),inset_0_2px_24px_0_rgba(23,178,106,0.25),0_1px_2px_0_rgba(0,0,0,0.1),0_0_0_1px_rgba(24, 24, 27, 0.95)]',
+        status === 'partial-succeeded' && 'border-[rgba(23,178,106,0.8)] bg-workflow-display-success-bg bg-[url(~@/app/components/workflow/run/assets/bg-line-success.svg)] text-text-success',
+        status === 'partial-succeeded' && theme === Theme.light && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.5),inset_0_1px_3px_0_rgba(0,0,0,0.12),inset_0_2px_24px_0_rgba(23,178,106,0.2),0_1px_2px_0_rgba(9,9,11,0.05),0_0_0_1px_rgba(0,0,0,0.05)]',
+        status === 'partial-succeeded' && theme === Theme.dark && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.12),inset_0_1px_3px_0_rgba(0,0,0,0.4),inset_0_2px_24px_0_rgba(23,178,106,0.25),0_1px_2px_0_rgba(0,0,0,0.1),0_0_0_1px_rgba(24, 24, 27, 0.95)]',
+        status === 'failed' && 'border-[rgba(240,68,56,0.8)] bg-workflow-display-error-bg bg-[url(~@/app/components/workflow/run/assets/bg-line-error.svg)] text-text-warning',
+        status === 'failed' && theme === Theme.light && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.5),inset_0_1px_3px_0_rgba(0,0,0,0.12),inset_0_2px_24px_0_rgba(240,68,56,0.2),0_1px_2px_0_rgba(9,9,11,0.05),0_0_0_1px_rgba(0,0,0,0.05)]',
+        status === 'failed' && theme === Theme.dark && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.12),inset_0_1px_3px_0_rgba(0,0,0,0.4),inset_0_2px_24px_0_rgba(240,68,56,0.25),0_1px_2px_0_rgba(0,0,0,0.1),0_0_0_1px_rgba(24, 24, 27, 0.95)]',
+        status === 'stopped' && 'border-[rgba(247,144,9,0.8)] bg-workflow-display-warning-bg bg-[url(~@/app/components/workflow/run/assets/bg-line-warning.svg)] text-text-destructive',
+        status === 'stopped' && theme === Theme.light && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.5),inset_0_1px_3px_0_rgba(0,0,0,0.12),inset_0_2px_24px_0_rgba(247,144,9,0.2),0_1px_2px_0_rgba(9,9,11,0.05),0_0_0_1px_rgba(0,0,0,0.05)]',
+        status === 'stopped' && theme === Theme.dark && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.12),inset_0_1px_3px_0_rgba(0,0,0,0.4),inset_0_2px_24px_0_rgba(247,144,9,0.25),0_1px_2px_0_rgba(0,0,0,0.1),0_0_0_1px_rgba(24, 24, 27, 0.95)]',
+        status === 'exception' && 'border-[rgba(247,144,9,0.8)] bg-workflow-display-warning-bg bg-[url(~@/app/components/workflow/run/assets/bg-line-warning.svg)] text-text-destructive',
+        status === 'exception' && theme === Theme.light && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.5),inset_0_1px_3px_0_rgba(0,0,0,0.12),inset_0_2px_24px_0_rgba(247,144,9,0.2),0_1px_2px_0_rgba(9,9,11,0.05),0_0_0_1px_rgba(0,0,0,0.05)]',
+        status === 'exception' && theme === Theme.dark && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.12),inset_0_1px_3px_0_rgba(0,0,0,0.4),inset_0_2px_24px_0_rgba(247,144,9,0.25),0_1px_2px_0_rgba(0,0,0,0.1),0_0_0_1px_rgba(24, 24, 27, 0.95)]',
+        status === 'running' && 'border-[rgba(11,165,236,0.8)] bg-workflow-display-normal-bg bg-[url(~@/app/components/workflow/run/assets/bg-line-running.svg)] text-util-colors-blue-light-blue-light-600',
+        status === 'running' && theme === Theme.light && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.5),inset_0_1px_3px_0_rgba(0,0,0,0.12),inset_0_2px_24px_0_rgba(11,165,236,0.2),0_1px_2px_0_rgba(9,9,11,0.05),0_0_0_1px_rgba(0,0,0,0.05)]',
+        status === 'running' && theme === Theme.dark && 'shadow-[inset_2px_2px_0_0_rgba(255,255,255,0.12),inset_0_1px_3px_0_rgba(0,0,0,0.4),inset_0_2px_24px_0_rgba(11,165,236,0.25),0_1px_2px_0_rgba(0,0,0,0.1),0_0_0_1px_rgba(24, 24, 27, 0.95)]',
+      )}
+    >
+      <div className={cn(
+        'absolute left-0 top-0 h-[50px] w-[65%] bg-no-repeat',
+        theme === Theme.light && 'bg-[url(~@/app/components/workflow/run/assets/highlight.svg)]',
+        theme === Theme.dark && 'bg-[url(~@/app/components/workflow/run/assets/highlight-dark.svg)]',
+      )}></div>
+      {children}
+    </div>
+  )
+}
+
+export default StatusContainer
diff --git a/app/components/workflow/run/status.tsx b/app/components/workflow/run/status.tsx
new file mode 100644
index 0000000..2f870f2
--- /dev/null
+++ b/app/components/workflow/run/status.tsx
@@ -0,0 +1,151 @@
+'use client'
+import type { FC } from 'react'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+import Indicator from '@/app/components/header/indicator'
+import StatusContainer from '@/app/components/workflow/run/status-container'
+
+type ResultProps = {
+  status: string
+  time?: number
+  tokens?: number
+  error?: string
+  exceptionCounts?: number
+}
+
+const StatusPanel: FC<ResultProps> = ({
+  status,
+  time,
+  tokens,
+  error,
+  exceptionCounts,
+}) => {
+  const { t } = useTranslation()
+
+  return (
+    <StatusContainer status={status}>
+      <div className='flex'>
+        <div className={cn(
+          'max-w-[120px] flex-[33%]',
+          status === 'partial-succeeded' && 'min-w-[140px]',
+        )}>
+          <div className='system-2xs-medium-uppercase mb-1 text-text-tertiary'>{t('runLog.resultPanel.status')}</div>
+          <div
+            className={cn(
+              'system-xs-semibold-uppercase flex items-center gap-1',
+              status === 'succeeded' && 'text-util-colors-green-green-600',
+              status === 'partial-succeeded' && 'text-util-colors-green-green-600',
+              status === 'failed' && 'text-util-colors-red-red-600',
+              status === 'stopped' && 'text-util-colors-warning-warning-600',
+              status === 'running' && 'text-util-colors-blue-light-blue-light-600',
+            )}
+          >
+            {status === 'running' && (
+              <>
+                <Indicator color={'blue'} />
+                <span>Running</span>
+              </>
+            )}
+            {status === 'succeeded' && (
+              <>
+                <Indicator color={'green'} />
+                <span>SUCCESS</span>
+              </>
+            )}
+            {status === 'partial-succeeded' && (
+              <>
+                <Indicator color={'green'} />
+                <span>PARTIAL SUCCESS</span>
+              </>
+            )}
+            {status === 'exception' && (
+              <>
+                <Indicator color={'yellow'} />
+                <span>EXCEPTION</span>
+              </>
+            )}
+            {status === 'failed' && (
+              <>
+                <Indicator color={'red'} />
+                <span>FAIL</span>
+              </>
+            )}
+            {status === 'stopped' && (
+              <>
+                <Indicator color={'yellow'} />
+                <span>STOP</span>
+              </>
+            )}
+          </div>
+        </div>
+        <div className='max-w-[152px] flex-[33%]'>
+          <div className='system-2xs-medium-uppercase mb-1 text-text-tertiary'>{t('runLog.resultPanel.time')}</div>
+          <div className='system-sm-medium flex items-center gap-1 text-text-secondary'>
+            {status === 'running' && (
+              <div className='h-2 w-16 rounded-sm bg-text-quaternary' />
+            )}
+            {status !== 'running' && (
+              <span>{time ? `${time?.toFixed(3)}s` : '-'}</span>
+            )}
+          </div>
+        </div>
+        <div className='flex-[33%]'>
+          <div className='system-2xs-medium-uppercase mb-1 text-text-tertiary'>{t('runLog.resultPanel.tokens')}</div>
+          <div className='system-sm-medium flex items-center gap-1 text-text-secondary'>
+            {status === 'running' && (
+              <div className='h-2 w-20 rounded-sm bg-text-quaternary' />
+            )}
+            {status !== 'running' && (
+              <span>{`${tokens || 0} Tokens`}</span>
+            )}
+          </div>
+        </div>
+      </div>
+      {status === 'failed' && error && (
+        <>
+          <div className='my-2 h-[0.5px] bg-divider-subtle'/>
+          <div className='system-xs-regular text-text-destructive'>{error}</div>
+          {
+            !!exceptionCounts && (
+              <>
+                <div className='my-2 h-[0.5px] bg-divider-subtle'/>
+                <div className='system-xs-regular text-text-destructive'>
+                  {t('workflow.nodes.common.errorHandle.partialSucceeded.tip', { num: exceptionCounts })}
+                </div>
+              </>
+            )
+          }
+        </>
+      )}
+      {
+        status === 'partial-succeeded' && !!exceptionCounts && (
+          <>
+            <div className='my-2 h-[0.5px] bg-divider-deep'/>
+            <div className='system-xs-medium text-text-warning'>
+              {t('workflow.nodes.common.errorHandle.partialSucceeded.tip', { num: exceptionCounts })}
+            </div>
+          </>
+        )
+      }
+      {
+        status === 'exception' && (
+          <>
+            <div className='my-2 h-[0.5px] bg-divider-deep'/>
+            <div className='system-xs-medium text-text-warning'>
+              {error}
+              <a
+                href='https://docs.dify.ai/guides/workflow/error-handling/error-type'
+                target='_blank'
+                className='text-text-accent'
+              >
+                {t('workflow.common.learnMore')}
+              </a>
+            </div>
+          </>
+        )
+      }
+    </StatusContainer>
+  )
+}
+
+export default StatusPanel
diff --git a/app/components/workflow/run/tracing-panel.tsx b/app/components/workflow/run/tracing-panel.tsx
new file mode 100644
index 0000000..a6e9bf9
--- /dev/null
+++ b/app/components/workflow/run/tracing-panel.tsx
@@ -0,0 +1,199 @@
+'use client'
+import type { FC } from 'react'
+import
+React,
+{
+  useCallback,
+  useState,
+} from 'react'
+import cn from 'classnames'
+import {
+  RiArrowDownSLine,
+  RiMenu4Line,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useLogs } from './hooks'
+import NodePanel from './node'
+import SpecialResultPanel from './special-result-panel'
+import type { NodeTracing } from '@/types/workflow'
+import formatNodeList from '@/app/components/workflow/run/utils/format-log'
+
+type TracingPanelProps = {
+  list: NodeTracing[]
+  className?: string
+  hideNodeInfo?: boolean
+  hideNodeProcessDetail?: boolean
+}
+
+const TracingPanel: FC<TracingPanelProps> = ({
+  list,
+  className,
+  hideNodeInfo = false,
+  hideNodeProcessDetail = false,
+}) => {
+  const { t } = useTranslation()
+  const treeNodes = formatNodeList(list, t)
+  const [collapsedNodes, setCollapsedNodes] = useState<Set<string>>(new Set())
+  const [hoveredParallel, setHoveredParallel] = useState<string | null>(null)
+
+  const toggleCollapse = (id: string) => {
+    setCollapsedNodes((prev) => {
+      const newSet = new Set(prev)
+      if (newSet.has(id))
+        newSet.delete(id)
+
+      else
+        newSet.add(id)
+
+      return newSet
+    })
+  }
+
+  const handleParallelMouseEnter = useCallback((id: string) => {
+    setHoveredParallel(id)
+  }, [])
+
+  const handleParallelMouseLeave = useCallback((e: React.MouseEvent) => {
+    const relatedTarget = e.relatedTarget as Element | null
+    if (relatedTarget && 'closest' in relatedTarget) {
+      const closestParallel = relatedTarget.closest('[data-parallel-id]')
+      if (closestParallel)
+        setHoveredParallel(closestParallel.getAttribute('data-parallel-id'))
+
+      else
+        setHoveredParallel(null)
+    }
+    else {
+      setHoveredParallel(null)
+    }
+  }, [])
+
+  const {
+    showSpecialResultPanel,
+
+    showRetryDetail,
+    setShowRetryDetailFalse,
+    retryResultList,
+    handleShowRetryResultList,
+
+    showIteratingDetail,
+    setShowIteratingDetailFalse,
+    iterationResultList,
+    iterationResultDurationMap,
+    handleShowIterationResultList,
+
+    showLoopingDetail,
+    setShowLoopingDetailFalse,
+    loopResultList,
+    loopResultDurationMap,
+    loopResultVariableMap,
+    handleShowLoopResultList,
+
+    agentOrToolLogItemStack,
+    agentOrToolLogListMap,
+    handleShowAgentOrToolLog,
+  } = useLogs()
+
+  const renderNode = (node: NodeTracing) => {
+    const isParallelFirstNode = !!node.parallelDetail?.isParallelStartNode
+    if (isParallelFirstNode) {
+      const parallelDetail = node.parallelDetail!
+      const isCollapsed = collapsedNodes.has(node.id)
+      const isHovered = hoveredParallel === node.id
+      return (
+        <div
+          key={node.id}
+          className="relative mb-2 ml-4"
+          data-parallel-id={node.id}
+          onMouseEnter={() => handleParallelMouseEnter(node.id)}
+          onMouseLeave={handleParallelMouseLeave}
+        >
+          <div className="mb-1 flex items-center">
+            <button
+              onClick={() => toggleCollapse(node.id)}
+              className={cn(
+                'mr-2 transition-colors',
+                isHovered ? 'rounded border-components-button-primary-border bg-components-button-primary-bg text-text-primary-on-surface' : 'text-text-secondary hover:text-text-primary',
+              )}
+            >
+              {isHovered ? <RiArrowDownSLine className="h-3 w-3" /> : <RiMenu4Line className="h-3 w-3 text-text-tertiary" />}
+            </button>
+            <div className="system-xs-semibold-uppercase flex items-center text-text-secondary">
+              <span>{parallelDetail.parallelTitle}</span>
+            </div>
+            <div
+              className="mx-2 h-px grow bg-divider-subtle"
+              style={{ background: 'linear-gradient(to right, rgba(16, 24, 40, 0.08), rgba(255, 255, 255, 0)' }}
+            ></div>
+          </div>
+          <div className={`relative pl-2 ${isCollapsed ? 'hidden' : ''}`}>
+            <div className={cn(
+              'absolute bottom-0 left-[5px] top-0 w-[2px]',
+              isHovered ? 'bg-text-accent-secondary' : 'bg-divider-subtle',
+            )}></div>
+            {parallelDetail.children!.map(renderNode)}
+          </div>
+        </div>
+      )
+    }
+    else {
+      const isHovered = hoveredParallel === node.id
+      return (
+        <div key={node.id}>
+          <div className={cn('system-2xs-medium-uppercase -mb-1.5 pl-4', isHovered ? 'text-text-tertiary' : 'text-text-quaternary')}>
+            {node?.parallelDetail?.branchTitle}
+          </div>
+          <NodePanel
+            nodeInfo={node!}
+            allExecutions={list}
+            onShowIterationDetail={handleShowIterationResultList}
+            onShowLoopDetail={handleShowLoopResultList}
+            onShowRetryDetail={handleShowRetryResultList}
+            onShowAgentOrToolLog={handleShowAgentOrToolLog}
+            hideInfo={hideNodeInfo}
+            hideProcessDetail={hideNodeProcessDetail}
+          />
+        </div>
+      )
+    }
+  }
+
+  if (showSpecialResultPanel) {
+    return (
+      <SpecialResultPanel
+        showRetryDetail={showRetryDetail}
+        setShowRetryDetailFalse={setShowRetryDetailFalse}
+        retryResultList={retryResultList}
+
+        showIteratingDetail={showIteratingDetail}
+        setShowIteratingDetailFalse={setShowIteratingDetailFalse}
+        iterationResultList={iterationResultList}
+        iterationResultDurationMap={iterationResultDurationMap}
+
+        showLoopingDetail={showLoopingDetail}
+        setShowLoopingDetailFalse={setShowLoopingDetailFalse}
+        loopResultList={loopResultList}
+        loopResultDurationMap={loopResultDurationMap}
+        loopResultVariableMap={loopResultVariableMap}
+
+        agentOrToolLogItemStack={agentOrToolLogItemStack}
+        agentOrToolLogListMap={agentOrToolLogListMap}
+        handleShowAgentOrToolLog={handleShowAgentOrToolLog}
+      />
+    )
+  }
+
+  return (
+    <div
+      className={cn('py-2', className)}
+      onClick={(e) => {
+        e.stopPropagation()
+        e.nativeEvent.stopImmediatePropagation()
+      }}
+    >
+      {treeNodes.map(renderNode)}
+    </div>
+  )
+}
+
+export default TracingPanel
diff --git a/app/components/workflow/run/utils/format-log/agent/data.ts b/app/components/workflow/run/utils/format-log/agent/data.ts
new file mode 100644
index 0000000..d90933c
--- /dev/null
+++ b/app/components/workflow/run/utils/format-log/agent/data.ts
@@ -0,0 +1,179 @@
+import { BlockEnum } from '@/app/components/workflow/types'
+
+export const agentNodeData = (() => {
+  const node = {
+    node_type: BlockEnum.Agent,
+    execution_metadata: {
+      agent_log: [
+        { id: '1', label: 'Root 1' },
+        { id: '2', parent_id: '1', label: 'Child 1.2' },
+        { id: '3', parent_id: '1', label: 'Child 1.3' },
+        { id: '4', parent_id: '2', label: 'Child 2.4' },
+        { id: '5', parent_id: '2', label: 'Child 2.5' },
+        { id: '6', parent_id: '3', label: 'Child 3.6' },
+        { id: '7', parent_id: '4', label: 'Child 4.7' },
+        { id: '8', parent_id: '4', label: 'Child 4.8' },
+        { id: '9', parent_id: '5', label: 'Child 5.9' },
+        { id: '10', parent_id: '5', label: 'Child 5.10' },
+        { id: '11', parent_id: '7', label: 'Child 7.11' },
+        { id: '12', parent_id: '7', label: 'Child 7.12' },
+        { id: '13', parent_id: '9', label: 'Child 9.13' },
+        { id: '14', parent_id: '9', label: 'Child 9.14' },
+        { id: '15', parent_id: '9', label: 'Child 9.15' },
+      ],
+    },
+  }
+
+  return {
+    in: [node],
+    expect: [{
+      ...node,
+      agentLog: [
+        {
+          id: '1',
+          label: 'Root 1',
+          children: [
+            {
+              id: '2',
+              parent_id: '1',
+              label: 'Child 1.2',
+              children: [
+                {
+                  id: '4',
+                  parent_id: '2',
+                  label: 'Child 2.4',
+                  children: [
+                    {
+                      id: '7',
+                      parent_id: '4',
+                      label: 'Child 4.7',
+                      children: [
+                        { id: '11', parent_id: '7', label: 'Child 7.11' },
+                        { id: '12', parent_id: '7', label: 'Child 7.12' },
+                      ],
+                    },
+                    { id: '8', parent_id: '4', label: 'Child 4.8' },
+                  ],
+                },
+                {
+                  id: '5',
+                  parent_id: '2',
+                  label: 'Child 2.5',
+                  children: [
+                    {
+                      id: '9',
+                      parent_id: '5',
+                      label: 'Child 5.9',
+                      children: [
+                        { id: '13', parent_id: '9', label: 'Child 9.13' },
+                        { id: '14', parent_id: '9', label: 'Child 9.14' },
+                        { id: '15', parent_id: '9', label: 'Child 9.15' },
+                      ],
+                    },
+                    { id: '10', parent_id: '5', label: 'Child 5.10' },
+                  ],
+                },
+              ],
+            },
+            {
+              id: '3',
+              parent_id: '1',
+              label: 'Child 1.3',
+              children: [
+                { id: '6', parent_id: '3', label: 'Child 3.6' },
+              ],
+            },
+          ],
+        },
+      ],
+    }],
+  }
+})()
+
+export const oneStepCircle = (() => {
+  const node = {
+    node_type: BlockEnum.Agent,
+    execution_metadata: {
+      agent_log: [
+        { id: '1', label: 'Node 1' },
+        { id: '1', parent_id: '1', label: 'Node 1' },
+        { id: '1', parent_id: '1', label: 'Node 1' },
+        { id: '1', parent_id: '1', label: 'Node 1' },
+        { id: '1', parent_id: '1', label: 'Node 1' },
+        { id: '1', parent_id: '1', label: 'Node 1' },
+      ],
+    },
+  }
+
+  return {
+    in: [node],
+    expect: [{
+      ...node,
+      agentLog: [
+        {
+          id: '1',
+          label: 'Node 1',
+          hasCircle: true,
+          children: [],
+        },
+      ],
+    }],
+  }
+})()
+
+export const multiStepsCircle = (() => {
+  const node = {
+    node_type: BlockEnum.Agent,
+    execution_metadata: {
+      agent_log: [
+        // 1 -> [2 -> 4 -> 1, 3]
+        { id: '1', label: 'Node 1' },
+        { id: '2', parent_id: '1', label: 'Node 2' },
+        { id: '3', parent_id: '1', label: 'Node 3' },
+        { id: '4', parent_id: '2', label: 'Node 4' },
+
+        // Loop
+        { id: '1', parent_id: '4', label: 'Node 1' },
+        { id: '2', parent_id: '1', label: 'Node 2' },
+        { id: '4', parent_id: '2', label: 'Node 4' },
+        { id: '1', parent_id: '4', label: 'Node 1' },
+        { id: '2', parent_id: '1', label: 'Node 2' },
+        { id: '4', parent_id: '2', label: 'Node 4' },
+      ],
+    },
+  }
+  // 1 -> [2(4(1(2(4...)))), 3]
+  return {
+    in: [node],
+    expect: [{
+      ...node,
+      agentLog: [
+        {
+          id: '1',
+          label: 'Node 1',
+          children: [
+            {
+              id: '2',
+              parent_id: '1',
+              label: 'Node 2',
+              children: [
+                {
+                  id: '4',
+                  parent_id: '2',
+                  label: 'Node 4',
+                  children: [],
+                  hasCircle: true,
+                },
+              ],
+            },
+            {
+              id: '3',
+              parent_id: '1',
+              label: 'Node 3',
+            },
+          ],
+        },
+      ],
+    }],
+  }
+})()
diff --git a/app/components/workflow/run/utils/format-log/agent/index.spec.ts b/app/components/workflow/run/utils/format-log/agent/index.spec.ts
new file mode 100644
index 0000000..59cf0ce
--- /dev/null
+++ b/app/components/workflow/run/utils/format-log/agent/index.spec.ts
@@ -0,0 +1,15 @@
+import format from '.'
+import { agentNodeData, multiStepsCircle, oneStepCircle } from './data'
+
+describe('agent', () => {
+  test('list should transform to tree', () => {
+    // console.log(format(agentNodeData.in as any))
+    expect(format(agentNodeData.in as any)).toEqual(agentNodeData.expect)
+  })
+
+  test('list should remove circle log item', () => {
+    // format(oneStepCircle.in as any)
+    expect(format(oneStepCircle.in as any)).toEqual(oneStepCircle.expect)
+    expect(format(multiStepsCircle.in as any)).toEqual(multiStepsCircle.expect)
+  })
+})
diff --git a/app/components/workflow/run/utils/format-log/agent/index.ts b/app/components/workflow/run/utils/format-log/agent/index.ts
new file mode 100644
index 0000000..c1f3afc
--- /dev/null
+++ b/app/components/workflow/run/utils/format-log/agent/index.ts
@@ -0,0 +1,99 @@
+import { BlockEnum } from '@/app/components/workflow/types'
+import type { AgentLogItem, AgentLogItemWithChildren, NodeTracing } from '@/types/workflow'
+import { cloneDeep } from 'lodash-es'
+
+const supportedAgentLogNodes = [BlockEnum.Agent, BlockEnum.Tool]
+
+const remove = (node: AgentLogItemWithChildren, removeId: string) => {
+  let { children } = node
+  if (!children || children.length === 0)
+    return
+
+  const hasCircle = !!children.find(c => c.id === removeId)
+  if (hasCircle) {
+    node.hasCircle = true
+    node.children = node.children.filter(c => c.id !== removeId)
+    children = node.children
+  }
+
+  children.forEach((child) => {
+    remove(child, removeId)
+  })
+}
+
+const removeRepeatedSiblings = (list: AgentLogItemWithChildren[]) => {
+  if (!list || list.length === 0)
+    return []
+
+  const result: AgentLogItemWithChildren[] = []
+  const addedItemIds: string[] = []
+  list.forEach((item) => {
+    if (!addedItemIds.includes(item.id)) {
+      result.push(item)
+      addedItemIds.push(item.id)
+    }
+  })
+  return result
+}
+
+const removeCircleLogItem = (log: AgentLogItemWithChildren) => {
+  const newLog = cloneDeep(log)
+  newLog.children = removeRepeatedSiblings(newLog.children)
+  let { id, children } = newLog
+  if (!children || children.length === 0)
+    return log
+
+  // check one step circle
+  const hasOneStepCircle = !!children.find(c => c.id === id)
+  if (hasOneStepCircle) {
+    newLog.hasCircle = true
+    newLog.children = newLog.children.filter(c => c.id !== id)
+    children = newLog.children
+  }
+
+  children.forEach((child, index) => {
+    remove(child, id) // check multi steps circle
+    children[index] = removeCircleLogItem(child)
+  })
+  return newLog
+}
+
+const listToTree = (logs: AgentLogItem[]) => {
+  if (!logs || logs.length === 0)
+    return []
+
+  const tree: AgentLogItemWithChildren[] = []
+  logs.forEach((log) => {
+    const hasParent = !!log.parent_id
+    if (hasParent) {
+      const parent = logs.find(item => item.id === log.parent_id) as AgentLogItemWithChildren
+      if (parent) {
+        if (!parent.children)
+          parent.children = []
+        parent.children.push(log as AgentLogItemWithChildren)
+      }
+    }
+    else {
+      tree.push(log as AgentLogItemWithChildren)
+    }
+  })
+  return tree
+}
+
+const format = (list: NodeTracing[]): NodeTracing[] => {
+  const result: NodeTracing[] = list.map((item) => {
+    let treeList: AgentLogItemWithChildren[] = []
+    let removedCircleTree: AgentLogItemWithChildren[] = []
+    if (supportedAgentLogNodes.includes(item.node_type) && item.execution_metadata?.agent_log && item.execution_metadata?.agent_log.length > 0)
+      treeList = listToTree(item.execution_metadata.agent_log)
+    // console.log(JSON.stringify(treeList))
+    removedCircleTree = treeList.length > 0 ? treeList.map(t => removeCircleLogItem(t)) : []
+    item.agentLog = removedCircleTree
+
+    return item
+  })
+
+  return result
+}
+
+export default format
diff --git a/app/components/workflow/run/utils/format-log/graph-to-log-struct.spec.ts b/app/components/workflow/run/utils/format-log/graph-to-log-struct.spec.ts
new file mode 100644
index 0000000..10a139e
--- /dev/null
+++ b/app/components/workflow/run/utils/format-log/graph-to-log-struct.spec.ts
@@ -0,0 +1,138 @@
+import parseDSL from './graph-to-log-struct'
+
+describe('parseDSL', () => {
+  it('should parse plain nodes correctly', () => {
+    const dsl = 'plainNode1 -> plainNode2'
+    const result = parseDSL(dsl)
+    expect(result).toEqual([
+      { id: 'plainNode1', node_id: 'plainNode1', title: 'plainNode1', execution_metadata: {}, status: 'succeeded' },
+      { id: 'plainNode2', node_id: 'plainNode2', title: 'plainNode2', execution_metadata: {}, status: 'succeeded' },
+    ])
+  })
+
+  it('should parse retry nodes correctly', () => {
+    const dsl = '(retry, retryNode, 3)'
+    const result = parseDSL(dsl)
+    expect(result).toEqual([
+      { id: 'retryNode', node_id: 'retryNode', title: 'retryNode', execution_metadata: {}, status: 'succeeded' },
+      { id: 'retryNode', node_id: 'retryNode', title: 'retryNode', execution_metadata: {}, status: 'retry' },
+      { id: 'retryNode', node_id: 'retryNode', title: 'retryNode', execution_metadata: {}, status: 'retry' },
+      { id: 'retryNode', node_id: 'retryNode', title: 'retryNode', execution_metadata: {}, status: 'retry' },
+    ])
+  })
+
+  it('should parse iteration nodes correctly', () => {
+    const dsl = '(iteration, iterationNode, plainNode1 -> plainNode2)'
+    const result = parseDSL(dsl)
+    expect(result).toEqual([
+      { id: 'iterationNode', node_id: 'iterationNode', title: 'iterationNode', node_type: 'iteration', execution_metadata: {}, status: 'succeeded' },
+      { id: 'plainNode1', node_id: 'plainNode1', title: 'plainNode1', execution_metadata: { iteration_id: 'iterationNode', iteration_index: 0 }, status: 'succeeded' },
+      { id: 'plainNode2', node_id: 'plainNode2', title: 'plainNode2', execution_metadata: { iteration_id: 'iterationNode', iteration_index: 0 }, status: 'succeeded' },
+    ])
+  })
+
+  it('should parse loop nodes correctly', () => {
+    const dsl = '(loop, loopNode, plainNode1 -> plainNode2)'
+    const result = parseDSL(dsl)
+    expect(result).toEqual([
+      { id: 'loopNode', node_id: 'loopNode', title: 'loopNode', node_type: 'loop', execution_metadata: {}, status: 'succeeded' },
+      { id: 'plainNode1', node_id: 'plainNode1', title: 'plainNode1', execution_metadata: { loop_id: 'loopNode', loop_index: 0 }, status: 'succeeded' },
+      { id: 'plainNode2', node_id: 'plainNode2', title: 'plainNode2', execution_metadata: { loop_id: 'loopNode', loop_index: 0 }, status: 'succeeded' },
+    ])
+  })
+
+  it('should parse parallel nodes correctly', () => {
+    const dsl = '(parallel, parallelNode, nodeA, nodeB -> nodeC)'
+    const result = parseDSL(dsl)
+    expect(result).toEqual([
+      { id: 'parallelNode', node_id: 'parallelNode', title: 'parallelNode', execution_metadata: { parallel_id: 'parallelNode' }, status: 'succeeded' },
+      { id: 'nodeA', node_id: 'nodeA', title: 'nodeA', execution_metadata: { parallel_id: 'parallelNode', parallel_start_node_id: 'nodeA' }, status: 'succeeded' },
+      { id: 'nodeB', node_id: 'nodeB', title: 'nodeB', execution_metadata: { parallel_id: 'parallelNode', parallel_start_node_id: 'nodeB' }, status: 'succeeded' },
+      { id: 'nodeC', node_id: 'nodeC', title: 'nodeC', execution_metadata: { parallel_id: 'parallelNode', parallel_start_node_id: 'nodeB' }, status: 'succeeded' },
+    ])
+  })
+
+  // TODO
+  // it('should handle nested parallel nodes', () => {
+  //   const dsl = '(parallel, outerParallel, (parallel, innerParallel, plainNode1 -> plainNode2) -> plainNode3)'
+  //   const result = parseDSL(dsl)
+  //   expect(result).toEqual([
+  //     {
+  //       id: 'outerParallel',
+  //       node_id: 'outerParallel',
+  //       title: 'outerParallel',
+  //       execution_metadata: { parallel_id: 'outerParallel' },
+  //       status: 'succeeded',
+  //     },
+  //     {
+  //       id: 'innerParallel',
+  //       node_id: 'innerParallel',
+  //       title: 'innerParallel',
+  //       execution_metadata: { parallel_id: 'outerParallel', parallel_start_node_id: 'innerParallel' },
+  //       status: 'succeeded',
+  //     },
+  //     {
+  //       id: 'plainNode1',
+  //       node_id: 'plainNode1',
+  //       title: 'plainNode1',
+  //       execution_metadata: {
+  //         parallel_id: 'innerParallel',
+  //         parallel_start_node_id: 'plainNode1',
+  //         parent_parallel_id: 'outerParallel',
+  //         parent_parallel_start_node_id: 'innerParallel',
+  //       },
+  //       status: 'succeeded',
+  //     },
+  //     {
+  //       id: 'plainNode2',
+  //       node_id: 'plainNode2',
+  //       title: 'plainNode2',
+  //       execution_metadata: {
+  //         parallel_id: 'innerParallel',
+  //         parallel_start_node_id: 'plainNode1',
+  //         parent_parallel_id: 'outerParallel',
+  //         parent_parallel_start_node_id: 'innerParallel',
+  //       },
+  //       status: 'succeeded',
+  //     },
+  //     {
+  //       id: 'plainNode3',
+  //       node_id: 'plainNode3',
+  //       title: 'plainNode3',
+  //       execution_metadata: {
+  //         parallel_id: 'outerParallel',
+  //         parallel_start_node_id: 'innerParallel',
+  //       },
+  //       status: 'succeeded',
+  //     },
+  //   ])
+  // })
+
+  // iterations not support nested iterations
+  // it('should handle nested iterations', () => {
+  //   const dsl = '(iteration, outerIteration, (iteration, innerIteration -> plainNode1 -> plainNode2))'
+  //   const result = parseDSL(dsl)
+  //   expect(result).toEqual([
+  //     { id: 'outerIteration', node_id: 'outerIteration', title: 'outerIteration', node_type: 'iteration', execution_metadata: {}, status: 'succeeded' },
+  //     { id: 'innerIteration', node_id: 'innerIteration', title: 'innerIteration', node_type: 'iteration', execution_metadata: { iteration_id: 'outerIteration', iteration_index: 0 }, status: 'succeeded' },
+  //     { id: 'plainNode1', node_id: 'plainNode1', title: 'plainNode1', execution_metadata: { iteration_id: 'innerIteration', iteration_index: 0 }, status: 'succeeded' },
+  //     { id: 'plainNode2', node_id: 'plainNode2', title: 'plainNode2', execution_metadata: { iteration_id: 'innerIteration', iteration_index: 0 }, status: 'succeeded' },
+  //   ])
+  // })
+
+  // it('should handle nested iterations within parallel nodes', () => {
+  //   const dsl = '(parallel, parallelNode, (iteration, iterationNode, plainNode1, plainNode2))'
+  //   const result = parseDSL(dsl)
+  //   expect(result).toEqual([
+  //     { id: 'parallelNode', node_id: 'parallelNode', title: 'parallelNode', execution_metadata: { parallel_id: 'parallelNode' }, status: 'succeeded' },
+  //     { id: 'iterationNode', node_id: 'iterationNode', title: 'iterationNode', node_type: 'iteration', execution_metadata: { parallel_id: 'parallelNode', parallel_start_node_id: 'iterationNode' }, status: 'succeeded' },
+  //     { id: 'plainNode1', node_id: 'plainNode1', title: 'plainNode1', execution_metadata: { iteration_id: 'iterationNode', iteration_index: 0, parallel_id: 'parallelNode', parallel_start_node_id: 'iterationNode' }, status: 'succeeded' },
+  //     { id: 'plainNode2', node_id: 'plainNode2', title: 'plainNode2', execution_metadata: { iteration_id: 'iterationNode', iteration_index: 0, parallel_id: 'parallelNode', parallel_start_node_id: 'iterationNode' }, status: 'succeeded' },
+  //   ])
+  // })
+
+  it('should throw an error for unknown node types', () => {
+    const dsl = '(unknown, nodeId)'
+    expect(() => parseDSL(dsl)).toThrowError('Unknown nodeType: unknown')
+  })
+})
diff --git a/app/components/workflow/run/utils/format-log/graph-to-log-struct.ts b/app/components/workflow/run/utils/format-log/graph-to-log-struct.ts
new file mode 100644
index 0000000..741fa08
--- /dev/null
+++ b/app/components/workflow/run/utils/format-log/graph-to-log-struct.ts
@@ -0,0 +1,356 @@
+type IterationInfo = { iterationId: string; iterationIndex: number }
+type LoopInfo = { loopId: string; loopIndex: number }
+type NodePlain = { nodeType: 'plain'; nodeId: string; } & (Partial<IterationInfo> & Partial<LoopInfo>)
+type NodeComplex = { nodeType: string; nodeId: string; params: (NodePlain | (NodeComplex & (Partial<IterationInfo> & Partial<LoopInfo>)) | Node[] | number)[] } & (Partial<IterationInfo> & Partial<LoopInfo>)
+type Node = NodePlain | NodeComplex
+
+/**
+ * Parses a DSL string into an array of node objects.
+ * @param dsl - The input DSL string.
+ * @returns An array of parsed nodes.
+ */
+function parseDSL(dsl: string): NodeData[] {
+  return convertToNodeData(parseTopLevelFlow(dsl).map(nodeStr => parseNode(nodeStr)))
+}
+
+/**
+ * Splits a top-level flow string by "->", respecting nested structures.
+ * @param dsl - The DSL string to split.
+ * @returns An array of top-level segments.
+ */
+function parseTopLevelFlow(dsl: string): string[] {
+  const segments: string[] = []
+  let buffer = ''
+  let nested = 0
+
+  for (let i = 0; i < dsl.length; i++) {
+    const char = dsl[i]
+    if (char === '(') nested++
+    if (char === ')') nested--
+    if (char === '-' && dsl[i + 1] === '>' && nested === 0) {
+      segments.push(buffer.trim())
+      buffer = ''
+      i++ // Skip the ">" character
+    }
+    else {
+      buffer += char
+    }
+  }
+  if (buffer.trim())
+    segments.push(buffer.trim())
+
+  return segments
+}
+
+/**
+ * Parses a single node string.
+ * If the node is complex (e.g., has parentheses), it extracts the node type, node ID, and parameters.
+ * @param nodeStr - The node string to parse.
+ * @param parentIterationId - The ID of the parent iteration node (if applicable).
+ * @param parentLoopId - The ID of the parent loop node (if applicable).
+ * @returns A parsed node object.
+ */
+function parseNode(nodeStr: string, parentIterationId?: string, parentLoopId?: string): Node {
+  // Check if the node is a complex node
+  if (nodeStr.startsWith('(') && nodeStr.endsWith(')')) {
+    const innerContent = nodeStr.slice(1, -1).trim() // Remove outer parentheses
+    let nested = 0
+    let buffer = ''
+    const parts: string[] = []
+
+    // Split the inner content by commas, respecting nested parentheses
+    for (let i = 0; i < innerContent.length; i++) {
+      const char = innerContent[i]
+      if (char === '(') nested++
+      if (char === ')') nested--
+
+      if (char === ',' && nested === 0) {
+        parts.push(buffer.trim())
+        buffer = ''
+      }
+      else {
+        buffer += char
+      }
+    }
+    parts.push(buffer.trim())
+
+    // Extract nodeType, nodeId, and params
+    const [nodeType, nodeId, ...paramsRaw] = parts
+    const params = parseParams(paramsRaw, nodeType === 'iteration' ? nodeId.trim() : parentIterationId, nodeType === 'loop' ? nodeId.trim() : parentLoopId)
+    const complexNode = {
+      nodeType: nodeType.trim(),
+      nodeId: nodeId.trim(),
+      params,
+    }
+    if (parentIterationId) {
+      (complexNode as any).iterationId = parentIterationId;
+      (complexNode as any).iterationIndex = 0 // Fixed as 0
+    }
+    if (parentLoopId) {
+      (complexNode as any).loopId = parentLoopId;
+      (complexNode as any).loopIndex = 0 // Fixed as 0
+    }
+    return complexNode
+  }
+
+  // If it's not a complex node, treat it as a plain node
+  const plainNode: NodePlain = { nodeType: 'plain', nodeId: nodeStr.trim() }
+  if (parentIterationId) {
+    plainNode.iterationId = parentIterationId
+    plainNode.iterationIndex = 0 // Fixed as 0
+  }
+  if (parentLoopId) {
+    plainNode.loopId = parentLoopId
+    plainNode.loopIndex = 0 // Fixed as 0
+  }
+  return plainNode
+}
+
+/**
+ * Parses parameters of a complex node.
+ * Supports nested flows and complex sub-nodes.
+ * Adds iteration-specific metadata recursively.
+ * @param paramParts - The parameters string split by commas.
+ * @param parentIterationId - The ID of the parent iteration node (if applicable).
+ * @param parentLoopId - The ID of the parent loop node (if applicable).
+ * @returns An array of parsed parameters (plain nodes, nested nodes, or flows).
+ */
+function parseParams(paramParts: string[], parentIteration?: string, parentLoopId?: string): (Node | Node[] | number)[] {
+  return paramParts.map((part) => {
+    if (part.includes('->')) {
+      // Parse as a flow and return an array of nodes
+      return parseTopLevelFlow(part).map(node => parseNode(node, parentIteration || undefined, parentLoopId || undefined))
+    }
+    else if (part.startsWith('(')) {
+      // Parse as a nested complex node
+      return parseNode(part, parentIteration || undefined, parentLoopId || undefined)
+    }
+    else if (!Number.isNaN(Number(part.trim()))) {
+      // Parse as a numeric parameter
+      return Number(part.trim())
+    }
+    else {
+      // Parse as a plain node
+      return parseNode(part, parentIteration || undefined, parentLoopId || undefined)
+    }
+  })
+}
+
+type NodeData = {
+  id: string;
+  node_id: string;
+  title: string;
+  node_type?: string;
+  execution_metadata: Record<string, any>;
+  status: string;
+}
+
+/**
+ * Converts a plain node to node data.
+ */
+function convertPlainNode(node: Node): NodeData[] {
+  return [
+    {
+      id: node.nodeId,
+      node_id: node.nodeId,
+      title: node.nodeId,
+      execution_metadata: {},
+      status: 'succeeded',
+    },
+  ]
+}
+
+/**
+ * Converts a retry node to node data.
+ */
+function convertRetryNode(node: Node): NodeData[] {
+  const { nodeId, iterationId, iterationIndex, loopId, loopIndex, params } = node as NodeComplex
+  const retryCount = params ? Number.parseInt(params[0] as unknown as string, 10) : 0
+  const result: NodeData[] = [
+    {
+      id: nodeId,
+      node_id: nodeId,
+      title: nodeId,
+      execution_metadata: {},
+      status: 'succeeded',
+    },
+  ]
+
+  for (let i = 0; i < retryCount; i++) {
+    result.push({
+      id: nodeId,
+      node_id: nodeId,
+      title: nodeId,
+      execution_metadata: iterationId ? {
+        iteration_id: iterationId,
+        iteration_index: iterationIndex || 0,
+      } : loopId ? {
+        loop_id: loopId,
+        loop_index: loopIndex || 0,
+      } : {},
+      status: 'retry',
+    })
+  }
+
+  return result
+}
+
+/**
+ * Converts an iteration node to node data.
+ */
+function convertIterationNode(node: Node): NodeData[] {
+  const { nodeId, params } = node as NodeComplex
+  const result: NodeData[] = [
+    {
+      id: nodeId,
+      node_id: nodeId,
+      title: nodeId,
+      node_type: 'iteration',
+      status: 'succeeded',
+      execution_metadata: {},
+    },
+  ]
+
+  params?.forEach((param: any) => {
+    if (Array.isArray(param)) {
+      param.forEach((childNode: Node) => {
+        const childData = convertToNodeData([childNode])
+        childData.forEach((data) => {
+          data.execution_metadata = {
+            ...data.execution_metadata,
+            iteration_id: nodeId,
+            iteration_index: 0,
+          }
+        })
+        result.push(...childData)
+      })
+    }
+  })
+
+  return result
+}
+
+/**
+ * Converts an loop node to node data.
+ */
+function convertLoopNode(node: Node): NodeData[] {
+  const { nodeId, params } = node as NodeComplex
+  const result: NodeData[] = [
+    {
+      id: nodeId,
+      node_id: nodeId,
+      title: nodeId,
+      node_type: 'loop',
+      status: 'succeeded',
+      execution_metadata: {},
+    },
+  ]
+
+  params?.forEach((param: any) => {
+    if (Array.isArray(param)) {
+      param.forEach((childNode: Node) => {
+        const childData = convertToNodeData([childNode])
+        childData.forEach((data) => {
+          data.execution_metadata = {
+            ...data.execution_metadata,
+            loop_id: nodeId,
+            loop_index: 0,
+          }
+        })
+        result.push(...childData)
+      })
+    }
+  })
+
+  return result
+}
+
+/**
+ * Converts a parallel node to node data.
+ */
+function convertParallelNode(node: Node, parentParallelId?: string, parentStartNodeId?: string): NodeData[] {
+  const { nodeId, params } = node as NodeComplex
+  const result: NodeData[] = [
+    {
+      id: nodeId,
+      node_id: nodeId,
+      title: nodeId,
+      execution_metadata: {
+        parallel_id: nodeId,
+      },
+      status: 'succeeded',
+    },
+  ]
+
+  params?.forEach((param) => {
+    if (Array.isArray(param)) {
+      const startNodeId = param[0]?.nodeId
+      param.forEach((childNode: Node) => {
+        const childData = convertToNodeData([childNode])
+        childData.forEach((data) => {
+          data.execution_metadata = {
+            ...data.execution_metadata,
+            parallel_id: nodeId,
+            parallel_start_node_id: startNodeId,
+            ...(parentParallelId && {
+              parent_parallel_id: parentParallelId,
+              parent_parallel_start_node_id: parentStartNodeId,
+            }),
+          }
+        })
+        result.push(...childData)
+      })
+    }
+    else if (param && typeof param === 'object') {
+      const startNodeId = param.nodeId
+      const childData = convertToNodeData([param])
+      childData.forEach((data) => {
+        data.execution_metadata = {
+          ...data.execution_metadata,
+          parallel_id: nodeId,
+          parallel_start_node_id: startNodeId,
+          ...(parentParallelId && {
+            parent_parallel_id: parentParallelId,
+            parent_parallel_start_node_id: parentStartNodeId,
+          }),
+        }
+      })
+      result.push(...childData)
+    }
+  })
+
+  return result
+}
+
+/**
+ * Main function to convert nodes to node data.
+ */
+function convertToNodeData(nodes: Node[], parentParallelId?: string, parentStartNodeId?: string): NodeData[] {
+  const result: NodeData[] = []
+
+  nodes.forEach((node) => {
+    switch (node.nodeType) {
+      case 'plain':
+        result.push(...convertPlainNode(node))
+        break
+      case 'retry':
+        result.push(...convertRetryNode(node))
+        break
+      case 'iteration':
+        result.push(...convertIterationNode(node))
+        break
+      case 'loop':
+        result.push(...convertLoopNode(node))
+        break
+      case 'parallel':
+        result.push(...convertParallelNode(node, parentParallelId, parentStartNodeId))
+        break
+      default:
+        throw new Error(`Unknown nodeType: ${node.nodeType}`)
+    }
+  })
+
+  return result
+}
+
+export default parseDSL
diff --git a/app/components/workflow/run/utils/format-log/index.ts b/app/components/workflow/run/utils/format-log/index.ts
new file mode 100644
index 0000000..4f97814
--- /dev/null
+++ b/app/components/workflow/run/utils/format-log/index.ts
@@ -0,0 +1,98 @@
+import type { NodeTracing } from '@/types/workflow'
+import { addChildrenToIterationNode } from './iteration'
+import { addChildrenToLoopNode } from './loop'
+import formatParallelNode from './parallel'
+import formatRetryNode from './retry'
+import formatAgentNode from './agent'
+import { cloneDeep } from 'lodash-es'
+import { BlockEnum } from '../../../types'
+
+const formatIterationAndLoopNode = (list: NodeTracing[], t: any) => {
+  const clonedList = cloneDeep(list)
+
+  // Identify all loop and iteration nodes
+  const loopNodeIds = clonedList
+    .filter(item => item.node_type === BlockEnum.Loop)
+    .map(item => item.node_id)
+
+  const iterationNodeIds = clonedList
+    .filter(item => item.node_type === BlockEnum.Iteration)
+    .map(item => item.node_id)
+
+  // Identify all child nodes for both loop and iteration
+  const loopChildrenNodeIds = clonedList
+    .filter(item => item.execution_metadata?.loop_id && loopNodeIds.includes(item.execution_metadata.loop_id))
+    .map(item => item.node_id)
+
+  const iterationChildrenNodeIds = clonedList
+    .filter(item => item.execution_metadata?.iteration_id && iterationNodeIds.includes(item.execution_metadata.iteration_id))
+    .map(item => item.node_id)
+
+  // Filter out child nodes as they will be included in their parent nodes
+  const result = clonedList
+    .filter(item => !loopChildrenNodeIds.includes(item.node_id) && !iterationChildrenNodeIds.includes(item.node_id))
+    .map((item) => {
+      // Process Loop nodes
+      if (item.node_type === BlockEnum.Loop) {
+        const childrenNodes = clonedList.filter(child => child.execution_metadata?.loop_id === item.node_id)
+        const error = childrenNodes.find(child => child.status === 'failed')
+        if (error) {
+          item.status = 'failed'
+          item.error = error.error
+        }
+        const addedChildrenList = addChildrenToLoopNode(item, childrenNodes)
+
+        // Handle parallel nodes in loop node
+        if (addedChildrenList.details && addedChildrenList.details.length > 0) {
+          addedChildrenList.details = addedChildrenList.details.map((row) => {
+            return formatParallelNode(row, t)
+          })
+        }
+        return addedChildrenList
+      }
+
+      // Process Iteration nodes
+      if (item.node_type === BlockEnum.Iteration) {
+        const childrenNodes = clonedList.filter(child => child.execution_metadata?.iteration_id === item.node_id)
+        const error = childrenNodes.find(child => child.status === 'failed')
+        if (error) {
+          item.status = 'failed'
+          item.error = error.error
+        }
+        const addedChildrenList = addChildrenToIterationNode(item, childrenNodes)
+
+        // Handle parallel nodes in iteration node
+        if (addedChildrenList.details && addedChildrenList.details.length > 0) {
+          addedChildrenList.details = addedChildrenList.details.map((row) => {
+            return formatParallelNode(row, t)
+          })
+        }
+        return addedChildrenList
+      }
+
+      return item
+    })
+
+  return result
+}
+
+const formatToTracingNodeList = (list: NodeTracing[], t: any) => {
+  const allItems = cloneDeep([...list]).sort((a, b) => a.index - b.index)
+  /*
+  * First handle not change list structure node
+  * Because Handle struct node will put the node in different
+  */
+  const formattedAgentList = formatAgentNode(allItems)
+  const formattedRetryList = formatRetryNode(formattedAgentList) // retry one node
+  // would change the structure of the list. Iteration and parallel can include each other.
+  const formattedLoopAndIterationList = formatIterationAndLoopNode(formattedRetryList, t)
+  const formattedParallelList = formatParallelNode(formattedLoopAndIterationList, t)
+
+  const result = formattedParallelList
+  // console.log(allItems)
+  // console.log(result)
+
+  return result
+}
+
+export default formatToTracingNodeList
diff --git a/app/components/workflow/run/utils/format-log/iteration/index.spec.ts b/app/components/workflow/run/utils/format-log/iteration/index.spec.ts
new file mode 100644
index 0000000..f5feb5c
--- /dev/null
+++ b/app/components/workflow/run/utils/format-log/iteration/index.spec.ts
@@ -0,0 +1,23 @@
+import format from '.'
+import graphToLogStruct from '../graph-to-log-struct'
+import { noop } from 'lodash-es'
+
+describe('iteration', () => {
+  const list = graphToLogStruct('start -> (iteration, iterationNode, plainNode1 -> plainNode2)')
+  // const [startNode, iterationNode, ...iterations] = list
+  const result = format(list as any, noop)
+  test('result should have no nodes in iteration node', () => {
+    expect((result as any).find((item: any) => !!item.execution_metadata?.iteration_id)).toBeUndefined()
+  })
+  // test('iteration should put nodes in details', () => {
+  //   expect(result as any).toEqual([
+  //     startNode,
+  //     {
+  //       ...iterationNode,
+  //       details: [
+  //         [iterations[0], iterations[1]],
+  //       ],
+  //     },
+  //   ])
+  // })
+})
diff --git a/app/components/workflow/run/utils/format-log/iteration/index.ts b/app/components/workflow/run/utils/format-log/iteration/index.ts
new file mode 100644
index 0000000..d0224d0
--- /dev/null
+++ b/app/components/workflow/run/utils/format-log/iteration/index.ts
@@ -0,0 +1,56 @@
+import { BlockEnum } from '@/app/components/workflow/types'
+import type { NodeTracing } from '@/types/workflow'
+import formatParallelNode from '../parallel'
+
+export function addChildrenToIterationNode(iterationNode: NodeTracing, childrenNodes: NodeTracing[]): NodeTracing {
+  const details: NodeTracing[][] = []
+  childrenNodes.forEach((item, index) => {
+    if (!item.execution_metadata) return
+    const { iteration_index = 0 } = item.execution_metadata
+    const runIndex: number = iteration_index !== undefined ? iteration_index : index
+    if (!details[runIndex])
+      details[runIndex] = []
+
+    details[runIndex].push(item)
+  })
+  return {
+    ...iterationNode,
+    details,
+  }
+}
+
+const format = (list: NodeTracing[], t: any): NodeTracing[] => {
+  const iterationNodeIds = list
+    .filter(item => item.node_type === BlockEnum.Iteration)
+    .map(item => item.node_id)
+  const iterationChildrenNodeIds = list
+    .filter(item => item.execution_metadata?.iteration_id && iterationNodeIds.includes(item.execution_metadata.iteration_id))
+    .map(item => item.node_id)
+  // move iteration children nodes to iteration node's details field
+  const result = list
+    .filter(item => !iterationChildrenNodeIds.includes(item.node_id))
+    .map((item) => {
+      if (item.node_type === BlockEnum.Iteration) {
+        const childrenNodes = list.filter(child => child.execution_metadata?.iteration_id === item.node_id)
+        const error = childrenNodes.find(child => child.status === 'failed')
+        if (error) {
+          item.status = 'failed'
+          item.error = error.error
+        }
+        const addedChildrenList = addChildrenToIterationNode(item, childrenNodes)
+        // handle parallel node in iteration node
+        if (addedChildrenList.details && addedChildrenList.details.length > 0) {
+          addedChildrenList.details = addedChildrenList.details.map((row) => {
+            return formatParallelNode(row, t)
+          })
+        }
+        return addedChildrenList
+      }
+
+      return item
+    })
+
+  return result
+}
+
+export default format
diff --git a/app/components/workflow/run/utils/format-log/loop/index.spec.ts b/app/components/workflow/run/utils/format-log/loop/index.spec.ts
new file mode 100644
index 0000000..1f70cef
--- /dev/null
+++ b/app/components/workflow/run/utils/format-log/loop/index.spec.ts
@@ -0,0 +1,23 @@
+import format from '.'
+import graphToLogStruct from '../graph-to-log-struct'
+import { noop } from 'lodash-es'
+
+describe('loop', () => {
+  const list = graphToLogStruct('start -> (loop, loopNode, plainNode1 -> plainNode2)')
+  const [startNode, loopNode, ...loops] = list
+  const result = format(list as any, noop)
+  test('result should have no nodes in loop node', () => {
+    expect(result.find(item => !!item.execution_metadata?.loop_id)).toBeUndefined()
+  })
+  test('loop should put nodes in details', () => {
+    expect(result).toEqual([
+      startNode,
+      {
+        ...loopNode,
+        details: [
+          [loops[0], loops[1]],
+        ],
+      },
+    ])
+  })
+})
diff --git a/app/components/workflow/run/utils/format-log/loop/index.ts b/app/components/workflow/run/utils/format-log/loop/index.ts
new file mode 100644
index 0000000..b12e12e
--- /dev/null
+++ b/app/components/workflow/run/utils/format-log/loop/index.ts
@@ -0,0 +1,56 @@
+import { BlockEnum } from '@/app/components/workflow/types'
+import type { NodeTracing } from '@/types/workflow'
+import formatParallelNode from '../parallel'
+
+export function addChildrenToLoopNode(loopNode: NodeTracing, childrenNodes: NodeTracing[]): NodeTracing {
+  const details: NodeTracing[][] = []
+  childrenNodes.forEach((item) => {
+    if (!item.execution_metadata) return
+    const { parallel_mode_run_id, loop_index = 0 } = item.execution_metadata
+    const runIndex: number = (parallel_mode_run_id || loop_index) as number
+    if (!details[runIndex])
+      details[runIndex] = []
+
+    details[runIndex].push(item)
+  })
+  return {
+    ...loopNode,
+    details,
+  }
+}
+
+const format = (list: NodeTracing[], t: any): NodeTracing[] => {
+  const loopNodeIds = list
+    .filter(item => item.node_type === BlockEnum.Loop)
+    .map(item => item.node_id)
+  const loopChildrenNodeIds = list
+    .filter(item => item.execution_metadata?.loop_id && loopNodeIds.includes(item.execution_metadata.loop_id))
+    .map(item => item.node_id)
+  // move loop children nodes to loop node's details field
+  const result = list
+    .filter(item => !loopChildrenNodeIds.includes(item.node_id))
+    .map((item) => {
+      if (item.node_type === BlockEnum.Loop) {
+        const childrenNodes = list.filter(child => child.execution_metadata?.loop_id === item.node_id)
+        const error = childrenNodes.find(child => child.status === 'failed')
+        if (error) {
+          item.status = 'failed'
+          item.error = error.error
+        }
+        const addedChildrenList = addChildrenToLoopNode(item, childrenNodes)
+        // handle parallel node in loop node
+        if (addedChildrenList.details && addedChildrenList.details.length > 0) {
+          addedChildrenList.details = addedChildrenList.details.map((row) => {
+            return formatParallelNode(row, t)
+          })
+        }
+        return addedChildrenList
+      }
+
+      return item
+    })
+
+  return result
+}
+
+export default format
diff --git a/app/components/workflow/run/utils/format-log/parallel/index.ts b/app/components/workflow/run/utils/format-log/parallel/index.ts
new file mode 100644
index 0000000..f5a1136
--- /dev/null
+++ b/app/components/workflow/run/utils/format-log/parallel/index.ts
@@ -0,0 +1,175 @@
+import { BlockEnum } from '@/app/components/workflow/types'
+import type { NodeTracing } from '@/types/workflow'
+
+function printNodeStructure(node: NodeTracing, depth: number) {
+  const indent = '  '.repeat(depth)
+  console.log(`${indent}${node.title}`)
+  if (node.parallelDetail?.children) {
+    node.parallelDetail.children.forEach((child) => {
+      printNodeStructure(child, depth + 1)
+    })
+  }
+}
+
+function addTitle({
+  list, depth, belongParallelIndexInfo,
+}: {
+  list: NodeTracing[],
+  depth: number,
+  belongParallelIndexInfo?: string,
+}, t: any) {
+  let branchIndex = 0
+  const hasMoreThanOneParallel = list.filter(node => node.parallelDetail?.isParallelStartNode).length > 1
+  list.forEach((node) => {
+    const parallel_id = node.parallel_id ?? node.execution_metadata?.parallel_id ?? null
+    const parallel_start_node_id = node.parallel_start_node_id ?? node.execution_metadata?.parallel_start_node_id ?? null
+
+    const isNotInParallel = !parallel_id || node.node_type === BlockEnum.End
+    if (isNotInParallel)
+      return
+
+    const isParallelStartNode = node.parallelDetail?.isParallelStartNode
+
+    const parallelIndexLetter = (() => {
+      if (!isParallelStartNode || !hasMoreThanOneParallel)
+        return ''
+
+      const index = 1 + list.filter(node => node.parallelDetail?.isParallelStartNode).findIndex(item => item.node_id === node.node_id)
+      return String.fromCharCode(64 + index)
+    })()
+
+    const parallelIndexInfo = `${depth}${parallelIndexLetter}`
+
+    if (isParallelStartNode) {
+      node.parallelDetail!.isParallelStartNode = true
+      node.parallelDetail!.parallelTitle = `${t('workflow.common.parallel')}-${parallelIndexInfo}`
+    }
+
+    const isBrachStartNode = parallel_start_node_id === node.node_id
+    if (isBrachStartNode) {
+      branchIndex++
+      const branchLetter = String.fromCharCode(64 + branchIndex)
+      if (!node.parallelDetail) {
+        node.parallelDetail = {
+          branchTitle: '',
+        }
+      }
+
+      node.parallelDetail!.branchTitle = `${t('workflow.common.branch')}-${belongParallelIndexInfo}-${branchLetter}`
+    }
+
+    if (node.parallelDetail?.children && node.parallelDetail.children.length > 0) {
+      addTitle({
+        list: node.parallelDetail.children,
+        depth: depth + 1,
+        belongParallelIndexInfo: parallelIndexInfo,
+      }, t)
+    }
+  })
+}
+
+// list => group by parallel_id(parallel tree).
+const format = (list: NodeTracing[], t: any, isPrint?: boolean): NodeTracing[] => {
+  if (isPrint)
+    console.log(list)
+
+  const result: NodeTracing[] = [...list]
+  // list to tree by parent_parallel_start_node_id and branch by parallel_start_node_id. Each parallel may has more than one branch.
+  result.forEach((node) => {
+    const parallel_id = node.parallel_id ?? node.execution_metadata?.parallel_id ?? null
+    const parallel_start_node_id = node.parallel_start_node_id ?? node.execution_metadata?.parallel_start_node_id ?? null
+    const parent_parallel_id = node.parent_parallel_id ?? node.execution_metadata?.parent_parallel_id ?? null
+    const branchStartNodeId = node.parallel_start_node_id ?? node.execution_metadata?.parallel_start_node_id ?? null
+    const parentParallelBranchStartNodeId = node.parent_parallel_start_node_id ?? node.execution_metadata?.parent_parallel_start_node_id ?? null
+    const isNotInParallel = !parallel_id || node.node_type === BlockEnum.End
+    if (isNotInParallel)
+      return
+
+    const isParallelStartNode = parallel_start_node_id === node.node_id // in the same parallel has more than one start node
+    if (isParallelStartNode) {
+      const selfNode = { ...node, parallelDetail: undefined }
+      node.parallelDetail = {
+        isParallelStartNode: true,
+        children: [selfNode],
+      }
+      const isRootLevel = !parent_parallel_id
+      if (isRootLevel)
+        return
+
+      const parentParallelStartNode = result.find(item => item.node_id === parentParallelBranchStartNodeId)
+      // append to parent parallel start node and after the same branch
+      if (parentParallelStartNode) {
+        if (!parentParallelStartNode?.parallelDetail) {
+          parentParallelStartNode!.parallelDetail = {
+            children: [],
+          }
+        }
+        if (parentParallelStartNode!.parallelDetail.children) {
+          const sameBranchNodesLastIndex = parentParallelStartNode.parallelDetail.children.findLastIndex((node) => {
+            const currStartNodeId = node.parallel_start_node_id ?? node.execution_metadata?.parallel_start_node_id ?? null
+            return currStartNodeId === parentParallelBranchStartNodeId
+          })
+          if (sameBranchNodesLastIndex !== -1)
+            parentParallelStartNode!.parallelDetail.children.splice(sameBranchNodesLastIndex + 1, 0, node)
+          else
+            parentParallelStartNode!.parallelDetail.children.push(node)
+        }
+      }
+      return
+    }
+
+    // append to parallel start node and after the same branch
+    const parallelStartNode = result.find(item => parallel_start_node_id === item.node_id)
+
+    if (parallelStartNode && parallelStartNode.parallelDetail && parallelStartNode!.parallelDetail!.children) {
+      const sameBranchNodesLastIndex = parallelStartNode.parallelDetail.children.findLastIndex((node) => {
+        const currStartNodeId = node.parallel_start_node_id ?? node.execution_metadata?.parallel_start_node_id ?? null
+        return currStartNodeId === branchStartNodeId
+      })
+      if (sameBranchNodesLastIndex !== -1) {
+        parallelStartNode.parallelDetail.children.splice(sameBranchNodesLastIndex + 1, 0, node)
+      }
+      else { // new branch
+        parallelStartNode.parallelDetail.children.push(node)
+      }
+    }
+    // parallelStartNode!.parallelDetail!.children.push(node)
+  })
+
+  const filteredInParallelSubNodes = result.filter((node) => {
+    const parallel_id = node.parallel_id ?? node.execution_metadata?.parallel_id ?? null
+    const isNotInParallel = !parallel_id || node.node_type === BlockEnum.End
+    if (isNotInParallel)
+      return true
+
+    const parent_parallel_id = node.parent_parallel_id ?? node.execution_metadata?.parent_parallel_id ?? null
+
+    if (parent_parallel_id)
+      return false
+
+    const isParallelStartNode = node.parallelDetail?.isParallelStartNode
+    // eslint-disable-next-line sonarjs/prefer-single-boolean-return
+    if (!isParallelStartNode)
+      return false
+
+    return true
+  })
+
+  // print node structure for debug
+  if (isPrint) {
+    filteredInParallelSubNodes.forEach((node) => {
+      const now = Date.now()
+      console.log(`----- p: ${now} start -----`)
+      printNodeStructure(node, 0)
+      console.log(`----- p: ${now} end -----`)
+    })
+  }
+
+  addTitle({
+    list: filteredInParallelSubNodes,
+    depth: 1,
+  }, t)
+
+  return filteredInParallelSubNodes
+}
+export default format
diff --git a/app/components/workflow/run/utils/format-log/retry/index.spec.ts b/app/components/workflow/run/utils/format-log/retry/index.spec.ts
new file mode 100644
index 0000000..2ce9554
--- /dev/null
+++ b/app/components/workflow/run/utils/format-log/retry/index.spec.ts
@@ -0,0 +1,21 @@
+import format from '.'
+import graphToLogStruct from '../graph-to-log-struct'
+
+describe('retry', () => {
+  // retry nodeId:1 3 times.
+  const steps = graphToLogStruct('start -> (retry, retryNode, 3)')
+  const [startNode, retryNode, ...retryDetail] = steps
+  const result = format(steps as any)
+  test('should have no retry status nodes', () => {
+    expect(result.find(item => item.status === 'retry')).toBeUndefined()
+  })
+  test('should put retry nodes in retryDetail', () => {
+    expect(result).toEqual([
+      startNode,
+      {
+        ...retryNode,
+        retryDetail,
+      },
+    ])
+  })
+})
diff --git a/app/components/workflow/run/utils/format-log/retry/index.ts b/app/components/workflow/run/utils/format-log/retry/index.ts
new file mode 100644
index 0000000..5226f79
--- /dev/null
+++ b/app/components/workflow/run/utils/format-log/retry/index.ts
@@ -0,0 +1,43 @@
+import type { NodeTracing } from '@/types/workflow'
+
+const format = (list: NodeTracing[]): NodeTracing[] => {
+  const retryNodes = list.filter((item) => {
+    return item.status === 'retry'
+  })
+
+  const retryNodeIds = retryNodes.map(item => item.node_id)
+  // move retry nodes to retryDetail
+  const result = list.filter((item) => {
+    return item.status !== 'retry'
+  }).map((item) => {
+    const { execution_metadata } = item
+    const isInIteration = !!execution_metadata?.iteration_id
+    const isInLoop = !!execution_metadata?.loop_id
+    const nodeId = item.node_id
+    const isRetryBelongNode = retryNodeIds.includes(nodeId)
+
+    if (isRetryBelongNode) {
+      return {
+        ...item,
+        retryDetail: retryNodes.filter((node) => {
+          if (!isInIteration && !isInLoop)
+            return node.node_id === nodeId
+
+          // retry node in iteration
+          if (isInIteration)
+            return node.node_id === nodeId && node.execution_metadata?.iteration_index === execution_metadata?.iteration_index
+
+          // retry node in loop
+          if (isInLoop)
+            return node.node_id === nodeId && node.execution_metadata?.loop_index === execution_metadata?.loop_index
+
+          return false
+        }),
+      }
+    }
+    return item
+  })
+  return result
+}
+
+export default format
diff --git a/app/components/workflow/shortcuts-name.tsx b/app/components/workflow/shortcuts-name.tsx
new file mode 100644
index 0000000..8d96bdf
--- /dev/null
+++ b/app/components/workflow/shortcuts-name.tsx
@@ -0,0 +1,32 @@
+import { memo } from 'react'
+import { getKeyboardKeyNameBySystem } from './utils'
+import cn from '@/utils/classnames'
+
+type ShortcutsNameProps = {
+  keys: string[]
+  className?: string
+}
+const ShortcutsName = ({
+  keys,
+  className,
+}: ShortcutsNameProps) => {
+  return (
+    <div className={cn(
+      'flex items-center gap-0.5',
+      className,
+    )}>
+      {
+        keys.map(key => (
+          <div
+            key={key}
+            className='system-kbd flex h-4 w-4 items-center justify-center rounded-[4px] bg-components-kbd-bg-gray capitalize'
+          >
+            {getKeyboardKeyNameBySystem(key)}
+          </div>
+        ))
+      }
+    </div>
+  )
+}
+
+export default memo(ShortcutsName)
diff --git a/app/components/workflow/simple-node/constants.ts b/app/components/workflow/simple-node/constants.ts
new file mode 100644
index 0000000..8a36636
--- /dev/null
+++ b/app/components/workflow/simple-node/constants.ts
@@ -0,0 +1 @@
+export const CUSTOM_SIMPLE_NODE = 'custom-simple'
diff --git a/app/components/workflow/simple-node/index.tsx b/app/components/workflow/simple-node/index.tsx
new file mode 100644
index 0000000..4af8a5c
--- /dev/null
+++ b/app/components/workflow/simple-node/index.tsx
@@ -0,0 +1,148 @@
+import type {
+  FC,
+} from 'react'
+import {
+  memo,
+  useMemo,
+} from 'react'
+import {
+  RiAlertFill,
+  RiCheckboxCircleFill,
+  RiErrorWarningFill,
+  RiLoader2Line,
+} from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import {
+  NodeTargetHandle,
+} from '@/app/components/workflow/nodes/_base/components/node-handle'
+import NodeControl from '@/app/components/workflow/nodes/_base/components/node-control'
+import cn from '@/utils/classnames'
+import BlockIcon from '@/app/components/workflow/block-icon'
+import type {
+  NodeProps,
+} from '@/app/components/workflow/types'
+import {
+  NodeRunningStatus,
+} from '@/app/components/workflow/types'
+import {
+  useNodesReadOnly,
+} from '@/app/components/workflow/hooks'
+
+type SimpleNodeProps = NodeProps
+
+const SimpleNode: FC<SimpleNodeProps> = ({
+  id,
+  data,
+}) => {
+  const { t } = useTranslation()
+  const { nodesReadOnly } = useNodesReadOnly()
+
+  const showSelectedBorder = data.selected || data._isBundled || data._isEntering
+  const {
+    showRunningBorder,
+    showSuccessBorder,
+    showFailedBorder,
+    showExceptionBorder,
+  } = useMemo(() => {
+    return {
+      showRunningBorder: data._runningStatus === NodeRunningStatus.Running && !showSelectedBorder,
+      showSuccessBorder: data._runningStatus === NodeRunningStatus.Succeeded && !showSelectedBorder,
+      showFailedBorder: data._runningStatus === NodeRunningStatus.Failed && !showSelectedBorder,
+      showExceptionBorder: data._runningStatus === NodeRunningStatus.Exception && !showSelectedBorder,
+    }
+  }, [data._runningStatus, showSelectedBorder])
+
+  return (
+    <div
+      className={cn(
+        'flex rounded-2xl border-[2px]',
+        showSelectedBorder ? 'border-components-option-card-option-selected-border' : 'border-transparent',
+        !showSelectedBorder && data._inParallelHovering && 'border-workflow-block-border-highlight',
+        data._waitingRun && 'opacity-70',
+      )}
+      style={{
+        width: 'auto',
+        height: 'auto',
+      }}
+    >
+      <div
+        className={cn(
+          'group relative pb-1 shadow-xs',
+          'rounded-[15px] border border-transparent',
+          'w-[240px] bg-workflow-block-bg',
+          !data._runningStatus && 'hover:shadow-lg',
+          showRunningBorder && '!border-state-accent-solid',
+          showSuccessBorder && '!border-state-success-solid',
+          showFailedBorder && '!border-state-destructive-solid',
+          showExceptionBorder && '!border-state-warning-solid',
+          data._isBundled && '!shadow-lg',
+        )}
+      >
+        {
+          data._inParallelHovering && (
+            <div className='top system-2xs-medium-uppercase absolute -top-2.5 left-2 z-10 text-text-tertiary'>
+              {t('workflow.common.parallelRun')}
+            </div>
+          )
+        }
+        {
+          !data._isCandidate && (
+            <NodeTargetHandle
+              id={id}
+              data={data}
+              handleClassName='!top-4 !-left-[9px] !translate-y-0'
+              handleId='target'
+            />
+          )
+        }
+        {
+          !data._runningStatus && !nodesReadOnly && !data._isCandidate && (
+            <NodeControl
+              id={id}
+              data={data}
+            />
+          )
+        }
+        <div className={cn(
+          'flex items-center rounded-t-2xl px-3 pb-2 pt-3',
+        )}>
+          <BlockIcon
+            className='mr-2 shrink-0'
+            type={data.type}
+            size='md'
+          />
+          <div
+            title={data.title}
+            className='system-sm-semibold-uppercase mr-1 flex grow items-center truncate text-text-primary'
+          >
+            <div>
+              {data.title}
+            </div>
+          </div>
+          {
+            (data._runningStatus === NodeRunningStatus.Running || data._singleRunningStatus === NodeRunningStatus.Running) && (
+              <RiLoader2Line className='h-3.5 w-3.5 animate-spin text-text-accent' />
+            )
+          }
+          {
+            data._runningStatus === NodeRunningStatus.Succeeded && (
+              <RiCheckboxCircleFill className='h-3.5 w-3.5 text-text-success' />
+            )
+          }
+          {
+            data._runningStatus === NodeRunningStatus.Failed && (
+              <RiErrorWarningFill className='h-3.5 w-3.5 text-text-destructive' />
+            )
+          }
+          {
+            data._runningStatus === NodeRunningStatus.Exception && (
+              <RiAlertFill className='h-3.5 w-3.5 text-text-warning-secondary' />
+            )
+          }
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default memo(SimpleNode)
diff --git a/app/components/workflow/simple-node/types.ts b/app/components/workflow/simple-node/types.ts
new file mode 100644
index 0000000..8768d69
--- /dev/null
+++ b/app/components/workflow/simple-node/types.ts
@@ -0,0 +1,3 @@
+import type { CommonNodeType } from '@/app/components/workflow/types'
+
+export type SimpleNodeType = CommonNodeType
diff --git a/app/components/workflow/store/index.ts b/app/components/workflow/store/index.ts
new file mode 100644
index 0000000..61cd577
--- /dev/null
+++ b/app/components/workflow/store/index.ts
@@ -0,0 +1 @@
+export * from './workflow'
diff --git a/app/components/workflow/store/workflow/chat-variable-slice.ts b/app/components/workflow/store/workflow/chat-variable-slice.ts
new file mode 100644
index 0000000..0d81446
--- /dev/null
+++ b/app/components/workflow/store/workflow/chat-variable-slice.ts
@@ -0,0 +1,34 @@
+import type { StateCreator } from 'zustand'
+import type { ConversationVariable } from '@/app/components/workflow/types'
+
+export type ChatVariableSliceShape = {
+  showChatVariablePanel: boolean
+  setShowChatVariablePanel: (showChatVariablePanel: boolean) => void
+  showGlobalVariablePanel: boolean
+  setShowGlobalVariablePanel: (showGlobalVariablePanel: boolean) => void
+  conversationVariables: ConversationVariable[]
+  setConversationVariables: (conversationVariables: ConversationVariable[]) => void
+}
+
+export const createChatVariableSlice: StateCreator<ChatVariableSliceShape> = (set) => {
+  const hideAllPanel = {
+    showDebugAndPreviewPanel: false,
+    showEnvPanel: false,
+    showChatVariablePanel: false,
+    showGlobalVariablePanel: false,
+  }
+
+  return ({
+    showChatVariablePanel: false,
+    setShowChatVariablePanel: showChatVariablePanel => set(() => ({ showChatVariablePanel })),
+    showGlobalVariablePanel: false,
+    setShowGlobalVariablePanel: showGlobalVariablePanel => set(() => {
+      if (showGlobalVariablePanel)
+        return { ...hideAllPanel, showGlobalVariablePanel: true }
+      else
+        return { showGlobalVariablePanel: false }
+    }),
+    conversationVariables: [],
+    setConversationVariables: conversationVariables => set(() => ({ conversationVariables })),
+  })
+}
diff --git a/app/components/workflow/store/workflow/env-variable-slice.ts b/app/components/workflow/store/workflow/env-variable-slice.ts
new file mode 100644
index 0000000..de60e7d
--- /dev/null
+++ b/app/components/workflow/store/workflow/env-variable-slice.ts
@@ -0,0 +1,20 @@
+import type { StateCreator } from 'zustand'
+import type { EnvironmentVariable } from '@/app/components/workflow/types'
+
+export type EnvVariableSliceShape = {
+  showEnvPanel: boolean
+  setShowEnvPanel: (showEnvPanel: boolean) => void
+  environmentVariables: EnvironmentVariable[]
+  setEnvironmentVariables: (environmentVariables: EnvironmentVariable[]) => void
+  envSecrets: Record<string, string>
+  setEnvSecrets: (envSecrets: Record<string, string>) => void
+}
+
+export const createEnvVariableSlice: StateCreator<EnvVariableSliceShape> = set => ({
+  showEnvPanel: false,
+  setShowEnvPanel: showEnvPanel => set(() => ({ showEnvPanel })),
+  environmentVariables: [],
+  setEnvironmentVariables: environmentVariables => set(() => ({ environmentVariables })),
+  envSecrets: {},
+  setEnvSecrets: envSecrets => set(() => ({ envSecrets })),
+})
diff --git a/app/components/workflow/store/workflow/form-slice.ts b/app/components/workflow/store/workflow/form-slice.ts
new file mode 100644
index 0000000..a6c607d
--- /dev/null
+++ b/app/components/workflow/store/workflow/form-slice.ts
@@ -0,0 +1,18 @@
+import type { StateCreator } from 'zustand'
+import type {
+  RunFile,
+} from '@/app/components/workflow/types'
+
+export type FormSliceShape = {
+  inputs: Record<string, string>
+  setInputs: (inputs: Record<string, string>) => void
+  files: RunFile[]
+  setFiles: (files: RunFile[]) => void
+}
+
+export const createFormSlice: StateCreator<FormSliceShape> = set => ({
+  inputs: {},
+  setInputs: inputs => set(() => ({ inputs })),
+  files: [],
+  setFiles: files => set(() => ({ files })),
+})
diff --git a/app/components/workflow/store/workflow/help-line-slice.ts b/app/components/workflow/store/workflow/help-line-slice.ts
new file mode 100644
index 0000000..7d9aeac
--- /dev/null
+++ b/app/components/workflow/store/workflow/help-line-slice.ts
@@ -0,0 +1,19 @@
+import type { StateCreator } from 'zustand'
+import type {
+  HelpLineHorizontalPosition,
+  HelpLineVerticalPosition,
+} from '@/app/components/workflow/help-line/types'
+
+export type HelpLineSliceShape = {
+  helpLineHorizontal?: HelpLineHorizontalPosition
+  setHelpLineHorizontal: (helpLineHorizontal?: HelpLineHorizontalPosition) => void
+  helpLineVertical?: HelpLineVerticalPosition
+  setHelpLineVertical: (helpLineVertical?: HelpLineVerticalPosition) => void
+}
+
+export const createHelpLineSlice: StateCreator<HelpLineSliceShape> = set => ({
+  helpLineHorizontal: undefined,
+  setHelpLineHorizontal: helpLineHorizontal => set(() => ({ helpLineHorizontal })),
+  helpLineVertical: undefined,
+  setHelpLineVertical: helpLineVertical => set(() => ({ helpLineVertical })),
+})
diff --git a/app/components/workflow/store/workflow/history-slice.ts b/app/components/workflow/store/workflow/history-slice.ts
new file mode 100644
index 0000000..47d1b8a
--- /dev/null
+++ b/app/components/workflow/store/workflow/history-slice.ts
@@ -0,0 +1,25 @@
+import type { StateCreator } from 'zustand'
+import type {
+  HistoryWorkflowData,
+} from '@/app/components/workflow/types'
+import type {
+  VersionHistory,
+} from '@/types/workflow'
+
+export type HistorySliceShape = {
+  historyWorkflowData?: HistoryWorkflowData
+  setHistoryWorkflowData: (historyWorkflowData?: HistoryWorkflowData) => void
+  showRunHistory: boolean
+  setShowRunHistory: (showRunHistory: boolean) => void
+  versionHistory: VersionHistory[]
+  setVersionHistory: (versionHistory: VersionHistory[]) => void
+}
+
+export const createHistorySlice: StateCreator<HistorySliceShape> = set => ({
+  historyWorkflowData: undefined,
+  setHistoryWorkflowData: historyWorkflowData => set(() => ({ historyWorkflowData })),
+  showRunHistory: false,
+  setShowRunHistory: showRunHistory => set(() => ({ showRunHistory })),
+  versionHistory: [],
+  setVersionHistory: versionHistory => set(() => ({ versionHistory })),
+})
diff --git a/app/components/workflow/store/workflow/index.ts b/app/components/workflow/store/workflow/index.ts
new file mode 100644
index 0000000..0e2f5eb
--- /dev/null
+++ b/app/components/workflow/store/workflow/index.ts
@@ -0,0 +1,81 @@
+import { useContext } from 'react'
+import type {
+  StateCreator,
+} from 'zustand'
+import {
+  useStore as useZustandStore,
+} from 'zustand'
+import { createStore } from 'zustand/vanilla'
+import type { ChatVariableSliceShape } from './chat-variable-slice'
+import { createChatVariableSlice } from './chat-variable-slice'
+import type { EnvVariableSliceShape } from './env-variable-slice'
+import { createEnvVariableSlice } from './env-variable-slice'
+import type { FormSliceShape } from './form-slice'
+import { createFormSlice } from './form-slice'
+import type { HelpLineSliceShape } from './help-line-slice'
+import { createHelpLineSlice } from './help-line-slice'
+import type { HistorySliceShape } from './history-slice'
+import { createHistorySlice } from './history-slice'
+import type { NodeSliceShape } from './node-slice'
+import { createNodeSlice } from './node-slice'
+import type { PanelSliceShape } from './panel-slice'
+import { createPanelSlice } from './panel-slice'
+import type { ToolSliceShape } from './tool-slice'
+import { createToolSlice } from './tool-slice'
+import type { VersionSliceShape } from './version-slice'
+import { createVersionSlice } from './version-slice'
+import type { WorkflowDraftSliceShape } from './workflow-draft-slice'
+import { createWorkflowDraftSlice } from './workflow-draft-slice'
+import type { WorkflowSliceShape } from './workflow-slice'
+import { createWorkflowSlice } from './workflow-slice'
+import { WorkflowContext } from '@/app/components/workflow/context'
+import type { WorkflowSliceShape as WorkflowAppSliceShape } from '@/app/components/workflow-app/store/workflow/workflow-slice'
+
+export type Shape =
+  ChatVariableSliceShape &
+  EnvVariableSliceShape &
+  FormSliceShape &
+  HelpLineSliceShape &
+  HistorySliceShape &
+  NodeSliceShape &
+  PanelSliceShape &
+  ToolSliceShape &
+  VersionSliceShape &
+  WorkflowDraftSliceShape &
+  WorkflowSliceShape &
+  WorkflowAppSliceShape
+
+type CreateWorkflowStoreParams = {
+  injectWorkflowStoreSliceFn?: StateCreator<WorkflowAppSliceShape>
+}
+
+export const createWorkflowStore = (params: CreateWorkflowStoreParams) => {
+  const { injectWorkflowStoreSliceFn } = params || {}
+
+  return createStore<Shape>((...args) => ({
+    ...createChatVariableSlice(...args),
+    ...createEnvVariableSlice(...args),
+    ...createFormSlice(...args),
+    ...createHelpLineSlice(...args),
+    ...createHistorySlice(...args),
+    ...createNodeSlice(...args),
+    ...createPanelSlice(...args),
+    ...createToolSlice(...args),
+    ...createVersionSlice(...args),
+    ...createWorkflowDraftSlice(...args),
+    ...createWorkflowSlice(...args),
+    ...(injectWorkflowStoreSliceFn?.(...args) || {} as WorkflowAppSliceShape),
+  }))
+}
+
+export function useStore<T>(selector: (state: Shape) => T): T {
+  const store = useContext(WorkflowContext)
+  if (!store)
+    throw new Error('Missing WorkflowContext.Provider in the tree')
+
+  return useZustandStore(store, selector)
+}
+
+export const useWorkflowStore = () => {
+  return useContext(WorkflowContext)!
+}
diff --git a/app/components/workflow/store/workflow/node-slice.ts b/app/components/workflow/store/workflow/node-slice.ts
new file mode 100644
index 0000000..2068ee0
--- /dev/null
+++ b/app/components/workflow/store/workflow/node-slice.ts
@@ -0,0 +1,76 @@
+import type { StateCreator } from 'zustand'
+import type {
+  Node,
+} from '@/app/components/workflow/types'
+import type {
+  VariableAssignerNodeType,
+} from '@/app/components/workflow/nodes/variable-assigner/types'
+import type {
+  NodeTracing,
+} from '@/types/workflow'
+
+export type NodeSliceShape = {
+  showSingleRunPanel: boolean
+  setShowSingleRunPanel: (showSingleRunPanel: boolean) => void
+  nodeAnimation: boolean
+  setNodeAnimation: (nodeAnimation: boolean) => void
+  candidateNode?: Node
+  setCandidateNode: (candidateNode?: Node) => void
+  nodeMenu?: {
+    top: number
+    left: number
+    nodeId: string
+  }
+  setNodeMenu: (nodeMenu: NodeSliceShape['nodeMenu']) => void
+  showAssignVariablePopup?: {
+    nodeId: string
+    nodeData: Node['data']
+    variableAssignerNodeId: string
+    variableAssignerNodeData: VariableAssignerNodeType
+    variableAssignerNodeHandleId: string
+    parentNode?: Node
+    x: number
+    y: number
+  }
+  setShowAssignVariablePopup: (showAssignVariablePopup: NodeSliceShape['showAssignVariablePopup']) => void
+  hoveringAssignVariableGroupId?: string
+  setHoveringAssignVariableGroupId: (hoveringAssignVariableGroupId?: string) => void
+  connectingNodePayload?: { nodeId: string; nodeType: string; handleType: string; handleId: string | null }
+  setConnectingNodePayload: (startConnectingPayload?: NodeSliceShape['connectingNodePayload']) => void
+  enteringNodePayload?: {
+    nodeId: string
+    nodeData: VariableAssignerNodeType
+  }
+  setEnteringNodePayload: (enteringNodePayload?: NodeSliceShape['enteringNodePayload']) => void
+  iterTimes: number
+  setIterTimes: (iterTimes: number) => void
+  loopTimes: number
+  setLoopTimes: (loopTimes: number) => void
+  iterParallelLogMap: Map<string, Map<string, NodeTracing[]>>
+  setIterParallelLogMap: (iterParallelLogMap: Map<string, Map<string, NodeTracing[]>>) => void
+}
+
+export const createNodeSlice: StateCreator<NodeSliceShape> = set => ({
+  showSingleRunPanel: false,
+  setShowSingleRunPanel: showSingleRunPanel => set(() => ({ showSingleRunPanel })),
+  nodeAnimation: false,
+  setNodeAnimation: nodeAnimation => set(() => ({ nodeAnimation })),
+  candidateNode: undefined,
+  setCandidateNode: candidateNode => set(() => ({ candidateNode })),
+  nodeMenu: undefined,
+  setNodeMenu: nodeMenu => set(() => ({ nodeMenu })),
+  showAssignVariablePopup: undefined,
+  setShowAssignVariablePopup: showAssignVariablePopup => set(() => ({ showAssignVariablePopup })),
+  hoveringAssignVariableGroupId: undefined,
+  setHoveringAssignVariableGroupId: hoveringAssignVariableGroupId => set(() => ({ hoveringAssignVariableGroupId })),
+  connectingNodePayload: undefined,
+  setConnectingNodePayload: connectingNodePayload => set(() => ({ connectingNodePayload })),
+  enteringNodePayload: undefined,
+  setEnteringNodePayload: enteringNodePayload => set(() => ({ enteringNodePayload })),
+  iterTimes: 1,
+  setIterTimes: iterTimes => set(() => ({ iterTimes })),
+  loopTimes: 1,
+  setLoopTimes: loopTimes => set(() => ({ loopTimes })),
+  iterParallelLogMap: new Map<string, Map<string, NodeTracing[]>>(),
+  setIterParallelLogMap: iterParallelLogMap => set(() => ({ iterParallelLogMap })),
+})
diff --git a/app/components/workflow/store/workflow/panel-slice.ts b/app/components/workflow/store/workflow/panel-slice.ts
new file mode 100644
index 0000000..06a5f45
--- /dev/null
+++ b/app/components/workflow/store/workflow/panel-slice.ts
@@ -0,0 +1,32 @@
+import type { StateCreator } from 'zustand'
+
+export type PanelSliceShape = {
+  panelWidth: number
+  showFeaturesPanel: boolean
+  setShowFeaturesPanel: (showFeaturesPanel: boolean) => void
+  showWorkflowVersionHistoryPanel: boolean
+  setShowWorkflowVersionHistoryPanel: (showWorkflowVersionHistoryPanel: boolean) => void
+  showInputsPanel: boolean
+  setShowInputsPanel: (showInputsPanel: boolean) => void
+  showDebugAndPreviewPanel: boolean
+  setShowDebugAndPreviewPanel: (showDebugAndPreviewPanel: boolean) => void
+  panelMenu?: {
+    top: number
+    left: number
+  }
+  setPanelMenu: (panelMenu: PanelSliceShape['panelMenu']) => void
+}
+
+export const createPanelSlice: StateCreator<PanelSliceShape> = set => ({
+  panelWidth: localStorage.getItem('workflow-node-panel-width') ? Number.parseFloat(localStorage.getItem('workflow-node-panel-width')!) : 420,
+  showFeaturesPanel: false,
+  setShowFeaturesPanel: showFeaturesPanel => set(() => ({ showFeaturesPanel })),
+  showWorkflowVersionHistoryPanel: false,
+  setShowWorkflowVersionHistoryPanel: showWorkflowVersionHistoryPanel => set(() => ({ showWorkflowVersionHistoryPanel })),
+  showInputsPanel: false,
+  setShowInputsPanel: showInputsPanel => set(() => ({ showInputsPanel })),
+  showDebugAndPreviewPanel: false,
+  setShowDebugAndPreviewPanel: showDebugAndPreviewPanel => set(() => ({ showDebugAndPreviewPanel })),
+  panelMenu: undefined,
+  setPanelMenu: panelMenu => set(() => ({ panelMenu })),
+})
diff --git a/app/components/workflow/store/workflow/tool-slice.ts b/app/components/workflow/store/workflow/tool-slice.ts
new file mode 100644
index 0000000..2d54bbd
--- /dev/null
+++ b/app/components/workflow/store/workflow/tool-slice.ts
@@ -0,0 +1,26 @@
+import type { StateCreator } from 'zustand'
+import type {
+  ToolWithProvider,
+} from '@/app/components/workflow/types'
+
+export type ToolSliceShape = {
+  buildInTools: ToolWithProvider[]
+  setBuildInTools: (tools: ToolWithProvider[]) => void
+  customTools: ToolWithProvider[]
+  setCustomTools: (tools: ToolWithProvider[]) => void
+  workflowTools: ToolWithProvider[]
+  setWorkflowTools: (tools: ToolWithProvider[]) => void
+  toolPublished: boolean
+  setToolPublished: (toolPublished: boolean) => void
+}
+
+export const createToolSlice: StateCreator<ToolSliceShape> = set => ({
+  buildInTools: [],
+  setBuildInTools: buildInTools => set(() => ({ buildInTools })),
+  customTools: [],
+  setCustomTools: customTools => set(() => ({ customTools })),
+  workflowTools: [],
+  setWorkflowTools: workflowTools => set(() => ({ workflowTools })),
+  toolPublished: false,
+  setToolPublished: toolPublished => set(() => ({ toolPublished })),
+})
diff --git a/app/components/workflow/store/workflow/version-slice.ts b/app/components/workflow/store/workflow/version-slice.ts
new file mode 100644
index 0000000..df19218
--- /dev/null
+++ b/app/components/workflow/store/workflow/version-slice.ts
@@ -0,0 +1,26 @@
+import type { StateCreator } from 'zustand'
+import type {
+  VersionHistory,
+} from '@/types/workflow'
+
+export type VersionSliceShape = {
+  draftUpdatedAt: number
+  setDraftUpdatedAt: (draftUpdatedAt: number) => void
+  publishedAt: number
+  setPublishedAt: (publishedAt: number) => void
+  currentVersion: VersionHistory | null
+  setCurrentVersion: (currentVersion: VersionHistory) => void
+  isRestoring: boolean
+  setIsRestoring: (isRestoring: boolean) => void
+}
+
+export const createVersionSlice: StateCreator<VersionSliceShape> = set => ({
+  draftUpdatedAt: 0,
+  setDraftUpdatedAt: draftUpdatedAt => set(() => ({ draftUpdatedAt: draftUpdatedAt ? draftUpdatedAt * 1000 : 0 })),
+  publishedAt: 0,
+  setPublishedAt: publishedAt => set(() => ({ publishedAt: publishedAt ? publishedAt * 1000 : 0 })),
+  currentVersion: null,
+  setCurrentVersion: currentVersion => set(() => ({ currentVersion })),
+  isRestoring: false,
+  setIsRestoring: isRestoring => set(() => ({ isRestoring })),
+})
diff --git a/app/components/workflow/store/workflow/workflow-draft-slice.ts b/app/components/workflow/store/workflow/workflow-draft-slice.ts
new file mode 100644
index 0000000..ec28deb
--- /dev/null
+++ b/app/components/workflow/store/workflow/workflow-draft-slice.ts
@@ -0,0 +1,36 @@
+import type { StateCreator } from 'zustand'
+import { debounce } from 'lodash-es'
+import type { Viewport } from 'reactflow'
+import type {
+  Edge,
+  EnvironmentVariable,
+  Node,
+} from '@/app/components/workflow/types'
+
+export type WorkflowDraftSliceShape = {
+  backupDraft?: {
+    nodes: Node[]
+    edges: Edge[]
+    viewport: Viewport
+    features: Record<string, any>
+    environmentVariables: EnvironmentVariable[]
+  }
+  setBackupDraft: (backupDraft?: WorkflowDraftSliceShape['backupDraft']) => void
+  debouncedSyncWorkflowDraft: (fn: () => void) => void
+  syncWorkflowDraftHash: string
+  setSyncWorkflowDraftHash: (hash: string) => void
+  isSyncingWorkflowDraft: boolean
+  setIsSyncingWorkflowDraft: (isSyncingWorkflowDraft: boolean) => void
+}
+
+export const createWorkflowDraftSlice: StateCreator<WorkflowDraftSliceShape> = set => ({
+  backupDraft: undefined,
+  setBackupDraft: backupDraft => set(() => ({ backupDraft })),
+  debouncedSyncWorkflowDraft: debounce((syncWorkflowDraft) => {
+    syncWorkflowDraft()
+  }, 5000),
+  syncWorkflowDraftHash: '',
+  setSyncWorkflowDraftHash: syncWorkflowDraftHash => set(() => ({ syncWorkflowDraftHash })),
+  isSyncingWorkflowDraft: false,
+  setIsSyncingWorkflowDraft: isSyncingWorkflowDraft => set(() => ({ isSyncingWorkflowDraft })),
+})
diff --git a/app/components/workflow/store/workflow/workflow-slice.ts b/app/components/workflow/store/workflow/workflow-slice.ts
new file mode 100644
index 0000000..6bb69cd
--- /dev/null
+++ b/app/components/workflow/store/workflow/workflow-slice.ts
@@ -0,0 +1,63 @@
+import type { StateCreator } from 'zustand'
+import type {
+  Node,
+  WorkflowRunningData,
+} from '@/app/components/workflow/types'
+
+type PreviewRunningData = WorkflowRunningData & {
+  resultTabActive?: boolean
+  resultText?: string
+}
+
+export type WorkflowSliceShape = {
+  workflowRunningData?: PreviewRunningData
+  setWorkflowRunningData: (workflowData: PreviewRunningData) => void
+  clipboardElements: Node[]
+  setClipboardElements: (clipboardElements: Node[]) => void
+  selection: null | { x1: number; y1: number; x2: number; y2: number }
+  setSelection: (selection: WorkflowSliceShape['selection']) => void
+  bundleNodeSize: { width: number; height: number } | null
+  setBundleNodeSize: (bundleNodeSize: WorkflowSliceShape['bundleNodeSize']) => void
+  controlMode: 'pointer' | 'hand'
+  setControlMode: (controlMode: WorkflowSliceShape['controlMode']) => void
+  mousePosition: { pageX: number; pageY: number; elementX: number; elementY: number }
+  setMousePosition: (mousePosition: WorkflowSliceShape['mousePosition']) => void
+  showConfirm?: { title: string; desc?: string; onConfirm: () => void }
+  setShowConfirm: (showConfirm: WorkflowSliceShape['showConfirm']) => void
+  controlPromptEditorRerenderKey: number
+  setControlPromptEditorRerenderKey: (controlPromptEditorRerenderKey: number) => void
+  showImportDSLModal: boolean
+  setShowImportDSLModal: (showImportDSLModal: boolean) => void
+  showTips: string
+  setShowTips: (showTips: string) => void
+  workflowConfig?: Record<string, any>
+  setWorkflowConfig: (workflowConfig: Record<string, any>) => void
+}
+
+export const createWorkflowSlice: StateCreator<WorkflowSliceShape> = set => ({
+  workflowRunningData: undefined,
+  setWorkflowRunningData: workflowRunningData => set(() => ({ workflowRunningData })),
+  clipboardElements: [],
+  setClipboardElements: clipboardElements => set(() => ({ clipboardElements })),
+  selection: null,
+  setSelection: selection => set(() => ({ selection })),
+  bundleNodeSize: null,
+  setBundleNodeSize: bundleNodeSize => set(() => ({ bundleNodeSize })),
+  controlMode: localStorage.getItem('workflow-operation-mode') === 'pointer' ? 'pointer' : 'hand',
+  setControlMode: (controlMode) => {
+    set(() => ({ controlMode }))
+    localStorage.setItem('workflow-operation-mode', controlMode)
+  },
+  mousePosition: { pageX: 0, pageY: 0, elementX: 0, elementY: 0 },
+  setMousePosition: mousePosition => set(() => ({ mousePosition })),
+  showConfirm: undefined,
+  setShowConfirm: showConfirm => set(() => ({ showConfirm })),
+  controlPromptEditorRerenderKey: 0,
+  setControlPromptEditorRerenderKey: controlPromptEditorRerenderKey => set(() => ({ controlPromptEditorRerenderKey })),
+  showImportDSLModal: false,
+  setShowImportDSLModal: showImportDSLModal => set(() => ({ showImportDSLModal })),
+  showTips: '',
+  setShowTips: showTips => set(() => ({ showTips })),
+  workflowConfig: undefined,
+  setWorkflowConfig: workflowConfig => set(() => ({ workflowConfig })),
+})
diff --git a/app/components/workflow/style.css b/app/components/workflow/style.css
new file mode 100644
index 0000000..7ef46dd
--- /dev/null
+++ b/app/components/workflow/style.css
@@ -0,0 +1,24 @@
+.workflow-panel-animation .react-flow__viewport {
+  transition: transform 0.3s ease-in-out;
+}
+
+.workflow-node-animation .react-flow__node {
+  transition: transform 0.2s ease-in-out;
+}
+
+#workflow-container .react-flow__nodesselection-rect {
+  border: 1px solid #528BFF;
+  background: rgba(21, 94, 239, 0.05);
+  cursor: move;
+}
+
+#workflow-container .react-flow__selection {
+  border: 1px solid #528BFF;
+  background: rgba(21, 94, 239, 0.05);
+}
+
+#workflow-container .react-flow__node-custom-note {
+  z-index: -1000 !important;
+}
+
+#workflow-container .react-flow {}
diff --git a/app/components/workflow/syncing-data-modal.tsx b/app/components/workflow/syncing-data-modal.tsx
new file mode 100644
index 0000000..fe3843d
--- /dev/null
+++ b/app/components/workflow/syncing-data-modal.tsx
@@ -0,0 +1,15 @@
+import { useStore } from './store'
+
+const SyncingDataModal = () => {
+  const isSyncingWorkflowDraft = useStore(s => s.isSyncingWorkflowDraft)
+
+  if (!isSyncingWorkflowDraft)
+    return null
+
+  return (
+    <div className='absolute inset-0 z-[9999]'>
+    </div>
+  )
+}
+
+export default SyncingDataModal
diff --git a/app/components/workflow/types.ts b/app/components/workflow/types.ts
new file mode 100644
index 0000000..884bdfb
--- /dev/null
+++ b/app/components/workflow/types.ts
@@ -0,0 +1,435 @@
+import type {
+  Edge as ReactFlowEdge,
+  Node as ReactFlowNode,
+  Viewport,
+} from 'reactflow'
+import type { Resolution, TransferMethod } from '@/types/app'
+import type { ToolDefaultValue } from '@/app/components/workflow/block-selector/types'
+import type { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/types'
+import type { FileResponse, NodeTracing } from '@/types/workflow'
+import type { Collection, Tool } from '@/app/components/tools/types'
+import type { ChatVarType } from '@/app/components/workflow/panel/chat-variable-panel/type'
+import type {
+  DefaultValueForm,
+  ErrorHandleTypeEnum,
+} from '@/app/components/workflow/nodes/_base/components/error-handle/types'
+import type { WorkflowRetryConfig } from '@/app/components/workflow/nodes/_base/components/retry/types'
+import type { StructuredOutput } from '@/app/components/workflow/nodes/llm/types'
+
+export enum BlockEnum {
+  Start = 'start',
+  End = 'end',
+  Answer = 'answer',
+  LLM = 'llm',
+  KnowledgeRetrieval = 'knowledge-retrieval',
+  QuestionClassifier = 'question-classifier',
+  IfElse = 'if-else',
+  Code = 'code',
+  TemplateTransform = 'template-transform',
+  HttpRequest = 'http-request',
+  VariableAssigner = 'variable-assigner',
+  VariableAggregator = 'variable-aggregator',
+  Tool = 'tool',
+  ParameterExtractor = 'parameter-extractor',
+  Iteration = 'iteration',
+  DocExtractor = 'document-extractor',
+  ListFilter = 'list-operator',
+  IterationStart = 'iteration-start',
+  Assigner = 'assigner', // is now named as VariableAssigner
+  Agent = 'agent',
+  Loop = 'loop',
+  LoopStart = 'loop-start',
+  LoopEnd = 'loop-end',
+}
+
+export enum ControlMode {
+  Pointer = 'pointer',
+  Hand = 'hand',
+}
+export enum ErrorHandleMode {
+  Terminated = 'terminated',
+  ContinueOnError = 'continue-on-error',
+  RemoveAbnormalOutput = 'remove-abnormal-output',
+}
+export type Branch = {
+  id: string
+  name: string
+}
+
+export type CommonNodeType<T = {}> = {
+  _connectedSourceHandleIds?: string[]
+  _connectedTargetHandleIds?: string[]
+  _targetBranches?: Branch[]
+  _isSingleRun?: boolean
+  _runningStatus?: NodeRunningStatus
+  _runningBranchId?: string
+  _singleRunningStatus?: NodeRunningStatus
+  _isCandidate?: boolean
+  _isBundled?: boolean
+  _children?: { nodeId: string; nodeType: BlockEnum }[]
+  _isEntering?: boolean
+  _showAddVariablePopup?: boolean
+  _holdAddVariablePopup?: boolean
+  _iterationLength?: number
+  _iterationIndex?: number
+  _inParallelHovering?: boolean
+  _waitingRun?: boolean
+  _retryIndex?: number
+  isInIteration?: boolean
+  iteration_id?: string
+  selected?: boolean
+  title: string
+  desc: string
+  type: BlockEnum
+  width?: number
+  height?: number
+  _loopLength?: number
+  _loopIndex?: number
+  isInLoop?: boolean
+  loop_id?: string
+  error_strategy?: ErrorHandleTypeEnum
+  retry_config?: WorkflowRetryConfig
+  default_value?: DefaultValueForm[]
+} & T & Partial<Pick<ToolDefaultValue, 'provider_id' | 'provider_type' | 'provider_name' | 'tool_name'>>
+
+export type CommonEdgeType = {
+  _hovering?: boolean
+  _connectedNodeIsHovering?: boolean
+  _connectedNodeIsSelected?: boolean
+  _isBundled?: boolean
+  _sourceRunningStatus?: NodeRunningStatus
+  _targetRunningStatus?: NodeRunningStatus
+  _waitingRun?: boolean
+  isInIteration?: boolean
+  iteration_id?: string
+  isInLoop?: boolean
+  loop_id?: string
+  sourceType: BlockEnum
+  targetType: BlockEnum
+}
+
+export type Node<T = {}> = ReactFlowNode<CommonNodeType<T>>
+export type SelectedNode = Pick<Node, 'id' | 'data'>
+export type NodeProps<T = unknown> = { id: string; data: CommonNodeType<T> }
+export type NodePanelProps<T> = {
+  id: string
+  data: CommonNodeType<T>
+}
+export type Edge = ReactFlowEdge<CommonEdgeType>
+
+export type WorkflowDataUpdater = {
+  nodes: Node[]
+  edges: Edge[]
+  viewport: Viewport
+}
+
+export type ValueSelector = string[] // [nodeId, key | obj key path]
+
+export type Variable = {
+  variable: string
+  label?: string | {
+    nodeType: BlockEnum
+    nodeName: string
+    variable: string
+  }
+  value_selector: ValueSelector
+  variable_type?: VarKindType
+  value?: string
+  options?: string[]
+  required?: boolean
+  isParagraph?: boolean
+}
+
+export type EnvironmentVariable = {
+  id: string
+  name: string
+  value: any
+  value_type: 'string' | 'number' | 'secret'
+}
+
+export type ConversationVariable = {
+  id: string
+  name: string
+  value_type: ChatVarType
+  value: any
+  description: string
+}
+
+export type GlobalVariable = {
+  name: string
+  value_type: 'string' | 'number'
+  description: string
+}
+
+export type VariableWithValue = {
+  key: string
+  value: string
+}
+
+export enum InputVarType {
+  textInput = 'text-input',
+  paragraph = 'paragraph',
+  select = 'select',
+  number = 'number',
+  url = 'url',
+  files = 'files',
+  json = 'json', // obj, array
+  contexts = 'contexts', // knowledge retrieval
+  iterator = 'iterator', // iteration input
+  singleFile = 'file',
+  multiFiles = 'file-list',
+  loop = 'loop', // loop input
+}
+
+export type InputVar = {
+  type: InputVarType
+  label: string | {
+    nodeType: BlockEnum
+    nodeName: string
+    variable: string
+    isChatVar?: boolean
+  }
+  variable: string
+  max_length?: number
+  default?: string
+  required: boolean
+  hint?: string
+  options?: string[]
+  value_selector?: ValueSelector
+} & Partial<UploadFileSetting>
+
+export type ModelConfig = {
+  provider: string
+  name: string
+  mode: string
+  completion_params: Record<string, any>
+}
+
+export enum PromptRole {
+  system = 'system',
+  user = 'user',
+  assistant = 'assistant',
+}
+
+export enum EditionType {
+  basic = 'basic',
+  jinja2 = 'jinja2',
+}
+
+export type PromptItem = {
+  id?: string
+  role?: PromptRole
+  text: string
+  edition_type?: EditionType
+  jinja2_text?: string
+}
+
+export enum MemoryRole {
+  user = 'user',
+  assistant = 'assistant',
+}
+
+export type RolePrefix = {
+  user: string
+  assistant: string
+}
+
+export type Memory = {
+  role_prefix?: RolePrefix
+  window: {
+    enabled: boolean
+    size: number | string | null
+  }
+  query_prompt_template: string
+}
+
+export enum VarType {
+  string = 'string',
+  number = 'number',
+  secret = 'secret',
+  boolean = 'boolean',
+  object = 'object',
+  file = 'file',
+  array = 'array',
+  arrayString = 'array[string]',
+  arrayNumber = 'array[number]',
+  arrayObject = 'array[object]',
+  arrayFile = 'array[file]',
+  any = 'any',
+}
+
+export enum ValueType {
+  variable = 'variable',
+  constant = 'constant',
+}
+
+export type Var = {
+  variable: string
+  type: VarType
+  children?: Var[] | StructuredOutput // if type is obj, has the children struct
+  isParagraph?: boolean
+  isSelect?: boolean
+  options?: string[]
+  required?: boolean
+  des?: string
+  isException?: boolean
+  isLoopVariable?: boolean
+  nodeId?: string
+}
+
+export type NodeOutPutVar = {
+  nodeId: string
+  title: string
+  vars: Var[]
+  isStartNode?: boolean
+  isLoop?: boolean
+}
+
+export type Block = {
+  classification?: string
+  type: BlockEnum
+  title: string
+  description?: string
+}
+
+export type NodeDefault<T> = {
+  defaultValue: Partial<T>
+  getAvailablePrevNodes: (isChatMode: boolean) => BlockEnum[]
+  getAvailableNextNodes: (isChatMode: boolean) => BlockEnum[]
+  checkValid: (payload: T, t: any, moreDataForCheckValid?: any) => { isValid: boolean; errorMessage?: string }
+}
+
+export type OnSelectBlock = (type: BlockEnum, toolDefaultValue?: ToolDefaultValue) => void
+
+export enum WorkflowRunningStatus {
+  Waiting = 'waiting',
+  Running = 'running',
+  Succeeded = 'succeeded',
+  Failed = 'failed',
+  Stopped = 'stopped',
+}
+
+export enum WorkflowVersion {
+  Draft = 'draft',
+  Latest = 'latest',
+}
+
+export enum NodeRunningStatus {
+  NotStart = 'not-start',
+  Waiting = 'waiting',
+  Running = 'running',
+  Succeeded = 'succeeded',
+  Failed = 'failed',
+  Exception = 'exception',
+  Retry = 'retry',
+}
+
+export type OnNodeAdd = (
+  newNodePayload: {
+    nodeType: BlockEnum
+    sourceHandle?: string
+    targetHandle?: string
+    toolDefaultValue?: ToolDefaultValue
+  },
+  oldNodesPayload: {
+    prevNodeId?: string
+    prevNodeSourceHandle?: string
+    nextNodeId?: string
+    nextNodeTargetHandle?: string
+  }
+) => void
+
+export type CheckValidRes = {
+  isValid: boolean
+  errorMessage?: string
+}
+
+export type RunFile = {
+  type: string
+  transfer_method: TransferMethod[]
+  url?: string
+  upload_file_id?: string
+  related_id?: string
+}
+
+export type WorkflowRunningData = {
+  task_id?: string
+  message_id?: string
+  conversation_id?: string
+  result: {
+    sequence_number?: number
+    workflow_id?: string
+    inputs?: string
+    process_data?: string
+    outputs?: string
+    status: string
+    error?: string
+    elapsed_time?: number
+    total_tokens?: number
+    created_at?: number
+    created_by?: string
+    finished_at?: number
+    steps?: number
+    showSteps?: boolean
+    total_steps?: number
+    files?: FileResponse[]
+    exceptions_count?: number
+  }
+  tracing?: NodeTracing[]
+}
+
+export type HistoryWorkflowData = {
+  id: string
+  sequence_number: number
+  status: string
+  conversation_id?: string
+}
+
+export enum ChangeType {
+  changeVarName = 'changeVarName',
+  remove = 'remove',
+}
+
+export type MoreInfo = {
+  type: ChangeType
+  payload?: {
+    beforeKey: string
+    afterKey?: string
+  }
+}
+
+export type ToolWithProvider = Collection & {
+  tools: Tool[]
+}
+
+export enum SupportUploadFileTypes {
+  image = 'image',
+  document = 'document',
+  audio = 'audio',
+  video = 'video',
+  custom = 'custom',
+}
+
+export type UploadFileSetting = {
+  allowed_file_upload_methods: TransferMethod[]
+  allowed_file_types: SupportUploadFileTypes[]
+  allowed_file_extensions?: string[]
+  max_length: number
+  number_limits?: number
+}
+
+export type VisionSetting = {
+  variable_selector: ValueSelector
+  detail: Resolution
+}
+
+export enum WorkflowVersionFilterOptions {
+  all = 'all',
+  onlyYours = 'onlyYours',
+}
+
+export enum VersionHistoryContextMenuOptions {
+  restore = 'restore',
+  edit = 'edit',
+  delete = 'delete',
+}
diff --git a/app/components/workflow/update-dsl-modal.tsx b/app/components/workflow/update-dsl-modal.tsx
new file mode 100644
index 0000000..b789e3b
--- /dev/null
+++ b/app/components/workflow/update-dsl-modal.tsx
@@ -0,0 +1,302 @@
+'use client'
+
+import type { MouseEventHandler } from 'react'
+import {
+  memo,
+  useCallback,
+  useRef,
+  useState,
+} from 'react'
+import { useContext } from 'use-context-selector'
+import { useTranslation } from 'react-i18next'
+import {
+  RiAlertFill,
+  RiCloseLine,
+  RiFileDownloadLine,
+} from '@remixicon/react'
+import { WORKFLOW_DATA_UPDATE } from './constants'
+import {
+  SupportUploadFileTypes,
+} from './types'
+import {
+  initialEdges,
+  initialNodes,
+} from './utils'
+import {
+  importDSL,
+  importDSLConfirm,
+} from '@/service/apps'
+import { fetchWorkflowDraft } from '@/service/workflow'
+import {
+  DSLImportMode,
+  DSLImportStatus,
+} from '@/models/app'
+import Uploader from '@/app/components/app/create-from-dsl-modal/uploader'
+import Button from '@/app/components/base/button'
+import Modal from '@/app/components/base/modal'
+import { ToastContext } from '@/app/components/base/toast'
+import { useEventEmitterContextContext } from '@/context/event-emitter'
+import { useStore as useAppStore } from '@/app/components/app/store'
+import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'
+import { usePluginDependencies } from '@/app/components/workflow/plugin-dependency/hooks'
+
+type UpdateDSLModalProps = {
+  onCancel: () => void
+  onBackup: () => void
+  onImport?: () => void
+}
+
+const UpdateDSLModal = ({
+  onCancel,
+  onBackup,
+  onImport,
+}: UpdateDSLModalProps) => {
+  const { t } = useTranslation()
+  const { notify } = useContext(ToastContext)
+  const appDetail = useAppStore(s => s.appDetail)
+  const [currentFile, setDSLFile] = useState<File>()
+  const [fileContent, setFileContent] = useState<string>()
+  const [loading, setLoading] = useState(false)
+  const { eventEmitter } = useEventEmitterContextContext()
+  const [show, setShow] = useState(true)
+  const [showErrorModal, setShowErrorModal] = useState(false)
+  const [versions, setVersions] = useState<{ importedVersion: string; systemVersion: string }>()
+  const [importId, setImportId] = useState<string>()
+  const { handleCheckPluginDependencies } = usePluginDependencies()
+
+  const readFile = (file: File) => {
+    const reader = new FileReader()
+    reader.onload = function (event) {
+      const content = event.target?.result
+      setFileContent(content as string)
+    }
+    reader.readAsText(file)
+  }
+
+  const handleFile = (file?: File) => {
+    setDSLFile(file)
+    if (file)
+      readFile(file)
+    if (!file)
+      setFileContent('')
+  }
+
+  const handleWorkflowUpdate = useCallback(async (app_id: string) => {
+    const {
+      graph,
+      features,
+      hash,
+    } = await fetchWorkflowDraft(`/apps/${app_id}/workflows/draft`)
+
+    const { nodes, edges, viewport } = graph
+    const newFeatures = {
+      file: {
+        image: {
+          enabled: !!features.file_upload?.image?.enabled,
+          number_limits: features.file_upload?.image?.number_limits || 3,
+          transfer_methods: features.file_upload?.image?.transfer_methods || ['local_file', 'remote_url'],
+        },
+        enabled: !!(features.file_upload?.enabled || features.file_upload?.image?.enabled),
+        allowed_file_types: features.file_upload?.allowed_file_types || [SupportUploadFileTypes.image],
+        allowed_file_extensions: features.file_upload?.allowed_file_extensions || FILE_EXTS[SupportUploadFileTypes.image].map(ext => `.${ext}`),
+        allowed_file_upload_methods: features.file_upload?.allowed_file_upload_methods || features.file_upload?.image?.transfer_methods || ['local_file', 'remote_url'],
+        number_limits: features.file_upload?.number_limits || features.file_upload?.image?.number_limits || 3,
+      },
+      opening: {
+        enabled: !!features.opening_statement,
+        opening_statement: features.opening_statement,
+        suggested_questions: features.suggested_questions,
+      },
+      suggested: features.suggested_questions_after_answer || { enabled: false },
+      speech2text: features.speech_to_text || { enabled: false },
+      text2speech: features.text_to_speech || { enabled: false },
+      citation: features.retriever_resource || { enabled: false },
+      moderation: features.sensitive_word_avoidance || { enabled: false },
+    }
+
+    eventEmitter?.emit({
+      type: WORKFLOW_DATA_UPDATE,
+      payload: {
+        nodes: initialNodes(nodes, edges),
+        edges: initialEdges(edges, nodes),
+        viewport,
+        features: newFeatures,
+        hash,
+      },
+    } as any)
+  }, [eventEmitter])
+
+  const isCreatingRef = useRef(false)
+  const handleImport: MouseEventHandler = useCallback(async () => {
+    if (isCreatingRef.current)
+      return
+    isCreatingRef.current = true
+    if (!currentFile)
+      return
+    try {
+      if (appDetail && fileContent) {
+        setLoading(true)
+        const response = await importDSL({ mode: DSLImportMode.YAML_CONTENT, yaml_content: fileContent, app_id: appDetail.id })
+        const { id, status, app_id, imported_dsl_version, current_dsl_version } = response
+
+        if (status === DSLImportStatus.COMPLETED || status === DSLImportStatus.COMPLETED_WITH_WARNINGS) {
+          if (!app_id) {
+            notify({ type: 'error', message: t('workflow.common.importFailure') })
+            return
+          }
+          handleWorkflowUpdate(app_id)
+          if (onImport)
+            onImport()
+          notify({
+            type: status === DSLImportStatus.COMPLETED ? 'success' : 'warning',
+            message: t(status === DSLImportStatus.COMPLETED ? 'workflow.common.importSuccess' : 'workflow.common.importWarning'),
+            children: status === DSLImportStatus.COMPLETED_WITH_WARNINGS && t('workflow.common.importWarningDetails'),
+          })
+          await handleCheckPluginDependencies(app_id)
+          setLoading(false)
+          onCancel()
+        }
+        else if (status === DSLImportStatus.PENDING) {
+          setShow(false)
+          setTimeout(() => {
+            setShowErrorModal(true)
+          }, 300)
+          setVersions({
+            importedVersion: imported_dsl_version ?? '',
+            systemVersion: current_dsl_version ?? '',
+          })
+          setImportId(id)
+        }
+        else {
+          setLoading(false)
+          notify({ type: 'error', message: t('workflow.common.importFailure') })
+        }
+      }
+    }
+    // eslint-disable-next-line unused-imports/no-unused-vars
+    catch (e) {
+      setLoading(false)
+      notify({ type: 'error', message: t('workflow.common.importFailure') })
+    }
+    isCreatingRef.current = false
+  }, [currentFile, fileContent, onCancel, notify, t, appDetail, onImport, handleWorkflowUpdate, handleCheckPluginDependencies])
+
+  const onUpdateDSLConfirm: MouseEventHandler = async () => {
+    try {
+      if (!importId)
+        return
+      const response = await importDSLConfirm({
+        import_id: importId,
+      })
+
+      const { status, app_id } = response
+
+      if (status === DSLImportStatus.COMPLETED) {
+        if (!app_id) {
+          notify({ type: 'error', message: t('workflow.common.importFailure') })
+          return
+        }
+        handleWorkflowUpdate(app_id)
+        await handleCheckPluginDependencies(app_id)
+        if (onImport)
+          onImport()
+        notify({ type: 'success', message: t('workflow.common.importSuccess') })
+        setLoading(false)
+        onCancel()
+      }
+      else if (status === DSLImportStatus.FAILED) {
+        setLoading(false)
+        notify({ type: 'error', message: t('workflow.common.importFailure') })
+      }
+    }
+    // eslint-disable-next-line unused-imports/no-unused-vars
+    catch (e) {
+      setLoading(false)
+      notify({ type: 'error', message: t('workflow.common.importFailure') })
+    }
+  }
+
+  return (
+    <>
+      <Modal
+        className='w-[520px] rounded-2xl p-6'
+        isShow={show}
+        onClose={onCancel}
+      >
+        <div className='mb-3 flex items-center justify-between'>
+          <div className='title-2xl-semi-bold text-text-primary'>{t('workflow.common.importDSL')}</div>
+          <div className='flex h-[22px] w-[22px] cursor-pointer items-center justify-center' onClick={onCancel}>
+            <RiCloseLine className='h-[18px] w-[18px] text-text-tertiary' />
+          </div>
+        </div>
+        <div className='relative mb-2 flex grow gap-0.5 overflow-hidden rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-2 shadow-xs'>
+          <div className='absolute left-0 top-0 h-full w-full bg-toast-warning-bg opacity-40' />
+          <div className='flex items-start justify-center p-1'>
+            <RiAlertFill className='h-4 w-4 shrink-0 text-text-warning-secondary' />
+          </div>
+          <div className='flex grow flex-col items-start gap-0.5 py-1'>
+            <div className='system-xs-medium whitespace-pre-line text-text-primary'>{t('workflow.common.importDSLTip')}</div>
+            <div className='flex items-start gap-1 self-stretch pb-0.5 pt-1'>
+              <Button
+                size='small'
+                variant='secondary'
+                className='z-[1000]'
+                onClick={onBackup}
+              >
+                <RiFileDownloadLine className='h-3.5 w-3.5 text-components-button-secondary-text' />
+                <div className='flex items-center justify-center gap-1 px-[3px]'>
+                  {t('workflow.common.backupCurrentDraft')}
+                </div>
+              </Button>
+            </div>
+          </div>
+        </div>
+        <div>
+          <div className='system-md-semibold pt-2 text-text-primary'>
+            {t('workflow.common.chooseDSL')}
+          </div>
+          <div className='flex w-full flex-col items-start justify-center gap-4 self-stretch py-4'>
+            <Uploader
+              file={currentFile}
+              updateFile={handleFile}
+              className='!mt-0 w-full'
+            />
+          </div>
+        </div>
+        <div className='flex items-center justify-end gap-2 self-stretch pt-5'>
+          <Button onClick={onCancel}>{t('app.newApp.Cancel')}</Button>
+          <Button
+            disabled={!currentFile || loading}
+            variant='warning'
+            onClick={handleImport}
+            loading={loading}
+          >
+            {t('workflow.common.overwriteAndImport')}
+          </Button>
+        </div>
+      </Modal>
+      <Modal
+        isShow={showErrorModal}
+        onClose={() => setShowErrorModal(false)}
+        className='w-[480px]'
+      >
+        <div className='flex flex-col items-start gap-2 self-stretch pb-4'>
+          <div className='title-2xl-semi-bold text-text-primary'>{t('app.newApp.appCreateDSLErrorTitle')}</div>
+          <div className='system-md-regular flex grow flex-col text-text-secondary'>
+            <div>{t('app.newApp.appCreateDSLErrorPart1')}</div>
+            <div>{t('app.newApp.appCreateDSLErrorPart2')}</div>
+            <br />
+            <div>{t('app.newApp.appCreateDSLErrorPart3')}<span className='system-md-medium'>{versions?.importedVersion}</span></div>
+            <div>{t('app.newApp.appCreateDSLErrorPart4')}<span className='system-md-medium'>{versions?.systemVersion}</span></div>
+          </div>
+        </div>
+        <div className='flex items-start justify-end gap-2 self-stretch pt-6'>
+          <Button variant='secondary' onClick={() => setShowErrorModal(false)}>{t('app.newApp.Cancel')}</Button>
+          <Button variant='primary' destructive onClick={onUpdateDSLConfirm}>{t('app.newApp.Confirm')}</Button>
+        </div>
+      </Modal>
+    </>
+  )
+}
+
+export default memo(UpdateDSLModal)
diff --git a/app/components/workflow/utils/common.ts b/app/components/workflow/utils/common.ts
new file mode 100644
index 0000000..8a8afbb
--- /dev/null
+++ b/app/components/workflow/utils/common.ts
@@ -0,0 +1,35 @@
+export const isMac = () => {
+  return navigator.userAgent.toUpperCase().includes('MAC')
+}
+
+const specialKeysNameMap: Record<string, string | undefined> = {
+  ctrl: '鈱�',
+  alt: '鈱�',
+  shift: '鈬�',
+}
+
+export const getKeyboardKeyNameBySystem = (key: string) => {
+  if (isMac())
+    return specialKeysNameMap[key] || key
+
+  return key
+}
+
+const specialKeysCodeMap: Record<string, string | undefined> = {
+  ctrl: 'meta',
+}
+
+export const getKeyboardKeyCodeBySystem = (key: string) => {
+  if (isMac())
+    return specialKeysCodeMap[key] || key
+
+  return key
+}
+
+export const isEventTargetInputArea = (target: HTMLElement) => {
+  if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA')
+    return true
+
+  if (target.contentEditable === 'true')
+    return true
+}
diff --git a/app/components/workflow/utils/edge.ts b/app/components/workflow/utils/edge.ts
new file mode 100644
index 0000000..b539c21
--- /dev/null
+++ b/app/components/workflow/utils/edge.ts
@@ -0,0 +1,23 @@
+import {
+  NodeRunningStatus,
+} from '../types'
+
+export const getEdgeColor = (nodeRunningStatus?: NodeRunningStatus, isFailBranch?: boolean) => {
+  if (nodeRunningStatus === NodeRunningStatus.Succeeded)
+    return 'var(--color-workflow-link-line-success-handle)'
+
+  if (nodeRunningStatus === NodeRunningStatus.Failed)
+    return 'var(--color-workflow-link-line-error-handle)'
+
+  if (nodeRunningStatus === NodeRunningStatus.Exception)
+    return 'var(--color-workflow-link-line-failure-handle)'
+
+  if (nodeRunningStatus === NodeRunningStatus.Running) {
+    if (isFailBranch)
+      return 'var(--color-workflow-link-line-failure-handle)'
+
+    return 'var(--color-workflow-link-line-handle)'
+  }
+
+  return 'var(--color-workflow-link-line-normal)'
+}
diff --git a/app/components/workflow/utils/index.ts b/app/components/workflow/utils/index.ts
new file mode 100644
index 0000000..4a1da76
--- /dev/null
+++ b/app/components/workflow/utils/index.ts
@@ -0,0 +1,8 @@
+export * from './node'
+export * from './edge'
+export * from './workflow-init'
+export * from './layout'
+export * from './common'
+export * from './tool'
+export * from './workflow'
+export * from './variable'
diff --git a/app/components/workflow/utils/layout.ts b/app/components/workflow/utils/layout.ts
new file mode 100644
index 0000000..3c4189b
--- /dev/null
+++ b/app/components/workflow/utils/layout.ts
@@ -0,0 +1,178 @@
+import dagre from '@dagrejs/dagre'
+import {
+  cloneDeep,
+} from 'lodash-es'
+import type {
+  Edge,
+  Node,
+} from '../types'
+import {
+  BlockEnum,
+} from '../types'
+import {
+  CUSTOM_NODE,
+  NODE_LAYOUT_HORIZONTAL_PADDING,
+  NODE_LAYOUT_MIN_DISTANCE,
+  NODE_LAYOUT_VERTICAL_PADDING,
+} from '../constants'
+import { CUSTOM_ITERATION_START_NODE } from '../nodes/iteration-start/constants'
+import { CUSTOM_LOOP_START_NODE } from '../nodes/loop-start/constants'
+
+export const getLayoutByDagre = (originNodes: Node[], originEdges: Edge[]) => {
+  const dagreGraph = new dagre.graphlib.Graph()
+  dagreGraph.setDefaultEdgeLabel(() => ({}))
+  const nodes = cloneDeep(originNodes).filter(node => !node.parentId && node.type === CUSTOM_NODE)
+  const edges = cloneDeep(originEdges).filter(edge => (!edge.data?.isInIteration && !edge.data?.isInLoop))
+  dagreGraph.setGraph({
+    rankdir: 'LR',
+    align: 'UL',
+    nodesep: 40,
+    ranksep: 60,
+    ranker: 'tight-tree',
+    marginx: 30,
+    marginy: 200,
+  })
+  nodes.forEach((node) => {
+    dagreGraph.setNode(node.id, {
+      width: node.width!,
+      height: node.height!,
+    })
+  })
+  edges.forEach((edge) => {
+    dagreGraph.setEdge(edge.source, edge.target)
+  })
+  dagre.layout(dagreGraph)
+  return dagreGraph
+}
+
+export const getLayoutForChildNodes = (parentNodeId: string, originNodes: Node[], originEdges: Edge[]) => {
+  const dagreGraph = new dagre.graphlib.Graph()
+  dagreGraph.setDefaultEdgeLabel(() => ({}))
+
+  const nodes = cloneDeep(originNodes).filter(node => node.parentId === parentNodeId)
+  const edges = cloneDeep(originEdges).filter(edge =>
+    (edge.data?.isInIteration && edge.data?.iteration_id === parentNodeId)
+    || (edge.data?.isInLoop && edge.data?.loop_id === parentNodeId),
+  )
+
+  const startNode = nodes.find(node =>
+    node.type === CUSTOM_ITERATION_START_NODE
+    || node.type === CUSTOM_LOOP_START_NODE
+    || node.data?.type === BlockEnum.LoopStart
+    || node.data?.type === BlockEnum.IterationStart,
+  )
+
+  if (!startNode) {
+    dagreGraph.setGraph({
+      rankdir: 'LR',
+      align: 'UL',
+      nodesep: 40,
+      ranksep: 60,
+      marginx: NODE_LAYOUT_HORIZONTAL_PADDING,
+      marginy: NODE_LAYOUT_VERTICAL_PADDING,
+    })
+
+    nodes.forEach((node) => {
+      dagreGraph.setNode(node.id, {
+        width: node.width || 244,
+        height: node.height || 100,
+      })
+    })
+
+    edges.forEach((edge) => {
+      dagreGraph.setEdge(edge.source, edge.target)
+    })
+
+    dagre.layout(dagreGraph)
+    return dagreGraph
+  }
+
+  const startNodeOutEdges = edges.filter(edge => edge.source === startNode.id)
+  const firstConnectedNodes = startNodeOutEdges.map(edge =>
+    nodes.find(node => node.id === edge.target),
+  ).filter(Boolean) as Node[]
+
+  const nonStartNodes = nodes.filter(node => node.id !== startNode.id)
+  const nonStartEdges = edges.filter(edge => edge.source !== startNode.id && edge.target !== startNode.id)
+
+  dagreGraph.setGraph({
+    rankdir: 'LR',
+    align: 'UL',
+    nodesep: 40,
+    ranksep: 60,
+    marginx: NODE_LAYOUT_HORIZONTAL_PADDING / 2,
+    marginy: NODE_LAYOUT_VERTICAL_PADDING / 2,
+  })
+
+  nonStartNodes.forEach((node) => {
+    dagreGraph.setNode(node.id, {
+      width: node.width || 244,
+      height: node.height || 100,
+    })
+  })
+
+  nonStartEdges.forEach((edge) => {
+    dagreGraph.setEdge(edge.source, edge.target)
+  })
+
+  dagre.layout(dagreGraph)
+
+  const startNodeSize = {
+    width: startNode.width || 44,
+    height: startNode.height || 48,
+  }
+
+  const startNodeX = NODE_LAYOUT_HORIZONTAL_PADDING / 1.5
+  let startNodeY = 100
+
+  let minFirstLayerX = Infinity
+  let avgFirstLayerY = 0
+  let firstLayerCount = 0
+
+  if (firstConnectedNodes.length > 0) {
+    firstConnectedNodes.forEach((node) => {
+      if (dagreGraph.node(node.id)) {
+        const nodePos = dagreGraph.node(node.id)
+        avgFirstLayerY += nodePos.y
+        firstLayerCount++
+        minFirstLayerX = Math.min(minFirstLayerX, nodePos.x - nodePos.width / 2)
+      }
+    })
+
+    if (firstLayerCount > 0) {
+      avgFirstLayerY /= firstLayerCount
+      startNodeY = avgFirstLayerY
+    }
+
+    const minRequiredX = startNodeX + startNodeSize.width + NODE_LAYOUT_MIN_DISTANCE
+
+    if (minFirstLayerX < minRequiredX) {
+      const shiftX = minRequiredX - minFirstLayerX
+
+      nonStartNodes.forEach((node) => {
+        if (dagreGraph.node(node.id)) {
+          const nodePos = dagreGraph.node(node.id)
+          dagreGraph.setNode(node.id, {
+            x: nodePos.x + shiftX,
+            y: nodePos.y,
+            width: nodePos.width,
+            height: nodePos.height,
+          })
+        }
+      })
+    }
+  }
+
+  dagreGraph.setNode(startNode.id, {
+    x: startNodeX + startNodeSize.width / 2,
+    y: startNodeY,
+    width: startNodeSize.width,
+    height: startNodeSize.height,
+  })
+
+  startNodeOutEdges.forEach((edge) => {
+    dagreGraph.setEdge(edge.source, edge.target)
+  })
+
+  return dagreGraph
+}
diff --git a/app/components/workflow/utils/node.ts b/app/components/workflow/utils/node.ts
new file mode 100644
index 0000000..7a9e33b
--- /dev/null
+++ b/app/components/workflow/utils/node.ts
@@ -0,0 +1,145 @@
+import {
+  Position,
+} from 'reactflow'
+import type {
+  Node,
+} from '../types'
+import {
+  BlockEnum,
+} from '../types'
+import {
+  CUSTOM_NODE,
+  ITERATION_CHILDREN_Z_INDEX,
+  ITERATION_NODE_Z_INDEX,
+  LOOP_CHILDREN_Z_INDEX,
+  LOOP_NODE_Z_INDEX,
+} from '../constants'
+import { CUSTOM_ITERATION_START_NODE } from '../nodes/iteration-start/constants'
+import { CUSTOM_LOOP_START_NODE } from '../nodes/loop-start/constants'
+import type { IterationNodeType } from '../nodes/iteration/types'
+import type { LoopNodeType } from '../nodes/loop/types'
+import { CUSTOM_SIMPLE_NODE } from '@/app/components/workflow/simple-node/constants'
+
+export function generateNewNode({ data, position, id, zIndex, type, ...rest }: Omit<Node, 'id'> & { id?: string }): {
+  newNode: Node
+  newIterationStartNode?: Node
+  newLoopStartNode?: Node
+} {
+  const newNode = {
+    id: id || `${Date.now()}`,
+    type: type || CUSTOM_NODE,
+    data,
+    position,
+    targetPosition: Position.Left,
+    sourcePosition: Position.Right,
+    zIndex: data.type === BlockEnum.Iteration ? ITERATION_NODE_Z_INDEX : (data.type === BlockEnum.Loop ? LOOP_NODE_Z_INDEX : zIndex),
+    ...rest,
+  } as Node
+
+  if (data.type === BlockEnum.Iteration) {
+    const newIterationStartNode = getIterationStartNode(newNode.id);
+    (newNode.data as IterationNodeType).start_node_id = newIterationStartNode.id;
+    (newNode.data as IterationNodeType)._children = [{ nodeId: newIterationStartNode.id, nodeType: BlockEnum.IterationStart }]
+    return {
+      newNode,
+      newIterationStartNode,
+    }
+  }
+
+  if (data.type === BlockEnum.Loop) {
+    const newLoopStartNode = getLoopStartNode(newNode.id);
+    (newNode.data as LoopNodeType).start_node_id = newLoopStartNode.id;
+    (newNode.data as LoopNodeType)._children = [{ nodeId: newLoopStartNode.id, nodeType: BlockEnum.LoopStart }]
+    return {
+      newNode,
+      newLoopStartNode,
+    }
+  }
+
+  return {
+    newNode,
+  }
+}
+
+export function getIterationStartNode(iterationId: string): Node {
+  return generateNewNode({
+    id: `${iterationId}start`,
+    type: CUSTOM_ITERATION_START_NODE,
+    data: {
+      title: '',
+      desc: '',
+      type: BlockEnum.IterationStart,
+      isInIteration: true,
+    },
+    position: {
+      x: 24,
+      y: 68,
+    },
+    zIndex: ITERATION_CHILDREN_Z_INDEX,
+    parentId: iterationId,
+    selectable: false,
+    draggable: false,
+  }).newNode
+}
+
+export function getLoopStartNode(loopId: string): Node {
+  return generateNewNode({
+    id: `${loopId}start`,
+    type: CUSTOM_LOOP_START_NODE,
+    data: {
+      title: '',
+      desc: '',
+      type: BlockEnum.LoopStart,
+      isInLoop: true,
+    },
+    position: {
+      x: 24,
+      y: 68,
+    },
+    zIndex: LOOP_CHILDREN_Z_INDEX,
+    parentId: loopId,
+    selectable: false,
+    draggable: false,
+  }).newNode
+}
+
+export const genNewNodeTitleFromOld = (oldTitle: string) => {
+  const regex = /^(.+?)\s*\((\d+)\)\s*$/
+  const match = oldTitle.match(regex)
+
+  if (match) {
+    const title = match[1]
+    const num = Number.parseInt(match[2], 10)
+    return `${title} (${num + 1})`
+  }
+  else {
+    return `${oldTitle} (1)`
+  }
+}
+
+export const getTopLeftNodePosition = (nodes: Node[]) => {
+  let minX = Infinity
+  let minY = Infinity
+
+  nodes.forEach((node) => {
+    if (node.position.x < minX)
+      minX = node.position.x
+
+    if (node.position.y < minY)
+      minY = node.position.y
+  })
+
+  return {
+    x: minX,
+    y: minY,
+  }
+}
+
+export const hasRetryNode = (nodeType?: BlockEnum) => {
+  return nodeType === BlockEnum.LLM || nodeType === BlockEnum.Tool || nodeType === BlockEnum.HttpRequest || nodeType === BlockEnum.Code
+}
+
+export const getNodeCustomTypeByNodeDataType = (nodeType: BlockEnum) => {
+  if (nodeType === BlockEnum.LoopEnd)
+    return CUSTOM_SIMPLE_NODE
+}
diff --git a/app/components/workflow/utils/tool.ts b/app/components/workflow/utils/tool.ts
new file mode 100644
index 0000000..d1dda12
--- /dev/null
+++ b/app/components/workflow/utils/tool.ts
@@ -0,0 +1,43 @@
+import type {
+  InputVar,
+  ToolWithProvider,
+} from '../types'
+import type { ToolNodeType } from '../nodes/tool/types'
+import { CollectionType } from '@/app/components/tools/types'
+import { toolParametersToFormSchemas } from '@/app/components/tools/utils/to-form-schema'
+import { canFindTool } from '@/utils'
+
+export const getToolCheckParams = (
+  toolData: ToolNodeType,
+  buildInTools: ToolWithProvider[],
+  customTools: ToolWithProvider[],
+  workflowTools: ToolWithProvider[],
+  language: string,
+) => {
+  const { provider_id, provider_type, tool_name } = toolData
+  const isBuiltIn = provider_type === CollectionType.builtIn
+  const currentTools = provider_type === CollectionType.builtIn ? buildInTools : provider_type === CollectionType.custom ? customTools : workflowTools
+  const currCollection = currentTools.find(item => canFindTool(item.id, provider_id))
+  const currTool = currCollection?.tools.find(tool => tool.name === tool_name)
+  const formSchemas = currTool ? toolParametersToFormSchemas(currTool.parameters) : []
+  const toolInputVarSchema = formSchemas.filter(item => item.form === 'llm')
+  const toolSettingSchema = formSchemas.filter(item => item.form !== 'llm')
+
+  return {
+    toolInputsSchema: (() => {
+      const formInputs: InputVar[] = []
+      toolInputVarSchema.forEach((item: any) => {
+        formInputs.push({
+          label: item.label[language] || item.label.en_US,
+          variable: item.variable,
+          type: item.type,
+          required: item.required,
+        })
+      })
+      return formInputs
+    })(),
+    notAuthed: isBuiltIn && !!currCollection?.allow_delete && !currCollection?.is_team_authorization,
+    toolSettingSchema,
+    language,
+  }
+}
diff --git a/app/components/workflow/utils/variable.ts b/app/components/workflow/utils/variable.ts
new file mode 100644
index 0000000..f73f92e
--- /dev/null
+++ b/app/components/workflow/utils/variable.ts
@@ -0,0 +1,18 @@
+import type {
+  ValueSelector,
+} from '../types'
+import type {
+  BlockEnum,
+} from '../types'
+import { hasErrorHandleNode } from '.'
+
+export const variableTransformer = (v: ValueSelector | string) => {
+  if (typeof v === 'string')
+    return v.replace(/^{{#|#}}$/g, '').split('.')
+
+  return `{{#${v.join('.')}#}}`
+}
+
+export const isExceptionVariable = (variable: string, nodeType?: BlockEnum) => {
+  return (variable === 'error_message' || variable === 'error_type') && hasErrorHandleNode(nodeType)
+}
diff --git a/app/components/workflow/utils/workflow-init.spec.ts b/app/components/workflow/utils/workflow-init.spec.ts
new file mode 100644
index 0000000..8b7bdfa
--- /dev/null
+++ b/app/components/workflow/utils/workflow-init.spec.ts
@@ -0,0 +1,69 @@
+import { preprocessNodesAndEdges } from './workflow-init'
+import { BlockEnum } from '@/app/components/workflow/types'
+import type {
+  Node,
+} from '@/app/components/workflow/types'
+import { CUSTOM_ITERATION_START_NODE } from '@/app/components/workflow/nodes/iteration-start/constants'
+
+describe('preprocessNodesAndEdges', () => {
+  it('process nodes without iteration node or loop node should return origin nodes and edges.', () => {
+    const nodes = [
+      {
+        data: {
+          type: BlockEnum.Code,
+        },
+      },
+    ]
+
+    const result = preprocessNodesAndEdges(nodes as Node[], [])
+    expect(result).toEqual({
+      nodes,
+      edges: [],
+    })
+  })
+
+  it('process nodes with iteration node should return nodes with iteration start node', () => {
+    const nodes = [
+      {
+        id: 'iteration',
+        data: {
+          type: BlockEnum.Iteration,
+        },
+      },
+    ]
+
+    const result = preprocessNodesAndEdges(nodes as Node[], [])
+    expect(result.nodes).toEqual(
+      expect.arrayContaining([
+        expect.objectContaining({
+          data: expect.objectContaining({
+            type: BlockEnum.IterationStart,
+          }),
+        }),
+      ]),
+    )
+  })
+
+  it('process nodes with iteration node start should return origin', () => {
+    const nodes = [
+      {
+        data: {
+          type: BlockEnum.Iteration,
+          start_node_id: 'iterationStart',
+        },
+      },
+      {
+        id: 'iterationStart',
+        type: CUSTOM_ITERATION_START_NODE,
+        data: {
+          type: BlockEnum.IterationStart,
+        },
+      },
+    ]
+    const result = preprocessNodesAndEdges(nodes as Node[], [])
+    expect(result).toEqual({
+      nodes,
+      edges: [],
+    })
+  })
+})
diff --git a/app/components/workflow/utils/workflow-init.ts b/app/components/workflow/utils/workflow-init.ts
new file mode 100644
index 0000000..93a6123
--- /dev/null
+++ b/app/components/workflow/utils/workflow-init.ts
@@ -0,0 +1,338 @@
+import {
+  getConnectedEdges,
+} from 'reactflow'
+import {
+  cloneDeep,
+} from 'lodash-es'
+import type {
+  Edge,
+  Node,
+} from '../types'
+import {
+  BlockEnum,
+  ErrorHandleMode,
+} from '../types'
+import {
+  CUSTOM_NODE,
+  DEFAULT_RETRY_INTERVAL,
+  DEFAULT_RETRY_MAX,
+  ITERATION_CHILDREN_Z_INDEX,
+  LOOP_CHILDREN_Z_INDEX,
+  NODE_WIDTH_X_OFFSET,
+  START_INITIAL_POSITION,
+} from '../constants'
+import { CUSTOM_ITERATION_START_NODE } from '../nodes/iteration-start/constants'
+import { CUSTOM_LOOP_START_NODE } from '../nodes/loop-start/constants'
+import type { QuestionClassifierNodeType } from '../nodes/question-classifier/types'
+import type { IfElseNodeType } from '../nodes/if-else/types'
+import { branchNameCorrect } from '../nodes/if-else/utils'
+import type { IterationNodeType } from '../nodes/iteration/types'
+import type { LoopNodeType } from '../nodes/loop/types'
+import {
+  getIterationStartNode,
+  getLoopStartNode,
+} from '.'
+import { correctModelProvider } from '@/utils'
+
+const WHITE = 'WHITE'
+const GRAY = 'GRAY'
+const BLACK = 'BLACK'
+const isCyclicUtil = (nodeId: string, color: Record<string, string>, adjList: Record<string, string[]>, stack: string[]) => {
+  color[nodeId] = GRAY
+  stack.push(nodeId)
+
+  for (let i = 0; i < adjList[nodeId].length; ++i) {
+    const childId = adjList[nodeId][i]
+
+    if (color[childId] === GRAY) {
+      stack.push(childId)
+      return true
+    }
+    if (color[childId] === WHITE && isCyclicUtil(childId, color, adjList, stack))
+      return true
+  }
+  color[nodeId] = BLACK
+  if (stack.length > 0 && stack[stack.length - 1] === nodeId)
+    stack.pop()
+  return false
+}
+
+const getCycleEdges = (nodes: Node[], edges: Edge[]) => {
+  const adjList: Record<string, string[]> = {}
+  const color: Record<string, string> = {}
+  const stack: string[] = []
+
+  for (const node of nodes) {
+    color[node.id] = WHITE
+    adjList[node.id] = []
+  }
+
+  for (const edge of edges)
+    adjList[edge.source]?.push(edge.target)
+
+  for (let i = 0; i < nodes.length; i++) {
+    if (color[nodes[i].id] === WHITE)
+      isCyclicUtil(nodes[i].id, color, adjList, stack)
+  }
+
+  const cycleEdges = []
+  if (stack.length > 0) {
+    const cycleNodes = new Set(stack)
+    for (const edge of edges) {
+      if (cycleNodes.has(edge.source) && cycleNodes.has(edge.target))
+        cycleEdges.push(edge)
+    }
+  }
+
+  return cycleEdges
+}
+
+export const preprocessNodesAndEdges = (nodes: Node[], edges: Edge[]) => {
+  const hasIterationNode = nodes.some(node => node.data.type === BlockEnum.Iteration)
+  const hasLoopNode = nodes.some(node => node.data.type === BlockEnum.Loop)
+
+  if (!hasIterationNode && !hasLoopNode) {
+    return {
+      nodes,
+      edges,
+    }
+  }
+
+  const nodesMap = nodes.reduce((prev, next) => {
+    prev[next.id] = next
+    return prev
+  }, {} as Record<string, Node>)
+
+  const iterationNodesWithStartNode = []
+  const iterationNodesWithoutStartNode = []
+  const loopNodesWithStartNode = []
+  const loopNodesWithoutStartNode = []
+
+  for (let i = 0; i < nodes.length; i++) {
+    const currentNode = nodes[i] as Node<IterationNodeType | LoopNodeType>
+
+    if (currentNode.data.type === BlockEnum.Iteration) {
+      if (currentNode.data.start_node_id) {
+        if (nodesMap[currentNode.data.start_node_id]?.type !== CUSTOM_ITERATION_START_NODE)
+          iterationNodesWithStartNode.push(currentNode)
+      }
+      else {
+        iterationNodesWithoutStartNode.push(currentNode)
+      }
+    }
+
+    if (currentNode.data.type === BlockEnum.Loop) {
+      if (currentNode.data.start_node_id) {
+        if (nodesMap[currentNode.data.start_node_id]?.type !== CUSTOM_LOOP_START_NODE)
+          loopNodesWithStartNode.push(currentNode)
+      }
+      else {
+        loopNodesWithoutStartNode.push(currentNode)
+      }
+    }
+  }
+
+  const newIterationStartNodesMap = {} as Record<string, Node>
+  const newIterationStartNodes = [...iterationNodesWithStartNode, ...iterationNodesWithoutStartNode].map((iterationNode, index) => {
+    const newNode = getIterationStartNode(iterationNode.id)
+    newNode.id = newNode.id + index
+    newIterationStartNodesMap[iterationNode.id] = newNode
+    return newNode
+  })
+
+  const newLoopStartNodesMap = {} as Record<string, Node>
+  const newLoopStartNodes = [...loopNodesWithStartNode, ...loopNodesWithoutStartNode].map((loopNode, index) => {
+    const newNode = getLoopStartNode(loopNode.id)
+    newNode.id = newNode.id + index
+    newLoopStartNodesMap[loopNode.id] = newNode
+    return newNode
+  })
+
+  const newEdges = [...iterationNodesWithStartNode, ...loopNodesWithStartNode].map((nodeItem) => {
+    const isIteration = nodeItem.data.type === BlockEnum.Iteration
+    const newNode = (isIteration ? newIterationStartNodesMap : newLoopStartNodesMap)[nodeItem.id]
+    const startNode = nodesMap[nodeItem.data.start_node_id]
+    const source = newNode.id
+    const sourceHandle = 'source'
+    const target = startNode.id
+    const targetHandle = 'target'
+
+    const parentNode = nodes.find(node => node.id === startNode.parentId) || null
+    const isInIteration = !!parentNode && parentNode.data.type === BlockEnum.Iteration
+    const isInLoop = !!parentNode && parentNode.data.type === BlockEnum.Loop
+
+    return {
+      id: `${source}-${sourceHandle}-${target}-${targetHandle}`,
+      type: 'custom',
+      source,
+      sourceHandle,
+      target,
+      targetHandle,
+      data: {
+        sourceType: newNode.data.type,
+        targetType: startNode.data.type,
+        isInIteration,
+        iteration_id: isInIteration ? startNode.parentId : undefined,
+        isInLoop,
+        loop_id: isInLoop ? startNode.parentId : undefined,
+        _connectedNodeIsSelected: true,
+      },
+      zIndex: isIteration ? ITERATION_CHILDREN_Z_INDEX : LOOP_CHILDREN_Z_INDEX,
+    }
+  })
+  nodes.forEach((node) => {
+    if (node.data.type === BlockEnum.Iteration && newIterationStartNodesMap[node.id])
+      (node.data as IterationNodeType).start_node_id = newIterationStartNodesMap[node.id].id
+
+    if (node.data.type === BlockEnum.Loop && newLoopStartNodesMap[node.id])
+      (node.data as LoopNodeType).start_node_id = newLoopStartNodesMap[node.id].id
+  })
+
+  return {
+    nodes: [...nodes, ...newIterationStartNodes, ...newLoopStartNodes],
+    edges: [...edges, ...newEdges],
+  }
+}
+
+export const initialNodes = (originNodes: Node[], originEdges: Edge[]) => {
+  const { nodes, edges } = preprocessNodesAndEdges(cloneDeep(originNodes), cloneDeep(originEdges))
+  const firstNode = nodes[0]
+
+  if (!firstNode?.position) {
+    nodes.forEach((node, index) => {
+      node.position = {
+        x: START_INITIAL_POSITION.x + index * NODE_WIDTH_X_OFFSET,
+        y: START_INITIAL_POSITION.y,
+      }
+    })
+  }
+
+  const iterationOrLoopNodeMap = nodes.reduce((acc, node) => {
+    if (node.parentId) {
+      if (acc[node.parentId])
+        acc[node.parentId].push({ nodeId: node.id, nodeType: node.data.type })
+      else
+        acc[node.parentId] = [{ nodeId: node.id, nodeType: node.data.type }]
+    }
+    return acc
+  }, {} as Record<string, { nodeId: string; nodeType: BlockEnum }[]>)
+
+  return nodes.map((node) => {
+    if (!node.type)
+      node.type = CUSTOM_NODE
+
+    const connectedEdges = getConnectedEdges([node], edges)
+    node.data._connectedSourceHandleIds = connectedEdges.filter(edge => edge.source === node.id).map(edge => edge.sourceHandle || 'source')
+    node.data._connectedTargetHandleIds = connectedEdges.filter(edge => edge.target === node.id).map(edge => edge.targetHandle || 'target')
+
+    if (node.data.type === BlockEnum.IfElse) {
+      const nodeData = node.data as IfElseNodeType
+
+      if (!nodeData.cases && nodeData.logical_operator && nodeData.conditions) {
+        (node.data as IfElseNodeType).cases = [
+          {
+            case_id: 'true',
+            logical_operator: nodeData.logical_operator,
+            conditions: nodeData.conditions,
+          },
+        ]
+      }
+      node.data._targetBranches = branchNameCorrect([
+        ...(node.data as IfElseNodeType).cases.map(item => ({ id: item.case_id, name: '' })),
+        { id: 'false', name: '' },
+      ])
+    }
+
+    if (node.data.type === BlockEnum.QuestionClassifier) {
+      node.data._targetBranches = (node.data as QuestionClassifierNodeType).classes.map((topic) => {
+        return topic
+      })
+    }
+
+    if (node.data.type === BlockEnum.Iteration) {
+      const iterationNodeData = node.data as IterationNodeType
+      iterationNodeData._children = iterationOrLoopNodeMap[node.id] || []
+      iterationNodeData.is_parallel = iterationNodeData.is_parallel || false
+      iterationNodeData.parallel_nums = iterationNodeData.parallel_nums || 10
+      iterationNodeData.error_handle_mode = iterationNodeData.error_handle_mode || ErrorHandleMode.Terminated
+    }
+
+    // TODO: loop error handle mode
+    if (node.data.type === BlockEnum.Loop) {
+      const loopNodeData = node.data as LoopNodeType
+      loopNodeData._children = iterationOrLoopNodeMap[node.id] || []
+      loopNodeData.error_handle_mode = loopNodeData.error_handle_mode || ErrorHandleMode.Terminated
+    }
+
+    // legacy provider handle
+    if (node.data.type === BlockEnum.LLM)
+      (node as any).data.model.provider = correctModelProvider((node as any).data.model.provider)
+
+    if (node.data.type === BlockEnum.KnowledgeRetrieval && (node as any).data.multiple_retrieval_config?.reranking_model)
+      (node as any).data.multiple_retrieval_config.reranking_model.provider = correctModelProvider((node as any).data.multiple_retrieval_config?.reranking_model.provider)
+
+    if (node.data.type === BlockEnum.QuestionClassifier)
+      (node as any).data.model.provider = correctModelProvider((node as any).data.model.provider)
+
+    if (node.data.type === BlockEnum.ParameterExtractor)
+      (node as any).data.model.provider = correctModelProvider((node as any).data.model.provider)
+    if (node.data.type === BlockEnum.HttpRequest && !node.data.retry_config) {
+      node.data.retry_config = {
+        retry_enabled: true,
+        max_retries: DEFAULT_RETRY_MAX,
+        retry_interval: DEFAULT_RETRY_INTERVAL,
+      }
+    }
+
+    return node
+  })
+}
+
+export const initialEdges = (originEdges: Edge[], originNodes: Node[]) => {
+  const { nodes, edges } = preprocessNodesAndEdges(cloneDeep(originNodes), cloneDeep(originEdges))
+  let selectedNode: Node | null = null
+  const nodesMap = nodes.reduce((acc, node) => {
+    acc[node.id] = node
+
+    if (node.data?.selected)
+      selectedNode = node
+
+    return acc
+  }, {} as Record<string, Node>)
+
+  const cycleEdges = getCycleEdges(nodes, edges)
+  return edges.filter((edge) => {
+    return !cycleEdges.find(cycEdge => cycEdge.source === edge.source && cycEdge.target === edge.target)
+  }).map((edge) => {
+    edge.type = 'custom'
+
+    if (!edge.sourceHandle)
+      edge.sourceHandle = 'source'
+
+    if (!edge.targetHandle)
+      edge.targetHandle = 'target'
+
+    if (!edge.data?.sourceType && edge.source && nodesMap[edge.source]) {
+      edge.data = {
+        ...edge.data,
+        sourceType: nodesMap[edge.source].data.type!,
+      } as any
+    }
+
+    if (!edge.data?.targetType && edge.target && nodesMap[edge.target]) {
+      edge.data = {
+        ...edge.data,
+        targetType: nodesMap[edge.target].data.type!,
+      } as any
+    }
+
+    if (selectedNode) {
+      edge.data = {
+        ...edge.data,
+        _connectedNodeIsSelected: edge.source === selectedNode.id || edge.target === selectedNode.id,
+      } as any
+    }
+
+    return edge
+  })
+}
diff --git a/app/components/workflow/utils/workflow.ts b/app/components/workflow/utils/workflow.ts
new file mode 100644
index 0000000..88c31f0
--- /dev/null
+++ b/app/components/workflow/utils/workflow.ts
@@ -0,0 +1,329 @@
+import {
+  getConnectedEdges,
+  getIncomers,
+  getOutgoers,
+} from 'reactflow'
+import { v4 as uuid4 } from 'uuid'
+import {
+  groupBy,
+  isEqual,
+  uniqBy,
+} from 'lodash-es'
+import type {
+  Edge,
+  Node,
+} from '../types'
+import {
+  BlockEnum,
+} from '../types'
+import type { IterationNodeType } from '../nodes/iteration/types'
+import type { LoopNodeType } from '../nodes/loop/types'
+
+export const canRunBySingle = (nodeType: BlockEnum) => {
+  return nodeType === BlockEnum.LLM
+    || nodeType === BlockEnum.KnowledgeRetrieval
+    || nodeType === BlockEnum.Code
+    || nodeType === BlockEnum.TemplateTransform
+    || nodeType === BlockEnum.QuestionClassifier
+    || nodeType === BlockEnum.HttpRequest
+    || nodeType === BlockEnum.Tool
+    || nodeType === BlockEnum.ParameterExtractor
+    || nodeType === BlockEnum.Iteration
+    || nodeType === BlockEnum.Agent
+    || nodeType === BlockEnum.DocExtractor
+    || nodeType === BlockEnum.Loop
+}
+
+type ConnectedSourceOrTargetNodesChange = {
+  type: string
+  edge: Edge
+}[]
+export const getNodesConnectedSourceOrTargetHandleIdsMap = (changes: ConnectedSourceOrTargetNodesChange, nodes: Node[]) => {
+  const nodesConnectedSourceOrTargetHandleIdsMap = {} as Record<string, any>
+
+  changes.forEach((change) => {
+    const {
+      edge,
+      type,
+    } = change
+    const sourceNode = nodes.find(node => node.id === edge.source)!
+    if (sourceNode) {
+      nodesConnectedSourceOrTargetHandleIdsMap[sourceNode.id] = nodesConnectedSourceOrTargetHandleIdsMap[sourceNode.id] || {
+        _connectedSourceHandleIds: [...(sourceNode?.data._connectedSourceHandleIds || [])],
+        _connectedTargetHandleIds: [...(sourceNode?.data._connectedTargetHandleIds || [])],
+      }
+    }
+
+    const targetNode = nodes.find(node => node.id === edge.target)!
+    if (targetNode) {
+      nodesConnectedSourceOrTargetHandleIdsMap[targetNode.id] = nodesConnectedSourceOrTargetHandleIdsMap[targetNode.id] || {
+        _connectedSourceHandleIds: [...(targetNode?.data._connectedSourceHandleIds || [])],
+        _connectedTargetHandleIds: [...(targetNode?.data._connectedTargetHandleIds || [])],
+      }
+    }
+
+    if (sourceNode) {
+      if (type === 'remove') {
+        const index = nodesConnectedSourceOrTargetHandleIdsMap[sourceNode.id]._connectedSourceHandleIds.findIndex((handleId: string) => handleId === edge.sourceHandle)
+        nodesConnectedSourceOrTargetHandleIdsMap[sourceNode.id]._connectedSourceHandleIds.splice(index, 1)
+      }
+
+      if (type === 'add')
+        nodesConnectedSourceOrTargetHandleIdsMap[sourceNode.id]._connectedSourceHandleIds.push(edge.sourceHandle || 'source')
+    }
+
+    if (targetNode) {
+      if (type === 'remove') {
+        const index = nodesConnectedSourceOrTargetHandleIdsMap[targetNode.id]._connectedTargetHandleIds.findIndex((handleId: string) => handleId === edge.targetHandle)
+        nodesConnectedSourceOrTargetHandleIdsMap[targetNode.id]._connectedTargetHandleIds.splice(index, 1)
+      }
+
+      if (type === 'add')
+        nodesConnectedSourceOrTargetHandleIdsMap[targetNode.id]._connectedTargetHandleIds.push(edge.targetHandle || 'target')
+    }
+  })
+
+  return nodesConnectedSourceOrTargetHandleIdsMap
+}
+
+export const getValidTreeNodes = (nodes: Node[], edges: Edge[]) => {
+  const startNode = nodes.find(node => node.data.type === BlockEnum.Start)
+
+  if (!startNode) {
+    return {
+      validNodes: [],
+      maxDepth: 0,
+    }
+  }
+
+  const list: Node[] = [startNode]
+  let maxDepth = 1
+
+  const traverse = (root: Node, depth: number) => {
+    if (depth > maxDepth)
+      maxDepth = depth
+
+    const outgoers = getOutgoers(root, nodes, edges)
+
+    if (outgoers.length) {
+      outgoers.forEach((outgoer) => {
+        list.push(outgoer)
+
+        if (outgoer.data.type === BlockEnum.Iteration)
+          list.push(...nodes.filter(node => node.parentId === outgoer.id))
+        if (outgoer.data.type === BlockEnum.Loop)
+          list.push(...nodes.filter(node => node.parentId === outgoer.id))
+
+        traverse(outgoer, depth + 1)
+      })
+    }
+    else {
+      list.push(root)
+
+      if (root.data.type === BlockEnum.Iteration)
+        list.push(...nodes.filter(node => node.parentId === root.id))
+      if (root.data.type === BlockEnum.Loop)
+        list.push(...nodes.filter(node => node.parentId === root.id))
+    }
+  }
+
+  traverse(startNode, maxDepth)
+
+  return {
+    validNodes: uniqBy(list, 'id'),
+    maxDepth,
+  }
+}
+
+export const changeNodesAndEdgesId = (nodes: Node[], edges: Edge[]) => {
+  const idMap = nodes.reduce((acc, node) => {
+    acc[node.id] = uuid4()
+
+    return acc
+  }, {} as Record<string, string>)
+
+  const newNodes = nodes.map((node) => {
+    return {
+      ...node,
+      id: idMap[node.id],
+    }
+  })
+
+  const newEdges = edges.map((edge) => {
+    return {
+      ...edge,
+      source: idMap[edge.source],
+      target: idMap[edge.target],
+    }
+  })
+
+  return [newNodes, newEdges] as [Node[], Edge[]]
+}
+
+type ParallelInfoItem = {
+  parallelNodeId: string
+  depth: number
+  isBranch?: boolean
+}
+type NodeParallelInfo = {
+  parallelNodeId: string
+  edgeHandleId: string
+  depth: number
+}
+type NodeHandle = {
+  node: Node
+  handle: string
+}
+type NodeStreamInfo = {
+  upstreamNodes: Set<string>
+  downstreamEdges: Set<string>
+}
+export const getParallelInfo = (nodes: Node[], edges: Edge[], parentNodeId?: string) => {
+  let startNode
+
+  if (parentNodeId) {
+    const parentNode = nodes.find(node => node.id === parentNodeId)
+    if (!parentNode)
+      throw new Error('Parent node not found')
+
+    startNode = nodes.find(node => node.id === (parentNode.data as (IterationNodeType | LoopNodeType)).start_node_id)
+  }
+  else {
+    startNode = nodes.find(node => node.data.type === BlockEnum.Start)
+  }
+  if (!startNode)
+    throw new Error('Start node not found')
+
+  const parallelList = [] as ParallelInfoItem[]
+  const nextNodeHandles = [{ node: startNode, handle: 'source' }]
+  let hasAbnormalEdges = false
+
+  const traverse = (firstNodeHandle: NodeHandle) => {
+    const nodeEdgesSet = {} as Record<string, Set<string>>
+    const totalEdgesSet = new Set<string>()
+    const nextHandles = [firstNodeHandle]
+    const streamInfo = {} as Record<string, NodeStreamInfo>
+    const parallelListItem = {
+      parallelNodeId: '',
+      depth: 0,
+    } as ParallelInfoItem
+    const nodeParallelInfoMap = {} as Record<string, NodeParallelInfo>
+    nodeParallelInfoMap[firstNodeHandle.node.id] = {
+      parallelNodeId: '',
+      edgeHandleId: '',
+      depth: 0,
+    }
+
+    while (nextHandles.length) {
+      const currentNodeHandle = nextHandles.shift()!
+      const { node: currentNode, handle: currentHandle = 'source' } = currentNodeHandle
+      const currentNodeHandleKey = currentNode.id
+      const connectedEdges = edges.filter(edge => edge.source === currentNode.id && edge.sourceHandle === currentHandle)
+      const connectedEdgesLength = connectedEdges.length
+      const outgoers = nodes.filter(node => connectedEdges.some(edge => edge.target === node.id))
+      const incomers = getIncomers(currentNode, nodes, edges)
+
+      if (!streamInfo[currentNodeHandleKey]) {
+        streamInfo[currentNodeHandleKey] = {
+          upstreamNodes: new Set<string>(),
+          downstreamEdges: new Set<string>(),
+        }
+      }
+
+      if (nodeEdgesSet[currentNodeHandleKey]?.size > 0 && incomers.length > 1) {
+        const newSet = new Set<string>()
+        for (const item of totalEdgesSet) {
+          if (!streamInfo[currentNodeHandleKey].downstreamEdges.has(item))
+            newSet.add(item)
+        }
+        if (isEqual(nodeEdgesSet[currentNodeHandleKey], newSet)) {
+          parallelListItem.depth = nodeParallelInfoMap[currentNode.id].depth
+          nextNodeHandles.push({ node: currentNode, handle: currentHandle })
+          break
+        }
+      }
+
+      if (nodeParallelInfoMap[currentNode.id].depth > parallelListItem.depth)
+        parallelListItem.depth = nodeParallelInfoMap[currentNode.id].depth
+
+      outgoers.forEach((outgoer) => {
+        const outgoerConnectedEdges = getConnectedEdges([outgoer], edges).filter(edge => edge.source === outgoer.id)
+        const sourceEdgesGroup = groupBy(outgoerConnectedEdges, 'sourceHandle')
+        const incomers = getIncomers(outgoer, nodes, edges)
+
+        if (outgoers.length > 1 && incomers.length > 1)
+          hasAbnormalEdges = true
+
+        Object.keys(sourceEdgesGroup).forEach((sourceHandle) => {
+          nextHandles.push({ node: outgoer, handle: sourceHandle })
+        })
+        if (!outgoerConnectedEdges.length)
+          nextHandles.push({ node: outgoer, handle: 'source' })
+
+        const outgoerKey = outgoer.id
+        if (!nodeEdgesSet[outgoerKey])
+          nodeEdgesSet[outgoerKey] = new Set<string>()
+
+        if (nodeEdgesSet[currentNodeHandleKey]) {
+          for (const item of nodeEdgesSet[currentNodeHandleKey])
+            nodeEdgesSet[outgoerKey].add(item)
+        }
+
+        if (!streamInfo[outgoerKey]) {
+          streamInfo[outgoerKey] = {
+            upstreamNodes: new Set<string>(),
+            downstreamEdges: new Set<string>(),
+          }
+        }
+
+        if (!nodeParallelInfoMap[outgoer.id]) {
+          nodeParallelInfoMap[outgoer.id] = {
+            ...nodeParallelInfoMap[currentNode.id],
+          }
+        }
+
+        if (connectedEdgesLength > 1) {
+          const edge = connectedEdges.find(edge => edge.target === outgoer.id)!
+          nodeEdgesSet[outgoerKey].add(edge.id)
+          totalEdgesSet.add(edge.id)
+
+          streamInfo[currentNodeHandleKey].downstreamEdges.add(edge.id)
+          streamInfo[outgoerKey].upstreamNodes.add(currentNodeHandleKey)
+
+          for (const item of streamInfo[currentNodeHandleKey].upstreamNodes)
+            streamInfo[item].downstreamEdges.add(edge.id)
+
+          if (!parallelListItem.parallelNodeId)
+            parallelListItem.parallelNodeId = currentNode.id
+
+          const prevDepth = nodeParallelInfoMap[currentNode.id].depth + 1
+          const currentDepth = nodeParallelInfoMap[outgoer.id].depth
+
+          nodeParallelInfoMap[outgoer.id].depth = Math.max(prevDepth, currentDepth)
+        }
+        else {
+          for (const item of streamInfo[currentNodeHandleKey].upstreamNodes)
+            streamInfo[outgoerKey].upstreamNodes.add(item)
+
+          nodeParallelInfoMap[outgoer.id].depth = nodeParallelInfoMap[currentNode.id].depth
+        }
+      })
+    }
+
+    parallelList.push(parallelListItem)
+  }
+
+  while (nextNodeHandles.length) {
+    const nodeHandle = nextNodeHandles.shift()!
+    traverse(nodeHandle)
+  }
+
+  return {
+    parallelList,
+    hasAbnormalEdges,
+  }
+}
+
+export const hasErrorHandleNode = (nodeType?: BlockEnum) => {
+  return nodeType === BlockEnum.LLM || nodeType === BlockEnum.Tool || nodeType === BlockEnum.HttpRequest || nodeType === BlockEnum.Code
+}
diff --git a/app/components/workflow/workflow-history-store.tsx b/app/components/workflow/workflow-history-store.tsx
new file mode 100644
index 0000000..52132f3
--- /dev/null
+++ b/app/components/workflow/workflow-history-store.tsx
@@ -0,0 +1,121 @@
+import { type ReactNode, createContext, useContext, useMemo, useState } from 'react'
+import { type StoreApi, create } from 'zustand'
+import { type TemporalState, temporal } from 'zundo'
+import isDeepEqual from 'fast-deep-equal'
+import type { Edge, Node } from './types'
+import type { WorkflowHistoryEvent } from './hooks'
+import { noop } from 'lodash-es'
+
+export const WorkflowHistoryStoreContext = createContext<WorkflowHistoryStoreContextType>({ store: null, shortcutsEnabled: true, setShortcutsEnabled: noop })
+export const Provider = WorkflowHistoryStoreContext.Provider
+
+export function WorkflowHistoryProvider({
+  nodes,
+  edges,
+  children,
+}: WorkflowWithHistoryProviderProps) {
+  const [shortcutsEnabled, setShortcutsEnabled] = useState(true)
+  const [store] = useState(() =>
+    createStore({
+      nodes,
+      edges,
+    }),
+  )
+
+  const contextValue = {
+    store,
+    shortcutsEnabled,
+    setShortcutsEnabled,
+  }
+
+  return (
+    <Provider value={contextValue}>
+      {children}
+    </Provider>
+  )
+}
+
+export function useWorkflowHistoryStore() {
+  const {
+    store,
+    shortcutsEnabled,
+    setShortcutsEnabled,
+  } = useContext(WorkflowHistoryStoreContext)
+  if (store === null)
+    throw new Error('useWorkflowHistoryStoreApi must be used within a WorkflowHistoryProvider')
+
+  return {
+    store: useMemo(
+      () => ({
+        getState: store.getState,
+        setState: (state: WorkflowHistoryState) => {
+          store.setState({
+            workflowHistoryEvent: state.workflowHistoryEvent,
+            nodes: state.nodes.map((node: Node) => ({ ...node, data: { ...node.data, selected: false } })),
+            edges: state.edges.map((edge: Edge) => ({ ...edge, selected: false }) as Edge),
+          })
+        },
+        subscribe: store.subscribe,
+        temporal: store.temporal,
+      }),
+      [store],
+    ),
+    shortcutsEnabled,
+    setShortcutsEnabled,
+  }
+}
+
+function createStore({
+  nodes: storeNodes,
+  edges: storeEdges,
+}: {
+  nodes: Node[]
+  edges: Edge[]
+}): WorkflowHistoryStoreApi {
+  const store = create(temporal<WorkflowHistoryState>(
+    (set, get) => {
+      return {
+        workflowHistoryEvent: undefined,
+        nodes: storeNodes,
+        edges: storeEdges,
+        getNodes: () => get().nodes,
+        setNodes: (nodes: Node[]) => set({ nodes }),
+        setEdges: (edges: Edge[]) => set({ edges }),
+      }
+    },
+    {
+      equality: (pastState, currentState) =>
+        isDeepEqual(pastState, currentState),
+    },
+  ),
+  )
+
+  return store
+}
+
+export type WorkflowHistoryStore = {
+  nodes: Node[]
+  edges: Edge[]
+  workflowHistoryEvent: WorkflowHistoryEvent | undefined
+}
+
+export type WorkflowHistoryActions = {
+  setNodes?: (nodes: Node[]) => void
+  setEdges?: (edges: Edge[]) => void
+}
+
+export type WorkflowHistoryState = WorkflowHistoryStore & WorkflowHistoryActions
+
+type WorkflowHistoryStoreContextType = {
+  store: ReturnType<typeof createStore> | null
+  shortcutsEnabled: boolean
+  setShortcutsEnabled: (enabled: boolean) => void
+}
+
+export type WorkflowHistoryStoreApi = StoreApi<WorkflowHistoryState> & { temporal: StoreApi<TemporalState<WorkflowHistoryState>> }
+
+export type WorkflowWithHistoryProviderProps = {
+  nodes: Node[]
+  edges: Edge[]
+  children: ReactNode
+}
diff --git a/app/dev-only/i18n-checker/page.tsx b/app/dev-only/i18n-checker/page.tsx
new file mode 100644
index 0000000..5ed0c86
--- /dev/null
+++ b/app/dev-only/i18n-checker/page.tsx
@@ -0,0 +1,164 @@
+'use client'
+import { resources } from '@/i18n/i18next-config'
+import { useEffect, useState } from 'react'
+import cn from '@/utils/classnames'
+
+export default function I18nTest() {
+  const [langs, setLangs] = useState<Lang[]>([])
+
+  useEffect(() => {
+    setLangs(genLangs())
+  }, [])
+
+  return (
+    <div
+      style={{
+        height: 'calc(100% - 6em)',
+        overflowY: 'auto',
+        margin: '1em 1em 5em',
+      }}
+    >
+
+      <div style={{ minHeight: '75vh' }}>
+        <h2>Summary</h2>
+
+        <table
+          className={cn('mt-2 min-w-[340px] border-collapse border-0')}
+        >
+          <thead className="system-xs-medium-uppercase text-text-tertiary">
+            <tr>
+              <td className="w-5 min-w-5 whitespace-nowrap rounded-l-lg bg-background-section-burn pl-2 pr-1">
+                #
+              </td>
+              <td className="w-20 min-w-20 whitespace-nowrap bg-background-section-burn py-1.5 pl-3">
+                lang
+              </td>
+              <td className="w-20 min-w-20 whitespace-nowrap bg-background-section-burn py-1.5 pl-3">
+                count
+              </td>
+              <td className="w-20 min-w-20 whitespace-nowrap bg-background-section-burn py-1.5 pl-3">
+                missing
+              </td>
+              <td className="w-20 min-w-20 whitespace-nowrap bg-background-section-burn py-1.5 pl-3">
+                extra
+              </td>
+            </tr>
+          </thead>
+          <tbody className="system-sm-regular text-text-secondary">
+            {langs.map(({ locale, count, missing, extra }, idx) => <tr key={locale}>
+              <td className="">{idx}</td>
+              <td className="p-1.5">{locale}</td>
+              <td>{count}</td>
+              <td>{missing.length}</td>
+              <td>{extra.length}</td>
+            </tr>)}
+          </tbody>
+        </table>
+      </div>
+
+      <h2>Details</h2>
+
+      <table
+        className={cn('mt-2 w-full min-w-[340px] border-collapse border-0')}
+      >
+        <thead className="system-xs-medium-uppercase text-text-tertiary">
+          <tr>
+            <td className="w-5 min-w-5 whitespace-nowrap rounded-l-lg bg-background-section-burn pl-2 pr-1">
+              #
+            </td>
+            <td className="w-20 min-w-20 whitespace-nowrap bg-background-section-burn py-1.5 pl-3">
+              lang
+            </td>
+            <td className="w-full whitespace-nowrap bg-background-section-burn py-1.5 pl-3">
+              missing
+            </td>
+            <td className="w-full whitespace-nowrap bg-background-section-burn py-1.5 pl-3">
+              extra
+            </td>
+          </tr>
+        </thead>
+
+        <tbody>
+          {langs.map(({ locale, missing, extra }, idx) => {
+            return (<tr key={locale}>
+              <td className="py-2 align-top">{idx}</td>
+              <td className="py-2 align-top">{locale}</td>
+              <td className="py-2 align-top">
+                <ul>
+                  {missing.map(key => (
+                    <li key={key}>{key}</li>
+                  ))}
+                </ul>
+              </td>
+              <td className="py-2 align-top">
+                <ul>
+                  {extra.map(key => (
+                    <li key={key}>{key}</li>
+                  ))}
+                </ul>
+              </td>
+            </tr>
+            )
+          })}
+        </tbody>
+      </table>
+
+    </div>
+  )
+}
+
+function genLangs() {
+  const langs_: Lang[] = []
+  let en!: Lang
+
+  for (const [key, value] of Object.entries(resources)) {
+    const keys = getNestedKeys(value.translation)
+    const lang: Lang = {
+      locale: key,
+      keys: new Set(keys),
+      count: keys.length,
+      missing: [],
+      extra: [],
+    }
+
+    langs_.push(lang)
+    if (key === 'en-US') en = lang
+  }
+
+  for (const lang of langs_) {
+    const missing: string[] = []
+    const extra: string[] = []
+
+    for (const key of lang.keys)
+      if (!en.keys.has(key)) extra.push(key)
+
+    for (const key of en.keys)
+      if (!lang.keys.has(key)) missing.push(key)
+
+    lang.missing = missing
+    lang.extra = extra
+  }
+  return langs_
+}
+
+function getNestedKeys(translation: Record<string, any>): string[] {
+  const nestedKeys: string[] = []
+  const iterateKeys = (obj: Record<string, any>, prefix = '') => {
+    for (const key in obj) {
+      const nestedKey = prefix ? `${prefix}.${key}` : key
+      //   nestedKeys.push(nestedKey);
+      if (typeof obj[key] === 'object') iterateKeys(obj[key], nestedKey)
+      else if (typeof obj[key] === 'string') nestedKeys.push(nestedKey)
+    }
+  }
+  iterateKeys(translation)
+  return nestedKeys
+}
+
+type Lang = {
+  locale: string;
+  keys: Set<string>;
+  count: number;
+  missing: string[];
+  extra: string[];
+}
diff --git a/app/dev-only/layout.tsx b/app/dev-only/layout.tsx
new file mode 100644
index 0000000..d8bcc5e
--- /dev/null
+++ b/app/dev-only/layout.tsx
@@ -0,0 +1,9 @@
+import type React from 'react'
+import { notFound } from 'next/navigation'
+
+export default async function Layout({ children }: React.PropsWithChildren) {
+  if (process.env.NODE_ENV !== 'development')
+    notFound()
+
+  return children
+}
diff --git a/app/dev-preview/page.tsx b/app/dev-preview/page.tsx
new file mode 100644
index 0000000..69464d6
--- /dev/null
+++ b/app/dev-preview/page.tsx
@@ -0,0 +1,11 @@
+'use client'
+
+import DemoForm from '../components/base/form/form-scenarios/demo'
+
+export default function Page() {
+  return (
+    <div className='flex h-screen w-full items-center justify-center p-20'>
+      <DemoForm />
+    </div>
+  )
+}
diff --git a/app/education-apply/constants.ts b/app/education-apply/constants.ts
new file mode 100644
index 0000000..a5672d1
--- /dev/null
+++ b/app/education-apply/constants.ts
@@ -0,0 +1,2 @@
+export const EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION = 'getEducationVerify'
+export const EDUCATION_VERIFYING_LOCALSTORAGE_ITEM = 'educationVerifying'
diff --git a/app/education-apply/education-apply-page.tsx b/app/education-apply/education-apply-page.tsx
new file mode 100644
index 0000000..980e36e
--- /dev/null
+++ b/app/education-apply/education-apply-page.tsx
@@ -0,0 +1,189 @@
+'use client'
+
+import {
+  useMemo,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiExternalLinkLine } from '@remixicon/react'
+import {
+  useRouter,
+  useSearchParams,
+} from 'next/navigation'
+import UserInfo from './user-info'
+import SearchInput from './search-input'
+import RoleSelector from './role-selector'
+import Confirm from './verify-state-modal'
+import Button from '@/app/components/base/button'
+import Checkbox from '@/app/components/base/checkbox'
+import {
+  useEducationAdd,
+  useInvalidateEducationStatus,
+} from '@/service/use-education'
+import { useProviderContext } from '@/context/provider-context'
+import { useToastContext } from '@/app/components/base/toast'
+import { EDUCATION_VERIFYING_LOCALSTORAGE_ITEM } from '@/app/education-apply/constants'
+import { getLocaleOnClient } from '@/i18n'
+import { noop } from 'lodash-es'
+import DifyLogo from '../components/base/logo/dify-logo'
+
+const EducationApplyAge = () => {
+  const { t } = useTranslation()
+  const locale = getLocaleOnClient()
+  const [schoolName, setSchoolName] = useState('')
+  const [role, setRole] = useState('Student')
+  const [ageChecked, setAgeChecked] = useState(false)
+  const [inSchoolChecked, setInSchoolChecked] = useState(false)
+  const {
+    isPending,
+    mutateAsync: educationAdd,
+  } = useEducationAdd({ onSuccess: noop })
+  const [modalShow, setShowModal] = useState<undefined | { title: string; desc: string; onConfirm?: () => void }>(undefined)
+  const { onPlanInfoChanged } = useProviderContext()
+  const updateEducationStatus = useInvalidateEducationStatus()
+  const { notify } = useToastContext()
+  const router = useRouter()
+
+  const docLink = useMemo(() => {
+    if (locale === 'zh-Hans')
+      return 'https://docs.dify.ai/zh-hans/getting-started/dify-for-education'
+    if (locale === 'ja-JP')
+      return 'https://docs.dify.ai/ja-jp/getting-started/dify-for-education'
+    return 'https://docs.dify.ai/getting-started/dify-for-education'
+  }, [locale])
+
+  const handleModalConfirm = () => {
+    setShowModal(undefined)
+    onPlanInfoChanged()
+    updateEducationStatus()
+    localStorage.removeItem(EDUCATION_VERIFYING_LOCALSTORAGE_ITEM)
+    router.replace('/')
+  }
+
+  const searchParams = useSearchParams()
+  const token = searchParams.get('token')
+  const handleSubmit = () => {
+    educationAdd({
+      token: token || '',
+      role,
+      institution: schoolName,
+    }).then((res) => {
+      if (res.message === 'success') {
+        setShowModal({
+          title: t('education.successTitle'),
+          desc: t('education.successContent'),
+          onConfirm: handleModalConfirm,
+        })
+      }
+      else {
+        notify({
+          type: 'error',
+          message: t('education.submitError'),
+        })
+      }
+    })
+  }
+
+  return (
+    <div className='fixed inset-0 z-[31] overflow-y-auto bg-background-body p-6'>
+      <div className='mx-auto w-full max-w-[1408px] rounded-2xl border border-effects-highlight bg-background-default-subtle'>
+        <div
+          className="h-[349px] w-full overflow-hidden rounded-t-2xl bg-cover bg-center bg-no-repeat"
+          style={{
+            backgroundImage: 'url(/education/bg.png)',
+          }}
+        >
+        </div>
+        <div className='mt-[-349px] box-content flex h-7 items-center justify-between p-6'>
+          <DifyLogo size='large' style='monochromeWhite' />
+        </div>
+        <div className='mx-auto max-w-[720px] px-8 pb-[180px]'>
+          <div className='mb-2 flex h-[192px] flex-col justify-end pb-4 pt-3 text-text-primary-on-surface'>
+            <div className='title-5xl-bold mb-2 shadow-xs'>{t('education.toVerified')}</div>
+            <div className='system-md-medium shadow-xs'>
+              {t('education.toVerifiedTip.front')}&nbsp;
+              <span className='system-md-semibold underline'>{t('education.toVerifiedTip.coupon')}</span>&nbsp;
+              {t('education.toVerifiedTip.end')}
+            </div>
+          </div>
+          <div className='mb-7'>
+            <UserInfo />
+          </div>
+          <div className='mb-7'>
+            <div className='system-md-semibold mb-1 flex h-6 items-center text-text-secondary'>
+              {t('education.form.schoolName.title')}
+            </div>
+            <SearchInput
+              value={schoolName}
+              onChange={setSchoolName}
+            />
+          </div>
+          <div className='mb-7'>
+            <div className='system-md-semibold mb-1 flex h-6 items-center text-text-secondary'>
+              {t('education.form.schoolRole.title')}
+            </div>
+            <RoleSelector
+              value={role}
+              onChange={setRole}
+            />
+          </div>
+          <div className='mb-7'>
+            <div className='system-md-semibold mb-1 flex h-6 items-center text-text-secondary'>
+              {t('education.form.terms.title')}
+            </div>
+            <div className='system-md-regular mb-1 text-text-tertiary'>
+              {t('education.form.terms.desc.front')}&nbsp;
+              <a href='https://dify.ai/terms' target='_blank' className='text-text-secondary hover:underline'>{t('education.form.terms.desc.termsOfService')}</a>&nbsp;
+              {t('education.form.terms.desc.and')}&nbsp;
+              <a href='https://dify.ai/privacy' target='_blank' className='text-text-secondary hover:underline'>{t('education.form.terms.desc.privacyPolicy')}</a>
+              {t('education.form.terms.desc.end')}
+            </div>
+            <div className='system-md-regular py-2 text-text-primary'>
+              <div className='mb-2 flex'>
+                <Checkbox
+                  className='mr-2 shrink-0'
+                  checked={ageChecked}
+                  onCheck={() => setAgeChecked(!ageChecked)}
+                />
+                {t('education.form.terms.option.age')}
+              </div>
+              <div className='flex'>
+                <Checkbox
+                  className='mr-2 shrink-0'
+                  checked={inSchoolChecked}
+                  onCheck={() => setInSchoolChecked(!inSchoolChecked)}
+                />
+                {t('education.form.terms.option.inSchool')}
+              </div>
+            </div>
+          </div>
+          <Button
+            variant='primary'
+            disabled={!ageChecked || !inSchoolChecked || !schoolName || !role || isPending}
+            onClick={handleSubmit}
+          >
+            {t('education.submit')}
+          </Button>
+          <div className='mb-4 mt-5 h-[1px] bg-gradient-to-r from-[rgba(16,24,40,0.08)]'></div>
+          <a
+            className='system-xs-regular flex items-center text-text-accent'
+            href={docLink}
+            target='_blank'
+          >
+            {t('education.learn')}
+            <RiExternalLinkLine className='ml-1 h-3 w-3' />
+          </a>
+        </div>
+      </div>
+      <Confirm
+        isShow={!!modalShow}
+        title={modalShow?.title || ''}
+        content={modalShow?.desc}
+        onConfirm={modalShow?.onConfirm || noop}
+        onCancel={modalShow?.onConfirm || noop}
+      />
+    </div>
+  )
+}
+
+export default EducationApplyAge
diff --git a/app/education-apply/hooks.ts b/app/education-apply/hooks.ts
new file mode 100644
index 0000000..01fb36c
--- /dev/null
+++ b/app/education-apply/hooks.ts
@@ -0,0 +1,67 @@
+import {
+  useCallback,
+  useEffect,
+  useState,
+} from 'react'
+import { useDebounceFn } from 'ahooks'
+import { useSearchParams } from 'next/navigation'
+import type { SearchParams } from './types'
+import {
+  EDUCATION_VERIFYING_LOCALSTORAGE_ITEM,
+  EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION,
+} from './constants'
+import { useEducationAutocomplete } from '@/service/use-education'
+import { useModalContextSelector } from '@/context/modal-context'
+
+export const useEducation = () => {
+  const {
+    mutateAsync,
+    isPending,
+    data,
+  } = useEducationAutocomplete()
+
+  const [prevSchools, setPrevSchools] = useState<string[]>([])
+  const handleUpdateSchools = useCallback((searchParams: SearchParams) => {
+    if (searchParams.keywords) {
+      mutateAsync(searchParams).then((res) => {
+        const currentPage = searchParams.page || 0
+        const resSchools = res.data
+        if (currentPage > 0)
+          setPrevSchools(prevSchools => [...(prevSchools || []), ...resSchools])
+        else
+          setPrevSchools(resSchools)
+      })
+    }
+  }, [mutateAsync])
+
+  const { run: querySchoolsWithDebounced } = useDebounceFn((searchParams: SearchParams) => {
+    handleUpdateSchools(searchParams)
+  }, {
+    wait: 300,
+  })
+
+  return {
+    schools: prevSchools,
+    setSchools: setPrevSchools,
+    querySchoolsWithDebounced,
+    handleUpdateSchools,
+    isLoading: isPending,
+    hasNext: data?.has_next,
+  }
+}
+
+export const useEducationInit = () => {
+  const setShowAccountSettingModal = useModalContextSelector(s => s.setShowAccountSettingModal)
+  const educationVerifying = localStorage.getItem(EDUCATION_VERIFYING_LOCALSTORAGE_ITEM)
+  const searchParams = useSearchParams()
+  const educationVerifyAction = searchParams.get('action')
+
+  useEffect(() => {
+    if (educationVerifying === 'yes' || educationVerifyAction === EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION) {
+      setShowAccountSettingModal({ payload: 'billing' })
+
+      if (educationVerifyAction === EDUCATION_VERIFY_URL_SEARCHPARAMS_ACTION)
+        localStorage.setItem(EDUCATION_VERIFYING_LOCALSTORAGE_ITEM, 'yes')
+    }
+  }, [setShowAccountSettingModal, educationVerifying, educationVerifyAction])
+}
diff --git a/app/education-apply/role-selector.tsx b/app/education-apply/role-selector.tsx
new file mode 100644
index 0000000..b8448a0
--- /dev/null
+++ b/app/education-apply/role-selector.tsx
@@ -0,0 +1,53 @@
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+
+type RoleSelectorProps = {
+  onChange: (value: string) => void
+  value: string
+}
+
+const RoleSelector = ({
+  onChange,
+  value,
+}: RoleSelectorProps) => {
+  const { t } = useTranslation()
+  const options = [
+    {
+      key: 'Student',
+      value: t('education.form.schoolRole.option.student'),
+    },
+    {
+      key: 'Teacher',
+      value: t('education.form.schoolRole.option.teacher'),
+    },
+    {
+      key: 'School-Administrator',
+      value: t('education.form.schoolRole.option.administrator'),
+    },
+  ]
+
+  return (
+    <div className='flex'>
+      {
+        options.map(option => (
+          <div
+            key={option.key}
+            className='system-md-regular mr-6 flex h-5 cursor-pointer items-center text-text-primary'
+            onClick={() => onChange(option.key)}
+          >
+            <div
+              className={cn(
+                'mr-2 h-4 w-4 rounded-full border border-components-radio-border bg-components-radio-bg shadow-xs',
+                option.key === value && 'border-[5px] border-components-radio-border-checked ',
+              )}
+            >
+            </div>
+            {option.value}
+          </div>
+        ))
+      }
+    </div>
+  )
+}
+
+export default RoleSelector
diff --git a/app/education-apply/search-input.tsx b/app/education-apply/search-input.tsx
new file mode 100644
index 0000000..63a393b
--- /dev/null
+++ b/app/education-apply/search-input.tsx
@@ -0,0 +1,122 @@
+import type { ChangeEventHandler } from 'react'
+import {
+  useCallback,
+  useRef,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { useEducation } from './hooks'
+import Input from '@/app/components/base/input'
+import {
+  PortalToFollowElem,
+  PortalToFollowElemContent,
+  PortalToFollowElemTrigger,
+} from '@/app/components/base/portal-to-follow-elem'
+
+type SearchInputProps = {
+  value?: string
+  onChange: (value: string) => void
+}
+const SearchInput = ({
+  value,
+  onChange,
+}: SearchInputProps) => {
+  const { t } = useTranslation()
+  const [open, setOpen] = useState(false)
+  const {
+    schools,
+    setSchools,
+    querySchoolsWithDebounced,
+    handleUpdateSchools,
+    hasNext,
+  } = useEducation()
+  const pageRef = useRef(0)
+  const valueRef = useRef(value)
+
+  const handleSearch = useCallback((debounced?: boolean) => {
+    const keywords = valueRef.current
+    const page = pageRef.current
+    if (debounced) {
+      querySchoolsWithDebounced({
+        keywords,
+        page,
+      })
+      return
+    }
+
+    handleUpdateSchools({
+      keywords,
+      page,
+    })
+  }, [querySchoolsWithDebounced, handleUpdateSchools])
+
+  const handleValueChange: ChangeEventHandler<HTMLInputElement> = useCallback((e) => {
+    setOpen(true)
+    setSchools([])
+    pageRef.current = 0
+    const inputValue = e.target.value
+    valueRef.current = inputValue
+    onChange(inputValue)
+    handleSearch(true)
+  }, [onChange, handleSearch, setSchools])
+
+  const handleScroll = useCallback((e: Event) => {
+    const target = e.target as HTMLDivElement
+    const {
+      scrollTop,
+      scrollHeight,
+      clientHeight,
+    } = target
+    if (scrollTop + clientHeight >= scrollHeight - 5 && scrollTop > 0 && hasNext) {
+      pageRef.current += 1
+      handleSearch()
+    }
+  }, [handleSearch, hasNext])
+
+  return (
+    <PortalToFollowElem
+      open={open}
+      onOpenChange={setOpen}
+      placement='bottom'
+      offset={4}
+      triggerPopupSameWidth
+    >
+      <PortalToFollowElemTrigger className='block w-full'>
+        <Input
+          className='w-full'
+          placeholder={t('education.form.schoolName.placeholder')}
+          value={value}
+          onChange={handleValueChange}
+        />
+      </PortalToFollowElemTrigger>
+      <PortalToFollowElemContent className='z-[32]'>
+        {
+          !!schools.length && value && (
+            <div
+              className='max-h-[330px] overflow-y-auto rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1'
+              onScroll={handleScroll as any}
+            >
+              {
+                schools.map((school, index) => (
+                  <div
+                    key={index}
+                    className='system-md-regular flex h-8 cursor-pointer items-center truncate rounded-lg px-2 py-1.5 text-text-secondary hover:bg-state-base-hover'
+                    title={school}
+                    onClick={() => {
+                      onChange(school)
+                      setOpen(false)
+                    }}
+                  >
+                    {school}
+                  </div>
+                ))
+              }
+            </div>
+          )
+        }
+      </PortalToFollowElemContent>
+    </PortalToFollowElem>
+  )
+}
+
+export default SearchInput
diff --git a/app/education-apply/types.ts b/app/education-apply/types.ts
new file mode 100644
index 0000000..ff435c6
--- /dev/null
+++ b/app/education-apply/types.ts
@@ -0,0 +1,11 @@
+export type SearchParams = {
+  keywords?: string
+  page?: number
+  limit?: number
+}
+
+export type EducationAddParams = {
+  token: string
+  institution: string
+  role: string
+}
diff --git a/app/education-apply/user-info.tsx b/app/education-apply/user-info.tsx
new file mode 100644
index 0000000..e1d60a5
--- /dev/null
+++ b/app/education-apply/user-info.tsx
@@ -0,0 +1,61 @@
+import { useTranslation } from 'react-i18next'
+import { useRouter } from 'next/navigation'
+import Button from '@/app/components/base/button'
+import { useAppContext } from '@/context/app-context'
+import { logout } from '@/service/common'
+import Avatar from '@/app/components/base/avatar'
+import { Triangle } from '@/app/components/base/icons/src/public/education'
+
+const UserInfo = () => {
+  const router = useRouter()
+  const { t } = useTranslation()
+  const { userProfile } = useAppContext()
+
+  const handleLogout = async () => {
+    await logout({
+      url: '/logout',
+      params: {},
+    })
+
+    localStorage.removeItem('setup_status')
+    localStorage.removeItem('console_token')
+    localStorage.removeItem('refresh_token')
+
+    router.push('/signin')
+  }
+
+  return (
+    <div className='relative flex items-center justify-between rounded-xl border-[4px] border-components-panel-on-panel-item-bg bg-gradient-to-r from-background-gradient-bg-fill-chat-bg-2 to-background-gradient-bg-fill-chat-bg-1 pb-6 pl-6 pr-8 pt-9 shadow-shadow-shadow-5'>
+      <div className='absolute left-0 top-0 flex items-center'>
+        <div className='system-2xs-semibold-uppercase flex h-[22px] items-center bg-components-panel-on-panel-item-bg pl-2 pt-1 text-text-accent-light-mode-only'>
+          {t('education.currentSigned')}
+        </div>
+        <Triangle className='h-[22px] w-4 text-components-panel-on-panel-item-bg' />
+      </div>
+      <div className='flex items-center'>
+        <Avatar
+          className='mr-4'
+          avatar={userProfile.avatar_url}
+          name={userProfile.name}
+          size={48}
+        />
+        <div className='pt-1.5'>
+          <div className='system-md-semibold text-text-primary'>
+            {userProfile.name}
+          </div>
+          <div className='system-sm-regular text-text-secondary'>
+            {userProfile.email}
+          </div>
+        </div>
+      </div>
+      <Button
+        variant='secondary'
+        onClick={handleLogout}
+      >
+        {t('common.userProfile.logout')}
+      </Button>
+    </div>
+  )
+}
+
+export default UserInfo
diff --git a/app/education-apply/verify-state-modal.tsx b/app/education-apply/verify-state-modal.tsx
new file mode 100644
index 0000000..aace6a3
--- /dev/null
+++ b/app/education-apply/verify-state-modal.tsx
@@ -0,0 +1,122 @@
+import React, { useEffect, useMemo, useRef, useState } from 'react'
+import { createPortal } from 'react-dom'
+import { useTranslation } from 'react-i18next'
+import {
+  RiExternalLinkLine,
+} from '@remixicon/react'
+import Button from '@/app/components/base/button'
+import { getLocaleOnClient } from '@/i18n'
+
+export type IConfirm = {
+  className?: string
+  isShow: boolean
+  title: string
+  content?: React.ReactNode
+  onConfirm: () => void
+  onCancel: () => void
+  maskClosable?: boolean
+  email?: string
+  showLink?: boolean
+}
+
+function Confirm({
+  isShow,
+  title,
+  content,
+  onConfirm,
+  onCancel,
+  maskClosable = true,
+  showLink,
+  email,
+}: IConfirm) {
+  const { t } = useTranslation()
+  const locale = getLocaleOnClient()
+  const dialogRef = useRef<HTMLDivElement>(null)
+  const [isVisible, setIsVisible] = useState(isShow)
+
+  const docLink = useMemo(() => {
+    if (locale === 'zh-Hans')
+      return 'https://docs.dify.ai/zh-hans/getting-started/dify-for-education'
+    if (locale === 'ja-JP')
+      return 'https://docs.dify.ai/ja-jp/getting-started/dify-for-education'
+    return 'https://docs.dify.ai/getting-started/dify-for-education'
+  }, [locale])
+
+  const handleClick = () => {
+    window.open(docLink, '_blank', 'noopener,noreferrer')
+  }
+
+  useEffect(() => {
+    const handleKeyDown = (event: KeyboardEvent) => {
+      if (event.key === 'Escape')
+        onCancel()
+    }
+
+    document.addEventListener('keydown', handleKeyDown)
+    return () => {
+      document.removeEventListener('keydown', handleKeyDown)
+    }
+  }, [onCancel])
+
+  const handleClickOutside = (event: MouseEvent) => {
+    if (maskClosable && dialogRef.current && !dialogRef.current.contains(event.target as Node))
+      onCancel()
+  }
+
+  useEffect(() => {
+    document.addEventListener('mousedown', handleClickOutside)
+    return () => {
+      document.removeEventListener('mousedown', handleClickOutside)
+    }
+  }, [maskClosable])
+
+  useEffect(() => {
+    if (isShow) {
+      setIsVisible(true)
+    }
+    else {
+      const timer = setTimeout(() => setIsVisible(false), 200)
+      return () => clearTimeout(timer)
+    }
+  }, [isShow])
+
+  if (!isVisible)
+    return null
+
+  return createPortal(
+    <div className={'fixed inset-0 z-[10000000] flex items-center justify-center bg-background-overlay'}
+      onClick={(e) => {
+        e.preventDefault()
+        e.stopPropagation()
+      }}
+    >
+      <div ref={dialogRef} className={'relative w-full max-w-[481px] overflow-hidden'}>
+        <div className='shadows-shadow-lg flex max-w-full flex-col items-start rounded-2xl border-[0.5px] border-solid border-components-panel-border bg-components-panel-bg'>
+          <div className='flex flex-col items-start gap-2 self-stretch pb-4 pl-6 pr-6 pt-6'>
+            <div className='title-2xl-semi-bold text-text-primary'>{title}</div>
+            <div className='system-md-regular w-full text-text-tertiary'>{content}</div>
+          </div>
+          {email && (
+            <div className='w-full space-y-1 px-6 py-3'>
+              <div className='system-sm-semibold py-1 text-text-secondary'>{t('education.emailLabel')}</div>
+              <div className='system-sm-regular rounded-lg bg-components-input-bg-disabled px-3 py-2 text-components-input-text-filled-disabled'>{email}</div>
+            </div>
+          )}
+          <div className='flex items-center justify-between gap-2 self-stretch p-6'>
+            <div className='flex items-center gap-1'>
+              {showLink && (
+                <>
+                  <a onClick={handleClick} href={docLink} target='_blank' className='system-xs-regular cursor-pointer text-text-accent'>{t('education.learn')}</a>
+                  <RiExternalLinkLine className='h-3 w-3 text-text-accent' />
+                </>
+              )}
+            </div>
+            <Button variant='primary' className='!w-20' onClick={onConfirm}>{t('common.operation.ok')}</Button>
+          </div>
+        </div>
+      </div>
+    </div>, document.body,
+  )
+}
+
+export default React.memo(Confirm)
diff --git a/app/forgot-password/ChangePasswordForm.tsx b/app/forgot-password/ChangePasswordForm.tsx
new file mode 100644
index 0000000..8342cb0
--- /dev/null
+++ b/app/forgot-password/ChangePasswordForm.tsx
@@ -0,0 +1,176 @@
+'use client'
+import { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import useSWR from 'swr'
+import { useSearchParams } from 'next/navigation'
+import Link from 'next/link'
+import cn from 'classnames'
+import { CheckCircleIcon } from '@heroicons/react/24/solid'
+import Input from '../components/base/input'
+import Button from '@/app/components/base/button'
+import { changePasswordWithToken, verifyForgotPasswordToken } from '@/service/common'
+import Toast from '@/app/components/base/toast'
+import Loading from '@/app/components/base/loading'
+
+const validPassword = /^(?=.*[a-zA-Z])(?=.*\d).{8,}$/
+
+const ChangePasswordForm = () => {
+  const { t } = useTranslation()
+  const searchParams = useSearchParams()
+  const token = searchParams.get('token')
+
+  const verifyTokenParams = {
+    url: '/forgot-password/validity',
+    body: { token },
+  }
+  const { data: verifyTokenRes, mutate: revalidateToken } = useSWR(verifyTokenParams, verifyForgotPasswordToken, {
+    revalidateOnFocus: false,
+  })
+
+  const [password, setPassword] = useState('')
+  const [confirmPassword, setConfirmPassword] = useState('')
+  const [showSuccess, setShowSuccess] = useState(false)
+
+  const showErrorMessage = useCallback((message: string) => {
+    Toast.notify({
+      type: 'error',
+      message,
+    })
+  }, [])
+
+  const valid = useCallback(() => {
+    if (!password.trim()) {
+      showErrorMessage(t('login.error.passwordEmpty'))
+      return false
+    }
+    if (!validPassword.test(password)) {
+      showErrorMessage(t('login.error.passwordInvalid'))
+      return false
+    }
+    if (password !== confirmPassword) {
+      showErrorMessage(t('common.account.notEqual'))
+      return false
+    }
+    return true
+  }, [password, confirmPassword, showErrorMessage, t])
+
+  const handleChangePassword = useCallback(async () => {
+    const token = searchParams.get('token') || ''
+
+    if (!valid())
+      return
+    try {
+      await changePasswordWithToken({
+        url: '/forgot-password/resets',
+        body: {
+          token,
+          new_password: password,
+          password_confirm: confirmPassword,
+        },
+      })
+      setShowSuccess(true)
+    }
+    catch {
+      await revalidateToken()
+    }
+  }, [confirmPassword, password, revalidateToken, searchParams, valid])
+
+  return (
+    <div className={
+      cn(
+        'flex w-full grow flex-col items-center justify-center',
+        'px-6',
+        'md:px-[108px]',
+      )
+    }>
+      {!verifyTokenRes && <Loading />}
+      {verifyTokenRes && !verifyTokenRes.is_valid && (
+        <div className="flex flex-col md:w-[400px]">
+          <div className="mx-auto w-full">
+            <div className="mb-3 flex h-20 w-20 items-center justify-center rounded-[20px] border border-divider-regular bg-components-option-card-option-bg p-5 text-[40px] font-bold shadow-lg">馃し鈥嶁檪锔�</div>
+            <h2 className="text-[32px] font-bold text-text-primary">{t('login.invalid')}</h2>
+          </div>
+          <div className="mx-auto mt-6 w-full">
+            <Button variant='primary' className='w-full !text-sm'>
+              <a href="https://dify.ai">{t('login.explore')}</a>
+            </Button>
+          </div>
+        </div>
+      )}
+      {verifyTokenRes && verifyTokenRes.is_valid && !showSuccess && (
+        <div className='flex flex-col md:w-[400px]'>
+          <div className="mx-auto w-full">
+            <h2 className="text-[32px] font-bold text-text-primary">
+              {t('login.changePassword')}
+            </h2>
+            <p className='mt-1 text-sm text-text-secondary'>
+              {t('login.changePasswordTip')}
+            </p>
+          </div>
+
+          <div className="mx-auto mt-6 w-full">
+            <div className="relative">
+              {/* Password */}
+              <div className='mb-5'>
+                <label htmlFor="password" className="my-2 flex items-center justify-between text-sm font-medium text-text-primary">
+                  {t('common.account.newPassword')}
+                </label>
+                <Input
+                  id="password"
+                  type='password'
+                  value={password}
+                  onChange={e => setPassword(e.target.value)}
+                  placeholder={t('login.passwordPlaceholder') || ''}
+                  className='mt-1'
+                />
+                <div className='mt-1 text-xs text-text-secondary'>{t('login.error.passwordInvalid')}</div>
+              </div>
+              {/* Confirm Password */}
+              <div className='mb-5'>
+                <label htmlFor="confirmPassword" className="my-2 flex items-center justify-between text-sm font-medium text-text-primary">
+                  {t('common.account.confirmPassword')}
+                </label>
+                <Input
+                  id="confirmPassword"
+                  type='password'
+                  value={confirmPassword}
+                  onChange={e => setConfirmPassword(e.target.value)}
+                  placeholder={t('login.confirmPasswordPlaceholder') || ''}
+                  className='mt-1'
+                />
+              </div>
+              <div>
+                <Button
+                  variant='primary'
+                  className='w-full !text-sm'
+                  onClick={handleChangePassword}
+                >
+                  {t('common.operation.reset')}
+                </Button>
+              </div>
+            </div>
+          </div>
+        </div>
+      )}
+      {verifyTokenRes && verifyTokenRes.is_valid && showSuccess && (
+        <div className="flex flex-col md:w-[400px]">
+          <div className="mx-auto w-full">
+            <div className="mb-3 flex h-20 w-20 items-center justify-center rounded-[20px] border border-divider-regular bg-components-option-card-option-bg p-5 text-[40px] font-bold shadow-lg">
+              <CheckCircleIcon className='h-10 w-10 text-[#039855]' />
+            </div>
+            <h2 className="text-[32px] font-bold text-text-primary">
+              {t('login.passwordChangedTip')}
+            </h2>
+          </div>
+          <div className="mx-auto mt-6 w-full">
+            <Button variant='primary' className='w-full'>
+              <Link href={'/signin'}>{t('login.passwordChanged')}</Link>
+            </Button>
+          </div>
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default ChangePasswordForm
diff --git a/app/forgot-password/ForgotPasswordForm.tsx b/app/forgot-password/ForgotPasswordForm.tsx
new file mode 100644
index 0000000..377ca2b
--- /dev/null
+++ b/app/forgot-password/ForgotPasswordForm.tsx
@@ -0,0 +1,123 @@
+'use client'
+import React, { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+
+import { useRouter } from 'next/navigation'
+
+import { useForm } from 'react-hook-form'
+import { z } from 'zod'
+import { zodResolver } from '@hookform/resolvers/zod'
+import Loading from '../components/base/loading'
+import Input from '../components/base/input'
+import Button from '@/app/components/base/button'
+import { WEB_PREFIX } from '@/config'
+
+import {
+  fetchInitValidateStatus,
+  fetchSetupStatus,
+  sendForgotPasswordEmail,
+} from '@/service/common'
+import type { InitValidateStatusResponse } from '@/models/common'
+
+const accountFormSchema = z.object({
+  email: z
+    .string()
+    .min(1, { message: 'login.error.emailInValid' })
+    .email('login.error.emailInValid'),
+})
+
+type AccountFormValues = z.infer<typeof accountFormSchema>
+
+const ForgotPasswordForm = () => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const [loading, setLoading] = useState(true)
+  const [isEmailSent, setIsEmailSent] = useState(false)
+  const { register, trigger, getValues, formState: { errors } } = useForm<AccountFormValues>({
+    resolver: zodResolver(accountFormSchema),
+    defaultValues: { email: '' },
+  })
+
+  const handleSendResetPasswordEmail = async (email: string) => {
+    try {
+      const res = await sendForgotPasswordEmail({
+        url: '/forgot-password',
+        body: { email },
+      })
+      if (res.result === 'success')
+        setIsEmailSent(true)
+
+      else console.error('Email verification failed')
+    }
+    catch (error) {
+      console.error('Request failed:', error)
+    }
+  }
+
+  const handleSendResetPasswordClick = async () => {
+    if (isEmailSent) {
+      router.push('/signin')
+    }
+    else {
+      const isValid = await trigger('email')
+      if (isValid) {
+        const email = getValues('email')
+        await handleSendResetPasswordEmail(email)
+      }
+    }
+  }
+
+  useEffect(() => {
+    fetchSetupStatus().then(() => {
+      fetchInitValidateStatus().then((res: InitValidateStatusResponse) => {
+        if (res.status === 'not_started')
+          window.location.href = `${WEB_PREFIX}/init`
+      })
+
+      setLoading(false)
+    })
+  }, [])
+
+  return (
+    loading
+      ? <Loading />
+      : <>
+        <div className="sm:mx-auto sm:w-full sm:max-w-md">
+          <h2 className="text-[32px] font-bold text-text-primary">
+            {isEmailSent ? t('login.resetLinkSent') : t('login.forgotPassword')}
+          </h2>
+          <p className='mt-1 text-sm text-text-secondary'>
+            {isEmailSent ? t('login.checkEmailForResetLink') : t('login.forgotPasswordDesc')}
+          </p>
+        </div>
+        <div className="mt-8 grow sm:mx-auto sm:w-full sm:max-w-md">
+          <div className="relative">
+            <form>
+              {!isEmailSent && (
+                <div className='mb-5'>
+                  <label htmlFor="email"
+                    className="my-2 flex items-center justify-between text-sm font-medium text-text-primary">
+                    {t('login.email')}
+                  </label>
+                  <div className="mt-1">
+                    <Input
+                      {...register('email')}
+                      placeholder={t('login.emailPlaceholder') || ''}
+                    />
+                    {errors.email && <span className='text-sm text-red-400'>{t(`${errors.email?.message}`)}</span>}
+                  </div>
+                </div>
+              )}
+              <div>
+                <Button variant='primary' className='w-full' onClick={handleSendResetPasswordClick}>
+                  {isEmailSent ? t('login.backToSignIn') : t('login.sendResetLink')}
+                </Button>
+              </div>
+            </form>
+          </div>
+        </div>
+      </>
+  )
+}
+
+export default ForgotPasswordForm
diff --git a/app/forgot-password/page.tsx b/app/forgot-password/page.tsx
new file mode 100644
index 0000000..ed3d0d5
--- /dev/null
+++ b/app/forgot-password/page.tsx
@@ -0,0 +1,26 @@
+'use client'
+import React from 'react'
+import cn from 'classnames'
+import { useSearchParams } from 'next/navigation'
+import Header from '../signin/_header'
+import ForgotPasswordForm from './ForgotPasswordForm'
+import ChangePasswordForm from '@/app/forgot-password/ChangePasswordForm'
+
+const ForgotPassword = () => {
+  const searchParams = useSearchParams()
+  const token = searchParams.get('token')
+
+  return (
+    <div className={cn('flex min-h-screen w-full justify-center bg-background-default-burn p-6')}>
+      <div className={cn('flex w-full shrink-0 flex-col rounded-2xl border border-effects-highlight bg-background-default-subtle')}>
+        <Header />
+        {token ? <ChangePasswordForm /> : <ForgotPasswordForm />}
+        <div className='px-8 py-6 text-sm font-normal text-text-tertiary'>
+          漏 {new Date().getFullYear()} LangGenius, Inc. All rights reserved.
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default ForgotPassword
diff --git a/app/init/InitPasswordPopup.tsx b/app/init/InitPasswordPopup.tsx
new file mode 100644
index 0000000..694a45e
--- /dev/null
+++ b/app/init/InitPasswordPopup.tsx
@@ -0,0 +1,83 @@
+'use client'
+import { useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useRouter } from 'next/navigation'
+import Toast from '../components/base/toast'
+import Loading from '../components/base/loading'
+import Button from '@/app/components/base/button'
+import { WEB_PREFIX } from '@/config'
+import { fetchInitValidateStatus, initValidate } from '@/service/common'
+import type { InitValidateStatusResponse } from '@/models/common'
+
+const InitPasswordPopup = () => {
+  const [password, setPassword] = useState('')
+  const [loading, setLoading] = useState(true)
+  const [validated, setValidated] = useState(false)
+  const router = useRouter()
+
+  const { t } = useTranslation()
+
+  const handleValidation = async () => {
+    setLoading(true)
+    try {
+      const response = await initValidate({ body: { password } })
+      if (response.result === 'success') {
+        setValidated(true)
+        router.push('/install') // or render setup form
+      }
+      else {
+        throw new Error('Validation failed')
+      }
+    }
+    catch (e: any) {
+      Toast.notify({
+        type: 'error',
+        message: e.message,
+        duration: 5000,
+      })
+      setLoading(false)
+    }
+  }
+
+  useEffect(() => {
+    fetchInitValidateStatus().then((res: InitValidateStatusResponse) => {
+      if (res.status === 'finished')
+        window.location.href = `${WEB_PREFIX}/install`
+      else
+        setLoading(false)
+    })
+  }, [])
+
+  return (
+    loading
+      ? <Loading />
+      : <div>
+        {!validated && (
+          <div className="mx-12 block min-w-28">
+            <div className="mb-4">
+              <label htmlFor="password" className="block text-sm font-medium text-text-secondary">
+                {t('login.adminInitPassword')}
+
+              </label>
+              <div className="relative mt-1 rounded-md shadow-sm">
+                <input
+                  id="password"
+                  type="password"
+                  value={password}
+                  onChange={e => setPassword(e.target.value)}
+                  className="block w-full appearance-none rounded-md border border-divider-regular px-3 py-2 shadow-sm placeholder:text-text-quaternary focus:border-indigo-500 focus:outline-none focus:ring-indigo-500 sm:text-sm"
+                />
+              </div>
+            </div>
+            <div className="flex flex-row flex-wrap justify-stretch p-0">
+              <Button variant="primary" onClick={handleValidation} className="min-w-28 basis-full">
+                {t('login.validate')}
+              </Button>
+            </div>
+          </div>
+        )}
+      </div>
+  )
+}
+
+export default InitPasswordPopup
diff --git a/app/init/page.tsx b/app/init/page.tsx
new file mode 100644
index 0000000..c3d439f
--- /dev/null
+++ b/app/init/page.tsx
@@ -0,0 +1,17 @@
+import React from 'react'
+import InitPasswordPopup from './InitPasswordPopup'
+import cn from '@/utils/classnames'
+
+const Install = () => {
+  return (
+    <div className={cn('flex min-h-screen w-full justify-center bg-background-default-burn p-6')}>
+      <div className={cn('flex w-full shrink-0 flex-col rounded-2xl border border-effects-highlight bg-background-default-subtle')}>
+        <div className="m-auto block w-96">
+          <InitPasswordPopup />
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default Install
diff --git a/app/install/installForm.tsx b/app/install/installForm.tsx
new file mode 100644
index 0000000..c01be72
--- /dev/null
+++ b/app/install/installForm.tsx
@@ -0,0 +1,184 @@
+'use client'
+import React, { useCallback, useEffect } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useDebounceFn } from 'ahooks'
+
+import Link from 'next/link'
+import { useRouter } from 'next/navigation'
+
+import type { SubmitHandler } from 'react-hook-form'
+import { useForm } from 'react-hook-form'
+import { z } from 'zod'
+import { zodResolver } from '@hookform/resolvers/zod'
+import Loading from '../components/base/loading'
+import classNames from '@/utils/classnames'
+import Button from '@/app/components/base/button'
+
+import { fetchInitValidateStatus, fetchSetupStatus, setup } from '@/service/common'
+import type { InitValidateStatusResponse, SetupStatusResponse } from '@/models/common'
+
+const validPassword = /^(?=.*[a-zA-Z])(?=.*\d).{8,}$/
+
+const accountFormSchema = z.object({
+  email: z
+    .string()
+    .min(1, { message: 'login.error.emailInValid' })
+    .email('login.error.emailInValid'),
+  name: z.string().min(1, { message: 'login.error.nameEmpty' }),
+  password: z.string().min(8, {
+    message: 'login.error.passwordLengthInValid',
+  }).regex(validPassword, 'login.error.passwordInvalid'),
+})
+
+type AccountFormValues = z.infer<typeof accountFormSchema>
+
+const InstallForm = () => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const [showPassword, setShowPassword] = React.useState(false)
+  const [loading, setLoading] = React.useState(true)
+  const {
+    register,
+    handleSubmit,
+    formState: { errors, isSubmitting },
+  } = useForm<AccountFormValues>({
+    resolver: zodResolver(accountFormSchema),
+    defaultValues: {
+      name: '',
+      password: '',
+      email: '',
+    },
+  })
+
+  const onSubmit: SubmitHandler<AccountFormValues> = async (data) => {
+    await setup({
+      body: {
+        ...data,
+      },
+    })
+    router.push('/signin')
+  }
+
+  const handleSetting = async () => {
+    if (isSubmitting) return
+    handleSubmit(onSubmit)()
+  }
+
+  const { run: debouncedHandleKeyDown } = useDebounceFn(
+    (e: React.KeyboardEvent) => {
+      if (e.key === 'Enter') {
+        e.preventDefault()
+        handleSetting()
+      }
+    },
+    { wait: 200 },
+  )
+
+  const handleKeyDown = useCallback(debouncedHandleKeyDown, [debouncedHandleKeyDown])
+
+  useEffect(() => {
+    fetchSetupStatus().then((res: SetupStatusResponse) => {
+      if (res.step === 'finished') {
+        localStorage.setItem('setup_status', 'finished')
+        router.push('/signin')
+      }
+      else {
+        fetchInitValidateStatus().then((res: InitValidateStatusResponse) => {
+          if (res.status === 'not_started')
+            router.push('/init')
+        })
+      }
+      setLoading(false)
+    })
+  }, [])
+
+  return (
+    loading
+      ? <Loading />
+      : <>
+        <div className="sm:mx-auto sm:w-full sm:max-w-md">
+          <h2 className="text-[32px] font-bold text-text-primary">{t('login.setAdminAccount')}</h2>
+          <p className='mt-1 text-sm text-text-secondary'>{t('login.setAdminAccountDesc')}</p>
+        </div>
+        <div className="mt-8 grow sm:mx-auto sm:w-full sm:max-w-md">
+          <div className="relative">
+            <form onSubmit={handleSubmit(onSubmit)} onKeyDown={handleKeyDown}>
+              <div className='mb-5'>
+                <label htmlFor="email" className="my-2 flex items-center justify-between text-sm font-medium text-text-primary">
+                  {t('login.email')}
+                </label>
+                <div className="mt-1 rounded-md shadow-sm">
+                  <input
+                    {...register('email')}
+                    placeholder={t('login.emailPlaceholder') || ''}
+                    className={'w-full appearance-none rounded-md border border-transparent bg-components-input-bg-normal py-[7px] pl-2 text-components-input-text-filled caret-primary-600 outline-none placeholder:text-components-input-text-placeholder hover:border-components-input-border-hover hover:bg-components-input-bg-hover focus:border-components-input-border-active focus:bg-components-input-bg-active focus:shadow-xs'}
+                  />
+                  {errors.email && <span className='text-sm text-red-400'>{t(`${errors.email?.message}`)}</span>}
+                </div>
+
+              </div>
+
+              <div className='mb-5'>
+                <label htmlFor="name" className="my-2 flex items-center justify-between text-sm font-medium text-text-primary">
+                  {t('login.name')}
+                </label>
+                <div className="relative mt-1 rounded-md shadow-sm">
+                  <input
+                    {...register('name')}
+                    placeholder={t('login.namePlaceholder') || ''}
+                    className={'w-full appearance-none rounded-md border border-transparent bg-components-input-bg-normal py-[7px] pl-2 text-components-input-text-filled caret-primary-600 outline-none placeholder:text-components-input-text-placeholder hover:border-components-input-border-hover hover:bg-components-input-bg-hover focus:border-components-input-border-active focus:bg-components-input-bg-active focus:shadow-xs'}
+                  />
+                </div>
+                {errors.name && <span className='text-sm text-red-400'>{t(`${errors.name.message}`)}</span>}
+              </div>
+
+              <div className='mb-5'>
+                <label htmlFor="password" className="my-2 flex items-center justify-between text-sm font-medium text-text-primary">
+                  {t('login.password')}
+                </label>
+                <div className="relative mt-1 rounded-md shadow-sm">
+                  <input
+                    {...register('password')}
+                    type={showPassword ? 'text' : 'password'}
+                    placeholder={t('login.passwordPlaceholder') || ''}
+                    className={'w-full appearance-none rounded-md border border-transparent bg-components-input-bg-normal py-[7px] pl-2 text-components-input-text-filled caret-primary-600 outline-none placeholder:text-components-input-text-placeholder hover:border-components-input-border-hover hover:bg-components-input-bg-hover focus:border-components-input-border-active focus:bg-components-input-bg-active focus:shadow-xs'}
+                  />
+
+                  <div className="absolute inset-y-0 right-0 flex items-center pr-3">
+                    <button
+                      type="button"
+                      onClick={() => setShowPassword(!showPassword)}
+                      className="text-text-quaternary hover:text-text-tertiary focus:text-text-tertiary focus:outline-none"
+                    >
+                      {showPassword ? '馃憖' : '馃槤'}
+                    </button>
+                  </div>
+                </div>
+
+                <div className={classNames('mt-1 text-xs text-text-tertiary', {
+                  'text-red-400 !text-sm': errors.password,
+                })}>{t('login.error.passwordInvalid')}</div>
+              </div>
+
+              <div>
+                <Button variant='primary' className='w-full' onClick={handleSetting}>
+                  {t('login.installBtn')}
+                </Button>
+              </div>
+            </form>
+            <div className="mt-2 block w-full text-xs text-text-tertiary">
+              {t('login.license.tip')}
+              &nbsp;
+              <Link
+                className='text-text-accent'
+                target='_blank' rel='noopener noreferrer'
+                href={'https://docs.dify.ai/user-agreement/open-source'}
+              >{t('login.license.link')}</Link>
+            </div>
+          </div>
+        </div>
+      </>
+  )
+}
+
+export default InstallForm
diff --git a/app/install/page.tsx b/app/install/page.tsx
new file mode 100644
index 0000000..f63fdf8
--- /dev/null
+++ b/app/install/page.tsx
@@ -0,0 +1,20 @@
+import React from 'react'
+import Header from '../signin/_header'
+import InstallForm from './installForm'
+import cn from '@/utils/classnames'
+
+const Install = () => {
+  return (
+    <div className={cn('flex min-h-screen w-full justify-center bg-background-default-burn p-6')}>
+      <div className={cn('flex w-full shrink-0 flex-col rounded-2xl border border-effects-highlight bg-background-default-subtle')}>
+        <Header />
+        <InstallForm />
+        <div className='px-8 py-6 text-sm font-normal text-text-tertiary'>
+          漏 {new Date().getFullYear()} LangGenius, Inc. All rights reserved.
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default Install
diff --git a/app/layout.tsx b/app/layout.tsx
new file mode 100644
index 0000000..df78599
--- /dev/null
+++ b/app/layout.tsx
@@ -0,0 +1,85 @@
+import type { Viewport } from 'next'
+import RoutePrefixHandle from './routePrefixHandle'
+import I18nServer from './components/i18n-server'
+import BrowserInitor from './components/browser-initor'
+import SentryInitor from './components/sentry-initor'
+import { getLocaleOnServer } from '@/i18n/server'
+import { TanstackQueryIniter } from '@/context/query-client'
+import { ThemeProvider } from 'next-themes'
+import './styles/globals.css'
+import './styles/markdown.scss'
+
+export const metadata = {
+  title: 'Dify',
+}
+
+export const viewport: Viewport = {
+  width: 'device-width',
+  initialScale: 1,
+  maximumScale: 1,
+  viewportFit: 'cover',
+  userScalable: false,
+}
+
+const LocaleLayout = async ({
+  children,
+}: {
+  children: React.ReactNode
+}) => {
+  const locale = await getLocaleOnServer()
+
+  return (
+    <html lang={locale ?? 'en'} className="h-full" suppressHydrationWarning>
+      <head>
+        <meta name="theme-color" content="#FFFFFF" />
+        <meta name="mobile-web-app-capable" content="yes" />
+        <meta name="apple-mobile-web-app-capable" content="yes" />
+        <meta name="apple-mobile-web-app-status-bar-style" content="default" />
+      </head>
+      <body
+        className="color-scheme h-full select-auto"
+        data-api-prefix={process.env.NEXT_PUBLIC_API_PREFIX}
+        data-web-prefix={process.env.NEXT_PUBLIC_WEB_PREFIX}
+        data-pubic-api-prefix={process.env.NEXT_PUBLIC_PUBLIC_API_PREFIX}
+        data-pubic-web-prefix={process.env.NEXT_PUBLIC_PUBLIC_WEB_PREFIX}
+        data-marketplace-api-prefix={process.env.NEXT_PUBLIC_MARKETPLACE_API_PREFIX}
+        data-marketplace-url-prefix={process.env.NEXT_PUBLIC_MARKETPLACE_URL_PREFIX}
+        data-public-edition={process.env.NEXT_PUBLIC_EDITION}
+        data-public-support-mail-login={process.env.NEXT_PUBLIC_SUPPORT_MAIL_LOGIN}
+        data-public-sentry-dsn={process.env.NEXT_PUBLIC_SENTRY_DSN}
+        data-public-maintenance-notice={process.env.NEXT_PUBLIC_MAINTENANCE_NOTICE}
+        data-public-site-about={process.env.NEXT_PUBLIC_SITE_ABOUT}
+        data-public-text-generation-timeout-ms={process.env.NEXT_PUBLIC_TEXT_GENERATION_TIMEOUT_MS}
+        data-public-max-tools-num={process.env.NEXT_PUBLIC_MAX_TOOLS_NUM}
+        data-public-max-parallel-limit={process.env.NEXT_PUBLIC_MAX_PARALLEL_LIMIT}
+        data-public-top-k-max-value={process.env.NEXT_PUBLIC_TOP_K_MAX_VALUE}
+        data-public-indexing-max-segmentation-tokens-length={process.env.NEXT_PUBLIC_INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH}
+        data-public-loop-node-max-count={process.env.NEXT_PUBLIC_LOOP_NODE_MAX_COUNT}
+        data-public-max-iterations-num={process.env.NEXT_PUBLIC_MAX_ITERATIONS_NUM}
+        data-public-enable-website-jinareader={process.env.NEXT_PUBLIC_ENABLE_WEBSITE_JINAREADER}
+        data-public-enable-website-firecrawl={process.env.NEXT_PUBLIC_ENABLE_WEBSITE_FIRECRAWL}
+        data-public-enable-website-watercrawl={process.env.NEXT_PUBLIC_ENABLE_WEBSITE_WATERCRAWL}
+      >
+        <BrowserInitor>
+          <SentryInitor>
+            <TanstackQueryIniter>
+              <ThemeProvider
+                attribute='data-theme'
+                defaultTheme='system'
+                enableSystem
+                disableTransitionOnChange
+              >
+                <I18nServer>
+                  {children}
+                </I18nServer>
+              </ThemeProvider>
+            </TanstackQueryIniter>
+          </SentryInitor>
+        </BrowserInitor>
+        <RoutePrefixHandle />
+      </body>
+    </html>
+  )
+}
+
+export default LocaleLayout
diff --git a/app/page.module.css b/app/page.module.css
new file mode 100644
index 0000000..b51afee
--- /dev/null
+++ b/app/page.module.css
@@ -0,0 +1,266 @@
+.main {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  align-items: center;
+  padding: 6rem;
+  min-height: 100vh;
+}
+
+.description {
+  display: inherit;
+  justify-content: inherit;
+  align-items: inherit;
+  font-size: 0.85rem;
+  max-width: var(--max-width);
+  width: 100%;
+  z-index: 2;
+  font-family: var(--font-mono);
+}
+
+.description a {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  gap: 0.5rem;
+}
+
+.description p {
+  position: relative;
+  margin: 0;
+  padding: 1rem;
+  background-color: rgba(var(--callout-rgb), 0.5);
+  border: 1px solid rgba(var(--callout-border-rgb), 0.3);
+  border-radius: var(--border-radius);
+}
+
+.code {
+  font-weight: 700;
+  font-family: var(--font-mono);
+}
+
+.grid {
+  display: grid;
+  grid-template-columns: repeat(3, minmax(33%, auto));
+  width: var(--max-width);
+  max-width: 100%;
+}
+
+.card {
+  padding: 1rem 1.2rem;
+  border-radius: var(--border-radius);
+  background: rgba(var(--card-rgb), 0);
+  border: 1px solid rgba(var(--card-border-rgb), 0);
+  transition: background 200ms, border 200ms;
+}
+
+.card span {
+  display: inline-block;
+  transition: transform 200ms;
+}
+
+.card h2 {
+  font-weight: 600;
+  margin-bottom: 0.7rem;
+}
+
+.card p {
+  margin: 0;
+  opacity: 0.6;
+  font-size: 0.9rem;
+  line-height: 1.5;
+  max-width: 34ch;
+}
+
+.center {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  position: relative;
+  padding: 4rem 0;
+}
+
+.center::before {
+  background: var(--secondary-glow);
+  border-radius: 50%;
+  width: 480px;
+  height: 360px;
+  margin-left: -400px;
+}
+
+.center::after {
+  background: var(--primary-glow);
+  width: 240px;
+  height: 180px;
+  z-index: -1;
+}
+
+.center::before,
+.center::after {
+  content: '';
+  left: 50%;
+  position: absolute;
+  filter: blur(45px);
+  transform: translateZ(0);
+}
+
+.logo,
+.thirteen {
+  position: relative;
+}
+
+.thirteen {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 75px;
+  height: 75px;
+  padding: 25px 10px;
+  margin-left: 16px;
+  transform: translateZ(0);
+  border-radius: var(--border-radius);
+  overflow: hidden;
+  box-shadow: 0px 2px 8px -1px #0000001a;
+}
+
+.thirteen::before,
+.thirteen::after {
+  content: '';
+  position: absolute;
+  z-index: -1;
+}
+
+/* Conic Gradient Animation */
+.thirteen::before {
+  animation: 6s rotate linear infinite;
+  width: 200%;
+  height: 200%;
+  background: var(--tile-border);
+}
+
+/* Inner Square */
+.thirteen::after {
+  inset: 0;
+  padding: 1px;
+  border-radius: var(--border-radius);
+  background: linear-gradient(to bottom right,
+      rgba(var(--tile-start-rgb), 1),
+      rgba(var(--tile-end-rgb), 1));
+  background-clip: content-box;
+}
+
+/* Enable hover only on non-touch devices */
+@media (hover: hover) and (pointer: fine) {
+  .card:hover {
+    background: rgba(var(--card-rgb), 0.1);
+    border: 1px solid rgba(var(--card-border-rgb), 0.15);
+  }
+
+  .card:hover span {
+    transform: translateX(4px);
+  }
+}
+
+@media (prefers-reduced-motion) {
+  .thirteen::before {
+    animation: none;
+  }
+
+  .card:hover span {
+    transform: none;
+  }
+}
+
+/* Mobile and Tablet */
+@media (max-width: 1023px) {
+  .content {
+    padding: 4rem;
+  }
+
+  .grid {
+    grid-template-columns: 1fr;
+    margin-bottom: 120px;
+    max-width: 320px;
+    text-align: center;
+  }
+
+  .card {
+    padding: 1rem 2.5rem;
+  }
+
+  .card h2 {
+    margin-bottom: 0.5rem;
+  }
+
+  .center {
+    padding: 8rem 0 6rem;
+  }
+
+  .center::before {
+    transform: none;
+    height: 300px;
+  }
+
+  .description {
+    font-size: 0.8rem;
+  }
+
+  .description a {
+    padding: 1rem;
+  }
+
+  .description p,
+  .description div {
+    display: flex;
+    justify-content: center;
+    position: fixed;
+    width: 100%;
+  }
+
+  .description p {
+    align-items: center;
+    inset: 0 0 auto;
+    padding: 2rem 1rem 1.4rem;
+    border-radius: 0;
+    border: none;
+    border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25);
+    background: linear-gradient(to bottom,
+        rgba(var(--background-start-rgb), 1),
+        rgba(var(--callout-rgb), 0.5));
+    background-clip: padding-box;
+    backdrop-filter: blur(24px);
+  }
+
+  .description div {
+    align-items: flex-end;
+    pointer-events: none;
+    inset: auto 0 0;
+    padding: 2rem;
+    height: 200px;
+    background: linear-gradient(to bottom,
+        transparent 0%,
+        rgb(var(--background-end-rgb)) 40%);
+    z-index: 1;
+  }
+}
+
+@media (prefers-color-scheme: dark) {
+  .vercelLogo {
+    filter: invert(1);
+  }
+
+  .logo,
+  .thirteen img {
+    filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70);
+  }
+}
+
+@keyframes rotate {
+  from {
+    transform: rotate(360deg);
+  }
+
+  to {
+    transform: rotate(0deg);
+  }
+}
diff --git a/app/page.tsx b/app/page.tsx
new file mode 100644
index 0000000..c5f5a95
--- /dev/null
+++ b/app/page.tsx
@@ -0,0 +1,18 @@
+import Link from 'next/link'
+import Loading from '@/app/components/base/loading'
+
+const Home = async () => {
+  return (
+    <div className="flex min-h-screen flex-col justify-center py-12 sm:px-6 lg:px-8">
+
+      <div className="sm:mx-auto sm:w-full sm:max-w-md">
+        <Loading type='area' />
+        <div className="mt-10 text-center">
+          <Link href='/apps'>馃殌</Link>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default Home
diff --git "a/app/repos/\133owner\135/\133repo\135/releases/route.ts" "b/app/repos/\133owner\135/\133repo\135/releases/route.ts"
new file mode 100644
index 0000000..29b604d
--- /dev/null
+++ "b/app/repos/\133owner\135/\133repo\135/releases/route.ts"
@@ -0,0 +1,36 @@
+import { type NextRequest, NextResponse } from 'next/server'
+import { Octokit } from '@octokit/core'
+import { RequestError } from '@octokit/request-error'
+import { GITHUB_ACCESS_TOKEN } from '@/config'
+
+type Params = {
+  owner: string,
+  repo: string,
+}
+
+const octokit = new Octokit({
+  auth: GITHUB_ACCESS_TOKEN,
+})
+
+export async function GET(
+  request: NextRequest,
+  { params }: { params: Promise<Params> },
+) {
+  const { owner, repo } = (await params)
+  try {
+    const releasesRes = await octokit.request('GET /repos/{owner}/{repo}/releases', {
+      owner,
+      repo,
+      headers: {
+        'X-GitHub-Api-Version': '2022-11-28',
+      },
+    })
+    return NextResponse.json(releasesRes)
+  }
+  catch (error) {
+    if (error instanceof RequestError)
+      return NextResponse.json(error.response)
+    else
+      throw error
+  }
+}
diff --git a/app/reset-password/check-code/page.tsx b/app/reset-password/check-code/page.tsx
new file mode 100644
index 0000000..480b513
--- /dev/null
+++ b/app/reset-password/check-code/page.tsx
@@ -0,0 +1,96 @@
+'use client'
+import { RiArrowLeftLine, RiMailSendFill } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useState } from 'react'
+import { useRouter, useSearchParams } from 'next/navigation'
+import { useContext } from 'use-context-selector'
+import Countdown from '@/app/components/signin/countdown'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Toast from '@/app/components/base/toast'
+import { sendResetPasswordCode, verifyResetPasswordCode } from '@/service/common'
+import I18NContext from '@/context/i18n'
+
+export default function CheckCode() {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const searchParams = useSearchParams()
+  const email = decodeURIComponent(searchParams.get('email') as string)
+  const token = decodeURIComponent(searchParams.get('token') as string)
+  const [code, setVerifyCode] = useState('')
+  const [loading, setIsLoading] = useState(false)
+  const { locale } = useContext(I18NContext)
+
+  const verify = async () => {
+    try {
+      if (!code.trim()) {
+        Toast.notify({
+          type: 'error',
+          message: t('login.checkCode.emptyCode'),
+        })
+        return
+      }
+      if (!/\d{6}/.test(code)) {
+        Toast.notify({
+          type: 'error',
+          message: t('login.checkCode.invalidCode'),
+        })
+        return
+      }
+      setIsLoading(true)
+      const ret = await verifyResetPasswordCode({ email, code, token })
+      if (ret.is_valid) {
+        const params = new URLSearchParams(searchParams)
+        params.set('token', encodeURIComponent(ret.token))
+        router.push(`/reset-password/set-password?${params.toString()}`)
+      }
+    }
+    catch (error) { console.error(error) }
+    finally {
+      setIsLoading(false)
+    }
+  }
+
+  const resendCode = async () => {
+    try {
+      const res = await sendResetPasswordCode(email, locale)
+      if (res.result === 'success') {
+        const params = new URLSearchParams(searchParams)
+        params.set('token', encodeURIComponent(res.data))
+        router.replace(`/reset-password/check-code?${params.toString()}`)
+      }
+    }
+    catch (error) { console.error(error) }
+  }
+
+  return <div className='flex flex-col gap-3'>
+    <div className='inline-flex h-14 w-14 items-center justify-center rounded-2xl border border-components-panel-border-subtle bg-background-default-dodge text-text-accent-light-mode-only shadow-lg'>
+      <RiMailSendFill className='h-6 w-6 text-2xl' />
+    </div>
+    <div className='pb-4 pt-2'>
+      <h2 className='title-4xl-semi-bold text-text-primary'>{t('login.checkCode.checkYourEmail')}</h2>
+      <p className='body-md-regular mt-2 text-text-secondary'>
+        <span dangerouslySetInnerHTML={{ __html: t('login.checkCode.tips', { email }) as string }}></span>
+        <br />
+        {t('login.checkCode.validTime')}
+      </p>
+    </div>
+
+    <form action="">
+      <input type='text' className='hidden' />
+      <label htmlFor="code" className='system-md-semibold mb-1 text-text-secondary'>{t('login.checkCode.verificationCode')}</label>
+      <Input value={code} onChange={e => setVerifyCode(e.target.value)} max-length={6} className='mt-1' placeholder={t('login.checkCode.verificationCodePlaceholder') as string} />
+      <Button loading={loading} disabled={loading} className='my-3 w-full' variant='primary' onClick={verify}>{t('login.checkCode.verify')}</Button>
+      <Countdown onResend={resendCode} />
+    </form>
+    <div className='py-2'>
+      <div className='h-px bg-gradient-to-r from-background-gradient-mask-transparent via-divider-regular to-background-gradient-mask-transparent'></div>
+    </div>
+    <div onClick={() => router.back()} className='flex h-9 cursor-pointer items-center justify-center text-text-tertiary'>
+      <div className='bg-background-default-dimm inline-block rounded-full p-1'>
+        <RiArrowLeftLine size={12} />
+      </div>
+      <span className='system-xs-regular ml-2'>{t('login.back')}</span>
+    </div>
+  </div>
+}
diff --git a/app/reset-password/layout.tsx b/app/reset-password/layout.tsx
new file mode 100644
index 0000000..3d053e4
--- /dev/null
+++ b/app/reset-password/layout.tsx
@@ -0,0 +1,27 @@
+import Header from '../signin/_header'
+
+import cn from '@/utils/classnames'
+
+export default async function SignInLayout({ children }: any) {
+  return <>
+    <div className={cn('flex min-h-screen w-full justify-center bg-background-default-burn p-6')}>
+      <div className={cn('flex w-full shrink-0 flex-col rounded-2xl border border-effects-highlight bg-background-default-subtle')}>
+        <Header />
+        <div className={
+          cn(
+            'flex w-full grow flex-col items-center justify-center',
+            'px-6',
+            'md:px-[108px]',
+          )
+        }>
+          <div className='flex flex-col md:w-[400px]'>
+            {children}
+          </div>
+        </div>
+        <div className='system-xs-regular px-8 py-6 text-text-tertiary'>
+          漏 {new Date().getFullYear()} LangGenius, Inc. All rights reserved.
+        </div>
+      </div>
+    </div>
+  </>
+}
diff --git a/app/reset-password/page.tsx b/app/reset-password/page.tsx
new file mode 100644
index 0000000..dd8cdbc
--- /dev/null
+++ b/app/reset-password/page.tsx
@@ -0,0 +1,102 @@
+'use client'
+import Link from 'next/link'
+import { RiArrowLeftLine, RiLockPasswordLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useState } from 'react'
+import { useRouter, useSearchParams } from 'next/navigation'
+import { useContext } from 'use-context-selector'
+import { COUNT_DOWN_KEY, COUNT_DOWN_TIME_MS } from '../components/signin/countdown'
+import { emailRegex } from '@/config'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Toast from '@/app/components/base/toast'
+import { sendResetPasswordCode } from '@/service/common'
+import I18NContext from '@/context/i18n'
+import { noop } from 'lodash-es'
+
+export default function CheckCode() {
+  const { t } = useTranslation()
+  const searchParams = useSearchParams()
+  const router = useRouter()
+  const [email, setEmail] = useState('')
+  const [loading, setIsLoading] = useState(false)
+  const { locale } = useContext(I18NContext)
+
+  const handleGetEMailVerificationCode = async () => {
+    try {
+      if (!email) {
+        Toast.notify({ type: 'error', message: t('login.error.emailEmpty') })
+        return
+      }
+
+      if (!emailRegex.test(email)) {
+        Toast.notify({
+          type: 'error',
+          message: t('login.error.emailInValid'),
+        })
+        return
+      }
+      setIsLoading(true)
+      const res = await sendResetPasswordCode(email, locale)
+      if (res.result === 'success') {
+        localStorage.setItem(COUNT_DOWN_KEY, `${COUNT_DOWN_TIME_MS}`)
+        const params = new URLSearchParams(searchParams)
+        params.set('token', encodeURIComponent(res.data))
+        params.set('email', encodeURIComponent(email))
+        router.push(`/reset-password/check-code?${params.toString()}`)
+      }
+      else if (res.code === 'account_not_found') {
+        Toast.notify({
+          type: 'error',
+          message: t('login.error.registrationNotAllowed'),
+        })
+      }
+      else {
+        Toast.notify({
+          type: 'error',
+          message: res.data,
+        })
+      }
+    }
+    catch (error) {
+      console.error(error)
+    }
+    finally {
+      setIsLoading(false)
+    }
+  }
+
+  return <div className='flex flex-col gap-3'>
+    <div className='inline-flex h-14 w-14 items-center justify-center rounded-2xl border border-components-panel-border-subtle bg-background-default-dodge shadow-lg'>
+      <RiLockPasswordLine className='h-6 w-6 text-2xl text-text-accent-light-mode-only' />
+    </div>
+    <div className='pb-4 pt-2'>
+      <h2 className='title-4xl-semi-bold text-text-primary'>{t('login.resetPassword')}</h2>
+      <p className='body-md-regular mt-2 text-text-secondary'>
+        {t('login.resetPasswordDesc')}
+      </p>
+    </div>
+
+    <form onSubmit={noop}>
+      <input type='text' className='hidden' />
+      <div className='mb-2'>
+        <label htmlFor="email" className='system-md-semibold my-2 text-text-secondary'>{t('login.email')}</label>
+        <div className='mt-1'>
+          <Input id='email' type="email" disabled={loading} value={email} placeholder={t('login.emailPlaceholder') as string} onChange={e => setEmail(e.target.value)} />
+        </div>
+        <div className='mt-3'>
+          <Button loading={loading} disabled={loading} variant='primary' className='w-full' onClick={handleGetEMailVerificationCode}>{t('login.sendVerificationCode')}</Button>
+        </div>
+      </div>
+    </form>
+    <div className='py-2'>
+      <div className='h-px bg-gradient-to-r from-background-gradient-mask-transparent via-divider-regular to-background-gradient-mask-transparent'></div>
+    </div>
+    <Link href={`/signin?${searchParams.toString()}`} className='flex h-9 items-center justify-center text-text-tertiary hover:text-text-primary'>
+      <div className='inline-block rounded-full bg-background-default-dimmed p-1'>
+        <RiArrowLeftLine size={12} />
+      </div>
+      <span className='system-xs-regular ml-2'>{t('login.backToLogin')}</span>
+    </Link>
+  </div>
+}
diff --git a/app/reset-password/set-password/page.tsx b/app/reset-password/set-password/page.tsx
new file mode 100644
index 0000000..dd1c4ef
--- /dev/null
+++ b/app/reset-password/set-password/page.tsx
@@ -0,0 +1,193 @@
+'use client'
+import { useCallback, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useRouter, useSearchParams } from 'next/navigation'
+import cn from 'classnames'
+import { RiCheckboxCircleFill } from '@remixicon/react'
+import { useCountDown } from 'ahooks'
+import Button from '@/app/components/base/button'
+import { changePasswordWithToken } from '@/service/common'
+import Toast from '@/app/components/base/toast'
+import Input from '@/app/components/base/input'
+
+const validPassword = /^(?=.*[a-zA-Z])(?=.*\d).{8,}$/
+
+const ChangePasswordForm = () => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const searchParams = useSearchParams()
+  const token = decodeURIComponent(searchParams.get('token') || '')
+
+  const [password, setPassword] = useState('')
+  const [confirmPassword, setConfirmPassword] = useState('')
+  const [showSuccess, setShowSuccess] = useState(false)
+  const [showPassword, setShowPassword] = useState(false)
+  const [showConfirmPassword, setShowConfirmPassword] = useState(false)
+
+  const showErrorMessage = useCallback((message: string) => {
+    Toast.notify({
+      type: 'error',
+      message,
+    })
+  }, [])
+
+  const getSignInUrl = () => {
+    if (searchParams.has('invite_token')) {
+      const params = new URLSearchParams()
+      params.set('token', searchParams.get('invite_token') as string)
+      return `/activate?${params.toString()}`
+    }
+    return '/signin'
+  }
+
+  const AUTO_REDIRECT_TIME = 5000
+  const [leftTime, setLeftTime] = useState<number | undefined>(undefined)
+  const [countdown] = useCountDown({
+    leftTime,
+    onEnd: () => {
+      router.replace(getSignInUrl())
+    },
+  })
+
+  const valid = useCallback(() => {
+    if (!password.trim()) {
+      showErrorMessage(t('login.error.passwordEmpty'))
+      return false
+    }
+    if (!validPassword.test(password)) {
+      showErrorMessage(t('login.error.passwordInvalid'))
+      return false
+    }
+    if (password !== confirmPassword) {
+      showErrorMessage(t('common.account.notEqual'))
+      return false
+    }
+    return true
+  }, [password, confirmPassword, showErrorMessage, t])
+
+  const handleChangePassword = useCallback(async () => {
+    if (!valid())
+      return
+    try {
+      await changePasswordWithToken({
+        url: '/forgot-password/resets',
+        body: {
+          token,
+          new_password: password,
+          password_confirm: confirmPassword,
+        },
+      })
+      setShowSuccess(true)
+      setLeftTime(AUTO_REDIRECT_TIME)
+    }
+    catch (error) {
+      console.error(error)
+    }
+  }, [password, token, valid, confirmPassword])
+
+  return (
+    <div className={
+      cn(
+        'flex w-full grow flex-col items-center justify-center',
+        'px-6',
+        'md:px-[108px]',
+      )
+    }>
+      {!showSuccess && (
+        <div className='flex flex-col md:w-[400px]'>
+          <div className="mx-auto w-full">
+            <h2 className="title-4xl-semi-bold text-text-primary">
+              {t('login.changePassword')}
+            </h2>
+            <p className='body-md-regular mt-2 text-text-secondary'>
+              {t('login.changePasswordTip')}
+            </p>
+          </div>
+
+          <div className="mx-auto mt-6 w-full">
+            <div className="bg-white">
+              {/* Password */}
+              <div className='mb-5'>
+                <label htmlFor="password" className="system-md-semibold my-2 text-text-secondary">
+                  {t('common.account.newPassword')}
+                </label>
+                <div className='relative mt-1'>
+                  <Input
+                    id="password" type={showPassword ? 'text' : 'password'}
+                    value={password}
+                    onChange={e => setPassword(e.target.value)}
+                    placeholder={t('login.passwordPlaceholder') || ''}
+                  />
+
+                  <div className="absolute inset-y-0 right-0 flex items-center">
+                    <Button
+                      type="button"
+                      variant='ghost'
+                      onClick={() => setShowPassword(!showPassword)}
+                    >
+                      {showPassword ? '馃憖' : '馃槤'}
+                    </Button>
+                  </div>
+                </div>
+                <div className='body-xs-regular mt-1 text-text-secondary'>{t('login.error.passwordInvalid')}</div>
+              </div>
+              {/* Confirm Password */}
+              <div className='mb-5'>
+                <label htmlFor="confirmPassword" className="system-md-semibold my-2 text-text-secondary">
+                  {t('common.account.confirmPassword')}
+                </label>
+                <div className='relative mt-1'>
+                  <Input
+                    id="confirmPassword"
+                    type={showConfirmPassword ? 'text' : 'password'}
+                    value={confirmPassword}
+                    onChange={e => setConfirmPassword(e.target.value)}
+                    placeholder={t('login.confirmPasswordPlaceholder') || ''}
+                  />
+                  <div className="absolute inset-y-0 right-0 flex items-center">
+                    <Button
+                      type="button"
+                      variant='ghost'
+                      onClick={() => setShowConfirmPassword(!showConfirmPassword)}
+                    >
+                      {showConfirmPassword ? '馃憖' : '馃槤'}
+                    </Button>
+                  </div>
+                </div>
+              </div>
+              <div>
+                <Button
+                  variant='primary'
+                  className='w-full'
+                  onClick={handleChangePassword}
+                >
+                  {t('login.changePasswordBtn')}
+                </Button>
+              </div>
+            </div>
+          </div>
+        </div>
+      )}
+      {showSuccess && (
+        <div className="flex flex-col md:w-[400px]">
+          <div className="mx-auto w-full">
+            <div className="mb-3 flex h-14 w-14 items-center justify-center rounded-2xl border border-components-panel-border-subtle font-bold shadow-lg">
+              <RiCheckboxCircleFill className='h-6 w-6 text-text-success' />
+            </div>
+            <h2 className="title-4xl-semi-bold text-text-primary">
+              {t('login.passwordChangedTip')}
+            </h2>
+          </div>
+          <div className="mx-auto mt-6 w-full">
+            <Button variant='primary' className='w-full' onClick={() => {
+              setLeftTime(undefined)
+              router.replace(getSignInUrl())
+            }}>{t('login.passwordChanged')} ({Math.round(countdown / 1000)}) </Button>
+          </div>
+        </div>
+      )}
+    </div>
+  )
+}
+
+export default ChangePasswordForm
diff --git a/app/routePrefixHandle.tsx b/app/routePrefixHandle.tsx
new file mode 100644
index 0000000..16ed480
--- /dev/null
+++ b/app/routePrefixHandle.tsx
@@ -0,0 +1,53 @@
+'use client'
+
+import { basePath } from '@/utils/var'
+import { useEffect } from 'react'
+import { usePathname } from 'next/navigation'
+
+export default function RoutePrefixHandle() {
+  const pathname = usePathname()
+  const handleRouteChange = () => {
+    const addPrefixToImg = (e: HTMLImageElement) => {
+      const url = new URL(e.src)
+      const prefix = url.pathname.substr(0, basePath.length)
+      if (prefix !== basePath) {
+        url.pathname = basePath + url.pathname
+        e.src = url.toString()
+      }
+    }
+    // create an observer instance
+    const observer = new MutationObserver((mutationsList) => {
+      for (const mutation of mutationsList) {
+        if (mutation.type === 'childList') {
+          // listen for newly added img tags
+          mutation.addedNodes.forEach((node) => {
+            if (((node as HTMLElement).tagName) === 'IMG')
+              addPrefixToImg(node as HTMLImageElement)
+          })
+        }
+        else if (mutation.type === 'attributes' && (mutation.target as HTMLElement).tagName === 'IMG') {
+          // if the src of an existing img tag changes, update the prefix
+          if (mutation.attributeName === 'src')
+            addPrefixToImg(mutation.target as HTMLImageElement)
+        }
+      }
+    })
+
+    // configure observation options
+    const config = {
+      childList: true,
+      attributes: true,
+      subtree: true,
+      attributeFilter: ['src'],
+    }
+
+    observer.observe(document.body, config)
+  }
+
+  useEffect(() => {
+    if (basePath)
+      handleRouteChange()
+  }, [pathname])
+
+  return null
+}
diff --git a/app/signin/_header.tsx b/app/signin/_header.tsx
new file mode 100644
index 0000000..5e85a8d
--- /dev/null
+++ b/app/signin/_header.tsx
@@ -0,0 +1,42 @@
+'use client'
+import React from 'react'
+import { useContext } from 'use-context-selector'
+import Select from '@/app/components/base/select/locale'
+import Divider from '@/app/components/base/divider'
+import { languages } from '@/i18n/language'
+import type { Locale } from '@/i18n'
+import I18n from '@/context/i18n'
+import dynamic from 'next/dynamic'
+
+// Avoid rendering the logo and theme selector on the server
+const DifyLogo = dynamic(() => import('@/app/components/base/logo/dify-logo'), {
+  ssr: false,
+  loading: () => <div className='h-7 w-16 bg-transparent' />,
+})
+const ThemeSelector = dynamic(() => import('@/app/components/base/theme-selector'), {
+  ssr: false,
+  loading: () => <div className='size-8 bg-transparent' />,
+})
+
+const Header = () => {
+  const { locale, setLocaleOnClient } = useContext(I18n)
+
+  return (
+    <div className='flex w-full items-center justify-between p-6'>
+      <DifyLogo size='large' />
+      <div className='flex items-center gap-1'>
+        <Select
+          value={locale}
+          items={languages.filter(item => item.supported)}
+          onChange={(value) => {
+            setLocaleOnClient(value as Locale)
+          }}
+        />
+        <Divider type='vertical' className='mx-0 ml-2 h-4' />
+        <ThemeSelector />
+      </div>
+    </div>
+  )
+}
+
+export default Header
diff --git a/app/signin/assets/github.svg b/app/signin/assets/github.svg
new file mode 100644
index 0000000..f03798b
--- /dev/null
+++ b/app/signin/assets/github.svg
@@ -0,0 +1,17 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_131_1011)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.0003 0.5C9.15149 0.501478 6.39613 1.51046 4.22687 3.34652C2.05761 5.18259 0.615903 7.72601 0.159545 10.522C-0.296814 13.318 0.261927 16.1842 1.73587 18.6082C3.20981 21.0321 5.50284 22.8558 8.20493 23.753C8.80105 23.8636 9.0256 23.4941 9.0256 23.18C9.0256 22.8658 9.01367 21.955 9.0097 20.9592C5.6714 21.6804 4.96599 19.5505 4.96599 19.5505C4.42152 18.1674 3.63464 17.8039 3.63464 17.8039C2.54571 17.065 3.71611 17.0788 3.71611 17.0788C4.92227 17.1637 5.55616 18.3097 5.55616 18.3097C6.62521 20.1333 8.36389 19.6058 9.04745 19.2976C9.15475 18.5251 9.46673 17.9995 9.8105 17.7012C7.14383 17.4008 4.34204 16.3774 4.34204 11.8054C4.32551 10.6197 4.76802 9.47305 5.57801 8.60268C5.45481 8.30236 5.04348 7.08923 5.69524 5.44143C5.69524 5.44143 6.7027 5.12135 8.9958 6.66444C10.9627 6.12962 13.0379 6.12962 15.0047 6.66444C17.2958 5.12135 18.3013 5.44143 18.3013 5.44143C18.9551 7.08528 18.5437 8.29841 18.4205 8.60268C19.2331 9.47319 19.6765 10.6218 19.6585 11.8094C19.6585 16.3912 16.8507 17.4008 14.1801 17.6952C14.6093 18.0667 14.9928 18.7918 14.9928 19.9061C14.9928 21.5026 14.9789 22.7868 14.9789 23.18C14.9789 23.4981 15.1955 23.8695 15.8035 23.753C18.5059 22.8557 20.7992 21.0317 22.2731 18.6073C23.747 16.183 24.3055 13.3163 23.8486 10.5201C23.3917 7.7238 21.9493 5.18035 19.7793 3.34461C17.6093 1.50886 14.8533 0.500541 12.0042 0.5H12.0003Z" fill="#191717"/>
+<path d="M4.54444 17.6321C4.5186 17.6914 4.42322 17.7092 4.34573 17.6677C4.26823 17.6262 4.21061 17.5491 4.23843 17.4879C4.26625 17.4266 4.35964 17.4108 4.43714 17.4523C4.51463 17.4938 4.57424 17.5729 4.54444 17.6321Z" fill="#191717"/>
+<path d="M5.03123 18.1714C4.99008 18.192 4.943 18.1978 4.89805 18.1877C4.8531 18.1776 4.81308 18.1523 4.78483 18.1161C4.70734 18.0331 4.69143 17.9185 4.75104 17.8671C4.81066 17.8157 4.91797 17.8395 4.99546 17.9224C5.07296 18.0054 5.09084 18.12 5.03123 18.1714Z" fill="#191717"/>
+<path d="M5.50425 18.857C5.43072 18.9084 5.30553 18.857 5.23598 18.7543C5.21675 18.7359 5.20146 18.7138 5.19101 18.6893C5.18056 18.6649 5.17517 18.6386 5.17517 18.612C5.17517 18.5855 5.18056 18.5592 5.19101 18.5347C5.20146 18.5103 5.21675 18.4882 5.23598 18.4698C5.3095 18.4204 5.4347 18.4698 5.50425 18.5705C5.57379 18.6713 5.57578 18.8057 5.50425 18.857V18.857Z" fill="#191717"/>
+<path d="M6.14612 19.5207C6.08054 19.5939 5.94741 19.5741 5.83812 19.4753C5.72883 19.3765 5.70299 19.2422 5.76857 19.171C5.83414 19.0999 5.96727 19.1197 6.08054 19.2165C6.1938 19.3133 6.21566 19.4496 6.14612 19.5207V19.5207Z" fill="#191717"/>
+<path d="M7.04617 19.9081C7.01637 20.001 6.88124 20.0425 6.74612 20.003C6.611 19.9635 6.52158 19.8528 6.54741 19.758C6.57325 19.6631 6.71036 19.6197 6.84747 19.6631C6.98457 19.7066 7.07201 19.8113 7.04617 19.9081Z" fill="#191717"/>
+<path d="M8.02783 19.9752C8.02783 20.072 7.91656 20.155 7.77349 20.1569C7.63042 20.1589 7.51318 20.0799 7.51318 19.9831C7.51318 19.8863 7.62445 19.8033 7.76752 19.8013C7.91059 19.7993 8.02783 19.8764 8.02783 19.9752Z" fill="#191717"/>
+<path d="M8.9419 19.8232C8.95978 19.92 8.86042 20.0207 8.71735 20.0445C8.57428 20.0682 8.4491 20.0109 8.43121 19.916C8.41333 19.8212 8.51666 19.7185 8.65576 19.6928C8.79485 19.6671 8.92401 19.7264 8.9419 19.8232Z" fill="#191717"/>
+</g>
+<defs>
+<clipPath id="clip0_131_1011">
+<rect width="24" height="24" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/signin/assets/google.svg b/app/signin/assets/google.svg
new file mode 100644
index 0000000..6bcacfc
--- /dev/null
+++ b/app/signin/assets/google.svg
@@ -0,0 +1,13 @@
+<svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_729_2080)">
+<path d="M20.3052 10.2302C20.3052 9.55044 20.2501 8.86699 20.1325 8.19824H10.7002V12.0491H16.1016C15.8775 13.291 15.1573 14.3897 14.1027 15.0878V17.5864H17.3252C19.2176 15.8448 20.3052 13.2726 20.3052 10.2302Z" fill="#4285F4"/>
+<path d="M10.6999 20.0008C13.397 20.0008 15.6714 19.1152 17.3286 17.5867L14.1061 15.088C13.2096 15.698 12.0521 16.0434 10.7036 16.0434C8.09474 16.0434 5.88272 14.2833 5.08904 11.917H1.76367V14.4928C3.46127 17.8696 6.91892 20.0008 10.6999 20.0008Z" fill="#34A853"/>
+<path d="M5.08564 11.9172C4.66676 10.6753 4.66676 9.33044 5.08564 8.08848V5.5127H1.76395C0.345611 8.33834 0.345611 11.6674 1.76395 14.493L5.08564 11.9172Z" fill="#FBBC04"/>
+<path d="M10.6999 3.95805C12.1256 3.936 13.5035 4.47247 14.536 5.45722L17.3911 2.60218C15.5833 0.904587 13.1838 -0.0287217 10.6999 0.000673888C6.91892 0.000673888 3.46126 2.13185 1.76367 5.51234L5.08537 8.08813C5.87537 5.71811 8.09106 3.95805 10.6999 3.95805Z" fill="#EA4335"/>
+</g>
+<defs>
+<clipPath id="clip0_729_2080">
+<rect width="20" height="20" fill="white" transform="translate(0.5)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/app/signin/check-code/page.tsx b/app/signin/check-code/page.tsx
new file mode 100644
index 0000000..912df62
--- /dev/null
+++ b/app/signin/check-code/page.tsx
@@ -0,0 +1,96 @@
+'use client'
+import { RiArrowLeftLine, RiMailSendFill } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { useState } from 'react'
+import { useRouter, useSearchParams } from 'next/navigation'
+import { useContext } from 'use-context-selector'
+import Countdown from '@/app/components/signin/countdown'
+import Button from '@/app/components/base/button'
+import Input from '@/app/components/base/input'
+import Toast from '@/app/components/base/toast'
+import { emailLoginWithCode, sendEMailLoginCode } from '@/service/common'
+import I18NContext from '@/context/i18n'
+
+export default function CheckCode() {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const searchParams = useSearchParams()
+  const email = decodeURIComponent(searchParams.get('email') as string)
+  const token = decodeURIComponent(searchParams.get('token') as string)
+  const invite_token = decodeURIComponent(searchParams.get('invite_token') || '')
+  const [code, setVerifyCode] = useState('')
+  const [loading, setIsLoading] = useState(false)
+  const { locale } = useContext(I18NContext)
+
+  const verify = async () => {
+    try {
+      if (!code.trim()) {
+        Toast.notify({
+          type: 'error',
+          message: t('login.checkCode.emptyCode'),
+        })
+        return
+      }
+      if (!/\d{6}/.test(code)) {
+        Toast.notify({
+          type: 'error',
+          message: t('login.checkCode.invalidCode'),
+        })
+        return
+      }
+      setIsLoading(true)
+      const ret = await emailLoginWithCode({ email, code, token })
+      if (ret.result === 'success') {
+        localStorage.setItem('console_token', ret.data.access_token)
+        localStorage.setItem('refresh_token', ret.data.refresh_token)
+        router.replace(invite_token ? `/signin/invite-settings?${searchParams.toString()}` : '/apps')
+      }
+    }
+    catch (error) { console.error(error) }
+    finally {
+      setIsLoading(false)
+    }
+  }
+
+  const resendCode = async () => {
+    try {
+      const ret = await sendEMailLoginCode(email, locale)
+      if (ret.result === 'success') {
+        const params = new URLSearchParams(searchParams)
+        params.set('token', encodeURIComponent(ret.data))
+        router.replace(`/signin/check-code?${params.toString()}`)
+      }
+    }
+    catch (error) { console.error(error) }
+  }
+
+  return <div className='flex flex-col gap-3'>
+    <div className='inline-flex h-14 w-14 items-center justify-center rounded-2xl border border-components-panel-border-subtle bg-background-default-dodge shadow-lg'>
+      <RiMailSendFill className='h-6 w-6 text-2xl text-text-accent-light-mode-only' />
+    </div>
+    <div className='pb-4 pt-2'>
+      <h2 className='title-4xl-semi-bold text-text-primary'>{t('login.checkCode.checkYourEmail')}</h2>
+      <p className='body-md-regular mt-2 text-text-secondary'>
+        <span dangerouslySetInnerHTML={{ __html: t('login.checkCode.tips', { email }) as string }}></span>
+        <br />
+        {t('login.checkCode.validTime')}
+      </p>
+    </div>
+
+    <form action="">
+      <label htmlFor="code" className='system-md-semibold mb-1 text-text-secondary'>{t('login.checkCode.verificationCode')}</label>
+      <Input value={code} onChange={e => setVerifyCode(e.target.value)} max-length={6} className='mt-1' placeholder={t('login.checkCode.verificationCodePlaceholder') as string} />
+      <Button loading={loading} disabled={loading} className='my-3 w-full' variant='primary' onClick={verify}>{t('login.checkCode.verify')}</Button>
+      <Countdown onResend={resendCode} />
+    </form>
+    <div className='py-2'>
+      <div className='h-px bg-gradient-to-r from-background-gradient-mask-transparent via-divider-regular to-background-gradient-mask-transparent'></div>
+    </div>
+    <div onClick={() => router.back()} className='flex h-9 cursor-pointer items-center justify-center text-text-tertiary'>
+      <div className='bg-background-default-dimm inline-block rounded-full p-1'>
+        <RiArrowLeftLine size={12} />
+      </div>
+      <span className='system-xs-regular ml-2'>{t('login.back')}</span>
+    </div>
+  </div>
+}
diff --git a/app/signin/components/mail-and-code-auth.tsx b/app/signin/components/mail-and-code-auth.tsx
new file mode 100644
index 0000000..3ad57de
--- /dev/null
+++ b/app/signin/components/mail-and-code-auth.tsx
@@ -0,0 +1,72 @@
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useRouter, useSearchParams } from 'next/navigation'
+import { useContext } from 'use-context-selector'
+import Input from '@/app/components/base/input'
+import Button from '@/app/components/base/button'
+import { emailRegex } from '@/config'
+import Toast from '@/app/components/base/toast'
+import { sendEMailLoginCode } from '@/service/common'
+import { COUNT_DOWN_KEY, COUNT_DOWN_TIME_MS } from '@/app/components/signin/countdown'
+import I18NContext from '@/context/i18n'
+import { noop } from 'lodash-es'
+
+type MailAndCodeAuthProps = {
+  isInvite: boolean
+}
+
+export default function MailAndCodeAuth({ isInvite }: MailAndCodeAuthProps) {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const searchParams = useSearchParams()
+  const emailFromLink = decodeURIComponent(searchParams.get('email') || '')
+  const [email, setEmail] = useState(emailFromLink)
+  const [loading, setIsLoading] = useState(false)
+  const { locale } = useContext(I18NContext)
+
+  const handleGetEMailVerificationCode = async () => {
+    try {
+      if (!email) {
+        Toast.notify({ type: 'error', message: t('login.error.emailEmpty') })
+        return
+      }
+
+      if (!emailRegex.test(email)) {
+        Toast.notify({
+          type: 'error',
+          message: t('login.error.emailInValid'),
+        })
+        return
+      }
+      setIsLoading(true)
+      const ret = await sendEMailLoginCode(email, locale)
+      if (ret.result === 'success') {
+        localStorage.setItem(COUNT_DOWN_KEY, `${COUNT_DOWN_TIME_MS}`)
+        const params = new URLSearchParams(searchParams)
+        params.set('email', encodeURIComponent(email))
+        params.set('token', encodeURIComponent(ret.data))
+        router.push(`/signin/check-code?${params.toString()}`)
+      }
+    }
+    catch (error) {
+      console.error(error)
+    }
+    finally {
+      setIsLoading(false)
+    }
+  }
+
+  return (<form onSubmit={noop}>
+    <input type='text' className='hidden' />
+    <div className='mb-2'>
+      <label htmlFor="email" className='system-md-semibold my-2 text-text-secondary'>{t('login.email')}</label>
+      <div className='mt-1'>
+        <Input id='email' type="email" disabled={isInvite} value={email} placeholder={t('login.emailPlaceholder') as string} onChange={e => setEmail(e.target.value)} />
+      </div>
+      <div className='mt-3'>
+        <Button loading={loading} disabled={loading || !email} variant='primary' className='w-full' onClick={handleGetEMailVerificationCode}>{t('login.continueWithCode')}</Button>
+      </div>
+    </div>
+  </form>
+  )
+}
diff --git a/app/signin/components/mail-and-password-auth.tsx b/app/signin/components/mail-and-password-auth.tsx
new file mode 100644
index 0000000..7360fda
--- /dev/null
+++ b/app/signin/components/mail-and-password-auth.tsx
@@ -0,0 +1,174 @@
+import Link from 'next/link'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { useRouter, useSearchParams } from 'next/navigation'
+import { useContext } from 'use-context-selector'
+import Button from '@/app/components/base/button'
+import Toast from '@/app/components/base/toast'
+import { emailRegex } from '@/config'
+import { login } from '@/service/common'
+import Input from '@/app/components/base/input'
+import I18NContext from '@/context/i18n'
+import { noop } from 'lodash-es'
+
+type MailAndPasswordAuthProps = {
+  isInvite: boolean
+  isEmailSetup: boolean
+  allowRegistration: boolean
+}
+
+const passwordRegex = /^(?=.*[a-zA-Z])(?=.*\d).{8,}$/
+
+export default function MailAndPasswordAuth({ isInvite, isEmailSetup, allowRegistration }: MailAndPasswordAuthProps) {
+  const { t } = useTranslation()
+  const { locale } = useContext(I18NContext)
+  const router = useRouter()
+  const searchParams = useSearchParams()
+  const [showPassword, setShowPassword] = useState(false)
+  const emailFromLink = decodeURIComponent(searchParams.get('email') || '')
+  const [email, setEmail] = useState(emailFromLink)
+  const [password, setPassword] = useState('')
+
+  const [isLoading, setIsLoading] = useState(false)
+  const handleEmailPasswordLogin = async () => {
+    if (!email) {
+      Toast.notify({ type: 'error', message: t('login.error.emailEmpty') })
+      return
+    }
+    if (!emailRegex.test(email)) {
+      Toast.notify({
+        type: 'error',
+        message: t('login.error.emailInValid'),
+      })
+      return
+    }
+    if (!password?.trim()) {
+      Toast.notify({ type: 'error', message: t('login.error.passwordEmpty') })
+      return
+    }
+    if (!passwordRegex.test(password)) {
+      Toast.notify({
+        type: 'error',
+        message: t('login.error.passwordInvalid'),
+      })
+      return
+    }
+    try {
+      setIsLoading(true)
+      const loginData: Record<string, any> = {
+        email,
+        password,
+        language: locale,
+        remember_me: true,
+      }
+      if (isInvite)
+        loginData.invite_token = decodeURIComponent(searchParams.get('invite_token') as string)
+      const res = await login({
+        url: '/login',
+        body: loginData,
+      })
+      if (res.result === 'success') {
+        if (isInvite) {
+          router.replace(`/signin/invite-settings?${searchParams.toString()}`)
+        }
+        else {
+          localStorage.setItem('console_token', res.data.access_token)
+          localStorage.setItem('refresh_token', res.data.refresh_token)
+          router.replace('/apps')
+        }
+      }
+      else if (res.code === 'account_not_found') {
+        if (allowRegistration) {
+          const params = new URLSearchParams()
+          params.append('email', encodeURIComponent(email))
+          params.append('token', encodeURIComponent(res.data))
+          router.replace(`/reset-password/check-code?${params.toString()}`)
+        }
+        else {
+          Toast.notify({
+            type: 'error',
+            message: t('login.error.registrationNotAllowed'),
+          })
+        }
+      }
+      else {
+        Toast.notify({
+          type: 'error',
+          message: res.data,
+        })
+      }
+    }
+
+    finally {
+      setIsLoading(false)
+    }
+  }
+
+  return <form onSubmit={noop}>
+    <div className='mb-3'>
+      <label htmlFor="email" className="system-md-semibold my-2 text-text-secondary">
+        {t('login.email')}
+      </label>
+      <div className="mt-1">
+        <Input
+          value={email}
+          onChange={e => setEmail(e.target.value)}
+          disabled={isInvite}
+          id="email"
+          type="email"
+          autoComplete="email"
+          placeholder={t('login.emailPlaceholder') || ''}
+          tabIndex={1}
+        />
+      </div>
+    </div>
+
+    <div className='mb-3'>
+      <label htmlFor="password" className="my-2 flex items-center justify-between">
+        <span className='system-md-semibold text-text-secondary'>{t('login.password')}</span>
+        <Link
+          href={`/reset-password?${searchParams.toString()}`}
+          className={`system-xs-regular ${isEmailSetup ? 'text-components-button-secondary-accent-text' : 'pointer-events-none text-components-button-secondary-accent-text-disabled'}`}
+          tabIndex={isEmailSetup ? 0 : -1}
+          aria-disabled={!isEmailSetup}
+        >
+          {t('login.forget')}
+        </Link>
+      </label>
+      <div className="relative mt-1">
+        <Input
+          id="password"
+          value={password}
+          onChange={e => setPassword(e.target.value)}
+          onKeyDown={(e) => {
+            if (e.key === 'Enter')
+              handleEmailPasswordLogin()
+          }}
+          type={showPassword ? 'text' : 'password'}
+          autoComplete="current-password"
+          placeholder={t('login.passwordPlaceholder') || ''}
+          tabIndex={2}
+        />
+        <div className="absolute inset-y-0 right-0 flex items-center">
+          <Button
+            type="button"
+            variant='ghost'
+            onClick={() => setShowPassword(!showPassword)}
+          >
+            {showPassword ? '馃憖' : '馃槤'}
+          </Button>
+        </div>
+      </div>
+    </div>
+
+    <div className='mb-2'>
+      <Button
+        tabIndex={2}
+        variant='primary'
+        onClick={handleEmailPasswordLogin}
+        disabled={isLoading || !email || !password}
+        className="w-full"
+      >{t('login.signBtn')}</Button>
+    </div>
+  </form>
+}
diff --git a/app/signin/components/social-auth.tsx b/app/signin/components/social-auth.tsx
new file mode 100644
index 0000000..39d7cea
--- /dev/null
+++ b/app/signin/components/social-auth.tsx
@@ -0,0 +1,62 @@
+import { useTranslation } from 'react-i18next'
+import { useSearchParams } from 'next/navigation'
+import style from '../page.module.css'
+import Button from '@/app/components/base/button'
+import { apiPrefix } from '@/config'
+import classNames from '@/utils/classnames'
+import { getPurifyHref } from '@/utils'
+
+type SocialAuthProps = {
+  disabled?: boolean
+}
+
+export default function SocialAuth(props: SocialAuthProps) {
+  const { t } = useTranslation()
+  const searchParams = useSearchParams()
+
+  const getOAuthLink = (href: string) => {
+    const url = getPurifyHref(`${apiPrefix}${href}`)
+    if (searchParams.has('invite_token'))
+      return `${url}?${searchParams.toString()}`
+
+    return url
+  }
+  return <>
+    <div className='w-full'>
+      <a href={getOAuthLink('/oauth/login/github')}>
+        <Button
+          disabled={props.disabled}
+          className='w-full'
+        >
+          <>
+            <span className={
+              classNames(
+                style.githubIcon,
+                'w-5 h-5 mr-2',
+              )
+            } />
+            <span className="truncate">{t('login.withGitHub')}</span>
+          </>
+        </Button>
+      </a>
+    </div>
+    <div className='w-full'>
+      <a href={getOAuthLink('/oauth/login/google')}>
+        <Button
+          disabled={props.disabled}
+          className='w-full'
+        >
+          <>
+            <span className={
+              classNames(
+                style.googleIcon,
+                'w-5 h-5 mr-2',
+              )
+            } />
+            <span className="truncate">{t('login.withGoogle')}</span>
+          </>
+        </Button>
+      </a>
+    </div>
+  </>
+}
diff --git a/app/signin/components/sso-auth.tsx b/app/signin/components/sso-auth.tsx
new file mode 100644
index 0000000..960d082
--- /dev/null
+++ b/app/signin/components/sso-auth.tsx
@@ -0,0 +1,73 @@
+'use client'
+import { useRouter, useSearchParams } from 'next/navigation'
+import type { FC } from 'react'
+import { useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security'
+import Toast from '@/app/components/base/toast'
+import { getUserOAuth2SSOUrl, getUserOIDCSSOUrl, getUserSAMLSSOUrl } from '@/service/sso'
+import Button from '@/app/components/base/button'
+import { SSOProtocol } from '@/types/feature'
+
+type SSOAuthProps = {
+  protocol: SSOProtocol | ''
+}
+
+const SSOAuth: FC<SSOAuthProps> = ({
+  protocol,
+}) => {
+  const router = useRouter()
+  const { t } = useTranslation()
+  const searchParams = useSearchParams()
+  const invite_token = decodeURIComponent(searchParams.get('invite_token') || '')
+
+  const [isLoading, setIsLoading] = useState(false)
+
+  const handleSSOLogin = () => {
+    setIsLoading(true)
+    if (protocol === SSOProtocol.SAML) {
+      getUserSAMLSSOUrl(invite_token).then((res) => {
+        router.push(res.url)
+      }).finally(() => {
+        setIsLoading(false)
+      })
+    }
+    else if (protocol === SSOProtocol.OIDC) {
+      getUserOIDCSSOUrl(invite_token).then((res) => {
+        document.cookie = `user-oidc-state=${res.state}`
+        router.push(res.url)
+      }).finally(() => {
+        setIsLoading(false)
+      })
+    }
+    else if (protocol === SSOProtocol.OAuth2) {
+      getUserOAuth2SSOUrl(invite_token).then((res) => {
+        document.cookie = `user-oauth2-state=${res.state}`
+        router.push(res.url)
+      }).finally(() => {
+        setIsLoading(false)
+      })
+    }
+    else {
+      Toast.notify({
+        type: 'error',
+        message: 'invalid SSO protocol',
+      })
+      setIsLoading(false)
+    }
+  }
+
+  return (
+    <Button
+      tabIndex={0}
+      onClick={() => { handleSSOLogin() }}
+      disabled={isLoading}
+      className="w-full"
+    >
+      <Lock01 className='mr-2 h-5 w-5 text-text-accent-light-mode-only' />
+      <span className="truncate">{t('login.withSSO')}</span>
+    </Button>
+  )
+}
+
+export default SSOAuth
diff --git a/app/signin/invite-settings/page.tsx b/app/signin/invite-settings/page.tsx
new file mode 100644
index 0000000..925bc51
--- /dev/null
+++ b/app/signin/invite-settings/page.tsx
@@ -0,0 +1,154 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { useCallback, useState } from 'react'
+import Link from 'next/link'
+import { useContext } from 'use-context-selector'
+import { useRouter, useSearchParams } from 'next/navigation'
+import useSWR from 'swr'
+import { RiAccountCircleLine } from '@remixicon/react'
+import Input from '@/app/components/base/input'
+import { SimpleSelect } from '@/app/components/base/select'
+import Button from '@/app/components/base/button'
+import { timezones } from '@/utils/timezone'
+import { LanguagesSupported, languages } from '@/i18n/language'
+import I18n from '@/context/i18n'
+import { activateMember, invitationCheck } from '@/service/common'
+import Loading from '@/app/components/base/loading'
+import Toast from '@/app/components/base/toast'
+
+export default function InviteSettingsPage() {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const searchParams = useSearchParams()
+  const token = decodeURIComponent(searchParams.get('invite_token') as string)
+  const { locale, setLocaleOnClient } = useContext(I18n)
+  const [name, setName] = useState('')
+  const [language, setLanguage] = useState(LanguagesSupported[0])
+  const [timezone, setTimezone] = useState(Intl.DateTimeFormat().resolvedOptions().timeZone || 'America/Los_Angeles')
+
+  const checkParams = {
+    url: '/activate/check',
+    params: {
+      token,
+    },
+  }
+  const { data: checkRes, mutate: recheck } = useSWR(checkParams, invitationCheck, {
+    revalidateOnFocus: false,
+  })
+
+  const handleActivate = useCallback(async () => {
+    try {
+      if (!name) {
+        Toast.notify({ type: 'error', message: t('login.enterYourName') })
+        return
+      }
+      const res = await activateMember({
+        url: '/activate',
+        body: {
+          token,
+          name,
+          interface_language: language,
+          timezone,
+        },
+      })
+      if (res.result === 'success') {
+        localStorage.setItem('console_token', res.data.access_token)
+        localStorage.setItem('refresh_token', res.data.refresh_token)
+        setLocaleOnClient(language, false)
+        router.replace('/apps')
+      }
+    }
+    catch {
+      recheck()
+    }
+  }, [language, name, recheck, setLocaleOnClient, timezone, token, router, t])
+
+  if (!checkRes)
+    return <Loading />
+  if (!checkRes.is_valid) {
+    return <div className="flex flex-col md:w-[400px]">
+      <div className="mx-auto w-full">
+        <div className="mb-3 flex h-14 w-14 items-center justify-center rounded-2xl border border-components-panel-border-subtle text-2xl font-bold shadow-lg">馃し鈥嶁檪锔�</div>
+        <h2 className="title-4xl-semi-bold">{t('login.invalid')}</h2>
+      </div>
+      <div className="mx-auto mt-6 w-full">
+        <Button variant='primary' className='w-full !text-sm'>
+          <a href="https://dify.ai">{t('login.explore')}</a>
+        </Button>
+      </div>
+    </div>
+  }
+
+  return <div className='flex flex-col gap-3'>
+    <div className='inline-flex h-14 w-14 items-center justify-center rounded-2xl border border-components-panel-border-subtle bg-background-default-dodge shadow-lg'>
+      <RiAccountCircleLine className='h-6 w-6 text-2xl text-text-accent-light-mode-only' />
+    </div>
+    <div className='pb-4 pt-2'>
+      <h2 className='title-4xl-semi-bold'>{t('login.setYourAccount')}</h2>
+    </div>
+    <form action=''>
+
+      <div className='mb-5'>
+        <label htmlFor="name" className="system-md-semibold my-2">
+          {t('login.name')}
+        </label>
+        <div className="mt-1">
+          <Input
+            id="name"
+            type="text"
+            value={name}
+            onChange={e => setName(e.target.value)}
+            placeholder={t('login.namePlaceholder') || ''}
+          />
+        </div>
+      </div>
+      <div className='mb-5'>
+        <label htmlFor="name" className="system-md-semibold my-2">
+          {t('login.interfaceLanguage')}
+        </label>
+        <div className="mt-1">
+          <SimpleSelect
+            defaultValue={LanguagesSupported[0]}
+            items={languages.filter(item => item.supported)}
+            onSelect={(item) => {
+              setLanguage(item.value as string)
+            }}
+          />
+        </div>
+      </div>
+      {/* timezone */}
+      <div className='mb-5'>
+        <label htmlFor="timezone" className="system-md-semibold">
+          {t('login.timezone')}
+        </label>
+        <div className="mt-1">
+          <SimpleSelect
+            defaultValue={timezone}
+            items={timezones}
+            onSelect={(item) => {
+              setTimezone(item.value as string)
+            }}
+          />
+        </div>
+      </div>
+      <div>
+        <Button
+          variant='primary'
+          className='w-full'
+          onClick={handleActivate}
+        >
+          {`${t('login.join')} ${checkRes?.data?.workspace_name}`}
+        </Button>
+      </div>
+    </form>
+    <div className="system-xs-regular mt-2 block w-full">
+      {t('login.license.tip')}
+      &nbsp;
+      <Link
+        className='system-xs-medium text-text-accent-secondary'
+        target='_blank' rel='noopener noreferrer'
+        href={`https://docs.dify.ai/${language !== LanguagesSupported[1] ? 'user-agreement' : `v/${locale.toLowerCase()}/policies`}/open-source`}
+      >{t('login.license.link')}</Link>
+    </div>
+  </div>
+}
diff --git a/app/signin/layout.tsx b/app/signin/layout.tsx
new file mode 100644
index 0000000..1af4082
--- /dev/null
+++ b/app/signin/layout.tsx
@@ -0,0 +1,21 @@
+import Header from './_header'
+
+import cn from '@/utils/classnames'
+
+export default async function SignInLayout({ children }: any) {
+  return <>
+    <div className={cn('flex min-h-screen w-full justify-center bg-background-default-burn p-6')}>
+      <div className={cn('flex w-full shrink-0 flex-col rounded-2xl border border-effects-highlight bg-background-default-subtle')}>
+        <Header />
+        <div className={cn('flex w-full grow flex-col items-center justify-center px-6 md:px-[108px]')}>
+          <div className='flex flex-col md:w-[400px]'>
+            {children}
+          </div>
+        </div>
+        <div className='system-xs-regular px-8 py-6 text-text-tertiary'>
+          漏 {new Date().getFullYear()} LangGenius, Inc. All rights reserved.
+        </div>
+      </div>
+    </div>
+  </>
+}
diff --git a/app/signin/normalForm.tsx b/app/signin/normalForm.tsx
new file mode 100644
index 0000000..c76e088
--- /dev/null
+++ b/app/signin/normalForm.tsx
@@ -0,0 +1,217 @@
+import React, { useCallback, useEffect, useState } from 'react'
+import { useTranslation } from 'react-i18next'
+import Link from 'next/link'
+import { useRouter, useSearchParams } from 'next/navigation'
+import { RiContractLine, RiDoorLockLine, RiErrorWarningFill } from '@remixicon/react'
+import Loading from '../components/base/loading'
+import MailAndCodeAuth from './components/mail-and-code-auth'
+import MailAndPasswordAuth from './components/mail-and-password-auth'
+import SocialAuth from './components/social-auth'
+import SSOAuth from './components/sso-auth'
+import cn from '@/utils/classnames'
+import { getSystemFeatures, invitationCheck } from '@/service/common'
+import { LicenseStatus, defaultSystemFeatures } from '@/types/feature'
+import Toast from '@/app/components/base/toast'
+import { IS_CE_EDITION } from '@/config'
+
+const NormalForm = () => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const searchParams = useSearchParams()
+  const consoleToken = decodeURIComponent(searchParams.get('access_token') || '')
+  const refreshToken = decodeURIComponent(searchParams.get('refresh_token') || '')
+  const message = decodeURIComponent(searchParams.get('message') || '')
+  const invite_token = decodeURIComponent(searchParams.get('invite_token') || '')
+  const [isLoading, setIsLoading] = useState(true)
+  const [systemFeatures, setSystemFeatures] = useState(defaultSystemFeatures)
+  const [authType, updateAuthType] = useState<'code' | 'password'>('password')
+  const [showORLine, setShowORLine] = useState(false)
+  const [allMethodsAreDisabled, setAllMethodsAreDisabled] = useState(false)
+  const [workspaceName, setWorkSpaceName] = useState('')
+
+  const isInviteLink = Boolean(invite_token && invite_token !== 'null')
+
+  const init = useCallback(async () => {
+    try {
+      if (consoleToken && refreshToken) {
+        localStorage.setItem('console_token', consoleToken)
+        localStorage.setItem('refresh_token', refreshToken)
+        router.replace('/apps')
+        return
+      }
+
+      if (message) {
+        Toast.notify({
+          type: 'error',
+          message,
+        })
+      }
+      const features = await getSystemFeatures()
+      const allFeatures = { ...defaultSystemFeatures, ...features }
+      setSystemFeatures(allFeatures)
+      setAllMethodsAreDisabled(!allFeatures.enable_social_oauth_login && !allFeatures.enable_email_code_login && !allFeatures.enable_email_password_login && !allFeatures.sso_enforced_for_signin)
+      setShowORLine((allFeatures.enable_social_oauth_login || allFeatures.sso_enforced_for_signin) && (allFeatures.enable_email_code_login || allFeatures.enable_email_password_login))
+      updateAuthType(allFeatures.enable_email_password_login ? 'password' : 'code')
+      if (isInviteLink) {
+        const checkRes = await invitationCheck({
+          url: '/activate/check',
+          params: {
+            token: invite_token,
+          },
+        })
+        setWorkSpaceName(checkRes?.data?.workspace_name || '')
+      }
+    }
+    catch (error) {
+      console.error(error)
+      setAllMethodsAreDisabled(true)
+      setSystemFeatures(defaultSystemFeatures)
+    }
+    finally { setIsLoading(false) }
+  }, [consoleToken, refreshToken, message, router, invite_token, isInviteLink])
+  useEffect(() => {
+    init()
+  }, [init])
+  if (isLoading || consoleToken) {
+    return <div className={
+      cn(
+        'flex w-full grow flex-col items-center justify-center',
+        'px-6',
+        'md:px-[108px]',
+      )
+    }>
+      <Loading type='area' />
+    </div>
+  }
+  if (systemFeatures.license?.status === LicenseStatus.LOST) {
+    return <div className='mx-auto mt-8 w-full'>
+      <div className='relative'>
+        <div className="rounded-lg bg-gradient-to-r from-workflow-workflow-progress-bg-1 to-workflow-workflow-progress-bg-2 p-4">
+          <div className='shadows-shadow-lg relative mb-2 flex h-10 w-10 items-center justify-center rounded-xl bg-components-card-bg shadow'>
+            <RiContractLine className='h-5 w-5' />
+            <RiErrorWarningFill className='absolute -right-1 -top-1 h-4 w-4 text-text-warning-secondary' />
+          </div>
+          <p className='system-sm-medium text-text-primary'>{t('login.licenseLost')}</p>
+          <p className='system-xs-regular mt-1 text-text-tertiary'>{t('login.licenseLostTip')}</p>
+        </div>
+      </div>
+    </div>
+  }
+  if (systemFeatures.license?.status === LicenseStatus.EXPIRED) {
+    return <div className='mx-auto mt-8 w-full'>
+      <div className='relative'>
+        <div className="rounded-lg bg-gradient-to-r from-workflow-workflow-progress-bg-1 to-workflow-workflow-progress-bg-2 p-4">
+          <div className='shadows-shadow-lg relative mb-2 flex h-10 w-10 items-center justify-center rounded-xl bg-components-card-bg shadow'>
+            <RiContractLine className='h-5 w-5' />
+            <RiErrorWarningFill className='absolute -right-1 -top-1 h-4 w-4 text-text-warning-secondary' />
+          </div>
+          <p className='system-sm-medium text-text-primary'>{t('login.licenseExpired')}</p>
+          <p className='system-xs-regular mt-1 text-text-tertiary'>{t('login.licenseExpiredTip')}</p>
+        </div>
+      </div>
+    </div>
+  }
+  if (systemFeatures.license?.status === LicenseStatus.INACTIVE) {
+    return <div className='mx-auto mt-8 w-full'>
+      <div className='relative'>
+        <div className="rounded-lg bg-gradient-to-r from-workflow-workflow-progress-bg-1 to-workflow-workflow-progress-bg-2 p-4">
+          <div className='shadows-shadow-lg relative mb-2 flex h-10 w-10 items-center justify-center rounded-xl bg-components-card-bg shadow'>
+            <RiContractLine className='h-5 w-5' />
+            <RiErrorWarningFill className='absolute -right-1 -top-1 h-4 w-4 text-text-warning-secondary' />
+          </div>
+          <p className='system-sm-medium text-text-primary'>{t('login.licenseInactive')}</p>
+          <p className='system-xs-regular mt-1 text-text-tertiary'>{t('login.licenseInactiveTip')}</p>
+        </div>
+      </div>
+    </div>
+  }
+
+  return (
+    <>
+      <div className="mx-auto mt-8 w-full">
+        {isInviteLink
+          ? <div className="mx-auto w-full">
+            <h2 className="title-4xl-semi-bold text-text-primary">{t('login.join')}{workspaceName}</h2>
+            <p className='body-md-regular mt-2 text-text-tertiary'>{t('login.joinTipStart')}{workspaceName}{t('login.joinTipEnd')}</p>
+          </div>
+          : <div className="mx-auto w-full">
+            <h2 className="title-4xl-semi-bold text-text-primary">{t('login.pageTitle')}</h2>
+            <p className='body-md-regular mt-2 text-text-tertiary'>{t('login.welcome')}</p>
+          </div>}
+        <div className="relative">
+          <div className="mt-6 flex flex-col gap-3">
+            {systemFeatures.enable_social_oauth_login && <SocialAuth />}
+            {systemFeatures.sso_enforced_for_signin && <div className='w-full'>
+              <SSOAuth protocol={systemFeatures.sso_enforced_for_signin_protocol} />
+            </div>}
+          </div>
+
+          {showORLine && <div className="relative mt-6">
+            <div className="absolute inset-0 flex items-center" aria-hidden="true">
+              <div className='h-px w-full bg-gradient-to-r from-background-gradient-mask-transparent via-divider-regular to-background-gradient-mask-transparent'></div>
+            </div>
+            <div className="relative flex justify-center">
+              <span className="system-xs-medium-uppercase px-2 text-text-tertiary">{t('login.or')}</span>
+            </div>
+          </div>}
+          {
+            (systemFeatures.enable_email_code_login || systemFeatures.enable_email_password_login) && <>
+              {systemFeatures.enable_email_code_login && authType === 'code' && <>
+                <MailAndCodeAuth isInvite={isInviteLink} />
+                {systemFeatures.enable_email_password_login && <div className='cursor-pointer py-1 text-center' onClick={() => { updateAuthType('password') }}>
+                  <span className='system-xs-medium text-components-button-secondary-accent-text'>{t('login.usePassword')}</span>
+                </div>}
+              </>}
+              {systemFeatures.enable_email_password_login && authType === 'password' && <>
+                <MailAndPasswordAuth isInvite={isInviteLink} isEmailSetup={systemFeatures.is_email_setup} allowRegistration={systemFeatures.is_allow_register} />
+                {systemFeatures.enable_email_code_login && <div className='cursor-pointer py-1 text-center' onClick={() => { updateAuthType('code') }}>
+                  <span className='system-xs-medium text-components-button-secondary-accent-text'>{t('login.useVerificationCode')}</span>
+                </div>}
+              </>}
+            </>
+          }
+          {allMethodsAreDisabled && <>
+            <div className="rounded-lg bg-gradient-to-r from-workflow-workflow-progress-bg-1 to-workflow-workflow-progress-bg-2 p-4">
+              <div className='shadows-shadow-lg mb-2 flex h-10 w-10 items-center justify-center rounded-xl bg-components-card-bg shadow'>
+                <RiDoorLockLine className='h-5 w-5' />
+              </div>
+              <p className='system-sm-medium text-text-primary'>{t('login.noLoginMethod')}</p>
+              <p className='system-xs-regular mt-1 text-text-tertiary'>{t('login.noLoginMethodTip')}</p>
+            </div>
+            <div className="relative my-2 py-2">
+              <div className="absolute inset-0 flex items-center" aria-hidden="true">
+                <div className='h-px w-full bg-gradient-to-r from-background-gradient-mask-transparent via-divider-regular to-background-gradient-mask-transparent'></div>
+              </div>
+            </div>
+          </>}
+          <div className="system-xs-regular mt-2 block w-full text-text-tertiary">
+            {t('login.tosDesc')}
+            &nbsp;
+            <Link
+              className='system-xs-medium text-text-secondary hover:underline'
+              target='_blank' rel='noopener noreferrer'
+              href='https://dify.ai/terms'
+            >{t('login.tos')}</Link>
+            &nbsp;&&nbsp;
+            <Link
+              className='system-xs-medium text-text-secondary hover:underline'
+              target='_blank' rel='noopener noreferrer'
+              href='https://dify.ai/privacy'
+            >{t('login.pp')}</Link>
+          </div>
+          {IS_CE_EDITION && <div className="w-hull system-xs-regular mt-2 block text-text-tertiary">
+            {t('login.goToInit')}
+            &nbsp;
+            <Link
+              className='system-xs-medium text-text-secondary hover:underline'
+              href='/install'
+            >{t('login.setAdminAccount')}</Link>
+          </div>}
+
+        </div>
+      </div>
+    </>
+  )
+}
+
+export default NormalForm
diff --git a/app/signin/oneMoreStep.tsx b/app/signin/oneMoreStep.tsx
new file mode 100644
index 0000000..7a326a1
--- /dev/null
+++ b/app/signin/oneMoreStep.tsx
@@ -0,0 +1,176 @@
+'use client'
+import React, { type Reducer, useEffect, useReducer } from 'react'
+import { useTranslation } from 'react-i18next'
+import Link from 'next/link'
+import useSWR from 'swr'
+import { useRouter, useSearchParams } from 'next/navigation'
+import Input from '../components/base/input'
+import Button from '@/app/components/base/button'
+import Tooltip from '@/app/components/base/tooltip'
+import { SimpleSelect } from '@/app/components/base/select'
+import { timezones } from '@/utils/timezone'
+import { LanguagesSupported, languages } from '@/i18n/language'
+import { oneMoreStep } from '@/service/common'
+import Toast from '@/app/components/base/toast'
+
+type IState = {
+  formState: 'processing' | 'error' | 'success' | 'initial'
+  invitation_code: string
+  interface_language: string
+  timezone: string
+}
+
+type IAction =
+  | { type: 'failed', payload: null }
+  | { type: 'invitation_code', value: string }
+  | { type: 'interface_language', value: string }
+  | { type: 'timezone', value: string }
+  | { type: 'formState', value: 'processing' }
+
+const reducer: Reducer<IState, IAction> = (state: IState, action: IAction) => {
+  switch (action.type) {
+    case 'invitation_code':
+      return { ...state, invitation_code: action.value }
+    case 'interface_language':
+      return { ...state, interface_language: action.value }
+    case 'timezone':
+      return { ...state, timezone: action.value }
+    case 'formState':
+      return { ...state, formState: action.value }
+    case 'failed':
+      return {
+        formState: 'initial',
+        invitation_code: '',
+        interface_language: 'en-US',
+        timezone: 'Asia/Shanghai',
+      }
+    default:
+      throw new Error('Unknown action.')
+  }
+}
+
+const OneMoreStep = () => {
+  const { t } = useTranslation()
+  const router = useRouter()
+  const searchParams = useSearchParams()
+
+  const [state, dispatch] = useReducer(reducer, {
+    formState: 'initial',
+    invitation_code: searchParams.get('invitation_code') || '',
+    interface_language: 'en-US',
+    timezone: 'Asia/Shanghai',
+  })
+  const { data, error } = useSWR(state.formState === 'processing'
+    ? {
+      url: '/account/init',
+      body: {
+        invitation_code: state.invitation_code,
+        interface_language: state.interface_language,
+        timezone: state.timezone,
+      },
+    }
+    : null, oneMoreStep)
+
+  useEffect(() => {
+    if (error && error.status === 400) {
+      Toast.notify({ type: 'error', message: t('login.invalidInvitationCode') })
+      dispatch({ type: 'failed', payload: null })
+    }
+    if (data)
+      router.push('/apps')
+  }, [data, error])
+
+  return (
+    <>
+      <div className="mx-auto w-full">
+        <h2 className="title-4xl-semi-bold text-text-secondary">{t('login.oneMoreStep')}</h2>
+        <p className='body-md-regular mt-1 text-text-tertiary'>{t('login.createSample')}</p>
+      </div>
+
+      <div className="mx-auto mt-6 w-full">
+        <div className="relative">
+          <div className="mb-5">
+            <label className="system-md-semibold my-2 flex items-center justify-between text-text-secondary">
+              {t('login.invitationCode')}
+              <Tooltip
+                popupContent={
+                  <div className='w-[256px] text-xs font-medium'>
+                    <div className='font-medium'>{t('login.sendUsMail')}</div>
+                    <div className='cursor-pointer text-xs font-medium text-text-accent-secondary'>
+                      <a href="mailto:request-invitation@langgenius.ai">request-invitation@langgenius.ai</a>
+                    </div>
+                  </div>
+                }
+                needsDelay
+              >
+                <span className='cursor-pointer text-text-accent-secondary'>{t('login.dontHave')}</span>
+              </Tooltip>
+            </label>
+            <div className="mt-1">
+              <Input
+                id="invitation_code"
+                value={state.invitation_code}
+                type="text"
+                placeholder={t('login.invitationCodePlaceholder') || ''}
+                onChange={(e) => {
+                  dispatch({ type: 'invitation_code', value: e.target.value.trim() })
+                }}
+              />
+            </div>
+          </div>
+          <div className='mb-5'>
+            <label htmlFor="name" className="system-md-semibold my-2 text-text-secondary">
+              {t('login.interfaceLanguage')}
+            </label>
+            <div className="mt-1">
+              <SimpleSelect
+                defaultValue={LanguagesSupported[0]}
+                items={languages.filter(item => item.supported)}
+                onSelect={(item) => {
+                  dispatch({ type: 'interface_language', value: item.value as typeof LanguagesSupported[number] })
+                }}
+              />
+            </div>
+          </div>
+          <div className='mb-4'>
+            <label htmlFor="timezone" className="system-md-semibold text-text-tertiary">
+              {t('login.timezone')}
+            </label>
+            <div className="mt-1">
+              <SimpleSelect
+                defaultValue={state.timezone}
+                items={timezones}
+                onSelect={(item) => {
+                  dispatch({ type: 'timezone', value: item.value as typeof state.timezone })
+                }}
+              />
+            </div>
+          </div>
+          <div>
+            <Button
+              variant='primary'
+              className='w-full'
+              disabled={state.formState === 'processing'}
+              onClick={() => {
+                dispatch({ type: 'formState', value: 'processing' })
+              }}
+            >
+              {t('login.go')}
+            </Button>
+          </div>
+          <div className="system-xs-regular mt-2 block w-full text-text-tertiary">
+            {t('login.license.tip')}
+            &nbsp;
+            <Link
+              className='system-xs-medium text-text-accent-secondary'
+              target='_blank' rel='noopener noreferrer'
+              href={'https://docs.dify.ai/en/policies/agreement/README'}
+            >{t('login.license.link')}</Link>
+          </div>
+        </div>
+      </div>
+    </>
+  )
+}
+
+export default OneMoreStep
diff --git a/app/signin/page.module.css b/app/signin/page.module.css
new file mode 100644
index 0000000..eda396f
--- /dev/null
+++ b/app/signin/page.module.css
@@ -0,0 +1,7 @@
+.githubIcon {
+  background: center/contain url('./assets/github.svg');
+}
+
+.googleIcon {
+  background: center/contain url('./assets/google.svg');
+}
diff --git a/app/signin/page.tsx b/app/signin/page.tsx
new file mode 100644
index 0000000..f2ef17c
--- /dev/null
+++ b/app/signin/page.tsx
@@ -0,0 +1,15 @@
+'use client'
+import { useSearchParams } from 'next/navigation'
+import OneMoreStep from './oneMoreStep'
+import NormalForm from './normalForm'
+
+const SignIn = () => {
+  const searchParams = useSearchParams()
+  const step = searchParams.get('step')
+
+  if (step === 'next')
+    return <OneMoreStep />
+  return <NormalForm />
+}
+
+export default SignIn
diff --git a/app/styles/globals.css b/app/styles/globals.css
new file mode 100644
index 0000000..52e36a2
--- /dev/null
+++ b/app/styles/globals.css
@@ -0,0 +1,700 @@
+@import "preflight.css";
+@tailwind base;
+@tailwind components;
+
+@import '../../themes/light.css';
+@import '../../themes/dark.css';
+@import "../../themes/manual-light.css";
+@import "../../themes/manual-dark.css";
+
+html {
+  color-scheme: light;
+}
+
+html[data-theme='dark'] {
+  color-scheme: dark;
+}
+
+html[data-changing-theme] * {
+  transition: none !important;
+}
+
+:root {
+  --max-width: 1100px;
+  --border-radius: 12px;
+  --font-mono: ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono",
+    "Roboto Mono", "Oxygen Mono", "Ubuntu Monospace", "Source Code Pro",
+    "Fira Mono", "Droid Sans Mono", "Courier New", monospace;
+
+  --foreground-rgb: 0, 0, 0;
+  --background-start-rgb: 214, 219, 220;
+  --background-end-rgb: 255, 255, 255;
+
+  --primary-glow: conic-gradient(from 180deg at 50% 50%,
+      #16abff33 0deg,
+      #0885ff33 55deg,
+      #54d6ff33 120deg,
+      #0071ff33 160deg,
+      transparent 360deg);
+  --secondary-glow: radial-gradient(rgba(255, 255, 255, 1),
+      rgba(255, 255, 255, 0));
+
+  --tile-start-rgb: 239, 245, 249;
+  --tile-end-rgb: 228, 232, 233;
+  --tile-border: conic-gradient(#00000080,
+      #00000040,
+      #00000030,
+      #00000020,
+      #00000010,
+      #00000010,
+      #00000080);
+
+  --callout-rgb: 238, 240, 241;
+  --callout-border-rgb: 172, 175, 176;
+  --card-rgb: 180, 185, 188;
+  --card-border-rgb: 131, 134, 135;
+}
+
+/* @media (prefers-color-scheme: dark) {
+  :root {
+    --foreground-rgb: 255, 255, 255;
+    --background-start-rgb: 0, 0, 0;
+    --background-end-rgb: 0, 0, 0;
+
+    --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0));
+    --secondary-glow: linear-gradient(to bottom right,
+        rgba(1, 65, 255, 0),
+        rgba(1, 65, 255, 0),
+        rgba(1, 65, 255, 0.3));
+
+    --tile-start-rgb: 2, 13, 46;
+    --tile-end-rgb: 2, 5, 19;
+    --tile-border: conic-gradient(#ffffff80,
+        #ffffff40,
+        #ffffff30,
+        #ffffff20,
+        #ffffff10,
+        #ffffff10,
+        #ffffff80);
+
+    --callout-rgb: 20, 20, 20;
+    --callout-border-rgb: 108, 108, 108;
+    --card-rgb: 100, 100, 100;
+    --card-border-rgb: 200, 200, 200;
+  }
+} */
+
+* {
+  box-sizing: border-box;
+  padding: 0;
+  margin: 0;
+}
+
+html,
+body {
+  max-width: 100vw;
+  overflow: hidden;
+}
+
+body {
+  color: rgb(var(--foreground-rgb));
+  user-select: none;
+  /* background: linear-gradient(
+      to bottom,
+      transparent,
+      rgb(var(--background-end-rgb))
+    )
+    rgb(var(--background-start-rgb)); */
+}
+
+a {
+  color: inherit;
+  text-decoration: none;
+  outline: none;
+}
+
+button:focus-within {
+  outline: none;
+}
+
+/* @media (prefers-color-scheme: dark) {
+  html {
+    color-scheme: dark;
+  }
+} */
+
+/* CSS Utils */
+.h1 {
+  padding-bottom: 1.5rem;
+  line-height: 1.5;
+  font-size: 1.125rem;
+  color: #111928;
+}
+
+.h2 {
+  font-size: 14px;
+  font-weight: 500;
+  color: #111928;
+  line-height: 1.5;
+}
+
+/* font define start */
+.system-kbd {
+  font-size: 12px;
+  font-weight: 500;
+  line-height: 16px;
+}
+
+.system-2xs-regular-uppercase {
+  font-size: 10px;
+  font-weight: 400;
+  text-transform: uppercase;
+  line-height: 12px;
+}
+
+.system-2xs-regular {
+  font-size: 10px;
+  font-weight: 400;
+  line-height: 12px;
+}
+
+.system-2xs-medium {
+  font-size: 10px;
+  font-weight: 500;
+  line-height: 12px;
+}
+
+.system-2xs-medium-uppercase {
+  font-size: 10px;
+  font-weight: 500;
+  text-transform: uppercase;
+  line-height: 12px;
+}
+
+.system-2xs-semibold-uppercase {
+  font-size: 10px;
+  font-weight: 600;
+  text-transform: uppercase;
+  line-height: 12px;
+}
+
+.system-xs-regular {
+  font-size: 12px;
+  font-weight: 400;
+  line-height: 16px;
+}
+
+.system-xs-regular-uppercase {
+  font-size: 12px;
+  font-weight: 400;
+  text-transform: uppercase;
+  line-height: 16px;
+}
+
+.system-xs-medium {
+  font-size: 12px;
+  font-weight: 500;
+  line-height: 16px;
+}
+
+.system-xs-medium-uppercase {
+  font-size: 12px;
+  font-weight: 500;
+  text-transform: uppercase;
+  line-height: 16px;
+}
+
+.system-xs-semibold {
+  font-size: 12px;
+  font-weight: 600;
+  line-height: 16px;
+}
+
+.system-xs-semibold-uppercase {
+  font-size: 12px;
+  font-weight: 600;
+  text-transform: uppercase;
+  line-height: 16px;
+}
+
+.system-sm-regular {
+  font-size: 13px;
+  font-weight: 400;
+  line-height: 16px;
+}
+
+.system-sm-medium {
+  font-size: 13px;
+  font-weight: 500;
+  line-height: 16px;
+}
+
+.system-sm-medium-uppercase {
+  font-size: 13px;
+  font-weight: 500;
+  text-transform: uppercase;
+  line-height: 16px;
+}
+
+.system-sm-semibold {
+  font-size: 13px;
+  font-weight: 600;
+  line-height: 16px;
+}
+
+.system-sm-semibold-uppercase {
+  font-size: 13px;
+  font-weight: 600;
+  text-transform: uppercase;
+  line-height: 16px;
+}
+
+.system-md-regular {
+  font-size: 14px;
+  font-weight: 400;
+  line-height: 20px;
+}
+
+.system-md-medium {
+  font-size: 14px;
+  font-weight: 500;
+  line-height: 20px;
+}
+
+.system-md-semibold {
+  font-size: 14px;
+  font-weight: 600;
+  line-height: 20px;
+}
+
+.system-md-semibold-uppercase {
+  font-size: 14px;
+  font-weight: 600;
+  text-transform: uppercase;
+  line-height: 20px;
+}
+
+.system-xl-regular {
+  font-size: 16px;
+  font-weight: 400;
+  line-height: 24px;
+}
+
+.system-xl-medium {
+  font-size: 16px;
+  font-weight: 500;
+  line-height: 24px;
+}
+
+.system-xl-semibold {
+  font-size: 16px;
+  font-weight: 600;
+  line-height: 24px;
+}
+
+[class*="code-"] {
+  @apply font-mono;
+}
+
+.code-xs-regular {
+  font-size: 12px;
+  font-weight: 400;
+  line-height: 1.5;
+}
+
+.code-xs-semibold {
+  font-size: 12px;
+  font-weight: 600;
+  line-height: 1.5;
+}
+
+.code-sm-regular {
+  font-size: 13px;
+  font-weight: 400;
+  line-height: 1.5;
+}
+
+.code-sm-semibold {
+  font-size: 13px;
+  font-weight: 600;
+  line-height: 1.5;
+}
+
+.code-md-regular {
+  font-size: 14px;
+  font-weight: 400;
+  line-height: 1.5;
+}
+
+.code-md-semibold {
+  font-size: 14px;
+  font-weight: 600;
+  line-height: 1.5;
+}
+
+.body-xs-light {
+  font-size: 12px;
+  font-weight: 300;
+  line-height: 16px;
+}
+
+.body-xs-regular {
+  font-size: 12px;
+  font-weight: 400;
+  line-height: 16px;
+}
+
+.body-xs-medium {
+  font-size: 12px;
+  font-weight: 500;
+  line-height: 16px;
+}
+
+.body-sm-light {
+  font-size: 13px;
+  font-weight: 300;
+  line-height: 16px;
+}
+
+.body-sm-regular {
+  font-size: 13px;
+  font-weight: 400;
+  line-height: 16px;
+}
+
+.body-sm-medium {
+  font-size: 13px;
+  font-weight: 500;
+  line-height: 16px;
+}
+
+.body-md-light {
+  font-size: 14px;
+  font-weight: 300;
+  line-height: 20px;
+}
+
+.body-md-regular {
+  font-size: 14px;
+  font-weight: 400;
+  line-height: 20px;
+}
+
+.body-md-medium {
+  font-size: 14px;
+  font-weight: 500;
+  line-height: 20px;
+}
+
+.body-lg-light {
+  font-size: 15px;
+  font-weight: 300;
+  line-height: 20px;
+}
+
+.body-lg-regular {
+  font-size: 15px;
+  font-weight: 400;
+  line-height: 20px;
+}
+
+.body-lg-medium {
+  font-size: 15px;
+  font-weight: 500;
+  line-height: 20px;
+}
+
+.body-xl-regular {
+  font-size: 16px;
+  font-weight: 400;
+  line-height: 24px;
+}
+
+.body-xl-medium {
+  font-size: 16px;
+  font-weight: 500;
+  line-height: 24px;
+}
+
+.body-xl-light {
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 24px;
+}
+
+.body-2xl-light {
+  font-size: 18px;
+  font-weight: 300;
+  line-height: 1.5;
+}
+
+.body-2xl-regular {
+  font-size: 18px;
+  font-weight: 400;
+  line-height: 1.5;
+}
+
+.body-2xl-medium {
+  font-size: 18px;
+  font-weight: 500;
+  line-height: 1.5;
+}
+
+.title-xs-semi-bold {
+  font-size: 12px;
+  font-weight: 600;
+  line-height: 16px;
+}
+
+.title-xs-bold {
+  font-size: 12px;
+  font-weight: 700;
+  line-height: 16px;
+}
+
+.title-sm-semi-bold {
+  font-size: 13px;
+  font-weight: 600;
+  line-height: 16px;
+}
+
+.title-sm-bold {
+  font-size: 13px;
+  font-weight: 700;
+  line-height: 16px;
+}
+
+.title-md-semi-bold {
+  font-size: 14px;
+  font-weight: 600;
+  line-height: 20px;
+}
+
+.title-md-bold {
+  font-size: 14px;
+  font-weight: 700;
+  line-height: 20px;
+}
+
+.title-lg-semi-bold {
+  font-size: 15px;
+  font-weight: 600;
+  line-height: 1.2;
+}
+
+.title-lg-bold {
+  font-size: 15px;
+  font-weight: 700;
+  line-height: 1.2;
+}
+
+.title-xl-semi-bold {
+  font-size: 16px;
+  font-weight: 600;
+  line-height: 1.2;
+}
+
+.title-xl-bold {
+  font-size: 16px;
+  font-weight: 700;
+  line-height: 1.2;
+}
+
+.title-2xl-semi-bold {
+  font-size: 18px;
+  font-weight: 600;
+  line-height: 1.2;
+}
+
+.title-2xl-bold {
+  font-size: 18px;
+  font-weight: 700;
+  line-height: 1.2;
+}
+
+.title-3xl-semi-bold {
+  font-size: 20px;
+  font-weight: 600;
+  line-height: 1.2;
+}
+
+.title-3xl-bold {
+  font-size: 20px;
+  font-weight: 700;
+  line-height: 1.2;
+}
+
+.title-4xl-semi-bold {
+  font-size: 24px;
+  font-weight: 600;
+  line-height: 1.2;
+}
+
+.title-4xl-bold {
+  font-size: 24px;
+  font-weight: 700;
+  line-height: 1.2;
+}
+
+.title-5xl-semi-bold {
+  font-size: 30px;
+  font-weight: 600;
+  line-height: 1.2;
+}
+
+.title-5xl-bold {
+  font-size: 30px;
+  font-weight: 700;
+  line-height: 1.2;
+}
+
+.title-6xl-semi-bold {
+  font-size: 36px;
+  font-weight: 600;
+  line-height: 1.2;
+}
+
+.title-6xl-bold {
+  font-size: 36px;
+  font-weight: 700;
+  line-height: 1.2;
+}
+
+.title-7xl-semi-bold {
+  font-size: 48px;
+  font-weight: 600;
+  line-height: 1.2;
+}
+
+.title-7xl-bold {
+  font-size: 48px;
+  font-weight: 700;
+  line-height: 1.2;
+}
+
+.title-8xl-semi-bold {
+  font-size: 60px;
+  font-weight: 600;
+  line-height: 1.2;
+}
+
+.title-8xl-bold {
+  font-size: 60px;
+  font-weight: 700;
+  line-height: 1.2;
+}
+
+/* font define end */
+
+/* border radius start */
+.radius-2xs {
+  border-radius: 2px;
+}
+
+.radius-xs {
+  border-radius: 4px;
+}
+
+.radius-sm {
+  border-radius: 6px;
+}
+
+.radius-md {
+  border-radius: 8px;
+}
+
+.radius-lg {
+  border-radius: 10px;
+}
+
+.radius-xl {
+  border-radius: 12px;
+}
+
+.radius-2xl {
+  border-radius: 16px;
+}
+
+.radius-3xl {
+  border-radius: 20px;
+}
+
+.radius-4xl {
+  border-radius: 24px;
+}
+
+.radius-5xl {
+  border-radius: 24px;
+}
+
+.radius-6xl {
+  border-radius: 28px;
+}
+
+.radius-7xl {
+  border-radius: 32px;
+}
+
+.radius-8xl {
+  border-radius: 40px;
+}
+
+.radius-9xl {
+  border-radius: 48px;
+}
+
+.radius-full {
+  border-radius: 64px;
+}
+
+/* border radius end */
+
+.link {
+  @apply text-blue-600 cursor-pointer hover:opacity-80 transition-opacity duration-200 ease-in-out;
+}
+
+.text-gradient {
+  background: linear-gradient(91.58deg, #2250f2 -29.55%, #0ebcf3 75.22%);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+  text-fill-color: transparent;
+}
+
+/* overwrite paging active dark model style  */
+[class*="style_paginatio"] li .text-primary-600 {
+  color: rgb(28 100 242);
+  background-color: rgb(235 245 255);
+}
+
+/* support safari 14 and below */
+.inset-0 {
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+}
+
+[data-theme="dark"] [data-hide-on-theme="dark"],
+[data-theme="light"] [data-hide-on-theme="light"] {
+  display: none;
+}
+
+@import "../components/base/button/index.css";
+@import "../components/base/action-button/index.css";
+@import "../components/base/modal/index.css";
+
+@tailwind utilities;
+
+@layer utilities {
+  /* Hide scrollbar for Chrome, Safari and Opera */
+  .no-scrollbar::-webkit-scrollbar {
+    display: none;
+  }
+
+  /* Hide scrollbar for IE, Edge and Firefox */
+  .no-scrollbar {
+    -ms-overflow-style: none;
+    scrollbar-width: none;
+  }
+}
diff --git a/app/styles/markdown.scss b/app/styles/markdown.scss
new file mode 100644
index 0000000..bd9c734
--- /dev/null
+++ b/app/styles/markdown.scss
@@ -0,0 +1,1044 @@
+@use '../../themes/light';
+@use '../../themes/dark';
+@use '../../themes/markdown-light';
+@use '../../themes/markdown-dark';
+
+.markdown-body {
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%;
+  margin: 0;
+  color: var(--color-text-primary);
+  background-color: var(--color-canvas-default);
+  font-size: 15px;
+  font-weight: 400;
+  line-height: 1.6;
+  word-wrap: break-word;
+  word-break: break-word;
+  user-select: text;
+}
+
+.markdown-body .octicon {
+  display: inline-block;
+  fill: currentColor;
+  vertical-align: text-bottom;
+}
+
+.markdown-body h1:hover .anchor .octicon-link:before,
+.markdown-body h2:hover .anchor .octicon-link:before,
+.markdown-body h3:hover .anchor .octicon-link:before,
+.markdown-body h4:hover .anchor .octicon-link:before,
+.markdown-body h5:hover .anchor .octicon-link:before,
+.markdown-body h6:hover .anchor .octicon-link:before {
+  width: 16px;
+  height: 16px;
+  content: " ";
+  display: inline-block;
+  background-color: currentColor;
+  -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>");
+  mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>");
+}
+
+.markdown-body details,
+.markdown-body figcaption,
+.markdown-body figure {
+  display: block;
+}
+
+.markdown-body summary {
+  display: list-item;
+}
+
+.markdown-body [hidden] {
+  display: none !important;
+}
+
+.markdown-body a {
+  background-color: transparent;
+  color: var(--color-text-accent);
+  text-decoration: none;
+  text-decoration-color: var(--color-text-accent);
+}
+
+.markdown-body a:hover {
+  position: relative;
+  color: var(--color-text-accent-secondary);
+  text-decoration-color: var(--color-text-accent-secondary);
+  text-decoration: underline;
+}
+
+.markdown-body abbr[title] {
+  position: relative;
+  border-bottom: none;
+  text-decoration: underline dotted;
+  text-decoration-color: var(--color-text-accent);
+}
+
+.markdown-body abbr[title]:hover::after {
+  @apply shadow-xl shadow-shadow-shadow-5 rounded-md;
+  position: absolute;
+  bottom: 100%;
+  left: 0;
+  display: block;
+  width: max-content;
+  content: attr(title);
+  padding: 6px;
+  font-size: 12px;
+  line-height: 1;
+  color: var(--color-text-secondary);
+  border: 0.5px solid var(--color-components-panel-border);
+  background-color: var(--color-components-tooltip-bg);
+}
+
+.markdown-body b,
+.markdown-body strong {
+  font-weight: var(--base-text-weight-bold, 700);
+}
+
+.markdown-body dfn {
+  font-style: italic;
+}
+
+.markdown-body mark {
+  background-color: var(--color-attention-subtle);
+  color: var(--color-fg-default);
+}
+
+.markdown-body small {
+  font-size: 90%;
+}
+
+.markdown-body sub,
+.markdown-body sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+
+.markdown-body sub {
+  bottom: -0.25em;
+}
+
+.markdown-body sup {
+  top: -0.5em;
+}
+
+.markdown-body figure {
+  margin: 1em 40px;
+}
+
+.markdown-body img {
+  max-width: 100%;
+  box-sizing: content-box;
+  border: 2px solid var(--color-effects-image-frame);
+  border-radius: 0;
+  background-color: var(--color-canvas-default);
+}
+
+.markdown-body code,
+.markdown-body kbd,
+.markdown-body pre,
+.markdown-body samp {
+  font-family: monospace;
+  font-size: 1em;
+}
+
+.markdown-body hr {
+  margin: 24px 0;
+}
+
+.markdown-body hr::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body hr::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body input {
+  font: inherit;
+  margin: 0;
+  overflow: visible;
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+
+.markdown-body [type="button"],
+.markdown-body [type="reset"],
+.markdown-body [type="submit"] {
+  -webkit-appearance: button;
+}
+.markdown-body [type="checkbox"],
+.markdown-body [type="radio"] {
+  box-sizing: border-box;
+  padding: 0;
+}
+.markdown-body [type="number"]::-webkit-inner-spin-button,
+.markdown-body [type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+
+.markdown-body [type="search"]::-webkit-search-cancel-button,
+.markdown-body [type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+.markdown-body ::-webkit-input-placeholder {
+  color: inherit;
+  opacity: 0.54;
+}
+
+.markdown-body ::-webkit-file-upload-button {
+  -webkit-appearance: button;
+  font: inherit;
+}
+
+.markdown-body a:hover {
+  text-decoration: underline;
+}
+
+.markdown-body ::placeholder {
+  color: var(--color-fg-subtle);
+  opacity: 1;
+}
+
+
+.markdown-body table {
+  border-spacing: 0;
+  border-collapse: separate;
+  display: block;
+  width: max-content;
+  max-width: 100%;
+  overflow: auto;
+  border: 1px solid var(--color-divider-regular);
+  border-radius: 8px;
+}
+
+.markdown-body td,
+.markdown-body th {
+  padding: 0;
+}
+
+.markdown-body details summary {
+  cursor: pointer;
+}
+
+.markdown-body details:not([open])>*:not(summary) {
+  display: none !important;
+}
+
+.markdown-body a:focus,
+.markdown-body [role="button"]:focus,
+.markdown-body input[type="radio"]:focus,
+.markdown-body input[type="checkbox"]:focus {
+  outline: 2px solid var(--color-accent-fg);
+  outline-offset: -2px;
+  box-shadow: none;
+}
+
+.markdown-body a:focus:not(:focus-visible),
+.markdown-body [role="button"]:focus:not(:focus-visible),
+.markdown-body input[type="radio"]:focus:not(:focus-visible),
+.markdown-body input[type="checkbox"]:focus:not(:focus-visible) {
+  outline: solid 1px transparent;
+}
+
+.markdown-body a:focus-visible,
+.markdown-body [role="button"]:focus-visible,
+.markdown-body input[type="radio"]:focus-visible,
+.markdown-body input[type="checkbox"]:focus-visible {
+  outline: 2px solid var(--color-accent-fg);
+  outline-offset: -2px;
+  box-shadow: none;
+}
+
+.markdown-body a:not([class]):focus,
+.markdown-body a:not([class]):focus-visible,
+.markdown-body input[type="radio"]:focus,
+.markdown-body input[type="radio"]:focus-visible,
+.markdown-body input[type="checkbox"]:focus,
+.markdown-body input[type="checkbox"]:focus-visible {
+  outline-offset: 0;
+}
+
+.markdown-body kbd {
+  display: inline-block;
+  padding: 2px 6px;
+  font: 11px ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas,
+    Liberation Mono, monospace;
+  line-height: 1;
+  color: var(--color-text-primary);
+  vertical-align: middle;
+  background-color: var(--color-components-input-bg-normal);
+  border-radius: 6px;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  padding-top: 12px;
+  margin-bottom: 12px;
+  font-weight: var(--base-text-weight-semibold, 600);
+  line-height: 1.25;
+}
+
+.markdown-body h1 {
+  font-size: 18px;
+}
+
+.markdown-body h2 {
+  font-size: 16px;
+}
+
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+  font-size: 14px;
+}
+
+.markdown-body blockquote {
+  margin: 0;
+  padding: 0 12px;
+  border-left: 3px solid var(--color-text-accent-secondary);
+}
+
+.markdown-body ol {
+  list-style: decimal;
+}
+
+.markdown-body ul {
+  list-style: disc;
+}
+
+.markdown-body>ol,
+.markdown-body>ul {
+  padding: 0;
+}
+
+.markdown-body ol ol,
+.markdown-body ul ol {
+  list-style-type: lower-roman;
+}
+
+.markdown-body ul ul ol,
+.markdown-body ul ol ol,
+.markdown-body ol ul ol,
+.markdown-body ol ol ol {
+  list-style-type: lower-alpha;
+}
+
+.markdown-body dd {
+  margin-left: 0;
+}
+
+.markdown-body tt,
+.markdown-body code,
+.markdown-body samp {
+  font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas,
+    Liberation Mono, monospace;
+  font-size: 12px;
+}
+
+.markdown-body pre {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas,
+    Liberation Mono, monospace;
+  font-size: 12px;
+  word-wrap: normal;
+}
+
+.markdown-body .octicon {
+  display: inline-block;
+  overflow: visible !important;
+  vertical-align: text-bottom;
+  fill: currentColor;
+}
+
+.markdown-body input::-webkit-outer-spin-button,
+.markdown-body input::-webkit-inner-spin-button {
+  margin: 0;
+  -webkit-appearance: none;
+  appearance: none;
+}
+
+.markdown-body::before {
+  display: table;
+  content: "";
+}
+
+.markdown-body::after {
+  display: table;
+  clear: both;
+  content: "";
+}
+
+.markdown-body>*:first-child {
+  margin-top: 0 !important;
+}
+
+.markdown-body>*:last-child {
+  margin-bottom: 0 !important;
+}
+
+.markdown-body a:not([href]) {
+  color: inherit;
+  text-decoration: none;
+}
+
+.markdown-body .absent {
+  color: var(--color-danger-fg);
+}
+
+.markdown-body .anchor {
+  float: left;
+  padding-right: 4px;
+  margin-left: -20px;
+  line-height: 1;
+}
+
+.markdown-body .anchor:focus {
+  outline: none;
+}
+
+.markdown-body p,
+.markdown-body blockquote,
+.markdown-body ul,
+.markdown-body ol,
+.markdown-body dl,
+.markdown-body table,
+.markdown-body pre,
+.markdown-body details {
+  margin-top: 0;
+  margin-bottom: 12px;
+}
+
+.markdown-body ul,
+.markdown-body ol {
+  padding-left: 2em;
+}
+.markdown-body ul[role="listbox"] {
+  list-style: none !important;
+  padding-left: 0 !important;
+}
+.markdown-body blockquote> :first-child {
+  margin-top: 0;
+}
+
+.markdown-body blockquote> :last-child {
+  margin-bottom: 0;
+}
+
+.markdown-body h1 .octicon-link,
+.markdown-body h2 .octicon-link,
+.markdown-body h3 .octicon-link,
+.markdown-body h4 .octicon-link,
+.markdown-body h5 .octicon-link,
+.markdown-body h6 .octicon-link {
+  color: var(--color-fg-default);
+  vertical-align: middle;
+  visibility: hidden;
+}
+
+.markdown-body h1:hover .anchor,
+.markdown-body h2:hover .anchor,
+.markdown-body h3:hover .anchor,
+.markdown-body h4:hover .anchor,
+.markdown-body h5:hover .anchor,
+.markdown-body h6:hover .anchor {
+  text-decoration: none;
+}
+
+.markdown-body h1:hover .anchor .octicon-link,
+.markdown-body h2:hover .anchor .octicon-link,
+.markdown-body h3:hover .anchor .octicon-link,
+.markdown-body h4:hover .anchor .octicon-link,
+.markdown-body h5:hover .anchor .octicon-link,
+.markdown-body h6:hover .anchor .octicon-link {
+  visibility: visible;
+}
+
+.markdown-body h1 tt,
+.markdown-body h1 code,
+.markdown-body h2 tt,
+.markdown-body h2 code,
+.markdown-body h3 tt,
+.markdown-body h3 code,
+.markdown-body h4 tt,
+.markdown-body h4 code,
+.markdown-body h5 tt,
+.markdown-body h5 code,
+.markdown-body h6 tt,
+.markdown-body h6 code {
+  padding: 0 0.2em;
+  font-size: inherit;
+}
+
+.markdown-body summary h1,
+.markdown-body summary h2,
+.markdown-body summary h3,
+.markdown-body summary h4,
+.markdown-body summary h5,
+.markdown-body summary h6 {
+  display: inline-block;
+}
+
+.markdown-body summary h1 .anchor,
+.markdown-body summary h2 .anchor,
+.markdown-body summary h3 .anchor,
+.markdown-body summary h4 .anchor,
+.markdown-body summary h5 .anchor,
+.markdown-body summary h6 .anchor {
+  margin-left: -40px;
+}
+
+.markdown-body summary h1,
+.markdown-body summary h2 {
+  padding-bottom: 0;
+  border-bottom: 0;
+}
+
+.markdown-body ul.no-list,
+.markdown-body ol.no-list {
+  padding: 0;
+  list-style-type: none;
+}
+
+.markdown-body ol[type="a"] {
+  list-style-type: lower-alpha;
+}
+
+.markdown-body ol[type="A"] {
+  list-style-type: upper-alpha;
+}
+
+.markdown-body ol[type="i"] {
+  list-style-type: lower-roman;
+}
+
+.markdown-body ol[type="I"] {
+  list-style-type: upper-roman;
+}
+
+.markdown-body ol[type="1"] {
+  list-style-type: decimal;
+}
+
+.markdown-body div>ol:not([type]) {
+  list-style-type: decimal;
+}
+
+.markdown-body ul ul,
+.markdown-body ul ol,
+.markdown-body ol ol,
+.markdown-body ol ul {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.markdown-body li>p {
+  margin-top: 16px;
+}
+
+.markdown-body li+li {
+  margin-top: 0.25em;
+}
+
+.markdown-body dl {
+  padding: 0;
+}
+
+.markdown-body dl dt {
+  padding: 0;
+  margin-top: 16px;
+  font-size: 1em;
+  font-style: italic;
+  font-weight: var(--base-text-weight-semibold, 600);
+}
+
+.markdown-body dl dd {
+  padding: 0 16px;
+  margin-bottom: 16px;
+}
+
+.markdown-body table th {
+  color: var(--color-text-tertiary);
+  font-size: 12px;
+  font-weight: var(--base-text-weight-medium, 500);
+  white-space: nowrap;
+}
+
+.markdown-body table td {
+  color: var(--color-text-secondary);
+  font-size: 13px;
+  font-weight: var(--base-text-weight-normal, 400);
+  white-space: nowrap;
+}
+
+.markdown-body table th,
+.markdown-body table td {
+  padding: 6px 13px;
+}
+
+.markdown-body table tr>th:not(:last-child),
+.markdown-body table tr>td:not(:last-child) {
+  border-right: 1px solid var(--color-divider-subtle);
+}
+
+.markdown-body table tbody tr:first-child td {
+  border-top: 1px solid var(--color-divider-regular);
+}
+
+.markdown-body table tbody tr:not(:last-child) td {
+  border-bottom: 1px solid var(--color-divider-subtle);
+}
+
+.markdown-body table img {
+  background-color: transparent;
+}
+
+.markdown-body img[align="right"] {
+  padding-left: 20px;
+}
+
+.markdown-body img[align="left"] {
+  padding-right: 20px;
+}
+
+.markdown-body .emoji {
+  max-width: none;
+  vertical-align: text-top;
+  background-color: transparent;
+}
+
+.markdown-body span.frame {
+  display: block;
+  overflow: hidden;
+}
+
+.markdown-body span.frame>span {
+  display: block;
+  float: left;
+  width: auto;
+  padding: 7px;
+  margin: 13px 0 0;
+  overflow: hidden;
+  border: 1px solid var(--color-border-default);
+}
+
+.markdown-body span.frame span img {
+  display: block;
+  float: left;
+}
+
+.markdown-body span.frame span span {
+  display: block;
+  padding: 5px 0 0;
+  clear: both;
+  color: var(--color-fg-default);
+}
+
+.markdown-body span.align-center {
+  display: block;
+  overflow: hidden;
+  clear: both;
+}
+
+.markdown-body span.align-center>span {
+  display: block;
+  margin: 13px auto 0;
+  overflow: hidden;
+  text-align: center;
+}
+
+.markdown-body span.align-center span img {
+  margin: 0 auto;
+  text-align: center;
+}
+
+.markdown-body span.align-right {
+  display: block;
+  overflow: hidden;
+  clear: both;
+}
+
+.markdown-body span.align-right>span {
+  display: block;
+  margin: 13px 0 0;
+  overflow: hidden;
+  text-align: right;
+}
+
+.markdown-body span.align-right span img {
+  margin: 0;
+  text-align: right;
+}
+
+.markdown-body span.float-left {
+  display: block;
+  float: left;
+  margin-right: 13px;
+  overflow: hidden;
+}
+
+.markdown-body span.float-left span {
+  margin: 13px 0 0;
+}
+
+.markdown-body span.float-right {
+  display: block;
+  float: right;
+  margin-left: 13px;
+  overflow: hidden;
+}
+
+.markdown-body span.float-right>span {
+  display: block;
+  margin: 13px auto 0;
+  overflow: hidden;
+  text-align: right;
+}
+
+.markdown-body code,
+.markdown-body tt {
+  padding: 0.2em 0.4em;
+  margin: 0;
+  font-size: 85%;
+  white-space: break-spaces;
+  background-color: var(--color-neutral-muted);
+  border-radius: 6px;
+}
+
+.markdown-body code br,
+.markdown-body tt br {
+  display: none;
+}
+
+.markdown-body del code {
+  text-decoration: inherit;
+}
+
+.markdown-body samp {
+  font-size: 85%;
+}
+
+.markdown-body pre code {
+  font-size: 100%;
+  white-space: pre-wrap !important;
+}
+
+.markdown-body pre>code {
+  padding: 0;
+  margin: 0;
+  word-break: normal;
+  white-space: pre-wrap;
+  background: transparent;
+  border: 0;
+}
+
+.markdown-body .highlight {
+  margin-bottom: 16px;
+}
+
+.markdown-body .highlight pre {
+  margin-bottom: 0;
+  word-break: normal;
+}
+
+.markdown-body .highlight pre,
+.markdown-body pre {
+  padding: 16px;
+  background-color: transparent;
+  overflow: auto;
+  font-size: 85%;
+  line-height: 1.45;
+}
+
+.markdown-body pre {
+  padding: 0;
+}
+
+.markdown-body pre code,
+.markdown-body pre tt {
+  display: inline-block;
+  max-width: 100%;
+  padding: 0;
+  margin: 0;
+  overflow-x: auto;
+  line-height: inherit;
+  word-wrap: normal;
+  background-color: transparent;
+  border: 0;
+}
+
+.markdown-body .csv-data td,
+.markdown-body .csv-data th {
+  padding: 5px;
+  overflow: hidden;
+  font-size: 12px;
+  line-height: 1;
+  text-align: left;
+  white-space: nowrap;
+}
+
+.markdown-body .csv-data .blob-num {
+  padding: 10px 8px 9px;
+  text-align: right;
+  background: var(--color-canvas-default);
+  border: 0;
+}
+
+.markdown-body .csv-data tr {
+  border-top: 0;
+}
+
+.markdown-body .csv-data th {
+  font-weight: var(--base-text-weight-semibold, 600);
+  background: var(--color-canvas-subtle);
+  border-top: 0;
+}
+
+.markdown-body [data-footnote-ref]::before {
+  content: "[";
+}
+
+.markdown-body [data-footnote-ref]::after {
+  content: "]";
+}
+
+.markdown-body .footnotes {
+  font-size: 12px;
+  color: var(--color-fg-muted);
+  border-top: 1px solid var(--color-border-default);
+}
+
+.markdown-body .footnotes ol {
+  padding-left: 16px;
+}
+
+.markdown-body .footnotes ol ul {
+  display: inline-block;
+  padding-left: 16px;
+  margin-top: 16px;
+}
+
+.markdown-body .footnotes li {
+  position: relative;
+}
+
+.markdown-body .footnotes li:target::before {
+  position: absolute;
+  top: -8px;
+  right: -8px;
+  bottom: -8px;
+  left: -24px;
+  pointer-events: none;
+  content: "";
+  border: 2px solid var(--color-accent-emphasis);
+  border-radius: 6px;
+}
+
+.markdown-body .footnotes li:target {
+  color: var(--color-fg-default);
+}
+
+.markdown-body .footnotes .data-footnote-backref g-emoji {
+  font-family: monospace;
+}
+
+.markdown-body .pl-c {
+  color: var(--color-prettylights-syntax-comment);
+}
+
+.markdown-body .pl-c1,
+.markdown-body .pl-s .pl-v {
+  color: var(--color-prettylights-syntax-constant);
+}
+
+.markdown-body .pl-e,
+.markdown-body .pl-en {
+  color: var(--color-prettylights-syntax-entity);
+}
+
+.markdown-body .pl-smi,
+.markdown-body .pl-s .pl-s1 {
+  color: var(--color-prettylights-syntax-storage-modifier-import);
+}
+
+.markdown-body .pl-ent {
+  color: var(--color-prettylights-syntax-entity-tag);
+}
+
+.markdown-body .pl-k {
+  color: var(--color-prettylights-syntax-keyword);
+}
+
+.markdown-body .pl-s,
+.markdown-body .pl-pds,
+.markdown-body .pl-s .pl-pse .pl-s1,
+.markdown-body .pl-sr,
+.markdown-body .pl-sr .pl-cce,
+.markdown-body .pl-sr .pl-sre,
+.markdown-body .pl-sr .pl-sra {
+  color: var(--color-prettylights-syntax-string);
+}
+
+.markdown-body .pl-v,
+.markdown-body .pl-smw {
+  color: var(--color-prettylights-syntax-variable);
+}
+
+.markdown-body .pl-bu {
+  color: var(--color-prettylights-syntax-brackethighlighter-unmatched);
+}
+
+.markdown-body .pl-ii {
+  color: var(--color-prettylights-syntax-invalid-illegal-text);
+  background-color: var(--color-prettylights-syntax-invalid-illegal-bg);
+}
+
+.markdown-body .pl-c2 {
+  color: var(--color-prettylights-syntax-carriage-return-text);
+  background-color: var(--color-prettylights-syntax-carriage-return-bg);
+}
+
+.markdown-body .pl-sr .pl-cce {
+  font-weight: bold;
+  color: var(--color-prettylights-syntax-string-regexp);
+}
+
+.markdown-body .pl-ml {
+  color: var(--color-prettylights-syntax-markup-list);
+}
+
+.markdown-body .pl-mh,
+.markdown-body .pl-mh .pl-en,
+.markdown-body .pl-ms {
+  font-weight: bold;
+  color: var(--color-prettylights-syntax-markup-heading);
+}
+
+.markdown-body .pl-mi {
+  font-style: italic;
+  color: var(--color-prettylights-syntax-markup-italic);
+}
+
+.markdown-body .pl-mb {
+  font-weight: bold;
+  color: var(--color-prettylights-syntax-markup-bold);
+}
+
+.markdown-body .pl-md {
+  color: var(--color-prettylights-syntax-markup-deleted-text);
+  background-color: var(--color-prettylights-syntax-markup-deleted-bg);
+}
+
+.markdown-body .pl-mi1 {
+  color: var(--color-prettylights-syntax-markup-inserted-text);
+  background-color: var(--color-prettylights-syntax-markup-inserted-bg);
+}
+
+.markdown-body .pl-mc {
+  color: var(--color-prettylights-syntax-markup-changed-text);
+  background-color: var(--color-prettylights-syntax-markup-changed-bg);
+}
+
+.markdown-body .pl-mi2 {
+  color: var(--color-prettylights-syntax-markup-ignored-text);
+  background-color: var(--color-prettylights-syntax-markup-ignored-bg);
+}
+
+.markdown-body .pl-mdr {
+  font-weight: bold;
+  color: var(--color-prettylights-syntax-meta-diff-range);
+}
+
+.markdown-body .pl-ba {
+  color: var(--color-prettylights-syntax-brackethighlighter-angle);
+}
+
+.markdown-body .pl-sg {
+  color: var(--color-prettylights-syntax-sublimelinter-gutter-mark);
+}
+
+.markdown-body .pl-corl {
+  text-decoration: underline;
+  color: var(--color-prettylights-syntax-constant-other-reference-link);
+}
+
+.markdown-body g-emoji {
+  display: inline-block;
+  min-width: 1ch;
+  font-family: "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+  font-size: 1em;
+  font-style: normal !important;
+  font-weight: var(--base-text-weight-normal, 400);
+  line-height: 1;
+  vertical-align: -0.075em;
+}
+
+.markdown-body g-emoji img {
+  width: 1em;
+  height: 1em;
+}
+
+.markdown-body .task-list-item {
+  list-style-type: none;
+}
+
+.markdown-body .task-list-item label {
+  font-weight: var(--base-text-weight-normal, 400);
+}
+
+.markdown-body .task-list-item.enabled label {
+  cursor: pointer;
+}
+
+.markdown-body .task-list-item+.task-list-item {
+  margin-top: 4px;
+}
+
+.markdown-body .task-list-item .handle {
+  display: none;
+}
+
+.markdown-body .task-list-item-checkbox {
+  margin: 0 0.2em 0.25em -1.4em;
+  vertical-align: middle;
+}
+
+.markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox {
+  margin: 0 -1.6em 0.25em 0.2em;
+}
+
+.markdown-body .contains-task-list {
+  position: relative;
+}
+
+.markdown-body .contains-task-list:hover .task-list-item-convert-container,
+.markdown-body .contains-task-list:focus-within .task-list-item-convert-container {
+  display: block;
+  width: auto;
+  height: 24px;
+  overflow: visible;
+  clip: auto;
+}
+
+.markdown-body ::-webkit-calendar-picker-indicator {
+  filter: invert(50%);
+}
+
+.markdown-body .react-syntax-highlighter-line-number {
+  color: var(--color-text-quaternary);
+}
+.markdown-body .abcjs-inline-audio .abcjs-btn {
+  display: flex !important;
+}
diff --git a/app/styles/preflight.css b/app/styles/preflight.css
new file mode 100644
index 0000000..35d3b6e
--- /dev/null
+++ b/app/styles/preflight.css
@@ -0,0 +1,379 @@
+/*
+1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
+2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
+*/
+
+*,
+::before,
+::after {
+  box-sizing: border-box; /* 1 */
+  border-width: 0; /* 2 */
+  border-style: solid; /* 2 */
+  border-color: theme('borderColor.DEFAULT', currentColor); /* 2 */
+}
+
+::before,
+::after {
+  --tw-content: '';
+}
+
+/*
+1. Use a consistent sensible line-height in all browsers.
+2. Prevent adjustments of font size after orientation changes in iOS.
+3. Use a more readable tab size.
+4. Use the user's configured `sans` font-family by default.
+5. Use the user's configured `sans` font-feature-settings by default.
+6. Use the user's configured `sans` font-variation-settings by default.
+7. Disable tap highlights on iOS
+*/
+
+html,
+:host {
+  line-height: 1.5; /* 1 */
+  -webkit-text-size-adjust: 100%; /* 2 */
+  -moz-tab-size: 4; /* 3 */
+  tab-size: 4; /* 3 */
+  font-family: theme('fontFamily.sans', ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"); /* 4 */
+  -webkit-tap-highlight-color: transparent; /* 7 */
+}
+
+/*
+1. Remove the margin in all browsers.
+2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
+*/
+
+body {
+  margin: 0; /* 1 */
+  line-height: inherit; /* 2 */
+}
+
+/*
+1. Add the correct height in Firefox.
+2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
+3. Ensure horizontal rules are visible by default.
+*/
+
+hr {
+  height: 0; /* 1 */
+  color: inherit; /* 2 */
+  border-top-width: 1px; /* 3 */
+}
+
+/*
+Add the correct text decoration in Chrome, Edge, and Safari.
+*/
+
+abbr:where([title]) {
+  text-decoration: underline dotted;
+}
+
+/*
+Remove the default font size and weight for headings.
+*/
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  font-size: inherit;
+  font-weight: inherit;
+}
+
+/*
+Reset links to optimize for opt-in styling instead of opt-out.
+*/
+
+a {
+  color: inherit;
+  text-decoration: inherit;
+}
+
+/*
+Add the correct font weight in Edge and Safari.
+*/
+
+b,
+strong {
+  font-weight: bolder;
+}
+
+/*
+1. Use the user's configured `mono` font-family by default.
+2. Use the user's configured `mono` font-feature-settings by default.
+3. Use the user's configured `mono` font-variation-settings by default.
+4. Correct the odd `em` font sizing in all browsers.
+*/
+
+code,
+kbd,
+samp,
+pre {
+  font-family: theme('fontFamily.mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace); /* 1 */
+  font-size: 1em; /* 4 */
+}
+
+/*
+Add the correct font size in all browsers.
+*/
+
+small {
+  font-size: 80%;
+}
+
+/*
+Prevent `sub` and `sup` elements from affecting the line height in all browsers.
+*/
+
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+sup {
+  top: -0.5em;
+}
+
+/*
+1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
+2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
+3. Remove gaps between table borders by default.
+*/
+
+table {
+  text-indent: 0; /* 1 */
+  border-color: inherit; /* 2 */
+  border-collapse: collapse; /* 3 */
+}
+
+/*
+1. Change the font styles in all browsers.
+2. Remove the margin in Firefox and Safari.
+3. Remove default padding in all browsers.
+*/
+
+button,
+input,
+optgroup,
+select,
+textarea {
+  font-family: inherit; /* 1 */
+  font-feature-settings: inherit; /* 1 */
+  font-variation-settings: inherit; /* 1 */
+  font-size: 100%; /* 1 */
+  font-weight: inherit; /* 1 */
+  line-height: inherit; /* 1 */
+  letter-spacing: inherit; /* 1 */
+  color: inherit; /* 1 */
+  margin: 0; /* 2 */
+  padding: 0; /* 3 */
+}
+
+/*
+Remove the inheritance of text transform in Edge and Firefox.
+*/
+
+button,
+select {
+  text-transform: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Remove default button styles.
+*/
+
+button {
+  -webkit-appearance: button; /* 1 */
+  background-color: transparent; /* 2 */
+  background-image: none; /* 2 */
+}
+
+/*
+Use the modern Firefox focus style for all focusable elements.
+*/
+
+:-moz-focusring {
+  outline: auto;
+}
+
+/*
+Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
+*/
+
+:-moz-ui-invalid {
+  box-shadow: none;
+}
+
+/*
+Add the correct vertical alignment in Chrome and Firefox.
+*/
+
+progress {
+  vertical-align: baseline;
+}
+
+/*
+Correct the cursor style of increment and decrement buttons in Safari.
+*/
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+  height: auto;
+}
+
+/*
+1. Correct the odd appearance in Chrome and Safari.
+2. Correct the outline style in Safari.
+*/
+
+[type='search'] {
+  -webkit-appearance: textfield; /* 1 */
+  outline-offset: -2px; /* 2 */
+}
+
+/*
+Remove the inner padding in Chrome and Safari on macOS.
+*/
+
+::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Change font properties to `inherit` in Safari.
+*/
+
+::-webkit-file-upload-button {
+  -webkit-appearance: button; /* 1 */
+  font: inherit; /* 2 */
+}
+
+/*
+Add the correct display in Chrome and Safari.
+*/
+
+summary {
+  display: list-item;
+}
+
+/*
+Removes the default spacing and border for appropriate elements.
+*/
+
+blockquote,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+hr,
+figure,
+p,
+pre {
+  margin: 0;
+}
+
+fieldset {
+  margin: 0;
+  padding: 0;
+}
+
+legend {
+  padding: 0;
+}
+
+ol,
+ul,
+menu {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+
+/*
+Reset default styling for dialogs.
+*/
+dialog {
+  padding: 0;
+}
+
+/*
+Prevent resizing textareas horizontally by default.
+*/
+
+textarea {
+  resize: vertical;
+}
+
+/*
+1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
+2. Set the default placeholder color to the user's configured gray 400 color.
+*/
+
+input::placeholder,
+textarea::placeholder {
+  opacity: 1; /* 1 */
+  color: theme('colors.gray.400', #9ca3af); /* 2 */
+}
+
+/*
+Set the default cursor for buttons.
+*/
+
+button,
+[role="button"] {
+  cursor: pointer;
+}
+
+/*
+Make sure disabled buttons don't get the pointer cursor.
+*/
+:disabled {
+  cursor: default;
+}
+
+/*
+1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
+2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
+   This can trigger a poorly considered lint error in some tools but is included by design.
+*/
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+  display: block; /* 1 */
+  vertical-align: middle; /* 2 */
+}
+
+/*
+Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
+*/
+
+img,
+video {
+  max-width: 100%;
+  height: auto;
+}
+
+/* Make elements with the HTML hidden attribute stay hidden by default */
+[hidden] {
+  display: none;
+}
diff --git a/assets/action.svg b/assets/action.svg
new file mode 100644
index 0000000..ae3f48e
--- /dev/null
+++ b/assets/action.svg
@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M6.66667 8.00008C6.66667 7.2637 7.26362 6.66675 8 6.66675C8.73638 6.66675 9.33333 7.2637 9.33333 8.00008C9.33333 8.73646 8.73638 9.33341 8 9.33341C7.26362 9.33341 6.66667 8.73646 6.66667 8.00008Z" fill="#667085" />
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M11.3333 8.00008C11.3333 7.2637 11.9303 6.66675 12.6667 6.66675C13.403 6.66675 14 7.2637 14 8.00008C14 8.73646 13.403 9.33341 12.6667 9.33341C11.9303 9.33341 11.3333 8.73646 11.3333 8.00008Z" fill="#667085" />
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M2 8.00008C2 7.2637 2.59695 6.66675 3.33333 6.66675C4.06971 6.66675 4.66667 7.2637 4.66667 8.00008C4.66667 8.73646 4.06971 9.33341 3.33333 9.33341C2.59695 9.33341 2 8.73646 2 8.00008Z" fill="#667085" />
+  </svg>
diff --git a/assets/csv.svg b/assets/csv.svg
new file mode 100644
index 0000000..82a5efa
--- /dev/null
+++ b/assets/csv.svg
@@ -0,0 +1,22 @@
+<svg width="24" height="26" viewBox="0 0 24 26" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_5938_919)">
+<path d="M3 5.8C3 4.11984 3 3.27976 3.32698 2.63803C3.6146 2.07354 4.07354 1.6146 4.63803 1.32698C5.27976 1 6.11984 1 7.8 1H14L21 8V18.2C21 19.8802 21 20.7202 20.673 21.362C20.3854 21.9265 19.9265 22.3854 19.362 22.673C18.7202 23 17.8802 23 16.2 23H7.8C6.11984 23 5.27976 23 4.63803 22.673C4.07354 22.3854 3.6146 21.9265 3.32698 21.362C3 20.7202 3 19.8802 3 18.2V5.8Z" fill="#169951"/>
+</g>
+<g opacity="0.96">
+<path d="M9.81332 16.4181C9.63132 17.5171 8.86832 18.0421 7.92332 18.0421C7.34232 18.0421 6.90132 17.8461 6.53732 17.4821C6.01232 16.9571 6.03332 16.2571 6.03332 15.5081C6.03332 14.7591 6.01232 14.0591 6.53732 13.5341C6.90132 13.1701 7.34232 12.9741 7.92332 12.9741C8.86832 12.9741 9.63132 13.4991 9.81332 14.5981H8.56732C8.49032 14.3181 8.33632 14.0661 7.93032 14.0661C7.70632 14.0661 7.53832 14.1571 7.44732 14.2761C7.33532 14.4231 7.25832 14.5981 7.25832 15.5081C7.25832 16.4181 7.33532 16.5931 7.44732 16.7401C7.53832 16.8591 7.70632 16.9501 7.93032 16.9501C8.33632 16.9501 8.49032 16.6981 8.56732 16.4181H9.81332Z" fill="white"/>
+<path d="M13.8059 16.4741C13.8059 17.4891 12.9309 18.0421 11.8809 18.0421C11.1179 18.0421 10.4949 17.9021 9.99094 17.3841L10.7749 16.6001C11.0339 16.8591 11.4889 16.9501 11.8879 16.9501C12.3709 16.9501 12.6019 16.7891 12.6019 16.5021C12.6019 16.3831 12.5739 16.2851 12.5039 16.2081C12.4409 16.1451 12.3359 16.0961 12.1749 16.0751L11.5729 15.9911C11.1319 15.9281 10.7959 15.7811 10.5719 15.5501C10.3409 15.3121 10.2289 14.9761 10.2289 14.5491C10.2289 13.6391 10.9149 12.9741 12.0489 12.9741C12.7629 12.9741 13.3019 13.1421 13.7289 13.5691L12.9589 14.3391C12.6439 14.0241 12.2309 14.0451 12.0139 14.0451C11.5869 14.0451 11.4119 14.2901 11.4119 14.5071C11.4119 14.5701 11.4329 14.6611 11.5099 14.7381C11.5729 14.8011 11.6779 14.8641 11.8529 14.8851L12.4549 14.9691C12.9029 15.0321 13.2249 15.1721 13.4349 15.3821C13.7009 15.6411 13.8059 16.0121 13.8059 16.4741Z" fill="white"/>
+<path d="M18.3124 13.0161L16.6604 18.0001H15.7504L14.1054 13.0161H15.3724L16.2124 15.8021L17.0384 13.0161H18.3124Z" fill="white"/>
+</g>
+<path opacity="0.5" d="M14 1L21 8H16C14.8954 8 14 7.10457 14 6V1Z" fill="white"/>
+<defs>
+<filter id="filter0_d_5938_919" x="1" y="0" width="22" height="26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5938_919"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5938_919" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/assets/delete.svg b/assets/delete.svg
new file mode 100644
index 0000000..fcd60cf
--- /dev/null
+++ b/assets/delete.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M6.6665 7.33333V11.3333M9.33317 7.33333V11.3333M2.6665 4.66667H13.3332M12.6665 4.66667L12.0885 12.7613C12.0646 13.0977 11.914 13.4125 11.6672 13.6424C11.4205 13.8722 11.0957 14 10.7585 14H5.24117C4.90393 14 4.57922 13.8722 4.33243 13.6424C4.08564 13.4125 3.93511 13.0977 3.91117 12.7613L3.33317 4.66667H12.6665ZM9.99984 4.66667V2.66667C9.99984 2.48986 9.9296 2.32029 9.80457 2.19526C9.67955 2.07024 9.50998 2 9.33317 2H6.6665C6.48969 2 6.32012 2.07024 6.1951 2.19526C6.07008 2.32029 5.99984 2.48986 5.99984 2.66667V4.66667H9.99984Z" stroke="#1F2A37" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>
diff --git a/assets/doc.svg b/assets/doc.svg
new file mode 100644
index 0000000..9a8aef5
--- /dev/null
+++ b/assets/doc.svg
@@ -0,0 +1,22 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_17194_49206)">
+<path d="M4 7.73301C4 5.4928 4 4.37269 4.43597 3.51705C4.81947 2.7644 5.43139 2.15248 6.18404 1.76898C7.03969 1.33301 8.15979 1.33301 10.4 1.33301H18.6667L28 10.6663V24.2663C28 26.5066 28 27.6267 27.564 28.4823C27.1805 29.2349 26.5686 29.8469 25.816 30.2304C24.9603 30.6663 23.8402 30.6663 21.6 30.6663H10.4C8.15979 30.6663 7.03969 30.6663 6.18404 30.2304C5.43139 29.8469 4.81947 29.2349 4.43597 28.4823C4 27.6267 4 26.5066 4 24.2663V7.73301Z" fill="#2349A9"/>
+</g>
+<path opacity="0.5" d="M18.6665 1.33301L27.9998 10.6663H21.3332C19.8604 10.6663 18.6665 9.47243 18.6665 7.99967V1.33301Z" fill="white"/>
+<g opacity="0.96">
+<path d="M13.6329 21.4112C13.6329 22.2603 13.7059 22.9501 13.0326 23.5793C12.6351 23.9508 12.0754 24.11 11.4751 24.11H9.3335V18.7125H11.4751C12.0754 18.7125 12.6351 18.8717 13.0326 19.2431C13.7059 19.8723 13.6329 20.5622 13.6329 21.4112ZM12.2133 21.4112C12.2133 20.5015 12.1727 20.3499 12.0591 20.1983C11.9293 20.0164 11.7347 19.8951 11.3777 19.8951H10.7531V22.9274H11.3777C11.7347 22.9274 11.9293 22.8061 12.0591 22.6242C12.1727 22.4725 12.2133 22.3285 12.2133 21.4112Z" fill="white"/>
+<path d="M18.8275 21.4112C18.8275 22.2224 18.8519 22.9805 18.2435 23.549C17.8217 23.9432 17.3349 24.1555 16.6292 24.1555C15.9234 24.1555 15.4367 23.9432 15.0149 23.549C14.4065 22.9805 14.4308 22.2224 14.4308 21.4112C14.4308 20.6001 14.4065 19.842 15.0149 19.2735C15.4367 18.8793 15.9234 18.667 16.6292 18.667C17.3349 18.667 17.8217 18.8793 18.2435 19.2735C18.8519 19.842 18.8275 20.6001 18.8275 21.4112ZM17.4079 21.4112C17.4079 20.4257 17.3268 20.2438 17.197 20.0846C17.0916 19.9557 16.8888 19.8496 16.6292 19.8496C16.3696 19.8496 16.1668 19.9557 16.0613 20.0846C15.9316 20.2438 15.8504 20.4257 15.8504 21.4112C15.8504 22.3967 15.9316 22.5711 16.0613 22.7303C16.1668 22.8592 16.3696 22.9729 16.6292 22.9729C16.8888 22.9729 17.0916 22.8592 17.197 22.7303C17.3268 22.5711 17.4079 22.3967 17.4079 21.4112Z" fill="white"/>
+<path d="M24.0002 22.3967C23.7893 23.5869 22.905 24.1555 21.8099 24.1555C21.1366 24.1555 20.6256 23.9432 20.2037 23.549C19.5953 22.9805 19.6197 22.2224 19.6197 21.4112C19.6197 20.6001 19.5953 19.842 20.2037 19.2735C20.6256 18.8793 21.1366 18.667 21.8099 18.667C22.905 18.667 23.7893 19.2356 24.0002 20.4257H22.5562C22.467 20.1225 22.2885 19.8496 21.818 19.8496C21.5584 19.8496 21.3638 19.9481 21.2583 20.077C21.1285 20.2362 21.0393 20.4257 21.0393 21.4112C21.0393 22.3967 21.1285 22.5863 21.2583 22.7455C21.3638 22.8743 21.5584 22.9729 21.818 22.9729C22.2885 22.9729 22.467 22.7 22.5562 22.3967H24.0002Z" fill="white"/>
+</g>
+<defs>
+<filter id="filter0_d_17194_49206" x="2" y="0.333008" width="28" height="33.333" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_17194_49206"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_17194_49206" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/assets/docx.svg b/assets/docx.svg
new file mode 100644
index 0000000..5f8fa51
--- /dev/null
+++ b/assets/docx.svg
@@ -0,0 +1,23 @@
+<svg width="32" height="34" viewBox="0 0 32 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_10291_62253)">
+<path d="M4 7.73301C4 5.4928 4 4.37269 4.43597 3.51705C4.81947 2.7644 5.43139 2.15248 6.18404 1.76898C7.03969 1.33301 8.15979 1.33301 10.4 1.33301H18.6667L28 10.6663V24.2663C28 26.5065 28 27.6267 27.564 28.4823C27.1805 29.2349 26.5686 29.8469 25.816 30.2304C24.9603 30.6663 23.8402 30.6663 21.6 30.6663H10.4C8.15979 30.6663 7.03969 30.6663 6.18404 30.2304C5.43139 29.8469 4.81947 29.2349 4.43597 28.4823C4 27.6267 4 26.5065 4 24.2663V7.73301Z" fill="#2349A9"/>
+</g>
+<path opacity="0.5" d="M18.6665 1.33301L27.9998 10.6663H21.3332C19.8604 10.6663 18.6665 9.47243 18.6665 7.99967V1.33301Z" fill="white"/>
+<g opacity="0.96">
+<path d="M10.8443 21.3337C10.8443 22.1587 10.9153 22.8291 10.261 23.4405C9.87477 23.8014 9.33086 23.9561 8.74754 23.9561H6.6665V18.7112H8.74754C9.33086 18.7112 9.87477 18.8659 10.261 19.2268C10.9153 19.8383 10.8443 20.5086 10.8443 21.3337ZM9.46487 21.3337C9.46487 20.4497 9.42545 20.3024 9.31509 20.155C9.18897 19.9782 8.99979 19.8604 8.65295 19.8604H8.04598V22.807H8.65295C8.99979 22.807 9.18897 22.6891 9.31509 22.5123C9.42545 22.365 9.46487 22.225 9.46487 21.3337Z" fill="white"/>
+<path d="M15.8922 21.3337C15.8922 22.1219 15.9158 22.8585 15.3246 23.411C14.9147 23.7941 14.4418 24.0003 13.756 24.0003C13.0702 24.0003 12.5972 23.7941 12.1873 23.411C11.5961 22.8585 11.6197 22.1219 11.6197 21.3337C11.6197 20.5454 11.5961 19.8088 12.1873 19.2563C12.5972 18.8733 13.0702 18.667 13.756 18.667C14.4418 18.667 14.9147 18.8733 15.3246 19.2563C15.9158 19.8088 15.8922 20.5454 15.8922 21.3337ZM14.5127 21.3337C14.5127 20.376 14.4339 20.1992 14.3077 20.0445C14.2053 19.9193 14.0082 19.8162 13.756 19.8162C13.5037 19.8162 13.3066 19.9193 13.2042 20.0445C13.078 20.1992 12.9992 20.376 12.9992 21.3337C12.9992 22.2913 13.078 22.4607 13.2042 22.6154C13.3066 22.7407 13.5037 22.8512 13.756 22.8512C14.0082 22.8512 14.2053 22.7407 14.3077 22.6154C14.4339 22.4607 14.5127 22.2913 14.5127 21.3337Z" fill="white"/>
+<path d="M20.9186 22.2913C20.7136 23.4478 19.8544 24.0003 18.7902 24.0003C18.136 24.0003 17.6394 23.7941 17.2295 23.411C16.6383 22.8585 16.6619 22.1219 16.6619 21.3337C16.6619 20.5454 16.6383 19.8088 17.2295 19.2563C17.6394 18.8733 18.136 18.667 18.7902 18.667C19.8544 18.667 20.7136 19.2195 20.9186 20.376H19.5154C19.4287 20.0814 19.2553 19.8162 18.7981 19.8162C18.5459 19.8162 18.3567 19.9119 18.2542 20.0372C18.1281 20.1919 18.0414 20.376 18.0414 21.3337C18.0414 22.2913 18.1281 22.4755 18.2542 22.6302C18.3567 22.7554 18.5459 22.8512 18.7981 22.8512C19.2553 22.8512 19.4287 22.586 19.5154 22.2913H20.9186Z" fill="white"/>
+<path d="M25.9998 23.9561H24.4233L23.501 22.3429L22.5787 23.9561H21.0022L22.7522 21.2674L21.1126 18.7112H22.6812L23.501 20.1919L24.3208 18.7112H25.8895L24.2499 21.2674L25.9998 23.9561Z" fill="white"/>
+</g>
+<defs>
+<filter id="filter0_d_10291_62253" x="2" y="0.333008" width="28" height="33.333" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_10291_62253"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_10291_62253" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/assets/html.svg b/assets/html.svg
new file mode 100644
index 0000000..023ad9e
--- /dev/null
+++ b/assets/html.svg
@@ -0,0 +1,23 @@
+<svg width="16" height="18" viewBox="0 0 16 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3434_4797)">
+<path d="M2.75 4.38325C2.75 3.40316 2.75 2.91311 2.94074 2.53877C3.10852 2.20948 3.37623 1.94177 3.70552 1.77399C4.07986 1.58325 4.56991 1.58325 5.55 1.58325H9.16667L13.25 5.66659V11.6166C13.25 12.5967 13.25 13.0867 13.0593 13.4611C12.8915 13.7904 12.6238 14.0581 12.2945 14.2258C11.9201 14.4166 11.4301 14.4166 10.45 14.4166H5.55C4.56991 14.4166 4.07986 14.4166 3.70552 14.2258C3.37623 14.0581 3.10852 13.7904 2.94074 13.4611C2.75 13.0867 2.75 12.5967 2.75 11.6166V4.38325Z" fill="#EC5B27"/>
+</g>
+<g opacity="0.96">
+<path d="M5.49319 11.5001V9.00806H4.88069V9.96706H4.22969V9.00806H3.61719V11.5001H4.22969V10.5131H4.88069V11.5001H5.49319Z" fill="white"/>
+<path d="M7.68659 9.55406V9.00806H5.84909V9.55406H6.46159V11.5001H7.07409V9.55406H7.68659Z" fill="white"/>
+<path d="M10.3675 11.5001V9.00806H9.76546L9.20546 10.1071L8.64546 9.00806H8.04346V11.5001H8.65596V10.3066L9.00946 10.9226H9.40146L9.75496 10.3066V11.5001H10.3675Z" fill="white"/>
+<path d="M12.5291 11.5001V10.9541H11.4826V9.00806H10.8701V11.5001H12.5291Z" fill="white"/>
+</g>
+<path opacity="0.5" d="M9.1665 1.58325L13.2498 5.66658H10.3332C9.68884 5.66658 9.1665 5.14425 9.1665 4.49992V1.58325Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3434_4797" x="0.75" y="0.583252" width="14.5" height="16.8333" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3434_4797"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3434_4797" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/assets/json.svg b/assets/json.svg
new file mode 100644
index 0000000..98316f8
--- /dev/null
+++ b/assets/json.svg
@@ -0,0 +1,23 @@
+<svg width="16" height="18" viewBox="0 0 16 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3434_2726)">
+<path d="M2.75 4.38325C2.75 3.40316 2.75 2.91311 2.94074 2.53877C3.10852 2.20948 3.37623 1.94177 3.70552 1.77399C4.07986 1.58325 4.56991 1.58325 5.55 1.58325H9.16667L13.25 5.66659V11.6166C13.25 12.5967 13.25 13.0867 13.0593 13.4611C12.8915 13.7904 12.6238 14.0581 12.2945 14.2258C11.9201 14.4166 11.4301 14.4166 10.45 14.4166H5.55C4.56991 14.4166 4.07986 14.4166 3.70552 14.2258C3.37623 14.0581 3.10852 13.7904 2.94074 13.4611C2.75 13.0867 2.75 12.5967 2.75 11.6166V4.38325Z" fill="#2D2D2E"/>
+</g>
+<g opacity="0.96">
+<path d="M5.3045 10.6461V9.00806H4.692V10.6321C4.692 10.8701 4.5555 10.9751 4.3665 10.9751C4.23 10.9751 4.167 10.9261 4.09 10.8491L3.6875 11.2481C3.8905 11.4511 4.076 11.5211 4.3665 11.5211C4.8355 11.5211 5.3045 11.2376 5.3045 10.6461Z" fill="white"/>
+<path d="M7.44519 10.7371C7.44519 10.5061 7.39269 10.3206 7.25969 10.1911C7.15469 10.0861 6.99369 10.0161 6.76969 9.98456L6.46869 9.94256C6.38119 9.93206 6.32869 9.90056 6.29719 9.86906C6.25869 9.83056 6.24819 9.78506 6.24819 9.75356C6.24819 9.64506 6.33569 9.52256 6.54919 9.52256C6.65769 9.52256 6.86419 9.51206 7.02169 9.66956L7.40669 9.28456C7.19319 9.07106 6.92369 8.98706 6.56669 8.98706C5.99969 8.98706 5.65669 9.31956 5.65669 9.77456C5.65669 9.98806 5.71269 10.1561 5.82819 10.2751C5.94019 10.3906 6.10819 10.4641 6.32869 10.4956L6.62969 10.5376C6.71019 10.5481 6.76269 10.5726 6.79419 10.6041C6.82919 10.6426 6.84319 10.6916 6.84319 10.7511C6.84319 10.8946 6.72769 10.9751 6.48619 10.9751C6.28669 10.9751 6.05919 10.9296 5.92969 10.8001L5.53769 11.1921C5.78969 11.4511 6.10119 11.5211 6.48269 11.5211C7.00769 11.5211 7.44519 11.2446 7.44519 10.7371Z" fill="white"/>
+<path d="M9.66339 10.2541C9.66339 9.87956 9.67389 9.52956 9.41139 9.26706C9.22939 9.08506 9.01939 8.98706 8.71489 8.98706C8.41039 8.98706 8.20039 9.08506 8.01839 9.26706C7.75589 9.52956 7.76639 9.87956 7.76639 10.2541C7.76639 10.6286 7.75589 10.9786 8.01839 11.2411C8.20039 11.4231 8.41039 11.5211 8.71489 11.5211C9.01939 11.5211 9.22939 11.4231 9.41139 11.2411C9.67389 10.9786 9.66339 10.6286 9.66339 10.2541ZM9.05089 10.2541C9.05089 10.7091 9.01589 10.7896 8.95989 10.8631C8.91439 10.9226 8.82689 10.9751 8.71489 10.9751C8.60289 10.9751 8.51539 10.9226 8.46989 10.8631C8.41389 10.7896 8.37889 10.7091 8.37889 10.2541C8.37889 9.79906 8.41389 9.71506 8.46989 9.64156C8.51539 9.58206 8.60289 9.53306 8.71489 9.53306C8.82689 9.53306 8.91439 9.58206 8.95989 9.64156C9.01589 9.71506 9.05089 9.79906 9.05089 10.2541Z" fill="white"/>
+<path d="M12.0317 11.5001V9.00806H11.4192V10.2611L10.6212 9.00806H10.0857V11.5001H10.6982V10.2471L11.4962 11.5001H12.0317Z" fill="white"/>
+</g>
+<path opacity="0.5" d="M9.1665 1.58325L13.2498 5.66658H10.3332C9.68884 5.66658 9.1665 5.14425 9.1665 4.49992V1.58325Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3434_2726" x="0.75" y="0.583252" width="14.5" height="16.8333" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3434_2726"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3434_2726" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/assets/md.svg b/assets/md.svg
new file mode 100644
index 0000000..9e60161
--- /dev/null
+++ b/assets/md.svg
@@ -0,0 +1,18 @@
+<svg width="16" height="18" viewBox="0 0 16 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3434_2745)">
+<path d="M2.75 4.38325C2.75 3.40316 2.75 2.91311 2.94074 2.53877C3.10852 2.20949 3.37623 1.94177 3.70552 1.77399C4.07986 1.58325 4.56991 1.58325 5.55 1.58325H9.16667L13.25 5.66659V11.6166C13.25 12.5967 13.25 13.0867 13.0593 13.4611C12.8915 13.7904 12.6238 14.0581 12.2945 14.2258C11.9201 14.4166 11.4301 14.4166 10.45 14.4166H5.55C4.56991 14.4166 4.07986 14.4166 3.70552 14.2258C3.37623 14.0581 3.10852 13.7904 2.94074 13.4611C2.75 13.0867 2.75 12.5967 2.75 11.6166V4.38325Z" fill="#309BEC"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.6208 12.0833H5.37921C5.13526 12.0833 4.9375 11.8996 4.9375 11.6731V8.99341C4.9375 8.76689 5.13526 8.58325 5.37921 8.58325H10.6208C10.8647 8.58325 11.0625 8.76689 11.0625 8.99341V11.6731C11.0625 11.8996 10.8647 12.0833 10.6208 12.0833ZM6.40986 11.2629V10.1965L6.9988 10.8801L7.58774 10.1965V11.2629H8.17668V9.40356H7.58774L6.9988 10.0872L6.40986 9.40356H5.82091V11.2629H6.40986ZM9.76683 10.3333H10.3558L9.47236 11.2903L8.58894 10.3333H9.17788V9.40356H9.76683V10.3333Z" fill="white"/>
+<path opacity="0.5" d="M9.1665 1.58325L13.2498 5.66658H10.3332C9.68884 5.66658 9.1665 5.14425 9.1665 4.49992V1.58325Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3434_2745" x="0.75" y="0.583252" width="14.5" height="16.8333" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3434_2745"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3434_2745" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/assets/pdf.svg b/assets/pdf.svg
new file mode 100644
index 0000000..8684e58
--- /dev/null
+++ b/assets/pdf.svg
@@ -0,0 +1,22 @@
+<svg width="16" height="18" viewBox="0 0 16 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3434_9549)">
+<path d="M2.75 4.38325C2.75 3.40316 2.75 2.91311 2.94074 2.53877C3.10852 2.20948 3.37623 1.94177 3.70552 1.77399C4.07986 1.58325 4.56991 1.58325 5.55 1.58325H9.16667L13.25 5.66659V11.6166C13.25 12.5967 13.25 13.0867 13.0593 13.4611C12.8915 13.7904 12.6238 14.0581 12.2945 14.2258C11.9201 14.4166 11.4301 14.4166 10.45 14.4166H5.55C4.56991 14.4166 4.07986 14.4166 3.70552 14.2258C3.37623 14.0581 3.10852 13.7904 2.94074 13.4611C2.75 13.0867 2.75 12.5967 2.75 11.6166V4.38325Z" fill="#DD3633"/>
+</g>
+<g opacity="0.96">
+<path d="M6.81016 9.80956C6.81016 9.40006 6.51266 9.00806 5.95966 9.00806H4.97266V11.5001H5.58516V10.6111H5.95966C6.51266 10.6111 6.81016 10.2191 6.81016 9.80956ZM6.19766 9.80956C6.19766 9.93906 6.09966 10.0616 5.93166 10.0616H5.58516V9.55756H5.93166C6.09966 9.55756 6.19766 9.68006 6.19766 9.80956Z" fill="white"/>
+<path d="M9.02199 10.2541C9.02199 9.86206 9.05349 9.54356 8.76299 9.25306C8.59149 9.08156 8.34999 9.00806 8.09099 9.00806H7.16699V11.5001H8.09099C8.34999 11.5001 8.59149 11.4266 8.76299 11.2551C9.05349 10.9646 9.02199 10.6461 9.02199 10.2541ZM8.40949 10.2541C8.40949 10.6776 8.39199 10.7441 8.34299 10.8141C8.28699 10.8981 8.20299 10.9541 8.04899 10.9541H7.77949V9.55406H8.04899C8.20299 9.55406 8.28699 9.61006 8.34299 9.69406C8.39199 9.76406 8.40949 9.83406 8.40949 10.2541Z" fill="white"/>
+<path d="M11.1408 9.55406V9.00806H9.44678V11.5001H10.0593V10.5376H10.9833V9.99156H10.0593V9.55406H11.1408Z" fill="white"/>
+</g>
+<path opacity="0.5" d="M9.1665 1.58325L13.2498 5.66658H10.3332C9.68884 5.66658 9.1665 5.14425 9.1665 4.49992V1.58325Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3434_9549" x="0.75" y="0.583252" width="14.5" height="16.8333" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3434_9549"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3434_9549" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/assets/txt.svg b/assets/txt.svg
new file mode 100644
index 0000000..117ef5b
--- /dev/null
+++ b/assets/txt.svg
@@ -0,0 +1,23 @@
+<svg width="16" height="18" viewBox="0 0 16 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3434_4808)">
+<path d="M2.75 4.38325C2.75 3.40316 2.75 2.91311 2.94074 2.53877C3.10852 2.20948 3.37623 1.94177 3.70552 1.77399C4.07986 1.58325 4.56991 1.58325 5.55 1.58325H9.16667L13.25 5.66659V11.6166C13.25 12.5967 13.25 13.0867 13.0593 13.4611C12.8915 13.7904 12.6238 14.0581 12.2945 14.2258C11.9201 14.4166 11.4301 14.4166 10.45 14.4166H5.55C4.56991 14.4166 4.07986 14.4166 3.70552 14.2258C3.37623 14.0581 3.10852 13.7904 2.94074 13.4611C2.75 13.0867 2.75 12.5967 2.75 11.6166V4.38325Z" fill="#E3E5E8"/>
+<path d="M3 4.38325C3 3.88908 3.00019 3.53349 3.02301 3.25421C3.04559 2.97786 3.08907 2.79832 3.16349 2.65227C3.3073 2.37002 3.53677 2.14055 3.81901 1.99674C3.96507 1.92232 4.14461 1.87884 4.42096 1.85626C4.70024 1.83345 5.05583 1.83325 5.55 1.83325H9.06311L13 5.77014V11.6166C13 12.1108 12.9998 12.4664 12.977 12.7456C12.9544 13.022 12.9109 13.2015 12.8365 13.3476C12.6927 13.6298 12.4632 13.8593 12.181 14.0031C12.0349 14.0775 11.8554 14.121 11.579 14.1436C11.2998 14.1664 10.9442 14.1666 10.45 14.1666H5.55C5.05583 14.1666 4.70024 14.1664 4.42096 14.1436C4.14461 14.121 3.96507 14.0775 3.81901 14.0031C3.53677 13.8593 3.3073 13.6298 3.16349 13.3476C3.08907 13.2015 3.04559 13.022 3.02301 12.7456C3.00019 12.4664 3 12.1108 3 11.6166V4.38325Z" stroke="black" stroke-opacity="0.03" stroke-width="0.5"/>
+</g>
+<g opacity="0.96">
+<path d="M6.78623 9.55406V9.00806H4.94873V9.55406H5.56123V11.5001H6.17373V9.55406H6.78623Z" fill="#667085"/>
+<path d="M9.11009 11.5001L8.33309 10.2226L9.06109 9.00806H8.36459L8.00059 9.71156L7.63659 9.00806H6.94009L7.66809 10.2226L6.89109 11.5001H7.59109L8.00059 10.7336L8.41009 11.5001H9.11009Z" fill="#667085"/>
+<path d="M11.0519 9.55406V9.00806H9.21436V9.55406H9.82686V11.5001H10.4394V9.55406H11.0519Z" fill="#667085"/>
+</g>
+<path opacity="0.5" d="M9.1665 1.58325L13.2498 5.66658H10.3332C9.68884 5.66658 9.1665 5.14425 9.1665 4.49992V1.58325Z" fill="white"/>
+<defs>
+<filter id="filter0_d_3434_4808" x="0.75" y="0.583252" width="14.5" height="16.8333" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3434_4808"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3434_4808" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/assets/xlsx.svg b/assets/xlsx.svg
new file mode 100644
index 0000000..2cdf42c
--- /dev/null
+++ b/assets/xlsx.svg
@@ -0,0 +1,18 @@
+<svg width="24" height="26" viewBox="0 0 24 26" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_5938_927)">
+<path d="M3 5.8C3 4.11984 3 3.27976 3.32698 2.63803C3.6146 2.07354 4.07354 1.6146 4.63803 1.32698C5.27976 1 6.11984 1 7.8 1H14L21 8V18.2C21 19.8802 21 20.7202 20.673 21.362C20.3854 21.9265 19.9265 22.3854 19.362 22.673C18.7202 23 17.8802 23 16.2 23H7.8C6.11984 23 5.27976 23 4.63803 22.673C4.07354 22.3854 3.6146 21.9265 3.32698 21.362C3 20.7202 3 19.8802 3 18.2V5.8Z" fill="#169951"/>
+</g>
+<path opacity="0.5" d="M14 1L21 8H16C14.8954 8 14 7.10457 14 6V1Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M17 12C17.5523 12 18 12.4477 18 13V18C18 18.5523 17.5523 19 17 19H7C6.44772 19 6 18.5523 6 18V13C6 12.4477 6.44772 12 7 12H17ZM11.5 13H7L7 15H11.5V13ZM12.5 18H17V16H12.5V18ZM11.5 16V18H7L7 16H11.5ZM12.5 15H17V13H12.5V15Z" fill="white" fill-opacity="0.96"/>
+<defs>
+<filter id="filter0_d_5938_927" x="1" y="0" width="22" height="26" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5938_927"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5938_927" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/bin/uglify-embed.js b/bin/uglify-embed.js
new file mode 100644
index 0000000..d631411
--- /dev/null
+++ b/bin/uglify-embed.js
@@ -0,0 +1,9 @@
+const fs = require('node:fs')
+// https://www.npmjs.com/package/uglify-js
+const UglifyJS = require('uglify-js')
+
+const { readFileSync, writeFileSync } = fs
+
+writeFileSync('public/embed.min.js', UglifyJS.minify({
+  'embed.js': readFileSync('public/embed.js', 'utf8'),
+}).code, 'utf8')
diff --git a/config/index.ts b/config/index.ts
new file mode 100644
index 0000000..4d30880
--- /dev/null
+++ b/config/index.ts
@@ -0,0 +1,332 @@
+import { InputVarType } from '@/app/components/workflow/types'
+import { AgentStrategy } from '@/types/app'
+import { PromptRole } from '@/models/debug'
+
+export let apiPrefix = ''
+export let webPrefix = ''
+export let publicApiPrefix = ''
+export let publicWebPrefix = ''
+export let marketplaceApiPrefix = ''
+export let marketplaceUrlPrefix = ''
+
+// NEXT_PUBLIC_API_PREFIX=/console/api NEXT_PUBLIC_PUBLIC_API_PREFIX=/api npm run start
+if (
+  process.env.NEXT_PUBLIC_API_PREFIX
+  && process.env.NEXT_PUBLIC_WEB_PREFIX
+  && process.env.NEXT_PUBLIC_PUBLIC_API_PREFIX
+  && process.env.NEXT_PUBLIC_PUBLIC_WEB_PREFIX
+) {
+  apiPrefix = process.env.NEXT_PUBLIC_API_PREFIX
+  webPrefix = process.env.NEXT_PUBLIC_WEB_PREFIX
+  publicApiPrefix = process.env.NEXT_PUBLIC_PUBLIC_API_PREFIX
+  publicWebPrefix = process.env.NEXT_PUBLIC_PUBLIC_WEB_PREFIX
+}
+else if (
+  globalThis.document?.body?.getAttribute('data-api-prefix')
+  && globalThis.document?.body?.getAttribute('data-pubic-api-prefix')
+) {
+  // Not build can not get env from process.env.NEXT_PUBLIC_ in browser https://nextjs.org/docs/basic-features/environment-variables#exposing-environment-variables-to-the-browser
+  apiPrefix = globalThis.document.body.getAttribute('data-api-prefix') as string
+  webPrefix = (globalThis.document.body.getAttribute('data-web-prefix') as string || globalThis.location.origin)
+  publicApiPrefix = globalThis.document.body.getAttribute('data-pubic-api-prefix') as string
+  publicWebPrefix = (globalThis.document.body.getAttribute('data-pubic-web-prefix') as string || globalThis.location.origin)
+}
+else {
+  // const domainParts = globalThis.location?.host?.split('.');
+  // in production env, the host is dify.app . In other env, the host is [dev].dify.app
+  // const env = domainParts.length === 2 ? 'ai' : domainParts?.[0];
+  apiPrefix = 'http://localhost:5001/console/api'
+  webPrefix = 'http://localhost:3000'
+  publicApiPrefix = 'http://localhost:5001/api' // avoid browser private mode api cross origin
+  publicWebPrefix = 'http://localhost:3000'
+  marketplaceApiPrefix = 'http://localhost:5002/api'
+}
+
+if (process.env.NEXT_PUBLIC_MARKETPLACE_API_PREFIX && process.env.NEXT_PUBLIC_MARKETPLACE_URL_PREFIX) {
+  marketplaceApiPrefix = process.env.NEXT_PUBLIC_MARKETPLACE_API_PREFIX
+  marketplaceUrlPrefix = process.env.NEXT_PUBLIC_MARKETPLACE_URL_PREFIX
+}
+else {
+  marketplaceApiPrefix = globalThis.document?.body?.getAttribute('data-marketplace-api-prefix') || ''
+  marketplaceUrlPrefix = globalThis.document?.body?.getAttribute('data-marketplace-url-prefix') || ''
+}
+
+export const API_PREFIX: string = apiPrefix
+export const WEB_PREFIX: string = webPrefix
+export const PUBLIC_API_PREFIX: string = publicApiPrefix
+export const PUBLIC_WEB_PREFIX: string = publicWebPrefix
+export const MARKETPLACE_API_PREFIX: string = marketplaceApiPrefix
+export const MARKETPLACE_URL_PREFIX: string = marketplaceUrlPrefix
+
+const EDITION = process.env.NEXT_PUBLIC_EDITION || globalThis.document?.body?.getAttribute('data-public-edition') || 'SELF_HOSTED'
+export const IS_CE_EDITION = EDITION === 'SELF_HOSTED'
+export const IS_CLOUD_EDITION = EDITION === 'CLOUD'
+
+export const SUPPORT_MAIL_LOGIN = !!(process.env.NEXT_PUBLIC_SUPPORT_MAIL_LOGIN || globalThis.document?.body?.getAttribute('data-public-support-mail-login'))
+
+export const TONE_LIST = [
+  {
+    id: 1,
+    name: 'Creative',
+    config: {
+      temperature: 0.8,
+      top_p: 0.9,
+      presence_penalty: 0.1,
+      frequency_penalty: 0.1,
+    },
+  },
+  {
+    id: 2,
+    name: 'Balanced',
+    config: {
+      temperature: 0.5,
+      top_p: 0.85,
+      presence_penalty: 0.2,
+      frequency_penalty: 0.3,
+    },
+  },
+  {
+    id: 3,
+    name: 'Precise',
+    config: {
+      temperature: 0.2,
+      top_p: 0.75,
+      presence_penalty: 0.5,
+      frequency_penalty: 0.5,
+    },
+  },
+  {
+    id: 4,
+    name: 'Custom',
+  },
+]
+
+export const DEFAULT_CHAT_PROMPT_CONFIG = {
+  prompt: [
+    {
+      role: PromptRole.system,
+      text: '',
+    },
+  ],
+}
+
+export const DEFAULT_COMPLETION_PROMPT_CONFIG = {
+  prompt: {
+    text: '',
+  },
+  conversation_histories_role: {
+    user_prefix: '',
+    assistant_prefix: '',
+  },
+}
+
+export const getMaxToken = (modelId: string) => {
+  return (modelId === 'gpt-4' || modelId === 'gpt-3.5-turbo-16k') ? 8000 : 4000
+}
+
+export const LOCALE_COOKIE_NAME = 'locale'
+
+export const DEFAULT_VALUE_MAX_LEN = 48
+export const DEFAULT_PARAGRAPH_VALUE_MAX_LEN = 1000
+
+export const zhRegex = /^[\u4E00-\u9FA5]$/m
+export const emojiRegex = /^[\uD800-\uDBFF][\uDC00-\uDFFF]$/m
+export const emailRegex = /^[\w.!#$%&'*+\-/=?^{|}~]+@([\w-]+\.)+[\w-]{2,}$/m
+const MAX_ZN_VAR_NAME_LENGTH = 8
+const MAX_EN_VAR_VALUE_LENGTH = 30
+export const getMaxVarNameLength = (value: string) => {
+  if (zhRegex.test(value))
+    return MAX_ZN_VAR_NAME_LENGTH
+
+  return MAX_EN_VAR_VALUE_LENGTH
+}
+
+export const MAX_VAR_KEY_LENGTH = 30
+
+export const MAX_PROMPT_MESSAGE_LENGTH = 10
+
+export const VAR_ITEM_TEMPLATE = {
+  key: '',
+  name: '',
+  type: 'string',
+  max_length: DEFAULT_VALUE_MAX_LEN,
+  required: true,
+}
+
+export const VAR_ITEM_TEMPLATE_IN_WORKFLOW = {
+  variable: '',
+  label: '',
+  type: InputVarType.textInput,
+  max_length: DEFAULT_VALUE_MAX_LEN,
+  required: true,
+  options: [],
+}
+
+export const appDefaultIconBackground = '#D5F5F6'
+
+export const NEED_REFRESH_APP_LIST_KEY = 'needRefreshAppList'
+
+export const DATASET_DEFAULT = {
+  top_k: 4,
+  score_threshold: 0.8,
+}
+
+export const APP_PAGE_LIMIT = 10
+
+export const ANNOTATION_DEFAULT = {
+  score_threshold: 0.9,
+}
+
+export let maxToolsNum = 10
+
+if (process.env.NEXT_PUBLIC_MAX_TOOLS_NUM && process.env.NEXT_PUBLIC_MAX_TOOLS_NUM !== '')
+  maxToolsNum = Number.parseInt(process.env.NEXT_PUBLIC_MAX_TOOLS_NUM)
+else if (globalThis.document?.body?.getAttribute('data-public-max-tools-num') && globalThis.document.body.getAttribute('data-public-max-tools-num') !== '')
+  maxToolsNum = Number.parseInt(globalThis.document.body.getAttribute('data-public-max-tools-num') as string)
+
+export const MAX_TOOLS_NUM = maxToolsNum
+
+export const DEFAULT_AGENT_SETTING = {
+  enabled: false,
+  max_iteration: 5,
+  strategy: AgentStrategy.functionCall,
+  tools: [],
+}
+
+export const DEFAULT_AGENT_PROMPT = {
+  chat: `Respond to the human as helpfully and accurately as possible.
+
+  {{instruction}}
+
+  You have access to the following tools:
+
+  {{tools}}
+
+  Use a json blob to specify a tool by providing an {{TOOL_NAME_KEY}} key (tool name) and an {{ACTION_INPUT_KEY}} key (tool input).
+  Valid "{{TOOL_NAME_KEY}}" values: "Final Answer" or {{tool_names}}
+
+  Provide only ONE action per $JSON_BLOB, as shown:
+
+  \`\`\`
+  {
+    "{{TOOL_NAME_KEY}}": $TOOL_NAME,
+    "{{ACTION_INPUT_KEY}}": $ACTION_INPUT
+  }
+  \`\`\`
+
+  Follow this format:
+
+  Question: input question to answer
+  Thought: consider previous and subsequent steps
+  Action:
+  \`\`\`
+  $JSON_BLOB
+  \`\`\`
+  Observation: action result
+  ... (repeat Thought/Action/Observation N times)
+  Thought: I know what to respond
+  Action:
+  \`\`\`
+  {
+    "{{TOOL_NAME_KEY}}": "Final Answer",
+    "{{ACTION_INPUT_KEY}}": "Final response to human"
+  }
+  \`\`\`
+
+  Begin! Reminder to ALWAYS respond with a valid json blob of a single action. Use tools if necessary. Respond directly if appropriate. Format is Action:\`\`\`$JSON_BLOB\`\`\`then Observation:.`,
+  completion: `
+  Respond to the human as helpfully and accurately as possible.
+
+{{instruction}}
+
+You have access to the following tools:
+
+{{tools}}
+
+Use a json blob to specify a tool by providing an {{TOOL_NAME_KEY}} key (tool name) and an {{ACTION_INPUT_KEY}} key (tool input).
+Valid "{{TOOL_NAME_KEY}}" values: "Final Answer" or {{tool_names}}
+
+Provide only ONE action per $JSON_BLOB, as shown:
+
+\`\`\`
+{{{{
+  "{{TOOL_NAME_KEY}}": $TOOL_NAME,
+  "{{ACTION_INPUT_KEY}}": $ACTION_INPUT
+}}}}
+\`\`\`
+
+Follow this format:
+
+Question: input question to answer
+Thought: consider previous and subsequent steps
+Action:
+\`\`\`
+$JSON_BLOB
+\`\`\`
+Observation: action result
+... (repeat Thought/Action/Observation N times)
+Thought: I know what to respond
+Action:
+\`\`\`
+{{{{
+  "{{TOOL_NAME_KEY}}": "Final Answer",
+  "{{ACTION_INPUT_KEY}}": "Final response to human"
+}}}}
+\`\`\`
+
+Begin! Reminder to ALWAYS respond with a valid json blob of a single action. Use tools if necessary. Respond directly if appropriate. Format is Action:\`\`\`$JSON_BLOB\`\`\`then Observation:.
+Question: {{query}}
+Thought: {{agent_scratchpad}}
+  `,
+}
+
+export const VAR_REGEX = /\{\{(#[a-zA-Z0-9_-]{1,50}(\.[a-zA-Z_]\w{0,29}){1,10}#)\}\}/gi
+
+export const resetReg = () => VAR_REGEX.lastIndex = 0
+
+export let textGenerationTimeoutMs = 60000
+
+if (process.env.NEXT_PUBLIC_TEXT_GENERATION_TIMEOUT_MS && process.env.NEXT_PUBLIC_TEXT_GENERATION_TIMEOUT_MS !== '')
+  textGenerationTimeoutMs = Number.parseInt(process.env.NEXT_PUBLIC_TEXT_GENERATION_TIMEOUT_MS)
+else if (globalThis.document?.body?.getAttribute('data-public-text-generation-timeout-ms') && globalThis.document.body.getAttribute('data-public-text-generation-timeout-ms') !== '')
+  textGenerationTimeoutMs = Number.parseInt(globalThis.document.body.getAttribute('data-public-text-generation-timeout-ms') as string)
+
+export const TEXT_GENERATION_TIMEOUT_MS = textGenerationTimeoutMs
+
+export const DISABLE_UPLOAD_IMAGE_AS_ICON = process.env.NEXT_PUBLIC_DISABLE_UPLOAD_IMAGE_AS_ICON === 'true'
+
+export const GITHUB_ACCESS_TOKEN = process.env.NEXT_PUBLIC_GITHUB_ACCESS_TOKEN || ''
+
+export const SUPPORT_INSTALL_LOCAL_FILE_EXTENSIONS = '.difypkg,.difybndl'
+export const FULL_DOC_PREVIEW_LENGTH = 50
+
+export const JSON_SCHEMA_MAX_DEPTH = 10
+let loopNodeMaxCount = 100
+
+if (process.env.NEXT_PUBLIC_LOOP_NODE_MAX_COUNT && process.env.NEXT_PUBLIC_LOOP_NODE_MAX_COUNT !== '')
+  loopNodeMaxCount = Number.parseInt(process.env.NEXT_PUBLIC_LOOP_NODE_MAX_COUNT)
+else if (globalThis.document?.body?.getAttribute('data-public-loop-node-max-count') && globalThis.document.body.getAttribute('data-public-loop-node-max-count') !== '')
+  loopNodeMaxCount = Number.parseInt(globalThis.document.body.getAttribute('data-public-loop-node-max-count') as string)
+
+export const LOOP_NODE_MAX_COUNT = loopNodeMaxCount
+
+let maxIterationsNum = 5
+
+if (process.env.NEXT_PUBLIC_MAX_ITERATIONS_NUM && process.env.NEXT_PUBLIC_MAX_ITERATIONS_NUM !== '')
+  maxIterationsNum = Number.parseInt(process.env.NEXT_PUBLIC_MAX_ITERATIONS_NUM)
+else if (globalThis.document?.body?.getAttribute('data-public-max-iterations-num') && globalThis.document.body.getAttribute('data-public-max-iterations-num') !== '')
+  maxIterationsNum = Number.parseInt(globalThis.document.body.getAttribute('data-public-max-iterations-num') as string)
+
+export const MAX_ITERATIONS_NUM = maxIterationsNum
+
+export const ENABLE_WEBSITE_JINAREADER = process.env.NEXT_PUBLIC_ENABLE_WEBSITE_JINAREADER !== undefined
+  ? process.env.NEXT_PUBLIC_ENABLE_WEBSITE_JINAREADER === 'true'
+  : globalThis.document?.body?.getAttribute('data-public-enable-website-jinareader') === 'true' || true
+
+export const ENABLE_WEBSITE_FIRECRAWL = process.env.NEXT_PUBLIC_ENABLE_WEBSITE_FIRECRAWL !== undefined
+  ? process.env.NEXT_PUBLIC_ENABLE_WEBSITE_FIRECRAWL === 'true'
+  : globalThis.document?.body?.getAttribute('data-public-enable-website-firecrawl') === 'true' || true
+
+export const ENABLE_WEBSITE_WATERCRAWL = process.env.NEXT_PUBLIC_ENABLE_WEBSITE_WATERCRAWL !== undefined
+  ? process.env.NEXT_PUBLIC_ENABLE_WEBSITE_WATERCRAWL === 'true'
+  : globalThis.document?.body?.getAttribute('data-public-enable-website-watercrawl') === 'true' || true
diff --git a/context/app-context.tsx b/context/app-context.tsx
new file mode 100644
index 0000000..79cc246
--- /dev/null
+++ b/context/app-context.tsx
@@ -0,0 +1,159 @@
+'use client'
+
+import { createRef, useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import useSWR from 'swr'
+import { createContext, useContext, useContextSelector } from 'use-context-selector'
+import type { FC, ReactNode } from 'react'
+import { fetchAppList } from '@/service/apps'
+import Loading from '@/app/components/base/loading'
+import { fetchCurrentWorkspace, fetchLanggeniusVersion, fetchUserProfile, getSystemFeatures } from '@/service/common'
+import type { App } from '@/types/app'
+import type { ICurrentWorkspace, LangGeniusVersionResponse, UserProfileResponse } from '@/models/common'
+import MaintenanceNotice from '@/app/components/header/maintenance-notice'
+import type { SystemFeatures } from '@/types/feature'
+import { defaultSystemFeatures } from '@/types/feature'
+import { noop } from 'lodash-es'
+
+export type AppContextValue = {
+  apps: App[]
+  systemFeatures: SystemFeatures
+  mutateApps: VoidFunction
+  userProfile: UserProfileResponse
+  mutateUserProfile: VoidFunction
+  currentWorkspace: ICurrentWorkspace
+  isCurrentWorkspaceManager: boolean
+  isCurrentWorkspaceOwner: boolean
+  isCurrentWorkspaceEditor: boolean
+  isCurrentWorkspaceDatasetOperator: boolean
+  mutateCurrentWorkspace: VoidFunction
+  pageContainerRef: React.RefObject<HTMLDivElement>
+  langeniusVersionInfo: LangGeniusVersionResponse
+  useSelector: typeof useSelector
+  isLoadingCurrentWorkspace: boolean
+}
+
+const initialLangeniusVersionInfo = {
+  current_env: '',
+  current_version: '',
+  latest_version: '',
+  release_date: '',
+  release_notes: '',
+  version: '',
+  can_auto_update: false,
+}
+
+const initialWorkspaceInfo: ICurrentWorkspace = {
+  id: '',
+  name: '',
+  plan: '',
+  status: '',
+  created_at: 0,
+  role: 'normal',
+  providers: [],
+}
+
+const AppContext = createContext<AppContextValue>({
+  systemFeatures: defaultSystemFeatures,
+  apps: [],
+  mutateApps: noop,
+  userProfile: {
+    id: '',
+    name: '',
+    email: '',
+    avatar: '',
+    avatar_url: '',
+    is_password_set: false,
+  },
+  currentWorkspace: initialWorkspaceInfo,
+  isCurrentWorkspaceManager: false,
+  isCurrentWorkspaceOwner: false,
+  isCurrentWorkspaceEditor: false,
+  isCurrentWorkspaceDatasetOperator: false,
+  mutateUserProfile: noop,
+  mutateCurrentWorkspace: noop,
+  pageContainerRef: createRef(),
+  langeniusVersionInfo: initialLangeniusVersionInfo,
+  useSelector,
+  isLoadingCurrentWorkspace: false,
+})
+
+export function useSelector<T>(selector: (value: AppContextValue) => T): T {
+  return useContextSelector(AppContext, selector)
+}
+
+export type AppContextProviderProps = {
+  children: ReactNode
+}
+
+export const AppContextProvider: FC<AppContextProviderProps> = ({ children }) => {
+  const pageContainerRef = useRef<HTMLDivElement>(null)
+
+  const { data: appList, mutate: mutateApps } = useSWR({ url: '/apps', params: { page: 1, limit: 30, name: '' } }, fetchAppList)
+  const { data: userProfileResponse, mutate: mutateUserProfile } = useSWR({ url: '/account/profile', params: {} }, fetchUserProfile)
+  const { data: currentWorkspaceResponse, mutate: mutateCurrentWorkspace, isLoading: isLoadingCurrentWorkspace } = useSWR({ url: '/workspaces/current', params: {} }, fetchCurrentWorkspace)
+
+  const { data: systemFeatures } = useSWR({ url: '/console/system-features' }, getSystemFeatures, {
+    fallbackData: defaultSystemFeatures,
+  })
+
+  const [userProfile, setUserProfile] = useState<UserProfileResponse>()
+  const [langeniusVersionInfo, setLangeniusVersionInfo] = useState<LangGeniusVersionResponse>(initialLangeniusVersionInfo)
+  const [currentWorkspace, setCurrentWorkspace] = useState<ICurrentWorkspace>(initialWorkspaceInfo)
+  const isCurrentWorkspaceManager = useMemo(() => ['owner', 'admin'].includes(currentWorkspace.role), [currentWorkspace.role])
+  const isCurrentWorkspaceOwner = useMemo(() => currentWorkspace.role === 'owner', [currentWorkspace.role])
+  const isCurrentWorkspaceEditor = useMemo(() => ['owner', 'admin', 'editor'].includes(currentWorkspace.role), [currentWorkspace.role])
+  const isCurrentWorkspaceDatasetOperator = useMemo(() => currentWorkspace.role === 'dataset_operator', [currentWorkspace.role])
+  const updateUserProfileAndVersion = useCallback(async () => {
+    if (userProfileResponse && !userProfileResponse.bodyUsed) {
+      const result = await userProfileResponse.json()
+      setUserProfile(result)
+      const current_version = userProfileResponse.headers.get('x-version')
+      const current_env = process.env.NODE_ENV === 'development' ? 'DEVELOPMENT' : userProfileResponse.headers.get('x-env')
+      const versionData = await fetchLanggeniusVersion({ url: '/version', params: { current_version } })
+      setLangeniusVersionInfo({ ...versionData, current_version, latest_version: versionData.version, current_env })
+    }
+  }, [userProfileResponse])
+
+  useEffect(() => {
+    updateUserProfileAndVersion()
+  }, [updateUserProfileAndVersion, userProfileResponse])
+
+  useEffect(() => {
+    if (currentWorkspaceResponse)
+      setCurrentWorkspace(currentWorkspaceResponse)
+  }, [currentWorkspaceResponse])
+
+  if (!appList || !userProfile)
+    return <Loading type='app' />
+
+  return (
+    <AppContext.Provider value={{
+      apps: appList.data,
+      systemFeatures: { ...defaultSystemFeatures, ...systemFeatures },
+      mutateApps,
+      userProfile,
+      mutateUserProfile,
+      pageContainerRef,
+      langeniusVersionInfo,
+      useSelector,
+      currentWorkspace,
+      isCurrentWorkspaceManager,
+      isCurrentWorkspaceOwner,
+      isCurrentWorkspaceEditor,
+      isCurrentWorkspaceDatasetOperator,
+      mutateCurrentWorkspace,
+      isLoadingCurrentWorkspace,
+    }}>
+      <div className='flex h-full flex-col overflow-y-auto'>
+        {globalThis.document?.body?.getAttribute('data-public-maintenance-notice') && <MaintenanceNotice />}
+        <div ref={pageContainerRef} className='relative flex grow flex-col overflow-y-auto overflow-x-hidden bg-background-body'>
+          {children}
+        </div>
+      </div>
+    </AppContext.Provider>
+  )
+}
+
+export const useAppContext = () => useContext(AppContext)
+
+export default AppContext
diff --git a/context/dataset-detail.ts b/context/dataset-detail.ts
new file mode 100644
index 0000000..198de38
--- /dev/null
+++ b/context/dataset-detail.ts
@@ -0,0 +1,17 @@
+import { createContext, useContext, useContextSelector } from 'use-context-selector'
+import type { DataSet } from '@/models/datasets'
+import type { IndexingType } from '@/app/components/datasets/create/step-two'
+
+type DatasetDetailContextValue = {
+  indexingTechnique?: IndexingType
+  dataset?: DataSet
+  mutateDatasetRes?: () => void
+}
+const DatasetDetailContext = createContext<DatasetDetailContextValue>({})
+
+export const useDatasetDetailContext = () => useContext(DatasetDetailContext)
+
+export const useDatasetDetailContextWithSelector = (selector: (value: DatasetDetailContextValue) => any) => {
+  return useContextSelector(DatasetDetailContext, selector)
+}
+export default DatasetDetailContext
diff --git a/context/datasets-context.tsx b/context/datasets-context.tsx
new file mode 100644
index 0000000..e3dc38d
--- /dev/null
+++ b/context/datasets-context.tsx
@@ -0,0 +1,21 @@
+'use client'
+
+import { createContext, useContext } from 'use-context-selector'
+import type { DataSet } from '@/models/datasets'
+import { noop } from 'lodash-es'
+
+export type DatasetsContextValue = {
+  datasets: DataSet[]
+  mutateDatasets: () => void
+  currentDataset?: DataSet
+}
+
+const DatasetsContext = createContext<DatasetsContextValue>({
+  datasets: [],
+  mutateDatasets: noop,
+  currentDataset: undefined,
+})
+
+export const useDatasetsContext = () => useContext(DatasetsContext)
+
+export default DatasetsContext
diff --git a/context/debug-configuration.ts b/context/debug-configuration.ts
new file mode 100644
index 0000000..47710c8
--- /dev/null
+++ b/context/debug-configuration.ts
@@ -0,0 +1,263 @@
+import type { RefObject } from 'react'
+import { createContext, useContext } from 'use-context-selector'
+import { PromptMode } from '@/models/debug'
+import type {
+  AnnotationReplyConfig,
+  BlockStatus,
+  ChatPromptConfig,
+  CitationConfig,
+  CompletionPromptConfig,
+  ConversationHistoriesRole,
+  DatasetConfigs,
+  Inputs,
+  ModelConfig,
+  ModerationConfig,
+  MoreLikeThisConfig,
+  PromptConfig,
+  PromptItem,
+  SpeechToTextConfig,
+  SuggestedQuestionsAfterAnswerConfig,
+  TextToSpeechConfig,
+} from '@/models/debug'
+import type { ExternalDataTool } from '@/models/common'
+import type { DataSet } from '@/models/datasets'
+import type { VisionSettings } from '@/types/app'
+import { ModelModeType, RETRIEVE_TYPE, Resolution, TransferMethod } from '@/types/app'
+import { ANNOTATION_DEFAULT, DEFAULT_AGENT_SETTING, DEFAULT_CHAT_PROMPT_CONFIG, DEFAULT_COMPLETION_PROMPT_CONFIG } from '@/config'
+import type { FormValue } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import type { Collection } from '@/app/components/tools/types'
+import { noop } from 'lodash-es'
+
+type IDebugConfiguration = {
+  appId: string
+  isAPIKeySet: boolean
+  isTrailFinished: boolean
+  mode: string
+  modelModeType: ModelModeType
+  promptMode: PromptMode
+  setPromptMode: (promptMode: PromptMode) => void
+  isAdvancedMode: boolean
+  isAgent: boolean
+  isFunctionCall: boolean
+  isOpenAI: boolean
+  collectionList: Collection[]
+  canReturnToSimpleMode: boolean
+  setCanReturnToSimpleMode: (canReturnToSimpleMode: boolean) => void
+  chatPromptConfig: ChatPromptConfig
+  completionPromptConfig: CompletionPromptConfig
+  currentAdvancedPrompt: PromptItem | PromptItem[]
+  setCurrentAdvancedPrompt: (prompt: PromptItem | PromptItem[], isUserChanged?: boolean) => void
+  showHistoryModal: () => void
+  conversationHistoriesRole: ConversationHistoriesRole
+  setConversationHistoriesRole: (conversationHistoriesRole: ConversationHistoriesRole) => void
+  hasSetBlockStatus: BlockStatus
+  conversationId: string | null // after first chat send
+  setConversationId: (conversationId: string | null) => void
+  introduction: string
+  setIntroduction: (introduction: string) => void
+  suggestedQuestions: string[]
+  setSuggestedQuestions: (questions: string[]) => void
+  controlClearChatMessage: number
+  setControlClearChatMessage: (controlClearChatMessage: number) => void
+  prevPromptConfig: PromptConfig
+  setPrevPromptConfig: (prevPromptConfig: PromptConfig) => void
+  moreLikeThisConfig: MoreLikeThisConfig
+  setMoreLikeThisConfig: (moreLikeThisConfig: MoreLikeThisConfig) => void
+  suggestedQuestionsAfterAnswerConfig: SuggestedQuestionsAfterAnswerConfig
+  setSuggestedQuestionsAfterAnswerConfig: (suggestedQuestionsAfterAnswerConfig: SuggestedQuestionsAfterAnswerConfig) => void
+  speechToTextConfig: SpeechToTextConfig
+  setSpeechToTextConfig: (speechToTextConfig: SpeechToTextConfig) => void
+  textToSpeechConfig: TextToSpeechConfig
+  setTextToSpeechConfig: (textToSpeechConfig: TextToSpeechConfig) => void
+  citationConfig: CitationConfig
+  setCitationConfig: (citationConfig: CitationConfig) => void
+  annotationConfig: AnnotationReplyConfig
+  setAnnotationConfig: (annotationConfig: AnnotationReplyConfig) => void
+  moderationConfig: ModerationConfig
+  setModerationConfig: (moderationConfig: ModerationConfig) => void
+  externalDataToolsConfig: ExternalDataTool[]
+  setExternalDataToolsConfig: (externalDataTools: ExternalDataTool[]) => void
+  formattingChanged: boolean
+  setFormattingChanged: (formattingChanged: boolean) => void
+  inputs: Inputs
+  setInputs: (inputs: Inputs) => void
+  query: string // user question
+  setQuery: (query: string) => void
+  // Belows are draft infos
+  completionParams: FormValue
+  setCompletionParams: (completionParams: FormValue) => void
+  // model_config
+  modelConfig: ModelConfig
+  setModelConfig: (modelConfig: ModelConfig) => void
+  dataSets: DataSet[]
+  setDataSets: (dataSet: DataSet[]) => void
+  showSelectDataSet: () => void
+  // dataset config
+  datasetConfigs: DatasetConfigs
+  datasetConfigsRef: RefObject<DatasetConfigs>
+  setDatasetConfigs: (config: DatasetConfigs) => void
+  hasSetContextVar: boolean
+  isShowVisionConfig: boolean
+  visionConfig: VisionSettings
+  setVisionConfig: (visionConfig: VisionSettings, noNotice?: boolean) => void
+  isAllowVideoUpload: boolean
+  isShowDocumentConfig: boolean
+  rerankSettingModalOpen: boolean
+  setRerankSettingModalOpen: (rerankSettingModalOpen: boolean) => void
+}
+
+const DebugConfigurationContext = createContext<IDebugConfiguration>({
+  appId: '',
+  isAPIKeySet: false,
+  isTrailFinished: false,
+  mode: '',
+  modelModeType: ModelModeType.chat,
+  promptMode: PromptMode.simple,
+  setPromptMode: noop,
+  isAdvancedMode: false,
+  isAgent: false,
+  isFunctionCall: false,
+  isOpenAI: false,
+  collectionList: [],
+  canReturnToSimpleMode: false,
+  setCanReturnToSimpleMode: noop,
+  chatPromptConfig: DEFAULT_CHAT_PROMPT_CONFIG,
+  completionPromptConfig: DEFAULT_COMPLETION_PROMPT_CONFIG,
+  currentAdvancedPrompt: [],
+  showHistoryModal: noop,
+  conversationHistoriesRole: {
+    user_prefix: 'user',
+    assistant_prefix: 'assistant',
+  },
+  setConversationHistoriesRole: noop,
+  setCurrentAdvancedPrompt: noop,
+  hasSetBlockStatus: {
+    context: false,
+    history: false,
+    query: false,
+  },
+  conversationId: '',
+  setConversationId: noop,
+  introduction: '',
+  setIntroduction: noop,
+  suggestedQuestions: [],
+  setSuggestedQuestions: noop,
+  controlClearChatMessage: 0,
+  setControlClearChatMessage: noop,
+  prevPromptConfig: {
+    prompt_template: '',
+    prompt_variables: [],
+  },
+  setPrevPromptConfig: noop,
+  moreLikeThisConfig: {
+    enabled: false,
+  },
+  setMoreLikeThisConfig: noop,
+  suggestedQuestionsAfterAnswerConfig: {
+    enabled: false,
+  },
+  setSuggestedQuestionsAfterAnswerConfig: noop,
+  speechToTextConfig: {
+    enabled: false,
+  },
+  setSpeechToTextConfig: noop,
+  textToSpeechConfig: {
+    enabled: false,
+    voice: '',
+    language: '',
+  },
+  setTextToSpeechConfig: noop,
+  citationConfig: {
+    enabled: false,
+  },
+  setCitationConfig: noop,
+  moderationConfig: {
+    enabled: false,
+  },
+  annotationConfig: {
+    id: '',
+    enabled: false,
+    score_threshold: ANNOTATION_DEFAULT.score_threshold,
+    embedding_model: {
+      embedding_model_name: '',
+      embedding_provider_name: '',
+    },
+  },
+  setAnnotationConfig: noop,
+  setModerationConfig: noop,
+  externalDataToolsConfig: [],
+  setExternalDataToolsConfig: noop,
+  formattingChanged: false,
+  setFormattingChanged: noop,
+  inputs: {},
+  setInputs: noop,
+  query: '',
+  setQuery: noop,
+  completionParams: {
+    max_tokens: 16,
+    temperature: 1, // 0-2
+    top_p: 1,
+    presence_penalty: 1, // -2-2
+    frequency_penalty: 1, // -2-2
+  },
+  setCompletionParams: noop,
+  modelConfig: {
+    provider: 'OPENAI', // 'OPENAI'
+    model_id: 'gpt-3.5-turbo', // 'gpt-3.5-turbo'
+    mode: ModelModeType.unset,
+    configs: {
+      prompt_template: '',
+      prompt_variables: [],
+    },
+    more_like_this: null,
+    opening_statement: '',
+    suggested_questions: [],
+    sensitive_word_avoidance: null,
+    speech_to_text: null,
+    text_to_speech: null,
+    file_upload: null,
+    suggested_questions_after_answer: null,
+    retriever_resource: null,
+    annotation_reply: null,
+    dataSets: [],
+    agentConfig: DEFAULT_AGENT_SETTING,
+  },
+  setModelConfig: noop,
+  dataSets: [],
+  showSelectDataSet: noop,
+  setDataSets: noop,
+  datasetConfigs: {
+    retrieval_model: RETRIEVE_TYPE.multiWay,
+    reranking_model: {
+      reranking_provider_name: '',
+      reranking_model_name: '',
+    },
+    top_k: 2,
+    score_threshold_enabled: false,
+    score_threshold: 0.7,
+    datasets: {
+      datasets: [],
+    },
+  },
+  datasetConfigsRef: {
+    current: null,
+  },
+  setDatasetConfigs: noop,
+  hasSetContextVar: false,
+  isShowVisionConfig: false,
+  visionConfig: {
+    enabled: false,
+    number_limits: 2,
+    detail: Resolution.low,
+    transfer_methods: [TransferMethod.remote_url],
+  },
+  setVisionConfig: noop,
+  isAllowVideoUpload: false,
+  isShowDocumentConfig: false,
+  rerankSettingModalOpen: false,
+  setRerankSettingModalOpen: noop,
+})
+
+export const useDebugConfigurationContext = () => useContext(DebugConfigurationContext)
+
+export default DebugConfigurationContext
diff --git a/context/event-emitter.tsx b/context/event-emitter.tsx
new file mode 100644
index 0000000..d31e32e
--- /dev/null
+++ b/context/event-emitter.tsx
@@ -0,0 +1,28 @@
+'use client'
+
+import { createContext, useContext } from 'use-context-selector'
+import { useEventEmitter } from 'ahooks'
+import type { EventEmitter } from 'ahooks/lib/useEventEmitter'
+
+const EventEmitterContext = createContext<{ eventEmitter: EventEmitter<string> | null }>({
+  eventEmitter: null,
+})
+
+export const useEventEmitterContextContext = () => useContext(EventEmitterContext)
+
+type EventEmitterContextProviderProps = {
+  children: React.ReactNode
+}
+export const EventEmitterContextProvider = ({
+  children,
+}: EventEmitterContextProviderProps) => {
+  const eventEmitter = useEventEmitter<string>()
+
+  return (
+    <EventEmitterContext.Provider value={{ eventEmitter }}>
+      {children}
+    </EventEmitterContext.Provider>
+  )
+}
+
+export default EventEmitterContext
diff --git a/context/explore-context.ts b/context/explore-context.ts
new file mode 100644
index 0000000..11124bd
--- /dev/null
+++ b/context/explore-context.ts
@@ -0,0 +1,21 @@
+import { createContext } from 'use-context-selector'
+import type { InstalledApp } from '@/models/explore'
+import { noop } from 'lodash-es'
+
+type IExplore = {
+  controlUpdateInstalledApps: number
+  setControlUpdateInstalledApps: (controlUpdateInstalledApps: number) => void
+  hasEditPermission: boolean
+  installedApps: InstalledApp[]
+  setInstalledApps: (installedApps: InstalledApp[]) => void
+}
+
+const ExploreContext = createContext<IExplore>({
+  controlUpdateInstalledApps: 0,
+  setControlUpdateInstalledApps: noop,
+  hasEditPermission: false,
+  installedApps: [],
+  setInstalledApps: noop,
+})
+
+export default ExploreContext
diff --git a/context/external-api-panel-context.tsx b/context/external-api-panel-context.tsx
new file mode 100644
index 0000000..05ae5c4
--- /dev/null
+++ b/context/external-api-panel-context.tsx
@@ -0,0 +1,28 @@
+'use client'
+
+import React, { createContext, useContext, useState } from 'react'
+
+type ExternalApiPanelContextType = {
+  showExternalApiPanel: boolean
+  setShowExternalApiPanel: (show: boolean) => void
+}
+
+const ExternalApiPanelContext = createContext<ExternalApiPanelContextType | undefined>(undefined)
+
+export const ExternalApiPanelProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
+  const [showExternalApiPanel, setShowExternalApiPanel] = useState(false)
+
+  return (
+    <ExternalApiPanelContext.Provider value={{ showExternalApiPanel, setShowExternalApiPanel }}>
+      {children}
+    </ExternalApiPanelContext.Provider>
+  )
+}
+
+export const useExternalApiPanel = () => {
+  const context = useContext(ExternalApiPanelContext)
+  if (context === undefined)
+    throw new Error('useExternalApiPanel must be used within an ExternalApiPanelProvider')
+
+  return context
+}
diff --git a/context/external-knowledge-api-context.tsx b/context/external-knowledge-api-context.tsx
new file mode 100644
index 0000000..5f2d2ff
--- /dev/null
+++ b/context/external-knowledge-api-context.tsx
@@ -0,0 +1,46 @@
+'use client'
+
+import { createContext, useContext, useMemo } from 'react'
+import type { FC, ReactNode } from 'react'
+import useSWR from 'swr'
+import type { ExternalAPIItem, ExternalAPIListResponse } from '@/models/datasets'
+import { fetchExternalAPIList } from '@/service/datasets'
+
+type ExternalKnowledgeApiContextType = {
+  externalKnowledgeApiList: ExternalAPIItem[]
+  mutateExternalKnowledgeApis: () => Promise<ExternalAPIListResponse | undefined>
+  isLoading: boolean
+}
+
+const ExternalKnowledgeApiContext = createContext<ExternalKnowledgeApiContextType | undefined>(undefined)
+
+export type ExternalKnowledgeApiProviderProps = {
+  children: ReactNode
+}
+
+export const ExternalKnowledgeApiProvider: FC<ExternalKnowledgeApiProviderProps> = ({ children }) => {
+  const { data, mutate: mutateExternalKnowledgeApis, isLoading } = useSWR<ExternalAPIListResponse>(
+    { url: '/datasets/external-knowledge-api' },
+    fetchExternalAPIList,
+  )
+
+  const contextValue = useMemo<ExternalKnowledgeApiContextType>(() => ({
+    externalKnowledgeApiList: data?.data || [],
+    mutateExternalKnowledgeApis,
+    isLoading,
+  }), [data, mutateExternalKnowledgeApis, isLoading])
+
+  return (
+    <ExternalKnowledgeApiContext.Provider value={contextValue}>
+      {children}
+    </ExternalKnowledgeApiContext.Provider>
+  )
+}
+
+export const useExternalKnowledgeApi = () => {
+  const context = useContext(ExternalKnowledgeApiContext)
+  if (context === undefined)
+    throw new Error('useExternalKnowledgeApi must be used within a ExternalKnowledgeApiProvider')
+
+  return context
+}
diff --git a/context/i18n.ts b/context/i18n.ts
new file mode 100644
index 0000000..463e01d
--- /dev/null
+++ b/context/i18n.ts
@@ -0,0 +1,38 @@
+import {
+  createContext,
+  useContext,
+} from 'use-context-selector'
+import type { Locale } from '@/i18n'
+import { getDocLanguage, getLanguage, getPricingPageLanguage } from '@/i18n/language'
+import { noop } from 'lodash-es'
+
+type II18NContext = {
+  locale: Locale
+  i18n: Record<string, any>
+  setLocaleOnClient: (_lang: Locale, _reloadPage?: boolean) => void
+}
+
+const I18NContext = createContext<II18NContext>({
+  locale: 'en-US',
+  i18n: {},
+  setLocaleOnClient: noop,
+})
+
+export const useI18N = () => useContext(I18NContext)
+export const useGetLanguage = () => {
+  const { locale } = useI18N()
+
+  return getLanguage(locale)
+}
+export const useGetDocLanguage = () => {
+  const { locale } = useI18N()
+
+  return getDocLanguage(locale)
+}
+export const useGetPricingPageLanguage = () => {
+  const { locale } = useI18N()
+
+  return getPricingPageLanguage(locale)
+}
+
+export default I18NContext
diff --git a/context/modal-context.tsx b/context/modal-context.tsx
new file mode 100644
index 0000000..d865903
--- /dev/null
+++ b/context/modal-context.tsx
@@ -0,0 +1,380 @@
+'use client'
+
+import type { Dispatch, SetStateAction } from 'react'
+import { useCallback, useState } from 'react'
+import { createContext, useContext, useContextSelector } from 'use-context-selector'
+import { useRouter, useSearchParams } from 'next/navigation'
+import AccountSetting from '@/app/components/header/account-setting'
+import ApiBasedExtensionModal from '@/app/components/header/account-setting/api-based-extension-page/modal'
+import ModerationSettingModal from '@/app/components/base/features/new-feature-panel/moderation/moderation-setting-modal'
+import ExternalDataToolModal from '@/app/components/app/configuration/tools/external-data-tool-modal'
+import AnnotationFullModal from '@/app/components/billing/annotation-full/modal'
+import ModelModal from '@/app/components/header/account-setting/model-provider-page/model-modal'
+import ExternalAPIModal from '@/app/components/datasets/external-api/external-api-modal'
+import type {
+  ConfigurationMethodEnum,
+  CustomConfigurationModelFixedFields,
+  ModelLoadBalancingConfigEntry,
+  ModelProvider,
+} from '@/app/components/header/account-setting/model-provider-page/declarations'
+import {
+  EDUCATION_VERIFYING_LOCALSTORAGE_ITEM,
+} from '@/app/education-apply/constants'
+import Pricing from '@/app/components/billing/pricing'
+import type { ModerationConfig, PromptVariable } from '@/models/debug'
+import type {
+  ApiBasedExtension,
+  ExternalDataTool,
+} from '@/models/common'
+import type { CreateExternalAPIReq } from '@/app/components/datasets/external-api/declarations'
+import ModelLoadBalancingEntryModal from '@/app/components/header/account-setting/model-provider-page/model-modal/model-load-balancing-entry-modal'
+import type { ModelLoadBalancingModalProps } from '@/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-modal'
+import ModelLoadBalancingModal from '@/app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-modal'
+import OpeningSettingModal from '@/app/components/base/features/new-feature-panel/conversation-opener/modal'
+import type { OpeningStatement } from '@/app/components/base/features/types'
+import type { InputVar } from '@/app/components/workflow/types'
+import type { UpdatePluginPayload } from '@/app/components/plugins/types'
+import UpdatePlugin from '@/app/components/plugins/update-plugin'
+import { removeSpecificQueryParam } from '@/utils'
+import { noop } from 'lodash-es'
+
+export type ModalState<T> = {
+  payload: T
+  onCancelCallback?: () => void
+  onSaveCallback?: (newPayload: T) => void
+  onRemoveCallback?: (newPayload: T) => void
+  onEditCallback?: (newPayload: T) => void
+  onValidateBeforeSaveCallback?: (newPayload: T) => boolean
+  isEditMode?: boolean
+  datasetBindings?: { id: string; name: string }[]
+}
+
+export type ModelModalType = {
+  currentProvider: ModelProvider
+  currentConfigurationMethod: ConfigurationMethodEnum
+  currentCustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields
+}
+export type LoadBalancingEntryModalType = ModelModalType & {
+  entry?: ModelLoadBalancingConfigEntry
+  index?: number
+}
+
+export type ModalContextState = {
+  setShowAccountSettingModal: Dispatch<SetStateAction<ModalState<string> | null>>
+  setShowApiBasedExtensionModal: Dispatch<SetStateAction<ModalState<ApiBasedExtension> | null>>
+  setShowModerationSettingModal: Dispatch<SetStateAction<ModalState<ModerationConfig> | null>>
+  setShowExternalDataToolModal: Dispatch<SetStateAction<ModalState<ExternalDataTool> | null>>
+  setShowPricingModal: () => void
+  setShowAnnotationFullModal: () => void
+  setShowModelModal: Dispatch<SetStateAction<ModalState<ModelModalType> | null>>
+  setShowExternalKnowledgeAPIModal: Dispatch<SetStateAction<ModalState<CreateExternalAPIReq> | null>>
+  setShowModelLoadBalancingModal: Dispatch<SetStateAction<ModelLoadBalancingModalProps | null>>
+  setShowModelLoadBalancingEntryModal: Dispatch<SetStateAction<ModalState<LoadBalancingEntryModalType> | null>>
+  setShowOpeningModal: Dispatch<SetStateAction<ModalState<OpeningStatement & {
+    promptVariables?: PromptVariable[]
+    workflowVariables?: InputVar[]
+    onAutoAddPromptVariable?: (variable: PromptVariable[]) => void
+  }> | null>>
+  setShowUpdatePluginModal: Dispatch<SetStateAction<ModalState<UpdatePluginPayload> | null>>
+}
+const ModalContext = createContext<ModalContextState>({
+  setShowAccountSettingModal: noop,
+  setShowApiBasedExtensionModal: noop,
+  setShowModerationSettingModal: noop,
+  setShowExternalDataToolModal: noop,
+  setShowPricingModal: noop,
+  setShowAnnotationFullModal: noop,
+  setShowModelModal: noop,
+  setShowExternalKnowledgeAPIModal: noop,
+  setShowModelLoadBalancingModal: noop,
+  setShowModelLoadBalancingEntryModal: noop,
+  setShowOpeningModal: noop,
+  setShowUpdatePluginModal: noop,
+})
+
+export const useModalContext = () => useContext(ModalContext)
+
+// Adding a dangling comma to avoid the generic parsing issue in tsx, see:
+// https://github.com/microsoft/TypeScript/issues/15713
+export const useModalContextSelector = <T,>(selector: (state: ModalContextState) => T): T =>
+  useContextSelector(ModalContext, selector)
+
+type ModalContextProviderProps = {
+  children: React.ReactNode
+}
+export const ModalContextProvider = ({
+  children,
+}: ModalContextProviderProps) => {
+  const [showAccountSettingModal, setShowAccountSettingModal] = useState<ModalState<string> | null>(null)
+  const [showApiBasedExtensionModal, setShowApiBasedExtensionModal] = useState<ModalState<ApiBasedExtension> | null>(null)
+  const [showModerationSettingModal, setShowModerationSettingModal] = useState<ModalState<ModerationConfig> | null>(null)
+  const [showExternalDataToolModal, setShowExternalDataToolModal] = useState<ModalState<ExternalDataTool> | null>(null)
+  const [showModelModal, setShowModelModal] = useState<ModalState<ModelModalType> | null>(null)
+  const [showExternalKnowledgeAPIModal, setShowExternalKnowledgeAPIModal] = useState<ModalState<CreateExternalAPIReq> | null>(null)
+  const [showModelLoadBalancingModal, setShowModelLoadBalancingModal] = useState<ModelLoadBalancingModalProps | null>(null)
+  const [showModelLoadBalancingEntryModal, setShowModelLoadBalancingEntryModal] = useState<ModalState<LoadBalancingEntryModalType> | null>(null)
+  const [showOpeningModal, setShowOpeningModal] = useState<ModalState<OpeningStatement & {
+    promptVariables?: PromptVariable[]
+    workflowVariables?: InputVar[]
+    onAutoAddPromptVariable?: (variable: PromptVariable[]) => void
+  }> | null>(null)
+  const [showUpdatePluginModal, setShowUpdatePluginModal] = useState<ModalState<UpdatePluginPayload> | null>(null)
+
+  const searchParams = useSearchParams()
+  const router = useRouter()
+  const [showPricingModal, setShowPricingModal] = useState(searchParams.get('show-pricing') === '1')
+  const [showAnnotationFullModal, setShowAnnotationFullModal] = useState(false)
+  const handleCancelAccountSettingModal = () => {
+    const educationVerifying = localStorage.getItem(EDUCATION_VERIFYING_LOCALSTORAGE_ITEM)
+
+    if (educationVerifying === 'yes')
+      localStorage.removeItem(EDUCATION_VERIFYING_LOCALSTORAGE_ITEM)
+
+    removeSpecificQueryParam('action')
+    setShowAccountSettingModal(null)
+    if (showAccountSettingModal?.onCancelCallback)
+      showAccountSettingModal?.onCancelCallback()
+  }
+
+  const handleCancelModerationSettingModal = () => {
+    setShowModerationSettingModal(null)
+    if (showModerationSettingModal?.onCancelCallback)
+      showModerationSettingModal.onCancelCallback()
+  }
+
+  const handleCancelExternalDataToolModal = () => {
+    setShowExternalDataToolModal(null)
+    if (showExternalDataToolModal?.onCancelCallback)
+      showExternalDataToolModal.onCancelCallback()
+  }
+
+  const handleCancelModelModal = useCallback(() => {
+    setShowModelModal(null)
+    if (showModelModal?.onCancelCallback)
+      showModelModal.onCancelCallback()
+  }, [showModelModal])
+
+  const handleSaveModelModal = useCallback(() => {
+    if (showModelModal?.onSaveCallback)
+      showModelModal.onSaveCallback(showModelModal.payload)
+    setShowModelModal(null)
+  }, [showModelModal])
+
+  const handleCancelExternalApiModal = useCallback(() => {
+    setShowExternalKnowledgeAPIModal(null)
+    if (showExternalKnowledgeAPIModal?.onCancelCallback)
+      showExternalKnowledgeAPIModal.onCancelCallback()
+  }, [showExternalKnowledgeAPIModal])
+
+  const handleSaveExternalApiModal = useCallback(async (updatedFormValue: CreateExternalAPIReq) => {
+    if (showExternalKnowledgeAPIModal?.onSaveCallback)
+      showExternalKnowledgeAPIModal.onSaveCallback(updatedFormValue)
+    setShowExternalKnowledgeAPIModal(null)
+  }, [showExternalKnowledgeAPIModal])
+
+  const handleEditExternalApiModal = useCallback(async (updatedFormValue: CreateExternalAPIReq) => {
+    if (showExternalKnowledgeAPIModal?.onEditCallback)
+      showExternalKnowledgeAPIModal.onEditCallback(updatedFormValue)
+    setShowExternalKnowledgeAPIModal(null)
+  }, [showExternalKnowledgeAPIModal])
+
+  const handleCancelModelLoadBalancingEntryModal = useCallback(() => {
+    showModelLoadBalancingEntryModal?.onCancelCallback?.()
+    setShowModelLoadBalancingEntryModal(null)
+  }, [showModelLoadBalancingEntryModal])
+
+  const handleCancelOpeningModal = useCallback(() => {
+    setShowOpeningModal(null)
+    if (showOpeningModal?.onCancelCallback)
+      showOpeningModal.onCancelCallback()
+  }, [showOpeningModal])
+
+  const handleSaveModelLoadBalancingEntryModal = useCallback((entry: ModelLoadBalancingConfigEntry) => {
+    showModelLoadBalancingEntryModal?.onSaveCallback?.({
+      ...showModelLoadBalancingEntryModal.payload,
+      entry,
+    })
+    setShowModelLoadBalancingEntryModal(null)
+  }, [showModelLoadBalancingEntryModal])
+
+  const handleRemoveModelLoadBalancingEntry = useCallback(() => {
+    showModelLoadBalancingEntryModal?.onRemoveCallback?.(showModelLoadBalancingEntryModal.payload)
+    setShowModelLoadBalancingEntryModal(null)
+  }, [showModelLoadBalancingEntryModal])
+
+  const handleSaveApiBasedExtension = (newApiBasedExtension: ApiBasedExtension) => {
+    if (showApiBasedExtensionModal?.onSaveCallback)
+      showApiBasedExtensionModal.onSaveCallback(newApiBasedExtension)
+    setShowApiBasedExtensionModal(null)
+  }
+
+  const handleSaveModeration = (newModerationConfig: ModerationConfig) => {
+    if (showModerationSettingModal?.onSaveCallback)
+      showModerationSettingModal.onSaveCallback(newModerationConfig)
+    setShowModerationSettingModal(null)
+  }
+
+  const handleSaveExternalDataTool = (newExternalDataTool: ExternalDataTool) => {
+    if (showExternalDataToolModal?.onSaveCallback)
+      showExternalDataToolModal.onSaveCallback(newExternalDataTool)
+    setShowExternalDataToolModal(null)
+  }
+
+  const handleValidateBeforeSaveExternalDataTool = (newExternalDataTool: ExternalDataTool) => {
+    if (showExternalDataToolModal?.onValidateBeforeSaveCallback)
+      return showExternalDataToolModal?.onValidateBeforeSaveCallback(newExternalDataTool)
+    return true
+  }
+
+  const handleSaveOpeningModal = (newOpening: OpeningStatement) => {
+    if (showOpeningModal?.onSaveCallback)
+      showOpeningModal.onSaveCallback(newOpening)
+    setShowOpeningModal(null)
+  }
+
+  return (
+    <ModalContext.Provider value={{
+      setShowAccountSettingModal,
+      setShowApiBasedExtensionModal,
+      setShowModerationSettingModal,
+      setShowExternalDataToolModal,
+      setShowPricingModal: () => setShowPricingModal(true),
+      setShowAnnotationFullModal: () => setShowAnnotationFullModal(true),
+      setShowModelModal,
+      setShowExternalKnowledgeAPIModal,
+      setShowModelLoadBalancingModal,
+      setShowModelLoadBalancingEntryModal,
+      setShowOpeningModal,
+      setShowUpdatePluginModal,
+    }}>
+      <>
+        {children}
+        {
+          !!showAccountSettingModal && (
+            <AccountSetting
+              activeTab={showAccountSettingModal.payload}
+              onCancel={handleCancelAccountSettingModal}
+            />
+          )
+        }
+
+        {
+          !!showApiBasedExtensionModal && (
+            <ApiBasedExtensionModal
+              data={showApiBasedExtensionModal.payload}
+              onCancel={() => setShowApiBasedExtensionModal(null)}
+              onSave={handleSaveApiBasedExtension}
+            />
+          )
+        }
+        {
+          !!showModerationSettingModal && (
+            <ModerationSettingModal
+              data={showModerationSettingModal.payload}
+              onCancel={handleCancelModerationSettingModal}
+              onSave={handleSaveModeration}
+            />
+          )
+        }
+        {
+          !!showExternalDataToolModal && (
+            <ExternalDataToolModal
+              data={showExternalDataToolModal.payload}
+              onCancel={handleCancelExternalDataToolModal}
+              onSave={handleSaveExternalDataTool}
+              onValidateBeforeSave={handleValidateBeforeSaveExternalDataTool}
+            />
+          )
+        }
+
+        {
+          !!showPricingModal && (
+            <Pricing onCancel={() => {
+              if (searchParams.get('show-pricing') === '1')
+                router.push(location.pathname, { forceOptimisticNavigation: true } as any)
+
+              setShowPricingModal(false)
+            }} />
+          )
+        }
+
+        {
+          showAnnotationFullModal && (
+            <AnnotationFullModal
+              show={showAnnotationFullModal}
+              onHide={() => setShowAnnotationFullModal(false)} />
+          )
+        }
+        {
+          !!showModelModal && (
+            <ModelModal
+              provider={showModelModal.payload.currentProvider}
+              configurateMethod={showModelModal.payload.currentConfigurationMethod}
+              currentCustomConfigurationModelFixedFields={showModelModal.payload.currentCustomConfigurationModelFixedFields}
+              onCancel={handleCancelModelModal}
+              onSave={handleSaveModelModal}
+            />
+          )
+        }
+        {
+          !!showExternalKnowledgeAPIModal && (
+            <ExternalAPIModal
+              data={showExternalKnowledgeAPIModal.payload}
+              datasetBindings={showExternalKnowledgeAPIModal.datasetBindings ?? []}
+              onSave={handleSaveExternalApiModal}
+              onCancel={handleCancelExternalApiModal}
+              onEdit={handleEditExternalApiModal}
+              isEditMode={showExternalKnowledgeAPIModal.isEditMode ?? false}
+            />
+          )
+        }
+        {
+          Boolean(showModelLoadBalancingModal) && (
+            <ModelLoadBalancingModal {...showModelLoadBalancingModal!} />
+          )
+        }
+        {
+          !!showModelLoadBalancingEntryModal && (
+            <ModelLoadBalancingEntryModal
+              provider={showModelLoadBalancingEntryModal.payload.currentProvider}
+              configurationMethod={showModelLoadBalancingEntryModal.payload.currentConfigurationMethod}
+              currentCustomConfigurationModelFixedFields={showModelLoadBalancingEntryModal.payload.currentCustomConfigurationModelFixedFields}
+              entry={showModelLoadBalancingEntryModal.payload.entry}
+              onCancel={handleCancelModelLoadBalancingEntryModal}
+              onSave={handleSaveModelLoadBalancingEntryModal}
+              onRemove={handleRemoveModelLoadBalancingEntry}
+            />
+          )
+        }
+        {showOpeningModal && (
+          <OpeningSettingModal
+            data={showOpeningModal.payload}
+            onSave={handleSaveOpeningModal}
+            onCancel={handleCancelOpeningModal}
+            promptVariables={showOpeningModal.payload.promptVariables}
+            workflowVariables={showOpeningModal.payload.workflowVariables}
+            onAutoAddPromptVariable={showOpeningModal.payload.onAutoAddPromptVariable}
+          />
+        )}
+
+        {
+          !!showUpdatePluginModal && (
+            <UpdatePlugin
+              {...showUpdatePluginModal.payload}
+              onCancel={() => {
+                setShowUpdatePluginModal(null)
+                showUpdatePluginModal.onCancelCallback?.()
+              }}
+              onSave={() => {
+                setShowUpdatePluginModal(null)
+                showUpdatePluginModal.onSaveCallback?.({} as any)
+              }}
+            />
+          )
+        }
+      </>
+    </ModalContext.Provider>
+  )
+}
+
+export default ModalContext
diff --git a/context/provider-context.tsx b/context/provider-context.tsx
new file mode 100644
index 0000000..90af9aa
--- /dev/null
+++ b/context/provider-context.tsx
@@ -0,0 +1,201 @@
+'use client'
+
+import { createContext, useContext, useContextSelector } from 'use-context-selector'
+import useSWR from 'swr'
+import { useEffect, useState } from 'react'
+import dayjs from 'dayjs'
+import { useTranslation } from 'react-i18next'
+import {
+  fetchModelList,
+  fetchModelProviders,
+  fetchSupportRetrievalMethods,
+} from '@/service/common'
+import {
+  CurrentSystemQuotaTypeEnum,
+  ModelStatusEnum,
+  ModelTypeEnum,
+} from '@/app/components/header/account-setting/model-provider-page/declarations'
+import type { Model, ModelProvider } from '@/app/components/header/account-setting/model-provider-page/declarations'
+import type { RETRIEVE_METHOD } from '@/types/app'
+import type { BasicPlan } from '@/app/components/billing/type'
+import { Plan, type UsagePlanInfo } from '@/app/components/billing/type'
+import { fetchCurrentPlanInfo } from '@/service/billing'
+import { parseCurrentPlan } from '@/app/components/billing/utils'
+import { defaultPlan } from '@/app/components/billing/config'
+import Toast from '@/app/components/base/toast'
+import {
+  useEducationStatus,
+} from '@/service/use-education'
+import { noop } from 'lodash-es'
+
+type ProviderContextState = {
+  modelProviders: ModelProvider[]
+  refreshModelProviders: () => void
+  textGenerationModelList: Model[]
+  supportRetrievalMethods: RETRIEVE_METHOD[]
+  isAPIKeySet: boolean
+  plan: {
+    type: BasicPlan
+    usage: UsagePlanInfo
+    total: UsagePlanInfo
+  }
+  isFetchedPlan: boolean
+  enableBilling: boolean
+  onPlanInfoChanged: () => void
+  enableReplaceWebAppLogo: boolean
+  modelLoadBalancingEnabled: boolean
+  datasetOperatorEnabled: boolean
+  enableEducationPlan: boolean
+  isEducationWorkspace: boolean
+  isEducationAccount: boolean
+}
+const ProviderContext = createContext<ProviderContextState>({
+  modelProviders: [],
+  refreshModelProviders: noop,
+  textGenerationModelList: [],
+  supportRetrievalMethods: [],
+  isAPIKeySet: true,
+  plan: {
+    type: Plan.sandbox,
+    usage: {
+      vectorSpace: 32,
+      buildApps: 12,
+      teamMembers: 1,
+      annotatedResponse: 1,
+      documentsUploadQuota: 50,
+    },
+    total: {
+      vectorSpace: 200,
+      buildApps: 50,
+      teamMembers: 1,
+      annotatedResponse: 10,
+      documentsUploadQuota: 500,
+    },
+  },
+  isFetchedPlan: false,
+  enableBilling: false,
+  onPlanInfoChanged: noop,
+  enableReplaceWebAppLogo: false,
+  modelLoadBalancingEnabled: false,
+  datasetOperatorEnabled: false,
+  enableEducationPlan: false,
+  isEducationWorkspace: false,
+  isEducationAccount: false,
+})
+
+export const useProviderContext = () => useContext(ProviderContext)
+
+// Adding a dangling comma to avoid the generic parsing issue in tsx, see:
+// https://github.com/microsoft/TypeScript/issues/15713
+export const useProviderContextSelector = <T,>(selector: (state: ProviderContextState) => T): T =>
+  useContextSelector(ProviderContext, selector)
+
+type ProviderContextProviderProps = {
+  children: React.ReactNode
+}
+export const ProviderContextProvider = ({
+  children,
+}: ProviderContextProviderProps) => {
+  const { data: providersData, mutate: refreshModelProviders } = useSWR('/workspaces/current/model-providers', fetchModelProviders)
+  const fetchModelListUrlPrefix = '/workspaces/current/models/model-types/'
+  const { data: textGenerationModelList } = useSWR(`${fetchModelListUrlPrefix}${ModelTypeEnum.textGeneration}`, fetchModelList)
+  const { data: supportRetrievalMethods } = useSWR('/datasets/retrieval-setting', fetchSupportRetrievalMethods)
+
+  const [plan, setPlan] = useState(defaultPlan)
+  const [isFetchedPlan, setIsFetchedPlan] = useState(false)
+  const [enableBilling, setEnableBilling] = useState(true)
+  const [enableReplaceWebAppLogo, setEnableReplaceWebAppLogo] = useState(false)
+  const [modelLoadBalancingEnabled, setModelLoadBalancingEnabled] = useState(false)
+  const [datasetOperatorEnabled, setDatasetOperatorEnabled] = useState(false)
+
+  const [enableEducationPlan, setEnableEducationPlan] = useState(false)
+  const [isEducationWorkspace, setIsEducationWorkspace] = useState(false)
+  const { data: isEducationAccount } = useEducationStatus(!enableEducationPlan)
+
+  const fetchPlan = async () => {
+    try {
+      const data = await fetchCurrentPlanInfo()
+      if (!data) {
+        console.error('Failed to fetch plan info: data is undefined')
+        return
+      }
+
+      // set default value to avoid undefined error
+      setEnableBilling(data.billing?.enabled ?? false)
+      setEnableEducationPlan(data.education?.enabled ?? false)
+      setIsEducationWorkspace(data.education?.activated ?? false)
+      setEnableReplaceWebAppLogo(data.can_replace_logo ?? false)
+
+      if (data.billing?.enabled) {
+        setPlan(parseCurrentPlan(data) as any)
+        setIsFetchedPlan(true)
+      }
+
+      if (data.model_load_balancing_enabled)
+        setModelLoadBalancingEnabled(true)
+      if (data.dataset_operator_enabled)
+        setDatasetOperatorEnabled(true)
+    }
+    catch (error) {
+      console.error('Failed to fetch plan info:', error)
+      // set default value to avoid undefined error
+      setEnableBilling(false)
+      setEnableEducationPlan(false)
+      setIsEducationWorkspace(false)
+      setEnableReplaceWebAppLogo(false)
+    }
+  }
+  useEffect(() => {
+    fetchPlan()
+  }, [])
+
+  const { t } = useTranslation()
+  useEffect(() => {
+    if (localStorage.getItem('anthropic_quota_notice') === 'true')
+      return
+
+    if (dayjs().isAfter(dayjs('2025-03-17')))
+      return
+
+    if (providersData?.data && providersData.data.length > 0) {
+      const anthropic = providersData.data.find(provider => provider.provider === 'anthropic')
+      if (anthropic && anthropic.system_configuration.current_quota_type === CurrentSystemQuotaTypeEnum.trial) {
+        const quota = anthropic.system_configuration.quota_configurations.find(item => item.quota_type === anthropic.system_configuration.current_quota_type)
+        if (quota && quota.is_valid && quota.quota_used < quota.quota_limit) {
+          Toast.notify({
+            type: 'info',
+            message: t('common.provider.anthropicHosted.trialQuotaTip'),
+            duration: 60000,
+            onClose: () => {
+              localStorage.setItem('anthropic_quota_notice', 'true')
+            },
+          })
+        }
+      }
+    }
+  }, [providersData, t])
+
+  return (
+    <ProviderContext.Provider value={{
+      modelProviders: providersData?.data || [],
+      refreshModelProviders,
+      textGenerationModelList: textGenerationModelList?.data || [],
+      isAPIKeySet: !!textGenerationModelList?.data.some(model => model.status === ModelStatusEnum.active),
+      supportRetrievalMethods: supportRetrievalMethods?.retrieval_method || [],
+      plan,
+      isFetchedPlan,
+      enableBilling,
+      onPlanInfoChanged: fetchPlan,
+      enableReplaceWebAppLogo,
+      modelLoadBalancingEnabled,
+      datasetOperatorEnabled,
+      enableEducationPlan,
+      isEducationWorkspace,
+      isEducationAccount: isEducationAccount?.result || false,
+    }}>
+      {children}
+    </ProviderContext.Provider>
+  )
+}
+
+export default ProviderContext
diff --git a/context/query-client.tsx b/context/query-client.tsx
new file mode 100644
index 0000000..f859305
--- /dev/null
+++ b/context/query-client.tsx
@@ -0,0 +1,23 @@
+'use client'
+
+import type { FC, PropsWithChildren } from 'react'
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
+import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
+
+const STALE_TIME = 1000 * 60 * 30 // 30 minutes
+
+const client = new QueryClient({
+  defaultOptions: {
+    queries: {
+      staleTime: STALE_TIME,
+    },
+  },
+})
+
+export const TanstackQueryIniter: FC<PropsWithChildren> = (props) => {
+  const { children } = props
+  return <QueryClientProvider client={client}>
+    {children}
+    <ReactQueryDevtools initialIsOpen={false} />
+  </QueryClientProvider>
+}
diff --git a/context/workspace-context.tsx b/context/workspace-context.tsx
new file mode 100644
index 0000000..9350a95
--- /dev/null
+++ b/context/workspace-context.tsx
@@ -0,0 +1,36 @@
+'use client'
+
+import { createContext, useContext } from 'use-context-selector'
+import useSWR from 'swr'
+import { fetchWorkspaces } from '@/service/common'
+import type { IWorkspace } from '@/models/common'
+
+export type WorkspacesContextValue = {
+  workspaces: IWorkspace[]
+}
+
+const WorkspacesContext = createContext<WorkspacesContextValue>({
+  workspaces: [],
+})
+
+type IWorkspaceProviderProps = {
+  children: React.ReactNode
+}
+
+export const WorkspaceProvider = ({
+  children,
+}: IWorkspaceProviderProps) => {
+  const { data } = useSWR({ url: '/workspaces' }, fetchWorkspaces)
+
+  return (
+    <WorkspacesContext.Provider value={{
+      workspaces: data?.workspaces || [],
+    }}>
+      {children}
+    </WorkspacesContext.Provider>
+  )
+}
+
+export const useWorkspacesContext = () => useContext(WorkspacesContext)
+
+export default WorkspacesContext
diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh
new file mode 100644
index 0000000..b9f0255
--- /dev/null
+++ b/docker/entrypoint.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+
+
+# if you are using windows, you may need to convert the file to unix format
+# you can use the Ubuntu terminal to convert this file to unix format
+# otherwise, you may get the error after running the docker container
+
+# sudo apt-get install dos2unix
+# dos2unix entrypoint.sh
+
+
+set -e
+
+export NEXT_PUBLIC_DEPLOY_ENV=${DEPLOY_ENV}
+export NEXT_PUBLIC_EDITION=${EDITION}
+export NEXT_PUBLIC_API_PREFIX=${CONSOLE_API_URL}/console/api
+export NEXT_PUBLIC_WEB_PREFIX=${CONSOLE_WEB_URL}
+export NEXT_PUBLIC_PUBLIC_API_PREFIX=${APP_API_URL}/api
+export NEXT_PUBLIC_PUBLIC_WEB_PREFIX=${APP_WEB_URL}
+export NEXT_PUBLIC_MARKETPLACE_API_PREFIX=${MARKETPLACE_API_URL}/api/v1
+export NEXT_PUBLIC_MARKETPLACE_URL_PREFIX=${MARKETPLACE_URL}
+
+export NEXT_PUBLIC_SENTRY_DSN=${SENTRY_DSN}
+export NEXT_PUBLIC_SITE_ABOUT=${SITE_ABOUT}
+export NEXT_TELEMETRY_DISABLED=${NEXT_TELEMETRY_DISABLED}
+
+export NEXT_PUBLIC_TEXT_GENERATION_TIMEOUT_MS=${TEXT_GENERATION_TIMEOUT_MS}
+export NEXT_PUBLIC_CSP_WHITELIST=${CSP_WHITELIST}
+export NEXT_PUBLIC_ALLOW_EMBED=${ALLOW_EMBED}
+export NEXT_PUBLIC_TOP_K_MAX_VALUE=${TOP_K_MAX_VALUE}
+export NEXT_PUBLIC_INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=${INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH}
+export NEXT_PUBLIC_MAX_TOOLS_NUM=${MAX_TOOLS_NUM}
+export NEXT_PUBLIC_ENABLE_WEBSITE_JINAREADER=${ENABLE_WEBSITE_JINAREADER:-true}
+export NEXT_PUBLIC_ENABLE_WEBSITE_FIRECRAWL=${ENABLE_WEBSITE_FIRECRAWL:-true}
+export NEXT_PUBLIC_ENABLE_WEBSITE_WATERCRAWL=${ENABLE_WEBSITE_WATERCRAWL:-true}
+export NEXT_PUBLIC_LOOP_NODE_MAX_COUNT=${LOOP_NODE_MAX_COUNT}
+export NEXT_PUBLIC_MAX_PARALLEL_LIMIT=${MAX_PARALLEL_LIMIT}
+export NEXT_PUBLIC_MAX_ITERATIONS_NUM=${MAX_ITERATIONS_NUM}
+pm2 start /app/web/server.js --name dify-web --cwd /app/web -i ${PM2_INSTANCES} --no-daemon
diff --git a/docker/pm2.json b/docker/pm2.json
new file mode 100644
index 0000000..85e5171
--- /dev/null
+++ b/docker/pm2.json
@@ -0,0 +1,11 @@
+{
+  "apps": [
+    {
+      "name": "dify-web",
+      "script": "/app/web/server.js",
+      "cwd": "/app/web",
+      "exec_mode": "cluster",
+      "instances": 2
+    }
+  ]
+}
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 0000000..d40d963
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,249 @@
+import {
+  GLOB_TESTS, combine, javascript, node,
+  stylistic, typescript, unicorn,
+} from '@antfu/eslint-config'
+import globals from 'globals'
+import storybook from 'eslint-plugin-storybook'
+// import { fixupConfigRules } from '@eslint/compat'
+import tailwind from 'eslint-plugin-tailwindcss'
+import reactHooks from 'eslint-plugin-react-hooks'
+import sonar from 'eslint-plugin-sonarjs'
+
+// import reactRefresh from 'eslint-plugin-react-refresh'
+
+export default combine(
+  stylistic({
+    lessOpinionated: true,
+    // original @antfu/eslint-config does not support jsx
+    jsx: false,
+    semi: false,
+    quotes: 'single',
+    overrides: {
+      // original config
+      'style/indent': ['error', 2],
+      'style/quotes': ['error', 'single'],
+      'curly': ['error', 'multi-or-nest', 'consistent'],
+      'style/comma-spacing': ['error', { before: false, after: true }],
+      'style/quote-props': ['warn', 'consistent-as-needed'],
+
+      // these options does not exist in old version
+      // maybe useless
+      'style/indent-binary-ops': 'off',
+      'style/multiline-ternary': 'off',
+      'antfu/top-level-function': 'off',
+      'antfu/curly': 'off',
+      'antfu/consistent-chaining': 'off',
+
+      // copy from eslint-config-antfu 0.36.0
+      'style/brace-style': ['error', 'stroustrup', { allowSingleLine: true }],
+      'style/dot-location': ['error', 'property'],
+      'style/object-curly-newline': ['error', { consistent: true, multiline: true }],
+      'style/object-property-newline': ['error', { allowMultiplePropertiesPerLine: true }],
+      'style/template-curly-spacing': ['error', 'never'],
+      'style/keyword-spacing': 'off',
+
+      // not exist in old version, and big change
+      'style/member-delimiter-style': 'off',
+    },
+  }),
+  javascript({
+    overrides: {
+      // handled by unused-imports/no-unused-vars
+      'no-unused-vars': 'off',
+    },
+  }),
+  typescript({
+    overrides: {
+      // original config
+      'ts/consistent-type-definitions': ['warn', 'type'],
+
+      // useful, but big change
+      'ts/no-empty-object-type': 'off',
+    },
+  }),
+  unicorn(),
+  node(),
+  // use nextjs config will break @eslint/config-inspector
+  // use `ESLINT_CONFIG_INSPECTOR=true pnpx @eslint/config-inspector` to check the config
+  // ...process.env.ESLINT_CONFIG_INSPECTOR
+  //   ? []
+  {
+    rules: {
+      // performance issue, and not used.
+      '@next/next/no-html-link-for-pages': 'off',
+    },
+  },
+  {
+    ignores: [
+      '**/node_modules/*',
+      '**/dist/',
+      '**/build/',
+      '**/out/',
+      '**/.next/',
+      '**/public/*',
+      '**/*.json',
+    ],
+  },
+  {
+    // orignal config
+    rules: {
+      // orignal ts/no-var-requires
+      'ts/no-require-imports': 'off',
+      'no-console': 'off',
+      'react-hooks/exhaustive-deps': 'warn',
+      'react/display-name': 'off',
+      'array-callback-return': ['error', {
+        allowImplicit: false,
+        checkForEach: false,
+      }],
+
+      // copy from eslint-config-antfu 0.36.0
+      'camelcase': 'off',
+      'default-case-last': 'error',
+
+      // antfu use eslint-plugin-perfectionist to replace this
+      // will cause big change, so keep the original sort-imports
+      'sort-imports': [
+        'error',
+        {
+          ignoreCase: false,
+          ignoreDeclarationSort: true,
+          ignoreMemberSort: false,
+          memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'],
+          allowSeparatedGroups: false,
+        },
+      ],
+
+      // antfu migrate to eslint-plugin-unused-imports
+      'unused-imports/no-unused-vars': 'warn',
+      'unused-imports/no-unused-imports': 'warn',
+
+      // We use `import { noop } from 'lodash-es'` across `web` project
+      'no-empty-function': 'error',
+    },
+
+    languageOptions: {
+      globals: {
+        ...globals.browser,
+        ...globals.es2025,
+        ...globals.node,
+        React: 'readable',
+        JSX: 'readable',
+      },
+    },
+  },
+  storybook.configs['flat/recommended'],
+  // reactRefresh.configs.recommended,
+  {
+    rules: reactHooks.configs.recommended.rules,
+    plugins: {
+      'react-hooks': reactHooks,
+    },
+  },
+  // sonar
+  {
+    rules: {
+      ...sonar.configs.recommended.rules,
+      // code complexity
+      'sonarjs/cognitive-complexity': 'off',
+      'sonarjs/no-nested-functions': 'warn',
+      'sonarjs/no-nested-conditional': 'warn',
+      'sonarjs/nested-control-flow': 'warn', // 3 levels of nesting
+      'sonarjs/no-small-switch': 'off',
+      'sonarjs/no-nested-template-literals': 'warn',
+      'sonarjs/redundant-type-aliases': 'off',
+      'sonarjs/regex-complexity': 'warn',
+      // maintainability
+      'sonarjs/no-ignored-exceptions': 'off',
+      'sonarjs/no-commented-code': 'warn',
+      'sonarjs/no-unused-vars': 'warn',
+      'sonarjs/prefer-single-boolean-return': 'warn',
+      'sonarjs/duplicates-in-character-class': 'off',
+      'sonarjs/single-char-in-character-classes': 'off',
+      'sonarjs/anchor-precedence': 'warn',
+      'sonarjs/updated-loop-counter': 'off',
+      'sonarjs/no-dead-store': 'warn',
+      'sonarjs/no-duplicated-branches': 'warn',
+      'sonarjs/max-lines': 'warn', // max 1000 lines
+      'sonarjs/no-variable-usage-before-declaration': 'error',
+      // security
+      // eslint-disable-next-line sonarjs/no-hardcoded-passwords
+      'sonarjs/no-hardcoded-passwords': 'off', // detect the wrong code that is not password.
+      'sonarjs/no-hardcoded-secrets': 'off',
+      'sonarjs/pseudo-random': 'off',
+      // performance
+      'sonarjs/slow-regex': 'warn',
+      // others
+      'sonarjs/todo-tag': 'warn',
+      'sonarjs/table-header': 'off',
+    },
+    plugins: {
+      sonarjs: sonar,
+    },
+  },
+  // need further research
+  {
+    rules: {
+      // not exist in old version
+      'antfu/consistent-list-newline': 'off',
+      'node/prefer-global/process': 'off',
+      'node/prefer-global/buffer': 'off',
+      'node/no-callback-literal': 'off',
+
+      // useful, but big change
+      'unicorn/prefer-number-properties': 'warn',
+      'unicorn/no-new-array': 'warn',
+      'style/indent': 'off',
+    },
+  },
+  // suppress error for `no-undef` rule
+  {
+    files: GLOB_TESTS,
+    languageOptions: {
+      globals: {
+        ...globals.browser,
+        ...globals.es2021,
+        ...globals.node,
+        ...globals.jest,
+      },
+    },
+  },
+  tailwind.configs['flat/recommended'],
+  {
+    settings: {
+      tailwindcss: {
+        // These are the default values but feel free to customize
+        callees: ['classnames', 'clsx', 'ctl', 'cn'],
+        config: 'tailwind.config.js', // returned from `loadConfig()` utility if not provided
+        cssFiles: [
+          '**/*.css',
+          '!**/node_modules',
+          '!**/.*',
+          '!**/dist',
+          '!**/build',
+          '!**/.storybook',
+          '!**/.next',
+          '!**/.public',
+        ],
+        cssFilesRefreshRate: 5_000,
+        removeDuplicates: true,
+        skipClassAttribute: false,
+        whitelist: [],
+        tags: [], // can be set to e.g. ['tw'] for use in tw`bg-blue`
+        classRegex: '^class(Name)?$', // can be modified to support custom attributes. E.g. "^tw$" for `twin.macro`
+      },
+    },
+    rules: {
+      // due to 1k lines of tailwind config, these rule have performance issue
+      'tailwindcss/no-contradicting-classname': 'off',
+      'tailwindcss/enforces-shorthand': 'off',
+      'tailwindcss/no-custom-classname': 'off',
+      'tailwindcss/no-unnecessary-arbitrary-value': 'off',
+
+      'tailwindcss/no-arbitrary-value': 'off',
+      'tailwindcss/classnames-order': 'warn',
+      'tailwindcss/enforces-negative-arbitrary-values': 'warn',
+      'tailwindcss/migration-from-tailwind-2': 'warn',
+    },
+  },
+)
diff --git a/global.d.ts b/global.d.ts
new file mode 100644
index 0000000..c2d1c96
--- /dev/null
+++ b/global.d.ts
@@ -0,0 +1,5 @@
+declare module 'lamejs';
+declare module 'lamejs/src/js/MPEGMode';
+declare module 'lamejs/src/js/Lame';
+declare module 'lamejs/src/js/BitStream';
+declare module 'react-18-input-autosize';
diff --git a/hooks/use-app-favicon.ts b/hooks/use-app-favicon.ts
new file mode 100644
index 0000000..e8a0173
--- /dev/null
+++ b/hooks/use-app-favicon.ts
@@ -0,0 +1,44 @@
+import { useAsyncEffect } from 'ahooks'
+import { appDefaultIconBackground } from '@/config'
+import { searchEmoji } from '@/utils/emoji'
+import type { AppIconType } from '@/types/app'
+
+type UseAppFaviconOptions = {
+  enable?: boolean
+  icon_type?: AppIconType | null
+  icon?: string
+  icon_background?: string | null
+  icon_url?: string | null
+}
+
+export function useAppFavicon(options: UseAppFaviconOptions) {
+  const {
+    enable = true,
+    icon_type = 'emoji',
+    icon,
+    icon_background,
+    icon_url,
+  } = options
+
+  useAsyncEffect(async () => {
+    if (!enable || (icon_type === 'image' && !icon_url) || (icon_type === 'emoji' && !icon))
+      return
+
+    const isValidImageIcon = icon_type === 'image' && icon_url
+
+    const link: HTMLLinkElement = document.querySelector('link[rel*="icon"]') || document.createElement('link')
+
+    link.href = isValidImageIcon
+      ? icon_url
+      : 'data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22>'
+            + `<rect width=%22100%25%22 height=%22100%25%22 fill=%22${encodeURIComponent(icon_background || appDefaultIconBackground)}%22 rx=%2230%22 ry=%2230%22 />`
+            + `<text x=%2212.5%22 y=%221em%22 font-size=%2275%22>${
+              icon ? await searchEmoji(icon) : '馃'
+            }</text>`
+            + '</svg>'
+
+    link.rel = 'shortcut icon'
+    link.type = 'image/svg'
+    document.getElementsByTagName('head')[0].appendChild(link)
+  }, [enable, icon, icon_background])
+}
diff --git a/hooks/use-breakpoints.spec.ts b/hooks/use-breakpoints.spec.ts
new file mode 100644
index 0000000..315e514
--- /dev/null
+++ b/hooks/use-breakpoints.spec.ts
@@ -0,0 +1,93 @@
+import { act, renderHook } from '@testing-library/react'
+import useBreakpoints, { MediaType } from './use-breakpoints'
+
+describe('useBreakpoints', () => {
+  const originalInnerWidth = window.innerWidth
+
+  // Mock the window resize event
+  const fireResize = (width: number) => {
+    window.innerWidth = width
+    act(() => {
+      window.dispatchEvent(new Event('resize'))
+    })
+  }
+
+  // Restore the original innerWidth after tests
+  afterAll(() => {
+    window.innerWidth = originalInnerWidth
+  })
+
+  it('should return mobile for width <= 640px', () => {
+    // Mock window.innerWidth for mobile
+    Object.defineProperty(window, 'innerWidth', {
+      writable: true,
+      configurable: true,
+      value: 640,
+    })
+
+    const { result } = renderHook(() => useBreakpoints())
+    expect(result.current).toBe(MediaType.mobile)
+  })
+
+  it('should return tablet for width > 640px and <= 768px', () => {
+    // Mock window.innerWidth for tablet
+    Object.defineProperty(window, 'innerWidth', {
+      writable: true,
+      configurable: true,
+      value: 768,
+    })
+
+    const { result } = renderHook(() => useBreakpoints())
+    expect(result.current).toBe(MediaType.tablet)
+  })
+
+  it('should return pc for width > 768px', () => {
+    // Mock window.innerWidth for pc
+    Object.defineProperty(window, 'innerWidth', {
+      writable: true,
+      configurable: true,
+      value: 1024,
+    })
+
+    const { result } = renderHook(() => useBreakpoints())
+    expect(result.current).toBe(MediaType.pc)
+  })
+
+  it('should update media type when window resizes', () => {
+    // Start with desktop
+    Object.defineProperty(window, 'innerWidth', {
+      writable: true,
+      configurable: true,
+      value: 1024,
+    })
+
+    const { result } = renderHook(() => useBreakpoints())
+    expect(result.current).toBe(MediaType.pc)
+
+    // Resize to tablet
+    fireResize(768)
+    expect(result.current).toBe(MediaType.tablet)
+
+    // Resize to mobile
+    fireResize(600)
+    expect(result.current).toBe(MediaType.mobile)
+  })
+
+  it('should clean up event listeners on unmount', () => {
+    // Spy on addEventListener and removeEventListener
+    const addEventListenerSpy = jest.spyOn(window, 'addEventListener')
+    const removeEventListenerSpy = jest.spyOn(window, 'removeEventListener')
+
+    const { unmount } = renderHook(() => useBreakpoints())
+
+    // Unmount should trigger cleanup
+    unmount()
+
+    expect(addEventListenerSpy).toHaveBeenCalledWith('resize', expect.any(Function))
+    expect(removeEventListenerSpy).toHaveBeenCalledWith('resize', expect.any(Function))
+
+    // Clean up spies
+    addEventListenerSpy.mockRestore()
+    removeEventListenerSpy.mockRestore()
+  })
+})
diff --git a/hooks/use-breakpoints.ts b/hooks/use-breakpoints.ts
new file mode 100644
index 0000000..99c2b75
--- /dev/null
+++ b/hooks/use-breakpoints.ts
@@ -0,0 +1,29 @@
+'use client'
+import React from 'react'
+
+export enum MediaType {
+  mobile = 'mobile',
+  tablet = 'tablet',
+  pc = 'pc',
+}
+
+const useBreakpoints = () => {
+  const [width, setWidth] = React.useState(globalThis.innerWidth)
+  const media = (() => {
+    if (width <= 640)
+      return MediaType.mobile
+    if (width <= 768)
+      return MediaType.tablet
+    return MediaType.pc
+  })()
+
+  React.useEffect(() => {
+    const handleWindowResize = () => setWidth(window.innerWidth)
+    window.addEventListener('resize', handleWindowResize)
+    return () => window.removeEventListener('resize', handleWindowResize)
+  }, [])
+
+  return media
+}
+
+export default useBreakpoints
diff --git a/hooks/use-i18n.ts b/hooks/use-i18n.ts
new file mode 100644
index 0000000..c2356b1
--- /dev/null
+++ b/hooks/use-i18n.ts
@@ -0,0 +1,9 @@
+import { useLanguage } from '@/app/components/header/account-setting/model-provider-page/hooks'
+import { renderI18nObject } from '@/i18n'
+
+export const useRenderI18nObject = () => {
+  const language = useLanguage()
+  return (obj: Record<string, string>) => {
+    return renderI18nObject(obj, language)
+  }
+}
diff --git a/hooks/use-import-dsl.ts b/hooks/use-import-dsl.ts
new file mode 100644
index 0000000..e5fafb1
--- /dev/null
+++ b/hooks/use-import-dsl.ts
@@ -0,0 +1,163 @@
+import {
+  useCallback,
+  useRef,
+  useState,
+} from 'react'
+import { useTranslation } from 'react-i18next'
+import { useRouter } from 'next/navigation'
+import type {
+  DSLImportMode,
+  DSLImportResponse,
+} from '@/models/app'
+import { DSLImportStatus } from '@/models/app'
+import {
+  importDSL,
+  importDSLConfirm,
+} from '@/service/apps'
+import type { AppIconType } from '@/types/app'
+import { useToastContext } from '@/app/components/base/toast'
+import { usePluginDependencies } from '@/app/components/workflow/plugin-dependency/hooks'
+import { getRedirection } from '@/utils/app-redirection'
+import { useSelector } from '@/context/app-context'
+import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
+
+type DSLPayload = {
+  mode: DSLImportMode
+  yaml_content?: string
+  yaml_url?: string
+  name?: string
+  icon_type?: AppIconType
+  icon?: string
+  icon_background?: string
+  description?: string
+}
+type ResponseCallback = {
+  onSuccess?: () => void
+  onPending?: (payload: DSLImportResponse) => void
+  onFailed?: () => void
+}
+export const useImportDSL = () => {
+  const { t } = useTranslation()
+  const { notify } = useToastContext()
+  const [isFetching, setIsFetching] = useState(false)
+  const { handleCheckPluginDependencies } = usePluginDependencies()
+  const isCurrentWorkspaceEditor = useSelector(s => s.isCurrentWorkspaceEditor)
+  const { push } = useRouter()
+  const [versions, setVersions] = useState<{ importedVersion: string; systemVersion: string }>()
+  const importIdRef = useRef<string>('')
+
+  const handleImportDSL = useCallback(async (
+    payload: DSLPayload,
+    {
+      onSuccess,
+      onPending,
+      onFailed,
+    }: ResponseCallback,
+  ) => {
+    if (isFetching)
+      return
+    setIsFetching(true)
+
+    try {
+      const response = await importDSL(payload)
+
+      if (!response)
+        return
+
+      const {
+        id,
+        status,
+        app_id,
+        app_mode,
+        imported_dsl_version,
+        current_dsl_version,
+      } = response
+
+      if (status === DSLImportStatus.COMPLETED || status === DSLImportStatus.COMPLETED_WITH_WARNINGS) {
+        if (!app_id)
+          return
+
+        notify({
+          type: status === DSLImportStatus.COMPLETED ? 'success' : 'warning',
+          message: t(status === DSLImportStatus.COMPLETED ? 'app.newApp.appCreated' : 'app.newApp.caution'),
+          children: status === DSLImportStatus.COMPLETED_WITH_WARNINGS && t('app.newApp.appCreateDSLWarning'),
+        })
+        onSuccess?.()
+        localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
+        await handleCheckPluginDependencies(app_id)
+        getRedirection(isCurrentWorkspaceEditor, { id: app_id, mode: app_mode }, push)
+      }
+      else if (status === DSLImportStatus.PENDING) {
+        setVersions({
+          importedVersion: imported_dsl_version ?? '',
+          systemVersion: current_dsl_version ?? '',
+        })
+        importIdRef.current = id
+        onPending?.(response)
+      }
+      else {
+        notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
+        onFailed?.()
+      }
+    }
+    catch {
+      notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
+      onFailed?.()
+    }
+    finally {
+      setIsFetching(false)
+    }
+  }, [t, notify, handleCheckPluginDependencies, isCurrentWorkspaceEditor, push, isFetching])
+
+  const handleImportDSLConfirm = useCallback(async (
+    {
+      onSuccess,
+      onFailed,
+    }: Pick<ResponseCallback, 'onSuccess' | 'onFailed'>,
+  ) => {
+    if (isFetching)
+      return
+    setIsFetching(true)
+    if (!importIdRef.current)
+      return
+
+    try {
+      const response = await importDSLConfirm({
+        import_id: importIdRef.current,
+      })
+
+      const { status, app_id, app_mode } = response
+      if (!app_id)
+        return
+
+      if (status === DSLImportStatus.COMPLETED) {
+        onSuccess?.()
+        notify({
+          type: 'success',
+          message: t('app.newApp.appCreated'),
+        })
+        await handleCheckPluginDependencies(app_id)
+        localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1')
+        getRedirection(isCurrentWorkspaceEditor, { id: app_id!, mode: app_mode }, push)
+      }
+      else if (status === DSLImportStatus.FAILED) {
+        notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
+        onFailed?.()
+      }
+    }
+    catch {
+      notify({ type: 'error', message: t('app.newApp.appCreateFailed') })
+      onFailed?.()
+    }
+    finally {
+      setIsFetching(false)
+    }
+  }, [t, notify, handleCheckPluginDependencies, isCurrentWorkspaceEditor, push, isFetching])
+
+  return {
+    handleImportDSL,
+    handleImportDSLConfirm,
+    versions,
+    isFetching,
+  }
+}
diff --git a/hooks/use-knowledge.ts b/hooks/use-knowledge.ts
new file mode 100644
index 0000000..400d972
--- /dev/null
+++ b/hooks/use-knowledge.ts
@@ -0,0 +1,32 @@
+import { useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
+
+export const useKnowledge = () => {
+  const { t } = useTranslation()
+
+  const formatIndexingTechnique = useCallback((indexingTechnique: string) => {
+    return t(`dataset.indexingTechnique.${indexingTechnique}`)
+  }, [t])
+
+  const formatIndexingMethod = useCallback((indexingMethod: string, isEco?: boolean) => {
+    if (isEco)
+      return t('dataset.indexingMethod.invertedIndex')
+
+    return t(`dataset.indexingMethod.${indexingMethod}`)
+  }, [t])
+
+  const formatIndexingTechniqueAndMethod = useCallback((indexingTechnique: string, indexingMethod: string) => {
+    let result = formatIndexingTechnique(indexingTechnique)
+
+    if (indexingMethod)
+      result += ` 路 ${formatIndexingMethod(indexingMethod, indexingTechnique === 'economy')}`
+
+    return result
+  }, [formatIndexingTechnique, formatIndexingMethod])
+
+  return {
+    formatIndexingTechnique,
+    formatIndexingMethod,
+    formatIndexingTechniqueAndMethod,
+  }
+}
diff --git a/hooks/use-metadata.ts b/hooks/use-metadata.ts
new file mode 100644
index 0000000..ee02b31
--- /dev/null
+++ b/hooks/use-metadata.ts
@@ -0,0 +1,395 @@
+'use client'
+import { useTranslation } from 'react-i18next'
+import { formatFileSize, formatNumber, formatTime } from '@/utils/format'
+import { type DocType, ProcessMode } from '@/models/datasets'
+import useTimestamp from '@/hooks/use-timestamp'
+
+export type inputType = 'input' | 'select' | 'textarea'
+export type metadataType = DocType | 'originInfo' | 'technicalParameters'
+
+type MetadataMap =
+  Record<
+    metadataType,
+    {
+      text: string
+      allowEdit?: boolean
+      icon?: React.ReactNode
+      iconName?: string
+      subFieldsMap: Record<
+        string,
+        {
+          label: string
+          inputType?: inputType
+          field?: string
+          render?: (value: any, total?: number) => React.ReactNode | string
+        }
+      >
+    }
+  >
+
+const fieldPrefix = 'datasetDocuments.metadata.field'
+
+export const useMetadataMap = (): MetadataMap => {
+  const { t } = useTranslation()
+  const { formatTime: formatTimestamp } = useTimestamp()
+
+  return {
+    book: {
+      text: t('datasetDocuments.metadata.type.book'),
+      iconName: 'bookOpen',
+      subFieldsMap: {
+        title: { label: t(`${fieldPrefix}.book.title`) },
+        language: {
+          label: t(`${fieldPrefix}.book.language`),
+          inputType: 'select',
+        },
+        author: { label: t(`${fieldPrefix}.book.author`) },
+        publisher: { label: t(`${fieldPrefix}.book.publisher`) },
+        publication_date: { label: t(`${fieldPrefix}.book.publicationDate`) },
+        isbn: { label: t(`${fieldPrefix}.book.ISBN`) },
+        category: {
+          label: t(`${fieldPrefix}.book.category`),
+          inputType: 'select',
+        },
+      },
+    },
+    web_page: {
+      text: t('datasetDocuments.metadata.type.webPage'),
+      iconName: 'globe',
+      subFieldsMap: {
+        'title': { label: t(`${fieldPrefix}.webPage.title`) },
+        'url': { label: t(`${fieldPrefix}.webPage.url`) },
+        'language': {
+          label: t(`${fieldPrefix}.webPage.language`),
+          inputType: 'select',
+        },
+        'author/publisher': { label: t(`${fieldPrefix}.webPage.authorPublisher`) },
+        'publish_date': { label: t(`${fieldPrefix}.webPage.publishDate`) },
+        'topic/keywords': { label: t(`${fieldPrefix}.webPage.topicKeywords`) },
+        'description': { label: t(`${fieldPrefix}.webPage.description`) },
+      },
+    },
+    paper: {
+      text: t('datasetDocuments.metadata.type.paper'),
+      iconName: 'graduationHat',
+      subFieldsMap: {
+        'title': { label: t(`${fieldPrefix}.paper.title`) },
+        'language': {
+          label: t(`${fieldPrefix}.paper.language`),
+          inputType: 'select',
+        },
+        'author': { label: t(`${fieldPrefix}.paper.author`) },
+        'publish_date': { label: t(`${fieldPrefix}.paper.publishDate`) },
+        'journal/conference_name': {
+          label: t(`${fieldPrefix}.paper.journalConferenceName`),
+        },
+        'volume/issue/page_numbers': { label: t(`${fieldPrefix}.paper.volumeIssuePage`) },
+        'doi': { label: t(`${fieldPrefix}.paper.DOI`) },
+        'topic/keywords': { label: t(`${fieldPrefix}.paper.topicKeywords`) },
+        'abstract': {
+          label: t(`${fieldPrefix}.paper.abstract`),
+          inputType: 'textarea',
+        },
+      },
+    },
+    social_media_post: {
+      text: t('datasetDocuments.metadata.type.socialMediaPost'),
+      iconName: 'atSign',
+      subFieldsMap: {
+        'platform': { label: t(`${fieldPrefix}.socialMediaPost.platform`) },
+        'author/username': {
+          label: t(`${fieldPrefix}.socialMediaPost.authorUsername`),
+        },
+        'publish_date': { label: t(`${fieldPrefix}.socialMediaPost.publishDate`) },
+        'post_url': { label: t(`${fieldPrefix}.socialMediaPost.postURL`) },
+        'topics/tags': { label: t(`${fieldPrefix}.socialMediaPost.topicsTags`) },
+      },
+    },
+    personal_document: {
+      text: t('datasetDocuments.metadata.type.personalDocument'),
+      iconName: 'file',
+      subFieldsMap: {
+        'title': { label: t(`${fieldPrefix}.personalDocument.title`) },
+        'author': { label: t(`${fieldPrefix}.personalDocument.author`) },
+        'creation_date': {
+          label: t(`${fieldPrefix}.personalDocument.creationDate`),
+        },
+        'last_modified_date': {
+          label: t(`${fieldPrefix}.personalDocument.lastModifiedDate`),
+        },
+        'document_type': {
+          label: t(`${fieldPrefix}.personalDocument.documentType`),
+          inputType: 'select',
+        },
+        'tags/category': {
+          label: t(`${fieldPrefix}.personalDocument.tagsCategory`),
+        },
+      },
+    },
+    business_document: {
+      text: t('datasetDocuments.metadata.type.businessDocument'),
+      iconName: 'briefcase',
+      subFieldsMap: {
+        'title': { label: t(`${fieldPrefix}.businessDocument.title`) },
+        'author': { label: t(`${fieldPrefix}.businessDocument.author`) },
+        'creation_date': {
+          label: t(`${fieldPrefix}.businessDocument.creationDate`),
+        },
+        'last_modified_date': {
+          label: t(`${fieldPrefix}.businessDocument.lastModifiedDate`),
+        },
+        'document_type': {
+          label: t(`${fieldPrefix}.businessDocument.documentType`),
+          inputType: 'select',
+        },
+        'department/team': {
+          label: t(`${fieldPrefix}.businessDocument.departmentTeam`),
+        },
+      },
+    },
+    im_chat_log: {
+      text: t('datasetDocuments.metadata.type.IMChat'),
+      iconName: 'messageTextCircle',
+      subFieldsMap: {
+        'chat_platform': { label: t(`${fieldPrefix}.IMChat.chatPlatform`) },
+        'chat_participants/group_name': {
+          label: t(`${fieldPrefix}.IMChat.chatPartiesGroupName`),
+        },
+        'start_date': { label: t(`${fieldPrefix}.IMChat.startDate`) },
+        'end_date': { label: t(`${fieldPrefix}.IMChat.endDate`) },
+        'participants': { label: t(`${fieldPrefix}.IMChat.participants`) },
+        'topicKeywords': {
+          label: t(`${fieldPrefix}.IMChat.topicKeywords`),
+          inputType: 'textarea',
+        },
+        'fileType': { label: t(`${fieldPrefix}.IMChat.fileType`) },
+      },
+    },
+    wikipedia_entry: {
+      text: t('datasetDocuments.metadata.type.wikipediaEntry'),
+      allowEdit: false,
+      subFieldsMap: {
+        'title': { label: t(`${fieldPrefix}.wikipediaEntry.title`) },
+        'language': {
+          label: t(`${fieldPrefix}.wikipediaEntry.language`),
+          inputType: 'select',
+        },
+        'web_page_url': { label: t(`${fieldPrefix}.wikipediaEntry.webpageURL`) },
+        'editor/contributor': {
+          label: t(`${fieldPrefix}.wikipediaEntry.editorContributor`),
+        },
+        'last_edit_date': {
+          label: t(`${fieldPrefix}.wikipediaEntry.lastEditDate`),
+        },
+        'summary/introduction': {
+          label: t(`${fieldPrefix}.wikipediaEntry.summaryIntroduction`),
+          inputType: 'textarea',
+        },
+      },
+    },
+    synced_from_notion: {
+      text: t('datasetDocuments.metadata.type.notion'),
+      allowEdit: false,
+      subFieldsMap: {
+        'title': { label: t(`${fieldPrefix}.notion.title`) },
+        'language': { label: t(`${fieldPrefix}.notion.lang`), inputType: 'select' },
+        'author/creator': { label: t(`${fieldPrefix}.notion.author`) },
+        'creation_date': { label: t(`${fieldPrefix}.notion.createdTime`) },
+        'last_modified_date': {
+          label: t(`${fieldPrefix}.notion.lastModifiedTime`),
+        },
+        'notion_page_link': { label: t(`${fieldPrefix}.notion.url`) },
+        'category/tags': { label: t(`${fieldPrefix}.notion.tag`) },
+        'description': { label: t(`${fieldPrefix}.notion.desc`) },
+      },
+    },
+    synced_from_github: {
+      text: t('datasetDocuments.metadata.type.github'),
+      allowEdit: false,
+      subFieldsMap: {
+        'repository_name': { label: t(`${fieldPrefix}.github.repoName`) },
+        'repository_description': { label: t(`${fieldPrefix}.github.repoDesc`) },
+        'repository_owner/organization': { label: t(`${fieldPrefix}.github.repoOwner`) },
+        'code_filename': { label: t(`${fieldPrefix}.github.fileName`) },
+        'code_file_path': { label: t(`${fieldPrefix}.github.filePath`) },
+        'programming_language': { label: t(`${fieldPrefix}.github.programmingLang`) },
+        'github_link': { label: t(`${fieldPrefix}.github.url`) },
+        'open_source_license': { label: t(`${fieldPrefix}.github.license`) },
+        'commit_date': { label: t(`${fieldPrefix}.github.lastCommitTime`) },
+        'commit_author': {
+          label: t(`${fieldPrefix}.github.lastCommitAuthor`),
+        },
+      },
+    },
+    originInfo: {
+      text: '',
+      allowEdit: false,
+      subFieldsMap: {
+        'name': { label: t(`${fieldPrefix}.originInfo.originalFilename`) },
+        'data_source_info.upload_file.size': {
+          label: t(`${fieldPrefix}.originInfo.originalFileSize`),
+          render: value => formatFileSize(value),
+        },
+        'created_at': {
+          label: t(`${fieldPrefix}.originInfo.uploadDate`),
+          render: value => formatTimestamp(value, t('datasetDocuments.metadata.dateTimeFormat') as string),
+        },
+        'completed_at': {
+          label: t(`${fieldPrefix}.originInfo.lastUpdateDate`),
+          render: value => formatTimestamp(value, t('datasetDocuments.metadata.dateTimeFormat') as string),
+        },
+        'data_source_type': {
+          label: t(`${fieldPrefix}.originInfo.source`),
+          render: value => t(`datasetDocuments.metadata.source.${value === 'notion_import' ? 'notion' : value}`),
+        },
+      },
+    },
+    technicalParameters: {
+      text: t('datasetDocuments.metadata.type.technicalParameters'),
+      allowEdit: false,
+      subFieldsMap: {
+        'dataset_process_rule.mode': {
+          label: t(`${fieldPrefix}.technicalParameters.segmentSpecification`),
+          render: value => value === ProcessMode.general ? (t('datasetDocuments.embedding.custom') as string) : (t('datasetDocuments.embedding.hierarchical') as string),
+        },
+        'dataset_process_rule.rules.segmentation.max_tokens': {
+          label: t(`${fieldPrefix}.technicalParameters.segmentLength`),
+          render: value => formatNumber(value),
+        },
+        'average_segment_length': {
+          label: t(`${fieldPrefix}.technicalParameters.avgParagraphLength`),
+          render: value => `${formatNumber(value)} characters`,
+        },
+        'segment_count': {
+          label: t(`${fieldPrefix}.technicalParameters.paragraphs`),
+          render: value => `${formatNumber(value)} paragraphs`,
+        },
+        'hit_count': {
+          label: t(`${fieldPrefix}.technicalParameters.hitCount`),
+          render: (value, total) => {
+            const v = value || 0
+            return `${!total ? 0 : ((v / total) * 100).toFixed(2)}% (${v}/${total})`
+          },
+        },
+        'indexing_latency': {
+          label: t(`${fieldPrefix}.technicalParameters.embeddingTime`),
+          render: value => formatTime(value),
+        },
+        'tokens': {
+          label: t(`${fieldPrefix}.technicalParameters.embeddedSpend`),
+          render: value => `${formatNumber(value)} tokens`,
+        },
+      },
+    },
+  }
+}
+
+const langPrefix = 'datasetDocuments.metadata.languageMap.'
+
+export const useLanguages = () => {
+  const { t } = useTranslation()
+  return {
+    zh: t(`${langPrefix}zh`),
+    en: t(`${langPrefix}en`),
+    es: t(`${langPrefix}es`),
+    fr: t(`${langPrefix}fr`),
+    de: t(`${langPrefix}de`),
+    ja: t(`${langPrefix}ja`),
+    ko: t(`${langPrefix}ko`),
+    ru: t(`${langPrefix}ru`),
+    ar: t(`${langPrefix}ar`),
+    pt: t(`${langPrefix}pt`),
+    it: t(`${langPrefix}it`),
+    nl: t(`${langPrefix}nl`),
+    pl: t(`${langPrefix}pl`),
+    sv: t(`${langPrefix}sv`),
+    tr: t(`${langPrefix}tr`),
+    he: t(`${langPrefix}he`),
+    hi: t(`${langPrefix}hi`),
+    da: t(`${langPrefix}da`),
+    fi: t(`${langPrefix}fi`),
+    no: t(`${langPrefix}no`),
+    hu: t(`${langPrefix}hu`),
+    el: t(`${langPrefix}el`),
+    cs: t(`${langPrefix}cs`),
+    th: t(`${langPrefix}th`),
+    id: t(`${langPrefix}id`),
+    ro: t(`${langPrefix}ro`),
+  }
+}
+
+const bookCategoryPrefix = 'datasetDocuments.metadata.categoryMap.book.'
+
+export const useBookCategories = () => {
+  const { t } = useTranslation()
+  return {
+    fiction: t(`${bookCategoryPrefix}fiction`),
+    biography: t(`${bookCategoryPrefix}biography`),
+    history: t(`${bookCategoryPrefix}history`),
+    science: t(`${bookCategoryPrefix}science`),
+    technology: t(`${bookCategoryPrefix}technology`),
+    education: t(`${bookCategoryPrefix}education`),
+    philosophy: t(`${bookCategoryPrefix}philosophy`),
+    religion: t(`${bookCategoryPrefix}religion`),
+    socialSciences: t(`${bookCategoryPrefix}socialSciences`),
+    art: t(`${bookCategoryPrefix}art`),
+    travel: t(`${bookCategoryPrefix}travel`),
+    health: t(`${bookCategoryPrefix}health`),
+    selfHelp: t(`${bookCategoryPrefix}selfHelp`),
+    businessEconomics: t(`${bookCategoryPrefix}businessEconomics`),
+    cooking: t(`${bookCategoryPrefix}cooking`),
+    childrenYoungAdults: t(`${bookCategoryPrefix}childrenYoungAdults`),
+    comicsGraphicNovels: t(`${bookCategoryPrefix}comicsGraphicNovels`),
+    poetry: t(`${bookCategoryPrefix}poetry`),
+    drama: t(`${bookCategoryPrefix}drama`),
+    other: t(`${bookCategoryPrefix}other`),
+  }
+}
+
+const personalDocCategoryPrefix
+  = 'datasetDocuments.metadata.categoryMap.personalDoc.'
+
+export const usePersonalDocCategories = () => {
+  const { t } = useTranslation()
+  return {
+    notes: t(`${personalDocCategoryPrefix}notes`),
+    blogDraft: t(`${personalDocCategoryPrefix}blogDraft`),
+    diary: t(`${personalDocCategoryPrefix}diary`),
+    researchReport: t(`${personalDocCategoryPrefix}researchReport`),
+    bookExcerpt: t(`${personalDocCategoryPrefix}bookExcerpt`),
+    schedule: t(`${personalDocCategoryPrefix}schedule`),
+    list: t(`${personalDocCategoryPrefix}list`),
+    projectOverview: t(`${personalDocCategoryPrefix}projectOverview`),
+    photoCollection: t(`${personalDocCategoryPrefix}photoCollection`),
+    creativeWriting: t(`${personalDocCategoryPrefix}creativeWriting`),
+    codeSnippet: t(`${personalDocCategoryPrefix}codeSnippet`),
+    designDraft: t(`${personalDocCategoryPrefix}designDraft`),
+    personalResume: t(`${personalDocCategoryPrefix}personalResume`),
+    other: t(`${personalDocCategoryPrefix}other`),
+  }
+}
+
+const businessDocCategoryPrefix
+  = 'datasetDocuments.metadata.categoryMap.businessDoc.'
+
+export const useBusinessDocCategories = () => {
+  const { t } = useTranslation()
+  return {
+    meetingMinutes: t(`${businessDocCategoryPrefix}meetingMinutes`),
+    researchReport: t(`${businessDocCategoryPrefix}researchReport`),
+    proposal: t(`${businessDocCategoryPrefix}proposal`),
+    employeeHandbook: t(`${businessDocCategoryPrefix}employeeHandbook`),
+    trainingMaterials: t(`${businessDocCategoryPrefix}trainingMaterials`),
+    requirementsDocument: t(`${businessDocCategoryPrefix}requirementsDocument`),
+    designDocument: t(`${businessDocCategoryPrefix}designDocument`),
+    productSpecification: t(`${businessDocCategoryPrefix}productSpecification`),
+    financialReport: t(`${businessDocCategoryPrefix}financialReport`),
+    marketAnalysis: t(`${businessDocCategoryPrefix}marketAnalysis`),
+    projectPlan: t(`${businessDocCategoryPrefix}projectPlan`),
+    teamStructure: t(`${businessDocCategoryPrefix}teamStructure`),
+    policiesProcedures: t(`${businessDocCategoryPrefix}policiesProcedures`),
+    contractsAgreements: t(`${businessDocCategoryPrefix}contractsAgreements`),
+    emailCorrespondence: t(`${businessDocCategoryPrefix}emailCorrespondence`),
+    other: t(`${businessDocCategoryPrefix}other`),
+  }
+}
diff --git a/hooks/use-mitt.ts b/hooks/use-mitt.ts
new file mode 100644
index 0000000..584636c
--- /dev/null
+++ b/hooks/use-mitt.ts
@@ -0,0 +1,74 @@
+import type { Emitter, EventType, Handler, WildcardHandler } from 'mitt'
+import create from 'mitt'
+import { useEffect, useRef } from 'react'
+
+const merge = <T extends Record<string, any>>(
+  ...args: Array<T | undefined>
+): T => {
+  return Object.assign({}, ...args)
+}
+
+export type _Events = Record<EventType, unknown>
+
+export type UseSubscribeOption = {
+  /**
+     * Whether the subscription is enabled.
+     * @default true
+     */
+  enabled: boolean;
+}
+
+export type ExtendedOn<Events extends _Events> = {
+  <Key extends keyof Events>(
+    type: Key,
+    handler: Handler<Events[Key]>,
+    options?: UseSubscribeOption,
+  ): void;
+  (
+    type: '*',
+    handler: WildcardHandler<Events>,
+    option?: UseSubscribeOption,
+  ): void;
+}
+
+export type UseMittReturn<Events extends _Events> = {
+  useSubscribe: ExtendedOn<Events>;
+  emit: Emitter<Events>['emit'];
+}
+
+const defaultSubscribeOption: UseSubscribeOption = {
+  enabled: true,
+}
+
+function useMitt<Events extends _Events>(
+  mitt?: Emitter<Events>,
+): UseMittReturn<Events> {
+  const emitterRef = useRef<Emitter<Events> | undefined>(undefined)
+  if (!emitterRef.current)
+    emitterRef.current = mitt ?? create<Events>()
+
+  if (mitt && emitterRef.current !== mitt) {
+    emitterRef.current.off('*')
+    emitterRef.current = mitt
+  }
+  const emitter = emitterRef.current
+  const useSubscribe: ExtendedOn<Events> = (
+    type: string,
+    handler: any,
+    option?: UseSubscribeOption,
+  ) => {
+    const { enabled } = merge(defaultSubscribeOption, option)
+    useEffect(() => {
+      if (enabled) {
+        emitter.on(type, handler)
+        return () => emitter.off(type, handler)
+      }
+    })
+  }
+  return {
+    emit: emitter.emit,
+    useSubscribe,
+  }
+}
+
+export { useMitt }
diff --git a/hooks/use-moderate.ts b/hooks/use-moderate.ts
new file mode 100644
index 0000000..11b078f
--- /dev/null
+++ b/hooks/use-moderate.ts
@@ -0,0 +1,49 @@
+import { useEffect, useRef, useState } from 'react'
+import type { ModerationService } from '@/models/common'
+
+function splitStringByLength(inputString: string, chunkLength: number) {
+  const resultArray = []
+  for (let i = 0; i < inputString.length; i += chunkLength)
+    resultArray.push(inputString.substring(i, i + chunkLength))
+
+  return resultArray
+}
+
+export const useModerate = (
+  content: string,
+  stop: boolean,
+  moderationService: (text: string) => ReturnType<ModerationService>,
+  separateLength = 50,
+) => {
+  const moderatedContentMap = useRef<Map<number, string>>(new Map())
+  const moderatingIndex = useRef<number[]>([])
+  const [contentArr, setContentArr] = useState<string[]>([])
+
+  const handleModerate = () => {
+    const stringArr = splitStringByLength(content, separateLength)
+
+    const lastIndex = stringArr.length - 1
+    stringArr.forEach((item, index) => {
+      if (!(index in moderatingIndex.current) && !moderatedContentMap.current.get(index)) {
+        if (index === lastIndex && !stop)
+          return
+
+        moderatingIndex.current.push(index)
+        moderationService(item).then((res) => {
+          if (res.flagged) {
+            moderatedContentMap.current.set(index, res.text)
+            setContentArr([...stringArr.slice(0, index), res.text, ...stringArr.slice(index + 1)])
+          }
+        })
+      }
+    })
+
+    setContentArr(stringArr)
+  }
+  useEffect(() => {
+    if (content)
+      handleModerate()
+  }, [content, stop])
+
+  return contentArr.map((item, index) => moderatedContentMap.current.get(index) || item).join('')
+}
diff --git a/hooks/use-pay.tsx b/hooks/use-pay.tsx
new file mode 100644
index 0000000..3ba23b6
--- /dev/null
+++ b/hooks/use-pay.tsx
@@ -0,0 +1,119 @@
+'use client'
+
+import { useCallback, useEffect, useState } from 'react'
+import { useRouter, useSearchParams } from 'next/navigation'
+import { useTranslation } from 'react-i18next'
+import useSWR from 'swr'
+import {
+  fetchDataSourceNotionBinding,
+} from '@/service/common'
+import type { IConfirm } from '@/app/components/base/confirm'
+import Confirm from '@/app/components/base/confirm'
+
+export type ConfirmType = Pick<IConfirm, 'type' | 'title' | 'content'>
+
+export const useAnthropicCheckPay = () => {
+  const { t } = useTranslation()
+  const [confirm, setConfirm] = useState<ConfirmType | null>(null)
+  const searchParams = useSearchParams()
+  const providerName = searchParams.get('provider_name')
+  const paymentResult = searchParams.get('payment_result')
+
+  useEffect(() => {
+    if (providerName === 'anthropic' && (paymentResult === 'succeeded' || paymentResult === 'cancelled')) {
+      setConfirm({
+        type: paymentResult === 'succeeded' ? 'info' : 'warning',
+        title: paymentResult === 'succeeded' ? t('common.actionMsg.paySucceeded') : t('common.actionMsg.payCancelled'),
+      })
+    }
+  }, [providerName, paymentResult, t])
+
+  return confirm
+}
+
+export const useBillingPay = () => {
+  const { t } = useTranslation()
+  const [confirm, setConfirm] = useState<ConfirmType | null>(null)
+  const searchParams = useSearchParams()
+  const paymentType = searchParams.get('payment_type')
+  const paymentResult = searchParams.get('payment_result')
+
+  useEffect(() => {
+    if (paymentType === 'billing' && (paymentResult === 'succeeded' || paymentResult === 'cancelled')) {
+      setConfirm({
+        type: paymentResult === 'succeeded' ? 'info' : 'warning',
+        title: paymentResult === 'succeeded' ? t('common.actionMsg.paySucceeded') : t('common.actionMsg.payCancelled'),
+      })
+    }
+  }, [paymentType, paymentResult, t])
+
+  return confirm
+}
+
+export const useCheckNotion = () => {
+  const router = useRouter()
+  const [confirm, setConfirm] = useState<ConfirmType | null>(null)
+  const [canBinding, setCanBinding] = useState(false)
+  const searchParams = useSearchParams()
+  const type = searchParams.get('type')
+  const notionCode = searchParams.get('code')
+  const notionError = searchParams.get('error')
+  const { data } = useSWR(
+    (canBinding && notionCode)
+      ? `/oauth/data-source/binding/notion?code=${notionCode}`
+      : null,
+    fetchDataSourceNotionBinding,
+  )
+
+  useEffect(() => {
+    if (data)
+      router.replace('/')
+  }, [data, router])
+  useEffect(() => {
+    if (type === 'notion') {
+      if (notionError) {
+        setConfirm({
+          type: 'warning',
+          title: notionError,
+        })
+      }
+      else if (notionCode) {
+        setCanBinding(true)
+      }
+    }
+  }, [type, notionCode, notionError])
+
+  return confirm
+}
+
+export const CheckModal = () => {
+  const router = useRouter()
+  const { t } = useTranslation()
+  const [showPayStatusModal, setShowPayStatusModal] = useState(true)
+  const anthropicConfirmInfo = useAnthropicCheckPay()
+  const notionConfirmInfo = useCheckNotion()
+  const billingConfirmInfo = useBillingPay()
+
+  const handleCancelShowPayStatusModal = useCallback(() => {
+    setShowPayStatusModal(false)
+    router.replace('/')
+  }, [router])
+
+  const confirmInfo = anthropicConfirmInfo || notionConfirmInfo || billingConfirmInfo
+
+  if (!confirmInfo || !showPayStatusModal)
+    return null
+
+  return (
+    <Confirm
+      isShow
+      onCancel={handleCancelShowPayStatusModal}
+      onConfirm={handleCancelShowPayStatusModal}
+      showCancel={false}
+      type={confirmInfo.type === 'info' ? 'info' : 'warning' }
+      title={confirmInfo.title}
+      content={(confirmInfo as unknown as { desc: string }).desc || ''}
+      confirmText={(confirmInfo.type === 'info' && t('common.operation.ok')) || ''}
+    />
+  )
+}
diff --git a/hooks/use-tab-searchparams.ts b/hooks/use-tab-searchparams.ts
new file mode 100644
index 0000000..bbeb1ea
--- /dev/null
+++ b/hooks/use-tab-searchparams.ts
@@ -0,0 +1,44 @@
+import { usePathname, useSearchParams } from 'next/navigation'
+import { useState } from 'react'
+
+type UseTabSearchParamsOptions = {
+  defaultTab: string
+  routingBehavior?: 'push' | 'replace'
+  searchParamName?: string
+  disableSearchParams?: boolean
+}
+
+/**
+ * Custom hook to manage tab state via URL search parameters in a Next.js application.
+ * This hook allows for syncing the active tab with the browser's URL, enabling bookmarking and sharing of URLs with a specific tab activated.
+ *
+ * @param {UseTabSearchParamsOptions} options Configuration options for the hook:
+ * - `defaultTab`: The tab to default to when no tab is specified in the URL.
+ * - `routingBehavior`: Optional. Determines how changes to the active tab update the browser's history ('push' or 'replace'). Default is 'push'.
+ * - `searchParamName`: Optional. The name of the search parameter that holds the tab state in the URL. Default is 'category'.
+ * @returns A tuple where the first element is the active tab and the second element is a function to set the active tab.
+ */
+export const useTabSearchParams = ({
+  defaultTab,
+  routingBehavior = 'push',
+  searchParamName = 'category',
+  disableSearchParams = false,
+}: UseTabSearchParamsOptions) => {
+  const pathnameFromHook = usePathname()
+  const pathName = window?.location?.pathname || pathnameFromHook
+  const searchParams = useSearchParams()
+  const [activeTab, setTab] = useState<string>(
+    !disableSearchParams
+      ? (searchParams.get(searchParamName) || defaultTab)
+      : defaultTab,
+  )
+
+  const setActiveTab = (newActiveTab: string) => {
+    setTab(newActiveTab)
+    if (disableSearchParams)
+      return
+    history[`${routingBehavior}State`](null, '', `${pathName}?${searchParamName}=${newActiveTab}`)
+  }
+
+  return [activeTab, setActiveTab] as const
+}
diff --git a/hooks/use-theme.ts b/hooks/use-theme.ts
new file mode 100644
index 0000000..c814c7d
--- /dev/null
+++ b/hooks/use-theme.ts
@@ -0,0 +1,13 @@
+import { Theme } from '@/types/app'
+import { useTheme as useBaseTheme } from 'next-themes'
+
+const useTheme = () => {
+  const { theme, resolvedTheme, ...rest } = useBaseTheme()
+  return {
+    // only returns 'light' or 'dark' theme
+    theme: theme === Theme.system ? resolvedTheme as Theme : theme as Theme,
+    ...rest,
+  }
+}
+
+export default useTheme
diff --git a/hooks/use-timestamp.spec.ts b/hooks/use-timestamp.spec.ts
new file mode 100644
index 0000000..d1113f5
--- /dev/null
+++ b/hooks/use-timestamp.spec.ts
@@ -0,0 +1,65 @@
+import { renderHook } from '@testing-library/react'
+import useTimestamp from './use-timestamp'
+
+jest.mock('@/context/app-context', () => ({
+  useAppContext: jest.fn(() => ({
+    userProfile: {
+      id: '8b18e24b-1ac8-4262-aa5c-e9aa95c76846',
+      name: 'test',
+      avatar: null,
+      avatar_url: null,
+      email: 'test@dify.ai',
+      is_password_set: false,
+      interface_language: 'zh-Hans',
+      interface_theme: 'light',
+      timezone: 'Asia/Shanghai',
+      last_login_at: 1744188761,
+      last_login_ip: '127.0.0.1',
+      created_at: 1728444483,
+    },
+  })),
+}))
+
+describe('useTimestamp', () => {
+  describe('formatTime', () => {
+    it('should format unix timestamp correctly', () => {
+      const { result } = renderHook(() => useTimestamp())
+      const timestamp = 1704132000
+
+      expect(result.current.formatTime(timestamp, 'YYYY-MM-DD HH:mm:ss'))
+        .toBe('2024-01-02 02:00:00')
+    })
+
+    it('should format with different patterns', () => {
+      const { result } = renderHook(() => useTimestamp())
+      const timestamp = 1704132000
+
+      expect(result.current.formatTime(timestamp, 'MM/DD/YYYY'))
+        .toBe('01/02/2024')
+
+      expect(result.current.formatTime(timestamp, 'HH:mm'))
+        .toBe('02:00')
+    })
+  })
+
+  describe('formatDate', () => {
+    it('should format date string correctly', () => {
+      const { result } = renderHook(() => useTimestamp())
+      const dateString = '2024-01-01T12:00:00Z'
+
+      expect(result.current.formatDate(dateString, 'YYYY-MM-DD HH:mm:ss'))
+        .toBe('2024-01-01 20:00:00')
+    })
+
+    it('should format with different patterns', () => {
+      const { result } = renderHook(() => useTimestamp())
+      const dateString = '2024-01-01T12:00:00Z'
+
+      expect(result.current.formatDate(dateString, 'MM/DD/YYYY'))
+        .toBe('01/01/2024')
+
+      expect(result.current.formatDate(dateString, 'HH:mm'))
+        .toBe('20:00')
+    })
+  })
+})
diff --git a/hooks/use-timestamp.ts b/hooks/use-timestamp.ts
new file mode 100644
index 0000000..5242eb5
--- /dev/null
+++ b/hooks/use-timestamp.ts
@@ -0,0 +1,25 @@
+'use client'
+import { useCallback } from 'react'
+import dayjs from 'dayjs'
+import utc from 'dayjs/plugin/utc'
+import timezone from 'dayjs/plugin/timezone'
+import { useAppContext } from '@/context/app-context'
+
+dayjs.extend(utc)
+dayjs.extend(timezone)
+
+const useTimestamp = () => {
+  const { userProfile: { timezone } } = useAppContext()
+
+  const formatTime = useCallback((value: number, format: string) => {
+    return dayjs.unix(value).tz(timezone).format(format)
+  }, [timezone])
+
+  const formatDate = useCallback((value: string, format: string) => {
+    return dayjs(value).tz(timezone).format(format)
+  }, [timezone])
+
+  return { formatTime, formatDate }
+}
+
+export default useTimestamp
diff --git a/i18n/DEV.md b/i18n/DEV.md
new file mode 100644
index 0000000..08b478f
--- /dev/null
+++ b/i18n/DEV.md
@@ -0,0 +1,49 @@
+
+## library
+
+* i18next
+* react-i18next
+
+## hooks
+
+* useTranslation
+* useGetLanguage
+* useI18N
+* useRenderI18nObject
+
+## impl
+
+* App Boot
+  - app/layout.tsx load i18n and init context
+    - use `<I18nServer/>`
+      - read locale with `getLocaleOnServer` (in node.js)
+        - locale from cookie, or browser request header
+        - only used in client app init and 2 server code(plugin desc, datasets)
+      - use `<I18N/>`
+        - init i18n context
+        - `setLocaleOnClient`
+          - `changeLanguage` (defined in i18n/i18next-config, also init i18n resources (side effects))
+            * is `i18next.changeLanguage`
+            * all languages text is merge & load in FrontEnd as .js (see i18n/i18next-config)
+* i18n context
+  - `locale` - current locale code (ex `eu-US`, `zh-Hans`)
+  - `i18n` - useless
+  - `setLocaleOnClient` - used by App Boot and user change language
+
+### load i18n resources
+
+- client: i18n/i18next-config.ts
+  * ns = camalCase(filename)
+  * ex: `app/components/datasets/create/embedding-process/index.tsx`
+    * `t('datasetSettings.form.retrievalSetting.title')`
+- server: i18n/server.ts
+  * ns = filename
+  * ex: `app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/settings/page.tsx`
+    * `translate(locale, 'dataset-settings')`
+
+## TODO
+
+* [ ] ts docs for useGetLanguage
+* [ ] ts docs for useI18N
+* [ ] client docs for i18n
+* [ ] server docs for i18n
diff --git a/i18n/README.md b/i18n/README.md
new file mode 100644
index 0000000..9384ffc
--- /dev/null
+++ b/i18n/README.md
@@ -0,0 +1,175 @@
+# Internationalization (i18n)
+
+## Introduction
+
+This directory contains the internationalization (i18n) files for this project.
+
+## File Structure
+
+```
+鈹溾攢鈹� [  24]  README.md
+鈹溾攢鈹� [   0]  README_CN.md
+鈹溾攢鈹� [ 704]  en-US
+鈹偮犅� 鈹溾攢鈹� [2.4K]  app-annotation.ts
+鈹偮犅� 鈹溾攢鈹� [5.2K]  app-api.ts
+鈹偮犅� 鈹溾攢鈹� [ 16K]  app-debug.ts
+鈹偮犅� 鈹溾攢鈹� [2.1K]  app-log.ts
+鈹偮犅� 鈹溾攢鈹� [5.3K]  app-overview.ts
+鈹偮犅� 鈹溾攢鈹� [1.9K]  app.ts
+鈹偮犅� 鈹溾攢鈹� [4.1K]  billing.ts
+鈹偮犅� 鈹溾攢鈹� [ 17K]  common.ts
+鈹偮犅� 鈹溾攢鈹� [ 859]  custom.ts
+鈹偮犅� 鈹溾攢鈹� [5.7K]  dataset-creation.ts
+鈹偮犅� 鈹溾攢鈹� [ 10K]  dataset-documents.ts
+鈹偮犅� 鈹溾攢鈹� [ 761]  dataset-hit-testing.ts
+鈹偮犅� 鈹溾攢鈹� [1.7K]  dataset-settings.ts
+鈹偮犅� 鈹溾攢鈹� [2.0K]  dataset.ts
+鈹偮犅� 鈹溾攢鈹� [ 941]  explore.ts
+鈹偮犅� 鈹溾攢鈹� [  52]  layout.ts
+鈹偮犅� 鈹溾攢鈹� [2.3K]  login.ts
+鈹偮犅� 鈹溾攢鈹� [  52]  register.ts
+鈹偮犅� 鈹溾攢鈹� [2.5K]  share-app.ts
+鈹偮犅� 鈹斺攢鈹� [2.8K]  tools.ts
+鈹溾攢鈹� [1.6K]  i18next-config.ts
+鈹溾攢鈹� [ 634]  index.ts
+鈹溾攢鈹� [4.4K]  language.ts
+```
+
+We use English as the default language. The i18n files are organized by language and then by module. For example, the English translation for the `app` module is in `en-US/app.ts`.
+
+If you want to add a new language or modify an existing translation, you can create a new file for the language or modify the existing file. The file name should be the language code (e.g., `zh-CN` for Chinese) and the file extension should be `.ts`.
+
+For example, if you want to add french translation, you can create a new folder `fr-FR` and add the translation files in it.
+
+By default we will use `LanguagesSupported` to determine which languages are supported. For example, in login page and settings page, we will use `LanguagesSupported` to determine which languages are supported and display them in the language selection dropdown.
+
+## Example
+
+1. Create a new folder for the new language.
+
+```
+cp -r en-US fr-FR
+```
+
+2. Modify the translation files in the new folder.
+
+3. Add type to new language in the `language.ts` file.
+
+```typescript
+export type I18nText = {
+  'en-US': string
+  'zh-Hans': string
+  'pt-BR': string
+  'es-ES': string
+  'fr-FR': string
+  'de-DE': string
+  'ja-JP': string
+  'ko-KR': string
+  'ru-RU': string
+  'it-IT': string
+  'uk-UA': string
+  'YOUR_LANGUAGE_CODE': string
+}
+```
+
+4. Add the new language to the `language.json` file.
+
+```typescript
+
+export const languages = [
+  {
+    value: 'en-US',
+    name: 'English(United States)',
+    example: 'Hello, Dify!',
+    supported: true,
+  },
+  {
+    value: 'zh-Hans',
+    name: '绠�浣撲腑鏂�',
+    example: '浣犲ソ锛孌ify锛�',
+    supported: true,
+  },
+  {
+    value: 'pt-BR',
+    name: 'Portugu锚s(Brasil)',
+    example: 'Ol谩, Dify!',
+    supported: true,
+  },
+  {
+    value: 'es-ES',
+    name: 'Espa帽ol(Espa帽a)',
+    example: 'Saluton, Dify!',
+    supported: false,
+  },
+  {
+    value: 'fr-FR',
+    name: 'Fran莽ais(France)',
+    example: 'Bonjour, Dify!',
+    supported: false,
+  },
+  {
+    value: 'de-DE',
+    name: 'Deutsch(Deutschland)',
+    example: 'Hallo, Dify!',
+    supported: false,
+  },
+  {
+    value: 'ja-JP',
+    name: '鏃ユ湰瑾�(鏃ユ湰)',
+    example: '銇撱倱銇仭銇�丏ify!',
+    supported: false,
+  },
+  {
+    value: 'ko-KR',
+    name: '頃滉淡鞏�(雽�頃滊甑�)',
+    example: '鞎堧厱, Dify!',
+    supported: true,
+  },
+  {
+    value: 'ru-RU',
+    name: '袪褍褋褋泻懈泄(袪芯褋褋懈褟)',
+    example: '聽袩褉懈胁械褌, Dify!',
+    supported: false,
+  },
+  {
+    value: 'it-IT',
+    name: 'Italiano(Italia)',
+    example: 'Ciao, Dify!',
+    supported: false,
+  },
+  {
+    value: 'th-TH',
+    name: '喙勦笚喔�(喔涏福喔班箑喔椸辅喙勦笚喔�)',
+    example: '喔抚喔编釜喔斷傅 Dify!',
+    supported: false,
+  },
+  {
+    value: 'id-ID',
+    name: 'Bahasa Indonesia',
+    example: 'Saluto, Dify!',
+    supported: false,
+  },
+  {
+    value: 'uk-UA',
+    name: '校泻褉邪褩薪褋褜泻邪(校泻褉邪褩薪邪)',
+    example: '袩褉懈胁械褌, Dify!',
+    supported: true,
+  },
+  // Add your language here 馃憞
+  ...
+  // Add your language here 馃憜
+]
+```
+
+5. Don't forget to mark the supported field as `true` if the language is supported.
+
+6. Sometime you might need to do some changes in the server side. Please change this file as well. 馃憞
+https://github.com/langgenius/dify/blob/61e4bbabaf2758354db4073cbea09fdd21a5bec1/api/constants/languages.py#L5
+
+
+
+## Clean Up
+
+That's it! You have successfully added a new language to the project. If you want to remove a language, you can simply delete the folder and remove the language from the `language.ts` file.
+
+We have a list of languages that we support in the `language.ts` file. But some of them are not supported yet. So, they are marked as `false`. If you want to support a language, you can follow the steps above and mark the supported field as `true`.
diff --git a/i18n/auto-gen-i18n.js b/i18n/auto-gen-i18n.js
new file mode 100644
index 0000000..a03b3aa
--- /dev/null
+++ b/i18n/auto-gen-i18n.js
@@ -0,0 +1,109 @@
+/* eslint-disable no-eval */
+const fs = require('node:fs')
+const path = require('node:path')
+const transpile = require('typescript').transpile
+const magicast = require('magicast')
+const { parseModule, generateCode, loadFile } = magicast
+const bingTranslate = require('bing-translate-api')
+const { translate } = bingTranslate
+const data = require('./languages.json')
+
+const targetLanguage = 'en-US'
+// https://github.com/plainheart/bing-translate-api/blob/master/src/met/lang.json
+const languageKeyMap = data.languages.reduce((map, language) => {
+  if (language.supported) {
+    if (language.value === 'zh-Hans' || language.value === 'zh-Hant')
+      map[language.value] = language.value
+    else
+      map[language.value] = language.value.split('-')[0]
+  }
+
+  return map
+}, {})
+
+async function translateMissingKeyDeeply(sourceObj, targetObject, toLanguage) {
+  await Promise.all(Object.keys(sourceObj).map(async (key) => {
+    if (targetObject[key] === undefined) {
+      if (typeof sourceObj[key] === 'object') {
+        targetObject[key] = {}
+        await translateMissingKeyDeeply(sourceObj[key], targetObject[key], toLanguage)
+      }
+      else {
+        try {
+          const source = sourceObj[key]
+          if (!source) {
+            targetObject[key] = ''
+            return
+          }
+          // not support translate with '(' or ')'
+          if (source.includes('(') || source.includes(')'))
+            return
+
+          const { translation } = await translate(sourceObj[key], null, languageKeyMap[toLanguage])
+          targetObject[key] = translation
+        }
+        catch {
+          console.error(`Error translating "${sourceObj[key]}" to ${toLanguage}. Key: ${key}`)
+        }
+      }
+    }
+    else if (typeof sourceObj[key] === 'object') {
+      targetObject[key] = targetObject[key] || {}
+      await translateMissingKeyDeeply(sourceObj[key], targetObject[key], toLanguage)
+    }
+  }))
+}
+
+async function autoGenTrans(fileName, toGenLanguage) {
+  const fullKeyFilePath = path.join(__dirname, targetLanguage, `${fileName}.ts`)
+  const toGenLanguageFilePath = path.join(__dirname, toGenLanguage, `${fileName}.ts`)
+  // eslint-disable-next-line sonarjs/code-eval
+  const fullKeyContent = eval(transpile(fs.readFileSync(fullKeyFilePath, 'utf8')))
+  // if toGenLanguageFilePath is not exist, create it
+  if (!fs.existsSync(toGenLanguageFilePath)) {
+    fs.writeFileSync(toGenLanguageFilePath, `const translation = {
+}
+
+export default translation
+`)
+  }
+  // To keep object format and format it for magicast to work: const translation = { ... } => export default {...}
+  const readContent = await loadFile(toGenLanguageFilePath)
+  const { code: toGenContent } = generateCode(readContent)
+  const mod = await parseModule(`export default ${toGenContent.replace('export default translation', '').replace('const translation = ', '')}`)
+  const toGenOutPut = mod.exports.default
+
+  await translateMissingKeyDeeply(fullKeyContent, toGenOutPut, toGenLanguage)
+  const { code } = generateCode(mod)
+  const res = `const translation =${code.replace('export default', '')}
+
+export default translation
+`.replace(/,\n\n/g, ',\n').replace('};', '}')
+
+  fs.writeFileSync(toGenLanguageFilePath, res)
+}
+
+async function main() {
+  // const fileName = 'workflow'
+  // Promise.all(Object.keys(languageKeyMap).map(async (toLanguage) => {
+  //   await autoGenTrans(fileName, toLanguage)
+  // }))
+
+  const files = fs
+    .readdirSync(path.join(__dirname, targetLanguage))
+    .map(file => file.replace(/\.ts/, ''))
+    .filter(f => f !== 'app-debug') // ast parse error in app-debug
+
+  await Promise.all(files.map(async (file) => {
+    await Promise.all(Object.keys(languageKeyMap).map(async (language) => {
+      try {
+        await autoGenTrans(file, language)
+      }
+      catch (e) {
+        console.error(`Error translating ${file} to ${language}`, e)
+      }
+    }))
+  }))
+}
+
+main()
diff --git a/i18n/check-i18n.js b/i18n/check-i18n.js
new file mode 100644
index 0000000..55a2301
--- /dev/null
+++ b/i18n/check-i18n.js
@@ -0,0 +1,85 @@
+/* eslint-disable no-eval */
+const fs = require('node:fs')
+const path = require('node:path')
+const transpile = require('typescript').transpile
+
+const targetLanguage = 'en-US'
+const data = require('./languages.json')
+const languages = data.languages.filter(language => language.supported).map(language => language.value)
+
+async function getKeysFromLanuage(language) {
+  return new Promise((resolve, reject) => {
+    const folderPath = path.join(__dirname, language)
+    let allKeys = []
+    fs.readdir(folderPath, (err, files) => {
+      if (err) {
+        console.error('Error reading folder:', err)
+        reject(err)
+        return
+      }
+
+      files.forEach((file) => {
+        const filePath = path.join(folderPath, file)
+        const fileName = file.replace(/\.[^/.]+$/, '') // Remove file extension
+        const camelCaseFileName = fileName.replace(/[-_](.)/g, (_, c) =>
+          c.toUpperCase(),
+        ) // Convert to camel case
+        // console.log(camelCaseFileName)
+        const content = fs.readFileSync(filePath, 'utf8')
+        // eslint-disable-next-line sonarjs/code-eval
+        const translationObj = eval(transpile(content))
+        // console.log(translation)
+        if(!translationObj || typeof translationObj !== 'object') {
+          console.error(`Error parsing file: ${filePath}`)
+          reject(new Error(`Error parsing file: ${filePath}`))
+          return
+        }
+        const keys = Object.keys(translationObj)
+        const nestedKeys = []
+        const iterateKeys = (obj, prefix = '') => {
+          for (const key in obj) {
+            const nestedKey = prefix ? `${prefix}.${key}` : key
+            nestedKeys.push(nestedKey)
+            if (typeof obj[key] === 'object')
+              iterateKeys(obj[key], nestedKey)
+          }
+        }
+        iterateKeys(translationObj)
+
+        allKeys = [...keys, ...nestedKeys].map(
+          key => `${camelCaseFileName}.${key}`,
+        )
+      })
+      resolve(allKeys)
+    })
+  })
+}
+
+async function main() {
+  const compareKeysCount = async () => {
+    const targetKeys = await getKeysFromLanuage(targetLanguage)
+    const languagesKeys = await Promise.all(languages.map(language => getKeysFromLanuage(language)))
+
+    const keysCount = languagesKeys.map(keys => keys.length)
+    const targetKeysCount = targetKeys.length
+
+    const comparison = languages.reduce((result, language, index) => {
+      const languageKeysCount = keysCount[index]
+      const difference = targetKeysCount - languageKeysCount
+      result[language] = difference
+      return result
+    }, {})
+
+    console.log(comparison)
+
+    // Print missing keys
+    languages.forEach((language, index) => {
+      const missingKeys = targetKeys.filter(key => !languagesKeys[index].includes(key))
+      console.log(`Missing keys in ${language}:`, missingKeys)
+    })
+  }
+
+  compareKeysCount()
+}
+
+main()
diff --git a/i18n/de-DE/app-annotation.ts b/i18n/de-DE/app-annotation.ts
new file mode 100644
index 0000000..ef2fa1f
--- /dev/null
+++ b/i18n/de-DE/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: 'Anmerkungen',
+  name: 'Antwort Anmerkung',
+  editBy: 'Antwort bearbeitet von {{author}}',
+  noData: {
+    title: 'Keine Anmerkungen',
+    description: 'Sie k枚nnen Anmerkungen w盲hrend des App-Debuggings bearbeiten oder hier Anmerkungen in gro脽en Mengen importieren f眉r eine hochwertige Antwort.',
+  },
+  table: {
+    header: {
+      question: 'Frage',
+      answer: 'Antwort',
+      createdAt: 'erstellt am',
+      hits: 'Treffer',
+      actions: 'Aktionen',
+      addAnnotation: 'Anmerkung hinzuf眉gen',
+      bulkImport: 'Massenimport',
+      bulkExport: 'Massenexport',
+      clearAll: 'Alle Anmerkungen l枚schen',
+    },
+  },
+  editModal: {
+    title: 'Antwort Anmerkung bearbeiten',
+    queryName: 'Benutzeranfrage',
+    answerName: 'Geschichtenerz盲hler Bot',
+    yourAnswer: 'Ihre Antwort',
+    answerPlaceholder: 'Geben Sie hier Ihre Antwort ein',
+    yourQuery: 'Ihre Anfrage',
+    queryPlaceholder: 'Geben Sie hier Ihre Anfrage ein',
+    removeThisCache: 'Diese Anmerkung entfernen',
+    createdAt: 'Erstellt am',
+  },
+  addModal: {
+    title: 'Antwort Anmerkung hinzuf眉gen',
+    queryName: 'Frage',
+    answerName: 'Antwort',
+    answerPlaceholder: 'Antwort hier eingeben',
+    queryPlaceholder: 'Anfrage hier eingeben',
+    createNext: 'Eine weitere annotierte Antwort hinzuf眉gen',
+  },
+  batchModal: {
+    title: 'Massenimport',
+    csvUploadTitle: 'Ziehen Sie Ihre CSV-Datei hierher oder ',
+    browse: 'durchsuchen',
+    tip: 'Die CSV-Datei muss der folgenden Struktur entsprechen:',
+    question: 'Frage',
+    answer: 'Antwort',
+    contentTitle: 'Inhaltsabschnitt',
+    content: 'Inhalt',
+    template: 'Laden Sie die Vorlage hier herunter',
+    cancel: 'Abbrechen',
+    run: 'Batch ausf眉hren',
+    runError: 'Batch-Ausf眉hrung fehlgeschlagen',
+    processing: 'In Batch-Verarbeitung',
+    completed: 'Import abgeschlossen',
+    error: 'Importfehler',
+    ok: 'OK',
+  },
+  errorMessage: {
+    answerRequired: 'Antwort erforderlich',
+    queryRequired: 'Frage erforderlich',
+  },
+  viewModal: {
+    annotatedResponse: 'Antwort Anmerkung',
+    hitHistory: 'Trefferhistorie',
+    hit: 'Treffer',
+    hits: 'Treffer',
+    noHitHistory: 'Keine Trefferhistorie',
+  },
+  hitHistoryTable: {
+    query: 'Anfrage',
+    match: '脺bereinstimmung',
+    response: 'Antwort',
+    source: 'Quelle',
+    score: 'Punktzahl',
+    time: 'Zeit',
+  },
+  initSetup: {
+    title: 'Initialeinrichtung Antwort Anmerkung',
+    configTitle: 'Einrichtung Antwort Anmerkung',
+    confirmBtn: 'Speichern & Aktivieren',
+    configConfirmBtn: 'Speichern',
+  },
+  embeddingModelSwitchTip: 'Anmerkungstext-Vektorisierungsmodell, das Wechseln von Modellen wird neu eingebettet, was zus盲tzliche Kosten verursacht.',
+}
+
+export default translation
diff --git a/i18n/de-DE/app-api.ts b/i18n/de-DE/app-api.ts
new file mode 100644
index 0000000..d785e34
--- /dev/null
+++ b/i18n/de-DE/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'API Server',
+  apiKey: 'API Schl眉ssel',
+  status: 'Status',
+  disabled: 'Deaktiviert',
+  ok: 'In Betrieb',
+  copy: 'Kopieren',
+  copied: 'Kopiert',
+  play: 'Abspielen',
+  pause: 'Pause',
+  playing: 'Wiedergabe',
+  merMaid: {
+    rerender: 'Neu rendern',
+  },
+  never: 'Nie',
+  apiKeyModal: {
+    apiSecretKey: 'API Geheimschl眉ssel',
+    apiSecretKeyTips: 'Um Missbrauch der API zu verhindern, sch眉tzen Sie Ihren API Schl眉ssel. Vermeiden Sie es, ihn als Klartext im Frontend-Code zu verwenden. :)',
+    createNewSecretKey: 'Neuen Geheimschl眉ssel erstellen',
+    secretKey: 'Geheimschl眉ssel',
+    created: 'ERSTELLT',
+    lastUsed: 'ZULETZT VERWENDET',
+    generateTips: 'Bewahren Sie diesen Schl眉ssel an einem sicheren und zug盲nglichen Ort auf.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: 'Diesen Geheimschl眉ssel l枚schen?',
+    deleteConfirmTips: 'Diese Aktion kann nicht r眉ckg盲ngig gemacht werden.',
+    ok: 'OK',
+  },
+  completionMode: {
+    title: 'Completion App API',
+    info: 'F眉r die Erzeugung von hochwertigem Text, wie z.B. Artikel, Zusammenfassungen und 脺bersetzungen, verwenden Sie die Completion-Messages API mit Benutzereingaben. Die Texterzeugung basiert auf den Modellparametern und Vorlagen f眉r Aufforderungen in Dify Prompt Engineering.',
+    createCompletionApi: 'Completion Nachricht erstellen',
+    createCompletionApiTip: 'Erstellen Sie eine Completion Nachricht, um den Frage-Antwort-Modus zu unterst眉tzen.',
+    inputsTips: '(Optional) Geben Sie Benutzereingabefelder als Schl眉ssel-Wert-Paare an, die Variablen in Prompt Eng. entsprechen. Schl眉ssel ist der Variablenname, Wert ist der Parameterwert. Wenn der Feldtyp Select ist, muss der 眉bermittelte Wert eine der voreingestellten Optionen sein.',
+    queryTips: 'Textinhalt der Benutzereingabe.',
+    blocking: 'Blockierender Typ, wartet auf die Fertigstellung der Ausf眉hrung und gibt Ergebnisse zur眉ck. (Anfragen k枚nnen unterbrochen werden, wenn der Prozess lang ist)',
+    streaming: 'Streaming R眉ckgaben. Implementierung der Streaming-R眉ckgabe basierend auf SSE (Server-Sent Events).',
+    messageFeedbackApi: 'Nachrichtenfeedback (Like)',
+    messageFeedbackApiTip: 'Bewerten Sie empfangene Nachrichten im Namen der Endbenutzer mit Likes oder Dislikes. Diese Daten sind auf der Seite Logs & Annotations sichtbar und werden f眉r zuk眉nftige Modellanpassungen verwendet.',
+    messageIDTip: 'Nachrichten-ID',
+    ratingTip: 'like oder dislike, null ist r眉ckg盲ngig machen',
+    parametersApi: 'Anwendungsparameterinformationen abrufen',
+    parametersApiTip: 'Abrufen konfigurierter Eingabeparameter, einschlie脽lich Variablennamen, Feldnamen, Typen und Standardwerten. Typischerweise verwendet, um diese Felder in einem Formular anzuzeigen oder Standardwerte nach dem Laden des Clients auszuf眉llen.',
+  },
+  chatMode: {
+    title: 'Chat App API',
+    info: 'F眉r vielseitige Gespr盲chsanwendungen im Q&A-Format rufen Sie die chat-messages API auf, um einen Dialog zu initiieren. F眉hren Sie laufende Gespr盲che fort, indem Sie die zur眉ckgegebene conversation_id 眉bergeben. Antwortparameter und -vorlagen h盲ngen von den Einstellungen in Dify Prompt Eng. ab.',
+    createChatApi: 'Chatnachricht erstellen',
+    createChatApiTip: 'Eine neue Konversationsnachricht erstellen oder einen bestehenden Dialog fortsetzen.',
+    inputsTips: '(Optional) Geben Sie Benutzereingabefelder als Schl眉ssel-Wert-Paare an, die Variablen in Prompt Eng. entsprechen. Schl眉ssel ist der Variablenname, Wert ist der Parameterwert. Wenn der Feldtyp Select ist, muss der 眉bermittelte Wert eine der voreingestellten Optionen sein.',
+    queryTips: 'Inhalt der Benutzereingabe/Frage',
+    blocking: 'Blockierender Typ, wartet auf die Fertigstellung der Ausf眉hrung und gibt Ergebnisse zur眉ck. (Anfragen k枚nnen unterbrochen werden, wenn der Prozess lang ist)',
+    streaming: 'Streaming R眉ckgaben. Implementierung der Streaming-R眉ckgabe basierend auf SSE (Server-Sent Events).',
+    conversationIdTip: '(Optional) Konversations-ID: f眉r erstmalige Konversation leer lassen; conversation_id aus dem Kontext 眉bergeben, um den Dialog fortzusetzen.',
+    messageFeedbackApi: 'Nachrichtenfeedback des Endbenutzers, like',
+    messageFeedbackApiTip: 'Bewerten Sie empfangene Nachrichten im Namen der Endbenutzer mit Likes oder Dislikes. Diese Daten sind auf der Seite Logs & Annotations sichtbar und werden f眉r zuk眉nftige Modellanpassungen verwendet.',
+    messageIDTip: 'Nachrichten-ID',
+    ratingTip: 'like oder dislike, null ist r眉ckg盲ngig machen',
+    chatMsgHistoryApi: 'Chatverlaufsnachricht abrufen',
+    chatMsgHistoryApiTip: 'Die erste Seite gibt die neuesten `limit` Eintr盲ge in umgekehrter Reihenfolge zur眉ck.',
+    chatMsgHistoryConversationIdTip: 'Konversations-ID',
+    chatMsgHistoryFirstId: 'ID des ersten Chat-Datensatzes auf der aktuellen Seite. Standardm盲脽ig keiner.',
+    chatMsgHistoryLimit: 'Wie viele Chats in einer Anfrage zur眉ckgegeben werden',
+    conversationsListApi: 'Konversationsliste abrufen',
+    conversationsListApiTip: 'Ruft die Sitzungsliste des aktuellen Benutzers ab. Standardm盲脽ig werden die letzten 20 Sitzungen zur眉ckgegeben.',
+    conversationsListFirstIdTip: 'Die ID des letzten Datensatzes auf der aktuellen Seite, standardm盲脽ig keine.',
+    conversationsListLimitTip: 'Wie viele Chats in einer Anfrage zur眉ckgegeben werden',
+    conversationRenamingApi: 'Konversation umbenennen',
+    conversationRenamingApiTip: 'Konversationen umbenennen; der Name wird in Mehrsitzungs-Client-Schnittstellen angezeigt.',
+    conversationRenamingNameTip: 'Neuer Name',
+    parametersApi: 'Anwendungsparameterinformationen abrufen',
+    parametersApiTip: 'Abrufen konfigurierter Eingabeparameter, einschlie脽lich Variablennamen, Feldnamen, Typen und Standardwerten. Typischerweise verwendet, um diese Felder in einem Formular anzuzeigen oder Standardwerte nach dem Laden des Clients auszuf眉llen.',
+  },
+  develop: {
+    requestBody: 'Anfragek枚rper',
+    pathParams: 'Pfadparameter',
+    query: 'Anfrage',
+    toc: 'Inhalt',
+  },
+  loading: 'Laden',
+  regenerate: 'Erneuern',
+}
+
+export default translation
diff --git a/i18n/de-DE/app-debug.ts b/i18n/de-DE/app-debug.ts
new file mode 100644
index 0000000..4022e75
--- /dev/null
+++ b/i18n/de-DE/app-debug.ts
@@ -0,0 +1,392 @@
+const translation = {
+  pageTitle: {
+    line1: 'PROMPT',
+    line2: 'Engineering',
+  },
+  orchestrate: 'Orchestrieren',
+  promptMode: {
+    simple: 'Wechseln Sie in den Expertenmodus, um das gesamte PROMPT zu bearbeiten',
+    advanced: 'Expertenmodus',
+    switchBack: 'Zur眉ckwechseln',
+    advancedWarning: {
+      title: 'Sie haben in den Expertenmodus gewechselt, und sobald Sie das PROMPT 盲ndern, k枚nnen Sie NICHT zum Basis-Modus zur眉ckkehren.',
+      description: 'Im Expertenmodus k枚nnen Sie das gesamte PROMPT bearbeiten.',
+      learnMore: 'Mehr erfahren',
+      ok: 'OK',
+    },
+    operation: {
+      addMessage: 'Nachricht hinzuf眉gen',
+    },
+    contextMissing: 'Komponente fehlt, die Wirksamkeit des Prompts k枚nnte schlecht sein.',
+  },
+  operation: {
+    applyConfig: 'Ver枚ffentlichen',
+    resetConfig: 'Zur眉cksetzen',
+    debugConfig: 'Debuggen',
+    addFeature: 'Funktion hinzuf眉gen',
+    automatic: 'Generieren',
+    stopResponding: 'Antworten stoppen',
+    agree: 'gef盲llt mir',
+    disagree: 'gef盲llt mir nicht',
+    cancelAgree: 'Gef盲llt mir zur眉cknehmen',
+    cancelDisagree: 'Gef盲llt mir nicht zur眉cknehmen',
+    userAction: 'Benutzer ',
+  },
+  notSetAPIKey: {
+    title: 'LLM-Anbieterschl眉ssel wurde nicht festgelegt',
+    trailFinished: 'Testversion beendet',
+    description: 'Der LLM-Anbieterschl眉ssel wurde nicht festgelegt und muss vor dem Debuggen festgelegt werden.',
+    settingBtn: 'Zu den Einstellungen gehen',
+  },
+  trailUseGPT4Info: {
+    title: 'Unterst眉tzt derzeit kein gpt-4',
+    description: 'Um gpt-4 zu verwenden, bitte API-Schl眉ssel festlegen.',
+  },
+  feature: {
+    groupChat: {
+      title: 'Chatverbesserung',
+      description: 'Voreinstellungen f眉r Konversationen zu Apps hinzuf眉gen kann die Benutzererfahrung verbessern.',
+    },
+    groupExperience: {
+      title: 'Erfahrungsverbesserung',
+    },
+    conversationOpener: {
+      title: 'Gespr盲chser枚ffnungen',
+      description: 'In einer Chat-App wird der erste Satz, den die KI aktiv an den Benutzer richtet, 眉blicherweise als Begr眉脽ung verwendet.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: 'Nachfolgefragen',
+      description: 'Das Einrichten von Vorschl盲gen f眉r n盲chste Fragen kann den Chat f眉r Benutzer verbessern.',
+      resDes: '3 Vorschl盲ge f眉r die n盲chste Benutzerfrage.',
+      tryToAsk: 'Versuchen Sie zu fragen',
+    },
+    moreLikeThis: {
+      title: 'Mehr davon',
+      description: 'Mehrere Texte gleichzeitig generieren und dann bearbeiten und weiter generieren',
+      generateNumTip: 'Anzahl der generierten Texte pro Durchgang',
+      tip: 'Die Verwendung dieser Funktion verursacht zus盲tzliche Token-Kosten',
+    },
+    speechToText: {
+      title: 'Sprache zu Text',
+      description: 'Einmal aktiviert, k枚nnen Sie Spracheingabe verwenden.',
+      resDes: 'Spracheingabe ist aktiviert',
+    },
+    textToSpeech: {
+      title: 'Text zu Sprache',
+      description: 'Einmal aktiviert, kann Text in Sprache umgewandelt werden.',
+      resDes: 'Text zu Audio ist aktiviert',
+    },
+    citation: {
+      title: 'Zitate und Urheberangaben',
+      description: 'Einmal aktiviert, zeigen Sie das Quelldokument und den zugeordneten Abschnitt des generierten Inhalts an.',
+      resDes: 'Zitate und Urheberangaben sind aktiviert',
+    },
+    annotation: {
+      title: 'Annotation Antwort',
+      description: 'Sie k枚nnen manuell hochwertige Antworten zum Cache hinzuf眉gen f眉r bevorzugte 脺bereinstimmung mit 盲hnlichen Benutzerfragen.',
+      resDes: 'Annotationsantwort ist aktiviert',
+      scoreThreshold: {
+        title: 'Schwellenwert',
+        description: 'Wird verwendet, um den 脛hnlichkeitsschwellenwert f眉r die Annotation Antwort einzustellen.',
+        easyMatch: 'Einfache 脺bereinstimmung',
+        accurateMatch: 'Genaue 脺bereinstimmung',
+      },
+      matchVariable: {
+        title: '脺bereinstimmungsvariable',
+        choosePlaceholder: 'W盲hlen Sie 脺bereinstimmungsvariable',
+      },
+      cacheManagement: 'Annotationen',
+      cached: 'Annotiert',
+      remove: 'Entfernen',
+      removeConfirm: 'Diese Annotation l枚schen?',
+      add: 'Annotation hinzuf眉gen',
+      edit: 'Annotation bearbeiten',
+    },
+    dataSet: {
+      title: 'Kontext',
+      noData: 'Sie k枚nnen Wissen als Kontext importieren',
+      words: 'W枚rter',
+      textBlocks: 'Textbl枚cke',
+      selectTitle: 'W盲hlen Sie Referenzwissen',
+      selected: 'Wissen ausgew盲hlt',
+      noDataSet: 'Kein Wissen gefunden',
+      toCreate: 'Erstellen gehen',
+      notSupportSelectMulti: 'Unterst眉tzt derzeit nur ein Wissen',
+      queryVariable: {
+        title: 'Abfragevariable',
+        tip: 'Diese Variable wird als Eingabe f眉r die Kontextabfrage verwendet, um kontextbezogene Informationen in Bezug auf die Eingabe dieser Variable zu erhalten.',
+        choosePlaceholder: 'W盲hlen Sie Abfragevariable',
+        noVar: 'Keine Variablen',
+        noVarTip: 'Bitte erstellen Sie eine Variable im Variablenbereich',
+        unableToQueryDataSet: 'Konnte das Wissen nicht abfragen',
+        unableToQueryDataSetTip: 'Konnte das Wissen nicht erfolgreich abfragen, bitte w盲hlen Sie eine Kontextabfragevariable im Kontextbereich.',
+        ok: 'OK',
+        contextVarNotEmpty: 'Kontextabfragevariable darf nicht leer sein',
+        deleteContextVarTitle: 'Variable 鈥瀧{varName}}鈥� l枚schen?',
+        deleteContextVarTip: 'Diese Variable wurde als Kontextabfragevariable festgelegt und deren Entfernung wird die normale Verwendung des Wissens beeintr盲chtigen. Wenn Sie sie trotzdem l枚schen m眉ssen, w盲hlen Sie sie bitte im Kontextbereich erneut.',
+      },
+    },
+    tools: {
+      title: 'Werkzeuge',
+      tips: 'Werkzeuge bieten eine standardisierte API-Aufrufmethode, die Benutzereingaben oder Variablen als Anfrageparameter f眉r die Abfrage externer Daten als Kontext verwendet.',
+      toolsInUse: '{{count}} Werkzeuge in Verwendung',
+      modal: {
+        title: 'Werkzeug',
+        toolType: {
+          title: 'Werkzeugtyp',
+          placeholder: 'Bitte w盲hlen Sie den Werkzeugtyp',
+        },
+        name: {
+          title: 'Name',
+          placeholder: 'Bitte geben Sie den Namen ein',
+        },
+        variableName: {
+          title: 'Variablenname',
+          placeholder: 'Bitte geben Sie den Variablennamen ein',
+        },
+      },
+    },
+    conversationHistory: {
+      title: 'Konversationsverlauf',
+      description: 'Pr盲fixnamen f眉r Konversationsrollen festlegen',
+      tip: 'Der Konversationsverlauf ist nicht aktiviert, bitte f眉gen Sie <histories> im Prompt oben ein.',
+      learnMore: 'Mehr erfahren',
+      editModal: {
+        title: 'Konversationsrollennamen bearbeiten',
+        userPrefix: 'Benutzerpr盲fix',
+        assistantPrefix: 'Assistentenpr盲fix',
+      },
+    },
+    toolbox: {
+      title: 'WERKZEUGKASTEN',
+    },
+    moderation: {
+      title: 'Inhaltsmoderation',
+      description: 'Sichern Sie die Ausgabe des Modells durch Verwendung der Moderations-API oder durch Pflege einer Liste sensibler W枚rter.',
+      allEnabled: 'INHALT von EINGABE/AUSGABE aktiviert',
+      inputEnabled: 'INHALT von EINGABE aktiviert',
+      outputEnabled: 'INHALT von AUSGABE aktiviert',
+      modal: {
+        title: 'Einstellungen zur Inhaltsmoderation',
+        provider: {
+          title: 'Anbieter',
+          openai: 'OpenAI-Moderation',
+          openaiTip: {
+            prefix: 'OpenAI-Moderation erfordert einen konfigurierten OpenAI-API-Schl眉ssel in den ',
+            suffix: '.',
+          },
+          keywords: 'Schl眉sselw枚rter',
+        },
+        keywords: {
+          tip: 'Jeweils eine pro Zeile, getrennt durch Zeilenumbr眉che. Bis zu 100 Zeichen pro Zeile.',
+          placeholder: 'Jeweils eine pro Zeile, getrennt durch Zeilenumbr眉che',
+          line: 'Zeile',
+        },
+        content: {
+          input: 'INHALT der EINGABE moderieren',
+          output: 'INHALT der AUSGABE moderieren',
+          preset: 'Voreingestellte Antworten',
+          placeholder: 'Inhalt der voreingestellten Antworten hier',
+          condition: 'Moderation von INHALT der EINGABE und AUSGABE mindestens eine aktiviert',
+          fromApi: 'Voreingestellte Antworten werden durch API zur眉ckgegeben',
+          errorMessage: 'Voreingestellte Antworten d眉rfen nicht leer sein',
+          supportMarkdown: 'Markdown unterst眉tzt',
+        },
+        openaiNotConfig: {
+          before: 'OpenAI-Moderation erfordert einen konfigurierten OpenAI-API-Schl眉ssel in den',
+          after: '',
+        },
+      },
+    },
+  },
+  resetConfig: {
+    title: 'Zur眉cksetzen best盲tigen?',
+    message:
+      'Zur眉cksetzen verwirft 脛nderungen und stellt die zuletzt ver枚ffentlichte Konfiguration wieder her.',
+  },
+  errorMessage: {
+    nameOfKeyRequired: 'Name des Schl眉ssels: {{key}} erforderlich',
+    valueOfVarRequired: '{{key}} Wert darf nicht leer sein',
+    queryRequired: 'Anfragetext ist erforderlich.',
+    waitForResponse:
+      'Bitte warten Sie auf die Antwort auf die vorherige Nachricht, um abzuschlie脽en.',
+    waitForBatchResponse:
+      'Bitte warten Sie auf die Antwort auf die Stapelaufgabe, um abzuschlie脽en.',
+    notSelectModel: 'Bitte w盲hlen Sie ein Modell',
+    waitForImgUpload: 'Bitte warten Sie, bis das Bild hochgeladen ist',
+  },
+  chatSubTitle: 'Anweisungen',
+  completionSubTitle: 'Vor-Prompt',
+  promptTip:
+    'Prompts leiten KI-Antworten mit Anweisungen und Einschr盲nkungen. F眉gen Sie Variablen wie {{input}} ein. Dieses Prompt wird den Benutzern nicht angezeigt.',
+  formattingChangedTitle: 'Formatierung ge盲ndert',
+  formattingChangedText:
+    'Die 脛nderung der Formatierung wird den Debug-Bereich zur眉cksetzen, sind Sie sicher?',
+  variableTitle: 'Variablen',
+  variableTip:
+    'Benutzer f眉llen Variablen in einem Formular aus, automatisches Ersetzen von Variablen im Prompt.',
+  notSetVar: 'Variablen erm枚glichen es Benutzern, Aufforderungsw枚rter oder Er枚ffnungsbemerkungen einzuf眉hren, wenn sie Formulare ausf眉llen. Sie k枚nnten versuchen, "{{input}}" im Prompt einzugeben.',
+  autoAddVar: 'Im Vor-Prompt referenzierte undefinierte Variablen, m枚chten Sie sie im Benutzereingabeformular hinzuf眉gen?',
+  variableTable: {
+    key: 'Variablenschl眉ssel',
+    name: 'Name des Benutzereingabefelds',
+    optional: 'Optional',
+    type: 'Eingabetyp',
+    action: 'Aktionen',
+    typeString: 'String',
+    typeSelect: 'Ausw盲hlen',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{key}} ist erforderlich',
+    tooLong: '{{key}} zu lang. Darf nicht l盲nger als 30 Zeichen sein',
+    notValid: '{{key}} ist ung眉ltig. Darf nur Buchstaben, Zahlen und Unterstriche enthalten',
+    notStartWithNumber: '{{key}} darf nicht mit einer Zahl beginnen',
+    keyAlreadyExists: '{{key}} existiert bereits',
+  },
+  otherError: {
+    promptNoBeEmpty: 'Prompt darf nicht leer sein',
+    historyNoBeEmpty: 'Konversationsverlauf muss im Prompt gesetzt sein',
+    queryNoBeEmpty: 'Anfrage muss im Prompt gesetzt sein',
+  },
+  variableConfig: {
+    modalTitle: 'Feldeinstellungen',
+    description: 'Einstellung f眉r Variable {{varName}}',
+    fieldType: 'Feldtyp',
+    string: 'Kurztext',
+    paragraph: 'Absatz',
+    select: 'Ausw盲hlen',
+    notSet: 'Nicht gesetzt, versuchen Sie, {{input}} im Vor-Prompt zu tippen',
+    stringTitle: 'Formular-Textfeldoptionen',
+    maxLength: 'Maximale L盲nge',
+    options: 'Optionen',
+    addOption: 'Option hinzuf眉gen',
+    apiBasedVar: 'API-basierte Variable',
+  },
+  vision: {
+    name: 'Vision',
+    description: 'Vision zu aktivieren erm枚glicht es dem Modell, Bilder aufzunehmen und Fragen dazu zu beantworten.',
+    settings: 'Einstellungen',
+    visionSettings: {
+      title: 'Vision-Einstellungen',
+      resolution: 'Aufl枚sung',
+      resolutionTooltip: `Niedrige Aufl枚sung erm枚glicht es dem Modell, eine Bildversion mit niedriger Aufl枚sung von 512 x 512 zu erhalten und das Bild mit einem Budget von 65 Tokens darzustellen. Dies erm枚glicht schnellere Antworten des API und verbraucht weniger Eingabetokens f眉r Anwendungsf盲lle, die kein hohes Detail ben枚tigen.
+      \n
+      Hohe Aufl枚sung erm枚glicht zun盲chst, dass das Modell das Bild mit niedriger Aufl枚sung sieht und dann detaillierte Ausschnitte von Eingabebildern als 512px Quadrate basierend auf der Gr枚脽e des Eingabebildes erstellt. Jeder der detaillierten Ausschnitte verwendet das doppelte Token-Budget f眉r insgesamt 129 Tokens.`,
+      high: 'Hoch',
+      low: 'Niedrig',
+      uploadMethod: 'Upload-Methode',
+      both: 'Beides',
+      localUpload: 'Lokaler Upload',
+      url: 'URL',
+      uploadLimit: 'Upload-Limit',
+    },
+  },
+  voice: {
+    name: 'Stimme',
+    defaultDisplay: 'Standardstimme',
+    description: 'Text-zu-Sprache-Stimmeinstellungen',
+    settings: 'Einstellungen',
+    voiceSettings: {
+      title: 'Stimmeinstellungen',
+      language: 'Sprache',
+      resolutionTooltip: 'Text-zu-Sprache unterst眉tzte Sprache.',
+      voice: 'Stimme',
+    },
+  },
+  openingStatement: {
+    title: 'Gespr盲chser枚ffner',
+    add: 'Hinzuf眉gen',
+    writeOpener: 'Er枚ffnung schreiben',
+    placeholder: 'Schreiben Sie hier Ihre Er枚ffnungsnachricht, Sie k枚nnen Variablen verwenden, versuchen Sie {{Variable}} zu tippen.',
+    openingQuestion: 'Er枚ffnungsfragen',
+    noDataPlaceHolder:
+      'Den Dialog mit dem Benutzer zu beginnen, kann helfen, in konversationellen Anwendungen eine engere Verbindung mit ihnen herzustellen.',
+    varTip: 'Sie k枚nnen Variablen verwenden, versuchen Sie {{Variable}} zu tippen',
+    tooShort: 'F眉r die Erzeugung von Er枚ffnungsbemerkungen f眉r das Gespr盲ch werden mindestens 20 W枚rter des Anfangsprompts ben枚tigt.',
+    notIncludeKey: 'Das Anfangsprompt enth盲lt nicht die Variable: {{key}}. Bitte f眉gen Sie sie dem Anfangsprompt hinzu.',
+  },
+  modelConfig: {
+    model: 'Modell',
+    setTone: 'Ton der Antworten festlegen',
+    title: 'Modell und Parameter',
+    modeType: {
+      chat: 'Chat',
+      completion: 'Vollst盲ndig',
+    },
+  },
+  inputs: {
+    title: 'Debug und Vorschau',
+    noPrompt: 'Versuchen Sie, etwas Prompt im Vor-Prompt-Eingabefeld zu schreiben',
+    userInputField: 'Benutzereingabefeld',
+    noVar: 'F眉llen Sie den Wert der Variable aus, der bei jedem Start einer neuen Sitzung automatisch im Prompt ersetzt wird.',
+    chatVarTip:
+      'F眉llen Sie den Wert der Variable aus, der bei jedem Start einer neuen Sitzung automatisch im Prompt ersetzt wird',
+    completionVarTip:
+      'F眉llen Sie den Wert der Variable aus, der bei jeder Einreichung einer Frage automatisch in den Prompt-W枚rtern ersetzt wird.',
+    previewTitle: 'Prompt-Vorschau',
+    queryTitle: 'Anfrageinhalt',
+    queryPlaceholder: 'Bitte geben Sie den Anfragetext ein.',
+    run: 'AUSF脺HREN',
+  },
+  result: 'Ausgabetext',
+  datasetConfig: {
+    settingTitle: 'Abfragen-Einstellungen',
+    retrieveOneWay: {
+      title: 'N-zu-1-Abfrage',
+      description: 'Basierend auf Benutzerabsicht und Beschreibungen des Wissens w盲hlt der Agent autonom das beste Wissen f眉r die Abfrage aus. Am besten f眉r Anwendungen mit deutlichen, begrenzten Wissensgebieten.',
+    },
+    retrieveMultiWay: {
+      title: 'Mehrwegabfrage',
+      description: 'Basierend auf Benutzerabsicht werden Abfragen 眉ber alle Wissensbereiche hinweg durchgef眉hrt, relevante Texte aus Mehrfachquellen abgerufen und die besten Ergebnisse, die der Benutzerabfrage entsprechen, nach einer Neubewertung ausgew盲hlt. Konfiguration des Rerank-Modell-APIs erforderlich.',
+    },
+    rerankModelRequired: 'Rerank-Modell erforderlich',
+    params: 'Parameter',
+    top_k: 'Top K',
+    top_kTip: 'Wird verwendet, um Abschnitte zu filtern, die am 盲hnlichsten zu Benutzerfragen sind. Das System wird auch dynamisch den Wert von Top K anpassen, entsprechend max_tokens des ausgew盲hlten Modells.',
+    score_threshold: 'Schwellenwert',
+    score_thresholdTip: 'Wird verwendet, um den 脛hnlichkeitsschwellenwert f眉r die Abschnittsfilterung einzustellen.',
+    retrieveChangeTip: 'Das 脛ndern des Indexmodus und des Abfragemodus kann Anwendungen beeinflussen, die mit diesem Wissen verbunden sind.',
+  },
+  debugAsSingleModel: 'Als Einzelmodell debuggen',
+  debugAsMultipleModel: 'Als Mehrfachmodelle debuggen',
+  duplicateModel: 'Duplizieren',
+  publishAs: 'Ver枚ffentlichen als',
+  assistantType: {
+    name: 'Assistententyp',
+    chatAssistant: {
+      name: 'Basisassistent',
+      description: 'Erstellen eines chatbasierten Assistenten mit einem Gro脽sprachmodell',
+    },
+    agentAssistant: {
+      name: 'Agentenassistent',
+      description: 'Erstellen eines intelligenten Agenten, der autonom Werkzeuge w盲hlen kann, um Aufgaben zu erf眉llen',
+    },
+  },
+  agent: {
+    agentMode: 'Agentenmodus',
+    agentModeDes: 'Den Typ des Inferenzmodus f眉r den Agenten festlegen',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: 'Funktionsaufruf',
+    },
+    setting: {
+      name: 'Agenten-Einstellungen',
+      description: 'Agentenassistenten-Einstellungen erm枚glichen die Festlegung des Agentenmodus und erweiterte Funktionen wie integrierte Prompts, nur verf眉gbar im Agententyp.',
+      maximumIterations: {
+        name: 'Maximale Iterationen',
+        description: 'Begrenzt die Anzahl der Iterationen, die ein Agentenassistent ausf眉hren kann',
+      },
+    },
+    buildInPrompt: 'Eingebautes Prompt',
+    firstPrompt: 'Erstes Prompt',
+    nextIteration: 'N盲chste Iteration',
+    promptPlaceholder: 'Schreiben Sie hier Ihr Prompt',
+    tools: {
+      name: 'Werkzeuge',
+      description: 'Die Verwendung von Werkzeugen kann die F盲higkeiten von LLM erweitern, z.B. das Internet durchsuchen oder wissenschaftliche Berechnungen durchf眉hren',
+      enabled: 'Aktiviert',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/de-DE/app-log.ts b/i18n/de-DE/app-log.ts
new file mode 100644
index 0000000..a739360
--- /dev/null
+++ b/i18n/de-DE/app-log.ts
@@ -0,0 +1,98 @@
+const translation = {
+  title: 'Protokolle',
+  description: 'Die Protokolle zeichnen den Betriebsstatus der Anwendung auf, einschlie脽lich Benutzereingaben und KI-Antworten.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: 'Aktualisierungszeit',
+      time: 'Erstellungszeit',
+      endUser: 'Endbenutzer oder Konto',
+      input: 'Eingabe',
+      output: 'Ausgabe',
+      summary: 'Titel',
+      messageCount: 'Nachrichtenzahl',
+      userRate: 'Benutzerbewertung',
+      adminRate: 'Op. Bewertung',
+      user: 'Endbenutzer oder Konto',
+      status: 'STATUS',
+      runtime: 'LAUFZEIT',
+      version: 'VERSION',
+      tokens: 'TOKEN',
+      startTime: 'STARTZEIT',
+    },
+    pagination: {
+      previous: 'Vorherige',
+      next: 'N盲chste',
+    },
+    empty: {
+      noChat: 'Noch keine Konversation',
+      noOutput: 'Keine Ausgabe',
+      element: {
+        title: 'Ist da jemand?',
+        content: 'Beobachten und annotieren Sie hier die Interaktionen zwischen Endbenutzern und KI-Anwendungen, um die Genauigkeit der KI kontinuierlich zu verbessern. Sie k枚nnen versuchen, die Web-App selbst <shareLink>zu teilen</shareLink> oder <testLink>zu testen</testLink>, und dann zu dieser Seite zur眉ckkehren.',
+      },
+    },
+  },
+  detail: {
+    time: 'Zeit',
+    conversationId: 'Konversations-ID',
+    promptTemplate: 'Prompt-Vorlage',
+    promptTemplateBeforeChat: 'Prompt-Vorlage vor dem Chat 路 Als Systemnachricht',
+    annotationTip: 'Verbesserungen markiert von {{user}}',
+    timeConsuming: '',
+    second: 's',
+    tokenCost: 'Verbrauchte Token',
+    loading: 'l盲dt',
+    operation: {
+      like: 'gef盲llt mir',
+      dislike: 'gef盲llt mir nicht',
+      addAnnotation: 'Verbesserung hinzuf眉gen',
+      editAnnotation: 'Verbesserung bearbeiten',
+      annotationPlaceholder: 'Geben Sie die erwartete Antwort ein, die Sie m枚chten, dass die KI antwortet, welche f眉r die Feinabstimmung des Modells und die kontinuierliche Verbesserung der Qualit盲t der Textgenerierung in Zukunft verwendet werden kann.',
+    },
+    variables: 'Variablen',
+    uploadImages: 'Hochgeladene Bilder',
+    modelParams: 'Modellparameter',
+  },
+  filter: {
+    period: {
+      today: 'Heute',
+      last7days: 'Letzte 7 Tage',
+      last4weeks: 'Letzte 4 Wochen',
+      last3months: 'Letzte 3 Monate',
+      last12months: 'Letzte 12 Monate',
+      monthToDate: 'Monat bis heute',
+      quarterToDate: 'Quartal bis heute',
+      yearToDate: 'Jahr bis heute',
+      allTime: 'Gesamte Zeit',
+    },
+    annotation: {
+      all: 'Alle',
+      annotated: 'Markierte Verbesserungen ({{count}} Elemente)',
+      not_annotated: 'Nicht annotiert',
+    },
+    sortBy: 'Sortieren nach:',
+    descending: 'absteigend',
+    ascending: 'aufsteigend',
+  },
+  workflowTitle: 'Workflow-Protokolle',
+  workflowSubtitle: 'Das Protokoll hat den Vorgang von Automate aufgezeichnet.',
+  runDetail: {
+    title: 'Konversationsprotokoll',
+    workflowTitle: 'Protokolldetail',
+    fileListLabel: 'Details zur Datei',
+    fileListDetail: 'Detail',
+  },
+  promptLog: 'Prompt-Protokoll',
+  agentLog: 'Agentenprotokoll',
+  viewLog: 'Protokoll anzeigen',
+  agentLogDetail: {
+    agentMode: 'Agentenmodus',
+    toolUsed: 'Verwendetes Werkzeug',
+    iterations: 'Iterationen',
+    iteration: 'Iteration',
+    finalProcessing: 'Endverarbeitung',
+  },
+}
+
+export default translation
diff --git a/i18n/de-DE/app-overview.ts b/i18n/de-DE/app-overview.ts
new file mode 100644
index 0000000..fea278d
--- /dev/null
+++ b/i18n/de-DE/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: 'Um zu beginnen,',
+    enterKeyTip: 'geben Sie unten Ihren OpenAI-API-Schl眉ssel ein',
+    getKeyTip: 'Holen Sie sich Ihren API-Schl眉ssel vom OpenAI-Dashboard',
+    placeholder: 'Ihr OpenAI-API-Schl眉ssel (z.B. sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: 'Sie nutzen das Testkontingent von {{providerName}}.',
+        description: 'Das Testkontingent wird f眉r Ihre Testnutzung bereitgestellt. Bevor das Testkontingent aufgebraucht ist, richten Sie bitte Ihren eigenen Modellanbieter ein oder kaufen zus盲tzliches Kontingent.',
+      },
+      exhausted: {
+        title: 'Ihr Testkontingent wurde aufgebraucht, bitte richten Sie Ihren APIKey ein.',
+        description: 'Ihr Testkontingent ist aufgebraucht. Bitte richten Sie Ihren eigenen Modellanbieter ein oder kaufen zus盲tzliches Kontingent.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: 'Um zu beginnen,',
+        row2: 'richten Sie zuerst Ihren Modellanbieter ein.',
+      },
+    },
+    callTimes: 'Aufrufzeiten',
+    usedToken: 'Verwendetes Token',
+    setAPIBtn: 'Zum Einrichten des Modellanbieters gehen',
+    tryCloud: 'Oder probieren Sie die Cloud-Version von Dify mit kostenlosem Angebot aus',
+  },
+  overview: {
+    title: '脺bersicht',
+    appInfo: {
+      explanation: 'Einsatzbereite AI-WebApp',
+      accessibleAddress: '脰ffentliche URL',
+      preview: 'Vorschau',
+      regenerate: 'Regenerieren',
+      regenerateNotice: 'M枚chten Sie die 枚ffentliche URL neu generieren?',
+      preUseReminder: 'Bitte aktivieren Sie WebApp, bevor Sie fortfahren.',
+      settings: {
+        entry: 'Einstellungen',
+        title: 'WebApp-Einstellungen',
+        webName: 'WebApp-Name',
+        webDesc: 'WebApp-Beschreibung',
+        webDescTip: 'Dieser Text wird auf der Clientseite angezeigt und bietet grundlegende Anleitungen zur Verwendung der Anwendung',
+        webDescPlaceholder: 'Geben Sie die Beschreibung der WebApp ein',
+        language: 'Sprache',
+        workflow: {
+          title: 'Workflow-Schritte',
+          show: 'Anzeigen',
+          hide: 'Verbergen',
+          subTitle: 'Details zum Arbeitsablauf',
+          showDesc: 'Ein- oder Ausblenden von Workflow-Details in der WebApp',
+        },
+        chatColorTheme: 'Chat-Farbschema',
+        chatColorThemeDesc: 'Legen Sie das Farbschema des Chatbots fest',
+        chatColorThemeInverted: 'Invertiert',
+        invalidHexMessage: 'Ung眉ltiger Hex-Wert',
+        invalidPrivacyPolicy: 'Ung眉ltiger Link zur Datenschutzrichtlinie. Bitte verwenden Sie einen g眉ltigen Link, der mit http oder https beginnt',
+        more: {
+          entry: 'Mehr Einstellungen anzeigen',
+          copyright: 'Urheberrecht',
+          copyRightPlaceholder: 'Geben Sie den Namen des Autors oder der Organisation ein',
+          privacyPolicy: 'Datenschutzrichtlinie',
+          privacyPolicyPlaceholder: 'Geben Sie den Link zur Datenschutzrichtlinie ein',
+          privacyPolicyTip: 'Hilft Besuchern zu verstehen, welche Daten die Anwendung sammelt, siehe Difys <privacyPolicyLink>Datenschutzrichtlinie</privacyPolicyLink>.',
+          customDisclaimer: 'Benutzerdefinierte Haftungsausschluss',
+          customDisclaimerPlaceholder: 'Geben Sie den benutzerdefinierten Haftungsausschluss-Text ein',
+          customDisclaimerTip: 'Der ben userdefinierte Haftungsausschluss-Text wird auf der Clientseite angezeigt und bietet zus盲tzliche Informationen 眉ber die Anwendung',
+          copyrightTip: 'Copyright-Informationen in der Webapp anzeigen',
+          copyrightTooltip: 'Bitte f眉hren Sie ein Upgrade auf den Professional-Plan oder h枚her durch',
+        },
+        sso: {
+          title: 'WebApp-SSO',
+          description: 'Alle Benutzer m眉ssen sich mit SSO anmelden, bevor sie WebApp verwenden k枚nnen',
+          label: 'SSO-Authentifizierung',
+          tooltip: 'Wenden Sie sich an den Administrator, um WebApp-SSO zu aktivieren',
+        },
+        modalTip: 'Einstellungen f眉r clientseitige Web-Apps.',
+      },
+      embedded: {
+        entry: 'Eingebettet',
+        title: 'Einbetten auf der Website',
+        explanation: 'W盲hlen Sie die Art und Weise, wie die Chat-App auf Ihrer Website eingebettet wird',
+        iframe: 'Um die Chat-App an einer beliebigen Stelle auf Ihrer Website hinzuzuf眉gen, f眉gen Sie diesen iframe in Ihren HTML-Code ein.',
+        scripts: 'Um eine Chat-App unten rechts auf Ihrer Website hinzuzuf眉gen, f眉gen Sie diesen Code in Ihren HTML-Code ein.',
+        chromePlugin: 'Installieren Sie die Dify Chatbot Chrome-Erweiterung',
+        copied: 'Kopiert',
+        copy: 'Kopieren',
+      },
+      qrcode: {
+        title: 'QR-Code zum Teilen',
+        scan: 'Teilen Sie die Anwendung per Scan',
+        download: 'QR-Code herunterladen',
+      },
+      customize: {
+        way: 'Art',
+        entry: 'Anpassen',
+        title: 'AI-WebApp anpassen',
+        explanation: 'Sie k枚nnen das Frontend der Web-App an Ihre Szenarien und Stilbed眉rfnisse anpassen.',
+        way1: {
+          name: 'Forken Sie den Client-Code, 盲ndern Sie ihn und deployen Sie ihn auf Vercel (empfohlen)',
+          step1: 'Forken Sie den Client-Code und 盲ndern Sie ihn',
+          step1Tip: 'Klicken Sie hier, um den Quellcode in Ihr GitHub-Konto zu forken und den Code zu 盲ndern',
+          step1Operation: 'Dify-WebClient',
+          step2: 'Deployen auf Vercel',
+          step2Tip: 'Klicken Sie hier, um das Repository in Vercel zu importieren und zu deployen',
+          step2Operation: 'Repository importieren',
+          step3: 'Umgebungsvariablen konfigurieren',
+          step3Tip: 'F眉gen Sie die folgenden Umgebungsvariablen in Vercel hinzu',
+        },
+        way2: {
+          name: 'Clientseitigen Code schreiben, um die API aufzurufen, und ihn auf einem Server deployen',
+          operation: 'Dokumentation',
+        },
+      },
+      launch: 'Abschie脽en',
+    },
+    apiInfo: {
+      title: 'Backend-Service-API',
+      explanation: 'Einfach in Ihre Anwendung integrierbar',
+      accessibleAddress: 'Service-API-Endpunkt',
+      doc: 'API-Referenz',
+    },
+    status: {
+      running: 'In Betrieb',
+      disable: 'Deaktivieren',
+    },
+  },
+  analysis: {
+    title: 'Analyse',
+    ms: 'ms',
+    tokenPS: 'Token/s',
+    totalMessages: {
+      title: 'Gesamtnachrichten',
+      explanation: 'T盲gliche Anzahl der KI-Interaktionen.',
+    },
+    totalConversations: {
+      title: 'Gesamte Konversationen',
+      explanation: 'T盲gliche Anzahl der KI-Konversationen; Prompt-Engineering/Debugging ausgeschlossen.',
+    },
+    activeUsers: {
+      title: 'Aktive Benutzer',
+      explanation: 'Einzigartige Benutzer, die mit AI Q&A f眉hren; Prompt-Engineering/Debugging ausgenommen.',
+    },
+    tokenUsage: {
+      title: 'Token-Verbrauch',
+      explanation: 'Spiegelt den t盲glichen Token-Verbrauch des Sprachmodells f眉r die Anwendung wider, n眉tzlich f眉r Kostenkontrollzwecke.',
+      consumed: 'Verbraucht',
+    },
+    avgSessionInteractions: {
+      title: 'Durchschn. Sitzungsinteraktionen',
+      explanation: 'Fortlaufende Benutzer-KI-Kommunikationsz盲hlung; f眉r konversationsbasierte Apps.',
+    },
+    userSatisfactionRate: {
+      title: 'Benutzerzufriedenheitsrate',
+      explanation: 'Die Anzahl der Likes pro 1.000 Nachrichten. Dies zeigt den Anteil der Antworten an, mit denen die Benutzer sehr zufrieden sind.',
+    },
+    avgResponseTime: {
+      title: 'Durchschn. Antwortzeit',
+      explanation: 'Zeit (ms) f眉r die AI, um zu verarbeiten/antworten; f眉r textbasierte Apps.',
+    },
+    tps: {
+      title: 'Token-Ausgabegeschwindigkeit',
+      explanation: 'Misst die Leistung des LLM. Z盲hlt die Token-Ausgabegeschwindigkeit des LLM vom Beginn der Anfrage bis zum Abschluss der Ausgabe.',
+    },
+    avgUserInteractions: {
+      explanation: 'Spiegelt die t盲gliche Nutzungsh盲ufigkeit der Benutzer wider. Diese Metrik spiegelt die Bindung der Benutzer wider.',
+      title: 'Durchschnittliche Benutzerinteraktionen',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/de-DE/app.ts b/i18n/de-DE/app.ts
new file mode 100644
index 0000000..d9454a2
--- /dev/null
+++ b/i18n/de-DE/app.ts
@@ -0,0 +1,221 @@
+const translation = {
+  createApp: 'Neue App erstellen',
+  types: {
+    all: 'Alle',
+    assistant: 'Assistent',
+    completion: 'Vervollst盲ndigung',
+    workflow: 'Arbeitsablauf',
+    agent: 'Agent',
+    chatbot: 'Chatbot',
+    basic: 'Grundlegend',
+    advanced: 'Chatflow',
+  },
+  modes: {
+    completion: 'Textgenerator',
+    chat: 'Basisassistent',
+  },
+  createFromConfigFile: 'App aus Konfigurationsdatei erstellen',
+  deleteAppConfirmTitle: 'Diese App l枚schen?',
+  deleteAppConfirmContent:
+    'Das L枚schen der App ist unwiderruflich. Nutzer werden keinen Zugang mehr zu Ihrer App haben, und alle Prompt-Konfigurationen und Logs werden dauerhaft gel枚scht.',
+  appDeleted: 'App gel枚scht',
+  appDeleteFailed: 'L枚schen der App fehlgeschlagen',
+  join: 'Treten Sie der Gemeinschaft bei',
+  communityIntro:
+    'Diskutieren Sie mit Teammitgliedern, Mitwirkenden und Entwicklern auf verschiedenen Kan盲len.',
+  roadmap: 'Sehen Sie unseren Fahrplan',
+  appNamePlaceholder: 'Bitte geben Sie den Namen der App ein',
+  newApp: {
+    startToCreate: 'Lassen Sie uns mit Ihrer neuen App beginnen',
+    captionName: 'App-Symbol & Name',
+    captionAppType: 'Welchen Typ von App m枚chten Sie erstellen?',
+    previewDemo: 'Vorschau-Demo',
+    chatApp: 'Assistent',
+    chatAppIntro:
+      'Ich m枚chte eine Chat-basierte Anwendung bauen. Diese App verwendet ein Frage-Antwort-Format und erm枚glicht mehrere Runden kontinuierlicher Konversation.',
+    agentAssistant: 'Neuer Agentenassistent',
+    completeApp: 'Textgenerator',
+    completeAppIntro:
+      'Ich m枚chte eine Anwendung erstellen, die hochwertigen Text basierend auf Aufforderungen generiert, wie z.B. das Erstellen von Artikeln, Zusammenfassungen, 脺bersetzungen und mehr.',
+    showTemplates: 'Ich m枚chte aus einer Vorlage w盲hlen',
+    hideTemplates: 'Zur眉ck zur Modusauswahl',
+    Create: 'Erstellen',
+    Cancel: 'Abbrechen',
+    nameNotEmpty: 'Name darf nicht leer sein',
+    appTemplateNotSelected: 'Bitte w盲hlen Sie eine Vorlage',
+    appTypeRequired: 'Bitte w盲hlen Sie einen App-Typ',
+    appCreated: 'App erstellt',
+    appCreateFailed: 'Erstellen der App fehlgeschlagen',
+    basic: 'Grundlegend',
+    chatbotType: 'Chatbot-Orchestrierungsmethode',
+    workflowDescription: 'Erstellen Sie eine Anwendung, die qualitativ hochwertigen Text auf der Grundlage von Workflow-Orchestrierungen mit einem hohen Ma脽 an Anpassung generiert. Es ist f眉r erfahrene Benutzer geeignet.',
+    advancedFor: 'F眉r Fortgeschrittene',
+    startFromTemplate: 'Aus Vorlage erstellen',
+    appNamePlaceholder: 'Geben Sie Ihrer App einen Namen',
+    startFromBlank: 'Aus Leer erstellen',
+    basicTip: 'F眉r Anf盲nger k枚nnen Sie sp盲ter zu Chatflow wechseln',
+    basicDescription: 'Basic Orchestrate erm枚glicht die Orchestrierung einer Chatbot-App mit einfachen Einstellungen, ohne die M枚glichkeit, integrierte Eingabeaufforderungen zu 盲ndern. Es ist f眉r Anf盲nger geeignet.',
+    workflowWarning: 'Derzeit in der Beta-Phase',
+    advancedDescription: 'Workflow Orchestrate orchestriert Chatbots in Form von Workflows und bietet ein hohes Ma脽 an Individualisierung, einschlie脽lich der M枚glichkeit, integrierte Eingabeaufforderungen zu bearbeiten. Es ist f眉r erfahrene Benutzer geeignet.',
+    basicFor: 'F脺R ANF脛NGER',
+    completionWarning: 'Diese Art von App wird nicht mehr unterst眉tzt.',
+    chatbotDescription: 'Erstellen Sie eine chatbasierte Anwendung. Diese App verwendet ein Frage-und-Antwort-Format, das mehrere Runden kontinuierlicher Konversation erm枚glicht.',
+    captionDescription: 'Beschreibung',
+    advanced: 'Chatflow',
+    useTemplate: 'Diese Vorlage verwenden',
+    agentDescription: 'Erstellen Sie einen intelligenten Agenten, der autonom Werkzeuge ausw盲hlen kann, um die Aufgaben zu erledigen',
+    completionDescription: 'Erstellen Sie eine Anwendung, die qualitativ hochwertigen Text auf der Grundlage von Eingabeaufforderungen generiert, z. B. zum Generieren von Artikeln, Zusammenfassungen, 脺bersetzungen und mehr.',
+    appDescriptionPlaceholder: 'Geben Sie die Beschreibung der App ein',
+    caution: 'Vorsicht',
+    Confirm: 'Best盲tigen',
+    appCreateDSLErrorTitle: 'Inkompatibilit盲t der Version',
+    appCreateDSLErrorPart2: 'M枚chten Sie fortfahren?',
+    appCreateDSLErrorPart4: 'Systemgest眉tzte DSL-Version:',
+    appCreateDSLErrorPart1: 'Es wurde ein signifikanter Unterschied bei den DSL-Versionen festgestellt. Das Erzwingen des Imports kann zu Fehlfunktionen der Anwendung f眉hren.',
+    appCreateDSLErrorPart3: 'Aktuelle DSL-Version der Anwendung:',
+    appCreateDSLWarning: 'Achtung: Ein unterschiedlicher DSL-Versionsunterschied kann sich auf bestimmte Funktionen auswirken',
+    learnMore: 'Weitere Informationen',
+    optional: 'Wahlfrei',
+    noTemplateFound: 'Keine Vorlagen gefunden',
+    workflowUserDescription: 'Workflow-Orchestrierung f眉r Aufgaben in einer einzigen Runde wie Automatisierung und Stapelverarbeitung.',
+    foundResults: '{{Anzahl}} Befund',
+    chatbotShortDescription: 'LLM-basierter Chatbot mit einfacher Einrichtung',
+    completionUserDescription: 'Erstellen Sie schnell einen KI-Assistenten f眉r Textgenerierungsaufgaben mit einfacher Konfiguration.',
+    noAppsFound: 'Keine Apps gefunden',
+    advancedShortDescription: 'Workflow f眉r komplexe Dialoge mit mehreren Durchl盲ufen mit Speicher',
+    forAdvanced: 'F脺R FORTGESCHRITTENE',
+    chooseAppType: 'App-Typ ausw盲hlen',
+    completionShortDescription: 'KI-Assistent f眉r Textgenerierungsaufgaben',
+    forBeginners: 'F脺R ANF脛NGER',
+    noIdeaTip: 'Keine Ideen? Schauen Sie sich unsere Vorlagen an',
+    workflowShortDescription: 'Orchestrierung f眉r Single-Turn-Automatisierungsaufgaben',
+    noTemplateFoundTip: 'Versuchen Sie, mit verschiedenen Schl眉sselw枚rtern zu suchen.',
+    advancedUserDescription: 'Workflow-Orchestrierung f眉r komplexe Dialogaufgaben mit mehreren Runden und Speicherkapazit盲ten.',
+    chatbotUserDescription: 'Erstellen Sie schnell einen LLM-basierten Chatbot mit einfacher Konfiguration. Sie k枚nnen sp盲ter zu Chatflow wechseln.',
+    foundResult: '{{Anzahl}} Ergebnis',
+    agentUserDescription: 'Ein intelligenter Agent, der in der Lage ist, iteratives Denken zu f眉hren und autonome Werkzeuge zu verwenden, um Aufgabenziele zu erreichen.',
+    agentShortDescription: 'Intelligenter Agent mit logischem Denken und autonomer Werkzeugnutzung',
+  },
+  editApp: 'App bearbeiten',
+  editAppTitle: 'App-Informationen bearbeiten',
+  editDone: 'App-Informationen wurden aktualisiert',
+  editFailed: 'Aktualisierung der App-Informationen fehlgeschlagen',
+  iconPicker: {
+    ok: 'OK',
+    cancel: 'Abbrechen',
+    emoji: 'Emoji',
+    image: 'Bild',
+  },
+  switch: 'Zu Workflow-Orchestrierung wechseln',
+  switchTipStart: 'Eine neue App-Kopie wird f眉r Sie erstellt, und die neue Kopie wird zur Workflow-Orchestrierung wechseln. Die neue Kopie wird ',
+  switchTip: 'nicht erlauben',
+  switchTipEnd: ' zur Basis-Orchestrierung zur眉ckzuwechseln.',
+  switchLabel: 'Die zu erstellende App-Kopie',
+  removeOriginal: 'Urspr眉ngliche App l枚schen',
+  switchStart: 'Wechsel starten',
+  typeSelector: {
+    all: 'ALLE Typen',
+    chatbot: 'Chatbot',
+    agent: 'Agent',
+    workflow: 'Workflow',
+    completion: 'Vervollst盲ndigung',
+    advanced: 'Chatflow',
+  },
+  tracing: {
+    title: 'Anwendungsleistung nachverfolgen',
+    description: 'Konfiguration eines Drittanbieter-LLMOps-Anbieters und Nachverfolgung der Anwendungsleistung.',
+    config: 'Konfigurieren',
+    collapse: 'Einklappen',
+    expand: 'Ausklappen',
+    tracing: 'Nachverfolgung',
+    disabled: 'Deaktiviert',
+    disabledTip: 'Bitte zuerst den Anbieter konfigurieren',
+    enabled: 'In Betrieb',
+    tracingDescription: 'Erfassung des vollst盲ndigen Kontexts der Anwendungsausf眉hrung, einschlie脽lich LLM-Aufrufe, Kontext, Prompts, HTTP-Anfragen und mehr, auf einer Nachverfolgungsplattform von Drittanbietern.',
+    configProviderTitle: {
+      configured: 'Konfiguriert',
+      notConfigured: 'Anbieter konfigurieren, um Nachverfolgung zu aktivieren',
+      moreProvider: 'Weitere Anbieter',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: 'Eine All-in-One-Entwicklerplattform f眉r jeden Schritt des LLM-gesteuerten Anwendungslebenszyklus.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: 'Traces, Bewertungen, Prompt-Management und Metriken zum Debuggen und Verbessern Ihrer LLM-Anwendung.',
+    },
+    inUse: 'In Verwendung',
+    configProvider: {
+      title: 'Konfigurieren ',
+      placeholder: 'Geben Sie Ihren {{key}} ein',
+      project: 'Projekt',
+      publicKey: '脰ffentlicher Schl眉ssel',
+      secretKey: 'Geheimer Schl眉ssel',
+      viewDocsLink: '{{key}}-Dokumentation ansehen',
+      removeConfirmTitle: '{{key}}-Konfiguration entfernen?',
+      removeConfirmContent: 'Die aktuelle Konfiguration wird verwendet. Das Entfernen wird die Nachverfolgungsfunktion ausschalten.',
+    },
+    view: 'Ansehen',
+    opik: {
+      description: 'Opik ist eine Open-Source-Plattform zum Bewerten, Testen und 脺berwachen von LLM-Anwendungen.',
+      title: 'Opik',
+    },
+    weave: {
+      title: 'Weben',
+      description: 'Weave ist eine Open-Source-Plattform zur Bewertung, Testung und 脺berwachung von LLM-Anwendungen.',
+    },
+  },
+  answerIcon: {
+    descriptionInExplore: 'Gibt an, ob das WebApp-Symbol zum Ersetzen 馃 in Explore verwendet werden soll',
+    title: 'Verwenden Sie das WebApp-Symbol, um es zu ersetzen 馃',
+    description: 'Gibt an, ob das WebApp-Symbol zum Ersetzen 馃 in der freigegebenen Anwendung verwendet werden soll',
+  },
+  importFromDSLUrlPlaceholder: 'DSL-Link hier einf眉gen',
+  duplicate: 'Duplikat',
+  importFromDSL: 'Import von DSL',
+  importDSL: 'DSL-Datei importieren',
+  importFromDSLUrl: 'Von URL',
+  exportFailed: 'Fehler beim Exportieren von DSL.',
+  importFromDSLFile: 'Aus DSL-Datei',
+  export: 'DSL exportieren',
+  duplicateTitle: 'App duplizieren',
+  mermaid: {
+    handDrawn: 'Handgezeichnet',
+    classic: 'Klassisch',
+  },
+  openInExplore: 'In Explore 枚ffnen',
+  newAppFromTemplate: {
+    sidebar: {
+      Recommended: 'Empfohlen',
+      Assistant: 'Assistent',
+      Writing: 'Schrift',
+      Workflow: 'Arbeitsablauf',
+      Programming: 'Programmieren',
+      Agent: 'Agent',
+      HR: 'HR',
+    },
+    byCategories: 'NACH KATEGORIEN',
+    searchAllTemplate: 'Alle Vorlagen durchsuchen...',
+  },
+  showMyCreatedAppsOnly: 'Nur meine erstellten Apps anzeigen',
+  appSelector: {
+    placeholder: 'W盲hlen Sie eine App aus...',
+    params: 'APP-PARAMETER',
+    label: 'APP',
+    noParams: 'Keine Parameter erforderlich',
+  },
+  structOutput: {
+    required: 'Erforderlich',
+    structured: 'Strukturiert',
+    structuredTip: 'Strukturierte Ausgaben ist eine Funktion, die sicherstellt, dass das Modell immer Antworten generiert, die Ihrem bereitgestellten JSON-Schema entsprechen.',
+    modelNotSupportedTip: 'Das aktuelle Modell unterst眉tzt diese Funktion nicht und wird automatisch auf Eingabeinjektion heruntergestuft.',
+    modelNotSupported: 'Modell nicht unterst眉tzt',
+    configure: 'Konfigurieren',
+    notConfiguredTip: 'Die strukturierte Ausgabe wurde bisher nicht konfiguriert.',
+    moreFillTip: 'Maximal 10 Ebenen der Verschachtelung anzeigen',
+    LLMResponse: 'LLM-Antwort',
+  },
+}
+
+export default translation
diff --git a/i18n/de-DE/billing.ts b/i18n/de-DE/billing.ts
new file mode 100644
index 0000000..f0a0f19
--- /dev/null
+++ b/i18n/de-DE/billing.ts
@@ -0,0 +1,200 @@
+const translation = {
+  currentPlan: 'Aktueller Tarif',
+  upgradeBtn: {
+    plain: 'Tarif Upgraden',
+    encourage: 'Jetzt Upgraden',
+    encourageShort: 'Upgraden',
+  },
+  viewBilling: 'Abrechnung und Abonnements verwalten',
+  buyPermissionDeniedTip: 'Bitte kontaktieren Sie Ihren Unternehmensadministrator, um zu abonnieren',
+  plansCommon: {
+    title: 'W盲hlen Sie einen Tarif, der zu Ihnen passt',
+    yearlyTip: 'Erhalten Sie 2 Monate kostenlos durch j盲hrliches Abonnieren!',
+    mostPopular: 'Am beliebtesten',
+    planRange: {
+      monthly: 'Monatlich',
+      yearly: 'J盲hrlich',
+    },
+    month: 'Monat',
+    year: 'Jahr',
+    save: 'Sparen ',
+    free: 'Kostenlos',
+    currentPlan: 'Aktueller Tarif',
+    contractSales: 'Vertrieb kontaktieren',
+    contractOwner: 'Teammanager kontaktieren',
+    startForFree: 'Kostenlos starten',
+    getStartedWith: 'Beginnen Sie mit ',
+    contactSales: 'Vertrieb kontaktieren',
+    talkToSales: 'Mit dem Vertrieb sprechen',
+    modelProviders: 'Modellanbieter',
+    teamMembers: 'Teammitglieder',
+    buildApps: 'Apps bauen',
+    vectorSpace: 'Vektorraum',
+    vectorSpaceBillingTooltip: 'Jedes 1MB kann ungef盲hr 1,2 Millionen Zeichen an vektorisierten Daten speichern (gesch盲tzt mit OpenAI Embeddings, variiert je nach Modell).',
+    vectorSpaceTooltip: 'Vektorraum ist das Langzeitspeichersystem, das erforderlich ist, damit LLMs Ihre Daten verstehen k枚nnen.',
+    documentsUploadQuota: 'Dokumenten-Upload-Kontingent',
+    documentProcessingPriority: 'Priorit盲t der Dokumentenverarbeitung',
+    documentProcessingPriorityTip: 'F眉r eine h枚here Dokumentenverarbeitungspriorit盲t, bitte Ihren Tarif upgraden.',
+    documentProcessingPriorityUpgrade: 'Mehr Daten mit h枚herer Genauigkeit bei schnelleren Geschwindigkeiten verarbeiten.',
+    priority: {
+      'standard': 'Standard',
+      'priority': 'Priorit盲t',
+      'top-priority': 'H枚chste Priorit盲t',
+    },
+    logsHistory: 'Protokollverlauf',
+    customTools: 'Benutzerdefinierte Werkzeuge',
+    unavailable: 'Nicht verf眉gbar',
+    days: 'Tage',
+    unlimited: 'Unbegrenzt',
+    support: 'Support',
+    supportItems: {
+      communityForums: 'Community-Foren',
+      emailSupport: 'E-Mail-Support',
+      priorityEmail: 'Priorisierter E-Mail- und Chat-Support',
+      logoChange: 'Logo-脛nderung',
+      SSOAuthentication: 'SSO-Authentifizierung',
+      personalizedSupport: 'Pers枚nlicher Support',
+      dedicatedAPISupport: 'Dedizierter API-Support',
+      customIntegration: 'Benutzerdefinierte Integration und Support',
+      ragAPIRequest: 'RAG-API-Anfragen',
+      bulkUpload: 'Massenupload von Dokumenten',
+      agentMode: 'Agentenmodus',
+      workflow: 'Workflow',
+      llmLoadingBalancing: 'LLM-Lastausgleich',
+      llmLoadingBalancingTooltip: 'F眉gen Sie Modellen mehrere API-Schl眉ssel hinzu, um die API-Ratenlimits effektiv zu umgehen.',
+    },
+    comingSoon: 'Demn盲chst',
+    member: 'Mitglied',
+    memberAfter: 'Mitglied',
+    messageRequest: {
+      title: 'Nachrichtenguthaben',
+      tooltip: 'Nachrichtenaufrufkontingente f眉r verschiedene Tarife unter Verwendung von OpenAI-Modellen (au脽er gpt4).Nachrichten 眉ber dem Limit verwenden Ihren OpenAI-API-Schl眉ssel.',
+      titlePerMonth: '{{count,number}} Nachrichten/Monat',
+    },
+    annotatedResponse: {
+      title: 'Kontingentgrenzen f眉r Annotationen',
+      tooltip: 'Manuelle Bearbeitung und Annotation von Antworten bieten anpassbare, hochwertige Frage-Antwort-F盲higkeiten f眉r Apps. (Nur anwendbar in Chat-Apps)',
+    },
+    ragAPIRequestTooltip: 'Bezieht sich auf die Anzahl der API-Aufrufe, die nur die Wissensdatenbankverarbeitungsf盲higkeiten von Dify aufrufen.',
+    receiptInfo: 'Nur der Teaminhaber und der Teamadministrator k枚nnen abonnieren und Abrechnungsinformationen einsehen',
+    annotationQuota: 'Kontingent f眉r Anmerkungen',
+    unlimitedApiRate: 'Keine API-Ratebeschr盲nkung',
+    teamMember_other: '{{count,number}} Teammitglieder',
+    priceTip: 'pro Arbeitsbereich/',
+    teamWorkspace: '{{count,number}} Team Arbeitsplatz',
+    annualBilling: 'J盲hrliche Abrechnung',
+    self: 'Selbst gehostet',
+    freeTrialTipPrefix: 'Melden Sie sich an und erhalten Sie ein',
+    cloud: 'Cloud-Dienst',
+    apiRateLimitTooltip: 'Die API-Datenbeschr盲nkung gilt f眉r alle Anfragen, die 眉ber die Dify-API gemacht werden, einschlie脽lich Textgenerierung, Chat-Konversationen, Workflow-Ausf眉hrungen und Dokumentenverarbeitung.',
+    getStarted: 'Loslegen',
+    apiRateLimitUnit: '{{count,number}}/Tag',
+    documentsTooltip: 'Vorgabe f眉r die Anzahl der Dokumente, die aus der Wissensdatenquelle importiert werden.',
+    apiRateLimit: 'API-Datenlimit',
+    documents: '{{count,number}} Wissensdokumente',
+    comparePlanAndFeatures: 'Pl盲ne und Funktionen vergleichen',
+    freeTrialTipSuffix: 'Keine Kreditkarte erforderlich',
+    freeTrialTip: 'kostenlose Testversion von 200 OpenAI-Anfragen.',
+    documentsRequestQuota: '{{count,number}}/min Wissensanforderungsratenlimit',
+    teamMember_one: '{{count,number}} Teammitglied',
+    documentsRequestQuotaTooltip: 'Gibt die Gesamtzahl der Aktionen an, die ein Arbeitsbereich pro Minute innerhalb der Wissensbasis ausf眉hren kann, einschlie脽lich der Erstellung, L枚schung, Aktualisierung von Datens盲tzen, des Hochladens von Dokumenten, von 脛nderungen, der Archivierung und von Abfragen in der Wissensbasis. Diese Kennzahl wird verwendet, um die Leistung von Anfragen an die Wissensbasis zu bewerten. Wenn ein Sandbox-Nutzer beispielsweise in einer Minute 10 aufeinanderfolgende Testdurchl盲ufe durchf眉hrt, wird sein Arbeitsbereich f眉r die n盲chste Minute vor眉bergehend daran gehindert, die folgenden Aktionen auszuf眉hren: Erstellung, L枚schung, Aktualisierung von Datens盲tzen sowie das Hochladen oder 脛ndern von Dokumenten.',
+  },
+  plans: {
+    sandbox: {
+      name: 'Sandbox',
+      description: '200 mal GPT kostenlos testen',
+      includesTitle: 'Beinhaltet:',
+      for: 'Kostenlose Testversion der Kernfunktionen',
+    },
+    professional: {
+      name: 'Professionell',
+      description: 'F眉r Einzelpersonen und kleine Teams, um mehr Leistung erschwinglich freizuschalten.',
+      includesTitle: 'Alles im kostenlosen Tarif, plus:',
+      for: 'F眉r unabh盲ngige Entwickler/kleine Teams',
+    },
+    team: {
+      name: 'Team',
+      description: 'Zusammenarbeiten ohne Grenzen und Top-Leistung genie脽en.',
+      includesTitle: 'Alles im Professionell-Tarif, plus:',
+      for: 'F眉r mittelgro脽e Teams',
+    },
+    enterprise: {
+      name: 'Unternehmen',
+      description: 'Erhalten Sie volle F盲higkeiten und Unterst眉tzung f眉r gro脽angelegte, missionskritische Systeme.',
+      includesTitle: 'Alles im Team-Tarif, plus:',
+      features: {
+        2: 'Exklusive Unternehmensfunktionen',
+        8: 'Professioneller technischer Support',
+        6: 'Erweiterte Sicherheits- und Kontrollsysteme',
+        4: 'SSO',
+        0: 'Enterprise-Grade Skalierbare Bereitstellungsl枚sungen',
+        3: 'Mehrere Arbeitsbereiche und Unternehmensverwaltung',
+        1: 'Kommerzielle Lizenzgenehmigung',
+        5: 'Verhandelte SLAs durch Dify-Partner',
+        7: 'Updates und Wartung von Dify offiziell',
+      },
+      btnText: 'Vertrieb kontaktieren',
+      price: 'Benutzerdefiniert',
+      priceTip: 'J盲hrliche Abrechnung nur',
+      for: 'F眉r gro脽e Teams',
+    },
+    community: {
+      features: {
+        2: 'Entspricht der Dify Open Source Lizenz',
+        1: 'Einzelner Arbeitsbereich',
+        0: 'Alle Kernfunktionen wurden im 枚ffentlichen Repository ver枚ffentlicht.',
+      },
+      description: 'F眉r Einzelbenutzer, kleine Teams oder nicht-kommerzielle Projekte',
+      for: 'F眉r Einzelbenutzer, kleine Teams oder nicht-kommerzielle Projekte',
+      btnText: 'Beginnen Sie mit der Gemeinschaft',
+      price: 'Kostenlos',
+      includesTitle: 'Kostenlose Funktionen:',
+      name: 'Gemeinschaft',
+    },
+    premium: {
+      features: {
+        2: 'WebApp-Logo und Branding-Anpassung',
+        0: 'Selbstverwaltete Zuverl盲ssigkeit durch verschiedene Cloud-Anbieter',
+        3: 'Priorisierte E-Mail- und Chat-Unterst眉tzung',
+        1: 'Einzelner Arbeitsbereich',
+      },
+      includesTitle: 'Alles aus der Community, plus:',
+      name: 'Premium',
+      priceTip: 'Basierend auf dem Cloud-Marktplatz',
+      for: 'F眉r mittelgro脽e Organisationen und Teams',
+      btnText: 'Jetzt Premium erhalten in',
+      comingSoon: 'Microsoft Azure- und Google Cloud-Support demn盲chst verf眉gbar',
+      description: 'F眉r mittelgro脽e Organisationen und Teams',
+      price: 'Skalierbar',
+    },
+  },
+  vectorSpace: {
+    fullTip: 'Vektorraum ist voll.',
+    fullSolution: 'Upgraden Sie Ihren Tarif, um mehr Speicherplatz zu erhalten.',
+  },
+  apps: {
+    fullTipLine1: 'Upgraden Sie Ihren Tarif, um',
+    fullTipLine2: 'mehr Apps zu bauen.',
+    contactUs: 'Kontaktieren Sie uns',
+    fullTip1: 'Upgrade, um mehr Apps zu erstellen',
+    fullTip2des: 'Es wird empfohlen, inaktive Anwendungen zu bereinigen, um Speicherplatz freizugeben, oder uns zu kontaktieren.',
+    fullTip1des: 'Sie haben das Limit f眉r das Erstellen von Apps in diesem Plan erreicht.',
+    fullTip2: 'Limit erreicht',
+  },
+  annotatedResponse: {
+    fullTipLine1: 'Upgraden Sie Ihren Tarif, um',
+    fullTipLine2: 'mehr Konversationen zu annotieren.',
+    quotaTitle: 'Kontingent f眉r Annotation-Antworten',
+  },
+  usagePage: {
+    buildApps: 'Apps erstellen',
+    annotationQuota: 'Annotierungsquote',
+    teamMembers: 'Teammitglieder',
+    documentsUploadQuota: 'Dokumenten-Upload-Quota',
+    vectorSpace: 'Wissensdatenbank',
+    vectorSpaceTooltip: 'Dokumente mit dem Hochqualit盲ts-Indexierungsmodus verbrauchen Ressourcen des Knowledge Data Storage. Wenn der Knowledge Data Storage die Grenze erreicht, werden keine neuen Dokumente hochgeladen.',
+  },
+  teamMembers: 'Teammitglieder',
+}
+
+export default translation
diff --git a/i18n/de-DE/common.ts b/i18n/de-DE/common.ts
new file mode 100644
index 0000000..54bde0b
--- /dev/null
+++ b/i18n/de-DE/common.ts
@@ -0,0 +1,672 @@
+const translation = {
+  api: {
+    success: 'Erfolg',
+    actionSuccess: 'Aktion erfolgreich',
+    saved: 'Gespeichert',
+    create: 'Erstellt',
+    remove: 'Entfernt',
+  },
+  operation: {
+    create: 'Erstellen',
+    confirm: 'Best盲tigen',
+    cancel: 'Abbrechen',
+    clear: 'Leeren',
+    save: 'Speichern',
+    saveAndEnable: 'Speichern und Aktivieren',
+    edit: 'Bearbeiten',
+    add: 'Hinzuf眉gen',
+    added: 'Hinzugef眉gt',
+    refresh: 'Neustart',
+    reset: 'Zur眉cksetzen',
+    search: 'Suchen',
+    change: '脛ndern',
+    remove: 'Entfernen',
+    send: 'Senden',
+    copy: 'Kopieren',
+    lineBreak: 'Zeilenumbruch',
+    sure: 'Ich bin sicher',
+    download: 'Herunterladen',
+    delete: 'L枚schen',
+    settings: 'Einstellungen',
+    setup: 'Einrichten',
+    getForFree: 'Kostenlos erhalten',
+    reload: 'Neu laden',
+    ok: 'OK',
+    log: 'Protokoll',
+    learnMore: 'Mehr erfahren',
+    params: 'Parameter',
+    duplicate: 'Duplikat',
+    rename: 'Umbenennen',
+    audioSourceUnavailable: 'AudioSource ist nicht verf眉gbar',
+    zoomOut: 'Verkleinern',
+    zoomIn: 'Vergr枚脽ern',
+    openInNewTab: 'In neuem Tab 枚ffnen',
+    copyImage: 'Bild kopieren',
+    close: 'Schlie脽en',
+    viewMore: 'MEHR SEHEN',
+    regenerate: 'Erneuern',
+    saveAndRegenerate: 'Speichern und Regenerieren von untergeordneten Chunks',
+    view: 'Ansehen',
+    submit: 'Senden',
+    skip: 'Schiff',
+    imageCopied: 'Kopiertes Bild',
+    deleteApp: 'App l枚schen',
+    viewDetails: 'Details anzeigen',
+    in: 'in',
+    copied: 'Kopiert',
+    downloadFailed: 'Download fehlgeschlagen. Bitte versuchen Sie es sp盲ter erneut.',
+    downloadSuccess: 'Download abgeschlossen.',
+    more: 'Mehr',
+    format: 'Format',
+  },
+  placeholder: {
+    input: 'Bitte eingeben',
+    select: 'Bitte ausw盲hlen',
+  },
+  voice: {
+    language: {
+      zhHans: 'Chinesisch',
+      zhHant: 'Chinesisch (traditionell)',
+      enUS: 'Englisch',
+      deDE: 'Deutsch',
+      frFR: 'Franz枚sisch',
+      esES: 'Spanisch',
+      itIT: 'Italienisch',
+      thTH: 'Thail盲ndisch',
+      idID: 'Indonesisch',
+      jaJP: 'Japanisch',
+      koKR: 'Koreanisch',
+      ptBR: 'Portugiesisch',
+      ruRU: 'Russisch',
+      ukUA: 'Ukrainisch',
+      viVN: 'Vietnamesisch',
+      plPL: 'Polnisch',
+      roRO: 'Rum盲nisch',
+      hiIN: 'Hindi',
+      trTR: 'T眉rkisch',
+      faIR: 'Persisch',
+    },
+  },
+  unit: {
+    char: 'Zeichen',
+  },
+  actionMsg: {
+    noModification: 'Im Moment keine 脛nderungen.',
+    modifiedSuccessfully: 'Erfolgreich ge盲ndert',
+    modifiedUnsuccessfully: '脛nderung nicht erfolgreich',
+    copySuccessfully: 'Erfolgreich kopiert',
+    paySucceeded: 'Zahlung erfolgreich',
+    payCancelled: 'Zahlung abgebrochen',
+    generatedSuccessfully: 'Erfolgreich generiert',
+    generatedUnsuccessfully: 'Generierung nicht erfolgreich',
+  },
+  model: {
+    params: {
+      temperature: 'Temperatur',
+      temperatureTip:
+        'Kontrolliert Zuf盲lligkeit: Eine niedrigere Temperatur f眉hrt zu weniger zuf盲lligen Ergebnissen. N盲hert sich die Temperatur null, wird das Modell deterministisch und repetitiv.',
+      top_p: 'Top P',
+      top_pTip:
+        'Kontrolliert Diversit盲t 眉ber Nukleus-Sampling: 0,5 bedeutet, dass die H盲lfte aller wahrscheinlichkeitsgewichteten Optionen ber眉cksichtigt wird.',
+      presence_penalty: 'Pr盲senz-Strafe',
+      presence_penaltyTip:
+        'Wie stark neue Tokens basierend darauf bestraft werden, ob sie bereits im Text erschienen sind.\nErh枚ht die Wahrscheinlichkeit des Modells, 眉ber neue Themen zu sprechen.',
+      frequency_penalty: 'H盲ufigkeitsstrafe',
+      frequency_penaltyTip:
+        'Wie stark neue Tokens basierend auf ihrer bisherigen H盲ufigkeit im Text bestraft werden.\nVerringert die Wahrscheinlichkeit des Modells, denselben Satz wortw枚rtlich zu wiederholen.',
+      max_tokens: 'Maximale Token',
+      max_tokensTip:
+        'Begrenzt die maximale L盲nge der Antwort in Token. \nGr枚脽ere Werte k枚nnen den Platz f眉r Eingabeaufforderungen, Chat-Logs und Wissen begrenzen. \nEs wird empfohlen, dies unter zwei Dritteln zu setzen\ngpt-4-1106-Vorschau, gpt-4-vision-Vorschau maximale Token (Eingabe 128k Ausgabe 4k)',
+      maxTokenSettingTip: 'Ihre Einstellung f眉r maximale Token ist hoch, was den Platz f眉r Eingabeaufforderungen, Abfragen und Daten potenziell begrenzen kann. Erw盲gen Sie, dies unter 2/3 zu setzen.',
+      setToCurrentModelMaxTokenTip: 'Maximale Token auf 80 % der maximalen Token des aktuellen Modells {{maxToken}} aktualisiert.',
+      stop_sequences: 'Stop-Sequenzen',
+      stop_sequencesTip: 'Bis zu vier Sequenzen, bei denen die API die Generierung weiterer Token stoppt. Der zur眉ckgegebene Text wird die Stop-Sequenz nicht enthalten.',
+      stop_sequencesPlaceholder: 'Sequenz eingeben und Tab dr眉cken',
+    },
+    tone: {
+      Creative: 'Kreativ',
+      Balanced: 'Ausgewogen',
+      Precise: 'Pr盲zise',
+      Custom: 'Benutzerdefiniert',
+    },
+    addMoreModel: 'Gehen Sie zu den Einstellungen, um mehr Modelle hinzuzuf眉gen',
+    settingsLink: 'Einstellungen f眉r Modellanbieter',
+    capabilities: 'Multimodale F盲higkeiten',
+  },
+  menus: {
+    status: 'Beta',
+    explore: 'Erkunden',
+    apps: 'Studio',
+    plugins: 'Plugins',
+    pluginsTips: 'Integrieren Sie Plugins von Drittanbietern oder erstellen Sie ChatGPT-kompatible KI-Plugins.',
+    datasets: 'Wissen',
+    datasetsTips: 'BALD VERF脺GBAR: Importieren Sie Ihre eigenen Textdaten oder schreiben Sie Daten in Echtzeit 眉ber Webhook, um den LLM-Kontext zu verbessern.',
+    newApp: 'Neue App',
+    newDataset: 'Wissen erstellen',
+    tools: 'Werkzeuge',
+    exploreMarketplace: 'Marketplace erkunden',
+  },
+  userProfile: {
+    settings: 'Einstellungen',
+    emailSupport: 'E-Mail-Support',
+    workspace: 'Arbeitsbereich',
+    createWorkspace: 'Arbeitsbereich erstellen',
+    helpCenter: 'Hilfe',
+    communityFeedback: 'R眉ckmeldung',
+    roadmap: 'Fahrplan',
+    community: 'Gemeinschaft',
+    about: '脺ber',
+    logout: 'Abmelden',
+    compliance: 'Einhaltung',
+    support: 'Unterst眉tzung',
+    github: 'GitHub',
+  },
+  settings: {
+    accountGroup: 'KONTO',
+    workplaceGroup: 'ARBEITSBEREICH',
+    account: 'Mein Konto',
+    members: 'Mitglieder',
+    billing: 'Abrechnung',
+    integrations: 'Integrationen',
+    language: 'Sprache',
+    provider: 'Modellanbieter',
+    dataSource: 'Datenquelle',
+    plugin: 'Plugins',
+    apiBasedExtension: 'API-Erweiterung',
+    generalGroup: 'ALLGEMEIN',
+  },
+  account: {
+    avatar: 'Avatar',
+    name: 'Name',
+    email: 'E-Mail',
+    password: 'Passwort',
+    passwordTip: 'Sie k枚nnen ein dauerhaftes Passwort festlegen, wenn Sie keine tempor盲ren Anmeldecodes verwenden m枚chten',
+    setPassword: 'Ein Passwort festlegen',
+    resetPassword: 'Passwort zur眉cksetzen',
+    currentPassword: 'Aktuelles Passwort',
+    newPassword: 'Neues Passwort',
+    confirmPassword: 'Passwort best盲tigen',
+    notEqual: 'Die Passw枚rter sind unterschiedlich.',
+    langGeniusAccount: 'Dify-Konto',
+    langGeniusAccountTip: 'Ihr Dify-Konto und zugeh枚rige Benutzerdaten.',
+    editName: 'Namen bearbeiten',
+    showAppLength: '{{length}} Apps anzeigen',
+    delete: 'Konto l枚schen',
+    deleteTip: 'Wenn Sie Ihr Konto l枚schen, werden alle Ihre Daten dauerhaft gel枚scht und k枚nnen nicht wiederhergestellt werden.',
+    deleteConfirmTip: 'Zur Best盲tigung senden Sie bitte Folgendes von Ihrer registrierten E-Mail-Adresse an ',
+    myAccount: 'Mein Konto',
+    studio: 'Dify Studio',
+    account: 'Konto',
+    deletePrivacyLinkTip: 'Weitere Informationen dar眉ber, wie wir mit Ihren Daten umgehen, finden Sie in unserer',
+    deletePrivacyLink: 'Datenschutzrichtlinie.',
+    deleteSuccessTip: 'Das L枚schen Ihres Kontos ben枚tigt einige Zeit, um vollst盲ndig gel枚scht zu werden. Wir senden Ihnen eine E-Mail, wenn alles erledigt ist.',
+    deleteLabel: 'Zur Best盲tigung geben Sie bitte unten Ihre E-Mail-Adresse ein',
+    deletePlaceholder: 'Bitte geben Sie Ihre E-Mail-Adresse ein',
+    sendVerificationButton: 'Verifizierungscode senden',
+    verificationLabel: 'Verifizierungs-Code',
+    verificationPlaceholder: 'F眉gen Sie den 6-stelligen Code ein',
+    feedbackTitle: 'Feedback',
+    feedbackLabel: 'Sagen Sie uns, warum Sie Ihr Konto gel枚scht haben?',
+    feedbackPlaceholder: 'Wahlfrei',
+    permanentlyDeleteButton: 'Konto dauerhaft l枚schen',
+    workspaceIcon: 'Arbeitsbereichssymbol',
+    workspaceName: 'Arbeitsbereichsname',
+    editWorkspaceInfo: 'Arbeitsbereichsinformationen bearbeiten',
+  },
+  members: {
+    team: 'Team',
+    invite: 'Hinzuf眉gen',
+    name: 'NAME',
+    lastActive: 'ZULETZT AKTIV',
+    role: 'ROLLEN',
+    pending: 'Ausstehend...',
+    owner: 'Eigent眉mer',
+    admin: 'Admin',
+    adminTip: 'Kann Apps erstellen & Team-Einstellungen verwalten',
+    normal: 'Normal',
+    normalTip: 'Kann nur Apps verwenden, kann keine Apps erstellen',
+    editor: 'Editor',
+    editorTip: 'Kann Apps erstellen & bearbeiten',
+    inviteTeamMember: 'Teammitglied hinzuf眉gen',
+    inviteTeamMemberTip: 'Sie k枚nnen direkt nach der Anmeldung auf Ihre Teamdaten zugreifen.',
+    emailNotSetup: 'E-Mail-Server ist nicht eingerichtet, daher k枚nnen keine Einladungs-E-Mails versendet werden. Bitte informieren Sie die Benutzer 眉ber den Einladungslink, der nach der Einladung ausgestellt wird.',
+    email: 'E-Mail',
+    emailInvalid: 'Ung眉ltiges E-Mail-Format',
+    emailPlaceholder: 'Bitte E-Mails eingeben',
+    sendInvite: 'Einladung senden',
+    invitedAsRole: 'Eingeladen als {{role}}-Benutzer',
+    invitationSent: 'Einladung gesendet',
+    invitationSentTip: 'Einladung gesendet, und sie k枚nnen sich bei Dify anmelden, um auf Ihre Teamdaten zuzugreifen.',
+    invitationLink: 'Einladungslink',
+    failedInvitationEmails: 'Die folgenden Benutzer wurden nicht erfolgreich eingeladen',
+    ok: 'OK',
+    removeFromTeam: 'Vom Team entfernen',
+    removeFromTeamTip: 'Wird den Teamzugang entfernen',
+    setAdmin: 'Als Administrator einstellen',
+    setMember: 'Als normales Mitglied einstellen',
+    setEditor: 'Als Editor einstellen',
+    disInvite: 'Einladung widerrufen',
+    deleteMember: 'Mitglied l枚schen',
+    you: '(Du)',
+    setBuilder: 'Als Builder festlegen',
+    datasetOperator: 'Wissensadministrator',
+    datasetOperatorTip: 'Kann die Wissensdatenbank nur verwalten',
+    builder: 'Bauherr',
+    builderTip: 'Kann eigene Apps erstellen und bearbeiten',
+  },
+  integrations: {
+    connected: 'Verbunden',
+    google: 'Google',
+    googleAccount: 'Mit Google-Konto anmelden',
+    github: 'GitHub',
+    githubAccount: 'Mit GitHub-Konto anmelden',
+    connect: 'Verbinden',
+  },
+  language: {
+    displayLanguage: 'Anzeigesprache',
+    timezone: 'Zeitzone',
+  },
+  provider: {
+    apiKey: 'API-Schl眉ssel',
+    enterYourKey: 'Geben Sie hier Ihren API-Schl眉ssel ein',
+    invalidKey: 'Ung眉ltiger OpenAI API-Schl眉ssel',
+    validatedError: 'Validierung fehlgeschlagen: ',
+    validating: 'Schl眉ssel wird validiert...',
+    saveFailed: 'API-Schl眉ssel speichern fehlgeschlagen',
+    apiKeyExceedBill: 'Dieser API-SCHL脺SSEL verf眉gt 眉ber kein verf眉gbares Kontingent, bitte lesen',
+    addKey: 'Schl眉ssel hinzuf眉gen',
+    comingSoon: 'Demn盲chst verf眉gbar',
+    editKey: 'Bearbeiten',
+    invalidApiKey: 'Ung眉ltiger API-Schl眉ssel',
+    azure: {
+      apiBase: 'API-Basis',
+      apiBasePlaceholder: 'Die API-Basis-URL Ihres Azure OpenAI-Endpunkts.',
+      apiKey: 'API-Schl眉ssel',
+      apiKeyPlaceholder: 'Geben Sie hier Ihren API-Schl眉ssel ein',
+      helpTip: 'Azure OpenAI Service kennenlernen',
+    },
+    openaiHosted: {
+      openaiHosted: 'Gehostetes OpenAI',
+      onTrial: 'IN PROBE',
+      exhausted: 'KONTINGENT ERSCH脰PFT',
+      desc: 'Der OpenAI-Hostingdienst von Dify erm枚glicht es Ihnen, Modelle wie GPT-3.5 zu verwenden. Bevor Ihr Probe-Kontingent aufgebraucht ist, m眉ssen Sie andere Modellanbieter einrichten.',
+      callTimes: 'Anrufzeiten',
+      usedUp: 'Probe-Kontingent aufgebraucht. Eigenen Modellanbieter hinzuf眉gen.',
+      useYourModel: 'Derzeit wird eigener Modellanbieter verwendet.',
+      close: 'Schlie脽en',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: 'IN PROBE',
+      exhausted: 'KONTINGENT ERSCH脰PFT',
+      desc: 'Leistungsstarkes Modell, das bei einer Vielzahl von Aufgaben von anspruchsvollen Dialogen und kreativer Inhalteerstellung bis hin zu detaillierten Anweisungen hervorragend ist.',
+      callTimes: 'Anrufzeiten',
+      usedUp: 'Testkontingent aufgebraucht. Eigenen Modellanbieter hinzuf眉gen.',
+      useYourModel: 'Derzeit wird eigener Modellanbieter verwendet.',
+      close: 'Schlie脽en',
+      trialQuotaTip: 'Ihr Anthropic-Testkontingent l盲uft am 11.03.2025 ab und steht danach nicht mehr zur Verf眉gung. Bitte machen Sie rechtzeitig davon Gebrauch.',
+    },
+    anthropic: {
+      using: 'Die Einbettungsf盲higkeit verwendet',
+      enableTip: 'Um das Anthropische Modell zu aktivieren, m眉ssen Sie sich zuerst mit OpenAI oder Azure OpenAI Service verbinden.',
+      notEnabled: 'Nicht aktiviert',
+      keyFrom: 'Holen Sie Ihren API-Schl眉ssel von Anthropic',
+    },
+    encrypted: {
+      front: 'Ihr API-SCHL脺SSEL wird verschl眉sselt und mit',
+      back: ' Technologie gespeichert.',
+    },
+  },
+  modelProvider: {
+    notConfigured: 'Das Systemmodell wurde noch nicht vollst盲ndig konfiguriert, und einige Funktionen sind m枚glicherweise nicht verf眉gbar.',
+    systemModelSettings: 'Systemmodell-Einstellungen',
+    systemModelSettingsLink: 'Warum ist es notwendig, ein Systemmodell einzurichten?',
+    selectModel: 'W盲hlen Sie Ihr Modell',
+    setupModelFirst: 'Bitte richten Sie zuerst Ihr Modell ein',
+    systemReasoningModel: {
+      key: 'System-Reasoning-Modell',
+      tip: 'Legen Sie das Standardinferenzmodell fest, das f眉r die Erstellung von Anwendungen verwendet wird, sowie Funktionen wie die Generierung von Dialognamen und die Vorschlagserstellung f眉r die n盲chste Frage, die auch das Standardinferenzmodell verwenden.',
+    },
+    embeddingModel: {
+      key: 'Einbettungsmodell',
+      tip: 'Legen Sie das Standardmodell f眉r die Dokumenteneinbettungsverarbeitung des Wissens fest, sowohl die Wiederherstellung als auch der Import des Wissens verwenden dieses Einbettungsmodell f眉r die Vektorisierungsverarbeitung. Ein Wechsel wird dazu f眉hren, dass die Vektordimension zwischen dem importierten Wissen und der Frage inkonsistent ist, was zu einem Wiederherstellungsfehler f眉hrt. Um einen Wiederherstellungsfehler zu vermeiden, wechseln Sie dieses Modell bitte nicht willk眉rlich.',
+      required: 'Einbettungsmodell ist erforderlich',
+    },
+    speechToTextModel: {
+      key: 'Sprach-zu-Text-Modell',
+      tip: 'Legen Sie das Standardmodell f眉r die Spracheingabe in Konversationen fest.',
+    },
+    ttsModel: {
+      key: 'Text-zu-Sprache-Modell',
+      tip: 'Legen Sie das Standardmodell f眉r die Text-zu-Sprache-Eingabe in Konversationen fest.',
+    },
+    rerankModel: {
+      key: 'Rerank-Modell',
+      tip: 'Rerank-Modell wird die Kandidatendokumentenliste basierend auf der semantischen 脺bereinstimmung mit der Benutzeranfrage neu ordnen und die Ergebnisse der semantischen Rangordnung verbessern',
+    },
+    quota: 'Kontingent',
+    searchModel: 'Suchmodell',
+    noModelFound: 'Kein Modell f眉r {{model}} gefunden',
+    models: 'Modelle',
+    showMoreModelProvider: 'Zeige mehr Modellanbieter',
+    selector: {
+      tip: 'Dieses Modell wurde entfernt. Bitte f眉gen Sie ein Modell hinzu oder w盲hlen Sie ein anderes Modell.',
+      emptyTip: 'Keine verf眉gbaren Modelle',
+      emptySetting: 'Bitte gehen Sie zu den Einstellungen, um zu konfigurieren',
+      rerankTip: 'Bitte richten Sie das Rerank-Modell ein',
+    },
+    card: {
+      quota: 'KONTINGENT',
+      onTrial: 'In Probe',
+      paid: 'Bezahlt',
+      quotaExhausted: 'Kontingent ersch枚pft',
+      callTimes: 'Anrufzeiten',
+      tokens: 'Token',
+      buyQuota: 'Kontingent kaufen',
+      priorityUse: 'Priorisierte Nutzung',
+      removeKey: 'API-Schl眉ssel entfernen',
+      tip: 'Der bezahlten Kontingent wird Vorrang gegeben. Das Testkontingent wird nach dem Verbrauch des bezahlten Kontingents verwendet.',
+    },
+    item: {
+      deleteDesc: '{{modelName}} werden als System-Reasoning-Modelle verwendet. Einige Funktionen stehen nach der Entfernung nicht zur Verf眉gung. Bitte best盲tigen.',
+      freeQuota: 'KOSTENLOSES KONTINGENT',
+    },
+    addApiKey: 'F眉gen Sie Ihren API-Schl眉ssel hinzu',
+    invalidApiKey: 'Ung眉ltiger API-Schl眉ssel',
+    encrypted: {
+      front: 'Ihr API-SCHL脺SSEL wird verschl眉sselt und mit',
+      back: ' Technologie gespeichert.',
+    },
+    freeQuota: {
+      howToEarn: 'Wie zu verdienen',
+    },
+    addMoreModelProvider: 'MEHR MODELLANBIETER HINZUF脺GEN',
+    addModel: 'Modell hinzuf眉gen',
+    modelsNum: '{{num}} Modelle',
+    showModels: 'Modelle anzeigen',
+    showModelsNum: 'Zeige {{num}} Modelle',
+    collapse: 'Einklappen',
+    config: 'Konfigurieren',
+    modelAndParameters: 'Modell und Parameter',
+    model: 'Modell',
+    featureSupported: '{{feature}} unterst眉tzt',
+    callTimes: 'Anrufzeiten',
+    credits: 'Nachrichtenguthaben',
+    buyQuota: 'Kontingent kaufen',
+    getFreeTokens: 'Kostenlose Token erhalten',
+    priorityUsing: 'Bevorzugte Nutzung',
+    deprecated: 'Veraltet',
+    confirmDelete: 'L枚schung best盲tigen?',
+    quotaTip: 'Verbleibende verf眉gbare kostenlose Token',
+    loadPresets: 'Voreinstellungen laden',
+    parameters: 'PARAMETER',
+    loadBalancingHeadline: 'Lastenausgleich',
+    apiKey: 'API-SCHL脺SSEL',
+    editConfig: 'Konfiguration bearbeiten',
+    loadBalancing: 'Lastenausgleich',
+    addConfig: 'Konfiguration hinzuf眉gen',
+    configLoadBalancing: 'Lastenausgleich f眉r die Konfiguration',
+    providerManagedDescription: 'Verwenden Sie den einzelnen Satz von Anmeldeinformationen, der vom Modellanbieter bereitgestellt wird.',
+    loadBalancingDescription: 'Reduzieren Sie den Druck mit mehreren S盲tzen von Anmeldeinformationen.',
+    modelHasBeenDeprecated: 'Dieses Modell ist veraltet',
+    loadBalancingLeastKeyWarning: 'Um den Lastausgleich zu aktivieren, m眉ssen mindestens 2 Schl眉ssel aktiviert sein.',
+    providerManaged: 'Vom Anbieter verwaltet',
+    apiKeyStatusNormal: 'APIKey-Status ist normal',
+    upgradeForLoadBalancing: 'Aktualisieren Sie Ihren Plan, um den Lastenausgleich zu aktivieren.',
+    defaultConfig: 'Standardkonfiguration',
+    apiKeyRateLimit: 'Ratenlimit wurde erreicht, verf眉gbar nach {{seconds}}s',
+    loadBalancingInfo: 'Standardm盲脽ig wird f眉r den Lastenausgleich die Round-Robin-Strategie verwendet. Wenn die Ratenbegrenzung ausgel枚st wird, wird eine Abklingzeit von 1 Minute angewendet.',
+    emptyProviderTip: 'Bitte installieren Sie zuerst einen Modellanbieter.',
+    configureTip: 'Einrichten des API-Schl眉ssels oder Hinzuf眉gen des zu verwendenden Modells',
+    discoverMore: 'Erfahren Sie mehr in',
+    installProvider: 'Installieren von Modellanbietern',
+    toBeConfigured: 'Zu konfigurieren',
+    emptyProviderTitle: 'Modellanbieter nicht eingerichtet',
+  },
+  dataSource: {
+    add: 'Eine Datenquelle hinzuf眉gen',
+    connect: 'Verbinden',
+    notion: {
+      title: 'Notion',
+      description: 'Notion als Datenquelle f眉r das Wissen verwenden.',
+      connectedWorkspace: 'Verbundener Arbeitsbereich',
+      addWorkspace: 'Arbeitsbereich hinzuf眉gen',
+      connected: 'Verbunden',
+      disconnected: 'Getrennt',
+      changeAuthorizedPages: 'Autorisierte Seiten 盲ndern',
+      pagesAuthorized: 'Autorisierte Seiten',
+      sync: 'Synchronisieren',
+      remove: 'Entfernen',
+      selector: {
+        pageSelected: 'Ausgew盲hlte Seiten',
+        searchPages: 'Seiten suchen...',
+        noSearchResult: 'Keine Suchergebnisse',
+        addPages: 'Seiten hinzuf眉gen',
+        preview: 'VORSCHAU',
+      },
+    },
+    website: {
+      inactive: 'Inaktiv',
+      description: 'Importieren Sie Inhalte von Websites mit dem Webcrawler.',
+      title: 'Website',
+      configuredCrawlers: 'Konfigurierte Crawler',
+      active: 'Aktiv',
+      with: 'Mit',
+    },
+    configure: 'Konfigurieren',
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'API-Schl眉ssel',
+      apiKeyPlaceholder: 'Geben Sie Ihren API-Schl眉ssel ein',
+      keyFrom: 'Holen Sie Ihren SerpAPI-Schl眉ssel von der SerpAPI-Kontoseite',
+    },
+  },
+  apiBasedExtension: {
+    title: 'API-Erweiterungen bieten zentralisiertes API-Management und vereinfachen die Konfiguration f眉r eine einfache Verwendung in Difys Anwendungen.',
+    link: 'Erfahren Sie, wie Sie Ihre eigene API-Erweiterung entwickeln.',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: 'API-Erweiterung hinzuf眉gen',
+    selector: {
+      title: 'API-Erweiterung',
+      placeholder: 'Bitte w盲hlen Sie API-Erweiterung',
+      manage: 'API-Erweiterung verwalten',
+    },
+    modal: {
+      title: 'API-Erweiterung hinzuf眉gen',
+      editTitle: 'API-Erweiterung bearbeiten',
+      name: {
+        title: 'Name',
+        placeholder: 'Bitte geben Sie den Namen ein',
+      },
+      apiEndpoint: {
+        title: 'API-Endpunkt',
+        placeholder: 'Bitte geben Sie den API-Endpunkt ein',
+      },
+      apiKey: {
+        title: 'API-Schl眉ssel',
+        placeholder: 'Bitte geben Sie den API-Schl眉ssel ein',
+        lengthError: 'Die L盲nge des API-Schl眉ssels darf nicht weniger als 5 Zeichen betragen',
+      },
+    },
+    type: 'Typ',
+  },
+  about: {
+    changeLog: '脛nderungsprotokoll',
+    updateNow: 'Jetzt aktualisieren',
+    nowAvailable: 'Dify {{version}} ist jetzt verf眉gbar.',
+    latestAvailable: 'Dify {{version}} ist die neueste verf眉gbare Version.',
+  },
+  appMenus: {
+    overview: '脺bersicht',
+    promptEng: 'Orchestrieren',
+    apiAccess: 'API-Zugriff',
+    logAndAnn: 'Protokolle & Ank.',
+    logs: 'Baumst盲mme',
+  },
+  environment: {
+    testing: 'TESTEN',
+    development: 'ENTWICKLUNG',
+  },
+  appModes: {
+    completionApp: 'Textgenerator',
+    chatApp: 'Chat-App',
+  },
+  datasetMenus: {
+    documents: 'Dokumente',
+    hitTesting: 'Wiederherstellungstest',
+    settings: 'Einstellungen',
+    emptyTip: 'Das Wissen wurde nicht zugeordnet, bitte gehen Sie zur Anwendung oder zum Plug-in, um die Zuordnung abzuschlie脽en.',
+    viewDoc: 'Dokumentation anzeigen',
+    relatedApp: 'verbundene Apps',
+    noRelatedApp: 'Keine verkn眉pften Apps',
+  },
+  voiceInput: {
+    speaking: 'Sprechen Sie jetzt...',
+    converting: 'Umwandlung in Text...',
+    notAllow: 'Mikrofon nicht autorisiert',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Fl眉stern-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: 'Konversation umbenennen',
+    conversationName: 'Konversationsname',
+    conversationNamePlaceholder: 'Bitte geben Sie den Konversationsnamen ein',
+    conversationNameCanNotEmpty: 'Konversationsname erforderlich',
+    citation: {
+      title: 'ZITIERUNGEN',
+      linkToDataset: 'Link zum Wissen',
+      characters: 'Zeichen:',
+      hitCount: 'Abrufanzahl:',
+      vectorHash: 'Vektorhash:',
+      hitScore: 'Abrufwertung:',
+    },
+    inputPlaceholder: 'Sprechen Sie mit dem Bot',
+    thought: 'Gedanke',
+    thinking: 'Denken...',
+    resend: 'Erneut senden',
+  },
+  promptEditor: {
+    placeholder: 'Schreiben Sie hier Ihr Aufforderungswort, geben Sie \'{\' ein, um eine Variable einzuf眉gen, geben Sie \'/\' ein, um einen Aufforderungs-Inhaltsblock einzuf眉gen',
+    context: {
+      item: {
+        title: 'Kontext',
+        desc: 'Kontextvorlage einf眉gen',
+      },
+      modal: {
+        title: '{{num}} Wissen im Kontext',
+        add: 'Kontext hinzuf眉gen',
+        footer: 'Sie k枚nnen Kontexte im unten stehenden Kontextabschnitt verwalten.',
+      },
+    },
+    history: {
+      item: {
+        title: 'Konversationsgeschichte',
+        desc: 'Vorlage f眉r historische Nachricht einf眉gen',
+      },
+      modal: {
+        title: 'BEISPIEL',
+        user: 'Hallo',
+        assistant: 'Hallo! Wie kann ich Ihnen heute helfen?',
+        edit: 'Konversationsrollennamen bearbeiten',
+      },
+    },
+    variable: {
+      item: {
+        title: 'Variablen & Externe Werkzeuge',
+        desc: 'Variablen & Externe Werkzeuge einf眉gen',
+      },
+      modal: {
+        add: 'Neue Variable',
+        addTool: 'Neues Werkzeug',
+      },
+      outputToolDisabledItem: {
+        desc: 'Variablen einf眉gen',
+        title: 'Variablen',
+      },
+    },
+    query: {
+      item: {
+        title: 'Abfrage',
+        desc: 'Benutzerabfragevorlage einf眉gen',
+      },
+    },
+    existed: 'Bereits im Aufforderungstext vorhanden',
+  },
+  imageUploader: {
+    uploadFromComputer: 'Vom Computer hochladen',
+    uploadFromComputerReadError: 'Bildlesung fehlgeschlagen, bitte versuchen Sie es erneut.',
+    uploadFromComputerUploadError: 'Bildupload fehlgeschlagen, bitte erneut hochladen.',
+    uploadFromComputerLimit: 'Hochgeladene Bilder d眉rfen {{size}} MB nicht 眉berschreiten',
+    pasteImageLink: 'Bildlink einf眉gen',
+    pasteImageLinkInputPlaceholder: 'Bildlink hier einf眉gen',
+    pasteImageLinkInvalid: 'Ung眉ltiger Bildlink',
+    imageUpload: 'Bild-Upload',
+  },
+  tag: {
+    placeholder: 'Alle Tags',
+    addNew: 'Neues Tag hinzuf眉gen',
+    noTag: 'Keine Tags',
+    noTagYet: 'Noch keine Tags',
+    addTag: 'Tags hinzuf眉gen',
+    editTag: 'Tags bearbeiten',
+    manageTags: 'Tags verwalten',
+    selectorPlaceholder: 'Typ zum Suchen oder Erstellen',
+    create: 'Erstellen',
+    delete: 'Tag l枚schen',
+    deleteTip: 'Das Tag wird verwendet, l枚schen?',
+    created: 'Tag erfolgreich erstellt',
+    failed: 'Tag-Erstellung fehlgeschlagen',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} ist erforderlich',
+    urlError: 'Die URL sollte mit http:// oder https:// beginnen',
+  },
+  fileUploader: {
+    uploadFromComputer: 'Lokaler Upload',
+    pasteFileLinkInvalid: 'Ung眉ltiger Dateilink',
+    pasteFileLinkInputPlaceholder: 'URL eingeben...',
+    pasteFileLink: 'Dateilink einf眉gen',
+    uploadFromComputerUploadError: 'Datei-Upload fehlgeschlagen, bitte erneut hochladen.',
+    uploadFromComputerLimit: 'Datei hochladen darf {{size}} nicht 眉berschreiten',
+    uploadFromComputerReadError: 'Lesen der Datei fehlgeschlagen, bitte versuchen Sie es erneut.',
+    fileExtensionNotSupport: 'Dateiendung nicht bedient',
+  },
+  license: {
+    expiring: 'L盲uft an einem Tag ab',
+    expiring_plural: 'L盲uft in {{count}} Tagen ab',
+  },
+  pagination: {
+    perPage: 'Artikel pro Seite',
+  },
+  theme: {
+    light: 'Licht',
+    theme: 'Thema',
+    dark: 'dunkel',
+    auto: 'System',
+  },
+  compliance: {
+    iso27001: 'ISO 27001:2022 Zertifizierung',
+    professionalUpgradeTooltip: 'Nur verf眉gbar mit einem Teamplan oder h枚her.',
+    gdpr: 'DSGVO DPA',
+    soc2Type2: 'SOC 2 Typ II Bericht',
+    soc2Type1: 'SOC 2 Typ I Bericht',
+    sandboxUpgradeTooltip: 'Nur verf眉gbar mit einem Professional- oder Teamplan.',
+  },
+  imageInput: {
+    dropImageHere: 'Laden Sie Ihr Bild hierher hoch oder',
+    browse: 'bl盲ttern',
+    supportedFormats: 'Unterst眉tzt PNG, JPG, JPEG, WEBP und GIF',
+  },
+}
+
+export default translation
diff --git a/i18n/de-DE/custom.ts b/i18n/de-DE/custom.ts
new file mode 100644
index 0000000..e86e0c2
--- /dev/null
+++ b/i18n/de-DE/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: 'Anpassung',
+  upgradeTip: {
+    prefix: 'Erweitere deinen Plan auf',
+    suffix: 'um deine Marke anzupassen.',
+    title: 'Upgrade deinen Plan',
+    des: 'Upgrade deinen Plan, um deine Marke anzupassen.',
+  },
+  webapp: {
+    title: 'WebApp Marke anpassen',
+    removeBrand: 'Entferne Powered by Dify',
+    changeLogo: '脛ndere Powered by Markenbild',
+    changeLogoTip: 'SVG oder PNG Format mit einer Mindestgr枚脽e von 40x40px',
+  },
+  app: {
+    title: 'App Kopfzeilen Marke anpassen',
+    changeLogoTip: 'SVG oder PNG Format mit einer Mindestgr枚脽e von 80x80px',
+  },
+  upload: 'Hochladen',
+  uploading: 'Lade hoch',
+  uploadedFail: 'Bild-Upload fehlgeschlagen, bitte erneut hochladen.',
+  change: '脛ndern',
+  apply: 'Anwenden',
+  restore: 'Standardeinstellungen wiederherstellen',
+  customize: {
+    contactUs: ' kontaktiere uns ',
+    prefix: 'Um das Markenlogo innerhalb der App anzupassen, bitte',
+    suffix: 'um auf die Enterprise-Edition zu upgraden.',
+  },
+}
+
+export default translation
diff --git a/i18n/de-DE/dataset-creation.ts b/i18n/de-DE/dataset-creation.ts
new file mode 100644
index 0000000..9500c0c
--- /dev/null
+++ b/i18n/de-DE/dataset-creation.ts
@@ -0,0 +1,218 @@
+const translation = {
+  steps: {
+    header: {
+      creation: 'Wissen erstellen',
+      update: 'Daten hinzuf眉gen',
+      fallbackRoute: 'Wissen',
+    },
+    one: 'Datenquelle w盲hlen',
+    two: 'Textvorverarbeitung und Bereinigung',
+    three: 'Ausf眉hren und beenden',
+  },
+  error: {
+    unavailable: 'Dieses Wissen ist nicht verf眉gbar',
+  },
+  stepOne: {
+    filePreview: 'Dateivorschau',
+    pagePreview: 'Seitenvorschau',
+    dataSourceType: {
+      file: 'Import aus Textdatei',
+      notion: 'Synchronisation aus Notion',
+      web: 'Synchronisation von Webseite',
+    },
+    uploader: {
+      title: 'Textdatei hochladen',
+      button: 'Dateien und Ordner hierher ziehen oder klicken',
+      browse: 'Durchsuchen',
+      tip: 'Unterst眉tzt {{supportTypes}}. Maximal {{size}}MB pro Datei.',
+      validation: {
+        typeError: 'Dateityp nicht unterst眉tzt',
+        size: 'Datei zu gro脽. Maximum ist {{size}}MB',
+        count: 'Mehrere Dateien nicht unterst眉tzt',
+        filesNumber: 'Sie haben das Limit f眉r die Stapelverarbeitung von {{filesNumber}} erreicht.',
+      },
+      cancel: 'Abbrechen',
+      change: '脛ndern',
+      failed: 'Hochladen fehlgeschlagen',
+    },
+    notionSyncTitle: 'Notion ist nicht verbunden',
+    notionSyncTip: 'Um mit Notion zu synchronisieren, muss zuerst eine Verbindung zu Notion hergestellt werden.',
+    connect: 'Verbinden gehen',
+    button: 'weiter',
+    emptyDatasetCreation: 'Ich m枚chte ein leeres Wissen erstellen',
+    modal: {
+      title: 'Ein leeres Wissen erstellen',
+      tip: 'Ein leeres Wissen enth盲lt keine Dokumente, und Sie k枚nnen jederzeit Dokumente hochladen.',
+      input: 'Wissensname',
+      placeholder: 'Bitte eingeben',
+      nameNotEmpty: 'Name darf nicht leer sein',
+      nameLengthInvalid: 'Name muss zwischen 1 bis 40 Zeichen lang sein',
+      cancelButton: 'Abbrechen',
+      confirmButton: 'Erstellen',
+      failed: 'Erstellung fehlgeschlagen',
+    },
+    website: {
+      preview: 'Vorschau',
+      totalPageScraped: 'Gesamtzahl der gescrapten Seiten:',
+      fireCrawlNotConfigured: 'Firecrawl ist nicht konfiguriert',
+      options: 'Optionen',
+      excludePaths: 'Pfade ausschlie脽en',
+      limit: 'Grenze',
+      exceptionErrorTitle: 'Beim Ausf眉hren des Firecrawl-Auftrags ist eine Ausnahme aufgetreten:',
+      selectAll: 'Alles ausw盲hlen',
+      includeOnlyPaths: 'Nur Pfade einschlie脽en',
+      run: 'Laufen',
+      firecrawlDoc: 'Firecrawl-Dokumente',
+      configure: 'Konfigurieren',
+      fireCrawlNotConfiguredDescription: 'Konfigurieren Sie Firecrawl mit dem API-Schl眉ssel, um es zu verwenden.',
+      maxDepth: 'Maximale Tiefe',
+      unknownError: 'Unbekannter Fehler',
+      resetAll: 'Alles zur眉cksetzen',
+      extractOnlyMainContent: 'Extrahieren Sie nur den Hauptinhalt (keine Kopf-, Navigations- und Fu脽zeilen usw.)',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      firecrawlTitle: 'Extrahieren von Webinhalten mit 馃敟Firecrawl',
+      maxDepthTooltip: 'Maximale Tiefe f眉r das Crawlen relativ zur eingegebenen URL. Tiefe 0 kratzt nur die Seite der eingegebenen URL, Tiefe 1 kratzt die URL und alles nach der eingegebenen URL + ein / und so weiter.',
+      crawlSubPage: 'Unterseiten crawlen',
+      scrapTimeInfo: 'Insgesamt {{{total}} Seiten innerhalb von {{time}}s gescrapt',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      jinaReaderTitle: 'Konvertieren Sie die gesamte Website in Markdown',
+      useSitemap: 'Sitemap verwenden',
+      chooseProvider: 'W盲hlen Sie einen Anbieter',
+      jinaReaderNotConfigured: 'Jina Reader ist nicht konfiguriert',
+      jinaReaderNotConfiguredDescription: 'Richten Sie Jina Reader ein, indem Sie Ihren kostenlosen API-Schl眉ssel f眉r den Zugriff eingeben.',
+      useSitemapTooltip: 'Folgen Sie der Sitemap, um die Website zu crawlen. Ist dies nicht der Fall, crawlt Jina Reader iterativ basierend auf der Seitenrelevanz, sodass weniger, aber qualitativ hochwertigere Seiten angezeigt werden.',
+      jinaReaderDoc: 'Erfahre mehr 眉ber Jina Reader',
+      configureJinaReader: 'Jina Reader konfigurieren',
+      waterCrawlNotConfigured: 'Watercrawl ist nicht konfiguriert',
+      configureWatercrawl: 'Wasserkrabbe konfigurieren',
+      watercrawlDocLink: 'https://docs.dify.ai/de/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      watercrawlTitle: 'Webinhalt mit Watercrawl extrahieren',
+      watercrawlDoc: 'Wasserkriechen-Dokumente',
+      configureFirecrawl: 'Firecrawl konfigurieren',
+      waterCrawlNotConfiguredDescription: 'Konfigurieren Sie Watercrawl mit dem API-Schl眉ssel, um es zu verwenden.',
+    },
+    cancel: 'Abbrechen',
+  },
+  stepTwo: {
+    segmentation: 'Chunk-Einstellungen',
+    auto: 'Automatisch',
+    autoDescription: 'Stellt Chunk- und Vorverarbeitungsregeln automatisch ein. Unbekannten Benutzern wird dies empfohlen.',
+    custom: 'Benutzerdefiniert',
+    customDescription: 'Chunk-Regeln, Chunk-L盲nge und Vorverarbeitungsregeln usw. anpassen.',
+    separator: 'Segmentidentifikator',
+    separatorPlaceholder: 'Zum Beispiel Neuer Absatz (\\\\n) oder spezieller Separator (wie "***")',
+    maxLength: 'Maximale Chunk-L盲nge',
+    overlap: 'Chunk-脺berlappung',
+    overlapTip: 'Die Einstellung der Chunk-脺berlappung kann die semantische Relevanz zwischen ihnen aufrechterhalten und so die Abrufeffekt verbessern. Es wird empfohlen, 10%-25% der maximalen Chunk-Gr枚脽e einzustellen.',
+    overlapCheck: 'Chunk-脺berlappung sollte nicht gr枚脽er als maximale Chunk-L盲nge sein',
+    rules: 'Textvorverarbeitungsregeln',
+    removeExtraSpaces: 'Mehrfache Leerzeichen, Zeilenumbr眉che und Tabulatoren ersetzen',
+    removeUrlEmails: 'Alle URLs und E-Mail-Adressen l枚schen',
+    removeStopwords: 'Stopw枚rter wie "ein", "eine", "der" entfernen',
+    preview: 'Best盲tigen & Vorschau',
+    reset: 'Zur眉cksetzen',
+    indexMode: 'Indexmodus',
+    qualified: 'Hohe Qualit盲t',
+    recommend: 'Empfehlen',
+    qualifiedTip: 'Ruft standardm盲脽ige Systemeinbettungsschnittstelle f眉r die Verarbeitung auf, um h枚here Genauigkeit bei Benutzerabfragen zu bieten.',
+    warning: 'Bitte zuerst den API-Schl眉ssel des Modellanbieters einrichten.',
+    click: 'Zu den Einstellungen gehen',
+    economical: '脰konomisch',
+    economicalTip: 'Verwendet Offline-Vektor-Engines, Schlagwortindizes usw., um die Genauigkeit ohne Tokenverbrauch zu reduzieren',
+    QATitle: 'Segmentierung im Frage-und-Antwort-Format',
+    QATip: 'Diese Option zu aktivieren, wird mehr Tokens verbrauchen',
+    QALanguage: 'Segmentierung verwenden',
+    estimateCost: 'Sch盲tzung',
+    estimateSegment: 'Gesch盲tzte Chunks',
+    segmentCount: 'Chunks',
+    calculating: 'Berechnung...',
+    fileSource: 'Dokumente vorverarbeiten',
+    notionSource: 'Seiten vorverarbeiten',
+    other: 'und weitere ',
+    fileUnit: ' Dateien',
+    notionUnit: ' Seiten',
+    previousStep: 'Vorheriger Schritt',
+    nextStep: 'Speichern & Verarbeiten',
+    save: 'Speichern & Verarbeiten',
+    cancel: 'Abbrechen',
+    sideTipTitle: 'Warum segmentieren und vorverarbeiten?',
+    sideTipP1: 'Bei der Verarbeitung von Textdaten sind Segmentierung und Bereinigung zwei wichtige Vorverarbeitungsschritte.',
+    sideTipP2: 'Segmentierung teilt langen Text in Abs盲tze, damit Modelle ihn besser verstehen k枚nnen. Dies verbessert die Qualit盲t und Relevanz der Modellergebnisse.',
+    sideTipP3: 'Bereinigung entfernt unn枚tige Zeichen und Formate, macht das Wissen sauberer und leichter zu parsen.',
+    sideTipP4: 'Richtige Segmentierung und Bereinigung verbessern die Modellleistung und liefern genauere und wertvollere Ergebnisse.',
+    previewTitle: 'Vorschau',
+    previewTitleButton: 'Vorschau',
+    previewButton: 'Umschalten zum Frage-und-Antwort-Format',
+    previewSwitchTipStart: 'Die aktuelle Chunk-Vorschau ist im Textformat, ein Wechsel zur Vorschau im Frage-und-Antwort-Format wird',
+    previewSwitchTipEnd: ' zus盲tzliche Tokens verbrauchen',
+    characters: 'Zeichen',
+    indexSettingTip: 'Um die Indexmethode zu 盲ndern, bitte gehen Sie zu den ',
+    retrievalSettingTip: 'Um die Indexmethode zu 盲ndern, bitte gehen Sie zu den ',
+    datasetSettingLink: 'Wissenseinstellungen.',
+    websiteSource: 'Preprocess-Website',
+    webpageUnit: 'Seiten',
+    separatorTip: 'Ein Trennzeichen ist das Zeichen, das zum Trennen von Text verwendet wird. \\n\\n und \\n sind h盲ufig verwendete Trennzeichen zum Trennen von Abs盲tzen und Zeilen. In Kombination mit Kommas (\\n\\n,\\n) werden Abs盲tze nach Zeilen segmentiert, wenn die maximale Blockl盲nge 眉berschritten wird. Sie k枚nnen auch spezielle, von Ihnen selbst definierte Trennzeichen verwenden (z. B. ***).',
+    maxLengthCheck: 'Die maximale St眉ckl盲nge sollte weniger als {{limit}} betragen',
+    switch: 'Schalter',
+    previewChunk: 'Vorschau Chunk',
+    highQualityTip: 'Sobald die Einbettung im Modus "Hohe Qualit盲t" abgeschlossen ist, ist es nicht mehr m枚glich, in den Modus "Wirtschaftlich" zur眉ckzukehren.',
+    parentChildTip: 'Wenn Sie den Parent-Child-Modus verwenden, wird der Child-Chunk f眉r den Abruf und der Parent-Chunk f眉r den Abruf als Kontext verwendet.',
+    fullDoc: 'Vollst盲ndiges Dokument',
+    parentChildDelimiterTip: 'Ein Trennzeichen ist das Zeichen, das zum Trennen von Text verwendet wird. \\n\\n wird empfohlen, um das Originaldokument in gro脽e 眉bergeordnete Bl枚cke aufzuteilen. Sie k枚nnen auch spezielle Trennzeichen verwenden, die Sie selbst definiert haben.',
+    qaSwitchHighQualityTipContent: 'Derzeit unterst眉tzt nur eine hochwertige Indexmethode das Q&A-Format-Chunking. M枚chten Sie in den High-Quality-Modus wechseln?',
+    childChunkForRetrieval: 'Child-Chunk zum Abrufen',
+    previewChunkCount: '{{Anzahl}} Gesch盲tzte Chunks',
+    previewChunkTip: 'Klicken Sie auf die Schaltfl盲che "Preview Chunk" auf der linken Seite, um die Vorschau zu laden',
+    qaSwitchHighQualityTipTitle: 'Das Q&A-Format erfordert eine qualitativ hochwertige Indizierungsmethode',
+    general: 'Allgemein',
+    generalTip: 'Allgemeiner Text-Chunking-Modus, die abgerufenen und zur眉ckgerufenen Chunks sind gleich.',
+    notAvailableForQA: 'Nicht verf眉gbar f眉r Q&A Index',
+    notAvailableForParentChild: 'Nicht verf眉gbar f眉r den Parent-Child-Index',
+    parentChild: 'Eltern-Kind',
+    parentChunkForContext: 'Parent-chunk f眉r Context',
+    parentChildChunkDelimiterTip: 'Ein Trennzeichen ist das Zeichen, das zum Trennen von Text verwendet wird. \\n wird empfohlen, um 眉bergeordnete Bl枚cke in kleine untergeordnete Bl枚cke aufzuteilen. Sie k枚nnen auch spezielle Trennzeichen verwenden, die Sie selbst definiert haben.',
+    useQALanguage: 'Chunk im Q&A-Format in',
+    paragraph: 'Absatz',
+    fullDocTip: 'Das gesamte Dokument wird als 眉bergeordneter Block verwendet und direkt abgerufen. Bitte beachten Sie, dass aus Leistungsgr眉nden Texte, die 10000 Token 眉berschreiten, automatisch abgeschnitten werden.',
+    paragraphTip: 'In diesem Modus wird der Text basierend auf Trennzeichen und der maximalen Blockl盲nge in Abs盲tze aufgeteilt, wobei der geteilte Text als 眉bergeordneter Block f眉r den Abruf verwendet wird.',
+  },
+  stepThree: {
+    creationTitle: '馃帀 Wissen erstellt',
+    creationContent: 'Wir haben das Wissen automatisch benannt, Sie k枚nnen es jederzeit 盲ndern',
+    label: 'Wissensname',
+    additionTitle: '馃帀 Dokument hochgeladen',
+    additionP1: 'Das Dokument wurde zum Wissen hinzugef眉gt',
+    additionP2: ', Sie k枚nnen es in der Dokumentenliste des Wissens finden.',
+    stop: 'Verarbeitung stoppen',
+    resume: 'Verarbeitung fortsetzen',
+    navTo: 'Zum Dokument gehen',
+    sideTipTitle: 'Was kommt als N盲chstes',
+    sideTipContent: 'Nachdem das Dokument indiziert wurde, kann das Wissen in die Anwendung als Kontext integriert werden, Sie finden die Kontexteinstellung auf der Seite zur Eingabeaufforderungen-Orchestrierung. Sie k枚nnen es auch als unabh盲ngiges ChatGPT-Indexierungsplugin zur Ver枚ffentlichung erstellen.',
+    modelTitle: 'Sind Sie sicher, dass Sie die Einbettung stoppen m枚chten?',
+    modelContent: 'Wenn Sie die Verarbeitung sp盲ter fortsetzen m枚chten, werden Sie dort weitermachen, wo Sie aufgeh枚rt haben.',
+    modelButtonConfirm: 'Best盲tigen',
+    modelButtonCancel: 'Abbrechen',
+  },
+  firecrawl: {
+    apiKeyPlaceholder: 'API-Schl眉ssel von firecrawl.dev',
+    configFirecrawl: 'Konfigurieren von 馃敟Firecrawl',
+    getApiKeyLinkText: 'Holen Sie sich Ihren API-Schl眉ssel von firecrawl.dev',
+  },
+  jinaReader: {
+    configJinaReader: 'Jina Reader konfigurieren',
+    apiKeyPlaceholder: 'API-Schl眉ssel von jina.ai',
+    getApiKeyLinkText: 'Holen Sie sich Ihren kostenlosen API-Schl眉ssel bei jina.ai',
+  },
+  otherDataSource: {
+    learnMore: 'Weitere Informationen',
+    title: 'Verbinden Sie sich mit anderen Datenquellen?',
+    description: 'Derzeit verf眉gt die Wissensdatenbank von Dify nur 眉ber begrenzte Datenquellen. Das Beitragen einer Datenquelle zur Dify-Wissensdatenbank ist eine fantastische M枚glichkeit, die Flexibilit盲t und Leistungsf盲higkeit der Plattform f眉r alle Benutzer zu verbessern. Unser Beitragsleitfaden erleichtert Ihnen den Einstieg. Bitte klicken Sie auf den untenstehenden Link, um mehr zu erfahren.',
+  },
+  watercrawl: {
+    configWatercrawl: 'Wasserkrabbe konfigurieren',
+    apiKeyPlaceholder: 'API-Schl眉ssel von watercrawl.dev',
+    getApiKeyLinkText: 'Holen Sie sich Ihren API-Schl眉ssel von watercrawl.dev',
+  },
+}
+
+export default translation
diff --git a/i18n/de-DE/dataset-documents.ts b/i18n/de-DE/dataset-documents.ts
new file mode 100644
index 0000000..22018f9
--- /dev/null
+++ b/i18n/de-DE/dataset-documents.ts
@@ -0,0 +1,396 @@
+const translation = {
+  list: {
+    title: 'Dokumente',
+    desc: 'Alle Dateien des Wissens werden hier angezeigt, und das gesamte Wissen kann mit Dify-Zitaten verkn眉pft oder 眉ber das Chat-Plugin indiziert werden.',
+    addFile: 'Datei hinzuf眉gen',
+    addPages: 'Seiten hinzuf眉gen',
+    table: {
+      header: {
+        fileName: 'DATEINAME',
+        words: 'W脰RTER',
+        hitCount: 'SUCHANFRAGEN',
+        uploadTime: 'HOCHLADEZEIT',
+        status: 'STATUS',
+        action: 'AKTION',
+        chunkingMode: 'CHUNKING-MODUS',
+      },
+      name: 'Name',
+      rename: 'Umbenennen',
+    },
+    action: {
+      uploadFile: 'Neue Datei hochladen',
+      settings: 'Segment-Einstellungen',
+      addButton: 'Chunk hinzuf眉gen',
+      add: 'Einen Chunk hinzuf眉gen',
+      batchAdd: 'Batch hinzuf眉gen',
+      archive: 'Archivieren',
+      unarchive: 'Archivierung aufheben',
+      delete: 'L枚schen',
+      enableWarning: 'Archivierte Datei kann nicht aktiviert werden',
+      sync: 'Synchronisieren',
+    },
+    index: {
+      enable: 'Aktivieren',
+      disable: 'Deaktivieren',
+      all: 'Alle',
+      enableTip: 'Die Datei kann indiziert werden',
+      disableTip: 'Die Datei kann nicht indiziert werden',
+    },
+    status: {
+      queuing: 'In Warteschlange',
+      indexing: 'Indizierung',
+      paused: 'Pausiert',
+      error: 'Fehler',
+      available: 'Verf眉gbar',
+      enabled: 'Aktiviert',
+      disabled: 'Deaktiviert',
+      archived: 'Archiviert',
+    },
+    empty: {
+      title: 'Es gibt noch keine Dokumentation',
+      upload: {
+        tip: 'Sie k枚nnen Dateien hochladen, von der Website oder von Web-Apps wie Notion, GitHub usw. synchronisieren.',
+      },
+      sync: {
+        tip: 'Dify wird periodisch Dateien von Ihrem Notion herunterladen und die Verarbeitung abschlie脽en.',
+      },
+    },
+    delete: {
+      title: 'Sind Sie sicher, dass Sie l枚schen m枚chten?',
+      content: 'Wenn Sie die Verarbeitung sp盲ter fortsetzen m眉ssen, werden Sie dort weitermachen, wo Sie aufgeh枚rt haben',
+    },
+    batchModal: {
+      title: 'Chunks in Batch hinzuf眉gen',
+      csvUploadTitle: 'Ziehen Sie Ihre CSV-Datei hierher oder ',
+      browse: 'durchsuchen',
+      tip: 'Die CSV-Datei muss der folgenden Struktur entsprechen:',
+      question: 'Frage',
+      answer: 'Antwort',
+      contentTitle: 'Chunk-Inhalt',
+      content: 'Inhalt',
+      template: 'Laden Sie die Vorlage hier herunter',
+      cancel: 'Abbrechen',
+      run: 'Batch ausf眉hren',
+      runError: 'Batch-Ausf眉hrung fehlgeschlagen',
+      processing: 'In Batch-Verarbeitung',
+      completed: 'Import abgeschlossen',
+      error: 'Importfehler',
+      ok: 'OK',
+    },
+    addUrl: 'URL hinzuf眉gen',
+    learnMore: 'Weitere Informationen',
+  },
+  metadata: {
+    title: 'Metadaten',
+    desc: 'Das Kennzeichnen von Metadaten f眉r Dokumente erm枚glicht es der KI, sie rechtzeitig zu erreichen und die Quelle der Referenzen f眉r die Benutzer offenzulegen.',
+    dateTimeFormat: 'MMMM D, YYYY hh:mm A',
+    docTypeSelectTitle: 'Bitte w盲hlen Sie einen Dokumenttyp',
+    docTypeChangeTitle: 'Dokumenttyp 盲ndern',
+    docTypeSelectWarning:
+      'Wenn der Dokumenttyp ge盲ndert wird, werden die jetzt ausgef眉llten Metadaten nicht mehr erhalten bleiben',
+    firstMetaAction: 'Los geht\'s',
+    placeholder: {
+      add: 'Hinzuf眉gen ',
+      select: 'Ausw盲hlen ',
+    },
+    source: {
+      upload_file: 'Datei hochladen',
+      notion: 'Von Notion synchronisieren',
+      github: 'Von Github synchronisieren',
+    },
+    type: {
+      book: 'Buch',
+      webPage: 'Webseite',
+      paper: 'Aufsatz',
+      socialMediaPost: 'Social Media Beitrag',
+      personalDocument: 'Pers枚nliches Dokument',
+      businessDocument: 'Gesch盲ftsdokument',
+      IMChat: 'IM Chat',
+      wikipediaEntry: 'Wikipedia-Eintrag',
+      notion: 'Von Notion synchronisieren',
+      github: 'Von Github synchronisieren',
+      technicalParameters: 'Technische Parameter',
+    },
+    field: {
+      processRule: {
+        processDoc: 'Dokument verarbeiten',
+        segmentRule: 'Chunk-Regel',
+        segmentLength: 'Chunk-L盲nge',
+        processClean: 'Textverarbeitung bereinigen',
+      },
+      book: {
+        title: 'Titel',
+        language: 'Sprache',
+        author: 'Autor',
+        publisher: 'Verlag',
+        publicationDate: 'Ver枚ffentlichungsdatum',
+        ISBN: 'ISBN',
+        category: 'Kategorie',
+      },
+      webPage: {
+        title: 'Titel',
+        url: 'URL',
+        language: 'Sprache',
+        authorPublisher: 'Autor/Verlag',
+        publishDate: 'Ver枚ffentlichungsdatum',
+        topicKeywords: 'Themen/Schl眉sselw枚rter',
+        description: 'Beschreibung',
+      },
+      paper: {
+        title: 'Titel',
+        language: 'Sprache',
+        author: 'Autor',
+        publishDate: 'Ver枚ffentlichungsdatum',
+        journalConferenceName: 'Zeitschrift/Konferenzname',
+        volumeIssuePage: 'Band/Ausgabe/Seite',
+        DOI: 'DOI',
+        topicKeywords: 'Themen/Schl眉sselw枚rter',
+        abstract: 'Zusammenfassung',
+        topicsKeywords: 'Themen/Stichworte',
+      },
+      socialMediaPost: {
+        platform: 'Plattform',
+        authorUsername: 'Autor/Benutzername',
+        publishDate: 'Ver枚ffentlichungsdatum',
+        postURL: 'Beitrags-URL',
+        topicsTags: 'Themen/Tags',
+      },
+      personalDocument: {
+        title: 'Titel',
+        author: 'Autor',
+        creationDate: 'Erstellungsdatum',
+        lastModifiedDate: 'Letztes 脛nderungsdatum',
+        documentType: 'Dokumenttyp',
+        tagsCategory: 'Tags/Kategorie',
+      },
+      businessDocument: {
+        title: 'Titel',
+        author: 'Autor',
+        creationDate: 'Erstellungsdatum',
+        lastModifiedDate: 'Letztes 脛nderungsdatum',
+        documentType: 'Dokumenttyp',
+        departmentTeam: 'Abteilung/Team',
+      },
+      IMChat: {
+        chatPlatform: 'Chat-Plattform',
+        chatPartiesGroupName: 'Chat-Parteien/Gruppenname',
+        participants: 'Teilnehmer',
+        startDate: 'Startdatum',
+        endDate: 'Enddatum',
+        topicsKeywords: 'Themen/Schl眉sselw枚rter',
+        fileType: 'Dateityp',
+      },
+      wikipediaEntry: {
+        title: 'Titel',
+        language: 'Sprache',
+        webpageURL: 'Webseiten-URL',
+        editorContributor: 'Editor/Beitragender',
+        lastEditDate: 'Letztes Bearbeitungsdatum',
+        summaryIntroduction: 'Zusammenfassung/Einf眉hrung',
+      },
+      notion: {
+        title: 'Titel',
+        language: 'Sprache',
+        author: 'Autor',
+        createdTime: 'Erstellungszeit',
+        lastModifiedTime: 'Letzte 脛nderungszeit',
+        url: 'URL',
+        tag: 'Tag',
+        description: 'Beschreibung',
+      },
+      github: {
+        repoName: 'Repository-Name',
+        repoDesc: 'Repository-Beschreibung',
+        repoOwner: 'Repository-Eigent眉mer',
+        fileName: 'Dateiname',
+        filePath: 'Dateipfad',
+        programmingLang: 'Programmiersprache',
+        url: 'URL',
+        license: 'Lizenz',
+        lastCommitTime: 'Letzte Commit-Zeit',
+        lastCommitAuthor: 'Letzter Commit-Autor',
+      },
+      originInfo: {
+        originalFilename: 'Originaldateiname',
+        originalFileSize: 'Originaldateigr枚脽e',
+        uploadDate: 'Hochladedatum',
+        lastUpdateDate: 'Letztes 脛nderungsdatum',
+        source: 'Quelle',
+      },
+      technicalParameters: {
+        segmentSpecification: 'Chunk-Spezifikation',
+        segmentLength: 'Chunk-L盲nge',
+        avgParagraphLength: 'Durchschn. Absatzl盲nge',
+        paragraphs: 'Abs盲tze',
+        hitCount: 'Abrufanzahl',
+        embeddingTime: 'Einbettungszeit',
+        embeddedSpend: 'Einbettungsausgaben',
+      },
+    },
+    languageMap: {
+      zh: 'Chinesisch',
+      en: 'Englisch',
+      es: 'Spanisch',
+      fr: 'Franz枚sisch',
+      de: 'Deutsch',
+      ja: 'Japanisch',
+      ko: 'Koreanisch',
+      ru: 'Russisch',
+      ar: 'Arabisch',
+      pt: 'Portugiesisch',
+      it: 'Italienisch',
+      nl: 'Niederl盲ndisch',
+      pl: 'Polnisch',
+      sv: 'Schwedisch',
+      tr: 'T眉rkisch',
+      he: 'Hebr盲isch',
+      hi: 'Hindi',
+      da: 'D盲nisch',
+      fi: 'Finnisch',
+      no: 'Norwegisch',
+      hu: 'Ungarisch',
+      el: 'Griechisch',
+      cs: 'Tschechisch',
+      th: 'Thai',
+      id: 'Indonesisch',
+    },
+    categoryMap: {
+      book: {
+        fiction: 'Fiktion',
+        biography: 'Biografie',
+        history: 'Geschichte',
+        science: 'Wissenschaft',
+        technology: 'Technologie',
+        education: 'Bildung',
+        philosophy: 'Philosophie',
+        religion: 'Religion',
+        socialSciences: 'Sozialwissenschaften',
+        art: 'Kunst',
+        travel: 'Reisen',
+        health: 'Gesundheit',
+        selfHelp: 'Selbsthilfe',
+        businessEconomics: 'Wirtschaft',
+        cooking: 'Kochen',
+        childrenYoungAdults: 'Kinder & Jugendliche',
+        comicsGraphicNovels: 'Comics & Grafische Romane',
+        poetry: 'Poesie',
+        drama: 'Drama',
+        other: 'Andere',
+      },
+      personalDoc: {
+        notes: 'Notizen',
+        blogDraft: 'Blog-Entwurf',
+        diary: 'Tagebuch',
+        researchReport: 'Forschungsbericht',
+        bookExcerpt: 'Buchauszug',
+        schedule: 'Zeitplan',
+        list: 'Liste',
+        projectOverview: 'Projekt眉bersicht',
+        photoCollection: 'Fotosammlung',
+        creativeWriting: 'Kreatives Schreiben',
+        codeSnippet: 'Code-Snippet',
+        designDraft: 'Design-Entwurf',
+        personalResume: 'Pers枚nlicher Lebenslauf',
+        other: 'Andere',
+      },
+      businessDoc: {
+        meetingMinutes: 'Protokolle',
+        researchReport: 'Forschungsbericht',
+        proposal: 'Vorschlag',
+        employeeHandbook: 'Mitarbeiterhandbuch',
+        trainingMaterials: 'Schulungsmaterialien',
+        requirementsDocument: 'Anforderungsdokumentation',
+        designDocument: 'Design-Dokument',
+        productSpecification: 'Produktspezifikation',
+        financialReport: 'Finanzbericht',
+        marketAnalysis: 'Marktanalyse',
+        projectPlan: 'Projektplan',
+        teamStructure: 'Teamstruktur',
+        policiesProcedures: 'Richtlinien & Verfahren',
+        contractsAgreements: 'Vertr盲ge & Vereinbarungen',
+        emailCorrespondence: 'E-Mail-Korrespondenz',
+        other: 'Andere',
+      },
+    },
+  },
+  embedding: {
+    processing: 'Einbettungsverarbeitung...',
+    paused: 'Einbettung pausiert',
+    completed: 'Einbettung abgeschlossen',
+    error: 'Einbettungsfehler',
+    docName: 'Dokument vorbereiten',
+    mode: 'Segmentierungsregel',
+    segmentLength: 'Chunk-L盲nge',
+    textCleaning: 'Textvordefinition und -bereinigung',
+    segments: 'Abs盲tze',
+    highQuality: 'Hochwertiger Modus',
+    economy: 'Wirtschaftlicher Modus',
+    estimate: 'Gesch盲tzter Verbrauch',
+    stop: 'Verarbeitung stoppen',
+    resume: 'Verarbeitung fortsetzen',
+    automatic: 'Automatisch',
+    custom: 'Benutzerdefiniert',
+    previewTip: 'Absatzvorschau ist nach Abschluss der Einbettung verf眉gbar',
+    parentMaxTokens: 'Elternteil',
+    childMaxTokens: 'Kind',
+    hierarchical: 'Eltern-Kind',
+    pause: 'Pause',
+  },
+  segment: {
+    paragraphs: 'Abs盲tze',
+    keywords: 'Schl眉sselw枚rter',
+    addKeyWord: 'Schl眉sselwort hinzuf眉gen',
+    keywordError: 'Die maximale L盲nge des Schl眉sselworts betr盲gt 20',
+    characters: 'Zeichen',
+    hitCount: 'Abrufanzahl',
+    vectorHash: 'Vektor-Hash: ',
+    questionPlaceholder: 'Frage hier hinzuf眉gen',
+    questionEmpty: 'Frage darf nicht leer sein',
+    answerPlaceholder: 'Antwort hier hinzuf眉gen',
+    answerEmpty: 'Antwort darf nicht leer sein',
+    contentPlaceholder: 'Inhalt hier hinzuf眉gen',
+    contentEmpty: 'Inhalt darf nicht leer sein',
+    newTextSegment: 'Neues Textsegment',
+    newQaSegment: 'Neues Q&A-Segment',
+    delete: 'Diesen Chunk l枚schen?',
+    parentChunks_one: '脺BERGEORDNETER CHUNK',
+    searchResults_other: 'BEFUND',
+    clearFilter: 'Filter l枚schen',
+    chunk: 'St眉ck',
+    childChunk: 'Untergeordneter Brocken',
+    newChildChunk: 'Neuer untergeordneter Block',
+    chunkDetail: 'Chunk-Detail',
+    regeneratingMessage: 'Das kann einen Moment dauern, bitte warten...',
+    searchResults_zero: 'ERGEBNIS',
+    parentChunks_other: '脺BERGEORDNETE BL脰CKE',
+    editParentChunk: '脺bergeordneter Block bearbeiten',
+    childChunks_other: 'UNTERGEORDNETE BL脰CKE',
+    editChunk: 'Chunk bearbeiten',
+    regenerationSuccessTitle: 'Regeneration abgeschlossen',
+    parentChunk: '脺bergeordneter Chunk',
+    childChunkAdded: '1 untergeordneter Block hinzugef眉gt',
+    edited: 'BEARBEITETE',
+    collapseChunks: 'Bl枚cke reduzieren',
+    empty: 'Kein Chunk gefunden',
+    regenerationSuccessMessage: 'Sie k枚nnen dieses Fenster schlie脽en.',
+    chunks_other: 'ST脺CKE',
+    regenerationConfirmMessage: 'Beim Regenerieren von untergeordneten Bl枚cken werden die aktuellen untergeordneten Bl枚cke 眉berschrieben, einschlie脽lich bearbeiteter und neu hinzugef眉gter Bl枚cke. Die Regeneration kann nicht r眉ckg盲ngig gemacht werden.',
+    childChunks_one: 'UNTERGEORDNETER CHUNK',
+    characters_other: 'Zeichen',
+    newChunk: 'Neuer Brocken',
+    editChildChunk: 'Untergeordneten Block bearbeiten',
+    chunkAdded: '1 St眉ck hinzugef眉gt',
+    expandChunks: 'Bl枚cke erweitern',
+    editedAt: 'Bearbeitet am',
+    addChunk: 'Block hinzuf眉gen',
+    addAnother: 'F眉gen Sie eine weitere hinzu',
+    regeneratingTitle: 'Regenerieren von untergeordneten Bl枚cken',
+    chunks_one: 'ST脺CK',
+    characters_one: 'Zeichen',
+    addChildChunk: 'Untergeordneten Block hinzuf眉gen',
+    regenerationConfirmTitle: 'M枚chten Sie untergeordnete Chunks regenerieren?',
+    searchResults_one: 'ERGEBNIS',
+  },
+}
+
+export default translation
diff --git a/i18n/de-DE/dataset-hit-testing.ts b/i18n/de-DE/dataset-hit-testing.ts
new file mode 100644
index 0000000..840a3c8
--- /dev/null
+++ b/i18n/de-DE/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: 'Abruf-Test',
+  desc: 'Testen Sie die Treffereffektivit盲t des Wissens anhand des gegebenen Abfragetextes.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  recents: 'K眉rzlich',
+  table: {
+    header: {
+      source: 'Quelle',
+      text: 'Text',
+      time: 'Zeit',
+    },
+  },
+  input: {
+    title: 'Quelltext',
+    placeholder: 'Bitte geben Sie einen Text ein, ein kurzer aussagekr盲ftiger Satz wird empfohlen.',
+    countWarning: 'Bis zu 200 Zeichen.',
+    indexWarning: 'Nur Wissen hoher Qualit盲t.',
+    testing: 'Testen',
+  },
+  hit: {
+    title: 'ABRUFPARAGRAFEN',
+    emptyTip: 'Ergebnisse des Abruf-Tests werden hier angezeigt',
+  },
+  noRecentTip: 'Keine k眉rzlichen Abfrageergebnisse hier',
+  viewChart: 'VEKTORDIAGRAMM ansehen',
+  viewDetail: 'Im Detail sehen',
+  settingTitle: 'Einstellung f眉r den Abruf',
+  records: 'Aufzeichnungen',
+  open: 'Offen',
+  hitChunks: 'Klicken Sie auf {{num}} untergeordnete Chunks',
+  keyword: 'Schl眉sselw枚rter',
+  chunkDetail: 'Chunk-Detail',
+}
+
+export default translation
diff --git a/i18n/de-DE/dataset-settings.ts b/i18n/de-DE/dataset-settings.ts
new file mode 100644
index 0000000..928da40
--- /dev/null
+++ b/i18n/de-DE/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: 'Wissenseinstellungen',
+  desc: 'Hier k枚nnen Sie die Eigenschaften und Arbeitsweisen des Wissens anpassen.',
+  form: {
+    name: 'Wissensname',
+    namePlaceholder: 'Bitte geben Sie den Namen des Wissens ein',
+    nameError: 'Name darf nicht leer sein',
+    desc: 'Wissensbeschreibung',
+    descInfo: 'Bitte schreiben Sie eine klare textuelle Beschreibung, um den Inhalt des Wissens zu umrei脽en. Diese Beschreibung wird als Grundlage f眉r die Auswahl aus mehreren Wissensdatenbanken zur Inferenz verwendet.',
+    descPlaceholder: 'Beschreiben Sie, was in diesem Wissen enthalten ist. Eine detaillierte Beschreibung erm枚glicht es der KI, zeitnah auf den Inhalt des Wissens zuzugreifen. Wenn leer, verwendet Dify die Standard-Treffstrategie.',
+    descWrite: 'Erfahren Sie, wie man eine gute Wissensbeschreibung schreibt.',
+    permissions: 'Berechtigungen',
+    permissionsOnlyMe: 'Nur ich',
+    permissionsAllMember: 'Alle Teammitglieder',
+    indexMethod: 'Indexierungsmethode',
+    indexMethodHighQuality: 'Hohe Qualit盲t',
+    indexMethodHighQualityTip: 'Den Embedding-Modell zur Verarbeitung aufrufen, um bei Benutzeranfragen eine h枚here Genauigkeit zu bieten.',
+    indexMethodEconomy: '脰konomisch',
+    indexMethodEconomyTip: 'Verwendet Offline-Vektor-Engines, Schlagwortindizes usw., um die Genauigkeit ohne Tokenverbrauch zu reduzieren',
+    embeddingModel: 'Einbettungsmodell',
+    embeddingModelTip: '脛ndern Sie das eingebettete Modell, bitte gehen Sie zu ',
+    embeddingModelTipLink: 'Einstellungen',
+    retrievalSetting: {
+      title: 'Abrufeinstellung',
+      learnMore: 'Mehr erfahren',
+      description: ' 眉ber die Abrufmethode.',
+      longDescription: ' 眉ber die Abrufmethode, dies kann jederzeit in den Wissenseinstellungen ge盲ndert werden.',
+      method: 'Abrufmethode',
+    },
+    save: 'Speichern',
+    permissionsInvitedMembers: 'Teilweise Teammitglieder',
+    me: '(Sie)',
+    externalKnowledgeID: 'ID f眉r externes Wissen',
+    externalKnowledgeAPI: 'API f眉r externes Wissen',
+    retrievalSettings: 'Einstellungen f眉r den Abruf',
+    upgradeHighQualityTip: 'Nach dem Upgrade auf den Modus "Hohe Qualit盲t" ist das Zur眉cksetzen auf den Modus "Wirtschaftlich" nicht mehr m枚glich',
+    helpText: 'Erfahren Sie, wie Sie eine gute Datensatzbeschreibung schreiben.',
+    indexMethodChangeToEconomyDisabledTip: 'Nicht verf眉gbar f眉r ein Downgrade von HQ auf ECO',
+    searchModel: 'Modell suchen',
+  },
+}
+
+export default translation
diff --git a/i18n/de-DE/dataset.ts b/i18n/de-DE/dataset.ts
new file mode 100644
index 0000000..4d513aa
--- /dev/null
+++ b/i18n/de-DE/dataset.ts
@@ -0,0 +1,221 @@
+const translation = {
+  knowledge: 'Wissen',
+  documentCount: ' Dokumente',
+  wordCount: ' k W枚rter',
+  appCount: ' verkn眉pfte Apps',
+  createDataset: 'Wissen erstellen',
+  createDatasetIntro: 'Importiere deine eigenen Textdaten oder schreibe Daten in Echtzeit 眉ber Webhook f眉r die LLM-Kontextverbesserung.',
+  deleteDatasetConfirmTitle: 'Dieses Wissen l枚schen?',
+  deleteDatasetConfirmContent:
+    'Das L枚schen des Wissens ist unwiderruflich. Benutzer werden nicht mehr auf Ihr Wissen zugreifen k枚nnen und alle Eingabeaufforderungen, Konfigurationen und Protokolle werden dauerhaft gel枚scht.',
+  datasetUsedByApp: 'Das Wissen wird von einigen Apps verwendet. Apps werden dieses Wissen nicht mehr nutzen k枚nnen, und alle Prompt-Konfigurationen und Protokolle werden dauerhaft gel枚scht.',
+  datasetDeleted: 'Wissen gel枚scht',
+  datasetDeleteFailed: 'L枚schen des Wissens fehlgeschlagen',
+  didYouKnow: 'Wusstest du schon?',
+  intro1: 'Das Wissen kann in die Dify-Anwendung ',
+  intro2: 'als Kontext',
+  intro3: ',',
+  intro4: 'oder es ',
+  intro5: 'kann erstellt werden',
+  intro6: ' als ein eigenst盲ndiges ChatGPT-Index-Plugin zum Ver枚ffentlichen',
+  unavailable: 'Nicht verf眉gbar',
+  unavailableTip: 'Einbettungsmodell ist nicht verf眉gbar, das Standard-Einbettungsmodell muss konfiguriert werden',
+  datasets: 'WISSEN',
+  datasetsApi: 'API',
+  retrieval: {
+    semantic_search: {
+      title: 'Vektorsuche',
+      description: 'Erzeuge Abfrage-Einbettungen und suche nach dem Textst眉ck, das seiner Vektorrepr盲sentation am 盲hnlichsten ist.',
+    },
+    full_text_search: {
+      title: 'Volltextsuche',
+      description: 'Indiziere alle Begriffe im Dokument, sodass Benutzer jeden Begriff suchen und den relevanten Textabschnitt finden k枚nnen, der diese Begriffe enth盲lt.',
+    },
+    hybrid_search: {
+      title: 'Hybridsuche',
+      description: 'F眉hre Volltextsuche und Vektorsuchen gleichzeitig aus, ordne neu, um die beste 脺bereinstimmung f眉r die Abfrage des Benutzers auszuw盲hlen. Konfiguration des Rerank-Modell-APIs ist notwendig.',
+      recommend: 'Empfehlen',
+    },
+    invertedIndex: {
+      title: 'Invertierter Index',
+      description: 'Ein invertierter Index ist eine Struktur, die f眉r effiziente Abfragen verwendet wird. Organisiert nach Begriffen, zeigt jeder Begriff auf Dokumente oder Webseiten, die ihn enthalten.',
+    },
+    change: '脛ndern',
+    changeRetrievalMethod: 'Abfragemethode 盲ndern',
+  },
+  docsFailedNotice: 'Dokumente konnten nicht indiziert werden',
+  retry: 'Wiederholen',
+  indexingTechnique: {
+    high_quality: 'HQ',
+    economy: 'ECO',
+  },
+  indexingMethod: {
+    semantic_search: 'VEKTOR',
+    full_text_search: 'VOLLTEXT',
+    hybrid_search: 'HYBRID',
+    invertedIndex: 'INVERTIERT',
+  },
+  mixtureHighQualityAndEconomicTip: 'F眉r die Mischung von hochwertigen und wirtschaftlichen Wissensbasen ist das Rerank-Modell erforderlich.',
+  inconsistentEmbeddingModelTip: 'Das Rerank-Modell ist erforderlich, wenn die Embedding-Modelle der ausgew盲hlten Wissensbasen inkonsistent sind.',
+  retrievalSettings: 'Abrufeinstellungen',
+  rerankSettings: 'Rerank-Einstellungen',
+  weightedScore: {
+    title: 'Gewichtete Bewertung',
+    description: 'Durch Anpassung der zugewiesenen Gewichte bestimmt diese Rerank-Strategie, ob semantische oder Schl眉sselwort-脺bereinstimmung priorisiert werden soll.',
+    semanticFirst: 'Semantik zuerst',
+    keywordFirst: 'Schl眉sselwort zuerst',
+    customized: 'Angepasst',
+    semantic: 'Semantisch',
+    keyword: 'Schl眉sselwort',
+  },
+  nTo1RetrievalLegacy: 'N-zu-1-Abruf wird ab September offiziell eingestellt. Es wird empfohlen, den neuesten Multi-Pfad-Abruf zu verwenden, um bessere Ergebnisse zu erzielen.',
+  nTo1RetrievalLegacyLink: 'Mehr erfahren',
+  nTo1RetrievalLegacyLinkText: 'N-zu-1-Abruf wird im September offiziell eingestellt.',
+  defaultRetrievalTip: 'Standardm盲脽ig wird der Multi-Path-Abruf verwendet. Das Wissen wird aus mehreren Wissensdatenbanken abgerufen und dann neu eingestuft.',
+  editExternalAPIConfirmWarningContent: {
+    end: 'externes Wissen, und diese Modifikation wird auf alle angewendet. Sind Sie sicher, dass Sie diese 脛nderung speichern m枚chten?',
+    front: 'Diese External Knowledge API ist verkn眉pft mit',
+  },
+  editExternalAPIFormWarning: {
+    front: 'Diese externe API ist verkn眉pft mit',
+    end: 'externes Wissen',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: 'L枚schen',
+      end: '?',
+    },
+    content: {
+      front: 'Diese External Knowledge API ist verkn眉pft mit',
+      end: 'externes Wissen. Wenn Sie diese API l枚schen, werden alle ung眉ltig. Sind Sie sicher, dass Sie diese API l枚schen m枚chten?',
+    },
+    noConnectionContent: 'Sind Sie sicher, dass Sie diese API l枚schen m枚chten?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: 'Ausw盲hlen einer externen Wissens-API',
+  },
+  connectDatasetIntro: {
+    content: {
+      front: 'Um eine Verbindung zu einer externen Wissensdatenbank herzustellen, m眉ssen Sie zuerst eine externe API erstellen. Bitte lesen Sie diese sorgf盲ltig durch und beziehen Sie sich auf',
+      link: 'Erfahren Sie, wie Sie eine externe API erstellen',
+      end: '. Suchen Sie dann die entsprechende Wissens-ID und f眉llen Sie diese in das Formular links aus. Wenn alle Informationen korrekt sind, wird nach dem Klicken auf die Schaltfl盲che "Verbinden" automatisch zum Abruftest in der Wissensdatenbank gesprungen.',
+    },
+    learnMore: 'Weitere Informationen',
+    title: 'So stellen Sie eine Verbindung zu einer externen Wissensdatenbank her',
+  },
+  connectHelper: {
+    helper3: '. Wir empfehlen Ihnen dringend,',
+    helper2: 'Es wird nur die Retrieval-Funktionalit盲t unterst眉tzt',
+    helper5: 'bevor Sie diese Funktion verwenden.',
+    helper4: 'Lesen Sie die Hilfedokumentation',
+    helper1: 'Verbinden Sie sich mit externen Wissensdatenbanken 眉ber API und Wissensdatenbank-ID.',
+  },
+  externalKnowledgeForm: {
+    connect: 'Verbinden',
+    cancel: 'Abbrechen',
+  },
+  externalAPIForm: {
+    encrypted: {
+      front: 'Ihr API-Token wird verschl眉sselt und gespeichert mit',
+      end: 'Technologie.',
+    },
+    save: 'Retten',
+    cancel: 'Abbrechen',
+    endpoint: 'API-Endpunkt',
+    name: 'Name',
+    edit: 'Redigieren',
+    apiKey: 'API-Schl眉ssel',
+  },
+  externalTag: '脛u脽erlich',
+  createExternalAPI: 'Hinzuf眉gen einer externen Knowledge-API',
+  externalAPIPanelDescription: 'Die API f眉r externes Wissen wird verwendet, um eine Verbindung zu einer Wissensdatenbank au脽erhalb von Dify herzustellen und Wissen aus dieser Wissensdatenbank abzurufen.',
+  createNewExternalAPI: 'Erstellen einer neuen API f眉r externes Wissen',
+  externalKnowledgeDescriptionPlaceholder: 'Beschreiben Sie, was in dieser Wissensdatenbank enthalten ist (optional)',
+  externalAPIPanelDocumentation: 'Erfahren Sie, wie Sie eine API f眉r externes Wissen erstellen',
+  externalAPIPanelTitle: 'API f眉r externes Wissen',
+  learnHowToWriteGoodKnowledgeDescription: 'Erfahren Sie, wie Sie eine gute Wissensbeschreibung schreiben',
+  editExternalAPITooltipTitle: 'VERKN脺PFTES WISSEN',
+  externalKnowledgeIdPlaceholder: 'Bitte geben Sie die Knowledge ID ein',
+  connectDataset: 'Herstellen einer Verbindung mit einer externen Wissensdatenbank',
+  externalAPI: 'Externe API',
+  externalKnowledgeName: 'Name des externen Wissens',
+  allExternalTip: 'Wenn nur externes Wissen verwendet wird, kann der Benutzer ausw盲hlen, ob das Rerank-Modell aktiviert werden soll. Wenn diese Option nicht aktiviert ist, werden die abgerufenen Bl枚cke basierend auf den Punktzahlen sortiert. Wenn die Abrufstrategien verschiedener Wissensdatenbanken inkonsistent sind, ist dies ungenau.',
+  externalKnowledgeDescription: 'Wissen Beschreibung',
+  noExternalKnowledge: 'Es gibt noch keine External Knowledge API, klicken Sie hier, um zu erstellen',
+  externalKnowledgeNamePlaceholder: 'Bitte geben Sie den Namen der Wissensdatenbank ein.',
+  mixtureInternalAndExternalTip: 'Das Rerank-Modell ist f眉r die Mischung von internem und externem Wissen erforderlich.',
+  externalKnowledgeId: 'ID f眉r externes Wissen',
+  editExternalAPIFormTitle: 'Bearbeiten der API f眉r externes Wissen',
+  chunkingMode: {
+    parentChild: 'Eltern-Kind',
+    general: 'Allgemein',
+  },
+  parentMode: {
+    paragraph: 'Absatz',
+    fullDoc: 'Vollst盲ndiges Dokument',
+  },
+  batchAction: {
+    selected: 'Ausgew盲hlt',
+    cancel: 'Abbrechen',
+    archive: 'Archiv',
+    disable: 'Abschalten',
+    delete: 'L枚schen',
+    enable: 'Erm枚glichen',
+  },
+  enable: 'Erm枚glichen',
+  localDocs: 'Lokale Dokumente',
+  preprocessDocument: '{{num}} Vorverarbeiten von Dokumenten',
+  documentsDisabled: '{{num}} Dokumente deaktiviert - seit 眉ber 30 Tagen inaktiv',
+  allKnowledge: 'Alles Wissen',
+  allKnowledgeDescription: 'W盲hlen Sie diese Option aus, um das gesamte Wissen in diesem Arbeitsbereich anzuzeigen. Nur der Workspace-Besitzer kann das gesamte Wissen verwalten.',
+  metadata: {
+    createMetadata: {
+      namePlaceholder: 'Metadatenname hinzuf眉gen',
+      back: 'Zur眉ck',
+      title: 'Neue Metadaten',
+      name: 'Name',
+      type: 'Art',
+    },
+    checkName: {
+      empty: 'Der Metadatenname darf nicht leer sein.',
+      invalid: 'Der Metadatenname darf nur Kleinbuchstaben, Zahlen und Unterstriche enthalten und muss mit einem Kleinbuchstaben beginnen.',
+    },
+    batchEditMetadata: {
+      editMetadata: 'Metadaten bearbeiten',
+      multipleValue: 'Mehrwert',
+      applyToAllSelectDocument: 'Auf alle ausgew盲hlten Dokumente anwenden',
+      applyToAllSelectDocumentTip: 'Erstellen Sie automatisch alle oben bearbeiteten und neuen Metadaten f眉r alle ausgew盲hlten Dokumente, andernfalls wird die Bearbeitung der Metadaten nur auf Dokumente angewendet, die bereits Metadaten enthalten.',
+      editDocumentsNum: 'Bearbeiten von {{num}} Dokumenten',
+    },
+    selectMetadata: {
+      manageAction: 'Verwalten',
+      search: 'Metadaten durchsuchen',
+      newAction: 'Neue Metadaten',
+    },
+    datasetMetadata: {
+      name: 'Name',
+      disabled: 'Deaktiviert',
+      description: 'Sie k枚nnen alle Metadaten in diesem Wissen hier verwalten. 脛nderungen werden mit jedem Dokument synchronisiert.',
+      deleteContent: 'Bist du sicher, dass du die Metadaten "{{name}}" l枚schen m枚chtest?',
+      addMetaData: 'Metadaten hinzuf眉gen',
+      deleteTitle: 'Best盲tigen Sie das L枚schen',
+      values: '{{num}} Werte',
+      builtIn: 'Eingebaut',
+      rename: 'Umbenennen',
+      builtInDescription: 'Integrierte Metadaten werden automatisch extrahiert und generiert. Sie m眉ssen vor der Verwendung aktiviert werden und k枚nnen nicht bearbeitet werden.',
+      namePlaceholder: 'Metadatenname',
+    },
+    documentMetadata: {
+      startLabeling: 'Labeling starten',
+      technicalParameters: 'Technische Parameter',
+      documentInformation: 'Dokumentinformationen',
+      metadataToolTip: 'Metadaten dienen als ein entscheidender Filter, der die Genauigkeit und Relevanz der Informationsbeschaffung verbessert. Sie k枚nnen die Metadaten f眉r dieses Dokument hier 盲ndern und hinzuf眉gen.',
+    },
+    chooseTime: 'W盲hlen Sie eine Zeit...',
+    metadata: 'Metadaten',
+    addMetadata: 'Metadaten hinzuf眉gen',
+  },
+  embeddingModelNotAvailable: 'Das Einbettungsmodell ist nicht verf眉gbar.',
+}
+
+export default translation
diff --git a/i18n/de-DE/education.ts b/i18n/de-DE/education.ts
new file mode 100644
index 0000000..aa6e3c7
--- /dev/null
+++ b/i18n/de-DE/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    coupon: 'exklusiver 100% Gutschein',
+    end: 'f眉r den Dify Professional Plan.',
+    front: 'Sie sind jetzt berechtigt, den Status 鈥濨ildung verifiziert鈥� zu erhalten. Bitte geben Sie unten Ihre Bildungsinformationen ein, um den Prozess abzuschlie脽en und eine Zu erhalten.',
+  },
+  form: {
+    schoolName: {
+      placeholder: 'Geben Sie den offiziellen, unabgek眉rzten Namen Ihrer Schule ein.',
+      title: 'Ihr Schulname',
+    },
+    schoolRole: {
+      option: {
+        teacher: 'Lehrer',
+        administrator: 'Schuladministrator',
+        student: 'Sch眉ler',
+      },
+      title: 'Ihre Schulrolle',
+    },
+    terms: {
+      desc: {
+        and: 'und',
+        privacyPolicy: 'Datenschutzrichtlinie',
+        termsOfService: 'Nutzungsbedingungen',
+        end: '. Durch die Einreichung:',
+        front: 'Ihre Informationen und die Nutzung des Status "Bildung best盲tigt" unterliegen unseren',
+      },
+      option: {
+        inSchool: 'Ich best盲tige, dass ich an der angegebenen Einrichtung eingeschrieben oder angestellt bin. Dify kann einen Nachweis 眉ber die Einschreibung/Anstellung anfordern. Wenn ich meine Berechtigung falsch darstelle, stimme ich zu, alle Geb眉hren zu zahlen, die aufgrund meines Bildungsstatus urspr眉nglich erlassen wurden.',
+        age: 'Ich best盲tige, dass ich mindestens 18 Jahre alt bin.',
+      },
+      title: 'Allgemeine Gesch盲ftsbedingungen',
+    },
+  },
+  toVerified: 'Bildung 眉berpr眉fen lassen',
+  rejectTitle: 'Ihre Dify-Ausbildungs眉berpr眉fung wurde abgelehnt.',
+  currentSigned: 'DERZEIT ANGEMELDET ALS',
+  submit: 'Einreichen',
+  submitError: 'Die Formular眉bermittlung ist fehlgeschlagen. Bitte versuchen Sie es sp盲ter erneut.',
+  rejectContent: 'Leider sind Sie nicht f眉r den Status "Education Verified" berechtigt und k枚nnen daher den exklusiven 100%-Gutschein f眉r den Dify Professional Plan nicht erhalten, wenn Sie diese E-Mail-Adresse verwenden.',
+  successContent: 'Wir haben einen 100% Rabattgutschein f眉r den Dify Professional Plan auf Ihr Konto ausgestellt. Der Gutschein ist ein Jahr lang g眉ltig, bitte nutzen Sie ihn innerhalb des G眉ltigkeitszeitraums.',
+  learn: 'Erfahren Sie, wie Sie Ihre Ausbildung 眉berpr眉fen lassen.',
+  emailLabel: 'Ihre aktuelle E-Mail',
+  successTitle: 'Sie haben die Dify-Ausbildung verifiziert',
+}
+
+export default translation
diff --git a/i18n/de-DE/explore.ts b/i18n/de-DE/explore.ts
new file mode 100644
index 0000000..7a8e8e0
--- /dev/null
+++ b/i18n/de-DE/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: 'Entdecken',
+  sidebar: {
+    discovery: 'Entdeckung',
+    chat: 'Chat',
+    workspace: 'Arbeitsbereich',
+    action: {
+      pin: 'Anheften',
+      unpin: 'L枚sen',
+      rename: 'Umbenennen',
+      delete: 'L枚schen',
+    },
+    delete: {
+      title: 'App l枚schen',
+      content: 'Sind Sie sicher, dass Sie diese App l枚schen m枚chten?',
+    },
+  },
+  apps: {
+    title: 'Apps von Dify erkunden',
+    description: 'Nutzen Sie diese Vorlagen-Apps sofort oder passen Sie Ihre eigenen Apps basierend auf den Vorlagen an.',
+    allCategories: 'Alle Kategorien',
+  },
+  appCard: {
+    addToWorkspace: 'Zum Arbeitsbereich hinzuf眉gen',
+    customize: 'Anpassen',
+  },
+  appCustomize: {
+    title: 'App aus {{name}} erstellen',
+    subTitle: 'App-Symbol & Name',
+    nameRequired: 'App-Name ist erforderlich',
+  },
+  category: {
+    Assistant: 'Assistent',
+    Writing: 'Schreiben',
+    Translate: '脺bersetzen',
+    Programming: 'Programmieren',
+    HR: 'Personalwesen',
+    Agent: 'Agent',
+    Workflow: 'Arbeitsablauf',
+    Entertainment: 'Unterhaltung',
+  },
+}
+
+export default translation
diff --git a/i18n/de-DE/layout.ts b/i18n/de-DE/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/de-DE/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/de-DE/login.ts b/i18n/de-DE/login.ts
new file mode 100644
index 0000000..2e0d51c
--- /dev/null
+++ b/i18n/de-DE/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: 'Hey, lass uns anfangen!馃憢',
+  welcome: 'Willkommen bei Dify, bitte melde dich an, um fortzufahren.',
+  email: 'E-Mail-Adresse',
+  emailPlaceholder: 'Deine E-Mail',
+  password: 'Passwort',
+  passwordPlaceholder: 'Dein Passwort',
+  name: 'Benutzername',
+  namePlaceholder: 'Dein Benutzername',
+  forget: 'Passwort vergessen?',
+  signBtn: 'Anmelden',
+  installBtn: 'Einrichten',
+  setAdminAccount: 'Admin-Konto einrichten',
+  setAdminAccountDesc: 'Maximale Berechtigungen f眉r das Admin-Konto, das verwendet werden kann, um Anwendungen zu erstellen und LLM-Anbieter usw. zu verwalten.',
+  createAndSignIn: 'Erstellen und anmelden',
+  oneMoreStep: 'Nur noch ein Schritt',
+  createSample: 'Basierend auf diesen Informationen erstellen wir eine Beispielanwendung f眉r dich',
+  invitationCode: 'Einladungscode',
+  invitationCodePlaceholder: 'Dein Einladungscode',
+  interfaceLanguage: 'Oberfl盲chensprache',
+  timezone: 'Zeitzone',
+  go: 'Zu Dify gehen',
+  sendUsMail: 'Sende uns deine Vorstellung per E-Mail, und wir bearbeiten die Einladungsanfrage.',
+  acceptPP: 'Ich habe die Datenschutzbestimmungen gelesen und akzeptiere sie',
+  reset: 'Bitte f眉hre den folgenden Befehl aus, um dein Passwort zur眉ckzusetzen',
+  withGitHub: 'Mit GitHub fortfahren',
+  withGoogle: 'Mit Google fortfahren',
+  rightTitle: 'Das volle Potenzial von LLM aussch枚pfen',
+  rightDesc: 'M眉helos optisch ansprechende, bedienbare und verbesserbare KI-Anwendungen erstellen.',
+  tos: 'Nutzungsbedingungen',
+  pp: 'Datenschutzbestimmungen',
+  tosDesc: 'Mit der Anmeldung stimmst du unseren',
+  goToInit: 'Wenn du das Konto noch nicht initialisiert hast, gehe bitte zur Initialisierungsseite',
+  dontHave: 'Hast du nicht?',
+  invalidInvitationCode: 'Ung眉ltiger Einladungscode',
+  accountAlreadyInited: 'Konto bereits initialisiert',
+  forgotPassword: 'Passwort vergessen?',
+  resetLinkSent: 'Link zum Zur眉cksetzen gesendet',
+  sendResetLink: 'Link zum Zur眉cksetzen senden',
+  backToSignIn: 'Zur眉ck zur Anmeldung',
+  forgotPasswordDesc: 'Bitte geben Sie Ihre E-Mail-Adresse ein, um Ihr Passwort zur眉ckzusetzen. Wir senden Ihnen eine E-Mail mit Anweisungen zum Zur眉cksetzen Ihres Passworts.',
+  checkEmailForResetLink: 'Bitte 眉berpr眉fen Sie Ihre E-Mails auf einen Link zum Zur眉cksetzen Ihres Passworts. Wenn er nicht innerhalb weniger Minuten erscheint, 眉berpr眉fen Sie bitte Ihren Spam-Ordner.',
+  passwordChanged: 'Jetzt anmelden',
+  changePassword: 'Passwort 盲ndern',
+  changePasswordTip: 'Bitte geben Sie ein neues Passwort f眉r Ihr Konto ein',
+  invalidToken: 'Ung眉ltiges oder abgelaufenes Token',
+  confirmPassword: 'Passwort best盲tigen',
+  confirmPasswordPlaceholder: 'Best盲tigen Sie Ihr neues Passwort',
+  passwordChangedTip: 'Ihr Passwort wurde erfolgreich ge盲ndert',
+  error: {
+    emailEmpty: 'E-Mail-Adresse wird ben枚tigt',
+    emailInValid: 'Bitte gib eine g眉ltige E-Mail-Adresse ein',
+    nameEmpty: 'Name wird ben枚tigt',
+    passwordEmpty: 'Passwort wird ben枚tigt',
+    passwordInvalid: 'Das Passwort muss Buchstaben und Zahlen enthalten und l盲nger als 8 Zeichen sein',
+    passwordLengthInValid: 'Das Passwort muss mindestens 8 Zeichen lang sein',
+    registrationNotAllowed: 'Konto nicht gefunden. Bitte wenden Sie sich an den Systemadministrator, um sich zu registrieren.',
+  },
+  license: {
+    tip: 'Bevor du mit Dify Community Edition beginnst, lies die',
+    link: 'Open-Source-Lizenz',
+  },
+  join: 'Beitreten',
+  joinTipStart: 'Lade dich ein, dem',
+  joinTipEnd: 'Team auf Dify beizutreten',
+  invalid: 'Der Link ist abgelaufen',
+  explore: 'Dify erkunden',
+  activatedTipStart: 'Du bist dem',
+  activatedTipEnd: 'Team beigetreten',
+  activated: 'Jetzt anmelden',
+  adminInitPassword: 'Admin-Initialpasswort',
+  validate: 'Validieren',
+  sso: 'Mit SSO fortfahren',
+  checkCode: {
+    didNotReceiveCode: 'Sie haben den Code nicht erhalten?',
+    verificationCodePlaceholder: 'Geben Sie den 6-stelligen Code ein',
+    checkYourEmail: '脺berpr眉fen Sie Ihre E-Mails',
+    verify: '脺berpr眉fen',
+    verificationCode: 'Verifizierungscode',
+    useAnotherMethod: 'Verwenden Sie eine andere Methode',
+    validTime: 'Beachten Sie, dass der Code 5 Minuten lang g眉ltig ist',
+    emptyCode: 'Code ist erforderlich',
+    tips: 'Wir senden einen Verifizierungscode an <strong>{{email}}</strong>',
+    invalidCode: 'Ung眉ltiger Code',
+    resend: 'Wieder senden',
+  },
+  or: 'ODER',
+  back: 'Zur眉ck',
+  changePasswordBtn: 'Festlegen eines Kennworts',
+  enterYourName: 'Bitte geben Sie Ihren Benutzernamen ein',
+  setYourAccount: 'Richten Sie Ihr Konto ein',
+  sendVerificationCode: 'Verifizierungscode senden',
+  useVerificationCode: 'Verifizierungscode verwenden',
+  withSSO: 'Mit SSO fortfahren',
+  resetPasswordDesc: 'Geben Sie die E-Mail-Adresse ein, mit der Sie sich bei Dify angemeldet haben, und wir senden Ihnen eine E-Mail zum Zur眉cksetzen des Passworts.',
+  continueWithCode: 'Fahren Sie mit dem Code fort',
+  resetPassword: 'Passwort zur眉cksetzen',
+  backToLogin: 'Zur眉ck zum Login',
+  noLoginMethodTip: 'Wenden Sie sich an den Systemadministrator, um eine Authentifizierungsmethode hinzuzuf眉gen.',
+  usePassword: 'Passwort verwenden',
+  noLoginMethod: 'Authentifizierungsmethode nicht konfiguriert',
+  licenseExpired: 'Lizenz abgelaufen',
+  licenseLostTip: 'Fehler beim Verbinden des Dify-Lizenzservers. Wenden Sie sich an Ihren Administrator, um Dify weiterhin zu verwenden.',
+  licenseInactive: 'Lizenz inaktiv',
+  licenseInactiveTip: 'Die Dify Enterprise-Lizenz f眉r Ihren Arbeitsbereich ist inaktiv. Wenden Sie sich an Ihren Administrator, um Dify weiterhin zu verwenden.',
+  licenseExpiredTip: 'Die Dify Enterprise-Lizenz f眉r Ihren Arbeitsbereich ist abgelaufen. Wenden Sie sich an Ihren Administrator, um Dify weiterhin zu verwenden.',
+  licenseLost: 'Lizenz verloren',
+}
+
+export default translation
diff --git a/i18n/de-DE/plugin-tags.ts b/i18n/de-DE/plugin-tags.ts
new file mode 100644
index 0000000..3f4423e
--- /dev/null
+++ b/i18n/de-DE/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    weather: 'Wetter',
+    social: 'Sozial',
+    image: 'Bild',
+    education: 'Bildung',
+    travel: 'Reise',
+    agent: 'Agent',
+    design: 'Entwurf',
+    finance: 'Finanzieren',
+    search: 'Suchen',
+    medical: 'Medizinisch',
+    business: 'Gesch盲ft',
+    news: 'Nachrichten',
+    videos: 'Videos',
+    other: 'Andere',
+    entertainment: 'Unterhaltung',
+    utilities: 'Versorgungswirtschaft',
+    productivity: 'Produktivit盲t',
+  },
+  searchTags: 'Such-Tags',
+  allTags: 'Alle Schlagw枚rter',
+}
+
+export default translation
diff --git a/i18n/de-DE/plugin.ts b/i18n/de-DE/plugin.ts
new file mode 100644
index 0000000..9202c22
--- /dev/null
+++ b/i18n/de-DE/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    extensions: 'Erweiterungen',
+    bundles: 'B眉ndel',
+    agents: 'Agenten-Strategien',
+    models: 'Modelle',
+    all: 'Alle',
+    tools: 'Werkzeuge',
+  },
+  categorySingle: {
+    extension: 'Erweiterung',
+    agent: 'Agenten-Strategie',
+    bundle: 'B眉ndel',
+    model: 'Modell',
+    tool: 'Werkzeug',
+  },
+  list: {
+    source: {
+      marketplace: 'Installation aus dem Marketplace',
+      github: 'Installation von GitHub',
+      local: 'Installation aus lokaler Paketdatei',
+    },
+    notFound: 'Keine Plugins gefunden',
+    noInstalled: 'Keine Plugins installiert',
+  },
+  source: {
+    github: 'GitHub (Englisch)',
+    marketplace: 'Marktplatz',
+    local: 'Lokale Paketdatei',
+  },
+  detailPanel: {
+    categoryTip: {
+      local: 'Lokales Plugin',
+      github: 'Installiert von Github',
+      marketplace: 'Installiert aus dem Marketplace',
+      debugging: 'Debuggen-Plugin',
+    },
+    operation: {
+      remove: 'Entfernen',
+      detail: 'Einzelheiten',
+      install: 'Installieren',
+      info: 'Plugin-Informationen',
+      checkUpdate: 'Update pr眉fen',
+      update: 'Aktualisieren',
+      viewDetail: 'Im Detail sehen',
+    },
+    toolSelector: {
+      paramsTip1: 'Steuert LLM-Inferenzparameter.',
+      settings: 'BENUTZEREINSTELLUNGEN',
+      uninstalledLink: 'In Plugins verwalten',
+      descriptionLabel: 'Beschreibung des Werkzeugs',
+      empty: 'Klicken Sie auf die Schaltfl盲che "+", um Werkzeuge hinzuzuf眉gen. Sie k枚nnen mehrere Werkzeuge hinzuf眉gen.',
+      title: 'Werkzeug "Hinzuf眉gen"',
+      paramsTip2: 'Wenn "Automatisch" ausgeschaltet ist, wird der Standardwert verwendet.',
+      unsupportedContent: 'Die installierte Plug-in-Version bietet diese Aktion nicht.',
+      unsupportedTitle: 'Nicht unterst眉tzte Aktion',
+      descriptionPlaceholder: 'Kurze Beschreibung des Zwecks des Werkzeugs, z. B. um die Temperatur f眉r einen bestimmten Ort zu ermitteln.',
+      auto: 'Automatisch',
+      params: 'KONFIGURATION DER ARGUMENTATION',
+      unsupportedContent2: 'Klicken Sie hier, um die Version zu wechseln.',
+      placeholder: 'W盲hlen Sie ein Werkzeug aus...',
+      uninstalledTitle: 'Tool nicht installiert',
+      toolLabel: 'Werkzeug',
+      uninstalledContent: 'Dieses Plugin wird aus dem lokalen/GitHub-Repository installiert. Bitte nach der Installation verwenden.',
+    },
+    strategyNum: '{{num}} {{Strategie}} IINKLUSIVE',
+    configureApp: 'App konfigurieren',
+    endpointDeleteContent: 'M枚chten Sie {{name}} entfernen?',
+    endpointsEmpty: 'Klicken Sie auf die Schaltfl盲che "+", um einen Endpunkt hinzuzuf眉gen',
+    disabled: 'Arbeitsunf盲hig',
+    endpointsDocLink: 'Dokument anzeigen',
+    endpointDisableTip: 'Endpunkt deaktivieren',
+    endpoints: 'Endpunkte',
+    actionNum: '{{num}} {{Aktion}} IINKLUSIVE',
+    endpointModalTitle: 'Endpunkt einrichten',
+    endpointModalDesc: 'Nach der Konfiguration k枚nnen die Funktionen, die das Plugin 眉ber API-Endpunkte bereitstellt, verwendet werden.',
+    configureTool: 'Werkzeug konfigurieren',
+    endpointsTip: 'Dieses Plugin bietet bestimmte Funktionen 眉ber Endpunkte, und Sie k枚nnen mehrere Endpunkts盲tze f眉r den aktuellen Arbeitsbereich konfigurieren.',
+    modelNum: '{{num}} ENTHALTENE MODELLE',
+    configureModel: 'Modell konfigurieren',
+    endpointDisableContent: 'M枚chten Sie {{name}} deaktivieren?',
+    endpointDeleteTip: 'Endpunkt entfernen',
+    serviceOk: 'Service in Ordnung',
+    switchVersion: 'Version wechseln',
+  },
+  debugInfo: {
+    title: 'Debuggen',
+    viewDocs: 'Dokumente anzeigen',
+  },
+  privilege: {
+    everyone: 'Jeder',
+    title: 'Plugin-Einstellungen',
+    noone: 'Niemand',
+    admins: 'Administratoren',
+    whoCanDebug: 'Wer kann Plugins debuggen?',
+    whoCanInstall: 'Wer kann Plugins installieren und verwalten?',
+  },
+  pluginInfoModal: {
+    repository: 'Aufbewahrungsort',
+    title: 'Plugin-Info',
+    packageName: 'Paket',
+    release: 'Loslassen',
+  },
+  action: {
+    checkForUpdates: 'Nach Updates suchen',
+    pluginInfo: 'Plugin-Info',
+    usedInApps: 'Dieses Plugin wird in {{num}} Apps verwendet.',
+    delete: 'Plugin entfernen',
+    deleteContentRight: 'Plugin?',
+    deleteContentLeft: 'M枚chten Sie',
+  },
+  installModal: {
+    labels: {
+      repository: 'Aufbewahrungsort',
+      package: 'Paket',
+      version: 'Version',
+    },
+    installFailed: 'Installation fehlgeschlagen',
+    installPlugin: 'Plugin installieren',
+    uploadFailed: 'Upload fehlgeschlagen',
+    install: 'Installieren',
+    installComplete: 'Installation abgeschlossen',
+    installing: 'Installation...',
+    installedSuccessfullyDesc: 'Das Plugin wurde erfolgreich installiert.',
+    installedSuccessfully: 'Installation erfolgreich',
+    installFailedDesc: 'Die Installation des Plugins ist fehlgeschlagen.',
+    pluginLoadError: 'Fehler beim Laden des Plugins',
+    close: 'Schlie脽en',
+    pluginLoadErrorDesc: 'Dieses Plugin wird nicht installiert',
+    cancel: 'Abbrechen',
+    back: 'Zur眉ck',
+    uploadingPackage: 'Das Hochladen von {{packageName}}...',
+    readyToInstallPackage: '脺ber die Installation des folgenden Plugins',
+    readyToInstallPackages: '脺ber die Installation der folgenden {{num}} Plugins',
+    fromTrustSource: 'Bitte stellen Sie sicher, dass Sie nur Plugins aus einer <trustSource>vertrauensw眉rdigen Quelle</trustSource> installieren.',
+    readyToInstall: '脺ber die Installation des folgenden Plugins',
+    dropPluginToInstall: 'Legen Sie das Plugin-Paket hier ab, um es zu installieren',
+    next: 'N盲chster',
+  },
+  installFromGitHub: {
+    selectPackagePlaceholder: 'Bitte w盲hlen Sie ein Paket aus',
+    gitHubRepo: 'GitHub-Repository',
+    uploadFailed: 'Upload fehlgeschlagen',
+    selectPackage: 'Paket ausw盲hlen',
+    installFailed: 'Installation fehlgeschlagen',
+    installNote: 'Bitte stellen Sie sicher, dass Sie nur Plugins aus einer vertrauensw眉rdigen Quelle installieren.',
+    selectVersionPlaceholder: 'Bitte w盲hlen Sie eine Version aus',
+    updatePlugin: 'Update-Plugin von GitHub',
+    installPlugin: 'Plugin von GitHub installieren',
+    installedSuccessfully: 'Installation erfolgreich',
+    selectVersion: 'Ausf眉hrung w盲hlen',
+  },
+  upgrade: {
+    usedInApps: 'Wird in {{num}} Apps verwendet',
+    description: '脺ber die Installation des folgenden Plugins',
+    upgrading: 'Installation...',
+    successfulTitle: 'Installation erfolgreich',
+    upgrade: 'Installieren',
+    title: 'Plugin installieren',
+    close: 'Schlie脽en',
+  },
+  error: {
+    inValidGitHubUrl: 'Ung眉ltige GitHub-URL. Bitte geben Sie eine g眉ltige URL im Format ein: https://github.com/owner/repo',
+    noReleasesFound: 'Keine Ver枚ffentlichungen gefunden. Bitte 眉berpr眉fen Sie das GitHub-Repository oder die Eingabe-URL.',
+    fetchReleasesError: 'Freigaben k枚nnen nicht abgerufen werden. Bitte versuchen Sie es sp盲ter erneut.',
+  },
+  marketplace: {
+    sortOption: {
+      newlyReleased: 'Neu ver枚ffentlicht',
+      mostPopular: 'Beliebteste',
+      firstReleased: 'Zuerst ver枚ffentlicht',
+      recentlyUpdated: 'K眉rzlich aktualisiert',
+    },
+    viewMore: 'Mehr anzeigen',
+    sortBy: 'Schwarze Stadt',
+    discover: 'Entdecken',
+    noPluginFound: 'Kein Plugin gefunden',
+    difyMarketplace: 'Dify Marktplatz',
+    moreFrom: 'Mehr aus dem Marketplace',
+    pluginsResult: '{{num}} Ergebnisse',
+    empower: 'Unterst眉tzen Sie Ihre KI-Entwicklung',
+    and: 'und',
+    partnerTip: 'Von einem Dify-Partner verifiziert',
+    verifiedTip: 'Von Dify 眉berpr眉ft',
+  },
+  task: {
+    clearAll: 'Alle l枚schen',
+    installingWithError: 'Installation von {{installingLength}} Plugins, {{successLength}} erfolgreich, {{errorLength}} fehlgeschlagen',
+    installingWithSuccess: 'Installation von {{installingLength}} Plugins, {{successLength}} erfolgreich.',
+    installedError: '{{errorLength}} Plugins konnten nicht installiert werden',
+    installing: 'Installation von {{installingLength}} Plugins, 0 erledigt.',
+    installError: '{{errorLength}} Plugins konnten nicht installiert werden, klicken Sie hier, um sie anzusehen',
+  },
+  allCategories: 'Alle Kategorien',
+  install: '{{num}} Installationen',
+  installAction: 'Installieren',
+  submitPlugin: 'Plugin einreichen',
+  from: 'Von',
+  fromMarketplace: 'Aus dem Marketplace',
+  search: 'Suchen',
+  searchCategories: 'Kategorien durchsuchen',
+  searchPlugins: 'Plugins suchen',
+  endpointsEnabled: '{{num}} Gruppen von Endpunkten aktiviert',
+  searchInMarketplace: 'Suche im Marketplace',
+  searchTools: 'Suchwerkzeuge...',
+  findMoreInMarketplace: 'Weitere Informationen finden Sie im Marketplace',
+  installPlugin: 'Plugin installieren',
+  installFrom: 'INSTALLIEREN VON',
+  metadata: {
+    title: 'Plugins',
+  },
+  difyVersionNotCompatible: 'Die aktuelle Dify-Version ist mit diesem Plugin nicht kompatibel, bitte aktualisieren Sie auf die erforderliche Mindestversion: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/de-DE/register.ts b/i18n/de-DE/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/de-DE/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/de-DE/run-log.ts b/i18n/de-DE/run-log.ts
new file mode 100644
index 0000000..a9617b6
--- /dev/null
+++ b/i18n/de-DE/run-log.ts
@@ -0,0 +1,32 @@
+const translation = {
+  input: 'EINGABE',
+  result: 'ERGEBNIS',
+  detail: 'DETAILS',
+  tracing: 'NACHVERFOLGUNG',
+  resultPanel: {
+    status: 'STATUS',
+    time: 'VERSTRICHENE ZEIT',
+    tokens: 'GESAMTZEICHEN',
+  },
+  meta: {
+    title: 'METADATEN',
+    status: 'Status',
+    version: 'Version',
+    executor: 'Ausf眉hrender',
+    startTime: 'Startzeit',
+    time: 'Verstrichene Zeit',
+    tokens: 'Gesamtzeichen',
+    steps: 'Ausf眉hrungsschritte',
+  },
+  resultEmpty: {
+    title: 'Dieser Lauf gibt nur das JSON-Format aus',
+    tipLeft: 'Bitte gehen Sie zum ',
+    Link: 'Detailpanel',
+    tipRight: 'ansehen.',
+    link: 'Gruppe Detail',
+  },
+  actionLogs: 'Aktionsprotokolle',
+  circularInvocationTip: 'Es gibt einen zirkul盲ren Aufruf von Werkzeugen/Knoten im aktuellen Workflow.',
+}
+
+export default translation
diff --git a/i18n/de-DE/share-app.ts b/i18n/de-DE/share-app.ts
new file mode 100644
index 0000000..462286f
--- /dev/null
+++ b/i18n/de-DE/share-app.ts
@@ -0,0 +1,82 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: 'App ist nicht verf眉gbar',
+    appUnknownError: 'App ist nicht verf眉gbar',
+  },
+  chat: {
+    newChat: 'Neuer Chat',
+    pinnedTitle: 'Angeheftet',
+    unpinnedTitle: 'Chats',
+    newChatDefaultName: 'Neues Gespr盲ch',
+    resetChat: 'Gespr盲ch zur眉cksetzen',
+    poweredBy: 'Bereitgestellt von',
+    prompt: 'Aufforderung',
+    privatePromptConfigTitle: 'Konversationseinstellungen',
+    publicPromptConfigTitle: 'Anf盲ngliche Aufforderung',
+    configStatusDes: 'Vor dem Start k枚nnen Sie die Konversationseinstellungen 盲ndern',
+    configDisabled:
+      'Voreinstellungen der vorherigen Sitzung wurden f眉r diese Sitzung verwendet.',
+    startChat: 'Chat starten',
+    privacyPolicyLeft:
+      'Bitte lesen Sie die ',
+    privacyPolicyMiddle:
+      'Datenschutzrichtlinien',
+    privacyPolicyRight:
+      ', die vom App-Entwickler bereitgestellt wurden.',
+    deleteConversation: {
+      title: 'Konversation l枚schen',
+      content: 'Sind Sie sicher, dass Sie diese Konversation l枚schen m枚chten?',
+    },
+    tryToSolve: 'Versuchen zu l枚sen',
+    temporarySystemIssue: 'Entschuldigung, vor眉bergehendes Systemproblem.',
+    expand: 'Erweitern',
+    collapse: 'Reduzieren',
+    chatSettingsTitle: 'Neues Chat-Setup',
+    newChatTip: 'Bereits in einem neuen Chat',
+    viewChatSettings: 'Chateinstellungen anzeigen',
+    chatFormTip: 'Chat-Einstellungen k枚nnen nach Beginn des Chats nicht mehr ge盲ndert werden.',
+  },
+  generation: {
+    tabs: {
+      create: 'Einmal ausf眉hren',
+      batch: 'Stapelverarbeitung',
+      saved: 'Gespeichert',
+    },
+    savedNoData: {
+      title: 'Sie haben noch kein Ergebnis gespeichert!',
+      description: 'Beginnen Sie mit der Inhaltserstellung und finden Sie hier Ihre gespeicherten Ergebnisse.',
+      startCreateContent: 'Beginnen Sie mit der Inhaltserstellung',
+    },
+    title: 'KI-Vervollst盲ndigung',
+    queryTitle: 'Abfrageinhalt',
+    completionResult: 'Vervollst盲ndigungsergebnis',
+    queryPlaceholder: 'Schreiben Sie Ihren Abfrageinhalt...',
+    run: 'Ausf眉hren',
+    copy: 'Kopieren',
+    resultTitle: 'KI-Vervollst盲ndigung',
+    noData: 'KI wird Ihnen hier geben, was Sie m枚chten.',
+    csvUploadTitle: 'Ziehen Sie Ihre CSV-Datei hierher oder ',
+    browse: 'durchsuchen',
+    csvStructureTitle: 'Die CSV-Datei muss der folgenden Struktur entsprechen:',
+    downloadTemplate: 'Laden Sie die Vorlage hier herunter',
+    field: 'Feld',
+    batchFailed: {
+      info: '{{num}} fehlgeschlagene Ausf眉hrungen',
+      retry: 'Wiederholen',
+      outputPlaceholder: 'Kein Ausgabeanhalt',
+    },
+    errorMsg: {
+      empty: 'Bitte geben Sie Inhalte in die hochgeladene Datei ein.',
+      fileStructNotMatch: 'Die hochgeladene CSV-Datei entspricht nicht der Struktur.',
+      emptyLine: 'Zeile {{rowIndex}} ist leer',
+      invalidLine: 'Zeile {{rowIndex}}: {{varName}} Wert darf nicht leer sein',
+      moreThanMaxLengthLine: 'Zeile {{rowIndex}}: {{varName}} Wert darf nicht mehr als {{maxLength}} Zeichen sein',
+      atLeastOne: 'Bitte geben Sie mindestens eine Zeile in die hochgeladene Datei ein.',
+    },
+    executions: '{{num}} HINRICHTUNGEN',
+    execution: 'AUSF脺HRUNG',
+  },
+}
+
+export default translation
diff --git a/i18n/de-DE/time.ts b/i18n/de-DE/time.ts
new file mode 100644
index 0000000..16f5bc8
--- /dev/null
+++ b/i18n/de-DE/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Sat: 'Sat',
+    Fri: 'Freitag',
+    Thu: 'Donnerstag',
+    Tue: 'Tue',
+    Sun: 'Sonne',
+    Mon: 'Mon',
+    Wed: 'Mittwoch',
+  },
+  months: {
+    August: 'August',
+    March: 'M盲rz',
+    January: 'Januar',
+    June: 'Juni',
+    July: 'Juli',
+    November: 'November',
+    September: 'September',
+    April: 'April',
+    February: 'Februar',
+    May: 'Mai',
+    December: 'Dezember',
+    October: 'Oktober',
+  },
+  operation: {
+    pickDate: 'Datum ausw盲hlen',
+    ok: 'OK',
+    cancel: 'Stornieren',
+    now: 'Jetzt',
+  },
+  title: {
+    pickTime: 'W盲hle Zeit',
+  },
+  defaultPlaceholder: 'W盲hle eine Zeit...',
+}
+
+export default translation
diff --git a/i18n/de-DE/tools.ts b/i18n/de-DE/tools.ts
new file mode 100644
index 0000000..864ddef
--- /dev/null
+++ b/i18n/de-DE/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: 'Werkzeuge',
+  createCustomTool: 'Eigenes Werkzeug erstellen',
+  type: {
+    all: 'Alle',
+    builtIn: 'Integriert',
+    custom: 'Benutzerdefiniert',
+    workflow: 'Arbeitsablauf',
+  },
+  contribute: {
+    line1: 'Ich interessiere mich daf眉r, ',
+    line2: 'Werkzeuge zu Dify beizutragen.',
+    viewGuide: 'Leitfaden anzeigen',
+  },
+  author: 'Von',
+  auth: {
+    unauthorized: 'Zur Autorisierung',
+    authorized: 'Autorisiert',
+    setup: 'Autorisierung einrichten, um zu nutzen',
+    setupModalTitle: 'Autorisierung einrichten',
+    setupModalTitleDescription: 'Nach der Konfiguration der Anmeldeinformationen k枚nnen alle Mitglieder im Arbeitsbereich dieses Werkzeug beim Orchestrieren von Anwendungen nutzen.',
+  },
+  includeToolNum: '{{num}} Werkzeuge inkludiert',
+  addTool: 'Werkzeug hinzuf眉gen',
+  createTool: {
+    title: 'Eigenes Werkzeug erstellen',
+    editAction: 'Konfigurieren',
+    editTitle: 'Eigenes Werkzeug bearbeiten',
+    name: 'Name',
+    toolNamePlaceHolder: 'Geben Sie den Werkzeugnamen ein',
+    schema: 'Schema',
+    schemaPlaceHolder: 'Geben Sie hier Ihr OpenAPI-Schema ein',
+    viewSchemaSpec: 'Die OpenAPI-Swagger-Spezifikation anzeigen',
+    importFromUrl: 'Von URL importieren',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: 'Bitte geben Sie eine g眉ltige URL ein',
+    examples: 'Beispiele',
+    exampleOptions: {
+      json: 'Wetter(JSON)',
+      yaml: 'Pet Store(YAML)',
+      blankTemplate: 'Leere Vorlage',
+    },
+    availableTools: {
+      title: 'Verf眉gbare Werkzeuge',
+      name: 'Name',
+      description: 'Beschreibung',
+      method: 'Methode',
+      path: 'Pfad',
+      action: 'Aktionen',
+      test: 'Test',
+    },
+    authMethod: {
+      title: 'Autorisierungsmethode',
+      type: 'Autorisierungstyp',
+      keyTooltip: 'Http Header Key, Sie k枚nnen es bei "Authorization" belassen, wenn Sie nicht wissen, was es ist, oder auf einen benutzerdefinierten Wert setzen',
+      types: {
+        none: 'Keine',
+        api_key: 'API-Key',
+        apiKeyPlaceholder: 'HTTP-Headername f眉r API-Key',
+        apiValuePlaceholder: 'API-Key eingeben',
+      },
+      key: 'Schl眉ssel',
+      value: 'Wert',
+    },
+    authHeaderPrefix: {
+      title: 'Auth-Typ',
+      types: {
+        basic: 'Basic',
+        bearer: 'Bearer',
+        custom: 'Benutzerdefiniert',
+      },
+    },
+    privacyPolicy: 'Datenschutzrichtlinie',
+    privacyPolicyPlaceholder: 'Bitte Datenschutzrichtlinie eingeben',
+    customDisclaimer: 'Benutzer Haftungsausschluss',
+    customDisclaimerPlaceholder: 'Bitte benutzerdefinierten Haftungsausschluss eingeben',
+    deleteToolConfirmTitle: 'L枚schen Sie dieses Werkzeug?',
+    deleteToolConfirmContent: 'Das L枚schen des Werkzeugs ist irreversibel. Benutzer k枚nnen Ihr Werkzeug nicht mehr verwenden.',
+    toolInput: {
+      description: 'Beschreibung',
+      methodParameterTip: 'LLM-F眉llungen w盲hrend der Inferenz',
+      method: 'Methode',
+      methodParameter: 'Parameter',
+      label: 'Schilder',
+      required: 'Erforderlich',
+      methodSetting: 'Einstellung',
+      name: 'Name',
+      title: 'Werkzeug-Eingabe',
+      methodSettingTip: 'Der Benutzer f眉llt die Werkzeugkonfiguration aus',
+      descriptionPlaceholder: 'Beschreibung der Bedeutung des Parameters',
+      labelPlaceholder: 'Tags ausw盲hlen(optional)',
+    },
+    description: 'Beschreibung',
+    confirmTip: 'Apps, die dieses Tool verwenden, sind davon betroffen',
+    nameForToolCallTip: 'Unterst眉tzt nur Zahlen, Buchstaben und Unterstriche.',
+    nameForToolCall: 'Name des Werkzeugaufrufs',
+    confirmTitle: 'Best盲tigen, um zu speichern?',
+    nameForToolCallPlaceHolder: 'Wird f眉r die Maschinenerkennung verwendet, z. B. getCurrentWeather, list_pets',
+    descriptionPlaceholder: 'Kurze Beschreibung des Zwecks des Werkzeugs, z. B. um die Temperatur f眉r einen bestimmten Ort zu ermitteln.',
+  },
+  test: {
+    title: 'Test',
+    parametersValue: 'Parameter & Wert',
+    parameters: 'Parameter',
+    value: 'Wert',
+    testResult: 'Testergebnisse',
+    testResultPlaceholder: 'Testergebnis wird hier angezeigt',
+  },
+  thought: {
+    using: 'Nutzung',
+    used: 'Genutzt',
+    requestTitle: 'Anfrage an',
+    responseTitle: 'Antwort von',
+  },
+  setBuiltInTools: {
+    info: 'Info',
+    setting: 'Einstellung',
+    toolDescription: 'Werkzeugbeschreibung',
+    parameters: 'Parameter',
+    string: 'Zeichenkette',
+    number: 'Nummer',
+    required: 'Erforderlich',
+    infoAndSetting: 'Info & Einstellungen',
+    file: 'Datei',
+  },
+  noCustomTool: {
+    title: 'Keine benutzerdefinierten Werkzeuge!',
+    content: 'F眉gen Sie hier Ihre benutzerdefinierten Werkzeuge hinzu und verwalten Sie sie, um KI-Apps zu erstellen.',
+    createTool: 'Werkzeug erstellen',
+  },
+  noSearchRes: {
+    title: 'Leider keine Ergebnisse!',
+    content: 'Wir konnten keine Werkzeuge finden, die Ihrer Suche entsprechen.',
+    reset: 'Suche zur眉cksetzen',
+  },
+  builtInPromptTitle: 'Aufforderung',
+  toolRemoved: 'Werkzeug entfernt',
+  notAuthorized: 'Werkzeug nicht autorisiert',
+  howToGet: 'Wie erh盲lt man',
+  addToolModal: {
+    added: 'zugef眉gt',
+    manageInTools: 'Verwalten in Tools',
+    add: 'hinzuf眉gen',
+    category: 'Kategorie',
+    emptyTitle: 'Kein Workflow-Tool verf眉gbar',
+    type: 'Art',
+    emptyTip: 'Gehen Sie zu "Workflow -> Als Tool ver枚ffentlichen"',
+    emptyTitleCustom: 'Kein benutzerdefiniertes Tool verf眉gbar',
+    emptyTipCustom: 'Erstellen eines benutzerdefinierten Werkzeugs',
+  },
+  toolNameUsageTip: 'Name des Tool-Aufrufs f眉r die Argumentation und Aufforderung des Agenten',
+  customToolTip: 'Erfahren Sie mehr 眉ber benutzerdefinierte Dify-Tools',
+  openInStudio: 'In Studio 枚ffnen',
+  noTools: 'Keine Werkzeuge gefunden',
+  copyToolName: 'Name kopieren',
+}
+
+export default translation
diff --git a/i18n/de-DE/workflow.ts b/i18n/de-DE/workflow.ts
new file mode 100644
index 0000000..e229506
--- /dev/null
+++ b/i18n/de-DE/workflow.ts
@@ -0,0 +1,921 @@
+const translation = {
+  common: {
+    undo: 'R眉ckg盲ngig',
+    redo: 'Wiederholen',
+    editing: 'Bearbeitung',
+    autoSaved: 'Automatisch gespeichert',
+    unpublished: 'Unver枚ffentlicht',
+    published: 'Ver枚ffentlicht',
+    publish: 'Ver枚ffentlichen',
+    update: 'Aktualisieren',
+    run: 'Ausf眉hren',
+    running: 'Wird ausgef眉hrt',
+    inRunMode: 'Im Ausf眉hrungsmodus',
+    inPreview: 'In der Vorschau',
+    inPreviewMode: 'Im Vorschaumodus',
+    preview: 'Vorschau',
+    viewRunHistory: 'Ausf眉hrungsverlauf anzeigen',
+    runHistory: 'Ausf眉hrungsverlauf',
+    goBackToEdit: 'Zur眉ck zum Editor',
+    conversationLog: 'Konversationsprotokoll',
+    features: 'Funktionen',
+    debugAndPreview: 'Vorschau',
+    restart: 'Neustarten',
+    currentDraft: 'Aktueller Entwurf',
+    currentDraftUnpublished: 'Aktueller Entwurf unver枚ffentlicht',
+    latestPublished: 'Zuletzt ver枚ffentlicht',
+    publishedAt: 'Ver枚ffentlicht am',
+    restore: 'Wiederherstellen',
+    runApp: 'App ausf眉hren',
+    batchRunApp: 'App im Batch-Modus ausf眉hren',
+    accessAPIReference: 'API-Referenz aufrufen',
+    embedIntoSite: 'In die Webseite einbetten',
+    addTitle: 'Titel hinzuf眉gen...',
+    addDescription: 'Beschreibung hinzuf眉gen...',
+    noVar: 'Keine Variable',
+    searchVar: 'Variable suchen',
+    variableNamePlaceholder: 'Variablenname',
+    setVarValuePlaceholder: 'Variable setzen',
+    needConnectTip: 'Dieser Schritt ist mit nichts verbunden',
+    maxTreeDepth: 'Maximales Limit von {{depth}} Knoten pro Ast',
+    needEndNode: 'Der Endblock muss hinzugef眉gt werden',
+    needAnswerNode: 'Der Antwortblock muss hinzugef眉gt werden',
+    workflowProcess: 'Arbeitsablauf',
+    notRunning: 'Noch nicht ausgef眉hrt',
+    previewPlaceholder: 'Geben Sie den Inhalt in das Feld unten ein, um das Debuggen des Chatbots zu starten',
+    effectVarConfirm: {
+      title: 'Variable entfernen',
+      content: 'Die Variable wird in anderen Knoten verwendet. M枚chten Sie sie trotzdem entfernen?',
+    },
+    insertVarTip: 'Dr眉cken Sie die Taste \'/\' zum schnellen Einf眉gen',
+    processData: 'Daten verarbeiten',
+    input: 'Eingabe',
+    output: 'Ausgabe',
+    jinjaEditorPlaceholder: 'Tippen Sie \'/\' oder \'{\' um eine Variable einzuf眉gen',
+    viewOnly: 'Nur anzeigen',
+    showRunHistory: 'Ausf眉hrungsverlauf anzeigen',
+    enableJinja: 'Jinja-Vorlagenunterst眉tzung aktivieren',
+    learnMore: 'Mehr erfahren',
+    copy: 'Kopieren',
+    duplicate: 'Duplizieren',
+    addBlock: 'Block hinzuf眉gen',
+    pasteHere: 'Hier einf眉gen',
+    pointerMode: 'Zeigermodus',
+    handMode: 'Handmodus',
+    model: 'Modell',
+    workflowAsTool: 'Workflow als Tool',
+    configureRequired: 'Konfiguration erforderlich',
+    configure: 'Konfigurieren',
+    manageInTools: 'In den Tools verwalten',
+    workflowAsToolTip: 'Nach dem Workflow-Update ist eine Neukonfiguration des Tools erforderlich.',
+    viewDetailInTracingPanel: 'Details anzeigen',
+    importDSL: 'DSL importieren',
+    importFailure: 'Fehler beim Import',
+    syncingData: 'Synchronisieren von Daten, nur wenige Sekunden.',
+    chooseDSL: 'W盲hlen Sie eine DSL(yml)-Datei',
+    importSuccess: 'Erfolg beim Import',
+    importDSLTip: 'Der aktuelle Entwurf wird 眉berschrieben. Exportieren Sie den Workflow vor dem Import als Backup.',
+    overwriteAndImport: '脺berschreiben und Importieren',
+    backupCurrentDraft: 'Aktuellen Entwurf sichern',
+    parallelTip: {
+      click: {
+        title: 'Klicken',
+        desc: 'hinzuzuf眉gen',
+      },
+      drag: {
+        title: 'Ziehen',
+        desc: 'um eine Verbindung herzustellen',
+      },
+      limit: 'Die Parallelit盲t ist auf {{num}} Zweige beschr盲nkt.',
+      depthLimit: 'Begrenzung der parallelen Verschachtelungsschicht von {{num}} Schichten',
+    },
+    parallelRun: 'Paralleler Lauf',
+    disconnect: 'Trennen',
+    jumpToNode: 'Zu diesem Knoten springen',
+    addParallelNode: 'Parallelen Knoten hinzuf眉gen',
+    parallel: 'PARALLEL',
+    branch: 'ZWEIG',
+    featuresDocLink: 'Weitere Informationen',
+    ImageUploadLegacyTip: 'Sie k枚nnen jetzt Dateitypvariablen im Startformular erstellen. Wir werden die Funktion zum Hochladen von Bildern in Zukunft nicht mehr unterst眉tzen.',
+    fileUploadTip: 'Die Funktionen zum Hochladen von Bildern wurden auf das Hochladen von Dateien aktualisiert.',
+    featuresDescription: 'Verbessern Sie die Benutzererfahrung von Web-Apps',
+    importWarning: 'Vorsicht',
+    importWarningDetails: 'Der Unterschied zwischen den DSL-Versionen kann sich auf bestimmte Funktionen auswirken',
+    openInExplore: 'In Explore 枚ffnen',
+    onFailure: 'Bei Ausfall',
+    addFailureBranch: 'Fail-Branch hinzuf眉gen',
+    loadMore: 'Weitere Workflows laden',
+    noHistory: 'Keine Geschichte',
+    exportSVG: 'Als SVG exportieren',
+    noExist: 'Keine solche Variable',
+    versionHistory: 'Versionsverlauf',
+    publishUpdate: 'Update ver枚ffentlichen',
+    referenceVar: 'Referenzvariable',
+    exportImage: 'Bild exportieren',
+    exportJPEG: 'Als JPEG exportieren',
+    exitVersions: 'Ausgangsversionen',
+    exportPNG: 'Als PNG exportieren',
+  },
+  env: {
+    envPanelTitle: 'Umgebungsvariablen',
+    envDescription: 'Umgebungsvariablen k枚nnen zur Speicherung privater Informationen und Anmeldedaten verwendet werden. Sie sind schreibgesch眉tzt und k枚nnen beim Export vom DSL-File getrennt werden.',
+    envPanelButton: 'Variable hinzuf眉gen',
+    modal: {
+      title: 'Umgebungsvariable hinzuf眉gen',
+      editTitle: 'Umgebungsvariable bearbeiten',
+      type: 'Typ',
+      name: 'Name',
+      namePlaceholder: 'Umgebungsname',
+      value: 'Wert',
+      valuePlaceholder: 'Umgebungswert',
+      secretTip: 'Wird verwendet, um sensible Informationen oder Daten zu definieren, wobei DSL-Einstellungen zur Verhinderung von Lecks konfiguriert sind.',
+    },
+    export: {
+      title: 'Geheime Umgebungsvariablen exportieren?',
+      checkbox: 'Geheime Werte exportieren',
+      ignore: 'DSL exportieren',
+      export: 'DSL mit geheimen Werten exportieren',
+    },
+  },
+  chatVariable: {
+    panelTitle: 'Gespr盲chsvariablen',
+    panelDescription: 'Gespr盲chsvariablen werden verwendet, um interaktive Informationen zu speichern, die das LLM ben枚tigt, einschlie脽lich Gespr盲chsverlauf, hochgeladene Dateien und Benutzereinstellungen. Sie sind les- und schreibbar.',
+    docLink: 'Besuchen Sie unsere Dokumentation f眉r weitere Informationen.',
+    button: 'Variable hinzuf眉gen',
+    modal: {
+      title: 'Gespr盲chsvariable hinzuf眉gen',
+      editTitle: 'Gespr盲chsvariable bearbeiten',
+      name: 'Name',
+      namePlaceholder: 'Variablenname',
+      type: 'Typ',
+      value: 'Standardwert',
+      valuePlaceholder: 'Standardwert, leer lassen f眉r keine Festlegung',
+      description: 'Beschreibung',
+      descriptionPlaceholder: 'Beschreiben Sie die Variable',
+      editInJSON: 'In JSON bearbeiten',
+      oneByOne: 'Einzeln hinzuf眉gen',
+      editInForm: 'Im Formular bearbeiten',
+      arrayValue: 'Wert',
+      addArrayValue: 'Wert hinzuf眉gen',
+      objectKey: 'Schl眉ssel',
+      objectType: 'Typ',
+      objectValue: 'Standardwert',
+    },
+    storedContent: 'Gespeicherter Inhalt',
+    updatedAt: 'Aktualisiert am ',
+  },
+  changeHistory: {
+    title: '脛nderungsverlauf',
+    placeholder: 'Du hast noch nichts ge盲ndert',
+    clearHistory: '脛nderungsverlauf l枚schen',
+    hint: 'Hinweis',
+    hintText: '脛nderungen werden im 脛nderungsverlauf aufgezeichnet, der f眉r die Dauer dieser Sitzung auf Ihrem Ger盲t gespeichert wird. Dieser Verlauf wird gel枚scht, wenn Sie den Editor verlassen.',
+    stepBackward_one: '{{count}} Schritt zur眉ck',
+    stepBackward_other: '{{count}} Schritte zur眉ck',
+    stepForward_one: '{{count}} Schritt vorw盲rts',
+    stepForward_other: '{{count}} Schritte vorw盲rts',
+    sessionStart: 'Sitzungsstart',
+    currentState: 'Aktueller Zustand',
+    nodeTitleChange: 'Blocktitel ge盲ndert',
+    nodeDescriptionChange: 'Blockbeschreibung ge盲ndert',
+    nodeDragStop: 'Block verschoben',
+    nodeChange: 'Block ge盲ndert',
+    nodeConnect: 'Block verbunden',
+    nodePaste: 'Block eingef眉gt',
+    nodeDelete: 'Block gel枚scht',
+    nodeAdd: 'Block hinzugef眉gt',
+    nodeResize: 'Blockgr枚脽e ge盲ndert',
+    noteAdd: 'Notiz hinzugef眉gt',
+    noteChange: 'Notiz ge盲ndert',
+    noteDelete: 'Notiz gel枚scht',
+    edgeDelete: 'Block getrennt',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} ist erforderlich',
+    authRequired: 'Autorisierung ist erforderlich',
+    invalidJson: '{{field}} ist ein ung眉ltiges JSON',
+    fields: {
+      variable: 'Variablenname',
+      variableValue: 'Variablenwert',
+      code: 'Code',
+      model: 'Modell',
+      rerankModel: 'Neusortierungsmodell',
+      visionVariable: 'Vision variabel',
+    },
+    invalidVariable: 'Ung眉ltige Variable',
+    rerankModelRequired: 'Bevor Sie das Rerank-Modell aktivieren, best盲tigen Sie bitte, dass das Modell in den Einstellungen erfolgreich konfiguriert wurde.',
+    toolParameterRequired: '{{field}}: Parameter [{{param}}] ist erforderlich',
+    noValidTool: '{{field}} kein g眉ltiges Werkzeug ausgew盲hlt',
+  },
+  singleRun: {
+    testRun: 'Testlauf ',
+    startRun: 'Lauf starten',
+    running: 'Wird ausgef眉hrt',
+    testRunIteration: 'Testlaufiteration',
+    back: 'Zur眉ck',
+    iteration: 'Iteration',
+    loop: 'Schleife',
+  },
+  tabs: {
+    'searchBlock': 'Block suchen',
+    'blocks': 'Bl枚cke',
+    'tools': 'Werkzeuge',
+    'allTool': 'Alle',
+    'builtInTool': 'Eingebaut',
+    'customTool': 'Benutzerdefiniert',
+    'workflowTool': 'Arbeitsablauf',
+    'question-understand': 'Fragen verstehen',
+    'logic': 'Logik',
+    'transform': 'Transformieren',
+    'utilities': 'Dienstprogramme',
+    'noResult': 'Kein Ergebnis gefunden',
+    'searchTool': 'Suchwerkzeug',
+    'plugin': 'Stecker',
+    'agent': 'Agenten-Strategie',
+  },
+  blocks: {
+    'start': 'Start',
+    'end': 'Ende',
+    'answer': 'Antwort',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'Wissensabruf',
+    'question-classifier': 'Fragenklassifizierer',
+    'if-else': 'WENN/SONST',
+    'code': 'Code',
+    'template-transform': 'Vorlage',
+    'http-request': 'HTTP-Anfrage',
+    'variable-assigner': 'Variablen-Zuweiser',
+    'variable-aggregator': 'Variablen-Aggregator',
+    'assigner': 'Variablenzuweiser',
+    'iteration-start': 'Iterationsstart',
+    'iteration': 'Iteration',
+    'parameter-extractor': 'Parameter-Extraktor',
+    'list-operator': 'List-Operator',
+    'document-extractor': 'Doc Extraktor',
+    'agent': 'Agent',
+    'loop': 'Schleife',
+    'loop-start': 'Schleifenbeginn',
+    'loop-end': 'Schleife beenden',
+  },
+  blocksAbout: {
+    'start': 'Definieren Sie die Anfangsparameter zum Starten eines Workflows',
+    'end': 'Definieren Sie das Ende und den Ergebnistyp eines Workflows',
+    'answer': 'Definieren Sie den Antwortinhalt einer Chat-Konversation',
+    'llm': 'Gro脽e Sprachmodelle aufrufen, um Fragen zu beantworten oder nat眉rliche Sprache zu verarbeiten',
+    'knowledge-retrieval': 'Erm枚glicht das Abfragen von Textinhalten, die sich auf Benutzerfragen aus der Wissensdatenbank beziehen',
+    'question-classifier': 'Definieren Sie die Klassifizierungsbedingungen von Benutzerfragen, LLM kann basierend auf der Klassifikationsbeschreibung festlegen, wie die Konversation fortschreitet',
+    'if-else': 'Erm枚glicht das Aufteilen des Workflows in zwei Zweige basierend auf if/else-Bedingungen',
+    'code': 'Ein St眉ck Python- oder NodeJS-Code ausf眉hren, um benutzerdefinierte Logik zu implementieren',
+    'template-transform': 'Daten in Zeichenfolgen mit Jinja-Vorlagensyntax umwandeln',
+    'http-request': 'Erm枚glichen, dass Serveranforderungen 眉ber das HTTP-Protokoll gesendet werden',
+    'variable-assigner': 'Variablen aus mehreren Zweigen in eine einzige Variable zusammenf眉hren, um eine einheitliche Konfiguration der nachgelagerten Knoten zu erm枚glichen.',
+    'assigner': 'Der Variablenzuweisungsknoten wird verwendet, um beschreibbaren Variablen (wie Gespr盲chsvariablen) Werte zuzuweisen.',
+    'variable-aggregator': 'Variablen aus mehreren Zweigen in eine einzige Variable zusammenf眉hren, um eine einheitliche Konfiguration der nachgelagerten Knoten zu erm枚glichen.',
+    'iteration': 'Mehrere Schritte an einem Listenobjekt ausf眉hren, bis alle Ergebnisse ausgegeben wurden.',
+    'parameter-extractor': 'Verwenden Sie LLM, um strukturierte Parameter aus nat眉rlicher Sprache f眉r Werkzeugaufrufe oder HTTP-Anfragen zu extrahieren.',
+    'list-operator': 'Wird verwendet, um Array-Inhalte zu filtern oder zu sortieren.',
+    'document-extractor': 'Wird verwendet, um hochgeladene Dokumente in Textinhalte zu analysieren, die f眉r LLM leicht verst盲ndlich sind.',
+    'agent': 'Aufruf gro脽er Sprachmodelle zur Beantwortung von Fragen oder zur Verarbeitung nat眉rlicher Sprache',
+    'loop': 'F眉hren Sie eine Schleife aus, bis die Abschlussbedingungen erf眉llt sind oder die maximalen Schleifenanzahl erreicht ist.',
+    'loop-end': 'Entspricht "break". Dieser Knoten hat keine Konfigurationselemente. Wenn der Schleifenrumpf diesen Knoten erreicht, wird die Schleife beendet.',
+  },
+  operator: {
+    zoomIn: 'Vergr枚脽ern',
+    zoomOut: 'Verkleinern',
+    zoomTo50: 'Auf 50% vergr枚脽ern',
+    zoomTo100: 'Auf 100% vergr枚脽ern',
+    zoomToFit: 'An Bildschirm anpassen',
+  },
+  panel: {
+    userInputField: 'Benutzereingabefeld',
+    changeBlock: 'Block 盲ndern',
+    helpLink: 'Hilfelink',
+    about: '脺ber',
+    createdBy: 'Erstellt von ',
+    nextStep: 'N盲chster Schritt',
+    addNextStep: 'F眉gen Sie den n盲chsten Block in diesem Workflow hinzu',
+    selectNextStep: 'N盲chsten Block ausw盲hlen',
+    runThisStep: 'Diesen Schritt ausf眉hren',
+    checklist: 'Checkliste',
+    checklistTip: 'Stellen Sie sicher, dass alle Probleme vor der Ver枚ffentlichung gel枚st sind',
+    checklistResolved: 'Alle Probleme wurden gel枚st',
+    organizeBlocks: 'Bl枚cke organisieren',
+    change: '脛ndern',
+    optional: '(optional)',
+  },
+  nodes: {
+    common: {
+      outputVars: 'Ausgabevariablen',
+      insertVarTip: 'Variable einf眉gen',
+      memory: {
+        memory: 'Speicher',
+        memoryTip: 'Einstellungen des Chat-Speichers',
+        windowSize: 'Fenstergr枚脽e',
+        conversationRoleName: 'Rollenname in der Konversation',
+        user: 'Benutzer-Pr盲fix',
+        assistant: 'Assistenten-Pr盲fix',
+      },
+      memories: {
+        title: 'Erinnerungen',
+        tip: 'Chat-Speicher',
+        builtIn: 'Eingebaut',
+      },
+      errorHandle: {
+        none: {
+          title: 'Nichts',
+          desc: 'Der Knoten wird nicht mehr ausgef眉hrt, wenn eine Ausnahme auftritt und nicht behandelt wird',
+        },
+        defaultValue: {
+          title: 'Standardwert',
+          desc: 'Wenn ein Fehler auftritt, geben Sie einen statischen Ausgabeinhalt an.',
+          tip: 'Bei einem Fehler wird der untere Wert zur眉ckgegeben.',
+          inLog: 'Knotenausnahme, Ausgabe nach Vorschlagswerten.',
+          output: 'Standardwert f眉r die Ausgabe',
+        },
+        failBranch: {
+          title: 'Fehlgeschlagener Zweig',
+          desc: 'Wenn ein Fehler auftritt, wird der Ausnahmezweig ausgef眉hrt',
+          customize: 'Wechseln Sie zur Arbeitsfl盲che, um die Fehlerverzweigungslogik anzupassen.',
+          customizeTip: 'Wenn der Fail-Zweig aktiviert ist, wird der Prozess durch Ausnahmen, die von Knoten ausgel枚st werden, nicht beendet. Stattdessen wird automatisch der vordefinierte Fehlerzweig ausgef眉hrt, sodass Sie flexibel Fehlermeldungen, Berichte, Korrekturen oder 脺berspringen von Aktionen bereitstellen k枚nnen.',
+          inLog: 'Knotenausnahme, f眉hrt den Fail-Zweig automatisch aus. Die Knotenausgabe gibt einen Fehlertyp und eine Fehlermeldung zur眉ck und 眉bergibt sie an den Downstream.',
+        },
+        partialSucceeded: {
+          tip: 'Es gibt {{num}} Knoten im Prozess, die nicht normal laufen, bitte gehen Sie zur Ablaufverfolgung, um die Protokolle zu 眉berpr眉fen.',
+        },
+        title: 'Fehlerbehandlung',
+        tip: 'Ausnahmebehandlungsstrategie, die ausgel枚st wird, wenn ein Knoten auf eine Ausnahme st枚脽t.',
+      },
+      retry: {
+        retry: 'Wiederholen',
+        retryOnFailure: 'Wiederholen bei Fehler',
+        maxRetries: 'Max. Wiederholungen',
+        retryInterval: 'Wiederholungsintervall',
+        retryTimes: 'Wiederholen Sie {{times}} mal bei einem Fehler',
+        retrying: 'Wiederholung...',
+        retrySuccessful: 'Wiederholen erfolgreich',
+        retryFailed: 'Wiederholung fehlgeschlagen',
+        retryFailedTimes: '{{times}} fehlgeschlagene Wiederholungen',
+        times: 'mal',
+        ms: 'Frau',
+        retries: '{{num}} Wiederholungen',
+      },
+    },
+    start: {
+      required: 'erforderlich',
+      inputField: 'Eingabefeld',
+      builtInVar: 'Eingebaute Variablen',
+      outputVars: {
+        query: 'Benutzereingabe',
+        memories: {
+          des: 'Konversationsverlauf',
+          type: 'Nachrichtentyp',
+          content: 'Nachrichteninhalt',
+        },
+        files: 'Dateiliste',
+      },
+      noVarTip: 'Legen Sie Eingaben fest, die im Workflow verwendet werden k枚nnen',
+    },
+    end: {
+      outputs: 'Ausgaben',
+      output: {
+        type: 'Ausgabetyp',
+        variable: 'Ausgabevariable',
+      },
+      type: {
+        'none': 'Keine',
+        'plain-text': 'Klartext',
+        'structured': 'Strukturiert',
+      },
+    },
+    answer: {
+      answer: 'Antwort',
+      outputVars: 'Ausgabevariablen',
+    },
+    llm: {
+      model: 'Modell',
+      variables: 'Variablen',
+      context: 'Kontext',
+      contextTooltip: 'Sie k枚nnen Wissen als Kontext importieren',
+      notSetContextInPromptTip: 'Um die Kontextfunktion zu aktivieren, f眉llen Sie die Kontextvariable im PROMPT aus.',
+      prompt: 'Prompt',
+      roleDescription: {
+        system: 'Geben Sie hochrangige Anweisungen f眉r die Konversation',
+        user: 'Geben Sie dem Modell Anweisungen, Abfragen oder beliebigen texteingabebasierten Input',
+        assistant: 'Die Antworten des Modells basierend auf den Benutzernachrichten',
+      },
+      addMessage: 'Nachricht hinzuf眉gen',
+      vision: 'Vision',
+      files: 'Dateien',
+      resolution: {
+        name: 'Aufl枚sung',
+        high: 'Hoch',
+        low: 'Niedrig',
+      },
+      outputVars: {
+        output: 'Generierter Inhalt',
+        usage: 'Nutzungsinformationen des Modells',
+      },
+      singleRun: {
+        variable: 'Variable',
+      },
+      sysQueryInUser: 'sys.query in Benutzernachricht erforderlich',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: 'Bitte beenden Sie die Bearbeitung des aktuellen Feldes, bevor Sie das Schema speichern.',
+        },
+        stringValidations: 'Stringvalidierungen',
+        addField: 'Feld hinzuf眉gen',
+        generateJsonSchema: 'JSON-Schema generieren',
+        back: 'Zur眉ck',
+        addChildField: 'Kindfeld hinzuf眉gen',
+        generationTip: 'Sie k枚nnen nat眉rliche Sprache verwenden, um schnell ein JSON-Schema zu erstellen.',
+        title: 'Strukturiertes Ausgabeschema',
+        resetDefaults: 'Zur眉cksetzen',
+        showAdvancedOptions: 'Erweiterte Optionen anzeigen',
+        fieldNamePlaceholder: 'Feldname',
+        descriptionPlaceholder: 'F眉gen Sie eine Beschreibung hinzu.',
+        resultTip: 'Hier ist das generierte Ergebnis. Wenn Sie nicht zufrieden sind, k枚nnen Sie zur眉ckgehen und Ihre Eingabeaufforderung 盲ndern.',
+        generatedResult: 'Generiertes Ergebnis',
+        promptTooltip: 'Konvertiere die Textbeschreibung in eine standardisierte JSON-Schema-Struktur.',
+        promptPlaceholder: 'Beschreibe dein JSON-Schema...',
+        doc: 'Erfahren Sie mehr 眉ber strukturierten Output.',
+        required: 'erforderlich',
+        generate: 'Generieren',
+        apply: 'Bewerben',
+        import: 'Import aus JSON',
+        generating: 'Generiere JSON-Schema...',
+        instruction: 'Anleitung',
+        regenerate: 'Regenerieren',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'Abfragevariable',
+      knowledge: 'Wissen',
+      outputVars: {
+        output: 'Abgerufene segmentierte Daten',
+        content: 'Segmentierter Inhalt',
+        title: 'Segmentierter Titel',
+        icon: 'Segmentiertes Symbol',
+        url: 'Segmentierte URL',
+        metadata: 'Weitere Metadaten',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            title: 'Deaktiviert',
+            subTitle: 'Keine Aktivierung der Metadatfilterung',
+          },
+          automatic: {
+            desc: 'Automatisch Filterbedingungen f眉r Metadaten basierend auf Abfragevariablen generieren.',
+            title: 'Automatisch',
+            subTitle: 'Automatisch Metadatenfilterbedingungen basierend auf der Benutzeranfrage generieren',
+          },
+          manual: {
+            title: 'Handbuch',
+            subTitle: 'Manuell Filterbedingungen f眉r Metadaten hinzuf眉gen',
+          },
+        },
+        panel: {
+          placeholder: 'Wert eingeben',
+          datePlaceholder: 'W盲hlen Sie eine Zeit...',
+          add: 'Bedingung hinzuf眉gen',
+          title: 'Metadatenfilterbedingungen',
+          select: 'W盲hlen Sie eine Variable aus...',
+          conditions: 'Bedingungen',
+          search: 'Suchmetadaten',
+        },
+        title: 'Metadatenfilterung',
+      },
+    },
+    http: {
+      inputVars: 'Eingabevariablen',
+      api: 'API',
+      apiPlaceholder: 'Geben Sie die URL ein, tippen Sie 鈥�/鈥�, um Variable einzuf眉gen',
+      notStartWithHttp: 'API sollte mit http:// oder https:// beginnen',
+      key: 'Schl眉ssel',
+      value: 'Wert',
+      bulkEdit: 'Massenerfassung',
+      keyValueEdit: 'Schl眉ssel-Wert-Erfassung',
+      headers: 'Header',
+      params: 'Parameter',
+      body: 'Body',
+      outputVars: {
+        body: 'Antwortinhalt',
+        statusCode: 'Antwortstatuscode',
+        headers: 'Antwort-Header-Liste im JSON-Format',
+        files: 'Dateiliste',
+      },
+      authorization: {
+        'authorization': 'Autorisierung',
+        'authorizationType': 'Autorisierungstyp',
+        'no-auth': 'Keine',
+        'api-key': 'API-Schl眉ssel',
+        'auth-type': 'Autorisierungstyp',
+        'basic': 'Basis',
+        'bearer': 'Bearer',
+        'custom': 'Benutzerdefiniert',
+        'api-key-title': 'API-Schl眉ssel',
+        'header': 'Header',
+      },
+      insertVarPlaceholder: 'tippen Sie 鈥�/鈥�, um Variable einzuf眉gen',
+      timeout: {
+        title: 'Zeit眉berschreitung',
+        connectLabel: 'Verbindungs-Zeit眉berschreitung',
+        connectPlaceholder: 'Geben Sie die Verbindungs-Zeit眉berschreitung in Sekunden ein',
+        readLabel: 'Lese-Zeit眉berschreitung',
+        readPlaceholder: 'Geben Sie die Lese-Zeit眉berschreitung in Sekunden ein',
+        writeLabel: 'Schreib-Zeit眉berschreitung',
+        writePlaceholder: 'Geben Sie die Schreib-Zeit眉berschreitung in Sekunden ein',
+      },
+      type: 'Art',
+      binaryFileVariable: 'Variable der Bin盲rdatei',
+      extractListPlaceholder: 'Geben Sie den Index des Listeneintrags ein, geben Sie \'/\' ein, f眉gen Sie die Variable ein',
+      curl: {
+        title: 'Importieren von cURL',
+        placeholder: 'F眉gen Sie hier die cURL-Zeichenfolge ein',
+      },
+    },
+    code: {
+      inputVars: 'Eingabevariablen',
+      outputVars: 'Ausgabevariablen',
+      advancedDependencies: 'Erweiterte Abh盲ngigkeiten',
+      advancedDependenciesTip: 'F眉gen Sie hier einige vorinstallierte Abh盲ngigkeiten hinzu, die mehr Zeit in Anspruch nehmen oder nicht standardm盲脽ig eingebaut sind',
+      searchDependencies: 'Abh盲ngigkeiten suchen',
+    },
+    templateTransform: {
+      inputVars: 'Eingabevariablen',
+      code: 'Code',
+      codeSupportTip: 'Unterst眉tzt nur Jinja2',
+      outputVars: {
+        output: 'Transformierter Inhalt',
+      },
+    },
+    ifElse: {
+      if: 'Wenn',
+      else: 'Sonst',
+      elseDescription: 'Wird verwendet, um die Logik zu definieren, die ausgef眉hrt werden soll, wenn die if-Bedingung nicht erf眉llt ist.',
+      and: 'und',
+      or: 'oder',
+      operator: 'Operator',
+      notSetVariable: 'Bitte setzen Sie zuerst die Variable',
+      comparisonOperator: {
+        'contains': 'enth盲lt',
+        'not contains': 'enth盲lt nicht',
+        'start with': 'beginnt mit',
+        'end with': 'endet mit',
+        'is': 'ist',
+        'is not': 'ist nicht',
+        'empty': 'ist leer',
+        'not empty': 'ist nicht leer',
+        'null': 'ist null',
+        'not null': 'ist nicht null',
+        'regex match': 'Regex-脺bereinstimmung',
+        'not exists': 'existiert nicht',
+        'in': 'in',
+        'all of': 'alle',
+        'exists': 'existiert',
+        'not in': 'nicht in',
+        'after': 'nach',
+        'before': 'vor',
+      },
+      enterValue: 'Wert eingeben',
+      addCondition: 'Bedingung hinzuf眉gen',
+      conditionNotSetup: 'Bedingung NICHT eingerichtet',
+      selectVariable: 'Variable ausw盲hlen...',
+      optionName: {
+        video: 'Video',
+        url: 'URL (Englisch)',
+        image: 'Bild',
+        localUpload: 'Lokaler Upload',
+        audio: 'Audio',
+        doc: 'Doktor',
+      },
+      select: 'Ausw盲hlen',
+      addSubVariable: 'Untervariable',
+      condition: 'Bedingung',
+    },
+    variableAssigner: {
+      title: 'Variablen zuweisen',
+      outputType: 'Ausgabetyp',
+      varNotSet: 'Variable nicht gesetzt',
+      noVarTip: 'F眉gen Sie die zuzuweisenden Variablen hinzu',
+      type: {
+        string: 'String',
+        number: 'Nummer',
+        object: 'Objekt',
+        array: 'Array',
+      },
+      aggregationGroup: 'Aggregationsgruppe',
+      aggregationGroupTip: 'Durch Aktivieren dieser Funktion kann der Variablen-Aggregator mehrere Variablens盲tze aggregieren.',
+      addGroup: 'Gruppe hinzuf眉gen',
+      outputVars: {
+        varDescribe: 'Ausgabe {{groupName}}',
+      },
+      setAssignVariable: 'Zuweisungsvariable festlegen',
+    },
+    assigner: {
+      'assignedVariable': 'Zugewiesene Variable',
+      'writeMode': 'Schreibmodus',
+      'writeModeTip': 'Wenn die ZUGEWIESENE VARIABLE ein Array ist, f眉gt der Anh盲ngemodus am Ende hinzu.',
+      'over-write': '脺berschreiben',
+      'append': 'Anh盲ngen',
+      'plus': 'Plus',
+      'clear': 'L枚schen',
+      'setVariable': 'Variable setzen',
+      'variable': 'Variable',
+      'operations': {
+        'title': 'Operation',
+        'clear': 'Klar',
+        'over-write': '脺berschreiben',
+        'set': 'Garnitur',
+        '-=': '-=',
+        '+=': '+=',
+        '/=': '/=',
+        'append': 'Anf眉gen',
+        'extend': 'Ausdehnen',
+        '*=': '*=',
+        'overwrite': '脺berschreiben',
+        'remove-first': 'Erste entfernen',
+        'remove-last': 'Letzte entfernen',
+      },
+      'setParameter': 'Parameter setzen...',
+      'noVarTip': 'Klicken Sie auf die Schaltfl盲che "+", um Variablen hinzuzuf眉gen',
+      'variables': 'Variablen',
+      'noAssignedVars': 'Keine verf眉gbaren zugewiesenen Variablen',
+      'selectAssignedVariable': 'Zugewiesene Variable ausw盲hlen...',
+      'varNotSet': 'Variable NICHT gesetzt',
+      'assignedVarsDescription': 'Zugewiesene Variablen m眉ssen beschreibbare Variablen sein, z. B. Konversationsvariablen.',
+    },
+    tool: {
+      toAuthorize: 'Autorisieren',
+      inputVars: 'Eingabevariablen',
+      outputVars: {
+        text: 'durch das Tool generierter Inhalt',
+        files: {
+          title: 'durch das Tool generierte Dateien',
+          type: 'Unterst眉tzungstyp. Derzeit nur Bild unterst眉tzt',
+          transfer_method: '脺bertragungsmethode. Der Wert ist remote_url oder local_file',
+          url: 'Bild-URL',
+          upload_file_id: 'Hochgeladene Datei-ID',
+        },
+        json: 'von einem Tool generiertes JSON',
+      },
+    },
+    questionClassifiers: {
+      model: 'Modell',
+      inputVars: 'Eingabevariablen',
+      outputVars: {
+        className: 'Klassennamen',
+      },
+      class: 'Klasse',
+      classNamePlaceholder: 'Geben Sie Ihren Klassennamen ein',
+      advancedSetting: 'Erweiterte Einstellung',
+      topicName: 'Themenname',
+      topicPlaceholder: 'Geben Sie Ihren Themennamen ein',
+      addClass: 'Klasse hinzuf眉gen',
+      instruction: 'Anweisung',
+      instructionTip: 'Geben Sie zus盲tzliche Anweisungen ein, um dem Fragenklassifizierer zu helfen, besser zu verstehen, wie Fragen kategorisiert werden sollen.',
+      instructionPlaceholder: 'Geben Sie Ihre Anweisung ein',
+    },
+    parameterExtractor: {
+      inputVar: 'Eingabevariable',
+      extractParameters: 'Parameter extrahieren',
+      importFromTool: 'Aus Tools importieren',
+      addExtractParameter: 'Extraktionsparameter hinzuf眉gen',
+      addExtractParameterContent: {
+        name: 'Name',
+        namePlaceholder: 'Name des Extraktionsparameters',
+        type: 'Typ',
+        typePlaceholder: 'Typ des Extraktionsparameters',
+        description: 'Beschreibung',
+        descriptionPlaceholder: 'Beschreibung des Extraktionsparameters',
+        required: 'Erforderlich',
+        requiredContent: 'Erforderlich wird nur als Referenz f眉r die Modellschlussfolgerung verwendet und nicht f眉r die zwingende Validierung der Parameter-Ausgabe.',
+      },
+      extractParametersNotSet: 'Extraktionsparameter nicht eingerichtet',
+      instruction: 'Anweisung',
+      instructionTip: 'Geben Sie zus盲tzliche Anweisungen ein, um dem Parameter-Extraktor zu helfen, zu verstehen, wie Parameter extrahiert werden.',
+      advancedSetting: 'Erweiterte Einstellung',
+      reasoningMode: 'Schlussfolgerungsmodus',
+      reasoningModeTip: 'Sie k枚nnen den entsprechenden Schlussfolgerungsmodus basierend auf der F盲higkeit des Modells w盲hlen, auf Anweisungen zur Funktionsaufruf- oder Eingabeaufforderungen zu reagieren.',
+      isSuccess: 'Ist Erfolg. Bei Erfolg betr盲gt der Wert 1, bei Misserfolg betr盲gt der Wert 0.',
+      errorReason: 'Fehlergrund',
+    },
+    iteration: {
+      deleteTitle: 'Iterationsknoten l枚schen?',
+      deleteDesc: 'Das L枚schen des Iterationsknotens l枚scht alle untergeordneten Knoten',
+      input: 'Eingabe',
+      output: 'Ausgabevariablen',
+      iteration_one: '{{count}} Iteration',
+      iteration_other: '{{count}} Iterationen',
+      currentIteration: 'Aktuelle Iteration',
+      ErrorMethod: {
+        operationTerminated: 'beendet',
+        removeAbnormalOutput: 'remove-abnormale_ausgabe',
+        continueOnError: 'Fehler "Fortfahren bei"',
+      },
+      MaxParallelismTitle: 'Maximale Parallelit盲t',
+      parallelMode: 'Paralleler Modus',
+      errorResponseMethod: 'Methode der Fehlerantwort',
+      error_one: '{{Anzahl}} Fehler',
+      error_other: '{{Anzahl}} Irrt眉mer',
+      MaxParallelismDesc: 'Die maximale Parallelit盲t wird verwendet, um die Anzahl der Aufgaben zu steuern, die gleichzeitig in einer einzigen Iteration ausgef眉hrt werden.',
+      parallelPanelDesc: 'Im parallelen Modus unterst眉tzen Aufgaben in der Iteration die parallele Ausf眉hrung.',
+      parallelModeEnableDesc: 'Im parallelen Modus unterst眉tzen Aufgaben innerhalb von Iterationen die parallele Ausf眉hrung. Sie k枚nnen dies im Eigenschaftenbereich auf der rechten Seite konfigurieren.',
+      answerNodeWarningDesc: 'Warnung im parallelen Modus: Antwortknoten, Zuweisungen von Konversationsvariablen und persistente Lese-/Schreibvorg盲nge innerhalb von Iterationen k枚nnen Ausnahmen verursachen.',
+      parallelModeEnableTitle: 'Paralleler Modus aktiviert',
+      parallelModeUpper: 'PARALLELER MODUS',
+      comma: ',',
+    },
+    note: {
+      editor: {
+        strikethrough: 'Durchgestrichen',
+        large: 'Gro脽',
+        bulletList: 'Aufz盲hlung',
+        italic: 'Kursiv',
+        small: 'Klein',
+        bold: 'K眉hn',
+        placeholder: 'Schreiben Sie Ihre Notiz...',
+        openLink: 'Offen',
+        showAuthor: 'Autor anzeigen',
+        medium: 'Mittel',
+        unlink: 'Trennen',
+        link: 'Verbinden',
+        enterUrl: 'URL eingeben...',
+        invalidUrl: 'Ung眉ltige URL',
+      },
+      addNote: 'Notiz hinzuf眉gen',
+    },
+    docExtractor: {
+      outputVars: {
+        text: 'Extrahierter Text',
+      },
+      supportFileTypes: 'Unterst眉tzte Dateitypen: {{types}}.',
+      inputVar: 'Eingabevariable',
+      learnMore: 'Weitere Informationen',
+    },
+    listFilter: {
+      outputVars: {
+        first_record: 'Erste Aufnahme',
+        result: 'Ergebnis filtern',
+        last_record: 'Letzter Datensatz',
+      },
+      asc: 'ASC',
+      limit: 'Top N',
+      desc: 'DESC',
+      orderBy: 'Sortieren nach',
+      inputVar: 'Eingabevariable',
+      filterConditionComparisonOperator: 'Operator f眉r den Bedingungsvergleich filtern',
+      filterConditionComparisonValue: 'Wert der Filterbedingung',
+      filterConditionKey: 'Bedingungsschl眉ssel filtern',
+      filterCondition: 'Filter-Bedingung',
+      selectVariableKeyPlaceholder: 'Untervariablenschl眉ssel ausw盲hlen',
+      extractsCondition: 'Extrahieren des N-Elements',
+    },
+    agent: {
+      strategy: {
+        configureTipDesc: 'Nach der Konfiguration der agentischen Strategie l盲dt dieser Knoten automatisch die verbleibenden Konfigurationen. Die Strategie wirkt sich auf den Mechanismus des mehrstufigen Tool-Reasoning aus.',
+        shortLabel: 'Strategie',
+        tooltip: 'Unterschiedliche Agentenstrategien bestimmen, wie das System mehrstufige Werkzeugaufrufe plant und ausf眉hrt',
+        configureTip: 'Bitte konfigurieren Sie die Agentenstrategie.',
+        selectTip: 'Agentische Strategie ausw盲hlen',
+        searchPlaceholder: 'Agentenstrategie suchen',
+        label: 'Agentische Strategie',
+      },
+      pluginInstaller: {
+        install: 'Installieren',
+        installing: 'Installation',
+      },
+      modelNotInMarketplace: {
+        desc: 'Dieses Modell wird aus dem lokalen oder GitHub-Repository installiert. Bitte nach der Installation verwenden.',
+        manageInPlugins: 'In Plugins verwalten',
+        title: 'Modell nicht installiert',
+      },
+      modelNotSupport: {
+        descForVersionSwitch: 'Die installierte Plugin-Version stellt dieses Modell nicht zur Verf眉gung. Klicken Sie hier, um die Version zu wechseln.',
+        desc: 'Die installierte Plugin-Version stellt dieses Modell nicht zur Verf眉gung.',
+        title: 'Nicht unterst眉tztes Modell',
+      },
+      modelSelectorTooltips: {
+        deprecated: 'Dieses Modell ist veraltet',
+      },
+      outputVars: {
+        files: {
+          type: 'Art der Unterst眉tzung. Jetzt nur noch Image unterst眉tzen',
+          url: 'Bild-URL',
+          title: 'Vom Agenten generierte Dateien',
+          upload_file_id: 'Datei-ID hochladen',
+          transfer_method: '脺bertragungsmethode. Wert ist remote_url oder local_file',
+        },
+        text: 'Von Agenten generierte Inhalte',
+        json: 'Vom Agenten generiertes JSON',
+      },
+      checkList: {
+        strategyNotSelected: 'Strategie nicht ausgew盲hlt',
+      },
+      installPlugin: {
+        cancel: 'Abbrechen',
+        desc: '脺ber die Installation des folgenden Plugins',
+        changelog: '脛nderungsprotokoll',
+        title: 'Plugin installieren',
+        install: 'Installieren',
+      },
+      modelNotSelected: 'Modell nicht ausgew盲hlt',
+      modelNotInstallTooltip: 'Dieses Modell ist nicht installiert',
+      strategyNotFoundDesc: 'Die installierte Plugin-Version bietet diese Strategie nicht.',
+      unsupportedStrategy: 'Nicht unterst眉tzte Strategie',
+      toolNotInstallTooltip: '{{tool}} ist nicht installiert',
+      notAuthorized: 'Nicht autorisiert',
+      pluginNotInstalled: 'Dieses Plugin ist nicht installiert',
+      toolbox: 'Werkzeugkasten',
+      toolNotAuthorizedTooltip: '{{Werkzeug}} Nicht autorisiert',
+      maxIterations: 'Max. Iterationen',
+      model: 'Modell',
+      strategyNotInstallTooltip: '{{strategy}} ist nicht installiert',
+      pluginNotInstalledDesc: 'Dieses Plugin wird von GitHub installiert. Bitte gehen Sie zu Plugins, um sie neu zu installieren',
+      strategyNotSet: 'Agentische Strategie nicht festgelegt',
+      strategyNotFoundDescAndSwitchVersion: 'Die installierte Plugin-Version bietet diese Strategie nicht. Klicken Sie hier, um die Version zu wechseln.',
+      tools: 'Werkzeuge',
+      pluginNotFoundDesc: 'Dieses Plugin wird von GitHub installiert. Bitte gehen Sie zu Plugins, um sie neu zu installieren',
+      learnMore: 'Weitere Informationen',
+      configureModel: 'Modell konfigurieren',
+      linkToPlugin: 'Link zu Plugins',
+    },
+    loop: {
+      ErrorMethod: {
+        removeAbnormalOutput: 'Abnormale Ausgaben entfernen',
+        continueOnError: 'Fortfahren bei Fehler',
+        operationTerminated: 'Beendet',
+      },
+      comma: ',',
+      loopNode: 'Schleifen-Knoten',
+      loop_other: '{{count}} Schleifen',
+      totalLoopCount: 'Gesamtanzahl der Schleifen: {{count}}',
+      deleteDesc: 'Das L枚schen des Schleifen-Knotens entfernt alle untergeordneten Knoten.',
+      loopVariables: 'Schleifenvariablen',
+      loop_one: '{{count}} Schleife',
+      breakCondition: 'Schleifenbeendigungsbedingung',
+      setLoopVariables: 'Setze Variablen innerhalb des Schleifenbereichs',
+      breakConditionTip: 'Nur Variablen innerhalb von Schleifen mit Abbruchbedingungen und Konversationsvariablen k枚nnen referenziert werden.',
+      loopMaxCountError: 'Bitte geben Sie eine g眉ltige maximale Schleifenanzahl ein, die von 1 bis {{maxCount}} reicht.',
+      deleteTitle: 'Schleifen-Knoten l枚schen?',
+      currentLoop: 'Aktueller Loop',
+      loopMaxCount: 'Maximale Schleifenanzahl',
+      finalLoopVariables: 'Endg眉ltige Schleifenvariablen',
+      exitConditionTip: 'Ein Schleifen-Knoten ben枚tigt mindestens eine Ausgangsbedingung.',
+      errorResponseMethod: 'Fehlerantwortmethode',
+      initialLoopVariables: 'Urspr眉ngliche Schleifenvariablen',
+      variableName: 'Variablenname',
+      error_one: '{{count}} Fehler',
+      currentLoopCount: 'Aktuelle Schleifenanzahl: {{count}}',
+      inputMode: 'Eingabemodus',
+      error_other: '{{count}} Fehler',
+      output: 'Ausgabewert',
+      input: 'Eingabe',
+    },
+  },
+  tracing: {
+    stopBy: 'Gestoppt von {{user}}',
+  },
+  variableReference: {
+    noAvailableVars: 'Keine verf眉gbaren Variablen',
+    conversationVars: 'Konversations-Variablen',
+    noAssignedVars: 'Keine verf眉gbaren zugewiesenen Variablen',
+    noVarsForOperation: 'Es stehen keine Variablen f眉r die Zuweisung mit der ausgew盲hlten Operation zur Verf眉gung.',
+    assignedVarsDescription: 'Zugewiesene Variablen m眉ssen beschreibbare Variablen sein, z. B.',
+  },
+  versionHistory: {
+    filter: {
+      all: 'Alle',
+      onlyShowNamedVersions: 'Nur benannte Versionen anzeigen',
+      onlyYours: 'Nur dein',
+      reset: 'Filter zur眉cksetzen',
+      empty: 'Kein passendes Versionsprotokoll gefunden.',
+    },
+    editField: {
+      releaseNotesLengthLimit: 'Die Versionshinweise d眉rfen {{limit}} Zeichen nicht 眉berschreiten.',
+      titleLengthLimit: 'Der Titel darf {{limit}} Zeichen nicht 眉berschreiten.',
+      releaseNotes: 'Versionshinweise',
+      title: 'Titel',
+    },
+    action: {
+      restoreFailure: 'Wiederherstellung der Version fehlgeschlagen',
+      updateSuccess: 'Version aktualisiert',
+      deleteSuccess: 'Version gel枚scht',
+      deleteFailure: 'Version l枚schen fehlgeschlagen',
+      restoreSuccess: 'Version wiederhergestellt',
+      updateFailure: 'Aktualisierung der Version fehlgeschlagen',
+    },
+    latest: 'Neueste',
+    nameThisVersion: 'Nennen Sie diese Version',
+    currentDraft: 'Aktueller Entwurf',
+    releaseNotesPlaceholder: 'Beschreibe, was sich ge盲ndert hat.',
+    defaultName: 'Unbetitelte Version',
+    title: 'Versionen',
+    editVersionInfo: 'Versionsinformationen bearbeiten',
+    deletionTip: 'Die L枚schung ist unumkehrbar, bitte best盲tigen Sie.',
+    restorationTip: 'Nach der Wiederherstellung der Version wird der aktuelle Entwurf 眉berschrieben.',
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/app-annotation.ts b/i18n/en-US/app-annotation.ts
new file mode 100644
index 0000000..43f24a7
--- /dev/null
+++ b/i18n/en-US/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: 'Annotations',
+  name: 'Annotation Reply',
+  editBy: 'Answer edited by {{author}}',
+  noData: {
+    title: 'No annotations',
+    description: 'You can edit annotations during app debugging or import annotations in bulk here for a high-quality response.',
+  },
+  table: {
+    header: {
+      question: 'question',
+      answer: 'answer',
+      createdAt: 'created at',
+      hits: 'hits',
+      actions: 'actions',
+      addAnnotation: 'Add Annotation',
+      bulkImport: 'Bulk Import',
+      bulkExport: 'Bulk Export',
+      clearAll: 'Clear All Annotation',
+    },
+  },
+  editModal: {
+    title: 'Edit Annotation Reply',
+    queryName: 'User Query',
+    answerName: 'Storyteller Bot',
+    yourAnswer: 'Your Answer',
+    answerPlaceholder: 'Type your answer here',
+    yourQuery: 'Your Query',
+    queryPlaceholder: 'Type your query here',
+    removeThisCache: 'Remove this Annotation',
+    createdAt: 'Created At',
+  },
+  addModal: {
+    title: 'Add Annotation Reply',
+    queryName: 'Question',
+    answerName: 'Answer',
+    answerPlaceholder: 'Type answer here',
+    queryPlaceholder: 'Type query here',
+    createNext: 'Add another annotated response',
+  },
+  batchModal: {
+    title: 'Bulk Import',
+    csvUploadTitle: 'Drag and drop your CSV file here, or ',
+    browse: 'browse',
+    tip: 'The CSV file must conform to the following structure:',
+    question: 'question',
+    answer: 'answer',
+    contentTitle: 'chunk content',
+    content: 'content',
+    template: 'Download the template here',
+    cancel: 'Cancel',
+    run: 'Run Batch',
+    runError: 'Run batch failed',
+    processing: 'In batch processing',
+    completed: 'Import completed',
+    error: 'Import Error',
+    ok: 'OK',
+  },
+  errorMessage: {
+    answerRequired: 'Answer is required',
+    queryRequired: 'Question is required',
+  },
+  viewModal: {
+    annotatedResponse: 'Annotation Reply',
+    hitHistory: 'Hit History',
+    hit: 'Hit',
+    hits: 'Hits',
+    noHitHistory: 'No hit history',
+  },
+  hitHistoryTable: {
+    query: 'Query',
+    match: 'Match',
+    response: 'Response',
+    source: 'Source',
+    score: 'Score',
+    time: 'Time',
+  },
+  initSetup: {
+    title: 'Annotation Reply Initial Setup',
+    configTitle: 'Annotation Reply Setup',
+    confirmBtn: 'Save & Enable',
+    configConfirmBtn: 'Save',
+  },
+  embeddingModelSwitchTip: 'Annotation text vectorization model, switching models will be re-embedded, resulting in additional costs.',
+}
+
+export default translation
diff --git a/i18n/en-US/app-api.ts b/i18n/en-US/app-api.ts
new file mode 100644
index 0000000..1fba63c
--- /dev/null
+++ b/i18n/en-US/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'API Server',
+  apiKey: 'API Key',
+  status: 'Status',
+  disabled: 'Disabled',
+  ok: 'In Service',
+  copy: 'Copy',
+  copied: 'Copied',
+  regenerate: 'Regenerate',
+  play: 'Play',
+  pause: 'Pause',
+  playing: 'Playing',
+  loading: 'Loading',
+  merMaid: {
+    rerender: 'Redo Rerender',
+  },
+  never: 'Never',
+  apiKeyModal: {
+    apiSecretKey: 'API Secret key',
+    apiSecretKeyTips: 'To prevent API abuse, protect your API Key. Avoid using it as plain text in front-end code. :)',
+    createNewSecretKey: 'Create new Secret key',
+    secretKey: 'Secret Key',
+    created: 'CREATED',
+    lastUsed: 'LAST USED',
+    generateTips: 'Keep this key in a secure and accessible place.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: 'Delete this secret key?',
+    deleteConfirmTips: 'This action cannot be undone.',
+    ok: 'OK',
+  },
+  completionMode: {
+    title: 'Completion App API',
+    info: 'For high-quality text generation, such as articles, summaries, and translations, use the completion-messages API with user input. Text generation relies on the model parameters and prompt templates set in Dify Prompt Engineering.',
+    createCompletionApi: 'Create Completion Message',
+    createCompletionApiTip: 'Create a Completion Message to support the question-and-answer mode.',
+    inputsTips: '(Optional) Provide user input fields as key-value pairs, corresponding to variables in Prompt Eng. Key is the variable name, Value is the parameter value. If the field type is Select, the submitted Value must be one of the preset choices.',
+    queryTips: 'User input text content.',
+    blocking: 'Blocking type, waiting for execution to complete and returning results. (Requests may be interrupted if the process is long)',
+    streaming: 'streaming returns. Implementation of streaming return based on SSE (Server-Sent Events).',
+    messageFeedbackApi: 'Message feedback (like)',
+    messageFeedbackApiTip: 'Rate received messages on behalf of end-users with likes or dislikes. This data is visible in the Logs & Annotations page and used for future model fine-tuning.',
+    messageIDTip: 'Message ID',
+    ratingTip: 'like or dislike, null is undo',
+    parametersApi: 'Obtain application parameter information',
+    parametersApiTip: 'Retrieve configured Input parameters, including variable names, field names, types, and default values. Typically used for displaying these fields in a form or filling in default values after the client loads.',
+  },
+  chatMode: {
+    title: 'Chat App API',
+    info: 'For versatile conversational apps using a Q&A format, call the chat-messages API to initiate dialogue. Maintain ongoing conversations by passing the returned conversation_id. Response parameters and templates depend on Dify Prompt Eng. settings.',
+    createChatApi: 'Create chat message',
+    createChatApiTip: 'Create a new conversation message or continue an existing dialogue.',
+    inputsTips: '(Optional) Provide user input fields as key-value pairs, corresponding to variables in Prompt Eng. Key is the variable name, Value is the parameter value. If the field type is Select, the submitted Value must be one of the preset choices.',
+    queryTips: 'User input/question content',
+    blocking: 'Blocking type, waiting for execution to complete and returning results. (Requests may be interrupted if the process is long)',
+    streaming: 'streaming returns. Implementation of streaming return based on SSE (Server-Sent Events).',
+    conversationIdTip: '(Optional) Conversation ID: leave empty for first-time conversation; pass conversation_id from context to continue dialogue.',
+    messageFeedbackApi: 'Message terminal user feedback, like',
+    messageFeedbackApiTip: 'Rate received messages on behalf of end-users with likes or dislikes. This data is visible in the Logs & Annotations page and used for future model fine-tuning.',
+    messageIDTip: 'Message ID',
+    ratingTip: 'like or dislike, null is undo',
+    chatMsgHistoryApi: 'Get the chat history message',
+    chatMsgHistoryApiTip: 'The first page returns the latest `limit` bar, which is in reverse order.',
+    chatMsgHistoryConversationIdTip: 'Conversation ID',
+    chatMsgHistoryFirstId: 'ID of the first chat record on the current page. The default is none.',
+    chatMsgHistoryLimit: 'How many chats are returned in one request',
+    conversationsListApi: 'Get conversation list',
+    conversationsListApiTip: 'Gets the session list of the current user. By default, the last 20 sessions are returned.',
+    conversationsListFirstIdTip: 'The ID of the last record on the current page, default none.',
+    conversationsListLimitTip: 'How many chats are returned in one request',
+    conversationRenamingApi: 'Conversation renaming',
+    conversationRenamingApiTip: 'Rename conversations; the name is displayed in multi-session client interfaces.',
+    conversationRenamingNameTip: 'New name',
+    parametersApi: 'Obtain application parameter information',
+    parametersApiTip: 'Retrieve configured Input parameters, including variable names, field names, types, and default values. Typically used for displaying these fields in a form or filling in default values after the client loads.',
+  },
+  develop: {
+    requestBody: 'Request Body',
+    pathParams: 'Path Params',
+    query: 'Query',
+    toc: 'Contents',
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/app-debug.ts b/i18n/en-US/app-debug.ts
new file mode 100644
index 0000000..3ee5fd3
--- /dev/null
+++ b/i18n/en-US/app-debug.ts
@@ -0,0 +1,537 @@
+const translation = {
+  pageTitle: {
+    line1: 'PROMPT',
+    line2: 'Engineering',
+  },
+  orchestrate: 'Orchestrate',
+  promptMode: {
+    simple: 'Switch to Expert Mode to edit the whole PROMPT',
+    advanced: 'Expert Mode',
+    switchBack: 'Switch back',
+    advancedWarning: {
+      title: 'You have switched to Expert Mode, and once you modify the PROMPT, you CANNOT return to the basic mode.',
+      description: 'In Expert Mode, you can edit whole PROMPT.',
+      learnMore: 'Learn more',
+      ok: 'OK',
+    },
+    operation: {
+      addMessage: 'Add Message',
+    },
+    contextMissing: 'Context component missed, the effectiveness of the prompt may not be good.',
+  },
+  operation: {
+    applyConfig: 'Publish',
+    resetConfig: 'Reset',
+    debugConfig: 'Debug',
+    addFeature: 'Add Feature',
+    automatic: 'Generate',
+    stopResponding: 'Stop responding',
+    agree: 'like',
+    disagree: 'dislike',
+    cancelAgree: 'Cancel like',
+    cancelDisagree: 'Cancel dislike',
+    userAction: 'User ',
+  },
+  notSetAPIKey: {
+    title: 'LLM provider key has not been set',
+    trailFinished: 'Trail finished',
+    description: 'The LLM provider key has not been set, and it needs to be set before debugging.',
+    settingBtn: 'Go to settings',
+  },
+  trailUseGPT4Info: {
+    title: 'Does not support gpt-4 now',
+    description: 'Use gpt-4, please set API Key.',
+  },
+  feature: {
+    groupChat: {
+      title: 'Chat enhance',
+      description: 'Add pre-conversation settings for apps can enhance user experience.',
+    },
+    groupExperience: {
+      title: 'Experience enhance',
+    },
+    conversationOpener: {
+      title: 'Conversation Opener',
+      description: 'In a chat app, the first sentence that the AI actively speaks to the user is usually used as a welcome.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: 'Follow-up',
+      description: 'Setting up next questions suggestion can give users a better chat.',
+      resDes: '3 suggestions for user next question.',
+      tryToAsk: 'Try to ask',
+    },
+    moreLikeThis: {
+      title: 'More like this',
+      description: 'Generate multiple texts at once, and then edit and continue to generate',
+      generateNumTip: 'Number of each generated times',
+      tip: 'Using this feature will incur additional tokens overhead',
+    },
+    speechToText: {
+      title: 'Speech to Text',
+      description: 'Voice input can be used in chat.',
+      resDes: 'Voice input is enabled',
+    },
+    textToSpeech: {
+      title: 'Text to Speech',
+      description: 'Conversation messages can be converted to speech.',
+      resDes: 'Text to Audio is enabled',
+    },
+    citation: {
+      title: 'Citations and Attributions',
+      description: 'Show source document and attributed section of the generated content.',
+      resDes: 'Citations and Attributions is enabled',
+    },
+    annotation: {
+      title: 'Annotation Reply',
+      description: 'You can manually add high-quality response to the cache for prioritized matching with similar user questions.',
+      resDes: 'Annotation Response is enabled',
+      scoreThreshold: {
+        title: 'Score Threshold',
+        description: 'Used to set the similarity threshold for annotation reply.',
+        easyMatch: 'Easy Match',
+        accurateMatch: 'Accurate Match',
+      },
+      matchVariable: {
+        title: 'Match Variable',
+        choosePlaceholder: 'Choose match variable',
+      },
+      cacheManagement: 'Annotations',
+      cached: 'Annotated',
+      remove: 'Remove',
+      removeConfirm: 'Delete this annotation ?',
+      add: 'Add annotation',
+      edit: 'Edit annotation',
+    },
+    dataSet: {
+      title: 'Knowledge',
+      noData: 'You can import Knowledge as context',
+      words: 'Words',
+      textBlocks: 'Text Blocks',
+      selectTitle: 'Select reference Knowledge',
+      selected: 'Knowledge selected',
+      noDataSet: 'No Knowledge found',
+      toCreate: 'Go to create',
+      notSupportSelectMulti: 'Currently only support one Knowledge',
+      queryVariable: {
+        title: 'Query variable',
+        tip: 'This variable will be used as the query input for context retrieval, obtaining context information related to the input of this variable.',
+        choosePlaceholder: 'Choose query variable',
+        noVar: 'No variables',
+        noVarTip: 'please create a variable under the Variables section',
+        unableToQueryDataSet: 'Unable to query the Knowledge',
+        unableToQueryDataSetTip: 'Unable to query the Knowledge successfully, please choose a context query variable in the context section.',
+        ok: 'OK',
+        contextVarNotEmpty: 'context query variable can not be empty',
+        deleteContextVarTitle: 'Delete variable 鈥渰{varName}}鈥�?',
+        deleteContextVarTip: 'This variable has been set as a context query variable, and removing it will impact the normal use of the Knowledge. If you still need to delete it, please reselect it in the context section.',
+      },
+    },
+    tools: {
+      title: 'Tools',
+      tips: 'Tools provide a standard API call method, taking user input or variables as request parameters for querying external data as context.',
+      toolsInUse: '{{count}} tools in use',
+      modal: {
+        title: 'Tool',
+        toolType: {
+          title: 'Tool Type',
+          placeholder: 'Please select the tool type',
+        },
+        name: {
+          title: 'Name',
+          placeholder: 'Please enter the name',
+        },
+        variableName: {
+          title: 'Variable Name',
+          placeholder: 'Please enter the variable name',
+        },
+      },
+    },
+    conversationHistory: {
+      title: 'Conversation History',
+      description: 'Set prefix names for conversation roles',
+      tip: 'The Conversation History is not enabled, please add <histories> in the prompt above.',
+      learnMore: 'Learn more',
+      editModal: {
+        title: 'Edit Conversation Role Names',
+        userPrefix: 'User prefix',
+        assistantPrefix: 'Assistant prefix',
+      },
+    },
+    toolbox: {
+      title: 'TOOLBOX',
+    },
+    moderation: {
+      title: 'Content moderation',
+      description: 'Secure model output by using moderation API or maintaining a sensitive word list.',
+      contentEnableLabel: 'Enabled moderate content',
+      allEnabled: 'INPUT & OUTPUT',
+      inputEnabled: 'INPUT',
+      outputEnabled: 'OUTPUT',
+      modal: {
+        title: 'Content moderation settings',
+        provider: {
+          title: 'Provider',
+          openai: 'OpenAI Moderation',
+          openaiTip: {
+            prefix: 'OpenAI Moderation requires an OpenAI API key configured in the ',
+            suffix: '.',
+          },
+          keywords: 'Keywords',
+        },
+        keywords: {
+          tip: 'One per line, separated by line breaks. Up to 100 characters per line.',
+          placeholder: 'One per line, separated by line breaks',
+          line: 'Line',
+        },
+        content: {
+          input: 'Moderate INPUT Content',
+          output: 'Moderate OUTPUT Content',
+          preset: 'Preset replies',
+          placeholder: 'Preset replies content here',
+          condition: 'Moderate INPUT and OUTPUT Content enabled at least one',
+          fromApi: 'Preset replies are returned by API',
+          errorMessage: 'Preset replies cannot be empty',
+          supportMarkdown: 'Markdown supported',
+        },
+        openaiNotConfig: {
+          before: 'OpenAI Moderation requires an OpenAI API key configured in the',
+          after: '',
+        },
+      },
+    },
+    fileUpload: {
+      title: 'File Upload',
+      description: 'The chat input box allows uploading of images, documents, and other files.',
+      supportedTypes: 'Support File Types',
+      numberLimit: 'Max uploads',
+      modalTitle: 'File Upload Setting',
+    },
+    imageUpload: {
+      title: 'Image Upload',
+      description: 'Allow uploading images.',
+      supportedTypes: 'Support File Types',
+      numberLimit: 'Max uploads',
+      modalTitle: 'Image Upload Setting',
+    },
+    bar: {
+      empty: 'Enable feature to enhance web app user experience',
+      enableText: 'Features Enabled',
+      manage: 'Manage',
+    },
+    documentUpload: {
+      title: 'Document',
+      description: 'Enable Document will allows the model to take in documents and answer questions about them.',
+    },
+  },
+  codegen: {
+    title: 'Code Generator',
+    description: 'The Code Generator uses configured models to generate high-quality code based on your instructions. Please provide clear and detailed instructions.',
+    instruction: 'Instructions',
+    instructionPlaceholder: 'Enter detailed description of the code you want to generate.',
+    noDataLine1: 'Describe your use case on the left,',
+    noDataLine2: 'the code preview will show here.',
+    generate: 'Generate',
+    generatedCodeTitle: 'Generated Code',
+    loading: 'Generating code...',
+    apply: 'Apply',
+    applyChanges: 'Apply Changes',
+    resTitle: 'Generated Code',
+    overwriteConfirmTitle: 'Overwrite existing code?',
+    overwriteConfirmMessage: 'This action will overwrite the existing code. Do you want to continue?',
+  },
+  generate: {
+    title: 'Prompt Generator',
+    description: 'The Prompt Generator uses the configured model to optimize prompts for higher quality and better structure. Please write clear and detailed instructions.',
+    tryIt: 'Try it',
+    instruction: 'Instructions',
+    instructionPlaceHolder: 'Write clear and specific instructions.',
+    generate: 'Generate',
+    resTitle: 'Generated Prompt',
+    noDataLine1: 'Describe your use case on the left,',
+    noDataLine2: 'the orchestration preview will show here.',
+    apply: 'Apply',
+    loading: 'Orchestrating the application for you...',
+    overwriteTitle: 'Override existing configuration?',
+    overwriteMessage: 'Applying this prompt will override existing configuration.',
+    template: {
+      pythonDebugger: {
+        name: 'Python debugger',
+        instruction: 'A bot that can generate and debug your code based on your instruction',
+      },
+      translation: {
+        name: 'Translation',
+        instruction: 'A translator that can translate multiple languages',
+      },
+      professionalAnalyst: {
+        name: 'Professional analyst',
+        instruction: 'Extract insights, identify risk and distill key information from long reports into single memo',
+      },
+      excelFormulaExpert: {
+        name: 'Excel formula expert',
+        instruction: 'A chatbot that can help novice users understand, use and create Excel formulas based on user instructions',
+      },
+      travelPlanning: {
+        name: 'Travel planning',
+        instruction: 'The Travel Planning Assistant is an intelligent tool designed to help users effortlessly plan their trips',
+      },
+      SQLSorcerer: {
+        name: 'SQL sorcerer',
+        instruction: 'Transform everyday language into SQL queries',
+      },
+      GitGud: {
+        name: 'Git gud',
+        instruction: 'Generate appropriate Git commands based on user described version control actions',
+      },
+      meetingTakeaways: {
+        name: 'Meeting takeaways',
+        instruction: 'Distill meetings into concise summaries including discussion topics, key takeaways, and action items',
+      },
+      writingsPolisher: {
+        name: 'Writing polisher',
+        instruction: 'Use advanced copyediting techniques to improve your writings',
+      },
+    },
+  },
+  resetConfig: {
+    title: 'Confirm reset?',
+    message:
+      'Reset discards changes, restoring the last published configuration.',
+  },
+  errorMessage: {
+    nameOfKeyRequired: 'name of the key: {{key}} required',
+    valueOfVarRequired: '{{key}} value can not be empty',
+    queryRequired: 'Request text is required.',
+    waitForResponse:
+      'Please wait for the response to the previous message to complete.',
+    waitForBatchResponse:
+      'Please wait for the response to the batch task to complete.',
+    notSelectModel: 'Please choose a model',
+    waitForImgUpload: 'Please wait for the image to upload',
+    waitForFileUpload: 'Please wait for the file/files to upload',
+  },
+  warningMessage: {
+    timeoutExceeded: 'Results are not displayed due to timeout. Please refer to the logs to gather complete results.',
+  },
+  chatSubTitle: 'Instructions',
+  completionSubTitle: 'Prefix Prompt',
+  promptTip:
+    'Prompts guide AI responses with instructions and constraints. Insert variables like {{input}}. This prompt won\'t be visible to users.',
+  formattingChangedTitle: 'Formatting changed',
+  formattingChangedText:
+    'Modifying the formatting will reset the debug area, are you sure?',
+  variableTitle: 'Variables',
+  variableTip:
+    'Users fill variables in a form, automatically replacing variables in the prompt.',
+  notSetVar: 'Variables allow users to introduce prompt words or opening remarks when filling out forms. You can try entering "{{input}}" in the prompt words.',
+  autoAddVar: 'Undefined variables referenced in pre-prompt, are you want to add them in user input form?',
+  variableTable: {
+    key: 'Variable Key',
+    name: 'User Input Field Name',
+    optional: 'Optional',
+    type: 'Input Type',
+    action: 'Actions',
+    typeString: 'String',
+    typeSelect: 'Select',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{key}} is required',
+    tooLong: '{{key}} is too length. Can not be longer then 30 characters',
+    notValid: '{{key}} is invalid. Can only contain letters, numbers, and underscores',
+    notStartWithNumber: '{{key}} can not start with a number',
+    keyAlreadyExists: '{{key}} already exists',
+  },
+  otherError: {
+    promptNoBeEmpty: 'Prompt can not be empty',
+    historyNoBeEmpty: 'Conversation history must be set in the prompt',
+    queryNoBeEmpty: 'Query must be set in the prompt',
+  },
+  variableConfig: {
+    'addModalTitle': 'Add Input Field',
+    'editModalTitle': 'Edit Input Field',
+    'description': 'Setting for variable {{varName}}',
+    'fieldType': 'Field type',
+    'string': 'Short Text',
+    'text-input': 'Short Text',
+    'paragraph': 'Paragraph',
+    'select': 'Select',
+    'number': 'Number',
+    'single-file': 'Single File',
+    'multi-files': 'File List',
+    'notSet': 'Not set, try typing {{input}} in the prefix prompt',
+    'stringTitle': 'Form text box options',
+    'maxLength': 'Max length',
+    'options': 'Options',
+    'addOption': 'Add option',
+    'apiBasedVar': 'API-based Variable',
+    'varName': 'Variable Name',
+    'labelName': 'Label Name',
+    'inputPlaceholder': 'Please input',
+    'content': 'Content',
+    'required': 'Required',
+    'file': {
+      supportFileTypes: 'Support File Types',
+      image: {
+        name: 'Image',
+      },
+      audio: {
+        name: 'Audio',
+      },
+      document: {
+        name: 'Document',
+      },
+      video: {
+        name: 'Video',
+      },
+      custom: {
+        name: 'Other file types',
+        description: 'Specify other file types.',
+        createPlaceholder: '+ File extension, e.g .doc',
+      },
+    },
+    'uploadFileTypes': 'Upload File Types',
+    'localUpload': 'Local Upload',
+    'both': 'Both',
+    'maxNumberOfUploads': 'Max number of uploads',
+    'maxNumberTip': 'Document < {{docLimit}}, image < {{imgLimit}}, audio < {{audioLimit}}, video < {{videoLimit}}',
+    'errorMsg': {
+      labelNameRequired: 'Label name is required',
+      varNameCanBeRepeat: 'Variable name can not be repeated',
+      atLeastOneOption: 'At least one option is required',
+      optionRepeat: 'Has repeat options',
+    },
+  },
+  vision: {
+    name: 'Vision',
+    description: 'Enable Vision will allows the model to take in images and answer questions about them.聽',
+    onlySupportVisionModelTip: 'Only supports vision models',
+    settings: 'Settings',
+    visionSettings: {
+      title: 'Vision Settings',
+      resolution: 'Resolution',
+      resolutionTooltip: `low res will allow model receive a low-res 512 x 512 version of the image, and represent the image with a budget of 65 tokens. This allows the API to return faster responses and consume fewer input tokens for use cases that do not require high detail.
+      \n
+      high res will first allows the model to see the low res image and then creates detailed crops of input images as 512px squares based on the input image size. Each of the detailed crops uses twice the token budget for a total of 129 tokens.`,
+      high: 'High',
+      low: 'Low',
+      uploadMethod: 'Upload Method',
+      both: 'Both',
+      localUpload: 'Local Upload',
+      url: 'URL',
+      uploadLimit: 'Upload Limit',
+    },
+  },
+  voice: {
+    name: 'Voice',
+    defaultDisplay: 'Default Voice',
+    description: 'Text to speech voice Settings',
+    settings: 'Settings',
+    voiceSettings: {
+      title: 'Voice Settings',
+      language: 'Language',
+      resolutionTooltip: 'Text-to-speech voice support language銆�',
+      voice: 'Voice',
+      autoPlay: 'Auto Play',
+      autoPlayEnabled: 'On',
+      autoPlayDisabled: 'Off',
+    },
+  },
+  openingStatement: {
+    title: 'Conversation Opener',
+    add: 'Add',
+    writeOpener: 'Edit opener',
+    placeholder: 'Write your opener message here, you can use variables, try type {{variable}}.',
+    openingQuestion: 'Opening Questions',
+    noDataPlaceHolder:
+      'Starting the conversation with the user can help AI establish a closer connection with them in conversational applications.',
+    varTip: 'You can use variables, try type {{variable}}',
+    tooShort: 'At least 20 words of initial prompt are required to generate an opening remarks for the conversation.',
+    notIncludeKey: 'The initial prompt does not include the variable: {{key}}. Please add it to the initial prompt.',
+  },
+  modelConfig: {
+    model: 'Model',
+    setTone: 'Set tone of responses',
+    title: 'Model and Parameters',
+    modeType: {
+      chat: 'Chat',
+      completion: 'Complete',
+    },
+  },
+  inputs: {
+    title: 'Debug & Preview',
+    noPrompt: 'Try write some prompt in pre-prompt input',
+    userInputField: 'User Input Field',
+    noVar: 'Fill in the value of the variable, which will be automatically replaced in the prompt word every time a new session is started.',
+    chatVarTip:
+      'Fill in the value of the variable, which will be automatically replaced in the prompt word every time a new session is started',
+    completionVarTip:
+      'Fill in the value of the variable, which will be automatically replaced in the prompt words every time a question is submitted.',
+    previewTitle: 'Prompt preview',
+    queryTitle: 'Query content',
+    queryPlaceholder: 'Please enter the request text.',
+    run: 'RUN',
+  },
+  result: 'Output Text',
+  noResult: 'Output will be displayed here.',
+  datasetConfig: {
+    settingTitle: 'Retrieval settings',
+    knowledgeTip: 'Click the 鈥�+鈥� button to add knowledge',
+    retrieveOneWay: {
+      title: 'N-to-1 retrieval',
+      description: 'Based on user intent and Knowledge descriptions, the Agent autonomously selects the best Knowledge for querying. Best for applications with distinct, limited Knowledge.',
+    },
+    retrieveMultiWay: {
+      title: 'Multi-path retrieval',
+      description: 'Based on user intent, queries across all Knowledge, retrieves relevant text from multi-sources, and selects the best results matching the user query after reranking.',
+    },
+    embeddingModelRequired: 'A configured Embedding Model is required',
+    rerankModelRequired: 'A configured Rerank Model is required',
+    params: 'Params',
+    top_k: 'Top K',
+    top_kTip: 'Used to filter chunks that are most similar to user questions. The system will also dynamically adjust the value of Top K, according to max_tokens of the selected model.',
+    score_threshold: 'Score Threshold',
+    score_thresholdTip: 'Used to set the similarity threshold for chunks filtering.',
+    retrieveChangeTip: 'Modifying the index mode and retrieval mode may affect applications associated with this Knowledge.',
+  },
+  debugAsSingleModel: 'Debug as Single Model',
+  debugAsMultipleModel: 'Debug as Multiple Models',
+  duplicateModel: 'Duplicate',
+  publishAs: 'Publish as',
+  assistantType: {
+    name: 'Assistant Type',
+    chatAssistant: {
+      name: 'Basic Assistant',
+      description: 'Build a chat-based assistant using a Large Language Model',
+    },
+    agentAssistant: {
+      name: 'Agent Assistant',
+      description: 'Build an intelligent Agent which can autonomously choose tools to complete the tasks',
+    },
+  },
+  agent: {
+    agentMode: 'Agent Mode',
+    agentModeDes: 'Set the type of inference mode for the agent',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: 'Function Calling',
+    },
+    setting: {
+      name: 'Agent Settings',
+      description: 'Agent Assistant settings allow setting agent mode and advanced features like built-in prompts, only available in Agent type.',
+      maximumIterations: {
+        name: 'Maximum Iterations',
+        description: 'Limit the number of iterations an agent assistant can execute',
+      },
+    },
+    buildInPrompt: 'Build-In Prompt',
+    firstPrompt: 'First Prompt',
+    nextIteration: 'Next Iteration',
+    promptPlaceholder: 'Write your prompt here',
+    tools: {
+      name: 'Tools',
+      description: 'Using tools can extend the capabilities of LLM, such as searching the internet or performing scientific calculations',
+      enabled: 'Enabled',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/app-log.ts b/i18n/en-US/app-log.ts
new file mode 100644
index 0000000..0d12340
--- /dev/null
+++ b/i18n/en-US/app-log.ts
@@ -0,0 +1,98 @@
+const translation = {
+  title: 'Logs',
+  description: 'The logs record the running status of the application, including user inputs and AI replies.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: 'Updated time',
+      time: 'Created time',
+      endUser: 'End User or Account',
+      input: 'Input',
+      output: 'Output',
+      summary: 'Title',
+      messageCount: 'Message Count',
+      userRate: 'User Rate',
+      adminRate: 'Op. Rate',
+      startTime: 'START TIME',
+      status: 'STATUS',
+      runtime: 'RUN TIME',
+      tokens: 'TOKENS',
+      user: 'End User or Account',
+      version: 'VERSION',
+    },
+    pagination: {
+      previous: 'Prev',
+      next: 'Next',
+    },
+    empty: {
+      noChat: 'No conversation yet',
+      noOutput: 'No output',
+      element: {
+        title: 'Is anyone there?',
+        content: 'Observe and annotate interactions between end-users and AI applications here to continuously improve AI accuracy. You can try <shareLink>sharing</shareLink> or <testLink>testing</testLink> the Web App yourself, then return to this page.',
+      },
+    },
+  },
+  detail: {
+    time: 'Time',
+    conversationId: 'Conversation ID',
+    promptTemplate: 'Prompt Template',
+    promptTemplateBeforeChat: 'Prompt Template Before Chat 路 As System Message',
+    annotationTip: 'Improvements Marked by {{user}}',
+    timeConsuming: '',
+    second: 's',
+    tokenCost: 'Token spent',
+    loading: 'loading',
+    operation: {
+      like: 'like',
+      dislike: 'dislike',
+      addAnnotation: 'Add Improvement',
+      editAnnotation: 'Edit Improvement',
+      annotationPlaceholder: 'Enter the expected answer that you want AI to reply, which can be used for model fine-tuning and continuous improvement of text generation quality in the future.',
+    },
+    variables: 'Variables',
+    uploadImages: 'Uploaded Images',
+    modelParams: 'Model parameters',
+  },
+  filter: {
+    period: {
+      today: 'Today',
+      last7days: 'Last 7 Days',
+      last4weeks: 'Last 4 weeks',
+      last3months: 'Last 3 months',
+      last12months: 'Last 12 months',
+      monthToDate: 'Month to date',
+      quarterToDate: 'Quarter to date',
+      yearToDate: 'Year to date',
+      allTime: 'All time',
+    },
+    annotation: {
+      all: 'All',
+      annotated: 'Annotated Improvements ({{count}} items)',
+      not_annotated: 'Not Annotated',
+    },
+    sortBy: 'Sort by:',
+    descending: 'descending',
+    ascending: 'ascending',
+  },
+  workflowTitle: 'Workflow Logs',
+  workflowSubtitle: 'The log recorded the operation of Automate.',
+  runDetail: {
+    title: 'Conversation Log',
+    workflowTitle: 'Log Detail',
+    fileListLabel: 'File Details',
+    fileListDetail: 'Detail',
+  },
+  promptLog: 'Prompt Log',
+  agentLog: 'Agent Log',
+  viewLog: 'View Log',
+  agentLogDetail: {
+    agentMode: 'Agent Mode',
+    toolUsed: 'Tool Used',
+    iterations: 'Iterations',
+    iteration: 'Iteration',
+    finalProcessing: 'Final Processing',
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/app-overview.ts b/i18n/en-US/app-overview.ts
new file mode 100644
index 0000000..0261f4c
--- /dev/null
+++ b/i18n/en-US/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: 'To get started,',
+    enterKeyTip: 'enter your OpenAI API Key below',
+    getKeyTip: 'Get your API Key from OpenAI dashboard',
+    placeholder: 'Your OpenAI API Key (eg.sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: 'You are using the {{providerName}} trial quota.',
+        description: 'The trial quota is provided for your testing purposes. Before the trial quota is exhausted, please set up your own model provider or purchase additional quota.',
+      },
+      exhausted: {
+        title: 'Your trial quota have been used up, please set up your APIKey.',
+        description: 'You have exhausted your trial quota. Please set up your own model provider or purchase additional quota.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: 'To get started,',
+        row2: 'setup your model provider first.',
+      },
+    },
+    callTimes: 'Call times',
+    usedToken: 'Used token',
+    setAPIBtn: 'Go to setup model provider',
+    tryCloud: 'Or try the cloud version of Dify with free quote',
+  },
+  overview: {
+    title: 'Overview',
+    appInfo: {
+      explanation: 'Ready-to-use AI WebApp',
+      accessibleAddress: 'Public URL',
+      preview: 'Preview',
+      launch: 'Launch',
+      regenerate: 'Regenerate',
+      regenerateNotice: 'Do you want to regenerate the public URL?',
+      preUseReminder: 'Please enable WebApp before continuing.',
+      settings: {
+        entry: 'Settings',
+        title: 'Web App Settings',
+        modalTip: 'Client-side web app settings. ',
+        webName: 'WebApp Name',
+        webDesc: 'WebApp Description',
+        webDescTip: 'This text will be displayed on the client side, providing basic guidance on how to use the application',
+        webDescPlaceholder: 'Enter the description of the WebApp',
+        language: 'Language',
+        workflow: {
+          title: 'Workflow',
+          subTitle: 'Workflow Details',
+          show: 'Show',
+          hide: 'Hide',
+          showDesc: 'Show or hide workflow details in WebApp',
+        },
+        chatColorTheme: 'Chat color theme',
+        chatColorThemeDesc: 'Set the color theme of the chatbot',
+        chatColorThemeInverted: 'Inverted',
+        invalidHexMessage: 'Invalid hex value',
+        invalidPrivacyPolicy: 'Invalid privacy policy link. Please use a valid link that starts with http or https',
+        sso: {
+          label: 'SSO Enforcement',
+          title: 'WebApp SSO',
+          description: 'All users are required to login with SSO before using WebApp',
+          tooltip: 'Contact the administrator to enable WebApp SSO',
+        },
+        more: {
+          entry: 'Show more settings',
+          copyright: 'Copyright',
+          copyrightTip: 'Display copyright information in the webapp',
+          copyrightTooltip: 'Please upgrade to Professional plan or above',
+          copyRightPlaceholder: 'Enter the name of the author or organization',
+          privacyPolicy: 'Privacy Policy',
+          privacyPolicyPlaceholder: 'Enter the privacy policy link',
+          privacyPolicyTip: 'Helps visitors understand the data the application collects, see Dify\'s <privacyPolicyLink>Privacy Policy</privacyPolicyLink>.',
+          customDisclaimer: 'Custom Disclaimer',
+          customDisclaimerPlaceholder: 'Enter the custom disclaimer text',
+          customDisclaimerTip: 'Custom disclaimer text will be displayed on the client side, providing additional information about the application',
+        },
+      },
+      embedded: {
+        entry: 'Embedded',
+        title: 'Embed on website',
+        explanation: 'Choose the way to embed chat app to your website',
+        iframe: 'To add the chat app any where on your website, add this iframe to your html code.',
+        scripts: 'To add a chat app to the bottom right of your website add this code to your html.',
+        chromePlugin: 'Install Dify Chatbot Chrome Extension',
+        copied: 'Copied',
+        copy: 'Copy',
+      },
+      qrcode: {
+        title: 'Link QR Code',
+        scan: 'Scan To Share',
+        download: 'Download QR Code',
+      },
+      customize: {
+        way: 'way',
+        entry: 'Customize',
+        title: 'Customize AI WebApp',
+        explanation: 'You can customize the frontend of the Web App to fit your scenario and style needs.',
+        way1: {
+          name: 'Fork the client code, modify it and deploy to Vercel (recommended)',
+          step1: 'Fork the client code and modify it',
+          step1Tip: 'Click here to fork the source code into your GitHub account and modify the code',
+          step1Operation: 'Dify-WebClient',
+          step2: 'Deploy to Vercel',
+          step2Tip: 'Click here to import the repository into Vercel and deploy',
+          step2Operation: 'Import repository',
+          step3: 'Configure environment variables',
+          step3Tip: 'Add the following environment variables in Vercel',
+        },
+        way2: {
+          name: 'Write client-side code to call the API and deploy it to a server',
+          operation: 'Documentation',
+        },
+      },
+    },
+    apiInfo: {
+      title: 'Backend Service API',
+      explanation: 'Easily integrated into your application',
+      accessibleAddress: 'Service API Endpoint',
+      doc: 'API Reference',
+    },
+    status: {
+      running: 'In Service',
+      disable: 'Disabled',
+    },
+  },
+  analysis: {
+    title: 'Analysis',
+    ms: 'ms',
+    tokenPS: 'Token/s',
+    totalMessages: {
+      title: 'Total Messages',
+      explanation: 'Daily AI interactions count.',
+    },
+    totalConversations: {
+      title: 'Total Conversations',
+      explanation: 'Daily AI conversations count; prompt engineering/debugging excluded.',
+    },
+    activeUsers: {
+      title: 'Active Users',
+      explanation: 'Unique users engaging in Q&A with AI; prompt engineering/debugging excluded.',
+    },
+    tokenUsage: {
+      title: 'Token Usage',
+      explanation: 'Reflects the daily token usage of the language model for the application, useful for cost control purposes.',
+      consumed: 'Consumed',
+    },
+    avgSessionInteractions: {
+      title: 'Avg. Session Interactions',
+      explanation: 'Continuous user-AI communication count; for conversation-based apps.',
+    },
+    avgUserInteractions: {
+      title: 'Avg. User Interactions',
+      explanation: 'Reflects the daily usage frequency of users. This metric reflects user stickiness.',
+    },
+    userSatisfactionRate: {
+      title: 'User Satisfaction Rate',
+      explanation: 'The number of likes per 1,000 messages. This indicates the proportion of answers that users are highly satisfied with.',
+    },
+    avgResponseTime: {
+      title: 'Avg. Response Time',
+      explanation: 'Time (ms) for AI to process/respond; for text-based apps.',
+    },
+    tps: {
+      title: 'Token Output Speed',
+      explanation: 'Measure the performance of the LLM. Count the Tokens output speed of LLM from the beginning of the request to the completion of the output.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/app.ts b/i18n/en-US/app.ts
new file mode 100644
index 0000000..c57d6c2
--- /dev/null
+++ b/i18n/en-US/app.ts
@@ -0,0 +1,200 @@
+const translation = {
+  createApp: 'CREATE APP',
+  types: {
+    all: 'All',
+    chatbot: 'Chatbot',
+    agent: 'Agent',
+    workflow: 'Workflow',
+    completion: 'Completion',
+    advanced: 'Chatflow',
+    basic: 'Basic',
+  },
+  duplicate: 'Duplicate',
+  mermaid: {
+    handDrawn: 'Hand Drawn',
+    classic: 'Classic',
+  },
+  duplicateTitle: 'Duplicate App',
+  export: 'Export DSL',
+  exportFailed: 'Export DSL failed.',
+  importDSL: 'Import DSL file',
+  createFromConfigFile: 'Create from DSL file',
+  importFromDSL: 'Import from DSL',
+  importFromDSLFile: 'From DSL file',
+  importFromDSLUrl: 'From URL',
+  importFromDSLUrlPlaceholder: 'Paste DSL link here',
+  deleteAppConfirmTitle: 'Delete this app?',
+  deleteAppConfirmContent:
+    'Deleting the app is irreversible. Users will no longer be able to access your app, and all prompt configurations and logs will be permanently deleted.',
+  appDeleted: 'App deleted',
+  appDeleteFailed: 'Failed to delete app',
+  join: 'Join the community',
+  communityIntro:
+    'Discuss with team members, contributors and developers on different channels.',
+  roadmap: 'See our roadmap',
+  newApp: {
+    learnMore: 'Learn more',
+    startFromBlank: 'Create from Blank',
+    startFromTemplate: 'Create from Template',
+    foundResult: '{{count}} Result',
+    foundResults: '{{count}} Results',
+    noAppsFound: 'No apps found',
+    noTemplateFound: 'No templates found',
+    noTemplateFoundTip: 'Try searching using different keywords.',
+    chatbotShortDescription: 'LLM-based chatbot with simple setup',
+    chatbotUserDescription: 'Quickly build an LLM-based chatbot with simple configuration. You can switch to Chatflow later.',
+    completionShortDescription: 'AI assistant for text generation tasks',
+    completionUserDescription: 'Quickly build an AI assistant for text generation tasks with simple configuration.',
+    agentShortDescription: 'Intelligent agent with reasoning and autonomous tool use',
+    agentUserDescription: 'An intelligent agent capable of iterative reasoning and autonomous tool use to achieve task goals.',
+    workflowShortDescription: 'Orchestration for single-turn automation tasks',
+    workflowUserDescription: 'Workflow orchestration for single-round tasks like automation and batch processing.',
+    workflowWarning: 'Currently in beta',
+    advancedShortDescription: 'Workflow for complex multi-turn dialogues with memory',
+    advancedUserDescription: 'Workflow orchestration for multi-round complex dialogue tasks with memory capabilities.',
+    chooseAppType: 'Choose App Type',
+    forBeginners: 'FOR BEGINNERS',
+    forAdvanced: 'FOR ADVANCED USERS',
+    noIdeaTip: 'No ideas? Check out our templates',
+    captionName: 'App Name & Icon',
+    appNamePlaceholder: 'Give your app a name',
+    captionDescription: 'Description',
+    optional: 'Optional',
+    appDescriptionPlaceholder: 'Enter the description of the app',
+    useTemplate: 'Use this template',
+    previewDemo: 'Preview demo',
+    chatApp: 'Assistant',
+    chatAppIntro:
+      'I want to build a chat-based application. This app uses a question-and-answer format, allowing for multiple rounds of continuous conversation.',
+    agentAssistant: 'New Agent Assistant',
+    completeApp: 'Text Generator',
+    completeAppIntro:
+      'I want to create an application that generates high-quality text based on prompts, such as generating articles, summaries, translations, and more.',
+    showTemplates: 'I want to choose from a template',
+    hideTemplates: 'Go back to mode selection',
+    Create: 'Create',
+    Cancel: 'Cancel',
+    Confirm: 'Confirm',
+    nameNotEmpty: 'Name cannot be empty',
+    appTemplateNotSelected: 'Please select a template',
+    appTypeRequired: 'Please select an app type',
+    appCreated: 'App created',
+    caution: 'Caution',
+    appCreateDSLWarning: 'Caution: DSL version difference may affect certain features',
+    appCreateDSLErrorTitle: 'Version Incompatibility',
+    appCreateDSLErrorPart1: 'A significant difference in DSL versions has been detected. Forcing the import may cause the application to malfunction.',
+    appCreateDSLErrorPart2: 'Do you want to continue?',
+    appCreateDSLErrorPart3: 'Current application DSL version: ',
+    appCreateDSLErrorPart4: 'System-supported DSL version: ',
+    appCreateFailed: 'Failed to create app',
+  },
+  newAppFromTemplate: {
+    byCategories: 'BY CATEGORIES',
+    searchAllTemplate: 'Search all templates...',
+    sidebar: {
+      Recommended: 'Recommended',
+      Agent: 'Agent',
+      Assistant: 'Assistant',
+      HR: 'HR',
+      Workflow: 'Workflow',
+      Writing: 'Writing',
+      Programming: 'Programming',
+    },
+  },
+  editApp: 'Edit Info',
+  editAppTitle: 'Edit App Info',
+  editDone: 'App info updated',
+  editFailed: 'Failed to update app info',
+  iconPicker: {
+    ok: 'OK',
+    cancel: 'Cancel',
+    emoji: 'Emoji',
+    image: 'Image',
+  },
+  answerIcon: {
+    title: 'Use WebApp icon to replace 馃',
+    description: 'Whether to use the WebApp icon to replace 馃 in the shared application',
+    descriptionInExplore: 'Whether to use the WebApp icon to replace 馃 in Explore',
+  },
+  switch: 'Switch to Workflow Orchestrate',
+  switchTipStart: 'A new app copy will be created for you, and the new copy will switch to Workflow Orchestrate. The new copy will ',
+  switchTip: 'not allow',
+  switchTipEnd: ' switching back to Basic Orchestrate.',
+  switchLabel: 'The app copy to be created',
+  removeOriginal: 'Delete the original app',
+  switchStart: 'Start switch',
+  openInExplore: 'Open in Explore',
+  typeSelector: {
+    all: 'All Types ',
+    chatbot: 'Chatbot',
+    agent: 'Agent',
+    workflow: 'Workflow',
+    completion: 'Completion',
+    advanced: 'Chatflow',
+  },
+  tracing: {
+    title: 'Tracing app performance',
+    description: 'Configuring a Third-Party LLMOps provider and tracing app performance.',
+    config: 'Config',
+    view: 'View',
+    collapse: 'Collapse',
+    expand: 'Expand',
+    tracing: 'Tracing',
+    disabled: 'Disabled',
+    disabledTip: 'Please config provider first',
+    enabled: 'In Service',
+    tracingDescription: 'Capture the full context of app execution, including LLM calls, context, prompts, HTTP requests, and more, to a third-party tracing platform.',
+    configProviderTitle: {
+      configured: 'Configured',
+      notConfigured: 'Config provider to enable tracing',
+      moreProvider: 'More Provider',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: 'An all-in-one developer platform for every step of the LLM-powered application lifecycle.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: 'Open-source LLM observability, evaluation, prompt management and metrics to debug and improve your LLM application.',
+    },
+    opik: {
+      title: 'Opik',
+      description: 'Opik is an open-source platform for evaluating, testing, and monitoring LLM applications.',
+    },
+    weave: {
+      title: 'Weave',
+      description: 'Weave is an open-source platform for evaluating, testing, and monitoring LLM applications.',
+    },
+    inUse: 'In use',
+    configProvider: {
+      title: 'Config ',
+      placeholder: 'Enter your {{key}}',
+      project: 'Project',
+      publicKey: 'Public Key',
+      secretKey: 'Secret Key',
+      viewDocsLink: 'View {{key}} docs',
+      removeConfirmTitle: 'Remove {{key}} configuration?',
+      removeConfirmContent: 'The current configuration is in use, removing it will turn off the Tracing feature.',
+    },
+  },
+  appSelector: {
+    label: 'APP',
+    placeholder: 'Select an app...',
+    params: 'APP PARAMETERS',
+    noParams: 'No parameters needed',
+  },
+  showMyCreatedAppsOnly: 'Created by me',
+  structOutput: {
+    moreFillTip: 'Showing max 10 levels of nesting',
+    required: 'Required',
+    LLMResponse: 'LLM Response',
+    configure: 'Configure',
+    notConfiguredTip: 'Structured output has not been configured yet',
+    structured: 'Structured',
+    structuredTip: 'Structured Outputs is a feature that ensures the model will always generate responses that adhere to your supplied JSON Schema',
+    modelNotSupported: 'Model not supported',
+    modelNotSupportedTip: 'The current model does not support this feature and is automatically downgraded to prompt injection.',
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/billing.ts b/i18n/en-US/billing.ts
new file mode 100644
index 0000000..57358dc
--- /dev/null
+++ b/i18n/en-US/billing.ts
@@ -0,0 +1,190 @@
+const translation = {
+  currentPlan: 'Current Plan',
+  usagePage: {
+    teamMembers: 'Team Members',
+    buildApps: 'Build Apps',
+    annotationQuota: 'Annotation Quota',
+    documentsUploadQuota: 'Documents Upload Quota',
+    vectorSpace: 'Knowledge Data Storage',
+    vectorSpaceTooltip: 'Documents with the High Quality indexing mode will consume Knowledge Data Storage resources. When Knowledge Data Storage reaches the limit, new documents will not be uploaded.',
+  },
+  teamMembers: 'Team Members',
+  upgradeBtn: {
+    plain: 'View Plan',
+    encourage: 'Upgrade Now',
+    encourageShort: 'Upgrade',
+  },
+  viewBilling: 'Manage billing and subscriptions',
+  buyPermissionDeniedTip: 'Please contact your enterprise administrator to subscribe',
+  plansCommon: {
+    title: 'Pricing that powers your AI journey',
+    freeTrialTipPrefix: 'Sign up and get a ',
+    freeTrialTip: 'free trial of 200 OpenAI calls. ',
+    freeTrialTipSuffix: 'No credit card required',
+    yearlyTip: 'Pay for 10 months, enjoy 1 Year!',
+    mostPopular: 'Popular',
+    cloud: 'Cloud Service',
+    self: 'Self-Hosted',
+    planRange: {
+      monthly: 'Monthly',
+      yearly: 'Yearly',
+    },
+    month: 'month',
+    year: 'year',
+    save: 'Save ',
+    free: 'Free',
+    annualBilling: 'Annual Billing',
+    comparePlanAndFeatures: 'Compare plans & features',
+    priceTip: 'per workspace/',
+    currentPlan: 'Current Plan',
+    contractSales: 'Contact sales',
+    contractOwner: 'Contact team manager',
+    startForFree: 'Start for Free',
+    getStarted: 'Get Started',
+    contactSales: 'Contact Sales',
+    talkToSales: 'Talk to Sales',
+    modelProviders: 'Support OpenAI/Anthropic/Llama2/Azure OpenAI/Hugging Face/Replicate',
+    teamWorkspace: '{{count,number}} Team Workspace',
+    teamMember_one: '{{count,number}} Team Member',
+    teamMember_other: '{{count,number}} Team Members',
+    annotationQuota: 'Annotation Quota',
+    buildApps: '{{count,number}} Apps',
+    documents: '{{count,number}} Knowledge Documents',
+    documentsTooltip: 'Quota on the number of documents imported from the Knowledge Data Source.',
+    vectorSpace: '{{size}} Knowledge Data Storage',
+    vectorSpaceTooltip: 'Documents with the High Quality indexing mode will consume Knowledge Data Storage resources. When Knowledge Data Storage reaches the limit, new documents will not be uploaded.',
+    documentsRequestQuota: '{{count,number}}/min Knowledge Request Rate Limit',
+    documentsRequestQuotaTooltip: 'Specifies the total number of actions a workspace can perform per minute within the knowledge base, including dataset creation, deletion, updates, document uploads, modifications, archiving, and knowledge base queries. This metric is used to evaluate the performance of knowledge base requests. For example, if a Sandbox user performs 10 consecutive hit tests within one minute, their workspace will be temporarily restricted from performing the following actions for the next minute: dataset creation, deletion, updates, and document uploads or modifications. ',
+    apiRateLimit: 'API Rate Limit',
+    apiRateLimitUnit: '{{count,number}}/day',
+    unlimitedApiRate: 'No API Rate Limit',
+    apiRateLimitTooltip: 'API Rate Limit applies to all requests made through the Dify API, including text generation, chat conversations, workflow executions, and document processing.',
+    documentProcessingPriority: ' Document Processing',
+    documentProcessingPriorityUpgrade: 'Process more data with higher accuracy at faster speeds.',
+    priority: {
+      'standard': 'Standard',
+      'priority': 'Priority',
+      'top-priority': 'Top Priority',
+    },
+    logsHistory: '{{days}} Log history',
+    customTools: 'Custom Tools',
+    unavailable: 'Unavailable',
+    days: 'Days',
+    unlimited: 'Unlimited',
+    support: 'Support',
+    supportItems: {
+      communityForums: 'Community forums',
+      emailSupport: 'Email support',
+      priorityEmail: 'Priority email & chat support',
+      logoChange: 'Logo change',
+      SSOAuthentication: 'SSO authentication',
+      personalizedSupport: 'Personalized support',
+      dedicatedAPISupport: 'Dedicated API support',
+      customIntegration: 'Custom integration and support',
+      ragAPIRequest: 'RAG API Requests',
+      bulkUpload: 'Bulk upload documents',
+      agentMode: 'Agent Mode',
+      workflow: 'Workflow',
+      llmLoadingBalancing: 'LLM Load Balancing',
+      llmLoadingBalancingTooltip: 'Add multiple API keys to models, effectively bypassing the API rate limits. ',
+    },
+    comingSoon: 'Coming soon',
+    member: 'Member',
+    memberAfter: 'Member',
+    messageRequest: {
+      title: '{{count,number}} messages',
+      titlePerMonth: '{{count,number}} messages/month',
+      tooltip: 'Message invocation quotas for various plans using OpenAl models. Messages over the limit will use your OpenAI API Key.',
+    },
+    annotatedResponse: {
+      title: '{{count,number}} Annotation Quota Limits',
+      tooltip: 'Manual editing and annotation of responses provides customizable high-quality question-answering abilities for apps. (Applicable only in Chat apps)',
+    },
+    ragAPIRequestTooltip: 'Refers to the number of API calls invoking only the knowledge base processing capabilities of Dify.',
+    receiptInfo: 'Only team owner and team admin can subscribe and view billing information',
+  },
+  plans: {
+    sandbox: {
+      name: 'Sandbox',
+      for: 'Free Trial of Core Capabilities',
+      description: 'Free Trial of Core Capabilities',
+    },
+    professional: {
+      name: 'Professional',
+      for: 'For Independent Developers/Small Teams',
+      description: 'For Independent Developers/Small Teams',
+    },
+    team: {
+      name: 'Team',
+      for: 'For Medium-sized Teams',
+      description: 'For Medium-sized Teams',
+    },
+    community: {
+      name: 'Community',
+      for: 'For Individual Users, Small Teams, or Non-commercial Projects',
+      description: 'For Individual Users, Small Teams, or Non-commercial Projects',
+      price: 'Free',
+      btnText: 'Get Started with Community',
+      includesTitle: 'Free Features:',
+      features: [
+        'All Core Features Released Under the Public Repository',
+        'Single Workspace',
+        'Complies with Dify Open Source License',
+      ],
+    },
+    premium: {
+      name: 'Premium',
+      for: 'For Mid-sized Organizations and Teams',
+      description: 'For Mid-sized Organizations and Teams',
+      price: 'Scalable',
+      priceTip: 'Based on Cloud Marketplace',
+      btnText: 'Get Premium in',
+      includesTitle: 'Everything from Community, plus:',
+      comingSoon: 'Microsoft Azure & Google Cloud Support Coming Soon',
+      features: [
+        'Self-managed Reliability by Various Cloud Providers',
+        'Single Workspace',
+        'WebApp Logo & Branding Customization',
+        'Priority Email & Chat Support',
+      ],
+    },
+    enterprise: {
+      name: 'Enterprise',
+      for: 'For large-sized Teams',
+      description: 'For Enterprise Require Organization-wide Security, Compliance, Scalability, Control and More Advanced Features',
+      price: 'Custom',
+      priceTip: 'Annual Billing Only',
+      btnText: 'Contact Sales',
+      includesTitle: 'Everything from Premium, plus:',
+      features: [
+        'Enterprise-grade Scalable Deployment Solutions',
+        'Commercial License Authorization',
+        'Exclusive Enterprise Features',
+        'Multiple Workspaces & Enterprise Management',
+        'SSO',
+        'Negotiated SLAs by Dify Partners',
+        'Advanced Security & Controls',
+        'Updates and Maintenance by Dify Officially',
+        'Professional Technical Support',
+      ],
+    },
+  },
+  vectorSpace: {
+    fullTip: 'Vector Space is full.',
+    fullSolution: 'Upgrade your plan to get more space.',
+  },
+  apps: {
+    fullTip1: 'Upgrade to create more apps',
+    fullTip1des: 'You\'ve reached the limit of build apps on this plan',
+    fullTip2: 'Plan limit reached',
+    fullTip2des: 'It is recommended to clean up inactive applications to free up usage, or contact us.',
+    contactUs: 'Contact us',
+  },
+  annotatedResponse: {
+    fullTipLine1: 'Upgrade your plan to',
+    fullTipLine2: 'annotate more conversations.',
+    quotaTitle: 'Annotation Reply Quota',
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/common.ts b/i18n/en-US/common.ts
new file mode 100644
index 0000000..b194f6e
--- /dev/null
+++ b/i18n/en-US/common.ts
@@ -0,0 +1,671 @@
+const translation = {
+  theme: {
+    theme: 'Theme',
+    light: 'light',
+    dark: 'dark',
+    auto: 'system',
+  },
+  api: {
+    success: 'Success',
+    actionSuccess: 'Action succeeded',
+    saved: 'Saved',
+    create: 'Created',
+    remove: 'Removed',
+  },
+  operation: {
+    create: 'Create',
+    confirm: 'Confirm',
+    cancel: 'Cancel',
+    clear: 'Clear',
+    save: 'Save',
+    saveAndEnable: 'Save & Enable',
+    edit: 'Edit',
+    add: 'Add',
+    added: 'Added',
+    refresh: 'Restart',
+    reset: 'Reset',
+    search: 'Search',
+    change: 'Change',
+    remove: 'Remove',
+    send: 'Send',
+    copy: 'Copy',
+    copied: 'Copied',
+    lineBreak: 'Line break',
+    sure: 'I\'m sure',
+    download: 'Download',
+    downloadSuccess: 'Download Completed.',
+    downloadFailed: 'Download failed. Please try again later.',
+    viewDetails: 'View Details',
+    delete: 'Delete',
+    deleteApp: 'Delete App',
+    settings: 'Settings',
+    setup: 'Setup',
+    getForFree: 'Get for free',
+    reload: 'Reload',
+    ok: 'OK',
+    log: 'Log',
+    learnMore: 'Learn More',
+    params: 'Params',
+    duplicate: 'Duplicate',
+    rename: 'Rename',
+    audioSourceUnavailable: 'AudioSource is unavailable',
+    close: 'Close',
+    copyImage: 'Copy Image',
+    imageCopied: 'Image copied',
+    zoomOut: 'Zoom Out',
+    zoomIn: 'Zoom In',
+    openInNewTab: 'Open in new tab',
+    in: 'in',
+    saveAndRegenerate: 'Save & Regenerate Child Chunks',
+    view: 'View',
+    viewMore: 'VIEW MORE',
+    regenerate: 'Regenerate',
+    submit: 'Submit',
+    skip: 'Skip',
+    format: 'Format',
+    more: 'More',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} is required',
+    urlError: 'url should start with http:// or https://',
+  },
+  placeholder: {
+    input: 'Please enter',
+    select: 'Please select',
+  },
+  voice: {
+    language: {
+      zhHans: 'Chinese',
+      zhHant: 'Traditional Chinese',
+      enUS: 'English',
+      deDE: 'German',
+      frFR: 'French',
+      esES: 'Spanish',
+      itIT: 'Italian',
+      thTH: 'Thai',
+      idID: 'Indonesian',
+      jaJP: 'Japanese',
+      koKR: 'Korean',
+      ptBR: 'Portuguese',
+      ruRU: 'Russian',
+      ukUA: 'Ukrainian',
+      viVN: 'Vietnamese',
+      plPL: 'Polish',
+      roRO: 'Romanian',
+      hiIN: 'Hindi',
+      trTR: 'T眉rk莽e',
+      faIR: 'Farsi',
+    },
+  },
+  unit: {
+    char: 'chars',
+  },
+  actionMsg: {
+    noModification: 'No modifications at the moment.',
+    modifiedSuccessfully: 'Modified successfully',
+    modifiedUnsuccessfully: 'Modified unsuccessfully',
+    copySuccessfully: 'Copied successfully',
+    paySucceeded: 'Payment succeeded',
+    payCancelled: 'Payment cancelled',
+    generatedSuccessfully: 'Generated successfully',
+    generatedUnsuccessfully: 'Generated unsuccessfully',
+  },
+  model: {
+    params: {
+      temperature: 'Temperature',
+      temperatureTip:
+        'Controls randomness: Lowering results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive.',
+      top_p: 'Top P',
+      top_pTip:
+        'Controls diversity via nucleus sampling: 0.5 means half of all likelihood-weighted options are considered.',
+      presence_penalty: 'Presence penalty',
+      presence_penaltyTip:
+        'How much to penalize new tokens based on whether they appear in the text so far.\nIncreases the model\'s likelihood to talk about new topics.',
+      frequency_penalty: 'Frequency penalty',
+      frequency_penaltyTip:
+        'How much to penalize new tokens based on their existing frequency in the text so far.\nDecreases the model\'s likelihood to repeat the same line verbatim.',
+      max_tokens: 'Max token',
+      max_tokensTip:
+        'Used to limit the maximum length of the reply, in tokens. \nLarger values may limit the space left for prompt words, chat logs, and Knowledge. \nIt is recommended to set it below two-thirds\ngpt-4-1106-preview, gpt-4-vision-preview max token (input 128k output 4k)',
+      maxTokenSettingTip: 'Your max token setting is high, potentially limiting space for prompts, queries, and data. Consider setting it below 2/3.',
+      setToCurrentModelMaxTokenTip: 'Max token is updated to the 80% maximum token of the current model {{maxToken}}.',
+      stop_sequences: 'Stop sequences',
+      stop_sequencesTip: 'Up to four sequences where the API聽will stop generating further tokens. The聽returned text will not contain the stop聽sequence.',
+      stop_sequencesPlaceholder: 'Enter sequence and press Tab',
+    },
+    tone: {
+      Creative: 'Creative',
+      Balanced: 'Balanced',
+      Precise: 'Precise',
+      Custom: 'Custom',
+    },
+    addMoreModel: 'Go to settings to add more models',
+    settingsLink: 'Model Provider Settings',
+    capabilities: 'MultiModal Capabilities',
+  },
+  menus: {
+    status: 'beta',
+    explore: 'Explore',
+    apps: 'Studio',
+    plugins: 'Plugins',
+    exploreMarketplace: 'Explore Marketplace',
+    pluginsTips: 'Integrate third-party plugins or create ChatGPT-compatible AI-Plugins.',
+    datasets: 'Knowledge',
+    datasetsTips: 'COMING SOON: Import your own text data or write data in real-time via Webhook for LLM context enhancement.',
+    newApp: 'New App',
+    newDataset: 'Create Knowledge',
+    tools: 'Tools',
+  },
+  userProfile: {
+    settings: 'Settings',
+    emailSupport: 'Email Support',
+    workspace: 'Workspace',
+    createWorkspace: 'Create Workspace',
+    helpCenter: 'Docs',
+    support: 'Support',
+    compliance: 'Compliance',
+    communityFeedback: 'Feedback',
+    roadmap: 'Roadmap',
+    github: 'GitHub',
+    community: 'Community',
+    about: 'About',
+    logout: 'Log out',
+  },
+  compliance: {
+    soc2Type1: 'SOC 2 Type I Report',
+    soc2Type2: 'SOC 2 Type II Report',
+    iso27001: 'ISO 27001:2022 Certification',
+    gdpr: 'GDPR DPA',
+    sandboxUpgradeTooltip: 'Only available with a Professional or Team plan.',
+    professionalUpgradeTooltip: 'Only available with a Team plan or above.',
+  },
+  settings: {
+    accountGroup: 'GENERAL',
+    workplaceGroup: 'WORKSPACE',
+    generalGroup: 'GENERAL',
+    account: 'My account',
+    members: 'Members',
+    billing: 'Billing',
+    integrations: 'Integrations',
+    language: 'Language',
+    provider: 'Model Provider',
+    dataSource: 'Data Source',
+    plugin: 'Plugins',
+    apiBasedExtension: 'API Extension',
+  },
+  account: {
+    account: 'Account',
+    myAccount: 'My Account',
+    studio: 'Dify Studio',
+    avatar: 'Avatar',
+    name: 'Name',
+    email: 'Email',
+    password: 'Password',
+    passwordTip: 'You can set a permanent password if you don鈥檛 want to use temporary login codes',
+    setPassword: 'Set a password',
+    resetPassword: 'Reset password',
+    currentPassword: 'Current password',
+    newPassword: 'New password',
+    confirmPassword: 'Confirm password',
+    notEqual: 'Two passwords are different.',
+    langGeniusAccount: 'Dify account',
+    langGeniusAccountTip: 'Your Dify account and associated user data.',
+    editName: 'Edit Name',
+    showAppLength: 'Show {{length}} apps',
+    delete: 'Delete Account',
+    deleteTip: 'Please note, once confirmed, as the Owner of any Workspaces, your workspaces will be scheduled in a queue for permanent deletion, and all your user data will be queued for permanent deletion.',
+    deletePrivacyLinkTip: 'For more information about how we handle your data, please see our ',
+    deletePrivacyLink: 'Privacy Policy.',
+    deleteSuccessTip: 'Your account needs time to finish deleting. We\'ll email you when it\'s all done.',
+    deleteLabel: 'To confirm, please type in your email below',
+    deletePlaceholder: 'Please enter your email',
+    sendVerificationButton: 'Send Verification Code',
+    verificationLabel: 'Verification Code',
+    verificationPlaceholder: 'Paste the 6-digit code',
+    permanentlyDeleteButton: 'Permanently Delete Account',
+    feedbackTitle: 'Feedback',
+    feedbackLabel: 'Tell us why you deleted your account?',
+    feedbackPlaceholder: 'Optional',
+    editWorkspaceInfo: 'Edit Workspace Info',
+    workspaceName: 'Workspace Name',
+    workspaceIcon: 'Workspace Icon',
+  },
+  members: {
+    team: 'Team',
+    invite: 'Add',
+    name: 'NAME',
+    lastActive: 'LAST ACTIVE',
+    role: 'ROLES',
+    pending: 'Pending...',
+    owner: 'Owner',
+    admin: 'Admin',
+    adminTip: 'Can build apps & manage team settings',
+    normal: 'Normal',
+    normalTip: 'Only can use apps, can not build apps',
+    builder: 'Builder',
+    builderTip: 'Can build & edit own apps',
+    editor: 'Editor',
+    editorTip: 'Can build & edit apps',
+    datasetOperator: 'Knowledge Admin',
+    datasetOperatorTip: 'Only can manage the knowledge base',
+    inviteTeamMember: 'Add team member',
+    inviteTeamMemberTip: 'They can access your team data directly after signing in.',
+    emailNotSetup: 'Email server is not set up, so invitation emails cannot be sent. Please notify users of the invitation link that will be issued after invitation instead.',
+    email: 'Email',
+    emailInvalid: 'Invalid Email Format',
+    emailPlaceholder: 'Please input emails',
+    sendInvite: 'Send Invite',
+    invitedAsRole: 'Invited as {{role}} user',
+    invitationSent: 'Invitation sent',
+    invitationSentTip: 'Invitation sent, and they can sign in to Dify to access your team data.',
+    invitationLink: 'Invitation Link',
+    failedInvitationEmails: 'Below users were not invited successfully',
+    ok: 'OK',
+    removeFromTeam: 'Remove from team',
+    removeFromTeamTip: 'Will remove team access',
+    setAdmin: 'Set as administrator',
+    setMember: 'Set to ordinary member',
+    setBuilder: 'Set as builder',
+    setEditor: 'Set as editor',
+    disInvite: 'Cancel the invitation',
+    deleteMember: 'Delete Member',
+    you: '(You)',
+  },
+  integrations: {
+    connected: 'Connected',
+    google: 'Google',
+    googleAccount: 'Login with Google account',
+    github: 'GitHub',
+    githubAccount: 'Login with GitHub account',
+    connect: 'Connect',
+  },
+  language: {
+    displayLanguage: 'Display Language',
+    timezone: 'Time Zone',
+  },
+  provider: {
+    apiKey: 'API Key',
+    enterYourKey: 'Enter your API key here',
+    invalidKey: 'Invalid OpenAI API key',
+    validatedError: 'Validation failed: ',
+    validating: 'Validating key...',
+    saveFailed: 'Save api key failed',
+    apiKeyExceedBill: 'This API KEY has no quota available, please read',
+    addKey: 'Add Key',
+    comingSoon: 'Coming Soon',
+    editKey: 'Edit',
+    invalidApiKey: 'Invalid API key',
+    azure: {
+      apiBase: 'API Base',
+      apiBasePlaceholder: 'The API Base URL of your Azure OpenAI Endpoint.',
+      apiKey: 'API Key',
+      apiKeyPlaceholder: 'Enter your API key here',
+      helpTip: 'Learn Azure OpenAI Service',
+    },
+    openaiHosted: {
+      openaiHosted: 'Hosted OpenAI',
+      onTrial: 'ON TRIAL',
+      exhausted: 'QUOTA EXHAUSTED',
+      desc: 'The OpenAI hosting service provided by Dify allows you to use models such as GPT-3.5. Before your trial quota is used up, you need to set up other model providers.',
+      callTimes: 'Call times',
+      usedUp: 'Trial quota used up. Add own Model Provider.',
+      useYourModel: 'Currently using own Model Provider.',
+      close: 'Close',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: 'ON TRIAL',
+      exhausted: 'QUOTA EXHAUSTED',
+      desc: 'Powerful model, which excels at a wide range of tasks from sophisticated dialogue and creative content generation to detailed instruction.',
+      callTimes: 'Call times',
+      usedUp: 'Trial quota used up. Add own Model Provider.',
+      useYourModel: 'Currently using own Model Provider.',
+      close: 'Close',
+      trialQuotaTip: 'Your Anthropic trial quota will expire on 2025/03/17 and will no longer be available thereafter. Please make use of it in time.',
+    },
+    anthropic: {
+      using: 'The embedding capability is using',
+      enableTip: 'To enable the Anthropic model, you need to bind to OpenAI or Azure OpenAI Service first.',
+      notEnabled: 'Not enabled',
+      keyFrom: 'Get your API key from Anthropic',
+    },
+    encrypted: {
+      front: 'Your API KEY will be encrypted and stored using',
+      back: ' technology.',
+    },
+  },
+  modelProvider: {
+    notConfigured: 'The system model has not yet been fully configured',
+    systemModelSettings: 'System Model Settings',
+    systemModelSettingsLink: 'Why is it necessary to set up a system model?',
+    selectModel: 'Select your model',
+    setupModelFirst: 'Please set up your model first',
+    systemReasoningModel: {
+      key: 'System Reasoning Model',
+      tip: 'Set the default inference model to be used for creating applications, as well as features such as dialogue name generation and next question suggestion will also use the default inference model.',
+    },
+    embeddingModel: {
+      key: 'Embedding Model',
+      tip: 'Set the default model for document embedding processing of the Knowledge, both retrieval and import of the Knowledge use this Embedding model for vectorization processing. Switching will cause the vector dimension between the imported Knowledge and the question to be inconsistent, resulting in retrieval failure. To avoid retrieval failure, please do not switch this model at will.',
+      required: 'Embedding Model is required',
+    },
+    speechToTextModel: {
+      key: 'Speech-to-Text Model',
+      tip: 'Set the default model for speech-to-text input in conversation.',
+    },
+    ttsModel: {
+      key: 'Text-to-Speech Model',
+      tip: 'Set the default model for text-to-speech input in conversation.',
+    },
+    rerankModel: {
+      key: 'Rerank Model',
+      tip: 'Rerank model will reorder the candidate document list based on the semantic match with  user query, improving the results of semantic ranking',
+    },
+    apiKey: 'API-KEY',
+    quota: 'Quota',
+    searchModel: 'Search model',
+    noModelFound: 'No model found for {{model}}',
+    models: 'Models',
+    showMoreModelProvider: 'Show more model provider',
+    selector: {
+      tip: 'This model has been removed. Please add a model or select another model.',
+      emptyTip: 'No available models',
+      emptySetting: 'Please go to settings to configure',
+      rerankTip: 'Please set up the Rerank model',
+    },
+    card: {
+      quota: 'QUOTA',
+      onTrial: 'On Trial',
+      paid: 'Paid',
+      quotaExhausted: 'Quota exhausted',
+      callTimes: 'Call times',
+      tokens: 'Tokens',
+      buyQuota: 'Buy Quota',
+      priorityUse: 'Priority use',
+      removeKey: 'Remove API Key',
+      tip: 'Priority will be given to the paid quota. The Trial quota will be used after the paid quota is exhausted.',
+    },
+    item: {
+      deleteDesc: '{{modelName}} are being used as system reasoning models. Some functions will not be available after removal. Please confirm.',
+      freeQuota: 'FREE QUOTA',
+    },
+    addApiKey: 'Add your API key',
+    invalidApiKey: 'Invalid API key',
+    encrypted: {
+      front: 'Your API KEY will be encrypted and stored using',
+      back: ' technology.',
+    },
+    freeQuota: {
+      howToEarn: 'How to earn',
+    },
+    addMoreModelProvider: 'ADD MORE MODEL PROVIDER',
+    addModel: 'Add Model',
+    modelsNum: '{{num}} Models',
+    showModels: 'Show Models',
+    showModelsNum: 'Show {{num}} Models',
+    collapse: 'Collapse',
+    config: 'Config',
+    modelAndParameters: 'Model and Parameters',
+    model: 'Model',
+    featureSupported: '{{feature}} supported',
+    callTimes: 'Call times',
+    credits: 'Message Credits',
+    buyQuota: 'Buy Quota',
+    getFreeTokens: 'Get free Tokens',
+    priorityUsing: 'Prioritize using',
+    deprecated: 'Deprecated',
+    confirmDelete: 'Confirm deletion?',
+    quotaTip: 'Remaining available free tokens',
+    loadPresets: 'Load Presets',
+    parameters: 'PARAMETERS',
+    loadBalancing: 'Load balancing',
+    loadBalancingDescription: 'Reduce pressure with multiple sets of credentials.',
+    loadBalancingHeadline: 'Load Balancing',
+    configLoadBalancing: 'Config Load Balancing',
+    modelHasBeenDeprecated: 'This model has been deprecated',
+    providerManaged: 'Provider managed',
+    providerManagedDescription: 'Use the single set of credentials provided by the model provider.',
+    defaultConfig: 'Default Config',
+    apiKeyStatusNormal: 'APIKey status is normal',
+    apiKeyRateLimit: 'Rate limit was reached, available after {{seconds}}s',
+    addConfig: 'Add Config',
+    editConfig: 'Edit Config',
+    loadBalancingLeastKeyWarning: 'To enable load balancing at least 2 keys must be enabled.',
+    loadBalancingInfo: 'By default, load balancing uses the Round-robin strategy. If rate limiting is triggered, a 1-minute cooldown period will be applied.',
+    upgradeForLoadBalancing: 'Upgrade your plan to enable Load Balancing.',
+    toBeConfigured: 'To be configured',
+    configureTip: 'Set up api-key or add model to use',
+    installProvider: 'Install model providers',
+    discoverMore: 'Discover more in ',
+    emptyProviderTitle: 'Model provider not set up',
+    emptyProviderTip: 'Please install a model provider first.',
+  },
+  dataSource: {
+    add: 'Add a data source',
+    connect: 'Connect',
+    configure: 'Configure',
+    notion: {
+      title: 'Notion',
+      description: 'Using Notion as a data source for the Knowledge.',
+      connectedWorkspace: 'Connected workspace',
+      addWorkspace: 'Add workspace',
+      connected: 'Connected',
+      disconnected: 'Disconnected',
+      changeAuthorizedPages: 'Change authorized pages',
+      pagesAuthorized: 'Pages authorized',
+      sync: 'Sync',
+      remove: 'Remove',
+      selector: {
+        pageSelected: 'Pages Selected',
+        searchPages: 'Search pages...',
+        noSearchResult: 'No search results',
+        addPages: 'Add pages',
+        preview: 'PREVIEW',
+      },
+    },
+    website: {
+      title: 'Website',
+      description: 'Import content from websites using web crawler.',
+      with: 'With',
+      configuredCrawlers: 'Configured crawlers',
+      active: 'Active',
+      inactive: 'Inactive',
+    },
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'API Key',
+      apiKeyPlaceholder: 'Enter your API key',
+      keyFrom: 'Get your SerpAPI key from SerpAPI Account Page',
+    },
+  },
+  apiBasedExtension: {
+    title: 'API extensions provide centralized API management, simplifying configuration for easy use across Dify\'s applications.',
+    link: 'Learn how to develop your own API Extension.',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: 'Add API Extension',
+    selector: {
+      title: 'API Extension',
+      placeholder: 'Please select API extension',
+      manage: 'Manage API Extension',
+    },
+    modal: {
+      title: 'Add API Extension',
+      editTitle: 'Edit API Extension',
+      name: {
+        title: 'Name',
+        placeholder: 'Please enter the name',
+      },
+      apiEndpoint: {
+        title: 'API Endpoint',
+        placeholder: 'Please enter the API endpoint',
+      },
+      apiKey: {
+        title: 'API-key',
+        placeholder: 'Please enter the API-key',
+        lengthError: 'API-key length cannot be less than 5 characters',
+      },
+    },
+    type: 'Type',
+  },
+  about: {
+    changeLog: 'Changelog',
+    updateNow: 'Update now',
+    nowAvailable: 'Dify {{version}} is now available.',
+    latestAvailable: 'Dify {{version}} is the latest version available.',
+  },
+  appMenus: {
+    overview: 'Monitoring',
+    promptEng: 'Orchestrate',
+    apiAccess: 'API Access',
+    logAndAnn: 'Logs & Annotations',
+    logs: 'Logs',
+  },
+  environment: {
+    testing: 'TESTING',
+    development: 'DEVELOPMENT',
+  },
+  appModes: {
+    completionApp: 'Text Generator',
+    chatApp: 'Chat App',
+  },
+  datasetMenus: {
+    documents: 'Documents',
+    hitTesting: 'Retrieval Testing',
+    settings: 'Settings',
+    emptyTip: 'This Knowledge has not been integrated within any application. Please refer to the document for guidance.',
+    viewDoc: 'View documentation',
+    relatedApp: 'linked apps',
+    noRelatedApp: 'No linked apps',
+  },
+  voiceInput: {
+    speaking: 'Speak now...',
+    converting: 'Converting to text...',
+    notAllow: 'microphone not authorized',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: 'Rename Conversation',
+    conversationName: 'Conversation name',
+    conversationNamePlaceholder: 'Please input conversation name',
+    conversationNameCanNotEmpty: 'Conversation name required',
+    citation: {
+      title: 'CITATIONS',
+      linkToDataset: 'Link to Knowledge',
+      characters: 'Characters:',
+      hitCount: 'Retrieval count:',
+      vectorHash: 'Vector hash:',
+      hitScore: 'Retrieval Score:',
+    },
+    inputPlaceholder: 'Talk to Bot',
+    thinking: 'Thinking...',
+    thought: 'Thought',
+    resend: 'Resend',
+  },
+  promptEditor: {
+    placeholder: 'Write your prompt word here, enter \'{\' to insert a variable, enter \'/\' to insert a prompt content block',
+    context: {
+      item: {
+        title: 'Context',
+        desc: 'Insert context template',
+      },
+      modal: {
+        title: '{{num}} Knowledge in Context',
+        add: 'Add Context ',
+        footer: 'You can manage contexts in the Context section below.',
+      },
+    },
+    history: {
+      item: {
+        title: 'Conversation History',
+        desc: 'Insert historical message template',
+      },
+      modal: {
+        title: 'EXAMPLE',
+        user: 'Hello',
+        assistant: 'Hello! How can I assist you today?',
+        edit: 'Edit Conversation Role Names',
+      },
+    },
+    variable: {
+      item: {
+        title: 'Variables & External Tools',
+        desc: 'Insert Variables & External Tools',
+      },
+      outputToolDisabledItem: {
+        title: 'Variables',
+        desc: 'Insert Variables',
+      },
+      modal: {
+        add: 'New variable',
+        addTool: 'New tool',
+      },
+    },
+    query: {
+      item: {
+        title: 'Query',
+        desc: 'Insert user query template',
+      },
+    },
+    existed: 'Already exists in the prompt',
+  },
+  imageUploader: {
+    uploadFromComputer: 'Upload from Computer',
+    uploadFromComputerReadError: 'Image reading failed, please try again.',
+    uploadFromComputerUploadError: 'Image upload failed, please upload again.',
+    uploadFromComputerLimit: 'Upload images cannot exceed {{size}} MB',
+    pasteImageLink: 'Paste image link',
+    pasteImageLinkInputPlaceholder: 'Paste image link here',
+    pasteImageLinkInvalid: 'Invalid image link',
+    imageUpload: 'Image Upload',
+  },
+  fileUploader: {
+    uploadFromComputer: 'Local upload',
+    pasteFileLink: 'Paste file link',
+    pasteFileLinkInputPlaceholder: 'Enter URL...',
+    uploadFromComputerReadError: 'File reading failed, please try again.',
+    uploadFromComputerUploadError: 'File upload failed, please upload again.',
+    uploadFromComputerLimit: 'Upload {{type}} cannot exceed {{size}}',
+    pasteFileLinkInvalid: 'Invalid file link',
+    fileExtensionNotSupport: 'File extension not supported',
+  },
+  tag: {
+    placeholder: 'All Tags',
+    addNew: 'Add new tag',
+    noTag: 'No tags',
+    noTagYet: 'No tags yet',
+    addTag: 'Add tags',
+    editTag: 'Edit tags',
+    manageTags: 'Manage Tags',
+    selectorPlaceholder: 'Type to search or create',
+    create: 'Create',
+    delete: 'Delete tag',
+    deleteTip: 'The tag is being used, delete it?',
+    created: 'Tag created successfully',
+    failed: 'Tag creation failed',
+  },
+  license: {
+    expiring: 'Expiring in one day',
+    expiring_plural: 'Expiring in {{count}} days',
+  },
+  pagination: {
+    perPage: 'Items per page',
+  },
+  imageInput: {
+    dropImageHere: 'Drop your image here, or',
+    browse: 'browse',
+    supportedFormats: 'Supports PNG, JPG, JPEG, WEBP and GIF',
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/custom.ts b/i18n/en-US/custom.ts
new file mode 100644
index 0000000..408d4c5
--- /dev/null
+++ b/i18n/en-US/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: 'Customization',
+  upgradeTip: {
+    title: 'Upgrade your plan',
+    des: 'Upgrade your plan to customize your brand',
+    prefix: 'Upgrade your plan to',
+    suffix: 'customize your brand.',
+  },
+  webapp: {
+    title: 'Customize WebApp brand',
+    removeBrand: 'Remove Powered by Dify',
+    changeLogo: 'Change Powered by Brand Image',
+    changeLogoTip: 'SVG or PNG format with a minimum size of 40x40px',
+  },
+  app: {
+    title: 'Customize app header brand',
+    changeLogoTip: 'SVG or PNG format with a minimum size of 80x80px',
+  },
+  upload: 'Upload',
+  uploading: 'Uploading',
+  uploadedFail: 'Image upload failed, please re-upload.',
+  change: 'Change',
+  apply: 'Apply',
+  restore: 'Restore Defaults',
+  customize: {
+    contactUs: ' contact us ',
+    prefix: 'To customize the brand logo within the app, please',
+    suffix: 'to upgrade to the Enterprise edition.',
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/dataset-creation.ts b/i18n/en-US/dataset-creation.ts
new file mode 100644
index 0000000..cf2d454
--- /dev/null
+++ b/i18n/en-US/dataset-creation.ts
@@ -0,0 +1,216 @@
+const translation = {
+  steps: {
+    header: {
+      fallbackRoute: 'Knowledge',
+    },
+    one: 'Data Source',
+    two: 'Document Processing',
+    three: 'Execute & Finish',
+  },
+  error: {
+    unavailable: 'This Knowledge is not available',
+  },
+  firecrawl: {
+    configFirecrawl: 'Configure 馃敟Firecrawl',
+    apiKeyPlaceholder: 'API key from firecrawl.dev',
+    getApiKeyLinkText: 'Get your API key from firecrawl.dev',
+  },
+  watercrawl: {
+    configWatercrawl: 'Configure Watercrawl',
+    apiKeyPlaceholder: 'API key from watercrawl.dev',
+    getApiKeyLinkText: 'Get your API key from watercrawl.dev',
+  },
+  jinaReader: {
+    configJinaReader: 'Configure Jina Reader',
+    apiKeyPlaceholder: 'API key from jina.ai',
+    getApiKeyLinkText: 'Get your free API key at jina.ai',
+  },
+  stepOne: {
+    filePreview: 'File Preview',
+    pagePreview: 'Page Preview',
+    dataSourceType: {
+      file: 'Import from file',
+      notion: 'Sync from Notion',
+      web: 'Sync from website',
+    },
+    uploader: {
+      title: 'Upload file',
+      button: 'Drag and drop file or folder, or',
+      browse: 'Browse',
+      tip: 'Supports {{supportTypes}}. Max {{size}}MB each.',
+      validation: {
+        typeError: 'File type not supported',
+        size: 'File too large. Maximum is {{size}}MB',
+        count: 'Multiple files not supported',
+        filesNumber: 'You have reached the batch upload limit of {{filesNumber}}.',
+      },
+      cancel: 'Cancel',
+      change: 'Change',
+      failed: 'Upload failed',
+    },
+    notionSyncTitle: 'Notion is not connected',
+    notionSyncTip: 'To sync with Notion, connection to Notion must be established first.',
+    connect: 'Go to connect',
+    cancel: 'Cancel',
+    button: 'Next',
+    emptyDatasetCreation: 'I want to create an empty Knowledge',
+    modal: {
+      title: 'Create an empty Knowledge',
+      tip: 'An empty Knowledge will contain no documents, and you can upload documents any time.',
+      input: 'Knowledge name',
+      placeholder: 'Please input',
+      nameNotEmpty: 'Name cannot be empty',
+      nameLengthInvalid: 'Name must be between 1 to 40 characters',
+      cancelButton: 'Cancel',
+      confirmButton: 'Create',
+      failed: 'Creation failed',
+    },
+    website: {
+      chooseProvider: 'Select a provider',
+      fireCrawlNotConfigured: 'Firecrawl is not configured',
+      fireCrawlNotConfiguredDescription: 'Configure Firecrawl with API key to use it.',
+      jinaReaderNotConfigured: 'Jina Reader is not configured',
+      jinaReaderNotConfiguredDescription: 'Set up Jina Reader by entering your free API key for access.',
+      waterCrawlNotConfigured: 'Watercrawl is not configured',
+      waterCrawlNotConfiguredDescription: 'Configure Watercrawl with API key to use it.',
+      configure: 'Configure',
+      configureFirecrawl: 'Configure Firecrawl',
+      configureWatercrawl: 'Configure Watercrawl',
+      configureJinaReader: 'Configure Jina Reader',
+      run: 'Run',
+      firecrawlTitle: 'Extract web content with 馃敟Firecrawl',
+      firecrawlDoc: 'Firecrawl docs',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      watercrawlTitle: 'Extract web content with Watercrawl',
+      watercrawlDoc: 'Watercrawl docs',
+      watercrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      jinaReaderTitle: 'Convert the entire site to Markdown',
+      jinaReaderDoc: 'Learn more about Jina Reader',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      useSitemap: 'Use sitemap',
+      useSitemapTooltip: 'Follow the sitemap to crawl the site. If not, Jina Reader will crawl iteratively based on page relevance, yielding fewer but higher-quality pages.',
+      options: 'Options',
+      crawlSubPage: 'Crawl sub-pages',
+      limit: 'Limit',
+      maxDepth: 'Max depth',
+      excludePaths: 'Exclude paths',
+      includeOnlyPaths: 'Include only paths',
+      extractOnlyMainContent: 'Extract only main content (no headers, navs, footers, etc.)',
+      exceptionErrorTitle: 'An exception occurred while running crawling job:',
+      unknownError: 'Unknown error',
+      totalPageScraped: 'Total pages scraped:',
+      selectAll: 'Select All',
+      resetAll: 'Reset All',
+      scrapTimeInfo: 'Scraped {{total}} pages in total within {{time}}s',
+      preview: 'Preview',
+      maxDepthTooltip: 'Maximum depth to crawl relative to the entered URL. Depth 0 just scrapes the page of the entered url, depth 1 scrapes the url and everything after enteredURL + one /, and so on.',
+    },
+  },
+  stepTwo: {
+    segmentation: 'Chunk Settings',
+    auto: 'Automatic',
+    autoDescription: 'Automatically set chunk and preprocessing rules. Unfamiliar users are recommended to select this.',
+    custom: 'Custom',
+    customDescription: 'Customize chunks rules, chunks length, and preprocessing rules, etc.',
+    general: 'General',
+    generalTip: 'General text chunking mode, the chunks retrieved and recalled are the same.',
+    parentChild: 'Parent-child',
+    parentChildTip: 'When using the parent-child mode, the child-chunk is used for retrieval and the parent-chunk is used for recall as context.',
+    parentChunkForContext: 'Parent-chunk for Context',
+    childChunkForRetrieval: 'Child-chunk for Retrieval',
+    paragraph: 'Paragraph',
+    paragraphTip: 'This mode splits the text in to paragraphs based on delimiters and the maximum chunk length, using the split text as the parent chunk for retrieval.',
+    fullDoc: 'Full Doc',
+    fullDocTip: 'The entire document is used as the parent chunk and retrieved directly. Please note that for performance reasons, text exceeding 10000 tokens will be automatically truncated.',
+    separator: 'Delimiter',
+    separatorTip: 'A delimiter is the character used to separate text. \\n\\n and \\n are commonly used delimiters for separating paragraphs and lines. Combined with commas (\\n\\n,\\n), paragraphs will be segmented by lines when exceeding the maximum chunk length. You can also use special delimiters defined by yourself (e.g. ***).',
+    separatorPlaceholder: '\\n\\n for paragraphs; \\n for lines',
+    maxLength: 'Maximum chunk length',
+    maxLengthCheck: 'Maximum chunk length should be less than {{limit}}',
+    overlap: 'Chunk overlap',
+    overlapTip: 'Setting the chunk overlap can maintain the semantic relevance between them, enhancing the retrieve effect. It is recommended to set 10%-25% of the maximum chunk size.',
+    overlapCheck: 'chunk overlap should not bigger than maximum chunk length',
+    rules: 'Text Pre-processing Rules',
+    removeExtraSpaces: 'Replace consecutive spaces, newlines and tabs',
+    removeUrlEmails: 'Delete all URLs and email addresses',
+    removeStopwords: 'Remove stopwords such as "a", "an", "the"',
+    preview: 'Preview',
+    previewChunk: 'Preview Chunk',
+    reset: 'Reset',
+    indexMode: 'Index Method',
+    qualified: 'High Quality',
+    highQualityTip: 'Once finishing embedding in High Quality mode, reverting to Economical mode is not available.',
+    recommend: 'Recommend',
+    qualifiedTip: 'Calling the embedding model to process documents for more precise retrieval helps LLM generate high-quality answers.',
+    warning: 'Please set up the model provider API key first.',
+    click: 'Go to settings',
+    economical: 'Economical',
+    economicalTip: 'Using 10 keywords per chunk for retrieval, no tokens are consumed at the expense of reduced retrieval accuracy.',
+    QATitle: 'Segmenting in Question & Answer format',
+    QATip: 'Enable this option will consume more tokens',
+    QALanguage: 'Segment using',
+    useQALanguage: 'Chunk using Q&A format in',
+    estimateCost: 'Estimation',
+    estimateSegment: 'Estimated chunks',
+    segmentCount: 'chunks',
+    calculating: 'Calculating...',
+    fileSource: 'Preprocess documents',
+    notionSource: 'Preprocess pages',
+    websiteSource: 'Preprocess website',
+    other: 'and other ',
+    fileUnit: ' files',
+    notionUnit: ' pages',
+    webpageUnit: ' pages',
+    previousStep: 'Previous step',
+    nextStep: 'Save & Process',
+    save: 'Save & Process',
+    cancel: 'Cancel',
+    sideTipTitle: 'Why chunk and preprocess?',
+    sideTipP1: 'When processing text data, chunk and cleaning are two important preprocessing steps.',
+    sideTipP2: 'Segmentation splits long text into paragraphs so models can understand better. This improves the quality and relevance of model results.',
+    sideTipP3: 'Cleaning removes unnecessary characters and formats, making Knowledge cleaner and easier to parse.',
+    sideTipP4: 'Proper chunk and cleaning improve model performance, providing more accurate and valuable results.',
+    previewTitle: 'Preview',
+    previewTitleButton: 'Preview',
+    previewButton: 'Switching to Q&A format',
+    previewSwitchTipStart: 'The current chunk preview is in text format, switching to a question-and-answer format preview will',
+    previewSwitchTipEnd: ' consume additional tokens',
+    characters: 'characters',
+    indexSettingTip: 'To change the index method & embedding model, please go to the ',
+    retrievalSettingTip: 'To change the retrieval setting, please go to the ',
+    datasetSettingLink: 'Knowledge settings.',
+    previewChunkTip: 'Click the \'Preview Chunk\' button on the left to load the preview',
+    previewChunkCount: '{{count}} Estimated chunks',
+    switch: 'Switch',
+    qaSwitchHighQualityTipTitle: 'Q&A Format Requires High-quality Indexing Method',
+    qaSwitchHighQualityTipContent: 'Currently, only high-quality index method supports Q&A format chunking. Would you like to switch to high-quality mode?',
+    notAvailableForParentChild: 'Not available for Parent-child Index',
+    notAvailableForQA: 'Not available for Q&A Index',
+    parentChildDelimiterTip: 'A delimiter is the character used to separate text. \\n\\n is recommended for splitting the original document into large parent chunks. You can also use special delimiters defined by yourself.',
+    parentChildChunkDelimiterTip: 'A delimiter is the character used to separate text. \\n is recommended for splitting parent chunks into small child chunks. You can also use special delimiters defined by yourself.',
+  },
+  stepThree: {
+    creationTitle: '馃帀 Knowledge created',
+    creationContent: 'We automatically named the Knowledge, you can modify it at any time.',
+    label: 'Knowledge name',
+    additionTitle: '馃帀 Document uploaded',
+    additionP1: 'The document has been uploaded to the Knowledge',
+    additionP2: ', you can find it in the document list of the Knowledge.',
+    stop: 'Stop processing',
+    resume: 'Resume processing',
+    navTo: 'Go to document',
+    sideTipTitle: 'What\'s next',
+    sideTipContent: 'After the document finishes indexing, the Knowledge can be integrated into the application as context, you can find the context setting in the prompt orchestration page. You can also create it as an independent ChatGPT indexing plugin for release.',
+    modelTitle: 'Are you sure to stop embedding?',
+    modelContent: 'If you need to resume processing later, you will continue from where you left off.',
+    modelButtonConfirm: 'Confirm',
+    modelButtonCancel: 'Cancel',
+  },
+  otherDataSource: {
+    title: 'Connect to other data sources?',
+    description: 'Currently, Dify\'s knowledge base only has limited data sources. Contributing a data source to the Dify knowledge base is a fantastic way to help enhance the platform\'s flexibility and power for all users. Our contribution guide makes it easy to get started. Please click on the link below to learn more.',
+    learnMore: 'Learn more',
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/dataset-documents.ts b/i18n/en-US/dataset-documents.ts
new file mode 100644
index 0000000..d7fd70c
--- /dev/null
+++ b/i18n/en-US/dataset-documents.ts
@@ -0,0 +1,394 @@
+const translation = {
+  list: {
+    title: 'Documents',
+    desc: 'All files of the Knowledge are shown here, and the entire Knowledge can be linked to Dify citations or indexed via the Chat plugin.',
+    learnMore: 'Learn more',
+    addFile: 'Add file',
+    addPages: 'Add Pages',
+    addUrl: 'Add URL',
+    table: {
+      header: {
+        fileName: 'NAME',
+        chunkingMode: 'CHUNKING MODE',
+        words: 'WORDS',
+        hitCount: 'RETRIEVAL COUNT',
+        uploadTime: 'UPLOAD TIME',
+        status: 'STATUS',
+        action: 'ACTION',
+      },
+      rename: 'Rename',
+      name: 'Name',
+    },
+    action: {
+      uploadFile: 'Upload new file',
+      settings: 'Chunking Settings',
+      addButton: 'Add chunk',
+      add: 'Add a chunk',
+      batchAdd: 'Batch add',
+      archive: 'Archive',
+      unarchive: 'Unarchive',
+      delete: 'Delete',
+      enableWarning: 'Archived file cannot be enabled',
+      sync: 'Sync',
+    },
+    index: {
+      enable: 'Enable',
+      disable: 'Disable',
+      all: 'All',
+      enableTip: 'The file can be indexed',
+      disableTip: 'The file cannot be indexed',
+    },
+    status: {
+      queuing: 'Queuing',
+      indexing: 'Indexing',
+      paused: 'Paused',
+      error: 'Error',
+      available: 'Available',
+      enabled: 'Enabled',
+      disabled: 'Disabled',
+      archived: 'Archived',
+    },
+    empty: {
+      title: 'There is no documentation yet',
+      upload: {
+        tip: 'You can upload files, sync from the website, or from webb apps like Notion, GitHub, etc.',
+      },
+      sync: {
+        tip: 'Dify will periodically download files from your Notion and complete processing.',
+      },
+    },
+    delete: {
+      title: 'Are you sure Delete?',
+      content: 'If you need to resume processing later, you will continue from where you left off',
+    },
+    batchModal: {
+      title: 'Batch add chunks',
+      csvUploadTitle: 'Drag and drop your CSV file here, or ',
+      browse: 'browse',
+      tip: 'The CSV file must conform to the following structure:',
+      question: 'question',
+      answer: 'answer',
+      contentTitle: 'chunk content',
+      content: 'content',
+      template: 'Download the template here',
+      cancel: 'Cancel',
+      run: 'Run Batch',
+      runError: 'Run batch failed',
+      processing: 'In batch processing',
+      completed: 'Import completed',
+      error: 'Import Error',
+      ok: 'OK',
+    },
+  },
+  metadata: {
+    title: 'Metadata',
+    desc: 'Labeling metadata for documents allows AI to access them in a timely manner and exposes the source of references for users.',
+    dateTimeFormat: 'MMMM D, YYYY hh:mm A',
+    docTypeSelectTitle: 'Please select a document type',
+    docTypeChangeTitle: 'Change document type',
+    docTypeSelectWarning:
+      'If the document type is changed, the now filled metadata will no longer be preserved',
+    firstMetaAction: 'Let\'s go',
+    placeholder: {
+      add: 'Add ',
+      select: 'Select ',
+    },
+    source: {
+      upload_file: 'Upload File',
+      notion: 'Sync form Notion',
+      github: 'Sync form Github',
+    },
+    type: {
+      book: 'Book',
+      webPage: 'Web Page',
+      paper: 'Paper',
+      socialMediaPost: 'Social Media Post',
+      personalDocument: 'Personal Document',
+      businessDocument: 'Business Document',
+      IMChat: 'IM Chat',
+      wikipediaEntry: 'Wikipedia Entry',
+      notion: 'Sync form Notion',
+      github: 'Sync form Github',
+      technicalParameters: 'Technical Parameters',
+    },
+    field: {
+      processRule: {
+        processDoc: 'Process Document',
+        segmentRule: 'Chunk Rule',
+        segmentLength: 'Chunks Length',
+        processClean: 'Text Process Clean',
+      },
+      book: {
+        title: 'Title',
+        language: 'Language',
+        author: 'Author',
+        publisher: 'Publisher',
+        publicationDate: 'Publication Date',
+        ISBN: 'ISBN',
+        category: 'Category',
+      },
+      webPage: {
+        title: 'Title',
+        url: 'URL',
+        language: 'Language',
+        authorPublisher: 'Author/Publisher',
+        publishDate: 'Publish Date',
+        topicKeywords: 'Topic/Keywords',
+        description: 'Description',
+      },
+      paper: {
+        title: 'Title',
+        language: 'Language',
+        author: 'Author',
+        publishDate: 'Publish Date',
+        journalConferenceName: 'Journal/Conference Name',
+        volumeIssuePage: 'Volume/Issue/Page',
+        DOI: 'DOI',
+        topicsKeywords: 'Topics/Keywords',
+        abstract: 'Abstract',
+      },
+      socialMediaPost: {
+        platform: 'Platform',
+        authorUsername: 'Author/Username',
+        publishDate: 'Publish Date',
+        postURL: 'Post URL',
+        topicsTags: 'Topics/Tags',
+      },
+      personalDocument: {
+        title: 'Title',
+        author: 'Author',
+        creationDate: 'Creation Date',
+        lastModifiedDate: 'Last Modified Date',
+        documentType: 'Document Type',
+        tagsCategory: 'Tags/Category',
+      },
+      businessDocument: {
+        title: 'Title',
+        author: 'Author',
+        creationDate: 'Creation Date',
+        lastModifiedDate: 'Last Modified Date',
+        documentType: 'Document Type',
+        departmentTeam: 'Department/Team',
+      },
+      IMChat: {
+        chatPlatform: 'Chat Platform',
+        chatPartiesGroupName: 'Chat Parties/Group Name',
+        participants: 'Participants',
+        startDate: 'Start Date',
+        endDate: 'End Date',
+        topicsKeywords: 'Topics/Keywords',
+        fileType: 'File Type',
+      },
+      wikipediaEntry: {
+        title: 'Title',
+        language: 'Language',
+        webpageURL: 'Webpage URL',
+        editorContributor: 'Editor/Contributor',
+        lastEditDate: 'Last Edit Date',
+        summaryIntroduction: 'Summary/Introduction',
+      },
+      notion: {
+        title: 'Title',
+        language: 'Language',
+        author: 'Author',
+        createdTime: 'Created Time',
+        lastModifiedTime: 'Last Modified Time',
+        url: 'URL',
+        tag: 'Tag',
+        description: 'Description',
+      },
+      github: {
+        repoName: 'Repo Name',
+        repoDesc: 'Repo Description',
+        repoOwner: 'Repo Owner',
+        fileName: 'File Name',
+        filePath: 'File Path',
+        programmingLang: 'Programming Language',
+        url: 'URL',
+        license: 'License',
+        lastCommitTime: 'Last Commit Time',
+        lastCommitAuthor: 'Last Commit Author',
+      },
+      originInfo: {
+        originalFilename: 'Original filename',
+        originalFileSize: 'Original file size',
+        uploadDate: 'Upload date',
+        lastUpdateDate: 'Last update date',
+        source: 'Source',
+      },
+      technicalParameters: {
+        segmentSpecification: 'Chunks specification',
+        segmentLength: 'Chunks length',
+        avgParagraphLength: 'Avg. paragraph length',
+        paragraphs: 'Paragraphs',
+        hitCount: 'Retrieval count',
+        embeddingTime: 'Embedding time',
+        embeddedSpend: 'Embedded spend',
+      },
+    },
+    languageMap: {
+      zh: 'Chinese',
+      en: 'English',
+      es: 'Spanish',
+      fr: 'French',
+      de: 'German',
+      ja: 'Japanese',
+      ko: 'Korean',
+      ru: 'Russian',
+      ar: 'Arabic',
+      pt: 'Portuguese',
+      it: 'Italian',
+      nl: 'Dutch',
+      pl: 'Polish',
+      sv: 'Swedish',
+      tr: 'Turkish',
+      he: 'Hebrew',
+      hi: 'Hindi',
+      da: 'Danish',
+      fi: 'Finnish',
+      no: 'Norwegian',
+      hu: 'Hungarian',
+      el: 'Greek',
+      cs: 'Czech',
+      th: 'Thai',
+      id: 'Indonesian',
+    },
+    categoryMap: {
+      book: {
+        fiction: 'Fiction',
+        biography: 'Biography',
+        history: 'History',
+        science: 'Science',
+        technology: 'Technology',
+        education: 'Education',
+        philosophy: 'Philosophy',
+        religion: 'Religion',
+        socialSciences: 'SocialSciences',
+        art: 'Art',
+        travel: 'Travel',
+        health: 'Health',
+        selfHelp: 'SelfHelp',
+        businessEconomics: 'BusinessEconomics',
+        cooking: 'Cooking',
+        childrenYoungAdults: 'ChildrenYoungAdults',
+        comicsGraphicNovels: 'ComicsGraphicNovels',
+        poetry: 'Poetry',
+        drama: 'Drama',
+        other: 'Other',
+      },
+      personalDoc: {
+        notes: 'Notes',
+        blogDraft: 'Blog Draft',
+        diary: 'Diary',
+        researchReport: 'Research Report',
+        bookExcerpt: 'Book Excerpt',
+        schedule: 'Schedule',
+        list: 'List',
+        projectOverview: 'Project Overview',
+        photoCollection: 'Photo Collection',
+        creativeWriting: 'Creative Writing',
+        codeSnippet: 'Code Snippet',
+        designDraft: 'Design Draft',
+        personalResume: 'Personal Resume',
+        other: 'Other',
+      },
+      businessDoc: {
+        meetingMinutes: 'Meeting Minutes',
+        researchReport: 'Research Report',
+        proposal: 'Proposal',
+        employeeHandbook: 'Employee Handbook',
+        trainingMaterials: 'Training Materials',
+        requirementsDocument: 'Requirements Document',
+        designDocument: 'Design Document',
+        productSpecification: 'Product Specification',
+        financialReport: 'Financial Report',
+        marketAnalysis: 'Market Analysis',
+        projectPlan: 'Project Plan',
+        teamStructure: 'Team Structure',
+        policiesProcedures: 'Policies & Procedures',
+        contractsAgreements: 'Contracts & Agreements',
+        emailCorrespondence: 'Email Correspondence',
+        other: 'Other',
+      },
+    },
+  },
+  embedding: {
+    processing: 'Embedding processing...',
+    paused: 'Embedding paused',
+    completed: 'Embedding completed',
+    error: 'Embedding error',
+    docName: 'Preprocessing document',
+    mode: 'Chunking Setting',
+    segmentLength: 'Maximum Chunk Length',
+    textCleaning: 'Text Preprocessing Rules',
+    segments: 'Paragraphs',
+    highQuality: 'High-quality mode',
+    economy: 'Economy mode',
+    estimate: 'Estimated consumption',
+    stop: 'Stop processing',
+    pause: 'Pause',
+    resume: 'Resume',
+    automatic: 'Automatic',
+    custom: 'Custom',
+    hierarchical: 'Parent-child',
+    previewTip: 'Paragraph preview will be available after embedding is complete',
+    parentMaxTokens: 'Parent',
+    childMaxTokens: 'Child',
+  },
+  segment: {
+    paragraphs: 'Paragraphs',
+    chunks_one: 'CHUNK',
+    chunks_other: 'CHUNKS',
+    parentChunks_one: 'PARENT CHUNK',
+    parentChunks_other: 'PARENT CHUNKS',
+    childChunks_one: 'CHILD CHUNK',
+    childChunks_other: 'CHILD CHUNKS',
+    searchResults_zero: 'RESULT',
+    searchResults_one: 'RESULT',
+    searchResults_other: 'RESULTS',
+    empty: 'No Chunk found',
+    clearFilter: 'Clear filter',
+    chunk: 'Chunk',
+    parentChunk: 'Parent-Chunk',
+    newChunk: 'New Chunk',
+    childChunk: 'Child-Chunk',
+    newChildChunk: 'New Child Chunk',
+    keywords: 'KEYWORDS',
+    addKeyWord: 'Add keyword',
+    keywordError: 'The maximum length of keyword is 20',
+    characters_one: 'character',
+    characters_other: 'characters',
+    hitCount: 'Retrieval count',
+    vectorHash: 'Vector hash: ',
+    questionPlaceholder: 'Add question here',
+    questionEmpty: 'Question can not be empty',
+    answerPlaceholder: 'Add answer here',
+    answerEmpty: 'Answer can not be empty',
+    contentPlaceholder: 'Add content here',
+    contentEmpty: 'Content can not be empty',
+    newTextSegment: 'New Text Segment',
+    newQaSegment: 'New Q&A Segment',
+    addChunk: 'Add Chunk',
+    addChildChunk: 'Add Child Chunk',
+    addAnother: 'Add another',
+    delete: 'Delete this chunk ?',
+    chunkAdded: '1 chunk added',
+    childChunkAdded: '1 child chunk added',
+    editChunk: 'Edit Chunk',
+    editParentChunk: 'Edit Parent Chunk',
+    editChildChunk: 'Edit Child Chunk',
+    chunkDetail: 'Chunk Detail',
+    regenerationConfirmTitle: 'Do you want to regenerate child chunks?',
+    regenerationConfirmMessage: 'Regenerating child chunks will overwrite the current child chunks, including edited chunks and newly added chunks. The regeneration cannot be undone.',
+    regeneratingTitle: 'Regenerating child chunks',
+    regeneratingMessage: 'This may take a moment, please wait...',
+    regenerationSuccessTitle: 'Regeneration completed',
+    regenerationSuccessMessage: 'You can close this window.',
+    edited: 'EDITED',
+    editedAt: 'Edited at',
+    expandChunks: 'Expand chunks',
+    collapseChunks: 'Collapse chunks',
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/dataset-hit-testing.ts b/i18n/en-US/dataset-hit-testing.ts
new file mode 100644
index 0000000..1e68306
--- /dev/null
+++ b/i18n/en-US/dataset-hit-testing.ts
@@ -0,0 +1,34 @@
+const translation = {
+  title: 'Retrieval Test',
+  settingTitle: 'Retrieval Setting',
+  desc: 'Test the hitting effect of the Knowledge based on the given query text.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  records: 'Records',
+  table: {
+    header: {
+      source: 'Source',
+      text: 'Text',
+      time: 'Time',
+    },
+  },
+  input: {
+    title: 'Source text',
+    placeholder: 'Please enter a text, a short declarative sentence is recommended.',
+    countWarning: 'Up to 200 characters.',
+    indexWarning: 'High quality Knowledge only.',
+    testing: 'Test',
+  },
+  hit: {
+    title: '{{num}} Retrieved Chunks',
+    emptyTip: 'Retrieval Testing results will show here',
+  },
+  noRecentTip: 'No recent query results here',
+  viewChart: 'View VECTOR CHART',
+  viewDetail: 'View Detail',
+  chunkDetail: 'Chunk Detail',
+  hitChunks: 'Hit {{num}} child chunks',
+  open: 'Open',
+  keyword: 'Keywords',
+}
+
+export default translation
diff --git a/i18n/en-US/dataset-settings.ts b/i18n/en-US/dataset-settings.ts
new file mode 100644
index 0000000..bf10bed
--- /dev/null
+++ b/i18n/en-US/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: 'Knowledge settings',
+  desc: 'Here you can modify the properties and retrieval settings of this Knowledge.',
+  form: {
+    name: 'Knowledge Name',
+    namePlaceholder: 'Please enter the Knowledge name',
+    nameError: 'Name cannot be empty',
+    desc: 'Knowledge Description',
+    descInfo: 'Please write a clear textual description to outline the content of the Knowledge. This description will be used as a basis for matching when selecting from multiple Knowledge for inference.',
+    descPlaceholder: 'Describe what is in this data set. A detailed description allows AI to access the content of the data set in a timely manner. If empty, LangGenius will use the default hit strategy.',
+    helpText: 'Learn how to write a good dataset description.',
+    descWrite: 'Learn how to write a good Knowledge description.',
+    permissions: 'Permissions',
+    permissionsOnlyMe: 'Only me',
+    permissionsAllMember: 'All team members',
+    permissionsInvitedMembers: 'Partial team members',
+    me: '(You)',
+    indexMethod: 'Index Method',
+    indexMethodHighQuality: 'High Quality',
+    indexMethodHighQualityTip: 'Calling the embedding model to process documents for more precise retrieval helps LLM generate high-quality answers.',
+    upgradeHighQualityTip: 'Once upgrading to High Quality mode, reverting to Economical mode is not available',
+    indexMethodEconomy: 'Economical',
+    indexMethodEconomyTip: 'Using 10 keywords per chunk for retrieval, no tokens are consumed at the expense of reduced retrieval accuracy.',
+    embeddingModel: 'Embedding Model',
+    embeddingModelTip: 'Change the embedded model, please go to ',
+    embeddingModelTipLink: 'Settings',
+    retrievalSetting: {
+      title: 'Retrieval Setting',
+      method: 'Retrieval Method',
+      learnMore: 'Learn more',
+      description: ' about retrieval method.',
+      longDescription: ' about retrieval method, you can change this at any time in the Knowledge settings.',
+    },
+    externalKnowledgeAPI: 'External Knowledge API',
+    externalKnowledgeID: 'External Knowledge ID',
+    retrievalSettings: 'Retrieval Settings',
+    save: 'Save',
+    indexMethodChangeToEconomyDisabledTip: 'Not available for downgrading from HQ to ECO',
+    searchModel: 'Search model',
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/dataset.ts b/i18n/en-US/dataset.ts
new file mode 100644
index 0000000..3e251d1
--- /dev/null
+++ b/i18n/en-US/dataset.ts
@@ -0,0 +1,221 @@
+const translation = {
+  knowledge: 'Knowledge',
+  chunkingMode: {
+    general: 'General',
+    parentChild: 'Parent-child',
+  },
+  parentMode: {
+    paragraph: 'Paragraph',
+    fullDoc: 'Full-doc',
+  },
+  externalTag: 'External',
+  externalAPI: 'External API',
+  externalAPIPanelTitle: 'External Knowledge API',
+  externalKnowledgeId: 'External Knowledge ID',
+  externalKnowledgeName: 'External Knowledge Name',
+  externalKnowledgeDescription: 'Knowledge Description',
+  externalKnowledgeIdPlaceholder: 'Please enter the Knowledge ID',
+  externalKnowledgeNamePlaceholder: 'Please enter the name of the knowledge base',
+  externalKnowledgeDescriptionPlaceholder: 'Describe what\'s in this Knowledge Base (optional)',
+  learnHowToWriteGoodKnowledgeDescription: 'Learn how to write a good knowledge description',
+  externalAPIPanelDescription: 'The external knowledge API is used to connect to a knowledge base outside of Dify and retrieve knowledge from that knowledge base.',
+  externalAPIPanelDocumentation: 'Learn how to create an External Knowledge API',
+  localDocs: 'Local Docs',
+  documentCount: ' docs',
+  wordCount: ' k words',
+  appCount: ' linked apps',
+  createDataset: 'Create Knowledge',
+  createNewExternalAPI: 'Create a new External Knowledge API',
+  noExternalKnowledge: 'There is no External Knowledge API yet, click here to create',
+  createExternalAPI: 'Add an External Knowledge API',
+  editExternalAPIFormTitle: 'Edit the External Knowledge API',
+  editExternalAPITooltipTitle: 'LINKED KNOWLEDGE',
+  editExternalAPIConfirmWarningContent: {
+    front: 'This External Knowledge API is linked to',
+    end: 'external knowledge, and this modification will be applied to all of them. Are you sure you want to save this change?',
+  },
+  editExternalAPIFormWarning: {
+    front: 'This External API is linked to',
+    end: 'external knowledge',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: 'Delete',
+      end: '?',
+    },
+    content: {
+      front: 'This External Knowledge API is linked to',
+      end: 'external knowledge. Deleting this API will invalidate all of them. Are you sure you want to delete this API?',
+    },
+    noConnectionContent: 'Are you sure to delete this API?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: 'Choose an External Knowledge API',
+  },
+  connectDataset: 'Connect to an External Knowledge Base',
+  connectDatasetIntro: {
+    title: 'How to Connect to an External Knowledge Base',
+    content: {
+      front: 'To connect to an external knowledge base, you need to create an external API first. Please read carefully and refer to',
+      link: 'Learn how to create an external API',
+      end: '. Then find the corresponding knowledge ID and fill it in the form on the left. If all the information is correct, it will automatically jump to the retrieval test in the knowledge base after clicking the connect button.',
+    },
+    learnMore: 'Learn More',
+  },
+  connectHelper: {
+    helper1: 'Connect to external knowledge bases via API and knowledge base ID. Currently, ',
+    helper2: 'only the retrieval functionality is supported',
+    helper3: '. We strongly recommend that you ',
+    helper4: 'read the help documentation',
+    helper5: ' carefully before using this feature.',
+  },
+  createDatasetIntro: 'Import your own text data or write data in real-time via Webhook for LLM context enhancement.',
+  deleteDatasetConfirmTitle: 'Delete this Knowledge?',
+  deleteDatasetConfirmContent:
+    'Deleting the Knowledge is irreversible. Users will no longer be able to access your Knowledge, and all prompt configurations and logs will be permanently deleted.',
+  datasetUsedByApp: 'The knowledge is being used by some apps. Apps will no longer be able to use this Knowledge, and all prompt configurations and logs will be permanently deleted.',
+  datasetDeleted: 'Knowledge deleted',
+  datasetDeleteFailed: 'Failed to delete Knowledge',
+  didYouKnow: 'Did you know?',
+  intro1: 'The Knowledge can be integrated into the Dify application ',
+  intro2: 'as a context',
+  intro3: ',',
+  intro4: 'or it ',
+  intro5: 'can be created',
+  intro6: ' as a standalone ChatGPT index plug-in to publish',
+  unavailable: 'Unavailable',
+  unavailableTip: 'Embedding model is not available, the default embedding model needs to be configured',
+  datasets: 'KNOWLEDGE',
+  datasetsApi: 'API ACCESS',
+  externalKnowledgeForm: {
+    connect: 'Connect',
+    cancel: 'Cancel',
+  },
+  externalAPIForm: {
+    name: 'Name',
+    endpoint: 'API Endpoint',
+    apiKey: 'API Key',
+    save: 'Save',
+    cancel: 'Cancel',
+    edit: 'Edit',
+    encrypted: {
+      front: 'Your API Token will be encrypted and stored using',
+      end: 'technology.',
+    },
+  },
+  retrieval: {
+    semantic_search: {
+      title: 'Vector Search',
+      description: 'Generate query embeddings and search for the text chunk most similar to its vector representation.',
+    },
+    full_text_search: {
+      title: 'Full-Text Search',
+      description: 'Index all terms in the document, allowing users to search any term and retrieve relevant text chunk containing those terms.',
+    },
+    hybrid_search: {
+      title: 'Hybrid Search',
+      description: 'Execute full-text search and vector searches simultaneously, re-rank to select the best match for the user\'s query. Users can choose to set weights or configure to a Rerank model.',
+      recommend: 'Recommend',
+    },
+    invertedIndex: {
+      title: 'Inverted Index',
+      description: 'Inverted Index is a structure used for efficient retrieval. Organized by terms, each term points to documents or web pages containing it.',
+    },
+    change: 'Change',
+    changeRetrievalMethod: 'Change retrieval method',
+  },
+  docsFailedNotice: 'documents indexed failed',
+  retry: 'Retry',
+  documentsDisabled: '{{num}} documents disabled - inactive for over 30 days',
+  enable: 'Enable',
+  indexingTechnique: {
+    high_quality: 'HQ',
+    economy: 'ECO',
+  },
+  indexingMethod: {
+    semantic_search: 'VECTOR',
+    full_text_search: 'FULL TEXT',
+    hybrid_search: 'HYBRID',
+    invertedIndex: 'INVERTED',
+  },
+  defaultRetrievalTip: 'Multi-path retrieval is used by default. Knowledge is retrieved from multiple knowledge bases and then re-ranked.',
+  mixtureHighQualityAndEconomicTip: 'The Rerank model is required for mixture of high quality and economical knowledge bases.',
+  inconsistentEmbeddingModelTip: 'The Rerank model is required if the Embedding models of the selected knowledge bases are inconsistent.',
+  mixtureInternalAndExternalTip: 'The Rerank model is required for mixture of internal and  external knowledge.',
+  allExternalTip: 'When using external knowledge only, the user can choose whether to enable the Rerank model. If not enabled, retrieved chunks will be sorted based on scores. When the retrieval strategies of different knowledge bases are inconsistent, it will be inaccurate.',
+  retrievalSettings: 'Retrieval Setting',
+  rerankSettings: 'Rerank Setting',
+  weightedScore: {
+    title: 'Weighted Score',
+    description: 'By adjusting the weights assigned, this rerank strategy determines whether to prioritize semantic or keyword matching.',
+    semanticFirst: 'Semantic first',
+    keywordFirst: 'Keyword first',
+    customized: 'Customized',
+    semantic: 'Semantic',
+    keyword: 'Keyword',
+  },
+  nTo1RetrievalLegacy: 'N-to-1 retrieval will be officially deprecated from September. It is recommended to use the latest Multi-path retrieval to obtain better results. ',
+  nTo1RetrievalLegacyLink: 'Learn more',
+  nTo1RetrievalLegacyLinkText: ' N-to-1 retrieval will be officially deprecated in September.',
+  batchAction: {
+    selected: 'Selected',
+    enable: 'Enable',
+    disable: 'Disable',
+    archive: 'Archive',
+    delete: 'Delete',
+    cancel: 'Cancel',
+  },
+  preprocessDocument: '{{num}} Preprocess Documents',
+  allKnowledge: 'All Knowledge',
+  allKnowledgeDescription: 'Select to display all knowledge in this workspace. Only the Workspace Owner can manage all knowledge.',
+  embeddingModelNotAvailable: 'Embedding model is unavailable.',
+  metadata: {
+    metadata: 'Metadata',
+    addMetadata: 'Add Metadata',
+    chooseTime: 'Choose a time...',
+    createMetadata: {
+      title: 'New Metadata',
+      back: 'Back',
+      type: 'Type',
+      name: 'Name',
+      namePlaceholder: 'Add metadata name',
+    },
+    checkName: {
+      empty: 'Metadata name cannot be empty',
+      invalid: 'Metadata name can only contain lowercase letters, numbers, and underscores and must start with a lowercase letter',
+    },
+    batchEditMetadata: {
+      editMetadata: 'Edit Metadata',
+      editDocumentsNum: 'Editing {{num}} documents',
+      applyToAllSelectDocument: 'Apply to all selected documents',
+      applyToAllSelectDocumentTip: 'Automatically create all the above edited and new metadata for all selected documents, otherwise editing metadata will only apply to documents with it.',
+      multipleValue: 'Multiple Value',
+    },
+    selectMetadata: {
+      search: 'Search metadata',
+      newAction: 'New Metadata',
+      manageAction: 'Manage',
+    },
+    datasetMetadata: {
+      description: 'You can manage all metadata in this knowledge here. Modifications will be synchronized to every document.',
+      addMetaData: 'Add Metadata',
+      values: '{{num}} Values',
+      disabled: 'Disabled',
+      rename: 'Rename',
+      name: 'Name',
+      namePlaceholder: 'Metadata name',
+      builtIn: 'Built-in',
+      builtInDescription: 'Built-in metadata is automatically extracted and generated. It must be enabled before use and cannot be edited.',
+      deleteTitle: 'Confirm to delete',
+      deleteContent: 'Are you sure you want to delete the metadata "{{name}}"',
+    },
+    documentMetadata: {
+      metadataToolTip: 'Metadata serves as a critical filter that enhances the accuracy and relevance of information retrieval. You can modify and add metadata for this document here.',
+      startLabeling: 'Start Labeling',
+      documentInformation: 'Document Information',
+      technicalParameters: 'Technical Parameters',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/education.ts b/i18n/en-US/education.ts
new file mode 100644
index 0000000..ea125a1
--- /dev/null
+++ b/i18n/en-US/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerified: 'Get Education Verified',
+  toVerifiedTip: {
+    front: 'You are now eligible for Education Verified status. Please enter your education information below to complete the process and receive an',
+    coupon: 'exclusive 100% coupon',
+    end: 'for the Dify Professional Plan.',
+  },
+  currentSigned: 'CURRENTLY SIGNED IN AS',
+  form: {
+    schoolName: {
+      title: 'Your School Name',
+      placeholder: 'Enter the official, unabbreviated name of your school',
+    },
+    schoolRole: {
+      title: 'Your School Role',
+      option: {
+        student: 'Student',
+        teacher: 'Teacher',
+        administrator: 'School Administrator',
+      },
+    },
+    terms: {
+      title: 'Terms & Agreements',
+      desc: {
+        front: 'Your information and use of Education Verified status are subject to our',
+        and: 'and',
+        end: '. By submitting锛�',
+        termsOfService: 'Terms of Service',
+        privacyPolicy: 'Privacy Policy',
+      },
+      option: {
+        age: 'I confirm I am at least 18 years old',
+        inSchool: 'I confirm I am enrolled or employed at the institution provided. Dify may request proof of enrollment/employment. If I misrepresent my eligibility, I agree to pay any fees initially waived based on my education status.',
+      },
+    },
+  },
+  submit: 'Submit',
+  submitError: 'Form submission failed. Please try again later.',
+  learn: 'Learn how to get education verified',
+  successTitle: 'You Have Got Dify Education Verified',
+  successContent: 'We have issued a 100% discount coupon for the Dify Professional plan to your account. The coupon is valid for one year, please use it within the validity period.',
+  rejectTitle: 'Your Dify Educational Verification Has Been Rejected',
+  rejectContent: 'Unfortunately, you are not eligible for Education Verified status and therefore cannot receive the exclusive 100% coupon for the Dify Professional Plan if you use this email address.',
+  emailLabel: 'Your current email',
+}
+
+export default translation
diff --git a/i18n/en-US/explore.ts b/i18n/en-US/explore.ts
new file mode 100644
index 0000000..40e928f
--- /dev/null
+++ b/i18n/en-US/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: 'Explore',
+  sidebar: {
+    discovery: 'Discovery',
+    chat: 'Chat',
+    workspace: 'Workspace',
+    action: {
+      pin: 'Pin',
+      unpin: 'Unpin',
+      rename: 'Rename',
+      delete: 'Delete',
+    },
+    delete: {
+      title: 'Delete app',
+      content: 'Are you sure you want to delete this app?',
+    },
+  },
+  apps: {
+    title: 'Explore Apps by Dify',
+    description: 'Use these template apps instantly or customize your own apps based on the templates.',
+    allCategories: 'Recommended',
+  },
+  appCard: {
+    addToWorkspace: 'Add to Workspace',
+    customize: 'Customize',
+  },
+  appCustomize: {
+    title: 'Create app from {{name}}',
+    subTitle: 'App icon & name',
+    nameRequired: 'App name is required',
+  },
+  category: {
+    Agent: 'Agent',
+    Assistant: 'Assistant',
+    Writing: 'Writing',
+    Translate: 'Translate',
+    Programming: 'Programming',
+    HR: 'HR',
+    Workflow: 'Workflow',
+    Entertainment: 'Entertainment',
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/layout.ts b/i18n/en-US/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/en-US/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/en-US/login.ts b/i18n/en-US/login.ts
new file mode 100644
index 0000000..f7d7171
--- /dev/null
+++ b/i18n/en-US/login.ts
@@ -0,0 +1,109 @@
+const translation = {
+  pageTitle: 'Hey, let\'s get started!',
+  welcome: '馃憢 Welcome to Dify, please log in to continue.',
+  email: 'Email address',
+  emailPlaceholder: 'Your email',
+  password: 'Password',
+  passwordPlaceholder: 'Your password',
+  name: 'Username',
+  namePlaceholder: 'Your username',
+  forget: 'Forgot your password?',
+  signBtn: 'Sign in',
+  continueWithCode: 'Continue With Code',
+  sendVerificationCode: 'Send Verification Code',
+  usePassword: 'Use Password',
+  useVerificationCode: 'Use Verification Code',
+  or: 'OR',
+  installBtn: 'Set up',
+  setAdminAccount: 'Setting up an admin account',
+  setAdminAccountDesc: 'Maximum privileges for admin account, which can be used to create applications and manage LLM providers, etc.',
+  createAndSignIn: 'Create and sign in',
+  oneMoreStep: 'One more step',
+  createSample: 'Based on this information, we\'ll create sample application for you',
+  invitationCode: 'Invitation Code',
+  invitationCodePlaceholder: 'Your invitation code',
+  interfaceLanguage: 'Interface Language',
+  timezone: 'Time zone',
+  go: 'Go to Dify',
+  sendUsMail: 'Email us your introduction, and we\'ll handle the invitation request.',
+  acceptPP: 'I have read and accept the privacy policy',
+  reset: 'Please run following command to reset your password',
+  withGitHub: 'Continue with GitHub',
+  withGoogle: 'Continue with Google',
+  withSSO: 'Continue with SSO',
+  rightTitle: 'Unlock the full potential of LLM',
+  rightDesc: 'Effortlessly build visually captivating, operable, and improvable AI applications.',
+  tos: 'Terms of Service',
+  pp: 'Privacy Policy',
+  tosDesc: 'By signing up, you agree to our',
+  goToInit: 'If you have not initialized the account, please go to the initialization page',
+  dontHave: 'Don\'t have?',
+  invalidInvitationCode: 'Invalid invitation code',
+  accountAlreadyInited: 'Account already initialized',
+  forgotPassword: 'Forgot your password?',
+  resetLinkSent: 'Reset link sent',
+  sendResetLink: 'Send reset link',
+  backToSignIn: 'Return to sign in',
+  forgotPasswordDesc: 'Please enter your email address to reset your password. We will send you an email with instructions on how to reset your password.',
+  checkEmailForResetLink: 'Please check your email for a link to reset your password. If it doesn\'t appear within a few minutes, make sure to check your spam folder.',
+  passwordChanged: 'Sign in now',
+  changePassword: 'Set a password',
+  changePasswordTip: 'Please enter a new password for your account',
+  changePasswordBtn: 'Set a password',
+  invalidToken: 'Invalid or expired token',
+  confirmPassword: 'Confirm Password',
+  confirmPasswordPlaceholder: 'Confirm your new password',
+  passwordChangedTip: 'Your password has been successfully changed',
+  error: {
+    emailEmpty: 'Email address is required',
+    emailInValid: 'Please enter a valid email address',
+    nameEmpty: 'Name is required',
+    passwordEmpty: 'Password is required',
+    passwordLengthInValid: 'Password must be at least 8 characters',
+    passwordInvalid: 'Password must contain letters and numbers, and the length must be greater than 8',
+    registrationNotAllowed: 'Account not found. Please contact the system admin to register.',
+  },
+  license: {
+    tip: 'Before starting Dify Community Edition, read the GitHub',
+    link: 'Open-source License',
+  },
+  join: 'Join ',
+  joinTipStart: 'Invite you join ',
+  joinTipEnd: ' team on Dify',
+  invalid: 'The link has expired',
+  explore: 'Explore Dify',
+  activatedTipStart: 'You have joined the',
+  activatedTipEnd: 'team',
+  activated: 'Sign in now',
+  adminInitPassword: 'Admin initialization password',
+  validate: 'Validate',
+  checkCode: {
+    checkYourEmail: 'Check your email',
+    tips: 'We send a verification code to <strong>{{email}}</strong>',
+    validTime: 'Bear in mind that the code is valid for 5 minutes',
+    verificationCode: 'Verification code',
+    verificationCodePlaceholder: 'Enter 6-digit code',
+    verify: 'Verify',
+    didNotReceiveCode: 'Didn\'t receive the code? ',
+    resend: 'Resend',
+    useAnotherMethod: 'Use another method',
+    emptyCode: 'Code is required',
+    invalidCode: 'Invalid code',
+  },
+  resetPassword: 'Reset Password',
+  resetPasswordDesc: 'Type the email you used to sign up on Dify and we will send you a password reset email.',
+  backToLogin: 'Back to login',
+  setYourAccount: 'Set Your Account',
+  enterYourName: 'Please enter your username',
+  back: 'Back',
+  noLoginMethod: 'Authentication method not configured',
+  noLoginMethodTip: 'Please contact the system admin to add an authentication method.',
+  licenseExpired: 'License Expired',
+  licenseExpiredTip: 'The Dify Enterprise license for your workspace has expired. Please contact your administrator to continue using Dify.',
+  licenseLost: 'License Lost',
+  licenseLostTip: 'Failed to connect Dify license server. Please contact your administrator to continue using Dify.',
+  licenseInactive: 'License Inactive',
+  licenseInactiveTip: 'The Dify Enterprise license for your workspace is inactive. Please contact your administrator to continue using Dify.',
+}
+
+export default translation
diff --git a/i18n/en-US/plugin-tags.ts b/i18n/en-US/plugin-tags.ts
new file mode 100644
index 0000000..d2177b2
--- /dev/null
+++ b/i18n/en-US/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  allTags: 'All Tags',
+  searchTags: 'Search Tags',
+  tags: {
+    agent: 'Agent',
+    search: 'Search',
+    image: 'Image',
+    videos: 'Videos',
+    weather: 'Weather',
+    finance: 'Finance',
+    design: 'Design',
+    travel: 'Travel',
+    social: 'Social',
+    news: 'News',
+    medical: 'Medical',
+    productivity: 'Productivity',
+    education: 'Education',
+    business: 'Business',
+    entertainment: 'Entertainment',
+    utilities: 'Utilities',
+    other: 'Other',
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/plugin.ts b/i18n/en-US/plugin.ts
new file mode 100644
index 0000000..a0b36fb
--- /dev/null
+++ b/i18n/en-US/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  metadata: {
+    title: 'Plugins',
+  },
+  category: {
+    all: 'All',
+    models: 'Models',
+    tools: 'Tools',
+    agents: 'Agent Strategies',
+    extensions: 'Extensions',
+    bundles: 'Bundles',
+  },
+  categorySingle: {
+    model: 'Model',
+    tool: 'Tool',
+    agent: 'Agent Strategy',
+    extension: 'Extension',
+    bundle: 'Bundle',
+  },
+  search: 'Search',
+  allCategories: 'All Categories',
+  searchCategories: 'Search Categories',
+  searchPlugins: 'Search plugins',
+  from: 'From',
+  findMoreInMarketplace: 'Find more in Marketplace',
+  searchInMarketplace: 'Search in Marketplace',
+  fromMarketplace: 'From Marketplace',
+  endpointsEnabled: '{{num}} sets of endpoints enabled',
+  searchTools: 'Search tools...',
+  installPlugin: 'Install plugin',
+  installFrom: 'INSTALL FROM',
+  list: {
+    noInstalled: 'No plugins installed',
+    notFound: 'No plugins found',
+    source: {
+      marketplace: 'Install from Marketplace',
+      github: 'Install from GitHub',
+      local: 'Install from Local Package File',
+    },
+  },
+  source: {
+    marketplace: 'Marketplace',
+    github: 'GitHub',
+    local: 'Local Package File',
+  },
+  detailPanel: {
+    switchVersion: 'Switch Version',
+    categoryTip: {
+      marketplace: 'Installed from Marketplace',
+      github: 'Installed from Github',
+      local: 'Local Plugin',
+      debugging: 'Debugging Plugin',
+    },
+    operation: {
+      install: 'Install',
+      detail: 'Details',
+      update: 'Update',
+      info: 'Plugin Info',
+      checkUpdate: 'Check Update',
+      viewDetail: 'View Detail',
+      remove: 'Remove',
+    },
+    actionNum: '{{num}} {{action}} INCLUDED',
+    strategyNum: '{{num}} {{strategy}} INCLUDED',
+    endpoints: 'Endpoints',
+    endpointsTip: 'This plugin provides specific functionalities via endpoints, and you can configure multiple endpoint sets for current workspace.',
+    endpointsDocLink: 'View the document',
+    endpointsEmpty: 'Click the \'+\' button to add an endpoint',
+    endpointDisableTip: 'Disable Endpoint',
+    endpointDisableContent: 'Would you like to disable {{name}}? ',
+    endpointDeleteTip: 'Remove Endpoint',
+    endpointDeleteContent: 'Would you like to remove {{name}}? ',
+    endpointModalTitle: 'Setup endpoint',
+    endpointModalDesc: 'Once configured, the features provided by the plugin via API endpoints can be used.',
+    serviceOk: 'Service OK',
+    disabled: 'Disabled',
+    modelNum: '{{num}} MODELS INCLUDED',
+    toolSelector: {
+      title: 'Add tool',
+      toolLabel: 'Tool',
+      descriptionLabel: 'Tool description',
+      descriptionPlaceholder: 'Brief description of the tool\'s purpose, e.g., get the temperature for a specific location.',
+      placeholder: 'Select a tool...',
+      settings: 'USER SETTINGS',
+      params: 'REASONING CONFIG',
+      paramsTip1: 'Controls LLM inference parameters.',
+      paramsTip2: 'When \'Automatic\' is off, the default value is used.',
+      auto: 'Automatic',
+      empty: 'Click the \'+\' button to add tools. You can add multiple tools.',
+      uninstalledTitle: 'Tool not installed',
+      uninstalledContent: 'This plugin is installed from the local/GitHub repository. Please use after installation.',
+      uninstalledLink: 'Manage in Plugins',
+      unsupportedTitle: 'Unsupported Action',
+      unsupportedContent: 'The installed plugin version does not provide this action.',
+      unsupportedContent2: 'Click to switch version.',
+    },
+    configureApp: 'Configure App',
+    configureModel: 'Configure model',
+    configureTool: 'Configure tool',
+  },
+  install: '{{num}} installs',
+  installAction: 'Install',
+  debugInfo: {
+    title: 'Debugging',
+    viewDocs: 'View Docs',
+  },
+  privilege: {
+    title: 'Plugin Preferences',
+    whoCanInstall: 'Who can install and manage plugins?',
+    whoCanDebug: 'Who can debug plugins?',
+    everyone: 'Everyone',
+    admins: 'Admins',
+    noone: 'No one',
+  },
+  pluginInfoModal: {
+    title: 'Plugin info',
+    repository: 'Repository',
+    release: 'Release',
+    packageName: 'Package',
+  },
+  action: {
+    checkForUpdates: 'Check for updates',
+    pluginInfo: 'Plugin info',
+    delete: 'Remove plugin',
+    deleteContentLeft: 'Would you like to remove ',
+    deleteContentRight: ' plugin?',
+    usedInApps: 'This plugin is being used in {{num}} apps.',
+  },
+  installModal: {
+    installPlugin: 'Install Plugin',
+    installComplete: 'Installation complete',
+    installedSuccessfully: 'Installation successful',
+    installedSuccessfullyDesc: 'The plugin has been installed successfully.',
+    uploadFailed: 'Upload failed',
+    installFailed: 'Installation failed',
+    installFailedDesc: 'The plugin has been installed failed.',
+    install: 'Install',
+    installing: 'Installing...',
+    uploadingPackage: 'Uploading {{packageName}}...',
+    readyToInstall: 'About to install the following plugin',
+    readyToInstallPackage: 'About to install the following plugin',
+    readyToInstallPackages: 'About to install the following {{num}} plugins',
+    fromTrustSource: 'Please make sure that you only install plugins from a <trustSource>trusted source</trustSource>.',
+    dropPluginToInstall: 'Drop plugin package here to install',
+    labels: {
+      repository: 'Repository',
+      version: 'Version',
+      package: 'Package',
+    },
+    close: 'Close',
+    cancel: 'Cancel',
+    back: 'Back',
+    next: 'Next',
+    pluginLoadError: 'Plugin load error',
+    pluginLoadErrorDesc: 'This plugin will not be installed',
+  },
+  installFromGitHub: {
+    installPlugin: 'Install plugin from GitHub',
+    updatePlugin: 'Update plugin from GitHub',
+    installedSuccessfully: 'Installation successful',
+    installFailed: 'Installation failed',
+    uploadFailed: 'Upload failed',
+    gitHubRepo: 'GitHub repository',
+    selectVersion: 'Select version',
+    selectVersionPlaceholder: 'Please select a version',
+    installNote: 'Please make sure that you only install plugins from a trusted source.',
+    selectPackage: 'Select package',
+    selectPackagePlaceholder: 'Please select a package',
+  },
+  upgrade: {
+    title: 'Install Plugin',
+    successfulTitle: 'Install successful',
+    description: 'About to install the following plugin',
+    usedInApps: 'Used in {{num}} apps',
+    upgrade: 'Install',
+    upgrading: 'Installing...',
+    close: 'Close',
+  },
+  error: {
+    inValidGitHubUrl: 'Invalid GitHub URL. Please enter a valid URL in the format: https://github.com/owner/repo',
+    fetchReleasesError: 'Unable to retrieve releases. Please try again later.',
+    noReleasesFound: 'No releases found. Please check the GitHub repository or the input URL.',
+  },
+  marketplace: {
+    empower: 'Empower your AI development',
+    discover: 'Discover',
+    and: 'and',
+    difyMarketplace: 'Dify Marketplace',
+    moreFrom: 'More from Marketplace',
+    noPluginFound: 'No plugin found',
+    pluginsResult: '{{num}} results',
+    sortBy: 'Sort by',
+    sortOption: {
+      mostPopular: 'Most Popular',
+      recentlyUpdated: 'Recently Updated',
+      newlyReleased: 'Newly Released',
+      firstReleased: 'First Released',
+    },
+    viewMore: 'View more',
+    verifiedTip: 'Verified by Dify',
+    partnerTip: 'Verified by a Dify partner',
+  },
+  task: {
+    installing: 'Installing {{installingLength}} plugins, 0 done.',
+    installingWithSuccess: 'Installing {{installingLength}} plugins, {{successLength}} success.',
+    installingWithError: 'Installing {{installingLength}} plugins, {{successLength}} success, {{errorLength}} failed',
+    installError: '{{errorLength}} plugins failed to install, click to view',
+    installedError: '{{errorLength}} plugins failed to install',
+    clearAll: 'Clear all',
+  },
+  submitPlugin: 'Submit plugin',
+  difyVersionNotCompatible: 'The current Dify version is not compatible with this plugin, please upgrade to the minimum version required: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/en-US/register.ts b/i18n/en-US/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/en-US/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/en-US/run-log.ts b/i18n/en-US/run-log.ts
new file mode 100644
index 0000000..3c851f4
--- /dev/null
+++ b/i18n/en-US/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: 'INPUT',
+  result: 'RESULT',
+  detail: 'DETAIL',
+  tracing: 'TRACING',
+  resultPanel: {
+    status: 'STATUS',
+    time: 'ELAPSED TIME',
+    tokens: 'TOTAL TOKENS',
+  },
+  meta: {
+    title: 'METADATA',
+    status: 'Status',
+    version: 'Version',
+    executor: 'Executor',
+    startTime: 'Start Time',
+    time: 'Elapsed Time',
+    tokens: 'Total Tokens',
+    steps: 'Run Steps',
+  },
+  resultEmpty: {
+    title: 'This run only output JSON format,',
+    tipLeft: 'please go to the ',
+    link: 'detail panel',
+    tipRight: ' view it.',
+  },
+  actionLogs: 'Action Logs',
+  circularInvocationTip: 'There is circular invocation of tools/nodes in the current workflow.',
+}
+
+export default translation
diff --git a/i18n/en-US/share-app.ts b/i18n/en-US/share-app.ts
new file mode 100644
index 0000000..bf99005
--- /dev/null
+++ b/i18n/en-US/share-app.ts
@@ -0,0 +1,82 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: 'App is unavailable',
+    appUnknownError: 'App is unavailable',
+  },
+  chat: {
+    newChat: 'Start New chat',
+    newChatTip: 'Already in a new chat',
+    chatSettingsTitle: 'New chat setup',
+    chatFormTip: 'Chat settings cannot be modified after the chat has started.',
+    pinnedTitle: 'Pinned',
+    unpinnedTitle: 'Recent',
+    newChatDefaultName: 'New conversation',
+    resetChat: 'Reset conversation',
+    viewChatSettings: 'View chat settings',
+    poweredBy: 'Powered by',
+    prompt: 'Prompt',
+    privatePromptConfigTitle: 'Conversation settings',
+    publicPromptConfigTitle: 'Initial Prompt',
+    configStatusDes: 'Before starting, you can modify the conversation settings',
+    configDisabled:
+      'Previous session settings have been used for this session.',
+    startChat: 'Start Chat',
+    privacyPolicyLeft:
+      'Please read the ',
+    privacyPolicyMiddle:
+      'privacy policy',
+    privacyPolicyRight:
+      ' provided by the app developer.',
+    deleteConversation: {
+      title: 'Delete conversation',
+      content: 'Are you sure you want to delete this conversation?',
+    },
+    tryToSolve: 'Try to solve',
+    temporarySystemIssue: 'Sorry, temporary system issue.',
+    expand: 'Expand',
+    collapse: 'Collapse',
+  },
+  generation: {
+    tabs: {
+      create: 'Run Once',
+      batch: 'Run Batch',
+      saved: 'Saved',
+    },
+    savedNoData: {
+      title: 'You haven\'t saved a result yet!',
+      description: 'Start generating content, and find your saved results here.',
+      startCreateContent: 'Start create content',
+    },
+    title: 'AI Completion',
+    queryTitle: 'Query content',
+    completionResult: 'Completion result',
+    queryPlaceholder: 'Write your query content...',
+    run: 'Execute',
+    execution: 'EXECUTION',
+    executions: '{{num}} EXECUTIONS',
+    copy: 'Copy',
+    resultTitle: 'AI Completion',
+    noData: 'AI will give you what you want here.',
+    csvUploadTitle: 'Drag and drop your CSV file here, or ',
+    browse: 'browse',
+    csvStructureTitle: 'The CSV file must conform to the following structure:',
+    downloadTemplate: 'Download the template here',
+    field: 'Field',
+    batchFailed: {
+      info: '{{num}} failed executions',
+      retry: 'Retry',
+      outputPlaceholder: 'No output content',
+    },
+    errorMsg: {
+      empty: 'Please input content in the uploaded file.',
+      fileStructNotMatch: 'The uploaded CSV file not match the struct.',
+      emptyLine: 'Row {{rowIndex}} is empty',
+      invalidLine: 'Row {{rowIndex}}: {{varName}} value can not be empty',
+      moreThanMaxLengthLine: 'Row {{rowIndex}}: {{varName}} value can not be more than {{maxLength}} characters',
+      atLeastOne: 'Please input at least one row in the uploaded file.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/en-US/time.ts b/i18n/en-US/time.ts
new file mode 100644
index 0000000..40adad0
--- /dev/null
+++ b/i18n/en-US/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Sun: 'Sun',
+    Mon: 'Mon',
+    Tue: 'Tue',
+    Wed: 'Wed',
+    Thu: 'Thu',
+    Fri: 'Fri',
+    Sat: 'Sat',
+  },
+  months: {
+    January: 'January',
+    February: 'February',
+    March: 'March',
+    April: 'April',
+    May: 'May',
+    June: 'June',
+    July: 'July',
+    August: 'August',
+    September: 'September',
+    October: 'October',
+    November: 'November',
+    December: 'December',
+  },
+  operation: {
+    now: 'Now',
+    ok: 'OK',
+    cancel: 'Cancel',
+    pickDate: 'Pick Date',
+  },
+  title: {
+    pickTime: 'Pick Time',
+  },
+  defaultPlaceholder: 'Pick a time...',
+}
+
+export default translation
diff --git a/i18n/en-US/tools.ts b/i18n/en-US/tools.ts
new file mode 100644
index 0000000..f624fac
--- /dev/null
+++ b/i18n/en-US/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: 'Tools',
+  createCustomTool: 'Create Custom Tool',
+  customToolTip: 'Learn more about Dify custom tools',
+  type: {
+    all: 'All',
+    builtIn: 'Tools',
+    custom: 'Custom',
+    workflow: 'Workflow',
+  },
+  contribute: {
+    line1: 'I\'m interested in ',
+    line2: 'contributing tools to Dify.',
+    viewGuide: 'View the guide',
+  },
+  author: 'By',
+  auth: {
+    unauthorized: 'To Authorize',
+    authorized: 'Authorized',
+    setup: 'Set up authorization to use',
+    setupModalTitle: 'Set Up Authorization',
+    setupModalTitleDescription: 'After configuring credentials, all members within the workspace can use this tool when orchestrating applications.',
+  },
+  includeToolNum: '{{num}} {{action}} included',
+  addTool: 'Add Tool',
+  addToolModal: {
+    type: 'type',
+    category: 'category',
+    add: 'add',
+    added: 'added',
+    manageInTools: 'Manage in Tools',
+    emptyTitle: 'No workflow tool available',
+    emptyTip: 'Go to "Workflow -> Publish as Tool"',
+    emptyTitleCustom: 'No custom tool available',
+    emptyTipCustom: 'Create a custom tool',
+  },
+  createTool: {
+    title: 'Create Custom Tool',
+    editAction: 'Configure',
+    editTitle: 'Edit Custom Tool',
+    name: 'Name',
+    toolNamePlaceHolder: 'Enter the tool name',
+    nameForToolCall: 'Tool call name',
+    nameForToolCallPlaceHolder: 'Used for machine recognition, such as getCurrentWeather, list_pets',
+    nameForToolCallTip: 'Only supports numbers, letters, and underscores.',
+    description: 'Description',
+    descriptionPlaceholder: 'Brief description of the tool\'s purpose, e.g., get the temperature for a specific location.',
+    schema: 'Schema',
+    schemaPlaceHolder: 'Enter your OpenAPI schema here',
+    viewSchemaSpec: 'View the OpenAPI-Swagger Specification',
+    importFromUrl: 'Import from URL',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: 'Please enter a valid URL',
+    examples: 'Examples',
+    exampleOptions: {
+      json: 'Weather(JSON)',
+      yaml: 'Pet Store(YAML)',
+      blankTemplate: 'Blank Template',
+    },
+    availableTools: {
+      title: 'Available Tools',
+      name: 'Name',
+      description: 'Description',
+      method: 'Method',
+      path: 'Path',
+      action: 'Actions',
+      test: 'Test',
+    },
+    authMethod: {
+      title: 'Authorization method',
+      type: 'Authorization type',
+      keyTooltip: 'Http Header Key, You can leave it with "Authorization" if you have no idea what it is or set it to a custom value',
+      types: {
+        none: 'None',
+        api_key: 'API Key',
+        apiKeyPlaceholder: 'HTTP header name for API Key',
+        apiValuePlaceholder: 'Enter API Key',
+      },
+      key: 'Key',
+      value: 'Value',
+    },
+    authHeaderPrefix: {
+      title: 'Auth Type',
+      types: {
+        basic: 'Basic',
+        bearer: 'Bearer',
+        custom: 'Custom',
+      },
+    },
+    privacyPolicy: 'Privacy policy',
+    privacyPolicyPlaceholder: 'Please enter privacy policy',
+    toolInput: {
+      title: 'Tool Input',
+      name: 'Name',
+      required: 'Required',
+      method: 'Method',
+      methodSetting: 'Setting',
+      methodSettingTip: 'User fills in the tool configuration',
+      methodParameter: 'Parameter',
+      methodParameterTip: 'LLM fills during inference',
+      label: 'Tags',
+      labelPlaceholder: 'Choose tags(optional)',
+      description: 'Description',
+      descriptionPlaceholder: 'Description of the parameter\'s meaning',
+    },
+    customDisclaimer: 'Custom disclaimer',
+    customDisclaimerPlaceholder: 'Please enter custom disclaimer',
+    confirmTitle: 'Confirm to save ?',
+    confirmTip: 'Apps using this tool will be affected',
+    deleteToolConfirmTitle: 'Delete this Tool?',
+    deleteToolConfirmContent: 'Deleting the Tool is irreversible. Users will no longer be able to access your Tool.',
+  },
+  test: {
+    title: 'Test',
+    parametersValue: 'Parameters & Value',
+    parameters: 'Parameters',
+    value: 'Value',
+    testResult: 'Test Results',
+    testResultPlaceholder: 'Test result will show here',
+  },
+  thought: {
+    using: 'Using',
+    used: 'Used',
+    requestTitle: 'Request',
+    responseTitle: 'Response',
+  },
+  setBuiltInTools: {
+    info: 'Info',
+    setting: 'Setting',
+    toolDescription: 'Tool description',
+    parameters: 'parameters',
+    string: 'string',
+    number: 'number',
+    file: 'file',
+    required: 'Required',
+    infoAndSetting: 'Info & Settings',
+  },
+  noCustomTool: {
+    title: 'No custom tools!',
+    content: 'Add and manage your custom tools here for building AI apps.',
+    createTool: 'Create Tool',
+  },
+  noSearchRes: {
+    title: 'Sorry, no results!',
+    content: 'We couldn\'t find any tools that match your search.',
+    reset: 'Reset Search',
+  },
+  builtInPromptTitle: 'Prompt',
+  toolRemoved: 'Tool removed',
+  notAuthorized: 'Not authorized',
+  howToGet: 'How to get',
+  openInStudio: 'Open in Studio',
+  toolNameUsageTip: 'Tool call name for agent reasoning and prompting',
+  copyToolName: 'Copy Name',
+  noTools: 'No tools found',
+}
+
+export default translation
diff --git a/i18n/en-US/workflow.ts b/i18n/en-US/workflow.ts
new file mode 100644
index 0000000..f7121a7
--- /dev/null
+++ b/i18n/en-US/workflow.ts
@@ -0,0 +1,917 @@
+const translation = {
+  common: {
+    undo: 'Undo',
+    redo: 'Redo',
+    editing: 'Editing',
+    autoSaved: 'Auto-Saved',
+    unpublished: 'Unpublished',
+    published: 'Published',
+    publish: 'Publish',
+    update: 'Update',
+    publishUpdate: 'Publish Update',
+    run: 'Run',
+    running: 'Running',
+    inRunMode: 'In Run Mode',
+    inPreview: 'In Preview',
+    inPreviewMode: 'In Preview Mode',
+    preview: 'Preview',
+    viewRunHistory: 'View run history',
+    runHistory: 'Run History',
+    goBackToEdit: 'Go back to editor',
+    conversationLog: 'Conversation Log',
+    features: 'Features',
+    featuresDescription: 'Enhance web app user experience',
+    ImageUploadLegacyTip: 'You can now create file type variables in the start form. We will no longer support the image upload feature in the future. ',
+    fileUploadTip: 'Image upload features have been upgraded to file upload. ',
+    featuresDocLink: 'Learn more',
+    debugAndPreview: 'Preview',
+    restart: 'Restart',
+    currentDraft: 'Current Draft',
+    currentDraftUnpublished: 'Current Draft Unpublished',
+    latestPublished: 'Latest Published',
+    publishedAt: 'Published',
+    restore: 'Restore',
+    versionHistory: 'Version History',
+    exitVersions: 'Exit Versions',
+    runApp: 'Run App',
+    batchRunApp: 'Batch Run App',
+    openInExplore: 'Open in Explore',
+    accessAPIReference: 'Access API Reference',
+    embedIntoSite: 'Embed Into Site',
+    addTitle: 'Add title...',
+    addDescription: 'Add description...',
+    noVar: 'No variable',
+    searchVar: 'Search variable',
+    variableNamePlaceholder: 'Variable name',
+    setVarValuePlaceholder: 'Set variable',
+    needConnectTip: 'This step is not connected to anything',
+    maxTreeDepth: 'Maximum limit of {{depth}} nodes per branch',
+    needEndNode: 'The End block must be added',
+    needAnswerNode: 'The Answer block must be added',
+    workflowProcess: 'Workflow Process',
+    notRunning: 'Not running yet',
+    previewPlaceholder: 'Enter content in the box below to start debugging the Chatbot',
+    effectVarConfirm: {
+      title: 'Remove Variable',
+      content: 'The variable is used in other nodes. Do you still want to remove it?',
+    },
+    insertVarTip: 'Press the \'/\' key to insert quickly',
+    processData: 'Process Data',
+    input: 'Input',
+    output: 'Output',
+    jinjaEditorPlaceholder: 'Type \'/\' or \'{\' to insert variable',
+    viewOnly: 'View Only',
+    showRunHistory: 'Show Run History',
+    enableJinja: 'Enable Jinja template support',
+    learnMore: 'Learn More',
+    copy: 'Copy',
+    duplicate: 'Duplicate',
+    addBlock: 'Add Block',
+    pasteHere: 'Paste Here',
+    pointerMode: 'Pointer Mode',
+    handMode: 'Hand Mode',
+    exportImage: 'Export Image',
+    exportPNG: 'Export as PNG',
+    exportJPEG: 'Export as JPEG',
+    exportSVG: 'Export as SVG',
+    model: 'Model',
+    workflowAsTool: 'Workflow as Tool',
+    configureRequired: 'Configure Required',
+    configure: 'Configure',
+    manageInTools: 'Manage in Tools',
+    workflowAsToolTip: 'Tool reconfiguration is required after the workflow update.',
+    viewDetailInTracingPanel: 'View details',
+    syncingData: 'Syncing data, just a few seconds.',
+    importDSL: 'Import DSL',
+    importDSLTip: 'Current draft will be overwritten.\nExport workflow as backup before importing.',
+    backupCurrentDraft: 'Backup Current Draft',
+    chooseDSL: 'Choose DSL file',
+    overwriteAndImport: 'Overwrite and Import',
+    importFailure: 'Import Failed',
+    importWarning: 'Caution',
+    importWarningDetails: 'DSL version difference may affect certain features',
+    importSuccess: 'Import Successfully',
+    parallelRun: 'Parallel Run',
+    parallelTip: {
+      click: {
+        title: 'Click',
+        desc: ' to add',
+      },
+      drag: {
+        title: 'Drag',
+        desc: ' to connect',
+      },
+      limit: 'Parallelism is limited to {{num}} branches.',
+      depthLimit: 'Parallel nesting layer limit of {{num}} layers',
+    },
+    disconnect: 'Disconnect',
+    jumpToNode: 'Jump to this node',
+    addParallelNode: 'Add Parallel Node',
+    parallel: 'PARALLEL',
+    branch: 'BRANCH',
+    onFailure: 'On Failure',
+    addFailureBranch: 'Add Fail Branch',
+    loadMore: 'Load More',
+    noHistory: 'No History',
+  },
+  env: {
+    envPanelTitle: 'Environment Variables',
+    envDescription: 'Environment variables can be used to store private information and credentials. They are read-only and can be separated from the DSL file during export.',
+    envPanelButton: 'Add Variable',
+    modal: {
+      title: 'Add Environment Variable',
+      editTitle: 'Edit Environment Variable',
+      type: 'Type',
+      name: 'Name',
+      namePlaceholder: 'env name',
+      value: 'Value',
+      valuePlaceholder: 'env value',
+      secretTip: 'Used to define sensitive information or data, with DSL settings configured for leak prevention.',
+    },
+    export: {
+      title: 'Export Secret environment variables?',
+      checkbox: 'Export secret values',
+      ignore: 'Export DSL',
+      export: 'Export DSL with secret values ',
+    },
+  },
+  chatVariable: {
+    panelTitle: 'Conversation Variables',
+    panelDescription: 'Conversation Variables are used to store interactive information that LLM needs to remember, including conversation history, uploaded files, user preferences. They are read-write. ',
+    docLink: 'Visit our docs to learn more.',
+    button: 'Add Variable',
+    modal: {
+      title: 'Add Conversation Variable',
+      editTitle: 'Edit Conversation Variable',
+      name: 'Name',
+      namePlaceholder: 'Variable name',
+      type: 'Type',
+      value: 'Default Value',
+      valuePlaceholder: 'Default value, leave blank to not set',
+      description: 'Description',
+      descriptionPlaceholder: 'Describe the variable',
+      editInJSON: 'Edit in JSON',
+      oneByOne: 'Add one by one',
+      editInForm: 'Edit in Form',
+      arrayValue: 'Value',
+      addArrayValue: 'Add Value',
+      objectKey: 'Key',
+      objectType: 'Type',
+      objectValue: 'Default Value',
+    },
+    storedContent: 'Stored content',
+    updatedAt: 'Updated at ',
+  },
+  changeHistory: {
+    title: 'Change History',
+    placeholder: 'You haven\'t changed anything yet',
+    clearHistory: 'Clear History',
+    hint: 'Hint',
+    hintText: 'Your editing actions are tracked in a change history, which is stored on your device for the duration of this session. This history will be cleared when you leave the editor.',
+    stepBackward_one: '{{count}} step backward',
+    stepBackward_other: '{{count}} steps backward',
+    stepForward_one: '{{count}} step forward',
+    stepForward_other: '{{count}} steps forward',
+    sessionStart: 'Session Start',
+    currentState: 'Current State',
+    nodeTitleChange: 'Block title changed',
+    nodeDescriptionChange: 'Block description changed',
+    nodeDragStop: 'Block moved',
+    nodeChange: 'Block changed',
+    nodeConnect: 'Block connected',
+    nodePaste: 'Block pasted',
+    nodeDelete: 'Block deleted',
+    nodeAdd: 'Block added',
+    nodeResize: 'Block resized',
+    noteAdd: 'Note added',
+    noteChange: 'Note changed',
+    noteDelete: 'Note deleted',
+    edgeDelete: 'Block disconnected',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} is required',
+    rerankModelRequired: 'A configured Rerank Model is required',
+    authRequired: 'Authorization is required',
+    invalidJson: '{{field}} is invalid JSON',
+    fields: {
+      variable: 'Variable Name',
+      variableValue: 'Variable Value',
+      code: 'Code',
+      model: 'Model',
+      rerankModel: 'A configured Rerank Model',
+      visionVariable: 'Vision Variable',
+    },
+    invalidVariable: 'Invalid variable',
+    noValidTool: '{{field}} no valid tool selected',
+    toolParameterRequired: '{{field}}: parameter [{{param}}] is required',
+  },
+  singleRun: {
+    testRun: 'Test Run ',
+    startRun: 'Start Run',
+    running: 'Running',
+    testRunIteration: 'Test Run Iteration',
+    back: 'Back',
+    iteration: 'Iteration',
+    loop: 'Loop',
+  },
+  tabs: {
+    'searchBlock': 'Search block',
+    'blocks': 'Blocks',
+    'searchTool': 'Search tool',
+    'tools': 'Tools',
+    'allTool': 'All',
+    'plugin': 'Plugin',
+    'customTool': 'Custom',
+    'workflowTool': 'Workflow',
+    'question-understand': 'Question Understand',
+    'logic': 'Logic',
+    'transform': 'Transform',
+    'utilities': 'Utilities',
+    'noResult': 'No match found',
+    'agent': 'Agent Strategy',
+  },
+  blocks: {
+    'start': 'Start',
+    'end': 'End',
+    'answer': 'Answer',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'Knowledge Retrieval',
+    'question-classifier': 'Question Classifier',
+    'if-else': 'IF/ELSE',
+    'code': 'Code',
+    'template-transform': 'Template',
+    'http-request': 'HTTP Request',
+    'variable-assigner': 'Variable Aggregator',
+    'variable-aggregator': 'Variable Aggregator',
+    'assigner': 'Variable Assigner',
+    'iteration-start': 'Iteration Start',
+    'iteration': 'Iteration',
+    'parameter-extractor': 'Parameter Extractor',
+    'document-extractor': 'Doc Extractor',
+    'list-operator': 'List Operator',
+    'agent': 'Agent',
+    'loop-start': 'Loop Start',
+    'loop': 'Loop',
+    'loop-end': 'Exit Loop',
+  },
+  blocksAbout: {
+    'start': 'Define the initial parameters for launching a workflow',
+    'end': 'Define the end and result type of a workflow',
+    'answer': 'Define the reply content of a chat conversation',
+    'llm': 'Invoking large language models to answer questions or process natural language',
+    'knowledge-retrieval': 'Allows you to query text content related to user questions from the Knowledge',
+    'question-classifier': 'Define the classification conditions of user questions, LLM can define how the conversation progresses based on the classification description',
+    'if-else': 'Allows you to split the workflow into two branches based on if/else conditions',
+    'code': 'Execute a piece of Python or NodeJS code to implement custom logic',
+    'template-transform': 'Convert data to string using Jinja template syntax',
+    'http-request': 'Allow server requests to be sent over the HTTP protocol',
+    'variable-assigner': 'Aggregate multi-branch variables into a single variable for unified configuration of downstream nodes.',
+    'assigner': 'The variable assignment node is used for assigning values to writable variables(like conversation variables).',
+    'variable-aggregator': 'Aggregate multi-branch variables into a single variable for unified configuration of downstream nodes.',
+    'iteration': 'Perform multiple steps on a list object until all results are outputted.',
+    'loop': 'Execute a loop of logic until the termination condition is met or the maximum loop count is reached.',
+    'loop-end': 'Equivalent to "break". This node has no configuration items. When the loop body reaches this node, the loop terminates.',
+    'parameter-extractor': 'Use LLM to extract structured parameters from natural language for tool invocations or HTTP requests.',
+    'document-extractor': 'Used to parse uploaded documents into text content that is easily understandable by LLM.',
+    'list-operator': 'Used to filter or sort array content.',
+    'agent': 'Invoking large language models to answer questions or process natural language',
+  },
+  operator: {
+    zoomIn: 'Zoom In',
+    zoomOut: 'Zoom Out',
+    zoomTo50: 'Zoom to 50%',
+    zoomTo100: 'Zoom to 100%',
+    zoomToFit: 'Zoom to Fit',
+  },
+  variableReference: {
+    noAvailableVars: 'No available variables',
+    noVarsForOperation: 'There are no variables available for assignment with the selected operation.',
+    noAssignedVars: 'No available assigned variables',
+    assignedVarsDescription: 'Assigned variables must be writable variables, such as ',
+    conversationVars: 'conversation variables',
+  },
+  panel: {
+    userInputField: 'User Input Field',
+    changeBlock: 'Change Block',
+    helpLink: 'Help Link',
+    about: 'About',
+    createdBy: 'Created By ',
+    nextStep: 'Next Step',
+    addNextStep: 'Add the next block in this workflow',
+    selectNextStep: 'Select Next Block',
+    runThisStep: 'Run this step',
+    checklist: 'Checklist',
+    checklistTip: 'Make sure all issues are resolved before publishing',
+    checklistResolved: 'All issues are resolved',
+    organizeBlocks: 'Organize blocks',
+    change: 'Change',
+    optional: '(optional)',
+  },
+  nodes: {
+    common: {
+      outputVars: 'Output Variables',
+      insertVarTip: 'Insert Variable',
+      memory: {
+        memory: 'Memory',
+        memoryTip: 'Chat memory settings',
+        windowSize: 'Window Size',
+        conversationRoleName: 'Conversation Role Name',
+        user: 'User prefix',
+        assistant: 'Assistant prefix',
+      },
+      memories: {
+        title: 'Memories',
+        tip: 'Chat memory',
+        builtIn: 'Built-in',
+      },
+      errorHandle: {
+        title: 'Error Handling',
+        tip: 'Exception handling strategy, triggered when a node encounters an exception.',
+        none: {
+          title: 'None',
+          desc: 'The node will stop running if an exception occurs and is not handled',
+        },
+        defaultValue: {
+          title: 'Default Value',
+          desc: 'When an error occurs, specify a static output content.',
+          tip: 'On error, will return below value.',
+          inLog: 'Node exception, outputting according to default values.',
+          output: 'Output Default Value',
+        },
+        failBranch: {
+          title: 'Fail Branch',
+          desc: 'When an error occurs, it will execute the exception branch',
+          customize: 'Go to the canvas to customize the fail branch logic.',
+          customizeTip: 'When the fail branch is activated, exceptions thrown by nodes will not terminate the process. Instead, it will automatically execute the predefined fail branch, allowing you to flexibly provide error messages, reports, fixes, or skip actions.',
+          inLog: 'Node exception, will automatically execute the fail branch. The node output will return an error type and error message and pass them to downstream.',
+        },
+        partialSucceeded: {
+          tip: 'There are {{num}} nodes in the process running abnormally, please go to tracing to check the logs.',
+        },
+      },
+      retry: {
+        retry: 'Retry',
+        retryOnFailure: 'retry on failure',
+        maxRetries: 'max retries',
+        retryInterval: 'retry interval',
+        retryTimes: 'Retry {{times}} times on failure',
+        retrying: 'Retrying...',
+        retrySuccessful: 'Retry successful',
+        retryFailed: 'Retry failed',
+        retryFailedTimes: '{{times}} retries failed',
+        times: 'times',
+        ms: 'ms',
+        retries: '{{num}} Retries',
+      },
+    },
+    start: {
+      required: 'required',
+      inputField: 'Input Field',
+      builtInVar: 'Built-in Variables',
+      outputVars: {
+        query: 'User input',
+        memories: {
+          des: 'Conversation history',
+          type: 'message type',
+          content: 'message content',
+        },
+        files: 'File list',
+      },
+      noVarTip: 'Set inputs that can be used in the Workflow',
+    },
+    end: {
+      outputs: 'Outputs',
+      output: {
+        type: 'output type',
+        variable: 'output variable',
+      },
+      type: {
+        'none': 'None',
+        'plain-text': 'Plain Text',
+        'structured': 'Structured',
+      },
+    },
+    answer: {
+      answer: 'Answer',
+      outputVars: 'Output Variables',
+    },
+    llm: {
+      model: 'model',
+      variables: 'variables',
+      context: 'context',
+      contextTooltip: 'You can import Knowledge as context',
+      notSetContextInPromptTip: 'To enable the context feature, please fill in the context variable in PROMPT.',
+      prompt: 'prompt',
+      roleDescription: {
+        system: 'Give high level instructions for the conversation',
+        user: 'Provide instructions, queries, or any text-based input to the model',
+        assistant: 'The model鈥檚 responses  based on the user messages',
+      },
+      addMessage: 'Add Message',
+      vision: 'vision',
+      files: 'Files',
+      resolution: {
+        name: 'Resolution',
+        high: 'High',
+        low: 'Low',
+      },
+      outputVars: {
+        output: 'Generate content',
+        usage: 'Model Usage Information',
+      },
+      singleRun: {
+        variable: 'Variable',
+      },
+      sysQueryInUser: 'sys.query in user message is required',
+      jsonSchema: {
+        title: 'Structured Output Schema',
+        instruction: 'Instruction',
+        promptTooltip: 'Convert the text description into a standardized JSON Schema structure.',
+        promptPlaceholder: 'Describe your JSON Schema...',
+        generate: 'Generate',
+        import: 'Import from JSON',
+        generateJsonSchema: 'Generate JSON Schema',
+        generationTip: 'You can use natural language to quickly create a JSON Schema.',
+        generating: 'Generating JSON Schema...',
+        generatedResult: 'Generated Result',
+        resultTip: 'Here is the generated result. If you\'re not satisfied, you can go back and modify your prompt.',
+        back: 'Back',
+        regenerate: 'Regenerate',
+        apply: 'Apply',
+        doc: 'Learn more about structured output',
+        resetDefaults: 'Reset',
+        required: 'required',
+        addField: 'Add Field',
+        addChildField: 'Add Child Field',
+        showAdvancedOptions: 'Show advanced options',
+        stringValidations: 'String Validations',
+        fieldNamePlaceholder: 'Field Name',
+        descriptionPlaceholder: 'Add description',
+        warningTips: {
+          saveSchema: 'Please finish editing the current field before saving the schema',
+        },
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'Query Variable',
+      knowledge: 'Knowledge',
+      outputVars: {
+        output: 'Retrieval segmented data',
+        content: 'Segmented content',
+        title: 'Segmented title',
+        icon: 'Segmented icon',
+        url: 'Segmented URL',
+        metadata: 'Other metadata',
+      },
+      metadata: {
+        title: 'Metadata Filtering',
+        tip: 'Metadata filtering is the process of using metadata attributes (such as tags, categories, or access permissions) to refine and control the retrieval of relevant information within a system.',
+        options: {
+          disabled: {
+            title: 'Disabled',
+            subTitle: 'Not enabling metadata filtering',
+          },
+          automatic: {
+            title: 'Automatic',
+            subTitle: 'Automatically generate metadata filtering conditions based on user query',
+            desc: 'Automatically generate metadata filtering conditions based on Query Variable',
+          },
+          manual: {
+            title: 'Manual',
+            subTitle: 'Manually add metadata filtering conditions',
+          },
+        },
+        panel: {
+          title: 'Metadata Filter Conditions',
+          conditions: 'Conditions',
+          add: 'Add Condition',
+          search: 'Search metadata',
+          placeholder: 'Enter value',
+          datePlaceholder: 'Choose a time...',
+          select: 'Select variable...',
+        },
+      },
+    },
+    http: {
+      inputVars: 'Input Variables',
+      api: 'API',
+      apiPlaceholder: 'Enter URL, type 鈥�/鈥� insert variable',
+      extractListPlaceholder: 'Enter list item index, type 鈥�/鈥� insert variable',
+      notStartWithHttp: 'API should start with http:// or https://',
+      key: 'Key',
+      type: 'Type',
+      value: 'Value',
+      bulkEdit: 'Bulk Edit',
+      keyValueEdit: 'Key-Value Edit',
+      headers: 'Headers',
+      params: 'Params',
+      body: 'Body',
+      binaryFileVariable: 'Binary File Variable',
+      outputVars: {
+        body: 'Response Content',
+        statusCode: 'Response Status Code',
+        headers: 'Response Header List JSON',
+        files: 'Files List',
+      },
+      authorization: {
+        'authorization': 'Authorization',
+        'authorizationType': 'Authorization Type',
+        'no-auth': 'None',
+        'api-key': 'API-Key',
+        'auth-type': 'Auth Type',
+        'basic': 'Basic',
+        'bearer': 'Bearer',
+        'custom': 'Custom',
+        'api-key-title': 'API Key',
+        'header': 'Header',
+      },
+      insertVarPlaceholder: 'type \'/\' to insert variable',
+      timeout: {
+        title: 'Timeout',
+        connectLabel: 'Connection Timeout',
+        connectPlaceholder: 'Enter connection timeout in seconds',
+        readLabel: 'Read Timeout',
+        readPlaceholder: 'Enter read timeout in seconds',
+        writeLabel: 'Write Timeout',
+        writePlaceholder: 'Enter write timeout in seconds',
+      },
+      curl: {
+        title: 'Import from cURL',
+        placeholder: 'Paste cURL string here',
+      },
+    },
+    code: {
+      inputVars: 'Input Variables',
+      outputVars: 'Output Variables',
+      advancedDependencies: 'Advanced Dependencies',
+      advancedDependenciesTip: 'Add some preloaded dependencies that take more time to consume or are not default built-in here',
+      searchDependencies: 'Search Dependencies',
+    },
+    templateTransform: {
+      inputVars: 'Input Variables',
+      code: 'Code',
+      codeSupportTip: 'Only supports Jinja2',
+      outputVars: {
+        output: 'Transformed content',
+      },
+    },
+    ifElse: {
+      if: 'If',
+      else: 'Else',
+      elseDescription: 'Used to define the logic that should be executed when the if condition is not met.',
+      and: 'and',
+      or: 'or',
+      operator: 'Operator',
+      notSetVariable: 'Please set variable first',
+      comparisonOperator: {
+        'contains': 'contains',
+        'not contains': 'not contains',
+        'start with': 'start with',
+        'end with': 'end with',
+        'is': 'is',
+        'is not': 'is not',
+        'empty': 'is empty',
+        'not empty': 'is not empty',
+        'null': 'is null',
+        'not null': 'is not null',
+        'in': 'in',
+        'not in': 'not in',
+        'all of': 'all of',
+        'exists': 'exists',
+        'not exists': 'not exists',
+        'before': 'before',
+        'after': 'after',
+      },
+      optionName: {
+        image: 'Image',
+        doc: 'Doc',
+        audio: 'Audio',
+        video: 'Video',
+        localUpload: 'Local Upload',
+        url: 'URL',
+      },
+      enterValue: 'Enter value',
+      addCondition: 'Add Condition',
+      conditionNotSetup: 'Condition NOT setup',
+      selectVariable: 'Select variable...',
+      addSubVariable: 'Sub Variable',
+      select: 'Select',
+    },
+    variableAssigner: {
+      title: 'Assign variables',
+      outputType: 'Output Type',
+      varNotSet: 'Variable not set',
+      noVarTip: 'Add the variables to be assigned',
+      type: {
+        string: 'String',
+        number: 'Number',
+        object: 'Object',
+        array: 'Array',
+      },
+      aggregationGroup: 'Aggregation Group',
+      aggregationGroupTip: 'Enabling this feature allows the variable aggregator to aggregate multiple sets of variables.',
+      addGroup: 'Add Group',
+      outputVars: {
+        varDescribe: '{{groupName}} output',
+      },
+      setAssignVariable: 'Set assign variable',
+    },
+    assigner: {
+      'assignedVariable': 'Assigned Variable',
+      'varNotSet': 'Variable NOT Set',
+      'variables': 'Variables',
+      'noVarTip': 'Click the "+" button to add variables',
+      'writeMode': 'Write Mode',
+      'writeModeTip': 'Append mode: Available for array variables only.',
+      'over-write': 'Overwrite',
+      'append': 'Append',
+      'plus': 'Plus',
+      'clear': 'Clear',
+      'setVariable': 'Set Variable',
+      'selectAssignedVariable': 'Select assigned variable...',
+      'setParameter': 'Set parameter...',
+      'operations': {
+        'title': 'Operation',
+        'over-write': 'Overwrite',
+        'overwrite': 'Overwrite',
+        'set': 'Set',
+        'clear': 'Clear',
+        'extend': 'Extend',
+        'append': 'Append',
+        'remove-first': 'Remove First',
+        'remove-last': 'Remove Last',
+        '+=': '+=',
+        '-=': '-=',
+        '*=': '*=',
+        '/=': '/=',
+      },
+      'variable': 'Variable',
+      'noAssignedVars': 'No available assigned variables',
+      'assignedVarsDescription': 'Assigned variables must be writable variables, such as conversation variables.',
+    },
+    tool: {
+      toAuthorize: 'To authorize',
+      inputVars: 'Input Variables',
+      outputVars: {
+        text: 'tool generated content',
+        files: {
+          title: 'tool generated files',
+          type: 'Support type. Now only support image',
+          transfer_method: 'Transfer method.Value is  remote_url or local_file',
+          url: 'Image url',
+          upload_file_id: 'Upload file id',
+        },
+        json: 'tool generated json',
+      },
+    },
+    questionClassifiers: {
+      model: 'model',
+      inputVars: 'Input Variables',
+      outputVars: {
+        className: 'Class Name',
+      },
+      class: 'Class',
+      classNamePlaceholder: 'Write your class name',
+      advancedSetting: 'Advanced Setting',
+      topicName: 'Topic Name',
+      topicPlaceholder: 'Write your topic name',
+      addClass: 'Add Class',
+      instruction: 'Instruction',
+      instructionTip: 'Input additional instructions to help the question classifier better understand how to categorize questions.',
+      instructionPlaceholder: 'Write your instruction',
+    },
+    parameterExtractor: {
+      inputVar: 'Input Variable',
+      extractParameters: 'Extract Parameters',
+      importFromTool: 'Import from tools',
+      addExtractParameter: 'Add Extract Parameter',
+      addExtractParameterContent: {
+        name: 'Name',
+        namePlaceholder: 'Extract Parameter Name',
+        type: 'Type',
+        typePlaceholder: 'Extract Parameter Type',
+        description: 'Description',
+        descriptionPlaceholder: 'Extract Parameter Description',
+        required: 'Required',
+        requiredContent: 'Required is only used as a reference for model inference, and not for mandatory validation of parameter output.',
+      },
+      extractParametersNotSet: 'Extract Parameters not setup',
+      instruction: 'Instruction',
+      instructionTip: 'Input additional instructions to help the parameter extractor understand how to extract parameters.',
+      advancedSetting: 'Advanced Setting',
+      reasoningMode: 'Reasoning Mode',
+      reasoningModeTip: 'You can choose the appropriate reasoning mode based on the model\'s ability to respond to instructions for function calling or prompts.',
+      isSuccess: 'Is Success.On success the value is 1, on failure the value is 0.',
+      errorReason: 'Error Reason',
+    },
+    iteration: {
+      deleteTitle: 'Delete Iteration Node?',
+      deleteDesc: 'Deleting the iteration node will delete all child nodes',
+      input: 'Input',
+      output: 'Output Variables',
+      iteration_one: '{{count}} Iteration',
+      iteration_other: '{{count}} Iterations',
+      currentIteration: 'Current Iteration',
+      comma: ', ',
+      error_one: '{{count}} Error',
+      error_other: '{{count}} Errors',
+      parallelMode: 'Parallel Mode',
+      parallelModeUpper: 'PARALLEL MODE',
+      parallelModeEnableTitle: 'Parallel Mode Enabled',
+      parallelModeEnableDesc: 'In parallel mode, tasks within iterations support parallel execution. You can configure this in the properties panel on the right.',
+      parallelPanelDesc: 'In parallel mode, tasks in the iteration support parallel execution.',
+      MaxParallelismTitle: 'Maximum parallelism',
+      MaxParallelismDesc: 'The maximum parallelism is used to control the number of tasks executed simultaneously in a single iteration.',
+      errorResponseMethod: 'Error response method',
+      ErrorMethod: {
+        operationTerminated: 'Terminated',
+        continueOnError: 'Continue on Error',
+        removeAbnormalOutput: 'Remove Abnormal Output',
+      },
+      answerNodeWarningDesc: 'Parallel mode warning: Answer nodes, conversation variable assignments, and persistent read/write operations within iterations may cause exceptions.',
+    },
+    loop: {
+      deleteTitle: 'Delete Loop Node?',
+      deleteDesc: 'Deleting the loop node will remove all child nodes',
+      input: 'Input',
+      output: 'Output Variable',
+      loop_one: '{{count}} Loop',
+      loop_other: '{{count}} Loops',
+      currentLoop: 'Current Loop',
+      comma: ', ',
+      error_one: '{{count}} Error',
+      error_other: '{{count}} Errors',
+      breakCondition: 'Loop Termination Condition',
+      breakConditionTip: 'Only variables within loops with termination conditions and conversation variables can be referenced.',
+      loopMaxCount: 'Maximum Loop Count',
+      loopMaxCountError: 'Please enter a valid maximum loop count, ranging from 1 to {{maxCount}}',
+      errorResponseMethod: 'Error Response Method',
+      ErrorMethod: {
+        operationTerminated: 'Terminated',
+        continueOnError: 'Continue on Error',
+        removeAbnormalOutput: 'Remove Abnormal Output',
+      },
+      loopVariables: 'Loop Variables',
+      initialLoopVariables: 'Initial Loop Variables',
+      finalLoopVariables: 'Final Loop Variables',
+      setLoopVariables: 'Set variables within the loop scope',
+      variableName: 'Variable Name',
+      inputMode: 'Input Mode',
+      exitConditionTip: 'A loop node needs at least one exit condition',
+      loopNode: 'Loop Node',
+      currentLoopCount: 'Current loop count: {{count}}',
+      totalLoopCount: 'Total loop count: {{count}}',
+    },
+    note: {
+      addNote: 'Add Note',
+      editor: {
+        placeholder: 'Write your note...',
+        small: 'Small',
+        medium: 'Medium',
+        large: 'Large',
+        bold: 'Bold',
+        italic: 'Italic',
+        strikethrough: 'Strikethrough',
+        link: 'Link',
+        openLink: 'Open',
+        unlink: 'Unlink',
+        enterUrl: 'Enter URL...',
+        invalidUrl: 'Invalid URL',
+        bulletList: 'Bullet List',
+        showAuthor: 'Show Author',
+      },
+    },
+    docExtractor: {
+      inputVar: 'Input Variable',
+      outputVars: {
+        text: 'Extracted text',
+      },
+      supportFileTypes: 'Support file types: {{types}}.',
+      learnMore: 'Learn more',
+    },
+    listFilter: {
+      inputVar: 'Input Variable',
+      filterCondition: 'Filter Condition',
+      filterConditionKey: 'Filter Condition Key',
+      extractsCondition: 'Extract the N item',
+      filterConditionComparisonOperator: 'Filter Condition Comparison Operator',
+      filterConditionComparisonValue: 'Filter Condition value',
+      selectVariableKeyPlaceholder: 'Select sub variable key',
+      limit: 'Top N',
+      orderBy: 'Order by',
+      asc: 'ASC',
+      desc: 'DESC',
+      outputVars: {
+        result: 'Filter result',
+        first_record: 'First record',
+        last_record: 'Last record',
+      },
+    },
+    agent: {
+      strategy: {
+        label: 'Agentic Strategy',
+        tooltip: 'Different Agentic strategies determine how the system plans and executes multi-step tool calls',
+        shortLabel: 'Strategy',
+        configureTip: 'Please configure agentic strategy.',
+        configureTipDesc: 'After configuring the agentic strategy, this node will automatically load the remaining configurations. The strategy will affect the mechanism of multi-step tool reasoning. ',
+        selectTip: 'Select agentic strategy',
+        searchPlaceholder: 'Search agentic strategy',
+      },
+      learnMore: 'Learn more',
+      pluginNotInstalled: 'This plugin is not installed',
+      pluginNotInstalledDesc: 'This plugin is installed from GitHub. Please go to Plugins to reinstall',
+      linkToPlugin: 'Link to Plugins',
+      pluginInstaller: {
+        install: 'Install',
+        installing: 'Installing',
+      },
+      modelNotInMarketplace: {
+        title: 'Model not installed',
+        desc: 'This model is installed from Local or GitHub repository. Please use after installation.',
+        manageInPlugins: 'Manage in Plugins',
+      },
+      modelNotSupport: {
+        title: 'Unsupported Model',
+        desc: 'The installed plugin version does not provide this model.',
+        descForVersionSwitch: 'The installed plugin version does not provide this model. Click to switch version.',
+      },
+      configureModel: 'Configure Model',
+      notAuthorized: 'Not Authorized',
+      model: 'model',
+      toolbox: 'toolbox',
+      strategyNotSet: 'Agentic strategy Not Set',
+      tools: 'Tools',
+      maxIterations: 'Max Iterations',
+      modelNotSelected: 'Model not selected',
+      modelNotInstallTooltip: 'This model is not installed',
+      toolNotInstallTooltip: '{{tool}} is not installed',
+      toolNotAuthorizedTooltip: '{{tool}} Not Authorized',
+      strategyNotInstallTooltip: '{{strategy}} is not installed',
+      unsupportedStrategy: 'Unsupported strategy',
+      pluginNotFoundDesc: 'This plugin is installed from GitHub. Please go to Plugins to reinstall',
+      strategyNotFoundDesc: 'The installed plugin version does not provide this strategy.',
+      strategyNotFoundDescAndSwitchVersion: 'The installed plugin version does not provide this strategy. Click to switch version.',
+      modelSelectorTooltips: {
+        deprecated: 'This model is deprecated',
+      },
+      outputVars: {
+        text: 'agent generated content',
+        files: {
+          title: 'agent generated files',
+          type: 'Support type. Now only support image',
+          transfer_method: 'Transfer method.Value is  remote_url or local_file',
+          url: 'Image url',
+          upload_file_id: 'Upload file id',
+        },
+        json: 'agent generated json',
+      },
+      checkList: {
+        strategyNotSelected: 'Strategy not selected',
+      },
+      installPlugin: {
+        title: 'Install Plugin',
+        desc: 'About to install the following plugin',
+        changelog: 'Change log',
+        install: 'Install',
+        cancel: 'Cancel',
+      },
+    },
+  },
+  tracing: {
+    stopBy: 'Stop by {{user}}',
+  },
+  versionHistory: {
+    title: 'Versions',
+    currentDraft: 'Current Draft',
+    latest: 'Latest',
+    filter: {
+      all: 'All',
+      onlyYours: 'Only yours',
+      onlyShowNamedVersions: 'Only show named versions',
+      reset: 'Reset Filter',
+      empty: 'No matching version history found',
+    },
+    defaultName: 'Untitled Version',
+    nameThisVersion: 'Name this version',
+    editVersionInfo: 'Edit version info',
+    editField: {
+      title: 'Title',
+      releaseNotes: 'Release Notes',
+      titleLengthLimit: 'Title can\'t exceed {{limit}} characters',
+      releaseNotesLengthLimit: 'Release notes can\'t exceed {{limit}} characters',
+    },
+    releaseNotesPlaceholder: 'Describe what changed',
+    restorationTip: 'After version restoration, the current draft will be overwritten.',
+    deletionTip: 'Deletion is irreversible, please confirm.',
+    action: {
+      restoreSuccess: 'Version restored',
+      restoreFailure: 'Failed to restore version',
+      deleteSuccess: 'Version deleted',
+      deleteFailure: 'Failed to delete version',
+      updateSuccess: 'Version updated',
+      updateFailure: 'Failed to update version',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/es-ES/app-annotation.ts b/i18n/es-ES/app-annotation.ts
new file mode 100644
index 0000000..e090c46
--- /dev/null
+++ b/i18n/es-ES/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: 'Anotaciones',
+  name: 'Respuesta de Anotaci贸n',
+  editBy: 'Respuesta editada por {{author}}',
+  noData: {
+    title: 'Sin anotaciones',
+    description: 'Puedes editar anotaciones durante la depuraci贸n de la aplicaci贸n o importar anotaciones en masa aqu铆 para obtener una respuesta de alta calidad.',
+  },
+  table: {
+    header: {
+      question: 'pregunta',
+      answer: 'respuesta',
+      createdAt: 'creado el',
+      hits: 'aciertos',
+      actions: 'acciones',
+      addAnnotation: 'Agregar Anotaci贸n',
+      bulkImport: 'Importar en Masa',
+      bulkExport: 'Exportar en Masa',
+      clearAll: 'Borrar Todas las Anotaciones',
+    },
+  },
+  editModal: {
+    title: 'Editar Respuesta de Anotaci贸n',
+    queryName: 'Consulta del Usuario',
+    answerName: 'Bot Narrador',
+    yourAnswer: 'Tu Respuesta',
+    answerPlaceholder: 'Escribe tu respuesta aqu铆',
+    yourQuery: 'Tu Consulta',
+    queryPlaceholder: 'Escribe tu consulta aqu铆',
+    removeThisCache: 'Eliminar esta Anotaci贸n',
+    createdAt: 'Creado el',
+  },
+  addModal: {
+    title: 'Agregar Respuesta de Anotaci贸n',
+    queryName: 'Pregunta',
+    answerName: 'Respuesta',
+    answerPlaceholder: 'Escribe la respuesta aqu铆',
+    queryPlaceholder: 'Escribe la pregunta aqu铆',
+    createNext: 'Agregar otra respuesta anotada',
+  },
+  batchModal: {
+    title: 'Importaci贸n en Masa',
+    csvUploadTitle: 'Arrastra y suelta tu archivo CSV aqu铆, o ',
+    browse: 'navega',
+    tip: 'El archivo CSV debe cumplir con la siguiente estructura:',
+    question: 'pregunta',
+    answer: 'respuesta',
+    contentTitle: 'contenido del fragmento',
+    content: 'contenido',
+    template: 'Descarga la plantilla aqu铆',
+    cancel: 'Cancelar',
+    run: 'Ejecutar Lote',
+    runError: 'Error al ejecutar el lote',
+    processing: 'En proceso de lote',
+    completed: 'Importaci贸n completada',
+    error: 'Error de importaci贸n',
+    ok: 'OK',
+  },
+  errorMessage: {
+    answerRequired: 'Se requiere una respuesta',
+    queryRequired: 'Se requiere una pregunta',
+  },
+  viewModal: {
+    annotatedResponse: 'Respuesta de Anotaci贸n',
+    hitHistory: 'Historial de Aciertos',
+    hit: 'Acierto',
+    hits: 'Aciertos',
+    noHitHistory: 'Sin historial de aciertos',
+  },
+  hitHistoryTable: {
+    query: 'Consulta',
+    match: 'Coincidencia',
+    response: 'Respuesta',
+    source: 'Fuente',
+    score: 'Puntuaci贸n',
+    time: 'Tiempo',
+  },
+  initSetup: {
+    title: 'Configuraci贸n Inicial de Respuesta de Anotaci贸n',
+    configTitle: 'Configuraci贸n de Respuesta de Anotaci贸n',
+    confirmBtn: 'Guardar y Habilitar',
+    configConfirmBtn: 'Guardar',
+  },
+  embeddingModelSwitchTip: 'Modelo de vectorizaci贸n de texto de anotaci贸n, cambiar de modelo volver谩 a incrustar, lo que resultar谩 en costos adicionales.',
+}
+
+export default translation
diff --git a/i18n/es-ES/app-api.ts b/i18n/es-ES/app-api.ts
new file mode 100644
index 0000000..425545f
--- /dev/null
+++ b/i18n/es-ES/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'Servidor de API',
+  apiKey: 'Clave de API',
+  status: 'Estado',
+  disabled: 'Desactivado',
+  ok: 'En servicio',
+  copy: 'Copiar',
+  copied: 'Copiado',
+  play: 'Reproducir',
+  pause: 'Pausa',
+  playing: 'Reproduciendo',
+  loading: 'Cargando',
+  merMaid: {
+    rerender: 'Rehacer Rerender',
+  },
+  never: 'Nunca',
+  apiKeyModal: {
+    apiSecretKey: 'Clave secreta de API',
+    apiSecretKeyTips: 'Para evitar el abuso de la API, protege tu clave de API. Evita usarla como texto plano en el c贸digo del frontend. :)',
+    createNewSecretKey: 'Crear nueva clave secreta',
+    secretKey: 'Clave secreta',
+    created: 'CREADA',
+    lastUsed: '脷LTIMO USO',
+    generateTips: 'Guarda esta clave en un lugar seguro y accesible.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: '驴Eliminar esta clave secreta?',
+    deleteConfirmTips: 'Esta acci贸n no se puede deshacer.',
+    ok: 'OK',
+  },
+  completionMode: {
+    title: 'Completar App API',
+    info: 'Para generar texto de alta calidad, como art铆culos, res煤menes y traducciones, utiliza la API de mensajes de completado con la entrada del usuario. La generaci贸n de texto depende de los par谩metros del modelo y las plantillas de inicio establecidas en Dify Prompt Engineering.',
+    createCompletionApi: 'Crear mensaje de completado',
+    createCompletionApiTip: 'Crea un mensaje de completado para admitir el modo de pregunta y respuesta.',
+    inputsTips: '(Opcional) Proporciona campos de entrada de usuario como pares clave-valor, que corresponden a las variables en Prompt Eng. La clave es el nombre de la variable, el valor es el valor del par谩metro. Si el tipo de campo es Select, el valor enviado debe ser una de las opciones predefinidas.',
+    queryTips: 'Contenido de texto de entrada del usuario.',
+    blocking: 'Tipo de bloqueo, esperando a que se complete la ejecuci贸n y devuelva los resultados. (Las solicitudes pueden interrumpirse si el proceso es largo)',
+    streaming: 'devoluciones de transmisi贸n. Implementaci贸n de la devoluci贸n de transmisi贸n basada en SSE (Eventos enviados por el servidor).',
+    messageFeedbackApi: 'Comentarios de mensajes (me gusta)',
+    messageFeedbackApiTip: 'Califica los mensajes recibidos en nombre de los usuarios finales con me gusta o no me gusta. Estos datos son visibles en la p谩gina de Registros y Anotaciones y se utilizan para ajustar el modelo en el futuro.',
+    messageIDTip: 'ID del mensaje',
+    ratingTip: 'me gusta o no me gusta, null es deshacer',
+    parametersApi: 'Obtener informaci贸n de par谩metros de la aplicaci贸n',
+    parametersApiTip: 'Recupera los par谩metros de entrada configurados, incluidos los nombres de variables, los nombres de campos, los tipos y los valores predeterminados. Normalmente se utiliza para mostrar estos campos en un formulario o completar los valores predeterminados despu茅s de que el cliente se carga.',
+  },
+  chatMode: {
+    title: 'Chat App API',
+    info: 'Para aplicaciones de conversaci贸n vers谩tiles que utilizan un formato de preguntas y respuestas, llama a la API de mensajes de chat para iniciar el di谩logo. Mant茅n conversaciones en curso pasando el conversation_id devuelto. Los par谩metros de respuesta y las plantillas dependen de la configuraci贸n de Dify Prompt Eng.',
+    createChatApi: 'Crear mensaje de chat',
+    createChatApiTip: 'Crea un nuevo mensaje de conversaci贸n o contin煤a un di谩logo existente.',
+    inputsTips: '(Opcional) Proporciona campos de entrada de usuario como pares clave-valor, que corresponden a las variables en Prompt Eng. La clave es el nombre de la variable, el valor es el valor del par谩metro. Si el tipo de campo es Select, el valor enviado debe ser una de las opciones predefinidas.',
+    queryTips: 'Contenido de entrada/pregunta del usuario',
+    blocking: 'Tipo de bloqueo, esperando a que se complete la ejecuci贸n y devuelva los resultados. (Las solicitudes pueden interrumpirse si el proceso es largo)',
+    streaming: 'devoluciones de transmisi贸n. Implementaci贸n de la devoluci贸n de transmisi贸n basada en SSE (Eventos enviados por el servidor).',
+    conversationIdTip: '(Opcional) ID de conversaci贸n: dejar vac铆o para la primera conversaci贸n; pasar conversation_id del contexto para continuar el di谩logo.',
+    messageFeedbackApi: 'Comentarios terminales de mensajes, me gusta',
+    messageFeedbackApiTip: 'Califica los mensajes recibidos en nombre de los usuarios finales con me gusta o no me gusta. Estos datos son visibles en la p谩gina de Registros y Anotaciones y se utilizan para ajustar el modelo en el futuro.',
+    messageIDTip: 'ID del mensaje',
+    ratingTip: 'me gusta o no me gusta, null es deshacer',
+    chatMsgHistoryApi: 'Obtener el historial de mensajes de chat',
+    chatMsgHistoryApiTip: 'La primera p谩gina devuelve las 煤ltimas `limit` barras, en orden inverso.',
+    chatMsgHistoryConversationIdTip: 'ID de conversaci贸n',
+    chatMsgHistoryFirstId: 'ID del primer registro de chat en la p谩gina actual. El valor predeterminado es ninguno.',
+    chatMsgHistoryLimit: 'Cu谩ntos chats se devuelven en una solicitud',
+    conversationsListApi: 'Obtener lista de conversaciones',
+    conversationsListApiTip: 'Obtiene la lista de sesiones del usuario actual. De forma predeterminada, se devuelven las 煤ltimas 20 sesiones.',
+    conversationsListFirstIdTip: 'ID del 煤ltimo registro en la p谩gina actual, predeterminado ninguno.',
+    conversationsListLimitTip: 'Cu谩ntos chats se devuelven en una solicitud',
+    conversationRenamingApi: 'Renombrar conversaci贸n',
+    conversationRenamingApiTip: 'Cambia el nombre de las conversaciones; el nombre se muestra en las interfaces de cliente de m煤ltiples sesiones.',
+    conversationRenamingNameTip: 'Nuevo nombre',
+    parametersApi: 'Obtener informaci贸n de par谩metros de la aplicaci贸n',
+    parametersApiTip: 'Recupera los par谩metros de entrada configurados, incluidos los nombres de variables, los nombres de campos, los tipos y los valores predeterminados. Normalmente se utiliza para mostrar estos campos en un formulario o completar los valores predeterminados despu茅s de que el cliente se carga.',
+  },
+  develop: {
+    requestBody: 'Cuerpo de la solicitud',
+    pathParams: 'Par谩metros de ruta',
+    query: 'Consulta',
+    toc: 'Contenido',
+  },
+  regenerate: 'Regenerar',
+}
+
+export default translation
diff --git a/i18n/es-ES/app-debug.ts b/i18n/es-ES/app-debug.ts
new file mode 100644
index 0000000..ab5b82e
--- /dev/null
+++ b/i18n/es-ES/app-debug.ts
@@ -0,0 +1,419 @@
+const translation = {
+  pageTitle: {
+    line1: 'INDICACI脫N',
+    line2: 'Ingenier铆a',
+  },
+  orchestrate: 'Orquestar',
+  promptMode: {
+    simple: 'Cambia a Modo Experto para editar toda la INDICACI脫N',
+    advanced: 'Modo Experto',
+    switchBack: 'Volver',
+    advancedWarning: {
+      title: 'Has cambiado a Modo Experto, y una vez que modifiques la INDICACI脫N, NO PODR脕S regresar al modo b谩sico.',
+      description: 'En Modo Experto, puedes editar toda la INDICACI脫N.',
+      learnMore: 'Aprender m谩s',
+      ok: 'OK',
+    },
+    operation: {
+      addMessage: 'Agregar Mensaje',
+    },
+    contextMissing: 'Componente de contexto faltante, la efectividad de la indicaci贸n puede no ser buena.',
+  },
+  operation: {
+    applyConfig: 'Publicar',
+    resetConfig: 'Restablecer',
+    debugConfig: 'Depurar',
+    addFeature: 'Agregar Funci贸n',
+    automatic: 'Autom谩tico',
+    stopResponding: 'Dejar de responder',
+    agree: 'Me gusta',
+    disagree: 'No me gusta',
+    cancelAgree: 'Cancelar Me gusta',
+    cancelDisagree: 'Cancelar No me gusta',
+    userAction: 'Usuario ',
+  },
+  notSetAPIKey: {
+    title: 'La clave del proveedor LLM no se ha establecido',
+    trailFinished: 'Prueba terminada',
+    description: 'La clave del proveedor LLM no se ha establecido, y debe configurarse antes de depurar.',
+    settingBtn: 'Ir a configuraci贸n',
+  },
+  trailUseGPT4Info: {
+    title: 'No se admite GPT-4 ahora',
+    description: 'Para usar GPT-4, configure la clave API.',
+  },
+  feature: {
+    groupChat: {
+      title: 'Mejorar chat',
+      description: 'Agregar configuraciones previas a la conversaci贸n en aplicaciones puede mejorar la experiencia del usuario.',
+    },
+    groupExperience: {
+      title: 'Mejorar experiencia',
+    },
+    conversationOpener: {
+      title: 'Iniciadores de conversaci贸n',
+      description: 'En una aplicaci贸n de chat, la primera oraci贸n que la IA dice al usuario suele usarse como bienvenida.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: 'Seguimiento',
+      description: 'Configurar sugerencias de pr贸ximas preguntas puede proporcionar una mejor conversaci贸n.',
+      resDes: '3 sugerencias para la pr贸xima pregunta del usuario.',
+      tryToAsk: 'Intenta preguntar',
+    },
+    moreLikeThis: {
+      title: 'M谩s como esto',
+      description: 'Genera m煤ltiples textos a la vez, luego ed铆talos y contin煤a generando',
+      generateNumTip: 'N煤mero de veces generado cada vez',
+      tip: 'Usar esta funci贸n incurrir谩 en un costo adicional de tokens',
+    },
+    speechToText: {
+      title: 'Voz a Texto',
+      description: 'Una vez habilitado, puedes usar la entrada de voz.',
+      resDes: 'Entrada de voz habilitada',
+    },
+    textToSpeech: {
+      title: 'Texto a Voz',
+      description: 'Una vez habilitado, el texto puede convertirse en voz.',
+      resDes: 'Texto a Audio habilitado',
+    },
+    citation: {
+      title: 'Citas y Atribuciones',
+      description: 'Una vez habilitado, muestra el documento fuente y la secci贸n atribuida del contenido generado.',
+      resDes: 'Citas y Atribuciones habilitadas',
+    },
+    annotation: {
+      title: 'Respuesta de Anotaci贸n',
+      description: 'Puedes agregar manualmente una respuesta de alta calidad a la cach茅 para una coincidencia prioritaria con preguntas similares de los usuarios.',
+      resDes: 'Respuesta de Anotaci贸n habilitada',
+      scoreThreshold: {
+        title: 'Umbral de Puntuaci贸n',
+        description: 'Usado para establecer el umbral de similitud para la respuesta de anotaci贸n.',
+        easyMatch: 'Coincidencia F谩cil',
+        accurateMatch: 'Coincidencia Precisa',
+      },
+      matchVariable: {
+        title: 'Variable de Coincidencia',
+        choosePlaceholder: 'Elige la variable de coincidencia',
+      },
+      cacheManagement: 'Anotaciones',
+      cached: 'Anotado',
+      remove: 'Eliminar',
+      removeConfirm: '驴Eliminar esta anotaci贸n?',
+      add: 'Agregar anotaci贸n',
+      edit: 'Editar anotaci贸n',
+    },
+    dataSet: {
+      title: 'Contexto',
+      noData: 'Puedes importar Conocimiento como contexto',
+      words: 'Palabras',
+      textBlocks: 'Bloques de Texto',
+      selectTitle: 'Seleccionar Conocimiento de referencia',
+      selected: 'Conocimiento seleccionado',
+      noDataSet: 'No se encontr贸 Conocimiento',
+      toCreate: 'Ir a crear',
+      notSupportSelectMulti: 'Actualmente solo se admite un Conocimiento',
+      queryVariable: {
+        title: 'Variable de Consulta',
+        tip: 'Esta variable se utilizar谩 como entrada de consulta para la recuperaci贸n de contexto, obteniendo informaci贸n de contexto relacionada con la entrada de esta variable.',
+        choosePlaceholder: 'Elige la variable de consulta',
+        noVar: 'No hay variables',
+        noVarTip: 'por favor, crea una variable en la secci贸n Variables',
+        unableToQueryDataSet: 'No se puede consultar el Conocimiento',
+        unableToQueryDataSetTip: 'No se puede consultar el Conocimiento con 茅xito, por favor elige una variable de consulta de contexto en la secci贸n de contexto.',
+        ok: 'OK',
+        contextVarNotEmpty: 'La variable de consulta de contexto no puede estar vac铆a',
+        deleteContextVarTitle: '驴Eliminar variable "{{varName}}"?',
+        deleteContextVarTip: 'Esta variable ha sido establecida como una variable de consulta de contexto, y eliminarla afectar谩 el uso normal del Conocimiento. Si a煤n necesitas eliminarla, por favor vuelve a seleccionarla en la secci贸n de contexto.',
+      },
+    },
+    tools: {
+      title: 'Herramientas',
+      tips: 'Las herramientas proporcionan un m茅todo est谩ndar de llamada API, tomando la entrada del usuario o variables como par谩metros de solicitud para consultar datos externos como contexto.',
+      toolsInUse: '{{count}} herramientas en uso',
+      modal: {
+        title: 'Herramienta',
+        toolType: {
+          title: 'Tipo de Herramienta',
+          placeholder: 'Por favor selecciona el tipo de herramienta',
+        },
+        name: {
+          title: 'Nombre',
+          placeholder: 'Por favor ingresa el nombre',
+        },
+        variableName: {
+          title: 'Nombre de la Variable',
+          placeholder: 'Por favor ingresa el nombre de la variable',
+        },
+      },
+    },
+    conversationHistory: {
+      title: 'Historial de Conversaciones',
+      description: 'Establecer nombres de prefijo para los roles de conversaci贸n',
+      tip: 'El Historial de Conversaciones no est谩 habilitado, por favor agrega <histories> en la indicaci贸n arriba.',
+      learnMore: 'Aprender m谩s',
+      editModal: {
+        title: 'Editar Nombres de Roles de Conversaci贸n',
+        userPrefix: 'Prefijo de Usuario',
+        assistantPrefix: 'Prefijo de Asistente',
+      },
+    },
+    toolbox: {
+      title: 'CAJA DE HERRAMIENTAS',
+    },
+    moderation: {
+      title: 'Moderaci贸n de contenido',
+      description: 'Asegura la salida del modelo utilizando API de moderaci贸n o manteniendo una lista de palabras sensibles.',
+      allEnabled: 'Contenido de ENTRADA/SALIDA Habilitado',
+      inputEnabled: 'Contenido de ENTRADA Habilitado',
+      outputEnabled: 'Contenido de SALIDA Habilitado',
+      modal: {
+        title: 'Configuraci贸n de moderaci贸n de contenido',
+        provider: {
+          title: 'Proveedor',
+          openai: 'Moderaci贸n de OpenAI',
+          openaiTip: {
+            prefix: 'La Moderaci贸n de OpenAI requiere una clave API de OpenAI configurada en la ',
+            suffix: '.',
+          },
+          keywords: 'Palabras clave',
+        },
+        keywords: {
+          tip: 'Una por l铆nea, separadas por saltos de l铆nea. Hasta 100 caracteres por l铆nea.',
+          placeholder: 'Una por l铆nea, separadas por saltos de l铆nea',
+          line: 'L铆nea',
+        },
+        content: {
+          input: 'Moderar Contenido de ENTRADA',
+          output: 'Moderar Contenido de SALIDA',
+          preset: 'Respuestas predefinidas',
+          placeholder: 'Contenido de respuestas predefinidas aqu铆',
+          condition: 'Moderar Contenido de ENTRADA y SALIDA habilitado al menos uno',
+          fromApi: 'Las respuestas predefinidas son devueltas por la API',
+          errorMessage: 'Las respuestas predefinidas no pueden estar vac铆as',
+          supportMarkdown: 'Markdown soportado',
+        },
+        openaiNotConfig: {
+          before: 'La Moderaci贸n de OpenAI requiere una clave API de OpenAI configurada en la',
+          after: '',
+        },
+      },
+    },
+  },
+  automatic: {
+    title: 'Orquestaci贸n automatizada de aplicaciones',
+    description: 'Describe tu escenario, Dify orquestar谩 una aplicaci贸n para ti.',
+    intendedAudience: '驴Qui茅n es el p煤blico objetivo?',
+    intendedAudiencePlaceHolder: 'p.ej. Estudiante',
+    solveProblem: '驴Qu茅 problemas esperan que la IA pueda resolver para ellos?',
+    solveProblemPlaceHolder: 'p.ej. Extraer ideas y resumir informaci贸n de informes y art铆culos largos',
+    generate: 'Generar',
+    audiencesRequired: 'Audiencia requerida',
+    problemRequired: 'Problema requerido',
+    resTitle: 'Hemos orquestado la siguiente aplicaci贸n para ti.',
+    apply: 'Aplicar esta orquestaci贸n',
+    noData: 'Describe tu caso de uso a la izquierda, la vista previa de la orquestaci贸n se mostrar谩 aqu铆.',
+    loading: 'Orquestando la aplicaci贸n para ti...',
+    overwriteTitle: '驴Sobrescribir configuraci贸n existente?',
+    overwriteMessage: 'Aplicar esta orquestaci贸n sobrescribir谩 la configuraci贸n existente.',
+  },
+  resetConfig: {
+    title: '驴Confirmar restablecimiento?',
+    message: 'Restablecer descarta cambios, restaurando la 煤ltima configuraci贸n publicada.',
+  },
+  errorMessage: {
+    nameOfKeyRequired: 'nombre de la clave: {{key}} requerido',
+    valueOfVarRequired: 'el valor de {{key}} no puede estar vac铆o',
+    queryRequired: 'Se requiere texto de solicitud.',
+    waitForResponse: 'Por favor espera la respuesta al mensaje anterior para completar.',
+    waitForBatchResponse: 'Por favor espera la respuesta a la tarea por lotes para completar.',
+    notSelectModel: 'Por favor elige un modelo',
+    waitForImgUpload: 'Por favor espera a que la imagen se cargue',
+  },
+  chatSubTitle: 'Instrucciones',
+  completionSubTitle: 'Prefijo de la Indicaci贸n',
+  promptTip: 'Las indicaciones gu铆an las respuestas de la IA con instrucciones y restricciones. Inserta variables como {{input}}. Esta indicaci贸n no ser谩 visible para los usuarios.',
+  formattingChangedTitle: 'Formato cambiado',
+  formattingChangedText: 'Modificar el formato restablecer谩 el 谩rea de depuraci贸n, 驴est谩s seguro?',
+  variableTitle: 'Variables',
+  variableTip: 'Los usuarios completan las variables en un formulario, reemplazando autom谩ticamente las variables en la indicaci贸n.',
+  notSetVar: 'Las variables permiten a los usuarios introducir palabras de indicaci贸n u observaciones de apertura al completar formularios. Puedes intentar ingresar "{{input}}" en las palabras de indicaci贸n.',
+  autoAddVar: 'Variables no definidas referenciadas en la pre-indicaci贸n, 驴quieres agregarlas en el formulario de entrada del usuario?',
+  variableTable: {
+    key: 'Clave de Variable',
+    name: 'Nombre del Campo de Entrada del Usuario',
+    optional: 'Opcional',
+    type: 'Tipo de Entrada',
+    action: 'Acciones',
+    typeString: 'Cadena',
+    typeSelect: 'Seleccionar',
+  },
+  varKeyError: {
+    canNoBeEmpty: 'Se requiere {{key}}',
+    tooLong: '{{key}} demasiado larga. No puede tener m谩s de 30 caracteres',
+    notValid: '{{key}} no es v谩lida. Solo puede contener letras, n煤meros y guiones bajos',
+    notStartWithNumber: '{{key}} no puede comenzar con un n煤mero',
+    keyAlreadyExists: '{{key}} ya existe',
+  },
+  otherError: {
+    promptNoBeEmpty: 'La indicaci贸n no puede estar vac铆a',
+    historyNoBeEmpty: 'El historial de conversaciones debe establecerse en la indicaci贸n',
+    queryNoBeEmpty: 'La consulta debe establecerse en la indicaci贸n',
+  },
+  variableConfig: {
+    'addModalTitle': 'Agregar Campo de Entrada',
+    'editModalTitle': 'Editar Campo de Entrada',
+    'description': 'Configuraci贸n para la variable {{varName}}',
+    'fieldType': 'Tipo de campo',
+    'string': 'Texto corto',
+    'text-input': 'Texto corto',
+    'paragraph': 'P谩rrafo',
+    'select': 'Seleccionar',
+    'number': 'N煤mero',
+    'notSet': 'No configurado, intenta escribir {{input}} en la indicaci贸n de prefijo',
+    'stringTitle': 'Opciones de cuadro de texto de formulario',
+    'maxLength': 'Longitud m谩xima',
+    'options': 'Opciones',
+    'addOption': 'Agregar opci贸n',
+    'apiBasedVar': 'Variable basada en API',
+    'varName': 'Nombre de la Variable',
+    'labelName': 'Nombre de la Etiqueta',
+    'inputPlaceholder': 'Por favor ingresa',
+    'content': 'Contenido',
+    'required': 'Requerido',
+    'errorMsg': {
+      varNameRequired: 'Nombre de la variable es requerido',
+      labelNameRequired: 'Nombre de la etiqueta es requerido',
+      varNameCanBeRepeat: 'El nombre de la variable no puede repetirse',
+      atLeastOneOption: 'Se requiere al menos una opci贸n',
+      optionRepeat: 'Hay opciones repetidas',
+    },
+  },
+  vision: {
+    name: 'Visi贸n',
+    description: 'Habilitar Visi贸n permitir谩 al modelo recibir im谩genes y responder preguntas sobre ellas.',
+    settings: 'Configuraciones',
+    visionSettings: {
+      title: 'Configuraciones de Visi贸n',
+      resolution: 'Resoluci贸n',
+      resolutionTooltip: `Baja resoluci贸n permitir谩 que el modelo reciba una versi贸n de baja resoluci贸n de 512 x 512 de la imagen, y represente la imagen con un presupuesto de 65 tokens. Esto permite que la API devuelva respuestas m谩s r谩pidas y consuma menos tokens de entrada para casos de uso que no requieren alta detalle.
+      \n
+      Alta resoluci贸n permitir谩 primero que el modelo vea la imagen de baja resoluci贸n y luego crea recortes detallados de las im谩genes de entrada como cuadrados de 512px basados en el tama帽o de la imagen de entrada. Cada uno de los recortes detallados usa el doble del presupuesto de tokens para un total de 129 tokens.`,
+      high: 'Alta',
+      low: 'Baja',
+      uploadMethod: 'M茅todo de carga',
+      both: 'Ambos',
+      localUpload: 'Carga Local',
+      url: 'URL',
+      uploadLimit: 'L铆mite de carga',
+    },
+  },
+  voice: {
+    name: 'Voz',
+    defaultDisplay: 'Voz Predeterminada',
+    description: 'Configuraciones de voz a texto',
+    settings: 'Configuraciones',
+    voiceSettings: {
+      title: 'Configuraciones de Voz',
+      language: 'Idioma',
+      resolutionTooltip: 'Soporte de idioma para voz a texto.',
+      voice: 'Voz',
+      autoPlay: 'Auto-reproducci贸n',
+      autoPlayEnabled: 'Abierto',
+      autoPlayDisabled: 'Cierre',
+    },
+  },
+  openingStatement: {
+    title: 'Apertura de Conversaci贸n',
+    add: 'Agregar',
+    writeOpener: 'Escribir apertura',
+    placeholder: 'Escribe tu mensaje de apertura aqu铆, puedes usar variables, intenta escribir {{variable}}.',
+    openingQuestion: 'Preguntas de Apertura',
+    noDataPlaceHolder: 'Iniciar la conversaci贸n con el usuario puede ayudar a la IA a establecer una conexi贸n m谩s cercana con ellos en aplicaciones de conversaci贸n.',
+    varTip: 'Puedes usar variables, intenta escribir {{variable}}',
+    tooShort: 'Se requieren al menos 20 palabras en la indicaci贸n inicial para generar una apertura de conversaci贸n.',
+    notIncludeKey: 'La indicaci贸n inicial no incluye la variable: {{key}}. Por favor agr茅gala a la indicaci贸n inicial.',
+  },
+  modelConfig: {
+    model: 'Modelo',
+    setTone: 'Establecer tono de respuestas',
+    title: 'Modelo y Par谩metros',
+    modeType: {
+      chat: 'Chat',
+      completion: 'Completar',
+    },
+  },
+  inputs: {
+    title: 'Depurar y Previsualizar',
+    noPrompt: 'Intenta escribir alguna indicaci贸n en la entrada de pre-indicaci贸n',
+    userInputField: 'Campo de Entrada del Usuario',
+    noVar: 'Completa el valor de la variable, que se reemplazar谩 autom谩ticamente en la palabra de indicaci贸n cada vez que se inicie una nueva sesi贸n.',
+    chatVarTip: 'Completa el valor de la variable, que se reemplazar谩 autom谩ticamente en la palabra de indicaci贸n cada vez que se inicie una nueva sesi贸n',
+    completionVarTip: 'Completa el valor de la variable, que se reemplazar谩 autom谩ticamente en las palabras de indicaci贸n cada vez que se env铆e una pregunta.',
+    previewTitle: 'Vista previa de la indicaci贸n',
+    queryTitle: 'Contenido de la consulta',
+    queryPlaceholder: 'Por favor ingresa el texto de la solicitud.',
+    run: 'EJECUTAR',
+  },
+  result: 'Texto de salida',
+  datasetConfig: {
+    settingTitle: 'Configuraciones de Recuperaci贸n',
+    knowledgeTip: 'Haz clic en el bot贸n 鈥�+鈥� para agregar conocimiento',
+    retrieveOneWay: {
+      title: 'Recuperaci贸n N-a-1',
+      description: 'Basado en la intenci贸n del usuario y las descripciones de Conocimiento, el Agente selecciona aut贸nomamente el mejor Conocimiento para consultar. Ideal para aplicaciones con Conocimiento limitado y distintivo.',
+    },
+    retrieveMultiWay: {
+      title: 'Recuperaci贸n Multi-camino',
+      description: 'Basado en la intenci贸n del usuario, consulta a trav茅s de todo el Conocimiento, recupera texto relevante de m煤ltiples fuentes y selecciona los mejores resultados que coinciden con la consulta del usuario despu茅s de reordenar. Se requiere configuraci贸n de la API del modelo de Reordenar.',
+    },
+    rerankModelRequired: 'Se requiere modelo de Reordenar',
+    params: 'Par谩metros',
+    top_k: 'Top K',
+    top_kTip: 'Usado para filtrar fragmentos que son m谩s similares a las preguntas del usuario. El sistema tambi茅n ajustar谩 din谩micamente el valor de Top K, de acuerdo con los max_tokens del modelo seleccionado.',
+    score_threshold: 'Umbral de Puntuaci贸n',
+    score_thresholdTip: 'Usado para establecer el umbral de similitud para la filtraci贸n de fragmentos.',
+    retrieveChangeTip: 'Modificar el modo de 铆ndice y el modo de recuperaci贸n puede afectar las aplicaciones asociadas con este Conocimiento.',
+  },
+  debugAsSingleModel: 'Depurar como Modelo 脷nico',
+  debugAsMultipleModel: 'Depurar como M煤ltiples Modelos',
+  duplicateModel: 'Duplicar',
+  publishAs: 'Publicar como',
+  assistantType: {
+    name: 'Tipo de Asistente',
+    chatAssistant: {
+      name: 'Asistente B谩sico',
+      description: 'Construye un asistente basado en chat usando un Modelo de Lenguaje Grande',
+    },
+    agentAssistant: {
+      name: 'Asistente Agente',
+      description: 'Construye un Agente inteligente que puede elegir herramientas aut贸nomamente para completar tareas',
+    },
+  },
+  agent: {
+    agentMode: 'Modo Agente',
+    agentModeDes: 'Establecer el tipo de modo de inferencia para el agente',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: 'Llamada de Funci贸n',
+    },
+    setting: {
+      name: 'Configuraciones del Agente',
+      description: 'Las configuraciones del Asistente Agente permiten establecer el modo del agente y funciones avanzadas como indicaciones integradas, disponibles solo en el tipo Agente.',
+      maximumIterations: {
+        name: 'Iteraciones M谩ximas',
+        description: 'Limitar el n煤mero de iteraciones que un asistente agente puede ejecutar',
+      },
+    },
+    buildInPrompt: 'Indicaci贸n Integrada',
+    firstPrompt: 'Primera Indicaci贸n',
+    nextIteration: 'Pr贸xima Iteraci贸n',
+    promptPlaceholder: 'Escribe tu indicaci贸n aqu铆',
+    tools: {
+      name: 'Herramientas',
+      description: 'El uso de herramientas puede extender las capacidades del LLM, como buscar en internet o realizar c谩lculos cient铆ficos',
+      enabled: 'Habilitado',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/es-ES/app-log.ts b/i18n/es-ES/app-log.ts
new file mode 100644
index 0000000..2977198
--- /dev/null
+++ b/i18n/es-ES/app-log.ts
@@ -0,0 +1,98 @@
+const translation = {
+  title: 'Registros',
+  description: 'Los registros registran el estado de ejecuci贸n de la aplicaci贸n, incluyendo las entradas de usuario y las respuestas de la IA.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: 'Hora actualizada',
+      time: 'Hora creada',
+      endUser: 'Usuario Final o Cuenta',
+      input: 'Entrada',
+      output: 'Salida',
+      summary: 'T铆tulo',
+      messageCount: 'Cantidad de Mensajes',
+      userRate: 'Tasa de Usuario',
+      adminRate: 'Tasa de Op.',
+      startTime: 'HORA DE INICIO',
+      status: 'ESTADO',
+      runtime: 'TIEMPO DE EJECUCI脫N',
+      tokens: 'TOKENS',
+      user: 'USUARIO FINAL O CUENTA',
+      version: 'VERSI脫N',
+    },
+    pagination: {
+      previous: 'Anterior',
+      next: 'Siguiente',
+    },
+    empty: {
+      noChat: 'A煤n no hay conversaci贸n',
+      noOutput: 'Sin salida',
+      element: {
+        title: '驴Hay alguien ah铆?',
+        content: 'Observa y anota las interacciones entre los usuarios finales y las aplicaciones de IA aqu铆 para mejorar continuamente la precisi贸n de la IA. Puedes probar <shareLink>compartiendo</shareLink> o <testLink>probando</testLink> la aplicaci贸n web t煤 mismo, y luego regresar a esta p谩gina.',
+      },
+    },
+  },
+  detail: {
+    time: 'Tiempo',
+    conversationId: 'ID de Conversaci贸n',
+    promptTemplate: 'Plantilla de Indicaci贸n',
+    promptTemplateBeforeChat: 'Plantilla de Indicaci贸n Antes de la Conversaci贸n 路 Como Mensaje del Sistema',
+    annotationTip: 'Mejoras Marcadas por {{user}}',
+    timeConsuming: '',
+    second: 's',
+    tokenCost: 'Tokens gastados',
+    loading: 'cargando',
+    operation: {
+      like: 'me gusta',
+      dislike: 'no me gusta',
+      addAnnotation: 'Agregar Mejora',
+      editAnnotation: 'Editar Mejora',
+      annotationPlaceholder: 'Ingresa la respuesta esperada que deseas que la IA responda, lo cual se puede utilizar para el ajuste del modelo y la mejora continua de la calidad de generaci贸n de texto en el futuro.',
+    },
+    variables: 'Variables',
+    uploadImages: 'Im谩genes Cargadas',
+    modelParams: 'Par谩metros del modelo',
+  },
+  filter: {
+    period: {
+      today: 'Hoy',
+      last7days: '脷ltimos 7 D铆as',
+      last4weeks: '脷ltimas 4 semanas',
+      last3months: '脷ltimos 3 meses',
+      last12months: '脷ltimos 12 meses',
+      monthToDate: 'Mes hasta la fecha',
+      quarterToDate: 'Trimestre hasta la fecha',
+      yearToDate: 'A帽o hasta la fecha',
+      allTime: 'Todo el tiempo',
+    },
+    annotation: {
+      all: 'Todos',
+      annotated: 'Mejoras Anotadas ({{count}} elementos)',
+      not_annotated: 'No Anotadas',
+    },
+    sortBy: 'Ordenar por:',
+    descending: 'descendente',
+    ascending: 'ascendente',
+  },
+  workflowTitle: 'Registros de Flujo de Trabajo',
+  workflowSubtitle: 'El registro registr贸 la operaci贸n de Automate.',
+  runDetail: {
+    title: 'Registro de Conversaci贸n',
+    workflowTitle: 'Detalle del Registro',
+    fileListLabel: 'Detalles del archivo',
+    fileListDetail: 'Detalle',
+  },
+  promptLog: 'Registro de Indicaci贸n',
+  agentLog: 'Registro de Agente',
+  viewLog: 'Ver Registro',
+  agentLogDetail: {
+    agentMode: 'Modo de Agente',
+    toolUsed: 'Herramienta Utilizada',
+    iterations: 'Iteraciones',
+    iteration: 'Iteraci贸n',
+    finalProcessing: 'Procesamiento Final',
+  },
+}
+
+export default translation
diff --git a/i18n/es-ES/app-overview.ts b/i18n/es-ES/app-overview.ts
new file mode 100644
index 0000000..97f32b1
--- /dev/null
+++ b/i18n/es-ES/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: 'Para comenzar,',
+    enterKeyTip: 'ingresa tu clave de API de OpenAI a continuaci贸n',
+    getKeyTip: 'Obt茅n tu clave de API desde el panel de control de OpenAI',
+    placeholder: 'Tu clave de API de OpenAI (ej. sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: 'Est谩s utilizando la cuota de prueba de {{providerName}}.',
+        description: 'La cuota de prueba se proporciona para su uso de prueba. Antes de que se agoten las llamadas de la cuota de prueba, configure su propio proveedor de modelos o compre cuota adicional.',
+      },
+      exhausted: {
+        title: 'Tu cuota de prueba se ha agotado, por favor configura tu APIKey.',
+        description: 'Tu cuota de prueba se ha agotado. Por favor, configure su propio proveedor de modelos o compre cuota adicional.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: 'Para comenzar,',
+        row2: 'configura primero tu proveedor de modelos.',
+      },
+    },
+    callTimes: 'Veces llamadas',
+    usedToken: 'Token utilizados',
+    setAPIBtn: 'Ir a configurar proveedor de modelos',
+    tryCloud: 'O prueba la versi贸n en la nube de Dify con una cotizaci贸n gratuita',
+  },
+  overview: {
+    title: 'Resumen',
+    appInfo: {
+      explanation: 'Aplicaci贸n web de IA lista para usar',
+      accessibleAddress: 'URL p煤blica',
+      preview: 'Vista previa',
+      regenerate: 'Regenerar',
+      regenerateNotice: '驴Deseas regenerar la URL p煤blica?',
+      preUseReminder: 'Por favor, habilita la aplicaci贸n web antes de continuar.',
+      settings: {
+        entry: 'Configuraci贸n',
+        title: 'Configuraci贸n de la aplicaci贸n web',
+        webName: 'Nombre de la aplicaci贸n web',
+        webDesc: 'Descripci贸n de la aplicaci贸n web',
+        webDescTip: 'Este texto se mostrar谩 en el lado del cliente, proporcionando una gu铆a b谩sica sobre c贸mo usar la aplicaci贸n',
+        webDescPlaceholder: 'Ingresa la descripci贸n de la aplicaci贸n web',
+        language: 'Idioma',
+        workflow: {
+          title: 'Pasos del flujo de trabajo',
+          show: 'Mostrar',
+          hide: 'Ocultar',
+          subTitle: 'Detalles del flujo de trabajo',
+          showDesc: 'Mostrar u ocultar detalles del flujo de trabajo en WebApp',
+        },
+        chatColorTheme: 'Tema de color del chat',
+        chatColorThemeDesc: 'Establece el tema de color del chatbot',
+        chatColorThemeInverted: 'Invertido',
+        invalidHexMessage: 'Valor hexadecimal no v谩lido',
+        invalidPrivacyPolicy: 'Enlace de pol铆tica de privacidad no v谩lido. Por favor, utiliza un enlace v谩lido que comience con http o https',
+        more: {
+          entry: 'Mostrar m谩s configuraciones',
+          copyright: 'Derechos de autor',
+          copyRightPlaceholder: 'Ingresa el nombre del autor o la organizaci贸n',
+          privacyPolicy: 'Pol铆tica de privacidad',
+          privacyPolicyPlaceholder: 'Ingresa el enlace de la pol铆tica de privacidad',
+          privacyPolicyTip: 'Ayuda a los visitantes a comprender los datos que recopila la aplicaci贸n, consulta la <privacyPolicyLink>Pol铆tica de privacidad</privacyPolicyLink> de Dify.',
+          customDisclaimer: 'Descargo de responsabilidad personalizado',
+          customDisclaimerPlaceholder: 'Ingresa el texto de descargo de responsabilidad personalizado',
+          customDisclaimerTip: 'El texto de descargo de responsabilidad personalizado se mostrar谩 en el lado del cliente, proporcionando informaci贸n adicional sobre la aplicaci贸n',
+          copyrightTip: 'Mostrar informaci贸n de derechos de autor en la aplicaci贸n web',
+          copyrightTooltip: 'Actualice al plan Profesional o superior',
+        },
+        sso: {
+          description: 'Todos los usuarios deben iniciar sesi贸n con SSO antes de usar WebApp',
+          tooltip: 'P贸ngase en contacto con el administrador para habilitar el inicio de sesi贸n 煤nico de WebApp',
+          label: 'Autenticaci贸n SSO',
+          title: 'WebApp SSO',
+        },
+        modalTip: 'Configuraci贸n de la aplicaci贸n web del lado del cliente.',
+      },
+      embedded: {
+        entry: 'Incrustado',
+        title: 'Incrustar en el sitio web',
+        explanation: 'Elige la forma de incrustar la aplicaci贸n de chat en tu sitio web',
+        iframe: 'Para agregar la aplicaci贸n de chat en cualquier lugar de tu sitio web, agrega este iframe a tu c贸digo HTML.',
+        scripts: 'Para agregar una aplicaci贸n de chat en la esquina inferior derecha de tu sitio web, agrega este c贸digo a tu HTML.',
+        chromePlugin: 'Instalar la extensi贸n de Chrome de Dify Chatbot',
+        copied: 'Copiado',
+        copy: 'Copiar',
+      },
+      qrcode: {
+        title: 'C贸digo QR para compartir',
+        scan: 'Escanear para compartir la aplicaci贸n',
+        download: 'Descargar c贸digo QR',
+      },
+      customize: {
+        way: 'forma',
+        entry: 'Personalizar',
+        title: 'Personalizar la aplicaci贸n web de IA',
+        explanation: 'Puedes personalizar el frontend de la aplicaci贸n web para adaptarlo a tus necesidades y estilo.',
+        way1: {
+          name: 'Bifurca el c贸digo del cliente, modif铆calo y despli茅galo en Vercel (recomendado)',
+          step1: 'Bifurca el c贸digo del cliente y modif铆calo',
+          step1Tip: 'Haz clic aqu铆 para bifurcar el c贸digo fuente en tu cuenta de GitHub y modificar el c贸digo',
+          step1Operation: 'Dify-WebClient',
+          step2: 'Despli茅galo en Vercel',
+          step2Tip: 'Haz clic aqu铆 para importar el repositorio en Vercel y desplegarlo',
+          step2Operation: 'Importar repositorio',
+          step3: 'Configura las variables de entorno',
+          step3Tip: 'Agrega las siguientes variables de entorno en Vercel',
+        },
+        way2: {
+          name: 'Escribe c贸digo del lado del cliente para llamar a la API y despli茅galo en un servidor',
+          operation: 'Documentaci贸n',
+        },
+      },
+      launch: 'Lanzar',
+    },
+    apiInfo: {
+      title: 'API del servicio backend',
+      explanation: 'F谩cilmente integrable en tu aplicaci贸n',
+      accessibleAddress: 'Punto de conexi贸n de la API del servicio',
+      doc: 'Referencia de la API',
+    },
+    status: {
+      running: 'En servicio',
+      disable: 'Deshabilitar',
+    },
+  },
+  analysis: {
+    title: 'An谩lisis',
+    ms: 'ms',
+    tokenPS: 'Token/s',
+    totalMessages: {
+      title: 'Mensajes totales',
+      explanation: 'Recuento diario de interacciones con IA.',
+    },
+    totalConversations: {
+      title: 'Conversaciones totales',
+      explanation: 'Recuento diario de conversaciones con IA; ingenier铆a/depuraci贸n de prompts excluida.',
+    },
+    activeUsers: {
+      title: 'Usuarios activos',
+      explanation: 'Usuarios 煤nicos que interact煤an en preguntas y respuestas con IA; excluye la ingenier铆a/depuraci贸n de prompts.',
+    },
+    tokenUsage: {
+      title: 'Uso de tokens',
+      explanation: 'Refleja el uso diario de tokens del modelo de lenguaje para la aplicaci贸n, 煤til para el control de costos.',
+      consumed: 'Consumidos',
+    },
+    avgSessionInteractions: {
+      title: 'Interacciones promedio por sesi贸n',
+      explanation: 'Recuento continuo de comunicaci贸n usuario-IA; para aplicaciones basadas en conversaciones.',
+    },
+    avgUserInteractions: {
+      title: 'Interacciones promedio por usuario',
+      explanation: 'Refleja la frecuencia de uso diario de los usuarios. Esta m茅trica refleja la fidelidad del usuario.',
+    },
+    userSatisfactionRate: {
+      title: 'Tasa de satisfacci贸n del usuario',
+      explanation: 'El n煤mero de likes por cada 1,000 mensajes. Esto indica la proporci贸n de respuestas con las que los usuarios est谩n muy satisfechos.',
+    },
+    avgResponseTime: {
+      title: 'Tiempo promedio de respuesta',
+      explanation: 'Tiempo (ms) que tarda la IA en procesar/responder; para aplicaciones basadas en texto.',
+    },
+    tps: {
+      title: 'Velocidad de salida de tokens',
+      explanation: 'Mide el rendimiento del LLM. Cuenta la velocidad de salida de tokens del LLM desde el inicio de la solicitud hasta la finalizaci贸n de la salida.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/es-ES/app.ts b/i18n/es-ES/app.ts
new file mode 100644
index 0000000..3d2a39d
--- /dev/null
+++ b/i18n/es-ES/app.ts
@@ -0,0 +1,213 @@
+const translation = {
+  createApp: 'CREAR APP',
+  types: {
+    all: 'Todos',
+    chatbot: 'Chatbot',
+    agent: 'Agente',
+    workflow: 'Flujo de trabajo',
+    completion: 'Finalizaci贸n',
+    basic: 'B谩sico',
+    advanced: 'Flujo de chat',
+  },
+  duplicate: 'Duplicar',
+  duplicateTitle: 'Duplicar App',
+  export: 'Exportar DSL',
+  exportFailed: 'Error al exportar DSL.',
+  importDSL: 'Importar archivo DSL',
+  createFromConfigFile: 'Crear desde archivo DSL',
+  deleteAppConfirmTitle: '驴Eliminar esta app?',
+  deleteAppConfirmContent:
+    'Eliminar la app es irreversible. Los usuarios ya no podr谩n acceder a tu app y todas las configuraciones y registros de prompts se eliminar谩n permanentemente.',
+  appDeleted: 'App eliminada',
+  appDeleteFailed: 'Error al eliminar app',
+  join: '脷nete a la comunidad',
+  communityIntro:
+    'Discute con miembros del equipo, colaboradores y desarrolladores en diferentes canales.',
+  roadmap: 'Ver nuestro plan de desarrollo',
+  newApp: {
+    startFromBlank: 'Crear desde cero',
+    startFromTemplate: 'Crear desde plantilla',
+    captionAppType: '驴Qu茅 tipo de app quieres crear?',
+    chatbotDescription: 'Crea una aplicaci贸n basada en chat. Esta app utiliza un formato de pregunta y respuesta, permitiendo m煤ltiples rondas de conversaci贸n continua.',
+    completionDescription: 'Crea una aplicaci贸n que genera texto de alta calidad basado en prompts, como la generaci贸n de art铆culos, res煤menes, traducciones y m谩s.',
+    completionWarning: 'Este tipo de app ya no ser谩 compatible.',
+    agentDescription: 'Crea un Agente inteligente que puede elegir herramientas de forma aut贸noma para completar tareas',
+    workflowDescription: 'Crea una aplicaci贸n que genera texto de alta calidad basado en flujos de trabajo con un alto grado de personalizaci贸n. Es adecuado para usuarios experimentados.',
+    workflowWarning: 'Actualmente en beta',
+    chatbotType: 'M茅todo de orquestaci贸n del Chatbot',
+    basic: 'B谩sico',
+    basicTip: 'Para principiantes, se puede cambiar a Chatflow m谩s adelante',
+    basicFor: 'PARA PRINCIPIANTES',
+    basicDescription: 'La Orquestaci贸n B谩sica permite la orquestaci贸n de una app de Chatbot utilizando configuraciones simples, sin la capacidad de modificar los prompts incorporados. Es adecuado para principiantes.',
+    advanced: 'Chatflow',
+    advancedFor: 'Para usuarios avanzados',
+    advancedDescription: 'La Orquestaci贸n de Flujo de Trabajo orquesta Chatbots en forma de flujos de trabajo, ofreciendo un alto grado de personalizaci贸n, incluida la capacidad de editar los prompts incorporados. Es adecuado para usuarios experimentados.',
+    captionName: 'Icono y nombre de la app',
+    appNamePlaceholder: 'Asigna un nombre a tu app',
+    captionDescription: 'Descripci贸n',
+    appDescriptionPlaceholder: 'Ingresa la descripci贸n de la app',
+    useTemplate: 'Usar esta plantilla',
+    previewDemo: 'Vista previa de demostraci贸n',
+    chatApp: 'Asistente',
+    chatAppIntro:
+      'Quiero construir una aplicaci贸n basada en chat. Esta app utiliza un formato de pregunta y respuesta, permitiendo m煤ltiples rondas de conversaci贸n continua.',
+    agentAssistant: 'Nuevo Asistente de Agente',
+    completeApp: 'Generador de Texto',
+    completeAppIntro:
+      'Quiero crear una aplicaci贸n que genera texto de alta calidad basado en prompts, como la generaci贸n de art铆culos, res煤menes, traducciones y m谩s.',
+    showTemplates: 'Quiero elegir una plantilla',
+    hideTemplates: 'Volver a la selecci贸n de modo',
+    Create: 'Crear',
+    Cancel: 'Cancelar',
+    nameNotEmpty: 'El nombre no puede estar vac铆o',
+    appTemplateNotSelected: 'Por favor, selecciona una plantilla',
+    appTypeRequired: 'Por favor, selecciona un tipo de app',
+    appCreated: 'App creada',
+    appCreateFailed: 'Error al crear app',
+    Confirm: 'Confirmar',
+    caution: 'Cautela',
+    appCreateDSLErrorTitle: 'Incompatibilidad de versiones',
+    appCreateDSLErrorPart2: '驴Quieres continuar?',
+    appCreateDSLErrorPart4: 'Versi贸n de DSL compatible con el sistema:',
+    appCreateDSLErrorPart1: 'Se ha detectado una diferencia significativa en las versiones de DSL. Forzar la importaci贸n puede hacer que la aplicaci贸n no funcione correctamente.',
+    appCreateDSLWarning: 'Precauci贸n: La diferencia de versi贸n de DSL puede afectar a determinadas funciones',
+    appCreateDSLErrorPart3: 'Versi贸n actual de DSL de la aplicaci贸n:',
+    forBeginners: 'PARA PRINCIPIANTES',
+    learnMore: 'Aprende m谩s',
+    noTemplateFoundTip: 'Intente buscar usando diferentes palabras clave.',
+    chatbotShortDescription: 'Chatbot basado en LLM con una configuraci贸n sencilla',
+    chooseAppType: 'Elija el tipo de aplicaci贸n',
+    noAppsFound: 'No se han encontrado aplicaciones',
+    workflowUserDescription: 'Orquestaci贸n del flujo de trabajo para tareas de una sola ronda, como la automatizaci贸n y el procesamiento por lotes.',
+    advancedShortDescription: 'Flujo de trabajo para di谩logos complejos de varios turnos con memoria',
+    forAdvanced: 'PARA USUARIOS AVANZADOS',
+    completionShortDescription: 'Asistente de IA para tareas de generaci贸n de texto',
+    optional: 'Opcional',
+    noIdeaTip: '驴No tienes ideas? Echa un vistazo a nuestras plantillas',
+    agentUserDescription: 'Un agente inteligente capaz de realizar un razonamiento iterativo y un uso aut贸nomo de las herramientas para alcanzar los objetivos de las tareas.',
+    workflowShortDescription: 'Orquestaci贸n para tareas de automatizaci贸n de un solo turno',
+    advancedUserDescription: 'Orquestaci贸n de flujos de trabajo para tareas de di谩logo complejas de varias rondas con capacidades de memoria.',
+    agentShortDescription: 'Agente inteligente con razonamiento y uso aut贸nomo de herramientas',
+    foundResults: '{{conteo}} Resultados',
+    noTemplateFound: 'No se han encontrado plantillas',
+    foundResult: '{{conteo}} Resultado',
+    chatbotUserDescription: 'Cree r谩pidamente un chatbot basado en LLM con una configuraci贸n sencilla. Puedes cambiar a Chatflow m谩s tarde.',
+    completionUserDescription: 'Cree r谩pidamente un asistente de IA para tareas de generaci贸n de texto con una configuraci贸n sencilla.',
+  },
+  editApp: 'Editar informaci贸n',
+  editAppTitle: 'Editar informaci贸n de la app',
+  editDone: 'Informaci贸n de la app actualizada',
+  editFailed: 'Error al actualizar informaci贸n de la app',
+  iconPicker: {
+    ok: 'OK',
+    cancel: 'Cancelar',
+    emoji: 'Emoji',
+    image: 'Imagen',
+  },
+  switch: 'Cambiar a Orquestaci贸n de Flujo de Trabajo',
+  switchTipStart: 'Se crear谩 una nueva copia de la app para ti y la nueva copia cambiar谩 a Orquestaci贸n de Flujo de Trabajo. La nueva copia no permitir谩',
+  switchTip: 'volver',
+  switchTipEnd: ' a la Orquestaci贸n B谩sica.',
+  switchLabel: 'La copia de la app a crear',
+  removeOriginal: 'Eliminar la app original',
+  switchStart: 'Iniciar cambio',
+  typeSelector: {
+    all: 'Todos los tipos',
+    chatbot: 'Chatbot',
+    agent: 'Agente',
+    workflow: 'Flujo de trabajo',
+    completion: 'Finalizaci贸n',
+    advanced: 'Flujo de chat',
+  },
+  tracing: {
+    title: 'Rastreo del rendimiento de la app',
+    description: 'Configuraci贸n de un proveedor de LLMOps de terceros y rastreo del rendimiento de la app.',
+    config: 'Configurar',
+    collapse: 'Contraer',
+    expand: 'Expandir',
+    tracing: 'Rastreo',
+    disabled: 'Deshabilitado',
+    disabledTip: 'Por favor, configura el proveedor primero',
+    enabled: 'En servicio',
+    tracingDescription: 'Captura el contexto completo de la ejecuci贸n de la app, incluyendo llamadas LLM, contexto, prompts, solicitudes HTTP y m谩s, en una plataforma de rastreo de terceros.',
+    configProviderTitle: {
+      configured: 'Configurado',
+      notConfigured: 'Configurar proveedor para habilitar el rastreo',
+      moreProvider: 'M谩s proveedores',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: 'Una plataforma de desarrollo todo en uno para cada paso del ciclo de vida de la aplicaci贸n impulsada por LLM.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: 'Rastrea, eval煤a, gestiona prompts y m茅tricas para depurar y mejorar tu aplicaci贸n LLM.',
+    },
+    inUse: 'En uso',
+    configProvider: {
+      title: 'Configurar ',
+      placeholder: 'Ingresa tu {{key}}',
+      project: 'Proyecto',
+      publicKey: 'Clave p煤blica',
+      secretKey: 'Clave secreta',
+      viewDocsLink: 'Ver documentaci贸n de {{key}}',
+      removeConfirmTitle: '驴Eliminar la configuraci贸n de {{key}}?',
+      removeConfirmContent: 'La configuraci贸n actual est谩 en uso, eliminarla desactivar谩 la funci贸n de rastreo.',
+    },
+    view: 'Vista',
+    opik: {
+      description: 'Opik es una plataforma de c贸digo abierto para evaluar, probar y monitorear aplicaciones LLM.',
+      title: 'Opik',
+    },
+    weave: {
+      description: 'Weave es una plataforma de c贸digo abierto para evaluar, probar y monitorear aplicaciones de LLM.',
+      title: 'Tejer',
+    },
+  },
+  answerIcon: {
+    title: 'Usar el icono de la aplicaci贸n web para reemplazar 馃',
+    descriptionInExplore: 'Si se debe usar el icono de la aplicaci贸n web para reemplazarlo 馃 en Explore',
+    description: 'Si se va a usar el icono de la aplicaci贸n web para reemplazarlo 馃 en la aplicaci贸n compartida',
+  },
+  importFromDSLUrl: 'URL de origen',
+  importFromDSLUrlPlaceholder: 'Pegar enlace DSL aqu铆',
+  importFromDSL: 'Importar desde DSL',
+  importFromDSLFile: 'Desde el archivo DSL',
+  mermaid: {
+    handDrawn: 'Dibujado a mano',
+    classic: 'Cl谩sico',
+  },
+  openInExplore: 'Abrir en Explorar',
+  newAppFromTemplate: {
+    sidebar: {
+      Programming: 'Programaci贸n',
+      Agent: 'Agente',
+      Writing: 'Escritura',
+      Assistant: 'Asistente',
+      Recommended: 'Recomendado',
+      HR: 'HR',
+      Workflow: 'Flujo de trabajo',
+    },
+    byCategories: 'POR CATEGOR脥AS',
+    searchAllTemplate: 'Buscar todas las plantillas...',
+  },
+  showMyCreatedAppsOnly: 'Mostrar solo mis aplicaciones creadas',
+  appSelector: {
+    label: 'APLICACI脫N',
+    placeholder: 'Selecciona una aplicaci贸n...',
+    noParams: 'No se necesitan par谩metros',
+    params: 'PAR脕METROS DE LA APLICACI脫N',
+  },
+  structOutput: {
+    notConfiguredTip: 'La salida estructurada a煤n no ha sido configurada.',
+    required: 'Requerido',
+    configure: 'Configurar',
+    LLMResponse: 'Respuesta del LLM',
+    moreFillTip: 'Mostrando un m谩ximo de 10 niveles de anidaci贸n',
+    modelNotSupportedTip: 'El modelo actual no admite esta funci贸n y se degrada autom谩ticamente a inyecci贸n de comandos.',
+    structuredTip: 'Las Salidas Estructuradas son una funci贸n que garantiza que el modelo siempre generar谩 respuestas que se ajusten a su esquema JSON proporcionado.',
+    modelNotSupported: 'Modelo no soportado',
+  },
+}
+
+export default translation
diff --git a/i18n/es-ES/billing.ts b/i18n/es-ES/billing.ts
new file mode 100644
index 0000000..3f83daf
--- /dev/null
+++ b/i18n/es-ES/billing.ts
@@ -0,0 +1,200 @@
+const translation = {
+  currentPlan: 'Plan Actual',
+  upgradeBtn: {
+    plain: 'Actualizar Plan',
+    encourage: 'Actualizar Ahora',
+    encourageShort: 'Actualizar',
+  },
+  viewBilling: 'Administrar facturaci贸n y suscripciones',
+  buyPermissionDeniedTip: 'Por favor, contacta al administrador de tu empresa para suscribirte',
+  plansCommon: {
+    title: 'Elige un plan que sea adecuado para ti',
+    yearlyTip: '隆Obt茅n 2 meses gratis al suscribirte anualmente!',
+    mostPopular: 'M谩s Popular',
+    planRange: {
+      monthly: 'Mensual',
+      yearly: 'Anual',
+    },
+    month: 'mes',
+    year: 'a帽o',
+    save: 'Ahorra ',
+    free: 'Gratis',
+    currentPlan: 'Plan Actual',
+    contractSales: 'Contactar ventas',
+    contractOwner: 'Contactar al administrador del equipo',
+    startForFree: 'Empezar gratis',
+    getStartedWith: 'Empezar con ',
+    contactSales: 'Contactar Ventas',
+    talkToSales: 'Hablar con Ventas',
+    modelProviders: 'Proveedores de Modelos',
+    teamMembers: 'Miembros del Equipo',
+    annotationQuota: 'Cuota de Anotaci贸n',
+    buildApps: 'Crear Aplicaciones',
+    vectorSpace: 'Espacio Vectorial',
+    vectorSpaceBillingTooltip: 'Cada 1MB puede almacenar aproximadamente 1.2 millones de caracteres de datos vectorizados (estimado utilizando OpenAI Embeddings, var铆a seg煤n los modelos).',
+    vectorSpaceTooltip: 'El Espacio Vectorial es el sistema de memoria a largo plazo necesario para que los LLMs comprendan tus datos.',
+    documentsUploadQuota: 'Cuota de Carga de Documentos',
+    documentProcessingPriority: 'Prioridad de Procesamiento de Documentos',
+    documentProcessingPriorityTip: 'Para una mayor prioridad de procesamiento de documentos, por favor actualiza tu plan.',
+    documentProcessingPriorityUpgrade: 'Procesa m谩s datos con mayor precisi贸n y velocidad.',
+    priority: {
+      'standard': 'Est谩ndar',
+      'priority': 'Prioridad',
+      'top-priority': 'Prioridad M谩xima',
+    },
+    logsHistory: 'Historial de Registros',
+    customTools: 'Herramientas Personalizadas',
+    unavailable: 'No disponible',
+    days: 'd铆as',
+    unlimited: 'Ilimitado',
+    support: 'Soporte',
+    supportItems: {
+      communityForums: 'Foros Comunitarios',
+      emailSupport: 'Soporte por Correo Electr贸nico',
+      priorityEmail: 'Soporte Prioritario por Correo Electr贸nico y Chat',
+      logoChange: 'Cambio de Logotipo',
+      SSOAuthentication: 'Autenticaci贸n SSO',
+      personalizedSupport: 'Soporte Personalizado',
+      dedicatedAPISupport: 'Soporte API Dedicado',
+      customIntegration: 'Integraci贸n y Soporte Personalizado',
+      ragAPIRequest: 'Solicitudes API RAG',
+      bulkUpload: 'Carga Masiva de Documentos',
+      agentMode: 'Modo Agente',
+      workflow: 'Flujo de Trabajo',
+      llmLoadingBalancing: 'Balanceo de Carga LLM',
+      llmLoadingBalancingTooltip: 'Agrega m煤ltiples claves API a los modelos, evitando efectivamente los l铆mites de velocidad de API.',
+    },
+    comingSoon: 'Pr贸ximamente',
+    member: 'Miembro',
+    memberAfter: 'Miembro',
+    messageRequest: {
+      title: 'Cr茅ditos de Mensajes',
+      tooltip: 'Cuotas de invocaci贸n de mensajes para varios planes utilizando modelos de OpenAI (excepto gpt4). Los mensajes que excedan el l铆mite utilizar谩n tu clave API de OpenAI.',
+      titlePerMonth: '{{count,number}} mensajes/mes',
+    },
+    annotatedResponse: {
+      title: 'L铆mites de Cuota de Anotaci贸n',
+      tooltip: 'Edici贸n manual y anotaci贸n de respuestas proporciona habilidades de respuesta a preguntas personalizadas y de alta calidad para aplicaciones (aplicable solo en aplicaciones de chat).',
+    },
+    ragAPIRequestTooltip: 'Se refiere al n煤mero de llamadas API que invocan solo las capacidades de procesamiento de base de conocimientos de Dify.',
+    receiptInfo: 'Solo el propietario del equipo y el administrador del equipo pueden suscribirse y ver la informaci贸n de facturaci贸n.',
+    priceTip: 'por espacio de trabajo/',
+    teamMember_one: '{{count, n煤mero}} Miembro del Equipo',
+    getStarted: 'Comenzar',
+    apiRateLimitUnit: '{{count, n煤mero}}/d铆a',
+    freeTrialTipSuffix: 'No se requiere tarjeta de cr茅dito',
+    unlimitedApiRate: 'Sin l铆mite de tasa de API',
+    apiRateLimit: 'L铆mite de tasa de API',
+    documentsTooltip: 'Cuota sobre el n煤mero de documentos importados desde la Fuente de Datos del Conocimiento.',
+    comparePlanAndFeatures: 'Compara planes y caracter铆sticas',
+    cloud: 'Servicio en la nube',
+    teamMember_other: '{{count,number}} Miembros del equipo',
+    annualBilling: 'Facturaci贸n Anual',
+    self: 'Autoalojado',
+    freeTrialTip: 'prueba gratuita de 200 llamadas de OpenAI.',
+    teamWorkspace: '{{count,number}} Espacio de Trabajo en Equipo',
+    documents: '{{count,number}} Documentos de Conocimiento',
+    documentsRequestQuota: '{{count,number}}/min L铆mite de tasa de solicitud de conocimiento',
+    freeTrialTipPrefix: 'Reg铆strate y obt茅n un',
+    apiRateLimitTooltip: 'El l铆mite de tasa de la API se aplica a todas las solicitudes realizadas a trav茅s de la API de Dify, incluidos la generaci贸n de texto, las conversaciones de chat, las ejecuciones de flujo de trabajo y el procesamiento de documentos.',
+    documentsRequestQuotaTooltip: 'Especifica el n煤mero total de acciones que un espacio de trabajo puede realizar por minuto dentro de la base de conocimientos, incluyendo la creaci贸n, eliminaci贸n, actualizaci贸n de conjuntos de datos, carga de documentos, modificaciones, archivo y consultas a la base de conocimientos. Esta m茅trica se utiliza para evaluar el rendimiento de las solicitudes a la base de conocimientos. Por ejemplo, si un usuario de Sandbox realiza 10 pruebas consecutivas en un minuto, su espacio de trabajo ser谩 temporalmente restringido de realizar las siguientes acciones durante el siguiente minuto: creaci贸n de conjuntos de datos, eliminaci贸n, actualizaciones y carga o modificaciones de documentos.',
+  },
+  plans: {
+    sandbox: {
+      name: 'Sandbox',
+      description: 'Prueba gratuita de 200 veces GPT',
+      includesTitle: 'Incluye:',
+      for: 'Prueba gratuita de capacidades b谩sicas',
+    },
+    professional: {
+      name: 'Profesional',
+      description: 'Para individuos y peque帽os equipos que desean desbloquear m谩s poder de manera asequible.',
+      includesTitle: 'Todo en el plan gratuito, m谩s:',
+      for: 'Para desarrolladores independientes/equipos peque帽os',
+    },
+    team: {
+      name: 'Equipo',
+      description: 'Colabora sin l铆mites y disfruta de un rendimiento de primera categor铆a.',
+      includesTitle: 'Todo en el plan Profesional, m谩s:',
+      for: 'Para equipos de tama帽o mediano',
+    },
+    enterprise: {
+      name: 'Empresa',
+      description: 'Obt茅n capacidades completas y soporte para sistemas cr铆ticos a gran escala.',
+      includesTitle: 'Todo en el plan Equipo, m谩s:',
+      features: {
+        0: 'Soluciones de implementaci贸n escalables de nivel empresarial',
+        7: 'Actualizaciones y Mantenimiento por Dify Oficialmente',
+        8: 'Soporte T茅cnico Profesional',
+        3: 'M煤ltiples Espacios de Trabajo y Gesti贸n Empresarial',
+        1: 'Autorizaci贸n de Licencia Comercial',
+        2: 'Caracter铆sticas Exclusivas de la Empresa',
+        5: 'SLA negociados por Dify Partners',
+        4: 'SSO',
+        6: 'Seguridad y Controles Avanzados',
+      },
+      btnText: 'Contactar ventas',
+      for: 'Para equipos de gran tama帽o',
+      price: 'Personalizado',
+      priceTip: 'Facturaci贸n Anual Solo',
+    },
+    community: {
+      features: {
+        0: 'Todas las caracter铆sticas principales se lanzaron bajo el repositorio p煤blico',
+        2: 'Cumple con la Licencia de C贸digo Abierto de Dify',
+        1: 'Espacio de trabajo 煤nico',
+      },
+      includesTitle: 'Caracter铆sticas gratuitas:',
+      for: 'Para usuarios individuales, peque帽os equipos o proyectos no comerciales',
+      price: 'Gratis',
+      btnText: 'Comienza con la Comunidad',
+      name: 'Comunidad',
+      description: 'Para usuarios individuales, peque帽os equipos o proyectos no comerciales',
+    },
+    premium: {
+      features: {
+        0: 'Confiabilidad autogestionada por varios proveedores de nube',
+        1: 'Espacio de trabajo 煤nico',
+        3: 'Soporte prioritario por correo electr贸nico y chat',
+        2: 'Personalizaci贸n de logotipos y marcas de WebApp',
+      },
+      description: 'Para organizaciones y equipos de tama帽o mediano',
+      comingSoon: 'Soporte de Microsoft Azure y Google Cloud disponible pr贸ximamente',
+      btnText: 'Obt茅n Premium en',
+      priceTip: 'Basado en el Mercado de la Nube',
+      price: 'Escalable',
+      includesTitle: 'Todo de Community, adem谩s:',
+      name: 'Premium',
+      for: 'Para organizaciones y equipos de tama帽o mediano',
+    },
+  },
+  vectorSpace: {
+    fullTip: 'El Espacio Vectorial est谩 lleno.',
+    fullSolution: 'Actualiza tu plan para obtener m谩s espacio.',
+  },
+  apps: {
+    fullTipLine1: 'Actualiza tu plan para',
+    fullTipLine2: 'crear m谩s aplicaciones.',
+    fullTip1des: 'Has alcanzado el l铆mite de aplicaciones de construcci贸n en este plan',
+    fullTip2des: 'Se recomienda limpiar las aplicaciones inactivas para liberar espacio de uso, o contactarnos.',
+    fullTip1: 'Actualiza para crear m谩s aplicaciones',
+    fullTip2: 'L铆mite de plan alcanzado',
+    contactUs: 'Cont谩ctanos',
+  },
+  annotatedResponse: {
+    fullTipLine1: 'Actualiza tu plan para',
+    fullTipLine2: 'anotar m谩s conversaciones.',
+    quotaTitle: 'Cuota de Respuesta Anotada',
+  },
+  usagePage: {
+    buildApps: 'Construir aplicaciones',
+    documentsUploadQuota: 'Cuota de carga de documentos',
+    vectorSpace: 'Almacenamiento de Datos de Conocimiento',
+    teamMembers: 'Miembros del equipo',
+    annotationQuota: 'Cuota de anotaci贸n',
+    vectorSpaceTooltip: 'Los documentos con el modo de indexaci贸n de alta calidad consumir谩n recursos de Almacenamiento de Datos de Conocimiento. Cuando el Almacenamiento de Datos de Conocimiento alcanza el l铆mite, no se subir谩n nuevos documentos.',
+  },
+  teamMembers: 'Miembros del equipo',
+}
+
+export default translation
diff --git a/i18n/es-ES/common.ts b/i18n/es-ES/common.ts
new file mode 100644
index 0000000..2c9e693
--- /dev/null
+++ b/i18n/es-ES/common.ts
@@ -0,0 +1,671 @@
+const translation = {
+  api: {
+    success: '脡xito',
+    actionSuccess: 'Acci贸n exitosa',
+    saved: 'Guardado',
+    create: 'Creado',
+    remove: 'Eliminado',
+  },
+  operation: {
+    create: 'Crear',
+    confirm: 'Confirmar',
+    cancel: 'Cancelar',
+    clear: 'Limpiar',
+    save: 'Guardar',
+    saveAndEnable: 'Guardar y habilitar',
+    edit: 'Editar',
+    add: 'Agregar',
+    added: 'Agregado',
+    refresh: 'Reiniciar',
+    reset: 'Restablecer',
+    search: 'Buscar',
+    change: 'Cambiar',
+    remove: 'Eliminar',
+    send: 'Enviar',
+    copy: 'Copiar',
+    lineBreak: 'Salto de l铆nea',
+    sure: 'Estoy seguro',
+    download: 'Descargar',
+    delete: 'Eliminar',
+    settings: 'Configuraciones',
+    setup: 'Configurar',
+    getForFree: 'Obtener gratis',
+    reload: 'Recargar',
+    ok: 'OK',
+    log: 'Registro',
+    learnMore: 'Aprender m谩s',
+    params: 'Par谩metros',
+    duplicate: 'Duplicar',
+    rename: 'Renombrar',
+    audioSourceUnavailable: 'AudioSource no est谩 disponible',
+    zoomOut: 'Alejar',
+    zoomIn: 'Acercar',
+    openInNewTab: 'Abrir en una nueva pesta帽a',
+    copyImage: 'Copiar imagen',
+    viewMore: 'VER M脕S',
+    regenerate: 'Regenerar',
+    close: 'Cerrar',
+    saveAndRegenerate: 'Guardar y regenerar fragmentos secundarios',
+    view: 'Vista',
+    submit: 'Enviar',
+    skip: 'Nav铆o',
+    imageCopied: 'Imagen copiada',
+    deleteApp: 'Eliminar aplicaci贸n',
+    in: 'en',
+    viewDetails: 'Ver detalles',
+    copied: 'Copiado',
+    more: 'M谩s',
+    downloadSuccess: 'Descarga completada.',
+    downloadFailed: 'La descarga ha fallado. Por favor, int茅ntalo de nuevo m谩s tarde.',
+    format: 'Formato',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} es requerido',
+    urlError: 'la URL debe comenzar con http:// o https://',
+  },
+  placeholder: {
+    input: 'Por favor ingresa',
+    select: 'Por favor selecciona',
+  },
+  voice: {
+    language: {
+      zhHans: 'Chino',
+      zhHant: 'Chino Tradicional',
+      enUS: 'Ingl茅s',
+      deDE: 'Alem谩n',
+      frFR: 'Franc茅s',
+      esES: 'Espa帽ol',
+      itIT: 'Italiano',
+      thTH: 'Tailand茅s',
+      idID: 'Indonesio',
+      jaJP: 'Japon茅s',
+      koKR: 'Coreano',
+      ptBR: 'Portugu茅s',
+      ruRU: 'Ruso',
+      ukUA: 'Ucraniano',
+      viVN: 'Vietnamita',
+      plPL: 'Polaco',
+      roRO: 'Rumano',
+      hiIN: 'Hindi',
+      trTR: 'Turco',
+      faIR: 'Persa',
+    },
+  },
+  unit: {
+    char: 'caracteres',
+  },
+  actionMsg: {
+    noModification: 'No hay modificaciones en este momento.',
+    modifiedSuccessfully: 'Modificado exitosamente',
+    modifiedUnsuccessfully: 'Modificaci贸n no exitosa',
+    copySuccessfully: 'Copiado exitosamente',
+    paySucceeded: 'Pago exitoso',
+    payCancelled: 'Pago cancelado',
+    generatedSuccessfully: 'Generado exitosamente',
+    generatedUnsuccessfully: 'Generaci贸n no exitosa',
+  },
+  model: {
+    params: {
+      temperature: 'Temperatura',
+      temperatureTip:
+        'Controla la aleatoriedad: Reducir resulta en completaciones menos aleatorias. A medida que la temperatura se acerca a cero, el modelo se vuelve determinista y repetitivo.',
+      top_p: 'Top P',
+      top_pTip:
+        'Controla la diversidad mediante el muestreo de n煤cleo: 0.5 significa que se consideran la mitad de todas las opciones ponderadas por probabilidad.',
+      presence_penalty: 'Penalizaci贸n por presencia',
+      presence_penaltyTip:
+        'Cu谩nto penalizar los nuevos tokens seg煤n si aparecen en el texto hasta ahora.\nAumenta la probabilidad del modelo de hablar sobre nuevos temas.',
+      frequency_penalty: 'Penalizaci贸n por frecuencia',
+      frequency_penaltyTip:
+        'Cu谩nto penalizar los nuevos tokens seg煤n su frecuencia existente en el texto hasta ahora.\nDisminuye la probabilidad del modelo de repetir la misma l铆nea literalmente.',
+      max_tokens: 'Tokens m谩ximos',
+      max_tokensTip:
+        'Se usa para limitar la longitud m谩xima de la respuesta, en tokens. \nValores m谩s grandes pueden limitar el espacio disponible para palabras de indicaci贸n, registros de chat y Conocimiento. \nSe recomienda configurarlo por debajo de dos tercios\ngpt-4-1106-preview, gpt-4-vision-preview tokens m谩ximos (entrada 128k salida 4k)',
+      maxTokenSettingTip: 'Tu configuraci贸n de tokens m谩ximos es alta, lo que puede limitar el espacio para indicaciones, consultas y datos. Considera configurarlo por debajo de 2/3.',
+      setToCurrentModelMaxTokenTip: 'Tokens m谩ximos actualizados al 80% del m谩ximo de tokens del modelo actual {{maxToken}}.',
+      stop_sequences: 'Secuencias de parada',
+      stop_sequencesTip: 'Hasta cuatro secuencias donde la API dejar谩 de generar m谩s tokens. El texto devuelto no contendr谩 la secuencia de parada.',
+      stop_sequencesPlaceholder: 'Ingresa la secuencia y presiona Tab',
+    },
+    tone: {
+      Creative: 'Creativo',
+      Balanced: 'Equilibrado',
+      Precise: 'Preciso',
+      Custom: 'Personalizado',
+    },
+    addMoreModel: 'Ir a configuraciones para agregar m谩s modelos',
+    capabilities: 'Capacidades multimodales',
+    settingsLink: 'Configuraci贸n del proveedor de modelos',
+  },
+  menus: {
+    status: 'beta',
+    explore: 'Explorar',
+    apps: 'Estudio',
+    plugins: 'Plugins',
+    pluginsTips: 'Integrar plugins de terceros o crear Plugins AI compatibles con ChatGPT.',
+    datasets: 'Conocimiento',
+    datasetsTips: 'PR脫XIMAMENTE: Importa tus propios datos de texto o escribe datos en tiempo real a trav茅s de Webhook para la mejora del contexto LLM.',
+    newApp: 'Nueva App',
+    newDataset: 'Crear Conocimiento',
+    tools: 'Herramientas',
+    exploreMarketplace: 'Explora el mercado',
+  },
+  userProfile: {
+    settings: 'Configuraciones',
+    emailSupport: 'Soporte de Correo Electr贸nico',
+    workspace: 'Espacio de trabajo',
+    createWorkspace: 'Crear espacio de trabajo',
+    helpCenter: 'Ayuda',
+    communityFeedback: 'Comentarios',
+    roadmap: 'Hoja de ruta',
+    community: 'Comunidad',
+    about: 'Acerca de',
+    logout: 'Cerrar sesi贸n',
+    support: 'Apoyo',
+    compliance: 'Cumplimiento',
+    github: 'GitHub',
+  },
+  settings: {
+    accountGroup: 'CUENTA',
+    workplaceGroup: 'ESPACIO DE TRABAJO',
+    account: 'Mi cuenta',
+    members: 'Miembros',
+    billing: 'Facturaci贸n',
+    integrations: 'Integraciones',
+    language: 'Idioma',
+    provider: 'Proveedor de Modelo',
+    dataSource: 'Fuente de Datos',
+    plugin: 'Plugins',
+    apiBasedExtension: 'Extensi贸n basada en API',
+    generalGroup: 'GENERAL',
+  },
+  account: {
+    avatar: 'Avatar',
+    name: 'Nombre',
+    email: 'Correo electr贸nico',
+    password: 'Contrase帽a',
+    passwordTip: 'Puedes establecer una contrase帽a permanente si no deseas usar c贸digos de inicio de sesi贸n temporales',
+    setPassword: 'Establecer una contrase帽a',
+    resetPassword: 'Restablecer contrase帽a',
+    currentPassword: 'Contrase帽a actual',
+    newPassword: 'Nueva contrase帽a',
+    confirmPassword: 'Confirmar contrase帽a',
+    notEqual: 'Las dos contrase帽as son diferentes.',
+    langGeniusAccount: 'Cuenta Dify',
+    langGeniusAccountTip: 'Tu cuenta Dify y los datos de usuario asociados.',
+    editName: 'Editar Nombre',
+    showAppLength: 'Mostrar {{length}} apps',
+    delete: 'Eliminar cuenta',
+    deleteTip: 'Eliminar tu cuenta borrar谩 permanentemente todos tus datos y no se podr谩n recuperar.',
+    deleteConfirmTip: 'Para confirmar, por favor env铆a lo siguiente desde tu correo electr贸nico registrado a ',
+    account: 'Cuenta',
+    myAccount: 'Mi Cuenta',
+    studio: 'Estudio Dify',
+    deletePrivacyLinkTip: 'Para obtener m谩s informaci贸n sobre c贸mo manejamos sus datos, consulte nuestra',
+    deletePrivacyLink: 'Pol铆tica de privacidad.',
+    deleteSuccessTip: 'Su cuenta necesita tiempo para terminar de eliminarse. Te enviaremos un correo electr贸nico cuando todo est茅 listo.',
+    deleteLabel: 'Para confirmar, escriba su correo electr贸nico a continuaci贸n',
+    deletePlaceholder: 'Por favor, introduzca su correo electr贸nico',
+    sendVerificationButton: 'Enviar c贸digo de verificaci贸n',
+    verificationLabel: 'C贸digo de verificaci贸n',
+    verificationPlaceholder: 'Pega el c贸digo de 6 d铆gitos',
+    permanentlyDeleteButton: 'Eliminar cuenta de forma permanente',
+    feedbackTitle: 'Retroalimentaci贸n',
+    feedbackLabel: '驴Cu茅ntanos por qu茅 eliminaste tu cuenta?',
+    feedbackPlaceholder: 'Opcional',
+    workspaceIcon: 'Icono de espacio de trabajo',
+    editWorkspaceInfo: 'Editar informaci贸n del espacio de trabajo',
+    workspaceName: 'Nombre del espacio de trabajo',
+  },
+  members: {
+    team: 'Equipo',
+    invite: 'Agregar',
+    name: 'NOMBRE',
+    lastActive: '脷LTIMA ACTIVIDAD',
+    role: 'ROLES',
+    pending: 'Pendiente...',
+    owner: 'Propietario',
+    admin: 'Administrador',
+    adminTip: 'Puede crear aplicaciones y administrar configuraciones del equipo',
+    normal: 'Normal',
+    normalTip: 'Solo puede usar aplicaciones, no puede crear aplicaciones',
+    builder: 'Constructor',
+    builderTip: 'Puede crear y editar sus propias aplicaciones',
+    editor: 'Editor',
+    editorTip: 'Puede crear y editar aplicaciones',
+    datasetOperator: 'Administrador de Conocimiento',
+    datasetOperatorTip: 'Solo puede administrar la base de conocimiento',
+    inviteTeamMember: 'Agregar miembro del equipo',
+    inviteTeamMemberTip: 'Pueden acceder a tus datos del equipo directamente despu茅s de iniciar sesi贸n.',
+    emailNotSetup: 'El servidor de correo no est谩 configurado, por lo que no se pueden enviar correos de invitaci贸n. En su lugar, notifique a los usuarios el enlace de invitaci贸n que se emitir谩 despu茅s de la invitaci贸n.',
+    email: 'Correo electr贸nico',
+    emailInvalid: 'Formato de correo electr贸nico inv谩lido',
+    emailPlaceholder: 'Por favor ingresa correos electr贸nicos',
+    sendInvite: 'Enviar invitaci贸n',
+    invitedAsRole: 'Invitado como usuario {{role}}',
+    invitationSent: 'Invitaci贸n enviada',
+    invitationSentTip: 'Invitaci贸n enviada, y pueden iniciar sesi贸n en Dify para acceder a tus datos del equipo.',
+    invitationLink: 'Enlace de invitaci贸n',
+    failedInvitationEmails: 'Los siguientes usuarios no fueron invitados exitosamente',
+    ok: 'OK',
+    removeFromTeam: 'Eliminar del espacio de trabajo',
+    removeFromTeamTip: 'Se eliminar谩 el acceso al equipo',
+    setAdmin: 'Establecer como administrador',
+    setMember: 'Establecer como miembro ordinario',
+    setBuilder: 'Establecer como constructor',
+    setEditor: 'Establecer como editor',
+    disInvite: 'Cancelar la invitaci贸n',
+    deleteMember: 'Eliminar miembro',
+    you: '(T煤)',
+  },
+  integrations: {
+    connected: 'Conectado',
+    google: 'Google',
+    googleAccount: 'Iniciar sesi贸n con cuenta de Google',
+    github: 'GitHub',
+    githubAccount: 'Iniciar sesi贸n con cuenta de GitHub',
+    connect: 'Conectar',
+  },
+  language: {
+    displayLanguage: 'Idioma de visualizaci贸n',
+    timezone: 'Zona horaria',
+  },
+  provider: {
+    apiKey: 'Clave API',
+    enterYourKey: 'Ingresa tu clave API aqu铆',
+    invalidKey: 'Clave API de OpenAI inv谩lida',
+    validatedError: 'Validaci贸n fallida: ',
+    validating: 'Validando clave...',
+    saveFailed: 'Error al guardar la clave API',
+    apiKeyExceedBill: 'Esta CLAVE API no tiene cuota disponible, por favor lee',
+    addKey: 'Agregar Clave',
+    comingSoon: 'Pr贸ximamente',
+    editKey: 'Editar',
+    invalidApiKey: 'Clave API inv谩lida',
+    azure: {
+      apiBase: 'Base API',
+      apiBasePlaceholder: 'La URL base de la API de tu Endpoint de Azure OpenAI.',
+      apiKey: 'Clave API',
+      apiKeyPlaceholder: 'Ingresa tu clave API aqu铆',
+      helpTip: 'Aprender sobre el Servicio Azure OpenAI',
+    },
+    openaiHosted: {
+      openaiHosted: 'OpenAI Hospedado',
+      onTrial: 'EN PRUEBA',
+      exhausted: 'CUOTA AGOTADA',
+      desc: 'El servicio de hospedaje OpenAI proporcionado por Dify te permite usar modelos como GPT-3.5. Antes de que se agote tu cuota de prueba, necesitas configurar otros proveedores de modelos.',
+      callTimes: 'Tiempos de llamada',
+      usedUp: 'Cuota de prueba agotada. Agrega tu propio proveedor de modelos.',
+      useYourModel: 'Actualmente usando tu propio proveedor de modelos.',
+      close: 'Cerrar',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Claude de Anthrop铆c',
+      onTrial: 'EN PRUEBA',
+      exhausted: 'CUOTA AGOTADA',
+      desc: 'Modelo poderoso, que se destaca en una amplia gama de tareas, desde di谩logos sofisticados y generaci贸n de contenido creativo hasta instrucciones detalladas.',
+      callTimes: 'Tiempos de llamada',
+      usedUp: 'Cuota de prueba agotada. Agrega tu propio proveedor de modelos.',
+      useYourModel: 'Actualmente usando tu propio proveedor de modelos.',
+      close: 'Cerrar',
+      trialQuotaTip: 'Su cuota de prueba antr贸pica caducar谩 el 11/03/2025 y ya no estar谩 disponible a partir de entonces. Por favor, aprov茅chelo a tiempo.',
+    },
+    anthropic: {
+      using: 'La capacidad de incrustaci贸n est谩 usando',
+      enableTip: 'Para habilitar el modelo de Anthrop铆c, primero necesitas vincularte al Servicio OpenAI o Azure OpenAI.',
+      notEnabled: 'No habilitado',
+      keyFrom: 'Obt茅n tu clave API de Anthrop铆c',
+    },
+    encrypted: {
+      front: 'Tu CLAVE API ser谩 encriptada y almacenada usando',
+      back: ' tecnolog铆a.',
+    },
+  },
+  modelProvider: {
+    notConfigured: 'El modelo del sistema a煤n no ha sido completamente configurado, y algunas funciones pueden no estar disponibles.',
+    systemModelSettings: 'Configuraciones del Modelo del Sistema',
+    systemModelSettingsLink: '驴Por qu茅 es necesario configurar un modelo del sistema?',
+    selectModel: 'Selecciona tu modelo',
+    setupModelFirst: 'Por favor configura tu modelo primero',
+    systemReasoningModel: {
+      key: 'Modelo de Razonamiento del Sistema',
+      tip: 'Establece el modelo de inferencia predeterminado para ser usado en la creaci贸n de aplicaciones, as铆 como caracter铆sticas como la generaci贸n de nombres de di谩logo y sugerencias de la pr贸xima pregunta tambi茅n usar谩n el modelo de inferencia predeterminado.',
+    },
+    embeddingModel: {
+      key: 'Modelo de Incrustaci贸n',
+      tip: 'Establece el modelo predeterminado para el procesamiento de incrustaci贸n de documentos del Conocimiento, tanto la recuperaci贸n como la importaci贸n del Conocimiento utilizan este modelo de Incrustaci贸n para el procesamiento de vectorizaci贸n. Cambiarlo causar谩 que la dimensi贸n del vector entre el Conocimiento importado y la pregunta sea inconsistente, resultando en fallos en la recuperaci贸n. Para evitar fallos en la recuperaci贸n, por favor no cambies este modelo a voluntad.',
+      required: 'El Modelo de Incrustaci贸n es requerido',
+    },
+    speechToTextModel: {
+      key: 'Modelo de Voz a Texto',
+      tip: 'Establece el modelo predeterminado para la entrada de voz a texto en la conversaci贸n.',
+    },
+    ttsModel: {
+      key: 'Modelo de Texto a Voz',
+      tip: 'Establece el modelo predeterminado para la entrada de texto a voz en la conversaci贸n.',
+    },
+    rerankModel: {
+      key: 'Modelo de Reordenar',
+      tip: 'El modelo de reordenar reordenar谩 la lista de documentos candidatos basada en la coincidencia sem谩ntica con la consulta del usuario, mejorando los resultados de clasificaci贸n sem谩ntica',
+    },
+    apiKey: 'CLAVE API',
+    quota: 'Cuota',
+    searchModel: 'Modelo de b煤squeda',
+    noModelFound: 'No se encontr贸 modelo para {{model}}',
+    models: 'Modelos',
+    showMoreModelProvider: 'Mostrar m谩s proveedores de modelos',
+    selector: {
+      tip: 'Este modelo ha sido eliminado. Por favor agrega un modelo o selecciona otro modelo.',
+      emptyTip: 'No hay modelos disponibles',
+      emptySetting: 'Por favor ve a configuraciones para configurar',
+      rerankTip: 'Por favor configura el modelo de Reordenar',
+    },
+    card: {
+      quota: 'CUOTA',
+      onTrial: 'En prueba',
+      paid: 'Pagado',
+      quotaExhausted: 'Cuota agotada',
+      callTimes: 'Tiempos de llamada',
+      tokens: 'Tokens',
+      buyQuota: 'Comprar Cuota',
+      priorityUse: 'Uso prioritario',
+      removeKey: 'Eliminar CLAVE API',
+      tip: 'Se dar谩 prioridad al uso de la cuota pagada. La cuota de prueba se utilizar谩 despu茅s de que se agote la cuota pagada.',
+    },
+    item: {
+      deleteDesc: '{{modelName}} se est谩 utilizando como modelo de razonamiento del sistema. Algunas funciones no estar谩n disponibles despu茅s de la eliminaci贸n. Por favor confirma.',
+      freeQuota: 'CUOTA GRATUITA',
+    },
+    addApiKey: 'Agrega tu CLAVE API',
+    invalidApiKey: 'Clave API inv谩lida',
+    encrypted: {
+      front: 'Tu CLAVE API ser谩 encriptada y almacenada usando',
+      back: ' tecnolog铆a.',
+    },
+    freeQuota: {
+      howToEarn: 'C贸mo ganar',
+    },
+    addMoreModelProvider: 'AGREGAR M脕S PROVEEDORES DE MODELOS',
+    addModel: 'Agregar Modelo',
+    modelsNum: '{{num}} Modelos',
+    showModels: 'Mostrar Modelos',
+    showModelsNum: 'Mostrar {{num}} Modelos',
+    collapse: 'Colapsar',
+    config: 'Configurar',
+    modelAndParameters: 'Modelo y Par谩metros',
+    model: 'Modelo',
+    featureSupported: '{{feature}} soportado',
+    callTimes: 'Tiempos de llamada',
+    credits: 'Cr茅ditos de Mensaje',
+    buyQuota: 'Comprar Cuota',
+    getFreeTokens: 'Obtener Tokens gratis',
+    priorityUsing: 'Uso prioritario',
+    deprecated: 'Desaprobado',
+    confirmDelete: '驴Confirmar eliminaci贸n?',
+    quotaTip: 'Tokens gratuitos restantes disponibles',
+    loadPresets: 'Cargar Presets',
+    parameters: 'PAR脕METROS',
+    loadBalancing: 'Balanceo de carga',
+    loadBalancingDescription: 'Reduce la presi贸n con m煤ltiples conjuntos de credenciales.',
+    loadBalancingHeadline: 'Balanceo de Carga',
+    configLoadBalancing: 'Configurar Balanceo de Carga',
+    modelHasBeenDeprecated: 'Este modelo ha sido desaprobado',
+    providerManaged: 'Gestionado por el proveedor',
+    providerManagedDescription: 'Usa el 煤nico conjunto de credenciales proporcionado por el proveedor del modelo.',
+    defaultConfig: 'Configuraci贸n Predeterminada',
+    apiKeyStatusNormal: 'El estado de la CLAVE API es normal',
+    apiKeyRateLimit: 'Se alcanz贸 el l铆mite de velocidad, disponible despu茅s de {{seconds}}s',
+    addConfig: 'Agregar Configuraci贸n',
+    editConfig: 'Editar Configuraci贸n',
+    loadBalancingLeastKeyWarning: 'Para habilitar el balanceo de carga se deben habilitar al menos 2 claves.',
+    loadBalancingInfo: 'Por defecto, el balanceo de carga usa la estrategia Round-robin. Si se activa el l铆mite de velocidad, se aplicar谩 un per铆odo de enfriamiento de 1 minuto.',
+    upgradeForLoadBalancing: 'Actualiza tu plan para habilitar el Balanceo de Carga.',
+    configureTip: 'Configurar la clave de API o agregar el modelo que se va a usar',
+    discoverMore: 'Descubre m谩s en',
+    toBeConfigured: 'A configurar',
+    emptyProviderTip: 'Instale primero un proveedor de modelos.',
+    installProvider: 'Instalaci贸n de proveedores de modelos',
+    emptyProviderTitle: 'Proveedor de modelos no configurado',
+  },
+  dataSource: {
+    add: 'Agregar una fuente de datos',
+    connect: 'Conectar',
+    configure: 'Configurar',
+    notion: {
+      title: 'Notion',
+      description: 'Usando Notion como fuente de datos para el Conocimiento.',
+      connectedWorkspace: 'Espacio de trabajo conectado',
+      addWorkspace: 'Agregar espacio de trabajo',
+      connected: 'Conectado',
+      disconnected: 'Desconectado',
+      changeAuthorizedPages: 'Cambiar p谩ginas autorizadas',
+      pagesAuthorized: 'P谩ginas autorizadas',
+      sync: 'Sincronizar',
+      remove: 'Eliminar',
+      selector: {
+        pageSelected: 'P谩ginas seleccionadas',
+        searchPages: 'Buscar p谩ginas...',
+        noSearchResult: 'No hay resultados de b煤squeda',
+        addPages: 'Agregar p谩ginas',
+        preview: 'VISTA PREVIA',
+      },
+    },
+    website: {
+      title: 'Sitio web',
+      description: 'Importar contenido de sitios web usando un rastreador web.',
+      with: 'Con',
+      configuredCrawlers: 'Rastreadores configurados',
+      active: 'Activo',
+      inactive: 'Inactivo',
+    },
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'Clave API',
+      apiKeyPlaceholder: 'Ingresa tu clave API',
+      keyFrom: 'Obt茅n tu clave API de SerpAPI en la p谩gina de cuenta de SerpAPI',
+    },
+  },
+  apiBasedExtension: {
+    title: 'Las extensiones basadas en API proporcionan una gesti贸n centralizada de API, simplificando la configuraci贸n para su f谩cil uso en las aplicaciones de Dify.',
+    link: 'Aprende c贸mo desarrollar tu propia Extensi贸n API.',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: 'Agregar Extensi贸n API',
+    selector: {
+      title: 'Extensi贸n API',
+      placeholder: 'Por favor selecciona extensi贸n API',
+      manage: 'Gestionar Extensi贸n API',
+    },
+    modal: {
+      title: 'Agregar Extensi贸n API',
+      editTitle: 'Editar Extensi贸n API',
+      name: {
+        title: 'Nombre',
+        placeholder: 'Por favor ingresa el nombre',
+      },
+      apiEndpoint: {
+        title: 'Punto final de la API',
+        placeholder: 'Por favor ingresa el punto final de la API',
+      },
+      apiKey: {
+        title: 'Clave API',
+        placeholder: 'Por favor ingresa la clave API',
+        lengthError: 'La longitud de la clave API no puede ser menor a 5 caracteres',
+      },
+    },
+    type: 'Tipo',
+  },
+  about: {
+    changeLog: 'Registro de cambios',
+    updateNow: 'Actualizar ahora',
+    nowAvailable: 'Dify {{version}} ya est谩 disponible.',
+    latestAvailable: 'Dify {{version}} es la 煤ltima versi贸n disponible.',
+  },
+  appMenus: {
+    overview: 'Monitoreo',
+    promptEng: 'Orquestar',
+    apiAccess: 'Acceso API',
+    logAndAnn: 'Registros y Anuncios',
+    logs: 'Registros',
+  },
+  environment: {
+    testing: 'PRUEBAS',
+    development: 'DESARROLLO',
+  },
+  appModes: {
+    completionApp: 'Generador de Texto',
+    chatApp: 'Aplicaci贸n de Chat',
+  },
+  datasetMenus: {
+    documents: 'Documentos',
+    hitTesting: 'Pruebas de Recuperaci贸n',
+    settings: 'Configuraciones',
+    emptyTip: 'El Conocimiento no ha sido asociado, por favor ve a la aplicaci贸n o plugin para completar la asociaci贸n.',
+    viewDoc: 'Ver documentaci贸n',
+    relatedApp: 'aplicaciones vinculadas',
+    noRelatedApp: 'No hay aplicaciones vinculadas',
+  },
+  voiceInput: {
+    speaking: 'Habla ahora...',
+    converting: 'Convirtiendo a texto...',
+    notAllow: 'micr贸fono no autorizado',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: 'Renombrar Conversaci贸n',
+    conversationName: 'Nombre de la conversaci贸n',
+    conversationNamePlaceholder: 'Por favor ingresa el nombre de la conversaci贸n',
+    conversationNameCanNotEmpty: 'Nombre de la conversaci贸n requerido',
+    citation: {
+      title: 'CITAS',
+      linkToDataset: 'Enlace al Conocimiento',
+      characters: 'Caracteres:',
+      hitCount: 'Conteo de recuperaciones:',
+      vectorHash: 'Hash de vector:',
+      hitScore: 'Puntuaci贸n de recuperaci贸n:',
+    },
+    inputPlaceholder: 'Hablar con el bot',
+    thinking: 'Pensamiento...',
+    thought: 'Pensamiento',
+    resend: 'Reenviar',
+  },
+  promptEditor: {
+    placeholder: 'Escribe tu palabra de indicaci贸n aqu铆, ingresa \'{\' para insertar una variable, ingresa \'/\' para insertar un bloque de contenido de indicaci贸n',
+    context: {
+      item: {
+        title: 'Contexto',
+        desc: 'Insertar plantilla de contexto',
+      },
+      modal: {
+        title: '{{num}} Conocimiento en Contexto',
+        add: 'Agregar Contexto ',
+        footer: 'Puedes gestionar contextos en la secci贸n de Contexto abajo.',
+      },
+    },
+    history: {
+      item: {
+        title: 'Historial de Conversaci贸n',
+        desc: 'Insertar plantilla de mensaje hist贸rico',
+      },
+      modal: {
+        title: 'EJEMPLO',
+        user: 'Hola',
+        assistant: '隆Hola! 驴C贸mo puedo asistirte hoy?',
+        edit: 'Editar Nombres de Roles de Conversaci贸n',
+      },
+    },
+    variable: {
+      item: {
+        title: 'Variables y Herramientas Externas',
+        desc: 'Insertar Variables y Herramientas Externas',
+      },
+      outputToolDisabledItem: {
+        title: 'Variables',
+        desc: 'Insertar Variables',
+      },
+      modal: {
+        add: 'Nueva variable',
+        addTool: 'Nueva herramienta',
+      },
+    },
+    query: {
+      item: {
+        title: 'Consulta',
+        desc: 'Insertar plantilla de consulta del usuario',
+      },
+    },
+    existed: 'Ya existe en la indicaci贸n',
+  },
+  imageUploader: {
+    uploadFromComputer: 'Cargar desde la Computadora',
+    uploadFromComputerReadError: 'Lectura de imagen fallida, por favor intenta nuevamente.',
+    uploadFromComputerUploadError: 'Carga de imagen fallida, por favor carga nuevamente.',
+    uploadFromComputerLimit: 'Las im谩genes cargadas no pueden exceder {{size}} MB',
+    pasteImageLink: 'Pegar enlace de imagen',
+    pasteImageLinkInputPlaceholder: 'Pega el enlace de imagen aqu铆',
+    pasteImageLinkInvalid: 'Enlace de imagen inv谩lido',
+    imageUpload: 'Carga de Imagen',
+  },
+  tag: {
+    placeholder: 'Todas las Etiquetas',
+    addNew: 'Agregar nueva etiqueta',
+    noTag: 'Sin etiquetas',
+    noTagYet: 'A煤n sin etiquetas',
+    addTag: 'Agregar etiquetas',
+    editTag: 'Editar etiquetas',
+    manageTags: 'Gestionar Etiquetas',
+    selectorPlaceholder: 'Escribe para buscar o crear',
+    create: 'Crear',
+    delete: 'Eliminar etiqueta',
+    deleteTip: 'La etiqueta se est谩 utilizando, 驴eliminarla?',
+    created: 'Etiqueta creada exitosamente',
+    failed: 'Creaci贸n de etiqueta fallida',
+  },
+  fileUploader: {
+    uploadFromComputer: 'Carga local',
+    pasteFileLink: 'Pegar enlace de archivo',
+    uploadFromComputerReadError: 'Error en la lectura del archivo, int茅ntelo de nuevo.',
+    uploadFromComputerUploadError: 'Error en la carga del archivo, vuelva a cargarlo.',
+    pasteFileLinkInvalid: 'Enlace de archivo no v谩lido',
+    fileExtensionNotSupport: 'Extensi贸n de archivo no compatible',
+    pasteFileLinkInputPlaceholder: 'Introduzca la URL...',
+    uploadFromComputerLimit: 'El archivo de carga no puede exceder {{size}}',
+  },
+  license: {
+    expiring: 'Caduca en un d铆a',
+    expiring_plural: 'Caducando en {{count}} d铆as',
+  },
+  pagination: {
+    perPage: 'Elementos por p谩gina',
+  },
+  theme: {
+    auto: 'sistema',
+    light: 'luz',
+    theme: 'Tema',
+  },
+  compliance: {
+    iso27001: 'Certificaci贸n ISO 27001:2022',
+    gdpr: 'GDPR DPA',
+    soc2Type1: 'Informe SOC 2 Tipo I',
+    sandboxUpgradeTooltip: 'Solo disponible con un plan Profesional o de Equipo.',
+    professionalUpgradeTooltip: 'Solo disponible con un plan de equipo o superior.',
+    soc2Type2: 'Informe SOC 2 Tipo II',
+  },
+  imageInput: {
+    supportedFormats: 'Soporta PNG, JPG, JPEG, WEBP y GIF',
+    browse: 'navegar',
+    dropImageHere: 'Deja tu imagen aqu铆, o',
+  },
+}
+
+export default translation
diff --git a/i18n/es-ES/custom.ts b/i18n/es-ES/custom.ts
new file mode 100644
index 0000000..a3dcdde
--- /dev/null
+++ b/i18n/es-ES/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: 'Personalizaci贸n',
+  upgradeTip: {
+    prefix: 'Actualiza tu plan para',
+    suffix: 'personalizar tu marca.',
+    des: 'Actualiza tu plan para personalizar tu marca',
+    title: 'Actualiza tu plan',
+  },
+  webapp: {
+    title: 'Personalizar marca de WebApp',
+    removeBrand: 'Eliminar Powered by Dify',
+    changeLogo: 'Cambiar Imagen de Marca Powered by',
+    changeLogoTip: 'Formato SVG o PNG con un tama帽o m铆nimo de 40x40px',
+  },
+  app: {
+    title: 'Personalizar encabezado de la aplicaci贸n',
+    changeLogoTip: 'Formato SVG o PNG con un tama帽o m铆nimo de 80x80px',
+  },
+  upload: 'Subir',
+  uploading: 'Subiendo',
+  uploadedFail: 'Error al subir la imagen, por favor vuelve a intentar.',
+  change: 'Cambiar',
+  apply: 'Aplicar',
+  restore: 'Restaurar valores predeterminados',
+  customize: {
+    contactUs: ' cont谩ctanos ',
+    prefix: 'Para personalizar el logotipo de la marca dentro de la aplicaci贸n, por favor',
+    suffix: 'para actualizar a la edici贸n Enterprise.',
+  },
+}
+
+export default translation
diff --git a/i18n/es-ES/dataset-creation.ts b/i18n/es-ES/dataset-creation.ts
new file mode 100644
index 0000000..3984688
--- /dev/null
+++ b/i18n/es-ES/dataset-creation.ts
@@ -0,0 +1,218 @@
+const translation = {
+  steps: {
+    header: {
+      creation: 'Crear conocimiento',
+      update: 'Agregar datos',
+      fallbackRoute: 'Conocimiento',
+    },
+    one: 'Elegir fuente de datos',
+    two: 'Preprocesamiento y limpieza de texto',
+    three: 'Ejecutar y finalizar',
+  },
+  error: {
+    unavailable: 'Este conocimiento no est谩 disponible',
+  },
+  firecrawl: {
+    configFirecrawl: 'Configurar 馃敟Firecrawl',
+    apiKeyPlaceholder: 'Clave de API de firecrawl.dev',
+    getApiKeyLinkText: 'Obtener tu clave de API de firecrawl.dev',
+  },
+  stepOne: {
+    filePreview: 'Vista previa del archivo',
+    pagePreview: 'Vista previa de la p谩gina',
+    dataSourceType: {
+      file: 'Importar desde archivo',
+      notion: 'Sincronizar desde Notion',
+      web: 'Sincronizar desde sitio web',
+    },
+    uploader: {
+      title: 'Cargar archivo',
+      button: 'Arrastre y suelte archivos o carpetas, o',
+      browse: 'Buscar',
+      tip: 'Soporta {{supportTypes}}. M谩ximo {{size}}MB cada uno.',
+      validation: {
+        typeError: 'Tipo de archivo no soportado',
+        size: 'Archivo demasiado grande. El m谩ximo es {{size}}MB',
+        count: 'No se admiten varios archivos',
+        filesNumber: 'Has alcanzado el l铆mite de carga por lotes de {{filesNumber}}.',
+      },
+      cancel: 'Cancelar',
+      change: 'Cambiar',
+      failed: 'Error al cargar',
+    },
+    notionSyncTitle: 'Notion no est谩 conectado',
+    notionSyncTip: 'Para sincronizar con Notion, primero se debe establecer la conexi贸n con Notion.',
+    connect: 'Ir a conectar',
+    button: 'Siguiente',
+    emptyDatasetCreation: 'Quiero crear un conocimiento vac铆o',
+    modal: {
+      title: 'Crear un conocimiento vac铆o',
+      tip: 'Un conocimiento vac铆o no contendr谩 documentos y podr谩s cargar documentos en cualquier momento.',
+      input: 'Nombre del conocimiento',
+      placeholder: 'Por favor ingresa',
+      nameNotEmpty: 'El nombre no puede estar vac铆o',
+      nameLengthInvalid: 'El nombre debe tener entre 1 y 40 caracteres',
+      cancelButton: 'Cancelar',
+      confirmButton: 'Crear',
+      failed: 'Error al crear',
+    },
+    website: {
+      fireCrawlNotConfigured: 'Firecrawl no est谩 configurado',
+      fireCrawlNotConfiguredDescription: 'Configura Firecrawl con la clave de API para poder utilizarlo.',
+      configure: 'Configurar',
+      run: 'Ejecutar',
+      firecrawlTitle: 'Extraer contenido web con 馃敟Firecrawl',
+      firecrawlDoc: 'Documentaci贸n de Firecrawl',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      options: 'Opciones',
+      crawlSubPage: 'Rastrear subp谩ginas',
+      limit: 'L铆mite',
+      maxDepth: 'Profundidad m谩xima',
+      excludePaths: 'Excluir rutas',
+      includeOnlyPaths: 'Incluir solo rutas',
+      extractOnlyMainContent: 'Extraer solo el contenido principal (sin encabezados, navegaci贸n, pies de p谩gina, etc.)',
+      exceptionErrorTitle: 'Se produjo una excepci贸n al ejecutar el trabajo de Firecrawl:',
+      unknownError: 'Error desconocido',
+      totalPageScraped: 'Total de p谩ginas extra铆das:',
+      selectAll: 'Seleccionar todo',
+      resetAll: 'Restablecer todo',
+      scrapTimeInfo: 'Se extrajeron {{total}} p谩ginas en total en {{time}}s',
+      preview: 'Vista previa',
+      maxDepthTooltip: 'Profundidad m谩xima para rastrear en relaci贸n con la URL ingresada. La profundidad 0 solo extrae la p谩gina de la URL ingresada, la profundidad 1 extrae la URL y todo lo despu茅s de la URL ingresada + una /, y as铆 sucesivamente.',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      jinaReaderNotConfigured: 'Jina Reader no est谩 configurado',
+      useSitemap: 'Usar el mapa del sitio',
+      jinaReaderTitle: 'Convertir todo el sitio a Markdown',
+      jinaReaderNotConfiguredDescription: 'Configura Jina Reader introduciendo tu clave API gratuita para acceder.',
+      useSitemapTooltip: 'Siga el mapa del sitio para rastrear el sitio. De lo contrario, Jina Reader rastrear谩 de forma iterativa en funci贸n de la relevancia de la p谩gina, lo que producir谩 menos p谩ginas pero de mayor calidad.',
+      chooseProvider: 'Seleccione un proveedor',
+      jinaReaderDoc: 'M谩s informaci贸n sobre Jina Reader',
+      watercrawlTitle: 'Extraer contenido web con Watercrawl',
+      waterCrawlNotConfigured: 'Watercrawl no est谩 configurado',
+      configureFirecrawl: 'Configurar Firecrawl',
+      watercrawlDoc: 'Documentos de Watercrawl',
+      configureJinaReader: 'Configurar Jina Reader',
+      watercrawlDocLink: 'https://docs.dify.ai/es/gu铆as/base-de-conocimientos/crear-conocimientos-y-subir-documentos/importar-datos-de-contenido/sincronizar-desde-el-sitio-web',
+      configureWatercrawl: 'Configurar Watercrawl',
+      waterCrawlNotConfiguredDescription: 'Configura Watercrawl con la clave de API para usarlo.',
+    },
+    cancel: 'Cancelar',
+  },
+  stepTwo: {
+    segmentation: 'Configuraci贸n de fragmentos',
+    auto: 'Autom谩tico',
+    autoDescription: 'Configura autom谩ticamente las reglas de fragmentaci贸n y preprocesamiento. Se recomienda seleccionar esto para usuarios no familiarizados.',
+    custom: 'Personalizado',
+    customDescription: 'Personaliza las reglas de fragmentaci贸n, longitud de fragmentos y reglas de preprocesamiento, etc.',
+    separator: 'Identificador de segmento',
+    separatorPlaceholder: 'Por ejemplo, salto de l铆nea (\\\\n) o separador especial (como "***")',
+    maxLength: 'Longitud m谩xima del fragmento',
+    overlap: 'Superposici贸n de fragmentos',
+    overlapTip: 'Configurar la superposici贸n de fragmentos puede mantener la relevancia sem谩ntica entre ellos, mejorando el efecto de recuperaci贸n. Se recomienda configurar el 10%-25% del tama帽o m谩ximo del fragmento.',
+    overlapCheck: 'La superposici贸n de fragmentos no debe ser mayor que la longitud m谩xima del fragmento',
+    rules: 'Reglas de preprocesamiento de texto',
+    removeExtraSpaces: 'Reemplazar espacios, saltos de l铆nea y tabulaciones consecutivas',
+    removeUrlEmails: 'Eliminar todas las URL y direcciones de correo electr贸nico',
+    removeStopwords: 'Eliminar palabras vac铆as como "un", "una", "el"',
+    preview: 'Confirmar y vista previa',
+    reset: 'Restablecer',
+    indexMode: 'Modo de 铆ndice',
+    qualified: 'Alta calidad',
+    recommend: 'Recomendado',
+    qualifiedTip: 'Llama a la interfaz de incrustaci贸n del sistema por defecto para proporcionar una mayor precisi贸n cuando los usuarios realizan consultas.',
+    warning: 'Por favor, configura primero la clave de API del proveedor del modelo.',
+    click: 'Ir a configuraci贸n',
+    economical: 'Econ贸mico',
+    economicalTip: 'Utiliza motores de vector sin conexi贸n, 铆ndices de palabras clave, etc. para reducir la precisi贸n sin gastar tokens',
+    QATitle: 'Segmentaci贸n en formato de pregunta y respuesta',
+    QATip: 'Habilitar esta opci贸n consumir谩 m谩s tokens',
+    QALanguage: 'Segmentar usando',
+    estimateCost: 'Estimaci贸n',
+    estimateSegment: 'Fragmentos estimados',
+    segmentCount: 'fragmentos',
+    calculating: 'Calculando...',
+    fileSource: 'Preprocesar documentos',
+    notionSource: 'Preprocesar p谩ginas',
+    websiteSource: 'Preprocesar sitio web',
+    other: 'y otros ',
+    fileUnit: ' archivos',
+    notionUnit: ' p谩ginas',
+    webpageUnit: ' p谩ginas',
+    previousStep: 'Paso anterior',
+    nextStep: 'Guardar y procesar',
+    save: 'Guardar y procesar',
+    cancel: 'Cancelar',
+    sideTipTitle: '驴Por qu茅 fragmentar y preprocesar?',
+    sideTipP1: 'Al procesar datos de texto, la fragmentaci贸n y la limpieza son dos pasos de preprocesamiento importantes.',
+    sideTipP2: 'La segmentaci贸n divide el texto largo en p谩rrafos para que los modelos puedan entenderlo mejor. Esto mejora la calidad y relevancia de los resultados del modelo.',
+    sideTipP3: 'La limpieza elimina caracteres y formatos innecesarios, haciendo que el conocimiento sea m谩s limpio y f谩cil de analizar.',
+    sideTipP4: 'Una fragmentaci贸n y limpieza adecuadas mejoran el rendimiento del modelo, proporcionando resultados m谩s precisos y valiosos.',
+    previewTitle: 'Vista previa',
+    previewTitleButton: 'Vista previa',
+    previewButton: 'Cambiar a formato de pregunta y respuesta',
+    previewSwitchTipStart: 'La vista previa actual del fragmento est谩 en formato de texto, cambiar a una vista previa en formato de pregunta y respuesta',
+    previewSwitchTipEnd: ' consumir谩 tokens adicionales',
+    characters: 'caracteres',
+    indexSettingTip: 'Para cambiar el m茅todo de 铆ndice, por favor ve a la ',
+    retrievalSettingTip: 'Para cambiar el m茅todo de 铆ndice, por favor ve a la ',
+    datasetSettingLink: 'configuraci贸n del conocimiento.',
+    separatorTip: 'Un delimitador es el car谩cter que se utiliza para separar el texto. \\n\\n y \\n son delimitadores com煤nmente utilizados para separar p谩rrafos y l铆neas. Combinado con comas (\\n\\n,\\n), los p谩rrafos se segmentar谩n por l铆neas cuando excedan la longitud m谩xima del fragmento. Tambi茅n puede utilizar delimitadores especiales definidos por usted mismo (por ejemplo, ***).',
+    maxLengthCheck: 'La longitud m谩xima del fragmento debe ser inferior a {{limit}}',
+    previewChunkTip: 'Haga clic en el bot贸n \'Vista previa de fragmento\' a la izquierda para cargar la vista previa',
+    parentChildChunkDelimiterTip: 'Un delimitador es el car谩cter que se utiliza para separar el texto. \\n se recomienda para dividir fragmentos primarios en fragmentos secundarios peque帽os. Tambi茅n puede utilizar delimitadores especiales definidos por usted mismo.',
+    parentChildTip: 'Cuando se utiliza el modo padre-hijo, el fragmento secundario se utiliza para la recuperaci贸n y el fragmento primario se utiliza para la recuperaci贸n como contexto.',
+    switch: 'Interruptor',
+    parentChild: 'Padre-hijo',
+    childChunkForRetrieval: 'Fragmento secundario para la recuperaci贸n',
+    previewChunk: 'Fragmento de vista previa',
+    notAvailableForParentChild: 'No disponible para el 铆ndice de elementos primarios y secundarios',
+    paragraph: 'P谩rrafo',
+    parentChunkForContext: 'Fragmento primario para contexto',
+    fullDoc: 'Documento completo',
+    parentChildDelimiterTip: 'Un delimitador es el car谩cter que se utiliza para separar el texto. \\n\\n se recomienda para dividir el documento original en grandes fragmentos principales. Tambi茅n puede utilizar delimitadores especiales definidos por usted mismo.',
+    generalTip: 'Modo de fragmentaci贸n de texto general, los fragmentos recuperados y recuperados son los mismos.',
+    qaSwitchHighQualityTipContent: 'Actualmente, solo el m茅todo de 铆ndice de alta calidad admite la fragmentaci贸n en formato de preguntas y respuestas. 驴Le gustar铆a cambiar al modo de alta calidad?',
+    useQALanguage: 'Fragmento usando el formato de preguntas y respuestas en',
+    fullDocTip: 'Todo el documento se utiliza como fragmento principal y se recupera directamente. Tenga en cuenta que, por razones de rendimiento, el texto que supere los 10000 tokens se trunquear谩 autom谩ticamente.',
+    paragraphTip: 'Este modo divide el texto en p谩rrafos en funci贸n de los delimitadores y la longitud m谩xima del fragmento, utilizando el texto dividido como fragmento principal para la recuperaci贸n.',
+    highQualityTip: 'Una vez finalizada la incrustaci贸n en el modo de alta calidad, no est谩 disponible volver al modo econ贸mico.',
+    notAvailableForQA: 'No disponible para el 铆ndice de preguntas y respuestas',
+    qaSwitchHighQualityTipTitle: 'El formato de preguntas y respuestas requiere un m茅todo de indexaci贸n de alta calidad',
+    previewChunkCount: '{{conteo}} Fragmentos estimados',
+    general: 'General',
+  },
+  stepThree: {
+    creationTitle: '馃帀 Conocimiento creado',
+    creationContent: 'Hemos asignado autom谩ticamente un nombre al conocimiento, puedes modificarlo en cualquier momento',
+    label: 'Nombre del conocimiento',
+    additionTitle: '馃帀 Documento cargado',
+    additionP1: 'El documento se ha cargado en el conocimiento',
+    additionP2: ', puedes encontrarlo en la lista de documentos del conocimiento.',
+    stop: 'Detener procesamiento',
+    resume: 'Reanudar procesamiento',
+    navTo: 'Ir al documento',
+    sideTipTitle: '驴Qu茅 sigue?',
+    sideTipContent: 'Despu茅s de que el documento termine de indexarse, el conocimiento se puede integrar en la aplicaci贸n como contexto. Puedes encontrar la configuraci贸n de contexto en la p谩gina de orquestaci贸n de indicaciones. Tambi茅n puedes crearlo como un plugin de indexaci贸n ChatGPT independiente para su lanzamiento.',
+    modelTitle: '驴Est谩s seguro de detener la incrustaci贸n?',
+    modelContent: 'Si necesitas reanudar el procesamiento m谩s tarde, continuar谩s desde donde lo dejaste.',
+    modelButtonConfirm: 'Confirmar',
+    modelButtonCancel: 'Cancelar',
+  },
+  jinaReader: {
+    configJinaReader: 'Configurar Jina Reader',
+    apiKeyPlaceholder: 'Clave de API de jina.ai',
+    getApiKeyLinkText: 'Obt茅n tu clave API gratuita en jina.ai',
+  },
+  otherDataSource: {
+    learnMore: 'Aprende m谩s',
+    description: 'Actualmente, la base de conocimientos de Ifiy solo tiene fuentes de datos limitadas. Contribuir con una fuente de datos a la base de conocimientos de Dify es una manera fant谩stica de ayudar a mejorar la flexibilidad y el poder de la plataforma para todos los usuarios. Nuestra gu铆a de contribuciones hace que sea f谩cil comenzar. Haga clic en el enlace a continuaci贸n para obtener m谩s informaci贸n.',
+    title: '驴Conectarse a otras fuentes de datos?',
+  },
+  watercrawl: {
+    getApiKeyLinkText: 'Obt茅n tu clave API de watercrawl.dev',
+    apiKeyPlaceholder: 'Clave API de watercrawl.dev',
+    configWatercrawl: 'Configurar Watercrawl',
+  },
+}
+
+export default translation
diff --git a/i18n/es-ES/dataset-documents.ts b/i18n/es-ES/dataset-documents.ts
new file mode 100644
index 0000000..cd5bb36
--- /dev/null
+++ b/i18n/es-ES/dataset-documents.ts
@@ -0,0 +1,395 @@
+const translation = {
+  list: {
+    title: 'Documentos',
+    desc: 'Aqu铆 se muestran todos los archivos del Conocimiento, y todo el Conocimiento se puede vincular a citas de Dify o indexarse a trav茅s del complemento de Chat.',
+    addFile: 'Agregar archivo',
+    addPages: 'Agregar p谩ginas',
+    addUrl: 'Agregar URL',
+    table: {
+      header: {
+        fileName: 'NOMBRE DEL ARCHIVO',
+        words: 'PALABRAS',
+        hitCount: 'CANTIDAD DE RECUPERACI脫N',
+        uploadTime: 'TIEMPO DE CARGA',
+        status: 'ESTADO',
+        action: 'ACCI脫N',
+        chunkingMode: 'MODO DE FRAGMENTACI脫N',
+      },
+      rename: 'Renombrar',
+      name: 'Nombre',
+    },
+    action: {
+      uploadFile: 'Subir nuevo archivo',
+      settings: 'Configuraci贸n de segmento',
+      addButton: 'Agregar fragmento',
+      add: 'Agregar un fragmento',
+      batchAdd: 'Agregar en lotes',
+      archive: 'Archivar',
+      unarchive: 'Desarchivar',
+      delete: 'Eliminar',
+      enableWarning: 'El archivo archivado no puede habilitarse',
+      sync: 'Sincronizar',
+    },
+    index: {
+      enable: 'Habilitar',
+      disable: 'Deshabilitar',
+      all: 'Todos',
+      enableTip: 'El archivo se puede indexar',
+      disableTip: 'El archivo no se puede indexar',
+    },
+    status: {
+      queuing: 'En cola',
+      indexing: 'Indexando',
+      paused: 'Pausado',
+      error: 'Error',
+      available: 'Disponible',
+      enabled: 'Habilitado',
+      disabled: 'Deshabilitado',
+      archived: 'Archivado',
+    },
+    empty: {
+      title: 'A煤n no hay documentaci贸n',
+      upload: {
+        tip: 'Puedes subir archivos, sincronizar desde el sitio web o desde aplicaciones web como Notion, GitHub, etc.',
+      },
+      sync: {
+        tip: 'Dify descargar谩 peri贸dicamente archivos desde tu Notion y completar谩 el procesamiento.',
+      },
+    },
+    delete: {
+      title: '驴Seguro que deseas eliminar?',
+      content: 'Si necesitas reanudar el procesamiento m谩s tarde, continuar谩s desde donde lo dejaste.',
+    },
+    batchModal: {
+      title: 'Agregar fragmentos en lotes',
+      csvUploadTitle: 'Arrastra y suelta tu archivo CSV aqu铆, o ',
+      browse: 'navega',
+      tip: 'El archivo CSV debe cumplir con la siguiente estructura:',
+      question: 'pregunta',
+      answer: 'respuesta',
+      contentTitle: 'contenido del fragmento',
+      content: 'contenido',
+      template: 'Descarga la plantilla aqu铆',
+      cancel: 'Cancelar',
+      run: 'Ejecutar en lotes',
+      runError: 'Error al ejecutar en lotes',
+      processing: 'Procesamiento en lotes',
+      completed: 'Importaci贸n completada',
+      error: 'Error de importaci贸n',
+      ok: 'Aceptar',
+    },
+    learnMore: 'Aprende m谩s',
+  },
+  metadata: {
+    title: 'Metadatos',
+    desc: 'Etiquetar metadatos para documentos permite que la IA acceda a ellos de manera oportuna y expone la fuente de referencias para los usuarios.',
+    dateTimeFormat: 'MMMM D, YYYY hh:mm A',
+    docTypeSelectTitle: 'Por favor, selecciona un tipo de documento',
+    docTypeChangeTitle: 'Cambiar tipo de documento',
+    docTypeSelectWarning:
+      'Si se cambia el tipo de documento, los metadatos ahora llenos ya no se conservar谩n.',
+    firstMetaAction: 'Vamos D',
+    placeholder: {
+      add: 'Agregar ',
+      select: 'Seleccionar ',
+    },
+    source: {
+      upload_file: 'Subir archivo',
+      notion: 'Sincronizar desde Notion',
+      github: 'Sincronizar desde GitHub',
+    },
+    type: {
+      book: 'Libro',
+      webPage: 'P谩gina Web',
+      paper: 'Art铆culo',
+      socialMediaPost: 'Publicaci贸n en Redes Sociales',
+      personalDocument: 'Documento Personal',
+      businessDocument: 'Documento de Negocios',
+      IMChat: 'Chat IM',
+      wikipediaEntry: 'Entrada de Wikipedia',
+      notion: 'Sincronizar desde Notion',
+      github: 'Sincronizar desde GitHub',
+      technicalParameters: 'Par谩metros T茅cnicos',
+    },
+    field: {
+      processRule: {
+        processDoc: 'Procesar documento',
+        segmentRule: 'Regla de segmentaci贸n',
+        segmentLength: 'Longitud de fragmentos',
+        processClean: 'Limpieza de texto procesado',
+      },
+      book: {
+        title: 'T铆tulo',
+        language: 'Idioma',
+        author: 'Autor',
+        publisher: 'Editorial',
+        publicationDate: 'Fecha de publicaci贸n',
+        ISBN: 'ISBN',
+        category: 'Categor铆a',
+      },
+      webPage: {
+        title: 'T铆tulo',
+        url: 'URL',
+        language: 'Idioma',
+        authorPublisher: 'Autor/Editorial',
+        publishDate: 'Fecha de publicaci贸n',
+        topicKeywords: 'Temas/Palabras clave',
+        description: 'Descripci贸n',
+      },
+      paper: {
+        title: 'T铆tulo',
+        language: 'Idioma',
+        author: 'Autor',
+        publishDate: 'Fecha de publicaci贸n',
+        journalConferenceName: 'Nombre de la revista/conferencia',
+        volumeIssuePage: 'Volumen/N煤mero/P谩gina',
+        DOI: 'DOI',
+        topicsKeywords: 'Temas/Palabras clave',
+        abstract: 'Resumen',
+      },
+      socialMediaPost: {
+        platform: 'Plataforma',
+        authorUsername: 'Autor/Nombre de usuario',
+        publishDate: 'Fecha de publicaci贸n',
+        postURL: 'URL de la publicaci贸n',
+        topicsTags: 'Temas/Etiquetas',
+      },
+      personalDocument: {
+        title: 'T铆tulo',
+        author: 'Autor',
+        creationDate: 'Fecha de creaci贸n',
+        lastModifiedDate: '脷ltima fecha de modificaci贸n',
+        documentType: 'Tipo de documento',
+        tagsCategory: 'Etiquetas/Categor铆a',
+      },
+      businessDocument: {
+        title: 'T铆tulo',
+        author: 'Autor',
+        creationDate: 'Fecha de creaci贸n',
+        lastModifiedDate: '脷ltima fecha de modificaci贸n',
+        documentType: 'Tipo de documento',
+        departmentTeam: 'Departamento/Equipo',
+      },
+      IMChat: {
+        chatPlatform: 'Plataforma de chat',
+        chatPartiesGroupName: 'Partes de chat/Nombre del grupo',
+        participants: 'Participantes',
+        startDate: 'Fecha de inicio',
+        endDate: 'Fecha de fin',
+        topicsKeywords: 'Temas/Palabras clave',
+        fileType: 'Tipo de archivo',
+      },
+      wikipediaEntry: {
+        title: 'T铆tulo',
+        language: 'Idioma',
+        webpageURL: 'URL de la p谩gina web',
+        editorContributor: 'Editor/Contribuidor',
+        lastEditDate: '脷ltima fecha de edici贸n',
+        summaryIntroduction: 'Resumen/Introducci贸n',
+      },
+      notion: {
+        title: 'T铆tulo',
+        language: 'Idioma',
+        author: 'Autor',
+        createdTime: 'Fecha de creaci贸n',
+        lastModifiedTime: '脷ltima fecha de modificaci贸n',
+        url: 'URL',
+        tag: 'Etiqueta',
+        description: 'Descripci贸n',
+      },
+      github: {
+        repoName: 'Nombre del repositorio',
+        repoDesc: 'Descripci贸n del repositorio',
+        repoOwner: 'Propietario del repositorio',
+        fileName: 'Nombre del archivo',
+        filePath: 'Ruta del archivo',
+        programmingLang: 'Lenguaje de programaci贸n',
+        url: 'URL',
+        license: 'Licencia',
+        lastCommitTime: '脷ltima hora de compromiso',
+        lastCommitAuthor: '脷ltimo autor del compromiso',
+      },
+      originInfo: {
+        originalFilename: 'Nombre de archivo original',
+        originalFileSize: 'Tama帽o de archivo original',
+        uploadDate: 'Fecha de carga',
+        lastUpdateDate: '脷ltima fecha de actualizaci贸n',
+        source: 'Fuente',
+      },
+      technicalParameters: {
+        segmentSpecification: 'Especificaci贸n de fragmentos',
+        segmentLength: 'Longitud de fragmentos',
+        avgParagraphLength: 'Longitud promedio del p谩rrafo',
+        paragraphs: 'P谩rrafos',
+        hitCount: 'Cantidad de recuperaci贸n',
+        embeddingTime: 'Tiempo de incrustaci贸n',
+        embeddedSpend: 'Gasto incrustado',
+      },
+    },
+    languageMap: {
+      zh: 'Chino',
+      en: 'Ingl茅s',
+      es: 'Espa帽ol',
+      fr: 'Franc茅s',
+      de: 'Alem谩n',
+      ja: 'Japon茅s',
+      ko: 'Coreano',
+      ru: 'Ruso',
+      ar: '脕rabe',
+      pt: 'Portugu茅s',
+      it: 'Italiano',
+      nl: 'Holand茅s',
+      pl: 'Polaco',
+      sv: 'Sueco',
+      tr: 'Turco',
+      he: 'Hebreo',
+      hi: 'Hindi',
+      da: 'Dan茅s',
+      fi: 'Finland茅s',
+      no: 'Noruego',
+      hu: 'H煤ngaro',
+      el: 'Griego',
+      cs: 'Checo',
+      th: 'Tailand茅s',
+      id: 'Indonesio',
+    },
+    categoryMap: {
+      book: {
+        fiction: 'Ficci贸n',
+        biography: 'Biograf铆a',
+        history: 'Historia',
+        science: 'Ciencia',
+        technology: 'Tecnolog铆a',
+        education: 'Educaci贸n',
+        philosophy: 'Filosof铆a',
+        religion: 'Religi贸n',
+        socialSciences: 'Ciencias Sociales',
+        art: 'Arte',
+        travel: 'Viaje',
+        health: 'Salud',
+        selfHelp: 'Autoayuda',
+        businessEconomics: 'Negocios y Econom铆a',
+        cooking: 'Cocina',
+        childrenYoungAdults: 'Ni帽os y J贸venes Adultos',
+        comicsGraphicNovels: 'C贸mics y Novelas Gr谩ficas',
+        poetry: 'Poes铆a',
+        drama: 'Drama',
+        other: 'Otros',
+      },
+      personalDoc: {
+        notes: 'Notas',
+        blogDraft: 'Borrador de blog',
+        diary: 'Diario',
+        researchReport: 'Informe de investigaci贸n',
+        bookExcerpt: 'Extracto de libro',
+        schedule: 'Horario',
+        list: 'Lista',
+        projectOverview: 'Visi贸n general del proyecto',
+        photoCollection: 'Colecci贸n de fotos',
+        creativeWriting: 'Escritura creativa',
+        codeSnippet: 'Fragmento de c贸digo',
+        designDraft: 'Borrador de dise帽o',
+        personalResume: 'Curr铆culum personal',
+        other: 'Otros',
+      },
+      businessDoc: {
+        meetingMinutes: 'Minutos de reuni贸n',
+        researchReport: 'Informe de investigaci贸n',
+        proposal: 'Propuesta',
+        employeeHandbook: 'Manual del empleado',
+        trainingMaterials: 'Materiales de capacitaci贸n',
+        requirementsDocument: 'Documento de requisitos',
+        designDocument: 'Documento de dise帽o',
+        productSpecification: 'Especificaci贸n del producto',
+        financialReport: 'Informe financiero',
+        marketAnalysis: 'An谩lisis de mercado',
+        projectPlan: 'Plan de proyecto',
+        teamStructure: 'Estructura del equipo',
+        policiesProcedures: 'Pol铆ticas y procedimientos',
+        contractsAgreements: 'Contratos y acuerdos',
+        emailCorrespondence: 'Correspondencia por correo electr贸nico',
+        other: 'Otros',
+      },
+    },
+  },
+  embedding: {
+    processing: 'Procesando incrustaci贸n...',
+    paused: 'Incrustaci贸n pausada',
+    completed: 'Incrustaci贸n completada',
+    error: 'Error de incrustaci贸n',
+    docName: 'Preprocesamiento del documento',
+    mode: 'Regla de segmentaci贸n',
+    segmentLength: 'Longitud de fragmentos',
+    textCleaning: 'Definici贸n de texto y limpieza previa',
+    segments: 'P谩rrafos',
+    highQuality: 'Modo de alta calidad',
+    economy: 'Modo econ贸mico',
+    estimate: 'Consumo estimado',
+    stop: 'Detener procesamiento',
+    resume: 'Reanudar procesamiento',
+    automatic: 'Autom谩tico',
+    custom: 'Personalizado',
+    previewTip: 'La vista previa del p谩rrafo estar谩 disponible despu茅s de que se complete la incrustaci贸n',
+    pause: 'Pausa',
+    childMaxTokens: 'Ni帽o',
+    hierarchical: 'Padre-hijo',
+    parentMaxTokens: 'Padre',
+  },
+  segment: {
+    paragraphs: 'P谩rrafos',
+    keywords: 'Palabras clave',
+    addKeyWord: 'Agregar palabra clave',
+    keywordError: 'La longitud m谩xima de la palabra clave es 20',
+    characters: 'caracteres',
+    hitCount: 'Cantidad de recuperaci贸n',
+    vectorHash: 'Hash de vector: ',
+    questionPlaceholder: 'agregar pregunta aqu铆',
+    questionEmpty: 'La pregunta no puede estar vac铆a',
+    answerPlaceholder: 'agregar respuesta aqu铆',
+    answerEmpty: 'La respuesta no puede estar vac铆a',
+    contentPlaceholder: 'agregar contenido aqu铆',
+    contentEmpty: 'El contenido no puede estar vac铆o',
+    newTextSegment: 'Nuevo segmento de texto',
+    newQaSegment: 'Nuevo segmento de preguntas y respuestas',
+    delete: '驴Eliminar este fragmento?',
+    chunks_one: 'PEDAZO',
+    childChunks_one: 'FRAGMENTO SECUNDARIO',
+    searchResults_other: 'RESULTADOS',
+    newChunk: 'Nuevo fragmento',
+    childChunk: 'Fragmento secundario',
+    addChunk: 'Agregar fragmento',
+    editParentChunk: 'Editar fragmento principal',
+    regenerationConfirmMessage: 'La regeneraci贸n de fragmentos secundarios sobrescribir谩 los fragmentos secundarios actuales, incluidos los fragmentos editados y los fragmentos reci茅n agregados. La regeneraci贸n no se puede deshacer.',
+    addAnother: 'A帽ade otro',
+    regeneratingMessage: 'Esto puede tardar un momento, por favor espere...',
+    addChildChunk: 'Agregar fragmento secundario',
+    chunks_other: 'TROZOS',
+    editChunk: 'Editar fragmento',
+    searchResults_one: 'RESULTADO',
+    parentChunks_one: 'FRAGMENTO PRIMARIO',
+    edited: 'EDITADO',
+    childChunkAdded: 'Se ha a帽adido 1 fragmento secundario',
+    childChunks_other: 'FRAGMENTOS SECUNDARIOS',
+    chunkAdded: '1 trozo a帽adido',
+    parentChunk: 'Fragmento primario',
+    editChildChunk: 'Editar fragmento secundario',
+    regeneratingTitle: 'Regeneraci贸n de fragmentos secundarios',
+    editedAt: 'Editado en',
+    searchResults_zero: 'RESULTADO',
+    clearFilter: 'Borrar filtro',
+    newChildChunk: 'Nuevo fragmento secundario',
+    chunkDetail: 'Detalle de fragmentos',
+    chunk: 'Pedazo',
+    parentChunks_other: 'FRAGMENTOS PRINCIPALES',
+    expandChunks: 'Expandir fragmentos',
+    empty: 'No se ha encontrado ning煤n fragmento',
+    regenerationSuccessTitle: 'Regeneraci贸n completada',
+    collapseChunks: 'Contraer fragmentos',
+    characters_other: 'Caracteres',
+    characters_one: 'car谩cter',
+    regenerationSuccessMessage: 'Puede cerrar esta ventana.',
+    regenerationConfirmTitle: '驴Desea regenerar fragmentos secundarios?',
+  },
+}
+
+export default translation
diff --git a/i18n/es-ES/dataset-hit-testing.ts b/i18n/es-ES/dataset-hit-testing.ts
new file mode 100644
index 0000000..e8faebc
--- /dev/null
+++ b/i18n/es-ES/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: 'Prueba de recuperaci贸n',
+  desc: 'Prueba del efecto de impacto del conocimiento basado en el texto de consulta proporcionado.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  recents: 'Recientes',
+  table: {
+    header: {
+      source: 'Fuente',
+      text: 'Texto',
+      time: 'Tiempo',
+    },
+  },
+  input: {
+    title: 'Texto fuente',
+    placeholder: 'Por favor ingrese un texto, se recomienda una oraci贸n declarativa corta.',
+    countWarning: 'Hasta 200 caracteres.',
+    indexWarning: 'Solo conocimiento de alta calidad.',
+    testing: 'Prueba',
+  },
+  hit: {
+    title: 'P脕RRAFOS DE RECUPERACI脫N',
+    emptyTip: 'Los resultados de la prueba de recuperaci贸n se mostrar谩n aqu铆',
+  },
+  noRecentTip: 'No hay resultados de consulta recientes aqu铆',
+  viewChart: 'Ver GR脕FICO VECTORIAL',
+  viewDetail: 'Ver Detalle',
+  settingTitle: 'Configuraci贸n de recuperaci贸n',
+  open: 'Abrir',
+  records: 'Archivo',
+  chunkDetail: 'Detalle de fragmentos',
+  keyword: 'Palabras clave',
+  hitChunks: 'Golpea {{num}} fragmentos secundarios',
+}
+
+export default translation
diff --git a/i18n/es-ES/dataset-settings.ts b/i18n/es-ES/dataset-settings.ts
new file mode 100644
index 0000000..f1c87aa
--- /dev/null
+++ b/i18n/es-ES/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: 'Configuraci贸n del conjunto de datos',
+  desc: 'Aqu铆 puedes modificar las propiedades y los m茅todos de trabajo del conjunto de datos.',
+  form: {
+    name: 'Nombre del conjunto de datos',
+    namePlaceholder: 'Por favor ingresa el nombre del conjunto de datos',
+    nameError: 'El nombre no puede estar vac铆o',
+    desc: 'Descripci贸n del conjunto de datos',
+    descInfo: 'Por favor escribe una descripci贸n textual clara para delinear el contenido del conjunto de datos. Esta descripci贸n se utilizar谩 como base para la coincidencia al seleccionar entre m煤ltiples conjuntos de datos para la inferencia.',
+    descPlaceholder: 'Describe lo que hay en este conjunto de datos. Una descripci贸n detallada permite que la IA acceda al contenido del conjunto de datos de manera oportuna. Si est谩 vac铆o, Dify utilizar谩 la estrategia de coincidencia predeterminada.',
+    descWrite: 'Aprende c贸mo escribir una buena descripci贸n del conjunto de datos.',
+    permissions: 'Permisos',
+    permissionsOnlyMe: 'Solo yo',
+    permissionsAllMember: 'Todos los miembros del equipo',
+    permissionsInvitedMembers: 'Miembros del equipo invitados',
+    me: '(T煤)',
+    indexMethod: 'M茅todo de indexaci贸n',
+    indexMethodHighQuality: 'Alta calidad',
+    indexMethodHighQualityTip: 'Llama al modelo de incrustaci贸n para procesar y proporcionar una mayor precisi贸n cuando los usuarios realizan consultas.',
+    indexMethodEconomy: 'Econ贸mico',
+    indexMethodEconomyTip: 'Utiliza motores de vectores sin conexi贸n, 铆ndices de palabras clave, etc. para reducir la precisi贸n sin gastar tokens.',
+    embeddingModel: 'Modelo de incrustaci贸n',
+    embeddingModelTip: 'Cambia el modelo de incrustaci贸n, por favor ve a ',
+    embeddingModelTipLink: 'Configuraci贸n',
+    retrievalSetting: {
+      title: 'Configuraci贸n de recuperaci贸n',
+      learnMore: 'Aprende m谩s',
+      description: ' sobre el m茅todo de recuperaci贸n.',
+      longDescription: ' sobre el m茅todo de recuperaci贸n, puedes cambiar esto en cualquier momento en la configuraci贸n del conjunto de datos.',
+      method: 'M茅todo de recuperaci贸n',
+    },
+    save: 'Guardar',
+    retrievalSettings: 'Configuraci贸n de recuperaci贸n',
+    externalKnowledgeID: 'ID de conocimiento externo',
+    externalKnowledgeAPI: 'API de conocimiento externo',
+    indexMethodChangeToEconomyDisabledTip: 'No disponible para degradar de HQ a ECO',
+    helpText: 'Aprenda a escribir una buena descripci贸n del conjunto de datos.',
+    upgradeHighQualityTip: 'Una vez que se actualiza al modo de alta calidad, no est谩 disponible volver al modo econ贸mico',
+    searchModel: 'Buscar modelo',
+  },
+}
+
+export default translation
diff --git a/i18n/es-ES/dataset.ts b/i18n/es-ES/dataset.ts
new file mode 100644
index 0000000..b759f26
--- /dev/null
+++ b/i18n/es-ES/dataset.ts
@@ -0,0 +1,219 @@
+const translation = {
+  knowledge: 'Conocimiento',
+  documentCount: ' documentos',
+  wordCount: ' mil palabras',
+  appCount: ' aplicaciones vinculadas',
+  createDataset: 'Crear Conocimiento',
+  createDatasetIntro: 'Importa tus propios datos de texto o escribe datos en tiempo real a trav茅s de Webhook para mejorar el contexto de LLM.',
+  deleteDatasetConfirmTitle: '驴Eliminar este Conocimiento?',
+  deleteDatasetConfirmContent:
+    'Eliminar el Conocimiento es irreversible. Los usuarios ya no podr谩n acceder a tu Conocimiento y todas las configuraciones y registros de las sugerencias se eliminar谩n permanentemente.',
+  datasetUsedByApp: 'El conocimiento est谩 siendo utilizado por algunas aplicaciones. Las aplicaciones ya no podr谩n utilizar este Conocimiento y todas las configuraciones y registros de las sugerencias se eliminar谩n permanentemente.',
+  datasetDeleted: 'Conocimiento eliminado',
+  datasetDeleteFailed: 'Error al eliminar el Conocimiento',
+  didYouKnow: '驴Sab铆as?',
+  intro1: 'El Conocimiento se puede integrar en la aplicaci贸n Dify ',
+  intro2: 'como contexto',
+  intro3: ',',
+  intro4: 'o ',
+  intro5: 'se puede crear',
+  intro6: ' como un complemento independiente de ChatGPT para publicar',
+  unavailable: 'No disponible',
+  unavailableTip: 'El modelo de incrustaci贸n no est谩 disponible, es necesario configurar el modelo de incrustaci贸n predeterminado',
+  datasets: 'CONOCIMIENTO',
+  datasetsApi: 'ACCESO A LA API',
+  retrieval: {
+    semantic_search: {
+      title: 'B煤squeda Vectorial',
+      description: 'Genera incrustaciones de consulta y busca el fragmento de texto m谩s similar a su representaci贸n vectorial.',
+    },
+    full_text_search: {
+      title: 'B煤squeda de Texto Completo',
+      description: 'Indexa todos los t茅rminos del documento, lo que permite a los usuarios buscar cualquier t茅rmino y recuperar el fragmento de texto relevante que contiene esos t茅rminos.',
+    },
+    hybrid_search: {
+      title: 'B煤squeda H铆brida',
+      description: 'Ejecuta b煤squedas de texto completo y b煤squedas vectoriales simult谩neamente, reordena para seleccionar la mejor coincidencia para la consulta del usuario. Es necesaria la configuraci贸n de las API del modelo de reordenamiento.',
+      recommend: 'Recomendar',
+    },
+    invertedIndex: {
+      title: '脥ndice Invertido',
+      description: 'El 脥ndice Invertido es una estructura utilizada para la recuperaci贸n eficiente. Organizado por t茅rminos, cada t茅rmino apunta a documentos o p谩ginas web que lo contienen.',
+    },
+    change: 'Cambiar',
+    changeRetrievalMethod: 'Cambiar m茅todo de recuperaci贸n',
+  },
+  docsFailedNotice: 'no se pudieron indexar los documentos',
+  retry: 'Reintentar',
+  indexingTechnique: {
+    high_quality: 'AC',
+    economy: 'ECO',
+  },
+  indexingMethod: {
+    semantic_search: 'VECTOR',
+    full_text_search: 'TEXTO COMPLETO',
+    hybrid_search: 'H脥BRIDO',
+    invertedIndex: 'INVERTIDO',
+  },
+  mixtureHighQualityAndEconomicTip: 'Se requiere el modelo de reclasificaci贸n para la mezcla de bases de conocimiento de alta calidad y econ贸micas.',
+  inconsistentEmbeddingModelTip: 'Se requiere el modelo de reclasificaci贸n si los modelos de incrustaci贸n de las bases de conocimiento seleccionadas son inconsistentes.',
+  retrievalSettings: 'Configuraci贸n de recuperaci贸n',
+  rerankSettings: 'Configuraci贸n de reclasificaci贸n',
+  weightedScore: {
+    title: 'Puntuaci贸n ponderada',
+    description: 'Al ajustar los pesos asignados, esta estrategia de reclasificaci贸n determina si se debe priorizar la coincidencia sem谩ntica o de palabras clave.',
+    semanticFirst: 'Sem谩ntica primero',
+    keywordFirst: 'Palabra clave primero',
+    customized: 'Personalizado',
+    semantic: 'Sem谩ntico',
+    keyword: 'Palabra clave',
+  },
+  nTo1RetrievalLegacy: 'La recuperaci贸n N-a-1 ser谩 oficialmente obsoleta a partir de septiembre. Se recomienda utilizar la 煤ltima recuperaci贸n de m煤ltiples rutas para obtener mejores resultados.',
+  nTo1RetrievalLegacyLink: 'M谩s informaci贸n',
+  nTo1RetrievalLegacyLinkText: 'La recuperaci贸n N-a-1 ser谩 oficialmente obsoleta en septiembre.',
+  defaultRetrievalTip: 'De forma predeterminada, se utiliza la recuperaci贸n de varias rutas. El conocimiento se recupera de m煤ltiples bases de conocimiento y luego se vuelve a clasificar.',
+  editExternalAPIConfirmWarningContent: {
+    front: 'Esta API de conocimiento externo est谩 vinculada a',
+    end: 'conocimiento externo, y esta modificaci贸n se aplicar谩 a todos ellos. 驴Est谩s seguro de que quieres guardar este cambio?',
+  },
+  editExternalAPIFormWarning: {
+    end: 'Conocimiento externo',
+    front: 'Esta API externa est谩 vinculada a',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      end: '?',
+      front: 'Borrar',
+    },
+    content: {
+      end: 'conocimiento externo. Al eliminar esta API, se invalidar谩n todos ellos. 驴Est谩s seguro de que quieres eliminar esta API?',
+      front: 'Esta API de conocimiento externo est谩 vinculada a',
+    },
+    noConnectionContent: '驴Est谩 seguro de eliminar esta API?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: 'Elegir una API de conocimiento externa',
+  },
+  connectDatasetIntro: {
+    content: {
+      link: 'M谩s informaci贸n sobre c贸mo crear una API externa',
+      front: 'Para conectarse a una base de conocimientos externa, primero debe crear una API externa. Por favor, lea atentamente y consulte',
+      end: '. A continuaci贸n, busque el ID de conocimiento correspondiente y rell茅nelo en el formulario de la izquierda. Si toda la informaci贸n es correcta, saltar谩 autom谩ticamente a la prueba de recuperaci贸n en la base de conocimientos despu茅s de hacer clic en el bot贸n conectar.',
+    },
+    learnMore: 'Aprende m谩s',
+    title: 'C贸mo conectarse a una base de conocimientos externa',
+  },
+  connectHelper: {
+    helper5: 'con cuidado antes de usar esta funci贸n.',
+    helper2: 'Solo se admite la funcionalidad de recuperaci贸n',
+    helper1: 'Con茅ctese a bases de conocimiento externas a trav茅s de la API y el ID de la base de conocimiento. Actualmente,',
+    helper3: '. Le recomendamos encarecidamente que',
+    helper4: 'Leer la documentaci贸n de ayuda',
+  },
+  externalKnowledgeForm: {
+    connect: 'Conectar',
+    cancel: 'Cancelar',
+  },
+  externalAPIForm: {
+    encrypted: {
+      front: 'Su token de API se cifrar谩 y almacenar谩 mediante',
+      end: 'Tecnolog铆a.',
+    },
+    cancel: 'Cancelar',
+    apiKey: 'Clave de API',
+    save: 'Salvar',
+    edit: 'Editar',
+    name: 'Nombre',
+    endpoint: 'Punto de conexi贸n de API',
+  },
+  externalTag: 'Externo',
+  externalKnowledgeDescriptionPlaceholder: 'Describa lo que hay en esta base de conocimientos (opcional)',
+  externalKnowledgeNamePlaceholder: 'Introduzca el nombre de la base de conocimientos',
+  noExternalKnowledge: 'Todav铆a no hay una API de conocimiento externo, haga clic aqu铆 para crear',
+  editExternalAPIFormTitle: 'Editar la API de conocimiento externo',
+  externalKnowledgeName: 'Nombre del conocimiento externo',
+  allExternalTip: 'Al usar solo conocimiento externo, el usuario puede elegir si desea habilitar el modelo Rerank. Si no se habilita, los fragmentos recuperados se ordenar谩n en funci贸n de las puntuaciones. Cuando las estrategias de recuperaci贸n de diferentes bases de conocimiento son inconsistentes, ser谩n inexactas.',
+  createExternalAPI: 'Adici贸n de una API de conocimiento externa',
+  externalKnowledgeId: 'ID de conocimiento externo',
+  connectDataset: 'Con茅ctese a una base de conocimientos externa',
+  createNewExternalAPI: 'Creaci贸n de una nueva API de conocimiento externo',
+  editExternalAPITooltipTitle: 'CONOCIMIENTO VINCULADO',
+  externalAPIPanelTitle: 'API de conocimiento externo',
+  externalKnowledgeDescription: 'Descripci贸n del conocimiento',
+  externalAPIPanelDescription: 'La API de conocimiento externo se utiliza para conectarse a una base de conocimiento fuera de Dify y recuperar conocimiento de esa base de conocimiento.',
+  externalAPI: 'API externa',
+  externalKnowledgeIdPlaceholder: 'Introduzca el ID de conocimiento',
+  learnHowToWriteGoodKnowledgeDescription: 'Aprende a escribir una buena descripci贸n del conocimiento',
+  externalAPIPanelDocumentation: 'M谩s informaci贸n sobre c贸mo crear una API de conocimiento externo',
+  mixtureInternalAndExternalTip: 'El modelo de Rerank es necesario para la mezcla de conocimiento interno y externo.',
+  chunkingMode: {
+    parentChild: 'Padre-hijo',
+    general: 'General',
+  },
+  parentMode: {
+    fullDoc: 'Documento completo',
+    paragraph: 'P谩rrafo',
+  },
+  batchAction: {
+    selected: 'Seleccionado',
+    enable: 'Habilitar',
+    disable: 'Inutilizar',
+    cancel: 'Cancelar',
+    archive: 'Archivo',
+    delete: 'Borrar',
+  },
+  enable: 'Habilitar',
+  documentsDisabled: '{{num}} Documentos desactivados - inactivos durante m谩s de 30 d铆as',
+  preprocessDocument: '{{num}} Documentos de preprocesamiento',
+  localDocs: 'Documentos locales',
+  allKnowledgeDescription: 'Seleccione esta opci贸n para mostrar todos los conocimientos de este espacio de trabajo. Solo el propietario del espacio de trabajo puede administrar todo el conocimiento.',
+  allKnowledge: 'Todo el conocimiento',
+  metadata: {
+    createMetadata: {
+      title: 'Nuevos Metadatos',
+      back: 'Atr谩s',
+      type: 'Escribe',
+      namePlaceholder: 'Agregar nombre de metadatos',
+      name: 'Nombre',
+    },
+    checkName: {
+      empty: 'El nombre de metadatos no puede estar vac铆o',
+      invalid: 'El nombre de los metadatos solo puede contener letras min煤sculas, n煤meros y guiones bajos, y debe comenzar con una letra min煤scula.',
+    },
+    batchEditMetadata: {
+      multipleValue: 'Valor M煤ltiple',
+      editMetadata: 'Editar Metadatos',
+      editDocumentsNum: 'Editando {{num}} documentos',
+      applyToAllSelectDocument: 'Aplicar a todos los documentos seleccionados',
+      applyToAllSelectDocumentTip: 'Cree autom谩ticamente todos los metadatos editados y nuevos anteriores para todos los documentos seleccionados, de lo contrario, la edici贸n de metadatos solo se aplicar谩 a los documentos que ya los tengan.',
+    },
+    selectMetadata: {
+      manageAction: 'Gestionar',
+      search: 'Buscar metadatos',
+      newAction: 'Nuevos Metadatos',
+    },
+    datasetMetadata: {
+      addMetaData: 'Agregar Metadatos',
+      values: '{{num}} Valores',
+      deleteContent: '驴Est谩s seguro de que quieres eliminar los metadatos "{{name}}"?',
+      rename: 'Renombrar',
+      deleteTitle: 'Confirme para eliminar',
+      namePlaceholder: 'Nombre de metadatos',
+      builtInDescription: 'Los metadatos integrados se extraen y generan autom谩ticamente. Deben estar habilitados antes de su uso y no se pueden editar.',
+      name: 'Nombre',
+      description: 'Puedes gestionar todos los metadatos en este conocimiento aqu铆. Las modificaciones se sincronizar谩n en todos los documentos.',
+    },
+    documentMetadata: {
+      technicalParameters: 'Par谩metros t茅cnicos',
+      startLabeling: 'Comenzar a etiquetar',
+      documentInformation: 'Informaci贸n del documento',
+      metadataToolTip: 'Los metadatos sirven como un filtro cr铆tico que mejora la precisi贸n y relevancia de la recuperaci贸n de informaci贸n. Puede modificar y agregar metadatos para este documento aqu铆.',
+    },
+    metadata: 'Metadatos',
+    chooseTime: 'Elige una hora...',
+    addMetadata: 'Agregar Metadatos',
+  },
+  embeddingModelNotAvailable: 'El modelo de embeddings no est谩 disponible.',
+}
+
+export default translation
diff --git a/i18n/es-ES/education.ts b/i18n/es-ES/education.ts
new file mode 100644
index 0000000..9382a2d
--- /dev/null
+++ b/i18n/es-ES/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    coupon: 'cup贸n exclusivo del 100%',
+    end: 'para el Plan Profesional de Dify.',
+    front: 'Ahora eres elegible para el estado de Educaci贸n Verificada. Por favor, introduce tu informaci贸n educativa a continuaci贸n para completar el proceso y recibir un',
+  },
+  form: {
+    schoolName: {
+      title: 'El nombre de tu escuela',
+      placeholder: 'Ingrese el nombre oficial y completo de su escuela',
+    },
+    schoolRole: {
+      option: {
+        student: 'Estudiante',
+        administrator: 'Administrador escolar',
+        teacher: 'Profesor',
+      },
+      title: 'Tu rol en la escuela',
+    },
+    terms: {
+      desc: {
+        termsOfService: 'T茅rminos de Servicio',
+        privacyPolicy: 'Pol铆tica de privacidad',
+        and: 'y',
+        front: 'Su informaci贸n y uso del estado de Educaci贸n Verificada est谩n sujetos a nuestra',
+        end: '. Al enviar:',
+      },
+      option: {
+        age: 'Confirmo que tengo al menos 18 a帽os',
+        inSchool: 'Confirmo que estoy inscrito o empleado en la instituci贸n indicada. Dify puede solicitar prueba de inscripci贸n/empleo. Si falseo mi elegibilidad, acepto pagar cualquier tarifa que se haya eximido inicialmente en funci贸n de mi estado educativo.',
+      },
+      title: 'T茅rminos y Acuerdos',
+    },
+  },
+  emailLabel: 'Tu correo electr贸nico actual',
+  submit: 'Enviar',
+  submitError: 'Error en el env铆o del formulario. Por favor, int茅ntelo de nuevo m谩s tarde.',
+  successTitle: 'Tienes la educaci贸n Dify verificada',
+  toVerified: 'Verifica la educaci贸n',
+  successContent: 'Hemos emitido un cup贸n de descuento del 100% para el plan Dify Professional en tu cuenta. El cup贸n es v谩lido por un a帽o, por favor util铆zalo dentro del per铆odo de validez.',
+  learn: 'Aprende c贸mo obtener la verificaci贸n de la educaci贸n',
+  rejectTitle: 'Su verificaci贸n educativa de Dify ha sido rechazada.',
+  currentSigned: 'ACTUALMENTE CONECTADO COMO',
+  rejectContent: 'Desafortunadamente, no eres elegible para el estado de Educaci贸n Verificada y, por lo tanto, no puedes recibir el exclusivo cup贸n del 100% para el Plan Profesional de Dify si utilizas esta direcci贸n de correo electr贸nico.',
+}
+
+export default translation
diff --git a/i18n/es-ES/explore.ts b/i18n/es-ES/explore.ts
new file mode 100644
index 0000000..204f8da
--- /dev/null
+++ b/i18n/es-ES/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: 'Explorar',
+  sidebar: {
+    discovery: 'Descubrimiento',
+    chat: 'Chat',
+    workspace: 'Espacio de trabajo',
+    action: {
+      pin: 'Anclar',
+      unpin: 'Desanclar',
+      rename: 'Renombrar',
+      delete: 'Eliminar',
+    },
+    delete: {
+      title: 'Eliminar aplicaci贸n',
+      content: '驴Est谩s seguro de que quieres eliminar esta aplicaci贸n?',
+    },
+  },
+  apps: {
+    title: 'Explorar aplicaciones de Dify',
+    description: 'Utiliza estas aplicaciones de plantilla al instante o personaliza tus propias aplicaciones basadas en las plantillas.',
+    allCategories: 'Recomendado',
+  },
+  appCard: {
+    addToWorkspace: 'Agregar al espacio de trabajo',
+    customize: 'Personalizar',
+  },
+  appCustomize: {
+    title: 'Crear aplicaci贸n a partir de {{name}}',
+    subTitle: 'Icono y nombre de la aplicaci贸n',
+    nameRequired: 'El nombre de la aplicaci贸n es obligatorio',
+  },
+  category: {
+    Assistant: 'Asistente',
+    Writing: 'Escritura',
+    Translate: 'Traducci贸n',
+    Programming: 'Programaci贸n',
+    HR: 'Recursos Humanos',
+    Agent: 'Agente',
+    Workflow: 'Flujo de trabajo',
+    Entertainment: 'Entretenimiento',
+  },
+}
+
+export default translation
diff --git a/i18n/es-ES/layout.ts b/i18n/es-ES/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/es-ES/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/es-ES/login.ts b/i18n/es-ES/login.ts
new file mode 100644
index 0000000..bb465ac
--- /dev/null
+++ b/i18n/es-ES/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: '隆Hola, vamos a empezar!馃憢',
+  welcome: 'Bienvenido a Dify, por favor inicia sesi贸n para continuar.',
+  email: 'Correo electr贸nico',
+  emailPlaceholder: 'Tu correo electr贸nico',
+  password: 'Contrase帽a',
+  passwordPlaceholder: 'Tu contrase帽a',
+  name: 'Nombre de usuario',
+  namePlaceholder: 'Tu nombre de usuario',
+  forget: '驴Olvidaste tu contrase帽a?',
+  signBtn: 'Iniciar sesi贸n',
+  sso: 'Continuar con SSO',
+  installBtn: 'Configurar',
+  setAdminAccount: 'Configurando una cuenta de administrador',
+  setAdminAccountDesc: 'Privilegios m谩ximos para la cuenta de administrador, que se puede utilizar para crear aplicaciones y administrar proveedores de LLM, etc.',
+  createAndSignIn: 'Crear e iniciar sesi贸n',
+  oneMoreStep: 'Un paso m谩s',
+  createSample: 'Con esta informaci贸n, crearemos una aplicaci贸n de muestra para ti',
+  invitationCode: 'C贸digo de invitaci贸n',
+  invitationCodePlaceholder: 'Tu c贸digo de invitaci贸n',
+  interfaceLanguage: 'Idioma de interfaz',
+  timezone: 'Zona horaria',
+  go: 'Ir a Dify',
+  sendUsMail: 'Env铆anos un correo electr贸nico con tu presentaci贸n y nosotros nos encargaremos de la solicitud de invitaci贸n.',
+  acceptPP: 'He le铆do y acepto la pol铆tica de privacidad',
+  reset: 'Por favor, ejecuta el siguiente comando para restablecer tu contrase帽a',
+  withGitHub: 'Continuar con GitHub',
+  withGoogle: 'Continuar con Google',
+  rightTitle: 'Desbloquea todo el potencial de LLM',
+  rightDesc: 'Construye de manera sencilla aplicaciones de IA visualmente cautivadoras, operables y mejorables.',
+  tos: 'T茅rminos de servicio',
+  pp: 'Pol铆tica de privacidad',
+  tosDesc: 'Al registrarte, aceptas nuestros',
+  goToInit: 'Si no has inicializado la cuenta, por favor ve a la p谩gina de inicializaci贸n',
+  dontHave: '驴No tienes?',
+  invalidInvitationCode: 'C贸digo de invitaci贸n inv谩lido',
+  accountAlreadyInited: 'La cuenta ya est谩 inicializada',
+  forgotPassword: '驴Olvidaste tu contrase帽a?',
+  resetLinkSent: 'Enlace de restablecimiento enviado',
+  sendResetLink: 'Enviar enlace de restablecimiento',
+  backToSignIn: 'Volver a iniciar sesi贸n',
+  forgotPasswordDesc: 'Por favor, ingresa tu direcci贸n de correo electr贸nico para restablecer tu contrase帽a. Te enviaremos un correo electr贸nico con instrucciones sobre c贸mo restablecer tu contrase帽a.',
+  checkEmailForResetLink: 'Por favor, revisa tu correo electr贸nico para encontrar un enlace para restablecer tu contrase帽a. Si no aparece en unos minutos, aseg煤rate de revisar tu carpeta de spam.',
+  passwordChanged: 'Inicia sesi贸n ahora',
+  changePassword: 'Cambiar contrase帽a',
+  changePasswordTip: 'Por favor, ingresa una nueva contrase帽a para tu cuenta',
+  invalidToken: 'Token inv谩lido o expirado',
+  confirmPassword: 'Confirmar contrase帽a',
+  confirmPasswordPlaceholder: 'Confirma tu nueva contrase帽a',
+  passwordChangedTip: 'Tu contrase帽a se ha cambiado correctamente',
+  error: {
+    emailEmpty: 'Se requiere una direcci贸n de correo electr贸nico',
+    emailInValid: 'Por favor, ingresa una direcci贸n de correo electr贸nico v谩lida',
+    nameEmpty: 'Se requiere un nombre',
+    passwordEmpty: 'Se requiere una contrase帽a',
+    passwordLengthInValid: 'La contrase帽a debe tener al menos 8 caracteres',
+    passwordInvalid: 'La contrase帽a debe contener letras y n煤meros, y tener una longitud mayor a 8',
+    registrationNotAllowed: 'Cuenta no encontrada. P贸ngase en contacto con el administrador del sistema para registrarse.',
+  },
+  license: {
+    tip: 'Antes de comenzar con Dify Community Edition, lee la',
+    link: 'Licencia de c贸digo abierto de GitHub',
+  },
+  join: 'Unirse',
+  joinTipStart: 'Te invita a unirte al equipo de',
+  joinTipEnd: 'en Dify',
+  invalid: 'El enlace ha expirado',
+  explore: 'Explorar Dify',
+  activatedTipStart: 'Te has unido al equipo de',
+  activatedTipEnd: '',
+  activated: 'Inicia sesi贸n ahora',
+  adminInitPassword: 'Contrase帽a de inicializaci贸n de administrador',
+  validate: 'Validar',
+  checkCode: {
+    verify: 'Verificar',
+    didNotReceiveCode: '驴No recibiste el c贸digo?',
+    verificationCodePlaceholder: 'Ingresa el c贸digo de 6 d铆gitos',
+    checkYourEmail: 'Revisa tu correo electr贸nico',
+    emptyCode: 'Se requiere c贸digo',
+    useAnotherMethod: 'Usar otro m茅todo',
+    resend: 'Reenviar',
+    tips: 'Enviamos un c贸digo de verificaci贸n a <strong>{{email}}</strong>',
+    verificationCode: 'C贸digo de verificaci贸n',
+    validTime: 'Ten en cuenta que el c贸digo es v谩lido durante 5 minutos',
+    invalidCode: 'C贸digo no v谩lido',
+  },
+  or: 'O',
+  back: 'Atr谩s',
+  continueWithCode: 'Continuar con el c贸digo',
+  usePassword: 'Usar contrase帽a',
+  changePasswordBtn: 'Establecer una contrase帽a',
+  withSSO: 'Continuar con SSO',
+  sendVerificationCode: 'Enviar c贸digo de verificaci贸n',
+  backToLogin: 'Volver al inicio de sesi贸n',
+  resetPassword: 'Restablecer contrase帽a',
+  enterYourName: 'Por favor, introduzca su nombre de usuario',
+  useVerificationCode: 'Usar c贸digo de verificaci贸n',
+  resetPasswordDesc: 'Escriba el correo electr贸nico que utiliz贸 para registrarse en Dify y le enviaremos un correo electr贸nico de restablecimiento de contrase帽a.',
+  noLoginMethod: 'M茅todo de autenticaci贸n no configurado',
+  setYourAccount: 'Configura tu cuenta',
+  noLoginMethodTip: 'P贸ngase en contacto con el administrador del sistema para agregar un m茅todo de autenticaci贸n.',
+  licenseInactive: 'Licencia inactiva',
+  licenseInactiveTip: 'La licencia de Dify Enterprise para su espacio de trabajo est谩 inactiva. P贸ngase en contacto con su administrador para seguir utilizando Dify.',
+  licenseExpired: 'Licencia caducada',
+  licenseLost: 'Licencia perdida',
+  licenseExpiredTip: 'La licencia de Dify Enterprise para su espacio de trabajo ha caducado. P贸ngase en contacto con su administrador para seguir utilizando Dify.',
+  licenseLostTip: 'No se pudo conectar el servidor de licencias de Dife. P贸ngase en contacto con su administrador para seguir utilizando Dify.',
+}
+
+export default translation
diff --git a/i18n/es-ES/plugin-tags.ts b/i18n/es-ES/plugin-tags.ts
new file mode 100644
index 0000000..e91684d
--- /dev/null
+++ b/i18n/es-ES/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    image: 'Imagen',
+    agent: 'Agente',
+    medical: 'M茅dico',
+    weather: 'Tiempo',
+    design: 'Dise帽o',
+    videos: 'V铆deos',
+    education: 'Educaci贸n',
+    finance: 'Finanzas',
+    entertainment: 'Diversi贸n',
+    social: 'Social',
+    travel: 'Viajar',
+    utilities: 'Utilidades',
+    search: 'Buscar',
+    news: 'Noticia',
+    business: 'Negocio',
+    other: 'Otro',
+    productivity: 'Productividad',
+  },
+  allTags: 'Todas las etiquetas',
+  searchTags: 'Etiquetas de b煤squeda',
+}
+
+export default translation
diff --git a/i18n/es-ES/plugin.ts b/i18n/es-ES/plugin.ts
new file mode 100644
index 0000000..3e62e18
--- /dev/null
+++ b/i18n/es-ES/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    bundles: 'Paquetes',
+    all: 'Todo',
+    extensions: 'Extensiones',
+    tools: 'Herramientas',
+    agents: 'Estrategias de los agentes',
+    models: 'Modelos',
+  },
+  categorySingle: {
+    bundle: 'Haz',
+    extension: 'Extensi贸n',
+    tool: 'Herramienta',
+    model: 'Modelo',
+    agent: 'Estrategia del agente',
+  },
+  list: {
+    source: {
+      marketplace: 'Instalar desde Marketplace',
+      github: 'Instalar desde GitHub',
+      local: 'Instalar desde el archivo de paquete local',
+    },
+    noInstalled: 'No hay plugins instalados',
+    notFound: 'No se han encontrado plugins',
+  },
+  source: {
+    marketplace: 'Mercado',
+    local: 'Archivo de paquete local',
+    github: 'GitHub (en ingl茅s)',
+  },
+  detailPanel: {
+    categoryTip: {
+      local: 'Plugin Local',
+      marketplace: 'Instalado desde Marketplace',
+      github: 'Instalado desde Github',
+      debugging: 'Complemento de depuraci贸n',
+    },
+    operation: {
+      viewDetail: 'Ver Detalle',
+      detail: 'Detalles',
+      checkUpdate: 'Comprobar actualizaci贸n',
+      install: 'Instalar',
+      remove: 'Eliminar',
+      info: 'Informaci贸n del plugin',
+      update: 'Actualizar',
+    },
+    toolSelector: {
+      toolLabel: 'Herramienta',
+      paramsTip1: 'Controla los par谩metros de inferencia de LLM.',
+      settings: 'CONFIGURACI脫N DEL USUARIO',
+      unsupportedContent2: 'Haga clic para cambiar de versi贸n.',
+      descriptionPlaceholder: 'Breve descripci贸n del prop贸sito de la herramienta, por ejemplo, obtener la temperatura para una ubicaci贸n espec铆fica.',
+      empty: 'Haga clic en el bot贸n \'+\' para agregar herramientas. Puede agregar varias herramientas.',
+      paramsTip2: 'Cuando \'Autom谩tico\' est谩 desactivado, se utiliza el valor predeterminado.',
+      uninstalledTitle: 'Herramienta no instalada',
+      descriptionLabel: 'Descripci贸n de la herramienta',
+      unsupportedContent: 'La versi贸n del plugin instalado no proporciona esta acci贸n.',
+      auto: 'Autom谩tico',
+      title: 'Agregar herramienta',
+      placeholder: 'Seleccione una herramienta...',
+      uninstalledContent: 'Este plugin se instala desde el repositorio local/GitHub. 脷selo despu茅s de la instalaci贸n.',
+      unsupportedTitle: 'Acci贸n no admitida',
+      params: 'CONFIGURACI脫N DE RAZONAMIENTO',
+      uninstalledLink: 'Administrar en Plugins',
+    },
+    endpointDeleteContent: '驴Te gustar铆a eliminar {{nombre}}?',
+    endpointDisableTip: 'Deshabilitar punto de conexi贸n',
+    endpointDeleteTip: 'Eliminar punto de conexi贸n',
+    strategyNum: '{{num}} {{estrategia}} INCLUIDO',
+    disabled: 'Deshabilitado',
+    serviceOk: 'Servicio OK',
+    endpointDisableContent: '驴Te gustar铆a desactivar {{name}}?',
+    switchVersion: 'Versi贸n del interruptor',
+    endpointsTip: 'Este complemento proporciona funcionalidades espec铆ficas a trav茅s de puntos finales, y puede configurar varios conjuntos de puntos finales para el espacio de trabajo actual.',
+    configureModel: 'Configurar modelo',
+    actionNum: '{{num}} {{acci贸n}} INCLUIDO',
+    configureTool: 'Herramienta de configuraci贸n',
+    endpointModalDesc: 'Una vez configurado, se pueden utilizar las funciones proporcionadas por el complemento a trav茅s de los puntos finales de la API.',
+    modelNum: '{{num}} MODELOS INCLUIDOS',
+    endpoints: 'Extremos',
+    endpointModalTitle: 'Punto de conexi贸n de configuraci贸n',
+    endpointsDocLink: 'Ver el documento',
+    endpointsEmpty: 'Haga clic en el bot贸n \'+\' para agregar un punto de conexi贸n',
+    configureApp: 'Configurar la aplicaci贸n',
+  },
+  debugInfo: {
+    title: 'Depuraci贸n',
+    viewDocs: 'Ver documentos',
+  },
+  privilege: {
+    everyone: 'Todos',
+    title: 'Preferencias del plugin',
+    whoCanDebug: '驴Qui茅n puede depurar plugins?',
+    admins: 'Administradores',
+    whoCanInstall: '驴Qui茅n puede instalar y administrar complementos?',
+    noone: 'Nadie',
+  },
+  pluginInfoModal: {
+    repository: 'Dep贸sito',
+    title: 'Informaci贸n del plugin',
+    packageName: 'Paquete',
+    release: 'Lanzamiento',
+  },
+  action: {
+    checkForUpdates: 'Buscar actualizaciones',
+    deleteContentLeft: '驴Le gustar铆a eliminar',
+    deleteContentRight: '驴Complemento?',
+    usedInApps: 'Este plugin se est谩 utilizando en las aplicaciones {{num}}.',
+    delete: 'Eliminar plugin',
+    pluginInfo: 'Informaci贸n del plugin',
+  },
+  installModal: {
+    labels: {
+      repository: 'Dep贸sito',
+      version: 'Versi贸n',
+      package: 'Paquete',
+    },
+    installPlugin: 'Instalar plugin',
+    close: 'Cerrar',
+    uploadingPackage: 'Subiendo {{packageName}}...',
+    installComplete: 'Instalaci贸n completa',
+    installFailed: 'Error de instalaci贸n',
+    fromTrustSource: 'Por favor, aseg煤rate de que s贸lo instalas plugins de una <trustSource>fuente de confianza</trustSource>.',
+    installedSuccessfullyDesc: 'El plugin se ha instalado correctamente.',
+    back: 'Atr谩s',
+    installFailedDesc: 'El plugin ha fallado en la instalaci贸n.',
+    installing: 'Instalar...',
+    next: 'Pr贸ximo',
+    readyToInstallPackages: 'A punto de instalar los siguientes plugins {{num}}',
+    cancel: 'Cancelar',
+    uploadFailed: 'Error de carga',
+    install: 'Instalar',
+    pluginLoadError: 'Error de carga del plugin',
+    pluginLoadErrorDesc: 'Este plugin no se instalar谩',
+    readyToInstall: 'A punto de instalar el siguiente plugin',
+    dropPluginToInstall: 'Suelte el paquete del complemento aqu铆 para instalarlo',
+    readyToInstallPackage: 'A punto de instalar el siguiente plugin',
+    installedSuccessfully: 'Instalaci贸n exitosa',
+  },
+  installFromGitHub: {
+    uploadFailed: 'Error de carga',
+    updatePlugin: 'Actualizar plugin desde GitHub',
+    selectPackagePlaceholder: 'Por favor, seleccione un paquete',
+    installedSuccessfully: 'Instalaci贸n exitosa',
+    installNote: 'Por favor, aseg煤rate de que s贸lo instalas plugins de una fuente de confianza.',
+    gitHubRepo: 'Repositorio de GitHub',
+    selectPackage: 'Seleccionar paquete',
+    selectVersion: 'Seleccionar versi贸n',
+    selectVersionPlaceholder: 'Por favor, seleccione una versi贸n',
+    installPlugin: 'Instalar plugin desde GitHub',
+    installFailed: 'Error de instalaci贸n',
+  },
+  upgrade: {
+    upgrading: 'Instalar...',
+    close: 'Cerrar',
+    description: 'A punto de instalar el siguiente plugin',
+    upgrade: 'Instalar',
+    title: 'Instalar plugin',
+    successfulTitle: 'Instalaci贸n correcta',
+    usedInApps: 'Usado en aplicaciones {{num}}',
+  },
+  error: {
+    fetchReleasesError: 'No se pueden recuperar las versiones. Por favor, int茅ntelo de nuevo m谩s tarde.',
+    noReleasesFound: 'No se han encontrado versiones. Compruebe el repositorio de GitHub o la URL de entrada.',
+    inValidGitHubUrl: 'URL de GitHub no v谩lida. Introduzca una URL v谩lida en el formato: https://github.com/owner/repo',
+  },
+  marketplace: {
+    sortOption: {
+      recentlyUpdated: 'Actualizado recientemente',
+      newlyReleased: 'Reci茅n estrenado',
+      firstReleased: 'Lanzado por primera vez',
+      mostPopular: 'Lo m谩s popular',
+    },
+    empower: 'Potencie su desarrollo de IA',
+    moreFrom: 'M谩s de Marketplace',
+    viewMore: 'Ver m谩s',
+    sortBy: 'Ciudad negra',
+    noPluginFound: 'No se ha encontrado ning煤n plugin',
+    pluginsResult: '{{num}} resultados',
+    discover: 'Descubrir',
+    and: 'y',
+    difyMarketplace: 'Mercado de Dify',
+    verifiedTip: 'Verificado por Dify',
+    partnerTip: 'Verificado por un socio de Dify',
+  },
+  task: {
+    installing: 'Instalando plugins {{installingLength}}, 0 hecho.',
+    clearAll: 'Borrar todo',
+    installingWithSuccess: 'Instalando plugins {{installingLength}}, {{successLength}} 茅xito.',
+    installedError: 'Los complementos {{errorLength}} no se pudieron instalar',
+    installError: 'Los complementos {{errorLength}} no se pudieron instalar, haga clic para ver',
+    installingWithError: 'Instalando plugins {{installingLength}}, {{successLength}} 茅xito, {{errorLength}} fallido',
+  },
+  fromMarketplace: 'De Marketplace',
+  endpointsEnabled: '{{num}} conjuntos de puntos finales habilitados',
+  from: 'De',
+  submitPlugin: 'Enviar plugin',
+  installAction: 'Instalar',
+  install: '{{num}} instalaciones',
+  allCategories: 'Todas las categor铆as',
+  searchCategories: 'Categor铆as de b煤squeda',
+  installFrom: 'INSTALAR DESDE',
+  search: 'Buscar',
+  searchInMarketplace: 'Buscar en Marketplace',
+  searchTools: 'Herramientas de b煤squeda...',
+  findMoreInMarketplace: 'M谩s informaci贸n en Marketplace',
+  installPlugin: 'Instalar plugin',
+  searchPlugins: 'Plugins de b煤squeda',
+  metadata: {
+    title: 'Complementos',
+  },
+  difyVersionNotCompatible: 'La versi贸n actual de Dify no es compatible con este plugin, por favor actualiza a la versi贸n m铆nima requerida: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/es-ES/register.ts b/i18n/es-ES/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/es-ES/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/es-ES/run-log.ts b/i18n/es-ES/run-log.ts
new file mode 100644
index 0000000..422c164
--- /dev/null
+++ b/i18n/es-ES/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: 'ENTRADA',
+  result: 'RESULTADO',
+  detail: 'DETALLE',
+  tracing: 'TRAZADO',
+  resultPanel: {
+    status: 'ESTADO',
+    time: 'TIEMPO TRANSCURRIDO',
+    tokens: 'TOTAL DE TOKENS',
+  },
+  meta: {
+    title: 'METADATOS',
+    status: 'Estado',
+    version: 'Versi贸n',
+    executor: 'Ejecutor',
+    startTime: 'Hora de inicio',
+    time: 'Tiempo transcurrido',
+    tokens: 'Total de tokens',
+    steps: 'Pasos de ejecuci贸n',
+  },
+  resultEmpty: {
+    title: 'Esta ejecuci贸n solo produce formato JSON,',
+    tipLeft: 'por favor ve al ',
+    link: 'panel de detalle',
+    tipRight: ' para verlo.',
+  },
+  actionLogs: 'Registros de acciones',
+  circularInvocationTip: 'Hay una invocaci贸n circular de herramientas/nodos en el flujo de trabajo actual.',
+}
+
+export default translation
diff --git a/i18n/es-ES/share-app.ts b/i18n/es-ES/share-app.ts
new file mode 100644
index 0000000..41aa35c
--- /dev/null
+++ b/i18n/es-ES/share-app.ts
@@ -0,0 +1,82 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: 'La aplicaci贸n no est谩 disponible',
+    appUnknownError: 'La aplicaci贸n no est谩 disponible',
+  },
+  chat: {
+    newChat: 'Nuevo chat',
+    pinnedTitle: 'Fijados',
+    unpinnedTitle: 'Chats',
+    newChatDefaultName: 'Nueva conversaci贸n',
+    resetChat: 'Reiniciar conversaci贸n',
+    poweredBy: 'Desarrollado por',
+    prompt: 'Indicaci贸n',
+    privatePromptConfigTitle: 'Configuraci贸n de la conversaci贸n',
+    publicPromptConfigTitle: 'Indicaci贸n inicial',
+    configStatusDes: 'Antes de comenzar, puedes modificar la configuraci贸n de la conversaci贸n',
+    configDisabled:
+      'Se han utilizado las configuraciones de la sesi贸n anterior para esta sesi贸n.',
+    startChat: 'Iniciar chat',
+    privacyPolicyLeft:
+      'Por favor, lee la ',
+    privacyPolicyMiddle:
+      'pol铆tica de privacidad',
+    privacyPolicyRight:
+      ' proporcionada por el desarrollador de la aplicaci贸n.',
+    deleteConversation: {
+      title: 'Eliminar conversaci贸n',
+      content: '驴Est谩s seguro/a de que quieres eliminar esta conversaci贸n?',
+    },
+    tryToSolve: 'Intentar resolver',
+    temporarySystemIssue: 'Lo sentimos, hay un problema temporal del sistema.',
+    expand: 'Ampliar',
+    collapse: 'Contraer',
+    viewChatSettings: 'Ver configuraciones de chat',
+    newChatTip: 'Ya en un nuevo chat',
+    chatFormTip: 'No se pueden modificar los ajustes del chat despu茅s de que el chat ha comenzado.',
+    chatSettingsTitle: 'Nueva configuraci贸n de chat',
+  },
+  generation: {
+    tabs: {
+      create: 'Ejecutar una vez',
+      batch: 'Ejecutar en lote',
+      saved: 'Guardado',
+    },
+    savedNoData: {
+      title: '隆A煤n no has guardado ning煤n resultado!',
+      description: 'Comienza a generar contenido y encuentra tus resultados guardados aqu铆.',
+      startCreateContent: 'Comenzar a crear contenido',
+    },
+    title: 'Completado por IA',
+    queryTitle: 'Contenido de la consulta',
+    completionResult: 'Resultado del completado',
+    queryPlaceholder: 'Escribe tu contenido de consulta...',
+    run: 'Ejecutar',
+    copy: 'Copiar',
+    resultTitle: 'Completado por IA',
+    noData: 'La IA te dar谩 lo que deseas aqu铆.',
+    csvUploadTitle: 'Arrastra y suelta tu archivo CSV aqu铆, o ',
+    browse: 'navega',
+    csvStructureTitle: 'El archivo CSV debe cumplir con la siguiente estructura:',
+    downloadTemplate: 'Descarga la plantilla aqu铆',
+    field: 'Campo',
+    batchFailed: {
+      info: '{{num}} ejecuciones fallidas',
+      retry: 'Reintentar',
+      outputPlaceholder: 'Sin contenido de salida',
+    },
+    errorMsg: {
+      empty: 'Por favor, ingresa contenido en el archivo cargado.',
+      fileStructNotMatch: 'El archivo CSV cargado no coincide con la estructura.',
+      emptyLine: 'La fila {{rowIndex}} est谩 vac铆a',
+      invalidLine: 'Fila {{rowIndex}}: el valor de {{varName}} no puede estar vac铆o',
+      moreThanMaxLengthLine: 'Fila {{rowIndex}}: el valor de {{varName}} no puede tener m谩s de {{maxLength}} caracteres',
+      atLeastOne: 'Por favor, ingresa al menos una fila en el archivo cargado.',
+    },
+    execution: 'EJECUCI脫N',
+    executions: '{{num}} EJECUCIONES',
+  },
+}
+
+export default translation
diff --git a/i18n/es-ES/time.ts b/i18n/es-ES/time.ts
new file mode 100644
index 0000000..920c80e
--- /dev/null
+++ b/i18n/es-ES/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Sun: 'Sol',
+    Thu: 'Jue',
+    Tue: 'Mar',
+    Sat: 'S谩b',
+    Mon: 'Mon',
+    Fri: 'Viernes',
+    Wed: 'Mi茅rcoles',
+  },
+  months: {
+    August: 'Agosto',
+    September: 'Septiembre',
+    April: 'Abril',
+    February: 'Febrero',
+    January: 'Enero',
+    November: 'Noviembre',
+    October: 'octubre',
+    May: 'Mayo',
+    June: 'Junio',
+    December: 'Diciembre',
+    July: 'Julio',
+    March: 'Marzo',
+  },
+  operation: {
+    ok: 'De acuerdo',
+    pickDate: 'Seleccionar fecha',
+    cancel: 'Cancelar',
+    now: 'Ahora',
+  },
+  title: {
+    pickTime: 'Elegir hora',
+  },
+  defaultPlaceholder: 'Elige una hora...',
+}
+
+export default translation
diff --git a/i18n/es-ES/tools.ts b/i18n/es-ES/tools.ts
new file mode 100644
index 0000000..91bce67
--- /dev/null
+++ b/i18n/es-ES/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: 'Herramientas',
+  createCustomTool: 'Crear Herramienta Personalizada',
+  customToolTip: 'Aprende m谩s sobre las herramientas personalizadas de Dify',
+  type: {
+    all: 'Todas',
+    builtIn: 'Incorporadas',
+    custom: 'Personalizadas',
+    workflow: 'Flujo de Trabajo',
+  },
+  contribute: {
+    line1: 'Estoy interesado en ',
+    line2: 'contribuir herramientas a Dify.',
+    viewGuide: 'Ver la gu铆a',
+  },
+  author: 'Por',
+  auth: {
+    unauthorized: 'Para Autorizar',
+    authorized: 'Autorizado',
+    setup: 'Configurar la autorizaci贸n para usar',
+    setupModalTitle: 'Configurar Autorizaci贸n',
+    setupModalTitleDescription: 'Despu茅s de configurar las credenciales, todos los miembros dentro del espacio de trabajo pueden usar esta herramienta al orquestar aplicaciones.',
+  },
+  includeToolNum: '{{num}} herramientas incluidas',
+  addTool: 'Agregar Herramienta',
+  addToolModal: {
+    type: 'tipo',
+    category: 'categor铆a',
+    add: 'agregar',
+    added: 'agregada',
+    manageInTools: 'Administrar en Herramientas',
+    emptyTitle: 'No hay herramientas de flujo de trabajo disponibles',
+    emptyTip: 'Ir a "Flujo de Trabajo -> Publicar como Herramienta"',
+    emptyTitleCustom: 'No hay herramienta personalizada disponible',
+    emptyTipCustom: 'Crear una herramienta personalizada',
+  },
+  createTool: {
+    title: 'Crear Herramienta Personalizada',
+    editAction: 'Configurar',
+    editTitle: 'Editar Herramienta Personalizada',
+    name: 'Nombre',
+    toolNamePlaceHolder: 'Ingresa el nombre de la herramienta',
+    nameForToolCall: 'Nombre de llamada de la herramienta',
+    nameForToolCallPlaceHolder: 'Utilizado para el reconocimiento autom谩tico, como getCurrentWeather, list_pets',
+    nameForToolCallTip: 'Solo soporta n煤meros, letras y guiones bajos.',
+    description: 'Descripci贸n',
+    descriptionPlaceholder: 'Breve descripci贸n del prop贸sito de la herramienta, por ejemplo, obtener la temperatura de una ubicaci贸n espec铆fica.',
+    schema: 'Esquema',
+    schemaPlaceHolder: 'Ingresa tu esquema OpenAPI aqu铆',
+    viewSchemaSpec: 'Ver la Especificaci贸n OpenAPI-Swagger',
+    importFromUrl: 'Importar desde URL',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: 'Por favor, ingresa una URL v谩lida',
+    examples: 'Ejemplos',
+    exampleOptions: {
+      json: 'Clima (JSON)',
+      yaml: 'Tienda de Mascotas (YAML)',
+      blankTemplate: 'Plantilla en Blanco',
+    },
+    availableTools: {
+      title: 'Herramientas Disponibles',
+      name: 'Nombre',
+      description: 'Descripci贸n',
+      method: 'M茅todo',
+      path: 'Ruta',
+      action: 'Acciones',
+      test: 'Probar',
+    },
+    authMethod: {
+      title: 'M茅todo de Autorizaci贸n',
+      type: 'Tipo de Autorizaci贸n',
+      keyTooltip: 'Clave del encabezado HTTP, puedes dejarla como "Authorization" si no tienes idea de qu茅 es o configurarla con un valor personalizado',
+      types: {
+        none: 'Ninguno',
+        api_key: 'Clave API',
+        apiKeyPlaceholder: 'Nombre del encabezado HTTP para la Clave API',
+        apiValuePlaceholder: 'Ingresa la Clave API',
+      },
+      key: 'Clave',
+      value: 'Valor',
+    },
+    authHeaderPrefix: {
+      title: 'Tipo de Autenticaci贸n',
+      types: {
+        basic: 'B谩sica',
+        bearer: 'Bearer',
+        custom: 'Personalizada',
+      },
+    },
+    privacyPolicy: 'Pol铆tica de Privacidad',
+    privacyPolicyPlaceholder: 'Por favor, ingresa la pol铆tica de privacidad',
+    toolInput: {
+      title: 'Entrada de la Herramienta',
+      name: 'Nombre',
+      required: 'Requerido',
+      method: 'M茅todo',
+      methodSetting: 'Configuraci贸n',
+      methodSettingTip: 'El usuario completa la configuraci贸n de la herramienta',
+      methodParameter: 'Par谩metro',
+      methodParameterTip: 'LLM completa durante la inferencia',
+      label: 'Etiquetas',
+      labelPlaceholder: 'Elige etiquetas (opcional)',
+      description: 'Descripci贸n',
+      descriptionPlaceholder: 'Descripci贸n del significado del par谩metro',
+    },
+    customDisclaimer: 'Descargo de responsabilidad personalizado',
+    customDisclaimerPlaceholder: 'Por favor, ingresa el descargo de responsabilidad personalizado',
+    confirmTitle: '驴Confirmar para guardar?',
+    confirmTip: 'Las aplicaciones que usen esta herramienta se ver谩n afectadas',
+    deleteToolConfirmTitle: '驴Eliminar esta Herramienta?',
+    deleteToolConfirmContent: 'Eliminar la herramienta es irreversible. Los usuarios ya no podr谩n acceder a tu herramienta.',
+  },
+  test: {
+    title: 'Probar',
+    parametersValue: 'Par谩metros y Valor',
+    parameters: 'Par谩metros',
+    value: 'Valor',
+    testResult: 'Resultados de la Prueba',
+    testResultPlaceholder: 'El resultado de la prueba se mostrar谩 aqu铆',
+  },
+  thought: {
+    using: 'Usando',
+    used: 'Usado',
+    requestTitle: 'Solicitud a',
+    responseTitle: 'Respuesta de',
+  },
+  setBuiltInTools: {
+    info: 'Informaci贸n',
+    setting: 'Ajuste',
+    toolDescription: 'Descripci贸n de la herramienta',
+    parameters: 'par谩metros',
+    string: 'cadena',
+    number: 'n煤mero',
+    required: 'Requerido',
+    infoAndSetting: 'Informaci贸n y Ajustes',
+    file: 'archivo',
+  },
+  noCustomTool: {
+    title: '隆Sin herramientas personalizadas!',
+    content: 'Agrega y administra tus herramientas personalizadas aqu铆 para construir aplicaciones de inteligencia artificial.',
+    createTool: 'Crear Herramienta',
+  },
+  noSearchRes: {
+    title: '隆Lo sentimos, no hay resultados!',
+    content: 'No encontramos herramientas que coincidan con tu b煤squeda.',
+    reset: 'Restablecer B煤squeda',
+  },
+  builtInPromptTitle: 'Aviso',
+  toolRemoved: 'Herramienta eliminada',
+  notAuthorized: 'Herramienta no autorizada',
+  howToGet: 'C贸mo obtener',
+  openInStudio: 'Abrir en Studio',
+  toolNameUsageTip: 'Nombre de llamada de la herramienta para razonamiento y promoci贸n de agentes',
+  copyToolName: 'Nombre de la copia',
+  noTools: 'No se han encontrado herramientas',
+}
+
+export default translation
diff --git a/i18n/es-ES/workflow.ts b/i18n/es-ES/workflow.ts
new file mode 100644
index 0000000..5a2d02b
--- /dev/null
+++ b/i18n/es-ES/workflow.ts
@@ -0,0 +1,919 @@
+const translation = {
+  common: {
+    undo: 'Deshacer',
+    redo: 'Rehacer',
+    editing: 'Editando',
+    autoSaved: 'Guardado autom谩tico',
+    unpublished: 'No publicado',
+    published: 'Publicado',
+    publish: 'Publicar',
+    update: 'Actualizar',
+    run: 'Ejecutar',
+    running: 'Ejecutando',
+    inRunMode: 'En modo de ejecuci贸n',
+    inPreview: 'En vista previa',
+    inPreviewMode: 'En modo de vista previa',
+    preview: 'Vista previa',
+    viewRunHistory: 'Ver historial de ejecuci贸n',
+    runHistory: 'Historial de ejecuci贸n',
+    goBackToEdit: 'Volver al editor',
+    conversationLog: 'Registro de conversaci贸n',
+    features: 'Funcionalidades',
+    debugAndPreview: 'Vista previa',
+    restart: 'Reiniciar',
+    currentDraft: 'Borrador actual',
+    currentDraftUnpublished: 'Borrador actual no publicado',
+    latestPublished: '脷ltimo publicado',
+    publishedAt: 'Publicado el',
+    restore: 'Restaurar',
+    runApp: 'Ejecutar aplicaci贸n',
+    batchRunApp: 'Ejecutar aplicaci贸n en lote',
+    accessAPIReference: 'Acceder a la referencia de la API',
+    embedIntoSite: 'Insertar en el sitio',
+    addTitle: 'Agregar t铆tulo...',
+    addDescription: 'Agregar descripci贸n...',
+    noVar: 'Sin variable',
+    searchVar: 'Buscar variable',
+    variableNamePlaceholder: 'Nombre de la variable',
+    setVarValuePlaceholder: 'Establecer variable',
+    needConnectTip: 'Este paso no est谩 conectado a nada',
+    maxTreeDepth: 'L铆mite m谩ximo de {{depth}} nodos por rama',
+    needEndNode: 'Debe agregarse el bloque de Fin',
+    needAnswerNode: 'Debe agregarse el bloque de Respuesta',
+    workflowProcess: 'Proceso de flujo de trabajo',
+    notRunning: 'A煤n no se est谩 ejecutando',
+    previewPlaceholder: 'Ingrese contenido en el cuadro de abajo para comenzar a depurar el Chatbot',
+    effectVarConfirm: {
+      title: 'Eliminar variable',
+      content: 'La variable se utiliza en otros nodos. 驴A煤n quieres eliminarla?',
+    },
+    insertVarTip: 'Presiona la tecla \'/\' para insertar r谩pidamente',
+    processData: 'Procesar datos',
+    input: 'Entrada',
+    output: 'Salida',
+    jinjaEditorPlaceholder: 'Escribe \'/\' o \'{\' para insertar una variable',
+    viewOnly: 'Solo vista',
+    showRunHistory: 'Mostrar historial de ejecuci贸n',
+    enableJinja: 'Habilitar soporte de plantillas Jinja',
+    learnMore: 'M谩s informaci贸n',
+    copy: 'Copiar',
+    duplicate: 'Duplicar',
+    addBlock: 'Agregar bloque',
+    pasteHere: 'Pegar aqu铆',
+    pointerMode: 'Modo puntero',
+    handMode: 'Modo mano',
+    model: 'Modelo',
+    workflowAsTool: 'Flujo de trabajo como herramienta',
+    configureRequired: 'Configuraci贸n requerida',
+    configure: 'Configurar',
+    manageInTools: 'Administrar en Herramientas',
+    workflowAsToolTip: 'Se requiere la reconfiguraci贸n de la herramienta despu茅s de la actualizaci贸n del flujo de trabajo.',
+    viewDetailInTracingPanel: 'Ver detalles',
+    syncingData: 'Sincronizando datos, solo unos segundos.',
+    importDSL: 'Importar DSL',
+    importDSLTip: 'El borrador actual se sobrescribir谩. Exporta el flujo de trabajo como respaldo antes de importar.',
+    backupCurrentDraft: 'Respaldar borrador actual',
+    chooseDSL: 'Elegir archivo DSL (yml)',
+    overwriteAndImport: 'Sobrescribir e importar',
+    importFailure: 'Error al importar',
+    importSuccess: 'Importaci贸n exitosa',
+    parallelTip: {
+      click: {
+        title: 'Clic',
+        desc: 'Para agregar',
+      },
+      drag: {
+        title: 'Arrastrar',
+        desc: 'Para conectarse',
+      },
+      limit: 'El paralelismo se limita a {{num}} ramas.',
+      depthLimit: 'L铆mite de capa de anidamiento paralelo de capas {{num}}',
+    },
+    parallelRun: 'Ejecuci贸n paralela',
+    disconnect: 'Desconectar',
+    jumpToNode: 'Saltar a este nodo',
+    addParallelNode: 'Agregar nodo paralelo',
+    parallel: 'PARALELO',
+    branch: 'RAMA',
+    fileUploadTip: 'Las funciones de carga de im谩genes se han actualizado a la carga de archivos.',
+    ImageUploadLegacyTip: 'Ahora puede crear variables de tipo de archivo en el formulario de inicio. Ya no admitiremos la funci贸n de carga de im谩genes en el futuro.',
+    featuresDescription: 'Mejorar la experiencia del usuario de la aplicaci贸n web',
+    featuresDocLink: 'Aprende m谩s',
+    importWarning: 'Cautela',
+    importWarningDetails: 'La diferencia de versi贸n de DSL puede afectar a ciertas caracter铆sticas',
+    openInExplore: 'Abrir en Explorar',
+    onFailure: 'Sobre el fracaso',
+    addFailureBranch: 'Agregar rama de error',
+    noHistory: 'Sin historia',
+    loadMore: 'Cargar m谩s flujos de trabajo',
+    versionHistory: 'Historial de versiones',
+    exportSVG: 'Exportar como SVG',
+    exitVersions: 'Versiones de salida',
+    exportJPEG: 'Exportar como JPEG',
+    exportPNG: 'Exportar como PNG',
+    referenceVar: 'Variable de referencia',
+    publishUpdate: 'Publicar actualizaci贸n',
+    noExist: 'No existe tal variable',
+    exportImage: 'Exportar imagen',
+  },
+  env: {
+    envPanelTitle: 'Variables de Entorno',
+    envDescription: 'Las variables de entorno se pueden utilizar para almacenar informaci贸n privada y credenciales. Son de solo lectura y se pueden separar del archivo DSL durante la exportaci贸n.',
+    envPanelButton: 'A帽adir Variable',
+    modal: {
+      title: 'A帽adir Variable de Entorno',
+      editTitle: 'Editar Variable de Entorno',
+      type: 'Tipo',
+      name: 'Nombre',
+      namePlaceholder: 'nombre de env',
+      value: 'Valor',
+      valuePlaceholder: 'valor de env',
+      secretTip: 'Se utiliza para definir informaci贸n o datos sensibles, con configuraciones DSL configuradas para prevenir fugas.',
+    },
+    export: {
+      title: '驴Exportar variables de entorno secretas?',
+      checkbox: 'Exportar valores secretos',
+      ignore: 'Exportar DSL',
+      export: 'Exportar DSL con valores secretos',
+    },
+  },
+  chatVariable: {
+    panelTitle: 'Variables de Conversaci贸n',
+    panelDescription: 'Las Variables de Conversaci贸n se utilizan para almacenar informaci贸n interactiva que el LLM necesita recordar, incluyendo el historial de conversaci贸n, archivos subidos y preferencias del usuario. Son de lectura y escritura.',
+    docLink: 'Visite nuestra documentaci贸n para m谩s informaci贸n.',
+    button: 'A帽adir Variable',
+    modal: {
+      title: 'A帽adir Variable de Conversaci贸n',
+      editTitle: 'Editar Variable de Conversaci贸n',
+      name: 'Nombre',
+      namePlaceholder: 'Nombre de la variable',
+      type: 'Tipo',
+      value: 'Valor Predeterminado',
+      valuePlaceholder: 'Valor predeterminado, dejar en blanco para no establecer',
+      description: 'Descripci贸n',
+      descriptionPlaceholder: 'Describa la variable',
+      editInJSON: 'Editar en JSON',
+      oneByOne: 'A帽adir uno por uno',
+      editInForm: 'Editar en Formulario',
+      arrayValue: 'Valor',
+      addArrayValue: 'A帽adir Valor',
+      objectKey: 'Clave',
+      objectType: 'Tipo',
+      objectValue: 'Valor Predeterminado',
+    },
+    storedContent: 'Contenido almacenado',
+    updatedAt: 'Actualizado el ',
+  },
+  changeHistory: {
+    title: 'Historial de cambios',
+    placeholder: 'A煤n no has realizado cambios',
+    clearHistory: 'Borrar historial',
+    hint: 'Sugerencia',
+    hintText: 'Tus acciones de edici贸n se registran en un historial de cambios, que se almacena en tu dispositivo durante esta sesi贸n. Este historial se borrar谩 cuando salgas del editor.',
+    stepBackward_one: '{{count}} paso hacia atr谩s',
+    stepBackward_other: '{{count}} pasos hacia atr谩s',
+    stepForward_one: '{{count}} paso hacia adelante',
+    stepForward_other: '{{count}} pasos hacia adelante',
+    sessionStart: 'Inicio de sesi贸n',
+    currentState: 'Estado actual',
+    nodeTitleChange: 'Se cambi贸 el t铆tulo del bloque',
+    nodeDescriptionChange: 'Se cambi贸 la descripci贸n del bloque',
+    nodeDragStop: 'Bloque movido',
+    nodeChange: 'Bloque cambiado',
+    nodeConnect: 'Bloque conectado',
+    nodePaste: 'Bloque pegado',
+    nodeDelete: 'Bloque eliminado',
+    nodeAdd: 'Bloque agregado',
+    nodeResize: 'Bloque redimensionado',
+    noteAdd: 'Nota agregada',
+    noteChange: 'Nota cambiada',
+    noteDelete: 'Nota eliminada',
+    edgeDelete: 'Bloque desconectado',
+  },
+  errorMsg: {
+    fieldRequired: 'Se requiere {{field}}',
+    authRequired: 'Se requiere autorizaci贸n',
+    invalidJson: '{{field}} no es un JSON v谩lido',
+    fields: {
+      variable: 'Nombre de la variable',
+      variableValue: 'Valor de la variable',
+      code: 'C贸digo',
+      model: 'Modelo',
+      rerankModel: 'Modelo de reordenamiento',
+      visionVariable: 'Variable de visi贸n',
+    },
+    invalidVariable: 'Variable no v谩lida',
+    rerankModelRequired: 'Antes de activar el modelo de reclasificaci贸n, confirme que el modelo se ha configurado correctamente en la configuraci贸n.',
+    toolParameterRequired: '{{campo}}: el par谩metro [{{param}}] es obligatorio',
+    noValidTool: '{{campo}} no se ha seleccionado ninguna herramienta v谩lida',
+  },
+  singleRun: {
+    testRun: 'Ejecuci贸n de prueba',
+    startRun: 'Iniciar ejecuci贸n',
+    running: 'Ejecutando',
+    testRunIteration: 'Iteraci贸n de ejecuci贸n de prueba',
+    back: 'Atr谩s',
+    iteration: 'Iteraci贸n',
+    loop: 'Bucle',
+  },
+  tabs: {
+    'searchBlock': 'Buscar bloque',
+    'blocks': 'Bloques',
+    'tools': 'Herramientas',
+    'allTool': 'Todos',
+    'builtInTool': 'Incorporadas',
+    'customTool': 'Personalizadas',
+    'workflowTool': 'Flujo de trabajo',
+    'question-understand': 'Entender pregunta',
+    'logic': 'L贸gica',
+    'transform': 'Transformar',
+    'utilities': 'Utilidades',
+    'noResult': 'No se encontraron coincidencias',
+    'searchTool': 'Herramienta de b煤squeda',
+    'agent': 'Estrategia del agente',
+    'plugin': 'Plugin',
+  },
+  blocks: {
+    'start': 'Inicio',
+    'end': 'Fin',
+    'answer': 'Respuesta',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'Recuperaci贸n de conocimiento',
+    'question-classifier': 'Clasificador de preguntas',
+    'if-else': 'SI/SINO',
+    'code': 'C贸digo',
+    'template-transform': 'Plantilla',
+    'http-request': 'Solicitud HTTP',
+    'variable-assigner': 'Asignador de variables',
+    'variable-aggregator': 'Agregador de variables',
+    'assigner': 'Asignador de Variables',
+    'iteration-start': 'Inicio de iteraci贸n',
+    'iteration': 'Iteraci贸n',
+    'parameter-extractor': 'Extractor de par谩metros',
+    'document-extractor': 'Extractor de documentos',
+    'list-operator': 'Operador de lista',
+    'agent': 'Agente',
+    'loop-end': 'Salir del bucle',
+    'loop': 'Bucle',
+    'loop-start': 'Inicio del bucle',
+  },
+  blocksAbout: {
+    'start': 'Define los par谩metros iniciales para iniciar un flujo de trabajo',
+    'end': 'Define el final y el tipo de resultado de un flujo de trabajo',
+    'answer': 'Define el contenido de respuesta de una conversaci贸n de chat',
+    'llm': 'Invoca modelos de lenguaje grandes para responder preguntas o procesar lenguaje natural',
+    'knowledge-retrieval': 'Te permite consultar contenido de texto relacionado con las preguntas de los usuarios desde el conocimiento',
+    'question-classifier': 'Define las condiciones de clasificaci贸n de las preguntas de los usuarios, LLM puede definir c贸mo progresa la conversaci贸n en funci贸n de la descripci贸n de clasificaci贸n',
+    'if-else': 'Te permite dividir el flujo de trabajo en dos ramas basadas en condiciones SI/SINO',
+    'code': 'Ejecuta un fragmento de c贸digo Python o NodeJS para implementar l贸gica personalizada',
+    'template-transform': 'Convierte datos en una cadena utilizando la sintaxis de plantillas Jinja',
+    'http-request': 'Permite enviar solicitudes al servidor a trav茅s del protocolo HTTP',
+    'variable-assigner': 'Agrega variables de m煤ltiples ramas en una sola variable para configurar de manera unificada los nodos descendentes.',
+    'assigner': 'El nodo de asignaci贸n de variables se utiliza para asignar valores a variables escribibles (como variables de conversaci贸n).',
+    'variable-aggregator': 'Agrega variables de m煤ltiples ramas en una sola variable para configurar de manera unificada los nodos descendentes.',
+    'iteration': 'Realiza m煤ltiples pasos en un objeto de lista hasta que se generen todos los resultados.',
+    'parameter-extractor': 'Utiliza LLM para extraer par谩metros estructurados del lenguaje natural para invocaciones de herramientas o solicitudes HTTP.',
+    'list-operator': 'Se utiliza para filtrar u ordenar el contenido de la matriz.',
+    'document-extractor': 'Se utiliza para analizar documentos cargados en contenido de texto que es f谩cilmente comprensible por LLM.',
+    'agent': 'Invocar modelos de lenguaje de gran tama帽o para responder preguntas o procesar el lenguaje natural',
+    'loop-end': 'Equivalente a "romper". Este nodo no tiene elementos de configuraci贸n. Cuando el cuerpo del bucle alcanza este nodo, el bucle termina.',
+    'loop': 'Ejecuta un bucle de l贸gica hasta que se cumpla la condici贸n de terminaci贸n o se alcance el conteo m谩ximo de bucles.',
+  },
+  operator: {
+    zoomIn: 'Acercar',
+    zoomOut: 'Alejar',
+    zoomTo50: 'Zoom al 50%',
+    zoomTo100: 'Zoom al 100%',
+    zoomToFit: 'Ajustar al tama帽o',
+  },
+  panel: {
+    userInputField: 'Campo de entrada del usuario',
+    changeBlock: 'Cambiar bloque',
+    helpLink: 'Enlace de ayuda',
+    about: 'Acerca de',
+    createdBy: 'Creado por ',
+    nextStep: 'Siguiente paso',
+    addNextStep: 'Agregar el siguiente bloque en este flujo de trabajo',
+    selectNextStep: 'Seleccionar siguiente bloque',
+    runThisStep: 'Ejecutar este paso',
+    checklist: 'Lista de verificaci贸n',
+    checklistTip: 'Aseg煤rate de resolver todos los problemas antes de publicar',
+    checklistResolved: 'Se resolvieron todos los problemas',
+    organizeBlocks: 'Organizar bloques',
+    change: 'Cambiar',
+    optional: '(opcional)',
+  },
+  nodes: {
+    common: {
+      outputVars: 'Variables de salida',
+      insertVarTip: 'Insertar variable',
+      memory: {
+        memory: 'Memoria',
+        memoryTip: 'Configuraci贸n de memoria de chat',
+        windowSize: 'Tama帽o de ventana',
+        conversationRoleName: 'Nombre del rol de conversaci贸n',
+        user: 'Prefijo de usuario',
+        assistant: 'Prefijo de asistente',
+      },
+      memories: {
+        title: 'Memorias',
+        tip: 'Memoria de chat',
+        builtIn: 'Incorporada',
+      },
+      errorHandle: {
+        none: {
+          title: 'Ninguno',
+          desc: 'El nodo dejar谩 de ejecutarse si se produce una excepci贸n y no se controla',
+        },
+        defaultValue: {
+          title: 'Valor predeterminado',
+          desc: 'Cuando se produzca un error, especifique un contenido de salida est谩tico.',
+          tip: 'En caso de error, devolver谩 un valor inferior.',
+          inLog: 'Excepci贸n de nodo, salida seg煤n los valores predeterminados.',
+          output: 'Valor predeterminado de salida',
+        },
+        failBranch: {
+          title: 'Rama de error',
+          desc: 'Cuando se produce un error, ejecutar谩 la rama de excepci贸n',
+          customize: 'Vaya al lienzo para personalizar la l贸gica de la rama de error.',
+          customizeTip: 'Cuando se activa la rama fail, las excepciones lanzadas por los nodos no finalizar谩n el proceso. En su lugar, ejecutar谩 autom谩ticamente la rama de error predefinida, lo que le permitir谩 proporcionar de forma flexible mensajes de error, informes, correcciones u omitir acciones.',
+          inLog: 'Node, ejecutar谩 autom谩ticamente la rama de error. La salida del nodo devolver谩 un tipo de error y un mensaje de error y los pasar谩 a la versi贸n posterior.',
+        },
+        partialSucceeded: {
+          tip: 'Hay nodos {{num}} en el proceso que se ejecutan de manera anormal, vaya a rastreo para verificar los registros.',
+        },
+        title: 'Manejo de errores',
+        tip: 'Estrategia de control de excepciones, que se desencadena cuando un nodo encuentra una excepci贸n.',
+      },
+      retry: {
+        retryOnFailure: 'Volver a intentarlo en caso de error',
+        maxRetries: 'N煤mero m谩ximo de reintentos',
+        retryInterval: 'Intervalo de reintento',
+        retryTimes: 'Reintentar {{times}} veces en caso de error',
+        retrying: 'Reintentando...',
+        retrySuccessful: 'Volver a intentarlo correctamente',
+        retryFailed: 'Error en el reintento',
+        retryFailedTimes: '{{veces}} reintentos fallidos',
+        times: 'veces',
+        ms: 'Sra.',
+        retries: '{{num}} Reintentos',
+        retry: 'Reintentar',
+      },
+    },
+    start: {
+      required: 'requerido',
+      inputField: 'Campo de entrada',
+      builtInVar: 'Variables incorporadas',
+      outputVars: {
+        query: 'Entrada del usuario',
+        memories: {
+          des: 'Historial de conversaci贸n',
+          type: 'tipo de mensaje',
+          content: 'contenido del mensaje',
+        },
+        files: 'Lista de archivos',
+      },
+      noVarTip: 'Establece las entradas que se pueden utilizar en el flujo de trabajo',
+    },
+    end: {
+      outputs: 'Salidas',
+      output: {
+        type: 'tipo de salida',
+        variable: 'variable de salida',
+      },
+      type: {
+        'none': 'Ninguno',
+        'plain-text': 'Texto sin formato',
+        'structured': 'Estructurado',
+      },
+    },
+    answer: {
+      answer: 'Respuesta',
+      outputVars: 'Variables de salida',
+    },
+    llm: {
+      model: 'modelo',
+      variables: 'variables',
+      context: 'contexto',
+      contextTooltip: 'Puedes importar el conocimiento como contexto',
+      notSetContextInPromptTip: 'Para habilitar la funci贸n de contexto, completa la variable de contexto en PROMPT.',
+      prompt: 'indicaci贸n',
+      roleDescription: {
+        system: 'Proporciona instrucciones generales para la conversaci贸n',
+        user: 'Proporciona instrucciones, consultas o cualquier entrada basada en texto al modelo',
+        assistant: 'Las respuestas del modelo basadas en los mensajes del usuario',
+      },
+      addMessage: 'Agregar mensaje',
+      vision: 'visi贸n',
+      files: 'Archivos',
+      resolution: {
+        name: 'Resoluci贸n',
+        high: 'Alta',
+        low: 'Baja',
+      },
+      outputVars: {
+        output: 'Generar contenido',
+        usage: 'Informaci贸n de uso del modelo',
+      },
+      singleRun: {
+        variable: 'Variable',
+      },
+      sysQueryInUser: 'se requiere sys.query en el mensaje del usuario',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: 'Por favor, termina de editar el campo actual antes de guardar el esquema.',
+        },
+        showAdvancedOptions: 'Mostrar opciones avanzadas',
+        addField: 'Agregar campo',
+        generatedResult: 'Resultado Generado',
+        generateJsonSchema: 'Generar esquema JSON',
+        apply: 'Aplicar',
+        descriptionPlaceholder: 'Agregar descripci贸n',
+        stringValidations: 'Validaciones de cadenas',
+        addChildField: 'Agregar campo de ni帽o',
+        back: 'Atr谩s',
+        promptTooltip: 'Convierta la descripci贸n del texto en una estructura de esquema JSON estandarizada.',
+        doc: 'Aprender m谩s sobre la salida estructurada',
+        generating: 'Generando esquema JSON...',
+        fieldNamePlaceholder: 'Nombre del campo',
+        resultTip: 'Aqu铆 est谩 el resultado generado. Si no est谩s satisfecho, puedes regresar y modificar tu solicitud.',
+        title: 'Esquema de salida estructurada',
+        regenerate: 'Regenerar',
+        instruction: 'Instrucci贸n',
+        generationTip: 'Puedes usar lenguaje natural para crear r谩pidamente un esquema JSON.',
+        promptPlaceholder: 'Describe tu esquema JSON...',
+        required: 'requerido',
+        generate: 'Generar',
+        import: 'Importar desde JSON',
+        resetDefaults: 'Restablecer',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'Variable de consulta',
+      knowledge: 'Conocimiento',
+      outputVars: {
+        output: 'Datos segmentados de recuperaci贸n',
+        content: 'Contenido segmentado',
+        title: 'T铆tulo segmentado',
+        icon: '脥cono segmentado',
+        url: 'URL segmentada',
+        metadata: 'Metadatos adicionales',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            subTitle: 'No habilitar el filtrado de metadatos',
+          },
+          automatic: {
+            subTitle: 'Generar autom谩ticamente condiciones de filtrado de metadatos basadas en la consulta del usuario',
+            desc: 'Generar autom谩ticamente condiciones de filtrado de metadatos basadas en la variable de consulta',
+          },
+          manual: {
+            title: 'Manual',
+            subTitle: 'A帽adir manualmente condiciones de filtro de metadatos',
+          },
+        },
+        panel: {
+          conditions: 'Condiciones',
+          title: 'Condiciones del filtro de metadatos',
+          add: 'Agregar condici贸n',
+          select: 'Seleccionar variable...',
+          datePlaceholder: 'Elige una hora...',
+          placeholder: 'Ingrese valor',
+          search: 'Buscar metadatos',
+        },
+        title: 'Filtrado de Metadatos',
+      },
+    },
+    http: {
+      inputVars: 'Variables de entrada',
+      api: 'API',
+      apiPlaceholder: 'Ingresa la URL, escribe \'/\' para insertar una variable',
+      notStartWithHttp: 'La API debe comenzar con http:// o https://',
+      key: 'Clave',
+      value: 'Valor',
+      bulkEdit: 'Edici贸n masiva',
+      keyValueEdit: 'Edici贸n clave-valor',
+      headers: 'Encabezados',
+      params: 'Par谩metros',
+      body: 'Cuerpo',
+      outputVars: {
+        body: 'Contenido de la respuesta',
+        statusCode: 'C贸digo de estado de la respuesta',
+        headers: 'Lista de encabezados de respuesta en formato JSON',
+        files: 'Lista de archivos',
+      },
+      authorization: {
+        'authorization': 'Autorizaci贸n',
+        'authorizationType': 'Tipo de autorizaci贸n',
+        'no-auth': 'Ninguna',
+        'api-key': 'Clave de API',
+        'auth-type': 'Tipo de autenticaci贸n',
+        'basic': 'B谩sica',
+        'bearer': 'Bearer',
+        'custom': 'Personalizada',
+        'api-key-title': 'Clave de API',
+        'header': 'Encabezado',
+      },
+      insertVarPlaceholder: 'escribe \'/\' para insertar una variable',
+      timeout: {
+        title: 'Tiempo de espera',
+        connectLabel: 'Tiempo de espera de conexi贸n',
+        connectPlaceholder: 'Ingresa el tiempo de espera de conexi贸n en segundos',
+        readLabel: 'Tiempo de espera de lectura',
+        readPlaceholder: 'Ingresa el tiempo de espera de lectura en segundos',
+        writeLabel: 'Tiempo de espera de escritura',
+        writePlaceholder: 'Ingresa el tiempo de espera de escritura en segundos',
+      },
+      type: 'Tipo',
+      binaryFileVariable: 'Variable de archivo binario',
+      extractListPlaceholder: 'Introduzca el 铆ndice de elementos de la lista, escriba \'/\' insertar variable',
+      curl: {
+        title: 'Importar desde cURL',
+        placeholder: 'Pegar la cadena cURL aqu铆',
+      },
+    },
+    code: {
+      inputVars: 'Variables de entrada',
+      outputVars: 'Variables de salida',
+      advancedDependencies: 'Dependencias avanzadas',
+      advancedDependenciesTip: 'Agrega algunas dependencias precargadas que consumen m谩s tiempo o no son incorporadas por defecto aqu铆',
+      searchDependencies: 'Buscar dependencias',
+    },
+    templateTransform: {
+      inputVars: 'Variables de entrada',
+      code: 'C贸digo',
+      codeSupportTip: 'Solo admite Jinja2',
+      outputVars: {
+        output: 'Contenido transformado',
+      },
+    },
+    ifElse: {
+      if: 'Si',
+      else: 'Sino',
+      elseDescription: 'Se utiliza para definir la l贸gica que se debe ejecutar cuando no se cumple la condici贸n del si.',
+      and: 'y',
+      or: 'o',
+      operator: 'Operador',
+      notSetVariable: 'Por favor, establece primero la variable',
+      comparisonOperator: {
+        'contains': 'contiene',
+        'not contains': 'no contiene',
+        'start with': 'comienza con',
+        'end with': 'termina con',
+        'is': 'es',
+        'is not': 'no es',
+        'empty': 'est谩 vac铆o',
+        'not empty': 'no est谩 vac铆o',
+        'null': 'es nulo',
+        'not null': 'no es nulo',
+        'regex match': 'Coincidencia de expresiones regulares',
+        'not in': 'no en',
+        'in': 'en',
+        'exists': 'Existe',
+        'all of': 'Todos los',
+        'not exists': 'no existe',
+        'after': 'despu茅s',
+        'before': 'antes',
+      },
+      enterValue: 'Ingresa un valor',
+      addCondition: 'Agregar condici贸n',
+      conditionNotSetup: 'Condici贸n NO configurada',
+      selectVariable: 'Seleccionar variable...',
+      optionName: {
+        audio: 'Audio',
+        image: 'Imagen',
+        doc: 'Doc',
+        localUpload: 'Carga local',
+        video: 'V铆deo',
+        url: 'URL',
+      },
+      select: 'Escoger',
+      addSubVariable: 'Sub Variable',
+      condition: 'Condici贸n',
+    },
+    variableAssigner: {
+      title: 'Asignar variables',
+      outputType: 'Tipo de salida',
+      varNotSet: 'Variable no establecida',
+      noVarTip: 'Agrega las variables que se asignar谩n',
+      type: {
+        string: 'Cadena',
+        number: 'N煤mero',
+        object: 'Objeto',
+        array: 'Arreglo',
+      },
+      aggregationGroup: 'Grupo de agregaci贸n',
+      aggregationGroupTip: 'Al habilitar esta funci贸n, el agregador de variables puede agregar m煤ltiples conjuntos de variables.',
+      addGroup: 'Agregar grupo',
+      outputVars: {
+        varDescribe: 'Salida de {{groupName}}',
+      },
+      setAssignVariable: 'Establecer variable asignada',
+    },
+    assigner: {
+      'assignedVariable': 'Variable Asignada',
+      'writeMode': 'Modo de Escritura',
+      'writeModeTip': 'Cuando la VARIABLE ASIGNADA es un array, el modo de anexar agrega al final.',
+      'over-write': 'Sobrescribir',
+      'append': 'Anexar',
+      'plus': 'M谩s',
+      'clear': 'Limpiar',
+      'setVariable': 'Establecer Variable',
+      'variable': 'Variable',
+      'operations': {
+        'clear': 'Claro',
+        '*=': '*=',
+        '-=': '-=',
+        'title': 'Operaci贸n',
+        'extend': 'Extender',
+        'append': 'A帽adir',
+        '+=': '+=',
+        'over-write': 'Sobrescribir',
+        'overwrite': 'Sobrescribir',
+        '/=': '/=',
+        'set': 'Poner',
+        'remove-last': 'Eliminar 煤ltimo',
+        'remove-first': 'Eliminar primero',
+      },
+      'variables': 'Variables',
+      'setParameter': 'Establecer par谩metro...',
+      'noVarTip': 'Haga clic en el bot贸n "+" para agregar variables',
+      'varNotSet': 'Variable NO establecida',
+      'noAssignedVars': 'No hay variables asignadas disponibles',
+      'selectAssignedVariable': 'Seleccione la variable asignada...',
+      'assignedVarsDescription': 'Las variables asignadas deben ser variables grabables, como las variables de conversaci贸n.',
+    },
+    tool: {
+      toAuthorize: 'Para autorizar',
+      inputVars: 'Variables de entrada',
+      outputVars: {
+        text: 'Contenido generado por la herramienta',
+        files: {
+          title: 'Archivos generados por la herramienta',
+          type: 'Tipo de soporte. Ahora solo admite im谩genes',
+          transfer_method: 'M茅todo de transferencia. El valor es remote_url o local_file',
+          url: 'URL de la imagen',
+          upload_file_id: 'ID de archivo cargado',
+        },
+        json: 'JSON generado por la herramienta',
+      },
+    },
+    questionClassifiers: {
+      model: 'modelo',
+      inputVars: 'Variables de entrada',
+      outputVars: {
+        className: 'Nombre de la clase',
+      },
+      class: 'Clase',
+      classNamePlaceholder: 'Escribe el nombre de tu clase',
+      advancedSetting: 'Configuraci贸n avanzada',
+      topicName: 'Nombre del tema',
+      topicPlaceholder: 'Escribe el nombre de tu tema',
+      addClass: 'Agregar clase',
+      instruction: 'Instrucci贸n',
+      instructionTip: 'Input additional instructions to help the question classifier better understand how to categorize questions.',
+      instructionPlaceholder: 'Write your instruction',
+    },
+    parameterExtractor: {
+      inputVar: 'Variable de entrada',
+      extractParameters: 'Extraer par谩metros',
+      importFromTool: 'Importar desde herramientas',
+      addExtractParameter: 'Agregar par谩metro de extracci贸n',
+      addExtractParameterContent: {
+        name: 'Nombre',
+        namePlaceholder: 'Nombre del par谩metro de extracci贸n',
+        type: 'Tipo',
+        typePlaceholder: 'Tipo de par谩metro de extracci贸n',
+        description: 'Descripci贸n',
+        descriptionPlaceholder: 'Descripci贸n del par谩metro de extracci贸n',
+        required: 'Requerido',
+        requiredContent: 'El campo requerido se utiliza solo como referencia para la inferencia del modelo, y no para la validaci贸n obligatoria de la salida del par谩metro.',
+      },
+      extractParametersNotSet: 'Par谩metros de extracci贸n no configurados',
+      instruction: 'Instrucci贸n',
+      instructionTip: 'Ingrese instrucciones adicionales para ayudar al extractor de par谩metros a entender c贸mo extraer par谩metros.',
+      advancedSetting: 'Configuraci贸n avanzada',
+      reasoningMode: 'Modo de razonamiento',
+      reasoningModeTip: 'Puede elegir el modo de razonamiento apropiado basado en la capacidad del modelo para responder a instrucciones para llamadas de funciones o indicaciones.',
+      isSuccess: 'Es 茅xito. En caso de 茅xito el valor es 1, en caso de fallo el valor es 0.',
+      errorReason: 'Motivo del error',
+    },
+    iteration: {
+      deleteTitle: '驴Eliminar nodo de iteraci贸n?',
+      deleteDesc: 'Eliminar el nodo de iteraci贸n eliminar谩 todos los nodos secundarios',
+      input: 'Entrada',
+      output: 'Variables de salida',
+      iteration_one: '{{count}} Iteraci贸n',
+      iteration_other: '{{count}} Iteraciones',
+      currentIteration: 'Iteraci贸n actual',
+      ErrorMethod: {
+        operationTerminated: 'Terminado',
+        continueOnError: 'Continuar en el error',
+        removeAbnormalOutput: 'eliminar-salida-anormal',
+      },
+      comma: ',',
+      errorResponseMethod: 'M茅todo de respuesta a errores',
+      error_one: '{{conteo}} Error',
+      parallelPanelDesc: 'En el modo paralelo, las tareas de la iteraci贸n admiten la ejecuci贸n en paralelo.',
+      MaxParallelismTitle: 'M谩ximo paralelismo',
+      error_other: '{{conteo}} Errores',
+      parallelMode: 'Modo paralelo',
+      parallelModeEnableDesc: 'En el modo paralelo, las tareas dentro de las iteraciones admiten la ejecuci贸n en paralelo. Puede configurar esto en el panel de propiedades a la derecha.',
+      parallelModeUpper: 'MODO PARALELO',
+      MaxParallelismDesc: 'El paralelismo m谩ximo se utiliza para controlar el n煤mero de tareas ejecutadas simult谩neamente en una sola iteraci贸n.',
+      answerNodeWarningDesc: 'Advertencia de modo paralelo: Los nodos de respuesta, las asignaciones de variables de conversaci贸n y las operaciones de lectura/escritura persistentes dentro de las iteraciones pueden provocar excepciones.',
+      parallelModeEnableTitle: 'Modo paralelo habilitado',
+    },
+    note: {
+      addNote: 'Agregar nota',
+      editor: {
+        placeholder: 'Escribe tu nota...',
+        small: 'Peque帽o',
+        medium: 'Mediano',
+        large: 'Grande',
+        bold: 'Negrita',
+        italic: 'It谩lica',
+        strikethrough: 'Tachado',
+        link: 'Enlace',
+        openLink: 'Abrir',
+        unlink: 'Quitar enlace',
+        enterUrl: 'Introducir URL...',
+        invalidUrl: 'URL inv谩lida',
+        bulletList: 'Lista de vi帽etas',
+        showAuthor: 'Mostrar autor',
+      },
+    },
+    tracing: {
+      stopBy: 'Detenido por {{user}}',
+    },
+    docExtractor: {
+      outputVars: {
+        text: 'Texto extra铆do',
+      },
+      learnMore: 'Aprende m谩s',
+      supportFileTypes: 'Tipos de archivos de soporte: {{tipos}}.',
+      inputVar: 'Variable de entrada',
+    },
+    listFilter: {
+      outputVars: {
+        first_record: 'Primer registro',
+        last_record: '脷ltimo registro',
+        result: 'Filtrar resultado',
+      },
+      filterCondition: 'Condici贸n del filtro',
+      filterConditionComparisonValue: 'Valor de la condici贸n de filtro',
+      inputVar: 'Variable de entrada',
+      desc: 'DESC',
+      limit: 'Arriba N',
+      filterConditionKey: 'Clave de condici贸n de filtro',
+      orderBy: 'Ordenar por',
+      filterConditionComparisonOperator: 'Operador de comparaci贸n de condiciones de filtro',
+      asc: 'ASC',
+      selectVariableKeyPlaceholder: 'Seleccione la clave de subvariable',
+      extractsCondition: 'Extraiga el elemento N',
+    },
+    agent: {
+      strategy: {
+        configureTip: 'Configure la estrategia de agentes.',
+        tooltip: 'Diferentes estrategias agentic determinan c贸mo el sistema planifica y ejecuta las llamadas a herramientas de varios pasos',
+        label: 'Estrategia Agentica',
+        shortLabel: 'Estrategia',
+        configureTipDesc: 'Despu茅s de configurar la estrategia agentica, este nodo cargar谩 autom谩ticamente las configuraciones restantes. La estrategia afectar谩 el mecanismo de razonamiento de herramientas de varios pasos.',
+        selectTip: 'Seleccionar estrategia agentica',
+        searchPlaceholder: 'Estrategia de agentes de b煤squeda',
+      },
+      pluginInstaller: {
+        install: 'Instalar',
+        installing: 'Instalar',
+      },
+      modelNotInMarketplace: {
+        manageInPlugins: 'Administrar en Plugins',
+        desc: 'Este modelo se instala desde el repositorio local o de GitHub. 脷selo despu茅s de la instalaci贸n.',
+        title: 'Modelo no instalado',
+      },
+      modelNotSupport: {
+        descForVersionSwitch: 'La versi贸n del plugin instalado no proporciona este modelo. Haga clic para cambiar de versi贸n.',
+        desc: 'La versi贸n del plugin instalado no proporciona este modelo.',
+        title: 'Modelo no compatible',
+      },
+      modelSelectorTooltips: {
+        deprecated: 'Este modelo est谩 en desuso',
+      },
+      outputVars: {
+        files: {
+          url: 'URL de la imagen',
+          title: 'Archivos generados por el agente',
+          upload_file_id: 'Cargar ID de archivo',
+          transfer_method: 'M茅todo de transferencia. El valor es remote_url o local_file',
+          type: 'Tipo de soporte. Ahora solo admite imagen',
+        },
+        json: 'JSON generado por el agente',
+        text: 'Contenido generado por el agente',
+      },
+      checkList: {
+        strategyNotSelected: 'Estrategia no seleccionada',
+      },
+      installPlugin: {
+        install: 'Instalar',
+        desc: 'A punto de instalar el siguiente plugin',
+        changelog: 'Registro de cambios',
+        title: 'Instalar plugin',
+        cancel: 'Cancelar',
+      },
+      tools: 'Herramientas',
+      pluginNotFoundDesc: 'Este plugin se instala desde GitHub. Por favor, vaya a Plugins para reinstalar',
+      strategyNotFoundDesc: 'La versi贸n del plugin instalado no proporciona esta estrategia.',
+      strategyNotInstallTooltip: '{{estrategia}} no est谩 instalado',
+      modelNotInstallTooltip: 'Este modelo no est谩 instalado',
+      maxIterations: 'Iteraciones m谩ximas',
+      notAuthorized: 'No autorizado',
+      toolNotInstallTooltip: '{{herramienta}} no est谩 instalada',
+      toolbox: 'caja de herramientas',
+      strategyNotSet: 'Estrategia agentica No establecida',
+      unsupportedStrategy: 'Estrategia no respaldada',
+      linkToPlugin: 'Enlace a los plugins',
+      learnMore: 'Aprende m谩s',
+      configureModel: 'Configurar modelo',
+      pluginNotInstalled: 'Este plugin no est谩 instalado',
+      model: 'modelo',
+      pluginNotInstalledDesc: 'Este plugin se instala desde GitHub. Por favor, vaya a Plugins para reinstalar',
+      strategyNotFoundDescAndSwitchVersion: 'La versi贸n del plugin instalado no proporciona esta estrategia. Haga clic para cambiar de versi贸n.',
+      toolNotAuthorizedTooltip: '{{herramienta}} No autorizado',
+      modelNotSelected: 'Modelo no seleccionado',
+    },
+    loop: {
+      ErrorMethod: {
+        removeAbnormalOutput: 'Eliminar salida anormal',
+        operationTerminated: 'Terminado',
+        continueOnError: 'Continuar con el error',
+      },
+      loopMaxCount: 'Conteo m谩ximo de bucles',
+      output: 'Variable de Salida',
+      currentLoopCount: 'Contador de bucles actual: {{count}}',
+      currentLoop: 'Bucle de corriente',
+      loopNode: 'Nodo de bucle',
+      deleteDesc: 'Eliminar el nodo de bucle eliminar谩 todos los nodos hijos',
+      totalLoopCount: 'Total de loops: {{count}}',
+      comma: ',',
+      finalLoopVariables: 'Variables del Bucle Final',
+      inputMode: 'Modo de entrada',
+      deleteTitle: '驴Eliminar nodo de bucle?',
+      setLoopVariables: 'Establecer variables dentro del alcance del bucle',
+      loop_other: '{{count}} bucles',
+      breakCondition: 'Condici贸n de terminaci贸n del bucle',
+      loopMaxCountError: 'Por favor, introduce un conteo m谩ximo de bucles v谩lido, que var铆e entre 1 y {{maxCount}}.',
+      exitConditionTip: 'Un nodo de bucle necesita al menos una condici贸n de salida',
+      error_one: '{{count}} Error',
+      loop_one: '{{count}} Bucle',
+      initialLoopVariables: 'Variables de Bucle Iniciales',
+      errorResponseMethod: 'M茅todo de respuesta de error',
+      breakConditionTip: 'Solo se pueden hacer referencia a las variables dentro de bucles con condiciones de terminaci贸n y variables de conversaci贸n.',
+      error_other: '{{count}} Errores',
+      loopVariables: 'Variables de bucle',
+      variableName: 'Nombre de Variable',
+    },
+  },
+  tracing: {
+    stopBy: 'P谩sate por {{usuario}}',
+  },
+  variableReference: {
+    noAvailableVars: 'No hay variables disponibles',
+    assignedVarsDescription: 'Las variables asignadas deben ser variables grabables, como',
+    noVarsForOperation: 'No hay variables disponibles para la asignaci贸n con la operaci贸n seleccionada.',
+    noAssignedVars: 'No hay variables asignadas disponibles',
+    conversationVars: 'Variables de conversaci贸n',
+  },
+  versionHistory: {
+    filter: {
+      onlyYours: 'Solo tuyo',
+      onlyShowNamedVersions: 'Solo muestra versiones nombradas',
+      empty: 'No se encontr贸 un historial de versiones coincidente.',
+      reset: 'Restablecer filtro',
+    },
+    editField: {
+      titleLengthLimit: 'El t铆tulo no puede exceder {{limit}} caracteres',
+      title: 'T铆tulo',
+      releaseNotesLengthLimit: 'Las notas de lanzamiento no pueden exceder {{limit}} caracteres',
+      releaseNotes: 'Notas de Lanzamiento',
+    },
+    action: {
+      deleteSuccess: 'Versi贸n eliminada',
+      updateSuccess: 'Versi贸n actualizada',
+      restoreFailure: 'Error al restaurar la versi贸n',
+      deleteFailure: 'Error al eliminar la versi贸n',
+      updateFailure: 'Error al actualizar la versi贸n',
+      restoreSuccess: 'Versi贸n restaurada',
+    },
+    releaseNotesPlaceholder: 'Describe lo que cambi贸',
+    restorationTip: 'Despu茅s de la restauraci贸n de la versi贸n, el borrador actual ser谩 sobrescrito.',
+    nameThisVersion: 'Nombra esta versi贸n',
+    defaultName: 'Versi贸n sin t铆tulo',
+    title: 'Versiones',
+    deletionTip: 'La eliminaci贸n es irreversible, por favor confirma.',
+    currentDraft: 'Borrador Actual',
+    editVersionInfo: 'Editar informaci贸n de la versi贸n',
+  },
+}
+
+export default translation
diff --git a/i18n/fa-IR/app-annotation.ts b/i18n/fa-IR/app-annotation.ts
new file mode 100644
index 0000000..e78fc8c
--- /dev/null
+++ b/i18n/fa-IR/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: '蹖丕丿丿丕卮鬲鈥屬囏�',
+  name: '倬丕爻禺 蹖丕丿丿丕卮鬲',
+  editBy: '倬丕爻禺 賵蹖乇丕蹖卮 卮丿賴 鬲賵爻胤 {{author}}',
+  noData: {
+    title: '亘丿賵賳 蹖丕丿丿丕卮鬲',
+    description: '卮賲丕 賲蹖鈥屫堌з嗃屫� 蹖丕丿丿丕卮鬲鈥屬囏� 乇丕 丿乇 丨蹖賳 丕卮讴丕賱鈥屫藏й屰� 亘乇賳丕賲賴 賵蹖乇丕蹖卮 讴賳蹖丿 蹖丕 蹖丕丿丿丕卮鬲鈥屬囏� 乇丕 亘賴 氐賵乇鬲 丕賳亘賵賴 丿乇 丕蹖賳噩丕 亘乇丕蹖 倬丕爻禺诏賵蹖蹖 亘丕 讴蹖賮蹖鬲 亘丕賱丕 賵丕乇丿 讴賳蹖丿.',
+  },
+  table: {
+    header: {
+      question: '爻賵丕賱',
+      answer: '倬丕爻禺',
+      createdAt: '丕蹖噩丕丿 卮丿賴 丿乇',
+      hits: '亘丕夭丿蹖丿賴丕',
+      actions: '丕賯丿丕賲丕鬲',
+      addAnnotation: '丕賮夭賵丿賳 蹖丕丿丿丕卮鬲',
+      bulkImport: '賵丕乇丿丕鬲 丕賳亘賵賴',
+      bulkExport: '氐丕丿乇丕鬲 丕賳亘賵賴',
+      clearAll: '倬丕讴 讴乇丿賳 賴賲賴 蹖丕丿丿丕卮鬲鈥屬囏�',
+    },
+  },
+  editModal: {
+    title: '賵蹖乇丕蹖卮 倬丕爻禺 蹖丕丿丿丕卮鬲',
+    queryName: '倬乇爻卮 讴丕乇亘乇',
+    answerName: '乇亘丕鬲 丿丕爻鬲丕賳鈥屫池必�',
+    yourAnswer: '倬丕爻禺 卮賲丕',
+    answerPlaceholder: '倬丕爻禺 禺賵丿 乇丕 丕蹖賳噩丕 亘賳賵蹖爻蹖丿',
+    yourQuery: '倬乇爻卮 卮賲丕',
+    queryPlaceholder: '倬乇爻卮 禺賵丿 乇丕 丕蹖賳噩丕 亘賳賵蹖爻蹖丿',
+    removeThisCache: '丨匕賮 丕蹖賳 蹖丕丿丿丕卮鬲',
+    createdAt: '丕蹖噩丕丿 卮丿賴 丿乇',
+  },
+  addModal: {
+    title: '丕賮夭賵丿賳 倬丕爻禺 蹖丕丿丿丕卮鬲',
+    queryName: '爻賵丕賱',
+    answerName: '倬丕爻禺',
+    answerPlaceholder: '倬丕爻禺 乇丕 丕蹖賳噩丕 亘賳賵蹖爻蹖丿',
+    queryPlaceholder: '倬乇爻卮 乇丕 丕蹖賳噩丕 亘賳賵蹖爻蹖丿',
+    createNext: '丕賮夭賵丿賳 倬丕爻禺 蹖丕丿丿丕卮鬲鈥屫簇� 丿蹖诏乇',
+  },
+  batchModal: {
+    title: '賵丕乇丿丕鬲 丕賳亘賵賴',
+    csvUploadTitle: '賮丕蹖賱 CSV 禺賵丿 乇丕 丕蹖賳噩丕 亘讴卮蹖丿 賵 乇賴丕 讴賳蹖丿貙 蹖丕 ',
+    browse: '賲乇賵乇 讴賳蹖丿',
+    tip: '賮丕蹖賱 CSV 亘丕蹖丿 丕夭 爻丕禺鬲丕乇 夭蹖乇 倬蹖乇賵蹖 讴賳丿:',
+    question: '爻賵丕賱',
+    answer: '倬丕爻禺',
+    contentTitle: '賲丨鬲賵丕蹖 鬲讴賴',
+    content: '賲丨鬲賵丕',
+    template: '丕賱诏賵 乇丕 丕夭 丕蹖賳噩丕 丿丕賳賱賵丿 讴賳蹖丿',
+    cancel: '賱睾賵',
+    run: '丕噩乇丕蹖 丿爻鬲賴鈥屫й�',
+    runError: '丕噩乇丕蹖 丿爻鬲賴鈥屫й� 賳丕賲賵賮賯 亘賵丿',
+    processing: '丿乇 丨丕賱 倬乇丿丕夭卮 丿爻鬲賴鈥屫й�',
+    completed: '賵丕乇丿丕鬲 鬲讴賲蹖賱 卮丿',
+    error: '禺胤丕蹖 賵丕乇丿丕鬲',
+    ok: '鬲丕蹖蹖丿',
+  },
+  errorMessage: {
+    answerRequired: '倬丕爻禺 丕賱夭丕賲蹖 丕爻鬲',
+    queryRequired: '爻賵丕賱 丕賱夭丕賲蹖 丕爻鬲',
+  },
+  viewModal: {
+    annotatedResponse: '倬丕爻禺 蹖丕丿丿丕卮鬲鈥屫簇�',
+    hitHistory: '鬲丕乇蹖禺趩賴 亘丕夭丿蹖丿',
+    hit: '亘丕夭丿蹖丿',
+    hits: '亘丕夭丿蹖丿賴丕',
+    noHitHistory: '亘丿賵賳 鬲丕乇蹖禺趩賴 亘丕夭丿蹖丿',
+  },
+  hitHistoryTable: {
+    query: '倬乇爻卮',
+    match: '鬲胤丕亘賯',
+    response: '倬丕爻禺',
+    source: '賲賳亘毓',
+    score: '丕賲鬲蹖丕夭',
+    time: '夭賲丕賳',
+  },
+  initSetup: {
+    title: '乇丕賴鈥屫з嗀ж槽� 丕賵賱蹖賴 倬丕爻禺 蹖丕丿丿丕卮鬲',
+    configTitle: '鬲賳馗蹖賲丕鬲 倬丕爻禺 蹖丕丿丿丕卮鬲',
+    confirmBtn: '匕禺蹖乇賴 賵 賮毓丕賱鈥屫池ж槽�',
+    configConfirmBtn: '匕禺蹖乇賴',
+  },
+  embeddingModelSwitchTip: '賲丿賱 亘乇丿丕乇蹖鈥屫池ж槽� 賲鬲賳 蹖丕丿丿丕卮鬲貙 鬲睾蹖蹖乇 賲丿賱鈥屬囏� 亘丕毓孬 噩丕爻丕夭蹖 賲噩丿丿 禺賵丕賴丿 卮丿 賵 賴夭蹖賳賴鈥屬囏й� 丕囟丕賮蹖 亘賴 賴賲乇丕賴 禺賵丕賴丿 丿丕卮鬲.',
+}
+
+export default translation
diff --git a/i18n/fa-IR/app-api.ts b/i18n/fa-IR/app-api.ts
new file mode 100644
index 0000000..1891e8f
--- /dev/null
+++ b/i18n/fa-IR/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: '爻乇賵乇 API',
+  apiKey: '讴賱蹖丿 API',
+  status: '賵囟毓蹖鬲',
+  disabled: '睾蹖乇賮毓丕賱',
+  ok: '丿乇 爻乇賵蹖爻',
+  copy: '讴倬蹖',
+  copied: '讴倬蹖 卮丿',
+  play: '倬禺卮',
+  pause: '賲讴孬',
+  playing: '丿乇 丨丕賱 倬禺卮',
+  loading: '丿乇 丨丕賱 亘丕乇诏匕丕乇蹖',
+  merMaid: {
+    rerender: '亘丕夭爻丕夭蹖 賲噩丿丿',
+  },
+  never: '賴乇诏夭',
+  apiKeyModal: {
+    apiSecretKey: '讴賱蹖丿 賲禺賮蹖 API',
+    apiSecretKeyTips: '亘乇丕蹖 噩賱賵诏蹖乇蹖 丕夭 爻賵亍 丕爻鬲賮丕丿賴 丕夭 API貙 丕夭 讴賱蹖丿 API 禺賵丿 賲丨丕賮馗鬲 讴賳蹖丿. 丕夭 丕爻鬲賮丕丿賴 丕夭 丌賳 亘賴 氐賵乇鬲 賲鬲賳 爻丕丿賴 丿乇 讴丿 賮乇丕賳鬲鈥屫з嗀� 禺賵丿丿丕乇蹖 讴賳蹖丿. :)',
+    createNewSecretKey: '丕蹖噩丕丿 讴賱蹖丿 賲禺賮蹖 噩丿蹖丿',
+    secretKey: '讴賱蹖丿 賲禺賮蹖',
+    created: '丕蹖噩丕丿 卮丿賴',
+    lastUsed: '丌禺乇蹖賳 丕爻鬲賮丕丿賴',
+    generateTips: '丕蹖賳 讴賱蹖丿 乇丕 丿乇 賲讴丕賳蹖 丕賲賳 賵 賯丕亘賱 丿爻鬲乇爻 賳诏賴 丿丕乇蹖丿.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: '丕蹖賳 讴賱蹖丿 賲禺賮蹖 丨匕賮 卮賵丿責',
+    deleteConfirmTips: '丕蹖賳 毓賲賱 賯丕亘賱 亘丕夭诏卮鬲 賳蹖爻鬲.',
+    ok: '鬲丕蹖蹖丿',
+  },
+  completionMode: {
+    title: 'API 亘乇賳丕賲賴 鬲讴賲蹖賱',
+    info: '亘乇丕蹖 鬲賵賱蹖丿 賲鬲賳 亘丕 讴蹖賮蹖鬲 亘丕賱丕貙 賲丕賳賳丿 賲賯丕賱丕鬲貙 禺賱丕氐賴鈥屬囏� 賵 鬲乇噩賲賴鈥屬囏ж� 丕夭 API 倬蹖丕賲鈥屬囏й� 鬲讴賲蹖賱蹖 亘丕 賵乇賵丿蹖 讴丕乇亘乇 丕爻鬲賮丕丿賴 讴賳蹖丿. 鬲賵賱蹖丿 賲鬲賳 亘賴 倬丕乇丕賲鬲乇賴丕蹖 賲丿賱 賵 賯丕賱亘鈥屬囏й� 倬乇丕賲倬鬲 鬲賳馗蹖賲 卮丿賴 丿乇 賲賴賳丿爻蹖 倬乇丕賲倬鬲 Dify 亘爻鬲诏蹖 丿丕乇丿.',
+    createCompletionApi: '丕蹖噩丕丿 倬蹖丕賲 鬲讴賲蹖賱蹖',
+    createCompletionApiTip: '蹖讴 倬蹖丕賲 鬲讴賲蹖賱蹖 亘乇丕蹖 倬卮鬲蹖亘丕賳蹖 丕夭 丨丕賱鬲 爻賵丕賱 賵 噩賵丕亘 丕蹖噩丕丿 讴賳蹖丿.',
+    inputsTips: '(丕禺鬲蹖丕乇蹖) 賮蹖賱丿賴丕蹖 賵乇賵丿蹖 讴丕乇亘乇 乇丕 亘賴 氐賵乇鬲 噩賮鬲鈥屬囏й� 讴賱蹖丿-賲賯丿丕乇 丕乇丕卅賴 丿賴蹖丿 讴賴 亘丕 賲鬲睾蹖乇賴丕蹖 賲賵噩賵丿 丿乇 賲賴賳丿爻蹖 倬乇丕賲倬鬲 賲胤丕亘賯鬲 丿丕乇賳丿. 讴賱蹖丿 賳丕賲 賲鬲睾蹖乇 丕爻鬲 賵 賲賯丿丕乇貙 賲賯丿丕乇 倬丕乇丕賲鬲乇 丕爻鬲. 丕诏乇 賳賵毓 賮蹖賱丿 丕賳鬲禺丕亘蹖 亘丕卮丿貙 賲賯丿丕乇 丕乇爻丕賱 卮丿賴 亘丕蹖丿 蹖讴蹖 丕夭 诏夭蹖賳賴鈥屬囏й� 丕夭 倬蹖卮 鬲毓蹖蹖賳 卮丿賴 亘丕卮丿.',
+    queryTips: '賲丨鬲賵丕蹖 賲鬲賳 賵乇賵丿蹖 讴丕乇亘乇.',
+    blocking: '賳賵毓 賲爻丿賵丿讴賳賳丿賴貙 賲賳鬲馗乇 丕鬲賲丕賲 丕噩乇丕 賵 亘丕夭诏卮鬲 賳鬲丕蹖噩. (丿乇禺賵丕爻鬲鈥屬囏� 賲賲讴賳 丕爻鬲 丿乇 氐賵乇鬲 胤賵賱丕賳蹖 亘賵丿賳 賮乇丌蹖賳丿 賯胤毓 卮賵賳丿)',
+    streaming: '亘丕夭诏卮鬲 噩乇蹖丕賳蹖. 倬蹖丕丿賴鈥屫池ж槽� 亘丕夭诏卮鬲 噩乇蹖丕賳蹖 亘乇 丕爻丕爻 SSE (乇賵蹖丿丕丿賴丕蹖 丕乇爻丕賱蹖 爻乇賵乇).',
+    messageFeedbackApi: '亘丕夭禺賵乇丿 倬蹖丕賲 (賱丕蹖讴)',
+    messageFeedbackApiTip: '倬蹖丕賲鈥屬囏й� 丿乇蹖丕賮鬲蹖 乇丕 丕夭 胤乇賮 讴丕乇亘乇丕賳 賳賴丕蹖蹖 亘丕 賱丕蹖讴 蹖丕 丿蹖爻賱丕蹖讴 丕乇夭蹖丕亘蹖 讴賳蹖丿. 丕蹖賳 丿丕丿賴鈥屬囏� 丿乇 氐賮丨賴 诏夭丕乇卮鈥屬囏� 賵 蹖丕丿丿丕卮鬲鈥屬囏� 賯丕亘賱 賲卮丕賴丿賴 賴爻鬲賳丿 賵 亘乇丕蹖 鬲賳馗蹖賲 丿賯蹖賯 賲丿賱 丿乇 丌蹖賳丿賴 丕爻鬲賮丕丿賴 賲蹖鈥屫促堎嗀�.',
+    messageIDTip: '卮賳丕爻賴 倬蹖丕賲',
+    ratingTip: '賱丕蹖讴 蹖丕 丿蹖爻賱丕蹖讴貙 null 亘乇丕蹖 賱睾賵',
+    parametersApi: '丿乇蹖丕賮鬲 丕胤賱丕毓丕鬲 倬丕乇丕賲鬲乇賴丕蹖 亘乇賳丕賲賴',
+    parametersApiTip: '亘丕夭蹖丕亘蹖 倬丕乇丕賲鬲乇賴丕蹖 賵乇賵丿蹖 倬蹖讴乇亘賳丿蹖 卮丿賴貙 卮丕賲賱 賳丕賲鈥屬囏й� 賲鬲睾蹖乇貙 賳丕賲鈥屬囏й� 賮蹖賱丿貙 丕賳賵丕毓 賵 賲賯丕丿蹖乇 倬蹖卮鈥屬佖必�. 賲毓賲賵賱丕賸 亘乇丕蹖 賳賲丕蹖卮 丕蹖賳 賮蹖賱丿賴丕 丿乇 蹖讴 賮乇賲 蹖丕 倬乇 讴乇丿賳 賲賯丕丿蹖乇 倬蹖卮鈥屬佖必� 倬爻 丕夭 亘丕乇诏蹖乇蹖 讴賱丕蹖賳鬲 丕爻鬲賮丕丿賴 賲蹖鈥屫促堌�.',
+  },
+  chatMode: {
+    title: 'API 亘乇賳丕賲賴 趩鬲',
+    info: '亘乇丕蹖 亘乇賳丕賲賴鈥屬囏й� 賲讴丕賱賲賴鈥屫й� 趩賳丿賲賳馗賵乇賴 亘丕 丕爻鬲賮丕丿賴 丕夭 賮乇賲鬲 爻賵丕賱 賵 噩賵丕亘貙 API 倬蹖丕賲鈥屬囏й� 趩鬲 乇丕 亘乇丕蹖 卮乇賵毓 诏賮鬲诏賵 賮乇丕禺賵丕賳蹖 讴賳蹖丿. 亘丕 丕乇爻丕賱 卮賳丕爻賴 賲讴丕賱賲賴 亘丕夭诏卮鬲蹖貙 诏賮鬲诏賵賴丕蹖 賲丿丕賵賲 乇丕 丨賮馗 讴賳蹖丿. 倬丕乇丕賲鬲乇賴丕蹖 倬丕爻禺 賵 賯丕賱亘鈥屬囏� 亘賴 鬲賳馗蹖賲丕鬲 賲賴賳丿爻蹖 倬乇丕賲倬鬲 Dify 亘爻鬲诏蹖 丿丕乇賳丿.',
+    createChatApi: '丕蹖噩丕丿 倬蹖丕賲 趩鬲',
+    createChatApiTip: '蹖讴 倬蹖丕賲 賲讴丕賱賲賴 噩丿蹖丿 丕蹖噩丕丿 讴賳蹖丿 蹖丕 蹖讴 诏賮鬲诏賵蹖 賲賵噩賵丿 乇丕 丕丿丕賲賴 丿賴蹖丿.',
+    inputsTips: '(丕禺鬲蹖丕乇蹖) 賮蹖賱丿賴丕蹖 賵乇賵丿蹖 讴丕乇亘乇 乇丕 亘賴 氐賵乇鬲 噩賮鬲鈥屬囏й� 讴賱蹖丿-賲賯丿丕乇 丕乇丕卅賴 丿賴蹖丿 讴賴 亘丕 賲鬲睾蹖乇賴丕蹖 賲賵噩賵丿 丿乇 賲賴賳丿爻蹖 倬乇丕賲倬鬲 賲胤丕亘賯鬲 丿丕乇賳丿. 讴賱蹖丿 賳丕賲 賲鬲睾蹖乇 丕爻鬲 賵 賲賯丿丕乇貙 賲賯丿丕乇 倬丕乇丕賲鬲乇 丕爻鬲. 丕诏乇 賳賵毓 賮蹖賱丿 丕賳鬲禺丕亘蹖 亘丕卮丿貙 賲賯丿丕乇 丕乇爻丕賱 卮丿賴 亘丕蹖丿 蹖讴蹖 丕夭 诏夭蹖賳賴鈥屬囏й� 丕夭 倬蹖卮 鬲毓蹖蹖賳 卮丿賴 亘丕卮丿.',
+    queryTips: '賲丨鬲賵丕蹖 賵乇賵丿蹖/爻賵丕賱 讴丕乇亘乇',
+    blocking: '賳賵毓 賲爻丿賵丿讴賳賳丿賴貙 賲賳鬲馗乇 丕鬲賲丕賲 丕噩乇丕 賵 亘丕夭诏卮鬲 賳鬲丕蹖噩. (丿乇禺賵丕爻鬲鈥屬囏� 賲賲讴賳 丕爻鬲 丿乇 氐賵乇鬲 胤賵賱丕賳蹖 亘賵丿賳 賮乇丌蹖賳丿 賯胤毓 卮賵賳丿)',
+    streaming: '亘丕夭诏卮鬲 噩乇蹖丕賳蹖. 倬蹖丕丿賴鈥屫池ж槽� 亘丕夭诏卮鬲 噩乇蹖丕賳蹖 亘乇 丕爻丕爻 SSE (乇賵蹖丿丕丿賴丕蹖 丕乇爻丕賱蹖 爻乇賵乇).',
+    conversationIdTip: '(丕禺鬲蹖丕乇蹖) 卮賳丕爻賴 賲讴丕賱賲賴: 亘乇丕蹖 丕賵賱蹖賳 賲讴丕賱賲賴 禺丕賱蹖 亘诏匕丕乇蹖丿貨 亘乇丕蹖 丕丿丕賲賴 诏賮鬲诏賵貙 卮賳丕爻賴 賲讴丕賱賲賴 乇丕 丕夭 賲鬲賳 丕乇爻丕賱 讴賳蹖丿.',
+    messageFeedbackApi: '亘丕夭禺賵乇丿 讴丕乇亘乇 賳賴丕蹖蹖 倬蹖丕賲貙 賱丕蹖讴',
+    messageFeedbackApiTip: '倬蹖丕賲鈥屬囏й� 丿乇蹖丕賮鬲蹖 乇丕 丕夭 胤乇賮 讴丕乇亘乇丕賳 賳賴丕蹖蹖 亘丕 賱丕蹖讴 蹖丕 丿蹖爻賱丕蹖讴 丕乇夭蹖丕亘蹖 讴賳蹖丿. 丕蹖賳 丿丕丿賴鈥屬囏� 丿乇 氐賮丨賴 诏夭丕乇卮鈥屬囏� 賵 蹖丕丿丿丕卮鬲鈥屬囏� 賯丕亘賱 賲卮丕賴丿賴 賴爻鬲賳丿 賵 亘乇丕蹖 鬲賳馗蹖賲 丿賯蹖賯 賲丿賱 丿乇 丌蹖賳丿賴 丕爻鬲賮丕丿賴 賲蹖鈥屫促堎嗀�.',
+    messageIDTip: '卮賳丕爻賴 倬蹖丕賲',
+    ratingTip: '賱丕蹖讴 蹖丕 丿蹖爻賱丕蹖讴貙 null 亘乇丕蹖 賱睾賵',
+    chatMsgHistoryApi: '丿乇蹖丕賮鬲 鬲丕乇蹖禺趩賴 倬蹖丕賲鈥屬囏й� 趩鬲',
+    chatMsgHistoryApiTip: '氐賮丨賴 丕賵賱 丌禺乇蹖賳 `limit` 倬蹖丕賲 乇丕 亘賴 氐賵乇鬲 賲毓讴賵爻 亘乇賲蹖鈥屭必з嗀�.',
+    chatMsgHistoryConversationIdTip: '卮賳丕爻賴 賲讴丕賱賲賴',
+    chatMsgHistoryFirstId: '卮賳丕爻賴 丕賵賱蹖賳 乇讴賵乇丿 趩鬲 丿乇 氐賮丨賴 賮毓賱蹖. 倬蹖卮鈥屬佖必� 賴蹖趩 丕爻鬲.',
+    chatMsgHistoryLimit: '鬲毓丿丕丿 趩鬲鈥屬囏й屰� 讴賴 丿乇 蹖讴 丿乇禺賵丕爻鬲 亘乇诏乇丿丕賳丿賴 賲蹖鈥屫促堎嗀�',
+    conversationsListApi: '丿乇蹖丕賮鬲 賱蹖爻鬲 賲讴丕賱賲丕鬲',
+    conversationsListApiTip: '賱蹖爻鬲 噩賱爻丕鬲 讴丕乇亘乇 賮毓賱蹖 乇丕 丿乇蹖丕賮鬲 賲蹖鈥屭┵嗀�. 亘賴 胤賵乇 倬蹖卮鈥屬佖必敦� 20 噩賱爻賴 丌禺乇 亘乇诏乇丿丕賳丿賴 賲蹖鈥屫促堌�.',
+    conversationsListFirstIdTip: '卮賳丕爻賴 丌禺乇蹖賳 乇讴賵乇丿 丿乇 氐賮丨賴 賮毓賱蹖貙 倬蹖卮鈥屬佖必� 賴蹖趩.',
+    conversationsListLimitTip: '鬲毓丿丕丿 趩鬲鈥屬囏й屰� 讴賴 丿乇 蹖讴 丿乇禺賵丕爻鬲 亘乇诏乇丿丕賳丿賴 賲蹖鈥屫促堎嗀�',
+    conversationRenamingApi: '鬲睾蹖蹖乇 賳丕賲 賲讴丕賱賲賴',
+    conversationRenamingApiTip: '鬲睾蹖蹖乇 賳丕賲 賲讴丕賱賲丕鬲貨 賳丕賲 丿乇 乇丕亘胤鈥屬囏й� 讴丕乇亘乇蹖 趩賳丿 噩賱爻賴鈥屫й� 賳賲丕蹖卮 丿丕丿賴 賲蹖鈥屫促堌�.',
+    conversationRenamingNameTip: '賳丕賲 噩丿蹖丿',
+    parametersApi: '丿乇蹖丕賮鬲 丕胤賱丕毓丕鬲 倬丕乇丕賲鬲乇賴丕蹖 亘乇賳丕賲賴',
+    parametersApiTip: '亘丕夭蹖丕亘蹖 倬丕乇丕賲鬲乇賴丕蹖 賵乇賵丿蹖 倬蹖讴乇亘賳丿蹖 卮丿賴貙 卮丕賲賱 賳丕賲鈥屬囏й� 賲鬲睾蹖乇貙 賳丕賲鈥屬囏й� 賮蹖賱丿貙 丕賳賵丕毓 賵 賲賯丕丿蹖乇 倬蹖卮鈥屬佖必�. 賲毓賲賵賱丕賸 亘乇丕蹖 賳賲丕蹖卮 丕蹖賳 賮蹖賱丿賴丕 丿乇 蹖讴 賮乇賲 蹖丕 倬乇 讴乇丿賳 賲賯丕丿蹖乇 倬蹖卮鈥屬佖必� 倬爻 丕夭 亘丕乇诏蹖乇蹖 讴賱丕蹖賳鬲 丕爻鬲賮丕丿賴 賲蹖鈥屫促堌�.',
+  },
+  develop: {
+    requestBody: '亘丿賳賴 丿乇禺賵丕爻鬲',
+    pathParams: '倬丕乇丕賲鬲乇賴丕蹖 賲爻蹖乇',
+    query: '倬乇爻鈥屬堌�',
+    toc: '賲丨鬲賵蹖丕鬲',
+  },
+  regenerate: '亘丕夭爻丕夭蹖',
+}
+
+export default translation
diff --git a/i18n/fa-IR/app-debug.ts b/i18n/fa-IR/app-debug.ts
new file mode 100644
index 0000000..00891f3
--- /dev/null
+++ b/i18n/fa-IR/app-debug.ts
@@ -0,0 +1,455 @@
+const translation = {
+  pageTitle: {
+    line1: '倬乇賵賲倬鬲',
+    line2: '賲賴賳丿爻蹖',
+  },
+  orchestrate: '賴賲丕賴賳诏 讴乇丿賳',
+  promptMode: {
+    simple: '亘乇丕蹖 賵蹖乇丕蹖卮 讴賱 倬乇賵賲倬鬲 亘賴 丨丕賱鬲 讴丕乇卮賳丕爻 亘乇賵蹖丿',
+    advanced: '丨丕賱鬲 讴丕乇卮賳丕爻',
+    switchBack: '亘丕夭诏卮鬲',
+    advancedWarning: {
+      title: '卮賲丕 亘賴 丨丕賱鬲 讴丕乇卮賳丕爻 乇賮鬲賴鈥屫й屫� 賵 倬爻 丕夭 鬲睾蹖蹖乇 倬乇賵賲倬鬲貙 賳賲蹖鈥屫堌з嗃屫� 亘賴 丨丕賱鬲 爻丕丿賴 亘乇诏乇丿蹖丿.',
+      description: '丿乇 丨丕賱鬲 讴丕乇卮賳丕爻貙 賲蹖鈥屫堌з嗃屫� 讴賱 倬乇賵賲倬鬲 乇丕 賵蹖乇丕蹖卮 讴賳蹖丿.',
+      learnMore: '亘蹖卮鬲乇 亘丿丕賳蹖丿',
+      ok: '亘丕卮賴',
+    },
+    operation: {
+      addMessage: '丕囟丕賮賴 讴乇丿賳 倬蹖丕賲',
+    },
+    contextMissing: '賲賵賱賮賴 夭賲蹖賳賴鈥屫й� 丕夭 丿爻鬲 乇賮鬲賴 丕爻鬲貙 丕孬乇 亘禺卮蹖 倬乇賵賲倬鬲 賲賲讴賳 丕爻鬲 禺賵亘 賳亘丕卮丿.',
+  },
+  operation: {
+    applyConfig: '丕賳鬲卮丕乇',
+    resetConfig: '鬲賳馗蹖賲 賲噩丿丿',
+    debugConfig: '丿蹖亘丕诏',
+    addFeature: '丕囟丕賮賴 讴乇丿賳 賵蹖跇诏蹖',
+    automatic: '鬲賵賱蹖丿 讴乇丿賳',
+    stopResponding: '鬲賵賯賮 倬丕爻禺鈥屫囒�',
+    agree: '倬爻賳丿蹖丿賳',
+    disagree: '賳倬爻賳丿蹖丿賳',
+    cancelAgree: '賱睾賵 倬爻賳丿蹖丿賳',
+    cancelDisagree: '賱睾賵 賳倬爻賳丿蹖丿賳',
+    userAction: '毓賲賱 讴丕乇亘乇',
+  },
+  notSetAPIKey: {
+    title: '讴賱蹖丿 丕乇丕卅賴鈥屫囐嗀� LLM 鬲賳馗蹖賲 賳卮丿賴 丕爻鬲',
+    trailFinished: '丌夭賲丕蹖卮 鬲賲丕賲 卮丿',
+    description: '讴賱蹖丿 丕乇丕卅賴鈥屫囐嗀� LLM 鬲賳馗蹖賲 賳卮丿賴 丕爻鬲 賵 亘丕蹖丿 賯亘賱 丕夭 丿蹖亘丕诏 鬲賳馗蹖賲 卮賵丿.',
+    settingBtn: '亘賴 鬲賳馗蹖賲丕鬲 亘乇賵蹖丿',
+  },
+  trailUseGPT4Info: {
+    title: '丿乇 丨丕賱 丨丕囟乇 倬卮鬲蹖亘丕賳蹖 賳賲蹖鈥屫促堌� gpt-4',
+    description: '亘乇丕蹖 丕爻鬲賮丕丿賴 丕夭 gpt-4貙 賱胤賮丕賸 讴賱蹖丿 API 乇丕 鬲賳馗蹖賲 讴賳蹖丿.',
+  },
+  feature: {
+    groupChat: {
+      title: '鬲賯賵蹖鬲 诏賮鬲诏賵',
+      description: '丕賮夭賵丿賳 鬲賳馗蹖賲丕鬲 倬蹖卮 丕夭 诏賮鬲诏賵 亘乇丕蹖 亘乇賳丕賲賴鈥屬囏� 賲蹖鈥屫堌з嗀� 鬲噩乇亘賴 讴丕乇亘乇蹖 乇丕 亘賴亘賵丿 亘禺卮丿.',
+    },
+    groupExperience: {
+      title: '鬲賯賵蹖鬲 鬲噩乇亘賴',
+    },
+    conversationOpener: {
+      title: '卮乇賵毓鈥屭┵嗁嗀� 诏賮鬲诏賵',
+      description: '丿乇 蹖讴 亘乇賳丕賲賴 趩鬲貙 丕賵賱蹖賳 噩賲賱賴鈥屫й� 讴賴 AI 賮毓丕賱丕賳賴 亘丕 讴丕乇亘乇 氐丨亘鬲 賲蹖鈥屭┵嗀� 賲毓賲賵賱丕賸 亘賴 毓賳賵丕賳 禺賵卮丕賲丿诏賵蹖蹖 丕爻鬲賮丕丿賴 賲蹖鈥屫促堌�.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: '倬蹖诏蹖乇蹖',
+      description: '鬲賳馗蹖賲 倬蹖卮賳賴丕丿 爻賵丕賱丕鬲 亘毓丿蹖 賲蹖鈥屫堌з嗀� 亘賴 讴丕乇亘乇丕賳 蹖讴 趩鬲 亘賴鬲乇 丕乇丕卅賴 丿賴丿.',
+      resDes: '3 倬蹖卮賳賴丕丿 亘乇丕蹖 爻賵丕賱 亘毓丿蹖 讴丕乇亘乇.',
+      tryToAsk: '爻毓蹖 讴賳蹖丿 亘倬乇爻蹖丿',
+    },
+    moreLikeThis: {
+      title: '亘蹖卮鬲乇 丕夭 丕蹖賳',
+      description: '鬲賵賱蹖丿 趩賳丿蹖賳 賲鬲賳 亘賴 胤賵乇 賴賲夭賲丕賳貙 賵 爻倬爻 賵蹖乇丕蹖卮 賵 丕丿丕賲賴 鬲賵賱蹖丿',
+      generateNumTip: '鬲毓丿丕丿 鬲賵賱蹖丿 賴乇 亘丕乇',
+      tip: '丕爻鬲賮丕丿賴 丕夭 丕蹖賳 賵蹖跇诏蹖 賴夭蹖賳賴鈥屬囏й� 丕囟丕賮蹖 鬲賵讴賳鈥屬囏� 乇丕 亘賴 賴賲乇丕賴 丿丕乇丿',
+    },
+    speechToText: {
+      title: '鬲亘丿蹖賱 诏賮鬲丕乇 亘賴 賲鬲賳',
+      description: '倬爻 丕夭 賮毓丕賱 卮丿賳貙 賲蹖鈥屫堌з嗃屫� 丕夭 賵乇賵丿蹖 氐賵鬲蹖 丕爻鬲賮丕丿賴 讴賳蹖丿.',
+      resDes: '賵乇賵丿蹖 氐賵鬲蹖 賮毓丕賱 卮丿賴 丕爻鬲',
+    },
+    textToSpeech: {
+      title: '鬲亘丿蹖賱 賲鬲賳 亘賴 诏賮鬲丕乇',
+      description: '倬爻 丕夭 賮毓丕賱 卮丿賳貙 賲鬲賳 賲蹖鈥屫堌з嗀� 亘賴 诏賮鬲丕乇 鬲亘丿蹖賱 卮賵丿.',
+      resDes: '鬲亘丿蹖賱 賲鬲賳 亘賴 氐丿丕 賮毓丕賱 卮丿賴 丕爻鬲',
+    },
+    citation: {
+      title: '丕乇噩丕毓丕鬲 賵 丕爻鬲賳丕丿丕鬲',
+      description: '倬爻 丕夭 賮毓丕賱 卮丿賳貙 爻賳丿 賲賳亘毓 賵 亘禺卮 丕爻鬲賳丕丿 卮丿賴 丕夭 賲丨鬲賵丕蹖 鬲賵賱蹖丿 卮丿賴 乇丕 賳卮丕賳 賲蹖鈥屫囏�.',
+      resDes: '丕乇噩丕毓丕鬲 賵 丕爻鬲賳丕丿丕鬲 賮毓丕賱 卮丿賴 丕爻鬲',
+    },
+    annotation: {
+      title: '倬丕爻禺 丨丕卮蹖賴鈥屬嗁堐屫驰�',
+      description: '賲蹖鈥屫堌з嗃屫� 倬丕爻禺鈥屬囏й� 亘丕 讴蹖賮蹖鬲 亘丕賱丕 乇丕 亘賴 氐賵乇鬲 丿爻鬲蹖 亘賴 丨丕賮馗賴 讴卮 丕囟丕賮賴 讴賳蹖丿 鬲丕 亘丕 爻賵丕賱丕鬲 賲卮丕亘賴 讴丕乇亘乇丕賳 鬲胤亘蹖賯 蹖丕亘丿.',
+      resDes: '倬丕爻禺 丨丕卮蹖賴鈥屬嗁堐屫驰� 賮毓丕賱 卮丿賴 丕爻鬲',
+      scoreThreshold: {
+        title: '丌爻鬲丕賳賴 丕賲鬲蹖丕夭',
+        description: 'Used to set the similarity threshold for annotation reply.',
+        easyMatch: '鬲胤丕亘賯 丌爻丕賳',
+        accurateMatch: '鬲胤丕亘賯 丿賯蹖賯',
+      },
+      matchVariable: {
+        title: '鬲睾蹖蹖乇 賲鬲睾蹖乇',
+        choosePlaceholder: '丕賳鬲禺丕亘 賲鬲睾蹖乇 鬲睾蹖蹖乇',
+      },
+      cacheManagement: '丨丕卮蹖賴 賳賵蹖爻蹖',
+      cached: '丨丕卮蹖賴 賳賵蹖爻蹖 卮丿賴',
+      remove: '丨匕賮',
+      removeConfirm: '丕蹖賳 丨丕卮蹖賴 賳賵蹖爻蹖 乇丕 丨匕賮 讴賳蹖丿責',
+      add: '丕賮夭賵丿賳 丨丕卮蹖賴 賳賵蹖爻蹖',
+      edit: '賵蹖乇丕蹖卮 丨丕卮蹖賴 賳賵蹖爻蹖',
+    },
+    dataSet: {
+      title: '夭賲蹖賳賴',
+      noData: '卮賲丕 賲蹖鈥屫堌з嗃屫� 丿丕賳卮 乇丕 亘賴 毓賳賵丕賳 夭賲蹖賳賴 賵丕乇丿 讴賳蹖丿',
+      words: '讴賱賲丕鬲',
+      textBlocks: '亘賱賵讴鈥屬囏й� 賲鬲賳',
+      selectTitle: '丕賳鬲禺丕亘 丿丕賳卮 賲乇噩毓',
+      selected: '丿丕賳卮 丕賳鬲禺丕亘 卮丿賴',
+      noDataSet: '賴蹖趩 丿丕賳卮蹖 蹖丕賮鬲 賳卮丿',
+      toCreate: '亘乇丕蹖 丕蹖噩丕丿 亘乇賵蹖丿',
+      notSupportSelectMulti: '丿乇 丨丕賱 丨丕囟乇 賮賯胤 蹖讴 丿丕賳卮 倬卮鬲蹖亘丕賳蹖 賲蹖鈥屫促堌�',
+      queryVariable: {
+        title: '賲鬲睾蹖乇 倬乇爻 賵 噩賵',
+        tip: '丕蹖賳 賲鬲睾蹖乇 亘賴 毓賳賵丕賳 賵乇賵丿蹖 倬乇爻 賵 噩賵 亘乇丕蹖 亘丕夭蹖丕亘蹖 夭賲蹖賳賴 丕爻鬲賮丕丿賴 禺賵丕賴丿 卮丿 賵 丕胤賱丕毓丕鬲 夭賲蹖賳賴 賲乇鬲亘胤 亘丕 賵乇賵丿蹖 丕蹖賳 賲鬲睾蹖乇 乇丕 亘賴 丿爻鬲 賲蹖鈥屫①堌必�.',
+        choosePlaceholder: '丕賳鬲禺丕亘 賲鬲睾蹖乇 倬乇爻 賵 噩賵',
+        noVar: '亘丿賵賳 賲鬲睾蹖乇',
+        noVarTip: '賱胤賮丕賸 賲鬲睾蹖乇蹖 乇丕 丿乇 亘禺卮 賲鬲睾蹖乇賴丕 丕蹖噩丕丿 讴賳蹖丿',
+        unableToQueryDataSet: '毓丿賲 丕賲讴丕賳 倬乇爻 賵 噩賵 丕夭 丿丕賳卮',
+        unableToQueryDataSetTip: '倬乇爻 賵 噩賵蹖 賲賵賮賯蹖鬲 丌賲蹖夭 丿丕賳卮 賲賲讴賳 賳蹖爻鬲貙 賱胤賮丕賸 蹖讴 賲鬲睾蹖乇 倬乇爻 賵 噩賵 夭賲蹖賳賴 乇丕 丿乇 亘禺卮 夭賲蹖賳賴 丕賳鬲禺丕亘 讴賳蹖丿.',
+        ok: '亘丕卮賴',
+        contextVarNotEmpty: '賲鬲睾蹖乇 倬乇爻 賵 噩賵 夭賲蹖賳賴 賳賲蹖鈥屫堌з嗀� 禺丕賱蹖 亘丕卮丿',
+        deleteContextVarTitle: '賲鬲睾蹖乇 "{{varName}}" 乇丕 丨匕賮 讴賳蹖丿責',
+        deleteContextVarTip: '丕蹖賳 賲鬲睾蹖乇 亘賴 毓賳賵丕賳 賲鬲睾蹖乇 倬乇爻 賵 噩賵 夭賲蹖賳賴 鬲賳馗蹖賲 卮丿賴 丕爻鬲 賵 丨匕賮 丌賳 亘乇 丕爻鬲賮丕丿賴 毓丕丿蹖 丕夭 丿丕賳卮 鬲兀孬蹖乇 賲蹖鈥屭柏ж必�. 丕诏乇 賴賳賵夭 賳蹖丕夭 亘賴 丨匕賮 丿丕乇蹖丿貙 賱胤賮丕賸 丌賳 乇丕 丿乇 亘禺卮 夭賲蹖賳賴 丿賵亘丕乇賴 丕賳鬲禺丕亘 讴賳蹖丿.',
+      },
+    },
+    tools: {
+      title: '丕亘夭丕乇賴丕',
+      tips: '丕亘夭丕乇賴丕 蹖讴 乇賵卮 丕爻鬲丕賳丿丕乇丿 亘乇丕蹖 賮乇丕禺賵丕賳蹖 API 賮乇丕賴賲 賲蹖鈥屭┵嗁嗀� 賵 賵乇賵丿蹖 讴丕乇亘乇 蹖丕 賲鬲睾蹖乇賴丕 乇丕 亘賴 毓賳賵丕賳 倬丕乇丕賲鬲乇賴丕蹖 丿乇禺賵丕爻鬲 亘乇丕蹖 倬乇爻 賵 噩賵 丿丕丿賴鈥屬囏й� 禺丕乇噩蹖 亘賴 毓賳賵丕賳 夭賲蹖賳賴 賲蹖鈥屭屫辟嗀�.',
+      toolsInUse: '{{count}} 丕亘夭丕乇 丿乇 丨丕賱 丕爻鬲賮丕丿賴',
+      modal: {
+        title: '丕亘夭丕乇',
+        toolType: {
+          title: '賳賵毓 丕亘夭丕乇',
+          placeholder: '賱胤賮丕賸 賳賵毓 丕亘夭丕乇 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+        },
+        name: {
+          title: '賳丕賲',
+          placeholder: '賱胤賮丕賸 賳丕賲 乇丕 賵丕乇丿 讴賳蹖丿',
+        },
+        variableName: {
+          title: '賳丕賲 賲鬲睾蹖乇',
+          placeholder: '賱胤賮丕賸 賳丕賲 賲鬲睾蹖乇 乇丕 賵丕乇丿 讴賳蹖丿',
+        },
+      },
+    },
+    conversationHistory: {
+      title: '鬲丕乇蹖禺趩賴 賲讴丕賱賲賴',
+      description: '鬲賳馗蹖賲 倬蹖卮賵賳丿 賳丕賲鈥屬囏� 亘乇丕蹖 賳賯卮鈥屬囏й� 賲讴丕賱賲賴',
+      tip: '鬲丕乇蹖禺趩賴 賲讴丕賱賲賴 賮毓丕賱 賳卮丿賴 丕爻鬲貙 賱胤賮丕賸 <histories> 乇丕 丿乇 賮乇丕禺賵丕賳蹖 亘丕賱丕 丕囟丕賮賴 讴賳蹖丿.',
+      learnMore: '亘蹖卮鬲乇 亘丿丕賳蹖丿',
+      editModal: {
+        title: '賵蹖乇丕蹖卮 賳丕賲 賳賯卮鈥屬囏й� 賲讴丕賱賲賴',
+        userPrefix: '倬蹖卮賵賳丿 讴丕乇亘乇',
+        assistantPrefix: '倬蹖卮賵賳丿 丿爻鬲蹖丕乇',
+      },
+    },
+    toolbox: {
+      title: '噩毓亘賴 丕亘夭丕乇',
+    },
+    moderation: {
+      title: '賲丿蹖乇蹖鬲 賲丨鬲賵丕',
+      description: '禺乇賵噩蹖 賲丿賱 乇丕 亘丕 丕爻鬲賮丕丿賴 丕夭 API 賲丿蹖乇蹖鬲 蹖丕 賳诏賴丿丕乇蹖 賮賴乇爻鬲 讴賱賲丕鬲 丨爻丕爻 丕賲賳 讴賳蹖丿.',
+      allEnabled: '賲丨鬲賵丕蹖 賵乇賵丿蹖/禺乇賵噩蹖 賮毓丕賱 卮丿賴',
+      inputEnabled: '賲丨鬲賵丕蹖 賵乇賵丿蹖 賮毓丕賱 卮丿賴',
+      outputEnabled: '賲丨鬲賵丕蹖 禺乇賵噩蹖 賮毓丕賱 卮丿賴',
+      modal: {
+        title: '鬲賳馗蹖賲丕鬲 賲丿蹖乇蹖鬲 賲丨鬲賵丕',
+        provider: {
+          title: '丕乇丕卅賴 丿賴賳丿賴',
+          openai: '賲丿蹖乇蹖鬲 OpenAI',
+          openaiTip: {
+            prefix: '賲丿蹖乇蹖鬲 OpenAI 賳蹖丕夭 亘賴 讴賱蹖丿 API OpenAI 丿丕乇丿 讴賴 丿乇 ',
+            suffix: ' 鬲賳馗蹖賲 卮丿賴 亘丕卮丿.',
+          },
+          keywords: '讴賱賲丕鬲 讴賱蹖丿蹖',
+        },
+        keywords: {
+          tip: '賴乇 禺胤 蹖讴 讴賱賲賴貙 亘丕 卮讴爻鬲 禺胤賵胤 噩丿丕 卮丿賴. 丨丿丕讴孬乇 100 讴丕乇丕讴鬲乇 丿乇 賴乇 禺胤.',
+          placeholder: '賴乇 禺胤 蹖讴 讴賱賲賴貙 亘丕 卮讴爻鬲 禺胤賵胤 噩丿丕 卮丿賴',
+          line: '禺胤',
+        },
+        content: {
+          input: '賲丿蹖乇蹖鬲 賲丨鬲賵丕蹖 賵乇賵丿蹖',
+          output: '賲丿蹖乇蹖鬲 賲丨鬲賵丕蹖 禺乇賵噩蹖',
+          preset: '倬丕爻禺鈥屬囏й� 倬蹖卮 賮乇囟',
+          placeholder: '賲丨鬲賵丕蹖 倬丕爻禺鈥屬囏й� 倬蹖卮 賮乇囟 丿乇 丕蹖賳噩丕',
+          condition: '賲丿蹖乇蹖鬲 賲丨鬲賵丕蹖 賵乇賵丿蹖 賵 禺乇賵噩蹖 丨丿丕賯賱 蹖讴 賲賵乇丿 賮毓丕賱 卮丿賴 丕爻鬲',
+          fromApi: '倬丕爻禺鈥屬囏й� 倬蹖卮 賮乇囟 丕夭 API 亘乇诏乇丿丕賳丿賴 賲蹖鈥屫促堌�',
+          errorMessage: '倬丕爻禺鈥屬囏й� 倬蹖卮 賮乇囟 賳賲蹖鈥屫堌з嗀� 禺丕賱蹖 亘丕卮丿',
+          supportMarkdown: '倬卮鬲蹖亘丕賳蹖 丕夭 Markdown',
+        },
+        openaiNotConfig: {
+          before: '賲丿蹖乇蹖鬲 OpenAI 賳蹖丕夭 亘賴 讴賱蹖丿 API OpenAI 丿丕乇丿 讴賴 丿乇',
+          after: '',
+        },
+      },
+    },
+    generate: {
+      title: '鬲賵賱蹖丿 讴賳賳丿賴 丿爻鬲賵乇丕賱毓賲賱',
+      description: '鬲賵賱蹖丿 讴賳賳丿賴 丿爻鬲賵乇丕賱毓賲賱 丕夭 賲丿賱 鬲賳馗蹖賲 卮丿賴 亘乇丕蹖 亘賴蹖賳賴 爻丕夭蹖 丿爻鬲賵乇丕賱毓賲賱鈥屬囏� 亘乇丕蹖 讴蹖賮蹖鬲 亘丕賱丕鬲乇 賵 爻丕禺鬲丕乇 亘賴鬲乇 丕爻鬲賮丕丿賴 賲蹖鈥屭┵嗀�. 賱胤賮丕賸 丿爻鬲賵乇丕賱毓賲賱鈥屬囏й� 賵丕囟丨 賵 丿賯蹖賯蹖 亘賳賵蹖爻蹖丿.',
+      tryIt: '丕賲鬲丨丕賳 讴賳蹖丿',
+      instruction: '丿爻鬲賵乇丕賱毓賲賱鈥屬囏�',
+      instructionPlaceHolder: '丿爻鬲賵乇丕賱毓賲賱鈥屬囏й� 賵丕囟丨 賵 禺丕氐蹖 亘賳賵蹖爻蹖丿.',
+      generate: '鬲賵賱蹖丿',
+      resTitle: '丿爻鬲賵乇丕賱毓賲賱 鬲賵賱蹖丿 卮丿賴',
+      noDataLine1: '賲賵丕乇丿 丕爻鬲賮丕丿賴 禺賵丿 乇丕 丿乇 爻賲鬲 趩倬 鬲賵氐蹖賮 讴賳蹖丿貙',
+      noDataLine2: '倬蹖卮鈥屬嗁呚й屫� 丕乇讴爻鬲乇丕爻蹖賵賳 丿乇 丕蹖賳噩丕 賳卮丕賳 丿丕丿賴 禺賵丕賴丿 卮丿.',
+      apply: '丕毓賲丕賱',
+      loading: '丿乇 丨丕賱 丕乇讴爻鬲乇丕爻蹖賵賳 亘乇賳丕賲賴 亘乇丕蹖 卮賲丕...',
+      overwriteTitle: '丌蹖丕 鬲賳馗蹖賲丕鬲 賲賵噩賵丿 乇丕 賱睾賵 賲蹖鈥屭┵嗃屫�',
+      overwriteMessage: '丕毓賲丕賱 丕蹖賳 丿爻鬲賵乇丕賱毓賲賱 鬲賳馗蹖賲丕鬲 賲賵噩賵丿 乇丕 賱睾賵 禺賵丕賴丿 讴乇丿.',
+      template: {
+        pythonDebugger: {
+          name: '丕卮讴丕賱鈥屫藏й� 倬丕蹖鬲賵賳',
+          instruction: '蹖讴 亘丕鬲 讴賴 賲蹖鈥屫堌з嗀� 亘乇 丕爻丕爻 丿爻鬲賵乇丕賱毓賲賱 卮賲丕 讴丿 鬲賵賱蹖丿 賵 丕卮讴丕賱鈥屫藏й屰� 讴賳丿',
+        },
+        translation: {
+          name: '鬲乇噩賲賴',
+          instruction: '蹖讴 賲鬲乇噩賲 讴賴 賲蹖鈥屫堌з嗀� 趩賳丿蹖賳 夭亘丕賳 乇丕 鬲乇噩賲賴 讴賳丿',
+        },
+        professionalAnalyst: {
+          name: '鬲丨賱蹖賱诏乇 丨乇賮賴鈥屫й�',
+          instruction: '丕爻鬲禺乇丕噩 亘蹖賳卮鈥屬囏ж� 卮賳丕爻丕蹖蹖 乇蹖爻讴 賵 禺賱丕氐賴鈥屫池ж槽� 丕胤賱丕毓丕鬲 讴賱蹖丿蹖 丕夭 诏夭丕乇卮鈥屬囏й� 胤賵賱丕賳蹖 亘賴 蹖讴 蹖丕丿丿丕卮鬲 讴賵鬲丕賴',
+        },
+        excelFormulaExpert: {
+          name: '讴丕乇卮賳丕爻 賮乇賲賵賱 丕讴爻賱',
+          instruction: '蹖讴 趩鬲鈥屫ㄘж� 讴賴 賲蹖鈥屫堌з嗀� 亘賴 讴丕乇亘乇丕賳 賲亘鬲丿蹖 讴賲讴 讴賳丿 賮乇賲賵賱鈥屬囏й� 丕讴爻賱 乇丕 亘乇 丕爻丕爻 丿爻鬲賵乇丕賱毓賲賱鈥屬囏й� 讴丕乇亘乇 丿乇讴貙 丕爻鬲賮丕丿賴 賵 丕蹖噩丕丿 讴賳賳丿',
+        },
+        travelPlanning: {
+          name: '亘乇賳丕賲賴鈥屫臂屫槽� 爻賮乇',
+          instruction: '丿爻鬲蹖丕乇 亘乇賳丕賲賴鈥屫臂屫槽� 爻賮乇 蹖讴 丕亘夭丕乇 賴賵卮賲賳丿 丕爻鬲 讴賴 亘賴 讴丕乇亘乇丕賳 讴賲讴 賲蹖鈥屭┵嗀� 爻賮乇賴丕蹖 禺賵丿 乇丕 亘賴 乇丕丨鬲蹖 亘乇賳丕賲賴鈥屫臂屫槽� 讴賳賳丿',
+        },
+        SQLSorcerer: {
+          name: '噩丕丿賵诏乇 SQL',
+          instruction: '鬲亘丿蹖賱 夭亘丕賳 乇賵夭賲乇賴 亘賴 倬乇爻 賵 噩賵賴丕蹖 SQL',
+        },
+        GitGud: {
+          name: 'Git gud',
+          instruction: '鬲賵賱蹖丿 丿爻鬲賵乇丕鬲 賲賳丕爻亘 Git 亘乇 丕爻丕爻 丕賯丿丕賲丕鬲 鬲賵氐蹖賮 卮丿賴 鬲賵爻胤 讴丕乇亘乇 丿乇 讴賳鬲乇賱 賳爻禺賴',
+        },
+        meetingTakeaways: {
+          name: '賳鬲丕蹖噩 噩賱爻丕鬲',
+          instruction: '禺賱丕氐賴鈥屫池ж槽� 噩賱爻丕鬲 亘賴 氐賵乇鬲 賲禺鬲氐乇 卮丕賲賱 賲賵囟賵毓丕鬲 亘丨孬貙 賳讴丕鬲 讴賱蹖丿蹖 賵 賲賵丕乇丿 丕賯丿丕賲',
+        },
+        writingsPolisher: {
+          name: '倬賵賱蹖卮鈥屭� 賳賵卮鬲賴鈥屬囏�',
+          instruction: '丕爻鬲賮丕丿賴 丕夭 鬲讴賳蹖讴鈥屬囏й� 賵蹖乇丕蹖卮 倬蹖卮乇賮鬲賴 亘乇丕蹖 亘賴亘賵丿 賳賵卮鬲賴鈥屬囏й� 卮賲丕',
+        },
+      },
+    },
+    resetConfig: {
+      title: '亘丕夭賳卮丕賳蹖 鬲兀蹖蹖丿 賲蹖鈥屫促堌�',
+      message: '亘丕夭賳卮丕賳蹖 鬲睾蹖蹖乇丕鬲 乇丕 賱睾賵 讴乇丿賴 賵 鬲賳馗蹖賲丕鬲 賲賳鬲卮乇 卮丿賴 丌禺乇 乇丕 亘丕夭蹖丕亘蹖 賲蹖鈥屭┵嗀�.',
+    },
+    errorMessage: {
+      nameOfKeyRequired: '賳丕賲 讴賱蹖丿: {{key}} 賲賵乇丿 賳蹖丕夭 丕爻鬲',
+      valueOfVarRequired: '賲賯丿丕乇 {{key}} 賳賲蹖鈥屫堌з嗀� 禺丕賱蹖 亘丕卮丿',
+      queryRequired: '賲鬲賳 丿乇禺賵丕爻鬲 賲賵乇丿 賳蹖丕夭 丕爻鬲.',
+      waitForResponse: '賱胤賮丕賸 賲賳鬲馗乇 倬丕爻禺 亘賴 倬蹖丕賲 賯亘賱蹖 亘賲丕賳蹖丿.',
+      waitForBatchResponse: '賱胤賮丕賸 賲賳鬲馗乇 倬丕爻禺 亘賴 讴丕乇 丿爻鬲賴鈥屫й� 亘賲丕賳蹖丿.',
+      notSelectModel: '賱胤賮丕賸 蹖讴 賲丿賱 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+      waitForImgUpload: '賱胤賮丕賸 賲賳鬲馗乇 亘丕乇诏匕丕乇蹖 鬲氐賵蹖乇 亘賲丕賳蹖丿',
+    },
+    chatSubTitle: '丿爻鬲賵乇丕賱毓賲賱鈥屬囏�',
+    completionSubTitle: '倬蹖卮賵賳丿 倬乇爻 賵 噩賵',
+    promptTip: '丿爻鬲賵乇丕賱毓賲賱鈥屬囏� 賵 賲丨丿賵丿蹖鬲鈥屬囏� 倬丕爻禺鈥屬囏й� AI 乇丕 賴丿丕蹖鬲 賲蹖鈥屭┵嗁嗀�. 賲鬲睾蹖乇賴丕蹖蹖 賲丕賳賳丿 {{input}} 乇丕 丿乇噩 讴賳蹖丿. 丕蹖賳 丿爻鬲賵乇丕賱毓賲賱 亘乇丕蹖 讴丕乇亘乇丕賳 賯丕亘賱 賲卮丕賴丿賴 賳禺賵丕賴丿 亘賵丿.',
+    formattingChangedTitle: '賯丕賱亘鈥屫ㄙ嗀� 鬲睾蹖蹖乇 讴乇丿',
+    formattingChangedText: '鬲睾蹖蹖乇 賯丕賱亘鈥屫ㄙ嗀� 賲賳胤賯賴 丕卮讴丕賱鈥屫藏й屰� 乇丕 亘丕夭賳卮丕賳蹖 禺賵丕賴丿 讴乇丿貙 丌蹖丕 賲胤賲卅賳 賴爻鬲蹖丿責',
+    variableTitle: '賲鬲睾蹖乇賴丕',
+    variableTip: '讴丕乇亘乇丕賳 賲鬲睾蹖乇賴丕 乇丕 丿乇 賮乇賲 倬乇 賲蹖鈥屭┵嗁嗀� 賵 亘賴 胤賵乇 禺賵丿讴丕乇 賲鬲睾蹖乇賴丕 乇丕 丿乇 丿爻鬲賵乇丕賱毓賲賱鈥屬囏� 噩丕蹖诏夭蹖賳 賲蹖鈥屭┵嗁嗀�.',
+    notSetVar: '賲鬲睾蹖乇賴丕 亘賴 讴丕乇亘乇丕賳 丕噩丕夭賴 賲蹖鈥屫囐嗀� 讴賴 讴賱賲丕鬲 倬乇爻 賵 噩賵 蹖丕 噩賲賱丕鬲 丕亘鬲丿丕蹖蹖 乇丕 賴賳诏丕賲 倬乇 讴乇丿賳 賮乇賲 賲毓乇賮蹖 讴賳賳丿. 卮賲丕 賲蹖鈥屫堌з嗃屫� 爻毓蹖 讴賳蹖丿 "{{input}}" 乇丕 丿乇 讴賱賲丕鬲 倬乇爻 賵 噩賵 賵丕乇丿 讴賳蹖丿.',
+    autoAddVar: '賲鬲睾蹖乇賴丕蹖 鬲毓乇蹖賮 賳卮丿賴鈥屫й� 讴賴 丿乇 倬蹖卮鈥屬矩必池� 匕讴乇 卮丿賴鈥屫з嗀� 丌蹖丕 賲蹖鈥屫堌з囒屫� 丌賳賴丕 乇丕 亘賴 賮乇賲 賵乇賵丿蹖 讴丕乇亘乇 丕囟丕賮賴 讴賳蹖丿責',
+    variableTable: {
+      key: '讴賱蹖丿 賲鬲睾蹖乇',
+      name: '賳丕賲 賮蹖賱丿 賵乇賵丿蹖 讴丕乇亘乇',
+      optional: '丕禺鬲蹖丕乇蹖',
+      type: '賳賵毓 賵乇賵丿蹖',
+      action: '丕賯丿丕賲丕鬲',
+      typeString: '乇卮鬲賴',
+      typeSelect: '丕賳鬲禺丕亘',
+    },
+    varKeyError: {
+      canNoBeEmpty: '{{key}} 賲胤賱賵亘',
+      tooLong: '{{key}} 胤賵賱丕賳蹖 丕爻鬲. 賳賲蹖鈥屫堌з嗀� 亘蹖卮 丕夭 30 讴丕乇丕讴鬲乇 亘丕卮丿',
+      notValid: '{{key}} 賳丕賲毓鬲亘乇 丕爻鬲. 賮賯胤 賲蹖鈥屫堌з嗀� 卮丕賲賱 丨乇賵賮貙 丕毓丿丕丿 賵 夭蹖乇禺胤 亘丕卮丿',
+      notStartWithNumber: '{{key}} 賳賲蹖鈥屫堌з嗀� 亘丕 毓丿丿 卮乇賵毓 卮賵丿',
+      keyAlreadyExists: '{{key}} 丕夭 賯亘賱 賵噩賵丿 丿丕乇丿',
+    },
+    otherError: {
+      promptNoBeEmpty: '倬乇爻 賵 噩賵 賳賲蹖鈥屫堌з嗀� 禺丕賱蹖 亘丕卮丿',
+      historyNoBeEmpty: '鬲丕乇蹖禺趩賴 賲讴丕賱賲賴 亘丕蹖丿 丿乇 倬乇爻 賵 噩賵 鬲賳馗蹖賲 卮賵丿',
+      queryNoBeEmpty: '倬乇爻 賵 噩賵 亘丕蹖丿 丿乇 倬乇爻 賵 噩賵 鬲賳馗蹖賲 卮賵丿',
+    },
+    variableConfig: {
+      'addModalTitle': '丕賮夭賵丿賳 賮蹖賱丿 賵乇賵丿蹖',
+      'editModalTitle': '賵蹖乇丕蹖卮 賮蹖賱丿 賵乇賵丿蹖',
+      'description': '鬲賳馗蹖賲 亘乇丕蹖 賲鬲睾蹖乇 {{varName}}',
+      'fieldType': '賳賵毓 賮蹖賱丿',
+      'string': '賲鬲賳 讴賵鬲丕賴',
+      'text-input': '賲鬲賳 讴賵鬲丕賴',
+      'paragraph': '倬丕乇丕诏乇丕賮',
+      'select': '丕賳鬲禺丕亘',
+      'number': '毓丿丿',
+      'notSet': '鬲賳馗蹖賲 賳卮丿賴貙 爻毓蹖 讴賳蹖丿 {{input}} 乇丕 丿乇 倬乇爻 賵 噩賵 賵丕乇丿 讴賳蹖丿',
+      'stringTitle': '诏夭蹖賳賴鈥屬囏й� 噩毓亘賴 賲鬲賳 賮乇賲',
+      'maxLength': '丨丿丕讴孬乇 胤賵賱',
+      'options': '诏夭蹖賳賴鈥屬囏�',
+      'addOption': '丕賮夭賵丿賳 诏夭蹖賳賴',
+      'apiBasedVar': '賲鬲睾蹖乇 賲亘鬲賳蹖 亘乇 API',
+      'varName': '賳丕賲 賲鬲睾蹖乇',
+      'labelName': '賳丕賲 亘乇趩爻亘',
+      'inputPlaceholder': '賱胤賮丕賸 賵丕乇丿 讴賳蹖丿',
+      'content': '賲丨鬲賵丕',
+      'required': '賲賵乇丿 賳蹖丕夭',
+      'errorMsg': {
+        varNameRequired: '賳丕賲 賲鬲睾蹖乇 賲賵乇丿 賳蹖丕夭 丕爻鬲',
+        labelNameRequired: '賳丕賲 亘乇趩爻亘 賲賵乇丿 賳蹖丕夭 丕爻鬲',
+        varNameCanBeRepeat: '賳丕賲 賲鬲睾蹖乇 賳賲蹖鈥屫堌з嗀� 鬲讴乇丕乇蹖 亘丕卮丿',
+        atLeastOneOption: '丨丿丕賯賱 蹖讴 诏夭蹖賳賴 賲賵乇丿 賳蹖丕夭 丕爻鬲',
+        optionRepeat: '诏夭蹖賳賴鈥屬囏й� 鬲讴乇丕乇蹖 賵噩賵丿 丿丕乇丿',
+      },
+    },
+    vision: {
+      name: '亘蹖賳丕蹖蹖',
+      description: '賮毓丕賱 讴乇丿賳 亘蹖賳丕蹖蹖 亘賴 賲丿賱 丕噩丕夭賴 賲蹖鈥屫囏� 鬲氐丕賵蹖乇 乇丕 丿乇蹖丕賮鬲 讴賳丿 賵 亘賴 爻賵丕賱丕鬲 賲乇亘賵胤 亘賴 丌賳賴丕 倬丕爻禺 丿賴丿.',
+      settings: '鬲賳馗蹖賲丕鬲',
+      visionSettings: {
+        title: '鬲賳馗蹖賲丕鬲 亘蹖賳丕蹖蹖',
+        resolution: '賵囟賵丨',
+        resolutionTooltip: `賵囟賵丨 倬丕蹖蹖賳 亘賴 賲丿賱 丕噩丕夭賴 賲蹖鈥屫囏� 賳爻禺賴 512x512 讴賲鈥屬堌顿堌� 鬲氐賵蹖乇 乇丕 丿乇蹖丕賮鬲 讴賳丿 賵 鬲氐賵蹖乇 乇丕 亘丕 亘賵丿噩賴 65 鬲賵讴賳 賳賲丕蹖卮 丿賴丿. 丕蹖賳 亘賴 API 丕噩丕夭賴 賲蹖鈥屫囏� 倬丕爻禺鈥屬囏й� 爻乇蹖毓鈥屫臂� 亘丿賴丿 賵 鬲賵讴賳鈥屬囏й� 賵乇賵丿蹖 讴賲鬲乇蹖 亘乇丕蹖 賲賵丕乇丿 丕爻鬲賮丕丿賴 讴賴 賳蹖丕夭 亘賴 噩夭卅蹖丕鬲 亘丕賱丕 賳丿丕乇賳丿 賲氐乇賮 讴賳丿.
+          \n
+          賵囟賵丨 亘丕賱丕 丕亘鬲丿丕 亘賴 賲丿賱 丕噩丕夭賴 賲蹖鈥屫囏� 鬲氐賵蹖乇 讴賲鈥屬堌顿堌� 乇丕 亘亘蹖賳丿 賵 爻倬爻 賯胤毓丕鬲 噩夭卅蹖丕鬲 鬲氐賵蹖乇 賵乇賵丿蹖 乇丕 亘賴 毓賳賵丕賳 賲乇亘毓鈥屬囏й� 512px 丕蹖噩丕丿 讴賳丿. 賴乇 讴丿丕賲 丕夭 賯胤毓丕鬲 噩夭卅蹖丕鬲 丕夭 亘賵丿噩賴 鬲賵讴賳 丿賵 亘乇丕亘乇 丕爻鬲賮丕丿賴 賲蹖鈥屭┵嗁嗀� 讴賴 丿乇 賲噩賲賵毓 129 鬲賵讴賳 丕爻鬲.`,
+        high: '亘丕賱丕',
+        low: '倬丕蹖蹖賳',
+        uploadMethod: '乇賵卮 亘丕乇诏匕丕乇蹖',
+        both: '賴乇 丿賵',
+        localUpload: '亘丕乇诏匕丕乇蹖 賲丨賱蹖',
+        url: 'URL',
+        uploadLimit: '賲丨丿賵丿蹖鬲 亘丕乇诏匕丕乇蹖',
+      },
+    },
+    voice: {
+      name: '氐丿丕',
+      defaultDisplay: '氐丿丕 倬蹖卮 賮乇囟',
+      description: '鬲賳馗蹖賲丕鬲 鬲亘丿蹖賱 賲鬲賳 亘賴 诏賮鬲丕乇',
+      settings: '鬲賳馗蹖賲丕鬲',
+      voiceSettings: {
+        title: '鬲賳馗蹖賲丕鬲 氐丿丕',
+        language: '夭亘丕賳',
+        resolutionTooltip: '倬卮鬲蹖亘丕賳蹖 丕夭 夭亘丕賳 氐丿丕蹖 鬲亘丿蹖賱 賲鬲賳 亘賴 诏賮鬲丕乇.',
+        voice: '氐丿丕',
+        autoPlay: '倬禺卮 禺賵丿讴丕乇',
+        autoPlayEnabled: '乇賵卮賳 讴乇丿賳',
+        autoPlayDisabled: '禺丕賲賵卮 讴乇丿賳',
+      },
+    },
+    openingStatement: {
+      title: '卮乇賵毓 賲讴丕賱賲賴',
+      add: '丕賮夭賵丿賳',
+      writeOpener: '賳賵卮鬲賳 丌睾丕夭诏乇',
+      placeholder: '倬蹖丕賲 丌睾丕夭诏乇 禺賵丿 乇丕 丕蹖賳噩丕 亘賳賵蹖爻蹖丿貙 賲蹖鈥屫堌з嗃屫� 丕夭 賲鬲睾蹖乇賴丕 丕爻鬲賮丕丿賴 讴賳蹖丿貙 爻毓蹖 讴賳蹖丿 {{variable}} 乇丕 鬲丕蹖倬 讴賳蹖丿.',
+      openingQuestion: '爻賵丕賱丕鬲 丌睾丕夭蹖賳',
+      noDataPlaceHolder: '卮乇賵毓 賲讴丕賱賲賴 亘丕 讴丕乇亘乇 賲蹖鈥屫堌з嗀� 亘賴 AI 讴賲讴 讴賳丿 鬲丕 丕乇鬲亘丕胤 賳夭丿蹖讴鈥屫臂� 亘丕 丌賳賴丕 亘乇賯乇丕乇 讴賳丿.',
+      varTip: '賲蹖鈥屫堌з嗃屫� 丕夭 賲鬲睾蹖乇賴丕 丕爻鬲賮丕丿賴 讴賳蹖丿貙 爻毓蹖 讴賳蹖丿 {{variable}} 乇丕 鬲丕蹖倬 讴賳蹖丿',
+      tooShort: '丨丿丕賯賱 20 讴賱賲賴 丕夭 倬乇爻卮 丕賵賱蹖賴 亘乇丕蹖 鬲賵賱蹖丿 賳馗乇丕鬲 丌睾丕夭蹖賳 賲讴丕賱賲賴 賲賵乇丿 賳蹖丕夭 丕爻鬲.',
+      notIncludeKey: '倬乇爻卮 丕賵賱蹖賴 卮丕賲賱 賲鬲睾蹖乇: {{key}} 賳賲蹖鈥屫促堌�. 賱胤賮丕賸 丌賳 乇丕 亘賴 倬乇爻卮 丕賵賱蹖賴 丕囟丕賮賴 讴賳蹖丿.',
+    },
+    modelConfig: {
+      model: '賲丿賱',
+      setTone: '鬲賳馗蹖賲 賱丨賳 倬丕爻禺鈥屬囏�',
+      title: '賲丿賱 賵 倬丕乇丕賲鬲乇賴丕',
+      modeType: {
+        chat: '趩鬲',
+        completion: '鬲讴賲蹖賱',
+      },
+    },
+    inputs: {
+      title: '丕卮讴丕賱鈥屫藏й屰� 賵 倬蹖卮鈥屬嗁呚й屫�',
+      noPrompt: '爻毓蹖 讴賳蹖丿 倬乇爻卮鈥屬囏й屰� 乇丕 丿乇 賵乇賵丿蹖 倬蹖卮鈥屬矩必池� 亘賳賵蹖爻蹖丿',
+      userInputField: '賮蹖賱丿 賵乇賵丿蹖 讴丕乇亘乇',
+      noVar: '賲賯丿丕乇 賲鬲睾蹖乇 乇丕 倬乇 讴賳蹖丿貙 讴賴 亘賴 胤賵乇 禺賵丿讴丕乇 丿乇 讴賱賲丕鬲 倬乇爻 賵 噩賵 丿乇 賴乇 亘丕乇 卮乇賵毓 蹖讴 噩賱爻賴 噩丿蹖丿 噩丕蹖诏夭蹖賳 賲蹖鈥屫促堌�.',
+      chatVarTip: '賲賯丿丕乇 賲鬲睾蹖乇 乇丕 倬乇 讴賳蹖丿貙 讴賴 亘賴 胤賵乇 禺賵丿讴丕乇 丿乇 讴賱賲丕鬲 倬乇爻 賵 噩賵 丿乇 賴乇 亘丕乇 卮乇賵毓 蹖讴 噩賱爻賴 噩丿蹖丿 噩丕蹖诏夭蹖賳 賲蹖鈥屫促堌�',
+      completionVarTip: '賲賯丿丕乇 賲鬲睾蹖乇 乇丕 倬乇 讴賳蹖丿貙 讴賴 亘賴 胤賵乇 禺賵丿讴丕乇 丿乇 讴賱賲丕鬲 倬乇爻 賵 噩賵 丿乇 賴乇 亘丕乇 丕乇爻丕賱 爻賵丕賱 噩丕蹖诏夭蹖賳 賲蹖鈥屫促堌�.',
+      previewTitle: '倬蹖卮鈥屬嗁呚й屫� 倬乇爻 賵 噩賵',
+      queryTitle: '賲丨鬲賵丕蹖 倬乇爻 賵 噩賵',
+      queryPlaceholder: '賱胤賮丕賸 賲鬲賳 丿乇禺賵丕爻鬲 乇丕 賵丕乇丿 讴賳蹖丿.',
+      run: '丕噩乇丕',
+    },
+    result: '賲鬲賳 禺乇賵噩蹖',
+    datasetConfig: {
+      settingTitle: '鬲賳馗蹖賲丕鬲 亘丕夭蹖丕亘蹖',
+      knowledgeTip: '乇賵蹖 丿讴賲賴 "+" 讴賱蹖讴 讴賳蹖丿 鬲丕 丿丕賳卮 丕囟丕賮賴 卮賵丿',
+      retrieveOneWay: {
+        title: '亘丕夭蹖丕亘蹖 N 亘賴 1',
+        description: '亘乇 丕爻丕爻 賳蹖鬲 讴丕乇亘乇 賵 鬲賵氐蹖賮丕鬲 丿丕賳卮貙 毓丕賲賱 亘賴鬲乇蹖賳 丿丕賳卮 乇丕 亘乇丕蹖 倬乇爻 賵 噩賵 亘賴 胤賵乇 禺賵丿讴丕乇 丕賳鬲禺丕亘 賲蹖鈥屭┵嗀�. 亘賴鬲乇蹖賳 亘乇丕蹖 亘乇賳丕賲賴鈥屬囏й屰� 亘丕 丿丕賳卮 賲丨丿賵丿 賵 賲卮禺氐.',
+      },
+      retrieveMultiWay: {
+        title: '亘丕夭蹖丕亘蹖 趩賳丿 賲爻蹖乇賴',
+        description: '亘乇 丕爻丕爻 賳蹖鬲 讴丕乇亘乇貙 丕夭 鬲賲丕賲 丿丕賳卮 倬乇爻 賵 噩賵 賲蹖鈥屭┵嗀� 賲鬲賳鈥屬囏й� 賲乇鬲亘胤 丕夭 賲賳丕亘毓 趩賳丿诏丕賳賴 亘丕夭蹖丕亘蹖 賲蹖鈥屭┵嗀� 賵 亘賴鬲乇蹖賳 賳鬲丕蹖噩 賲胤丕亘賯鬲 亘丕 倬乇爻 賵 噩賵蹖 讴丕乇亘乇 乇丕 倬爻 丕夭 賲乇鬲亘鈥屫池ж槽� 賲噩丿丿 丕賳鬲禺丕亘 賲蹖鈥屭┵嗀�.',
+      },
+      rerankModelRequired: '賲丿賱 賲乇鬲亘鈥屫池ж槽� 賲噩丿丿 賲賵乇丿 賳蹖丕夭 丕爻鬲',
+      params: '倬丕乇丕賲鬲乇賴丕',
+      top_k: 'Top K',
+      top_kTip: '亘乇丕蹖 賮蹖賱鬲乇 讴乇丿賳 鬲讴賴鈥屬囏й屰� 讴賴 亘蹖卮鬲乇蹖賳 卮亘丕賴鬲 亘賴 爻賵丕賱丕鬲 讴丕乇亘乇 丿丕乇賳丿 丕爻鬲賮丕丿賴 賲蹖鈥屫促堌�. 爻蹖爻鬲賲 賴賲趩賳蹖賳 亘賴 胤賵乇 丿蹖賳丕賲蹖讴 賲賯丿丕乇 Top K 乇丕 亘乇 丕爻丕爻 max_tokens 賲丿賱 丕賳鬲禺丕亘 卮丿賴 鬲賳馗蹖賲 賲蹖鈥屭┵嗀�.',
+      score_threshold: '丌爻鬲丕賳賴 賳賲乇賴',
+      score_thresholdTip: '亘乇丕蹖 鬲賳馗蹖賲 丌爻鬲丕賳賴 卮亘丕賴鬲 亘乇丕蹖 賮蹖賱鬲乇 讴乇丿賳 鬲讴賴鈥屬囏� 丕爻鬲賮丕丿賴 賲蹖鈥屫促堌�.',
+      retrieveChangeTip: '鬲睾蹖蹖乇 丨丕賱鬲 卮丕禺氐 賵 丨丕賱鬲 亘丕夭蹖丕亘蹖 賲賲讴賳 丕爻鬲 亘乇 亘乇賳丕賲賴鈥屬囏й� 賲乇鬲亘胤 亘丕 丕蹖賳 丿丕賳卮 鬲兀孬蹖乇 亘诏匕丕乇丿.',
+    },
+    debugAsSingleModel: '丕卮讴丕賱鈥屫藏й屰� 亘賴 毓賳賵丕賳 賲丿賱 鬲讴',
+    debugAsMultipleModel: '丕卮讴丕賱鈥屫藏й屰� 亘賴 毓賳賵丕賳 賲丿賱 趩賳丿诏丕賳賴',
+    duplicateModel: '鬲讴乇丕乇蹖',
+    publishAs: '丕賳鬲卮丕乇 亘賴 毓賳賵丕賳',
+    assistantType: {
+      name: '賳賵毓 丿爻鬲蹖丕乇',
+      chatAssistant: {
+        name: '丿爻鬲蹖丕乇 倬丕蹖賴',
+        description: '爻丕禺鬲 丿爻鬲蹖丕乇 賲亘鬲賳蹖 亘乇 趩鬲 亘丕 丕爻鬲賮丕丿賴 丕夭 賲丿賱 夭亘丕賳 亘夭乇诏',
+      },
+      agentAssistant: {
+        name: '丿爻鬲蹖丕乇 毓丕賲賱',
+        description: '爻丕禺鬲 蹖讴 毓丕賲賱 賴賵卮賲賳丿 讴賴 賲蹖鈥屫堌з嗀� 丕亘夭丕乇賴丕 乇丕 亘賴 胤賵乇 禺賵丿讴丕乇 亘乇丕蹖 鬲讴賲蹖賱 賵馗丕蹖賮 丕賳鬲禺丕亘 讴賳丿',
+      },
+    },
+    agent: {
+      agentMode: '丨丕賱鬲 毓丕賲賱',
+      agentModeDes: '鬲賳馗蹖賲 賳賵毓 丨丕賱鬲 丕爻鬲賳鬲丕噩 亘乇丕蹖 毓丕賲賱',
+      agentModeType: {
+        ReACT: 'ReAct',
+        functionCall: '賮乇丕禺賵丕賳蹖 鬲丕亘毓',
+      },
+      setting: {
+        name: '鬲賳馗蹖賲丕鬲 毓丕賲賱',
+        description: '鬲賳馗蹖賲丕鬲 丿爻鬲蹖丕乇 毓丕賲賱 亘賴 卮賲丕 丕噩丕夭賴 賲蹖鈥屫囏� 丨丕賱鬲 毓丕賲賱 賵 賵蹖跇诏蹖鈥屬囏й� 倬蹖卮乇賮鬲賴 賲丕賳賳丿 倬乇爻卮鈥屬囏й� 爻丕禺鬲賴 卮丿賴 乇丕 鬲賳馗蹖賲 讴賳蹖丿貙 賮賯胤 丿乇 賳賵毓 毓丕賲賱 賲賵噩賵丿 丕爻鬲.',
+        maximumIterations: {
+          name: '丨丿丕讴孬乇 鬲讴乇丕乇賴丕',
+          description: '賲丨丿賵丿 讴乇丿賳 鬲毓丿丕丿 鬲讴乇丕乇賴丕蹖蹖 讴賴 丿爻鬲蹖丕乇 毓丕賲賱 賲蹖鈥屫堌з嗀� 丕噩乇丕 讴賳丿',
+        },
+      },
+      buildInPrompt: '倬乇爻卮鈥屬囏й� 爻丕禺鬲賴 卮丿賴',
+      firstPrompt: '丕賵賱蹖賳 倬乇爻卮',
+      nextIteration: '鬲讴乇丕乇 亘毓丿蹖',
+      promptPlaceholder: '倬乇爻卮 禺賵丿 乇丕 丕蹖賳噩丕 亘賳賵蹖爻蹖丿',
+      tools: {
+        name: '丕亘夭丕乇賴丕',
+        description: '丕爻鬲賮丕丿賴 丕夭 丕亘夭丕乇賴丕 賲蹖鈥屫堌з嗀� 賯丕亘賱蹖鬲鈥屬囏й� LLM 乇丕 诏爻鬲乇卮 丿賴丿貙 賲丕賳賳丿 噩爻鬲噩賵 丿乇 丕蹖賳鬲乇賳鬲 蹖丕 丕賳噩丕賲 賲丨丕爻亘丕鬲 毓賱賲蹖',
+        enabled: '賮毓丕賱',
+      },
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/fa-IR/app-log.ts b/i18n/fa-IR/app-log.ts
new file mode 100644
index 0000000..56eba9d
--- /dev/null
+++ b/i18n/fa-IR/app-log.ts
@@ -0,0 +1,98 @@
+const translation = {
+  title: '賱丕诏鈥屬囏�',
+  description: '賱丕诏鈥屬囏� 賵囟毓蹖鬲 丕噩乇丕蹖蹖 亘乇賳丕賲賴 乇丕 孬亘鬲 賲蹖鈥屭┵嗁嗀� 卮丕賲賱 賵乇賵丿蹖鈥屬囏й� 讴丕乇亘乇 賵 倬丕爻禺鈥屬囏й� 賴賵卮 賲氐賳賵毓蹖.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: '夭賲丕賳 亘賴鈥屫辟堌藏必池з嗃�',
+      time: '夭賲丕賳 丕蹖噩丕丿',
+      endUser: '讴丕乇亘乇 賳賴丕蹖蹖 蹖丕 丨爻丕亘',
+      input: '賵乇賵丿蹖',
+      output: '禺乇賵噩蹖',
+      summary: '毓賳賵丕賳',
+      messageCount: '鬲毓丿丕丿 倬蹖丕賲',
+      userRate: '丕賲鬲蹖丕夭 讴丕乇亘乇',
+      adminRate: '丕賲鬲蹖丕夭 丕倬乇丕鬲賵乇',
+      startTime: '夭賲丕賳 卮乇賵毓',
+      status: '賵囟毓蹖鬲',
+      runtime: '夭賲丕賳 丕噩乇丕',
+      tokens: '鬲賵讴賳鈥屬囏�',
+      user: '讴丕乇亘乇 賳賴丕蹖蹖 蹖丕 丨爻丕亘',
+      version: '賳爻禺賴',
+    },
+    pagination: {
+      previous: '賯亘賱蹖',
+      next: '亘毓丿蹖',
+    },
+    empty: {
+      noChat: '賴賳賵夭 賲讴丕賱賲賴鈥屫й� 賵噩賵丿 賳丿丕乇丿',
+      noOutput: '禺乇賵噩蹖 賵噩賵丿 賳丿丕乇丿',
+      element: {
+        title: '讴爻蹖 賴爻鬲責',
+        content: '丿乇 丕蹖賳噩丕 鬲毓丕賲賱丕鬲 亘蹖賳 讴丕乇亘乇丕賳 賳賴丕蹖蹖 賵 亘乇賳丕賲賴鈥屬囏й� 賴賵卮 賲氐賳賵毓蹖 乇丕 賲卮丕賴丿賴 賵 丨丕卮蹖賴鈥屬嗁堐屫驰� 讴賳蹖丿 鬲丕 丿賯鬲 賴賵卮 賲氐賳賵毓蹖 亘賴亘賵丿 蹖丕亘丿. 賲蹖鈥屫堌з嗃屫� <shareLink>亘賴 丕卮鬲乇丕讴 亘诏匕丕乇蹖丿</shareLink> 蹖丕 <testLink>亘乇賳丕賲賴 賵亘 乇丕 鬲爻鬲 讴賳蹖丿</testLink> 賵 爻倬爻 亘賴 丕蹖賳 氐賮丨賴 亘乇诏乇丿蹖丿.',
+      },
+    },
+  },
+  detail: {
+    time: '夭賲丕賳',
+    conversationId: '卮賳丕爻賴 賲讴丕賱賲賴',
+    promptTemplate: '賯丕賱亘 丿乇禺賵丕爻鬲',
+    promptTemplateBeforeChat: '賯丕賱亘 丿乇禺賵丕爻鬲 賯亘賱 丕夭 趩鬲 路 亘賴 毓賳賵丕賳 倬蹖丕賲 爻蹖爻鬲賲蹖',
+    annotationTip: '亘賴亘賵丿賴丕 鬲賵爻胤 {{user}} 毓賱丕賲鬲鈥屭柏ж臂� 卮丿賴 丕爻鬲',
+    timeConsuming: '',
+    second: '孬丕賳蹖賴',
+    tokenCost: '鬲賵讴賳 賲氐乇賮蹖',
+    loading: '丿乇 丨丕賱 亘丕乇诏匕丕乇蹖',
+    operation: {
+      like: '倬爻賳丿蹖丿賳',
+      dislike: '賳倬爻賳丿蹖丿賳',
+      addAnnotation: '丕囟丕賮賴 讴乇丿賳 亘賴亘賵丿',
+      editAnnotation: '賵蹖乇丕蹖卮 亘賴亘賵丿',
+      annotationPlaceholder: '倬丕爻禺 賲賵乇丿 丕賳鬲馗丕乇蹖 讴賴 賲蹖鈥屫堌з囒屫� 賴賵卮 賲氐賳賵毓蹖 亘丿賴丿 乇丕 賵丕乇丿 讴賳蹖丿貙 讴賴 賲蹖鈥屫堌з嗀� 亘乇丕蹖 亘賴亘賵丿 賲丿賱 賵 讴蹖賮蹖鬲 鬲賵賱蹖丿 賲鬲賳 丿乇 丌蹖賳丿賴 丕爻鬲賮丕丿賴 卮賵丿.',
+    },
+    variables: '賲鬲睾蹖乇賴丕',
+    uploadImages: '鬲氐丕賵蹖乇 丌倬賱賵丿 卮丿賴',
+    modelParams: '倬丕乇丕賲鬲乇賴丕蹖 賲丿賱',
+  },
+  filter: {
+    period: {
+      today: '丕賲乇賵夭',
+      last7days: '7 乇賵夭 诏匕卮鬲賴',
+      last4weeks: '4 賴賮鬲賴 诏匕卮鬲賴',
+      last3months: '3 賲丕賴 诏匕卮鬲賴',
+      last12months: '12 賲丕賴 诏匕卮鬲賴',
+      monthToDate: '丕夭 丕亘鬲丿丕蹖 賲丕賴 鬲丕讴賳賵賳',
+      quarterToDate: '丕夭 丕亘鬲丿丕蹖 賮氐賱 鬲丕讴賳賵賳',
+      yearToDate: '丕夭 丕亘鬲丿丕蹖 爻丕賱 鬲丕讴賳賵賳',
+      allTime: '賴賲賴 夭賲丕賳鈥屬囏�',
+    },
+    annotation: {
+      all: '賴賲賴',
+      annotated: '亘賴亘賵丿賴丕蹖 丨丕卮蹖賴鈥屬嗁堐屫驰� 卮丿賴 ({{count}} 丌蹖鬲賲)',
+      not_annotated: '丨丕卮蹖賴鈥屬嗁堐屫驰� 賳卮丿賴',
+    },
+    sortBy: '賲乇鬲亘鈥屫池ж槽� 亘乇 丕爻丕爻:',
+    descending: '賳夭賵賱蹖',
+    ascending: '氐毓賵丿蹖',
+  },
+  workflowTitle: '賱丕诏鈥屬囏й� 噩乇蹖丕賳 讴丕乇蹖',
+  workflowSubtitle: '賱丕诏 毓賲賱蹖丕鬲 禺賵丿讴丕乇 乇丕 孬亘鬲 讴乇丿賴 丕爻鬲.',
+  runDetail: {
+    title: '賱丕诏 賲讴丕賱賲賴',
+    workflowTitle: '噩夭卅蹖丕鬲 賱丕诏',
+    fileListLabel: '噩夭卅蹖丕鬲 賮丕蹖賱',
+    fileListDetail: '噩夭卅蹖丕鬲',
+  },
+  promptLog: '賱丕诏 丿乇禺賵丕爻鬲',
+  agentLog: '賱丕诏 毓丕賲賱',
+  viewLog: '賲卮丕賴丿賴 賱丕诏',
+  agentLogDetail: {
+    agentMode: '丨丕賱鬲 毓丕賲賱',
+    toolUsed: '丕亘夭丕乇 丕爻鬲賮丕丿賴 卮丿賴',
+    iterations: '鬲讴乇丕乇賴丕',
+    iteration: '鬲讴乇丕乇',
+    finalProcessing: '倬乇丿丕夭卮 賳賴丕蹖蹖',
+  },
+}
+
+export default translation
diff --git a/i18n/fa-IR/app-overview.ts b/i18n/fa-IR/app-overview.ts
new file mode 100644
index 0000000..cf3368d
--- /dev/null
+++ b/i18n/fa-IR/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: '亘乇丕蹖 卮乇賵毓貙',
+    enterKeyTip: '讴賱蹖丿 API 禺賵丿 乇丕 丿乇 夭蹖乇 賵丕乇丿 讴賳蹖丿',
+    getKeyTip: '讴賱蹖丿 API 禺賵丿 乇丕 丕夭 丿丕卮亘賵乇丿 OpenAI 丿乇蹖丕賮鬲 讴賳蹖丿',
+    placeholder: '讴賱蹖丿 API 禺賵丿 乇丕 賵丕乇丿 讴賳蹖丿 (賲孬賱丕賸 sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: '卮賲丕 丕夭 爻賴賲蹖賴 丌夭賲丕蹖卮蹖 {{providerName}} 丕爻鬲賮丕丿賴 賲蹖鈥屭┵嗃屫�.',
+        description: '爻賴賲蹖賴 丌夭賲丕蹖卮蹖 亘乇丕蹖 丕賴丿丕賮 鬲爻鬲 卮賲丕 丕乇丕卅賴 卮丿賴 丕爻鬲. 賯亘賱 丕夭 丕蹖賳讴賴 爻賴賲蹖賴 丌夭賲丕蹖卮蹖 鬲賲丕賲 卮賵丿貙 賱胤賮丕賸 丕乇丕卅賴鈥屫囐嗀� 賲丿賱 禺賵丿 乇丕 鬲賳馗蹖賲 讴賳蹖丿 蹖丕 爻賴賲蹖賴 丕囟丕賮蹖 禺乇蹖丿丕乇蹖 讴賳蹖丿.',
+      },
+      exhausted: {
+        title: '爻賴賲蹖賴 丌夭賲丕蹖卮蹖 卮賲丕 鬲賲丕賲 卮丿賴 丕爻鬲貙 賱胤賮丕賸 讴賱蹖丿 API 禺賵丿 乇丕 鬲賳馗蹖賲 讴賳蹖丿.',
+        description: '卮賲丕 爻賴賲蹖賴 丌夭賲丕蹖卮蹖 禺賵丿 乇丕 賲氐乇賮 讴乇丿賴鈥屫й屫�. 賱胤賮丕賸 丕乇丕卅賴鈥屫囐嗀� 賲丿賱 禺賵丿 乇丕 鬲賳馗蹖賲 讴賳蹖丿 蹖丕 爻賴賲蹖賴 丕囟丕賮蹖 禺乇蹖丿丕乇蹖 讴賳蹖丿.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: '亘乇丕蹖 卮乇賵毓貙',
+        row2: '丕亘鬲丿丕 丕乇丕卅賴鈥屫囐嗀� 賲丿賱 禺賵丿 乇丕 鬲賳馗蹖賲 讴賳蹖丿.',
+      },
+    },
+    callTimes: '鬲毓丿丕丿 鬲賲丕爻鈥屬囏�',
+    usedToken: '鬲賵讴賳鈥屬囏й� 賲氐乇賮鈥屫簇�',
+    setAPIBtn: '亘乇賵 亘賴 鬲賳馗蹖賲丕鬲 丕乇丕卅賴鈥屫囐嗀� 賲丿賱',
+    tryCloud: '蹖丕 賳爻禺賴 丕亘乇蹖 Dify 亘丕 爻賴賲蹖賴 乇丕蹖诏丕賳 乇丕 丕賲鬲丨丕賳 讴賳蹖丿',
+  },
+  overview: {
+    title: '賳賲丕蹖 讴賱蹖',
+    appInfo: {
+      explanation: '亘乇賳丕賲賴 賵亘 AI 丌賲丕丿賴 亘賴 讴丕乇',
+      accessibleAddress: '丌丿乇爻 毓賲賵賲蹖',
+      preview: '倬蹖卮鈥屬嗁呚й屫�',
+      regenerate: '鬲賵賱蹖丿 賲噩丿丿',
+      regenerateNotice: '丌蹖丕 賲蹖鈥屫堌з囒屫� 丌丿乇爻 毓賲賵賲蹖 乇丕 丿賵亘丕乇賴 鬲賵賱蹖丿 讴賳蹖丿責',
+      preUseReminder: '賱胤賮丕賸 賯亘賱 丕夭 丕丿丕賲賴貙 WebApp 乇丕 賮毓丕賱 讴賳蹖丿.',
+      settings: {
+        entry: '鬲賳馗蹖賲丕鬲',
+        title: '鬲賳馗蹖賲丕鬲 WebApp',
+        webName: '賳丕賲 WebApp',
+        webDesc: '鬲賵囟蹖丨丕鬲 WebApp',
+        webDescTip: '丕蹖賳 賲鬲賳 丿乇 爻賲鬲 賲卮鬲乇蹖 賳賲丕蹖卮 丿丕丿賴 賲蹖鈥屫促堌� 賵 乇丕賴賳賲丕蹖蹖鈥屬囏й� 丕賵賱蹖賴 丿乇 賲賵乇丿 賳丨賵賴 丕爻鬲賮丕丿賴 丕夭 亘乇賳丕賲賴 乇丕 丕乇丕卅賴 賲蹖鈥屫囏�',
+        webDescPlaceholder: '鬲賵囟蹖丨丕鬲 WebApp 乇丕 賵丕乇丿 讴賳蹖丿',
+        language: '夭亘丕賳',
+        workflow: {
+          title: '賲乇丕丨賱 讴丕乇蹖',
+          show: '賳賲丕蹖卮',
+          hide: '賲禺賮蹖 讴乇丿賳',
+          showDesc: '賳賲丕蹖卮 蹖丕 倬賳賴丕賳 讴乇丿賳 噩夭卅蹖丕鬲 诏乇丿卮 讴丕乇 丿乇 WebApp',
+          subTitle: '噩夭卅蹖丕鬲 诏乇丿卮 讴丕乇',
+        },
+        chatColorTheme: '鬲賲 乇賳诏蹖 趩鬲',
+        chatColorThemeDesc: '鬲賲 乇賳诏蹖 趩鬲鈥屫ㄘж� 乇丕 鬲賳馗蹖賲 讴賳蹖丿',
+        chatColorThemeInverted: '賲毓讴賵爻',
+        invalidHexMessage: '賲賯丿丕乇 賴诏夭 賳丕賲毓鬲亘乇',
+        invalidPrivacyPolicy: '賱蹖賳讴 爻蹖丕爻鬲 丨賮馗 丨乇蹖賲 禺氐賵氐蹖 賳丕賲毓鬲亘乇 丕爻鬲. 賱胤賮丕賸 丕夭 蹖讴 賱蹖賳讴 賲毓鬲亘乇 讴賴 亘丕 http 蹖丕 https 卮乇賵毓 賲蹖卮賵丿 丕爻鬲賮丕丿賴 讴賳蹖丿',
+        more: {
+          entry: '賳賲丕蹖卮 鬲賳馗蹖賲丕鬲 亘蹖卮鬲乇',
+          copyright: '丨賯 賳爻禺賴鈥屫ㄘ必ж臂�',
+          copyRightPlaceholder: '賳丕賲 賳賵蹖爻賳丿賴 蹖丕 爻丕夭賲丕賳 乇丕 賵丕乇丿 讴賳蹖丿',
+          privacyPolicy: '爻蹖丕爻鬲 丨賮馗 丨乇蹖賲 禺氐賵氐蹖',
+          privacyPolicyPlaceholder: '賱蹖賳讴 爻蹖丕爻鬲 丨賮馗 丨乇蹖賲 禺氐賵氐蹖 乇丕 賵丕乇丿 讴賳蹖丿',
+          privacyPolicyTip: '亘賴 亘丕夭丿蹖丿讴賳賳丿诏丕賳 讴賲讴 賲蹖鈥屭┵嗀� 鬲丕 亘賮賴賲賳丿 亘乇賳丕賲賴 趩賴 丿丕丿賴鈥屬囏й屰� 乇丕 噩賲毓鈥屫①堌臂� 賲蹖鈥屭┵嗀� 亘賴 爻蹖丕爻鬲 丨賮馗 丨乇蹖賲 禺氐賵氐蹖 Dify 賳诏丕賴 讴賳蹖丿 <privacyPolicyLink>Privacy Policy</privacyPolicyLink>.',
+          customDisclaimer: '爻賱亘 賲爻卅賵賱蹖鬲 爻賮丕乇卮蹖',
+          customDisclaimerPlaceholder: '賲鬲賳 爻賱亘 賲爻卅賵賱蹖鬲 爻賮丕乇卮蹖 乇丕 賵丕乇丿 讴賳蹖丿',
+          customDisclaimerTip: '賲鬲賳 爻賱亘 賲爻卅賵賱蹖鬲 爻賮丕乇卮蹖 丿乇 爻賲鬲 賲卮鬲乇蹖 賳賲丕蹖卮 丿丕丿賴 賲蹖鈥屫促堌� 賵 丕胤賱丕毓丕鬲 亘蹖卮鬲乇蹖 丿乇亘丕乇賴 亘乇賳丕賲賴 丕乇丕卅賴 賲蹖鈥屫囏�',
+          copyrightTip: '賳賲丕蹖卮 丕胤賱丕毓丕鬲 丨賯 賳爻禺賴 亘乇丿丕乇蹖 丿乇 亘乇賳丕賲賴 賵亘',
+          copyrightTooltip: '賱胤賮丕 亘賴 胤乇丨 丨乇賮賴 丕蹖 蹖丕 亘丕賱丕鬲乇 丕乇鬲賯丕 丿賴蹖丿',
+        },
+        sso: {
+          title: 'WebApp SSO',
+          label: '丕丨乇丕夭 賴賵蹖鬲 SSO',
+          description: '賴賲賴 讴丕乇亘乇丕賳 亘丕蹖丿 賯亘賱 丕夭 丕爻鬲賮丕丿賴 丕夭 WebApp 亘丕 SSO 賵丕乇丿 卮賵賳丿',
+          tooltip: '亘乇丕蹖 賮毓丕賱 讴乇丿賳 WebApp SSO 亘丕 爻乇倬乇爻鬲 鬲賲丕爻 亘诏蹖乇蹖丿',
+        },
+        modalTip: '鬲賳馗蹖賲丕鬲 亘乇賳丕賲賴 賵亘 爻賲鬲 賲卮鬲乇蹖.',
+      },
+      embedded: {
+        entry: '噩丕爻丕夭蹖 卮丿賴',
+        title: '噩丕爻丕夭蹖 丿乇 賵亘鈥屫池й屫�',
+        explanation: '乇賵卮鈥屬囏й� 噩丕爻丕夭蹖 亘乇賳丕賲賴 趩鬲 丿乇 賵亘鈥屫池й屫� 禺賵丿 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+        iframe: '亘乇丕蹖 丕賮夭賵丿賳 亘乇賳丕賲賴 趩鬲 丿乇 賴乇噩丕蹖 賵亘鈥屫池й屫� 禺賵丿貙 丕蹖賳 iframe 乇丕 亘賴 讴丿 HTML 禺賵丿 丕囟丕賮賴 讴賳蹖丿.',
+        scripts: '亘乇丕蹖 丕賮夭賵丿賳 亘乇賳丕賲賴 趩鬲 亘賴 诏賵卮賴 倬丕蹖蹖賳 爻賲鬲 乇丕爻鬲 賵亘鈥屫池й屫� 禺賵丿貙 丕蹖賳 讴丿 乇丕 亘賴 HTML 禺賵丿 丕囟丕賮賴 讴賳蹖丿.',
+        chromePlugin: '賳氐亘 丕賮夭賵賳賴 Chrome Chatbot Dify',
+        copied: '讴倬蹖 卮丿',
+        copy: '讴倬蹖',
+      },
+      qrcode: {
+        title: '讴丿 QR 賱蹖賳讴',
+        scan: '丕爻讴賳 亘乇丕蹖 丕卮鬲乇丕讴鈥屭柏ж臂�',
+        download: '丿丕賳賱賵丿 讴丿 QR',
+      },
+      customize: {
+        way: '乇丕賴',
+        entry: '爻賮丕乇卮蹖鈥屫池ж槽�',
+        title: '爻賮丕乇卮蹖鈥屫池ж槽� WebApp AI',
+        explanation: '卮賲丕 賲蹖鈥屫堌з嗃屫� 馗丕賴乇 噩賱賵蹖蹖 亘乇賳丕賲賴 賵亘 乇丕 亘乇丕蹖 亘乇丌賵乇丿賳 賳蹖丕夭賴丕蹖 爻賳丕乇蹖賵 賵 爻亘讴 禺賵丿 爻賮丕乇卮蹖 讴賳蹖丿.',
+        way1: {
+          name: '讴賱丕蹖賳鬲 乇丕 卮丕禺賴 讴賳蹖丿貙 丌賳 乇丕 鬲睾蹖蹖乇 丿賴蹖丿 賵 丿乇 Vercel 賲爻鬲賯乇 讴賳蹖丿 (鬲賵氐蹖賴 賲蹖鈥屫促堌�)',
+          step1: '讴賱丕蹖賳鬲 乇丕 卮丕禺賴 讴賳蹖丿 賵 丌賳 乇丕 鬲睾蹖蹖乇 丿賴蹖丿',
+          step1Tip: '亘乇丕蹖 卮丕禺賴 讴乇丿賳 讴丿 賲賳亘毓 亘賴 丨爻丕亘 GitHub 禺賵丿 賵 鬲睾蹖蹖乇 讴丿 丕蹖賳噩丕 讴賱蹖讴 讴賳蹖丿',
+          step1Operation: 'Dify-WebClient',
+          step2: '丕爻鬲賯乇丕乇 丿乇 Vercel',
+          step2Tip: '亘乇丕蹖 賵丕乇丿 讴乇丿賳 賲禺夭賳 亘賴 Vercel 賵 丕爻鬲賯乇丕乇 丕蹖賳噩丕 讴賱蹖讴 讴賳蹖丿',
+          step2Operation: '賵丕乇丿 讴乇丿賳 賲禺夭賳',
+          step3: '倬蹖讴乇亘賳丿蹖 賲鬲睾蹖乇賴丕蹖 賲丨蹖胤蹖',
+          step3Tip: '賲鬲睾蹖乇賴丕蹖 賲丨蹖胤蹖 夭蹖乇 乇丕 丿乇 Vercel 丕囟丕賮賴 讴賳蹖丿',
+        },
+        way2: {
+          name: '賳賵卮鬲賳 讴丿 爻賲鬲 讴賱丕蹖賳鬲 亘乇丕蹖 賮乇丕禺賵丕賳蹖 API 賵 丕爻鬲賯乇丕乇 丌賳 亘乇 乇賵蹖 爻乇賵乇',
+          operation: '賲爻鬲賳丿丕鬲',
+        },
+      },
+      launch: '乇丕賴 丕賳丿丕夭蹖',
+    },
+    apiInfo: {
+      title: 'API 爻乇賵蹖爻 亘讴鈥屫з嗀�',
+      explanation: '亘賴 乇丕丨鬲蹖 丿乇 亘乇賳丕賲賴 禺賵丿 蹖讴倬丕乇趩賴 賲蹖鈥屫促堌�',
+      accessibleAddress: '賳賯胤賴 倬丕蹖丕賳蹖 爻乇賵蹖爻 API',
+      doc: '賲乇噩毓 API',
+    },
+    status: {
+      running: '丿乇 丨丕賱 爻乇賵蹖爻鈥屫囒�',
+      disable: '睾蹖乇賮毓丕賱',
+    },
+  },
+  analysis: {
+    title: '鬲丨賱蹖賱',
+    ms: '賲蹖賱蹖鈥屫з嗃屬�',
+    tokenPS: '鬲賵讴賳/孬丕賳蹖賴',
+    totalMessages: {
+      title: '讴賱 倬蹖丕賲鈥屬囏�',
+      explanation: '鬲毓丿丕丿 鬲毓丕賲賱丕鬲 乇賵夭丕賳賴 亘丕 賴賵卮 賲氐賳賵毓蹖.',
+    },
+    totalConversations: {
+      title: '讴賱 賲讴丕賱賲丕鬲',
+      explanation: '鬲毓丿丕丿 賲讴丕賱賲丕鬲 乇賵夭丕賳賴 亘丕 賴賵卮 賲氐賳賵毓蹖貨 賲賴賳丿爻蹖/丕卮讴丕賱鈥屫藏й屰� 倬乇丕賲倬鬲 賲爻鬲孬賳蹖 丕爻鬲.',
+    },
+    activeUsers: {
+      title: '讴丕乇亘乇丕賳 賮毓丕賱',
+      explanation: '讴丕乇亘乇丕賳 賲賳丨氐乇 亘賴 賮乇丿蹖 讴賴 丿乇 倬乇爻卮 賵 倬丕爻禺 亘丕 AI 卮乇讴鬲 賲蹖鈥屭┵嗁嗀� 賲賴賳丿爻蹖/丕卮讴丕賱鈥屫藏й屰� 丿爻鬲賵乇丕鬲 賲爻鬲孬賳蹖 賴爻鬲賳丿.',
+    },
+    tokenUsage: {
+      title: '丕爻鬲賮丕丿賴 丕夭 鬲賵讴賳',
+      explanation: '賲氐乇賮 乇賵夭丕賳賴 鬲賵讴賳鈥屬囏й� 賲丿賱 夭亘丕賳 亘乇丕蹖 亘乇賳丕賲賴 乇丕 賳卮丕賳 賲蹖鈥屫囏� 讴賴 亘乇丕蹖 讴賳鬲乇賱 賴夭蹖賳賴鈥屬囏� 賲賮蹖丿 丕爻鬲.',
+      consumed: '賲氐乇賮鈥屫簇�',
+    },
+    avgSessionInteractions: {
+      title: '賲蹖丕賳诏蹖賳 鬲毓丕賲賱丕鬲 噩賱爻賴',
+      explanation: '鬲毓丿丕丿 鬲毓丕賲賱丕鬲 倬蹖賵爻鬲賴 讴丕乇亘乇-AI貨 亘乇丕蹖 亘乇賳丕賲賴鈥屬囏й� 賲亘鬲賳蹖 亘乇 诏賮鬲诏賵.',
+    },
+    avgUserInteractions: {
+      title: '賲蹖丕賳诏蹖賳 鬲毓丕賲賱丕鬲 讴丕乇亘乇丕賳',
+      explanation: '鬲讴乇丕乇 丕爻鬲賮丕丿賴 乇賵夭丕賳賴 讴丕乇亘乇丕賳 乇丕 賳卮丕賳 賲蹖鈥屫囏�. 丕蹖賳 賲毓蹖丕乇 趩爻亘賳丿诏蹖 讴丕乇亘乇丕賳 乇丕 賳卮丕賳 賲蹖鈥屫囏�.',
+    },
+    userSatisfactionRate: {
+      title: '賳乇禺 乇囟丕蹖鬲 讴丕乇亘乇丕賳',
+      explanation: '鬲毓丿丕丿 賱丕蹖讴鈥屬囏� 亘賴 丕夭丕蹖 賴乇 郾郯郯郯 倬蹖丕賲. 丕蹖賳 賳卮丕賳鈥屫囐嗀� 賳爻亘鬲 倬丕爻禺鈥屬囏й屰� 丕爻鬲 讴賴 讴丕乇亘乇丕賳 亘賴 卮丿鬲 乇囟丕蹖鬲 丿丕乇賳丿.',
+    },
+    avgResponseTime: {
+      title: '賲蹖丕賳诏蹖賳 夭賲丕賳 倬丕爻禺',
+      explanation: '夭賲丕賳 (賲蹖賱蹖鈥屫з嗃屬�) 亘乇丕蹖 倬乇丿丕夭卮/倬丕爻禺 AI貨 亘乇丕蹖 亘乇賳丕賲賴鈥屬囏й� 賲亘鬲賳蹖 亘乇 賲鬲賳.',
+    },
+    tps: {
+      title: '爻乇毓鬲 禺乇賵噩蹖 鬲賵讴賳',
+      explanation: '毓賲賱讴乇丿 賲丿賱 夭亘丕賳 亘夭乇诏 乇丕 丕賳丿丕夭賴鈥屭屫臂� 賲蹖鈥屭┵嗀�. 爻乇毓鬲 禺乇賵噩蹖 鬲賵讴賳鈥屬囏й� 賲丿賱 夭亘丕賳 亘夭乇诏 丕夭 丌睾丕夭 丿乇禺賵丕爻鬲 鬲丕 鬲讴賲蹖賱 禺乇賵噩蹖 乇丕 亘卮賲丕乇蹖丿.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/fa-IR/app.ts b/i18n/fa-IR/app.ts
new file mode 100644
index 0000000..5f10269
--- /dev/null
+++ b/i18n/fa-IR/app.ts
@@ -0,0 +1,214 @@
+const translation = {
+  createApp: '丕蹖噩丕丿 亘乇賳丕賲賴',
+  types: {
+    all: '賴賲賴',
+    chatbot: '趩鬲鈥屫ㄘж�',
+    agent: '賳賲丕蹖賳丿賴',
+    workflow: '诏乇丿卮 讴丕乇',
+    completion: '鬲讴賲蹖賱',
+    basic: '丕爻丕爻蹖',
+    advanced: '趩鬲鈥屬佡勝�',
+  },
+  duplicate: '鬲讴乇丕乇',
+  duplicateTitle: '鬲讴乇丕乇 亘乇賳丕賲賴',
+  export: '氐丕丿乇 讴乇丿賳 DSL',
+  exportFailed: '氐丕丿乇 讴乇丿賳 DSL 賳丕賲賵賮賯 亘賵丿.',
+  importDSL: '賵丕乇丿 讴乇丿賳 賮丕蹖賱 DSL',
+  createFromConfigFile: '丕蹖噩丕丿 丕夭 賮丕蹖賱 DSL',
+  importFromDSL: '賵丕乇丿 讴乇丿賳 丕夭 DSL',
+  importFromDSLFile: '丕夭 賮丕蹖賱 DSL',
+  importFromDSLUrl: '丕夭 URL',
+  importFromDSLUrlPlaceholder: '賱蹖賳讴 DSL 乇丕 丕蹖賳噩丕 亘趩爻亘丕賳蹖丿',
+  deleteAppConfirmTitle: '丌蹖丕 丕蹖賳 亘乇賳丕賲賴 丨匕賮 卮賵丿責',
+  deleteAppConfirmContent:
+    '丨匕賮 亘乇賳丕賲賴 睾蹖乇賯丕亘賱 亘乇诏卮鬲 丕爻鬲. 讴丕乇亘乇丕賳 丿蹖诏乇 賯丕丿乇 亘賴 丿爻鬲乇爻蹖 亘賴 亘乇賳丕賲賴 卮賲丕 賳禺賵丕賴賳丿 亘賵丿 賵 鬲賲丕賲 鬲賳馗蹖賲丕鬲 賵 诏夭丕乇卮丕鬲 丿乇禺賵丕爻鬲鈥屬囏� 亘賴 氐賵乇鬲 丿丕卅賲 丨匕賮 禺賵丕賴賳丿 卮丿.',
+  appDeleted: '亘乇賳丕賲賴 丨匕賮 卮丿',
+  appDeleteFailed: '丨匕賮 亘乇賳丕賲賴 賳丕賲賵賮賯 亘賵丿',
+  join: '倬蹖賵爻鬲賳 亘賴 噩丕賲毓賴',
+  communityIntro:
+    '丿乇 讴丕賳丕賱鈥屬囏й� 賲禺鬲賱賮 亘丕 丕毓囟丕蹖 鬲蹖賲貙 賲卮丕乇讴鬲鈥屭┵嗁嗀з� 賵 鬲賵爻毓賴鈥屫囐嗀з� 亘丨孬 讴賳蹖丿.',
+  roadmap: '賳賯卮賴 乇丕賴 賲丕 乇丕 亘亘蹖賳蹖丿',
+  newApp: {
+    startFromBlank: '丕蹖噩丕丿 丕夭 禺丕賱蹖',
+    startFromTemplate: '丕蹖噩丕丿 丕夭 賯丕賱亘',
+    captionAppType: '趩賴 賳賵毓 亘乇賳丕賲賴鈥屫й� 賲蹖鈥屫堌з囒屫� 丕蹖噩丕丿 讴賳蹖丿責',
+    chatbotDescription: '爻丕禺鬲 亘乇賳丕賲賴鈥屫й� 賲亘鬲賳蹖 亘乇 趩鬲. 丕蹖賳 亘乇賳丕賲賴 丕夭 賯丕賱亘 倬乇爻卮 賵 倬丕爻禺 丕爻鬲賮丕丿賴 賲蹖鈥屭┵嗀� 賵 丕賲讴丕賳 趩賳丿蹖賳 丿賵乇 賲讴丕賱賲賴 賲丿丕賵賲 乇丕 賮乇丕賴賲 賲蹖鈥屭┵嗀�.',
+    completionDescription: '爻丕禺鬲 亘乇賳丕賲賴鈥屫й� 讴賴 賲鬲賳 亘丕 讴蹖賮蹖鬲 亘丕賱丕 亘乇 丕爻丕爻 丿乇禺賵丕爻鬲鈥屬囏� 鬲賵賱蹖丿 賲蹖鈥屭┵嗀� 賲丕賳賳丿 鬲賵賱蹖丿 賲賯丕賱丕鬲貙 禺賱丕氐賴鈥屬囏ж� 鬲乇噩賲賴鈥屬囏� 賵 亘蹖卮鬲乇.',
+    completionWarning: '丕蹖賳 賳賵毓 亘乇賳丕賲賴 丿蹖诏乇 倬卮鬲蹖亘丕賳蹖 賳賲蹖鈥屫促堌�.',
+    agentDescription: '爻丕禺鬲 賳賲丕蹖賳丿賴 賴賵卮賲賳丿 讴賴 賲蹖鈥屫堌з嗀� 丕亘夭丕乇賴丕 乇丕 亘乇丕蹖 丕賳噩丕賲 賵馗丕蹖賮 亘賴 胤賵乇 禺賵丿賲禺鬲丕乇 丕賳鬲禺丕亘 讴賳丿',
+    workflowDescription: '爻丕禺鬲 亘乇賳丕賲賴鈥屫й� 讴賴 賲鬲賳 亘丕 讴蹖賮蹖鬲 亘丕賱丕 亘乇 丕爻丕爻 诏乇丿卮 讴丕乇 亘丕 丿乇噩賴 亘丕賱丕蹖 爻賮丕乇卮蹖鈥屫池ж槽� 鬲賵賱蹖丿 賲蹖鈥屭┵嗀�. 賲賳丕爻亘 亘乇丕蹖 讴丕乇亘乇丕賳 亘丕 鬲噩乇亘賴.',
+    workflowWarning: '丿乇 丨丕賱 丨丕囟乇 丿乇 賳爻禺賴 亘鬲丕',
+    chatbotType: '乇賵卮 爻丕夭賲丕賳丿賴蹖 趩鬲鈥屫ㄘж�',
+    basic: '丕爻丕爻蹖',
+    basicTip: '亘乇丕蹖 賲亘鬲丿蹖丕賳貙 賲蹖鈥屫堌з� 亘毓丿丕賸 亘賴 Chatflow 鬲睾蹖蹖乇 丿丕丿',
+    basicFor: '亘乇丕蹖 賲亘鬲丿蹖丕賳',
+    basicDescription: '爻丕夭賲丕賳丿賴蹖 丕爻丕爻蹖 亘賴 卮賲丕 丕噩丕夭賴 賲蹖鈥屫囏� 鬲丕 蹖讴 亘乇賳丕賲賴 趩鬲鈥屫ㄘж� 乇丕 亘丕 鬲賳馗蹖賲丕鬲 爻丕丿賴 賵 亘丿賵賳 丕賲讴丕賳 鬲睾蹖蹖乇 丿乇禺賵丕爻鬲鈥屬囏й� 丿丕禺賱蹖 爻丕夭賲丕賳丿賴蹖 讴賳蹖丿. 賲賳丕爻亘 亘乇丕蹖 賲亘鬲丿蹖丕賳 丕爻鬲.',
+    advanced: 'Chatflow',
+    advancedFor: '亘乇丕蹖 讴丕乇亘乇丕賳 倬蹖卮乇賮鬲賴',
+    advancedDescription: '爻丕夭賲丕賳丿賴蹖 诏乇丿卮 讴丕乇貙 趩鬲鈥屫ㄘж�屬囏� 乇丕 亘賴 氐賵乇鬲 诏乇丿卮 讴丕乇 爻丕夭賲丕賳丿賴蹖 賲蹖鈥屭┵嗀� 賵 丿乇噩賴 亘丕賱丕蹖蹖 丕夭 爻賮丕乇卮蹖鈥屫池ж槽屫� 丕夭 噩賲賱賴 丕賲讴丕賳 賵蹖乇丕蹖卮 丿乇禺賵丕爻鬲鈥屬囏й� 丿丕禺賱蹖 乇丕 賮乇丕賴賲 賲蹖鈥屭┵嗀�. 賲賳丕爻亘 亘乇丕蹖 讴丕乇亘乇丕賳 亘丕 鬲噩乇亘賴 丕爻鬲.',
+    captionName: '丌蹖讴賵賳 賵 賳丕賲 亘乇賳丕賲賴',
+    appNamePlaceholder: '亘賴 亘乇賳丕賲賴 禺賵丿 蹖讴 賳丕賲 亘丿賴蹖丿',
+    captionDescription: '鬲賵囟蹖丨丕鬲',
+    appDescriptionPlaceholder: '鬲賵囟蹖丨丕鬲 亘乇賳丕賲賴 乇丕 賵丕乇丿 讴賳蹖丿',
+    useTemplate: '丕爻鬲賮丕丿賴 丕夭 丕蹖賳 賯丕賱亘',
+    previewDemo: '倬蹖卮鈥屬嗁呚й屫� 丿賲賵',
+    chatApp: '丿爻鬲蹖丕乇',
+    chatAppIntro:
+      '賲蹖鈥屫堌з囐� 蹖讴 亘乇賳丕賲賴 賲亘鬲賳蹖 亘乇 趩鬲 亘爻丕夭賲. 丕蹖賳 亘乇賳丕賲賴 丕夭 賯丕賱亘 倬乇爻卮 賵 倬丕爻禺 丕爻鬲賮丕丿賴 賲蹖鈥屭┵嗀� 賵 丕賲讴丕賳 趩賳丿蹖賳 丿賵乇 賲讴丕賱賲賴 賲丿丕賵賲 乇丕 賮乇丕賴賲 賲蹖鈥屭┵嗀�.',
+    agentAssistant: '丿爻鬲蹖丕乇 賳賲丕蹖賳丿賴 噩丿蹖丿',
+    completeApp: '鬲賵賱蹖丿 讴賳賳丿賴 賲鬲賳',
+    completeAppIntro:
+      '賲蹖鈥屫堌з囐� 亘乇賳丕賲賴鈥屫й� 亘爻丕夭賲 讴賴 賲鬲賳 亘丕 讴蹖賮蹖鬲 亘丕賱丕 亘乇 丕爻丕爻 丿乇禺賵丕爻鬲鈥屬囏� 鬲賵賱蹖丿 讴賳丿貙 賲丕賳賳丿 鬲賵賱蹖丿 賲賯丕賱丕鬲貙 禺賱丕氐賴鈥屬囏ж� 鬲乇噩賲賴鈥屬囏� 賵 亘蹖卮鬲乇.',
+    showTemplates: '賲蹖鈥屫堌з囐� 丕夭 蹖讴 賯丕賱亘 丕賳鬲禺丕亘 讴賳賲',
+    hideTemplates: '亘丕夭诏卮鬲 亘賴 丕賳鬲禺丕亘 丨丕賱鬲',
+    Create: '丕蹖噩丕丿',
+    Cancel: '賱睾賵',
+    nameNotEmpty: '賳丕賲 賳賲蹖鈥屫堌з嗀� 禺丕賱蹖 亘丕卮丿',
+    appTemplateNotSelected: '賱胤賮丕賸 蹖讴 賯丕賱亘 丕賳鬲禺丕亘 讴賳蹖丿',
+    appTypeRequired: '賱胤賮丕賸 賳賵毓 亘乇賳丕賲賴 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+    appCreated: '亘乇賳丕賲賴 丕蹖噩丕丿 卮丿',
+    appCreateFailed: '丕蹖噩丕丿 亘乇賳丕賲賴 賳丕賲賵賮賯 亘賵丿',
+    Confirm: '鬲丕蹖蹖丿',
+    appCreateDSLErrorTitle: '賳丕爻丕夭诏丕乇蹖 賳爻禺賴',
+    caution: '丕丨鬲蹖丕胤',
+    appCreateDSLErrorPart3: '賳爻禺賴 DSL 亘乇賳丕賲賴 賮毓賱蹖:',
+    appCreateDSLErrorPart2: '丌蹖丕 賲蹖 禺賵丕賴蹖丿 丕丿丕賲賴 丿賴蹖丿責',
+    appCreateDSLErrorPart4: '賳爻禺賴 DSL 倬卮鬲蹖亘丕賳蹖 卮丿賴 鬲賵爻胤 爻蹖爻鬲賲:',
+    appCreateDSLErrorPart1: '鬲賮丕賵鬲 賯丕亘賱 鬲賵噩賴蹖 丿乇 賳爻禺賴 賴丕蹖 DSL 賲卮丕賴丿賴 卮丿賴 丕爻鬲. 丕噩亘丕乇 亘賴 賵丕乇丿丕鬲 賲賲讴賳 丕爻鬲 亘丕毓孬 丕禺鬲賱丕賱 丿乇 毓賲賱讴乇丿 亘乇賳丕賲賴 卮賵丿.',
+    appCreateDSLWarning: '丕丨鬲蹖丕胤: 鬲賮丕賵鬲 賳爻禺賴 DSL 賲賲讴賳 丕爻鬲 亘乇 賵蹖跇诏蹖 賴丕蹖 禺丕氐蹖 鬲兀孬蹖乇 亘诏匕丕乇丿',
+    completionShortDescription: '丿爻鬲蹖丕乇 賴賵卮 賲氐賳賵毓蹖 亘乇丕蹖 鬲爻讴 賴丕蹖 鬲賵賱蹖丿 賲鬲賳',
+    foundResult: '{{鬲毓丿丕丿}} 賳鬲蹖噩賴',
+    chatbotUserDescription: '亘賴 爻乇毓鬲 蹖讴 趩鬲 亘丕鬲 賲亘鬲賳蹖 亘乇 LLM 亘丕 倬蹖讴乇亘賳丿蹖 爻丕丿賴 亘爻丕夭蹖丿. 亘毓丿丕 賲蹖 鬲賵丕賳蹖丿 亘賴 Chatflow 亘乇賵蹖丿.',
+    chooseAppType: '賳賵毓 亘乇賳丕賲賴 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+    foundResults: '{{鬲毓丿丕丿}} 賳鬲蹖噩賴',
+    noIdeaTip: '丕蹖丿賴 丕蹖 賳丿丕乇蹖丿責 賯丕賱亘 賴丕蹖 賲丕 乇丕 亘乇乇爻蹖 讴賳蹖丿',
+    forBeginners: '亘乇丕蹖 賲亘鬲丿蹖丕賳',
+    noAppsFound: '賴蹖趩 亘乇賳丕賲賴 丕蹖 蹖丕賮鬲 賳卮丿',
+    chatbotShortDescription: '趩鬲 亘丕鬲 賲亘鬲賳蹖 亘乇 LLM 亘丕 乇丕賴 丕賳丿丕夭蹖 爻丕丿賴',
+    optional: '丕禺鬲蹖丕乇蹖',
+    learnMore: '亘蹖卮鬲乇 亘丿丕賳蹖丿',
+    agentShortDescription: '毓丕賲賱 賴賵卮賲賳丿 亘丕 丕爻鬲丿賱丕賱 賵 丕爻鬲賮丕丿賴 丕夭 丕亘夭丕乇 賲爻鬲賯賱',
+    noTemplateFoundTip: '爻毓蹖 讴賳蹖丿 亘丕 丕爻鬲賮丕丿賴 丕夭 讴賱賲丕鬲 讴賱蹖丿蹖 賲禺鬲賱賮 噩爻鬲噩賵 讴賳蹖丿.',
+    noTemplateFound: '賴蹖趩 丕賱诏賵蹖蹖 蹖丕賮鬲 賳卮丿',
+    forAdvanced: '亘乇丕蹖 讴丕乇亘乇丕賳 倬蹖卮乇賮鬲賴',
+    workflowShortDescription: '丕乇讴爻鬲乇丕爻蹖賵賳 亘乇丕蹖 鬲爻讴 賴丕蹖 丕鬲賵賲丕爻蹖賵賳 鬲讴 賳賵亘鬲',
+    workflowUserDescription: '丕乇讴爻鬲乇丕爻蹖賵賳 诏乇丿卮 讴丕乇 亘乇丕蹖 讴丕乇賴丕蹖 鬲讴 賲乇丨賱賴 丕蹖 賲丕賳賳丿 丕鬲賵賲丕爻蹖賵賳 賵 倬乇丿丕夭卮 丿爻鬲賴 丕蹖.',
+    advancedUserDescription: '丕乇讴爻鬲乇丕爻蹖賵賳 诏乇丿卮 讴丕乇 亘乇丕蹖 讴丕乇賴丕蹖 诏賮鬲诏賵蹖 倬蹖趩蹖丿賴 趩賳丿 賲乇丨賱賴 丕蹖 亘丕 賯丕亘賱蹖鬲 賴丕蹖 丨丕賮馗賴.',
+    completionUserDescription: '亘賴 爻乇毓鬲 蹖讴 丿爻鬲蹖丕乇 賴賵卮 賲氐賳賵毓蹖 亘乇丕蹖 賵馗丕蹖賮 鬲賵賱蹖丿 賲鬲賳 亘丕 倬蹖讴乇亘賳丿蹖 爻丕丿賴 亘爻丕夭蹖丿.',
+    advancedShortDescription: '诏乇丿卮 讴丕乇 亘乇丕蹖 丿蹖丕賱賵诏 賴丕蹖 倬蹖趩蹖丿賴 趩賳丿 趩乇禺卮蹖 亘丕 丨丕賮馗賴',
+    agentUserDescription: '蹖讴 毓丕賲賱 賴賵卮賲賳丿 讴賴 賯丕丿乇 亘賴 丕爻鬲丿賱丕賱 鬲讴乇丕乇蹖 賵 丕爻鬲賮丕丿賴 丕夭 丕亘夭丕乇 賲爻鬲賯賱 亘乇丕蹖 丿爻鬲蹖丕亘蹖 亘賴 丕賴丿丕賮 賵馗蹖賮賴 丕爻鬲.',
+  },
+  editApp: '賵蹖乇丕蹖卮 丕胤賱丕毓丕鬲',
+  editAppTitle: '賵蹖乇丕蹖卮 丕胤賱丕毓丕鬲 亘乇賳丕賲賴',
+  editDone: '丕胤賱丕毓丕鬲 亘乇賳丕賲賴 亘賴鈥屫辟堌藏必池з嗃� 卮丿',
+  editFailed: '亘賴鈥屫辟堌藏必池з嗃� 丕胤賱丕毓丕鬲 亘乇賳丕賲賴 賳丕賲賵賮賯 亘賵丿',
+  iconPicker: {
+    ok: '亘丕卮賴',
+    cancel: '賱睾賵',
+    emoji: '丕蹖賲賵噩蹖',
+    image: '鬲氐賵蹖乇',
+  },
+  switch: '鬲睾蹖蹖乇 亘賴 爻丕夭賲丕賳丿賴蹖 诏乇丿卮 讴丕乇',
+  switchTipStart: '蹖讴 賳爻禺賴 噩丿蹖丿 丕夭 亘乇賳丕賲賴 亘乇丕蹖 卮賲丕 丕蹖噩丕丿 禺賵丕賴丿 卮丿 賵 賳爻禺賴 噩丿蹖丿 亘賴 爻丕夭賲丕賳丿賴蹖 诏乇丿卮 讴丕乇 鬲睾蹖蹖乇 禺賵丕賴丿 讴乇丿. 賳爻禺賴 噩丿蹖丿 ',
+  switchTip: '丕噩丕夭賴 賳賲蹖鈥屫囏�',
+  switchTipEnd: ' 鬲睾蹖蹖乇 亘賴 爻丕夭賲丕賳丿賴蹖 丕爻丕爻蹖 亘丕夭诏乇丿丿.',
+  switchLabel: '賳爻禺賴 亘乇賳丕賲賴 讴賴 丕蹖噩丕丿 賲蹖鈥屫促堌�',
+  removeOriginal: '丨匕賮 亘乇賳丕賲賴 丕氐賱蹖',
+  switchStart: '卮乇賵毓 鬲睾蹖蹖乇',
+  typeSelector: {
+    all: '賴賲賴 丕賳賵丕毓',
+    chatbot: '趩鬲鈥屫ㄘж�',
+    agent: '賳賲丕蹖賳丿賴',
+    workflow: '诏乇丿卮 讴丕乇',
+    completion: '鬲讴賲蹖賱',
+    advanced: '趩鬲鈥屬佡勝�',
+  },
+  tracing: {
+    title: '乇丿蹖丕亘蹖 毓賲賱讴乇丿 亘乇賳丕賲賴',
+    description: '倬蹖讴乇亘賳丿蹖 丕乇丕卅賴鈥屫囐嗀� 卮禺氐 孬丕賱孬 LLMOps 賵 乇丿蹖丕亘蹖 毓賲賱讴乇丿 亘乇賳丕賲賴.',
+    config: '倬蹖讴乇亘賳丿蹖',
+    collapse: '亘爻鬲賳',
+    expand: '亘丕夭 讴乇丿賳',
+    tracing: '乇丿蹖丕亘蹖',
+    disabled: '睾蹖乇賮毓丕賱',
+    disabledTip: '賱胤賮丕賸 丕亘鬲丿丕 丕乇丕卅賴鈥屫囐嗀� 乇丕 倬蹖讴乇亘賳丿蹖 讴賳蹖丿',
+    enabled: '丿乇 丨丕賱 禺丿賲鬲',
+    tracingDescription: '孬亘鬲 讴丕賲賱 賲鬲賳 丕噩乇丕蹖 亘乇賳丕賲賴貙 丕夭 噩賲賱賴 鬲賲丕爻鈥屬囏й� LLM貙 賲鬲賳貙 丿乇禺賵丕爻鬲鈥屬囏й� HTTP 賵 亘蹖卮鬲乇貙 亘賴 蹖讴 倬賱鬲賮乇賲 乇丿蹖丕亘蹖 卮禺氐 孬丕賱孬.',
+    configProviderTitle: {
+      configured: '倬蹖讴乇亘賳丿蹖 卮丿賴',
+      notConfigured: '亘乇丕蹖 賮毓丕賱鈥屫池ж槽� 乇丿蹖丕亘蹖 丕乇丕卅賴鈥屫囐嗀� 乇丕 倬蹖讴乇亘賳丿蹖 讴賳蹖丿',
+      moreProvider: '丕乇丕卅賴鈥屫囐嗀з� 亘蹖卮鬲乇',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: '蹖讴 倬賱鬲賮乇賲 賴賲賴鈥屭┴ж辟� 亘乇丕蹖 賴乇 賲乇丨賱賴 丕夭 趩乇禺賴 毓賲乇 亘乇賳丕賲賴鈥屬囏й� 賲亘鬲賳蹖 亘乇 LLM.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: '乇丿蹖丕亘蹖貙 丕乇夭蹖丕亘蹖貙 賲丿蹖乇蹖鬲 丿乇禺賵丕爻鬲鈥屬囏� 賵 賲毓蹖丕乇賴丕 亘乇丕蹖 乇賮毓 丕卮讴丕賱 賵 亘賴亘賵丿 亘乇賳丕賲賴 LLM 卮賲丕.',
+    },
+    inUse: '丿乇 丨丕賱 丕爻鬲賮丕丿賴',
+    configProvider: {
+      title: '倬蹖讴乇亘賳丿蹖',
+      placeholder: '讴賱蹖丿 {{key}} 禺賵丿 乇丕 賵丕乇丿 讴賳蹖丿',
+      project: '倬乇賵跇賴',
+      publicKey: '讴賱蹖丿 毓賲賵賲蹖',
+      secretKey: '讴賱蹖丿 賲丨乇賲丕賳賴',
+      viewDocsLink: '賲卮丕賴丿賴 賲爻鬲賳丿丕鬲 {{key}}',
+      removeConfirmTitle: '丨匕賮 倬蹖讴乇亘賳丿蹖 {{key}}責',
+      removeConfirmContent: '倬蹖讴乇亘賳丿蹖 賮毓賱蹖 丿乇 丨丕賱 丕爻鬲賮丕丿賴 丕爻鬲貙 丨匕賮 丌賳 賵蹖跇诏蹖 乇丿蹖丕亘蹖 乇丕 睾蹖乇賮毓丕賱 禺賵丕賴丿 讴乇丿.',
+    },
+    view: '賲卮丕賴丿賴',
+    opik: {
+      title: '丕賵倬蹖讴',
+      description: 'Opik 蹖讴 倬賱鬲 賮乇賲 賲賳亘毓 亘丕夭 亘乇丕蹖 丕乇夭蹖丕亘蹖貙 丌夭賲丕蹖卮 賵 賳馗丕乇鬲 亘乇 亘乇賳丕賲賴 賴丕蹖 LLM 丕爻鬲.',
+    },
+    weave: {
+      title: '亘丕賮賳丿诏蹖',
+      description: '賵蹖賵 蹖讴 倬賱鬲賮乇賲 賲鬲賳 亘丕夭 亘乇丕蹖 丕乇夭蹖丕亘蹖貙 丌夭賲丕蹖卮 賵 賳馗丕乇鬲 亘乇 亘乇賳丕賲賴鈥屬囏й� LLM 丕爻鬲.',
+    },
+  },
+  answerIcon: {
+    descriptionInExplore: '丌蹖丕 丕夭 賳賲丕丿 WebApp 亘乇丕蹖 噩丕蹖诏夭蹖賳蹖 馃 丿乇 Explore 丕爻鬲賮丕丿賴 讴賳蹖賲 蹖丕 禺蹖乇',
+    description: '丌蹖丕 丕夭 賳賲丕丿 WebApp 亘乇丕蹖 噩丕蹖诏夭蹖賳蹖 馃 丿乇 亘乇賳丕賲賴 賲卮鬲乇讴 丕爻鬲賮丕丿賴 讴賳蹖賲 蹖丕 禺蹖乇',
+    title: '丕夭 賳賲丕丿 WebApp 亘乇丕蹖 噩丕蹖诏夭蹖賳蹖 馃 丕爻鬲賮丕丿賴 讴賳蹖丿',
+  },
+  mermaid: {
+    handDrawn: '丿爻鬲 讴卮蹖丿賴 卮丿賴',
+    classic: '讴賱丕爻蹖讴',
+  },
+  openInExplore: '亘丕夭 讴乇丿賳 丿乇 讴丕賵卮',
+  newAppFromTemplate: {
+    sidebar: {
+      Agent: '毓丕賲賱',
+      Programming: '亘乇賳丕賲賴 賳賵蹖爻蹖',
+      Recommended: '鬲賵氐蹖賴',
+      Assistant: '丿爻鬲蹖丕乇',
+      Workflow: '诏乇丿卮',
+      HR: '爻丕毓鬲',
+      Writing: '賳賵卮鬲賳',
+    },
+    byCategories: '亘乇 丕爻丕爻 丿爻鬲賴 亘賳丿蹖 賴丕',
+    searchAllTemplate: '賴賲賴 賯丕賱亘 賴丕 乇丕 噩爻鬲噩賵 讴賳蹖丿...',
+  },
+  showMyCreatedAppsOnly: '賮賯胤 亘乇賳丕賲賴鈥屬囏й� 丕蹖噩丕丿 卮丿賴 鬲賵爻胤 賲賳 乇丕 賳卮丕賳 亘丿賴',
+  appSelector: {
+    params: '倬丕乇丕賲鬲乇賴丕蹖 亘乇賳丕賲賴',
+    noParams: '亘丿賵賳 倬丕乇丕賲鬲乇 賲賵乇丿 賳蹖丕夭 丕爻鬲',
+    label: '亘乇賳丕賲賴',
+    placeholder: '亘乇賳丕賲賴 丕蹖 乇丕 丕賳鬲禺丕亘 讴賳蹖丿...',
+  },
+  structOutput: {
+    required: '囟乇賵乇蹖',
+    modelNotSupported: '賲丿賱 倬卮鬲蹖亘丕賳蹖 賳賲蹖 卮賵丿',
+    notConfiguredTip: '禺乇賵噩蹖 爻丕禺鬲丕乇蹖 賴賳賵夭 鬲賳馗蹖賲 賳卮丿賴 丕爻鬲',
+    structured: '爻丕禺鬲丕乇 蹖丕賮鬲賴',
+    configure: '鬲賳馗蹖賲丕鬲',
+    moreFillTip: '賳賲丕蹖卮 丨丿丕讴孬乇 郾郯 爻胤丨 鬲賵 丿乇 鬲賵',
+    LLMResponse: '倬丕爻禺 賲丿賱 夭亘丕賳 亘夭乇诏',
+    modelNotSupportedTip: '賲丿賱 賮毓賱蹖 丕蹖賳 賵蹖跇诏蹖 乇丕 倬卮鬲蹖亘丕賳蹖 賳賲蹖鈥屭┵嗀� 賵 亘賴鈥屫焚堌� 禺賵丿讴丕乇 亘賴 鬲夭乇蹖賯 丿乇禺賵丕爻鬲 鬲賳夭賱 倬蹖丿丕 賲蹖鈥屭┵嗀�.',
+    structuredTip: '禺乇賵噩蹖鈥屬囏й� 爻丕禺鬲丕乇蹖 蹖讴 賵蹖跇诏蹖 丕爻鬲 讴賴 鬲囟賲蹖賳 賲蹖鈥屭┵嗀� 賲丿賱 賴賲蹖卮賴 倬丕爻禺鈥屬囏й屰� 鬲賵賱蹖丿 賲蹖鈥屭┵嗀� 讴賴 亘賴 胤乇丨 JSON 丕乇丕卅賴 卮丿賴 卮賲丕 倬丕蹖亘賳丿 亘丕卮丿.',
+  },
+}
+
+export default translation
diff --git a/i18n/fa-IR/billing.ts b/i18n/fa-IR/billing.ts
new file mode 100644
index 0000000..e4de29c
--- /dev/null
+++ b/i18n/fa-IR/billing.ts
@@ -0,0 +1,200 @@
+const translation = {
+  currentPlan: '胤乇丨 賮毓賱蹖',
+  upgradeBtn: {
+    plain: '丕乇鬲賯丕亍 胤乇丨',
+    encourage: '賴賲 丕讴賳賵賳 丕乇鬲賯丕亍 丿賴蹖丿',
+    encourageShort: '丕乇鬲賯丕亍 丿賴蹖丿',
+  },
+  viewBilling: '賲丿蹖乇蹖鬲 氐賵乇鬲丨爻丕亘鈥屬囏� 賵 丕卮鬲乇丕讴鈥屬囏�',
+  buyPermissionDeniedTip: '賱胤賮丕賸 亘丕 賲丿蹖乇 爻丕夭賲丕賳 禺賵丿 鬲賲丕爻 亘诏蹖乇蹖丿 鬲丕 丕卮鬲乇丕讴 鬲賴蹖賴 讴賳蹖丿',
+  plansCommon: {
+    title: '蹖讴 胤乇丨 賲賳丕爻亘 亘乇丕蹖 禺賵丿 丕賳鬲禺丕亘 讴賳蹖丿',
+    yearlyTip: '亘丕 丕卮鬲乇丕讴 爻丕賱丕賳賴 2 賲丕賴 乇丕蹖诏丕賳 丿乇蹖丕賮鬲 讴賳蹖丿!',
+    mostPopular: '賲丨亘賵亘鈥屫臂屬�',
+    planRange: {
+      monthly: '賲丕賴丕賳賴',
+      yearly: '爻丕賱丕賳賴',
+    },
+    month: '賲丕賴',
+    year: '爻丕賱',
+    save: '氐乇賮賴鈥屫堐屰� 讴賳蹖丿 ',
+    free: '乇丕蹖诏丕賳',
+    currentPlan: '胤乇丨 賮毓賱蹖',
+    contractSales: '鬲賲丕爻 亘丕 賮乇賵卮',
+    contractOwner: '鬲賲丕爻 亘丕 賲丿蹖乇 鬲蹖賲',
+    startForFree: '乇丕蹖诏丕賳 卮乇賵毓 讴賳蹖丿',
+    getStartedWith: '卮乇賵毓 讴賳蹖丿 亘丕 ',
+    contactSales: '鬲賲丕爻 亘丕 賮乇賵卮',
+    talkToSales: '氐丨亘鬲 亘丕 賮乇賵卮',
+    modelProviders: '丕乇丕卅賴鈥屫囐嗀з� 賲丿賱',
+    teamMembers: '丕毓囟丕蹖 鬲蹖賲',
+    annotationQuota: '爻賴賲蹖賴 丨丕卮蹖賴鈥屬嗁堐屫驰�',
+    buildApps: '爻丕禺鬲 丕倬賱蹖讴蹖卮賳鈥屬囏�',
+    vectorSpace: '賮囟丕蹖 賵讴鬲賵乇',
+    vectorSpaceBillingTooltip: '賴乇 1 賲诏丕亘丕蹖鬲 賲蹖鈥屫堌з嗀� 丨丿賵丿 1.2 賲蹖賱蹖賵賳 讴丕乇丕讴鬲乇 丕夭 丿丕丿賴鈥屬囏й� 賵讴鬲賵乇 卮丿賴 乇丕 匕禺蹖乇賴 讴賳丿 (亘乇丕爻丕爻 鬲禺賲蹖賳 亘丕 丕爻鬲賮丕丿賴 丕夭 OpenAI Embeddings貙 賲鬲賮丕賵鬲 亘乇 丕爻丕爻 賲丿賱鈥屬囏�).',
+    vectorSpaceTooltip: '賮囟丕蹖 賵讴鬲賵乇 爻蹖爻鬲賲 丨丕賮馗賴 亘賱賳丿 賲丿鬲 丕爻鬲 讴賴 亘乇丕蹖 丿乇讴 丿丕丿賴鈥屬囏й� 卮賲丕 鬲賵爻胤 LLM鈥屬囏� 賲賵乇丿 賳蹖丕夭 丕爻鬲.',
+    documentsUploadQuota: '爻賴賲蹖賴 亘丕乇诏匕丕乇蹖 賲爻鬲賳丿丕鬲',
+    documentProcessingPriority: '丕賵賱賵蹖鬲 倬乇丿丕夭卮 賲爻鬲賳丿丕鬲',
+    documentProcessingPriorityTip: '亘乇丕蹖 丕賵賱賵蹖鬲 倬乇丿丕夭卮 亘丕賱丕鬲乇 賲爻鬲賳丿丕鬲貙 賱胤賮丕賸 胤乇丨 禺賵丿 乇丕 丕乇鬲賯丕亍 丿賴蹖丿.',
+    documentProcessingPriorityUpgrade: '丿丕丿賴鈥屬囏й� 亘蹖卮鬲乇蹖 乇丕 亘丕 丿賯鬲 亘丕賱丕鬲乇 賵 爻乇毓鬲 亘蹖卮鬲乇 倬乇丿丕夭卮 讴賳蹖丿.',
+    priority: {
+      'standard': '丕爻鬲丕賳丿丕乇丿',
+      'priority': '丕賵賱賵蹖鬲',
+      'top-priority': '丕賵賱賵蹖鬲 亘丕賱丕',
+    },
+    logsHistory: '鬲丕乇蹖禺趩賴 诏夭丕乇卮丕鬲',
+    customTools: '丕亘夭丕乇賴丕蹖 爻賮丕乇卮蹖',
+    unavailable: '睾蹖乇賯丕亘賱 丿爻鬲乇爻',
+    days: '乇賵夭',
+    unlimited: '賳丕賲丨丿賵丿',
+    support: '倬卮鬲蹖亘丕賳蹖',
+    supportItems: {
+      communityForums: '丕賳噩賲賳鈥屬囏й� 丕噩鬲賲丕毓蹖',
+      emailSupport: '倬卮鬲蹖亘丕賳蹖 丕蹖賲蹖賱',
+      priorityEmail: '倬卮鬲蹖亘丕賳蹖 丕蹖賲蹖賱 賵 趩鬲 亘丕 丕賵賱賵蹖鬲',
+      logoChange: '鬲睾蹖蹖乇 賱賵诏賵',
+      SSOAuthentication: '鬲兀蹖蹖丿 賴賵蹖鬲 SSO',
+      personalizedSupport: '倬卮鬲蹖亘丕賳蹖 卮禺氐蹖鈥屫池ж槽� 卮丿賴',
+      dedicatedAPISupport: '倬卮鬲蹖亘丕賳蹖 API 丕禺鬲氐丕氐蹖',
+      customIntegration: '蹖讴倬丕乇趩賴鈥屫池ж槽� 賵 倬卮鬲蹖亘丕賳蹖 爻賮丕乇卮蹖',
+      ragAPIRequest: '丿乇禺賵丕爻鬲鈥屬囏й� API RAG',
+      bulkUpload: '亘丕乇诏匕丕乇蹖 丿爻鬲賴鈥屫й� 賲爻鬲賳丿丕鬲',
+      agentMode: '丨丕賱鬲 Agent',
+      workflow: '噩乇蹖丕賳 讴丕乇',
+      llmLoadingBalancing: '鬲賵夭蹖毓 亘丕乇 LLM',
+      llmLoadingBalancingTooltip: '丕囟丕賮賴 讴乇丿賳 趩賳丿蹖賳 讴賱蹖丿 API 亘賴 賲丿賱鈥屬囏ж� 亘賴 胤賵乇 賲丐孬乇 丕夭 賲丨丿賵丿蹖鬲鈥屬囏й� 賳乇禺 API 毓亘賵乇 賲蹖鈥屭┵嗀�.',
+    },
+    comingSoon: '亘賴 夭賵丿蹖',
+    member: '毓囟賵',
+    memberAfter: '毓囟賵',
+    messageRequest: {
+      title: '丕毓鬲亘丕乇丕鬲 倬蹖丕賲',
+      tooltip: '爻賴賲蹖賴鈥屬囏й� 賮乇丕禺賵丕賳蹖 倬蹖丕賲 亘乇丕蹖 胤乇丨鈥屬囏й� 賲禺鬲賱賮 亘丕 丕爻鬲賮丕丿賴 丕夭 賲丿賱鈥屬囏й� OpenAI (亘賴 噩夭 gpt4). 倬蹖丕賲鈥屬囏й� 亘蹖卮 丕夭 丨丿 賲丨丿賵丿蹖鬲 丕夭 讴賱蹖丿 API OpenAI 卮賲丕 丕爻鬲賮丕丿賴 賲蹖鈥屭┵嗁嗀�.',
+      titlePerMonth: '{{count,number}} 倬蹖丕賲 丿乇 賲丕賴',
+    },
+    annotatedResponse: {
+      title: '賲丨丿賵丿蹖鬲鈥屬囏й� 爻賴賲蹖賴 丨丕卮蹖賴鈥屬嗁堐屫驰�',
+      tooltip: '賵蹖乇丕蹖卮 丿爻鬲蹖 賵 丨丕卮蹖賴鈥屬嗁堐屫驰� 倬丕爻禺鈥屬囏ж� 賯丕亘賱蹖鬲鈥屬囏й� 倬乇爻卮 賵 倬丕爻禺 亘丕 讴蹖賮蹖鬲 亘丕賱丕 賵 賯丕亘賱 鬲賳馗蹖賲 亘乇丕蹖 丕倬賱蹖讴蹖卮賳鈥屬囏� 乇丕 賮乇丕賴賲 賲蹖鈥屭┵嗀�. (賮賯胤 丿乇 丕倬賱蹖讴蹖卮賳鈥屬囏й� 趩鬲 丕毓賲丕賱 賲蹖鈥屫促堌�)',
+    },
+    ragAPIRequestTooltip: '亘賴 鬲毓丿丕丿 丿乇禺賵丕爻鬲鈥屬囏й� API 讴賴 賮賯胤 賯丕亘賱蹖鬲鈥屬囏й� 倬乇丿丕夭卮 倬丕蹖诏丕賴 丿丕賳卮 Dify 乇丕 賮乇丕禺賵丕賳蹖 賲蹖鈥屭┵嗁嗀� 丕卮丕乇賴 丿丕乇丿.',
+    receiptInfo: '賮賯胤 氐丕丨亘 鬲蹖賲 賵 賲丿蹖乇 鬲蹖賲 賲蹖鈥屫堌з嗁嗀� 丕卮鬲乇丕讴 鬲賴蹖賴 讴賳賳丿 賵 丕胤賱丕毓丕鬲 氐賵乇鬲丨爻丕亘 乇丕 賲卮丕賴丿賴 讴賳賳丿',
+    apiRateLimitUnit: '{{count,number}}/乇賵夭',
+    cloud: '爻乇賵蹖爻 丕亘乇蹖',
+    documents: '{{count,number}} 爻賳丿賴丕蹖 丿丕賳卮',
+    self: '禺賵丿 賲蹖夭亘丕賳',
+    apiRateLimit: '賲丨丿賵丿蹖鬲 賳乇禺 API',
+    annualBilling: '氐賵乇鬲丨爻丕亘 爻丕賱丕賳賴',
+    freeTrialTip: '丌夭賲丕蹖卮 乇丕蹖诏丕賳 鄄郯郯 鬲賲丕爻 OpenAI.',
+    teamMember_other: '{{count,number}} 丕毓囟丕蹖 鬲蹖賲',
+    unlimitedApiRate: '賴蹖趩 賲丨丿賵丿蹖鬲蹖 亘乇丕蹖 賳乇禺 API 賵噩賵丿 賳丿丕乇丿.',
+    freeTrialTipPrefix: '孬亘鬲鈥屬嗀з� 讴賳蹖丿 賵 蹖讴',
+    comparePlanAndFeatures: '胤乇丨 賴丕 賵 賵蹖跇诏蹖 賴丕 乇丕 賲賯丕蹖爻賴 讴賳蹖丿',
+    teamMember_one: '{{count,number}} 毓囟賵 鬲蹖賲',
+    priceTip: '亘乇丕蹖 賴乇 賲丨蹖胤 讴丕乇/',
+    documentsTooltip: '丨噩賲 賲爻鬲賳丿丕鬲 賵丕乇丿 卮丿賴 丕夭 賲賳亘毓 丿丕丿賴鈥屬囏й� 丿丕賳卮.',
+    freeTrialTipSuffix: '賳蹖丕夭 亘賴 讴丕乇鬲 丕毓鬲亘丕乇蹖 賳蹖爻鬲',
+    teamWorkspace: '{{count,number}} 賮囟丕賷 讴丕乇 鬲賷賲賷',
+    getStarted: '卮乇賵毓 讴賳蹖丿',
+    documentsRequestQuota: '{{count,number}}/丿賯蹖賯賴 賲丨丿賵丿蹖鬲 賳乇禺 丿乇禺賵丕爻鬲 丿丕賳卮',
+    apiRateLimitTooltip: '賲丨丿賵丿蹖鬲 賳乇禺 API 亘乇丕蹖 賴賲賴 丿乇禺賵丕爻鬲鈥屬囏й� 丕賳噩丕賲 卮丿賴 丕夭 胤乇蹖賯 API Dify 丕毓賲丕賱 賲蹖鈥屫促堌� 丕夭 噩賲賱賴 鬲賵賱蹖丿 賲鬲賳貙 賲丨丕賵乇賴鈥屬囏й� 趩鬲貙 丕噩乇丕蹖 诏乇丿卮鈥屬囏й� 讴丕乇 賵 倬乇丿丕夭卮 丕爻賳丕丿.',
+    documentsRequestQuotaTooltip: '鬲毓蹖蹖賳 賲蹖鈥屭┵嗀� 讴賴 鬲毓丿丕丿 讴賱蹖 丕賯丿丕賲丕鬲蹖 讴賴 蹖讴 賮囟丕蹖 讴丕乇蹖 賲蹖鈥屫堌з嗀� 丿乇 賴乇 丿賯蹖賯賴 丿乇 丿丕禺賱 倬丕蹖诏丕賴 丿丕賳卮 丕賳噩丕賲 丿賴丿貙 卮丕賲賱 丕蹖噩丕丿 賲噩賲賵毓賴 丿丕丿賴貙 丨匕賮貙 亘賴鈥屫辟堌藏必池з嗃屫� 亘丕乇诏匕丕乇蹖 賲爻鬲賳丿丕鬲貙 鬲睾蹖蹖乇丕鬲貙 亘丕蹖诏丕賳蹖 賵 倬乇爻卮 丕夭 倬丕蹖诏丕賴 丿丕賳卮 丕爻鬲. 丕蹖賳 賲毓蹖丕乇 亘乇丕蹖 丕乇夭蹖丕亘蹖 毓賲賱讴乇丿 丿乇禺賵丕爻鬲鈥屬囏й� 倬丕蹖诏丕賴 丿丕賳卮 丕爻鬲賮丕丿賴 賲蹖鈥屫促堌�. 亘賴 毓賳賵丕賳 賲孬丕賱貙 丕诏乇 蹖讴 讴丕乇亘乇 Sandbox 丿乇 胤蹖 蹖讴 丿賯蹖賯賴 10 丌夭賲丕蹖卮 賲鬲賵丕賱蹖 丕賳噩丕賲 丿賴丿貙 賮囟丕蹖 讴丕乇蹖 丕賵 亘賴 胤賵乇 賲賵賯鬲 丕夭 丕賳噩丕賲 丕賯丿丕賲丕鬲 夭蹖乇 丿乇 丿賯蹖賯賴 亘毓丿蹖 賲丨丿賵丿 禺賵丕賴丿 卮丿: 丕蹖噩丕丿 賲噩賲賵毓賴 丿丕丿賴貙 丨匕賮貙 亘賴鈥屫辟堌藏必池з嗃� 賵 亘丕乇诏匕丕乇蹖 蹖丕 鬲睾蹖蹖乇 賲爻鬲賳丿丕鬲.',
+  },
+  plans: {
+    sandbox: {
+      name: '賲丨蹖胤 丌夭賲丕蹖卮蹖',
+      description: '200 亘丕乇 丌夭賲丕蹖卮 乇丕蹖诏丕賳 GPT',
+      includesTitle: '卮丕賲賱:',
+      for: '丿賵乇賴 丌夭賲丕蹖卮蹖 乇丕蹖诏丕賳 賯丕亘賱蹖鬲鈥屬囏й� 丕氐賱蹖',
+    },
+    professional: {
+      name: '丨乇賮賴鈥屫й�',
+      description: '亘乇丕蹖 丕賮乇丕丿 賵 鬲蹖賲鈥屬囏й� 讴賵趩讴 亘乇丕蹖 亘丕夭 讴乇丿賳 賯丿乇鬲 亘蹖卮鬲乇 亘賴 胤賵乇 賲賯乇賵賳 亘賴 氐乇賮賴.',
+      includesTitle: '賴賲賴 趩蹖夭 丿乇 胤乇丨 乇丕蹖诏丕賳貙 亘賴 毓賱丕賵賴:',
+      for: '亘乇丕蹖 鬲賵爻毓賴鈥屫囐嗀з� 賲爻鬲賯賱/鬲蹖賲鈥屬囏й� 讴賵趩讴',
+    },
+    team: {
+      name: '鬲蹖賲',
+      description: '賴賲讴丕乇蹖 亘丿賵賳 賲丨丿賵丿蹖鬲 賵 賱匕鬲 亘乇丿賳 丕夭 毓賲賱讴乇丿 亘乇鬲乇.',
+      includesTitle: '賴賲賴 趩蹖夭 丿乇 胤乇丨 丨乇賮賴鈥屫й屫� 亘賴 毓賱丕賵賴:',
+      for: '亘乇丕蹖 鬲蹖賲鈥屬囏й� 賲鬲賵爻胤',
+    },
+    enterprise: {
+      name: '爻丕夭賲丕賳蹖',
+      description: '丿乇蹖丕賮鬲 讴丕賲賱鈥屫臂屬� 賯丕亘賱蹖鬲鈥屬囏� 賵 倬卮鬲蹖亘丕賳蹖 亘乇丕蹖 爻蹖爻鬲賲鈥屬囏й� 亘夭乇诏 賵 亘丨乇丕賳蹖.',
+      includesTitle: '賴賲賴 趩蹖夭 丿乇 胤乇丨 鬲蹖賲貙 亘賴 毓賱丕賵賴:',
+      features: {
+        0: '乇丕賴讴丕乇賴丕蹖 丕爻鬲賯乇丕乇 賲賯蹖丕爻鈥屬矩佰屫� 丿乇 爻胤丨 爻丕夭賲丕賳蹖',
+        8: '倬卮鬲蹖亘丕賳蹖 賮賳蹖 丨乇賮賴鈥屫й�',
+        3: '趩賳丿蹖賳 賮囟丕蹖 讴丕乇蹖 賵 賲丿蹖乇蹖鬲 爻丕夭賲丕賳蹖',
+        5: 'SLA 賴丕蹖 鬲賵丕賮賯 卮丿賴 鬲賵爻胤 卮乇讴丕蹖 Dify',
+        4: 'SSO',
+        2: '賵蹖跇诏蹖鈥屬囏й� 丕賳丨氐丕乇蹖 爻丕夭賲丕賳蹖',
+        1: '賲噩賵夭 氐丿賵乇 賲噩賵夭 鬲噩丕乇蹖',
+        6: '丕賲賳蹖鬲 賵 讴賳鬲乇賱鈥屬囏й� 倬蹖卮乇賮鬲賴',
+        7: '亘賴鈥屫辟堌藏必池з嗃屸�屬囏� 賵 賳诏賴丿丕乇蹖 鬲賵爻胤 丿蹖賮蹖 亘賴鈥屫焚堌� 乇爻賲蹖',
+      },
+      price: '爻賮丕乇卮蹖',
+      btnText: '鬲賲丕爻 亘丕 賮乇賵卮',
+      for: '亘乇丕蹖 鬲蹖賲鈥屬囏й� 亘夭乇诏',
+      priceTip: '賮賯胤 氐賵乇鬲丨爻丕亘 爻丕賱蹖丕賳賴',
+    },
+    community: {
+      features: {
+        0: '鬲賲丕賲 賵蹖跇诏蹖鈥屬囏й� 丕氐賱蹖 賲賳鬲卮乇 卮丿賴 丿乇 賲禺夭賳 毓賲賵賲蹖',
+        2: '亘丕 乇毓丕蹖鬲 賲噩賵夭 賲賳亘毓 亘丕夭 丿蹖賮蹖',
+        1: '賮囟丕蹖 讴丕乇蹖 賵丕丨丿',
+      },
+      btnText: '卮乇賵毓 讴賳蹖丿 亘丕 噩丕賲毓賴',
+      price: '乇丕蹖诏丕賳',
+      includesTitle: '賵蹖跇诏蹖鈥屬囏й� 乇丕蹖诏丕賳:',
+      description: '亘乇丕蹖 讴丕乇亘乇丕賳 賮乇丿蹖貙 鬲蹖賲鈥屬囏й� 讴賵趩讴 蹖丕 倬乇賵跇賴鈥屬囏й� 睾蹖乇 鬲噩丕乇蹖',
+      name: '噩丕賲毓賴',
+      for: '亘乇丕蹖 讴丕乇亘乇丕賳 賮乇丿蹖貙 鬲蹖賲鈥屬囏й� 讴賵趩讴 蹖丕 倬乇賵跇賴鈥屬囏й� 睾蹖乇 鬲噩丕乇蹖',
+    },
+    premium: {
+      features: {
+        1: '賲丨賱 讴丕乇 賵丕丨丿',
+        0: '賯丕亘賱 丕胤賲蹖賳丕賳 禺賵丿賲丿蹖乇蹖鬲蹖 鬲賵爻胤 丕乇丕卅賴鈥屫囐嗀з� 賲禺鬲賱賮 丕亘乇',
+        2: '卮毓丕乇 賵 爻賮丕乇卮蹖鈥屫池ж槽� 亘乇賳丿 賵亘鈥屫з举勠屭┷屫促�',
+        3: '倬卮鬲蹖亘丕賳蹖 丕賵賱賵蹖鬲 丕蹖賲蹖賱 賵 趩鬲',
+      },
+      btnText: '诏乇賮鬲賳 賳爻禺賴 倬乇蹖賲蹖賵賲 丿乇',
+      description: '亘乇丕蹖 爻丕夭賲丕賳鈥屬囏� 賵 鬲蹖賲鈥屬囏й� 賲蹖丕賳鈥屫必�',
+      price: '賯丕亘賱 诏爻鬲乇卮',
+      includesTitle: '賴賲賴 趩蹖夭 丕夭 噩丕賲毓賴貙 亘賴 毓賱丕賵賴:',
+      for: '亘乇丕蹖 爻丕夭賲丕賳鈥屬囏� 賵 鬲蹖賲鈥屬囏й� 賲蹖丕賳鈥屫必�',
+      name: '倬蹖卮乇賮鬲賴',
+      priceTip: '亘乇 丕爻丕爻 亘丕夭丕乇 丕亘乇蹖',
+      comingSoon: '倬卮鬲蹖亘丕賳蹖 賲丕蹖讴乇賵爻丕賮鬲 丌跇賵乇 賵 诏賵诏賱 讴賱賵丿 亘賴 夭賵丿蹖 丿乇 丿爻鬲乇爻 禺賵丕賴丿 亘賵丿',
+    },
+  },
+  vectorSpace: {
+    fullTip: '賮囟丕蹖 賵讴鬲賵乇 倬乇 丕爻鬲.',
+    fullSolution: '胤乇丨 禺賵丿 乇丕 丕乇鬲賯丕亍 丿賴蹖丿 鬲丕 賮囟丕蹖 亘蹖卮鬲乇蹖 丿乇蹖丕賮鬲 讴賳蹖丿.',
+  },
+  apps: {
+    fullTipLine1: '胤乇丨 禺賵丿 乇丕 丕乇鬲賯丕亍 丿賴蹖丿 鬲丕',
+    fullTipLine2: '丕倬賱蹖讴蹖卮賳鈥屬囏й� 亘蹖卮鬲乇蹖 亘爻丕夭蹖丿.',
+    fullTip2: '賲丨丿賵丿蹖鬲 胤乇丨 亘賴 倬丕蹖丕賳 乇爻蹖丿',
+    contactUs: '亘丕 賲丕 鬲賲丕爻 亘诏蹖乇蹖丿',
+    fullTip1: '亘賴鈥屫辟堌藏必池з嗃� 讴賳蹖丿 鬲丕 亘乇賳丕賲賴鈥屬囏й� 亘蹖卮鬲乇蹖 丕蹖噩丕丿 讴賳蹖丿',
+    fullTip1des: '卮賲丕 亘賴 賲丨丿賵丿蹖鬲 爻丕禺鬲 亘乇賳丕賲賴鈥屬囏� 丿乇 丕蹖賳 胤乇丨 乇爻蹖丿賴鈥屫й屫�',
+    fullTip2des: '鬲賵氐蹖賴 賲蹖鈥屫促堌� 亘乇賳丕賲賴鈥屬囏й� 睾蹖乇賮毓丕賱 乇丕 倬丕讴 讴賳蹖丿 鬲丕 賮囟丕蹖 丕爻鬲賮丕丿賴 乇丕 丌夭丕丿 讴賳蹖丿貙 蹖丕 亘丕 賲丕 鬲賲丕爻 亘诏蹖乇蹖丿.',
+  },
+  annotatedResponse: {
+    fullTipLine1: '胤乇丨 禺賵丿 乇丕 丕乇鬲賯丕亍 丿賴蹖丿 鬲丕',
+    fullTipLine2: '賲讴丕賱賲丕鬲 亘蹖卮鬲乇蹖 乇丕 丨丕卮蹖賴鈥屬嗁堐屫驰� 讴賳蹖丿.',
+    quotaTitle: '爻賴賲蹖賴 倬丕爻禺 丨丕卮蹖賴鈥屬嗁堐屫驰�',
+  },
+  usagePage: {
+    documentsUploadQuota: '丨噩賲 亘丕乇诏匕丕乇蹖 丕爻賳丕丿',
+    vectorSpace: '匕禺蹖乇賴鈥屫池ж槽� 丿丕丿賴鈥屬囏й� 丿丕賳卮',
+    teamMembers: '丕毓囟丕蹖 鬲蹖賲',
+    annotationQuota: '爻賴丕賲 丨丕卮蹖賴',
+    buildApps: '爻丕禺鬲 亘乇賳丕賲賴 賴丕',
+    vectorSpaceTooltip: '爻賳丿賴丕蹖蹖 讴賴 亘丕 丨丕賱鬲 賳賲丕蹖賴鈥屫池ж槽� 亘丕 讴蹖賮蹖鬲 亘丕賱丕 鬲賴蹖賴 賲蹖鈥屫促堎嗀� 賲賳丕亘毓 匕禺蹖乇賴鈥屫池ж槽� 丿丕丿賴鈥屬囏й� 丿丕賳卮 乇丕 賲氐乇賮 禺賵丕賴賳丿 讴乇丿. 夭賲丕賳蹖 讴賴 匕禺蹖乇賴鈥屫池ж槽� 丿丕丿賴鈥屬囏й� 丿丕賳卮 亘賴 丨丿 禺賵丿 亘乇爻丿貙 丕爻賳丕丿 噩丿蹖丿 亘丕乇诏夭丕乇蹖 賳禺賵丕賴賳丿 卮丿.',
+  },
+  teamMembers: '丕毓囟丕蹖 鬲蹖賲',
+}
+
+export default translation
diff --git a/i18n/fa-IR/common.ts b/i18n/fa-IR/common.ts
new file mode 100644
index 0000000..64a5c3b
--- /dev/null
+++ b/i18n/fa-IR/common.ts
@@ -0,0 +1,672 @@
+const translation = {
+  api: {
+    success: '賲賵賮賯蹖鬲',
+    actionSuccess: '毓賲賱蹖丕鬲 賲賵賮賯',
+    saved: '匕禺蹖乇賴 卮丿',
+    create: '丕蹖噩丕丿 卮丿',
+    remove: '丨匕賮 卮丿',
+  },
+  operation: {
+    create: '丕蹖噩丕丿',
+    confirm: '鬲丕蹖蹖丿',
+    cancel: '賱睾賵',
+    clear: '倬丕讴 讴乇丿賳',
+    save: '匕禺蹖乇賴',
+    saveAndEnable: '匕禺蹖乇賴 賵 賮毓丕賱 爻丕夭蹖',
+    edit: '賵蹖乇丕蹖卮',
+    add: '丕賮夭賵丿賳',
+    added: '丕囟丕賮賴 卮丿',
+    refresh: '卮乇賵毓 賲噩丿丿',
+    reset: '亘丕夭賳卮丕賳蹖',
+    search: '噩爻鬲噩賵',
+    change: '鬲睾蹖蹖乇',
+    remove: '丨匕賮',
+    send: '丕乇爻丕賱',
+    copy: '讴倬蹖',
+    lineBreak: '禺胤 噩丿蹖丿',
+    sure: '賲胤賲卅賳 賴爻鬲賲',
+    download: '丿丕賳賱賵丿',
+    delete: '丨匕賮',
+    settings: '鬲賳馗蹖賲丕鬲',
+    setup: '乇丕賴 丕賳丿丕夭蹖',
+    getForFree: '丿乇蹖丕賮鬲 乇丕蹖诏丕賳',
+    reload: '亘丕乇诏匕丕乇蹖 賲噩丿丿',
+    ok: '鬲丕蹖蹖丿',
+    log: '诏夭丕乇卮',
+    learnMore: '丕胤賱丕毓丕鬲 亘蹖卮鬲乇',
+    params: '倬丕乇丕賲鬲乇賴丕',
+    duplicate: '鬲讴乇丕乇',
+    rename: '鬲睾蹖蹖乇 賳丕賲',
+    audioSourceUnavailable: '賲賳亘毓 氐賵鬲蹖 丿乇 丿爻鬲乇爻 賳蹖爻鬲',
+    zoomIn: '亘夭乇诏賳賲丕蹖蹖',
+    copyImage: '讴倬蹖 鬲氐賵蹖乇',
+    openInNewTab: '亘丕夭 讴乇丿賳 丿乇 亘乇诏賴 噩丿蹖丿',
+    zoomOut: '讴賵趩讴 賳賲丕蹖蹖',
+    close: '賳夭丿蹖讴',
+    regenerate: '亘丕夭爻丕夭蹖',
+    view: '賲卮丕賴丿賴',
+    viewMore: '亘蹖卮鬲乇 亘亘蹖賳蹖丿',
+    saveAndRegenerate: '匕禺蹖乇賴 賵 亘丕夭爻丕夭蹖 鬲讴賴 賴丕蹖 賮乇夭賳丿',
+    submit: '丕乇爻丕賱',
+    skip: '讴卮鬲蹖',
+    imageCopied: '鬲氐賵蹖乇 讴倬蹖 卮丿賴',
+    deleteApp: '丨匕賮 亘乇賳丕賲賴',
+    copied: '讴倬蹖',
+    viewDetails: '丿蹖丿賳 噩夭卅蹖丕鬲',
+    in: '丿乇',
+    downloadFailed: '丿丕賳賱賵丿 賳丕賲賵賮賯 亘賵丿. 賱胤賮丕賸 亘毓丿丕賸 丿賵亘丕乇賴 鬲賱丕卮 讴賳蹖丿.',
+    more: '亘蹖卮鬲乇',
+    format: '賯丕賱亘',
+    downloadSuccess: '丿丕賳賱賵丿 讴丕賲賱 卮丿.',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 丕賱夭丕賲蹖 丕爻鬲',
+    urlError: '丌丿乇爻 亘丕蹖丿 亘丕 http:// 蹖丕 https:// 卮乇賵毓 卮賵丿',
+  },
+  placeholder: {
+    input: '賱胤賮丕 賵丕乇丿 讴賳蹖丿',
+    select: '賱胤賮丕 丕賳鬲禺丕亘 讴賳蹖丿',
+  },
+  voice: {
+    language: {
+      zhHans: '趩蹖賳蹖',
+      zhHant: '趩蹖賳蹖 爻賳鬲蹖',
+      enUS: '丕賳诏賱蹖爻蹖',
+      deDE: '丌賱賲丕賳蹖',
+      frFR: '賮乇丕賳爻賵蹖',
+      esES: '丕爻倬丕賳蹖丕蹖蹖',
+      itIT: '丕蹖鬲丕賱蹖丕蹖蹖',
+      thTH: '鬲丕蹖賱賳丿蹖',
+      idID: '丕賳丿賵賳夭蹖丕蹖蹖',
+      jaJP: '跇丕倬賳蹖',
+      koKR: '讴乇賴鈥屫й�',
+      ptBR: '倬乇鬲睾丕賱蹖',
+      ruRU: '乇賵爻蹖',
+      ukUA: '丕賵讴乇丕蹖賳蹖',
+      viVN: '賵蹖鬲賳丕賲蹖',
+      plPL: '賱賴爻鬲丕賳蹖',
+      roRO: '乇賵賲丕賳蹖丕蹖蹖',
+      hiIN: '賴賳丿蹖',
+      trTR: '鬲乇讴蹖',
+      faIR: '賮丕乇爻蹖',
+    },
+  },
+  unit: {
+    char: '讴丕乇丕讴鬲乇',
+  },
+  actionMsg: {
+    noModification: '丿乇 丨丕賱 丨丕囟乇 鬲睾蹖蹖乇蹖 賵噩賵丿 賳丿丕乇丿.',
+    modifiedSuccessfully: '亘丕 賲賵賮賯蹖鬲 鬲睾蹖蹖乇 蹖丕賮鬲',
+    modifiedUnsuccessfully: '鬲睾蹖蹖乇 賳丕賲賵賮賯 亘賵丿',
+    copySuccessfully: '亘丕 賲賵賮賯蹖鬲 讴倬蹖 卮丿',
+    paySucceeded: '倬乇丿丕禺鬲 賲賵賮賯',
+    payCancelled: '倬乇丿丕禺鬲 賱睾賵 卮丿',
+    generatedSuccessfully: '亘丕 賲賵賮賯蹖鬲 鬲賵賱蹖丿 卮丿',
+    generatedUnsuccessfully: '鬲賵賱蹖丿 賳丕賲賵賮賯 亘賵丿',
+  },
+  model: {
+    params: {
+      temperature: '丿賲丕',
+      temperatureTip:
+        '鬲氐丕丿賮蹖 亘賵丿賳 乇丕 讴賳鬲乇賱 賲蹖鈥屭┵嗀�: 讴丕賴卮 丌賳 賲賳噩乇 亘賴 鬲讴賲蹖賱鈥屬囏й� 讴賲鬲乇 鬲氐丕丿賮蹖 賲蹖鈥屫促堌�. 亘丕 賳夭丿蹖讴 卮丿賳 丿賲丕 亘賴 氐賮乇貙 賲丿賱 賯胤毓蹖 賵 鬲讴乇丕乇蹖 賲蹖鈥屫促堌�.',
+      top_p: '亘丕賱丕鬲乇蹖賳 P',
+      top_pTip:
+        '鬲賳賵毓 乇丕 丕夭 胤乇蹖賯 賳賲賵賳賴鈥屭屫臂� 賴爻鬲賴 讴賳鬲乇賱 賲蹖鈥屭┵嗀�: 0.5 亘賴 丕蹖賳 賲毓賳蹖 丕爻鬲 讴賴 賳蹖賲蹖 丕夭 賴賲賴 诏夭蹖賳賴鈥屬囏й� 賵夭賳鈥屫ж� 丕丨鬲賲丕賱蹖 丿乇 賳馗乇 诏乇賮鬲賴 賲蹖鈥屫促堎嗀�.',
+      presence_penalty: '噩乇蹖賲賴 丨囟賵乇',
+      presence_penaltyTip:
+        '趩賯丿乇 鬲賵讴賳鈥屬囏й� 噩丿蹖丿 乇丕 亘乇 丕爻丕爻 丕蹖賳讴賴 丌蹖丕 丿乇 賲鬲賳 鬲丕讴賳賵賳 馗丕賴乇 卮丿賴鈥屫з嗀� 噩乇蹖賲賴 讴賳蹖賲.\n丕丨鬲賲丕賱 賲丿賱 亘乇丕蹖 氐丨亘鬲 丿乇 賲賵乇丿 賲賵囟賵毓丕鬲 噩丿蹖丿 乇丕 丕賮夭丕蹖卮 賲蹖鈥屫囏�.',
+      frequency_penalty: '噩乇蹖賲賴 鬲讴乇丕乇',
+      frequency_penaltyTip:
+        '趩賯丿乇 鬲賵讴賳鈥屬囏й� 噩丿蹖丿 乇丕 亘乇 丕爻丕爻 賮乇丕賵丕賳蹖 賲賵噩賵丿 丌賳賴丕 丿乇 賲鬲賳 鬲丕讴賳賵賳 噩乇蹖賲賴 讴賳蹖賲.\n丕丨鬲賲丕賱 鬲讴乇丕乇 丿賯蹖賯 賴賲丕賳 禺胤 鬲賵爻胤 賲丿賱 乇丕 讴丕賴卮 賲蹖鈥屫囏�.',
+      max_tokens: '丨丿丕讴孬乇 鬲賵讴賳',
+      max_tokensTip:
+        '亘乇丕蹖 賲丨丿賵丿 讴乇丿賳 丨丿丕讴孬乇 胤賵賱 倬丕爻禺貙 丿乇 鬲賵讴賳鈥屬囏� 丕爻鬲賮丕丿賴 賲蹖鈥屫促堌�. \n賲賯丕丿蹖乇 亘夭乇诏鬲乇 賲賲讴賳 丕爻鬲 賮囟丕蹖 亘丕賯蹖賲丕賳丿賴 亘乇丕蹖 讴賱賲丕鬲 乇丕賴賳賲丕貙 诏夭丕乇卮鈥屬囏й� 趩鬲 賵 丿丕賳卮 乇丕 賲丨丿賵丿 讴賳丿. \n鬲賵氐蹖賴 賲蹖鈥屫促堌� 丌賳 乇丕 讴賲鬲乇 丕夭 丿賵 爻賵賲 鬲賳馗蹖賲 讴賳蹖丿\ngpt-4-1106-preview貙 gpt-4-vision-preview 丨丿丕讴孬乇 鬲賵讴賳 (賵乇賵丿蹖 128k 禺乇賵噩蹖 4k)',
+      maxTokenSettingTip: '鬲賳馗蹖賲 丨丿丕讴孬乇 鬲賵讴賳 卮賲丕 亘丕賱丕爻鬲貙 讴賴 賲賲讴賳 丕爻鬲 賮囟丕 乇丕 亘乇丕蹖 乇丕賴賳賲丕賴丕貙 倬乇爻 賵 噩賵賴丕 賵 丿丕丿賴鈥屬囏� 賲丨丿賵丿 讴賳丿. 丿乇 賳馗乇 亘诏蹖乇蹖丿 丌賳 乇丕 夭蹖乇 2/3 鬲賳馗蹖賲 讴賳蹖丿.',
+      setToCurrentModelMaxTokenTip: '丨丿丕讴孬乇 鬲賵讴賳 亘賴 80侏 丨丿丕讴孬乇 鬲賵讴賳 賲丿賱 賮毓賱蹖 {{maxToken}} 亘賴鈥屫辟堌藏必池з嗃� 卮丿.',
+      stop_sequences: '鬲賵丕賱蹖鈥屬囏й� 鬲賵賯賮',
+      stop_sequencesTip: '丨丿丕讴孬乇 趩賴丕乇 鬲賵丕賱蹖 讴賴 API 鬲賵賱蹖丿 鬲賵讴賳鈥屬囏й� 亘蹖卮鬲乇 乇丕 賲鬲賵賯賮 賲蹖鈥屭┵嗀�. 賲鬲賳 亘乇诏乇丿丕賳丿賴 卮丿賴 卮丕賲賱 鬲賵丕賱蹖 鬲賵賯賮 賳禺賵丕賴丿 亘賵丿.',
+      stop_sequencesPlaceholder: '鬲賵丕賱蹖 乇丕 賵丕乇丿 讴賳蹖丿 賵 Tab 乇丕 賮卮丕乇 丿賴蹖丿',
+    },
+    tone: {
+      Creative: '禺賱丕賯丕賳賴',
+      Balanced: '賲鬲毓丕丿賱',
+      Precise: '丿賯蹖賯',
+      Custom: '爻賮丕乇卮蹖',
+    },
+    addMoreModel: '亘乇丕蹖 丕賮夭賵丿賳 賲丿賱鈥屬囏й� 亘蹖卮鬲乇 亘賴 鬲賳馗蹖賲丕鬲 亘乇賵蹖丿',
+    settingsLink: '鬲賳馗蹖賲丕鬲 丕乇丕卅賴 丿賴賳丿賴 賲丿賱',
+    capabilities: '賯丕亘賱蹖鬲 賴丕蹖 趩賳丿 賵噩賴蹖',
+  },
+  menus: {
+    status: '亘鬲丕',
+    explore: '讴丕賵卮',
+    apps: '丕爻鬲賵丿蹖賵',
+    plugins: '丕賮夭賵賳賴鈥屬囏�',
+    pluginsTips: '丕賮夭賵賳賴鈥屬囏й� 卮禺氐 孬丕賱孬 乇丕 丕丿睾丕賲 讴賳蹖丿 蹖丕 丕賮夭賵賳賴鈥屬囏й� 賴賵卮 賲氐賳賵毓蹖 爻丕夭诏丕乇 亘丕 ChatGPT 丕蹖噩丕丿 讴賳蹖丿.',
+    datasets: '丿丕賳卮',
+    datasetsTips: '亘賴 夭賵丿蹖: 丿丕丿賴鈥屬囏й� 賲鬲賳蹖 禺賵丿 乇丕 賵丕乇丿 讴賳蹖丿 蹖丕 丕夭 胤乇蹖賯 Webhook 丿丕丿賴鈥屬囏� 乇丕 丿乇 夭賲丕賳 賵丕賯毓蹖 亘乇丕蹖 亘賴亘賵丿 夭賲蹖賳賴 LLM 亘賳賵蹖爻蹖丿.',
+    newApp: '亘乇賳丕賲賴 噩丿蹖丿',
+    newDataset: '丕蹖噩丕丿 丿丕賳卮',
+    tools: '丕亘夭丕乇賴丕',
+    exploreMarketplace: '亘丕夭丕乇 乇丕 讴丕賵卮 讴賳蹖丿',
+  },
+  userProfile: {
+    settings: '鬲賳馗蹖賲丕鬲',
+    emailSupport: '倬卮鬲蹖亘丕賳蹖 丕蹖賲蹖賱',
+    workspace: '賮囟丕蹖 讴丕乇蹖',
+    createWorkspace: '丕蹖噩丕丿 賮囟丕蹖 讴丕乇蹖',
+    helpCenter: '乇丕賴賳賲丕',
+    communityFeedback: '亘丕夭禺賵乇丿',
+    roadmap: '賳賯卮賴 乇丕賴',
+    community: '丕賳噩賲賳',
+    about: '丿乇亘丕乇賴',
+    logout: '禺乇賵噩',
+    github: '诏蹖鬲鈥屬囏ж�',
+    compliance: '丕賳胤亘丕賯',
+    support: '倬卮鬲蹖亘丕賳蹖',
+  },
+  settings: {
+    accountGroup: '丨爻丕亘 讴丕乇亘乇蹖',
+    workplaceGroup: '賮囟丕蹖 讴丕乇蹖',
+    account: '丨爻丕亘 賲賳',
+    members: '丕毓囟丕',
+    billing: '氐賵乇鬲丨爻丕亘',
+    integrations: '丕丿睾丕賲鈥屬囏�',
+    language: '夭亘丕賳',
+    provider: '丕乇丕卅賴 丿賴賳丿賴 賲丿賱',
+    dataSource: '賲賳亘毓 丿丕丿賴',
+    plugin: '丕賮夭賵賳賴鈥屬囏�',
+    apiBasedExtension: '鬲賵爻毓賴 賲亘鬲賳蹖 亘乇 API',
+    generalGroup: '毓賲賵賲蹖',
+  },
+  account: {
+    avatar: '丌賵丕鬲丕乇',
+    name: '賳丕賲',
+    email: '丕蹖賲蹖賱',
+    password: '乇賲夭 毓亘賵乇',
+    passwordTip: '丕诏乇 賳賲蹖鈥屫堌з囒屫� 丕夭 讴丿賴丕蹖 賵乇賵丿 賲賵賯鬲 丕爻鬲賮丕丿賴 讴賳蹖丿貙 賲蹖鈥屫堌з嗃屫� 蹖讴 乇賲夭 毓亘賵乇 丿丕卅賲蹖 鬲賳馗蹖賲 讴賳蹖丿',
+    setPassword: '鬲賳馗蹖賲 乇賲夭 毓亘賵乇',
+    resetPassword: '亘丕夭賳卮丕賳蹖 乇賲夭 毓亘賵乇',
+    currentPassword: '乇賲夭 毓亘賵乇 賮毓賱蹖',
+    newPassword: '乇賲夭 毓亘賵乇 噩丿蹖丿',
+    confirmPassword: '鬲兀蹖蹖丿 乇賲夭 毓亘賵乇',
+    notEqual: '丿賵 乇賲夭 毓亘賵乇 賲鬲賮丕賵鬲 賴爻鬲賳丿.',
+    langGeniusAccount: '丨爻丕亘 Dify',
+    langGeniusAccountTip: '丨爻丕亘 Dify 卮賲丕 賵 丿丕丿賴鈥屬囏й� 讴丕乇亘乇蹖 賲乇鬲亘胤.',
+    editName: '賵蹖乇丕蹖卮 賳丕賲',
+    showAppLength: '賳賲丕蹖卮 {{length}} 亘乇賳丕賲賴',
+    delete: '丨匕賮 丨爻丕亘 讴丕乇亘乇蹖',
+    deleteTip: '丨匕賮 丨爻丕亘 讴丕乇亘乇蹖 卮賲丕 鬲賲丕賲 丿丕丿賴鈥屬囏й� 卮賲丕 乇丕 亘賴 胤賵乇 丿丕卅賲蹖 倬丕讴 賲蹖鈥屭┵嗀� 賵 賯丕亘賱 亘丕夭蹖丕亘蹖 賳蹖爻鬲.',
+    deleteConfirmTip: '亘乇丕蹖 鬲兀蹖蹖丿貙 賱胤賮丕賸 賲賵丕乇丿 夭蹖乇 乇丕 丕夭 丕蹖賲蹖賱 孬亘鬲鈥屬嗀з� 卮丿賴 禺賵丿 亘賴 丕蹖賳 丌丿乇爻 丕乇爻丕賱 讴賳蹖丿 ',
+    account: '丨爻丕亘',
+    myAccount: '丨爻丕亘 賲賳',
+    studio: '丕爻鬲賵丿蹖賵 Dify',
+    feedbackTitle: '亘丕夭禺賵乇丿',
+    verificationPlaceholder: '讴丿 6 乇賯賲蹖 乇丕 噩丕蹖诏匕丕乇蹖 讴賳蹖丿',
+    deletePlaceholder: '賱胤賮丕 丕蹖賲蹖賱 禺賵丿 乇丕 賵丕乇丿 讴賳蹖丿',
+    permanentlyDeleteButton: '丨匕賮 丿丕卅賲蹖 丨爻丕亘',
+    verificationLabel: '讴丿 鬲兀蹖蹖丿',
+    feedbackPlaceholder: '丕禺鬲蹖丕乇蹖',
+    sendVerificationButton: '丕乇爻丕賱 讴丿 鬲兀蹖蹖丿',
+    deletePrivacyLink: '爻蹖丕爻鬲 丨賮馗 丨乇蹖賲 禺氐賵氐蹖.',
+    deleteLabel: '亘乇丕蹖 鬲丕蹖蹖丿貙 賱胤賮丕 丕蹖賲蹖賱 禺賵丿 乇丕 丿乇 夭蹖乇 鬲丕蹖倬 讴賳蹖丿',
+    deleteSuccessTip: '丨爻丕亘 卮賲丕 亘乇丕蹖 倬丕蹖丕賳 丿丕丿賳 亘賴 丨匕賮 亘賴 夭賲丕賳 賳蹖丕夭 丿丕乇丿. 賵賯鬲蹖 賴賲賴 趩蹖夭 鬲賲丕賲 卮丿 亘賴 卮賲丕 丕蹖賲蹖賱 禺賵丕賴蹖賲 夭丿.',
+    deletePrivacyLinkTip: '亘乇丕蹖 讴爻亘 丕胤賱丕毓丕鬲 亘蹖卮鬲乇 丿乇 賲賵乇丿 賳丨賵賴 賲丿蹖乇蹖鬲 丿丕丿賴 賴丕蹖 卮賲丕貙 賱胤賮丕 亘賴 賲丕 賲乇丕噩毓賴 讴賳蹖丿',
+    feedbackLabel: '亘賴 賲丕 亘诏賵蹖蹖丿 趩乇丕 丨爻丕亘 禺賵丿 乇丕 丨匕賮 讴乇丿賴 丕蹖丿責',
+    editWorkspaceInfo: '賵蹖乇丕蹖卮 丕胤賱丕毓丕鬲 賮囟丕蹖 讴丕乇',
+    workspaceName: '賳丕賲 賮囟丕蹖 讴丕乇蹖',
+    workspaceIcon: '丌蹖讴賵賳 賲丨蹖胤 讴丕乇',
+  },
+  members: {
+    team: '鬲蹖賲',
+    invite: '丕賮夭賵丿賳',
+    name: '賳丕賲',
+    lastActive: '丌禺乇蹖賳 賮毓丕賱蹖鬲',
+    role: '賳賯卮鈥屬囏�',
+    pending: '丿乇 丕賳鬲馗丕乇...',
+    owner: '賲丕賱讴',
+    admin: '賲丿蹖乇',
+    adminTip: '賲蹖鈥屫堌з嗀� 亘乇賳丕賲賴鈥屬囏� 乇丕 亘爻丕夭丿 賵 鬲賳馗蹖賲丕鬲 鬲蹖賲 乇丕 賲丿蹖乇蹖鬲 讴賳丿',
+    normal: '毓丕丿蹖',
+    normalTip: '賮賯胤 賲蹖鈥屫堌з嗀� 丕夭 亘乇賳丕賲賴鈥屬囏� 丕爻鬲賮丕丿賴 讴賳丿貙 賳賲蹖鈥屫堌з嗀� 亘乇賳丕賲賴 亘爻丕夭丿',
+    builder: '爻丕夭賳丿賴',
+    builderTip: '賲蹖鈥屫堌з嗀� 亘乇賳丕賲賴鈥屬囏й� 禺賵丿 乇丕 亘爻丕夭丿 賵 賵蹖乇丕蹖卮 讴賳丿',
+    editor: '賵蹖乇丕蹖卮诏乇',
+    editorTip: '賲蹖鈥屫堌з嗀� 亘乇賳丕賲賴鈥屬囏� 乇丕 亘爻丕夭丿 賵 賵蹖乇丕蹖卮 讴賳丿',
+    datasetOperator: '賲丿蹖乇 丿丕賳卮',
+    datasetOperatorTip: '賮賯胤 賲蹖鈥屫堌з嗀� 倬丕蹖诏丕賴 丿丕賳卮 乇丕 賲丿蹖乇蹖鬲 讴賳丿',
+    inviteTeamMember: '丕賮夭賵丿賳 毓囟賵 鬲蹖賲',
+    inviteTeamMemberTip: '丌賳賴丕 賲蹖鈥屫堌з嗁嗀� 倬爻 丕夭 賵乇賵丿 亘賴 爻蹖爻鬲賲貙 賲爻鬲賯蹖賲丕賸 亘賴 丿丕丿賴鈥屬囏й� 鬲蹖賲 卮賲丕 丿爻鬲乇爻蹖 倬蹖丿丕 讴賳賳丿.',
+    emailNotSetup: '爻乇賵乇 丕蹖賲蹖賱 乇丕賴鈥屫з嗀ж槽� 賳卮丿賴 丕爻鬲貙 亘賳丕亘乇丕蹖賳 丕蹖賲蹖賱鈥屬囏й� 丿毓賵鬲 賳賲蹖鈥屫堌з嗁嗀� 丕乇爻丕賱 卮賵賳丿. 賱胤賮丕賸 讴丕乇亘乇丕賳 乇丕 丕夭 賱蹖賳讴 丿毓賵鬲 讴賴 倬爻 丕夭 丿毓賵鬲 氐丕丿乇 禺賵丕賴丿 卮丿 賲胤賱毓 讴賳蹖丿銆�',
+    email: '丕蹖賲蹖賱',
+    emailInvalid: '賮乇賲鬲 丕蹖賲蹖賱 賳丕賲毓鬲亘乇 丕爻鬲',
+    emailPlaceholder: '賱胤賮丕賸 丕蹖賲蹖賱鈥屬囏� 乇丕 賵丕乇丿 讴賳蹖丿',
+    sendInvite: '丕乇爻丕賱 丿毓賵鬲',
+    invitedAsRole: '亘賴 毓賳賵丕賳 讴丕乇亘乇 {{role}} 丿毓賵鬲 卮丿賴',
+    invitationSent: '丿毓賵鬲鈥屬嗀з呝� 丕乇爻丕賱 卮丿',
+    invitationSentTip: '丿毓賵鬲鈥屬嗀з呝� 丕乇爻丕賱 卮丿 賵 丌賳賴丕 賲蹖鈥屫堌з嗁嗀� 賵丕乇丿 Dify 卮賵賳丿 鬲丕 亘賴 丿丕丿賴鈥屬囏й� 鬲蹖賲 卮賲丕 丿爻鬲乇爻蹖 倬蹖丿丕 讴賳賳丿.',
+    invitationLink: '賱蹖賳讴 丿毓賵鬲',
+    failedInvitationEmails: '讴丕乇亘乇丕賳 夭蹖乇 亘丕 賲賵賮賯蹖鬲 丿毓賵鬲 賳卮丿賳丿',
+    ok: '鬲丕蹖蹖丿',
+    removeFromTeam: '丨匕賮 丕夭 鬲蹖賲',
+    removeFromTeamTip: '丿爻鬲乇爻蹖 鬲蹖賲 乇丕 丨匕賮 賲蹖鈥屭┵嗀�',
+    setAdmin: '鬲賳馗蹖賲 亘賴 毓賳賵丕賳 賲丿蹖乇',
+    setMember: '鬲賳馗蹖賲 亘賴 毓賳賵丕賳 毓囟賵 毓丕丿蹖',
+    setBuilder: '鬲賳馗蹖賲 亘賴 毓賳賵丕賳 爻丕夭賳丿賴',
+    setEditor: '鬲賳馗蹖賲 亘賴 毓賳賵丕賳 賵蹖乇丕蹖卮诏乇',
+    disInvite: '賱睾賵 丿毓賵鬲',
+    deleteMember: '丨匕賮 毓囟賵',
+    you: '(卮賲丕)',
+  },
+  integrations: {
+    connected: '賲鬲氐賱 卮丿賴',
+    google: '诏賵诏賱',
+    googleAccount: '賵乇賵丿 亘丕 丨爻丕亘 诏賵诏賱',
+    github: '诏蹖鬲鈥屬囏ж�',
+    githubAccount: '賵乇賵丿 亘丕 丨爻丕亘 诏蹖鬲鈥屬囏ж�',
+    connect: '丕鬲氐丕賱',
+  },
+  language: {
+    displayLanguage: '夭亘丕賳 賳賲丕蹖卮',
+    timezone: '賲賳胤賯賴 夭賲丕賳蹖',
+  },
+  provider: {
+    apiKey: '讴賱蹖丿 API',
+    enterYourKey: '讴賱蹖丿 API 禺賵丿 乇丕 丕蹖賳噩丕 賵丕乇丿 讴賳蹖丿',
+    invalidKey: '讴賱蹖丿 API OpenAI 賳丕賲毓鬲亘乇 丕爻鬲',
+    validatedError: '丕毓鬲亘丕乇爻賳噩蹖 賳丕賲賵賮賯 亘賵丿: ',
+    validating: '丿乇 丨丕賱 丕毓鬲亘丕乇爻賳噩蹖 讴賱蹖丿...',
+    saveFailed: '匕禺蹖乇賴 讴賱蹖丿 API 賳丕賲賵賮賯 亘賵丿',
+    apiKeyExceedBill: '丕蹖賳 讴賱蹖丿 API 爻賴賲蹖賴 賲賵噩賵丿 賳丿丕乇丿貙 賱胤賮丕賸 亘禺賵丕賳蹖丿',
+    addKey: '丕賮夭賵丿賳 讴賱蹖丿',
+    comingSoon: '亘賴 夭賵丿蹖',
+    editKey: '賵蹖乇丕蹖卮',
+    invalidApiKey: '讴賱蹖丿 API 賳丕賲毓鬲亘乇',
+    azure: {
+      apiBase: '倬丕蹖賴 API',
+      apiBasePlaceholder: '丌丿乇爻 倬丕蹖賴 API 賳賯胤賴 倬丕蹖丕賳蹖 Azure OpenAI 卮賲丕.',
+      apiKey: '讴賱蹖丿 API',
+      apiKeyPlaceholder: '讴賱蹖丿 API 禺賵丿 乇丕 丕蹖賳噩丕 賵丕乇丿 讴賳蹖丿',
+      helpTip: '丌卮賳丕蹖蹖 亘丕 爻乇賵蹖爻 Azure OpenAI',
+    },
+    openaiHosted: {
+      openaiHosted: 'OpenAI 賲蹖夭亘丕賳蹖 卮丿賴',
+      onTrial: '丿乇 丨丕賱 丌夭賲丕蹖卮',
+      exhausted: '爻賴賲蹖賴 鬲賲丕賲 卮丿賴',
+      desc: '爻乇賵蹖爻 賲蹖夭亘丕賳蹖 OpenAI 丕乇丕卅賴 卮丿賴 鬲賵爻胤 Dify 亘賴 卮賲丕 丕噩丕夭賴 賲蹖鈥屫囏� 丕夭 賲丿賱鈥屬囏й屰� 賲丕賳賳丿 GPT-3.5 丕爻鬲賮丕丿賴 讴賳蹖丿. 賯亘賱 丕夭 丕鬲賲丕賲 爻賴賲蹖賴 丌夭賲丕蹖卮蹖 禺賵丿貙 亘丕蹖丿 爻丕蹖乇 丕乇丕卅賴鈥屫囐嗀з� 賲丿賱 乇丕 鬲賳馗蹖賲 讴賳蹖丿.',
+      callTimes: '鬲毓丿丕丿 賮乇丕禺賵丕賳蹖',
+      usedUp: '爻賴賲蹖賴 丌夭賲丕蹖卮蹖 鬲賲丕賲 卮丿賴 丕爻鬲. 丕乇丕卅賴鈥屫囐嗀� 賲丿賱 禺賵丿 乇丕 丕囟丕賮賴 讴賳蹖丿.',
+      useYourModel: '丿乇 丨丕賱 丨丕囟乇 丕夭 丕乇丕卅賴鈥屫囐嗀� 賲丿賱 禺賵丿 丕爻鬲賮丕丿賴 賲蹖鈥屭┵嗃屫�.',
+      close: '亘爻鬲賳',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: '丿乇 丨丕賱 丌夭賲丕蹖卮',
+      exhausted: '爻賴賲蹖賴 鬲賲丕賲 卮丿賴',
+      desc: '賲丿賱 賯丿乇鬲賲賳丿 讴賴 丿乇 胤蹖賮 诏爻鬲乇丿賴鈥屫й� 丕夭 賵馗丕蹖賮 丕夭 诏賮鬲诏賵蹖 倬蹖卮乇賮鬲賴 賵 鬲賵賱蹖丿 賲丨鬲賵丕蹖 禺賱丕賯丕賳賴 鬲丕 丿爻鬲賵乇丕賱毓賲賱鈥屬囏й� 丿賯蹖賯 毓丕賱蹖 毓賲賱 賲蹖鈥屭┵嗀�.',
+      callTimes: '鬲毓丿丕丿 賮乇丕禺賵丕賳蹖',
+      usedUp: '爻賴賲蹖賴 丌夭賲丕蹖卮蹖 鬲賲丕賲 卮丿賴 丕爻鬲. 丕乇丕卅賴鈥屫囐嗀� 賲丿賱 禺賵丿 乇丕 丕囟丕賮賴 讴賳蹖丿.',
+      useYourModel: '丿乇 丨丕賱 丨丕囟乇 丕夭 丕乇丕卅賴鈥屫囐嗀� 賲丿賱 禺賵丿 丕爻鬲賮丕丿賴 賲蹖鈥屭┵嗃屫�.',
+      close: '亘爻鬲賳',
+      trialQuotaTip: '爻賴賲蹖賴 丌夭賲丕蹖卮蹖 Anthropic 卮賲丕 丿乇 鬲丕乇蹖禺 2025/03/11 賲賳賯囟蹖 賲蹖 卮賵丿 賵 倬爻 丕夭 丌賳 丿蹖诏乇 丿乇 丿爻鬲乇爻 賳禺賵丕賴丿 亘賵丿. 賱胤賮丕 亘賴 賲賵賯毓 丕夭 丌賳 丕爻鬲賮丕丿賴 讴賳蹖丿.',
+    },
+    anthropic: {
+      using: '賯丕亘賱蹖鬲 鬲毓亘蹖賴 丕夭 丕蹖賳 丕爻鬲賮丕丿賴 賲蹖鈥屭┵嗀�',
+      enableTip: '亘乇丕蹖 賮毓丕賱鈥屫池ж槽� 賲丿賱 Anthropic貙 丕亘鬲丿丕 亘丕蹖丿 亘賴 OpenAI 蹖丕 爻乇賵蹖爻 Azure OpenAI 賲鬲氐賱 卮賵蹖丿.',
+      notEnabled: '賮毓丕賱 賳卮丿賴',
+      keyFrom: '讴賱蹖丿 API 禺賵丿 乇丕 丕夭 Anthropic 丿乇蹖丕賮鬲 讴賳蹖丿',
+    },
+    encrypted: {
+      front: '讴賱蹖丿 API 卮賲丕 亘丕 丕爻鬲賮丕丿賴 丕夭 賮賳丕賵乇蹖',
+      back: ' 乇賲夭诏匕丕乇蹖 賵 匕禺蹖乇賴 禺賵丕賴丿 卮丿.',
+    },
+  },
+  modelProvider: {
+    notConfigured: '賲丿賱 爻蹖爻鬲賲 賴賳賵夭 亘賴 胤賵乇 讴丕賲賱 倬蹖讴乇亘賳丿蹖 賳卮丿賴 丕爻鬲 賵 亘乇禺蹖 丕夭 毓賲賱讴乇丿賴丕 賲賲讴賳 丕爻鬲 丿乇 丿爻鬲乇爻 賳亘丕卮賳丿.',
+    systemModelSettings: '鬲賳馗蹖賲丕鬲 賲丿賱 爻蹖爻鬲賲',
+    systemModelSettingsLink: '趩乇丕 鬲賳馗蹖賲 賲丿賱 爻蹖爻鬲賲 囟乇賵乇蹖 丕爻鬲責',
+    selectModel: '賲丿賱 禺賵丿 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+    setupModelFirst: '賱胤賮丕賸 丕亘鬲丿丕 賲丿賱 禺賵丿 乇丕 鬲賳馗蹖賲 讴賳蹖丿',
+    systemReasoningModel: {
+      key: '賲丿賱 丕爻鬲丿賱丕賱 爻蹖爻鬲賲',
+      tip: '賲丿賱 丕爻鬲賳鬲丕噩 倬蹖卮鈥屬佖必� 乇丕 亘乇丕蹖 丕蹖噩丕丿 亘乇賳丕賲賴鈥屬囏� 鬲賳馗蹖賲 讴賳蹖丿. 賵蹖跇诏蹖鈥屬囏й屰� 賲丕賳賳丿 鬲賵賱蹖丿 賳丕賲 诏賮鬲诏賵 賵 倬蹖卮賳賴丕丿 爻賵丕賱 亘毓丿蹖 賳蹖夭 丕夭 賲丿賱 丕爻鬲賳鬲丕噩 倬蹖卮鈥屬佖必� 丕爻鬲賮丕丿賴 禺賵丕賴賳丿 讴乇丿.',
+    },
+    embeddingModel: {
+      key: '賲丿賱 鬲毓亘蹖賴',
+      tip: '賲丿賱 倬蹖卮鈥屬佖必� 乇丕 亘乇丕蹖 倬乇丿丕夭卮 鬲毓亘蹖賴 丕爻賳丕丿 丿丕賳卮 鬲賳馗蹖賲 讴賳蹖丿. 賴乇 丿賵 亘丕夭蹖丕亘蹖 賵 賵丕乇丿 讴乇丿賳 丿丕賳卮 丕夭 丕蹖賳 賲丿賱 鬲毓亘蹖賴 亘乇丕蹖 倬乇丿丕夭卮 亘乇丿丕乇蹖 丕爻鬲賮丕丿賴 賲蹖鈥屭┵嗁嗀�. 鬲睾蹖蹖乇 亘丕毓孬 賳丕爻丕夭诏丕乇蹖 亘購毓丿 亘乇丿丕乇蹖 亘蹖賳 丿丕賳卮 賵丕乇丿 卮丿賴 賵 爻賵丕賱 賲蹖鈥屫促堌� 讴賴 賲賳噩乇 亘賴 卮讴爻鬲 亘丕夭蹖丕亘蹖 賲蹖鈥屫促堌�. 亘乇丕蹖 噩賱賵诏蹖乇蹖 丕夭 卮讴爻鬲 亘丕夭蹖丕亘蹖貙 賱胤賮丕賸 丕蹖賳 賲丿賱 乇丕 亘賴 丿賱禺賵丕賴 鬲睾蹖蹖乇 賳丿賴蹖丿.',
+      required: '賲丿賱 鬲毓亘蹖賴 丕賱夭丕賲蹖 丕爻鬲',
+    },
+    speechToTextModel: {
+      key: '賲丿賱 鬲亘丿蹖賱 诏賮鬲丕乇 亘賴 賲鬲賳',
+      tip: '賲丿賱 倬蹖卮鈥屬佖必� 乇丕 亘乇丕蹖 賵乇賵丿蹖 诏賮鬲丕乇 亘賴 賲鬲賳 丿乇 賲讴丕賱賲賴 鬲賳馗蹖賲 讴賳蹖丿.',
+    },
+    ttsModel: {
+      key: '賲丿賱 鬲亘丿蹖賱 賲鬲賳 亘賴 诏賮鬲丕乇',
+      tip: '賲丿賱 倬蹖卮鈥屬佖必� 乇丕 亘乇丕蹖 賵乇賵丿蹖 賲鬲賳 亘賴 诏賮鬲丕乇 丿乇 賲讴丕賱賲賴 鬲賳馗蹖賲 讴賳蹖丿.',
+    },
+    rerankModel: {
+      key: '賲丿賱 乇鬲亘賴鈥屫ㄙ嗀� 賲噩丿丿',
+      tip: '賲丿賱 乇鬲亘賴鈥屫ㄙ嗀� 賲噩丿丿貙 賱蹖爻鬲 丕爻賳丕丿 讴丕賳丿蹖丿 乇丕 亘乇 丕爻丕爻 鬲胤丕亘賯 賲毓賳丕蹖蹖 亘丕 倬乇爻卮 讴丕乇亘乇 賲乇鬲亘 賲蹖鈥屭┵嗀� 賵 賳鬲丕蹖噩 乇鬲亘賴鈥屫ㄙ嗀� 賲毓賳丕蹖蹖 乇丕 亘賴亘賵丿 賲蹖鈥屫ㄘ簇�',
+    },
+    apiKey: '讴賱蹖丿 API',
+    quota: '爻賴賲蹖賴',
+    searchModel: '噩爻鬲噩賵蹖 賲丿賱',
+    noModelFound: '賴蹖趩 賲丿賱蹖 亘乇丕蹖 {{model}} 蹖丕賮鬲 賳卮丿',
+    models: '賲丿賱鈥屬囏�',
+    showMoreModelProvider: '賳賲丕蹖卮 丕乇丕卅賴鈥屫囐嗀з� 賲丿賱 亘蹖卮鬲乇',
+    selector: {
+      tip: '丕蹖賳 賲丿賱 丨匕賮 卮丿賴 丕爻鬲. 賱胤賮丕賸 蹖讴 賲丿賱 丕囟丕賮賴 讴賳蹖丿 蹖丕 賲丿賱 丿蹖诏乇蹖 乇丕 丕賳鬲禺丕亘 讴賳蹖丿.',
+      emptyTip: '賴蹖趩 賲丿賱 賲賵噩賵丿蹖 賵噩賵丿 賳丿丕乇丿',
+      emptySetting: '賱胤賮丕賸 亘賴 鬲賳馗蹖賲丕鬲 亘乇賵蹖丿 鬲丕 倬蹖讴乇亘賳丿蹖 讴賳蹖丿',
+      rerankTip: '賱胤賮丕賸 賲丿賱 乇鬲亘賴鈥屫ㄙ嗀� 賲噩丿丿 乇丕 鬲賳馗蹖賲 讴賳蹖丿',
+    },
+    card: {
+      quota: '爻賴賲蹖賴',
+      onTrial: '丿乇 丨丕賱 丌夭賲丕蹖卮',
+      paid: '倬乇丿丕禺鬲 卮丿賴',
+      quotaExhausted: '爻賴賲蹖賴 鬲賲丕賲 卮丿賴',
+      callTimes: '鬲毓丿丕丿 賮乇丕禺賵丕賳蹖',
+      tokens: '鬲賵讴賳鈥屬囏�',
+      buyQuota: '禺乇蹖丿 爻賴賲蹖賴',
+      priorityUse: '丕爻鬲賮丕丿賴 亘丕 丕賵賱賵蹖鬲',
+      removeKey: '丨匕賮 讴賱蹖丿 API',
+      tip: '丕賵賱賵蹖鬲 亘賴 爻賴賲蹖賴 倬乇丿丕禺鬲 卮丿賴 丿丕丿賴 賲蹖鈥屫促堌�. 爻賴賲蹖賴 丌夭賲丕蹖卮蹖 倬爻 丕夭 丕鬲賲丕賲 爻賴賲蹖賴 倬乇丿丕禺鬲 卮丿賴 丕爻鬲賮丕丿賴 禺賵丕賴丿 卮丿.',
+    },
+    item: {
+      deleteDesc: '{{modelName}} 亘賴 毓賳賵丕賳 賲丿賱鈥屬囏й� 丕爻鬲丿賱丕賱 爻蹖爻鬲賲 丕爻鬲賮丕丿賴 賲蹖鈥屫促堎嗀�. 亘乇禺蹖 丕夭 毓賲賱讴乇丿賴丕 倬爻 丕夭 丨匕賮 丿乇 丿爻鬲乇爻 賳禺賵丕賴賳丿 亘賵丿. 賱胤賮丕賸 鬲兀蹖蹖丿 讴賳蹖丿.',
+      freeQuota: '爻賴賲蹖賴 乇丕蹖诏丕賳',
+    },
+    addApiKey: '讴賱蹖丿 API 禺賵丿 乇丕 丕囟丕賮賴 讴賳蹖丿',
+    invalidApiKey: '讴賱蹖丿 API 賳丕賲毓鬲亘乇',
+    encrypted: {
+      front: '讴賱蹖丿 API 卮賲丕 亘丕 丕爻鬲賮丕丿賴 丕夭 賮賳丕賵乇蹖',
+      back: ' 乇賲夭诏匕丕乇蹖 賵 匕禺蹖乇賴 禺賵丕賴丿 卮丿.',
+    },
+    freeQuota: {
+      howToEarn: '趩诏賵賳賴 讴爻亘 讴賳蹖賲',
+    },
+    addMoreModelProvider: '丕賮夭賵丿賳 丕乇丕卅賴鈥屫囐嗀� 賲丿賱 亘蹖卮鬲乇',
+    addModel: '丕賮夭賵丿賳 賲丿賱',
+    modelsNum: '{{num}} 賲丿賱',
+    showModels: '賳賲丕蹖卮 賲丿賱鈥屬囏�',
+    showModelsNum: '賳賲丕蹖卮 {{num}} 賲丿賱',
+    collapse: '噩賲毓 讴乇丿賳',
+    config: '倬蹖讴乇亘賳丿蹖',
+    modelAndParameters: '賲丿賱 賵 倬丕乇丕賲鬲乇賴丕',
+    model: '賲丿賱',
+    featureSupported: '{{feature}} 倬卮鬲蹖亘丕賳蹖 賲蹖鈥屫促堌�',
+    callTimes: '鬲毓丿丕丿 賮乇丕禺賵丕賳蹖',
+    credits: '丕毓鬲亘丕乇 倬蹖丕賲',
+    buyQuota: '禺乇蹖丿 爻賴賲蹖賴',
+    getFreeTokens: '丿乇蹖丕賮鬲 鬲賵讴賳鈥屬囏й� 乇丕蹖诏丕賳',
+    priorityUsing: '丕爻鬲賮丕丿賴 亘丕 丕賵賱賵蹖鬲',
+    deprecated: '賲賳爻賵禺 卮丿賴',
+    confirmDelete: '鬲兀蹖蹖丿 丨匕賮責',
+    quotaTip: '鬲賵讴賳鈥屬囏й� 乇丕蹖诏丕賳 亘丕賯蹖鈥屬呚з嗀� 丿乇 丿爻鬲乇爻',
+    loadPresets: '亘丕乇诏蹖乇蹖 鬲賳馗蹖賲丕鬲 丕夭 倬蹖卮 鬲毓蹖蹖賳 卮丿賴',
+    parameters: '倬丕乇丕賲鬲乇賴丕',
+    loadBalancing: '鬲毓丕丿賱 亘丕乇',
+    loadBalancingDescription: '讴丕賴卮 賮卮丕乇 亘丕 趩賳丿蹖賳 賲噩賲賵毓賴 丕毓鬲亘丕乇賳丕賲賴.',
+    loadBalancingHeadline: '鬲毓丕丿賱 亘丕乇',
+    configLoadBalancing: '倬蹖讴乇亘賳丿蹖 鬲毓丕丿賱 亘丕乇',
+    modelHasBeenDeprecated: '丕蹖賳 賲丿賱 賲賳爻賵禺 卮丿賴 丕爻鬲',
+    providerManaged: '賲丿蹖乇蹖鬲 卮丿賴 鬲賵爻胤 丕乇丕卅賴鈥屫囐嗀�',
+    providerManagedDescription: '丕爻鬲賮丕丿賴 丕夭 賲噩賲賵毓賴 賵丕丨丿 丕毓鬲亘丕乇賳丕賲賴 丕乇丕卅賴 卮丿賴 鬲賵爻胤 丕乇丕卅賴鈥屫囐嗀� 賲丿賱.',
+    defaultConfig: '倬蹖讴乇亘賳丿蹖 倬蹖卮鈥屬佖必�',
+    apiKeyStatusNormal: '賵囟毓蹖鬲 讴賱蹖丿 API 毓丕丿蹖 丕爻鬲',
+    apiKeyRateLimit: '賲丨丿賵丿蹖鬲 賳乇禺 亘賴 丿爻鬲 丌賲丿貙 倬爻 丕夭 {{seconds}} 孬丕賳蹖賴 丿乇 丿爻鬲乇爻 禺賵丕賴丿 亘賵丿',
+    addConfig: '丕賮夭賵丿賳 倬蹖讴乇亘賳丿蹖',
+    editConfig: '賵蹖乇丕蹖卮 倬蹖讴乇亘賳丿蹖',
+    loadBalancingLeastKeyWarning: '亘乇丕蹖 賮毓丕賱 讴乇丿賳 鬲毓丕丿賱 亘丕乇貙 丨丿丕賯賱 2 讴賱蹖丿 亘丕蹖丿 賮毓丕賱 亘丕卮賳丿.',
+    loadBalancingInfo: '亘賴 胤賵乇 倬蹖卮鈥屬佖必敦� 鬲毓丕丿賱 亘丕乇 丕夭 丕爻鬲乇丕鬲跇蹖 Round-robin 丕爻鬲賮丕丿賴 賲蹖鈥屭┵嗀�. 丕诏乇 賲丨丿賵丿蹖鬲 賳乇禺 賮毓丕賱 卮賵丿貙 蹖讴 丿賵乇賴 禺賳讴 卮丿賳 1 丿賯蹖賯賴鈥屫й� 丕毓賲丕賱 禺賵丕賴丿 卮丿.',
+    upgradeForLoadBalancing: '亘乇丕蹖 賮毓丕賱 讴乇丿賳 鬲毓丕丿賱 亘丕乇貙 胤乇丨 禺賵丿 乇丕 丕乇鬲賯丕 丿賴蹖丿.',
+    emptyProviderTitle: '丕乇丕卅賴 丿賴賳丿賴 賲丿賱 乇丕賴 丕賳丿丕夭蹖 賳卮丿賴 丕爻鬲',
+    toBeConfigured: '倬蹖讴乇亘賳丿蹖 卮賵丿',
+    configureTip: 'api-key 乇丕 乇丕賴 丕賳丿丕夭蹖 讴賳蹖丿 蹖丕 賲丿賱 乇丕 亘乇丕蹖 丕爻鬲賮丕丿賴 丕囟丕賮賴 讴賳蹖丿',
+    installProvider: '賳氐亘 丕乇丕卅賴 丿賴賳丿诏丕賳 賲丿賱',
+    discoverMore: '丕胤賱丕毓丕鬲 亘蹖卮鬲乇 丿乇',
+    emptyProviderTip: '賱胤賮丕 丕亘鬲丿丕 蹖讴 丕乇丕卅賴 丿賴賳丿賴 賲丿賱 賳氐亘 讴賳蹖丿.',
+  },
+  dataSource: {
+    add: '丕賮夭賵丿賳 賲賳亘毓 丿丕丿賴',
+    connect: '丕鬲氐丕賱',
+    configure: '倬蹖讴乇亘賳丿蹖',
+    notion: {
+      title: '賳賵卮賳',
+      description: '丕爻鬲賮丕丿賴 丕夭 賳賵卮賳 亘賴 毓賳賵丕賳 賲賳亘毓 丿丕丿賴 亘乇丕蹖 丿丕賳卮.',
+      connectedWorkspace: '賮囟丕蹖 讴丕乇蹖 賲鬲氐賱',
+      addWorkspace: '丕賮夭賵丿賳 賮囟丕蹖 讴丕乇蹖',
+      connected: '賲鬲氐賱 卮丿賴',
+      disconnected: '賯胤毓 卮丿賴',
+      changeAuthorizedPages: '鬲睾蹖蹖乇 氐賮丨丕鬲 賲噩丕夭',
+      pagesAuthorized: '氐賮丨丕鬲 賲噩丕夭',
+      sync: '賴賲诏丕賲鈥屫池ж槽�',
+      remove: '丨匕賮',
+      selector: {
+        pageSelected: '氐賮丨丕鬲 丕賳鬲禺丕亘 卮丿賴',
+        searchPages: '噩爻鬲噩賵蹖 氐賮丨丕鬲...',
+        noSearchResult: '賳鬲蹖噩賴 噩爻鬲噩賵蹖蹖 蹖丕賮鬲 賳卮丿',
+        addPages: '丕賮夭賵丿賳 氐賮丨丕鬲',
+        preview: '倬蹖卮鈥屬嗁呚й屫�',
+      },
+    },
+    website: {
+      title: '賵亘鈥屫池й屫�',
+      description: '賵丕乇丿 讴乇丿賳 賲丨鬲賵丕 丕夭 賵亘鈥屫池й屫�屬囏� 亘丕 丕爻鬲賮丕丿賴 丕夭 禺夭賳丿賴 賵亘.',
+      with: '亘丕',
+      configuredCrawlers: '禺夭賳丿賴鈥屬囏й� 倬蹖讴乇亘賳丿蹖 卮丿賴',
+      active: '賮毓丕賱',
+      inactive: '睾蹖乇賮毓丕賱',
+    },
+  },
+  plugin: {
+    serpapi: {
+      apiKey: '讴賱蹖丿 API',
+      apiKeyPlaceholder: '讴賱蹖丿 API 禺賵丿 乇丕 賵丕乇丿 讴賳蹖丿',
+      keyFrom: '讴賱蹖丿 SerpAPI 禺賵丿 乇丕 丕夭 氐賮丨賴 丨爻丕亘 SerpAPI 丿乇蹖丕賮鬲 讴賳蹖丿',
+    },
+  },
+  apiBasedExtension: {
+    title: '丕賮夭賵賳賴鈥屬囏й� 賲亘鬲賳蹖 亘乇 API 賲丿蹖乇蹖鬲 賲鬲賲乇讴夭 API 乇丕 賮乇丕賴賲 賲蹖鈥屭┵嗁嗀� 賵 倬蹖讴乇亘賳丿蹖 乇丕 亘乇丕蹖 丕爻鬲賮丕丿賴 丌爻丕賳 丿乇 亘乇賳丕賲賴鈥屬囏й� Dify 爻丕丿賴 賲蹖鈥屭┵嗁嗀�.',
+    link: '賳丨賵賴 鬲賵爻毓賴 丕賮夭賵賳賴 API 禺賵丿 乇丕 亘蹖丕賲賵夭蹖丿.',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: '丕賮夭賵丿賳 丕賮夭賵賳賴 API',
+    selector: {
+      title: '丕賮夭賵賳賴 API',
+      placeholder: '賱胤賮丕賸 丕賮夭賵賳賴 API 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+      manage: '賲丿蹖乇蹖鬲 丕賮夭賵賳賴 API',
+    },
+    modal: {
+      title: '丕賮夭賵丿賳 丕賮夭賵賳賴 API',
+      editTitle: '賵蹖乇丕蹖卮 丕賮夭賵賳賴 API',
+      name: {
+        title: '賳丕賲',
+        placeholder: '賱胤賮丕賸 賳丕賲 乇丕 賵丕乇丿 讴賳蹖丿',
+      },
+      apiEndpoint: {
+        title: '賳賯胤賴 倬丕蹖丕賳蹖 API',
+        placeholder: '賱胤賮丕賸 賳賯胤賴 倬丕蹖丕賳蹖 API 乇丕 賵丕乇丿 讴賳蹖丿',
+      },
+      apiKey: {
+        title: '讴賱蹖丿 API',
+        placeholder: '賱胤賮丕賸 讴賱蹖丿 API 乇丕 賵丕乇丿 讴賳蹖丿',
+        lengthError: '胤賵賱 讴賱蹖丿 API 賳賲蹖鈥屫堌з嗀� 讴賲鬲乇 丕夭 鄣 讴丕乇丕讴鬲乇 亘丕卮丿',
+      },
+    },
+    type: '賳賵毓',
+  },
+  about: {
+    changeLog: '鬲睾蹖蹖乇丕鬲',
+    updateNow: '亘賴鈥屫辟堌藏必池з嗃� 丕讴賳賵賳',
+    nowAvailable: 'Dify {{version}} 丕讴賳賵賳 丿乇 丿爻鬲乇爻 丕爻鬲.',
+    latestAvailable: 'Dify {{version}} 丌禺乇蹖賳 賳爻禺賴 丿乇 丿爻鬲乇爻 丕爻鬲.',
+  },
+  appMenus: {
+    overview: '賳馗丕乇鬲',
+    promptEng: '賴賲丕賴賳诏鈥屫池ж槽�',
+    apiAccess: '丿爻鬲乇爻蹖 API',
+    logAndAnn: '诏夭丕乇卮鈥屬囏� 賵 丕毓賱丕賳丕鬲',
+    logs: '诏夭丕乇卮鈥屬囏�',
+  },
+  environment: {
+    testing: '丌夭賲丕蹖卮蹖',
+    development: '鬲賵爻毓賴',
+  },
+  appModes: {
+    completionApp: '鬲賵賱蹖丿讴賳賳丿賴 賲鬲賳',
+    chatApp: '亘乇賳丕賲賴 趩鬲',
+  },
+  datasetMenus: {
+    documents: '丕爻賳丕丿',
+    hitTesting: '丌夭賲丕蹖卮 亘丕夭蹖丕亘蹖',
+    settings: '鬲賳馗蹖賲丕鬲',
+    emptyTip: '丿丕賳卮 賲乇鬲亘胤 賳卮丿賴 丕爻鬲貙 賱胤賮丕賸 亘賴 亘乇賳丕賲賴 蹖丕 丕賮夭賵賳賴 亘乇賵蹖丿 鬲丕 丕乇鬲亘丕胤 乇丕 讴丕賲賱 讴賳蹖丿.',
+    viewDoc: '賲卮丕賴丿賴 賲爻鬲賳丿丕鬲',
+    relatedApp: '亘乇賳丕賲賴鈥屬囏й� 賲乇鬲亘胤',
+    noRelatedApp: '賴蹖趩 亘乇賳丕賲賴 倬蹖賵賳丿蹖 賵噩賵丿 賳丿丕乇丿',
+  },
+  voiceInput: {
+    speaking: '丕讴賳賵賳 氐丨亘鬲 讴賳蹖丿...',
+    converting: '丿乇 丨丕賱 鬲亘丿蹖賱 亘賴 賲鬲賳...',
+    notAllow: '賲蹖讴乇賵賮賵賳 賲噩丕夭 賳蹖爻鬲',
+  },
+  modelName: {
+    'gpt-3.5-turbo': '噩蹖鈥屬聚屸�屫�-鄢.鄣-鬲賵乇亘賵',
+    'gpt-3.5-turbo-16k': '噩蹖鈥屬聚屸�屫�-鄢.鄣-鬲賵乇亘賵-郾鄱讴丕',
+    'gpt-4': '噩蹖鈥屬聚屸�屫�-鄞',
+    'gpt-4-32k': '噩蹖鈥屬聚屸�屫�-鄞-鄢鄄讴丕',
+    'text-davinci-003': '賲鬲賳-丿丕賵蹖賳趩蹖-郯郯鄢',
+    'text-embedding-ada-002': '賲鬲賳-鬲毓亘蹖賴-丌丿丕-郯郯鄄',
+    'whisper-1': '賵蹖爻倬乇-郾',
+    'claude-instant-1': '讴賱丕賵丿-賮賵乇蹖',
+    'claude-2': '讴賱丕賵丿-鄄',
+  },
+  chat: {
+    renameConversation: '鬲睾蹖蹖乇 賳丕賲 賲讴丕賱賲賴',
+    conversationName: '賳丕賲 賲讴丕賱賲賴',
+    conversationNamePlaceholder: '賱胤賮丕賸 賳丕賲 賲讴丕賱賲賴 乇丕 賵丕乇丿 讴賳蹖丿',
+    conversationNameCanNotEmpty: '賳丕賲 賲讴丕賱賲賴 丕賱夭丕賲蹖 丕爻鬲',
+    citation: {
+      title: '丕爻鬲賳丕丿賴丕',
+      linkToDataset: '倬蹖賵賳丿 亘賴 丿丕賳卮',
+      characters: '讴丕乇丕讴鬲乇賴丕:',
+      hitCount: '鬲毓丿丕丿 亘丕夭蹖丕亘蹖:',
+      vectorHash: '賴卮 亘乇丿丕乇:',
+      hitScore: '丕賲鬲蹖丕夭 亘丕夭蹖丕亘蹖:',
+    },
+    inputPlaceholder: '亘丕 乇亘丕鬲 氐丨亘鬲 讴賳蹖丿',
+    thought: '賮讴乇',
+    thinking: '鬲賮讴乇...',
+    resend: '丿賵亘丕乇賴 丕乇爻丕賱 讴賳蹖丿',
+  },
+  promptEditor: {
+    placeholder: '丿爻鬲賵乇 禺賵丿 乇丕 丕蹖賳噩丕 亘賳賵蹖爻蹖丿貙 芦{禄 乇丕 賵丕乇丿 讴賳蹖丿 鬲丕 蹖讴 賲鬲睾蹖乇 丿乇噩 讴賳蹖丿貙 芦/禄 乇丕 賵丕乇丿 讴賳蹖丿 鬲丕 蹖讴 亘賱賵讴 賲丨鬲賵丕蹖 丿爻鬲賵乇 丿乇噩 讴賳蹖丿',
+    context: {
+      item: {
+        title: '夭賲蹖賳賴',
+        desc: '丿乇噩 丕賱诏賵蹖 夭賲蹖賳賴',
+      },
+      modal: {
+        title: '{{num}} 丿丕賳卮 丿乇 夭賲蹖賳賴',
+        add: '丕賮夭賵丿賳 夭賲蹖賳賴',
+        footer: '卮賲丕 賲蹖鈥屫堌з嗃屫� 夭賲蹖賳賴鈥屬囏� 乇丕 丿乇 亘禺卮 夭賲蹖賳賴 丿乇 夭蹖乇 賲丿蹖乇蹖鬲 讴賳蹖丿.',
+      },
+    },
+    history: {
+      item: {
+        title: '鬲丕乇蹖禺趩賴 賲讴丕賱賲賴',
+        desc: '丿乇噩 丕賱诏賵蹖 倬蹖丕賲 鬲丕乇蹖禺蹖',
+      },
+      modal: {
+        title: '賲孬丕賱',
+        user: '爻賱丕賲',
+        assistant: '爻賱丕賲! 趩胤賵乇 賲蹖鈥屫堌з嗁� 丕賲乇賵夭 亘賴 卮賲丕 讴賲讴 讴賳賲責',
+        edit: '賵蹖乇丕蹖卮 賳丕賲鈥屬囏й� 賳賯卮 賲讴丕賱賲賴',
+      },
+    },
+    variable: {
+      item: {
+        title: '賲鬲睾蹖乇賴丕 賵 丕亘夭丕乇賴丕蹖 禺丕乇噩蹖',
+        desc: '丿乇噩 賲鬲睾蹖乇賴丕 賵 丕亘夭丕乇賴丕蹖 禺丕乇噩蹖',
+      },
+      outputToolDisabledItem: {
+        title: '賲鬲睾蹖乇賴丕',
+        desc: '丿乇噩 賲鬲睾蹖乇賴丕',
+      },
+      modal: {
+        add: '賲鬲睾蹖乇 噩丿蹖丿',
+        addTool: '丕亘夭丕乇 噩丿蹖丿',
+      },
+    },
+    query: {
+      item: {
+        title: '倬乇爻鈥屬堌�',
+        desc: '丿乇噩 丕賱诏賵蹖 倬乇爻鈥屬堌堐� 讴丕乇亘乇',
+      },
+    },
+    existed: '丿乇 丨丕賱 丨丕囟乇 丿乇 丿爻鬲賵乇 賵噩賵丿 丿丕乇丿',
+  },
+  imageUploader: {
+    uploadFromComputer: '亘丕乇诏匕丕乇蹖 丕夭 讴丕賲倬蹖賵鬲乇',
+    uploadFromComputerReadError: '禺賵丕賳丿賳 鬲氐賵蹖乇 賳丕賲賵賮賯 亘賵丿貙 賱胤賮丕賸 丿賵亘丕乇賴 鬲賱丕卮 讴賳蹖丿.',
+    uploadFromComputerUploadError: '亘丕乇诏匕丕乇蹖 鬲氐賵蹖乇 賳丕賲賵賮賯 亘賵丿貙 賱胤賮丕賸 丿賵亘丕乇賴 亘丕乇诏匕丕乇蹖 讴賳蹖丿.',
+    uploadFromComputerLimit: '亘丕乇诏匕丕乇蹖 鬲氐丕賵蹖乇 賳賲蹖鈥屫堌з嗀� 丕夭 {{size}} 賲诏丕亘丕蹖鬲 亘蹖卮鬲乇 亘丕卮丿',
+    pasteImageLink: '倬蹖賵賳丿 鬲氐賵蹖乇 乇丕 亘趩爻亘丕賳蹖丿',
+    pasteImageLinkInputPlaceholder: '倬蹖賵賳丿 鬲氐賵蹖乇 乇丕 丕蹖賳噩丕 亘趩爻亘丕賳蹖丿',
+    pasteImageLinkInvalid: '倬蹖賵賳丿 鬲氐賵蹖乇 賳丕賲毓鬲亘乇',
+    imageUpload: '亘丕乇诏匕丕乇蹖 鬲氐賵蹖乇',
+  },
+  tag: {
+    placeholder: '賴賲賴 亘乇趩爻亘鈥屬囏�',
+    addNew: '丕賮夭賵丿賳 亘乇趩爻亘 噩丿蹖丿',
+    noTag: '亘丿賵賳 亘乇趩爻亘',
+    noTagYet: '賴賳賵夭 亘乇趩爻亘蹖 賵噩賵丿 賳丿丕乇丿',
+    addTag: '丕賮夭賵丿賳 亘乇趩爻亘鈥屬囏�',
+    editTag: '賵蹖乇丕蹖卮 亘乇趩爻亘鈥屬囏�',
+    manageTags: '賲丿蹖乇蹖鬲 亘乇趩爻亘鈥屬囏�',
+    selectorPlaceholder: '亘乇丕蹖 噩爻鬲噩賵 蹖丕 丕蹖噩丕丿 鬲丕蹖倬 讴賳蹖丿',
+    create: '丕蹖噩丕丿',
+    delete: '丨匕賮 亘乇趩爻亘',
+    deleteTip: '亘乇趩爻亘 丿乇 丨丕賱 丕爻鬲賮丕丿賴 丕爻鬲貙 丌蹖丕 丌賳 乇丕 丨匕賮 賲蹖鈥屭┵嗃屫�',
+    created: '亘乇趩爻亘 亘丕 賲賵賮賯蹖鬲 丕蹖噩丕丿 卮丿',
+    failed: '丕蹖噩丕丿 亘乇趩爻亘 賳丕賲賵賮賯 亘賵丿',
+  },
+  fileUploader: {
+    uploadFromComputer: '丌倬賱賵丿 賲丨賱蹖',
+    pasteFileLinkInputPlaceholder: 'URL 乇丕 賵丕乇丿 讴賳蹖丿...',
+    pasteFileLinkInvalid: '倬蹖賵賳丿 賮丕蹖賱 賳丕賲毓鬲亘乇',
+    fileExtensionNotSupport: '倬爻賵賳丿 賮丕蹖賱 倬卮鬲蹖亘丕賳蹖 賳賲蹖 卮賵丿',
+    uploadFromComputerReadError: '禺賵丕賳丿賳 賮丕蹖賱 丕賳噩丕賲 賳卮丿貙 賱胤賮丕 丿賵亘丕乇賴 丕賲鬲丨丕賳 讴賳蹖丿.',
+    uploadFromComputerUploadError: '丌倬賱賵丿 賮丕蹖賱 丕賳噩丕賲 賳卮丿貙 賱胤賮丕 丿賵亘丕乇賴 丌倬賱賵丿 讴賳蹖丿.',
+    pasteFileLink: '倬蹖賵賳丿 賮丕蹖賱 乇丕 噩丕蹖诏匕丕乇蹖 讴賳蹖丿',
+    uploadFromComputerLimit: '丌倬賱賵丿 賮丕蹖賱 賳賲蹖 鬲賵丕賳丿 丕夭 {{size}} 鬲噩丕賵夭 讴賳丿',
+  },
+  license: {
+    expiring_plural: '丕賳賯囟丕 丿乇 {{count}} 乇賵夭',
+    expiring: '丕賳賯囟丕 丿乇 蹖讴 乇賵夭',
+  },
+  pagination: {
+    perPage: '賲賵丕乇丿 丿乇 賴乇 氐賮丨賴',
+  },
+  theme: {
+    auto: '爻蹖爻鬲賲',
+    theme: '鬲賲',
+    dark: '鬲丕乇蹖讴',
+    light: '賳賵乇',
+  },
+  compliance: {
+    soc2Type1: '诏夭丕乇卮 賳賵毓 I SOC 2',
+    sandboxUpgradeTooltip: '鬲賳賴丕 亘丕 亘乇賳丕賲賴 丨乇賮賴鈥屫й� 蹖丕 鬲蹖賲蹖 丿乇 丿爻鬲乇爻 丕爻鬲.',
+    gdpr: 'GDPR DPA',
+    soc2Type2: '诏夭丕乇卮 賳賵毓 II SOC 2',
+    iso27001: '诏賵丕賴蹖賳丕賲賴 ISO 27001:2022',
+    professionalUpgradeTooltip: '鬲賳賴丕 亘丕 亘乇賳丕賲賴 鬲蹖賲 蹖丕 亘丕賱丕鬲乇 丿乇 丿爻鬲乇爻 丕爻鬲.',
+  },
+  imageInput: {
+    dropImageHere: '毓讴爻 禺賵丿 乇丕 丕蹖賳噩丕 乇賴丕 讴賳蹖丿貙 蹖丕',
+    supportedFormats: '丕夭 賮乇賲鬲鈥屬囏й� PNG貙 JPG貙 JPEG貙 WEBP 賵 GIF 倬卮鬲蹖亘丕賳蹖 賲蹖鈥屭┵嗀�',
+    browse: '賲乇賵乇诏乇',
+  },
+}
+
+export default translation
diff --git a/i18n/fa-IR/custom.ts b/i18n/fa-IR/custom.ts
new file mode 100644
index 0000000..d06f60e
--- /dev/null
+++ b/i18n/fa-IR/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: '爻賮丕乇卮蹖 爻丕夭蹖',
+  upgradeTip: {
+    prefix: '胤乇丨 禺賵丿 乇丕 丕乇鬲賯丕 丿賴蹖丿 亘賴',
+    suffix: '鬲丕 亘乇賳丿 禺賵丿 乇丕 爻賮丕乇卮蹖 讴賳蹖丿.',
+    title: '胤乇丨 禺賵丿 乇丕 丕乇鬲賯丕 丿賴蹖丿',
+    des: '胤乇丨 禺賵丿 乇丕 丕乇鬲賯丕 丿賴蹖丿 鬲丕 亘乇賳丿 禺賵丿 乇丕 爻賮丕乇卮蹖 讴賳蹖丿',
+  },
+  webapp: {
+    title: '爻賮丕乇卮蹖 爻丕夭蹖 亘乇賳丿 賵亘 丕倬',
+    removeBrand: '丨匕賮 "Powered by Dify"',
+    changeLogo: '鬲睾蹖蹖乇 鬲氐賵蹖乇 亘乇賳丿 "Powered by"',
+    changeLogoTip: '賮乇賲鬲 SVG 蹖丕 PNG 亘丕 丨丿丕賯賱 丕賳丿丕夭賴 40x40px',
+  },
+  app: {
+    title: '爻賮丕乇卮蹖 爻丕夭蹖 亘乇賳丿 賴丿乇 丕倬賱蹖讴蹖卮賳',
+    changeLogoTip: '賮乇賲鬲 SVG 蹖丕 PNG 亘丕 丨丿丕賯賱 丕賳丿丕夭賴 80x80px',
+  },
+  upload: '亘丕乇诏匕丕乇蹖',
+  uploading: '丿乇 丨丕賱 亘丕乇诏匕丕乇蹖',
+  uploadedFail: '亘丕乇诏匕丕乇蹖 鬲氐賵蹖乇 賳丕賲賵賮賯 亘賵丿貙 賱胤賮丕賸 丿賵亘丕乇賴 亘丕乇诏匕丕乇蹖 讴賳蹖丿.',
+  change: '鬲睾蹖蹖乇',
+  apply: '丕毓賲丕賱',
+  restore: '亘丕夭诏乇丿丕賳丿賳 亘賴 倬蹖卮賮乇囟賴丕',
+  customize: {
+    contactUs: ' 亘丕 賲丕 鬲賲丕爻 亘诏蹖乇蹖丿 ',
+    prefix: '亘乇丕蹖 爻賮丕乇卮蹖爻丕夭蹖 賱賵诏賵蹖 亘乇賳丿 丿乇 丕倬賱蹖讴蹖卮賳貙 賱胤賮丕賸',
+    suffix: '亘乇丕蹖 丕乇鬲賯丕 亘賴 賳爻禺賴 Enterprise.',
+  },
+}
+
+export default translation
diff --git a/i18n/fa-IR/dataset-creation.ts b/i18n/fa-IR/dataset-creation.ts
new file mode 100644
index 0000000..4d938bb
--- /dev/null
+++ b/i18n/fa-IR/dataset-creation.ts
@@ -0,0 +1,218 @@
+const translation = {
+  steps: {
+    header: {
+      creation: '丕蹖噩丕丿 丿丕賳卮',
+      update: '丕賮夭賵丿賳 丿丕丿賴',
+      fallbackRoute: '丿丕賳卮',
+    },
+    one: '丕賳鬲禺丕亘 賲賳亘毓 丿丕丿賴',
+    two: '倬蹖卮倬乇丿丕夭卮 賵 倬丕讴爻丕夭蹖 賲鬲賳',
+    three: '丕噩乇丕 賵 倬丕蹖丕賳',
+  },
+  error: {
+    unavailable: '丕蹖賳 丿丕賳卮 丿乇 丿爻鬲乇爻 賳蹖爻鬲',
+  },
+  firecrawl: {
+    configFirecrawl: '倬蹖讴乇亘賳丿蹖 fireFirecrawl',
+    apiKeyPlaceholder: '讴賱蹖丿 API 丕夭 firecrawl.dev',
+    getApiKeyLinkText: '讴賱蹖丿 API 禺賵丿 乇丕 丕夭 firecrawl.dev 丿乇蹖丕賮鬲 讴賳蹖丿',
+  },
+  stepOne: {
+    filePreview: '倬蹖卮賳賲丕蹖卮 賮丕蹖賱',
+    pagePreview: '倬蹖卮賳賲丕蹖卮 氐賮丨賴',
+    dataSourceType: {
+      file: '賵丕乇丿 讴乇丿賳 丕夭 賮丕蹖賱',
+      notion: '賴賲诏丕賲爻丕夭蹖 丕夭 Notion',
+      web: '賴賲诏丕賲爻丕夭蹖 丕夭 賵亘爻丕蹖鬲',
+    },
+    uploader: {
+      title: '亘丕乇诏匕丕乇蹖 賮丕蹖賱',
+      button: '賮丕蹖賱 賴丕 蹖丕 倬賵卮賴 賴丕 乇丕 亘讴卮蹖丿 賵 乇賴丕 讴賳蹖丿 蹖丕',
+      browse: '賲乇賵乇',
+      tip: '倬卮鬲蹖亘丕賳蹖 丕夭 {{supportTypes}}. 丨丿丕讴孬乇 {{size}}MB 賴乇 讴丿丕賲.',
+      validation: {
+        typeError: '賳賵毓 賮丕蹖賱 倬卮鬲蹖亘丕賳蹖 賳賲蹖卮賵丿',
+        size: '賮丕蹖賱 禺蹖賱蹖 亘夭乇诏 丕爻鬲. 丨丿丕讴孬乇 {{size}}MB',
+        count: '趩賳丿蹖賳 賮丕蹖賱 倬卮鬲蹖亘丕賳蹖 賳賲蹖卮賵丿',
+        filesNumber: '卮賲丕 亘賴 丨丿 賲噩丕夭 亘丕乇诏匕丕乇蹖 丿爻鬲賴丕蹖 {{filesNumber}} 乇爻蹖丿賴丕蹖丿.',
+      },
+      cancel: '賱睾賵',
+      change: '鬲睾蹖蹖乇',
+      failed: '亘丕乇诏匕丕乇蹖 賳丕賲賵賮賯 亘賵丿',
+    },
+    notionSyncTitle: 'Notion 賲鬲氐賱 賳蹖爻鬲',
+    notionSyncTip: '亘乇丕蹖 賴賲诏丕賲爻丕夭蹖 亘丕 Notion貙 丕亘鬲丿丕 亘丕蹖丿 丕鬲氐丕賱 亘賴 Notion 亘乇賯乇丕乇 卮賵丿.',
+    connect: '乇賮鬲賳 亘賴 丕鬲氐丕賱',
+    button: '亘毓丿蹖',
+    emptyDatasetCreation: '賲蹖禺賵丕賴賲 蹖讴 丿丕賳卮 禺丕賱蹖 丕蹖噩丕丿 讴賳賲',
+    modal: {
+      title: '丕蹖噩丕丿 蹖讴 丿丕賳卮 禺丕賱蹖',
+      tip: '蹖讴 丿丕賳卮 禺丕賱蹖 賴蹖趩 爻賳丿蹖 賳禺賵丕賴丿 丿丕卮鬲 賵 卮賲丕 賲蹖鬲賵丕賳蹖丿 賴乇 夭賲丕賳 丕爻賳丕丿 乇丕 亘丕乇诏匕丕乇蹖 讴賳蹖丿.',
+      input: '賳丕賲 丿丕賳卮',
+      placeholder: '賱胤賮丕賸 賵丕乇丿 讴賳蹖丿',
+      nameNotEmpty: '賳丕賲 賳賲蹖鬲賵丕賳丿 禺丕賱蹖 亘丕卮丿',
+      nameLengthInvalid: '賳丕賲 亘丕蹖丿 亘蹖賳 1 鬲丕 40 讴丕乇丕讴鬲乇 亘丕卮丿',
+      cancelButton: '賱睾賵',
+      confirmButton: '丕蹖噩丕丿',
+      failed: '丕蹖噩丕丿 賳丕賲賵賮賯 亘賵丿',
+    },
+    website: {
+      fireCrawlNotConfigured: 'Firecrawl 倬蹖讴乇亘賳丿蹖 賳卮丿賴 丕爻鬲',
+      fireCrawlNotConfiguredDescription: '亘乇丕蹖 丕爻鬲賮丕丿賴 丕夭 Firecrawl 亘丕 讴賱蹖丿 API 倬蹖讴乇亘賳丿蹖 讴賳蹖丿.',
+      configure: '倬蹖讴乇亘賳丿蹖',
+      run: '丕噩乇丕',
+      firecrawlTitle: '丕爻鬲禺乇丕噩 賲丨鬲賵丕蹖 賵亘 亘丕 fireFirecrawl',
+      firecrawlDoc: '賲爻鬲賳丿丕鬲 Firecrawl',
+      firecrawlDocLink: '<a href="https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website">https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website</a>',
+      options: '诏夭蹖賳賴賴丕',
+      crawlSubPage: '禺夭卮 氐賮丨丕鬲 賮乇毓蹖',
+      limit: '賲丨丿賵丿蹖鬲',
+      maxDepth: '丨丿丕讴孬乇 毓賲賯',
+      excludePaths: '賲爻蹖乇賴丕蹖 賲爻鬲孬賳蹖',
+      includeOnlyPaths: '賮賯胤 賲爻蹖乇賴丕蹖 卮丕賲賱',
+      extractOnlyMainContent: '賮賯胤 賲丨鬲賵丕蹖 丕氐賱蹖 乇丕 丕爻鬲禺乇丕噩 讴賳蹖丿 (亘丿賵賳 賴丿乇賴丕貙 賳丕賵亘乇蹖賴丕貙 倬丕賵乇賯蹖賴丕 賵 睾蹖乇賴)',
+      exceptionErrorTitle: '蹖讴 丕爻鬲孬賳丕 丿乇 丨蹖賳 丕噩乇丕蹖 讴丕乇 Firecrawl 乇禺 丿丕丿:',
+      unknownError: '禺胤丕蹖 賳丕卮賳丕禺鬲賴',
+      totalPageScraped: '讴賱 氐賮丨丕鬲 禺乇丕卮蹖丿賴 卮丿賴:',
+      selectAll: '丕賳鬲禺丕亘 賴賲賴',
+      resetAll: '亘丕夭賳卮丕賳蹖 賴賲賴',
+      scrapTimeInfo: '丿乇 賲噩賲賵毓 {{total}} 氐賮丨賴 丿乇 {{time}} 孬丕賳蹖賴 禺乇丕卮蹖丿賴 卮丿',
+      preview: '倬蹖卮賳賲丕蹖卮',
+      maxDepthTooltip: '丨丿丕讴孬乇 毓賲賯 亘乇丕蹖 禺夭卮 賳爻亘鬲 亘賴 URL 賵丕乇丿 卮丿賴. 毓賲賯 0 賮賯胤 氐賮丨賴 URL 賵丕乇丿 卮丿賴 乇丕 禺乇丕卮 賲蹖丿賴丿貙 毓賲賯 1 URL 賵 賴賲賴 趩蹖夭 亘毓丿 丕夭 URL 賵丕乇丿 卮丿賴 + 蹖讴 / 乇丕 禺乇丕卮 賲蹖丿賴丿貙 賵 睾蹖乇賴.',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      chooseProvider: '蹖讴 丕乇丕卅賴 丿賴賳丿賴 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+      jinaReaderTitle: '讴賱 爻丕蹖鬲 乇丕 亘賴 Markdown 鬲亘丿蹖賱 讴賳蹖丿',
+      jinaReaderNotConfigured: 'Jina Reader 倬蹖讴乇亘賳丿蹖 賳卮丿賴 丕爻鬲',
+      jinaReaderDoc: '丿乇亘丕乇賴 Jina Reader 亘蹖卮鬲乇 亘丿丕賳蹖丿',
+      useSitemap: '丕夭 賳賯卮賴 爻丕蹖鬲 丕爻鬲賮丕丿賴 讴賳蹖丿',
+      jinaReaderNotConfiguredDescription: '亘丕 賵丕乇丿 讴乇丿賳 讴賱蹖丿 API 乇丕蹖诏丕賳 禺賵丿 亘乇丕蹖 丿爻鬲乇爻蹖貙 Jina Reader 乇丕 乇丕賴 丕賳丿丕夭蹖 讴賳蹖丿.',
+      useSitemapTooltip: '賳賯卮賴 爻丕蹖鬲 乇丕 丿賳亘丕賱 讴賳蹖丿 鬲丕 爻丕蹖鬲 乇丕 亘禺夭蹖丿. 丿乇 睾蹖乇 丕蹖賳 氐賵乇鬲貙 Jina Reader 亘乇 丕爻丕爻 丕乇鬲亘丕胤 氐賮丨賴 亘賴 氐賵乇鬲 鬲讴乇丕乇蹖 賲蹖 禺夭丿 賵 氐賮丨丕鬲 讴賲鬲乇 丕賲丕 亘丕 讴蹖賮蹖鬲 亘丕賱丕鬲乇 乇丕 亘賴 丿爻鬲 賲蹖 丌賵乇丿.',
+      watercrawlDoc: '賲爻鬲賳丿丕鬲 賵丕鬲乇 讴乇丕賵賱',
+      configureFirecrawl: '鬲賳馗蹖賲 Firecrawl',
+      waterCrawlNotConfiguredDescription: '亘乇丕蹖 丕爻鬲賮丕丿賴 丕夭 Watercrawl貙 丌賳 乇丕 亘丕 讴賱蹖丿 API 倬蹖讴乇亘賳丿蹖 讴賳蹖丿.',
+      waterCrawlNotConfigured: 'Watercrawl 倬蹖讴乇亘賳丿蹖 賳卮丿賴 丕爻鬲',
+      configureJinaReader: '倬蹖讴乇亘賳丿蹖 禺賵丕賳賳丿賴 噩蹖賳丕',
+      watercrawlDocLink: 'https://docs.dify.ai/fa/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      watercrawlTitle: '賲丨鬲賵丕蹖 賵亘 乇丕 亘丕 賵丕鬲乇讴乇丕賱 丕爻鬲禺乇丕噩 讴賳蹖丿',
+      configureWatercrawl: '鬲賳馗蹖賲 賵丕鬲乇讴乇丕賵賱',
+    },
+    cancel: '賱睾賵',
+  },
+  stepTwo: {
+    segmentation: '鬲賳馗蹖賲丕鬲 亘禺卮亘賳丿蹖',
+    auto: '禺賵丿讴丕乇',
+    autoDescription: '亘賴 胤賵乇 禺賵丿讴丕乇 賯賵丕賳蹖賳 亘禺卮亘賳丿蹖 賵 倬蹖卮倬乇丿丕夭卮 乇丕 鬲賳馗蹖賲 讴賳蹖丿. 亘賴 讴丕乇亘乇丕賳 賳丕丌卮賳丕 鬲賵氐蹖賴 賲蹖卮賵丿 丕蹖賳 诏夭蹖賳賴 乇丕 丕賳鬲禺丕亘 讴賳賳丿.',
+    custom: '爻賮丕乇卮蹖',
+    customDescription: '賯賵丕賳蹖賳 亘禺卮亘賳丿蹖貙 胤賵賱 亘禺卮賴丕 賵 賯賵丕賳蹖賳 倬蹖卮倬乇丿丕夭卮 乇丕 爻賮丕乇卮蹖 讴賳蹖丿貙 賵 睾蹖乇賴.',
+    separator: '卮賳丕爻賴 亘禺卮',
+    separatorPlaceholder: '亘乇丕蹖 賲孬丕賱貙 禺胤 噩丿蹖丿 (\\\\n) 蹖丕 噩丿丕讴賳賳丿賴 禺丕氐 (賲丕賳賳丿 "***")',
+    maxLength: '丨丿丕讴孬乇 胤賵賱 亘禺卮',
+    overlap: '賴賲倬賵卮丕賳蹖 亘禺卮',
+    overlapTip: '鬲賳馗蹖賲 賴賲倬賵卮丕賳蹖 亘禺卮 賲蹖鬲賵丕賳丿 丕乇鬲亘丕胤 賲毓賳丕蹖蹖 亘蹖賳 丌賳賴丕 乇丕 丨賮馗 讴賳丿 賵 丕孬乇 亘丕夭蹖丕亘蹖 乇丕 丕賮夭丕蹖卮 丿賴丿. 鬲賵氐蹖賴 賲蹖卮賵丿 10%-25% 丕夭 丨丿丕讴孬乇 丕賳丿丕夭賴 亘禺卮 鬲賳馗蹖賲 卮賵丿.',
+    overlapCheck: '賴賲倬賵卮丕賳蹖 亘禺卮 賳亘丕蹖丿 亘夭乇诏鬲乇 丕夭 胤賵賱 丨丿丕讴孬乇 亘禺卮 亘丕卮丿',
+    rules: '賯賵丕賳蹖賳 倬蹖卮倬乇丿丕夭卮 賲鬲賳',
+    removeExtraSpaces: '噩丕蹖诏夭蹖賳蹖 賮囟丕賴丕蹖 賲鬲賵丕賱蹖貙 禺胤賵胤 噩丿蹖丿 賵 鬲亘賴丕',
+    removeUrlEmails: '丨匕賮 賴賲賴 URL賴丕 賵 丌丿乇爻賴丕蹖 丕蹖賲蹖賱',
+    removeStopwords: '丨匕賮 讴賱賲丕鬲 鬲賵賯賮 賲丕賳賳丿 "a"貙 "an"貙 "the"',
+    preview: '鬲兀蹖蹖丿 賵 倬蹖卮賳賲丕蹖卮',
+    reset: '亘丕夭賳卮丕賳蹖',
+    indexMode: '丨丕賱鬲 卮丕禺氐',
+    qualified: '讴蹖賮蹖鬲 亘丕賱丕',
+    recommend: '鬲賵氐蹖賴 卮丿賴',
+    qualifiedTip: '乇丕亘胤 噩丕爻丕夭蹖 爻蹖爻鬲賲 倬蹖卮賮乇囟 乇丕 亘乇丕蹖 倬乇丿丕夭卮 賮乇丕禺賵丕賳蹖 讴賳蹖丿 鬲丕 丿賯鬲 亘丕賱丕鬲乇蹖 賴賳诏丕賲 倬乇爻卮 讴丕乇亘乇丕賳 賮乇丕賴賲 卮賵丿.',
+    warning: '賱胤賮丕賸 丕亘鬲丿丕 讴賱蹖丿 API 丕乇丕卅賴丿賴賳丿賴 賲丿賱 乇丕 鬲賳馗蹖賲 讴賳蹖丿.',
+    click: '乇賮鬲賳 亘賴 鬲賳馗蹖賲丕鬲',
+    economical: '丕賯鬲氐丕丿蹖',
+    economicalTip: '丕夭 賲賵鬲賵乇賴丕蹖 亘乇丿丕乇蹖 丌賮賱丕蹖賳貙 卮丕禺氐賴丕蹖 讴賱蹖丿賵丕跇賴 賵 睾蹖乇賴 丕爻鬲賮丕丿賴 讴賳蹖丿 鬲丕 丿賯鬲 乇丕 亘丿賵賳 氐乇賮 鬲賵讴賳賴丕 讴丕賴卮 丿賴蹖丿',
+    QATitle: '亘禺卮亘賳丿蹖 丿乇 賯丕賱亘 倬乇爻卮 賵 倬丕爻禺',
+    QATip: '賮毓丕賱 讴乇丿賳 丕蹖賳 诏夭蹖賳賴 鬲賵讴賳賴丕蹖 亘蹖卮鬲乇蹖 賲氐乇賮 禺賵丕賴丿 讴乇丿',
+    QALanguage: '亘禺卮亘賳丿蹖 亘丕 丕爻鬲賮丕丿賴 丕夭',
+    estimateCost: '亘乇丌賵乇丿',
+    estimateSegment: '亘禺卮賴丕蹖 亘乇丌賵乇丿 卮丿賴',
+    segmentCount: '亘禺卮賴丕',
+    calculating: '丿乇 丨丕賱 賲丨丕爻亘賴...',
+    fileSource: '倬蹖卮倬乇丿丕夭卮 丕爻賳丕丿',
+    notionSource: '倬蹖卮倬乇丿丕夭卮 氐賮丨丕鬲',
+    websiteSource: '倬蹖卮倬乇丿丕夭卮 賵亘爻丕蹖鬲',
+    other: '賵 爻丕蹖乇',
+    fileUnit: ' 賮丕蹖賱賴丕',
+    notionUnit: ' 氐賮丨丕鬲',
+    webpageUnit: ' 氐賮丨丕鬲',
+    previousStep: '賲乇丨賱賴 賯亘賱蹖',
+    nextStep: '匕禺蹖乇賴 賵 倬乇丿丕夭卮',
+    save: '匕禺蹖乇賴 賵 倬乇丿丕夭卮',
+    cancel: '賱睾賵',
+    sideTipTitle: '趩乇丕 亘禺卮亘賳丿蹖 賵 倬蹖卮倬乇丿丕夭卮責',
+    sideTipP1: '賴賳诏丕賲 倬乇丿丕夭卮 丿丕丿賴賴丕蹖 賲鬲賳蹖貙 亘禺卮亘賳丿蹖 賵 倬丕讴爻丕夭蹖 丿賵 賲乇丨賱賴 賲賴賲 倬蹖卮倬乇丿丕夭卮 賴爻鬲賳丿.',
+    sideTipP2: '亘禺卮亘賳丿蹖 賲鬲賳 胤賵賱丕賳蹖 乇丕 亘賴 倬丕乇丕诏乇丕賮賴丕 鬲賯爻蹖賲 賲蹖讴賳丿 鬲丕 賲丿賱賴丕 亘賴鬲乇 亘鬲賵丕賳賳丿 丌賳 乇丕 丿乇讴 讴賳賳丿. 丕蹖賳 讴蹖賮蹖鬲 賵 丕乇鬲亘丕胤 賳鬲丕蹖噩 賲丿賱 乇丕 亘賴亘賵丿 賲蹖亘禺卮丿.',
+    sideTipP3: '倬丕讴爻丕夭蹖 讴丕乇丕讴鬲乇賴丕 賵 賮乇賲鬲賴丕蹖 睾蹖乇囟乇賵乇蹖 乇丕 丨匕賮 賲蹖讴賳丿 賵 丿丕賳卮 乇丕 倬丕讴鬲乇 賵 丌爻丕賳鬲乇 亘乇丕蹖 鬲噩夭蹖賴 賲蹖讴賳丿.',
+    sideTipP4: '亘禺卮亘賳丿蹖 賵 倬丕讴爻丕夭蹖 賲賳丕爻亘 毓賲賱讴乇丿 賲丿賱 乇丕 亘賴亘賵丿 賲蹖亘禺卮丿 賵 賳鬲丕蹖噩 丿賯蹖賯鬲乇 賵 丕乇夭卮賲賳丿鬲乇蹖 丕乇丕卅賴 賲蹖丿賴丿.',
+    previewTitle: '倬蹖卮賳賲丕蹖卮',
+    previewTitleButton: '倬蹖卮賳賲丕蹖卮',
+    previewButton: '鬲睾蹖蹖乇 亘賴 賯丕賱亘 倬乇爻卮 賵 倬丕爻禺',
+    previewSwitchTipStart: '倬蹖卮賳賲丕蹖卮 亘禺卮 賮毓賱蹖 丿乇 賯丕賱亘 賲鬲賳 丕爻鬲貙 鬲睾蹖蹖乇 亘賴 倬蹖卮賳賲丕蹖卮 賯丕賱亘 倬乇爻卮 賵 倬丕爻禺',
+    previewSwitchTipEnd: ' 鬲賵讴賳賴丕蹖 丕囟丕賮蹖 賲氐乇賮 禺賵丕賴丿 讴乇丿',
+    characters: '讴丕乇丕讴鬲乇賴丕',
+    indexSettingTip: '亘乇丕蹖 鬲睾蹖蹖乇 乇賵卮 卮丕禺氐貙 賱胤賮丕賸 亘賴',
+    retrievalSettingTip: '亘乇丕蹖 鬲睾蹖蹖乇 乇賵卮 卮丕禺氐貙 賱胤賮丕賸 亘賴',
+    datasetSettingLink: '鬲賳馗蹖賲丕鬲 丿丕賳卮 亘乇賵蹖丿.',
+    separatorTip: '噩丿丕讴賳賳丿賴 賳賵蹖爻賴 丕蹖 丕爻鬲 讴賴 亘乇丕蹖 噩丿丕爻丕夭蹖 賲鬲賳 丕爻鬲賮丕丿賴 賲蹖 卮賵丿. \\n\\n 賵 \\n 賲毓賲賵賱丕 亘乇丕蹖 噩丿丕爻丕夭蹖 倬丕乇丕诏乇丕賮 賴丕 賵 禺胤賵胤 丕爻鬲賮丕丿賴 賲蹖 卮賵賳丿. 賴賲乇丕賴 亘丕 讴丕賲丕 (\\n\\n,\\n)貙 倬丕乇丕诏乇丕賮 賴丕 夭賲丕賳蹖 讴賴 丕夭 丨丿丕讴孬乇 胤賵賱 鬲讴賴 賮乇丕鬲乇 賲蹖 乇賵賳丿貙 亘丕 禺胤賵胤 鬲賯爻蹖賲 亘賳丿蹖 賲蹖 卮賵賳丿. 賴賲趩賳蹖賳 賲蹖 鬲賵丕賳蹖丿 丕夭 噩丿丕讴賳賳丿賴 賴丕蹖 禺丕氐蹖 讴賴 鬲賵爻胤 禺賵丿鬲丕賳 鬲毓乇蹖賮 卮丿賴 丕賳丿 丕爻鬲賮丕丿賴 讴賳蹖丿 (賲孬賱丕 ***).',
+    maxLengthCheck: '丨丿丕讴孬乇 胤賵賱 鬲讴賴 亘丕蹖丿 讴賲鬲乇 丕夭 {{limit}} 亘丕卮丿',
+    notAvailableForQA: '亘乇丕蹖 卮丕禺氐 倬乇爻卮 賵 倬丕爻禺 丿乇 丿爻鬲乇爻 賳蹖爻鬲',
+    parentChild: '倬丿乇 賵 賲丕丿乇 賵 賮乇夭賳丿',
+    qaSwitchHighQualityTipContent: '丿乇 丨丕賱 丨丕囟乇貙 賮賯胤 乇賵卮 卮丕禺氐 亘丕 讴蹖賮蹖鬲 亘丕賱丕 丕夭 鬲讴賴 鬲讴賴 讴乇丿賳 賮乇賲鬲 倬乇爻卮 賵 倬丕爻禺 倬卮鬲蹖亘丕賳蹖 賲蹖 讴賳丿. 丌蹖丕 賲蹖 禺賵丕賴蹖丿 亘賴 丨丕賱鬲 亘丕 讴蹖賮蹖鬲 亘丕賱丕 亘乇賵蹖丿責',
+    previewChunk: '倬蹖卮 賳賲丕蹖卮 鬲讴賴',
+    previewChunkCount: '{{鬲毓丿丕丿}} 鬲讴賴 賴丕蹖 鬲禺賲蹖賳蹖',
+    previewChunkTip: '乇賵蹖 丿讴賲賴 "倬蹖卮 賳賲丕蹖卮 賯胤毓賴" 丿乇 爻賲鬲 趩倬 讴賱蹖讴 讴賳蹖丿 鬲丕 倬蹖卮 賳賲丕蹖卮 亘丕乇诏蹖乇蹖 卮賵丿',
+    general: '毓賲賵賲蹖',
+    paragraphTip: '丕蹖賳 丨丕賱鬲 賲鬲賳 乇丕 亘乇 丕爻丕爻 噩丿丕讴賳賳丿賴 賴丕 賵 丨丿丕讴孬乇 胤賵賱 鬲讴賴 亘賴 倬丕乇丕诏乇丕賮 賴丕 鬲賯爻蹖賲 賲蹖 讴賳丿 賵 丕夭 賲鬲賳 鬲賯爻蹖賲 卮丿賴 亘賴 毓賳賵丕賳 鬲讴賴 賵丕賱丿 亘乇丕蹖 亘丕夭蹖丕亘蹖 丕爻鬲賮丕丿賴 賲蹖 讴賳丿.',
+    parentChunkForContext: '鬲讴賴 賵丕賱丿 亘乇丕蹖 夭賲蹖賳賴',
+    fullDoc: '賲爻鬲賳丿 讴丕賲賱',
+    switch: '爻賵卅蹖趩',
+    parentChildChunkDelimiterTip: '噩丿丕讴賳賳丿賴 賳賵蹖爻賴 丕蹖 丕爻鬲 讴賴 亘乇丕蹖 噩丿丕爻丕夭蹖 賲鬲賳 丕爻鬲賮丕丿賴 賲蹖 卮賵丿. \\n 亘乇丕蹖 鬲賯爻蹖賲 鬲讴賴 賴丕蹖 賵丕賱丿 亘賴 鬲讴賴 賴丕蹖 讴賵趩讴 讴賵丿讴 鬲賵氐蹖賴 賲蹖 卮賵丿. 賴賲趩賳蹖賳 賲蹖 鬲賵丕賳蹖丿 丕夭 噩丿丕讴賳賳丿賴 賴丕蹖 賵蹖跇賴 丕蹖 讴賴 鬲賵爻胤 禺賵丿鬲丕賳 鬲毓乇蹖賮 卮丿賴 丕爻鬲 丕爻鬲賮丕丿賴 讴賳蹖丿.',
+    generalTip: '丨丕賱鬲 鬲讴賴 鬲讴賴 讴乇丿賳 賲鬲賳 毓賲賵賲蹖貙 鬲讴賴 賴丕蹖 亘丕夭蹖丕亘蹖 卮丿賴 賵 賮乇丕禺賵丕賳蹖 卮丿賴 蹖讴爻丕賳 賴爻鬲賳丿.',
+    paragraph: '倬丕乇丕诏乇丕賮',
+    highQualityTip: '倬爻 丕夭 丕鬲賲丕賲 噩丕爻丕夭蹖 丿乇 丨丕賱鬲 讴蹖賮蹖鬲 亘丕賱丕貙 亘丕夭诏卮鬲 亘賴 丨丕賱鬲 丕賯鬲氐丕丿蹖 丿乇 丿爻鬲乇爻 賳蹖爻鬲.',
+    parentChildTip: '賴賳诏丕賲 丕爻鬲賮丕丿賴 丕夭 丨丕賱鬲 賵丕賱丿-賮乇夭賳丿貙 鬲讴賴 賮乇夭賳丿 亘乇丕蹖 亘丕夭蹖丕亘蹖 賵 鬲讴賴 賵丕賱丿 亘乇丕蹖 蹖丕丿丌賵乇蹖 亘賴 毓賳賵丕賳 夭賲蹖賳賴 丕爻鬲賮丕丿賴 賲蹖 卮賵丿.',
+    notAvailableForParentChild: '亘乇丕蹖 賳賲丕蹖賴 賵丕賱丿-賮乇夭賳丿 丿乇 丿爻鬲乇爻 賳蹖爻鬲',
+    parentChildDelimiterTip: '噩丿丕讴賳賳丿賴 賳賵蹖爻賴 丕蹖 丕爻鬲 讴賴 亘乇丕蹖 噩丿丕爻丕夭蹖 賲鬲賳 丕爻鬲賮丕丿賴 賲蹖 卮賵丿. \\n\\n 亘乇丕蹖 鬲賯爻蹖賲 爻賳丿 丕氐賱蹖 亘賴 鬲讴賴 賴丕蹖 賵丕賱丿 亘夭乇诏 鬲賵氐蹖賴 賲蹖 卮賵丿. 賴賲趩賳蹖賳 賲蹖 鬲賵丕賳蹖丿 丕夭 噩丿丕讴賳賳丿賴 賴丕蹖 賵蹖跇賴 丕蹖 讴賴 鬲賵爻胤 禺賵丿鬲丕賳 鬲毓乇蹖賮 卮丿賴 丕爻鬲 丕爻鬲賮丕丿賴 讴賳蹖丿.',
+    childChunkForRetrieval: '鬲讴賴 讴賵丿讴 亘乇丕蹖 亘丕夭蹖丕亘蹖',
+    fullDocTip: '讴賱 爻賳丿 亘賴 毓賳賵丕賳 鬲讴賴 賵丕賱丿 丕爻鬲賮丕丿賴 賲蹖 卮賵丿 賵 賲爻鬲賯蹖賲丕 亘丕夭蹖丕亘蹖 賲蹖 卮賵丿. 賱胤賮丕 鬲賵噩賴 丿丕卮鬲賴 亘丕卮蹖丿 讴賴 亘賴 丿賱丕蹖賱 毓賲賱讴乇丿蹖貙 賲鬲賳 亘蹖卮 丕夭 10000 鬲賵讴賳 亘賴 胤賵乇 禺賵丿讴丕乇 讴賵鬲丕賴 賲蹖 卮賵丿.',
+    qaSwitchHighQualityTipTitle: '賮乇賲鬲 倬乇爻卮 賵 倬丕爻禺 亘賴 乇賵卮 賳賲丕蹖賴 爻丕夭蹖 亘丕 讴蹖賮蹖鬲 亘丕賱丕 賳蹖丕夭 丿丕乇丿',
+    useQALanguage: '鬲讴賴 亘丕 丕爻鬲賮丕丿賴 丕夭 賮乇賲鬲 倬乇爻卮 賵 倬丕爻禺 丿乇',
+  },
+  stepThree: {
+    creationTitle: ' 丿丕賳卮 丕蹖噩丕丿 卮丿',
+    creationContent: '賲丕 亘賴 胤賵乇 禺賵丿讴丕乇 賳丕賲 丿丕賳卮 乇丕 鬲毓蹖蹖賳 讴乇丿蹖賲貙 卮賲丕 賲蹖鬲賵丕賳蹖丿 賴乇 夭賲丕賳 丌賳 乇丕 鬲睾蹖蹖乇 丿賴蹖丿',
+    label: '賳丕賲 丿丕賳卮',
+    additionTitle: ' 爻賳丿 亘丕乇诏匕丕乇蹖 卮丿',
+    additionP1: '爻賳丿 亘賴 丿丕賳卮 亘丕乇诏匕丕乇蹖 卮丿賴 丕爻鬲',
+    additionP2: '貙 賲蹖鬲賵丕賳蹖丿 丌賳 乇丕 丿乇 賱蹖爻鬲 丕爻賳丕丿 丿丕賳卮 倬蹖丿丕 讴賳蹖丿.',
+    stop: '鬲賵賯賮 倬乇丿丕夭卮',
+    resume: '丕丿丕賲賴 倬乇丿丕夭卮',
+    navTo: '乇賮鬲賳 亘賴 爻賳丿',
+    sideTipTitle: '亘毓丿蹖 趩蹖爻鬲',
+    sideTipContent: '倬爻 丕夭 丕鬲賲丕賲 賮賴乇爻鬲亘賳丿蹖 爻賳丿貙 丿丕賳卮 賲蹖鬲賵丕賳丿 亘賴 毓賳賵丕賳 夭賲蹖賳賴 丿乇 亘乇賳丕賲賴 蹖讴倬丕乇趩賴 卮賵丿貙 賲蹖鬲賵丕賳蹖丿 鬲賳馗蹖賲丕鬲 夭賲蹖賳賴 乇丕 丿乇 氐賮丨賴 丕乇讴爻鬲乇丕爻蹖賵賳 丿乇禺賵丕爻鬲 倬蹖丿丕 讴賳蹖丿. 賴賲趩賳蹖賳 賲蹖鬲賵丕賳蹖丿 丌賳 乇丕 亘賴 毓賳賵丕賳 蹖讴 丕賮夭賵賳賴 賮賴乇爻鬲亘賳丿蹖 賲爻鬲賯賱 ChatGPT 亘乇丕蹖 丕賳鬲卮丕乇 丕蹖噩丕丿 讴賳蹖丿.',
+    modelTitle: '丌蹖丕 賲胤賲卅賳 賴爻鬲蹖丿 讴賴 賲蹖禺賵丕賴蹖丿 噩丕爻丕夭蹖 乇丕 賲鬲賵賯賮 讴賳蹖丿責',
+    modelContent: '丕诏乇 賳蹖丕夭 亘賴 丕丿丕賲賴 倬乇丿丕夭卮 亘毓丿丕賸 丿丕乇蹖丿貙 丕夭 噩丕蹖蹖 讴賴 賲鬲賵賯賮 卮丿賴丕蹖丿 丕丿丕賲賴 禺賵丕賴蹖丿 丿丕丿.',
+    modelButtonConfirm: '鬲兀蹖蹖丿',
+    modelButtonCancel: '賱睾賵',
+  },
+  jinaReader: {
+    configJinaReader: '倬蹖讴乇亘賳丿蹖 Jina Reader',
+    apiKeyPlaceholder: '讴賱蹖丿 API 丕夭 jina.ai',
+    getApiKeyLinkText: '讴賱蹖丿 API 乇丕蹖诏丕賳 禺賵丿 乇丕 丿乇 jina.ai 丿乇蹖丕賮鬲 讴賳蹖丿',
+  },
+  otherDataSource: {
+    learnMore: '亘蹖卮鬲乇 亘丿丕賳蹖丿',
+    description: '丿乇 丨丕賱 丨丕囟乇貙 倬丕蹖诏丕賴 丿丕賳卮 Dify 賮賯胤 賲賳丕亘毓 丿丕丿賴 賲丨丿賵丿蹖 丿丕乇丿. 讴賲讴 亘賴 蹖讴 賲賳亘毓 丿丕丿賴 亘賴 倬丕蹖诏丕賴 丿丕賳卮 Dify 乇丕賴蹖 賮賵賯 丕賱毓丕丿賴 亘乇丕蹖 讴賲讴 亘賴 丕賮夭丕蹖卮 丕賳毓胤丕賮 倬匕蹖乇蹖 賵 賯丿乇鬲 倬賱鬲賮乇賲 亘乇丕蹖 賴賲賴 讴丕乇亘乇丕賳 丕爻鬲. 乇丕賴賳賲丕蹖 賲卮丕乇讴鬲 賲丕 卮乇賵毓 讴丕乇 乇丕 丌爻丕賳 賲蹖 讴賳丿. 賱胤賮丕 亘乇丕蹖 讴爻亘 丕胤賱丕毓丕鬲 亘蹖卮鬲乇 乇賵蹖 賱蹖賳讴 夭蹖乇 讴賱蹖讴 讴賳蹖丿.',
+    title: '亘賴 賲賳丕亘毓 丿丕丿賴 丿蹖诏乇 賲鬲氐賱 卮賵蹖丿責',
+  },
+  watercrawl: {
+    getApiKeyLinkText: '讴賱蹖丿 API 禺賵丿 乇丕 丕夭 watercrawl.dev 丿乇蹖丕賮鬲 讴賳蹖丿',
+    configWatercrawl: '鬲賳馗蹖賲 賵丕鬲乇讴乇丕賵賱',
+    apiKeyPlaceholder: '讴賱蹖丿 API 丕夭 watercrawl.dev',
+  },
+}
+
+export default translation
diff --git a/i18n/fa-IR/dataset-documents.ts b/i18n/fa-IR/dataset-documents.ts
new file mode 100644
index 0000000..85e1e0a
--- /dev/null
+++ b/i18n/fa-IR/dataset-documents.ts
@@ -0,0 +1,394 @@
+const translation = {
+  list: {
+    title: '丕爻賳丕丿',
+    desc: '鬲賲丕賲蹖 賮丕蹖賱鈥屬囏й� 丿丕賳卮 丿乇 丕蹖賳噩丕 賳賲丕蹖卮 丿丕丿賴 賲蹖鈥屫促堎嗀� 賵 讴賱 丿丕賳卮 賲蹖鈥屫堌з嗀� 亘賴 丕乇噩丕毓丕鬲 Dify 賲鬲氐賱 卮賵丿 蹖丕 丕夭 胤乇蹖賯 丕賮夭賵賳賴 趩鬲 丕蹖賳丿讴爻 卮賵丿.',
+    addFile: '丕囟丕賮賴 讴乇丿賳 賮丕蹖賱',
+    addPages: '丕囟丕賮賴 讴乇丿賳 氐賮丨丕鬲',
+    addUrl: '丕囟丕賮賴 讴乇丿賳 URL',
+    table: {
+      header: {
+        fileName: '賳丕賲 賮丕蹖賱',
+        words: '讴賱賲丕鬲',
+        hitCount: '鬲毓丿丕丿 亘丕夭蹖丕亘蹖',
+        uploadTime: '夭賲丕賳 亘丕乇诏匕丕乇蹖',
+        status: '賵囟毓蹖鬲',
+        action: '丕賯丿丕賲',
+        chunkingMode: '丨丕賱鬲 鬲讴賴 鬲讴賴 讴乇丿賳',
+      },
+      rename: '鬲睾蹖蹖乇 賳丕賲',
+      name: '賳丕賲',
+    },
+    action: {
+      uploadFile: '亘丕乇诏匕丕乇蹖 賮丕蹖賱 噩丿蹖丿',
+      settings: '鬲賳馗蹖賲丕鬲 亘禺卮鈥屫ㄙ嗀�',
+      addButton: '丕囟丕賮賴 讴乇丿賳 賯胤毓賴',
+      add: '丕囟丕賮賴 讴乇丿賳 蹖讴 賯胤毓賴',
+      batchAdd: '丕賮夭賵丿賳 诏乇賵賴蹖',
+      archive: '亘丕蹖诏丕賳蹖',
+      unarchive: '禺丕乇噩 讴乇丿賳 丕夭 亘丕蹖诏丕賳蹖',
+      delete: '丨匕賮',
+      enableWarning: '賮丕蹖賱 亘丕蹖诏丕賳蹖 卮丿賴 賳賲蹖鈥屫堌з嗀� 賮毓丕賱 卮賵丿',
+      sync: '賴賲诏丕賲鈥屫池ж槽�',
+    },
+    index: {
+      enable: '賮毓丕賱 讴乇丿賳',
+      disable: '睾蹖乇賮毓丕賱 讴乇丿賳',
+      all: '賴賲賴',
+      enableTip: '賮丕蹖賱 賲蹖鈥屫堌з嗀� 丕蹖賳丿讴爻 卮賵丿',
+      disableTip: '賮丕蹖賱 賳賲蹖鈥屫堌з嗀� 丕蹖賳丿讴爻 卮賵丿',
+    },
+    status: {
+      queuing: '丿乇 氐賮',
+      indexing: '丕蹖賳丿讴爻鈥屫池ж槽�',
+      paused: '賲鬲賵賯賮 卮丿賴',
+      error: '禺胤丕',
+      available: '賲賵噩賵丿',
+      enabled: '賮毓丕賱 卮丿賴',
+      disabled: '睾蹖乇賮毓丕賱 卮丿賴',
+      archived: '亘丕蹖诏丕賳蹖 卮丿賴',
+    },
+    empty: {
+      title: '賴賳賵夭 賴蹖趩 爻賳丿蹖 賵噩賵丿 賳丿丕乇丿',
+      upload: {
+        tip: '卮賲丕 賲蹖鈥屫堌з嗃屫� 賮丕蹖賱鈥屬囏� 乇丕 亘丕乇诏匕丕乇蹖 讴賳蹖丿貙 丕夭 賵亘鈥屫池й屫� 賴賲诏丕賲鈥屫池ж槽� 讴賳蹖丿貙 蹖丕 丕夭 亘乇賳丕賲賴鈥屬囏й� 賵亘蹖 賲丕賳賳丿 Notion貙 GitHub 賵 睾蹖乇賴.',
+      },
+      sync: {
+        tip: 'Dify 亘賴鈥屫焚堌� 丿賵乇賴鈥屫й� 賮丕蹖賱鈥屬囏� 乇丕 丕夭 Notion 卮賲丕 丿丕賳賱賵丿 賵 倬乇丿丕夭卮 乇丕 讴丕賲賱 賲蹖鈥屭┵嗀�.',
+      },
+    },
+    delete: {
+      title: '丌蹖丕 賲胤賲卅賳 賴爻鬲蹖丿 讴賴 丨匕賮 卮賵丿責',
+      content: '丕诏乇 亘毓丿丕賸 賳蹖丕夭 亘賴 丕丿丕賲賴 倬乇丿丕夭卮 丿丕卮鬲蹖丿貙 丕夭 賴賲丕賳 噩丕蹖蹖 讴賴 賲丕賳丿賴 亘賵丿蹖丿 丕丿丕賲賴 賲蹖鈥屫囒屫�',
+    },
+    batchModal: {
+      title: '丕賮夭賵丿賳 诏乇賵賴蹖 賯胤毓丕鬲',
+      csvUploadTitle: '賮丕蹖賱 CSV 禺賵丿 乇丕 丕蹖賳噩丕 亘讴卮蹖丿 賵 乇賴丕 讴賳蹖丿貙 蹖丕 ',
+      browse: '賲乇賵乇 讴賳蹖丿',
+      tip: '賮丕蹖賱 CSV 亘丕蹖丿 亘賴 爻丕禺鬲丕乇 夭蹖乇 賲胤丕亘賯鬲 丿丕卮鬲賴 亘丕卮丿:',
+      question: '爻丐丕賱',
+      answer: '倬丕爻禺',
+      contentTitle: '賲丨鬲賵丕蹖 賯胤毓賴',
+      content: '賲丨鬲賵丕',
+      template: '丕賱诏賵 乇丕 丕夭 丕蹖賳噩丕 丿丕賳賱賵丿 讴賳蹖丿',
+      cancel: '賱睾賵',
+      run: '丕噩乇丕蹖 诏乇賵賴蹖',
+      runError: '丕噩乇丕蹖 诏乇賵賴蹖 賳丕賲賵賮賯 亘賵丿',
+      processing: '丿乇 丨丕賱 倬乇丿丕夭卮 诏乇賵賴蹖',
+      completed: '賵丕乇丿丕鬲 讴丕賲賱 卮丿',
+      error: '禺胤丕蹖 賵丕乇丿丕鬲',
+      ok: '鬲兀蹖蹖丿',
+    },
+    learnMore: '亘蹖卮鬲乇 亘丿丕賳蹖丿',
+  },
+  metadata: {
+    title: '丕胤賱丕毓丕鬲 賲鬲丕',
+    desc: '亘乇趩爻亘鈥屭柏ж臂� 賲鬲丕丿蹖鬲丕 亘乇丕蹖 丕爻賳丕丿 亘賴 賴賵卮 賲氐賳賵毓蹖 丕噩丕夭賴 賲蹖鈥屫囏� 鬲丕 亘賴 賲賵賯毓 亘賴 丌賳鈥屬囏� 丿爻鬲乇爻蹖 倬蹖丿丕 讴賳丿 賵 賲賳亘毓 丕乇噩丕毓丕鬲 乇丕 亘乇丕蹖 讴丕乇亘乇丕賳 丌卮讴丕乇 讴賳丿.',
+    dateTimeFormat: 'D MMMM YYYY hh:mm A',
+    docTypeSelectTitle: '賱胤賮丕賸 蹖讴 賳賵毓 爻賳丿 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+    docTypeChangeTitle: '鬲睾蹖蹖乇 賳賵毓 爻賳丿',
+    docTypeSelectWarning: '丕诏乇 賳賵毓 爻賳丿 鬲睾蹖蹖乇 讴賳丿貙 賲鬲丕丿蹖鬲丕蹖 倬乇 卮丿賴 賮毓賱蹖 丿蹖诏乇 丨賮馗 賳禺賵丕賴丿 卮丿',
+    firstMetaAction: '亘夭賳 亘乇蹖賲',
+    placeholder: {
+      add: '丕囟丕賮賴 讴乇丿賳 ',
+      select: '丕賳鬲禺丕亘 ',
+    },
+    source: {
+      upload_file: '亘丕乇诏匕丕乇蹖 賮丕蹖賱',
+      notion: '賴賲诏丕賲鈥屫池ж槽� 丕夭 Notion',
+      github: '賴賲诏丕賲鈥屫池ж槽� 丕夭 Github',
+    },
+    type: {
+      book: '讴鬲丕亘',
+      webPage: '氐賮丨賴 賵亘',
+      paper: '賲賯丕賱賴',
+      socialMediaPost: '倬爻鬲 卮亘讴賴鈥屬囏й� 丕噩鬲賲丕毓蹖',
+      personalDocument: '爻賳丿 卮禺氐蹖',
+      businessDocument: '爻賳丿 鬲噩丕乇蹖',
+      IMChat: '趩鬲 IM',
+      wikipediaEntry: '賵乇賵丿蹖 賵蹖讴蹖鈥屬矩屫�',
+      notion: '賴賲诏丕賲鈥屫池ж槽� 丕夭 Notion',
+      github: '賴賲诏丕賲鈥屫池ж槽� 丕夭 Github',
+      technicalParameters: '倬丕乇丕賲鬲乇賴丕蹖 賮賳蹖',
+    },
+    field: {
+      processRule: {
+        processDoc: '倬乇丿丕夭卮 爻賳丿',
+        segmentRule: '賯丕賳賵賳 賯胤毓賴鈥屫ㄙ嗀�',
+        segmentLength: '胤賵賱 賯胤毓丕鬲',
+        processClean: '鬲賲蹖夭 讴乇丿賳 倬乇丿丕夭卮 賲鬲賳',
+      },
+      book: {
+        title: '毓賳賵丕賳',
+        language: '夭亘丕賳',
+        author: '賳賵蹖爻賳丿賴',
+        publisher: '賳丕卮乇',
+        publicationDate: '鬲丕乇蹖禺 丕賳鬲卮丕乇',
+        ISBN: 'ISBN',
+        category: '丿爻鬲賴鈥屫ㄙ嗀�',
+      },
+      webPage: {
+        title: '毓賳賵丕賳',
+        url: 'URL',
+        language: '夭亘丕賳',
+        authorPublisher: '賳賵蹖爻賳丿賴/賳丕卮乇',
+        publishDate: '鬲丕乇蹖禺 丕賳鬲卮丕乇',
+        topicKeywords: '賲賵囟賵毓丕鬲/讴賱蹖丿賵丕跇賴鈥屬囏�',
+        description: '鬲賵囟蹖丨丕鬲',
+      },
+      paper: {
+        title: '毓賳賵丕賳',
+        language: '夭亘丕賳',
+        author: '賳賵蹖爻賳丿賴',
+        publishDate: '鬲丕乇蹖禺 丕賳鬲卮丕乇',
+        journalConferenceName: '賳丕賲 跇賵乇賳丕賱/讴賳賮乇丕賳爻',
+        volumeIssuePage: '噩賱丿/卮賲丕乇賴/氐賮丨賴',
+        DOI: 'DOI',
+        topicsKeywords: '賲賵囟賵毓丕鬲/讴賱蹖丿賵丕跇賴鈥屬囏�',
+        abstract: '趩讴蹖丿賴',
+      },
+      socialMediaPost: {
+        platform: '倬賱鬲賮乇賲',
+        authorUsername: '賳賵蹖爻賳丿賴/賳丕賲 讴丕乇亘乇蹖',
+        publishDate: '鬲丕乇蹖禺 丕賳鬲卮丕乇',
+        postURL: 'URL 倬爻鬲',
+        topicsTags: '賲賵囟賵毓丕鬲/亘乇趩爻亘鈥屬囏�',
+      },
+      personalDocument: {
+        title: '毓賳賵丕賳',
+        author: '賳賵蹖爻賳丿賴',
+        creationDate: '鬲丕乇蹖禺 丕蹖噩丕丿',
+        lastModifiedDate: '鬲丕乇蹖禺 丌禺乇蹖賳 賵蹖乇丕蹖卮',
+        documentType: '賳賵毓 爻賳丿',
+        tagsCategory: '亘乇趩爻亘鈥屬囏�/丿爻鬲賴鈥屫ㄙ嗀�',
+      },
+      businessDocument: {
+        title: '毓賳賵丕賳',
+        author: '賳賵蹖爻賳丿賴',
+        creationDate: '鬲丕乇蹖禺 丕蹖噩丕丿',
+        lastModifiedDate: '鬲丕乇蹖禺 丌禺乇蹖賳 賵蹖乇丕蹖卮',
+        documentType: '賳賵毓 爻賳丿',
+        departmentTeam: '丿倬丕乇鬲賲丕賳/鬲蹖賲',
+      },
+      IMChat: {
+        chatPlatform: '倬賱鬲賮乇賲 趩鬲',
+        chatPartiesGroupName: '胤乇賮蹖賳 趩鬲/賳丕賲 诏乇賵賴',
+        participants: '卮乇讴鬲鈥屭┵嗁嗀з�',
+        startDate: '鬲丕乇蹖禺 卮乇賵毓',
+        endDate: '鬲丕乇蹖禺 倬丕蹖丕賳',
+        topicsKeywords: '賲賵囟賵毓丕鬲/讴賱蹖丿賵丕跇賴鈥屬囏�',
+        fileType: '賳賵毓 賮丕蹖賱',
+      },
+      wikipediaEntry: {
+        title: '毓賳賵丕賳',
+        language: '夭亘丕賳',
+        webpageURL: 'URL 氐賮丨賴 賵亘',
+        editorContributor: '賵蹖乇丕蹖卮诏乇/賴賲讴丕乇',
+        lastEditDate: '鬲丕乇蹖禺 丌禺乇蹖賳 賵蹖乇丕蹖卮',
+        summaryIntroduction: '禺賱丕氐賴/賲賯丿賲賴',
+      },
+      notion: {
+        title: '毓賳賵丕賳',
+        language: '夭亘丕賳',
+        author: '賳賵蹖爻賳丿賴',
+        createdTime: '夭賲丕賳 丕蹖噩丕丿',
+        lastModifiedTime: '夭賲丕賳 丌禺乇蹖賳 賵蹖乇丕蹖卮',
+        url: 'URL',
+        tag: '亘乇趩爻亘',
+        description: '鬲賵囟蹖丨丕鬲',
+      },
+      github: {
+        repoName: '賳丕賲 賲禺夭賳',
+        repoDesc: '鬲賵囟蹖丨丕鬲 賲禺夭賳',
+        repoOwner: '賲丕賱讴 賲禺夭賳',
+        fileName: '賳丕賲 賮丕蹖賱',
+        filePath: '賲爻蹖乇 賮丕蹖賱',
+        programmingLang: '夭亘丕賳 亘乇賳丕賲賴鈥屬嗁堐屫驰�',
+        url: 'URL',
+        license: '賲噩賵夭',
+        lastCommitTime: '夭賲丕賳 丌禺乇蹖賳 讴丕賲蹖鬲',
+        lastCommitAuthor: '賳賵蹖爻賳丿賴 丌禺乇蹖賳 讴丕賲蹖鬲',
+      },
+      originInfo: {
+        originalFilename: '賳丕賲 賮丕蹖賱 丕氐賱蹖',
+        originalFileSize: '丕賳丿丕夭賴 賮丕蹖賱 丕氐賱蹖',
+        uploadDate: '鬲丕乇蹖禺 亘丕乇诏匕丕乇蹖',
+        lastUpdateDate: '鬲丕乇蹖禺 丌禺乇蹖賳 亘乇賵夭乇爻丕賳蹖',
+        source: '賲賳亘毓',
+      },
+      technicalParameters: {
+        segmentSpecification: '賲卮禺氐丕鬲 賯胤毓丕鬲',
+        segmentLength: '胤賵賱 賯胤毓丕鬲',
+        avgParagraphLength: '胤賵賱 賲鬲賵爻胤 倬丕乇丕诏乇丕賮',
+        paragraphs: '倬丕乇丕诏乇丕賮鈥屬囏�',
+        hitCount: '鬲毓丿丕丿 亘丕夭蹖丕亘蹖',
+        embeddingTime: '夭賲丕賳 噩丕爻丕夭蹖',
+        embeddedSpend: '賴夭蹖賳賴 噩丕爻丕夭蹖',
+      },
+    },
+    languageMap: {
+      zh: '趩蹖賳蹖',
+      en: '丕賳诏賱蹖爻蹖',
+      es: '丕爻倬丕賳蹖丕蹖蹖',
+      fr: '賮乇丕賳爻賵蹖',
+      de: '丌賱賲丕賳蹖',
+      ja: '跇丕倬賳蹖',
+      ko: '讴乇賴鈥屫й�',
+      ru: '乇賵爻蹖',
+      ar: '毓乇亘蹖',
+      pt: '倬乇鬲睾丕賱蹖',
+      it: '丕蹖鬲丕賱蹖丕蹖蹖',
+      nl: '賴賱賳丿蹖',
+      pl: '賱賴爻鬲丕賳蹖',
+      sv: '爻賵卅丿蹖',
+      tr: '鬲乇讴蹖',
+      he: '毓亘乇蹖',
+      hi: '賴賳丿蹖',
+      da: '丿丕賳賲丕乇讴蹖',
+      fi: '賮賳賱丕賳丿蹖',
+      no: '賳乇賵跇蹖',
+      hu: '賲噩丕乇蹖',
+      el: '蹖賵賳丕賳蹖',
+      cs: '趩讴蹖',
+      th: '鬲丕蹖賱賳丿蹖',
+      id: '丕賳丿賵賳夭蹖丕蹖蹖',
+    },
+    categoryMap: {
+      book: {
+        fiction: '丿丕爻鬲丕賳',
+        biography: '夭賳丿诏蹖鈥屬嗀з呝�',
+        history: '鬲丕乇蹖禺',
+        science: '毓賱賲',
+        technology: '賮賳丕賵乇蹖',
+        education: '丌賲賵夭卮',
+        philosophy: '賮賱爻賮賴',
+        religion: '丿蹖賳',
+        socialSciences: '毓賱賵賲 丕噩鬲賲丕毓蹖',
+        art: '賴賳乇',
+        travel: '爻賮乇',
+        health: '爻賱丕賲鬲',
+        selfHelp: '禺賵丿蹖丕乇蹖',
+        businessEconomics: '丕賯鬲氐丕丿 讴爻亘鈥屬堏┴ж�',
+        cooking: '丌卮倬夭蹖',
+        childrenYoungAdults: '讴賵丿讴丕賳 賵 賳賵噩賵丕賳丕賳',
+        comicsGraphicNovels: '讴賲蹖讴鈥屬囏� 賵 乇賲丕賳鈥屬囏й� 诏乇丕賮蹖讴蹖',
+        poetry: '卮毓乇',
+        drama: '賳賲丕蹖卮賳丕賲賴',
+        other: '丿蹖诏乇',
+      },
+      personalDoc: {
+        notes: '蹖丕丿丿丕卮鬲鈥屬囏�',
+        blogDraft: '倬蹖卮鈥屬嗁堐屫� 賵亘賱丕诏',
+        diary: '丿賮鬲乇 禺丕胤乇丕鬲',
+        researchReport: '诏夭丕乇卮 倬跇賵賴卮',
+        bookExcerpt: '诏夭蹖丿賴 讴鬲丕亘',
+        schedule: '亘乇賳丕賲賴鈥屫臂屫槽�',
+        list: '賮賴乇爻鬲',
+        projectOverview: '賳賲丕蹖 讴賱蹖 倬乇賵跇賴',
+        photoCollection: '賲噩賲賵毓賴 毓讴爻',
+        creativeWriting: '賳賵卮鬲賴 禺賱丕賯丕賳賴',
+        codeSnippet: '賯胤毓賴 讴丿',
+        designDraft: '倬蹖卮鈥屬嗁堐屫� 胤乇丕丨蹖',
+        personalResume: '乇夭賵賲賴 卮禺氐蹖',
+        other: '丿蹖诏乇',
+      },
+      businessDoc: {
+        meetingMinutes: '氐賵乇鬲噩賱爻賴',
+        researchReport: '诏夭丕乇卮 倬跇賵賴卮',
+        proposal: '倬蹖卮賳賴丕丿',
+        employeeHandbook: '乇丕賴賳賲丕蹖 讴丕乇賲賳丿',
+        trainingMaterials: '賲賵丕丿 丌賲賵夭卮蹖',
+        requirementsDocument: '爻賳丿 賳蹖丕夭賲賳丿蹖鈥屬囏�',
+        designDocument: '爻賳丿 胤乇丕丨蹖',
+        productSpecification: '賲卮禺氐丕鬲 賲丨氐賵賱',
+        financialReport: '诏夭丕乇卮 賲丕賱蹖',
+        marketAnalysis: '鬲丨賱蹖賱 亘丕夭丕乇',
+        projectPlan: '胤乇丨 倬乇賵跇賴',
+        teamStructure: '爻丕禺鬲丕乇 鬲蹖賲',
+        policiesProcedures: '爻蹖丕爻鬲鈥屬囏� 賵 乇賵蹖賴鈥屬囏�',
+        contractsAgreements: '賯乇丕乇丿丕丿賴丕 賵 鬲賵丕賮賯鈥屬嗀з呝団�屬囏�',
+        emailCorrespondence: '賲讴丕鬲亘丕鬲 丕蹖賲蹖賱蹖',
+        other: '丿蹖诏乇',
+      },
+    },
+  },
+  embedding: {
+    processing: '丿乇 丨丕賱 倬乇丿丕夭卮 噩丕爻丕夭蹖...',
+    paused: '噩丕爻丕夭蹖 賲鬲賵賯賮 卮丿賴',
+    completed: '噩丕爻丕夭蹖 讴丕賲賱 卮丿',
+    error: '禺胤丕蹖 噩丕爻丕夭蹖',
+    docName: '倬蹖卮鈥屬矩必ж藏� 爻賳丿',
+    mode: '賯丕賳賵賳 亘禺卮鈥屫ㄙ嗀�',
+    segmentLength: '胤賵賱 賯胤毓丕鬲',
+    textCleaning: '倬蹖卮鈥屫关臂屬� 賵 鬲賲蹖夭 讴乇丿賳 賲鬲賳',
+    segments: '倬丕乇丕诏乇丕賮鈥屬囏�',
+    highQuality: '丨丕賱鬲 亘丕 讴蹖賮蹖鬲 亘丕賱丕',
+    economy: '丨丕賱鬲 丕賯鬲氐丕丿蹖',
+    estimate: '賲氐乇賮 鬲禺賲蹖賳蹖',
+    stop: '鬲賵賯賮 倬乇丿丕夭卮',
+    resume: '丕丿丕賲賴 倬乇丿丕夭卮',
+    automatic: '禺賵丿讴丕乇',
+    custom: '爻賮丕乇卮蹖',
+    previewTip: '倬蹖卮鈥屬嗁呚й屫� 倬丕乇丕诏乇丕賮 倬爻 丕夭 丕鬲賲丕賲 噩丕爻丕夭蹖 丿乇 丿爻鬲乇爻 禺賵丕賴丿 亘賵丿',
+    parentMaxTokens: '賲丕丿乇',
+    pause: '賲讴孬',
+    childMaxTokens: '讴賵丿讴',
+    hierarchical: '倬丿乇 賵 賲丕丿乇 賵 賮乇夭賳丿',
+  },
+  segment: {
+    paragraphs: '倬丕乇丕诏乇丕賮鈥屬囏�',
+    keywords: '讴賱蹖丿賵丕跇賴鈥屬囏�',
+    addKeyWord: '丕囟丕賮賴 讴乇丿賳 讴賱蹖丿賵丕跇賴',
+    keywordError: '丨丿丕讴孬乇 胤賵賱 讴賱蹖丿賵丕跇賴 鄄郯 讴丕乇丕讴鬲乇 丕爻鬲',
+    characters: '讴丕乇丕讴鬲乇賴丕',
+    hitCount: '鬲毓丿丕丿 亘丕夭蹖丕亘蹖',
+    vectorHash: '賴卮 亘乇丿丕乇蹖: ',
+    questionPlaceholder: '爻丐丕賱 乇丕 丕蹖賳噩丕 丕囟丕賮賴 讴賳蹖丿',
+    questionEmpty: '爻丐丕賱 賳賲蹖鈥屫堌з嗀� 禺丕賱蹖 亘丕卮丿',
+    answerPlaceholder: '倬丕爻禺 乇丕 丕蹖賳噩丕 丕囟丕賮賴 讴賳蹖丿',
+    answerEmpty: '倬丕爻禺 賳賲蹖鈥屫堌з嗀� 禺丕賱蹖 亘丕卮丿',
+    contentPlaceholder: '賲丨鬲賵丕 乇丕 丕蹖賳噩丕 丕囟丕賮賴 讴賳蹖丿',
+    contentEmpty: '賲丨鬲賵丕 賳賲蹖鈥屫堌з嗀� 禺丕賱蹖 亘丕卮丿',
+    newTextSegment: '賯胤毓賴 賲鬲賳 噩丿蹖丿',
+    newQaSegment: '賯胤毓賴 倬乇爻卮 賵 倬丕爻禺 噩丿蹖丿',
+    delete: '丨匕賮 丕蹖賳 賯胤毓賴責',
+    chunks_other: '鬲讴賴',
+    characters_one: '卮禺氐蹖鬲',
+    editedAt: '賵蹖乇丕蹖卮 卮丿賴 丿乇',
+    parentChunks_other: '鬲讴賴 賴丕蹖 賵丕賱丿蹖賳',
+    editChunk: '賵蹖乇丕蹖卮 鬲讴賴',
+    collapseChunks: '噩賲毓 讴乇丿賳 鬲讴賴 賴丕',
+    clearFilter: '賮蹖賱鬲乇 乇丕 倬丕讴 讴賳蹖丿',
+    characters_other: '讴丕乇丕讴鬲乇',
+    chunkDetail: '噩夭卅蹖丕鬲 鬲讴賴',
+    searchResults_other: '賳鬲蹖噩賴',
+    addAnother: '丕囟丕賮賴 讴乇丿賳 丿蹖诏乇蹖',
+    parentChunks_one: '鬲讴賴 賵丕賱丿蹖賳',
+    childChunk: '鬲讴賴 讴賵丿讴',
+    regenerationSuccessTitle: '亘丕夭爻丕夭蹖 亘賴 倬丕蹖丕賳 乇爻蹖丿',
+    chunk: '鬲讴賴',
+    addChildChunk: '丕賮夭賵丿賳 鬲讴賴 賮乇夭賳丿',
+    chunkAdded: '1 鬲讴賴 丕囟丕賮賴 卮丿',
+    childChunks_one: '鬲讴賴 讴賵丿讴',
+    edited: '賵蹖乇丕蹖卮',
+    editParentChunk: '賵蹖乇丕蹖卮 鬲讴賴 賵丕賱丿',
+    regeneratingTitle: '亘丕夭爻丕夭蹖 鬲讴賴 賴丕蹖 賮乇夭賳丿',
+    expandChunks: '鬲讴賴 賴丕 乇丕 诏爻鬲乇卮 丿賴蹖丿',
+    childChunks_other: '鬲讴賴 賴丕蹖 讴賵丿讴',
+    newChildChunk: '鬲讴賴 讴賵丿讴 噩丿蹖丿',
+    editChildChunk: '賵蹖乇丕蹖卮 Child Chunk',
+    parentChunk: '鬲讴賴 賵丕賱丿蹖賳',
+    chunks_one: '鬲讴賴',
+    empty: '賴蹖趩 鬲讴賴 丕蹖 蹖丕賮鬲 賳卮丿',
+    addChunk: '丕賮夭賵丿賳 鬲讴賴',
+    searchResults_one: '賳鬲蹖噩賴',
+    regenerationConfirmMessage: '亘丕夭丌賮乇蹖賳蹖 鬲讴賴 賴丕蹖 賮乇夭賳丿 鬲讴賴 賴丕蹖 賮乇夭賳丿 賮毓賱蹖貙 丕夭 噩賲賱賴 鬲讴賴 賴丕蹖 賵蹖乇丕蹖卮 卮丿賴 賵 鬲讴賴 賴丕蹖 鬲丕夭賴 丕囟丕賮賴 卮丿賴 乇丕 亘丕夭賳賵蹖爻蹖 賲蹖 讴賳丿. 亘丕夭爻丕夭蹖 乇丕 賳賲蹖 鬲賵丕賳 禺賳孬蹖 讴乇丿.',
+    childChunkAdded: '1 鬲讴賴 讴賵丿讴 丕囟丕賮賴 卮丿',
+    searchResults_zero: '賳鬲蹖噩賴',
+    newChunk: '鬲讴賴 噩丿蹖丿',
+    regeneratingMessage: '丕蹖賳 賲賲讴賳 丕爻鬲 蹖讴 賱丨馗賴 胤賵賱 亘讴卮丿貙 賱胤賮丕 氐亘乇 讴賳蹖丿...',
+    regenerationConfirmTitle: '丌蹖丕 賲蹖 禺賵丕賴蹖丿 鬲讴賴 賴丕蹖 讴賵丿讴 乇丕 亘丕夭爻丕夭蹖 讴賳蹖丿責',
+    regenerationSuccessMessage: '賲蹖 鬲賵丕賳蹖丿 丕蹖賳 倬賳噩乇賴 乇丕 亘亘賳丿蹖丿.',
+  },
+}
+
+export default translation
diff --git a/i18n/fa-IR/dataset-hit-testing.ts b/i18n/fa-IR/dataset-hit-testing.ts
new file mode 100644
index 0000000..99ce31b
--- /dev/null
+++ b/i18n/fa-IR/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: '丌夭賲賵賳 亘丕夭蹖丕亘蹖',
+  desc: '丌夭賲賵賳 丕孬乇诏匕丕乇蹖 丿丕賳卮 亘乇 丕爻丕爻 賲鬲賳 倬乇爻卮 丿丕丿賴 卮丿賴.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  recents: '丕禺蹖乇賴丕',
+  table: {
+    header: {
+      source: '賲賳亘毓',
+      text: '賲鬲賳',
+      time: '夭賲丕賳',
+    },
+  },
+  input: {
+    title: '賲鬲賳 賲賳亘毓',
+    placeholder: '賱胤賮丕賸 蹖讴 賲鬲賳 賵丕乇丿 讴賳蹖丿貙 蹖讴 噩賲賱賴 讴賵鬲丕賴 禺亘乇蹖 鬲賵氐蹖賴 賲蹖鈥屫促堌�.',
+    countWarning: '鬲丕 鄄郯郯 讴丕乇丕讴鬲乇.',
+    indexWarning: '賮賯胤 丿丕賳卮 亘丕 讴蹖賮蹖鬲 亘丕賱丕.',
+    testing: '丿乇 丨丕賱 丌夭賲賵賳',
+  },
+  hit: {
+    title: '倬丕乇丕诏乇丕賮鈥屬囏й� 亘丕夭蹖丕亘蹖',
+    emptyTip: '賳鬲丕蹖噩 丌夭賲賵賳 亘丕夭蹖丕亘蹖 丕蹖賳噩丕 賳賲丕蹖卮 丿丕丿賴 賲蹖鈥屫促堎嗀�',
+  },
+  noRecentTip: '丕蹖賳噩丕 賳鬲蹖噩賴 倬乇爻卮 丕禺蹖乇 賵噩賵丿 賳丿丕乇丿',
+  viewChart: '賲卮丕賴丿賴 賳賲賵丿丕乇 亘購乇丿丕乇蹖',
+  settingTitle: '鬲賳馗蹖賲丕鬲 亘丕夭蹖丕亘蹖',
+  viewDetail: '賳賲丕蹖卮 噩夭卅蹖丕鬲',
+  records: '爻賵丕亘賯',
+  keyword: '讴賱賷丿賵丕跇賴',
+  hitChunks: '{{num}} 乇丕 亘夭賳蹖丿 鬲讴賴 賴丕蹖 賮乇夭賳丿',
+  chunkDetail: '噩夭卅蹖丕鬲 鬲讴賴',
+  open: '亘丕夭',
+}
+
+export default translation
diff --git a/i18n/fa-IR/dataset-settings.ts b/i18n/fa-IR/dataset-settings.ts
new file mode 100644
index 0000000..457b784
--- /dev/null
+++ b/i18n/fa-IR/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: '鬲賳馗蹖賲丕鬲 丿丕賳卮',
+  desc: '丕蹖賳噩丕 賲蹖鈥屫堌з嗃屫� 賵蹖跇诏蹖鈥屬囏� 賵 乇賵卮鈥屬囏й� 讴丕乇蹖 丿丕賳卮 乇丕 鬲睾蹖蹖乇 丿賴蹖丿.',
+  form: {
+    name: '賳丕賲 丿丕賳卮',
+    namePlaceholder: '賱胤賮丕賸 賳丕賲 丿丕賳卮 乇丕 賵丕乇丿 讴賳蹖丿',
+    nameError: '賳丕賲 賳賲蹖鈥屫堌з嗀� 禺丕賱蹖 亘丕卮丿',
+    desc: '鬲賵囟蹖丨丕鬲 丿丕賳卮',
+    descInfo: '賱胤賮丕賸 蹖讴 鬲賵囟蹖丨 賲鬲賳蹖 賵丕囟丨 亘賳賵蹖爻蹖丿 鬲丕 賲丨鬲賵丕蹖 丿丕賳卮 乇丕 賲卮禺氐 讴賳丿. 丕蹖賳 鬲賵囟蹖丨丕鬲 亘賴 毓賳賵丕賳 賲亘賳丕蹖蹖 亘乇丕蹖 鬲胤亘蹖賯 賴賳诏丕賲 丕賳鬲禺丕亘 丕夭 趩賳丿蹖賳 丿丕賳卮 亘乇丕蹖 丕爻鬲賳鬲丕噩 丕爻鬲賮丕丿賴 禺賵丕賴丿 卮丿.',
+    descPlaceholder: '鬲賵囟蹖丨 丿賴蹖丿 讴賴 丿乇 丕蹖賳 丿丕賳卮 趩賴 趩蹖夭蹖 賵噩賵丿 丿丕乇丿. 鬲賵囟蹖丨丕鬲 丿賯蹖賯 亘賴 賴賵卮 賲氐賳賵毓蹖 丕噩丕夭賴 賲蹖鈥屫囏� 鬲丕 亘賴 賲賵賯毓 亘賴 賲丨鬲賵丕蹖 丿丕賳卮 丿爻鬲乇爻蹖 倬蹖丿丕 讴賳丿. 丕诏乇 禺丕賱蹖 亘丕卮丿貙 丿蹖賮蹖 丕夭 丕爻鬲乇丕鬲跇蹖 倬蹖卮鈥屬佖必� 丕爻鬲賮丕丿賴 禺賵丕賴丿 讴乇丿.',
+    descWrite: '蹖丕丿 亘诏蹖乇蹖丿 趩诏賵賳賴 蹖讴 鬲賵囟蹖丨 丿丕賳卮 禺賵亘 亘賳賵蹖爻蹖丿.',
+    permissions: '賲噩賵夭賴丕',
+    permissionsOnlyMe: '賮賯胤 賲賳',
+    permissionsAllMember: '鬲賲丕賲 丕毓囟丕蹖 鬲蹖賲',
+    permissionsInvitedMembers: '亘乇禺蹖 丕夭 丕毓囟丕蹖 鬲蹖賲',
+    me: '(卮賲丕)',
+    indexMethod: '乇賵卮 賳賲丕蹖賴鈥屫池ж槽�',
+    indexMethodHighQuality: '讴蹖賮蹖鬲 亘丕賱丕',
+    indexMethodHighQualityTip: '賲丿賱 鬲毓亘蹖賴 乇丕 亘乇丕蹖 倬乇丿丕夭卮 賮乇丕禺賵丕賳蹖 讴賳蹖丿 鬲丕 丿賯鬲 亘丕賱丕鬲乇蹖 賴賳诏丕賲 噩爻鬲噩賵蹖 讴丕乇亘乇丕賳 賮乇丕賴賲 卮賵丿.',
+    indexMethodEconomy: '丕賯鬲氐丕丿蹖',
+    indexMethodEconomyTip: '丕爻鬲賮丕丿賴 丕夭 賲賵鬲賵乇賴丕蹖 亘乇丿丕乇蹖 丌賮賱丕蹖賳貙 卮丕禺氐鈥屬囏й� 讴賱賲丕鬲 讴賱蹖丿蹖 賵 睾蹖乇賴 亘乇丕蹖 讴丕賴卮 丿賯鬲 亘丿賵賳 氐乇賮 鬲賵讴賳鈥屬囏�',
+    embeddingModel: '賲丿賱 鬲毓亘蹖賴',
+    embeddingModelTip: '亘乇丕蹖 鬲睾蹖蹖乇 賲丿賱 鬲毓亘蹖賴貙 賱胤賮丕賸 亘賴 ',
+    embeddingModelTipLink: '鬲賳馗蹖賲丕鬲',
+    retrievalSetting: {
+      title: '鬲賳馗蹖賲丕鬲 亘丕夭蹖丕亘蹖',
+      learnMore: '亘蹖卮鬲乇 亘丿丕賳蹖丿',
+      description: ' 丿乇亘丕乇賴 乇賵卮 亘丕夭蹖丕亘蹖.',
+      longDescription: ' 丿乇亘丕乇賴 乇賵卮 亘丕夭蹖丕亘蹖貙 賲蹖鈥屫堌з嗃屫� 丿乇 賴乇 夭賲丕賳蹖 丿乇 鬲賳馗蹖賲丕鬲 丿丕賳卮 丕蹖賳 乇丕 鬲睾蹖蹖乇 丿賴蹖丿.',
+      method: '乇賵卮 亘丕夭蹖丕亘蹖',
+    },
+    save: '匕禺蹖乇賴',
+    externalKnowledgeAPI: 'API 丿丕賳卮 禺丕乇噩蹖',
+    retrievalSettings: '鬲賳馗蹖賲丕鬲 亘丕夭蹖丕亘蹖',
+    externalKnowledgeID: '卮賳丕爻賴 丿丕賳卮 禺丕乇噩蹖',
+    indexMethodChangeToEconomyDisabledTip: '亘乇丕蹖 鬲賳夭賱 乇鬲亘賴 丕夭 HQ 亘賴 ECO 丿乇 丿爻鬲乇爻 賳蹖爻鬲',
+    helpText: '蹖丕丿 亘诏蹖乇蹖丿 讴賴 趩诏賵賳賴 蹖讴 鬲賵囟蹖丨丕鬲 賲噩賲賵毓賴 丿丕丿賴 禺賵亘 亘賳賵蹖爻蹖丿.',
+    upgradeHighQualityTip: '倬爻 丕夭 丕乇鬲賯丕亍 亘賴 丨丕賱鬲 讴蹖賮蹖鬲 亘丕賱丕貙 亘丕夭诏卮鬲 亘賴 丨丕賱鬲 丕賯鬲氐丕丿蹖 丿乇 丿爻鬲乇爻 賳蹖爻鬲',
+    searchModel: '噩爻鬲噩賵蹖 賲丿賱',
+  },
+}
+
+export default translation
diff --git a/i18n/fa-IR/dataset.ts b/i18n/fa-IR/dataset.ts
new file mode 100644
index 0000000..8ab2fb9
--- /dev/null
+++ b/i18n/fa-IR/dataset.ts
@@ -0,0 +1,221 @@
+const translation = {
+  knowledge: '丿丕賳卮',
+  documentCount: ' 爻賳丿',
+  wordCount: ' 賴夭丕乇 讴賱賲賴',
+  appCount: ' 亘乇賳丕賲賴鈥屬囏й� 賲鬲氐賱',
+  createDataset: '丕蹖噩丕丿 丿丕賳卮',
+  createDatasetIntro: '丿丕丿賴鈥屬囏й� 賲鬲賳蹖 禺賵丿 乇丕 賵丕乇丿 讴賳蹖丿 蹖丕 丕夭 胤乇蹖賯 Webhook 丿乇 夭賲丕賳 賵丕賯毓蹖 亘乇丕蹖 亘賴亘賵丿 夭賲蹖賳賴 LLM 亘賳賵蹖爻蹖丿.',
+  deleteDatasetConfirmTitle: '丨匕賮 丕蹖賳 丿丕賳卮責',
+  deleteDatasetConfirmContent:
+    '丨匕賮 丿丕賳卮 睾蹖乇 賯丕亘賱 亘乇诏卮鬲 丕爻鬲. 讴丕乇亘乇丕賳 丿蹖诏乇 賳賲蹖鈥屫堌з嗁嗀� 亘賴 丿丕賳卮 卮賲丕 丿爻鬲乇爻蹖 倬蹖丿丕 讴賳賳丿 賵 鬲賲丕賲 鬲賳馗蹖賲丕鬲 丿乇禺賵丕爻鬲 賵 诏夭丕乇卮鈥屬囏� 亘賴 胤賵乇 丿丕卅賲 丨匕賮 禺賵丕賴賳丿 卮丿.',
+  datasetUsedByApp: '丿丕賳卮 鬲賵爻胤 亘乇禺蹖 亘乇賳丕賲賴鈥屬囏� 丕爻鬲賮丕丿賴 賲蹖鈥屫促堌�. 亘乇賳丕賲賴鈥屬囏� 丿蹖诏乇 賳賲蹖鈥屫堌з嗁嗀� 丕夭 丕蹖賳 丿丕賳卮 丕爻鬲賮丕丿賴 讴賳賳丿 賵 鬲賲丕賲 鬲賳馗蹖賲丕鬲 丿乇禺賵丕爻鬲 賵 诏夭丕乇卮鈥屬囏� 亘賴 胤賵乇 丿丕卅賲 丨匕賮 禺賵丕賴賳丿 卮丿.',
+  datasetDeleted: '丿丕賳卮 丨匕賮 卮丿',
+  datasetDeleteFailed: '丨匕賮 丿丕賳卮 賳丕賲賵賮賯 亘賵丿',
+  didYouKnow: '丌蹖丕 賲蹖鈥屫з嗀池屫�',
+  intro1: '丿丕賳卮 賲蹖鈥屫堌з嗀� 丿乇 亘乇賳丕賲賴 Dify ',
+  intro2: '亘賴 毓賳賵丕賳 蹖讴 夭賲蹖賳賴',
+  intro3: '丕丿睾丕賲 卮賵丿',
+  intro4: '蹖丕 賲蹖鈥屫堌з嗀� ',
+  intro5: '亘賴 毓賳賵丕賳 蹖讴 丕賮夭賵賳賴 賲爻鬲賯賱 ChatGPT 亘乇丕蹖 丕賳鬲卮丕乇',
+  intro6: '丕蹖噩丕丿 卮賵丿',
+  unavailable: '丿乇 丿爻鬲乇爻 賳蹖爻鬲',
+  unavailableTip: '賲丿賱 噩丕爻丕夭蹖 丿乇 丿爻鬲乇爻 賳蹖爻鬲貙 賳蹖丕夭 丕爻鬲 賲丿賱 噩丕爻丕夭蹖 倬蹖卮鈥屬佖必� 倬蹖讴乇亘賳丿蹖 卮賵丿',
+  datasets: '丿丕賳卮',
+  datasetsApi: '丿爻鬲乇爻蹖 API',
+  retrieval: {
+    semantic_search: {
+      title: '噩爻鬲噩賵蹖 亘乇丿丕乇蹖',
+      description: '鬲賵賱蹖丿 噩丕爻丕夭蹖鈥屬囏й� 噩爻鬲噩賵 賵 噩爻鬲噩賵蹖 亘禺卮 賲鬲賳蹖 讴賴 亘蹖卮鬲乇蹖賳 卮亘丕賴鬲 乇丕 亘賴 賳賲丕蹖卮 亘乇丿丕乇蹖 丌賳 丿丕乇丿.',
+    },
+    full_text_search: {
+      title: '噩爻鬲噩賵蹖 賲鬲賳 讴丕賲賱',
+      description: '賮賴乇爻鬲 讴乇丿賳 鬲賲丕賲 丕氐胤賱丕丨丕鬲 丿乇 爻賳丿貙 亘賴 讴丕乇亘乇丕賳 丕噩丕夭賴 賲蹖鈥屫囏� 賴乇 丕氐胤賱丕丨蹖 乇丕 噩爻鬲噩賵 讴賳賳丿 賵 亘禺卮 賲鬲賳蹖 賲乇亘賵胤 亘賴 丌賳 丕氐胤賱丕丨丕鬲 乇丕 亘丕夭蹖丕亘蹖 讴賳賳丿.',
+    },
+    hybrid_search: {
+      title: '噩爻鬲噩賵蹖 賴蹖亘乇蹖丿蹖',
+      description: '噩爻鬲噩賵蹖 賲鬲賳 讴丕賲賱 賵 亘乇丿丕乇蹖 乇丕 賴賲夭賲丕賳 丕噩乇丕 賲蹖鈥屭┵嗀� 丿賵亘丕乇賴 乇鬲亘賴鈥屫ㄙ嗀� 賲蹖鈥屭┵嗀� 鬲丕 亘賴鬲乇蹖賳 鬲胤丕亘賯 亘乇丕蹖 丿乇禺賵丕爻鬲 讴丕乇亘乇 丕賳鬲禺丕亘 卮賵丿. 讴丕乇亘乇丕賳 賲蹖鈥屫堌з嗁嗀� 賵夭賳鈥屬囏� 乇丕 鬲賳馗蹖賲 讴賳賳丿 蹖丕 亘賴 蹖讴 賲丿賱 丿賵亘丕乇賴 乇鬲亘賴鈥屫ㄙ嗀� 鬲賳馗蹖賲 讴賳賳丿.',
+      recommend: '鬲賵氐蹖賴',
+    },
+    invertedIndex: {
+      title: '賮賴乇爻鬲 賲毓讴賵爻',
+      description: '賮賴乇爻鬲 賲毓讴賵爻 蹖讴 爻丕禺鬲丕乇 亘乇丕蹖 亘丕夭蹖丕亘蹖 讴丕乇丌賲丿 丕爻鬲. 鬲賵爻胤 丕氐胤賱丕丨丕鬲 爻丕夭賲丕賳丿賴蹖 卮丿賴貙 賴乇 丕氐胤賱丕丨 亘賴 丕爻賳丕丿 蹖丕 氐賮丨丕鬲 賵亘 丨丕賵蹖 丌賳 丕卮丕乇賴 賲蹖鈥屭┵嗀�.',
+    },
+    change: '鬲睾蹖蹖乇',
+    changeRetrievalMethod: '鬲睾蹖蹖乇 乇賵卮 亘丕夭蹖丕亘蹖',
+  },
+  docsFailedNotice: '丕爻賳丕丿 賳鬲賵丕賳爻鬲賳丿 賮賴乇爻鬲鈥屫ㄙ嗀� 卮賵賳丿',
+  retry: '鬲賱丕卮 賲噩丿丿',
+  indexingTechnique: {
+    high_quality: 'HQ',
+    economy: 'ECO',
+  },
+  indexingMethod: {
+    semantic_search: '亘乇丿丕乇蹖',
+    full_text_search: '賲鬲賳 讴丕賲賱',
+    hybrid_search: '賴蹖亘乇蹖丿蹖',
+    invertedIndex: '賲毓讴賵爻',
+  },
+  mixtureHighQualityAndEconomicTip: '賲丿賱 丿賵亘丕乇賴 乇鬲亘賴鈥屫ㄙ嗀� 亘乇丕蹖 鬲乇讴蹖亘 倬丕蹖诏丕賴鈥屬囏й� 丿丕賳卮 亘丕 讴蹖賮蹖鬲 亘丕賱丕 賵 丕賯鬲氐丕丿蹖 賱丕夭賲 丕爻鬲.',
+  inconsistentEmbeddingModelTip: '賲丿賱 丿賵亘丕乇賴 乇鬲亘賴鈥屫ㄙ嗀� 賱丕夭賲 丕爻鬲 丕诏乇 賲丿賱鈥屬囏й� 噩丕爻丕夭蹖 倬丕蹖诏丕賴鈥屬囏й� 丿丕賳卮 丕賳鬲禺丕亘蹖 賳丕爻丕夭诏丕乇 亘丕卮賳丿.',
+  retrievalSettings: '鬲賳馗蹖賲丕鬲 亘丕夭蹖丕亘蹖',
+  rerankSettings: '鬲賳馗蹖賲丕鬲 丿賵亘丕乇賴 乇鬲亘賴鈥屫ㄙ嗀�',
+  weightedScore: {
+    title: '丕賲鬲蹖丕夭 賵夭賳蹖',
+    description: '亘丕 鬲賳馗蹖賲 賵夭賳鈥屬囏й� 丕禺鬲氐丕氐 丿丕丿賴 卮丿賴貙 丕蹖賳 丕爻鬲乇丕鬲跇蹖 丿賵亘丕乇賴 乇鬲亘賴鈥屫ㄙ嗀� 鬲毓蹖蹖賳 賲蹖鈥屭┵嗀� 讴賴 丌蹖丕 丕賵賱賵蹖鬲 亘丕 鬲胤丕亘賯 賲毓賳丕蹖蹖 蹖丕 讴賱賲丕鬲 讴賱蹖丿蹖 丕爻鬲.',
+    semanticFirst: '丕賵賱賵蹖鬲 賲毓賳丕蹖蹖',
+    keywordFirst: '丕賵賱賵蹖鬲 讴賱賲賴 讴賱蹖丿蹖',
+    customized: '爻賮丕乇卮蹖鈥屫池ж槽� 卮丿賴',
+    semantic: '賲毓賳丕蹖蹖',
+    keyword: '讴賱賲賴 讴賱蹖丿蹖',
+  },
+  nTo1RetrievalLegacy: '亘丕夭蹖丕亘蹖 N-to-1 丕夭 爻倬鬲丕賲亘乇 亘賴 胤賵乇 乇爻賲蹖 賲賳爻賵禺 禺賵丕賴丿 卮丿. 鬲賵氐蹖賴 賲蹖鈥屫促堌� 丕夭 亘丕夭蹖丕亘蹖 趩賳丿 賲爻蹖乇 噩丿蹖丿 丕爻鬲賮丕丿賴 讴賳蹖丿 鬲丕 賳鬲丕蹖噩 亘賴鬲乇蹖 亘丿爻鬲 丌賵乇蹖丿.',
+  nTo1RetrievalLegacyLink: '亘蹖卮鬲乇 亘丿丕賳蹖丿',
+  nTo1RetrievalLegacyLinkText: ' 亘丕夭蹖丕亘蹖 N-to-1 丕夭 爻倬鬲丕賲亘乇 亘賴 胤賵乇 乇爻賲蹖 賲賳爻賵禺 禺賵丕賴丿 卮丿.',
+  defaultRetrievalTip: '亘丕夭蹖丕亘蹖 趩賳丿 賲爻蹖乇賴 亘賴 胤賵乇 倬蹖卮 賮乇囟 丕爻鬲賮丕丿賴 賲蹖 卮賵丿. 丿丕賳卮 丕夭 趩賳丿蹖賳 倬丕蹖诏丕賴 丿丕賳卮 亘丕夭蹖丕亘蹖 賲蹖 卮賵丿 賵 爻倬爻 丿賵亘丕乇賴 乇鬲亘賴 亘賳丿蹖 賲蹖 卮賵丿.',
+  editExternalAPIConfirmWarningContent: {
+    front: '丕蹖賳 API 丿丕賳卮 禺丕乇噩蹖 亘賴',
+    end: '丿丕賳卮 禺丕乇噩蹖 貙 賵 丕蹖賳 丕氐賱丕丨 亘乇丕蹖 賴賲賴 丌賳賴丕 丕毓賲丕賱 禺賵丕賴丿 卮丿. 丌蹖丕 賲胤賲卅賳 賴爻鬲蹖丿 讴賴 賲蹖 禺賵丕賴蹖丿 丕蹖賳 鬲睾蹖蹖乇 乇丕 匕禺蹖乇賴 讴賳蹖丿責',
+  },
+  editExternalAPIFormWarning: {
+    front: '丕蹖賳 API 禺丕乇噩蹖 亘賴',
+    end: '丿丕賳卮 亘蹖乇賵賳蹖',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: '丨匕賮',
+      end: '?',
+    },
+    content: {
+      front: '丕蹖賳 API 丿丕賳卮 禺丕乇噩蹖 亘賴',
+      end: '丿丕賳卮 亘蹖乇賵賳蹖. 丨匕賮 丕蹖賳 API 賴賲賴 丌賳賴丕 乇丕 亘丕胤賱 賲蹖 讴賳丿. 丌蹖丕 賲胤賲卅賳 賴爻鬲蹖丿 讴賴 賲蹖 禺賵丕賴蹖丿 丕蹖賳 API 乇丕 丨匕賮 讴賳蹖丿責',
+    },
+    noConnectionContent: '丌蹖丕 賲胤賲卅賳 賴爻鬲蹖丿 讴賴 丕蹖賳 API 乇丕 丨匕賮 禺賵丕賴蹖丿 讴乇丿責',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: '蹖讴 API 丿丕賳卮 禺丕乇噩蹖 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+  },
+  connectDatasetIntro: {
+    content: {
+      link: '蹖丕丿诏蹖乇蹖 賳丨賵賴 丕蹖噩丕丿 蹖讴 API 禺丕乇噩蹖',
+      front: '亘乇丕蹖 丕鬲氐丕賱 亘賴 蹖讴 倬丕蹖诏丕賴 丿丕賳卮 禺丕乇噩蹖貙 丕亘鬲丿丕 亘丕蹖丿 蹖讴 API 禺丕乇噩蹖 丕蹖噩丕丿 讴賳蹖丿. 賱胤賮丕 亘丕 丿賯鬲 亘禺賵丕賳蹖丿 賵 亘賴',
+      end: '. 爻倬爻 卮賳丕爻賴 丿丕賳卮 賲乇亘賵胤賴 乇丕 倬蹖丿丕 讴乇丿賴 賵 丌賳 乇丕 丿乇 賮乇賲 爻賲鬲 趩倬 倬乇 讴賳蹖丿. 丕诏乇 鬲賲丕賲 丕胤賱丕毓丕鬲 氐丨蹖丨 亘丕卮丿貙 倬爻 丕夭 讴賱蹖讴 亘乇 乇賵蹖 丿讴賲賴 丕鬲氐丕賱貙 亘賴 胤賵乇 禺賵丿讴丕乇 亘賴 丌夭賲賵賳 亘丕夭蹖丕亘蹖 丿乇 倬丕蹖诏丕賴 丿丕賳卮 賲蹖 乇賵丿.',
+    },
+    learnMore: '亘蹖卮鬲乇 亘丿丕賳蹖丿',
+    title: '趩诏賵賳賴 亘賴 蹖讴 倬丕蹖诏丕賴 丿丕賳卮 禺丕乇噩蹖 賲鬲氐賱 卮賵蹖賲責',
+  },
+  connectHelper: {
+    helper5: '賯亘賱 丕夭 丕爻鬲賮丕丿賴 丕夭 丕蹖賳 賵蹖跇诏蹖 亘丕 丿賯鬲',
+    helper3: '. 丕讴蹖丿丕 鬲賵氐蹖賴 賲蹖 讴賳蹖賲 讴賴',
+    helper2: '賮賯胤 賯丕亘賱蹖鬲 亘丕夭蹖丕亘蹖 倬卮鬲蹖亘丕賳蹖 賲蹖 卮賵丿',
+    helper4: '賲爻鬲賳丿丕鬲 乇丕賴賳賲丕 乇丕 亘禺賵丕賳蹖丿',
+    helper1: '丕夭 胤乇蹖賯 API 賵 卮賳丕爻賴 倬丕蹖诏丕賴 丿丕賳卮 亘賴 倬丕蹖诏丕賴 賴丕蹖 丿丕賳卮 禺丕乇噩蹖 賲鬲氐賱 卮賵蹖丿. 丿乇 丨丕賱 丨丕囟乇貙',
+  },
+  externalKnowledgeForm: {
+    cancel: '賱睾賵',
+    connect: '丕鬲氐丕賱',
+  },
+  externalAPIForm: {
+    encrypted: {
+      front: '鬲賵讴賳 API 卮賲丕 乇賲夭诏匕丕乇蹖 賵 亘丕 丕爻鬲賮丕丿賴 丕夭',
+      end: '賮賳丕賵乇蹖.',
+    },
+    apiKey: '讴賱蹖丿 API',
+    edit: '賵蹖乇丕蹖卮',
+    save: '匕禺蹖乇賴',
+    cancel: '賱睾賵',
+    endpoint: '賳賯胤賴 倬丕蹖丕賳蹖 API',
+    name: '賳丕賲',
+  },
+  editExternalAPITooltipTitle: '丿丕賳卮 賲乇鬲亘胤',
+  externalKnowledgeNamePlaceholder: '賱胤賮丕 賳丕賲 倬丕蹖诏丕賴 丿丕賳卮 乇丕 賵丕乇丿 讴賳蹖丿',
+  externalAPIPanelDocumentation: '蹖丕丿诏蹖乇蹖 賳丨賵賴 丕蹖噩丕丿 蹖讴 API 丿丕賳卮 禺丕乇噩蹖',
+  externalKnowledgeDescriptionPlaceholder: '丌賳趩賴 丿乇 丕蹖賳 倬丕蹖诏丕賴 丿丕賳卮 賵噩賵丿 丿丕乇丿 乇丕 鬲賵囟蹖丨 丿賴蹖丿 (丕禺鬲蹖丕乇蹖)',
+  externalKnowledgeDescription: '鬲賵囟蹖丨丕鬲 丿丕賳卮',
+  externalTag: '禺丕乇噩蹖',
+  externalKnowledgeIdPlaceholder: '賱胤賮丕 卮賳丕爻賴 丿丕賳卮 乇丕 賵丕乇丿 讴賳蹖丿',
+  noExternalKnowledge: '賴賳賵夭 賴蹖趩 API 丿丕賳卮 禺丕乇噩蹖 賵噩賵丿 賳丿丕乇丿貙 亘乇丕蹖 丕蹖噩丕丿 丕蹖賳噩丕 乇丕 讴賱蹖讴 讴賳蹖丿',
+  externalAPIPanelTitle: 'API 丿丕賳卮 禺丕乇噩蹖',
+  connectDataset: '丕鬲氐丕賱 亘賴 蹖讴 倬丕蹖诏丕賴 丿丕賳卮 禺丕乇噩蹖',
+  externalKnowledgeId: '卮賳丕爻賴 丿丕賳卮 禺丕乇噩蹖',
+  externalAPI: 'API 禺丕乇噩蹖',
+  externalKnowledgeName: '賳丕賲 丿丕賳卮 禺丕乇噩蹖',
+  createExternalAPI: '丕賮夭賵丿賳 蹖讴 API 丿丕賳卮 禺丕乇噩蹖',
+  createNewExternalAPI: '丕蹖噩丕丿 蹖讴 API 丿丕賳卮 禺丕乇噩蹖 噩丿蹖丿',
+  learnHowToWriteGoodKnowledgeDescription: '蹖丕丿 亘诏蹖乇蹖丿 讴賴 趩诏賵賳賴 蹖讴 鬲賵囟蹖丨丕鬲 丿丕賳卮 禺賵亘 亘賳賵蹖爻蹖丿.',
+  editExternalAPIFormTitle: '賵蹖乇丕蹖卮 API 丿丕賳卮 禺丕乇噩蹖',
+  externalAPIPanelDescription: 'API 丿丕賳卮 禺丕乇噩蹖 亘乇丕蹖 丕鬲氐丕賱 亘賴 蹖讴 倬丕蹖诏丕賴 丿丕賳卮 禺丕乇噩 丕夭 Dify 賵 亘丕夭蹖丕亘蹖 丿丕賳卮 丕夭 丌賳 倬丕蹖诏丕賴 丿丕賳卮 丕爻鬲賮丕丿賴 賲蹖 卮賵丿.',
+  allExternalTip: '賴賳诏丕賲蹖 讴賴 賮賯胤 丕夭 丿丕賳卮 禺丕乇噩蹖 丕爻鬲賮丕丿賴 賲蹖 讴賳蹖丿貙 讴丕乇亘乇 賲蹖 鬲賵丕賳丿 丕賳鬲禺丕亘 讴賳丿 讴賴 丌蹖丕 賲丿賱 Rerank 乇丕 賮毓丕賱 讴賳丿 蹖丕 禺蹖乇. 丕诏乇 賮毓丕賱 賳亘丕卮丿貙 鬲讴賴 賴丕蹖 亘丕夭蹖丕亘蹖 卮丿賴 亘乇 丕爻丕爻 丕賲鬲蹖丕夭丕鬲 賲乇鬲亘 賲蹖 卮賵賳丿. 賴賳诏丕賲蹖 讴賴 丕爻鬲乇丕鬲跇蹖 賴丕蹖 亘丕夭蹖丕亘蹖 倬丕蹖诏丕賴 賴丕蹖 丿丕賳卮 賲禺鬲賱賮 賲鬲賳丕賯囟 亘丕卮丿貙 賳丕丿乇爻鬲 禺賵丕賴丿 亘賵丿.',
+  mixtureInternalAndExternalTip: '賲丿賱 Rerank 亘乇丕蹖 丌賲蹖禺鬲诏蹖 丿丕賳卮 丿乇賵賳蹖 賵 亘蹖乇賵賳蹖 賲賵乇丿 賳蹖丕夭 丕爻鬲.',
+  chunkingMode: {
+    parentChild: '倬丿乇 賵 賲丕丿乇 賵 賮乇夭賳丿',
+    general: '毓賲賵賲蹖',
+  },
+  parentMode: {
+    fullDoc: '賲爻鬲賳丿 讴丕賲賱',
+    paragraph: '倬丕乇丕诏乇丕賮',
+  },
+  batchAction: {
+    disable: '睾蹖乇 賮毓丕賱 讴乇丿賳',
+    cancel: '賱睾賵',
+    selected: '丕賳鬲禺丕亘',
+    enable: '賮毓丕賱',
+    delete: '丨匕賮',
+    archive: '亘丕蹖诏丕賳蹖',
+  },
+  enable: '賮毓丕賱',
+  documentsDisabled: '{{num}} 丕爻賳丕丿 睾蹖乇賮毓丕賱 - 睾蹖乇賮毓丕賱 亘乇丕蹖 亘蹖卮 丕夭 30 乇賵夭',
+  preprocessDocument: '{{毓丿丿}} 丕爻賳丕丿 倬蹖卮 倬乇丿丕夭卮',
+  localDocs: '丕爻賳丕丿 賲丨賱蹖',
+  allKnowledge: '賴賲賴 丿丕賳卮 賴丕',
+  allKnowledgeDescription: '亘乇丕蹖 賳賲丕蹖卮 鬲賲丕賲 丿丕賳卮 丿乇 丕蹖賳 賮囟丕蹖 讴丕乇蹖 丕賳鬲禺丕亘 讴賳蹖丿. 賮賯胤 賲丕賱讴 賮囟丕蹖 讴丕乇蹖 賲蹖 鬲賵丕賳丿 鬲賲丕賲 丿丕賳卮 乇丕 賲丿蹖乇蹖鬲 讴賳丿.',
+  metadata: {
+    createMetadata: {
+      name: '賳丕賲',
+      title: '賲鬲丕丿蹖鬲丕蹖 噩丿蹖丿',
+      namePlaceholder: '丕賮夭賵丿賳 賳丕賲 賲鬲丕丿丕丿賴',
+      back: '毓賯亘',
+      type: '賳賵毓',
+    },
+    checkName: {
+      invalid: '賳丕賲 賲鬲丕丿丕丿賴 賮賯胤 賲蹖鈥屫堌з嗀� 卮丕賲賱 丨乇賵賮 讴賵趩讴貙 丕毓丿丕丿 賵 夭蹖乇禺胤鈥屬囏� 亘丕卮丿 賵 亘丕蹖丿 亘丕 蹖讴 丨乇賮 讴賵趩讴 丌睾丕夭 卮賵丿.',
+      empty: '賳丕賲 賮乇丕丿丕丿賴 賳賲蹖鈥屫堌з嗀� 禺丕賱蹖 亘丕卮丿',
+    },
+    batchEditMetadata: {
+      multipleValue: '趩賳丿蹖賳 丕乇夭卮',
+      editDocumentsNum: '賵蹖乇丕蹖卮 {{num}} 爻賳丿',
+      applyToAllSelectDocumentTip: '亘賴鈥屫焚堌� 禺賵丿讴丕乇 鬲賲丕賲 賲鬲丕丿丕丿賴鈥屬囏й� 賵蹖乇丕蹖卮 卮丿賴 賵 噩丿蹖丿 賮賵賯 乇丕 亘乇丕蹖 鬲賲丕賲 丕爻賳丕丿 丕賳鬲禺丕亘 卮丿賴 丕蹖噩丕丿 讴賳蹖丿貙 丿乇 睾蹖乇 丕蹖賳 氐賵乇鬲 賵蹖乇丕蹖卮 賲鬲丕丿丕丿賴 賮賯胤 亘賴 丕爻賳丕丿蹖 讴賴 丿丕乇丕蹖 丌賳 賴爻鬲賳丿 丕毓賲丕賱 禺賵丕賴丿 卮丿.',
+      applyToAllSelectDocument: '亘賴 鬲賲丕賲 丕爻賳丕丿 丕賳鬲禺丕亘 卮丿賴 丕毓賲丕賱 讴賳蹖丿',
+      editMetadata: '賵蹖乇丕蹖卮 賲鬲丕 丿丕丿賴 賴丕',
+    },
+    selectMetadata: {
+      search: '噩爻鬲噩賵蹖 賲鬲丕 丿丕丿賴',
+      newAction: '賲鬲丕丿蹖鬲丕蹖 噩丿蹖丿',
+      manageAction: '賲丿蹖乇蹖鬲',
+    },
+    datasetMetadata: {
+      deleteContent: '丌蹖丕 丕夭 丨匕賮 賲鬲丕丿丕丿賴 "{{name}}" 丕胤賲蹖賳丕賳 丿丕乇蹖丿責',
+      builtIn: '爻丕禺鬲賴 卮丿賴 丿乇賵賳鈥屫池ж槽�',
+      description: '卮賲丕 賲蹖鈥屫堌з嗃屫� 鬲賲丕賲 賮乇丕丿丕丿賴鈥屬囏� 乇丕 丿乇 丕蹖賳 丿丕賳卮 賲丿蹖乇蹖鬲 讴賳蹖丿. 鬲睾蹖蹖乇丕鬲 亘賴 賴乇 爻賳丿蹖 賴賲夭賲丕賳 賲蹖鈥屫促堎嗀�.',
+      deleteTitle: '亘乇丕蹖 丨匕賮 鬲兀蹖蹖丿 讴賳蹖丿',
+      disabled: '賲鬲毓丕丿賱',
+      values: '{{num}} 賲賯丿丕乇',
+      namePlaceholder: '賳丕賲 賲鬲丕丿蹖鬲丕',
+      addMetaData: '賲鬲丕丿蹖鬲丕 丕囟丕賮賴 讴賳蹖丿',
+      builtInDescription: '賲鬲丕丿丕丿賴鈥屬囏й� 丿丕禺賱蹖 亘賴鈥屫焚堌� 禺賵丿讴丕乇 丕爻鬲禺乇丕噩 賵 鬲賵賱蹖丿 賲蹖鈥屫促堎嗀�. 賯亘賱 丕夭 丕爻鬲賮丕丿賴 亘丕蹖丿 賮毓丕賱 卮賵丿 賵 賯丕亘賱 賵蹖乇丕蹖卮 賳蹖爻鬲.',
+      name: '賳丕賲',
+      rename: '鬲睾蹖蹖乇 賳丕賲',
+    },
+    documentMetadata: {
+      technicalParameters: '倬丕乇丕賲鬲乇賴丕蹖 賮賳蹖',
+      documentInformation: '丕胤賱丕毓丕鬲 爻賳丿',
+      startLabeling: '卮乇賵毓 亘乇趩爻亘鈥屭柏ж臂�',
+      metadataToolTip: '賲鬲丕丿蹖鬲丕 亘賴 毓賳賵丕賳 蹖讴 賮蹖賱鬲乇 丨蹖丕鬲蹖 毓賲賱 賲蹖鈥屭┵嗀� 讴賴 丿賯鬲 賵 丕乇鬲亘丕胤 丕胤賱丕毓丕鬲 亘丕夭蹖丕亘蹖 乇丕 亘賴亘賵丿 賲蹖鈥屫ㄘ簇�. 卮賲丕 賲蹖鈥屫堌з嗃屫� 賲鬲丕丿蹖鬲丕 乇丕 亘乇丕蹖 丕蹖賳 爻賳丿 丿乇 丕蹖賳噩丕 賵蹖乇丕蹖卮 賵 丕囟丕賮賴 讴賳蹖丿.',
+    },
+    addMetadata: '賲鬲丕丿蹖鬲丕 丕囟丕賮賴 讴賳蹖丿',
+    chooseTime: '夭賲丕賳蹖 乇丕 丕賳鬲禺丕亘 讴賳蹖丿...',
+    metadata: '賲鬲丕丿蹖鬲丕',
+  },
+  embeddingModelNotAvailable: '賲丿賱 噩丕爻丕夭蹖 丿乇 丿爻鬲乇爻 賳蹖爻鬲.',
+}
+
+export default translation
diff --git a/i18n/fa-IR/education.ts b/i18n/fa-IR/education.ts
new file mode 100644
index 0000000..331c3a6
--- /dev/null
+++ b/i18n/fa-IR/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    coupon: '讴賵倬賳 丕賳丨氐丕乇蹖 郾郯郯侏',
+    end: '亘乇丕蹖 胤乇丨 丨乇賮賴鈥屫й� 丿蹖賮蹖.',
+    front: '卮賲丕 丕讴賳賵賳 亘乇丕蹖 賵囟毓蹖鬲 鬲兀蹖蹖丿 卮丿賴 丌賲賵夭卮蹖 賵丕噩丿 卮乇丕蹖胤 賴爻鬲蹖丿. 賱胤賮丕賸 丕胤賱丕毓丕鬲 鬲丨氐蹖賱蹖 禺賵丿 乇丕 丿乇 夭蹖乇 賵丕乇丿 讴賳蹖丿 鬲丕 賮乇丌蹖賳丿 乇丕 讴丕賲賱 讴乇丿賴 賵 蹖讴 丿乇蹖丕賮鬲 讴賳蹖丿.',
+  },
+  form: {
+    schoolName: {
+      title: '賳丕賲 賲丿乇爻賴 卮賲丕',
+      placeholder: '賳丕賲 乇爻賲蹖 賵 讴丕賲賱 賲丿乇爻賴 禺賵丿 乇丕 賵丕乇丿 讴賳蹖丿',
+    },
+    schoolRole: {
+      option: {
+        teacher: '賲毓賱賲',
+        student: '丿丕賳卮 丌賲賵夭',
+        administrator: '賲丿蹖乇 賲丿乇爻賴',
+      },
+      title: '賳賯卮 卮賲丕 丿乇 賲丿乇爻賴',
+    },
+    terms: {
+      desc: {
+        privacyPolicy: '爻蹖丕爻鬲 丨乇蹖賲 禺氐賵氐蹖',
+        end: '亘丕 丕乇爻丕賱:',
+        and: '賵',
+        termsOfService: '卮乇丕蹖胤 禺丿賲丕鬲',
+        front: '丕胤賱丕毓丕鬲 卮賲丕 賵 丕爻鬲賮丕丿賴 丕夭 賵囟毓蹖鬲 鬲兀蹖蹖丿 卮丿賴 丌賲賵夭卮蹖 鬲丕亘毓 卮乇丕蹖胤 賲丕 丕爻鬲.',
+      },
+      option: {
+        age: '賲賳 鬲兀蹖蹖丿 賲蹖鈥屭┵嗁� 讴賴 丨丿丕賯賱 郾鄹 爻丕賱 爻賳 丿丕乇賲',
+        inSchool: '賲賳 鬲兀蹖蹖丿 賲蹖鈥屭┵嗁� 讴賴 丿乇 賲丐爻爻賴鈥屫й� 讴賴 賳丕賲 亘乇丿賴 卮丿賴貙 孬亘鬲鈥屬嗀з� 卮丿賴 蹖丕 丕爻鬲禺丿丕賲 卮丿賴鈥屫з�. 丿蹖賮蹖 賲賲讴賳 丕爻鬲 丕夭 賲賳 亘禺賵丕賴丿 賲丿乇讴蹖 亘乇丕蹖 孬亘鬲鈥屬嗀з�/丕爻鬲禺丿丕賲 丕乇丕卅賴 丿賴賲. 丕诏乇 氐賱丕丨蹖鬲賲 乇丕 丕卮鬲亘丕賴 賳賲丕蹖賲貙 賲賵丕賮賯鬲 賲蹖鈥屭┵嗁� 讴賴 賴乇 诏賵賳賴 賴夭蹖賳賴鈥屫й� 讴賴 亘賴鈥屫ж坟� 賵囟毓蹖鬲 鬲丨氐蹖賱蹖 賲賳 丕亘鬲丿丕 賲毓丕賮 卮丿賴貙 倬乇丿丕禺鬲 讴賳賲.',
+      },
+      title: '卮乇丕蹖胤 賵 鬲賵丕賮賯丕鬲',
+    },
+  },
+  submitError: '丕乇爻丕賱 賮乇賲 賳丕賲賵賮賯 亘賵丿. 賱胤賮丕 亘毓丿丕賸 丿賵亘丕乇賴 鬲賱丕卮 讴賳蹖丿.',
+  emailLabel: '丕蹖賲蹖賱 賮毓賱蹖 卮賲丕',
+  currentSigned: '丕讴賳賵賳 亘賴 毓賳賵丕賳',
+  rejectContent: '賲鬲丕爻賮丕賳賴貙 卮賲丕 賵丕噩丿 卮乇丕蹖胤 賵囟毓蹖鬲 鬲兀蹖蹖丿 卮丿賴 丌賲賵夭卮蹖 賳蹖爻鬲蹖丿 賵 亘賴 賴賲蹖賳 丿賱蹖賱 賳賲蹖鈥屫堌з嗃屫� 讴賵倬賳 丕賳丨氐丕乇蹖 郾郯郯侏 亘乇丕蹖 胤乇丨 丨乇賮賴鈥屫й� Dify 乇丕 丿乇 氐賵乇鬲 丕爻鬲賮丕丿賴 丕夭 丕蹖賳 丌丿乇爻 丕蹖賲蹖賱 丿乇蹖丕賮鬲 讴賳蹖丿.',
+  learn: '蹖丕丿 亘诏蹖乇蹖丿 趩诏賵賳賴 賲丿丕乇讴 鬲丨氐蹖賱蹖 禺賵丿 乇丕 鬲兀蹖蹖丿 讴賳蹖丿',
+  successContent: '賲丕 蹖讴 讴賵倬賳 鬲禺賮蹖賮 郾郯郯侏 亘乇丕蹖 胤乇丨 丨乇賮賴鈥屫й� Dify 亘賴 丨爻丕亘 卮賲丕 氐丕丿乇 讴乇丿賴鈥屫й屬�. 丕蹖賳 讴賵倬賳 亘賴 賲丿鬲 蹖讴 爻丕賱 丕毓鬲亘丕乇 丿丕乇丿貙 賱胤賮丕賸 丿乇 亘丕夭賴 丕毓鬲亘丕乇 丕夭 丌賳 丕爻鬲賮丕丿賴 讴賳蹖丿.',
+  toVerified: '鬲丨氐蹖賱丕鬲 禺賵丿 乇丕 鬲兀蹖蹖丿 讴賳蹖丿',
+  rejectTitle: '鬲兀蹖蹖丿蹖賴 丌賲賵夭卮蹖 丿蹖賮蹖 卮賲丕 乇丿 卮丿賴 丕爻鬲',
+  submit: '丕乇爻丕賱',
+  successTitle: '卮賲丕 丌賲賵夭卮 丿蹖賮蹖 鬲兀蹖蹖丿 卮丿賴 丿丕乇蹖丿',
+}
+
+export default translation
diff --git a/i18n/fa-IR/explore.ts b/i18n/fa-IR/explore.ts
new file mode 100644
index 0000000..b2c6708
--- /dev/null
+++ b/i18n/fa-IR/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: '讴丕賵卮',
+  sidebar: {
+    discovery: '讴卮賮',
+    chat: '趩鬲',
+    workspace: '賮囟丕蹖 讴丕乇蹖',
+    action: {
+      pin: '爻賳噩丕賯 讴乇丿賳',
+      unpin: '亘乇丿丕卮鬲賳 爻賳噩丕賯',
+      rename: '鬲睾蹖蹖乇 賳丕賲',
+      delete: '丨匕賮',
+    },
+    delete: {
+      title: '丨匕賮 亘乇賳丕賲賴',
+      content: '丌蹖丕 賲胤賲卅賳 賴爻鬲蹖丿 讴賴 賲蹖鈥屫堌з囒屫� 丕蹖賳 亘乇賳丕賲賴 乇丕 丨匕賮 讴賳蹖丿責',
+    },
+  },
+  apps: {
+    title: '讴丕賵卮 亘乇賳丕賲賴鈥屬囏� 鬲賵爻胤 丿蹖賮蹖',
+    description: '丕夭 丕蹖賳 亘乇賳丕賲賴鈥屬囏й� 賯丕賱亘蹖 亘賱丕賮丕氐賱賴 丕爻鬲賮丕丿賴 讴賳蹖丿 蹖丕 亘乇賳丕賲賴鈥屬囏й� 禺賵丿 乇丕 亘乇 丕爻丕爻 丕蹖賳 賯丕賱亘鈥屬囏� 爻賮丕乇卮蹖 讴賳蹖丿.',
+    allCategories: '倬蹖卮賳賴丕丿 卮丿賴',
+  },
+  appCard: {
+    addToWorkspace: '丕賮夭賵丿賳 亘賴 賮囟丕蹖 讴丕乇蹖',
+    customize: '爻賮丕乇卮蹖 讴乇丿賳',
+  },
+  appCustomize: {
+    title: '丕蹖噩丕丿 亘乇賳丕賲賴 丕夭 {{name}}',
+    subTitle: '丌蹖讴賵賳 賵 賳丕賲 亘乇賳丕賲賴',
+    nameRequired: '賳丕賲 亘乇賳丕賲賴 丕賱夭丕賲蹖 丕爻鬲',
+  },
+  category: {
+    Assistant: '丿爻鬲蹖丕乇',
+    Writing: '賳賵卮鬲賳',
+    Translate: '鬲乇噩賲賴',
+    Programming: '亘乇賳丕賲賴鈥屬嗁堐屫驰�',
+    HR: '賲賳丕亘毓 丕賳爻丕賳蹖',
+    Agent: '毓丕賲賱',
+    Workflow: '诏乇丿卮',
+    Entertainment: '爻乇诏乇賲蹖',
+  },
+}
+
+export default translation
diff --git a/i18n/fa-IR/layout.ts b/i18n/fa-IR/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/fa-IR/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/fa-IR/login.ts b/i18n/fa-IR/login.ts
new file mode 100644
index 0000000..7394ab3
--- /dev/null
+++ b/i18n/fa-IR/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: '賴蹖貙 亘蹖丕蹖蹖丿 卮乇賵毓 讴賳蹖賲!馃憢',
+  welcome: '亘賴 Dify 禺賵卮 丌賲丿蹖丿貙 賱胤賮丕 亘乇丕蹖 丕丿丕賲賴 賵丕乇丿 卮賵蹖丿.',
+  email: '丌丿乇爻 丕蹖賲蹖賱',
+  emailPlaceholder: '丕蹖賲蹖賱 卮賲丕',
+  password: '乇賲夭 毓亘賵乇',
+  passwordPlaceholder: '乇賲夭 毓亘賵乇 卮賲丕',
+  name: '賳丕賲 讴丕乇亘乇蹖',
+  namePlaceholder: '賳丕賲 讴丕乇亘乇蹖 卮賲丕',
+  forget: '乇賲夭 毓亘賵乇 禺賵丿 乇丕 賮乇丕賲賵卮 讴乇丿賴鈥屫й屫�',
+  signBtn: '賵乇賵丿',
+  sso: '丕丿丕賲賴 亘丕 SSO',
+  installBtn: '乇丕賴鈥屫з嗀ж槽�',
+  setAdminAccount: '乇丕賴鈥屫з嗀ж槽� 丨爻丕亘 賲丿蹖乇',
+  setAdminAccountDesc: '亘蹖卮鬲乇蹖賳 丕賲鬲蹖丕夭丕鬲 亘乇丕蹖 丨爻丕亘 賲丿蹖乇貙 讴賴 賲蹖鈥屫堌з嗀� 亘乇丕蹖 丕蹖噩丕丿 亘乇賳丕賲賴鈥屬囏� 賵 賲丿蹖乇蹖鬲 丕乇丕卅賴鈥屫囐嗀з� LLM 賵 睾蹖乇賴 丕爻鬲賮丕丿賴 卮賵丿.',
+  createAndSignIn: '丕蹖噩丕丿 賵 賵乇賵丿',
+  oneMoreStep: '蹖讴 賲乇丨賱賴 丿蹖诏乇',
+  createSample: '亘乇 丕爻丕爻 丕蹖賳 丕胤賱丕毓丕鬲貙 賲丕 亘乇丕蹖 卮賲丕 蹖讴 賳賲賵賳賴 亘乇賳丕賲賴 丕蹖噩丕丿 禺賵丕賴蹖賲 讴乇丿',
+  invitationCode: '讴丿 丿毓賵鬲',
+  invitationCodePlaceholder: '讴丿 丿毓賵鬲 卮賲丕',
+  interfaceLanguage: '夭亘丕賳 乇丕亘胤 讴丕乇亘乇蹖',
+  timezone: '賲賳胤賯賴 夭賲丕賳蹖',
+  go: '亘乇賵 亘賴 Dify',
+  sendUsMail: '丕蹖賲蹖賱 賲毓乇賮蹖 禺賵丿 乇丕 亘乇丕蹖 賲丕 丕乇爻丕賱 讴賳蹖丿貙 賵 賲丕 丿乇禺賵丕爻鬲 丿毓賵鬲 乇丕 亘乇乇爻蹖 禺賵丕賴蹖賲 讴乇丿.',
+  acceptPP: '賲賳 爻蹖丕爻鬲 丨賮馗 丨乇蹖賲 禺氐賵氐蹖 乇丕 禺賵丕賳丿賴 賵 賯亘賵賱 賲蹖鈥屭┵嗁�',
+  reset: '賱胤賮丕賸 亘乇丕蹖 亘丕夭賳卮丕賳蹖 乇賲夭 毓亘賵乇 禺賵丿 丿爻鬲賵乇 夭蹖乇 乇丕 丕噩乇丕 讴賳蹖丿',
+  withGitHub: '丕丿丕賲賴 亘丕 GitHub',
+  withGoogle: '丕丿丕賲賴 亘丕 Google',
+  rightTitle: '倬鬲丕賳爻蹖賱 讴丕賲賱 LLM 乇丕 亘丕夭 讴賳蹖丿',
+  rightDesc: '亘賴 乇丕丨鬲蹖 亘乇賳丕賲賴鈥屬囏й� AI 亘丕 馗丕賴乇蹖 噩匕丕亘貙 賯丕亘賱 丕噩乇丕 賵 亘賴亘賵丿 倬匕蹖乇 丕蹖噩丕丿 讴賳蹖丿.',
+  tos: '卮乇丕蹖胤 禺丿賲丕鬲',
+  pp: '爻蹖丕爻鬲 丨賮馗 丨乇蹖賲 禺氐賵氐蹖',
+  tosDesc: '亘丕 孬亘鬲 賳丕賲貙 卮賲丕 亘丕 卮乇丕蹖胤 賲丕 賲賵丕賮賯鬲 賲蹖鈥屭┵嗃屫�',
+  goToInit: '丕诏乇 丨爻丕亘 乇丕 丕賵賱蹖賴 賳讴乇丿賴鈥屫й屫� 賱胤賮丕賸 亘賴 氐賮丨賴 丕賵賱蹖賴鈥屫池ж槽� 亘乇賵蹖丿',
+  dontHave: '賳丿丕乇蹖丿責',
+  invalidInvitationCode: '讴丿 丿毓賵鬲 賳丕賲毓鬲亘乇 丕爻鬲',
+  accountAlreadyInited: '丨爻丕亘 賯亘賱丕賸 丕賵賱蹖賴 卮丿賴 丕爻鬲',
+  forgotPassword: '乇賲夭 毓亘賵乇 禺賵丿 乇丕 賮乇丕賲賵卮 讴乇丿賴鈥屫й屫�',
+  resetLinkSent: '賱蹖賳讴 亘丕夭賳卮丕賳蹖 丕乇爻丕賱 卮丿',
+  sendResetLink: '丕乇爻丕賱 賱蹖賳讴 亘丕夭賳卮丕賳蹖',
+  backToSignIn: '亘丕夭诏卮鬲 亘賴 賵乇賵丿',
+  forgotPasswordDesc: '賱胤賮丕賸 丌丿乇爻 丕蹖賲蹖賱 禺賵丿 乇丕 賵丕乇丿 讴賳蹖丿 鬲丕 乇賲夭 毓亘賵乇 禺賵丿 乇丕 亘丕夭賳卮丕賳蹖 讴賳蹖丿. 賲丕 蹖讴 丕蹖賲蹖賱 亘丕 丿爻鬲賵乇丕賱毓賲賱鈥屬囏й� 亘丕夭賳卮丕賳蹖 亘乇丕蹖 卮賲丕 丕乇爻丕賱 禺賵丕賴蹖賲 讴乇丿.',
+  checkEmailForResetLink: '賱胤賮丕賸 丕蹖賲蹖賱 禺賵丿 乇丕 亘乇丕蹖 賱蹖賳讴 亘丕夭賳卮丕賳蹖 乇賲夭 毓亘賵乇 亘乇乇爻蹖 讴賳蹖丿. 丕诏乇 丿乇 毓乇囟 趩賳丿 丿賯蹖賯賴 馗丕賴乇 賳卮丿貙 倬賵卮賴 丕爻倬賲 禺賵丿 乇丕 亘乇乇爻蹖 讴賳蹖丿.',
+  passwordChanged: '丕讴賳賵賳 賵丕乇丿 卮賵蹖丿',
+  changePassword: '鬲睾蹖蹖乇 乇賲夭 毓亘賵乇',
+  changePasswordTip: '賱胤賮丕賸 蹖讴 乇賲夭 毓亘賵乇 噩丿蹖丿 亘乇丕蹖 丨爻丕亘 禺賵丿 賵丕乇丿 讴賳蹖丿',
+  invalidToken: '鬲賵讴賳 賳丕賲毓鬲亘乇 蹖丕 賲賳賯囟蹖 卮丿賴 丕爻鬲',
+  confirmPassword: '鬲丕蹖蹖丿 乇賲夭 毓亘賵乇',
+  confirmPasswordPlaceholder: '乇賲夭 毓亘賵乇 噩丿蹖丿 禺賵丿 乇丕 鬲丕蹖蹖丿 讴賳蹖丿',
+  passwordChangedTip: '乇賲夭 毓亘賵乇 卮賲丕 亘丕 賲賵賮賯蹖鬲 鬲睾蹖蹖乇 蹖丕賮鬲',
+  error: {
+    emailEmpty: '丌丿乇爻 丕蹖賲蹖賱 賱丕夭賲 丕爻鬲',
+    emailInValid: '賱胤賮丕賸 蹖讴 丌丿乇爻 丕蹖賲蹖賱 賲毓鬲亘乇 賵丕乇丿 讴賳蹖丿',
+    nameEmpty: '賳丕賲 賱丕夭賲 丕爻鬲',
+    passwordEmpty: '乇賲夭 毓亘賵乇 賱丕夭賲 丕爻鬲',
+    passwordLengthInValid: '乇賲夭 毓亘賵乇 亘丕蹖丿 丨丿丕賯賱 鄹 讴丕乇丕讴鬲乇 亘丕卮丿',
+    passwordInvalid: '乇賲夭 毓亘賵乇 亘丕蹖丿 卮丕賲賱 丨乇賵賮 賵 丕毓丿丕丿 亘丕卮丿 賵 胤賵賱 丌賳 亘蹖卮鬲乇 丕夭 鄹 讴丕乇丕讴鬲乇 亘丕卮丿',
+    registrationNotAllowed: '丨爻丕亘 倬蹖丿丕 賳卮丿. 賱胤賮丕 亘乇丕蹖 孬亘鬲 賳丕賲 亘丕 賲丿蹖乇 爻蹖爻鬲賲 鬲賲丕爻 丨丕氐賱 賮乇賲丕蹖蹖丿.',
+  },
+  license: {
+    tip: '賯亘賱 丕夭 卮乇賵毓 Dify Community Edition貙 GitHub 乇丕 亘禺賵丕賳蹖丿',
+    link: '賲噩賵夭 賲賳亘毓 亘丕夭',
+  },
+  join: '毓囟賵蹖鬲',
+  joinTipStart: '卮賲丕 乇丕 丿毓賵鬲 賲蹖鈥屭┵嗃屬� 亘賴',
+  joinTipEnd: '鬲蹖賲 丿乇 Dify',
+  invalid: '賱蹖賳讴 賲賳賯囟蹖 卮丿賴 丕爻鬲',
+  explore: '讴丕賵卮 Dify',
+  activatedTipStart: '卮賲丕 亘賴',
+  activatedTipEnd: '鬲蹖賲 倬蹖賵爻鬲賴鈥屫й屫�',
+  activated: '丕讴賳賵賳 賵丕乇丿 卮賵蹖丿',
+  adminInitPassword: '乇賲夭 毓亘賵乇 丕賵賱蹖賴 賲丿蹖乇',
+  validate: '丕毓鬲亘丕乇爻賳噩蹖',
+  checkCode: {
+    verify: '鬲丕蹖蹖丿',
+    verificationCode: '讴丿 鬲兀蹖蹖丿',
+    invalidCode: '讴丿 賳丕賲毓鬲亘乇',
+    emptyCode: '讴丿 賲賵乇丿 賳蹖丕夭 丕爻鬲',
+    didNotReceiveCode: '讴丿 乇丕 丿乇蹖丕賮鬲 賳讴乇丿蹖丿責',
+    verificationCodePlaceholder: '讴丿 6 乇賯賲蹖 乇丕 賵丕乇丿 讴賳蹖丿',
+    useAnotherMethod: '丕夭 乇賵卮 丿蹖诏乇蹖 丕爻鬲賮丕丿賴 讴賳蹖丿',
+    checkYourEmail: '丕蹖賲蹖賱 禺賵丿 乇丕 亘乇乇爻蹖 讴賳蹖丿',
+    validTime: '亘賴 禺丕胤乇 丿丕卮鬲賴 亘丕卮蹖丿 讴賴 讴丿 5 丿賯蹖賯賴 丕毓鬲亘丕乇 丿丕乇丿',
+    tips: '讴丿 丿乇爻鬲蹖 爻賳噩蹖 乇丕 亘賴 <strong>{{email}}</strong> 丕乇爻丕賱 賲蹖 讴賳蹖賲',
+    resend: '丕乇爻丕賱 賲噩丿丿',
+  },
+  or: '蹖丕',
+  back: '亘丕夭诏卮鬲',
+  backToLogin: '亘丕夭诏卮鬲 亘賴 賵乇賵丿',
+  changePasswordBtn: '鬲賳馗蹖賲 乇賲夭 毓亘賵乇',
+  continueWithCode: '亘丕 讴丿 丕丿丕賲賴 丿賴蹖丿',
+  withSSO: '亘丕 SSO 丕丿丕賲賴 丿賴蹖丿',
+  resetPassword: '亘丕夭賳卮丕賳蹖 乇賲夭 毓亘賵乇',
+  usePassword: '丕夭 乇賲夭 毓亘賵乇 丕爻鬲賮丕丿賴 讴賳蹖丿',
+  enterYourName: '賱胤賮丕 賳丕賲 讴丕乇亘乇蹖 禺賵丿 乇丕 賵丕乇丿 讴賳蹖丿',
+  useVerificationCode: '丕夭 讴丿 鬲兀蹖蹖丿 丕爻鬲賮丕丿賴 讴賳蹖丿',
+  sendVerificationCode: '丕乇爻丕賱 讴丿 鬲兀蹖蹖丿',
+  setYourAccount: '丨爻丕亘 禺賵丿 乇丕 鬲賳馗蹖賲 讴賳蹖丿',
+  noLoginMethod: '乇賵卮 丕丨乇丕夭 賴賵蹖鬲 倬蹖讴乇亘賳丿蹖 賳卮丿賴 丕爻鬲',
+  noLoginMethodTip: '賱胤賮丕 亘乇丕蹖 丕賮夭賵丿賳 乇賵卮 丕丨乇丕夭 賴賵蹖鬲 亘丕 賲丿蹖乇 爻蹖爻鬲賲 鬲賲丕爻 亘诏蹖乇蹖丿.',
+  resetPasswordDesc: '丕蹖賲蹖賱蹖 乇丕 讴賴 亘乇丕蹖 孬亘鬲 賳丕賲 丿乇 Dify 丕爻鬲賮丕丿賴 讴乇丿賴 丕蹖丿 鬲丕蹖倬 讴賳蹖丿 賵 賲丕 蹖讴 丕蹖賲蹖賱 亘丕夭賳卮丕賳蹖 乇賲夭 毓亘賵乇 亘乇丕蹖 卮賲丕 丕乇爻丕賱 禺賵丕賴蹖賲 讴乇丿.',
+  licenseInactive: '賲噩賵夭 睾蹖乇 賮毓丕賱',
+  licenseLost: '賲噩賵夭 诏賲 卮丿賴 丕爻鬲',
+  licenseExpired: '賲噩賵夭 賲賳賯囟蹖 卮丿賴 丕爻鬲',
+  licenseExpiredTip: '賲噩賵夭 Dify Enterprise 亘乇丕蹖 賮囟丕蹖 讴丕乇蹖 卮賲丕 賲賳賯囟蹖 卮丿賴 丕爻鬲. 賱胤賮丕 亘乇丕蹖 丕丿丕賲賴 丕爻鬲賮丕丿賴 丕夭 Dify 亘丕 爻乇倬乇爻鬲 禺賵丿 鬲賲丕爻 亘诏蹖乇蹖丿.',
+  licenseInactiveTip: '賲噩賵夭 Dify Enterprise 亘乇丕蹖 賮囟丕蹖 讴丕乇蹖 卮賲丕 睾蹖乇賮毓丕賱 丕爻鬲. 賱胤賮丕 亘乇丕蹖 丕丿丕賲賴 丕爻鬲賮丕丿賴 丕夭 Dify 亘丕 爻乇倬乇爻鬲 禺賵丿 鬲賲丕爻 亘诏蹖乇蹖丿.',
+  licenseLostTip: '丕鬲氐丕賱 爻乇賵乇 賲噩賵夭 Dify 丕賳噩丕賲 賳卮丿. 賱胤賮丕 亘乇丕蹖 丕丿丕賲賴 丕爻鬲賮丕丿賴 丕夭 Dify 亘丕 爻乇倬乇爻鬲 禺賵丿 鬲賲丕爻 亘诏蹖乇蹖丿.',
+}
+
+export default translation
diff --git a/i18n/fa-IR/plugin-tags.ts b/i18n/fa-IR/plugin-tags.ts
new file mode 100644
index 0000000..237aa68
--- /dev/null
+++ b/i18n/fa-IR/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    productivity: '亘賴乇賴 賵乇蹖',
+    news: '丕禺亘丕乇',
+    medical: '倬夭卮讴蹖',
+    image: '鬲氐賵蹖乇',
+    search: '噩爻鬲噩賵',
+    other: '丿蹖诏乇',
+    utilities: '鬲丕爻蹖爻丕鬲',
+    design: '胤乇丕丨蹖',
+    entertainment: '爻乇诏乇賲蹖',
+    social: '丕噩鬲賲丕毓蹖',
+    education: '丌賲賵夭卮',
+    business: '鬲噩丕乇蹖',
+    finance: '賲丕賱蹖',
+    weather: '賴賵丕',
+    travel: '爻賮乇',
+    videos: '賮蹖賱賲',
+    agent: '毓丕賲賱',
+  },
+  searchTags: '噩爻鬲噩賵 亘乇趩爻亘 賴丕',
+  allTags: '賴賲賴 亘乇趩爻亘 賴丕',
+}
+
+export default translation
diff --git a/i18n/fa-IR/plugin.ts b/i18n/fa-IR/plugin.ts
new file mode 100644
index 0000000..81aa61a
--- /dev/null
+++ b/i18n/fa-IR/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    all: '賴賲賴',
+    models: '賲丿賱',
+    bundles: '亘爻鬲賴',
+    agents: '丕爻鬲乇丕鬲跇蹖 賴丕蹖 毓丕賲賱',
+    tools: '丕亘夭丕乇',
+    extensions: '倬爻賵賳丿',
+  },
+  categorySingle: {
+    tool: '丕亘夭丕乇',
+    agent: '丕爻鬲乇丕鬲跇蹖 賳賲丕蹖賳丿诏蹖',
+    extension: '賮乇賲鬲',
+    model: '賲丿賱',
+    bundle: '亘爻鬲賴',
+  },
+  list: {
+    source: {
+      marketplace: '丕夭 Marketplace 賳氐亘 讴賳蹖丿',
+      github: '賳氐亘 丕夭 GitHub',
+      local: '賳氐亘 丕夭 賮丕蹖賱 亘爻鬲賴 賲丨賱蹖',
+    },
+    notFound: '賴蹖趩 丕賮夭賵賳賴 丕蹖 蹖丕賮鬲 賳卮丿',
+    noInstalled: '賴蹖趩 丕賮夭賵賳賴 丕蹖 賳氐亘 賳卮丿賴 丕爻鬲',
+  },
+  source: {
+    github: '诏蹖鬲鈥屬囏ж�',
+    marketplace: '亘丕夭丕乇',
+    local: '賮丕蹖賱 亘爻鬲賴 賲丨賱蹖',
+  },
+  detailPanel: {
+    categoryTip: {
+      debugging: '丕卮讴丕賱 夭丿丕蹖蹖 倬賱丕诏蹖賳',
+      marketplace: '賳氐亘 卮丿賴 丕夭 Marketplace',
+      local: '倬賱丕诏蹖賳 賲丨賱蹖',
+      github: '賳氐亘 卮丿賴 丕夭 Github',
+    },
+    operation: {
+      checkUpdate: '亘賴 乇賵夭 乇爻丕賳蹖 乇丕 亘乇乇爻蹖 讴賳蹖丿',
+      info: '丕胤賱丕毓丕鬲 倬賱丕诏蹖賳',
+      remove: '丨匕賮',
+      update: '乇賵夭 乇爻丕賳蹖',
+      detail: '噩夭卅蹖丕鬲',
+      viewDetail: '賳賲丕蹖卮 噩夭卅蹖丕鬲',
+      install: '賳氐亘',
+    },
+    toolSelector: {
+      descriptionPlaceholder: '卮乇丨 賲禺鬲氐乇蹖 丕夭 賴丿賮 丕亘夭丕乇貙 亘賴 毓賳賵丕賳 賲孬丕賱貙 丿賲丕 乇丕 亘乇丕蹖 蹖讴 賲讴丕賳 禺丕氐 丿乇蹖丕賮鬲 讴賳蹖丿.',
+      auto: '禺賵丿讴丕乇',
+      unsupportedContent: '賳爻禺賴 丕賮夭賵賳賴 賳氐亘 卮丿賴 丕蹖賳 毓賲賱 乇丕 丕乇丕卅賴 賳賲蹖 丿賴丿.',
+      paramsTip1: '倬丕乇丕賲鬲乇賴丕蹖 丕爻鬲賳鬲丕噩 LLM 乇丕 讴賳鬲乇賱 賲蹖 讴賳丿.',
+      params: '倬蹖讴乇亘賳丿蹖 丕爻鬲丿賱丕賱',
+      placeholder: '蹖讴 丕亘夭丕乇 乇丕 丕賳鬲禺丕亘 讴賳蹖丿...',
+      paramsTip2: '賵賯鬲蹖 芦禺賵丿讴丕乇禄 禺丕賲賵卮 亘丕卮丿貙 丕夭 賲賯丿丕乇 倬蹖卮 賮乇囟 丕爻鬲賮丕丿賴 賲蹖 卮賵丿.',
+      descriptionLabel: '鬲賵囟蹖丨丕鬲 丕亘夭丕乇',
+      title: '丕亘夭丕乇 丕賮夭賵丿賳',
+      settings: '鬲賳馗蹖賲丕鬲 讴丕乇亘乇',
+      empty: '亘乇丕蹖 丕賮夭賵丿賳 丕亘夭丕乇賴丕 乇賵蹖 丿讴賲賴 "+" 讴賱蹖讴 讴賳蹖丿. 賲蹖 鬲賵丕賳蹖丿 趩賳丿蹖賳 丕亘夭丕乇 丕囟丕賮賴 讴賳蹖丿.',
+      toolLabel: '丕亘夭丕乇',
+      uninstalledTitle: '丕亘夭丕乇 賳氐亘 賳卮丿賴 丕爻鬲',
+      uninstalledLink: '賲丿蹖乇蹖鬲 丿乇 倬賱丕诏蹖賳 賴丕',
+      uninstalledContent: '丕蹖賳 丕賮夭賵賳賴 丕夭 賲禺夭賳 local/GitHub 賳氐亘 卮丿賴 丕爻鬲. 賱胤賮丕 倬爻 丕夭 賳氐亘 丕爻鬲賮丕丿賴 讴賳蹖丿.',
+      unsupportedTitle: '丕讴卮賳 倬卮鬲蹖亘丕賳蹖 賳卮丿賴',
+      unsupportedContent2: '亘乇丕蹖 鬲睾蹖蹖乇 賳爻禺賴 讴賱蹖讴 讴賳蹖丿.',
+    },
+    endpointDeleteTip: '丨匕賮 賳賯胤賴 倬丕蹖丕賳蹖',
+    disabled: '睾蹖乇 賮毓丕賱',
+    strategyNum: '{{毓丿丿}} {{丕爻鬲乇丕鬲跇蹖}} 卮丕賲賱',
+    configureApp: '倬蹖讴乇亘賳丿蹖 丕倬賱蹖讴蹖卮賳',
+    endpoints: '賳賯丕胤 倬丕蹖丕賳蹖',
+    endpointsDocLink: '賲卮丕賴丿賴 爻賳丿',
+    actionNum: '{{毓丿丿}} {{丕賯丿丕賲}} 卮丕賲賱',
+    endpointDisableContent: '丌蹖丕 賲蹖 禺賵丕賴蹖丿 {{name}} 乇丕 睾蹖乇賮毓丕賱 讴賳蹖丿責',
+    endpointModalTitle: '乇丕賴 丕賳丿丕夭蹖 丕賳丿倬賵蹖賳鬲',
+    endpointsTip: '丕蹖賳 丕賮夭賵賳賴 毓賲賱讴乇丿賴丕蹖 禺丕氐蹖 乇丕 丕夭 胤乇蹖賯 賳賯丕胤 倬丕蹖丕賳蹖 丕乇丕卅賴 賲蹖 丿賴丿 賵 賲蹖 鬲賵丕賳蹖丿 趩賳丿蹖賳 賲噩賲賵毓賴 賳賯胤賴 倬丕蹖丕賳蹖 乇丕 亘乇丕蹖 賮囟丕蹖 讴丕乇蹖 賮毓賱蹖 倬蹖讴乇亘賳丿蹖 讴賳蹖丿.',
+    serviceOk: '禺丿賲丕鬲 禺賵亘',
+    modelNum: '{{毓丿丿}} 賲丿賱 賴丕蹖 诏賳噩丕賳丿賴 卮丿賴 丕爻鬲',
+    endpointDisableTip: '睾蹖乇賮毓丕賱 讴乇丿賳 賳賯胤賴 倬丕蹖丕賳蹖',
+    configureModel: '賲丿賱 乇丕 倬蹖讴乇亘賳丿蹖 讴賳蹖丿',
+    configureTool: '丕亘夭丕乇 倬蹖讴乇亘賳丿蹖',
+    endpointsEmpty: '亘乇丕蹖 丕賮夭賵丿賳 賳賯胤賴 倬丕蹖丕賳蹖 乇賵蹖 丿讴賲賴 "+" 讴賱蹖讴 讴賳蹖丿',
+    endpointModalDesc: '倬爻 丕夭 倬蹖讴乇亘賳丿蹖貙 賲蹖 鬲賵丕賳 丕夭 賵蹖跇诏蹖 賴丕蹖 丕乇丕卅賴 卮丿賴 鬲賵爻胤 丕賮夭賵賳賴 丕夭 胤乇蹖賯 賳賯丕胤 倬丕蹖丕賳蹖 API 丕爻鬲賮丕丿賴 讴乇丿.',
+    switchVersion: '賳爻禺賴 爻賵卅蹖趩',
+    endpointDeleteContent: '丌蹖丕 賲蹖 禺賵丕賴蹖丿 {{name}} 乇丕 丨匕賮 讴賳蹖丿責',
+  },
+  debugInfo: {
+    title: '丕卮讴丕賱 夭丿丕蹖蹖',
+    viewDocs: '賲卮丕賴丿賴 丕爻賳丕丿',
+  },
+  privilege: {
+    everyone: '賴賲賴',
+    admins: '賲丿蹖乇丕賳',
+    whoCanInstall: '趩賴 讴爻蹖 賲蹖 鬲賵丕賳丿 丕賮夭賵賳賴 賴丕 乇丕 賳氐亘 賵 賲丿蹖乇蹖鬲 讴賳丿責',
+    title: '鬲賳馗蹖賲丕鬲 倬賱丕诏蹖賳',
+    noone: '賴蹖趩',
+    whoCanDebug: '趩賴 讴爻蹖 賲蹖 鬲賵丕賳丿 丕賮夭賵賳賴 賴丕 乇丕 丕卮讴丕賱 夭丿丕蹖蹖 讴賳丿責',
+  },
+  pluginInfoModal: {
+    repository: '賲禺夭賳',
+    packageName: '亘爻鬲賴',
+    title: '丕胤賱丕毓丕鬲 倬賱丕诏蹖賳',
+    release: '丕賳鬲卮丕乇',
+  },
+  action: {
+    pluginInfo: '丕胤賱丕毓丕鬲 倬賱丕诏蹖賳',
+    usedInApps: '丕蹖賳 丕賮夭賵賳賴 丿乇 亘乇賳丕賲賴 賴丕蹖 {{num}} 丕爻鬲賮丕丿賴 賲蹖 卮賵丿.',
+    deleteContentLeft: '丌蹖丕 賲蹖 禺賵丕賴蹖丿',
+    checkForUpdates: '亘乇乇爻蹖 亘賴 乇賵夭乇爻丕賳蹖 賴丕',
+    delete: '丨匕賮 丕賮夭賵賳賴',
+    deleteContentRight: '丕賮夭賵賳賴?',
+  },
+  installModal: {
+    labels: {
+      package: '亘爻鬲賴',
+      version: '賳爻禺賴贁',
+      repository: '賲禺夭賳',
+    },
+    back: '亘丕夭诏卮鬲',
+    next: '亘毓丿蹖',
+    cancel: '賱睾賵',
+    uploadingPackage: '丌倬賱賵丿 {{packageName}}...',
+    fromTrustSource: '賱胤賮丕 賲胤賲卅賳 卮賵蹖丿 讴賴 丕賮夭賵賳賴 賴丕 乇丕 賮賯胤 丕夭 <trustSource>蹖讴 賲賳亘毓 賯丕亘賱 丕毓鬲賲丕丿</trustSource> 賳氐亘 賲蹖 讴賳蹖丿.',
+    readyToInstall: '丿乇 賲賵乇丿 賳氐亘 丕賮夭賵賳賴 夭蹖乇',
+    install: '賳氐亘',
+    pluginLoadError: '禺胤丕蹖 亘丕乇诏匕丕乇蹖 丕賮夭賵賳賴',
+    pluginLoadErrorDesc: '丕蹖賳 丕賮夭賵賳賴 賳氐亘 賳禺賵丕賴丿 卮丿',
+    close: '賳夭丿蹖讴',
+    installFailed: '賳氐亘 賳丕賲賵賮賯 亘賵丿',
+    installFailedDesc: '丕賮夭賵賳賴 賳氐亘 卮丿賴 丕爻鬲 賳丕賲賵賮賯 丕爻鬲.',
+    installedSuccessfullyDesc: '丕蹖賳 丕賮夭賵賳賴 亘丕 賲賵賮賯蹖鬲 賳氐亘 卮丿.',
+    dropPluginToInstall: '亘爻鬲賴 丕賮夭賵賳賴 乇丕 亘乇丕蹖 賳氐亘 丕蹖賳噩丕 乇賴丕 讴賳蹖丿',
+    installing: '賳氐亘...',
+    readyToInstallPackage: '丿乇 賲賵乇丿 賳氐亘 丕賮夭賵賳賴 夭蹖乇',
+    readyToInstallPackages: '丿乇 卮乇賮 賳氐亘 丕賮夭賵賳賴 賴丕蹖 {{num}} 夭蹖乇',
+    installedSuccessfully: '賳氐亘 賲賵賮賯蹖鬲 丌賲蹖夭 亘賵丿',
+    installPlugin: '丕賮夭賵賳賴 乇丕 賳氐亘 讴賳蹖丿',
+    installComplete: '賳氐亘 讴丕賲賱 卮丿',
+    uploadFailed: '丌倬賱賵丿 丕賳噩丕賲 賳卮丿',
+  },
+  installFromGitHub: {
+    installPlugin: '丕賮夭賵賳賴 乇丕 丕夭 GitHub 賳氐亘 讴賳蹖丿',
+    selectPackagePlaceholder: '賱胤賮丕 蹖讴 亘爻鬲賴 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+    gitHubRepo: '賲禺夭賳 GitHub',
+    updatePlugin: '丕賮夭賵賳賴 乇丕 丕夭 GitHub 亘賴 乇賵夭 讴賳蹖丿',
+    uploadFailed: '丌倬賱賵丿 丕賳噩丕賲 賳卮丿',
+    installedSuccessfully: '賳氐亘 賲賵賮賯蹖鬲 丌賲蹖夭 亘賵丿',
+    installNote: '賱胤賮丕 賲胤賲卅賳 卮賵蹖丿 讴賴 丕賮夭賵賳賴 賴丕 乇丕 賮賯胤 丕夭 蹖讴 賲賳亘毓 賯丕亘賱 丕毓鬲賲丕丿 賳氐亘 賲蹖 讴賳蹖丿.',
+    installFailed: '賳氐亘 賳丕賲賵賮賯 亘賵丿',
+    selectVersionPlaceholder: '賱胤賮丕 蹖讴 賳爻禺賴 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+    selectPackage: '亘爻鬲賴 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+    selectVersion: '丕賳鬲禺丕亘 賳爻禺賴',
+  },
+  upgrade: {
+    usedInApps: '丕爻鬲賮丕丿賴 卮丿賴 丿乇 亘乇賳丕賲賴 賴丕蹖 {{num}}',
+    successfulTitle: '賳氐亘 賲賵賮賯蹖鬲 丌賲蹖夭',
+    close: '賳夭丿蹖讴',
+    title: '丕賮夭賵賳賴 乇丕 賳氐亘 讴賳蹖丿',
+    upgrading: '賳氐亘...',
+    upgrade: '賳氐亘',
+    description: '丿乇 賲賵乇丿 賳氐亘 丕賮夭賵賳賴 夭蹖乇',
+  },
+  error: {
+    noReleasesFound: '賴蹖趩 賳爻禺賴 丕蹖 蹖丕賮鬲 賳卮丿. 賱胤賮丕 賲禺夭賳 GitHub 蹖丕 URL 賵乇賵丿蹖 乇丕 亘乇乇爻蹖 讴賳蹖丿.',
+    inValidGitHubUrl: 'URL GitHub 賳丕賲毓鬲亘乇 丕爻鬲. 賱胤賮丕 蹖讴 URL 賲毓鬲亘乇 乇丕 丿乇 賯丕賱亘 賵丕乇丿 讴賳蹖丿: https://github.com/owner/repo',
+    fetchReleasesError: '丕賲讴丕賳 亘丕夭蹖丕亘蹖 賳爻禺賴 賴丕 賵噩賵丿 賳丿丕乇丿. 賱胤賮丕 亘毓丿丕 丿賵亘丕乇賴 丕賲鬲丨丕賳 讴賳蹖丿.',
+  },
+  marketplace: {
+    sortOption: {
+      firstReleased: '丕賵賱蹖賳 賲賳鬲卮乇 卮丿',
+      recentlyUpdated: '丕禺蹖乇丕 亘賴 乇賵夭 卮丿賴 丕爻鬲',
+      mostPopular: '賲丨亘賵亘 鬲乇蹖賳',
+      newlyReleased: '鬲丕夭賴 賲賳鬲卮乇 卮丿賴',
+    },
+    and: '賵',
+    viewMore: '亘蹖卮鬲乇 亘亘蹖賳蹖丿',
+    moreFrom: '丕胤賱丕毓丕鬲 亘蹖卮鬲乇 丕夭 Marketplace',
+    pluginsResult: '賳鬲丕蹖噩 {{num}}',
+    noPluginFound: '賴蹖趩 丕賮夭賵賳賴 丕蹖 蹖丕賮鬲 賳卮丿',
+    sortBy: '卮賴乇 爻蹖丕賴',
+    difyMarketplace: '亘丕夭丕乇 丿蹖賮蹖',
+    empower: '鬲賵爻毓賴 賴賵卮 賲氐賳賵毓蹖 禺賵丿 乇丕 鬲賵丕賳賲賳丿 讴賳蹖丿',
+    discover: '讴卮賮',
+    verifiedTip: '鬲兀蹖蹖丿 卮丿賴 鬲賵爻胤 丿蹖賮蹖',
+    partnerTip: '鬲兀蹖蹖丿 卮丿賴 鬲賵爻胤 蹖讴 卮乇蹖讴 丿蹖賮蹖',
+  },
+  task: {
+    installing: '賳氐亘 倬賱丕诏蹖賳 賴丕蹖 {{installingLength}}貙 0 丕賳噩丕賲 卮丿.',
+    clearAll: '倬丕讴 讴乇丿賳 賴賲賴',
+    installedError: '丕賮夭賵賳賴 賴丕蹖 {{errorLength}} 賳氐亘 賳卮丿賳丿',
+    installError: '倬賱丕诏蹖賳 賴丕蹖 {{errorLength}} 賳氐亘 賳卮丿賳丿貙 亘乇丕蹖 賲卮丕賴丿賴 讴賱蹖讴 讴賳蹖丿',
+    installingWithSuccess: '賳氐亘 倬賱丕诏蹖賳 賴丕蹖 {{installingLength}}貙 {{successLength}} 賲賵賮賯蹖鬲 丌賲蹖夭 丕爻鬲.',
+    installingWithError: '賳氐亘 倬賱丕诏蹖賳 賴丕蹖 {{installingLength}}貙 {{successLength}} 亘丕 賲賵賮賯蹖鬲 賲賵丕噩賴 卮丿貙 {{errorLength}} 賳丕賲賵賮賯 亘賵丿',
+  },
+  searchTools: '丕亘夭丕乇賴丕蹖 噩爻鬲噩賵...',
+  findMoreInMarketplace: '丕胤賱丕毓丕鬲 亘蹖卮鬲乇 丿乇 Marketplace',
+  searchInMarketplace: '噩爻鬲噩賵 丿乇 Marketplace',
+  submitPlugin: '丕乇爻丕賱 丕賮夭賵賳賴',
+  searchCategories: '丿爻鬲賴 亘賳丿蹖 賴丕 乇丕 噩爻鬲噩賵 讴賳蹖丿',
+  fromMarketplace: '丕夭 亘丕夭丕乇',
+  installPlugin: '丕賮夭賵賳賴 乇丕 賳氐亘 讴賳蹖丿',
+  from: '丕夭',
+  install: '{{num}} 賳氐亘 賲蹖 卮賵丿',
+  endpointsEnabled: '{{num}} 賲噩賲賵毓賴 賳賯丕胤 倬丕蹖丕賳蹖 賮毓丕賱 卮丿賴 丕爻鬲',
+  searchPlugins: '噩爻鬲噩賵蹖 丕賮夭賵賳賴 賴丕',
+  installFrom: '賳氐亘 丕夭',
+  installAction: '賳氐亘',
+  allCategories: '賴賲賴 丿爻鬲賴 亘賳丿蹖 賴丕',
+  search: '噩爻鬲噩賵',
+  metadata: {
+    title: '倬賱丕诏蹖賳 賴丕',
+  },
+  difyVersionNotCompatible: '賳爻禺賴 賮毓賱蹖 丿蹖賮蹖 亘丕 丕蹖賳 倬賱丕诏蹖賳 爻丕夭诏丕乇 賳蹖爻鬲貙 賱胤賮丕賸 亘賴 賳爻禺賴 丨丿丕賯賱 賲賵乇丿 賳蹖丕夭 亘賴鈥屫辟堌藏必池з嗃� 讴賳蹖丿: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/fa-IR/register.ts b/i18n/fa-IR/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/fa-IR/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/fa-IR/run-log.ts b/i18n/fa-IR/run-log.ts
new file mode 100644
index 0000000..e84450e
--- /dev/null
+++ b/i18n/fa-IR/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: '賵乇賵丿蹖',
+  result: '賳鬲蹖噩賴',
+  detail: '噩夭卅蹖丕鬲',
+  tracing: '乇丿蹖丕亘蹖',
+  resultPanel: {
+    status: '賵囟毓蹖鬲',
+    time: '夭賲丕賳 诏匕卮鬲賴',
+    tokens: '讴賱 鬲賵讴賳鈥屬囏�',
+  },
+  meta: {
+    title: '賮乇丕丿丕丿賴',
+    status: '賵囟毓蹖鬲',
+    version: '賳爻禺賴',
+    executor: '丕噩乇丕讴賳賳丿賴',
+    startTime: '夭賲丕賳 卮乇賵毓',
+    time: '夭賲丕賳 诏匕卮鬲賴',
+    tokens: '讴賱 鬲賵讴賳鈥屬囏�',
+    steps: '诏丕賲鈥屬囏й� 丕噩乇丕',
+  },
+  resultEmpty: {
+    title: '丕蹖賳 丕噩乇丕 賮賯胤 禺乇賵噩蹖 亘賴 賮乇賲鬲 JSON 丿丕乇丿貙',
+    tipLeft: '賱胤賮丕賸 亘賴 ',
+    link: '倬賳賱 噩夭卅蹖丕鬲',
+    tipRight: ' 亘乇賵蹖丿 賵 丌賳 乇丕 賲卮丕賴丿賴 讴賳蹖丿.',
+  },
+  actionLogs: '诏夭丕乇卮 賴丕蹖 丕讴卮賳',
+  circularInvocationTip: '賮乇丕禺賵丕賳蹖 丿丕蹖乇賴 丕蹖 丕亘夭丕乇賴丕/诏乇賴 賴丕 丿乇 诏乇丿卮 讴丕乇 賮毓賱蹖 賵噩賵丿 丿丕乇丿.',
+}
+
+export default translation
diff --git a/i18n/fa-IR/share-app.ts b/i18n/fa-IR/share-app.ts
new file mode 100644
index 0000000..bf1c0de
--- /dev/null
+++ b/i18n/fa-IR/share-app.ts
@@ -0,0 +1,78 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: '丕倬 丿乇 丿爻鬲乇爻 賳蹖爻鬲',
+    appUnknownError: '丕倬 丿乇 丿爻鬲乇爻 賳蹖爻鬲',
+  },
+  chat: {
+    newChat: '趩鬲 噩丿蹖丿',
+    pinnedTitle: '倬蹖賳 卮丿賴',
+    unpinnedTitle: '趩鬲鈥屬囏�',
+    newChatDefaultName: '賲讴丕賱賲賴 噩丿蹖丿',
+    resetChat: '亘丕夭賳卮丕賳蹖 賲讴丕賱賲賴',
+    poweredBy: '賯丿乇鬲鈥屭辟佖� 丕夭',
+    prompt: '倬蹖卮賳賴丕丿',
+    privatePromptConfigTitle: '鬲賳馗蹖賲丕鬲 賲讴丕賱賲賴',
+    publicPromptConfigTitle: '倬蹖卮賳賴丕丿 丕賵賱蹖賴',
+    configStatusDes: '賯亘賱 丕夭 卮乇賵毓貙 賲蹖鈥屫堌з嗃屫� 鬲賳馗蹖賲丕鬲 賲讴丕賱賲賴 乇丕 鬲睾蹖蹖乇 丿賴蹖丿',
+    configDisabled: '鬲賳馗蹖賲丕鬲 噩賱爻賴 賯亘賱蹖 亘乇丕蹖 丕蹖賳 噩賱爻賴 丕爻鬲賮丕丿賴 卮丿賴 丕爻鬲.',
+    startChat: '卮乇賵毓 趩鬲',
+    privacyPolicyLeft: '賱胤賮丕賸 ',
+    privacyPolicyMiddle: '爻蹖丕爻鬲 丨乇蹖賲 禺氐賵氐蹖',
+    privacyPolicyRight: ' 丕乇丕卅賴 卮丿賴 鬲賵爻胤 鬲賵爻毓賴鈥屫囐嗀� 丕倬 乇丕 亘禺賵丕賳蹖丿.',
+    deleteConversation: {
+      title: '丨匕賮 賲讴丕賱賲賴',
+      content: '丌蹖丕 賲胤賲卅賳 賴爻鬲蹖丿 讴賴 賲蹖鈥屫堌з囒屫� 丕蹖賳 賲讴丕賱賲賴 乇丕 丨匕賮 讴賳蹖丿責',
+    },
+    tryToSolve: '爻毓蹖 讴賳蹖丿 丨賱 讴賳蹖丿',
+    temporarySystemIssue: '亘亘禺卮蹖丿貙 賲卮讴賱 賲賵賯鬲 爻蹖爻鬲賲蹖.',
+    expand: '亘丕夭 讴乇丿賳',
+    collapse: '亘爻鬲賳',
+    newChatTip: '賯亘賱丕賸 丿乇 蹖讴 趩鬲 噩丿蹖丿',
+    viewChatSettings: '鬲賳馗蹖賲丕鬲 趩鬲 乇丕 賲卮丕賴丿賴 讴賳蹖丿',
+    chatFormTip: '鬲賳馗蹖賲丕鬲 趩鬲 倬爻 丕夭 卮乇賵毓 趩鬲 賯丕亘賱 鬲睾蹖蹖乇 賳蹖爻鬲賳丿.',
+    chatSettingsTitle: '乇丕賴鈥屫з嗀ж槽� 趩鬲 噩丿蹖丿',
+  },
+  generation: {
+    tabs: {
+      create: '蹖讴鈥屫ㄘж� 丕噩乇丕 讴賳',
+      batch: '丕噩乇丕 亘賴 氐賵乇鬲 诏乇賵賴蹖',
+      saved: '匕禺蹖乇賴 卮丿賴',
+    },
+    savedNoData: {
+      title: '卮賲丕 賴賳賵夭 賳鬲蹖噩賴鈥屫й� 匕禺蹖乇賴 賳讴乇丿賴鈥屫й屫�!',
+      description: '卮乇賵毓 亘賴 鬲賵賱蹖丿 賲丨鬲賵丕 讴賳蹖丿 賵 賳鬲丕蹖噩 匕禺蹖乇賴 卮丿賴 禺賵丿 乇丕 丕蹖賳噩丕 倬蹖丿丕 讴賳蹖丿.',
+      startCreateContent: '卮乇賵毓 亘賴 鬲賵賱蹖丿 賲丨鬲賵丕',
+    },
+    title: '鬲讴賲蹖賱 賴賵卮 賲氐賳賵毓蹖',
+    queryTitle: '賲丨鬲賵丕蹖 丿乇禺賵丕爻鬲',
+    completionResult: '賳鬲蹖噩賴 鬲讴賲蹖賱',
+    queryPlaceholder: '賲丨鬲賵丕蹖 丿乇禺賵丕爻鬲 禺賵丿 乇丕 亘賳賵蹖爻蹖丿...',
+    run: '丕噩乇丕',
+    copy: '讴倬蹖',
+    resultTitle: '鬲讴賲蹖賱 賴賵卮 賲氐賳賵毓蹖',
+    noData: '賴賵卮 賲氐賳賵毓蹖 丌賳趩賴 乇丕 讴賴 賲蹖鈥屫堌з囒屫� 丕蹖賳噩丕 亘賴 卮賲丕 賲蹖鈥屫囏�.',
+    csvUploadTitle: '賮丕蹖賱 CSV 禺賵丿 乇丕 丕蹖賳噩丕 亘讴卮蹖丿 賵 乇賴丕 讴賳蹖丿貙 蹖丕 ',
+    browse: '噩爻鬲噩賵',
+    csvStructureTitle: '賮丕蹖賱 CSV 亘丕蹖丿 亘丕 爻丕禺鬲丕乇 夭蹖乇 賲胤丕亘賯鬲 丿丕卮鬲賴 亘丕卮丿:',
+    downloadTemplate: '丕賱诏賵 乇丕 丕蹖賳噩丕 丿丕賳賱賵丿 讴賳蹖丿',
+    field: '賮蹖賱丿',
+    batchFailed: {
+      info: '{{num}} 丕噩乇丕蹖 賳丕賲賵賮賯',
+      retry: '鬲賱丕卮 賲噩丿丿',
+      outputPlaceholder: '賲丨鬲賵丕蹖 禺乇賵噩蹖 賵噩賵丿 賳丿丕乇丿',
+    },
+    errorMsg: {
+      empty: '賱胤賮丕賸 賲丨鬲賵丕 乇丕 丿乇 賮丕蹖賱 亘丕乇诏匕丕乇蹖 卮丿賴 賵丕乇丿 讴賳蹖丿.',
+      fileStructNotMatch: '賮丕蹖賱 CSV 亘丕乇诏匕丕乇蹖 卮丿賴 亘丕 爻丕禺鬲丕乇 賲胤丕亘賯鬲 賳丿丕乇丿.',
+      emptyLine: '乇丿蹖賮 {{rowIndex}} 禺丕賱蹖 丕爻鬲',
+      invalidLine: '乇丿蹖賮 {{rowIndex}}: 賲賯丿丕乇 {{varName}} 賳賲蹖鈥屫堌з嗀� 禺丕賱蹖 亘丕卮丿',
+      moreThanMaxLengthLine: '乇丿蹖賮 {{rowIndex}}: 賲賯丿丕乇 {{varName}} 賳賲蹖鈥屫堌з嗀� 亘蹖卮鬲乇 丕夭 {{maxLength}} 讴丕乇丕讴鬲乇 亘丕卮丿',
+      atLeastOne: '賱胤賮丕賸 丨丿丕賯賱 蹖讴 乇丿蹖賮 丿乇 賮丕蹖賱 亘丕乇诏匕丕乇蹖 卮丿賴 賵丕乇丿 讴賳蹖丿.',
+    },
+    executions: '{{num}} 丕毓丿丕賲',
+    execution: '丕噩乇丕',
+  },
+}
+
+export default translation
diff --git a/i18n/fa-IR/time.ts b/i18n/fa-IR/time.ts
new file mode 100644
index 0000000..2e4ffea
--- /dev/null
+++ b/i18n/fa-IR/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Sat: '卮賳亘賴',
+    Sun: '禺賵乇卮蹖丿',
+    Mon: '賲賵賳',
+    Wed: '趩賴丕乇卮賳亘賴',
+    Fri: '噩賲毓賴',
+    Tue: '爻賴 卮賳亘賴',
+    Thu: '倬賳噩鈥屫促嗀ㄙ�',
+  },
+  months: {
+    October: '丕讴鬲亘乇',
+    February: '賮賵乇蹖賴',
+    September: '爻倬鬲丕賲亘乇',
+    July: '噩賵賱丕蹖',
+    August: '丕賵鬲',
+    January: '跇丕賳賵蹖賴',
+    April: '丌賵乇蹖賱',
+    November: '賳賵丕賲亘乇',
+    March: '賲丕乇爻',
+    May: '賲賴',
+    June: '跇賵卅賳',
+    December: '丿爻丕賲亘乇',
+  },
+  operation: {
+    pickDate: '鬲丕乇蹖禺 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+    ok: '禺賵亘',
+    now: '丨丕賱丕',
+    cancel: '賱睾賵',
+  },
+  title: {
+    pickTime: '夭賲丕賳 丕賳鬲禺丕亘 讴賳蹖丿',
+  },
+  defaultPlaceholder: '夭賲丕賳蹖 乇丕 丕賳鬲禺丕亘 讴賳蹖丿...',
+}
+
+export default translation
diff --git a/i18n/fa-IR/tools.ts b/i18n/fa-IR/tools.ts
new file mode 100644
index 0000000..dc6146d
--- /dev/null
+++ b/i18n/fa-IR/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: '丕亘夭丕乇賴丕',
+  createCustomTool: '丕蹖噩丕丿 丕亘夭丕乇 爻賮丕乇卮蹖',
+  customToolTip: '亘蹖卮鬲乇 丿乇 賲賵乇丿 丕亘夭丕乇賴丕蹖 爻賮丕乇卮蹖 Dify 亘蹖丕賲賵夭蹖丿',
+  type: {
+    all: '賴賲賴',
+    builtIn: '爻賮丕乇卮蹖 卮丿賴',
+    custom: '爻賮丕乇卮蹖',
+    workflow: '噩乇蹖丕賳 讴丕乇',
+  },
+  contribute: {
+    line1: '賲賳 毓賱丕賯賴鈥屬呝嗀� 亘賴 ',
+    line2: '賲卮丕乇讴鬲 丿乇 丕亘夭丕乇賴丕蹖 Dify 賴爻鬲賲.',
+    viewGuide: '賲卮丕賴丿賴 乇丕賴賳賲丕',
+  },
+  author: '鬲賵爻胤',
+  auth: {
+    unauthorized: '亘乇丕蹖 賲噩賵夭 丿丕丿賳',
+    authorized: '賲噩賵夭 丿丕丿賴 卮丿賴',
+    setup: '鬲賳馗蹖賲 賲噩賵夭 亘乇丕蹖 丕爻鬲賮丕丿賴',
+    setupModalTitle: '鬲賳馗蹖賲 賲噩賵夭',
+    setupModalTitleDescription: '倬爻 丕夭 倬蹖讴乇亘賳丿蹖 丕毓鬲亘丕乇賳丕賲賴鈥屬囏ж� 賴賲賴 丕毓囟丕蹖 賲賵噩賵丿 丿乇 賮囟丕蹖 讴丕乇蹖 賲蹖鈥屫堌з嗁嗀� 丕夭 丕蹖賳 丕亘夭丕乇 賴賳诏丕賲 賴賲丕賴賳诏蹖 亘乇賳丕賲賴鈥屬囏� 丕爻鬲賮丕丿賴 讴賳賳丿.',
+  },
+  includeToolNum: '{{num}} 丕亘夭丕乇 卮丕賲賱 卮丿',
+  addTool: '丕賮夭賵丿賳 丕亘夭丕乇',
+  addToolModal: {
+    type: '賳賵毓',
+    category: '丿爻鬲賴鈥屫ㄙ嗀�',
+    add: '丕賮夭賵丿賳',
+    added: '丕賮夭賵丿賴 卮丿',
+    manageInTools: '賲丿蹖乇蹖鬲 丿乇 丕亘夭丕乇賴丕',
+    emptyTitle: '賴蹖趩 丕亘夭丕乇 噩乇蹖丕賳 讴丕乇蹖 丿乇 丿爻鬲乇爻 賳蹖爻鬲',
+    emptyTip: '亘賴 "噩乇蹖丕賳 讴丕乇蹖 -> 丕賳鬲卮丕乇 亘賴 毓賳賵丕賳 丕亘夭丕乇" 亘乇賵蹖丿',
+    emptyTipCustom: '丕蹖噩丕丿 蹖讴 丕亘夭丕乇 爻賮丕乇卮蹖',
+    emptyTitleCustom: '賴蹖趩 丕亘夭丕乇 爻賮丕乇卮蹖 丿乇 丿爻鬲乇爻 賳蹖爻鬲',
+  },
+  createTool: {
+    title: '丕蹖噩丕丿 丕亘夭丕乇 爻賮丕乇卮蹖',
+    editAction: '倬蹖讴乇亘賳丿蹖',
+    editTitle: '賵蹖乇丕蹖卮 丕亘夭丕乇 爻賮丕乇卮蹖',
+    name: '賳丕賲',
+    toolNamePlaceHolder: '賳丕賲 丕亘夭丕乇 乇丕 賵丕乇丿 讴賳蹖丿',
+    nameForToolCall: '賳丕賲 賮乇丕禺賵丕賳蹖 丕亘夭丕乇',
+    nameForToolCallPlaceHolder: '亘乇丕蹖 卮賳丕爻丕蹖蹖 賲丕卮蹖賳貙 賲丕賳賳丿 getCurrentWeather貙 list_pets',
+    nameForToolCallTip: '賮賯胤 丕毓丿丕丿貙 丨乇賵賮 賵 禺胤 夭蹖乇 倬卮鬲蹖亘丕賳蹖 賲蹖鈥屫促堌�.',
+    description: '鬲賵囟蹖丨丕鬲',
+    descriptionPlaceholder: '鬲賵囟蹖丨丕鬲 賲禺鬲氐乇 丿乇 賲賵乇丿 賴丿賮 丕亘夭丕乇貙 賲孬賱丕賸貙 诏乇賮鬲賳 丿賲丕 亘乇丕蹖 蹖讴 賲讴丕賳 禺丕氐.',
+    schema: '胤乇丨',
+    schemaPlaceHolder: '胤乇丨 OpenAPI 禺賵丿 乇丕 丕蹖賳噩丕 賵丕乇丿 讴賳蹖丿',
+    viewSchemaSpec: '賲卮丕賴丿賴 賲卮禺氐丕鬲 OpenAPI-Swagger',
+    importFromUrl: '賵丕乇丿 讴乇丿賳 丕夭 URL',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: '賱胤賮丕賸 蹖讴 URL 賲毓鬲亘乇 賵丕乇丿 讴賳蹖丿',
+    examples: '賲孬丕賱鈥屬囏�',
+    exampleOptions: {
+      json: '丌亘 賵 賴賵丕 (JSON)',
+      yaml: '賮乇賵卮诏丕賴 丨蹖賵丕賳丕鬲 禺丕賳诏蹖 (YAML)',
+      blankTemplate: '丕賱诏賵蹖 禺丕賱蹖',
+    },
+    availableTools: {
+      title: '丕亘夭丕乇賴丕蹖 賲賵噩賵丿',
+      name: '賳丕賲',
+      description: '鬲賵囟蹖丨丕鬲',
+      method: '乇賵卮',
+      path: '賲爻蹖乇',
+      action: '毓賲賱蹖丕鬲',
+      test: '丌夭賲丕蹖卮',
+    },
+    authMethod: {
+      title: '乇賵卮 賲噩賵夭',
+      type: '賳賵毓 賲噩賵夭',
+      keyTooltip: '讴賱蹖丿 Http Header貙 賲蹖鈥屫堌з嗃屫� 丌賳 乇丕 亘丕 "Authorization" 鬲乇讴 讴賳蹖丿 丕诏乇 賳賲蹖鈥屫з嗃屫� 趩蹖爻鬲 蹖丕 丌賳 乇丕 亘賴 蹖讴 賲賯丿丕乇 爻賮丕乇卮蹖 鬲賳馗蹖賲 讴賳蹖丿',
+      types: {
+        none: '賴蹖趩',
+        api_key: '讴賱蹖丿 API',
+        apiKeyPlaceholder: '賳丕賲 賴丿乇 HTTP 亘乇丕蹖 讴賱蹖丿 API',
+        apiValuePlaceholder: '讴賱蹖丿 API 乇丕 賵丕乇丿 讴賳蹖丿',
+      },
+      key: '讴賱蹖丿',
+      value: '賲賯丿丕乇',
+    },
+    authHeaderPrefix: {
+      title: '賳賵毓 賲噩賵夭',
+      types: {
+        basic: '倬丕蹖賴',
+        bearer: 'Bearer',
+        custom: '爻賮丕乇卮蹖',
+      },
+    },
+    privacyPolicy: '爻蹖丕爻鬲 丨賮馗 丨乇蹖賲 禺氐賵氐蹖',
+    privacyPolicyPlaceholder: '賱胤賮丕賸 爻蹖丕爻鬲 丨賮馗 丨乇蹖賲 禺氐賵氐蹖 乇丕 賵丕乇丿 讴賳蹖丿',
+    toolInput: {
+      title: '賵乇賵丿蹖 丕亘夭丕乇',
+      name: '賳丕賲',
+      required: '丕賱夭丕賲蹖',
+      method: '乇賵卮',
+      methodSetting: '鬲賳馗蹖賲',
+      methodSettingTip: '讴丕乇亘乇 倬蹖讴乇亘賳丿蹖 丕亘夭丕乇 乇丕 倬乇 賲蹖鈥屭┵嗀�',
+      methodParameter: '倬丕乇丕賲鬲乇',
+      methodParameterTip: 'LLM 丿乇 胤賵賱 丕爻鬲賳亘丕胤 倬乇 賲蹖鈥屭┵嗀�',
+      label: '亘乇趩爻亘鈥屬囏�',
+      labelPlaceholder: '亘乇趩爻亘鈥屬囏� 乇丕 丕賳鬲禺丕亘 讴賳蹖丿 (丕禺鬲蹖丕乇蹖)',
+      description: '鬲賵囟蹖丨丕鬲',
+      descriptionPlaceholder: '鬲賵囟蹖丨丕鬲 賲毓賳蹖 倬丕乇丕賲鬲乇',
+    },
+    customDisclaimer: '鬲賵噩賴蹖賴 爻賮丕乇卮蹖',
+    customDisclaimerPlaceholder: '賱胤賮丕賸 鬲賵噩賴蹖賴 爻賮丕乇卮蹖 乇丕 賵丕乇丿 讴賳蹖丿',
+    confirmTitle: '丌蹖丕 賲蹖鈥屫堌з囒屫� 匕禺蹖乇賴 讴賳蹖丿責',
+    confirmTip: '亘乇賳丕賲賴鈥屬囏й屰� 讴賴 丕夭 丕蹖賳 丕亘夭丕乇 丕爻鬲賮丕丿賴 賲蹖鈥屭┵嗁嗀� 鬲丨鬲 鬲兀孬蹖乇 賯乇丕乇 禺賵丕賴賳丿 诏乇賮鬲',
+    deleteToolConfirmTitle: '丌蹖丕 丕蹖賳 丕亘夭丕乇 乇丕 丨匕賮 讴賳蹖丿責',
+    deleteToolConfirmContent: '丨匕賮 丕亘夭丕乇 睾蹖乇賯丕亘賱 亘丕夭诏卮鬲 丕爻鬲. 讴丕乇亘乇丕賳 丿蹖诏乇 賯丕丿乇 亘賴 丿爻鬲乇爻蹖 亘賴 丕亘夭丕乇 卮賲丕 賳禺賵丕賴賳丿 亘賵丿.',
+  },
+  test: {
+    title: '丌夭賲丕蹖卮',
+    parametersValue: '倬丕乇丕賲鬲乇賴丕 賵 賲賯丿丕乇',
+    parameters: '倬丕乇丕賲鬲乇賴丕',
+    value: '賲賯丿丕乇',
+    testResult: '賳鬲丕蹖噩 丌夭賲丕蹖卮',
+    testResultPlaceholder: '賳鬲蹖噩賴 丌夭賲丕蹖卮 丿乇 丕蹖賳噩丕 賳賲丕蹖卮 丿丕丿賴 賲蹖鈥屫促堌�',
+  },
+  thought: {
+    using: '丿乇 丨丕賱 丕爻鬲賮丕丿賴',
+    used: '丕爻鬲賮丕丿賴 卮丿賴',
+    requestTitle: '丿乇禺賵丕爻鬲 亘賴',
+    responseTitle: '倬丕爻禺 丕夭',
+  },
+  setBuiltInTools: {
+    info: '丕胤賱丕毓丕鬲',
+    setting: '鬲賳馗蹖賲丕鬲',
+    toolDescription: '鬲賵囟蹖丨丕鬲 丕亘夭丕乇',
+    parameters: '倬丕乇丕賲鬲乇賴丕',
+    string: '乇卮鬲賴',
+    number: '毓丿丿',
+    required: '丕賱夭丕賲蹖',
+    infoAndSetting: '丕胤賱丕毓丕鬲 賵 鬲賳馗蹖賲丕鬲',
+    file: '賮丕蹖賱',
+  },
+  noCustomTool: {
+    title: '丕亘夭丕乇 爻賮丕乇卮蹖 賵噩賵丿 賳丿丕乇丿!',
+    content: '丕亘夭丕乇賴丕蹖 爻賮丕乇卮蹖 禺賵丿 乇丕 丿乇 丕蹖賳噩丕 丕囟丕賮賴 賵 賲丿蹖乇蹖鬲 讴賳蹖丿 鬲丕 亘乇賳丕賲賴鈥屬囏й� 賴賵卮 賲氐賳賵毓蹖 亘爻丕夭蹖丿.',
+    createTool: '丕蹖噩丕丿 丕亘夭丕乇',
+  },
+  noSearchRes: {
+    title: '賲鬲兀爻賮蹖賲貙 賳鬲蹖噩賴鈥屫й� 倬蹖丿丕 賳卮丿!',
+    content: '賲丕 賳鬲賵丕賳爻鬲蹖賲 丕亘夭丕乇賴丕蹖蹖 讴賴 亘丕 噩爻鬲噩賵蹖 卮賲丕 賲胤丕亘賯鬲 丿丕卮鬲賴 亘丕卮丿 倬蹖丿丕 讴賳蹖賲.',
+    reset: '亘丕夭賳卮丕賳蹖 噩爻鬲噩賵',
+  },
+  builtInPromptTitle: '倬乇丕賲倬鬲',
+  toolRemoved: '丕亘夭丕乇 丨匕賮 卮丿',
+  notAuthorized: '丕亘夭丕乇 賲噩賵夭 賳丿丕乇丿',
+  howToGet: '趩诏賵賳賴 丿乇蹖丕賮鬲 讴賳蹖丿',
+  openInStudio: '亘丕夭 讴乇丿賳 丿乇 丕爻鬲賵丿蹖賵',
+  toolNameUsageTip: '賳丕賲 賮乇丕禺賵丕賳蹖 丕亘夭丕乇 亘乇丕蹖 丕爻鬲丿賱丕賱 賵 倬乇丕賲倬鬲鈥屬囏й� 毓丕賲賱',
+  copyToolName: '讴倬蹖 賳丕賲',
+  noTools: '賴蹖趩 丕亘夭丕乇蹖 蹖丕賮鬲 賳卮丿',
+}
+
+export default translation
diff --git a/i18n/fa-IR/workflow.ts b/i18n/fa-IR/workflow.ts
new file mode 100644
index 0000000..6b887b1
--- /dev/null
+++ b/i18n/fa-IR/workflow.ts
@@ -0,0 +1,921 @@
+const translation = {
+  common: {
+    undo: '亘丕夭诏卮鬲',
+    redo: '倬蹖卮乇賮鬲',
+    editing: '賵蹖乇丕蹖卮',
+    autoSaved: '匕禺蹖乇賴 禺賵丿讴丕乇',
+    unpublished: '賲賳鬲卮乇 賳卮丿賴',
+    published: '賲賳鬲卮乇 卮丿賴',
+    publish: '丕賳鬲卮丕乇',
+    update: '亘賴鈥屫辟堌藏必池з嗃�',
+    run: '丕噩乇丕',
+    running: '丿乇 丨丕賱 丕噩乇丕',
+    inRunMode: '丿乇 丨丕賱鬲 丕噩乇丕',
+    inPreview: '丿乇 倬蹖卮鈥屬嗁呚й屫�',
+    inPreviewMode: '丿乇 丨丕賱鬲 倬蹖卮鈥屬嗁呚й屫�',
+    preview: '倬蹖卮鈥屬嗁呚й屫�',
+    viewRunHistory: '賲卮丕賴丿賴 鬲丕乇蹖禺趩賴 丕噩乇丕',
+    runHistory: '鬲丕乇蹖禺趩賴 丕噩乇丕',
+    goBackToEdit: '亘丕夭诏卮鬲 亘賴 賵蹖乇丕蹖卮诏乇',
+    conversationLog: '诏夭丕乇卮 賲讴丕賱賲丕鬲',
+    features: '賵蹖跇诏蹖鈥屬囏�',
+    debugAndPreview: '倬蹖卮鈥屬嗁呚й屫�',
+    restart: '乇丕賴鈥屫з嗀ж槽� 賲噩丿丿',
+    currentDraft: '倬蹖卮鈥屬嗁堐屫� 賮毓賱蹖',
+    currentDraftUnpublished: '倬蹖卮鈥屬嗁堐屫� 賮毓賱蹖 賲賳鬲卮乇 賳卮丿賴',
+    latestPublished: '丌禺乇蹖賳 賳爻禺賴 賲賳鬲卮乇 卮丿賴',
+    publishedAt: '賲賳鬲卮乇 卮丿賴',
+    restore: '亘丕夭蹖丕亘蹖',
+    runApp: '丕噩乇丕蹖 丕倬賱蹖讴蹖卮賳',
+    batchRunApp: '丕噩乇丕蹖 丿爻鬲賴鈥屫й� 丕倬賱蹖讴蹖卮賳',
+    accessAPIReference: '丿爻鬲乇爻蹖 亘賴 賲爻鬲賳丿丕鬲 API',
+    embedIntoSite: '丿乇噩 丿乇 爻丕蹖鬲',
+    addTitle: '丕賮夭賵丿賳 毓賳賵丕賳...',
+    addDescription: '丕賮夭賵丿賳 鬲賵囟蹖丨丕鬲...',
+    noVar: '賴蹖趩 賲鬲睾蹖乇蹖',
+    searchVar: '噩爻鬲噩賵蹖 賲鬲睾蹖乇',
+    variableNamePlaceholder: '賳丕賲 賲鬲睾蹖乇',
+    setVarValuePlaceholder: '鬲賳馗蹖賲 賲鬲睾蹖乇',
+    needConnectTip: '丕蹖賳 賲乇丨賱賴 亘賴 賴蹖趩 趩蹖夭蹖 賲鬲氐賱 賳蹖爻鬲',
+    maxTreeDepth: '丨丿丕讴孬乇 毓賲賯 {{depth}} 賳賵丿 丿乇 賴乇 卮丕禺賴',
+    needEndNode: '亘賱賵讴 倬丕蹖丕賳 亘丕蹖丿 丕囟丕賮賴 卮賵丿',
+    needAnswerNode: '亘賱賵讴 倬丕爻禺 亘丕蹖丿 丕囟丕賮賴 卮賵丿',
+    workflowProcess: '賮乇丌蹖賳丿 噩乇蹖丕賳 讴丕乇',
+    notRunning: '賴賳賵夭 丿乇 丨丕賱 丕噩乇丕 賳蹖爻鬲',
+    previewPlaceholder: '賲丨鬲賵丕 乇丕 丿乇 讴丕丿乇 夭蹖乇 賵丕乇丿 讴賳蹖丿 鬲丕 丕卮讴丕賱鈥屫藏й屰� 趩鬲鈥屫ㄘж� 乇丕 卮乇賵毓 讴賳蹖丿',
+    effectVarConfirm: {
+      title: '丨匕賮 賲鬲睾蹖乇',
+      content: '賲鬲睾蹖乇 丿乇 賳賵丿賴丕蹖 丿蹖诏乇 丕爻鬲賮丕丿賴 卮丿賴 丕爻鬲. 丌蹖丕 賴賲趩賳丕賳 賲蹖鈥屫堌з囒屫� 丌賳 乇丕 丨匕賮 讴賳蹖丿責',
+    },
+    insertVarTip: '亘乇丕蹖 丿乇噩 爻乇蹖毓 讴賱蹖丿 \'/\' 乇丕 賮卮丕乇 丿賴蹖丿',
+    processData: '倬乇丿丕夭卮 丿丕丿賴鈥屬囏�',
+    input: '賵乇賵丿蹖',
+    output: '禺乇賵噩蹖',
+    jinjaEditorPlaceholder: '亘乇丕蹖 丿乇噩 賲鬲睾蹖乇 \'/\' 蹖丕 \'{\' 乇丕 鬲丕蹖倬 讴賳蹖丿',
+    viewOnly: '賮賯胤 賲卮丕賴丿賴',
+    showRunHistory: '賳賲丕蹖卮 鬲丕乇蹖禺趩賴 丕噩乇丕',
+    enableJinja: '賮毓丕賱鈥屫池ж槽� 倬卮鬲蹖亘丕賳蹖 丕夭 丕賱诏賵賴丕蹖 Jinja',
+    learnMore: '丕胤賱丕毓丕鬲 亘蹖卮鬲乇',
+    copy: '讴倬蹖',
+    duplicate: '鬲讴乇丕乇',
+    addBlock: '丕賮夭賵丿賳 亘賱賵讴',
+    pasteHere: '趩爻亘丕賳丿賳 丕蹖賳噩丕',
+    pointerMode: '丨丕賱鬲 丕卮丕乇賴鈥屭�',
+    handMode: '丨丕賱鬲 丿爻鬲',
+    model: '賲丿賱',
+    workflowAsTool: '噩乇蹖丕賳 讴丕乇 亘賴 毓賳賵丕賳 丕亘夭丕乇',
+    configureRequired: '倬蹖讴乇亘賳丿蹖 賲賵乇丿 賳蹖丕夭',
+    configure: '倬蹖讴乇亘賳丿蹖',
+    manageInTools: '賲丿蹖乇蹖鬲 丿乇 丕亘夭丕乇賴丕',
+    workflowAsToolTip: '倬蹖讴乇亘賳丿蹖 丕亘夭丕乇 倬爻 丕夭 亘賴鈥屫辟堌藏必池з嗃� 噩乇蹖丕賳 讴丕乇 賲賵乇丿 賳蹖丕夭 丕爻鬲.',
+    viewDetailInTracingPanel: '賲卮丕賴丿賴 噩夭卅蹖丕鬲',
+    syncingData: '賴賲诏丕賲鈥屫池ж槽� 丿丕丿賴鈥屬囏ж� 賮賯胤 趩賳丿 孬丕賳蹖賴',
+    importDSL: '賵丕乇丿 讴乇丿賳 DSL',
+    importDSLTip: '倬蹖卮鈥屬嗁堐屫� 賮毓賱蹖 亘乇 乇賵蹖 賴賲 賳賵卮鬲賴 禺賵丕賴丿 卮丿. 賯亘賱 丕夭 賵丕乇丿 讴乇丿賳貙 噩乇蹖丕賳 讴丕乇 乇丕 亘賴 毓賳賵丕賳 賳爻禺賴 倬卮鬲蹖亘丕賳 氐丕丿乇 讴賳蹖丿.',
+    backupCurrentDraft: '倬卮鬲蹖亘丕賳鈥屭屫臂� 丕夭 倬蹖卮鈥屬嗁堐屫� 賮毓賱蹖',
+    chooseDSL: '丕賳鬲禺丕亘 賮丕蹖賱 DSL(yml)',
+    overwriteAndImport: '亘丕夭賳賵蹖爻蹖 賵 賵丕乇丿 讴乇丿賳',
+    importFailure: '禺胤丕 丿乇 賵丕乇丿 讴乇丿賳',
+    importSuccess: '賵丕乇丿 讴乇丿賳 賲賵賮賯蹖鬲鈥屫①呟屫�',
+    parallelTip: {
+      click: {
+        title: '讴賱蹖讴 讴賳蹖丿',
+        desc: '丕囟丕賮賴 讴乇丿賳',
+      },
+      drag: {
+        desc: '亘乇丕蹖 丕鬲氐丕賱',
+        title: '讴卮蹖丿賳',
+      },
+      depthLimit: '丨丿 賱丕蹖賴 鬲賵丿乇鬲賵 賲賵丕夭蹖 賱丕蹖賴 賴丕蹖 {{num}}',
+      limit: '賲賵丕夭蹖 爻丕夭蹖 亘賴 卮丕禺賴 賴丕蹖 {{num}} 賲丨丿賵丿 賲蹖 卮賵丿.',
+    },
+    disconnect: '賯胤毓',
+    jumpToNode: '倬乇卮 亘賴 丕蹖賳 诏乇賴',
+    parallelRun: '丕噩乇丕蹖 賲賵丕夭蹖',
+    addParallelNode: '丕賮夭賵丿賳 诏乇賴 賲賵丕夭蹖',
+    parallel: '賲賵丕夭蹖',
+    branch: '卮丕禺賴',
+    featuresDocLink: '亘蹖卮鬲乇 亘丿丕賳蹖丿',
+    featuresDescription: '亘賴亘賵丿 鬲噩乇亘賴 讴丕乇亘乇蹖 亘乇賳丕賲賴 賵亘',
+    ImageUploadLegacyTip: '丕讴賳賵賳 賲蹖 鬲賵丕賳蹖丿 賲鬲睾蹖乇賴丕蹖 賳賵毓 賮丕蹖賱 乇丕 丿乇 賮乇賲 卮乇賵毓 丕蹖噩丕丿 讴賳蹖丿. 賲丕 丿蹖诏乇 丕夭 賵蹖跇诏蹖 丌倬賱賵丿 鬲氐賵蹖乇 丿乇 丌蹖賳丿賴 倬卮鬲蹖亘丕賳蹖 賳禺賵丕賴蹖賲 讴乇丿.',
+    fileUploadTip: '賵蹖跇诏蹖 賴丕蹖 丌倬賱賵丿 鬲氐賵蹖乇 亘乇丕蹖 丌倬賱賵丿 賮丕蹖賱 丕乇鬲賯丕 蹖丕賮鬲賴 丕爻鬲.',
+    importWarning: '丕丨鬲蹖丕胤',
+    importWarningDetails: '鬲賮丕賵鬲 賳爻禺賴 DSL 賲賲讴賳 丕爻鬲 亘乇 賵蹖跇诏蹖 賴丕蹖 禺丕氐蹖 鬲兀孬蹖乇 亘诏匕丕乇丿',
+    openInExplore: '亘丕夭 讴乇丿賳 丿乇 讴丕賵卮',
+    onFailure: '丿乇 賲賵乇丿 卮讴爻鬲',
+    addFailureBranch: '丕賮夭賵丿賳 亘乇賳趩 Fail',
+    noHistory: '亘丿賵賳 鬲丕乇蹖禺趩賴',
+    loadMore: '亘丕乇诏匕丕乇蹖 诏乇丿卮 讴丕乇 亘蹖卮鬲乇',
+    exportPNG: '氐丕丿乇丕鬲 亘賴 賮乇賲鬲 PNG',
+    noExist: '賴蹖趩诏賵賳賴 賲鬲睾蹖乇蹖 賵噩賵丿 賳丿丕乇丿',
+    exitVersions: '賳爻禺賴鈥屬囏й� 禺乇賵噩蹖',
+    referenceVar: '賲鬲睾蹖乇 賲乇噩毓',
+    exportSVG: '氐丕丿乇丕鬲 亘賴 賮乇賲鬲 SVG',
+    exportJPEG: '氐丕丿乇丕鬲 亘賴 賮乇賲鬲 JPEG',
+    exportImage: '鬲氐賵蹖乇 乇丕 氐丕丿乇 讴賳蹖丿',
+    versionHistory: '鬲丕乇蹖禺趩賴 賳爻禺賴',
+    publishUpdate: '亘賴鈥屫辟堌藏必池з嗃� 賲賳鬲卮乇 讴賳蹖丿',
+  },
+  env: {
+    envPanelTitle: '賲鬲睾蹖乇賴丕蹖 賲丨蹖胤蹖',
+    envDescription: '賲鬲睾蹖乇賴丕蹖 賲丨蹖胤蹖 賲蹖鈥屫堌з嗁嗀� 亘乇丕蹖 匕禺蹖乇賴 丕胤賱丕毓丕鬲 禺氐賵氐蹖 賵 丕毓鬲亘丕乇賳丕賲賴鈥屬囏� 丕爻鬲賮丕丿賴 卮賵賳丿. 丌賳賴丕 賮賯胤 禺賵丕賳丿賳蹖 賴爻鬲賳丿 賵 賲蹖鈥屫堌з嗁嗀� 丿乇 丨蹖賳 氐丕丿乇 讴乇丿賳 丕夭 賮丕蹖賱 DSL 噩丿丕 卮賵賳丿.',
+    envPanelButton: '丕賮夭賵丿賳 賲鬲睾蹖乇',
+    modal: {
+      title: '丕賮夭賵丿賳 賲鬲睾蹖乇 賲丨蹖胤蹖',
+      editTitle: '賵蹖乇丕蹖卮 賲鬲睾蹖乇 賲丨蹖胤蹖',
+      type: '賳賵毓',
+      name: '賳丕賲',
+      namePlaceholder: '賳丕賲 賲鬲睾蹖乇',
+      value: '賲賯丿丕乇',
+      valuePlaceholder: '賲賯丿丕乇 賲鬲睾蹖乇',
+      secretTip: '亘乇丕蹖 鬲毓乇蹖賮 丕胤賱丕毓丕鬲 丨爻丕爻 蹖丕 丿丕丿賴鈥屬囏ж� 亘丕 鬲賳馗蹖賲丕鬲 DSL 亘乇丕蹖 噩賱賵诏蹖乇蹖 丕夭 賳卮鬲 倬蹖讴乇亘賳丿蹖 卮丿賴 丕爻鬲.',
+    },
+    export: {
+      title: '丌蹖丕 賲鬲睾蹖乇賴丕蹖 賲丨蹖胤蹖 賲禺賮蹖 乇丕 氐丕丿乇 讴賳蹖丿責',
+      checkbox: '氐丕丿乇 讴乇丿賳 賲賯丕丿蹖乇 賲禺賮蹖',
+      ignore: '氐丕丿乇 讴乇丿賳 DSL',
+      export: '氐丕丿乇 讴乇丿賳 DSL 亘丕 賲賯丕丿蹖乇 賲禺賮蹖',
+    },
+  },
+  chatVariable: {
+    panelTitle: '賲鬲睾蹖乇賴丕蹖 賲讴丕賱賲賴',
+    panelDescription: '賲鬲睾蹖乇賴丕蹖 賲讴丕賱賲賴 亘乇丕蹖 匕禺蹖乇賴 丕胤賱丕毓丕鬲 鬲毓丕賲賱蹖 讴賴 LLM 賳蹖丕夭 亘賴 蹖丕丿丌賵乇蹖 丿丕乇丿 丕爻鬲賮丕丿賴 賲蹖鈥屫促堎嗀� 丕夭 噩賲賱賴 鬲丕乇蹖禺趩賴 賲讴丕賱賲賴貙 賮丕蹖賱鈥屬囏й� 丌倬賱賵丿 卮丿賴 賵 鬲乇噩蹖丨丕鬲 讴丕乇亘乇. 丌賳賴丕 賯丕亘賱 禺賵丕賳丿賳 賵 賳賵卮鬲賳 賴爻鬲賳丿.',
+    docLink: '亘乇丕蹖 丕胤賱丕毓丕鬲 亘蹖卮鬲乇 亘賴 賲爻鬲賳丿丕鬲 賲丕 賲乇丕噩毓賴 讴賳蹖丿.',
+    button: '丕賮夭賵丿賳 賲鬲睾蹖乇',
+    modal: {
+      title: '丕賮夭賵丿賳 賲鬲睾蹖乇 賲讴丕賱賲賴',
+      editTitle: '賵蹖乇丕蹖卮 賲鬲睾蹖乇 賲讴丕賱賲賴',
+      name: '賳丕賲',
+      namePlaceholder: '賳丕賲 賲鬲睾蹖乇',
+      type: '賳賵毓',
+      value: '賲賯丿丕乇 倬蹖卮鈥屬佖必�',
+      valuePlaceholder: '賲賯丿丕乇 倬蹖卮鈥屬佖必敦� 亘乇丕蹖 毓丿賲 鬲賳馗蹖賲 禺丕賱蹖 亘诏匕丕乇蹖丿',
+      description: '鬲賵囟蹖丨丕鬲',
+      descriptionPlaceholder: '賲鬲睾蹖乇 乇丕 鬲賵氐蹖賮 讴賳蹖丿',
+      editInJSON: '賵蹖乇丕蹖卮 丿乇 JSON',
+      oneByOne: '丕賮夭賵丿賳 蹖讴蹖 蹖讴蹖',
+      editInForm: '賵蹖乇丕蹖卮 丿乇 賮乇賲',
+      arrayValue: '賲賯丿丕乇',
+      addArrayValue: '丕賮夭賵丿賳 賲賯丿丕乇',
+      objectKey: '讴賱蹖丿',
+      objectType: '賳賵毓',
+      objectValue: '賲賯丿丕乇 倬蹖卮鈥屬佖必�',
+    },
+    storedContent: '賲丨鬲賵丕蹖 匕禺蹖乇賴 卮丿賴',
+    updatedAt: '亘賴鈥屫辟堌藏必池з嗃� 卮丿賴 丿乇 ',
+  },
+  changeHistory: {
+    title: '鬲丕乇蹖禺趩賴 鬲睾蹖蹖乇丕鬲',
+    placeholder: '賴賳賵夭 鬲睾蹖蹖乇蹖 丕蹖噩丕丿 賳讴乇丿蹖丿',
+    clearHistory: '倬丕讴 讴乇丿賳 鬲丕乇蹖禺趩賴',
+    hint: '乇丕賴賳賲丕',
+    hintText: '毓賲賱蹖丕鬲 賵蹖乇丕蹖卮 卮賲丕 丿乇 鬲丕乇蹖禺趩賴 鬲睾蹖蹖乇丕鬲 倬蹖诏蹖乇蹖 賲蹖鈥屫促堌� 讴賴 亘乇丕蹖 賲丿鬲 丕蹖賳 噩賱爻賴 亘乇 乇賵蹖 丿爻鬲诏丕賴 卮賲丕 匕禺蹖乇賴 賲蹖鈥屫促堌�. 丕蹖賳 鬲丕乇蹖禺趩賴 賴賳诏丕賲 禺乇賵噩 丕夭 賵蹖乇丕蹖卮诏乇 倬丕讴 禺賵丕賴丿 卮丿.',
+    stepBackward_one: '{{count}} 賯丿賲 亘賴 毓賯亘',
+    stepBackward_other: '{{count}} 賯丿賲 亘賴 毓賯亘',
+    stepForward_one: '{{count}} 賯丿賲 亘賴 噩賱賵',
+    stepForward_other: '{{count}} 賯丿賲 亘賴 噩賱賵',
+    sessionStart: '卮乇賵毓 噩賱爻賴',
+    currentState: '賵囟毓蹖鬲 讴賳賵賳蹖',
+    nodeTitleChange: '毓賳賵丕賳 亘賱賵讴 鬲睾蹖蹖乇 讴乇丿賴 丕爻鬲',
+    nodeDescriptionChange: '鬲賵囟蹖丨丕鬲 亘賱賵讴 鬲睾蹖蹖乇 讴乇丿賴 丕爻鬲',
+    nodeDragStop: '亘賱賵讴 噩丕亘噩丕 卮丿賴 丕爻鬲',
+    nodeChange: '亘賱賵讴 鬲睾蹖蹖乇 讴乇丿賴 丕爻鬲',
+    nodeConnect: '亘賱賵讴 賲鬲氐賱 卮丿賴 丕爻鬲',
+    nodePaste: '亘賱賵讴 趩爻亘丕賳丿賴 卮丿賴 丕爻鬲',
+    nodeDelete: '亘賱賵讴 丨匕賮 卮丿賴 丕爻鬲',
+    nodeAdd: '亘賱賵讴 丕囟丕賮賴 卮丿賴 丕爻鬲',
+    nodeResize: '丕賳丿丕夭賴 亘賱賵讴 鬲睾蹖蹖乇 讴乇丿賴 丕爻鬲',
+    noteAdd: '蹖丕丿丿丕卮鬲 丕囟丕賮賴 卮丿賴 丕爻鬲',
+    noteChange: '蹖丕丿丿丕卮鬲 鬲睾蹖蹖乇 讴乇丿賴 丕爻鬲',
+    noteDelete: '蹖丕丿丿丕卮鬲 丨匕賮 卮丿賴 丕爻鬲',
+    edgeDelete: '亘賱賵讴 賯胤毓 卮丿賴 丕爻鬲',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 丕賱夭丕賲蹖 丕爻鬲',
+    authRequired: '丕丨乇丕夭 賴賵蹖鬲 囟乇賵乇蹖 丕爻鬲',
+    invalidJson: '{{field}} JSON 賲毓鬲亘乇 賳蹖爻鬲',
+    fields: {
+      variable: '賳丕賲 賲鬲睾蹖乇',
+      variableValue: '賲賯丿丕乇 賲鬲睾蹖乇',
+      code: '讴丿',
+      model: '賲丿賱',
+      rerankModel: '賲丿賱 賲噩丿丿 乇鬲亘賴鈥屫ㄙ嗀�',
+      visionVariable: '賲鬲睾蹖乇 亘蹖賳丕蹖蹖',
+    },
+    invalidVariable: '賲鬲睾蹖乇 賳丕賲毓鬲亘乇',
+    rerankModelRequired: '賯亘賱 丕夭 乇賵卮賳 讴乇丿賳 Rerank Model貙 賱胤賮丕 鬲兀蹖蹖丿 讴賳蹖丿 讴賴 賲丿賱 亘丕 賲賵賮賯蹖鬲 丿乇 鬲賳馗蹖賲丕鬲 倬蹖讴乇亘賳丿蹖 卮丿賴 丕爻鬲.',
+    noValidTool: '{{field}} 賴蹖趩 丕亘夭丕乇 賲毓鬲亘乇蹖 丕賳鬲禺丕亘 賳卮丿賴 丕爻鬲',
+    toolParameterRequired: '{{field}}: 倬丕乇丕賲鬲乇 [{{param}}] 賲賵乇丿 賳蹖丕夭 丕爻鬲',
+  },
+  singleRun: {
+    testRun: '丕噩乇丕蹖 丌夭賲丕蹖卮蹖',
+    startRun: '卮乇賵毓 丕噩乇丕',
+    running: '丿乇 丨丕賱 丕噩乇丕',
+    testRunIteration: '鬲讴乇丕乇 丕噩乇丕蹖 丌夭賲丕蹖卮蹖',
+    back: '亘丕夭诏卮鬲',
+    iteration: '鬲讴乇丕乇',
+    loop: '丨賱賯賴',
+  },
+  tabs: {
+    'searchBlock': '噩爻鬲噩賵蹖 亘賱賵讴',
+    'blocks': '亘賱賵讴鈥屬囏�',
+    'tools': '丕亘夭丕乇賴丕',
+    'allTool': '賴賲賴',
+    'builtInTool': '丿乇賵賳鈥屫池ж�',
+    'customTool': '爻賮丕乇卮蹖',
+    'workflowTool': '噩乇蹖丕賳 讴丕乇',
+    'question-understand': '丿乇讴 爻賵丕賱',
+    'logic': '賲賳胤賯',
+    'transform': '鬲亘丿蹖賱',
+    'utilities': '丕亘夭丕乇賴丕蹖 讴丕乇亘乇丿蹖',
+    'noResult': '賳鬲蹖噩賴鈥屫й� 倬蹖丿丕 賳卮丿',
+    'searchTool': '丕亘夭丕乇 噩爻鬲噩賵',
+    'plugin': '丕賮夭賵賳賴',
+    'agent': '丕爻鬲乇丕鬲跇蹖 賳賲丕蹖賳丿诏蹖',
+  },
+  blocks: {
+    'start': '卮乇賵毓',
+    'end': '倬丕蹖丕賳',
+    'answer': '倬丕爻禺',
+    'llm': '賲丿賱 夭亘丕賳 亘夭乇诏',
+    'knowledge-retrieval': '丕爻鬲禺乇丕噩 丿丕賳卮',
+    'question-classifier': '丿爻鬲賴鈥屫ㄙ嗀� 爻賵丕賱丕鬲',
+    'if-else': 'IF/ELSE',
+    'code': '讴丿',
+    'template-transform': '丕賱诏賵',
+    'http-request': '丿乇禺賵丕爻鬲 HTTP',
+    'variable-assigner': '鬲禺氐蹖氐鈥屫囐嗀� 賲鬲睾蹖乇',
+    'variable-aggregator': '鬲噩賲毓鈥屫囐嗀� 賲鬲睾蹖乇',
+    'assigner': '鬲禺氐蹖氐鈥屫囐嗀� 賲鬲睾蹖乇',
+    'iteration-start': '卮乇賵毓 鬲讴乇丕乇',
+    'iteration': '鬲讴乇丕乇',
+    'parameter-extractor': '丕爻鬲禺乇丕噩鈥屭┵嗁嗀� 倬丕乇丕賲鬲乇',
+    'list-operator': '毓賲賱诏乇 賱蹖爻鬲',
+    'document-extractor': '丕爻鬲禺乇丕噩 讴賳賳丿賴 爻賳丿',
+    'agent': '毓丕賲賱',
+    'loop-start': '卮乇賵毓 丨賱賯賴',
+    'loop-end': '禺乇賵噩 丕夭 丨賱賯賴',
+    'loop': '丨賱賯賴',
+  },
+  blocksAbout: {
+    'start': '倬丕乇丕賲鬲乇賴丕蹖 丕賵賱蹖賴 亘乇丕蹖 乇丕賴鈥屫з嗀ж槽� 噩乇蹖丕賳 讴丕乇 乇丕 鬲毓乇蹖賮 讴賳蹖丿',
+    'end': '倬丕蹖丕賳 賵 賳賵毓 賳鬲蹖噩賴 蹖讴 噩乇蹖丕賳 讴丕乇 乇丕 鬲毓乇蹖賮 讴賳蹖丿',
+    'answer': '賲丨鬲賵丕蹖 倬丕爻禺 賲讴丕賱賲賴 趩鬲 乇丕 鬲毓乇蹖賮 讴賳蹖丿',
+    'llm': '丕爻鬲賮丕丿賴 丕夭 賲丿賱鈥屬囏й� 夭亘丕賳 亘夭乇诏 亘乇丕蹖 倬丕爻禺 亘賴 爻賵丕賱丕鬲 蹖丕 倬乇丿丕夭卮 夭亘丕賳 胤亘蹖毓蹖',
+    'knowledge-retrieval': '丕噩丕夭賴 賲蹖鈥屫囏� 鬲丕 賲丨鬲賵丕蹖 賲鬲賳蹖 賲乇鬲亘胤 亘丕 爻賵丕賱丕鬲 讴丕乇亘乇 丕夭 丿丕賳卮 丕爻鬲禺乇丕噩 卮賵丿',
+    'question-classifier': '卮乇丕蹖胤 丿爻鬲賴鈥屫ㄙ嗀� 爻賵丕賱丕鬲 讴丕乇亘乇 乇丕 鬲毓乇蹖賮 讴賳蹖丿貙 賲丿賱 夭亘丕賳 亘夭乇诏 賲蹖鈥屫堌з嗀� 亘乇 丕爻丕爻 鬲賵囟蹖丨丕鬲 丿爻鬲賴鈥屫ㄙ嗀屫� 賳丨賵賴 倬蹖卮乇賮鬲 賲讴丕賱賲賴 乇丕 鬲毓乇蹖賮 讴賳丿',
+    'if-else': '丕噩丕夭賴 賲蹖鈥屫囏� 鬲丕 噩乇蹖丕賳 讴丕乇 亘賴 丿賵 卮丕禺賴 亘乇 丕爻丕爻 卮乇丕蹖胤 if/else 鬲賯爻蹖賲 卮賵丿',
+    'code': '丕噩乇丕蹖 蹖讴 賯胤毓賴 讴丿 Python 蹖丕 NodeJS 亘乇丕蹖 倬蹖丕丿賴鈥屫池ж槽� 賲賳胤賯 爻賮丕乇卮蹖',
+    'template-transform': '鬲亘丿蹖賱 丿丕丿賴鈥屬囏� 亘賴 乇卮鬲賴 亘丕 丕爻鬲賮丕丿賴 丕夭 爻蹖賳鬲丕讴爻 丕賱诏賵賴丕蹖 Jinja',
+    'http-request': '丕噩丕夭賴 賲蹖鈥屫囏� 鬲丕 丿乇禺賵丕爻鬲鈥屬囏й� 爻乇賵乇 丕夭 胤乇蹖賯 倬乇賵鬲讴賱 HTTP 丕乇爻丕賱 卮賵賳丿',
+    'variable-assigner': '鬲噩賲毓 賲鬲睾蹖乇賴丕蹖 趩賳丿 卮丕禺賴鈥屫й� 亘賴 蹖讴 賲鬲睾蹖乇 賵丕丨丿 亘乇丕蹖 倬蹖讴乇亘賳丿蹖 蹖讴倬丕乇趩賴 賳賵丿賴丕蹖 倬丕蹖蹖賳鈥屫池�.',
+    'assigner': '诏乇賴 鬲禺氐蹖氐 賲鬲睾蹖乇 亘乇丕蹖 丕禺鬲氐丕氐 賲賯丕丿蹖乇 亘賴 賲鬲睾蹖乇賴丕蹖 賯丕亘賱 賳賵卮鬲賳 (賲丕賳賳丿 賲鬲睾蹖乇賴丕蹖 賲讴丕賱賲賴) 丕爻鬲賮丕丿賴 賲蹖鈥屫促堌�.',
+    'variable-aggregator': '鬲噩賲毓 賲鬲睾蹖乇賴丕蹖 趩賳丿 卮丕禺賴鈥屫й� 亘賴 蹖讴 賲鬲睾蹖乇 賵丕丨丿 亘乇丕蹖 倬蹖讴乇亘賳丿蹖 蹖讴倬丕乇趩賴 賳賵丿賴丕蹖 倬丕蹖蹖賳鈥屫池�.',
+    'iteration': '丕噩乇丕蹖 趩賳丿蹖賳 賲乇丨賱賴 乇賵蹖 蹖讴 卮蹖亍 賱蹖爻鬲 鬲丕 賴賲賴 賳鬲丕蹖噩 禺乇賵噩蹖 丿丕丿賴 卮賵賳丿.',
+    'parameter-extractor': '丕爻鬲賮丕丿賴 丕夭 賲丿賱 夭亘丕賳 亘夭乇诏 亘乇丕蹖 丕爻鬲禺乇丕噩 倬丕乇丕賲鬲乇賴丕蹖 爻丕禺鬲丕乇蹖 丕夭 夭亘丕賳 胤亘蹖毓蹖 亘乇丕蹖 賮乇丕禺賵丕賳蹖 丕亘夭丕乇賴丕 蹖丕 丿乇禺賵丕爻鬲鈥屬囏й� HTTP.',
+    'list-operator': '亘乇丕蹖 賮蹖賱鬲乇 讴乇丿賳 蹖丕 賲乇鬲亘 爻丕夭蹖 賲丨鬲賵丕蹖 丌乇丕蹖賴 丕爻鬲賮丕丿賴 賲蹖 卮賵丿.',
+    'document-extractor': '亘乇丕蹖 鬲噩夭蹖賴 丕爻賳丕丿 丌倬賱賵丿 卮丿賴 亘賴 賲丨鬲賵丕蹖 賲鬲賳蹖 丕爻鬲賮丕丿賴 賲蹖 卮賵丿 讴賴 亘賴 乇丕丨鬲蹖 鬲賵爻胤 LLM 賯丕亘賱 丿乇讴 丕爻鬲.',
+    'agent': '賮乇丕禺賵丕賳蹖 賲丿賱 賴丕蹖 夭亘丕賳 亘夭乇诏 亘乇丕蹖 倬丕爻禺 亘賴 爻賵丕賱丕鬲 蹖丕 倬乇丿丕夭卮 夭亘丕賳 胤亘蹖毓蹖',
+    'loop-end': '賲毓丕丿賱 "卮讴爻鬲賳". 丕蹖賳 诏乇賴 賴蹖趩 賲賵乇丿 倬蹖讴乇亘賳丿蹖 賳丿丕乇丿. 賴賳诏丕賲蹖 讴賴 亘丿賳賴 丨賱賯賴 亘賴 丕蹖賳 诏乇賴 賲蹖鈥屫必池� 丨賱賯賴 賲鬲賵賯賮 賲蹖鈥屫促堌�.',
+    'loop': '蹖讴 丨賱賯賴 賲賳胤賯蹖 乇丕 丕噩乇丕 讴賳蹖丿 鬲丕 夭賲丕賳蹖 讴賴 卮乇丕蹖胤 禺丕鬲賲賴 亘乇丌賵乇丿賴 卮賵丿 蹖丕 丨丿丕讴孬乇 鬲毓丿丕丿 丨賱賯賴 亘賴 倬丕蹖丕賳 亘乇爻丿.',
+  },
+  operator: {
+    zoomIn: '亘夭乇诏鈥屬嗁呚й屰�',
+    zoomOut: '讴賵趩讴鈥屬嗁呚й屰�',
+    zoomTo50: '亘夭乇诏鈥屬嗁呚й屰� 亘賴 50%',
+    zoomTo100: '亘夭乇诏鈥屬嗁呚й屰� 亘賴 100%',
+    zoomToFit: '鬲賳丕爻亘 亘丕 丕賳丿丕夭賴',
+  },
+  panel: {
+    userInputField: '賮蹖賱丿 賵乇賵丿蹖 讴丕乇亘乇',
+    changeBlock: '鬲睾蹖蹖乇 亘賱賵讴',
+    helpLink: '賱蹖賳讴 讴賲讴',
+    about: '丿乇亘丕乇賴',
+    createdBy: '爻丕禺鬲賴 卮丿賴 鬲賵爻胤',
+    nextStep: '賲乇丨賱賴 亘毓丿蹖',
+    addNextStep: '丕賮夭賵丿賳 亘賱賵讴 亘毓丿蹖 亘賴 丕蹖賳 噩乇蹖丕賳 讴丕乇',
+    selectNextStep: '丕賳鬲禺丕亘 亘賱賵讴 亘毓丿蹖',
+    runThisStep: '丕噩乇丕 讴乇丿賳 丕蹖賳 賲乇丨賱賴',
+    checklist: '趩讴鈥屬勠屫池�',
+    checklistTip: '丕胤賲蹖賳丕賳 丨丕氐賱 讴賳蹖丿 讴賴 賴賲賴 賲爻丕卅賱 賯亘賱 丕夭 丕賳鬲卮丕乇 丨賱 卮丿賴鈥屫з嗀�',
+    checklistResolved: '鬲賲丕賲 賲爻丕卅賱 丨賱 卮丿賴鈥屫з嗀�',
+    organizeBlocks: '爻丕夭賲丕賳丿賴蹖 亘賱賵讴鈥屬囏�',
+    change: '鬲睾蹖蹖乇',
+    optional: '(丕禺鬲蹖丕乇蹖)',
+  },
+  nodes: {
+    common: {
+      outputVars: '賲鬲睾蹖乇賴丕蹖 禺乇賵噩蹖',
+      insertVarTip: '丿乇噩 賲鬲睾蹖乇',
+      memory: {
+        memory: '丨丕賮馗賴',
+        memoryTip: '鬲賳馗蹖賲丕鬲 丨丕賮馗賴 趩鬲',
+        windowSize: '丕賳丿丕夭賴 倬賳噩乇賴',
+        conversationRoleName: '賳丕賲 賳賯卮 賲讴丕賱賲賴',
+        user: '倬蹖卮賵賳丿 讴丕乇亘乇',
+        assistant: '倬蹖卮賵賳丿 丿爻鬲蹖丕乇',
+      },
+      memories: {
+        title: '丨丕賮馗賴鈥屬囏�',
+        tip: '丨丕賮馗賴 趩鬲',
+        builtIn: '丿乇賵賳鈥屫池ж�',
+      },
+      errorHandle: {
+        none: {
+          title: '賴蹖趩 讴丿丕賲',
+          desc: '丕诏乇 蹖讴 丕爻鬲孬賳丕 乇禺 丿賴丿 賵 賲丿蹖乇蹖鬲 賳卮賵丿貙 诏乇賴 丕夭 讴丕乇 賲蹖 丕賮鬲丿',
+        },
+        defaultValue: {
+          title: '賲賯丿丕乇 倬蹖卮 賮乇囟',
+          output: '賲賯丿丕乇 倬蹖卮 賮乇囟 禺乇賵噩蹖',
+          tip: '丿乇 氐賵乇鬲 禺胤丕貙 亘賴 夭蹖乇 賲賯丿丕乇 亘乇賲蹖 诏乇丿丿.',
+          inLog: '丕爻鬲孬賳丕蹖 诏乇賴貙 禺乇賵噩蹖 亘乇 丕爻丕爻 賲賯丕丿蹖乇 倬蹖卮 賮乇囟.',
+          desc: '賴賳诏丕賲蹖 讴賴 禺胤丕蹖蹖 乇禺 賲蹖 丿賴丿貙 蹖讴 賲丨鬲賵丕蹖 禺乇賵噩蹖 孬丕亘鬲 乇丕 賲卮禺氐 讴賳蹖丿.',
+        },
+        failBranch: {
+          title: '卮丕禺賴 Fail',
+          desc: '賴賳诏丕賲蹖 讴賴 禺胤丕蹖蹖 乇禺 賲蹖 丿賴丿貙 卮丕禺賴 丕爻鬲孬賳丕 乇丕 丕噩乇丕 賲蹖 讴賳丿',
+          customize: '亘乇丕蹖 爻賮丕乇卮蹖 讴乇丿賳 賲賳胤賯 亘乇賳趩 fail 亘賴 亘賵賲 亘乇賵蹖丿.',
+          inLog: 'Node exception貙 亘賴 胤賵乇 禺賵丿讴丕乇 卮丕禺賴 fail 乇丕 丕噩乇丕 賲蹖 讴賳丿. 禺乇賵噩蹖 诏乇賴 蹖讴 賳賵毓 禺胤丕 賵 倬蹖丕賲 禺胤丕 乇丕 亘乇賲蹖 诏乇丿丕賳丿 賵 丌賳賴丕 乇丕 亘賴 倬丕蹖蹖賳 丿爻鬲 丕乇爻丕賱 賲蹖 讴賳丿.',
+          customizeTip: '賴賳诏丕賲蹖 讴賴 卮丕禺賴 fail 賮毓丕賱 賲蹖 卮賵丿貙 丕爻鬲孬賳丕卅丕鬲 倬乇鬲丕亘 卮丿賴 鬲賵爻胤 诏乇賴 賴丕 賮乇丌蹖賳丿 乇丕 禺丕鬲賲賴 賳賲蹖 丿賴賳丿. 丿乇 毓賵囟貙 亘賴 胤賵乇 禺賵丿讴丕乇 卮丕禺賴 卮讴爻鬲 丕夭 倬蹖卮 鬲毓乇蹖賮 卮丿賴 乇丕 丕噩乇丕 賲蹖 讴賳丿 賵 亘賴 卮賲丕 丕賲讴丕賳 賲蹖 丿賴丿 倬蹖丕賲 賴丕蹖 禺胤丕貙 诏夭丕乇卮 賴丕貙 丕氐賱丕丨丕鬲 蹖丕 倬乇卮 丕夭 丕賯丿丕賲丕鬲 乇丕 亘賴 胤賵乇 丕賳毓胤丕賮 倬匕蹖乇 丕乇丕卅賴 丿賴蹖丿.',
+        },
+        partialSucceeded: {
+          tip: '诏乇賴 賴丕蹖 {{num}} 丿乇 丕蹖賳 賮乇丌蹖賳丿 賵噩賵丿 丿丕乇賳丿 讴賴 亘賴 胤賵乇 睾蹖乇毓丕丿蹖 丕噩乇丕 賲蹖 卮賵賳丿貙 賱胤賮丕 亘乇丕蹖 亘乇乇爻蹖 爻蹖丕賴賴賴丕 亘賴 乇丿蹖丕亘蹖 亘乇賵蹖丿.',
+        },
+        title: '賲丿蹖乇蹖鬲 禺胤丕',
+        tip: '丕爻鬲乇丕鬲跇蹖 賲丿蹖乇蹖鬲 丕爻鬲孬賳丕貙 夭賲丕賳蹖 讴賴 蹖讴 诏乇賴 亘丕 蹖讴 丕爻鬲孬賳丕 賲賵丕噩賴 賲蹖 卮賵丿貙 賮毓丕賱 賲蹖 卮賵丿.',
+      },
+      retry: {
+        times: '亘丕乇',
+        retryInterval: '賮丕氐賱賴 鬲賱丕卮 賲噩丿丿',
+        retryOnFailure: '丿乇 賲賵乇丿 卮讴爻鬲 丿賵亘丕乇賴 丕賲鬲丨丕賳 讴賳蹖丿',
+        ms: '禺丕賳賲',
+        retry: '丿賵亘丕乇賴',
+        retries: '{{毓丿丿}} 鬲賱丕卮 賴丕蹖 賲噩丿丿',
+        maxRetries: '丨丿丕讴孬乇 鬲賱丕卮 賲噩丿丿',
+        retrying: '鬲賱丕卮 賲噩丿丿...',
+        retryFailed: '鬲賱丕卮 賲噩丿丿 賳丕賲賵賮賯 亘賵丿',
+        retryTimes: '{{times}} 亘丕乇 丿乇 氐賵乇鬲 卮讴爻鬲 丿賵亘丕乇賴 丕賲鬲丨丕賳 讴賳蹖丿',
+        retrySuccessful: '丕賲鬲丨丕賳 賲噩丿丿 亘丕 賲賵賮賯蹖鬲 丕賳噩丕賲 丿賴蹖丿',
+        retryFailedTimes: '{{亘丕乇}} 鬲賱丕卮 賴丕蹖 賲噩丿丿 賳丕賲賵賮賯 亘賵丿',
+      },
+    },
+    start: {
+      required: '丕賱夭丕賲蹖',
+      inputField: '賮蹖賱丿 賵乇賵丿蹖',
+      builtInVar: '賲鬲睾蹖乇賴丕蹖 丿乇賵賳鈥屫池ж�',
+      outputVars: {
+        query: '賵乇賵丿蹖 讴丕乇亘乇',
+        memories: {
+          des: '鬲丕乇蹖禺趩賴 賲讴丕賱賲丕鬲',
+          type: '賳賵毓 倬蹖丕賲',
+          content: '賲丨鬲賵丕蹖 倬蹖丕賲',
+        },
+        files: '賱蹖爻鬲 賮丕蹖賱鈥屬囏�',
+      },
+      noVarTip: '賵乇賵丿蹖鈥屬囏й屰� 乇丕 讴賴 賲蹖鈥屫堌з� 丿乇 噩乇蹖丕賳 讴丕乇 丕爻鬲賮丕丿賴 讴乇丿貙 鬲賳馗蹖賲 讴賳蹖丿',
+    },
+    end: {
+      outputs: '禺乇賵噩蹖鈥屬囏�',
+      output: {
+        type: '賳賵毓 禺乇賵噩蹖',
+        variable: '賲鬲睾蹖乇 禺乇賵噩蹖',
+      },
+      type: {
+        'none': '賴蹖趩',
+        'plain-text': '賲鬲賳 爻丕丿賴',
+        'structured': '爻丕禺鬲丕乇蹖',
+      },
+    },
+    answer: {
+      answer: '倬丕爻禺',
+      outputVars: '賲鬲睾蹖乇賴丕蹖 禺乇賵噩蹖',
+    },
+    llm: {
+      model: '賲丿賱',
+      variables: '賲鬲睾蹖乇賴丕',
+      context: '賲鬲賳',
+      contextTooltip: '賲蹖鈥屫堌з嗃屫� 丿丕賳卮 乇丕 亘賴 毓賳賵丕賳 賲鬲賳 賵丕乇丿 讴賳蹖丿',
+      notSetContextInPromptTip: '亘乇丕蹖 賮毓丕賱 讴乇丿賳 賵蹖跇诏蹖 賲鬲賳貙 賱胤賮丕賸 賲鬲睾蹖乇 賲鬲賳 乇丕 丿乇 PROMPT 倬乇 讴賳蹖丿.',
+      prompt: '倬蹖卮賳賴丕丿',
+      roleDescription: {
+        system: '丿爻鬲賵乇丕鬲 爻胤丨 亘丕賱丕 亘乇丕蹖 賲讴丕賱賲賴 乇丕 丕乇丕卅賴 丿賴蹖丿',
+        user: '丿爻鬲賵乇丕鬲貙 倬乇爻卮鈥屬囏ж� 蹖丕 賴乇 賵乇賵丿蹖 賲鬲賳蹖 乇丕 亘賴 賲丿賱 丕乇丕卅賴 丿賴蹖丿',
+        assistant: '倬丕爻禺鈥屬囏й� 賲丿賱 亘乇 丕爻丕爻 倬蹖丕賲鈥屬囏й� 讴丕乇亘乇',
+      },
+      addMessage: '丕賮夭賵丿賳 倬蹖丕賲',
+      vision: '亘蹖賳丕蹖蹖',
+      files: '賮丕蹖賱鈥屬囏�',
+      resolution: {
+        name: '賵囟賵丨',
+        high: '亘丕賱丕',
+        low: '倬丕蹖蹖賳',
+      },
+      outputVars: {
+        output: '鬲賵賱蹖丿 賲丨鬲賵丕',
+        usage: '丕胤賱丕毓丕鬲 丕爻鬲賮丕丿賴 丕夭 賲丿賱',
+      },
+      singleRun: {
+        variable: '賲鬲睾蹖乇',
+      },
+      sysQueryInUser: 'sys.query 丿乇 倬蹖丕賲 讴丕乇亘乇 囟乇賵乇蹖 丕爻鬲',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: '賱胤賮丕賸 賯亘賱 丕夭 匕禺蹖乇賴鈥屫池ж槽� 胤乇丨貙 賵蹖乇丕蹖卮 賮蹖賱丿 賮毓賱蹖 乇丕 讴丕賲賱 讴賳蹖丿.',
+        },
+        import: '賵丕乇丿丕鬲 丕夭 JSON',
+        addField: '賮蹖賱丿 丕囟丕賮賴 讴賳蹖丿',
+        required: '囟乇賵乇蹖',
+        generatedResult: '賳鬲蹖噩賴 鬲賵賱蹖丿 卮丿賴',
+        generate: '鬲賵賱蹖丿 讴賳蹖丿',
+        doc: '亘蹖卮鬲乇 丿乇亘丕乇賴 禺乇賵噩蹖 爻丕禺鬲丕乇 蹖丕賮鬲賴 亘蹖丕賲賵夭蹖丿',
+        generating: '鬲賵賱蹖丿 胤乇丨鈥屬堌ж辟� JSON...',
+        instruction: '丿爻鬲賵乇丕賱毓賲賱',
+        back: '毓賯亘',
+        resetDefaults: '鬲賳馗蹖賲 賲噩丿丿',
+        showAdvancedOptions: '賳賲丕蹖卮 诏夭蹖賳賴鈥屬囏й� 倬蹖卮乇賮鬲賴',
+        regenerate: '鬲賵賱蹖丿 賲噩丿丿',
+        apply: '丕毓賲丕賱 讴賳蹖丿',
+        title: '丕賱诏賵蹖 禺乇賵噩蹖 爻丕禺鬲丕乇蹖',
+        promptTooltip: '鬲亘丿蹖賱 鬲賵氐蹖賮 賲鬲賳蹖 亘賴 蹖讴 爻丕禺鬲丕乇 丕爻鬲丕賳丿丕乇丿 卮丿賴 JSON Schema.',
+        stringValidations: '丕毓鬲亘丕乇爻賳噩蹖 乇卮鬲賴',
+        resultTip: '丕蹖賳 賳鬲蹖噩賴 鬲賵賱蹖丿 卮丿賴 丕爻鬲. 丕诏乇 乇丕囟蹖 賳蹖爻鬲蹖丿貙 賲蹖鈥屫堌з嗃屫� 亘賴 毓賯亘 亘乇诏乇丿蹖丿 賵 丿乇禺賵丕爻鬲 禺賵丿 乇丕 賵蹖乇丕蹖卮 讴賳蹖丿.',
+        descriptionPlaceholder: '鬲賵囟蹖丨丕鬲 乇丕 丕囟丕賮賴 讴賳蹖丿',
+        addChildField: '丕賮夭賵丿賳 賮蹖賱丿 賮乇夭賳丿',
+        generateJsonSchema: '丕蹖噩丕丿 丕爻讴蹖賲丕 JSON',
+        promptPlaceholder: '丕爻讴蹖賲丕蹖 JSON 禺賵丿 乇丕 鬲賵氐蹖賮 讴賳蹖丿...',
+        fieldNamePlaceholder: '賳丕賲 賲蹖丿丕賳',
+        generationTip: '卮賲丕 賲蹖鈥屫堌з嗃屫� 丕夭 夭亘丕賳 胤亘蹖毓蹖 亘乇丕蹖 丕蹖噩丕丿 爻乇蹖毓 蹖讴 胤乇丨鈥屬堌ж辟� JSON 丕爻鬲賮丕丿賴 讴賳蹖丿.',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: '賲鬲睾蹖乇 噩爻鬲噩賵',
+      knowledge: '丿丕賳卮',
+      outputVars: {
+        output: '丿丕丿賴鈥屬囏й� 鬲賯爻蹖賲鈥屫ㄙ嗀� 卮丿賴 亘丕夭蹖丕亘蹖',
+        content: '賲丨鬲賵丕蹖 鬲賯爻蹖賲鈥屫ㄙ嗀� 卮丿賴',
+        title: '毓賳賵丕賳 鬲賯爻蹖賲鈥屫ㄙ嗀� 卮丿賴',
+        icon: '丌蹖讴賵賳 鬲賯爻蹖賲鈥屫ㄙ嗀� 卮丿賴',
+        url: 'URL 鬲賯爻蹖賲鈥屫ㄙ嗀� 卮丿賴',
+        metadata: '爻丕蹖乇 賲鬲丕丿丕丿賴鈥屬囏�',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            title: '賲鬲毓丕丿賱',
+            subTitle: '毓丿賲 賮毓丕賱鈥屫池ж槽� 賮蹖賱鬲乇賴丕蹖 賲鬲丕丿丕丿賴',
+          },
+          automatic: {
+            title: '禺賵丿讴丕乇',
+            desc: '卮乇丕蹖胤 賮蹖賱鬲乇 賲鬲丕丿丕丿賴 乇丕 亘乇 丕爻丕爻 賲鬲睾蹖乇 噩爻鬲噩賵 亘賴 氐賵乇鬲 禺賵丿讴丕乇 鬲賵賱蹖丿 讴賳蹖丿',
+            subTitle: '卮乇丕蹖胤 賮蹖賱鬲乇 賲鬲丕丿蹖鬲丕 乇丕 亘賴 胤賵乇 禺賵丿讴丕乇 亘乇 丕爻丕爻 倬乇爻卮 讴丕乇亘乇 鬲賵賱蹖丿 讴賳蹖丿',
+          },
+          manual: {
+            subTitle: '亘賴鈥屫蒂堌必� 丿爻鬲蹖 卮乇丕蹖胤 賮蹖賱鬲乇 讴乇丿賳 賲鬲丕丿蹖鬲丕 乇丕 丕囟丕賮賴 讴賳蹖丿',
+            title: '丿爻鬲賵乇蹖',
+          },
+        },
+        panel: {
+          add: '卮乇胤 丕囟丕賮賴 讴賳蹖丿',
+          placeholder: '賲賯丿丕乇 乇丕 賵丕乇丿 讴賳蹖丿',
+          datePlaceholder: '夭賲丕賳蹖 乇丕 丕賳鬲禺丕亘 讴賳蹖丿...',
+          search: '噩爻鬲噩賵蹖 賲鬲丕 丿丕丿賴',
+          select: '賲鬲睾蹖乇 乇丕 丕賳鬲禺丕亘 讴賳蹖丿...',
+          title: '卮乇丕蹖胤 賮蹖賱鬲乇 賲鬲丕丿蹖鬲丕',
+          conditions: '卮乇丕蹖胤',
+        },
+        title: '賮蹖賱鬲乇 讴乇丿賳 賮乇丕丿丕丿賴',
+      },
+    },
+    http: {
+      inputVars: '賲鬲睾蹖乇賴丕蹖 賵乇賵丿蹖',
+      api: 'API',
+      apiPlaceholder: 'URL 乇丕 賵丕乇丿 讴賳蹖丿貙 亘乇丕蹖 丿乇噩 賲鬲睾蹖乇 \' / \' 乇丕 鬲丕蹖倬 讴賳蹖丿',
+      notStartWithHttp: 'API 亘丕蹖丿 亘丕 http:// 蹖丕 https:// 卮乇賵毓 卮賵丿',
+      key: '讴賱蹖丿',
+      value: '賲賯丿丕乇',
+      bulkEdit: '賵蹖乇丕蹖卮 丿爻鬲賴鈥屫й�',
+      keyValueEdit: '賵蹖乇丕蹖卮 讴賱蹖丿-賲賯丿丕乇',
+      headers: '賴丿乇賴丕',
+      params: '倬丕乇丕賲鬲乇賴丕',
+      body: '亘丿賳',
+      outputVars: {
+        body: '賲丨鬲賵丕蹖 倬丕爻禺',
+        statusCode: '讴丿 賵囟毓蹖鬲 倬丕爻禺',
+        headers: '賮賴乇爻鬲 賴丿乇 倬丕爻禺 JSON',
+        files: '賱蹖爻鬲 賮丕蹖賱鈥屬囏�',
+      },
+      authorization: {
+        'authorization': '丕丨乇丕夭 賴賵蹖鬲',
+        'authorizationType': '賳賵毓 丕丨乇丕夭 賴賵蹖鬲',
+        'no-auth': '賴蹖趩',
+        'api-key': '讴賱蹖丿 API',
+        'auth-type': '賳賵毓 丕丨乇丕夭 賴賵蹖鬲',
+        'basic': '倬丕蹖賴',
+        'bearer': '丿丕乇賳丿賴',
+        'custom': '爻賮丕乇卮蹖',
+        'api-key-title': '讴賱蹖丿 API',
+        'header': '賴丿乇',
+      },
+      insertVarPlaceholder: '亘乇丕蹖 丿乇噩 賲鬲睾蹖乇 \'/\' 乇丕 鬲丕蹖倬 讴賳蹖丿',
+      timeout: {
+        title: '夭賲丕賳鈥屫堎傎�',
+        connectLabel: '夭賲丕賳鈥屫堎傎� 丕鬲氐丕賱',
+        connectPlaceholder: '夭賲丕賳鈥屫堎傎� 丕鬲氐丕賱 乇丕 亘賴 孬丕賳蹖賴 賵丕乇丿 讴賳蹖丿',
+        readLabel: '夭賲丕賳鈥屫堎傎� 禺賵丕賳丿賳',
+        readPlaceholder: '夭賲丕賳鈥屫堎傎� 禺賵丕賳丿賳 乇丕 亘賴 孬丕賳蹖賴 賵丕乇丿 讴賳蹖丿',
+        writeLabel: '夭賲丕賳鈥屫堎傎� 賳賵卮鬲賳',
+        writePlaceholder: '夭賲丕賳鈥屫堎傎� 賳賵卮鬲賳 乇丕 亘賴 孬丕賳蹖賴 賵丕乇丿 讴賳蹖丿',
+      },
+      binaryFileVariable: '賲鬲睾蹖乇 賮丕蹖賱 亘丕蹖賳乇蹖',
+      type: '賳賵毓',
+      extractListPlaceholder: '賮賴乇爻鬲 丌蹖鬲賲 賱蹖爻鬲 乇丕 賵丕乇丿 讴賳蹖丿貙 賲鬲睾蹖乇 丿乇噩 \'/\' 乇丕 鬲丕蹖倬 讴賳蹖丿',
+      curl: {
+        title: '賵丕乇丿 讴乇丿賳 丕夭 cURL',
+        placeholder: '乇卮鬲賴 cURL 乇丕 丕蹖賳噩丕 亘趩爻亘丕賳蹖丿',
+      },
+    },
+    code: {
+      inputVars: '賲鬲睾蹖乇賴丕蹖 賵乇賵丿蹖',
+      outputVars: '賲鬲睾蹖乇賴丕蹖 禺乇賵噩蹖',
+      advancedDependencies: '賵丕亘爻鬲诏蹖鈥屬囏й� 倬蹖卮乇賮鬲賴',
+      advancedDependenciesTip: '亘乇禺蹖 賵丕亘爻鬲诏蹖鈥屬囏й� 倬蹖卮鈥屫ㄘж壁柏ж臂� 卮丿賴 讴賴 夭賲丕賳 亘蹖卮鬲乇蹖 亘乇丕蹖 賲氐乇賮 賳蹖丕夭 丿丕乇賳丿 蹖丕 亘賴 胤賵乇 倬蹖卮鈥屬佖必� 丿乇 丕蹖賳噩丕 賲賵噩賵丿 賳蹖爻鬲賳丿貙 丕囟丕賮賴 讴賳蹖丿',
+      searchDependencies: '噩爻鬲噩賵蹖 賵丕亘爻鬲诏蹖鈥屬囏�',
+    },
+    templateTransform: {
+      inputVars: '賲鬲睾蹖乇賴丕蹖 賵乇賵丿蹖',
+      code: '讴丿',
+      codeSupportTip: '賮賯胤 Jinja2 乇丕 倬卮鬲蹖亘丕賳蹖 賲蹖鈥屭┵嗀�',
+      outputVars: {
+        output: '賲丨鬲賵丕蹖 鬲亘丿蹖賱鈥屫簇�',
+      },
+    },
+    ifElse: {
+      if: '丕诏乇',
+      else: '丿乇 睾蹖乇 丕蹖賳 氐賵乇鬲',
+      elseDescription: '亘乇丕蹖 鬲毓乇蹖賮 賲賳胤賯 讴賴 亘丕蹖丿 夭賲丕賳蹖 讴賴 卮乇胤 if 亘乇丌賵乇丿賴 賳卮賵丿貙 丕噩乇丕 卮賵丿.',
+      and: '賵',
+      or: '蹖丕',
+      operator: '毓賲賱诏乇',
+      notSetVariable: '賱胤賮丕賸 丕亘鬲丿丕 賲鬲睾蹖乇 乇丕 鬲賳馗蹖賲 讴賳蹖丿',
+      comparisonOperator: {
+        'contains': '卮丕賲賱',
+        'not contains': '卮丕賲賱 賳賲蹖鈥屫促堌�',
+        'start with': '卮乇賵毓 亘丕',
+        'end with': '倬丕蹖丕賳 亘丕',
+        'is': '丕爻鬲',
+        'is not': '賳蹖爻鬲',
+        'empty': '禺丕賱蹖 丕爻鬲',
+        'not empty': '禺丕賱蹖 賳蹖爻鬲',
+        'null': '禺丕賱蹖',
+        'not null': '禺丕賱蹖 賳蹖爻鬲',
+        'regex match': '賲爻丕亘賯賴 regex',
+        'in': '丿乇',
+        'not exists': '賵噩賵丿 賳丿丕乇丿',
+        'all of': '賴賲賴 丕夭',
+        'not in': '賳賴 丿乇',
+        'exists': '賲賵噩賵丿',
+        'after': '亘毓丿 丕夭',
+        'before': '賯亘賱 丕夭',
+      },
+      enterValue: '賲賯丿丕乇 乇丕 賵丕乇丿 讴賳蹖丿',
+      addCondition: '丕賮夭賵丿賳 卮乇胤',
+      conditionNotSetup: '卮乇胤 鬲賳馗蹖賲 賳卮丿賴 丕爻鬲',
+      selectVariable: '賲鬲睾蹖乇 乇丕 丕賳鬲禺丕亘 讴賳蹖丿...',
+      optionName: {
+        video: '賵蹖丿卅賵',
+        doc: '鬲賵囟蹖丨丕鬲',
+        localUpload: '丌倬賱賵丿 賲丨賱蹖',
+        audio: '氐賵鬲蹖',
+        url: '丌丿乇爻',
+        image: '鬲氐賵蹖乇',
+      },
+      select: '丕賳鬲禺丕亘',
+      addSubVariable: '賲鬲睾蹖乇 賮乇毓蹖',
+      condition: '卮乇胤',
+    },
+    variableAssigner: {
+      title: '鬲禺氐蹖氐 賲鬲睾蹖乇賴丕',
+      outputType: '賳賵毓 禺乇賵噩蹖',
+      varNotSet: '賲鬲睾蹖乇 鬲賳馗蹖賲 賳卮丿賴 丕爻鬲',
+      noVarTip: '賲鬲睾蹖乇賴丕蹖蹖 乇丕 讴賴 亘丕蹖丿 丕禺鬲氐丕氐 丿丕丿賴 卮賵賳丿 丕囟丕賮賴 讴賳蹖丿',
+      type: {
+        string: '乇卮鬲賴',
+        number: '毓丿丿',
+        object: '卮蹖亍',
+        array: '丌乇丕蹖賴',
+      },
+      aggregationGroup: '诏乇賵賴 鬲噩賲毓',
+      aggregationGroupTip: '賮毓丕賱 讴乇丿賳 丕蹖賳 賵蹖跇诏蹖 丕噩丕夭賴 賲蹖鈥屫囏� 鬲丕 鬲噩賲毓鈥屭┵嗁嗀� 賲鬲睾蹖乇賴丕 趩賳丿蹖賳 賲噩賲賵毓賴 賲鬲睾蹖乇 乇丕 鬲噩賲蹖毓 讴賳丿.',
+      addGroup: '丕賮夭賵丿賳 诏乇賵賴',
+      outputVars: {
+        varDescribe: '{{groupName}} 禺乇賵噩蹖',
+      },
+      setAssignVariable: '鬲毓蹖蹖賳 賲鬲睾蹖乇 鬲禺氐蹖氐 蹖丕賮鬲賴',
+    },
+    assigner: {
+      'assignedVariable': '賲鬲睾蹖乇 丕禺鬲氐丕氐 丿丕丿賴 卮丿賴',
+      'writeMode': '丨丕賱鬲 賳賵卮鬲賳',
+      'writeModeTip': '賵賯鬲蹖 賲鬲睾蹖乇 丕禺鬲氐丕氐 丿丕丿賴 卮丿賴 蹖讴 丌乇丕蹖賴 丕爻鬲貙 丨丕賱鬲 丕賮夭賵丿賳 亘賴 丕賳鬲賴丕 丕囟丕賮賴 賲蹖鈥屭┵嗀�.',
+      'over-write': '亘丕夭賳賵蹖爻蹖',
+      'append': '丕賮夭賵丿賳',
+      'plus': '亘賴 毓賱丕賵賴',
+      'clear': '倬丕讴 讴乇丿賳',
+      'setVariable': '鬲賳馗蹖賲 賲鬲睾蹖乇',
+      'variable': '賲鬲睾蹖乇',
+      'operations': {
+        'clear': '乇賵卮賳',
+        'over-write': '亘丕夭賳賵蹖爻蹖',
+        'set': '賲噩賲賵毓賴',
+        '*=': '*=',
+        'overwrite': '亘丕夭賳賵蹖爻蹖',
+        '+=': '+=',
+        'title': '毓賲賱蹖丕鬲',
+        'extend': '诏爻鬲乇卮',
+        '-=': '-=',
+        'append': '丕賱丨丕賯',
+        '/=': '/=',
+        'remove-first': '丨匕賮 丕賵賱',
+        'remove-last': '丌禺乇蹖賳 乇丕 丨匕賮 讴賳蹖丿',
+      },
+      'noVarTip': '亘乇丕蹖 丕賮夭賵丿賳 賲鬲睾蹖乇賴丕 乇賵蹖 丿讴賲賴 "+" 讴賱蹖讴 讴賳蹖丿',
+      'selectAssignedVariable': '賲鬲睾蹖乇 丕禺鬲氐丕氐 丿丕丿賴 卮丿賴 乇丕 丕賳鬲禺丕亘 讴賳蹖丿...',
+      'noAssignedVars': '賴蹖趩 賲鬲睾蹖乇 丕禺鬲氐丕氐 丿丕丿賴 卮丿賴 丿乇 丿爻鬲乇爻 賳蹖爻鬲',
+      'setParameter': '倬丕乇丕賲鬲乇 乇丕 鬲賳馗蹖賲 讴賳蹖丿...',
+      'assignedVarsDescription': '賲鬲睾蹖乇賴丕蹖 丕禺鬲氐丕氐 丿丕丿賴 卮丿賴 亘丕蹖丿 賲鬲睾蹖乇賴丕蹖 賯丕亘賱 賳賵卮鬲賳 賲丕賳賳丿 賲鬲睾蹖乇賴丕蹖 賲讴丕賱賲賴 亘丕卮賳丿.',
+      'variables': '賲鬲睾蹖乇賴丕蹖',
+      'varNotSet': '賲鬲睾蹖乇 NOT Set',
+    },
+    tool: {
+      toAuthorize: '亘乇丕蹖 賲噩賵夭 丿丕丿賳',
+      inputVars: '賲鬲睾蹖乇賴丕蹖 賵乇賵丿蹖',
+      outputVars: {
+        text: '賲丨鬲賵丕蹖 鬲賵賱蹖丿 卮丿賴 鬲賵爻胤 丕亘夭丕乇',
+        files: {
+          title: '賮丕蹖賱鈥屬囏й� 鬲賵賱蹖丿 卮丿賴 鬲賵爻胤 丕亘夭丕乇',
+          type: '賳賵毓 倬卮鬲蹖亘丕賳蹖. 丿乇 丨丕賱 丨丕囟乇 賮賯胤 鬲氐丕賵蹖乇 倬卮鬲蹖亘丕賳蹖 賲蹖鈥屫促堌�',
+          transfer_method: '乇賵卮 丕賳鬲賯丕賱. 賲賯丿丕乇 丌賳 remote_url 蹖丕 local_file 丕爻鬲',
+          url: 'URL 鬲氐賵蹖乇',
+          upload_file_id: '卮賳丕爻賴 賮丕蹖賱 丌倬賱賵丿 卮丿賴',
+        },
+        json: 'json 鬲賵賱蹖丿 卮丿賴 鬲賵爻胤 丕亘夭丕乇',
+      },
+    },
+    questionClassifiers: {
+      model: '賲丿賱',
+      inputVars: '賲鬲睾蹖乇賴丕蹖 賵乇賵丿蹖',
+      outputVars: {
+        className: '賳丕賲 讴賱丕爻',
+      },
+      class: '讴賱丕爻',
+      classNamePlaceholder: '賳丕賲 讴賱丕爻 禺賵丿 乇丕 亘賳賵蹖爻蹖丿',
+      advancedSetting: '鬲賳馗蹖賲丕鬲 倬蹖卮乇賮鬲賴',
+      topicName: '賳丕賲 賲賵囟賵毓',
+      topicPlaceholder: '賳丕賲 賲賵囟賵毓 禺賵丿 乇丕 亘賳賵蹖爻蹖丿',
+      addClass: '丕賮夭賵丿賳 讴賱丕爻',
+      instruction: '丿爻鬲賵乇丕賱毓賲賱',
+      instructionTip: '丿爻鬲賵乇丕賱毓賲賱鈥屬囏й� 丕囟丕賮蹖 乇丕 亘乇丕蹖 讴賲讴 亘賴 丿爻鬲賴鈥屫ㄙ嗀� 爻賵丕賱丕鬲 亘乇丕蹖 丿乇讴 亘賴鬲乇 賳丨賵賴 丿爻鬲賴鈥屫ㄙ嗀� 爻賵丕賱丕鬲 賵丕乇丿 讴賳蹖丿.',
+      instructionPlaceholder: '丿爻鬲賵乇丕賱毓賲賱 禺賵丿 乇丕 亘賳賵蹖爻蹖丿',
+    },
+    parameterExtractor: {
+      inputVar: '賲鬲睾蹖乇 賵乇賵丿蹖',
+      extractParameters: '丕爻鬲禺乇丕噩 倬丕乇丕賲鬲乇賴丕',
+      importFromTool: '賵丕乇丿 讴乇丿賳 丕夭 丕亘夭丕乇賴丕',
+      addExtractParameter: '丕賮夭賵丿賳 倬丕乇丕賲鬲乇 丕爻鬲禺乇丕噩 卮丿賴',
+      addExtractParameterContent: {
+        name: '賳丕賲',
+        namePlaceholder: '賳丕賲 倬丕乇丕賲鬲乇 丕爻鬲禺乇丕噩 卮丿賴',
+        type: '賳賵毓',
+        typePlaceholder: '賳賵毓 倬丕乇丕賲鬲乇 丕爻鬲禺乇丕噩 卮丿賴',
+        description: '鬲賵囟蹖丨丕鬲',
+        descriptionPlaceholder: '鬲賵囟蹖丨丕鬲 倬丕乇丕賲鬲乇 丕爻鬲禺乇丕噩 卮丿賴',
+        required: '丕賱夭丕賲蹖',
+        requiredContent: '丕賱夭丕賲蹖 賮賯胤 亘賴 毓賳賵丕賳 賲乇噩毓 亘乇丕蹖 丕爻鬲賳鬲丕噩 賲丿賱 丕爻鬲賮丕丿賴 賲蹖鈥屫促堌� 賵 亘乇丕蹖 丕毓鬲亘丕乇爻賳噩蹖 丕噩亘丕乇蹖 禺乇賵噩蹖 倬丕乇丕賲鬲乇 賳蹖爻鬲.',
+      },
+      extractParametersNotSet: '倬丕乇丕賲鬲乇賴丕蹖 丕爻鬲禺乇丕噩 卮丿賴 鬲賳馗蹖賲 賳卮丿賴鈥屫з嗀�',
+      instruction: '丿爻鬲賵乇丕賱毓賲賱',
+      instructionTip: '丿爻鬲賵乇丕賱毓賲賱鈥屬囏й� 丕囟丕賮蹖 乇丕 亘乇丕蹖 讴賲讴 亘賴 丕爻鬲禺乇丕噩鈥屭┵嗁嗀� 倬丕乇丕賲鬲乇 亘乇丕蹖 丿乇讴 賳丨賵賴 丕爻鬲禺乇丕噩 倬丕乇丕賲鬲乇賴丕 賵丕乇丿 讴賳蹖丿.',
+      advancedSetting: '鬲賳馗蹖賲丕鬲 倬蹖卮乇賮鬲賴',
+      reasoningMode: '丨丕賱鬲 丕爻鬲丿賱丕賱',
+      reasoningModeTip: '賲蹖鈥屫堌з嗃屫� 丨丕賱鬲 丕爻鬲丿賱丕賱 賲賳丕爻亘 乇丕 亘乇 丕爻丕爻 鬲賵丕賳丕蹖蹖 賲丿賱 亘乇丕蹖 倬丕爻禺 亘賴 丿爻鬲賵乇丕鬲 亘乇丕蹖 賮乇丕禺賵丕賳蹖 毓賲賱讴乇丿賴丕 蹖丕 倬蹖卮賳賴丕丿丕鬲 丕賳鬲禺丕亘 讴賳蹖丿.',
+      isSuccess: '賲賵賮賯蹖鬲鈥屫①呟屫� 丕爻鬲. 丿乇 氐賵乇鬲 賲賵賮賯蹖鬲 賲賯丿丕乇 1 賵 丿乇 氐賵乇鬲 卮讴爻鬲 賲賯丿丕乇 0 丕爻鬲.',
+      errorReason: '丿賱蹖賱 禺胤丕',
+    },
+    iteration: {
+      deleteTitle: '丨匕賮 賳賵丿 鬲讴乇丕乇責',
+      deleteDesc: '丨匕賮 賳賵丿 鬲讴乇丕乇 亘丕毓孬 丨匕賮 鬲賲丕賲 賳賵丿賴丕蹖 賮乇夭賳丿 禺賵丕賴丿 卮丿',
+      input: '賵乇賵丿蹖',
+      output: '賲鬲睾蹖乇賴丕蹖 禺乇賵噩蹖',
+      iteration_one: '{{count}} 鬲讴乇丕乇',
+      iteration_other: '{{count}} 鬲讴乇丕乇賴丕',
+      currentIteration: '鬲讴乇丕乇 賮毓賱蹖',
+      ErrorMethod: {
+        continueOnError: '丕丿丕賲賴 丿乇 禺胤丕',
+        operationTerminated: '賮爻禺',
+        removeAbnormalOutput: '丨匕賮 禺乇賵噩蹖 睾蹖乇胤亘蹖毓蹖',
+      },
+      error_one: '{{鬲毓丿丕丿}} 禺胤丕',
+      error_other: '{{鬲毓丿丕丿}} 禺胤丕賴丕蹖',
+      parallelMode: '丨丕賱鬲 賲賵丕夭蹖',
+      errorResponseMethod: '乇賵卮 倬丕爻禺 亘賴 禺胤丕',
+      parallelModeEnableTitle: '丨丕賱鬲 賲賵丕夭蹖 賮毓丕賱 丕爻鬲',
+      parallelModeUpper: '丨丕賱鬲 賲賵丕夭蹖',
+      comma: ',',
+      parallelModeEnableDesc: '丿乇 丨丕賱鬲 賲賵丕夭蹖貙 賵馗丕蹖賮 丿乇賵賳 鬲讴乇丕乇賴丕 丕夭 丕噩乇丕蹖 賲賵丕夭蹖 倬卮鬲蹖亘丕賳蹖 賲蹖 讴賳賳丿. 賲蹖 鬲賵丕賳蹖丿 丕蹖賳 乇丕 丿乇 倬丕賳賱 賵蹖跇诏蹖 賴丕 丿乇 爻賲鬲 乇丕爻鬲 倬蹖讴乇亘賳丿蹖 讴賳蹖丿.',
+      MaxParallelismTitle: '丨丿丕讴孬乇 賲賵丕夭蹖 爻丕夭蹖',
+      parallelPanelDesc: '丿乇 丨丕賱鬲 賲賵丕夭蹖貙 賵馗丕蹖賮 丿乇 鬲讴乇丕乇 丕夭 丕噩乇丕蹖 賲賵丕夭蹖 倬卮鬲蹖亘丕賳蹖 賲蹖 讴賳賳丿.',
+      MaxParallelismDesc: '丨丿丕讴孬乇 賲賵丕夭蹖 爻丕夭蹖 亘乇丕蹖 讴賳鬲乇賱 鬲毓丿丕丿 賵馗丕蹖賮 丕噩乇丕 卮丿賴 亘賴 胤賵乇 賴賲夭賲丕賳 丿乇 蹖讴 鬲讴乇丕乇 賵丕丨丿 丕爻鬲賮丕丿賴 賲蹖 卮賵丿.',
+      answerNodeWarningDesc: '賴卮丿丕乇 丨丕賱鬲 賲賵丕夭蹖: 诏乇賴 賴丕蹖 倬丕爻禺貙 鬲讴丕賱蹖賮 賲鬲睾蹖乇 賲讴丕賱賲賴 賵 毓賲賱蹖丕鬲 禺賵丕賳丿賳/賳賵卮鬲賳 賲丿丕賵賲 丿乇 鬲讴乇丕乇賴丕 賲賲讴賳 丕爻鬲 亘丕毓孬 丕爻鬲孬賳丕卅丕鬲 卮賵丿.',
+    },
+    note: {
+      addNote: '丕賮夭賵丿賳 蹖丕丿丿丕卮鬲',
+      editor: {
+        placeholder: '蹖丕丿丿丕卮鬲 禺賵丿 乇丕 亘賳賵蹖爻蹖丿...',
+        small: '讴賵趩讴',
+        medium: '賲鬲賵爻胤',
+        large: '亘夭乇诏',
+        bold: '倬乇乇賳诏',
+        italic: '丕蹖鬲丕賱蹖讴',
+        strikethrough: '禺胤鈥屫堌必�',
+        link: '賱蹖賳讴',
+        openLink: '亘丕夭 讴乇丿賳',
+        unlink: '丨匕賮 賱蹖賳讴',
+        enterUrl: 'URL 乇丕 賵丕乇丿 讴賳蹖丿...',
+        invalidUrl: 'URL 賳丕賲毓鬲亘乇',
+        bulletList: '賮賴乇爻鬲 诏賱賵賱賴鈥屫й�',
+        showAuthor: '賳賲丕蹖卮 賳賵蹖爻賳丿賴',
+      },
+    },
+    docExtractor: {
+      outputVars: {
+        text: '賲鬲賳 丕爻鬲禺乇丕噩 卮丿賴',
+      },
+      inputVar: '賲鬲睾蹖乇 賵乇賵丿蹖',
+      learnMore: '亘蹖卮鬲乇 亘丿丕賳蹖丿',
+      supportFileTypes: '丕賳賵丕毓 賮丕蹖賱 賴丕蹖 倬卮鬲蹖亘丕賳蹖: {{types}}.',
+    },
+    listFilter: {
+      outputVars: {
+        result: '賳鬲蹖噩賴 賮蹖賱鬲乇',
+        first_record: '丕賵賱蹖賳 乇讴賵乇丿',
+        last_record: '丌禺乇蹖賳 乇讴賵乇丿',
+      },
+      limit: '亘丕賱丕 N',
+      inputVar: '賲鬲睾蹖乇 賵乇賵丿蹖',
+      filterCondition: '賵囟毓蹖鬲 賮蹖賱鬲乇',
+      orderBy: '爻賮丕乇卮 亘乇 丕爻丕爻',
+      filterConditionKey: '讴賱蹖丿 賵囟毓蹖鬲 賮蹖賱鬲乇',
+      desc: '賳夭賵賱蹖',
+      filterConditionComparisonOperator: '毓賲賱诏乇 賲賯丕蹖爻賴 卮乇丕蹖胤 賮蹖賱鬲乇',
+      filterConditionComparisonValue: '賲賯丿丕乇 卮乇丕蹖胤 賮蹖賱鬲乇',
+      selectVariableKeyPlaceholder: '讴賱蹖丿 賲鬲睾蹖乇 賮乇毓蹖 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+      asc: '氐毓賵丿蹖',
+      extractsCondition: '賲賵乇丿 N 乇丕 丕爻鬲禺乇丕噩 讴賳蹖丿',
+    },
+    agent: {
+      strategy: {
+        searchPlaceholder: '噩爻鬲 賵噩賵 丿乇 丕爻鬲乇丕鬲跇蹖 賴丕蹖 毓丕賲賱蹖',
+        tooltip: '丕爻鬲乇丕鬲跇蹖 賴丕蹖 賲禺鬲賱賮 毓丕賲賱 鬲毓蹖蹖賳 賲蹖 讴賳賳丿 讴賴 爻蹖爻鬲賲 趩诏賵賳賴 賮乇丕禺賵丕賳蹖 賴丕蹖 丕亘夭丕乇 趩賳丿 賲乇丨賱賴 丕蹖 乇丕 亘乇賳丕賲賴 乇蹖夭蹖 賵 丕噩乇丕 賲蹖 讴賳丿.',
+        label: '丕爻鬲乇丕鬲跇蹖 毓丕賲賱',
+        configureTip: '賱胤賮丕 丕爻鬲乇丕鬲跇蹖 毓丕賲賱 乇丕 倬蹖讴乇亘賳丿蹖 讴賳蹖丿.',
+        selectTip: '丕爻鬲乇丕鬲跇蹖 毓丕賲賱 乇丕 丕賳鬲禺丕亘 讴賳蹖丿',
+        configureTipDesc: '倬爻 丕夭 倬蹖讴乇亘賳丿蹖 丕爻鬲乇丕鬲跇蹖 毓丕賲賱貙 丕蹖賳 诏乇賴 亘賴 胤賵乇 禺賵丿讴丕乇 倬蹖讴乇亘賳丿蹖 賴丕蹖 亘丕賯蹖賲丕賳丿賴 乇丕 亘丕乇诏蹖乇蹖 賲蹖 讴賳丿. 丕蹖賳 丕爻鬲乇丕鬲跇蹖 亘乇 賲讴丕賳蹖爻賲 丕爻鬲丿賱丕賱 丕亘夭丕乇 趩賳丿 賲乇丨賱賴 丕蹖 鬲兀孬蹖乇 禺賵丕賴丿 诏匕丕卮鬲.',
+        shortLabel: '丕爻鬲乇丕鬲跇蹖',
+      },
+      pluginInstaller: {
+        installing: '賳氐亘',
+        install: '賳氐亘',
+      },
+      modelNotInMarketplace: {
+        manageInPlugins: '賲丿蹖乇蹖鬲 丿乇 倬賱丕诏蹖賳 賴丕',
+        title: '賲丿賱 賳氐亘 賳卮丿賴 丕爻鬲',
+        desc: '丕蹖賳 賲丿賱 丕夭 賲禺夭賳 Local 蹖丕 GitHub 賳氐亘 卮丿賴 丕爻鬲. 賱胤賮丕 倬爻 丕夭 賳氐亘 丕爻鬲賮丕丿賴 讴賳蹖丿.',
+      },
+      modelNotSupport: {
+        desc: '賳爻禺賴 丕賮夭賵賳賴 賳氐亘 卮丿賴 丕蹖賳 賲丿賱 乇丕 丕乇丕卅賴 賳賲蹖 丿賴丿.',
+        title: '賲丿賱 倬卮鬲蹖亘丕賳蹖 賳卮丿賴',
+        descForVersionSwitch: '賳爻禺賴 丕賮夭賵賳賴 賳氐亘 卮丿賴 丕蹖賳 賲丿賱 乇丕 丕乇丕卅賴 賳賲蹖 丿賴丿. 亘乇丕蹖 鬲睾蹖蹖乇 賳爻禺賴 讴賱蹖讴 讴賳蹖丿.',
+      },
+      modelSelectorTooltips: {
+        deprecated: '丕蹖賳 賲丿賱 賲賳爻賵禺 卮丿賴 丕爻鬲',
+      },
+      outputVars: {
+        files: {
+          transfer_method: '乇賵卮 丕賳鬲賯丕賱. 丕乇夭卮 remote_url 蹖丕 local_file',
+          upload_file_id: '卮賳丕爻賴 賮丕蹖賱 乇丕 丌倬賱賵丿 讴賳蹖丿',
+          title: '賮丕蹖賱 賴丕蹖 鬲賵賱蹖丿 卮丿賴 鬲賵爻胤 毓丕賲賱',
+          url: '丌丿乇爻 丕蹖賳鬲乇賳鬲蹖 鬲氐賵蹖乇',
+          type: '賳賵毓 倬卮鬲蹖亘丕賳蹖. 丕讴賳賵賳 賮賯胤 丕夭 鬲氐賵蹖乇 倬卮鬲蹖亘丕賳蹖 賲蹖 讴賳丿',
+        },
+        text: '賲丨鬲賵丕蹖 鬲賵賱蹖丿 卮丿賴 鬲賵爻胤 毓丕賲賱',
+        json: '毓丕賲賱 JSON 乇丕 鬲賵賱蹖丿 讴乇丿',
+      },
+      checkList: {
+        strategyNotSelected: '丕爻鬲乇丕鬲跇蹖 丕賳鬲禺丕亘 賳卮丿賴 丕爻鬲',
+      },
+      installPlugin: {
+        changelog: '诏夭丕乇卮 鬲睾蹖蹖乇',
+        install: '賳氐亘',
+        cancel: '賱睾賵',
+        title: '丕賮夭賵賳賴 乇丕 賳氐亘 讴賳蹖丿',
+        desc: '丿乇 賲賵乇丿 賳氐亘 丕賮夭賵賳賴 夭蹖乇',
+      },
+      pluginNotFoundDesc: '丕蹖賳 倬賱丕诏蹖賳 丕夭 GitHub 賳氐亘 卮丿賴 丕爻鬲. 賱胤賮丕 亘乇丕蹖 賳氐亘 賲噩丿丿 亘賴 倬賱丕诏蹖賳 賴丕 亘乇賵蹖丿',
+      linkToPlugin: '倬蹖賵賳丿 亘賴 倬賱丕诏蹖賳 賴丕',
+      toolbox: '噩毓亘賴 丕亘夭丕乇',
+      maxIterations: '丨丿丕讴孬乇 鬲讴乇丕乇賴丕',
+      strategyNotSet: '丕爻鬲乇丕鬲跇蹖 毓丕賲賱 鬲賳馗蹖賲 賳卮丿賴 丕爻鬲',
+      strategyNotInstallTooltip: '{{strategy}} 賳氐亘 賳卮丿賴 丕爻鬲',
+      modelNotSelected: '賲丿賱 丕賳鬲禺丕亘 賳卮丿賴 丕爻鬲',
+      toolNotInstallTooltip: '{{丕亘夭丕乇}} 賳氐亘 賳卮丿賴 丕爻鬲',
+      tools: '丕亘夭丕乇',
+      learnMore: '亘蹖卮鬲乇 亘丿丕賳蹖丿',
+      pluginNotInstalledDesc: '丕蹖賳 倬賱丕诏蹖賳 丕夭 GitHub 賳氐亘 卮丿賴 丕爻鬲. 賱胤賮丕 亘乇丕蹖 賳氐亘 賲噩丿丿 亘賴 倬賱丕诏蹖賳 賴丕 亘乇賵蹖丿',
+      unsupportedStrategy: '丕爻鬲乇丕鬲跇蹖 倬卮鬲蹖亘丕賳蹖 賳卮丿賴',
+      modelNotInstallTooltip: '丕蹖賳 賲丿賱 賳氐亘 賳卮丿賴 丕爻鬲',
+      notAuthorized: '賲噩丕夭 賳蹖爻鬲',
+      toolNotAuthorizedTooltip: '{{丕亘夭丕乇}} 賲噩丕夭 賳蹖爻鬲',
+      configureModel: '倬蹖讴乇亘賳丿蹖 賲丿賱',
+      pluginNotInstalled: '丕蹖賳 丕賮夭賵賳賴 賳氐亘 賳卮丿賴 丕爻鬲',
+      strategyNotFoundDesc: '賳爻禺賴 丕賮夭賵賳賴 賳氐亘 卮丿賴 丕蹖賳 丕爻鬲乇丕鬲跇蹖 乇丕 丕乇丕卅賴 賳賲蹖 丿賴丿.',
+      strategyNotFoundDescAndSwitchVersion: '賳爻禺賴 丕賮夭賵賳賴 賳氐亘 卮丿賴 丕蹖賳 丕爻鬲乇丕鬲跇蹖 乇丕 丕乇丕卅賴 賳賲蹖 丿賴丿. 亘乇丕蹖 鬲睾蹖蹖乇 賳爻禺賴 讴賱蹖讴 讴賳蹖丿.',
+      model: '賲丿賱',
+    },
+    loop: {
+      ErrorMethod: {
+        removeAbnormalOutput: '禺乇賵噩蹖 睾蹖乇毓丕丿蹖 乇丕 丨匕賮 讴賳蹖丿',
+        operationTerminated: '賲賳丨賱 卮丿',
+        continueOnError: '丕丿丕賲賴 丿乇 氐賵乇鬲 亘乇賵夭 禺胤丕',
+      },
+      variableName: '賳丕賲 賲鬲睾蹖乇',
+      error_other: '{{count}} 禺胤丕',
+      loopNode: '诏乇賴 丨賱賯賴',
+      exitConditionTip: '蹖讴 诏乇賴 丨賱賯賴 亘賴 丨丿丕賯賱 蹖讴 卮乇胤 禺乇賵噩 賳蹖丕夭 丿丕乇丿.',
+      inputMode: '丨丕賱鬲 賵乇賵丿蹖',
+      loop_other: '{{count}} 丨賱賯賴',
+      error_one: '{{count}} 禺胤丕',
+      comma: ',',
+      loopVariables: '賲鬲睾蹖乇賴丕蹖 丨賱賯賴',
+      setLoopVariables: '賲鬲睾蹖乇賴丕 乇丕 丿乇 賲丨丿賵丿賴 丨賱賯賴 鬲賳馗蹖賲 讴賳蹖丿',
+      loop_one: '{{count}} 丨賱賯賴',
+      deleteTitle: '丨匕賮 诏乇賴 丨賱賯賴責',
+      input: '賵乇賵丿蹖',
+      finalLoopVariables: '賲鬲睾蹖乇賴丕蹖 賳賴丕蹖蹖 丨賱賯賴',
+      output: '賲鬲睾蹖乇 禺乇賵噩蹖',
+      totalLoopCount: '鬲毓丿丕丿 讴賱 丨賱賯賴: {{count}}',
+      currentLoop: '丨賱賯賴 噩丕乇蹖',
+      initialLoopVariables: '賲鬲睾蹖乇賴丕蹖 丨賱賯賴 丕賵賱蹖賴',
+      errorResponseMethod: '乇賵卮 倬丕爻禺 禺胤丕',
+      loopMaxCountError: '賱胤賮丕賸 蹖讴 鬲毓丿丕丿 丨丿丕讴孬乇 丨賱賯賴 賲毓鬲亘乇 賵丕乇丿 讴賳蹖丿 讴賴 丿乇 亘丕夭賴鈥屰� 郾 鬲丕 {{maxCount}} 亘丕卮丿.',
+      deleteDesc: '丨匕賮 賳賵丿 丨賱賯賴 賴賲賴 賳賵丿賴丕蹖 賮乇夭賳丿 乇丕 丨匕賮 禺賵丕賴丿 讴乇丿',
+      loopMaxCount: '丨丿丕讴孬乇 鬲毓丿丕丿 丨賱賯賴',
+      currentLoopCount: '鬲毓丿丕丿 丨賱賯賴鈥屬囏й� 賮毓賱蹖: {{count}}',
+      breakCondition: '卮乇胤 禺丕鬲賲賴 丨賱賯賴',
+      breakConditionTip: '賮賯胤 賲鬲睾蹖乇賴丕蹖 丿丕禺賱 丨賱賯賴鈥屬囏� 亘丕 卮乇丕蹖胤 禺丕鬲賲賴 賵 賲鬲睾蹖乇賴丕蹖 诏賮鬲诏賵 賲蹖鈥屫堌з嗁嗀� 賲賵乇丿 丕乇噩丕毓 賯乇丕乇 诏蹖乇賳丿.',
+    },
+  },
+  tracing: {
+    stopBy: '賲鬲賵賯賮 卮丿賴 鬲賵爻胤 {{user}}',
+  },
+  variableReference: {
+    noAvailableVars: '賴蹖趩 賲鬲睾蹖乇蹖 丿乇 丿爻鬲乇爻 賳蹖爻鬲',
+    conversationVars: '賲鬲睾蹖乇賴丕蹖 賲讴丕賱賲賴',
+    noVarsForOperation: '賴蹖趩 賲鬲睾蹖乇蹖 亘乇丕蹖 鬲禺氐蹖氐 亘丕 毓賲賱蹖丕鬲 丕賳鬲禺丕亘 卮丿賴 丿乇 丿爻鬲乇爻 賳蹖爻鬲.',
+    assignedVarsDescription: '賲鬲睾蹖乇賴丕蹖 丕禺鬲氐丕氐 丿丕丿賴 卮丿賴 亘丕蹖丿 賲鬲睾蹖乇賴丕蹖 賯丕亘賱 賳賵卮鬲賳 亘丕卮賳丿貙 賲丕賳賳丿',
+    noAssignedVars: '賴蹖趩 賲鬲睾蹖乇 丕禺鬲氐丕氐 丿丕丿賴 卮丿賴 丿乇 丿爻鬲乇爻 賳蹖爻鬲',
+  },
+  versionHistory: {
+    filter: {
+      reset: '亘丕夭賳卮丕賳蹖 賮蹖賱鬲乇',
+      onlyYours: '賮賯胤 賲丕賱 卮賲丕爻鬲',
+      onlyShowNamedVersions: '賮賯胤 賳爻禺賴鈥屬囏й� 賳丕賲鈥屭柏ж臂� 卮丿賴 乇丕 賳賲丕蹖卮 亘丿賴蹖丿',
+      all: '賴賲賴',
+      empty: '賴蹖趩 鬲丕乇蹖禺趩賴 賳爻禺賴鈥屫й� 賲胤丕亘賯 倬蹖丿丕 賳卮丿',
+    },
+    editField: {
+      title: '毓賳賵丕賳',
+      releaseNotes: '蹖丕丿丿丕卮鬲鈥屬囏й� 賳爻禺賴',
+      titleLengthLimit: '毓賳賵丕賳 賳賲蹖鈥屫堌з嗀� 丕夭 {{limit}} 讴丕乇丕讴鬲乇 亘蹖卮鬲乇 卮賵丿',
+      releaseNotesLengthLimit: '蹖丕丿丿丕卮鬲鈥屬囏й� 丕賳鬲卮丕乇 賳賲蹖鈥屫堌з嗁嗀� 丕夭 {{limit}} 讴丕乇丕讴鬲乇 鬲噩丕賵夭 讴賳賳丿',
+    },
+    action: {
+      updateSuccess: '賳爻禺賴 亘賴鈥屫辟堌藏必池з嗃� 卮丿',
+      deleteSuccess: '賳爻禺賴 丨匕賮 卮丿',
+      restoreSuccess: '賳爻禺賴 亘丕夭诏乇丿丕賳蹖 卮丿賴',
+      deleteFailure: '丨匕賮 賳爻禺賴 賲賵賮賯 賳亘賵丿',
+      restoreFailure: '亘丕夭诏乇丿丕賳丿賳 賳爻禺賴 賳丕賲賵賮賯 亘賵丿',
+      updateFailure: '亘賴鈥屫辟堌藏必池з嗃� 賳爻禺賴 賳丕賲賵賮賯 亘賵丿',
+    },
+    latest: '丌禺乇蹖賳',
+    editVersionInfo: '賵蹖乇丕蹖卮 丕胤賱丕毓丕鬲 賳爻禺賴',
+    nameThisVersion: '丕蹖賳 賳爻禺賴 乇丕 賳丕賲诏匕丕乇蹖 讴賳蹖丿',
+    currentDraft: '倬蹖卮 賳賵蹖爻 賮毓賱蹖',
+    defaultName: '賳爻禺賴 亘丿賵賳 毓賳賵丕賳',
+    title: '賳爻禺賴鈥屬囏�',
+    releaseNotesPlaceholder: '卮乇丨 丿賴蹖丿 趩賴 趩蹖夭蹖 鬲睾蹖蹖乇 讴乇丿賴 丕爻鬲',
+    restorationTip: '倬爻 丕夭 亘丕夭蹖丕亘蹖 賳爻禺賴貙 倬蹖卮鈥屬嗁堐屫� 賮毓賱蹖 亘丕夭賳賵蹖爻蹖 禺賵丕賴丿 卮丿.',
+    deletionTip: '丨匕賮 睾蹖乇賯丕亘賱 亘乇诏卮鬲 丕爻鬲貙 賱胤賮丕 鬲兀蹖蹖丿 讴賳蹖丿.',
+  },
+}
+
+export default translation
diff --git a/i18n/fr-FR/app-annotation.ts b/i18n/fr-FR/app-annotation.ts
new file mode 100644
index 0000000..3926fe5
--- /dev/null
+++ b/i18n/fr-FR/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: 'Annotations',
+  name: 'R茅ponse 脿 l\'Annotation',
+  editBy: 'R茅ponse 茅dit茅e par {{author}}',
+  noData: {
+    title: 'Aucune annotation',
+    description: 'Vous pouvez modifier les annotations en d茅boguant l\'application, ou importer des annotations en masse ici pour une r茅ponse de haute qualit茅.',
+  },
+  table: {
+    header: {
+      question: 'question',
+      answer: 'r茅ponse',
+      createdAt: 'cr茅茅 脿',
+      hits: 'clics',
+      actions: 'actions',
+      addAnnotation: 'Ajouter une Annotation',
+      bulkImport: 'Importation en Vrac',
+      bulkExport: 'Exportation en Vrac',
+      clearAll: 'Effacer toutes les annotations',
+    },
+  },
+  editModal: {
+    title: 'Modifier la r茅ponse 脿 l\'annotation',
+    queryName: 'Requ锚te de l\'utilisateur',
+    answerName: 'Bot conteur',
+    yourAnswer: 'Votre r茅ponse',
+    answerPlaceholder: 'Tapez votre r茅ponse ici',
+    yourQuery: 'Votre requ锚te',
+    queryPlaceholder: 'Tapez votre requ锚te ici',
+    removeThisCache: 'Supprimez cette Annotation',
+    createdAt: 'Cr茅茅 脿',
+  },
+  addModal: {
+    title: 'Ajouter une r茅ponse d\'annotation',
+    queryName: 'Question',
+    answerName: 'R茅ponse',
+    answerPlaceholder: 'Tapez la r茅ponse ici',
+    queryPlaceholder: 'Tapez la requ锚te ici',
+    createNext: 'Ajoutez une autre r茅ponse annot茅e',
+  },
+  batchModal: {
+    title: 'Importation en masse',
+    csvUploadTitle: 'Glissez et d茅posez votre fichier CSV ici, ou',
+    browse: 'parcourir',
+    tip: 'Le fichier CSV doit se conformer 脿 la structure suivante :',
+    question: 'question',
+    answer: 'r茅ponse',
+    contentTitle: 'contenu du bloc',
+    content: 'contenu',
+    template: 'T茅l茅chargez le mod猫le ici',
+    cancel: 'Annuler',
+    run: 'Ex茅cuter le lot',
+    runError: 'L\'ex茅cution du lot a 茅chou茅',
+    processing: 'Dans le traitement par lots',
+    completed: 'Importation termin茅e',
+    error: 'Erreur d\'Importation',
+    ok: 'D\'accord',
+  },
+  errorMessage: {
+    answerRequired: 'Une r茅ponse est requise',
+    queryRequired: 'La question est requise',
+  },
+  viewModal: {
+    annotatedResponse: 'R茅ponse 脿 l\'annotation',
+    hitHistory: 'Historique des coups',
+    hit: 'Clic',
+    hits: 'Clics',
+    noHitHistory: 'Aucun historique de recherche',
+  },
+  hitHistoryTable: {
+    query: 'Requ锚te',
+    match: 'Correspondance',
+    response: 'R茅ponse',
+    source: 'Source',
+    score: 'Score',
+    time: 'Temps',
+  },
+  initSetup: {
+    title: 'R茅ponse d\'Annotation Configuration Initiale',
+    configTitle: 'Configuration de la R茅ponse d\'Annotation',
+    confirmBtn: 'Enregistrer & Activer',
+    configConfirmBtn: 'Enregistrer',
+  },
+  embeddingModelSwitchTip: 'Mod猫le de vectorisation de texte d\'annotation, changer de mod猫les entra卯nera une r茅-int茅gration, ce qui entra卯nera des co没ts suppl茅mentaires.',
+}
+
+export default translation
diff --git a/i18n/fr-FR/app-api.ts b/i18n/fr-FR/app-api.ts
new file mode 100644
index 0000000..eb2f35d
--- /dev/null
+++ b/i18n/fr-FR/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'Serveur API',
+  apiKey: 'Cl茅 API',
+  status: 'Statut',
+  disabled: 'D茅sactiv茅',
+  ok: 'En Service',
+  copy: 'Copier',
+  copied: 'Copi茅',
+  play: 'Jouer',
+  pause: 'Pause',
+  playing: 'Jouant',
+  merMaid: {
+    rerender: 'Refaire Rerendu',
+  },
+  never: 'Jamais',
+  apiKeyModal: {
+    apiSecretKey: 'Cl茅 secr猫te de l\'API',
+    apiSecretKeyTips: 'Pour pr茅venir l\'abus de l\'API, prot茅gez votre cl茅 API. 脡vitez de l\'utiliser comme du texte brut dans le code front-end. :)',
+    createNewSecretKey: 'Cr茅er une nouvelle cl茅 secr猫te',
+    secretKey: 'Cl茅 Secr猫te',
+    created: 'CR脡脡',
+    lastUsed: 'DERNI脠RE UTILISATION',
+    generateTips: 'Gardez cette cl茅 dans un endroit s没r et accessible.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: 'Supprimer cette cl茅 secr猫te ?',
+    deleteConfirmTips: 'Cette action ne peut pas 锚tre annul茅e.',
+    ok: 'D\'accord',
+  },
+  completionMode: {
+    title: 'API de l\'application Completion',
+    info: 'Pour une g茅n茅ration de texte de haute qualit茅, telle que des articles, des r茅sum茅s et des traductions, utilisez l\'API completion-messages avec l\'entr茅e de l\'utilisateur. La g茅n茅ration de texte repose sur les param猫tres du mod猫le et les mod猫les de prompt d茅finis dans',
+    createCompletionApi: 'Cr茅er un Message de Fin',
+    createCompletionApiTip: 'Cr茅ez un message de fin pour soutenir le mode question-r茅ponse.',
+    inputsTips: '(Facultatif) Fournissez des champs de saisie utilisateur sous forme de paires cl茅-valeur, correspondant aux variables dans Prompt Eng. La cl茅 est le nom de la variable, la valeur est la valeur du param猫tre. Si le type de champ est S茅lection, la valeur sou',
+    queryTips: 'Contenu du texte saisi par l\'utilisateur.',
+    blocking: 'Type de blocage, en attente de l\'ex茅cution pour terminer et renvoyer les r茅sultats. (Les demandes peuvent 锚tre interrompues si le processus est long)',
+    streaming: 'retours en continu. Mise en 艙uvre de retours en continu bas茅e sur SSE (Server-Sent Events).',
+    messageFeedbackApi: 'Retour de message (j\'aime)',
+    messageFeedbackApiTip: '脡valuez les messages re莽us au nom des utilisateurs finaux avec des likes ou des dislikes. Ces donn茅es sont visibles sur la page Logs & Annotations et sont utilis茅es pour le r茅glage fin des mod猫les futurs.',
+    messageIDTip: 'ID de message',
+    ratingTip: 'aimer ou ne pas aimer, null est annuler',
+    parametersApi: 'Obtenir des informations sur les param猫tres de l\'application',
+    parametersApiTip: 'R茅cup茅rer les param猫tres d\'entr茅e configur茅s, y compris les noms de variables, les noms de champs, les types et les valeurs par d茅faut. G茅n茅ralement utilis茅 pour afficher ces champs dans un formulaire ou pour remplir les valeurs par d茅faut apr猫s le charg',
+  },
+  chatMode: {
+    title: 'API de l\'application de chat',
+    info: 'Pour des applications conversationnelles polyvalentes utilisant un format Q&R, appelez l\'API de chat-messages pour initier le dialogue. Maintenez les conversations en cours en passant l\'ID de conversation retourn茅. Les param猫tres de r茅ponse et les mod猫les d茅pendent des param猫tres de',
+    createChatApi: 'Cr茅er un message de chat',
+    createChatApiTip: 'Cr茅ez un nouveau message de conversation ou continuez un dialogue existant.',
+    inputsTips: '(Facultatif) Fournir des champs de saisie utilisateur sous forme de paires cl茅-valeur, correspondant aux variables dans Prompt Eng. La cl茅 est le nom de la variable, la valeur est la valeur du param猫tre. Si le type de champ est S茅lection, la valeur soumise',
+    queryTips: 'Contenu de la question/saisie de l\'utilisateur',
+    blocking: 'Type de blocage, en attente de l\'ex茅cution pour terminer et renvoyer les r茅sultats. (Les demandes peuvent 锚tre interrompues si le processus est long)',
+    streaming: 'retours en continu. Mise en 艙uvre de retours en continu bas茅e sur SSE (Server-Sent Events).',
+    conversationIdTip: '(Optional) Conversation ID: leave empty for first-time conversation; pass conversation_id from context to continue dialogue.',
+    messageFeedbackApi: 'Message de retour d\'information de l\'utilisateur du terminal, comme',
+    messageFeedbackApiTip: '脡valuez les messages re莽us au nom des utilisateurs finaux avec des likes ou des dislikes. Ces donn茅es sont visibles sur la page Logs & Annotations et sont utilis茅es pour l\'ajustement futur du mod猫le.',
+    messageIDTip: 'ID de message',
+    ratingTip: 'aimer ou ne pas aimer, null est annuler',
+    chatMsgHistoryApi: 'Obtenez le message de l\'historique de chat',
+    chatMsgHistoryApiTip: 'La premi猫re page renvoie la derni猫re `limit` bar, qui est en ordre inverse.',
+    chatMsgHistoryConversationIdTip: 'ID de conversation',
+    chatMsgHistoryFirstId: 'ID du premier enregistrement de chat sur la page actuelle. La valeur par d茅faut est aucune.',
+    chatMsgHistoryLimit: 'Combien de chats sont renvoy茅s en une seule demande',
+    conversationsListApi: 'Obtenir la liste des conversations',
+    conversationsListApiTip: 'Obtient la liste des sessions de l\'utilisateur actuel. Par d茅faut, les 20 derni猫res sessions sont renvoy茅es.',
+    conversationsListFirstIdTip: 'L\'ID du dernier enregistrement sur la page actuelle, par d茅faut aucun.',
+    conversationsListLimitTip: 'Combien de chats sont renvoy茅s dans une seule requ锚te',
+    conversationRenamingApi: 'Renommage de la conversation',
+    conversationRenamingApiTip: 'Renommez les conversations ; le nom est affich茅 dans les interfaces client multi-session.',
+    conversationRenamingNameTip: 'Nouveau nom',
+    parametersApi: 'Obtenir des informations sur les param猫tres de l\'application',
+    parametersApiTip: 'R茅cup茅rer les param猫tres d\'entr茅e configur茅s, y compris les noms de variables, les noms de champs, les types et les valeurs par d茅faut. Typiquement utilis茅 pour afficher ces champs dans un formulaire ou pour remplir les valeurs par d茅faut apr猫s le chargement du',
+  },
+  develop: {
+    requestBody: 'Corps de la Requ锚te',
+    pathParams: 'Params de chemin',
+    query: 'Requ锚te',
+    toc: 'Contenu',
+  },
+  loading: 'Chargement',
+  regenerate: 'R茅g茅n茅rer',
+}
+
+export default translation
diff --git a/i18n/fr-FR/app-debug.ts b/i18n/fr-FR/app-debug.ts
new file mode 100644
index 0000000..2fd8637
--- /dev/null
+++ b/i18n/fr-FR/app-debug.ts
@@ -0,0 +1,410 @@
+const translation = {
+  pageTitle: {
+    line1: 'INVITATION',
+    line2: 'Ing茅nierie',
+  },
+  orchestrate: 'Orchestrer',
+  promptMode: {
+    simple: 'Passez en Mode Expert pour modifier l\'int茅gralit茅 du PROMPT',
+    advanced: 'Mode Expert',
+    switchBack: 'Revenir en arri猫re',
+    advancedWarning: {
+      title: 'Vous 锚tes pass茅 en Mode Expert, et une fois que vous modifiez le PROMPT, vous NE POUVEZ PAS revenir au mode basique.',
+      description: 'En mode Expert, vous pouvez modifier l\'int茅gralit茅 du PROMPT.',
+      learnMore: 'En savoir plus',
+      ok: 'D\'accord',
+    },
+    operation: {
+      addMessage: 'Ajouter un message',
+    },
+    contextMissing: 'Le composant de contexte est manquant, l\'efficacit茅 de la suggestion peut ne pas 锚tre bonne.',
+  },
+  operation: {
+    applyConfig: 'Publier',
+    resetConfig: 'R茅initialiser',
+    debugConfig: 'D茅boguer',
+    addFeature: 'Ajouter une fonctionnalit茅',
+    automatic: 'G茅n茅rer',
+    stopResponding: 'Arr锚tez de r茅pondre',
+    agree: 'comme',
+    disagree: 'd茅teste',
+    cancelAgree: 'Annuler comme',
+    cancelDisagree: 'Annuler le dislike',
+    userAction: 'Utilisateur',
+  },
+  notSetAPIKey: {
+    title: 'La cl茅 du fournisseur LLM n\'a pas 茅t茅 d茅finie',
+    trailFinished: 'Parcours termin茅',
+    description: 'La cl茅 du fournisseur LLM n\'a pas 茅t茅 d茅finie, et elle doit 锚tre d茅finie avant le d茅bogage.',
+    settingBtn: 'Aller aux param猫tres',
+  },
+  trailUseGPT4Info: {
+    title: 'Ne prend pas en charge gpt-4 pour le moment',
+    description: 'Utilisez gpt-4, veuillez d茅finir la cl茅 API.',
+  },
+  feature: {
+    groupChat: {
+      title: 'Am茅lioration de chat',
+      description: 'Ajouter des param猫tres de pr茅-conversation pour les applications peut am茅liorer l\'exp茅rience utilisateur.',
+    },
+    groupExperience: {
+      title: 'Am茅lioration de l\'exp茅rience',
+    },
+    conversationOpener: {
+      title: 'Convertisseurs de conversation',
+      description: 'Dans une application de chat, la premi猫re phrase que l\'IA prononce activement 脿 l\'utilisateur est g茅n茅ralement utilis茅e comme message de bienvenue.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: 'Suivi',
+      description: 'La configuration de la suggestion des prochaines questions peut offrir aux utilisateurs une meilleure discussion.',
+      resDes: '3 suggestions pour la prochaine question de l\'utilisateur.',
+      tryToAsk: 'Essayez de demander',
+    },
+    moreLikeThis: {
+      title: 'Plus comme 莽a',
+      description: 'G茅n茅rez plusieurs textes 脿 la fois, puis modifiez et continuez 脿 g茅n茅rer',
+      generateNumTip: 'Nombre de chaque temps g茅n茅r茅',
+      tip: 'L\'utilisation de cette fonctionnalit茅 entra卯nera un surco没t de tokens suppl茅mentaires',
+    },
+    speechToText: {
+      title: 'Discours en Texte',
+      description: 'Une fois activ茅, vous pouvez utiliser l\'entr茅e vocale.',
+      resDes: 'La saisie vocale est activ茅e',
+    },
+    textToSpeech: {
+      title: 'Texte 脿 la parole',
+      description: 'Une fois activ茅, le texte peut 锚tre converti en parole.',
+      resDes: 'La Texte 脿 Audio est activ茅e',
+    },
+    citation: {
+      title: 'Citations et Attributions',
+      description: 'Une fois activ茅, affichez le document source et la section attribu茅e du contenu g茅n茅r茅.',
+      resDes: 'Les citations et attributions sont activ茅es',
+    },
+    annotation: {
+      title: 'R茅ponse d\'Annotation',
+      description: 'Vous pouvez manuellement ajouter une r茅ponse de haute qualit茅 au cache pour une correspondance prioritaire avec des questions d\'utilisateur similaires.',
+      resDes: 'La r茅ponse d\'annotation est activ茅e',
+      scoreThreshold: {
+        title: 'Seuil de Score',
+        description: 'Utilis茅 pour d茅finir le seuil de similarit茅 pour la r茅ponse d\'annotation.',
+        easyMatch: 'Correspondance Facile',
+        accurateMatch: 'Correspondance pr茅cise',
+      },
+      matchVariable: {
+        title: 'Correspondance de Variable',
+        choosePlaceholder: 'Choisissez la variable correspondante',
+      },
+      cacheManagement: 'Annotations',
+      cached: 'Annot茅',
+      remove: 'Supprimer',
+      removeConfirm: 'Supprimer cette annotation ?',
+      add: 'Ajouter une annotation',
+      edit: 'Modifier l\'annotation',
+    },
+    dataSet: {
+      title: 'Contexte',
+      noData: 'Vous pouvez importer des Connaissances comme contexte',
+      words: 'Mots',
+      textBlocks: 'Blocs de texte',
+      selectTitle: 'S茅lectionnez la connaissance de r茅f茅rence',
+      selected: 'Connaissance s茅lectionn茅e',
+      noDataSet: 'Aucune connaissance trouv茅e',
+      toCreate: 'Aller 脿 cr茅er',
+      notSupportSelectMulti: 'Actuellement, ne prend en charge qu\'une seule Connaissance',
+      queryVariable: {
+        title: 'Variable de requ锚te',
+        tip: 'Cette variable sera utilis茅e comme entr茅e de requ锚te pour la r茅cup茅ration du contexte, obtenant des informations contextuelles li茅es 脿 l\'entr茅e de cette variable.',
+        choosePlaceholder: 'Choisissez la variable de requ锚te',
+        noVar: 'Aucune variable',
+        noVarTip: 'veuillez cr茅er une variable sous la section Variables',
+        unableToQueryDataSet: 'Impossible de questionner la Connaissance',
+        unableToQueryDataSetTip: 'Impossible d\'interroger la Connaissance avec succ猫s, veuillez choisir une variable de requ锚te de contexte dans la section contexte.',
+        ok: 'D\'accord',
+        contextVarNotEmpty: 'la variable de requ锚te de contexte ne peut pas 锚tre vide',
+        deleteContextVarTitle: 'Supprimer la variable "{{varName}}" ?',
+        deleteContextVarTip: 'Cette variable a 茅t茅 d茅finie comme une variable de requ锚te de contexte, et sa suppression affectera l\'utilisation normale de la Connaissance. Si vous devez toujours la supprimer, veuillez la re-s茅lectionner dans la section contexte.',
+      },
+    },
+    tools: {
+      title: 'Outils',
+      tips: 'Les outils fournissent une m茅thode d\'appel API standard, prenant en compte les entr茅es de l\'utilisateur ou des variables comme param猫tres de requ锚te pour interroger des donn茅es externes en tant que contexte.',
+      toolsInUse: '{{count}} outils en usage',
+      modal: {
+        title: 'Outil',
+        toolType: {
+          title: 'Type d\'outil',
+          placeholder: 'Veuillez s茅lectionner le type d\'outil',
+        },
+        name: {
+          title: 'Nom',
+          placeholder: 'Veuillez entrer le nom',
+        },
+        variableName: {
+          title: 'Nom de la Variable',
+          placeholder: 'Veuillez entrer le nom de la variable',
+        },
+      },
+    },
+    conversationHistory: {
+      title: 'Historique de Conversation',
+      description: 'D茅finir les noms de pr茅fixe pour les r么les de conversation',
+      tip: 'L\'historique de conversation n\'est pas activ茅, veuillez ajouter <histories> dans le prompt ci-dessus.',
+      learnMore: 'En savoir plus',
+      editModal: {
+        title: 'Modifier les noms de r么les de conversation',
+        userPrefix: 'Pr茅fixe utilisateur',
+        assistantPrefix: 'Pr茅fixe de l\'assistant',
+      },
+    },
+    toolbox: {
+      title: 'BO脦TE 脌 OUTILS',
+    },
+    moderation: {
+      title: 'Mod茅ration de contenu',
+      description: 'S茅curisez la sortie du mod猫le en utilisant l\'API de mod茅ration ou en conservant une liste de mots sensibles.',
+      allEnabled: 'Contenu Entrant/Sortant Activ茅',
+      inputEnabled: 'Contenu Activ茅',
+      outputEnabled: 'Contenu de SORTIE activ茅',
+      modal: {
+        title: 'Param猫tres de mod茅ration de contenu',
+        provider: {
+          title: 'Fournisseur',
+          openai: 'Mod茅ration OpenAI',
+          openaiTip: {
+            prefix: 'La mod茅ration d\'OpenAI n茅cessite une cl茅 API OpenAI configur茅e dans le',
+            suffix: '.',
+          },
+          keywords: 'Mots-cl茅s',
+        },
+        keywords: {
+          tip: 'Un par ligne, s茅par茅s par des sauts de ligne. Jusqu\'脿 100 caract猫res par ligne.',
+          placeholder: 'Un par ligne, s茅par茅 par des sauts de ligne',
+          line: 'Ligne',
+        },
+        content: {
+          input: 'Mod茅rer le contenu INPUT',
+          output: 'Mod茅rer le contenu de SORTIE',
+          preset: 'R茅ponses pr茅茅tablies',
+          placeholder: 'Contenu des r茅ponses pr茅d茅finies ici',
+          condition: 'Contenu MOD脡R脡 pour INPUT et OUTPUT activ茅 au moins une fois',
+          fromApi: 'Les r茅ponses pr茅d茅finies sont renvoy茅es par l\'API',
+          errorMessage: 'Les r茅ponses pr茅d茅finies ne peuvent pas 锚tre vides',
+          supportMarkdown: 'Prise en charge de Markdown',
+        },
+        openaiNotConfig: {
+          before: 'La mod茅ration d\'OpenAI n茅cessite une cl茅 API OpenAI configur茅e dans le',
+          after: 'Sorry, but you didn\'t provide a text to translate. Could you please provide the text?',
+        },
+      },
+    },
+  },
+  resetConfig: {
+    title: 'Confirmer la r茅initialisation ?',
+    message:
+      'R茅initialiser supprime les modifications, en restaurant la derni猫re configuration publi茅e.',
+  },
+  errorMessage: {
+    nameOfKeyRequired: 'name of the key: {{key}} required',
+    valueOfVarRequired: 'La valeur de {{key}} ne peut pas 锚tre vide',
+    queryRequired: 'Le texte de la requ锚te est requis.',
+    waitForResponse:
+      'Veuillez attendre que la r茅ponse au message pr茅c茅dent soit termin茅e.',
+    waitForBatchResponse:
+      'Veuillez attendre que la r茅ponse 脿 la t芒che en lot soit termin茅e.',
+    notSelectModel: 'Veuillez choisir un mod猫le',
+    waitForImgUpload: 'Veuillez attendre que l\'image soit t茅l茅charg茅e',
+  },
+  chatSubTitle: 'Instructions',
+  completionSubTitle: 'Indicatif de Prompt',
+  promptTip:
+    'Les prompts guident les r茅ponses de l\'IA avec des instructions et des contraintes. Ins茅rez des variables comme {{input}}. Ce prompt ne sera pas visible pour les utilisateurs.',
+  formattingChangedTitle: 'Formatage modifi茅',
+  formattingChangedText:
+    'La modification du formatage r茅initialisera la zone de d茅bogage, 锚tes-vous s没r ?',
+  variableTitle: 'Variables',
+  variableTip:
+    'Les utilisateurs remplissent des variables dans un formulaire, rempla莽ant automatiquement les variables dans le prompt.',
+  notSetVar: 'Les variables permettent aux utilisateurs d\'introduire des mots de prompt ou des remarques d\'ouverture lors du remplissage des formulaires. Vous pouvez essayer de saisir "{{input}}" dans les mots de prompt.',
+  autoAddVar: 'Des variables ind茅finies r茅f茅renc茅es dans le pre-prompt, voulez-vous les ajouter dans le formulaire d\'entr茅e de l\'utilisateur ?',
+  variableTable: {
+    key: 'Cl茅 Variable',
+    name: 'Nom du champ d\'entr茅e de l\'utilisateur',
+    optional: 'Facultatif',
+    type: 'Type d\'Entr茅e',
+    action: 'Actions',
+    typeString: 'Cha卯ne',
+    typeSelect: 'S茅lectionner',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{key}} est obligatoire',
+    tooLong: '{{key}} too length. Can not be longer then 30 characters',
+    notValid: '{{key}} is invalid. Can only contain letters, numbers, and underscores',
+    notStartWithNumber: '{{key}} can not start with a number',
+    keyAlreadyExists: '{{key}} already exists',
+  },
+  otherError: {
+    promptNoBeEmpty: 'Le prompt ne peut pas 锚tre vide',
+    historyNoBeEmpty: 'L\'historique de la conversation doit 锚tre d茅fini dans le prompt',
+    queryNoBeEmpty: 'La requ锚te doit 锚tre d茅finie dans le prompt',
+  },
+  variableConfig: {
+    'addModalTitle': 'Add Input Field',
+    'editModalTitle': 'Edit Input Field',
+    'description': 'Setting for variable {{varName}}',
+    'fieldType': 'Field type',
+    'string': 'Short Text',
+    'text-input': 'Short Text',
+    'paragraph': 'Paragraph',
+    'select': 'Select',
+    'number': 'Number',
+    'notSet': 'Not set, try typing {{input}} in the prefix prompt',
+    'stringTitle': 'Form text box options',
+    'maxLength': 'Max length',
+    'options': 'Options',
+    'addOption': 'Add option',
+    'apiBasedVar': 'API-based Variable',
+    'varName': 'Variable Name',
+    'labelName': 'Label Name',
+    'inputPlaceholder': 'Please input',
+    'required': 'Required',
+    'errorMsg': {
+      varNameRequired: 'Variable name is required',
+      labelNameRequired: 'Label name is required',
+      varNameCanBeRepeat: 'Variable name can not be repeated',
+      atLeastOneOption: 'At least one option is required',
+      optionRepeat: 'Has repeat options',
+    },
+  },
+  vision: {
+    name: 'Vision',
+    description: 'Enable Vision permettra au mod猫le de prendre des images et de r茅pondre 脿 des questions 脿 leur sujet.',
+    settings: 'Param猫tres',
+    visionSettings: {
+      title: 'Param猫tres de Vision',
+      resolution: 'R茅solution',
+      resolutionTooltip: `low res will allow model receive a low-res 512 x 512 version of the image, and represent the image with a budget of 65 tokens. This allows the API to return faster responses and consume fewer input tokens for use cases that do not require high detail.
+      \n
+      high res will first allows the model to see the low res image and then creates detailed crops of input images as 512px squares based on the input image size. Each of the detailed crops uses twice the token budget for a total of 129 tokens.`,
+      high: '脡lev茅',
+      low: 'Faible',
+      uploadMethod: 'M茅thode de T茅l茅chargement',
+      both: 'Les deux',
+      localUpload: 'T茅l茅chargement Local',
+      url: 'URL',
+      uploadLimit: 'Limite de t茅l茅chargement',
+    },
+  },
+  voice: {
+    name: 'Voix',
+    defaultDisplay: 'Voix par d茅faut',
+    description: 'Param猫tres de la voix de synth猫se vocale',
+    settings: 'Param猫tres',
+    voiceSettings: {
+      title: 'Param猫tres de voix',
+      language: 'Langue',
+      resolutionTooltip: 'Support de la langue pour la voix de synth猫se de texte.',
+      voice: 'Voix',
+      autoPlay: 'Lecture Automatique',
+      autoPlayEnabled: 'Allumer',
+      autoPlayDisabled: 'Fermeture',
+    },
+  },
+  openingStatement: {
+    title: 'Ouverture de Conversation',
+    add: 'Ajouter',
+    writeOpener: '脡crire l\'introduction',
+    placeholder: 'R茅digez votre message d\'ouverture ici, vous pouvez utiliser des variables, essayez de taper {{variable}}.',
+    openingQuestion: 'Questions d\'ouverture',
+    noDataPlaceHolder:
+      'Commencer la conversation avec l\'utilisateur peut aider l\'IA 脿 茅tablir une connexion plus proche avec eux dans les applications conversationnelles.',
+    varTip: 'Vous pouvez utiliser des variables, essayez de taper {{variable}}',
+    tooShort: 'Au moins 20 mots de l\'invite initiale sont requis pour g茅n茅rer des remarques d\'ouverture pour la conversation.',
+    notIncludeKey: 'The initial prompt does not include the variable: {{key}}. Please add it to the initial prompt.',
+  },
+  modelConfig: {
+    model: 'Mod猫le',
+    setTone: 'D茅finir le ton des r茅ponses',
+    title: 'Mod猫le et Param猫tres',
+    modeType: {
+      chat: 'Discussion',
+      completion: 'Complet',
+    },
+  },
+  inputs: {
+    title: 'D茅boguer et Aper莽u',
+    noPrompt: 'Essayez d\'茅crire une proposition dans l\'entr茅e pr茅-proposition',
+    userInputField: 'Champ de saisie utilisateur',
+    noVar: 'Remplissez la valeur de la variable, qui sera automatiquement remplac茅e dans le mot d\'invite chaque fois qu\'une nouvelle session est d茅marr茅e.',
+    chatVarTip:
+      'Remplissez la valeur de la variable, qui sera automatiquement remplac茅e dans le mot d\'invite chaque fois qu\'une nouvelle session est d茅marr茅e',
+    completionVarTip:
+      'Remplissez la valeur de la variable, qui sera automatiquement remplac茅e dans les mots de l\'invite chaque fois qu\'une question est soumise.',
+    previewTitle: 'Aper莽u de la prompte',
+    queryTitle: 'Contenu de la requ锚te',
+    queryPlaceholder: 'Veuillez entrer le texte de la demande.',
+    run: 'EX脡CUTER',
+  },
+  result: 'Texte de sortie',
+  datasetConfig: {
+    settingTitle: 'Param猫tres de r茅cup茅ration',
+    knowledgeTip: 'Cliquez sur le bouton 鈥�+鈥� pour ajouter des connaissances',
+    retrieveOneWay: {
+      title: 'R茅cup茅ration N-vers-1',
+      description: 'En fonction de l\'intention de l\'utilisateur et des descriptions de Connaissance, l\'Agent s茅lectionne de mani猫re autonome la meilleure Connaissance pour interroger. Id茅al pour les applications avec une Connaissance distincte et limit茅e.',
+    },
+    retrieveMultiWay: {
+      title: 'R茅cup茅ration multi-chemins',
+      description: 'En fonction de l\'intention de l\'utilisateur, interroge toutes les connaissances, r茅cup猫re le texte pertinent de plusieurs sources et s茅lectionne les meilleurs r茅sultats correspondant 脿 la requ锚te de l\'utilisateur apr猫s r茅ordonnancement. La configuration de l\'API du mod猫le de r茅ordonnancement est requise',
+    },
+    rerankModelRequired: 'Un mod猫le de r茅organisation est n茅cessaire',
+    params: 'Param猫tres',
+    top_k: 'Top K',
+    top_kTip: 'Utilis茅 pour filtrer les morceaux qui sont les plus similaires aux questions de l\'utilisateur. Le syst猫me ajustera 茅galement dynamiquement la valeur de Top K, selon max_tokens du mod猫le s茅lectionn茅.',
+    score_threshold: 'Seuil de Score',
+    score_thresholdTip: 'Utilis茅 pour d茅finir le seuil de similarit茅 pour le filtrage des morceaux.',
+    retrieveChangeTip: 'La modification du mode d\'indexation et du mode de r茅cup茅ration peut affecter les applications associ茅es 脿 cette Connaissance.',
+  },
+  debugAsSingleModel: 'D茅boguer comme Mod猫le Unique',
+  debugAsMultipleModel: 'D茅boguer en tant que Mod猫les Multiples',
+  duplicateModel: 'Dupliquer',
+  publishAs: 'Publier comme',
+  assistantType: {
+    name: 'Type d\'Assistant',
+    chatAssistant: {
+      name: 'Assistant de Base',
+      description: 'Construisez un assistant bas茅 sur le chat en utilisant un grand mod猫le de langage',
+    },
+    agentAssistant: {
+      name: 'Assistant Agent',
+      description: 'Construisez un Agent intelligent qui peut choisir de mani猫re autonome des outils pour accomplir les t芒ches',
+    },
+  },
+  agent: {
+    agentMode: 'Mode Agent',
+    agentModeDes: 'D茅finissez le type de mode d\'inf茅rence pour l\'agent',
+    agentModeType: {
+      ReACT: 'R茅Agir',
+      functionCall: 'Appel de fonction',
+    },
+    setting: {
+      name: 'Param猫tres de l\'Agent',
+      description: 'Les param猫tres de l\'Assistant Agent permettent de d茅finir le mode de l\'agent et des fonctionnalit茅s avanc茅es comme les prompts int茅gr茅s, uniquement disponibles dans le type Agent.',
+      maximumIterations: {
+        name: 'Nombre Maximum d\'It茅rations',
+        description: 'Limiter le nombre d\'it茅rations qu\'un assistant agent peut ex茅cuter',
+      },
+    },
+    buildInPrompt: 'Prompt Int茅gr茅',
+    firstPrompt: 'Premi猫re Prompte',
+    nextIteration: 'Prochaine It茅ration',
+    promptPlaceholder: '脡crivez votre prompt ici',
+    tools: {
+      name: 'Outils',
+      description: 'L\'utilisation d\'outils peut 茅tendre les capacit茅s des LLM, comme la recherche sur internet ou l\'ex茅cution de calculs scientifiques.',
+      enabled: 'Activ茅',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/fr-FR/app-log.ts b/i18n/fr-FR/app-log.ts
new file mode 100644
index 0000000..6d99e74
--- /dev/null
+++ b/i18n/fr-FR/app-log.ts
@@ -0,0 +1,98 @@
+const translation = {
+  title: 'Journaux',
+  description: 'Les journaux enregistrent l\'茅tat d\'ex茅cution de l\'application, y compris les entr茅es utilisateur et les r茅ponses de l\'IA.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: 'Heure de mise 脿 jour',
+      time: 'Heure de cr茅ation',
+      endUser: 'Utilisateur final ou compte',
+      input: 'Entr茅e',
+      output: 'Sortie',
+      summary: 'Titre',
+      messageCount: 'Nombre de messages',
+      userRate: 'Taux utilisateur',
+      adminRate: 'Taux op.',
+      startTime: 'HEURE DE D脡BUT',
+      status: 'STATUT',
+      runtime: 'TEMPS D\'EX脡CUTION',
+      tokens: 'JETONS',
+      user: 'UTILISATEUR FINAL OU COMPTE',
+      version: 'VERSION',
+    },
+    pagination: {
+      previous: 'Pr茅c茅dent',
+      next: 'Suivant',
+    },
+    empty: {
+      noChat: 'Aucune conversation pour le moment',
+      noOutput: 'Aucune sortie',
+      element: {
+        title: 'Y a-t-il quelqu\'un ?',
+        content: 'Observez et annotez ici les interactions entre les utilisateurs finaux et les applications d\'IA pour am茅liorer en continu la pr茅cision de l\'IA. Vous pouvez essayer de <shareLink>partager</shareLink> ou de <testLink>tester</testLink> l\'application Web vous-m锚me, puis revenir sur cette page.',
+      },
+    },
+  },
+  detail: {
+    time: 'Heure',
+    conversationId: 'ID de conversation',
+    promptTemplate: 'Mod猫le de consigne',
+    promptTemplateBeforeChat: 'Mod猫le de consigne avant la conversation 路 En tant que message syst猫me',
+    annotationTip: 'Am茅liorations marqu茅es par {{user}}',
+    timeConsuming: '',
+    second: 's',
+    tokenCost: 'Jeton d茅pens茅',
+    loading: 'chargement',
+    operation: {
+      like: 'j\'aime',
+      dislike: 'je n\'aime pas',
+      addAnnotation: 'Ajouter une am茅lioration',
+      editAnnotation: 'Modifier une am茅lioration',
+      annotationPlaceholder: 'Entrez la r茅ponse attendue que vous souhaitez que l\'IA donne, cela peut 锚tre utilis茅 pour le r茅glage fin du mod猫le et l\'am茅lioration continue de la qualit茅 de g茅n茅ration de texte 脿 l\'avenir.',
+    },
+    variables: 'Variables',
+    uploadImages: 'Images t茅l茅charg茅es',
+    modelParams: 'Param猫tres du mod猫le',
+  },
+  filter: {
+    period: {
+      today: 'Aujourd\'hui',
+      last7days: '7 derniers jours',
+      last4weeks: '4 derni猫res semaines',
+      last3months: '3 derniers mois',
+      last12months: '12 derniers mois',
+      monthToDate: 'Mois 脿 ce jour',
+      quarterToDate: 'Trimestre 脿 ce jour',
+      yearToDate: 'Ann茅e 脿 ce jour',
+      allTime: 'Tout le temps',
+    },
+    annotation: {
+      all: 'Tous',
+      annotated: 'Am茅liorations annot茅es ({{count}} 茅l茅ments)',
+      not_annotated: 'Non annot茅',
+    },
+    sortBy: 'Trier par :',
+    descending: 'd茅croissant',
+    ascending: 'croissant',
+  },
+  workflowTitle: 'Journaux de workflow',
+  workflowSubtitle: 'Le journal enregistre l\'op茅ration d\'Automate.',
+  runDetail: {
+    title: 'Journal de conversation',
+    workflowTitle: 'D茅tail du journal',
+    fileListDetail: 'D茅tail',
+    fileListLabel: 'D茅tails du fichier',
+  },
+  promptLog: 'Journal de consigne',
+  agentLog: 'Journal des agents',
+  viewLog: 'Voir le journal',
+  agentLogDetail: {
+    agentMode: 'Mode Agent',
+    toolUsed: 'Outil utilis茅',
+    iterations: 'It茅rations',
+    iteration: 'It茅ration',
+    finalProcessing: 'Traitement final',
+  },
+}
+
+export default translation
diff --git a/i18n/fr-FR/app-overview.ts b/i18n/fr-FR/app-overview.ts
new file mode 100644
index 0000000..43cbdf4
--- /dev/null
+++ b/i18n/fr-FR/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: 'Pour commencer,',
+    enterKeyTip: 'saisissez votre cl茅 API OpenAI ci-dessous',
+    getKeyTip: 'Obtenez votre cl茅 API depuis le tableau de bord OpenAI',
+    placeholder: 'Votre cl茅 API OpenAI (ex. sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: 'Vous utilisez le quota d\'essai de {{providerName}}.',
+        description: 'Le quota d\'essai est fourni pour votre usage de test. Avant l\'茅puisement des appels de quota d\'essai, veuillez configurer votre propre fournisseur de mod猫le ou acheter un quota suppl茅mentaire.',
+      },
+      exhausted: {
+        title: 'Votre quota d\'essai a 茅t茅 utilis茅, veuillez configurer votre cl茅 API.',
+        description: 'Votre quota d\'essai a 茅t茅 茅puis茅. Veuillez configurer votre propre fournisseur de mod猫le ou acheter un quota suppl茅mentaire.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: 'Pour commencer,',
+        row2: 'configurez d\'abord votre fournisseur de mod猫le.',
+      },
+    },
+    callTimes: 'Appels',
+    usedToken: 'Token utilis茅s',
+    setAPIBtn: 'Aller 脿 la configuration du fournisseur de mod猫le',
+    tryCloud: 'Ou essayez la version cloud de Dify avec un devis gratuit',
+  },
+  overview: {
+    title: 'Aper莽u',
+    appInfo: {
+      explanation: 'WebApp AI pr锚te 脿 l\'emploi',
+      accessibleAddress: 'URL publique',
+      preview: 'Aper莽u',
+      regenerate: 'Reg茅n茅rer',
+      regenerateNotice: 'Voulez-vous r茅g茅n茅rer l\'URL publique ?',
+      preUseReminder: 'Veuillez activer WebApp avant de continuer.',
+      settings: {
+        entry: 'Param猫tres',
+        title: 'Param猫tres de l\'application Web',
+        webName: 'Nom de l\'application Web',
+        webDesc: 'Description de l\'application Web',
+        webDescTip: 'Ce texte sera affich茅 c么t茅 client, fournissant des directives de base sur la fa莽on d\'utiliser l\'application',
+        webDescPlaceholder: 'Entrez la description de l\'application Web',
+        language: 'Langue',
+        workflow: {
+          title: '脡tapes du workflow',
+          show: 'Afficher',
+          hide: 'Masquer',
+          showDesc: 'Afficher ou masquer les d茅tails du flux de travail dans WebApp',
+          subTitle: 'D茅tails du flux de travail',
+        },
+        chatColorTheme: 'Th猫me de couleur du chatbot',
+        chatColorThemeDesc: 'D茅finir le th猫me de couleur du chatbot',
+        chatColorThemeInverted: 'Invers茅',
+        invalidHexMessage: 'Valeur hexad茅cimale invalide',
+        invalidPrivacyPolicy: 'Lien de politique de confidentialit茅 invalide. Veuillez utiliser un lien valide commen莽ant par http ou https',
+        more: {
+          entry: 'Afficher plus de param猫tres',
+          copyright: 'Droits d\'auteur',
+          copyRightPlaceholder: 'Entrez le nom de l\'auteur ou de l\'organisation',
+          privacyPolicy: 'Politique de confidentialit茅',
+          privacyPolicyPlaceholder: 'Entrez le lien de la politique de confidentialit茅',
+          privacyPolicyTip: 'Aide les visiteurs 脿 comprendre les donn茅es collect茅es par l\'application, voir la <privacyPolicyLink>Politique de confidentialit茅</privacyPolicyLink> de Dify.',
+          customDisclaimer: 'Clause de non-responsabilit茅 personnalis茅e',
+          customDisclaimerPlaceholder: 'Entrez le texte de la clause de non-responsabilit茅 personnalis茅e',
+          customDisclaimerTip: 'Le texte de la clause de non-responsabilit茅 personnalis茅e sera affich茅 c么t茅 client, fournissant des informations suppl茅mentaires sur l\'application',
+          copyrightTip: 'Afficher les informations de copyright dans l鈥檃pplication web',
+          copyrightTooltip: 'Veuillez passer 脿 l鈥檃bonnement professionnel ou sup茅rieur',
+        },
+        sso: {
+          label: 'Authentification SSO',
+          title: 'WebApp SSO',
+          tooltip: 'Contactez l鈥檃dministrateur pour activer l鈥檃uthentification unique WebApp',
+          description: 'Tous les utilisateurs doivent se connecter avec l鈥檃uthentification unique avant d鈥檜tiliser WebApp',
+        },
+        modalTip: 'Param猫tres de l鈥檃pplication web c么t茅 client.',
+      },
+      embedded: {
+        entry: 'Int茅gr茅',
+        title: 'Int茅grer sur un site Web',
+        explanation: 'Choisissez la mani猫re d\'int茅grer l\'application de chat 脿 votre site Web',
+        iframe: 'Pour ajouter l\'application de chat n\'importe o霉 sur votre site Web, ajoutez cette iframe 脿 votre code HTML.',
+        scripts: 'Pour ajouter une application de chat en bas 脿 droite de votre site Web, ajoutez ce code 脿 votre HTML.',
+        chromePlugin: 'Installer l\'extension Chrome Dify Chatbot',
+        copied: 'Copi茅',
+        copy: 'Copier',
+      },
+      qrcode: {
+        title: 'QR code 脿 partager',
+        scan: 'Scanner et partager l\'application',
+        download: 'T茅l茅charger le code QR',
+      },
+      customize: {
+        way: 'fa莽on',
+        entry: 'Personnaliser',
+        title: 'Personnaliser l\'application Web AI',
+        explanation: 'Vous pouvez personnaliser l\'interface utilisateur de l\'application Web pour r茅pondre 脿 vos besoins de sc茅nario et de style.',
+        way1: {
+          name: 'Faire une copie du code client, le modifier et le d茅ployer sur Vercel (recommand茅)',
+          step1: 'Faire une copie du code client et le modifier',
+          step1Tip: 'Cliquez ici pour faire une copie du code source dans votre compte GitHub et le modifier',
+          step1Operation: 'Client-Web-Dify',
+          step2: 'D茅ployer sur Vercel',
+          step2Tip: 'Cliquez ici pour importer le d茅p么t dans Vercel et le d茅ployer',
+          step2Operation: 'Importer le d茅p么t',
+          step3: 'Configurer les variables d\'environnement',
+          step3Tip: 'Ajoutez les variables d\'environnement suivantes dans Vercel',
+        },
+        way2: {
+          name: '脡crire du code c么t茅 client pour appeler l\'API et le d茅ployer sur un serveur',
+          operation: 'Documentation',
+        },
+      },
+      launch: 'Lancer',
+    },
+    apiInfo: {
+      title: 'API de service Backend',
+      explanation: 'Facilement int茅gr茅 dans votre application',
+      accessibleAddress: 'Point de terminaison du service API',
+      doc: 'R茅f茅rence de l\'API',
+    },
+    status: {
+      running: 'En service',
+      disable: 'D茅sactiver',
+    },
+  },
+  analysis: {
+    title: 'Analyse',
+    ms: 'ms',
+    tokenPS: 'Token/s',
+    totalMessages: {
+      title: 'Total des messages',
+      explanation: 'Nombre d\'interactions quotidiennes avec l\'IA.',
+    },
+    totalConversations: {
+      title: 'Conversations totales',
+      explanation: 'Nombre de conversations quotidiennes avec l\'IA ; ing茅nierie/d茅bogage des prompts exclus.',
+    },
+    activeUsers: {
+      title: 'Utilisateurs actifs',
+      explanation: 'Utilisateurs uniques engag茅s dans des Q&R avec l\'IA ; l\'ing茅nierie/le d茅bogage des prompts sont exclus.',
+    },
+    tokenUsage: {
+      title: 'Utilisation des tokens',
+      explanation: 'Reflet de l\'utilisation quotidienne des tokens du mod猫le de langue pour l\'application, utile pour le contr么le des co没ts.',
+      consumed: 'Consomm茅',
+    },
+    avgSessionInteractions: {
+      title: 'Interactions moyennes par session',
+      explanation: 'Nombre de communications continu utilisateur-IA ; pour les applications bas茅es sur la conversation.',
+    },
+    avgUserInteractions: {
+      title: 'Interactions moyennes par utilisateur',
+      explanation: 'Reflet de la fr茅quence d\'utilisation quotidienne des utilisateurs. Cette m茅trique refl猫te la fid茅lit茅 des utilisateurs.',
+    },
+    userSatisfactionRate: {
+      title: 'Taux de satisfaction des utilisateurs',
+      explanation: 'Le nombre de likes parmi 1 000 messages. Cela indique la proportion de r茅ponses avec lesquelles les utilisateurs sont tr猫s satisfaits.',
+    },
+    avgResponseTime: {
+      title: 'Temps de r茅ponse moyen',
+      explanation: 'Temps (ms) pour l\'IA pour traiter/r茅pondre ; pour les applications bas茅es sur du texte.',
+    },
+    tps: {
+      title: 'Vitesse de sortie de token',
+      explanation: 'Mesurer les performances du LLM. Compter la vitesse de sortie des tokens du LLM depuis le d茅but de la requ锚te jusqu\'脿 l\'ach猫vement de la sortie.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/fr-FR/app.ts b/i18n/fr-FR/app.ts
new file mode 100644
index 0000000..16353d9
--- /dev/null
+++ b/i18n/fr-FR/app.ts
@@ -0,0 +1,213 @@
+const translation = {
+  createApp: 'CR脡ER UNE APPLICATION',
+  types: {
+    all: 'Tout',
+    chatbot: 'Chatbot',
+    agent: 'Agent',
+    workflow: 'Flux de travail',
+    completion: 'Terminaison',
+    basic: 'Basique',
+    advanced: 'Chatflow',
+  },
+  duplicate: 'Dupliquer',
+  duplicateTitle: 'Dupliquer l\'application',
+  export: 'Exporter DSL',
+  exportFailed: '脡chec de l\'exportation du DSL.',
+  importDSL: 'Importer le fichier DSL',
+  createFromConfigFile: 'Cr茅er 脿 partir du fichier DSL',
+  deleteAppConfirmTitle: 'Supprimer cette application ?',
+  deleteAppConfirmContent:
+    'La suppression de l\'application est irr茅versible. Les utilisateurs ne pourront plus acc茅der 脿 votre application et toutes les configurations de prompt et les journaux seront d茅finitivement supprim茅s.',
+  appDeleted: 'Application supprim茅e',
+  appDeleteFailed: '脡chec de la suppression de l\'application',
+  join: 'Rejoindre la communaut茅',
+  communityIntro:
+    'Discutez avec les membres de l\'茅quipe, les contributeurs et les d茅veloppeurs sur diff茅rents canaux.',
+  roadmap: 'Voir notre feuille de route',
+  newApp: {
+    startFromBlank: 'Cr茅er 脿 partir de z茅ro',
+    startFromTemplate: 'Cr茅er 脿 partir d\'un mod猫le',
+    captionAppType: 'Quel type d\'application souhaitez-vous cr茅er ?',
+    chatbotDescription: 'Construisez une application bas茅e sur le chat. Cette application utilise un format question-r茅ponse, permettant ainsi plusieurs tours de conversation continue.',
+    completionDescription: 'Construisez une application qui g茅n猫re du texte de haute qualit茅 en fonction des invites, telles que la g茅n茅ration d\'articles, de r茅sum茅s, de traductions, et plus encore.',
+    completionWarning: 'Ce type d\'application ne sera plus pris en charge.',
+    agentDescription: 'Construisez un agent intelligent capable de choisir automatiquement les outils pour accomplir les t芒ches',
+    workflowDescription: 'Construisez une application qui g茅n猫re du texte de haute qualit茅 en fonction d\'un flux de travail avec un haut degr茅 de personnalisation. Il convient aux utilisateurs exp茅riment茅s.',
+    workflowWarning: 'Actuellement en version b锚ta',
+    chatbotType: 'M茅thode d\'orchestration du chatbot',
+    basic: 'Basique',
+    basicTip: 'Pour les d茅butants, peut passer 脿 Chatflow plus tard',
+    basicFor: 'POUR LES D脡BUTANTS',
+    basicDescription: 'L\'orchestration de base permet d\'orchestrer une application Chatbot 脿 l\'aide de param猫tres simples, sans possibilit茅 de modifier les invites int茅gr茅es. Il convient aux d茅butants.',
+    advanced: 'Chatflow',
+    advancedFor: 'Pour les utilisateurs avanc茅s',
+    advancedDescription: 'L\'orchestration de flux de travail orchestre les Chatbots sous forme de workflows, offrant un haut degr茅 de personnalisation, y compris la possibilit茅 de modifier les invites int茅gr茅es. Il convient aux utilisateurs exp茅riment茅s.',
+    captionName: 'Ic么ne et nom de l\'application',
+    appNamePlaceholder: 'Donnez un nom 脿 votre application',
+    captionDescription: 'Description',
+    appDescriptionPlaceholder: 'Entrez la description de l\'application',
+    useTemplate: 'Utiliser ce mod猫le',
+    previewDemo: 'Aper莽u de la d茅mo',
+    chatApp: 'Assistant',
+    chatAppIntro:
+      'Je veux construire une application bas茅e sur le chat. Cette application utilise un format question-r茅ponse, permettant plusieurs tours de conversation continue.',
+    agentAssistant: 'Nouvel assistant agent',
+    completeApp: 'G茅n茅rateur de texte',
+    completeAppIntro:
+      'Je veux cr茅er une application qui g茅n猫re du texte de haute qualit茅 en fonction des invites, telles que la g茅n茅ration d\'articles, de r茅sum茅s, de traductions, et plus encore.',
+    showTemplates: 'Je veux choisir parmi un mod猫le',
+    hideTemplates: 'Revenir 脿 la s茅lection de mode',
+    Create: 'Cr茅er',
+    Cancel: 'Annuler',
+    nameNotEmpty: 'Le nom ne peut pas 锚tre vide',
+    appTemplateNotSelected: 'Veuillez s茅lectionner un mod猫le',
+    appTypeRequired: 'Veuillez s茅lectionner un type d\'application',
+    appCreated: 'Application cr茅茅e',
+    appCreateFailed: '脡chec de la cr茅ation de l\'application',
+    Confirm: 'Confirmer',
+    caution: 'Prudence',
+    appCreateDSLWarning: 'Attention : la diff茅rence de version DSL peut affecter certaines fonctionnalit茅s',
+    appCreateDSLErrorPart4: 'Version DSL prise en charge par le syst猫me :',
+    appCreateDSLErrorPart1: 'Une diff茅rence significative entre les versions DSL a 茅t茅 d茅tect茅e. Forcer l鈥檌mportation peut entra卯ner un dysfonctionnement de l鈥檃pplication.',
+    appCreateDSLErrorTitle: 'Incompatibilit茅 de version',
+    appCreateDSLErrorPart3: 'Version actuelle de l鈥檃pplication DSL :',
+    appCreateDSLErrorPart2: 'Voulez-vous continuer聽?',
+    foundResults: '{{compte}} R茅sultats',
+    workflowShortDescription: 'Orchestration pour les t芒ches d鈥檃utomatisation 脿 tour unique',
+    agentShortDescription: 'Agent intelligent avec raisonnement et utilisation autonome de l鈥檕util',
+    learnMore: 'Pour en savoir plus',
+    noTemplateFound: 'Aucun mod猫le trouv茅',
+    completionShortDescription: 'Assistant IA pour les t芒ches de g茅n茅ration de texte',
+    chatbotShortDescription: 'Chatbot bas茅 sur LLM avec configuration simple',
+    advancedUserDescription: 'Orchestration du flux de travail pour les t芒ches de dialogue complexes 脿 plusieurs tours avec des capacit茅s de m茅moire.',
+    noTemplateFoundTip: 'Essayez d鈥檈ffectuer une recherche 脿 l鈥檃ide de mots-cl茅s diff茅rents.',
+    noAppsFound: 'Aucune application trouv茅e',
+    chooseAppType: 'Choisissez le type d鈥檃pplication',
+    forAdvanced: 'POUR LES UTILISATEURS AVANC脡S',
+    chatbotUserDescription: 'Cr茅ez rapidement un chatbot bas茅 sur LLM avec une configuration simple. Vous pouvez passer 脿 Chatflow plus tard.',
+    workflowUserDescription: 'Orchestration du flux de travail pour les t芒ches ponctuelles telles que l鈥檃utomatisation et le traitement par lots.',
+    completionUserDescription: 'Cr茅ez rapidement un assistant IA pour les t芒ches de g茅n茅ration de texte avec une configuration simple.',
+    agentUserDescription: 'Un agent intelligent capable d鈥檜n raisonnement it茅ratif et d鈥檜ne utilisation autonome d鈥檕utils pour atteindre les objectifs de la t芒che.',
+    forBeginners: 'POUR LES D脡BUTANTS',
+    foundResult: '{{compte}} R茅sultat',
+    noIdeaTip: 'Pas d鈥檌d茅es ? Consultez nos mod猫les',
+    optional: 'Optionnel',
+    advancedShortDescription: 'Flux de travail pour des dialogues complexes 脿 plusieurs tours avec m茅moire',
+  },
+  editApp: 'Modifier les informations',
+  editAppTitle: 'Modifier les informations de l\'application',
+  editDone: 'Informations sur l\'application mises 脿 jour',
+  editFailed: '脡chec de la mise 脿 jour des informations de l\'application',
+  iconPicker: {
+    ok: 'OK',
+    cancel: 'Annuler',
+    emoji: 'Emoji',
+    image: 'Image',
+  },
+  switch: 'Passer 脿 l\'orchestration de flux de travail',
+  switchTipStart: 'Une nouvelle copie de l\'application sera cr茅茅e pour vous, et la nouvelle copie passera 脿 l\'orchestration de flux de travail. La nouvelle copie ne permettra pas le ',
+  switchTip: 'retour',
+  switchTipEnd: ' 脿 l\'orchestration de base.',
+  switchLabel: 'La copie de l\'application 脿 cr茅er',
+  removeOriginal: 'Supprimer l\'application d\'origine',
+  switchStart: 'Commencer la commutation',
+  typeSelector: {
+    all: 'Tous Types',
+    chatbot: 'Chatbot',
+    agent: 'Agent',
+    workflow: 'Flux de travail',
+    completion: 'Terminaison',
+    advanced: 'Chatflow',
+  },
+  tracing: {
+    title: 'Tra莽age des performances de l\'application',
+    description: 'Configuration d\'un fournisseur LLMOps tiers et tra莽age des performances de l\'application.',
+    config: 'Configurer',
+    collapse: 'R茅duire',
+    expand: 'D茅velopper',
+    tracing: 'Tra莽age',
+    disabled: 'D茅sactiv茅',
+    disabledTip: 'Veuillez d\'abord configurer le fournisseur',
+    enabled: 'En service',
+    tracingDescription: 'Capturez le contexte complet de l\'ex茅cution de l\'application, y compris les appels LLM, le contexte, les prompts, les requ锚tes HTTP et plus encore, vers une plateforme de tra莽age tierce.',
+    configProviderTitle: {
+      configured: 'Configur茅',
+      notConfigured: 'Configurez le fournisseur pour activer le tra莽age',
+      moreProvider: 'Plus de fournisseurs',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: 'Une plateforme de d茅veloppement tout-en-un pour chaque 茅tape du cycle de vie des applications bas茅es sur LLM.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: 'Traces, 茅valuations, gestion des prompts et m茅triques pour d茅boguer et am茅liorer votre application LLM.',
+    },
+    inUse: 'En utilisation',
+    configProvider: {
+      title: 'Configurer ',
+      placeholder: 'Entrez votre {{key}}',
+      project: 'Projet',
+      publicKey: 'Cl茅 Publique',
+      secretKey: 'Cl茅 Secr猫te',
+      viewDocsLink: 'Voir la documentation de {{key}}',
+      removeConfirmTitle: 'Supprimer la configuration de {{key}} ?',
+      removeConfirmContent: 'La configuration actuelle est en cours d\'utilisation, sa suppression d茅sactivera la fonction de Tra莽age.',
+    },
+    view: 'Vue',
+    opik: {
+      description: 'Opik est une plate-forme open-source pour l鈥櫭﹙aluation, le test et la surveillance des applications LLM.',
+      title: 'Opik',
+    },
+    weave: {
+      title: 'Tisser',
+      description: 'Weave est une plateforme open-source pour 茅valuer, tester et surveiller les applications LLM.',
+    },
+  },
+  answerIcon: {
+    description: 'S鈥檌l faut utiliser l鈥檌c么ne WebApp pour remplacer 馃 dans l鈥檃pplication partag茅e',
+    title: 'Utiliser l鈥檌c么ne WebApp pour remplacer 馃',
+    descriptionInExplore: 'Utilisation de l鈥檌c么ne WebApp pour remplacer 馃 dans Explore',
+  },
+  importFromDSLUrlPlaceholder: 'Collez le lien DSL ici',
+  importFromDSL: 'Importation 脿 partir d鈥檜ne DSL',
+  importFromDSLUrl: '脌 partir de l鈥橴RL',
+  importFromDSLFile: '脌 partir d鈥檜n fichier DSL',
+  mermaid: {
+    handDrawn: 'Dessin茅 脿 la main',
+    classic: 'Classique',
+  },
+  openInExplore: 'Ouvrir dans Explorer',
+  newAppFromTemplate: {
+    sidebar: {
+      HR: 'RH',
+      Assistant: 'Assistant',
+      Writing: '脡criture',
+      Programming: 'Programmation',
+      Recommended: 'Recommand茅',
+      Workflow: 'Flux de travail',
+      Agent: 'Agent',
+    },
+    byCategories: 'PAR CAT脡GORIES',
+    searchAllTemplate: 'Rechercher dans tous les mod猫les...',
+  },
+  showMyCreatedAppsOnly: 'Afficher uniquement mes applications cr茅茅es',
+  appSelector: {
+    noParams: 'Aucun param猫tre n茅cessaire',
+    params: 'PARAM脠TRES DE L鈥橝PPLICATION',
+    label: 'APPLI',
+    placeholder: 'S茅lectionnez une application...',
+  },
+  structOutput: {
+    LLMResponse: 'R茅ponse LLM',
+    notConfiguredTip: 'La sortie structur茅e n\'a pas encore 茅t茅 configur茅e.',
+    required: 'Obligatoire',
+    structuredTip: 'Les sorties structur茅es sont une fonctionnalit茅 qui garantit que le mod猫le g茅n茅rera toujours des r茅ponses qui respectent votre sch茅ma JSON fourni.',
+    modelNotSupportedTip: 'Le mod猫le actuel ne prend pas en charge cette fonctionnalit茅 et est automatiquement r茅trograd茅 脿 l\'injection de prompt.',
+    modelNotSupported: 'Mod猫le non pris en charge',
+    moreFillTip: 'Affichage d\'un maximum de 10 niveaux d\'imbrication',
+    configure: 'Configurer',
+  },
+}
+
+export default translation
diff --git a/i18n/fr-FR/billing.ts b/i18n/fr-FR/billing.ts
new file mode 100644
index 0000000..879a067
--- /dev/null
+++ b/i18n/fr-FR/billing.ts
@@ -0,0 +1,200 @@
+const translation = {
+  currentPlan: 'Plan Actuel',
+  upgradeBtn: {
+    plain: 'Mettre 脿 jour le plan',
+    encourage: 'Mettre 脿 niveau maintenant',
+    encourageShort: 'Mise 脿 niveau',
+  },
+  viewBilling: 'G茅rer la facturation et les abonnements',
+  buyPermissionDeniedTip: 'Veuillez contacter votre administrateur d\'entreprise pour vous abonner',
+  plansCommon: {
+    title: 'Choisissez un plan qui vous convient',
+    yearlyTip: 'Obtenez 2 mois gratuitement en vous abonnant annuellement !',
+    mostPopular: 'Le Plus Populaire',
+    planRange: {
+      monthly: 'Mensuel',
+      yearly: 'Annuel',
+    },
+    month: 'mois',
+    year: 'ann茅e',
+    save: 'Enregistrer',
+    free: 'Gratuit',
+    currentPlan: 'Plan Actuel',
+    contractSales: 'Contactez les ventes',
+    contractOwner: 'Contacter le chef d\'茅quipe',
+    startForFree: 'Commencez gratuitement',
+    getStartedWith: 'Commencez avec',
+    contactSales: 'Contacter les ventes',
+    talkToSales: 'Parlez aux Ventes',
+    modelProviders: 'Fournisseurs de Mod猫les',
+    teamMembers: 'Membres de l\'茅quipe',
+    buildApps: 'Construire des Applications',
+    vectorSpace: 'Espace Vectoriel',
+    vectorSpaceBillingTooltip: 'Chaque 1MB peut stocker environ 1,2 million de caract猫res de donn茅es vectoris茅es (estim茅 en utilisant les embeddings OpenAI, varie selon les mod猫les).',
+    vectorSpaceTooltip: 'L\'espace vectoriel est le syst猫me de m茅moire 脿 long terme n茅cessaire pour que les LLMs comprennent vos donn茅es.',
+    documentsUploadQuota: 'Quota de t茅l茅chargement de documents',
+    documentProcessingPriority: 'Priorit茅 de Traitement de Document',
+    documentProcessingPriorityTip: 'Pour une priorit茅 de traitement de documents plus 茅lev茅e, veuillez mettre 脿 niveau votre plan.',
+    documentProcessingPriorityUpgrade: 'Traitez plus de donn茅es avec une pr茅cision plus 茅lev茅e 脿 des vitesses plus rapides.',
+    priority: {
+      'standard': 'Standard',
+      'priority': 'Priorit茅',
+      'top-priority': 'Priorit茅 Maximale',
+    },
+    logsHistory: 'Historique des logs',
+    customTools: 'Outils personnalis茅s',
+    unavailable: 'Indisponible',
+    days: 'jours',
+    unlimited: 'Illimit茅',
+    support: 'Assistance',
+    supportItems: {
+      communityForums: 'Forums communautaires',
+      emailSupport: 'Support par email',
+      priorityEmail: 'Support prioritaire par email et chat',
+      logoChange: 'Changement de logo',
+      SSOAuthentication: 'Authentification SSO',
+      personalizedSupport: 'Soutien personnalis茅',
+      dedicatedAPISupport: 'Support d茅di茅 pour l\'API',
+      customIntegration: 'Int茅gration personnalis茅e et support',
+      ragAPIRequest: 'Requ锚tes API RAG',
+      bulkUpload: 'T茅l茅chargement en masse de documents',
+      agentMode: 'Mode Agent',
+      workflow: 'Flux de travail',
+      llmLoadingBalancingTooltip: 'Ajoutez plusieurs cl茅s API aux mod猫les, en contournant efficacement les limites de d茅bit de l鈥橝PI.',
+      llmLoadingBalancing: '脡quilibrage de charge LLM',
+    },
+    comingSoon: 'Bient么t disponible',
+    member: 'Membre',
+    memberAfter: 'Membre',
+    messageRequest: {
+      title: 'Cr茅dits de message',
+      tooltip: 'Quotas d\'invocation de messages pour divers plans utilisant les mod猫les OpenAI (sauf gpt4). Les messages d茅passant la limite utiliseront votre cl茅 API OpenAI.',
+      titlePerMonth: '{{count,number}} messages/mois',
+    },
+    annotatedResponse: {
+      title: 'Limites de quota d\'annotation',
+      tooltip: 'L\'茅dition manuelle et l\'annotation des r茅ponses fournissent des capacit茅s de r茅ponse aux questions de haute qualit茅 personnalisables pour les applications. (Applicable uniquement dans les applications de chat)',
+    },
+    ragAPIRequestTooltip: 'Fait r茅f茅rence au nombre d\'appels API invoquant uniquement les capacit茅s de traitement de la base de connaissances de Dify.',
+    receiptInfo: 'Seuls le propri茅taire de l\'茅quipe et l\'administrateur de l\'茅quipe peuvent s\'abonner et consulter les informations de facturation',
+    annotationQuota: 'Quota d鈥檃nnotation',
+    apiRateLimitUnit: '{{count,number}}/jour',
+    priceTip: 'par espace de travail/',
+    freeTrialTipSuffix: 'Aucune carte de cr茅dit requise',
+    teamWorkspace: '{{count,number}} Espace de travail d\'茅quipe',
+    teamMember_one: '{{count,number}} membre de l\'茅quipe',
+    annualBilling: 'Facturation Annuelle',
+    self: 'Auto-h茅berg茅',
+    documentsRequestQuota: '{{count,number}}/min Limite de Fr茅quence de Demande de Connaissance',
+    teamMember_other: '{{count,number}} Membres de l\'茅quipe',
+    getStarted: 'Commencer',
+    unlimitedApiRate: 'Pas de limite de taux d\'API',
+    cloud: 'Service cloud',
+    documentsTooltip: 'Quota sur le nombre de documents import茅s 脿 partir de la source de donn茅es de connaissance.',
+    freeTrialTip: 'essai gratuit de 200 appels OpenAI.',
+    freeTrialTipPrefix: 'Inscrivez-vous et obtenez un',
+    apiRateLimit: 'Limite de taux de l\'API',
+    comparePlanAndFeatures: 'Comparer les plans et les fonctionnalit茅s',
+    apiRateLimitTooltip: 'La limite de taux de l\'API s\'applique 脿 toutes les demandes effectu茅es via l\'API Dify, y compris la g茅n茅ration de texte, les conversations de chat, les ex茅cutions de flux de travail et le traitement de documents.',
+    documents: '{{count,number}} Documents de connaissance',
+    documentsRequestQuotaTooltip: 'Sp茅cifie le nombre total d\'actions qu\'un espace de travail peut effectuer par minute dans la base de connaissances, y compris la cr茅ation, la suppression, les mises 脿 jour de jeux de donn茅es, le t茅l茅chargement de documents, les modifications, l\'archivage et les requ锚tes de la base de connaissances. Ce param猫tre est utilis茅 pour 茅valuer les performances des requ锚tes de la base de connaissances. Par exemple, si un utilisateur de Sandbox effectue 10 tests de validit茅 cons茅cutifs en une minute, son espace de travail sera temporairement restreint dans l\'ex茅cution des actions suivantes pendant la minute suivante : cr茅ation, suppression, mises 脿 jour de jeux de donn茅es, et t茅l茅chargements ou modifications de documents.',
+  },
+  plans: {
+    sandbox: {
+      name: 'Bac 脿 sable',
+      description: '200 essais gratuits de GPT',
+      includesTitle: 'Inclus :',
+      for: 'Essai gratuit des fonctionnalit茅s principales',
+    },
+    professional: {
+      name: 'Professionnel',
+      description: 'Pour les individus et les petites 茅quipes afin de d茅bloquer plus de puissance 脿 un prix abordable.',
+      includesTitle: 'Tout ce qui est dans le plan gratuit, plus :',
+      for: 'Pour les d茅veloppeurs ind茅pendants / petites 茅quipes',
+    },
+    team: {
+      name: '脡quipe',
+      description: 'Collaborez sans limites et profitez d\'une performance de premier ordre.',
+      includesTitle: 'Tout ce qui est inclus dans le plan Professionnel, plus :',
+      for: 'Pour les 茅quipes de taille moyenne',
+    },
+    enterprise: {
+      name: 'Entreprise',
+      description: 'Obtenez toutes les capacit茅s et le support pour les syst猫mes 脿 grande 茅chelle et critiques pour la mission.',
+      includesTitle: 'Tout ce qui est inclus dans le plan 脡quipe, plus :',
+      features: {
+        5: 'SLA n茅goci茅s par Dify Partners',
+        1: 'Autorisation de Licence Commerciale',
+        2: 'Fonctionnalit茅s exclusives pour les entreprises',
+        4: 'SSO',
+        8: 'Support Technique Professionnel',
+        3: 'Gestion de plusieurs espaces de travail et d\'entreprise',
+        6: 'S茅curit茅 et contr么les avanc茅s',
+        7: 'Mises 脿 jour et maintenance par Dify Officiellement',
+        0: 'Solutions de d茅ploiement 茅volutives de niveau entreprise',
+      },
+      for: 'Pour les 茅quipes de grande taille',
+      btnText: 'Contacter les ventes',
+      priceTip: 'Facturation Annuel Seulement',
+      price: 'Personnalis茅',
+    },
+    community: {
+      features: {
+        2: 'Conforme 脿 la licence open source de Dify',
+        1: 'Espace de travail unique',
+        0: 'Toutes les fonctionnalit茅s principales publi茅es dans le r茅f茅rentiel public',
+      },
+      name: 'Communaut茅',
+      btnText: 'Commencez avec la communaut茅',
+      for: 'Pour les utilisateurs individuels, les petites 茅quipes ou les projets non commerciaux',
+      includesTitle: 'Fonctionnalit茅s gratuites :',
+      price: 'Gratuit',
+      description: 'Pour les utilisateurs individuels, les petites 茅quipes ou les projets non commerciaux',
+    },
+    premium: {
+      features: {
+        3: 'Support par e-mail et chat prioritaire',
+        1: 'Espace de travail unique',
+        0: 'Fiabilit茅 autog茅r茅e par divers fournisseurs de cloud',
+        2: 'Personnalisation du logo et de la marque de l\'application Web',
+      },
+      for: 'Pour les organisations et les 茅quipes de taille moyenne',
+      includesTitle: 'Tout de la communaut茅, en plus :',
+      name: 'Premium',
+      description: 'Pour les organisations et les 茅quipes de taille moyenne',
+      comingSoon: 'Support de Microsoft Azure et Google Cloud bient么t disponible',
+      btnText: 'Obtenez Premium dans',
+      price: 'Scalable',
+      priceTip: 'Bas茅 sur le march茅 des nuages',
+    },
+  },
+  vectorSpace: {
+    fullTip: 'L\'espace vectoriel est plein.',
+    fullSolution: 'Mettez 脿 niveau votre plan pour obtenir plus d\'espace.',
+  },
+  apps: {
+    fullTipLine1: 'Mettez 脿 jour votre plan pour',
+    fullTipLine2: 'construire plus d\'applications.',
+    fullTip2: 'Limite de plan atteinte',
+    contactUs: 'Contactez-nous',
+    fullTip1: 'Mettez 脿 niveau pour cr茅er plus d\'applications',
+    fullTip2des: 'Il est recommand茅 de nettoyer les applications inactives pour lib茅rer de l\'espace d\'utilisation, ou de nous contacter.',
+    fullTip1des: 'Vous avez atteint la limite de cr茅ation d\'applications avec ce plan.',
+  },
+  annotatedResponse: {
+    fullTipLine1: 'Mettez 脿 niveau votre plan pour',
+    fullTipLine2: 'annotez plus de conversations.',
+    quotaTitle: 'Quota de R茅ponse d\'Annotation',
+  },
+  usagePage: {
+    buildApps: 'Construire des applications',
+    vectorSpace: 'Stockage de donn茅es de connaissance',
+    vectorSpaceTooltip: 'Les documents avec le mode d\'indexation de haute qualit茅 utiliseront des ressources de stockage de donn茅es de connaissance. Lorsque le stockage de donn茅es de connaissance atteindra la limite, de nouveaux documents ne pourront pas 锚tre t茅l茅charg茅s.',
+    teamMembers: 'Membres de l\'茅quipe',
+    annotationQuota: 'Quota d\'annotation',
+    documentsUploadQuota: 'Quota de t茅l茅chargement de documents',
+  },
+  teamMembers: 'Membres de l\'茅quipe',
+}
+
+export default translation
diff --git a/i18n/fr-FR/common.ts b/i18n/fr-FR/common.ts
new file mode 100644
index 0000000..d26deb3
--- /dev/null
+++ b/i18n/fr-FR/common.ts
@@ -0,0 +1,672 @@
+const translation = {
+  api: {
+    success: 'Succ猫s',
+    actionSuccess: 'Action r茅ussie',
+    saved: 'Sauvegard茅',
+    create: 'Cr茅茅',
+    remove: 'Supprim茅',
+  },
+  operation: {
+    create: 'Cr茅er',
+    confirm: 'Confirmer',
+    cancel: 'Annuler',
+    clear: 'Effacer',
+    save: 'Enregistrer',
+    saveAndEnable: 'Enregistrer et Activer',
+    edit: 'Modifier',
+    add: 'Ajouter',
+    added: 'Ajout茅',
+    refresh: 'Red茅marrer',
+    reset: 'R茅initialiser',
+    search: 'Recherche',
+    change: 'Changer',
+    remove: 'Supprimer',
+    send: 'Envoyer',
+    copy: 'Copier',
+    lineBreak: 'Saut de ligne',
+    sure: 'Je suis s没r',
+    download: 'T茅l茅charger',
+    delete: 'Supprimer',
+    settings: 'Param猫tres',
+    setup: 'Configuration',
+    getForFree: 'Obtenez gratuitement',
+    reload: 'Recharger',
+    ok: 'D\'accord',
+    log: 'Journal',
+    learnMore: 'En savoir plus',
+    params: 'Param猫tres',
+    duplicate: 'Dupliquer',
+    rename: 'Renommer',
+    audioSourceUnavailable: 'AudioSource n鈥檈st pas disponible',
+    zoomOut: 'Zoom arri猫re',
+    zoomIn: 'Zoom avant',
+    openInNewTab: 'Ouvrir dans un nouvel onglet',
+    copyImage: 'Copier l鈥檌mage',
+    view: 'Vue',
+    viewMore: 'VOIR PLUS',
+    close: 'Fermer',
+    saveAndRegenerate: 'Enregistrer et r茅g茅n茅rer des morceaux enfants',
+    regenerate: 'R茅g茅n茅rer',
+    submit: 'Envoyer',
+    skip: 'Bateau',
+    imageCopied: 'Image copied',
+    deleteApp: 'Supprimer l鈥檃pplication',
+    viewDetails: 'Voir les d茅tails',
+    copied: 'Copied',
+    in: 'dans',
+    format: 'Format',
+    downloadFailed: '脡chec du t茅l茅chargement. Veuillez r茅essayer plus tard.',
+    more: 'Plus',
+    downloadSuccess: 'T茅l茅chargement termin茅.',
+  },
+  placeholder: {
+    input: 'Veuillez entrer',
+    select: 'Veuillez s茅lectionner',
+  },
+  voice: {
+    language: {
+      zhHans: 'Chinois',
+      zhHant: 'Chinois (traditionnel)',
+      enUS: 'Anglais',
+      deDE: 'Allemand',
+      frFR: 'Fran莽ais',
+      esES: 'Espagnol',
+      itIT: 'Italien',
+      thTH: 'Tha茂',
+      idID: 'Indon茅sien',
+      jaJP: 'Japonais',
+      koKR: 'Cor茅en',
+      ptBR: 'Portugais',
+      ruRU: 'Russe',
+      ukUA: 'Ukrainien',
+      viVN: 'Vietnamien',
+      plPL: 'Polonais',
+      roRO: 'Roumain',
+      hiIN: 'Hindi',
+      trTR: 'Turc',
+      faIR: 'Persan',
+    },
+  },
+  unit: {
+    char: 'caract猫res',
+  },
+  actionMsg: {
+    noModification: 'Aucune modification pour le moment.',
+    modifiedSuccessfully: 'Modifi茅 avec succ猫s',
+    modifiedUnsuccessfully: 'Modifi茅 sans succ猫s',
+    copySuccessfully: 'Copi茅 avec succ猫s',
+    paySucceeded: 'Paiement r茅ussi',
+    payCancelled: 'Paiement annul茅',
+    generatedSuccessfully: 'G茅n茅r茅 avec succ猫s',
+    generatedUnsuccessfully: 'G茅n茅r茅 sans succ猫s',
+  },
+  model: {
+    params: {
+      temperature: 'Temp茅rature',
+      temperatureTip:
+        'Controls randomness: Lowering results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive.',
+      top_p: 'Haut P',
+      top_pTip:
+        'Controls diversity via nucleus sampling: 0.5 means half of all likelihood-weighted options are considered.',
+      presence_penalty: 'P茅nalit茅 de pr茅sence',
+      presence_penaltyTip:
+        'Combien p茅naliser les nouveaux tokens en fonction de leur apparition dans le texte jusqu\'脿 pr茅sent. Augmente la probabilit茅 du mod猫le de parler de nouveaux sujets.',
+      frequency_penalty: 'P茅nalit茅 de fr茅quence',
+      frequency_penaltyTip:
+        'Combien p茅naliser les nouveaux tokens en fonction de leur fr茅quence existante dans le texte jusqu\'脿 pr茅sent. R茅duit la probabilit茅 du mod猫le de r茅p茅ter la m锚me ligne mot pour mot.',
+      max_tokens: 'Max jeton',
+      max_tokensTip:
+        'Utilis茅 pour limiter la longueur maximale de la r茅ponse, en jetons. \nDes valeurs plus grandes peuvent limiter l\'espace restant pour les mots de prompt, les journaux de chat, et la Connaissance. \nIl est recommand茅 de le r茅gler en dessous des',
+      maxTokenSettingTip: 'Votre r茅glage de max token est 茅lev茅, limitant potentiellement l\'espace pour les prompts, les requ锚tes et les donn茅es. Envisagez de le d茅finir en dessous de 2/3.',
+      setToCurrentModelMaxTokenTip: 'Le max token est mis 脿 jour 脿 80% du max token du mod猫le actuel {{maxToken}}.',
+      stop_sequences: 'S茅quences d\'arr锚t',
+      stop_sequencesTip: 'Jusqu\'脿 quatre s茅quences o霉 l\'API arr锚tera de g茅n茅rer d\'autres tokens. Le texte renvoy茅 ne contiendra pas la s茅quence d\'arr锚t.',
+      stop_sequencesPlaceholder: 'Entrez la s茅quence et appuyez sur Tab',
+    },
+    tone: {
+      Creative: 'Cr茅atif',
+      Balanced: '脡quilibr茅',
+      Precise: 'Pr茅cis',
+      Custom: 'Personnalis茅',
+    },
+    addMoreModel: 'Allez dans les param猫tres pour ajouter plus de mod猫les',
+    capabilities: 'Capacit茅s multimodales',
+    settingsLink: 'Param猫tres du fournisseur de mod猫les',
+  },
+  menus: {
+    status: 'b锚ta',
+    explore: 'Explorer',
+    apps: 'Studio',
+    plugins: 'Plugins',
+    pluginsTips: 'Int茅grez des plugins tiers ou cr茅ez des AI-Plugins compatibles avec ChatGPT.',
+    datasets: 'Connaissance',
+    datasetsTips: 'COMING SOON: Import your own text data or write data in real-time via Webhook for LLM context enhancement.',
+    newApp: 'Nouvelle Application',
+    newDataset: 'Cr茅er des Connaissances',
+    tools: 'Outils',
+    exploreMarketplace: 'Explorer Marketplace',
+  },
+  userProfile: {
+    settings: 'Param猫tres',
+    emailSupport: 'Support par courriel',
+    workspace: 'Espace de travail',
+    createWorkspace: 'Cr茅er un Espace de Travail',
+    helpCenter: 'Aide',
+    communityFeedback: 'Retour d\'information',
+    roadmap: 'Feuille de route',
+    community: 'Communaut茅',
+    about: '脌 propos',
+    logout: 'Se d茅connecter',
+    support: 'Soutien',
+    github: 'GitHub',
+    compliance: 'Conformit茅',
+  },
+  settings: {
+    accountGroup: 'COMPTE',
+    workplaceGroup: 'ESPACE DE TRAVAIL',
+    account: 'Mon compte',
+    members: 'Membres',
+    billing: 'Facturation',
+    integrations: 'Int茅grations',
+    language: 'Langue',
+    provider: 'Fournisseur de Mod猫le',
+    dataSource: 'Source de Donn茅es',
+    plugin: 'Plugins',
+    apiBasedExtension: 'Extension API',
+    generalGroup: 'G脡N脡RALIT脡S',
+  },
+  account: {
+    avatar: 'Avatar',
+    name: 'Nom',
+    email: 'Courriel',
+    password: 'Mot de passe',
+    passwordTip: 'Vous pouvez d茅finir un mot de passe permanent si vous ne souhaitez pas utiliser des codes de connexion temporaires.',
+    setPassword: 'D茅finir un mot de passe',
+    resetPassword: 'R茅initialiser le mot de passe',
+    currentPassword: 'Mot de passe actuel',
+    newPassword: 'Nouveau mot de passe',
+    confirmPassword: 'Confirmer le mot de passe',
+    notEqual: 'Les deux mots de passe sont diff茅rents.',
+    langGeniusAccount: 'Compte Dify',
+    langGeniusAccountTip: 'Votre compte Dify et les donn茅es utilisateur associ茅es.',
+    editName: 'Modifier le nom',
+    showAppLength: 'Afficher {{length}} applications',
+    delete: 'Supprimer le compte',
+    deleteTip: 'La suppression de votre compte effacera d茅finitivement toutes vos donn茅es et elles ne pourront pas 锚tre r茅cup茅r茅es.',
+    deleteConfirmTip: 'Pour confirmer, veuillez envoyer ce qui suit depuis votre adresse e-mail enregistr茅e 脿 ',
+    myAccount: 'Mon compte',
+    account: 'Compte',
+    studio: 'Dify Studio',
+    deletePrivacyLinkTip: 'Pour plus d鈥檌nformations sur la fa莽on dont nous traitons vos donn茅es, veuillez consulter notre',
+    deletePrivacyLink: 'Politique de confidentialit茅.',
+    deleteSuccessTip: 'Votre compte a besoin de temps pour terminer la suppression. Nous vous enverrons un e-mail lorsque tout sera termin茅.',
+    deleteLabel: 'Pour confirmer, veuillez saisir votre adresse e-mail ci-dessous',
+    deletePlaceholder: 'Veuillez entrer votre adresse e-mail',
+    sendVerificationButton: 'Envoyer le code de v茅rification',
+    verificationLabel: 'Code de v茅rification',
+    verificationPlaceholder: 'Collez le code 脿 6 chiffres',
+    permanentlyDeleteButton: 'Supprimer d茅finitivement le compte',
+    feedbackTitle: 'R茅troaction',
+    feedbackLabel: 'Dites-nous pourquoi vous avez supprim茅 votre compte ?',
+    feedbackPlaceholder: 'Optionnel',
+    workspaceName: 'Nom de l\'espace de travail',
+    workspaceIcon: 'Ic么ne de l\'espace de travail',
+    editWorkspaceInfo: 'Modifier les informations de l\'espace de travail',
+  },
+  members: {
+    team: '脡quipe',
+    invite: 'Ajouter',
+    name: 'NOM',
+    lastActive: 'DERNI脠RE ACTIVIT脡',
+    role: 'R脭LES',
+    pending: 'En attente...',
+    owner: 'Propri茅taire',
+    admin: 'Administrateur',
+    adminTip: 'Peut construire des applications & g茅rer les param猫tres de l\'茅quipe',
+    normal: 'Normal',
+    normalTip: 'Peut seulement utiliser des applications, ne peut pas construire des applications',
+    editor: '脡diteur',
+    editorTip: 'Peut construire des applications, mais ne peut pas g茅rer les param猫tres de l\'茅quipe',
+    inviteTeamMember: 'Ajouter un membre de l\'茅quipe',
+    inviteTeamMemberTip: 'Ils peuvent acc茅der directement 脿 vos donn茅es d\'茅quipe apr猫s s\'锚tre connect茅s.',
+    emailNotSetup: 'Le serveur de messagerie n\'est pas configur茅, les e-mails d\'invitation ne peuvent donc pas 锚tre envoy茅s. Veuillez informer les utilisateurs du lien d\'invitation qui sera 茅mis apr猫s l\'invitation.',
+    email: 'Courrier 茅lectronique',
+    emailInvalid: 'Format de courriel invalide',
+    emailPlaceholder: 'Veuillez entrer des emails',
+    sendInvite: 'Envoyer une invitation',
+    invitedAsRole: 'Invit茅 en tant qu\'utilisateur {{role}}',
+    invitationSent: 'Invitation envoy茅e',
+    invitationSentTip: 'Invitation envoy茅e, et ils peuvent se connecter 脿 Dify pour acc茅der aux donn茅es de votre 茅quipe.',
+    invitationLink: 'Lien d\'invitation',
+    failedInvitationEmails: 'Les utilisateurs ci-dessous n\'ont pas 茅t茅 invit茅s avec succ猫s',
+    ok: 'D\'accord',
+    removeFromTeam: 'Retirer de l\'茅quipe',
+    removeFromTeamTip: 'Supprimera l\'acc猫s de l\'茅quipe',
+    setAdmin: 'D茅finir comme administrateur',
+    setMember: 'D茅finir en tant que membre ordinaire',
+    setEditor: 'D茅finir en tant qu\'茅diteur',
+    disInvite: 'Annuler l\'invitation',
+    deleteMember: 'Supprimer Membre',
+    you: '(Vous)',
+    builder: 'Constructeur',
+    datasetOperatorTip: 'Seul peut g茅rer la base de connaissances',
+    datasetOperator: 'Administrateur des connaissances',
+    setBuilder: 'D茅finir en tant que constructeur',
+    builderTip: 'Peut cr茅er et modifier ses propres applications',
+  },
+  integrations: {
+    connected: 'Connect茅',
+    google: 'Google',
+    googleAccount: 'Connectez-vous avec un compte Google',
+    github: 'GitHub',
+    githubAccount: 'Connectez-vous avec un compte GitHub',
+    connect: 'Connecter',
+  },
+  language: {
+    displayLanguage: 'Langue d\'affichage',
+    timezone: 'Fuseau horaire',
+  },
+  provider: {
+    apiKey: 'Cl茅 API',
+    enterYourKey: 'Entrez votre cl茅 API ici',
+    invalidKey: 'Cl茅 API OpenAI invalide',
+    validatedError: 'Validation failed: ',
+    validating: 'Validation de la cl茅...',
+    saveFailed: 'La sauvegarde de la cl茅 API a 茅chou茅',
+    apiKeyExceedBill: 'Cette cl茅 API n\'a pas de quota disponible, veuillez lire',
+    addKey: 'Ajouter une cl茅',
+    comingSoon: 'Bient么t disponible',
+    editKey: 'Modifier',
+    invalidApiKey: 'Cl茅 API invalide',
+    azure: {
+      apiBase: 'Base de l\'API',
+      apiBasePlaceholder: 'L\'URL de base de l\'API de votre point de terminaison Azure OpenAI.',
+      apiKey: 'Cl茅 API',
+      apiKeyPlaceholder: 'Entrez votre cl茅 API ici',
+      helpTip: 'Apprenez le service OpenAI Azure',
+    },
+    openaiHosted: {
+      openaiHosted: 'OpenAI H茅berg茅',
+      onTrial: 'EN ESSAI',
+      exhausted: 'QUOTA 脡PUIS脡',
+      desc: 'Le service d\'h茅bergement OpenAI fourni par Dify vous permet d\'utiliser des mod猫les tels que GPT-3.5. Avant que votre quota d\'essai ne soit 茅puis茅, vous devez configurer d\'autres fournisseurs de mod猫les.',
+      callTimes: 'Temps d\'appel',
+      usedUp: 'Quota d\'essai 茅puis茅. Ajoutez votre propre fournisseur de mod猫le.',
+      useYourModel: 'Utilise actuellement son propre fournisseur de mod猫le.',
+      close: 'Fermer',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: 'EN ESSAI',
+      exhausted: 'QUOTA 脡PUIS脡',
+      desc: 'Mod猫le puissant, qui excelle dans une large gamme de t芒ches allant du dialogue sophistiqu茅 et de la g茅n茅ration de contenu cr茅atif 脿 l\'instruction d茅taill茅e.',
+      callTimes: 'Temps d\'appel',
+      usedUp: 'Quota d\'essai 茅puis茅. Ajoutez votre propre fournisseur de mod猫le.',
+      useYourModel: 'Utilise actuellement son propre fournisseur de mod猫le.',
+      close: 'Fermer',
+      trialQuotaTip: 'Votre quota d鈥檈ssai Anthropic expirera le 11/03/2025 et ne sera plus disponible par la suite. Veuillez l鈥檜tiliser 脿 temps.',
+    },
+    anthropic: {
+      using: 'La capacit茅 d\'embedding est utilis茅e',
+      enableTip: 'Pour activer le mod猫le Anthropic, vous devez d\'abord vous lier 脿 OpenAI ou au service Azure OpenAI.',
+      notEnabled: 'Non activ茅',
+      keyFrom: 'Obtenez votre cl茅 API de chez Anthropic',
+    },
+    encrypted: {
+      front: 'Votre cl茅 API sera chiffr茅e et stock茅e en utilisant',
+      back: 'technologie.',
+    },
+  },
+  modelProvider: {
+    notConfigured: 'Le mod猫le du syst猫me n\'a pas encore 茅t茅 enti猫rement configur茅, et certaines fonctions peuvent 锚tre indisponibles.',
+    systemModelSettings: 'Param猫tres du Mod猫le Syst猫me',
+    systemModelSettingsLink: 'Pourquoi est-il n茅cessaire de mettre en place un mod猫le de syst猫me ?',
+    selectModel: 'S茅lectionnez votre mod猫le',
+    setupModelFirst: 'Veuillez d\'abord configurer votre mod猫le',
+    systemReasoningModel: {
+      key: 'Mod猫le de Raisonnement du Syst猫me',
+      tip: 'D茅finissez le mod猫le d\'inf茅rence par d茅faut 脿 utiliser pour la cr茅ation d\'applications, ainsi que des fonctionnalit茅s telles que la g茅n茅ration de noms de dialogue et la suggestion de la prochaine question utiliseront 茅galement le mod猫le d\'inf茅rence par d茅faut.',
+    },
+    embeddingModel: {
+      key: 'Mod猫le d\'Embedding',
+      tip: 'D茅finissez le mod猫le par d茅faut pour le traitement d\'incorporation de documents de la Connaissance, 脿 la fois la r茅cup茅ration et l\'importation de la Connaissance utilisent ce mod猫le d\'Embedding pour le traitement de vectorisation. Si vous changez de mod猫le, la dimension du vecteur entre la connaissance import茅e et la question ne sera pas coh茅rente, ce qui entra卯nera un 茅chec de la recherche. Pour 茅viter les 茅checs de recherche, veuillez ne pas changer de mod猫le 脿 volont茅.',
+      required: 'Le mod猫le d\'embedding est requis',
+    },
+    speechToTextModel: {
+      key: 'Mod猫le de Texte-脿-Parole',
+      tip: 'D茅finissez le mod猫le par d茅faut pour l\'entr茅e de texte par la parole dans la conversation.',
+    },
+    ttsModel: {
+      key: 'Mod猫le de Texte-脿-Parole',
+      tip: 'D茅finissez le mod猫le par d茅faut pour l\'entr茅e de texte 脿 la parole dans une conversation.',
+    },
+    rerankModel: {
+      key: 'Mod猫le de R茅organisation',
+      tip: 'Le mod猫le de r茅organisation r茅organisera la liste des documents candidats en fonction de la correspondance s茅mantique avec la requ锚te de l\'utilisateur, am茅liorant ainsi les r茅sultats du classement s茅mantique.',
+    },
+    quota: 'Quota',
+    searchModel: 'Mod猫le de recherche',
+    noModelFound: 'Aucun mod猫le trouv茅 pour {{model}}',
+    models: 'Mod猫les',
+    showMoreModelProvider: 'Montrer plus de fournisseur de mod猫le',
+    selector: {
+      tip: 'Ce mod猫le a 茅t茅 supprim茅. Veuillez ajouter un mod猫le ou s茅lectionner un autre mod猫le.',
+      emptyTip: 'Aucun mod猫le disponible',
+      emptySetting: 'Veuillez aller dans les param猫tres pour configurer',
+      rerankTip: 'Veuillez configurer le mod猫le Rerank',
+    },
+    card: {
+      quota: 'QUOTA',
+      onTrial: 'En Essai',
+      paid: 'Pay茅',
+      quotaExhausted: 'Quota 茅puis茅',
+      callTimes: 'Temps d\'appel',
+      tokens: 'Jetons',
+      buyQuota: 'Acheter Quota',
+      priorityUse: 'Utilisation prioritaire',
+      removeKey: 'Supprimer la cl茅 API',
+      tip: 'La priorit茅 sera donn茅e au quota payant. Le quota d\'essai sera utilis茅 apr猫s 茅puisement du quota payant.',
+    },
+    item: {
+      deleteDesc: '{{modelName}} sont utilis茅s comme mod猫les de raisonnement syst猫me. Certaines fonctions ne seront pas disponibles apr猫s la suppression. Veuillez confirmer.',
+      freeQuota: 'QUOTA GRATUIT',
+    },
+    addApiKey: 'Ajoutez votre cl茅 API',
+    invalidApiKey: 'Cl茅 API invalide',
+    encrypted: {
+      front: 'Votre cl茅 API sera crypt茅e et stock茅e en utilisant',
+      back: 'technologie.',
+    },
+    freeQuota: {
+      howToEarn: 'Comment gagner',
+    },
+    addMoreModelProvider: 'AJOUTER PLUS DE FOURNISSEUR DE MOD脠LE',
+    addModel: 'Ajouter un mod猫le',
+    modelsNum: '{{num}} Mod猫les',
+    showModels: 'Montrer les mod猫les',
+    showModelsNum: 'Afficher {{num}} Mod猫les',
+    collapse: 'Effondrer',
+    config: 'Configuration',
+    modelAndParameters: 'Mod猫le et Param猫tres',
+    model: 'Mod猫le',
+    featureSupported: '{{feature}} pris en charge',
+    callTimes: 'Temps d\'appel',
+    credits: 'Cr茅dits de Messages',
+    buyQuota: 'Acheter Quota',
+    getFreeTokens: 'Obtenez des Tokens gratuits',
+    priorityUsing: 'Prioriser l\'utilisation',
+    deprecated: 'Obsol猫te',
+    confirmDelete: 'confirmer la suppression?',
+    quotaTip: 'Tokens gratuits restants disponibles',
+    loadPresets: 'Charger les Pr茅sents',
+    parameters: 'PARAM脠TRES',
+    modelHasBeenDeprecated: 'Ce mod猫le est obsol猫te',
+    providerManagedDescription: 'Utilisez l鈥檈nsemble unique d鈥檌nformations d鈥檌dentification fourni par le fournisseur de mod猫le.',
+    loadBalancingHeadline: '脡quilibrage',
+    loadBalancing: '脡quilibrage',
+    loadBalancingLeastKeyWarning: 'Pour activer l鈥櫭﹒uilibrage de charge, au moins 2 cl茅s doivent 锚tre activ茅es.',
+    apiKey: 'API-KEY',
+    apiKeyStatusNormal: 'L鈥櫭﹖at de l鈥橝PIKey est normal',
+    configLoadBalancing: '脡quilibrage de charge de configuration',
+    loadBalancingInfo: 'Par d茅faut, l鈥櫭﹒uilibrage de charge utilise la strat茅gie Round-robin. Si la limitation de vitesse est d茅clench茅e, une p茅riode de recharge de 1 minute sera appliqu茅e.',
+    editConfig: 'Modifier la configuration',
+    addConfig: 'Ajouter une configuration',
+    apiKeyRateLimit: 'La limite de d茅bit a 茅t茅 atteinte, disponible apr猫s {{secondes}}s',
+    defaultConfig: 'Configuration par d茅faut',
+    loadBalancingDescription: 'R茅duisez la pression gr芒ce 脿 plusieurs ensembles d鈥檌nformations d鈥檌dentification.',
+    providerManaged: 'G茅r茅 par le fournisseur',
+    upgradeForLoadBalancing: 'Mettez 脿 niveau votre plan pour activer l鈥櫭﹒uilibrage de charge.',
+    emptyProviderTitle: 'Le fournisseur de mod猫les n鈥檈st pas configur茅',
+    toBeConfigured: '脌 configurer',
+    configureTip: 'Configurer api-key ou ajouter un mod猫le 脿 utiliser',
+    installProvider: 'Installer des fournisseurs de mod猫les',
+    discoverMore: 'D茅couvrez-en plus dans',
+    emptyProviderTip: 'Veuillez d鈥檃bord installer un fournisseur de mod猫les.',
+  },
+  dataSource: {
+    add: 'Ajouter une source de donn茅es',
+    connect: 'Connecter',
+    notion: {
+      title: 'Notion',
+      description: 'Utiliser Notion comme source de donn茅es pour la Connaissance.',
+      connectedWorkspace: 'Espace de travail connect茅',
+      addWorkspace: 'Ajouter un espace de travail',
+      connected: 'Connect茅',
+      disconnected: 'D茅connect茅',
+      changeAuthorizedPages: 'Modifier les pages autoris茅es',
+      pagesAuthorized: 'Pages autoris茅es',
+      sync: 'Synchronisation',
+      remove: 'Supprimer',
+      selector: {
+        pageSelected: 'Pages S茅lectionn茅es',
+        searchPages: 'Rechercher des pages...',
+        noSearchResult: 'Aucun r茅sultat de recherche',
+        addPages: 'Ajouter des pages',
+        preview: 'APER脟U',
+      },
+    },
+    website: {
+      configuredCrawlers: 'Robots d鈥檈xploration configur茅s',
+      with: 'Avec',
+      inactive: 'Inactif',
+      active: 'Actif',
+      title: 'Site internet',
+      description: 'Importez du contenu 脿 partir de sites Web 脿 l鈥檃ide du robot d鈥檌ndexation.',
+    },
+    configure: 'Configurer',
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'Cl茅 API',
+      apiKeyPlaceholder: 'Entrez votre cl茅 API',
+      keyFrom: 'Obtenez votre cl茅 SerpAPI depuis la page de compte SerpAPI',
+    },
+  },
+  apiBasedExtension: {
+    title: 'Les extensions API fournissent une gestion centralis茅e des API, simplifiant la configuration pour une utilisation facile 脿 travers les applications de Dify.',
+    link: 'Apprenez comment d茅velopper votre propre Extension API.',
+    linkUrl: 'https://docs.dify.ai/fonctionnalites/extension/extension_basee_sur_api',
+    add: 'Ajouter l\'extension API',
+    selector: {
+      title: 'Extension de l\'API',
+      placeholder: 'Veuillez s茅lectionner l\'extension API',
+      manage: 'G茅rer l\'extension API',
+    },
+    modal: {
+      title: 'Ajouter une extension API',
+      editTitle: 'Modifier l\'extension API',
+      name: {
+        title: 'Nom',
+        placeholder: 'Veuillez entrer le nom',
+      },
+      apiEndpoint: {
+        title: 'Point de terminaison API',
+        placeholder: 'Veuillez entrer le point de terminaison de l\'API',
+      },
+      apiKey: {
+        title: 'cl茅 API',
+        placeholder: 'Veuillez entrer la cl茅 API',
+        lengthError: 'La longueur de la cl茅 API ne peut pas 锚tre inf茅rieure 脿 5 caract猫res',
+      },
+    },
+    type: 'Tapez',
+  },
+  about: {
+    changeLog: 'Journal des modifications',
+    updateNow: 'Mettre 脿 jour maintenant',
+    nowAvailable: 'Dify {{version}} est maintenant disponible.',
+    latestAvailable: 'Dify {{version}} est la derni猫re version disponible.',
+  },
+  appMenus: {
+    overview: 'Surveillance',
+    promptEng: 'Orchestrer',
+    apiAccess: 'Acc猫s API',
+    logAndAnn: 'Journaux & Annonces.',
+    logs: 'Journaux',
+  },
+  environment: {
+    testing: 'TESTER',
+    development: 'D脡VELOPPEMENT',
+  },
+  appModes: {
+    completionApp: 'G茅n茅rateur de Texte',
+    chatApp: 'Appli de Chat',
+  },
+  datasetMenus: {
+    documents: 'Documents',
+    hitTesting: 'Test de R茅cup茅ration',
+    settings: 'Param猫tres',
+    emptyTip: 'La Connaissance n\'a pas 茅t茅 associ茅e, veuillez aller 脿 l\'application ou au plug-in pour compl茅ter l\'association.',
+    viewDoc: 'Voir la documentation',
+    relatedApp: 'applications li茅es',
+    noRelatedApp: 'Pas d鈥檃pplications li茅es',
+  },
+  voiceInput: {
+    speaking: 'Parle maintenant...',
+    converting: 'Conversion en texte...',
+    notAllow: 'microphone non autoris茅',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Texte-Davinci-003',
+    'text-embedding-ada-002': 'Texte-Int茅gration-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: 'Renommer la conversation',
+    conversationName: 'Nom de la conversation',
+    conversationNamePlaceholder: 'Veuillez entrer le nom de la conversation',
+    conversationNameCanNotEmpty: 'Nom de la conversation requis',
+    citation: {
+      title: 'CITATIONS',
+      linkToDataset: 'Lien vers la Connaissance',
+      characters: 'Personnages :',
+      hitCount: 'Nombre de r茅cup茅rations :',
+      vectorHash: 'Hachage vectoriel:',
+      hitScore: 'Score de R茅cup茅ration:',
+    },
+    inputPlaceholder: 'Parler au bot',
+    thinking: 'Pens茅e...',
+    thought: 'Pens茅e',
+    resend: 'Renvoyer',
+  },
+  promptEditor: {
+    placeholder: '脡crivez votre mot d\'invite ici, entrez \'{\' pour ins茅rer une variable, entrez \'/\' pour ins茅rer un bloc de contenu d\'invite',
+    context: {
+      item: {
+        title: 'Contexte',
+        desc: 'Ins茅rez le mod猫le de contexte',
+      },
+      modal: {
+        title: '{{num}} Connaissance en Contexte',
+        add: 'Ajouter Contexte',
+        footer: 'Vous pouvez g茅rer les contextes dans la section Contexte ci-dessous.',
+      },
+    },
+    history: {
+      item: {
+        title: 'Historique des conversations',
+        desc: 'Ins茅rer le mod猫le de message historique',
+      },
+      modal: {
+        title: 'EXEMPLE',
+        user: 'Bonjour',
+        assistant: 'Bonjour ! Comment puis-je vous aider aujourd\'hui ?',
+        edit: 'Modifier les Noms des R么les de Conversation',
+      },
+    },
+    variable: {
+      item: {
+        title: 'Variables & Outils Externes',
+        desc: 'Ins茅rer des Variables & Outils Externes',
+      },
+      outputToolDisabledItem: {
+        title: 'Variables',
+        desc: 'Ins茅rer Variables',
+      },
+      modal: {
+        add: 'Nouvelle variable',
+        addTool: 'Nouvel outil',
+      },
+    },
+    query: {
+      item: {
+        title: 'Requ锚te',
+        desc: 'Ins茅rez le mod猫le de requ锚te utilisateur',
+      },
+    },
+    existed: 'Existe d茅j脿 dans le prompt',
+  },
+  imageUploader: {
+    uploadFromComputer: 'T茅l茅charger depuis l\'ordinateur',
+    uploadFromComputerReadError: 'La lecture de l\'image a 茅chou茅, veuillez r茅essayer.',
+    uploadFromComputerUploadError: 'Le t茅l茅chargement de l\'image a 茅chou茅, veuillez t茅l茅charger 脿 nouveau.',
+    uploadFromComputerLimit: 'Le t茅l茅chargement d\'images ne peut pas d茅passer {{size}} MB',
+    pasteImageLink: 'Collez le lien de l\'image',
+    pasteImageLinkInputPlaceholder: 'Collez le lien de l\'image ici',
+    pasteImageLinkInvalid: 'Lien d\'image invalide',
+    imageUpload: 'T茅l茅chargement d\'image',
+  },
+  tag: {
+    placeholder: 'Toutes les balises',
+    addNew: 'Ajouter une nouvelle balise',
+    noTag: 'Aucune balise',
+    noTagYet: 'Aucune balise pour l\'instant',
+    addTag: 'ajouter une balise',
+    editTag: 'Modifier les balises',
+    manageTags: 'G茅rer les balises',
+    selectorPlaceholder: 'Type de recherche ou de cr茅ation',
+    create: 'Cr茅er',
+    delete: 'Supprimer la balise',
+    deleteTip: 'Le tag est utilis茅, le supprimer ?',
+    created: 'Tag cr茅茅 avec succ猫s',
+    failed: 'La cr茅ation de la balise a 茅chou茅',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} est obligatoire',
+    urlError: 'L鈥橴RL doit commencer par http:// ou https://',
+  },
+  fileUploader: {
+    pasteFileLinkInputPlaceholder: 'Entrez l鈥橴RL...',
+    uploadFromComputer: 'T茅l茅chargement local',
+    pasteFileLink: 'Coller le lien du fichier',
+    uploadFromComputerReadError: '脡chec de la lecture du fichier, veuillez r茅essayer.',
+    uploadFromComputerUploadError: 'Le t茅l茅chargement du fichier a 茅chou茅, veuillez le t茅l茅charger 脿 nouveau.',
+    fileExtensionNotSupport: 'Extension de fichier non prise en charge',
+    pasteFileLinkInvalid: 'Lien de fichier non valide',
+    uploadFromComputerLimit: 'Le fichier de t茅l茅chargement ne peut pas d茅passer {{size}}',
+  },
+  license: {
+    expiring: 'Expirant dans un jour',
+    expiring_plural: 'Expirant dans {{count}} jours',
+  },
+  pagination: {
+    perPage: 'Articles par page',
+  },
+  theme: {
+    auto: 'syst猫me',
+    light: 'lumi猫re',
+    dark: 'sombre',
+    theme: 'Th猫me',
+  },
+  compliance: {
+    soc2Type1: 'Rapport SOC 2 Type I',
+    iso27001: 'Certification ISO 27001:2022',
+    professionalUpgradeTooltip: 'Disponible uniquement avec un plan 脡quipe ou sup茅rieur.',
+    gdpr: 'RGPD DPA',
+    soc2Type2: 'Rapport SOC 2 Type II',
+    sandboxUpgradeTooltip: 'Disponible uniquement avec un plan Professionnel ou 脡quipe.',
+  },
+  imageInput: {
+    browse: 'naviguer',
+    dropImageHere: 'D茅posez votre image ici, ou',
+    supportedFormats: 'Prend en charge PNG, JPG, JPEG, WEBP et GIF',
+  },
+}
+
+export default translation
diff --git a/i18n/fr-FR/custom.ts b/i18n/fr-FR/custom.ts
new file mode 100644
index 0000000..d2c0b9d
--- /dev/null
+++ b/i18n/fr-FR/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: 'Personnalisation',
+  upgradeTip: {
+    prefix: 'Mettez 脿 niveau votre plan pour',
+    suffix: 'personnalisez votre marque.',
+    des: 'Mettez 脿 niveau votre plan pour personnaliser votre marque',
+    title: 'Am茅liorez votre plan',
+  },
+  webapp: {
+    title: 'Personnalisez la marque WebApp',
+    removeBrand: 'Supprimer Propuls茅 par Dify',
+    changeLogo: 'Changer Propuls茅 par l\'Image de Marque',
+    changeLogoTip: 'Format SVG ou PNG avec une taille minimum de 40x40px',
+  },
+  app: {
+    title: 'Personnaliser la marque de l\'en-t锚te de l\'application',
+    changeLogoTip: 'Format SVG ou PNG avec une taille minimale de 80x80px',
+  },
+  upload: 'T茅l茅charger',
+  uploading: 'T茅l茅chargement',
+  uploadedFail: 'Le t茅l茅chargement de l\'image a 茅chou茅, veuillez la t茅l茅charger 脿 nouveau.',
+  change: 'Changer',
+  apply: 'Appliquer',
+  restore: 'R茅tablir les param猫tres par d茅faut',
+  customize: {
+    contactUs: 'Contactez-nous',
+    prefix: 'Pour personnaliser le logo de la marque dans l\'application, s\'il vous pla卯t',
+    suffix: 'pour passer 脿 l\'茅dition Enterprise.',
+  },
+}
+
+export default translation
diff --git a/i18n/fr-FR/dataset-creation.ts b/i18n/fr-FR/dataset-creation.ts
new file mode 100644
index 0000000..6339cea
--- /dev/null
+++ b/i18n/fr-FR/dataset-creation.ts
@@ -0,0 +1,218 @@
+const translation = {
+  steps: {
+    header: {
+      creation: 'Cr茅er des Connaissances',
+      update: 'Ajouter des donn茅es',
+      fallbackRoute: 'Connaissance',
+    },
+    one: 'Choisissez la source de donn茅es',
+    two: 'Pr茅traitement et Nettoyage du Texte',
+    three: 'Ex茅cutez et terminez',
+  },
+  error: {
+    unavailable: 'Cette connaissance n\'est pas disponible',
+  },
+  stepOne: {
+    filePreview: 'Aper莽u du fichier',
+    pagePreview: 'Aper莽u de la page',
+    dataSourceType: {
+      file: 'Importer 脿 partir d\'un fichier texte',
+      notion: 'Synchroniser depuis Notion',
+      web: 'Synchroniser depuis le site web',
+    },
+    uploader: {
+      title: 'T茅l茅charger le fichier texte',
+      button: 'Faites glisser et d茅posez des fichiers ou des dossiers, ou',
+      browse: 'Parcourir',
+      tip: 'Prend en charge {{supportTypes}}. Max {{size}}MB chacun.',
+      validation: {
+        typeError: 'Type de fichier non pris en charge',
+        size: 'Fichier trop volumineux. Le maximum est de {{size}}MB',
+        count: 'Plusieurs fichiers non pris en charge',
+        filesNumber: 'Vous avez atteint la limite de t茅l茅chargement par lot de {{filesNumber}}.',
+      },
+      cancel: 'Annuler',
+      change: 'Changer',
+      failed: 'Le t茅l茅chargement a 茅chou茅',
+    },
+    notionSyncTitle: 'Notion n\'est pas connect茅',
+    notionSyncTip: 'Pour synchroniser avec Notion, une connexion 脿 Notion doit d\'abord 锚tre 茅tablie.',
+    connect: 'Aller 脿 connecter',
+    button: 'suivant',
+    emptyDatasetCreation: 'Je veux cr茅er un Savoir vide',
+    modal: {
+      title: 'Cr茅er une Connaissance vide',
+      tip: 'Une Connaissance vide ne contiendra aucun document, et vous pouvez t茅l茅charger des documents 脿 tout moment.',
+      input: 'Nom de la connaissance',
+      placeholder: 'Veuillez entrer',
+      nameNotEmpty: 'Le nom ne peut pas 锚tre vide',
+      nameLengthInvalid: 'Le nom doit comporter entre 1 et 40 caract猫res.',
+      cancelButton: 'Annuler',
+      confirmButton: 'Cr茅er',
+      failed: 'Cr茅ation 茅chou茅e',
+    },
+    website: {
+      limit: 'Limite',
+      fireCrawlNotConfiguredDescription: 'Configurez Firecrawl avec la cl茅 API pour l鈥檜tiliser.',
+      selectAll: 'Tout s茅lectionner',
+      unknownError: 'Erreur inconnue',
+      firecrawlDoc: 'Docs Firecrawl',
+      totalPageScraped: 'Nombre total de pages extraites :',
+      preview: 'Aper莽u',
+      crawlSubPage: 'Explorer les sous-pages',
+      configure: 'Configurer',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      maxDepth: 'Profondeur maximale',
+      fireCrawlNotConfigured: 'Firecrawl n鈥檈st pas configur茅',
+      firecrawlTitle: 'Extraire du contenu web avec 馃敟Firecrawl',
+      scrapTimeInfo: 'Pages r茅cup茅r茅es au total dans un d茅lai de {{time}}s',
+      options: 'Options',
+      exceptionErrorTitle: 'Une exception s鈥檈st produite lors de l鈥檈x茅cution de la t芒che Firecrawl :',
+      includeOnlyPaths: 'Inclure uniquement les chemins d鈥檃cc猫s',
+      resetAll: 'Tout r茅initialiser',
+      run: 'Courir',
+      extractOnlyMainContent: 'Extraire uniquement le contenu principal (pas d鈥檈n-t锚tes, de navigations, de pieds de page, etc.)',
+      excludePaths: 'Exclure les chemins d鈥檃cc猫s',
+      maxDepthTooltip: 'Profondeur maximale 脿 explorer par rapport 脿 l鈥橴RL saisie. La profondeur 0 gratte simplement la page de l鈥橴RL saisie, la profondeur 1 r茅cup猫re l鈥橴RL et tout ce qui suit l鈥橴RL saisie + un /, et ainsi de suite.',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      jinaReaderDoc: 'En savoir plus sur Jina Reader',
+      useSitemapTooltip: 'Suivez le plan du site pour explorer le site. Si ce n鈥檈st pas le cas, Jina Reader explorera de mani猫re it茅rative en fonction de la pertinence de la page, produisant des pages moins nombreuses mais de meilleure qualit茅.',
+      jinaReaderNotConfiguredDescription: 'Configurez Jina Reader en saisissant votre cl茅 API gratuite pour y acc茅der.',
+      useSitemap: 'Utiliser le sitemap',
+      jinaReaderNotConfigured: 'Jina Reader n鈥檈st pas configur茅',
+      chooseProvider: 'S茅lectionnez un fournisseur',
+      jinaReaderTitle: 'Convertir l鈥檌nt茅gralit茅 du site en Markdown',
+      watercrawlTitle: 'Extraire du contenu web avec Watercrawl',
+      watercrawlDoc: 'Documents Watercrawl',
+      waterCrawlNotConfiguredDescription: 'Configurez Watercrawl avec la cl茅 API pour l\'utiliser.',
+      configureJinaReader: 'Configurer le lecteur Jina',
+      configureWatercrawl: 'Configurer Watercrawl',
+      waterCrawlNotConfigured: 'Watercrawl n\'est pas configur茅',
+      watercrawlDocLink: 'https://docs.dify.ai/fr/guide/base-de-connaissances/cr茅er-des-connaissances-et-t茅l茅charger-des-documents/importer-des-donn茅es-de-contenu/synchroniser-depuis-un-site-web',
+      configureFirecrawl: 'Configurer Firecrawl',
+    },
+    cancel: 'Annuler',
+  },
+  stepTwo: {
+    segmentation: 'Param猫tres de bloc',
+    auto: 'Automatique',
+    autoDescription: 'D茅finir automatiquement les r猫gles de d茅coupage et de pr茅traitement. Il est recommand茅 aux utilisateurs non familiers de s茅lectionner ceci.',
+    custom: 'Personnalis茅',
+    customDescription: 'Personnalisez les r猫gles de morceaux, la longueur des morceaux et les r猫gles de pr茅traitement, etc.',
+    separator: 'Identifiant de segment',
+    separatorPlaceholder: 'Par exemple, nouvelle ligne (\\\\n) ou s茅parateur sp茅cial (tel que "***")',
+    maxLength: 'Longueur maximale du morceau',
+    overlap: 'Chevauchement de morceaux',
+    overlapTip: 'La d茅finition d\'un chevauchement de morceaux peut maintenir la pertinence s茅mantique entre eux, am茅liorant ainsi l\'effet de r茅cup茅ration. Il est recommand茅 de d茅finir 10%-25% de la taille maximale du morceau.',
+    overlapCheck: 'le chevauchement de morceaux ne doit pas 锚tre plus grand que la longueur maximale de morceau',
+    rules: 'R猫gles de pr茅traitement du texte',
+    removeExtraSpaces: 'Remplacer les espaces cons茅cutifs, les sauts de ligne et les tabulations',
+    removeUrlEmails: 'Supprimez toutes les URL et adresses e-mail',
+    removeStopwords: 'Supprimez les mots vides tels que "a", "an", "the"',
+    preview: 'Confirmer & Aper莽u',
+    reset: 'R茅initialiser',
+    indexMode: 'Mode d\'index',
+    qualified: 'Haute Qualit茅',
+    recommend: 'Recommander',
+    qualifiedTip: 'Appelez l\'interface d\'embedding syst猫me par d茅faut pour le traitement afin de fournir une pr茅cision plus 茅lev茅e lorsque les utilisateurs font une requ锚te.',
+    warning: 'Veuillez d\'abord configurer la cl茅 API du fournisseur de mod猫le.',
+    click: 'Aller aux param猫tres',
+    economical: '脡conomique',
+    economicalTip: 'Utilisez des moteurs vectoriels hors ligne, des index de mots-cl茅s, etc. pour r茅duire la pr茅cision sans d茅penser de jetons',
+    QATitle: 'Segmentation en format Question & R茅ponse',
+    QATip: 'Activer cette option consommera plus de jetons',
+    QALanguage: 'Segmenter en utilisant',
+    estimateCost: 'Estimation',
+    estimateSegment: 'Morceaux estim茅s',
+    segmentCount: 'morceaux',
+    calculating: 'En calcul...',
+    fileSource: 'Pr茅traiter les documents',
+    notionSource: 'Pr茅traiter les pages',
+    other: 'et autres',
+    fileUnit: 'fichiers',
+    notionUnit: 'pages',
+    previousStep: '脡tape pr茅c茅dente',
+    nextStep: 'Enregistrer & Traiter',
+    save: 'Enregistrer & Traiter',
+    cancel: 'Annuler',
+    sideTipTitle: 'Pourquoi d茅couper et pr茅traiter ?',
+    sideTipP1: 'Lors du traitement des donn茅es textuelles, le d茅coupage et le nettoyage sont deux 茅tapes importantes de la pr茅traitement.',
+    sideTipP2: 'La segmentation divise les longs textes en paragraphes afin que les mod猫les puissent mieux comprendre. Cela am茅liore la qualit茅 et la pertinence des r茅sultats du mod猫le.',
+    sideTipP3: 'Le nettoyage 茅limine les caract猫res et les formats inutiles, rendant le Savoir plus propre et plus facile 脿 analyser.',
+    sideTipP4: 'Un bon d茅coupage et nettoyage am茅liorent les performances du mod猫le, fournissant des r茅sultats plus pr茅cis et pr茅cieux.',
+    previewTitle: 'Aper莽u',
+    previewTitleButton: 'Aper莽u',
+    previewButton: 'Passage au format Q&R',
+    previewSwitchTipStart: 'L\'aper莽u actuel du morceau est en format texte, passer 脿 un aper莽u en format de questions-r茅ponses va',
+    previewSwitchTipEnd: 'consommer des tokens suppl茅mentaires',
+    characters: 'personnages',
+    indexSettingTip: 'Pour changer la m茅thode d\'index, veuillez aller 脿 la',
+    retrievalSettingTip: 'Pour changer la m茅thode d\'index, veuillez aller 脿 la',
+    datasetSettingLink: 'Param猫tres de connaissance.',
+    webpageUnit: 'Pages',
+    websiteSource: 'Site web de pr茅traitement',
+    separatorTip: 'Un d茅limiteur est le caract猫re utilis茅 pour s茅parer le texte. \\n\\n et \\n sont des d茅limiteurs couramment utilis茅s pour s茅parer les paragraphes et les lignes. Combin茅 脿 des virgules (\\n\\n,\\n), les paragraphes seront segment茅s par des lignes lorsqu鈥檌ls d茅passeront la longueur maximale des morceaux. Vous pouvez 茅galement utiliser des d茅limiteurs sp茅ciaux d茅finis par vous-m锚me (par exemple ***).',
+    maxLengthCheck: 'La longueur maximale des morceaux doit 锚tre inf茅rieure 脿 {{limit}}',
+    parentChunkForContext: 'Parent-chunk pour le contexte',
+    notAvailableForParentChild: 'Non disponible pour l鈥檌ndice parent-enfant',
+    parentChild: 'Parent-enfant',
+    useQALanguage: 'Chunk utilisant le format Q&A dans',
+    highQualityTip: 'Une fois l鈥檌nt茅gration termin茅e en mode Haute qualit茅, il n鈥檈st pas possible de revenir au mode 茅conomique.',
+    switch: 'Interrupteur',
+    paragraph: 'Paragraphe',
+    general: 'G茅n茅ralit茅s',
+    fullDocTip: 'L鈥檌nt茅gralit茅 du document est utilis茅e comme morceau parent et r茅cup茅r茅e directement. Veuillez noter que pour des raisons de performance, le texte d茅passant 10000 jetons sera automatiquement tronqu茅.',
+    fullDoc: 'Doc complet',
+    previewChunkCount: '{{compte}} Tron莽ons estim茅s',
+    childChunkForRetrieval: 'Child-chunk pour l鈥檈xtraction',
+    parentChildDelimiterTip: 'Un d茅limiteur est le caract猫re utilis茅 pour s茅parer le texte. \\n\\n est recommand茅 pour diviser le document d鈥檕rigine en gros morceaux parents. Vous pouvez 茅galement utiliser des d茅limiteurs sp茅ciaux d茅finis par vous-m锚me.',
+    qaSwitchHighQualityTipTitle: 'Le format Q&R n茅cessite une m茅thode d鈥檌ndexation de haute qualit茅',
+    notAvailableForQA: 'Non disponible pour l鈥檌ndice Q&R',
+    previewChunk: 'Aper莽u du morceau',
+    parentChildTip: 'Lors de l鈥檜tilisation du mode parent-enfant, le morceau enfant est utilis茅 pour la r茅cup茅ration et le morceau parent est utilis茅 pour le rappel en tant que contexte.',
+    paragraphTip: 'Ce mode divise le texte en paragraphes en fonction des d茅limiteurs et de la longueur maximale du morceau, en utilisant le texte scind茅 comme morceau parent pour la r茅cup茅ration.',
+    qaSwitchHighQualityTipContent: 'Actuellement, seule la m茅thode d鈥檌ndex de haute qualit茅 prend en charge la segmentation du format Q&R. Vous souhaitez passer en mode haute qualit茅 ?',
+    previewChunkTip: 'Cliquez sur le bouton 芦 Preview Chunk 禄 sur la gauche pour charger l鈥檃per莽u',
+    parentChildChunkDelimiterTip: 'Un d茅limiteur est le caract猫re utilis茅 pour s茅parer le texte. \\n est recommand茅 pour diviser les blocs parents en petits blocs enfants. Vous pouvez 茅galement utiliser des d茅limiteurs sp茅ciaux d茅finis par vous-m锚me.',
+    generalTip: 'Mode g茅n茅ral de segmentation du texte, les morceaux r茅cup茅r茅s et rappel茅s sont les m锚mes.',
+  },
+  stepThree: {
+    creationTitle: '馃帀 Connaissance cr茅茅e',
+    creationContent: 'Nous avons automatiquement nomm茅 le Savoir, vous pouvez le modifier 脿 tout moment',
+    label: 'Nom de la connaissance',
+    additionTitle: '馃帀 Document t茅l茅charg茅',
+    additionP1: 'Le document a 茅t茅 t茅l茅charg茅 dans la Connaissance',
+    additionP2: ', vous pouvez le trouver dans la liste des documents de la Connaissance.',
+    stop: 'Arr锚ter le traitement',
+    resume: 'Reprendre le traitement',
+    navTo: 'Aller au document',
+    sideTipTitle: 'Qu\'est-ce qui suit ?',
+    sideTipContent: 'Apr猫s l\'indexation du document, la Connaissance peut 锚tre int茅gr茅e dans l\'application en tant que contexte, vous pouvez trouver le param猫tre de contexte sur la page d\'orchestration de prompt. Vous pouvez 茅galement le cr茅er en tant que plugin d\'indexation ChatGPT ind',
+    modelTitle: '脢tes-vous s没r de vouloir arr锚ter l\'embedding ?',
+    modelContent: 'Si vous devez reprendre le traitement plus tard, vous continuerez 脿 partir de l\'endroit o霉 vous vous 锚tes arr锚t茅.',
+    modelButtonConfirm: 'Confirmer',
+    modelButtonCancel: 'Annuler',
+  },
+  firecrawl: {
+    apiKeyPlaceholder: 'Cl茅 API de firecrawl.dev',
+    configFirecrawl: 'Configurer 馃敟Firecrawl',
+    getApiKeyLinkText: 'Obtenez votre cl茅 API aupr猫s de firecrawl.dev',
+  },
+  jinaReader: {
+    getApiKeyLinkText: 'Obtenez votre cl茅 API gratuite chez jina.ai',
+    apiKeyPlaceholder: 'Cl茅 API de jina.ai',
+    configJinaReader: 'Configurer Jina Reader',
+  },
+  otherDataSource: {
+    learnMore: 'Pour en savoir plus',
+    description: 'Actuellement, la base de connaissances de Dify ne dispose que de sources de donn茅es limit茅es. Contribuer 脿 une source de donn茅es dans la base de connaissances Dify est un moyen fantastique d鈥檃m茅liorer la flexibilit茅 et la puissance de la plateforme pour tous les utilisateurs. Notre guide de contribution facilite la prise en main. Veuillez cliquer sur le lien ci-dessous pour en savoir plus.',
+    title: 'Se connecter 脿 d鈥檃utres sources de donn茅es ?',
+  },
+  watercrawl: {
+    apiKeyPlaceholder: 'Cl茅 API de watercrawl.dev',
+    configWatercrawl: 'Configurer Watercrawl',
+    getApiKeyLinkText: 'Obtenez votre cl茅 API sur watercrawl.dev',
+  },
+}
+
+export default translation
diff --git a/i18n/fr-FR/dataset-documents.ts b/i18n/fr-FR/dataset-documents.ts
new file mode 100644
index 0000000..7a79520
--- /dev/null
+++ b/i18n/fr-FR/dataset-documents.ts
@@ -0,0 +1,395 @@
+const translation = {
+  list: {
+    title: 'Documents',
+    desc: 'Tous les fichiers de la Connaissance sont affich茅s ici, et l\'ensemble de la Connaissance peut 锚tre li茅 aux citations Dify ou index茅 via le plugin Chat.',
+    addFile: 'ajouter un fichier',
+    addPages: 'Ajouter des Pages',
+    table: {
+      header: {
+        fileName: 'NOM DU FICHIER',
+        words: 'MOTS',
+        hitCount: 'NOMBRE DE R脡CUP脡RATIONS',
+        uploadTime: 'TEMPS DE T脡L脡CHARGEMENT',
+        status: 'STATUT',
+        action: 'ACTION',
+        chunkingMode: 'MODE DE MORCEAU',
+      },
+      rename: 'Renommer',
+      name: 'Nom',
+    },
+    action: {
+      uploadFile: 'T茅l茅charger un nouveau fichier',
+      settings: 'Param猫tres de segment',
+      addButton: 'Ajouter un morceau',
+      add: 'Ajouter un morceau',
+      batchAdd: 'Ajout en lot',
+      archive: 'Archive',
+      unarchive: 'D茅compresser',
+      delete: 'Supprimer',
+      enableWarning: 'Le fichier archiv茅 ne peut pas 锚tre activ茅',
+      sync: 'Synchroniser',
+    },
+    index: {
+      enable: 'Activer',
+      disable: 'D茅sactiver',
+      all: 'Tout',
+      enableTip: 'Le fichier peut 锚tre index茅',
+      disableTip: 'Le fichier ne peut pas 锚tre index茅',
+    },
+    status: {
+      queuing: 'Mise en file d\'attente',
+      indexing: 'Indexation',
+      paused: 'En pause',
+      error: 'Erreur',
+      available: 'Disponible',
+      enabled: 'Activ茅',
+      disabled: 'D茅sactiv茅',
+      archived: 'Archiv茅',
+    },
+    empty: {
+      title: 'Il n\'y a pas encore de documentation',
+      upload: {
+        tip: 'Vous pouvez t茅l茅charger des fichiers, synchroniser 脿 partir du site web, ou 脿 partir d\'applications web comme Notion, GitHub, etc.',
+      },
+      sync: {
+        tip: 'Dify t茅l茅chargera p茅riodiquement des fichiers de votre Notion et terminera le traitement.',
+      },
+    },
+    delete: {
+      title: '脢tes-vous s没r de vouloir supprimer ?',
+      content: 'Si vous avez besoin de reprendre le traitement plus tard, vous continuerez 脿 partir de l\'endroit o霉 vous vous 锚tes arr锚t茅',
+    },
+    batchModal: {
+      title: 'Ajouter des lots de segments',
+      csvUploadTitle: 'Faites glisser et d茅posez votre fichier CSV ici, ou',
+      browse: 'parcourir',
+      tip: 'Le fichier CSV doit se conformer 脿 la structure suivante :',
+      question: 'question',
+      answer: 'r茅ponse',
+      contentTitle: 'contenu du bloc',
+      content: 'contenu',
+      template: 'T茅l茅chargez le mod猫le ici',
+      cancel: 'Annuler',
+      run: 'Ex茅cuter le lot',
+      runError: 'L\'ex茅cution du lot a 茅chou茅',
+      processing: 'Dans le traitement par lots',
+      completed: 'Importation termin茅e',
+      error: 'Erreur d\'Importation',
+      ok: 'D\'accord',
+    },
+    addUrl: 'Ajouter une URL',
+    learnMore: 'Pour en savoir plus',
+  },
+  metadata: {
+    title: 'M茅tadonn茅es',
+    desc: 'L\'茅tiquetage des m茅tadonn茅es pour les documents permet 脿 l\'IA d\'y acc茅der en temps opportun et expose la source des r茅f茅rences pour les utilisateurs.',
+    dateTimeFormat: 'MMMM D, YYYY hh:mm A',
+    docTypeSelectTitle: 'Veuillez s茅lectionner un type de document',
+    docTypeChangeTitle: 'Changer le type de document',
+    docTypeSelectWarning:
+      'Si le type de document est modifi茅, les m茅tadonn茅es actuellement remplies ne seront plus conserv茅es',
+    firstMetaAction: 'Allons-y',
+    placeholder: {
+      add: 'Ajouter',
+      select: 'S茅lectionner',
+    },
+    source: {
+      upload_file: 'T茅l茅charger le fichier',
+      notion: 'Synchroniser le formulaire depuis Notion',
+      github: 'Synchroniser 脿 partir de Github',
+    },
+    type: {
+      book: 'Livre',
+      webPage: 'Page Web',
+      paper: 'Papier',
+      socialMediaPost: 'Publication sur les R茅seaux Sociaux',
+      personalDocument: 'Document Personnel',
+      businessDocument: 'Document Commercial',
+      IMChat: 'Chat IM',
+      wikipediaEntry: 'Entr茅e Wikip茅dia',
+      notion: 'Synchroniser depuis Notion',
+      github: 'Synchroniser depuis Github',
+      technicalParameters: 'Param猫tres Techniques',
+    },
+    field: {
+      processRule: {
+        processDoc: 'Document de Processus',
+        segmentRule: 'R猫gle de Segment',
+        segmentLength: 'Longueur des Morceaux',
+        processClean: 'Processus de Nettoyage du Texte',
+      },
+      book: {
+        title: 'Titre',
+        language: 'Langue',
+        author: 'Auteur',
+        publisher: '脡diteur',
+        publicationDate: 'Date de publication',
+        ISBN: 'ISBN',
+        category: 'Cat茅gorie',
+      },
+      webPage: {
+        title: 'Titre',
+        url: 'URL',
+        language: 'Langue',
+        authorPublisher: 'Auteur/脡diteur',
+        publishDate: 'Date de publication',
+        topicKeywords: 'Sujets/Mots-cl茅s',
+        description: 'Description',
+      },
+      paper: {
+        title: 'Titre',
+        language: 'Langue',
+        author: 'Auteur',
+        publishDate: 'Date de publication',
+        journalConferenceName: 'Nom du Journal/Conf茅rence',
+        volumeIssuePage: 'Volume/Num茅ro/Page',
+        DOI: 'DOI',
+        topicsKeywords: 'Sujets/Mots-cl茅s',
+        abstract: 'R茅sum茅',
+      },
+      socialMediaPost: {
+        platform: 'Plateforme',
+        authorUsername: 'Auteur/Nom d\'utilisateur',
+        publishDate: 'Date de publication',
+        postURL: 'URL de publication',
+        topicsTags: 'Sujets/Tags',
+      },
+      personalDocument: {
+        title: 'Titre',
+        author: 'Auteur',
+        creationDate: 'Date de Cr茅ation',
+        lastModifiedDate: 'Date de Derni猫re Modification',
+        documentType: 'Type de Document',
+        tagsCategory: 'Tags/Cat茅gorie',
+      },
+      businessDocument: {
+        title: 'Titre',
+        author: 'Auteur',
+        creationDate: 'Date de cr茅ation',
+        lastModifiedDate: 'Date de Derni猫re Modification',
+        documentType: 'Type de Document',
+        departmentTeam: 'D茅partement/脡quipe',
+      },
+      IMChat: {
+        chatPlatform: 'Plateforme de Chat',
+        chatPartiesGroupName: 'Nom du groupe/Parties de discussion',
+        participants: 'Participants',
+        startDate: 'Date de D茅but',
+        endDate: 'Date de fin',
+        topicsKeywords: 'Sujets/Mots-cl茅s',
+        fileType: 'Type de fichier',
+      },
+      wikipediaEntry: {
+        title: 'Titre',
+        language: 'Langue',
+        webpageURL: 'URL de la page web',
+        editorContributor: '脡diteur/Contributeur',
+        lastEditDate: 'Date de derni猫re modification',
+        summaryIntroduction: 'R茅sum茅/Introduction',
+      },
+      notion: {
+        title: 'Titre',
+        language: 'Langue',
+        author: 'Auteur',
+        createdTime: 'Heure de cr茅ation',
+        lastModifiedTime: 'Derni猫re Modification',
+        url: 'URL',
+        tag: '脡tiquette',
+        description: 'Description',
+      },
+      github: {
+        repoName: 'Nom du d茅p么t',
+        repoDesc: 'Description du d茅p么t',
+        repoOwner: 'Propri茅taire du d茅p么t',
+        fileName: 'Nom du Fichier',
+        filePath: 'Chemin du fichier',
+        programmingLang: 'Langage de programmation',
+        url: 'URL',
+        license: 'Licence',
+        lastCommitTime: 'Heure du dernier commit',
+        lastCommitAuthor: 'Auteur du dernier commit',
+      },
+      originInfo: {
+        originalFilename: 'Nom de fichier original',
+        originalFileSize: 'Taille originale du fichier',
+        uploadDate: 'Date de t茅l茅chargement',
+        lastUpdateDate: 'Date de derni猫re mise 脿 jour',
+        source: 'Source',
+      },
+      technicalParameters: {
+        segmentSpecification: 'Sp茅cification des morceaux',
+        segmentLength: 'Longueur des morceaux',
+        avgParagraphLength: 'Longueur moyenne de paragraphe',
+        paragraphs: 'Paragraphes',
+        hitCount: 'Nombre de r茅cup茅rations',
+        embeddingTime: 'Temps d\'incorporation',
+        embeddedSpend: 'D茅penses int茅gr茅es',
+      },
+    },
+    languageMap: {
+      zh: 'Chinois',
+      en: 'Anglais',
+      es: 'Espagnol',
+      fr: 'Fran莽ais',
+      de: 'Allemand',
+      ja: 'Japonais',
+      ko: 'Cor茅en',
+      ru: 'Russe',
+      ar: 'Arabe',
+      pt: 'Portugais',
+      it: 'Italien',
+      nl: 'N茅erlandais',
+      pl: 'Polonais',
+      sv: 'Su茅dois',
+      tr: 'Turc',
+      he: 'H茅breu',
+      hi: 'Hindi',
+      da: 'Danois',
+      fi: 'Finlandais',
+      no: 'Norv茅gien',
+      hu: 'Hongrois',
+      el: 'Grec',
+      cs: 'Tch猫que',
+      th: 'Tha茂',
+      id: 'Indon茅sien',
+    },
+    categoryMap: {
+      book: {
+        fiction: 'Fiction',
+        biography: 'Biographie',
+        history: 'Histoire',
+        science: 'Science',
+        technology: 'Technologie',
+        education: '脡ducation',
+        philosophy: 'Philosophie',
+        religion: 'Religion',
+        socialSciences: 'Sciences Sociales',
+        art: 'Art',
+        travel: 'Voyage',
+        health: 'Sant茅',
+        selfHelp: 'AutoAssistance',
+        businessEconomics: '脡conomie d\'entreprise',
+        cooking: 'Cuisson',
+        childrenYoungAdults: 'EnfantsJeunesAdultes',
+        comicsGraphicNovels: 'BandesDessin茅esRomansGraphiques',
+        poetry: 'Po茅sie',
+        drama: 'Drame',
+        other: 'Autre',
+      },
+      personalDoc: {
+        notes: 'Notes',
+        blogDraft: 'Brouillon de Blog',
+        diary: 'Journal',
+        researchReport: 'Rapport de Recherche',
+        bookExcerpt: 'Extrait de livre',
+        schedule: 'Programme',
+        list: 'Liste',
+        projectOverview: 'Aper莽u du Projet',
+        photoCollection: 'Collection de Photos',
+        creativeWriting: '脡criture Cr茅ative',
+        codeSnippet: 'Extrait de Code',
+        designDraft: 'Projet de Conception',
+        personalResume: 'Curriculum Vitae Personnel',
+        other: 'Autre',
+      },
+      businessDoc: {
+        meetingMinutes: 'Compte-rendu de R茅union',
+        researchReport: 'Rapport de Recherche',
+        proposal: 'Proposition',
+        employeeHandbook: 'Manuel de l\'employ茅',
+        trainingMaterials: 'Mat茅riaux de Formation',
+        requirementsDocument: 'Document de Sp茅cifications',
+        designDocument: 'Document de Conception',
+        productSpecification: 'Sp茅cification du produit',
+        financialReport: 'Rapport Financier',
+        marketAnalysis: 'Analyse de march茅',
+        projectPlan: 'Plan de Projet',
+        teamStructure: 'Structure de l\'茅quipe',
+        policiesProcedures: 'Politiques & Proc茅dures',
+        contractsAgreements: 'Contrats & Accords',
+        emailCorrespondence: 'Correspondance par Email',
+        other: 'Autre',
+      },
+    },
+  },
+  embedding: {
+    processing: 'Traitement des embeddings...',
+    paused: 'Int茅gration en pause',
+    completed: 'Int茅gration termin茅e',
+    error: 'Erreur d\'embedding',
+    docName: 'Pr茅traitement du document',
+    mode: 'R猫gle de segmentation',
+    segmentLength: 'Longueur des morceaux',
+    textCleaning: 'Pr茅-d茅finition du texte et nettoyage',
+    segments: 'Paragraphes',
+    highQuality: 'Mode haute qualit茅',
+    economy: 'Mode 茅conomique',
+    estimate: 'Consommation estim茅e',
+    stop: 'Arr锚tez le traitement',
+    resume: 'Reprendre le traitement',
+    automatic: 'Automatique',
+    custom: 'Personnalis茅',
+    previewTip: 'L\'aper莽u du paragraphe sera disponible apr猫s la fin de l\'embedding.',
+    childMaxTokens: 'Enfant',
+    hierarchical: 'Parent-enfant',
+    pause: 'Pause',
+    parentMaxTokens: 'Parent',
+  },
+  segment: {
+    paragraphs: 'Paragraphes',
+    keywords: 'Mots Cl茅s',
+    addKeyWord: 'Ajouter un mot-cl茅',
+    keywordError: 'La longueur maximale du mot-cl茅 est de 20',
+    characters: 'personnages',
+    hitCount: 'Nombre de r茅cup茅rations',
+    vectorHash: 'Vector hash: ',
+    questionPlaceholder: 'ajoutez la question ici',
+    questionEmpty: 'La question ne peut pas 锚tre vide',
+    answerPlaceholder: 'ajoutez une r茅ponse ici',
+    answerEmpty: 'La r茅ponse ne peut pas 锚tre vide',
+    contentPlaceholder: 'ajoutez du contenu ici',
+    contentEmpty: 'Le contenu ne peut pas 锚tre vide',
+    newTextSegment: 'Nouveau Segment de Texte',
+    newQaSegment: 'Nouveau Segment Q&R',
+    delete: 'Supprimer ce morceau ?',
+    chunks_other: 'MORCEAUX',
+    childChunks_other: 'MORCEAUX ENFANTS',
+    clearFilter: 'Effacer le filtre',
+    newChunk: 'Nouveau Chunk',
+    childChunk: 'Enfant-Chunk',
+    newChildChunk: 'Nouveau morceau enfant',
+    addChunk: 'Ajouter un morceau',
+    chunkAdded: '1 morceau ajout茅',
+    editChunk: 'Modifier le morceau',
+    regenerationConfirmMessage: 'La r茅g茅n茅ration des blocs enfants remplacera les blocs enfants actuels, y compris les blocs modifi茅s et les blocs nouvellement ajout茅s. La r茅g茅n茅ration ne peut pas 锚tre annul茅e.',
+    regenerationSuccessTitle: 'R茅g茅n茅ration termin茅e',
+    edited: '脡DITION',
+    collapseChunks: 'R茅duire les morceaux',
+    childChunkAdded: '1 morceau enfant ajout茅',
+    addAnother: 'Ajouter un autre',
+    searchResults_one: 'R脡SULTAT',
+    regeneratingTitle: 'R茅g茅n茅ration de blocs enfants',
+    expandChunks: 'D茅velopper des blocs',
+    characters_other: 'caract猫res',
+    editedAt: '脡dit茅 le',
+    searchResults_other: 'R脡SULTATS',
+    regenerationSuccessMessage: 'Vous pouvez fermer cette fen锚tre.',
+    parentChunks_one: 'MORCEAU PARENT',
+    regenerationConfirmTitle: 'Voulez-vous r茅g茅n茅rer des morceaux enfants ?',
+    chunks_one: 'MORCEAU',
+    childChunks_one: 'MORCEAU ENFANT',
+    parentChunk: 'Parent-Chunk',
+    chunkDetail: 'D茅tail du morceau',
+    chunk: 'Morceau',
+    parentChunks_other: 'MORCEAUX PARENTS',
+    regeneratingMessage: 'Cela peut prendre un moment, veuillez patienter...',
+    addChildChunk: 'Ajouter un morceau enfant',
+    editParentChunk: 'Modifier le bloc parent',
+    characters_one: 'personnage',
+    searchResults_zero: 'R脡SULTAT',
+    empty: 'Aucun Chunk trouv茅',
+    editChildChunk: 'Modifier le morceau enfant',
+  },
+}
+
+export default translation
diff --git a/i18n/fr-FR/dataset-hit-testing.ts b/i18n/fr-FR/dataset-hit-testing.ts
new file mode 100644
index 0000000..0bb7c94
--- /dev/null
+++ b/i18n/fr-FR/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: 'Test de R茅cup茅ration',
+  desc: 'Testez l\'effet d\'impact de la Connaissance bas茅e sur le texte de la requ锚te donn茅e.',
+  dateTimeFormat: 'JJ/MM/AAAA hh:mm A',
+  recents: 'R茅cents',
+  table: {
+    header: {
+      source: 'Source',
+      text: 'Texte',
+      time: 'Temps',
+    },
+  },
+  input: {
+    title: 'Texte source',
+    placeholder: 'Veuillez entrer un texte, une phrase d茅clarative courte est recommand茅e.',
+    countWarning: 'Jusqu\'脿 200 caract猫res.',
+    indexWarning: 'Connaissances de haute qualit茅 uniquement.',
+    testing: 'Test',
+  },
+  hit: {
+    title: 'PARAGRAPHES DE R脡CUP脡RATION',
+    emptyTip: 'Les r茅sultats des tests de r茅cup茅ration s\'afficheront ici',
+  },
+  noRecentTip: 'Aucun r茅sultat de requ锚te r茅cent ici',
+  viewChart: 'Voir GRAPHIQUE VECTORIEL',
+  settingTitle: 'R茅glage de r茅cup茅ration',
+  viewDetail: 'Voir les d茅tails',
+  hitChunks: 'Appuyez sur {{num}} morceaux enfants',
+  records: 'Archives',
+  chunkDetail: 'D茅tail du morceau',
+  open: 'Ouvrir',
+  keyword: 'Mots-cl茅s',
+}
+
+export default translation
diff --git a/i18n/fr-FR/dataset-settings.ts b/i18n/fr-FR/dataset-settings.ts
new file mode 100644
index 0000000..9e7529e
--- /dev/null
+++ b/i18n/fr-FR/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: 'Param猫tres de connaissance',
+  desc: 'Ici, vous pouvez modifier les propri茅t茅s et les m茅thodes de fonctionnement de la Connaissance.',
+  form: {
+    name: 'Nom de la Connaissance',
+    namePlaceholder: 'Veuillez entrer le nom de la Connaissance',
+    nameError: 'Le nom ne peut pas 锚tre vide',
+    desc: 'Description des connaissances',
+    descInfo: 'Veuillez r茅diger une description textuelle claire pour d茅crire le contenu de la Connaissance. Cette description sera utilis茅e comme base pour la correspondance lors de la s茅lection parmi plusieurs Connaissances pour l\'inf茅rence.',
+    descPlaceholder: 'D茅crivez ce qui se trouve dans cette Connaissance. Une description d茅taill茅e permet 脿 l\'IA d\'acc茅der au contenu de la Connaissance en temps opportun. Si vide, Dify utilisera la strat茅gie de hit par d茅faut.',
+    descWrite: 'Apprenez comment r茅diger une bonne description de connaissance.',
+    permissions: 'Autorisations',
+    permissionsOnlyMe: 'Seulement moi',
+    permissionsAllMember: 'Tous les membres de l\'茅quipe',
+    indexMethod: 'M茅thode d\'Indexation',
+    indexMethodHighQuality: 'Haute Qualit茅',
+    indexMethodHighQualityTip: 'Appeler le mod猫le d\'Embedding pour le traitement afin de fournir une plus grande pr茅cision lors des requ锚tes des utilisateurs.',
+    indexMethodEconomy: '脡conomique',
+    indexMethodEconomyTip: 'Utilisez des moteurs vectoriels hors ligne, des index de mots-cl茅s, etc. pour r茅duire la pr茅cision sans d茅penser de jetons',
+    embeddingModel: 'Mod猫le d\'Embedding',
+    embeddingModelTip: 'Changez le mod猫le int茅gr茅, veuillez aller 脿',
+    embeddingModelTipLink: 'Param猫tres',
+    retrievalSetting: {
+      title: 'Param猫tre de r茅cup茅ration',
+      learnMore: 'En savoir plus',
+      description: '脿 propos de la m茅thode de r茅cup茅ration.',
+      longDescription: '脌 propos de la m茅thode de r茅cup茅ration, vous pouvez la modifier 脿 tout moment dans les param猫tres de Connaissance.',
+      method: 'M茅thode de r茅cup茅ration',
+    },
+    save: 'Enregistrer',
+    me: '(Vous)',
+    permissionsInvitedMembers: 'Membres partiels de l鈥櫭﹒uipe',
+    retrievalSettings: 'Param猫tres de r茅cup茅ration',
+    externalKnowledgeAPI: 'API de connaissances externes',
+    externalKnowledgeID: 'Identification des connaissances externes',
+    indexMethodChangeToEconomyDisabledTip: 'Non disponible pour le d茅classement de HQ 脿 ECO',
+    upgradeHighQualityTip: 'Une fois la mise 脿 niveau vers le mode Haute Qualit茅, il n鈥檈st pas possible de revenir au mode 脡conomique',
+    helpText: 'Apprenez 脿 r茅diger une bonne description de jeu de donn茅es.',
+    searchModel: 'Rechercher un mod猫le',
+  },
+}
+
+export default translation
diff --git a/i18n/fr-FR/dataset.ts b/i18n/fr-FR/dataset.ts
new file mode 100644
index 0000000..ba2985c
--- /dev/null
+++ b/i18n/fr-FR/dataset.ts
@@ -0,0 +1,220 @@
+const translation = {
+  knowledge: 'Connaissance',
+  documentCount: ' documents',
+  wordCount: ' k mots',
+  appCount: ' applications li茅es',
+  createDataset: 'Cr茅er des Connaissances',
+  createDatasetIntro: 'Importez vos propres donn茅es textuelles ou 茅crivez des donn茅es en temps r茅el via Webhook pour l\'am茅lioration du contexte LLM.',
+  deleteDatasetConfirmTitle: 'Supprimer cette Connaissance ?',
+  deleteDatasetConfirmContent:
+    'La suppression de la Connaissance est irr茅versible. Les utilisateurs ne pourront plus acc茅der 脿 votre Savoir, et toutes les configurations de prompt et les journaux seront supprim茅s de fa莽on permanente.',
+  datasetUsedByApp: 'La connaissance est utilis茅e par certaines applications. Les applications ne pourront plus utiliser cette Connaissance, et toutes les configurations de prompts et les journaux seront d茅finitivement supprim茅s.',
+  datasetDeleted: 'Connaissance supprim茅e',
+  datasetDeleteFailed: '脡chec de la suppression de la Connaissance',
+  didYouKnow: 'Saviez-vous ?',
+  intro1: 'La Connaissance peut 锚tre int茅gr茅e dans l\'application Dify',
+  intro2: 'comme un contexte',
+  intro3: ',',
+  intro4: 'ou 莽a ',
+  intro5: 'peut 锚tre cr茅茅',
+  intro6: 'comme un plug-in d\'index ChatGPT autonome 脿 publier',
+  unavailable: 'Indisponible',
+  unavailableTip: 'Le mod猫le d\'embedding n\'est pas disponible, le mod猫le d\'embedding par d茅faut doit 锚tre configur茅',
+  datasets: 'CONNAISSANCE',
+  datasetsApi: 'API',
+  retrieval: {
+    semantic_search: {
+      title: 'Recherche Vectorielle',
+      description: 'G茅n茅rez des embeddings de requ锚te et recherchez le morceau de texte le plus similaire 脿 sa repr茅sentation vectorielle.',
+    },
+    full_text_search: {
+      title: 'Recherche en Texte Int茅gral',
+      description: 'Indexez tous les termes dans le document, permettant aux utilisateurs de rechercher n\'importe quel terme et de r茅cup茅rer le fragment de texte pertinent contenant ces termes.',
+    },
+    hybrid_search: {
+      title: 'Recherche Hybride',
+      description: 'Ex茅cutez une recherche en texte int茅gral et des recherches vectorielles en m锚me temps, r茅organisez pour s茅lectionner la meilleure correspondance pour la requ锚te de l\'utilisateur. La configuration de l\'API du mod猫le de r茅organisation est n茅cessaire.',
+      recommend: 'Recommander',
+    },
+    invertedIndex: {
+      title: 'Index invers茅',
+      description: 'L\'Index invers茅 est une structure utilis茅e pour une r茅cup茅ration efficace. Organis茅 par termes, chaque terme pointe vers des documents ou des pages web le contenant.',
+    },
+    change: 'Changer',
+    changeRetrievalMethod: 'Changer la m茅thode de r茅cup茅ration',
+  },
+  docsFailedNotice: 'Les documents n\'ont pas pu 锚tre index茅s',
+  retry: 'R茅essayer',
+  indexingTechnique: {
+    high_quality: 'HQ',
+    economy: '脡CO',
+  },
+  indexingMethod: {
+    semantic_search: 'VECTEUR',
+    full_text_search: 'TEXTE INT脡GRAL',
+    hybrid_search: 'HYBRIDE',
+    invertedIndex: 'INVERS脡',
+  },
+  mixtureHighQualityAndEconomicTip: 'Le mod猫le de reclassement est n茅cessaire pour le m茅lange de bases de connaissances de haute qualit茅 et 茅conomiques.',
+  inconsistentEmbeddingModelTip: 'Le mod猫le de reclassement est n茅cessaire si les mod猫les d\'incorporation des bases de connaissances s茅lectionn茅es sont incoh茅rents.',
+  retrievalSettings: 'Param猫tres de r茅cup茅ration',
+  rerankSettings: 'Param猫tres de reclassement',
+  weightedScore: {
+    title: 'Score pond茅r茅',
+    description: 'En ajustant les poids attribu茅s, cette strat茅gie de reclassement d茅termine s\'il faut prioriser la correspondance s茅mantique ou par mots-cl茅s.',
+    semanticFirst: 'S茅mantique d\'abord',
+    keywordFirst: 'Mot-cl茅 d\'abord',
+    customized: 'Personnalis茅',
+    semantic: 'S茅mantique',
+    keyword: 'Mot-cl茅',
+  },
+  nTo1RetrievalLegacy: 'La r茅cup茅ration N-脿-1 sera officiellement obsol猫te 脿 partir de septembre. Il est recommand茅 d\'utiliser la derni猫re r茅cup茅ration multi-chemins pour obtenir de meilleurs r茅sultats.',
+  nTo1RetrievalLegacyLink: 'En savoir plus',
+  nTo1RetrievalLegacyLinkText: 'La r茅cup茅ration N-脿-1 sera officiellement obsol猫te en septembre.',
+  defaultRetrievalTip: 'La r茅cup茅ration 脿 chemins multiples est utilis茅e par d茅faut. Les connaissances sont extraites de plusieurs bases de connaissances, puis reclass茅es.',
+  editExternalAPIConfirmWarningContent: {
+    front: 'Cette API de connaissances externes est li茅e 脿',
+    end: 'connaissances externes, et cette modification sera appliqu茅e 脿 tous. 脢tes-vous s没r de vouloir enregistrer cette modification ?',
+  },
+  editExternalAPIFormWarning: {
+    end: 'Connaissances externes',
+    front: 'Cette API externe est li茅e 脿',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      end: '?',
+      front: 'Supprimer',
+    },
+    content: {
+      front: 'Cette API de connaissances externes est li茅e 脿',
+      end: 'connaissances externes. La suppression de cette API les invalidera toutes. 脢tes-vous s没r de vouloir supprimer cette API ?',
+    },
+    noConnectionContent: '脢tes-vous s没r de supprimer cette API ?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: 'Choisir une API de connaissances externe',
+  },
+  connectDatasetIntro: {
+    content: {
+      link: 'D茅couvrez comment cr茅er une API externe',
+      end: '. Trouvez ensuite l鈥橧D de connaissances correspondant et remplissez-le dans le formulaire sur la gauche. Si toutes les informations sont correctes, il passera automatiquement au test de r茅cup茅ration dans la base de connaissances apr猫s avoir cliqu茅 sur le bouton de connexion.',
+      front: 'Pour vous connecter 脿 une base de connaissances externe, vous devez d鈥檃bord cr茅er une API externe. Veuillez lire attentivement et vous r茅f茅rer 脿',
+    },
+    learnMore: 'Pour en savoir plus',
+    title: 'Comment se connecter 脿 une base de connaissances externe',
+  },
+  connectHelper: {
+    helper2: 'Seule la fonctionnalit茅 de r茅cup茅ration est prise en charge',
+    helper3: '. Nous vous recommandons vivement de',
+    helper4: 'Lire la documentation d鈥檃ide',
+    helper5: 'soigneusement avant d鈥檜tiliser cette fonctionnalit茅.',
+    helper1: 'Connectez-vous 脿 des bases de connaissances externes via l鈥橝PI et l鈥橧D de base de connaissances.',
+  },
+  externalKnowledgeForm: {
+    cancel: 'Annuler',
+    connect: 'Relier',
+  },
+  externalAPIForm: {
+    encrypted: {
+      end: 'Technologie.',
+      front: 'Votre jeton API sera chiffr茅 et stock茅 脿 l鈥檃ide de',
+    },
+    name: 'Nom',
+    apiKey: 'Cl茅 API',
+    save: 'Sauvegarder',
+    cancel: 'Annuler',
+    edit: '脡diter',
+    endpoint: 'Point de terminaison de l鈥橝PI',
+  },
+  externalKnowledgeName: 'Nom de la connaissance externe',
+  mixtureInternalAndExternalTip: 'Le mod猫le Rerank est n茅cessaire pour m茅langer les connaissances internes et externes.',
+  externalKnowledgeIdPlaceholder: 'Entrez l鈥橧D de connaissances',
+  createExternalAPI: 'Ajouter une API de connaissances externe',
+  externalKnowledgeNamePlaceholder: 'Entrez le nom de la base de connaissances',
+  allExternalTip: 'Lorsqu鈥檌l utilise uniquement des connaissances externes, l鈥檜tilisateur peut choisir d鈥檃ctiver ou non le mod猫le Rerank. S鈥檌l n鈥檈st pas activ茅, les morceaux r茅cup茅r茅s seront tri茅s en fonction des scores. Lorsque les strat茅gies de r茅cup茅ration des diff茅rentes bases de connaissances sont incoh茅rentes, elles seront inexactes.',
+  externalAPI: 'API externe',
+  editExternalAPIFormTitle: 'Modifier l鈥橝PI de connaissances externes',
+  externalTag: 'Externe',
+  editExternalAPITooltipTitle: 'CONNAISSANCES ASSOCI脡ES',
+  connectDataset: 'Se connecter 脿 une base de connaissances externe',
+  externalKnowledgeDescription: 'Description des connaissances',
+  externalAPIPanelDocumentation: 'D茅couvrez comment cr茅er une API de connaissances externe',
+  createNewExternalAPI: 'Cr茅er une API de connaissances externe',
+  externalKnowledgeDescriptionPlaceholder: 'D茅crivez le contenu de cette base de connaissances (facultatif)',
+  externalAPIPanelDescription: 'L鈥橝PI de connaissances externe est utilis茅e pour se connecter 脿 une base de connaissances en dehors de Dify et r茅cup茅rer des connaissances de cette base de connaissances.',
+  externalKnowledgeId: 'Identification des connaissances externes',
+  externalAPIPanelTitle: 'API de connaissances externes',
+  noExternalKnowledge: 'Il n鈥檡 a pas encore d鈥橝PI de connaissances externes, cliquez ici pour cr茅er',
+  learnHowToWriteGoodKnowledgeDescription: 'Apprenez 脿 r茅diger une bonne description des connaissances',
+  chunkingMode: {
+    general: 'G茅n茅ralit茅s',
+    parentChild: 'Parent-enfant',
+  },
+  parentMode: {
+    paragraph: 'Paragraphe',
+    fullDoc: 'Doc complet',
+  },
+  batchAction: {
+    archive: 'Archiver',
+    disable: 'D茅sactiver',
+    delete: 'Supprimer',
+    cancel: 'Annuler',
+    enable: 'Activer',
+    selected: 'S茅lectionn茅',
+  },
+  preprocessDocument: '{{num}} Pr茅traiter les documents',
+  documentsDisabled: '{{num}} documents d茅sactiv茅s - inactifs depuis plus de 30 jours',
+  localDocs: 'Docs locaux',
+  enable: 'Activer',
+  allKnowledge: 'Toutes les connaissances',
+  allKnowledgeDescription: 'S茅lectionnez cette option pour afficher toutes les connaissances dans cet espace de travail. Seul le propri茅taire de l鈥檈space de travail peut g茅rer toutes les connaissances.',
+  metadata: {
+    createMetadata: {
+      name: 'Nom',
+      title: 'Nouveaux M茅tadonn茅es',
+      namePlaceholder: 'Ajouter le nom des m茅tadonn茅es',
+      type: 'Type',
+      back: 'Retour',
+    },
+    checkName: {
+      empty: 'Le nom des m茅tadonn茅es ne peut pas 锚tre vide',
+      invalid: 'Le nom des m茅tadonn茅es ne peut contenir que des lettres minuscules, des chiffres et des tirets bas et doit commencer par une lettre minuscule.',
+    },
+    batchEditMetadata: {
+      editMetadata: 'Modifier les m茅tadonn茅es',
+      applyToAllSelectDocumentTip: 'Cr茅ez automatiquement toutes les m茅tadonn茅es modifi茅es et nouvelles pour tous les documents s茅lectionn茅s, sinon l\'茅dition des m茅tadonn茅es ne s\'appliquera qu\'aux documents qui en ont.',
+      applyToAllSelectDocument: 'Appliquer 脿 tous les documents s茅lectionn茅s',
+      multipleValue: 'Valeur multiple',
+      editDocumentsNum: '脡dition de {{num}} documents',
+    },
+    selectMetadata: {
+      search: 'Rechercher des m茅tadonn茅es',
+      newAction: 'Nouveaux m茅tadonn茅es',
+      manageAction: 'G茅rer',
+    },
+    datasetMetadata: {
+      description: 'Vous pouvez g茅rer toutes les m茅tadonn茅es dans cette connaissance ici. Les modifications seront synchronis茅es avec chaque document.',
+      rename: 'Renommer',
+      builtIn: 'Int茅gr茅',
+      addMetaData: 'Ajouter des m茅tadonn茅es',
+      namePlaceholder: 'Nom de m茅tadonn茅es',
+      builtInDescription: 'Les m茅tadonn茅es int茅gr茅es sont automatiquement extraites et g茅n茅r茅es. Elles doivent 锚tre activ茅es avant utilisation et ne peuvent pas 锚tre modifi茅es.',
+      deleteTitle: 'Confirmer la suppression',
+      values: '{{num}} Valeurs',
+      deleteContent: '脢tes-vous s没r de vouloir supprimer les m茅tadonn茅es "{{name}}" ?',
+      name: 'Nom',
+    },
+    documentMetadata: {
+      technicalParameters: 'Param猫tres techniques',
+      metadataToolTip: 'Les m茅tadonn茅es servent de filtre essentiel qui am茅liore l\'exactitude et la pertinence de la recherche d\'informations. Vous pouvez modifier et ajouter des m茅tadonn茅es pour ce document ici.',
+      documentInformation: 'Informations du document',
+      startLabeling: 'Commencer l\'茅tiquetage',
+    },
+    addMetadata: 'Ajouter des m茅tadonn茅es',
+    metadata: 'M茅tadonn茅es',
+    chooseTime: 'Choisissez un moment...',
+  },
+  embeddingModelNotAvailable: 'Le mod猫le d\'embedding n\'est pas disponible.',
+}
+
+export default translation
diff --git a/i18n/fr-FR/education.ts b/i18n/fr-FR/education.ts
new file mode 100644
index 0000000..8dcb687
--- /dev/null
+++ b/i18n/fr-FR/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    front: 'Vous 锚tes maintenant 茅ligible pour le statut V茅rifi茅 en 脡ducation. Veuillez entrer vos informations 茅ducatives ci-dessous pour compl茅ter le processus et recevoir un',
+    coupon: 'coupon exclusif 100%',
+    end: 'pour le Plan Professionnel Dify.',
+  },
+  form: {
+    schoolName: {
+      placeholder: 'Entrez le nom officiel et complet de votre 茅cole',
+      title: 'Le nom de votre 茅cole',
+    },
+    schoolRole: {
+      option: {
+        administrator: 'Administrateur scolaire',
+        student: '脡tudiant',
+        teacher: 'Professeur',
+      },
+      title: 'Votre r么le 脿 l\'茅cole',
+    },
+    terms: {
+      desc: {
+        and: 'et',
+        privacyPolicy: 'Politique de confidentialit茅',
+        termsOfService: 'Conditions d\'utilisation',
+        end: '. En soumettant :',
+        front: 'Vos informations et votre utilisation du statut 脡ducation V茅rifi茅e sont soumises 脿 notre',
+      },
+      option: {
+        age: 'Je confirme que j\'ai au moins 18 ans.',
+        inSchool: 'Je confirme que je suis inscrit ou employ茅 dans l\'institution indiqu茅e. Dify peut demander une preuve d\'inscription/employ茅. Si je falsifie mon 茅ligibilit茅, j\'accepte de payer tous les frais initialement annul茅s en fonction de mon statut 茅ducatif.',
+      },
+      title: 'Conditions et accords',
+    },
+  },
+  emailLabel: 'Votre email actuel',
+  learn: 'Apprenez comment faire v茅rifier votre 茅ducation',
+  currentSigned: 'ACTUELLEMENT CONNECT脡 EN TANT QUE',
+  successTitle: 'Vous avez obtenu une 茅ducation Dify v茅rifi茅e.',
+  successContent: 'Nous avons 茅mis un coupon de r茅duction de 100 % pour le plan Dify Professionnel sur votre compte. Le coupon est valable pendant un an, veuillez l\'utiliser dans la p茅riode de validit茅.',
+  rejectTitle: 'Votre v茅rification 茅ducative Dify a 茅t茅 rejet茅e.',
+  submit: 'Soumettre',
+  submitError: 'L\'envoi du formulaire a 茅chou茅. Veuillez r茅essayer plus tard.',
+  toVerified: 'Faire v茅rifier l\'茅ducation',
+  rejectContent: 'Malheureusement, vous n\'锚tes pas 茅ligible au statut 脡ducation V茅rifi茅 et ne pouvez donc pas recevoir le coupon exclusif de 100 % pour le Plan Professionnel Dify si vous utilisez cette adresse e-mail.',
+}
+
+export default translation
diff --git a/i18n/fr-FR/explore.ts b/i18n/fr-FR/explore.ts
new file mode 100644
index 0000000..d868ebd
--- /dev/null
+++ b/i18n/fr-FR/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: 'Explorer',
+  sidebar: {
+    discovery: 'D茅couverte',
+    chat: 'Discussion',
+    workspace: 'Espace de travail',
+    action: {
+      pin: '脡pingle',
+      unpin: 'D茅tacher',
+      rename: 'Renommer',
+      delete: 'Supprimer',
+    },
+    delete: {
+      title: 'Supprimer l\'application',
+      content: '脢tes-vous s没r de vouloir supprimer cette application ?',
+    },
+  },
+  apps: {
+    title: 'Explorez les applications par Dify',
+    description: 'Utilisez ces applications mod猫les instantan茅ment ou personnalisez vos propres applications bas茅es sur les mod猫les.',
+    allCategories: 'Recommand茅',
+  },
+  appCard: {
+    addToWorkspace: 'Ajouter 脿 l\'espace de travail',
+    customize: 'Personnaliser',
+  },
+  appCustomize: {
+    title: 'Cr茅er une application 脿 partir de {{name}}',
+    subTitle: 'Ic么ne de l\'application & nom',
+    nameRequired: 'Le nom de l\'application est requis',
+  },
+  category: {
+    Assistant: 'Assistant',
+    Writing: '脡criture',
+    Translate: 'Traduire',
+    Programming: 'Programmation',
+    HR: 'RH',
+    Agent: 'Agent',
+    Workflow: 'Flux de travail',
+    Entertainment: 'Divertissement',
+  },
+}
+
+export default translation
diff --git a/i18n/fr-FR/layout.ts b/i18n/fr-FR/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/fr-FR/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/fr-FR/login.ts b/i18n/fr-FR/login.ts
new file mode 100644
index 0000000..a7a633f
--- /dev/null
+++ b/i18n/fr-FR/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: 'Salut, commen莽ons !馃憢',
+  welcome: 'Bienvenue sur Dify, veuillez vous connecter pour continuer.',
+  email: 'Adresse e-mail',
+  emailPlaceholder: 'Votre email',
+  password: 'Mot de passe',
+  passwordPlaceholder: 'Votre mot de passe',
+  name: 'Nom d\'utilisateur',
+  namePlaceholder: 'Votre nom d\'utilisateur',
+  forget: 'Mot de passe oubli茅 ?',
+  signBtn: 'Se connecter',
+  installBtn: 'Mettre en place',
+  setAdminAccount: 'Configuration d\'un compte administrateur',
+  setAdminAccountDesc: 'Privil猫ges maximum pour le compte administrateur, qui peut 锚tre utilis茅 pour cr茅er des applications et g茅rer les fournisseurs de LLM, etc.',
+  createAndSignIn: 'Cr茅er et se connecter',
+  oneMoreStep: 'Une 茅tape de plus',
+  createSample: 'Sur la base de ces informations, nous cr茅erons une application exemple pour vous',
+  invitationCode: 'Code d\'invitation',
+  invitationCodePlaceholder: 'Votre code d\'invitation',
+  interfaceLanguage: 'Langue de l\'interface',
+  timezone: 'Fuseau horaire',
+  go: 'Aller 脿 Dify',
+  sendUsMail: 'Envoyez-nous votre introduction, et nous nous occuperons de la demande d\'invitation.',
+  acceptPP: 'J\'ai lu et j\'accepte la politique de confidentialit茅',
+  reset: 'Veuillez ex茅cuter la commande suivante pour r茅initialiser votre mot de passe',
+  withGitHub: 'Continuer avec GitHub',
+  withGoogle: 'Continuer avec Google',
+  rightTitle: 'D茅bloquez le plein potentiel des LLM',
+  rightDesc: 'Construisez sans effort des applications IA visuellement captivantes, op茅rationnelles et am茅liorables.',
+  tos: 'Conditions de Service',
+  pp: 'Politique de Confidentialit茅',
+  tosDesc: 'En vous inscrivant, vous acceptez nos',
+  goToInit: 'Si vous n\'avez pas initialis茅 le compte, veuillez vous rendre sur la page d\'initialisation',
+  dontHave: 'Vous n\'avez pas ?',
+  invalidInvitationCode: 'Code d\'invitation invalide',
+  accountAlreadyInited: 'Compte d茅j脿 initialis茅',
+  forgotPassword: 'Mot de passe oubli茅?',
+  resetLinkSent: 'Lien de r茅initialisation envoy茅',
+  sendResetLink: 'Envoyer le lien de r茅initialisation',
+  backToSignIn: 'Retour 脿 la connexion',
+  forgotPasswordDesc: 'Veuillez entrer votre adresse e-mail pour r茅initialiser votre mot de passe. Nous vous enverrons un e-mail avec des instructions sur la r茅initialisation de votre mot de passe.',
+  checkEmailForResetLink: 'Veuillez v茅rifier votre e-mail pour un lien de r茅initialisation de votre mot de passe. S\'il n\'appara卯t pas dans quelques minutes, assurez-vous de v茅rifier votre dossier de spam.',
+  passwordChanged: 'Connectez-vous maintenant',
+  changePassword: 'Changer le mot de passe',
+  changePasswordTip: 'Veuillez entrer un nouveau mot de passe pour votre compte',
+  invalidToken: 'Token invalide ou expir茅',
+  confirmPassword: 'Confirmez le mot de passe',
+  confirmPasswordPlaceholder: 'Confirmez votre nouveau mot de passe',
+  passwordChangedTip: 'Votre mot de passe a 茅t茅 chang茅 avec succ猫s',
+  error: {
+    emailEmpty: 'Une adresse e-mail est requise',
+    emailInValid: 'Veuillez entrer une adresse email valide',
+    nameEmpty: 'Le nom est requis',
+    passwordEmpty: 'Un mot de passe est requis',
+    passwordInvalid: 'Le mot de passe doit contenir des lettres et des chiffres, et la longueur doit 锚tre sup茅rieure 脿 8.',
+    passwordLengthInValid: 'Le mot de passe doit comporter au moins 8 caract猫res.',
+    registrationNotAllowed: 'Compte introuvable. Veuillez contacter l鈥檃dministrateur syst猫me pour vous inscrire.',
+  },
+  license: {
+    tip: 'Avant de commencer Dify Community Edition, lisez le GitHub',
+    link: 'Licence Open-source',
+  },
+  join: 'Rejoindre',
+  joinTipStart: 'Je vous invite 脿 rejoindre',
+  joinTipEnd: '茅quipe sur Dify',
+  invalid: 'Le lien a expir茅',
+  explore: 'Explorez Dify',
+  activatedTipStart: 'Vous avez rejoint le',
+  activatedTipEnd: '茅quipe',
+  activated: 'Connectez-vous maintenant',
+  adminInitPassword: 'Mot de passe d\'initialisation de l\'administrateur',
+  validate: 'Valider',
+  sso: 'Poursuivre avec l鈥檃uthentification unique',
+  checkCode: {
+    verificationCode: 'Code de v茅rification',
+    useAnotherMethod: 'Utiliser une autre m茅thode',
+    didNotReceiveCode: 'Vous n鈥檃vez pas re莽u le code ?',
+    emptyCode: 'Le code est requis',
+    verify: 'V茅rifier',
+    verificationCodePlaceholder: 'Entrez le code 脿 6 chiffres',
+    resend: 'Renvoyer',
+    invalidCode: 'Code non valide',
+    checkYourEmail: 'V茅rifiez vos e-mails',
+    validTime: 'Gardez 脿 l鈥檈sprit que le code est valable 5 minutes',
+    tips: 'Nous envoyons un code de v茅rification 脿 <strong>{{email}}</strong>',
+  },
+  sendVerificationCode: 'Envoyer le code de v茅rification',
+  or: 'OU',
+  continueWithCode: 'Continuer avec le code',
+  useVerificationCode: 'Utiliser le code de v茅rification',
+  noLoginMethod: 'M茅thode d鈥檃uthentification non configur茅e',
+  backToLogin: 'Retour 脿 la connexion',
+  changePasswordBtn: 'D茅finir un mot de passe',
+  setYourAccount: 'Configurer votre compte',
+  withSSO: 'Poursuivre avec l鈥檃uthentification unique',
+  resetPassword: 'R茅initialiser le mot de passe',
+  back: 'Pr茅c茅dent',
+  enterYourName: 'Veuillez entrer votre nom d鈥檜tilisateur',
+  noLoginMethodTip: 'Veuillez contacter l鈥檃dministrateur syst猫me pour ajouter une m茅thode d鈥檃uthentification.',
+  resetPasswordDesc: 'Tapez l鈥檃dresse e-mail que vous avez utilis茅e pour vous inscrire sur Dify et nous vous enverrons un e-mail de r茅initialisation de mot de passe.',
+  usePassword: 'Utiliser le mot de passe',
+  licenseInactiveTip: 'La licence Dify Enterprise de votre espace de travail est inactive. Veuillez contacter votre administrateur pour continuer 脿 utiliser Dify.',
+  licenseLostTip: '脡chec de la connexion au serveur de licences Dify. Veuillez contacter votre administrateur pour continuer 脿 utiliser Dify.',
+  licenseExpired: 'Licence expir茅e',
+  licenseLost: 'Licence perdue',
+  licenseExpiredTip: 'La licence Dify Enterprise de votre espace de travail a expir茅. Veuillez contacter votre administrateur pour continuer 脿 utiliser Dify.',
+  licenseInactive: 'Licence inactive',
+}
+
+export default translation
diff --git a/i18n/fr-FR/plugin-tags.ts b/i18n/fr-FR/plugin-tags.ts
new file mode 100644
index 0000000..492fd6c
--- /dev/null
+++ b/i18n/fr-FR/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    news: 'Nouvelles',
+    design: 'Concevoir',
+    videos: 'Vid茅os',
+    agent: 'Agent',
+    finance: 'Finance',
+    entertainment: 'Divertissement',
+    travel: 'Voyager',
+    productivity: 'Productivit茅',
+    search: 'Rechercher',
+    education: '脡ducation',
+    business: 'Affaire',
+    weather: 'Temps',
+    image: 'Image',
+    social: 'Social',
+    medical: 'M茅dical',
+    other: 'Autre',
+    utilities: 'Utilitaires',
+  },
+  searchTags: 'Mots-cl茅s de recherche',
+  allTags: 'Tous les mots-cl茅s',
+}
+
+export default translation
diff --git a/i18n/fr-FR/plugin.ts b/i18n/fr-FR/plugin.ts
new file mode 100644
index 0000000..04269e7
--- /dev/null
+++ b/i18n/fr-FR/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    extensions: 'Extensions',
+    agents: 'Strat茅gies des agents',
+    models: 'Mod猫le',
+    tools: 'Outils',
+    bundles: 'Paquets',
+    all: 'Tout',
+  },
+  categorySingle: {
+    extension: 'Extension',
+    tool: 'Outil',
+    model: 'Mod猫le',
+    agent: 'Strat茅gie d鈥檃gent',
+    bundle: 'Paquet',
+  },
+  list: {
+    source: {
+      github: 'Installer 脿 partir de GitHub',
+      local: 'Installer 脿 partir d鈥檜n fichier de package local',
+      marketplace: 'Installer 脿 partir de Marketplace',
+    },
+    notFound: 'Aucun plugin trouv茅',
+    noInstalled: 'Aucun plugin install茅',
+  },
+  source: {
+    local: 'Fichier de package local',
+    github: 'Lien avec GitHub',
+    marketplace: 'March茅',
+  },
+  detailPanel: {
+    categoryTip: {
+      debugging: 'Plugin de d茅bogage',
+      local: 'Plugin local',
+      github: 'Install茅 脿 partir de Github',
+      marketplace: 'Install茅 脿 partir de Marketplace',
+    },
+    operation: {
+      viewDetail: 'Voir les d茅tails',
+      info: 'Informations sur le plugin',
+      checkUpdate: 'V茅rifier la mise 脿 jour',
+      update: 'Mettre 脿 jour',
+      install: 'Installer',
+      remove: 'Enlever',
+      detail: 'D茅tails',
+    },
+    toolSelector: {
+      uninstalledLink: 'G茅rer dans les plugins',
+      title: 'Ajouter un outil',
+      uninstalledContent: 'Ce plugin est install茅 脿 partir du r茅f茅rentiel local/GitHub. Veuillez utiliser apr猫s l鈥檌nstallation.',
+      unsupportedTitle: 'Action non soutenue',
+      descriptionLabel: 'Description de l鈥檕util',
+      placeholder: 'S茅lectionnez un outil...',
+      params: 'CONFIGURATION DE RAISONNEMENT',
+      unsupportedContent: 'La version du plugin install茅e ne fournit pas cette action.',
+      auto: 'Automatique',
+      descriptionPlaceholder: 'Br猫ve description de l鈥檕bjectif de l鈥檕util, par exemple, obtenir la temp茅rature d鈥檜n endroit sp茅cifique.',
+      unsupportedContent2: 'Cliquez pour changer de version.',
+      uninstalledTitle: 'Outil non install茅',
+      empty: 'Cliquez sur le bouton 芦 + 禄 pour ajouter des outils. Vous pouvez ajouter plusieurs outils.',
+      toolLabel: 'Outil',
+      settings: 'PARAM脠TRES UTILISATEUR',
+      paramsTip2: 'Lorsque 芦 Automatique 禄 est d茅sactiv茅, la valeur par d茅faut est utilis茅e.',
+      paramsTip1: 'Contr么le les param猫tres d鈥檌nf茅rence LLM.',
+    },
+    modelNum: '{{num}} MOD脠LES INCLUS',
+    endpointDeleteTip: 'Supprimer le point de terminaison',
+    endpoints: 'Terminaison',
+    endpointsDocLink: 'Voir le document',
+    switchVersion: 'Version du commutateur',
+    strategyNum: '{{num}} {{strat茅gie}} INCLUS',
+    configureTool: 'Configurer l鈥檕util',
+    endpointDeleteContent: 'Souhaitez-vous supprimer {{name}} ?',
+    disabled: 'Handicap茅',
+    endpointsTip: 'Ce plug-in fournit des fonctionnalit茅s sp茅cifiques via des points de terminaison, et vous pouvez configurer plusieurs ensembles de points de terminaison pour l鈥檈space de travail actuel.',
+    configureModel: 'Configurer le mod猫le',
+    configureApp: 'Configurer l鈥檃pplication',
+    endpointsEmpty: 'Cliquez sur le bouton 芦 + 禄 pour ajouter un point de terminaison',
+    actionNum: '{{num}} {{action}} INCLUS',
+    endpointDisableContent: 'Souhaitez-vous d茅sactiver {{name}} ?',
+    endpointDisableTip: 'D茅sactiver le point de terminaison',
+    endpointModalTitle: 'Configurer le point de terminaison',
+    serviceOk: 'Service OK',
+    endpointModalDesc: 'Une fois configur茅, les fonctionnalit茅s fournies par le plugin via les points de terminaison de l鈥橝PI peuvent 锚tre utilis茅es.',
+  },
+  debugInfo: {
+    title: 'D茅bogage',
+    viewDocs: 'Voir la documentation',
+  },
+  privilege: {
+    whoCanInstall: 'Qui peut installer et g茅rer les plugins ?',
+    admins: 'Administrateurs',
+    noone: 'Personne',
+    title: 'Pr茅f茅rences du plugin',
+    everyone: 'Tout le monde',
+    whoCanDebug: 'Qui peut d茅boguer les plugins ?',
+  },
+  pluginInfoModal: {
+    release: 'Lib茅rer',
+    title: 'Informations sur le plugin',
+    packageName: 'Colis',
+    repository: 'D茅p么t',
+  },
+  action: {
+    checkForUpdates: 'Rechercher des mises 脿 jour',
+    pluginInfo: 'Informations sur le plugin',
+    delete: 'Supprimer le plugin',
+    deleteContentLeft: 'Souhaitez-vous supprimer',
+    deleteContentRight: 'Plug-in ?',
+    usedInApps: 'Ce plugin est utilis茅 dans les applications {{num}}.',
+  },
+  installModal: {
+    labels: {
+      package: 'Colis',
+      version: 'Version',
+      repository: 'D茅p么t',
+    },
+    installedSuccessfullyDesc: 'Le plugin a 茅t茅 install茅 avec succ猫s.',
+    uploadingPackage: 'T茅l茅chargement de {{packageName}}...',
+    readyToInstallPackage: 'Sur le point d鈥檌nstaller le plugin suivant',
+    back: 'Pr茅c茅dent',
+    fromTrustSource: 'Assurez-vous de n鈥檌nstaller que des plugins provenant d鈥檜ne <trustSource>source fiable</trustSource>.',
+    close: 'Fermer',
+    installing: 'Installation...',
+    pluginLoadErrorDesc: 'Ce plugin ne sera pas install茅',
+    cancel: 'Annuler',
+    installFailed: '脡chec de l鈥檌nstallation',
+    readyToInstallPackages: 'Sur le point d鈥檌nstaller les plugins {{num}} suivants',
+    install: 'Installer',
+    uploadFailed: '脡chec du t茅l茅chargement',
+    installComplete: 'Installation termin茅e',
+    pluginLoadError: 'Erreur de chargement du plugin',
+    dropPluginToInstall: 'D茅posez le package de plugin ici pour l鈥檌nstaller',
+    readyToInstall: 'Sur le point d鈥檌nstaller le plugin suivant',
+    installedSuccessfully: 'Installation r茅ussie',
+    next: 'Prochain',
+    installPlugin: 'Installer le plugin',
+    installFailedDesc: 'L鈥檌nstallation du plug-in a 茅chou茅.',
+  },
+  installFromGitHub: {
+    installFailed: '脡chec de l鈥檌nstallation',
+    installPlugin: 'Installer le plugin depuis GitHub',
+    gitHubRepo: 'R茅f茅rentiel GitHub',
+    selectPackage: 'S茅lectionnez le forfait',
+    selectVersion: 'S茅lectionner la version',
+    uploadFailed: '脡chec du t茅l茅chargement',
+    installNote: 'Assurez-vous de n鈥檌nstaller que des plugins provenant d鈥檜ne source fiable.',
+    selectVersionPlaceholder: 'Veuillez s茅lectionner une version',
+    installedSuccessfully: 'Installation r茅ussie',
+    updatePlugin: 'Mettre 脿 jour le plugin 脿 partir de GitHub',
+    selectPackagePlaceholder: 'Veuillez s茅lectionner un forfait',
+  },
+  upgrade: {
+    upgrading: 'Installation...',
+    usedInApps: 'Utilis茅 dans les applications {{num}}',
+    close: 'Fermer',
+    description: 'Sur le point d鈥檌nstaller le plugin suivant',
+    upgrade: 'Installer',
+    title: 'Installer le plugin',
+    successfulTitle: 'Installation r茅ussie',
+  },
+  error: {
+    noReleasesFound: 'Aucune version n鈥檃 茅t茅 trouv茅e. V茅rifiez le r茅f茅rentiel GitHub ou l鈥橴RL d鈥檈ntr茅e.',
+    inValidGitHubUrl: 'URL GitHub non valide. Entrez une URL valide au format : https://github.com/owner/repo',
+    fetchReleasesError: 'Impossible de r茅cup茅rer les versions. Veuillez r茅essayer plus tard.',
+  },
+  marketplace: {
+    sortOption: {
+      firstReleased: 'Premi猫re sortie',
+      mostPopular: 'Les plus populaires',
+      recentlyUpdated: 'R茅cemment mis 脿 jour',
+      newlyReleased: 'Nouvellement publi茅',
+    },
+    noPluginFound: 'Aucun plugin trouv茅',
+    moreFrom: 'Plus de Marketplace',
+    and: 'et',
+    viewMore: 'Voir plus',
+    pluginsResult: '{{num}} r茅sultats',
+    discover: 'D茅couvrir',
+    difyMarketplace: 'March茅 Dify',
+    empower: 'Renforcez le d茅veloppement de votre IA',
+    sortBy: 'Ville noire',
+    partnerTip: 'V茅rifi茅 par un partenaire Dify',
+    verifiedTip: 'V茅rifi茅 par Dify',
+  },
+  task: {
+    installError: '{{errorLength}} les plugins n鈥檕nt pas pu 锚tre install茅s, cliquez pour voir',
+    installingWithSuccess: 'Installation des plugins {{installingLength}}, succ猫s de {{successLength}}.',
+    installingWithError: 'Installation des plugins {{installingLength}}, succ猫s de {{successLength}}, 茅chec de {{errorLength}}',
+    installedError: '{{errorLength}} les plugins n鈥檕nt pas pu 锚tre install茅s',
+    clearAll: 'Effacer tout',
+    installing: 'Installation des plugins {{installingLength}}, 0 fait.',
+  },
+  search: 'Rechercher',
+  submitPlugin: 'Soumettre le plugin',
+  installAction: 'Installer',
+  from: 'De',
+  searchCategories: 'Cat茅gories de recherche',
+  searchPlugins: 'Rechercher des plugins',
+  fromMarketplace: '脌 partir de Marketplace',
+  findMoreInMarketplace: 'En savoir plus sur Marketplace',
+  install: '{{num}} s鈥檌nstalle',
+  installFrom: 'INSTALLER 脌 PARTIR DE',
+  searchInMarketplace: 'Rechercher sur Marketplace',
+  allCategories: 'Toutes les cat茅gories',
+  endpointsEnabled: '{{num}} ensembles de points de terminaison activ茅s',
+  searchTools: 'Outils de recherche...',
+  installPlugin: 'Installer le plugin',
+  metadata: {
+    title: 'Plugins',
+  },
+  difyVersionNotCompatible: 'La version actuelle de Dify n\'est pas compatible avec ce plugin, veuillez mettre 脿 niveau vers la version minimale requise : {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/fr-FR/register.ts b/i18n/fr-FR/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/fr-FR/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/fr-FR/run-log.ts b/i18n/fr-FR/run-log.ts
new file mode 100644
index 0000000..d963efc
--- /dev/null
+++ b/i18n/fr-FR/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: 'ENTR脡E',
+  result: 'R脡SULTAT',
+  detail: 'D脡TAIL',
+  tracing: 'TRACE',
+  resultPanel: {
+    status: 'STATUT',
+    time: 'TEMPS 脡COUL脡',
+    tokens: 'TOTAL DES JETONS',
+  },
+  meta: {
+    title: 'M脡TADONN脡ES',
+    status: 'Statut',
+    version: 'Version',
+    executor: 'Ex茅cuteur',
+    startTime: 'Heure de d茅but',
+    time: 'Temps 茅coul茅',
+    tokens: 'Total des jetons',
+    steps: '脡tapes d\'ex茅cution',
+  },
+  resultEmpty: {
+    title: 'Cela ex茅cute uniquement le format de sortie JSON,',
+    tipLeft: 'veuillez aller 脿 ',
+    link: 'panneau de d茅tail',
+    tipRight: ' visualisez-le.',
+  },
+  actionLogs: 'Journaux d鈥檃ctions',
+  circularInvocationTip: 'Il y a un appel circulaire d鈥檕utils/n艙uds dans le flux de travail actuel.',
+}
+
+export default translation
diff --git a/i18n/fr-FR/share-app.ts b/i18n/fr-FR/share-app.ts
new file mode 100644
index 0000000..d0b3a50
--- /dev/null
+++ b/i18n/fr-FR/share-app.ts
@@ -0,0 +1,82 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: 'L\'application n\'est pas disponible',
+    appUnknownError: 'L\'application n\'est pas disponible',
+  },
+  chat: {
+    newChat: 'Nouveau chat',
+    pinnedTitle: '脡pingl茅',
+    unpinnedTitle: 'Discussions',
+    newChatDefaultName: 'Nouvelle conversation',
+    resetChat: 'R茅initialiser la conversation',
+    poweredBy: 'Propuls茅 par',
+    prompt: 'Prompt',
+    privatePromptConfigTitle: 'Param猫tres de conversation',
+    publicPromptConfigTitle: 'Prompt Initial',
+    configStatusDes: 'Avant de commencer, vous pouvez modifier les param猫tres de conversation',
+    configDisabled:
+      'Les param猫tres de la session pr茅c茅dente ont 茅t茅 utilis茅s pour cette session.',
+    startChat: 'Commencer le Chat',
+    privacyPolicyLeft:
+      'Veuillez lire',
+    privacyPolicyMiddle:
+      'politique de confidentialit茅',
+    privacyPolicyRight:
+      'fourni par le d茅veloppeur de l\'application.',
+    deleteConversation: {
+      title: 'Supprimer la conversation',
+      content: '脢tes-vous s没r de vouloir supprimer cette conversation ?',
+    },
+    tryToSolve: 'Essayez de r茅soudre',
+    temporarySystemIssue: 'D茅sol茅, probl猫me temporaire du syst猫me.',
+    expand: 'D茅velopper',
+    collapse: 'R茅duire',
+    chatSettingsTitle: 'Nouvelle configuration de chat',
+    viewChatSettings: 'Voir les param猫tres de chat',
+    newChatTip: 'D茅j脿 dans une nouvelle discussion',
+    chatFormTip: 'Les param猫tres de chat ne peuvent pas 锚tre modifi茅s une fois que le chat a commenc茅.',
+  },
+  generation: {
+    tabs: {
+      create: 'Ex茅cuter une fois',
+      batch: 'Ex茅cuter le lot',
+      saved: 'Enregistr茅',
+    },
+    savedNoData: {
+      title: 'Vous n\'avez pas encore enregistr茅 de r茅sultat !',
+      description: 'Commencez 脿 g茅n茅rer du contenu et retrouvez vos r茅sultats sauvegard茅s ici.',
+      startCreateContent: 'Commencez 脿 cr茅er du contenu',
+    },
+    title: 'Compl茅tion IA',
+    queryTitle: 'Contenu de la requ锚te',
+    completionResult: 'R茅sultat de la compl茅tion',
+    queryPlaceholder: 'R茅digez le contenu de votre requ锚te...',
+    run: 'Ex茅cuter',
+    copy: 'Copier',
+    resultTitle: 'Compl茅tion IA',
+    noData: 'L\'IA vous donnera ce que vous voulez ici.',
+    csvUploadTitle: 'Faites glisser et d茅posez votre fichier CSV ici, ou',
+    browse: 'parcourir',
+    csvStructureTitle: 'Le fichier CSV doit se conformer 脿 la structure suivante :',
+    downloadTemplate: 'T茅l茅chargez le mod猫le ici',
+    field: 'Champ',
+    batchFailed: {
+      info: '{{num}} ex茅cutions 茅chou茅es',
+      retry: 'R茅essayer',
+      outputPlaceholder: 'Aucun contenu de sortie',
+    },
+    errorMsg: {
+      empty: 'Veuillez entrer le contenu dans le fichier t茅l茅charg茅.',
+      fileStructNotMatch: 'Le fichier CSV t茅l茅charg茅 ne correspond pas 脿 la structure.',
+      emptyLine: 'La ligne {{rowIndex}} est vide',
+      invalidLine: 'Row {{rowIndex}}: {{varName}} value can not be empty',
+      moreThanMaxLengthLine: 'Row {{rowIndex}}: {{varName}} value can not be more than {{maxLength}} characters',
+      atLeastOne: 'Veuillez entrer au moins une ligne dans le fichier t茅l茅charg茅.',
+    },
+    executions: '{{num}} EX脡CUTIONS',
+    execution: 'EX脡CUTION',
+  },
+}
+
+export default translation
diff --git a/i18n/fr-FR/time.ts b/i18n/fr-FR/time.ts
new file mode 100644
index 0000000..e05e6dc
--- /dev/null
+++ b/i18n/fr-FR/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Sat: 'Sat',
+    Fri: 'Libre',
+    Wed: 'Mercredi',
+    Mon: 'Mon',
+    Thu: 'Jeudi',
+    Tue: 'Mardi',
+    Sun: 'Soleil',
+  },
+  months: {
+    October: 'octobre',
+    July: 'Juillet',
+    June: 'Juin',
+    December: 'D茅cembre',
+    November: 'Novembre',
+    April: 'Avril',
+    September: 'Septembre',
+    February: 'F茅vrier',
+    May: 'Mai',
+    January: 'Janvier',
+    August: 'ao没t',
+    March: 'Mars',
+  },
+  operation: {
+    now: 'Maintenant',
+    pickDate: 'Choisir une date',
+    cancel: 'Annuler',
+    ok: 'D\'accord',
+  },
+  title: {
+    pickTime: 'Choisir le temps',
+  },
+  defaultPlaceholder: 'Choisissez un moment...',
+}
+
+export default translation
diff --git a/i18n/fr-FR/tools.ts b/i18n/fr-FR/tools.ts
new file mode 100644
index 0000000..faa5193
--- /dev/null
+++ b/i18n/fr-FR/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: 'Outils',
+  createCustomTool: 'Cr茅er un Outil Personnalis茅',
+  type: {
+    all: 'Tout',
+    builtIn: 'Int茅gr茅',
+    custom: 'Personnalis茅',
+    workflow: 'Flux de travail',
+  },
+  contribute: {
+    line1: 'Je suis int茅ress茅 par',
+    line2: 'contribuer des outils 脿 Dify.',
+    viewGuide: 'Voir le guide',
+  },
+  author: 'Par',
+  auth: {
+    unauthorized: 'Pour Autoriser',
+    authorized: 'Autoris茅',
+    setup: 'Mettez en place l\'autorisation 脿 utiliser',
+    setupModalTitle: 'Configurer l\'Autorisation',
+    setupModalTitleDescription: 'Apr猫s avoir configur茅 les identifiants, tous les membres de l\'espace de travail peuvent utiliser cet outil lors de l\'orchestration des applications.',
+  },
+  includeToolNum: '{{num}} outils inclus',
+  addTool: 'Ajouter un outil',
+  createTool: {
+    title: 'Cr茅er un Outil Personnalis茅',
+    editAction: 'Configurer',
+    editTitle: 'Modifier l\'Outil Personnalis茅',
+    name: 'Nom',
+    toolNamePlaceHolder: 'Entrez le nom de l\'outil',
+    schema: 'Sch茅ma',
+    schemaPlaceHolder: 'Entrez votre sch茅ma OpenAPI ici',
+    viewSchemaSpec: 'Voir la sp茅cification OpenAPI-Swagger',
+    importFromUrl: 'Importer depuis l\'URL',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: 'Veuillez entrer une URL valide',
+    examples: 'Exemples',
+    exampleOptions: {
+      json: 'M茅t茅o(JSON)',
+      yaml: 'Animalerie (YAML)',
+      blankTemplate: 'Mod猫le Vierge',
+    },
+    availableTools: {
+      title: 'Outils Disponibles',
+      name: 'Nom',
+      description: 'Description',
+      method: 'M茅thode',
+      path: 'Chemin',
+      action: 'Actions',
+      test: 'Test',
+    },
+    authMethod: {
+      title: 'M茅thode d\'autorisation',
+      type: 'Type d\'autorisation',
+      keyTooltip: 'Cl茅 de l\'en-t锚te HTTP. Vous pouvez la laisser telle quelle avec "Autorisation" si vous n\'avez aucune id茅e de ce que c\'est, ou la d茅finir sur une valeur personnalis茅e.',
+      types: {
+        none: 'Aucun',
+        api_key: 'Cl茅 API',
+        apiKeyPlaceholder: 'Nom de l\'en-t锚te HTTP pour la cl茅 API',
+        apiValuePlaceholder: 'Entrez la cl茅 API',
+      },
+      key: 'Cl茅',
+      value: 'Valeur',
+    },
+    authHeaderPrefix: {
+      title: 'Type d\'Authentification',
+      types: {
+        basic: 'Basique',
+        bearer: 'Porteur',
+        custom: 'Personnalis茅',
+      },
+    },
+    privacyPolicy: 'Politique de confidentialit茅',
+    privacyPolicyPlaceholder: 'Veuillez entrer la politique de confidentialit茅',
+    customDisclaimer: 'Clause de non-responsabilit茅 personnalis茅e',
+    customDisclaimerPlaceholder: 'Entrez le texte de la clause de non-responsabilit茅 personnalis茅e',
+    deleteToolConfirmTitle: 'Supprimer cet outil ?',
+    deleteToolConfirmContent: 'La suppression de l\'outil est irr茅versible. Les utilisateurs ne pourront plus acc茅der 脿 votre outil.',
+    toolInput: {
+      required: 'Obligatoire',
+      name: 'Nom',
+      label: '脡tiquettes',
+      title: 'Entr茅e d鈥檕util',
+      methodSetting: 'R茅glage',
+      labelPlaceholder: 'Choisir des balises(facultatif)',
+      descriptionPlaceholder: 'Description de la signification du param猫tre',
+      method: 'M茅thode',
+      methodParameter: 'Param猫tre',
+      methodSettingTip: 'L鈥檜tilisateur renseigne la configuration de l鈥檕util',
+      methodParameterTip: 'Remplissages LLM pendant l鈥檌nf茅rence',
+      description: 'Description',
+    },
+    nameForToolCallTip: 'Ne prend en charge que les chiffres, les lettres et les traits de soulignement.',
+    confirmTitle: 'Confirmer pour enregistrer ?',
+    nameForToolCall: 'Nom de l鈥檃ppel de l鈥檕util',
+    confirmTip: 'Les applications utilisant cet outil seront affect茅es',
+    description: 'Description',
+    nameForToolCallPlaceHolder: 'Utilis茅 pour la reconnaissance automatique, tels que getCurrentWeather, list_pets',
+    descriptionPlaceholder: 'Br猫ve description de l鈥檕bjectif de l鈥檕util, par exemple, obtenir la temp茅rature d鈥檜n endroit sp茅cifique.',
+  },
+  test: {
+    title: 'Test',
+    parametersValue: 'Param猫tres & Valeur',
+    parameters: 'Param猫tres',
+    value: 'Valeur',
+    testResult: 'R茅sultats du Test',
+    testResultPlaceholder: 'Le r茅sultat du test s\'affichera ici',
+  },
+  thought: {
+    using: 'Utilisation',
+    used: 'Utilis茅',
+    requestTitle: 'Demande 脿',
+    responseTitle: 'R茅ponse de',
+  },
+  setBuiltInTools: {
+    info: 'Infos',
+    setting: 'Param猫tres',
+    toolDescription: 'Description de l\'outil',
+    parameters: 'param猫tres',
+    string: 'cha卯ne',
+    number: 'nombre',
+    required: 'Requis',
+    infoAndSetting: 'Infos & Param猫tres',
+    file: 'lime',
+  },
+  noCustomTool: {
+    title: 'Pas d\'outils personnalis茅s !',
+    content: 'Ajoutez et g茅rez vos outils personnalis茅s ici pour construire des applications IA.',
+    createTool: 'Cr茅er un outil',
+  },
+  noSearchRes: {
+    title: 'D茅sol茅, aucun r茅sultat !',
+    content: 'Nous n\'avons trouv茅 aucun outil correspondant 脿 votre recherche.',
+    reset: 'R茅initialiser la recherche',
+  },
+  builtInPromptTitle: 'Invite',
+  toolRemoved: 'Outil supprim茅',
+  notAuthorized: 'Outil non autoris茅',
+  howToGet: 'Comment obtenir',
+  addToolModal: {
+    type: 'type',
+    emptyTitle: 'Aucun outil de flux de travail disponible',
+    added: 'suppl茅mentaire',
+    add: 'ajouter',
+    category: 'cat茅gorie',
+    manageInTools: 'G茅rer dans Outils',
+    emptyTip: 'Allez dans 芦聽Flux de travail -> Publier en tant qu鈥檕util聽禄',
+    emptyTitleCustom: 'Aucun outil personnalis茅 disponible',
+    emptyTipCustom: 'Cr茅er un outil personnalis茅',
+  },
+  openInStudio: 'Ouvrir dans Studio',
+  customToolTip: 'En savoir plus sur les outils personnalis茅s Dify',
+  toolNameUsageTip: 'Nom de l鈥檃ppel de l鈥檕util pour le raisonnement et l鈥檌nvite de l鈥檃gent',
+  copyToolName: 'Copier le nom',
+  noTools: 'Aucun outil trouv茅',
+}
+
+export default translation
diff --git a/i18n/fr-FR/workflow.ts b/i18n/fr-FR/workflow.ts
new file mode 100644
index 0000000..f6ae2a9
--- /dev/null
+++ b/i18n/fr-FR/workflow.ts
@@ -0,0 +1,920 @@
+const translation = {
+  common: {
+    undo: 'D茅faire',
+    redo: 'R茅ex茅cuter',
+    editing: '脡dition',
+    autoSaved: 'Sauvegard茅 automatiquement',
+    unpublished: 'Non publi茅',
+    published: 'Publi茅',
+    publish: 'Publier',
+    update: 'Mettre 脿 jour',
+    run: 'Ex茅cuter',
+    running: 'En cours d\'ex茅cution',
+    inRunMode: 'En mode ex茅cution',
+    inPreview: 'En aper莽u',
+    inPreviewMode: 'En mode aper莽u',
+    preview: 'Aper莽u',
+    viewRunHistory: 'Voir l\'historique des ex茅cutions',
+    runHistory: 'Historique des ex茅cutions',
+    goBackToEdit: 'Retour 脿 l\'茅diteur',
+    conversationLog: 'Journal de conversation',
+    features: 'Fonctionnalit茅s',
+    debugAndPreview: 'Aper莽u',
+    restart: 'Red茅marrer',
+    currentDraft: 'Brouillon actuel',
+    currentDraftUnpublished: 'Brouillon actuel non publi茅',
+    latestPublished: 'Derni猫re publication',
+    publishedAt: 'Publi茅 le',
+    restore: 'Restaurer',
+    runApp: 'Ex茅cuter l\'application',
+    batchRunApp: 'Ex茅cuter l\'application en lot',
+    accessAPIReference: 'Acc茅der 脿 la r茅f茅rence API',
+    embedIntoSite: 'Int茅grer au site',
+    addTitle: 'Ajouter un titre...',
+    addDescription: 'Ajouter une description...',
+    noVar: 'Pas de variable',
+    searchVar: 'Rechercher une variable',
+    variableNamePlaceholder: 'Nom de la variable',
+    setVarValuePlaceholder: 'D茅finir la valeur de la variable',
+    needConnectTip: 'Cette 茅tape n\'est connect茅e 脿 rien',
+    maxTreeDepth: 'Limite maximale de {{depth}} n艙uds par branche',
+    needEndNode: 'Le bloc de fin doit 锚tre ajout茅',
+    needAnswerNode: 'Le bloc de r茅ponse doit 锚tre ajout茅',
+    workflowProcess: 'Processus de flux de travail',
+    notRunning: 'Pas encore en cours d\'ex茅cution',
+    previewPlaceholder: 'Entrez le contenu dans la bo卯te ci-dessous pour commencer 脿 d茅boguer le Chatbot',
+    effectVarConfirm: {
+      title: 'Supprimer la variable',
+      content: 'La variable est utilis茅e dans d\'autres n艙uds. Voulez-vous toujours la supprimer?',
+    },
+    insertVarTip: 'Appuyez sur la touche \'/\' pour ins茅rer rapidement',
+    processData: 'Traiter les donn茅es',
+    input: 'Entr茅e',
+    output: 'Sortie',
+    jinjaEditorPlaceholder: 'Tapez \'/\' ou \'{\' pour ins茅rer une variable',
+    viewOnly: 'Affichage seulement',
+    showRunHistory: 'Afficher l\'historique des ex茅cutions',
+    enableJinja: 'Activer le support des templates Jinja',
+    learnMore: 'En savoir plus',
+    copy: 'Copier',
+    duplicate: 'Dupliquer',
+    addBlock: 'Ajouter un bloc',
+    pasteHere: 'Coller ici',
+    pointerMode: 'Mode pointeur',
+    handMode: 'Mode main',
+    model: 'Mod猫le',
+    workflowAsTool: 'Flux de travail en tant qu\'outil',
+    configureRequired: 'Configuration requise',
+    configure: 'Configurer',
+    manageInTools: 'G茅rer dans les outils',
+    workflowAsToolTip: 'Reconfiguration de l\'outil requise apr猫s la mise 脿 jour du flux de travail.',
+    viewDetailInTracingPanel: 'Voir les d茅tails',
+    syncingData: 'Synchroniser des donn茅es en quelques secondes.',
+    importDSL: 'Importe DSL',
+    importDSLTip: 'Le projet actuel sera 茅cras茅. Exporter le flux de travail en tant que sauvegarde avant d\'importer.',
+    backupCurrentDraft: 'Sauvegarder le projet actuel',
+    chooseDSL: 'Choisir le fichier DSL(yml)',
+    overwriteAndImport: '脡craser et importer',
+    importFailure: 'Echec de l\'importation',
+    importSuccess: 'Import avec succ猫s',
+    parallelTip: {
+      click: {
+        title: 'Cliquer',
+        desc: '脿 ajouter',
+      },
+      drag: {
+        title: 'Tra卯ner',
+        desc: 'pour se connecter',
+      },
+      limit: 'Le parall茅lisme est limit茅 aux branches {{num}}.',
+      depthLimit: 'Limite de couches d鈥檌mbrication parall猫le de {{num}} couches',
+    },
+    parallelRun: 'Ex茅cution parall猫le',
+    disconnect: 'D茅connecter',
+    jumpToNode: 'Aller 脿 ce n艙ud',
+    addParallelNode: 'Ajouter un n艙ud parall猫le',
+    parallel: 'PARALL脠LE',
+    branch: 'BRANCHE',
+    featuresDocLink: 'Pour en savoir plus',
+    ImageUploadLegacyTip: 'Vous pouvez d茅sormais cr茅er des variables de type de fichier dans le formulaire de d茅marrage. 脌 l鈥檃venir, nous ne prendrons plus en charge la fonctionnalit茅 de t茅l茅chargement d鈥檌mages.',
+    fileUploadTip: 'Les fonctionnalit茅s de t茅l茅chargement d鈥檌mages ont 茅t茅 mises 脿 niveau vers le t茅l茅chargement de fichiers.',
+    featuresDescription: 'Am茅liorer l鈥檈xp茅rience utilisateur de l鈥檃pplication web',
+    importWarning: 'Prudence',
+    importWarningDetails: 'La diff茅rence de version DSL peut affecter certaines fonctionnalit茅s',
+    openInExplore: 'Ouvrir dans Explorer',
+    onFailure: 'Sur l鈥櫭ヽhec',
+    addFailureBranch: 'Ajouter une branche d鈥櫭ヽhec',
+    loadMore: 'Charger plus de flux de travail',
+    noHistory: 'Pas d鈥檋istoire',
+    exportPNG: 'Exporter en PNG',
+    exitVersions: 'Versions de sortie',
+    exportSVG: 'Exporter en SVG',
+    publishUpdate: 'Publier une mise 脿 jour',
+    noExist: 'Aucune variable de ce type',
+    versionHistory: 'Historique des versions',
+    referenceVar: 'Variable de r茅f茅rence',
+    exportImage: 'Exporter l\'image',
+    exportJPEG: 'Exporter en JPEG',
+  },
+  env: {
+    envPanelTitle: 'Variables d\'Environnement',
+    envDescription: 'Les variables d\'environnement peuvent 锚tre utilis茅es pour stocker des informations priv茅es et des informations d\'identification. Elles sont en lecture seule et peuvent 锚tre s茅par茅es du fichier DSL lors de l\'exportation.',
+    envPanelButton: 'Ajouter Variable',
+    modal: {
+      title: 'Ajouter Variables d\'Environnement',
+      editTitle: 'Editer titre',
+      type: 'Type',
+      name: 'Nom',
+      namePlaceholder: 'Nom de l\'env',
+      value: 'valeur',
+      valuePlaceholder: 'Valeur de l\'env',
+      secretTip: 'Utilis茅 pour d茅finir des informations ou des donn茅es sensibles, avec des param猫tres DSL configur茅s pour la pr茅vention des fuites.',
+    },
+    export: {
+      title: 'Exporter des variables d\'environnement secr猫tes?',
+      checkbox: 'Exporter les valeurs secr猫tes',
+      ignore: 'Exporter DSL',
+      export: 'Exporter les DSL avec des valeurs secr猫tes',
+    },
+  },
+  chatVariable: {
+    panelTitle: 'Variables de Conversation',
+    panelDescription: 'Les Variables de Conversation sont utilis茅es pour stocker des informations interactives dont le LLM a besoin de se souvenir, y compris l\'historique des conversations, les fichiers t茅l茅charg茅s et les pr茅f茅rences de l\'utilisateur. Elles sont en lecture-茅criture.',
+    docLink: 'Consultez notre documentation pour en savoir plus.',
+    button: 'Ajouter une Variable',
+    modal: {
+      title: 'Ajouter une Variable de Conversation',
+      editTitle: 'Modifier une Variable de Conversation',
+      name: 'Nom',
+      namePlaceholder: 'Nom de la variable',
+      type: 'Type',
+      value: 'Valeur par D茅faut',
+      valuePlaceholder: 'Valeur par d茅faut, laisser vide pour ne pas d茅finir',
+      description: 'Description',
+      descriptionPlaceholder: 'D茅crivez la variable',
+      editInJSON: '脡diter en JSON',
+      oneByOne: 'Ajouter un par un',
+      editInForm: '脡diter dans le Formulaire',
+      arrayValue: 'Valeur',
+      addArrayValue: 'Ajouter une Valeur',
+      objectKey: 'Cl茅',
+      objectType: 'Type',
+      objectValue: 'Valeur par D茅faut',
+    },
+    storedContent: 'Contenu stock茅',
+    updatedAt: 'Mis 脿 jour le ',
+  },
+  changeHistory: {
+    title: 'Historique des modifications',
+    placeholder: 'Vous n\'avez encore rien modifi茅',
+    clearHistory: 'Effacer l\'historique',
+    hint: 'Conseil',
+    hintText: 'Vos actions d\'茅dition sont suivies dans un historique des modifications, qui est stock茅 sur votre appareil pour la dur茅e de cette session. Cet historique sera effac茅 lorsque vous quitterez l\'茅diteur.',
+    stepBackward_one: '{{count}} pas en arri猫re',
+    stepBackward_other: '{{count}} pas en arri猫re',
+    stepForward_one: '{{count}} pas en avant',
+    stepForward_other: '{{count}} pas en avant',
+    sessionStart: 'D茅but de la session',
+    currentState: '脡tat actuel',
+    nodeTitleChange: 'Titre du bloc modifi茅',
+    nodeDescriptionChange: 'Description du bloc modifi茅e',
+    nodeDragStop: 'Bloc d茅plac茅',
+    nodeChange: 'Bloc modifi茅',
+    nodeConnect: 'Bloc connect茅',
+    nodePaste: 'Bloc coll茅',
+    nodeDelete: 'Bloc supprim茅',
+    nodeAdd: 'Bloc ajout茅',
+    nodeResize: 'Bloc redimensionn茅',
+    noteAdd: 'Note ajout茅e',
+    noteChange: 'Note modifi茅e',
+    noteDelete: 'Note supprim茅e',
+    edgeDelete: 'Bloc d茅connect茅',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} est requis',
+    authRequired: 'Autorisation requise',
+    invalidJson: '{{field}} est un JSON invalide',
+    fields: {
+      variable: 'Nom de la variable',
+      variableValue: 'Valeur de la variable',
+      code: 'Code',
+      model: 'Mod猫le',
+      rerankModel: 'Mod猫le de rerank',
+      visionVariable: 'Vision Variable',
+    },
+    invalidVariable: 'Variable invalide',
+    rerankModelRequired: 'Avant d鈥檃ctiver le mod猫le de reclassement, veuillez confirmer que le mod猫le a 茅t茅 correctement configur茅 dans les param猫tres.',
+    noValidTool: '{{field}} aucun outil valide s茅lectionn茅',
+    toolParameterRequired: '{{field}} : le param猫tre [{{param}}] est obligatoire',
+  },
+  singleRun: {
+    testRun: 'Ex茅cution de test',
+    startRun: 'D茅marrer l\'ex茅cution',
+    running: 'En cours d\'ex茅cution',
+    testRunIteration: 'It茅ration de l\'ex茅cution de test',
+    back: 'Retour',
+    iteration: 'It茅ration',
+    loop: 'Boucle',
+  },
+  tabs: {
+    'searchBlock': 'Rechercher un bloc',
+    'blocks': 'Blocs',
+    'tools': 'Outils',
+    'allTool': 'Tous',
+    'builtInTool': 'Int茅gr茅',
+    'customTool': 'Personnalis茅',
+    'workflowTool': 'Flux de travail',
+    'question-understand': 'Compr茅hension des questions',
+    'logic': 'Logique',
+    'transform': 'Transformer',
+    'utilities': 'Utilitaires',
+    'noResult': 'Aucun r茅sultat trouv茅',
+    'searchTool': 'Outil de recherche',
+    'plugin': 'Plugin',
+    'agent': 'Strat茅gie d鈥檃gent',
+  },
+  blocks: {
+    'start': 'D茅but',
+    'end': 'Fin',
+    'answer': 'R茅ponse',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'R茅cup茅ration de connaissances',
+    'question-classifier': 'Classificateur de questions',
+    'if-else': 'SI/SINON',
+    'code': 'Code',
+    'template-transform': 'Mod猫le',
+    'http-request': 'Requ锚te HTTP',
+    'variable-assigner': 'Assigneur de variables',
+    'variable-aggregator': 'Agr茅gateur de variables',
+    'assigner': 'Assignateur de Variables',
+    'iteration-start': 'D茅but d\'it茅ration',
+    'iteration': 'It茅ration',
+    'parameter-extractor': 'Extracteur de param猫tres',
+    'list-operator': 'Op茅rateur de liste',
+    'document-extractor': 'Extracteur de documents',
+    'agent': 'Agent',
+    'loop-end': 'Sortir de la boucle',
+    'loop': 'Boucle',
+    'loop-start': 'D茅but de boucle',
+  },
+  blocksAbout: {
+    'start': 'D茅finir les param猫tres initiaux pour lancer un flux de travail',
+    'end': 'D茅finir la fin et le type de r茅sultat d\'un flux de travail',
+    'answer': 'D茅finir le contenu de la r茅ponse d\'une conversation',
+    'llm': 'Inviter de grands mod猫les de langage pour r茅pondre aux questions ou traiter le langage naturel',
+    'knowledge-retrieval': 'Permet de consulter le contenu textuel li茅 aux questions des utilisateurs 脿 partir de la base de connaissances',
+    'question-classifier': 'D茅finir les conditions de classification des questions des utilisateurs, LLM peut d茅finir comment la conversation progresse en fonction de la description de la classification',
+    'if-else': 'Permet de diviser le flux de travail en deux branches bas茅es sur des conditions if/else',
+    'code': 'Ex茅cuter un morceau de code Python ou NodeJS pour impl茅menter une logique personnalis茅e',
+    'template-transform': 'Convertir les donn茅es en cha卯ne en utilisant la syntaxe du template Jinja',
+    'http-request': 'Permettre l\'envoi de requ锚tes serveur via le protocole HTTP',
+    'variable-assigner': 'Agr茅gation de variables de plusieurs branches en une seule variable pour la configuration unifi茅e des n艙uds en aval.',
+    'assigner': 'Le n艙ud d\'assignation de variables est utilis茅 pour attribuer des valeurs aux variables modifiables (comme les variables de conversation).',
+    'variable-aggregator': 'Agr茅gation de variables de plusieurs branches en une seule variable pour la configuration unifi茅e des n艙uds en aval.',
+    'iteration': 'Effectuer plusieurs 茅tapes sur un objet de liste jusqu\'脿 ce que tous les r茅sultats soient produits.',
+    'parameter-extractor': 'Utiliser LLM pour extraire des param猫tres structur茅s du langage naturel pour les invocations d\'outils ou les requ锚tes HTTP.',
+    'list-operator': 'Utilis茅 pour filtrer ou trier le contenu d鈥檜n tableau.',
+    'document-extractor': 'Utilis茅 pour analyser les documents t茅l茅charg茅s en contenu texte facilement compr茅hensible par LLM.',
+    'agent': 'Appel de grands mod猫les de langage pour r茅pondre 脿 des questions ou traiter le langage naturel',
+    'loop': 'Ex茅cutez une boucle de logique jusqu\'脿 ce que la condition de terminaison soit remplie ou que le nombre maximum de boucles soit atteint.',
+    'loop-end': '脡quivalent 脿 "break". Ce n艙ud n\'a pas d\'茅l茅ments de configuration. Lorsque le corps de la boucle atteint ce n艙ud, la boucle se termine.',
+  },
+  operator: {
+    zoomIn: 'Zoomer',
+    zoomOut: 'D茅zoomer',
+    zoomTo50: 'Zoomer 脿 50%',
+    zoomTo100: 'Zoomer 脿 100%',
+    zoomToFit: 'Zoomer pour ajuster',
+  },
+  panel: {
+    userInputField: 'Champ de saisie de l\'utilisateur',
+    changeBlock: 'Changer de bloc',
+    helpLink: 'Lien d\'aide',
+    about: '脌 propos',
+    createdBy: 'Cr茅茅 par',
+    nextStep: '脡tape suivante',
+    addNextStep: 'Ajouter le prochain bloc dans ce flux de travail',
+    selectNextStep: 'S茅lectionner le prochain bloc',
+    runThisStep: 'Ex茅cuter cette 茅tape',
+    checklist: 'Liste de contr么le',
+    checklistTip: 'Assurez-vous que tous les probl猫mes sont r茅solus avant de publier',
+    checklistResolved: 'Tous les probl猫mes ont 茅t茅 r茅solus',
+    organizeBlocks: 'Organiser les blocs',
+    change: 'Modifier',
+    optional: '(facultatif)',
+  },
+  nodes: {
+    common: {
+      outputVars: 'Variables de sortie',
+      insertVarTip: 'Ins茅rer une variable',
+      memory: {
+        memory: 'M茅moire',
+        memoryTip: 'Param猫tres de m茅moire de conversation',
+        windowSize: 'Taille de la fen锚tre',
+        conversationRoleName: 'Nom du r么le de conversation',
+        user: 'Pr茅fixe utilisateur',
+        assistant: 'Pr茅fixe assistant',
+      },
+      memories: {
+        title: 'M茅moires',
+        tip: 'M茅moire de conversation',
+        builtIn: 'Int茅gr茅',
+      },
+      errorHandle: {
+        none: {
+          title: 'Aucun',
+          desc: 'Le n艙ud cessera de s鈥檈x茅cuter si une exception se produit et n鈥檈st pas g茅r茅e',
+        },
+        defaultValue: {
+          title: 'Valeur par d茅faut',
+          desc: 'Lorsqu鈥檜ne erreur se produit, sp茅cifiez un contenu de sortie statique.',
+          tip: 'En cas d鈥檈rreur, le retour est inf茅rieur 脿 la valeur.',
+          inLog: 'Exception de n艙ud, sortie en fonction des valeurs par d茅faut.',
+          output: 'Valeur par d茅faut de sortie',
+        },
+        failBranch: {
+          desc: 'Lorsqu鈥檜ne erreur se produit, il ex茅cute la branche d鈥檈xception',
+          customize: 'Acc茅dez au canevas pour personnaliser la logique de branche d鈥櫭ヽhec.',
+          customizeTip: 'Lorsque la branche fail est activ茅e, les exceptions lev茅es par les n艙uds ne mettent pas fin au processus. Au lieu de cela, il ex茅cutera automatiquement la branche d鈥櫭ヽhec pr茅d茅finie, ce qui vous permettra de fournir de mani猫re flexible des messages d鈥檈rreur, des rapports, des correctifs ou des actions d鈥檌gnorance.',
+          inLog: 'Exception de n艙ud, ex茅cutera automatiquement la branche d鈥櫭ヽhec. La sortie du n艙ud renverra un type d鈥檈rreur et un message d鈥檈rreur et les transmettra en aval.',
+          title: 'Branche d鈥櫭ヽhec',
+        },
+        partialSucceeded: {
+          tip: 'Il y a des n艙uds {{num}} dans le processus qui fonctionnent anormalement, veuillez aller dans le tra莽age pour v茅rifier les journaux.',
+        },
+        title: 'Gestion des erreurs',
+        tip: 'Strat茅gie de gestion des exceptions, d茅clench茅e lorsqu鈥檜n n艙ud rencontre une exception.',
+      },
+      retry: {
+        retry: 'R茅essayer',
+        retryOnFailure: 'R茅essai en cas d鈥櫭ヽhec',
+        maxRetries: 'Nombre maximal de tentatives',
+        retryInterval: 'intervalle de nouvelle tentative',
+        retryTimes: 'R茅essayez {{times}} fois en cas d鈥櫭ヽhec',
+        retrying: 'R茅essayer...',
+        retrySuccessful: 'R茅essai r茅ussi',
+        retryFailed: '脡chec de la nouvelle tentative',
+        retryFailedTimes: '{{times}} les tentatives ont 茅chou茅',
+        times: 'fois',
+        ms: 'ms',
+        retries: '{{num}} Tentatives',
+      },
+    },
+    start: {
+      required: 'requis',
+      inputField: 'Champ de saisie',
+      builtInVar: 'Variables int茅gr茅es',
+      outputVars: {
+        query: 'Saisie utilisateur',
+        memories: {
+          des: 'Historique de conversation',
+          type: 'type de message',
+          content: 'contenu du message',
+        },
+        files: 'Liste de fichiers',
+      },
+      noVarTip: 'D茅finir les entr茅es qui peuvent 锚tre utilis茅es dans le flux de travail',
+    },
+    end: {
+      outputs: 'Sorties',
+      output: {
+        type: 'type de sortie',
+        variable: 'variable de sortie',
+      },
+      type: {
+        'none': 'Aucun',
+        'plain-text': 'Texte brut',
+        'structured': 'Structur茅',
+      },
+    },
+    answer: {
+      answer: 'R茅ponse',
+      outputVars: 'Variables de sortie',
+    },
+    llm: {
+      model: 'mod猫le',
+      variables: 'variables',
+      context: 'contexte',
+      contextTooltip: 'Vous pouvez importer des connaissances en tant que contexte',
+      notSetContextInPromptTip: 'Pour activer la fonctionnalit茅 de contexte, remplissez la variable de contexte dans le PROMPT.',
+      prompt: 'invite',
+      roleDescription: {
+        system: 'Donner des instructions de haut niveau pour la conversation',
+        user: 'Fournir des instructions, des questions ou toute entr茅e textuelle au mod猫le',
+        assistant: 'Les r茅ponses du mod猫le bas茅es sur les messages des utilisateurs',
+      },
+      addMessage: 'Ajouter un message',
+      vision: 'vision',
+      files: 'Fichiers',
+      resolution: {
+        name: 'R茅solution',
+        high: 'Haute',
+        low: 'Basse',
+      },
+      outputVars: {
+        output: 'Contenu g茅n茅r茅',
+        usage: 'Informations sur l\'utilisation du mod猫le',
+      },
+      singleRun: {
+        variable: 'Variable',
+      },
+      sysQueryInUser: 'sys.query dans le message utilisateur est requis',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: 'Veuillez terminer la modification du champ actuel avant d\'enregistrer le sch茅ma.',
+        },
+        apply: 'Appliquer',
+        addField: 'Ajouter un champ',
+        generationTip: 'Vous pouvez utiliser un langage naturel pour cr茅er rapidement un sch茅ma JSON.',
+        promptPlaceholder: 'D茅crivez votre sch茅ma JSON...',
+        descriptionPlaceholder: 'Ajouter une description',
+        instruction: 'Instruction',
+        resetDefaults: 'R茅initialiser',
+        generatedResult: 'R茅sultat g茅n茅r茅',
+        fieldNamePlaceholder: 'Nom du champ',
+        addChildField: 'Ajouter un champ enfant',
+        back: 'Retour',
+        showAdvancedOptions: 'Afficher les options avanc茅es',
+        title: 'Sch茅ma de sortie structur茅',
+        generating: 'G茅n茅ration de sch茅ma JSON...',
+        stringValidations: 'Validations de cha卯ne',
+        import: 'Importer depuis JSON',
+        promptTooltip: 'Convertissez la description textuelle en une structure de sch茅ma JSON standardis茅.',
+        generate: 'G茅n茅rer',
+        doc: 'En savoir plus sur la sortie structur茅e',
+        regenerate: 'R茅g茅n茅rer',
+        required: 'n茅cessaire',
+        generateJsonSchema: 'G茅n茅rer un sch茅ma JSON',
+        resultTip: 'Voici le r茅sultat g茅n茅r茅. Si vous n\'锚tes pas satisfait, vous pouvez revenir en arri猫re et modifier votre demande.',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'Variable de requ锚te',
+      knowledge: 'Connaissances',
+      outputVars: {
+        output: 'Donn茅es segment茅es r茅cup茅r茅es',
+        content: 'Contenu segment茅',
+        title: 'Titre segment茅',
+        icon: 'Ic么ne segment茅e',
+        url: 'URL segment茅e',
+        metadata: 'Autres m茅tadonn茅es',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            subTitle: 'Ne pas activer le filtrage des m茅tadonn茅es',
+          },
+          automatic: {
+            subTitle: 'G茅n茅rer automatiquement des conditions de filtrage des m茅tadonn茅es en fonction de la requ锚te de l\'utilisateur',
+            title: 'Automatique',
+            desc: 'G茅n茅rer automatiquement des conditions de filtrage de m茅tadonn茅es en fonction de la variable de requ锚te.',
+          },
+          manual: {
+            subTitle: 'Ajouter manuellement des conditions de filtrage des m茅tadonn茅es',
+            title: 'Manuel',
+          },
+        },
+        panel: {
+          placeholder: 'Entrez la valeur',
+          add: 'Ajouter une condition',
+          search: 'Rechercher des m茅tadonn茅es',
+          conditions: 'Conditions',
+          datePlaceholder: 'Choisissez un moment...',
+          select: 'S茅lectionner une variable...',
+          title: 'Conditions de filtrage des m茅tadonn茅es',
+        },
+        title: 'Filtrage des m茅tadonn茅es',
+      },
+    },
+    http: {
+      inputVars: 'Variables de saisie',
+      api: 'API',
+      apiPlaceholder: 'Entrez l\'URL, tapez 鈥�/鈥� pour ins茅rer une variable',
+      notStartWithHttp: 'L\'API doit commencer par http:// ou https://',
+      key: 'Cl茅',
+      value: 'Valeur',
+      bulkEdit: '脡dition en masse',
+      keyValueEdit: '脡dition cl茅-valeur',
+      headers: 'En-t锚tes',
+      params: 'Param猫tres',
+      body: 'Corps',
+      outputVars: {
+        body: 'Contenu de la r茅ponse',
+        statusCode: 'Code de statut de la r茅ponse',
+        headers: 'Liste des en-t锚tes de r茅ponse JSON',
+        files: 'Liste des fichiers',
+      },
+      authorization: {
+        'authorization': 'Autorisation',
+        'authorizationType': 'Type d\'autorisation',
+        'no-auth': 'Aucune',
+        'api-key': 'Cl茅 API',
+        'auth-type': 'Type d\'authentification',
+        'basic': 'De base',
+        'bearer': 'Bearer',
+        'custom': 'Personnalis茅',
+        'api-key-title': 'Cl茅 API',
+        'header': 'En-t锚te',
+      },
+      insertVarPlaceholder: 'tapez \'/\' pour ins茅rer une variable',
+      timeout: {
+        title: 'D茅lai d\'expiration',
+        connectLabel: 'D茅lai de connexion',
+        connectPlaceholder: 'Entrez le d茅lai de connexion en secondes',
+        readLabel: 'D茅lai de lecture',
+        readPlaceholder: 'Entrez le d茅lai de lecture en secondes',
+        writeLabel: 'D茅lai d\'茅criture',
+        writePlaceholder: 'Entrez le d茅lai d\'茅criture en secondes',
+      },
+      binaryFileVariable: 'Variable de fichier binaire',
+      type: 'Type',
+      extractListPlaceholder: 'Entrez l鈥檌ndex de l鈥櫭﹍茅ment de liste, tapez \'/\' ins茅rer la variable',
+      curl: {
+        placeholder: 'Collez la cha卯ne cURL ici',
+        title: 'Importer 脿 partir de cURL',
+      },
+    },
+    code: {
+      inputVars: 'Variables de saisie',
+      outputVars: 'Variables de sortie',
+      advancedDependencies: 'D茅pendances avanc茅es',
+      advancedDependenciesTip: 'Ajoutez quelques d茅pendances pr茅charg茅es qui prennent plus de temps 脿 consommer ou ne sont pas par d茅faut ici',
+      searchDependencies: 'Rechercher des d茅pendances',
+    },
+    templateTransform: {
+      inputVars: 'Variables de saisie',
+      code: 'Code',
+      codeSupportTip: 'Prend en charge uniquement Jinja2',
+      outputVars: {
+        output: 'Contenu transform茅',
+      },
+    },
+    ifElse: {
+      if: 'Si',
+      else: 'Sinon',
+      elseDescription: 'Utilis茅 pour d茅finir la logique 脿 ex茅cuter lorsque la condition if n\'est pas remplie.',
+      and: 'et',
+      or: 'ou',
+      operator: 'Op茅rateur',
+      notSetVariable: 'Veuillez d\'abord d茅finir la variable',
+      comparisonOperator: {
+        'contains': 'contient',
+        'not contains': 'ne contient pas',
+        'start with': 'commence par',
+        'end with': 'se termine par',
+        'is': 'est',
+        'is not': 'n\'est pas',
+        'empty': 'est vide',
+        'not empty': 'n\'est pas vide',
+        'null': 'est nul',
+        'not null': 'n\'est pas nul',
+        'regex match': 'correspondance regex',
+        'in': 'dans',
+        'not in': 'pas dans',
+        'exists': 'Existe',
+        'all of': 'l鈥檈nsemble des',
+        'not exists': 'n鈥檈xiste pas',
+        'before': 'avant',
+        'after': 'apr猫s',
+      },
+      enterValue: 'Entrez la valeur',
+      addCondition: 'Ajouter une condition',
+      conditionNotSetup: 'Condition NON configur茅e',
+      selectVariable: 'S茅lectionner une variable...',
+      optionName: {
+        video: 'Vid茅o',
+        image: 'Image',
+        audio: 'Audio',
+        doc: 'M茅decin',
+        localUpload: 'T茅l茅chargement local',
+        url: 'URL',
+      },
+      select: 'Choisir',
+      addSubVariable: 'Sous-variable',
+      condition: 'Condition',
+    },
+    variableAssigner: {
+      title: 'Attribuer des variables',
+      outputType: 'Type de sortie',
+      varNotSet: 'Variable non d茅finie',
+      noVarTip: 'Ajoutez les variables 脿 attribuer',
+      type: {
+        string: 'Cha卯ne',
+        number: 'Nombre',
+        object: 'Objet',
+        array: 'Tableau',
+      },
+      aggregationGroup: 'Groupe d\'agr茅gation',
+      aggregationGroupTip: 'L\'activation de cette fonctionnalit茅 permet 脿 l\'agr茅gateur de variables d\'agr茅ger plusieurs ensembles de variables.',
+      addGroup: 'Ajouter un groupe',
+      outputVars: {
+        varDescribe: 'Sortie {{groupName}}',
+      },
+      setAssignVariable: 'D茅finir la variable 脿 attribuer',
+    },
+    assigner: {
+      'assignedVariable': 'Variable Assign茅e',
+      'writeMode': 'Mode d\'脡criture',
+      'writeModeTip': 'Lorsque la VARIABLE ASSIGN脡E est un tableau, le mode d\'ajout ajoute 脿 la fin.',
+      'over-write': '脡craser',
+      'append': 'Ajouter',
+      'plus': 'Plus',
+      'clear': 'Effacer',
+      'setVariable': 'D茅finir Variable',
+      'variable': 'Variable',
+      'operations': {
+        'clear': 'Clair',
+        '*=': '*=',
+        '-=': '-=',
+        'extend': '脡tendre',
+        '+=': '+=',
+        'over-write': '脡craser',
+        'set': 'Poser',
+        'append': 'Ajouter',
+        'title': 'Op茅ration',
+        '/=': '/=',
+        'overwrite': '脡craser',
+        'remove-last': 'Supprimer le dernier',
+        'remove-first': 'Retirer le premier',
+      },
+      'assignedVarsDescription': 'Les variables affect茅es doivent 锚tre accessibles en 茅criture, telles que des variables de conversation.',
+      'noVarTip': 'Cliquez sur le bouton 芦聽+聽禄 pour ajouter des variables',
+      'variables': 'Variables',
+      'setParameter': 'D茅finir le param猫tre...',
+      'noAssignedVars': 'Aucune variable affect茅e disponible',
+      'varNotSet': 'Variable NON d茅finie',
+      'selectAssignedVariable': 'S茅lectionner la variable affect茅e...',
+    },
+    tool: {
+      toAuthorize: 'Autoriser',
+      inputVars: 'Variables de saisie',
+      outputVars: {
+        text: 'contenu g茅n茅r茅 par l\'outil',
+        files: {
+          title: 'fichiers g茅n茅r茅s par l\'outil',
+          type: 'Type de support. Actuellement ne prend en charge que l\'image',
+          transfer_method: 'M茅thode de transfert. La valeur est remote_url ou local_file',
+          url: 'URL de l\'image',
+          upload_file_id: 'ID du fichier t茅l茅charg茅',
+        },
+        json: 'JSON g茅n茅r茅 par un outil',
+      },
+    },
+    questionClassifiers: {
+      model: 'mod猫le',
+      inputVars: 'Variables de saisie',
+      outputVars: {
+        className: 'Nom de la classe',
+      },
+      class: 'Classe',
+      classNamePlaceholder: '脡crivez le nom de votre classe',
+      advancedSetting: 'Param猫tre avanc茅',
+      topicName: 'Nom du sujet',
+      topicPlaceholder: '脡crivez le nom de votre sujet',
+      addClass: 'Ajouter une classe',
+      instruction: 'Instruction',
+      instructionTip: 'Entrez des instructions suppl茅mentaires pour aider le classificateur de questions 脿 mieux comprendre comment cat茅goriser les questions.',
+      instructionPlaceholder: '脡crivez votre instruction',
+    },
+    parameterExtractor: {
+      inputVar: 'Variable de saisie',
+      extractParameters: 'Extraire des param猫tres',
+      importFromTool: 'Importer des outils',
+      addExtractParameter: 'Ajouter un param猫tre d\'extraction',
+      addExtractParameterContent: {
+        name: 'Nom',
+        namePlaceholder: 'Nom du param猫tre d\'extraction',
+        type: 'Type',
+        typePlaceholder: 'Type de param猫tre d\'extraction',
+        description: 'Description',
+        descriptionPlaceholder: 'Description du param猫tre d\'extraction',
+        required: 'Requis',
+        requiredContent: 'Requis est utilis茅 uniquement comme r茅f茅rence pour l\'inf茅rence du mod猫le, et non pour la validation obligatoire de la sortiedu param猫tre.',
+      },
+      extractParametersNotSet: 'Param猫tres d\'extraction non configur茅s',
+      instruction: 'Instruction',
+      instructionTip: 'Entrez des instructions suppl茅mentaires pour aider l\'extracteur de param猫tres 脿 comprendre comment extraire les param猫tres.',
+      advancedSetting: 'Param猫tre avanc茅',
+      reasoningMode: 'Mode de raisonnement',
+      reasoningModeTip: 'Vous pouvez choisir le mode de raisonnement appropri茅 en fonction de la capacit茅 du mod猫le 脿 r茅pondre aux instructions pour les appels de fonction ou les invites.',
+      isSuccess: 'Est r茅ussi. En cas de succ猫s, la valeur est 1, en cas d\'茅chec, la valeur est 0.',
+      errorReason: 'Raison de l\'erreur',
+    },
+    iteration: {
+      deleteTitle: 'Supprimer le n艙ud d\'it茅ration?',
+      deleteDesc: 'La suppression du n艙ud d\'it茅ration supprimera tous les n艙uds enfants',
+      input: 'Entr茅e',
+      output: 'Variables de sortie',
+      iteration_one: '{{count}} It茅ration',
+      iteration_other: '{{count}} It茅rations',
+      currentIteration: 'It茅ration actuelle',
+      ErrorMethod: {
+        operationTerminated: 'Termin茅',
+        removeAbnormalOutput: 'remove-abnormal-output',
+        continueOnError: 'continuer sur l鈥檈rreur',
+      },
+      comma: ',',
+      error_one: '{{compte}} Erreur',
+      error_other: '{{compte}} Erreurs',
+      parallelModeEnableDesc: 'En mode parall猫le, les t芒ches au sein des it茅rations prennent en charge l鈥檈x茅cution parall猫le. Vous pouvez le configurer dans le panneau des propri茅t茅s 脿 droite.',
+      parallelModeUpper: 'MODE PARALL脠LE',
+      parallelPanelDesc: 'En mode parall猫le, les t芒ches de l鈥檌t茅ration prennent en charge l鈥檈x茅cution parall猫le.',
+      MaxParallelismDesc: 'Le parall茅lisme maximal est utilis茅 pour contr么ler le nombre de t芒ches ex茅cut茅es simultan茅ment en une seule it茅ration.',
+      errorResponseMethod: 'M茅thode de r茅ponse aux erreurs',
+      MaxParallelismTitle: 'Parall茅lisme maximal',
+      answerNodeWarningDesc: 'Avertissement en mode parall猫le : les n艙uds de r茅ponse, les affectations de variables de conversation et les op茅rations de lecture/茅criture persistantes au sein des it茅rations peuvent provoquer des exceptions.',
+      parallelModeEnableTitle: 'Mode parall猫le activ茅',
+      parallelMode: 'Mode parall猫le',
+    },
+    note: {
+      addNote: 'Ajouter note',
+      editor: {
+        placeholder: 'Redigez votre note...',
+        small: 'Petit',
+        medium: 'Moyen',
+        large: 'Grand',
+        bold: 'Gras',
+        italic: 'Italique',
+        strikethrough: 'Barr茅',
+        link: 'Lien',
+        openLink: 'Ouvrir',
+        unlink: 'Annuler le lien',
+        enterUrl: 'Entrer l\'URL...',
+        invalidUrl: 'URL invalide',
+        bulletList: 'Liste 脿 puces',
+        showAuthor: 'Afficher l\'auteur',
+      },
+    },
+    docExtractor: {
+      outputVars: {
+        text: 'Texte extrait',
+      },
+      learnMore: 'Pour en savoir plus',
+      inputVar: 'Variable d鈥檈ntr茅e',
+      supportFileTypes: 'Types de fichiers de support : {{types}}.',
+    },
+    listFilter: {
+      outputVars: {
+        result: 'Filtrer le r茅sultat',
+        last_record: 'Dernier enregistrement',
+        first_record: 'Premier enregistrement',
+      },
+      filterCondition: '脡tat du filtre',
+      asc: 'L鈥橝SC',
+      inputVar: 'Variable d鈥檈ntr茅e',
+      filterConditionComparisonValue: 'Valeur de la condition de filtre',
+      desc: 'DESC',
+      filterConditionComparisonOperator: 'Op茅rateur de comparaison de l鈥櫭﹖at des filtres',
+      selectVariableKeyPlaceholder: 'S茅lectionner la cl茅 de sous-variable',
+      limit: 'Haut N',
+      orderBy: 'Trier par',
+      filterConditionKey: 'Cl茅 de condition de filtre',
+      extractsCondition: 'Extraire l鈥櫭﹍茅ment N',
+    },
+    agent: {
+      strategy: {
+        configureTip: 'Veuillez configurer la strat茅gie agentique.',
+        tooltip: 'Diff茅rentes strat茅gies agentiques d茅terminent la fa莽on dont le syst猫me planifie et ex茅cute les appels d鈥檕utils en plusieurs 茅tapes',
+        shortLabel: 'Strat茅gie',
+        selectTip: 'S茅lectionner la strat茅gie agentique',
+        configureTipDesc: 'Apr猫s avoir configur茅 la strat茅gie agentique, ce n艙ud chargera automatiquement les configurations restantes. La strat茅gie affectera le m茅canisme du raisonnement 脿 l鈥檕util en plusieurs 茅tapes.',
+        searchPlaceholder: 'Strat茅gie de recherche agentique',
+        label: 'Strat茅gie agentique',
+      },
+      pluginInstaller: {
+        installing: 'Installation',
+        install: 'Installer',
+      },
+      modelNotInMarketplace: {
+        manageInPlugins: 'G茅rer dans les plugins',
+        desc: 'Ce mod猫le est install茅 脿 partir d鈥檜n r茅f茅rentiel local ou GitHub. Veuillez utiliser apr猫s l鈥檌nstallation.',
+        title: 'Mod猫le non install茅',
+      },
+      modelNotSupport: {
+        title: 'Mod猫le non pris en charge',
+        desc: 'La version du plugin install茅e ne fournit pas ce mod猫le.',
+        descForVersionSwitch: 'La version du plugin install茅e ne fournit pas ce mod猫le. Cliquez pour changer de version.',
+      },
+      modelSelectorTooltips: {
+        deprecated: 'Ce mod猫le est obsol猫te',
+      },
+      outputVars: {
+        files: {
+          title: 'Fichiers g茅n茅r茅s par l鈥檃gent',
+          url: 'URL de l鈥檌mage',
+          transfer_method: 'M茅thode de transfert. La valeur est remote_url ou local_file',
+          type: 'Type de support. Maintenant, seulement l鈥檌mage de support',
+          upload_file_id: 'T茅l茅charger l鈥檌dentifiant du fichier',
+        },
+        json: 'JSON g茅n茅r茅 par l鈥檃gent',
+        text: 'Contenu g茅n茅r茅 par l鈥檃gent',
+      },
+      checkList: {
+        strategyNotSelected: 'Strat茅gie non s茅lectionn茅e',
+      },
+      installPlugin: {
+        title: 'Installer le plugin',
+        install: 'Installer',
+        changelog: 'Journal des modifications',
+        cancel: 'Annuler',
+        desc: 'Sur le point d鈥檌nstaller le plugin suivant',
+      },
+      modelNotSelected: 'Mod猫le non s茅lectionn茅',
+      configureModel: 'Configurer le mod猫le',
+      pluginNotFoundDesc: 'Ce plugin est install茅 脿 partir de GitHub. Veuillez aller dans Plugins pour r茅installer',
+      strategyNotSet: 'Strat茅gie agentique non d茅finie',
+      unsupportedStrategy: 'Strat茅gie non soutenue',
+      linkToPlugin: 'Lien vers les plugins',
+      toolNotInstallTooltip: '{{tool}} n鈥檈st pas install茅',
+      model: 'mod猫le',
+      learnMore: 'Pour en savoir plus',
+      pluginNotInstalled: 'Ce plugin n鈥檈st pas install茅',
+      modelNotInstallTooltip: 'Ce mod猫le n鈥檈st pas install茅',
+      tools: 'Outils',
+      notAuthorized: 'Non autoris茅',
+      strategyNotInstallTooltip: '{{strategy}} n鈥檈st pas install茅',
+      strategyNotFoundDesc: 'La version du plugin install茅e ne fournit pas cette strat茅gie.',
+      strategyNotFoundDescAndSwitchVersion: 'La version du plugin install茅e ne fournit pas cette strat茅gie. Cliquez pour changer de version.',
+      toolbox: 'bo卯te 脿 outils',
+      pluginNotInstalledDesc: 'Ce plugin est install茅 脿 partir de GitHub. Veuillez aller dans Plugins pour r茅installer',
+      maxIterations: 'Nombre maximal d鈥檌t茅rations',
+      toolNotAuthorizedTooltip: '{{outil}} Non autoris茅',
+    },
+    loop: {
+      ErrorMethod: {
+        operationTerminated: 'Termin茅',
+        removeAbnormalOutput: 'Supprimer la sortie anormale',
+        continueOnError: 'Continuer en cas d\'erreur',
+      },
+      currentLoop: 'Boucle de courant',
+      loopMaxCount: 'Nombre maximum de boucles',
+      loop_one: '{{count}} Boucle',
+      output: 'Variable de sortie',
+      error_other: '{{count}} erreurs',
+      loopMaxCountError: 'Veuillez entrer un nombre maximal de boucles valide, compris entre 1 et {{maxCount}}.',
+      totalLoopCount: 'Nombre total de boucles : {{count}}',
+      initialLoopVariables: 'Variables de boucle initiales',
+      breakCondition: 'Condition de terminaison de boucle',
+      variableName: 'Nom de Variable',
+      finalLoopVariables: 'Variables de boucle finales',
+      inputMode: 'Mode d\'entr茅e',
+      setLoopVariables: 'D茅finir des variables dans la port茅e de la boucle',
+      loop_other: '{{count}} Boucles',
+      comma: ',',
+      loopNode: 'N艙ud de boucle',
+      error_one: '{{count}} Erreur',
+      errorResponseMethod: 'M茅thode de r茅ponse d\'erreur',
+      input: 'Entr茅e',
+      currentLoopCount: 'Nombre de boucles actuel : {{count}}',
+      deleteDesc: 'Supprimer le n艙ud de boucle supprimera tous les n艙uds enfants.',
+      exitConditionTip: 'Un n艙ud de boucle n茅cessite au moins une condition de sortie',
+      breakConditionTip: 'Seules les variables dans les boucles avec des conditions de terminaison et les variables de conversation peuvent 锚tre r茅f茅renc茅es.',
+      loopVariables: 'Variables de boucle',
+      deleteTitle: 'Supprimer le n艙ud de boucle ?',
+    },
+  },
+  tracing: {
+    stopBy: 'Arr锚t茅 par {{user}}',
+  },
+  variableReference: {
+    noAssignedVars: 'Aucune variable affect茅e disponible',
+    noVarsForOperation: 'Aucune variable n鈥檈st disponible pour l鈥檃ffectation avec l鈥檕p茅ration s茅lectionn茅e.',
+    noAvailableVars: 'Aucune variable disponible',
+    assignedVarsDescription: 'Les variables affect茅es doivent 锚tre des variables accessibles en 茅criture, telles que',
+    conversationVars: 'Variables de conversation',
+  },
+  versionHistory: {
+    filter: {
+      all: 'Tout',
+      reset: 'R茅initialiser le filtre',
+      onlyYours: 'Rien que le tien',
+      empty: 'Aucune version correspondante trouv茅e',
+      onlyShowNamedVersions: 'Afficher uniquement les versions nomm茅es',
+    },
+    editField: {
+      releaseNotesLengthLimit: 'Les notes de version ne peuvent pas d茅passer {{limit}} caract猫res.',
+      title: 'Titre',
+      titleLengthLimit: 'Le titre ne peut pas d茅passer {{limit}} caract猫res.',
+      releaseNotes: 'Notes de version',
+    },
+    action: {
+      updateSuccess: 'Version mise 脿 jour',
+      deleteFailure: '脡chec de la suppression de la version',
+      restoreSuccess: 'Version restaur茅e',
+      deleteSuccess: 'Version supprim茅e',
+      updateFailure: '脡chec de la mise 脿 jour de la version',
+      restoreFailure: '脡chec de la restauration de la version',
+    },
+    title: 'Versions',
+    releaseNotesPlaceholder: 'D茅crivez ce qui a chang茅',
+    nameThisVersion: 'Nommez cette version',
+    currentDraft: 'Projet actuel',
+    defaultName: 'Version sans titre',
+    editVersionInfo: 'Modifier les informations de version',
+    restorationTip: 'Apr猫s la restauration de la version, le brouillon actuel sera 茅cras茅.',
+    deletionTip: 'La suppression est irreversible, veuillez confirmer.',
+    latest: 'Dernier',
+  },
+}
+
+export default translation
diff --git a/i18n/hi-IN/app-annotation.ts b/i18n/hi-IN/app-annotation.ts
new file mode 100644
index 0000000..0249ebf
--- /dev/null
+++ b/i18n/hi-IN/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: '啶忇え啷嬥啷囙ざ啶�',
+  name: '啶忇え啷嬥啷囙ざ啶� 啶夃い啷嵿い啶�',
+  editBy: '啶夃い啷嵿い啶� 啶膏啶ぞ啶︵た啶� 啶曕た啶ぞ 啶椸く啶� {{author}} 啶︵啶掂ぞ啶班ぞ',
+  noData: {
+    title: '啶曕啶� 啶忇え啷嬥啷囙ざ啶� 啶ㄠす啷�啶�',
+    description: '啶嗋お 啶愢お 啶∴た啶啶苦啶� 啶曕 啶︵啶班ぞ啶� 啶忇え啷嬥啷囙ざ啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ 啶膏啶む 啶灌啶� 啶ぞ 啶夃啷嵿 啶椸啶`さ啶む啶むぞ 啶掂ぞ啶侧 啶夃い啷嵿い啶� 啶曕 啶侧た啶� 啶す啶距 啶げ啷嵿 啶啶� 啶忇え啷嬥啷囙ざ啶� 啶嗋く啶距い 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+  },
+  table: {
+    header: {
+      question: '啶啶班ざ啷嵿え',
+      answer: '啶夃い啷嵿い啶�',
+      createdAt: '啶ㄠた啶班啶ぞ啶� 啶むた啶ムた',
+      hits: '啶灌た啶熰啶�',
+      actions: '啶曕啶班た啶ぞ啶忇',
+      addAnnotation: '啶忇え啷嬥啷囙ざ啶� 啶溹啶∴ぜ啷囙',
+      bulkImport: '啶げ啷嵿 啶嗋く啶距い',
+      bulkExport: '啶げ啷嵿 啶ㄠた啶班啶ぞ啶�',
+      clearAll: '啶膏き啷� 啶忇え啷嬥啷囙ざ啶� 啶膏ぞ啶� 啶曕ぐ啷囙',
+    },
+  },
+  editModal: {
+    title: '啶忇え啷嬥啷囙ざ啶� 啶夃い啷嵿い啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+    queryName: '啶夃お啶啶椸啶班啶むぞ 啶啶班ざ啷嵿え',
+    answerName: '啶膏啶熰啶班啶熰啶侧ぐ 啶啶�',
+    yourAnswer: '啶嗋お啶曕ぞ 啶夃い啷嵿い啶�',
+    answerPlaceholder: '啶す啶距 啶呧お啶ㄠぞ 啶夃い啷嵿い啶� 啶熰ぞ啶囙お 啶曕ぐ啷囙',
+    yourQuery: '啶嗋お啶曕ぞ 啶啶班ざ啷嵿え',
+    queryPlaceholder: '啶す啶距 啶呧お啶ㄠぞ 啶啶班ざ啷嵿え 啶熰ぞ啶囙お 啶曕ぐ啷囙',
+    removeThisCache: '啶囙じ 啶忇え啷嬥啷囙ざ啶� 啶曕 啶灌啶距啶�',
+    createdAt: '啶ㄠた啶班啶ぞ啶� 啶むた啶ムた',
+  },
+  addModal: {
+    title: '啶忇え啷嬥啷囙ざ啶� 啶夃い啷嵿い啶� 啶溹啶∴ぜ啷囙',
+    queryName: '啶啶班ざ啷嵿え',
+    answerName: '啶夃い啷嵿い啶�',
+    answerPlaceholder: '啶す啶距 啶夃い啷嵿い啶� 啶熰ぞ啶囙お 啶曕ぐ啷囙',
+    queryPlaceholder: '啶す啶距 啶啶班ざ啷嵿え 啶熰ぞ啶囙お 啶曕ぐ啷囙',
+    createNext: '啶忇 啶斷ぐ 啶忇え啷嬥啷囙啷囙ぁ 啶夃い啷嵿い啶� 啶溹啶∴ぜ啷囙',
+  },
+  batchModal: {
+    title: '啶げ啷嵿 啶嗋く啶距い',
+    csvUploadTitle: '啶呧お啶ㄠ CSV 啶ぜ啶距啶� 啶す啶距 啶栢啶傕啷囙 啶斷ぐ 啶涏啶∴ぜ啷囙, 啶ぞ ',
+    browse: '啶啶班ぞ啶夃啶� 啶曕ぐ啷囙',
+    tip: 'CSV 啶ぜ啶距啶� 啶曕 啶ㄠた啶啶ㄠげ啶苦啶苦い 啶膏啶班啶ㄠぞ 啶曕 啶呧え啷佮ぐ啷傕お 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶�:',
+    question: '啶啶班ざ啷嵿え',
+    answer: '啶夃い啷嵿い啶�',
+    contentTitle: '啶栢啶� 啶膏ぞ啶啷嵿ぐ啷�',
+    content: '啶膏ぞ啶啷嵿ぐ啷�',
+    template: '啶熰啶啶げ啷囙 啶す啶距 啶∴ぞ啶夃え啶侧啶� 啶曕ぐ啷囙',
+    cancel: '啶班う啷嵿う 啶曕ぐ啷囙',
+    run: '啶啶� 啶氞げ啶距啶�',
+    runError: '啶啶� 啶氞げ啶距え啶� 啶掂た啶げ 啶班す啶�',
+    processing: '啶啶� 啶啶班啶膏啶膏た啶傕 啶啶�',
+    completed: '啶嗋く啶距い 啶啶班啶�',
+    error: '啶嗋く啶距い 啶む啶班啶熰た',
+    ok: '啶犩啶�',
+  },
+  errorMessage: {
+    answerRequired: '啶夃い啷嵿い啶� 啶嗋さ啶多啶 啶灌',
+    queryRequired: '啶啶班ざ啷嵿え 啶嗋さ啶多啶 啶灌',
+  },
+  viewModal: {
+    annotatedResponse: '啶忇え啷嬥啷囙ざ啶� 啶夃い啷嵿い啶�',
+    hitHistory: '啶灌た啶� 啶囙い啶苦す啶距じ',
+    hit: '啶灌た啶�',
+    hits: '啶灌た啶熰啶�',
+    noHitHistory: '啶曕啶� 啶灌た啶� 啶囙い啶苦す啶距じ 啶ㄠす啷�啶�',
+  },
+  hitHistoryTable: {
+    query: '啶啶班ざ啷嵿え',
+    match: '啶啶�',
+    response: '啶啶班い啶苦啷嵿ぐ啶苦く啶�',
+    source: '啶膏啶班啶�',
+    score: '啶膏啶曕啶�',
+    time: '啶膏ぎ啶�',
+  },
+  initSetup: {
+    title: '啶忇え啷嬥啷囙ざ啶� 啶夃い啷嵿い啶� 啶啶班ぞ啶班啶た啶� 啶膏啶熰啶�',
+    configTitle: '啶忇え啷嬥啷囙ざ啶� 啶夃い啷嵿い啶� 啶膏啶熰啶�',
+    confirmBtn: '啶膏す啷囙啷囙 啶斷ぐ 啶膏啷嵿し啶� 啶曕ぐ啷囙',
+    configConfirmBtn: '啶膏す啷囙啷囙',
+  },
+  embeddingModelSwitchTip: '啶忇え啷嬥啷囙ざ啶� 啶熰啶曕啶膏啶� 啶掂啶曕啶熰ぐ啶距啶溹啶多え 啶啶∴げ, 啶啶∴げ 啶う啶侧え啷� 啶膏 啶啶ㄠ 啶忇ぎ啷嵿が啷囙ぁ 啶曕た啶ぞ 啶溹ぞ啶忇啶�, 啶溹た啶膏じ啷� 啶呧い啶苦ぐ啶苦啷嵿い 啶侧ぞ啶椸い啷囙 啶夃い啷嵿お啶ㄠ啶� 啶灌啶傕啷�啷�',
+}
+
+export default translation
diff --git a/i18n/hi-IN/app-api.ts b/i18n/hi-IN/app-api.ts
new file mode 100644
index 0000000..3473599
--- /dev/null
+++ b/i18n/hi-IN/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: '啶忇お啷�啶嗋 啶膏ぐ啷嵿さ啶�',
+  apiKey: '啶忇お啷�啶嗋 啶曕啶傕啷�',
+  status: '啶膏啶ムた啶むた',
+  disabled: '啶呧啷嵿し啶�',
+  ok: '啶膏啶掂ぞ 啶啶�',
+  copy: '啶啶班い啶苦げ啶苦お啶�',
+  copied: '啶啶班い啶苦げ啶苦お啶� 啶え 啶椸',
+  play: '啶氞げ啶距啶�',
+  pause: '啶掂た啶班ぞ啶�',
+  playing: '啶氞げ 啶班す啶� 啶灌',
+  loading: '啶侧啶� 啶灌 啶班す啶� 啶灌',
+  merMaid: {
+    rerender: '啶啶ㄠ 啶班啶班啶傕ぁ啶� 啶曕ぐ啷囙',
+  },
+  never: '啶曕き啷� 啶ㄠす啷�啶�',
+  apiKeyModal: {
+    apiSecretKey: '啶忇お啷�啶嗋 啶椸啶啶� 啶曕啶傕啷�',
+    apiSecretKeyTips: '啶忇お啷�啶嗋 啶曕ぞ 啶︵啶班啶く啷嬥 啶班啶曕え啷� 啶曕 啶侧た啶�, 啶呧お啶ㄠ 啶忇お啷�啶嗋 啶曕啶傕啷� 啶曕 啶膏啶班啷嵿し啶� 啶曕ぐ啷囙啷� 啶啶班啶�-啶忇啶� 啶曕啶� 啶啶� 啶囙じ啷� 啶膏ぞ啶︵ 啶ぞ啶� 啶曕 啶班啶� 啶啶� 啶夃お啶啶� 啶曕ぐ啶ㄠ 啶膏 啶啷囙啷� :)',
+    createNewSecretKey: '啶ㄠ 啶椸啶啶� 啶曕啶傕啷� 啶え啶距啶�',
+    secretKey: '啶椸啶啶� 啶曕啶傕啷�',
+    created: '啶え啶距 啶椸',
+    lastUsed: '啶呧啶むた啶� 啶夃お啶啶�',
+    generateTips: '啶囙じ 啶曕啶傕啷� 啶曕 啶忇 啶膏啶班啷嵿し啶苦い 啶斷ぐ 啶膏啶侧き 啶膏啶ムぞ啶� 啶ぐ 啶班啷囙啷�',
+  },
+  actionMsg: {
+    deleteConfirmTitle: '啶囙じ 啶椸啶啶� 啶曕啶傕啷� 啶曕 啶灌啶距啶�?',
+    deleteConfirmTips: '啶す 啶曕啶班た啶ぞ 啶啶班啶掂さ啶� 啶ㄠす啷�啶� 啶曕 啶溹ぞ 啶膏啶む啷�',
+    ok: '啶犩啶�',
+  },
+  completionMode: {
+    title: '啶啶班啶`い啶� 啶愢お 啶忇お啷�啶嗋',
+    info: '啶夃啷嵿 啶椸啶`さ啶む啶むぞ 啶掂ぞ啶侧 啶ぞ啶� 啶啶⑧ぜ啷� 啶曕 啶侧た啶�, 啶溹啶膏 啶侧啶�, 啶膏ぞ啶班ぞ啶傕ざ, 啶斷ぐ 啶呧え啷佮さ啶距う, 啶夃お啶啶椸啶班啶むぞ 啶囙え啶啶� 啶曕 啶膏ぞ啶� 啶啶班啶`い啶�-啶膏啶︵啶� 啶忇お啷�啶嗋 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙啷� 啶ぞ啶� 啶啶⑧ぜ啷� 啶啶∴げ 啶啶班ぞ啶啶熰ぐ 啶斷ぐ 啶啶班啶啶啶� 啶熰啶啶げ啷囙啷嵿じ 啶ぐ 啶ㄠた啶班啶ぐ 啶曕ぐ啶む 啶灌 啶溹 啶啶班啶啶啶� 啶囙啶溹啶ㄠた啶ぐ啶苦啶� 啶啶� 啶膏啶� 啶灌啶む 啶灌啶傕イ',
+    createCompletionApi: '啶啶班啶`い啶� 啶膏啶︵啶� 啶え啶距啶�',
+    createCompletionApiTip: '啶啶班ざ啷嵿え-啶夃い啷嵿い啶� 啶啶� 啶曕ぞ 啶膏ぎ啶班啶ムえ 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶啶班啶`い啶� 啶膏啶︵啶� 啶え啶距啶佮イ',
+    inputsTips: '(啶掂啶曕げ啷嵿お啶苦) 啶夃お啶啶椸啶班啶むぞ 啶囙え啶啶� 啶ぜ啷�啶侧啶� 啶曕 啶曕啶傕啷�-啶啶侧啶� 啶溹啶∴ぜ啷� 啶曕 啶班啶� 啶啶� 啶啶班う啶距え 啶曕ぐ啷囙, 啶溹 啶啶班啶啶啶� 啶囙啶溹啶ㄠた啶ぐ啶苦啶� 啶啶� 啶氞ぐ 啶曕 啶呧え啷佮ぐ啷傕お 啶灌啷� 啶曕啶傕啷� 啶氞ぐ 啶曕ぞ 啶ㄠぞ啶� 啶灌, 啶啶侧啶� 啶啶班ぞ啶啶熰ぐ 啶啶侧啶� 啶灌啷� 啶う啶� 啶ぜ啷�啶侧啶� 啶啶班啶距ぐ 啶氞く啶� 啶灌, 啶む 啶啶班じ啷嵿い啷佮い 啶啶侧啶� 啶啶班啶膏啶� 啶掂た啶曕げ啷嵿お啷嬥 啶啶� 啶膏 啶忇 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶忇イ',
+    queryTips: '啶夃お啶啶椸啶班啶むぞ 啶囙え啶啶� 啶ぞ啶� 啶膏ぞ啶啷嵿ぐ啷�啷�',
+    blocking: '啶啶侧啶曕た啶傕 啶啶班啶距ぐ, 啶ㄠた啶粪啶ぞ啶︵え 啶啶班ぞ 啶灌啶ㄠ 啶曕 啶啶班い啷�啶曕啶粪ぞ 啶曕ぐ啶むぞ 啶灌 啶斷ぐ 啶ぐ啶苦ぃ啶距ぎ 啶侧啶熰ぞ啶むぞ 啶灌啷� (啶啶班啷嵿ぐ啶苦く啶� 啶侧啶 啶灌啶ㄠ 啶ぐ 啶呧え啷佮ぐ啷嬥ぇ啷嬥 啶曕 啶班啶曕ぞ 啶溹ぞ 啶膏啶むぞ 啶灌)',
+    streaming: '啶膏啶熰啶班啶た啶傕 啶班た啶熰ぐ啷嵿え啷� 啶忇じ啶忇じ啶� (啶膏ぐ啷嵿さ啶�-啶膏啶傕 啶囙さ啷囙啶熰啶�) 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶膏啶熰啶班啶た啶傕 啶班た啶熰ぐ啷嵿え 啶曕ぞ 啶曕ぞ啶班啶ぞ啶ㄠ啶掂く啶ㄠイ',
+    messageFeedbackApi: '啶膏啶︵啶� 啶啶班い啶苦啷嵿ぐ啶苦く啶� (啶じ啶傕う)',
+    messageFeedbackApiTip: '啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶撪ぐ 啶膏 啶啶班ぞ啶啶� 啶膏啶︵啶多啶� 啶曕 啶じ啶傕う 啶ぞ 啶ㄠぞ啶じ啶傕う 啶曕ぐ啷囙啷� 啶す 啶∴啶熰ぞ 啶侧啶� 啶斷ぐ 啶忇え啷嬥啷囙ざ啶� 啶啶粪啶� 啶啶� 啶︵た啶栢ぞ啶� 啶︵啶むぞ 啶灌 啶斷ぐ 啶さ啶苦し啷嵿く 啶曕 啶啶∴げ 啶膏啶оぞ啶� 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷�',
+    messageIDTip: '啶膏啶︵啶� 啶嗋啶∴',
+    ratingTip: '啶じ啶傕う 啶ぞ 啶ㄠぞ啶じ啶傕う, null 啶啶班啶掂さ啶� 啶灌',
+    parametersApi: '啶忇お啷嵿げ啶苦啷囙ざ啶� 啶啶班ぞ啶啶熰ぐ 啶溹ぞ啶ㄠ啶距ぐ啷� 啶啶班ぞ啶啶� 啶曕ぐ啷囙',
+    parametersApiTip: '啶曕啶ㄠ啶ぜ啶苦啶� 啶曕た啶� 啶椸 啶囙え啶啶� 啶啶班ぞ啶啶熰ぐ 啶啶班ぞ啶啶� 啶曕ぐ啷囙, 啶溹た啶ㄠぎ啷囙 啶氞ぐ 啶ㄠぞ啶�, 啶ぜ啷�啶侧啶� 啶ㄠぞ啶�, 啶啶班啶距ぐ 啶斷ぐ 啶∴た啶ぜ啷夃げ啷嵿 啶ぞ啶� 啶多ぞ啶た啶� 啶灌啶傕イ 啶嗋ぎ啶む啶� 啶ぐ 啶囙え 啶ぜ啷�啶侧啶∴啶� 啶曕 啶ぜ啷夃ぐ啷嵿ぎ 啶啶� 啶啶班う啶班啶多た啶� 啶曕ぐ啶ㄠ 啶ぞ 啶曕啶侧ぞ啶囙啶� 啶侧啶� 啶灌啶ㄠ 啶曕 啶ぞ啶� 啶∴た啶ぜ啷夃げ啷嵿 啶ぞ啶� 啶ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷�',
+  },
+  chatMode: {
+    title: '啶氞啶� 啶愢お 啶忇お啷�啶嗋',
+    info: '啶掂た啶掂た啶� 啶ぞ啶む啷�啶� 啶愢お啷嵿じ 啶曕 啶侧た啶� 啶溹 啶啶班ざ啷嵿え-啶夃い啷嵿い啶� 啶啶班ぞ啶班啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶む 啶灌啶�, 啶氞啶�-啶膏啶︵啶� 啶忇お啷�啶嗋 啶曕 啶曕啶� 啶曕ぐ啷囙啷� 啶膏啶掂ぞ啶� 啶多啶班 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶ぞ 啶啶溹啶︵ぞ 啶ぞ啶む啷�啶� 啶曕 啶溹ぞ啶班 啶班啶ㄠ 啶曕 啶侧た啶� conversation_id 啶ぞ啶� 啶曕ぐ啷囙啷� 啶夃い啷嵿い啶� 啶啶班ぞ啶啶熰ぐ 啶斷ぐ 啶熰啶啶げ啷囙 啶啶班啶啶啶� 啶囙啶溹啶ㄠた啶ぐ啶苦啶� 啶膏啶熰た啶傕啷嵿じ 啶ぐ 啶ㄠた啶班啶ぐ 啶曕ぐ啶む 啶灌啶傕イ',
+    createChatApi: '啶氞啶� 啶膏啶︵啶� 啶え啶距啶�',
+    createChatApiTip: '啶ㄠ 啶ぞ啶む啷�啶� 啶膏啶︵啶� 啶え啶距啶� 啶ぞ 啶啶溹啶︵ぞ 啶膏啶掂ぞ啶� 啶溹ぞ啶班 啶班啷囙啷�',
+    inputsTips: '(啶掂啶曕げ啷嵿お啶苦) 啶夃お啶啶椸啶班啶むぞ 啶囙え啶啶� 啶ぜ啷�啶侧啶� 啶曕 啶曕啶傕啷�-啶啶侧啶� 啶溹啶∴ぜ啷� 啶曕 啶班啶� 啶啶� 啶啶班う啶距え 啶曕ぐ啷囙, 啶溹 啶啶班啶啶啶� 啶囙啶溹啶ㄠた啶ぐ啶苦啶� 啶啶� 啶氞ぐ 啶曕 啶呧え啷佮ぐ啷傕お 啶灌啷� 啶曕啶傕啷� 啶氞ぐ 啶曕ぞ 啶ㄠぞ啶� 啶灌, 啶啶侧啶� 啶啶班ぞ啶啶熰ぐ 啶啶侧啶� 啶灌啷� 啶う啶� 啶ぜ啷�啶侧啶� 啶啶班啶距ぐ 啶氞く啶� 啶灌, 啶む 啶啶班じ啷嵿い啷佮い 啶啶侧啶� 啶啶班啶膏啶� 啶掂た啶曕げ啷嵿お啷嬥 啶啶� 啶膏 啶忇 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶忇イ',
+    queryTips: '啶夃お啶啶椸啶班啶むぞ 啶囙え啶啶�/啶啶班ざ啷嵿え 啶膏ぞ啶啷嵿ぐ啷�',
+    blocking: '啶啶侧啶曕た啶傕 啶啶班啶距ぐ, 啶ㄠた啶粪啶ぞ啶︵え 啶啶班ぞ 啶灌啶ㄠ 啶曕 啶啶班い啷�啶曕啶粪ぞ 啶曕ぐ啶むぞ 啶灌 啶斷ぐ 啶ぐ啶苦ぃ啶距ぎ 啶侧啶熰ぞ啶むぞ 啶灌啷� (啶啶班啷嵿ぐ啶苦く啶� 啶侧啶 啶灌啶ㄠ 啶ぐ 啶呧え啷佮ぐ啷嬥ぇ啷嬥 啶曕 啶班啶曕ぞ 啶溹ぞ 啶膏啶むぞ 啶灌)',
+    streaming: '啶膏啶熰啶班啶た啶傕 啶班た啶熰ぐ啷嵿え啷� 啶忇じ啶忇じ啶� (啶膏ぐ啷嵿さ啶�-啶膏啶傕 啶囙さ啷囙啶熰啶�) 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶膏啶熰啶班啶た啶傕 啶班た啶熰ぐ啷嵿え 啶曕ぞ 啶曕ぞ啶班啶ぞ啶ㄠ啶掂く啶ㄠイ',
+    conversationIdTip: '(啶掂啶曕げ啷嵿お啶苦) 啶ぞ啶む啷�啶� 啶嗋啶∴: 啶す啶侧 啶ぞ啶� 啶ぞ啶む啷�啶� 啶曕 啶侧た啶� 啶栢ぞ啶侧 啶涏啶∴ぜ 啶︵啶�; 啶膏啶掂ぞ啶� 啶溹ぞ啶班 啶班啶ㄠ 啶曕 啶侧た啶� 啶膏啶︵ぐ啷嵿き 啶膏 conversation_id 啶ぞ啶� 啶曕ぐ啷囙啷�',
+    messageFeedbackApi: '啶膏啶︵啶� 啶呧啶むた啶� 啶夃お啶啶椸啶班啶むぞ 啶啶班い啶苦啷嵿ぐ啶苦く啶�, 啶じ啶傕う',
+    messageFeedbackApiTip: '啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶撪ぐ 啶膏 啶啶班ぞ啶啶� 啶膏啶︵啶多啶� 啶曕 啶じ啶傕う 啶ぞ 啶ㄠぞ啶じ啶傕う 啶曕ぐ啷囙啷� 啶す 啶∴啶熰ぞ 啶侧啶� 啶斷ぐ 啶忇え啷嬥啷囙ざ啶� 啶啶粪啶� 啶啶� 啶︵た啶栢ぞ啶� 啶︵啶むぞ 啶灌 啶斷ぐ 啶さ啶苦し啷嵿く 啶曕 啶啶∴げ 啶膏啶оぞ啶� 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷�',
+    messageIDTip: '啶膏啶︵啶� 啶嗋啶∴',
+    ratingTip: '啶じ啶傕う 啶ぞ 啶ㄠぞ啶じ啶傕う, null 啶啶班啶掂さ啶� 啶灌',
+    chatMsgHistoryApi: '啶氞啶� 啶囙い啶苦す啶距じ 啶膏啶︵啶� 啶啶班ぞ啶啶� 啶曕ぐ啷囙',
+    chatMsgHistoryApiTip: '啶す啶侧ぞ 啶啶粪啶� 啶ㄠさ啷�啶ㄠい啶� `limit` 啶ぞ啶� 啶侧啶熰ぞ啶むぞ 啶灌, 啶溹 啶夃げ啷嵿啷� 啶曕啶班ぎ 啶啶� 啶灌啶むぞ 啶灌啷�',
+    chatMsgHistoryConversationIdTip: '啶ぞ啶む啷�啶� 啶嗋啶∴',
+    chatMsgHistoryFirstId: '啶掂ぐ啷嵿い啶ぞ啶� 啶啶粪啶� 啶ぐ 啶す啶侧 啶氞啶� 啶班た啶曕啶班啶� 啶曕ぞ 啶嗋啶∴啷� 啶∴た啶ぜ啷夃げ啷嵿 啶班啶� 啶膏 啶曕啶� 啶ㄠす啷�啶傕イ',
+    chatMsgHistoryLimit: '啶忇 啶呧え啷佮ぐ啷嬥ぇ 啶啶� 啶曕た啶むえ啷� 啶氞啶� 啶侧啶熰ぞ啶� 啶溹ぞ啶む 啶灌',
+    conversationsListApi: '啶ぞ啶む啷�啶� 啶膏啶氞 啶啶班ぞ啶啶� 啶曕ぐ啷囙',
+    conversationsListApiTip: '啶掂ぐ啷嵿い啶ぞ啶� 啶夃お啶啶椸啶班啶むぞ 啶曕 啶膏い啷嵿ぐ 啶膏啶氞 啶啶班ぞ啶啶� 啶曕ぐ啶むぞ 啶灌啷� 啶∴た啶ぜ啷夃げ啷嵿 啶班啶� 啶膏, 啶呧啶むた啶� 20 啶膏い啷嵿ぐ 啶侧啶熰ぞ啶� 啶溹ぞ啶む 啶灌啶傕イ',
+    conversationsListFirstIdTip: '啶掂ぐ啷嵿い啶ぞ啶� 啶啶粪啶� 啶ぐ 啶呧啶むた啶� 啶班た啶曕啶班啶� 啶曕ぞ 啶嗋啶∴, 啶∴た啶ぜ啷夃げ啷嵿 啶曕啶� 啶ㄠす啷�啶傕イ',
+    conversationsListLimitTip: '啶忇 啶呧え啷佮ぐ啷嬥ぇ 啶啶� 啶曕た啶むえ啷� 啶氞啶� 啶侧啶熰ぞ啶� 啶溹ぞ啶む 啶灌',
+    conversationRenamingApi: '啶ぞ啶む啷�啶� 啶曕ぞ 啶啶ㄠ 啶ㄠぞ啶啶班ぃ',
+    conversationRenamingApiTip: '啶ぞ啶む啷�啶� 啶曕ぞ 啶啶ㄠ 啶ㄠぞ啶啶班ぃ 啶曕ぐ啷囙; 啶ㄠぞ啶� 啶す啷�-啶膏い啷嵿ぐ 啶曕啶侧ぞ啶囙啶� 啶囙啶熰ぐ啶啶� 啶啶� 啶啶班う啶班啶多た啶� 啶灌啶むぞ 啶灌啷�',
+    conversationRenamingNameTip: '啶ㄠく啶� 啶ㄠぞ啶�',
+    parametersApi: '啶忇お啷嵿げ啶苦啷囙ざ啶� 啶啶班ぞ啶啶熰ぐ 啶溹ぞ啶ㄠ啶距ぐ啷� 啶啶班ぞ啶啶� 啶曕ぐ啷囙',
+    parametersApiTip: '啶曕啶ㄠ啶ぜ啶苦啶� 啶曕た啶� 啶椸 啶囙え啶啶� 啶啶班ぞ啶啶熰ぐ 啶啶班ぞ啶啶� 啶曕ぐ啷囙, 啶溹た啶ㄠぎ啷囙 啶氞ぐ 啶ㄠぞ啶�, 啶ぜ啷�啶侧啶� 啶ㄠぞ啶�, 啶啶班啶距ぐ 啶斷ぐ 啶∴た啶ぜ啷夃げ啷嵿 啶ぞ啶� 啶多ぞ啶た啶� 啶灌啶傕イ 啶嗋ぎ啶む啶� 啶ぐ 啶囙え 啶ぜ啷�啶侧啶∴啶� 啶曕 啶ぜ啷夃ぐ啷嵿ぎ 啶啶� 啶啶班う啶班啶多た啶� 啶曕ぐ啶ㄠ 啶ぞ 啶曕啶侧ぞ啶囙啶� 啶侧啶� 啶灌啶ㄠ 啶曕 啶ぞ啶� 啶∴た啶ぜ啷夃げ啷嵿 啶ぞ啶� 啶ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷�',
+  },
+  develop: {
+    requestBody: '啶呧え啷佮ぐ啷嬥ぇ 啶ㄠた啶曕ぞ啶�',
+    pathParams: '啶ぅ 啶啶班ぞ啶啶熰ぐ',
+    query: '啶啶班ざ啷嵿え',
+    toc: '啶膏ぞ啶啷嵿ぐ啷�',
+  },
+  regenerate: '啶啶ㄠぐ啷嵿啶ㄠ啶�',
+}
+
+export default translation
diff --git a/i18n/hi-IN/app-debug.ts b/i18n/hi-IN/app-debug.ts
new file mode 100644
index 0000000..1b0633e
--- /dev/null
+++ b/i18n/hi-IN/app-debug.ts
@@ -0,0 +1,469 @@
+const translation = {
+  pageTitle: {
+    line1: '啶啶班啶啶啶�',
+    line2: '啶囙啶溹啶ㄠた啶ぐ啶苦啶�',
+  },
+  orchestrate: '啶掂啶さ啶膏啶ムた啶� 啶曕ぐ啶ㄠぞ',
+  promptMode: {
+    simple:
+      '啶膏啶啶班啶� 啶啶班啶啶啶� 啶曕 啶膏啶ぞ啶︵た啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶忇啷嵿じ啶ぐ啷嵿 啶啶� 啶啶� 啶膏啶掂た啶� 啶曕ぐ啷囙',
+    advanced: '啶掂た啶多啶粪啷嵿 啶啶�',
+    switchBack: '啶掂ぞ啶じ 啶膏啶掂た啶� 啶曕ぐ啷囙',
+    advancedWarning: {
+      title:
+        '啶嗋お啶ㄠ 啶掂た啶多啶粪啷嵿 啶啶� 啶啶� 啶膏啶掂た啶� 啶曕た啶ぞ 啶灌, 啶斷ぐ 啶忇 啶ぞ啶� 啶溹が 啶嗋お 啶啶班啶啶啶� 啶曕 啶膏啶多啶оた啶� 啶曕ぐ啶む 啶灌啶�, 啶む 啶嗋お 啶啶膏た啶� 啶啶� 啶ぐ 啶掂ぞ啶じ 啶ㄠす啷�啶� 啶溹ぞ 啶膏啶む 啶灌啶傕イ',
+      description:
+        '啶掂た啶多啶粪啷嵿 啶啶� 啶啶�, 啶嗋お 啶膏啶啶班啶� 啶啶班啶啶啶� 啶曕 啶膏啶ぞ啶︵た啶� 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+      learnMore: '啶斷ぐ 啶呧ぇ啶苦 啶溹ぞ啶ㄠ啶�',
+      ok: '啶犩啶� 啶灌',
+    },
+    operation: {
+      addMessage: '啶膏啶︵啶� 啶溹啶∴ぜ啷囙',
+    },
+    contextMissing:
+      '啶啶班じ啶傕 啶樴啶� 啶椸ぞ啶が 啶灌, 啶啶班啶啶啶� 啶曕 啶啶班き啶距さ啶多啶侧い啶� 啶呧啷嵿啷� 啶ㄠす啷�啶� 啶灌 啶膏啶む 啶灌啷�',
+  },
+  operation: {
+    applyConfig: '啶啶班啶距ざ啶苦い 啶曕ぐ啷囙',
+    resetConfig: '啶班啶膏啶� 啶曕ぐ啷囙',
+    debugConfig: '啶∴啶 啶曕ぐ啷囙',
+    addFeature: '啶掂た啶多啶粪い啶� 啶溹啶∴ぜ啷囙',
+    automatic: '啶膏啶掂啶距げ啶苦い',
+    stopResponding: '啶啶班い啶苦啷嵿ぐ啶苦く啶� 啶︵啶ㄠぞ 啶啶� 啶曕ぐ啷囙',
+    agree: '啶じ啶傕う',
+    disagree: '啶ㄠぞ啶じ啶傕う',
+    cancelAgree: '啶じ啶傕う 啶班う啷嵿う 啶曕ぐ啷囙',
+    cancelDisagree: '啶ㄠぞ啶じ啶傕う 啶班う啷嵿う 啶曕ぐ啷囙',
+    userAction: '啶夃お啶啶椸啶班啶むぞ ',
+  },
+  notSetAPIKey: {
+    title: '啶忇げ啶忇げ啶忇ぎ 啶啶班う啶距い啶� 啶曕啶傕啷� 啶膏啶� 啶ㄠす啷�啶� 啶曕 啶椸 啶灌',
+    trailFinished: '啶ぐ啷�啶曕啶粪ぃ 啶膏ぎ啶距お啷嵿い',
+    description:
+      '啶忇げ啶忇げ啶忇ぎ 啶啶班う啶距い啶� 啶曕啶傕啷� 啶膏啶� 啶ㄠす啷�啶� 啶曕 啶椸 啶灌, 啶斷ぐ 啶∴啶 啶曕ぐ啶ㄠ 啶膏 啶す啶侧 啶囙じ啷� 啶膏啶� 啶曕ぐ啶ㄠ 啶曕 啶嗋さ啶多啶啶むぞ 啶灌啷�',
+    settingBtn: '啶膏啶熰た啶傕啷嵿じ 啶ぐ 啶溹ぞ啶忇',
+  },
+  trailUseGPT4Info: {
+    title: '啶呧き啷� GPT-4 啶曕ぞ 啶膏ぎ啶班啶ムえ 啶ㄠす啷�啶� 啶曕ぐ啶むぞ',
+    description: 'GPT-4 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�, 啶曕啶く啶� API 啶曕啶傕啷� 啶膏啶� 啶曕ぐ啷囙啷�',
+  },
+  feature: {
+    groupChat: {
+      title: '啶氞啶� 啶膏啶掂ぐ啷嵿ぇ啶�',
+      description:
+        '啶愢お啷嵿じ 啶曕 啶侧た啶� 啶啶班啶�-啶膏啶掂ぞ啶� 啶膏啶熰た啶傕啷嵿じ 啶溹啶∴ぜ啶ㄠ 啶膏 啶夃お啶啶椸啶班啶むぞ 啶呧え啷佮き啶� 啶曕 啶あ啶监ぞ啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌啷�',
+    },
+    groupExperience: {
+      title: '啶呧え啷佮き啶� 啶膏啶掂ぐ啷嵿ぇ啶�',
+    },
+    conversationOpener: {
+      title: '啶膏啶掂ぞ啶� 啶多啶班 啶曕ぐ啶ㄠ 啶掂ぞ啶侧',
+      description:
+        '啶忇 啶氞啶� 啶愢お 啶啶�, 啶忇啶� 啶︵啶掂ぞ啶班ぞ 啶夃お啶啶椸啶班啶むぞ 啶膏 啶膏啷嵿ぐ啶苦く 啶班啶� 啶膏 啶啶侧 啶溹ぞ啶ㄠ 啶掂ぞ啶侧ぞ 啶す啶侧ぞ 啶掂ぞ啶曕啶� 啶嗋ぎ啶む啶� 啶ぐ 啶忇 啶膏啶掂ぞ啶椸い 啶曕 啶班啶� 啶啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷�',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: '啶啶侧-啶呧お',
+      description:
+        '啶呧啶侧 啶啶班ざ啷嵿え 啶膏啶澿ぞ啶� 啶膏啶� 啶曕ぐ啶ㄠぞ 啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶啶灌い啶� 啶氞啶� 啶︵ 啶膏啶むぞ 啶灌啷�',
+      resDes: '啶夃お啶啶椸啶班啶むぞ 啶曕 啶呧啶侧 啶啶班ざ啷嵿え 啶曕 啶侧た啶� 3 啶膏啶澿ぞ啶掂イ',
+      tryToAsk: '啶啶涏え啷� 啶曕ぞ 啶啶班く啶距じ 啶曕ぐ啷囙',
+    },
+    moreLikeThis: {
+      title: '啶愢じ啶� 啶斷ぐ',
+      description:
+        '啶忇 啶ぞ啶� 啶啶� 啶曕 啶ぞ啶� 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啷囙, 啶斷ぐ 啶た啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙 啶斷ぐ 啶溹ぞ啶班 啶班啷囙',
+      generateNumTip: '啶啶班い啷嵿く啷囙 啶夃い啷嵿お啶ㄠ啶� 啶膏ぎ啶� 啶曕 啶膏啶栢啶ぞ',
+      tip: '啶囙じ 啶膏啶掂た啶оぞ 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶ㄠ 啶膏 啶呧い啶苦ぐ啶苦啷嵿い 啶熰啶曕え 啶栢ぐ啷嵿 啶灌啶椸ぞ',
+    },
+    speechToText: {
+      title: '啶掂ぞ啶曕 啶膏 啶ぞ啶�',
+      description: '啶膏啷嵿ぐ啶苦く 啶灌啶ㄠ 啶ぐ, 啶嗋お 啶掂啶じ 啶囙え啶啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+      resDes: '啶掂啶じ 啶囙え啶啶� 啶膏啷嵿ぐ啶苦く 啶灌',
+    },
+    textToSpeech: {
+      title: '啶ぞ啶� 啶膏 啶掂ぞ啶曕',
+      description: '啶膏啷嵿ぐ啶苦く 啶灌啶ㄠ 啶ぐ, 啶ぞ啶� 啶曕 啶掂ぞ啶曕 啶啶� 啶ぐ啶苦さ啶班啶むた啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌啷�',
+      resDes: '啶ぞ啶� 啶膏 啶戉ぁ啶苦く啷� 啶膏啷嵿ぐ啶苦く 啶灌',
+    },
+    citation: {
+      title: '啶夃う啷嵿ぇ啶班ぃ 啶斷ぐ 啶膏啶︵ぐ啷嵿き',
+      description:
+        '啶膏啷嵿ぐ啶苦く 啶灌啶ㄠ 啶ぐ, 啶夃い啷嵿お啶ㄠ啶� 啶膏ぞ啶啷嵿ぐ啷� 啶曕 啶膏啶班啶� 啶︵じ啷嵿い啶距さ啷囙啶� 啶斷ぐ 啶膏啶︵ぐ啷嵿き啶苦い 啶呧え啷佮き啶距 啶︵た啶栢ぞ啶忇啷�',
+      resDes: '啶夃う啷嵿ぇ啶班ぃ 啶斷ぐ 啶膏啶︵ぐ啷嵿き 啶膏啷嵿ぐ啶苦く 啶灌',
+    },
+    annotation: {
+      title: '啶忇え啷嬥啷囙ざ啶� 啶夃い啷嵿い啶�',
+      description:
+        '啶嗋お 啶夃啷嵿-啶椸啶`さ啶む啶むぞ 啶掂ぞ啶侧 啶夃い啷嵿い啶� 啶曕 啶曕啶� 啶啶� 啶啶ㄠ啶啶呧げ 啶班啶� 啶膏 啶溹啶∴ぜ 啶膏啶む 啶灌啶� 啶むぞ啶曕た 啶膏ぎ啶距え 啶夃お啶啶椸啶班啶むぞ 啶啶班ざ啷嵿え啷嬥 啶膏 啶啶班ぞ啶ムぎ啶苦啶むぞ 啶膏 啶啶� 啶栢ぞ啶ぞ 啶溹ぞ 啶膏啷囙イ',
+      resDes: '啶忇え啷嬥啷囙ざ啶� 啶啶班い啶苦啷嵿ぐ啶苦く啶� 啶膏啷嵿ぐ啶苦く 啶灌',
+      scoreThreshold: {
+        title: '啶膏啶曕啶� 啶ム啶班啶多啶侧啶�',
+        description:
+          '啶忇え啷嬥啷囙ざ啶� 啶夃い啷嵿い啶� 啶曕 啶侧た啶� 啶膏ぎ啶距え啶むぞ 啶ム啶班啶多啶侧啶� 啶膏啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷�',
+        easyMatch: '啶嗋じ啶距え 啶啶�',
+        accurateMatch: '啶膏啷�啶� 啶啶�',
+      },
+      matchVariable: {
+        title: '啶啶� 啶氞ぐ',
+        choosePlaceholder: '啶啶� 啶氞ぐ 啶氞啶ㄠ啶�',
+      },
+      cacheManagement: '啶忇え啷嬥啷囙ざ啶�',
+      cached: '啶忇え啷嬥啷囙啷囙ぁ',
+      remove: '啶ㄠた啶曕ぞ啶侧啶�',
+      removeConfirm: '啶囙じ 啶忇え啷嬥啷囙ざ啶� 啶曕 啶灌啶距啶�?',
+      add: '啶忇え啷嬥啷囙ざ啶� 啶溹啶∴ぜ啷囙',
+      edit: '啶忇え啷嬥啷囙ざ啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+    },
+    dataSet: {
+      title: '啶啶班じ啶傕',
+      noData: '啶嗋お 啶膏啶︵ぐ啷嵿き 啶曕 啶班啶� 啶啶� 啶溹啶炧ぞ啶� 啶嗋く啶距い 啶曕ぐ 啶膏啶む 啶灌啶�',
+      words: '啶多が啷嵿う',
+      textBlocks: '啶ぞ啶� 啶栢啶�',
+      selectTitle: '啶膏啶︵ぐ啷嵿き 啶溹啶炧ぞ啶� 啶曕ぞ 啶氞く啶� 啶曕ぐ啷囙',
+      selected: '啶溹啶炧ぞ啶� 啶氞啶ㄠぞ 啶椸く啶�',
+      noDataSet: '啶曕啶� 啶溹啶炧ぞ啶� 啶ㄠす啷�啶� 啶た啶侧ぞ',
+      toCreate: '啶え啶距え啷� 啶曕 啶侧た啶� 啶溹ぞ啶忇',
+      notSupportSelectMulti: '啶掂ぐ啷嵿い啶ぞ啶� 啶啶� 啶曕啶掂げ 啶忇 啶溹啶炧ぞ啶� 啶曕ぞ 啶膏ぎ啶班啶ムえ 啶曕ぐ啶むぞ 啶灌',
+      queryVariable: {
+        title: '啶曕啶掂啶班 啶氞ぐ',
+        tip: '啶囙じ 啶氞ぐ 啶曕 啶啶班じ啶傕 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶曕 啶侧た啶� 啶曕啶掂啶班 啶囙え啶啶� 啶曕 啶班啶� 啶啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶忇啶�, 啶囙じ 啶氞ぐ 啶曕 啶囙え啶啶� 啶膏 啶膏啶啶оた啶� 啶啶班じ啶傕 啶溹ぞ啶ㄠ啶距ぐ啷� 啶啶班ぞ啶啶� 啶曕ぐ啶ㄠぞ啷�',
+        choosePlaceholder: '啶曕啶掂啶班 啶氞ぐ 啶氞啶ㄠ啶�',
+        noVar: '啶曕啶� 啶氞ぐ 啶ㄠす啷�啶�',
+        noVarTip: '啶曕啶く啶� 啶掂啶班た啶忇が啶侧啶� 啶膏啶曕啶多え 啶曕 啶むす啶� 啶忇 啶氞ぐ 啶え啶距啶�',
+        unableToQueryDataSet: '啶溹啶炧ぞ啶� 啶曕 啶曕啶掂啶班 啶曕ぐ啶ㄠ 啶啶� 啶呧じ啶ぐ啷嵿ぅ',
+        unableToQueryDataSetTip:
+          '啶溹啶炧ぞ啶� 啶曕 啶膏か啶侧い啶距お啷傕ぐ啷嵿さ啶� 啶曕啶掂啶班 啶曕ぐ啶ㄠ 啶啶� 啶呧じ啶ぐ啷嵿ぅ, 啶曕啶く啶� 啶啶班じ啶傕 啶呧え啷佮き啶距 啶啶� 啶忇 啶膏啶︵ぐ啷嵿き 啶曕啶掂啶班 啶氞ぐ 啶氞啶ㄠ啶傕イ',
+        ok: '啶犩啶� 啶灌',
+        contextVarNotEmpty: '啶膏啶︵ぐ啷嵿き 啶曕啶掂啶班 啶氞ぐ 啶栢ぞ啶侧 啶ㄠす啷�啶� 啶灌 啶膏啶むぞ',
+        deleteContextVarTitle: '啶氞ぐ "{{varName}}" 啶曕 啶灌啶距啶�?',
+        deleteContextVarTip:
+          '啶囙じ 啶氞ぐ 啶曕 啶膏啶︵ぐ啷嵿き 啶曕啶掂啶班 啶氞ぐ 啶曕 啶班啶� 啶啶� 啶膏啶� 啶曕た啶ぞ 啶椸く啶� 啶灌, 啶斷ぐ 啶囙じ啷� 啶灌啶距え啷� 啶膏 啶溹啶炧ぞ啶� 啶曕ぞ 啶膏ぞ啶ぞ啶ㄠ啶� 啶夃お啶啶� 啶啶班き啶距さ啶苦い 啶灌啶椸ぞ啷� 啶う啶� 啶嗋お啶曕 啶囙じ啷� 啶呧き啷� 啶 啶灌啶距え啷� 啶曕 啶嗋さ啶多啶啶むぞ 啶灌, 啶む 啶曕啶く啶� 啶膏啶︵ぐ啷嵿き 啶呧え啷佮き啶距 啶啶� 啶囙じ啷� 啶啶ㄠ 啶氞啶ㄠ啶傕イ',
+      },
+    },
+    tools: {
+      title: '啶夃お啶曕ぐ啶�',
+      tips: '啶夃お啶曕ぐ啶� 啶夃お啶啶椸啶班啶むぞ 啶囙え啶啶� 啶ぞ 啶氞ぐ 啶曕 啶呧え啷佮ぐ啷嬥ぇ 啶ぞ啶う啶傕ぁ啷嬥 啶曕 啶班啶� 啶啶� 啶侧啶む 啶灌啶� 啶ぞ啶灌ぐ啷� 啶∴啶熰ぞ 啶曕 啶膏啶︵ぐ啷嵿き 啶曕 啶班啶� 啶啶� 啶曕啶掂啶班 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶忇 啶ぞ啶ㄠ 啶忇お啷�啶嗋 啶曕啶� 啶掂た啶оた 啶啶班う啶距え 啶曕ぐ啶む 啶灌啶傕イ',
+      toolsInUse: '{{count}} 啶夃お啶啶� 啶啶� 啶夃お啶曕ぐ啶�',
+      modal: {
+        title: '啶夃お啶曕ぐ啶�',
+        toolType: {
+          title: '啶夃お啶曕ぐ啶� 啶啶班啶距ぐ',
+          placeholder: '啶曕啶く啶� 啶夃お啶曕ぐ啶� 啶啶班啶距ぐ 啶氞啶ㄠ啶�',
+        },
+        name: {
+          title: '啶ㄠぞ啶�',
+          placeholder: '啶曕啶く啶� 啶ㄠぞ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+        },
+        variableName: {
+          title: '啶氞ぐ 啶曕ぞ 啶ㄠぞ啶�',
+          placeholder: '啶曕啶く啶� 啶氞ぐ 啶曕ぞ 啶ㄠぞ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+        },
+      },
+    },
+    conversationHistory: {
+      title: '啶膏啶掂ぞ啶� 啶囙い啶苦す啶距じ',
+      description: '啶膏啶掂ぞ啶� 啶啶た啶曕ぞ啶撪 啶曕 啶侧た啶� 啶夃お啶膏ぐ啷嵿 啶ㄠぞ啶� 啶膏啶� 啶曕ぐ啷囙',
+      tip: '啶膏啶掂ぞ啶� 啶囙い啶苦す啶距じ 啶膏啷嵿し啶� 啶ㄠす啷�啶� 啶灌, 啶曕啶く啶� 啶娻お啶� 啶︵た啶� 啶椸 啶啶班啶啶啶� 啶啶� <histories> 啶溹啶∴ぜ啷囙啷�',
+      learnMore: '啶斷ぐ 啶呧ぇ啶苦 啶溹ぞ啶ㄠ啶�',
+      editModal: {
+        title: '啶膏啶掂ぞ啶� 啶啶た啶曕ぞ 啶ㄠぞ啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+        userPrefix: '啶夃お啶啶椸啶班啶むぞ 啶夃お啶膏ぐ啷嵿',
+        assistantPrefix: '啶膏す啶距く啶� 啶夃お啶膏ぐ啷嵿',
+      },
+    },
+    toolbox: {
+      title: '啶夃お啶曕ぐ啶� 啶啶曕啶�',
+    },
+    moderation: {
+      title: '啶膏ぞ啶啷嵿ぐ啷� 啶啶∴ぐ啷囙ざ啶�',
+      description:
+        '啶啶∴ぐ啷囙ざ啶� 啶忇お啷�啶嗋 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕 啶ぞ 啶膏啶掂啶︵え啶多啶� 啶多が啷嵿う 啶膏啶氞 啶え啶距 啶班啶曕ぐ 啶啶∴げ 啶嗋啶熰お啷佮 啶曕 啶膏啶班啷嵿し啶苦い 啶曕ぐ啷囙啷�',
+      allEnabled: '啶囙え啶啶�/啶嗋啶熰お啷佮 啶膏ぞ啶啷嵿ぐ啷� 啶膏啷嵿し啶�',
+      inputEnabled: '啶囙え啶啶� 啶膏ぞ啶啷嵿ぐ啷� 啶膏啷嵿し啶�',
+      outputEnabled: '啶嗋啶熰お啷佮 啶膏ぞ啶啷嵿ぐ啷� 啶膏啷嵿し啶�',
+      modal: {
+        title: '啶膏ぞ啶啷嵿ぐ啷� 啶啶∴ぐ啷囙ざ啶� 啶膏啶熰た啶傕啷嵿じ',
+        provider: {
+          title: '啶啶班う啶距い啶�',
+          openai: '啶撪お啶ㄠ啶嗋 啶啶∴ぐ啷囙ざ啶�',
+          openaiTip: {
+            prefix: '啶撪お啶ㄠ啶嗋 啶啶∴ぐ啷囙ざ啶� 啶曕 啶侧た啶�',
+            suffix:
+              '啶啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕た啶� 啶椸 啶撪お啶ㄠ啶嗋 啶忇お啷�啶嗋 啶曕啶傕啷� 啶曕 啶嗋さ啶多啶啶むぞ 啶灌啶む 啶灌啷�',
+          },
+          keywords: '啶曕啶掂ぐ啷嵿ぁ',
+        },
+        keywords: {
+          tip: '啶啶班い啷嵿く啷囙 啶啶曕啶むた 啶啶� 啶忇, 啶啶曕啶むた 啶掂た啶ぞ啶溹え啷嬥 啶膏 啶呧げ啶椸イ 啶啶班い啶� 啶啶曕啶むた 100 啶呧啷嵿し啶班啶� 啶む啷�',
+          placeholder: '啶啶班い啷嵿く啷囙 啶啶曕啶むた 啶啶� 啶忇, 啶啶曕啶むた 啶掂た啶ぞ啶溹え啷嬥 啶膏 啶呧げ啶�',
+          line: '啶啶曕啶むた',
+        },
+        content: {
+          input: '啶囙え啶啶� 啶膏ぞ啶啷嵿ぐ啷� 啶啶∴ぐ啷囙 啶曕ぐ啷囙',
+          output: '啶嗋啶熰お啷佮 啶膏ぞ啶啷嵿ぐ啷� 啶啶∴ぐ啷囙 啶曕ぐ啷囙',
+          preset: '啶啶班啶掂え啶苦ぐ啷嵿ぇ啶距ぐ啶苦い 啶夃い啷嵿い啶�',
+          placeholder: '啶す啶距 啶啶班啶掂え啶苦ぐ啷嵿ぇ啶距ぐ啶苦い 啶夃い啷嵿い啶� 啶膏ぞ啶啷嵿ぐ啷� 啶∴ぞ啶侧啶�',
+          condition: '啶囙え啶啶� 啶斷ぐ 啶嗋啶熰お啷佮 啶膏ぞ啶啷嵿ぐ啷� 啶啶∴ぐ啷囙 啶曕ぐ啷囙 啶膏啷嵿し啶� 啶灌啶ㄠ 啶氞ぞ啶灌た啶�',
+          fromApi: '啶啶班啶掂え啶苦ぐ啷嵿ぇ啶距ぐ啶苦い 啶夃い啷嵿い啶� 啶忇お啷�啶嗋 啶︵啶掂ぞ啶班ぞ 啶侧啶熰ぞ啶� 啶溹ぞ啶む 啶灌啶�',
+          errorMessage: '啶啶班啶掂え啶苦ぐ啷嵿ぇ啶距ぐ啶苦い 啶夃い啷嵿い啶� 啶栢ぞ啶侧 啶ㄠす啷�啶� 啶灌 啶膏啶む',
+          supportMarkdown: '啶ぞ啶班啶曕ぁ啶距啶� 啶膏ぎ啶班啶ムた啶�',
+        },
+        openaiNotConfig: {
+          before: '啶撪お啶ㄠ啶嗋 啶啶∴ぐ啷囙ざ啶� 啶曕 啶侧た啶�',
+          after: '啶啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕た啶� 啶椸 啶撪お啶ㄠ啶嗋 啶忇お啷�啶嗋 啶曕啶傕啷� 啶曕 啶嗋さ啶多啶啶むぞ 啶灌啶む 啶灌啷�',
+        },
+      },
+    },
+  },
+  automatic: {
+    title: '啶膏啶掂啶距げ啶苦い 啶呧え啷佮お啷嵿ぐ啶啶� 啶嗋く啷嬥啶�',
+    description:
+      '啶呧お啶ㄠぞ 啶ぐ啶苦う啷冟ざ啷嵿く 啶掂ぐ啷嵿ぃ啶苦い 啶曕ぐ啷囙, 啶∴た啶ぞ啶� 啶嗋お啶曕 啶侧た啶� 啶忇 啶呧え啷佮お啷嵿ぐ啶啶� 啶嗋く啷嬥啶苦い 啶曕ぐ啷囙啶距イ',
+    intendedAudience: '啶侧啷嵿し啶苦い 啶︵ぐ啷嵿ざ啶� 啶曕啶� 啶灌啶�?',
+    intendedAudiencePlaceHolder: '啶夃う啶�. 啶涏ぞ啶む啶�',
+    solveProblem: '啶掂 啶曕啶� 啶膏 啶膏ぎ啶膏啶ぞ啶忇 啶灌啶� 啶溹た啶ㄠ啶灌啶� 啶忇啶� 啶夃え啶曕 啶侧た啶� 啶灌げ 啶曕ぐ 啶膏啶むぞ 啶灌?',
+    solveProblemPlaceHolder:
+      '啶夃う啶�. 啶侧啶 啶班た啶啶班啶� 啶斷ぐ 啶侧啶� 啶膏 啶呧啶むぐ啷嵿う啷冟し啷嵿啶� 啶ㄠた啶曕ぞ啶侧啶� 啶斷ぐ 啶溹ぞ啶ㄠ啶距ぐ啷� 啶曕 啶膏啶曕啶粪啶� 啶啶� 啶啶班じ啷嵿い啷佮い 啶曕ぐ啷囙',
+    generate: '啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啷囙',
+    audiencesRequired: '啶︵ぐ啷嵿ざ啶曕啶� 啶曕 啶嗋さ啶多啶啶むぞ 啶灌',
+    problemRequired: '啶膏ぎ啶膏啶ぞ 啶嗋さ啶多啶 啶灌',
+    resTitle: '啶灌ぎ啶ㄠ 啶嗋お啶曕 啶侧た啶� 啶ㄠた啶啶ㄠげ啶苦啶苦い 啶呧え啷佮お啷嵿ぐ啶啶� 啶嗋く啷嬥啶苦い 啶曕た啶ぞ 啶灌啷�',
+    apply: '啶囙じ 啶嗋く啷嬥啶� 啶曕 啶侧ぞ啶椸 啶曕ぐ啷囙',
+    noData:
+      '啶ぞ啶堗 啶撪ぐ 啶呧お啶ㄠ 啶夃お啶啶� 啶ぞ啶げ啷� 啶曕ぞ 啶掂ぐ啷嵿ぃ啶� 啶曕ぐ啷囙, 啶嗋く啷嬥啶� 啶啶班啶掂ぞ啶掂げ啷嬥啶� 啶す啶距 啶︵た啶栢ぞ啶� 啶︵啶椸ぞ啷�',
+    loading: '啶嗋お啶曕 啶侧た啶� 啶呧え啷佮お啷嵿ぐ啶啶� 啶嗋く啷嬥啶苦い 啶曕ぐ 啶班す啷� 啶灌啶�...',
+    overwriteTitle: '啶啶溹啶︵ぞ 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶曕 啶呧ぇ啶苦げ啷囙啶苦い 啶曕ぐ啷囙?',
+    overwriteMessage:
+      '啶囙じ 啶嗋く啷嬥啶� 啶曕 啶侧ぞ啶椸 啶曕ぐ啶ㄠ 啶膏 啶啶溹啶︵ぞ 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶呧ぇ啶苦げ啷囙啶苦い 啶灌 啶溹ぞ啶忇啶距イ',
+  },
+  resetConfig: {
+    title: '啶班啶膏啶� 啶曕 啶啶粪啶熰た 啶曕ぐ啷囙?',
+    message:
+      '啶班啶膏啶� 啶ぐ啶苦さ啶班啶むえ啷嬥 啶曕 啶む啶ぞ啶� 啶︵啶むぞ 啶灌, 啶呧啶むた啶� 啶啶班啶距ざ啶苦い 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶曕 啶啶ㄠぐ啷嵿じ啷嵿ぅ啶距お啶苦い 啶曕ぐ啶むぞ 啶灌啷�',
+  },
+  errorMessage: {
+    nameOfKeyRequired: '啶曕啶傕啷� 啶曕ぞ 啶ㄠぞ啶�: {{key}} 啶嗋さ啶多啶',
+    valueOfVarRequired: '{{key}} 啶啶侧啶� 啶栢ぞ啶侧 啶ㄠす啷�啶� 啶灌 啶膏啶むぞ',
+    queryRequired: '啶呧え啷佮ぐ啷嬥ぇ 啶ぞ啶� 啶嗋さ啶多啶 啶灌啷�',
+    waitForResponse:
+      '啶曕啶く啶� 啶た啶涏げ啷� 啶膏啶︵啶� 啶曕 啶啶班い啶苦啷嵿ぐ啶苦く啶� 啶啶班 啶灌啶ㄠ 啶む 啶啶班い啷�啶曕啶粪ぞ 啶曕ぐ啷囙啷�',
+    waitForBatchResponse:
+      '啶曕啶く啶� 啶啶� 啶曕ぞ啶班啶� 啶曕 啶啶班い啶苦啷嵿ぐ啶苦く啶� 啶啶班 啶灌啶ㄠ 啶む 啶啶班い啷�啶曕啶粪ぞ 啶曕ぐ啷囙啷�',
+    notSelectModel: '啶曕啶く啶� 啶忇 啶啶∴げ 啶氞啶ㄠ啶�',
+    waitForImgUpload: '啶曕啶く啶� 啶涏さ啶� 啶呧お啶侧啶� 啶灌啶ㄠ 啶む 啶啶班い啷�啶曕啶粪ぞ 啶曕ぐ啷囙',
+  },
+  chatSubTitle: '啶ㄠた啶班啶︵啶�',
+  completionSubTitle: '啶啶班ぞ啶班啶た啶� 啶啶班啶啶啶�',
+  promptTip:
+    '啶啶班啶啶啶� 啶忇啶� 啶啶班い啶苦啷嵿ぐ啶苦く啶距啶� 啶曕 啶ㄠた啶班啶︵啶多啶� 啶斷ぐ 啶膏啶ぞ啶撪 啶曕 啶膏ぞ啶� 啶ぞ啶班啶椸う啶班啶多え 啶曕ぐ啶むぞ 啶灌啷� {{input}} 啶溹啶膏 啶掂啶班た啶忇が啶� 啶膏ぎ啷嵿ぎ啶苦げ啶苦い 啶曕ぐ啷囙啷� 啶す 啶啶班啶啶啶� 啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶︵た啶栢ぞ啶� 啶ㄠす啷�啶� 啶︵啶椸ぞ啷�',
+  formattingChangedTitle: '啶膏啶掂ぐ啷傕お啶� 啶う啶侧ぞ 啶椸く啶�',
+  formattingChangedText:
+    '啶膏啶掂ぐ啷傕お啶� 啶曕 啶膏啶多啶оた啶� 啶曕ぐ啶ㄠ 啶膏 啶∴た啶 啶曕啶粪啶む啶� 啶班啶膏啶� 啶灌 啶溹ぞ啶忇啶�, 啶曕啶ぞ 啶嗋お 啶ㄠた啶多啶氞た啶� 啶灌啶�?',
+  variableTitle: '啶掂啶班た啶忇が啶侧啶�',
+  variableTip:
+    '啶夃お啶啶椸啶班啶むぞ 啶掂啶班た啶忇が啶侧啶� 啶曕 啶ぐ啶む 啶灌啶�, 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶啶班啶啶啶� 啶啶� 啶掂啶班た啶忇が啶侧啶� 啶曕 啶啶班い啶苦じ啷嵿ぅ啶距お啶苦い 啶曕ぐ啶む 啶灌啶傕イ',
+  notSetVar:
+    '啶掂啶班た啶忇が啶侧啶� 啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶啶班啶� 啶ぐ啶む 啶膏ぎ啶� 啶啶班啶啶啶� 啶多が啷嵿う 啶ぞ 啶啶班ぞ啶班啶た啶� 啶熰た啶啶ぃ啷� 啶啶班じ啷嵿い啷佮い 啶曕ぐ啶ㄠ 啶曕 啶呧え啷佮ぎ啶むた 啶︵啶む 啶灌啶傕イ 啶嗋お 啶啶班啶啶啶� 啶多が啷嵿う啷嬥 啶啶� \'{{input}}\' 啶︵ぐ啷嵿 啶曕ぐ啶ㄠ 啶曕ぞ 啶啶班く啶距じ 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+  autoAddVar:
+    '啶啶班ぞ啶班啶た啶� 啶啶班啶啶啶� 啶啶� 啶ㄠた啶班啶︵た啶粪啶� 啶掂啶班た啶忇が啶侧啶� 啶呧お啶班た啶ぞ啶粪た啶� 啶灌啶�, 啶曕啶ぞ 啶嗋お 啶夃え啷嵿す啷囙 啶夃お啶啶椸啶班啶むぞ 啶囙え啶啶� 啶啶班啶� 啶啶� 啶溹啶∴ぜ啶ㄠぞ 啶氞ぞ啶灌い啷� 啶灌啶�?',
+  variableTable: {
+    key: '啶掂啶班た啶忇が啶� 啶曕啶傕啷�',
+    name: '啶夃お啶啶椸啶班啶むぞ 啶囙え啶啶� 啶ぜ啷�啶侧啶� 啶ㄠぞ啶�',
+    optional: '啶掂啶曕げ啷嵿お啶苦',
+    type: '啶囙え啶啶� 啶啶班啶距ぐ',
+    action: '啶曕啶班た啶ぞ啶忇',
+    typeString: '啶膏啶熰啶班た啶傕',
+    typeSelect: '啶氞啶ㄠ啶�',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{key}} 啶嗋さ啶多啶 啶灌',
+    tooLong:
+      '{{key}} 啶す啷佮い 啶侧啶 啶灌啷� 30 啶掂ぐ啷嵿ぃ啷嬥 啶膏 啶呧ぇ啶苦 啶ㄠす啷�啶� 啶灌 啶膏啶む',
+    notValid:
+      '{{key}} 啶呧さ啷堗ぇ 啶灌啷� 啶曕啶掂げ 啶呧啷嵿し啶�, 啶膏啶栢啶ぞ啶忇, 啶斷ぐ 啶呧啶∴ぐ啶膏啶曕啶� 啶多ぞ啶た啶� 啶灌 啶膏啶む 啶灌啶�',
+    notStartWithNumber:
+      '{{key}} 啶忇 啶膏啶栢啶ぞ 啶膏 啶啶班ぞ啶班啶� 啶ㄠす啷�啶� 啶灌 啶膏啶む',
+    keyAlreadyExists: '{{key}} 啶す啶侧 啶膏 啶啶溹啶� 啶灌',
+  },
+  otherError: {
+    promptNoBeEmpty: '啶啶班啶啶啶� 啶栢ぞ啶侧 啶ㄠす啷�啶� 啶灌 啶膏啶むぞ',
+    historyNoBeEmpty: '啶膏啶掂ぞ啶� 啶囙い啶苦す啶距じ 啶啶班啶啶啶� 啶啶� 啶膏啶� 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶�',
+    queryNoBeEmpty: '啶啶班ざ啷嵿え 啶啶班啶啶啶� 啶啶� 啶膏啶� 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶�',
+  },
+  variableConfig: {
+    'addModalTitle': '啶囙え啶啶� 啶ぜ啷�啶侧啶� 啶溹啶∴ぜ啷囙',
+    'editModalTitle': '啶囙え啶啶� 啶ぜ啷�啶侧啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+    'description': '啶掂啶班た啶忇が啶� {{varName}} 啶曕 啶侧た啶� 啶膏啶熰た啶傕',
+    'fieldType': '啶ぜ啷�啶侧啶� 啶啶班啶距ぐ',
+    'string': '啶涏啶熰ぞ 啶ぞ啶�',
+    'text-input': '啶涏啶熰ぞ 啶ぞ啶�',
+    'paragraph': '啶呧え啷佮啷嵿啷囙う',
+    'select': '啶氞啶ㄠ啶�',
+    'number': '啶膏啶栢啶ぞ',
+    'notSet':
+      '啶膏啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶�, 啶啶班ぞ啶班啶た啶� 啶啶班啶啶啶� 啶啶� {{input}} 啶熰ぞ啶囙お 啶曕ぐ啶ㄠ 啶曕ぞ 啶啶班く啶距じ 啶曕ぐ啷囙',
+    'stringTitle': '啶啶班啶� 啶熰啶曕啶膏啶� 啶啶曕啶� 啶掂た啶曕げ啷嵿お',
+    'maxLength': '啶呧ぇ啶苦啶むぎ 啶侧啶ぞ啶�',
+    'options': '啶掂た啶曕げ啷嵿お',
+    'addOption': '啶掂た啶曕げ啷嵿お 啶溹啶∴ぜ啷囙',
+    'apiBasedVar': '啶忇お啷�啶嗋-啶嗋ぇ啶距ぐ啶苦い 啶掂啶班た啶忇が啶�',
+    'varName': '啶掂啶班た啶忇が啶� 啶ㄠぞ啶�',
+    'labelName': '啶侧啶げ 啶ㄠぞ啶�',
+    'inputPlaceholder': '啶曕啶く啶� 啶囙え啶啶� 啶曕ぐ啷囙',
+    'content': '啶膏ぞ啶啷嵿ぐ啷�',
+    'required': '啶嗋さ啶多啶',
+    'errorMsg': {
+      varNameRequired: '啶掂啶班た啶忇が啶� 啶ㄠぞ啶� 啶嗋さ啶多啶 啶灌',
+      labelNameRequired: '啶侧啶げ 啶ㄠぞ啶� 啶嗋さ啶多啶 啶灌',
+      varNameCanBeRepeat: '啶掂啶班た啶忇が啶� 啶ㄠぞ啶� 啶︵啶灌ぐ啶距く啶� 啶ㄠす啷�啶� 啶溹ぞ 啶膏啶むぞ',
+      atLeastOneOption: '啶曕ぎ 啶膏 啶曕ぎ 啶忇 啶掂た啶曕げ啷嵿お 啶嗋さ啶多啶 啶灌',
+      optionRepeat: '啶掂た啶曕げ啷嵿お 啶︵啶灌ぐ啶距 啶椸 啶灌啶�',
+    },
+  },
+  vision: {
+    name: '啶掂た啶溹え',
+    description:
+      '啶掂た啶溹え 啶膏啷嵿し啶� 啶曕ぐ啶ㄠ 啶膏 啶啶∴げ 啶曕 啶涏さ啶苦く啷嬥 啶曕 啶侧啶ㄠ 啶斷ぐ 啶夃え啶曕 啶ぞ啶班 啶啶� 啶啶班ざ啷嵿え啷嬥 啶曕ぞ 啶夃い啷嵿い啶� 啶︵啶ㄠ 啶曕 啶呧え啷佮ぎ啶むた 啶た啶侧啶椸啷�',
+    settings: '啶膏啶熰た啶傕啷嵿じ',
+    visionSettings: {
+      title: '啶掂た啶溹え 啶膏啶熰た啶傕啷嵿じ',
+      resolution: '啶班啶溹ぜ啷嬥げ啷嵿く啷傕ざ啶�',
+      resolutionTooltip:
+        '啶曕ぎ 啶班啶溹ぜ啷嬥げ啷嵿く啷傕ざ啶� 啶啶∴げ 啶曕 512 x 512 啶た啶曕啶膏啶� 啶曕 啶曕ぎ-啶班啶溹ぜ啷嬥げ啷嵿く啷傕ざ啶� 啶涏さ啶� 啶啶班ぞ啶啶� 啶曕ぐ啶ㄠ 啶曕 啶呧え啷佮ぎ啶むた 啶︵啶椸ぞ, 啶斷ぐ 啶涏さ啶� 啶曕 65 啶熰啶曕え啷嬥 啶曕 啶啶� 啶曕 啶膏ぞ啶� 啶啶班じ啷嵿い啷佮い 啶曕ぐ啷囙啶距イ 啶囙じ啶膏 啶忇お啷�啶嗋 啶曕 啶む啶溹 啶膏 啶夃い啷嵿い啶� 啶︵啶ㄠ 啶斷ぐ 啶曕ぎ 啶囙え啶啶� 啶熰啶曕え啷嬥 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶ㄠ 啶曕 啶膏啶掂た啶оぞ 啶た啶侧い啷� 啶灌 啶溹 啶夃啷嵿 啶掂た啶掂ぐ啶� 啶曕 啶嗋さ啶多啶啶むぞ 啶ㄠす啷�啶� 啶班啶む 啶灌啶傕イ \n 啶夃啷嵿 啶班啶溹ぜ啷嬥げ啷嵿く啷傕ざ啶� 啶す啶侧 啶啶∴げ 啶曕 啶曕ぎ 啶班啶溹ぜ啷嬥げ啷嵿く啷傕ざ啶� 啶涏さ啶� 啶︵啶栢え啷� 啶曕 啶呧え啷佮ぎ啶むた 啶︵啶椸ぞ 啶斷ぐ 啶た啶� 啶囙え啶啶� 啶涏さ啶� 啶曕 啶嗋啶距ぐ 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 512px 啶掂ぐ啷嵿 啶曕 啶班啶� 啶啶� 啶掂た啶膏啶む啶� 啶曕啶班啶啶� 啶え啶距啶椸ぞ啷� 啶啶班い啷嵿く啷囙 啶掂た啶膏啶む啶� 啶曕啶班啶� 啶曕 啶侧た啶� 啶熰啶曕え 啶啶� 啶︵啶椸啶ㄠぞ 啶灌啶むぞ 啶灌, 啶曕啶� 129 啶熰啶曕え啷�',
+      high: '啶夃啷嵿',
+      low: '啶曕ぎ',
+      uploadMethod: '啶呧お啶侧啶� 啶掂た啶оた',
+      both: '啶︵啶ㄠ啶�',
+      localUpload: '啶膏啶ムぞ啶ㄠ啶� 啶呧お啶侧啶�',
+      url: '啶啶嗋ぐ啶忇げ',
+      uploadLimit: '啶呧お啶侧啶� 啶膏啶ぞ',
+    },
+  },
+  voice: {
+    name: '啶掂啶じ',
+    defaultDisplay: '啶∴た啶ぜ啷夃げ啷嵿 啶掂啶じ',
+    description: '啶熰啶曕啶膏啶� 啶熰 啶膏啶啶� 啶掂啶じ 啶膏啶熰た啶傕啷嵿じ',
+    settings: '啶膏啶熰た啶傕啷嵿じ',
+    voiceSettings: {
+      title: '啶掂啶じ 啶膏啶熰た啶傕啷嵿じ',
+      language: '啶ぞ啶粪ぞ',
+      resolutionTooltip: '啶熰啶曕啶膏啶�-啶熰-啶膏啶啶� 啶掂啶じ 啶膏お啷嬥ぐ啷嵿 啶ぞ啶粪ぞ啷�',
+      voice: '啶掂啶じ',
+      autoPlay: '啶戉啷� 啶啶侧',
+      autoPlayEnabled: '啶氞ぞ啶侧 啶曕ぐ啶`',
+      autoPlayDisabled: '啶膏啶∴ぞ',
+    },
+  },
+  openingStatement: {
+    title: '啶膏啶掂ぞ啶� 啶啶班ぞ啶班啶',
+    add: '啶溹啶∴ぜ啷囙',
+    writeOpener: '啶啶班ぞ啶班啶 啶侧た啶栢啶�',
+    placeholder:
+      '啶す啶距 啶呧お啶ㄠぞ 啶啶班ぞ啶班啶 啶膏啶︵啶� 啶侧た啶栢啶�, 啶嗋お 啶掂啶班た啶忇が啶侧啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ 啶膏啶む 啶灌啶�, {{variable}} 啶熰ぞ啶囙お 啶曕ぐ啶ㄠ 啶曕ぞ 啶啶班く啶距じ 啶曕ぐ啷囙啷�',
+    openingQuestion: '啶啶班ぞ啶班啶た啶� 啶啶班ざ啷嵿え',
+    noDataPlaceHolder:
+      '啶夃お啶啶椸啶班啶むぞ 啶曕 啶膏ぞ啶� 啶膏啶掂ぞ啶� 啶啶班ぞ啶班啶� 啶曕ぐ啶ㄠ 啶膏 啶忇啶� 啶曕 啶膏啶掂ぞ啶︵ぞ啶む啶 啶呧え啷佮お啷嵿ぐ啶啶椸啶� 啶啶� 啶夃え啶曕 啶膏ぞ啶� 啶ㄠた啶曕 啶膏啶啶� 啶膏啶ムぞ啶た啶� 啶曕ぐ啶ㄠ 啶啶� 啶う啶� 啶た啶� 啶膏啶む 啶灌啷�',
+    varTip:
+      '啶嗋お 啶掂啶班た啶忇が啶侧啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ 啶膏啶む 啶灌啶�, {{variable}} 啶熰ぞ啶囙お 啶曕ぐ啶ㄠ 啶曕ぞ 啶啶班く啶距じ 啶曕ぐ啷囙',
+    tooShort:
+      '啶膏啶掂ぞ啶� 啶啶班ぞ啶班啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕ぎ 啶膏 啶曕ぎ 20 啶多が啷嵿う啷嬥 啶曕 啶啶班ぞ啶班啶た啶� 啶啶班啶啶啶� 啶曕 啶嗋さ啶多啶啶むぞ 啶灌啶む 啶灌啷�',
+    notIncludeKey:
+      '啶啶班ぞ啶班啶た啶� 啶啶班啶啶啶� 啶啶� 啶掂啶班た啶忇が啶� 啶多ぞ啶た啶� 啶ㄠす啷�啶� 啶灌: {{key}}啷� 啶曕啶く啶� 啶囙じ啷� 啶啶班ぞ啶班啶た啶� 啶啶班啶啶啶� 啶啶� 啶溹啶∴ぜ啷囙啷�',
+  },
+  modelConfig: {
+    model: '啶啶∴げ',
+    setTone: '啶啶班い啶苦啷嵿ぐ啶苦く啶距啶� 啶曕 啶熰啶� 啶膏啶� 啶曕ぐ啷囙',
+    title: '啶啶∴げ 啶斷ぐ 啶啶班ぞ啶啶熰ぐ',
+    modeType: {
+      chat: '啶氞啶�',
+      completion: '啶啶班啶�',
+    },
+  },
+  inputs: {
+    title: '啶∴た啶 啶斷ぐ 啶啶班啶掂ぞ啶掂げ啷嬥啶�',
+    noPrompt:
+      '啶啶班ぞ啶班啶た啶� 啶啶班啶啶啶� 啶囙え啶啶� 啶啶� 啶曕啶� 啶啶班啶啶啶� 啶侧た啶栢え啷� 啶曕ぞ 啶啶班く啶距じ 啶曕ぐ啷囙',
+    userInputField: '啶夃お啶啶椸啶班啶むぞ 啶囙え啶啶� 啶ぜ啷�啶侧啶�',
+    noVar:
+      '啶掂啶班た啶忇が啶� 啶曕 啶啶侧啶� 啶曕 啶ぐ啷囙, 啶溹た啶膏 啶啶班い啷嵿く啷囙 啶ㄠ 啶膏い啷嵿ぐ 啶曕 啶多啶班 啶灌啶ㄠ 啶ぐ 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶啶班啶啶啶� 啶多が啷嵿う 啶啶� 啶啶班い啶苦じ啷嵿ぅ啶距お啶苦い 啶曕た啶ぞ 啶溹ぞ啶忇啶距イ',
+    chatVarTip:
+      '啶掂啶班た啶忇が啶� 啶曕 啶啶侧啶� 啶曕 啶ぐ啷囙, 啶溹た啶膏 啶啶班い啷嵿く啷囙 啶ㄠ 啶膏い啷嵿ぐ 啶曕 啶多啶班 啶灌啶ㄠ 啶ぐ 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶啶班啶啶啶� 啶多が啷嵿う 啶啶� 啶啶班い啶苦じ啷嵿ぅ啶距お啶苦い 啶曕た啶ぞ 啶溹ぞ啶忇啶�',
+    completionVarTip:
+      '啶掂啶班た啶忇が啶� 啶曕 啶啶侧啶� 啶曕 啶ぐ啷囙, 啶溹た啶膏 啶啶班い啷嵿く啷囙 啶啶班ざ啷嵿え 啶啶班じ啷嵿い啷佮い 啶曕ぐ啶ㄠ 啶ぐ 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶啶班啶啶啶� 啶多が啷嵿う啷嬥 啶啶� 啶啶班い啶苦じ啷嵿ぅ啶距お啶苦い 啶曕た啶ぞ 啶溹ぞ啶忇啶距イ',
+    previewTitle: '啶啶班啶啶啶� 啶啶班啶掂ぞ啶掂げ啷嬥啶�',
+    queryTitle: '啶啶班ざ啷嵿え 啶膏ぞ啶啷嵿ぐ啷�',
+    queryPlaceholder: '啶曕啶く啶� 啶呧え啷佮ぐ啷嬥ぇ 啶ぞ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙啷�',
+    run: '啶氞ぞ啶侧 啶曕ぐ啷囙',
+  },
+  result: '啶嗋啶熰お啷佮 啶熰啶曕啶膏啶�',
+  datasetConfig: {
+    settingTitle: '啶啶ㄠ啶啶班ぞ啶啶むた 啶膏啶熰た啶傕啷嵿じ',
+    knowledgeTip: '啶溹啶炧ぞ啶� 啶溹啶∴ぜ啶ㄠ 啶曕 啶侧た啶� "+" 啶啶� 啶ぐ 啶曕啶侧た啶� 啶曕ぐ啷囙',
+    retrieveOneWay: {
+      title: 'N-啶膏-1 啶啶ㄠ啶啶班ぞ啶啶むた',
+      description:
+        '啶夃お啶啶椸啶班啶むぞ 啶曕 啶囙ぐ啶距う啷� 啶斷ぐ 啶溹啶炧ぞ啶� 啶掂た啶掂ぐ啶`啶� 啶曕 啶嗋ぇ啶距ぐ 啶ぐ, 啶忇啷囙啶� 啶膏啶掂ぞ啶い啷嵿い 啶班啶� 啶膏 啶膏ぐ啷嵿さ啶多啶班啶粪啶� 啶溹啶炧ぞ啶� 啶曕ぞ 啶氞く啶� 啶曕ぐ啶むぞ 啶灌啷� 啶掂た啶多た啶粪啶�, 啶膏啶た啶� 啶溹啶炧ぞ啶� 啶掂ぞ啶侧 啶呧え啷佮お啷嵿ぐ啶啶椸啶� 啶曕 啶侧た啶� 啶膏ぐ啷嵿さ啶多啶班啶粪啶犩イ',
+    },
+    retrieveMultiWay: {
+      title: '啶す啷�-啶ぅ 啶啶ㄠ啶啶班ぞ啶啶むた',
+      description:
+        '啶夃お啶啶椸啶班啶むぞ 啶曕 啶囙ぐ啶距う啷� 啶曕 啶嗋ぇ啶距ぐ 啶ぐ, 啶膏き啷� 啶溹啶炧ぞ啶� 啶ぐ 啶啶班ざ啷嵿え 啶曕ぐ啶むぞ 啶灌, 啶す啷�-啶膏啶班啶む啶� 啶膏 啶啶班ぞ啶膏啶椸た啶� 啶ぞ啶� 啶啶ㄠ 啶啶班ぞ啶啶� 啶曕ぐ啶むぞ 啶灌, 啶斷ぐ 啶啶ㄠ 啶班啶傕啶苦啶� 啶曕 啶ぞ啶� 啶夃お啶啶椸啶班啶むぞ 啶啶班ざ啷嵿え 啶膏 啶啶� 啶栢ぞ啶ㄠ 啶掂ぞ啶侧 啶膏ぐ啷嵿さ啶多啶班啶粪啶� 啶ぐ啶苦ぃ啶距ぎ啷嬥 啶曕ぞ 啶氞く啶� 啶曕ぐ啶むぞ 啶灌啷� 啶啶ㄠ 啶班啶傕 啶啶∴げ 啶忇お啷�啶嗋 啶曕ぞ 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶嗋さ啶多啶 啶灌啷�',
+    },
+    rerankModelRequired: '啶班た啶班啶傕 啶啶∴げ 啶嗋さ啶多啶 啶灌',
+    params: '啶啶班ぞ啶啶熰ぐ',
+    top_k: '啶多啶班啶� K',
+    top_kTip:
+      '啶夃お啶啶椸啶班啶むぞ 啶啶班ざ啷嵿え啷嬥 啶曕 啶膏ぞ啶� 啶膏が啶膏 啶呧ぇ啶苦 啶膏ぎ啶距え啶むぞ 啶班啶ㄠ 啶掂ぞ啶侧 啶栢啶∴啶� 啶曕 啶ぜ啶苦げ啷嵿啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷� 啶氞く啶ㄠた啶� 啶啶∴げ 啶曕 max_tokens 啶曕 啶呧え啷佮じ啶距ぐ 啶啶班ぃ啶距げ啷� 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶多啶班啶� K 啶曕 啶啶侧啶� 啶曕 啶膏ぎ啶距く啷嬥啶苦い 啶曕ぐ啷囙啷�啷�',
+    score_threshold: '啶膏啶曕啶� 啶ム啶班啶多啶侧啶�',
+    score_thresholdTip:
+      '啶栢啶∴啶� 啶曕 啶ぜ啶苦げ啷嵿啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶膏ぎ啶距え啶むぞ 啶ム啶班啶多啶侧啶� 啶膏啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷�',
+    retrieveChangeTip:
+      '啶膏啶氞啶距啶� 啶啶� 啶斷ぐ 啶啶ㄠ啶啶班ぞ啶啶むた 啶啶� 啶曕 啶膏啶多啶оた啶� 啶曕ぐ啶ㄠ 啶膏 啶囙じ 啶溹啶炧ぞ啶� 啶膏 啶溹啶∴ぜ啷� 啶呧え啷佮お啷嵿ぐ啶啶� 啶啶班き啶距さ啶苦い 啶灌 啶膏啶む 啶灌啶傕イ',
+  },
+  debugAsSingleModel: '啶忇啶� 啶啶∴げ 啶曕 啶班啶� 啶啶� 啶∴た啶 啶曕ぐ啷囙',
+  debugAsMultipleModel: '啶忇啶距ぇ啶苦 啶啶∴げ啷嬥 啶曕 啶班啶� 啶啶� 啶∴た啶 啶曕ぐ啷囙',
+  duplicateModel: '啶∴啶啶侧た啶曕啶�',
+  publishAs: '啶曕 啶班啶� 啶啶� 啶啶班啶距ざ啶苦い 啶曕ぐ啷囙',
+  assistantType: {
+    name: '啶膏す啶距く啶� 啶啶班啶距ぐ',
+    chatAssistant: {
+      name: '啶啶� 啶膏す啶距く啶�',
+      description: '啶忇 啶ぁ啶监 啶ぞ啶粪ぞ 啶啶∴げ 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕 啶忇 啶氞啶�-啶嗋ぇ啶距ぐ啶苦い 啶膏す啶距く啶� 啶え啶距啶�',
+    },
+    agentAssistant: {
+      name: '啶忇啷囙啶� 啶膏す啶距く啶�',
+      description:
+        '啶忇 啶啶︵啶оた啶ぞ啶� 啶忇啷囙啶� 啶え啶距啶� 啶溹 啶膏啶掂ぞ啶い啷嵿い 啶班啶� 啶膏 啶曕ぞ啶班啶啶� 啶曕 啶啶班ぞ 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶曕ぐ啶� 啶氞啶� 啶膏啷�',
+    },
+  },
+  agent: {
+    agentMode: '啶忇啷囙啶� 啶啶�',
+    agentModeDes: '啶忇啷囙啶� 啶曕 啶侧た啶� 啶呧え啷佮ぎ啶距え 啶啶� 啶曕ぞ 啶啶班啶距ぐ 啶膏啶� 啶曕ぐ啷囙',
+    agentModeType: {
+      ReACT: '啶班た啶忇啷嵿',
+      functionCall: '啶啶曕啶多え 啶曕啶侧た啶傕',
+    },
+    setting: {
+      name: '啶忇啷囙啶� 啶膏啶熰た啶傕啷嵿じ',
+      description:
+        '啶忇啷囙啶� 啶膏す啶距く啶� 啶膏啶熰た啶傕啷嵿じ 啶忇啷囙啶� 啶啶� 啶斷ぐ 啶た啶侧啶�-啶囙え 啶啶班啶啶啶� 啶溹啶膏 啶夃え啷嵿え啶� 啶啶氞ぐ啷嵿じ 啶膏啶� 啶曕ぐ啶ㄠ 啶曕 啶呧え啷佮ぎ啶むた 啶︵啶む 啶灌啶�, 啶溹 啶曕啶掂げ 啶忇啷囙啶� 啶啶班啶距ぐ 啶啶� 啶夃お啶侧が啷嵿ぇ 啶灌啶傕イ',
+      maximumIterations: {
+        name: '啶呧ぇ啶苦啶むぎ 啶啶ㄠぐ啶距さ啷冟い啷嵿い啶苦く啶距',
+        description:
+          '啶忇啷囙啶� 啶膏す啶距く啶� 啶曕た啶むえ啷� 啶ぞ啶� 啶啶ㄠぐ啶距さ啷冟い啷嵿い啶苦く啶距 啶曕ぐ 啶膏啶むぞ 啶灌 啶囙じ啶曕 啶膏啶ぞ 啶ㄠた啶班啶оぞ啶班た啶� 啶曕ぐ啷囙',
+      },
+    },
+    buildInPrompt: '啶た啶侧啶�-啶囙え 啶啶班啶啶啶�',
+    firstPrompt: '啶啶班ぅ啶� 啶啶班啶啶啶�',
+    nextIteration: '啶呧啶侧 啶啶ㄠぐ啶距さ啷冟い啷嵿い啶�',
+    promptPlaceholder: '啶す啶距 啶呧お啶ㄠぞ 啶啶班啶啶啶� 啶侧た啶栢啶�',
+    tools: {
+      name: '啶夃お啶曕ぐ啶�',
+      description:
+        '啶夃お啶曕ぐ啶`啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕 啶忇げ啶忇げ啶忇ぎ 啶曕 啶曕啶粪ぎ啶むぞ啶撪 啶曕ぞ 啶掂た啶膏啶むぞ啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌, 啶溹啶膏 啶囙啶熰ぐ啶ㄠ啶� 啶ぐ 啶栢啶� 啶曕ぐ啶ㄠぞ 啶ぞ 啶掂啶溹啶炧ぞ啶ㄠた啶� 啶椸ぃ啶ㄠぞ啶忇 啶曕ぐ啶ㄠぞ',
+      enabled: '啶膏啷嵿し啶�',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/hi-IN/app-log.ts b/i18n/hi-IN/app-log.ts
new file mode 100644
index 0000000..746d558
--- /dev/null
+++ b/i18n/hi-IN/app-log.ts
@@ -0,0 +1,106 @@
+const translation = {
+  title: '啶侧啶椸啶�',
+  description: '啶侧啶椸啶� 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶曕 啶班え啶苦啶� 啶膏啶熰啶熰じ 啶曕 啶班た啶曕啶班啶� 啶曕ぐ啶む 啶灌啶�, 啶溹た啶膏ぎ啷囙 啶啶溹ぐ 啶囙え啶啶� 啶斷ぐ 啶忇啶� 啶班た啶啶侧ぞ啶堗啶� 啶多ぞ啶た啶� 啶灌啶傕イ',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: '啶呧お啶∴啶� 啶曕ぞ 啶膏ぎ啶�',
+      time: '啶え啶距え啷� 啶曕ぞ 啶膏ぎ啶�',
+      endUser: '啶呧啶むた啶� 啶夃お啶啶椸啶班啶むぞ 啶ぞ 啶栢ぞ啶むぞ',
+      input: '啶囙え啶啶�',
+      output: '啶嗋啶熰お啷佮',
+      summary: '啶多啶班啶粪',
+      messageCount: '啶膏啶︵啶多啶� 啶曕 啶膏啶栢啶ぞ',
+      userRate: '啶夃お啶啶椸啶班啶むぞ 啶︵ぐ',
+      adminRate: '啶戉お啶班啶熰ぐ 啶︵ぐ',
+      startTime: '啶多啶班 啶曕ぐ啶ㄠ 啶曕ぞ 啶膏ぎ啶�',
+      status: '啶膏啶ムた啶むた',
+      runtime: '啶班え 啶熰ぞ啶囙ぎ',
+      tokens: '啶熰啶曕え',
+      user: '啶呧啶むた啶� 啶夃お啶啶椸啶班啶むぞ 啶ぞ 啶栢ぞ啶むぞ',
+      version: '啶膏啶膏啶曕ぐ啶�',
+    },
+    pagination: {
+      previous: '啶た啶涏げ啶�',
+      next: '啶呧啶侧ぞ',
+    },
+    empty: {
+      noChat: '啶曕啶� 啶ぞ啶む啷�啶� 啶ㄠす啷�啶� 啶灌啶�',
+      noOutput: '啶曕啶� 啶嗋啶熰お啷佮 啶ㄠす啷�啶�',
+      element: {
+        title: '啶曕啶ぞ 啶曕啶� 啶掂す啶距 啶灌?',
+        content:
+          '啶呧啶� 啶夃お啶啶椸啶班啶むぞ啶撪 啶斷ぐ 啶忇啶� 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶曕 啶啶� 啶囙啶熰ぐ啷堗啷嵿ざ啶傕じ 啶曕 啶︵啶栢啶� 啶斷ぐ 啶忇え啷嬥啷囙 啶曕ぐ啷囙 啶むぞ啶曕た 啶忇啶� 啶曕 啶膏啷�啶曕い啶� 啶侧啶距い啶距ぐ 啶膏啶оぞ啶班 啶溹ぞ 啶膏啷囙イ 啶嗋お <shareLink>啶す啶距 啶多啶ぐ</shareLink> 啶ぞ <testLink>啶ぐ啷�啶曕啶粪ぃ</testLink> 啶曕ぐ 啶膏啶む 啶灌啶� 啶掂啶� 啶愢お 啶呧お啶ㄠ 啶嗋お, 啶た啶� 啶囙じ 啶啶粪啶� 啶ぐ 啶侧啶熰啶傕イ',
+      },
+    },
+  },
+  detail: {
+    time: '啶膏ぎ啶�',
+    conversationId: '啶ぞ啶む啷�啶� 啶嗋啶∴',
+    promptTemplate: '啶啶班啶啶啶� 啶熰啶啶げ啷囙',
+    promptTemplateBeforeChat: '啶氞啶� 啶膏 啶す啶侧 啶啶班啶啶啶� 啶熰啶啶げ啷囙 路 啶膏た啶膏啶熰ぎ 啶啶膏啶� 啶曕 啶班啶� 啶啶�',
+    annotationTip: '{{user}} 啶︵啶掂ぞ啶班ぞ 啶膏啶оぞ啶� 啶氞た啶灌啶ㄠた啶�',
+    timeConsuming: '',
+    second: '啶膏啶曕啶�',
+    tokenCost: '啶熰啶曕え 啶栢ぐ啷嵿',
+    loading: '啶侧啶� 啶灌 啶班す啶� 啶灌',
+    operation: {
+      like: '啶じ啶傕う',
+      dislike: '啶ㄠぞ啶じ啶傕う',
+      addAnnotation: '啶膏啶оぞ啶� 啶溹啶∴ぜ啷囙',
+      editAnnotation: '啶膏啶оぞ啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+      annotationPlaceholder:
+        '啶忇啶� 啶曕 啶侧た啶� 啶嗋お啶曕 啶掂す 啶呧お啷囙啷嵿し啶苦い 啶夃い啷嵿い啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙 啶溹た啶膏啶� 啶夃お啶啶� 啶さ啶苦し啷嵿く 啶啶� 啶啶∴げ 啶ぜ啶距啶�-啶熰啶啶ㄠた啶傕 啶斷ぐ 啶熰啶曕啶膏啶� 啶溹え啶班啶多え 啶曕 啶椸啶`さ啶む啶むぞ 啶啶� 啶膏啶оぞ啶� 啶曕 啶侧た啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌啷�',
+    },
+    variables: '啶掂啶班た啶忇が啶侧啶�',
+    uploadImages: '啶呧お啶侧啶� 啶曕 啶椸 啶涏さ啶苦く啶距',
+    modelParams: '啶啶∴げ 啶啶班ぞ啶啶熰ぐ',
+  },
+  filter: {
+    period: {
+      today: '啶嗋',
+      last7days: '啶た啶涏げ啷� 7 啶︵た啶�',
+      last4weeks: '啶た啶涏げ啷� 4 啶膏お啷嵿い啶距す',
+      last3months: '啶た啶涏げ啷� 3 啶す啷�啶ㄠ',
+      last12months: '啶た啶涏げ啷� 12 啶す啷�啶ㄠ',
+      monthToDate: '啶ぞ啶� 啶む 啶むた啶ムた',
+      quarterToDate: '啶むた啶ぞ啶灌 啶む 啶むた啶ムた',
+      yearToDate: '啶掂ぐ啷嵿し 啶む 啶むた啶ムた',
+      allTime: '啶膏き啷� 啶膏ぎ啶�',
+    },
+    annotation: {
+      all: '啶膏き啷�',
+      annotated: '啶忇え啷嬥啷囙 啶曕た啶� 啶椸 啶膏啶оぞ啶� ({{count}} 啶嗋啶熰ぎ)',
+      not_annotated: '啶忇え啷嬥啷囙 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶�',
+    },
+    sortBy: '啶囙じ啶曕 啶呧え啷佮じ啶距ぐ 啶曕啶班ぎ啶う啷嵿ぇ 啶曕ぐ啷囙:',
+    descending: '啶呧さ啶班啶灌',
+    ascending: '啶嗋ぐ啷嬥す啷�',
+  },
+  workflowTitle: '啶掂ぐ啷嵿啶ぜ啷嵿げ啷� 啶侧啶椸啶�',
+  workflowSubtitle: '啶す 啶侧啶� 啶戉啷嬥ぎ啷囙啷� 啶曕 啶戉お啶班啶多え 啶曕 啶班た啶曕啶班啶� 啶曕ぐ啶むぞ 啶灌啷�',
+  runDetail: {
+    title: '啶ぞ啶む啷�啶� 啶侧啶�',
+    workflowTitle: '啶侧啶� 啶掂た啶掂ぐ啶�',
+    fileListDetail: '啶掂た啶膏啶むぞ啶�',
+    fileListLabel: '啶ぜ啶距啶� 啶掂た啶掂ぐ啶�',
+  },
+  promptLog: '啶啶班啶啶啶� 啶侧啶�',
+  agentLog: '啶忇啷囙啶� 啶侧啶�',
+  viewLog: '啶掂啶 啶侧啶�',
+  agentLogDetail: {
+    agentMode: '啶忇啷囙啶� 啶啶�',
+    startTime: '啶多啶班 啶曕ぐ啶ㄠ 啶曕ぞ 啶膏ぎ啶�',
+    endTime: '啶膏ぎ啶距お啷嵿い啶� 啶膏ぎ啶�',
+    duration: '啶呧さ啶оた',
+    promptTemplate: '啶啶班啶啶啶� 啶熰啶啶げ啷囙',
+    promptInput: '啶啶班啶啶啶� 啶囙え啶啶�',
+    response: '啶啶班い啶苦啷嵿ぐ啶苦く啶�',
+    iterations: '啶啶ㄠぐ啷傕啷嵿い啶苦く啶距',
+    toolUsed: '啶啶班く啷佮啷嵿い 啶夃お啶曕ぐ啶�',
+    finalProcessing: '啶呧啶むた啶� 啶啶班じ啶傕じ啷嵿啶班ぃ',
+    iteration: '啶氞げ啶ㄠぞ',
+  },
+}
+
+export default translation
diff --git a/i18n/hi-IN/app-overview.ts b/i18n/hi-IN/app-overview.ts
new file mode 100644
index 0000000..0b51454
--- /dev/null
+++ b/i18n/hi-IN/app-overview.ts
@@ -0,0 +1,191 @@
+const translation = {
+  welcome: {
+    firstStepTip: '啶多啶班 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�,',
+    enterKeyTip: '啶ㄠ啶氞 啶呧お啶ㄠぞ OpenAI API 啶曕啶傕啷� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    getKeyTip: 'OpenAI 啶∴啶多が啷嬥ぐ啷嵿ぁ 啶膏 啶呧お啶ㄠ API 啶曕啶傕啷� 啶啶班ぞ啶啶� 啶曕ぐ啷囙',
+    placeholder: '啶嗋お啶曕 OpenAI API 啶曕啶傕啷� (啶夃う啶�. sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: '啶嗋お {{providerName}} 啶ぐ啷�啶曕啶粪ぃ 啶曕啶熰ぞ 啶曕ぞ 啶夃お啶啶� 啶曕ぐ 啶班す啷� 啶灌啶傕イ',
+        description:
+          '啶ぐ啷�啶曕啶粪ぃ 啶曕啶熰ぞ 啶嗋お啶曕 啶ぐ啷�啶曕啶粪ぃ 啶夃お啶啶� 啶曕 啶侧た啶� 啶啶班う啶距え 啶曕た啶ぞ 啶椸く啶� 啶灌啷� 啶曕啶く啶� 啶ぐ啷�啶曕啶粪ぃ 啶曕啶熰ぞ 啶曕啶� 啶膏ぎ啶距お啷嵿い 啶灌啶ㄠ 啶膏 啶す啶侧 啶呧お啶ㄠぞ 啶膏啶掂く啶� 啶曕ぞ 啶啶∴げ 啶啶班う啶距い啶� 啶膏啶� 啶曕ぐ啷囙 啶ぞ 啶呧い啶苦ぐ啶苦啷嵿い 啶曕啶熰ぞ 啶栢ぐ啷�啶︵啶傕イ',
+      },
+      exhausted: {
+        title:
+          '啶嗋お啶曕ぞ 啶ぐ啷�啶曕啶粪ぃ 啶曕啶熰ぞ 啶膏ぎ啶距お啷嵿い 啶灌 啶椸く啶� 啶灌, 啶曕啶く啶� 啶呧お啶ㄠぞ API 啶曕啶傕啷� 啶膏啶� 啶曕ぐ啷囙啷�',
+        description:
+          '啶嗋お啶曕ぞ 啶ぐ啷�啶曕啶粪ぃ 啶曕啶熰ぞ 啶膏ぎ啶距お啷嵿い 啶灌 啶椸く啶� 啶灌啷� 啶曕啶く啶� 啶呧お啶ㄠぞ 啶膏啶掂く啶� 啶曕ぞ 啶啶∴げ 啶啶班う啶距い啶� 啶膏啶� 啶曕ぐ啷囙 啶ぞ 啶呧い啶苦ぐ啶苦啷嵿い 啶曕啶熰ぞ 啶栢ぐ啷�啶︵啶傕イ',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: '啶多啶班 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�,',
+        row2: '啶す啶侧 啶呧お啶ㄠぞ 啶啶∴げ 啶啶班う啶距い啶� 啶膏啶熰啶� 啶曕ぐ啷囙啷�',
+      },
+    },
+    callTimes: '啶曕啶� 啶膏ぎ啶�',
+    usedToken: '啶夃お啶啶� 啶曕た啶ぞ 啶椸く啶� 啶熰啶曕え',
+    setAPIBtn: '啶啶∴げ 啶啶班う啶距い啶� 啶膏啶熰啶� 啶ぐ 啶溹ぞ啶忇',
+    tryCloud: '啶ぞ 啶啶啶� 啶曕啶熰ぞ 啶曕 啶膏ぞ啶� Dify 啶曕ぞ 啶曕啶侧ぞ啶夃ぁ 啶膏啶膏啶曕ぐ啶� 啶嗋啶监ぎ啶距啶�',
+  },
+  overview: {
+    title: '啶呧さ啶侧啶曕え',
+    appInfo: {
+      explanation: '啶班啶∴-啶熰-啶啶溹ぜ AI 啶掂啶啶�',
+      accessibleAddress: '啶膏ぞ啶班啶掂啶ㄠた啶� URL',
+      preview: '啶啶班啶掂ぞ啶掂げ啷嬥啶�',
+      regenerate: '啶啶ㄠ 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啷囙',
+      regenerateNotice: '啶曕啶ぞ 啶嗋お 啶膏ぞ啶班啶掂啶ㄠた啶� URL 啶曕 啶啶ㄠ 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啶ㄠぞ 啶氞ぞ啶灌い啷� 啶灌啶�?',
+      preUseReminder: '啶溹ぞ啶班 啶班啶ㄠ 啶膏 啶す啶侧 啶曕啶く啶� 啶掂啶啶� 啶膏啷嵿し啶� 啶曕ぐ啷囙啷�',
+      settings: {
+        entry: '啶膏啶熰た啶傕啷嵿じ',
+        title: '啶掂啶啶� 啶膏啶熰た啶傕啷嵿じ',
+        webName: '啶掂啶啶� 啶ㄠぞ啶�',
+        webDesc: '啶掂啶啶� 啶掂た啶掂ぐ啶�',
+        webDescTip:
+          '啶す 啶熰啶曕啶膏啶� 啶曕啶侧ぞ啶囙啶� 啶膏ぞ啶囙ぁ 啶ぐ 啶啶班う啶班啶多た啶� 啶灌啶椸ぞ, 啶溹 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶啶ㄠた啶ぞ啶︵ 啶ぞ啶班啶椸う啶班啶多え 啶啶班う啶距え 啶曕ぐ啷囙啶�',
+        webDescPlaceholder: '啶掂啶啶� 啶曕ぞ 啶掂た啶掂ぐ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+        language: '啶ぞ啶粪ぞ',
+        workflow: {
+          title: '啶掂ぐ啷嵿啶ぜ啷嵿げ啷� 啶膏啶熰啶啶�',
+          show: '啶︵た啶栢ぞ啶忇',
+          hide: '啶涏啶ぞ啶忇',
+          subTitle: '啶曕ぞ啶班啶お啷嵿ぐ啶掂ぞ啶� 啶掂た啶掂ぐ啶�',
+          showDesc: 'WebApp 啶啶� 啶掂ぐ啷嵿啶ぜ啷嵿げ啷� 啶掂た啶掂ぐ啶� 啶︵た啶栢ぞ啶忇 啶ぞ 啶涏啶ぞ啶忇',
+        },
+        chatColorTheme: '啶氞啶熰が啷夃 啶曕ぞ 啶班啶� 啶ム啶�',
+        chatColorThemeDesc: '啶氞啶熰が啷夃 啶曕ぞ 啶班啶� 啶ム啶� 啶ㄠた啶班啶оぞ啶班た啶� 啶曕ぐ啷囙',
+        chatColorThemeInverted: '啶夃げ啷嵿啶�',
+        invalidHexMessage: '啶呧ぎ啶距え啷嵿く 啶灌啶曕啶� 啶ぞ啶�',
+        invalidPrivacyPolicy: '啶椸啶え啷�啶い啶� 啶ㄠ啶むた 啶侧た啶傕 啶呧ぎ啶距え啷嵿く 啶灌啷� 啶曕啶く啶� http 啶ぞ https 啶膏 啶多啶班 啶灌啶ㄠ 啶掂ぞ啶侧ぞ 啶忇 啶掂啶� 啶侧た啶傕 啶夃お啶啶� 啶曕ぐ啷囙啷�',
+        more: {
+          entry: '啶呧ぇ啶苦 啶膏啶熰た啶傕啷嵿じ 啶︵た啶栢ぞ啶忇',
+          copyright: '啶曕啶啶班ぞ啶囙',
+          copyRightPlaceholder: '啶侧啶栢 啶ぞ 啶膏啶椸啶� 啶曕ぞ 啶ㄠぞ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+          privacyPolicy: '啶椸啶え啷�啶い啶� 啶ㄠ啶むた',
+          privacyPolicyPlaceholder: '啶椸啶え啷�啶い啶� 啶ㄠ啶むた 啶侧た啶傕 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+          privacyPolicyTip:
+            '啶嗋啶傕い啷佮啷嬥 啶曕 啶す 啶膏ぎ啶澿え啷� 啶啶� 啶う啶� 啶曕ぐ啶むぞ 啶灌 啶曕た 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶曕啶� 啶膏ぞ 啶∴啶熰ぞ 啶忇啶む啶� 啶曕ぐ啶むぞ 啶灌, 啶︵啶栢啶� Dify 啶曕 <privacyPolicyLink>啶椸啶え啷�啶い啶� 啶ㄠ啶むた</privacyPolicyLink>啷�',
+          customDisclaimer: '啶曕じ啷嵿啶� 啶呧じ啷嵿さ啷�啶曕ぐ啶�',
+          customDisclaimerPlaceholder: '啶曕じ啷嵿啶� 啶呧じ啷嵿さ啷�啶曕ぐ啶� 啶熰啶曕啶膏啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+          customDisclaimerTip:
+            '啶曕じ啷嵿啶� 啶呧じ啷嵿さ啷�啶曕ぐ啶� 啶熰啶曕啶膏啶� 啶曕啶侧ぞ啶囙啶� 啶膏ぞ啶囙ぁ 啶ぐ 啶啶班う啶班啶多た啶� 啶灌啶椸ぞ, 啶溹 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶曕 啶ぞ啶班 啶啶� 啶呧い啶苦ぐ啶苦啷嵿い 啶溹ぞ啶ㄠ啶距ぐ啷� 啶啶班う啶距え 啶曕ぐ啷囙啶�',
+          copyrightTip: '啶掂啶お啷堗お 啶啶� 啶曕啶啶班ぞ啶囙 啶溹ぞ啶ㄠ啶距ぐ啷� 啶啶班う啶班啶多た啶� 啶曕ぐ啷囙',
+          copyrightTooltip: '啶曕啶く啶� 啶掂啶ぞ啶掂じ啶距く啶苦 啶啶溹え啶� 啶ぞ 啶夃じ啶膏 啶娻お啶� 啶曕 啶膏啶膏啶曕ぐ啶� 啶啶� 啶呧お啶椸啶班啶� 啶曕ぐ啷囙',
+        },
+        sso: {
+          title: '啶掂啶啶� 啶忇じ啶忇じ啶�',
+          label: 'SSO 啶啶班ぎ啶距ぃ啷�啶曕ぐ啶�',
+          description: 'WebApp 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶ㄠ 啶膏 啶す啶侧 啶膏き啷� 啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 SSO 啶曕 啶膏ぞ啶� 啶侧啶椸た啶� 啶曕ぐ啶ㄠぞ 啶嗋さ啶多啶 啶灌',
+          tooltip: 'WebApp SSO 啶曕 啶膏啷嵿し啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶掂啶さ啶膏啶ムぞ啶 啶膏 啶膏啶ぐ啷嵿 啶曕ぐ啷囙',
+        },
+        modalTip: '啶曕啶侧ぞ啶囙啶�-啶膏ぞ啶囙ぁ 啶掂啶� 啶呧え啷佮お啷嵿ぐ啶啶� 啶膏啶熰た啶傕啷嵿じ.',
+      },
+      embedded: {
+        entry: '啶忇ぎ啷嵿が啷囙ぁ啷囙ぁ',
+        title: '啶掂啶じ啶距啶� 啶ぐ 啶忇ぎ啷嵿が啷囙ぁ 啶曕ぐ啷囙',
+        explanation: '啶呧お啶ㄠ 啶掂啶じ啶距啶� 啶ぐ 啶氞啶� 啶愢お 啶曕 啶忇ぎ啷嵿が啷囙ぁ 啶曕ぐ啶ㄠ 啶曕ぞ 啶むぐ啷�啶曕ぞ 啶氞啶ㄠ啶�',
+        iframe:
+          '啶呧お啶ㄠ 啶掂啶じ啶距啶� 啶曕 啶曕た啶膏 啶 啶灌た啶膏啶膏 啶ぐ 啶氞啶� 啶愢お 啶溹啶∴ぜ啶ㄠ 啶曕 啶侧た啶�, 啶囙じ iframe 啶曕 啶呧お啶ㄠ HTML 啶曕啶� 啶啶� 啶溹啶∴ぜ啷囙啷�',
+        scripts:
+          '啶呧お啶ㄠ 啶掂啶じ啶距啶� 啶曕 啶ㄠた啶氞げ啷� 啶︵ぞ啶忇 啶曕啶ㄠ 啶啶� 啶氞啶� 啶愢お 啶溹啶∴ぜ啶ㄠ 啶曕 啶侧た啶� 啶囙じ 啶曕啶� 啶曕 啶呧お啶ㄠ HTML 啶啶� 啶溹啶∴ぜ啷囙啷�',
+        chromePlugin: 'Dify 啶氞啶熰が啷夃 啶曕啶班啶� 啶忇啷嵿じ啶熰啶傕ざ啶� 啶囙啶膏啶熰啶� 啶曕ぐ啷囙',
+        copied: '啶曕啶 啶曕た啶ぞ 啶椸く啶�',
+        copy: '啶曕啶 啶曕ぐ啷囙',
+      },
+      qrcode: {
+        title: '啶多啶ぐ 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕啶啶嗋ぐ 啶曕啶�',
+        scan: '啶忇お啷嵿げ啶苦啷囙ざ啶� 啶多啶ぐ 啶膏啶曕啶� 啶曕ぐ啷囙',
+        download: '啶曕啶啶嗋ぐ 啶曕啶� 啶∴ぞ啶夃え啶侧啶� 啶曕ぐ啷囙',
+      },
+      customize: {
+        way: '啶むぐ啷�啶曕ぞ',
+        entry: '啶曕じ啷嵿啶ぞ啶囙啶� 啶曕ぐ啷囙',
+        title: 'AI 啶掂啶啶� 啶曕じ啷嵿啶ぞ啶囙啶� 啶曕ぐ啷囙',
+        explanation:
+          '啶嗋お 啶掂啶� 啶愢お 啶曕 啶啶班啶熰啶傕ぁ 啶曕 啶呧お啶ㄠ 啶膏啶ムた啶むた 啶斷ぐ 啶多啶侧 啶曕 啶嗋さ啶多啶啶むぞ啶撪 啶曕 啶呧え啷佮じ啶距ぐ 啶曕じ啷嵿啶ぞ啶囙啶� 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+        way1: {
+          name: '啶曕啶侧ぞ啶囙啶� 啶曕啶� 啶曕 啶啶班啶� 啶曕ぐ啷囙, 啶夃じ啷� 啶膏啶多啶оた啶� 啶曕ぐ啷囙 啶斷ぐ Vercel 啶ぐ 啶∴た啶啶侧啶� 啶曕ぐ啷囙 (啶呧え啷佮ざ啶傕じ啶苦い)',
+          step1: '啶曕啶侧ぞ啶囙啶� 啶曕啶� 啶曕 啶啶班啶� 啶曕ぐ啷囙 啶斷ぐ 啶膏啶多啶оた啶� 啶曕ぐ啷囙',
+          step1Tip:
+            '啶膏啶班啶� 啶曕啶� 啶曕 啶呧お啶ㄠ GitHub 啶栢ぞ啶む 啶啶� 啶啶班啶� 啶曕ぐ啶ㄠ 啶斷ぐ 啶曕啶� 啶膏啶多啶оた啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶す啶距 啶曕啶侧た啶� 啶曕ぐ啷囙',
+          step1Operation: 'Dify-WebClient',
+          step2: 'Vercel 啶ぐ 啶∴た啶啶侧啶� 啶曕ぐ啷囙',
+          step2Tip:
+            '啶啶∴ぞ啶� 啶曕 Vercel 啶啶� 啶嗋く啶距い 啶曕ぐ啶ㄠ 啶斷ぐ 啶∴た啶啶侧啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶す啶距 啶曕啶侧た啶� 啶曕ぐ啷囙',
+          step2Operation: '啶啶∴ぞ啶� 啶嗋く啶距い 啶曕ぐ啷囙',
+          step3: '啶ぐ啷嵿く啶距さ啶班ぃ 啶掂啶班た啶忇が啶侧啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+          step3Tip: 'Vercel 啶啶� 啶ㄠた啶啶ㄠげ啶苦啶苦い 啶ぐ啷嵿く啶距さ啶班ぃ 啶掂啶班た啶忇が啶侧啶� 啶溹啶∴ぜ啷囙',
+        },
+        way2: {
+          name: '啶忇お啷�啶嗋 啶曕 啶曕啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕啶侧ぞ啶囙啶�-啶膏ぞ啶囙ぁ 啶曕啶� 啶侧た啶栢啶� 啶斷ぐ 啶囙じ啷� 啶膏ぐ啷嵿さ啶� 啶ぐ 啶∴た啶啶侧啶� 啶曕ぐ啷囙',
+          operation: '啶啶班げ啷囙啶�',
+        },
+      },
+      launch: '啶侧啶ㄠ啶�',
+    },
+    apiInfo: {
+      title: '啶啶曕啶傕ぁ 啶膏啶掂ぞ 啶忇お啷�啶嗋',
+      explanation: '啶嗋じ啶距え啷� 啶膏 啶呧お啶ㄠ 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶啶� 啶忇啷�啶曕啶�',
+      accessibleAddress: '啶膏啶掂ぞ 啶忇お啷�啶嗋 啶忇啶∴お啷夃啶傕',
+      doc: '啶忇お啷�啶嗋 啶膏啶︵ぐ啷嵿き',
+    },
+    status: {
+      running: '啶膏啶掂ぞ 啶啶�',
+      disable: '啶呧啷嵿し啶� 啶曕ぐ啷囙',
+    },
+  },
+  analysis: {
+    title: '啶掂た啶多啶侧啶粪ぃ',
+    ms: '啶た.啶膏.',
+    tokenPS: '啶熰啶曕え/啶膏.',
+    totalMessages: {
+      title: '啶曕啶� 啶膏啶︵啶�',
+      explanation: '啶︵啶ㄠた啶� AI 啶囙啶熰ぐ啷堗啷嵿ざ啶� 啶曕 啶椸た啶ㄠい啷�啷�',
+    },
+    totalConversations: {
+      title: '啶曕啶� 啶掂ぞ啶班啶むぞ啶侧ぞ啶�',
+      explanation: '啶︵啶ㄠた啶� AI 啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶曕 啶椸た啶ㄠい啷�; 啶啶班啶啶啶� 啶囙啶溹啶ㄠた啶ぐ啶苦啶�/啶∴啶啶苦啶� 啶多ぞ啶た啶� 啶ㄠす啷�啶傕イ',
+    },
+    activeUsers: {
+      title: '啶膏啷嵿ぐ啶苦く 啶夃お啶啶椸啶班啶むぞ',
+      explanation:
+        'AI 啶曕 啶膏ぞ啶� 啶啶班ざ啷嵿え啷嬥い啷嵿い啶� 啶啶� 啶膏啶侧啷嵿え 啶呧う啷嵿さ啶苦い啷�啶� 啶夃お啶啶椸啶班啶むぞ; 啶啶班啶啶啶� 啶囙啶溹啶ㄠた啶ぐ啶苦啶�/啶∴啶啶苦啶� 啶曕 啶多ぞ啶た啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶距イ',
+    },
+    tokenUsage: {
+      title: '啶熰啶曕え 啶夃お啶啶�',
+      explanation:
+        '啶忇お啷嵿げ啶苦啷囙ざ啶� 啶曕 啶侧た啶� 啶ぞ啶粪ぞ 啶啶∴げ 啶曕 啶︵啶ㄠた啶� 啶熰啶曕え 啶夃お啶啶� 啶曕 啶︵ぐ啷嵿ざ啶距い啶� 啶灌, 啶溹 啶侧ぞ啶椸い 啶ㄠた啶啶む啶班ぃ 啶夃う啷嵿う啷囙ざ啷嵿く啷嬥 啶曕 啶侧た啶� 啶夃お啶啶椸 啶灌啷�',
+      consumed: '啶夃お啶啶� 啶曕た啶ぞ 啶椸く啶�',
+    },
+    avgSessionInteractions: {
+      title: '啶斷じ啶� 啶膏い啷嵿ぐ 啶囙啶熰ぐ啷堗啷嵿ざ啶�',
+      explanation:
+        '啶ㄠた啶班啶むぐ 啶夃お啶啶椸啶班啶むぞ-啶忇啶� 啶膏啶氞ぞ啶� 啶曕 啶椸た啶ㄠい啷�; 啶掂ぞ啶班啶むぞ啶侧ぞ啶�-啶嗋ぇ啶距ぐ啶苦い 啶愢お啷嵿じ 啶曕 啶侧た啶忇イ',
+    },
+    avgUserInteractions: {
+      title: '啶斷じ啶� 啶夃お啶啶椸啶班啶むぞ 啶囙啶熰ぐ啷堗啷嵿ざ啶�',
+      explanation:
+        '啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶︵啶ㄠた啶� 啶夃お啶啶� 啶曕 啶嗋さ啷冟い啷嵿い啶� 啶曕 啶︵ぐ啷嵿ざ啶距い啶� 啶灌啷� 啶す 啶啶熰啶班た啶� 啶夃お啶啶椸啶班啶むぞ 啶膏啶ムた啶班い啶� 啶曕 啶︵ぐ啷嵿ざ啶距い啶� 啶灌啷�',
+    },
+    userSatisfactionRate: {
+      title: '啶夃お啶啶椸啶班啶むぞ 啶膏啶む啶� 啶︵ぐ',
+      explanation:
+        '啶啶班い啶� 1,000 啶膏啶︵啶多啶� 啶啶� 啶膏 啶じ啶傕う啷嬥 啶曕 啶膏啶栢啶ぞ啷� 啶す 啶夃え 啶夃い啷嵿い啶班啶� 啶曕 啶呧え啷佮お啶距い 啶曕 啶囙啶椸た啶� 啶曕ぐ啶むぞ 啶灌 啶溹た啶ㄠじ啷� 啶夃お啶啶椸啶班啶むぞ 啶呧い啷嵿く啶оた啶� 啶膏啶む啶粪啶� 啶灌啶傕イ',
+    },
+    avgResponseTime: {
+      title: '啶斷じ啶� 啶啶班い啶苦啷嵿ぐ啶苦く啶� 啶膏ぎ啶�',
+      explanation:
+        '啶熰啶曕啶膏啶�-啶嗋ぇ啶距ぐ啶苦い 啶愢お啷嵿じ 啶曕 啶侧た啶� 啶忇啶� 啶︵啶掂ぞ啶班ぞ 啶膏啶膏ぞ啶оた啶�/啶啶班い啶苦啷嵿ぐ啶苦く啶� 啶膏ぎ啶� (啶た.啶膏.)啷�',
+    },
+    tps: {
+      title: '啶熰啶曕え 啶嗋啶熰お啷佮 啶膏啶啶�',
+      explanation:
+        'LLM 啶曕 啶啶班う啶班啶多え 啶曕 啶ぞ啶啶傕イ 啶呧え啷佮ぐ啷嬥ぇ 啶曕 啶多啶班 啶灌啶ㄠ 啶膏 啶嗋啶熰お啷佮 啶啶班ぞ 啶灌啶ㄠ 啶む LLM 啶曕 啶熰啶曕え 啶嗋啶熰お啷佮 啶椸い啶� 啶曕 啶椸ぃ啶ㄠぞ 啶曕ぐ啷囙啷�',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/hi-IN/app.ts b/i18n/hi-IN/app.ts
new file mode 100644
index 0000000..aef667e
--- /dev/null
+++ b/i18n/hi-IN/app.ts
@@ -0,0 +1,214 @@
+const translation = {
+  createApp: '啶愢お 啶え啶距啶�',
+  types: {
+    all: '啶膏き啷�',
+    chatbot: '啶氞啶熰が啷夃',
+    agent: '啶忇啷囙啶�',
+    workflow: '啶掂ぐ啷嵿啶ぜ啷嵿げ啷�',
+    completion: '啶膏ぎ啶距お啷嵿い啶�',
+    advanced: '啶氞啶熰か啷嵿げ啷�',
+    basic: '啶啶侧さ啶班啶む',
+  },
+  duplicate: '啶∴啶啶侧た啶曕啶�',
+  duplicateTitle: '啶愢お 啶∴啶啶侧た啶曕啶� 啶曕ぐ啷囙',
+  export: '啶∴啶忇じ啶忇げ 啶ㄠた啶班啶ぞ啶� 啶曕ぐ啷囙',
+  exportFailed: '啶∴啶忇じ啶忇げ 啶ㄠた啶班啶ぞ啶� 啶掂た啶げ 啶灌啶嗋イ',
+  importDSL: '啶∴啶忇じ啶忇げ 啶ぜ啶距啶� 啶嗋く啶距い 啶曕ぐ啷囙',
+  createFromConfigFile: '啶∴啶忇じ啶忇げ 啶ぜ啶距啶� 啶膏 啶え啶距啶�',
+  deleteAppConfirmTitle: '啶囙じ 啶愢お 啶曕 啶灌啶距啶�?',
+  deleteAppConfirmContent:
+    '啶愢お 啶曕 啶灌啶距え啶� 啶呧お啶班た啶掂ぐ啷嵿い啶ㄠ啶� 啶灌啷� 啶夃お啶啶椸啶班啶むぞ 啶呧が 啶嗋お啶曕 啶愢お 啶む 啶す啷佮啶氞え啷� 啶啶� 啶膏啷嵿し啶� 啶ㄠす啷�啶� 啶灌啶傕啷�, 啶斷ぐ 啶膏き啷� 啶啶班啶啶啶� 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶斷ぐ 啶侧啶� 啶膏啶ムぞ啶 啶班啶� 啶膏 啶灌啶� 啶︵た啶� 啶溹ぞ啶忇啶椸啷�',
+  appDeleted: '啶愢お 啶灌啶距く啶� 啶椸く啶�',
+  appDeleteFailed: '啶愢お 啶灌啶距え啷� 啶啶� 啶掂た啶げ',
+  join: '啶膏ぎ啷佮う啶距く 啶啶� 啶多ぞ啶た啶� 啶灌啶�',
+  communityIntro:
+    '啶熰啶� 啶曕 啶膏う啶膏啶啶�, 啶啶椸う啶距え啶曕ぐ啷嵿い啶距啶� 啶斷ぐ 啶∴啶掂げ啶ぐ啷嵿じ 啶曕 啶膏ぞ啶� 啶掂た啶た啶ㄠ啶� 啶氞啶ㄠげ啷嬥 啶ぐ 啶氞ぐ啷嵿啶� 啶曕ぐ啷囙啷�',
+  roadmap: '啶灌ぎ啶距ぐ啶� 啶班啶∴ぎ啷堗お 啶︵啶栢啶�',
+  newApp: {
+    startFromBlank: '啶班た啶曕啶� 啶膏 啶え啶距啶�',
+    startFromTemplate: '啶熰啶啶げ啷囙 啶膏 啶え啶距啶�',
+    captionAppType: '啶嗋お 啶曕た啶� 啶啶班啶距ぐ 啶曕ぞ 啶愢お 啶え啶距え啶� 啶氞ぞ啶灌い啷� 啶灌啶�?',
+    chatbotDescription: '啶忇 啶氞啶�-啶嗋ぇ啶距ぐ啶苦い 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶え啶距啶傕イ 啶す 啶愢お 啶啶班ざ啷嵿え-啶夃い啷嵿い啶� 啶啶班ぞ啶班啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶むぞ 啶灌, 啶溹た啶膏じ啷� 啶ㄠた啶班啶むぐ 啶ぞ啶む啷�啶� 啶曕 啶曕 啶班ぞ啶夃啶� 啶膏啶さ 啶灌啶む 啶灌啶傕イ',
+    completionDescription: '啶愢じ啶� 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶え啶距啶� 啶溹 啶啶班啶啶啶熰啶� 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶夃啷嵿 啶椸啶`さ啶む啶むぞ 啶掂ぞ啶侧ぞ 啶熰啶曕啶膏啶� 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啶むぞ 啶灌, 啶溹啶膏 啶侧啶�, 啶膏ぞ啶班ぞ啶傕ざ, 啶呧え啷佮さ啶距う 啶嗋う啶� 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啶ㄠぞ啷�',
+    completionWarning: '啶囙じ 啶啶班啶距ぐ 啶曕 啶愢お 啶曕ぞ 啶膏ぎ啶班啶ムえ 啶ㄠす啷�啶� 啶曕た啶ぞ 啶溹ぞ啶忇啶距イ',
+    agentDescription: '啶忇 啶啶︵啶оた啶ぞ啶� 啶忇啷囙啶� 啶え啶距啶� 啶溹 啶膏啶掂ぞ啶い啷嵿い 啶班啶� 啶膏 啶熰啶侧啶� 啶曕ぞ 啶氞く啶� 啶曕ぐ啶曕 啶曕ぞ啶班啶� 啶啶班ぞ 啶曕ぐ 啶膏啷囙イ',
+    workflowDescription: '啶忇 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶え啶距啶� 啶溹 啶掂ぐ啷嵿啶ぜ啷嵿げ啷� 啶戉ぐ啷嵿啷囙じ啷嵿啷嵿ぐ啷囙啷嵿じ 啶曕 啶膏ぞ啶� 啶夃啷嵿 啶∴た啶椸啶班 啶曕 啶曕じ啷嵿啶ぞ啶囙啶监啶多え 啶曕 啶膏ぞ啶� 啶夃啷嵿 啶椸啶`さ啶む啶むぞ 啶掂ぞ啶侧ぞ 啶熰啶曕啶膏啶� 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啶むぞ 啶灌啷� 啶す 啶呧え啷佮き啶掂 啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶侧た啶� 啶夃お啶啶曕啶� 啶灌啷�',
+    workflowWarning: '啶掂ぐ啷嵿い啶ぞ啶� 啶啶� 啶啶熰ぞ 啶啶�',
+    chatbotType: '啶氞啶熰が啷夃 啶戉ぐ啷嵿啷囙じ啷嵿啷嵿ぐ啷囙 啶掂た啶оた',
+    basic: '啶啶膏た啶�',
+    basicTip: '啶多啶班啶嗋い啷� 啶侧啶椸啶� 啶曕 啶侧た啶�, 啶ぞ啶� 啶啶� 啶氞啶熰か啶监啶侧 啶啶� 啶膏啶掂た啶� 啶曕ぐ 啶膏啶む 啶灌啶�',
+    basicFor: '啶多啶班啶嗋い啷� 啶侧啶椸啶� 啶曕 啶侧た啶�',
+    basicDescription: '啶啶膏た啶� 啶戉ぐ啷嵿啷囙じ啷嵿啷嵿ぐ啷囙 啶氞啶熰が啷夃 啶愢お 啶曕 啶膏ぐ啶� 啶膏啶熰た啶傕啷嵿じ 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕 啶戉ぐ啷嵿啷囙じ啷嵿啷嵿ぐ啷囙 啶曕ぐ啶ㄠ 啶曕 啶呧え啷佮ぎ啶むた 啶︵啶むぞ 啶灌, 啶た啶ㄠぞ 啶呧啶むぐ啷嵿え啶苦す啶苦い 啶啶班啶啶啶熰啶� 啶曕 啶膏啶多啶оた啶� 啶曕ぐ啶ㄠ 啶曕 啶曕啶粪ぎ啶むぞ 啶曕啷� 啶す 啶多啶班啶嗋い啷� 啶侧啶椸啶� 啶曕 啶侧た啶� 啶夃お啶啶曕啶� 啶灌啷�',
+    advanced: '啶氞啶熰か啷嵿げ啷�',
+    advancedFor: '啶呧え啷佮き啶掂 啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶侧た啶�',
+    advancedDescription: '啶掂ぐ啷嵿啶ぜ啷嵿げ啷� 啶戉ぐ啷嵿啷囙じ啷嵿啷嵿ぐ啷囙 啶掂ぐ啷嵿啶ぜ啷嵿げ啷嬥啶� 啶曕 啶班啶� 啶啶� 啶氞啶熰が啷夃啷嵿じ 啶曕 啶戉ぐ啷嵿啷囙じ啷嵿啷嵿ぐ啷囙 啶曕ぐ啶むぞ 啶灌, 啶溹た啶膏ぎ啷囙 啶呧啶むぐ啷嵿え啶苦す啶苦い 啶啶班啶啶啶熰啶� 啶曕 啶膏啶ぞ啶︵た啶� 啶曕ぐ啶ㄠ 啶曕 啶曕啶粪ぎ啶むぞ 啶膏す啶苦い 啶夃啷嵿 啶∴た啶椸啶班 啶曕ぞ 啶曕じ啷嵿啶ぞ啶囙啶监啶多え 啶灌啶むぞ 啶灌啷� 啶す 啶呧え啷佮き啶掂 啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶侧た啶� 啶夃お啶啶曕啶� 啶灌啷�',
+    captionName: '啶愢お 啶嗋啶曕え 啶斷ぐ 啶ㄠぞ啶�',
+    appNamePlaceholder: '啶呧お啶ㄠ 啶愢お 啶曕 啶ㄠぞ啶� 啶︵啶�',
+    captionDescription: '啶掂た啶掂ぐ啶�',
+    appDescriptionPlaceholder: '啶愢お 啶曕ぞ 啶掂た啶掂ぐ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    useTemplate: '啶囙じ 啶熰啶啶げ啷囙 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙',
+    previewDemo: '啶啶班啶掂ぞ啶掂げ啷嬥啶� 啶∴啶',
+    chatApp: '啶膏す啶距く啶�',
+    chatAppIntro:
+      '啶啶� 啶忇 啶氞啶�-啶嗋ぇ啶距ぐ啶苦い 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶え啶距え啶� 啶氞ぞ啶灌い啶� 啶灌啶佮イ 啶す 啶愢お 啶啶班ざ啷嵿え-啶夃い啷嵿い啶� 啶啶班ぞ啶班啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶むぞ 啶灌, 啶溹た啶膏じ啷� 啶ㄠた啶班啶むぐ 啶ぞ啶む啷�啶� 啶曕 啶曕 啶班ぞ啶夃啶� 啶膏啶さ 啶灌啶む 啶灌啶傕イ',
+    agentAssistant: '啶ㄠく啶� 啶忇啷囙啶� 啶膏す啶距く啶�',
+    completeApp: '啶熰啶曕啶膏啶� 啶溹え啶班啶熰ぐ',
+    completeAppIntro:
+      '啶啶� 啶忇 啶愢じ啶� 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶え啶距え啶� 啶氞ぞ啶灌い啶� 啶灌啶� 啶溹 啶啶班啶啶啶熰啶� 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶夃啷嵿 啶椸啶`さ啶む啶むぞ 啶掂ぞ啶侧ぞ 啶熰啶曕啶膏啶� 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啶むぞ 啶灌, 啶溹啶膏 啶侧啶�, 啶膏ぞ啶班ぞ啶傕ざ, 啶呧え啷佮さ啶距う 啶嗋う啶� 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啶ㄠぞ啷�',
+    showTemplates: '啶啶� 啶熰啶啶げ啷囙 啶膏 啶氞啶ㄠえ啶� 啶氞ぞ啶灌い啶� 啶灌啶�',
+    hideTemplates: '啶啶� 啶氞く啶� 啶ぐ 啶掂ぞ啶じ 啶溹ぞ啶忇',
+    Create: '啶え啶距啶�',
+    Cancel: '啶班う啷嵿う 啶曕ぐ啷囙',
+    nameNotEmpty: '啶ㄠぞ啶� 啶栢ぞ啶侧 啶ㄠす啷�啶� 啶灌 啶膏啶むぞ',
+    appTemplateNotSelected: '啶曕啶く啶� 啶忇 啶熰啶啶げ啷囙 啶氞啶ㄠ啶�',
+    appTypeRequired: '啶曕啶く啶� 啶忇 啶愢お 啶啶班啶距ぐ 啶氞啶ㄠ啶�',
+    appCreated: '啶愢お 啶え啶距く啶� 啶椸く啶�',
+    appCreateFailed: '啶愢お 啶え啶距え啷� 啶啶� 啶掂た啶げ',
+    Confirm: '啶膏啶︵啶⑧ぜ 啶曕ぐ啶ㄠぞ',
+    appCreateDSLErrorPart4: '啶膏た啶膏啶熰ぎ-啶膏ぎ啶班啶ムた啶� DSL 啶膏啶膏啶曕ぐ啶�:',
+    appCreateDSLErrorPart3: '啶掂ぐ啷嵿い啶ぞ啶� 啶呧え啷佮お啷嵿ぐ啶啶� 啶∴啶忇じ啶忇げ 啶膏啶膏啶曕ぐ啶�:',
+    caution: '啶膏ぞ啶掂ぇ啶距え啷�',
+    appCreateDSLErrorTitle: '啶膏啶膏啶曕ぐ啶� 啶呧じ啶傕啶むた',
+    appCreateDSLErrorPart1: '啶∴啶忇じ啶忇げ 啶膏啶膏啶曕ぐ啶`啶� 啶啶� 啶忇 啶す啶む啶掂お啷傕ぐ啷嵿ぃ 啶呧啶むぐ 啶ぞ啶ぞ 啶椸く啶� 啶灌啷� 啶嗋く啶距い 啶曕 啶ぞ啶о啶� 啶曕ぐ啶ㄠ 啶膏 啶呧え啷佮お啷嵿ぐ啶啶� 啶啶� 啶栢ぐ啶距が啷� 啶� 啶膏啶む 啶灌啷�',
+    appCreateDSLWarning: '啶膏ぞ啶掂ぇ啶距え啷�: DSL 啶膏啶膏啶曕ぐ啶� 啶呧啶むぐ 啶曕啶� 啶膏啶掂た啶оぞ啶撪 啶曕 啶啶班き啶距さ啶苦い 啶曕ぐ 啶膏啶むぞ 啶灌',
+    appCreateDSLErrorPart2: '啶曕啶ぞ 啶嗋お 啶溹ぞ啶班 啶班啶ㄠぞ 啶氞ぞ啶灌い啷� 啶灌啶�?',
+    learnMore: '啶斷ぐ 啶溹ぞ啶ㄠ',
+    forBeginners: '啶ㄠ啶膏た啶栢た啶啶� 啶曕 啶侧た啶�',
+    foundResults: '{{啶椸た啶ㄠい啷�}} 啶ぐ啶苦ぃ啶距ぎ',
+    forAdvanced: '啶夃え啷嵿え啶� 啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶侧た啶�',
+    agentUserDescription: '啶啶ㄠぐ啶距さ啷冟い啷嵿い 啶むぐ啷嵿 啶斷ぐ 啶膏啶掂ぞ啶い啷嵿い 啶夃お啶曕ぐ啶� 啶啶� 啶膏啷嵿し啶� 啶忇 啶啶︵啶оた啶ぞ啶� 啶忇啷囙啶� 啶曕ぞ啶班啶� 啶侧啷嵿し啷嵿く啷嬥 啶曕 啶啶班ぞ啶啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕ぐ啶むぞ 啶灌啷�',
+    optional: '啶掂啶曕げ啷嵿お啶苦',
+    chatbotShortDescription: '啶膏ぐ啶� 啶膏啶熰啶� 啶曕 啶膏ぞ啶� 啶忇げ啶忇げ啶忇ぎ-啶嗋ぇ啶距ぐ啶苦い 啶氞啶熰が啷夃',
+    foundResult: '{{啶椸た啶ㄠい啷�}} 啶ぐ啶苦ぃ啶距ぎ',
+    completionUserDescription: '啶膏ぐ啶� 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶曕 啶膏ぞ啶� 啶ぞ啶� 啶ㄠた啶班啶ぞ啶� 啶曕ぞ啶班啶啶� 啶曕 啶侧た啶� 啶む啶掂ぐ啶苦い 啶班啶� 啶膏 AI 啶膏す啶距く啶� 啶え啶距啶傕イ',
+    noIdeaTip: '啶曕啶� 啶掂た啶氞ぞ啶� 啶ㄠす啷�啶�? 啶灌ぎ啶距ぐ啷� 啶熰啶啶啶侧啶� 啶︵啶栢啶�',
+    noTemplateFound: '啶曕啶� 啶熰啶啶げ啷囙 啶ㄠす啷�啶� 啶た啶侧ぞ',
+    completionShortDescription: '啶ぞ啶� 啶ㄠた啶班啶ぞ啶� 啶曕ぞ啶班啶啶� 啶曕 啶侧た啶� AI 啶膏す啶距く啶�',
+    noAppsFound: '啶曕啶� 啶愢お啷嵿げ啶苦啷囙ざ啶� 啶ㄠす啷�啶� 啶た啶侧ぞ',
+    chooseAppType: '啶愢お 啶啶班啶距ぐ 啶氞啶ㄠ啶�',
+    agentShortDescription: '啶むぐ啷嵿 啶斷ぐ 啶膏啶掂ぞ啶い啷嵿い 啶夃お啶曕ぐ啶� 啶夃お啶啶� 啶曕 啶膏ぞ啶� 啶啶︵啶оた啶ぞ啶� 啶忇啷囙啶�',
+    workflowShortDescription: '啶膏た啶傕啶�-啶熰ぐ啷嵿え 啶戉啷嬥ぎ啷囙ざ啶� 啶曕ぞ啶班啶啶� 啶曕 啶侧た啶� 啶戉ぐ啷嵿啷囙じ啷嵿啷嵿ぐ啷囙ざ啶�',
+    chatbotUserDescription: '啶膏ぐ啶� 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶曕 啶膏ぞ啶� 啶溹げ啷嵿う啷� 啶膏 啶忇げ啶忇げ啶忇ぎ-啶嗋ぇ啶距ぐ啶苦い 啶氞啶熰が啷夃 啶え啶距啶傕イ 啶嗋お 啶ぞ啶� 啶啶� 啶氞啶熰か啷嵿げ啷� 啶ぐ 啶膏啶掂た啶� 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+    advancedUserDescription: '啶膏啶啶むた 啶曕啶粪ぎ啶むぞ啶撪 啶曕 啶膏ぞ啶� 啶す啷�-啶︵啶� 啶溹啶苦げ 啶膏啶掂ぞ啶� 啶曕ぞ啶班啶啶� 啶曕 啶侧た啶� 啶掂ぐ啷嵿啶ぜ啷嵿げ啷� 啶戉ぐ啷嵿啷囙じ啷嵿啷嵿ぐ啷囙ざ啶ㄠイ',
+    advancedShortDescription: '啶膏啶啶むた 啶曕 啶膏ぞ啶� 啶溹啶苦げ 啶す啷�-啶啶∴ぜ 啶膏啶掂ぞ啶︵啶� 啶曕 啶侧た啶� 啶掂ぐ啷嵿啶ぜ啷嵿げ啷�',
+    noTemplateFoundTip: '啶掂た啶た啶ㄠ啶� 啶曕啶掂ぐ啷嵿ぁ 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕 啶栢啶溹え啷� 啶曕ぞ 啶啶班く啶距じ 啶曕ぐ啷囙啷�',
+    workflowUserDescription: '啶膏啶掂啶距げ啶� 啶斷ぐ 啶啶� 啶啶班じ啶傕じ啷嵿啶班ぃ 啶溹啶膏 啶忇啶�-啶︵啶� 啶曕ぞ啶班啶啶� 啶曕 啶侧た啶� 啶掂ぐ啷嵿啶ぜ啷嵿げ啷� 啶戉ぐ啷嵿啷囙じ啷嵿啷嵿ぐ啷囙ざ啶ㄠイ',
+  },
+  editApp: '啶溹ぞ啶ㄠ啶距ぐ啷� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+  editAppTitle: '啶愢お 啶溹ぞ啶ㄠ啶距ぐ啷� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+  editDone: '啶愢お 啶溹ぞ啶ㄠ啶距ぐ啷� 啶呧お啶∴啶� 啶曕 啶椸',
+  editFailed: '啶愢お 啶溹ぞ啶ㄠ啶距ぐ啷� 啶呧お啶∴啶� 啶曕ぐ啶ㄠ 啶啶� 啶掂た啶げ',
+  iconPicker: {
+    ok: '啶犩啶� 啶灌',
+    cancel: '啶班う啷嵿う 啶曕ぐ啷囙',
+    emoji: '啶囙ぎ啷嬥啷�',
+    image: '啶涏さ啶�',
+  },
+  switch: '啶掂ぐ啷嵿啶ぜ啷嵿げ啷� 啶戉ぐ啷嵿啷囙じ啷嵿啷嵿ぐ啷囙 啶ぐ 啶膏啶掂た啶� 啶曕ぐ啷囙',
+  switchTipStart: '啶嗋お啶曕 啶侧た啶� 啶忇 啶ㄠ 啶愢お 啶曕啶 啶え啶距 啶溹ぞ啶忇啷�, 啶斷ぐ 啶ㄠ 啶曕啶 啶掂ぐ啷嵿啶ぜ啷嵿げ啷� 啶戉ぐ啷嵿啷囙じ啷嵿啷嵿ぐ啷囙 啶啶� 啶膏啶掂た啶� 啶灌 啶溹ぞ啶忇啷�啷� 啶ㄠ 啶曕啶 ',
+  switchTip: '啶曕 啶呧え啷佮ぎ啶むた 啶ㄠす啷�啶� 啶︵啶椸ぞ',
+  switchTipEnd: ' 啶啶膏た啶� 啶戉ぐ啷嵿啷囙じ啷嵿啷嵿ぐ啷囙 啶啶� 啶膏啶掂た啶� 啶曕ぐ啶ㄠぞ啷�',
+  switchLabel: '啶え啶距 啶溹ぞ啶ㄠ 啶掂ぞ啶侧 啶愢お 啶曕啶',
+  removeOriginal: '啶啶� 啶愢お 啶灌啶距啶�',
+  switchStart: '啶膏啶掂た啶� 啶多啶班 啶曕ぐ啷囙',
+  typeSelector: {
+    all: '啶膏き啷� 啶啶班啶距ぐ',
+    chatbot: '啶氞啶熰が啷夃',
+    agent: '啶忇啷囙啶�',
+    workflow: '啶掂ぐ啷嵿啶ぜ啷嵿げ啷�',
+    completion: '啶膏ぎ啶距お啷嵿い啶�',
+    advanced: '啶氞啶熰か啷嵿げ啷�',
+  },
+  tracing: {
+    title: '啶忇お啷嵿げ啶苦啷囙ざ啶� 啶啶班う啶班啶多え 啶熰啶班啶膏た啶傕',
+    description: '啶む啶む啶�-啶啷嵿し LLMOps 啶啶班う啶距い啶� 啶曕 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啶ㄠぞ 啶斷ぐ 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶啶班う啶班啶多え 啶曕ぞ 啶熰啶班啶� 啶曕ぐ啶ㄠぞ啷�',
+    config: '啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+    collapse: '啶膏啶曕啶氞た啶� 啶曕ぐ啷囙',
+    expand: '啶掂た啶膏啶む啶� 啶曕ぐ啷囙',
+    tracing: '啶熰啶班啶膏た啶傕',
+    disabled: '啶呧啷嵿し啶�',
+    disabledTip: '啶曕啶く啶� 啶す啶侧 啶啶班う啶距い啶� 啶曕 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+    enabled: '啶膏啶掂ぞ 啶啶�',
+    tracingDescription: '啶忇お啷嵿げ啶苦啷囙ざ啶� 啶ㄠた啶粪啶ぞ啶︵え 啶曕ぞ 啶啶班ぞ 啶膏啶︵ぐ啷嵿き 啶曕啶啶氞ぐ 啶曕ぐ啷囙, 啶溹た啶膏ぎ啷囙 LLM 啶曕啶�, 啶膏啶︵ぐ啷嵿き, 啶啶班啶啶啶熰啶�, HTTP 啶呧え啷佮ぐ啷嬥ぇ 啶斷ぐ 啶呧ぇ啶苦 啶多ぞ啶た啶� 啶灌啶�, 啶忇 啶む啶む啶�-啶啷嵿し 啶熰啶班啶膏た啶傕 啶啶侧啶熰か啶监啶班啶� 啶ぐ啷�',
+    configProviderTitle: {
+      configured: '啶曕啶ㄠ啶ぜ啶苦啶� 啶曕た啶ぞ 啶椸く啶�',
+      notConfigured: '啶熰啶班啶膏た啶傕 啶膏啷嵿し啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶啶班う啶距い啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+      moreProvider: '啶呧ぇ啶苦 啶啶班う啶距い啶�',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: 'LLM-啶膏啶氞ぞ啶侧た啶� 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶溹啶掂え啶氞啷嵿ぐ 啶曕 啶啶班い啷嵿く啷囙 啶氞ぐ啶� 啶曕 啶侧た啶� 啶忇 啶戉げ-啶囙え-啶掂え 啶∴啶掂げ啶ぐ 啶啶侧啶熰か啶监啶班啶イ',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: '啶嗋お啶曕 LLM 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶曕 啶∴啶 啶斷ぐ 啶膏啶оぞ啶班え啷� 啶曕 啶侧た啶� 啶熰啶班啶�, 啶啶侧啶ぞ啶傕啶�, 啶啶班啶啶啶� 啶啶班が啶傕ぇ啶� 啶斷ぐ 啶啶熰啶班た啶曕啶膏イ',
+    },
+    inUse: '啶夃お啶啶� 啶啶�',
+    configProvider: {
+      title: '啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙 ',
+      placeholder: '啶呧お啶ㄠぞ {{key}} 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+      project: '啶啶班啶溹啶曕啶�',
+      publicKey: '啶膏ぞ啶班啶掂啶ㄠた啶� 啶曕啶傕啷�',
+      secretKey: '啶椸啶啶� 啶曕啶傕啷�',
+      viewDocsLink: '{{key}} 啶︵じ啷嵿い啶距さ啷囙啶� 啶︵啶栢啶�',
+      removeConfirmTitle: '{{key}} 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶灌啶距啶�?',
+      removeConfirmContent: '啶掂ぐ啷嵿い啶ぞ啶� 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶夃お啶啶� 啶啶� 啶灌, 啶囙じ啷� 啶灌啶距え啷� 啶膏 啶熰啶班啶膏た啶傕 啶膏啶掂た啶оぞ 啶啶� 啶灌 啶溹ぞ啶忇啷�啷�',
+    },
+    view: '啶︵啶栢え啶�',
+    opik: {
+      title: '啶撪お啶苦',
+      description: '啶撪お啶苦 啶忇げ啶忇げ啶忇ぎ 啶呧え啷佮お啷嵿ぐ啶啶椸啶� 啶曕 啶啶侧啶ぞ啶傕啶�, 啶ぐ啷�啶曕啶粪ぃ 啶斷ぐ 啶ㄠた啶椸ぐ啶距え啷� 啶曕 啶侧た啶� 啶忇 啶撪お啶�-啶膏啶班啶� 啶啶侧啶熰か啷夃ぐ啷嵿ぎ 啶灌啷�',
+    },
+    weave: {
+      title: '啶啶ㄠえ啶�',
+      description: '啶掂啶� 啶忇 啶撪お啶�-啶膏啶班啶� 啶啶侧啶熰か啶监啶班啶� 啶灌 啶溹 LLM 啶呧え啷佮お啷嵿ぐ啶啶椸啶� 啶曕ぞ 啶啶侧啶ぞ啶傕啶�, 啶ぐ啷�啶曕啶粪ぃ 啶斷ぐ 啶ㄠた啶椸ぐ啶距え啷� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶灌啷�',
+    },
+  },
+  answerIcon: {
+    title: '啶う啶侧え啷� 馃 啶曕 啶侧た啶� WebApp 啶氞た啶灌啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙',
+    descriptionInExplore: '啶忇啷嵿じ啶啶侧啶� 啶啶� 啶う啶侧え啷� 馃 啶曕 啶侧た啶� 啶掂啶啶� 啶嗋啶曕え 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶ㄠぞ 啶灌 啶ぞ 啶ㄠす啷�啶�',
+    description: '啶膏ぞ啶澿ぞ 啶呧え啷佮お啷嵿ぐ啶啶� 啶啶� 啶啶班い啶苦じ啷嵿ぅ啶距お啶苦い 馃 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� WebApp 啶氞た啶灌啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶ㄠぞ 啶灌 啶ぞ 啶ㄠす啷�啶�',
+  },
+  importFromDSLFile: '啶∴啶忇じ啶忇げ 啶ぜ啶距啶� 啶膏',
+  importFromDSLUrl: '啶啶嗋ぐ啶忇げ 啶膏',
+  importFromDSL: 'DSL 啶膏 啶嗋く啶距い 啶曕ぐ啷囙',
+  importFromDSLUrlPlaceholder: '啶∴啶忇じ啶忇げ 啶侧た啶傕 啶す啶距 啶啶膏啶� 啶曕ぐ啷囙',
+  mermaid: {
+    handDrawn: '啶灌ぞ啶� 啶栢啶傕啶�',
+    classic: '啶曕啶侧ぞ啶膏た啶�',
+  },
+  openInExplore: '啶忇啷嵿じ啶啶侧啶� 啶啶� 啶栢啶侧啶�',
+  newAppFromTemplate: {
+    sidebar: {
+      Writing: '啶曕啶むた啶ぞ啶�',
+      Recommended: '啶呧え啷佮ざ啶傕じ啶苦い',
+      Workflow: '啶曕ぞ啶班啶お啷嵿ぐ啶掂ぞ啶�',
+      Assistant: '啶た啶曕啶班 啶膏す啶距く啶�',
+      Agent: '啶嗋あ啶监い啶苦く啶�',
+      Programming: '啶啶班啶椸啶班ぞ啶た啶傕',
+      HR: '啶樴啶熰ぞ',
+    },
+    byCategories: '啶多啶班啶`た啶啶� 啶︵啶掂ぞ啶班ぞ',
+    searchAllTemplate: '啶膏き啷� 啶熰啶啶げ啷囙啷嵿じ 啶栢啶溹啶�...',
+  },
+  showMyCreatedAppsOnly: '啶曕啶掂げ 啶啶班 啶え啶距 啶椸 啶愢お啷嵿じ 啶︵た啶栢ぞ啶忇',
+  appSelector: {
+    params: '啶愢お 啶啶班ぞ啶啶熰ぐ',
+    noParams: '啶曕啶� 啶啶班ぞ啶啶熰ぐ 啶曕 啶嗋さ啶多啶啶むぞ 啶ㄠす啷�啶� 啶灌啷�',
+    placeholder: '啶忇 啶愢お 啶氞啶ㄠ啶�...',
+    label: '啶愢お',
+  },
+  structOutput: {
+    structured: '啶膏啶班啶苦い',
+    required: '啶嗋さ啶多啶',
+    LLMResponse: 'LLM 啶啶班い啶苦啷嵿ぐ啶苦く啶�',
+    moreFillTip: '啶呧ぇ啶苦啶むぎ 10 啶膏啶むぐ啷嬥 啶曕 啶ㄠ啶膏啶熰た啶傕 啶︵た啶栢ぞ啶ㄠぞ',
+    modelNotSupported: '啶啶∴げ 啶曕ぞ 啶膏ぎ啶班啶ムえ 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶�',
+    configure: '啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+    notConfiguredTip: '啶膏啶班啶苦い 啶嗋啶熰お啷佮 啶曕 啶呧き啷� 啶む 啶曕啶ㄠ啶ぜ啶苦啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶� 啶灌',
+    structuredTip: '啶膏啶班啶苦い 啶嗋啶熰お啷佮 啶忇 啶掂た啶多啶粪い啶� 啶灌 啶溹 啶す 啶膏啶ㄠた啶多啶氞た啶� 啶曕ぐ啶む 啶灌 啶曕た 啶啶∴げ 啶灌ぎ啷囙ざ啶� 啶嗋お啶曕 啶啶班う啶距え 啶曕た啶� 啶椸 JSON 啶膏啶曕啶ぞ 啶曕 啶呧え啷佮じ啶距ぐ 啶啶班い啶苦啷嵿ぐ啶苦く啶距啶佺敓鎴� 啶曕ぐ啷囙啶距イ',
+    modelNotSupportedTip: '啶掂ぐ啷嵿い啶ぞ啶� 啶啶∴げ 啶囙じ 啶膏啶掂た啶оぞ 啶曕ぞ 啶膏ぎ啶班啶ムえ 啶ㄠす啷�啶� 啶曕ぐ啶むぞ 啶灌 啶斷ぐ 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶啶班啶啶啶� 啶囙啶溹啶曕啶多え 啶啶� 啶∴ぞ啶夃え啶椸啶班啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷�',
+  },
+}
+
+export default translation
diff --git a/i18n/hi-IN/billing.ts b/i18n/hi-IN/billing.ts
new file mode 100644
index 0000000..1f8b295
--- /dev/null
+++ b/i18n/hi-IN/billing.ts
@@ -0,0 +1,213 @@
+const translation = {
+  currentPlan: '啶掂ぐ啷嵿い啶ぞ啶� 啶啶溹え啶�',
+  upgradeBtn: {
+    plain: '啶啶溹え啶� 啶呧お啶椸啶班啶� 啶曕ぐ啷囙',
+    encourage: '啶呧き啷� 啶呧お啶椸啶班啶� 啶曕ぐ啷囙',
+    encourageShort: '啶呧お啶椸啶班啶� 啶曕ぐ啷囙',
+  },
+  viewBilling: '啶た啶侧た啶傕 啶斷ぐ 啶膏が啷嵿じ啶曕啶班た啶啶多え 啶啶班が啶傕ぇ啶苦い 啶曕ぐ啷囙',
+  buyPermissionDeniedTip:
+    '啶膏が啷嵿じ啶曕啶班ぞ啶囙が 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕啶く啶� 啶呧お啶ㄠ 啶忇啶熰ぐ啶啶班ぞ啶囙啶� 啶掂啶さ啶膏啶ムぞ啶 啶膏 啶膏啶ぐ啷嵿 啶曕ぐ啷囙',
+  plansCommon: {
+    title: '啶嗋お啶曕 啶侧た啶� 啶膏す啷� 啶啶溹え啶� 啶氞啶ㄠ啶�',
+    yearlyTip: '啶掂ぞ啶班啶粪た啶� 啶膏が啷嵿じ啶曕啶班ぞ啶囙が 啶曕ぐ啶ㄠ 啶ぐ 2 啶す啷�啶ㄠ 啶啶啶� 啶ぞ啶忇!',
+    mostPopular: '啶膏が啶膏 啶侧啶曕お啷嵿ぐ啶苦く',
+    planRange: {
+      monthly: '啶ぞ啶膏た啶�',
+      yearly: '啶掂ぞ啶班啶粪た啶�',
+    },
+    month: '啶す啷�啶ㄠぞ',
+    year: '啶膏ぞ啶�',
+    save: '啶啶� 啶曕ぐ啷囙 ',
+    free: '啶啶啶�',
+    currentPlan: '啶掂ぐ啷嵿い啶ぞ啶� 啶啶溹え啶�',
+    contractSales: '啶た啶曕啶班 啶膏 啶膏啶ぐ啷嵿 啶曕ぐ啷囙',
+    contractOwner: '啶熰啶� 啶啶班が啶傕ぇ啶� 啶膏 啶膏啶ぐ啷嵿 啶曕ぐ啷囙',
+    startForFree: '啶啶啶� 啶啶� 啶多啶班 啶曕ぐ啷囙',
+    getStartedWith: '啶囙じ啶曕 啶膏ぞ啶� 啶多啶班 啶曕ぐ啷囙 ',
+    contactSales: '啶た啶曕啶班 啶膏 啶膏啶ぐ啷嵿 啶曕ぐ啷囙',
+    talkToSales: '啶た啶曕啶班 啶膏 啶ぞ啶� 啶曕ぐ啷囙',
+    modelProviders: '啶啶∴げ 啶啶班う啶距い啶�',
+    teamMembers: '啶熰啶� 啶曕 啶膏う啶膏啶�',
+    annotationQuota: '啶忇え啷嬥啷囙ざ啶� 啶曕啶熰ぞ',
+    buildApps: '啶愢お啷嵿じ 啶え啶距啶�',
+    vectorSpace: '啶掂啶曕啶熰ぐ 啶膏啶啶�',
+    vectorSpaceBillingTooltip:
+      '啶啶班い啷嵿く啷囙 1MB 啶侧啶 1.2 啶た啶侧た啶え 啶掂ぐ啷嵿ぃ啷嬥 啶曕 啶掂啶曕啶熰ぐ啶距啶溹啶� 啶∴啶熰ぞ 啶曕 啶膏啶椸啶班す啷�啶� 啶曕ぐ 啶膏啶むぞ 啶灌 (OpenAI 啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕 啶呧え啷佮ぎ啶距え啶苦い, 啶啶∴げ 啶啶� 啶た啶ㄠ啶ㄠい啶� 啶灌啶む 啶灌)啷�',
+    vectorSpaceTooltip:
+      '啶掂啶曕啶熰ぐ 啶膏啶啶� 啶掂す 啶︵啶班啶樴啶距げ啶苦 啶膏啶啶むた 啶啶班ぃ啶距げ啷� 啶灌 啶溹た啶膏啷� 啶嗋さ啶多啶啶むぞ LLMs 啶曕 啶嗋お啶曕 啶∴啶熰ぞ 啶曕 啶膏ぎ啶澿え啷� 啶曕 啶侧た啶� 啶灌啶む 啶灌啷�',
+    documentsUploadQuota: '啶︵じ啷嵿い啶距さ啷囙啶� 啶呧お啶侧啶� 啶曕啶熰ぞ',
+    documentProcessingPriority: '啶︵じ啷嵿い啶距さ啷囙啶� 啶啶班じ啶傕じ啷嵿啶班ぃ 啶啶班ぞ啶ムぎ啶苦啶むぞ',
+    documentProcessingPriorityTip:
+      '啶夃啷嵿 啶︵じ啷嵿い啶距さ啷囙啶� 啶啶班じ啶傕じ啷嵿啶班ぃ 啶啶班ぞ啶ムぎ啶苦啶むぞ 啶曕 啶侧た啶�, 啶曕啶く啶� 啶呧お啶ㄠ 啶啶溹え啶� 啶呧お啶椸啶班啶� 啶曕ぐ啷囙啷�',
+    documentProcessingPriorityUpgrade:
+      '啶む啶溹 啶膏 啶椸い啶� 啶ぐ 啶夃啷嵿 啶膏啷�啶曕い啶� 啶曕 啶膏ぞ啶� 啶呧ぇ啶苦 啶∴啶熰ぞ 啶膏啶膏ぞ啶оた啶� 啶曕ぐ啷囙啷�',
+    priority: {
+      'standard': '啶ぞ啶ㄠ',
+      'priority': '啶啶班ぞ啶ムぎ啶苦啶むぞ',
+      'top-priority': '啶多啶班啶� 啶啶班ぞ啶ムぎ啶苦啶むぞ',
+    },
+    logsHistory: '啶侧啶� 啶囙い啶苦す啶距じ',
+    customTools: '啶曕じ啷嵿啶� 啶熰啶侧啶�',
+    unavailable: '啶呧え啷佮お啶侧が啷嵿ぇ',
+    days: '啶︵た啶�',
+    unlimited: '啶呧じ啷�啶た啶�',
+    support: '啶膏ぎ啶班啶ムえ',
+    supportItems: {
+      communityForums: '啶膏ぎ啷佮う啶距く 啶啶班ぎ',
+      emailSupport: '啶堗ぎ啷囙げ 啶膏ぎ啶班啶ムえ',
+      priorityEmail: '啶啶班ぞ啶ムぎ啶苦啶むぞ 啶堗ぎ啷囙げ 啶斷ぐ 啶氞啶� 啶膏ぎ啶班啶ムえ',
+      logoChange: '啶侧啶椸 啶ぐ啶苦さ啶班啶むえ',
+      SSOAuthentication: 'SSO 啶啶班ぎ啶距ぃ啷�啶曕ぐ啶�',
+      personalizedSupport: '啶掂啶啷嵿い啶苦啶� 啶膏ぎ啶班啶ムえ',
+      dedicatedAPISupport: '啶膏ぎ啶班啶た啶� API 啶膏ぎ啶班啶ムえ',
+      customIntegration: '啶曕じ啷嵿啶� 啶忇啷�啶曕ぐ啶� 啶斷ぐ 啶膏ぎ啶班啶ムえ',
+      ragAPIRequest: 'RAG API 啶呧え啷佮ぐ啷嬥ぇ',
+      bulkUpload: '啶︵じ啷嵿い啶距さ啷囙啷嬥 啶曕ぞ 啶ム啶� 啶呧お啶侧啶�',
+      agentMode: '啶忇啷囙啶� 啶啶�',
+      workflow: '啶曕ぞ啶班啶お啷嵿ぐ啶掂ぞ啶�',
+      llmLoadingBalancing: 'LLM 啶侧啶� 啶啶侧啶傕じ啶苦啶�',
+      llmLoadingBalancingTooltip:
+        '啶啶∴げ啷嵿じ 啶啶� 啶曕 API 啶曕啶傕啶苦く啶距 啶溹啶∴ぜ啷囙, 啶啶班き啶距さ啷� 啶班啶� 啶膏 API 啶︵ぐ 啶膏啶ぞ啶撪 啶曕 啶ぞ啶お啶距じ 啶曕ぐ啷囙啷�',
+    },
+    comingSoon: '啶溹げ啷嵿う 啶� 啶班す啶� 啶灌',
+    member: '啶膏う啶膏啶�',
+    memberAfter: '啶膏う啶膏啶�',
+    messageRequest: {
+      title: '啶膏啶︵啶� 啶曕啶班啶∴た啶熰啶�',
+      tooltip:
+        '啶掂た啶た啶ㄠ啶� 啶啶溹え啶距啶� 啶曕 啶侧た啶� 啶膏啶︵啶� 啶嗋す啷嵿さ啶距え 啶曕啶熰ぞ OpenAI 啶啶∴げ啷嬥 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕 (gpt4 啶曕 啶涏啶∴ぜ啶曕ぐ)啷� 啶膏啶ぞ 啶膏 啶呧ぇ啶苦 啶膏啶︵啶� 啶嗋お啶曕 OpenAI API 啶曕啶傕啷� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙啶椸啷�',
+      titlePerMonth: '{{count,number}} 啶膏啶︵啶�/啶す啷�啶ㄠぞ',
+    },
+    annotatedResponse: {
+      title: '啶忇え啷嬥啷囙ざ啶� 啶曕啶熰ぞ 啶膏啶ぞ啶忇',
+      tooltip:
+        '啶啶班い啶苦啷嵿ぐ啶苦く啶距啶� 啶曕ぞ 啶啶ㄠ啶啶呧げ 啶膏啶ぞ啶︵え 啶斷ぐ 啶忇え啷嬥啷囙ざ啶� 啶愢お啷嵿じ 啶曕 啶侧た啶� 啶呧え啷佮啷傕げ啶� 啶啶椸啶� 啶夃啷嵿-啶椸啶`さ啶む啶むぞ 啶掂ぞ啶侧 啶啶班ざ啷嵿え-啶夃い啷嵿い啶� 啶曕啶粪ぎ啶むぞ啶忇 啶啶班う啶距え 啶曕ぐ啶むぞ 啶灌啷� (啶曕啶掂げ 啶氞啶� 啶愢お啷嵿じ 啶啶� 啶侧ぞ啶椸)',
+    },
+    ragAPIRequestTooltip:
+      'Dify 啶曕 啶曕啶掂げ 啶溹啶炧ぞ啶� 啶嗋ぇ啶距ぐ 啶啶班じ啶傕じ啷嵿啶班ぃ 啶曕啶粪ぎ啶むぞ啶撪 啶曕 啶嗋す啷嵿さ啶距え 啶曕ぐ啶ㄠ 啶掂ぞ啶侧 API 啶曕啶� 啶曕 啶膏啶栢啶ぞ 啶曕 啶膏啶︵ぐ啷嵿き啶苦い 啶曕ぐ啶むぞ 啶灌啷�',
+    receiptInfo:
+      '啶曕啶掂げ 啶熰啶� 啶曕 啶ぞ啶侧た啶� 啶斷ぐ 啶熰啶� 啶忇ぁ啶た啶� 啶膏が啷嵿じ啶曕啶班ぞ啶囙が 啶曕ぐ 啶膏啶む 啶灌啶� 啶斷ぐ 啶た啶侧た啶傕 啶溹ぞ啶ㄠ啶距ぐ啷� 啶︵啶� 啶膏啶む 啶灌啶�',
+    freeTrialTipPrefix: '啶膏ぞ啶囙え 啶呧お 啶曕ぐ啷囙 啶斷ぐ 啶啶班ぞ啶啶� 啶曕ぐ啷囙 啶忇',
+    teamMember_other: '{{count,number}} 啶熰啶� 啶膏う啶膏啶�',
+    comparePlanAndFeatures: '啶啶溹え啶� 啶斷ぐ 啶掂た啶多啶粪い啶距啶� 啶曕 啶む啶侧え啶� 啶曕ぐ啷囙',
+    apiRateLimit: '啶忇お啷�啶嗋 啶︵ぐ 啶膏啶ぞ',
+    documentsRequestQuota: '{{count,number}}/啶た啶ㄠ 啶溹啶炧ぞ啶� 啶呧え啷佮ぐ啷嬥ぇ 啶︵ぐ 啶膏啶ぞ',
+    self: '啶膏啶�-啶灌啶膏啶熰啶�',
+    getStarted: '啶多啶班 啶曕ぐ啷囙',
+    annualBilling: '啶掂ぞ啶班啶粪た啶� 啶た啶侧た啶傕',
+    documentsTooltip: '啶溹啶炧ぞ啶� 啶∴啶熰ぞ 啶膏啶班啶� 啶膏 啶嗋く啶距い 啶曕た啶� 啶椸 啶︵じ啷嵿い啶距さ啷囙啷嬥 啶曕 啶膏啶栢啶ぞ 啶ぐ 啶曕啶熰ぞ啷�',
+    priceTip: '啶啶班い啷嵿く啷囙 啶曕ぞ啶班啶啷嵿し啷囙い啷嵿ぐ/',
+    cloud: '啶曕啶侧ぞ啶夃ぁ 啶膏啶掂ぞ',
+    unlimitedApiRate: '啶曕啶� 啶忇お啷�啶嗋 啶︵ぐ 啶膏啶ぞ 啶ㄠす啷�啶�',
+    freeTrialTip: '200 啶撪お啶ㄠ啶嗋 啶曕啶侧啶� 啶曕ぞ 啶啶啶� 啶ぐ啷�啶曕啶粪ぃ啷�',
+    documents: '{{count,number}} 啶溹啶炧ぞ啶� 啶︵じ啷嵿い啶距さ啷囙啶�',
+    freeTrialTipSuffix: '啶曕啶� 啶曕啶班啶∴た啶� 啶曕ぞ啶班啶� 啶曕 啶嗋さ啶多啶啶むぞ 啶ㄠす啷�啶� 啶灌',
+    apiRateLimitUnit: '{{count,number}}/啶︵た啶�',
+    teamWorkspace: '{{count,number}} 啶熰啶� 啶曕ぞ啶班啶啷嵿し啷囙い啷嵿ぐ',
+    apiRateLimitTooltip: 'Dify API 啶曕 啶ぞ啶о啶ぎ 啶膏 啶曕 啶椸 啶膏き啷� 啶呧え啷佮ぐ啷嬥ぇ啷嬥 啶ぐ API 啶︵ぐ 啶膏啶ぞ 啶侧ぞ啶椸 啶灌啶む 啶灌, 啶溹た啶膏ぎ啷囙 啶熰啶曕啶膏啶� 啶溹え啶班啶多え, 啶氞啶� 啶掂ぞ啶班啶むぞ啶侧ぞ啶�, 啶曕ぞ啶班啶お啷嵿ぐ啶掂ぞ啶� 啶ㄠた啶粪啶ぞ啶︵え 啶斷ぐ 啶︵じ啷嵿い啶距さ啷囙啶� 啶啶班じ啶傕じ啷嵿啶班ぃ 啶多ぞ啶た啶� 啶灌啶傕イ',
+    teamMember_one: '{{count,number}} 啶熰啶� 啶膏う啶膏啶�',
+    documentsRequestQuotaTooltip: '啶す 啶溹啶炧ぞ啶� 啶嗋ぇ啶距ぐ 啶啶� 啶忇 啶曕ぞ啶班啶啷嵿し啷囙い啷嵿ぐ 啶︵啶掂ぞ啶班ぞ 啶啶班い啶� 啶た啶ㄠ 啶曕た啶� 啶溹ぞ 啶膏啶ㄠ 啶掂ぞ啶侧 啶曕啶� 啶曕ぞ啶班啶啶� 啶曕 啶膏啶栢啶ぞ 啶曕 啶ㄠた啶班啶︵た啶粪啶� 啶曕ぐ啶むぞ 啶灌, 啶溹た啶膏ぎ啷囙 啶∴啶熰ぞ啶膏啶� 啶え啶距え啶�, 啶灌啶距え啶�, 啶呧お啶∴啶� 啶曕ぐ啶ㄠぞ, 啶︵じ啷嵿い啶距さ啷囙啶� 啶呧お啶侧啶� 啶曕ぐ啶ㄠぞ, 啶膏啶多啶оえ 啶曕ぐ啶ㄠぞ, 啶膏啶椸啶班す啶苦い 啶曕ぐ啶ㄠぞ 啶斷ぐ 啶溹啶炧ぞ啶� 啶嗋ぇ啶距ぐ 啶呧え啷佮ぐ啷嬥ぇ 啶多ぞ啶た啶� 啶灌啶傕イ 啶囙じ 啶啶熰啶班た啶� 啶曕ぞ 啶夃お啶啶� 啶溹啶炧ぞ啶� 啶嗋ぇ啶距ぐ 啶呧え啷佮ぐ啷嬥ぇ啷嬥 啶曕 啶啶班う啶班啶多え 啶曕ぞ 啶啶侧啶ぞ啶傕啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷� 啶夃う啶距す啶班ぃ 啶曕 啶侧た啶�, 啶う啶� 啶忇 啶膏啶傕ぁ啶啶曕啶� 啶夃お啶啶椸啶班啶むぞ 啶忇 啶た啶ㄠ 啶曕 啶啶むぐ 10 啶侧啶距い啶距ぐ 啶灌た啶� 啶ぐ啷�啶曕啶粪ぃ 啶曕ぐ啶むぞ 啶灌, 啶む 啶夃え啶曕 啶曕ぞ啶班啶啷嵿し啷囙い啷嵿ぐ 啶曕 啶呧啶侧 啶た啶ㄠ 啶曕 啶侧た啶� 啶ㄠた啶啶ㄠげ啶苦啶苦い 啶曕ぞ啶班啶啶� 啶曕 啶曕ぐ啶ㄠ 啶膏 啶呧じ啷嵿ぅ啶距く啷� 啶班啶� 啶膏 啶啶班い啶苦が啶傕ぇ啶苦い 啶曕た啶ぞ 啶溹ぞ啶忇啶�: 啶∴啶熰ぞ啶膏啶� 啶え啶距え啶�, 啶灌啶距え啶�, 啶呧お啶∴啶� 啶曕ぐ啶ㄠぞ 啶斷ぐ 啶︵じ啷嵿い啶距さ啷囙啶� 啶呧お啶侧啶� 啶ぞ 啶膏啶多啶оえ 啶曕ぐ啶ㄠぞ啷�',
+  },
+  plans: {
+    sandbox: {
+      name: '啶膏啶傕ぁ啶啶曕啶�',
+      description: '200 啶ぞ啶� GPT 啶啶啶� 啶熰啶班ぞ啶げ',
+      includesTitle: '啶多ぞ啶た啶� 啶灌啶�:',
+      for: '啶曕啶� 啶曕啶粪ぎ啶むぞ啶撪 啶曕ぞ 啶啶啶� 啶ぐ啷�啶曕啶粪ぃ',
+    },
+    professional: {
+      name: '啶啶班啶啶多え啶�',
+      description:
+        '啶掂啶啷嵿い啶苦く啷嬥 啶斷ぐ 啶涏啶熰 啶熰啶啶� 啶曕 啶侧た啶� 啶呧ぇ啶苦 啶多啷嵿い啶� 啶膏じ啷嵿い啷� 啶︵ぐ 啶ぐ 啶栢啶侧啶傕イ',
+      includesTitle: '啶啶啶� 啶啶溹え啶� 啶啶� 啶膏が 啶曕啶�, 啶膏ぞ啶� 啶啶�:',
+      for: '啶膏啶掂い啶傕い啷嵿ぐ 啶∴啶掂げ啶ぐ啷嵿じ/啶涏啶熰 啶熰啶啶� 啶曕 啶侧た啶�',
+    },
+    team: {
+      name: '啶熰啶�',
+      description:
+        '啶た啶ㄠぞ 啶膏啶ぞ 啶曕 啶膏す啶啶� 啶曕ぐ啷囙 啶斷ぐ 啶多啶班啶� 啶膏啶むぐ啷�啶� 啶啶班う啶班啶多え 啶曕ぞ 啶嗋え啶傕う 啶侧啶傕イ',
+      includesTitle: '啶啶班啶啶多え啶� 啶啶溹え啶� 啶啶� 啶膏が 啶曕啶�, 啶膏ぞ啶� 啶啶�:',
+      for: '啶ぇ啷嵿く啶� 啶嗋啶距ぐ 啶曕 啶熰啶啶� 啶曕 啶侧た啶�',
+    },
+    enterprise: {
+      name: '啶忇啶熰ぐ啶啶班ぞ啶囙啶�',
+      description:
+        '啶ぁ啶监 啶啶ぞ啶ㄠ 啶ぐ 啶た啶多え-啶曕啶班た啶熰た啶曕げ 啶膏た啶膏啶熰ぎ 啶曕 啶侧た啶� 啶啶班啶� 啶曕啶粪ぎ啶むぞ啶忇 啶斷ぐ 啶膏ぎ啶班啶ムえ 啶啶班ぞ啶啶� 啶曕ぐ啷囙啷�',
+      includesTitle: '啶熰啶� 啶啶溹え啶� 啶啶� 啶膏が 啶曕啶�, 啶膏ぞ啶� 啶啶�:',
+      features: {
+        0: '啶夃う啷嵿く啷嬥 啶膏啶むぐ 啶曕 啶ぁ啶监 啶啶ぞ啶ㄠ 啶ぐ 啶掂た啶むぐ啶� 啶膏ぎ啶距ぇ啶距え',
+        3: '啶呧え啷囙 啶曕ぞ啶班啶啷嵿し啷囙い啷嵿ぐ 啶斷ぐ 啶夃う啷嵿く啶� 啶啶班が啶傕ぇ啶�',
+        8: '啶啶班啶啶多え啶� 啶む啶ㄠ啶曕 啶膏ぎ啶班啶ムえ',
+        6: '啶夃え啷嵿え啶� 啶膏啶班啷嵿し啶� 啶斷ぐ 啶ㄠた啶啶む啶班ぃ',
+        2: '啶掂た啶多啶� 啶夃う啷嵿く啶� 啶膏啶掂た啶оぞ啶忇',
+        1: 'Commercial License Authorization',
+        4: 'SSO',
+        5: '啶∴た啶ぞ啶� 啶ぞ啶班啶熰え啶班啶� 啶︵啶掂ぞ啶班ぞ 啶ぞ啶む啷�啶� 啶曕た啶� 啶椸 啶忇じ啶忇げ啶�',
+        7: '啶∴啶ぞ啶� 啶︵啶掂ぞ啶班ぞ 啶嗋ぇ啶苦啶距ぐ啶苦 啶班啶� 啶膏 啶呧お啶∴啶� 啶斷ぐ 啶班啶班啶距さ',
+      },
+      price: '啶曕じ啷嵿啶�',
+      btnText: '啶た啶曕啶班 啶膏 啶膏啶ぐ啷嵿 啶曕ぐ啷囙',
+      priceTip: '啶掂ぞ啶班啶粪た啶� 啶た啶侧た啶傕 啶曕啶掂げ',
+      for: '啶ぁ啶监 啶嗋啶距ぐ 啶曕 啶熰啶啶� 啶曕 啶侧た啶�',
+    },
+    community: {
+      features: {
+        2: '啶∴た啶 啶撪お啶� 啶膏啶班啶� 啶侧ぞ啶囙じ啷囙啶� 啶曕 啶呧え啷佮お啶距げ啶� 啶啶�',
+        0: '啶膏き啷� 啶啶栢啶� 啶膏啶掂た啶оぞ啶忇 啶膏ぞ啶班啶掂啶ㄠた啶� 啶膏啶椸啶班す 啶曕 啶むす啶� 啶溹ぞ啶班 啶曕 啶椸 啶灌啶傕イ',
+        1: '啶忇啶� 啶曕ぞ啶班啶啷嵿し啷囙い啷嵿ぐ',
+      },
+      description: '啶掂啶啷嵿い啶苦啶� 啶夃お啶啶椸啶班啶むぞ啶撪, 啶涏啶熰 啶熰啶啶�, 啶ぞ 啶椸啶�-啶掂啶ぞ啶掂じ啶距く啶苦 啶ぐ啶苦く啷嬥啶ㄠぞ啶撪 啶曕 啶侧た啶�',
+      for: '啶掂啶啷嵿い啶苦啶� 啶夃お啶啶椸啶班啶むぞ啶撪, 啶涏啶熰 啶熰啶啶�, 啶ぞ 啶椸啶�-啶掂啶ぞ啶掂じ啶距く啶苦 啶ぐ啶苦く啷嬥啶ㄠぞ啶撪 啶曕 啶侧た啶�',
+      includesTitle: '啶ㄠた啶冟ざ啷佮げ啷嵿 啶膏啶掂た啶оぞ啶忇:',
+      btnText: '啶膏ぎ啷佮う啶距く 啶曕 啶膏ぞ啶� 啶嗋ぐ啶傕き 啶曕ぐ啷囙',
+      name: '啶膏ぎ啷佮う啶距く',
+      price: '啶啶曕啶�',
+    },
+    premium: {
+      features: {
+        2: '啶掂啶� 啶愢お 啶侧啶椸 啶斷ぐ 啶啶班ぞ啶傕ぁ啶苦啶� 啶曕じ啷嵿啶ぞ啶囙啷囙ざ啶�',
+        3: '啶啶班ぞ啶ムぎ啶苦啶むぞ 啶堗ぎ啷囙げ 啶斷ぐ 啶氞啶� 啶膏ぎ啶班啶ムえ',
+        1: '啶忇啶� 啶曕ぞ啶班啶啷嵿し啷囙い啷嵿ぐ',
+        0: '啶掂た啶た啶ㄠ啶� 啶曕啶侧ぞ啶夃ぁ 啶啶班う啶距い啶距啶� 啶︵啶掂ぞ啶班ぞ 啶嗋い啷嵿ぎ-啶啶班が啶傕ぇ啶苦い 啶掂た啶多啶掂じ啶ㄠ啶い啶�',
+      },
+      priceTip: '啶曕啶侧ぞ啶夃ぁ 啶ぞ啶班啶曕啶熰お啷嵿げ啷囙じ 啶曕 啶嗋ぇ啶距ぐ 啶ぐ',
+      name: '啶啶班啶た啶ぎ',
+      btnText: '啶啶班啶た啶ぎ 啶啶班ぞ啶啶� 啶曕ぐ啷囙',
+      price: '啶膏啶曕啶侧啶げ',
+      includesTitle: '啶膏ぎ啷佮う啶距く 啶膏 啶膏が 啶曕啶�, 啶囙じ啶曕 啶呧げ啶距さ啶�:',
+      for: '啶ぇ啷嵿く啶� 啶嗋啶距ぐ 啶曕 啶膏啶椸啶ㄠ啶� 啶斷ぐ 啶熰啶啶� 啶曕 啶侧た啶�',
+      description: '啶ぇ啷嵿く啶� 啶嗋啶距ぐ 啶曕 啶膏啶椸啶ㄠ啶� 啶斷ぐ 啶熰啶啶� 啶曕 啶侧た啶�',
+      comingSoon: '啶ぞ啶囙啷嵿ぐ啷嬥じ啷夃か啷嵿 啶忇啶监啶啶� 啶斷ぐ 啶椸啶椸げ 啶曕啶侧ぞ啶夃ぁ 啶膏ぎ啶班啶ムえ 啶溹げ啷嵿う 啶灌 啶� 啶班す啶� 啶灌',
+    },
+  },
+  vectorSpace: {
+    fullTip: '啶掂啶曕啶熰ぐ 啶膏啶啶� 啶啶班啶� 啶灌啷�',
+    fullSolution: '啶呧ぇ啶苦 啶膏啶ムぞ啶� 啶啶班ぞ啶啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶呧お啶ㄠ 啶啶溹え啶� 啶呧お啶椸啶班啶� 啶曕ぐ啷囙啷�',
+  },
+  apps: {
+    fullTipLine1: '啶呧ぇ啶苦 啶愢お啷嵿じ 啶え啶距え啷� 啶曕 啶侧た啶�',
+    fullTipLine2: '啶呧お啶ㄠ 啶啶溹え啶� 啶呧お啶椸啶班啶� 啶曕ぐ啷囙啷�',
+    fullTip1: '啶呧ぇ啶苦 啶愢お啷嵿じ 啶え啶距え啷� 啶曕 啶侧た啶� 啶呧お啶椸啶班啶� 啶曕ぐ啷囙',
+    fullTip2: '啶啶溹え啶� 啶曕 啶膏啶ぞ 啶す啷佮啶� 啶椸',
+    contactUs: '啶灌ぎ啶膏 啶膏啶ぐ啷嵿 啶曕ぐ啷囙',
+    fullTip1des: '啶嗋お 啶囙じ 啶啶溹え啶� 啶ぐ 啶愢お啷嵿じ 啶え啶距え啷� 啶曕 啶膏啶ぞ 啶む 啶す啷佮啶� 啶氞啶曕 啶灌啶傕イ',
+    fullTip2des: '啶呧啶� 啶呧え啷佮お啷嵿ぐ啶啶椸啶� 啶曕 啶膏ぞ啶� 啶曕ぐ啶ㄠ 啶曕 啶膏た啶ぞ啶班た啶� 啶曕 啶溹ぞ啶む 啶灌 啶むぞ啶曕た 啶夃お啶啶� 啶曕 啶啶曕啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啷�, 啶ぞ 啶灌ぎ啶膏 啶膏啶ぐ啷嵿 啶曕ぐ啷囙啷�',
+  },
+  annotatedResponse: {
+    fullTipLine1: '啶呧ぇ啶苦 啶ぞ啶む啷�啶� 啶曕 啶忇え啷嬥啷囙 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�',
+    fullTipLine2: '啶呧お啶ㄠ 啶啶溹え啶� 啶呧お啶椸啶班啶� 啶曕ぐ啷囙啷�',
+    quotaTitle: '啶忇え啷嬥啷囙ざ啶� 啶夃い啷嵿い啶� 啶曕啶熰ぞ',
+  },
+  usagePage: {
+    annotationQuota: '啶忇え啷嬥啷囙ざ啶� 啶曕啶熰ぞ',
+    buildApps: '啶愢お 啶え啶距啶�',
+    documentsUploadQuota: '啶︵じ啷嵿い啶距さ啷囙啶� 啶呧お啶侧啶� 啶曕啶熰ぞ',
+    vectorSpace: '啶溹啶炧ぞ啶� 啶∴啶熰ぞ 啶啶∴ぞ啶班ぃ',
+    teamMembers: '啶熰啶� 啶曕 啶膏う啶膏啶�',
+    vectorSpaceTooltip: '啶夃啷嵿 啶椸啶`さ啶む啶むぞ 啶掂ぞ啶侧 啶呧え啷佮啷嵿ぐ啶ぃ 啶啶� 啶曕 啶膏ぞ啶� 啶︵じ啷嵿い啶距さ啷囙啶监啶� 啶曕 啶侧た啶� 啶溹啶炧ぞ啶� 啶∴啶熰ぞ 啶膏啶熰啶班啶� 啶膏啶膏ぞ啶оえ啷嬥 啶曕ぞ 啶夃お啶啶� 啶灌啶椸ぞ啷� 啶溹が 啶溹啶炧ぞ啶� 啶∴啶熰ぞ 啶膏啶熰啶班啶� 啶膏啶ぞ 啶む 啶す啷佮啶� 啶溹ぞ啶忇啶�, 啶む 啶ㄠ 啶︵じ啷嵿い啶距さ啷囙啶� 啶ㄠす啷�啶� 啶呧お啶侧啶� 啶曕た啶� 啶溹ぞ啶忇啶椸啷�',
+  },
+  teamMembers: '啶熰啶� 啶曕 啶膏う啶膏啶�',
+}
+
+export default translation
diff --git a/i18n/hi-IN/common.ts b/i18n/hi-IN/common.ts
new file mode 100644
index 0000000..4964bcb
--- /dev/null
+++ b/i18n/hi-IN/common.ts
@@ -0,0 +1,694 @@
+const translation = {
+  api: {
+    success: '啶膏か啶侧い啶�',
+    actionSuccess: '啶曕ぞ啶班啶班さ啶距 啶膏か啶� 啶班す啷�',
+    saved: '啶膏す啷囙啶� 啶椸く啶�',
+    create: '啶え啶距く啶� 啶椸く啶�',
+    remove: '啶灌啶距く啶� 啶椸く啶�',
+  },
+  operation: {
+    create: '啶え啶距啶�',
+    confirm: '啶啶粪啶熰た 啶曕ぐ啷囙',
+    cancel: '啶班う啷嵿う 啶曕ぐ啷囙',
+    clear: '啶膏ぞ啶� 啶曕ぐ啷囙',
+    save: '啶膏す啷囙啷囙',
+    saveAndEnable: '啶膏す啷囙啷囙 啶斷ぐ 啶膏啷嵿し啶� 啶曕ぐ啷囙',
+    edit: '啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+    add: '啶溹啶∴ぜ啷囙',
+    added: '啶溹啶∴ぜ啶� 啶椸く啶�',
+    refresh: '啶啶ㄠ 啶啶班ぞ啶班啶� 啶曕ぐ啷囙',
+    reset: '啶班啶膏啶� 啶曕ぐ啷囙',
+    search: '啶栢啶溹啶�',
+    change: '啶う啶侧啶�',
+    remove: '啶灌啶距啶�',
+    send: '啶啶溹啶�',
+    copy: '啶曕啶 啶曕ぐ啷囙',
+    lineBreak: '啶侧ぞ啶囙え 啶啶班啶�',
+    sure: '啶啶澿 啶啷�啶� 啶灌',
+    download: '啶∴ぞ啶夃え啶侧啶� 啶曕ぐ啷囙',
+    delete: '啶灌啶距啶�',
+    settings: '啶膏啶熰た啶傕啷嵿じ',
+    setup: '啶膏啶熰啶�',
+    getForFree: '啶啶啶� 啶啶� 啶啶班ぞ啶啶� 啶曕ぐ啷囙',
+    reload: '啶啶ㄠ 啶侧啶� 啶曕ぐ啷囙',
+    ok: '啶犩啶� 啶灌',
+    log: '啶侧啶�',
+    learnMore: '啶呧ぇ啶苦 啶溹ぞ啶ㄠ啶�',
+    params: '啶啶班ぞ啶啶熰ぐ',
+    duplicate: '啶∴啶啶侧た啶曕啶�',
+    rename: '啶ㄠぞ啶� 啶う啶侧啶�',
+    audioSourceUnavailable: '啶戉ぁ啶苦く啷� 啶膏啶班啶� 啶呧え啷佮お啶侧が啷嵿ぇ 啶灌',
+    copyImage: '啶涏さ啶� 啶曕啶 啶曕ぐ啷囙',
+    zoomOut: '啶溹ぜ啷傕ぎ 啶嗋啶� 啶曕ぐ啷囙',
+    openInNewTab: '啶ㄠ 啶熰啶� 啶啶� 啶栢啶侧啶�',
+    zoomIn: '啶溹ぜ啷傕ぎ 啶囙え 啶曕ぐ啷囙',
+    view: '啶︵啶栢え啶�',
+    viewMore: '啶斷ぐ 啶︵啶栢啶�',
+    regenerate: '啶啶ㄠぐ啷嵿啶ㄠ啶�',
+    close: '啶啶� 啶曕ぐ啶ㄠぞ',
+    saveAndRegenerate: '啶膏す啷囙啷囙 啶斷ぐ 啶啶�: 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啷囙 啶ぞ啶� 啶掂た啶栢啶∴',
+    skip: '啶溹す啶距啶�',
+    submit: '啶溹ぎ啶� 啶曕ぐ啷囙',
+    imageCopied: '啶曕啶 啶曕 啶椸 啶涏さ啶�',
+    deleteApp: '啶愢お 啶灌啶距啶�',
+    in: '啶啶�',
+    copied: '啶曕啶 啶曕た啶ぞ 啶椸く啶�',
+    viewDetails: '啶掂た啶掂ぐ啶� 啶︵啶栢啶�',
+    more: '啶呧ぇ啶苦',
+    downloadSuccess: '啶∴ぞ啶夃え啶侧啶� 啶啶班ぞ 啶灌啶嗋イ',
+    downloadFailed: '啶∴ぞ啶夃え啶侧啶� 啶掂た啶げ啷� 啶曕啶く啶� 啶ぞ啶� 啶啶� 啶啶ㄠ 啶啶班く啶距じ 啶曕ぐ啷囙啷�',
+    format: '啶啶班啶啶�',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 啶嗋さ啶多啶 啶灌',
+    urlError: 'url 啶曕 http:// 啶ぞ https:// 啶膏 啶多啶班 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶�',
+  },
+  placeholder: {
+    input: '啶曕啶く啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    select: '啶曕啶く啶� 啶氞く啶� 啶曕ぐ啷囙',
+  },
+  voice: {
+    language: {
+      zhHans: '啶氞啶ㄠ',
+      zhHant: '啶ぞ啶班啶ぐ啶苦 啶氞啶ㄠ',
+      enUS: '啶呧啶椸啶班啶溹ぜ啷�',
+      deDE: '啶溹ぐ啷嵿ぎ啶�',
+      frFR: '啶啶班啶傕',
+      esES: '啶膏啶啶ㄠた啶�',
+      itIT: '啶囙い啶距げ啶掂',
+      thTH: '啶ムぞ啶�',
+      idID: '啶囙啶∴啶ㄠ啶多た啶ぞ啶�',
+      jaJP: '啶溹ぞ啶ぞ啶ㄠ',
+      koKR: '啶曕啶班た啶ぞ啶�',
+      ptBR: '啶啶班啶む啶距げ啷�',
+      ruRU: '啶班啶膏',
+      ukUA: '啶啶曕啶班啶ㄠ',
+      viVN: '啶掂た啶い啶ㄠぞ啶',
+      plPL: '啶啶侧た啶�',
+      roRO: '啶班啶ぞ啶ㄠた啶ぞ啶�',
+      hiIN: '啶灌た啶ㄠ啶︵',
+      trTR: '啶む啶班啶曕',
+      faIR: '啶ぜ啶距ぐ啶膏',
+    },
+  },
+  unit: {
+    char: '啶掂ぐ啷嵿ぃ',
+  },
+  actionMsg: {
+    noModification: '啶囙じ 啶膏ぎ啶� 啶曕啶� 啶膏啶多啶оえ 啶ㄠす啷�啶傕イ',
+    modifiedSuccessfully: '啶膏か啶侧い啶距お啷傕ぐ啷嵿さ啶� 啶膏啶多啶оた啶� 啶曕た啶ぞ 啶椸く啶�',
+    modifiedUnsuccessfully: '啶膏啶多啶оえ 啶呧じ啶げ 啶班す啶�',
+    copySuccessfully: '啶膏か啶侧い啶距お啷傕ぐ啷嵿さ啶� 啶曕啶 啶曕た啶ぞ 啶椸く啶�',
+    paySucceeded: '啶啶椸い啶距え 啶膏か啶� 啶班す啶�',
+    payCancelled: '啶啶椸い啶距え 啶班う啷嵿う 啶曕ぐ 啶︵た啶ぞ 啶椸く啶�',
+    generatedSuccessfully: '啶膏か啶侧い啶距お啷傕ぐ啷嵿さ啶� 啶夃い啷嵿お啶ㄠ啶� 啶灌啶�',
+    generatedUnsuccessfully: '啶夃い啷嵿お啶ㄠ啶� 啶呧じ啶げ 啶班す啶�',
+  },
+  model: {
+    params: {
+      temperature: '啶むぞ啶ぎ啶距え',
+      temperatureTip:
+        '啶呧え啶苦く啶た啶むい啶� 啶曕 啶ㄠた啶啶む啶班た啶� 啶曕ぐ啶むぞ 啶灌: 啶曕ぎ 啶曕ぐ啶ㄠ 啶膏 啶曕ぎ 啶呧え啶苦く啶た啶� 啶啶班啶`い啶距啶� 啶灌啶む 啶灌啶傕イ 啶溹啶膏 啶灌 啶むぞ啶ぎ啶距え 啶多啶ㄠ啶� 啶曕 啶曕ぐ啷�啶� 啶嗋い啶� 啶灌, 啶啶∴げ 啶ㄠた啶班啶оぞ啶班 啶斷ぐ 啶︵啶灌ぐ啶距さ 啶掂ぞ啶侧ぞ 啶灌 啶溹ぞ啶忇啶距イ',
+      top_p: '啶熰啶� P',
+      top_pTip:
+        '啶ㄠぞ啶た啶� 啶ㄠぎ啷傕え啶距啶班ぃ 啶曕 啶ぞ啶о啶ぎ 啶膏 啶掂た啶掂た啶оい啶� 啶曕 啶ㄠた啶啶む啶班た啶� 啶曕ぐ啶むぞ 啶灌: 0.5 啶曕ぞ 啶い啶侧が 啶灌 啶曕た 啶膏き啷� 啶膏啶ぞ啶掂啶い啶�-啶ぞ啶班た啶� 啶掂た啶曕げ啷嵿お啷嬥 啶啶� 啶膏 啶嗋ぇ啷� 啶曕 啶ぞ啶ㄠぞ 啶溹ぞ啶むぞ 啶灌啷�',
+      presence_penalty: '啶夃お啶膏啶ムた啶むた 啶︵啶�',
+      presence_penaltyTip:
+        '啶ㄠ 啶熰啶曕え啷嬥 啶曕 啶︵啶∴た啶� 啶曕ぐ啶ㄠ 啶曕 啶ぞ啶む啶班ぞ 啶囙じ 啶ぐ 啶嗋ぇ啶距ぐ啶苦い 啶灌 啶曕た 啶掂 啶呧が 啶む 啶曕 啶ぞ啶� 啶啶� 啶︵た啶栢ぞ啶� 啶︵啶む 啶灌啶� 啶ぞ 啶ㄠす啷�啶傕イ\n啶す 啶啶∴げ 啶曕 啶膏啶ぞ啶掂え啶� 啶曕 啶ㄠ 啶掂た啶粪く啷嬥 啶ぐ 啶ぞ啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶あ啶监ぞ啶むぞ 啶灌啷�',
+      frequency_penalty: '啶嗋さ啷冟い啷嵿い啶� 啶︵啶�',
+      frequency_penaltyTip:
+        '啶ㄠ 啶熰啶曕え啷嬥 啶曕 啶︵啶∴た啶� 啶曕ぐ啶ㄠ 啶曕 啶ぞ啶む啶班ぞ 啶囙じ 啶ぐ 啶嗋ぇ啶距ぐ啶苦い 啶灌 啶曕た 啶掂 啶呧が 啶む 啶曕 啶ぞ啶� 啶啶� 啶曕た啶むえ啷� 啶ぞ啶� 啶︵た啶栢ぞ啶� 啶︵た啶� 啶灌啶傕イ\n啶す 啶啶∴げ 啶曕 啶膏啶ぞ啶掂え啶� 啶曕 啶忇 啶灌 啶啶曕啶むた 啶曕 啶多が啷嵿う啶多 啶︵啶灌ぐ啶距え啷� 啶曕 啶膏啶ぞ啶掂え啶� 啶曕 啶曕ぎ 啶曕ぐ啶むぞ 啶灌啷�',
+      max_tokens: '啶呧ぇ啶苦啶むぎ 啶熰啶曕え',
+      max_tokensTip:
+        '啶啶班い啶苦啷嵿ぐ啶苦く啶� 啶曕 啶呧ぇ啶苦啶むぎ 啶侧啶ぞ啶� 啶曕 啶熰啶曕え啷嬥 啶啶� 啶膏啶た啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷� \n啶ぁ啶监 啶ぞ啶ㄠ啶� 啶膏 啶啶班啶啶啶� 啶多が啷嵿う啷嬥, 啶氞啶� 啶侧啶椸啶� 啶斷ぐ 啶溹啶炧ぞ啶� 啶曕 啶侧た啶� 啶涏啶∴ぜ啷� 啶椸 啶溹啶� 啶膏啶た啶� 啶灌 啶膏啶む 啶灌啷� \n啶囙じ啷� 啶︵-啶むた啶灌ぞ啶� 啶膏 啶ㄠ啶氞 啶膏啶� 啶曕ぐ啶ㄠ 啶曕 啶膏た啶ぞ啶班た啶� 啶曕 啶溹ぞ啶む 啶灌\ngpt-4-1106-preview, gpt-4-vision-preview 啶呧ぇ啶苦啶むぎ 啶熰啶曕え (啶囙え啶啶� 128k 啶嗋啶熰お啷佮 4k)',
+      maxTokenSettingTip:
+        '啶嗋お啶曕 啶呧ぇ啶苦啶むぎ 啶熰啶曕え 啶膏啶熰た啶傕 啶夃啷嵿 啶灌, 啶溹 啶啶班啶啶啶�, 啶曕啶掂啶班 啶斷ぐ 啶∴啶熰ぞ 啶曕 啶侧た啶� 啶溹啶� 啶曕 啶膏啶た啶� 啶曕ぐ 啶膏啶む 啶灌啷� 啶囙じ啷� 2/3 啶膏 啶ㄠ啶氞 啶膏啶� 啶曕ぐ啶ㄠ 啶ぐ 啶掂た啶氞ぞ啶� 啶曕ぐ啷囙啷�',
+      setToCurrentModelMaxTokenTip:
+        '啶呧ぇ啶苦啶むぎ 啶熰啶曕え 啶曕 啶掂ぐ啷嵿い啶ぞ啶� 啶啶∴げ {{maxToken}} 啶曕 80% 啶呧ぇ啶苦啶むぎ 啶熰啶曕え 啶ぐ 啶呧お啶∴啶� 啶曕た啶ぞ 啶椸く啶� 啶灌啷�',
+      stop_sequences: '啶班啶曕え啷� 啶曕ぞ 啶呧え啷佮啷嵿ぐ啶�',
+      stop_sequencesTip:
+        '啶氞ぞ啶� 啶呧え啷佮啷嵿ぐ啶啶� 啶む 啶溹す啶距 API 啶嗋啷� 啶曕 啶熰啶曕え 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啶ㄠぞ 啶啶� 啶曕ぐ 啶︵啶椸ぞ啷� 啶侧啶熰ぞ啶� 啶椸 啶ぞ啶� 啶啶� 啶膏啶熰啶� 啶呧え啷佮啷嵿ぐ啶� 啶多ぞ啶た啶� 啶ㄠす啷�啶� 啶灌啶椸ぞ啷�',
+      stop_sequencesPlaceholder: '啶呧え啷佮啷嵿ぐ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙 啶斷ぐ 啶熰啶� 啶︵が啶距啶�',
+    },
+    tone: {
+      Creative: '啶班啶ㄠぞ啶む啶',
+      Balanced: '啶膏啶む啶侧た啶�',
+      Precise: '啶膏啷�啶�',
+      Custom: '啶曕じ啷嵿啶�',
+    },
+    addMoreModel: '啶呧ぇ啶苦 啶啶∴げ 啶溹啶∴ぜ啶ㄠ 啶曕 啶侧た啶� 啶膏啶熰た啶傕啷嵿じ 啶ぐ 啶溹ぞ啶忇',
+    capabilities: '啶げ啷嵿啷�啶啶∴げ 啶曕啶粪ぎ啶むぞ啶忇',
+    settingsLink: '啶啶∴げ 啶啶班う啶距い啶� 啶膏啶熰た啶傕啷嵿じ',
+  },
+  menus: {
+    status: '啶啶熰ぞ',
+    explore: '啶呧え啷嵿さ啷囙し啶� 啶曕ぐ啷囙',
+    apps: '啶膏啶熰啶∴た啶',
+    plugins: '啶啶侧啶囙え啷嵿じ',
+    pluginsTips:
+      '啶ムぐ啷嵿ぁ-啶ぞ啶班啶熰 啶啶侧啶囙え啷嵿じ 啶曕 啶忇啷�啶曕啶� 啶曕ぐ啷囙 啶ぞ ChatGPT-啶膏啶椸い AI-Plugins 啶え啶距啶傕イ',
+    datasets: '啶溹啶炧ぞ啶�',
+    datasetsTips:
+      '啶溹げ啷嵿う 啶� 啶班す啶� 啶灌: 啶呧お啶ㄠ 啶膏啶掂く啶� 啶曕 啶熰啶曕啶膏啶� 啶∴啶熰ぞ 啶嗋く啶距い 啶曕ぐ啷囙 啶ぞ LLM 啶膏啶︵ぐ啷嵿き 啶膏啶掂ぐ啷嵿ぇ啶� 啶曕 啶侧た啶� 啶班た啶げ-啶熰ぞ啶囙ぎ 啶啶� 啶掂啶す啷佮 啶曕 啶ぞ啶о啶ぎ 啶膏 啶∴啶熰ぞ 啶侧た啶栢啶傕イ',
+    newApp: '啶ㄠく啶� 啶愢お',
+    newDataset: '啶溹啶炧ぞ啶� 啶え啶距啶�',
+    tools: '啶夃お啶曕ぐ啶�',
+    exploreMarketplace: '啶ぞ啶班啶曕啶熰お啷嵿げ啷囙じ 啶曕ぞ 啶呧え啷嵿さ啷囙し啶� 啶曕ぐ啷囙',
+  },
+  userProfile: {
+    settings: '啶膏啶熰た啶傕啷嵿じ',
+    emailSupport: '啶膏す啶距く啶むぞ',
+    workspace: '啶掂ぐ啷嵿啶膏啶啶�',
+    createWorkspace: '啶掂ぐ啷嵿啶膏啶啶� 啶え啶距啶�',
+    helpCenter: '啶膏す啶距く啶むぞ',
+    communityFeedback: '啶啶班い啶苦啷嵿ぐ啶苦く啶�',
+    roadmap: '啶班啶∴ぎ啷堗お',
+    community: '啶膏ぎ啷佮う啶距く',
+    about: '啶曕 啶ぞ啶班 啶啶�',
+    logout: '啶侧啶� 啶嗋啶�',
+    compliance: '啶呧え啷佮お啶距げ啶�',
+    github: '啶椸た啶熰す啶�',
+    support: '啶膏ぎ啶班啶ムえ',
+  },
+  settings: {
+    accountGroup: '啶栢ぞ啶むぞ',
+    workplaceGroup: '啶曕ぞ啶班啶じ啷嵿ぅ啶�',
+    account: '啶啶班ぞ 啶栢ぞ啶むぞ',
+    members: '啶膏う啶膏啶�',
+    billing: '啶た啶侧た啶傕',
+    integrations: '啶忇啷�啶曕ぐ啶�',
+    language: '啶ぞ啶粪ぞ',
+    provider: '啶啶∴げ 啶啶班う啶距い啶�',
+    dataSource: '啶∴啶熰ぞ 啶膏啶班啶�',
+    plugin: '啶啶侧啶囙え啷嵿じ',
+    apiBasedExtension: 'API 啶掂た啶膏啶むぞ啶�',
+    generalGroup: '啶膏ぞ啶ぞ啶ㄠ啶�',
+  },
+  account: {
+    avatar: '啶呧さ啶むぞ啶�',
+    name: '啶ㄠぞ啶�',
+    email: '啶堗ぎ啷囙げ',
+    password: '啶ぞ啶膏さ啶班啶�',
+    passwordTip:
+      '啶う啶� 啶嗋お 啶呧じ啷嵿ぅ啶距く啷� 啶侧啶椸た啶� 啶曕啶� 啶曕ぞ 啶夃お啶啶� 啶ㄠす啷�啶� 啶曕ぐ啶ㄠぞ 啶氞ぞ啶灌い啷� 啶灌啶� 啶む 啶嗋お 啶忇 啶膏啶ムぞ啶 啶ぞ啶膏さ啶班啶� 啶膏啶� 啶曕ぐ 啶膏啶む 啶灌啶�',
+    setPassword: '啶ぞ啶膏さ啶班啶� 啶膏啶� 啶曕ぐ啷囙',
+    resetPassword: '啶ぞ啶膏さ啶班啶� 啶班啶膏啶� 啶曕ぐ啷囙',
+    currentPassword: '啶掂ぐ啷嵿い啶ぞ啶� 啶ぞ啶膏さ啶班啶�',
+    newPassword: '啶ㄠく啶� 啶ぞ啶膏さ啶班啶�',
+    confirmPassword: '啶ぞ啶膏さ啶班啶� 啶曕 啶啶粪啶熰た 啶曕ぐ啷囙',
+    notEqual: '啶︵ 啶ぞ啶膏さ啶班啶� 啶呧げ啶� 啶灌啶傕イ',
+    langGeniusAccount: 'Dify 啶栢ぞ啶むぞ',
+    langGeniusAccountTip: '啶嗋お啶曕ぞ Dify 啶栢ぞ啶むぞ 啶斷ぐ 啶膏啶啶оた啶� 啶夃お啶啶椸啶班啶むぞ 啶∴啶熰ぞ啷�',
+    editName: '啶ㄠぞ啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+    showAppLength: '{{length}} 啶愢お啷嵿じ 啶︵た啶栢ぞ啶忇',
+    deleteConfirmTip: '啶啶粪啶熰た 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�, 啶曕啶く啶� 啶呧お啶ㄠ 啶啶溹啶曕啶� 啶堗ぎ啷囙げ 啶膏 啶ㄠた啶啶ㄠげ啶苦啶苦い 啶啶溹啶�',
+    delete: '啶栢ぞ啶むぞ 啶灌啶距啶�',
+    deleteTip: '啶呧お啶ㄠぞ 啶栢ぞ啶むぞ 啶灌啶距え啷� 啶膏 啶嗋お啶曕ぞ 啶膏ぞ啶班ぞ 啶∴啶熰ぞ 啶膏啶ムぞ啶 啶班啶� 啶膏 啶た啶� 啶溹ぞ啶忇啶� 啶斷ぐ 啶囙じ啷� 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い 啶ㄠす啷�啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌啷�',
+    account: '啶栢ぞ啶むぞ',
+    studio: '啶∴た啶ぞ啶� 啶膏啶熰啶∴た啶',
+    myAccount: '啶啶班ぞ 啶栢ぞ啶むぞ',
+    deletePrivacyLink: '啶椸啶え啷�啶い啶� 啶ㄠ啶むた啷�',
+    deletePlaceholder: '啶曕啶く啶� 啶呧お啶ㄠぞ 啶堗ぎ啷囙げ 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    verificationLabel: '啶膏い啷嵿く啶距お啶� 啶曕啶�',
+    sendVerificationButton: '啶啶粪啶熰た 啶曕啶� 啶啶溹啶�',
+    deleteLabel: '啶啶粪啶熰た 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�, 啶曕啶く啶� 啶ㄠ啶氞 啶呧お啶ㄠぞ 啶堗ぎ啷囙げ 啶熰ぞ啶囙お 啶曕ぐ啷囙',
+    feedbackLabel: '啶灌ぎ啷囙 啶い啶距啶� 啶曕た 啶嗋お啶ㄠ 啶呧お啶ㄠぞ 啶栢ぞ啶むぞ 啶曕啶啶� 啶灌啶距く啶�?',
+    feedbackPlaceholder: '啶掂啶曕げ啷嵿お啶苦',
+    feedbackTitle: '啶啶班い啶苦お啷佮し啷嵿啶�',
+    deletePrivacyLinkTip: '啶灌ぎ 啶嗋お啶曕 啶∴啶熰ぞ 啶曕 啶曕啶膏 啶膏啶ぞ啶侧い啷� 啶灌啶�, 啶囙じ 啶ぞ啶班 啶啶� 啶呧ぇ啶苦 啶溹ぞ啶ㄠ啶距ぐ啷� 啶曕 啶侧た啶�, 啶曕啶く啶� 啶灌ぎ啶距ぐ啶� 啶∴啶熰ぞ 啶︵啶栢啶�',
+    permanentlyDeleteButton: '啶栢ぞ啶むぞ 啶膏啶ムぞ啶 啶班啶� 啶膏 啶灌啶距啶�',
+    verificationPlaceholder: '6-啶呧啶曕啶� 啶曕啶� 啶啶膏啶� 啶曕ぐ啷囙',
+    deleteSuccessTip: '啶嗋お啶曕 啶栢ぞ啶む 啶曕 啶灌啶距え啷� 啶曕ぞ 啶曕ぞ啶� 啶啶班ぞ 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶膏ぎ啶� 啶氞ぞ啶灌た啶�. 啶溹が 啶す 啶膏が 啶灌 啶溹ぞ啶忇啶� 啶む 啶灌ぎ 啶嗋お啶曕 啶堗ぎ啷囙げ 啶曕ぐ啷囙啶椸啷�',
+    workspaceIcon: '啶曕ぞ啶班啶じ啷嵿ぅ啶� 啶嗋啶曕え',
+    editWorkspaceInfo: '啶曕ぞ啶班啶啷嵿し啷囙い啷嵿ぐ 啶曕 啶溹ぞ啶ㄠ啶距ぐ啷� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+    workspaceName: '啶曕ぞ啶班啶じ啷嵿ぅ啶� 啶曕ぞ 啶ㄠぞ啶�',
+  },
+  members: {
+    team: '啶熰啶�',
+    invite: '啶溹啶∴ぜ啷囙',
+    name: '啶ㄠぞ啶�',
+    lastActive: '啶呧啶むた啶� 啶膏啷嵿ぐ啶苦く啶むぞ',
+    role: '啶啶た啶曕ぞ啶忇',
+    pending: '啶侧啶た啶�...',
+    owner: '啶ぞ啶侧た啶�',
+    admin: '啶啶班ざ啶距じ啶�',
+    adminTip: '啶愢お啷嵿じ 啶え啶� 啶膏啶む 啶灌啶� 啶斷ぐ 啶熰啶� 啶膏啶熰た啶傕啷嵿じ 啶曕ぞ 啶啶班が啶傕ぇ啶� 啶曕ぐ 啶膏啶む 啶灌啶�',
+    normal: '啶膏ぞ啶ぞ啶ㄠ啶�',
+    normalTip: '啶曕啶掂げ 啶愢お啷嵿じ 啶曕ぞ 啶夃お啶啶� 啶曕ぐ 啶膏啶む 啶灌啶�, 啶愢お啷嵿じ 啶ㄠす啷�啶� 啶え啶� 啶膏啶む',
+    builder: '啶ㄠた啶班啶ぞ啶むぞ',
+    builderTip: '啶呧お啶ㄠ 啶膏啶掂く啶� 啶曕 啶愢お啷嵿じ 啶え啶� 啶斷ぐ 啶膏啶ぞ啶︵た啶� 啶曕ぐ 啶膏啶む 啶灌啶�',
+    editor: '啶膏啶ぞ啶︵',
+    editorTip: '啶愢お啷嵿じ 啶え啶� 啶斷ぐ 啶膏啶ぞ啶︵た啶� 啶曕ぐ 啶膏啶む 啶灌啶�',
+    inviteTeamMember: '啶熰啶� 啶膏う啶膏啶� 啶溹啶∴ぜ啷囙',
+    inviteTeamMemberTip:
+      '啶掂 啶膏ぞ啶囙え 啶囙え 啶曕ぐ啶ㄠ 啶曕 啶ぞ啶� 啶膏啶о 啶嗋お啶曕 啶熰啶� 啶∴啶熰ぞ 啶む 啶す啷佮啶� 啶膏啶む 啶灌啶傕イ',
+    emailNotSetup: '啶堗ぎ啷囙げ 啶膏ぐ啷嵿さ啶� 啶膏啶� 啶ㄠす啷�啶� 啶灌, 啶囙じ啶侧た啶� 啶嗋ぎ啶傕い啷嵿ぐ啶� 啶堗ぎ啷囙げ 啶ㄠす啷�啶� 啶啶溹 啶溹ぞ 啶膏啶む啷� 啶曕啶く啶� 啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶嗋ぎ啶傕い啷嵿ぐ啶� 啶曕 啶ぞ啶� 啶溹ぞ啶班 啶曕た啶� 啶溹ぞ啶ㄠ 啶掂ぞ啶侧 啶嗋ぎ啶傕い啷嵿ぐ啶� 啶侧た啶傕 啶曕 啶ぞ啶班 啶啶� 啶膏啶氞た啶� 啶曕ぐ啷囙銆�',
+    email: '啶堗ぎ啷囙げ',
+    emailInvalid: '啶呧さ啷堗ぇ 啶堗ぎ啷囙げ 啶啶班ぞ啶班啶�',
+    emailPlaceholder: '啶曕啶く啶� 啶堗ぎ啷囙げ 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    sendInvite: '啶嗋ぎ啶傕い啷嵿ぐ啶� 啶啶溹啶�',
+    invitedAsRole: '{{role}} 啶夃お啶啶椸啶班啶むぞ 啶曕 啶班啶� 啶啶� 啶嗋ぎ啶傕い啷嵿ぐ啶苦い 啶曕た啶ぞ 啶椸く啶�',
+    invitationSent: '啶嗋ぎ啶傕い啷嵿ぐ啶� 啶啶溹ぞ 啶椸く啶�',
+    invitationSentTip:
+      '啶嗋ぎ啶傕い啷嵿ぐ啶� 啶啶溹ぞ 啶椸く啶�, 啶斷ぐ 啶掂 啶膏ぞ啶囙え 啶囙え 啶曕ぐ啶曕 啶嗋お啶曕 啶熰啶� 啶∴啶熰ぞ 啶む 啶す啷佮啶� 啶膏啶む 啶灌啶傕イ',
+    invitationLink: '啶嗋ぎ啶傕い啷嵿ぐ啶� 啶侧た啶傕',
+    failedInvitationEmails:
+      '啶ㄠ啶氞 啶︵た啶� 啶椸 啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶膏か啶侧い啶距お啷傕ぐ啷嵿さ啶� 啶嗋ぎ啶傕い啷嵿ぐ啶苦い 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶�',
+    ok: '啶犩啶� 啶灌',
+    removeFromTeam: '啶熰啶� 啶膏 啶灌啶距啶�',
+    removeFromTeamTip: '啶熰啶� 啶す啷佮啶� 啶曕 啶灌啶� 啶︵啶椸ぞ',
+    setAdmin: '啶啶班ざ啶距じ啶� 啶曕 啶班啶� 啶啶� 啶膏啶� 啶曕ぐ啷囙',
+    setMember: '啶膏ぞ啶ぞ啶ㄠ啶� 啶膏う啶膏啶� 啶曕 啶班啶� 啶啶� 啶膏啶� 啶曕ぐ啷囙',
+    setBuilder: '啶ㄠた啶班啶ぞ啶むぞ 啶曕 啶班啶� 啶啶� 啶膏啶� 啶曕ぐ啷囙',
+    setEditor: '啶膏啶ぞ啶︵ 啶曕 啶班啶� 啶啶� 啶膏啶� 啶曕ぐ啷囙',
+    disInvite: '啶嗋ぎ啶傕い啷嵿ぐ啶� 啶班う啷嵿う 啶曕ぐ啷囙',
+    deleteMember: '啶膏う啶膏啶� 啶曕 啶灌啶距啶�',
+    you: '(啶嗋お)',
+    datasetOperator: '啶溹啶炧ぞ啶� 啶掂啶さ啶膏啶ムぞ啶',
+    datasetOperatorTip: '啶曕啶掂げ 啶ㄠ啶侧啶� 啶啶� 啶啶班が啶傕ぇ啶苦い 啶曕ぐ 啶膏啶む 啶灌啶�',
+  },
+  integrations: {
+    connected: '啶曕え啷囙啷嵿啷囙ぁ',
+    google: '啶椸啶椸げ',
+    googleAccount: '啶椸啶椸げ 啶栢ぞ啶む 啶曕 啶膏ぞ啶� 啶侧啶椸た啶� 啶曕ぐ啷囙',
+    github: 'GitHub',
+    githubAccount: 'GitHub 啶栢ぞ啶む 啶曕 啶膏ぞ啶� 啶侧啶椸た啶� 啶曕ぐ啷囙',
+    connect: '啶曕え啷囙啷嵿 啶曕ぐ啷囙',
+  },
+  language: {
+    displayLanguage: '啶啶班う啶班啶多え 啶ぞ啶粪ぞ',
+    timezone: '啶膏ぎ啶� 啶曕啶粪啶む啶�',
+  },
+  provider: {
+    apiKey: '啶忇お啷�啶嗋 啶曕啶傕啷�',
+    enterYourKey: '啶呧お啶ㄠ 啶忇お啷�啶嗋 啶曕啶傕啷� 啶す啶距 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    invalidKey: '啶呧ぎ啶距え啷嵿く OpenAI 啶忇お啷�啶嗋 啶曕啶傕啷�',
+    validatedError: '啶膏い啷嵿く啶距お啶� 啶掂た啶げ: ',
+    validating: '啶曕啶傕啷� 啶曕ぞ 啶膏い啷嵿く啶距お啶� 啶灌 啶班す啶� 啶灌...',
+    saveFailed: '啶忇お啷�啶嗋 啶曕啶傕啷� 啶膏す啷囙啶ㄠぞ 啶掂た啶げ 啶班す啶�',
+    apiKeyExceedBill: '啶囙じ 啶忇お啷�啶嗋 啶曕啶傕啷� 啶啶� 啶曕啶� 啶曕啶熰ぞ 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶灌, 啶曕啶く啶� 啶あ啶监啶�',
+    addKey: '啶曕啶傕啷� 啶溹啶∴ぜ啷囙',
+    comingSoon: '啶溹げ啷嵿う 啶� 啶班す啶� 啶灌',
+    editKey: '啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+    invalidApiKey: '啶呧ぎ啶距え啷嵿く 啶忇お啷�啶嗋 啶曕啶傕啷�',
+    azure: {
+      apiBase: '啶忇お啷�啶嗋 啶嗋ぇ啶距ぐ',
+      apiBasePlaceholder: '啶嗋お啶曕 Azure OpenAI 啶忇啶∴お啷夃啶傕 啶曕ぞ 啶忇お啷�啶嗋 啶嗋ぇ啶距ぐ URL啷�',
+      apiKey: '啶忇お啷�啶嗋 啶曕啶傕啷�',
+      apiKeyPlaceholder: '啶呧お啶ㄠ 啶忇お啷�啶嗋 啶曕啶傕啷� 啶す啶距 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+      helpTip: 'Azure OpenAI 啶膏啶掂ぞ 啶曕 啶ぞ啶班 啶啶� 啶溹ぞ啶ㄠ啶�',
+    },
+    openaiHosted: {
+      openaiHosted: '啶灌啶膏啶熰啶� OpenAI',
+      onTrial: '啶ぐ啷�啶曕啶粪ぃ 啶ぐ',
+      exhausted: '啶曕啶熰ぞ 啶膏ぎ啶距お啷嵿い',
+      desc: 'Dify 啶︵啶掂ぞ啶班ぞ 啶啶班う啶距え 啶曕 啶椸 OpenAI 啶灌啶膏啶熰た啶傕 啶膏啶掂ぞ 啶嗋お啶曕 GPT-3.5 啶溹啶膏 啶啶∴げ 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶ㄠ 啶曕 啶呧え啷佮ぎ啶むた 啶︵啶む 啶灌啷� 啶嗋お啶曕 啶ぐ啷�啶曕啶粪ぃ 啶曕啶熰ぞ 啶曕 啶膏ぎ啶距お啷嵿い 啶灌啶ㄠ 啶膏 啶す啶侧, 啶嗋お啶曕 啶呧え啷嵿く 啶啶∴げ 啶啶班う啶距い啶距啶� 啶曕 啶膏啶� 啶曕ぐ啶ㄠ 啶曕 啶嗋さ啶多啶啶むぞ 啶灌啷�',
+      callTimes: '啶曕啶� 啶ぞ啶�',
+      usedUp: '啶ぐ啷�啶曕啶粪ぃ 啶曕啶熰ぞ 啶膏ぎ啶距お啷嵿い 啶灌 啶椸く啶距イ 啶呧お啶ㄠぞ 啶啶∴げ 啶啶班う啶距い啶� 啶溹啶∴ぜ啷囙啷�',
+      useYourModel: '啶掂ぐ啷嵿い啶ぞ啶� 啶啶� 啶呧お啶ㄠぞ 啶啶∴げ 啶啶班う啶距い啶� 啶夃お啶啶� 啶曕ぐ 啶班す啷� 啶灌啶傕イ',
+      close: '啶啶� 啶曕ぐ啷囙',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: '啶ぐ啷�啶曕啶粪ぃ 啶ぐ',
+      exhausted: '啶曕啶熰ぞ 啶膏ぎ啶距お啷嵿い',
+      desc: '啶多啷嵿い啶苦ざ啶距げ啷� 啶啶∴げ, 啶溹 啶ぐ啶苦し啷嵿啷冟い 啶膏啶掂ぞ啶� 啶斷ぐ 啶班啶ㄠぞ啶む啶 啶膏ぞ啶啷嵿ぐ啷� 啶ㄠた啶班啶ぞ啶� 啶膏 啶侧啶曕ぐ 啶掂た啶膏啶む啶� 啶ㄠた啶班啶︵啶� 啶む 啶曕 啶掂た啶膏啶む啶� 啶多啶班啶` 啶曕 啶曕ぞ啶班啶啶� 啶啶� 啶夃い啷嵿啷冟し啷嵿 啶灌啷�',
+      callTimes: '啶曕啶� 啶ぞ啶�',
+      usedUp: '啶ぐ啷�啶曕啶粪ぃ 啶曕啶熰ぞ 啶膏ぎ啶距お啷嵿い 啶灌 啶椸く啶距イ 啶呧お啶ㄠぞ 啶啶∴げ 啶啶班う啶距い啶� 啶溹啶∴ぜ啷囙啷�',
+      useYourModel: '啶掂ぐ啷嵿い啶ぞ啶� 啶啶� 啶呧お啶ㄠぞ 啶啶∴げ 啶啶班う啶距い啶� 啶夃お啶啶� 啶曕ぐ 啶班す啷� 啶灌啶傕イ',
+      close: '啶啶� 啶曕ぐ啷囙',
+      trialQuotaTip: '啶嗋お啶曕ぞ 啶忇啶ム啶班啶た啶� 啶ぐ啷�啶曕啶粪ぃ 啶曕啶熰ぞ 2025/03/11 啶曕 啶膏ぎ啶距お啷嵿い 啶灌 啶溹ぞ啶忇啶� 啶斷ぐ 啶夃じ啶曕 啶ぞ啶� 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶班す啷囙啶距イ 啶曕啶く啶� 啶囙じ啶曕ぞ 啶膏ぎ啶� 啶ぐ 啶夃お啶啶� 啶曕ぐ啷囙啷�',
+    },
+    anthropic: {
+      using: '啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶曕啶粪ぎ啶むぞ 啶曕ぞ 啶夃お啶啶� 啶曕ぐ 啶班す啶� 啶灌',
+      enableTip:
+        'Anthropic 啶啶∴げ 啶曕 啶膏啷嵿し啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�, 啶嗋お啶曕 啶す啶侧 OpenAI 啶ぞ Azure OpenAI 啶膏啶掂ぞ 啶膏 啶溹啶∴ぜ啶ㄠ 啶曕 啶嗋さ啶多啶啶むぞ 啶灌啷�',
+      notEnabled: '啶膏啷嵿し啶� 啶ㄠす啷�啶�',
+      keyFrom: 'Anthropic 啶膏 啶呧お啶ㄠ 啶忇お啷�啶嗋 啶曕啶傕啷� 啶啶班ぞ啶啶� 啶曕ぐ啷囙',
+    },
+    encrypted: {
+      front: '啶嗋お啶曕 啶忇お啷�啶嗋 啶曕啶傕啷� 啶曕 啶忇え啷嵿啷嵿ぐ啶苦お啷嵿 啶曕た啶ぞ 啶溹ぞ啶忇啶� 啶斷ぐ 啶膏啶椸啶班す啷�啶� 啶曕た啶ぞ 啶溹ぞ啶忇啶�',
+      back: ' 啶む啶ㄠ啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕啷�',
+    },
+  },
+  modelProvider: {
+    notConfigured:
+      '啶膏た啶膏啶熰ぎ 啶啶∴げ 啶曕 啶呧き啷� 啶啶班 啶むぐ啶� 啶膏 啶曕啶ㄠ啶ぜ啶苦啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶� 啶灌, 啶斷ぐ 啶曕啶� 啶曕ぞ啶班啶� 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶灌 啶膏啶む 啶灌啶傕イ',
+    systemModelSettings: '啶膏た啶膏啶熰ぎ 啶啶∴げ 啶膏啶熰た啶傕啷嵿じ',
+    systemModelSettingsLink: '啶膏た啶膏啶熰ぎ 啶啶∴げ 啶膏啶� 啶曕ぐ啶ㄠぞ 啶曕啶啶� 啶嗋さ啶多啶 啶灌?',
+    selectModel: '啶呧お啶ㄠ 啶啶∴げ 啶曕ぞ 啶氞く啶� 啶曕ぐ啷囙',
+    setupModelFirst: '啶曕啶く啶� 啶す啶侧 啶呧お啶ㄠぞ 啶啶∴げ 啶膏啶� 啶曕ぐ啷囙',
+    systemReasoningModel: {
+      key: '啶膏た啶膏啶熰ぎ 啶むぐ啷嵿 啶啶∴げ',
+      tip: '啶愢お啷嵿げ啶苦啷囙ざ啶� 啶え啶距え啷� 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶� 啶溹ぞ啶ㄠ 啶掂ぞ啶侧 啶∴た啶ぜ啷夃げ啷嵿 啶呧え啷佮ぎ啶距え 啶啶∴げ 啶曕 啶膏啶� 啶曕ぐ啷囙, 啶膏ぞ啶� 啶灌 啶膏啶掂ぞ啶� 啶ㄠぞ啶� 啶啶⑧ぜ啷� 啶斷ぐ 啶呧啶侧 啶啶班ざ啷嵿え 啶膏啶澿ぞ啶� 啶溹啶膏 啶膏啶掂た啶оぞ啶忇 啶 啶∴た啶ぜ啷夃げ啷嵿 啶呧え啷佮ぎ啶距え 啶啶∴げ 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙啶椸啷�',
+    },
+    embeddingModel: {
+      key: '啶忇啶啶∴た啶傕 啶啶∴げ',
+      tip: '啶溹啶炧ぞ啶� 啶曕 啶︵じ啷嵿い啶距さ啷囙啶� 啶忇啶啶∴た啶傕 啶啶班啶膏啶膏た啶傕 啶曕 啶侧た啶� 啶∴た啶ぜ啷夃げ啷嵿 啶啶∴げ 啶膏啶� 啶曕ぐ啷囙, 啶溹啶炧ぞ啶� 啶曕 啶啶ㄠ 啶啶班ぞ啶啶むた 啶斷ぐ 啶嗋く啶距い 啶︵啶ㄠ啶� 啶曕 啶侧た啶� 啶囙じ 啶忇啶啶∴た啶傕 啶啶∴げ 啶曕ぞ 啶夃お啶啶� 啶掂啶曕啶熰ぐ啶距啶溹啶多え 啶啶班啶膏啶膏た啶傕 啶曕 啶侧た啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷� 啶膏啶掂た啶� 啶曕ぐ啶ㄠ 啶膏 啶嗋く啶距い啶苦い 啶溹啶炧ぞ啶� 啶斷ぐ 啶啶班ざ啷嵿え 啶曕 啶啶� 啶掂啶曕啶熰ぐ 啶嗋く啶距ぎ 啶呧じ啶傕啶� 啶灌 啶溹ぞ啶忇啶�, 啶溹た啶膏じ啷� 啶啶ㄠ 啶啶班ぞ啶啶むた 啶掂た啶げ 啶灌 啶溹ぞ啶忇啷�啷� 啶啶ㄠ 啶啶班ぞ啶啶むた 啶掂た啶げ啶むぞ 啶膏 啶啶ㄠ 啶曕 啶侧た啶�, 啶曕啶く啶� 啶囙じ 啶啶∴げ 啶曕 啶え啶ぞ啶ㄠ 啶⑧啶� 啶膏 啶膏啶掂た啶� 啶� 啶曕ぐ啷囙啷�',
+      required: '啶忇啶啶∴た啶傕 啶啶∴げ 啶嗋さ啶多啶 啶灌',
+    },
+    speechToTextModel: {
+      key: '啶ぞ啶粪ぃ-啶膏-啶ぞ啶� 啶啶∴げ',
+      tip: '啶膏啶掂ぞ啶� 啶啶� 啶ぞ啶粪ぃ-啶膏-啶ぞ啶� 啶囙え啶啶� 啶曕 啶侧た啶� 啶∴た啶ぜ啷夃げ啷嵿 啶啶∴げ 啶膏啶� 啶曕ぐ啷囙啷�',
+    },
+    ttsModel: {
+      key: '啶ぞ啶�-啶膏-啶ぞ啶粪ぃ 啶啶∴げ',
+      tip: '啶膏啶掂ぞ啶� 啶啶� 啶ぞ啶�-啶膏-啶ぞ啶粪ぃ 啶囙え啶啶� 啶曕 啶侧た啶� 啶∴た啶ぜ啷夃げ啷嵿 啶啶∴げ 啶膏啶� 啶曕ぐ啷囙啷�',
+    },
+    rerankModel: {
+      key: '啶班啶班啶傕 啶啶∴げ',
+      tip: '啶班啶班啶傕 啶啶∴げ 啶夃お啶啶椸啶班啶むぞ 啶啶班ざ啷嵿え 啶曕 啶膏ぞ啶� 啶膏ぞ啶傕さ啶苦ぇ啶苦 啶啶� 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶夃ぎ啷嵿ぎ啷�啶︵さ啶距ぐ 啶︵じ啷嵿い啶距さ啷囙啶� 啶膏啶氞 啶曕 啶啶ㄠ 啶曕啶班ぎ啶苦い 啶曕ぐ啷囙啶�, 啶膏ぞ啶傕さ啶苦ぇ啶苦 啶班啶傕啶苦啶� 啶曕 啶ぐ啶苦ぃ啶距ぎ啷嬥 啶啶� 啶膏啶оぞ啶� 啶曕ぐ啷囙啶距イ',
+    },
+    apiKey: 'API-KEY',
+    quota: '啶曕啶熰ぞ',
+    searchModel: '啶栢啶� 啶啶∴げ',
+    noModelFound: '{{model}} 啶曕 啶侧た啶� 啶曕啶� 啶啶∴げ 啶ㄠす啷�啶� 啶た啶侧ぞ',
+    models: '啶啶∴げ啷嵿じ',
+    showMoreModelProvider: '啶呧ぇ啶苦 啶啶∴げ 啶啶班う啶距い啶� 啶︵た啶栢ぞ啶忇',
+    selector: {
+      tip: '啶囙じ 啶啶∴げ 啶曕 啶灌啶� 啶︵た啶ぞ 啶椸く啶� 啶灌啷� 啶曕啶く啶� 啶忇 啶啶∴げ 啶溹啶∴ぜ啷囙 啶ぞ 啶曕た啶膏 啶呧え啷嵿く 啶啶∴げ 啶曕ぞ 啶氞く啶� 啶曕ぐ啷囙啷�',
+      emptyTip: '啶曕啶� 啶夃お啶侧が啷嵿ぇ 啶啶∴げ 啶ㄠす啷�啶�',
+      emptySetting: '啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕啶く啶� 啶膏啶熰た啶傕啷嵿じ 啶ぐ 啶溹ぞ啶忇',
+      rerankTip: '啶曕啶く啶� 啶班啶班啶傕 啶啶∴げ 啶膏啶� 啶曕ぐ啷囙',
+    },
+    card: {
+      quota: '啶曕啶熰ぞ',
+      onTrial: '啶ぐ啷�啶曕啶粪ぃ 啶ぐ',
+      paid: '啶啶椸い啶距え 啶曕た啶ぞ 啶灌啶�',
+      quotaExhausted: '啶曕啶熰ぞ 啶膏ぎ啶距お啷嵿い',
+      callTimes: '啶曕啶� 啶膏ぎ啶�',
+      tokens: '啶熰啶曕え',
+      buyQuota: '啶曕啶熰ぞ 啶栢ぐ啷�啶︵啶�',
+      priorityUse: '啶啶班ぞ啶ムぎ啶苦啶むぞ 啶夃お啶啶�',
+      removeKey: 'API 啶曕啶傕啷� 啶ㄠた啶曕ぞ啶侧啶�',
+      tip: '啶啶椸い啶距え 啶曕た啶� 啶椸 啶曕啶熰ぞ 啶曕 啶啶班ぞ啶ムぎ啶苦啶むぞ 啶︵ 啶溹ぞ啶忇啷�啷� 啶啶椸い啶距え 啶曕た啶� 啶椸 啶曕啶熰ぞ 啶曕 啶膏ぎ啶距お啷嵿い 啶灌啶ㄠ 啶曕 啶ぞ啶� 啶ぐ啷�啶曕啶粪ぃ 啶曕啶熰ぞ 啶曕ぞ 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶忇啶距イ',
+    },
+    item: {
+      deleteDesc:
+        '{{modelName}} 啶曕 啶膏た啶膏啶熰ぎ 啶むぐ啷嵿 啶啶∴げ 啶曕 啶班啶� 啶啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ 啶班す啶� 啶灌啷� 啶灌啶距え啷� 啶曕 啶ぞ啶� 啶曕啶� 啶曕ぞ啶班啶� 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶灌啶傕啷囙イ 啶曕啶く啶� 啶啶粪啶熰た 啶曕ぐ啷囙啷�',
+      freeQuota: '啶啶啶� 啶曕啶熰ぞ',
+    },
+    addApiKey: '啶呧お啶ㄠ API 啶曕啶傕啷� 啶溹啶∴ぜ啷囙',
+    invalidApiKey: '啶呧さ啷堗ぇ API 啶曕啶傕啷�',
+    encrypted: {
+      front: '啶嗋お啶曕 API KEY 啶曕 啶忇え啷嵿啷嵿ぐ啶苦お啷嵿 啶斷ぐ 啶膏啶椸啶班す啷�啶� 啶曕た啶ぞ 啶溹ぞ啶忇啶�',
+      back: ' 啶む啶ㄠ啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕啷�',
+    },
+    freeQuota: {
+      howToEarn: '啶曕啶膏 啶曕ぎ啶距啶�',
+    },
+    addMoreModelProvider: '啶呧ぇ啶苦 啶啶∴げ 啶啶班う啶距い啶� 啶溹啶∴ぜ啷囙',
+    addModel: '啶啶∴げ 啶溹啶∴ぜ啷囙',
+    modelsNum: '{{num}} 啶啶∴げ啷嵿じ',
+    showModels: '啶啶∴げ啷嵿じ 啶︵た啶栢ぞ啶忇',
+    showModelsNum: '{{num}} 啶啶∴げ啷嵿じ 啶︵た啶栢ぞ啶忇',
+    collapse: '啶膏啶曕啶粪た啶啶� 啶曕ぐ啷囙',
+    config: '啶曕啶ㄠ啶ぜ啶苦',
+    modelAndParameters: '啶啶∴げ 啶斷ぐ 啶啶班ぞ啶啶熰ぐ',
+    model: '啶啶∴げ',
+    featureSupported: '{{feature}} 啶膏ぎ啶班啶ムた啶�',
+    callTimes: '啶曕啶� 啶膏ぎ啶�',
+    credits: '啶膏啶︵啶� 啶曕啶班啶∴た啶熰啶�',
+    buyQuota: '啶曕啶熰ぞ 啶栢ぐ啷�啶︵啶�',
+    getFreeTokens: '啶啶啶� 啶熰啶曕え 啶啶班ぞ啶啶� 啶曕ぐ啷囙',
+    priorityUsing: '啶啶班ぞ啶ムぎ啶苦啶むぞ 啶曕ぞ 啶夃お啶啶�',
+    deprecated: '啶呧お啷嵿ぐ啶氞げ啶苦い',
+    confirmDelete: '啶灌啶距え啷� 啶曕 啶啶粪啶熰た 啶曕ぐ啷囙?',
+    quotaTip: '啶啷� 啶灌啶� 啶夃お啶侧が啷嵿ぇ 啶啶啶� 啶熰啶曕え',
+    loadPresets: '啶啶班じ啷嵿い啶距さ 啶啶班じ啷嵿い啷佮い 啶曕ぐ啷囙',
+    parameters: '啶啶班ぞ啶啶熰ぐ',
+    loadBalancing: '啶侧啶� 啶啶侧啶傕じ啶苦啶�',
+    loadBalancingDescription: '啶曕 啶膏啶熰啶� 啶曕 啶膏ぞ啶� 啶曕 啶膏ぞ啶� 啶︵が啶距さ 啶曕ぎ 啶曕ぐ啷囙啷�',
+    loadBalancingHeadline: '啶侧啶� 啶啶侧啶傕じ啶苦啶�',
+    configLoadBalancing: '啶侧啶� 啶啶侧啶傕じ啶苦啶� 啶曕啶ㄠ啶ぜ啶苦 啶曕ぐ啷囙',
+    modelHasBeenDeprecated: '啶す 啶啶∴げ 啶呧お啷嵿ぐ啶氞げ啶苦い 啶灌 啶椸く啶� 啶灌',
+    providerManaged: '啶啶班う啶距い啶� 啶啶班が啶傕ぇ啶苦い',
+    providerManagedDescription:
+      '啶啶∴げ 啶啶班う啶距い啶� 啶︵啶掂ぞ啶班ぞ 啶啶班う啶距え 啶曕 啶椸 啶忇啶� 啶膏啶� 啶曕 啶膏ぞ啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙啷�',
+    defaultConfig: '啶∴た啶ぜ啷夃げ啷嵿 啶曕啶ㄠ啶ぜ啶苦',
+    apiKeyStatusNormal: 'APIKey 啶曕 啶膏啶ムた啶むた 啶膏ぞ啶ぞ啶ㄠ啶� 啶灌',
+    apiKeyRateLimit: '啶班啶� 啶膏啶ぞ 啶す啷佮啶� 啶椸, {{seconds}}s 啶曕 啶ぞ啶� 啶夃お啶侧が啷嵿ぇ',
+    addConfig: '啶曕啶ㄠ啶ぜ啶苦 啶溹啶∴ぜ啷囙',
+    editConfig: '啶曕啶ㄠ啶ぜ啶苦 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+    loadBalancingLeastKeyWarning:
+      '啶侧啶� 啶啶侧啶傕じ啶苦啶� 啶膏啷嵿し啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕ぎ 啶膏 啶曕ぎ 2 啶曕啶傕啶苦く啷嬥 啶曕 啶膏啷嵿し啶� 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶忇イ',
+    loadBalancingInfo:
+      '啶∴た啶ぜ啷夃げ啷嵿 啶班啶� 啶膏, 啶侧啶� 啶啶侧啶傕じ啶苦啶� 啶班ぞ啶夃啶�-啶班啶た啶� 啶班ぃ啶ㄠ啶むた 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶むぞ 啶灌啷� 啶う啶� 啶班啶� 啶侧た啶た啶熰た啶傕 啶熰啶班た啶椸ぐ 啶灌 啶溹ぞ啶む 啶灌, 啶む 1 啶た啶ㄠ 啶曕ぞ 啶曕啶侧ぁ啶距啶� 啶啶班た啶ぁ 啶侧ぞ啶椸 啶灌啶椸ぞ啷�',
+    upgradeForLoadBalancing:
+      '啶侧啶� 啶啶侧啶傕じ啶苦啶� 啶膏啷嵿し啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶呧お啶ㄠ 啶啶溹え啶� 啶呧お啶椸啶班啶� 啶曕ぐ啷囙啷�',
+    discoverMore: '啶斷ぐ 啶呧ぇ啶苦 啶栢啶溹啶�',
+    installProvider: '啶啶∴げ 啶啶班う啶距い啶距啶� 啶曕 啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙',
+    configureTip: '啶忇お啷�啶嗋-啶曕啶傕啷� 啶膏啶� 啶曕ぐ啷囙 啶ぞ 啶夃お啶啶� 啶曕 啶侧た啶� 啶啶∴げ 啶溹啶∴ぜ啷囙',
+    toBeConfigured: '啶曕啶ㄠ啶ぜ啶苦啶� 啶曕た啶ぞ 啶溹ぞ啶ㄠぞ 啶灌',
+    emptyProviderTitle: '啶啶∴げ 啶啶班う啶距い啶� 啶膏啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶�',
+    emptyProviderTip: '啶曕啶く啶� 啶す啶侧 啶忇 啶啶∴げ 啶啶班う啶距い啶� 啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙啷�',
+  },
+  dataSource: {
+    add: '啶∴啶熰ぞ 啶膏啶班啶� 啶溹啶∴ぜ啷囙',
+    connect: '啶曕え啷囙啷嵿 啶曕ぐ啷囙',
+    configure: '啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+    notion: {
+      title: 'Notion',
+      description: '啶溹啶炧ぞ啶� 啶曕 啶侧た啶� 啶∴啶熰ぞ 啶膏啶班啶� 啶曕 啶班啶� 啶啶� Notion 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶ㄠぞ啷�',
+      connectedWorkspace: '啶曕え啷囙啷嵿啷囙ぁ 啶曕ぞ啶班啶じ啷嵿ぅ啶距え',
+      addWorkspace: '啶曕ぞ啶班啶じ啷嵿ぅ啶距え 啶溹啶∴ぜ啷囙',
+      connected: '啶曕え啷囙啷嵿啷囙ぁ',
+      disconnected: '啶∴た啶膏啶曕え啷囙啷嵿啷囙ぁ',
+      changeAuthorizedPages: '啶呧ぇ啶苦啷冟い 啶啶粪啶� 啶う啶侧啶�',
+      pagesAuthorized: '啶呧ぇ啶苦啷冟い 啶啶粪啶�',
+      sync: '啶膏た啶傕 啶曕ぐ啷囙',
+      remove: '啶灌啶距啶�',
+      selector: {
+        pageSelected: '啶氞く啶ㄠた啶� 啶啶粪啶�',
+        searchPages: '啶啶粪啶� 啶栢啶溹啶�...',
+        noSearchResult: '啶曕啶� 啶栢啶� 啶ぐ啶苦ぃ啶距ぎ 啶ㄠす啷�啶�',
+        addPages: '啶啶粪啶� 啶溹啶∴ぜ啷囙',
+        preview: '啶啶班啶掂ぞ啶掂げ啷嬥啶�',
+      },
+    },
+    website: {
+      title: '啶掂啶じ啶距啶�',
+      description: '啶掂啶� 啶曕啶班啶侧ぐ 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕 啶掂啶じ啶距啶熰啶� 啶膏 啶膏ぞ啶啷嵿ぐ啷� 啶嗋く啶距い 啶曕ぐ啷囙啷�',
+      with: '啶曕 啶膏ぞ啶�',
+      configuredCrawlers: '啶曕啶ㄠ啶ぜ啶苦啶� 啶曕た啶� 啶椸 啶曕啶班啶侧ぐ',
+      active: '啶膏啷嵿ぐ啶苦く',
+      inactive: '啶ㄠた啶粪啶曕啶班た啶�',
+    },
+  },
+  plugin: {
+    serpapi: {
+      apiKey: '啶忇お啷�啶嗋 啶曕啶傕啷�',
+      apiKeyPlaceholder: '啶呧お啶ㄠ 啶忇お啷�啶嗋 啶曕啶傕啷� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+      keyFrom: 'SerpAPI 啶栢ぞ啶むぞ 啶啶粪啶� 啶膏 啶呧お啶ㄠ SerpAPI 啶曕啶傕啷� 啶啶班ぞ啶啶� 啶曕ぐ啷囙',
+    },
+  },
+  apiBasedExtension: {
+    title:
+      '啶忇お啷�啶嗋 啶忇啷嵿じ啶熰啶傕ざ啶� 啶曕啶傕う啷嵿ぐ啷�啶曕啶� 啶忇お啷�啶嗋 啶啶班が啶傕ぇ啶� 啶啶班う啶距え 啶曕ぐ啶む 啶灌啶�, 啶溹 Dify 啶曕 啶呧え啷佮お啷嵿ぐ啶啶椸啶� 啶啶� 啶嗋じ啶距え 啶夃お啶啶� 啶曕 啶侧た啶� 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶曕 啶膏ぐ啶� 啶え啶距い啷� 啶灌啶傕イ',
+    link: '啶呧お啶ㄠぞ 啶栢啶� 啶曕ぞ 啶忇お啷�啶嗋 啶忇啷嵿じ啶熰啶傕ざ啶� 啶曕啶膏 啶掂た啶曕じ啶苦い 啶曕ぐ啷囙, 啶す 啶溹ぞ啶ㄠ啶傕イ',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: '啶忇お啷�啶嗋 啶忇啷嵿じ啶熰啶傕ざ啶� 啶溹啶∴ぜ啷囙',
+    selector: {
+      title: '啶忇お啷�啶嗋 啶忇啷嵿じ啶熰啶傕ざ啶�',
+      placeholder: '啶曕啶く啶� 啶忇お啷�啶嗋 啶忇啷嵿じ啶熰啶傕ざ啶� 啶氞啶ㄠ啶�',
+      manage: '啶忇お啷�啶嗋 啶忇啷嵿じ啶熰啶傕ざ啶� 啶啶班が啶傕ぇ啶苦い 啶曕ぐ啷囙',
+    },
+    modal: {
+      title: '啶忇お啷�啶嗋 啶忇啷嵿じ啶熰啶傕ざ啶� 啶溹啶∴ぜ啷囙',
+      editTitle: '啶忇お啷�啶嗋 啶忇啷嵿じ啶熰啶傕ざ啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+      name: {
+        title: '啶ㄠぞ啶�',
+        placeholder: '啶曕啶く啶� 啶ㄠぞ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+      },
+      apiEndpoint: {
+        title: '啶忇お啷�啶嗋 啶忇啶∴お啷夃啶傕',
+        placeholder: '啶曕啶く啶� 啶忇お啷�啶嗋 啶忇啶∴お啷夃啶傕 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+      },
+      apiKey: {
+        title: '啶忇お啷�啶嗋-啶曕啶傕啷�',
+        placeholder: '啶曕啶く啶� 啶忇お啷�啶嗋-啶曕啶傕啷� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+        lengthError: '啶忇お啷�啶嗋-啶曕啶傕啷� 啶曕 啶侧啶ぞ啶� 5 啶呧啷嵿し啶班啶� 啶膏 啶曕ぎ 啶ㄠす啷�啶� 啶灌 啶膏啶む',
+      },
+    },
+    type: '啶啶班啶距ぐ',
+  },
+  about: {
+    changeLog: '啶ぐ啶苦さ啶班啶むえ 啶侧啶�',
+    updateNow: '啶呧き啷� 啶呧お啶∴啶� 啶曕ぐ啷囙',
+    nowAvailable: 'Dify {{version}} 啶呧が 啶夃お啶侧が啷嵿ぇ 啶灌啷�',
+    latestAvailable: 'Dify {{version}} 啶ㄠさ啷�啶ㄠい啶� 啶夃お啶侧が啷嵿ぇ 啶膏啶膏啶曕ぐ啶� 啶灌啷�',
+  },
+  appMenus: {
+    overview: '啶ㄠた啶椸ぐ啶距え啷�',
+    promptEng: '啶膏ぎ啶ㄠ啶掂く 啶曕ぐ啷囙',
+    apiAccess: 'API 啶忇啷嵿じ啷囙じ',
+    logAndAnn: '啶侧啶椸啶� 啶斷ぐ 啶樴啶粪ぃ啶距啶�',
+    logs: '啶侧啶椸啶�',
+  },
+  environment: {
+    testing: '啶ぐ啷�啶曕啶粪ぃ',
+    development: '啶掂た啶曕ぞ啶�',
+  },
+  appModes: {
+    completionApp: '啶ぞ啶� 啶溹え啶班啶熰ぐ',
+    chatApp: '啶氞啶� 啶愢お',
+  },
+  datasetMenus: {
+    documents: '啶︵じ啷嵿い啶距さ啷囙啶�',
+    hitTesting: '啶啶ㄠ 啶啶班ぞ啶啶むた 啶ぐ啷�啶曕啶粪ぃ',
+    settings: '啶膏啶熰た啶傕啷嵿じ',
+    emptyTip:
+      '啶溹啶炧ぞ啶� 啶曕 啶膏啶う啷嵿ぇ 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶� 啶灌, 啶曕啶く啶� 啶膏啶う啷嵿ぇ啶むぞ 啶啶班 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶ぞ 啶啶侧-啶囙え 啶ぐ 啶溹ぞ啶忇啷�',
+    viewDoc: '啶︵じ啷嵿い啶距さ啷囙啶� 啶︵啶栢啶�',
+    relatedApp: '啶膏啶啶оた啶� 啶愢お啷嵿じ',
+    noRelatedApp: '啶曕啶� 啶侧た啶傕 啶ㄠす啷�啶� 啶曕た啶� 啶椸 啶愢お啷嵿じ',
+  },
+  voiceInput: {
+    speaking: '啶呧が 啶啶侧啶�...',
+    converting: '啶ぞ啶� 啶啶� 啶ぐ啶苦さ啶班啶むた啶� 啶灌 啶班す啶� 啶灌...',
+    notAllow: '啶ぞ啶囙啷嵿ぐ啷嬥か啷嬥え 啶呧ぇ啶苦啷冟い 啶ㄠす啷�啶� 啶灌',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: '啶膏啶掂ぞ啶� 啶曕ぞ 啶ㄠぞ啶� 啶う啶侧啶�',
+    conversationName: '啶膏啶掂ぞ啶� 啶曕ぞ 啶ㄠぞ啶�',
+    conversationNamePlaceholder: '啶曕啶く啶� 啶膏啶掂ぞ啶� 啶曕ぞ 啶ㄠぞ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    conversationNameCanNotEmpty: '啶膏啶掂ぞ啶� 啶曕ぞ 啶ㄠぞ啶� 啶嗋さ啶多啶 啶灌',
+    citation: {
+      title: '啶夃う啷嵿ぇ啶班ぃ',
+      linkToDataset: '啶溹啶炧ぞ啶� 啶膏 啶侧た啶傕 啶曕ぐ啷囙',
+      characters: '啶掂ぐ啷嵿ぃ:',
+      hitCount: '啶啶ㄠ 啶啶班ぞ啶啶むた 啶椸た啶ㄠい啷�:',
+      vectorHash: '啶掂啶曕啶熰ぐ 啶灌啶�:',
+      hitScore: '啶啶ㄠ 啶啶班ぞ啶啶むた 啶膏啶曕啶�:',
+    },
+    inputPlaceholder: '啶啶� 啶膏 啶ぞ啶� 啶曕ぐ啷囙',
+    thought: '啶掂た啶氞ぞ啶�',
+    thinking: '啶膏啶氞い啷� 啶灌啶�...',
+    resend: '啶た啶� 啶膏 啶啶溹啶�',
+  },
+  promptEditor: {
+    placeholder:
+      '啶呧お啶ㄠぞ 啶啶班啶啶啶� 啶多が啷嵿う 啶す啶距 啶侧た啶栢啶�, 啶掂啶班た啶忇が啶� 啶∴ぞ啶侧え啷� 啶曕 啶侧た啶� \'{\' 啶︵ぐ啷嵿 啶曕ぐ啷囙, 啶啶班啶啶啶� 啶膏ぞ啶啷嵿ぐ啷� 啶啶侧啶� 啶∴ぞ啶侧え啷� 啶曕 啶侧た啶� \'/\' 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    context: {
+      item: {
+        title: '啶膏啶︵ぐ啷嵿き',
+        desc: '啶膏啶︵ぐ啷嵿き 啶熰啶啶げ啷囙 啶∴ぞ啶侧啶�',
+      },
+      modal: {
+        title: '啶膏啶︵ぐ啷嵿き 啶啶� {{num}} 啶溹啶炧ぞ啶�',
+        add: '啶膏啶︵ぐ啷嵿き 啶溹啶∴ぜ啷囙',
+        footer:
+          '啶嗋お 啶ㄠ啶氞 啶︵た啶� 啶椸 啶膏啶︵ぐ啷嵿き 啶呧え啷佮き啶距 啶啶� 啶膏啶︵ぐ啷嵿き啷嬥 啶曕ぞ 啶啶班が啶傕ぇ啶� 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+      },
+    },
+    history: {
+      item: {
+        title: '啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶囙い啶苦す啶距じ',
+        desc: '啶愢い啶苦す啶距じ啶苦 啶膏啶︵啶� 啶熰啶啶げ啷囙 啶∴ぞ啶侧啶�',
+      },
+      modal: {
+        title: '啶夃う啶距す啶班ぃ',
+        user: '啶ㄠぎ啶膏啶む',
+        assistant: '啶ㄠぎ啶膏啶む! 啶啶� 啶嗋 啶嗋お啶曕 啶曕啶膏 啶膏す啶距く啶むぞ 啶曕ぐ 啶膏啶むぞ 啶灌啶�?',
+        edit: '啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶啶た啶曕ぞ 啶ㄠぞ啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+      },
+    },
+    variable: {
+      item: {
+        title: '啶掂啶班た啶忇が啶� 啶斷ぐ 啶ぞ啶灌ぐ啷� 啶夃お啶曕ぐ啶�',
+        desc: '啶掂啶班た啶忇が啶� 啶斷ぐ 啶ぞ啶灌ぐ啷� 啶夃お啶曕ぐ啶� 啶∴ぞ啶侧啶�',
+      },
+      outputToolDisabledItem: {
+        title: '啶掂啶班た啶忇が啶�',
+        desc: '啶掂啶班た啶忇が啶� 啶∴ぞ啶侧啶�',
+      },
+      modal: {
+        add: '啶ㄠく啶� 啶掂啶班た啶忇が啶�',
+        addTool: '啶ㄠく啶� 啶夃お啶曕ぐ啶�',
+      },
+    },
+    query: {
+      item: {
+        title: '啶曕啶掂啶班',
+        desc: '啶夃お啶啶椸啶班啶むぞ 啶曕啶掂啶班 啶熰啶啶げ啷囙 啶∴ぞ啶侧啶�',
+      },
+    },
+    existed: '啶す啶侧 啶膏 啶灌 啶啶班啶啶啶� 啶啶� 啶啶溹啶� 啶灌',
+  },
+  imageUploader: {
+    uploadFromComputer: '啶曕啶啶啶熰ぐ 啶膏 啶呧お啶侧啶� 啶曕ぐ啷囙',
+    uploadFromComputerReadError: '啶涏さ啶� 啶あ啶监え啶� 啶掂た啶げ 啶班す啶�, 啶曕啶く啶� 啶啶ㄠ 啶啶班く啶距じ 啶曕ぐ啷囙啷�',
+    uploadFromComputerUploadError:
+      '啶涏さ啶� 啶呧お啶侧啶� 啶掂た啶げ 啶班す啶�, 啶曕啶く啶� 啶た啶� 啶膏 啶呧お啶侧啶� 啶曕ぐ啷囙啷�',
+    uploadFromComputerLimit:
+      '啶呧お啶侧啶� 啶曕 啶椸 啶涏さ啶苦く啶距 {{size}} MB 啶膏 啶呧ぇ啶苦 啶ㄠす啷�啶� 啶灌 啶膏啶む啶�',
+    pasteImageLink: '啶涏さ啶� 啶侧た啶傕 啶啶膏啶� 啶曕ぐ啷囙',
+    pasteImageLinkInputPlaceholder: '啶涏さ啶� 啶侧た啶傕 啶す啶距 啶啶膏啶� 啶曕ぐ啷囙',
+    pasteImageLinkInvalid: '啶呧ぎ啶距え啷嵿く 啶涏さ啶� 啶侧た啶傕',
+    imageUpload: '啶涏さ啶� 啶呧お啶侧啶�',
+  },
+  tag: {
+    placeholder: '啶膏き啷� 啶熰啶椸啶�',
+    addNew: '啶ㄠく啶� 啶熰啶� 啶溹啶∴ぜ啷囙',
+    noTag: '啶曕啶� 啶熰啶� 啶ㄠす啷�啶�',
+    noTagYet: '啶呧き啷� 啶む 啶曕啶� 啶熰啶� 啶ㄠす啷�啶�',
+    addTag: '啶熰啶� 啶溹啶∴ぜ啷囙',
+    editTag: '啶熰啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+    manageTags: '啶熰啶� 啶啶班が啶傕ぇ啶苦い 啶曕ぐ啷囙',
+    selectorPlaceholder: '啶栢啶溹え啷� 啶ぞ 啶え啶距え啷� 啶曕 啶侧た啶� 啶熰ぞ啶囙お 啶曕ぐ啷囙',
+    create: '啶え啶距啶�',
+    delete: '啶熰啶� 啶灌啶距啶�',
+    deleteTip: '啶熰啶� 啶曕ぞ 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ 啶班す啶� 啶灌, 啶曕啶ぞ 啶囙じ啷� 啶灌啶距え啶� 啶灌?',
+    created: '啶熰啶� 啶膏か啶侧い啶距お啷傕ぐ啷嵿さ啶� 啶え啶距く啶� 啶椸く啶�',
+    failed: '啶熰啶� 啶え啶距え啶� 啶呧じ啶げ 啶班す啶�',
+  },
+  fileUploader: {
+    pasteFileLinkInvalid: '啶呧ぎ啶距え啷嵿く 啶ぜ啶距啶� 啶侧た啶傕',
+    uploadFromComputerLimit: '啶呧お啶侧啶� 啶ぜ啶距啶� {{size}} 啶膏 啶溹ぜ啷嵿く啶距う啶� 啶ㄠす啷�啶� 啶灌 啶膏啶む',
+    uploadFromComputerUploadError: '啶ぜ啶距啶� 啶呧お啶侧啶� 啶掂た啶げ 啶班す啷�, 啶曕啶く啶� 啶た啶� 啶膏 啶呧お啶侧啶� 啶曕ぐ啷囙啷�',
+    pasteFileLinkInputPlaceholder: 'URL 啶︵ぐ啷嵿 啶曕ぐ啷囙...',
+    uploadFromComputerReadError: '啶ぜ啶距啶� 啶あ啶监え啶� 啶掂た啶げ 啶班す啶�, 啶曕啶く啶� 啶啶ㄠ 啶啶班く啶距じ 啶曕ぐ啷囙.',
+    pasteFileLink: '啶ぜ啶距啶� 啶侧た啶傕 啶啶膏啶� 啶曕ぐ啷囙',
+    fileExtensionNotSupport: '啶ぜ啶距啶� 啶忇啷嵿じ啶熰啶傕ざ啶� 啶膏ぎ啶班啶ムた啶� 啶ㄠす啷�啶� 啶灌',
+    uploadFromComputer: '啶膏啶ムぞ啶ㄠ啶� 啶呧お啶侧啶�',
+  },
+  license: {
+    expiring: '啶忇 啶︵た啶� 啶啶� 啶膏ぎ啶距お啷嵿い 啶灌 啶班す啶� 啶灌',
+    expiring_plural: '{{啶椸た啶ㄠい啷�}} 啶︵た啶ㄠ啶� 啶啶� 啶膏ぎ啶距お啷嵿い 啶灌 啶班す啶� 啶灌',
+  },
+  pagination: {
+    perPage: '啶啶班い啶� 啶啶粪啶� 啶嗋啶熰ぎ',
+  },
+  theme: {
+    light: '啶班啶多え啷�',
+    theme: '啶ム啶�',
+    auto: '啶啶班ぃ啶距げ啷�',
+    dark: '啶呧啶о啶班ぞ',
+  },
+  compliance: {
+    iso27001: '啶嗋啶忇じ啶� 27001:2022 啶啶班ぎ啶距ぃ啶�',
+    gdpr: '啶溹啶∴啶啶嗋ぐ 啶∴啶啶�',
+    soc2Type1: 'SOC 2 啶啶班啶距ぐ I 啶班た啶啶班啶�',
+    professionalUpgradeTooltip: '啶曕啶掂げ 啶熰啶� 啶啶溹え啶� 啶ぞ 啶夃じ啶膏 啶娻お啶� 啶曕 啶膏ぞ啶� 啶夃お啶侧が啷嵿ぇ 啶灌啷�',
+    soc2Type2: 'SOC 2 啶啶班啶距ぐ II 啶班た啶啶班啶�',
+    sandboxUpgradeTooltip: '啶曕啶掂げ 啶啶多啶掂ぐ 啶ぞ 啶熰啶� 啶啶溹え啶� 啶曕 啶膏ぞ啶� 啶夃お啶侧が啷嵿ぇ 啶灌啷�',
+  },
+  imageInput: {
+    supportedFormats: 'PNG, JPG, JPEG, WEBP 啶斷ぐ GIF 啶曕ぞ 啶膏ぎ啶班啶ムえ 啶曕ぐ啶むぞ 啶灌',
+    browse: '啶啶班ぞ啶夃啶� 啶曕ぐ啷囙',
+    dropImageHere: '啶呧お啶ㄠ 啶涏さ啶� 啶す啶距 啶涏啶∴ぜ啷囙, 啶ぞ',
+  },
+}
+
+export default translation
diff --git a/i18n/hi-IN/custom.ts b/i18n/hi-IN/custom.ts
new file mode 100644
index 0000000..a654fce
--- /dev/null
+++ b/i18n/hi-IN/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: '啶掂啶啷嵿い啶苦啶班ぃ',
+  upgradeTip: {
+    prefix: '啶呧お啶椸啶班啶� 啶曕ぐ啷囙 啶呧お啶ㄠ 啶啶侧ぞ啶� 啶曕',
+    suffix: '啶膏啶掂く啶� 啶呧お啶ㄠぞ 啶啶班ぞ啶傕ぁ 啶氞啶ㄠえ啶距イ',
+    title: '啶呧お啶ㄠ 啶啶溹え啶� 啶曕 啶呧お啶椸啶班啶� 啶曕ぐ啷囙',
+    des: '啶呧お啶ㄠ 啶啶班ぞ啶傕ぁ 啶曕 啶曕じ啷嵿啶ぞ啶囙啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶呧お啶ㄠ 啶啶溹え啶� 啶曕 啶呧お啶椸啶班啶� 啶曕ぐ啷囙',
+  },
+  webapp: {
+    title: 'WebApp 啶曕ぞ 啶啶班ぞ啶傕ぁ 啶掂啶啷嵿い啶苦啶班ぃ 啶曕ぐ啷囙',
+    removeBrand: '啶ぞ啶掂ぐ啷嵿ぁ 啶︵啶掂ぞ啶班ぞ 啶∴た啶 啶灌啶距啶�',
+    changeLogo: '啶ぞ啶掂ぐ啷嵿ぁ 啶︵啶掂ぞ啶班ぞ 啶啶班ぞ啶傕ぁ 啶涏さ啶� 啶う啶侧',
+    changeLogoTip: 'SVG 啶ぞ PNG 啶啶班ぞ啶班啶� 啶曕 啶膏ぞ啶� 啶ㄠ啶啶ㄠい啶� 啶嗋啶距ぐ 40x40px 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶�',
+  },
+  app: {
+    title: '啶灌啶∴ぐ 啶曕ぞ 啶啶班ぞ啶傕ぁ 啶掂啶啷嵿い啶苦啶班ぃ 啶曕ぐ啷囙',
+    changeLogoTip: 'SVG 啶ぞ PNG 啶啶班ぞ啶班啶� 啶曕 啶膏ぞ啶� 啶ㄠ啶啶ㄠい啶� 啶嗋啶距ぐ 80x80px 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶�',
+  },
+  upload: '啶氞あ啶监ぞ啶忇',
+  uploading: '啶氞あ啶监ぞ啶忇...',
+  uploadedFail: '啶氞た啶む啶� 啶呧お啶侧啶� 啶呧じ啶げ 啶灌, 啶曕啶く啶� 啶た啶� 啶膏 啶呧お啶侧啶� 啶曕ぐ啷囙啷�',
+  change: '啶う啶侧啶�',
+  apply: '啶侧啶距啶�',
+  restore: '啶∴た啶ぜ啷夃げ啷嵿 啶班た啶曕さ啶班',
+  customize: {
+    contactUs: ' 啶灌ぎ啶膏 啶膏啶ぐ啷嵿 啶曕ぐ啷囙 ',
+    prefix: '啶呧お啷嵿げ啷�啶曕啶多え 啶啶� 啶啶班ぞ啶傕ぁ 啶侧啶椸 啶う啶侧え啷� 啶曕 啶侧た啶�, 啶曕啶く啶�',
+    suffix: ' Enterprise 啶膏啶膏啶曕ぐ啶� 啶啶� 啶呧お啶椸啶班啶� 啶曕ぐ啷囙.',
+  },
+}
+
+export default translation
diff --git a/i18n/hi-IN/dataset-creation.ts b/i18n/hi-IN/dataset-creation.ts
new file mode 100644
index 0000000..1f83843
--- /dev/null
+++ b/i18n/hi-IN/dataset-creation.ts
@@ -0,0 +1,238 @@
+const translation = {
+  steps: {
+    header: {
+      creation: '啶溹啶炧ぞ啶� 啶え啶距啶�',
+      update: '啶∴啶熰ぞ 啶溹啶∴ぜ啷囙',
+      fallbackRoute: '啶溹啶炧ぞ啶�',
+    },
+    one: '啶∴啶熰ぞ 啶膏啶班啶� 啶氞啶ㄠ啶�',
+    two: '啶ぞ啶� 啶啶班啶�-啶啶班じ啶傕じ啷嵿啶班ぃ 啶斷ぐ 啶膏か啶距',
+    three: '啶ㄠた啶粪啶ぞ啶︵た啶� 啶曕ぐ啷囙 啶斷ぐ 啶膏ぎ啶距お啷嵿い 啶曕ぐ啷囙',
+  },
+  error: {
+    unavailable: '啶す 啶溹啶炧ぞ啶� 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶灌',
+  },
+  firecrawl: {
+    configFirecrawl: '馃敟啶ぞ啶ぐ啶曕啶班啶� 啶曕 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+    apiKeyPlaceholder: 'firecrawl.dev 啶膏 API 啶曕啶傕啷�',
+    getApiKeyLinkText: 'firecrawl.dev 啶膏 啶呧お啶ㄠ API 啶曕啶傕啷� 啶啶班ぞ啶啶� 啶曕ぐ啷囙',
+  },
+  stepOne: {
+    filePreview: '啶ぜ啶距啶� 啶啶班啶掂ぞ啶掂げ啷嬥啶�',
+    pagePreview: '啶啶粪啶� 啶啶班啶掂ぞ啶掂げ啷嬥啶�',
+    dataSourceType: {
+      file: '啶ぜ啶距啶� 啶膏 啶嗋く啶距い 啶曕ぐ啷囙',
+      notion: '啶ㄠ啶熰た啶え 啶膏 啶膏た啶傕 啶曕ぐ啷囙',
+      web: '啶掂啶じ啶距啶� 啶膏 啶膏た啶傕 啶曕ぐ啷囙',
+    },
+    uploader: {
+      title: '啶ぜ啶距啶� 啶呧お啶侧啶� 啶曕ぐ啷囙',
+      button: '啶ぜ啶距啶侧啶� 啶ぞ 啶ぜ啷嬥げ啷嵿ぁ啶班啶� 啶曕 啶栢啶傕啷囙 啶斷ぐ 啶涏啶∴ぜ啷囙, 啶ぞ',
+      browse: '啶啶班ぞ啶夃啶� 啶曕ぐ啷囙',
+      tip: '啶膏ぎ啶班啶ムた啶� {{supportTypes}}啷� 啶啶班い啷嵿く啷囙 啶呧ぇ啶苦啶むぎ {{size}}MB啷�',
+      validation: {
+        typeError: '啶ぜ啶距啶� 啶啶班啶距ぐ 啶膏ぎ啶班啶ムた啶� 啶ㄠす啷�啶� 啶灌',
+        size: '啶ぜ啶距啶� 啶す啷佮い 啶ぁ啶监 啶灌啷� 啶呧ぇ啶苦啶むぎ {{size}}MB 啶灌',
+        count: '啶忇啶距ぇ啶苦 啶ぜ啶距啶侧啶� 啶膏ぎ啶班啶ムた啶� 啶ㄠす啷�啶� 啶灌啶�',
+        filesNumber: '啶嗋お啶ㄠ {{filesNumber}} 啶曕 啶啶� 啶呧お啶侧啶� 啶膏啶ぞ 啶む 啶す啷佮啶� 啶椸 啶灌啶傕イ',
+      },
+      cancel: '啶班う啷嵿う 啶曕ぐ啷囙',
+      change: '啶う啶侧啶�',
+      failed: '啶呧お啶侧啶� 啶掂た啶げ 啶班す啶�',
+    },
+    notionSyncTitle: '啶ㄠ啶熰た啶え 啶曕え啷囙啷嵿 啶ㄠす啷�啶� 啶灌',
+    notionSyncTip:
+      '啶ㄠ啶熰た啶え 啶膏 啶膏た啶傕 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�, 啶す啶侧 啶ㄠ啶熰た啶え 啶膏 啶曕え啷囙啷嵿ざ啶� 啶膏啶ムぞ啶た啶� 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶忇イ',
+    connect: '啶曕え啷囙啷嵿 啶曕ぐ啶ㄠ 啶溹ぞ啶忇',
+    button: '啶呧啶侧ぞ',
+    emptyDatasetCreation: '啶啶� 啶忇 啶栢ぞ啶侧 啶溹啶炧ぞ啶� 啶え啶距え啶� 啶氞ぞ啶灌い啶� 啶灌啶�',
+    modal: {
+      title: '啶忇 啶栢ぞ啶侧 啶溹啶炧ぞ啶� 啶え啶距啶�',
+      tip: '啶忇 啶栢ぞ啶侧 啶溹啶炧ぞ啶� 啶啶� 啶曕啶� 啶︵じ啷嵿い啶距さ啷囙啶� 啶ㄠす啷�啶� 啶灌啶椸ぞ, 啶斷ぐ 啶嗋お 啶曕き啷� 啶 啶︵じ啷嵿い啶距さ啷囙啶� 啶呧お啶侧啶� 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+      input: '啶溹啶炧ぞ啶� 啶曕ぞ 啶ㄠぞ啶�',
+      placeholder: '啶曕啶く啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+      nameNotEmpty: '啶ㄠぞ啶� 啶栢ぞ啶侧 啶ㄠす啷�啶� 啶灌 啶膏啶むぞ',
+      nameLengthInvalid: '啶ㄠぞ啶� 1 啶膏 40 啶掂ぐ啷嵿ぃ啷嬥 啶曕 啶啶� 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶�',
+      cancelButton: '啶班う啷嵿う 啶曕ぐ啷囙',
+      confirmButton: '啶え啶距啶�',
+      failed: '啶え啶距え啶� 啶掂た啶げ 啶班す啶�',
+    },
+    website: {
+      fireCrawlNotConfigured: '啶ぞ啶ぐ啶曕啶班啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶� 啶灌',
+      fireCrawlNotConfiguredDescription:
+        '啶囙じ啷� 啶夃お啶啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶ぞ啶ぐ啶曕啶班啶� 啶曕 API 啶曕啶傕啷� 啶曕 啶膏ぞ啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙啷�',
+      configure: '啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+      run: '啶氞げ啶距啶�',
+      firecrawlTitle: '馃敟啶ぞ啶ぐ啶曕啶班啶� 啶曕 啶膏ぞ啶� 啶掂啶� 啶膏ぞ啶啷嵿ぐ啷� 啶ㄠた啶曕ぞ啶侧啶�',
+      firecrawlDoc: '啶ぞ啶ぐ啶曕啶班啶� 啶︵じ啷嵿い啶距さ啷囙啶�',
+      firecrawlDocLink:
+        'https://docs.dify.ai/guides/knowledge-base/sync_from_website',
+      options: '啶掂た啶曕げ啷嵿お',
+      crawlSubPage: '啶夃お-啶啶粪啶犩啶� 啶曕 啶曕啶班啶� 啶曕ぐ啷囙',
+      limit: '啶膏啶ぞ',
+      maxDepth: '啶呧ぇ啶苦啶むぎ 啶椸す啶班ぞ啶�',
+      excludePaths: '啶ぅ啷嬥 啶曕 啶ぞ啶灌ぐ 啶班啷囙',
+      includeOnlyPaths: '啶曕啶掂げ 啶ぅ啷嬥 啶曕 啶多ぞ啶た啶� 啶曕ぐ啷囙',
+      extractOnlyMainContent:
+        '啶曕啶掂げ 啶啶栢啶� 啶膏ぞ啶啷嵿ぐ啷� 啶ㄠた啶曕ぞ啶侧啶� (啶曕啶� 啶灌啶∴ぐ, 啶ㄠ啶掂啶�, 啶啶熰ぐ 啶嗋う啶� 啶ㄠす啷�啶�)',
+      exceptionErrorTitle: '啶ぞ啶ぐ啶曕啶班啶� 啶溹啶� 啶氞げ啶距い啷� 啶膏ぎ啶� 啶忇 啶呧お啶掂ぞ啶� 啶灌啶�:',
+      unknownError: '啶呧啷嵿啶距い 啶む啶班啶熰た',
+      totalPageScraped: '啶曕啶� 啶啶粪啶� 啶膏啶曕啶班啶� 啶曕た啶� 啶椸:',
+      selectAll: '啶膏き啷� 啶氞啶ㄠ啶�',
+      resetAll: '啶膏き啷� 啶班啶膏啶� 啶曕ぐ啷囙',
+      scrapTimeInfo: '啶曕啶� {{total}} 啶啶粪啶犩啶� 啶曕 {{time}}s 啶啶� 啶膏啶曕啶班啶� 啶曕た啶ぞ 啶椸く啶�',
+      preview: '啶啶班啶掂ぞ啶掂げ啷嬥啶�',
+      maxDepthTooltip:
+        '啶啶班さ啶苦し啷嵿 URL 啶曕 啶膏ぞ啶啶曕啶� 啶曕啶班啶� 啶曕ぐ啶ㄠ 啶曕 啶呧ぇ啶苦啶むぎ 啶椸す啶班ぞ啶堗イ 啶椸す啶班ぞ啶� 0 啶曕啶掂げ 啶啶班さ啶苦し啷嵿 url 啶曕ぞ 啶啶粪啶� 啶膏啶曕啶班啶� 啶曕ぐ啶むぞ 啶灌, 啶椸す啶班ぞ啶� 1 url 啶斷ぐ 啶啶班さ啶苦し啷嵿URL + 啶忇 / 啶曕 啶ぞ啶� 啶膏が 啶曕啶� 啶膏啶曕啶班啶� 啶曕ぐ啶むぞ 啶灌, 啶斷ぐ 啶囙じ啷� 啶むぐ啶灌イ',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      jinaReaderDoc: '啶溹啶ㄠぞ 啶班啶∴ぐ 啶曕 啶ぞ啶班 啶啶� 啶呧ぇ啶苦 啶溹ぞ啶ㄠ啶�',
+      useSitemapTooltip: '啶膏ぞ啶囙 啶曕啶班啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶膏ぞ啶囙啶啶� 啶曕ぞ 啶呧え啷佮じ啶班ぃ 啶曕ぐ啷囙. 啶う啶� 啶ㄠす啷�啶�, 啶む 啶溹啶ㄠぞ 啶班啶∴ぐ 啶啶粪啶� 啶啶班ぞ啶膏啶椸た啶曕い啶� 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶啶ㄠぐ啶距さ啷冟い啷嵿い 啶班啶� 啶膏 啶曕啶班啶� 啶曕ぐ啷囙啶�, 啶曕ぎ 啶侧啶曕た啶� 啶夃啷嵿-啶椸啶`さ啶む啶むぞ 啶掂ぞ啶侧 啶啶粪啶犩啶� 啶曕 啶夃お啶� 啶︵啶椸ぞ啷�',
+      useSitemap: '啶膏ぞ啶囙啶啶� 啶曕ぞ 啶囙じ啷嵿い啷囙ぎ啶距げ 啶曕ぐ啶ㄠぞ',
+      jinaReaderNotConfigured: '啶溹啶ㄠぞ 啶班啶∴ぐ 啶曕啶ㄠ啶ぜ啶苦啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶� 啶灌',
+      chooseProvider: '啶忇 啶啶班う啶距い啶� 啶曕ぞ 啶氞く啶� 啶曕ぐ啷囙',
+      jinaReaderTitle: '啶啶班 啶膏ぞ啶囙 啶曕 啶ぞ啶班啶曕ぁ啶距啶� 啶啶� 啶う啶侧啶�',
+      jinaReaderNotConfiguredDescription: '啶忇啷嵿じ啷囙じ 啶曕 啶侧た啶� 啶呧お啶ㄠ 啶啶啶� 啶忇お啷�啶嗋 啶曕啶傕啷� 啶︵ぐ啷嵿 啶曕ぐ啶曕 啶溹啶ㄠぞ 啶班啶∴ぐ 啶膏啶� 啶曕ぐ啷囙啷�',
+      watercrawlTitle: 'Watercrawl 啶曕 啶膏ぞ啶� 啶掂啶� 啶膏ぞ啶啷嵿ぐ啷� 啶ㄠた啶曕ぞ啶侧啶�',
+      waterCrawlNotConfigured: 'Watercrawl 啶曕 啶曕啶ㄠ啶ぜ啶苦啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶� 啶灌',
+      configureFirecrawl: '啶ぞ啶ぐ啶曕啶班啶� 啶曕 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+      watercrawlDoc: '啶掂ぞ啶熰ぐ啶曕啶班啶� 啶︵じ啷嵿い啶距さ啷囙啶�',
+      waterCrawlNotConfiguredDescription: '啶囙じ啷� 啶夃お啶啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶掂啶熰ぐ啶曕啶班啶� 啶曕 啶忇お啷�啶嗋 啶曕啶傕啷� 啶曕 啶膏ぞ啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙啷�',
+      watercrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      configureJinaReader: '啶溹た啶ㄠぞ 啶班啶∴ぐ 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+      configureWatercrawl: '啶掂ぞ啶熰ぐ啶曕啶班啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+    },
+    cancel: '啶班う啷嵿う 啶曕ぐ啶ㄠぞ',
+  },
+  stepTwo: {
+    segmentation: '啶栢啶� 啶膏啶熰た啶傕啷嵿じ',
+    auto: '啶膏啶掂啶距げ啶苦い',
+    autoDescription:
+      '啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶栢啶� 啶斷ぐ 啶啶班啶�-啶啶班じ啶傕じ啷嵿啶班ぃ 啶ㄠた啶ぎ 啶膏啶� 啶曕ぐ啷囙啷� 啶呧お啶班た啶氞た啶� 啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶す 啶氞啶ㄠえ啷� 啶曕 啶膏た啶ぞ啶班た啶� 啶曕 啶溹ぞ啶む 啶灌啷�',
+    custom: '啶曕じ啷嵿啶�',
+    customDescription:
+      '啶曕じ啷嵿啶ぞ啶囙 啶栢啶� 啶ㄠた啶ぎ, 啶栢啶� 啶侧啶ぞ啶�, 啶斷ぐ 啶啶班啶�-啶啶班じ啶傕じ啷嵿啶班ぃ 啶ㄠた啶ぎ 啶嗋う啶苦イ',
+    separator: '啶栢啶� 啶す啶氞ぞ啶ㄠ啶班啶むぞ',
+    separatorPlaceholder:
+      '啶夃う啶距す啶班ぃ 啶曕 啶侧た啶�, 啶ㄠく啶� 啶侧ぞ啶囙え (\\\\n) 啶ぞ 啶掂た啶多啶� 啶掂た啶ぞ啶溹 (啶溹啶膏 "***")',
+    maxLength: '啶呧ぇ啶苦啶むぎ 啶栢啶� 啶侧啶ぞ啶�',
+    overlap: '啶栢啶� 啶撪さ啶班げ啷堗お',
+    overlapTip:
+      '啶栢啶� 啶撪さ啶班げ啷堗お 啶膏啶� 啶曕ぐ啶ㄠ 啶膏 啶夃え啶曕 啶啶� 啶曕 啶膏ぞ啶傕さ啶苦ぇ啶距え啶苦 啶啶班ぞ啶膏啶椸た啶曕い啶� 啶え啶距 啶班啷� 啶溹ぞ 啶膏啶む 啶灌, 啶啶ㄠ 啶啶班ぞ啶啶むた 啶啶班き啶距さ 啶曕 啶あ啶监ぞ啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌啷� 10%-25% 啶呧ぇ啶苦啶むぎ 啶栢啶� 啶嗋啶距ぐ 啶膏啶� 啶曕ぐ啶ㄠ 啶曕 啶膏た啶ぞ啶班た啶� 啶曕 啶溹ぞ啶む 啶灌啷�',
+    overlapCheck: '啶栢啶� 啶撪さ啶班げ啷堗お 啶呧ぇ啶苦啶むぎ 啶栢啶� 啶侧啶ぞ啶� 啶膏 啶ぁ啶监ぞ 啶ㄠす啷�啶� 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶�',
+    rules: '啶ぞ啶� 啶啶班啶�-啶啶班じ啶傕じ啷嵿啶班ぃ 啶ㄠた啶ぎ',
+    removeExtraSpaces:
+      '啶侧啶距い啶距ぐ 啶班た啶曕啶� 啶膏啶ムぞ啶�, 啶ㄠ 啶侧ぞ啶囙え 啶斷ぐ 啶熰啶啶� 啶曕 啶啶班い啶苦じ啷嵿ぅ啶距お啶苦い 啶曕ぐ啷囙',
+    removeUrlEmails: '啶膏き啷� URL 啶斷ぐ 啶堗ぎ啷囙げ 啶い啷嬥 啶曕 啶灌啶距啶�',
+    removeStopwords: '啶班啶曕ぞ啶掂 啶多が啷嵿う 啶溹啶膏 "a", "an", "the" 啶灌啶距啶�',
+    preview: '啶啶粪啶熰た 啶曕ぐ啷囙 啶斷ぐ 啶啶班啶掂ぞ啶掂げ啷嬥啶� 啶曕ぐ啷囙',
+    reset: '啶班啶膏啶�',
+    indexMode: '啶囙啶∴啶曕啶� 啶啶�',
+    qualified: '啶夃啷嵿 啶椸啶`さ啶む啶むぞ',
+    recommend: '啶膏た啶ぞ啶班た啶� 啶曕ぐ啷囙',
+    qualifiedTip:
+      '啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶啶班ざ啷嵿え啷嬥 啶曕 啶︵啶班ぞ啶� 啶夃啷嵿 啶膏啷�啶曕い啶� 啶啶班う啶距え 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶∴た啶ぜ啷夃げ啷嵿 啶膏た啶膏啶熰ぎ 啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶囙啶熰ぐ啶啶� 啶曕 啶曕啶� 啶曕ぐ啷囙啷�',
+    warning: '啶曕啶く啶� 啶す啶侧 啶啶∴げ 啶啶班う啶距い啶� API 啶曕啶傕啷� 啶膏啶� 啶曕ぐ啷囙啷�',
+    click: '啶膏啶熰た啶傕啷嵿じ 啶ぐ 啶溹ぞ啶忇',
+    economical: '啶嗋ぐ啷嵿ぅ啶苦',
+    economicalTip:
+      '啶戉か啶监げ啶距啶� 啶掂啶曕啶熰ぐ 啶囙啶溹え, 啶曕啶掂ぐ啷嵿ぁ 啶囙啶∴啶曕啶� 啶嗋う啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕 啶膏啷�啶曕い啶� 啶曕 啶曕ぎ 啶曕ぐ啷囙 啶た啶ㄠぞ 啶熰啶曕え 啶栢ぐ啷嵿 啶曕た啶�',
+    QATitle: '啶啶班ざ啷嵿え 啶斷ぐ 啶夃い啷嵿い啶� 啶啶班ぞ啶班啶� 啶啶� 啶栢啶� 啶曕ぐ啶ㄠぞ',
+    QATip: '啶囙じ 啶掂た啶曕げ啷嵿お 啶曕 啶膏啷嵿し啶� 啶曕ぐ啶ㄠ 啶膏 啶呧ぇ啶苦 啶熰啶曕え 啶栢ぐ啷嵿 啶灌啶傕啷�',
+    QALanguage: '啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕 啶栢啶� 啶曕ぐ啶ㄠぞ',
+    estimateCost: '啶呧え啷佮ぎ啶距え啶苦い 啶侧ぞ啶椸い',
+    estimateSegment: '啶呧え啷佮ぎ啶距え啶苦い 啶栢啶�',
+    segmentCount: '啶栢啶�',
+    calculating: '啶椸ぃ啶ㄠぞ 啶曕ぐ 啶班す啶� 啶灌...',
+    fileSource: '啶︵じ啷嵿い啶距さ啷囙啶监啶� 啶曕 啶啶班啶�-啶啶班じ啶傕じ啷嵿啶班ぃ 啶曕ぐ啷囙',
+    notionSource: '啶啶粪啶犩啶� 啶曕 啶啶班啶�-啶啶班じ啶傕じ啷嵿啶班ぃ 啶曕ぐ啷囙',
+    websiteSource: '啶掂啶じ啶距啶� 啶曕 啶啶班啶�-啶啶班じ啶傕じ啷嵿啶班ぃ 啶曕ぐ啷囙',
+    other: '啶斷ぐ 啶呧え啷嵿く ',
+    fileUnit: ' 啶ぜ啶距啶侧啶�',
+    notionUnit: ' 啶啶粪啶�',
+    webpageUnit: ' 啶啶粪啶�',
+    previousStep: '啶た啶涏げ啶� 啶曕う啶�',
+    nextStep: '啶膏す啷囙啷囙 啶斷ぐ 啶膏啶膏ぞ啶оた啶� 啶曕ぐ啷囙',
+    save: '啶膏す啷囙啷囙 啶斷ぐ 啶膏啶膏ぞ啶оた啶� 啶曕ぐ啷囙',
+    cancel: '啶班う啷嵿う 啶曕ぐ啷囙',
+    sideTipTitle: '啶栢啶� 啶斷ぐ 啶啶班啶�-啶啶班じ啶傕じ啷嵿啶班ぃ 啶曕啶啶� 啶曕ぐ啷囙?',
+    sideTipP1:
+      '啶ぞ啶� 啶∴啶熰ぞ 啶曕 啶膏啶膏ぞ啶оた啶� 啶曕ぐ啶む 啶膏ぎ啶�, 啶栢啶� 啶斷ぐ 啶膏か啶距 啶︵ 啶す啶む啶掂お啷傕ぐ啷嵿ぃ 啶啶班啶�-啶啶班じ啶傕じ啷嵿啶班ぃ 啶氞ぐ啶� 啶灌啶傕イ',
+    sideTipP2:
+      '啶栢啶� 啶侧啶 啶ぞ啶� 啶曕 啶啶班ぞ啶椸啶班ぞ啶� 啶啶� 啶掂た啶ぞ啶溹た啶� 啶曕ぐ啶むぞ 啶灌 啶むぞ啶曕た 啶啶∴げ 啶啶灌い啶� 啶膏ぎ啶� 啶膏啷囙イ 啶す 啶啶∴げ 啶ぐ啶苦ぃ啶距ぎ啷嬥 啶曕 啶椸啶`さ啶む啶むぞ 啶斷ぐ 啶啶班ぞ啶膏啶椸た啶曕い啶� 啶啶� 啶膏啶оぞ啶� 啶曕ぐ啶むぞ 啶灌啷�',
+    sideTipP3:
+      '啶膏か啶距 啶呧え啶距さ啶多啶 啶掂ぐ啷嵿ぃ啷嬥 啶斷ぐ 啶膏啶掂ぐ啷傕お啷嬥 啶曕 啶灌啶距い啷� 啶灌, 啶溹啶炧ぞ啶� 啶曕 啶膏ぞ啶� 啶斷ぐ 啶膏ぐ啶� 啶え啶距え啷� 啶啶� 啶う啶� 啶曕ぐ啶む 啶灌啷�',
+    sideTipP4:
+      '啶夃啶苦い 啶栢啶� 啶斷ぐ 啶膏か啶距 啶啶∴げ 啶啶班う啶班啶多え 啶啶� 啶膏啶оぞ啶� 啶曕ぐ啶む 啶灌, 啶呧ぇ啶苦 啶膏啷�啶� 啶斷ぐ 啶啶侧啶さ啶距え 啶ぐ啶苦ぃ啶距ぎ 啶啶班う啶距え 啶曕ぐ啶む 啶灌啷�',
+    previewTitle: '啶啶班啶掂ぞ啶掂げ啷嬥啶�',
+    previewTitleButton: '啶啶班啶掂ぞ啶掂げ啷嬥啶�',
+    previewButton: '啶啶班ざ啷嵿え-啶夃い啷嵿い啶� 啶啶班ぞ啶班啶� 啶啶� 啶膏啶掂た啶� 啶曕ぐ啶ㄠぞ',
+    previewSwitchTipStart:
+      '啶掂ぐ啷嵿い啶ぞ啶� 啶栢啶� 啶啶班啶掂ぞ啶掂げ啷嬥啶� 啶ぞ啶� 啶啶班ぞ啶班啶� 啶啶� 啶灌, 啶啶班ざ啷嵿え-啶夃い啷嵿い啶� 啶啶班ぞ啶班啶� 啶啶� 啶膏啶掂た啶� 啶曕ぐ啶ㄠ 啶膏',
+    previewSwitchTipEnd: ' 啶呧い啶苦ぐ啶苦啷嵿い 啶熰啶曕え 啶栢ぐ啷嵿 啶灌啶傕啷�',
+    characters: '啶掂ぐ啷嵿ぃ',
+    indexSettingTip: '啶囙啶∴啶曕啶� 啶掂た啶оた 啶う啶侧え啷� 啶曕 啶侧た啶�, 啶曕啶く啶� 啶溹ぞ啶忇 ',
+    retrievalSettingTip: '啶囙啶∴啶曕啶� 啶掂た啶оた 啶う啶侧え啷� 啶曕 啶侧た啶�, 啶曕啶く啶� 啶溹ぞ啶忇 ',
+    datasetSettingLink: '啶溹啶炧ぞ啶� 啶膏啶熰た啶傕啷嵿じ啷�',
+    separatorTip: '啶忇 啶膏啶ぞ啶傕啶� 啶ぞ啶� 啶曕 啶呧げ啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶ㄠ 啶掂ぞ啶侧ぞ 啶掂ぐ啷嵿ぃ 啶灌啷� \\n\\n 啶斷ぐ \\n 啶嗋ぎ啶む啶� 啶ぐ 啶啶班ぞ啶椸啶班ぞ啶� 啶斷ぐ 啶侧ぞ啶囙え啷嬥 啶曕 啶呧げ啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶� 啶溹ぞ啶ㄠ 啶掂ぞ啶侧 啶膏啶ぞ啶傕啶� 啶灌啶傕イ 啶呧げ啷嵿お啶掂た啶班ぞ啶� (\\n\\n,\\n) 啶曕 啶膏ぞ啶� 啶膏啶啶曕啶�, 啶呧ぇ啶苦啶むぎ 啶栢啶� 啶侧啶ぞ啶� 啶膏 啶呧ぇ啶苦 啶灌啶ㄠ 啶ぐ 啶呧え啷佮啷嵿啷囙う啷嬥 啶曕 啶啶曕啶むた啶啶� 啶︵啶掂ぞ啶班ぞ 啶栢啶∴た啶� 啶曕た啶ぞ 啶溹ぞ啶忇啶距イ 啶嗋お 啶膏啶掂く啶� 啶︵啶掂ぞ啶班ぞ 啶ぐ啶苦き啶距し啶苦い 啶掂た啶多啶� 啶膏啶ぞ啶傕啶� 啶曕ぞ 啶 啶夃お啶啶� 啶曕ぐ 啶膏啶む 啶灌啶� (啶夃う啶�. ***).',
+    maxLengthCheck: '啶呧ぇ啶苦啶むぎ 啶氞啶� 啶侧啶ぞ啶� {{limit}} 啶膏 啶曕ぎ 啶灌啶ㄠ 啶氞ぞ啶灌た啶�',
+    useQALanguage: '啶啶� 啶曕啶 啶忇啶� 啶� 啶啶班ぞ啶班啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕 啶氞啶� 啶曕ぐ啷囙',
+    previewChunkCount: '{{啶椸た啶ㄠい啷�}} 啶呧え啷佮ぎ啶距え啶苦い 啶栢啶�',
+    previewChunk: '啶啶班啶掂ぞ啶掂げ啷嬥啶� 啶氞啶�',
+    paragraph: '啶呧え啷佮啷嶁�嵿啷囙う',
+    general: '啶膏ぞ啶ぞ啶ㄠ啶�',
+    highQualityTip: '啶忇 啶ぞ啶� 啶夃啷嵿 啶椸啶`さ啶む啶むぞ 啶啶� 啶啶� 啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶膏ぎ啶距お啷嵿い 啶曕ぐ啶ㄠ 啶曕 啶ぞ啶�, 啶曕た啶ぞ啶い啷� 啶啶� 啶ぐ 啶掂ぞ啶じ 啶溹ぞ啶ㄠぞ 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶灌啷�',
+    parentChunkForContext: '啶膏啶︵ぐ啷嵿き 啶曕 啶侧た啶� 啶ぞ啶むぞ-啶た啶むぞ 啶曕ぞ 啶灌た啶膏啶膏ぞ',
+    notAvailableForQA: 'Q&A 啶囙啶∴啶曕啶� 啶曕 啶侧た啶� 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶灌',
+    fullDoc: '啶啶班啶� 啶∴啶曕啶熰ぐ',
+    fullDocTip: '啶啶班 啶︵じ啷嵿い啶距さ啷囙啶� 啶曕 啶啶� 啶栢啶� 啶曕 啶班啶� 啶啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌 啶斷ぐ 啶膏啶о 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷� 啶曕啶く啶� 啶о啶ぞ啶� 啶︵啶� 啶曕た 啶啶班う啶班啶多え 啶曕ぞ啶班ぃ啷嬥 啶膏, 10000 啶熰啶曕え 啶膏 啶呧ぇ啶苦 啶曕ぞ 啶ぞ啶� 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶涏啶熰ぞ 啶曕ぐ 啶︵た啶ぞ 啶溹ぞ啶忇啶距イ',
+    previewChunkTip: '啶啶班啶掂ぞ啶掂げ啷嬥啶� 啶侧啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶ぞ啶堗 啶撪ぐ \'啶啶班啶掂ぞ啶掂げ啷嬥啶� 啶氞啶昞' 啶啶� 啶ぐ 啶曕啶侧た啶� 啶曕ぐ啷囙',
+    generalTip: '啶膏ぞ啶ぞ啶ㄠ啶� 啶ぞ啶� 啶氞啶曕た啶傕 啶啶�, 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い 啶斷ぐ 啶ぞ啶� 啶曕た啶� 啶椸 啶氞啶曕啶� 啶膏ぎ啶距え 啶灌啶傕イ',
+    qaSwitchHighQualityTipTitle: 'Q&A 啶啶班ぞ啶班啶� 啶曕 啶侧た啶� 啶夃啷嵿-啶椸啶`さ啶む啶むぞ 啶呧え啷佮啷嵿ぐ啶ぃ 啶掂た啶оた 啶曕 啶嗋さ啶多啶啶むぞ 啶灌啶む 啶灌',
+    qaSwitchHighQualityTipContent: '啶掂ぐ啷嵿い啶ぞ啶� 啶啶�, 啶曕啶掂げ 啶夃啷嵿-啶椸啶`さ啶む啶むぞ 啶掂ぞ啶侧 啶呧え啷佮啷嵿ぐ啶ぃ啶苦啶� 啶掂た啶оた Q & A 啶啶班ぞ啶班啶� 啶氞啶曕た啶傕 啶曕ぞ 啶膏ぎ啶班啶ムえ 啶曕ぐ啶む 啶灌啷� 啶曕啶ぞ 啶嗋お 啶夃啷嵿-啶椸啶`さ啶む啶むぞ 啶啶� 啶ぐ 啶膏啶掂た啶� 啶曕ぐ啶ㄠぞ 啶氞ぞ啶灌啶傕啷�?',
+    parentChildChunkDelimiterTip: '啶忇 啶膏啶ぞ啶傕啶� 啶ぞ啶� 啶曕 啶呧げ啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶ㄠ 啶掂ぞ啶侧ぞ 啶掂ぐ啷嵿ぃ 啶灌啷� 啶ぞ啶むぞ-啶た啶むぞ 啶曕 啶熰啶曕ぁ啶监啶� 啶曕 啶涏啶熰 啶啷嵿啷� 啶曕 啶熰啶曕ぁ啶监啶� 啶啶� 啶掂た啶ぞ啶溹た啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� \\n 啶曕 啶膏た啶ぞ啶班た啶� 啶曕 啶溹ぞ啶む 啶灌啷� 啶嗋お 啶膏啶掂く啶� 啶︵啶掂ぞ啶班ぞ 啶ぐ啶苦き啶距し啶苦い 啶掂た啶多啶� 啶膏啶ぞ啶傕啶� 啶曕ぞ 啶 啶夃お啶啶� 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+    childChunkForRetrieval: '啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶曕 啶侧た啶� 啶ぞ啶�-啶栢啶�',
+    switch: '啶膏啶掂た啶�',
+    parentChildDelimiterTip: '啶忇 啶膏啶ぞ啶傕啶� 啶ぞ啶� 啶曕 啶呧げ啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶ㄠ 啶掂ぞ啶侧ぞ 啶掂ぐ啷嵿ぃ 啶灌啷� \\n\\n 啶啶� 啶︵じ啷嵿い啶距さ啷囙啶� 啶曕 啶ぁ啶监 啶啶班啶傕 啶掂た啶栢啶∴ 啶啶� 啶掂た啶ぞ啶溹た啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶呧え啷佮ざ啶傕じ啶苦い 啶灌啷� 啶嗋お 啶膏啶掂く啶� 啶︵啶掂ぞ啶班ぞ 啶ぐ啶苦き啶距し啶苦い 啶掂た啶多啶� 啶膏啶ぞ啶傕啶� 啶曕ぞ 啶 啶夃お啶啶� 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+    notAvailableForParentChild: '啶啶班啶傕-啶氞ぞ啶囙げ啷嵿ぁ 啶囙啶∴啶曕啶� 啶曕 啶侧た啶� 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶灌',
+    parentChild: '啶ぞ啶むぞ-啶た啶むぞ 啶曕ぞ 啶啷嵿啶�',
+    parentChildTip: '啶啶班啶傕-啶氞ぞ啶囙げ啷嵿ぁ 啶啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶む 啶膏ぎ啶�, 啶氞ぞ啶囙げ啷嵿ぁ-啶氞啶� 啶曕ぞ 啶夃お啶啶� 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶曕 啶侧た啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌 啶斷ぐ 啶啶班啶傕-啶氞啶� 啶曕ぞ 啶夃お啶啶� 啶膏啶︵ぐ啷嵿き 啶曕 啶班啶� 啶啶� 啶班た啶曕啶� 啶曕 啶侧た啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷�',
+    paragraphTip: '啶す 啶啶� 啶ぞ啶� 啶曕 啶膏啶ぞ啶傕啶� 啶斷ぐ 啶呧ぇ啶苦啶むぎ 啶栢啶� 啶侧啶ぞ啶� 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶啶班ぞ啶椸啶班ぞ啶� 啶啶� 啶掂た啶ぞ啶溹た啶� 啶曕ぐ啶むぞ 啶灌, 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶曕 啶侧た啶� 啶啶� 啶栢啶� 啶曕 啶班啶� 啶啶� 啶掂た啶ぞ啶溹た啶� 啶ぞ啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶むぞ 啶灌啷�',
+  },
+  stepThree: {
+    creationTitle: '馃帀 啶溹啶炧ぞ啶� 啶え啶距く啶� 啶椸く啶�',
+    creationContent:
+      '啶灌ぎ啶ㄠ 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶溹啶炧ぞ啶� 啶曕ぞ 啶ㄠぞ啶� 啶班啶� 啶灌, 啶嗋お 啶囙じ啷� 啶曕た啶膏 啶 啶膏ぎ啶� 啶膏啶多啶оた啶� 啶曕ぐ 啶膏啶む 啶灌啶�',
+    label: '啶溹啶炧ぞ啶� 啶曕ぞ 啶ㄠぞ啶�',
+    additionTitle: '馃帀 啶︵じ啷嵿い啶距さ啷囙啶� 啶呧お啶侧啶� 啶曕た啶ぞ 啶椸く啶�',
+    additionP1: '啶︵じ啷嵿い啶距さ啷囙啶� 啶溹啶炧ぞ啶� 啶啶� 啶呧お啶侧啶� 啶曕た啶ぞ 啶椸く啶� 啶灌',
+    additionP2: ', 啶嗋お 啶囙じ啷� 啶溹啶炧ぞ啶� 啶曕 啶︵じ啷嵿い啶距さ啷囙啶� 啶膏啶氞 啶啶� 啶ぞ 啶膏啶む 啶灌啶傕イ',
+    stop: '啶啶班じ啶傕じ啷嵿啶班ぃ 啶班啶曕啶�',
+    resume: '啶啶班じ啶傕じ啷嵿啶班ぃ 啶た啶� 啶膏 啶多啶班 啶曕ぐ啷囙',
+    navTo: '啶︵じ啷嵿い啶距さ啷囙啶� 啶ぐ 啶溹ぞ啶忇',
+    sideTipTitle: '啶嗋啷� 啶曕啶ぞ 啶曕ぐ啶ㄠぞ 啶灌',
+    sideTipContent:
+      '啶︵じ啷嵿い啶距さ啷囙啶� 啶曕 啶囙啶∴啶曕啶� 啶曕ぐ啶ㄠ 啶曕 啶ぞ啶�, 啶溹啶炧ぞ啶� 啶曕 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶啶� 啶膏啶︵ぐ啷嵿き 啶曕 啶班啶� 啶啶� 啶忇啷�啶曕啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌, 啶嗋お 啶膏啶︵ぐ啷嵿き 啶膏啶熰た啶傕 啶曕 啶啶班啶啶啶� 啶戉ぐ啷嵿啷囙じ啷嵿啷嵿ぐ啷囙ざ啶� 啶啶粪啶� 啶ぐ 啶ぞ 啶膏啶む 啶灌啶傕イ 啶嗋お 啶囙じ啷� 啶班た啶侧啶溹ぜ 啶曕 啶侧た啶� 啶忇 啶膏啶掂い啶傕い啷嵿ぐ ChatGPT 啶囙啶∴啶曕啶膏た啶傕 啶啶侧啶囙え 啶曕 啶班啶� 啶啶� 啶 啶え啶� 啶膏啶む 啶灌啶傕イ',
+    modelTitle: '啶曕啶ぞ 啶嗋お 啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶曕 啶班啶曕え啷� 啶曕 啶侧た啶� 啶膏啶ㄠた啶多啶氞た啶� 啶灌啶�?',
+    modelContent:
+      '啶う啶� 啶嗋お啶曕 啶ぞ啶� 啶啶� 啶た啶� 啶膏 啶啶班じ啶傕じ啷嵿啶班ぃ 啶曕ぐ啶ㄠ 啶曕 啶嗋さ啶多啶啶むぞ 啶灌, 啶む 啶嗋お 啶溹す啶距 啶膏 啶涏啶∴ぜ啷� 啶ム 啶掂す啷�啶� 啶膏 啶溹ぞ啶班 啶班啷囙啶椸啷�',
+    modelButtonConfirm: '啶啶粪啶熰た 啶曕ぐ啷囙',
+    modelButtonCancel: '啶班う啷嵿う 啶曕ぐ啷囙',
+  },
+  jinaReader: {
+    configJinaReader: '啶溹啶ㄠぞ 啶班啶∴ぐ 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+    apiKeyPlaceholder: 'jina.ai 啶膏 啶忇お啷�啶嗋 啶曕啶傕啷�',
+    getApiKeyLinkText: 'jina.ai 啶ぐ 啶呧お啶ㄠ 啶ㄠた啶冟ざ啷佮げ啷嵿 啶忇お啷�啶嗋 啶曕啶傕啷� 啶啶班ぞ啶啶� 啶曕ぐ啷囙',
+  },
+  otherDataSource: {
+    title: '啶呧え啷嵿く 啶∴啶熰ぞ 啶膏啶班啶む啶� 啶膏 啶曕え啷囙啷嵿 啶曕ぐ啷囙?',
+    learnMore: '啶斷ぐ 啶溹ぞ啶ㄠ',
+    description: '啶掂ぐ啷嵿い啶ぞ啶� 啶啶�, Dify 啶曕 啶溹啶炧ぞ啶ㄠ啷嬥し 啶啶� 啶曕啶掂げ 啶膏啶た啶� 啶∴啶熰ぞ 啶膏啶班啶� 啶灌啶傕イ Dify 啶ㄠ啶侧啶� 啶啶� 啶啶� 啶∴啶熰ぞ 啶膏啶班啶� 啶曕ぞ 啶啶椸う啶距え 啶曕ぐ啶ㄠぞ 啶膏き啷� 啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶侧た啶� 啶啶侧啶熰か啷夃ぐ啷嵿ぎ 啶曕 啶侧啷�啶侧啶え 啶斷ぐ 啶多啷嵿い啶� 啶曕 啶あ啶监ぞ啶ㄠ 啶啶� 啶う啶� 啶曕ぐ啶ㄠ 啶曕ぞ 啶忇 啶多ぞ啶ㄠう啶距ぐ 啶むぐ啷�啶曕ぞ 啶灌啷� 啶灌ぎ啶距ぐ啷� 啶啶椸う啶距え 啶ぞ啶班啶椸う啶班啶多た啶曕ぞ 啶嗋ぐ啶傕き 啶曕ぐ啶ㄠぞ 啶嗋じ啶距え 啶え啶距い啷� 啶灌啷� 啶呧ぇ啶苦 啶溹ぞ啶ㄠえ啷� 啶曕 啶侧た啶� 啶曕啶く啶� 啶ㄠ啶氞 啶︵た啶� 啶椸 啶侧た啶傕 啶ぐ 啶曕啶侧た啶� 啶曕ぐ啷囙啷�',
+  },
+  watercrawl: {
+    apiKeyPlaceholder: 'watercrawl.dev 啶膏 API 啶曕啶傕啷�',
+    configWatercrawl: '啶掂ぞ啶熰ぐ啶曕啶班啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+    getApiKeyLinkText: 'watercrawl.dev 啶膏 啶呧お啶ㄠぞ 啶忇お啷�啶嗋 啶曕啶傕啷� 啶啶班ぞ啶啶� 啶曕ぐ啷囙',
+  },
+}
+
+export default translation
diff --git a/i18n/hi-IN/dataset-documents.ts b/i18n/hi-IN/dataset-documents.ts
new file mode 100644
index 0000000..35bcb0a
--- /dev/null
+++ b/i18n/hi-IN/dataset-documents.ts
@@ -0,0 +1,396 @@
+const translation = {
+  list: {
+    title: '啶︵じ啷嵿い啶距さ啷囙啶�',
+    desc: '啶す啶距 啶溹啶炧ぞ啶� 啶曕 啶膏き啷� 啶ぞ啶囙げ啷囙 啶︵た啶栢ぞ啶� 啶椸 啶灌啶�, 啶斷ぐ 啶啶班 啶溹啶炧ぞ啶� 啶曕 啶∴た啶 啶膏啶︵ぐ啷嵿き啷嬥 啶膏 啶溹啶∴ぜ啶� 啶溹ぞ 啶膏啶むぞ 啶灌 啶ぞ 啶氞啶� 啶啶侧啶囙え 啶曕 啶ぞ啶о啶ぎ 啶膏 啶呧え啷佮啷嵿ぐ啶た啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌啷�',
+    addFile: '啶ぞ啶囙げ 啶溹啶∴ぜ啷囙',
+    addPages: '啶啶粪啶� 啶溹啶∴ぜ啷囙',
+    addUrl: 'URL 啶溹啶∴ぜ啷囙',
+    table: {
+      header: {
+        fileName: '啶ぞ啶囙げ 啶曕ぞ 啶ㄠぞ啶�',
+        words: '啶多が啷嵿う',
+        hitCount: '啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶椸ぃ啶ㄠぞ',
+        uploadTime: '啶呧お啶侧啶� 啶曕ぞ 啶膏ぎ啶�',
+        status: '啶膏啶ムた啶むた',
+        action: '啶曕啶班た啶ぞ',
+        chunkingMode: '啶氞啶曕た啶傕 啶啶�',
+      },
+      rename: '啶ㄠぞ啶� 啶う啶侧啶�',
+      name: '啶ㄠぞ啶�',
+    },
+    action: {
+      uploadFile: '啶ㄠ 啶ぞ啶囙げ 啶呧お啶侧啶� 啶曕ぐ啷囙',
+      settings: '啶栢啶� 啶膏啶熰た啶傕啷嵿じ',
+      addButton: '啶栢啶� 啶溹啶∴ぜ啷囙',
+      add: '啶栢啶� 啶溹啶∴ぜ啷囙',
+      batchAdd: '啶啶� 啶啶� 啶溹啶∴ぜ啷囙',
+      archive: '啶膏啶椸啶班す啷�啶� 啶曕ぐ啷囙',
+      unarchive: '啶膏啶椸啶班す 啶膏 啶ぞ啶灌ぐ 啶曕ぐ啷囙',
+      delete: '啶灌啶距啶�',
+      enableWarning: '啶膏啶椸啶班す啶苦い 啶ぞ啶囙げ 啶曕 啶膏啷嵿ぐ啶苦く 啶ㄠす啷�啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ',
+      sync: '啶膏た啶傕啷嵿ぐ啷嬥え啶距啶溹ぜ 啶曕ぐ啷囙',
+    },
+    index: {
+      enable: '啶膏啷嵿ぐ啶苦く 啶曕ぐ啷囙',
+      disable: '啶ㄠた啶粪啶曕啶班た啶� 啶曕ぐ啷囙',
+      all: '啶膏き啷�',
+      enableTip: '啶ぞ啶囙げ 啶曕 啶呧え啷佮啷嵿ぐ啶た啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌',
+      disableTip: '啶ぞ啶囙げ 啶曕 啶呧え啷佮啷嵿ぐ啶た啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ',
+    },
+    status: {
+      queuing: '啶啶曕啶むた啶う啷嵿ぇ',
+      indexing: '啶呧え啷佮啷嵿ぐ啶ぃ',
+      paused: '啶班啶曕ぞ 啶灌啶�',
+      error: '啶む啶班啶熰た',
+      available: '啶夃お啶侧が啷嵿ぇ',
+      enabled: '啶膏啷嵿ぐ啶苦く',
+      disabled: '啶ㄠた啶粪啶曕啶班た啶�',
+      archived: '啶膏啶椸啶班す啶苦い',
+    },
+    empty: {
+      title: '啶呧き啷� 啶む 啶曕啶� 啶︵じ啷嵿い啶距さ啷囙啶� 啶ㄠす啷�啶� 啶灌',
+      upload: {
+        tip: '啶嗋お 啶ぞ啶囙げ啷囙 啶呧お啶侧啶� 啶曕ぐ 啶膏啶む 啶灌啶�, 啶掂啶じ啶距啶� 啶膏, 啶ぞ 啶掂啶� 啶愢お啷嵿じ 啶溹啶膏 啶曕 啶ㄠ啶多え, 啶椸た啶熰す啶� 啶嗋う啶� 啶膏 啶膏た啶傕啷嵿ぐ啷嬥え啶距啶溹ぜ 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+      },
+      sync: {
+        tip: '啶∴た啶 啶嗋お啶曕 啶ㄠ啶多え 啶膏 啶ㄠた啶ぎ啶苦い 啶班啶� 啶膏 啶ぞ啶囙げ啷囙 啶∴ぞ啶夃え啶侧啶� 啶曕ぐ啷囙啶� 啶斷ぐ 啶啶班じ啶傕じ啷嵿啶班ぃ 啶啶班ぞ 啶曕ぐ啷囙啶距イ',
+      },
+    },
+    delete: {
+      title: '啶曕啶ぞ 啶嗋お 啶膏啶ㄠた啶多啶氞た啶� 啶灌啶� 啶た啶熰ぞ啶ㄠぞ?',
+      content:
+        '啶う啶� 啶嗋お 啶ぞ啶� 啶啶� 啶啶班じ啶傕じ啷嵿啶班ぃ 啶た啶� 啶膏 啶多啶班 啶曕ぐ啶ㄠぞ 啶氞ぞ啶灌い啷� 啶灌啶�, 啶む 啶嗋お 啶掂す啷�啶� 啶膏 啶多啶班 啶曕ぐ啷囙啶椸 啶溹す啶距 啶嗋お啶ㄠ 啶涏啶∴ぜ啶� 啶ムぞ',
+    },
+    batchModal: {
+      title: '啶栢啶� 啶溹啶∴ぜ啶ㄠ 啶曕 啶侧た啶� 啶啶�',
+      csvUploadTitle: '啶呧お啶ㄠ CSV 啶ぞ啶囙げ 啶す啶距 啶栢啶傕啷囙 啶斷ぐ 啶涏啶∴ぜ啷囙, 啶ぞ ',
+      browse: '啶啶班ぞ啶夃啶� 啶曕ぐ啷囙',
+      tip: 'CSV 啶ぞ啶囙げ 啶ㄠた啶啶ㄠげ啶苦啶苦い 啶膏啶班啶ㄠぞ 啶曕ぞ 啶呧え啷佮じ啶班ぃ 啶曕ぐ啶ㄠ 啶氞ぞ啶灌た啶�:',
+      question: '啶啶班ざ啷嵿え',
+      answer: '啶夃い啷嵿い啶�',
+      contentTitle: '啶栢啶� 啶膏ぞ啶啷嵿ぐ啷�',
+      content: '啶膏ぞ啶啷嵿ぐ啷�',
+      template: '啶熰啶啶げ啷囙 啶す啶距 啶∴ぞ啶夃え啶侧啶� 啶曕ぐ啷囙',
+      cancel: '啶班う啷嵿う 啶曕ぐ啷囙',
+      run: '啶啶� 啶氞げ啶距啶�',
+      runError: '啶啶� 啶氞げ啶距え啷� 啶啶� 啶掂た啶げ',
+      processing: '啶啶� 啶啶班じ啶傕じ啷嵿啶班ぃ 啶啶�',
+      completed: '啶嗋く啶距い 啶啶班ぞ 啶灌啶�',
+      error: '啶嗋く啶距い 啶む啶班啶熰た',
+      ok: '啶犩啶� 啶灌',
+    },
+    learnMore: '啶斷ぐ 啶溹ぞ啶ㄠ',
+  },
+  metadata: {
+    title: '啶啶熰ぞ啶∴啶熰ぞ',
+    desc: '啶︵じ啷嵿い啶距さ啷囙啷嬥 啶曕 啶侧た啶� 啶啶熰ぞ啶∴啶熰ぞ 啶侧啶げ啶苦啶� 啶膏 AI 啶曕 啶膏ぎ啶� 啶ぐ 啶夃え 啶む 啶す啷佮啶氞え啷� 啶啶� 啶う啶� 啶た啶侧い啷� 啶灌 啶斷ぐ 啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶侧た啶� 啶膏啶︵ぐ啷嵿き啷嬥 啶曕ぞ 啶膏啶班啶� 啶啶班う啶班啶多た啶� 啶灌啶むぞ 啶灌啷�',
+    dateTimeFormat: 'MMMM D, YYYY hh:mm A',
+    docTypeSelectTitle: '啶曕啶く啶� 啶︵じ啷嵿い啶距さ啷囙啶� 啶啶班啶距ぐ 啶氞啶ㄠ啶�',
+    docTypeChangeTitle: '啶︵じ啷嵿い啶距さ啷囙啶� 啶啶班啶距ぐ 啶う啶侧啶�',
+    docTypeSelectWarning:
+      '啶う啶� 啶︵じ啷嵿い啶距さ啷囙啶� 啶啶班啶距ぐ 啶う啶侧ぞ 啶溹ぞ啶むぞ 啶灌, 啶む 啶呧が 啶ぐ啷� 啶椸 啶啶熰ぞ啶∴啶熰ぞ 啶膏啶班啷嵿し啶苦い 啶ㄠす啷�啶� 啶班す啷囙啷�',
+    firstMetaAction: '啶氞げ啶苦 啶多啶班 啶曕ぐ啶む 啶灌啶�',
+    placeholder: {
+      add: '啶溹啶∴ぜ啷囙 ',
+      select: '啶氞啶ㄠ啶� ',
+    },
+    source: {
+      upload_file: '啶ぞ啶囙げ 啶呧お啶侧啶� 啶曕ぐ啷囙',
+      notion: '啶ㄠ啶多え 啶膏 啶膏た啶傕 啶曕ぐ啷囙',
+      github: '啶椸た啶熰す啶� 啶膏 啶膏た啶傕 啶曕ぐ啷囙',
+    },
+    type: {
+      book: '啶啶膏啶む',
+      webPage: '啶掂啶� 啶啶粪啶�',
+      paper: '啶啶ぐ',
+      socialMediaPost: '啶膏啶多げ 啶啶∴た啶ぞ 啶啶膏啶�',
+      personalDocument: '啶掂啶啷嵿い啶苦啶� 啶︵じ啷嵿い啶距さ啷囙啶�',
+      businessDocument: '啶掂啶ぞ啶ぞ啶班た啶� 啶︵じ啷嵿い啶距さ啷囙啶�',
+      IMChat: '啶嗋啶忇ぎ 啶氞啶�',
+      wikipediaEntry: '啶掂た啶曕た啶啶∴た啶ぞ 啶啶班さ啶苦し啷嵿啶�',
+      notion: '啶ㄠ啶多え 啶膏 啶膏た啶傕 啶曕ぐ啷囙',
+      github: '啶椸た啶熰す啶� 啶膏 啶膏た啶傕 啶曕ぐ啷囙',
+      technicalParameters: '啶む啶ㄠ啶曕 啶啶班ぞ啶啶熰ぐ',
+    },
+    field: {
+      processRule: {
+        processDoc: '啶︵じ啷嵿い啶距さ啷囙啶� 啶啶班啷嵿ぐ啶苦く啶�',
+        segmentRule: '啶栢啶� 啶ㄠた啶ぎ',
+        segmentLength: '啶栢啶∴啶� 啶曕 啶侧啶ぞ啶�',
+        processClean: '啶ぞ啶� 啶啶班啷嵿ぐ啶苦く啶� 啶膏か啶距',
+      },
+      book: {
+        title: '啶多啶班啶粪',
+        language: '啶ぞ啶粪ぞ',
+        author: '啶侧啶栢',
+        publisher: '啶啶班啶距ざ啶�',
+        publicationDate: '啶啶班啶距ざ啶� 啶むた啶ムた',
+        ISBN: 'ISBN',
+        category: '啶多啶班啶`',
+      },
+      webPage: {
+        title: '啶多啶班啶粪',
+        url: 'URL',
+        language: '啶ぞ啶粪ぞ',
+        authorPublisher: '啶侧啶栢/啶啶班啶距ざ啶�',
+        publishDate: '啶啶班啶距ざ啶� 啶むた啶ムた',
+        topicKeywords: '啶掂た啶粪く/啶曕啶掂ぐ啷嵿ぁ啷嵿じ',
+        description: '啶掂た啶掂ぐ啶�',
+      },
+      paper: {
+        title: '啶多啶班啶粪',
+        language: '啶ぞ啶粪ぞ',
+        author: '啶侧啶栢',
+        publishDate: '啶啶班啶距ざ啶� 啶むた啶ムた',
+        journalConferenceName: '啶溹ぐ啷嵿え啶�/啶膏ぎ啷嵿ぎ啷囙げ啶� 啶曕ぞ 啶ㄠぞ啶�',
+        volumeIssuePage: '啶栢啶�/啶呧啶�/啶啶粪啶�',
+        DOI: 'DOI',
+        topicsKeywords: '啶掂た啶粪く/啶曕啶掂ぐ啷嵿ぁ啷嵿じ',
+        abstract: '啶膏ぞ啶�',
+      },
+      socialMediaPost: {
+        platform: '啶啶侧啶熰か啶距ぐ啷嵿ぎ',
+        authorUsername: '啶侧啶栢/啶啶溹ぜ啶班え啷囙ぎ',
+        publishDate: '啶啶班啶距ざ啶� 啶むた啶ムた',
+        postURL: '啶啶膏啶� URL',
+        topicsTags: '啶掂た啶粪く/啶熰啶�',
+      },
+      personalDocument: {
+        title: '啶多啶班啶粪',
+        author: '啶侧啶栢',
+        creationDate: '啶ㄠた啶班啶ぞ啶� 啶むた啶ムた',
+        lastModifiedDate: '啶呧啶むた啶� 啶膏啶多啶оた啶� 啶むた啶ムた',
+        documentType: '啶︵じ啷嵿い啶距さ啷囙啶� 啶啶班啶距ぐ',
+        tagsCategory: '啶熰啶�/啶多啶班啶`',
+      },
+      businessDocument: {
+        title: '啶多啶班啶粪',
+        author: '啶侧啶栢',
+        creationDate: '啶ㄠた啶班啶ぞ啶� 啶むた啶ムた',
+        lastModifiedDate: '啶呧啶むた啶� 啶膏啶多啶оた啶� 啶むた啶ムた',
+        documentType: '啶︵じ啷嵿い啶距さ啷囙啶� 啶啶班啶距ぐ',
+        departmentTeam: '啶掂た啶ぞ啶�/啶熰啶�',
+      },
+      IMChat: {
+        chatPlatform: '啶氞啶� 啶啶侧啶熰か啷夃ぐ啷嵿ぎ',
+        chatPartiesGroupName: '啶氞啶� 啶ぞ啶班啶熰た啶ぞ啶�/啶膏ぎ啷傕す 啶曕ぞ 啶ㄠぞ啶�',
+        participants: '啶啶班い啶苦き啶距啷�',
+        startDate: '啶啶班ぞ啶班啶� 啶むた啶ムた',
+        endDate: '啶膏ぎ啶距お啷嵿い啶� 啶むた啶ムた',
+        topicsKeywords: '啶掂た啶粪く/啶曕啶掂ぐ啷嵿ぁ啷嵿じ',
+        fileType: '啶ぞ啶囙げ 啶啶班啶距ぐ',
+      },
+      wikipediaEntry: {
+        title: '啶多啶班啶粪',
+        language: '啶ぞ啶粪ぞ',
+        webpageURL: '啶掂啶お啷囙 URL',
+        editorContributor: '啶膏啶ぞ啶︵/啶啶椸う啶距え啶曕ぐ啷嵿い啶�',
+        lastEditDate: '啶呧啶むた啶� 啶膏啶ぞ啶︵え 啶むた啶ムた',
+        summaryIntroduction: '啶膏ぞ啶�/啶ぐ啶苦啶�',
+      },
+      notion: {
+        title: '啶多啶班啶粪',
+        language: '啶ぞ啶粪ぞ',
+        author: '啶侧啶栢',
+        createdTime: '啶ㄠた啶班啶た啶� 啶膏ぎ啶�',
+        lastModifiedTime: '啶呧啶むた啶� 啶膏啶多啶оた啶� 啶膏ぎ啶�',
+        url: 'URL',
+        tag: '啶熰啶�',
+        description: '啶掂た啶掂ぐ啶�',
+      },
+      github: {
+        repoName: '啶班た啶 啶ㄠぞ啶�',
+        repoDesc: '啶班た啶 啶掂た啶掂ぐ啶�',
+        repoOwner: '啶班た啶 啶ぞ啶侧た啶�',
+        fileName: '啶ぞ啶囙げ 啶曕ぞ 啶ㄠぞ啶�',
+        filePath: '啶ぞ啶囙げ 啶ぅ',
+        programmingLang: '啶啶班啶椸啶班ぞ啶た啶傕 啶ぞ啶粪ぞ',
+        url: 'URL',
+        license: '啶侧ぞ啶囙じ啷囙啶�',
+        lastCommitTime: '啶呧啶むた啶� 啶曕ぎ啶苦 啶膏ぎ啶�',
+        lastCommitAuthor: '啶呧啶むた啶� 啶曕ぎ啶苦 啶侧啶栢',
+      },
+      originInfo: {
+        originalFilename: '啶啶� 啶ぞ啶囙げ 啶曕ぞ 啶ㄠぞ啶�',
+        originalFileSize: '啶啶� 啶ぞ啶囙げ 啶曕ぞ 啶嗋啶距ぐ',
+        uploadDate: '啶呧お啶侧啶� 啶むた啶ムた',
+        lastUpdateDate: '啶呧啶むた啶� 啶呧う啷嵿く啶むえ 啶むた啶ムた',
+        source: '啶膏啶班啶�',
+      },
+      technicalParameters: {
+        segmentSpecification: '啶栢啶� 啶掂た啶ㄠた啶班啶︵啶�',
+        segmentLength: '啶栢啶∴啶� 啶曕 啶侧啶ぞ啶�',
+        avgParagraphLength: '啶斷じ啶� 啶啶班ぞ啶椸啶班ぞ啶� 啶侧啶ぞ啶�',
+        paragraphs: '啶啶班ぞ啶椸啶班ぞ啶�',
+        hitCount: '啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶椸ぃ啶ㄠぞ',
+        embeddingTime: '啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶膏ぎ啶�',
+        embeddedSpend: '啶忇ぎ啷嵿が啷囙ぁ啷囙ぁ 啶栢ぐ啷嵿',
+      },
+    },
+    languageMap: {
+      zh: '啶氞啶ㄠ',
+      en: '啶呧啶椸啶班啶溹ぜ啷�',
+      es: '啶膏啶啶ㄠた啶�',
+      fr: '啶啶班啶傕',
+      de: '啶溹ぐ啷嵿ぎ啶�',
+      ja: '啶溹ぞ啶ぞ啶ㄠ',
+      ko: '啶曕啶班た啶ぞ啶�',
+      ru: '啶班啶膏',
+      ar: '啶呧ぐ啶',
+      pt: '啶啶班啶む啶距げ啷�',
+      it: '啶囙い啶距げ啶掂',
+      nl: '啶∴',
+      pl: '啶啶侧た啶�',
+      sv: '啶膏啶掂啶∴た啶�',
+      tr: '啶む啶班啶曕',
+      he: '啶灌た啶啶班',
+      hi: '啶灌た啶傕う啷�',
+      da: '啶∴啶ㄠた啶�',
+      fi: '啶た啶ㄠた啶�',
+      no: '啶ㄠ啶班啶掂啶溹た啶え',
+      hu: '啶灌啶椸啶班た啶え',
+      el: '啶椸啶班啶�',
+      cs: '啶氞啶�',
+      th: '啶ムぞ啶�',
+      id: '啶囙啶∴啶ㄠ啶多た啶ぞ啶�',
+    },
+    categoryMap: {
+      book: {
+        fiction: '啶曕ぞ啶侧啶え啶苦',
+        biography: '啶溹啶掂え啷�',
+        history: '啶囙い啶苦す啶距じ',
+        science: '啶掂た啶溹啶炧ぞ啶�',
+        technology: '啶啶班啶︵啶啶椸た啶曕',
+        education: '啶多た啶曕啶粪ぞ',
+        philosophy: '啶︵ぐ啷嵿ざ啶�',
+        religion: '啶оぐ啷嵿ぎ',
+        socialSciences: '啶膏ぞ啶ぞ啶溹た啶� 啶掂た啶溹啶炧ぞ啶�',
+        art: '啶曕げ啶�',
+        travel: '啶ぞ啶む啶班ぞ',
+        health: '啶膏啶掂ぞ啶膏啶ム啶�',
+        selfHelp: '啶嗋い啷嵿ぎ-啶膏す啶距く啶むぞ',
+        businessEconomics: '啶掂啶ぞ啶ぞ啶� 啶呧ぐ啷嵿ぅ啶多ぞ啶膏啶む啶�',
+        cooking: '啶栢ぞ啶ㄠぞ 啶啶距え啶�',
+        childrenYoungAdults: '啶啷嵿啷� 啶斷ぐ 啶啶掂ぞ 啶掂く啶膏啶�',
+        comicsGraphicNovels: '啶曕啶た啶曕啶� 啶斷ぐ 啶椸啶班ぞ啶た啶� 啶夃お啶ㄠ啶ぞ啶�',
+        poetry: '啶曕さ啶苦い啶�',
+        drama: '啶ㄠぞ啶熰',
+        other: '啶呧え啷嵿く',
+      },
+      personalDoc: {
+        notes: '啶ㄠ啶熰啶�',
+        blogDraft: '啶啶侧啶� 啶∴啶班ぞ啶啶�',
+        diary: '啶∴ぞ啶ぐ啷�',
+        researchReport: '啶呧え啷佮じ啶傕ぇ啶距え 啶班た啶啶班啶�',
+        bookExcerpt: '啶啶膏啶む 啶呧啶�',
+        schedule: '啶呧え啷佮じ啷傕啷�',
+        list: '啶膏啶氞',
+        projectOverview: '啶ぐ啶苦く啷嬥啶ㄠぞ 啶呧さ啶侧啶曕え',
+        photoCollection: '啶啶熰 啶膏啶椸啶班す',
+        creativeWriting: '啶班啶ㄠぞ啶む啶 啶侧啶栢え',
+        codeSnippet: '啶曕啶� 啶膏啶ㄠた啶啶�',
+        designDraft: '啶∴た啶溹ぜ啶距啶� 啶∴啶班ぞ啶啶�',
+        personalResume: '啶掂啶啷嵿い啶苦啶� 啶班た啶溹啶啶',
+        other: '啶呧え啷嵿く',
+      },
+      businessDoc: {
+        meetingMinutes: '啶啶犩 啶曕 啶た啶ㄠ',
+        researchReport: '啶呧え啷佮じ啶傕ぇ啶距え 啶班た啶啶班啶�',
+        proposal: '啶啶班じ啷嵿い啶距さ',
+        employeeHandbook: '啶曕ぐ啷嵿ぎ啶氞ぞ啶班 啶灌啶傕ぁ啶啶�',
+        trainingMaterials: '啶啶班ざ啶苦啷嵿し啶� 啶膏ぞ啶啷嵿ぐ啷�',
+        requirementsDocument: '啶嗋さ啶多啶啶むぞ 啶︵じ啷嵿い啶距さ啷囙啶�',
+        designDocument: '啶∴た啶溹ぜ啶距啶� 啶︵じ啷嵿い啶距さ啷囙啶�',
+        productSpecification: '啶夃い啷嵿お啶距う 啶掂た啶ㄠた啶班啶︵啶�',
+        financialReport: '啶掂た啶む啶む啶� 啶班た啶啶班啶�',
+        marketAnalysis: '啶ぞ啶溹ぞ啶� 啶掂た啶多啶侧啶粪ぃ',
+        projectPlan: '啶ぐ啶苦く啷嬥啶ㄠぞ 啶啶溹え啶�',
+        teamStructure: '啶熰啶� 啶膏啶班啶ㄠぞ',
+        policiesProcedures: '啶ㄠ啶むた啶ぞ啶� 啶斷ぐ 啶啶班啷嵿ぐ啶苦く啶距啶�',
+        contractsAgreements: '啶呧え啷佮が啶傕ぇ 啶斷ぐ 啶膏ぎ啶澿啶む',
+        emailCorrespondence: '啶堗ぎ啷囙げ 啶い啷嵿ぐ啶距啶距ぐ',
+        other: '啶呧え啷嵿く',
+      },
+    },
+  },
+  embedding: {
+    processing: '啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶啶班啷嵿ぐ啶苦く啶�...',
+    paused: '啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶班啶曕 啶灌啶�',
+    completed: '啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶啶班 啶灌 啶椸',
+    error: '啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶む啶班啶熰た',
+    docName: '啶啶班じ啶傕じ啷嵿啶班ぃ 啶︵じ啷嵿い啶距さ啷囙啶�',
+    mode: '啶栢啶∴啶曕ぐ啶� 啶ㄠた啶ぎ',
+    segmentLength: '啶栢啶∴啶� 啶曕 啶侧啶ぞ啶�',
+    textCleaning: '啶ぞ啶� 啶啶班啶�-啶ぐ啶苦き啶距し啶� 啶斷ぐ 啶膏か啶距',
+    segments: '啶啶班ぞ啶椸啶班ぞ啶�',
+    highQuality: '啶夃啷嵿 啶椸啶`さ啶む啶むぞ 啶啶�',
+    economy: '啶呧ぐ啷嵿ぅ啶掂啶さ啶膏啶ムぞ 啶啶�',
+    estimate: '啶呧え啷佮ぎ啶距え啶苦い 啶夃お啶啶�',
+    stop: '啶啶班啷嵿ぐ啶苦く啶� 啶班啶曕啶�',
+    resume: '啶啶班啷嵿ぐ啶苦く啶� 啶た啶� 啶膏 啶多啶班 啶曕ぐ啷囙',
+    automatic: '啶膏啶掂啶距げ啶苦い',
+    custom: '啶呧え啷佮啷傕げ啶苦い',
+    previewTip: '啶啶班ぞ啶椸啶班ぞ啶� 啶啶班啶掂ぞ啶掂げ啷嬥啶� 啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶啶班 啶灌啶ㄠ 啶曕 啶ぞ啶� 啶夃お啶侧が啷嵿ぇ 啶灌啶椸ぞ',
+    parentMaxTokens: '啶溹え啶�',
+    pause: '啶班啶曕え啶�',
+    hierarchical: '啶ぞ啶むぞ-啶た啶むぞ 啶曕ぞ 啶啷嵿啶�',
+    childMaxTokens: '啶啷嵿啶�',
+  },
+  segment: {
+    paragraphs: '啶啶班ぞ啶椸啶班ぞ啶�',
+    keywords: '啶曕啶掂ぐ啷嵿ぁ',
+    addKeyWord: '啶曕啶掂ぐ啷嵿ぁ 啶溹啶∴ぜ啷囙',
+    keywordError: '啶曕啶掂ぐ啷嵿ぁ 啶曕 啶呧ぇ啶苦啶むぎ 啶侧啶ぞ啶� 20 啶呧啷嵿し啶� 啶灌 啶膏啶む 啶灌',
+    characters: '啶呧啷嵿し啶�',
+    hitCount: '啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶椸ぃ啶ㄠぞ',
+    vectorHash: '啶掂啶曕啶熰ぐ 啶灌啶�: ',
+    questionPlaceholder: '啶す啶距 啶啶班ざ啷嵿え 啶溹啶∴ぜ啷囙',
+    questionEmpty: '啶啶班ざ啷嵿え 啶栢ぞ啶侧 啶ㄠす啷�啶� 啶灌 啶膏啶むぞ',
+    answerPlaceholder: '啶す啶距 啶夃い啷嵿い啶� 啶溹啶∴ぜ啷囙',
+    answerEmpty: '啶夃い啷嵿い啶� 啶栢ぞ啶侧 啶ㄠす啷�啶� 啶灌 啶膏啶むぞ',
+    contentPlaceholder: '啶す啶距 啶膏ぞ啶啷嵿ぐ啷� 啶溹啶∴ぜ啷囙',
+    contentEmpty: '啶膏ぞ啶啷嵿ぐ啷� 啶栢ぞ啶侧 啶ㄠす啷�啶� 啶灌 啶膏啶む',
+    newTextSegment: '啶ㄠく啶� 啶ぞ啶� 啶栢啶�',
+    newQaSegment: '啶ㄠく啶� Q&A 啶栢啶�',
+    delete: '啶囙じ 啶栢啶� 啶曕 啶灌啶距啶� ?',
+    parentChunks_other: '啶溹え啶� 啶氞啶曕啶�',
+    childChunks_one: '啶氞ぞ啶囙げ啷嵿ぁ 啶氞啶�',
+    searchResults_other: '啶ぐ啶苦ぃ啶距ぎ',
+    parentChunks_one: '啶溹え啶� 啶氞啶�',
+    searchResults_one: '啶ぐ啶苦ぃ啶距ぎ',
+    addChildChunk: 'Child chunk 啶溹啶∴ぜ啷囙',
+    childChunks_other: '啶啷嵿啷� 啶曕 啶熰啶曕ぁ啶监',
+    collapseChunks: '啶氞啶曕啶� 啶膏啶曕啶粪た啶啶� 啶曕ぐ啷囙',
+    characters_one: '啶呧啷嵿し啶�',
+    childChunkAdded: '1 啶氞ぞ啶囙げ啷嵿ぁ 啶氞啶� 啶溹啶∴ぜ啶� 啶椸く啶�',
+    chunks_other: '啶灌た啶膏啶膏ぞ',
+    addAnother: '啶忇 啶斷ぐ 啶溹啶∴ぜ啷囙',
+    newChunk: '啶ㄠく啶� 啶灌た啶膏啶膏ぞ',
+    searchResults_zero: '啶ぐ啶苦ぃ啶距ぎ',
+    chunk: '啶灌た啶膏啶膏ぞ',
+    addChunk: '啶氞啶� 啶溹啶∴ぜ啷囙',
+    editChildChunk: '啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙 啶ぞ啶� 啶氞啶�',
+    editedAt: '啶ぐ 啶膏啶ぞ啶︵た啶�',
+    childChunk: '啶氞ぞ啶囙げ啷嵿ぁ-啶氞啶�',
+    parentChunk: '啶ぞ啶むぞ-啶た啶むぞ-啶氞啶�',
+    empty: '啶曕啶� 啶灌た啶膏啶膏ぞ 啶ㄠす啷�啶� 啶た啶侧ぞ',
+    editChunk: '啶氞啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+    characters_other: '啶掂ぐ啷嵿ぃ',
+    regeneratingMessage: '啶囙じ啶啶� 啶曕啶� 啶膏ぎ啶� 啶侧 啶膏啶むぞ 啶灌, 啶曕啶く啶� 啶啶班い啷�啶曕啶粪ぞ 啶曕ぐ啷囙...',
+    regenerationConfirmTitle: '啶曕啶ぞ 啶嗋お 啶啷嵿啷� 啶曕 啶熰啶曕ぁ啶监啶� 啶曕 啶啶�: 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啶ㄠぞ 啶氞ぞ啶灌い啷� 啶灌啶�?',
+    regeneratingTitle: '啶啷嵿啷� 啶曕 啶熰啶曕ぁ啶监啶� 啶曕 啶啶ㄠぐ啷嵿啷�啶掂た啶� 啶曕ぐ啶ㄠぞ',
+    chunks_one: '啶灌た啶膏啶膏ぞ',
+    edited: '啶膏啶ぞ啶︵た啶�',
+    editParentChunk: '啶啶班啶傕 啶氞啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+    newChildChunk: '啶ㄠ啶 啶氞ぞ啶囙げ啷嵿ぁ 啶氞啶�',
+    clearFilter: '啶ぜ啶苦げ啷嵿啶� 啶膏ぞ啶ぜ 啶曕ぐ啷囙',
+    regenerationSuccessMessage: '啶嗋お 啶囙じ 啶掂た啶傕ぁ啷� 啶曕 啶啶� 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+    expandChunks: '啶掂た啶栢啶∴ 啶曕ぞ 啶掂た啶膏啶むぞ啶� 啶曕ぐ啷囙',
+    regenerationSuccessTitle: '啶啶ㄠぐ啷嵿啶ㄠえ 啶啶班ぞ 啶灌啶�',
+    chunkAdded: '1 啶灌た啶膏啶膏ぞ 啶溹啶∴ぜ啶� 啶椸く啶�',
+    chunkDetail: '啶氞啶� 啶掂た啶掂ぐ啶�',
+    regenerationConfirmMessage: '啶氞ぞ啶囙げ啷嵿ぁ 啶氞啶曕啶� 啶曕 啶班啶溹え啶班啶� 啶曕ぐ啶ㄠ 啶膏 啶掂ぐ啷嵿い啶ぞ啶� 啶氞ぞ啶囙げ啷嵿ぁ 啶氞啶曕啶� 啶撪さ啶班ぐ啶距啶� 啶灌 啶溹ぞ啶忇啶椸, 啶溹た啶膏ぎ啷囙 啶膏啶ぞ啶︵た啶� 啶氞啶曕啶� 啶斷ぐ 啶ㄠ 啶溹啶∴ぜ啷� 啶椸 啶氞啶曕啶� 啶多ぞ啶た啶� 啶灌啶傕イ 啶啶ㄠぐ啷佮い啷嵿ぅ啶距え 啶曕 啶啶班啶掂さ啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌啷�',
+  },
+}
+
+export default translation
diff --git a/i18n/hi-IN/dataset-hit-testing.ts b/i18n/hi-IN/dataset-hit-testing.ts
new file mode 100644
index 0000000..fd56206
--- /dev/null
+++ b/i18n/hi-IN/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: '啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶ぐ啷�啶曕啶粪ぃ',
+  desc: '啶︵た啶� 啶椸 啶啶班ざ啷嵿え 啶ぞ啶� 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶溹啶炧ぞ啶� 啶曕 啶啶班き啶距さ啶多啶侧い啶� 啶曕ぞ 啶ぐ啷�啶曕啶粪ぃ 啶曕ぐ啷囙啷�',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  recents: '啶灌ぞ啶� 啶曕',
+  table: {
+    header: {
+      source: '啶膏啶班啶�',
+      text: '啶ぞ啶�',
+      time: '啶膏ぎ啶�',
+    },
+  },
+  input: {
+    title: '啶膏啶班啶� 啶ぞ啶�',
+    placeholder: '啶曕啶く啶� 啶忇 啶ぞ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙, 啶忇 啶涏啶熰ぞ 啶掂ぞ啶曕啶ぞ啶傕ざ 啶膏啶澿ぞ啶ぞ 啶椸く啶� 啶灌啷�',
+    countWarning: '啶呧ぇ啶苦啶むぎ 200 啶呧啷嵿し啶班イ',
+    indexWarning: '啶曕啶掂げ 啶夃啷嵿 啶椸啶`さ啶む啶むぞ 啶掂ぞ啶侧ぞ 啶溹啶炧ぞ啶ㄠイ',
+    testing: '啶ぐ啷�啶曕啶粪ぃ 啶曕ぐ 啶班す啶� 啶灌',
+  },
+  hit: {
+    title: '啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶呧え啷佮啷嵿啷囙う',
+    emptyTip: '啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶ぐ啷�啶曕啶粪ぃ 啶曕 啶ぐ啶苦ぃ啶距ぎ 啶す啶距 啶︵た啶栢ぞ啶� 啶︵啶傕啷�',
+  },
+  noRecentTip: '啶す啶距 啶曕啶� 啶灌ぞ啶� 啶曕 啶啶班ざ啷嵿え 啶ぐ啶苦ぃ啶距ぎ 啶ㄠす啷�啶� 啶灌啶�',
+  viewChart: '啶掂啶曕啶熰ぐ 啶氞ぞ啶班啶� 啶︵啶栢啶�',
+  viewDetail: '啶掂た啶膏啶むぞ啶� 啶膏 啶︵啶栢啶�',
+  settingTitle: '啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶膏啶熰た啶傕',
+  hitChunks: '{{num}} 啶啷嵿啷� 啶曕 啶熰啶曕ぁ啶监 啶ぞ啶班',
+  keyword: '啶栢啶溹ざ啶啶︵啶�',
+  chunkDetail: '啶氞啶� 啶掂た啶掂ぐ啶�',
+  open: '啶栢啶侧え啶�',
+  records: '啶班た啶曕啶班啶�',
+}
+
+export default translation
diff --git a/i18n/hi-IN/dataset-settings.ts b/i18n/hi-IN/dataset-settings.ts
new file mode 100644
index 0000000..c89097d
--- /dev/null
+++ b/i18n/hi-IN/dataset-settings.ts
@@ -0,0 +1,48 @@
+const translation = {
+  title: '啶溹啶炧ぞ啶� 啶膏啶熰た啶傕啷嵿',
+  desc: '啶す啶距 啶嗋お 啶溹啶炧ぞ啶� 啶曕 啶膏啶い啷嵿い啶� 啶斷ぐ 啶曕ぞ啶班啶� 啶啶班啷嵿ぐ啶苦く啶距啶� 啶曕 modify 啶曕ぐ 啶膏啶む 啶灌啶傘��',
+  form: {
+    name: '啶溹啶炧ぞ啶� 啶ㄠぞ啶�',
+    namePlaceholder: '啶曕啶く啶� 啶溹啶炧ぞ啶� 啶ㄠぞ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    nameError: '啶ㄠぞ啶� 啶班た啶曕啶� 啶ㄠす啷�啶� 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶�',
+    desc: '啶溹啶炧ぞ啶� 啶掂た啶掂ぐ啶�',
+    descInfo:
+      '啶曕啶く啶� 啶膏啶し啷嵿 啶膏ぞ啶曕啶粪ぐ 啶掂た啶掂ぐ啶� 啶侧た啶栢啶� 啶溹た啶膏じ啷� AI 啶曕 啶溹啶炧ぞ啶� 啶曕 啶ㄠた啶灌た啶むぞ啶班啶ム啶� 啶曕 啶す啶氞ぞ啶� 啶曕ぐ啶ㄠ 啶啶� 啶う啶� 啶た啶侧啷� 啶う啶� 啶多啶ㄠ啶� 啶灌, Dify 啶嗋お啶曕 啶啶班啶掂ぞ啶ㄠ啶ぞ啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙啶距イ',
+    descPlaceholder:
+      '啶囙じ 啶溹啶炧ぞ啶� 啶曕 啶膏ぞ啶啷嵿ぐ啶苦く啶距 啶曕啶ぞ 啶灌啶�? 啶忇 啶掂た啶膏啶む啶� 啶掂た啶掂ぐ啶� 啶曕 AI 啶曕 啶ㄠた啶灌た啶むぞ啶班啶ム啶� 啶曕 啶す啶氞ぞ啶� 啶曕ぐ啶ㄠ 啶啶� 啶う啶� 啶た啶侧啷� 啶う啶� 啶多啶ㄠ啶� 啶灌, Dify 啶嗋お啶曕 啶啶班啶掂ぞ啶ㄠ啶ぞ啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙啶距イ',
+    descWrite: '啶曕啶膏 啶呧啷嵿啶� 啶溹啶炧ぞ啶� 啶掂た啶掂ぐ啶� 啶侧た啶栢え啶� 啶灌?',
+    permissions: '啶呧え啷佮ぎ啶むた啶ぞ啶�',
+    permissionsOnlyMe: '啶啶班 啶侧た啶� 啶灌',
+    permissionsAllMember: '啶膏き啷� 啶熰啶� 啶膏う啶膏啶啶� 啶曕 啶侧た啶�',
+    indexMethod: '啶膏啶氞啶曕ぐ啶� 啶啶班啷嵿ぐ啶苦く啶�',
+    indexMethodHighQuality: ' 啶夃啷嵿 啶椸啶`さ啶む啶むぞ',
+    indexMethodHighQualityTip:
+      '啶夃お啶啶椸啶班啶むぞ 啶曕 啶啶班ざ啷嵿え啷嬥 啶曕 啶膏ぎ啶� 啶夃啷嵿 啶膏啷�啶曕い啶� 啶啶班う啶距え 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� Embedding 啶啶∴げ 啶曕 啶啶班啶膏啶膏た啶傕 啶曕 啶侧た啶� 啶曕啶� 啶曕ぐ啷囙啷�',
+    indexMethodEconomy: '啶嗋ぐ啷嵿ぅ啶苦',
+    indexMethodEconomyTip:
+      '啶戉か啶监げ啶距啶� 啶掂啶曕啶熰ぐ 啶囙啶溹え, 啶曕啶掂ぐ啷嵿ぁ 啶囙啶∴啶曕啶� 啶嗋う啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙 啶むぞ啶曕た 啶熰啶曕え啷嬥 啶曕 啶啶� 啶灌啷�',
+    embeddingModel: '啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶啶∴げ',
+    embeddingModelTip: '啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶啶∴げ 啶曕 啶う啶侧啶�, 啶曕啶く啶� ',
+    embeddingModelTipLink: '啶膏啶熰た啶傕啷嵿',
+    retrievalSetting: {
+      title: '啶啶班ぞ啶啶むた 啶膏啶熰た啶傕啷嵿',
+      learnMore: '啶斷ぐ 啶呧ぇ啶苦 啶膏啶栢え啶�',
+      description: '啶啶班ぞ啶啶むた 啶う啷嵿ぇ啶むた 啶曕 啶ぞ啶班 啶啶傘��',
+      longDescription:
+        '啶啶班ぞ啶啶むた 啶う啷嵿ぇ啶むた 啶曕 啶ぞ啶班 啶啶�, 啶嗋お 啶囙じ啷� 啶曕た啶膏 啶 啶膏ぎ啶� 啶溹啶炧ぞ啶� 啶膏啶熰た啶傕啷嵿 啶啶� 啶う啶� 啶膏啶む 啶灌啶傕イ',
+      method: '啶啶班ぞ啶啶むた 啶掂た啶оた',
+    },
+    save: '啶膏啶掂え啶�',
+    me: '(啶嗋お)',
+    permissionsInvitedMembers: '啶嗋啶多た啶� 啶熰啶� 啶曕 啶膏う啶膏啶�',
+    externalKnowledgeID: '啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶� ID',
+    externalKnowledgeAPI: '啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶� 啶忇お啷�啶嗋',
+    retrievalSettings: '啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶膏啶熰た啶傕啷嵿じ',
+    indexMethodChangeToEconomyDisabledTip: '啶啶栢啶ぞ啶侧く 啶膏 啶堗じ啷�啶� 啶啶� 啶∴ぞ啶夃え啶椸啶班啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶灌',
+    helpText: '啶忇 啶呧啷嵿啶� 啶∴啶熰ぞ啶膏啶� 啶掂た啶掂ぐ啶� 啶侧た啶栢え啶� 啶膏啶栢啶傕イ',
+    upgradeHighQualityTip: '啶忇 啶ぞ啶� 啶夃啷嵿 啶椸啶`さ啶む啶むぞ 啶啶� 啶啶� 啶呧お啶椸啶班啶� 啶曕ぐ啶ㄠ 啶曕 啶ぞ啶�, 啶曕た啶ぞ啶い啷� 啶啶� 啶啶� 啶掂ぞ啶じ 啶溹ぞ啶ㄠぞ 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶灌',
+    searchModel: '啶啶∴げ 啶栢啶溹啶�',
+  },
+}
+
+export default translation
diff --git a/i18n/hi-IN/dataset.ts b/i18n/hi-IN/dataset.ts
new file mode 100644
index 0000000..9be333c
--- /dev/null
+++ b/i18n/hi-IN/dataset.ts
@@ -0,0 +1,228 @@
+const translation = {
+  knowledge: '啶溹啶炧ぞ啶�',
+  documentCount: ' 啶︵じ啷嵿い啶距さ啷囙啶�',
+  wordCount: ' 啶曕 啶多が啷嵿う',
+  appCount: ' 啶溹啶∴ぜ啷� 啶灌啶� 啶愢お啷嵿じ',
+  createDataset: '啶溹啶炧ぞ啶� 啶え啶距啶�',
+  createDatasetIntro:
+    '啶呧お啶ㄠぞ 啶栢啶� 啶曕ぞ 啶熰啶曕啶膏啶� 啶∴啶熰ぞ 啶嗋く啶距い 啶曕ぐ啷囙 啶ぞ 啶忇げ啶忇げ啶忇ぎ 啶膏啶︵ぐ啷嵿き 啶掂啶︵啶оた 啶曕 啶侧た啶� 啶掂啶す啷佮 啶曕 啶ぞ啶о啶ぎ 啶膏 啶掂ぞ啶膏啶むさ啶苦 啶膏ぎ啶� 啶啶� 啶∴啶熰ぞ 啶侧た啶栢啶傕イ',
+  deleteDatasetConfirmTitle: '啶曕啶ぞ 啶嗋お 啶す 啶溹啶炧ぞ啶� 啶灌啶距え啶� 啶氞ぞ啶灌い啷� 啶灌啶�?',
+  deleteDatasetConfirmContent:
+    '啶溹啶炧ぞ啶� 啶曕 啶灌啶距え啶� 啶呧お啶班た啶掂ぐ啷嵿い啶ㄠ啶� 啶灌啷� 啶夃お啶啶椸啶班啶むぞ 啶呧が 啶嗋お啶曕 啶溹啶炧ぞ啶� 啶曕 啶啶班ぞ啶啶� 啶ㄠす啷�啶� 啶曕ぐ 啶ぞ啶忇啶椸, 啶斷ぐ 啶膏き啷� 啶啶班啶啶啶� 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶斷ぐ 啶侧啶� 啶膏啶ムぞ啶 啶班啶� 啶膏 啶た啶熰ぞ 啶︵た啶� 啶溹ぞ啶忇啶椸啷�',
+  datasetUsedByApp: '啶す 啶溹啶炧ぞ啶� 啶曕啶� 啶愢お啷嵿じ 啶︵啶掂ぞ啶班ぞ 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ 啶班す啶� 啶灌啷� 啶愢お啷嵿じ 啶呧が 啶囙じ 啶溹啶炧ぞ啶� 啶曕ぞ 啶夃お啶啶� 啶ㄠす啷�啶� 啶曕ぐ 啶ぞ啶忇啶椸, 啶斷ぐ 啶膏き啷� 啶啶班啶啶啶� 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶斷ぐ 啶侧啶� 啶膏啶ムぞ啶 啶班啶� 啶膏 啶灌啶� 啶︵た啶� 啶溹ぞ啶忇啶椸啷�',
+  datasetDeleted: '啶溹啶炧ぞ啶� 啶灌啶� 啶︵た啶ぞ 啶椸く啶�',
+  datasetDeleteFailed: '啶溹啶炧ぞ啶� 啶灌啶距え啷� 啶啶� 啶掂た啶げ',
+  didYouKnow: '啶曕啶ぞ 啶嗋お 啶溹ぞ啶ㄠい啷� 啶灌啶�?',
+  intro1: '啶溹啶炧ぞ啶� 啶曕 Dify 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶啶� ',
+  intro2: '啶忇 啶膏啶︵ぐ啷嵿き 啶曕 啶班啶� 啶啶� ',
+  intro3: ',',
+  intro4: '啶ぞ 啶す ',
+  intro5: '啶え啶距く啶� 啶溹ぞ 啶膏啶むぞ 啶灌',
+  intro6:
+    ' 啶忇 啶膏啶掂い啶傕い啷嵿ぐ ChatGPT 啶囙啶∴啶曕啶� 啶啶侧-啶囙え 啶曕 啶班啶� 啶啶� 啶啶班啶距ざ啶苦い 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�',
+  unavailable: '啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶�',
+  unavailableTip:
+    '啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶啶∴げ 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶灌, 啶∴た啶ぜ啷夃げ啷嵿 啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶啶∴げ 啶曕 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕た啶ぞ 啶溹ぞ啶ㄠぞ 啶氞ぞ啶灌た啶�',
+  datasets: '啶溹啶炧ぞ啶�',
+  datasetsApi: 'API 啶す啷佮啶�',
+  retrieval: {
+    semantic_search: {
+      title: '啶掂啶曕啶熰ぐ 啶栢啶�',
+      description:
+        '啶啶班ざ啷嵿え 啶忇ぎ啷嵿が啷囙ぁ啶苦啶椸啶� 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啷囙 啶斷ぐ 啶夃じ啶曕 啶掂啶曕啶熰ぐ 啶啶班い啶苦え啶苦ぇ啶苦い啷嵿さ 啶曕 啶膏ぎ啶距え 啶膏が啶膏 啶た啶侧い啷�-啶溹啶侧い啷� 啶熰啶曕啶膏啶� 啶氞啶� 啶曕 啶栢啶溹啶傕イ',
+    },
+    full_text_search: {
+      title: '啶啶班啶�-啶ぞ啶� 啶栢啶�',
+      description:
+        '啶︵じ啷嵿い啶距さ啷囙啶� 啶啶� 啶膏き啷� 啶多が啷嵿う啷嬥 啶曕 啶膏啶氞啶距啶曕た啶� 啶曕ぐ啷囙, 啶夃お啶啶椸啶班啶むぞ啶撪 啶曕 啶曕た啶膏 啶 啶多が啷嵿う 啶曕 啶栢啶溹え啷� 啶斷ぐ 啶夃え 啶多が啷嵿う啷嬥 啶曕 啶啶曕啶� 啶熰啶曕啶膏啶� 啶氞啶� 啶啶班ぞ啶啶� 啶曕ぐ啶ㄠ 啶曕 啶呧え啷佮ぎ啶むた 啶︵啶むぞ 啶灌啷�',
+    },
+    hybrid_search: {
+      title: '啶灌ぞ啶囙が啷嵿ぐ啶苦ぁ 啶栢啶�',
+      description:
+        '啶啶班啶�-啶ぞ啶� 啶栢啶� 啶斷ぐ 啶掂啶曕啶熰ぐ 啶栢啶溹啶� 啶曕 啶忇 啶膏ぞ啶� 啶ㄠた啶粪啶ぞ啶︵た啶� 啶曕ぐ啷囙, 啶啶ㄠ 啶班啶傕啶苦啶� 啶曕ぐ啷囙 啶斷ぐ 啶夃お啶啶椸啶班啶むぞ 啶曕 啶啶班ざ啷嵿え 啶曕 啶侧た啶� 啶膏ぐ啷嵿さ啷嬥い啷嵿い啶� 啶た啶侧ぞ啶� 啶曕ぞ 啶氞く啶� 啶曕ぐ啷囙啷� 啶班啶班啶傕 啶啶∴げ APIs 啶曕 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶嗋さ啶多啶啷�',
+      recommend: '啶膏た啶ぞ啶班た啶�',
+    },
+    invertedIndex: {
+      title: '啶夃げ啷嵿啶� 啶膏啶氞啶距啶�',
+      description:
+        '啶夃げ啷嵿啶� 啶膏啶氞啶距啶� 啶忇 啶愢じ啷� 啶膏啶班啶ㄠぞ 啶灌 啶溹 啶曕啶多げ 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕 啶溹ぞ啶む 啶灌啷� 啶す 啶多が啷嵿う啷嬥 啶︵啶掂ぞ啶班ぞ 啶掂啶さ啶膏啶ムた啶� 啶灌啶む 啶灌, 啶啶班い啷嵿く啷囙 啶多が啷嵿う 啶夃え 啶︵じ啷嵿い啶距さ啷囙啶监啶� 啶ぞ 啶掂啶� 啶啶溹啶� 啶曕 啶撪ぐ 啶囙啶椸た啶� 啶曕ぐ啶むぞ 啶灌 啶溹た啶ㄠぎ啷囙 啶掂す 啶灌啶むぞ 啶灌啷�',
+    },
+    change: '啶う啶侧啶�',
+    changeRetrievalMethod: '啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶掂た啶оた 啶う啶侧啶�',
+  },
+  docsFailedNotice: '啶︵じ啷嵿い啶距さ啷囙啶监啶� 啶曕 啶呧え啷佮啷嵿ぐ啶た啶� 啶曕ぐ啶ㄠ 啶啶� 啶掂た啶げ',
+  retry: '啶啶ㄠ 啶啶班く啶距じ 啶曕ぐ啷囙',
+  indexingTechnique: {
+    high_quality: '啶夃啷嵿 啶椸啶`さ啶む啶むぞ',
+    economy: '啶曕た啶ぞ啶い啷�',
+  },
+  indexingMethod: {
+    semantic_search: '啶掂啶曕啶熰ぐ',
+    full_text_search: '啶啶班啶� 啶ぞ啶�',
+    hybrid_search: '啶灌ぞ啶囙が啷嵿ぐ啶苦ぁ',
+    invertedIndex: '啶夃げ啷嵿啶�',
+  },
+  mixtureHighQualityAndEconomicTip: '啶夃啷嵿 啶椸啶`さ啶む啶むぞ 啶斷ぐ 啶曕た啶ぞ啶い啷� 啶溹啶炧ぞ啶� 啶嗋ぇ啶距ぐ啷嬥 啶曕 啶た啶多啶班ぃ 啶曕 啶侧た啶� 啶啶ㄠ 啶班啶傕啶苦啶� 啶啶∴げ 啶嗋さ啶多啶 啶灌啷�',
+  inconsistentEmbeddingModelTip: '啶う啶� 啶氞く啶ㄠた啶� 啶溹啶炧ぞ啶� 啶嗋ぇ啶距ぐ啷嬥 啶曕 啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶啶∴げ 啶呧じ啶傕啶� 啶灌啶�, 啶む 啶啶ㄠ 啶班啶傕啶苦啶� 啶啶∴げ 啶嗋さ啶多啶 啶灌啷�',
+  retrievalSettings: '啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶膏啶熰た啶傕啷嵿じ',
+  rerankSettings: '啶啶ㄠ 啶班啶傕啶苦啶� 啶膏啶熰た啶傕啷嵿じ',
+  weightedScore: {
+    title: '啶ぞ啶班た啶� 啶膏啶曕啶�',
+    description: '啶嗋さ啶傕啶苦い 啶ぞ啶班啶� 啶曕 啶膏ぎ啶距く啷嬥啶苦い 啶曕ぐ啶曕, 啶す 啶啶ㄠ 啶班啶傕啶苦啶� 啶班ぃ啶ㄠ啶むた 啶ㄠた啶班啶оぞ啶班た啶� 啶曕ぐ啶む 啶灌 啶曕た 啶多が啷嵿う啶距ぐ啷嵿ぅ 啶ぞ 啶曕啶掂ぐ啷嵿ぁ 啶た啶侧ぞ啶� 啶曕 啶啶班ぞ啶ムぎ啶苦啶むぞ 啶︵ 啶溹ぞ啶忇イ',
+    semanticFirst: '啶多が啷嵿う啶距ぐ啷嵿ぅ 啶す啶侧',
+    keywordFirst: '啶曕啶掂ぐ啷嵿ぁ 啶す啶侧',
+    customized: '啶呧え啷佮啷傕げ啶苦い',
+    semantic: '啶多が啷嵿う啶距ぐ啷嵿ぅ',
+    keyword: '啶曕啶掂ぐ啷嵿ぁ',
+  },
+  nTo1RetrievalLegacy: 'N-啶膏-1 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶膏た啶む啶ぐ 啶膏 啶嗋ぇ啶苦啶距ぐ啶苦 啶む啶� 啶ぐ 啶啶� 啶曕ぐ 啶︵ 啶溹ぞ啶忇啷�啷� 啶啶灌い啶� 啶ぐ啶苦ぃ啶距ぎ 啶啶班ぞ啶啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶ㄠさ啷�啶ㄠい啶� 啶す啷�-啶ぞ啶班啶� 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶ㄠ 啶曕 啶膏た啶ぞ啶班た啶� 啶曕 啶溹ぞ啶む 啶灌啷�',
+  nTo1RetrievalLegacyLink: '啶斷ぐ 啶溹ぞ啶ㄠ啶�',
+  nTo1RetrievalLegacyLinkText: 'N-啶膏-1 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶膏た啶む啶ぐ 啶啶� 啶嗋ぇ啶苦啶距ぐ啶苦 啶む啶� 啶ぐ 啶啶� 啶曕ぐ 啶︵ 啶溹ぞ啶忇啷�啷�',
+  defaultRetrievalTip: '啶げ啷嵿啷�-啶ぞ啶� 啶班た啶熰啶班啶掂げ 啶曕ぞ 啶夃お啶啶� 啶∴た啶ぜ啷夃げ啷嵿 啶班啶� 啶膏 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷� 啶溹啶炧ぞ啶� 啶曕 啶曕 啶溹啶炧ぞ啶� 啶嗋ぇ啶距ぐ啷嬥 啶膏 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌 啶斷ぐ 啶た啶� 啶た啶� 啶膏 啶班啶傕 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷�',
+  editExternalAPIConfirmWarningContent: {
+    end: '啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶�, 啶斷ぐ 啶す 啶膏啶多啶оえ 啶夃え 啶膏き啷� 啶ぐ 啶侧ぞ啶椸 啶曕た啶ぞ 啶溹ぞ啶忇啶距イ 啶曕啶ぞ 啶嗋お 啶掂ぞ啶曕 啶す 啶ぐ啶苦さ啶班啶むえ 啶膏す啷囙啶ㄠぞ 啶氞ぞ啶灌い啷� 啶灌啶�?',
+    front: '啶す 啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶� API 啶囙じ啶膏 啶溹啶∴ぜ啶� 啶灌啶� 啶灌',
+  },
+  editExternalAPIFormWarning: {
+    end: '啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶�',
+    front: '啶す 啶ぞ啶灌ぐ啷� 啶忇お啷�啶嗋 啶曕た啶膏じ啷� 啶溹啶∴ぜ啶� 啶灌啶� 啶灌',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: '啶た啶熰ぞ啶ㄠぞ',
+      end: '?',
+    },
+    content: {
+      front: '啶す 啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶� API 啶囙じ啶膏 啶溹啶∴ぜ啶� 啶灌啶� 啶灌',
+      end: '啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶ㄠイ 啶囙じ 啶忇お啷�啶嗋 啶曕 啶灌啶距え啷� 啶膏 啶掂 啶膏き啷� 啶呧ぎ啶距え啷嵿く 啶灌 啶溹ぞ啶忇啶椸啷� 啶曕啶ぞ 啶嗋お 啶掂ぞ啶曕 啶囙じ API 啶曕 啶灌啶距え啶� 啶氞ぞ啶灌い啷� 啶灌啶�?',
+    },
+    noConnectionContent: '啶曕啶ぞ 啶嗋お 啶掂ぞ啶曕 啶囙じ API 啶曕 啶灌啶� 啶︵啶傕啷�?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: '啶忇 啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶� API 啶氞啶ㄠ啶�',
+  },
+  connectDatasetIntro: {
+    content: {
+      link: '啶ぞ啶灌ぐ啷� API 啶え啶距え啷� 啶曕ぞ 啶むぐ啷�啶曕ぞ 啶溹ぞ啶ㄠ啶�',
+      front: '啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶ㄠ啷嬥し 啶膏 啶曕え啷囙啷嵿 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�, 啶嗋お啶曕 啶す啶侧 啶忇 啶ぞ啶灌ぐ啷� API 啶え啶距え啶� 啶灌啶椸ぞ啷� 啶曕啶く啶� 啶曕ぞ啶赤啷�啶啶班啶掂 啶掂ぞ啶氞ぞ 啶嗋ぃ啶� 啶膏啶︵ぐ啷嵿き 啶樴啶ぞ',
+      end: '. 啶た啶� 啶膏啶啶оた啶� 啶溹啶炧ぞ啶� 啶嗋啶∴ 啶⑧啶傕あ啷囙 啶斷ぐ 啶囙じ啷� 啶ぞ啶堗 啶撪ぐ 啶曕 啶啶班啶� 啶啶� 啶ぐ啷囙啷� 啶う啶� 啶膏き啷� 啶溹ぞ啶ㄠ啶距ぐ啷� 啶膏す啷� 啶灌, 啶む 啶す 啶曕え啷囙啷嵿 啶啶� 啶ぐ 啶曕啶侧た啶� 啶曕ぐ啶ㄠ 啶曕 啶ぞ啶� 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶ㄠ啶侧啶� 啶啶� 啶啶� 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶ぐ啷�啶曕啶粪ぃ 啶ぐ 啶曕啶� 啶溹ぞ啶忇啶距イ',
+    },
+    learnMore: '啶斷ぐ 啶溹ぞ啶ㄠ',
+    title: '啶曕た啶膏 啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶ㄠ啷嬥し 啶膏 啶曕え啷囙啷嵿 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕啶膏 啶曕ぐ啷囙',
+  },
+  connectHelper: {
+    helper5: '啶囙じ 啶膏啶掂た啶оぞ 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶ㄠ 啶膏 啶す啶侧 啶膏ぞ啶掂ぇ啶距え啷� 啶膏啷�',
+    helper2: '啶曕啶掂げ 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶曕ぞ啶班啶啷嵿し啶い啶� 啶膏ぎ啶班啶ムた啶� 啶灌',
+    helper3: '. 啶灌ぎ 啶︵啶⑧ぜ啶むぞ 啶膏 啶呧え啷佮ざ啶傕じ啶� 啶曕ぐ啶む 啶灌啶� 啶曕た 啶嗋お',
+    helper4: '啶膏す啶距く啶むぞ 啶︵じ啷嵿い啶距さ啷囙啶� 啶あ啶监啶�',
+    helper1: 'API 啶斷ぐ 啶ㄠ啶侧啶� 啶啶� ID 啶曕 啶ぞ啶о啶ぎ 啶膏 啶ぞ啶灌ぐ啷� 啶ㄠ啶侧啶� 啶啶� 啶膏 啶曕え啷囙啷嵿 啶曕ぐ啷囙. 啶掂ぐ啷嵿い啶ぞ啶� 啶啶�,',
+  },
+  externalKnowledgeForm: {
+    connect: '啶溹啷溹え啶�',
+    cancel: '啶班う啷嵿う 啶曕ぐ啶ㄠぞ',
+  },
+  externalAPIForm: {
+    encrypted: {
+      end: '啶熰啶曕鈥嵿え啷嬥げ啷夃啷�啷�',
+      front: '啶嗋お啶曕ぞ 啶忇お啷�啶嗋 啶熰啶曕え 啶忇え啷嵿啷嵿ぐ啶苦お啷嵿 啶曕た啶ぞ 啶溹ぞ啶忇啶� 啶斷ぐ 啶囙じ啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕 啶膏啶椸啶班す啷�啶� 啶曕た啶ぞ 啶溹ぞ啶忇啶�',
+    },
+    apiKey: '啶忇お啷�啶嗋 啶曕啶傕啷�',
+    name: '啶ㄠぞ啶�',
+    cancel: '啶班う啷嵿う 啶曕ぐ啶ㄠぞ',
+    save: '啶班啷嵿し啶� 啶曕ぐ',
+    edit: '啶膏啶ぞ啶︵え 啶曕ぐ啶ㄠぞ',
+    endpoint: '啶忇お啷�啶嗋 啶膏ぎ啶距お啶� 啶た啶傕う啷�',
+  },
+  externalAPI: '啶ぞ啶灌ぐ啷� 啶忇お啷�啶嗋',
+  externalAPIPanelTitle: '啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶� 啶忇お啷�啶嗋',
+  allExternalTip: '啶曕啶掂げ 啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶む 啶膏ぎ啶�, 啶夃お啶啶椸啶班啶むぞ 啶す 啶氞啶� 啶膏啶むぞ 啶灌 啶曕た Rerank 啶啶∴げ 啶曕 啶膏啷嵿し啶� 啶曕ぐ啶ㄠぞ 啶灌 啶ぞ 啶ㄠす啷�啶傕イ 啶う啶� 啶膏啷嵿し啶� 啶ㄠす啷�啶� 啶灌, 啶む 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い 啶曕た啶� 啶椸 啶掂た啶栢啶∴ 啶膏啶曕啶� 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶曕啶班ぎ啶う啷嵿ぇ 啶曕た啶� 啶溹ぞ啶忇啶椸啷� 啶溹が 啶掂た啶た啶ㄠ啶� 啶溹啶炧ぞ啶� 啶嗋ぇ啶距ぐ啷嬥 啶曕 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶� 啶班ぃ啶ㄠ啶むた啶ぞ啶� 啶呧じ啶傕啶� 啶灌啶む 啶灌啶�, 啶む 啶す 啶椸げ啶� 啶灌啶椸啷�',
+  externalKnowledgeName: '啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶� 啶曕ぞ 啶ㄠぞ啶�',
+  connectDataset: '啶曕た啶膏 啶ぞ啶灌啶� 啶溹啶炧ぞ啶ㄠ啷嬥し 啶膏 啶曕え啷囙啷嵿 啶曕ぐ啶ㄠぞ',
+  mixtureInternalAndExternalTip: '啶嗋啶むぐ啶苦 啶斷ぐ 啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶� 啶曕 啶た啶多啶班ぃ 啶曕 啶侧た啶� 啶班啶班啶傕 啶啶∴げ 啶曕 啶嗋さ啶多啶啶むぞ 啶灌啶む 啶灌啷�',
+  externalTag: '啶ぞ啶灌啶�',
+  externalAPIPanelDescription: '啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶� API 啶曕ぞ 啶夃お啶啶� Dify 啶曕 啶ぞ啶灌ぐ 啶ㄠ啶侧啶� 啶啶� 啶膏 啶曕え啷囙啷嵿 啶曕ぐ啶ㄠ 啶斷ぐ 啶夃じ 啶ㄠ啶侧啶� 啶啶� 啶膏 啶溹啶炧ぞ啶� 啶啶班ぞ啶啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷�',
+  externalKnowledgeDescription: '啶溹啶炧ぞ啶� 啶掂た啶掂ぐ啶�',
+  createExternalAPI: '啶曕啶� 啶ぞ啶灌ぐ啷� 啶ㄠ啶侧啶� API 啶溹啶∴ぜ啶ㄠぞ',
+  externalKnowledgeIdPlaceholder: '啶曕啶く啶� 啶ㄠ啶侧啶� 啶嗋啶∴ 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+  editExternalAPITooltipTitle: '啶侧た啶傕 啶曕た啶ぞ 啶椸く啶� 啶溹啶炧ぞ啶�',
+  externalAPIPanelDocumentation: '啶ぞ啶灌ぐ啷� 啶ㄠ啶侧啶� API 啶え啶距え啷� 啶曕ぞ 啶むぐ啷�啶曕ぞ 啶溹ぞ啶ㄠ啶�',
+  editExternalAPIFormTitle: '啶ぞ啶灌啶� 啶溹啶炧ぞ啶� API 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+  externalKnowledgeNamePlaceholder: '啶曕啶く啶� 啶ㄠ啶侧啶� 啶啶� 啶曕ぞ 啶ㄠぞ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+  externalKnowledgeId: '啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶� ID',
+  externalKnowledgeDescriptionPlaceholder: '啶掂ぐ啷嵿ぃ啶� 啶曕ぐ啷囙 啶曕た 啶囙じ 啶溹啶炧ぞ啶ㄠ啷嬥し 啶啶� 啶曕啶ぞ 啶灌 (啶掂啶曕げ啷嵿お啶苦)',
+  noExternalKnowledge: '啶呧き啷� 啶む 啶曕啶� 啶ぞ啶灌ぐ啷� 啶溹啶炧ぞ啶� 啶忇お啷�啶嗋 啶ㄠす啷�啶� 啶灌, 啶え啶距え啷� 啶曕 啶侧た啶� 啶す啶距 啶曕啶侧た啶� 啶曕ぐ啷囙',
+  createNewExternalAPI: '啶忇 啶ㄠく啶� 啶ぞ啶灌ぐ啷� 啶ㄠ啶侧啶� API 啶え啶距啶�',
+  learnHowToWriteGoodKnowledgeDescription: '啶忇 啶呧啷嵿啶� 啶溹啶炧ぞ啶� 啶掂た啶掂ぐ啶� 啶侧た啶栢え啶� 啶膏啶栢啶�',
+  chunkingMode: {
+    parentChild: '啶ぞ啶むぞ-啶た啶むぞ 啶曕ぞ 啶啷嵿啶�',
+    general: '啶膏ぞ啶ぞ啶ㄠ啶�',
+  },
+  parentMode: {
+    fullDoc: '啶啶班啶�-啶︵じ啷嵿い啶距さ啷囙啶�',
+    paragraph: '啶呧え啷佮啷嶁�嵿啷囙う',
+  },
+  batchAction: {
+    cancel: '啶班う啷嵿う 啶曕ぐ啶ㄠぞ',
+    disable: '啶呧啷嵿し啶�',
+    enable: '啶啶椸啶� 啶え啶距え啶�',
+    selected: '啶氞く啶ㄠた啶�',
+    delete: '啶た啶熰ぞ啶ㄠぞ',
+    archive: '啶啶班ぞ啶侧啶�',
+  },
+  localDocs: '啶膏啶ムぞ啶ㄠ啶� 啶∴啶曕啶�',
+  preprocessDocument: '{{num}} 啶啶班啶啶班啶膏啶� 啶︵じ啷嵿い啶距さ啷囙啶�',
+  enable: '啶啶椸啶� 啶え啶距え啶�',
+  documentsDisabled: '{{num}} 啶︵じ啷嵿い啶距さ啷囙啶� 啶呧啷嵿し啶� - 30 啶︵た啶ㄠ啶� 啶膏 啶呧ぇ啶苦 啶膏ぎ啶� 啶膏 啶ㄠた啶粪啶曕啶班た啶�',
+  allKnowledge: '啶膏ぐ啷嵿さ 啶溹啶炧ぞ啶�',
+  allKnowledgeDescription: '啶囙じ 啶曕ぞ啶班啶じ啷嵿ぅ啶距え 啶啶� 啶膏き啷� 啶溹啶炧ぞ啶� 啶啶班う啶班啶多た啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶氞く啶� 啶曕ぐ啷囙. 啶曕啶掂げ 啶曕ぞ啶班啶じ啷嵿ぅ啶距え 啶膏啶掂ぞ啶 啶灌 啶膏き啷� 啶溹啶炧ぞ啶� 啶曕ぞ 啶啶班が啶傕ぇ啶� 啶曕ぐ 啶膏啶むぞ 啶灌.',
+  metadata: {
+    createMetadata: {
+      type: '啶熰ぞ啶囙お 啶曕ぐ啷囙',
+      name: '啶ㄠぞ啶�',
+      namePlaceholder: '啶о啶ぞ啶ㄠ 啶曕ぞ 啶ㄠぞ啶� 啶溹啶∴ぜ啷囙',
+      title: '啶ㄠく啶� 啶啶熰ぞ啶∴啶熰ぞ',
+      back: '啶啶涏',
+    },
+    checkName: {
+      empty: '啶啶熰ぞ啶∴ぞ啶熰ぞ 啶曕ぞ 啶ㄠぞ啶� 啶栢ぞ啶侧 啶ㄠす啷�啶� 啶灌 啶膏啶むぞ',
+      invalid: '啶啶熰ぞ啶∴啶熰ぞ 啶ㄠぞ啶� 啶啶� 啶曕啶掂げ 啶涏啶熰 啶呧啷嵿し啶�, 啶膏啶栢啶ぞ 啶斷ぐ 啶呧啶∴ぐ啶膏啶曕啶� 啶多ぞ啶た啶� 啶灌 啶膏啶む 啶灌啶� 啶斷ぐ 啶囙じ啷� 啶涏啶熰 啶呧啷嵿し啶� 啶膏 啶多啶班 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶忇イ',
+    },
+    batchEditMetadata: {
+      editMetadata: '啶啶熰ぞ啶∴啶熰ぞ 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+      multipleValue: '啶曕 啶ぞ啶�',
+      applyToAllSelectDocument: '啶氞啶ㄠ 啶椸 啶膏き啷� 啶︵じ啷嵿い啶距さ啷囙啶监啶� 啶ぐ 啶侧ぞ啶椸 啶曕ぐ啷囙',
+      editDocumentsNum: '啶膏啶ぞ啶︵た啶� 啶曕ぐ 啶班す啷� 啶灌啶� {{num}} 啶︵じ啷嵿い啶距さ啷囙啶�',
+      applyToAllSelectDocumentTip: '啶膏き啷� 啶氞く啶ㄠた啶� 啶︵じ啷嵿い啶距さ啷囙啶监啶� 啶曕 啶侧た啶� 啶娻お啶� 啶︵た啶� 啶椸 啶膏啶ぞ啶︵た啶� 啶斷ぐ 啶ㄠ 啶啶熰ぞ啶∴啶熰ぞ 啶曕 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶え啶距啶�, 啶呧え啷嵿く啶ムぞ 啶啶熰ぞ啶∴啶熰ぞ 啶曕ぞ 啶膏啶ぞ啶︵え 啶曕啶掂げ 啶夃え 啶︵じ啷嵿い啶距さ啷囙啶监啶� 啶ぐ 啶侧ぞ啶椸 啶灌啶椸ぞ 啶溹た啶ㄠぎ啷囙 啶す 啶啶溹啶� 啶灌啷�',
+    },
+    selectMetadata: {
+      manageAction: '啶啶班が啶傕ぇ啶苦い 啶曕ぐ啷囙',
+      search: '啶栢啶� 啶啶熰ぞ啶∴啶熰ぞ',
+      newAction: '啶ㄠく啶� 啶啶熰ぞ啶∴啶熰ぞ',
+    },
+    datasetMetadata: {
+      addMetaData: '啶啶熰ぞ啶∴啶熰ぞ 啶溹啶∴ぜ啷囙',
+      rename: '啶ㄠぞ啶� 啶う啶侧啶�',
+      name: '啶ㄠぞ啶�',
+      values: '{{num}} 啶ぞ啶�',
+      namePlaceholder: '啶啶熰ぞ啶∴啶熰ぞ 啶ㄠぞ啶�',
+      deleteContent: '啶曕啶ぞ 啶嗋お 啶膏啶ㄠた啶多啶氞た啶� 啶灌啶� 啶曕た 啶嗋お 啶啶熰ぞ啶∴啶熰ぞ "{{name}}" 啶曕 啶灌啶距え啶� 啶氞ぞ啶灌い啷� 啶灌啶�?',
+      deleteTitle: '啶灌啶距え啷� 啶曕 啶啶粪啶熰た 啶曕ぐ啷囙',
+      description: '啶嗋お 啶囙じ 啶溹啶炧ぞ啶� 啶啶� 啶膏き啷� 啶啶熰ぞ啶∴啶熰ぞ 啶啶班が啶傕ぇ啶苦い 啶曕ぐ 啶膏啶む 啶灌啶傕イ 啶膏啶多啶оえ 啶灌ぐ 啶︵じ啷嵿い啶距さ啷囙啶� 啶啶� 啶膏ぎ啶ㄠ啶掂く啶苦い 啶曕た啶� 啶溹ぞ啶忇啶椸啷�',
+      disabled: '啶呧啷嵿し啶�',
+      builtInDescription: '啶た啶侧啶�-啶囙え 啶啶熰ぞ啶∴啶熰ぞ 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶ㄠた啶曕ぞ啶侧ぞ 啶斷ぐ 啶夃い啷嵿お啶ㄠ啶� 啶灌啶むぞ 啶灌啷� 啶囙じ啷� 啶夃お啶啶� 啶膏 啶す啶侧 啶膏啷嵿し啶� 啶曕ぐ啶ㄠぞ 啶嗋さ啶多啶 啶灌 啶斷ぐ 啶囙じ啷� 啶膏啶ぞ啶︵た啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌啷�',
+      builtIn: '啶た啶侧啶�-啶囙え',
+    },
+    documentMetadata: {
+      documentInformation: '啶︵じ啷嵿い啶距さ啷囙啶� 啶溹ぞ啶ㄠ啶距ぐ啷�',
+      technicalParameters: '啶む啶ㄠ啶曕 啶啶班ぞ啶啶熰ぐ',
+      startLabeling: '啶侧啶げ啶苦啶� 啶多啶班 啶曕ぐ啷囙',
+      metadataToolTip: '啶啶熰ぞ啶∴啶熰ぞ 啶忇 啶す啶む啶掂お啷傕ぐ啷嵿ぃ 啶ぜ啶苦げ啷嵿啶� 啶曕 啶班啶� 啶啶� 啶曕ぞ啶班啶� 啶曕ぐ啶むぞ 啶灌 啶溹 啶溹ぞ啶ㄠ啶距ぐ啷� 啶啶班ぞ啶啶� 啶曕ぐ啶ㄠ 啶曕 啶膏啷�啶曕い啶� 啶斷ぐ 啶啶班ぞ啶膏啶椸た啶曕い啶� 啶曕 啶あ啶监ぞ啶むぞ 啶灌啷� 啶嗋お 啶囙じ 啶︵じ啷嵿い啶距さ啷囙啶� 啶曕 啶侧た啶� 啶啶熰ぞ啶∴啶熰ぞ 啶曕 啶す啶距 啶膏啶多啶оた啶� 啶斷ぐ 啶溹啶∴ぜ 啶膏啶む 啶灌啶傕イ',
+    },
+    chooseTime: '啶忇 啶膏ぎ啶� 啶氞啶ㄠ啶�...',
+    addMetadata: '啶啶熰ぞ啶∴啶熰ぞ 啶溹啶∴ぜ啷囙',
+    metadata: '啶啶熰ぞ啶∴啶熰ぞ',
+  },
+  embeddingModelNotAvailable: '啶忇ぎ啷嵿が啷囙ぁ啶苦啶� 啶啶∴げ 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶灌啷�',
+}
+
+export default translation
diff --git a/i18n/hi-IN/education.ts b/i18n/hi-IN/education.ts
new file mode 100644
index 0000000..0577fa1
--- /dev/null
+++ b/i18n/hi-IN/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    coupon: '啶掂た啶多啶� 100% 啶曕啶え',
+    front: '啶嗋お 啶呧が 啶多た啶曕啶粪ぞ 啶膏い啷嵿く啶距お啶苦い 啶膏啶ムた啶むた 啶曕 啶侧た啶� 啶啶椸啶� 啶灌啶傕イ 啶曕啶く啶� 啶ㄠ啶氞 啶呧お啶ㄠ 啶多た啶曕啶粪ぞ 啶曕 啶溹ぞ啶ㄠ啶距ぐ啷� 啶啶班う啶距え 啶曕ぐ啷囙 啶むぞ啶曕た 啶啶班啷嵿ぐ啶苦く啶� 啶曕 啶啶班ぞ 啶曕た啶ぞ 啶溹ぞ 啶膏啷� 啶斷ぐ 啶忇 啶啶班ぞ啶啶� 啶灌 啶膏啷�',
+    end: 'Dify 啶啶班啶啶多え啶� 啶啶溹え啶� 啶曕 啶侧た啶忇イ',
+  },
+  form: {
+    schoolName: {
+      placeholder: '啶呧お啶ㄠ 啶膏啶曕啶� 啶曕ぞ 啶嗋ぇ啶苦啶距ぐ啶苦, 啶た啶ㄠぞ 啶膏啶曕啶粪た啶啶� 啶ㄠぞ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+      title: '啶嗋お啶曕 啶膏啶曕啶� 啶曕ぞ 啶ㄠぞ啶�',
+    },
+    schoolRole: {
+      option: {
+        administrator: '啶膏啶曕啶� 啶啶班ざ啶距じ啶�',
+        student: '啶涏ぞ啶む啶�',
+        teacher: '啶多た啶曕啶粪',
+      },
+      title: '啶嗋お啶曕 啶膏啶曕啶� 啶曕 啶啶た啶曕ぞ',
+    },
+    terms: {
+      desc: {
+        and: '啶斷ぐ',
+        termsOfService: '啶膏啶掂ぞ啶撪 啶曕 啶多ぐ啷嵿い啷囙',
+        privacyPolicy: '啶椸啶え啷�啶い啶� 啶ㄠ啶むた',
+        end: '. 啶啶班じ啷嵿い啷佮い 啶曕ぐ啶曕:',
+        front: '啶嗋お啶曕 啶溹ぞ啶ㄠ啶距ぐ啷� 啶斷ぐ 啶多た啶曕啶粪ぞ 啶膏い啷嵿く啶距お啶苦い 啶膏啶ムた啶むた 啶曕ぞ 啶夃お啶啶� 啶灌ぎ啶距ぐ啷� 啶多ぐ啷嵿い啷嬥 啶曕 啶呧ぇ啷�啶� 啶灌啷�',
+      },
+      option: {
+        age: '啶啶� 啶啶粪啶熰た 啶曕ぐ啶むぞ 啶灌啶� 啶曕た 啶啶� 啶曕ぎ 啶膏 啶曕ぎ 18 啶膏ぞ啶� 啶曕ぞ 啶灌啶�',
+        inSchool: '啶啶� 啶啶粪啶熰た 啶曕ぐ啶むぞ 啶灌啶� 啶曕た 啶啶� 啶︵ 啶椸 啶膏啶膏啶ムぞ啶� 啶啶� 啶ㄠぞ啶ぞ啶傕啶苦い 啶ぞ 啶ㄠた啶啶曕啶� 啶灌啶傕イ Dify 啶ㄠぞ啶ぞ啶傕啶�/啶ㄠた啶啶曕啶むた 啶曕ぞ 啶啶班ぎ啶距ぃ 啶ぞ啶傕 啶膏啶むぞ 啶灌啷� 啶う啶� 啶啶� 啶呧お啶ㄠ 啶ぞ啶む啶班い啶� 啶曕ぞ 啶椸げ啶� 啶掂ぐ啷嵿ぃ啶� 啶曕ぐ啶むぞ 啶灌啶�, 啶む 啶啶� 啶膏す啶い 啶灌啶� 啶曕た 啶啶� 啶呧お啶ㄠ 啶多た啶曕啶粪ぞ 啶膏啶ムた啶むた 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶曕た啶膏 啶 啶多啶侧啶� 啶曕ぞ 啶啶椸い啶距え 啶曕ぐ啷傕 啶溹 啶啶班ぞ啶班啶� 啶啶� 啶ぞ啶� 啶曕た啶ぞ 啶椸く啶� 啶ムぞ啷�',
+      },
+      title: '啶ㄠた啶ぎ 啶斷ぐ 啶多ぐ啷嵿い啷囙',
+    },
+  },
+  submitError: '啶啶班啶� 啶溹ぎ啶� 啶曕ぐ啶ㄠ 啶啶� 啶掂た啶げ啶むぞ 啶灌啶堗イ 啶曕啶く啶� 啶ぞ啶� 啶啶� 啶啶ㄠ 啶啶班く啶距じ 啶曕ぐ啷囙啷�',
+  currentSigned: '啶掂ぐ啷嵿い啶ぞ啶� 啶啶� 啶膏ぞ啶囙え 啶囙え 啶曕た啶ぞ 啶椸く啶� 啶灌 啶曕 啶班啶� 啶啶�',
+  learn: '啶多た啶曕啶粪ぞ 啶曕 啶啶班ぎ啶距ぃ啶苦い 啶曕ぐ啶距え啷� 啶曕ぞ 啶むぐ啷�啶曕ぞ 啶膏啶栢啶�',
+  toVerified: '啶多た啶曕啶粪ぞ 啶曕 啶啶粪啶熰た 啶曕ぐ啶距啶�',
+  emailLabel: '啶嗋お啶曕ぞ 啶掂ぐ啷嵿い啶ぞ啶� 啶堗ぎ啷囙げ',
+  submit: '啶膏が啶た啶� 啶曕ぐ啷囙',
+  rejectTitle: '啶嗋お啶曕 啶∴た啶ぞ啶� 啶多啶曕啶粪ぃ啶苦 啶膏い啷嵿く啶距お啶� 啶曕 啶呧じ啷嵿さ啷�啶曕啶� 啶曕ぐ 啶︵た啶ぞ 啶椸く啶� 啶灌',
+  successTitle: '啶嗋お啶曕 啶∴た啶ぞ啶� 啶多た啶曕啶粪ぞ 啶曕 啶膏い啷嵿く啶距お啶苦い 啶曕た啶ぞ 啶椸く啶� 啶灌',
+  successContent: '啶灌ぎ啶ㄠ 啶嗋お啶曕 啶栢ぞ啶む 啶曕 啶侧た啶� Dify 啶啶班啶啶多え啶� 啶啶溹え啶� 啶曕 啶侧た啶� 100% 啶涏啶� 啶曕啶え 啶溹ぞ啶班 啶曕た啶ぞ 啶灌啷� 啶す 啶曕啶え 啶忇 啶掂ぐ啷嵿し 啶曕 啶侧た啶� 啶ぞ啶ㄠ啶� 啶灌, 啶曕啶く啶� 啶囙じ啷� 啶ぞ啶ㄠ啶い啶� 啶曕 啶呧さ啶оた 啶曕 啶啶むぐ 啶夃お啶啶� 啶曕ぐ啷囙啷�',
+  rejectContent: '啶︵啶班啶ぞ啶椸啶さ啶�, 啶嗋お 啶多た啶曕啶粪ぞ 啶膏い啷嵿く啶距お啶苦い 啶膏啶ムた啶むた 啶曕 啶侧た啶� 啶啶椸啶� 啶ㄠす啷�啶� 啶灌啶� 啶斷ぐ 啶囙じ啶侧た啶� 啶う啶� 啶嗋お 啶囙じ 啶堗ぎ啷囙げ 啶い啷� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶む 啶灌啶�, 啶む 啶嗋お 啶∴た啶ぞ啶� 啶啶班啶啶多え啶� 啶啶溹え啶� 啶曕 啶侧た啶� 啶掂た啶多啶� 100% 啶曕啶え 啶啶班ぞ啶啶� 啶ㄠす啷�啶� 啶曕ぐ 啶膏啶む啷�',
+}
+
+export default translation
diff --git a/i18n/hi-IN/explore.ts b/i18n/hi-IN/explore.ts
new file mode 100644
index 0000000..a9e850c
--- /dev/null
+++ b/i18n/hi-IN/explore.ts
@@ -0,0 +1,45 @@
+const translation = {
+  title: '啶呧え啷嵿さ啷囙し啶� 啶曕ぐ啷囙',
+  sidebar: {
+    discovery: '啶栢啶�',
+    chat: '啶氞啶�',
+    workspace: '啶曕ぞ啶班啶啷嵿し啷囙い啷嵿ぐ',
+    action: {
+      pin: '啶た啶� 啶曕ぐ啷囙',
+      unpin: '啶た啶� 啶灌啶距啶�',
+      rename: '啶ㄠぞ啶� 啶う啶侧啶�',
+      delete: '啶灌啶距啶�',
+    },
+    delete: {
+      title: '啶愢お 啶灌啶距啶�',
+      content: '啶曕啶ぞ 啶嗋お 啶掂ぞ啶曕 啶囙じ 啶愢お 啶曕 啶灌啶距え啶� 啶氞ぞ啶灌い啷� 啶灌啶�?',
+    },
+  },
+  apps: {
+    title: '啶∴た啶ぜ啷� 啶︵啶掂ぞ啶班ぞ 啶愢お啷嵿じ 啶曕ぞ 啶呧え啷嵿さ啷囙し啶� 啶曕ぐ啷囙',
+    description:
+      '啶囙え 啶熰啶啶啶侧啶� 啶愢お啷嵿じ 啶曕ぞ 啶む啶班啶� 啶夃お啶啶� 啶曕ぐ啷囙 啶ぞ 啶熰啶啶啶侧啶熰啶� 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶呧お啶ㄠ 啶膏啶掂く啶� 啶曕 啶愢お啷嵿じ 啶曕 啶曕じ啷嵿啶ぞ啶囙啶� 啶曕ぐ啷囙啷�',
+    allCategories: '啶呧え啷佮ざ啶傕じ啶苦い',
+  },
+  appCard: {
+    addToWorkspace: '啶曕ぞ啶班啶啷嵿し啷囙い啷嵿ぐ 啶啶� 啶溹啶∴ぜ啷囙',
+    customize: '啶呧え啷佮啷傕げ啶苦い 啶曕ぐ啷囙',
+  },
+  appCustomize: {
+    title: '{{name}} 啶膏 啶愢お 啶え啶距啶�',
+    subTitle: '啶愢お 啶嗋啶曕え 啶斷ぐ 啶ㄠぞ啶�',
+    nameRequired: '啶愢お 啶曕ぞ 啶ㄠぞ啶� 啶嗋さ啶多啶 啶灌',
+  },
+  category: {
+    Assistant: '啶膏す啶距く啶�',
+    Writing: '啶侧啶栢え',
+    Translate: '啶呧え啷佮さ啶距う',
+    Programming: '啶啶班啶椸啶班ぞ啶た啶傕',
+    HR: '啶ぞ啶ㄠさ 啶膏啶膏ぞ啶оえ',
+    Workflow: '啶曕ぞ啶班啶お啷嵿ぐ啶掂ぞ啶�',
+    Agent: '啶嗋あ啶监い啶苦く啶�',
+    Entertainment: '啶え啷嬥ぐ啶傕啶�',
+  },
+}
+
+export default translation
diff --git a/i18n/hi-IN/layout.ts b/i18n/hi-IN/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/hi-IN/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/hi-IN/login.ts b/i18n/hi-IN/login.ts
new file mode 100644
index 0000000..0be8cbc
--- /dev/null
+++ b/i18n/hi-IN/login.ts
@@ -0,0 +1,115 @@
+const translation = {
+  pageTitle: '啶呧ぐ啷�, 啶氞げ啶苦 啶多啶班 啶曕ぐ啶む 啶灌啶�!馃憢',
+  welcome: 'Dify 啶啶� 啶嗋お啶曕ぞ 啶膏啶掂ぞ啶椸い 啶灌, 啶曕啶く啶� 啶溹ぞ啶班 啶班啶ㄠ 啶曕 啶侧た啶� 啶侧啶� 啶囙え 啶曕ぐ啷囙啷�',
+  email: '啶堗ぎ啷囙げ 啶い啶�',
+  emailPlaceholder: '啶嗋お啶曕ぞ 啶堗ぎ啷囙げ',
+  password: '啶ぞ啶膏さ啶班啶�',
+  passwordPlaceholder: '啶嗋お啶曕ぞ 啶ぞ啶膏さ啶班啶�',
+  name: '啶夃お啶啶椸啶班啶むぞ 啶ㄠぞ啶�',
+  namePlaceholder: '啶嗋お啶曕ぞ 啶夃お啶啶椸啶班啶むぞ 啶ㄠぞ啶�',
+  forget: '啶曕啶ぞ 啶嗋お 啶ぞ啶膏さ啶班啶� 啶啶� 啶椸?',
+  signBtn: '啶膏ぞ啶囙え 啶囙え 啶曕ぐ啷囙',
+  sso: 'SSO 啶曕 啶膏ぞ啶� 啶溹ぞ啶班 啶班啷囙',
+  installBtn: '啶膏啶� 啶呧お 啶曕ぐ啷囙',
+  setAdminAccount: '啶忇ぁ啶た啶� 啶栢ぞ啶むぞ 啶膏啶� 啶曕ぐ 啶班す啷� 啶灌啶�',
+  setAdminAccountDesc:
+    '啶忇ぁ啶た啶� 啶栢ぞ啶む 啶曕 啶侧た啶� 啶呧ぇ啶苦啶むぎ 啶掂た啶多啶粪ぞ啶оた啶曕ぞ啶�, 啶溹た啶膏啶� 啶夃お啶啶� 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶え啶距え啷� 啶斷ぐ LLM 啶啶班う啶距い啶距啶� 啶曕 啶啶班が啶傕ぇ啶苦い 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌, 啶嗋う啶苦イ',
+  createAndSignIn: '啶え啶距啶� 啶斷ぐ 啶膏ぞ啶囙え 啶囙え 啶曕ぐ啷囙',
+  oneMoreStep: '啶忇 啶斷ぐ 啶曕う啶�',
+  createSample: '啶囙じ 啶溹ぞ啶ㄠ啶距ぐ啷� 啶曕 啶嗋ぇ啶距ぐ 啶ぐ, 啶灌ぎ 啶嗋お啶曕 啶侧た啶� 啶ㄠぎ啷傕え啶� 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶え啶距啶傕啷�',
+  invitationCode: '啶ㄠた啶啶む啶班ぃ 啶曕啶�',
+  invitationCodePlaceholder: '啶嗋お啶曕ぞ 啶ㄠた啶啶む啶班ぃ 啶曕啶�',
+  interfaceLanguage: '啶囙啶熰ぐ啶啶� 啶ぞ啶粪ぞ',
+  timezone: '啶膏ぎ啶� 啶曕啶粪啶む啶�',
+  go: 'Dify 啶ぐ 啶溹ぞ啶忇',
+  sendUsMail:
+    '啶灌ぎ啷囙 啶呧お啶ㄠぞ 啶ぐ啶苦啶� 啶堗ぎ啷囙げ 啶曕ぐ啷囙, 啶斷ぐ 啶灌ぎ 啶ㄠた啶啶む啶班ぃ 啶呧え啷佮ぐ啷嬥ぇ 啶曕 啶膏啶ぞ啶� 啶侧啶傕啷囙イ',
+  acceptPP: '啶啶傕え啷� 啶椸啶え啷�啶い啶� 啶ㄠ啶むた 啶あ啶监 啶灌 啶斷ぐ 啶膏啶掂啶曕ぞ啶� 啶曕ぐ啶むぞ 啶灌啶�',
+  reset: '啶曕啶く啶� 啶呧お啶ㄠぞ 啶ぞ啶膏さ啶班啶� 啶班啶膏啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶ㄠた啶啶ㄠげ啶苦啶苦い 啶曕ぎ啶距啶� 啶氞げ啶距啶�',
+  withGitHub: 'GitHub 啶曕 啶膏ぞ啶� 啶溹ぞ啶班 啶班啷囙',
+  withGoogle: 'Google 啶曕 啶膏ぞ啶� 啶溹ぞ啶班 啶班啷囙',
+  rightTitle: 'LLM 啶曕 啶啶班 啶曕啶粪ぎ啶むぞ 啶曕 啶呧え啶侧啶� 啶曕ぐ啷囙',
+  rightDesc:
+    '啶︵啶多啶� 啶班啶� 啶膏 啶嗋啶班啶粪, 啶膏啶氞ぞ啶侧え 啶啶椸啶� 啶斷ぐ 啶膏啶оぞ啶� 啶啶椸啶� AI 啶忇お啷嵿げ啶苦啷囙ざ啶� 啶曕 啶嗋じ啶距え啷� 啶膏 啶え啶距啶傕イ',
+  tos: '啶膏啶掂ぞ 啶曕 啶多ぐ啷嵿い啷囙',
+  pp: '啶椸啶え啷�啶い啶� 啶ㄠ啶むた',
+  tosDesc: '啶膏ぞ啶囙え 啶呧お 啶曕ぐ啶曕, 啶嗋お 啶灌ぎ啶距ぐ啷� 啶膏す啶い啶� 啶︵啶む 啶灌啶�',
+  goToInit:
+    '啶う啶� 啶嗋お啶ㄠ 啶栢ぞ啶むぞ 啶啶班ぞ啶班啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶灌, 啶む 啶曕啶く啶� 啶啶班ぞ啶班啶た啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶忇',
+  dontHave: '啶ㄠす啷�啶� 啶灌?',
+  invalidInvitationCode: '啶呧さ啷堗ぇ 啶ㄠた啶啶む啶班ぃ 啶曕啶�',
+  accountAlreadyInited: '啶栢ぞ啶むぞ 啶す啶侧 啶膏 啶啶班ぞ啶班啶� 啶曕た啶ぞ 啶椸く啶� 啶灌',
+  forgotPassword: '啶曕啶ぞ 啶嗋お啶ㄠ 啶呧お啶ㄠぞ 啶ぞ啶膏さ啶班啶� 啶啶� 啶椸 啶灌啶�?',
+  resetLinkSent: '啶班啶膏啶� 啶侧た啶傕 啶啶溹 啶椸',
+  sendResetLink: '啶班啶膏啶� 啶侧た啶傕 啶啶溹啶�',
+  backToSignIn: '啶膏ぞ啶囙え 啶囙え 啶ぐ 啶掂ぞ啶じ 啶溹ぞ啶忇',
+  forgotPasswordDesc: '啶曕啶く啶� 啶呧お啶ㄠぞ 啶堗ぎ啷囙げ 啶い啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙 啶むぞ啶曕た 啶灌ぎ 啶嗋お啶曕 啶呧お啶ㄠぞ 啶ぞ啶膏さ啶班啶� 啶班啶膏啶� 啶曕ぐ啶ㄠ 啶曕 啶ㄠた啶班啶︵啶多啶� 啶曕 啶膏ぞ啶� 啶忇 啶堗ぎ啷囙げ 啶啶� 啶膏啷囙啷�',
+  checkEmailForResetLink: '啶曕啶く啶� 啶呧お啶ㄠぞ 啶ぞ啶膏さ啶班啶� 啶班啶膏啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶侧た啶傕 啶曕 啶侧た啶� 啶呧お啶ㄠぞ 啶堗ぎ啷囙げ 啶氞啶� 啶曕ぐ啷囙啷� 啶呧啶� 啶す 啶曕啶� 啶た啶ㄠ啷嬥 啶曕 啶啶むぐ 啶ㄠす啷�啶� 啶嗋い啶� 啶灌, 啶む 啶曕啶く啶� 啶呧お啶ㄠぞ 啶膏啶啶� 啶啶侧啶∴ぐ 啶 啶氞啶� 啶曕ぐ啷囙啷�',
+  passwordChanged: '啶呧が 啶膏ぞ啶囙え 啶囙え 啶曕ぐ啷囙',
+  changePassword: '啶ぞ啶膏さ啶班啶� 啶う啶侧啶�',
+  changePasswordTip: '啶曕啶く啶� 啶呧お啶ㄠ 啶栢ぞ啶む 啶曕 啶侧た啶� 啶ㄠく啶� 啶ぞ啶膏さ啶班啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+  invalidToken: '啶呧ぎ啶距え啷嵿く 啶ぞ 啶膏ぎ啶距お啷嵿い 啶熰啶曕え',
+  confirmPassword: '啶ぞ啶膏さ啶班啶� 啶曕 啶啶粪啶熰た 啶曕ぐ啷囙',
+  confirmPasswordPlaceholder: '啶呧お啶ㄠぞ 啶ㄠく啶� 啶ぞ啶膏さ啶班啶� 啶啶粪啶熰た 啶曕ぐ啷囙',
+  passwordChangedTip: '啶嗋お啶曕ぞ 啶ぞ啶膏さ啶班啶� 啶膏か啶侧い啶距お啷傕ぐ啷嵿さ啶� 啶う啶� 啶︵た啶ぞ 啶椸く啶� 啶灌',
+  error: {
+    emailEmpty: '啶堗ぎ啷囙げ 啶い啶� 啶嗋さ啶多啶 啶灌',
+    emailInValid: '啶曕啶く啶� 啶忇 啶ぞ啶ㄠ啶� 啶堗ぎ啷囙げ 啶い啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    nameEmpty: '啶ㄠぞ啶� 啶嗋さ啶多啶 啶灌',
+    passwordEmpty: '啶ぞ啶膏さ啶班啶� 啶嗋さ啶多啶 啶灌',
+    passwordLengthInValid: '啶ぞ啶膏さ啶班啶� 啶曕ぎ 啶膏 啶曕ぎ 8 啶掂ぐ啷嵿ぃ啷嬥 啶曕ぞ 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶�',
+    passwordInvalid:
+      '啶ぞ啶膏さ啶班啶� 啶啶� 啶呧啷嵿し啶� 啶斷ぐ 啶呧啶� 啶灌啶ㄠ 啶氞ぞ啶灌た啶�, 啶斷ぐ 啶侧啶ぞ啶� 8 啶膏 啶呧ぇ啶苦 啶灌啶ㄠ 啶氞ぞ啶灌た啶�',
+    registrationNotAllowed: '啶栢ぞ啶むぞ 啶ㄠす啷�啶� 啶た啶侧ぞ. 啶班啶苦じ啷嵿啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕啶く啶� 啶膏た啶膏啶熰ぎ 啶忇ぁ啶た啶� 啶膏 啶膏啶ぐ啷嵿 啶曕ぐ啷囙啷�',
+  },
+  license: {
+    tip: 'Dify Community Edition 啶多啶班 啶曕ぐ啶ㄠ 啶膏 啶す啶侧, GitHub 啶ぐ',
+    link: '啶撪お啶�-啶膏啶班啶� 啶侧ぞ啶囙じ啷囙啶�',
+  },
+  join: '啶多ぞ啶た啶� 啶灌啶�',
+  joinTipStart: '啶嗋お啶曕 啶嗋ぎ啶傕い啷嵿ぐ啶苦い 啶曕ぐ啶む 啶灌啶�',
+  joinTipEnd: '啶熰啶� 啶ぐ Dify',
+  invalid: '啶侧た啶傕 啶膏ぎ啶距お啷嵿い 啶灌 啶椸く啶� 啶灌',
+  explore: 'Dify 啶曕ぞ 啶呧え啷嵿さ啷囙し啶� 啶曕ぐ啷囙',
+  activatedTipStart: '啶嗋お 啶多ぞ啶た啶� 啶灌 啶椸 啶灌啶�',
+  activatedTipEnd: '啶熰啶�',
+  activated: '啶呧が 啶膏ぞ啶囙え 啶囙え 啶曕ぐ啷囙',
+  adminInitPassword: '啶忇ぁ啶た啶� 啶啶班ぞ啶班啶た啶� 啶ぞ啶膏さ啶班啶�',
+  validate: '啶膏い啷嵿く啶距お啶苦い 啶曕ぐ啷囙',
+  checkCode: {
+    verify: '啶溹ぞ啶佮啶ㄠぞ',
+    verificationCode: '啶膏い啷嵿く啶距お啶� 啶曕啶�',
+    invalidCode: '啶呧ぎ啶距え啷嵿く 啶曕啶�',
+    useAnotherMethod: '啶曕た啶膏 啶呧え啷嵿く 啶掂た啶оた 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙',
+    emptyCode: '啶曕啶� 啶嗋さ啶多啶 啶灌',
+    didNotReceiveCode: '啶曕啶� 啶啶班ぞ啶啶� 啶ㄠす啷�啶� 啶灌啶�?',
+    resend: '啶啶溹啶�',
+    checkYourEmail: '啶呧お啶ㄠぞ 啶堗ぎ啷囙げ 啶溹ぞ啶傕啷囙',
+    validTime: '啶о啶ぞ啶� 啶班啷囙 啶曕た 啶曕啶� 5 啶た啶ㄠ 啶曕 啶侧た啶� 啶掂啶� 啶灌',
+    tips: '啶灌ぎ <strong>{{email}}</strong> 啶曕 啶忇 啶膏い啷嵿く啶距お啶� 啶曕啶� 啶啶溹い啷� 啶灌啶�',
+    verificationCodePlaceholder: '6-啶呧啶� 啶曕啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+  },
+  sendVerificationCode: '啶啶粪啶熰た 啶曕啶� 啶啶溹啶�',
+  or: '啶ㄠす啷�啶� 啶む',
+  continueWithCode: '啶曕啶� 啶曕 啶膏ぞ啶� 啶溹ぞ啶班 啶班啷囙',
+  resetPassword: '啶ぞ啶膏さ啶班啶� 啶班啶膏啶� 啶曕ぐ啷囙',
+  changePasswordBtn: '啶ぞ啶膏さ啶班啶� 啶膏啶� 啶曕ぐ啷囙',
+  setYourAccount: '啶呧お啶ㄠぞ 啶栢ぞ啶むぞ 啶膏啶� 啶曕ぐ啷囙',
+  useVerificationCode: '啶膏い啷嵿く啶距お啶� 啶曕啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙',
+  usePassword: '啶ぞ啶膏さ啶班啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙',
+  backToLogin: '啶侧啶椸た啶� 啶ぐ 啶掂ぞ啶じ 啶溹ぞ啶忇',
+  noLoginMethod: '啶啶班ぎ啶距ぃ啷�啶曕ぐ啶� 啶掂た啶оた 啶曕啶ㄠ啶ぜ啶苦啶� 啶ㄠす啷�啶� 啶曕 啶椸',
+  enterYourName: '啶曕啶く啶� 啶呧お啶ㄠぞ 啶夃お啶啶椸啶班啶むぞ 啶ㄠぞ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+  noLoginMethodTip: '啶啶班ぎ啶距ぃ啷�啶曕ぐ啶� 啶掂た啶оた 啶溹啶∴ぜ啶ㄠ 啶曕 啶侧た啶� 啶曕啶く啶� 啶膏た啶膏啶熰ぎ 啶掂啶さ啶膏啶ムぞ啶 啶膏 啶膏啶ぐ啷嵿 啶曕ぐ啷囙.',
+  resetPasswordDesc: '啶掂す 啶堗ぎ啷囙げ 啶熰ぞ啶囙お 啶曕ぐ啷囙 啶溹た啶膏啶� 啶夃お啶啶� 啶嗋お啶ㄠ Dify 啶ぐ 啶膏ぞ啶囙え 啶呧お 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕た啶ぞ 啶ムぞ 啶斷ぐ 啶灌ぎ 啶嗋お啶曕 啶忇 啶ぞ啶膏さ啶班啶� 啶班啶膏啶� 啶堗ぎ啷囙げ 啶啶溹啶傕啷囙イ',
+  withSSO: '啶忇じ啶忇じ啶� 啶曕 啶膏ぞ啶� 啶溹ぞ啶班 啶班啷囙',
+  back: '啶啶涏',
+  licenseInactive: '啶侧ぞ啶囙じ啷囙啶� 啶ㄠた啶粪啶曕啶班た啶�',
+  licenseExpired: '啶侧ぞ啶囙じ啷囙啶� 啶曕 啶膏ぎ啶� 啶膏啶ぞ 啶膏ぎ啶距お啷嵿い 啶灌 啶椸',
+  licenseLost: '啶侧ぞ啶囙じ啷囙啶� 啶栢 啶椸く啶�',
+  licenseLostTip: 'Dify 啶侧ぞ啶じ啷囙啶� 啶膏ぐ啷嵿さ啶� 啶膏 啶曕え啷囙啷嵿 啶曕ぐ啶ㄠ 啶啶� 啶掂た啶げ. Dify 啶曕ぞ 啶夃お啶啶� 啶溹ぞ啶班 啶班啶ㄠ 啶曕 啶侧た啶� 啶曕啶く啶� 啶呧お啶ㄠ 啶掂啶さ啶膏啶ムぞ啶 啶膏 啶膏啶ぐ啷嵿 啶曕ぐ啷囙.',
+  licenseInactiveTip: '啶嗋お啶曕 啶曕ぞ啶班啶じ啷嵿ぅ啶� 啶曕 啶侧た啶� 啶∴た啶ぞ啶� 啶忇啶熰ぐ啶啶班ぞ啶囙 啶侧ぞ啶囙じ啷囙啶� 啶ㄠた啶粪啶曕啶班た啶� 啶灌啷� 啶曕啶く啶� 啶∴た啶ぞ啶� 啶曕ぞ 啶夃お啶啶� 啶溹ぞ啶班 啶班啶ㄠ 啶曕 啶侧た啶� 啶呧お啶ㄠ 啶啶班ざ啶距じ啶� 啶膏 啶膏啶ぐ啷嵿 啶曕ぐ啷囙啷�',
+  licenseExpiredTip: '啶嗋お啶曕 啶曕ぞ啶班啶じ啷嵿ぅ啶� 啶曕 啶侧た啶� 啶∴た啶ぞ啶� 啶忇啶熰ぐ啶啶班ぞ啶囙 啶侧ぞ啶囙じ啷囙啶� 啶膏ぎ啶距お啷嵿い 啶灌 啶椸く啶� 啶灌啷� 啶曕啶く啶� 啶∴た啶ぞ啶� 啶曕ぞ 啶夃お啶啶� 啶溹ぞ啶班 啶班啶ㄠ 啶曕 啶侧た啶� 啶呧お啶ㄠ 啶啶班ざ啶距じ啶� 啶膏 啶膏啶ぐ啷嵿 啶曕ぐ啷囙啷�',
+}
+
+export default translation
diff --git a/i18n/hi-IN/plugin-tags.ts b/i18n/hi-IN/plugin-tags.ts
new file mode 100644
index 0000000..8ff3949
--- /dev/null
+++ b/i18n/hi-IN/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    social: '啶膏ぞ啶ぞ啶溹た啶�',
+    business: '啶掂啶さ啶膏ぞ啶�',
+    agent: '啶忇啷囙啶�',
+    design: '啶∴た啶溹ぜ啶距啶�',
+    education: '啶多た啶曕啶粪ぞ',
+    news: '啶膏ぎ啶距啶距ぐ',
+    productivity: '啶夃い啷嵿お啶距う啶曕い啶�',
+    weather: '啶啶膏ぎ',
+    utilities: '啶啶熰た啶侧た啶熰啶�',
+    image: '啶涏さ啶�',
+    search: '啶栢啶�',
+    videos: '啶掂啶∴た啶',
+    travel: '啶ぞ啶む啶班ぞ',
+    entertainment: '啶え啷嬥ぐ啶傕啶�',
+    other: '啶呧え啷嵿く',
+    medical: '啶氞た啶曕た啶む啶膏ぞ',
+    finance: '啶掂た啶む啶�',
+  },
+  searchTags: '啶栢啶� 啶熰啶�',
+  allTags: '啶膏き啷� 啶熰啶�',
+}
+
+export default translation
diff --git a/i18n/hi-IN/plugin.ts b/i18n/hi-IN/plugin.ts
new file mode 100644
index 0000000..075e9a1
--- /dev/null
+++ b/i18n/hi-IN/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    models: '啶啶∴げ啷嵿じ',
+    all: '啶膏き啷�',
+    bundles: '啶啶∴げ',
+    extensions: '啶忇啷嵿じ啶熰啶傕ざ啶ㄠ啶�',
+    tools: '啶夃お啶曕ぐ啶�',
+    agents: '啶忇啷囙啶� 啶班ぃ啶ㄠ啶むた啶ぞ啶�',
+  },
+  categorySingle: {
+    extension: '啶掂た啶膏啶むぞ啶�',
+    bundle: '啶啶∴げ',
+    tool: '啶夃お啶曕ぐ啶�',
+    agent: '啶忇啷囙啶� 啶班ぃ啶ㄠ啶むた',
+    model: '啶啶∴げ',
+  },
+  list: {
+    source: {
+      marketplace: '啶ぞ啶班啶曕啶熰お啷嵿げ啷囙じ 啶膏 啶囙啶膏啶熰啶� 啶曕ぐ啷囙',
+      github: '啶椸た啶熰す啶� 啶膏 啶囙啶膏啶熰啶� 啶曕ぐ啷囙',
+      local: '啶膏啶ムぞ啶ㄠ啶� 啶啶曕啶� 啶ぜ啶距啶� 啶膏 啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙',
+    },
+    notFound: '啶曕啶� 啶啶侧啶囙え 啶ㄠす啷�啶� 啶た啶侧ぞ',
+    noInstalled: '啶曕啶� 啶啶侧啶囙え 啶膏啶ムぞ啶た啶� 啶ㄠす啷�啶� 啶灌啶�',
+  },
+  source: {
+    github: '啶椸た啶熰す啶�',
+    local: '啶膏啶ムぞ啶ㄠ啶� 啶啶曕啶� 啶ぜ啶距啶�',
+    marketplace: '啶ぞ啶溹ぞ啶�',
+  },
+  detailPanel: {
+    categoryTip: {
+      github: '啶椸た啶熰す啶� 啶膏 啶膏啶ムぞ啶た啶� 啶曕た啶ぞ 啶椸く啶�',
+      local: '啶膏啶ムぞ啶ㄠ啶� 啶啶侧啶囙え',
+      marketplace: '啶ぞ啶班啶曕啶熰お啷嵿げ啷囙じ 啶膏 啶膏啶ムぞ啶た啶� 啶曕た啶ぞ 啶椸く啶�',
+      debugging: '啶∴た啶啶苦啶� 啶啶侧啶囙え',
+    },
+    operation: {
+      info: '啶啶侧啶囙え 啶溹ぞ啶ㄠ啶距ぐ啷�',
+      remove: '啶灌啶距啶�',
+      checkUpdate: '啶呧お啶∴啶� 啶溹ぞ啶傕啷囙',
+      viewDetail: '啶掂た啶掂ぐ啶� 啶︵啶栢啶�',
+      install: '啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙',
+      detail: '啶掂た啶掂ぐ啶�',
+      update: '啶呧お啶∴啶�',
+    },
+    toolSelector: {
+      uninstalledTitle: '啶夃お啶曕ぐ啶� 啶膏啶ムぞ啶た啶� 啶ㄠす啷�啶� 啶灌',
+      auto: '啶膏啶掂啶距げ啶苦い',
+      uninstalledLink: '啶啶侧啶囙え啷嵿じ 啶啶� 啶啶班が啶傕ぇ啶苦い 啶曕ぐ啷囙',
+      unsupportedTitle: '啶呧じ啶ぐ啷嵿ぅ啶苦い 啶曕啶班た啶ぞ',
+      unsupportedContent: '啶膏啶ムぞ啶た啶� 啶啶侧啶囙え 啶膏啶膏啶曕ぐ啶� 啶す 啶曕啶班た啶ぞ 啶啶班う啶距え 啶ㄠす啷�啶� 啶曕ぐ啶むぞ 啶灌啷�',
+      descriptionLabel: '啶夃お啶曕ぐ啶� 啶曕ぞ 啶掂た啶掂ぐ啶�',
+      unsupportedContent2: '啶膏啶膏啶曕ぐ啶� 啶う啶侧え啷� 啶曕 啶侧た啶� 啶曕啶侧た啶� 啶曕ぐ啷囙啷�',
+      placeholder: '啶忇 啶夃お啶曕ぐ啶� 啶氞啶ㄠ啶�...',
+      title: '啶夃お啶曕ぐ啶� 啶溹啶∴ぜ啷囙',
+      toolLabel: '啶夃お啶曕ぐ啶�',
+      params: '啶曕ぞ啶班ぃ 啶ㄠた啶班啶оぞ啶班ぃ 啶曕啶ㄠ啶ぜ啶苦',
+      empty: '啶夃お啶曕ぐ啶� 啶溹啶∴ぜ啶ㄠ 啶曕 啶侧た啶� \'+\' 啶啶� 啶ぐ 啶曕啶侧た啶� 啶曕ぐ啷囙啷� 啶嗋お 啶曕 啶夃お啶曕ぐ啶� 啶溹啶∴ぜ 啶膏啶む 啶灌啶傕イ',
+      settings: '啶夃お啶啶椸啶班啶むぞ 啶膏啶熰た啶傕啷嵿じ',
+      uninstalledContent: '啶す 啶啶侧啶囙え 啶膏啶ムぞ啶ㄠ啶�/啶椸た啶熰す啶� 啶班た啶啶溹た啶熰ぐ啷� 啶膏 啶膏啶ムぞ啶た啶� 啶曕た啶ぞ 啶椸く啶� 啶灌啷� 啶曕啶く啶� 啶膏啶ムぞ啶え啶� 啶曕 啶ぞ啶� 啶夃お啶啶� 啶曕ぐ啷囙啷�',
+      paramsTip2: '啶溹が \'啶膏啶掂啶距げ啶苦い\' 啶啶� 啶灌啶むぞ 啶灌, 啶む 啶∴た啶ぜ啷夃げ啷嵿 啶ぞ啶� 啶曕ぞ 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷�',
+      descriptionPlaceholder: '啶夃お啶曕ぐ啶� 啶曕 啶夃う啷嵿う啷囙ざ啷嵿く 啶曕ぞ 啶膏啶曕啶粪た啶啶� 啶掂た啶掂ぐ啶�, 啶溹啶膏, 啶曕た啶膏 啶掂た啶多啶� 啶膏啶ムぞ啶� 啶曕 啶侧た啶� 啶むぞ啶ぎ啶距え 啶啶班ぞ啶啶� 啶曕ぐ啶ㄠぞ啷�',
+      paramsTip1: '啶忇げ啶忇げ啶忇ぎ 啶呧え啷佮ぎ啶距え 啶啶班ぞ啶啶熰ぐ 啶曕 啶ㄠた啶啶む啶班た啶� 啶曕ぐ啶むぞ 啶灌啷�',
+    },
+    switchVersion: '啶膏啶掂た啶� 啶膏啶膏啶曕ぐ啶�',
+    endpointModalDesc: '啶忇 啶ぞ啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶灌啶ㄠ 啶曕 啶ぞ啶�, 啶啶侧啶囙え 啶︵啶掂ぞ啶班ぞ API 啶忇啶∴お啷夃啶傕啷嵿じ 啶曕 啶ぞ啶о啶ぎ 啶膏 啶啶班う啶距え 啶曕 啶椸 啶膏啶掂た啶оぞ啶撪 啶曕ぞ 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌啷�',
+    actionNum: '{{num}} {{action}} 啶多ぞ啶た啶� 啶灌',
+    endpointDeleteTip: '啶忇啶∴お啷夃啶傕 啶灌啶距啶�',
+    endpointsDocLink: '啶︵じ啷嵿い啶距さ啷囙啶� 啶︵啶栢啶�',
+    disabled: '啶呧啷嵿し啶�',
+    modelNum: '{{num}} 啶啶∴げ 啶多ぞ啶た啶� 啶灌啶�',
+    endpoints: '啶忇啶∴お啷夃啶傕啷嵿じ',
+    endpointDeleteContent: '啶曕啶ぞ 啶嗋お {{name}} 啶曕 啶灌啶距え啶� 啶氞ぞ啶灌啶傕啷�?',
+    serviceOk: '啶膏啶掂ぞ 啶犩啶� 啶灌',
+    configureTool: '啶夃お啶曕ぐ啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+    configureApp: '啶愢お 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+    endpointDisableContent: '啶曕啶ぞ 啶嗋お {{name}} 啶曕 啶呧啷嵿し啶� 啶曕ぐ啶ㄠぞ 啶氞ぞ啶灌啶傕啷�?',
+    endpointDisableTip: '啶忇啶∴お啷夃啶傕 啶呧啷嵿し啶� 啶曕ぐ啷囙',
+    configureModel: '啶啶∴げ 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+    endpointsEmpty: '啶忇 啶忇啶∴お啷夃啶傕 啶溹啶∴ぜ啶ㄠ 啶曕 啶侧た啶� \'+\' 啶啶� 啶ぐ 啶曕啶侧た啶� 啶曕ぐ啷囙',
+    endpointModalTitle: '啶忇啶∴お啷夃啶傕 啶膏啶熰啶� 啶曕ぐ啷囙',
+    strategyNum: '{{num}} {{啶班ぃ啶ㄠ啶むた}} 啶多ぞ啶た啶�',
+    endpointsTip: '啶す 啶啶侧啶囙え 啶忇啶∴お啷夃啶傕啷嵿じ 啶曕 啶ぞ啶о啶ぎ 啶膏 啶掂た啶多た啶粪啶� 啶曕ぞ啶班啶啷嵿し啶い啶距啶� 啶啶班う啶距え 啶曕ぐ啶むぞ 啶灌, 啶斷ぐ 啶嗋お 啶掂ぐ啷嵿い啶ぞ啶� 啶曕ぞ啶班啶啷嵿し啷囙い啷嵿ぐ 啶曕 啶侧た啶� 啶曕 啶忇啶∴お啷夃啶傕 啶膏啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+  },
+  debugInfo: {
+    viewDocs: '啶︵じ啷嵿い啶距さ啷囙啶� 啶︵啶栢啶�',
+    title: '啶∴た啶啶苦啶�',
+  },
+  privilege: {
+    whoCanDebug: '啶曕啶� 啶啶侧啶囙え啷嵿じ 啶曕 啶∴た啶 啶曕ぐ 啶膏啶むぞ 啶灌?',
+    whoCanInstall: '啶曕啶� 啶啶侧啶囙え啷嵿じ 啶曕 啶膏啶ムぞ啶た啶� 啶斷ぐ 啶啶班が啶傕ぇ啶苦い 啶曕ぐ 啶膏啶むぞ 啶灌?',
+    noone: '啶曕啶� 啶ㄠす啷�啶�',
+    everyone: '啶膏き啷�',
+    title: '啶啶侧啶囙え 啶啶班ぞ啶ムぎ啶苦啶むぞ啶忇',
+    admins: '啶掂啶さ啶膏啶ムぞ啶',
+  },
+  pluginInfoModal: {
+    repository: '啶啶∴ぞ啶�',
+    packageName: '啶啶曕啶�',
+    release: '啶班た啶灌ぞ啶�',
+    title: '啶啶侧啶囙え 啶溹ぞ啶ㄠ啶距ぐ啷�',
+  },
+  action: {
+    pluginInfo: '啶啶侧啶囙え 啶溹ぞ啶ㄠ啶距ぐ啷�',
+    checkForUpdates: '啶呧お啶∴啶� 啶曕 啶侧た啶� 啶溹ぞ啶傕啷囙',
+    deleteContentLeft: '啶曕啶ぞ 啶嗋お 啶灌啶距え啶� 啶氞ぞ啶灌啶傕啷�',
+    deleteContentRight: '啶啶侧啶囙え?',
+    usedInApps: '啶す 啶啶侧啶囙え {{num}} 啶愢お啷嵿じ 啶啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ 啶班す啶� 啶灌啷�',
+    delete: '啶啶侧啶囙え 啶灌啶距啶�',
+  },
+  installModal: {
+    labels: {
+      repository: '啶啶∴ぞ啶�',
+      package: '啶啶曕啶�',
+      version: '啶膏啶膏啶曕ぐ啶�',
+    },
+    uploadFailed: '啶呧お啶侧啶� 啶掂た啶げ',
+    next: '啶呧啶侧ぞ',
+    cancel: '啶班う啷嵿う 啶曕ぐ啷囙',
+    pluginLoadErrorDesc: '啶す 啶啶侧啶囙え 啶膏啶ムぞ啶た啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶溹ぞ啶忇啶�',
+    back: '啶啶涏',
+    installComplete: '啶膏啶ムぞ啶え啶� 啶啶班啶�',
+    installPlugin: '啶啶侧啶囙え 啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙',
+    readyToInstallPackages: '啶ㄠた啶啶ㄠげ啶苦啶苦い {{num}} 啶啶侧啶囙え啷嵿じ 啶膏啶ムぞ啶た啶� 啶曕ぐ啶ㄠ 啶掂ぞ啶侧 啶灌啶�',
+    install: '啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙',
+    close: '啶曕ぐ啷�啶�',
+    uploadingPackage: '{{packageName}} 啶呧お啶侧啶� 啶灌 啶班す啶� 啶灌...',
+    installing: '啶膏啶ムぞ啶た啶� 啶曕ぐ 啶班す啶� 啶灌...',
+    installedSuccessfully: '啶膏啶ムぞ啶え啶� 啶膏か啶�',
+    dropPluginToInstall: '啶す啶距 啶啶侧啶囙え 啶啶曕啶� 啶∴啶班啶� 啶曕ぐ啷囙 啶むぞ啶曕た 啶囙じ啷� 啶膏啶ムぞ啶た啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啷�',
+    readyToInstallPackage: '啶ㄠた啶啶ㄠげ啶苦啶苦い 啶啶侧啶囙え 啶膏啶ムぞ啶た啶� 啶曕ぐ啶ㄠ 啶掂ぞ啶侧 啶灌啶�',
+    pluginLoadError: '啶啶侧啶囙え 啶侧啶� 啶む啶班啶熰た',
+    installFailed: '啶膏啶ムぞ啶え啶� 啶掂た啶げ 啶灌 啶椸',
+    readyToInstall: '啶ㄠた啶啶ㄠげ啶苦啶苦い 啶啶侧啶囙え 啶膏啶ムぞ啶た啶� 啶曕ぐ啶ㄠ 啶掂ぞ啶侧 啶灌啶�',
+    installFailedDesc: '啶啶侧啶囙え 啶膏啶ムぞ啶た啶� 啶曕ぐ啶ㄠ 啶啶� 啶掂た啶げ 啶班す啶距イ',
+    installedSuccessfullyDesc: '啶啶侧啶囙え 啶膏か啶侧い啶距お啷傕ぐ啷嵿さ啶� 啶膏啶ムぞ啶た啶� 啶曕た啶ぞ 啶椸く啶� 啶灌啷�',
+    fromTrustSource: '啶曕啶く啶� 啶膏啶ㄠた啶多啶氞た啶� 啶曕ぐ啷囙 啶曕た 啶嗋お 啶曕啶掂げ 啶忇 <trustSource>啶掂た啶多啶掂じ啶ㄠ啶� 啶膏啶班啶�</trustSource> 啶膏 啶啶侧啶囙え啷嵿じ 啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙啷�',
+  },
+  installFromGitHub: {
+    gitHubRepo: '啶椸た啶熰す啶� 啶班た啶啶溹た啶熰ぐ啷�',
+    selectPackage: '啶啶曕啶� 啶氞啶ㄠ啶�',
+    selectVersionPlaceholder: '啶曕啶く啶� 啶忇 啶膏啶膏啶曕ぐ啶� 啶氞啶ㄠ啶�',
+    selectVersion: '啶膏啶膏啶曕ぐ啶� 啶氞啶ㄠ啶�',
+    updatePlugin: '啶椸た啶熰す啶� 啶膏 啶啶侧啶囙え 啶呧お啶∴啶� 啶曕ぐ啷囙',
+    installPlugin: 'GitHub 啶膏 啶啶侧啶囙え 啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙',
+    selectPackagePlaceholder: '啶曕啶く啶� 啶忇 啶啶曕啶� 啶氞啶ㄠ啶�',
+    installNote: '啶曕啶く啶� 啶膏啶ㄠた啶多啶氞た啶� 啶曕ぐ啷囙 啶曕た 啶嗋お 啶曕啶掂げ 啶忇 啶掂た啶多啶掂じ啶ㄠ啶� 啶膏啶班啶� 啶膏 啶啶侧啶囙え啷嵿じ 啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙啷�',
+    installedSuccessfully: '啶膏啶ムぞ啶え啶� 啶膏か啶�',
+    installFailed: '啶膏啶ムぞ啶え啶� 啶掂た啶げ 啶灌 啶椸',
+    uploadFailed: '啶呧お啶侧啶� 啶掂た啶げ',
+  },
+  upgrade: {
+    title: '啶啶侧啶囙え 啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙',
+    close: '啶曕ぐ啷�啶�',
+    upgrade: '啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙',
+    upgrading: '啶膏啶ムぞ啶た啶� 啶曕ぐ 啶班す啶� 啶灌...',
+    successfulTitle: '啶膏啶ムぞ啶え啶� 啶膏か啶�',
+    description: '啶ㄠた啶啶ㄠげ啶苦啶苦い 啶啶侧啶囙え 啶膏啶ムぞ啶た啶� 啶曕ぐ啶ㄠ 啶掂ぞ啶侧 啶灌啶�',
+    usedInApps: '{{num}} 啶愢お啷嵿じ 啶啶� 啶夃お啶啶� 啶曕た啶ぞ 啶椸く啶�',
+  },
+  error: {
+    inValidGitHubUrl: '啶呧ぎ啶距え啷嵿く GitHub URL啷� 啶曕啶く啶� 啶ㄠた啶啶ㄠげ啶苦啶苦い 啶啶班ぞ啶班啶� 啶啶� 啶忇 啶ぞ啶ㄠ啶� URL 啶︵ぐ啷嵿 啶曕ぐ啷囙: https://github.com/owner/repo',
+    noReleasesFound: '啶曕啶� 啶班た啶侧啶溹ぜ 啶ㄠす啷�啶� 啶た啶侧啷� 啶曕啶く啶� GitHub 啶班た啶啶溹た啶熰ぐ啷� 啶ぞ 啶囙え啶啶� URL 啶曕 啶溹ぞ啶傕 啶曕ぐ啷囙啷�',
+    fetchReleasesError: '啶班た啶侧啶溹ぜ 啶啶班ぞ啶啶� 啶曕ぐ啶ㄠ 啶啶� 啶呧じ啶ぐ啷嵿ぅ啷� 啶曕啶く啶� 啶ぞ啶� 啶啶� 啶た啶� 啶膏 啶啶班く啶距じ 啶曕ぐ啷囙啷�',
+  },
+  marketplace: {
+    sortOption: {
+      mostPopular: '啶膏が啶膏 啶侧啶曕お啷嵿ぐ啶苦く',
+      newlyReleased: '啶ㄠさ啷�啶ㄠい啶� 啶溹ぞ啶班 啶曕た啶ぞ 啶椸く啶�',
+      firstReleased: '啶す啶侧 啶ぞ啶� 啶溹ぞ啶班 啶曕た啶ぞ 啶椸く啶�',
+      recentlyUpdated: '啶灌ぞ啶� 啶灌 啶啶� 啶呧お啶∴啶� 啶曕た啶ぞ 啶椸く啶�',
+    },
+    pluginsResult: '{{num}} 啶ぐ啶苦ぃ啶距ぎ',
+    empower: '啶呧お啶ㄠ 啶忇啶� 啶掂た啶曕ぞ啶� 啶曕 啶膏ざ啶曕啶� 啶え啶距啶�',
+    noPluginFound: '啶曕啶� 啶啶侧啶囙え 啶ㄠす啷�啶� 啶た啶侧ぞ',
+    viewMore: '啶斷ぐ 啶︵啶栢啶�',
+    moreFrom: '啶ぞ啶班啶曕啶熰お啷嵿げ啷囙じ 啶膏 啶呧ぇ啶苦',
+    and: '啶斷ぐ',
+    difyMarketplace: '啶∴た啶ぞ啶� 啶ぞ啶班啶曕啶熰お啷嵿げ啷囙じ',
+    sortBy: '啶曕ぞ啶侧ぞ 啶多す啶�',
+    discover: '啶栢啶溹啶�',
+    partnerTip: 'Dify 啶ぞ啶椸啶︵ぞ啶� 啶︵啶掂ぞ啶班ぞ 啶膏い啷嵿く啶距お啶苦い',
+    verifiedTip: '啶∴た啶ぞ啶� 啶︵啶掂ぞ啶班ぞ 啶膏い啷嵿く啶距お啶苦い',
+  },
+  task: {
+    clearAll: '啶膏き啷� 啶膏ぞ啶� 啶曕ぐ啷囙',
+    installing: '{{installingLength}} 啶啶侧啶囙え啷嵿じ 啶膏啶ムぞ啶た啶� 啶曕ぐ 啶班す啷� 啶灌啶�, 0 啶啶班ぞ 啶灌啶嗋イ',
+    installError: '{{errorLength}} 啶啶侧啶囙え啷嵿じ 啶膏啶ムぞ啶た啶� 啶曕ぐ啶ㄠ 啶啶� 啶掂た啶げ 啶班す啷�, 啶︵啶栢え啷� 啶曕 啶侧た啶� 啶曕啶侧た啶� 啶曕ぐ啷囙',
+    installedError: '{{errorLength}} 啶啶侧啶囙え啷嵿じ 啶膏啶ムぞ啶た啶� 啶曕ぐ啶ㄠ 啶啶� 啶掂た啶げ 啶班す啷�',
+    installingWithError: '{{installingLength}} 啶啶侧啶囙え啷嵿じ 啶膏啶ムぞ啶た啶� 啶曕ぐ 啶班す啷� 啶灌啶�, {{successLength}} 啶膏か啶�, {{errorLength}} 啶掂た啶げ',
+    installingWithSuccess: '{{installingLength}} 啶啶侧啶囙え啷嵿じ 啶膏啶ムぞ啶た啶� 啶曕ぐ 啶班す啷� 啶灌啶�, {{successLength}} 啶膏か啶侧イ',
+  },
+  installFrom: '啶膏 啶囙啶膏啶熰啶� 啶曕ぐ啷囙',
+  fromMarketplace: '啶ぞ啶班啶曕啶熰お啷嵿げ啷囙じ 啶膏',
+  searchPlugins: '啶栢啶� 啶啶侧啶囙え啷嵿じ',
+  install: '{{num}} 啶囙啶膏啶熰啶侧啶多え',
+  submitPlugin: '啶啶侧啶囙え 啶膏が啶た啶� 啶曕ぐ啷囙',
+  allCategories: '啶膏き啷� 啶多啶班啶`た啶ぞ啶�',
+  search: '啶栢啶�',
+  searchTools: '啶栢啶� 啶夃お啶曕ぐ啶�...',
+  searchCategories: '啶栢啶� 啶多啶班啶`た啶ぞ啶�',
+  installAction: '啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙',
+  searchInMarketplace: '啶ぞ啶班啶曕啶熰お啷嵿げ啷囙じ 啶啶� 啶栢啶溹啶�',
+  installPlugin: '啶啶侧啶囙え 啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙',
+  findMoreInMarketplace: '啶ぞ啶班啶曕啶熰お啷嵿げ啷囙じ 啶啶� 啶斷ぐ 啶栢啶溹啶�',
+  endpointsEnabled: '{{num}} 啶忇啶∴お啷夃啶傕啷嵿じ 啶曕 啶膏啶� 啶膏啷嵿し啶� 啶曕た啶� 啶椸',
+  from: '啶膏',
+  metadata: {
+    title: '啶啶侧啶囙え啷嵿じ',
+  },
+  difyVersionNotCompatible: '啶掂ぐ啷嵿い啶ぞ啶� 啶∴た啶ぞ啶� 啶膏啶膏啶曕ぐ啶� 啶囙じ 啶啶侧啶囙え 啶曕 啶膏ぞ啶� 啶膏啶椸い 啶ㄠす啷�啶� 啶灌, 啶曕啶く啶� 啶嗋さ啶多啶 啶ㄠ啶啶ㄠい啶� 啶膏啶膏啶曕ぐ啶� 啶啶� 啶呧お啶椸啶班啶� 啶曕ぐ啷囙: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/hi-IN/register.ts b/i18n/hi-IN/register.ts
new file mode 100644
index 0000000..e2410dd
--- /dev/null
+++ b/i18n/hi-IN/register.ts
@@ -0,0 +1,3 @@
+const translation = {}
+
+export default translation
diff --git a/i18n/hi-IN/run-log.ts b/i18n/hi-IN/run-log.ts
new file mode 100644
index 0000000..c53d4a5
--- /dev/null
+++ b/i18n/hi-IN/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: '啶囙え啶啶�',
+  result: '啶ㄠい啷�啶溹ぞ',
+  detail: '啶掂た啶掂ぐ啶�',
+  tracing: '啶熰啶班啶膏た啶傕',
+  resultPanel: {
+    status: '啶膏啶ムた啶むた',
+    time: '啶膏ぎ啶� 啶曕 啶呧さ啶оた',
+    tokens: '啶曕啶� 啶熰啶曕え啷嵿じ',
+  },
+  meta: {
+    title: '啶啶熰ぞ啶∴ぞ啶熰ぞ',
+    status: '啶膏啶ムた啶むた',
+    version: '啶掂ぐ啷嵿啶监え',
+    executor: '啶忇啷嵿啶监啶曕啶啶熰ぐ',
+    startTime: '啶多啶班啶嗋い 啶曕 啶膏ぎ啶�',
+    time: '啶膏ぎ啶� 啶曕 啶呧さ啶оた',
+    tokens: '啶曕啶� 啶熰啶曕え啷嵿じ',
+    steps: '啶氞ぞ啶侧ぞ啶ㄠ 啶曕 啶氞ぐ啶�',
+  },
+  resultEmpty: {
+    title: '啶囙じ 啶班え 啶啶� 啶膏た啶班啶� JSON 啶ぞ啶班啶啶� 啶曕ぞ 啶ㄠい啷�啶溹ぞ 啶灌,',
+    tipLeft: '啶侧啶栢 ',
+    link: '啶掂た啶掂ぐ啶� 啶啶ㄠげ',
+    tipRight: ' 啶︵啶栢啶傕イ',
+  },
+  actionLogs: '啶曕啶班た啶ぞ 啶侧啶�',
+  circularInvocationTip: '啶掂ぐ啷嵿い啶ぞ啶� 啶曕ぞ啶班啶お啷嵿ぐ啶掂ぞ啶� 啶啶� 啶夃お啶曕ぐ啶`啶�/啶ㄠ啶∴啶� 啶曕ぞ 啶掂啶む啶むぞ啶曕ぞ啶� 啶嗋す啷嵿さ啶距え 啶灌啷�',
+}
+
+export default translation
diff --git a/i18n/hi-IN/share-app.ts b/i18n/hi-IN/share-app.ts
new file mode 100644
index 0000000..e0296fd
--- /dev/null
+++ b/i18n/hi-IN/share-app.ts
@@ -0,0 +1,85 @@
+const translation = {
+  common: {
+    welcome: '啶嗋お啶曕ぞ 啶膏啶掂ぞ啶椸い 啶灌',
+    appUnavailable: '啶愢お 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶灌',
+    appUnknownError: '啶呧啷嵿啶距い 啶む啶班啶熰た, 啶曕啶く啶� 啶啶ㄠ 啶啶班く啶距じ 啶曕ぐ啷囙',
+    // @ts-expect-error TODO: fix this
+
+    appUnknownError: '啶愢お 啶呧え啷佮お啶侧が啷嵿ぇ 啶灌',
+  },
+  chat: {
+    newChat: '啶ㄠく啶� 啶氞啶�',
+    pinnedTitle: '啶た啶� 啶曕た啶ぞ 啶椸く啶�',
+    unpinnedTitle: '啶氞啶�',
+    newChatDefaultName: '啶ㄠく啶� 啶膏啶掂ぞ啶�',
+    resetChat: '啶膏啶掂ぞ啶� 啶班啶膏啶� 啶曕ぐ啷囙',
+    poweredBy: '啶膏啶氞ぞ啶侧た啶� 啶灌',
+    prompt: '啶啶班啶啶啶�',
+    privatePromptConfigTitle: '啶膏啶掂ぞ啶� 啶膏啶熰た啶傕啷嵿じ',
+    publicPromptConfigTitle: '啶啶班ぞ啶班啶た啶� 啶啶班啶啶啶�',
+    configStatusDes: '啶多啶班 啶曕ぐ啶ㄠ 啶膏 啶す啶侧, 啶嗋お 啶膏啶掂ぞ啶� 啶膏啶熰た啶傕啷嵿じ 啶曕 啶う啶� 啶膏啶む 啶灌啶�',
+    configDisabled:
+      '啶囙じ 啶膏い啷嵿ぐ 啶曕 啶侧た啶� 啶た啶涏げ啷� 啶膏い啷嵿ぐ 啶曕 啶膏啶熰た啶傕啷嵿じ 啶曕ぞ 啶夃お啶啶� 啶曕た啶ぞ 啶椸く啶� 啶灌啷�',
+    startChat: '啶氞啶� 啶多啶班 啶曕ぐ啷囙',
+    privacyPolicyLeft: '啶曕啶く啶� 啶あ啶监啶� ',
+    privacyPolicyMiddle: '啶椸啶え啷�啶い啶� 啶ㄠ啶むた',
+    privacyPolicyRight: ' 啶愢お 啶∴啶掂げ啶ぐ 啶︵啶掂ぞ啶班ぞ 啶啶班う啶距え 啶曕 啶椸啷�',
+    deleteConversation: {
+      title: '啶膏啶掂ぞ啶� 啶灌啶距啶�',
+      content: '啶曕啶ぞ 啶嗋お 啶囙じ 啶膏啶掂ぞ啶� 啶曕 啶灌啶距え啶� 啶氞ぞ啶灌い啷� 啶灌啶�?',
+    },
+    tryToSolve: '啶膏ぎ啶距ぇ啶距え 啶曕ぐ啶ㄠ 啶曕ぞ 啶啶班く啶距じ 啶曕ぐ啷囙',
+    temporarySystemIssue: '啶呧き啷� 啶膏た啶膏啶熰ぎ 啶啶� 啶膏ぎ啶膏啶ぞ 啶灌, 啶曕啶く啶� 啶啶ㄠ 啶啶班く啶距じ 啶曕ぐ啷囙啷�',
+    expand: '啶掂た啶膏啶むぞ啶� 啶曕ぐ啷囙',
+    collapse: '啶膏啶曕啶氞た啶� 啶曕ぐ啷囙',
+    viewChatSettings: '啶氞啶� 啶膏啶熰た啶傕啷嵿じ 啶︵啶栢啶�',
+    chatSettingsTitle: '啶ㄠく啶� 啶氞啶� 啶膏啶熰啶�',
+    chatFormTip: '啶氞啶� 啶多啶班 啶灌啶ㄠ 啶曕 啶ぞ啶� 啶氞啶� 啶膏啶熰た啶傕啷嵿じ 啶曕 啶膏啶多啶оた啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ啷�',
+    newChatTip: '啶す啶侧 啶膏 啶灌 啶忇 啶ㄠ 啶氞啶� 啶啶�',
+  },
+  generation: {
+    tabs: {
+      create: '啶忇 啶ぞ啶� 啶氞げ啶距啶�',
+      batch: '啶啶� 啶氞げ啶距啶�',
+      saved: '啶膏す啷囙啶� 啶椸く啶�',
+    },
+    savedNoData: {
+      title: '啶嗋お啶ㄠ 啶呧き啷� 啶む 啶曕啶� 啶ぐ啶苦ぃ啶距ぎ 啶ㄠす啷�啶� 啶膏す啷囙啶� 啶灌!',
+      description:
+        '啶膏ぞ啶啷嵿ぐ啷� 啶え啶距え啶� 啶多啶班 啶曕ぐ啷囙 啶斷ぐ 啶す啶距 啶呧お啶ㄠ 啶膏す啷囙啷� 啶椸 啶ぐ啶苦ぃ啶距ぎ 啶︵啶栢啶傕イ',
+      startCreateContent: '啶膏ぞ啶啷嵿ぐ啷� 啶え啶距え啶� 啶多啶班 啶曕ぐ啷囙',
+    },
+    title: '啶忇啶� 啶啶班啶`い啶�',
+    queryTitle: '啶啶班ざ啷嵿え 啶膏ぞ啶啷嵿ぐ啷�',
+    completionResult: '啶啶班啶`い啶� 啶ぐ啶苦ぃ啶距ぎ',
+    queryPlaceholder: '啶呧お啶ㄠぞ 啶啶班ざ啷嵿え 啶侧た啶栢啶�...',
+    run: '啶氞ぞ啶侧 啶曕ぐ啷囙',
+    copy: '啶曕啶 啶曕ぐ啷囙',
+    resultTitle: '啶忇啶� 啶啶班啶`い啶�',
+    noData: '啶忇啶� 啶嗋お啶曕 啶す啶距 啶氞ぞ啶灌た啶忇イ',
+    csvUploadTitle: '啶呧お啶ㄠ 啶膏啶忇じ啶掂 啶ぜ啶距啶� 啶す啶距 啶∴啶班啶� 啶斷ぐ 啶∴啶班啶� 啶曕ぐ啷囙, 啶ぞ ',
+    browse: '啶啶班ぞ啶夃啶� 啶曕ぐ啷囙',
+    csvStructureTitle: '啶膏啶忇じ啶掂 啶ぜ啶距啶� 啶曕 啶ㄠた啶啶ㄠげ啶苦啶苦い 啶膏啶班啶ㄠぞ 啶曕ぞ 啶ぞ啶侧え 啶曕ぐ啶ㄠぞ 啶氞ぞ啶灌た啶�:',
+    downloadTemplate: '啶熰啶啶げ啷囙 啶す啶距 啶∴ぞ啶夃え啶侧啶� 啶曕ぐ啷囙',
+    field: '啶曕啶粪啶む啶�',
+    batchFailed: {
+      info: '{{num}} 啶掂た啶げ 啶曕ぞ啶班啶ぞ啶ㄠ啶掂く啶�',
+      retry: '啶啶ㄠ 啶啶班く啶距じ 啶曕ぐ啷囙',
+      outputPlaceholder: '啶曕啶� 啶嗋啶熰お啷佮 啶膏ぞ啶啷嵿ぐ啷� 啶ㄠす啷�啶�',
+    },
+    errorMsg: {
+      empty: '啶曕啶く啶� 啶呧お啶侧啶� 啶曕た啶� 啶椸 啶ぜ啶距啶� 啶啶� 啶膏ぞ啶啷嵿ぐ啷� 啶ぐ啷囙啷�',
+      fileStructNotMatch:
+        '啶呧お啶侧啶� 啶曕 啶椸 啶膏啶忇じ啶掂 啶ぜ啶距啶� 啶膏啶班啶ㄠぞ 啶膏 啶啶� 啶ㄠす啷�啶� 啶栢ぞ啶む 啶灌啷�',
+      emptyLine: '啶班 {{rowIndex}} 啶栢ぞ啶侧 啶灌',
+      invalidLine: '啶班 {{rowIndex}}: {{varName}} 啶ぞ啶� 啶栢ぞ啶侧 啶ㄠす啷�啶� 啶灌 啶膏啶むぞ',
+      moreThanMaxLengthLine:
+        '啶班 {{rowIndex}}: {{varName}} 啶ぞ啶� {{maxLength}} 啶掂ぐ啷嵿ぃ啷嬥 啶膏 啶呧ぇ啶苦 啶ㄠす啷�啶� 啶灌 啶膏啶むぞ',
+      atLeastOne: '啶曕啶く啶� 啶呧お啶侧啶� 啶曕 啶椸 啶ぜ啶距啶� 啶啶� 啶曕ぎ 啶膏 啶曕ぎ 啶忇 啶啶曕啶むた 啶ぐ啷囙啷�',
+    },
+    execution: '啶呧え啷佹墽琛�',
+    executions: '{{num}} 啶ぞ啶佮じ啷�',
+  },
+}
+
+export default translation
diff --git a/i18n/hi-IN/time.ts b/i18n/hi-IN/time.ts
new file mode 100644
index 0000000..72f6cd5
--- /dev/null
+++ b/i18n/hi-IN/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Fri: '啶多啶曕啶班さ啶距ぐ',
+    Tue: '啶啶椸げ啶掂ぞ啶�',
+    Sun: '啶膏啶班啶�',
+    Wed: '啶啶оさ啶距ぐ',
+    Sat: '啶多え啶苦さ啶距ぐ',
+    Mon: '啶啶�',
+    Thu: '啶椸啶班啶掂ぞ啶�',
+  },
+  months: {
+    July: '啶溹啶侧ぞ啶�',
+    August: '啶呧啶膏啶�',
+    September: '啶膏た啶む啶ぐ',
+    March: '啶ぞ啶班啶�',
+    May: '啶',
+    October: '啶呧啷嵿啷傕が啶�',
+    April: '啶呧お啷嵿ぐ啷堗げ',
+    December: '啶︵た啶膏啶ぐ',
+    February: '啶ぐ啶掂ぐ啷�',
+    June: '啶溹啶�',
+    November: '啶ㄠさ啶傕が啶�',
+    January: '啶溹え啶掂ぐ啷�',
+  },
+  operation: {
+    now: '啶呧が',
+    pickDate: '啶むぞ啶班啶栢ぜ 啶氞啶ㄠ啶�',
+    ok: '啶犩啶� 啶灌',
+    cancel: '啶班う啷嵿う 啶曕ぐ啷囙',
+  },
+  title: {
+    pickTime: '啶膏ぎ啶� 啶氞啶ㄠ啶�',
+  },
+  defaultPlaceholder: '啶忇 啶膏ぎ啶� 啶氞啶ㄠ啶�...',
+}
+
+export default translation
diff --git a/i18n/hi-IN/tools.ts b/i18n/hi-IN/tools.ts
new file mode 100644
index 0000000..e9b8107
--- /dev/null
+++ b/i18n/hi-IN/tools.ts
@@ -0,0 +1,163 @@
+const translation = {
+  title: '啶夃お啶曕ぐ啶�',
+  createCustomTool: '啶曕じ啷嵿啶� 啶夃お啶曕ぐ啶� 啶え啶距啶�',
+  customToolTip: 'Dify 啶曕じ啷嵿啶� 啶夃お啶曕ぐ啶`啶� 啶曕 啶ぞ啶班 啶啶� 啶斷ぐ 啶溹ぞ啶ㄠ啶�',
+  type: {
+    all: '啶膏き啷�',
+    builtIn: '啶ㄠた啶班啶た啶�',
+    custom: '啶曕じ啷嵿啶�',
+    workflow: '啶曕ぞ啶班啶お啷嵿ぐ啶掂ぞ啶�',
+  },
+  contribute: {
+    line1: '啶啶� 啶班啶氞た 啶班啶むぞ 啶灌啶� ',
+    line2: 'Dify 啶啶� 啶夃お啶曕ぐ啶� 啶︵ぞ啶� 啶曕ぐ啶ㄠ 啶啶傕イ',
+    viewGuide: '啶椸ぞ啶囙ぁ 啶︵啶栢啶�',
+  },
+  author: '啶︵啶掂ぞ啶班ぞ',
+  auth: {
+    unauthorized: '啶呧ぇ啶苦啷冟い 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�',
+    authorized: '啶呧ぇ啶苦啷冟い',
+    setup: '啶夃お啶啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶呧ぇ啶苦啷冟い啶� 啶膏啶熰啶� 啶曕ぐ啷囙',
+    setupModalTitle: '啶呧ぇ啶苦啷冟い啶� 啶膏啶熰啶� 啶曕ぐ啷囙',
+    setupModalTitleDescription:
+      '啶啶班ぎ啶距ぃ啶苦啶班ぃ 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啶ㄠ 啶曕 啶ぞ啶�, 啶曕ぞ啶班啶じ啷嵿ぅ啶距え 啶曕 啶膏き啷� 啶膏う啶膏啶� 啶囙じ 啶夃お啶曕ぐ啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ 啶膏啷囙啶椸啷�',
+  },
+  includeToolNum: '{{num}} 啶夃お啶曕ぐ啶� 啶多ぞ啶た啶� 啶灌啶�',
+  addTool: '啶夃お啶曕ぐ啶� 啶溹啶∴ぜ啷囙',
+  addToolModal: {
+    type: '啶啶班啶距ぐ',
+    category: '啶多啶班啶`',
+    add: '啶溹啶∴ぜ啷囙',
+    added: '啶溹啶∴ぜ啶� 啶椸く啶�',
+    manageInTools: '啶夃お啶曕ぐ啶`啶� 啶啶� 啶啶班が啶傕ぇ啶苦い 啶曕ぐ啷囙',
+    emptyTitle: '啶曕啶� 啶曕ぞ啶班啶お啷嵿ぐ啶掂ぞ啶� 啶夃お啶曕ぐ啶� 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶�',
+    emptyTip: '啶曕ぞ啶班啶お啷嵿ぐ啶掂ぞ啶� -> 啶夃お啶曕ぐ啶� 啶曕 啶班啶� 啶啶� 啶啶班啶距ざ啶苦い 啶ぐ 啶溹ぞ啶忇',
+    emptyTipCustom: '啶忇 啶曕じ啷嵿啶� 啶熰啶� 啶え啶距啶�',
+    emptyTitleCustom: '啶曕啶� 啶曕じ啷嵿啶� 啶熰啶� 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶灌',
+  },
+  createTool: {
+    title: '啶曕じ啷嵿啶� 啶夃お啶曕ぐ啶� 啶え啶距啶�',
+    editAction: '啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+    editTitle: '啶曕じ啷嵿啶� 啶夃お啶曕ぐ啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+    name: '啶ㄠぞ啶�',
+    toolNamePlaceHolder: '啶夃お啶曕ぐ啶� 啶曕ぞ 啶ㄠぞ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    nameForToolCall: '啶夃お啶曕ぐ啶� 啶曕啶� 啶ㄠぞ啶�',
+    nameForToolCallPlaceHolder:
+      '啶ざ啷�啶� 啶す啶氞ぞ啶� 啶曕 啶侧た啶� 啶夃お啶啶�, 啶溹啶膏 啶曕た getCurrentWeather, list_pets',
+    nameForToolCallTip: '啶曕啶掂げ 啶膏啶栢啶ぞ, 啶呧啷嵿し啶�, 啶斷ぐ 啶呧啶∴ぐ啶膏啶曕啶� 啶曕ぞ 啶膏ぎ啶班啶ムえ 啶曕ぐ啶むぞ 啶灌啷�',
+    description: '啶掂た啶掂ぐ啶�',
+    descriptionPlaceholder:
+      '啶掂た啶多た啶粪啶� 啶膏啶ムぞ啶� 啶曕 啶侧た啶� 啶むぞ啶ぎ啶距え 啶啶班ぞ啶啶� 啶曕ぐ啶ㄠ 啶曕ぞ 啶夃う啷嵿う啷囙ざ啷嵿く, 啶夃う啶距す啶班ぃ 啶曕 啶侧た啶忇イ',
+    schema: '啶膏啶曕啶ぞ',
+    schemaPlaceHolder: '啶す啶距 啶呧お啶ㄠぞ OpenAPI 啶膏啶曕啶ぞ 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    viewSchemaSpec: 'OpenAPI-Swagger 啶掂た啶ㄠた啶班啶︵啶� 啶︵啶栢啶�',
+    importFromUrl: 'URL 啶膏 啶嗋く啶距い 啶曕ぐ啷囙',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: '啶曕啶く啶� 啶忇 啶ぞ啶ㄠ啶� URL 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    examples: '啶夃う啶距す啶班ぃ',
+    exampleOptions: {
+      json: '啶啶膏ぎ(JSON)',
+      yaml: '啶啶� 啶膏啶熰啶�(YAML)',
+      blankTemplate: '啶栢ぞ啶侧 啶熰啶啶げ啷囙',
+    },
+    availableTools: {
+      title: '啶夃お啶侧が啷嵿ぇ 啶夃お啶曕ぐ啶�',
+      name: '啶ㄠぞ啶�',
+      description: '啶掂た啶掂ぐ啶�',
+      method: '啶掂た啶оた',
+      path: '啶ぅ',
+      action: '啶曕啶班た啶ぞ啶忇',
+      test: '啶ぐ啷�啶曕啶粪ぃ',
+    },
+    authMethod: {
+      title: '啶呧ぇ啶苦啷冟い啶� 啶掂た啶оた',
+      type: '啶呧ぇ啶苦啷冟い啶� 啶啶班啶距ぐ',
+      keyTooltip:
+        'Http 啶灌啶∴ぐ 啶曕啶傕啷�, 啶う啶� 啶嗋お啶曕 啶曕啶� 啶い啶� 啶ㄠす啷�啶� 啶灌 啶む "Authorization" 啶曕 啶膏ぞ啶� 啶涏啶∴ぜ 啶膏啶む 啶灌啶� 啶ぞ 啶囙じ啷� 啶曕じ啷嵿啶� 啶啶侧啶� 啶ぐ 啶膏啶� 啶曕ぐ 啶膏啶む 啶灌啶�',
+      types: {
+        none: '啶曕啶� 啶ㄠす啷�啶�',
+        api_key: 'API 啶曕啶傕啷�',
+        apiKeyPlaceholder: 'API 啶曕啶傕啷� 啶曕 啶侧た啶� HTTP 啶灌啶∴ぐ 啶ㄠぞ啶�',
+        apiValuePlaceholder: 'API 啶曕啶傕啷� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+      },
+      key: '啶曕啶傕啷�',
+      value: '啶啶侧啶�',
+    },
+    authHeaderPrefix: {
+      title: '啶呧ぇ啶苦啷冟い啶� 啶啶班啶距ぐ',
+      types: {
+        basic: '啶啶膏た啶�',
+        bearer: '啶た啶ぐ啶�',
+        custom: '啶曕じ啷嵿啶�',
+      },
+    },
+    privacyPolicy: '啶椸啶え啷�啶い啶� 啶ㄠ啶むた',
+    privacyPolicyPlaceholder: '啶曕啶く啶� 啶椸啶え啷�啶い啶� 啶ㄠ啶むた 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    toolInput: {
+      title: '啶夃お啶曕ぐ啶� 啶囙え啶啶�',
+      name: '啶ㄠぞ啶�',
+      required: '啶嗋さ啶多啶',
+      method: '啶掂た啶оた',
+      methodSetting: '啶膏啶熰た啶傕',
+      methodSettingTip: '啶夃お啶啶椸啶班啶むぞ 啶夃お啶曕ぐ啶� 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶ぐ啶むぞ 啶灌',
+      methodParameter: '啶啶班ぞ啶啶熰ぐ',
+      methodParameterTip: 'LLM 啶啶班い啶苦お啶距う啶� 啶曕 啶︵啶班ぞ啶� 啶ぐ啶むぞ 啶灌',
+      label: '啶熰啶�',
+      labelPlaceholder: '啶熰啶� 啶氞啶ㄠ啶�(啶掂啶曕げ啷嵿お啶苦)',
+      description: '啶啶班ぞ啶啶熰ぐ 啶曕 啶呧ぐ啷嵿ぅ 啶曕ぞ 啶掂た啶掂ぐ啶�',
+      descriptionPlaceholder: '啶啶班ぞ啶啶熰ぐ 啶曕 啶呧ぐ啷嵿ぅ 啶曕ぞ 啶掂た啶掂ぐ啶�',
+    },
+    customDisclaimer: '啶曕じ啷嵿啶� 啶呧じ啷嵿さ啷�啶曕ぐ啶�',
+    customDisclaimerPlaceholder: '啶曕じ啷嵿啶� 啶呧じ啷嵿さ啷�啶曕ぐ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    confirmTitle: '啶膏す啷囙啶ㄠ 啶曕 啶啶粪啶熰た 啶曕ぐ啷囙 ?',
+    confirmTip: '啶囙じ 啶夃お啶曕ぐ啶� 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶ㄠ 啶掂ぞ啶侧 啶愢お啷嵿じ 啶啶班き啶距さ啶苦い 啶灌啶傕啷�',
+    deleteToolConfirmTitle: '啶囙じ 啶夃お啶曕ぐ啶� 啶曕 啶灌啶距啶�?',
+    deleteToolConfirmContent: '啶囙じ 啶夃お啶曕ぐ啶� 啶曕 啶灌啶距え啷� 啶膏 啶掂ぞ啶じ 啶ㄠす啷�啶� 啶� 啶膏啶むぞ 啶灌啷� 啶夃お啶啶椸啶班啶むぞ 啶呧が 啶む 啶嗋お啶曕 啶夃お啶曕ぐ啶� 啶ぐ 啶呧え啷嵿い啶班ぞ啶� 啶ㄠす啷�啶� 啶曕ぐ 啶膏啷囙啶椸啷�',
+  },
+  test: {
+    title: '啶ぐ啷�啶曕啶粪ぃ',
+    parametersValue: '啶啶班ぞ啶啶熰ぐ 啶斷ぐ 啶啶侧啶�',
+    parameters: '啶啶班ぞ啶啶熰ぐ',
+    value: '啶啶侧啶�',
+    testResult: '啶ぐ啷�啶曕啶粪ぃ 啶ぐ啶苦ぃ啶距ぎ',
+    testResultPlaceholder: '啶ぐ啷�啶曕啶粪ぃ 啶ぐ啶苦ぃ啶距ぎ 啶す啶距 啶︵た啶栢ぞ啶� 啶︵啶椸ぞ',
+  },
+  thought: {
+    using: '啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶む 啶灌啶�',
+    used: '啶囙じ啷嵿い啷囙ぎ啶距げ 啶曕た啶ぞ 啶灌啶�',
+    requestTitle: '啶呧え啷佮ぐ啷嬥ぇ 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�',
+    responseTitle: '啶啶班い啶苦啷嵿ぐ啶苦く啶� 啶膏',
+  },
+  setBuiltInTools: {
+    info: '啶溹ぞ啶ㄠ啶距ぐ啷�',
+    setting: '啶膏啶熰た啶傕',
+    toolDescription: '啶夃お啶曕ぐ啶� 啶掂た啶掂ぐ啶�',
+    parameters: '啶啶班ぞ啶啶熰ぐ啷嵿じ',
+    string: '啶膏啶熰啶班た啶傕',
+    number: '啶ㄠ啶ぐ',
+    required: '啶嗋さ啶多啶',
+    infoAndSetting: '啶溹ぞ啶ㄠ啶距ぐ啷� 啶斷ぐ 啶膏啶熰た啶傕啷嵿じ',
+    file: '啶ぞ啶囙げ',
+  },
+  noCustomTool: {
+    title: '啶曕啶� 啶曕じ啷嵿啶� 啶夃お啶曕ぐ啶� 啶ㄠす啷�啶�!',
+    content:
+      '啶忇啶� 啶愢お啷嵿じ 啶え啶距え啷� 啶曕 啶侧た啶� 啶す啶距 啶呧お啶ㄠ 啶曕じ啷嵿啶� 啶夃お啶曕ぐ啶� 啶溹啶∴ぜ啷囙 啶斷ぐ 啶啶班が啶傕ぇ啶苦い 啶曕ぐ啷囙啷�',
+    createTool: '啶夃お啶曕ぐ啶� 啶え啶距啶�',
+  },
+  noSearchRes: {
+    title: '啶曕啶粪ぎ啶� 啶曕ぐ啷囙, 啶曕啶� 啶ぐ啶苦ぃ啶距ぎ 啶ㄠす啷�啶�!',
+    content: '啶灌ぎ 啶嗋お啶曕 啶栢啶� 啶膏 啶啶� 啶栢ぞ啶ㄠ 啶掂ぞ啶侧 啶曕啶� 啶夃お啶曕ぐ啶� 啶ㄠす啷�啶� 啶⑧啶傕あ 啶ぞ啶忇イ',
+    reset: '啶栢啶� 啶班啶膏啶� 啶曕ぐ啷囙',
+  },
+  builtInPromptTitle: '啶啶班啶啶啶�',
+  toolRemoved: '啶夃お啶曕ぐ啶� 啶灌啶距く啶� 啶椸く啶�',
+  notAuthorized: '啶夃お啶曕ぐ啶� 啶呧ぇ啶苦啷冟い 啶ㄠす啷�啶�',
+  howToGet: '啶曕啶膏 啶啶班ぞ啶啶� 啶曕ぐ啷囙',
+  openInStudio: '啶膏啶熰啶∴た啶 啶啶� 啶栢啶侧啶�',
+  toolNameUsageTip: '啶忇啷囙啶� 啶むぐ啷嵿 啶斷ぐ 啶啶班啶班ぃ 啶曕 啶侧た啶� 啶夃お啶曕ぐ啶� 啶曕啶� 啶ㄠぞ啶�',
+  noTools: '啶曕啶� 啶夃お啶曕ぐ啶� 啶ㄠす啷�啶� 啶た啶侧ぞ',
+  copyToolName: '啶ㄠぞ啶� 啶曕啶 啶曕ぐ啷囙',
+}
+
+export default translation
diff --git a/i18n/hi-IN/workflow.ts b/i18n/hi-IN/workflow.ts
new file mode 100644
index 0000000..17d33a0
--- /dev/null
+++ b/i18n/hi-IN/workflow.ts
@@ -0,0 +1,941 @@
+const translation = {
+  common: {
+    undo: '啶啶班啶掂さ啶� 啶曕ぐ啷囙',
+    redo: '啶た啶� 啶膏 啶曕ぐ啷囙',
+    editing: '啶膏啶ぞ啶︵え',
+    autoSaved: '啶膏啶掂い啶� 啶膏す啷囙啶� 啶椸く啶�',
+    unpublished: '啶呧お啷嵿ぐ啶曕ぞ啶多た啶�',
+    published: '啶啶班啶距ざ啶苦い',
+    publish: '啶啶班啶距ざ啶苦い 啶曕ぐ啷囙',
+    update: '啶呧お啶∴啶� 啶曕ぐ啷囙',
+    run: '啶氞げ啶距啶�',
+    running: '啶氞げ 啶班す啶� 啶灌',
+    inRunMode: '啶班え 啶啶� 啶啶�',
+    inPreview: '啶啶班啶掂ぞ啶掂げ啷嬥啶� 啶啶�',
+    inPreviewMode: '啶啶班啶掂ぞ啶掂げ啷嬥啶� 啶啶� 啶啶�',
+    preview: '啶啶班啶掂ぞ啶掂げ啷嬥啶�',
+    viewRunHistory: '啶班え 啶囙い啶苦す啶距じ 啶︵啶栢啶�',
+    runHistory: '啶班え 啶囙い啶苦す啶距じ',
+    goBackToEdit: '啶膏啶ぞ啶︵ 啶ぐ 啶掂ぞ啶じ 啶溹ぞ啶忇',
+    conversationLog: '啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶侧啶�',
+    features: '啶掂た啶多啶粪い啶距啶�',
+    debugAndPreview: '啶啶班啶掂ぞ啶掂げ啷嬥啶�',
+    restart: '啶啶ㄠ 啶嗋ぐ啶傕き 啶曕ぐ啷囙',
+    currentDraft: '啶掂ぐ啷嵿い啶ぞ啶� 啶∴啶班ぞ啶啶�',
+    currentDraftUnpublished: '啶掂ぐ啷嵿い啶ぞ啶� 啶∴啶班ぞ啶啶� 啶呧お啷嵿ぐ啶曕ぞ啶多た啶�',
+    latestPublished: '啶ㄠさ啷�啶ㄠい啶� 啶啶班啶距ざ啶苦い',
+    publishedAt: '啶啶班啶距ざ啶苦い',
+    restore: '啶啶ㄠぐ啷嵿じ啷嵿ぅ啶距お啶苦い 啶曕ぐ啷囙',
+    runApp: '啶愢お 啶氞げ啶距啶�',
+    batchRunApp: '啶啶� 啶愢お 啶氞げ啶距啶�',
+    accessAPIReference: '啶忇お啷�啶嗋 啶膏啶︵ぐ啷嵿き 啶む 啶す啷佮啶氞啶�',
+    embedIntoSite: '啶膏ぞ啶囙 啶啶� 啶忇ぎ啷嵿が啷囙ぁ 啶曕ぐ啷囙',
+    addTitle: '啶多啶班啶粪 啶溹啶∴ぜ啷囙...',
+    addDescription: '啶掂た啶掂ぐ啶� 啶溹啶∴ぜ啷囙...',
+    noVar: '啶曕啶� 啶掂啶班た啶忇が啶� 啶ㄠす啷�啶�',
+    searchVar: '啶掂啶班た啶忇が啶� 啶栢啶溹啶�',
+    variableNamePlaceholder: '啶掂啶班た啶忇が啶� 啶ㄠぞ啶�',
+    setVarValuePlaceholder: '啶掂啶班た啶忇が啶� 啶膏啶� 啶曕ぐ啷囙',
+    needConnectTip: '啶す 啶氞ぐ啶� 啶曕た啶膏 啶膏 啶溹啶∴ぜ啶� 啶ㄠす啷�啶� 啶灌',
+    maxTreeDepth: '啶啶班い啶� 啶多ぞ啶栢ぞ 啶呧ぇ啶苦啶むぎ {{depth}} 啶ㄠ啶∴啶� 啶曕 啶膏啶ぞ',
+    needEndNode: '啶呧啶� 啶啶侧啶� 啶溹啶∴ぜ啶� 啶溹ぞ啶ㄠぞ 啶氞ぞ啶灌た啶�',
+    needAnswerNode: '啶夃い啷嵿い啶� 啶啶侧啶� 啶溹啶∴ぜ啶� 啶溹ぞ啶ㄠぞ 啶氞ぞ啶灌た啶�',
+    workflowProcess: '啶曕ぞ啶班啶お啷嵿ぐ啶掂ぞ啶� 啶啶班啷嵿ぐ啶苦く啶�',
+    notRunning: '啶呧き啷� 啶む 啶ㄠす啷�啶� 啶氞げ 啶班す啶�',
+    previewPlaceholder:
+      '啶氞啶熰が啷夃 啶曕ぞ 啶∴啶 啶多啶班 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶ㄠ啶氞 啶︵た啶� 啶椸 啶啶曕啶� 啶啶� 啶膏ぞ啶啷嵿ぐ啷� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+    effectVarConfirm: {
+      title: '啶掂啶班た啶忇が啶� 啶灌啶距啶�',
+      content:
+        '啶掂啶班た啶忇が啶� 啶呧え啷嵿く 啶ㄠ啶∴啶� 啶啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷� 啶曕啶ぞ 啶嗋お 啶呧き啷� 啶 啶囙じ啷� 啶灌啶距え啶� 啶氞ぞ啶灌い啷� 啶灌啶�?',
+    },
+    insertVarTip: '啶溹げ啷嵿う啷� 啶膏 啶∴ぞ啶侧え啷� 啶曕 啶侧た啶� \'/\' 啶曕啶傕啷� 啶︵が啶距啶�',
+    processData: '啶∴啶熰ぞ 啶啶班啶膏啶� 啶曕ぐ啷囙',
+    input: '啶囙え啶啶�',
+    output: '啶嗋啶熰お啷佮',
+    jinjaEditorPlaceholder: '啶掂啶班た啶忇が啶� 啶∴ぞ啶侧え啷� 啶曕 啶侧た啶� \'/\' 啶ぞ \'{\' 啶熰ぞ啶囙お 啶曕ぐ啷囙',
+    viewOnly: '啶曕啶掂げ 啶︵啶栢啶�',
+    showRunHistory: '啶班え 啶囙い啶苦す啶距じ 啶︵た啶栢ぞ啶忇',
+    enableJinja: 'Jinja 啶熰啶啶げ啷囙 啶膏ぎ啶班啶ムえ 啶膏啷嵿し啶� 啶曕ぐ啷囙',
+    learnMore: '啶呧ぇ啶苦 啶溹ぞ啶ㄠ啶�',
+    copy: '啶曕啶 啶曕ぐ啷囙',
+    duplicate: '啶∴啶啶侧た啶曕啶� 啶曕ぐ啷囙',
+    addBlock: '啶啶侧啶� 啶溹啶∴ぜ啷囙',
+    pasteHere: '啶す啶距 啶啶膏啶� 啶曕ぐ啷囙',
+    pointerMode: '啶啶囙啶熰ぐ 啶啶�',
+    handMode: '啶灌啶傕ぁ 啶啶�',
+    model: '啶啶∴げ',
+    workflowAsTool: '啶熰啶� 啶曕 啶班啶� 啶啶� 啶曕ぞ啶班啶お啷嵿ぐ啶掂ぞ啶�',
+    configureRequired: '啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶嗋さ啶多啶',
+    configure: '啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+    manageInTools: '啶熰啶侧啶� 啶啶� 啶啶班が啶傕ぇ啶苦い 啶曕ぐ啷囙',
+    workflowAsToolTip:
+      '啶曕ぞ啶班啶お啷嵿ぐ啶掂ぞ啶� 啶呧お啶∴啶� 啶曕 啶ぞ啶� 啶熰啶� 啶啶ㄠ 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶嗋さ啶多啶 啶灌啷�',
+    viewDetailInTracingPanel: '啶掂た啶掂ぐ啶� 啶︵啶栢啶�',
+    syncingData: '啶∴啶熰ぞ 啶膏た啶傕 啶灌 啶班す啶� 啶灌, 啶じ 啶曕啶� 啶膏啶曕啶∴イ',
+    overwriteAndImport: '啶呧ぇ啶苦げ啷囙啶苦い 啶斷ぐ 啶嗋く啶距い',
+    importSuccess: '啶膏か啶侧い啶� 啶嗋く啶距い 啶曕ぐ啷囙',
+    chooseDSL: '啶∴啶忇じ啶忇げ (啶掂ぞ啶堗啶啶�) 啶ぜ啶距啶� 啶氞啶ㄠ啶�',
+    importDSL: 'DSL 啶嗋く啶距い 啶曕ぐ啷囙',
+    backupCurrentDraft: '啶啶曕啶� 啶掂ぐ啷嵿い啶ぞ啶� 啶∴啶班ぞ啶啶�',
+    importFailure: '啶嗋く啶距い 啶掂た啶げ啶むぞ',
+    importDSLTip: '啶掂ぐ啷嵿い啶ぞ啶� 啶∴啶班ぞ啶啶� 啶撪さ啶班ぐ啶距啶� 啶灌 啶溹ぞ啶忇啶距イ 啶嗋く啶距い 啶曕ぐ啶ㄠ 啶膏 啶す啶侧 啶掂ぐ啷嵿啶ぜ啷嵿げ啷� 啶曕 啶啶曕啶� 啶曕 啶班啶� 啶啶� 啶ㄠた啶班啶ぞ啶� 啶曕ぐ啷囙.',
+    parallelTip: {
+      click: {
+        title: '啶曕啶侧た啶� 啶曕ぐ啶ㄠぞ',
+        desc: '啶溹啶∴ぜ啶ㄠ 啶曕 啶侧た啶�',
+      },
+      drag: {
+        title: '啶栢啶傕啶ㄠぞ',
+        desc: '啶曕え啷囙啷嵿 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�',
+      },
+      limit: '啶膏ぎ啶距啶むぐ啶むぞ {{num}} 啶多ぞ啶栢ぞ啶撪 啶む 啶膏啶た啶� 啶灌啷�',
+      depthLimit: '{{num}} 啶ぐ啶む啶� 啶曕 啶膏ぎ啶距え啶距啶むぐ 啶ㄠ啶膏啶熰た啶傕 啶ぐ啶� 啶膏啶ぞ',
+    },
+    disconnect: '啶呧げ啶� 啶曕ぐ啶ㄠぞ',
+    parallelRun: '啶膏ぎ啶距え啶距啶むぐ 啶班え',
+    jumpToNode: '啶囙じ 啶ㄠ啶� 啶ぐ 啶溹ぞ啶忇',
+    addParallelNode: '啶膏ぎ啶距え啶距啶むぐ 啶ㄠ啶� 啶溹啶∴ぜ啷囙',
+    parallel: '啶膏ぎ啶距え啶距啶むぐ',
+    branch: '啶多ぞ啶栢ぞ',
+    featuresDocLink: '啶斷ぐ 啶溹ぞ啶ㄠ',
+    featuresDescription: '啶掂啶� 啶愢お 啶夃お啶啶椸啶班啶むぞ 啶呧え啷佮き啶� 啶曕 啶啶灌い啶� 啶え啶距啶�',
+    fileUploadTip: '啶涏さ啶� 啶呧お啶侧啶� 啶膏啶掂た啶оぞ啶撪 啶曕 啶ぜ啶距啶� 啶呧お啶侧啶� 啶啶� 啶呧お啶椸啶班啶� 啶曕た啶ぞ 啶椸く啶� 啶灌啷�',
+    ImageUploadLegacyTip: '啶呧が 啶嗋お 啶啶班ぞ啶班啶� 啶啶班お啶む啶� 啶啶� 啶ぜ啶距啶� 啶啶班啶距ぐ 啶氞ぐ 啶え啶� 啶膏啶む 啶灌啶傕イ 啶灌ぎ 啶呧が 啶さ啶苦し啷嵿く 啶啶� 啶涏さ啶� 啶呧お啶侧啶� 啶膏啶掂た啶оぞ 啶曕ぞ 啶膏ぎ啶班啶ムえ 啶ㄠす啷�啶� 啶曕ぐ啷囙啶椸啷�',
+    importWarning: '啶膏ぞ啶掂ぇ啶距え啷�',
+    importWarningDetails: '啶∴啶忇じ啶忇げ 啶膏啶膏啶曕ぐ啶� 啶呧啶むぐ 啶曕啶� 啶膏啶掂た啶оぞ啶撪 啶曕 啶啶班き啶距さ啶苦い 啶曕ぐ 啶膏啶むぞ 啶灌',
+    openInExplore: '啶忇啷嵿じ啶啶侧啶� 啶啶� 啶栢啶侧啶�',
+    onFailure: '啶呧じ啶げ啶むぞ 啶ぐ',
+    addFailureBranch: '啶呧じ啶げ 啶多ぞ啶栢ぞ 啶溹啶∴ぜ啷囙',
+    noHistory: '啶曕啶� 啶囙い啶苦す啶距じ 啶ㄠす啷�啶�',
+    loadMore: '啶呧ぇ啶苦 啶掂ぐ啷嵿啶ぜ啷嵿げ啷嬥啶� 啶侧啶� 啶曕ぐ啷囙',
+    exitVersions: '啶ㄠた啶曕げ啶ㄠ 啶曕 啶膏啶膏啶曕ぐ啶�',
+    exportPNG: 'PNG 啶曕 啶班啶� 啶啶� 啶ㄠた啶班啶ぞ啶� 啶曕ぐ啷囙',
+    exportJPEG: 'JPEG 啶曕 啶班啶� 啶啶� 啶ㄠた啶班啶ぞ啶� 啶曕ぐ啷囙',
+    referenceVar: '啶膏啶︵ぐ啷嵿き 啶氞ぐ',
+    noExist: '啶曕啶� 啶愢じ啶� 啶氞ぐ 啶ㄠす啷�啶� 啶灌',
+    exportImage: '啶涏さ啶� 啶ㄠた啶班啶ぞ啶� 啶曕ぐ啷囙',
+    publishUpdate: '啶呧お啶∴啶� 啶啶班啶距ざ啶苦い 啶曕ぐ啷囙',
+    exportSVG: 'SVG 啶曕 啶班啶� 啶啶� 啶ㄠた啶班啶ぞ啶� 啶曕ぐ啷囙',
+    versionHistory: '啶膏啶膏啶曕ぐ啶� 啶囙い啶苦す啶距じ',
+  },
+  env: {
+    envPanelTitle: '啶ぐ啷嵿く啶距さ啶班ぃ 啶氞ぐ',
+    envDescription: '啶ぐ啷嵿く啶距さ啶班ぃ 啶氞ぐ 啶曕ぞ 啶夃お啶啶� 啶ㄠた啶溹 啶溹ぞ啶ㄠ啶距ぐ啷� 啶斷ぐ 啶曕啶班啶∴啶傕ざ啶苦く啶侧啶� 啶曕 啶膏啶椸啶班す啶苦い 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌啷� 啶掂 啶曕啶掂げ 啶あ啶监え啷� 啶啶椸啶� 啶灌啶� 啶斷ぐ 啶ㄠた啶班啶ぞ啶� 啶曕 啶︵啶班ぞ啶� DSL 啶ぜ啶距啶� 啶膏 啶呧げ啶� 啶曕た啶� 啶溹ぞ 啶膏啶む 啶灌啶傕イ',
+    envPanelButton: '啶氞ぐ 啶溹啶∴ぜ啷囙',
+    modal: {
+      title: '啶ぐ啷嵿く啶距さ啶班ぃ 啶氞ぐ 啶溹啶∴ぜ啷囙',
+      editTitle: '啶ぐ啷嵿く啶距さ啶班ぃ 啶氞ぐ 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+      type: '啶啶班啶距ぐ',
+      name: '啶ㄠぞ啶�',
+      namePlaceholder: '啶ぐ啷嵿く啶距さ啶班ぃ 啶ㄠぞ啶�',
+      value: '啶ぞ啶�',
+      valuePlaceholder: '啶ぐ啷嵿く啶距さ啶班ぃ 啶ぞ啶�',
+      secretTip: '啶膏啶掂啶︵え啶多啶� 啶溹ぞ啶ㄠ啶距ぐ啷� 啶ぞ 啶∴啶熰ぞ 啶曕 啶ぐ啶苦き啶距し啶苦い 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌, DSL 啶膏啶熰た啶傕啷嵿じ 啶侧啶� 啶班啶曕ぅ啶距ぎ 啶曕 啶侧た啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕 啶椸 啶灌啶傕イ',
+    },
+    export: {
+      title: '啶椸啶啶� 啶ぐ啷嵿く啶距さ啶班ぃ 啶氞ぐ 啶ㄠた啶班啶ぞ啶� 啶曕ぐ啷囙?',
+      checkbox: '啶椸啶啶� 啶ぞ啶� 啶ㄠた啶班啶ぞ啶� 啶曕ぐ啷囙',
+      ignore: 'DSL 啶ㄠた啶班啶ぞ啶� 啶曕ぐ啷囙',
+      export: '啶椸啶啶� 啶ぞ啶ㄠ啶� 啶曕 啶膏ぞ啶� DSL 啶ㄠた啶班啶ぞ啶� 啶曕ぐ啷囙',
+    },
+  },
+  chatVariable: {
+    panelTitle: '啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶氞ぐ',
+    panelDescription: '啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶氞ぐ 啶曕ぞ 啶夃お啶啶� 啶囙啶熰ぐ啷堗啷嵿啶苦さ 啶溹ぞ啶ㄠ啶距ぐ啷� 啶膏啶椸啶班す啶苦い 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌 啶溹た啶膏 LLM 啶曕 啶ぞ啶� 啶班啶ㄠ 啶曕 啶嗋さ啶多啶啶むぞ 啶灌啶む 啶灌, 啶溹た啶膏ぎ啷囙 啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶囙い啶苦す啶距じ, 啶呧お啶侧啶� 啶曕 啶椸 啶ぞ啶囙げ啷囙, 啶夃お啶啶椸啶班啶むぞ 啶啶班ぞ啶ムぎ啶苦啶むぞ啶忇 啶多ぞ啶た啶� 啶灌啶傕イ 啶掂 啶啶ㄠ啶� 啶斷ぐ 啶侧啶栢え啷�啶� 啶灌啶傕イ',
+    docLink: '啶呧ぇ啶苦 啶溹ぞ啶ㄠえ啷� 啶曕 啶侧た啶� 啶灌ぎ啶距ぐ啷� 啶︵じ啷嵿い啶距さ啷囙啶� 啶︵啶栢啶傕イ',
+    button: '啶氞ぐ 啶溹啶∴ぜ啷囙',
+    modal: {
+      title: '啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶氞ぐ 啶溹啶∴ぜ啷囙',
+      editTitle: '啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶氞ぐ 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+      name: '啶ㄠぞ啶�',
+      namePlaceholder: '啶氞ぐ 啶曕ぞ 啶ㄠぞ啶�',
+      type: '啶啶班啶距ぐ',
+      value: '啶∴た啶ぜ啷夃げ啷嵿 啶ぞ啶�',
+      valuePlaceholder: '啶∴た啶ぜ啷夃げ啷嵿 啶ぞ啶�, 啶膏啶� 啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶栢ぞ啶侧 啶涏啶∴ぜ 啶︵啶�',
+      description: '啶掂た啶掂ぐ啶�',
+      descriptionPlaceholder: '啶氞ぐ 啶曕ぞ 啶掂ぐ啷嵿ぃ啶� 啶曕ぐ啷囙',
+      editInJSON: 'JSON 啶啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+      oneByOne: '啶忇-啶忇 啶曕ぐ啶曕 啶溹啶∴ぜ啷囙',
+      editInForm: '啶啶班啶� 啶啶� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+      arrayValue: '啶ぞ啶�',
+      addArrayValue: '啶ぞ啶� 啶溹啶∴ぜ啷囙',
+      objectKey: '啶曕啶傕啷�',
+      objectType: '啶啶班啶距ぐ',
+      objectValue: '啶∴た啶ぜ啷夃げ啷嵿 啶ぞ啶�',
+    },
+    storedContent: '啶膏啶椸啶班す啷�啶� 啶膏ぞ啶啷嵿ぐ啷�',
+    updatedAt: '啶呧お啶∴啶� 啶曕た啶ぞ 啶椸く啶� ',
+  },
+  changeHistory: {
+    title: '啶ぐ啶苦さ啶班啶むえ 啶囙い啶苦す啶距じ',
+    placeholder: '啶嗋お啶ㄠ 啶呧き啷� 啶む 啶曕啶� 啶 啶ㄠす啷�啶� 啶う啶侧ぞ 啶灌',
+    clearHistory: '啶囙い啶苦す啶距じ 啶膏ぞ啶ぜ 啶曕ぐ啷囙',
+    hint: '啶膏啶曕啶�',
+    hintText: '啶嗋お啶曕 啶膏啶ぞ啶︵え 啶曕啶班た啶ぞ啶撪 啶曕 啶ぐ啶苦さ啶班啶むえ 啶囙い啶苦す啶距じ 啶啶� 啶熰啶班啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌, 啶溹 啶囙じ 啶膏い啷嵿ぐ 啶曕 啶︵啶班ぞ啶� 啶嗋お啶曕 啶∴た啶掂ぞ啶囙じ 啶ぐ 啶膏啶椸啶班す啷�啶� 啶灌啶むぞ 啶灌啷� 啶溹が 啶嗋お 啶膏啶ぞ啶︵ 啶涏啶∴ぜ啷囙啶椸 啶む 啶す 啶囙い啶苦す啶距じ 啶膏ぞ啶ぜ 啶灌 啶溹ぞ啶忇啶距イ',
+    stepBackward_one: '{{count}} 啶曕う啶� 啶啶涏',
+    stepBackward_other: '{{count}} 啶曕う啶� 啶啶涏',
+    stepForward_one: '{{count}} 啶曕う啶� 啶嗋啷�',
+    stepForward_other: '{{count}} 啶曕う啶� 啶嗋啷�',
+    sessionStart: '啶膏い啷嵿ぐ 啶啶班ぞ啶班啶�',
+    currentState: '啶掂ぐ啷嵿い啶ぞ啶� 啶膏啶ムた啶むた',
+    nodeTitleChange: '啶啶侧啶� 啶多啶班啶粪 啶う啶侧ぞ 啶椸く啶�',
+    nodeDescriptionChange: '啶啶侧啶� 啶掂た啶掂ぐ啶� 啶う啶侧ぞ 啶椸く啶�',
+    nodeDragStop: '啶啶侧啶� 啶膏啶ムぞ啶ㄠぞ啶傕い啶班た啶� 啶曕た啶ぞ 啶椸く啶�',
+    nodeChange: '啶啶侧啶� 啶う啶侧ぞ 啶椸く啶�',
+    nodeConnect: '啶啶侧啶� 啶曕え啷囙啷嵿 啶曕た啶ぞ 啶椸く啶�',
+    nodePaste: '啶啶侧啶� 啶啶膏啶� 啶曕た啶ぞ 啶椸く啶�',
+    nodeDelete: '啶啶侧啶� 啶灌啶距く啶� 啶椸く啶�',
+    nodeAdd: '啶啶侧啶� 啶溹啶∴ぜ啶� 啶椸く啶�',
+    nodeResize: '啶啶侧啶� 啶曕ぞ 啶嗋啶距ぐ 啶う啶侧ぞ 啶椸く啶�',
+    noteAdd: '啶ㄠ啶� 啶溹啶∴ぜ啶� 啶椸く啶�',
+    noteChange: '啶ㄠ啶� 啶う啶侧ぞ 啶椸く啶�',
+    noteDelete: '啶ㄠ啶� 啶灌啶距く啶� 啶椸く啶�',
+    edgeDelete: '啶啶侧啶� 啶∴た啶膏啶曕え啷囙啷嵿 啶曕た啶ぞ 啶椸く啶�',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 啶嗋さ啶多啶 啶灌',
+    authRequired: '啶啶班ぞ啶оた啶曕ぐ啶� 啶嗋さ啶多啶 啶灌',
+    invalidJson: '{{field}} 啶呧ぎ啶距え啷嵿く JSON 啶灌',
+    fields: {
+      variable: '啶掂啶班た啶忇が啶� 啶ㄠぞ啶�',
+      variableValue: '啶掂啶班た啶忇が啶� 啶ぞ啶�',
+      code: '啶曕啶�',
+      model: '啶啶∴げ',
+      rerankModel: '啶啶ㄠ 啶班啶傕 啶啶∴げ',
+      visionVariable: '啶︵啶粪啶熰た 啶氞ぐ',
+    },
+    invalidVariable: '啶呧ぎ啶距え啷嵿く 啶掂啶班た啶忇が啶�',
+    rerankModelRequired: 'Rerank 啶啶∴げ 啶氞ぞ啶侧 啶曕ぐ啶ㄠ 啶膏 啶す啶侧, 啶曕啶く啶� 啶啶粪啶熰た 啶曕ぐ啷囙 啶曕た 啶啶∴げ 啶曕 啶膏啶熰た啶傕啷嵿じ 啶啶� 啶膏か啶侧い啶距お啷傕ぐ啷嵿さ啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕た啶ぞ 啶椸く啶� 啶灌啷�',
+    toolParameterRequired: '{{field}}: 啶啶班ぞ啶啶熰ぐ [{{param}}] 啶嗋さ啶多啶 啶灌',
+    noValidTool: '{{field}} 啶曕啶� 啶ぞ啶ㄠ啶� 啶夃お啶曕ぐ啶� 啶氞く啶ㄠた啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶�',
+  },
+  singleRun: {
+    testRun: '啶ぐ啷�啶曕啶粪ぃ 啶班え',
+    startRun: '啶班え 啶多啶班 啶曕ぐ啷囙',
+    running: '啶氞げ 啶班す啶� 啶灌',
+    testRunIteration: '啶ぐ啷�啶曕啶粪ぃ 啶班え 啶啶ㄠぐ啶距さ啷冟い啷嵿い啶�',
+    back: '啶掂ぞ啶じ',
+    iteration: '啶啶ㄠぐ啶距さ啷冟い啷嵿い啶�',
+    loop: '啶侧啶�',
+  },
+  tabs: {
+    'searchBlock': '啶啶侧啶� 啶栢啶溹啶�',
+    'blocks': '啶啶侧啶曕啶�',
+    'tools': '啶熰啶侧啶�',
+    'allTool': '啶膏き啷�',
+    'builtInTool': '啶呧啶むぐ啷嵿え啶苦す啶苦い',
+    'customTool': '啶曕じ啷嵿啶�',
+    'workflowTool': '啶曕ぞ啶班啶お啷嵿ぐ啶掂ぞ啶�',
+    'question-understand': '啶啶班ざ啷嵿え 啶膏ぎ啶�',
+    'logic': '啶むぐ啷嵿',
+    'transform': '啶ぐ啶苦さ啶班啶むえ',
+    'utilities': '啶夃お啶啶椸た啶むぞ啶忇',
+    'noResult': '啶曕啶� 啶た啶侧ぞ啶� 啶ㄠす啷�啶� 啶た啶侧ぞ',
+    'searchTool': '啶栢啶� 啶夃お啶曕ぐ啶�',
+    'plugin': '啶啶侧啶囙え',
+    'agent': '啶忇啷囙啶� 啶班ぃ啶ㄠ啶むた',
+  },
+  blocks: {
+    'start': '啶啶班ぞ啶班啶�',
+    'end': '啶膏ぎ啶距お啷嵿い',
+    'answer': '啶夃い啷嵿い啶�',
+    'llm': '啶忇げ啶忇げ啶忇ぎ',
+    'knowledge-retrieval': '啶溹啶炧ぞ啶� 啶啶ㄠぐ啷嵿お啷嵿ぐ啶距お啷嵿い啶�',
+    'question-classifier': '啶啶班ざ啷嵿え 啶掂ぐ啷嵿啷�啶曕ぐ啶�',
+    'if-else': '啶う啶�/啶呧え啷嵿く啶ムぞ',
+    'code': '啶曕啶�',
+    'template-transform': '啶熰啶啶げ啷囙',
+    'http-request': '啶忇啶熰啶熰啶 啶呧え啷佮ぐ啷嬥ぇ',
+    'variable-assigner': '啶掂啶班た啶忇が啶� 啶忇啷嵿ぐ啷�啶椸啶熰ぐ',
+    'variable-aggregator': '啶掂啶班た啶忇が啶� 啶忇啷嵿ぐ啷�啶椸啶熰ぐ',
+    'assigner': '啶氞ぐ 啶呧じ啶距啶ㄠぐ',
+    'iteration-start': '啶啶ㄠぐ啶距さ啷冟い啷嵿い啶� 啶啶班ぞ啶班啶�',
+    'iteration': '啶啶ㄠぐ啶距さ啷冟い啷嵿い啶�',
+    'parameter-extractor': '啶啶班ぞ啶啶熰ぐ 啶ㄠた啶粪啶曕ぐ啷嵿し啶�',
+    'list-operator': '啶膏啶氞 啶戉お啶班啶熰ぐ',
+    'document-extractor': '啶∴啶曕啶熰ぐ 啶忇啷嵿じ啶熰啶班啶曕啶熰ぐ',
+    'agent': '啶忇啷囙啶�',
+    'loop-end': '啶侧啶� 啶膏 啶ぞ啶灌ぐ 啶ㄠた啶曕げ啷囙',
+    'loop': '啶侧啶�',
+    'loop-start': '啶侧啶� 啶啶班ぞ啶班啶�',
+  },
+  blocksAbout: {
+    'start': '啶掂ぐ啷嵿啶ぜ啷嵿げ啷� 啶侧啶ㄠ啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶啶班ぞ啶班啶た啶� 啶啶班ぞ啶啶熰ぐ 啶曕 啶ぐ啶苦き啶距し啶苦い 啶曕ぐ啷囙',
+    'end': '啶掂ぐ啷嵿啶ぜ啷嵿げ啷� 啶曕ぞ 啶呧啶� 啶斷ぐ 啶ぐ啶苦ぃ啶距ぎ 啶啶班啶距ぐ 啶ぐ啶苦き啶距し啶苦い 啶曕ぐ啷囙',
+    'answer': '啶氞啶� 啶膏啶掂ぞ啶� 啶曕 啶夃い啷嵿い啶� 啶膏ぞ啶啷嵿ぐ啷� 啶曕 啶ぐ啶苦き啶距し啶苦い 啶曕ぐ啷囙',
+    'llm': '啶啶班ざ啷嵿え啷嬥 啶曕 啶夃い啷嵿い啶� 啶︵啶ㄠ 啶ぞ 啶啶班ぞ啶曕啶むた啶� 啶ぞ啶粪ぞ 啶曕 啶膏啶膏ぞ啶оた啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶ぁ啶监 啶ぞ啶粪ぞ 啶啶∴げ 啶曕 啶嗋ぎ啶傕い啷嵿ぐ啶苦い 啶曕ぐ啶ㄠぞ',
+    'knowledge-retrieval':
+      '啶夃お啶啶椸啶班啶むぞ 啶啶班ざ啷嵿え啷嬥 啶膏 啶膏啶啶оた啶� 啶ぞ啶� 啶膏ぞ啶啷嵿ぐ啷� 啶曕 啶溹啶炧ぞ啶� 啶膏 啶啶涏え啷� 啶曕 啶呧え啷佮ぎ啶むた 啶︵啶むぞ 啶灌',
+    'question-classifier':
+      '啶夃お啶啶椸啶班啶むぞ 啶啶班ざ啷嵿え啷嬥 啶曕 啶掂ぐ啷嵿啷�啶曕ぐ啶� 啶多ぐ啷嵿い啷嬥 啶曕 啶ぐ啶苦き啶距し啶苦い 啶曕ぐ啷囙, LLM 啶掂ぐ啷嵿啷�啶曕ぐ啶� 啶掂た啶掂ぐ啶� 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶膏啶掂ぞ啶� 啶曕啶膏 啶嗋啷� 啶あ啶监い啶� 啶灌, 啶囙じ啷� 啶ぐ啶苦き啶距し啶苦い 啶曕ぐ 啶膏啶むぞ 啶灌',
+    'if-else':
+      'if/else 啶多ぐ啷嵿い啷嬥 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶掂ぐ啷嵿啶ぜ啷嵿げ啷� 啶曕 啶︵ 啶多ぞ啶栢ぞ啶撪 啶啶� 啶掂た啶ぞ啶溹た啶� 啶曕ぐ啶ㄠ 啶曕 啶呧え啷佮ぎ啶むた 啶︵啶むぞ 啶灌',
+    'code': '啶曕じ啷嵿啶� 啶侧啶溹た啶� 啶曕 啶侧ぞ啶椸 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶忇 啶熰啶曕ぁ啶监ぞ Python 啶ぞ NodeJS 啶曕啶� 啶ㄠた啶粪啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+    'template-transform':
+      'Jinja 啶熰啶啶げ啷囙 啶膏た啶傕啷堗啷嵿じ 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕 啶∴啶熰ぞ 啶曕 啶膏啶熰啶班た啶傕 啶啶� 啶ぐ啶苦さ啶班啶むた啶� 啶曕ぐ啷囙',
+    'http-request': 'HTTP 啶啶班啶熰啶曕啶� 啶ぐ 啶膏ぐ啷嵿さ啶� 啶呧え啷佮ぐ啷嬥ぇ啷嬥 啶曕 啶啶溹え啷� 啶曕 啶呧え啷佮ぎ啶むた 啶︵啶�',
+    'variable-assigner':
+      '啶∴ぞ啶夃え啶膏啶熰啶班啶� 啶ㄠ啶∴啶� 啶曕 啶忇啷�啶曕啶� 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶曕 啶侧た啶� 啶す啷�-啶多ぞ啶栢ぞ 啶氞ぐ 啶曕 啶忇啶� 啶氞ぐ 啶啶� 啶膏啶曕げ啶苦い 啶曕ぐ啷囙啷�',
+    'assigner': '啶氞ぐ 啶呧じ啶距啶ㄠぎ啷囙啶� 啶ㄠ啶� 啶曕ぞ 啶夃お啶啶� 啶侧た啶栢え啷� 啶啶椸啶� 啶氞ぐ (啶溹啶膏 啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶氞ぐ) 啶曕 啶ぞ啶� 啶呧じ啶距啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷�',
+    'variable-aggregator':
+      '啶∴ぞ啶夃え啶膏啶熰啶班啶� 啶ㄠ啶∴啶� 啶曕 啶忇啷�啶曕啶� 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶曕 啶侧た啶� 啶す啷�-啶多ぞ啶栢ぞ 啶氞ぐ 啶曕 啶忇啶� 啶氞ぐ 啶啶� 啶膏啶曕げ啶苦い 啶曕ぐ啷囙啷�',
+    'iteration':
+      '啶忇 啶膏啶氞 啶掂じ啷嵿い啷� 啶ぐ 啶むが 啶む 啶曕 啶曕う啶� 啶曕ぐ啷囙 啶溹が 啶む 啶膏き啷� 啶ぐ啶苦ぃ啶距ぎ 啶嗋啶熰お啷佮 啶� 啶灌 啶溹ぞ啶忇啷�',
+    'parameter-extractor':
+      '啶熰啶� 啶嗋ぎ啶傕い啷嵿ぐ啶`啶� 啶ぞ HTTP 啶呧え啷佮ぐ啷嬥ぇ啷嬥 啶曕 啶侧た啶� 啶啶班ぞ啶曕啶むた啶� 啶ぞ啶粪ぞ 啶膏 啶膏啶班啶苦い 啶啶班ぞ啶啶熰ぐ 啶ㄠた啶曕ぞ啶侧え啷� 啶曕 啶侧た啶� LLM 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙啷�',
+    'document-extractor': '啶呧お啶侧啶� 啶曕た啶� 啶椸 啶︵じ啷嵿い啶距さ啷囙啶监啶� 啶曕 啶ぞ啶� 啶膏ぞ啶啷嵿ぐ啷� 啶啶� 啶ぞ啶班啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌 啶溹 啶忇げ啶忇げ啶忇ぎ 啶︵啶掂ぞ啶班ぞ 啶嗋じ啶距え啷� 啶膏 啶膏ぎ啶澿ぞ 啶溹ぞ 啶膏啶むぞ 啶灌啷�',
+    'list-operator': '啶膏ぐ啶` 啶膏ぞ啶啷嵿ぐ啷� 啶ぜ啶苦げ啷嵿啶� 啶ぞ 啶膏啶班啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌.',
+    'agent': '啶啶班ざ啷嵿え啷嬥 啶曕ぞ 啶夃い啷嵿い啶� 啶︵啶ㄠ 啶ぞ 啶啶班ぞ啶曕啶むた啶� 啶ぞ啶粪ぞ 啶曕 啶膏啶膏ぞ啶оた啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶ぁ啶监 啶ぞ啶粪ぞ 啶啶∴げ啷嬥 啶曕 啶嗋ぎ啶傕い啷嵿ぐ啶苦い 啶曕ぐ啶ㄠぞ',
+    'loop': '啶忇 啶侧啶� 啶曕 啶ㄠた啶粪啶ぞ啶︵た啶� 啶曕ぐ啷囙 啶溹が 啶む 啶膏ぎ啶距お啷嵿い啶� 啶曕 啶多ぐ啷嵿い 啶啶班 啶� 啶灌 啶溹ぞ啶� 啶ぞ 啶呧ぇ啶苦啶むぎ 啶侧啶� 啶膏啶栢啶ぞ 啶啶班ぞ啶啶� 啶� 啶灌 啶溹ぞ啶忇イ',
+    'loop-end': '"啶啶班啶�" 啶曕 啶膏ぎ啶距え啷� 啶囙じ 啶ㄠ啶� 啶啶� 啶曕啶� 啶掂た啶ㄠ啶ぞ啶� 啶嗋啶熰ぎ 啶ㄠす啷�啶� 啶灌啶傕イ 啶溹が 啶侧啶� 啶曕ぞ 啶多ぐ啷�啶� 啶囙じ 啶ㄠ啶� 啶ぐ 啶す啷佮啶氞い啶� 啶灌, 啶む 啶侧啶� 啶膏ぎ啶距お啷嵿い 啶灌啶むぞ 啶灌啷�',
+  },
+  operator: {
+    zoomIn: '啶溹ぜ啷傕ぎ 啶囙え',
+    zoomOut: '啶溹ぜ啷傕ぎ 啶嗋啶�',
+    zoomTo50: '50% 啶ぐ 啶溹ぜ啷傕ぎ 啶曕ぐ啷囙',
+    zoomTo100: '100% 啶ぐ 啶溹ぜ啷傕ぎ 啶曕ぐ啷囙',
+    zoomToFit: '啶た啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶溹ぜ啷傕ぎ 啶曕ぐ啷囙',
+  },
+  panel: {
+    userInputField: '啶夃お啶啶椸啶班啶むぞ 啶囙え啶啶� 啶ぜ啷�啶侧啶�',
+    changeBlock: '啶啶侧啶� 啶う啶侧啶�',
+    helpLink: '啶膏す啶距く啶むぞ 啶侧た啶傕',
+    about: '啶曕 啶ぞ啶班 啶啶�',
+    createdBy: '啶︵啶掂ぞ啶班ぞ 啶え啶距く啶� 啶椸く啶� ',
+    nextStep: '啶呧啶侧ぞ 啶曕う啶�',
+    addNextStep: '啶囙じ 啶掂ぐ啷嵿啶ぜ啷嵿げ啷� 啶啶� 啶呧啶侧ぞ 啶啶侧啶� 啶溹啶∴ぜ啷囙',
+    selectNextStep: '啶呧啶侧ぞ 啶啶侧啶� 啶氞啶ㄠ啶�',
+    runThisStep: '啶囙じ 啶曕う啶� 啶曕 啶氞げ啶距啶�',
+    checklist: '啶氞啶曕げ啶苦じ啷嵿',
+    checklistTip:
+      '啶啶班啶距ざ啶苦い 啶曕ぐ啶ㄠ 啶膏 啶す啶侧 啶膏啶ㄠた啶多啶氞た啶� 啶曕ぐ啷囙 啶曕た 啶膏き啷� 啶膏ぎ啶膏啶ぞ啶忇 啶灌げ 啶灌 啶椸 啶灌啶�',
+    checklistResolved: '啶膏き啷� 啶膏ぎ啶膏啶ぞ啶忇 啶灌げ 啶灌 啶椸 啶灌啶�',
+    organizeBlocks: '啶啶侧啶曕啶� 啶曕 啶掂啶さ啶膏啶ムた啶� 啶曕ぐ啷囙',
+    change: '啶う啶侧啶�',
+    optional: '(啶掂啶曕げ啷嵿お啶苦)',
+  },
+  nodes: {
+    common: {
+      outputVars: '啶嗋啶熰お啷佮 啶掂啶班た啶忇が啶侧啶�',
+      insertVarTip: '啶掂啶班た啶忇が啶� 啶∴ぞ啶侧啶�',
+      memory: {
+        memory: '啶啶啶班',
+        memoryTip: '啶氞啶� 啶啶啶班 啶膏啶熰た啶傕啷嵿じ',
+        windowSize: '啶掂た啶傕ぁ啷� 啶膏ぞ啶囙',
+        conversationRoleName: '啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶啶た啶曕ぞ 啶曕ぞ 啶ㄠぞ啶�',
+        user: '啶啶溹ぐ 啶啶班啶た啶曕啶�',
+        assistant: '啶呧じ啶苦じ啷嵿啷囙啶� 啶啶班啶た啶曕啶�',
+      },
+      memories: {
+        title: '啶啶啶班啶�',
+        tip: '啶氞啶� 啶啶啶班',
+        builtIn: '啶ㄠた啶班啶た啶�',
+      },
+      errorHandle: {
+        none: {
+          title: '啶曕啶� 啶ㄠす啷�啶�',
+          desc: '啶う啶� 啶曕啶� 啶呧お啶掂ぞ啶� 啶灌啶むぞ 啶灌 啶斷ぐ 啶灌啶傕ぁ啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌, 啶む 啶ㄠ啶� 啶氞げ啶ㄠぞ 啶啶� 啶曕ぐ 啶︵啶椸ぞ',
+        },
+        defaultValue: {
+          title: '啶∴た啶ぜ啷夃げ啷嵿 啶ぞ啶�',
+          tip: '啶む啶班啶熰た 啶ぐ, 啶啶侧啶� 啶膏 啶ㄠ啶氞 啶侧啶熰ぞ啶忇啶距イ',
+          output: '啶嗋啶熰お啷佮 啶∴た啶ぜ啷夃げ啷嵿 啶ぞ啶�',
+          inLog: '啶ㄠ啶� 啶呧お啶掂ぞ啶�, 啶∴た啶ぜ啷夃げ啷嵿 啶ぞ啶ㄠ啶� 啶曕 啶呧え啷佮じ啶距ぐ 啶嗋啶熰お啷佮啶苦啶椸イ',
+          desc: '啶溹が 啶曕啶� 啶む啶班啶熰た 啶灌啶む 啶灌, 啶む 啶忇 啶膏啶ムた啶� 啶嗋啶熰お啷佮 啶膏ぞ啶啷嵿ぐ啷� 啶ㄠた啶班啶︵た啶粪啶� 啶曕ぐ啷囙啷�',
+        },
+        failBranch: {
+          title: '啶呧じ啶げ 啶多ぞ啶栢ぞ',
+          customize: '啶呧じ啶げ 啶多ぞ啶栢ぞ 啶むぐ啷嵿 啶曕 啶呧え啷佮啷傕げ啶苦い 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕啶ㄠさ啶距じ 啶ぐ 啶溹ぞ啶忇啷�',
+          inLog: '啶ㄠ啶� 啶呧お啶掂ぞ啶�, 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶掂た啶げ 啶多ぞ啶栢ぞ 啶ㄠた啶粪啶ぞ啶︵た啶� 啶曕ぐ啷囙啶距イ 啶ㄠ啶� 啶嗋啶熰お啷佮 啶忇 啶む啶班啶熰た 啶啶班啶距ぐ 啶斷ぐ 啶む啶班啶熰た 啶膏啶︵啶� 啶侧啶熰ぞ啶忇啶� 啶斷ぐ 啶夃え啷嵿す啷囙 啶∴ぞ啶夃え啶膏啶熰啶班啶� 啶啶� 啶ぞ啶� 啶曕ぐ啷囙啶距イ',
+          desc: '啶溹が 啶曕啶� 啶む啶班啶熰た 啶灌啶む 啶灌, 啶む 啶す 啶呧お啶掂ぞ啶� 啶多ぞ啶栢ぞ 啶ㄠた啶粪啶ぞ啶︵た啶� 啶曕ぐ啷囙啶�',
+          customizeTip: '啶溹が 啶掂た啶げ 啶多ぞ啶栢ぞ 啶膏啷嵿ぐ啶苦く 啶灌啶む 啶灌, 啶む 啶ㄠ啶∴啶� 啶︵啶掂ぞ啶班ぞ 啶啶傕啷� 啶椸 啶呧お啶掂ぞ啶� 啶啶班啷嵿ぐ啶苦く啶� 啶曕 啶膏ぎ啶距お啷嵿い 啶ㄠす啷�啶� 啶曕ぐ啷囙啶椸啷� 啶囙じ啶曕 啶啶距く, 啶す 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶啶班啶掂え啶苦ぐ啷嵿ぇ啶距ぐ啶苦い 啶掂た啶げ 啶多ぞ啶栢ぞ 啶曕 啶ㄠた啶粪啶ぞ啶︵た啶� 啶曕ぐ啷囙啶�, 啶溹た啶膏じ啷� 啶嗋お 啶侧啷�啶侧 啶⑧啶� 啶膏 啶む啶班啶熰た 啶膏啶︵啶�, 啶班た啶啶班啶�, 啶膏啶оぞ啶� 啶ぞ 啶曕ぞ啶班啶班さ啶距 啶涏啶∴ぜ 啶膏啶む 啶灌啶傕イ',
+        },
+        partialSucceeded: {
+          tip: '啶啶班啷嵿ぐ啶苦く啶� 啶啶� {{num}} 啶ㄠ啶∴啶� 啶呧じ啶距ぎ啶距え啷嵿く 啶班啶� 啶膏 啶氞げ 啶班す啷� 啶灌啶�, 啶曕啶く啶� 啶侧啶� 啶曕 啶溹ぞ啶傕 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶熰啶班啶膏た啶傕 啶ぐ 啶溹ぞ啶忇啷�',
+        },
+        title: '啶む啶班啶熰た 啶灌啶傕ぁ啶侧た啶傕',
+        tip: '啶呧お啶掂ぞ啶� 啶灌啶傕ぁ啶侧た啶傕 啶班ぃ啶ㄠ啶むた, 啶熰啶班た啶椸ぐ 啶溹が 啶忇 啶ㄠ啶� 啶忇 啶呧お啶掂ぞ啶� 啶曕ぞ 啶膏ぞ啶え啶� 啶曕ぐ啶むぞ 啶灌啷�',
+      },
+      retry: {
+        times: '啶椸啶`ぞ',
+        ms: '啶膏啶多啶班',
+        retryInterval: '啶呧啶むぐ啶距げ 啶曕ぞ 啶啶ㄠ 啶啶班く啶距じ 啶曕ぐ啷囙',
+        retrying: '啶啶ㄠぐ啷嵿お啷嵿ぐ啶ぞ啶膏イ啷むイ',
+        retryFailed: '啶啶ㄠ 啶啶班く啶距じ 啶掂た啶げ 啶班す啶�',
+        retryFailedTimes: '{{times}} 啶啶ㄠ 啶啶班く啶距じ 啶掂た啶げ 啶班す啷�',
+        retryTimes: '啶掂た啶げ啶むぞ 啶ぐ {{times}} 啶ぞ啶� 啶啶ㄠ 啶啶班く啶距じ 啶曕ぐ啷囙',
+        retries: '{{num}} 啶啶ㄠぐ啷嵿お啷嵿ぐ啶ぞ啶�',
+        maxRetries: '啶呧ぇ啶苦啶むぎ 啶啶ㄠ 啶啶班く啶距じ 啶曕ぐ啶むぞ 啶灌',
+        retrySuccessful: '啶啶ㄠ 啶啶班く啶距じ 啶膏か啶�',
+        retry: '啶啶ㄠぐ啷嵿お啷嵿ぐ啶ぞ啶�',
+        retryOnFailure: '啶掂た啶げ啶むぞ 啶ぐ 啶啶ㄠ 啶啶班く啶距じ 啶曕ぐ啷囙',
+      },
+    },
+    start: {
+      required: '啶嗋さ啶多啶',
+      inputField: '啶囙え啶啶� 啶啶侧啶�',
+      builtInVar: '啶ㄠた啶班啶た啶� 啶掂啶班た啶忇が啶侧啶�',
+      outputVars: {
+        query: '啶啶溹ぐ 啶囙え啶啶�',
+        memories: {
+          des: '啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶囙い啶苦す啶距じ',
+          type: '啶膏啶︵啶� 啶啶班啶距ぐ',
+          content: '啶膏啶︵啶� 啶膏ぞ啶啷嵿ぐ啷�',
+        },
+        files: '啶ぜ啶距啶� 啶膏啶氞',
+      },
+      noVarTip: '啶掂ぐ啷嵿啶啶侧 啶啶� 啶夃お啶啶� 啶曕 啶侧た啶� 啶囙え啶啶熰啶� 啶膏啶� 啶曕ぐ啷囙',
+    },
+    end: {
+      outputs: '啶嗋啶熰お啷佮啷嵿じ',
+      output: {
+        type: '啶嗋啶熰お啷佮 啶啶班啶距ぐ',
+        variable: '啶嗋啶熰お啷佮 啶掂啶班た啶忇が啶�',
+      },
+      type: {
+        'none': '啶曕啶� 啶ㄠす啷�啶�',
+        'plain-text': '啶膏ぞ啶︵ぞ 啶ぞ啶�',
+        'structured': '啶膏啶班啶苦い',
+      },
+    },
+    answer: {
+      answer: '啶夃い啷嵿い啶�',
+      outputVars: '啶嗋啶熰お啷佮 啶掂啶班た啶忇が啶侧啶�',
+    },
+    llm: {
+      model: '啶啶∴げ',
+      variables: '啶掂啶班た啶忇が啶侧啶�',
+      context: '啶膏啶︵ぐ啷嵿き',
+      contextTooltip: '啶膏啶︵ぐ啷嵿き 啶曕 啶班啶� 啶啶� 啶溹啶炧ぞ啶� 啶嗋く啶距い 啶曕ぐ 啶膏啶む 啶灌啶�',
+      notSetContextInPromptTip:
+        '啶膏啶︵ぐ啷嵿き 啶膏啶掂た啶оぞ 啶曕 啶膏啷嵿し啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�, 啶曕啶く啶� 啶啶班啶啶啶� 啶啶� 啶膏啶︵ぐ啷嵿き 啶掂啶班た啶忇が啶� 啶ぐ啷囙啷�',
+      prompt: '啶啶班啶啶啶�',
+      roleDescription: {
+        system: '啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶曕 啶侧た啶� 啶夃啷嵿 啶膏啶むぐ啷�啶� 啶ㄠた啶班啶︵啶� 啶︵啶�',
+        user: '啶啶∴げ 啶曕 啶ㄠた啶班啶︵啶�, 啶啶班ざ啷嵿え 啶ぞ 啶曕啶� 啶 啶ぞ啶�-啶嗋ぇ啶距ぐ啶苦い 啶囙え啶啶� 啶啶班う啶距え 啶曕ぐ啷囙',
+        assistant: '啶啶溹ぐ 啶膏啶︵啶多啶� 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶啶∴げ 啶曕 啶啶班い啶苦啷嵿ぐ啶苦く啶距啶�',
+      },
+      addMessage: '啶膏啶︵啶� 啶溹啶∴ぜ啷囙',
+      vision: '啶︵啶粪啶熰た',
+      files: '啶ぞ啶囙げ啷囙',
+      resolution: {
+        name: '啶班啶溹啶侧啶啶多え',
+        high: '啶夃啷嵿',
+        low: '啶ㄠた啶啶�',
+      },
+      outputVars: {
+        output: '啶膏ぞ啶啷嵿ぐ啷� 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啷囙',
+        usage: '啶啶∴げ 啶夃お啶啶� 啶溹ぞ啶ㄠ啶距ぐ啷�',
+      },
+      singleRun: {
+        variable: '啶掂啶班た啶忇が啶�',
+      },
+      sysQueryInUser: '啶夃お啶啶椸啶班啶むぞ 啶膏啶︵啶� 啶啶� sys.query 啶嗋さ啶多啶 啶灌',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: '啶曕啶く啶� 啶膏啶曕啶ぞ 啶曕 啶膏す啷囙啶ㄠ 啶膏 啶す啶侧 啶掂ぐ啷嵿い啶ぞ啶� 啶ぜ啷�啶侧啶� 啶曕 啶膏啶ぞ啶︵た啶� 啶曕ぐ啶ㄠぞ 啶啶班ぞ 啶曕ぐ啷囙',
+        },
+        apply: '啶侧ぞ啶椸 啶曕ぐ啷囙',
+        promptPlaceholder: '啶呧お啶ㄠ JSON 啶膏啶曕た啶ぞ 啶曕ぞ 啶掂ぐ啷嵿ぃ啶� 啶曕ぐ啷囙...',
+        title: '啶膏啶班啶苦い 啶嗋啶熰お啷佮 啶膏啶曕啶ぞ',
+        fieldNamePlaceholder: '啶曕啶粪啶む啶� 啶ㄠぞ啶�',
+        generate: '啶溹え啶班啶� 啶曕ぐ啷囙',
+        resultTip: '啶す啶距 啶夃い啷嵿お啶ㄠ啶� 啶ぐ啶苦ぃ啶距ぎ 啶灌啷� 啶う啶� 啶嗋お 啶膏啶む啶粪啶� 啶ㄠす啷�啶� 啶灌啶�, 啶む 啶嗋お 啶掂ぞ啶じ 啶溹ぞ 啶膏啶む 啶灌啶� 啶斷ぐ 啶呧お啶ㄠ 啶啶班啶啶啶� 啶曕 啶膏啶多啶оた啶� 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+        generatedResult: '啶溹え啶苦い 啶ぐ啶苦ぃ啶距ぎ',
+        import: 'JSON 啶膏 啶嗋く啶距い 啶曕ぐ啷囙',
+        resetDefaults: '啶班啶膏啶� 啶曕ぐ啷囙',
+        instruction: '啶ㄠた啶班啶︵啶�',
+        regenerate: '啶啶ㄠぐ啷嵿啷�啶掂た啶� 啶曕ぐ啷囙',
+        generateJsonSchema: 'JSON 啶膏啶曕啶ぞ 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啷囙',
+        addField: '啶曕啶粪啶む啶� 啶溹啶∴ぜ啷囙',
+        doc: '啶膏啶班啶苦い 啶嗋啶熰お啷佮 啶曕 啶ぞ啶班 啶啶� 啶呧ぇ啶苦 啶溹ぞ啶ㄠ啶�',
+        back: '啶啶涏',
+        promptTooltip: '啶ぞ啶� 啶掂た啶掂ぐ啶� 啶曕 啶忇 啶ぞ啶ㄠ啷�啶曕啶� JSON 啶膏啶曕啶ぞ 啶膏啶班啶ㄠぞ 啶啶� 啶ぐ啶苦さ啶班啶むた啶� 啶曕ぐ啷囙啷�',
+        descriptionPlaceholder: '啶掂た啶掂ぐ啶� 啶溹啶∴ぜ啷囙',
+        generating: 'JSON 啶膏啶曕啶ぞ 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啶ㄠぞ...',
+        showAdvancedOptions: '啶夃え啷嵿え啶� 啶掂た啶曕げ啷嵿お 啶︵た啶栢ぞ啶忇',
+        stringValidations: '啶膏啶熰啶班た啶傕 啶ぞ啶ㄠ啶い啶�',
+        generationTip: '啶嗋お 啶啶班ぞ啶曕啶むた啶� 啶ぞ啶粪ぞ 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啶曕 啶溹げ啷嵿う啷� 啶膏 啶忇 JSON 啶膏啶曕啶ぞ 啶え啶� 啶膏啶む 啶灌啶傕イ',
+        required: '啶嗋さ啶多啶',
+        addChildField: '啶啷嵿啷� 啶曕ぞ 啶曕啶粪啶む啶� 啶溹啶∴ぜ啷囙',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: '啶啶班ざ啷嵿え 啶掂啶班た啶忇が啶�',
+      knowledge: '啶溹啶炧ぞ啶�',
+      outputVars: {
+        output: '啶啶班ぞ啶啶� 啶掂た啶ぞ啶溹た啶� 啶∴啶熰ぞ',
+        content: '啶掂た啶ぞ啶溹た啶� 啶膏ぞ啶啷嵿ぐ啷�',
+        title: '啶掂た啶ぞ啶溹た啶� 啶多啶班啶粪',
+        icon: '啶掂た啶ぞ啶溹た啶� 啶嗋啶曕え',
+        url: '啶掂た啶ぞ啶溹た啶� URL',
+        metadata: '啶呧え啷嵿く 啶啶熰ぞ啶∴啶熰ぞ',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            title: '啶呧啷嵿し啶�',
+            subTitle: '啶啶熰ぞ啶∴啶熰ぞ 啶ぜ啶苦げ啷嵿啶班た啶傕 啶曕 啶膏啷嵿し啶� 啶ㄠす啷�啶� 啶曕ぐ啶ㄠぞ',
+          },
+          automatic: {
+            title: '啶膏啶掂啶距げ啶苦い',
+            subTitle: '啶夃お啶啶椸啶班啶むぞ 啶啶班ざ啷嵿え 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶啶熰ぞ啶∴啶熰ぞ 啶た啶侧啶熰ぐ啶苦啶� 啶多ぐ啷嵿い啷囙 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啷囙啷�',
+            desc: '啶曕啶掂啶班 啶掂啶班た啶忇が啶� 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶啶熰ぞ啶∴啶熰ぞ 啶ぜ啶苦げ啷嵿啶班た啶傕 啶多ぐ啷嵿い啷囙 啶夃い啷嵿お啶ㄠ啶� 啶曕ぐ啷囙',
+          },
+          manual: {
+            subTitle: '啶灌ぞ啶� 啶膏 啶啶熰ぞ啶∴啶熰ぞ 啶ぜ啶苦げ啷嵿啶班た啶傕 啶膏啶ムた啶むた啶ぞ啶� 啶溹啶∴ぜ啷囙',
+            title: '啶啶ㄠ啶呧げ',
+          },
+        },
+        panel: {
+          placeholder: '啶ぞ啶� 啶∴ぞ啶侧啶�',
+          add: '啶多ぐ啷嵿い 啶溹啶∴ぜ啷囙',
+          title: '啶啶熰ぞ啶∴啶熰ぞ 啶ぜ啶苦げ啷嵿啶� 啶膏啶ムた啶むた啶ぞ啶�',
+          select: '啶ぐ啶苦さ啶班啶むえ啶多啶� 啶曕 啶氞啶ㄠ啶�...',
+          datePlaceholder: '啶忇 啶膏ぎ啶� 啶氞啶ㄠ啶�...',
+          conditions: '啶多ぐ啷嵿い啷囙',
+          search: '啶栢啶� 啶啶熰ぞ啶∴啶熰ぞ',
+        },
+        title: '啶啶熰ぞ啶∴啶熰ぞ 啶ぜ啶苦げ啷嵿啶班た啶傕',
+      },
+    },
+    http: {
+      inputVars: '啶囙え啶啶� 啶掂啶班た啶忇が啶侧啶�',
+      api: 'API',
+      apiPlaceholder: 'URL 啶︵ぐ啷嵿 啶曕ぐ啷囙, 啶掂啶班た啶忇が啶� 啶∴ぞ啶侧え啷� 啶曕 啶侧た啶� 鈥�/鈥� 啶熰ぞ啶囙お 啶曕ぐ啷囙',
+      notStartWithHttp: 'API 啶曕 http:// 啶ぞ https:// 啶膏 啶多啶班 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶�',
+      key: '啶曕啶傕啷�',
+      value: '啶ぞ啶�',
+      bulkEdit: '啶ム啶� 啶膏啶ぞ啶︵え',
+      keyValueEdit: '啶曕啶傕啷�-啶ぞ啶� 啶膏啶ぞ啶︵え',
+      headers: '啶灌啶∴ぐ啷嵿じ',
+      params: '啶啶班ぞ啶啶熰ぐ啷嵿じ',
+      body: '啶啶∴',
+      outputVars: {
+        body: '啶啶班い啶苦啷嵿ぐ啶苦く啶� 啶膏ぞ啶啷嵿ぐ啷�',
+        statusCode: '啶啶班い啶苦啷嵿ぐ啶苦く啶� 啶膏啶ムた啶むた 啶曕啶�',
+        headers: '啶啶班い啶苦啷嵿ぐ啶苦く啶� 啶灌啶∴ぐ 啶膏啶氞 JSON',
+        files: '啶ぜ啶距啶� 啶膏啶氞',
+      },
+      authorization: {
+        'authorization': '啶呧ぇ啶苦啷冟い啶�',
+        'authorizationType': '啶呧ぇ啶苦啷冟い啶� 啶啶班啶距ぐ',
+        'no-auth': '啶曕啶� 啶ㄠす啷�啶�',
+        'api-key': 'API-啶曕',
+        'auth-type': '啶呧ぇ啶苦啷冟い啶� 啶啶班啶距ぐ',
+        'basic': '啶啶膏た啶�',
+        'bearer': '啶た啶ぐ啶�',
+        'custom': '啶曕じ啷嵿啶�',
+        'api-key-title': 'API 啶曕',
+        'header': '啶灌啶∴ぐ',
+      },
+      insertVarPlaceholder: '啶掂啶班た啶忇が啶� 啶∴ぞ啶侧え啷� 啶曕 啶侧た啶� \'/\' 啶熰ぞ啶囙お 啶曕ぐ啷囙',
+      timeout: {
+        title: '啶熰ぞ啶囙ぎ啶嗋啶�',
+        connectLabel: '啶曕え啷囙啷嵿ざ啶� 啶熰ぞ啶囙ぎ啶嗋啶�',
+        connectPlaceholder: '啶曕え啷囙啷嵿ざ啶� 啶熰ぞ啶囙ぎ啶嗋啶� 啶膏啶曕啶� 啶啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+        readLabel: '啶班啶� 啶熰ぞ啶囙ぎ啶嗋啶�',
+        readPlaceholder: '啶班啶� 啶熰ぞ啶囙ぎ啶嗋啶� 啶膏啶曕啶� 啶啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+        writeLabel: '啶班ぞ啶囙 啶熰ぞ啶囙ぎ啶嗋啶�',
+        writePlaceholder: '啶班ぞ啶囙 啶熰ぞ啶囙ぎ啶嗋啶� 啶膏啶曕啶� 啶啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+      },
+      type: '啶啶班啶距ぐ',
+      binaryFileVariable: '啶ぞ啶囙え啶班 啶ぜ啶距啶� 啶氞ぐ',
+      extractListPlaceholder: '啶膏啶氞 啶嗋啶熰ぎ 啶囙啶∴啶曕啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙, \'/\' 啶囙え啷嵿じ啶班啶� 啶掂啶班た啶忇が啶� 啶熰ぞ啶囙お 啶曕ぐ啷囙',
+      curl: {
+        placeholder: '啶す啶距 cURL 啶膏啶熰啶班た啶傕 啶啶膏啶� 啶曕ぐ啷囙',
+        title: 'cURL 啶膏 啶嗋く啶距い 啶曕ぐ啷囙',
+      },
+    },
+    code: {
+      inputVars: '啶囙え啶啶� 啶掂啶班た啶忇が啶侧啶�',
+      outputVars: '啶嗋啶熰お啷佮 啶掂啶班た啶忇が啶侧啶�',
+      advancedDependencies: '啶夃え啷嵿え啶� 啶ㄠた啶班啶ぐ啶むぞ啶忇',
+      advancedDependenciesTip:
+        '啶曕啶� 啶啶班啶侧啶∴啶� 啶ㄠた啶班啶ぐ啶むぞ啶忇 啶溹啶∴ぜ啷囙 啶溹た啶ㄠ啶� 啶夃お啶啶� 啶曕ぐ啶ㄠ 啶啶� 啶呧ぇ啶苦 啶膏ぎ啶� 啶侧啶むぞ 啶灌 啶ぞ 啶溹 啶∴た啶ぜ啷夃げ啷嵿 啶ㄠた啶班啶た啶� 啶啶� 啶ㄠす啷�啶� 啶灌啶�',
+      searchDependencies: '啶ㄠた啶班啶ぐ啶むぞ啶忇 啶栢啶溹啶�',
+    },
+    templateTransform: {
+      inputVars: '啶囙え啶啶� 啶掂啶班た啶忇が啶侧啶�',
+      code: '啶曕啶�',
+      codeSupportTip: '啶曕啶掂げ Jinja2 啶曕ぞ 啶膏ぎ啶班啶ムえ 啶曕ぐ啶むぞ 啶灌',
+      outputVars: {
+        output: '啶班啶ぞ啶傕い啶班た啶� 啶膏ぞ啶啷嵿ぐ啷�',
+      },
+    },
+    ifElse: {
+      if: '啶う啶�',
+      else: '啶呧え啷嵿く',
+      elseDescription:
+        '啶囙じ 啶むぐ啷嵿 啶曕 啶ぐ啶苦き啶距し啶苦い 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶啶班く啷嬥 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌 啶溹 啶う啶� 啶多ぐ啷嵿い 啶啶班 啶ㄠす啷�啶� 啶灌啶む 啶灌 啶む 啶ㄠた啶粪啶ぞ啶︵た啶� 啶曕た啶ぞ 啶溹ぞ啶ㄠぞ 啶氞ぞ啶灌た啶忇イ',
+      and: '啶斷ぐ',
+      or: '啶ぞ',
+      operator: '啶戉お啶班啶熰ぐ',
+      notSetVariable: '啶曕啶く啶� 啶す啶侧 啶掂啶班た啶忇が啶� 啶膏啶� 啶曕ぐ啷囙',
+      comparisonOperator: {
+        'contains': '啶多ぞ啶た啶� 啶灌',
+        'not contains': '啶多ぞ啶た啶� 啶ㄠす啷�啶� 啶灌',
+        'start with': '啶膏 啶多啶班 啶灌啶むぞ 啶灌',
+        'end with': '啶ぐ 啶膏ぎ啶距お啷嵿い 啶灌啶むぞ 啶灌',
+        'is': '啶灌',
+        'is not': '啶ㄠす啷�啶� 啶灌',
+        'empty': '啶栢ぞ啶侧 啶灌',
+        'not empty': '啶栢ぞ啶侧 啶ㄠす啷�啶� 啶灌',
+        'null': '啶多啶ㄠ啶� 啶灌',
+        'not null': '啶多啶ㄠ啶� 啶ㄠす啷�啶� 啶灌',
+        'regex match': '啶班啶椸啶曕啶� 啶啶�',
+        'in': '啶啶�',
+        'all of': '啶曕 啶膏き啷�',
+        'not exists': '啶啶溹啶� 啶ㄠす啷�啶� 啶灌',
+        'exists': '啶啶溹啶� 啶灌',
+        'not in': '啶ㄠす啷�啶� 啶灌',
+        'before': '啶す啶侧',
+        'after': '啶ぞ啶� 啶啶�',
+      },
+      enterValue: '啶ぞ啶� 啶︵ぐ啷嵿 啶曕ぐ啷囙',
+      addCondition: '啶多ぐ啷嵿い 啶溹啶∴ぜ啷囙',
+      conditionNotSetup: '啶多ぐ啷嵿い 啶膏啶熰啶� 啶ㄠす啷�啶� 啶灌',
+      selectVariable: '啶氞ぐ 啶曕ぞ 啶氞く啶� 啶曕ぐ啷囙...',
+      optionName: {
+        url: '啶啶嗋ぐ啶忇げ',
+        video: '啶掂啶∴た啶',
+        doc: '啶∴啶曕啶熰ぐ',
+        localUpload: '啶膏啶ムぞ啶ㄠ啶� 啶呧お啶侧啶�',
+        image: '啶涏さ啶�',
+        audio: '啶戉ぁ啶苦く啷�',
+      },
+      select: '啶氞啶ㄠえ啶�',
+      addSubVariable: '啶夃お 啶氞ぐ',
+      condition: '啶膏啶ムた啶むた',
+    },
+    variableAssigner: {
+      title: '啶掂啶班た啶忇が啶侧啶� 啶呧じ啶距啶� 啶曕ぐ啷囙',
+      outputType: '啶嗋啶熰お啷佮 啶啶班啶距ぐ',
+      varNotSet: '啶掂啶班た啶忇が啶� 啶膏啶� 啶ㄠす啷�啶� 啶灌',
+      noVarTip: '啶呧じ啶距啶� 啶曕た啶� 啶溹ぞ啶ㄠ 啶掂ぞ啶侧 啶掂啶班た啶忇が啶侧啶� 啶溹啶∴ぜ啷囙',
+      type: {
+        string: '啶膏啶熰啶班た啶傕',
+        number: '啶ㄠ啶ぐ',
+        object: '啶戉が啷嵿啷囙啷嵿',
+        array: '啶愢ぐ啷�',
+      },
+      aggregationGroup: '啶忇啷嵿ぐ啷�啶椸啶多え 啶椸啶班啶�',
+      aggregationGroupTip:
+        '啶囙じ 啶膏啶掂た啶оぞ 啶曕 啶膏啷嵿し啶� 啶曕ぐ啶ㄠ 啶膏 啶掂啶班た啶忇が啶� 啶忇啷嵿ぐ啷�啶椸啶熰ぐ 啶曕 啶げ啷嵿啷�啶げ 啶膏啶熰啶� 啶戉か 啶掂啶班た啶忇が啶侧啶� 啶曕 啶忇啷嵿ぐ啷�啶椸啶� 啶曕ぐ啶ㄠ 啶曕 啶呧え啷佮ぎ啶むた 啶た啶侧い啷� 啶灌啷�',
+      addGroup: '啶椸啶班啶� 啶溹啶∴ぜ啷囙',
+      outputVars: {
+        varDescribe: '{{groupName}} 啶嗋啶熰お啷佮',
+      },
+      setAssignVariable: '啶呧じ啶距啶� 啶掂啶班た啶忇が啶� 啶膏啶� 啶曕ぐ啷囙',
+    },
+    assigner: {
+      'assignedVariable': '啶呧じ啶距啶� 啶曕た啶ぞ 啶椸く啶� 啶氞ぐ',
+      'writeMode': '啶侧た啶栢え啷� 啶曕ぞ 啶啶�',
+      'writeModeTip': '啶溹が 啶呧じ啶距啶� 啶曕た啶ぞ 啶椸く啶� 啶氞ぐ 啶忇 啶膏ぐ啶` 啶灌啶むぞ 啶灌, 啶む 啶溹啶∴ぜ啶ㄠ 啶曕ぞ 啶啶� 啶呧啶� 啶啶� 啶溹啶∴ぜ啶むぞ 啶灌啷�',
+      'over-write': '啶撪さ啶班ぐ啶距啶� 啶曕ぐ啷囙',
+      'append': '啶溹啶∴ぜ啷囙',
+      'plus': '啶溹ぎ啶�',
+      'clear': '啶膏ぞ啶ぜ 啶曕ぐ啷囙',
+      'setVariable': '啶氞ぐ 啶膏啶� 啶曕ぐ啷囙',
+      'variable': '啶氞ぐ',
+      'operations': {
+        'clear': '啶膏啶し啷嵿',
+        '/=': '/=',
+        '*=': '*=',
+        'over-write': '啶呧ぇ啶苦げ啷囙啶苦い',
+        'title': '啶ぐ啶苦啶距げ啶�',
+        '+=': '+=',
+        'overwrite': '啶呧ぇ啶苦げ啷囙啶苦い',
+        'set': '啶呧じ啷嵿い 啶灌',
+        'extend': '啶じ啶距ぐ',
+        '-=': '-=',
+        'append': '啶膏啶侧啷嵿え',
+        'remove-first': '啶す啶侧ぞ 啶灌啶距',
+        'remove-last': '啶呧啶むた啶� 啶灌啶距啶�',
+      },
+      'setParameter': '啶啶班ぞ啶啶熰ぐ 啶膏啶� 啶曕ぐ啷囙...',
+      'noVarTip': '啶氞ぐ 啶溹啶∴ぜ啶ㄠ 啶曕 啶侧た啶� "+" 啶啶� 啶ぐ 啶曕啶侧た啶� 啶曕ぐ啷囙',
+      'variables': '啶氞ぐ',
+      'selectAssignedVariable': '啶呧じ啶距啶� 啶曕た啶� 啶椸 啶氞ぐ 啶曕ぞ 啶氞く啶� 啶曕ぐ啷囙...',
+      'varNotSet': '啶氞ぐ 啶膏啶� 啶ㄠす啷�啶�',
+      'assignedVarsDescription': '啶呧じ啶距啶� 啶曕た啶� 啶椸 啶氞ぐ 啶侧た啶栢え啷� 啶啶椸啶� 啶氞ぐ 啶灌啶ㄠ 啶氞ぞ啶灌た啶�, 啶溹啶膏 啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶氞ぐ啷�',
+      'noAssignedVars': '啶曕啶� 啶夃お啶侧が啷嵿ぇ 啶呧じ啶距啶� 啶曕た啶� 啶椸 啶氞ぐ 啶ㄠす啷�啶�',
+    },
+    tool: {
+      toAuthorize: '啶呧ぇ啶苦啷冟い 啶曕ぐ啶ㄠ 啶曕 啶侧た啶�',
+      inputVars: '啶囙え啶啶� 啶掂啶班た啶忇が啶侧啶�',
+      outputVars: {
+        text: '啶夃お啶曕ぐ啶� 啶︵啶掂ぞ啶班ぞ 啶夃い啷嵿お啶ㄠ啶� 啶膏ぞ啶啷嵿ぐ啷�',
+        files: {
+          title: '啶夃お啶曕ぐ啶� 啶︵啶掂ぞ啶班ぞ 啶夃い啷嵿お啶ㄠ啶� 啶ぞ啶囙げ啷囙',
+          type: '啶膏ぎ啶班啶ムえ 啶啶班啶距ぐ啷� 啶呧が 啶曕啶掂げ 啶囙ぎ啷囙 啶曕ぞ 啶膏ぎ啶班啶ムえ 啶曕ぐ啶むぞ 啶灌',
+          transfer_method: '啶熰啶班ぞ啶傕じ啶ぐ 啶啶ムぁ啷� 啶ぞ啶� 啶班た啶啶焈啶啶嗋ぐ啶忇げ 啶ぞ 啶侧啶曕げ_啶ぞ啶囙げ 啶灌',
+          url: '啶囙ぎ啷囙 啶啶嗋ぐ啶忇げ',
+          upload_file_id: '啶呧お啶侧啶� 啶ぜ啶距啶� 啶嗋啶∴',
+        },
+        json: '啶夃お啶曕ぐ啶� 啶︵啶掂ぞ啶班ぞ 啶夃い啷嵿お啶ㄠ啶� JSON',
+      },
+    },
+    questionClassifiers: {
+      model: '啶啶∴げ',
+      inputVars: '啶囙え啶啶� 啶掂啶班た啶忇が啶侧啶�',
+      outputVars: {
+        className: '啶曕啶侧ぞ啶� 啶ㄠぞ啶�',
+      },
+      class: '啶曕啶侧ぞ啶�',
+      classNamePlaceholder: '啶呧お啶ㄠぞ 啶曕啶侧ぞ啶� 啶ㄠぞ啶� 啶侧た啶栢啶�',
+      advancedSetting: '啶夃え啷嵿え啶� 啶膏啶熰た啶傕',
+      topicName: '啶掂た啶粪く 啶ㄠぞ啶�',
+      topicPlaceholder: '啶呧お啶ㄠぞ 啶掂た啶粪く 啶ㄠぞ啶� 啶侧た啶栢啶�',
+      addClass: '啶曕啶侧ぞ啶� 啶溹啶∴ぜ啷囙',
+      instruction: '啶ㄠた啶班啶︵啶�',
+      instructionTip:
+        '啶啶班ざ啷嵿え 啶掂ぐ啷嵿啷�啶曕ぐ啶`啶班啶むぞ 啶曕 啶啶班ざ啷嵿え啷嬥 啶曕 啶掂ぐ啷嵿啷�啶曕啶� 啶曕ぐ啶ㄠ 啶曕 啶むぐ啷�啶曕 啶曕 啶膏ぎ啶澿え啷� 啶啶� 啶う啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶呧い啶苦ぐ啶苦啷嵿い 啶ㄠた啶班啶︵啶� 啶︵啶傕イ',
+      instructionPlaceholder: '啶呧お啶ㄠぞ 啶ㄠた啶班啶︵啶� 啶侧た啶栢啶�',
+    },
+    parameterExtractor: {
+      inputVar: '啶囙え啶啶� 啶掂啶班た啶忇が啶�',
+      extractParameters: '啶啶班ぞ啶啶熰ぐ啷嵿じ 啶ㄠた啶曕ぞ啶侧啶�',
+      importFromTool: '啶夃お啶曕ぐ啶`啶� 啶膏 啶嗋く啶距い 啶曕ぐ啷囙',
+      addExtractParameter: '啶忇啷嵿じ啶熰啶班啶曕啶� 啶啶班ぞ啶啶熰ぐ 啶溹啶∴ぜ啷囙',
+      addExtractParameterContent: {
+        name: '啶ㄠぞ啶�',
+        namePlaceholder: '啶忇啷嵿じ啶熰啶班啶曕啶� 啶啶班ぞ啶啶熰ぐ 啶ㄠぞ啶�',
+        type: '啶啶班啶距ぐ',
+        typePlaceholder: '啶忇啷嵿じ啶熰啶班啶曕啶� 啶啶班ぞ啶啶熰ぐ 啶啶班啶距ぐ',
+        description: '啶掂た啶掂ぐ啶�',
+        descriptionPlaceholder: '啶忇啷嵿じ啶熰啶班啶曕啶� 啶啶班ぞ啶啶熰ぐ 啶掂た啶掂ぐ啶�',
+        required: '啶嗋さ啶多啶',
+        requiredContent:
+          '啶嗋さ啶多啶 啶曕啶掂げ 啶啶∴げ 啶呧え啷佮ぎ啶距え 啶曕 啶侧た啶� 啶忇 啶膏啶︵ぐ啷嵿き 啶曕 啶班啶� 啶啶� 啶夃お啶啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌, 啶斷ぐ 啶啶班ぞ啶啶熰ぐ 啶嗋啶熰お啷佮 啶曕 啶呧え啶苦さ啶距ぐ啷嵿く 啶ぞ啶ㄠ啶い啶� 啶曕 啶侧た啶� 啶ㄠす啷�啶傕イ',
+      },
+      extractParametersNotSet: '啶忇啷嵿じ啶熰啶班啶曕啶� 啶啶班ぞ啶啶熰ぐ啷嵿じ 啶膏啶熰啶� 啶ㄠす啷�啶� 啶曕た啶� 啶椸 啶灌啶�',
+      instruction: '啶ㄠた啶班啶︵啶�',
+      instructionTip:
+        '啶啶班ぞ啶啶熰ぐ 啶ㄠた啶曕ぞ啶侧え啷� 啶掂ぞ啶侧 啶曕 啶膏ぎ啶澿え啷� 啶啶� 啶う啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶呧い啶苦ぐ啶苦啷嵿い 啶ㄠた啶班啶︵啶� 啶︵啶� 啶曕た 啶曕啶膏 啶啶班ぞ啶啶熰ぐ啷嵿じ 啶ㄠた啶曕ぞ啶侧啶傕イ',
+      advancedSetting: '啶夃え啷嵿え啶� 啶膏啶熰た啶傕',
+      reasoningMode: '啶班啶溹ぜ啶ㄠた啶傕 啶啶�',
+      reasoningModeTip:
+        '啶ぜ啶傕啷嵿ざ啶� 啶曕啶侧た啶傕 啶ぞ 啶啶班啶啶啶熰啶� 啶曕 啶侧た啶� 啶ㄠた啶班啶︵啶多啶� 啶曕ぞ 啶溹さ啶距が 啶︵啶ㄠ 啶曕 啶啶∴げ 啶曕 啶曕啶粪ぎ啶むぞ 啶曕 啶嗋ぇ啶距ぐ 啶ぐ 啶夃お啶啶曕啶� 啶班啶溹ぜ啶ㄠた啶傕 啶啶� 啶氞啶� 啶膏啶む 啶灌啶傕イ',
+      isSuccess: '啶膏か啶侧い啶� 啶灌啷� 啶膏か啶侧い啶� 啶ぐ 啶ぞ啶� 1 啶灌, 啶呧じ啶げ啶むぞ 啶ぐ 啶ぞ啶� 0 啶灌啷�',
+      errorReason: '啶む啶班啶熰た 啶曕ぞ 啶曕ぞ啶班ぃ',
+    },
+    iteration: {
+      deleteTitle: '啶囙啶班啶多え 啶ㄠ啶� 啶灌啶距啶�?',
+      deleteDesc: '啶囙啶班啶多え 啶ㄠ啶� 啶灌啶距え啷� 啶膏 啶膏き啷� 啶氞ぞ啶囙げ啷嵿ぁ 啶ㄠ啶∴啶� 啶灌 啶溹ぞ啶忇啶椸',
+      input: '啶囙え啶啶�',
+      output: '啶嗋啶熰お啷佮 啶掂啶班た啶忇が啶侧啶�',
+      iteration_one: '{{count}} 啶囙啶班啶多え',
+      iteration_other: '{{count}} 啶囙啶班啶多え啷嵿じ',
+      currentIteration: '啶掂ぐ啷嵿い啶ぞ啶� 啶囙啶班啶多え',
+      ErrorMethod: {
+        operationTerminated: '啶膏ぎ啶距お啷嵿い',
+        continueOnError: '啶溹ぞ啶班 啶班啷囙-啶ぐ-啶む啶班啶熰た',
+        removeAbnormalOutput: '啶ㄠた啶曕ぞ啶侧啶�-啶呧じ啶距ぎ啶距え啷嵿く-啶嗋啶熰お啷佮',
+      },
+      comma: ',',
+      error_other: '{{啶椸た啶ㄠい啷�}} 啶む啶班啶熰た啶啶�',
+      error_one: '{{啶椸た啶ㄠい啷�}} 啶氞啶�',
+      parallelMode: '啶膏ぎ啶距え啶距啶むぐ 啶啶�',
+      parallelModeUpper: '啶膏ぎ啶距え啶距啶むぐ 啶啶�',
+      errorResponseMethod: '啶む啶班啶熰た 啶啶班い啶苦啷嵿ぐ啶苦く啶� 啶掂た啶оた',
+      MaxParallelismTitle: '啶呧ぇ啶苦啶むぎ 啶膏ぎ啶距啶むぐ啶むぞ',
+      parallelModeEnableTitle: '啶膏ぎ啶距え啶距啶むぐ 啶啶� 啶膏啷嵿し啶� 啶曕た啶ぞ 啶椸く啶�',
+      parallelModeEnableDesc: '啶膏ぎ啶距え啶距啶むぐ 啶啶� 啶啶�, 啶啶ㄠぐ啶距さ啷冟い啷嵿い啶苦く啷嬥 啶曕 啶啶むぐ 啶曕ぞ啶班啶� 啶膏ぎ啶距え啶距啶むぐ 啶ㄠた啶粪啶ぞ啶︵え 啶曕ぞ 啶膏ぎ啶班啶ムえ 啶曕ぐ啶む 啶灌啶傕イ 啶嗋お 啶囙じ啷� 啶︵ぞ啶堗 啶撪ぐ 啶椸啶� 啶啶ㄠげ 啶啶� 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ 啶膏啶む 啶灌啶傕イ',
+      parallelPanelDesc: '啶膏ぎ啶距え啶距啶むぐ 啶啶� 啶啶�, 啶啶ㄠぐ啶距さ啷冟い啷嵿い啶� 啶啶� 啶曕ぞ啶班啶� 啶膏ぎ啶距え啶距啶むぐ 啶ㄠた啶粪啶ぞ啶︵え 啶曕ぞ 啶膏ぎ啶班啶ムえ 啶曕ぐ啶む 啶灌啶傕イ',
+      MaxParallelismDesc: '啶呧ぇ啶苦啶むぎ 啶膏ぎ啶距啶むぐ啶むぞ 啶曕ぞ 啶夃お啶啶� 啶忇啶� 啶啶ㄠぐ啶距さ啷冟い啷嵿い啶� 啶啶� 啶忇 啶膏ぞ啶� 啶ㄠた啶粪啶ぞ啶︵た啶� 啶曕ぞ啶班啶啶� 啶曕 啶膏啶栢啶ぞ 啶曕 啶ㄠた啶啶む啶班た啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶曕た啶ぞ 啶溹ぞ啶むぞ 啶灌啷�',
+      answerNodeWarningDesc: '啶膏ぎ啶距え啶距啶むぐ 啶啶� 啶氞啶むぞ啶掂え啷�: 啶夃い啷嵿い啶� 啶ㄠ啶∴啶�, 啶掂ぞ啶班啶むぞ啶侧ぞ啶� 啶氞ぐ 啶呧じ啶距啶ㄠぎ啷囙啶�, 啶斷ぐ 啶啶ㄠぐ啶距さ啷冟い啷嵿い啶苦く啷嬥 啶曕 啶啶むぐ 啶侧啶距い啶距ぐ 啶あ啶监え啷�/啶侧た啶栢え啷� 啶曕 啶曕ぞ啶班啶班さ啶距 啶呧お啶掂ぞ啶� 啶啶︵ぞ 啶曕ぐ 啶膏啶む 啶灌啷�',
+    },
+    note: {
+      addNote: '啶ㄠ啶� 啶溹啶∴ぜ啷囙',
+      editor: {
+        placeholder: '啶呧お啶ㄠぞ 啶ㄠ啶� 啶侧た啶栢啶�...',
+        small: '啶涏啶熰ぞ',
+        medium: '啶ぇ啷嵿く啶�',
+        large: '啶ぁ啶监ぞ',
+        bold: '啶啶侧啶�',
+        italic: '啶囙啷堗げ啶苦',
+        strikethrough: '啶膏啶熰啶班ぞ啶囙啶ム啶班',
+        link: '啶侧た啶傕',
+        openLink: '啶栢啶侧啶�',
+        unlink: '啶侧た啶傕 啶灌啶距啶�',
+        enterUrl: 'URL 啶︵ぐ啷嵿 啶曕ぐ啷囙...',
+        invalidUrl: '啶呧さ啷堗ぇ URL',
+        bulletList: '啶啶侧啶� 啶侧た啶膏啶�',
+        showAuthor: '啶侧啶栢 啶︵た啶栢ぞ啶忇',
+      },
+    },
+    docExtractor: {
+      outputVars: {
+        text: '啶ㄠた啶曕ぞ啶侧ぞ 啶椸く啶� 啶ぞ啶�',
+      },
+      learnMore: '啶斷ぐ 啶溹ぞ啶ㄠ',
+      supportFileTypes: '啶膏ぎ啶班啶ムえ 啶ぜ啶距啶� 啶啶班啶距ぐ: {{啶啶班啶距ぐ}}啷�',
+      inputVar: '啶囙え啶啶� 啶掂啶班た啶忇が啶�',
+    },
+    listFilter: {
+      outputVars: {
+        result: '啶ぐ啶苦ぃ啶距ぎ 啶ぜ啶苦げ啷嵿啶� 啶曕ぐ啷囙',
+        last_record: '啶た啶涏げ啶� 啶班た啶曕啶班啶�',
+        first_record: '啶す啶侧ぞ 啶班た啶曕啶班啶�',
+      },
+      limit: '啶多啶班啶� N',
+      asc: '啶忇啶膏じ啷�',
+      filterConditionKey: '啶ぜ啶苦げ啷嵿啶� 啶膏啶ムた啶むた 啶曕啶傕啷�',
+      filterConditionComparisonValue: '啶ぜ啶苦げ啷嵿啶� 啶膏啶ムた啶むた 啶ぞ啶�',
+      filterCondition: '啶ぜ啶苦げ啷嵿啶� 啶曕 啶膏啶ムた啶むた',
+      orderBy: '啶︵啶掂ぞ啶班ぞ 啶嗋う啷囙ざ 啶︵啶�',
+      desc: '啶掂た啶掂ぐ啶�',
+      filterConditionComparisonOperator: '啶ぜ啶苦げ啷嵿啶� 啶多ぐ啷嵿い 啶む啶侧え 啶戉お啶班啶熰ぐ',
+      selectVariableKeyPlaceholder: '啶夃お 啶氞ぐ 啶曕啶傕啷� 啶曕ぞ 啶氞く啶� 啶曕ぐ啷囙',
+      inputVar: '啶囙え啶啶� 啶掂啶班た啶忇が啶�',
+      extractsCondition: 'N 啶嗋啶熰ぎ 啶ㄠた啶曕ぞ啶侧啶�',
+    },
+    agent: {
+      strategy: {
+        shortLabel: '啶班ぃ啶ㄠ啶むた',
+        label: '啶忇啷囙啶熰た啶� 啶班ぃ啶ㄠ啶むた',
+        selectTip: '啶忇啷囙啶熰た啶� 啶班ぃ啶ㄠ啶むた 啶氞啶ㄠ啶�',
+        searchPlaceholder: '啶忇啷囙啶熰た啶� 啶班ぃ啶ㄠ啶むた 啶栢啶溹啶�',
+        configureTip: '啶曕啶く啶� 啶忇啷囙啶熰た啶� 啶班ぃ啶ㄠ啶むた 啶曕 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙啷�',
+        configureTipDesc: '啶忇啷囙啶熰た啶� 啶班ぃ啶ㄠ啶むた 啶曕 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啶ㄠ 啶曕 啶ぞ啶�, 啶す 啶ㄠ啶� 啶膏啶掂啶距げ啶苦い 啶班啶� 啶膏 啶多啶� 啶曕啶ㄠ啶ぜ啶苦啶班啶多え 啶侧啶� 啶曕ぐ啷囙啶距イ 啶す 啶班ぃ啶ㄠ啶むた 啶す啷�-啶氞ぐ啶� 啶夃お啶曕ぐ啶� 啶むぐ啷嵿 啶曕 啶む啶む啶� 啶曕 啶啶班き啶距さ啶苦い 啶曕ぐ啷囙啷�啷�',
+        tooltip: '啶掂た啶た啶ㄠ啶� 啶忇啷囙啶熰た啶� 啶班ぃ啶ㄠ啶むた啶ぞ啶� 啶ㄠた啶班啶оぞ啶班た啶� 啶曕ぐ啶む 啶灌啶� 啶曕た 啶啶班ぃ啶距げ啷� 啶す啷�-啶氞ぐ啶� 啶夃お啶曕ぐ啶� 啶曕啶� 啶曕 啶啶溹え啶� 啶曕啶膏 啶え啶距い啷� 啶灌 啶斷ぐ 啶夃え啷嵿す啷囙 啶曕啶膏 啶ㄠた啶粪啶ぞ啶︵た啶� 啶曕ぐ啶む 啶灌啷�',
+      },
+      pluginInstaller: {
+        install: '啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙',
+        installing: '啶膏啶ムぞ啶た啶� 啶曕ぐ啶ㄠぞ',
+      },
+      modelNotInMarketplace: {
+        desc: '啶す 啶啶∴げ 啶膏啶ムぞ啶ㄠ啶� 啶ぞ 啶椸た啶熰す啶� 啶班た啶啶溹た啶熰ぐ啷� 啶膏 啶膏啶ムぞ啶た啶� 啶曕た啶ぞ 啶椸く啶� 啶灌啷� 啶曕啶く啶� 啶膏啶ムぞ啶え啶� 啶曕 啶ぞ啶� 啶夃お啶啶� 啶曕ぐ啷囙啷�',
+        manageInPlugins: '啶啶侧啶囙え啷嵿じ 啶啶� 啶啶班が啶傕ぇ啶苦い 啶曕ぐ啷囙',
+        title: '啶啶∴げ 啶膏啶ムぞ啶た啶� 啶ㄠす啷�啶� 啶灌',
+      },
+      modelNotSupport: {
+        desc: '啶膏啶ムぞ啶た啶� 啶啶侧啶囙え 啶膏啶膏啶曕ぐ啶� 啶囙じ 啶啶∴げ 啶曕 啶啶班う啶距え 啶ㄠす啷�啶� 啶曕ぐ啶むぞ 啶灌啷�',
+        descForVersionSwitch: '啶膏啶ムぞ啶た啶� 啶啶侧啶囙え 啶膏啶膏啶曕ぐ啶� 啶囙じ 啶啶∴げ 啶曕 啶啶班う啶距え 啶ㄠす啷�啶� 啶曕ぐ啶むぞ 啶灌啷� 啶膏啶膏啶曕ぐ啶� 啶う啶侧え啷� 啶曕 啶侧た啶� 啶曕啶侧た啶� 啶曕ぐ啷囙啷�',
+        title: '啶呧じ啶ぐ啷嵿ぅ啶苦い 啶啶∴げ',
+      },
+      modelSelectorTooltips: {
+        deprecated: '啶す 啶啶∴げ 啶呧お啷嵿ぐ啶氞げ啶苦い 啶灌啷�',
+      },
+      outputVars: {
+        files: {
+          transfer_method: '啶膏啶ムぞ啶ㄠぞ啶傕い啶班ぃ 啶掂た啶оた啷� 啶ぞ啶� 啶ぞ 啶む remote_url 啶灌 啶ぞ local_file啷�',
+          url: '啶涏さ啶� 啶啶嗋ぐ啶忇げ',
+          upload_file_id: '啶ぞ啶囙げ 啶嗋啶∴ 啶呧お啶侧啶� 啶曕ぐ啷囙',
+          type: '啶膏ぎ啶班啶ムえ 啶啶班啶距ぐ啷� 啶呧が 啶曕啶掂げ 啶膏ぎ啶班啶ムえ 啶涏さ啶�',
+          title: '啶忇啷囙啶� 啶︵啶掂ぞ啶班ぞ 啶夃い啷嵿お啶ㄠ啶� 啶ぜ啶距啶侧啶�',
+        },
+        text: '啶忇啷囙啶� 啶︵啶掂ぞ啶班ぞ 啶夃い啷嵿お啶ㄠ啶� 啶膏ぞ啶啷嵿ぐ啷�',
+        json: '啶忇啷囙啶� 啶︵啶掂ぞ啶班ぞ 啶夃い啷嵿お啶ㄠ啶� 啶溹啶膏え',
+      },
+      checkList: {
+        strategyNotSelected: '啶班ぃ啶ㄠ啶むた 啶曕ぞ 啶氞く啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶�',
+      },
+      installPlugin: {
+        install: '啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙',
+        title: '啶啶侧啶囙え 啶膏啶ムぞ啶た啶� 啶曕ぐ啷囙',
+        changelog: '啶ぐ啶苦さ啶班啶むえ 啶侧啶�',
+        desc: '啶ㄠた啶啶ㄠげ啶苦啶苦い 啶啶侧啶囙え 啶膏啶ムぞ啶た啶� 啶曕ぐ啶ㄠ 啶掂ぞ啶侧 啶灌啶�',
+        cancel: '啶班う啷嵿う 啶曕ぐ啷囙',
+      },
+      unsupportedStrategy: '啶呧じ啶ぐ啷嵿ぅ啶苦い 啶班ぃ啶ㄠ啶むた',
+      modelNotSelected: '啶啶∴げ 啶曕ぞ 啶氞く啶� 啶ㄠす啷�啶� 啶曕た啶ぞ 啶椸く啶�',
+      tools: '啶夃お啶曕ぐ啶�',
+      strategyNotInstallTooltip: '{{strategy}} 啶膏啶ムぞ啶た啶� 啶ㄠす啷�啶� 啶灌',
+      toolNotInstallTooltip: '{{tool}} 啶膏啶ムぞ啶た啶� 啶ㄠす啷�啶� 啶灌',
+      toolbox: '啶熰啶侧が啷夃啷嵿じ',
+      learnMore: '啶斷ぐ 啶呧ぇ啶苦 啶溹ぞ啶ㄠ啶�',
+      strategyNotFoundDesc: '啶膏啶ムぞ啶た啶� 啶啶侧啶囙え 啶膏啶膏啶曕ぐ啶� 啶す 啶班ぃ啶ㄠ啶むた 啶啶班う啶距え 啶ㄠす啷�啶� 啶曕ぐ啶むぞ 啶灌啷�',
+      toolNotAuthorizedTooltip: '{{tool}} 啶呧ぇ啶苦啷冟い 啶ㄠす啷�啶� 啶灌',
+      pluginNotInstalled: '啶す 啶啶侧啶囙え 啶膏啶ムぞ啶た啶� 啶ㄠす啷�啶� 啶灌',
+      model: '啶啶∴げ',
+      notAuthorized: '啶呧ぇ啶苦啷冟い 啶ㄠす啷�啶�',
+      pluginNotInstalledDesc: '啶す 啶啶侧啶囙え 啶椸た啶熰す啶� 啶膏 啶膏啶ムぞ啶た啶� 啶曕た啶ぞ 啶椸く啶� 啶灌啷� 啶曕啶く啶� 啶啶ㄠ 啶膏啶ムぞ啶た啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶啶侧啶囙え啷嵿じ 啶ぐ 啶溹ぞ啶忇啷�',
+      configureModel: '啶啶∴げ 啶曕啶ㄠ啶ぜ啶苦啶� 啶曕ぐ啷囙',
+      linkToPlugin: '啶啶侧啶囙え啷嵿じ 啶曕 啶侧た啶� 啶侧た啶傕',
+      modelNotInstallTooltip: '啶す 啶啶∴げ 啶膏啶ムぞ啶た啶� 啶ㄠす啷�啶� 啶灌',
+      pluginNotFoundDesc: '啶す 啶啶侧啶囙え 啶椸た啶熰す啶� 啶膏 啶膏啶ムぞ啶た啶� 啶曕た啶ぞ 啶椸く啶� 啶灌啷� 啶曕啶く啶� 啶啶ㄠ 啶膏啶ムぞ啶た啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶啶侧啶囙え啷嵿じ 啶ぐ 啶溹ぞ啶忇啷�',
+      maxIterations: '啶呧ぇ啶苦啶むぎ 啶啶ㄠぐ啶距さ啷冟い啷嵿い啶苦く啶距',
+      strategyNotSet: '啶忇啷囙啶熰た啶� 啶班ぃ啶ㄠ啶むた 啶膏啶� 啶ㄠす啷�啶� 啶曕 啶椸',
+      strategyNotFoundDescAndSwitchVersion: '啶膏啶ムぞ啶た啶� 啶啶侧啶囙え 啶膏啶膏啶曕ぐ啶� 啶囙じ 啶班ぃ啶ㄠ啶むた 啶曕 啶啶班う啶距え 啶ㄠす啷�啶� 啶曕ぐ啶むぞ 啶灌啷� 啶膏啶膏啶曕ぐ啶� 啶う啶侧え啷� 啶曕 啶侧た啶� 啶曕啶侧た啶� 啶曕ぐ啷囙啷�',
+    },
+    loop: {
+      ErrorMethod: {
+        continueOnError: '啶む啶班啶熰た 啶ぐ 啶溹ぞ啶班 啶班啷囙',
+        removeAbnormalOutput: '啶呧じ啶距ぎ啶距え啷嵿く 啶嗋啶熰お啷佮 啶灌啶距啶�',
+        operationTerminated: '啶膏ぎ啶距お啷嵿い',
+      },
+      inputMode: '啶囙え啶啶� 啶啶�',
+      output: '啶嗋啶熰お啷佮 啶掂啶班た啶忇が啶�',
+      input: '啶囙え啶啶�',
+      loop_other: '{{count}} 啶侧啶啶�',
+      currentLoop: '啶掂ぐ啷嵿い啶ぞ啶� 啶侧啶�',
+      deleteTitle: '啶侧啶� 啶ㄠ啶� 啶灌啶距啶�?',
+      error_other: '{{count}} 啶む啶班啶熰た啶ぞ啶�',
+      loopMaxCount: '啶呧ぇ啶苦啶むぎ 啶侧啶� 啶椸ぃ啶ㄠぞ',
+      comma: ',',
+      deleteDesc: '啶侧啶� 啶ㄠ啶� 啶曕 啶灌啶距え啷� 啶膏 啶膏き啷� 啶ぞ啶� 啶ㄠ啶� 啶灌 啶溹ぞ啶忇啶椸',
+      error_one: '{{count}} 啶む啶班啶熰た',
+      currentLoopCount: '啶掂ぐ啷嵿い啶ぞ啶� 啶侧啶� 啶椸た啶ㄠい啷�: {{count}}',
+      loopNode: '啶侧啶� 啶ㄠ啶�',
+      loop_one: '{{count}} 啶侧啶�',
+      initialLoopVariables: '啶啶班ぞ啶班啶た啶� 啶侧啶� 啶氞ぐ',
+      finalLoopVariables: '啶呧啶むた啶� 啶侧啶� 啶掂啶班た啶忇が啶侧啶�',
+      variableName: '啶氞ぐ 啶氞ぐ 啶ㄠぞ啶�',
+      errorResponseMethod: '啶む啶班啶熰た 啶啶班い啶苦啷嵿ぐ啶苦く啶� 啶掂た啶оた',
+      totalLoopCount: '啶曕啶� 啶侧啶� 啶椸た啶ㄠい啷�: {{count}}',
+      breakCondition: '啶侧啶� 啶膏ぎ啶距お啷嵿い啶� 啶膏啶ムた啶むた',
+      loopMaxCountError: '啶曕啶く啶� 啶呧ぇ啶苦啶むぎ 啶侧啶� 啶膏啶栢啶ぞ 啶︵ぐ啷嵿 啶曕ぐ啷囙, 啶溹 1 啶膏 {{maxCount}} 啶曕 啶啶� 啶灌',
+      setLoopVariables: '啶侧啶� 啶膏啶曕啶� 啶曕 啶啶むぐ 啶掂啶班た啶忇が啶� 啶膏啶� 啶曕ぐ啷囙',
+      exitConditionTip: '啶忇 啶侧啶� 啶ㄠ啶� 啶曕 啶曕ぎ 啶膏 啶曕ぎ 啶忇 啶ㄠた啶曕ぞ啶膏 啶膏啶ムた啶むた 啶曕 啶嗋さ啶多啶啶むぞ 啶灌啶む 啶灌',
+      loopVariables: '啶侧啶� 啶掂啶班た啶啶げ啷嵿じ',
+      breakConditionTip: '啶膏た啶班啶� 啶夃え 啶氞ぐ 啶曕 啶膏啶︵ぐ啷嵿き啶苦い 啶曕た啶ぞ 啶溹ぞ 啶膏啶むぞ 啶灌 啶溹 啶侧啶� 啶曕 啶啶むぐ 啶灌啶� 啶溹た啶ㄠぎ啷囙 啶膏ぎ啶距お啷嵿い啶� 啶曕 啶多ぐ啷嵿い啷囙 啶斷ぐ 啶ぞ啶む啷�啶� 啶曕 啶氞ぐ 啶灌啶傕イ',
+    },
+  },
+  tracing: {
+    stopBy: '{{user}} 啶︵啶掂ぞ啶班ぞ 啶班啶曕ぞ 啶椸く啶�',
+  },
+  variableReference: {
+    conversationVars: '啶ぞ啶む啷�啶� 啶氞ぐ',
+    noAvailableVars: '啶曕啶� 啶夃お啶侧が啷嵿ぇ 啶氞ぐ 啶ㄠす啷�啶�',
+    assignedVarsDescription: '啶呧じ啶距啶� 啶曕た啶� 啶椸 啶氞ぐ 啶侧た啶栢え啷� 啶啶椸啶� 啶氞ぐ 啶灌啶ㄠ 啶氞ぞ啶灌た啶�, 啶溹啶膏',
+    noVarsForOperation: '啶氞く啶ㄠた啶� 啶曕ぞ啶班啶班さ啶距 啶曕 啶膏ぞ啶� 啶呧じ啶距啶ㄠぎ啷囙啶� 啶曕 啶侧た啶� 啶曕啶� 啶氞ぐ 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶� 啶灌啶�.',
+    noAssignedVars: '啶曕啶� 啶夃お啶侧が啷嵿ぇ 啶呧じ啶距啶� 啶曕た啶� 啶椸 啶氞ぐ 啶ㄠす啷�啶�',
+  },
+  versionHistory: {
+    filter: {
+      reset: '啶た啶侧啶熰ぐ 啶班啶膏啶� 啶曕ぐ啷囙',
+      all: '啶膏が',
+      onlyShowNamedVersions: '啶曕啶掂げ 啶ㄠぞ啶た啶� 啶膏啶膏啶曕ぐ啶� 啶︵た啶栢ぞ啶忇',
+      onlyYours: '啶じ 啶む啶啶灌ぞ啶班ぞ',
+      empty: '啶曕啶� 啶啶� 啶栢ぞ啶むぞ 啶灌啶� 啶膏啶膏啶曕ぐ啶� 啶囙い啶苦す啶距じ 啶ㄠす啷�啶� 啶た啶侧ぞ',
+    },
+    editField: {
+      title: '啶多啶班啶粪',
+      releaseNotesLengthLimit: '啶班た啶侧啶� 啶ㄠ啶熰啶� {{limit}} 啶呧啷嵿し啶班啶� 啶膏 啶呧ぇ啶苦 啶ㄠす啷�啶� 啶灌 啶膏啶む 啶灌啶�',
+      titleLengthLimit: '啶多啶班啶粪 {{limit}} 啶呧啷嵿し啶班啶� 啶膏 啶呧ぇ啶苦 啶ㄠす啷�啶� 啶灌啶ㄠぞ 啶氞ぞ啶灌た啶�',
+      releaseNotes: '啶班た啶侧啶溹ぜ 啶ㄠ啶熰啶�',
+    },
+    action: {
+      deleteFailure: '啶膏啶膏啶曕ぐ啶� 啶曕 啶灌啶距え啷� 啶啶� 啶掂た啶げ',
+      deleteSuccess: '啶膏啶膏啶曕ぐ啶� 啶灌啶距く啶� 啶椸く啶�',
+      restoreSuccess: '啶膏啶膏啶曕ぐ啶� 啶啶ㄠぐ啷嵿じ啷嵿ぅ啶距お啶苦い 啶曕た啶ぞ 啶椸く啶�',
+      updateSuccess: '啶膏啶膏啶曕ぐ啶� 啶呧お啶∴啶� 啶曕た啶ぞ 啶椸く啶�',
+      updateFailure: '啶膏啶膏啶曕ぐ啶� 啶呧お啶∴啶� 啶曕ぐ啶ㄠ 啶啶� 啶掂た啶げ',
+      restoreFailure: '啶膏啶膏啶曕ぐ啶� 啶曕 啶啶ㄠぐ啷嵿じ啷嵿ぅ啶距お啶苦い 啶曕ぐ啶ㄠ 啶啶� 啶掂た啶げ',
+    },
+    latest: '啶侧啶熰啶膏啶�',
+    editVersionInfo: '啶膏啶膏啶曕ぐ啶� 啶曕 啶溹ぞ啶ㄠ啶距ぐ啷� 啶膏啶ぞ啶︵た啶� 啶曕ぐ啷囙',
+    nameThisVersion: '啶囙じ 啶膏啶膏啶曕ぐ啶� 啶曕ぞ 啶ㄠぞ啶� 啶︵啶�',
+    title: '啶膏啶膏啶曕ぐ啶�',
+    releaseNotesPlaceholder: '啶い啶距啶� 啶曕た 啶曕啶ぞ 啶う啶侧ぞ',
+    currentDraft: '啶掂ぐ啷嵿い啶ぞ啶� 啶じ啷屶う啶�',
+    restorationTip: '啶膏啶膏啶曕ぐ啶� 啶啶ㄠぐ啷嵿じ啷嵿ぅ啶距お啶� 啶曕 啶ぞ啶�, 啶掂ぐ啷嵿い啶ぞ啶� 啶∴啶班ぞ啶啶� 啶呧ぇ啶苦げ啷囙啶苦い 啶曕た啶ぞ 啶溹ぞ啶忇啶距イ',
+    defaultName: '啶呧さ啶苦き啶距啶苦い 啶膏啶膏啶曕ぐ啶�',
+    deletionTip: '啶灌啶距え啶� 啶呧お啷嵿ぐ啶むた啶啶о 啶灌, 啶曕啶く啶� 啶啶粪啶熰た 啶曕ぐ啷囙啷�',
+  },
+}
+
+export default translation
diff --git a/i18n/i18next-config.ts b/i18n/i18next-config.ts
new file mode 100644
index 0000000..8c5583b
--- /dev/null
+++ b/i18n/i18next-config.ts
@@ -0,0 +1,65 @@
+'use client'
+import i18n from 'i18next'
+import { initReactI18next } from 'react-i18next'
+
+import { LanguagesSupported } from '@/i18n/language'
+
+const requireSilent = (lang: string) => {
+  let res
+  try {
+    res = require(`./${lang}/education`).default
+  }
+  catch {
+    res = require('./en-US/education').default
+  }
+
+  return res
+}
+
+const loadLangResources = (lang: string) => ({
+  translation: {
+    common: require(`./${lang}/common`).default,
+    layout: require(`./${lang}/layout`).default,
+    login: require(`./${lang}/login`).default,
+    register: require(`./${lang}/register`).default,
+    app: require(`./${lang}/app`).default,
+    appOverview: require(`./${lang}/app-overview`).default,
+    appDebug: require(`./${lang}/app-debug`).default,
+    appApi: require(`./${lang}/app-api`).default,
+    appLog: require(`./${lang}/app-log`).default,
+    appAnnotation: require(`./${lang}/app-annotation`).default,
+    share: require(`./${lang}/share-app`).default,
+    dataset: require(`./${lang}/dataset`).default,
+    datasetDocuments: require(`./${lang}/dataset-documents`).default,
+    datasetHitTesting: require(`./${lang}/dataset-hit-testing`).default,
+    datasetSettings: require(`./${lang}/dataset-settings`).default,
+    datasetCreation: require(`./${lang}/dataset-creation`).default,
+    explore: require(`./${lang}/explore`).default,
+    billing: require(`./${lang}/billing`).default,
+    custom: require(`./${lang}/custom`).default,
+    tools: require(`./${lang}/tools`).default,
+    workflow: require(`./${lang}/workflow`).default,
+    runLog: require(`./${lang}/run-log`).default,
+    plugin: require(`./${lang}/plugin`).default,
+    pluginTags: require(`./${lang}/plugin-tags`).default,
+    time: require(`./${lang}/time`).default,
+    education: requireSilent(lang),
+  },
+})
+
+type Resource = Record<string, ReturnType<typeof loadLangResources>>
+// Automatically generate the resources object
+export const resources = LanguagesSupported.reduce<Resource>((acc, lang) => {
+  acc[lang] = loadLangResources(lang)
+  return acc
+}, {})
+
+i18n.use(initReactI18next)
+  .init({
+    lng: undefined,
+    fallbackLng: 'en-US',
+    resources,
+  })
+
+export const changeLanguage = i18n.changeLanguage
+export default i18n
diff --git a/i18n/index.ts b/i18n/index.ts
new file mode 100644
index 0000000..eb49759
--- /dev/null
+++ b/i18n/index.ts
@@ -0,0 +1,29 @@
+import Cookies from 'js-cookie'
+
+import { changeLanguage } from '@/i18n/i18next-config'
+import { LOCALE_COOKIE_NAME } from '@/config'
+import { LanguagesSupported } from '@/i18n/language'
+
+export const i18n = {
+  defaultLocale: 'en-US',
+  locales: LanguagesSupported,
+} as const
+
+export type Locale = typeof i18n['locales'][number]
+
+export const setLocaleOnClient = (locale: Locale, reloadPage = true) => {
+  Cookies.set(LOCALE_COOKIE_NAME, locale, { expires: 365 })
+  changeLanguage(locale)
+  reloadPage && location.reload()
+}
+
+export const getLocaleOnClient = (): Locale => {
+  return Cookies.get(LOCALE_COOKIE_NAME) as Locale || i18n.defaultLocale
+}
+
+export const renderI18nObject = (obj: Record<string, string>, language: string) => {
+  if (!obj) return ''
+  if (obj?.[language]) return obj[language]
+  if (obj?.en_US) return obj.en_US
+  return Object.values(obj)[0]
+}
diff --git a/i18n/it-IT/app-annotation.ts b/i18n/it-IT/app-annotation.ts
new file mode 100644
index 0000000..a7f6158
--- /dev/null
+++ b/i18n/it-IT/app-annotation.ts
@@ -0,0 +1,89 @@
+const translation = {
+  title: 'Annotazioni',
+  name: 'Risposta Annotazione',
+  editBy: 'Risposta modificata da {{author}}',
+  noData: {
+    title: 'Nessuna annotazione',
+    description:
+      'Puoi modificare le annotazioni durante il debug dell\'app o importare annotazioni in blocco qui per una risposta di alta qualit脿.',
+  },
+  table: {
+    header: {
+      question: 'domanda',
+      answer: 'risposta',
+      createdAt: 'creato il',
+      hits: 'hit',
+      actions: 'azioni',
+      addAnnotation: 'Aggiungi Annotazione',
+      bulkImport: 'Importazione Bulk',
+      bulkExport: 'Esportazione Bulk',
+      clearAll: 'Cancella Tutte le Annotazioni',
+    },
+  },
+  editModal: {
+    title: 'Modifica Risposta Annotazione',
+    queryName: 'Query Utente',
+    answerName: 'Bot Narratore',
+    yourAnswer: 'La tua Risposta',
+    answerPlaceholder: 'Scrivi qui la tua risposta',
+    yourQuery: 'La tua Query',
+    queryPlaceholder: 'Scrivi qui la tua query',
+    removeThisCache: 'Rimuovi questa Annotazione',
+    createdAt: 'Creato il',
+  },
+  addModal: {
+    title: 'Aggiungi Risposta Annotazione',
+    queryName: 'Domanda',
+    answerName: 'Risposta',
+    answerPlaceholder: 'Scrivi qui la risposta',
+    queryPlaceholder: 'Scrivi qui la query',
+    createNext: 'Aggiungi un\'altra risposta annotata',
+  },
+  batchModal: {
+    title: 'Importazione Bulk',
+    csvUploadTitle: 'Trascina e rilascia il tuo file CSV qui, oppure ',
+    browse: 'sfoglia',
+    tip: 'Il file CSV deve conformarsi alla seguente struttura:',
+    question: 'domanda',
+    answer: 'risposta',
+    contentTitle: 'contenuto chunk',
+    content: 'contenuto',
+    template: 'Scarica il modello qui',
+    cancel: 'Annulla',
+    run: 'Esegui Batch',
+    runError: 'Errore nell\'esecuzione del batch',
+    processing: 'Elaborazione batch in corso',
+    completed: 'Importazione completata',
+    error: 'Errore di Importazione',
+    ok: 'OK',
+  },
+  errorMessage: {
+    answerRequired: 'La risposta 猫 obbligatoria',
+    queryRequired: 'La domanda 猫 obbligatoria',
+  },
+  viewModal: {
+    annotatedResponse: 'Risposta Annotazione',
+    hitHistory: 'Storico Hit',
+    hit: 'Hit',
+    hits: 'Hit',
+    noHitHistory: 'Nessuno storico hit',
+  },
+  hitHistoryTable: {
+    query: 'Query',
+    match: 'Corrispondenza',
+    response: 'Risposta',
+    source: 'Fonte',
+    score: 'Punteggio',
+    time: 'Ora',
+  },
+  initSetup: {
+    title: 'Configurazione Iniziale Risposta Annotazione',
+    configTitle: 'Configurazione Risposta Annotazione',
+    confirmBtn: 'Salva & Abilita',
+    configConfirmBtn: 'Salva',
+  },
+  embeddingModelSwitchTip:
+    'Modello di vettorizzazione del testo di annotazione, il cambio di modello comporter脿 una nuova integrazione, comportando costi aggiuntivi.',
+}
+
+export default translation
diff --git a/i18n/it-IT/app-api.ts b/i18n/it-IT/app-api.ts
new file mode 100644
index 0000000..c54a93e
--- /dev/null
+++ b/i18n/it-IT/app-api.ts
@@ -0,0 +1,106 @@
+const translation = {
+  apiServer: 'Server API',
+  apiKey: 'Chiave API',
+  status: 'Stato',
+  disabled: 'Disabilitato',
+  ok: 'In Servizio',
+  copy: 'Copia',
+  copied: 'Copiato',
+  play: 'Riproduci',
+  pause: 'Pausa',
+  playing: 'In Riproduzione',
+  loading: 'Caricamento',
+  merMaid: {
+    rerender: 'Rifare il rendering',
+  },
+  never: 'Mai',
+  apiKeyModal: {
+    apiSecretKey: 'Chiave segreta API',
+    apiSecretKeyTips:
+      'Per prevenire l\'abuso dell\'API, proteggi la tua chiave API. Evita di usarla come testo semplice nel codice front-end. :)',
+    createNewSecretKey: 'Crea nuova chiave segreta',
+    secretKey: 'Chiave Segreta',
+    created: 'CREATA',
+    lastUsed: 'ULTIMO UTILIZZO',
+    generateTips: 'Conserva questa chiave in un luogo sicuro e accessibile.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: 'Eliminare questa chiave segreta?',
+    deleteConfirmTips: 'Questa azione non pu貌 essere annullata.',
+    ok: 'OK',
+  },
+  completionMode: {
+    title: 'API dell\'App di Completamento',
+    info: 'Per una generazione di testo di alta qualit脿, come articoli, riassunti e traduzioni, utilizza l\'API completion-messages con l\'input dell\'utente. La generazione del testo si basa sui parametri del modello e sui modelli di prompt impostati in Dify Prompt Engineering.',
+    createCompletionApi: 'Crea Messaggio di Completamento',
+    createCompletionApiTip:
+      'Crea un Messaggio di Completamento per supportare la modalit脿 domanda e risposta.',
+    inputsTips:
+      '(Opzionale) Fornisci campi di input utente come coppie chiave-valore, corrispondenti alle variabili in Prompt Eng. La chiave 猫 il nome della variabile, il Valore 猫 il valore del parametro. Se il tipo di campo 猫 Select, il Valore inviato deve essere una delle scelte preimpostate.',
+    queryTips: 'Contenuto del testo di input dell\'utente.',
+    blocking:
+      'Tipo bloccante, in attesa che l\'esecuzione sia completata e restituisca i risultati. (Le richieste possono essere interrotte se il processo 猫 lungo)',
+    streaming:
+      'restituzioni in streaming. Implementazione della restituzione in streaming basata su SSE (Server-Sent Events).',
+    messageFeedbackApi: 'Feedback sul messaggio (mi piace)',
+    messageFeedbackApiTip:
+      'Valuta i messaggi ricevuti per conto degli utenti finali con mi piace o non mi piace. Questi dati sono visibili nella pagina Log & Annotazioni e utilizzati per futuri affinamenti del modello.',
+    messageIDTip: 'ID del Messaggio',
+    ratingTip: 'mi piace o non mi piace, null 猫 annulla',
+    parametersApi: 'Ottenere informazioni sui parametri dell\'applicazione',
+    parametersApiTip:
+      'Recupera i parametri di input configurati, inclusi nomi delle variabili, nomi dei campi, tipi e valori predefiniti. Tipicamente utilizzato per visualizzare questi campi in un modulo o per riempire i valori predefiniti dopo il caricamento del client.',
+  },
+  chatMode: {
+    title: 'API dell\'App di Chat',
+    info: 'Per app conversazionali versatili utilizzando un formato Q&A, chiama l\'API chat-messages per avviare il dialogo. Mantieni conversazioni in corso passando l\'conversation_id restituito. I parametri di risposta e i modelli dipendono dalle impostazioni di Dify Prompt Eng.',
+    createChatApi: 'Crea messaggio di chat',
+    createChatApiTip:
+      'Crea un nuovo messaggio di conversazione o continua un dialogo esistente.',
+    inputsTips:
+      '(Opzionale) Fornisci campi di input utente come coppie chiave-valore, corrispondenti alle variabili in Prompt Eng. La chiave 猫 il nome della variabile, il Valore 猫 il valore del parametro. Se il tipo di campo 猫 Select, il Valore inviato deve essere una delle scelte preimpostate.',
+    queryTips: 'Contenuto della domanda di input dell\'utente',
+    blocking:
+      'Tipo bloccante, in attesa che l\'esecuzione sia completata e restituisca i risultati. (Le richieste possono essere interrotte se il processo 猫 lungo)',
+    streaming:
+      'restituzioni in streaming. Implementazione della restituzione in streaming basata su SSE (Server-Sent Events).',
+    conversationIdTip:
+      '(Opzionale) ID della Conversazione: lasciare vuoto per la prima conversazione; passare l\'conversation_id dal contesto per continuare il dialogo.',
+    messageFeedbackApi:
+      'Feedback terminale del messaggio dell\'utente, mi piace',
+    messageFeedbackApiTip:
+      'Valuta i messaggi ricevuti per conto degli utenti finali con mi piace o non mi piace. Questi dati sono visibili nella pagina Log & Annotazioni e utilizzati per futuri affinamenti del modello.',
+    messageIDTip: 'ID del Messaggio',
+    ratingTip: 'mi piace o non mi piace, null 猫 annulla',
+    chatMsgHistoryApi: 'Ottieni la cronologia dei messaggi della chat',
+    chatMsgHistoryApiTip:
+      'La prima pagina restituisce l\'ultimo `limite` barra, che 猫 in ordine inverso.',
+    chatMsgHistoryConversationIdTip: 'ID della Conversazione',
+    chatMsgHistoryFirstId:
+      'ID del primo record di chat nella pagina corrente. L\'impostazione predefinita 猫 nessuna.',
+    chatMsgHistoryLimit: 'Quante chat vengono restituite in una richiesta',
+    conversationsListApi: 'Ottieni l\'elenco delle conversazioni',
+    conversationsListApiTip:
+      'Ottiene l\'elenco delle sessioni dell\'utente corrente. Per impostazione predefinita, vengono restituite le ultime 20 sessioni.',
+    conversationsListFirstIdTip:
+      'ID dell\'ultimo record nella pagina corrente, predefinito nessuno.',
+    conversationsListLimitTip:
+      'Quante chat vengono restituite in una richiesta',
+    conversationRenamingApi: 'Rinomina conversazione',
+    conversationRenamingApiTip:
+      'Rinomina conversazioni; il nome viene visualizzato nelle interfacce client multi-sessione.',
+    conversationRenamingNameTip: 'Nuovo nome',
+    parametersApi: 'Ottenere informazioni sui parametri dell\'applicazione',
+    parametersApiTip:
+      'Recupera i parametri di input configurati, inclusi nomi delle variabili, nomi dei campi, tipi e valori predefiniti. Tipicamente utilizzato per visualizzare questi campi in un modulo o per riempire i valori predefiniti dopo il caricamento del client.',
+  },
+  develop: {
+    requestBody: 'Corpo della Richiesta',
+    pathParams: 'Parametri del Percorso',
+    query: 'Query',
+    toc: 'Contenuto',
+  },
+  regenerate: 'Rigenerare',
+}
+
+export default translation
diff --git a/i18n/it-IT/app-debug.ts b/i18n/it-IT/app-debug.ts
new file mode 100644
index 0000000..e4555b9
--- /dev/null
+++ b/i18n/it-IT/app-debug.ts
@@ -0,0 +1,471 @@
+const translation = {
+  pageTitle: {
+    line1: 'PROMPT',
+    line2: 'Engineering',
+  },
+  orchestrate: 'Orchestra',
+  promptMode: {
+    simple: 'Passa alla modalit脿 esperto per modificare tutto il PROMPT',
+    advanced: 'Modalit脿 esperto',
+    switchBack: 'Torna indietro',
+    advancedWarning: {
+      title:
+        'Sei passato alla modalit脿 esperto e una volta modificato il PROMPT, NON potrai tornare alla modalit脿 base.',
+      description: 'In modalit脿 esperto, puoi modificare tutto il PROMPT.',
+      learnMore: 'Scopri di pi霉',
+      ok: 'OK',
+    },
+    operation: {
+      addMessage: 'Aggiungi messaggio',
+    },
+    contextMissing:
+      'Componente del contesto mancante, l\'efficacia del prompt potrebbe non essere buona.',
+  },
+  operation: {
+    applyConfig: 'Pubblica',
+    resetConfig: 'Ripristina',
+    debugConfig: 'Debug',
+    addFeature: 'Aggiungi funzione',
+    automatic: 'Automatico',
+    stopResponding: 'Interrompi la risposta',
+    agree: 'mi piace',
+    disagree: 'non mi piace',
+    cancelAgree: 'Annulla mi piace',
+    cancelDisagree: 'Annulla non mi piace',
+    userAction: 'Azione utente',
+  },
+  notSetAPIKey: {
+    title: 'La chiave del provider LLM non 猫 stata impostata',
+    trailFinished: 'Periodo di prova terminato',
+    description:
+      'La chiave del provider LLM non 猫 stata impostata e deve essere impostata prima del debug.',
+    settingBtn: 'Vai alle impostazioni',
+  },
+  trailUseGPT4Info: {
+    title: 'Non supporta gpt-4 adesso',
+    description: 'Per utilizzare gpt-4, per favore imposta la chiave API.',
+  },
+  feature: {
+    groupChat: {
+      title: 'Migliora chat',
+      description:
+        'Aggiungere impostazioni pre-conversazione per le app pu貌 migliorare l\'esperienza utente.',
+    },
+    groupExperience: {
+      title: 'Migliora esperienza',
+    },
+    conversationOpener: {
+      title: 'Iniziatore di conversazione',
+      description:
+        'In un\'app di chat, la prima frase che l\'IA pronuncia attivamente all\'utente viene solitamente usata come benvenuto.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: 'Follow-up',
+      description:
+        'Impostare suggerimenti per le prossime domande pu貌 offrire agli utenti una chat migliore.',
+      resDes: '3 suggerimenti per la prossima domanda dell\'utente.',
+      tryToAsk: 'Prova a chiedere',
+    },
+    moreLikeThis: {
+      title: 'Altri simili',
+      description:
+        'Genera pi霉 testi contemporaneamente, poi modifica e continua a generare',
+      generateNumTip: 'Numero di ogni generazione',
+      tip: 'L\'utilizzo di questa funzione comporter脿 un costo aggiuntivo di token',
+    },
+    speechToText: {
+      title: 'Da voce a testo',
+      description: 'Una volta abilitato, puoi usare l\'input vocale.',
+      resDes: 'L\'input vocale 猫 abilitato',
+    },
+    textToSpeech: {
+      title: 'Da testo a voce',
+      description:
+        'Una volta abilitato, il testo pu貌 essere convertito in voce.',
+      resDes: 'Il testo in audio 猫 abilitato',
+    },
+    citation: {
+      title: 'Citazioni e attribuzioni',
+      description:
+        'Una volta abilitato, mostra il documento sorgente e la sezione attribuita del contenuto generato.',
+      resDes: 'Citazioni e attribuzioni sono abilitate',
+    },
+    annotation: {
+      title: 'Risposta annotata',
+      description:
+        'Puoi aggiungere manualmente una risposta di alta qualit脿 alla cache per una corrispondenza prioritaria con domande utente simili.',
+      resDes: 'Risposta annotata 猫 abilitata',
+      scoreThreshold: {
+        title: 'Soglia di punteggio',
+        description:
+          'Utilizzata per impostare la soglia di somiglianza per la risposta annotata.',
+        easyMatch: 'Corrispondenza facile',
+        accurateMatch: 'Corrispondenza accurata',
+      },
+      matchVariable: {
+        title: 'Variabile di corrispondenza',
+        choosePlaceholder: 'Scegli la variabile di corrispondenza',
+      },
+      cacheManagement: 'Annotazioni',
+      cached: 'Annotato',
+      remove: 'Rimuovi',
+      removeConfirm: 'Eliminare questa annotazione?',
+      add: 'Aggiungi annotazione',
+      edit: 'Modifica annotazione',
+    },
+    dataSet: {
+      title: 'Contesto',
+      noData: 'Puoi importare Conoscenza come contesto',
+      words: 'Parole',
+      textBlocks: 'Blocchi di testo',
+      selectTitle: 'Seleziona Conoscenza di riferimento',
+      selected: 'Conoscenza selezionata',
+      noDataSet: 'Nessuna Conoscenza trovata',
+      toCreate: 'Vai a creare',
+      notSupportSelectMulti: 'Attualmente supporta solo una Conoscenza',
+      queryVariable: {
+        title: 'Variabile di query',
+        tip: 'Questa variabile verr脿 utilizzata come input di query per il recupero del contesto, ottenendo informazioni contestuali relative all\'input di questa variabile.',
+        choosePlaceholder: 'Scegli la variabile di query',
+        noVar: 'Nessuna variabile',
+        noVarTip: 'per favore crea una variabile nella sezione Variabili',
+        unableToQueryDataSet: 'Impossibile interrogare la Conoscenza',
+        unableToQueryDataSetTip:
+          'Impossibile interrogare la Conoscenza correttamente, per favore scegli una variabile di query nel contesto.',
+        ok: 'OK',
+        contextVarNotEmpty:
+          'La variabile di query del contesto non pu貌 essere vuota',
+        deleteContextVarTitle: 'Eliminare la variabile 鈥渰{varName}}鈥�?',
+        deleteContextVarTip:
+          'Questa variabile 猫 stata impostata come variabile di query del contesto, rimuoverla influenzer脿 l\'uso normale della Conoscenza. Se hai ancora bisogno di eliminarla, per favore riselezionala nella sezione del contesto.',
+      },
+    },
+    tools: {
+      title: 'Strumenti',
+      tips: 'Gli strumenti forniscono un metodo di chiamata API standard, prendendo input dell\'utente o variabili come parametri di richiesta per interrogare dati esterni come contesto.',
+      toolsInUse: '{{count}} strumenti in uso',
+      modal: {
+        title: 'Strumento',
+        toolType: {
+          title: 'Tipo di strumento',
+          placeholder: 'Per favore seleziona il tipo di strumento',
+        },
+        name: {
+          title: 'Nome',
+          placeholder: 'Per favore inserisci il nome',
+        },
+        variableName: {
+          title: 'Nome della variabile',
+          placeholder: 'Per favore inserisci il nome della variabile',
+        },
+      },
+    },
+    conversationHistory: {
+      title: 'Cronologia della conversazione',
+      description: 'Imposta i nomi di prefisso per i ruoli di conversazione',
+      tip: 'La Cronologia della Conversazione non 猫 abilitata, per favore aggiungi <histories> nel prompt sopra.',
+      learnMore: 'Scopri di pi霉',
+      editModal: {
+        title: 'Modifica i nomi dei ruoli della conversazione',
+        userPrefix: 'Prefisso utente',
+        assistantPrefix: 'Prefisso assistente',
+      },
+    },
+    toolbox: {
+      title: 'CASSETTA DEGLI ATTREZZI',
+    },
+    moderation: {
+      title: 'Moderazione del contenuto',
+      description:
+        'Proteggi l\'output del modello utilizzando l\'API di moderazione o mantenendo un elenco di parole sensibili.',
+      allEnabled: 'Contenuto INPUT/OUTPUT abilitato',
+      inputEnabled: 'Contenuto INPUT abilitato',
+      outputEnabled: 'Contenuto OUTPUT abilitato',
+      modal: {
+        title: 'Impostazioni di moderazione del contenuto',
+        provider: {
+          title: 'Provider',
+          openai: 'Moderazione OpenAI',
+          openaiTip: {
+            prefix:
+              'La moderazione OpenAI richiede una chiave API OpenAI configurata nel',
+            suffix: '.',
+          },
+          keywords: 'Parole chiave',
+        },
+        keywords: {
+          tip: 'Una per linea, separate da interruzioni di linea. Fino a 100 caratteri per linea.',
+          placeholder: 'Una per linea, separate da interruzioni di linea',
+          line: 'Linea',
+        },
+        content: {
+          input: 'Modera contenuto INPUT',
+          output: 'Modera contenuto OUTPUT',
+          preset: 'Risposte preimpostate',
+          placeholder: 'Contenuto delle risposte preimpostate qui',
+          condition:
+            'Moderazione contenuto INPUT e OUTPUT abilitato almeno uno',
+          fromApi: 'Le risposte preimpostate sono restituite dall\'API',
+          errorMessage: 'Le risposte preimpostate non possono essere vuote',
+          supportMarkdown: 'Markdown supportato',
+        },
+        openaiNotConfig: {
+          before:
+            'La moderazione OpenAI richiede una chiave API OpenAI configurata nel',
+          after: '',
+        },
+      },
+    },
+  },
+  automatic: {
+    title: 'Orchestrazione automatizzata delle applicazioni',
+    description:
+      'Descrivi il tuo scenario, Dify orchestrer脿 un\'applicazione per te.',
+    intendedAudience: 'Chi 猫 il pubblico di destinazione?',
+    intendedAudiencePlaceHolder: 'es. Studente',
+    solveProblem: 'Quali problemi sperano che l\'IA possa risolvere per loro?',
+    solveProblemPlaceHolder:
+      'es. Estrarre approfondimenti e riassumere informazioni da lunghi rapporti e articoli',
+    generate: 'Genera',
+    audiencesRequired: 'Pubblico richiesto',
+    problemRequired: 'Problema richiesto',
+    resTitle: 'Abbiamo orchestrato la seguente applicazione per te.',
+    apply: 'Applica questa orchestrazione',
+    noData:
+      'Descrivi il tuo caso d\'uso a sinistra, l\'anteprima dell\'orchestrazione verr脿 mostrata qui.',
+    loading: 'Orchestrazione dell\'applicazione per te...',
+    overwriteTitle: 'Sovrascrivere la configurazione esistente?',
+    overwriteMessage:
+      'Applicando questa orchestrazione sovrascriverai la configurazione esistente.',
+  },
+  resetConfig: {
+    title: 'Confermare il ripristino?',
+    message:
+      'Il ripristino scarta le modifiche, ripristinando l\'ultima configurazione pubblicata.',
+  },
+  errorMessage: {
+    nameOfKeyRequired: 'nome della chiave: {{key}} richiesto',
+    valueOfVarRequired: 'il valore di {{key}} non pu貌 essere vuoto',
+    queryRequired: 'Il testo della richiesta 猫 richiesto.',
+    waitForResponse:
+      'Per favore attendi che la risposta al messaggio precedente sia completata.',
+    waitForBatchResponse:
+      'Per favore attendi che la risposta all\'attivit脿 batch sia completata.',
+    notSelectModel: 'Per favore scegli un modello',
+    waitForImgUpload: 'Per favore attendi il caricamento dell\'immagine',
+  },
+  chatSubTitle: 'Istruzioni',
+  completionSubTitle: 'Prompt di prefisso',
+  promptTip:
+    'I prompt guidano le risposte dell\'IA con istruzioni e vincoli. Inserisci variabili come {{input}}. Questo prompt non sar脿 visibile agli utenti.',
+  formattingChangedTitle: 'Formato modificato',
+  formattingChangedText:
+    'Modificare il formato resetter脿 l\'area di debug, sei sicuro?',
+  variableTitle: 'Variabili',
+  variableTip:
+    'Gli utenti riempiono le variabili in un modulo, sostituendo automaticamente le variabili nel prompt.',
+  notSetVar:
+    'Le variabili consentono agli utenti di introdurre parole del prompt o osservazioni di apertura quando compilano i moduli. Puoi provare a inserire `{{input}}` nelle parole del prompt.',
+  autoAddVar:
+    'Le variabili non definite riferite nel pre-prompt, vuoi aggiungerle nel modulo di input dell\'utente?',
+  variableTable: {
+    key: 'Chiave Variabile',
+    name: 'Nome Campo Input Utente',
+    optional: 'Opzionale',
+    type: 'Tipo di Input',
+    action: 'Azioni',
+    typeString: 'Stringa',
+    typeSelect: 'Seleziona',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{key}} 猫 obbligatorio',
+    tooLong:
+      '{{key}} 猫 troppo lunga. Non pu貌 essere pi霉 lunga di 30 caratteri',
+    notValid:
+      '{{key}} non 猫 valida. Pu貌 contenere solo lettere, numeri e underscore',
+    notStartWithNumber:
+      '{{key}} non pu貌 iniziare con un numero',
+    keyAlreadyExists: '{{key}} esiste gi脿',
+  },
+  otherError: {
+    promptNoBeEmpty: 'Il prompt non pu貌 essere vuoto',
+    historyNoBeEmpty:
+      'La cronologia delle conversazioni deve essere impostata nel prompt',
+    queryNoBeEmpty: 'La query deve essere impostata nel prompt',
+  },
+  variableConfig: {
+    'addModalTitle': 'Aggiungi Campo Input',
+    'editModalTitle': 'Modifica Campo Input',
+    'description': 'Impostazione per la variabile {{varName}}',
+    'fieldType': 'Tipo di campo',
+    'string': 'Testo breve',
+    'text-input': 'Testo breve',
+    'paragraph': 'Paragrafo',
+    'select': 'Seleziona',
+    'number': 'Numero',
+    'notSet': 'Non impostato, prova a scrivere {{input}} nel prompt di prefisso',
+    'stringTitle': 'Opzioni della casella di testo del modulo',
+    'maxLength': 'Lunghezza massima',
+    'options': 'Opzioni',
+    'addOption': 'Aggiungi opzione',
+    'apiBasedVar': 'Variabile basata su API',
+    'varName': 'Nome Variabile',
+    'labelName': 'Nome Etichetta',
+    'inputPlaceholder': 'Per favore inserisci',
+    'content': 'Contenuto',
+    'required': 'Richiesto',
+    'errorMsg': {
+      varNameRequired: 'Il nome della variabile 猫 richiesto',
+      labelNameRequired: 'Il nome dell\'etichetta 猫 richiesto',
+      varNameCanBeRepeat: 'Il nome della variabile non pu貌 essere ripetuto',
+      atLeastOneOption: '脠 richiesta almeno un\'opzione',
+      optionRepeat: 'Ci sono opzioni ripetute',
+    },
+  },
+  vision: {
+    name: 'Visione',
+    description:
+      'Abilitare la visione permetter脿 al modello di prendere immagini e rispondere a domande su di esse.',
+    settings: 'Impostazioni',
+    visionSettings: {
+      title: 'Impostazioni di visione',
+      resolution: 'Risoluzione',
+      resolutionTooltip: `La bassa risoluzione permetter脿 al modello di ricevere una versione a bassa risoluzione 512 x 512 dell\\'immagine e di rappresentare l\\'immagine con un budget di 65 token. Questo permette all\\'API di restituire risposte pi霉 veloci e di consumare meno token di input per casi d\\'uso che non richiedono alta definizione.
+      \n
+      L\\'alta risoluzione permetter脿 al modello di vedere prima l\\'immagine a bassa risoluzione e poi di creare ritagli dettagliati delle immagini di input come quadrati 512px basati sulla dimensione dell\\'immagine di input. Ciascuno dei ritagli dettagliati utilizza il doppio del budget dei token per un totale di 129 token.`,
+      high: 'Alta',
+      low: 'Bassa',
+      uploadMethod: 'Metodo di caricamento',
+      both: 'Entrambi',
+      localUpload: 'Caricamento locale',
+      url: 'URL',
+      uploadLimit: 'Limite di caricamento',
+    },
+  },
+  voice: {
+    name: 'Voce',
+    defaultDisplay: 'Voce predefinita',
+    description: 'Impostazioni della voce da testo a voce',
+    settings: 'Impostazioni',
+    voiceSettings: {
+      title: 'Impostazioni della voce',
+      language: 'Lingua',
+      resolutionTooltip: 'Supporto per la lingua della voce da testo a voce.',
+      voice: 'Voce',
+      autoPlay: 'Riproduzione automatica',
+      autoPlayEnabled: 'Acceso',
+      autoPlayDisabled: 'Spento',
+    },
+  },
+  openingStatement: {
+    title: 'Iniziatore di conversazione',
+    add: 'Aggiungi',
+    writeOpener: 'Scrivi introduzione',
+    placeholder:
+      'Scrivi qui il tuo messaggio introduttivo, puoi usare variabili, prova a scrivere {{variable}}.',
+    openingQuestion: 'Domande iniziali',
+    noDataPlaceHolder:
+      'Iniziare la conversazione con l\'utente pu貌 aiutare l\'IA a stabilire un legame pi霉 stretto con loro nelle applicazioni conversazionali.',
+    varTip: 'Puoi usare variabili, prova a scrivere {{variable}}',
+    tooShort:
+      'Sono richieste almeno 20 parole di prompt iniziale per generare un\'introduzione alla conversazione.',
+    notIncludeKey:
+      'Il prompt iniziale non include la variabile: {{key}}. Per favore aggiungila al prompt iniziale.',
+  },
+  modelConfig: {
+    model: 'Modello',
+    setTone: 'Imposta tono delle risposte',
+    title: 'Modello e Parametri',
+    modeType: {
+      chat: 'Chat',
+      completion: 'Completamento',
+    },
+  },
+  inputs: {
+    title: 'Debug e Anteprima',
+    noPrompt: 'Prova a scrivere qualche prompt nell\'input pre-prompt',
+    userInputField: 'Campo Input Utente',
+    noVar:
+      'Compila il valore della variabile, che verr脿 automaticamente sostituito nel prompt ogni volta che inizia una nuova sessione.',
+    chatVarTip:
+      'Compila il valore della variabile, che verr脿 automaticamente sostituito nel prompt ogni volta che inizia una nuova sessione',
+    completionVarTip:
+      'Compila il valore della variabile, che verr脿 automaticamente sostituito nelle parole del prompt ogni volta che viene inviata una domanda.',
+    previewTitle: 'Anteprima prompt',
+    queryTitle: 'Contenuto query',
+    queryPlaceholder: 'Per favore inserisci il testo della richiesta.',
+    run: 'ESEGUI',
+  },
+  result: 'Testo di output',
+  datasetConfig: {
+    settingTitle: 'Impostazioni di recupero',
+    knowledgeTip: 'Clicca sul pulsante 鈥�+鈥� per aggiungere conoscenza',
+    retrieveOneWay: {
+      title: 'Recupero N-a-1',
+      description:
+        'Basato sull\'intento dell\'utente e le descrizioni della Conoscenza, l\'Agente seleziona autonomamente la migliore Conoscenza per la query. Ideale per applicazioni con Conoscenze distinte e limitate.',
+    },
+    retrieveMultiWay: {
+      title: 'Recupero multipath',
+      description:
+        'Basato sull\'intento dell\'utente, esegue query su tutte le Conoscenze, recupera testo rilevante da pi霉 fonti e seleziona i migliori risultati corrispondenti alla query dell\'utente dopo il reranking. 脠 richiesta la configurazione dell\'API del modello di reranking.',
+    },
+    rerankModelRequired: 'Il modello di reranking 猫 richiesto',
+    params: 'Parametri',
+    top_k: 'Top K',
+    top_kTip:
+      'Usato per filtrare i chunk pi霉 simili alle domande degli utenti. Il sistema regoler脿 anche dinamicamente il valore di Top K, in base ai max_tokens del modello selezionato.',
+    score_threshold: 'Soglia di punteggio',
+    score_thresholdTip:
+      'Usato per impostare la soglia di somiglianza per il filtraggio dei chunk.',
+    retrieveChangeTip:
+      'Modificare la modalit脿 di indicizzazione e la modalit脿 di recupero pu貌 influenzare le applicazioni associate a questa Conoscenza.',
+  },
+  debugAsSingleModel: 'Debug come modello singolo',
+  debugAsMultipleModel: 'Debug come modelli multipli',
+  duplicateModel: 'Duplica',
+  publishAs: 'Pubblica come',
+  assistantType: {
+    name: 'Tipo di assistente',
+    chatAssistant: {
+      name: 'Assistente base',
+      description:
+        'Costruisci un assistente basato su chat utilizzando un grande modello linguistico',
+    },
+    agentAssistant: {
+      name: 'Assistente Agente',
+      description:
+        'Costruisci un Agente intelligente che pu貌 scegliere autonomamente strumenti per completare i compiti',
+    },
+  },
+  agent: {
+    agentMode: 'Modalit脿 Agente',
+    agentModeDes: 'Imposta il tipo di modalit脿 di inferenza per l\'agente',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: 'Chiamata di Funzione',
+    },
+    setting: {
+      name: 'Impostazioni Agente',
+      description:
+        'Le impostazioni dell\'Assistente Agente permettono di impostare la modalit脿 agente e funzionalit脿 avanzate come prompt integrati, disponibili solo nel tipo Agente.',
+      maximumIterations: {
+        name: 'Iterazioni massime',
+        description:
+          'Limita il numero di iterazioni che un assistente agente pu貌 eseguire',
+      },
+    },
+    buildInPrompt: 'Prompt Integrato',
+    firstPrompt: 'Primo Prompt',
+    nextIteration: 'Prossima Iterazione',
+    promptPlaceholder: 'Scrivi qui il tuo prompt',
+    tools: {
+      name: 'Strumenti',
+      description:
+        'L\'utilizzo degli strumenti pu貌 estendere le capacit脿 del LLM, come cercare su internet o eseguire calcoli scientifici',
+      enabled: 'Abilitato',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/it-IT/app-log.ts b/i18n/it-IT/app-log.ts
new file mode 100644
index 0000000..a84ed66
--- /dev/null
+++ b/i18n/it-IT/app-log.ts
@@ -0,0 +1,102 @@
+const translation = {
+  title: 'Registri',
+  description:
+    'I registri registrano lo stato di esecuzione dell\'applicazione, inclusi input degli utenti e risposte AI.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: 'Ora di aggiornamento',
+      time: 'Ora di creazione',
+      endUser: 'Utente Finale o Account',
+      input: 'Input',
+      output: 'Output',
+      summary: 'Titolo',
+      messageCount: 'Conteggio Messaggi',
+      userRate: 'Valutazione Utente',
+      adminRate: 'Valutazione Op.',
+      startTime: 'ORA INIZIO',
+      status: 'STATO',
+      runtime: 'TEMPO DI ESECUZIONE',
+      tokens: 'TOKEN',
+      user: 'UTENTE FINALE O ACCOUNT',
+      version: 'VERSIONE',
+    },
+    pagination: {
+      previous: 'Prec',
+      next: 'Succ',
+    },
+    empty: {
+      noChat: 'Nessuna conversazione ancora',
+      noOutput: 'Nessun output',
+      element: {
+        title: 'C\'猫 qualcuno?',
+        content:
+          'Osserva e annota le interazioni tra gli utenti finali e le applicazioni AI qui per migliorare continuamente l\'accuratezza dell\'AI. Puoi provare a <shareLink>condividere</shareLink> o a <testLink>testare</testLink> l\'app Web tu stesso, quindi tornare a questa pagina.',
+      },
+    },
+  },
+  detail: {
+    time: 'Ora',
+    conversationId: 'ID Conversazione',
+    promptTemplate: 'Template Prompt',
+    promptTemplateBeforeChat:
+      'Template Prompt Prima della Chat 路 Come Messaggio di Sistema',
+    annotationTip: 'Miglioramenti Segnalati da {{user}}',
+    timeConsuming: 'Tempo Trascorso',
+    second: 's',
+    tokenCost: 'Token spesi',
+    loading: 'caricamento',
+    operation: {
+      like: 'mi piace',
+      dislike: 'non mi piace',
+      addAnnotation: 'Aggiungi Miglioramento',
+      editAnnotation: 'Modifica Miglioramento',
+      annotationPlaceholder:
+        'Inserisci la risposta prevista che desideri che l\'AI dia, che pu貌 essere utilizzata per il perfezionamento del modello e il miglioramento continuo della qualit脿 della generazione di testo in futuro.',
+    },
+    variables: 'Variabili',
+    uploadImages: 'Immagini Caricate',
+    modelParams: 'Parametri del modello',
+  },
+  filter: {
+    period: {
+      today: 'Oggi',
+      last7days: 'Ultimi 7 Giorni',
+      last4weeks: 'Ultime 4 settimane',
+      last3months: 'Ultimi 3 mesi',
+      last12months: 'Ultimi 12 mesi',
+      monthToDate: 'Mese corrente',
+      quarterToDate: 'Trimestre corrente',
+      yearToDate: 'Anno corrente',
+      allTime: 'Tutto il tempo',
+    },
+    annotation: {
+      all: 'Tutti',
+      annotated: 'Miglioramenti Annotati ({{count}} elementi)',
+      not_annotated: 'Non Annotati',
+    },
+    sortBy: 'Ordina per:',
+    descending: 'decrescente',
+    ascending: 'crescente',
+  },
+  workflowTitle: 'Registri del Workflow',
+  workflowSubtitle: 'Il registro ha registrato il funzionamento di Automate.',
+  runDetail: {
+    title: 'Registro Conversazione',
+    workflowTitle: 'Dettagli Registro',
+    fileListDetail: 'Dettaglio',
+    fileListLabel: 'Dettagli del file',
+  },
+  promptLog: 'Registro Prompt',
+  agentLog: 'Registro Agente',
+  viewLog: 'Visualizza Registro',
+  agentLogDetail: {
+    agentMode: 'Modalit脿 Agente',
+    toolUsed: 'Strumento Usato',
+    iterations: 'Iterazioni',
+    iteration: 'Iterazione',
+    finalProcessing: 'Elaborazione Finale',
+  },
+}
+
+export default translation
diff --git a/i18n/it-IT/app-overview.ts b/i18n/it-IT/app-overview.ts
new file mode 100644
index 0000000..a8fe7f6
--- /dev/null
+++ b/i18n/it-IT/app-overview.ts
@@ -0,0 +1,193 @@
+const translation = {
+  welcome: {
+    firstStepTip: 'Per iniziare,',
+    enterKeyTip: 'inserisci la tua OpenAI API Key qui sotto',
+    getKeyTip: 'Ottieni la tua API Key dalla dashboard di OpenAI',
+    placeholder: 'La tua OpenAI API Key(es. sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: 'Stai usando la quota di prova di {{providerName}}.',
+        description:
+          'La quota di prova 猫 fornita per il tuo utilizzo di test. Prima che le chiamate della quota di prova siano esaurite, configura il tuo fornitore di modelli o acquista una quota aggiuntiva.',
+      },
+      exhausted: {
+        title:
+          'La tua quota di prova 猫 stata utilizzata, configura la tua APIKey.',
+        description:
+          'La tua quota di prova 猫 stata esaurita. Configura il tuo fornitore di modelli o acquista una quota aggiuntiva.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: 'Per iniziare,',
+        row2: 'configura prima il tuo fornitore di modelli.',
+      },
+    },
+    callTimes: 'Numero di chiamate',
+    usedToken: 'Token utilizzati',
+    setAPIBtn: 'Vai a configurare il fornitore di modelli',
+    tryCloud: 'O prova la versione cloud di Dify con quota gratuita',
+  },
+  overview: {
+    title: 'Panoramica',
+    appInfo: {
+      explanation: 'AI WebApp pronta all\'uso',
+      accessibleAddress: 'URL Pubblico',
+      preview: 'Anteprima',
+      regenerate: 'Rigenera',
+      regenerateNotice: 'Vuoi rigenerare l\'URL pubblico?',
+      preUseReminder: 'Attiva WebApp prima di continuare.',
+      settings: {
+        entry: 'Impostazioni',
+        title: 'Impostazioni WebApp',
+        webName: 'Nome WebApp',
+        webDesc: 'Descrizione WebApp',
+        webDescTip:
+          'Questo testo verr脿 visualizzato sul lato client, fornendo una guida di base su come utilizzare l\'applicazione',
+        webDescPlaceholder: 'Inserisci la descrizione della WebApp',
+        language: 'Lingua',
+        workflow: {
+          title: 'Fasi del Workflow',
+          show: 'Mostra',
+          hide: 'Nascondi',
+          subTitle: 'Dettagli del flusso di lavoro',
+          showDesc: 'Mostrare o nascondere i dettagli del flusso di lavoro in WebApp',
+        },
+        chatColorTheme: 'Tema colore chat',
+        chatColorThemeDesc: 'Imposta il tema colore del chatbot',
+        chatColorThemeInverted: 'Inverso',
+        invalidHexMessage: 'Valore esadecimale non valido',
+        invalidPrivacyPolicy: 'Link alla privacy policy non valido. Si prega di utilizzare un link valido che inizi con http o https',
+        more: {
+          entry: 'Mostra pi霉 impostazioni',
+          copyright: 'Copyright',
+          copyRightPlaceholder:
+            'Inserisci il nome dell\'autore o dell\'organizzazione',
+          privacyPolicy: 'Privacy Policy',
+          privacyPolicyPlaceholder: 'Inserisci il link alla privacy policy',
+          privacyPolicyTip:
+            'Aiuta i visitatori a capire i dati raccolti dall\'applicazione, vedi la <privacyPolicyLink>Privacy Policy</privacyPolicyLink> di Dify.',
+          customDisclaimer: 'Disclaimer Personalizzato',
+          customDisclaimerPlaceholder:
+            'Inserisci il testo del disclaimer personalizzato',
+          customDisclaimerTip:
+            'Il testo del disclaimer personalizzato verr脿 visualizzato sul lato client, fornendo informazioni aggiuntive sull\'applicazione',
+          copyrightTip: 'Visualizzare le informazioni sul copyright nella webapp',
+          copyrightTooltip: 'Si prega di eseguire l\'upgrade al piano Professional o superiore',
+        },
+        sso: {
+          label: 'Autenticazione SSO',
+          title: 'WebApp SSO',
+          description: 'Tutti gli utenti devono effettuare l\'accesso con SSO prima di utilizzare WebApp',
+          tooltip: 'Contattare l\'amministratore per abilitare l\'SSO di WebApp',
+        },
+        modalTip: 'Impostazioni dell\'app Web lato client.',
+      },
+      embedded: {
+        entry: 'Incorporato',
+        title: 'Incorpora sul sito web',
+        explanation: 'Scegli come incorporare l\'app chat nel tuo sito web',
+        iframe:
+          'Per aggiungere l\'app chat ovunque sul tuo sito web, aggiungi questo iframe al tuo codice HTML.',
+        scripts:
+          'Per aggiungere un\'app chat in basso a destra del tuo sito web, aggiungi questo codice al tuo HTML.',
+        chromePlugin: 'Installa l\'estensione Chrome di Dify Chatbot',
+        copied: 'Copiato',
+        copy: 'Copia',
+      },
+      qrcode: {
+        title: 'Codice QR per condividere',
+        scan: 'Scansiona Condividi Applicazione',
+        download: 'Scarica Codice QR',
+      },
+      customize: {
+        way: 'modo',
+        entry: 'Personalizza',
+        title: 'Personalizza AI WebApp',
+        explanation:
+          'Puoi personalizzare il frontend della Web App per adattarla alle tue esigenze di scenario e stile.',
+        way1: {
+          name: 'Fork il codice client, modificalo e distribuiscilo su Vercel (consigliato)',
+          step1: 'Fork il codice client e modificalo',
+          step1Tip:
+            'Clicca qui per fork il codice sorgente nel tuo account GitHub e modifica il codice',
+          step1Operation: 'Dify-WebClient',
+          step2: 'Distribuisci su Vercel',
+          step2Tip:
+            'Clicca qui per importare il repository su Vercel e distribuisci',
+          step2Operation: 'Importa repository',
+          step3: 'Configura le variabili di ambiente',
+          step3Tip: 'Aggiungi le seguenti variabili di ambiente su Vercel',
+        },
+        way2: {
+          name: 'Scrivi codice lato client per chiamare l\'API e distribuiscilo su un server',
+          operation: 'Documentazione',
+        },
+      },
+      launch: 'Lanciare',
+    },
+    apiInfo: {
+      title: 'API del servizio backend',
+      explanation: 'Facilmente integrabile nella tua applicazione',
+      accessibleAddress: 'Endpoint del servizio API',
+      doc: 'Riferimento API',
+    },
+    status: {
+      running: 'In servizio',
+      disable: 'Disabilita',
+    },
+  },
+  analysis: {
+    title: 'Analisi',
+    ms: 'ms',
+    tokenPS: 'Token/s',
+    totalMessages: {
+      title: 'Totale Messaggi',
+      explanation: 'Conteggio delle interazioni giornaliere con l\'IA.',
+    },
+    totalConversations: {
+      title: 'Conversazioni totali',
+      explanation: 'Conteggio delle conversazioni giornaliere con l\'IA; ingegneria/debug dei prompt esclusi.',
+    },
+    activeUsers: {
+      title: 'Utenti Attivi',
+      explanation:
+        'Utenti unici che interagiscono in Q&A con l\'AI; ingegneria dei prompt/debug esclusi.',
+    },
+    tokenUsage: {
+      title: 'Uso dei Token',
+      explanation:
+        'Riflette l\'uso giornaliero dei token del modello linguistico per l\'applicazione, utile per il controllo dei costi.',
+      consumed: 'Consumati',
+    },
+    avgSessionInteractions: {
+      title: 'Interazioni Medie per Sessione',
+      explanation:
+        'Conteggio continuo delle comunicazioni utente-AI; per applicazioni basate su conversazione.',
+    },
+    avgUserInteractions: {
+      title: 'Interazioni Medie per Utente',
+      explanation:
+        'Riflette la frequenza giornaliera di utilizzo degli utenti. Questo parametro riflette la fedelt脿 degli utenti.',
+    },
+    userSatisfactionRate: {
+      title: 'Tasso di Soddisfazione degli Utenti',
+      explanation:
+        'Il numero di mi piace per 1.000 messaggi. Indica la proporzione di risposte con cui gli utenti sono molto soddisfatti.',
+    },
+    avgResponseTime: {
+      title: 'Tempo Medio di Risposta',
+      explanation:
+        'Tempo (ms) per l\'AI per elaborare/rispondere; per applicazioni basate su testo.',
+    },
+    tps: {
+      title: 'Velocit脿 di Output dei Token',
+      explanation:
+        'Misura le prestazioni del LLM. Conta la velocit脿 di output dei token del LLM dall\'inizio della richiesta al completamento dell\'output.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/it-IT/app.ts b/i18n/it-IT/app.ts
new file mode 100644
index 0000000..43fe626
--- /dev/null
+++ b/i18n/it-IT/app.ts
@@ -0,0 +1,225 @@
+const translation = {
+  createApp: 'CREA APP',
+  types: {
+    all: 'Tutti',
+    chatbot: 'Chatbot',
+    agent: 'Agente',
+    workflow: 'Flusso di lavoro',
+    completion: 'Completamento',
+    advanced: 'Flusso di chat',
+    basic: 'Basico',
+  },
+  duplicate: 'Duplica',
+  duplicateTitle: 'Duplica App',
+  export: 'Esporta DSL',
+  exportFailed: 'Esportazione DSL fallita.',
+  importDSL: 'Importa file DSL',
+  createFromConfigFile: 'Crea da file DSL',
+  deleteAppConfirmTitle: 'Eliminare questa app?',
+  deleteAppConfirmContent:
+    'Eliminare l\'app 猫 irreversibile. Gli utenti non potranno pi霉 accedere alla tua app e tutte le configurazioni e i log dei prompt verranno eliminati permanentemente.',
+  appDeleted: 'App eliminata',
+  appDeleteFailed: 'Eliminazione dell\'app fallita',
+  join: 'Unisciti alla comunit脿',
+  communityIntro:
+    'Discuta con membri del team, collaboratori e sviluppatori su diversi canali.',
+  roadmap: 'Vedi la nostra roadmap',
+  newApp: {
+    startFromBlank: 'Crea da zero',
+    startFromTemplate: 'Crea da modello',
+    captionAppType: 'Che tipo di app vuoi creare?',
+    chatbotDescription:
+      'Crea un\'applicazione basata sulla chat. Questa app utilizza un formato domanda-e-risposta, consentendo pi霉 round di conversazione continua.',
+    completionDescription:
+      'Crea un\'applicazione che genera testo di alta qualit脿 basato sui prompt, come articoli, riassunti, traduzioni e altro.',
+    completionWarning: 'Questo tipo di app non sar脿 pi霉 supportato.',
+    agentDescription:
+      'Crea un Agente intelligente che pu貌 scegliere autonomamente gli strumenti per completare i compiti',
+    workflowDescription:
+      'Crea un\'applicazione che genera testo di alta qualit脿 basato su flussi di lavoro orchestrati con un alto grado di personalizzazione. 脠 adatto per utenti esperti.',
+    workflowWarning: 'Attualmente in beta',
+    chatbotType: 'Metodo di orchestrazione Chatbot',
+    basic: 'Base',
+    basicTip: 'Per principianti, pu貌 passare a Chatflow in seguito',
+    basicFor: 'PER PRINCIPIANTI',
+    basicDescription:
+      'L\'Orchestrazione di base consente l\'orchestrazione di un\'app Chatbot utilizzando impostazioni semplici, senza la possibilit脿 di modificare i prompt integrati. 脠 adatta per principianti.',
+    advanced: 'Chatflow',
+    advancedFor: 'Per utenti avanzati',
+    advancedDescription:
+      'L\'Orchestrazione del flusso di lavoro orchestra i Chatbot sotto forma di flussi di lavoro, offrendo un alto grado di personalizzazione, inclusa la possibilit脿 di modificare i prompt integrati. 脠 adatta per utenti esperti.',
+    captionName: 'Icona e nome dell\'app',
+    appNamePlaceholder: 'Dai un nome alla tua app',
+    captionDescription: 'Descrizione',
+    appDescriptionPlaceholder: 'Inserisci la descrizione dell\'app',
+    useTemplate: 'Usa questo modello',
+    previewDemo: 'Anteprima demo',
+    chatApp: 'Assistente',
+    chatAppIntro:
+      'Voglio creare un\'applicazione basata sulla chat. Questa app utilizza un formato domanda-e-risposta, consentendo pi霉 round di conversazione continua.',
+    agentAssistant: 'Nuovo Agente Assistente',
+    completeApp: 'Generatore di Testi',
+    completeAppIntro:
+      'Voglio creare un\'applicazione che genera testo di alta qualit脿 basato sui prompt, come articoli, riassunti, traduzioni e altro.',
+    showTemplates: 'Voglio scegliere da un modello',
+    hideTemplates: 'Torna alla selezione della modalit脿',
+    Create: 'Crea',
+    Cancel: 'Annulla',
+    nameNotEmpty: 'Il nome non pu貌 essere vuoto',
+    appTemplateNotSelected: 'Seleziona un modello',
+    appTypeRequired: 'Seleziona un tipo di app',
+    appCreated: 'App creata',
+    appCreateFailed: 'Creazione dell\'app fallita',
+    Confirm: 'Confermare',
+    appCreateDSLErrorPart2: 'Vuoi continuare?',
+    appCreateDSLErrorPart3: 'Versione DSL dell\'applicazione corrente:',
+    appCreateDSLErrorPart1: '脠 stata rilevata una differenza significativa nelle versioni DSL. Forzare l\'importazione pu貌 causare il malfunzionamento dell\'applicazione.',
+    caution: 'Cautela',
+    appCreateDSLErrorTitle: 'Incompatibilit脿 di versione',
+    appCreateDSLWarning: 'Attenzione: la differenza di versione DSL pu貌 influire su alcune funzionalit脿',
+    appCreateDSLErrorPart4: 'Versione DSL supportata dal sistema:',
+    forBeginners: 'PER I PRINCIPIANTI',
+    noAppsFound: 'Nessuna app trovata',
+    noTemplateFoundTip: 'Prova a cercare utilizzando parole chiave diverse.',
+    foundResults: '{{conteggio}} Risultati',
+    chatbotShortDescription: 'Chatbot basato su LLM con configurazione semplice',
+    forAdvanced: 'PER UTENTI AVANZATI',
+    workflowShortDescription: 'Orchestrazione per attivit脿 di automazione a turno singolo',
+    foundResult: '{{conteggio}} Risultato',
+    noIdeaTip: 'Non hai idee? Dai un\'occhiata ai nostri modelli',
+    completionShortDescription: 'Assistente AI per le attivit脿 di generazione del testo',
+    optional: 'Opzionale',
+    learnMore: 'Ulteriori informazioni',
+    noTemplateFound: 'Nessun modello trovato',
+    chatbotUserDescription: 'Crea rapidamente un chatbot basato su LLM con una configurazione semplice. Puoi passare a Chatflow in un secondo momento.',
+    agentShortDescription: 'Agente intelligente con ragionamento e uso autonomo degli strumenti',
+    completionUserDescription: 'Crea rapidamente un assistente AI per le attivit脿 di generazione di testo con una configurazione semplice.',
+    advancedUserDescription: 'Orchestrazione del flusso di lavoro per attivit脿 di dialogo complesse a pi霉 round con funzionalit脿 di memoria.',
+    workflowUserDescription: 'Orchestrazione del flusso di lavoro per attivit脿 a ciclo singolo come l\'automazione e l\'elaborazione batch.',
+    agentUserDescription: 'Un agente intelligente in grado di ragionare in modo iterativo e di utilizzare autonomamente gli strumenti per raggiungere gli obiettivi del compito.',
+    advancedShortDescription: 'Flusso di lavoro per dialoghi complessi a pi霉 turni con memoria',
+    chooseAppType: 'Scegli il tipo di app',
+  },
+  editApp: 'Modifica Info',
+  editAppTitle: 'Modifica Info App',
+  editDone: 'Info app aggiornata',
+  editFailed: 'Aggiornamento delle info dell\'app fallito',
+  iconPicker: {
+    ok: 'OK',
+    cancel: 'Annulla',
+    emoji: 'Emoji',
+    image: 'Immagine',
+  },
+  switch: 'Passa a Orchestrazione del flusso di lavoro',
+  switchTipStart:
+    'Verr脿 creata una nuova copia dell\'app per te, e la nuova copia passer脿 a Orchestrazione del flusso di lavoro. La nuova copia ',
+  switchTip: 'non permetter脿',
+  switchTipEnd: ' di tornare a Orchestrazione di base.',
+  switchLabel: 'La copia dell\'app da creare',
+  removeOriginal: 'Elimina l\'app originale',
+  switchStart: 'Inizia il passaggio',
+  typeSelector: {
+    all: 'TUTTI I Tipi',
+    chatbot: 'Chatbot',
+    agent: 'Agente',
+    workflow: 'Flusso di lavoro',
+    completion: 'Completamento',
+    advanced: 'Flusso di chat',
+  },
+  tracing: {
+    title: 'Tracciamento delle prestazioni dell\'app',
+    description:
+      'Configurazione di un provider LLMOps di terze parti e tracciamento delle prestazioni dell\'app.',
+    config: 'Config',
+    collapse: 'Comprimi',
+    expand: 'Espandi',
+    tracing: 'Tracciamento',
+    disabled: 'Disabilitato',
+    disabledTip: 'Configura prima il provider',
+    enabled: 'In servizio',
+    tracingDescription:
+      'Cattura il contesto completo dell\'esecuzione dell\'app, incluse chiamate LLM, contesto, prompt, richieste HTTP e altro, su una piattaforma di tracciamento di terze parti.',
+    configProviderTitle: {
+      configured: 'Configurato',
+      notConfigured: 'Configura il provider per abilitare il tracciamento',
+      moreProvider: 'Altri Provider',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description:
+        'Una piattaforma all-in-one per sviluppatori per ogni fase del ciclo di vita delle applicazioni alimentate da LLM.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description:
+        'Tracce, valutazioni, gestione dei prompt e metriche per debug e miglioramento della tua applicazione LLM.',
+    },
+    inUse: 'In uso',
+    configProvider: {
+      title: 'Config ',
+      placeholder: 'Inserisci il tuo {{key}}',
+      project: 'Progetto',
+      publicKey: 'Chiave pubblica',
+      secretKey: 'Chiave segreta',
+      viewDocsLink: 'Visualizza documenti di {{key}}',
+      removeConfirmTitle: 'Rimuovere la configurazione di {{key}}?',
+      removeConfirmContent:
+        'La configurazione attuale 猫 in uso, rimuovendola disattiver脿 la funzione di Tracciamento.',
+    },
+    view: 'Vista',
+    opik: {
+      description: 'Opik 猫 una piattaforma open source per la valutazione, il test e il monitoraggio delle applicazioni LLM.',
+      title: 'Opik',
+    },
+    weave: {
+      title: 'Intrecciare',
+      description: 'Weave 猫 una piattaforma open-source per valutare, testare e monitorare le applicazioni LLM.',
+    },
+  },
+  answerIcon: {
+    description: 'Se utilizzare l\'icona WebApp per la sostituzione 馃 nell\'applicazione condivisa',
+    title: 'Usa l\'icona WebApp per sostituire 馃',
+    descriptionInExplore: 'Se utilizzare l\'icona WebApp per sostituirla 馃 in Esplora',
+  },
+  importFromDSLUrl: 'Dall\'URL',
+  importFromDSLFile: 'Da file DSL',
+  importFromDSL: 'Importazione da DSL',
+  importFromDSLUrlPlaceholder: 'Incolla qui il link DSL',
+  mermaid: {
+    handDrawn: 'Disegnato a mano',
+    classic: 'Classico',
+  },
+  openInExplore: 'Apri in Esplora',
+  newAppFromTemplate: {
+    sidebar: {
+      Programming: 'Programmazione',
+      Writing: 'Scrittura',
+      Recommended: 'Raccomandato',
+      Agent: 'Agente',
+      Assistant: 'Assistente',
+      HR: 'HR',
+      Workflow: 'Flusso di lavoro',
+    },
+    byCategories: 'PER CATEGORIE',
+    searchAllTemplate: 'Cerca in tutti i modelli...',
+  },
+  showMyCreatedAppsOnly: 'Mostra solo le mie app create',
+  appSelector: {
+    params: 'PARAMETRI DELL\'APP',
+    noParams: 'Non sono necessari parametri',
+    placeholder: 'Seleziona un\'app...',
+    label: 'APP',
+  },
+  structOutput: {
+    modelNotSupported: 'Modello non supportato',
+    configure: 'Configura',
+    LLMResponse: 'LLM Risposta',
+    structured: 'Strutturato',
+    moreFillTip: 'Mostrando un massimo di 10 livelli di annidamento',
+    structuredTip: 'Le Uscite Strutturate sono una funzione che garantisce che il modello generi sempre risposte che aderiscano al tuo Schema JSON fornito.',
+    notConfiguredTip: 'L\'output strutturato non 猫 stato ancora configurato.',
+    modelNotSupportedTip: 'Il modello attuale non supporta questa funzione e viene automaticamente downgradato a iniezione di prompt.',
+  },
+}
+
+export default translation
diff --git a/i18n/it-IT/billing.ts b/i18n/it-IT/billing.ts
new file mode 100644
index 0000000..69adc34
--- /dev/null
+++ b/i18n/it-IT/billing.ts
@@ -0,0 +1,213 @@
+const translation = {
+  currentPlan: 'Piano Attuale',
+  upgradeBtn: {
+    plain: 'Aggiorna Piano',
+    encourage: 'Aggiorna Ora',
+    encourageShort: 'Aggiorna',
+  },
+  viewBilling: 'Gestisci fatturazione e abbonamenti',
+  buyPermissionDeniedTip:
+    'Contatta l\'amministratore della tua azienda per abbonarti',
+  plansCommon: {
+    title: 'Scegli un piano adatto a te',
+    yearlyTip: 'Ottieni 2 mesi gratis abbonandoti annualmente!',
+    mostPopular: 'Pi霉 Popolare',
+    planRange: {
+      monthly: 'Mensile',
+      yearly: 'Annuale',
+    },
+    month: 'mese',
+    year: 'anno',
+    save: 'Risparmia ',
+    free: 'Gratuito',
+    currentPlan: 'Piano Attuale',
+    contractSales: 'Contatta vendite',
+    contractOwner: 'Contatta il responsabile del team',
+    startForFree: 'Inizia gratis',
+    getStartedWith: 'Inizia con ',
+    contactSales: 'Contatta le vendite',
+    talkToSales: 'Parla con le vendite',
+    modelProviders: 'Fornitori di Modelli',
+    teamMembers: 'Membri del Team',
+    annotationQuota: 'Quota di Annotazione',
+    buildApps: 'Crea App',
+    vectorSpace: 'Spazio Vettoriale',
+    vectorSpaceBillingTooltip:
+      'Ogni 1MB pu貌 memorizzare circa 1,2 milioni di caratteri di dati vettoriali (stimato utilizzando OpenAI Embeddings, varia tra i modelli).',
+    vectorSpaceTooltip:
+      'Lo Spazio Vettoriale 猫 il sistema di memoria a lungo termine necessario per permettere agli LLM di comprendere i tuoi dati.',
+    documentsUploadQuota: 'Quota di Caricamento Documenti',
+    documentProcessingPriority: 'Priorit脿 di Elaborazione Documenti',
+    documentProcessingPriorityTip:
+      'Per una maggiore priorit脿 di elaborazione dei documenti, aggiorna il tuo piano.',
+    documentProcessingPriorityUpgrade:
+      'Elabora pi霉 dati con maggiore precisione a velocit脿 pi霉 elevate.',
+    priority: {
+      'standard': 'Standard',
+      'priority': 'Priorit脿',
+      'top-priority': 'Massima Priorit脿',
+    },
+    logsHistory: 'Storico dei Log',
+    customTools: 'Strumenti Personalizzati',
+    unavailable: 'Non Disponibile',
+    days: 'giorni',
+    unlimited: 'Illimitato',
+    support: 'Supporto',
+    supportItems: {
+      communityForums: 'Forum della comunit脿',
+      emailSupport: 'Supporto via email',
+      priorityEmail: 'Supporto via email e chat prioritario',
+      logoChange: 'Cambia logo',
+      SSOAuthentication: 'Autenticazione SSO',
+      personalizedSupport: 'Supporto personalizzato',
+      dedicatedAPISupport: 'Supporto API dedicato',
+      customIntegration: 'Integrazione e supporto personalizzato',
+      ragAPIRequest: 'Richieste API RAG',
+      bulkUpload: 'Caricamento massivo di documenti',
+      agentMode: 'Modalit脿 Agente',
+      workflow: 'Flusso di Lavoro',
+      llmLoadingBalancing: 'Bilanciamento del Carico LLM',
+      llmLoadingBalancingTooltip:
+        'Aggiungi pi霉 chiavi API ai modelli, bypassando efficacemente i limiti di velocit脿 dell\'API.',
+    },
+    comingSoon: 'In arrivo',
+    member: 'Membro',
+    memberAfter: 'Membro',
+    messageRequest: {
+      title: 'Crediti Messaggi',
+      tooltip:
+        'Quote di invocazione dei messaggi per vari piani utilizzando i modelli OpenAI (eccetto gpt4). I messaggi oltre il limite utilizzeranno la tua chiave API OpenAI.',
+      titlePerMonth: '{{count,number}} messaggi/mese',
+    },
+    annotatedResponse: {
+      title: 'Limiti di Quota di Annotazione',
+      tooltip:
+        'La modifica manuale e l\'annotazione delle risposte forniscono capacit脿 di risposta a domande personalizzabili di alta qualit脿 per le app. (Applicabile solo nelle app di chat)',
+    },
+    ragAPIRequestTooltip:
+      'Si riferisce al numero di chiamate API che invocano solo le capacit脿 di elaborazione della base di conoscenza di Dify.',
+    receiptInfo:
+      'Solo il proprietario del team e l\'amministratore del team possono abbonarsi e visualizzare le informazioni di fatturazione',
+    comparePlanAndFeatures: 'Confronta piani e caratteristiche',
+    teamWorkspace: '{{count,number}} Spazio di lavoro di squadra',
+    apiRateLimit: 'Limite di richiesta API',
+    unlimitedApiRate: 'Nessun limite di tasso API',
+    freeTrialTipPrefix: 'Iscriviti e ricevi un',
+    teamMember_one: '{{count,number}} membro del team',
+    documents: '{{count,number}} Documenti di Conoscenza',
+    apiRateLimitUnit: '{{count,number}}/giorno',
+    documentsRequestQuota: '{{count,number}}/min Limite di richiesta di conoscenza',
+    teamMember_other: '{{count,number}} membri del team',
+    freeTrialTip: 'prova gratuita di 200 chiamate OpenAI.',
+    priceTip: 'per spazio di lavoro/',
+    self: 'Auto-ospitato',
+    documentsTooltip: 'Quota sul numero di documenti importati dalla Fonte di Dati Conoscitiva.',
+    freeTrialTipSuffix: 'Nessuna carta di credito richiesta',
+    cloud: 'Servizio Cloud',
+    apiRateLimitTooltip: 'Il limite di utilizzo dell\'API si applica a tutte le richieste effettuate tramite l\'API Dify, comprese la generazione di testo, le conversazioni chat, le esecuzioni di flussi di lavoro e l\'elaborazione di documenti.',
+    getStarted: 'Inizia',
+    annualBilling: 'Fatturazione annuale',
+    documentsRequestQuotaTooltip: 'Specifica il numero totale di azioni che un\'area di lavoro pu貌 eseguire al minuto all\'interno della base di conoscenza, compresi la creazione, l\'eliminazione, gli aggiornamenti dei dataset, il caricamento di documenti, le modifiche, l\'archiviazione e le query sulla base di conoscenza. Questa metrica viene utilizzata per valutare le prestazioni delle richieste alla base di conoscenza. Ad esempio, se un utente di Sandbox esegue 10 test consecutivi in un minuto, la sua area di lavoro sar脿 temporaneamente limitata dall\'eseguire le seguenti azioni per il minuto successivo: creazione, eliminazione, aggiornamenti dei dataset e caricamento o modifica di documenti.',
+  },
+  plans: {
+    sandbox: {
+      name: 'Sandbox',
+      description: '200 prove gratuite di GPT',
+      includesTitle: 'Include:',
+      for: 'Prova gratuita delle capacit脿 principali',
+    },
+    professional: {
+      name: 'Professional',
+      description:
+        'Per individui e piccoli team per sbloccare pi霉 potenza a prezzi accessibili.',
+      includesTitle: 'Tutto nel piano gratuito, pi霉:',
+      for: 'Per sviluppatori indipendenti / piccoli team',
+    },
+    team: {
+      name: 'Team',
+      description:
+        'Collabora senza limiti e goditi prestazioni di alto livello.',
+      includesTitle: 'Tutto nel piano Professional, pi霉:',
+      for: 'Per team di medie dimensioni',
+    },
+    enterprise: {
+      name: 'Enterprise',
+      description:
+        'Ottieni tutte le capacit脿 e il supporto per sistemi mission-critical su larga scala.',
+      includesTitle: 'Tutto nel piano Team, pi霉:',
+      features: {
+        6: 'Sicurezza e Controlli Avanzati',
+        2: 'Funzionalit脿 esclusive per le imprese',
+        4: 'SSO',
+        8: 'Supporto Tecnico Professionale',
+        5: 'SLA negoziati da Dify Partners',
+        0: 'Soluzioni di distribuzione scalabili di livello enterprise',
+        7: 'Aggiornamenti e manutenzione di Dify ufficialmente',
+        1: 'Autorizzazione alla Licenza Commerciale',
+        3: 'Gestione di pi霉 spazi di lavoro e imprese',
+      },
+      price: 'Personalizzato',
+      for: 'Per team di grandi dimensioni',
+      btnText: 'Contatta le vendite',
+      priceTip: 'Solo fatturazione annuale',
+    },
+    community: {
+      features: {
+        1: 'Spazio di Lavoro Unico',
+        2: 'Rispetta la Licenza Open Source di Dify',
+        0: 'Tutte le funzionalit脿 principali rilasciate sotto il repository pubblico',
+      },
+      name: 'Comunit脿',
+      btnText: 'Inizia con la comunit脿',
+      includesTitle: 'Caratteristiche Gratuite:',
+      description: 'Per utenti individuali, piccole squadre o progetti non commerciali',
+      price: 'Gratuito',
+      for: 'Per utenti individuali, piccole squadre o progetti non commerciali',
+    },
+    premium: {
+      features: {
+        0: 'Affidabilit脿 autogestita da vari fornitori di cloud',
+        3: 'Supporto prioritario via Email e Chat',
+        2: 'Personalizzazione del logo e del marchio dell\'app web',
+        1: 'Spazio di Lavoro Unico',
+      },
+      name: 'Premium',
+      priceTip: 'Basato su Cloud Marketplace',
+      includesTitle: 'Tutto dalla Community, oltre a:',
+      description: 'Per organizzazioni e team di medie dimensioni',
+      for: 'Per organizzazioni e team di medie dimensioni',
+      btnText: 'Ottieni Premium in',
+      price: 'Scalabile',
+      comingSoon: 'Supporto di Microsoft Azure e Google Cloud in arrivo presto',
+    },
+  },
+  vectorSpace: {
+    fullTip: 'Lo Spazio Vettoriale 猫 pieno.',
+    fullSolution: 'Aggiorna il tuo piano per ottenere pi霉 spazio.',
+  },
+  apps: {
+    fullTipLine1: 'Aggiorna il tuo piano per',
+    fullTipLine2: 'creare pi霉 app.',
+    fullTip1des: 'Hai raggiunto il limite di costruzione delle app su questo piano.',
+    fullTip2des: 'Si consiglia di disinstallare le applicazioni inattive per liberare spazio, o contattarci.',
+    contactUs: 'Contattaci',
+    fullTip2: 'Limite del piano raggiunto',
+    fullTip1: 'Aggiorna per creare pi霉 app',
+  },
+  annotatedResponse: {
+    fullTipLine1: 'Aggiorna il tuo piano per',
+    fullTipLine2: 'annotare pi霉 conversazioni.',
+    quotaTitle: 'Quota di Risposta Annotata',
+  },
+  usagePage: {
+    buildApps: 'Costruisci app',
+    vectorSpace: 'Archiviazione dei dati conoscitivi',
+    annotationQuota: 'Quota di annotazione',
+    teamMembers: 'Membri del team',
+    documentsUploadQuota: 'Quota di Caricamento Documenti',
+    vectorSpaceTooltip: 'I documenti con la modalit脿 di indicizzazione ad alta qualit脿 consumeranno risorse di Knowledge Data Storage. Quando il Knowledge Data Storage raggiunge il limite, nuovi documenti non verranno caricati.',
+  },
+  teamMembers: 'Membri del team',
+}
+
+export default translation
diff --git a/i18n/it-IT/common.ts b/i18n/it-IT/common.ts
new file mode 100644
index 0000000..f337990
--- /dev/null
+++ b/i18n/it-IT/common.ts
@@ -0,0 +1,703 @@
+const translation = {
+  api: {
+    success: 'Successo',
+    actionSuccess: 'Azione riuscita',
+    saved: 'Salvato',
+    create: 'Creato',
+    remove: 'Rimosso',
+  },
+  operation: {
+    create: 'Crea',
+    confirm: 'Conferma',
+    cancel: 'Annulla',
+    clear: 'Cancella',
+    save: 'Salva',
+    saveAndEnable: 'Salva & Abilita',
+    edit: 'Modifica',
+    add: 'Aggiungi',
+    added: 'Aggiunto',
+    refresh: 'Riavvia',
+    reset: 'Reimposta',
+    search: 'Cerca',
+    change: 'Cambia',
+    remove: 'Rimuovi',
+    send: 'Invia',
+    copy: 'Copia',
+    lineBreak: 'A capo',
+    sure: 'Sono sicuro',
+    download: 'Scarica',
+    delete: 'Elimina',
+    settings: 'Impostazioni',
+    setup: 'Configurazione',
+    getForFree: 'Ottieni gratuitamente',
+    reload: 'Ricarica',
+    ok: 'OK',
+    log: 'Log',
+    learnMore: 'Scopri di pi霉',
+    params: 'Parametri',
+    duplicate: 'Duplica',
+    rename: 'Rinomina',
+    audioSourceUnavailable: 'AudioSource non 猫 disponibile',
+    zoomOut: 'Zoom indietro',
+    zoomIn: 'Ingrandisci',
+    openInNewTab: 'Apri in una nuova scheda',
+    copyImage: 'Copia immagine',
+    close: 'Chiudere',
+    view: 'Vista',
+    saveAndRegenerate: 'Salva e rigenera i blocchi figlio',
+    regenerate: 'Rigenerare',
+    viewMore: 'SCOPRI DI PI脵',
+    submit: 'Invia',
+    skip: 'Nave',
+    imageCopied: 'Immagine copiata',
+    deleteApp: 'Elimina app',
+    in: 'in',
+    viewDetails: 'Visualizza dettagli',
+    copied: 'Copiato',
+    downloadSuccess: 'Download completato.',
+    downloadFailed: 'Download non riuscito. Per favore riprova pi霉 tardi.',
+    more: 'Di pi霉',
+    format: 'Formato',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 猫 obbligatorio',
+    urlError: 'L\'URL deve iniziare con http:// o https://',
+  },
+  placeholder: {
+    input: 'Per favore inserisci',
+    select: 'Per favore seleziona',
+  },
+  voice: {
+    language: {
+      zhHans: 'Cinese',
+      zhHant: 'Cinese Tradizionale',
+      enUS: 'Inglese',
+      deDE: 'Tedesco',
+      frFR: 'Francese',
+      esES: 'Spagnolo',
+      itIT: 'Italiano',
+      thTH: 'Thailandese',
+      idID: 'Indonesiano',
+      jaJP: 'Giapponese',
+      koKR: 'Coreano',
+      ptBR: 'Portoghese',
+      ruRU: 'Russo',
+      ukUA: 'Ucraino',
+      viVN: 'Vietnamita',
+      plPL: 'Polacco',
+      roRO: 'Rumeno',
+      hiIN: 'Hindi',
+      trTR: 'Turco',
+      faIR: 'Persiano',
+    },
+  },
+  unit: {
+    char: 'caratteri',
+  },
+  actionMsg: {
+    noModification: 'Nessuna modifica al momento.',
+    modifiedSuccessfully: 'Modificato con successo',
+    modifiedUnsuccessfully: 'Modifica non riuscita',
+    copySuccessfully: 'Copiato con successo',
+    paySucceeded: 'Pagamento riuscito',
+    payCancelled: 'Pagamento annullato',
+    generatedSuccessfully: 'Generato con successo',
+    generatedUnsuccessfully: 'Generazione non riuscita',
+  },
+  model: {
+    params: {
+      temperature: 'Temperatura',
+      temperatureTip:
+        'Controlla la casualit脿: Abbassando si ottengono completamenti meno casuali. Man mano che la temperatura si avvicina a zero, il modello diventa deterministico e ripetitivo.',
+      top_p: 'Top P',
+      top_pTip:
+        'Controlla la diversit脿 tramite campionamento nucleare: 0.5 significa che vengono considerati la met脿 di tutte le opzioni ponderate per probabilit脿.',
+      presence_penalty: 'Penalit脿 di presenza',
+      presence_penaltyTip:
+        'Quanto penalizzare i nuovi token in base alla loro presenza nel testo finora. Aumenta la probabilit脿 che il modello parli di nuovi argomenti.',
+      frequency_penalty: 'Penalit脿 di frequenza',
+      frequency_penaltyTip:
+        'Quanto penalizzare i nuovi token in base alla loro frequenza esistente nel testo finora. Diminuisce la probabilit脿 che il modello ripeta la stessa riga alla lettera.',
+      max_tokens: 'Token massimo',
+      max_tokensTip:
+        'Utilizzato per limitare la lunghezza massima della risposta, in token. Valori maggiori possono limitare lo spazio lasciato per le parole del prompt, i log della chat e la Conoscenza. Si consiglia di impostarlo al di sotto dei due terzi\ngpt-4-1106-preview, gpt-4-vision-preview max token (input 128k output 4k)',
+      maxTokenSettingTip:
+        'La tua impostazione di token massimo 猫 alta, potenzialmente limitando lo spazio per prompt, query e dati. Considera di impostarlo al di sotto dei 2/3.',
+      setToCurrentModelMaxTokenTip:
+        'Il token massimo 猫 aggiornato all\'80% del token massimo del modello corrente {{maxToken}}.',
+      stop_sequences: 'Sequenze di stop',
+      stop_sequencesTip:
+        'Fino a quattro sequenze in cui l\'API smetter脿 di generare ulteriori token. Il testo restituito non conterr脿 la sequenza di stop.',
+      stop_sequencesPlaceholder: 'Inserisci la sequenza e premi Tab',
+    },
+    tone: {
+      Creative: 'Creativo',
+      Balanced: 'Bilanciato',
+      Precise: 'Preciso',
+      Custom: 'Personalizzato',
+    },
+    addMoreModel: 'Vai alle impostazioni per aggiungere altri modelli',
+    capabilities: 'Funzionalit脿 multimodali',
+    settingsLink: 'Impostazioni del fornitore del modello',
+  },
+  menus: {
+    status: 'beta',
+    explore: 'Esplora',
+    apps: 'Studio',
+    plugins: 'Plugin',
+    pluginsTips:
+      'Integra plugin di terze parti o crea plugin AI compatibili con ChatGPT.',
+    datasets: 'Conoscenza',
+    datasetsTips:
+      'PROSSIMAMENTE: Importa i tuoi dati testuali o scrivi dati in tempo reale tramite Webhook per migliorare il contesto LLM.',
+    newApp: 'Nuova App',
+    newDataset: 'Crea Conoscenza',
+    tools: 'Strumenti',
+    exploreMarketplace: 'Esplora il Marketplace',
+  },
+  userProfile: {
+    settings: 'Impostazioni',
+    emailSupport: 'Supporto Email',
+    workspace: 'Workspace',
+    createWorkspace: 'Crea Workspace',
+    helpCenter: 'Aiuto',
+    communityFeedback: 'Feedback',
+    roadmap: 'Tabella di marcia',
+    community: 'Comunit脿',
+    about: 'Informazioni',
+    logout: 'Esci',
+    support: 'Supporto',
+    compliance: 'Conformit脿',
+    github: 'GitHub',
+  },
+  settings: {
+    accountGroup: 'ACCOUNT',
+    workplaceGroup: 'WORKSPACE',
+    account: 'Il mio account',
+    members: 'Membri',
+    billing: 'Fatturazione',
+    integrations: 'Integrazioni',
+    language: 'Lingua',
+    provider: 'Fornitore di Modelli',
+    dataSource: 'Fonte Dati',
+    plugin: 'Plugin',
+    apiBasedExtension: 'Estensione API',
+    generalGroup: 'GENERALE',
+  },
+  account: {
+    avatar: 'Avatar',
+    name: 'Nome',
+    email: 'Email',
+    password: 'Password',
+    passwordTip:
+      'Puoi impostare una password permanente se non vuoi utilizzare codici di accesso temporanei',
+    setPassword: 'Imposta una password',
+    resetPassword: 'Reimposta password',
+    currentPassword: 'Password attuale',
+    newPassword: 'Nuova password',
+    confirmPassword: 'Conferma password',
+    notEqual: 'Le due password sono diverse.',
+    langGeniusAccount: 'Account Dify',
+    langGeniusAccountTip: 'Il tuo account Dify e i dati utente associati.',
+    editName: 'Modifica Nome',
+    showAppLength: 'Mostra {{length}} app',
+    delete: 'Elimina Account',
+    deleteTip:
+      'Eliminando il tuo account cancellerai permanentemente tutti i tuoi dati e non sar脿 possibile recuperarli.',
+    deleteConfirmTip:
+      'Per confermare, invia il seguente messaggio dalla tua email registrata a ',
+    myAccount: 'Il mio account',
+    account: 'Conto',
+    studio: 'Dify Studio',
+    deletePrivacyLinkTip: 'Per ulteriori informazioni su come gestiamo i tuoi dati, consulta il nostro',
+    deletePrivacyLink: 'Informativa sulla privacy.',
+    deleteSuccessTip: 'Il tuo account ha bisogno di tempo per completare l\'eliminazione. Ti invieremo un\'e-mail quando tutto sar脿 finito.',
+    deleteLabel: 'Per confermare, digita la tua email qui sotto',
+    deletePlaceholder: 'Inserisci la tua email',
+    sendVerificationButton: 'Invia codice di verifica',
+    verificationLabel: 'Codice di verifica',
+    verificationPlaceholder: 'Incolla il codice a 6 cifre',
+    permanentlyDeleteButton: 'Elimina definitivamente l\'account',
+    feedbackTitle: 'Valutazione',
+    feedbackLabel: 'Dicci perch茅 hai cancellato il tuo account?',
+    feedbackPlaceholder: 'Opzionale',
+    workspaceIcon: 'Icona della workspace',
+    editWorkspaceInfo: 'Modifica informazioni dello spazio di lavoro',
+    workspaceName: 'Nome del Workspace',
+  },
+  members: {
+    team: 'Team',
+    invite: 'Aggiungi',
+    name: 'NOME',
+    lastActive: 'ULTIMA ATTIVIT脌',
+    role: 'RUOLI',
+    pending: 'In attesa...',
+    owner: 'Proprietario',
+    admin: 'Admin',
+    adminTip: 'Pu貌 creare app e gestire le impostazioni del team',
+    normal: 'Normale',
+    normalTip: 'Pu貌 solo usare le app, non pu貌 crearle',
+    builder: 'Builder',
+    builderTip: 'Pu貌 creare e modificare le proprie app',
+    editor: 'Editor',
+    editorTip: 'Pu貌 creare e modificare app',
+    datasetOperator: 'Admin della Conoscenza',
+    datasetOperatorTip: 'Pu貌 solo gestire la base di conoscenza',
+    inviteTeamMember: 'Aggiungi membro del team',
+    inviteTeamMemberTip:
+      'Potranno accedere ai dati del tuo team direttamente dopo aver effettuato l\'accesso.',
+    emailNotSetup: 'Il server email non 猫 configurato, quindi non 猫 possibile inviare email di invito. Si prega di notificare agli utenti il link di invito che verr脿 emesso dopo l\'invito.',
+    email: 'Email',
+    emailInvalid: 'Formato Email non valido',
+    emailPlaceholder: 'Per favore inserisci le email',
+    sendInvite: 'Invia Invito',
+    invitedAsRole: 'Invitato come utente {{role}}',
+    invitationSent: 'Invito inviato',
+    invitationSentTip:
+      'Invito inviato, e possono accedere a Dify per accedere ai dati del tuo team.',
+    invitationLink: 'Link di Invito',
+    failedInvitationEmails:
+      'Gli utenti seguenti non sono stati invitati con successo',
+    ok: 'OK',
+    removeFromTeam: 'Rimuovi dal team',
+    removeFromTeamTip: 'Rimuover脿 l\'accesso al team',
+    setAdmin: 'Imposta come amministratore',
+    setMember: 'Imposta come membro ordinario',
+    setBuilder: 'Imposta come builder',
+    setEditor: 'Imposta come editor',
+    disInvite: 'Annulla l\'invito',
+    deleteMember: 'Elimina Membro',
+    you: '(Tu)',
+  },
+  integrations: {
+    connected: 'Connesso',
+    google: 'Google',
+    googleAccount: 'Accedi con l\'account Google',
+    github: 'GitHub',
+    githubAccount: 'Accedi con l\'account GitHub',
+    connect: 'Connetti',
+  },
+  language: {
+    displayLanguage: 'Lingua di visualizzazione',
+    timezone: 'Fuso orario',
+  },
+  provider: {
+    apiKey: 'API Key',
+    enterYourKey: 'Inserisci qui la tua API key',
+    invalidKey: 'Chiave API OpenAI non valida',
+    validatedError: 'Convalida fallita: ',
+    validating: 'Convalida chiave in corso...',
+    saveFailed: 'Salvataggio della chiave API fallito',
+    apiKeyExceedBill:
+      'Questa API KEY non ha pi霉 quota disponibile, per favore leggi',
+    addKey: 'Aggiungi Chiave',
+    comingSoon: 'Prossimamente',
+    editKey: 'Modifica',
+    invalidApiKey: 'Chiave API non valida',
+    azure: {
+      apiBase: 'Base API',
+      apiBasePlaceholder: 'L\'URL Base API del tuo Endpoint Azure OpenAI.',
+      apiKey: 'API Key',
+      apiKeyPlaceholder: 'Inserisci qui la tua API key',
+      helpTip: 'Scopri di pi霉 su Azure OpenAI Service',
+    },
+    openaiHosted: {
+      openaiHosted: 'OpenAI Ospitato',
+      onTrial: 'IN PROVA',
+      exhausted: 'QUOTA ESAURITA',
+      desc: 'Il servizio di hosting OpenAI fornito da Dify ti consente di utilizzare modelli come GPT-3.5. Prima che la tua quota di prova sia esaurita, devi configurare altri fornitori di modelli.',
+      callTimes: 'Numero di chiamate',
+      usedUp: 'Quota di prova esaurita. Aggiungi il tuo fornitore di modelli.',
+      useYourModel: 'Attualmente utilizzando il proprio fornitore di modelli.',
+      close: 'Chiudi',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: 'IN PROVA',
+      exhausted: 'QUOTA ESAURITA',
+      desc: 'Modello potente, eccelle in una vasta gamma di compiti dal dialogo sofisticato alla generazione di contenuti creativi fino alle istruzioni dettagliate.',
+      callTimes: 'Numero di chiamate',
+      usedUp: 'Quota di prova esaurita. Aggiungi il tuo fornitore di modelli.',
+      useYourModel: 'Attualmente utilizzando il proprio fornitore di modelli.',
+      close: 'Chiudi',
+      trialQuotaTip: 'La tua quota di prova di Anthropic scadr脿 l\'11/03/2025 e non sar脿 pi霉 disponibile in seguito. Sfruttalo in tempo.',
+    },
+    anthropic: {
+      using: 'La capacit脿 di embedding 猫 in uso',
+      enableTip:
+        'Per abilitare il modello Anthropic, devi prima collegarti a OpenAI o Azure OpenAI Service.',
+      notEnabled: 'Non abilitato',
+      keyFrom: 'Ottieni la tua API key da Anthropic',
+    },
+    encrypted: {
+      front:
+        'La tua API KEY sar脿 crittografata e archiviata utilizzando la tecnologia',
+      back: '.',
+    },
+  },
+  modelProvider: {
+    notConfigured:
+      'Il modello di sistema non 猫 ancora stato completamente configurato e alcune funzioni potrebbero non essere disponibili.',
+    systemModelSettings: 'Impostazioni Modello di Sistema',
+    systemModelSettingsLink:
+      'Perch茅 猫 necessario configurare un modello di sistema?',
+    selectModel: 'Seleziona il tuo modello',
+    setupModelFirst: 'Per favore, configura prima il tuo modello',
+    systemReasoningModel: {
+      key: 'Modello di Ragionamento di Sistema',
+      tip: 'Imposta il modello di inferenza predefinito da utilizzare per creare applicazioni, cos矛 come funzionalit脿 come la generazione del nome del dialogo e il suggerimento della domanda successiva utilizzeranno anche il modello di inferenza predefinito.',
+    },
+    embeddingModel: {
+      key: 'Modello di Embedding',
+      tip: 'Imposta il modello predefinito per l\'elaborazione degli embedding dei documenti della Conoscenza, sia il recupero che l\'importazione della Conoscenza utilizzano questo modello di Embedding per il processo di vettorizzazione. Il cambio causer脿 l\'incoerenza della dimensione del vettore tra la Conoscenza importata e la domanda, causando un fallimento nel recupero. Per evitare fallimenti nel recupero, non cambiare questo modello a piacimento.',
+      required: 'Il Modello di Embedding 猫 obbligatorio',
+    },
+    speechToTextModel: {
+      key: 'Modello da Voce a Testo',
+      tip: 'Imposta il modello predefinito per l\'input da voce a testo nella conversazione.',
+    },
+    ttsModel: {
+      key: 'Modello da Testo a Voce',
+      tip: 'Imposta il modello predefinito per l\'input da testo a voce nella conversazione.',
+    },
+    rerankModel: {
+      key: 'Modello di Rerank',
+      tip: 'Il modello di rerank riordiner脿 la lista dei documenti candidati basandosi sulla corrispondenza semantica con la query dell\'utente, migliorando i risultati del ranking semantico',
+    },
+    apiKey: 'API-KEY',
+    quota: 'Quota',
+    searchModel: 'Modello di ricerca',
+    noModelFound: 'Nessun modello trovato per {{model}}',
+    models: 'Modelli',
+    showMoreModelProvider: 'Mostra pi霉 fornitori di modelli',
+    selector: {
+      tip: 'Questo modello 猫 stato rimosso. Per favore aggiungi un modello o seleziona un altro modello.',
+      emptyTip: 'Nessun modello disponibile',
+      emptySetting: 'Per favore vai alle impostazioni per configurare',
+      rerankTip: 'Per favore, configura il modello di Rerank',
+    },
+    card: {
+      quota: 'QUOTA',
+      onTrial: 'In Prova',
+      paid: 'Pagato',
+      quotaExhausted: 'Quota esaurita',
+      callTimes: 'Numero di chiamate',
+      tokens: 'Token',
+      buyQuota: 'Acquista Quota',
+      priorityUse: 'Uso prioritario',
+      removeKey: 'Rimuovi API Key',
+      tip: 'Verr脿 data priorit脿 alla quota pagata. La quota di prova sar脿 utilizzata dopo l\'esaurimento della quota pagata.',
+    },
+    item: {
+      deleteDesc:
+        '{{modelName}} 猫 utilizzato come modello di ragionamento di sistema. Alcune funzioni non saranno disponibili dopo la rimozione. Si prega di confermare.',
+      freeQuota: 'QUOTA GRATUITA',
+    },
+    addApiKey: 'Aggiungi la tua API key',
+    invalidApiKey: 'API key non valida',
+    encrypted: {
+      front:
+        'La tua API KEY sar脿 crittografata e archiviata utilizzando la tecnologia',
+      back: '.',
+    },
+    freeQuota: {
+      howToEarn: 'Come guadagnare',
+    },
+    addMoreModelProvider: 'AGGIUNGI PI脵 FORNITORI DI MODELLI',
+    addModel: 'Aggiungi Modello',
+    modelsNum: '{{num}} Modelli',
+    showModels: 'Mostra Modelli',
+    showModelsNum: 'Mostra {{num}} Modelli',
+    collapse: 'Comprimi',
+    config: 'Configura',
+    modelAndParameters: 'Modello e Parametri',
+    model: 'Modello',
+    featureSupported: '{{feature}} supportato',
+    callTimes: 'Numero di chiamate',
+    credits: 'Crediti Messaggi',
+    buyQuota: 'Acquista Quota',
+    getFreeTokens: 'Ottieni Token gratuiti',
+    priorityUsing: 'Utilizzo prioritario',
+    deprecated: 'Deprecato',
+    confirmDelete: 'confermare l\'eliminazione?',
+    quotaTip: 'Token gratuiti rimanenti disponibili',
+    loadPresets: 'Carica Preset',
+    parameters: 'PARAMETRI',
+    loadBalancing: 'Bilanciamento del Carico',
+    loadBalancingDescription: 'Riduci la pressione con pi霉 set di credenziali.',
+    loadBalancingHeadline: 'Bilanciamento del Carico',
+    configLoadBalancing: 'Configura Bilanciamento del Carico',
+    modelHasBeenDeprecated: 'Questo modello 猫 stato deprecato',
+    providerManaged: 'Gestito dal fornitore',
+    providerManagedDescription:
+      'Usa il singolo set di credenziali fornito dal fornitore del modello.',
+    defaultConfig: 'Config predefinito',
+    apiKeyStatusNormal: 'Stato APIKey normale',
+    apiKeyRateLimit:
+      'Il limite di velocit脿 猫 stato raggiunto, disponibile dopo {{seconds}}s',
+    addConfig: 'Aggiungi Configurazione',
+    editConfig: 'Modifica Configurazione',
+    loadBalancingLeastKeyWarning:
+      'Per abilitare il bilanciamento del carico devono essere abilitate almeno 2 chiavi.',
+    loadBalancingInfo:
+      'Per impostazione predefinita, il bilanciamento del carico utilizza la strategia Round-robin. Se viene attivato il rate limiting, verr脿 applicato un periodo di cooldown di 1 minuto.',
+    upgradeForLoadBalancing:
+      'Aggiorna il tuo piano per abilitare il Bilanciamento del Carico.',
+    configureTip: 'Configura la chiave API o aggiungi il modello da utilizzare',
+    installProvider: 'Installare i provider di modelli',
+    toBeConfigured: 'Da configurare',
+    emptyProviderTip: 'Si prega di installare prima un fornitore di modelli.',
+    discoverMore: 'Scopri di pi霉 in',
+    emptyProviderTitle: 'Provider di modelli non configurato',
+  },
+  dataSource: {
+    add: 'Aggiungi una fonte di dati',
+    connect: 'Connetti',
+    configure: 'Configura',
+    notion: {
+      title: 'Notion',
+      description: 'Usa Notion come fonte di dati per la Conoscenza.',
+      connectedWorkspace: 'Workspace connesso',
+      addWorkspace: 'Aggiungi workspace',
+      connected: 'Connesso',
+      disconnected: 'Disconnesso',
+      changeAuthorizedPages: 'Cambia pagine autorizzate',
+      pagesAuthorized: 'Pagine autorizzate',
+      sync: 'Sincronizza',
+      remove: 'Rimuovi',
+      selector: {
+        pageSelected: 'Pagine selezionate',
+        searchPages: 'Cerca pagine...',
+        noSearchResult: 'Nessun risultato di ricerca',
+        addPages: 'Aggiungi pagine',
+        preview: 'ANTEPRIMA',
+      },
+    },
+    website: {
+      title: 'Sito web',
+      description: 'Importa contenuti dai siti web utilizzando il web crawler.',
+      with: 'Con',
+      configuredCrawlers: 'Crawler configurati',
+      active: 'Attivo',
+      inactive: 'Inattivo',
+    },
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'API Key',
+      apiKeyPlaceholder: 'Inserisci la tua API key',
+      keyFrom: 'Ottieni la tua API key dalla pagina dell\'account SerpAPI',
+    },
+  },
+  apiBasedExtension: {
+    title:
+      'Le estensioni API forniscono una gestione centralizzata delle API, semplificando la configurazione per un facile utilizzo nelle applicazioni di Dify.',
+    link: 'Scopri come sviluppare la tua estensione API.',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: 'Aggiungi Estensione API',
+    selector: {
+      title: 'Estensione API',
+      placeholder: 'Per favore seleziona l\'estensione API',
+      manage: 'Gestisci Estensione API',
+    },
+    modal: {
+      title: 'Aggiungi Estensione API',
+      editTitle: 'Modifica Estensione API',
+      name: {
+        title: 'Nome',
+        placeholder: 'Per favore inserisci il nome',
+      },
+      apiEndpoint: {
+        title: 'Endpoint API',
+        placeholder: 'Per favore inserisci l\'endpoint API',
+      },
+      apiKey: {
+        title: 'API-key',
+        placeholder: 'Per favore inserisci l\'API-key',
+        lengthError:
+          'La lunghezza della chiave API non pu貌 essere inferiore a 5 caratteri',
+      },
+    },
+    type: 'Tipo',
+  },
+  about: {
+    changeLog: 'Registro delle modifiche',
+    updateNow: 'Aggiorna ora',
+    nowAvailable: 'Dify {{version}} 猫 ora disponibile.',
+    latestAvailable: 'Dify {{version}} 猫 l\'ultima versione disponibile.',
+  },
+  appMenus: {
+    overview: 'Monitoraggio',
+    promptEng: 'Orchestrazione',
+    apiAccess: 'Accesso API',
+    logAndAnn: 'Log & Ann.',
+    logs: 'Log',
+  },
+  environment: {
+    testing: 'TEST',
+    development: 'SVILUPPO',
+  },
+  appModes: {
+    completionApp: 'Generatore di Testi',
+    chatApp: 'App di Chat',
+  },
+  datasetMenus: {
+    documents: 'Documenti',
+    hitTesting: 'Test di Recupero',
+    settings: 'Impostazioni',
+    emptyTip:
+      'La Conoscenza non 猫 stata associata, per favore vai all\'applicazione o al plug-in per completare l\'associazione.',
+    viewDoc: 'Visualizza documentazione',
+    relatedApp: 'app collegate',
+    noRelatedApp: 'Nessuna app collegata',
+  },
+  voiceInput: {
+    speaking: 'Parla ora...',
+    converting: 'Conversione in testo...',
+    notAllow: 'microfono non autorizzato',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: 'Rinomina Conversazione',
+    conversationName: 'Nome della conversazione',
+    conversationNamePlaceholder:
+      'Per favore inserisci il nome della conversazione',
+    conversationNameCanNotEmpty: 'Nome della conversazione obbligatorio',
+    citation: {
+      title: 'CITAZIONI',
+      linkToDataset: 'Collegamento alla Conoscenza',
+      characters: 'Caratteri:',
+      hitCount: 'Conteggio dei recuperi:',
+      vectorHash: 'Hash del vettore:',
+      hitScore: 'Punteggio di recupero:',
+    },
+    inputPlaceholder: 'Parla con il bot',
+    thinking: 'Pensante...',
+    thought: 'Pensiero',
+    resend: 'Reinvia',
+  },
+  promptEditor: {
+    placeholder:
+      'Scrivi qui il tuo prompt, inserisci \'{\' per inserire una variabile, inserisci \'/\' per inserire un blocco di contenuto del prompt',
+    context: {
+      item: {
+        title: 'Contesto',
+        desc: 'Inserisci modello di contesto',
+      },
+      modal: {
+        title: '{{num}} Conoscenza nel Contesto',
+        add: 'Aggiungi Contesto ',
+        footer: 'Puoi gestire i contesti nella sezione Contesto qui sotto.',
+      },
+    },
+    history: {
+      item: {
+        title: 'Cronologia della Conversazione',
+        desc: 'Inserisci modello di messaggio storico',
+      },
+      modal: {
+        title: 'ESEMPIO',
+        user: 'Ciao',
+        assistant: 'Ciao! Come posso aiutarti oggi?',
+        edit: 'Modifica i Nomi dei Ruoli della Conversazione',
+      },
+    },
+    variable: {
+      item: {
+        title: 'Variabili & Strumenti Esterni',
+        desc: 'Inserisci Variabili & Strumenti Esterni',
+      },
+      outputToolDisabledItem: {
+        title: 'Variabili',
+        desc: 'Inserisci Variabili',
+      },
+      modal: {
+        add: 'Nuova variabile',
+        addTool: 'Nuovo strumento',
+      },
+    },
+    query: {
+      item: {
+        title: 'Query',
+        desc: 'Inserisci modello di query dell\'utente',
+      },
+    },
+    existed: 'Esiste gi脿 nel prompt',
+  },
+  imageUploader: {
+    uploadFromComputer: 'Carica dal Computer',
+    uploadFromComputerReadError:
+      'Lettura dell\'immagine fallita, per favore riprova.',
+    uploadFromComputerUploadError:
+      'Caricamento dell\'immagine fallito, per favore ricarica.',
+    uploadFromComputerLimit:
+      'Le immagini caricate non possono superare i {{size}} MB',
+    pasteImageLink: 'Incolla link immagine',
+    pasteImageLinkInputPlaceholder: 'Incolla qui il link immagine',
+    pasteImageLinkInvalid: 'Link immagine non valido',
+    imageUpload: 'Caricamento Immagine',
+  },
+  tag: {
+    placeholder: 'Tutti i Tag',
+    addNew: 'Aggiungi nuovo tag',
+    noTag: 'Nessun tag',
+    noTagYet: 'Nessun tag ancora',
+    addTag: 'Aggiungi tag',
+    editTag: 'Modifica tag',
+    manageTags: 'Gestisci Tag',
+    selectorPlaceholder: 'Scrivi per cercare o creare',
+    create: 'Crea',
+    delete: 'Elimina tag',
+    deleteTip: 'Il tag 猫 in uso, eliminarlo?',
+    created: 'Tag creato con successo',
+    failed: 'Creazione del tag fallita',
+  },
+  fileUploader: {
+    uploadFromComputer: 'Caricamento locale',
+    uploadFromComputerLimit: 'Il file di caricamento non pu貌 superare {{size}}',
+    pasteFileLinkInvalid: 'Collegamento file non valido',
+    fileExtensionNotSupport: 'Estensione del file non supportata',
+    pasteFileLinkInputPlaceholder: 'Inserisci l\'URL...',
+    uploadFromComputerUploadError: 'Caricamento del file non riuscito, carica di nuovo.',
+    pasteFileLink: 'Incolla il collegamento del file',
+    uploadFromComputerReadError: 'Lettura del file non riuscita, riprovare.',
+  },
+  license: {
+    expiring_plural: 'Scadenza tra {{count}} giorni',
+    expiring: 'Scadenza in un giorno',
+  },
+  pagination: {
+    perPage: 'Articoli per pagina',
+  },
+  theme: {
+    light: 'luce',
+    auto: 'sistema',
+    dark: 'scuro',
+    theme: 'Tema',
+  },
+  compliance: {
+    gdpr: 'GDPR DPA',
+    professionalUpgradeTooltip: 'Disponibile solo con un piano Team o superiore.',
+    sandboxUpgradeTooltip: 'Disponibile solo con un piano Professionale o Team.',
+    soc2Type2: 'Rapporto SOC 2 di Tipo II',
+    iso27001: 'Certificazione ISO 27001:2022',
+    soc2Type1: 'Rapporto SOC 2 Tipo I',
+  },
+  imageInput: {
+    supportedFormats: 'Supporta PNG, JPG, JPEG, WEBP e GIF',
+    browse: 'sfogliare',
+    dropImageHere: 'Trascina la tua immagine qui, oppure',
+  },
+}
+
+export default translation
diff --git a/i18n/it-IT/custom.ts b/i18n/it-IT/custom.ts
new file mode 100644
index 0000000..b837696
--- /dev/null
+++ b/i18n/it-IT/custom.ts
@@ -0,0 +1,33 @@
+const translation = {
+  custom: 'Personalizzazione',
+  upgradeTip: {
+    prefix: 'Aggiorna il tuo piano per',
+    suffix: 'personalizzare il tuo marchio.',
+    title: 'Aggiorna il tuo piano',
+    des: 'Aggiorna il tuo piano per personalizzare il tuo marchio',
+  },
+  webapp: {
+    title: 'Personalizza il marchio WebApp',
+    removeBrand: 'Rimuovi Powered by Dify',
+    changeLogo: 'Cambia immagine del marchio Powered by',
+    changeLogoTip: 'Formato SVG o PNG con una dimensione minima di 40x40px',
+  },
+  app: {
+    title: 'Personalizza l\'intestazione del marchio dell\'app',
+    changeLogoTip: 'Formato SVG o PNG con una dimensione minima di 80x80px',
+  },
+  upload: 'Carica',
+  uploading: 'Caricamento in corso',
+  uploadedFail: 'Caricamento dell\'immagine fallito, per favore ricarica.',
+  change: 'Cambia',
+  apply: 'Applica',
+  restore: 'Ripristina Impostazioni Predefinite',
+  customize: {
+    contactUs: ' contattaci ',
+    prefix:
+      'Per personalizzare il logo del marchio all\'interno dell\'app, per favore',
+    suffix: 'per aggiornare alla versione Enterprise.',
+  },
+}
+
+export default translation
diff --git a/i18n/it-IT/dataset-creation.ts b/i18n/it-IT/dataset-creation.ts
new file mode 100644
index 0000000..ec9b5e3
--- /dev/null
+++ b/i18n/it-IT/dataset-creation.ts
@@ -0,0 +1,241 @@
+const translation = {
+  steps: {
+    header: {
+      creation: 'Crea Conoscenza',
+      update: 'Aggiungi dati',
+      fallbackRoute: 'Conoscenza',
+    },
+    one: 'Scegli fonte dati',
+    two: 'Preprocessamento e Pulizia del Testo',
+    three: 'Esegui e termina',
+  },
+  error: {
+    unavailable: 'Questa Conoscenza non 猫 disponibile',
+  },
+  firecrawl: {
+    configFirecrawl: 'Configura 馃敟Firecrawl',
+    apiKeyPlaceholder: 'Chiave API da firecrawl.dev',
+    getApiKeyLinkText: 'Ottieni la tua chiave API da firecrawl.dev',
+  },
+  stepOne: {
+    filePreview: 'Anteprima del File',
+    pagePreview: 'Anteprima della Pagina',
+    dataSourceType: {
+      file: 'Importa da file',
+      notion: 'Sincronizza da Notion',
+      web: 'Sincronizza da sito web',
+    },
+    uploader: {
+      title: 'Carica file',
+      button: 'Trascina e rilascia file o cartelle, oppure',
+      browse: 'Sfoglia',
+      tip: 'Supporta {{supportTypes}}. Max {{size}}MB ciascuno.',
+      validation: {
+        typeError: 'Tipo di file non supportato',
+        size: 'File troppo grande. Il massimo 猫 {{size}}MB',
+        count: 'Pi霉 file non supportati',
+        filesNumber:
+          'Hai raggiunto il limite di caricamento batch di {{filesNumber}}.',
+      },
+      cancel: 'Annulla',
+      change: 'Cambia',
+      failed: 'Caricamento fallito',
+    },
+    notionSyncTitle: 'Notion non 猫 connesso',
+    notionSyncTip:
+      'Per sincronizzare con Notion, deve essere stabilita prima la connessione a Notion.',
+    connect: 'Vai a connettere',
+    button: 'Avanti',
+    emptyDatasetCreation: 'Voglio creare una Conoscenza vuota',
+    modal: {
+      title: 'Crea una Conoscenza vuota',
+      tip: 'Una Conoscenza vuota non conterr脿 documenti, e potrai caricare documenti in qualsiasi momento.',
+      input: 'Nome della Conoscenza',
+      placeholder: 'Per favore inserisci',
+      nameNotEmpty: 'Il nome non pu貌 essere vuoto',
+      nameLengthInvalid: 'Il nome deve essere tra 1 e 40 caratteri',
+      cancelButton: 'Annulla',
+      confirmButton: 'Crea',
+      failed: 'Creazione fallita',
+    },
+    website: {
+      fireCrawlNotConfigured: 'Firecrawl non 猫 configurato',
+      fireCrawlNotConfiguredDescription:
+        'Configura Firecrawl con la chiave API per usarlo.',
+      configure: 'Configura',
+      run: 'Esegui',
+      firecrawlTitle: 'Estrai contenuti web con 馃敟Firecrawl',
+      firecrawlDoc: 'Documenti Firecrawl',
+      firecrawlDocLink:
+        'https://docs.dify.ai/guides/knowledge-base/sync_from_website',
+      options: 'Opzioni',
+      crawlSubPage: 'Crawl sotto-pagine',
+      limit: 'Limite',
+      maxDepth: 'Profondit脿 massima',
+      excludePaths: 'Escludi percorsi',
+      includeOnlyPaths: 'Includi solo percorsi',
+      extractOnlyMainContent:
+        'Estrai solo il contenuto principale (senza intestazioni, nav, pi猫 di pagina, ecc.)',
+      exceptionErrorTitle:
+        'Si 猫 verificata un\'eccezione durante l\'esecuzione del lavoro Firecrawl:',
+      unknownError: 'Errore sconosciuto',
+      totalPageScraped: 'Pagine totali estratte:',
+      selectAll: 'Seleziona tutto',
+      resetAll: 'Reimposta tutto',
+      scrapTimeInfo: 'Estratte {{total}} pagine in totale in {{time}}s',
+      preview: 'Anteprima',
+      maxDepthTooltip:
+        'Profondit脿 massima da eseguire rispetto all\'URL inserito. La profondit脿 0 estrae solo la pagina dell\'URL inserito, la profondit脿 1 estrae l\'URL e tutto ci貌 che segue l\'URL inserito + uno /, e cos矛 via.',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      useSitemapTooltip: 'Segui la sitemap per eseguire la scansione del sito. In caso contrario, Jina Reader eseguir脿 la scansione in modo iterativo in base alla pertinenza della pagina, producendo meno pagine ma di qualit脿 superiore.',
+      jinaReaderNotConfigured: 'Jina Reader non 猫 configurato',
+      jinaReaderDoc: 'Scopri di pi霉 su Jina Reader',
+      jinaReaderTitle: 'Converti l\'intero sito in Markdown',
+      jinaReaderNotConfiguredDescription: 'Configura Jina Reader inserendo la tua chiave API gratuita per l\'accesso.',
+      useSitemap: 'Usa la mappa del sito',
+      chooseProvider: 'Seleziona un fornitore',
+      watercrawlDoc: 'Documentazione di Watercrawl',
+      waterCrawlNotConfiguredDescription: 'Configura Watercrawl con la chiave API per utilizzarlo.',
+      configureFirecrawl: 'Configura Firecrawl',
+      watercrawlTitle: 'Estrai contenuti web con Watercrawl',
+      configureJinaReader: 'Configura Jina Reader',
+      configureWatercrawl: 'Configura Watercrawl',
+      waterCrawlNotConfigured: 'Watercrawl non 猫 configurato',
+      watercrawlDocLink: 'https://docs.dify.ai/it/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+    },
+    cancel: 'Annulla',
+  },
+  stepTwo: {
+    segmentation: 'Impostazioni dei blocchi',
+    auto: 'Automatico',
+    autoDescription:
+      'Imposta automaticamente le regole dei blocchi e del preprocessamento. Gli utenti non familiari sono consigliati di selezionare questo.',
+    custom: 'Personalizzato',
+    customDescription:
+      'Personalizza le regole dei blocchi, la lunghezza dei blocchi e le regole di preprocessamento, ecc.',
+    separator: 'Identificatore di segmento',
+    separatorPlaceholder:
+      'Ad esempio, nuova linea (\\\\n) o separatore speciale (come `***`)',
+    maxLength: 'Lunghezza massima del blocco',
+    overlap: 'Sovrapposizione del blocco',
+    overlapTip:
+      'Impostare la sovrapposizione del blocco pu貌 mantenere la rilevanza semantica tra di loro, migliorando l\'effetto di recupero. Si consiglia di impostare il 10%-25% della dimensione massima del blocco.',
+    overlapCheck:
+      'la sovrapposizione del blocco non dovrebbe essere maggiore della lunghezza massima del blocco',
+    rules: 'Regole di preprocessamento del testo',
+    removeExtraSpaces: 'Sostituisci spazi, nuove linee e tab consecutivi',
+    removeUrlEmails: 'Elimina tutti gli URL e gli indirizzi email',
+    removeStopwords: 'Rimuovi parole vuote come `a`, `an`, `the`',
+    preview: 'Conferma & Anteprima',
+    reset: 'Reimposta',
+    indexMode: 'Modalit脿 indice',
+    qualified: 'Alta Qualit脿',
+    recommend: 'Consigliato',
+    qualifiedTip:
+      'Chiama l\'interfaccia di embedding di sistema predefinita per l\'elaborazione per fornire maggiore accuratezza quando gli utenti fanno query.',
+    warning:
+      'Per favore configura prima la chiave API del fornitore del modello.',
+    click: 'Vai alle impostazioni',
+    economical: 'Economico',
+    economicalTip:
+      'Usa motori vettoriali offline, indici di parole chiave, ecc. per ridurre l\'accuratezza senza spendere token',
+    QATitle: 'Segmentazione in formato Domanda & Risposta',
+    QATip: 'Abilitare questa opzione consumer脿 pi霉 token',
+    QALanguage: 'Segmenta usando',
+    estimateCost: 'Stima',
+    estimateSegment: 'Blocchi stimati',
+    segmentCount: 'blocchi',
+    calculating: 'Calcolo in corso...',
+    fileSource: 'Preprocessa documenti',
+    notionSource: 'Preprocessa pagine',
+    websiteSource: 'Preprocessa sito web',
+    other: 'e altri ',
+    fileUnit: ' file',
+    notionUnit: ' pagine',
+    webpageUnit: ' pagine',
+    previousStep: 'Passo precedente',
+    nextStep: 'Salva & Elabora',
+    save: 'Salva & Elabora',
+    cancel: 'Annulla',
+    sideTipTitle: 'Perch茅 segmentare e preprocessare?',
+    sideTipP1:
+      'Quando si elabora dati testuali, la segmentazione e la pulizia sono due passaggi di preprocessamento importanti.',
+    sideTipP2:
+      'La segmentazione divide il testo lungo in paragrafi cos矛 i modelli possono comprendere meglio. Questo migliora la qualit脿 e la rilevanza dei risultati del modello.',
+    sideTipP3:
+      'La pulizia rimuove caratteri e formati non necessari, rendendo la Conoscenza pi霉 pulita e facile da analizzare.',
+    sideTipP4:
+      'Una corretta segmentazione e pulizia migliorano le prestazioni del modello, fornendo risultati pi霉 accurati e preziosi.',
+    previewTitle: 'Anteprima',
+    previewTitleButton: 'Anteprima',
+    previewButton: 'Passaggio al formato Domanda & Risposta',
+    previewSwitchTipStart:
+      'L\'anteprima del blocco corrente 猫 in formato testo, il passaggio a un\'anteprima in formato domanda e risposta',
+    previewSwitchTipEnd: ' consumer脿 token aggiuntivi',
+    characters: 'caratteri',
+    indexSettingTip: 'Per cambiare il metodo di indicizzazione, vai alle ',
+    retrievalSettingTip: 'Per cambiare il metodo di indicizzazione, vai alle ',
+    datasetSettingLink: 'impostazioni della Conoscenza.',
+    separatorTip: 'Un delimitatore 猫 il carattere utilizzato per separare il testo. \\n\\n e \\n sono delimitatori comunemente usati per separare paragrafi e righe. In combinazione con le virgole (\\n\\n,\\n), i paragrafi verranno segmentati per righe quando superano la lunghezza massima del blocco. 脠 inoltre possibile utilizzare delimitatori speciali definiti dall\'utente (ad es. ***).',
+    maxLengthCheck: 'La lunghezza massima del blocco deve essere inferiore a {{limit}}',
+    useQALanguage: 'Blocco con il formato Q&A in',
+    previewChunkTip: 'Fai clic sul pulsante "Anteprima blocco" a sinistra per caricare l\'anteprima',
+    paragraph: 'Paragrafo',
+    childChunkForRetrieval: 'Child-chunk per il recupero',
+    general: 'Generale',
+    fullDoc: 'Documento completo',
+    previewChunkCount: '{{conteggio}} Blocchi stimati',
+    generalTip: 'Modalit脿 generale di suddivisione in blocchi del testo, i blocchi recuperati e richiamati sono gli stessi.',
+    parentChildChunkDelimiterTip: 'Un delimitatore 猫 il carattere utilizzato per separare il testo. \\n 猫 consigliato per dividere i blocchi principali in piccoli blocchi figlio. 脠 inoltre possibile utilizzare delimitatori speciali definiti dall\'utente.',
+    fullDocTip: 'L\'intero documento viene utilizzato come blocco principale e recuperato direttamente. Si prega di notare che per motivi di prestazioni, il testo che supera i 10000 token verr脿 automaticamente troncato.',
+    parentChild: 'Genitore-figlio',
+    qaSwitchHighQualityTipContent: 'Attualmente, solo il metodo dell\'indice di alta qualit脿 supporta la suddivisione in blocchi del formato Domande e risposte. Volete passare alla modalit脿 di alta qualit脿?',
+    parentChunkForContext: 'Parent-chunk per il contesto',
+    switch: 'Interruttore',
+    paragraphTip: 'Questa modalit脿 suddivide il testo in paragrafi in base ai delimitatori e alla lunghezza massima del blocco, utilizzando il testo diviso come blocco principale per il recupero.',
+    notAvailableForQA: 'Non disponibile per l\'indice Q&A',
+    parentChildTip: 'Quando si utilizza la modalit脿 genitore-figlio, il blocco figlio viene utilizzato per il recupero e il blocco padre viene utilizzato per il richiamo come contesto.',
+    highQualityTip: 'Una volta terminato l\'incorporamento in modalit脿 Alta qualit脿, il ripristino della modalit脿 Economica non 猫 disponibile.',
+    parentChildDelimiterTip: 'Un delimitatore 猫 il carattere utilizzato per separare il testo. \\n\\n 猫 consigliato per dividere il documento originale in blocchi principali di grandi dimensioni. 脠 inoltre possibile utilizzare delimitatori speciali definiti dall\'utente.',
+    previewChunk: 'Blocco di anteprima',
+    notAvailableForParentChild: 'Non disponibile per l\'indice padre-figlio',
+    qaSwitchHighQualityTipTitle: 'Il formato Domande e risposte richiede un metodo di indicizzazione di alta qualit脿',
+  },
+  stepThree: {
+    creationTitle: '馃帀 Conoscenza creata',
+    creationContent:
+      'Abbiamo automaticamente nominato la Conoscenza, puoi modificarla in qualsiasi momento',
+    label: 'Nome della Conoscenza',
+    additionTitle: '馃帀 Documento caricato',
+    additionP1: 'Il documento 猫 stato caricato nella Conoscenza',
+    additionP2: ', puoi trovarlo nella lista dei documenti della Conoscenza.',
+    stop: 'Ferma l\'elaborazione',
+    resume: 'Riprendi l\'elaborazione',
+    navTo: 'Vai al documento',
+    sideTipTitle: 'Cosa succede dopo',
+    sideTipContent:
+      'Dopo che il documento ha terminato l\'indicizzazione, la Conoscenza pu貌 essere integrata nell\'applicazione come contesto, puoi trovare l\'impostazione del contesto nella pagina di orchestrazione del prompt. Puoi anche crearla come un plugin di indicizzazione indipendente di ChatGPT per la pubblicazione.',
+    modelTitle: 'Sei sicuro di fermare l\'embedding?',
+    modelContent:
+      'Se hai bisogno di riprendere l\'elaborazione in seguito, continuerai da dove hai interrotto.',
+    modelButtonConfirm: 'Conferma',
+    modelButtonCancel: 'Annulla',
+  },
+  jinaReader: {
+    getApiKeyLinkText: 'Ottieni la tua chiave API gratuita su jina.ai',
+    apiKeyPlaceholder: 'Chiave API da jina.ai',
+    configJinaReader: 'Configura Jina Reader',
+  },
+  otherDataSource: {
+    learnMore: 'Ulteriori informazioni',
+    title: 'Connettersi ad altre origini dati?',
+    description: 'Attualmente, la knowledge base di Dify ha solo fonti di dati limitate. Contribuire con una fonte di dati alla knowledge base di Dify 猫 un modo fantastico per migliorare la flessibilit脿 e la potenza della piattaforma per tutti gli utenti. La nostra guida ai contributi ti aiuta a iniziare. Clicca sul link sottostante per saperne di pi霉.',
+  },
+  watercrawl: {
+    getApiKeyLinkText: 'Ottieni la tua chiave API da watercrawl.dev',
+    apiKeyPlaceholder: 'Chiave API da watercrawl.dev',
+    configWatercrawl: 'Configura Watercrawl',
+  },
+}
+
+export default translation
diff --git a/i18n/it-IT/dataset-documents.ts b/i18n/it-IT/dataset-documents.ts
new file mode 100644
index 0000000..b9afb1e
--- /dev/null
+++ b/i18n/it-IT/dataset-documents.ts
@@ -0,0 +1,397 @@
+const translation = {
+  list: {
+    title: 'Documenti',
+    desc: 'Tutti i file della Conoscenza sono mostrati qui, e l\'intera Conoscenza pu貌 essere collegata alle citazioni di Dify o indicizzata tramite il plugin di Chat.',
+    addFile: 'Aggiungi file',
+    addPages: 'Aggiungi Pagine',
+    addUrl: 'Aggiungi URL',
+    table: {
+      header: {
+        fileName: 'NOME FILE',
+        words: 'PAROLE',
+        hitCount: 'CONTEGGIO RECUPERI',
+        uploadTime: 'ORA DI CARICAMENTO',
+        status: 'STATO',
+        action: 'AZIONE',
+        chunkingMode: 'MODALIT脌 DI SUDDIVISIONE IN BLOCCHI',
+      },
+      rename: 'Rinomina',
+      name: 'Nome',
+    },
+    action: {
+      uploadFile: 'Carica nuovo file',
+      settings: 'Impostazioni segmenti',
+      addButton: 'Aggiungi blocco',
+      add: 'Aggiungi un blocco',
+      batchAdd: 'Aggiungi in batch',
+      archive: 'Archivia',
+      unarchive: 'Disarchivia',
+      delete: 'Elimina',
+      enableWarning: 'Il file archiviato non pu貌 essere abilitato',
+      sync: 'Sincronizza',
+    },
+    index: {
+      enable: 'Abilita',
+      disable: 'Disabilita',
+      all: 'Tutti',
+      enableTip: 'Il file pu貌 essere indicizzato',
+      disableTip: 'Il file non pu貌 essere indicizzato',
+    },
+    status: {
+      queuing: 'In coda',
+      indexing: 'Indicizzazione',
+      paused: 'In pausa',
+      error: 'Errore',
+      available: 'Disponibile',
+      enabled: 'Abilitato',
+      disabled: 'Disabilitato',
+      archived: 'Archiviato',
+    },
+    empty: {
+      title: 'Non ci sono ancora documenti',
+      upload: {
+        tip: 'Puoi caricare file, sincronizzare dal sito web o da app web come Notion, GitHub, ecc.',
+      },
+      sync: {
+        tip: 'Dify scaricher脿 periodicamente i file dal tuo Notion e completer脿 l\'elaborazione.',
+      },
+    },
+    delete: {
+      title: 'Sei sicuro di voler eliminare?',
+      content:
+        'Se hai bisogno di riprendere l\'elaborazione in seguito, continuerai da dove hai interrotto',
+    },
+    batchModal: {
+      title: 'Aggiungi blocchi in batch',
+      csvUploadTitle: 'Trascina e rilascia il tuo file CSV qui, o ',
+      browse: 'sfoglia',
+      tip: 'Il file CSV deve rispettare la seguente struttura:',
+      question: 'domanda',
+      answer: 'risposta',
+      contentTitle: 'contenuto del blocco',
+      content: 'contenuto',
+      template: 'Scarica qui il modello',
+      cancel: 'Annulla',
+      run: 'Esegui Batch',
+      runError: 'Esecuzione batch fallita',
+      processing: 'Elaborazione batch in corso',
+      completed: 'Importazione completata',
+      error: 'Errore di importazione',
+      ok: 'OK',
+    },
+    learnMore: 'Ulteriori informazioni',
+  },
+  metadata: {
+    title: 'Metadati',
+    desc: 'L\'etichettatura dei metadati per i documenti consente all\'IA di accedervi in modo tempestivo ed espone la fonte delle referenze per gli utenti.',
+    dateTimeFormat: 'MMMM D, YYYY hh:mm A',
+    docTypeSelectTitle: 'Per favore seleziona un tipo di documento',
+    docTypeChangeTitle: 'Cambia tipo di documento',
+    docTypeSelectWarning:
+      'Se il tipo di documento viene cambiato, i metadati attualmente compilati non saranno pi霉 conservati',
+    firstMetaAction: 'Andiamo',
+    placeholder: {
+      add: 'Aggiungi ',
+      select: 'Seleziona ',
+    },
+    source: {
+      upload_file: 'Carica File',
+      notion: 'Sincronizza da Notion',
+      github: 'Sincronizza da Github',
+    },
+    type: {
+      book: 'Libro',
+      webPage: 'Pagina Web',
+      paper: 'Documento',
+      socialMediaPost: 'Post sui Social Media',
+      personalDocument: 'Documento Personale',
+      businessDocument: 'Documento Aziendale',
+      IMChat: 'Chat IM',
+      wikipediaEntry: 'Voce Wikipedia',
+      notion: 'Sincronizza da Notion',
+      github: 'Sincronizza da Github',
+      technicalParameters: 'Parametri Tecnici',
+    },
+    field: {
+      processRule: {
+        processDoc: 'Elabora Documento',
+        segmentRule: 'Regola di Segmentazione',
+        segmentLength: 'Lunghezza dei Segmenti',
+        processClean: 'Pulizia del Testo',
+      },
+      book: {
+        title: 'Titolo',
+        language: 'Lingua',
+        author: 'Autore',
+        publisher: 'Editore',
+        publicationDate: 'Data di Pubblicazione',
+        ISBN: 'ISBN',
+        category: 'Categoria',
+      },
+      webPage: {
+        title: 'Titolo',
+        url: 'URL',
+        language: 'Lingua',
+        authorPublisher: 'Autore/Editore',
+        publishDate: 'Data di Pubblicazione',
+        topicKeywords: 'Argomenti/Parole Chiave',
+        description: 'Descrizione',
+      },
+      paper: {
+        title: 'Titolo',
+        language: 'Lingua',
+        author: 'Autore',
+        publishDate: 'Data di Pubblicazione',
+        journalConferenceName: 'Nome del Journal/Conferenza',
+        volumeIssuePage: 'Volume/Numero/Pagina',
+        DOI: 'DOI',
+        topicsKeywords: 'Argomenti/Parole Chiave',
+        abstract: 'Abstract',
+      },
+      socialMediaPost: {
+        platform: 'Piattaforma',
+        authorUsername: 'Autore/Username',
+        publishDate: 'Data di Pubblicazione',
+        postURL: 'URL del Post',
+        topicsTags: 'Argomenti/Tag',
+      },
+      personalDocument: {
+        title: 'Titolo',
+        author: 'Autore',
+        creationDate: 'Data di Creazione',
+        lastModifiedDate: 'Data di Ultima Modifica',
+        documentType: 'Tipo di Documento',
+        tagsCategory: 'Tag/Categoria',
+      },
+      businessDocument: {
+        title: 'Titolo',
+        author: 'Autore',
+        creationDate: 'Data di Creazione',
+        lastModifiedDate: 'Data di Ultima Modifica',
+        documentType: 'Tipo di Documento',
+        departmentTeam: 'Dipartimento/Team',
+      },
+      IMChat: {
+        chatPlatform: 'Piattaforma di Chat',
+        chatPartiesGroupName: 'Parti della Chat/Nome del Gruppo',
+        participants: 'Partecipanti',
+        startDate: 'Data di Inizio',
+        endDate: 'Data di Fine',
+        topicsKeywords: 'Argomenti/Parole Chiave',
+        fileType: 'Tipo di File',
+      },
+      wikipediaEntry: {
+        title: 'Titolo',
+        language: 'Lingua',
+        webpageURL: 'URL della Pagina Web',
+        editorContributor: 'Editore/Contributore',
+        lastEditDate: 'Data di Ultima Modifica',
+        summaryIntroduction: 'Sommario/Introduzione',
+      },
+      notion: {
+        title: 'Titolo',
+        language: 'Lingua',
+        author: 'Autore',
+        createdTime: 'Ora di Creazione',
+        lastModifiedTime: 'Ora di Ultima Modifica',
+        url: 'URL',
+        tag: 'Tag',
+        description: 'Descrizione',
+      },
+      github: {
+        repoName: 'Nome del Repo',
+        repoDesc: 'Descrizione del Repo',
+        repoOwner: 'Proprietario del Repo',
+        fileName: 'Nome del File',
+        filePath: 'Percorso del File',
+        programmingLang: 'Linguaggio di Programmazione',
+        url: 'URL',
+        license: 'Licenza',
+        lastCommitTime: 'Ora dell\'Ultimo Commit',
+        lastCommitAuthor: 'Autore dell\'Ultimo Commit',
+      },
+      originInfo: {
+        originalFilename: 'Nome file originale',
+        originalFileSize: 'Dimensione file originale',
+        uploadDate: 'Data di caricamento',
+        lastUpdateDate: 'Data di ultimo aggiornamento',
+        source: 'Fonte',
+      },
+      technicalParameters: {
+        segmentSpecification: 'Specifiche dei segmenti',
+        segmentLength: 'Lunghezza dei segmenti',
+        avgParagraphLength: 'Lunghezza media del paragrafo',
+        paragraphs: 'Paragrafi',
+        hitCount: 'Conteggio recuperi',
+        embeddingTime: 'Tempo di embedding',
+        embeddedSpend: 'Spesa di embedding',
+      },
+    },
+    languageMap: {
+      zh: 'Cinese',
+      en: 'Inglese',
+      es: 'Spagnolo',
+      fr: 'Francese',
+      de: 'Tedesco',
+      ja: 'Giapponese',
+      ko: 'Coreano',
+      ru: 'Russo',
+      ar: 'Arabo',
+      pt: 'Portoghese',
+      it: 'Italiano',
+      nl: 'Olandese',
+      pl: 'Polacco',
+      sv: 'Svedese',
+      tr: 'Turco',
+      he: 'Ebraico',
+      hi: 'Hindi',
+      da: 'Danese',
+      fi: 'Finlandese',
+      no: 'Norvegese',
+      hu: 'Ungherese',
+      el: 'Greco',
+      cs: 'Ceco',
+      th: 'Thailandese',
+      id: 'Indonesiano',
+    },
+    categoryMap: {
+      book: {
+        fiction: 'Narrativa',
+        biography: 'Biografia',
+        history: 'Storia',
+        science: 'Scienza',
+        technology: 'Tecnologia',
+        education: 'Educazione',
+        philosophy: 'Filosofia',
+        religion: 'Religione',
+        socialSciences: 'Scienze Sociali',
+        art: 'Arte',
+        travel: 'Viaggio',
+        health: 'Salute',
+        selfHelp: 'Auto-aiuto',
+        businessEconomics: 'Economia Aziendale',
+        cooking: 'Cucina',
+        childrenYoungAdults: 'Bambini e Giovani Adulti',
+        comicsGraphicNovels: 'Fumetti e Graphic Novels',
+        poetry: 'Poesia',
+        drama: 'Teatro',
+        other: 'Altro',
+      },
+      personalDoc: {
+        notes: 'Note',
+        blogDraft: 'Bozza di Blog',
+        diary: 'Diario',
+        researchReport: 'Rapporto di Ricerca',
+        bookExcerpt: 'Estratto di Libro',
+        schedule: 'Pianificazione',
+        list: 'Lista',
+        projectOverview: 'Panoramica del Progetto',
+        photoCollection: 'Collezione Fotografica',
+        creativeWriting: 'Scrittura Creativa',
+        codeSnippet: 'Frammento di Codice',
+        designDraft: 'Bozza di Design',
+        personalResume: 'Curriculum Vitae',
+        other: 'Altro',
+      },
+      businessDoc: {
+        meetingMinutes: 'Verbale della Riunione',
+        researchReport: 'Rapporto di Ricerca',
+        proposal: 'Proposta',
+        employeeHandbook: 'Manuale del Dipendente',
+        trainingMaterials: 'Materiali di Formazione',
+        requirementsDocument: 'Documento di Requisiti',
+        designDocument: 'Documento di Design',
+        productSpecification: 'Specifiche del Prodotto',
+        financialReport: 'Rapporto Finanziario',
+        marketAnalysis: 'Analisi di Mercato',
+        projectPlan: 'Piano di Progetto',
+        teamStructure: 'Struttura del Team',
+        policiesProcedures: 'Politiche e Procedure',
+        contractsAgreements: 'Contratti e Accordi',
+        emailCorrespondence: 'Corrispondenza Email',
+        other: 'Altro',
+      },
+    },
+  },
+  embedding: {
+    processing: 'Elaborazione embedding...',
+    paused: 'Embedding in pausa',
+    completed: 'Embedding completato',
+    error: 'Errore embedding',
+    docName: 'Elaborazione documento',
+    mode: 'Regola di segmentazione',
+    segmentLength: 'Lunghezza dei segmenti',
+    textCleaning: 'Pre-definizione e pulizia del testo',
+    segments: 'Paragrafi',
+    highQuality: 'Modalit脿 alta qualit脿',
+    economy: 'Modalit脿 economica',
+    estimate: 'Consumo stimato',
+    stop: 'Ferma elaborazione',
+    resume: 'Riprendi elaborazione',
+    automatic: 'Automatico',
+    custom: 'Personalizzato',
+    previewTip:
+      'L\'anteprima del paragrafo sar脿 disponibile dopo il completamento dell\'embedding',
+    childMaxTokens: 'Bambino',
+    pause: 'Pausa',
+    hierarchical: 'Genitore-figlio',
+    parentMaxTokens: 'Genitore',
+  },
+  segment: {
+    paragraphs: 'Paragrafi',
+    keywords: 'Parole Chiave',
+    addKeyWord: 'Aggiungi parola chiave',
+    keywordError: 'La lunghezza massima della parola chiave 猫 20',
+    characters: 'caratteri',
+    hitCount: 'Conteggio recuperi',
+    vectorHash: 'Hash del vettore: ',
+    questionPlaceholder: 'aggiungi domanda qui',
+    questionEmpty: 'La domanda non pu貌 essere vuota',
+    answerPlaceholder: 'aggiungi risposta qui',
+    answerEmpty: 'La risposta non pu貌 essere vuota',
+    contentPlaceholder: 'aggiungi contenuto qui',
+    contentEmpty: 'Il contenuto non pu貌 essere vuoto',
+    newTextSegment: 'Nuovo Segmento di Testo',
+    newQaSegment: 'Nuovo Segmento di Domanda & Risposta',
+    delete: 'Eliminare questo blocco?',
+    searchResults_zero: 'RISULTATO',
+    searchResults_other: 'RISULTATI',
+    newChunk: 'Nuovo blocco',
+    characters_one: 'carattere',
+    addChildChunk: 'Aggiungi blocco figlio',
+    addAnother: 'Aggiungi un altro',
+    parentChunks_one: 'BLOCCO PADRE',
+    regenerationConfirmMessage: 'La rigenerazione dei blocchi figlio sovrascriver脿 i blocchi figlio correnti, inclusi i blocchi modificati e i blocchi appena aggiunti. La rigenerazione non pu貌 essere annullata.',
+    regenerationSuccessTitle: 'Rigenerazione completata',
+    regeneratingTitle: 'Rigenerazione di blocchi figlio',
+    chunkAdded: '1 pezzo aggiunto',
+    empty: 'Nessun blocco trovato',
+    parentChunk: 'Blocco genitore',
+    edited: 'MODIFICATO',
+    characters_other: 'personaggi',
+    parentChunks_other: 'BLOCCHI PRINCIPALI',
+    chunk: 'Pezzo',
+    newChildChunk: 'Nuovo blocco figlio',
+    editChildChunk: 'Modifica blocco figlio',
+    addChunk: 'Aggiungi blocco',
+    childChunks_one: 'BLOCCO FIGLIO',
+    regenerationConfirmTitle: 'Si desidera rigenerare i blocchi figlio?',
+    chunks_other: 'BLOCCHI',
+    editedAt: 'A cura di',
+    collapseChunks: 'Comprimi blocchi',
+    clearFilter: 'Cancella filtro',
+    chunks_one: 'PEZZO',
+    editParentChunk: 'Modifica blocco padre',
+    expandChunks: 'Espandi blocchi',
+    chunkDetail: 'Dettaglio pezzo',
+    searchResults_one: 'RISULTATO',
+    regeneratingMessage: 'Questo potrebbe richiedere un momento, si prega di attendere...',
+    childChunk: 'Figlio-Chunk',
+    editChunk: 'Modifica blocco',
+    regenerationSuccessMessage: '脠 possibile chiudere questa finestra.',
+    childChunkAdded: '1 blocco figlio aggiunto',
+    childChunks_other: 'BLOCCHI FIGLIO',
+  },
+}
+
+export default translation
diff --git a/i18n/it-IT/dataset-hit-testing.ts b/i18n/it-IT/dataset-hit-testing.ts
new file mode 100644
index 0000000..95dd3d2
--- /dev/null
+++ b/i18n/it-IT/dataset-hit-testing.ts
@@ -0,0 +1,36 @@
+const translation = {
+  title: 'Test di Recupero',
+  desc: 'Testa l\'effetto di recupero della Conoscenza basato sul testo di query fornito.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  recents: 'Recenti',
+  table: {
+    header: {
+      source: 'Fonte',
+      text: 'Testo',
+      time: 'Ora',
+    },
+  },
+  input: {
+    title: 'Testo di origine',
+    placeholder:
+      'Per favore inserisci un testo, si consiglia una frase dichiarativa breve.',
+    countWarning: 'Fino a 200 caratteri.',
+    indexWarning: 'Solo Conoscenza di alta qualit脿.',
+    testing: 'Test in corso',
+  },
+  hit: {
+    title: 'PARAGRAFI RECUPERATI',
+    emptyTip: 'I risultati del Test di Recupero verranno mostrati qui',
+  },
+  noRecentTip: 'Nessun risultato di query recente qui',
+  viewChart: 'Visualizza GRAFICO VETTORIALE',
+  settingTitle: 'Impostazione di recupero',
+  viewDetail: 'vedi dettagli',
+  chunkDetail: 'Dettaglio pezzo',
+  hitChunks: 'Premi {{num}} blocchi figlio',
+  open: 'Aperto',
+  keyword: 'Parole chiavi',
+  records: 'Archivio',
+}
+
+export default translation
diff --git a/i18n/it-IT/dataset-settings.ts b/i18n/it-IT/dataset-settings.ts
new file mode 100644
index 0000000..a03bfbc
--- /dev/null
+++ b/i18n/it-IT/dataset-settings.ts
@@ -0,0 +1,48 @@
+const translation = {
+  title: 'Impostazioni della Conoscenza',
+  desc: 'Qui puoi modificare le propriet脿 e i metodi di funzionamento della Conoscenza.',
+  form: {
+    name: 'Nome della Conoscenza',
+    namePlaceholder: 'Per favore inserisci il nome della Conoscenza',
+    nameError: 'Il nome non pu貌 essere vuoto',
+    desc: 'Descrizione della Conoscenza',
+    descInfo:
+      'Per favore scrivi una descrizione chiara per delineare il contenuto della Conoscenza. Questa descrizione sar脿 utilizzata come base per la corrispondenza quando si seleziona tra pi霉 Conoscenze per l\'inferenza.',
+    descPlaceholder:
+      'Descrivi cosa c\'猫 in questa Conoscenza. Una descrizione dettagliata permette all\'IA di accedere al contenuto della Conoscenza in modo tempestivo. Se vuota, Dify utilizzer脿 la strategia di recupero predefinita.',
+    descWrite: 'Scopri come scrivere una buona descrizione della Conoscenza.',
+    permissions: 'Permessi',
+    permissionsOnlyMe: 'Solo io',
+    permissionsAllMember: 'Tutti i membri del team',
+    permissionsInvitedMembers: 'Membri del team parziali',
+    me: '(Tu)',
+    indexMethod: 'Metodo di Indicizzazione',
+    indexMethodHighQuality: 'Alta Qualit脿',
+    indexMethodHighQualityTip:
+      'Chiama il modello di Embedding per l\'elaborazione per fornire maggiore accuratezza quando gli utenti fanno query.',
+    indexMethodEconomy: 'Economico',
+    indexMethodEconomyTip:
+      'Usa motori vettoriali offline, indici di parole chiave, ecc. per ridurre l\'accuratezza senza spendere token',
+    embeddingModel: 'Modello di Embedding',
+    embeddingModelTip: 'Per cambiare il modello di embedding, vai alle ',
+    embeddingModelTipLink: 'Impostazioni',
+    retrievalSetting: {
+      title: 'Impostazione di Recupero',
+      learnMore: 'Scopri di pi霉',
+      description: ' sul metodo di recupero.',
+      longDescription:
+        ' sul metodo di recupero, puoi cambiare questo in qualsiasi momento nelle impostazioni della Conoscenza.',
+      method: 'Metodo di recupero',
+    },
+    save: 'Salva',
+    retrievalSettings: 'Impostazioni di recupero',
+    externalKnowledgeID: 'ID conoscenza esterna',
+    externalKnowledgeAPI: 'API di conoscenza esterna',
+    helpText: 'Scopri come scrivere una buona descrizione del set di dati.',
+    upgradeHighQualityTip: 'Una volta effettuato l\'aggiornamento alla modalit脿 Alta qualit脿, il ripristino della modalit脿 Risparmio non 猫 disponibile',
+    indexMethodChangeToEconomyDisabledTip: 'Non disponibile per il downgrade da HQ a ECO',
+    searchModel: 'Cerca modello',
+  },
+}
+
+export default translation
diff --git a/i18n/it-IT/dataset.ts b/i18n/it-IT/dataset.ts
new file mode 100644
index 0000000..c2c4963
--- /dev/null
+++ b/i18n/it-IT/dataset.ts
@@ -0,0 +1,227 @@
+const translation = {
+  knowledge: 'Conoscenza',
+  documentCount: ' documenti',
+  wordCount: ' k parole',
+  appCount: ' app collegate',
+  createDataset: 'Crea Conoscenza',
+  createDatasetIntro:
+    'Importa i tuoi dati testuali o scrivi dati in tempo reale tramite Webhook per migliorare il contesto LLM.',
+  deleteDatasetConfirmTitle: 'Eliminare questa Conoscenza?',
+  deleteDatasetConfirmContent:
+    'L\'eliminazione della Conoscenza 猫 irreversibile. Gli utenti non potranno pi霉 accedere alla tua Conoscenza e tutte le configurazioni dei prompt e i log verranno eliminati permanentemente.',
+  datasetUsedByApp:
+    'La Conoscenza 猫 utilizzata da alcune app. Le app non potranno pi霉 utilizzare questa Conoscenza e tutte le configurazioni dei prompt e i log verranno eliminati permanentemente.',
+  datasetDeleted: 'Conoscenza eliminata',
+  datasetDeleteFailed: 'Eliminazione della Conoscenza fallita',
+  didYouKnow: 'Lo sapevi?',
+  intro1: 'La Conoscenza pu貌 essere integrata nell\'applicazione Dify ',
+  intro2: 'come un contesto',
+  intro3: ',',
+  intro4: 'oppure ',
+  intro5: 'pu貌 essere creata',
+  intro6: ' come un plug-in di indicizzazione ChatGPT autonomo da pubblicare',
+  unavailable: 'Non disponibile',
+  unavailableTip:
+    'Il modello di embedding non 猫 disponibile, 猫 necessario configurare il modello di embedding predefinito',
+  datasets: 'CONOSCENZA',
+  datasetsApi: 'ACCESSO API',
+  retrieval: {
+    semantic_search: {
+      title: 'Ricerca Vettoriale',
+      description:
+        'Genera embedding delle query e cerca il blocco di testo pi霉 simile alla sua rappresentazione vettoriale.',
+    },
+    full_text_search: {
+      title: 'Ricerca Full-Text',
+      description:
+        'Indicizza tutti i termini nel documento, consentendo agli utenti di cercare qualsiasi termine e recuperare il blocco di testo rilevante contenente quei termini.',
+    },
+    hybrid_search: {
+      title: 'Ricerca Ibrida',
+      description:
+        'Esegui contemporaneamente la ricerca full-text e la ricerca vettoriale, riordina per selezionare la migliore corrispondenza per la query dell\'utente. 脠 necessaria la configurazione delle API del modello Rerank.',
+      recommend: 'Consigliato',
+    },
+    invertedIndex: {
+      title: 'Indice Invertito',
+      description:
+        'L\'Indice Invertito 猫 una struttura utilizzata per il recupero efficiente. Organizzato per termini, ogni termine punta ai documenti o alle pagine web che lo contengono.',
+    },
+    change: 'Cambia',
+    changeRetrievalMethod: 'Cambia metodo di recupero',
+  },
+  docsFailedNotice: 'documenti non riusciti a essere indicizzati',
+  retry: 'Riprova',
+  indexingTechnique: {
+    high_quality: 'AQ',
+    economy: 'ECO',
+  },
+  indexingMethod: {
+    semantic_search: 'VETTORE',
+    full_text_search: 'TESTO COMPLETO',
+    hybrid_search: 'IBRIDO',
+    invertedIndex: 'INVERTITO',
+  },
+  mixtureHighQualityAndEconomicTip: 'Il modello di riclassificazione 猫 necessario per la miscela di basi di conoscenza di alta qualit脿 ed economiche.',
+  inconsistentEmbeddingModelTip: 'Il modello di riclassificazione 猫 necessario se i modelli di embedding delle basi di conoscenza selezionate sono incoerenti.',
+  retrievalSettings: 'Impostazioni di recupero',
+  rerankSettings: 'Impostazioni di riclassificazione',
+  weightedScore: {
+    title: 'Punteggio ponderato',
+    description: 'Regolando i pesi assegnati, questa strategia di riclassificazione determina se dare priorit脿 alla corrispondenza semantica o per parole chiave.',
+    semanticFirst: 'Semantica prima',
+    keywordFirst: 'Parola chiave prima',
+    customized: 'Personalizzato',
+    semantic: 'Semantico',
+    keyword: 'Parola chiave',
+  },
+  nTo1RetrievalLegacy: 'Il recupero N-a-1 sar脿 ufficialmente deprecato da settembre. Si consiglia di utilizzare il pi霉 recente recupero multi-percorso per ottenere risultati migliori.',
+  nTo1RetrievalLegacyLink: 'Scopri di pi霉',
+  nTo1RetrievalLegacyLinkText: 'Il recupero N-a-1 sar脿 ufficialmente deprecato a settembre.',
+  defaultRetrievalTip: 'Per impostazione predefinita, il recupero a percorsi multipli viene utilizzato. Le informazioni vengono recuperate da pi霉 knowledge base e quindi riclassificate.',
+  editExternalAPIConfirmWarningContent: {
+    end: 'conoscenza esterna, e questa modifica sar脿 applicata a tutti loro. Sei sicuro di voler salvare questa modifica?',
+    front: 'Questa API della conoscenza esterna 猫 collegata a',
+  },
+  editExternalAPIFormWarning: {
+    end: 'Conoscenze esterne',
+    front: 'Questa API esterna 猫 collegata a',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: 'Cancellare',
+      end: '?',
+    },
+    content: {
+      end: 'conoscenze esterne. L\'eliminazione di questa API invalider脿 tutte. Si 猫 certi di voler eliminare questa API?',
+      front: 'Questa API della conoscenza esterna 猫 collegata a',
+    },
+    noConnectionContent: 'Sei sicuro di eliminare questa API?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: 'Scegliere un\'API di conoscenza esterna',
+  },
+  connectDatasetIntro: {
+    content: {
+      front: 'Per connettersi a una knowledge base esterna, 猫 necessario prima creare un\'API esterna. Si prega di leggere attentamente e fare riferimento a',
+      end: '. Quindi trova l\'ID conoscenza corrispondente e compilalo nel modulo a sinistra. Se tutte le informazioni sono corrette, passer脿 automaticamente al test di recupero nella knowledge base dopo aver fatto clic sul pulsante di connessione.',
+      link: 'Scopri come creare un\'API esterna',
+    },
+    title: 'Come connettersi a una Knowledge Base esterna',
+    learnMore: 'Ulteriori informazioni',
+  },
+  connectHelper: {
+    helper2: '脠 supportata solo la funzionalit脿 di recupero',
+    helper4: 'Leggi la documentazione della Guida',
+    helper3: '. Ti consigliamo vivamente di',
+    helper1: 'Connettiti a knowledge base esterne tramite API e ID knowledge base. Attualmente,',
+    helper5: 'prima di utilizzare questa funzione.',
+  },
+  externalKnowledgeForm: {
+    cancel: 'Annulla',
+    connect: 'Connettersi',
+  },
+  externalAPIForm: {
+    encrypted: {
+      end: 'Tecnologia.',
+      front: 'Il tuo token API verr脿 crittografato e archiviato utilizzando',
+    },
+    apiKey: 'Chiave API',
+    name: 'Nome',
+    cancel: 'Annulla',
+    edit: 'Redigere',
+    save: 'Salvare',
+    endpoint: 'API Endpoint',
+  },
+  externalAPIPanelDescription: 'L\'API di conoscenza esterna viene utilizzata per connettersi a una knowledge base esterna a Dify e recuperare le informazioni da tale knowledge base.',
+  createExternalAPI: 'Aggiungere un\'API di conoscenza esterna',
+  learnHowToWriteGoodKnowledgeDescription: 'Impara a scrivere una buona descrizione della conoscenza',
+  externalKnowledgeName: 'Nome della conoscenza esterna',
+  externalAPIPanelTitle: 'API di conoscenza esterna',
+  externalAPI: 'API esterna',
+  createNewExternalAPI: 'Creare una nuova API della conoscenza esterna',
+  editExternalAPIFormTitle: 'Modificare l\'API della conoscenza esterna',
+  externalKnowledgeId: 'ID conoscenza esterna',
+  externalKnowledgeIdPlaceholder: 'Inserisci l\'ID conoscenza',
+  externalAPIPanelDocumentation: 'Scopri come creare un\'API della Knowledge Base esterna',
+  connectDataset: 'Connettiti a una Knowledge Base esterna',
+  mixtureInternalAndExternalTip: 'Il modello Rerank 猫 necessario per la combinazione di conoscenze interne ed esterne.',
+  editExternalAPITooltipTitle: 'CONOSCENZA COLLEGATA',
+  externalTag: 'Esterno',
+  externalKnowledgeNamePlaceholder: 'Inserisci il nome della knowledge base',
+  externalKnowledgeDescription: 'Descrizione della conoscenza',
+  allExternalTip: 'Quando si utilizzano solo conoscenze esterne, l\'utente pu貌 scegliere se abilitare il modello Rerank. Se non 猫 abilitato, i blocchi recuperati verranno ordinati in base ai punteggi. Quando le strategie di recupero di diverse basi di conoscenza sono incoerenti, saranno imprecise.',
+  externalKnowledgeDescriptionPlaceholder: 'Descrivi cosa c\'猫 in questa Knowledge Base (facoltativo)',
+  noExternalKnowledge: 'Non esiste ancora un\'API di conoscenza esterna, fai clic qui per creare',
+  chunkingMode: {
+    general: 'Generale',
+    parentChild: 'Genitore-figlio',
+  },
+  parentMode: {
+    paragraph: 'Paragrafo',
+    fullDoc: 'Full-doc',
+  },
+  batchAction: {
+    archive: 'Archivio',
+    enable: 'Abilitare',
+    cancel: 'Annulla',
+    selected: 'Selezionato',
+    disable: 'Disabilitare',
+    delete: 'Cancellare',
+  },
+  preprocessDocument: '{{num}} Pre-elaborazione dei documenti',
+  enable: 'Abilitare',
+  documentsDisabled: '{{num}} documenti disabilitati - inattivi da oltre 30 giorni',
+  localDocs: 'Documenti locali',
+  allKnowledge: 'Tutta la conoscenza',
+  allKnowledgeDescription: 'Selezionare questa opzione per visualizzare tutte le informazioni in questa area di lavoro. Solo il proprietario dell\'area di lavoro pu貌 gestire tutte le conoscenze.',
+  metadata: {
+    createMetadata: {
+      title: 'Nuovi Metadati',
+      back: 'Indietro',
+      type: 'Tipo',
+      name: 'Nome',
+      namePlaceholder: 'Aggiungi nome dei metadati',
+    },
+    checkName: {
+      invalid: 'Il nome dei metadati pu貌 contenere solo lettere minuscole, numeri e underscore e deve iniziare con una lettera minuscola.',
+      empty: 'Il nome dei metadati non pu貌 essere vuoto',
+    },
+    batchEditMetadata: {
+      multipleValue: 'Valore Multiplo',
+      editDocumentsNum: 'Modifica {{num}} documenti',
+      applyToAllSelectDocument: 'Applica a tutti i documenti selezionati',
+      editMetadata: 'Modifica metadati',
+      applyToAllSelectDocumentTip: 'Creare automaticamente tutti i metadati modificati e nuovi sopra menzionati per tutti i documenti selezionati, altrimenti la modifica dei metadati si applicher脿 solo ai documenti che li possiedono.',
+    },
+    selectMetadata: {
+      search: 'Cerca metadati',
+      newAction: 'Nuovi Metadati',
+      manageAction: 'Gestire',
+    },
+    datasetMetadata: {
+      deleteTitle: 'Conferma per eliminare',
+      name: 'Nome',
+      addMetaData: 'Aggiungi metadata',
+      values: '{{num}} Valori',
+      disabled: 'Disabilitato',
+      rename: 'Rinomina',
+      namePlaceholder: 'Nome dei metadati',
+      deleteContent: 'Sei sicuro di voler eliminare i metadati "{{name}}"?',
+      builtInDescription: 'I metadati incorporati vengono estratti e generati automaticamente. Devono essere abilitati prima dell\'uso e non possono essere modificati.',
+      description: 'Puoi gestire tutti i metadati in questa conoscenza qui. Le modifiche saranno sincronizzate con ogni documento.',
+    },
+    documentMetadata: {
+      documentInformation: 'Informazioni sul documento',
+      technicalParameters: 'Parametri tecnici',
+      startLabeling: 'Inizia a etichettare',
+      metadataToolTip: 'I metadati fungono da filtro critico che migliora l\'accuratezza e la rilevanza del recupero delle informazioni. Puoi modificare e aggiungere metadati per questo documento qui.',
+    },
+    addMetadata: 'Aggiungi metadata',
+    metadata: 'Metadata',
+    chooseTime: 'Scegli un orario...',
+  },
+  embeddingModelNotAvailable: 'Il modello di embedding non 猫 disponibile.',
+}
+
+export default translation
diff --git a/i18n/it-IT/education.ts b/i18n/it-IT/education.ts
new file mode 100644
index 0000000..1abb222
--- /dev/null
+++ b/i18n/it-IT/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    coupon: 'coupon esclusivo al 100%',
+    end: 'per il Piano Professionale Dify.',
+    front: 'Ora sei idoneo per lo stato di Educazione Verificata. Per favore, inserisci le tue informazioni educative qui sotto per completare il processo e ricevere un',
+  },
+  form: {
+    schoolName: {
+      title: 'Il Nome della tua Scuola',
+      placeholder: 'Inserisci il nome ufficiale e completo della tua scuola',
+    },
+    schoolRole: {
+      option: {
+        teacher: 'Insegnante',
+        student: 'Studente',
+        administrator: 'Amministratore scolastico',
+      },
+      title: 'Il tuo ruolo scolastico',
+    },
+    terms: {
+      desc: {
+        and: 'e',
+        privacyPolicy: 'Informativa sulla privacy',
+        end: '. Inviando:',
+        front: 'Le tue informazioni e l\'uso dello stato di Educazione Verificato sono soggetti a nostri',
+        termsOfService: 'Termini di servizio',
+      },
+      option: {
+        inSchool: 'Confermo di essere iscritto o impiegato presso l\'istituzione fornita. Dify pu貌 richiedere una prova di iscrizione/impegno. Se rappresento erroneamente la mia idoneit脿, accetto di pagare eventuali tasse inizialmente esonerate in base al mio stato di istruzione.',
+        age: 'Confermo di avere almeno 18 anni',
+      },
+      title: 'Termini e Accordi',
+    },
+  },
+  toVerified: 'Fai verificare la tua istruzione',
+  successTitle: 'Hai ottenuto l\'istruzione Dify verificata',
+  submitError: 'Invio del modulo non riuscito. Per favore riprova pi霉 tardi.',
+  submit: 'Invia',
+  currentSigned: 'ATTUALMENTE ACCEDUTO COME',
+  successContent: 'Abbiamo emesso un coupon sconto del 100% per il piano Dify Professionale sul tuo account. Il coupon 猫 valido per un anno, ti preghiamo di utilizzarlo entro il periodo di validit脿.',
+  learn: 'Scopri come far verificare la tua istruzione',
+  emailLabel: 'La tua email attuale',
+  rejectContent: 'Sfortunatamente, non sei idoneo per lo status di Educazione Verificata e quindi non puoi ricevere il coupon esclusivo del 100% per il Piano Professionale Dify se usi questo indirizzo email.',
+  rejectTitle: 'La tua verifica educativa Dify 猫 stata rifiutata.',
+}
+
+export default translation
diff --git a/i18n/it-IT/explore.ts b/i18n/it-IT/explore.ts
new file mode 100644
index 0000000..d94df45
--- /dev/null
+++ b/i18n/it-IT/explore.ts
@@ -0,0 +1,45 @@
+const translation = {
+  title: 'Esplora',
+  sidebar: {
+    discovery: 'Scoperta',
+    chat: 'Chat',
+    workspace: 'Workspace',
+    action: {
+      pin: 'Fissa',
+      unpin: 'Sblocca',
+      rename: 'Rinomina',
+      delete: 'Elimina',
+    },
+    delete: {
+      title: 'Elimina app',
+      content: 'Sei sicuro di voler eliminare questa app?',
+    },
+  },
+  apps: {
+    title: 'Esplora App di Dify',
+    description:
+      'Usa queste app modello istantaneamente o personalizza le tue app basate sui modelli.',
+    allCategories: 'Consigliato',
+  },
+  appCard: {
+    addToWorkspace: 'Aggiungi a Workspace',
+    customize: 'Personalizza',
+  },
+  appCustomize: {
+    title: 'Crea app da {{name}}',
+    subTitle: 'Icona & nome dell\'app',
+    nameRequired: 'Il nome dell\'app 猫 obbligatorio',
+  },
+  category: {
+    Assistant: 'Assistente',
+    Writing: 'Scrittura',
+    Translate: 'Traduzione',
+    Programming: 'Programmazione',
+    HR: 'Risorse Umane',
+    Workflow: 'Flusso di lavoro',
+    Agent: 'Agente',
+    Entertainment: 'Intrattenimento',
+  },
+}
+
+export default translation
diff --git a/i18n/it-IT/layout.ts b/i18n/it-IT/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/it-IT/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/it-IT/login.ts b/i18n/it-IT/login.ts
new file mode 100644
index 0000000..3504242
--- /dev/null
+++ b/i18n/it-IT/login.ts
@@ -0,0 +1,120 @@
+const translation = {
+  pageTitle: 'Ehi, iniziamo!馃憢',
+  welcome: 'Benvenuto su Dify, per favore accedi per continuare.',
+  email: 'Indirizzo email',
+  emailPlaceholder: 'La tua email',
+  password: 'Password',
+  passwordPlaceholder: 'La tua password',
+  name: 'Nome utente',
+  namePlaceholder: 'Il tuo nome utente',
+  forget: 'Hai dimenticato la password?',
+  signBtn: 'Accedi',
+  sso: 'Continua con SSO',
+  installBtn: 'Configura',
+  setAdminAccount: 'Impostazione di un account amministratore',
+  setAdminAccountDesc:
+    'Privilegi massimi per l\'account amministratore, che pu貌 essere utilizzato per creare applicazioni e gestire i fornitori di LLM, ecc.',
+  createAndSignIn: 'Crea e accedi',
+  oneMoreStep: 'Un altro passo',
+  createSample:
+    'In base a queste informazioni, creeremo un\'applicazione di esempio per te',
+  invitationCode: 'Codice di invito',
+  invitationCodePlaceholder: 'Il tuo codice di invito',
+  interfaceLanguage: 'Lingua dell\'interfaccia',
+  timezone: 'Fuso orario',
+  go: 'Vai a Dify',
+  sendUsMail:
+    'Inviaci una email con la tua presentazione e gestiremo la richiesta di invito.',
+  acceptPP: 'Ho letto e accetto l\'informativa sulla privacy',
+  reset:
+    'Per favore esegui il seguente comando per reimpostare la tua password',
+  withGitHub: 'Continua con GitHub',
+  withGoogle: 'Continua con Google',
+  rightTitle: 'Sblocca tutto il potenziale di LLM',
+  rightDesc:
+    'Costruisci senza sforzo applicazioni AI visivamente accattivanti, operabili e migliorabili.',
+  tos: 'Termini di servizio',
+  pp: 'Informativa sulla privacy',
+  tosDesc: 'Iscrivendoti, accetti i nostri',
+  goToInit:
+    'Se non hai inizializzato l\'account, vai alla pagina di inizializzazione',
+  dontHave: 'Non hai?',
+  invalidInvitationCode: 'Codice di invito non valido',
+  accountAlreadyInited: 'Account gi脿 inizializzato',
+  forgotPassword: 'Hai dimenticato la password?',
+  resetLinkSent: 'Link per il reset inviato',
+  sendResetLink: 'Invia link per il reset',
+  backToSignIn: 'Torna al login',
+  forgotPasswordDesc:
+    'Per favore inserisci il tuo indirizzo email per reimpostare la tua password. Ti invieremo una email con le istruzioni su come reimpostare la tua password.',
+  checkEmailForResetLink:
+    'Per favore controlla la tua email per un link per reimpostare la password. Se non compare entro pochi minuti, assicurati di controllare la cartella spam.',
+  passwordChanged: 'Accedi ora',
+  changePassword: 'Cambia Password',
+  changePasswordTip:
+    'Per favore inserisci una nuova password per il tuo account',
+  invalidToken: 'Token non valido o scaduto',
+  confirmPassword: 'Conferma Password',
+  confirmPasswordPlaceholder: 'Conferma la tua nuova password',
+  passwordChangedTip: 'La tua password 猫 stata cambiata con successo',
+  error: {
+    emailEmpty: 'L\'indirizzo email 猫 obbligatorio',
+    emailInValid: 'Per favore inserisci un indirizzo email valido',
+    nameEmpty: 'Il nome 猫 obbligatorio',
+    passwordEmpty: 'La password 猫 obbligatoria',
+    passwordLengthInValid: 'La password deve essere di almeno 8 caratteri',
+    passwordInvalid:
+      'La password deve contenere lettere e numeri, e la lunghezza deve essere maggiore di 8',
+    registrationNotAllowed: 'Account non trovato. Si prega di contattare l\'amministratore di sistema per registrarsi.',
+  },
+  license: {
+    tip: 'Prima di avviare Dify Community Edition, leggi su GitHub',
+    link: 'Licenza open-source',
+  },
+  join: 'Unisciti',
+  joinTipStart: 'Invitato a unirti al',
+  joinTipEnd: 'team su Dify',
+  invalid: 'Il link 猫 scaduto',
+  explore: 'Esplora Dify',
+  activatedTipStart: 'Sei entrato nel team',
+  activatedTipEnd: '',
+  activated: 'Accedi ora',
+  adminInitPassword: 'Password di inizializzazione amministratore',
+  validate: 'Convalida',
+  checkCode: {
+    invalidCode: 'Codice non valido',
+    verificationCodePlaceholder: 'Inserisci il codice a 6 cifre',
+    verify: 'Verificare',
+    emptyCode: 'Il codice 猫 obbligatorio',
+    resend: 'Inviare',
+    verificationCode: 'Codice di verifica',
+    validTime: 'Tieni presente che il codice 猫 valido per 5 minuti',
+    didNotReceiveCode: 'Non hai ricevuto il codice?',
+    checkYourEmail: 'Controlla la tua email',
+    tips: 'Inviamo un codice di verifica a <strong>{{email}}</strong>',
+    useAnotherMethod: 'Usa un altro metodo',
+  },
+  or: 'O',
+  back: 'Indietro',
+  noLoginMethod: 'Metodo di autenticazione non configurato',
+  backToLogin: 'Torna al login',
+  changePasswordBtn: 'Imposta una password',
+  setYourAccount: 'Imposta il tuo account',
+  withSSO: 'Continua con SSO',
+  usePassword: 'Usa password',
+  resetPassword: 'Reimposta password',
+  continueWithCode: 'Continua con il codice',
+  sendVerificationCode: 'Invia codice di verifica',
+  useVerificationCode: 'Usa il codice di verifica',
+  resetPasswordDesc: 'Digita l\'e-mail che hai utilizzato per registrarti su Dify e ti invieremo un\'e-mail per reimpostare la password.',
+  noLoginMethodTip: 'Contatta l\'amministratore di sistema per aggiungere un metodo di autenticazione.',
+  enterYourName: 'Inserisci il tuo nome utente',
+  licenseLostTip: 'Impossibile connettersi al server licenze Dify. Contatta il tuo amministratore per continuare a utilizzare Dify.',
+  licenseExpired: 'Licenza scaduta',
+  licenseLost: 'Licenza persa',
+  licenseExpiredTip: 'La licenza Dify Enterprise per la tua area di lavoro 猫 scaduta. Contatta il tuo amministratore per continuare a utilizzare Dify.',
+  licenseInactiveTip: 'La licenza Dify Enterprise per la tua area di lavoro 猫 inattiva. Contatta il tuo amministratore per continuare a utilizzare Dify.',
+  licenseInactive: 'Licenza inattiva',
+}
+
+export default translation
diff --git a/i18n/it-IT/plugin-tags.ts b/i18n/it-IT/plugin-tags.ts
new file mode 100644
index 0000000..2732466
--- /dev/null
+++ b/i18n/it-IT/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    design: 'Disegno',
+    education: 'Educazione',
+    search: 'Ricerca',
+    entertainment: 'Divertimento',
+    agent: 'Agente',
+    image: 'Immagine',
+    weather: 'Tempo',
+    business: 'Azienda',
+    news: 'Notizie',
+    other: 'Altro',
+    travel: 'Viaggio',
+    medical: 'Medico',
+    utilities: 'Utilit脿',
+    videos: 'Video',
+    productivity: 'Produttivit脿',
+    finance: 'Finanza',
+    social: 'Sociale',
+  },
+  searchTags: 'Cerca Tag',
+  allTags: 'Tutti i tag',
+}
+
+export default translation
diff --git a/i18n/it-IT/plugin.ts b/i18n/it-IT/plugin.ts
new file mode 100644
index 0000000..2832776
--- /dev/null
+++ b/i18n/it-IT/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    extensions: 'Estensioni',
+    tools: 'Utensileria',
+    agents: 'Strategie degli agenti',
+    bundles: 'Pacchetti',
+    models: 'Modelli',
+    all: 'Tutto',
+  },
+  categorySingle: {
+    bundle: 'Fascio',
+    model: 'Modello',
+    agent: 'Strategia dell\'agente',
+    extension: 'Estensione',
+    tool: 'Strumento',
+  },
+  list: {
+    source: {
+      local: 'Installa dal file del pacchetto locale',
+      github: 'Installa da GitHub',
+      marketplace: 'Installa da Marketplace',
+    },
+    noInstalled: 'Nessun plug-in installato',
+    notFound: 'Nessun plugin trovato',
+  },
+  source: {
+    github: 'GitHub',
+    local: 'File del pacchetto locale',
+    marketplace: 'Mercato',
+  },
+  detailPanel: {
+    categoryTip: {
+      github: 'Installato da Github',
+      marketplace: 'Installato da Marketplace',
+      local: 'Plugin locale',
+      debugging: 'Plugin di debug',
+    },
+    operation: {
+      detail: 'Dettagli',
+      remove: 'Togliere',
+      update: 'Aggiornare',
+      install: 'Installare',
+      viewDetail: 'vedi dettagli',
+      checkUpdate: 'Controlla l\'aggiornamento',
+      info: 'Informazioni sul plugin',
+    },
+    toolSelector: {
+      paramsTip1: 'Controlla i parametri di inferenza LLM.',
+      descriptionPlaceholder: 'Breve descrizione dello scopo dell\'utensile, ad es. ottenere la temperatura per una posizione specifica.',
+      unsupportedTitle: 'Azione non supportata',
+      uninstalledTitle: 'Strumento non installato',
+      params: 'CONFIGURAZIONE DEL RAGIONAMENTO',
+      uninstalledContent: 'Questo plugin viene installato dal repository locale/GitHub. Si prega di utilizzare dopo l\'installazione.',
+      empty: 'Fare clic sul pulsante \'+\' per aggiungere strumenti. 脠 possibile aggiungere pi霉 strumenti.',
+      toolLabel: 'Strumento',
+      unsupportedContent2: 'Fare clic per cambiare versione.',
+      title: 'Aggiungi strumento',
+      settings: 'IMPOSTAZIONI UTENTE',
+      uninstalledLink: 'Gestisci nei plugin',
+      placeholder: 'Seleziona uno strumento...',
+      unsupportedContent: 'La versione del plug-in installata non fornisce questa azione.',
+      descriptionLabel: 'Descrizione dell\'utensile',
+      auto: 'Automatico',
+      paramsTip2: 'Quando \'Automatico\' 猫 disattivato, viene utilizzato il valore predefinito.',
+    },
+    modelNum: '{{num}} MODELLI INCLUSI',
+    endpointModalTitle: 'Endpoint di configurazione',
+    endpointsDocLink: 'Visualizza il documento',
+    endpointDisableTip: 'Disabilita endpoint',
+    switchVersion: 'Versione switch',
+    configureTool: 'Strumento di configurazione',
+    serviceOk: 'Servizio OK',
+    disabled: 'Disabile',
+    configureModel: 'Configura modello',
+    endpointModalDesc: 'Una volta configurate, 猫 possibile utilizzare le funzionalit脿 fornite dal plug-in tramite endpoint API.',
+    endpointDeleteContent: 'Vuoi rimuovere {{name}}?',
+    strategyNum: '{{num}} {{strategia}} INCLUSO',
+    endpoints: 'Endpoint',
+    configureApp: 'Configura l\'app',
+    endpointsTip: 'Questo plug-in fornisce funzionalit脿 specifiche tramite endpoint ed 猫 possibile configurare pi霉 set di endpoint per l\'area di lavoro corrente.',
+    endpointDisableContent: 'Vorresti disabilitare {{name}}?',
+    endpointDeleteTip: 'Rimuovi punto finale',
+    endpointsEmpty: 'Fare clic sul pulsante \'+\' per aggiungere un punto finale',
+    actionNum: '{{num}} {{azione}} INCLUSO',
+  },
+  debugInfo: {
+    title: 'Debug',
+    viewDocs: 'Visualizza documenti',
+  },
+  privilege: {
+    whoCanDebug: 'Chi pu貌 eseguire il debug dei plugin?',
+    admins: 'Amministratori',
+    title: 'Preferenze del plugin',
+    noone: 'Nessuno',
+    everyone: 'Ciascuno',
+    whoCanInstall: 'Chi pu貌 installare e gestire i plugin?',
+  },
+  pluginInfoModal: {
+    packageName: 'Pacco',
+    release: 'Rilascio',
+    repository: 'Deposito',
+    title: 'Informazioni sul plugin',
+  },
+  action: {
+    usedInApps: 'Questo plugin viene utilizzato nelle app {{num}}.',
+    delete: 'Rimuovi plugin',
+    pluginInfo: 'Informazioni sul plugin',
+    checkForUpdates: 'Controlla gli aggiornamenti',
+    deleteContentRight: 'plugin?',
+    deleteContentLeft: 'Vorresti rimuovere',
+  },
+  installModal: {
+    labels: {
+      version: 'Versione',
+      repository: 'Deposito',
+      package: 'Pacco',
+    },
+    next: 'Prossimo',
+    pluginLoadErrorDesc: 'Questo plugin non verr脿 installato',
+    installComplete: 'Installazione completata',
+    dropPluginToInstall: 'Rilascia qui il pacchetto del plug-in per installarlo',
+    installedSuccessfully: 'Installazione riuscita',
+    installedSuccessfullyDesc: 'Il plug-in 猫 stato installato correttamente.',
+    installPlugin: 'Installa il plugin',
+    fromTrustSource: 'Assicurati di installare i plug-in solo da una <trustSource>fonte attendibile</trustSource>.',
+    uploadFailed: 'Caricamento non riuscito',
+    uploadingPackage: 'Caricamento di {{packageName}}...',
+    pluginLoadError: 'Errore di caricamento del plugin',
+    cancel: 'Annulla',
+    readyToInstallPackage: 'Sto per installare il seguente plugin',
+    installFailed: 'Installazione non riuscita',
+    back: 'Indietro',
+    close: 'Chiudere',
+    installFailedDesc: 'Il plug-in 猫 stato installato non riuscito.',
+    readyToInstall: 'Sto per installare il seguente plugin',
+    installing: 'Installazione...',
+    install: 'Installare',
+    readyToInstallPackages: 'Sto per installare i seguenti plugin {{num}}',
+  },
+  installFromGitHub: {
+    installedSuccessfully: 'Installazione riuscita',
+    selectPackagePlaceholder: 'Seleziona un pacchetto',
+    installNote: 'Assicurati di installare i plug-in solo da una fonte attendibile.',
+    updatePlugin: 'Aggiorna il plugin da GitHub',
+    uploadFailed: 'Caricamento non riuscito',
+    gitHubRepo: 'Repository GitHub',
+    installPlugin: 'Installa il plugin da GitHub',
+    installFailed: 'Installazione non riuscita',
+    selectVersionPlaceholder: 'Seleziona una versione',
+    selectPackage: 'Seleziona il pacchetto',
+    selectVersion: 'Seleziona la versione',
+  },
+  upgrade: {
+    upgrade: 'Installare',
+    usedInApps: 'Utilizzato nelle app {{num}}',
+    title: 'Installa il plugin',
+    description: 'Sto per installare il seguente plugin',
+    upgrading: 'Installazione...',
+    successfulTitle: 'Installazione riuscita',
+    close: 'Chiudere',
+  },
+  error: {
+    fetchReleasesError: 'Impossibile recuperare le release. Riprova pi霉 tardi.',
+    noReleasesFound: 'Nessuna pubblicazione trovata. Controlla il repository GitHub o l\'URL di input.',
+    inValidGitHubUrl: 'URL GitHub non valido. Inserisci un URL valido nel formato: https://github.com/owner/repo',
+  },
+  marketplace: {
+    sortOption: {
+      recentlyUpdated: 'Aggiornato di recente',
+      firstReleased: 'Prima pubblicazione',
+      newlyReleased: 'Appena uscito',
+      mostPopular: 'I pi霉 popolari',
+    },
+    moreFrom: 'Altro da Marketplace',
+    difyMarketplace: 'Mercato Dify',
+    discover: 'Scoprire',
+    pluginsResult: '{{num}} risultati',
+    noPluginFound: 'Nessun plug-in trovato',
+    empower: 'Potenzia lo sviluppo dell\'intelligenza artificiale',
+    sortBy: 'Citt脿 nera',
+    and: 'e',
+    viewMore: 'Vedi di pi霉',
+    verifiedTip: 'Verificato da Dify',
+    partnerTip: 'Verificato da un partner Dify',
+  },
+  task: {
+    clearAll: 'Cancella tutto',
+    installError: 'Impossibile installare i plugin {{errorLength}}, clicca per visualizzare',
+    installing: 'Installazione dei plugin {{installingLength}}, 0 fatto.',
+    installedError: 'Impossibile installare i plugin di {{errorLength}}',
+    installingWithError: 'Installazione dei plugin {{installingLength}}, {{successLength}} successo, {{errorLength}} fallito',
+    installingWithSuccess: 'Installazione dei plugin {{installingLength}}, {{successLength}} successo.',
+  },
+  searchInMarketplace: 'Cerca nel Marketplace',
+  endpointsEnabled: '{{num}} set di endpoint abilitati',
+  from: 'Da',
+  installAction: 'Installare',
+  allCategories: 'Tutte le categorie',
+  fromMarketplace: 'Dal Marketplace',
+  searchTools: 'Strumenti di ricerca...',
+  searchCategories: 'Cerca Categorie',
+  install: '{{num}} installazioni',
+  findMoreInMarketplace: 'Scopri di pi霉 su Marketplace',
+  installPlugin: 'Installa il plugin',
+  submitPlugin: 'Invia plugin',
+  searchPlugins: 'Plugin di ricerca',
+  search: 'Ricerca',
+  installFrom: 'INSTALLA DA',
+  metadata: {
+    title: 'Plugin',
+  },
+  difyVersionNotCompatible: 'L\'attuale versione di Dify non 猫 compatibile con questo plugin, si prega di aggiornare alla versione minima richiesta: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/it-IT/register.ts b/i18n/it-IT/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/it-IT/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/it-IT/run-log.ts b/i18n/it-IT/run-log.ts
new file mode 100644
index 0000000..0627e5b
--- /dev/null
+++ b/i18n/it-IT/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: 'INPUT',
+  result: 'RISULTATO',
+  detail: 'DETTAGLIO',
+  tracing: 'TRACCIAMENTO',
+  resultPanel: {
+    status: 'STATO',
+    time: 'TEMPO TRASCORSO',
+    tokens: 'TOKEN TOTALI',
+  },
+  meta: {
+    title: 'METADATI',
+    status: 'Stato',
+    version: 'Versione',
+    executor: 'Esecutore',
+    startTime: 'Ora di Inizio',
+    time: 'Tempo Trascorso',
+    tokens: 'Token Totali',
+    steps: 'Fasi Eseguite',
+  },
+  resultEmpty: {
+    title: 'Questa esecuzione ha prodotto solo output in formato JSON,',
+    tipLeft: 'per favore vai al ',
+    link: 'pannello dei dettagli',
+    tipRight: ' per visualizzarlo.',
+  },
+  circularInvocationTip: 'C\'猫 una chiamata circolare di strumenti/nodi nel flusso di lavoro corrente.',
+  actionLogs: 'Registri delle azioni',
+}
+
+export default translation
diff --git a/i18n/it-IT/share-app.ts b/i18n/it-IT/share-app.ts
new file mode 100644
index 0000000..2e1c96a
--- /dev/null
+++ b/i18n/it-IT/share-app.ts
@@ -0,0 +1,84 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: 'L\'app non 猫 disponibile',
+    appUnknownError: 'L\'app non 猫 disponibile',
+  },
+  chat: {
+    newChat: 'Nuova chat',
+    pinnedTitle: 'Fissati',
+    unpinnedTitle: 'Chat',
+    newChatDefaultName: 'Nuova conversazione',
+    resetChat: 'Reimposta conversazione',
+    poweredBy: 'Powered by',
+    prompt: 'Prompt',
+    privatePromptConfigTitle: 'Impostazioni conversazione',
+    publicPromptConfigTitle: 'Prompt iniziale',
+    configStatusDes:
+      'Prima di iniziare, puoi modificare le impostazioni della conversazione',
+    configDisabled:
+      'Le impostazioni della sessione precedente sono state utilizzate per questa sessione.',
+    startChat: 'Inizia Chat',
+    privacyPolicyLeft: 'Per favore leggi la ',
+    privacyPolicyMiddle: 'politica sulla privacy',
+    privacyPolicyRight: ' fornita dallo sviluppatore dell\'app.',
+    deleteConversation: {
+      title: 'Elimina conversazione',
+      content: 'Sei sicuro di voler eliminare questa conversazione?',
+    },
+    tryToSolve: 'Prova a risolvere',
+    temporarySystemIssue: 'Spiacente, problema temporaneo del sistema.',
+    expand: 'Espandi',
+    collapse: 'Riduci',
+    newChatTip: 'Gi脿 in una nuova chat',
+    chatSettingsTitle: 'Nuova configurazione della chat',
+    chatFormTip: 'Le impostazioni della chat non possono essere modificate dopo che la chat 猫 iniziata.',
+    viewChatSettings: 'Visualizza le impostazioni della chat',
+  },
+  generation: {
+    tabs: {
+      create: 'Esegui una volta',
+      batch: 'Esegui batch',
+      saved: 'Salvato',
+    },
+    savedNoData: {
+      title: 'Non hai ancora salvato un risultato!',
+      description:
+        'Inizia a generare contenuti e trova i tuoi risultati salvati qui.',
+      startCreateContent: 'Inizia a creare contenuti',
+    },
+    title: 'Completamento AI',
+    queryTitle: 'Contenuto della query',
+    completionResult: 'Risultato del completamento',
+    queryPlaceholder: 'Scrivi il contenuto della tua query...',
+    run: 'Esegui',
+    copy: 'Copia',
+    resultTitle: 'Completamento AI',
+    noData: 'L\'AI ti dar脿 ci貌 che desideri qui.',
+    csvUploadTitle: 'Trascina e rilascia il tuo file CSV qui, oppure ',
+    browse: 'sfoglia',
+    csvStructureTitle: 'Il file CSV deve rispettare la seguente struttura:',
+    downloadTemplate: 'Scarica qui il modello',
+    field: 'Campo',
+    batchFailed: {
+      info: '{{num}} esecuzioni fallite',
+      retry: 'Riprova',
+      outputPlaceholder: 'Nessun contenuto di output',
+    },
+    errorMsg: {
+      empty: 'Per favore inserisci contenuto nel file caricato.',
+      fileStructNotMatch:
+        'Il file CSV caricato non corrisponde alla struttura.',
+      emptyLine: 'Riga {{rowIndex}} 猫 vuota',
+      invalidLine:
+        'Riga {{rowIndex}}: il valore di {{varName}} non pu貌 essere vuoto',
+      moreThanMaxLengthLine:
+        'Riga {{rowIndex}}: il valore di {{varName}} non pu貌 essere superiore a {{maxLength}} caratteri',
+      atLeastOne: 'Per favore inserisci almeno una riga nel file caricato.',
+    },
+    execution: 'ESECUZIONE',
+    executions: '{{num}} ESECUZIONI',
+  },
+}
+
+export default translation
diff --git a/i18n/it-IT/time.ts b/i18n/it-IT/time.ts
new file mode 100644
index 0000000..f330e8f
--- /dev/null
+++ b/i18n/it-IT/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Tue: 'Marted矛',
+    Thu: 'Gioved矛',
+    Mon: 'Mon',
+    Fri: 'Venerd矛',
+    Sat: 'Sat',
+    Wed: 'Mercoled矛',
+    Sun: 'Sole',
+  },
+  months: {
+    February: 'Febbraio',
+    April: 'Aprile',
+    January: 'Gennaio',
+    December: 'Dicembre',
+    March: 'Marzo',
+    May: 'Maggio',
+    August: 'Agosto',
+    June: 'Giugno',
+    July: 'Luglio',
+    October: 'Ottobre',
+    September: 'Settembre',
+    November: 'Novembre',
+  },
+  operation: {
+    ok: 'OK',
+    now: 'Ora',
+    cancel: 'Annulla',
+    pickDate: 'Seleziona Data',
+  },
+  title: {
+    pickTime: 'Scegli Tempo',
+  },
+  defaultPlaceholder: 'Scegli un orario...',
+}
+
+export default translation
diff --git a/i18n/it-IT/tools.ts b/i18n/it-IT/tools.ts
new file mode 100644
index 0000000..65899e6
--- /dev/null
+++ b/i18n/it-IT/tools.ts
@@ -0,0 +1,168 @@
+const translation = {
+  title: 'Strumenti',
+  createCustomTool: 'Crea Strumento Personalizzato',
+  customToolTip: 'Scopri di pi霉 sugli strumenti personalizzati di Dify',
+  type: {
+    all: 'Tutti',
+    builtIn: 'Integrato',
+    custom: 'Personalizzato',
+    workflow: 'Flusso di lavoro',
+  },
+  contribute: {
+    line1: 'Sono interessato a ',
+    line2: 'contribuire con strumenti a Dify.',
+    viewGuide: 'Visualizza la guida',
+  },
+  author: 'Di',
+  auth: {
+    unauthorized: 'Per Autorizzare',
+    authorized: 'Autorizzato',
+    setup: 'Configura l\'autorizzazione per utilizzare',
+    setupModalTitle: 'Configura Autorizzazione',
+    setupModalTitleDescription:
+      'Dopo aver configurato le credenziali, tutti i membri all\'interno del workspace possono utilizzare questo strumento durante l\'orchestrazione delle applicazioni.',
+  },
+  includeToolNum: '{{num}} strumenti inclusi',
+  addTool: 'Aggiungi Strumento',
+  addToolModal: {
+    type: 'tipo',
+    category: 'categoria',
+    add: 'aggiungi',
+    added: 'aggiunto',
+    manageInTools: 'Gestisci in Strumenti',
+    emptyTitle: 'Nessun strumento di flusso di lavoro disponibile',
+    emptyTip: 'Vai a `Flusso di lavoro -> Pubblica come Strumento`',
+    emptyTitleCustom: 'Nessun attrezzo personalizzato disponibile',
+    emptyTipCustom: 'Creare uno strumento personalizzato',
+  },
+  createTool: {
+    title: 'Crea Strumento Personalizzato',
+    editAction: 'Configura',
+    editTitle: 'Modifica Strumento Personalizzato',
+    name: 'Nome',
+    toolNamePlaceHolder: 'Inserisci il nome dello strumento',
+    nameForToolCall: 'Nome chiamata strumento',
+    nameForToolCallPlaceHolder:
+      'Usato per il riconoscimento della macchina, ad esempio getCurrentWeather, list_pets',
+    nameForToolCallTip: 'Supporta solo numeri, lettere e underscore.',
+    description: 'Descrizione',
+    descriptionPlaceholder:
+      'Breve descrizione dello scopo dello strumento, ad esempio, ottenere la temperatura per una posizione specifica.',
+    schema: 'Schema',
+    schemaPlaceHolder: 'Inserisci qui il tuo schema OpenAPI',
+    viewSchemaSpec: 'Visualizza la Specifica OpenAPI-Swagger',
+    importFromUrl: 'Importa da URL',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: 'Per favore inserisci un URL valido',
+    examples: 'Esempi',
+    exampleOptions: {
+      json: 'Weather(JSON)',
+      yaml: 'Pet Store(YAML)',
+      blankTemplate: 'Modello Vuoto',
+    },
+    availableTools: {
+      title: 'Strumenti Disponibili',
+      name: 'Nome',
+      description: 'Descrizione',
+      method: 'Metodo',
+      path: 'Percorso',
+      action: 'Azioni',
+      test: 'Test',
+    },
+    authMethod: {
+      title: 'Metodo di autorizzazione',
+      type: 'Tipo di autorizzazione',
+      keyTooltip:
+        'Http Header Key, Puoi lasciarlo come `Authorization` se non sai cos\'猫 o impostarlo su un valore personalizzato',
+      types: {
+        none: 'Nessuno',
+        api_key: 'API Key',
+        apiKeyPlaceholder: 'Nome dell\'intestazione HTTP per API Key',
+        apiValuePlaceholder: 'Inserisci API Key',
+      },
+      key: 'Chiave',
+      value: 'Valore',
+    },
+    authHeaderPrefix: {
+      title: 'Tipo di Auth',
+      types: {
+        basic: 'Basic',
+        bearer: 'Bearer',
+        custom: 'Custom',
+      },
+    },
+    privacyPolicy: 'Informativa sulla privacy',
+    privacyPolicyPlaceholder:
+      'Per favore inserisci l\'informativa sulla privacy',
+    toolInput: {
+      title: 'Input Strumento',
+      name: 'Nome',
+      required: 'Richiesto',
+      method: 'Metodo',
+      methodSetting: 'Impostazione',
+      methodSettingTip: 'L\'utente compila la configurazione dello strumento',
+      methodParameter: 'Parametro',
+      methodParameterTip: 'LLM compila durante l\'inferenza',
+      label: 'Tag',
+      labelPlaceholder: 'Scegli tag (opzionale)',
+      description: 'Descrizione',
+      descriptionPlaceholder: 'Descrizione del significato del parametro',
+    },
+    customDisclaimer: 'Disclaimer personalizzato',
+    customDisclaimerPlaceholder:
+      'Per favore inserisci disclaimer personalizzato',
+    confirmTitle: 'Confermare per salvare?',
+    confirmTip: 'Le app che utilizzano questo strumento saranno influenzate',
+    deleteToolConfirmTitle: 'Eliminare questo Strumento?',
+    deleteToolConfirmContent:
+      'L\'eliminazione dello Strumento 猫 irreversibile. Gli utenti non potranno pi霉 accedere al tuo Strumento.',
+  },
+  test: {
+    title: 'Test',
+    parametersValue: 'Parametri & Valore',
+    parameters: 'Parametri',
+    value: 'Valore',
+    testResult: 'Risultati del Test',
+    testResultPlaceholder: 'I risultati del test verranno mostrati qui',
+  },
+  thought: {
+    using: 'Utilizzando',
+    used: 'Usato',
+    requestTitle: 'Richiesta a',
+    responseTitle: 'Risposta da',
+  },
+  setBuiltInTools: {
+    info: 'Info',
+    setting: 'Impostazione',
+    toolDescription: 'Descrizione dello strumento',
+    parameters: 'parametri',
+    string: 'stringa',
+    number: 'numero',
+    required: 'Richiesto',
+    infoAndSetting: 'Info & Impostazioni',
+    file: 'file',
+  },
+  noCustomTool: {
+    title: 'Nessun strumento personalizzato!',
+    content:
+      'Aggiungi e gestisci i tuoi strumenti personalizzati qui per costruire app AI.',
+    createTool: 'Crea Strumento',
+  },
+  noSearchRes: {
+    title: 'Spiacenti, nessun risultato!',
+    content:
+      'Non abbiamo trovato strumenti che corrispondono alla tua ricerca.',
+    reset: 'Reimposta Ricerca',
+  },
+  builtInPromptTitle: 'Prompt',
+  toolRemoved: 'Strumento rimosso',
+  notAuthorized: 'Strumento non autorizzato',
+  howToGet: 'Come ottenere',
+  openInStudio: 'Apri in Studio',
+  toolNameUsageTip:
+    'Nome chiamata strumento per il ragionamento e il prompting dell\'agente',
+  noTools: 'Nessun utensile trovato',
+  copyToolName: 'Copia nome',
+}
+
+export default translation
diff --git a/i18n/it-IT/workflow.ts b/i18n/it-IT/workflow.ts
new file mode 100644
index 0000000..35d3ba1
--- /dev/null
+++ b/i18n/it-IT/workflow.ts
@@ -0,0 +1,946 @@
+const translation = {
+  common: {
+    undo: 'Annulla',
+    redo: 'Ripeti',
+    editing: 'Modifica in corso',
+    autoSaved: 'Salvataggio automatico',
+    unpublished: 'Non pubblicato',
+    published: 'Pubblicato',
+    publish: 'Pubblica',
+    update: 'Aggiorna',
+    run: 'Esegui',
+    running: 'In esecuzione',
+    inRunMode: 'In modalit脿 di esecuzione',
+    inPreview: 'In anteprima',
+    inPreviewMode: 'In modalit脿 anteprima',
+    preview: 'Anteprima',
+    viewRunHistory: 'Visualizza cronologia esecuzioni',
+    runHistory: 'Cronologia esecuzioni',
+    goBackToEdit: 'Torna all\'editor',
+    conversationLog: 'Registro conversazioni',
+    features: 'Caratteristiche',
+    debugAndPreview: 'Anteprima',
+    restart: 'Riavvia',
+    currentDraft: 'Bozza corrente',
+    currentDraftUnpublished: 'Bozza corrente non pubblicata',
+    latestPublished: 'Ultimo pubblicato',
+    publishedAt: 'Pubblicato',
+    restore: 'Ripristina',
+    runApp: 'Esegui App',
+    batchRunApp: 'Esegui App in Batch',
+    accessAPIReference: 'Accedi alla Riferimento API',
+    embedIntoSite: 'Incorpora nel Sito',
+    addTitle: 'Aggiungi titolo...',
+    addDescription: 'Aggiungi descrizione...',
+    noVar: 'Nessuna variabile',
+    searchVar: 'Cerca variabile',
+    variableNamePlaceholder: 'Nome variabile',
+    setVarValuePlaceholder: 'Imposta variabile',
+    needConnectTip: 'Questo passaggio non 猫 collegato a nulla',
+    maxTreeDepth: 'Limite massimo di {{depth}} nodi per ramo',
+    needEndNode: 'Deve essere aggiunto il blocco di Fine',
+    needAnswerNode: 'Deve essere aggiunto il blocco di Risposta',
+    workflowProcess: 'Processo di flusso di lavoro',
+    notRunning: 'Non ancora in esecuzione',
+    previewPlaceholder:
+      'Inserisci contenuto nella casella sottostante per avviare il debug del Chatbot',
+    effectVarConfirm: {
+      title: 'Rimuovi Variabile',
+      content:
+        'La variabile 猫 utilizzata in altri nodi. Vuoi comunque rimuoverla?',
+    },
+    insertVarTip: 'Premi il tasto \'/\' per inserire rapidamente',
+    processData: 'Elabora Dati',
+    input: 'Input',
+    output: 'Output',
+    jinjaEditorPlaceholder: 'Digita \'/\' o \'{\' per inserire variabile',
+    viewOnly: 'Solo visualizzazione',
+    showRunHistory: 'Mostra cronologia esecuzioni',
+    enableJinja: 'Abilita supporto template Jinja',
+    learnMore: 'Scopri di pi霉',
+    copy: 'Copia',
+    duplicate: 'Duplica',
+    addBlock: 'Aggiungi Blocco',
+    pasteHere: 'Incolla Qui',
+    pointerMode: 'Modalit脿 Puntatore',
+    handMode: 'Modalit脿 Mano',
+    model: 'Modello',
+    workflowAsTool: 'Flusso di lavoro come Strumento',
+    configureRequired: 'Configurazione Richiesta',
+    configure: 'Configura',
+    manageInTools: 'Gestisci in Strumenti',
+    workflowAsToolTip:
+      '脠 richiesta una nuova configurazione dello strumento dopo l\'aggiornamento del flusso di lavoro.',
+    viewDetailInTracingPanel: 'Visualizza dettagli',
+    syncingData: 'Sincronizzazione dei dati in corso, solo pochi secondi.',
+    importDSL: 'Importa DSL',
+    importDSLTip:
+      'La bozza corrente verr脿 sovrascritta. Esporta il flusso di lavoro come backup prima di importare.',
+    backupCurrentDraft: 'Backup Bozza Corrente',
+    chooseDSL: 'Scegli file DSL(yml)',
+    overwriteAndImport: 'Sovrascrivi e Importa',
+    importFailure: 'Importazione fallita',
+    importSuccess: 'Importazione riuscita',
+    parallelTip: {
+      click: {
+        title: 'Clic',
+        desc: 'per aggiungere',
+      },
+      drag: {
+        title: 'Trascinare',
+        desc: 'per collegare',
+      },
+      depthLimit: 'Limite di livelli di annidamento parallelo di {{num}} livelli',
+      limit: 'Il parallelismo 猫 limitato ai rami {{num}}.',
+    },
+    parallelRun: 'Corsa parallela',
+    disconnect: 'Disconnettere',
+    jumpToNode: 'Vai a questo nodo',
+    addParallelNode: 'Aggiungi nodo parallelo',
+    parallel: 'PARALLELO',
+    branch: 'RAMO',
+    featuresDocLink: 'Ulteriori informazioni',
+    featuresDescription: 'Migliora l\'esperienza utente dell\'app Web',
+    fileUploadTip: 'Le funzioni di caricamento delle immagini sono state aggiornate al caricamento dei file.',
+    ImageUploadLegacyTip: 'Ora 猫 possibile creare variabili di tipo file nel modulo iniziale. In futuro non supporteremo pi霉 la funzione di caricamento delle immagini.',
+    importWarning: 'Cautela',
+    importWarningDetails: 'La differenza di versione DSL pu貌 influire su alcune funzionalit脿',
+    openInExplore: 'Apri in Esplora',
+    onFailure: 'In caso di guasto',
+    addFailureBranch: 'Aggiungi ramo non riuscito',
+    noHistory: 'Nessuna storia',
+    loadMore: 'Carica pi霉 flussi di lavoro',
+    publishUpdate: 'Pubblica aggiornamento',
+    versionHistory: 'Cronologia delle versioni',
+    exitVersions: 'Uscita Versioni',
+    referenceVar: 'Variabile di riferimento',
+    exportSVG: 'Esporta come SVG',
+    exportImage: 'Esporta immagine',
+    exportJPEG: 'Esporta come JPEG',
+    noExist: 'Nessuna variabile del genere',
+    exportPNG: 'Esporta come PNG',
+  },
+  env: {
+    envPanelTitle: 'Variabili d\'Ambiente',
+    envDescription: 'Le variabili d\'ambiente possono essere utilizzate per memorizzare informazioni private e credenziali. Sono di sola lettura e possono essere separate dal file DSL durante l\'esportazione.',
+    envPanelButton: 'Aggiungi Variabile',
+    modal: {
+      title: 'Aggiungi Variabile d\'Ambiente',
+      editTitle: 'Modifica Variabile d\'Ambiente',
+      type: 'Tipo',
+      name: 'Nome',
+      namePlaceholder: 'nome env',
+      value: 'Valore',
+      valuePlaceholder: 'valore env',
+      secretTip: 'Utilizzato per definire informazioni o dati sensibili, con impostazioni DSL configurate per la prevenzione delle fughe.',
+    },
+    export: {
+      title: 'Esportare variabili d\'ambiente segrete?',
+      checkbox: 'Esporta valori segreti',
+      ignore: 'Esporta DSL',
+      export: 'Esporta DSL con valori segreti',
+    },
+  },
+  chatVariable: {
+    panelTitle: 'Variabili di Conversazione',
+    panelDescription: 'Le Variabili di Conversazione sono utilizzate per memorizzare informazioni interattive che il LLM deve ricordare, inclusi la cronologia delle conversazioni, i file caricati e le preferenze dell\'utente. Sono in lettura e scrittura.',
+    docLink: 'Visita la nostra documentazione per saperne di pi霉.',
+    button: 'Aggiungi Variabile',
+    modal: {
+      title: 'Aggiungi Variabile di Conversazione',
+      editTitle: 'Modifica Variabile di Conversazione',
+      name: 'Nome',
+      namePlaceholder: 'Nome della variabile',
+      type: 'Tipo',
+      value: 'Valore Predefinito',
+      valuePlaceholder: 'Valore predefinito, lascia vuoto per non impostare',
+      description: 'Descrizione',
+      descriptionPlaceholder: 'Descrivi la variabile',
+      editInJSON: 'Modifica in JSON',
+      oneByOne: 'Aggiungi uno alla volta',
+      editInForm: 'Modifica nel Modulo',
+      arrayValue: 'Valore',
+      addArrayValue: 'Aggiungi Valore',
+      objectKey: 'Chiave',
+      objectType: 'Tipo',
+      objectValue: 'Valore Predefinito',
+    },
+    storedContent: 'Contenuto memorizzato',
+    updatedAt: 'Aggiornato il ',
+  },
+  changeHistory: {
+    title: 'Cronologia Modifiche',
+    placeholder: 'Non hai ancora modificato nulla',
+    clearHistory: 'Cancella Cronologia',
+    hint: 'Suggerimento',
+    hintText:
+      'Le tue azioni di modifica vengono tracciate in una cronologia delle modifiche, che viene memorizzata sul tuo dispositivo per tutta la durata di questa sessione. Questa cronologia verr脿 cancellata quando lascerai l\'editor.',
+    stepBackward_one: '{{count}} passo indietro',
+    stepBackward_other: '{{count}} passi indietro',
+    stepForward_one: '{{count}} passo avanti',
+    stepForward_other: '{{count}} passi avanti',
+    sessionStart: 'Inizio sessione',
+    currentState: 'Stato attuale',
+    nodeTitleChange: 'Titolo del blocco modificato',
+    nodeDescriptionChange: 'Descrizione del blocco modificata',
+    nodeDragStop: 'Blocco spostato',
+    nodeChange: 'Blocco modificato',
+    nodeConnect: 'Blocco collegato',
+    nodePaste: 'Blocco incollato',
+    nodeDelete: 'Blocco eliminato',
+    nodeAdd: 'Blocco aggiunto',
+    nodeResize: 'Blocco ridimensionato',
+    noteAdd: 'Nota aggiunta',
+    noteChange: 'Nota modificata',
+    noteDelete: 'Nota eliminata',
+    edgeDelete: 'Blocco scollegato',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 猫 richiesto',
+    authRequired: '脠 richiesta l\'autorizzazione',
+    invalidJson: '{{field}} 猫 un JSON non valido',
+    fields: {
+      variable: 'Nome Variabile',
+      variableValue: 'Valore Variabile',
+      code: 'Codice',
+      model: 'Modello',
+      rerankModel: 'Modello Rerank',
+      visionVariable: 'Visione variabile',
+    },
+    invalidVariable: 'Variabile non valida',
+    rerankModelRequired: 'Prima di attivare il modello di reranking, conferma che il modello 猫 stato configurato correttamente nelle impostazioni.',
+    toolParameterRequired: '{{field}}: il parametro [{{param}}] 猫 obbligatorio',
+    noValidTool: '{{field}} nessuno strumento valido selezionato',
+  },
+  singleRun: {
+    testRun: 'Esecuzione Test ',
+    startRun: 'Avvia Esecuzione',
+    running: 'In esecuzione',
+    testRunIteration: 'Iterazione Esecuzione Test',
+    back: 'Indietro',
+    iteration: 'Iterazione',
+    loop: 'Anello',
+  },
+  tabs: {
+    'searchBlock': 'Cerca blocco',
+    'blocks': 'Blocchi',
+    'tools': 'Strumenti',
+    'allTool': 'Tutti',
+    'builtInTool': 'Integrato',
+    'customTool': 'Personalizzato',
+    'workflowTool': 'Flusso di lavoro',
+    'question-understand': 'Comprensione Domanda',
+    'logic': 'Logica',
+    'transform': 'Trasforma',
+    'utilities': 'Utility',
+    'noResult': 'Nessuna corrispondenza trovata',
+    'searchTool': 'Strumento di ricerca',
+    'agent': 'Strategia dell\'agente',
+    'plugin': 'Plugin',
+  },
+  blocks: {
+    'start': 'Inizio',
+    'end': 'Fine',
+    'answer': 'Risposta',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'Recupero Conoscenza',
+    'question-classifier': 'Classificatore Domande',
+    'if-else': 'SE/ALTRIMENTI',
+    'code': 'Codice',
+    'template-transform': 'Template',
+    'http-request': 'Richiesta HTTP',
+    'variable-assigner': 'Assegnatore Variabili',
+    'variable-aggregator': 'Aggregatore Variabili',
+    'assigner': 'Assegnatore di Variabili',
+    'iteration-start': 'Inizio Iterazione',
+    'iteration': 'Iterazione',
+    'parameter-extractor': 'Estrattore Parametri',
+    'document-extractor': 'Estrattore di documenti',
+    'list-operator': 'Operatore di elenco',
+    'agent': 'Agente',
+    'loop-end': 'Uscire dal ciclo',
+    'loop-start': 'Inizio ciclo',
+    'loop': 'Anello',
+  },
+  blocksAbout: {
+    'start': 'Definisci i parametri iniziali per l\'avvio di un flusso di lavoro',
+    'end': 'Definisci la fine e il tipo di risultato di un flusso di lavoro',
+    'answer': 'Definisci il contenuto della risposta di una conversazione chat',
+    'llm': 'Invoca modelli di linguaggio di grandi dimensioni per rispondere a domande o elaborare il linguaggio naturale',
+    'knowledge-retrieval':
+      'Ti consente di interrogare il contenuto del testo relativo alle domande dell\'utente dalla Conoscenza',
+    'question-classifier':
+      'Definisci le condizioni di classificazione delle domande dell\'utente, LLM pu貌 definire come prosegue la conversazione in base alla descrizione della classificazione',
+    'if-else':
+      'Ti consente di dividere il flusso di lavoro in due rami basati su condizioni se/altrimenti',
+    'code': 'Esegui un pezzo di codice Python o NodeJS per implementare la logica personalizzata',
+    'template-transform':
+      'Converti i dati in stringa usando la sintassi del template Jinja',
+    'http-request':
+      'Consenti l\'invio di richieste server tramite il protocollo HTTP',
+    'variable-assigner':
+      'Aggrega variabili multi-ramo in una singola variabile per la configurazione unificata dei nodi a valle.',
+    'assigner': 'Il nodo di assegnazione delle variabili 猫 utilizzato per assegnare valori a variabili scrivibili (come le variabili di conversazione).',
+    'variable-aggregator':
+      'Aggrega variabili multi-ramo in una singola variabile per la configurazione unificata dei nodi a valle.',
+    'iteration':
+      'Esegui pi霉 passaggi su un oggetto lista fino a quando tutti i risultati non sono stati prodotti.',
+    'parameter-extractor':
+      'Usa LLM per estrarre parametri strutturati dal linguaggio naturale per invocazioni di strumenti o richieste HTTP.',
+    'list-operator': 'Utilizzato per filtrare o ordinare il contenuto della matrice.',
+    'document-extractor': 'Utilizzato per analizzare i documenti caricati in contenuti di testo facilmente comprensibili da LLM.',
+    'agent': 'Richiamo di modelli linguistici di grandi dimensioni per rispondere a domande o elaborare il linguaggio naturale',
+    'loop-end': 'Equivalente a "break". Questo nodo non ha elementi di configurazione. Quando il corpo del ciclo raggiunge questo nodo, il ciclo termina.',
+    'loop': 'Esegui un ciclo di logica fino a quando la condizione di terminazione non viene soddisfatta o il numero massimo di cicli viene raggiunto.',
+  },
+  operator: {
+    zoomIn: 'Zoom In',
+    zoomOut: 'Zoom Out',
+    zoomTo50: 'Zoom al 50%',
+    zoomTo100: 'Zoom al 100%',
+    zoomToFit: 'Zoom per Adattare',
+  },
+  panel: {
+    userInputField: 'Campo di Input Utente',
+    changeBlock: 'Cambia Blocco',
+    helpLink: 'Link di Aiuto',
+    about: 'Informazioni',
+    createdBy: 'Creato da ',
+    nextStep: 'Prossimo Passo',
+    addNextStep: 'Aggiungi il prossimo blocco in questo flusso di lavoro',
+    selectNextStep: 'Seleziona Prossimo Blocco',
+    runThisStep: 'Esegui questo passo',
+    checklist: 'Checklist',
+    checklistTip:
+      'Assicurati che tutti i problemi siano risolti prima di pubblicare',
+    checklistResolved: 'Tutti i problemi sono risolti',
+    organizeBlocks: 'Organizza blocchi',
+    change: 'Cambia',
+    optional: '(opzionale)',
+  },
+  nodes: {
+    common: {
+      outputVars: 'Variabili di Output',
+      insertVarTip: 'Inserisci Variabile',
+      memory: {
+        memory: 'Memoria',
+        memoryTip: 'Impostazioni memoria chat',
+        windowSize: 'Dimensione Finestra',
+        conversationRoleName: 'Nome Ruolo Conversazione',
+        user: 'Prefisso Utente',
+        assistant: 'Prefisso Assistente',
+      },
+      memories: {
+        title: 'Memorie',
+        tip: 'Memoria chat',
+        builtIn: 'Integrato',
+      },
+      errorHandle: {
+        none: {
+          title: 'Nessuno',
+          desc: 'L\'esecuzione del nodo verr脿 interrotta se si verifica un\'eccezione e non viene gestita',
+        },
+        defaultValue: {
+          title: 'Valore predefinito',
+          desc: 'Quando si verifica un errore, specificare un contenuto di output statico.',
+          tip: 'In caso di errore, torner脿 al di sotto del valore.',
+          inLog: 'Eccezione del nodo, output in base ai valori predefiniti.',
+          output: 'Valore predefinito di output',
+        },
+        failBranch: {
+          title: 'Ramo fallito',
+          desc: 'Quando si verifica un errore, eseguir脿 il ramo dell\'eccezione',
+          customize: 'Passare all\'area di disegno per personalizzare la logica del ramo di errore.',
+          customizeTip: 'Quando il ramo di errore 猫 attivato, le eccezioni generate dai nodi non termineranno il processo. Al contrario, eseguir脿 automaticamente il ramo di errore predefinito, consentendo di fornire in modo flessibile messaggi di errore, report, correzioni o azioni di salto.',
+          inLog: 'Eccezione nodo, eseguir脿 automaticamente il ramo di errore. L\'output del nodo restituir脿 un tipo di errore e un messaggio di errore e li passer脿 al downstream.',
+        },
+        partialSucceeded: {
+          tip: 'Ci sono {{num}} nodi nel processo che funzionano in modo anomalo, si prega di andare su tracing per controllare i log.',
+        },
+        title: 'Gestione degli errori',
+        tip: 'Strategia di gestione delle eccezioni, attivata quando un nodo rileva un\'eccezione.',
+      },
+      retry: {
+        retry: 'Ripetere',
+        retryOnFailure: 'Riprova in caso di errore',
+        maxRetries: 'Numero massimo di tentativi',
+        retryInterval: 'Intervallo tentativi',
+        retryTimes: 'Riprova {{times}} volte in caso di errore',
+        retrying: 'Riprovare...',
+        retryFailedTimes: '{{times}} tentativi falliti',
+        times: 'tempi',
+        retries: '{{num}} Tentativi',
+        retrySuccessful: 'Riprova riuscito',
+        retryFailed: 'Nuovo tentativo non riuscito',
+        ms: 'ms',
+      },
+    },
+    start: {
+      required: 'richiesto',
+      inputField: 'Campo di Input',
+      builtInVar: 'Variabili Integrate',
+      outputVars: {
+        query: 'Input Utente',
+        memories: {
+          des: 'Cronologia conversazioni',
+          type: 'tipo di messaggio',
+          content: 'contenuto del messaggio',
+        },
+        files: 'Elenco file',
+      },
+      noVarTip:
+        'Imposta gli input che possono essere utilizzati nel Flusso di lavoro',
+    },
+    end: {
+      outputs: 'Output',
+      output: {
+        type: 'tipo di output',
+        variable: 'variabile di output',
+      },
+      type: {
+        'none': 'Nessuno',
+        'plain-text': 'Testo Semplice',
+        'structured': 'Strutturato',
+      },
+    },
+    answer: {
+      answer: 'Risposta',
+      outputVars: 'Variabili di Output',
+    },
+    llm: {
+      model: 'modello',
+      variables: 'variabili',
+      context: 'contesto',
+      contextTooltip: 'Puoi importare Conoscenza come contesto',
+      notSetContextInPromptTip:
+        'Per abilitare la funzionalit脿 di contesto, compila la variabile del contesto nel PROMPT.',
+      prompt: 'prompt',
+      roleDescription: {
+        system: 'Fornisci istruzioni di alto livello per la conversazione',
+        user: 'Fornisci istruzioni, query o qualsiasi input basato su testo al modello',
+        assistant: 'Le risposte del modello basate sui messaggi dell\'utente',
+      },
+      addMessage: 'Aggiungi Messaggio',
+      vision: 'vision',
+      files: 'File',
+      resolution: {
+        name: 'Risoluzione',
+        high: 'Alta',
+        low: 'Bassa',
+      },
+      outputVars: {
+        output: 'Genera contenuto',
+        usage: 'Informazioni sull\'utilizzo del modello',
+      },
+      singleRun: {
+        variable: 'Variabile',
+      },
+      sysQueryInUser: 'sys.query nel messaggio utente 猫 richiesto',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: 'Si prega di completare la modifica del campo corrente prima di salvare lo schema.',
+        },
+        descriptionPlaceholder: 'Aggiungi descrizione',
+        generate: 'Genera',
+        generateJsonSchema: 'Genera Schema JSON',
+        generationTip: 'Puoi usare il linguaggio naturale per creare rapidamente uno schema JSON.',
+        back: 'Indietro',
+        apply: 'Applica',
+        showAdvancedOptions: 'Mostra opzioni avanzate',
+        stringValidations: 'Validazioni delle stringhe',
+        regenerate: 'Rigenerare',
+        required: 'richiesto',
+        resetDefaults: 'Ripristina',
+        addField: 'Aggiungi campo',
+        promptPlaceholder: 'Descrivi il tuo schema JSON...',
+        title: 'Schema di Output Strutturato',
+        instruction: 'Istruzione',
+        addChildField: 'Aggiungi campo bambino',
+        fieldNamePlaceholder: 'Nome del campo',
+        promptTooltip: 'Converte la descrizione del testo in una struttura JSON Schema standardizzata.',
+        doc: 'Scopri di pi霉 sull\'output strutturato',
+        import: 'Importa da JSON',
+        resultTip: 'Ecco il risultato generato. Se non sei soddisfatto, puoi tornare indietro e modificare il tuo prompt.',
+        generating: 'Generazione dello schema JSON...',
+        generatedResult: 'Risultato generato',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'Variabile Query',
+      knowledge: 'Conoscenza',
+      outputVars: {
+        output: 'Dati segmentati di recupero',
+        content: 'Contenuto segmentato',
+        title: 'Titolo segmentato',
+        icon: 'Icona segmentata',
+        url: 'URL segmentato',
+        metadata: 'Altri metadati',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            title: 'Disabilitato',
+            subTitle: 'Non abilitare il filtraggio dei metadati',
+          },
+          automatic: {
+            subTitle: 'Genera automaticamente condizioni di filtraggio dei metadati in base alla query dell\'utente',
+            desc: 'Genera automaticamente condizioni di filtraggio dei metadati basate sulla variabile di query',
+          },
+          manual: {
+            title: 'Manuale',
+            subTitle: 'Aggiungere manualmente le condizioni di filtraggio dei metadati',
+          },
+        },
+        panel: {
+          conditions: 'Condizioni',
+          select: 'Seleziona variabile...',
+          title: 'Condizioni di filtro dei metadati',
+          add: 'Aggiungi condizione',
+          datePlaceholder: 'Scegli un orario...',
+          placeholder: 'Inserisci valore',
+          search: 'Cerca metadati',
+        },
+        title: 'Filtraggio dei metadati',
+      },
+    },
+    http: {
+      inputVars: 'Variabili di Input',
+      api: 'API',
+      apiPlaceholder: 'Inserisci URL, digita 鈥�/鈥� per inserire variabile',
+      notStartWithHttp: 'L\'API deve iniziare con http:// o https://',
+      key: 'Chiave',
+      value: 'Valore',
+      bulkEdit: 'Modifica di massa',
+      keyValueEdit: 'Modifica Chiave-Valore',
+      headers: 'Intestazioni',
+      params: 'Parametri',
+      body: 'Corpo',
+      outputVars: {
+        body: 'Contenuto Risposta',
+        statusCode: 'Codice Stato Risposta',
+        headers: 'Elenco Intestazioni Risposta JSON',
+        files: 'Elenco File',
+      },
+      authorization: {
+        'authorization': 'Autorizzazione',
+        'authorizationType': 'Tipo di Autorizzazione',
+        'no-auth': 'Nessuno',
+        'api-key': 'API-Key',
+        'auth-type': 'Tipo Auth',
+        'basic': 'Basic',
+        'bearer': 'Bearer',
+        'custom': 'Custom',
+        'api-key-title': 'API Key',
+        'header': 'Intestazione',
+      },
+      insertVarPlaceholder: 'digita \'/\' per inserire variabile',
+      timeout: {
+        title: 'Timeout',
+        connectLabel: 'Timeout Connessione',
+        connectPlaceholder: 'Inserisci timeout connessione in secondi',
+        readLabel: 'Timeout Lettura',
+        readPlaceholder: 'Inserisci timeout lettura in secondi',
+        writeLabel: 'Timeout Scrittura',
+        writePlaceholder: 'Inserisci timeout scrittura in secondi',
+      },
+      binaryFileVariable: 'Variabile file binario',
+      type: 'Digitare',
+      extractListPlaceholder: 'Inserisci l\'indice delle voci dell\'elenco, digita \'/\' inserisci la variabile',
+      curl: {
+        placeholder: 'Incolla qui la stringa cURL',
+        title: 'Importazione da cURL',
+      },
+    },
+    code: {
+      inputVars: 'Variabili di Input',
+      outputVars: 'Variabili di Output',
+      advancedDependencies: 'Dipendenze Avanzate',
+      advancedDependenciesTip:
+        'Aggiungi alcune dipendenze precaricate che richiedono pi霉 tempo per essere consumate o che non sono predefinite qui',
+      searchDependencies: 'Cerca Dipendenze',
+    },
+    templateTransform: {
+      inputVars: 'Variabili di Input',
+      code: 'Codice',
+      codeSupportTip: 'Supporta solo Jinja2',
+      outputVars: {
+        output: 'Contenuto trasformato',
+      },
+    },
+    ifElse: {
+      if: 'Se',
+      else: 'Altrimenti',
+      elseDescription:
+        'Utilizzato per definire la logica che dovrebbe essere eseguita quando la condizione se non 猫 soddisfatta.',
+      and: 'e',
+      or: 'o',
+      operator: 'Operatore',
+      notSetVariable: 'Si prega di impostare prima la variabile',
+      comparisonOperator: {
+        'contains': 'contiene',
+        'not contains': 'non contiene',
+        'start with': 'inizia con',
+        'end with': 'finisce con',
+        'is': '猫',
+        'is not': 'non 猫',
+        'empty': '猫 vuoto',
+        'not empty': 'non 猫 vuoto',
+        'null': '猫 nullo',
+        'not null': 'non 猫 nullo',
+        'regex match': 'Corrispondenza regex',
+        'in': 'in',
+        'all of': 'tutto di',
+        'not in': 'non in',
+        'exists': 'Esiste',
+        'not exists': 'non esiste',
+        'after': 'dopo',
+      },
+      enterValue: 'Inserisci valore',
+      addCondition: 'Aggiungi Condizione',
+      conditionNotSetup: 'Condizione NON impostata',
+      selectVariable: 'Seleziona variabile...',
+      optionName: {
+        url: 'URL',
+        localUpload: 'Caricamento locale',
+        image: 'Immagine',
+        doc: 'Dottore',
+        video: 'Video',
+        audio: 'Audio',
+      },
+      addSubVariable: 'Variabile secondaria',
+      select: 'Selezionare',
+      condition: 'Condizione',
+    },
+    variableAssigner: {
+      title: 'Assegna variabili',
+      outputType: 'Tipo di Output',
+      varNotSet: 'Variabile non impostata',
+      noVarTip: 'Aggiungi le variabili da assegnare',
+      type: {
+        string: 'Stringa',
+        number: 'Numero',
+        object: 'Oggetto',
+        array: 'Array',
+      },
+      aggregationGroup: 'Gruppo di Aggregazione',
+      aggregationGroupTip:
+        'Abilitando questa funzione, l\'aggregatore di variabili potr脿 aggregare pi霉 set di variabili.',
+      addGroup: 'Aggiungi Gruppo',
+      outputVars: {
+        varDescribe: 'Output {{groupName}}',
+      },
+      setAssignVariable: 'Imposta variabile assegnata',
+    },
+    assigner: {
+      'assignedVariable': 'Variabile Assegnata',
+      'writeMode': 'Modalit脿 di Scrittura',
+      'writeModeTip': 'Quando la VARIABILE ASSEGNATA 猫 un array, la modalit脿 di aggiunta inserisce alla fine.',
+      'over-write': 'Sovrascrivere',
+      'append': 'Aggiungere',
+      'plus': 'Pi霉',
+      'clear': 'Cancellare',
+      'setVariable': 'Imposta Variabile',
+      'variable': 'Variabile',
+      'operations': {
+        '-=': '-=',
+        'overwrite': 'Sovrascrivere',
+        '+=': '+=',
+        '*=': '*=',
+        'append': 'Aggiungere',
+        'set': 'Mettere',
+        'title': 'Operazione',
+        '/=': '/=',
+        'over-write': 'Sovrascrivere',
+        'extend': 'Estendere',
+        'clear': 'Chiaro',
+        'remove-last': 'Rimuovi ultimo',
+        'remove-first': 'Rimuovi primo',
+      },
+      'setParameter': 'Imposta parametro...',
+      'variables': 'Variabili',
+      'noAssignedVars': 'Nessuna variabile assegnata disponibile',
+      'assignedVarsDescription': 'Le variabili assegnate devono essere variabili scrivibili, ad esempio variabili di conversazione.',
+      'varNotSet': 'Variabile NON impostata',
+      'selectAssignedVariable': 'Seleziona variabile assegnata...',
+      'noVarTip': 'Fare clic sul pulsante "+" per aggiungere variabili',
+    },
+    tool: {
+      toAuthorize: 'Per autorizzare',
+      inputVars: 'Variabili di Input',
+      outputVars: {
+        text: 'contenuto generato dallo strumento',
+        files: {
+          title: 'file generati dallo strumento',
+          type: 'Tipo supportato. Attualmente supporta solo immagini',
+          transfer_method:
+            'Metodo di trasferimento. Il valore 猫 remote_url o local_file',
+          url: 'URL immagine',
+          upload_file_id: 'ID file caricato',
+        },
+        json: 'json generato dallo strumento',
+      },
+    },
+    questionClassifiers: {
+      model: 'modello',
+      inputVars: 'Variabili di Input',
+      outputVars: {
+        className: 'Nome Classe',
+      },
+      class: 'Classe',
+      classNamePlaceholder: 'Scrivi il nome della tua classe',
+      advancedSetting: 'Impostazione Avanzata',
+      topicName: 'Nome Argomento',
+      topicPlaceholder: 'Scrivi il nome del tuo argomento',
+      addClass: 'Aggiungi Classe',
+      instruction: 'Istruzione',
+      instructionTip:
+        'Inserisci istruzioni aggiuntive per aiutare il classificatore di domande a capire meglio come categorizzare le domande.',
+      instructionPlaceholder: 'Scrivi la tua istruzione',
+    },
+    parameterExtractor: {
+      inputVar: 'Variabile di Input',
+      extractParameters: 'Estrai Parametri',
+      importFromTool: 'Importa dagli strumenti',
+      addExtractParameter: 'Aggiungi Parametro Estratto',
+      addExtractParameterContent: {
+        name: 'Nome',
+        namePlaceholder: 'Nome Parametro Estratto',
+        type: 'Tipo',
+        typePlaceholder: 'Tipo Parametro Estratto',
+        description: 'Descrizione',
+        descriptionPlaceholder: 'Descrizione Parametro Estratto',
+        required: 'Richiesto',
+        requiredContent:
+          'Richiesto viene utilizzato solo come riferimento per l\'inferenza del modello, e non per la convalida obbligatoria dell\'output del parametro.',
+      },
+      extractParametersNotSet: 'Parametri Estratti non impostati',
+      instruction: 'Istruzione',
+      instructionTip:
+        'Inserisci istruzioni aggiuntive per aiutare l\'estrattore di parametri a capire come estrarre i parametri.',
+      advancedSetting: 'Impostazione Avanzata',
+      reasoningMode: 'Modalit脿 di ragionamento',
+      reasoningModeTip:
+        'Puoi scegliere la modalit脿 di ragionamento appropriata in base alla capacit脿 del modello di rispondere alle istruzioni per la chiamata delle funzioni o i prompt.',
+      isSuccess:
+        '脠 successo. In caso di successo il valore 猫 1, in caso di fallimento il valore 猫 0.',
+      errorReason: 'Motivo dell\'errore',
+    },
+    iteration: {
+      deleteTitle: 'Eliminare Nodo Iterazione?',
+      deleteDesc:
+        'Eliminando il nodo iterazione verranno eliminati tutti i nodi figlio',
+      input: 'Input',
+      output: 'Variabili di Output',
+      iteration_one: '{{count}} Iterazione',
+      iteration_other: '{{count}} Iterazioni',
+      currentIteration: 'Iterazione Corrente',
+      ErrorMethod: {
+        operationTerminated: 'Terminato',
+        continueOnError: 'continua sull\'errore',
+        removeAbnormalOutput: 'rimuovi-output-anomalo',
+      },
+      error_one: '{{conteggio}} Errore',
+      parallelMode: 'Modalit脿 parallela',
+      MaxParallelismTitle: 'Parallelismo massimo',
+      error_other: '{{conteggio}} Errori',
+      parallelModeEnableDesc: 'In modalit脿 parallela, le attivit脿 all\'interno delle iterazioni supportano l\'esecuzione parallela. 脠 possibile configurare questa opzione nel pannello delle propriet脿 a destra.',
+      MaxParallelismDesc: 'Il parallelismo massimo viene utilizzato per controllare il numero di attivit脿 eseguite contemporaneamente in una singola iterazione.',
+      errorResponseMethod: 'Metodo di risposta all\'errore',
+      parallelModeEnableTitle: 'Modalit脿 parallela abilitata',
+      parallelModeUpper: 'MODALIT脌 PARALLELA',
+      comma: ',',
+      parallelPanelDesc: 'In modalit脿 parallela, le attivit脿 nell\'iterazione supportano l\'esecuzione parallela.',
+      answerNodeWarningDesc: 'Avviso in modalit脿 parallela: i nodi di risposta, le assegnazioni di variabili di conversazione e le operazioni di lettura/scrittura persistenti all\'interno delle iterazioni possono causare eccezioni.',
+    },
+    note: {
+      addNote: 'Aggiungi Nota',
+      editor: {
+        placeholder: 'Scrivi la tua nota...',
+        small: 'Piccolo',
+        medium: 'Medio',
+        large: 'Grande',
+        bold: 'Grassetto',
+        italic: 'Corsivo',
+        strikethrough: 'Barrato',
+        link: 'Link',
+        openLink: 'Apri',
+        unlink: 'Rimuovi link',
+        enterUrl: 'Inserisci URL...',
+        invalidUrl: 'URL non valido',
+        bulletList: 'Elenco puntato',
+        showAuthor: 'Mostra Autore',
+      },
+    },
+    docExtractor: {
+      outputVars: {
+        text: 'Testo estratto',
+      },
+      learnMore: 'Ulteriori informazioni',
+      inputVar: 'Variabile di input',
+      supportFileTypes: 'Tipi di file supportati: {{types}}.',
+    },
+    listFilter: {
+      outputVars: {
+        last_record: 'Ultimo record',
+        result: 'Filtra risultato',
+        first_record: 'Primo record',
+      },
+      asc: 'ASC',
+      limit: 'Primi N',
+      inputVar: 'Variabile di input',
+      selectVariableKeyPlaceholder: 'Seleziona la chiave della variabile secondaria',
+      filterConditionComparisonOperator: 'Operatore di confronto delle condizioni di filtro',
+      filterCondition: 'Condizione del filtro',
+      filterConditionKey: 'Chiave condizione filtro',
+      desc: 'DESC',
+      filterConditionComparisonValue: 'Valore della condizione di filtro',
+      orderBy: 'Ordina per',
+      extractsCondition: 'Estrai l\'elemento N',
+    },
+    agent: {
+      strategy: {
+        selectTip: 'Seleziona la strategia agentica',
+        searchPlaceholder: 'Strategia agente di ricerca',
+        label: 'Strategia agentica',
+        configureTipDesc: 'Dopo aver configurato la strategia agentic, questo nodo caricher脿 automaticamente le configurazioni rimanenti. La strategia influenzer脿 il meccanismo del ragionamento con strumenti a pi霉 fasi.',
+        tooltip: 'Diverse strategie agentiche determinano il modo in cui il sistema pianifica ed esegue le chiamate agli strumenti in pi霉 fasi',
+        shortLabel: 'Strategia',
+        configureTip: 'Configurare la strategia agentic.',
+      },
+      pluginInstaller: {
+        installing: 'Installazione',
+        install: 'Installare',
+      },
+      modelNotInMarketplace: {
+        manageInPlugins: 'Gestisci nei plugin',
+        desc: 'Questo modello viene installato dal repository locale o GitHub. Si prega di utilizzare dopo l\'installazione.',
+        title: 'Modello non installato',
+      },
+      modelNotSupport: {
+        descForVersionSwitch: 'La versione del plug-in installata non fornisce questo modello. Fare clic per cambiare versione.',
+        title: 'Modello non supportato',
+        desc: 'La versione del plug-in installata non fornisce questo modello.',
+      },
+      modelSelectorTooltips: {
+        deprecated: 'Questo modello 猫 deprecato',
+      },
+      outputVars: {
+        files: {
+          type: 'Tipo di supporto. Ora supporta solo l\'immagine',
+          title: 'File generati dall\'agente',
+          transfer_method: 'Metodo di trasferimento. Il valore 猫 remote_url o local_file',
+          url: 'URL immagine',
+          upload_file_id: 'Carica l\'ID del file',
+        },
+        text: 'Contenuto generato dall\'agente',
+        json: 'JSON generato dall\'agente',
+      },
+      checkList: {
+        strategyNotSelected: 'Strategia non selezionata',
+      },
+      installPlugin: {
+        cancel: 'Annulla',
+        title: 'Installa il plugin',
+        install: 'Installare',
+        changelog: 'Registro delle modifiche',
+        desc: 'Sto per installare il seguente plugin',
+      },
+      toolNotInstallTooltip: '{{tool}} non 猫 installato',
+      modelNotSelected: 'Modello non selezionato',
+      modelNotInstallTooltip: 'Questo modello non 猫 installato',
+      notAuthorized: 'Non autorizzato',
+      learnMore: 'Ulteriori informazioni',
+      pluginNotInstalledDesc: 'Questo plugin viene installato da GitHub. Vai su Plugin per reinstallare',
+      model: 'modello',
+      configureModel: 'Configura modello',
+      linkToPlugin: 'Collegamento ai plug-in',
+      tools: 'Utensileria',
+      unsupportedStrategy: 'Strategia non supportata',
+      toolNotAuthorizedTooltip: '{{strumento}} Non autorizzato',
+      strategyNotSet: 'Strategia agentica non impostata',
+      toolbox: 'cassetta degli attrezzi',
+      maxIterations: 'Numero massimo di iterazioni',
+      strategyNotInstallTooltip: '{{strategy}} non 猫 installato',
+      strategyNotFoundDesc: 'La versione del plugin installata non fornisce questa strategia.',
+      strategyNotFoundDescAndSwitchVersion: 'La versione del plugin installata non fornisce questa strategia. Fare clic per cambiare versione.',
+      pluginNotInstalled: 'Questo plugin non 猫 installato',
+      pluginNotFoundDesc: 'Questo plugin viene installato da GitHub. Vai su Plugin per reinstallare',
+    },
+    loop: {
+      ErrorMethod: {
+        operationTerminated: 'Terminato',
+        removeAbnormalOutput: 'Rimuovi l\'output anormale',
+        continueOnError: 'Continua con l\'errore',
+      },
+      currentLoop: 'Anello Corrente',
+      breakConditionTip: 'Solo le variabili all\'interno dei cicli con condizioni di terminazione e le variabili di conversazione possono essere riferite.',
+      loopVariables: 'Variabili di ciclo',
+      inputMode: 'Modalit脿 di input',
+      errorResponseMethod: 'Metodo di risposta all\'errore',
+      error_one: '{{count}} Errore',
+      loop_one: '{{count}} Ciclo',
+      loopMaxCount: 'Conteggio massimo dei loop',
+      breakCondition: 'Condizione di terminazione del ciclo',
+      comma: ',',
+      loopNode: 'Nodo Ciclico',
+      finalLoopVariables: 'Variabili del ciclo finale',
+      loopMaxCountError: 'Si prega di inserire un conteggio massimo di cicli valido, compreso tra 1 e {{maxCount}}',
+      currentLoopCount: 'Conteggio attuale del ciclo: {{count}}',
+      input: 'Input',
+      setLoopVariables: 'Imposta le variabili all\'interno dell\'ambito del ciclo',
+      deleteTitle: 'Elimina nodo ciclo?',
+      output: 'Variabile di Output',
+      initialLoopVariables: 'Variabili di loop iniziali',
+      deleteDesc: 'Cancellare il nodo di ciclo rimuover脿 tutti i nodi figli',
+      loop_other: '{{count}} anelli',
+      variableName: 'Nome Variabile',
+      totalLoopCount: 'Conteggio totale dei cicli: {{count}}',
+      exitConditionTip: 'Un nodo di ciclo ha bisogno di almeno una condizione di uscita.',
+      error_other: '{{count}} Errori',
+    },
+  },
+  tracing: {
+    stopBy: 'Interrotto da {{user}}',
+  },
+  variableReference: {
+    noAvailableVars: 'Nessuna variabile disponibile',
+    noAssignedVars: 'Nessuna variabile assegnata disponibile',
+    noVarsForOperation: 'Non ci sono variabili disponibili per l\'assegnazione con l\'operazione selezionata.',
+    assignedVarsDescription: 'Le variabili assegnate devono essere variabili scrivibili, ad esempio',
+    conversationVars: 'Variabili di conversazione',
+  },
+  versionHistory: {
+    filter: {
+      reset: 'Ripristina filtro',
+      all: 'Tutto',
+      onlyYours: 'Solo tuo',
+      empty: 'Nessuna cronologia delle versioni corrispondente trovata',
+      onlyShowNamedVersions: 'Mostra solo le versioni con nome',
+    },
+    editField: {
+      titleLengthLimit: 'Il titolo non pu貌 superare {{limit}} caratteri',
+      releaseNotes: 'Note di rilascio',
+      title: 'Titolo',
+      releaseNotesLengthLimit: 'Le note di rilascio non possono superare i {{limit}} caratteri',
+    },
+    action: {
+      restoreSuccess: 'Versione ripristinata',
+      restoreFailure: 'Impossibile ripristinare la versione',
+      deleteSuccess: 'Versione eliminata',
+      updateSuccess: 'Versione aggiornata',
+      deleteFailure: 'Impossibile eliminare la versione',
+      updateFailure: 'Impossibile aggiornare la versione',
+    },
+    latest: 'Ultimo',
+    defaultName: 'Versione senza titolo',
+    deletionTip: 'La cancellazione 猫 irreversibile, si prega di confermare.',
+    nameThisVersion: 'Chiamare questa versione',
+    editVersionInfo: 'Modifica le informazioni sulla versione',
+    releaseNotesPlaceholder: 'Descrivi cosa 猫 cambiato',
+    currentDraft: 'Bozza attuale',
+    restorationTip: 'Dopo il ripristino della versione, la bozza attuale verr脿 sovrascritta.',
+    title: 'Versioni',
+  },
+}
+
+export default translation
diff --git a/i18n/ja-JP/app-annotation.ts b/i18n/ja-JP/app-annotation.ts
new file mode 100644
index 0000000..297e01d
--- /dev/null
+++ b/i18n/ja-JP/app-annotation.ts
@@ -0,0 +1,90 @@
+const translation = {
+  title: '娉ㄩ噲',
+  name: '娉ㄩ噲銇繑淇�',
+  editBy: '{{author}} 銇倛銇c仸绶ㄩ泦銇曘倢銇熷洖绛�',
+  noData: {
+    title: '娉ㄩ噲銇屻亗銈娿伨銇涖倱',
+    description: '銇撱亾銇с伅銈€儣銉伄銉囥儛銉冦偘涓伀娉ㄩ噲銈掔法闆嗐仐銇熴倞銆佷竴鎷仹娉ㄩ噲銈掋偆銉炽儩銉笺儓銇椼仧銈娿仐銇﹂珮鍝佽唱銇繙绛斻倰琛屻亞銇撱仺銇屻仹銇嶃伨銇欍��',
+  },
+  table: {
+    header: {
+      question: '璩晱',
+      match: '銉炪儍銉�',
+      response: '蹇滅瓟',
+      answer: '鍥炵瓟',
+      createdAt: '浣滄垚鏃ユ檪',
+      hits: '銉掋儍銉堟暟',
+      actions: '銈€偗銈枫儳銉�',
+      addAnnotation: '娉ㄩ噲銈掕拷鍔�',
+      bulkImport: '涓�鎷偆銉炽儩銉笺儓',
+      bulkExport: '涓�鎷偍銈偣銉濄兗銉�',
+      clearAll: '銇欍伖銇︺伄娉ㄩ噲銈掋偗銉偄',
+    },
+  },
+  editModal: {
+    title: '娉ㄩ噲銇繑淇°倰绶ㄩ泦',
+    queryName: '銉︺兗銈躲兗銇偗銈ㄣ儶',
+    answerName: '銈广儓銉笺儶銉笺儐銉┿兗銉溿儍銉�',
+    yourAnswer: '璨存柟銇洖绛�',
+    answerPlaceholder: '銇撱亾銇洖绛斻倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+    yourQuery: '銇傘仾銇熴伄銈偍銉�',
+    queryPlaceholder: '銇撱亾銇偗銈ㄣ儶銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    removeThisCache: '銇撱伄娉ㄩ噲銈掑墛闄�',
+    createdAt: '浣滄垚鏃ユ檪',
+  },
+  addModal: {
+    title: '娉ㄩ噲銇繑淇°倰杩藉姞',
+    queryName: '璩晱',
+    answerName: '鍥炵瓟',
+    answerPlaceholder: '銇撱亾銇洖绛斻倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+    queryPlaceholder: '銇撱亾銇唱鍟忋倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+    createNext: '鍒ャ伄娉ㄩ噲浠樸亶銇繙绛斻倰杩藉姞',
+  },
+  batchModal: {
+    title: '涓�鎷偆銉炽儩銉笺儓',
+    csvUploadTitle: 'CSV銉曘偂銈ゃ儷銈掋亾銇撱伀銉夈儵銉冦偘锛嗐儔銉儍銉椼仚銈嬨亱銆�',
+    browse: '鍙傜収',
+    tip: 'CSV銉曘偂銈ゃ儷銇互涓嬨伄妲嬮�犮伀婧栨嫚銇欍倠蹇呰銇屻亗銈娿伨銇�:',
+    question: '璩晱',
+    answer: '鍥炵瓟',
+    contentTitle: '銉併儯銉炽偗銇唴瀹�',
+    content: '鍐呭',
+    template: '銉嗐兂銉椼儸銉笺儓銈掋亾銇撱亱銈夈儉銈︺兂銉兗銉�',
+    cancel: '銈儯銉炽偦銉�',
+    run: '涓�鎷疅琛�',
+    runError: '涓�鎷疅琛屻伀澶辨晽銇椼伨銇椼仧',
+    processing: '涓�鎷嚘鐞嗕腑',
+    completed: '銈ゃ兂銉濄兗銉堛亴瀹屼簡銇椼伨銇椼仧',
+    error: '銈ゃ兂銉濄兗銉堛偍銉┿兗',
+    ok: 'OK',
+  },
+  errorMessage: {
+    answerRequired: '鍥炵瓟銇繀闋堛仹銇�',
+    queryRequired: '璩晱銇繀闋堛仹銇�',
+  },
+  viewModal: {
+    annotatedResponse: '娉ㄩ噲銇繑淇�',
+    hitHistory: '銉掋儍銉堝饱姝�',
+    hit: '銉掋儍銉�',
+    hits: '銉掋儍銉堟暟',
+    noHitHistory: '銉掋儍銉堝饱姝淬伅銇傘倞銇俱仜銈�',
+  },
+  hitHistoryTable: {
+    question: '璩晱',
+    query: '銈偍銉�',
+    match: '涓�鑷�',
+    response: '蹇滅瓟',
+    source: '銈姐兗銈�',
+    score: '銈广偝銈�',
+    time: '鏅傞枔',
+  },
+  initSetup: {
+    title: '娉ㄩ噲銇繑淇°伄鍒濇湡瑷畾',
+    configTitle: '娉ㄩ噲銇繑淇°伄瑷畾',
+    confirmBtn: '淇濆瓨銇椼仸鏈夊姽銇仚銈�',
+    configConfirmBtn: '淇濆瓨',
+  },
+  embeddingModelSwitchTip: '娉ㄩ噲銉嗐偔銈广儓銇儥銈儓銉寲銉€儑銉仹銇欍�傘儮銉囥儷銈掑垏銈婃浛銇堛倠銇ㄥ啀鍩嬨倎杈笺伩銇岃銈忋倢銆佽拷鍔犮伄銈炽偣銉堛亴鐧虹敓銇椼伨銇欍��',
+}
+
+export default translation
diff --git a/i18n/ja-JP/app-api.ts b/i18n/ja-JP/app-api.ts
new file mode 100644
index 0000000..4d30a71
--- /dev/null
+++ b/i18n/ja-JP/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'API銈点兗銉愩兗',
+  apiKey: 'API銈兗',
+  status: '銈广儐銉笺偪銈�',
+  disabled: '鐒″姽',
+  ok: '绋煎儘涓�',
+  copy: '銈炽償銉�',
+  copied: '銈炽償銉兼笀銇�',
+  play: '鍐嶇敓',
+  pause: '涓�鏅傚仠姝�',
+  playing: '鍐嶇敓涓�',
+  loading: '瑾伩杈笺伩涓�',
+  merMaid: {
+    rerender: '鍐嶃儸銉炽儉銉兂銈�',
+  },
+  never: '銇仐',
+  apiKeyModal: {
+    apiSecretKey: 'API銈枫兗銈儸銉冦儓銈兗',
+    apiSecretKeyTips: 'API銇偑鐢ㄣ倰闃层亹銇熴倎銇�丄PI銈兗銈掍繚璀枫仐銇︺亸銇犮仌銇勩�傘儠銉兂銉堛偍銉炽儔銇偝銉笺儔銇у钩鏂囥仺銇椼仸浣跨敤銇椼仾銇勩仹銇忋仩銇曘亜銆�:)',
+    createNewSecretKey: '鏂般仐銇勩偡銉笺偗銉儍銉堛偔銉笺倰浣滄垚',
+    secretKey: '銈枫兗銈儸銉冦儓銈兗',
+    created: '浣滄垚鏃ユ檪',
+    lastUsed: '鏈�绲備娇鐢ㄦ棩鏅�',
+    generateTips: '銇撱伄銈兗銈掑畨鍏ㄣ仹銈€偗銈汇偣鍙兘銇牬鎵�銇繚绠°仐銇︺亸銇犮仌銇勩��',
+  },
+  actionMsg: {
+    deleteConfirmTitle: '銇撱伄銈枫兗銈儸銉冦儓銈兗銈掑墛闄ゃ仐銇俱仚銇嬶紵',
+    deleteConfirmTips: '銇撱伄鎿嶄綔銇厓銇埢銇欍亾銇ㄣ伅銇с亶銇俱仜銈撱��',
+    ok: 'OK',
+  },
+  completionMode: {
+    title: '瑁滃畬銈€儣銉狝PI',
+    info: '瑷樹簨銆佽绱勩�佺炕瑷炽仾銇┿伄楂樺搧璩仾銉嗐偔銈广儓鐢熸垚銇伅銆併儲銉笺偠銉笺伄鍏ュ姏銈掍娇鐢ㄣ仐銇熻瀹屻儭銉冦偦銉笺偢API銈掍娇鐢ㄣ仐銇俱仚銆傘儐銈偣銉堢敓鎴愩伅銆丏ify Prompt Engineering銇цō瀹氥仌銈屻仧銉€儑銉儜銉┿儭銉笺偪銇ㄣ儣銉兂銉椼儓銉嗐兂銉椼儸銉笺儓銇緷瀛樸仐銇︺亜銇俱仚銆�',
+    createCompletionApi: '瑁滃畬銉°儍銈汇兗銈搞伄浣滄垚',
+    createCompletionApiTip: '璩枒蹇滅瓟銉€兗銉夈倰銈点儩銉笺儓銇欍倠銇熴倎銇�佽瀹屻儭銉冦偦銉笺偢銈掍綔鎴愩仐銇俱仚銆�',
+    inputsTips: '锛堛偑銉椼偡銉с兂锛塒rompt Eng銇鏁般伀瀵惧繙銇欍倠銈兗銇ㄥ�ゃ伄銉氥偄銇ㄣ仐銇︺儲銉笺偠銉煎叆鍔涖儠銈c兗銉儔銈掓彁渚涖仐銇俱仚銆傘偔銉笺伅澶夋暟鍚嶃仹銆佸�ゃ伅銉戙儵銉°兗銈裤伄鍊ゃ仹銇欍�傘儠銈c兗銉儔銇偪銈ゃ儣銇孲elect銇牬鍚堛�侀�佷俊銇曘倢銈嬪�ゃ伅浜嬪墠銇ō瀹氥仌銈屻仧閬告姙鑲€伄銇勩仛銈屻亱銇с亗銈嬪繀瑕併亴銇傘倞銇俱仚銆�',
+    queryTips: '銉︺兗銈躲兗銇叆鍔涖儐銈偣銉堝唴瀹广��',
+    blocking: '銉栥儹銉冦偔銉炽偘銈裤偆銉椼仹銆佸疅琛屻亴瀹屼簡銇椼仸绲愭灉銇岃繑銇曘倢銈嬨伨銇у緟姗熴仐銇俱仚銆傦紙鍑︾悊銇岄暦銇勫牬鍚堛�併儶銈偍銈广儓銇腑鏂仌銈屻倠鍫村悎銇屻亗銈娿伨銇欙級',
+    streaming: '銈广儓銉兗銉熴兂銈般伄杩斿嵈銆係SE锛圫erver-Sent Events锛夈伀鍩恒仴銇勩仧銈广儓銉兗銉熴兂銈般伄杩斿嵈銇疅瑁呫��',
+    messageFeedbackApi: '銉°儍銈汇兗銈搞儠銈c兗銉夈儛銉冦偗锛堛亜銇勩伃锛�',
+    messageFeedbackApiTip: '銈ㄣ兂銉夈儲銉笺偠銉笺伄浠c倧銈娿伀鍙椾俊銇椼仧銉°儍銈汇兗銈搞倰銆屻亜銇勩伃銆嶃伨銇熴伅銆屻亜銇勩伃銆嶃仹瑭曚尽銇椼伨銇欍�傘亾銇儑銉笺偪銇儹銈帮紗娉ㄩ噲銉氥兗銈搞仹琛ㄧず銇曘倢銆佸皢鏉ャ伄銉€儑銉伄寰鏁淬伀浣跨敤銇曘倢銇俱仚銆�',
+    messageIDTip: '銉°儍銈汇兗銈窱D',
+    ratingTip: '銇勩亜銇伨銇熴伅銇勩亜銇�乶ull銇厓銇埢銇�',
+    parametersApi: '銈€儣銉偙銉笺偡銉с兂銉戙儵銉°兗銈挎儏鍫便伄鍙栧緱',
+    parametersApiTip: '澶夋暟鍚嶃�併儠銈c兗銉儔鍚嶃�併偪銈ゃ儣銆併儑銉曘偐銉儓鍊ゃ倰鍚個瑷畾娓堛伩銇叆鍔涖儜銉┿儭銉笺偪銈掑彇寰椼仐銇俱仚銆傞�氬父銆併亾銈屻倝銇儠銈c兗銉儔銈掋儠銈┿兗銉犮伀琛ㄧず銇椼仧銈娿�併偗銉┿偆銈€兂銉堛伄瑾伩杈笺伩寰屻伀銉囥儠銈┿儷銉堝�ゃ倰鍏ュ姏銇椼仧銈娿仚銈嬨仧銈併伀浣跨敤銇曘倢銇俱仚銆�',
+  },
+  chatMode: {
+    title: '銉併儯銉冦儓銈€儣銉狝PI',
+    info: '璩枒蹇滅瓟褰㈠紡銈掍娇鐢ㄣ仐銇熷鐩殑銇瑭卞瀷銈€儣銉偙銉笺偡銉с兂銇伅銆併儊銉c儍銉堛儭銉冦偦銉笺偢API銈掑懠銇冲嚭銇椼仸瀵捐┍銈掗枊濮嬨仐銇俱仚銆傝繑銇曘倢銇焎onversation_id銈掓浮銇欍亾銇ㄣ仹銆佺稒缍氱殑銇細瑭便倰缍寔銇椼伨銇欍�傚繙绛斻儜銉┿儭銉笺偪銇ㄣ儐銉炽儣銉兗銉堛伅銆丏ify Prompt Eng銇ō瀹氥伀渚濆瓨銇椼伨銇欍��',
+    createChatApi: '銉併儯銉冦儓銉°儍銈汇兗銈搞伄浣滄垚',
+    createChatApiTip: '鏂般仐銇勪細瑭便儭銉冦偦銉笺偢銈掍綔鎴愩仚銈嬨亱銆佹棦瀛樸伄瀵捐┍銈掔稒缍氥仐銇俱仚銆�',
+    inputsTips: '锛堛偑銉椼偡銉с兂锛塒rompt Eng銇鏁般伀瀵惧繙銇欍倠銈兗銇ㄥ�ゃ伄銉氥偄銇ㄣ仐銇︺儲銉笺偠銉煎叆鍔涖儠銈c兗銉儔銈掓彁渚涖仐銇俱仚銆傘偔銉笺伅澶夋暟鍚嶃仹銆佸�ゃ伅銉戙儵銉°兗銈裤伄鍊ゃ仹銇欍�傘儠銈c兗銉儔銇偪銈ゃ儣銇孲elect銇牬鍚堛�侀�佷俊銇曘倢銈嬪�ゃ伅浜嬪墠銇ō瀹氥仌銈屻仧閬告姙鑲€伄銇勩仛銈屻亱銇с亗銈嬪繀瑕併亴銇傘倞銇俱仚銆�',
+    queryTips: '銉︺兗銈躲兗銇叆鍔�/璩晱鍐呭',
+    blocking: '銉栥儹銉冦偔銉炽偘銈裤偆銉椼仹銆佸疅琛屻亴瀹屼簡銇椼仸绲愭灉銇岃繑銇曘倢銈嬨伨銇у緟姗熴仐銇俱仚銆傦紙鍑︾悊銇岄暦銇勫牬鍚堛�併儶銈偍銈广儓銇腑鏂仌銈屻倠鍫村悎銇屻亗銈娿伨銇欙級',
+    streaming: '銈广儓銉兗銉熴兂銈般伄杩斿嵈銆係SE锛圫erver-Sent Events锛夈伀鍩恒仴銇勩仧銈广儓銉兗銉熴兂銈般伄杩斿嵈銇疅瑁呫��',
+    conversationIdTip: '锛堛偑銉椼偡銉с兂锛変細瑭盜D锛氬垵鍥炪伄浼氳┍銇牬鍚堛伅绌虹櫧銇伨銇俱伀銇椼仸銇娿亶銆佺稒缍氥仚銈嬪牬鍚堛伅銈炽兂銉嗐偔銈广儓銇嬨倝conversation_id銈掓浮銇椼伨銇欍��',
+    messageFeedbackApi: '銉°儍銈汇兗銈哥鏈儲銉笺偠銉笺儠銈c兗銉夈儛銉冦偗銆併亜銇勩伃',
+    messageFeedbackApiTip: '銈ㄣ兂銉夈儲銉笺偠銉笺伄浠c倧銈娿伀鍙椾俊銇椼仧銉°儍銈汇兗銈搞倰銆屻亜銇勩伃銆嶃伨銇熴伅銆屻亜銇勩伃銆嶃仹瑭曚尽銇椼伨銇欍�傘亾銇儑銉笺偪銇儹銈帮紗娉ㄩ噲銉氥兗銈搞仹琛ㄧず銇曘倢銆佸皢鏉ャ伄銉€儑銉伄寰鏁淬伀浣跨敤銇曘倢銇俱仚銆�',
+    messageIDTip: '銉°儍銈汇兗銈窱D',
+    ratingTip: '銇勩亜銇伨銇熴伅銇勩亜銇�乶ull銇厓銇埢銇�',
+    chatMsgHistoryApi: '銉併儯銉冦儓灞ユ銉°儍銈汇兗銈搞伄鍙栧緱',
+    chatMsgHistoryApiTip: '鏈�鍒濄伄銉氥兗銈搞伅鏈�鏂般伄銆宭imit銆嶃儛銉笺倰杩斻仐銇俱仚銆傞�嗛爢銇с仚銆�',
+    chatMsgHistoryConversationIdTip: '浼氳┍ID',
+    chatMsgHistoryFirstId: '鐝惧湪銇儦銉笺偢銇渶鍒濄伄銉併儯銉冦儓銉偝銉笺儔銇甀D銆傘儑銉曘偐銉儓銇仾銇椼��',
+    chatMsgHistoryLimit: '1鍥炪伄銉偗銈ㄣ偣銉堛仹杩斻仌銈屻倠銉併儯銉冦儓銇暟',
+    conversationsListApi: '浼氳┍銉偣銉堛伄鍙栧緱',
+    conversationsListApiTip: '鐝惧湪銇儲銉笺偠銉笺伄銈汇儍銈枫儳銉炽儶銈广儓銈掑彇寰椼仐銇俱仚銆傘儑銉曘偐銉儓銇с伅銆佹渶寰屻伄20銇偦銉冦偡銉с兂銇岃繑銇曘倢銇俱仚銆�',
+    conversationsListFirstIdTip: '鐝惧湪銇儦銉笺偢銇渶寰屻伄銉偝銉笺儔銇甀D銆併儑銉曘偐銉儓銇仾銇椼��',
+    conversationsListLimitTip: '1鍥炪伄銉偗銈ㄣ偣銉堛仹杩斻仌銈屻倠銉併儯銉冦儓銇暟',
+    conversationRenamingApi: '浼氳┍銇悕鍓嶅鏇�',
+    conversationRenamingApiTip: '浼氳┍銇悕鍓嶃倰澶夋洿銇椼伨銇欍�傚悕鍓嶃伅銉炪儷銉併偦銉冦偡銉с兂銈儵銈ゃ偄銉炽儓銈ゃ兂銈裤兗銉曘偋銉笺偣銇〃绀恒仌銈屻伨銇欍��',
+    conversationRenamingNameTip: '鏂般仐銇勫悕鍓�',
+    parametersApi: '銈€儣銉偙銉笺偡銉с兂銉戙儵銉°兗銈挎儏鍫便伄鍙栧緱',
+    parametersApiTip: '澶夋暟鍚嶃�併儠銈c兗銉儔鍚嶃�併偪銈ゃ儣銆併儑銉曘偐銉儓鍊ゃ倰鍚個瑷畾娓堛伩銇叆鍔涖儜銉┿儭銉笺偪銈掑彇寰椼仐銇俱仚銆傞�氬父銆併亾銈屻倝銇儠銈c兗銉儔銈掋儠銈┿兗銉犮伀琛ㄧず銇椼仧銈娿�併偗銉┿偆銈€兂銉堛伄瑾伩杈笺伩寰屻伀銉囥儠銈┿儷銉堝�ゃ倰鍏ュ姏銇椼仧銈娿仚銈嬨仧銈併伀浣跨敤銇曘倢銇俱仚銆�',
+  },
+  develop: {
+    requestBody: '銉偗銈ㄣ偣銉堛儨銉囥偅',
+    pathParams: '銉戙偣銉戙儵銉°兗銈�',
+    query: '銈偍銉�',
+    toc: '鍐呭',
+  },
+  regenerate: '鍐嶇敓',
+}
+
+export default translation
diff --git a/i18n/ja-JP/app-debug.ts b/i18n/ja-JP/app-debug.ts
new file mode 100644
index 0000000..23fc7ad
--- /dev/null
+++ b/i18n/ja-JP/app-debug.ts
@@ -0,0 +1,527 @@
+const translation = {
+  pageTitle: {
+    line1: '銉椼儹銉炽儣銉�',
+    line2: '銈ㄣ兂銈搞儖銈€儶銉炽偘',
+  },
+  orchestrate: '銈兗銈便偣銉堛儸銉笺偡銉с兂',
+  promptMode: {
+    simple: '銈ㄣ偔銈广儜銉笺儓銉€兗銉夈伀鍒囥倞鏇裤亪銇︺�丳ROMPT鍏ㄤ綋銈掔法闆嗐仐銇俱仚',
+    advanced: '銈ㄣ偔銈广儜銉笺儓銉€兗銉�',
+    switchBack: '鍩烘湰銉€兗銉夈伀鎴汇倠',
+    advancedWarning: {
+      title: '銈ㄣ偔銈广儜銉笺儓銉€兗銉夈伀鍒囥倞鏇裤亪銇俱仐銇熴�侾ROMPT銈掑鏇淬仚銈嬨仺銆佸熀鏈儮銉笺儔銇埢銈嬨亾銇ㄣ伅銇с亶銇俱仜銈撱��',
+      description: '銈ㄣ偔銈广儜銉笺儓銉€兗銉夈仹銇�丳ROMPT鍏ㄤ綋銈掔法闆嗐仹銇嶃伨銇欍��',
+      learnMore: '瑭崇窗銇亾銇°倝',
+      ok: 'OK',
+    },
+    operation: {
+      addMessage: '銉°儍銈汇兗銈搞倰杩藉姞',
+    },
+    contextMissing: '銈炽兂銉嗐偔銈广儓銈炽兂銉濄兗銉嶃兂銉堛亴瑕嬨仱銇嬨倞銇俱仜銈撱�傘儣銉兂銉椼儓銇姽鏋溿亴鍗佸垎銇с仾銇勫牬鍚堛亴銇傘倞銇俱仚銆�',
+  },
+  operation: {
+    applyConfig: '鍏枊',
+    resetConfig: '銉偦銉冦儓',
+    debugConfig: '銉囥儛銉冦偘',
+    addFeature: '姗熻兘銈掕拷鍔�',
+    automatic: '鑷嫊',
+    stopResponding: '蹇滅瓟銈掑仠姝�',
+    agree: '銇勩亜銇�',
+    disagree: '銇勩亜銇�',
+    cancelAgree: '銇勩亜銇倰銈儯銉炽偦銉�',
+    cancelDisagree: '銇勩亜銇堛倰銈儯銉炽偦銉�',
+    userAction: '銉︺兗銈躲兗',
+  },
+  notSetAPIKey: {
+    title: 'LLM銉椼儹銉愩偆銉�銉笺偔銉笺亴瑷畾銇曘倢銇︺亜銇俱仜銈�',
+    trailFinished: '銉堛儵銈ゃ偄銉祩浜�',
+    description: 'LLM銉椼儹銉愩偆銉�銉笺偔銉笺亴瑷畾銇曘倢銇︺亜銇俱仜銈撱�傘儑銉愩儍銈般仚銈嬪墠銇ō瀹氥仚銈嬪繀瑕併亴銇傘倞銇俱仚銆�',
+    settingBtn: '瑷畾銇Щ鍕�',
+  },
+  trailUseGPT4Info: {
+    title: '鐝惧湪銆乬pt-4銇偟銉濄兗銉堛仌銈屻仸銇勩伨銇涖倱',
+    description: 'gpt-4銈掍娇鐢ㄣ仚銈嬨伀銇�丄PI銈兗銈掕ō瀹氥仐銇︺亸銇犮仌銇勩��',
+  },
+  feature: {
+    groupChat: {
+      title: '銉併儯銉冦儓銇挤鍖�',
+      description: '銈€儣銉伄浜嬪墠浼氳┍瑷畾銈掕拷鍔犮仚銈嬨仺銆併儲銉笺偠銉笺偍銈偣銉氥儶銈ㄣ兂銈广亴鍚戜笂銇椼伨銇欍��',
+    },
+    groupExperience: {
+      title: '銈ㄣ偗銈广儦銉偍銉炽偣銇挤鍖�',
+    },
+    conversationOpener: {
+      title: '浼氳┍銇枊濮�',
+      description: '銉併儯銉冦儓銈€儣銉仹銇�丄I銇屻儲銉笺偠銉笺伀鏈�鍒濄伀銈€偗銉嗐偅銉栥伀瑭便仐銇嬨亼銈嬫渶鍒濄伄鏂囥伅銆侀�氬父銆佹瓝杩庛儭銉冦偦銉笺偢銇ㄣ仐銇︿娇鐢ㄣ仌銈屻伨銇欍��',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: '銉曘偐銉兗銈€儍銉�',
+      description: '娆°伄璩晱銇彁妗堛倰瑷畾銇欍倠銇ㄣ�併儲銉笺偠銉笺伀銈堛倞鑹亜銉併儯銉冦儓銇屾彁渚涖仌銈屻伨銇欍��',
+      resDes: '銉︺兗銈躲兗銇銇唱鍟忋伀闁€仚銈�3銇ゃ伄鎻愭銆�',
+      tryToAsk: '璩晱銇椼仸銇裤仸銇忋仩銇曘亜',
+    },
+    moreLikeThis: {
+      title: '銇撱倢銇技銇熴倐銇�',
+      description: '涓�搴︺伀瑜囨暟銇儐銈偣銉堛倰鐢熸垚銇椼�佺法闆嗐仐銇︾敓鎴愩倰缍氥亼銈�',
+      generateNumTip: '鐢熸垚鍥炴暟',
+      tip: '銇撱伄姗熻兘銈掍娇鐢ㄣ仚銈嬨仺銆佽拷鍔犮伄銉堛兗銈兂銈兗銉愩兗銉樸儍銉夈亴鐧虹敓銇椼伨銇�',
+    },
+    speechToText: {
+      title: '闊冲0銇嬨倝銉嗐偔銈广儓銇�',
+      description: '鏈夊姽銇仚銈嬨仺銆侀煶澹板叆鍔涖倰浣跨敤銇с亶銇俱仚銆�',
+      resDes: '闊冲0鍏ュ姏銇屾湁鍔广伀銇仯銇︺亜銇俱仚',
+    },
+    textToSpeech: {
+      title: '銉嗐偔銈广儓銇嬨倝闊冲0銇�',
+      description: '鏈夊姽銇仚銈嬨仺銆併儐銈偣銉堛倰闊冲0銇鎻涖仹銇嶃伨銇欍��',
+      resDes: '銉嗐偔銈广儓銇嬨倝銈兗銉囥偅銈伕銇鎻涖亴鏈夊姽銇仾銇c仸銇勩伨銇�',
+    },
+    citation: {
+      title: '寮曠敤銇ㄥ赴灞�',
+      description: '鏈夊姽銇仚銈嬨仺銆佺敓鎴愩仌銈屻仧銈炽兂銉嗐兂銉勩伄銈姐兗銈广儔銈儱銉°兂銉堛仺甯板睘銈汇偗銈枫儳銉炽亴琛ㄧず銇曘倢銇俱仚銆�',
+      resDes: '寮曠敤銇ㄥ赴灞炪亴鏈夊姽銇仾銇c仸銇勩伨銇�',
+    },
+    annotation: {
+      title: '娉ㄩ噲杩斾俊',
+      description: '椤炰技銇儲銉笺偠銉艰唱鍟忋仺銇劒鍏堜竴鑷淬伄銇熴倎銇偔銉c儍銈枫儱銇珮鍝佽唱銇繙绛斻倰鎵嬪嫊銇ц拷鍔犮仹銇嶃伨銇欍��',
+      resDes: '娉ㄩ噲蹇滅瓟銇屾湁鍔广伀銇仯銇︺亜銇俱仚',
+      scoreThreshold: {
+        title: '銈广偝銈㈤柧鍊�',
+        description: '娉ㄩ噲杩斾俊銇浼兼�ч柧鍊ゃ倰瑷畾銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍��',
+        easyMatch: '绨″崢銇優銉冦儊',
+        accurateMatch: '姝g⒑銇優銉冦儊',
+      },
+      matchVariable: {
+        title: '銉炪儍銉佸鏁�',
+        choosePlaceholder: '銉炪儍銉佸鏁般倰閬告姙',
+      },
+      cacheManagement: '娉ㄩ噲',
+      cached: '娉ㄩ噲浠樸亶',
+      remove: '鍓婇櫎',
+      removeConfirm: '銇撱伄娉ㄩ噲銈掑墛闄ゃ仐銇俱仚銇嬶紵',
+      add: '娉ㄩ噲銈掕拷鍔�',
+      edit: '娉ㄩ噲銈掔法闆�',
+    },
+    dataSet: {
+      title: '銈炽兂銉嗐偔銈广儓',
+      noData: '銈炽兂銉嗐偔銈广儓銇ㄣ仐銇︾煡璀樸倰銈ゃ兂銉濄兗銉堛仹銇嶃伨銇�',
+      words: '鍗樿獮',
+      textBlocks: '銉嗐偔銈广儓銉栥儹銉冦偗',
+      selectTitle: '鍙傜収銇欍倠鐭ヨ瓨銈掗伕鎶�',
+      selected: '閬告姙銇曘倢銇熺煡璀�',
+      noDataSet: '鐭ヨ瓨銇岃銇ゃ亱銈娿伨銇涖倱',
+      toCreate: '浣滄垚銇�层個',
+      notSupportSelectMulti: '鐝惧湪銆佽鏁般伄鐭ヨ瓨銇伕鎶炪伅銈点儩銉笺儓銇曘倢銇︺亜銇俱仜銈�',
+      queryVariable: {
+        title: '銈偍銉鏁�',
+        tip: '銇撱伄澶夋暟銇偝銉炽儐銈偣銉堛伄鍙栧緱銇仧銈併伄銈偍銉叆鍔涖仺銇椼仸浣跨敤銇曘倢銆併亾銇鏁般伄鍏ュ姏銇枹閫c仚銈嬨偝銉炽儐銈偣銉堟儏鍫便倰鍙栧緱銇椼伨銇欍��',
+        choosePlaceholder: '銈偍銉鏁般倰閬告姙',
+        noVar: '澶夋暟銇仐',
+        noVarTip: '澶夋暟銈汇偗銈枫儳銉炽伄涓嬨伀澶夋暟銈掍綔鎴愩仐銇︺亸銇犮仌銇�',
+        unableToQueryDataSet: '鐭ヨ瓨銈掋偗銈ㄣ儶銇с亶銇俱仜銈�',
+        unableToQueryDataSetTip: '鐭ヨ瓨銇偗銈ㄣ儶銇け鏁椼仐銇俱仐銇熴�傛甯搞伀銈偍銉仹銇嶃仾銇嬨仯銇熷牬鍚堛伅銆併偝銉炽儐銈偣銉堛偦銈偡銉с兂銇с偝銉炽儐銈偣銉堛偗銈ㄣ儶澶夋暟銈掗伕鎶炪仐銇︺亸銇犮仌銇勩��',
+        ok: 'OK',
+        contextVarNotEmpty: '銈炽兂銉嗐偔銈广儓銈偍銉鏁般伅绌恒伀銇с亶銇俱仜銈�',
+        deleteContextVarTitle: '澶夋暟 "{{varName}}" 銈掑墛闄ゃ仐銇俱仚銇嬶紵',
+        deleteContextVarTip: '銇撱伄澶夋暟銇偝銉炽儐銈偣銉堛偗銈ㄣ儶澶夋暟銇ㄣ仐銇﹁ō瀹氥仌銈屻仸銇娿倞銆佸墛闄ゃ仚銈嬨仺鐭ヨ瓨銇甯搞仾浣跨敤銇奖闊裤仐銇俱仚銆傚墛闄ゃ仚銈嬪牬鍚堛伅銆併偝銉炽儐銈偣銉堛偦銈偡銉с兂銇у啀閬告姙銇椼仸銇忋仩銇曘亜銆�',
+      },
+    },
+    tools: {
+      title: '銉勩兗銉�',
+      tips: '銉勩兗銉伅銆併儲銉笺偠銉煎叆鍔涖伨銇熴伅澶夋暟銈掋儶銈偍銈广儓銉戙儵銉°兗銈裤兗銇ㄣ仐銇︿娇鐢ㄣ仐銇﹀閮ㄣ儑銉笺偪銈掋偝銉炽儐銈偣銉堛仺銇椼仸銈偍銉仚銈嬨仧銈併伄妯欐簴鐨勩仾API鍛笺伋鍑恒仐鏂规硶銈掓彁渚涖仐銇俱仚銆�',
+      toolsInUse: '{{count}} 鍊嬨伄銉勩兗銉亴浣跨敤涓�',
+      modal: {
+        title: '銉勩兗銉�',
+        toolType: {
+          title: '銉勩兗銉偪銈ゃ儣',
+          placeholder: '銉勩兗銉偪銈ゃ儣銈掗伕鎶炪仐銇︺亸銇犮仌銇�',
+        },
+        name: {
+          title: '鍚嶅墠',
+          placeholder: '鍚嶅墠銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+        },
+        variableName: {
+          title: '澶夋暟鍚�',
+          placeholder: '澶夋暟鍚嶃倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+        },
+      },
+    },
+    conversationHistory: {
+      title: '浼氳┍灞ユ',
+      description: '浼氳┍銇焦鍓层伀鎺ラ牠杈炲悕銈掕ō瀹氥仐銇俱仚',
+      tip: '浼氳┍灞ユ銇湁鍔广伀銇仯銇︺亜銇俱仜銈撱�備笂瑷樸伄銉椼儹銉炽儣銉堛伀 <histories> 銈掕拷鍔犮仐銇︺亸銇犮仌銇勩��',
+      learnMore: '瑭崇窗銇亾銇°倝',
+      editModal: {
+        title: '浼氳┍褰瑰壊鍚嶃伄绶ㄩ泦',
+        userPrefix: '銉︺兗銈躲兗鎺ラ牠杈�',
+        assistantPrefix: '銈€偡銈广偪銉炽儓鎺ラ牠杈�',
+      },
+    },
+    toolbox: {
+      title: '銉勩兗銉儨銉冦偗銈�',
+    },
+    moderation: {
+      title: '銈炽兂銉嗐兂銉勩伄銉€儑銉兗銈枫儳銉�',
+      description: '銉€儑銉兗銈枫儳銉矨PI銈掍娇鐢ㄣ仚銈嬨亱銆佹瀵嗚獮銉偣銉堛倰缍寔銇欍倠銇撱仺銇с�併儮銉囥儷銇嚭鍔涖倰瀹夊叏銇仐銇俱仚銆�',
+      contentEnableLabel: '銉€儑銉兗銉堛兓銈炽兂銉嗐兂銉勩倰鏈夊姽銇仚銈�',
+      allEnabled: '鍏ュ姏/鍑哄姏銈炽兂銉嗐兂銉勩亴鏈夊姽銇仾銇c仸銇勩伨銇�',
+      inputEnabled: '鍏ュ姏銈炽兂銉嗐兂銉勩亴鏈夊姽銇仾銇c仸銇勩伨銇�',
+      outputEnabled: '鍑哄姏銈炽兂銉嗐兂銉勩亴鏈夊姽銇仾銇c仸銇勩伨銇�',
+      modal: {
+        title: '銈炽兂銉嗐兂銉勩伄銉€儑銉兗銈枫儳銉宠ō瀹�',
+        provider: {
+          title: '銉椼儹銉愩偆銉�',
+          openai: 'OpenAI銉€儑銉兗銈枫儳銉�',
+          openaiTip: {
+            prefix: 'OpenAI銉€儑銉兗銈枫儳銉炽伀銇��',
+            suffix: '銇玂penAI API銈兗銇岃ō瀹氥仌銈屻仸銇勩倠蹇呰銇屻亗銈娿伨銇欍��',
+          },
+          keywords: '銈兗銉兗銉�',
+        },
+        keywords: {
+          tip: '1琛屻仈銇ㄣ伀1銇ゃ�佽鍖哄垏銈娿仹鍏ュ姏銇椼仸銇忋仩銇曘亜銆�1琛屻亗銇熴倞鏈�澶�100鏂囧瓧銆�',
+          placeholder: '1琛屻仈銇ㄣ伀銆佽鍖哄垏銈娿仹鍏ュ姏銇椼仸銇忋仩銇曘亜',
+          line: '琛�',
+        },
+        content: {
+          input: '鍏ュ姏銈炽兂銉嗐兂銉勩倰銉€儑銉兗銉�',
+          output: '鍑哄姏銈炽兂銉嗐兂銉勩倰銉€儑銉兗銉�',
+          preset: '銉椼儶銈汇儍銉堣繑淇�',
+          placeholder: '銇撱亾銇儣銉偦銉冦儓杩斾俊銇唴瀹广倰鍏ュ姏',
+          condition: '灏戙仾銇忋仺銈�1銇ゃ伄鍏ュ姏銇娿倛銇冲嚭鍔涖偝銉炽儐銉炽儎銈掋儮銉囥儸銉笺儓銇欍倠',
+          fromApi: '銉椼儶銈汇儍銉堣繑淇°伅API銇倛銇c仸杩斻仌銈屻伨銇�',
+          errorMessage: '銉椼儶銈汇儍銉堣繑淇°伅绌恒伀銇с亶銇俱仜銈�',
+          supportMarkdown: 'Markdown銇屻偟銉濄兗銉堛仌銈屻仸銇勩伨銇�',
+        },
+        openaiNotConfig: {
+          before: 'OpenAI銉€儑銉兗銈枫儳銉炽伀銇��',
+          after: '銇玂penAI API銈兗銇岃ō瀹氥仌銈屻仸銇勩倠蹇呰銇屻亗銈娿伨銇欍��',
+        },
+      },
+    },
+    fileUpload: {
+      title: '銉曘偂銈ゃ儷 銈€儍銉椼儹銉笺儔',
+      description: '銉併儯銉冦儓銇叆鍔涖儨銉冦偗銈广伅鐢诲儚銈勩儔銈儱銉°兂銉堛倓銇濄伄浠栥伄銉曘偂銈ゃ儷銇偄銉冦儣銉兗銉夈倰銈点儩銉笺儓銇椼伨銇欍��',
+      supportedTypes: '銈点儩銉笺儓銇曘倢銈嬨儠銈°偆銉伄銈裤偆銉�',
+      numberLimit: '鏈�澶с偄銉冦儣銉兗銉夋暟',
+      modalTitle: '銉曘偂銈ゃ儷 銈€儍銉椼儹銉笺儔瑷疆',
+    },
+    imageUpload: {
+      title: '鐢诲儚銈€儍銉椼儹銉笺儔',
+      description: '鐢诲儚銈€儍銉椼儹銉笺儔銈掋偟銉濄兗銉堛仚銈�',
+      supportedTypes: '銈点儩銉笺儓銇曘倢銈嬨儠銈°偆銉伄銈裤偆銉�',
+      numberLimit: '鏈�澶с偄銉冦儣銉兗銉夋暟',
+      modalTitle: '鐢诲儚銈€儍銉椼儹銉笺儔瑷疆',
+    },
+    bar: {
+      empty: 'Web銈€儣銉伄銉︺兗銈躲兗銈ㄣ偗銈广儦銉偄銉炽偣銈掑挤鍖栥仌銇涖倠姗熻兘銈掓湁鍔广伀銇欍倠',
+      enableText: '鏈夊姽銇鑳�',
+      manage: '绠$悊',
+    },
+  },
+  codegen: {
+    title: '銈炽兗銉夈偢銈с儘銉兗銈裤兗',
+    description: '銈炽兗銉夈偢銈с儘銉兗銈裤兗銇�佽ō瀹氥仌銈屻仧銉€儑銉倰浣跨敤銇椼仸鎸囩ず銇熀銇ャ亜銇﹂珮鍝佽唱銇偝銉笺儔銈掔敓鎴愩仐銇俱仚銆傛槑纰恒仹瑭崇窗銇寚绀恒倰鎻愪緵銇椼仸銇忋仩銇曘亜銆�',
+    instruction: '鎸囩ず',
+    instructionPlaceholder: '鐢熸垚銇椼仧銇勩偝銉笺儔銇┏绱般仾瑾槑銈掑叆鍔涖仐銇︺亸銇犮仌銇勩��',
+    noDataLine1: '宸﹀伌銇娇鐢ㄤ緥銈掕鍏ャ仐銇︺亸銇犮仌銇�,',
+    noDataLine2: '銈炽兗銉夈伄銉椼儸銉撱儱銉笺亴銇撱仭銈夈伀琛ㄧず銇曘倢銇俱仚銆�',
+    generate: '鐢熸垚',
+    generatedCodeTitle: '鐢熸垚銇曘倢銇熴偝銉笺儔',
+    loading: '銈炽兗銉夈倰鐢熸垚涓�...',
+    apply: '閬╃敤',
+    applyChanges: '澶夋洿銈掗仼鐢�',
+    resTitle: '鐢熸垚銇曘倢銇熴偝銉笺儔',
+    overwriteConfirmTitle: '鏃㈠瓨銇偝銉笺儔銈掍笂鏇搞亶銇椼伨銇欍亱锛�',
+    overwriteConfirmMessage: '銇撱伄鎿嶄綔銇棦瀛樸伄銈炽兗銉夈倰涓婃浉銇嶃仐銇俱仚銆傜稓琛屻仐銇俱仚銇嬶紵',
+  },
+  generate: {
+    title: '銉椼儹銉炽儣銉堢敓鎴愬櫒',
+    description: '銉椼儹銉炽儣銉堢敓鎴愬櫒銇�佽ō瀹氭笀銇裤伄銉€儑銉倰浣裤仯銇︺�侀珮鍝佽唱銇ф閫犵殑銇劒銈屻仧銉椼儹銉炽儣銉堛倰浣滄垚銇欍倠銇熴倎銇渶閬╁寲銈掕銇勩伨銇欍�傚叿浣撶殑銇ц┏绱般仾鎸囩ず銈掋亰鏇搞亶銇忋仩銇曘亜銆�',
+    tryIt: '瑭︺仐銇︺伩銈�',
+    instruction: '鎸囩ず',
+    instructionPlaceHolder: '鍏蜂綋鐨勩仹鏄庣⒑銇寚绀恒倰鍏ュ姏銇椼仸銇忋仩銇曘亜銆�',
+    generate: '鐢熸垚',
+    resTitle: '鐢熸垚銇曘倢銇熴儣銉兂銉椼儓',
+    noDataLine1: '宸﹀伌銇娇鐢ㄤ緥銈掕鍏ャ仐銇︺亸銇犮仌銇�,',
+    noDataLine2: '銈兗銈便偣銉堛儸銉笺偡銉с兂銇儣銉儞銉ャ兗銇屻亾銇°倝銇〃绀恒仌銈屻伨銇欍��',
+    apply: '閬╃敤',
+    loading: '銈€儣銉偙銉笺偡銉с兂銈掑嚘鐞嗕腑銇с仚',
+    overwriteTitle: '鏃㈠瓨銇ō瀹氥倰涓婃浉銇嶃仐銇俱仚銇嬶紵',
+    overwriteMessage: '銇撱伄銉椼儹銉炽儣銉堛倰閬╃敤銇欍倠銇ㄣ�佹棦瀛樸伄瑷畾銇屼笂鏇搞亶銇曘倢銇俱仚銆�',
+    template: {
+      pythonDebugger: {
+        name: 'Python 銉囥儛銉冦偓銉�',
+        instruction: '鎸囩ず銇緭銇c仸銈炽兗銉夈倰鐢熸垚銇椼�併儑銉愩儍銈般倰琛屻亞銉溿儍銉�',
+      },
+      translation: {
+        name: '缈昏ǔ',
+        instruction: '瑜囨暟瑷�瑾炪伀瀵惧繙銇椼仧缈昏ǔ姗熻兘',
+      },
+      professionalAnalyst: {
+        name: '灏傞杸銈€儕銉偣銉�',
+        instruction: '闀锋枃銇儸銉濄兗銉堛亱銈夋礊瀵熴倰寮曘亶鍑恒仐銆併儶銈广偗銈掔壒瀹氥仐銆侀噸瑕佹儏鍫便倰銇俱仺銈併倠',
+      },
+      excelFormulaExpert: {
+        name: '銈ㄣ偗銈汇儷寮忋偍銈偣銉戙兗銉�',
+        instruction: '銉︺兗銈躲兗銇寚绀恒伀鍩恒仴銇嶃�併偍銈偦銉紡銇悊瑙c�佷娇鐢ㄣ�佷綔鎴愩倰銈点儩銉笺儓銇欍倠銉併儯銉冦儓銉溿儍銉�',
+      },
+      travelPlanning: {
+        name: '鏃呰瑷堢敾',
+        instruction: '銉︺兗銈躲兗銇岀啊鍗樸伀鏃呰瑷堢敾銈掔珛銇︺倝銈屻倠銈堛亞銇ō瑷堛仌銈屻仧銉勩兗銉�',
+      },
+      SQLSorcerer: {
+        name: 'SQL銈姐兗銈点儵銉�',
+        instruction: '鏃ュ父瑷�瑾炪倰SQL銈偍銉伀澶夋彌銇欍倠',
+      },
+      GitGud: {
+        name: 'Git gud',
+        instruction: '銉︺兗銈躲兗銇岃杩般仐銇熴儛銉笺偢銉с兂绠$悊銈€偗銈枫儳銉炽伀瀵惧繙銇欍倠Git銈炽優銉炽儔銈掔敓鎴愩仚銈�',
+      },
+      meetingTakeaways: {
+        name: '浼氳銇鐐�',
+        instruction: '璀伴銆侀噸瑕佺偣銆佽鍕曢爡鐩倰鍚個瑕佺磩銈掍綔鎴愩仚銈�',
+      },
+      writingsPolisher: {
+        name: '銉┿偆銉嗐偅銉炽偘銉濄儶銉冦偡銉c兗',
+        instruction: '鏂囩珷銈掓敼鍠勩仚銈嬨仧銈併伄楂樺害銇法闆嗘妧娉曘倰鐢ㄣ亜銈�',
+      },
+    },
+  },
+  resetConfig: {
+    title: '銉偦銉冦儓銈掔⒑瑾嶃仐銇俱仚銇嬶紵',
+    message: '澶夋洿銇岀牬妫勩仌銈屻�佹渶寰屻伀鍏枊銇曘倢銇熸鎴愩亴寰╁厓銇曘倢銇俱仚銆�',
+  },
+  errorMessage: {
+    nameOfKeyRequired: '銈兗銇悕鍓�: {{key}} 銇屽繀瑕併仹銇�',
+    valueOfVarRequired: '{{key}} 銇�ゃ伅绌恒伀銇с亶銇俱仜銈�',
+    queryRequired: '銉偗銈ㄣ偣銉堛儐銈偣銉堛亴蹇呰銇с仚銆�',
+    waitForResponse: '鍓嶃伄銉°儍銈汇兗銈搞伕銇繙绛斻亴瀹屼簡銇欍倠銇俱仹銇婂緟銇°亸銇犮仌銇勩��',
+    waitForBatchResponse: '銉愩儍銉併偪銈广偗銇搞伄蹇滅瓟銇屽畬浜嗐仚銈嬨伨銇с亰寰呫仭銇忋仩銇曘亜銆�',
+    notSelectModel: '銉€儑銉倰閬告姙銇椼仸銇忋仩銇曘亜',
+    waitForImgUpload: '鐢诲儚銇偄銉冦儣銉兗銉夈亴瀹屼簡銇欍倠銇俱仹銇婂緟銇°亸銇犮仌銇�',
+    waitForFileUpload: '銉曘偂銈ゃ儷銇偄銉冦儣銉兗銉夈亴瀹屼簡銇欍倠銇俱仹銇婂緟銇°亸銇犮仌銇�',
+  },
+  warningMessage: {
+    timeoutExceeded: '銈裤偆銉犮偄銈︺儓銇仧銈佺祼鏋溿亴琛ㄧず銇曘倢銇俱仜銈撱�傚畬鍏ㄣ仾绲愭灉銈掓墜銇亜銈屻倠銇熴倎銇伅銆併儹銈般倰鍙傜収銇椼仸銇忋仩銇曘亜銆�',
+  },
+  chatSubTitle: '鎵嬮爢',
+  completionSubTitle: '鎺ラ牠杈炪儣銉兂銉椼儓',
+  promptTip: '銉椼儹銉炽儣銉堛伅銆丄I銇繙绛斻倰鎸囩ず銇ㄥ埗绱勩仹瑾樺皫銇椼伨銇欍�� {{input}} 銇倛銇嗐仾澶夋暟銈掓尶鍏ャ仐銇俱仚銆傘亾銇儣銉兂銉椼儓銇儲銉笺偠銉笺伀銇〃绀恒仌銈屻伨銇涖倱銆�',
+  formattingChangedTitle: '鏇稿紡銇屽鏇淬仌銈屻伨銇椼仧',
+  formattingChangedText: '鏇稿紡銈掑鏇淬仚銈嬨仺銆併儑銉愩儍銈伴牁鍩熴亴銉偦銉冦儓銇曘倢銇俱仚銆傘倛銈嶃仐銇勩仹銇欍亱锛�',
+  variableTitle: '澶夋暟',
+  variableTip: '銉︺兗銈躲兗銇儠銈┿兗銉犮伀澶夋暟銈掑叆鍔涖仐銆併儣銉兂銉椼儓鍐呫伄澶夋暟銈掕嚜鍕曠殑銇疆鎻涖仐銇俱仚銆�',
+  notSetVar: '澶夋暟銈掍娇鐢ㄣ仚銈嬨仺銆併儲銉笺偠銉笺伅銉曘偐銉笺儬銇叆鍔涖仚銈嬮殯銇儣銉兂銉椼儓銇崢瑾炪倓闁嬪銇█钁夈倰灏庡叆銇с亶銇俱仚銆傘儣銉兂銉椼儓銇崢瑾炪伀 "{{input}}" 銈掑叆鍔涖仐銇︺伩銇︺亸銇犮仌銇勩��',
+  autoAddVar: '銉椼儶銉椼儹銉炽儣銉堛仹鍙傜収銇曘倢銇︺亜銈嬫湭瀹氱京銇鏁般亴銇傘倞銇俱仚銆傘儲銉笺偠銉煎叆鍔涖儠銈┿兗銉犮伀杩藉姞銇椼伨銇欍亱锛�',
+  variableTable: {
+    key: '澶夋暟銈兗',
+    name: '銉︺兗銈躲兗鍏ュ姏銉曘偅銉笺儷銉夊悕',
+    optional: '銈儣銈枫儳銉�',
+    type: '鍏ュ姏銈裤偆銉�',
+    action: '銈€偗銈枫儳銉�',
+    typeString: '鏂囧瓧鍒�',
+    typeSelect: '閬告姙',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{key}} 銇繀闋堛仹銇�',
+    tooLong: '{{key}} 銇岄暦銇欍亷銇俱仚銆�30鏂囧瓧銈掕秴銇堛倠銇撱仺銇仹銇嶃伨銇涖倱',
+    notValid: '{{key}} 銇岀劇鍔广仹銇欍�傛枃瀛椼�佹暟瀛椼�併偄銉炽儉銉笺偣銈炽偄銇伩銈掑惈銈併倠銇撱仺銇屻仹銇嶃伨銇�',
+    notStartWithNumber: '{{key}} 銇暟瀛椼仹濮嬨倎銈嬨亾銇ㄣ伅銇с亶銇俱仜銈�',
+    keyAlreadyExists: '{{key}} 銇仚銇с伀瀛樺湪銇椼伨銇�',
+  },
+  otherError: {
+    promptNoBeEmpty: '銉椼儹銉炽儣銉堛倰绌恒伀銇欍倠銇撱仺銇仹銇嶃伨銇涖倱',
+    historyNoBeEmpty: '銉椼儹銉炽儣銉堛伀銇細瑭卞饱姝淬倰瑷畾銇欍倠蹇呰銇屻亗銈娿伨銇�',
+    queryNoBeEmpty: '銉椼儹銉炽儣銉堛伀銈偍銉倰瑷畾銇欍倠蹇呰銇屻亗銈娿伨銇�',
+  },
+  variableConfig: {
+    'addModalTitle': '鍏ュ姏銉曘偅銉笺儷銉夈倰杩藉姞',
+    'editModalTitle': '鍏ュ姏銉曘偅銉笺儷銉夈倰绶ㄩ泦',
+    'description': '{{varName}} 銇鏁拌ō瀹�',
+    'fieldType': '銉曘偅銉笺儷銉夈偪銈ゃ儣',
+    'string': '鐭枃',
+    'text-input': '鐭枃',
+    'paragraph': '娈佃惤',
+    'select': '閬告姙',
+    'number': '鏁板��',
+    'single-file': '鍗樹竴銉曘偂銈ゃ儷',
+    'multi-files': '銉曘偂銈ゃ儷銉偣銉�',
+    'notSet': '瑷畾銇曘倢銇︺亜銇俱仜銈撱�傘儣銉儠銈c儍銈偣銇儣銉兂銉椼儓銇� {{input}} 銈掑叆鍔涖仐銇︺伩銇︺亸銇犮仌銇勩��',
+    'stringTitle': '銉曘偐銉笺儬銉嗐偔銈广儓銉溿儍銈偣銈儣銈枫儳銉�',
+    'maxLength': '鏈�澶ч暦',
+    'options': '銈儣銈枫儳銉�',
+    'addOption': '銈儣銈枫儳銉炽倰杩藉姞',
+    'apiBasedVar': 'API銉欍兗銈广伄澶夋暟',
+    'varName': '澶夋暟鍚�',
+    'labelName': '銉┿儥銉悕',
+    'inputPlaceholder': '鍏ュ姏銇椼仸銇忋仩銇曘亜',
+    'content': '銈炽兂銉嗐兂銉�',
+    'required': '蹇呴爤',
+    'file': {
+      supportFileTypes: '銈点儩銉笺儓銇曘倢銇熴儠銈°偆銉偪銈ゃ儣',
+      image: {
+        name: '鐢诲儚',
+      },
+      audio: {
+        name: '闊冲0',
+      },
+      document: {
+        name: '銉夈偔銉ャ儭銉炽儓',
+      },
+      video: {
+        name: '鏄犲儚',
+      },
+      custom: {
+        name: '浠栥伄銉曘偂銈ゃ儷銈裤偆銉�',
+        description: '浠栥伄銉曘偂銈ゃ儷銈裤偆銉椼倰鎸囧畾銇欍倠銆�',
+        createPlaceholder: '+ 鎷″嫉瀛�, 渚嬶細.doc',
+      },
+    },
+    'uploadFileTypes': '銈€儍銉椼儹銉笺儔銇曘倢銇熴儠銈°偆銉伄銈裤偆銉�',
+    'localUpload': '銉兗銈儷 銈€儍銉椼儹銉笺儔',
+    'both': '涓℃柟',
+    'maxNumberOfUploads': '銈€儍銉椼儹銉笺儔銇渶澶ф暟',
+    'maxNumberTip': '銉夈偔銉ャ儭銉炽儓 < {{docLimit}}, 鐢诲儚 < {{imgLimit}}, 闊冲0 < {{audioLimit}}, 鏄犲儚 < {{videoLimit}}',
+    'errorMsg': {
+      varNameRequired: '澶夋暟鍚嶃伅蹇呴爤銇с仚',
+      labelNameRequired: '銉┿儥銉悕銇繀闋堛仹銇�',
+      varNameCanBeRepeat: '澶夋暟鍚嶃伅绻般倞杩斻仚銇撱仺銇屻仹銇嶃伨銇涖倱',
+      atLeastOneOption: '灏戙仾銇忋仺銈�1銇ゃ伄銈儣銈枫儳銉炽亴蹇呰銇с仚',
+      optionRepeat: '绻般倞杩斻仐銈儣銈枫儳銉炽亴銇傘倞銇俱仚',
+    },
+  },
+  vision: {
+    name: '銉撱偢銉с兂',
+    description: '銉撱偢銉с兂銈掓湁鍔广伀銇欍倠銇ㄣ�併儮銉囥儷銇岀敾鍍忋倰鍙椼亼鍙栥倞銆併仢銈屻伀闁€仚銈嬭唱鍟忋伀绛斻亪銈嬨亾銇ㄣ亴銇с亶銇俱仚銆�',
+    onlySupportVisionModelTip: '銉撱偢銉с兂銉€儑銉伄銇裤倰銈点儩銉笺儓',
+    settings: '瑷畾',
+    visionSettings: {
+      title: '銉撱偢銉с兂瑷畾',
+      resolution: '瑙e儚搴�',
+      resolutionTooltip: `浣庤В鍍忓害銇с伅銆併儮銉囥儷銇綆瑙e儚搴︺伄 512 x 512 銉愩兗銈搞儳銉炽伄鐢诲儚銈掑彈銇戝彇銈夈仜銆佺敾鍍忋倰 65 銉堛兗銈兂銇簣绠椼仹琛ㄧ従銇椼伨銇欍�傘亾銈屻伀銈堛倞銆丄PI 銇屻倛銈婅繀閫熴仾蹇滅瓟銈掕繑銇椼�侀珮銇勮┏绱般亴蹇呰銇儲銉笺偣銈便兗銈广仹銇叆鍔涖儓銉笺偗銉炽倰娑堣不銇椼伨銇欍��
+      \n
+      楂樿В鍍忓害銇с伅銆併伨銇氥儮銉囥儷銇綆瑙e儚搴︺伄鐢诲儚銈掕銇涖�併仢銇緦銆佸叆鍔涚敾鍍忋偟銈ゃ偤銇熀銇ャ亜銇� 512px 銇鏂瑰舰銇┏绱般仾銈儹銉冦儣銈掍綔鎴愩仐銇俱仚銆傝┏绱般仾銈儹銉冦儣銇斻仺銇� 129 銉堛兗銈兂銇簣绠椼倰浣跨敤銇椼伨銇欍�俙,
+      high: '楂�',
+      low: '浣�',
+      uploadMethod: '銈€儍銉椼儹銉笺儔鏂规硶',
+      both: '涓℃柟',
+      localUpload: '銉兗銈儷銈€儍銉椼儹銉笺儔',
+      url: 'URL',
+      uploadLimit: '銈€儍銉椼儹銉笺儔鍒堕檺',
+    },
+  },
+  voice: {
+    name: '闊冲0',
+    defaultDisplay: '銉囥儠銈┿儷銉堛伄闊冲0',
+    description: '銉嗐偔銈广儓瑾伩涓娿亽銇煶澹拌ō瀹�',
+    settings: '瑷畾',
+    voiceSettings: {
+      title: '闊冲0瑷畾',
+      language: '瑷�瑾�',
+      resolutionTooltip: '銉嗐偔銈广儓瑾伩涓娿亽銇煶澹拌█瑾炪倰銈点儩銉笺儓銇椼伨銇欍��',
+      voice: '闊冲0',
+      autoPlay: '鑷嫊鍐嶇敓',
+      autoPlayEnabled: '闁嬨亼銈�',
+      autoPlayDisabled: '闁夈仒銈�',
+    },
+  },
+  openingStatement: {
+    title: '浼氳┍闁嬪',
+    add: '杩藉姞',
+    writeOpener: '銈兗銉椼儕銉笺倰鏇搞亸',
+    placeholder: '銇撱亾銇偑銉笺儣銉娿兗銉°儍銈汇兗銈搞倰鏇搞亜銇︺亸銇犮仌銇勩�傚鏁般倰浣跨敤銇с亶銇俱仚銆倇{variable}} 銈掑叆鍔涖仐銇︺伩銇︺亸銇犮仌銇勩��',
+    openingQuestion: '闁嬪璩晱',
+    noDataPlaceHolder:
+      '銉︺兗銈躲兗銇ㄣ伄浼氳┍銈掗枊濮嬨仚銈嬨仺銆佷細瑭便偄銉椼儶銈便兗銈枫儳銉炽仹褰笺倝銇ㄣ伄銈堛倞瀵嗘帴銇枹淇傘倰绡夈亸銇伀褰圭珛銇°伨銇欍��',
+    varTip: '澶夋暟銈掍娇鐢ㄣ仹銇嶃伨銇欍�倇{variable}} 銈掑叆鍔涖仐銇︺伩銇︺亸銇犮仌銇�',
+    tooShort: '浼氳┍銇枊濮嬨伀銇皯銇亸銇ㄣ倐 20 鍗樿獮銇垵鏈熴儣銉兂銉椼儓銇屽繀瑕併仹銇欍��',
+    notIncludeKey: '鍒濇湡銉椼儹銉炽儣銉堛伀澶夋暟 {{key}} 銇屽惈銇俱倢銇︺亜銇俱仜銈撱�傚垵鏈熴儣銉兂銉椼儓銇拷鍔犮仐銇︺亸銇犮仌銇勩��',
+  },
+  modelConfig: {
+    model: '銉€儑銉�',
+    setTone: '蹇滅瓟銇儓銉笺兂銈掕ō瀹氥仚銈�',
+    title: '銉€儑銉仺銉戙儵銉°兗銈�',
+    modeType: {
+      chat: '銉併儯銉冦儓',
+      completion: '瀹屾垚',
+    },
+  },
+  inputs: {
+    title: '銉囥儛銉冦偘銇ㄣ儣銉儞銉ャ兗',
+    noPrompt: '銉椼儸銉椼儹銉炽儣銉堝叆鍔涖伀銇勩亸銇ゃ亱銇儣銉兂銉椼儓銈掕鍏ャ仐銇︺伩銇︺亸銇犮仌銇�',
+    userInputField: '銉︺兗銈躲兗鍏ュ姏銉曘偅銉笺儷銉�',
+    noVar: '澶夋暟銇�ゃ倰鍏ュ姏銇椼仸銇忋仩銇曘亜銆傛柊銇椼亜銈汇儍銈枫儳銉炽亴闁嬪銇曘倢銈嬨仧銇炽伀銉椼儹銉炽儣銉堛伄鍗樿獮銇岃嚜鍕曠殑銇疆鎻涖仌銈屻伨銇欍��',
+    chatVarTip:
+      '澶夋暟銇�ゃ倰鍏ュ姏銇椼仸銇忋仩銇曘亜銆傛柊銇椼亜銈汇儍銈枫儳銉炽亴闁嬪銇曘倢銈嬨仧銇炽伀銉椼儹銉炽儣銉堛伄鍗樿獮銇岃嚜鍕曠殑銇疆鎻涖仌銈屻伨銇欍��',
+    completionVarTip:
+      '澶夋暟銇�ゃ倰鍏ュ姏銇椼仸銇忋仩銇曘亜銆傝唱鍟忋亴閫佷俊銇曘倢銈嬨仧銇炽伀銉椼儹銉炽儣銉堛伄鍗樿獮銇岃嚜鍕曠殑銇疆鎻涖仌銈屻伨銇欍��',
+    previewTitle: '銉椼儹銉炽儣銉堛伄銉椼儸銉撱儱銉�',
+    queryTitle: '銈偍銉唴瀹�',
+    queryPlaceholder: '銉偗銈ㄣ偣銉堛儐銈偣銉堛倰鍏ュ姏銇椼仸銇忋仩銇曘亜銆�',
+    run: '瀹熻',
+  },
+  result: '鍑哄姏銉嗐偔銈广儓',
+  noResult: '鍑哄姏銇亾銇撱伀琛ㄧず銇曘倢銇俱仚銆�',
+  datasetConfig: {
+    settingTitle: '銉儓銉兗銉愩儷瑷畾',
+    knowledgeTip: '銉娿儸銉冦偢銈掕拷鍔犮仚銈嬨伀銇��+銆嶃儨銈裤兂銈掋偗銉儍銈仐銇︺亸銇犮仌銇�',
+    retrieveOneWay: {
+      title: 'N-to-1 銉儓銉兗銉愩儷',
+      description: '銉︺兗銈躲兗銇剰鍥炽仺銉娿儸銉冦偢銇鏄庛伀鍩恒仴銇勩仸銆併偍銉笺偢銈с兂銉堛亴鑷緥鐨勩伀鏈�閬┿仾銉娿儸銉冦偢銈掗伕鎶炪仐銇俱仚銆傚�嬨�呫伄銆侀檺銈夈倢銇熴儕銉儍銈搞倰鎸併仱銈€儣銉偙銉笺偡銉с兂銇渶閬┿仹銇欍��',
+    },
+    retrieveMultiWay: {
+      title: '銉炪儷銉併儜銈广儶銉堛儶銉笺儛銉�',
+      description: '銉︺兗銈躲兗銇剰鍥炽伀鍩恒仴銇勩仸銆併仚銇广仸銇儕銉儍銈搞倰銈偍銉仐銆佽鏁般伄銈姐兗銈广亱銈夐枹閫c仚銈嬨儐銈偣銉堛倰鍙栧緱銇椼�佸啀闋嗕綅浠樸亼寰屻�併儲銉笺偠銉笺偗銈ㄣ儶銇渶閬┿仾绲愭灉銈掗伕鎶炪仐銇俱仚銆傚啀闋嗕綅浠樸亼銉€儑銉� API 銇鎴愩亴蹇呰銇с仚銆�',
+    },
+    rerankModelRequired: '鍐嶉爢浣嶄粯銇戙儮銉囥儷銇屽繀瑕併仹銇�',
+    params: '銉戙儵銉°兗銈�',
+    top_k: '銉堛儍銉桲',
+    top_kTip: '銉︺兗銈躲兗銇唱鍟忋伀鏈�銈傞浼笺仐銇熴儊銉c兂銈倰銉曘偅銉偪銉兂銈般仚銈嬨仧銈併伀浣跨敤銇曘倢銇俱仚銆傘偡銈广儐銉犮伅銆侀伕鎶炪仐銇熴儮銉囥儷銇� max_tokens 銇繙銇樸仸銆佸嫊鐨勩伀 Top K 銇�ゃ倰瑾挎暣銇椼伨銇欍��',
+    score_threshold: '銈广偝銈㈤柧鍊�',
+    score_thresholdTip: '銉併儯銉炽偗銉曘偅銉偪銉兂銈般伄椤炰技鎬ч柧鍊ゃ倰瑷畾銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍��',
+    retrieveChangeTip: '銈ゃ兂銉囥儍銈偣銉€兗銉夈仺銉儓銉兗銉愩儷銉€兗銉夈倰澶夋洿銇欍倠銇ㄣ�併亾銇儕銉儍銈搞伀闁㈤�d粯銇戙倝銈屻仧銈€儣銉偙銉笺偡銉с兂銇奖闊裤倰涓庛亪銈嬪彲鑳芥�с亴銇傘倞銇俱仚銆�',
+  },
+  debugAsSingleModel: '鍗樹竴銉€儑銉仹銉囥儛銉冦偘',
+  debugAsMultipleModel: '瑜囨暟銉€儑銉仹銉囥儛銉冦偘',
+  duplicateModel: '瑜囪=',
+  publishAs: '銇ㄣ仐銇﹀叕闁�',
+  assistantType: {
+    name: '銈€偡銈广偪銉炽儓銈裤偆銉�',
+    chatAssistant: {
+      name: '鍩烘湰銈€偡銈广偪銉炽儓',
+      description: '澶ц妯°仾瑷�瑾炪儮銉囥儷銈掍娇鐢ㄣ仐銇︺儊銉c儍銉堛儥銉笺偣銇偄銈枫偣銈裤兂銉堛倰妲嬬瘔銇椼伨銇�',
+    },
+    agentAssistant: {
+      name: '銈ㄣ兗銈搞偋銉炽儓銈€偡銈广偪銉炽儓',
+      description: '銈裤偣銈倰鑷緥鐨勩伀瀹屼簡銇欍倠銇熴倎銇儎銉笺儷銈掗伕鎶炪仹銇嶃倠銈ゃ兂銉嗐儶銈搞偋銉炽儓銈ㄣ兗銈搞偋銉炽儓銈掓绡夈仐銇俱仚',
+    },
+  },
+  agent: {
+    agentMode: '銈ㄣ兗銈搞偋銉炽儓銉€兗銉�',
+    agentModeDes: '銈ㄣ兗銈搞偋銉炽儓銇帹璜栥儮銉笺儔銇ó椤炪倰瑷畾銇椼伨銇�',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: '闁㈡暟鍛笺伋鍑恒仐',
+    },
+    setting: {
+      name: '銈ㄣ兗銈搞偋銉炽儓瑷畾',
+      description: '銈ㄣ兗銈搞偋銉炽儓銈€偡銈广偪銉炽儓瑷畾銇с伅銆併偍銉笺偢銈с兂銉堛儮銉笺儔銈勩儞銉儓銈ゃ兂銉椼儹銉炽儣銉堛仾銇┿伄楂樺害銇鑳姐倰瑷畾銇с亶銇俱仚銆傘偍銉笺偢銈с兂銉堛偪銈ゃ儣銇伩鍒╃敤鍙兘銇с仚銆�',
+      maximumIterations: {
+        name: '鏈�澶у弽寰╁洖鏁�',
+        description: '銈ㄣ兗銈搞偋銉炽儓銈€偡銈广偪銉炽儓銇屽疅琛屻仹銇嶃倠鍙嶅京鍥炴暟銈掑埗闄愩仐銇俱仚',
+      },
+    },
+    buildInPrompt: '銉撱儷銉堛偆銉炽儣銉兂銉椼儓',
+    firstPrompt: '鏈�鍒濄伄銉椼儹銉炽儣銉�',
+    nextIteration: '娆°伄鍙嶅京',
+    promptPlaceholder: '銇撱亾銇儣銉兂銉椼儓銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    tools: {
+      name: '銉勩兗銉�',
+      description: '銉勩兗銉倰浣跨敤銇欍倠銇ㄣ�併偆銉炽偪銉笺儘銉冦儓銇绱€倓绉戝鐨勮▓绠椼仾銇┿�丩LM銇鑳姐倰鎷″嫉銇с亶銇俱仚',
+      enabled: '鏈夊姽',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/ja-JP/app-log.ts b/i18n/ja-JP/app-log.ts
new file mode 100644
index 0000000..d4553e8
--- /dev/null
+++ b/i18n/ja-JP/app-log.ts
@@ -0,0 +1,98 @@
+const translation = {
+  title: '銉偘',
+  description: '銉偘銇�併偄銉椼儶銈便兗銈枫儳銉炽伄瀹熻鐘舵厠銈掕閷层仐銇俱仚銆傘儲銉笺偠銉笺伄鍏ュ姏銈凙I銇繙绛斻仾銇┿亴鍚伨銈屻伨銇欍��',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: '鏇存柊鏅傞枔',
+      time: '浣滄垚鏅傞枔',
+      endUser: '銈ㄣ兂銉夈儲銉笺偠銉笺伨銇熴伅銈€偒銈︺兂銉�',
+      input: '鍏ュ姏',
+      output: '鍑哄姏',
+      summary: '銈裤偆銉堛儷',
+      messageCount: '銉°儍銈汇兗銈告暟',
+      userRate: '銉︺兗銈躲兗銉兗銉�',
+      adminRate: '鎿嶄綔銉兗銉�',
+      startTime: '闁嬪鏅傞枔',
+      status: '銈广儐銉笺偪銈�',
+      runtime: '銉┿兂銈裤偆銉�',
+      tokens: '銉堛兗銈兂',
+      user: '銈ㄣ兂銉夈儲銉笺偠銉笺伨銇熴伅銈€偒銈︺兂銉�',
+      version: '銉愩兗銈搞儳銉�',
+    },
+    pagination: {
+      previous: '鍓嶃伕',
+      next: '娆°伕',
+    },
+    empty: {
+      noChat: '銇俱仩浼氳┍銇亗銈娿伨銇涖倱',
+      noOutput: '鍑哄姏銇屻亗銈娿伨銇涖倱',
+      element: {
+        title: '瑾般亱銇勩伨銇欍亱锛�',
+        content: '銇撱亾銇с伅銆併偍銉炽儔銉︺兗銈躲兗銇ˋI銈€儣銉偙銉笺偡銉с兂闁撱伄鐩镐簰浣滅敤銈掕Τ瀵熴仐銆佹敞閲堛倰浠樸亼銈嬨亾銇ㄣ仹銆丄I銇簿搴︺倰缍欑稓鐨勩伀鍚戜笂銇曘仜銇俱仚銆俉eb銈€儣銉倰<shareLink>鍏辨湁</shareLink>銇俱仧銇�<testLink>銉嗐偣銉�</testLink>銇椼仸銇裤仸銆併亾銇儦銉笺偢銇埢銇c仸銇忋仩銇曘亜銆�',
+      },
+    },
+  },
+  detail: {
+    time: '鏅傞枔',
+    conversationId: '浼氳┍ID',
+    promptTemplate: '銉椼儹銉炽儣銉堛儐銉炽儣銉兗銉�',
+    promptTemplateBeforeChat: '銉併儯銉冦儓鍓嶃伄銉椼儹銉炽儣銉堛儐銉炽儣銉兗銉堛兓銈枫偣銉嗐儬銉°儍銈汇兗銈搞仺銇椼仸',
+    annotationTip: '{{user}} 銇倛銇c仸銉炪兗銈仌銈屻仧鏀瑰杽',
+    timeConsuming: '',
+    second: '绉�',
+    tokenCost: '銉堛兗銈兂娑堣不',
+    loading: '瑾伩杈笺伩涓�',
+    operation: {
+      like: '銇勩亜銇�',
+      dislike: '銇勩亜銇В闄�',
+      addAnnotation: '鏀瑰杽銈掕拷鍔�',
+      editAnnotation: '鏀瑰杽銈掔法闆�',
+      annotationPlaceholder: '灏嗘潵銇儮銉囥儷銇井瑾挎暣銈勩儐銈偣銉堢敓鎴愬搧璩伄缍欑稓鐨勬敼鍠勩伄銇熴倎銇獳I銇岃繑淇°仚銈嬨亾銇ㄣ倰鏈熷緟銇欍倠绛斻亪銈掑叆鍔涖仐銇︺亸銇犮仌銇勩��',
+    },
+    variables: '澶夋暟',
+    uploadImages: '銈€儍銉椼儹銉笺儔銇曘倢銇熺敾鍍�',
+    modelParams: '銉€儑銉儜銉┿儭銉笺偪',
+  },
+  filter: {
+    period: {
+      today: '浠婃棩',
+      last7days: '閬庡幓7鏃ラ枔',
+      last4weeks: '閬庡幓4閫遍枔',
+      last3months: '閬庡幓3銉舵湀',
+      last12months: '閬庡幓12銉舵湀',
+      monthToDate: '鏈堝垵銇嬨倝浠婃棩銇俱仹',
+      quarterToDate: '鍥涘崐鏈熷垵銇嬨倝浠婃棩銇俱仹',
+      yearToDate: '骞村垵銇嬨倝浠婃棩銇俱仹',
+      allTime: '銇欍伖銇︺伄鏈熼枔',
+    },
+    annotation: {
+      all: '銇欍伖銇�',
+      annotated: '娉ㄩ噲浠樸亶銇敼鍠� ({{count}} 銈€偆銉嗐儬)',
+      not_annotated: '娉ㄩ噲銇仐',
+    },
+    sortBy: '涓︺伖鏇裤亪',
+    descending: '闄嶉爢',
+    ascending: '鏄囬爢',
+  },
+  workflowTitle: '銉兗銈儠銉兗銉偘',
+  workflowSubtitle: '銇撱伄銉偘銇� Automate 銇搷浣溿倰瑷橀尣銇椼伨銇椼仧銆�',
+  runDetail: {
+    title: '浼氳┍銉偘',
+    workflowTitle: '銉偘銇┏绱�',
+    fileListLabel: '銉曘偂銈ゃ儷銇┏绱�',
+    fileListDetail: '瑭崇窗',
+  },
+  promptLog: '銉椼儹銉炽儣銉堛儹銈�',
+  agentLog: '銈ㄣ兗銈搞偋銉炽儓銉偘',
+  viewLog: '銉偘銈掕〃绀�',
+  agentLogDetail: {
+    agentMode: '銈ㄣ兗銈搞偋銉炽儓銉€兗銉�',
+    toolUsed: '浣跨敤銇椼仧銉勩兗銉�',
+    iterations: '鍙嶅京',
+    iteration: '鍙嶅京',
+    finalProcessing: '鏈�绲傚嚘鐞�',
+  },
+}
+
+export default translation
diff --git a/i18n/ja-JP/app-overview.ts b/i18n/ja-JP/app-overview.ts
new file mode 100644
index 0000000..d67860f
--- /dev/null
+++ b/i18n/ja-JP/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: '銇仒銈併倠銇伅銆�',
+    enterKeyTip: '浠ヤ笅銇玂penAI API銈兗銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    getKeyTip: 'OpenAI銉�銉冦偡銉ャ儨銉笺儔銇嬨倝API銈兗銈掑彇寰椼仐銇︺亸銇犮仌銇�',
+    placeholder: '銇傘仾銇熸銇甇penAI API銈兗锛堜緥锛歴k-xxxx锛�',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: '{{providerName}}銉堛儵銈ゃ偄銉偗銈┿兗銈裤倰浣跨敤銇椼仸銇勩伨銇欍��',
+        description: '銉堛儵銈ゃ偄銉偗銈┿兗銈裤伅銉嗐偣銉堢敤銇彁渚涖仌銈屻伨銇欍�傘儓銉┿偆銈€儷銈偐銉笺偪銇偝銉笺儷銇屼娇銇勫垏銈夈倢銈嬪墠銇�佺嫭鑷伄銉€儑銉儣銉儛銈ゃ儉銈掕ō瀹氥仚銈嬨亱銆佽拷鍔犮伄銈偐銉笺偪銈掕臣鍏ャ仐銇︺亸銇犮仌銇勩��',
+      },
+      exhausted: {
+        title: '銉堛儵銈ゃ偄銉偗銈┿兗銈裤亴浣裤亜鍒囥倢銇俱仐銇熴�侫PI銈兗銈掕ō瀹氥仐銇︺亸銇犮仌銇勩��',
+        description: '銉堛儵銈ゃ偄銉偗銈┿兗銈裤亴浣裤亜鍒囥倢銇俱仐銇熴�傜嫭鑷伄銉€儑銉儣銉儛銈ゃ儉銈掕ō瀹氥仚銈嬨亱銆佽拷鍔犮伄銈偐銉笺偪銈掕臣鍏ャ仐銇︺亸銇犮仌銇勩��',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: '銇仒銈併倠銇伅銆�',
+        row2: '銇俱仛銉€儑銉儣銉儛銈ゃ儉銈掕ō瀹氥仐銇︺亸銇犮仌銇勩��',
+      },
+    },
+    callTimes: '銈炽兗銉洖鏁�',
+    usedToken: '浣跨敤娓堛伩銉堛兗銈兂',
+    setAPIBtn: '銉€儑銉儣銉儛銈ゃ儉銇ō瀹氥伕',
+    tryCloud: '銇俱仧銇疍ify銇偗銉┿偊銉夈儛銉笺偢銉с兂銈掔劇鏂欒绌嶃倐銈娿仹銇婅│銇椼亸銇犮仌銇�',
+  },
+  overview: {
+    title: '姒傝',
+    appInfo: {
+      explanation: '浣裤亜銈勩仚銇凙I Web銈€儣銉�',
+      accessibleAddress: '鍏枊URL',
+      preview: '銉椼儸銉撱儱銉�',
+      regenerate: '鍐嶇敓鎴�',
+      regenerateNotice: '鍏枊URL銈掑啀鐢熸垚銇椼伨銇欍亱锛�',
+      preUseReminder: '缍氳銇欍倠鍓嶃伀Web銈€儣銉倰鏈夊姽銇仐銇︺亸銇犮仌銇勩��',
+      settings: {
+        entry: '瑷畾',
+        title: 'Web銈€儣銉伄瑷畾',
+        webName: 'Web銈€儣銉伄鍚嶅墠',
+        webDesc: 'Web銈€儣銉伄瑾槑',
+        webDescTip: '銇撱伄銉嗐偔銈广儓銇偗銉┿偆銈€兂銉堝伌銇〃绀恒仌銈屻�併偄銉椼儶銈便兗銈枫儳銉炽伄浣跨敤鏂规硶銇熀鏈殑銇偓銈ゃ儉銉炽偣銈掓彁渚涖仐銇俱仚銆�',
+        webDescPlaceholder: 'Web銈€儣銉伄瑾槑銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+        language: '瑷�瑾�',
+        workflow: {
+          title: '銉兗銈儠銉兗銈广儐銉冦儣',
+          show: '琛ㄧず',
+          hide: '闈炶〃绀�',
+          subTitle: '銉兗銈儠銉兗銇┏绱�',
+          showDesc: 'Web銈€儣銉仹銉兗銈儠銉兗銇┏绱般倰琛ㄧず銇俱仧銇潪琛ㄧず銇仚銈�',
+        },
+        chatColorTheme: '銉併儯銉冦儓銉溿儍銉堛伄銈儵銉笺儐銉笺優',
+        chatColorThemeDesc: '銉併儯銉冦儓銉溿儍銉堛伄銈儵銉笺儐銉笺優銈掕ō瀹氥仐銇俱仚',
+        chatColorThemeInverted: '鍙嶈虎',
+        invalidHexMessage: '鐒″姽銇�16閫叉暟鍊�',
+        invalidPrivacyPolicy: '鐒″姽銇儣銉┿偆銉愩偡銉笺儩銉偡銉笺伄銉兂銈仹銇欍�俬ttp 銇俱仧銇� https 銇у銇俱倠鏈夊姽銇儶銉炽偗銈掍娇鐢ㄣ仐銇︺亸銇犮仌銇�',
+        more: {
+          entry: '銇濄伄浠栥伄瑷畾銈掕〃绀�',
+          copyright: '钁椾綔妯�',
+          copyRightPlaceholder: '钁椾綔鑰呫伨銇熴伅绲勭箶鍚嶃倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+          privacyPolicy: '銉椼儵銈ゃ儛銈枫兗銉濄儶銈枫兗',
+          privacyPolicyPlaceholder: '銉椼儵銈ゃ儛銈枫兗銉濄儶銈枫兗銉兂銈倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+          privacyPolicyTip: '瑷晱鑰呫亴銈€儣銉偙銉笺偡銉с兂銇屽弾闆嗐仚銈嬨儑銉笺偪銈掔悊瑙c仐銆丏ify銇�<privacyPolicyLink>銉椼儵銈ゃ儛銈枫兗銉濄儶銈枫兗</privacyPolicyLink>銈掑弬鐓с仹銇嶃倠銈堛亞銇仐銇俱仚銆�',
+          customDisclaimer: '銈偣銈裤儬鍏嶈铂浜嬮爡',
+          customDisclaimerPlaceholder: '鍏嶈铂浜嬮爡銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+          customDisclaimerTip: '銈€儣銉偙銉笺偡銉с兂銇娇鐢ㄣ伀闁€仚銈嬪厤璨簨闋呫倰鎻愪緵銇椼伨銇欍��',
+          copyrightTooltip: '銉椼儹銉曘偋銉冦偡銉с儕銉儣銉┿兂浠ヤ笂銇偄銉冦儣銈般儸銉笺儔銇椼仸銇忋仩銇曘亜',
+          copyrightTip: '銈︺偋銉栥偄銉椼儶銇憲浣滄ī鎯呭牨銈掕〃绀恒仚銈�',
+        },
+        sso: {
+          title: 'Web銈€儣銉伄SSO',
+          tooltip: '绠$悊鑰呫伀鍟忋亜鍚堛倧銇涖仸銆乄eb銈€儣銉伄SSO銈掓湁鍔广伀銇椼伨銇�',
+          label: 'SSO瑾嶈',
+          description: '銇欍伖銇︺伄銉︺兗銈躲兗銇�乄eb銈€儣銉倰浣跨敤銇欍倠鍓嶃伀SSO銇с儹銈般偆銉炽仚銈嬪繀瑕併亴銇傘倞銇俱仚',
+        },
+        modalTip: '銈儵銈ゃ偄銉炽儓鍋淬伄 Web 銈€儣銉ō瀹氥��',
+      },
+      embedded: {
+        entry: '鍩嬨倎杈笺伩',
+        title: '銈︺偋銉栥偟銈ゃ儓銇煁銈佽炯銈�',
+        explanation: '銉併儯銉冦儓銈€儣銉倰銈︺偋銉栥偟銈ゃ儓銇煁銈佽炯銈�鏂规硶銈掗伕鎶炪仐銇俱仚銆�',
+        iframe: '銈︺偋銉栥偟銈ゃ儓銇换鎰忋伄鍫存墍銇儊銉c儍銉堛偄銉椼儶銈掕拷鍔犮仚銈嬨伀銇�併亾銇甶frame銈扝TML銈炽兗銉夈伀杩藉姞銇椼仸銇忋仩銇曘亜銆�',
+        scripts: '銈︺偋銉栥偟銈ゃ儓銇彸涓嬨伀銉併儯銉冦儓銈€儣銉倰杩藉姞銇欍倠銇伅銆併亾銇偝銉笺儔銈扝TML銇拷鍔犮仐銇︺亸銇犮仌銇勩��',
+        chromePlugin: 'Dify Chatbot Chrome鎷″嫉姗熻兘銈掋偆銉炽偣銉堛兗銉�',
+        copied: '銈炽償銉笺仐銇俱仐銇�',
+        copy: '銈炽償銉�',
+      },
+      qrcode: {
+        title: '鍏辨湁鐢≦R銈炽兗銉�',
+        scan: '銈€儣銉偙銉笺偡銉с兂銇叡鏈夈倰銈广偔銉c兂',
+        download: 'QR銈炽兗銉夈倰銉�銈︺兂銉兗銉�',
+      },
+      customize: {
+        way: '鏂规硶',
+        entry: '銈偣銈裤優銈ゃ偤',
+        title: 'AI Web銈€儣銉伄銈偣銈裤優銈ゃ偤',
+        explanation: '銈枫儕銉偑銇ㄣ偣銈裤偆銉伄銉嬨兗銈恒伀鍚堛倧銇涖仸Web銈€儣銉伄銉曘儹銉炽儓銈ㄣ兂銉夈倰銈偣銈裤優銈ゃ偤銇с亶銇俱仚銆�',
+        way1: {
+          name: '銈儵銈ゃ偄銉炽儓銈炽兗銉夈倰銉曘偐銉笺偗銇椼仸淇銇椼�乂ercel銇儑銉椼儹銈ゃ仐銇俱仚锛堟帹濂級',
+          step1: '銈儵銈ゃ偄銉炽儓銈炽兗銉夈倰銉曘偐銉笺偗銇椼仸淇銇椼伨銇�',
+          step1Tip: '銇撱亾銈掋偗銉儍銈仐銇︺偨銉笺偣銈炽兗銉夈倰GitHub銈€偒銈︺兂銉堛伀銉曘偐銉笺偗銇椼�併偝銉笺儔銈掍慨姝c仐銇俱仚',
+          step1Operation: 'Dify-WebClient',
+          step2: 'Vercel銇儑銉椼儹銈ゃ仐銇俱仚',
+          step2Tip: '銇撱亾銈掋偗銉儍銈仐銇︺儶銉濄偢銉堛儶銈扸ercel銇偆銉炽儩銉笺儓銇椼�併儑銉椼儹銈ゃ仐銇俱仚',
+          step2Operation: '銉儩銈搞儓銉倰銈ゃ兂銉濄兗銉�',
+          step3: '鐠板澶夋暟銈掕ō瀹氥仐銇俱仚',
+          step3Tip: 'Vercel銇銇挵澧冨鏁般倰杩藉姞銇椼伨銇�',
+        },
+        way2: {
+          name: '銈儵銈ゃ偄銉炽儓銈点偆銉夈伄銈炽兗銉夈倰瑷樿堪銇椼仸API銈掑懠銇冲嚭銇椼�併偟銉笺儛銉笺伀銉囥儣銉偆銇椼伨銇�',
+          operation: '銉夈偔銉ャ儭銉炽儓',
+        },
+      },
+      launch: '鐧哄皠',
+    },
+    apiInfo: {
+      title: '銉愩儍銈偍銉炽儔銈点兗銉撱偣API',
+      explanation: '銇傘仾銇熸銇偄銉椼儶銈便兗銈枫儳銉炽伀绨″崢銇当鍚堛仹銇嶃伨銇�',
+      accessibleAddress: '銈点兗銉撱偣API銈ㄣ兂銉夈儩銈ゃ兂銉�',
+      doc: 'API銉儠銈°儸銉炽偣',
+    },
+    status: {
+      running: '绋煎儘涓�',
+      disable: '鐒″姽',
+    },
+  },
+  analysis: {
+    title: '鍒嗘瀽',
+    ms: 'ms',
+    tokenPS: '銉堛兗銈兂/绉�',
+    totalMessages: {
+      title: '銉堛兗銈裤儷銉°儍銈汇兗銈告暟',
+      explanation: '鏃ユAI銈ゃ兂銈裤儵銈偡銉с兂鏁般��',
+    },
+    totalConversations: {
+      title: '绶忎細瑭辨暟',
+      explanation: '鏃ユAI浼氳┍鏁帮紱銉椼儹銉炽儣銉堛偍銉炽偢銉嬨偄銉兂銈�/銉囥儛銉冦偘銇櫎澶栥��',
+    },
+    activeUsers: {
+      title: '銈€偗銉嗐偅銉栥儲銉笺偠銉兼暟',
+      explanation: 'AI銇ㄣ伄Q&A銇弬鍔犮仐銇︺亜銈嬨儲銉嬨兗銈儲銉笺偠銉兼暟锛涘伐瀛︾殑/銉囥儛銉冦偘鐩殑銇儣銉兂銉椼儓銇櫎澶栥仌銈屻伨銇欍��',
+    },
+    tokenUsage: {
+      title: '銉堛兗銈兂浣跨敤閲�',
+      explanation: '銈€儣銉偙銉笺偡銉с兂銇█瑾炪儮銉囥儷銇棩娆°儓銉笺偗銉充娇鐢ㄩ噺銈掑弽鏄犮仐銆併偝銈广儓绠$悊銇焦绔嬨仭銇俱仚銆�',
+      consumed: '娑堣不銇曘倢銇熴儓銉笺偗銉�',
+    },
+    avgSessionInteractions: {
+      title: '骞冲潎銈汇儍銈枫儳銉炽偆銉炽偪銉┿偗銈枫儳銉虫暟',
+      explanation: '銉︺兗銈躲兗銇ˋI銇�g稓鐨勩仾銈炽儫銉ャ儖銈便兗銈枫儳銉虫暟锛涘瑭卞瀷銈€儣銉偙銉笺偡銉с兂鍚戙亼銆�',
+    },
+    avgUserInteractions: {
+      title: '骞冲潎銉︺兗銈躲兗銈ゃ兂銈裤儵銈偡銉с兂鏁�',
+      explanation: '銉︺兗銈躲兗銇棩娆′娇鐢ㄩ牷搴︺倰鍙嶆槧銇椼伨銇欍�傘亾銇寚妯欍伅銉︺兗銈躲兗銇畾鐫�搴︺倰鍙嶆槧銇椼仸銇勩伨銇欍��',
+    },
+    userSatisfactionRate: {
+      title: '銉︺兗銈躲兗婧�瓒冲害鐜�',
+      explanation: '1,000浠躲伄銉°儍銈汇兗銈搞亗銇熴倞銇�屻亜銇勩伃銆嶃伄鏁般�傘亾銈屻伅銆併儲銉笺偠銉笺亴闈炲父銇簚瓒炽仐銇︺亜銈嬪洖绛斻伄鍓插悎銈掔ず銇椼伨銇欍��',
+    },
+    avgResponseTime: {
+      title: '骞冲潎蹇滅瓟鏅傞枔',
+      explanation: 'AI銇屽嚘鐞�/蹇滅瓟銇欍倠鏅傞枔锛堛儫銉锛夛紱銉嗐偔銈广儓銉欍兗銈广伄銈€儣銉偙銉笺偡銉с兂鍚戙亼銆�',
+    },
+    tps: {
+      title: '銉堛兗銈兂鍑哄姏閫熷害',
+      explanation: 'LLM銇儜銉曘偐銉笺優銉炽偣銈掓脯瀹氥仐銇俱仚銆傘儶銈偍銈广儓銇枊濮嬨亱銈夊嚭鍔涖伄瀹屼簡銇俱仹銇甃LM銇儓銉笺偗銉冲嚭鍔涢�熷害銈掓暟銇堛伨銇欍��',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/ja-JP/app.ts b/i18n/ja-JP/app.ts
new file mode 100644
index 0000000..d687686
--- /dev/null
+++ b/i18n/ja-JP/app.ts
@@ -0,0 +1,214 @@
+const translation = {
+  createApp: '銈€儣銉倰浣滄垚銇欍倠',
+  types: {
+    all: '鍏ㄣ仸',
+    chatbot: '銉併儯銉冦儓銉溿儍銉�',
+    agent: '銈ㄣ兗銈搞偋銉炽儓',
+    workflow: '銉兗銈儠銉兗',
+    completion: '銉嗐偔銈广儓鐢熸垚',
+    basic: '鍩烘湰鐨勩仾',
+    advanced: '銉併儯銉冦儓銉曘儹銉�',
+  },
+  duplicate: '瑜囪=',
+  duplicateTitle: '銈€儣銉倰瑜囪=銇欍倠',
+  export: 'DSL 銈掋偍銈偣銉濄兗銉�',
+  exportFailed: 'DSL 銇偍銈偣銉濄兗銉堛伀澶辨晽銇椼伨銇椼仧銆�',
+  importDSL: 'DSL 銉曘偂銈ゃ儷銈掋偆銉炽儩銉笺儓',
+  createFromConfigFile: 'DSL 銉曘偂銈ゃ儷銇嬨倝浣滄垚銇欍倠',
+  importFromDSL: 'DSL銇嬨倝銈ゃ兂銉濄兗銉�',
+  importFromDSLFile: 'DSL銉曘偂銈ゃ儷銇嬨倝',
+  importFromDSLUrl: 'URL銇嬨倝',
+  importFromDSLUrlPlaceholder: 'DSL銉兂銈倰銇撱亾銇布銈婁粯銇戙伨銇�',
+  deleteAppConfirmTitle: '銇撱伄銈€儣銉倰鍓婇櫎銇椼伨銇欍亱锛�',
+  deleteAppConfirmContent:
+    '銈€儣銉倰鍓婇櫎銇欍倠銇ㄣ�佸厓銇埢銇欍亾銇ㄣ伅銇с亶銇俱仜銈撱�傘儲銉笺偠銉笺伅銈傘伅銈勩亗銇仧妲樸伄銈€儣銉伀銈€偗銈汇偣銇с亶銇氥�併仚銇广仸銇儣銉兂銉椼儓銇ō瀹氥仺銉偘銇屾案涔呫伀鍓婇櫎銇曘倢銇俱仚銆�',
+  appDeleted: '銈€儣銉亴鍓婇櫎銇曘倢銇俱仐銇�',
+  appDeleteFailed: '銈€儣銉伄鍓婇櫎銇け鏁椼仐銇俱仐銇�',
+  join: '銈炽儫銉ャ儖銉嗐偅銇弬鍔犮仚銈�',
+  communityIntro:
+  '銇曘伨銇栥伨銇儊銉c兂銉嶃儷銇с儊銉笺儬銉°兂銉愩兗銈勮并鐚�呫�侀枊鐧鸿�呫仺璀拌珫銇椼伨銇欍��',
+  roadmap: '銉兗銉夈優銉冦儣銈掕銈�',
+  newApp: {
+    startFromBlank: '鏈�鍒濄亱銈変綔鎴�',
+    startFromTemplate: '銉嗐兂銉椼儸銉笺儓銇嬨倝浣滄垚',
+    captionAppType: '銇┿伄銈裤偆銉椼伄銈€儣銉倰浣滄垚銇椼伨銇欍亱锛�',
+    chatbotDescription: '銉併儯銉冦儓褰㈠紡銇偄銉椼儶銈便兗銈枫儳銉炽倰妲嬬瘔銇椼伨銇欍�傘亾銇偄銉椼儶銇唱鍟忋仺鍥炵瓟銇舰寮忋倰浣跨敤銇椼�佽鏁般伄銉┿偊銉炽儔銇稒缍氱殑銇細瑭便倰鍙兘銇仐銇俱仚銆�',
+    completionDescription: '銉椼儹銉炽儣銉堛伀鍩恒仴銇勩仸楂樺搧璩伄銉嗐偔銈广儓銈掔敓鎴愩仚銈嬨偄銉椼儶銈便兗銈枫儳銉炽倰妲嬬瘔銇椼伨銇欍�傝浜嬨�佽绱勩�佺炕瑷炽仾銇┿倰鐢熸垚銇椼伨銇欍��',
+    completionWarning: '銇撱伄绋銇偄銉椼儶銇倐銇嗐偟銉濄兗銉堛仌銈屻仾銇忋仾銈娿伨銇欍��',
+    agentDescription: '銈裤偣銈倰鑷嫊鐨勩伀瀹屼簡銇欍倠銇熴倎銇儎銉笺儷銈掗伕鎶炪仹銇嶃倠銈ゃ兂銉嗐儶銈搞偋銉炽儓 銈ㄣ兗銈搞偋銉炽儓銈掓绡夈仐銇俱仚',
+    workflowDescription: '楂樺害銇偒銈广偪銉炪偆銈恒亴鍙兘銇儻銉笺偗銉曘儹銉笺伀鍩恒仴銇勩仸楂樺搧璩伄銉嗐偔銈广儓銈掔敓鎴愩仚銈嬨偄銉椼儶銈便兗銈枫儳銉炽倰妲嬬瘔銇椼伨銇欍�傜祵楱撹眾瀵屻仾銉︺兗銈躲兗鍚戙亼銇с仚銆�',
+    workflowWarning: '鐝惧湪銉欍兗銈跨増銇с仚',
+    chatbotType: '銉併儯銉冦儓銉溿儍銉堛伄銈兗銈便偣銉堛儸銉笺偡銉с兂鏂规硶',
+    basic: '鍩烘湰',
+    basicTip: '鍒濆績鑰呭悜銇戙�傚緦銇с�屻儊銉c儍銉堛儠銉兗銆嶃伀鍒囥倞鏇裤亪銈嬨亾銇ㄣ亴銇с亶銇俱仚',
+    basicFor: '鍒濆績鑰呭悜銇�',
+    basicDescription: '鍩烘湰銈兗銈便偣銉堛儸銉笺儓銇�佺祫銇胯炯銇裤伄銉椼儹銉炽儣銉堛倰澶夋洿銇欍倠姗熻兘銇屻仾銇忋�佺啊鍗樸仾瑷畾銈掍娇鐢ㄣ仐銇︺儊銉c儍銉堛儨銉冦儓 銈€儣銉倰銈兗銈便偣銉堛儸銉笺儓銇椼伨銇欍�傚垵蹇冭�呭悜銇戙仹銇欍��',
+    advanced: '銉併儯銉冦儓銉曘儹銉�',
+    advancedFor: '涓婄礆銉︺兗銈躲兗鍚戙亼',
+    advancedDescription: '銉兗銈儠銉兗 銈兗銈便偣銉堛儸銉笺儓銇�併儻銉笺偗銉曘儹銉煎舰寮忋仹銉併儯銉冦儓銉溿儍銉堛倰銈兗銈便偣銉堛儸銉笺儓銇椼�佺祫銇胯炯銇裤伄銉椼儹銉炽儣銉堛倰绶ㄩ泦銇欍倠姗熻兘銈掑惈銈�楂樺害銇偒銈广偪銉炪偆銈恒倰鎻愪緵銇椼伨銇欍�傜祵楱撹眾瀵屻仾銉︺兗銈躲兗鍚戙亼銇с仚銆�',
+    captionName: '銈€儣銉伄銈€偆銈炽兂銇ㄥ悕鍓�',
+    appNamePlaceholder: '銈€儣銉悕銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    captionDescription: '瑾槑',
+    appDescriptionPlaceholder: '銈€儣銉伄瑾槑銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    useTemplate: '銇撱伄銉嗐兂銉椼儸銉笺儓銈掍娇鐢ㄣ仚銈�',
+    previewDemo: '銉囥儮銈掋儣銉儞銉ャ兗',
+    chatApp: '銈€偡銈广偪銉炽儓',
+    chatAppIntro:
+      '銉併儯銉冦儓褰㈠紡銇偄銉椼儶銈便兗銈枫儳銉炽倰妲嬬瘔銇椼仧銇勩�傘亾銇偄銉椼儶銇唱鍟忋仺鍥炵瓟銇舰寮忋倰浣跨敤銇椼�佽鏁般伄銉┿偊銉炽儔銇稒缍氱殑銇細瑭便倰鍙兘銇仐銇俱仚銆�',
+    agentAssistant: '鏂般仐銇勩偍銉笺偢銈с兂銉� 銈€偡銈广偪銉炽儓',
+    completeApp: '銉嗐偔銈广儓 銈搞偋銉嶃儸銉笺偪銉�',
+    completeAppIntro:
+      '銉椼儹銉炽儣銉堛伀鍩恒仴銇勩仸楂樺搧璩伄銉嗐偔銈广儓銈掔敓鎴愩仚銈嬨偄銉椼儶銈便兗銈枫儳銉炽倰浣滄垚銇椼仧銇勩�傝浜嬨�佽绱勩�佺炕瑷炽仾銇┿倰鐢熸垚銇椼伨銇欍��',
+    showTemplates: '銉嗐兂銉椼儸銉笺儓銇嬨倝閬告姙銇椼仧銇�',
+    hideTemplates: '銉€兗銉夐伕鎶炪伀鎴汇倠',
+    Create: '浣滄垚銇欍倠',
+    Cancel: '銈儯銉炽偦銉�',
+    nameNotEmpty: '鍚嶅墠銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    appTemplateNotSelected: '銉嗐兂銉椼儸銉笺儓銈掗伕鎶炪仐銇︺亸銇犮仌銇�',
+    appTypeRequired: '銈€儣銉伄绋銈掗伕鎶炪仐銇︺亸銇犮仌銇�',
+    appCreated: '銈€儣銉亴浣滄垚銇曘倢銇俱仐銇�',
+    appCreateFailed: '銈€儣銉伄浣滄垚銇け鏁椼仐銇俱仐銇�',
+    Confirm: '纰鸿獚銇欍倠',
+    caution: '娉ㄦ剰',
+    appCreateDSLErrorPart2: '缍氳銇椼伨銇欍亱?',
+    appCreateDSLErrorPart4: '銈枫偣銉嗐儬銇屻偟銉濄兗銉堛仚銈婦SL銉愩兗銈搞儳銉�:',
+    appCreateDSLErrorPart3: '鐝惧湪銇偄銉椼儶銈便兗銈枫儳銉炽伄 DSL 銉愩兗銈搞儳銉�:',
+    appCreateDSLErrorTitle: '銉愩兗銈搞儳銉炽伄闈炰簰鎻涙��',
+    appCreateDSLWarning: '娉ㄦ剰:DSL銇儛銉笺偢銉с兂銇仌銇勩伅銆佺壒瀹氥伄姗熻兘銇奖闊裤倰涓庛亪銈嬪彲鑳芥�с亴銇傘倞銇俱仚',
+    appCreateDSLErrorPart1: 'DSL 銉愩兗銈搞儳銉炽伀澶с亶銇仌銇勩亴妞滃嚭銇曘倢銇俱仐銇熴�傘偆銉炽儩銉笺儓銈掑挤鍒躲仚銈嬨仺銆併偄銉椼儶銈便兗銈枫儳銉炽亴瑾ゅ嫊浣溿仚銈嬪彲鑳芥�с亴銇傘倞銇俱仚銆�',
+    optional: '闅忔剰',
+    forBeginners: '鍒濆績鑰呭悜銇�',
+    noTemplateFoundTip: '鍒ャ伄銈兗銉兗銉夈倰浣跨敤銇椼仸妞滅储銇椼仸銇裤仸銇忋仩銇曘亜銆�',
+    agentShortDescription: '鎺ㄨ珫銇ㄨ嚜寰嬬殑銇儎銉笺儷銇娇鐢ㄣ倰鍌欍亪銇熴偆銉炽儐銉偢銈с兂銉堛偍銉笺偢銈с兂銉�',
+    foundResults: '{{銈偊銉炽儓}}妤妇',
+    noTemplateFound: '銉嗐兂銉椼儸銉笺儓銇岃銇ゃ亱銈娿伨銇涖倱',
+    noAppsFound: '銈€儣銉亴瑕嬨仱銇嬨倞銇俱仜銈撱仹銇椼仧',
+    workflowShortDescription: '銈枫兂銈般儷銈裤兗銉炽伄鑷嫊鍖栥偪銈广偗銇偑銉笺偙銈广儓銉兗銈枫儳銉�',
+    completionShortDescription: '銉嗐偔銈广儓鐢熸垚銈裤偣銈伄銇熴倎銇瓵I銈€偡銈广偪銉炽儓',
+    advancedUserDescription: '銉°儮銉鑳姐倰鍌欍亪銇熴優銉儊銉┿偊銉炽儔銇闆戙仾瀵捐┍銈裤偣銈伄銉兗銈儠銉兗銈兗銈便偣銉堛儸銉笺偡銉с兂銆�',
+    advancedShortDescription: '銉°儮銉倰浣跨敤銇椼仧瑜囬洃銇優銉儊銈裤兗銉冲瑭便伄銉兗銈儠銉兗',
+    agentUserDescription: '銈裤偣銈伄鐩銈掗仈鎴愩仚銈嬨仧銈併伀鍙嶅京鐨勩仾鎺ㄨ珫銇ㄨ嚜寰嬬殑銇儎銉笺儷銈掍娇鐢ㄣ仹銇嶃倠銈ゃ兂銉嗐儶銈搞偋銉炽儓銈ㄣ兗銈搞偋銉炽儓銆�',
+    foundResult: '{{銈偊銉炽儓}}绲愭灉',
+    forAdvanced: '涓婄礆銉︺兗銈躲兗鍚戙亼',
+    chooseAppType: '銈€儣銉伄绋銈掗伕鎶�',
+    learnMore: '瑭崇窗鎯呭牨',
+    noIdeaTip: '銈€偆銉囥偄銇屻亗銈娿伨銇涖倱銇�?銉嗐兂銉椼儸銉笺儓銈掋仈瑕с亸銇犮仌銇�',
+    chatbotShortDescription: '绨″崢銇偦銉冦儓銈€儍銉椼伄LLM銉欍兗銈广伄銉併儯銉冦儓銉溿儍銉�',
+    chatbotUserDescription: '绨″崢銇ō瀹氥仹LLM銉欍兗銈广伄銉併儯銉冦儓銉溿儍銉堛倰杩呴�熴伀妲嬬瘔銇椼伨銇欍�侰hatflow銇緦銇у垏銈婃浛銇堛倠銇撱仺銇屻仹銇嶃伨銇欍��',
+    workflowUserDescription: '鑷嫊鍖栥倓銉愩儍銉佸嚘鐞嗐仾銇┿伄鍗樹竴銉┿偊銉炽儔銇偪銈广偗銇仧銈併伄銉兗銈儠銉兗銈兗銈便偣銉堛儸銉笺偡銉с兂銆�',
+    completionUserDescription: '绨″崢銇鎴愩仹銉嗐偔銈广儓鐢熸垚銈裤偣銈敤銇瓵I銈€偡銈广偪銉炽儓銈掋仚銇般倓銇忔绡夈仐銇俱仚銆�',
+  },
+  editApp: '鎯呭牨銈掔法闆嗐仚銈�',
+  editAppTitle: '銈€儣銉儏鍫便倰绶ㄩ泦銇欍倠',
+  editDone: '銈€儣銉儏鍫便亴鏇存柊銇曘倢銇俱仐銇�',
+  editFailed: '銈€儣銉儏鍫便伄鏇存柊銇け鏁椼仐銇俱仐銇�',
+  iconPicker: {
+    ok: 'OK',
+    cancel: '銈儯銉炽偦銉�',
+    emoji: '绲垫枃瀛�',
+    image: '鐢诲儚',
+  },
+  switch: '銉兗銈儠銉兗 銈兗銈便偣銉堛儸銉笺儓銇垏銈婃浛銇堛倠',
+  switchTipStart: '鏂般仐銇勩偄銉椼儶銇偝銉斻兗銇屼綔鎴愩仌銈屻�佹柊銇椼亜銈炽償銉笺亴銉兗銈儠銉兗 銈兗銈便偣銉堛儸銉笺儓銇垏銈婃浛銈忋倞銇俱仚銆傛柊銇椼亜銈炽償銉笺伅 ',
+  switchTip: '鍒囥倞鏇裤亪銈掕ū鍙仐銇俱仜銈�',
+  switchTipEnd: ' 鍩烘湰鐨勩仾銈兗銈便偣銉堛儸銉笺儓銇埢銈嬨亾銇ㄣ伅銇с亶銇俱仜銈撱��',
+  switchLabel: '浣滄垚銇曘倢銈嬨偄銉椼儶銇偝銉斻兗',
+  removeOriginal: '鍏冦伄銈€儣銉倰鍓婇櫎銇欍倠',
+  switchStart: '鍒囥倞鏇裤亪銈掗枊濮嬨仚銈�',
+  openInExplore: '"鎺㈢储" 銇ч枊銇�',
+  typeSelector: {
+    all: '銇欍伖銇︺伄銈裤偆銉�',
+    chatbot: '銉併儯銉冦儓銉溿儍銉�',
+    agent: '銈ㄣ兗銈搞偋銉炽儓',
+    workflow: '銉兗銈儠銉兗',
+    completion: '銉嗐偔銈广儓鐢熸垚',
+    advanced: '銉併儯銉冦儓銉曘儹銉�',
+  },
+  tracing: {
+    title: '銈€儣銉伄銉戙儠銈┿兗銉炪兂銈广伄杩借贰',
+    description: '銈点兗銉夈儜銉笺儐銈c伄LLMOps銈点兗銉撱偣銇ㄣ儓銉兗銈广偄銉椼儶銈便兗銈枫儳銉炽伄銉戙儠銈┿兗銉炪兂銈硅ō瀹氥倰琛屻亜銇俱仚銆�',
+    config: '瑷畾',
+    collapse: '鎶樸倞銇熴仧銈�',
+    expand: '灞曢枊',
+    tracing: '杩借贰',
+    disabled: '鐒″姽銇椼伨銇椼仧',
+    disabledTip: '銇俱仛銇偟銉笺儞銈广伄瑷畾銇嬨倝濮嬨倎銇俱仐銈囥亞銆�',
+    enabled: '鏈夊姽銇椼伨銇椼仧',
+    tracingDescription: 'LLM銇懠銇冲嚭銇椼�併偝銉炽儐銈偣銉堛�併儣銉兂銉椼儓銆丠TTP銉偗銈ㄣ偣銉堛仾銇┿�併偄銉椼儶銈便兗銈枫儳銉冲疅琛屻伄鍏ㄣ仸銇枃鑴堛倰銈点兗銉夈儜銉笺儐銈c伄銉堛儸銉笺偣銉椼儵銉冦儓銉曘偐銉笺儬銇у彇銈婅炯銇裤伨銇欍��',
+    configProviderTitle: {
+      configured: '瑷畾銇椼伨銇椼仧',
+      notConfigured: '銉堛儸銉笺偣姗熻兘銈掓湁鍔瑰寲銇欍倠銇熴倎銇伅銆併偟銉笺儞銈广伄瑷畾銇屽繀瑕併仹銇欍��',
+      moreProvider: '銇濄伄浠栥伄銉椼儹銉愩偆銉�銉�',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: 'LLM銈掑埄鐢ㄣ仐銇熴偄銉椼儶銈便兗銈枫儳銉炽伄銉┿偆銉曘偟銈ゃ偗銉叏娈甸殠銈掓敮鎻淬仚銈嬨�併偑銉笺儷銈ゃ兂銉兂銇枊鐧鸿�呭悜銇戙儣銉┿儍銉堛儠銈┿兗銉犮仹銇欍��',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: '銉堛儸銉笺偣銆佽渚°�併儣銉兂銉椼儓銇鐞嗐�併仢銇椼仸銉°儓銉偗銈广倰椐嗕娇銇椼仸銆丩LM銈€儣銉偙銉笺偡銉с兂銇儑銉愩儍銈般倓鏀瑰杽銇焦绔嬨仸銇俱仚銆�',
+    },
+    inUse: '浣跨敤涓�',
+    configProvider: {
+      title: '閰嶇疆 ',
+      placeholder: '銇傘仾銇熸銇畕{key}}銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+      project: '銉椼儹銈搞偋銈儓',
+      publicKey: '鍏枊銈兗',
+      secretKey: '绉樺瘑銈兗',
+      viewDocsLink: '{{key}}銇儔銈儱銉°兂銉堛倰瑕嬨倠',
+      removeConfirmTitle: '{{key}}銇ō瀹氥倰鍓婇櫎銇椼伨銇欍亱锛�',
+      removeConfirmContent: '鐝惧湪銇ō瀹氥伅浣跨敤涓仹銇欍�傘亾銈屻倰鍓婇櫎銇欍倠銇ㄣ�併儓銉兗銈规鑳姐亴鐒″姽銇仾銈娿伨銇欍��',
+    },
+    view: '瑕嬨倠',
+    opik: {
+      title: '銈償銉冦偗',
+      description: 'Opik 銇�丩LM 銈€儣銉偙銉笺偡銉с兂銈掕渚°�併儐銈广儓銆佺洠瑕栥仚銈嬨仧銈併伄銈兗銉椼兂銈姐兗銈� 銉椼儵銉冦儓銉曘偐銉笺儬銇с仚銆�',
+    },
+    weave: {
+      description: 'Weave銇�丩LM銈€儣銉偙銉笺偡銉с兂銈掕渚°�併儐銈广儓銆併亰銈堛伋鐩h銇欍倠銇熴倎銇偑銉笺儣銉炽偨銉笺偣銉椼儵銉冦儓銉曘偐銉笺儬銇с仚銆�',
+      title: '绻斻倠',
+    },
+  },
+  answerIcon: {
+    title: 'Web銈€儣銉偄銈ゃ偝銉炽倰浣跨敤銇椼仸馃銈掔疆銇嶆彌銇堛倠',
+    description: '鍏辨湁銈€儣銉偙銉笺偡銉с兂銇腑銇� Web銈€儣銉偄銈ゃ偝銉炽倰浣跨敤銇椼仸馃銈掔疆銇嶆彌銇堛倠銇嬨仼銇嗐亱',
+    descriptionInExplore: 'Explore銇eb銈€儣銉偄銈ゃ偝銉炽倰浣跨敤銇椼仸馃銈掔疆銇嶆彌銇堛倠銇嬨仼銇嗐亱',
+  },
+  mermaid: {
+    handDrawn: '鎵嬫弿銇�',
+    classic: '銈儵銈枫儍銈�',
+  },
+  newAppFromTemplate: {
+    sidebar: {
+      Agent: '銈ㄣ兗銈搞偋銉炽儓',
+      Programming: '銉椼儹銈般儵銉熴兂銈�',
+      HR: '浜轰簨',
+      Writing: '銉┿偆銉嗐偅銉炽偘',
+      Recommended: '鎺ㄥエ',
+      Workflow: '銉兗銈儠銉兗',
+      Assistant: '鍔╂墜',
+    },
+    byCategories: '銈儐銈淬儶鍒�',
+    searchAllTemplate: '銇欍伖銇︺伄銉嗐兂銉椼儸銉笺儓銈掓绱�...',
+  },
+  showMyCreatedAppsOnly: '鑷垎銇屼綔鎴愩仐銇熴偄銉椼儶',
+  appSelector: {
+    label: '銈€儣銉�',
+    params: '銈€儣銉儜銉┿儭銉笺偪',
+    noParams: '銉戙儵銉°兗銈裤伅蹇呰銇傘倞銇俱仜銈�',
+    placeholder: '銈€儣銉倰閬告姙...',
+  },
+  structOutput: {
+    moreFillTip: '鏈�澶�10銉儥銉伄銉嶃偣銉堛倰琛ㄧず銇椼伨銇�',
+    required: '蹇呴爤',
+    LLMResponse: 'LLM銇儸銈广儩銉炽偣',
+    configure: '瑷畾',
+    notConfiguredTip: '妲嬮�犲寲鍑哄姏銇屾湭瑷畾銇с仚',
+    structured: '妲嬮�犲寲鍑哄姏',
+    structuredTip: '妲嬮�犲寲鍑哄姏銇�併儮銉囥儷銇屽父銇寚瀹氥仌銈屻仧JSON銈广偔銉笺優銇簴鎷犮仐銇熷繙绛斻倰鐢熸垚銇欍倠銇撱仺銈掍繚瑷笺仚銈嬫鑳姐仹銇欍��',
+    modelNotSupported: '銉€儑銉亴瀵惧繙銇椼仸銇勩伨銇涖倱',
+    modelNotSupportedTip: '鐝惧湪銇儮銉囥儷銇亾銇鑳姐伀瀵惧繙銇椼仸銇娿倝銇氥�佽嚜鍕曠殑銇儣銉兂銉椼儓銈ゃ兂銈搞偋銈偡銉с兂銇垏銈婃浛銈忋倞銇俱仚銆�',
+  },
+}
+
+export default translation
diff --git a/i18n/ja-JP/billing.ts b/i18n/ja-JP/billing.ts
new file mode 100644
index 0000000..1b85449
--- /dev/null
+++ b/i18n/ja-JP/billing.ts
@@ -0,0 +1,192 @@
+const translation = {
+  currentPlan: '鐝惧湪銇儣銉┿兂',
+  usagePage: {
+    teamMembers: '銉併兗銉犮儭銉炽儛銉�',
+    buildApps: '銈€儣銉倰浣滄垚銇欍倠',
+    annotationQuota: '銈€儙銉嗐兗銈枫儳銉炽兓銈偐銉笺偪',
+    documentsUploadQuota: '銉夈偔銉ャ儭銉炽儓銉汇偄銉冦儣銉兗銉夈兓銈偐銉笺偪',
+    vectorSpace: '鐭ヨ瓨銉囥兗銈裤偣銉堛儸銉笺偢',
+    vectorSpaceTooltip: '楂樺搧璩偆銉炽儑銉冦偗銈广儮銉笺儔銇儔銈儱銉°兂銉堛伅銆佺煡璀樸儑銉笺偪銈广儓銉兗銈搞伄銉偨銉笺偣銈掓秷璨汇仐銇俱仚銆傜煡璀樸儑銉笺偪銈广儓銉兗銈搞伄涓婇檺銇仈銇欍倠銇ㄣ�佹柊銇椼亜銉夈偔銉ャ儭銉炽儓銇偄銉冦儣銉兗銉夈仌銈屻伨銇涖倱銆�',
+  },
+  upgradeBtn: {
+    plain: '銉椼儵銉炽倰銈€儍銉椼偘銉兗銉�',
+    encourage: '浠娿仚銇愩偄銉冦儣銈般儸銉笺儔',
+    encourageShort: '銈€儍銉椼偘銉兗銉�',
+  },
+  viewBilling: '璜嬫眰銇ㄣ偟銉栥偣銈儶銉椼偡銉с兂銇鐞�',
+  buyPermissionDeniedTip: '銈点儢銈广偗銉儣銈枫儳銉炽仚銈嬨伀銇�併偍銉炽偪銉笺儣銉┿偆銈虹鐞嗚�呫伀閫g怠銇椼仸銇忋仩銇曘亜',
+  plansCommon: {
+    title: '銇傘仾銇熴伄AI銇梾銈掓敮銇堛倠渚℃牸瑷畾',
+    freeTrialTipPrefix: '銈点偆銉炽偄銉冦儣寰屻��',
+    freeTrialTip: '200鍥炪伄OpenAI銈炽兗銉伄鐒℃枡銇彈銇戝彇銈�',
+    freeTrialTipSuffix: '銆傘偗銉偢銉冦儓銈兗銉変笉瑕�',
+    yearlyTip: '10銉舵湀鍒嗘敮鎵曘仯銇︺��1骞撮枔妤姐仐銈傘亞锛�',
+    mostPopular: '浜烘皸',
+    cloud: '銈儵銈︺儔銈点兗銉撱偣',
+    self: '銈汇儷銉曘儧銈广儓銈点兗銉撱偣',
+    planRange: {
+      monthly: '鏈堥',
+      yearly: '骞撮',
+    },
+    month: '鏈�',
+    year: '骞�',
+    save: '绡�绱� ',
+    free: '鐒℃枡',
+    annualBilling: '骞存璜嬫眰',
+    comparePlanAndFeatures: '銉椼儵銉炽仺姗熻兘銈掓瘮杓冦仚銈�',
+    priceTip: '銉兗銈偣銉氥兗銈�/',
+    currentPlan: '鐝惧湪銇儣銉┿兂',
+    contractSales: '鍠舵キ銇�g怠銇欍倠',
+    contractOwner: '銉併兗銉犮優銉嶃兗銈搞儯銉笺伀閫g怠銇欍倠',
+    startForFree: '鐒℃枡銇у銈併倠',
+    getStarted: '濮嬨倎銈�',
+    contactSales: '鍠舵キ銇�g怠銇欍倠',
+    talkToSales: '鍠舵キ銇ㄨ┍銇�',
+    modelProviders: 'OpenAI/Anthropic/Llama2/Azure OpenAI/Hugging Face/Replicate銈掋偟銉濄兗銉�',
+    teamWorkspace: '{{count,number}}銉併兗銉犮儻銉笺偗銈广儦銉笺偣',
+    teamMember_one: '銉併兗銉犮儭銉炽儛銉硷細{{count,number}}浜�',
+    teamMember_other: '銉併兗銉犮儭銉炽儛銉硷細{{count,number}}浜�',
+    annotationQuota: '銈€儙銉嗐兗銈枫儳銉炽兓銈偐銉笺偪',
+    buildApps: '銈€儣銉伄鏁帮細{{count,number}}鍊�',
+    documents: '{{count,number}}銇煡璀樻枃鏇�',
+    documentsTooltip: '銉娿儸銉冦偢銉囥兗銈裤偨銉笺偣銇嬨倝銈ゃ兂銉濄兗銉堛仌銈屻仧銉夈偔銉ャ儭銉炽儓銇暟銇銇欍倠銈偐銉笺偪銆�',
+    vectorSpace: '{{size}}銇煡璀樸儑銉笺偪銈广儓銉兗銈�',
+    vectorSpaceTooltip: '楂樺搧璩偆銉炽儑銉冦偗銈广儮銉笺儔銇儔銈儱銉°兂銉堛伅銆佺煡璀樸儑銉笺偪銈广儓銉兗銈搞伄銉偨銉笺偣銈掓秷璨汇仐銇俱仚銆傜煡璀樸儑銉笺偪銈广儓銉兗銈搞伄涓婇檺銇仈銇欍倠銇ㄣ�佹柊銇椼亜銉夈偔銉ャ儭銉炽儓銇偄銉冦儣銉兗銉夈仌銈屻伨銇涖倱銆�',
+    documentsRequestQuota: '{{count,number}}/鍒嗐伄銉娿儸銉冦偢 銉偗銈ㄣ偣銉堛伄銉兗銉堝埗闄�',
+    documentsRequestQuotaTooltip: '銉娿儸銉冦偢銉欍兗銈瑰唴銇с儻銉笺偗銈广儦銉笺偣銇�1鍒嗛枔銇疅琛屻仹銇嶃倠鎿嶄綔銇窂鏁般倰绀恒仐銇俱仚銆傘亾銈屻伀銇�併儑銉笺偪銈汇儍銉堛伄浣滄垚銆佸墛闄ゃ�佹洿鏂般�併儔銈儱銉°兂銉堛伄銈€儍銉椼儹銉笺儔銆佷慨姝c�併偄銉笺偒銈ゃ儢銆併亰銈堛伋銉娿儸銉冦偢銉欍兗銈广偗銈ㄣ儶銇屽惈銇俱倢銇俱仚銆傘亾銇寚妯欍伅銆併儕銉儍銈搞儥銉笺偣銉偗銈ㄣ偣銉堛伄銉戙儠銈┿兗銉炪兂銈广倰瑭曚尽銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍�備緥銇堛伆銆丼andbox 銉︺兗銈躲兗銇�1鍒嗛枔銇�10鍥為�g稓銇с儝銉冦儓銉嗐偣銉堛倰瀹熻銇椼仧鍫村悎銆併仢銇儻銉笺偗銈广儦銉笺偣銇銇�1鍒嗛枔銆併儑銉笺偪銈汇儍銉堛伄浣滄垚銆佸墛闄ゃ�佹洿鏂般�併儔銈儱銉°兂銉堛伄銈€儍銉椼儹銉笺儔銈勪慨姝c仾銇┿伄鎿嶄綔銈掍竴鏅傜殑銇疅琛屻仹銇嶃仾銇忋仾銈娿伨銇欍��',
+    apiRateLimit: 'API銉兗銉堝埗闄�',
+    apiRateLimitUnit: '{{count,number}}/鏃�',
+    unlimitedApiRate: '鐒″埗闄愩伄API銈炽兗銉�',
+    apiRateLimitTooltip: 'API銉兗銉堝埗闄愩伅銆併儐銈偣銉堢敓鎴愩�併儊銉c儍銉堛儨銉冦儓銆併儻銉笺偗銉曘儹銉笺�併儔銈儱銉°兂銉堝嚘鐞嗐仾銇┿�丏ify API绲岀敱銇仚銇广仸銇儶銈偍銈广儓銇仼鐢ㄣ仌銈屻伨銇欍��',
+    documentProcessingPriority: '鏂囨浉鍑︾悊',
+    documentProcessingPriorityUpgrade: '銈堛倞楂樸亜绮惧害銇ㄩ珮閫熴仾閫熷害銇с儑銉笺偪銈掑嚘鐞嗐仐銇俱仚銆�',
+    priority: {
+      'standard': '妯欐簴',
+      'priority': '鍎厛',
+      'top-priority': '鏈�鍎厛',
+    },
+    logsHistory: '{{days}}銇儹銈板饱姝�',
+    customTools: '銈偣銈裤儬銉勩兗銉�',
+    unavailable: '鍒╃敤涓嶅彲',
+    days: '鏃ラ枔',
+    unlimited: '鐒″埗闄�',
+    support: '銈点儩銉笺儓',
+    supportItems: {
+      communityForums: '銈炽儫銉ャ儖銉嗐偅銉曘偐銉笺儵銉�',
+      emailSupport: '銉°兗銉偟銉濄兗銉�',
+      priorityEmail: '鍎厛銉°兗銉紗銉併儯銉冦儓銈点儩銉笺儓',
+      logoChange: '銉偞澶夋洿',
+      SSOAuthentication: 'SSO瑾嶈',
+      personalizedSupport: '鍊嬪垾銈点儩銉笺儓',
+      dedicatedAPISupport: '灏傜敤API銈点儩銉笺儓',
+      customIntegration: '銈偣銈裤儬绲卞悎銇ㄣ偟銉濄兗銉�',
+      ragAPIRequest: 'RAG API銉偗銈ㄣ偣銉�',
+      bulkUpload: '銉夈偔銉ャ儭銉炽儓銇竴鎷偄銉冦儣銉兗銉�',
+      agentMode: '銈ㄣ兗銈搞偋銉炽儓銉€兗銉�',
+      workflow: '銉兗銈儠銉兗',
+      llmLoadingBalancing: 'LLM銉兗銉夈儛銉┿兂銈枫兂銈�',
+      llmLoadingBalancingTooltip: 'API銉兗銉堝埗闄愩倰鍔规灉鐨勩伀鍥為伩銇欍倠銇熴倎銇�併儮銉囥儷銇鏁般伄API銈兗銈掕拷鍔犮仚銈嬨��',
+    },
+    comingSoon: '杩戞棩鍏枊',
+    member: '銉°兂銉愩兗',
+    memberAfter: '銉°兂銉愩兗',
+    messageRequest: {
+      title: '{{count,number}}銉°儍銈汇兗銈�',
+      titlePerMonth: '{{count,number}}銉°儍銈汇兗銈�/鏈�',
+      tooltip: 'Open Al銉€儑銉倰浣跨敤銇欍倠銇曘伨銇栥伨銇儣銉┿兂銇儭銉冦偦銉笺偢鍛笺伋鍑恒仐銈偐銉笺偪銆備笂闄愩倰瓒呫亪銈嬨儭銉冦偦銉笺偢銇�丱pen AI API銈兗銈掍娇鐢ㄣ仐銇俱仚銆�',
+    },
+    annotatedResponse: {
+      title: '{{count,number}}銇敞閲堛偗銈┿兗銈垮埗闄�',
+      tooltip: '鎵嬪嫊銇с伄鍥炵瓟銇法闆嗐仺娉ㄩ噲銇倛銈娿�併偒銈广偪銉炪偆銈哄彲鑳姐仾楂樺搧璩伄璩晱蹇滅瓟姗熻兘銈掋偄銉椼儶銇彁渚涖仐銇俱仚銆傦紙銉併儯銉冦儓銈€儣銉伄銇裤伀閬╃敤锛�',
+    },
+    ragAPIRequestTooltip: 'Dify銇儕銉儍銈搞儥銉笺偣鍑︾悊姗熻兘銇伩銈掑懠銇冲嚭銇橝PI鍛笺伋鍑恒仐銇暟銈掓寚銇椼伨銇欍��',
+    receiptInfo: '銉併兗銉犮偑銉笺儕銉笺仺銉併兗銉犵鐞嗚�呫伄銇裤亴璩艰銇娿倛銇宠珛姹傛儏鍫便倰琛ㄧず銇с亶銇俱仚',
+  },
+  plans: {
+    sandbox: {
+      name: 'Sandbox',
+      for: '涓昏姗熻兘銇劇鏂欎綋楱�',
+      description: '涓昏姗熻兘銈掔劇鏂欍仹浣撻〒',
+    },
+    professional: {
+      name: 'Professional',
+      for: '鍊嬩汉闁嬬櫤鑰�/灏忚妯°儊銉笺儬鍚戙亼',
+      description: '鍊嬩汉闁嬬櫤鑰呫兓灏忚妯°儊銉笺儬銇渶閬�',
+    },
+    team: {
+      name: 'Team',
+      for: '涓妯°儊銉笺儬鍚戙亼',
+      description: '鎴愰暦鏈熴伄銉併兗銉犮伀蹇呰銇鑳姐倰鍌欍亪銇熴儣銉┿兂',
+    },
+    community: {
+      name: '銈炽儫銉ャ儖銉嗐偅',
+      for: '鍊嬩汉/灏忚妯°儊銉笺儬銉婚潪鍠跺埄銉椼儹銈搞偋銈儓鍚戙亼',
+      description: '銈兗銉椼兂銈姐兗銈圭増銇劇鏂欍儣銉┿兂',
+      price: '鐒℃枡',
+      btnText: '銈炽儫銉ャ儖銉嗐偅鐗堛倰濮嬨倎銇俱仐銈囥亞',
+      includesTitle: '鐒℃枡姗熻兘:',
+      features: [
+        '銉戙儢銉儍銈儶銉濄偢銉堛儶銇叏銈炽偄姗熻兘',
+        '銈枫兂銈般儷銉兗銈偣銉氥兗銈�',
+        'Dify銈兗銉椼兂銈姐兗銈广儵銈ゃ偦銉炽偣婧栨嫚',
+      ],
+    },
+    premium: {
+      name: '銉椼儸銉熴偄銉�',
+      for: '涓妯$祫绻斻兓銉併兗銉犲悜銇�',
+      description: '銈儵銈︺儔瀵惧繙銇嫛寮电増銉椼儵銉�',
+      price: '寰撻噺鍒�',
+      priceTip: '銈儵銈︺儔銉炪兗銈便儍銉堛儣銉偆銈瑰熀婧�',
+      btnText: '銉椼儸銉熴偄銉犵増銈掑彇寰�',
+      includesTitle: '銈炽儫銉ャ儖銉嗐偅鐗堟鑳姐伀鍔犮亪銇�:',
+      comingSoon: 'Microsoft Azure & Google Cloud 杩戞棩瀵惧繙',
+      features: [
+        '銈儵銈︺儔銉椼儹銉愩偆銉�銉笺伀銈堛倠鑷繁绠$悊',
+        '銈枫兂銈般儷銉兗銈偣銉氥兗銈�',
+        'Web銈€儣銉伄銉偞锛嗐儢銉┿兂銉夈偒銈广偪銉炪偆銈�',
+        '鍎厛銉°兗銉�/銉併儯銉冦儓銈点儩銉笺儓',
+      ],
+    },
+    enterprise: {
+      name: '銈ㄣ兂銈裤兗銉椼儵銈ゃ偤',
+      for: '澶ц妯°儊銉笺儬銉讳紒妤悜銇�',
+      description: '浼佹キ銉儥銉伄銈汇偔銉ャ儶銉嗐偅銇ㄣ偒銈广偪銉炪偆銈恒倰瀹熺従',
+      price: '銈偣銈裤儬',
+      priceTip: '骞撮枔濂戠磩灏傜敤',
+      btnText: '鍠舵キ銇浉璜�',
+      includesTitle: '銉椼儸銉熴偄銉犵増姗熻兘銇姞銇堛仸:',
+      features: [
+        '銈ㄣ兂銈裤兗銉椼儵銈ゃ偤鍚戙亼鎷″嫉銈姐儶銉ャ兗銈枫儳銉�',
+        '鍟嗙敤銉┿偆銈汇兂銈硅獚鍙�',
+        '浼佹キ灏傜敤姗熻兘',
+        '銉炪儷銉併儻銉笺偗銈广儦銉笺偣绠$悊',
+        '銈枫兂銈般儷銈点偆銉炽偑銉筹紙SSO锛�',
+        'Dify銉戙兗銉堛儕銉笺伀銈堛倠SLA淇濊',
+        '楂樺害銇偦銈儱銉儐銈g鐞�',
+        '鍏紡銉°兂銉嗐儕銉炽偣锛嗐偄銉冦儣銉囥兗銉�',
+        '銉椼儹銉曘偋銉冦偡銉с儕銉妧琛撴敮鎻�',
+      ],
+    },
+  },
+  vectorSpace: {
+    fullTip: '鐭ヨ瓨銉囥兗銈裤偣銉堛儸銉笺偢銇屻亜銇c伇銇勩仹銇欍��',
+    fullSolution: '銈堛倞澶氥亸銇偣銉氥兗銈广倰寰椼倠銇熴倎銇儣銉┿兂銈掋偄銉冦儣銈般儸銉笺儔銇椼仸銇忋仩銇曘亜銆�',
+  },
+  apps: {
+    fullTipLine1: '銈堛倞澶氥亸銇偄銉椼儶銈掍綔鎴愩仚銈嬨伀銇��',
+    fullTipLine2: '銉椼儵銉炽倰銈€儍銉椼偘銉兗銉夈仐銇︺亸銇犮仌銇勩��',
+    fullTip1: '銈€儣銉倰銈傘仯銇ㄤ綔鎴愩仚銈嬨仧銈併伀銈€儍銉椼偘銉兗銉夈仚銈�',
+    contactUs: '銇婂晱銇勫悎銈忋仜',
+    fullTip2: '銉椼儵銉炽伄鍒堕檺銇仈銇椼伨銇椼仧',
+    fullTip2des: '浣跨敤鐘舵硜銈掕В鏀俱仚銈嬨仧銈併伀闈炪偄銈儐銈c儢銇偄銉椼儶銈便兗銈枫儳銉炽倰鏁寸悊銇欍倠銇撱仺銈掋亰鍕с倎銇椼伨銇欍�傘伨銇熴伅銆併亰鍟忋亜鍚堛倧銇涖亸銇犮仌銇勩��',
+    fullTip1des: '銇撱伄銉椼儵銉炽仹銇偄銉椼儶妲嬬瘔銇埗闄愩伀閬斻仐銇俱仐銇�',
+  },
+  annotatedResponse: {
+    fullTipLine1: '銈堛倞澶氥亸銇細瑭便倰娉ㄩ噲銇欍倠銇伅銆�',
+    fullTipLine2: '銉椼儵銉炽倰銈€儍銉椼偘銉兗銉夈仐銇︺亸銇犮仌銇勩��',
+    quotaTitle: '娉ㄩ噲杩斾俊銈偐銉笺偪',
+  },
+  teamMembers: '銉併兗銉犮儭銉炽儛銉�',
+}
+
+export default translation
diff --git a/i18n/ja-JP/common.ts b/i18n/ja-JP/common.ts
new file mode 100644
index 0000000..e85f8d2
--- /dev/null
+++ b/i18n/ja-JP/common.ts
@@ -0,0 +1,672 @@
+const translation = {
+  theme: {
+    theme: '銉嗐兗銉�',
+    light: '鏄庛倠銇�',
+    dark: '鏆椼亜',
+    auto: '銈枫偣銉嗐儬',
+  },
+  api: {
+    success: '鎴愬姛',
+    actionSuccess: '銈€偗銈枫儳銉炽亴鎴愬姛銇椼伨銇椼仧',
+    saved: '淇濆瓨娓堛伩',
+    create: '浣滄垚娓堛伩',
+    remove: '鍓婇櫎娓堛伩',
+  },
+  operation: {
+    create: '浣滄垚',
+    confirm: '纰鸿獚',
+    cancel: '銈儯銉炽偦銉�',
+    clear: '銈儶銈�',
+    save: '淇濆瓨',
+    saveAndEnable: '淇濆瓨 & 鏈夊姽銇�',
+    edit: '绶ㄩ泦',
+    add: '杩藉姞',
+    added: '杩藉姞娓堛伩',
+    refresh: '銉儠銉儍銈枫儱',
+    reset: '銉偦銉冦儓',
+    search: '妞滅储',
+    change: '澶夋洿',
+    remove: '鍓婇櫎',
+    send: '閫佷俊',
+    copy: '銈炽償銉�',
+    lineBreak: '鏀硅',
+    sure: '纰鸿獚娓堛伩',
+    download: '銉�銈︺兂銉兗銉�',
+    downloadSuccess: '銉�銈︺兂銉兗銉夊畬浜�',
+    downloadFailed: '銉�銈︺兂銉兗銉夈伀澶辨晽銇椼伨銇椼仧銆佸緦銇у啀瑭﹁銇椼仸銇忋仩銇曘亜銆�',
+    delete: '鍓婇櫎',
+    settings: '瑷畾',
+    setup: '銈汇儍銉堛偄銉冦儣',
+    getForFree: '鐒℃枡銇у叆鎵�',
+    reload: '鍐嶈銇胯炯銇�',
+    ok: 'OK',
+    log: '銉偘',
+    learnMore: '瑭崇窗銇亾銇°倝',
+    params: '銉戙儵銉°兗銈�',
+    duplicate: '閲嶈',
+    rename: '鍚嶅墠銇鏇�',
+    audioSourceUnavailable: 'AudioSource 銇屽埄鐢ㄣ仹銇嶃伨銇涖倱',
+    zoomIn: '銈恒兗銉犮偆銉炽仚銈�',
+    openInNewTab: '鏂般仐銇勩偪銉栥仹闁嬨亸',
+    zoomOut: '銈恒兗銉犮偄銈︺儓',
+    copyImage: '鐢诲儚銈掋偝銉斻兗',
+    saveAndRegenerate: '淇濆瓨銇椼仸瀛愩儊銉c兂銈倰鍐嶇敓鎴�',
+    close: '闁夈仒銈�',
+    view: '琛ㄧず',
+    viewMore: '銇曘倝銇〃绀�',
+    regenerate: '鍐嶇敓鎴�',
+    submit: '閫佷俊',
+    skip: '銈广偔銉冦儣',
+    imageCopied: '銈炽償銉笺仐銇熺敾鍍�',
+    deleteApp: '銈€儣銉倰鍓婇櫎',
+    viewDetails: '瑭崇窗銈掕銈�',
+    copied: '銈炽償銉笺仐銇俱仐銇�',
+    in: '涓�',
+    format: '銉曘偐銉笺優銉冦儓',
+    more: '銈傘仯銇�',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}}銇繀瑕併仹銇�',
+    urlError: 'URL 銇� http:// 銇俱仧銇� https:// 銇у銇俱倠蹇呰銇屻亗銈娿伨銇�',
+  },
+  placeholder: {
+    input: '鍏ュ姏銇椼仸銇忋仩銇曘亜',
+    select: '閬告姙銇椼仸銇忋仩銇曘亜',
+  },
+  voice: {
+    language: {
+      zhHans: '涓浗瑾�',
+      zhHant: '绻佷綋瀛椾腑鍥借獮',
+      enUS: '鑻辫獮',
+      deDE: '銉夈偆銉勮獮',
+      frFR: '銉曘儵銉炽偣瑾�',
+      esES: '銈广儦銈ゃ兂瑾�',
+      itIT: '銈ゃ偪銉偄瑾�',
+      thTH: '銈裤偆瑾�',
+      idID: '銈ゃ兂銉夈儘銈枫偄瑾�',
+      jaJP: '鏃ユ湰瑾�',
+      koKR: '闊撳浗瑾�',
+      ptBR: '銉濄儷銉堛偓銉獮',
+      ruRU: '銉偡銈㈣獮',
+      ukUA: '銈︺偗銉┿偆銉婅獮',
+      viVN: '銉欍儓銉娿儬瑾�',
+      plPL: '銉濄兗銉┿兂銉夎獮',
+      roRO: '銉兗銉炪儖銈㈣獮',
+      hiIN: '銉掋兂銉囥偅銉艰獮',
+      trTR: '銉堛儷銈宠獮',
+      faIR: '銉氥儷銈枫偄瑾�',
+    },
+  },
+  unit: {
+    char: '鏂囧瓧',
+  },
+  actionMsg: {
+    noModification: '鐝惧湪銇鏇淬仌銈屻仸銇勩伨銇涖倱銆�',
+    modifiedSuccessfully: '澶夋洿銇屾甯搞伀琛屻倧銈屻伨銇椼仧',
+    modifiedUnsuccessfully: '澶夋洿銇屽け鏁椼仐銇俱仐銇�',
+    copySuccessfully: '銈炽償銉笺亴姝e父銇銈忋倢銇俱仐銇�',
+    paySucceeded: '鏀墪銇勩亴鎴愬姛銇椼伨銇椼仧',
+    payCancelled: '鏀墪銇勩亴銈儯銉炽偦銉仌銈屻伨銇椼仧',
+    generatedSuccessfully: '鐢熸垚銇屾垚鍔熴仐銇俱仐銇�',
+    generatedUnsuccessfully: '鐢熸垚銇屽け鏁椼仐銇俱仐銇�',
+  },
+  model: {
+    params: {
+      temperature: '娓╁害',
+      temperatureTip:
+        '銉┿兂銉�銉犳�с倰鍒跺尽銇椼伨銇欙細娓╁害銈掍笅銇掋倠銇ㄣ�併倛銈娿儵銉炽儉銉犮仾瀹屾垚鍝併亴寰椼倝銈屻伨銇欍�傛俯搴︺亴銈笺儹銇繎銇ャ亸銇仱銈屻仸銆併儮銉囥儷銇焙瀹氱殑銇у弽寰╃殑銇仾銈娿伨銇欍��',
+      top_p: '涓婁綅P',
+      top_pTip:
+        '銉嬨儱銉笺偗銉偄銈广偟銉炽儣銉兂銈般伀銈堛倠澶氭鎬с伄鍒跺尽锛�0.5銇�併仚銇广仸銇挨搴﹀姞閲嶃偑銉椼偡銉с兂銇崐鍒嗐亴鑰冩叜銇曘倢銈嬨亾銇ㄣ倰鎰忓懗銇椼伨銇欍��',
+      presence_penalty: '瀛樺湪銉氥儕銉儐銈�',
+      presence_penaltyTip:
+        '銇撱倢銇俱仹銇儐銈偣銉堛伀銉堛兗銈兂銇岃〃绀恒仌銈屻倠銇嬨仼銇嗐亱銇熀銇ャ亜銇︺�佹柊銇椼亜銉堛兗銈兂銇亜銇忋倝銉氥儕銉儐銈c倰绉戙仚銇嬨倰鍒跺尽銇椼伨銇欍�俓n銉€儑銉亴鏂般仐銇勩儓銉斻儍銈伀銇ゃ亜銇﹁┍銇欏彲鑳芥�с亴楂樸伨銈娿伨銇欍��',
+      frequency_penalty: '闋诲害銉氥儕銉儐銈�',
+      frequency_penaltyTip:
+        '銇撱倢銇俱仹銇儐銈偣銉堝唴銇儓銉笺偗銉炽伄鏃㈠瓨銇牷搴︺伀鍩恒仴銇勩仸銆佹柊銇椼亜銉堛兗銈兂銇仼銈屻仩銇戙儦銉娿儷銉嗐偅銈掔銇欍亱銈掑埗寰°仐銇俱仚銆俓n銉€儑銉亴鍚屻仒琛屻倰鏂囧瓧閫氥倞銇拱銈婅繑銇欏彲鑳芥�с亴浣庛亸銇倞銇俱仚銆�',
+      max_tokens: '鏈�澶с儓銉笺偗銉�',
+      max_tokensTip:
+        '杩斾俊銇渶澶ч暦銈掋儓銉笺偗銉冲崢浣嶃仹鍒堕檺銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍�俓n澶с亶銇�ゃ伅銉椼儹銉炽儣銉堛伄鍗樿獮銆併儊銉c儍銉堛儹銈般�併亰銈堛伋銉娿儸銉冦偢銇仧銈併伀娈嬨仌銈屻仧銈广儦銉笺偣銈掑埗闄愩仚銈嬪彲鑳芥�с亴銇傘倞銇俱仚銆俓n銇濄倢銈�2/3浠ヤ笅銇ō瀹氥仚銈嬨亾銇ㄣ倰銇婂嫥銈併仐銇俱仚銆俓ngpt-4-1106-preview銆乬pt-4-vision-preview銇渶澶с儓銉笺偗銉筹紙鍏ュ姏128k鍑哄姏4k锛変互涓嬨伀瑷畾銇欍倠銇撱仺銈掋亰鍕с倎銇椼伨銇欍��',
+      maxTokenSettingTip: '鏈�澶с儓銉笺偗銉宠ō瀹氥亴楂樸亜銇熴倎銆併儣銉兂銉椼儓銆併偗銈ㄣ儶銆併亰銈堛伋銉囥兗銈裤伄銈广儦銉笺偣銇屽埗闄愩仌銈屻倠鍙兘鎬с亴銇傘倞銇俱仚銆傜従鍦ㄣ伄銉€儑銉伄鏈�澶с儓銉笺偗銉炽伄80%浠ヤ笅銇ō瀹氥仐銇︺亸銇犮仌銇勩��',
+      setToCurrentModelMaxTokenTip: '鏈�澶с儓銉笺偗銉炽亴鐝惧湪銇儮銉囥儷銇渶澶с儓銉笺偗銉炽伄80%銇洿鏂般仌銈屻伨銇椼仧 {{maxToken}}.',
+      stop_sequences: '鍋滄銈枫兗銈便兂銈�',
+      stop_sequencesTip: 'API銇岄�茶涓伄銉堛兗銈兂銇敓鎴愩倰鍋滄銇欍倠鏈�澶�4銇ゃ伄銈枫兗銈便兂銈广�傝繑銇曘倢銇熴儐銈偣銉堛伀銇仠姝€偡銉笺偙銉炽偣銇惈銇俱倢銇俱仜銈撱��',
+      stop_sequencesPlaceholder: '銈枫兗銈便兂銈广倰鍏ュ姏銇椼仸銈裤儢銈兗銈掓娂銇椼仸銇忋仩銇曘亜',
+    },
+    tone: {
+      Creative: '銈儶銈ㄣ偆銉嗐偅銉�',
+      Balanced: '銉愩儵銉炽偣',
+      Precise: '姝g⒑',
+      Custom: '銈偣銈裤儬',
+    },
+    addMoreModel: '瑷畾鐢婚潰銇嬨倝浠栥伄銉€儑銉倰杩藉姞銇椼仸銇忋仩銇曘亜',
+    capabilities: '銉炪儷銉併儮銉笺儉銉鑳�',
+    settingsLink: '銉€儑銉儣銉儛銈ゃ儉銉艰ō瀹�',
+  },
+  menus: {
+    status: '銉欍兗銈跨増',
+    explore: '鎺㈢储',
+    apps: '銈广偪銈搞偑',
+    plugins: '銉椼儵銈般偆銉�',
+    pluginsTips: '銈点兗銉夈儜銉笺儐銈c伄銉椼儵銈般偆銉炽倰绲卞悎銇欍倠銇嬨�丆hatGPT浜掓彌銇瓵I銉椼儵銈般偆銉炽倰浣滄垚銇椼伨銇欍��',
+    datasets: '銉娿儸銉冦偢',
+    datasetsTips: '杩戞棩鍏枊锛氱嫭鑷伄銉嗐偔銈广儓銉囥兗銈裤倰銈ゃ兂銉濄兗銉堛仚銈嬨亱銆乄ebhook銈掍粙銇椼仸銉偄銉偪銈ゃ儬銇儑銉笺偪銈掕杩般仐銇LM銈炽兂銉嗐偔銈广儓銈掑挤鍖栥仐銇俱仚銆�',
+    newApp: '鏂般仐銇勩偄銉椼儶',
+    newDataset: '銉娿儸銉冦偢銇綔鎴�',
+    tools: '銉勩兗銉�',
+    exploreMarketplace: '銉炪兗銈便儍銉堛儣銉偆銈广倰鎺㈢储銇欍倠',
+  },
+  userProfile: {
+    settings: '瑷畾',
+    emailSupport: '銈点儩銉笺儓',
+    workspace: '銉兗銈偣銉氥兗銈�',
+    createWorkspace: '銉兗銈偣銉氥兗銈广倰浣滄垚',
+    helpCenter: '銉樸儷銉�',
+    support: '銈点儩銉笺儓',
+    compliance: '銈炽兂銉椼儵銈ゃ偄銉炽偣',
+    communityFeedback: '銉曘偅銉笺儔銉愩儍銈�',
+    roadmap: '銉兗銉夈優銉冦儣',
+    community: '銈炽儫銉ャ儖銉嗐偅',
+    about: 'Dify銇仱銇勩仸',
+    logout: '銉偘銈€偊銉�',
+    github: '銈儍銉堛儚銉�',
+  },
+  compliance: {
+    soc2Type1: 'SOC 2 Type I 鍫卞憡鏇�',
+    soc2Type2: 'SOC 2 Type II 鍫卞憡鏇�',
+    iso27001: 'ISO 27001:2022 瑾嶈',
+    gdpr: 'GDPR 銉囥兗銈垮嚘鐞嗗绱勶紙DPA锛�',
+    sandboxUpgradeTooltip: '銉椼儹銉曘偋銉冦偡銉с儕銉儣銉┿兂銇俱仧銇儊銉笺儬銉椼儵銉炽仹銇伩鍒╃敤鍙兘',
+    professionalUpgradeTooltip: '銉併兗銉犮儣銉┿兂浠ヤ笂銇绱勩亴蹇呰銇с仚',
+  },
+  settings: {
+    accountGroup: '銈€偒銈︺兂銉�',
+    workplaceGroup: '銉兗銈偣銉氥兗銈�',
+    account: '銉炪偆銈€偒銈︺兂銉�',
+    members: '銉°兂銉愩兗',
+    billing: '璜嬫眰',
+    integrations: '绲卞悎',
+    language: '瑷�瑾�',
+    provider: '銉€儑銉儣銉儛銈ゃ儉銉�',
+    dataSource: '銉囥兗銈裤偨銉笺偣',
+    plugin: '銉椼儵銈般偆銉�',
+    apiBasedExtension: 'API鎷″嫉',
+    generalGroup: '涓�鑸�',
+  },
+  account: {
+    avatar: '銈€儛銈裤兗',
+    name: '鍚嶅墠',
+    email: '銉°兗銉�',
+    password: '銉戙偣銉兗銉�',
+    passwordTip: '涓�鏅傜殑銇儹銈般偆銉炽偝銉笺儔銈掍娇鐢ㄣ仐銇熴亸銇亜鍫村悎銇�佹案缍氱殑銇儜銈广儻銉笺儔銈掕ō瀹氥仹銇嶃伨銇欍��',
+    setPassword: '銉戙偣銉兗銉夈倰瑷畾',
+    resetPassword: '銉戙偣銉兗銉夈倰銉偦銉冦儓',
+    currentPassword: '鐝惧湪銇儜銈广儻銉笺儔',
+    newPassword: '鏂般仐銇勩儜銈广儻銉笺儔',
+    confirmPassword: '銉戙偣銉兗銉夈倰纰鸿獚',
+    notEqual: '2銇ゃ伄銉戙偣銉兗銉夈亴鐣般仾銈娿伨銇欍��',
+    langGeniusAccount: 'Dify銈€偒銈︺兂銉�',
+    langGeniusAccountTip: 'Dify銈€偒銈︺兂銉堛仺闁㈤�c仚銈嬨儲銉笺偠銉笺儑銉笺偪銆�',
+    editName: '鍚嶅墠銈掔法闆�',
+    showAppLength: '{{length}}銈€儣銉倰琛ㄧず',
+    delete: '銈€偒銈︺兂銉堛倰鍓婇櫎',
+    deleteTip: '銈€偒銈︺兂銉堛倰鍓婇櫎銇欍倠銇ㄣ�併仚銇广仸銇儑銉笺偪銇屽畬鍏ㄣ伀娑堝幓銇曘倢銆佸京鍏冦仹銇嶃仾銇忋仾銈娿伨銇欍��',
+    deleteConfirmTip: '纰鸿獚銇仧銈併�佺櫥閷层仐銇熴儭銉笺儷銇嬨倝娆°伄鍐呭銈掋伀閫佷俊銇椼仸銇忋仩銇曘亜 ',
+    account: '銈€偒銈︺兂銉�',
+    myAccount: '銉炪偆銈€偒銈︺兂銉�',
+    studio: 'Dify銈广偪銈搞偑',
+    deletePrivacyLinkTip: '銇婂妲樸伄銉囥兗銈裤伄鍙栥倞鎵便亜鏂规硶銇┏绱般伀銇ゃ亜銇︺伅銆佸綋绀俱伄',
+    deletePrivacyLink: '銉椼儵銈ゃ儛銈枫兗銉濄儶銈枫兗銆�',
+    deleteSuccessTip: '銈€偒銈︺兂銉堛伄鍓婇櫎銇屽畬浜嗐仚銈嬨伨銇с伀鏅傞枔銇屽繀瑕併仹銇欍�傘仚銇广仸瀹屼簡銇椼伨銇椼仧銈夈�併儭銉笺儷銇с亰鐭ャ倝銇涖仐銇俱仚銆�',
+    deleteLabel: '纰鸿獚銇欍倠銇伅銆佷互涓嬨伀銉°兗銉偄銉夈儸銈广倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+    deletePlaceholder: '銉°兗銉偄銉夈儸銈广倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+    verificationLabel: '瑾嶈銈炽兗銉�',
+    verificationPlaceholder: '6妗併伄銈炽兗銉夈倰璨笺倞浠樸亼銇俱仚',
+    permanentlyDeleteButton: '銈€偒銈︺兂銉堛倰瀹屽叏銇墛闄�',
+    feedbackTitle: '銉曘偅銉笺儔銉愩儍銈�',
+    feedbackLabel: '銈€偒銈︺兂銉堛倰鍓婇櫎銇椼仧鐞嗙敱銈掓暀銇堛仸銇忋仩銇曘亜銆�',
+    feedbackPlaceholder: '闅忔剰',
+    sendVerificationButton: '纰鸿獚銈炽兗銉夈伄閫佷俊',
+    editWorkspaceInfo: '銉兗銈偣銉氥兗銈规儏鍫便倰绶ㄩ泦',
+    workspaceName: '銉兗銈偣銉氥兗銈瑰悕',
+    workspaceIcon: '銉兗銈偣銉氥兗銈广偄銈ゃ偝銉�',
+  },
+  members: {
+    team: '銉併兗銉�',
+    invite: '鎷涘緟',
+    name: '鍚嶅墠',
+    lastActive: '鏈�绲傘偄銈儐銈c儢',
+    role: '銉兗銉�',
+    pending: '淇濈暀涓�...',
+    owner: '銈兗銉娿兗',
+    admin: '绠$悊鑰�',
+    adminTip: '銈€儣銉伄妲嬬瘔銇娿倛銇炽儊銉笺儬瑷畾銇鐞嗐亴銇с亶銇俱仚',
+    normal: '閫氬父',
+    normalTip: '銈€儣銉伄浣跨敤銇伩銇屽彲鑳姐仹銆併偄銉椼儶銇绡夈伅銇с亶銇俱仜銈�',
+    builder: '銉撱儷銉�銉�',
+    builderTip: '鐙嚜銇偄銉椼儶銈掍綔鎴愩兓绶ㄩ泦銇с亶銈�',
+    editor: '銈ㄣ儑銈c偪銉�',
+    editorTip: '銈€儣銉伄妲嬬瘔銇屻仹銇嶃伨銇欍亴銆併儊銉笺儬瑷畾銇鐞嗐伅銇с亶銇俱仜銈�',
+    datasetOperator: '銉娿儸銉冦偢绠$悊鍝�',
+    datasetOperatorTip: '銉娿儸銉冦偢銉欍兗銈广伄銇裤倰绠$悊銇с亶銈�',
+    inviteTeamMember: '銉併兗銉犮儭銉炽儛銉笺倰鎷涘緟銇欍倠',
+    inviteTeamMemberTip: '褰笺倝銇偟銈ゃ兂銈ゃ兂寰屻�佺洿鎺ャ亗銇仧妲樸伄銉併兗銉犮儑銉笺偪銇偄銈偦銈广仹銇嶃伨銇欍��',
+    emailNotSetup: '銉°兗銉偟銉笺儛銉笺亴銈汇儍銉堛偄銉冦儣銇曘倢銇︺亜銇亜銇仹銆佹嫑寰呫儭銉笺儷銈掗�佷俊銇欍倠銇撱仺銇仹銇嶃伨銇涖倱銆備唬銈忋倞銇嫑寰呭緦銇櫤琛屻仌銈屻倠鎷涘緟銉兂銈倰銉︺兗銈躲兗銇�氱煡銇椼仸銇忋仩銇曘亜銆�',
+    email: '銉°兗銉�',
+    emailInvalid: '鐒″姽銇儭銉笺儷褰㈠紡',
+    emailPlaceholder: '銉°兗銉倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+    sendInvite: '鎷涘緟銈掗�併倠',
+    invitedAsRole: '{{role}}銉︺兗銈躲兗銇ㄣ仐銇︽嫑寰呫仌銈屻伨銇椼仧',
+    invitationSent: '鎷涘緟銇岄�佷俊銇曘倢銇俱仐銇�',
+    invitationSentTip: '鎷涘緟銇岄�佷俊銇曘倢銆佸郊銈夈伅Dify銇偟銈ゃ兂銈ゃ兂銇椼仸銇傘仾銇熸銇儊銉笺儬銉囥兗銈裤伀銈€偗銈汇偣銇с亶銇俱仚銆�',
+    invitationLink: '鎷涘緟銉兂銈�',
+    failedInvitationEmails: '浠ヤ笅銇儲銉笺偠銉笺伅姝e父銇嫑寰呫仌銈屻伨銇涖倱銇с仐銇�',
+    ok: 'OK',
+    removeFromTeam: '銉併兗銉犮亱銈夊墛闄�',
+    removeFromTeamTip: '銉併兗銉犮伕銇偄銈偦銈广亴鍓婇櫎銇曘倢銇俱仚',
+    setAdmin: '绠$悊鑰呫伀瑷畾',
+    setMember: '閫氬父銇儭銉炽儛銉笺伀瑷畾',
+    setBuilder: '銉撱儷銉�銉笺伀瑷畾',
+    setEditor: '銈ㄣ儑銈c偪銉笺伀瑷畾',
+    disInvite: '鎷涘緟銈掋偔銉c兂銈汇儷',
+    deleteMember: '銉°兂銉愩兗銈掑墛闄�',
+    you: '(銇傘仾銇熸)',
+  },
+  integrations: {
+    connected: '鎺ョ稓娓堛伩',
+    google: 'Google',
+    googleAccount: 'Google銈€偒銈︺兂銉堛仹銉偘銈ゃ兂',
+    github: 'GitHub',
+    githubAccount: 'GitHub銈€偒銈︺兂銉堛仹銉偘銈ゃ兂',
+    connect: '鎺ョ稓',
+  },
+  language: {
+    displayLanguage: '琛ㄧず瑷�瑾�',
+    timezone: '銈裤偆銉犮偩銉笺兂',
+  },
+  provider: {
+    apiKey: 'API銈兗',
+    enterYourKey: '銇撱亾銇獳PI銈兗銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    invalidKey: '鐒″姽銇狾penAI API銈兗',
+    validatedError: '妞滆銇け鏁椼仐銇俱仐銇燂細',
+    validating: '銈兗銇瑷间腑...',
+    saveFailed: 'API銈兗銇繚瀛樸伀澶辨晽銇椼伨銇椼仧',
+    apiKeyExceedBill: '銇撱伄API KEY銇伅浣跨敤鍙兘銇偗銈┿兗銈裤亴銇傘倞銇俱仜銈撱�傝┏绱般伅',
+    addKey: '銈兗銈掕拷鍔�',
+    comingSoon: '杩戞棩鍏枊',
+    editKey: '绶ㄩ泦',
+    invalidApiKey: '鐒″姽銇狝PI銈兗',
+    azure: {
+      apiBase: 'API銉欍兗銈�',
+      apiBasePlaceholder: 'Azure OpenAI銈ㄣ兂銉夈儩銈ゃ兂銉堛伄API銉欍兗銈筓RL銆�',
+      apiKey: 'API銈兗',
+      apiKeyPlaceholder: '銇撱亾銇獳PI銈兗銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+      helpTip: 'Azure OpenAI銈点兗銉撱偣銈掑銇�',
+    },
+    openaiHosted: {
+      openaiHosted: '銉涖偣銉嗐儍銉塐penAI',
+      onTrial: '銉堛儵銈ゃ偄銉腑',
+      exhausted: '銈偐銉笺偪銇屼娇銇勬灉銇熴仌銈屻伨銇椼仧',
+      desc: 'Dify銇屾彁渚涖仚銈婳penAI銉涖偣銉嗐偅銉炽偘銈点兗銉撱偣銈掍娇鐢ㄣ仚銈嬨仺銆丟PT-3.5銇仼銇儮銉囥儷銈掍娇鐢ㄣ仹銇嶃伨銇欍�傘儓銉┿偆銈€儷銈偐銉笺偪銇屼娇銇勬灉銇熴仌銈屻倠鍓嶃伀銆佷粬銇儮銉囥儷銉椼儹銉愩偆銉�銈掕ō瀹氥仚銈嬪繀瑕併亴銇傘倞銇俱仚銆�',
+      callTimes: '閫氳┍鍥炴暟',
+      usedUp: '銉堛儵銈ゃ偄銉偗銈┿兗銈裤亴浣裤亜鏋溿仧銇曘倢銇俱仐銇熴�傜嫭鑷伄銉€儑銉儣銉儛銈ゃ儉銈掕拷鍔犮仐銇︺亸銇犮仌銇勩��',
+      useYourModel: '鐝惧湪銆佺嫭鑷伄銉€儑銉儣銉儛銈ゃ儉銈掍娇鐢ㄣ仐銇︺亜銇俱仚銆�',
+      close: '闁夈仒銈�',
+    },
+    anthropicHosted: {
+      anthropicHosted: '銈€兂銈姐償銉冦偗銈儹銉笺儔',
+      onTrial: '銉堛儵銈ゃ偄銉腑',
+      exhausted: '銈偐銉笺偪銇屼娇銇勬灉銇熴仌銈屻伨銇椼仧',
+      desc: '楂樺害銇儉銈ゃ偄銉偘銈勩偗銉偍銈ゃ儐銈c儢銇偝銉炽儐銉炽儎鐢熸垚銇嬨倝瑭崇窗銇寚绀恒伨銇с�佸箙搴冦亜銈裤偣銈伀鍎倢銇熴儜銉儠銉仾銉€儑銉仹銇欍��',
+      callTimes: '閫氳┍鍥炴暟',
+      usedUp: '銉堛儵銈ゃ偄銉偗銈┿兗銈裤亴浣裤亜鏋溿仧銇曘倢銇俱仐銇熴�傜嫭鑷伄銉€儑銉儣銉儛銈ゃ儉銈掕拷鍔犮仐銇︺亸銇犮仌銇勩��',
+      useYourModel: '鐝惧湪銆佺嫭鑷伄銉€儑銉儣銉儛銈ゃ儉銈掍娇鐢ㄣ仐銇︺亜銇俱仚銆�',
+      close: '闁夈仒銈�',
+      trialQuotaTip: '銇婂妲樸伄 Anthropic 瑭︾敤鏋犮伅 2025/03/17 銇け鍔广仐銆併仢銇緦銇埄鐢ㄣ仹銇嶃仾銇忋仾銈娿伨銇欍�傘亰鏃┿倎銇仈鍒╃敤銇忋仩銇曘亜銆�',
+    },
+    anthropic: {
+      using: '鍩嬨倎杈笺伩姗熻兘銇娇鐢ㄤ腑銇с仚',
+      enableTip: 'Anthropic銉€儑銉倰鏈夊姽銇仚銈嬨伀銇�併伨銇歄penAI銇俱仧銇疉zure OpenAI銈点兗銉撱偣銇儛銈ゃ兂銉夈仚銈嬪繀瑕併亴銇傘倞銇俱仚銆�',
+      notEnabled: '鏈夊姽銇仌銈屻仸銇勩伨銇涖倱',
+      keyFrom: 'Anthropic銇嬨倝API銈兗銈掑彇寰椼仐銇︺亸銇犮仌銇�',
+    },
+    encrypted: {
+      front: 'API KEY銇�',
+      back: '鎶�琛撱倰浣跨敤銇椼仸鏆楀彿鍖栥亰銈堛伋淇濆瓨銇曘倢銇俱仚銆�',
+    },
+  },
+  modelProvider: {
+    notConfigured: '銈枫偣銉嗐儬銉€儑銉亴銇俱仩瀹屽叏銇ō瀹氥仌銈屻仸銇娿倝銇氥�佷竴閮ㄣ伄姗熻兘銇屽埄鐢ㄣ仹銇嶃仾銇勫牬鍚堛亴銇傘倞銇俱仚銆�',
+    systemModelSettings: '銈枫偣銉嗐儬銉€儑銉ō瀹�',
+    systemModelSettingsLink: '銈枫偣銉嗐儬銉€儑銉伄瑷畾銇屽繀瑕併仾鐞嗙敱銇綍銇с仚銇嬶紵',
+    selectModel: '銉€儑銉倰閬告姙',
+    setupModelFirst: '銇俱仛銉€儑銉倰銈汇儍銉堛偄銉冦儣銇椼仸銇忋仩銇曘亜',
+    systemReasoningModel: {
+      key: '銈枫偣銉嗐儬鎺ㄨ珫銉€儑銉�',
+      tip: '銈€儣銉伄浣滄垚銇娇鐢ㄣ仌銈屻倠銉囥儠銈┿儷銉堛伄鎺ㄨ珫銉€儑銉倰瑷畾銇椼伨銇欍�傘伨銇熴�佸瑭卞悕銇敓鎴愩倓娆°伄璩晱銇彁妗堛仾銇┿伄姗熻兘銈傘儑銉曘偐銉儓銇帹璜栥儮銉囥儷銈掍娇鐢ㄣ仐銇俱仚銆�',
+    },
+    embeddingModel: {
+      key: '鍩嬨倎杈笺伩銉€儑銉�',
+      tip: '銉娿儸銉冦偢銇儔銈儱銉°兂銉堝煁銈佽炯銇垮嚘鐞嗐伄銉囥儠銈┿儷銉堛儮銉囥儷銈掕ō瀹氥仐銇俱仚銆傘儕銉儍銈搞伄鍙栧緱銇ㄣ偆銉炽儩銉笺儓銇浮鏂广伀銆併亾銇煁銈佽炯銇裤儮銉囥儷銈掋儥銈儓銉寲鍑︾悊銇娇鐢ㄣ仐銇俱仚銆傚垏銈婃浛銇堛倠銇ㄣ�併偆銉炽儩銉笺儓銇曘倢銇熴儕銉儍銈搞仺璩晱銇枔銇儥銈儓銉鍏冦亴涓�鑷淬仜銇氥�佸彇寰椼伀澶辨晽銇椼伨銇欍�傚彇寰椼伄澶辨晽銈掗伩銇戙倠銇熴倎銇伅銆併亾銇儮銉囥儷銈掍换鎰忋伀鍒囥倞鏇裤亪銇亜銇с亸銇犮仌銇勩��',
+      required: '鍩嬨倎杈笺伩銉€儑銉亴蹇呰銇с仚',
+    },
+    speechToTextModel: {
+      key: '闊冲0-to-銉嗐偔銈广儓銉€儑銉�',
+      tip: '浼氳┍銇с伄闊冲0-to-銉嗐偔銈广儓鍏ュ姏銇娇鐢ㄣ仚銈嬨儑銉曘偐銉儓銉€儑銉倰瑷畾銇椼伨銇欍��',
+    },
+    ttsModel: {
+      key: '銉嗐偔銈广儓-to-闊冲0銉€儑銉�',
+      tip: '浼氳┍銇с伄銉嗐偔銈广儓-to-闊冲0鍏ュ姏銇娇鐢ㄣ仚銈嬨儑銉曘偐銉儓銉€儑銉倰瑷畾銇椼伨銇欍��',
+    },
+    rerankModel: {
+      key: 'Rerank銉€儑銉�',
+      tip: 'Rerank銉€儑銉伅銆併儲銉笺偠銉笺偗銈ㄣ儶銇ㄣ伄鎰忓懗鐨勪竴鑷淬伀鍩恒仴銇勩仸鍊欒鏂囨浉銉偣銉堛倰鍐嶉厤缃仐銆佹剰鍛崇殑銉┿兂銈兂銈般伄绲愭灉銈掑悜涓娿仌銇涖伨銇欍��',
+    },
+    apiKey: 'API-銈兗',
+    quota: '銈偐銉笺偪',
+    searchModel: '妞滅储銉€儑銉�',
+    noModelFound: '{{model}}銇銇欍倠銉€儑銉亴瑕嬨仱銇嬨倞銇俱仜銈�',
+    models: '銉€儑銉�',
+    showMoreModelProvider: '銈堛倞澶氥亸銇儮銉囥儷銉椼儹銉愩偆銉�銈掕〃绀�',
+    selector: {
+      tip: '銇撱伄銉€儑銉伅鍓婇櫎銇曘倢銇俱仐銇熴�傚垾銇儮銉囥儷銈掕拷鍔犮仚銈嬨亱銆佸垾銇儮銉囥儷銈掗伕鎶炪仐銇︺亸銇犮仌銇勩��',
+      emptyTip: '鍒╃敤鍙兘銇儮銉囥儷銇亗銈娿伨銇涖倱',
+      emptySetting: '瑷畾銇Щ鍕曘仐銇︽鎴愩仐銇︺亸銇犮仌銇�',
+      rerankTip: 'Rerank銉€儑銉倰瑷畾銇椼仸銇忋仩銇曘亜',
+    },
+    card: {
+      quota: '銈偐銉笺偪',
+      onTrial: '銉堛儵銈ゃ偄銉腑',
+      paid: '鏈夋枡',
+      quotaExhausted: '銈偐銉笺偪銇屼娇銇勬灉銇熴仌銈屻伨銇椼仧',
+      callTimes: '閫氳┍鍥炴暟',
+      tokens: '銉堛兗銈兂',
+      buyQuota: '銈偐銉笺偪銈掕臣鍏�',
+      priorityUse: '鍎厛鍒╃敤',
+      removeKey: 'API銈兗銈掑墛闄�',
+      tip: '鏈夋枡銈偐銉笺偪銇劒鍏堛仐銇︿娇鐢ㄣ仌銈屻伨銇欍�傛湁鏂欍偗銈┿兗銈裤倰浣跨敤銇楃祩銇堛仧寰屻�併儓銉┿偆銈€儷銈偐銉笺偪銇屽埄鐢ㄣ仌銈屻伨銇欍��',
+    },
+    item: {
+      deleteDesc: '{{modelName}}銇偡銈广儐銉犮亴鎺ㄦ脯銇欍倠銉€儑銉仺銇椼仸鍒╃敤銇曘倢銇︺亜銇俱仚銆傚墛闄ゃ仚銈嬨仺銆佷竴閮ㄣ伄姗熻兘銇屼娇鐢ㄤ笉鍙兘銇仾銈嬪彲鑳芥�с亴銇傘倞銇俱仚銆傘仈纰鸿獚銇忋仩銇曘亜銆�',
+      freeQuota: '鐒℃枡銇偗銈┿兗銈�',
+    },
+    addApiKey: 'API銈兗銈掕拷鍔�',
+    invalidApiKey: '鐒″姽銇狝PI銈兗',
+    encrypted: {
+      front: 'API銈兗銇�',
+      back: ' 銇妧琛撱仹鏆楀彿鍖栥仌銈屻仸淇濆瓨銇曘倢銇俱仚銆�',
+    },
+    freeQuota: {
+      howToEarn: '鐛插緱鏂规硶',
+    },
+    addMoreModelProvider: '銉€儑銉儣銉儛銈ゃ儉銈掕拷鍔�',
+    addModel: '銉€儑銉倰杩藉姞',
+    modelsNum: '{{num}}銇儮銉囥儷',
+    showModels: '銉€儑銉伄琛ㄧず',
+    showModelsNum: '{{num}}銇儮銉囥儷銈掕〃绀�',
+    collapse: '鎶樸倞鐣炽伩',
+    config: '瑷畾',
+    modelAndParameters: '銉€儑銉仺銉戙儵銉°兗銈�',
+    model: '銉€儑銉�',
+    featureSupported: '{{feature}}銇蹇�',
+    callTimes: '鍛笺伋鍑恒仐鍥炴暟',
+    credits: '銈儸銈搞儍銉�',
+    buyQuota: '銈偐銉笺偪璩煎叆',
+    getFreeTokens: '鐒℃枡銉堛兗銈兂銈掔嵅寰�',
+    priorityUsing: '鍎厛鍒╃敤',
+    deprecated: '寤冩浜堝畾',
+    confirmDelete: '鍓婇櫎銈掔⒑瑾�',
+    quotaTip: '娈嬨倞銇劇鏂欍儓銉笺偗銉�',
+    loadPresets: '銉椼儶銈汇儍銉堛伄瑾伩杈笺伩',
+    parameters: '銉戙儵銉°兗銈�',
+    loadBalancing: '璨犺嵎鍒嗘暎',
+    loadBalancingDescription: '瑜囨暟銇獚瑷兼儏鍫便倰浣裤仯銇﹁矤鑽枫倰鍒嗘暎銇曘仜銇俱仚銆�',
+    loadBalancingHeadline: '璨犺嵎鍒嗘暎',
+    configLoadBalancing: '璨犺嵎鍒嗘暎銇ō瀹�',
+    modelHasBeenDeprecated: '銇撱伄銉€儑銉伅寤冩浜堝畾銇с仚',
+    providerManaged: '銉椼儹銉愩偆銉�绠$悊',
+    providerManagedDescription: '銉€儑銉儣銉儛銈ゃ儉銇倛銇c仸鎻愪緵銇曘倢銈嬭獚瑷兼儏鍫便倰浣跨敤銇椼伨銇欍��',
+    defaultConfig: '銉囥儠銈┿儷銉堛伄瑷畾',
+    apiKeyStatusNormal: 'API銈兗銇姸鎱嬨伅姝e父',
+    apiKeyRateLimit: '銉兗銉堝埗闄愩伀鍒伴仈銇椼伨銇椼仧銆倇{seconds}}绉掑緦銇啀搴﹀埄鐢ㄥ彲鑳姐仹銇�',
+    addConfig: '瑷畾銈掕拷鍔�',
+    editConfig: '瑷畾銈掔法闆�',
+    loadBalancingLeastKeyWarning: '璨犺嵎鍒嗘暎銈掑埄鐢ㄣ仚銈嬨伀銇�佹渶浣�2銇ゃ伄銈兗銈掓湁鍔瑰寲銇欍倠蹇呰銇屻亗銈娿伨銇欍��',
+    loadBalancingInfo: '銉囥儠銈┿儷銉堛仹銇�佽矤鑽峰垎鏁c伅銉┿偊銉炽儔銉儞銉虫柟寮忋倰鎺$敤銇椼仸銇勩伨銇欍�傘儸銉笺儓鍒堕檺銇岀櫤鐢熴仐銇熷牬鍚堛��1鍒嗛枔銇偗銉笺儷銉�銈︺兂鏈熼枔銇岄仼鐢ㄣ仌銈屻伨銇欍��',
+    upgradeForLoadBalancing: '璨犺嵎鍒嗘暎銈掑埄鐢ㄣ仚銈嬨伀銇�併儣銉┿兂銇偄銉冦儣銈般儸銉笺儔銇屽繀瑕併仹銇欍��',
+    emptyProviderTitle: '銉€儑銉儣銉儛銈ゃ儉銉笺亴瑷畾銇曘倢銇︺亜銇俱仜銈�',
+    discoverMore: '銈傘仯銇ㄧ櫤瑕嬨仚銈�',
+    installProvider: '銉€儑銉儣銉儛銈ゃ儉銉笺倰銈ゃ兂銈广儓銉笺儷銇欍倠',
+    configureTip: 'API銈兗銈掕ō瀹氥仚銈嬨亱銆佷娇鐢ㄣ仚銈嬨儮銉囥儷銈掕拷鍔犮仐銇︺亸銇犮仌銇�',
+    toBeConfigured: '瑷畾涓�',
+    emptyProviderTip: '鏈�鍒濄伀銉€儑銉儣銉儛銈ゃ儉銉笺倰銈ゃ兂銈广儓銉笺儷銇椼仸銇忋仩銇曘亜銆�',
+  },
+  dataSource: {
+    add: '銉囥兗銈裤偨銉笺偣銇拷鍔�',
+    connect: '鎺ョ稓',
+    configure: '瑷畾',
+    notion: {
+      title: '銉庛兗銈枫儳銉�',
+      description: '銉娿儸銉冦偢銉囥兗銈裤偨銉笺偣銇ㄣ仐銇︺儙銉笺偡銉с兂銈掍娇鐢ㄣ仐銇俱仚銆�',
+      connectedWorkspace: '鎺ョ稓娓堛伩銉兗銈偣銉氥兗銈�',
+      addWorkspace: '銉兗銈偣銉氥兗銈广伄杩藉姞',
+      connected: '鎺ョ稓娓堛伩',
+      disconnected: '鎺ョ稓瑙i櫎',
+      changeAuthorizedPages: '瑾嶈娓堛伩銉氥兗銈搞伄澶夋洿',
+      pagesAuthorized: '瑾嶈娓堛伩銉氥兗銈�',
+      sync: '鍚屾湡',
+      remove: '鍓婇櫎',
+      selector: {
+        pageSelected: '閬告姙娓堛伩銉氥兗銈�',
+        searchPages: '銉氥兗銈告绱�...',
+        noSearchResult: '妞滅储绲愭灉銇仐',
+        addPages: '銉氥兗銈搞伄杩藉姞',
+        preview: '銉椼儸銉撱儱銉�',
+      },
+    },
+    website: {
+      title: '銈︺偋銉栥偟銈ゃ儓',
+      description: '銈︺偋銉栥偗銉兗銉┿兗銈掍娇銇c仸銈︺偋銉栥偟銈ゃ儓銇嬨倝銈炽兂銉嗐兂銉勩倰鍙栥倞杈笺伩銇俱仚銆�',
+      with: '銇倛銈�',
+      configuredCrawlers: '瑷畾娓堛伩銈儹銉笺儵銉�',
+      active: '銈€偗銉嗐偅銉�',
+      inactive: '闈炪偄銈儐銈c儢',
+    },
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'API銈兗',
+      apiKeyPlaceholder: 'API銈兗銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+      keyFrom: 'SerpAPI銈€偒銈︺兂銉堛儦銉笺偢銇嬨倝SerpAPI銈兗銈掑彇寰椼仐銇︺亸銇犮仌銇�',
+    },
+  },
+  apiBasedExtension: {
+    title: 'API鎷″嫉姗熻兘銇�丏ify銇偄銉椼儶銈便兗銈枫儳銉冲叏浣撱仹銇啊鍗樸仾浣跨敤銇仧銈併伄瑷畾銈掔啊绱犲寲銇椼�侀泦涓殑銇狝PI绠$悊銈掓彁渚涖仐銇俱仚銆�',
+    link: '鐙嚜銇瓵PI鎷″嫉姗熻兘銈掗枊鐧恒仚銈嬫柟娉曘伀銇ゃ亜銇﹀銇躲��',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: 'API鎷″嫉姗熻兘銈掕拷鍔�',
+    selector: {
+      title: 'API鎷″嫉姗熻兘',
+      placeholder: 'API鎷″嫉姗熻兘銈掗伕鎶炪仐銇︺亸銇犮仌銇�',
+      manage: 'API鎷″嫉姗熻兘銈掔鐞�',
+    },
+    modal: {
+      title: 'API鎷″嫉姗熻兘銈掕拷鍔�',
+      editTitle: 'API鎷″嫉姗熻兘銈掔法闆�',
+      name: {
+        title: '鍚嶅墠',
+        placeholder: '鍚嶅墠銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+      },
+      apiEndpoint: {
+        title: 'API銈ㄣ兂銉夈儩銈ゃ兂銉�',
+        placeholder: 'API銈ㄣ兂銉夈儩銈ゃ兂銉堛倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+      },
+      apiKey: {
+        title: 'API銈兗',
+        placeholder: 'API銈兗銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+        lengthError: 'API銈兗銇暦銇曘伅5鏂囧瓧鏈簚銇仹銇嶃伨銇涖倱',
+      },
+    },
+    type: '銈裤偆銉�',
+  },
+  about: {
+    changeLog: '澶夋洿銉偘',
+    updateNow: '浠娿仚銇愭洿鏂�',
+    nowAvailable: 'Dify {{version}} 銇屽埄鐢ㄥ彲鑳姐仹銇欍��',
+    latestAvailable: 'Dify {{version}} 銇屾渶鏂般儛銉笺偢銉с兂銇с仚銆�',
+  },
+  appMenus: {
+    overview: '鐩h',
+    promptEng: '銈兗銈便偣銉堛儸銉笺儓',
+    apiAccess: 'API銈€偗銈汇偣',
+    logAndAnn: '銉偘锛嗐偄銉娿偊銉炽偣',
+    logs: '銉偘',
+  },
+  environment: {
+    testing: '銉嗐偣銉�',
+    development: '闁嬬櫤',
+  },
+  appModes: {
+    completionApp: '銉嗐偔銈广儓鐢熸垚',
+    chatApp: '銉併儯銉冦儓銈€儣銉�',
+  },
+  datasetMenus: {
+    documents: '銉夈偔銉ャ儭銉炽儓',
+    hitTesting: '妞滅储銉嗐偣銉�',
+    settings: '瑷畾',
+    emptyTip: '銇撱伄銉娿儸銉冦偢銇仼銇偄銉椼儶銈便兗銈枫儳銉炽伀銈傜当鍚堛仌銈屻仸銇勩伨銇涖倱銆傘儔銈儱銉°兂銉堛倰鍙傜収銇椼仸銈偆銉�銉炽偣銈掔⒑瑾嶃仐銇︺亸銇犮仌銇勩��',
+    viewDoc: '銉夈偔銉ャ儭銉炽儓銈掕〃绀�',
+    relatedApp: '闁㈤�c偄銉椼儶',
+    noRelatedApp: '闁㈤�d粯銇戙倝銈屻仧銈€儣銉伅銇傘倞銇俱仜銈�',
+  },
+  voiceInput: {
+    speaking: '浠婅┍銇椼仸銇勩伨銇�...',
+    converting: '銉嗐偔銈广儓銇鎻涗腑...',
+    notAllow: '銉炪偆銈亴瑷卞彲銇曘倢銇︺亜銇俱仜銈�',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: '浼氳┍鍚嶃倰澶夋洿',
+    conversationName: '浼氳┍鍚�',
+    conversationNamePlaceholder: '浼氳┍鍚嶃倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+    conversationNameCanNotEmpty: '浼氳┍鍚嶃伅蹇呴爤銇с仚',
+    citation: {
+      title: '寮曠敤',
+      linkToDataset: '銉娿儸銉冦偢銇搞伄銉兂銈�',
+      characters: '鏂囧瓧鏁�:',
+      hitCount: '妞滅储鍥炴暟:',
+      vectorHash: '銉欍偗銉堛儷銉忋儍銈枫儱:',
+      hitScore: '妞滅储銈广偝銈�:',
+    },
+    inputPlaceholder: '銉溿儍銉堛仺瑭便仚',
+    thought: '鎬濊��',
+    thinking: '鑰冦亪涓�...',
+    resend: '鍐嶉�佷俊銇椼仸銇忋仩銇曘亜',
+  },
+  promptEditor: {
+    placeholder: '銇撱亾銇儣銉兂銉椼儓銉兗銉夈倰鍏ュ姏銇椼仸銇忋仩銇曘亜銆傚鏁般倰鎸垮叆銇欍倠銇伅銆寋銆嶃倰銆併儣銉兂銉椼儓銈炽兂銉嗐兂銉勩儢銉儍銈倰鎸垮叆銇欍倠銇伅銆�/銆嶃倰鍏ュ姏銇椼伨銇欍��',
+    context: {
+      item: {
+        title: '銈炽兂銉嗐偔銈广儓',
+        desc: '銈炽兂銉嗐偔銈广儓銉嗐兂銉椼儸銉笺儓銈掓尶鍏�',
+      },
+      modal: {
+        title: '{{num}} 鐣洰銇偝銉炽儐銈偣銉�',
+        add: '銈炽兂銉嗐偔銈广儓銈掕拷鍔�',
+        footer: '浠ヤ笅銇偝銉炽儐銈偣銉堛偦銈偡銉с兂銇с偝銉炽儐銈偣銉堛倰绠$悊銇с亶銇俱仚銆�',
+      },
+    },
+    history: {
+      item: {
+        title: '浼氳┍灞ユ',
+        desc: '閬庡幓銇儭銉冦偦銉笺偢銉嗐兂銉椼儸銉笺儓銈掓尶鍏�',
+      },
+      modal: {
+        title: '渚�',
+        user: '銇撱倱銇仭銇�',
+        assistant: '銇撱倱銇仭銇紒 浠婃棩銇仼銇倛銇嗐伀銇婃墜浼濄亜銇с亶銇俱仚銇嬶紵',
+        edit: '浼氳┍銇焦鍓插悕銈掔法闆�',
+      },
+    },
+    variable: {
+      item: {
+        title: '澶夋暟锛嗗閮ㄣ儎銉笺儷',
+        desc: '澶夋暟锛嗗閮ㄣ儎銉笺儷銈掓尶鍏�',
+      },
+      outputToolDisabledItem: {
+        title: '澶夋暟',
+        desc: '澶夋暟銈掓尶鍏�',
+      },
+      modal: {
+        add: '鏂般仐銇勫鏁�',
+        addTool: '鏂般仐銇勩儎銉笺儷',
+      },
+    },
+    query: {
+      item: {
+        title: '銈偍銉�',
+        desc: '銉︺兗銈躲兗銈偍銉儐銉炽儣銉兗銉堛倰鎸垮叆',
+      },
+    },
+    existed: '銉椼儹銉炽儣銉堛伀銇欍仹銇瓨鍦ㄣ仐銇俱仚',
+  },
+  imageUploader: {
+    uploadFromComputer: '銈炽兂銉斻儱銉笺偪銉笺亱銈夈偄銉冦儣銉兗銉�',
+    uploadFromComputerReadError: '鐢诲儚銇銇胯炯銇裤伀澶辨晽銇椼伨銇椼仧銆傘倐銇嗕竴搴︺亰瑭︺仐銇忋仩銇曘亜銆�',
+    uploadFromComputerUploadError: '鐢诲儚銇偄銉冦儣銉兗銉夈伀澶辨晽銇椼伨銇椼仧銆傘倐銇嗕竴搴︺偄銉冦儣銉兗銉夈仐銇︺亸銇犮仌銇勩��',
+    uploadFromComputerLimit: '銈€儍銉椼儹銉笺儔鐢诲儚銇偟銈ゃ偤銇� {{size}} MB 銈掕秴銇堛倠銇撱仺銇仹銇嶃伨銇涖倱',
+    pasteImageLink: '鐢诲儚銉兂銈倰璨笺倞浠樸亼銈�',
+    pasteImageLinkInputPlaceholder: '銇撱亾銇敾鍍忋儶銉炽偗銈掕布銈婁粯銇戙仸銇忋仩銇曘亜',
+    pasteImageLinkInvalid: '鐒″姽銇敾鍍忋儶銉炽偗',
+    imageUpload: '鐢诲儚銈€儍銉椼儹銉笺儔',
+  },
+  tag: {
+    placeholder: '銇欍伖銇︺伄銈裤偘',
+    addNew: '鏂般仐銇勩偪銈般倰杩藉姞',
+    noTag: '銈裤偘銇仐',
+    noTagYet: '銇俱仩銈裤偘銇屻亗銈娿伨銇涖倱',
+    addTag: '銈裤偘銈掕拷鍔�',
+    editTag: '銈裤偘銈掔法闆�',
+    manageTags: '銈裤偘銇鐞�',
+    selectorPlaceholder: '妞滅储銇俱仧銇綔鎴愩仚銈嬫枃瀛椼倰鍏ュ姏',
+    create: '浣滄垚',
+    delete: '銈裤偘銈掑墛闄�',
+    deleteTip: '銈裤偘銇娇鐢ㄣ仌銈屻仸銇勩伨銇欍�佸墛闄ゃ仐銇俱仚銇�',
+    created: '銈裤偘銇甯搞伀浣滄垚銇曘倢銇俱仐銇�',
+    failed: '銈裤偘銇綔鎴愩伀澶辨晽銇椼伨銇椼仧',
+  },
+  fileUploader: {
+    uploadFromComputer: '銉兗銈儷銈€儍銉椼儹銉笺儔',
+    pasteFileLink: '銉曘偂銈ゃ儷銉兂銈伄璨笺倞浠樸亼',
+    pasteFileLinkInputPlaceholder: 'URL銈掑叆鍔�...',
+    uploadFromComputerLimit: '銈€儍銉椼儹銉笺儔銉曘偂銈ゃ儷銇瘂{size}}銈掕秴銇堛仸銇仾銈娿伨銇涖倱',
+    uploadFromComputerUploadError: '銉曘偂銈ゃ儷銇偄銉冦儣銉兗銉夈伀澶辨晽銇椼伨銇椼仧銆傚啀搴︺偄銉冦儣銉兗銉夈仐銇︺亸銇犮仌銇勩��',
+    uploadFromComputerReadError: '銉曘偂銈ゃ儷銇銇垮彇銈娿伀澶辨晽銇椼伨銇椼仧銆傘倐銇嗕竴搴︺倓銈婄洿銇椼仸銇忋仩銇曘亜銆�',
+    fileExtensionNotSupport: '銉曘偂銈ゃ儷鎷″嫉瀛愩伅銈点儩銉笺儓銇曘倢銇︺亜銇俱仜銈�',
+    pasteFileLinkInvalid: '鐒″姽銇儠銈°偆銉儶銉炽偗',
+  },
+  license: {
+    expiring_plural: '鏈夊姽鏈熼檺 {{count}} 鏃�',
+    expiring: '1鏃ャ仹鏈夊姽鏈熼檺銇屽垏銈屻伨銇�',
+  },
+  pagination: {
+    perPage: '銉氥兗銈搞亗銇熴倞銇偄銈ゃ儐銉犳暟',
+  },
+  imageInput: {
+    browse: '銉栥儵銈︺偤銇欍倠',
+    supportedFormats: 'PNG銆丣PG銆丣PEG銆乄EBP銆併亰銈堛伋GIF銈掋偟銉濄兗銉堛仐銇︺亜銇俱仚銆�',
+    dropImageHere: '銇撱亾銇敾鍍忋倰銉夈儹銉冦儣銇欍倠銇嬨��',
+  },
+}
+
+export default translation
diff --git a/i18n/ja-JP/custom.ts b/i18n/ja-JP/custom.ts
new file mode 100644
index 0000000..d975071
--- /dev/null
+++ b/i18n/ja-JP/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: '銈偣銈裤優銈ゃ偤',
+  upgradeTip: {
+    title: '銉椼儵銉炽倰銈€儍銉椼偘銉兗銉�',
+    des: '銉栥儵銉炽儔銈掋偒銈广偪銉炪偆銈恒仚銈嬨仧銈併伀銇儣銉┿兂銈掋偄銉冦儣銈般儸銉笺儔銇椼仸銇忋仩銇曘亜銆�',
+    prefix: '銉椼儵銉炽倰銈€儍銉椼偘銉兗銉夈仐銇�',
+    suffix: '銉栥儵銉炽儔銈掋偒銈广偪銉炪偆銈恒仐銇俱仐銈囥亞銆�',
+  },
+  webapp: {
+    title: 'WebApp銉栥儵銉炽儔銇偒銈广偪銉炪偆銈�',
+    removeBrand: 'Powered by Dify銈掑墛闄�',
+    changeLogo: 'Powered by銉栥儵銉炽儔鐢诲儚銈掑鏇�',
+    changeLogoTip: '鏈�灏忋偟銈ゃ偤40x40px銇甋VG銇俱仧銇疨NG褰㈠紡',
+  },
+  app: {
+    title: '銈€儣銉儤銉冦儉銉笺儢銉┿兂銉夈伄銈偣銈裤優銈ゃ偤',
+    changeLogoTip: '鏈�灏忋偟銈ゃ偤80x80px銇甋VG銇俱仧銇疨NG褰㈠紡',
+  },
+  upload: '銈€儍銉椼儹銉笺儔',
+  uploading: '銈€儍銉椼儹銉笺儔涓�',
+  uploadedFail: '鐢诲儚銇偄銉冦儣銉兗銉夈伀澶辨晽銇椼伨銇椼仧銆傚啀搴︺偄銉冦儣銉兗銉夈仐銇︺亸銇犮仌銇勩��',
+  change: '澶夋洿',
+  apply: '閬╃敤',
+  restore: '銉囥儠銈┿儷銉堛伀鎴汇仚',
+  customize: {
+    contactUs: '銇婂晱銇勫悎銈忋仜',
+    prefix: '銈€儣銉唴銇儢銉┿兂銉夈儹銈淬倰銈偣銈裤優銈ゃ偤銇欍倠銇伅銆�',
+    suffix: '銈ㄣ兂銈裤兗銉椼儵銈ゃ偤鐗堛伀銈€儍銉椼偘銉兗銉夈仐銇︺亸銇犮仌銇勩��',
+  },
+}
+
+export default translation
diff --git a/i18n/ja-JP/dataset-creation.ts b/i18n/ja-JP/dataset-creation.ts
new file mode 100644
index 0000000..a3f573c
--- /dev/null
+++ b/i18n/ja-JP/dataset-creation.ts
@@ -0,0 +1,216 @@
+const translation = {
+  steps: {
+    header: {
+      fallbackRoute: '銉娿儸銉冦偢銉欍兗銈�',
+    },
+    one: '銉囥兗銈裤偨銉笺偣',
+    two: '銉嗐偔銈广儓閫茶涓�',
+    three: '瀹熻銇ㄥ畬鎴�',
+  },
+  error: {
+    unavailable: '銇撱伄銉娿儸銉冦偢銉欍兗銈广伅鍒╃敤銇с亶銇俱仜銈�',
+  },
+  firecrawl: {
+    configFirecrawl: '馃敟Firecrawl銇ō瀹�',
+    apiKeyPlaceholder: 'firecrawl.dev銇嬨倝銇瓵PI銈兗',
+    getApiKeyLinkText: 'firecrawl.dev銇嬨倝API銈兗銈掑彇寰椼仚銈�',
+  },
+  jinaReader: {
+    getApiKeyLinkText: '鐒℃枡銇瓵PI銈兗銈� jina.ai 銇у彇寰�',
+    apiKeyPlaceholder: 'jina.ai 銇嬨倝銇� API 銈兗',
+    configJinaReader: 'Jina Reader銇ō瀹�',
+  },
+  stepOne: {
+    filePreview: '銉曘偂銈ゃ儷銉椼儸銉撱儱銉�',
+    pagePreview: '銉氥兗銈搞儣銉儞銉ャ兗',
+    dataSourceType: {
+      file: '銉嗐偔銈广儓銉曘偂銈ゃ儷銇嬨倝銈ゃ兂銉濄兗銉�',
+      notion: 'Notion銇嬨倝鍚屾湡',
+      web: '銈︺偋銉栥偟銈ゃ儓銇嬨倝鍚屾湡',
+    },
+    uploader: {
+      title: '銉嗐偔銈广儓銉曘偂銈ゃ儷銈掋偄銉冦儣銉兗銉�',
+      button: '銉曘偂銈ゃ儷銇俱仧銇儠銈┿儷銉�銈掋儔銉┿儍銈般偄銉炽儔銉夈儹銉冦儣銇欍倠',
+      browse: '鍙傜収',
+      tip: '{{supportTypes}}銈掋偟銉濄兗銉堛仐銇︺亜銇俱仚銆�1銇ゃ亗銇熴倞銇渶澶с偟銈ゃ偤銇瘂{size}}MB銇с仚銆�',
+      validation: {
+        typeError: '銈点儩銉笺儓銇曘倢銇︺亜銇亜銉曘偂銈ゃ儷銈裤偆銉椼仹銇�',
+        size: '銉曘偂銈ゃ儷銈点偆銈恒亴澶с亶銇欍亷銇俱仚銆傛渶澶с偟銈ゃ偤銇瘂{size}}MB銇с仚',
+        count: '瑜囨暟銇儠銈°偆銉伅銈点儩銉笺儓銇曘倢銇︺亜銇俱仜銈�',
+        filesNumber: '銉愩儍銉併偄銉冦儣銉兗銉夈伄鍒堕檺锛坽{filesNumber}}鍊嬶級銇仈銇椼伨銇椼仧銆�',
+      },
+      cancel: '銈儯銉炽偦銉�',
+      change: '澶夋洿',
+      failed: '銈€儍銉椼儹銉笺儔銇け鏁椼仐銇俱仐銇�',
+    },
+    notionSyncTitle: 'Notion銇屾帴缍氥仌銈屻仸銇勩伨銇涖倱',
+    notionSyncTip: 'Notion銇ㄥ悓鏈熴仚銈嬨伀銇�併伨銇歂otion銇搞伄鎺ョ稓銇屽繀瑕併仹銇欍��',
+    connect: '鎺ョ稓銇欍倠',
+    cancel: '銈儯銉炽偦銉�',
+    button: '娆°伕',
+    emptyDatasetCreation: '绌恒伄銉娿儸銉冦偢銉欍兗銈广倰浣滄垚銇椼伨銇�',
+    modal: {
+      title: '绌恒伄銉娿儸銉冦偢銉欍兗銈广倰浣滄垚',
+      tip: '绌恒伄銉娿儸銉冦偢銉欍兗銈广伀銇儔銈儱銉°兂銉堛亴鍚伨銈屻仛銆併亜銇ゃ仹銈傘儔銈儱銉°兂銉堛倰銈€儍銉椼儹銉笺儔銇с亶銇俱仚銆�',
+      input: '銉娿儸銉冦偢銉欍兗銈广伄鍚嶇О',
+      placeholder: '鍏ュ姏銇椼仸銇忋仩銇曘亜',
+      nameNotEmpty: '鍚嶅墠銇┖銇仹銇嶃伨銇涖倱',
+      nameLengthInvalid: '鍚嶅墠銇�1銆�40鏂囧瓧銇с亗銈嬪繀瑕併亴銇傘倞銇俱仚',
+      cancelButton: '銈儯銉炽偦銉�',
+      confirmButton: '浣滄垚',
+      failed: '浣滄垚銇け鏁椼仐銇俱仐銇�',
+    },
+    website: {
+      chooseProvider: '銉椼儹銉愩偆銉�銉笺倰閬告姙銇欍倠',
+      fireCrawlNotConfigured: 'Firecrawl銇岃ō瀹氥仌銈屻仸銇勩伨銇涖倱',
+      fireCrawlNotConfiguredDescription: 'Firecrawl 銈掍娇鐢ㄣ仚銈嬨伀銇�丗irecrawl 銇� API 銈兗銈掕ō瀹氥仐銇︺亸銇犮仌銇勩��',
+      jinaReaderNotConfigured: 'Jina Reader 銇岃ō瀹氥仌銈屻仸銇勩伨銇涖倱',
+      jinaReaderNotConfiguredDescription: '鐒℃枡銇瓵PI銈兗銈掑叆鍔涖仐銇︺�丣ina Reader銈掕ō瀹氥仐銇俱仚銆�',
+      configure: '瑷畾',
+      configureFirecrawl: '閰嶇疆 Firecrawl',
+      configureJinaReader: '閰嶇疆 Jina Reader',
+      run: '瀹熻',
+      firecrawlTitle: '馃敟Firecrawl銈掍娇銇c仹銈︺偍銉栥偝銉炽儐銉炽儎銈掓娊鍑�',
+      firecrawlDoc: 'Firecrawl銉夈偔銉ャ儭銉炽儓',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      jinaReaderTitle: '銈点偆銉堝叏浣撱倰Markdown銇鎻涖仚銈�',
+      jinaReaderDoc: 'Jina Reader銇┏绱�',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      useSitemap: 'sitemap(銈点偆銉堛優銉冦儣)銈掍娇鐢ㄣ仚銈�',
+      useSitemapTooltip: '銈点偆銉堛優銉冦儣銇部銇c仸銈点偆銉堛倰銈儹銉笺儷銇椼伨銇欍�傘仢銇嗐仹銇亜鍫村悎銆丣ina Reader銇儦銉笺偢銇枹閫f�с伀鍩恒仴銇勩仸绻般倞杩斻仐銈儹銉笺儷銇椼�併儦銉笺偢鏁般伅灏戙仾銇忋仾銈娿伨銇欍亴銆侀珮鍝佽唱銇儦銉笺偢銇屽緱銈夈倢銇俱仚銆�',
+      options: '銈儣銈枫儳銉�',
+      crawlSubPage: '銈点儢銉氥兗銈搞倰銈儹銉笺儷銇欍倠',
+      limit: '鍒堕檺',
+      maxDepth: '鏈�澶ф繁搴�',
+      excludePaths: '銉戙偣銈掗櫎澶栥仚銈�',
+      includeOnlyPaths: '銉戙偣銇伩銈掑惈銈併倠',
+      extractOnlyMainContent: '銉°偆銉炽偝銉炽儐銉炽儎銇伩銈掓娊鍑恒仚銈�(銉樸儍銉�銉笺�併儕銉撱�併儠銉冦偪銉笺仾銇┿伅鎶藉嚭銇椼仾銇�)',
+      exceptionErrorTitle: 'Firecrawl 銈搞儳銉栥伄瀹熻涓伀渚嬪銇岀櫤鐢熴仐銇俱仐銇�:',
+      unknownError: '涓嶆槑銇偍銉┿兗',
+      totalPageScraped: '銈广偗銉偆銉斻兂銈般仌銈屻仧绶忋儦銉笺偢鏁�:',
+      selectAll: '銇欍伖銇﹂伕鎶�',
+      resetAll: '銇欍伖銇︺儶銈汇儍銉�',
+      scrapTimeInfo: '{{time}} 绉掍互鍐呫伀鍚堣▓ {{total}} 銉氥兗銈搞倰銈广偗銉偆銉斻兂銈般仐銇俱仐銇�',
+      preview: '銉椼儸銉撱儱銉�',
+      maxDepthTooltip: '鍏ュ姏銇曘倢銇烾RL銈掑熀銇仐銇熴偗銉兗銉兂銈颁綔妤仹銇ō瀹氬彲鑳姐仾鏈�澶ф繁搴︺伀銇ゃ亜銇﹁鏄庛仐銇俱仚銆傛繁搴�0銇叆鍔涖仌銈屻仧URL鑷綋銇儦銉笺偢銈掑璞°仺銇椼仧銈广偗銉偆銉斻兂銈般倰鎰忓懗銇椼伨銇欍�傛繁搴�1銇с伅銆佸厓銇甎RL銇洿涓嬨伀銇傘倠銉氥兗銈革紙URL銇稓銇忔渶鍒濄伄"/"浠ラ檷銇唴瀹癸級銈傘偣銈儸銈ゃ償銉炽偘銇璞°伀銇倞銇俱仚銆傘亾銇繁搴︺伅鎸囧畾銇椼仧鏁板�ゃ伨銇у鍔犮仌銇涖倠銇撱仺銇屻仹銇嶃�併仢銈屻伀蹇溿仒銇︺偣銈儸銈ゃ償銉炽偘銇瘎鍥层倐搴冦亴銇c仸銇勩亶銇俱仚銆�',
+      waterCrawlNotConfiguredDescription: 'API銈兗銈掍娇銇c仸Watercrawl銈掕ō瀹氥仐銇俱仚銆�',
+      configureWatercrawl: '銈︺偐銉笺偪銉笺偗銉兗銉┿兗銈掕ō瀹氥仚銈�',
+      watercrawlDoc: '銈︺偐銉笺偪銉笺偗銉兗銉兂銈般伄鏂囨浉',
+      watercrawlTitle: 'Watercrawl銈掍娇鐢ㄣ仐銇︺偊銈с儢銈炽兂銉嗐兂銉勩倰鎶藉嚭銇欍倠',
+      waterCrawlNotConfigured: 'Watercrawl銇ō瀹氥仌銈屻仸銇勩伨銇涖倱',
+      watercrawlDocLink: 'https://docs.dify.ai/ja/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+    },
+  },
+  stepTwo: {
+    segmentation: '銉併儯銉炽偗瑷畾',
+    auto: '鑷嫊',
+    autoDescription: '銉併儯銉炽偗銇ㄥ墠鍑︾悊銉兗銉倰鑷嫊鐨勩伀瑷畾銇椼伨銇欍�傚垵銈併仸銇儲銉笺偠銉笺伅銇撱倢銈掗伕鎶炪仚銈嬨亾銇ㄣ倰銇娿仚銇欍倎銇椼伨銇欍��',
+    custom: '銈偣銈裤儬',
+    customDescription: '銉併儯銉炽偗銇儷銉笺儷銆併儊銉c兂銈伄闀枫仌銆佸墠鍑︾悊銉兗銉仾銇┿倰銈偣銈裤優銈ゃ偤銇椼伨銇欍��',
+    general: '姹庣敤',
+    generalTip: '姹庣敤銉嗐偔銈广儓鍒嗗壊銉€兗銉夈仹銇欍�傛绱€仺銈炽兂銉嗐偔銈广儓鎶藉嚭銇悓銇樸儊銉c兂銈倰浣跨敤銇椼伨銇欍��',
+    parentChild: '瑕瓙',
+    parentChildTip: '瑕瓙鍒嗗壊銉€兗銉�(闅庡堡鍒嗗壊銉€兗銉�)銇с伅銆佸瓙銉併儯銉炽偗銈掓绱€伀銆佽Κ銉併儯銉炽偗銈掋偝銉炽儐銈偣銉堟娊鍑恒伀浣跨敤銇椼伨銇欍��',
+    parentChunkForContext: '銈炽兂銉嗐偔銈广儓鐢ㄨΚ銉併儯銉炽偗',
+    childChunkForRetrieval: '妞滅储鐢ㄥ瓙銉併儯銉炽偗',
+    paragraph: '娈佃惤',
+    paragraphTip: '鍖哄垏銈婃枃瀛椼仺鏈�澶с儊銉c兂銈暦銇熀銇ャ亜銇︺儐銈偣銉堛倰娈佃惤銇垎鍓层仐銆佸垎鍓层仌銈屻仧銉嗐偔銈广儓銈掓绱㈢敤銇Κ銉併儯銉炽偗銇ㄣ仐銇︿娇鐢ㄣ仐銇俱仚銆�',
+    fullDoc: '鍏ㄦ枃',
+    fullDocTip: '銉夈偔銉ャ儭銉炽儓鍏ㄤ綋銈掕Κ銉併儯銉炽偗銇ㄣ仐銇︿娇鐢ㄣ仐銆佺洿鎺ユ绱€仐銇俱仚銆傘儜銉曘偐銉笺優銉炽偣涓娿伄鐞嗙敱銇嬨倝銆�10000銉堛兗銈兂銈掕秴銇堛倠銉嗐偔銈广儓銇嚜鍕曠殑銇垏銈婃崹銇︺倝銈屻伨銇欍��',
+    separator: '銉併儯銉炽偗璀樺垾瀛�',
+    separatorPlaceholder: '渚嬨亪銇版敼琛岋紙\\\\n锛夈倓鐗规畩銇偦銉戙儸銉笺偪锛堜緥锛氥��***銆嶏級',
+    maxLength: '鏈�澶с儊銉c兂銈暦',
+    overlap: '銉併儯銉炽偗銇偑銉笺儛銉笺儵銉冦儣',
+    overlapTip: '銉併儯銉炽偗銇偑銉笺儛銉笺儵銉冦儣銈掕ō瀹氥仚銈嬨亾銇ㄣ仹銆併仢銈屻倝銇枔銇剰鍛崇殑銇枹閫f�с倰缍寔銇椼�佹绱㈠姽鏋溿倰鍚戜笂銇曘仜銈嬨亾銇ㄣ亴銇с亶銇俱仚銆傛渶澶с儊銉c兂銈偟銈ゃ偤銇�10%銆�25%銈掕ō瀹氥仚銈嬨亾銇ㄣ倰銇娿仚銇欍倎銇椼伨銇欍��',
+    overlapCheck: '銉併儯銉炽偗銇偑銉笺儛銉笺儵銉冦儣銇渶澶с儊銉c兂銈暦銈掕秴銇堛仸銇亜銇戙伨銇涖倱',
+    rules: '銉嗐偔銈广儓銇墠鍑︾悊銉兗銉�',
+    removeExtraSpaces: '閫g稓銇欍倠銈广儦銉笺偣銆佹敼琛屻�併偪銉栥倰缃彌銇欍倠',
+    removeUrlEmails: '銇欍伖銇︺伄URL銇ㄣ儭銉笺儷銈€儔銉偣銈掑墛闄ゃ仚銈�',
+    removeStopwords: '銆宎銆嶃�宎n銆嶃�宼he銆嶃仾銇┿伄銈广儓銉冦儣銉兗銉夈倰鍓婇櫎銇欍倠',
+    preview: '銉椼儸銉撱儱銉�',
+    previewChunk: '銉併儯銉炽偗銈掋儣銉儞銉ャ兗',
+    reset: '銉偦銉冦儓',
+    indexMode: '銈ゃ兂銉囥儍銈偣鏂规硶',
+    qualified: '楂樺搧璩�',
+    highQualityTip: '楂樺搧璩儮銉笺儔銇у煁銈佽炯銇裤倰绲備簡銇椼仧銈夈�佺祵娓堢殑銉€兗銉夈伀鎴汇仚銇撱仺銇仹銇嶃伨銇涖倱銆�',
+    recommend: '鎺ㄥエ',
+    qualifiedTip: '鍩嬨倎杈笺伩銉€儑銉倰鍛笺伋鍑恒仐銇︺儔銈儱銉°兂銉堛倰鍑︾悊銇椼�併倛銈婃纰恒仾妞滅储銈掕銇嗐仺銆丩LM銇岄珮鍝佽唱銇洖绛斻倰鐢熸垚銇欍倠銇伀褰圭珛銇°伨銇欍��',
+    warning: '銉€儑銉儣銉儛銈ゃ儉銇瓵PI銈兗銈掕ō瀹氥仐銇︺亸銇犮仌銇勩��',
+    click: '瑷畾銇Щ鍕�',
+    economical: '绲屾笀鐨�',
+    economicalTip: '妞滅储鏅傘伀銉併儯銉炽偗銇傘仧銈�10鍊嬨伄銈兗銉兗銉夈倰浣跨敤銇欍倠銇撱仺銇с�佺簿搴︺伅浣庝笅銇椼伨銇欍亴銆併儓銉笺偗銉虫秷璨汇倰鎶戙亪銈夈倢銇俱仚銆�',
+    QATitle: '璩晱銇ㄥ洖绛斿舰寮忋仹銈汇偘銉°兂銉堝寲',
+    QATip: '銇撱伄銈儣銈枫儳銉炽倰鏈夊姽銇仚銈嬨仺銆佽拷鍔犮伄銉堛兗銈兂銇屾秷璨汇仌銈屻伨銇�',
+    QALanguage: '浣跨敤瑷�瑾�',
+    useQALanguage: 'Q&A褰㈠紡銇у垎鍓�',
+    estimateCost: '瑕嬬銈傘倞',
+    estimateSegment: '鎺ㄥ畾銉併儯銉炽偗鏁�',
+    segmentCount: '銉併儯銉炽偗',
+    calculating: '瑷堢畻涓�...',
+    fileSource: '銉夈偔銉ャ儭銉炽儓銇墠鍑︾悊',
+    notionSource: '銉氥兗銈搞伄鍓嶅嚘鐞�',
+    websiteSource: '銈︺偍銉栥偟銈ゃ儔銇墠鍑︾悊',
+    other: '銇濄伄浠�',
+    fileUnit: '銉曘偂銈ゃ儷',
+    notionUnit: '銉氥兗銈�',
+    webpageUnit: ' 銉氥兗銈�',
+    previousStep: '鍓嶃伄銈广儐銉冦儣',
+    nextStep: '淇濆瓨銇椼仸鍑︾悊',
+    save: '淇濆瓨銇椼仸鍑︾悊',
+    cancel: '銈儯銉炽偦銉�',
+    sideTipTitle: '銇仠銉併儯銉炽偗銇ㄥ墠鍑︾悊銇屽繀瑕併仾銇亱',
+    sideTipP1: '銉嗐偔銈广儓銉囥兗銈裤倰鍑︾悊銇欍倠闅涖�併儊銉c兂銈仺銈儶銉笺儖銉炽偘銇�2銇ゃ伄閲嶈銇墠鍑︾悊銈广儐銉冦儣銇с仚銆�',
+    sideTipP2: '銈汇偘銉°兂銉嗐兗銈枫儳銉炽伅闀枫亜銉嗐偔銈广儓銈掓钀姐伀鍒嗗壊銇椼�併儮銉囥儷銇屻倛銈婄悊瑙c仐銈勩仚銇忋仐銇俱仚銆傘亾銈屻伀銈堛倞銆併儮銉囥儷銇祼鏋溿伄鍝佽唱銇ㄩ枹閫f�с亴鍚戜笂銇椼伨銇欍��',
+    sideTipP3: '銈儶銉笺儖銉炽偘銇笉瑕併仾鏂囧瓧銈勬浉寮忋倰鍓婇櫎銇椼�併儕銉儍銈搞儥銉笺偣銈掋倛銈娿偗銉兗銉炽仹瑙f瀽銇椼倓銇欍亜銈傘伄銇仐銇俱仚銆�',
+    sideTipP4: '閬╁垏銇儊銉c兂銈仺銈儶銉笺儖銉炽偘銇儮銉囥儷銇儜銉曘偐銉笺優銉炽偣銈掑悜涓娿仌銇涖�併倛銈婃纰恒仹渚″�ゃ伄銇傘倠绲愭灉銈掓彁渚涖仐銇俱仚銆�',
+    previewTitle: '銉椼儸銉撱儱銉�',
+    previewTitleButton: '銉椼儸銉撱儱銉�',
+    previewButton: 'Q&A褰㈠紡銇垏銈婃浛銇堛倠',
+    previewSwitchTipStart: '鐝惧湪銇儊銉c兂銈儣銉儞銉ャ兗銇儐銈偣銉堝舰寮忋仹銇欍�傝唱鍟忋仺鍥炵瓟褰㈠紡銇儣銉儞銉ャ兗銇垏銈婃浛銇堛倠銇ㄣ��',
+    previewSwitchTipEnd: ' 杩藉姞銇儓銉笺偗銉炽亴娑堣不銇曘倢銇俱仚',
+    characters: '鏂囧瓧',
+    indexSettingTip: '銈ゃ兂銉囥儍銈偣鏂规硶銈掑鏇淬仚銈嬨伀銇��',
+    retrievalSettingTip: '妞滅储鏂规硶銈掑鏇淬仚銈嬨伀銇��',
+    datasetSettingLink: '銉娿儸銉冦偢銉欍兗銈硅ō瀹�',
+    separatorTip: '鍖哄垏銈婃枃瀛椼伅銆併儐銈偣銉堛倰鍖哄垏銈嬨仧銈併伀浣跨敤銇曘倢銈嬫枃瀛椼仹銇欍�俓\n\\n 銇� \\n 銇�佹钀姐仺琛屻倰鍖哄垏銈嬨仧銈併伀涓�鑸殑銇娇鐢ㄣ仌銈屻倠鍖哄垏銈婅鍙枫仹銇欍�傘偒銉炽優 (\\n\\n,\\n) 銇ㄧ祫銇垮悎銈忋仜銈嬨仺銆佹渶澶с儊銉c兂銈暦銈掕秴銇堛倠銇ㄣ�佹钀姐伅琛屻仹鍖哄垏銈夈倢銇俱仚銆傝嚜鍒嗐仹瀹氱京銇椼仧鐗瑰垾銇尯鍒囥倞鏂囧瓧銈掍娇鐢ㄣ仚銈嬨亾銇ㄣ倐銇с亶銇俱仚(渚�:***)銆�',
+    maxLengthCheck: '銉併儯銉炽偗銇渶澶ч暦銇� {{limit}} 鏈簚銇仚銈嬪繀瑕併亴銇傘倞銇俱仚',
+    previewChunkTip: '銉椼儸銉撱儱銉笺倰瑾伩杈笺個銇伅銆佸乏鍋淬伄 \'銉併儯銉炽偗銈掋儣銉儞銉ャ兗\' 銉溿偪銉炽倰銈儶銉冦偗銇椼仸銇忋仩銇曘亜',
+    previewChunkCount: '鎺ㄥ畾銉併儯銉炽偗鏁�: {{count}}',
+    switch: '鍒囥倞鏇裤亪',
+    qaSwitchHighQualityTipTitle: 'Q&A褰㈠紡銇伅楂樺搧璩仾銈ゃ兂銉囥儍銈偣銇屽繀瑕併仹銇�',
+    qaSwitchHighQualityTipContent: '鐝惧湪銆侀珮鍝佽唱銇偆銉炽儑銉冦偗銈逛綔鎴愩伄銇裤亴Q&A褰㈠紡銇垎鍓层倰銈点儩銉笺儓銇椼仸銇勩伨銇欍�傞珮鍝佽唱銉€兗銉夈伀鍒囥倞鏇裤亪銇俱仚銇嬶紵',
+    notAvailableForParentChild: '瑕瓙銈ゃ兂銉囥儍銈偣銇с伅鍒╃敤銇с亶銇俱仜銈�',
+    notAvailableForQA: 'Q&A銈ゃ兂銉囥儍銈偣銇с伅鍒╃敤銇с亶銇俱仜銈�',
+    parentChildDelimiterTip: '鍖哄垏銈婃枃瀛椼仺銇�併儐銈偣銉堛倰鍒嗗壊銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻倠鏂囧瓧銇с仚銆俓\n\\n 銇�佸厓銇儔銈儱銉°兂銉堛倰澶с亶銇Κ銉併儯銉炽偗銇垎鍓层仚銈嬮殯銇亰銇欍仚銈併仹銇欍�傜嫭鑷伄鍖哄垏銈婃枃瀛椼倐浣跨敤銇с亶銇俱仚銆�',
+    parentChildChunkDelimiterTip: '鍖哄垏銈婃枃瀛椼仺銇�併儐銈偣銉堛倰鍒嗗壊銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻倠鏂囧瓧銇с仚銆俓\n 銇�佽Κ銉併儯銉炽偗銈掑皬銇曘仾瀛愩儊銉c兂銈伀鍒嗗壊銇欍倠闅涖伀銇娿仚銇欍倎銇с仚銆傜嫭鑷伄鍖哄垏銈婃枃瀛椼倐浣跨敤銇с亶銇俱仚銆�',
+  },
+  stepThree: {
+    creationTitle: '馃帀 銉娿儸銉冦偢銉欍兗銈广亴浣滄垚銇曘倢銇俱仐銇�',
+    creationContent: '銉娿儸銉冦偢銉欍兗銈广伄鍚嶅墠銇嚜鍕曠殑銇ō瀹氥仌銈屻伨銇椼仧銇屻�佽嚜鐢便伀澶夋洿銇с亶銇俱仚銆�',
+    label: '銉娿儸銉冦偢銉欍兗銈瑰悕',
+    additionTitle: '馃帀 銉夈偔銉ャ儭銉炽儓銇屻偄銉冦儣銉兗銉夈仌銈屻伨銇椼仧',
+    additionP1: '銉夈偔銉ャ儭銉炽儓銇儕銉儍銈搞儥銉笺偣銇偄銉冦儣銉兗銉夈仌銈屻伨銇椼仧',
+    additionP2: '銆併儕銉儍銈搞儥銉笺偣銇儔銈儱銉°兂銉堛儶銈广儓銇ц銇ゃ亼銈嬨亾銇ㄣ亴銇с亶銇俱仚銆�',
+    stop: '鍑︾悊銈掑仠姝�',
+    resume: '鍑︾悊銈掑啀闁�',
+    navTo: '銉夈偔銉ャ儭銉炽儓銇Щ鍕�',
+    sideTipTitle: '娆°伅浣曘仹銇欍亱',
+    sideTipContent: '銉夈偔銉ャ儭銉炽儓銇偆銉炽儑銉冦偗銈广亴瀹屼簡銇椼仧銈夈�併儕銉儍銈搞儥銉笺偣銈掋偄銉椼儶銈便兗銈枫儳銉炽伄銈炽兂銉嗐偔銈广儓銇ㄣ仐銇︾当鍚堛仚銈嬨亾銇ㄣ亴銇с亶銇俱仚銆傘儣銉兂銉椼儓銈兗銈便偣銉堛儸銉笺偡銉с兂銉氥兗銈搞仹銈炽兂銉嗐偔銈广儓瑷畾銈掕銇ゃ亼銈嬨亾銇ㄣ亴銇с亶銇俱仚銆傘伨銇熴�佺嫭绔嬨仐銇烠hatGPT銈ゃ兂銉囥儍銈偣銉椼儵銈般偆銉炽仺銇椼仸銉儶銉笺偣銇欍倠銇撱仺銈傘仹銇嶃伨銇欍��',
+    modelTitle: '鍩嬨倎杈笺伩銈掑仠姝€仐銇︺倐銈堛倣銇椼亜銇с仚銇嬶紵',
+    modelContent: '寰屻仹鍑︾悊銈掑啀闁嬨仚銈嬪繀瑕併亴銇傘倠鍫村悎銇�佷腑鏂仐銇熷牬鎵�銇嬨倝缍氳銇椼伨銇欍��',
+    modelButtonConfirm: '纰鸿獚',
+    modelButtonCancel: '銈儯銉炽偦銉�',
+  },
+  otherDataSource: {
+    title: '浠栥伄銉囥兗銈裤偨銉笺偣銇ㄦ帴缍氥仐銇俱仚銇嬶紵',
+    description: '鐝惧湪銆丏ify銇儕銉儍銈搞儥銉笺偣銇伅鍒╃敤銇с亶銈嬨儑銉笺偪銈姐兗銈广亴闄愩倝銈屻仸銇勩伨銇欍�侱ify銇儕銉儍銈搞儥銉笺偣銇儑銉笺偪銈姐兗銈广倰鎻愪緵銇勩仧銇犮亸銇撱仺銇�併儣銉┿儍銉堛儠銈┿兗銉犮伄鏌旇粺鎬с仺鑳藉姏銈掑悜涓娿仌銇涖倠涓娿仹闈炲父銇湁鐩娿仹銇欍�傝并鐚偓銈ゃ儔銈掋仈鐢ㄦ剰銇椼仸銇勩伨銇欍伄銇с�併仠銇层仈鍗斿姏銇忋仩銇曘亜銆傝┏绱般伀銇ゃ亜銇︺伅銆佷互涓嬨伄銉兂銈倰銈儶銉冦偗銇椼仸銇忋仩銇曘亜銆�',
+    learnMore: '瑭崇窗銇亾銇°倝',
+  },
+  watercrawl: {
+    getApiKeyLinkText: 'watercrawl.dev銇嬨倝API銈兗銈掑彇寰椼仐銇︺亸銇犮仌銇勩��',
+    configWatercrawl: '銈︺偐銉笺偪銉笺偗銉兗銉┿兗銈掕ō瀹氥仚銈�',
+    apiKeyPlaceholder: 'watercrawl.dev銇嬨倝銇瓵PI銈兗',
+  },
+}
+
+export default translation
diff --git a/i18n/ja-JP/dataset-documents.ts b/i18n/ja-JP/dataset-documents.ts
new file mode 100644
index 0000000..3943146
--- /dev/null
+++ b/i18n/ja-JP/dataset-documents.ts
@@ -0,0 +1,394 @@
+const translation = {
+  list: {
+    title: '銉夈偔銉ャ儭銉炽儓',
+    desc: '銇欍伖銇︺伄銉曘偂銈ゃ儷銇屻亾銇撱伀琛ㄧず銇曘倢銆併儕銉儍銈搞儥銉笺偣鍏ㄤ綋銇孌ify銇紩鐢ㄣ倓銉併儯銉冦儓銉椼儵銈般偆銉炽倰浠嬨仐銇︺儶銉炽偗銇曘倢銈嬨亱銆併偆銉炽儑銉冦偗銈瑰寲銇曘倢銈嬨亾銇ㄣ亴銇с亶銇俱仚銆�',
+    learnMore: '瑭崇窗銇亾銇°倝',
+    addFile: '銉曘偂銈ゃ儷銈掕拷鍔�',
+    addPages: '銉氥兗銈搞倰杩藉姞',
+    addUrl: 'URL銈掕拷鍔�',
+    table: {
+      header: {
+        fileName: '銉曘偂銈ゃ儷鍚�',
+        chunkingMode: '銉併儯銉炽偔銉炽偘銉€兗銉�',
+        words: '鍗樿獮鏁�',
+        hitCount: '妞滅储鍥炴暟',
+        uploadTime: '銈€儍銉椼儹銉笺儔鏅傞枔',
+        status: '銈广儐銉笺偪銈�',
+        action: '銈€偗銈枫儳銉�',
+      },
+      rename: '鍚嶅墠銈掑鏇�',
+      name: '鍚嶅墠',
+    },
+    action: {
+      uploadFile: '鏂般仐銇勩儠銈°偆銉倰銈€儍銉椼儹銉笺儔',
+      settings: '銉併儯銉炽偗瑷畾',
+      addButton: '銉併儯銉炽偗銈掕拷鍔�',
+      add: '銉併儯銉炽偗銈掕拷鍔�',
+      batchAdd: '涓�鎷拷鍔�',
+      archive: '銈€兗銈偆銉�',
+      unarchive: '銈€兗銈偆銉栬В闄�',
+      delete: '鍓婇櫎',
+      enableWarning: '銈€兗銈偆銉栥仌銈屻仧銉曘偂銈ゃ儷銇湁鍔广伀銇с亶銇俱仜銈�',
+      sync: '鍚屾湡',
+    },
+    index: {
+      enable: '鏈夊姽銇仚銈�',
+      disable: '鐒″姽銇仚銈�',
+      all: '銇欍伖銇�',
+      enableTip: '銉曘偂銈ゃ儷銈掋偆銉炽儑銉冦偗銈瑰寲銇с亶銇俱仚',
+      disableTip: '銉曘偂銈ゃ儷銈掋偆銉炽儑銉冦偗銈瑰寲銇с亶銇俱仜銈�',
+    },
+    status: {
+      queuing: '銈儱銉笺偆銉炽偘涓�',
+      indexing: '銈ゃ兂銉囥儍銈偣鍖栦腑',
+      paused: '涓�鏅傚仠姝腑',
+      error: '銈ㄣ儵銉�',
+      available: '鍒╃敤鍙兘',
+      enabled: '鏈夊姽',
+      disabled: '鐒″姽',
+      archived: '銈€兗銈偆銉栨笀銇�',
+    },
+    empty: {
+      title: '銇俱仩銉夈偔銉ャ儭銉炽儓銇屻亗銈娿伨銇涖倱',
+      upload: {
+        tip: '銉曘偂銈ゃ儷銈掋偄銉冦儣銉兗銉夈仐銇熴倞銆併偊銈с儢銈点偆銉堛亱銈夊悓鏈熴仐銇熴倞銆丯otion銈凣itHub銇仼銇偊銈с儢銈€儣銉亱銈夊悓鏈熴仚銈嬨亾銇ㄣ亴銇с亶銇俱仚銆�',
+      },
+      sync: {
+        tip: 'Dify銇畾鏈熺殑銇玁otion銇嬨倝銉曘偂銈ゃ儷銈掋儉銈︺兂銉兗銉夈仐銆佸嚘鐞嗐倰瀹屼簡銇椼伨銇欍��',
+      },
+    },
+    delete: {
+      title: '鏈綋銇墛闄ゃ仐銇俱仚銇嬶紵',
+      content: '寰屻仹鍑︾悊銈掑啀闁嬨仚銈嬪繀瑕併亴銇傘倠鍫村悎銇�佷腑鏂仐銇熷牬鎵�銇嬨倝缍氳銇椼伨銇欍��',
+    },
+    batchModal: {
+      title: '涓�鎷拷鍔�',
+      csvUploadTitle: 'CSV銉曘偂銈ゃ儷銈掋亾銇撱伀銉夈儵銉冦偘銈€兂銉夈儔銉儍銉椼仚銈嬨亱銆�',
+      browse: '鍙傜収',
+      tip: 'CSV銉曘偂銈ゃ儷銇銇閫犮伀婧栨嫚銇欍倠蹇呰銇屻亗銈娿伨銇�:',
+      question: '璩晱',
+      answer: '鍥炵瓟',
+      contentTitle: '銉併儯銉炽偗銇唴瀹�',
+      content: '鍐呭',
+      template: '銉嗐兂銉椼儸銉笺儓銈掋亾銇撱亱銈夈儉銈︺兂銉兗銉�',
+      cancel: '銈儯銉炽偦銉�',
+      run: '涓�鎷疅琛�',
+      runError: '涓�鎷疅琛屻伀澶辨晽銇椼伨銇椼仧',
+      processing: '涓�鎷嚘鐞嗕腑',
+      completed: '銈ゃ兂銉濄兗銉堝畬浜�',
+      error: '銈ゃ兂銉濄兗銉堛偍銉┿兗',
+      ok: 'OK',
+    },
+  },
+  metadata: {
+    title: '銉°偪銉囥兗銈�',
+    desc: '銉夈偔銉ャ儭銉炽儓銇儭銈裤儑銉笺偪銇儵銉欍儷銈掍粯銇戙倠銇撱仺銇с�丄I銇屻偪銈ゃ儬銉兗銇偄銈偦銈广仹銇嶃倠銈堛亞銇仾銈娿�併儲銉笺偠銉笺伀鍙傜収鍏冦亴鍏枊銇曘倢銇俱仚銆�',
+    dateTimeFormat: 'YYYY骞碝鏈圖鏃� hh:mm A',
+    docTypeSelectTitle: '銉夈偔銉ャ儭銉炽儓銈裤偆銉椼倰閬告姙銇椼仸銇忋仩銇曘亜',
+    docTypeChangeTitle: '銉夈偔銉ャ儭銉炽儓銈裤偆銉椼倰澶夋洿',
+    docTypeSelectWarning:
+      '銉夈偔銉ャ儭銉炽儓銈裤偆銉椼倰澶夋洿銇欍倠銇ㄣ�佺従鍦ㄥ叆鍔涖仌銈屻仸銇勩倠銉°偪銉囥兗銈裤伅淇濇寔銇曘倢銇亸銇倞銇俱仚',
+    firstMetaAction: '濮嬨倎銇俱仐銈囥亞',
+    placeholder: {
+      add: '杩藉姞',
+      select: '閬告姙',
+    },
+    source: {
+      upload_file: '銉曘偂銈ゃ儷銈掋偄銉冦儣銉兗銉�',
+      notion: 'Notion銇嬨倝鍚屾湡',
+      github: 'GitHub銇嬨倝鍚屾湡',
+    },
+    type: {
+      book: '鏇哥睄',
+      webPage: '銈︺偋銉栥儦銉笺偢',
+      paper: '璜栨枃',
+      socialMediaPost: '銈姐兗銈枫儯銉儭銉囥偅銈€伄鎶曠',
+      personalDocument: '鍊嬩汉銇儔銈儱銉°兂銉�',
+      businessDocument: '銉撱偢銉嶃偣銉夈偔銉ャ儭銉炽儓',
+      IMChat: 'IM銉併儯銉冦儓',
+      wikipediaEntry: 'Wikipedia銇偍銉炽儓銉兗',
+      notion: 'Notion銇嬨倝鍚屾湡',
+      github: 'GitHub銇嬨倝鍚屾湡',
+      technicalParameters: '鎶�琛撶殑銇儜銉┿儭銉笺偪',
+    },
+    field: {
+      processRule: {
+        processDoc: '銉夈偔銉ャ儭銉炽儓銇嚘鐞�',
+        segmentRule: '銉併儯銉炽偗銇儷銉笺儷',
+        segmentLength: '銉併儯銉炽偗銇暦銇�',
+        processClean: '銉嗐偔銈广儓銇墠鍑︾悊',
+      },
+      book: {
+        title: '銈裤偆銉堛儷',
+        language: '瑷�瑾�',
+        author: '钁楄��',
+        publisher: '鍑虹増绀�',
+        publicationDate: '鍑虹増鏃�',
+        ISBN: 'ISBN',
+        category: '銈儐銈淬儶',
+      },
+      webPage: {
+        title: '銈裤偆銉堛儷',
+        url: 'URL',
+        language: '瑷�瑾�',
+        authorPublisher: '钁楄��/鍑虹増绀�',
+        publishDate: '鍏枊鏃�',
+        topicKeywords: '銉堛償銉冦偗/銈兗銉兗銉�',
+        description: '瑾槑',
+      },
+      paper: {
+        title: '銈裤偆銉堛儷',
+        language: '瑷�瑾�',
+        author: '钁楄��',
+        publishDate: '鍏枊鏃�',
+        journalConferenceName: '銈搞儯銉笺儕銉�/浼氳鍚�',
+        volumeIssuePage: '宸诲彿銉氥兗銈�',
+        DOI: 'DOI',
+        topicsKeywords: '銉堛償銉冦偗/銈兗銉兗銉�',
+        abstract: '瑕佺磩',
+      },
+      socialMediaPost: {
+        platform: '銉椼儵銉冦儓銉曘偐銉笺儬',
+        authorUsername: '钁楄��/銉︺兗銈躲兗鍚�',
+        publishDate: '鍏枊鏃�',
+        postURL: '鎶曠URL',
+        topicsTags: '銉堛償銉冦偗/銈裤偘',
+      },
+      personalDocument: {
+        title: '銈裤偆銉堛儷',
+        author: '钁楄��',
+        creationDate: '浣滄垚鏃�',
+        lastModifiedDate: '鏈�绲傛洿鏂版棩',
+        documentType: '銉夈偔銉ャ儭銉炽儓銈裤偆銉�',
+        tagsCategory: '銈裤偘/銈儐銈淬儶',
+      },
+      businessDocument: {
+        title: '銈裤偆銉堛儷',
+        author: '钁楄��',
+        creationDate: '浣滄垚鏃�',
+        lastModifiedDate: '鏈�绲傛洿鏂版棩',
+        documentType: '銉夈偔銉ャ儭銉炽儓銈裤偆銉�',
+        departmentTeam: '閮ㄧ讲/銉併兗銉�',
+      },
+      IMChat: {
+        chatPlatform: '銉併儯銉冦儓銉椼儵銉冦儓銉曘偐銉笺儬',
+        chatPartiesGroupName: '銉併儯銉冦儓鍙傚姞鑰�/銈般儷銉笺儣鍚�',
+        participants: '鍙傚姞鑰�',
+        startDate: '闁嬪鏃�',
+        endDate: '绲備簡鏃�',
+        topicsKeywords: '銉堛償銉冦偗/銈兗銉兗銉�',
+        fileType: '銉曘偂銈ゃ儷銈裤偆銉�',
+      },
+      wikipediaEntry: {
+        title: '銈裤偆銉堛儷',
+        language: '瑷�瑾�',
+        webpageURL: '銈︺偋銉栥儦銉笺偢URL',
+        editorContributor: '绶ㄩ泦鑰�/瀵勭鑰�',
+        lastEditDate: '鏈�绲傜法闆嗘棩',
+        summaryIntroduction: '姒傝/绱逛粙',
+      },
+      notion: {
+        title: '銈裤偆銉堛儷',
+        language: '瑷�瑾�',
+        author: '钁楄��',
+        createdTime: '浣滄垚鏃ユ檪',
+        lastModifiedTime: '鏈�绲傛洿鏂版棩鏅�',
+        url: 'URL',
+        tag: '銈裤偘',
+        description: '瑾槑',
+      },
+      github: {
+        repoName: '銉儩銈搞儓銉悕',
+        repoDesc: '銉儩銈搞儓銉伄瑾槑',
+        repoOwner: '銉儩銈搞儓銉伄鎵�鏈夎��',
+        fileName: '銉曘偂銈ゃ儷鍚�',
+        filePath: '銉曘偂銈ゃ儷銉戙偣',
+        programmingLang: '銉椼儹銈般儵銉熴兂銈拌█瑾�',
+        url: 'URL',
+        license: '銉┿偆銈汇兂銈�',
+        lastCommitTime: '鏈�绲傘偝銉熴儍銉堟檪鍒�',
+        lastCommitAuthor: '鏈�绲傘偝銉熴儍銉堛伄钁楄��',
+      },
+      originInfo: {
+        originalFilename: '鍏冦伄銉曘偂銈ゃ儷鍚�',
+        originalFileSize: '鍏冦伄銉曘偂銈ゃ儷銈点偆銈�',
+        uploadDate: '銈€儍銉椼儹銉笺儔鏃�',
+        lastUpdateDate: '鏈�绲傛洿鏂版棩',
+        source: '銈姐兗銈�',
+      },
+      technicalParameters: {
+        segmentSpecification: '銉併儯銉炽偗銇粫妲�',
+        segmentLength: '銉併儯銉炽偗銇暦銇�',
+        avgParagraphLength: '骞冲潎娈佃惤闀�',
+        paragraphs: '娈佃惤',
+        hitCount: '妞滅储鍥炴暟',
+        embeddingTime: '鍩嬨倎杈笺伩鏅傞枔',
+        embeddedSpend: '鍩嬨倎杈笺伩銈炽偣銉�',
+      },
+    },
+    languageMap: {
+      zh: '涓浗瑾�',
+      en: '鑻辫獮',
+      es: '銈广儦銈ゃ兂瑾�',
+      fr: '銉曘儵銉炽偣瑾�',
+      de: '銉夈偆銉勮獮',
+      ja: '鏃ユ湰瑾�',
+      ko: '闊撳浗瑾�',
+      ru: '銉偡銈㈣獮',
+      ar: '銈€儵銉撱偄瑾�',
+      pt: '銉濄儷銉堛偓銉獮',
+      it: '銈ゃ偪銉偄瑾�',
+      nl: '銈儵銉炽儉瑾�',
+      pl: '銉濄兗銉┿兂銉夎獮',
+      sv: '銈广偊銈с兗銉囥兂瑾�',
+      tr: '銉堛儷銈宠獮',
+      he: '銉樸儢銉┿偆瑾�',
+      hi: '銉掋兂銉囥偅銉艰獮',
+      da: '銉囥兂銉炪兗銈獮',
+      fi: '銉曘偅銉炽儵銉炽儔瑾�',
+      no: '銉庛儷銈︺偋銉艰獮',
+      hu: '銉忋兂銈儶銉艰獮',
+      el: '銈儶銈枫儯瑾�',
+      cs: '銉併偋銈宠獮',
+      th: '銈裤偆瑾�',
+      id: '銈ゃ兂銉夈儘銈枫偄瑾�',
+    },
+    categoryMap: {
+      book: {
+        fiction: '銉曘偅銈偡銉с兂',
+        biography: '浼濊',
+        history: '姝村彶',
+        science: '绉戝',
+        technology: '銉嗐偗銉庛儹銈搞兗',
+        education: '鏁欒偛',
+        philosophy: '鍝插',
+        religion: '瀹楁暀',
+        socialSciences: '绀句細绉戝',
+        art: '銈€兗銉�',
+        travel: '鏃呰',
+        health: '鍋ュ悍',
+        selfHelp: '鑷繁鍟撶櫤',
+        businessEconomics: '銉撱偢銉嶃偣銉荤祵娓�',
+        cooking: '鏂欑悊',
+        childrenYoungAdults: '瀛愪緵銉昏嫢鑰呭悜銇�',
+        comicsGraphicNovels: '銈炽儫銉冦偗銉汇偘銉┿儠銈c儍銈儙銉欍儷',
+        poetry: '瑭�',
+        drama: '銉夈儵銉�',
+        other: '銇濄伄浠�',
+      },
+      personalDoc: {
+        notes: '銉°儮',
+        blogDraft: '銉栥儹銈般伄涓嬫浉銇�',
+        diary: '鏃ヨ',
+        researchReport: '鐮旂┒銉儩銉笺儓',
+        bookExcerpt: '鏇哥睄銇姕绮�',
+        schedule: '銈广偙銈搞儱銉笺儷',
+        list: '銉偣銉�',
+        projectOverview: '銉椼儹銈搞偋銈儓銇瑕�',
+        photoCollection: '鍐欑湡銈炽儸銈偡銉с兂',
+        creativeWriting: '鍓典綔',
+        codeSnippet: '銈炽兗銉夈偣銉嬨儦銉冦儓',
+        designDraft: '銉囥偠銈ゃ兂銇笅鏇搞亶',
+        personalResume: '灞ユ鏇�',
+        other: '銇濄伄浠�',
+      },
+      businessDoc: {
+        meetingMinutes: '浼氳璀颁簨閷�',
+        researchReport: '鐮旂┒銉儩銉笺儓',
+        proposal: '鎻愭',
+        employeeHandbook: '寰撴キ鍝°儚銉炽儔銉栥儍銈�',
+        trainingMaterials: '鐮斾慨璩囨枡',
+        requirementsDocument: '瑕佷欢瀹氱京鏇�',
+        designDocument: '瑷▓鏇�',
+        productSpecification: '瑁藉搧浠曟鏇�',
+        financialReport: '璨″嫏鍫卞憡鏇�',
+        marketAnalysis: '甯傚牬鍒嗘瀽',
+        projectPlan: '銉椼儹銈搞偋銈儓瑷堢敾',
+        teamStructure: '銉併兗銉犳鎴�',
+        policiesProcedures: '銉濄儶銈枫兗銇ㄦ墜闋�',
+        contractsAgreements: '濂戠磩銇ㄥ悎鎰�',
+        emailCorrespondence: '銉°兗銉伄銈勩倞鍙栥倞',
+        other: '銇濄伄浠�',
+      },
+    },
+  },
+  embedding: {
+    processing: '鍩嬨倎杈笺伩鍑︾悊涓�...',
+    paused: '鍩嬨倎杈笺伩銇屼竴鏅傚仠姝腑',
+    completed: '鍩嬨倎杈笺伩銇屽畬浜嗐仐銇俱仐銇�',
+    error: '鍩嬨倎杈笺伩銈ㄣ儵銉�',
+    docName: '銉夈偔銉ャ儭銉炽儓銇墠鍑︾悊',
+    mode: '銉併儯銉炽偔銉炽偘銉€兗銉�',
+    segmentLength: '鏈�澶с仾銉併儯銉炽偗銇暦銇�',
+    textCleaning: '銉嗐偔銈广儓銇墠鍑︾悊銉兗銉�',
+    segments: '娈佃惤',
+    highQuality: '楂樺搧璩儮銉笺儔',
+    economy: '绲屾笀銉€兗銉�',
+    estimate: '鎺ㄥ畾娑堣不閲�',
+    stop: '鍑︾悊銈掑仠姝�',
+    pause: '鍑︾悊銈掍竴鏅傚仠姝�',
+    resume: '鍐嶉枊',
+    automatic: '鑷嫊',
+    custom: '銈偣銈裤儬',
+    hierarchical: '瑕瓙銉併儯銉炽偔銉炽偘',
+    previewTip: '鍩嬨倎杈笺伩銇屽畬浜嗐仐銇熷緦銆佹钀姐伄銉椼儸銉撱儱銉笺亴鍒╃敤鍙兘銇仾銈娿伨銇�',
+    parentMaxTokens: '瑕�',
+    childMaxTokens: '瀛�',
+  },
+  segment: {
+    paragraphs: '娈佃惤',
+    chunks_one: '銉併儯銉炽偗',
+    chunks_other: '銉併儯銉炽偗',
+    parentChunks_one: '瑕儊銉c兂銈�',
+    parentChunks_other: '瑕儊銉c兂銈�',
+    childChunks_one: '瀛愩儊銉c兂銈�',
+    childChunks_other: '瀛愩儊銉c兂銈�',
+    searchResults_zero: '妞滅储绲愭灉',
+    searchResults_one: '妞滅储绲愭灉',
+    searchResults_other: '妞滅储绲愭灉',
+    empty: '銉併儯銉炽偗銇岃銇ゃ亱銈娿伨銇涖倱',
+    clearFilter: '銉曘偅銉偪銉笺倰銈儶銈�',
+    chunk: '銉併儯銉炽偗',
+    parentChunk: '瑕儊銉c兂銈�',
+    newChunk: '鏂般仐銇勩儊銉c兂銈�',
+    childChunk: '瀛愩儊銉c兂銈�',
+    newChildChunk: '鏂般仐銇勫瓙銉併儯銉炽偗',
+    keywords: '銈兗銉兗銉�',
+    addKeyWord: '銈兗銉兗銉夈倰杩藉姞',
+    keywordError: '銈兗銉兗銉夈伄鏈�澶ч暦銇�20銇с仚',
+    characters_one: '鏂囧瓧',
+    characters_other: '鏂囧瓧',
+    hitCount: '妞滅储鍥炴暟',
+    vectorHash: '銉欍偗銉堛儷銉忋儍銈枫儱: ',
+    questionPlaceholder: '銇撱亾銇唱鍟忋倰杩藉姞',
+    questionEmpty: '璩晱銇┖銇仹銇嶃伨銇涖倱',
+    answerPlaceholder: '銇撱亾銇洖绛斻倰杩藉姞',
+    answerEmpty: '鍥炵瓟銇┖銇仹銇嶃伨銇涖倱',
+    contentPlaceholder: '銇撱亾銇唴瀹广倰杩藉姞',
+    contentEmpty: '鍐呭銇┖銇仹銇嶃伨銇涖倱',
+    newTextSegment: '鏂般仐銇勩儐銈偣銉堛儊銉c兂銈�',
+    newQaSegment: '鏂般仐銇凲&A銉併儯銉炽偗',
+    addChunk: '銉併儯銉炽偗銈掕拷鍔�',
+    addChildChunk: '瀛愩儊銉c兂銈倰杩藉姞',
+    addAnother: '缍氥亼銇﹁拷鍔�',
+    delete: '銇撱伄銉併儯銉炽偗銈掑墛闄ゃ仐銇俱仚銇嬶紵',
+    chunkAdded: '銉併儯銉炽偗銈掕拷鍔犮仐銇俱仐銇�',
+    childChunkAdded: '瀛愩儊銉c兂銈倰杩藉姞銇椼伨銇椼仧',
+    editChunk: '銉併儯銉炽偗銈掔法闆�',
+    editParentChunk: '瑕儊銉c兂銈倰绶ㄩ泦',
+    editChildChunk: '瀛愩儊銉c兂銈倰绶ㄩ泦',
+    chunkDetail: '銉併儯銉炽偗銇┏绱�',
+    regenerationConfirmTitle: '瀛愩儊銉c兂銈倰鍐嶇敓鎴愩仐銇俱仚銇嬶紵',
+    regenerationConfirmMessage: '鍐嶇敓鎴愩仌銈屻仧瀛愩儊銉c兂銈伅銆佺法闆嗘笀銇裤伨銇熴伅鏂拌杩藉姞銇瓙銉併儯銉炽偗銈掑惈銈併�佺従鍦ㄣ伄瀛愩儊銉c兂銈倰涓婃浉銇嶃仐銇俱仚銆傘亾銇搷浣溿伅鍙栥倞娑堛仜銇俱仜銈撱��',
+    regeneratingTitle: '瀛愩儊銉c兂銈倰鐢熸垚涓�',
+    regeneratingMessage: '瀛愩儊銉c兂銈伄鐢熸垚銇伅鏅傞枔銇屻亱銇嬨倞銇俱仚銆併仐銇般倝銇忋亰寰呫仭銇忋仩銇曘亜銆�',
+    regenerationSuccessTitle: '瀛愩儊銉c兂銈伄鍐嶇敓鎴愩亴瀹屼簡銇椼伨銇椼仧',
+    regenerationSuccessMessage: '銈︺偅銉炽儔銈︺倰闁夈仒銇︺倐澶т笀澶仹銇�',
+    edited: '绶ㄩ泦娓堛伩',
+    editedAt: '绶ㄩ泦鏃ユ檪',
+    expandChunks: '銉併儯銉炽偗銈掑睍闁�',
+    collapseChunks: '銉併儯銉炽偗銈掓姌銈娿仧銇熴個',
+  },
+}
+
+export default translation
diff --git a/i18n/ja-JP/dataset-hit-testing.ts b/i18n/ja-JP/dataset-hit-testing.ts
new file mode 100644
index 0000000..7b00455
--- /dev/null
+++ b/i18n/ja-JP/dataset-hit-testing.ts
@@ -0,0 +1,34 @@
+const translation = {
+  title: '妞滅储銉嗐偣銉�',
+  desc: '涓庛亪銈夈倢銇熴偗銈ㄣ儶銉嗐偔銈广儓銇熀銇ャ亜銇熴儕銉儍銈搞伄銉掋儍銉堝姽鏋溿倰銉嗐偣銉堛仐銇俱仚銆�',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  records: '瑷橀尣',
+  table: {
+    header: {
+      source: '銈姐兗銈�',
+      text: '銉嗐偔銈广儓',
+      time: '鏅傞枔',
+    },
+  },
+  input: {
+    title: '銈姐兗銈广儐銈偣銉�',
+    placeholder: '銉嗐偔銈广儓銈掑叆鍔涖仐銇︺亸銇犮仌銇勩�傜煭銇勮杩版枃銇屻亰銇欍仚銈併仹銇欍��',
+    countWarning: '鏈�澶�200鏂囧瓧銇俱仹鍏ュ姏銇с亶銇俱仚銆�',
+    indexWarning: '楂樺搧璩伄銉娿儸銉冦偢銇伩銆�',
+    testing: '銉嗐偣銉堜腑',
+  },
+  hit: {
+    title: '鍙栧緱銇椼仧銉併儯銉炽偗{{num}}鍊�',
+    emptyTip: '妞滅储銉嗐偣銉堛伄绲愭灉銇屻亾銇撱伀琛ㄧず銇曘倢銇俱仚銆�',
+  },
+  noRecentTip: '鏈�杩戙伄銈偍銉祼鏋溿伅銇傘倞銇俱仜銈撱��',
+  viewChart: '銉欍偗銉堛儷銉併儯銉笺儓銈掕〃绀�',
+  settingTitle: '鍙栧緱瑷畾',
+  viewDetail: '瑭崇窗銈掕〃绀�',
+  chunkDetail: '銉併儯銉炽偗銇┏绱�',
+  hitChunks: '{{num}}鍊嬨伄瀛愩儊銉c兂銈倰銉掋儍銉�',
+  open: '闁嬨亸',
+  keyword: '銈兗銉兗銉�',
+}
+
+export default translation
diff --git a/i18n/ja-JP/dataset-settings.ts b/i18n/ja-JP/dataset-settings.ts
new file mode 100644
index 0000000..6b809dd
--- /dev/null
+++ b/i18n/ja-JP/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: '銉娿儸銉冦偢銉欍兗銈广伄瑷畾',
+  desc: '銇撱亾銇с伅銉娿儸銉冦偢銉欍兗銈广伄銉椼儹銉戙儐銈c仺鍕曚綔鏂规硶銈掑鏇淬仹銇嶃伨銇欍��',
+  form: {
+    name: '銉娿儸銉冦偢銉欍兗銈瑰悕',
+    namePlaceholder: '銉娿儸銉冦偢銉欍兗銈瑰悕銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    nameError: '鍚嶅墠銇┖銇仹銇嶃伨銇涖倱',
+    desc: '銉娿儸銉冦偢銉欍兗銈广伄瑾槑',
+    descInfo: '銉娿儸銉冦偢銉欍兗銈广伄鍐呭銈掓瑾仚銈嬨仧銈併伄鏄庣⒑銇儐銈偣銉堛伄瑾槑銈掓浉銇勩仸銇忋仩銇曘亜銆傘亾銇鏄庛伅銆佽鏁般伄銉娿儸銉冦偢銇嬨倝鎺ㄨ珫銈掗伕鎶炪仚銈嬮殯銇熀婧栥仺銇椼仸浣跨敤銇曘倢銇俱仚銆�',
+    descPlaceholder: '銇撱伄銉囥兗銈裤偦銉冦儓銇唴瀹广倰瑷樿堪銇椼仸銇忋仩銇曘亜銆傝┏绱般伀瑷樿堪銇欍倠銇撱仺銇с�丄I銇屻儑銉笺偪銈汇儍銉堛伄鍐呭銇繀閫熴伀銈€偗銈汇偣銇с亶銈嬨倛銇嗐伀銇倞銇俱仚銆傜┖娆勩伄鍫村悎銆丩angGenius銇儑銉曘偐銉儓銇绱㈡柟娉曘倰浣跨敤銇椼伨銇欍��',
+    helpText: '閬╁垏銇儑銉笺偪銈汇儍銉堛伄瑾槑銈掍綔鎴愩仚銈嬫柟娉曘倰瀛︺伋銇俱仐銈囥亞銆�',
+    descWrite: '鑹亜銉娿儸銉冦偢銉欍兗銈广伄瑾槑銇浉銇嶆柟銈掑銇躲��',
+    permissions: '妯╅檺',
+    permissionsOnlyMe: '鑷垎銇伩',
+    permissionsAllMember: '銇欍伖銇︺伄銉併兗銉犮儭銉炽儛銉�',
+    permissionsInvitedMembers: '涓�閮ㄣ伄銉併兗銉犮儭銉炽儛銉�',
+    me: '(銇傘仾銇熸)',
+    indexMethod: '銈ゃ兂銉囥儍銈偣鏂规硶',
+    indexMethodHighQuality: '楂樺搧璩�',
+    indexMethodHighQualityTip: '銈堛倞姝g⒑銇绱€伄銇熴倎銆佸煁銈佽炯銇裤儮銉囥儷銈掑懠銇冲嚭銇椼仸銉夈偔銉ャ儭銉炽儓銈掑嚘鐞嗐仚銈嬨亾銇ㄣ仹銆丩LM銇珮鍝佽唱銇洖绛斻倰鐢熸垚銇с亶銇俱仚銆�',
+    upgradeHighQualityTip: '楂樺搧璩儮銉笺儔銇偄銉冦儣銈般儸銉笺儔銇欍倠銇ㄣ�佺祵娓堢殑銉€兗銉夈伀銇埢銇涖伨銇涖倱銆�',
+    indexMethodEconomy: '绲屾笀鐨�',
+    indexMethodEconomyTip: '銉併儯銉炽偗銇傘仧銈�10鍊嬨伄銈兗銉兗銉夈倰妞滅储銇娇鐢ㄣ仐銇俱仚銆傘儓銉笺偗銉炽伅娑堣不銇椼伨銇涖倱銇屻�佹绱㈢簿搴︺伅浣庝笅銇椼伨銇欍��',
+    embeddingModel: '鍩嬨倎杈笺伩銉€儑銉�',
+    embeddingModelTip: '鍩嬨倎杈笺伩銉€儑銉倰澶夋洿銇欍倠銇伅銆�',
+    embeddingModelTipLink: '瑷畾',
+    retrievalSetting: {
+      title: '妞滅储瑷畾',
+      method: '妞滅储鏂规硶',
+      learnMore: '瑭崇窗銇亾銇°倝',
+      description: ' 妞滅储鏂规硶銇仱銇勩仸銇┏绱�',
+      longDescription: ' 妞滅储鏂规硶銇仱銇勩仸銇┏绱般伀銇ゃ亜銇︺伅銆併亜銇ゃ仹銈傘儕銉儍銈搞儥銉笺偣銇ō瀹氥仹澶夋洿銇с亶銇俱仚銆�',
+    },
+    save: '淇濆瓨',
+    externalKnowledgeID: '澶栭儴銉娿儸銉冦偢銉欍兗銈笽D',
+    retrievalSettings: '鍙栧緱瑷畾',
+    externalKnowledgeAPI: '澶栭儴銉娿儸銉冦偢銉欍兗銈笰PI',
+    indexMethodChangeToEconomyDisabledTip: 'HQ銇嬨倝ECO銇搞伄銉�銈︺兂銈般儸銉笺儔銇仹銇嶃伨銇涖倱銆�',
+    searchModel: '銉€儑銉绱�',
+  },
+}
+
+export default translation
diff --git a/i18n/ja-JP/dataset.ts b/i18n/ja-JP/dataset.ts
new file mode 100644
index 0000000..4e367f7
--- /dev/null
+++ b/i18n/ja-JP/dataset.ts
@@ -0,0 +1,221 @@
+const translation = {
+  knowledge: '銉娿儸銉冦偢銉欍兗銈�',
+  chunkingMode: {
+    general: '姹庣敤',
+    parentChild: '瑕瓙',
+  },
+  parentMode: {
+    paragraph: '娈佃惤',
+    fullDoc: '鍏ㄤ綋',
+  },
+  externalTag: '澶栭儴',
+  externalAPI: '澶栭儴API',
+  externalAPIPanelTitle: '澶栭儴銉娿儸銉冦偢銉欍兗銈归�f惡API',
+  externalKnowledgeId: '澶栭儴銉娿儸銉冦偢銉欍兗銈笽D',
+  externalKnowledgeName: '澶栭儴銉娿儸銉冦偢銉欍兗銈瑰悕',
+  externalKnowledgeDescription: '銉娿儸銉冦偢銉欍兗銈广伄瑾槑',
+  externalKnowledgeIdPlaceholder: '銉娿儸銉冦偢銉欍兗銈笽D銈掑叆鍔�',
+  externalKnowledgeNamePlaceholder: '銉娿儸銉冦偢銉欍兗銈瑰悕銈掑叆鍔�',
+  externalKnowledgeDescriptionPlaceholder: '銇撱伄銉娿儸銉冦偢銉欍兗銈广伄瑾槑锛堜换鎰忥級',
+  learnHowToWriteGoodKnowledgeDescription: '鍔规灉鐨勩仾銉娿儸銉冦偢銉欍兗銈广伄瑾槑銇浉銇嶆柟',
+  externalAPIPanelDescription: '澶栭儴銉娿儸銉冦偢銉欍兗銈归�f惡API銇�丏ify澶栥伄銉娿儸銉冦偢銉欍兗銈广仺閫f惡銇椼�併仢銇撱亱銈夈儕銉儍銈搞儥銉笺偣銈掑彇寰椼仚銈嬨仧銈併伀浣跨敤銇椼伨銇欍��',
+  externalAPIPanelDocumentation: '澶栭儴銉娿儸銉冦偢銉欍兗銈归�f惡API銇綔鎴愭柟娉�',
+  localDocs: '銉兗銈儷銉夈偔銉ャ儭銉炽儓',
+  documentCount: ' 銉夈偔銉ャ儭銉炽儓',
+  wordCount: ' k 鍗樿獮',
+  appCount: ' 銉兂銈仌銈屻仧銈€儣銉�',
+  createDataset: '銉娿儸銉冦偢銉欍兗銈广倰浣滄垚',
+  createNewExternalAPI: '鏂般仐銇勫閮ㄣ儕銉儍銈搞儥銉笺偣閫f惡API銈掍綔鎴�',
+  noExternalKnowledge: '澶栭儴銉娿儸銉冦偢銉欍兗銈归�f惡API銇屻亗銈娿伨銇涖倱銆傘亾銇撱倰銈儶銉冦偗銇椼仸浣滄垚銇椼仸銇忋仩銇曘亜',
+  createExternalAPI: '澶栭儴銉娿儸銉冦偢銉欍兗銈归�f惡API銈掕拷鍔�',
+  editExternalAPIFormTitle: '澶栭儴銉娿儸銉冦偢銉欍兗銈归�f惡API銈掔法闆�',
+  editExternalAPITooltipTitle: '閫f惡涓伄銉娿儸銉冦偢銉欍兗銈�',
+  editExternalAPIConfirmWarningContent: {
+    front: '銇撱伄澶栭儴銉娿儸銉冦偢銉欍兗銈归�f惡API銇�',
+    end: '浠躲伄澶栭儴銉娿儸銉冦偢銉欍兗銈广仺閫f惡銇椼仸銇娿倞銆併亾銇鏇淬伅銇欍伖銇︺伀閬╃敤銇曘倢銇俱仚銆傚鏇淬倰淇濆瓨銇椼伨銇欍亱锛�',
+  },
+  editExternalAPIFormWarning: {
+    front: '銇撱伄澶栭儴API銇�',
+    end: '浠躲伄澶栭儴銉娿儸銉冦偢銉欍兗銈广仺閫f惡銇椼仸銇勩伨銇�',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: '鍓婇櫎',
+      end: '銇椼伨銇欍亱锛�',
+    },
+    content: {
+      front: '銇撱伄澶栭儴銉娿儸銉冦偢銉欍兗銈归�f惡API銇�',
+      end: '浠躲伄澶栭儴銉娿儸銉冦偢銉欍兗銈广仺閫f惡銇椼仸銇勩伨銇欍�傘亾銇瓵PI銈掑墛闄ゃ仚銈嬨仺銆併仚銇广仸鐒″姽銇仾銈娿伨銇欍�傘亾銇瓵PI銈掑墛闄ゃ仐銇俱仚銇嬶紵',
+    },
+    noConnectionContent: '銇撱伄API銈掑墛闄ゃ仐銇俱仚銇嬶紵',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: '澶栭儴銉娿儸銉冦偢銉欍兗銈归�f惡API銈掗伕鎶�',
+  },
+  connectDataset: '澶栭儴銉娿儸銉冦偢銉欍兗銈广仺閫f惡',
+  connectDatasetIntro: {
+    title: '澶栭儴銉娿儸銉冦偢銉欍兗銈广仺銇�f惡鏂规硶',
+    content: {
+      front: '澶栭儴銉娿儸銉冦偢銉欍兗銈广仺閫f惡銇欍倠銇伅銆併伨銇氬閮ˋPI銈掍綔鎴愩仚銈嬪繀瑕併亴銇傘倞銇俱仚銆備互涓嬨伄鎵嬮爢銈掑弬鐓с仐銆�',
+      link: '澶栭儴API銇綔鎴愭柟娉�',
+      end: '銈掋仈纰鸿獚銇忋仩銇曘亜銆傛銇�佸蹇溿仚銈嬨儕銉儍銈搞儥銉笺偣ID銈掑乏鍋淬伄銉曘偐銉笺儬銇叆鍔涖仐銇︺亸銇犮仌銇勩�傘仚銇广仸銇儏鍫便亴姝c仐銇戙倢銇般�侀�f惡銉溿偪銉炽倰銈儶銉冦偗銇欍倠銇ㄣ�佽嚜鍕曠殑銇儕銉儍銈搞儥銉笺偣銇绱€儐銈广儓銇Щ鍕曘仐銇俱仚銆�',
+    },
+    learnMore: '瑭崇窗銇亾銇°倝',
+  },
+  connectHelper: {
+    helper1: 'API銇ㄣ儕銉儍銈搞儥銉笺偣ID銈掍娇銇c仸澶栭儴銉娿儸銉冦偢銉欍兗銈广仺閫f惡銇椼伨銇欍�傜従鍦ㄣ��',
+    helper2: '妞滅储姗熻兘銇伩銇屻偟銉濄兗銉堛仌銈屻仸銇勩伨銇欍��',
+    helper3: '銇撱伄姗熻兘銈掍娇鐢ㄣ仚銈嬪墠銇��',
+    helper4: '銉樸儷銉椼儔銈儱銉°兂銉�',
+    helper5: '銈掋倛銇忋亰瑾伩銇忋仩銇曘亜銆�',
+  },
+  createDatasetIntro: '鐙嚜銇儐銈偣銉堛儑銉笺偪銈掋偆銉炽儩銉笺儓銇欍倠銇嬨�丩LM銈炽兂銉嗐偔銈广儓銇挤鍖栥伄銇熴倎銇玏ebhook銈掍粙銇椼仸銉偄銉偪銈ゃ儬銇с儑銉笺偪銈掓浉銇嶈炯銈�銇撱仺銇屻仹銇嶃伨銇欍��',
+  deleteDatasetConfirmTitle: '銇撱伄銉娿儸銉冦偢銉欍兗銈广倰鍓婇櫎銇椼伨銇欍亱锛�',
+  deleteDatasetConfirmContent:
+    '銉娿儸銉冦偢銉欍兗銈广倰鍓婇櫎銇欍倠銇ㄥ厓銇埢銇欍亾銇ㄣ伅銇с亶銇俱仜銈撱�傘儲銉笺偠銉笺伅銈傘伅銈勩亗銇仧妲樸伄銉娿儸銉冦偢銉欍兗銈广伀銈€偗銈汇偣銇с亶銇氥�併仚銇广仸銇儣銉兂銉椼儓銇ō瀹氥仺銉偘銇屾案涔呫伀鍓婇櫎銇曘倢銇俱仚銆�',
+  datasetUsedByApp: '銇撱伄銉娿儸銉冦偢銉欍兗銈广伅涓�閮ㄣ伄銈€儣銉伀銈堛仯銇︿娇鐢ㄣ仌銈屻仸銇勩伨銇欍�傘偄銉椼儶銇亾銇儕銉儍銈搞儥銉笺偣銈掍娇鐢ㄣ仹銇嶃仾銇忋仾銈娿�併仚銇广仸銇儣銉兂銉椼儓瑷畾銇ㄣ儹銈般伅姘镐箙銇墛闄ゃ仌銈屻伨銇欍��',
+  datasetDeleted: '銉娿儸銉冦偢銉欍兗銈广亴鍓婇櫎銇曘倢銇俱仐銇�',
+  datasetDeleteFailed: '銉娿儸銉冦偢銉欍兗銈广伄鍓婇櫎銇け鏁椼仐銇俱仐銇�',
+  didYouKnow: '銇斿瓨鐭ャ仹銇欍亱锛�',
+  intro1: '銉娿儸銉冦偢銉欍兗銈广伅Dify銈€儣銉偙銉笺偡銉с兂銇当鍚堛仚銈嬨亾銇ㄣ亴銇с亶銇俱仚',
+  intro2: '銈炽兂銉嗐偔銈广儓銇ㄣ仐銇�',
+  intro3: '銆�',
+  intro4: '銇俱仧銇�',
+  intro5: '浣滄垚銇欍倠銇撱仺銇屻仹銇嶃伨銇�',
+  intro6: '鍗樹綋銇瓹hatGPT銈ゃ兂銉囥儍銈偣銉椼儵銈般偆銉炽仺銇椼仸鍏枊銇欍倠銇熴倎銇�',
+  unavailable: '鍒╃敤涓嶅彲',
+  unavailableTip: '鍩嬨倎杈笺伩銉€儑銉亴鍒╃敤銇с亶銇俱仜銈撱�傘儑銉曘偐銉儓銇煁銈佽炯銇裤儮銉囥儷銈掕ō瀹氥仚銈嬪繀瑕併亴銇傘倞銇俱仚',
+  datasets: '銉娿儸銉冦偢銉欍兗銈�',
+  datasetsApi: 'API ACCESS',
+  externalKnowledgeForm: {
+    connect: '閫f惡',
+    cancel: '銈儯銉炽偦銉�',
+  },
+  externalAPIForm: {
+    name: '鍚嶅墠',
+    endpoint: 'API銈ㄣ兂銉夈儩銈ゃ兂銉�',
+    apiKey: 'API銈兗',
+    save: '淇濆瓨',
+    cancel: '銈儯銉炽偦銉�',
+    edit: '绶ㄩ泦',
+    encrypted: {
+      front: 'API銉堛兗銈兂銇�',
+      end: '鎶�琛撱仹鏆楀彿鍖栥仌銈屻�佸畨鍏ㄣ伀淇濆瓨銇曘倢銇俱仚銆�',
+    },
+  },
+  retrieval: {
+    semantic_search: {
+      title: '銉欍偗銉堛儷妞滅储',
+      description: '銈偍銉伄鍩嬨倎杈笺伩銈掔敓鎴愩仐銆併仢銇儥銈儓銉〃鐝俱伀鏈�銈傞浼笺仐銇熴儐銈偣銉堛儊銉c兂銈倰妞滅储銇椼伨銇欍��',
+    },
+    full_text_search: {
+      title: '鍏ㄦ枃妞滅储',
+      description: '銉夈偔銉ャ儭銉炽儓鍐呫伄銇欍伖銇︺伄鐢ㄨ獮銈掋偆銉炽儑銉冦偗銈瑰寲銇椼�併儲銉笺偠銉笺亴浠绘剰銇敤瑾炪倰妞滅储銇椼仸銇濄倢銇枹閫c仚銈嬨儐銈偣銉堛儊銉c兂銈倰鍙栧緱銇с亶銈嬨倛銇嗐伀銇椼伨銇欍��',
+    },
+    hybrid_search: {
+      title: '銉忋偆銉栥儶銉冦儔妞滅储',
+      description: '鍏ㄦ枃妞滅储銇ㄣ儥銈儓銉绱€倰鍚屾檪銇疅琛屻仐銆併儲銉笺偠銉笺伄銈偍銉伀鏈�閬┿仾銉炪儍銉併倰閬告姙銇欍倠銇熴倎銇玆erank浠樸亼銈掕銇勩伨銇欍�俁erank銉€儑銉獳PI銇ō瀹氥亴蹇呰銇с仚銆�',
+      recommend: '鎺ㄥエ',
+    },
+    invertedIndex: {
+      title: '杌㈢疆銈ゃ兂銉囥儍銈偣',
+      description: '鍔圭巼鐨勩仾妞滅储銇娇鐢ㄣ仌銈屻倠妲嬮�犮仹銇欍�傚悇鐢ㄨ獮銇屽惈銇俱倢銈嬨儔銈儱銉°兂銉堛伨銇熴伅Web銉氥兗銈搞倰鎸囥仚銈堛亞銇�佺敤瑾炪仈銇ㄣ伀鏁寸悊銇曘倢銇︺亜銇俱仚銆�',
+    },
+    change: '澶夋洿',
+    changeRetrievalMethod: '妞滅储鏂规硶銇鏇�',
+  },
+  docsFailedNotice: '銉夈偔銉ャ儭銉炽儓銇偆銉炽儑銉冦偗銈逛綔鎴愩伀澶辨晽銇椼伨銇椼仧',
+  retry: '鍐嶈│琛�',
+  documentsDisabled: '{{num}}浠躲伄銉夈偔銉ャ儭銉炽儓銇岀劇鍔� - 30鏃ヤ互涓婇潪銈€偗銉嗐偅銉�',
+  enable: '鏈夊姽鍖�',
+  indexingTechnique: {
+    high_quality: '楂樺搧璩�',
+    economy: '绲屾笀',
+  },
+  indexingMethod: {
+    semantic_search: '銉欍偗銉堛儷妞滅储',
+    full_text_search: '銉曘儷銉嗐偔銈广儓妞滅储',
+    hybrid_search: '銉忋偆銉栥儶銉冦儔妞滅储',
+    invertedIndex: '杌㈢疆',
+  },
+  defaultRetrievalTip: '銉囥儠銈┿儷銉堛仹銇�併優銉儊銉戙偣妞滅储銇屼娇鐢ㄣ仌銈屻伨銇欍�傝鏁般伄銉娿儸銉冦偢銉欍兗銈广亱銈夋儏鍫便倰鍙栧緱銇椼仧寰屻�佸啀銉┿兂銈兂銈般倰琛屻亜銇俱仚銆�',
+  mixtureHighQualityAndEconomicTip: '楂樺搧璩仾銉娿儸銉冦偢銉欍兗銈广仺銈炽偣銉堥噸瑕栥伄銉娿儸銉冦偢銉欍兗銈广倰娣峰湪銇曘仜銈嬨伀銇�丷erank銉€儑銉亴蹇呰銇с仚銆�',
+  inconsistentEmbeddingModelTip: '閬告姙銇曘倢銇熴儕銉儍銈搞儥銉笺偣銇煁銈佽炯銇裤儮銉囥儷銇竴璨�с亴銇亜鍫村悎銆丷erank銉€儑銉亴蹇呰銇с仚銆�',
+  mixtureInternalAndExternalTip: '鍐呴儴銇ㄥ閮ㄣ伄銉娿儸銉冦偢銉欍兗銈广倰娣峰湪銇曘仜銈嬪牬鍚堛�丷erank銉€儑銉亴蹇呰銇с仚銆�',
+  allExternalTip: '澶栭儴銉娿儸銉冦偢銉欍兗銈广伄銇裤倰浣跨敤銇欍倠鍫村悎銆丷erank銉€儑銉倰鏈夊姽銇仚銈嬨亱銈掗伕鎶炪仹銇嶃伨銇欍�傛湁鍔广伀銇椼仾銇勫牬鍚堛�佹绱㈢祼鏋溿伅銈广偝銈€伀鍩恒仴銇勩仸銈姐兗銉堛仌銈屻伨銇欍�傜暟銇倠銉娿儸銉冦偢銉欍兗銈广仹妞滅储鎴︾暐銇屼竴璨仐銇︺亜銇亜銇ㄣ�佺祼鏋溿亴涓嶆纰恒伀銇倠鍙兘鎬с亴銇傘倞銇俱仚銆�',
+  retrievalSettings: '妞滅储瑷畾',
+  rerankSettings: 'Rerank瑷畾',
+  weightedScore: {
+    title: '銈︺偋銈ゃ儓瑷畾',
+    description: '閲嶃伩銈掕鏁淬仚銈嬨亾銇ㄣ仹銆佷甫銇规浛銇堟垿鐣ャ伅銈汇優銉炽儐銈c儍銈優銉冦儊銉炽偘銇ㄣ偔銉笺儻銉笺儔銉炪儍銉併兂銈般伄銇┿仭銈夈倰鍎厛銇欍倠銇嬨倰姹哄畾銇椼伨銇欍��',
+    semanticFirst: '銈汇優銉炽儐銈c儍銈劒鍏�',
+    keywordFirst: '銈兗銉兗銉夊劒鍏�',
+    customized: '銈偣銈裤優銈ゃ偤',
+    semantic: '銈汇優銉炽儐銈c偗銈�',
+    keyword: '銈兗銉兗銉�',
+  },
+  nTo1RetrievalLegacy: '瑁藉搧瑷堢敾銇倛銈嬨仺銆丯-to-1 Retrieval銇�9鏈堛伀姝e紡銇粌姝€仌銈屻倠浜堝畾銇с仚銆傘仢銈屻伨銇с伅閫氬父閫氥倞浣跨敤銇с亶銇俱仚銆�',
+  nTo1RetrievalLegacyLink: '瑭崇窗銇亾銇°倝',
+  nTo1RetrievalLegacyLinkText: ' N-to-1 retrieval銇�9鏈堛伀姝e紡銇粌姝€仌銈屻伨銇欍��',
+  batchAction: {
+    selected: '閬告姙娓堛伩',
+    enable: '鏈夊姽銇仚銈�',
+    disable: '鐒″姽銇仚銈�',
+    archive: '銈€兗銈偆銉�',
+    delete: '鍓婇櫎',
+    cancel: '銈儯銉炽偦銉�',
+  },
+  preprocessDocument: '{{num}}浠躲伄銉夈偔銉ャ儭銉炽儓銈掑墠鍑︾悊',
+  allKnowledge: '銉娿儸銉冦偢銉欍兗銈瑰叏浣�',
+  allKnowledgeDescription: '銇撱伄銉兗銈偣銉氥兗銈广伀銉娿儸銉冦偢銉欍兗銈瑰叏浣撱倰琛ㄧず銇欍倠鍫村悎銇伕鎶炪仐銇俱仚銆傘儻銉笺偗銈广儦銉笺偣銇偑銉笺儕銉笺伄銇裤亴銇欍伖銇︺伄銉娿儸銉冦偢銉欍兗銈广倰绠$悊銇с亶銇俱仚銆�',
+  embeddingModelNotAvailable: 'Embedding銉€儑銉笉鍙敤銆�',
+  metadata: {
+    metadata: '銉°偪銉囥兗銈�',
+    addMetadata: '銉°偪銉囥兗銈裤倰杩藉姞',
+    chooseTime: '鏅傞枔銈掗伕鎶�',
+    createMetadata: {
+      title: '鏂拌銉°偪銉囥兗銈�',
+      back: '鎴汇倠',
+      type: '銈裤偆銉�',
+      name: '鍚嶇О',
+      namePlaceholder: '銉°偪銉囥兗銈垮悕銈掑叆鍔�',
+    },
+    checkName: {
+      empty: '銉°偪銉囥兗銈垮悕銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+      invalid: '銉°偪銉囥兗銈垮悕銇皬鏂囧瓧銆佹暟瀛椼�併偄銉炽儉銉笺偣銈炽偄銇伩銈掍娇鐢ㄣ仐銆佸皬鏂囧瓧銇у銈併倠蹇呰銇屻亗銈娿伨銇�',
+    },
+    batchEditMetadata: {
+      editMetadata: '銉°偪銉囥兗銈裤倰绶ㄩ泦',
+      editDocumentsNum: '{{num}}浠躲伄銉夈偔銉ャ儭銉炽儓銈掔法闆�',
+      applyToAllSelectDocument: '閬告姙銇椼仧銇欍伖銇︺伄銉夈偔銉ャ儭銉炽儓銇仼鐢�',
+      applyToAllSelectDocumentTip: '涓婅銇法闆嗐仺鏂般仐銇勩儭銈裤儑銉笺偪銈掗伕鎶炪仐銇熴仚銇广仸銇儔銈儱銉°兂銉堛伀鑷嫊鐨勩伀閬╃敤銇椼伨銇欍�傘儊銈с儍銈仐銇亜鍫村悎銆佹棦銇儭銈裤儑銉笺偪銈掓寔銇ゃ儔銈儱銉°兂銉堛伀銇伩绶ㄩ泦銇岄仼鐢ㄣ仌銈屻伨銇欍��',
+      multipleValue: '瑜囨暟銇��',
+    },
+    selectMetadata: {
+      search: '銉°偪銉囥兗銈裤倰妞滅储',
+      newAction: '鏂拌銉°偪銉囥兗銈�',
+      manageAction: '绠$悊',
+    },
+    datasetMetadata: {
+      description: '銉°偪銉囥兗銈裤伅銉夈偔銉ャ儭銉炽儓銇枹銇欍倠鎯呭牨銇с�併儔銈儱銉°兂銉堛伄灞炴�с倰瑾槑銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍�傘儭銈裤儑銉笺偪銈掓椿鐢ㄣ仚銈嬨亾銇ㄣ仹銆併儔銈儱銉°兂銉堛倰銈堛倞鍔圭巼鐨勩伀鏁寸悊銉荤鐞嗐仹銇嶃伨銇欍��',
+      addMetaData: '銉°偪銉囥兗銈裤倰杩藉姞',
+      values: '{{num}}鍊嬨伄鍊�',
+      disabled: '鐒″姽',
+      rename: '鍚嶅墠澶夋洿',
+      name: '鍚嶇О',
+      namePlaceholder: '銉°偪銉囥兗銈垮悕',
+      builtIn: '绲勩伩杈笺伩',
+      builtInDescription: '绲勩伩杈笺伩銉°偪銉囥兗銈裤伅銈枫偣銉嗐儬銇倛銇c仸浜嬪墠瀹氱京銇曘倢銇熴儭銈裤儑銉笺偪銇с仚銆傘亾銇撱仹绲勩伩杈笺伩銉°偪銉囥兗銈裤伄琛ㄧず銇ㄧ鐞嗐亴銇с亶銇俱仚銆�',
+      deleteTitle: '鍓婇櫎銇⒑瑾�',
+      deleteContent: '銉°偪銉囥兗銈裤�寋{name}}銆嶃倰鍓婇櫎銇椼仸銈傘倛銈嶃仐銇勩仹銇欍亱锛�',
+    },
+    documentMetadata: {
+      metadataToolTip: '銉°偪銉囥兗銈裤伅銉夈偔銉ャ儭銉炽儓銇枹銇欍倠鎯呭牨銇с�併儔銈儱銉°兂銉堛伄灞炴�с倰瑾槑銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍�傘儭銈裤儑銉笺偪銈掓椿鐢ㄣ仚銈嬨亾銇ㄣ仹銆併儔銈儱銉°兂銉堛倰銈堛倞鍔圭巼鐨勩伀鏁寸悊銉荤鐞嗐仹銇嶃伨銇欍��',
+      startLabeling: '銉┿儥銉兂銈般倰闁嬪',
+      documentInformation: '銉夈偔銉ャ儭銉炽儓鎯呭牨',
+      technicalParameters: '鎶�琛撱儜銉┿儭銉笺偪',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/ja-JP/education.ts b/i18n/ja-JP/education.ts
new file mode 100644
index 0000000..d51bac8
--- /dev/null
+++ b/i18n/ja-JP/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerified: '鏁欒偛瑾嶈銈掑彇寰�',
+  toVerifiedTip: {
+    front: '鐝惧湪銆佹暀鑲茶獚瑷笺偣銉嗐兗銈裤偣銈掑彇寰椼仚銈嬭硣鏍笺亴銇傘倞銇俱仚銆備互涓嬨伀鏁欒偛鎯呭牨銈掑叆鍔涖仐銆佽獚瑷笺儣銉偦銈广倰瀹屼簡銇欍倠銇ㄣ�丏ify銉椼儹銉曘偋銉冦偡銉с儕銉儣銉┿兂銇�',
+    coupon: '50锛呭壊寮曘偗銉笺儩銉�',
+    end: '銈掑彈銇戝彇銈嬨亾銇ㄣ亴銇с亶銇俱仚銆�',
+  },
+  currentSigned: '鐝惧湪銉偘銈ゃ兂涓伄銈€偒銈︺兂銉堛伅',
+  form: {
+    schoolName: {
+      title: '瀛︽牎鍚�',
+      placeholder: '瀛︽牎銇寮忓悕绉帮紙鐪佺暐涓嶅彲锛夈倰鍏ュ姏銇椼仸銇忋仩銇曘亜銆�',
+    },
+    schoolRole: {
+      title: '瀛︽牎銇с伄褰瑰壊',
+      option: {
+        student: '瀛︾敓',
+        teacher: '鏁欏斧',
+        administrator: '瀛︽牎绠$悊鑰�',
+      },
+    },
+    terms: {
+      title: '鍒╃敤瑕忕磩銇ㄥ悓鎰忎簨闋�',
+      desc: {
+        front: '銇婂妲樸伄鎯呭牨銇娿倛銇� 鏁欒偛瑾嶈銈广儐銉笺偪銈� 銇埄鐢ㄣ伅銆佸綋绀俱伄 ',
+        and: '銇娿倛銇�',
+        end: '銇緭銇嗐倐銇仺銇椼伨銇欍�傞�佷俊銇欍倠銇撱仺銇т互涓嬨倰纰鸿獚銇椼伨銇欙細',
+        termsOfService: '鍒╃敤瑕忕磩',
+        privacyPolicy: '銉椼儵銈ゃ儛銈枫兗銉濄儶銈枫兗',
+      },
+      option: {
+        age: '18姝充互涓娿仹銇傘倠銇撱仺銈掔⒑瑾嶃仐銇俱仚銆�',
+        inSchool: '鎻愪緵銇椼仧鏁欒偛姗熼枹銇湪绫嶃伨銇熴伅鍕ゅ嫏銇椼仸銇勩倠 銇撱仺銈掔⒑瑾嶃仐銇俱仚銆侱ify銇湪绫�/闆囩敤瑷兼槑銇彁鍑恒倰姹傘倎銈嬪牬鍚堛亴銇傘倞銇俱仚銆備笉姝c仾鎯呭牨銈掔敵鍛娿仐銇熷牬鍚堛�佹暀鑲茶獚瑷笺伀鍩恒仴銇嶅厤闄ゃ仌銈屻仧璨荤敤銈掓敮鎵曘亞銇撱仺銇悓鎰忋仐銇俱仚銆�',
+      },
+    },
+  },
+  submit: '閫佷俊',
+  submitError: '銉曘偐銉笺儬銇�佷俊銇け鏁椼仐銇俱仐銇熴�傘仐銇般倝銇忋仐銇︺亱銈夊啀搴︺仈鎻愬嚭銇忋仩銇曘亜銆�',
+  learn: '鏁欒偛瑾嶈銇彇寰楁柟娉曘伅銇撱仭銈�',
+  successTitle: 'Dify鏁欒偛瑾嶈銈掑彇寰椼仐銇俱仐銇燂紒',
+  successContent: '銇婂妲樸伄銈€偒銈︺兂銉堛伀 Dify銉椼儹銉曘偋銉冦偡銉с儕銉儣銉┿兂銇�50%鍓插紩銈兗銉濄兂 銈掔櫤琛屻仐銇俱仐銇熴�傛湁鍔规湡闁撱伅 1骞撮枔 銇с仚銇仹銆佹湡闄愬唴銇仈鍒╃敤銇忋仩銇曘亜銆�',
+  rejectTitle: 'Dify鏁欒偛瑾嶈銇屾嫆鍚︺仌銈屻伨銇椼仧',
+  rejectContent: '鐢炽仐瑷炽仈銇栥亜銇俱仜銈撱亴銆併亾銇儭銉笺儷銈€儔銉偣銇с伅 鏁欒偛瑾嶈 銇硣鏍笺倰鍙栧緱銇с亶銇氥�丏ify銉椼儹銉曘偋銉冦偡銉с儕銉儣銉┿兂銇�50锛呭壊寮曘偗銉笺儩銉� 銈掑彈銇戝彇銈嬨亾銇ㄣ伅銇с亶銇俱仜銈撱��',
+  emailLabel: '鐝惧湪銇儭銉笺儷銈€儔銉偣',
+}
+
+export default translation
diff --git a/i18n/ja-JP/explore.ts b/i18n/ja-JP/explore.ts
new file mode 100644
index 0000000..37a1f41
--- /dev/null
+++ b/i18n/ja-JP/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: '鎺㈢储',
+  sidebar: {
+    discovery: '鎺㈢储',
+    chat: '銉併儯銉冦儓',
+    workspace: '銉兗銈偣銉氥兗銈�',
+    action: {
+      pin: '銉斻兂鐣欍倎',
+      unpin: '銉斻兂鐣欍倎瑙i櫎',
+      rename: '鍚嶅墠澶夋洿',
+      delete: '鍓婇櫎',
+    },
+    delete: {
+      title: '銈€儣銉倰鍓婇櫎',
+      content: '銇撱伄銈€儣銉倰鍓婇櫎銇椼仸銈傘倛銈嶃仐銇勩仹銇欍亱锛�',
+    },
+  },
+  apps: {
+    title: 'Dify銇倛銈嬨偄銉椼儶銇帰绱�',
+    description: '銇撱倢銈夈伄銉嗐兂銉椼儸銉笺儓銈€儣銉倰鍗冲骇銇娇鐢ㄣ仚銈嬨亱銆併儐銉炽儣銉兗銉堛伀鍩恒仴銇勩仸鐙嚜銇偄銉椼儶銈掋偒銈广偪銉炪偆銈恒仐銇︺亸銇犮仌銇勩��',
+    allCategories: '鎺ㄥエ',
+  },
+  appCard: {
+    addToWorkspace: '銉兗銈偣銉氥兗銈广伀杩藉姞',
+    customize: '銈偣銈裤優銈ゃ偤',
+  },
+  appCustomize: {
+    title: '{{name}}銇嬨倝銈€儣銉倰浣滄垚',
+    subTitle: '銈€儣銉偄銈ゃ偝銉炽仺鍚嶅墠',
+    nameRequired: '銈€儣銉悕銇繀闋堛仹銇�',
+  },
+  category: {
+    Assistant: '銈€偡銈广偪銉炽儓',
+    Writing: '鍩风瓎',
+    Translate: '缈昏ǔ',
+    Programming: '銉椼儹銈般儵銉熴兂銈�',
+    HR: '浜轰簨',
+    Workflow: '銉兗銈儠銉兗',
+    Agent: '銈ㄣ兗銈搞偋銉炽儓',
+    Entertainment: '銈ㄣ兂銈裤兗銉嗐偆銉°兂銉�',
+  },
+}
+
+export default translation
diff --git a/i18n/ja-JP/layout.ts b/i18n/ja-JP/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/ja-JP/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/ja-JP/login.ts b/i18n/ja-JP/login.ts
new file mode 100644
index 0000000..7ba8047
--- /dev/null
+++ b/i18n/ja-JP/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: '銇仒銈併伨銇椼倗銇嗭紒馃憢',
+  welcome: 'Dify銇搞倛銇嗐亾銇濄�傜稓琛屻仚銈嬨伀銇儹銈般偆銉炽仐銇︺亸銇犮仌銇勩��',
+  email: '銉°兗銉偄銉夈儸銈�',
+  emailPlaceholder: '銉°兗銉偄銉夈儸銈广倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+  password: '銉戙偣銉兗銉�',
+  passwordPlaceholder: '銉戙偣銉兗銉夈倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+  name: '銉︺兗銈躲兗鍚�',
+  namePlaceholder: '銉︺兗銈躲兗鍚嶃倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+  forget: '銉戙偣銉兗銉夈倰銇婂繕銈屻仹銇欍亱锛�',
+  signBtn: '銈点偆銉炽偆銉�',
+  sso: 'SSO銇稓銇戙倠',
+  installBtn: '銈汇儍銉堛偄銉冦儣',
+  setAdminAccount: '绠$悊鑰呫偄銈偊銉炽儓銇ō瀹�',
+  setAdminAccountDesc: '銈€儣銉偙銉笺偡銉с兂銇綔鎴愩倓LLM銉椼儹銉愩偆銉�銇鐞嗐仾銇┿�佺鐞嗚�呫偄銈偊銉炽儓銇渶澶фī闄愩倰瑷畾銇椼伨銇欍��',
+  createAndSignIn: '浣滄垚銇椼仸銈点偆銉炽偆銉�',
+  oneMoreStep: '銇傘仺涓�姝�',
+  createSample: '銇撱伄鎯呭牨銈掑熀銇�併偟銉炽儣銉偄銉椼儶銈便兗銈枫儳銉炽倰浣滄垚銇椼伨銇�',
+  invitationCode: '鎷涘緟銈炽兗銉�',
+  invitationCodePlaceholder: '鎷涘緟銈炽兗銉夈倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+  interfaceLanguage: '銈ゃ兂銈裤兗銉曘偋銉笺偣瑷�瑾�',
+  timezone: '銈裤偆銉犮偩銉笺兂',
+  go: 'Dify銇哥Щ鍕�',
+  sendUsMail: '鑷繁绱逛粙銈掋儭銉笺儷銇ч�佷俊銇椼�佹嫑寰呫儶銈偍銈广儓銈掑嚘鐞嗐仐銇俱仚銆�',
+  acceptPP: '銉椼儵銈ゃ儛銈枫兗銉濄儶銈枫兗銈掕銇裤�佸悓鎰忋仐銇俱仚',
+  reset: '銉戙偣銉兗銉夈倰銉偦銉冦儓銇欍倠銇伅銆佹銇偝銉炪兂銉夈倰瀹熻銇椼仸銇忋仩銇曘亜',
+  withGitHub: 'GitHub銇х稓琛�',
+  withGoogle: 'Google銇х稓琛�',
+  rightTitle: 'LLM銇儠銉儩銉嗐兂銈枫儯銉倰瑙c亶鏀俱仱',
+  rightDesc: '榄呭姏鐨勩仹鎿嶄綔鍙兘銇ф敼鍠勫彲鑳姐仾AI銈€儣銉偙銉笺偡銉с兂銈掔啊鍗樸伀妲嬬瘔銇椼伨銇欍��',
+  tos: '鍒╃敤瑕忕磩',
+  pp: '銉椼儵銈ゃ儛銈枫兗銉濄儶銈枫兗',
+  tosDesc: '銈点偆銉炽偄銉冦儣銇欍倠銇撱仺銇с�佷互涓嬨伀鍚屾剰銇欍倠銈傘伄銇ㄣ仐銇俱仚',
+  goToInit: '銈€偒銈︺兂銉堛倰鍒濇湡鍖栥仐銇︺亜銇亜鍫村悎銇�佸垵鏈熷寲銉氥兗銈搞伀绉诲嫊銇椼仸銇忋仩銇曘亜',
+  dontHave: '銇婃寔銇°仹銇亜鍫村悎',
+  invalidInvitationCode: '鐒″姽銇嫑寰呫偝銉笺儔',
+  accountAlreadyInited: '銈€偒銈︺兂銉堛伅鏃€伀鍒濇湡鍖栥仌銈屻仸銇勩伨銇�',
+  forgotPassword: '銉戙偣銉兗銉夈倰蹇樸倢銇俱仐銇熴亱锛�',
+  resetLinkSent: '銉偦銉冦儓銉兂銈亴閫佷俊銇曘倢銇俱仐銇�',
+  sendResetLink: '銉偦銉冦儓銉兂銈倰閫佷俊',
+  backToSignIn: '銈点偆銉炽偆銉炽伀鎴汇倠',
+  forgotPasswordDesc: '銉戙偣銉兗銉夈倰銉偦銉冦儓銇欍倠銇熴倎銇儭銉笺儷銈€儔銉偣銈掑叆鍔涖仐銇︺亸銇犮仌銇勩�傘儜銈广儻銉笺儔銇儶銈汇儍銉堟柟娉曘伀闁€仚銈嬫寚绀恒亴瑷樿級銇曘倢銇熴儭銉笺儷銈掗�佷俊銇椼伨銇欍��',
+  checkEmailForResetLink: '銉戙偣銉兗銉夈儶銈汇儍銉堛儶銉炽偗銈掔⒑瑾嶃仚銈嬨仧銈併伀銉°兗銉倰纰鸿獚銇椼仸銇忋仩銇曘亜銆傛暟鍒嗕互鍐呫伀琛ㄧず銇曘倢銇亜鍫村悎銇�併偣銉戙儬銉曘偐銉儉銉笺倰纰鸿獚銇椼仸銇忋仩銇曘亜銆�',
+  passwordChanged: '浠娿仚銇愩偟銈ゃ兂銈ゃ兂',
+  changePassword: '銉戙偣銉兗銉夈倰澶夋洿銇欍倠',
+  changePasswordTip: '銈€偒銈︺兂銉堛伄鏂般仐銇勩儜銈广儻銉笺儔銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+  invalidToken: '鐒″姽銇俱仧銇湡闄愬垏銈屻伄銉堛兗銈兂',
+  confirmPassword: '銉戙偣銉兗銉夈倰纰鸿獚',
+  confirmPasswordPlaceholder: '鏂般仐銇勩儜銈广儻銉笺儔銈掔⒑瑾嶃仐銇︺亸銇犮仌銇�',
+  passwordChangedTip: '銉戙偣銉兗銉夈亴姝e父銇鏇淬仌銈屻伨銇椼仧',
+  error: {
+    emailEmpty: '銉°兗銉偄銉夈儸銈广伅蹇呴爤銇с仚',
+    emailInValid: '鏈夊姽銇儭銉笺儷銈€儔銉偣銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    nameEmpty: '鍚嶅墠銇繀闋堛仹銇�',
+    passwordEmpty: '銉戙偣銉兗銉夈伅蹇呴爤銇с仚',
+    passwordLengthInValid: '銉戙偣銉兗銉夈伅8鏂囧瓧浠ヤ笂銇с仾銇戙倢銇般仾銈娿伨銇涖倱',
+    passwordInvalid: '銉戙偣銉兗銉夈伅鏂囧瓧銇ㄦ暟瀛椼倰鍚伩銆侀暦銇曘伅8浠ヤ笂銇с亗銈嬪繀瑕併亴銇傘倞銇俱仚',
+    registrationNotAllowed: '銈€偒銈︺兂銉堛亴瑕嬨仱銇嬨倞銇俱仜銈撱�傜櫥閷层仚銈嬨仧銈併伀銈枫偣銉嗐儬绠$悊鑰呫伀閫g怠銇椼仸銇忋仩銇曘亜銆�',
+  },
+  license: {
+    tip: 'GitHub銇偑銉笺儣銉炽偨銉笺偣銉┿偆銈汇兂銈广倰纰鸿獚銇椼仸銇嬨倝銆丏ify Community Edition銈掗枊濮嬨仐銇︺亸銇犮仌銇勩��',
+    link: '銈兗銉椼兂銈姐兗銈广儵銈ゃ偦銉炽偣',
+  },
+  join: '鍙傚姞銇欍倠',
+  joinTipStart: '銇傘仾銇熸銈掓嫑寰呫仐銇俱仚',
+  joinTipEnd: '銉併兗銉犮伀鍙傚姞銇欍倠',
+  invalid: '銉兂銈伄鏈夊姽鏈熼檺銇屽垏銈屻仸銇勩伨銇�',
+  explore: 'Dify銈掓帰绱€仚銈�',
+  activatedTipStart: '銇傘仾銇熸銇�',
+  activatedTipEnd: '銉併兗銉犮伀鍙傚姞銇椼伨銇椼仧',
+  activated: '浠娿仚銇愩偟銈ゃ兂銈ゃ兂',
+  adminInitPassword: '绠$悊鑰呭垵鏈熷寲銉戙偣銉兗銉�',
+  validate: '妞滆',
+  checkCode: {
+    invalidCode: '鐒″姽銇偝銉笺儔',
+    verify: '纰恒亱銈併倠',
+    verificationCodePlaceholder: '6妗併伄銈炽兗銉夈倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+    useAnotherMethod: '鍒ャ伄鏂规硶銈掍娇鐢ㄣ仚銈�',
+    didNotReceiveCode: '銈炽兗銉夈亴灞娿亶銇俱仜銈撱亱?',
+    resend: '鍐嶉��',
+    verificationCode: '瑾嶈銈炽兗銉�',
+    tips: '<strong>纰鸿獚銈炽兗銉夈倰{{email}}銇�佷俊銇椼伨銇欍��</strong>',
+    validTime: '銈炽兗銉夈伅5鍒嗛枔鏈夊姽銇с亗銈嬨亾銇ㄣ伀娉ㄦ剰銇椼仸銇忋仩銇曘亜',
+    emptyCode: '銈炽兗銉夈亴蹇呰銇с仚',
+    checkYourEmail: '銉°兗銉倰銉併偋銉冦偗銇椼仸銇忋仩銇曘亜',
+  },
+  useVerificationCode: '纰鸿獚銈炽兗銉夈倰浣跨敤銇欍倠',
+  or: '鍙堛伅',
+  back: '鎴汇倠',
+  resetPassword: '銉戙偣銉兗銉夈伄銉偦銉冦儓',
+  changePasswordBtn: '銉戙偣銉兗銉夈倰瑷畾銇欍倠',
+  setYourAccount: '銈€偒銈︺兂銉堛倰瑷畾銇欍倠',
+  withSSO: 'SSO銈掔稓琛屻仚銈�',
+  noLoginMethod: '瑾嶈鏂规硶銇屾鎴愩仌銈屻仸銇勩伨銇涖倱',
+  backToLogin: '銉偘銈ゃ兂銇埢銈�',
+  continueWithCode: '銈炽兗銉夈仹缍氳',
+  noLoginMethodTip: '銈枫偣銉嗐儬绠$悊鑰呫伀閫g怠銇椼仸銆佽獚瑷兼柟娉曘倰杩藉姞銇椼仸銇忋仩銇曘亜銆�',
+  usePassword: '銉戙偣銉兗銉夈倰浣跨敤',
+  sendVerificationCode: '纰鸿獚銈炽兗銉夈伄閫佷俊',
+  enterYourName: '銉︺兗銈躲兗鍚嶃倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+  resetPasswordDesc: 'Dify銇搞伄銈点偆銉炽偄銉冦儣銇娇鐢ㄣ仐銇熴儭銉笺儷銈€儔銉偣銈掑叆鍔涖仚銈嬨仺銆併儜銈广儻銉笺儔銉偦銉冦儓銉°兗銉亴閫佷俊銇曘倢銇俱仚銆�',
+  licenseLost: '銉┿偆銈汇兂銈广倰澶便仯銇�',
+  licenseExpiredTip: '銉兗銈偣銉氥兗銈广伄 Dify Enterprise 銉┿偆銈汇兂銈广伄鏈夊姽鏈熼檺銇屽垏銈屻仸銇勩伨銇欍�侱ify銈掑紩銇嶇稓銇嶄娇鐢ㄣ仚銈嬨伀銇�佺鐞嗚�呫伀閫g怠銇椼仸銇忋仩銇曘亜銆�',
+  licenseInactive: '銉┿偆銈汇兂銈广亴闈炪偄銈儐銈c儢銇с仚',
+  licenseInactiveTip: '銉兗銈偣銉氥兗銈广伄 Dify Enterprise 銉┿偆銈汇兂銈广亴闈炪偄銈儐銈c儢銇с仚銆侱ify銈掑紩銇嶇稓銇嶄娇鐢ㄣ仚銈嬨伀銇�佺鐞嗚�呫伀閫g怠銇椼仸銇忋仩銇曘亜銆�',
+  licenseExpired: '銉┿偆銈汇兂銈广伄鏈夊姽鏈熼檺銇屽垏銈屻仸銇勩伨銇�',
+  licenseLostTip: 'Dify銉┿偆銈汇兂銈广偟銉笺儛銉笺伕銇帴缍氥伀澶辨晽銇椼伨銇椼仧銆傜稓銇戙仸Dify銈掍娇鐢ㄣ仚銈嬨仧銈併伀绠$悊鑰呫伀閫g怠銇椼仸銇忋仩銇曘亜銆�',
+}
+
+export default translation
diff --git a/i18n/ja-JP/plugin-tags.ts b/i18n/ja-JP/plugin-tags.ts
new file mode 100644
index 0000000..ace8c9b
--- /dev/null
+++ b/i18n/ja-JP/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    utilities: '銉︺兗銉嗐偅銉儐銈�',
+    weather: '澶╂皸',
+    education: '鏁欒偛',
+    design: '銉囥偠銈ゃ兂',
+    videos: '銉撱儑銈�',
+    search: '妞滅储',
+    finance: '閲戣瀺',
+    productivity: '鐢熺敚鎬�',
+    image: '鐢诲儚',
+    entertainment: '銈ㄣ兂銈裤兗銉嗐偆銉炽儭銉炽儓',
+    medical: '鍖荤檪',
+    social: '绀句細',
+    news: '銉嬨儱銉笺偣',
+    other: '浠�',
+    agent: '銈ㄣ兗銈搞偋銉炽儓',
+    business: '銉撱偢銉嶃偣',
+    travel: '鏃呰',
+  },
+  searchTags: '妞滅储銈裤偘',
+  allTags: '銇欍伖銇︺伄銈裤偘',
+}
+
+export default translation
diff --git a/i18n/ja-JP/plugin.ts b/i18n/ja-JP/plugin.ts
new file mode 100644
index 0000000..6a27048
--- /dev/null
+++ b/i18n/ja-JP/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    extensions: '鎷″嫉姗熻兘',
+    all: '銇欍伖銇�',
+    tools: '閬撳叿',
+    bundles: '銉愩兂銉夈儷',
+    agents: '銈ㄣ兗銈搞偋銉炽儓鎴︾暐',
+    models: '銉€儑銉�',
+  },
+  categorySingle: {
+    agent: '銈ㄣ兗銈搞偋銉炽儓鎴︾暐',
+    model: '銉€儑銉�',
+    bundle: '銉愩兂銉夈儷',
+    tool: '閬撳叿',
+    extension: '鎷″嫉',
+  },
+  list: {
+    source: {
+      local: '銉兗銈儷銉戙儍銈便兗銈搞儠銈°偆銉亱銈夈偆銉炽偣銉堛兗銉�',
+      github: 'GitHub銇嬨倝銈ゃ兂銈广儓銉笺儷銇欍倠',
+      marketplace: '銉炪兗銈便儍銉堛儣銉偆銈广亱銈夈偆銉炽偣銉堛兗銉�',
+    },
+    noInstalled: '銉椼儵銈般偆銉炽伅銈ゃ兂銈广儓銉笺儷銇曘倢銇︺亜銇俱仜銈�',
+    notFound: '銉椼儵銈般偆銉炽亴瑕嬨仱銇嬨倞銇俱仜銈�',
+  },
+  source: {
+    github: 'GitHub',
+    local: '銉兗銈儷銉戙儍銈便兗銈搞儠銈°偆銉�',
+    marketplace: '銉炪兗銈便儍銉堛儣銉偆銈�',
+  },
+  detailPanel: {
+    categoryTip: {
+      marketplace: '銉炪兗銈便儍銉堛儣銉偆銈广亱銈夈偆銉炽偣銉堛兗銉仌銈屻伨銇椼仧',
+      local: '銉兗銈儷銉椼儵銈般偆銉�',
+      debugging: '銉囥儛銉冦偘銉椼儵銈般偆銉�',
+      github: 'Github銇嬨倝銈ゃ兂銈广儓銉笺儷銇椼伨銇椼仧',
+    },
+    operation: {
+      info: '銉椼儵銈般偆銉虫儏鍫�',
+      install: '銈ゃ兂銈广儓銉笺儷',
+      viewDetail: '瑭崇窗銈掕銈�',
+      checkUpdate: '鏇存柊銈掔⒑瑾嶃仚銈�',
+      update: '鏇存柊',
+      detail: '瑭崇窗',
+      remove: '鍓婇櫎',
+    },
+    toolSelector: {
+      descriptionPlaceholder: '銉勩兗銉伄鐩殑銇啊鍗樸仾瑾槑銆佷緥銇堛伆銆佺壒瀹氥伄鍫存墍銇俯搴︺倰鍙栧緱銇欍倠銇撱仺銆�',
+      paramsTip2: '銆岃嚜鍕曘�嶃亴銈儠銇仺銇嶃�併儑銉曘偐銉儓鍊ゃ亴浣跨敤銇曘倢銇俱仚銆�',
+      settings: '銉︺兗銈躲兗瑷畾',
+      unsupportedContent2: '銉愩兗銈搞儳銉炽倰鍒囥倞鏇裤亪銈嬨伀銇偗銉儍銈仐銇︺亸銇犮仌銇勩��',
+      unsupportedContent: '銈ゃ兂銈广儓銉笺儷銇曘倢銇熴儣銉┿偘銈ゃ兂銇儛銉笺偢銉с兂銇�併亾銇偄銈偡銉с兂銈掓彁渚涖仐銇︺亜銇俱仜銈撱��',
+      title: '銉勩兗銉倰杩藉姞',
+      uninstalledContent: '銇撱伄銉椼儵銈般偆銉炽伅銉兗銈儷/GitHub銉儩銈搞儓銉亱銈夈偆銉炽偣銉堛兗銉仌銈屻伨銇欍�傘偆銉炽偣銉堛兗銉緦銇仈鍒╃敤銇忋仩銇曘亜銆�',
+      descriptionLabel: '銉勩兗銉伄瑾槑',
+      auto: '鑷嫊',
+      params: '鎺ㄨ珫瑷畾',
+      uninstalledLink: '銉椼儵銈般偆銉炽倰绠$悊銇欍倠',
+      placeholder: '銉勩兗銉倰閬告姙...',
+      uninstalledTitle: '銉勩兗銉亴銈ゃ兂銈广儓銉笺儷銇曘倢銇︺亜銇俱仜銈�',
+      empty: '銉勩兗銉倰杩藉姞銇欍倠銇伅銆�+銆嶃儨銈裤兂銈掋偗銉儍銈仐銇︺亸銇犮仌銇勩�傝鏁般伄銉勩兗銉倰杩藉姞銇с亶銇俱仚銆�',
+      paramsTip1: 'LLM鎺ㄨ珫銉戙儵銉°兗銈裤倰鍒跺尽銇椼伨銇欍��',
+      toolLabel: '閬撳叿',
+      unsupportedTitle: '銈点儩銉笺儓銇曘倢銇︺亜銇亜銈€偗銈枫儳銉�',
+    },
+    endpointDisableTip: '銈ㄣ兂銉夈儩銈ゃ兂銉堛倰鐒″姽銇仚銈�',
+    endpointModalDesc: '瑷畾銇屽畬浜嗐仚銈嬨仺銆丄PI銈ㄣ兂銉夈儩銈ゃ兂銉堛倰浠嬨仐銇︺儣銉┿偘銈ゃ兂銇屾彁渚涖仚銈嬫鑳姐倰浣跨敤銇с亶銇俱仚銆�',
+    endpointDisableContent: '{{name}}銈掔劇鍔广伀銇椼伨銇欍亱锛�',
+    endpointModalTitle: '銈ㄣ兂銉夈儩銈ゃ兂銉堛倰瑷畾銇欍倠',
+    endpointDeleteTip: '銈ㄣ兂銉夈儩銈ゃ兂銉堛倰鍓婇櫎',
+    modelNum: '{{num}} 銉€儑銉亴鍚伨銈屻仸銇勩伨銇�',
+    serviceOk: '銈点兗銉撱偣銇甯搞仹銇�',
+    disabled: '銈点兗銉撱偣銇劇鍔瑰寲銇曘倢銇︺亜銇俱仚',
+    endpoints: '銈ㄣ兂銉夈儩銈ゃ兂銉�',
+    endpointsTip: '銇撱伄銉椼儵銈般偆銉炽伅銈ㄣ兂銉夈儩銈ゃ兂銉堛倰浠嬨仐銇︾壒瀹氥伄姗熻兘銈掓彁渚涖仐銆佺従鍦ㄣ伄銉兗銈偣銉氥兗銈广伄銇熴倎銇鏁般伄銈ㄣ兂銉夈儩銈ゃ兂銉堛偦銉冦儓銈掓鎴愩仹銇嶃伨銇欍��',
+    configureModel: '銉€儑銉倰瑷畾銇欍倠',
+    configureTool: '銉勩兗銉倰瑷畾銇欍倠',
+    endpointsEmpty: '銈ㄣ兂銉夈儩銈ゃ兂銉堛倰杩藉姞銇欍倠銇伅銆乗'+\'銉溿偪銉炽倰銈儶銉冦偗銇椼仸銇忋仩銇曘亜',
+    strategyNum: '{{num}} {{strategy}} 銇屽惈銇俱倢銇︺亜銇俱仚',
+    configureApp: '銈€儣銉倰瑷畾銇欍倠',
+    endpointDeleteContent: '{{name}}銈掑墛闄ゃ仐銇俱仚銇嬶紵',
+    actionNum: '{{num}} {{action}} 銇屽惈銇俱倢銇︺亜銇俱仚',
+    endpointsDocLink: '銉夈偔銉ャ儭銉炽儓銈掕〃绀恒仚銈�',
+    switchVersion: '銉愩兗銈搞儳銉炽伄鍒囥倞鏇裤亪',
+  },
+  debugInfo: {
+    title: '銉囥儛銉冦偘',
+    viewDocs: '銉夈偔銉ャ儭銉炽儓銈掕銈�',
+  },
+  privilege: {
+    admins: '绠$悊鑰�',
+    noone: '瑾般倐銇勩仾銇�',
+    whoCanInstall: '瑾般亴銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷銇椼仸绠$悊銇с亶銇俱仚銇嬶紵',
+    whoCanDebug: '瑾般亴銉椼儵銈般偆銉炽伄銉囥儛銉冦偘銈掕銇嗐亾銇ㄣ亴銇с亶銇俱仚銇嬶紵',
+    everyone: '銇裤倱銇�',
+    title: '銉椼儵銈般偆銉炽伄瑷畾',
+  },
+  pluginInfoModal: {
+    packageName: '銉戙儍銈便兗銈�',
+    release: '銉儶銉笺偣',
+    title: '銉椼儵銈般偆銉虫儏鍫�',
+    repository: '銉儩銈搞儓銉�',
+  },
+  action: {
+    deleteContentRight: '銉椼儵銈般偆銉筹紵',
+    usedInApps: '銇撱伄銉椼儵銈般偆銉炽伅{{num}}銇偄銉椼儶銇т娇鐢ㄣ仌銈屻仸銇勩伨銇欍��',
+    delete: '銉椼儵銈般偆銉炽倰鍓婇櫎銇欍倠',
+    pluginInfo: '銉椼儵銈般偆銉虫儏鍫�',
+    deleteContentLeft: '鍓婇櫎銇椼伨銇欍亱',
+    checkForUpdates: '鏇存柊銈掔⒑瑾嶃仚銈�',
+  },
+  installModal: {
+    labels: {
+      version: '銉愩兗銈搞儳銉�',
+      package: '銉戙儍銈便兗銈�',
+      repository: '銉儩銈搞儓銉�',
+    },
+    cancel: '銈儯銉炽偦銉�',
+    installing: '銈ゃ兂銈广儓銉笺儷涓�...',
+    installedSuccessfully: '銈ゃ兂銈广儓銉笺儷銇垚鍔熴仐銇俱仐銇�',
+    installFailedDesc: '銉椼儵銈般偆銉炽伄銈ゃ兂銈广儓銉笺儷銇け鏁椼仐銇俱仐銇熴��',
+    fromTrustSource: '淇¢牸銇с亶銈嬨偨銉笺偣銇嬨倝銇伩銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷銇欍倠銈堛亞銇仐銇︺亸銇犮仌銇勩��',
+    installedSuccessfullyDesc: '銉椼儵銈般偆銉炽伅姝e父銇偆銉炽偣銉堛兗銉仌銈屻伨銇椼仧銆�',
+    installFailed: '銈ゃ兂銈广儓銉笺儷銇け鏁椼仐銇俱仐銇�',
+    readyToInstallPackage: '娆°伄銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷銇椼倛銇嗐仺銇椼仸銇勩伨銇�',
+    uploadFailed: '銈€儍銉椼儹銉笺儔銇け鏁椼仐銇俱仐銇�',
+    pluginLoadErrorDesc: '銇撱伄銉椼儵銈般偆銉炽伅銈ゃ兂銈广儓銉笺儷銇曘倢銇俱仜銈�',
+    installComplete: '銈ゃ兂銈广儓銉笺儷瀹屼簡',
+    next: '娆�',
+    readyToInstall: '娆°伄銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷銇椼倛銇嗐仺銇椼仸銇勩伨銇�',
+    pluginLoadError: '銉椼儵銈般偆銉炽伄瑾伩杈笺伩銈ㄣ儵銉�',
+    readyToInstallPackages: '娆°伄{{num}}銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷銇椼倛銇嗐仺銇椼仸銇勩伨銇�',
+    close: '闁夈仒銈�',
+    install: '銈ゃ兂銈广儓銉笺儷',
+    dropPluginToInstall: '銉椼儵銈般偆銉炽儜銉冦偙銉笺偢銈掋亾銇撱伀銉夈儹銉冦儣銇椼仸銈ゃ兂銈广儓銉笺儷銇椼伨銇�',
+    installPlugin: '銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷銇欍倠',
+    back: '鎴汇倠',
+    uploadingPackage: '{{packageName}}銈掋偄銉冦儣銉兗銉変腑...',
+  },
+  installFromGitHub: {
+    installedSuccessfully: '銈ゃ兂銈广儓銉笺儷銇垚鍔熴仐銇俱仐銇�',
+    installNote: '淇¢牸銇с亶銈嬨偨銉笺偣銇嬨倝銇伩銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷銇欍倠銈堛亞銇仐銇︺亸銇犮仌銇勩��',
+    updatePlugin: 'GitHub銇嬨倝銉椼儵銈般偆銉炽倰鏇存柊銇欍倠',
+    selectPackage: '銉戙儍銈便兗銈搞倰閬告姙',
+    installFailed: '銈ゃ兂銈广儓銉笺儷銇け鏁椼仐銇俱仐銇�',
+    selectPackagePlaceholder: '銉戙儍銈便兗銈搞倰閬告姙銇椼仸銇忋仩銇曘亜',
+    gitHubRepo: 'GitHub銉儩銈搞儓銉�',
+    selectVersionPlaceholder: '銉愩兗銈搞儳銉炽倰閬告姙銇椼仸銇忋仩銇曘亜',
+    uploadFailed: '銈€儍銉椼儹銉笺儔銇け鏁椼仐銇俱仐銇�',
+    selectVersion: '銉愩兗銈搞儳銉炽倰閬告姙',
+    installPlugin: 'GitHub銇嬨倝銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷銇欍倠',
+  },
+  upgrade: {
+    title: '銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷銇欍倠',
+    close: '闁夈仒銈�',
+    upgrading: '銈ゃ兂銈广儓銉笺儷涓�...',
+    description: '娆°伄銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷銇椼倛銇嗐仺銇椼仸銇勩伨銇�',
+    successfulTitle: '銈ゃ兂銈广儓銉笺儷銇垚鍔熴仐銇俱仐銇�',
+    usedInApps: '{{num}}銇偄銉椼儶銇т娇鐢ㄣ仌銈屻仸銇勩伨銇�',
+    upgrade: '銈ゃ兂銈广儓銉笺儷',
+  },
+  error: {
+    fetchReleasesError: '銉儶銉笺偣銈掑彇寰椼仹銇嶃伨銇涖倱銆傚緦銇с倐銇嗕竴搴︺亰瑭︺仐銇忋仩銇曘亜銆�',
+    inValidGitHubUrl: '鐒″姽銇狦itHub URL銇с仚銆傛湁鍔广仾URL銈掓銇舰寮忋仹鍏ュ姏銇椼仸銇忋仩銇曘亜: https://github.com/owner/repo',
+    noReleasesFound: '銉儶銉笺偣銇銇ゃ亱銈娿伨銇涖倱銆侴itHub銉儩銈搞儓銉伨銇熴伅鍏ュ姏URL銈掔⒑瑾嶃仐銇︺亸銇犮仌銇勩��',
+  },
+  marketplace: {
+    empower: 'AI闁嬬櫤銈掋偟銉濄兗銉堛仚銈�',
+    discover: '鎺㈢储',
+    and: '銇�',
+    difyMarketplace: 'Dify銉炪兗銈便儍銉堛儣銉偆銈�',
+    moreFrom: '銉炪兗銈便儍銉堛儣銉偆銈广亱銈夈伄銇曘倝銇倠鎯呭牨',
+    noPluginFound: '銉椼儵銈般偆銉炽亴瑕嬨仱銇嬨倞銇俱仜銈�',
+    pluginsResult: '{{num}} 浠躲伄绲愭灉',
+    sortBy: '涓︺伖鏇裤亪',
+    sortOption: {
+      mostPopular: '浜烘皸闋�',
+      recentlyUpdated: '鏈�杩戞洿鏂伴爢',
+      newlyReleased: '鏂扮潃闋�',
+      firstReleased: '銉儶銉笺偣闋�',
+    },
+    viewMore: '銈傘仯銇ㄨ銈�',
+    verifiedTip: '銇撱伄銉椼儵銈般偆銉炽伅Dify銇倛銇c仸瑾嶈銇曘倢銇︺亜銇俱仚',
+    partnerTip: '銇撱伄銉椼儵銈般偆銉炽伅Dify銇儜銉笺儓銉娿兗銇倛銇c仸瑾嶈銇曘倢銇︺亜銇俱仚',
+  },
+  task: {
+    installError: '{{errorLength}} 銉椼儵銈般偆銉炽伄銈ゃ兂銈广儓銉笺儷銇け鏁椼仐銇俱仐銇熴�傝〃绀恒仚銈嬨伀銇偗銉儍銈仐銇︺亸銇犮仌銇勩��',
+    installingWithSuccess: '{{installingLength}}鍊嬨伄銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷涓�亄{successLength}}鍊嬫垚鍔熴仐銇俱仐銇熴��',
+    clearAll: '銇欍伖銇︺偗銉偄',
+    installedError: '{{errorLength}} 銉椼儵銈般偆銉炽伄銈ゃ兂銈广儓銉笺儷銇け鏁椼仐銇俱仐銇�',
+    installingWithError: '{{installingLength}}鍊嬨伄銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷涓�亄{successLength}}浠舵垚鍔熴�亄{errorLength}}浠跺け鏁�',
+    installing: '{{installingLength}}鍊嬨伄銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷涓��0鍊嬪畬浜嗐��',
+  },
+  from: '銈ゃ兂銈广儓銉笺儷鍏�',
+  install: '{{num}} 銈ゃ兂銈广儓銉笺儷',
+  installAction: '銈ゃ兂銈广儓銉笺儷',
+  installFrom: '銈ゃ兂銈广儓銉笺儷鍏�',
+  searchPlugins: '妞滅储銉椼儵銈般偆銉�',
+  search: '妞滅储',
+  endpointsEnabled: '{{num}} 銈汇儍銉堛伄銈ㄣ兂銉夈儩銈ゃ兂銉堛亴鏈夊姽銇仾銈娿伨銇椼仧',
+  findMoreInMarketplace: '銉炪兗銈便儍銉堛儣銉偆銈广仹銇曘倝銇銇ゃ亼銇︺亸銇犮仌銇�',
+  fromMarketplace: '銉炪兗銈便儍銉堛儣銉偆銈广亱銈�',
+  searchCategories: '妞滅储銈儐銈淬儶',
+  allCategories: '銇欍伖銇︺伄銈儐銈淬儶',
+  searchTools: '妞滅储銉勩兗銉�...',
+  installPlugin: '銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷銇欍倠',
+  searchInMarketplace: '銉炪兗銈便儍銉堛儣銉偆銈广仹妞滅储',
+  submitPlugin: '銉椼儵銈般偆銉炽倰鎻愬嚭銇欍倠',
+  difyVersionNotCompatible: '鐝惧湪銇瓺ify銉愩兗銈搞儳銉炽伅銇撱伄銉椼儵銈般偆銉炽仺浜掓彌鎬с亴銇傘倞銇俱仜銈撱�傛渶灏忋儛銉笺偢銉с兂銇瘂{minimalDifyVersion}}銇с仚銆�',
+  metadata: {
+    title: '銉椼儵銈般偆銉�',
+  },
+}
+
+export default translation
diff --git a/i18n/ja-JP/register.ts b/i18n/ja-JP/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/ja-JP/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/ja-JP/run-log.ts b/i18n/ja-JP/run-log.ts
new file mode 100644
index 0000000..758e37c
--- /dev/null
+++ b/i18n/ja-JP/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: '鍏ュ姏',
+  result: '绲愭灉',
+  detail: '瑭崇窗鎯呭牨',
+  tracing: '瀹熻杩借贰',
+  resultPanel: {
+    status: '銈广儐銉笺偪銈�',
+    time: '鍑︾悊鏅傞枔',
+    tokens: '銉堛兗銈兂绶忔暟',
+  },
+  meta: {
+    title: '銉°偪銉囥兗銈�',
+    status: '鐘舵厠',
+    version: '銉愩兗銈搞儳銉�',
+    executor: '瀹熻鑰�',
+    startTime: '闁嬪鏅傚埢',
+    time: '绶忓嚘鐞嗘檪闁�',
+    tokens: '銉堛兗銈兂绶忔暟',
+    steps: '鍑︾悊銈广儐銉冦儣鏁�',
+  },
+  resultEmpty: {
+    title: '浠婂洖銇疅琛屻仹銇疛SON褰㈠紡銇伩銇屽嚭鍔涖仌銈屻伨銇椼仧',
+    tipLeft: '瑭崇窗銈掔⒑瑾嶃仚銈嬨伀銇�',
+    link: '瑭崇窗鎯呭牨銉戙儘銉�',
+    tipRight: '銇哥Щ鍕曘仐銇︺亸銇犮仌銇�',
+  },
+  actionLogs: '鎿嶄綔銉偘',
+  circularInvocationTip: '鐝惧湪銇儻銉笺偗銉曘儹銉笺伀銉勩兗銉�/銉庛兗銉夈伄寰挵鍛笺伋鍑恒仐銇屾鍑恒仌銈屻伨銇椼仧',
+}
+
+export default translation
diff --git a/i18n/ja-JP/share-app.ts b/i18n/ja-JP/share-app.ts
new file mode 100644
index 0000000..9db8926
--- /dev/null
+++ b/i18n/ja-JP/share-app.ts
@@ -0,0 +1,78 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: '銈€儣銉偙銉笺偡銉с兂銇埄鐢ㄣ仹銇嶃伨銇涖倱',
+    appUnknownError: '銈€儣銉偙銉笺偡銉с兂銇埄鐢ㄣ仹銇嶃伨銇涖倱',
+  },
+  chat: {
+    newChat: '鏂拌銉併儯銉冦儓',
+    newChatTip: '鏂拌銉併儯銉冦儓銇岄枊濮嬨仌銈屻仸銇勩伨銇�',
+    chatSettingsTitle: '銉併儯銉冦儓瑷畾',
+    chatFormTip: '銉併儯銉冦儓闁嬪寰屻伅瑷畾銈掑鏇淬仹銇嶃伨銇涖倱',
+    pinnedTitle: '銉斻兂鐣欍倎娓堛伩',
+    unpinnedTitle: '銉併儯銉冦儓銉偣銉�',
+    newChatDefaultName: '鏂拌銉併儯銉冦儓',
+    resetChat: '銉併儯銉冦儓銈掋儶銈汇儍銉�',
+    viewChatSettings: '瑷畾銈掔⒑瑾�',
+    poweredBy: 'Powered by',
+    prompt: '銉椼儹銉炽儣銉�',
+    privatePromptConfigTitle: '鍊嬪垾瑷畾',
+    publicPromptConfigTitle: '鍏遍�氥儣銉兂銉椼儓瑷畾',
+    configStatusDes: '闁嬪鍓嶃伀瑷畾銈掑鏇淬仹銇嶃伨銇�',
+    configDisabled: '鍓嶅洖銇ō瀹氥倰閬╃敤涓仹銇�',
+    startChat: '銉併儯銉冦儓銈掗枊濮�',
+    privacyPolicyLeft: '鏈偄銉椼儶銇�',
+    privacyPolicyMiddle: '銉椼儵銈ゃ儛銈枫兗銉濄儶銈枫兗',
+    privacyPolicyRight: '銇悓鎰忋伄涓娿仈鍒╃敤銇忋仩銇曘亜',
+    deleteConversation: {
+      title: '銉併儯銉冦儓銇墛闄�',
+      content: '銇撱伄銉併儯銉冦儓銈掑墛闄ゃ仐銇俱仚銇嬶紵',
+    },
+    tryToSolve: '鍟忛銈掕В姹恒仚銈�',
+    temporarySystemIssue: '銈枫偣銉嗐儬銇竴鏅傜殑銇晱椤屻亴鐧虹敓銇椼仸銇勩伨銇�',
+    expand: '鎷″ぇ',
+    collapse: '绺皬',
+  },
+  generation: {
+    tabs: {
+      create: '1鍥炲疅琛�',
+      batch: '涓�鎷疅琛�',
+      saved: '淇濆瓨娓堛伩',
+    },
+    savedNoData: {
+      title: '淇濆瓨娓堛伩銉囥兗銈裤亴銇傘倞銇俱仜銈�',
+      description: '銈炽兂銉嗐兂銉勭敓鎴愬緦銇祼鏋溿亴銇撱亾銇〃绀恒仌銈屻伨銇�',
+      startCreateContent: '鐢熸垚銈掗枊濮�',
+    },
+    title: 'AI鏂囩珷浣滄垚',
+    queryTitle: '鍏ュ姏鍐呭',
+    completionResult: '鐢熸垚绲愭灉',
+    queryPlaceholder: '鍏ュ姏銇椼仸銇忋仩銇曘亜',
+    run: '瀹熻',
+    execution: '鍑︾悊涓�',
+    executions: '{{num}}鍥炲疅琛�',
+    copy: '銈炽償銉�',
+    resultTitle: 'AI鐢熸垚绲愭灉',
+    noData: 'AI銇屻偝銉炽儐銉炽儎銈掔敓鎴愩仐銇俱仚',
+    csvUploadTitle: 'CSV銉曘偂銈ゃ儷銈掋儔銉儍銉椼仚銈嬨亱',
+    browse: '銉曘偂銈ゃ儷銈掗伕鎶�',
+    csvStructureTitle: 'CSV褰㈠紡瑕佷欢:',
+    downloadTemplate: '銉嗐兂銉椼儸銉笺儓銈掑彇寰�',
+    field: '',
+    batchFailed: {
+      info: '{{num}}浠躲伄澶辨晽',
+      retry: '鍐嶅疅琛�',
+      outputPlaceholder: '鍑哄姏銇仐',
+    },
+    errorMsg: {
+      empty: '銉曘偂銈ゃ儷鍐呭銇岀┖銇с仚',
+      fileStructNotMatch: '銉曘偂銈ゃ儷褰㈠紡銇屼笉姝c仹銇�',
+      emptyLine: '{{rowIndex}}琛岀洰: 鍐呭銇岀┖銇с仚',
+      invalidLine: '{{rowIndex}}琛岀洰: {{varName}}銇叆鍔涖亴蹇呰銇с仚',
+      moreThanMaxLengthLine: '{{rowIndex}}琛岀洰: {{varName}}銇屽埗闄愰暦锛坽{maxLength}}锛夈倰瓒呴亷',
+      atLeastOne: '1琛屼互涓娿伄銉囥兗銈裤亴蹇呰銇с仚',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/ja-JP/time.ts b/i18n/ja-JP/time.ts
new file mode 100644
index 0000000..36d4c69
--- /dev/null
+++ b/i18n/ja-JP/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Tue: '鐏洔鏃�',
+    Sat: '鍦熸洔鏃�',
+    Mon: '銉€兂',
+    Thu: '鏈ㄦ洔鏃�',
+    Fri: '鑷敱',
+    Wed: '姘存洔鏃�',
+    Sun: '澶櫧',
+  },
+  months: {
+    November: '11鏈�',
+    December: '12鏈�',
+    March: '3鏈�',
+    September: '9鏈�',
+    July: '7鏈�',
+    April: '鍥涙湀',
+    February: '2鏈�',
+    June: '6鏈�',
+    January: '1鏈�',
+    May: '5鏈�',
+    August: '鍏湀',
+    October: '鍗佹湀',
+  },
+  operation: {
+    now: '浠�',
+    cancel: '銈儯銉炽偦銉�',
+    ok: '銇亜',
+    pickDate: '鏃ヤ粯銈掗伕鎶�',
+  },
+  title: {
+    pickTime: '銉斻儍銈偪銈ゃ儬',
+  },
+  defaultPlaceholder: '鏅傞枔銈掗伕銈撱仹銇忋仩銇曘亜...',
+}
+
+export default translation
diff --git a/i18n/ja-JP/tools.ts b/i18n/ja-JP/tools.ts
new file mode 100644
index 0000000..f234625
--- /dev/null
+++ b/i18n/ja-JP/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: '銉勩兗銉�',
+  createCustomTool: '銈偣銈裤儬銉勩兗銉倰浣滄垚銇欍倠',
+  customToolTip: 'Dify銈偣銈裤儬銉勩兗銉伄瑭崇窗',
+  type: {
+    all: '銇欍伖銇�',
+    builtIn: '銉勩兗銉�',
+    custom: '銈偣銈裤儬',
+    workflow: '銉兗銈儠銉兗',
+  },
+  contribute: {
+    line1: '绉併伅',
+    line2: 'Dify銇搞伄銉勩兗銉伄璨㈢尞銇垐鍛炽亴銇傘倞銇俱仚銆�',
+    viewGuide: '銈偆銉夈倰瑕嬨倠',
+  },
+  author: '钁楄�咃細',
+  auth: {
+    unauthorized: '瑾嶈銇欍倠',
+    authorized: '瑾嶈娓堛伩',
+    setup: '浣跨敤銇欍倠銇熴倎銇獚瑷笺倰瑷畾銇欍倠',
+    setupModalTitle: '瑾嶈銇ō瀹�',
+    setupModalTitleDescription: '璩囨牸鎯呭牨銈掓鎴愩仐銇熷緦銆併儻銉笺偗銈广儦銉笺偣鍐呫伄銇欍伖銇︺伄銉°兂銉愩兗銇屻偄銉椼儶銈便兗銈枫儳銉炽伄銈兗銈便偣銉堛儸銉笺偡銉с兂鏅傘伀銇撱伄銉勩兗銉倰浣跨敤銇с亶銇俱仚銆�',
+  },
+  includeToolNum: '{{num}}鍊嬨伄銉勩兗銉亴鍚伨銈屻仸銇勩伨銇�',
+  addTool: '銉勩兗銉倰杩藉姞銇欍倠',
+  addToolModal: {
+    type: '銈裤偆銉�',
+    category: '銈儐銈淬儶銉�',
+    add: '杩藉姞',
+    added: '杩藉姞娓�',
+    manageInTools: '銉勩兗銉儶銈广儓銇Щ鍕曘仐銇︾鐞嗐仚銈�',
+    emptyTitle: '鍒╃敤鍙兘銇儻銉笺偗銉曘儹銉笺儎銉笺儷銇亗銈娿伨銇涖倱',
+    emptyTip: '杩藉姞銇欍倠銇伅銆併�屻儻銉笺偗銉曘儹銉� -> 銉勩兗銉仺銇椼仸鍏枊 銆嶃伀绉诲嫊銇欍倠',
+    emptyTitleCustom: '銈偣銈裤儬銉勩兗銉伅銇傘倞銇俱仜銈�',
+    emptyTipCustom: '銈偣銈裤儬銉勩兗銉伄浣滄垚',
+  },
+  createTool: {
+    title: '銈偣銈裤儬銉勩兗銉倰浣滄垚銇欍倠',
+    editAction: '瑷畾',
+    editTitle: '銈偣銈裤儬銉勩兗銉倰绶ㄩ泦銇欍倠',
+    name: '鍚嶅墠',
+    toolNamePlaceHolder: '銉勩兗銉悕銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    nameForToolCall: '銉勩兗銉偝銉笺儷銇悕鍓�',
+    nameForToolCallPlaceHolder: '姗熸瑾嶈瓨銇娇鐢ㄣ仌銈屻倠鍚嶅墠, 渚嬨亪銇般�乬etCurrentWeather銆乴ist_pets',
+    nameForToolCallTip: '鏁板瓧銆佹枃瀛椼�併偄銉炽儉銉笺偣銈炽偄銇伩銇屻偟銉濄兗銉堛仌銈屻伨銇欍��',
+    description: '銉勩兗銉伄瑾槑',
+    descriptionPlaceholder: '銉勩兗銉伄浣裤亜鏂广伄绨″崢銇鏄庛�備緥銇堛伆銆佺壒瀹氥伄鍫存墍銇俯搴︺倰鐭ャ倠銇熴倎銇仼銆�',
+    schema: '銈广偔銉笺優',
+    schemaPlaceHolder: '銇撱亾銇玂penAPI銈广偔銉笺優銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    viewSchemaSpec: 'OpenAPI-Swagger浠曟銈掕〃绀恒仚銈�',
+    importFromUrl: 'URL銇嬨倝銈ゃ兂銉濄兗銉堛仚銈�',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: '鏈夊姽銇猆RL銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    examples: '渚�',
+    exampleOptions: {
+      json: '澶╂皸(JSON)',
+      yaml: '銉氥儍銉堛偣銉堛偄(YAML)',
+      blankTemplate: '绌虹櫧銉嗐兂銉椼儸銉笺儓',
+    },
+    availableTools: {
+      title: '鍒╃敤鍙兘銇儎銉笺儷',
+      name: '鍚嶅墠',
+      description: '瑾槑',
+      method: '銉°偨銉冦儔',
+      path: '銉戙偣',
+      action: '銈€偗銈枫儳銉�',
+      test: '銉嗐偣銉�',
+    },
+    authMethod: {
+      title: '瑾嶈鏂规硶',
+      type: '瑾嶈銈裤偆銉�',
+      keyTooltip: 'HTTP銉樸儍銉�銉笺偔銉笺�傘偄銈ゃ儑銈€亴銇亜鍫村悎銇� "Authorization" 銇ㄣ仐銇︽畫銇椼仸銇娿亜銇︺倐銇嬨伨銇勩伨銇涖倱銆傘伨銇熴伅銈偣銈裤儬鍊ゃ伀瑷畾銇с亶銇俱仚銆�',
+      types: {
+        none: '銇仐',
+        api_key: 'API銈兗',
+        apiKeyPlaceholder: 'API銈兗銇瓾TTP銉樸儍銉�銉煎悕',
+        apiValuePlaceholder: 'API銈兗銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+      },
+      key: '銈兗',
+      value: '鍊�',
+    },
+    authHeaderPrefix: {
+      title: '瑾嶈銈裤偆銉�',
+      types: {
+        basic: '銉欍兗銈枫儍銈�',
+        bearer: '銉欍偄銉┿兗',
+        custom: '銈偣銈裤儬',
+      },
+    },
+    privacyPolicy: '銉椼儵銈ゃ儛銈枫兗銉濄儶銈枫兗',
+    privacyPolicyPlaceholder: '銉椼儵銈ゃ儛銈枫兗銉濄儶銈枫兗銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    toolInput: {
+      title: '銉勩兗銉叆鍔�',
+      name: '鍚嶅墠',
+      required: '蹇呴爤',
+      method: '銉°偨銉冦儔',
+      methodSetting: '瑷畾',
+      methodSettingTip: '銉︺兗銈躲兗銇屻儎銉笺儷瑷畾銈掑叆鍔涖仚銈�',
+      methodParameter: 'LLM鍏ュ姏',
+      methodParameterTip: 'LLM 銇帹璜栦腑銇叆鍔涖仌銈屻伨銇�',
+      label: '銉┿儥銉�',
+      labelPlaceholder: '銉┿儥銉倰閬告姙銇椼伨銇�(銈儣銈枫儳銉�)',
+      description: '瑾槑',
+      descriptionPlaceholder: '銉戙儵銉°兗銈裤伄鎰忓懗銇鏄�',
+    },
+    customDisclaimer: '銈偣銈裤儬鍏嶈铂浜嬮爡',
+    customDisclaimerPlaceholder: '銈偣銈裤儬鍏嶈铂浜嬮爡銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    confirmTitle: '淇濆瓨銇椼伨銇欍亱锛�',
+    confirmTip: '銇撱伄銉勩兗銉倰浣跨敤銇椼仸銇勩倠銈€儣銉伅褰遍熆銈掑彈銇戙伨銇�',
+    deleteToolConfirmTitle: '銇撱伄銉勩兗銉倰鍓婇櫎銇椼伨銇欍亱锛�',
+    deleteToolConfirmContent: '銉勩兗銉伄鍓婇櫎銇彇銈婃秷銇椼仹銇嶃伨銇涖倱銆傘儲銉笺偠銉笺伅銈傘亞銇傘仾銇熸銇儎銉笺儷銇偄銈偦銈广仹銇嶃伨銇涖倱銆�',
+  },
+  test: {
+    title: '銉嗐偣銉�',
+    parametersValue: '銉戙儵銉°兗銈裤兗锛嗗��',
+    parameters: '銉戙儵銉°兗銈裤兗',
+    value: '鍊�',
+    testResult: '銉嗐偣銉堢祼鏋�',
+    testResultPlaceholder: '銇撱亾銇儐銈广儓绲愭灉銇岃〃绀恒仌銈屻伨銇�',
+  },
+  thought: {
+    using: '浣跨敤涓�',
+    used: '浣跨敤娓堛伩',
+    requestTitle: '銉偗銈ㄣ偣銉堝厛',
+    responseTitle: '銉偣銉濄兂銈瑰厛',
+  },
+  setBuiltInTools: {
+    info: '鎯呭牨',
+    setting: '瑷畾',
+    toolDescription: '銉勩兗銉伄瑾槑',
+    parameters: '銉戙儵銉°兗銈裤兗',
+    string: '鏂囧瓧鍒�',
+    number: '鏁�',
+    required: '蹇呴爤',
+    infoAndSetting: '鎯呭牨銇ㄨō瀹�',
+    file: '銉曘偂銈ゃ儷',
+  },
+  noCustomTool: {
+    title: '銈偣銈裤儬銉勩兗銉亴銇傘倞銇俱仜銈擄紒',
+    content: 'AI銈€儣銉倰妲嬬瘔銇欍倠銇熴倎銇偒銈广偪銉犮儎銉笺儷銈掋亾銇撱仹杩藉姞銇娿倛銇崇鐞嗐仐銇俱仚銆�',
+    createTool: '銉勩兗銉倰浣滄垚銇欍倠',
+  },
+  noSearchRes: {
+    title: '鐢炽仐瑷炽亗銈娿伨銇涖倱銆佺祼鏋溿亴銇傘倞銇俱仜銈擄紒',
+    content: '妞滅储銇竴鑷淬仚銈嬨儎銉笺儷銇岃銇ゃ亱銈娿伨銇涖倱銇с仐銇熴��',
+    reset: '妞滅储銈掋儶銈汇儍銉�',
+  },
+  builtInPromptTitle: '銉椼儹銉炽儣銉�',
+  toolRemoved: '銉勩兗銉亴鍓婇櫎銇曘倢銇俱仐銇�',
+  notAuthorized: '銉勩兗銉亴瑾嶅彲銇曘倢銇︺亜銇俱仜銈�',
+  howToGet: '鍙栧緱鏂规硶',
+  openInStudio: '銈广偪銈搞偑銇ч枊銇�',
+  toolNameUsageTip: '銉勩兗銉懠銇冲嚭銇楀悕銆併偍銉笺偢銈с兂銉堛伄鎺ㄨ珫銇ㄣ儣銉兂銉椼儓銇崢瑾炪伀浣跨敤銇曘倢銇俱仚',
+  copyToolName: '鍚嶅墠銈掋偝銉斻兗',
+  noTools: '銉勩兗銉亴瑕嬨仱銇嬨倞銇俱仜銈撱仹銇椼仧',
+}
+
+export default translation
diff --git a/i18n/ja-JP/workflow.ts b/i18n/ja-JP/workflow.ts
new file mode 100644
index 0000000..066a558
--- /dev/null
+++ b/i18n/ja-JP/workflow.ts
@@ -0,0 +1,920 @@
+const translation = {
+  common: {
+    undo: '鍏冦伀鎴汇仚',
+    redo: '銈勩倞鐩淬仐',
+    editing: '绶ㄩ泦涓�',
+    autoSaved: '鑷嫊淇濆瓨娓堛伩',
+    unpublished: '鏈叕闁�',
+    published: '鍏枊娓堛伩',
+    publish: '鍏枊銇欍倠',
+    update: '鏇存柊',
+    publishUpdate: '鏇存柊銈掑叕闁�',
+    run: '瀹熻',
+    running: '瀹熻涓�',
+    inRunMode: '瀹熻銉€兗銉変腑',
+    inPreview: '銉椼儸銉撱儱銉间腑',
+    inPreviewMode: '銉椼儸銉撱儱銉笺儮銉笺儔涓�',
+    preview: '銉椼儸銉撱儱銉�',
+    viewRunHistory: '瀹熻灞ユ銈掕〃绀�',
+    runHistory: '瀹熻灞ユ',
+    goBackToEdit: '绶ㄩ泦銇埢銈�',
+    conversationLog: '浼氳┍銉偘',
+    features: '姗熻兘',
+    featuresDescription: 'Web銈€儣銉伄鎿嶄綔鎬с倰鍚戜笂銇曘仜銈嬫鑳�',
+    ImageUploadLegacyTip: '闁嬪銉曘偐銉笺儬銇с儠銈°偆銉瀷澶夋暟銇屼綔鎴愬彲鑳姐伀銇倞銇俱仐銇熴�傜敾鍍忋偄銉冦儣銉兗銉夋鑳姐伅浠婂緦銈点儩銉笺儓绲備簡銇ㄣ仾銈娿伨銇欍��',
+    fileUploadTip: '鐢诲儚銈€儍銉椼儹銉笺儔姗熻兘銇屻儠銈°偆銉偄銉冦儣銉兗銉夈伀鎷″嫉銇曘倢銇俱仐銇�',
+    featuresDocLink: '瑭崇窗銈掕銈�',
+    debugAndPreview: '銉椼儸銉撱儱銉�',
+    restart: '鍐嶈捣鍕�',
+    currentDraft: '鐝惧湪銇笅鏇搞亶',
+    currentDraftUnpublished: '鐝惧湪銇笅鏇搞亶锛堟湭鍏枊锛�',
+    latestPublished: '鏈�鏂板叕闁嬬増',
+    publishedAt: '鍏枊鏃ユ檪',
+    restore: '寰╁厓',
+    versionHistory: '銉愩兗銈搞儳銉冲饱姝�',
+    exitVersions: '銉愩兗銈搞儳銉冲饱姝淬倰闁夈仒銈�',
+    runApp: '銈€儣銉倰瀹熻',
+    batchRunApp: '銈€儣銉倰涓�鎷疅琛�',
+    openInExplore: '鎺㈢储銉氥兗銈搞仹闁嬨亸',
+    accessAPIReference: 'API銉儠銈°儸銉炽偣',
+    embedIntoSite: '銈点偆銉堛伀鍩嬨倎杈笺個',
+    addTitle: '銈裤偆銉堛儷銈掕拷鍔�...',
+    addDescription: '瑾槑銈掕拷鍔�...',
+    noVar: '澶夋暟銇屻亗銈娿伨銇涖倱',
+    searchVar: '澶夋暟銈掓绱�',
+    variableNamePlaceholder: '澶夋暟鍚嶃倰鍏ュ姏',
+    setVarValuePlaceholder: '澶夋暟鍊ゃ倰瑷畾',
+    needConnectTip: '鎺ョ稓銇曘倢銇︺亜銇亜銈广儐銉冦儣銇屻亗銈娿伨銇�',
+    maxTreeDepth: '1銉栥儵銉炽儊銇傘仧銈娿伄鏈�澶с儙銉笺儔鏁帮細{{depth}}',
+    needEndNode: '绲備簡銉栥儹銉冦偗銈掕拷鍔犮仚銈嬪繀瑕併亴銇傘倞銇俱仚',
+    needAnswerNode: '鍥炵瓟銉栥儹銉冦偗銈掕拷鍔犮仚銈嬪繀瑕併亴銇傘倞銇俱仚',
+    workflowProcess: '銉兗銈儠銉兗鍑︾悊',
+    notRunning: '銇俱仩瀹熻銇曘倢銇︺亜銇俱仜銈�',
+    previewPlaceholder: '鍏ュ姏娆勩伀銉嗐偔銈广儓銈掑叆鍔涖仐銇︺儊銉c儍銉堛儨銉冦儓銇儑銉愩儍銈般倰闁嬪',
+    effectVarConfirm: {
+      title: '澶夋暟銇墛闄�',
+      content: '浠栥伄銉庛兗銉夈仹澶夋暟銇屼娇鐢ㄣ仌銈屻仸銇勩伨銇欍�傘仢銈屻仹銈傚墛闄ゃ仐銇俱仚銇嬶紵',
+    },
+    insertVarTip: '"/"銈兗銇у鏁般倰鎸垮叆',
+    processData: '銉囥兗銈垮嚘鐞�',
+    input: '鍏ュ姏',
+    output: '鍑哄姏',
+    jinjaEditorPlaceholder: '銆�/銆嶃伨銇熴伅 銆寋銆嶃仹澶夋暟鎸垮叆',
+    viewOnly: '闁茶Η銇伩',
+    showRunHistory: '瀹熻灞ユ銈掕〃绀�',
+    enableJinja: 'Jinja銉嗐兂銉椼儸銉笺儓銈掓湁鍔瑰寲',
+    learnMore: '瑭崇窗銈掕銈�',
+    copy: '銈炽償銉�',
+    duplicate: '瑜囪=',
+    addBlock: '銉栥儹銉冦偗銈掕拷鍔�',
+    pasteHere: '銇撱亾銇布銈婁粯銇�',
+    pointerMode: '銉濄偆銉炽偪銉笺儮銉笺儔',
+    handMode: '銉忋兂銉夈儮銉笺儔',
+    exportImage: '鐢诲儚銈掑嚭鍔�',
+    exportPNG: 'PNG銇у嚭鍔�',
+    exportJPEG: 'JPEG銇у嚭鍔�',
+    exportSVG: 'SVG銇у嚭鍔�',
+    model: '銉€儑銉�',
+    workflowAsTool: '銉兗銈儠銉兗銈掋儎銉笺儷銇ㄣ仐銇﹀叕闁嬨仚銈�',
+    configureRequired: '瑷畾銇屽繀瑕�',
+    configure: '瑷畾',
+    manageInTools: '銉勩兗銉儦銉笺偢銇х鐞�',
+    workflowAsToolTip: '銉兗銈儠銉兗鏇存柊寰屻伅銉勩兗銉伄鍐嶈ō瀹氥亴蹇呰銇с仚',
+    viewDetailInTracingPanel: '瑭崇窗銈掕〃绀�',
+    syncingData: '銉囥兗銈垮悓鏈熶腑銆傘�傘��',
+    importDSL: 'DSL銈掋偆銉炽儩銉笺儓',
+    importDSLTip: '鐝惧湪銇笅鏇搞亶銇笂鏇搞亶銇曘倢銇俱仚銆傘偆銉炽儩銉笺儓鍓嶃伀銉兗銈儠銉兗銈掋偍銈偣銉濄兗銉堛仐銇︺儛銉冦偗銈€儍銉椼仐銇︺亸銇犮仌銇�',
+    backupCurrentDraft: '鐝惧湪銇笅鏇搞亶銈掋儛銉冦偗銈€儍銉�',
+    chooseDSL: 'DSL(yml)銉曘偂銈ゃ儷銈掗伕鎶�',
+    overwriteAndImport: '涓婃浉銇嶃仐銇︺偆銉炽儩銉笺儓',
+    importFailure: '銈ゃ兂銉濄兗銉堝け鏁�',
+    importWarning: '娉ㄦ剰浜嬮爡',
+    importWarningDetails: 'DSL銉愩兗銈搞儳銉炽伄閬曘亜銇倛銈婃鑳姐伀褰遍熆銇屽嚭銈嬪彲鑳芥�с亴銇傘倞銇俱仚',
+    importSuccess: '銈ゃ兂銉濄兗銉堟垚鍔�',
+    parallelRun: '涓﹀垪瀹熻',
+    parallelTip: {
+      click: {
+        title: '銈儶銉冦偗',
+        desc: '銇ц拷鍔�',
+      },
+      drag: {
+        title: '銉夈儵銉冦偘',
+        desc: '銇ф帴缍�',
+      },
+      limit: '涓﹀垪鍑︾悊鍙兘銉栥儵銉炽儊鏁帮細{{num}}',
+      depthLimit: '涓﹀垪銉嶃偣銉堟渶澶ч殠灞ゆ暟锛歿{num}}',
+    },
+    disconnect: '鎺ョ稓瑙i櫎',
+    jumpToNode: '銇撱伄銉庛兗銉夈伀绉诲嫊',
+    addParallelNode: '涓﹀垪銉庛兗銉夈倰杩藉姞',
+    parallel: '涓﹀垪',
+    branch: '銉栥儵銉炽儊',
+    onFailure: '澶辨晽鏅�',
+    addFailureBranch: '澶辨晽銉栥儵銉炽儊銈掕拷鍔�',
+    loadMore: '銇曘倝銇銇胯炯銈�',
+    noHistory: '灞ユ銇屻亗銈娿伨銇涖倱',
+  },
+  env: {
+    envPanelTitle: '鐠板澶夋暟',
+    envDescription: '鐠板澶夋暟銇�佸�嬩汉鎯呭牨銈勮獚瑷兼儏鍫便倰鏍肩磵銇欍倠銇熴倎銇娇鐢ㄣ仚銈嬨亾銇ㄣ亴銇с亶銇俱仚銆傘亾銈屻倝銇銇垮彇銈婂皞鐢ㄣ仹銇傘倞銆丏SL銉曘偂銈ゃ儷銇嬨倝銈ㄣ偗銈广儩銉笺儓銇欍倠闅涖伀銇垎闆€仌銈屻伨銇欍��',
+    envPanelButton: '鐠板澶夋暟銈掕拷鍔�',
+    modal: {
+      title: '鐠板澶夋暟銈掕拷鍔�',
+      editTitle: '鐠板澶夋暟銈掔法闆�',
+      type: '銈裤偆銉�',
+      name: '澶夋暟鍚�',
+      namePlaceholder: '澶夋暟鍚嶃倰鍏ュ姏',
+      value: '鍊�',
+      valuePlaceholder: '澶夋暟鍊ゃ倰鍏ュ姏',
+      secretTip: '銇撱伄澶夋暟銇瀵嗘儏鍫便倓銉囥兗銈裤倰瀹氱京銇欍倠銇熴倎銇娇鐢ㄣ仌銈屻伨銇欍�侱SL 銈掋偍銈偣銉濄兗銉堛仚銈嬨仺銇嶃伀婕忔穿闃叉銉°偒銉嬨偤銉犮倰瑷畾銇曘倢銇俱仚銆�',
+    },
+    export: {
+      title: '銈枫兗銈儸銉冦儓鐠板澶夋暟銈掋偍銈偣銉濄兗銉堛仐銇俱仚銇嬶紵',
+      checkbox: '銈枫兗銈儸銉冦儓鍊ゃ倰鍚個',
+      ignore: 'DSL銈掋偍銈偣銉濄兗銉�',
+      export: '銈枫兗銈儸銉冦儓鍊や粯銇嶃仹銈ㄣ偗銈广儩銉笺儓',
+    },
+  },
+  chatVariable: {
+    panelTitle: '浼氳┍澶夋暟',
+    panelDescription: '瀵捐┍鎯呭牨銈掍繚瀛樸兓绠$悊锛堜細瑭卞饱姝�/銉曘偂銈ゃ儷/銉︺兗銈躲兗瑷畾銇仼锛夈�傛浉銇嶆彌銇堛亴銇с亶銇俱仚銆�',
+    docLink: '瑭崇窗銉夈偔銉ャ儭銉炽儓',
+    button: '澶夋暟銈掕拷鍔�',
+    modal: {
+      title: '浼氳┍澶夋暟銈掕拷鍔�',
+      editTitle: '浼氳┍澶夋暟銈掔法闆�',
+      name: '澶夋暟鍚�',
+      namePlaceholder: '澶夋暟鍚嶃倰鍏ュ姏',
+      type: '銈裤偆銉�',
+      value: '銉囥儠銈┿儷銉堝��',
+      valuePlaceholder: '銉囥儠銈┿儷銉堝�ゃ�佽ō瀹氥仐銇亜鍫村悎銇┖鐧姐伀銇椼仸銇忋仩銇曘亜',
+      description: '瑾槑',
+      descriptionPlaceholder: '澶夋暟銇鏄庛倰鍏ュ姏',
+      editInJSON: 'JSON銇х法闆�',
+      oneByOne: '鍊嬪垾杩藉姞',
+      editInForm: '銉曘偐銉笺儬銇х法闆�',
+      arrayValue: '鍊�',
+      addArrayValue: '鍊ゃ倰杩藉姞',
+      objectKey: '銈兗',
+      objectType: '銈裤偆銉�',
+      objectValue: '銉囥儠銈┿儷銉堝��',
+    },
+    storedContent: '淇濆瓨鍐呭',
+    updatedAt: '鏈�绲傛洿鏂帮細',
+  },
+  changeHistory: {
+    title: '澶夋洿灞ユ',
+    placeholder: '銇俱仩浣曘倐澶夋洿銇曘倢銇︺亜銇俱仜銈�',
+    clearHistory: '灞ユ銈掋偗銉偄',
+    hint: '銉掋兂銉�',
+    hintText: '銈ㄣ儑銈c偪銉笺仹銇法闆嗘搷浣溿伅銆併偍銉囥偅銈裤兗銈掗洟銈屻倠銇俱仹銆併亰浣裤亜銇儑銉愩偆銈广伀瑷橀尣銇曘倢銇俱仚銆傘亾銇饱姝淬伅銆併偍銉囥偅銈裤兗銈掗洟銈屻倠銇ㄦ秷鍘汇仌銈屻伨銇欍��',
+    stepBackward_one: '{{count}} 銈广儐銉冦儣鎴汇倠',
+    stepBackward_other: '{{count}} 銈广儐銉冦儣鎴汇倠',
+    stepForward_one: '{{count}} 銈广儐銉冦儣閫层個',
+    stepForward_other: '{{count}} 銈广儐銉冦儣閫层個',
+    sessionStart: '銈汇儍銈枫儳銉抽枊濮�',
+    currentState: '鐝惧湪銇姸鎱�',
+    nodeTitleChange: '銉栥儹銉冦偗銇偪銈ゃ儓銉亴澶夋洿銇曘倢銇俱仐銇�',
+    nodeDescriptionChange: '銉栥儹銉冦偗銇鏄庛亴澶夋洿銇曘倢銇俱仐銇�',
+    nodeDragStop: '銉栥儹銉冦偗銇岀Щ鍕曘仌銈屻伨銇椼仧',
+    nodeChange: '銉栥儹銉冦偗銇屽鏇淬仌銈屻伨銇椼仧',
+    nodeConnect: '銉栥儹銉冦偗銇屾帴缍氥仌銈屻伨銇椼仧',
+    nodePaste: '銉栥儹銉冦偗銇岃布銈婁粯銇戙倝銈屻伨銇椼仧',
+    nodeDelete: '銉栥儹銉冦偗銇屽墛闄ゃ仌銈屻伨銇椼仧',
+    nodeAdd: '銉栥儹銉冦偗銇岃拷鍔犮仌銈屻伨銇椼仧',
+    nodeResize: '銉栥儹銉冦偗銇偟銈ゃ偤銇屽鏇淬仌銈屻伨銇椼仧',
+    noteAdd: '娉ㄩ噲銇岃拷鍔犮仌銈屻伨銇椼仧',
+    noteChange: '娉ㄩ噲銇屽鏇淬仌銈屻伨銇椼仧',
+    noteDelete: '娉ㄩ噲銇屽墛闄ゃ仌銈屻伨銇椼仧',
+    edgeDelete: '銉栥儹銉冦偗銇帴缍氥亴瑙i櫎銇曘倢銇俱仐銇�',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 銇繀闋堛仹銇�',
+    rerankModelRequired: 'Rerank 銉€儑銉亴瑷畾銇曘倢銇︺亜銇俱仜銈�',
+    authRequired: '瑾嶈銇屽繀瑕併仹銇�',
+    invalidJson: '{{field}} 銇劇鍔广仾 JSON 銇с仚',
+    fields: {
+      variable: '澶夋暟鍚�',
+      variableValue: '澶夋暟鍊�',
+      code: '銈炽兗銉�',
+      model: '銉€儑銉�',
+      rerankModel: 'Rerank銉€儑銉�',
+      visionVariable: '銉撱偢銉с兂澶夋暟',
+    },
+    invalidVariable: '鐒″姽銇鏁般仹銇�',
+    noValidTool: '{{field}} 銇埄鐢ㄥ彲鑳姐仾銉勩兗銉亴銇傘倞銇俱仜銈�',
+    toolParameterRequired: '{{field}}: 銉戙儵銉°兗銈� [{{param}}] 銇繀闋堛仹銇�',
+  },
+  singleRun: {
+    testRun: '銉嗐偣銉堝疅琛�',
+    startRun: '瀹熻闁嬪',
+    running: '瀹熻涓�',
+    testRunIteration: '銉嗐偣銉堝疅琛岋紙銈ゃ儐銉兗銈枫儳銉筹級',
+    testRunLoop: '銉嗐偣銉堝疅琛岋紙銉兗銉楋級',
+    back: '鎴汇倠',
+    iteration: '銈ゃ儐銉兗銈枫儳銉�',
+    loop: '銉兗銉�',
+  },
+  tabs: {
+    'searchBlock': '銉栥儹銉冦偗妞滅储',
+    'blocks': '銉栥儹銉冦偗',
+    'searchTool': '銉勩兗銉绱�',
+    'tools': '銉勩兗銉�',
+    'allTool': '銇欍伖銇�',
+    'customTool': '銈偣銈裤儬',
+    'workflowTool': '銉兗銈儠銉兗',
+    'question-understand': '鍟忛鐞嗚В',
+    'logic': '銉偢銉冦偗',
+    'transform': '澶夋彌',
+    'utilities': '銉勩兗銉�',
+    'noResult': '瑭插綋銇仐',
+    'plugin': '銉椼儵銈般偆銉�',
+    'agent': '銈ㄣ兗銈搞偋銉炽儓鎴︾暐',
+  },
+  blocks: {
+    'start': '闁嬪',
+    'end': '绲備簡',
+    'answer': '鍥炵瓟',
+    'llm': 'LLM',
+    'knowledge-retrieval': '鐭ヨ瓨妞滅储',
+    'question-classifier': '璩晱鍒嗛鍣�',
+    'if-else': 'IF/ELSE',
+    'code': '銈炽兗銉夊疅琛�',
+    'template-transform': '銉嗐兂銉椼儸銉笺儓',
+    'http-request': 'HTTP銉偗銈ㄣ偣銉�',
+    'variable-assigner': '澶夋暟浠e叆鍣�',
+    'variable-aggregator': '澶夋暟闆嗙磩鍣�',
+    'assigner': '澶夋暟浠e叆',
+    'iteration-start': '銈ゃ儐銉兗銈枫儳銉抽枊濮�',
+    'iteration': '銈ゃ儐銉兗銈枫儳銉�',
+    'parameter-extractor': '銉戙儵銉°兗銈挎娊鍑�',
+    'document-extractor': '銉嗐偔銈广儓鎶藉嚭',
+    'list-operator': '銉偣銉堝嚘鐞�',
+    'agent': '銈ㄣ兗銈搞偋銉炽儓',
+    'loop-start': '銉兗銉楅枊濮�',
+    'loop': '銉兗銉�',
+    'loop-end': '銉兗銉楀畬浜�',
+  },
+  blocksAbout: {
+    'start': '銉兗銈儠銉兗闁嬪鏅傘伄鍒濇湡銉戙儵銉°兗銈裤倰瀹氱京銇椼伨銇欍��',
+    'end': '銉兗銈儠銉兗銇祩浜嗘潯浠躲仺绲愭灉銇偪銈ゃ儣銈掑畾缇┿仐銇俱仚銆�',
+    'answer': '銉併儯銉冦儓銉�銈ゃ偄銉偘銇繑绛斿唴瀹广倰瀹氱京銇椼伨銇欍��',
+    'llm': '澶ц妯¤█瑾炪儮銉囥儷銈掑懠銇冲嚭銇椼仸璩晱鍥炵瓟銈勮嚜鐒惰█瑾炲嚘鐞嗐倰瀹熻銇椼伨銇欍��',
+    'knowledge-retrieval': '銉娿儸銉冦偢銉欍兗銈广亱銈夈儲銉笺偠銉艰唱鍟忋伀闁㈤�c仚銈嬨儐銈偣銉堛倰妞滅储銇椼伨銇欍��',
+    'question-classifier': '璩晱銇垎椤炴潯浠躲倰瀹氱京銇椼�丩LM銇屽垎椤炪伀鍩恒仴銇勩仸瀵捐┍銉曘儹銉笺倰鍒跺尽銇椼伨銇欍��',
+    'if-else': 'if/else鏉′欢銇с儻銉笺偗銉曘儹銉笺倰2銇ゃ伄鍒嗗矏銇垎鍓层仐銇俱仚銆�',
+    'code': 'Python/NodeJS銈炽兗銉夈倰瀹熻銇椼仸銈偣銈裤儬銉偢銉冦偗銈掑疅瑁呫仐銇俱仚銆�',
+    'template-transform': 'Jinja銉嗐兂銉椼儸銉笺儓妲嬫枃銇с儑銉笺偪銈掓枃瀛楀垪銇鎻涖仐銇俱仚銆�',
+    'http-request': 'HTTP銉偗銈ㄣ偣銉堛倰閫佷俊銇с亶銇俱仚銆�',
+    'variable-assigner': '瑜囨暟鍒嗗矏銇鏁般倰闆嗙磩銇椼�佷笅娴併儙銉笺儔銇ō瀹氥倰绲变竴銇椼伨銇欍��',
+    'assigner': '鏇搞亶杈笺伩鍙兘銇鏁帮紙渚嬶細浼氳┍澶夋暟锛夈伕銇�ゃ伄鍓层倞褰撱仸銈掕銇勩伨銇欍��',
+    'variable-aggregator': '瑜囨暟鍒嗗矏銇鏁般倰闆嗙磩銇椼�佷笅娴併儙銉笺儔銇ō瀹氥倰绲变竴銇椼伨銇欍��',
+    'iteration': '銉偣銉堣绱犮伀瀵俱仐銇﹀弽寰╁嚘鐞嗐倰瀹熻銇楀叏绲愭灉銈掑嚭鍔涖仐銇俱仚銆�',
+    'loop': '绲備簡鏉′欢閬旀垚銇俱仹銆併伨銇熴伅鏈�澶у弽寰╁洖鏁般伨銇с儹銈搞儍銈倰绻般倞杩斻仐銇俱仚銆�',
+    'loop-end': '銆宐reak銆嶇浉褰撱伄姗熻兘銇с仚銆傘亾銇儙銉笺儔銇ō瀹氶爡鐩伅銇亸銆併儷銉笺儣鍑︾悊涓伀銇撱伄銉庛兗銉夈伀鍒伴仈銇欍倠銇ㄥ嵆鏅傜祩浜嗐仐銇俱仚銆�',
+    'parameter-extractor': '鑷劧瑷�瑾炪亱銈夋閫犲寲銉戙儵銉°兗銈裤倰鎶藉嚭銇椼�佸緦缍氬嚘鐞嗐仹鍒╃敤銇椼伨銇欍��',
+    'document-extractor': '銈€儍銉椼儹銉笺儔鏂囨浉銈扡LM鍑︾悊鐢ㄣ伀鏈�閬╁寲銇曘倢銇熴儐銈偣銉堛伀澶夋彌銇椼伨銇欍��',
+    'list-operator': '閰嶅垪銇儠銈c儷銈裤儶銉炽偘銈勩偨銉笺儓鍑︾悊銈掕銇勩伨銇欍��',
+    'agent': '澶ц妯¤█瑾炪儮銉囥儷銈掓椿鐢ㄣ仐銇熻唱鍟忓繙绛斻倓鑷劧瑷�瑾炲嚘鐞嗐倰瀹熻銇椼伨銇欍��',
+  },
+  operator: {
+    zoomIn: '鎷″ぇ',
+    zoomOut: '绺皬',
+    zoomTo50: '50%銈点偆銈�',
+    zoomTo100: '绛夊�嶈〃绀�',
+    zoomToFit: '鐢婚潰銇悎銈忋仜銈�',
+  },
+  variableReference: {
+    noAvailableVars: '鍒╃敤鍙兘銇鏁般亴銇傘倞銇俱仜銈�',
+    noVarsForOperation: '銇撱伄鎿嶄綔銇壊銈婂綋銇﹀彲鑳姐仾澶夋暟銇屽瓨鍦ㄣ仐銇俱仜銈撱��',
+    noAssignedVars: '鍓层倞褰撱仸鍙兘銇鏁般亴銇傘倞銇俱仜銈�',
+    assignedVarsDescription: '鏇搞亶杈笺伩鍙兘銇鏁帮紙渚嬶細',
+    conversationVars: '浼氳┍澶夋暟',
+  },
+  panel: {
+    userInputField: '銉︺兗銈躲兗鍏ュ姏娆�',
+    changeBlock: '銉庛兗銉夊鏇�',
+    helpLink: '銉樸儷銉椼儶銉炽偗',
+    about: '瑭崇窗',
+    createdBy: '浣滄垚鑰�',
+    nextStep: '娆°伄銈广儐銉冦儣',
+    addNextStep: '銇撱伄銉兗銈儠銉兗銇ф銉庛兗銉夈倰杩藉姞',
+    selectNextStep: '娆°儙銉笺儔閬告姙',
+    runThisStep: '銇撱伄銈广儐銉冦儣瀹熻',
+    checklist: '銉併偋銉冦偗銉偣銉�',
+    checklistTip: '鍏枊鍓嶃伀鍏ㄣ仸銇爡鐩倰纰鸿獚銇椼仸銇忋仩銇曘亜',
+    checklistResolved: '鍏ㄣ仸銇儊銈с儍銈亴瀹屼簡銇椼伨銇椼仧',
+    organizeBlocks: '銉庛兗銉夋暣鐞�',
+    change: '澶夋洿',
+    optional: '锛堜换鎰忥級',
+  },
+  nodes: {
+    common: {
+      outputVars: '鍑哄姏澶夋暟',
+      insertVarTip: '澶夋暟銈掓尶鍏�',
+      memory: {
+        memory: '銉°儮銉�',
+        memoryTip: '銉併儯銉冦儓銉°儮銉ō瀹�',
+        windowSize: '銉°儮銉偊銈c兂銉夈偊銈点偆銈�',
+        conversationRoleName: '浼氳┍銉兗銉悕',
+        user: '銉︺兗銈躲兗鎺ラ牠杈�',
+        assistant: '銈€偡銈广偪銉炽儓鎺ラ牠杈�',
+      },
+      memories: {
+        title: '銉°儮銉�',
+        tip: '銉併儯銉冦儓銇鎲剁鐞�',
+        builtIn: '绲勩伩杈笺伩',
+      },
+      errorHandle: {
+        title: '渚嬪鍑︾悊',
+        tip: '銉庛兗銉変緥澶栫櫤鐢熸檪銇嚘鐞嗐儩銉偡銉笺倰瑷畾',
+        none: {
+          title: '鍑︾悊銇仐',
+          desc: '渚嬪鐧虹敓鏅傘伀鍑︾悊銈掑仠姝�',
+        },
+        defaultValue: {
+          title: '銉囥儠銈┿儷銉堝��',
+          desc: '渚嬪鐧虹敓鏅傘伄銉囥儠銈┿儷銉堝嚭鍔�',
+          tip: '渚嬪鐧虹敓鏅傘伀杩斻仌銈屻倠鍊�:',
+          inLog: '銉庛兗銉変緥澶� - 銉囥儠銈┿儷銉堝�ゃ倰鍑哄姏',
+          output: '銉囥儠銈┿儷銉堝�ゅ嚭鍔�',
+        },
+        failBranch: {
+          title: '渚嬪鍒嗗矏',
+          desc: '渚嬪鐧虹敓鏅傘伀鍒嗗矏銈掑疅琛�',
+          customize: '澶辨晽鍒嗗矏銉偢銉冦偗銈掋偒銈广偪銉炪偆銈�',
+          customizeTip: '渚嬪鐧虹敓鏅傘�佸け鏁楀垎宀愩仹銈ㄣ儵銉煎嚘鐞嗐倰鏌旇粺銇ō瀹氬彲鑳斤紙銈ㄣ儵銉笺儹銈拌〃绀�/淇京鍑︾悊/鎿嶄綔銈广偔銉冦儣绛夛級',
+          inLog: '銉庛兗銉変緥澶� - 澶辨晽鍒嗗矏銈掑疅琛屻�傘偍銉┿兗鎯呭牨銈掍笅娴併伀浼濇挱',
+        },
+        partialSucceeded: {
+          tip: '{{num}}鍊嬨伄銉庛兗銉夈仹鐣板父鐧虹敓銆傘儹銈般伅銉堛儸銉笺偣鐢婚潰銇х⒑瑾嶅彲鑳�',
+        },
+      },
+      retry: {
+        retry: '鍐嶈│琛�',
+        retryOnFailure: '澶辨晽鏅傚啀瑭﹁',
+        maxRetries: '鏈�澶ц│琛屽洖鏁�',
+        retryInterval: '鍐嶈│琛岄枔闅�',
+        retryTimes: '澶辨晽鏅� {{times}}鍥炲啀瑭﹁',
+        retrying: '鍐嶈│琛屼腑...',
+        retrySuccessful: '鍐嶈│琛屾垚鍔�',
+        retryFailed: '鍐嶈│琛屽け鏁�',
+        retryFailedTimes: '{{times}}鍥炲啀瑭﹁澶辨晽',
+        times: '鍥�',
+        ms: '銉熴儶绉�',
+        retries: '鍐嶈│琛屽洖鏁�: {{num}}',
+      },
+    },
+    start: {
+      required: '蹇呴爤',
+      inputField: '鍏ュ姏銉曘偅銉笺儷銉�',
+      builtInVar: '绲勩伩杈笺伩澶夋暟',
+      outputVars: {
+        query: '銉︺兗銈躲兗鍏ュ姏',
+        memories: {
+          des: '浼氳┍灞ユ',
+          type: '銉°儍銈汇兗銈哥ó鍒�',
+          content: '銉°儍銈汇兗銈稿唴瀹�',
+        },
+        files: '銉曘偂銈ゃ儷涓�瑕�',
+      },
+      noVarTip: '鍏ュ姏瑷畾銇儻銉笺偗銉曘儹銉煎唴銇у埄鐢ㄥ彲鑳�',
+    },
+    end: {
+      outputs: '鍑哄姏瑷畾',
+      output: {
+        type: '鍑哄姏褰㈠紡',
+        variable: '鍑哄姏澶夋暟',
+      },
+      type: {
+        'none': '銇仐',
+        'plain-text': '銉椼儸銉笺兂銉嗐偔銈广儓',
+        'structured': '妲嬮�犲寲',
+      },
+    },
+    answer: {
+      answer: '蹇滅瓟',
+      outputVars: '鍑哄姏澶夋暟',
+    },
+    llm: {
+      model: 'AI銉€儑銉�',
+      variables: '澶夋暟',
+      context: '銈炽兂銉嗐偔銈广儓',
+      contextTooltip: '銉娿儸銉冦偢銉欍兗銈广倰銈炽兂銉嗐偔銈广儓銇ㄣ仐銇﹀埄鐢�',
+      notSetContextInPromptTip: '銈炽兂銉嗐偔銈广儓鍒╃敤鏅傘伅銉椼儹銉炽儣銉堛伀澶夋暟銈掓槑瑷樸仐銇︺亸銇犮仌銇�',
+      prompt: '銉椼儹銉炽儣銉�',
+      addMessage: '銉°儍銈汇兗銈歌拷鍔�',
+      roleDescription: {
+        system: '瀵捐┍銇熀鏈嫊浣溿倰瀹氱京',
+        user: '鎸囩ず/璩晱銈掑叆鍔�',
+        assistant: '銉︺兗銈躲兗鍏ュ姏銇搞伄蹇滅瓟',
+      },
+      vision: '銉撱偢銉с兂',
+      files: '銉曘偂銈ゃ儷',
+      resolution: {
+        name: '瑙e儚搴�',
+        high: '楂�',
+        low: '浣�',
+      },
+      outputVars: {
+        output: '鐢熸垚鍐呭',
+        usage: '銉€儑銉娇鐢ㄩ噺',
+      },
+      singleRun: {
+        variable: '澶夋暟',
+      },
+      sysQueryInUser: '銉︺兗銈躲兗銉°儍銈汇兗銈搞伀sys.query銈掑惈銈併仸銇忋仩銇曘亜',
+      jsonSchema: {
+        title: '妲嬮�犲寲銉囥兗銈裤偣銈兗銉�',
+        instruction: '鎸囩ず',
+        promptTooltip: '銉嗐偔銈广儓瑾槑銇嬨倝妯欐簴JSON銈广偔銉笺優銈掕嚜鍕曠敓鎴愩仹銇嶃伨銇欍��',
+        promptPlaceholder: 'JSON銈广偔銉笺優銈掑叆鍔�...',
+        generate: '鐢熸垚',
+        import: 'JSON銈ゃ兂銉濄兗銉�',
+        generateJsonSchema: '銈广偔銉笺優鐢熸垚',
+        generationTip: '鑷劧瑷�瑾炪仹绨″崢銇獼SON銈广偔銉笺優銈掍綔鎴愬彲鑳姐仹銇欍��',
+        generating: 'JSON銈广偔銉笺優銈掔敓鎴愪腑...',
+        generatedResult: '鐢熸垚绲愭灉',
+        resultTip: '銇撱仭銈夈亴鐢熸垚銇曘倢銇熺祼鏋溿仹銇欍�傘仈婧�瓒炽亜銇熴仩銇戙仾銇勫牬鍚堛伅銆佸墠銇敾闈€伀鎴汇仯銇︺儣銉兂銉椼儓銈掍慨姝c仹銇嶃伨銇欍��',
+        back: '鍓嶃伀鎴汇倠',
+        regenerate: '鍐嶇敓鎴愩仚銈�',
+        apply: '閬╃敤',
+        doc: '妲嬮�犲寲鍑哄姏銇┏绱般倰瑕嬨倠',
+        resetDefaults: '鍒濇湡鍖�',
+        required: '蹇呴爤闋呯洰',
+        addField: '銉曘偅銉笺儷銉夈倰杩藉姞',
+        addChildField: '銈点儢銉曘偅銉笺儷銉夈倰杩藉姞',
+        showAdvancedOptions: '瑭崇窗瑷畾',
+        stringValidations: '鏂囧瓧鍒楁瑷�',
+        fieldNamePlaceholder: '銉曘偅銉笺儷銉夊悕',
+        descriptionPlaceholder: '瑾槑銈掑叆鍔�',
+        warningTips: {
+          saveSchema: '绶ㄩ泦涓伄銉曘偅銉笺儷銉夈倰纰哄畾銇椼仸銇嬨倝淇濆瓨銇椼仸銇忋仩銇曘亜銆�',
+        },
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: '妞滅储澶夋暟',
+      knowledge: '銉娿儸銉冦偢銉欍兗銈�',
+      outputVars: {
+        output: '妞滅储绲愭灉銈汇偘銉°兂銉�',
+        content: '銈汇偘銉°兂銉堝唴瀹�',
+        title: '銈汇偘銉°兂銉堛偪銈ゃ儓銉�',
+        icon: '銈汇偘銉°兂銉堛偄銈ゃ偝銉�',
+        url: '銈汇偘銉°兂銉圲RL',
+        metadata: '銉°偪銉囥兗銈�',
+      },
+      metadata: {
+        title: '銉°偪銉囥兗銈裤儠銈c儷銈�',
+        tip: '銈裤偘/銈儐銈淬儶绛夈伄灞炴�с仹妞滅储銈掔禐銈婅炯銇�',
+        options: {
+          disabled: {
+            title: '鐒″姽',
+            subTitle: '銉曘偅銉偪銉兂銈颁笉浣跨敤',
+          },
+          automatic: {
+            title: '鑷嫊鐢熸垚',
+            subTitle: '妞滅储灞ユ銇嬨倝銉曘偅銉偪鏉′欢銈掕嚜鍕曠敓鎴�',
+            desc: 'Query Variable锛堟绱㈠鏁帮級銇熀銇ャ亶銉曘偅銉偪鏉′欢銈掕嚜鍕曠敓鎴�',
+          },
+          manual: {
+            title: '鎵嬪嫊瑷畾',
+            subTitle: '銉°偪銉囥兗銈裤伄鏉′欢銈掓墜鍕曘仹杩藉姞',
+          },
+        },
+        panel: {
+          title: '銉°偪銉囥兗銈裤伄銉曘偅銉偪鏉′欢',
+          conditions: '鏉′欢涓�瑕�',
+          add: '鏉′欢杩藉姞',
+          search: '銉°偪銉囥兗銈挎绱�',
+          placeholder: '鍊ゃ倰鍏ュ姏',
+          datePlaceholder: '鏃ヤ粯閬告姙...',
+          select: '澶夋暟閬告姙...',
+        },
+      },
+    },
+    http: {
+      inputVars: '鍏ュ姏澶夋暟',
+      api: 'API',
+      apiPlaceholder: 'URL銈掑叆鍔涳紙澶夋暟浣跨敤鏅傘伅"/"銈掑叆鍔涳級',
+      extractListPlaceholder: '銉偣銉堢暘鍙枫倰鍏ュ姏锛堝鏁颁娇鐢ㄦ檪銇�"/"銈掑叆鍔涳級',
+      notStartWithHttp: 'API銇� http:// 銇俱仧銇� https:// 銇у銇俱仯銇︺亸銇犮仌銇�',
+      key: '銈兗',
+      type: '銈裤偆銉�',
+      value: '鍊�',
+      bulkEdit: '涓�鎷法闆�',
+      keyValueEdit: '銈兗銉愩儶銉ャ兗绶ㄩ泦',
+      headers: '銉樸儍銉�銉�',
+      params: '銉戙儵銉°兗銈�',
+      body: '銉溿儑銈�',
+      binaryFileVariable: '銉愩偆銉娿儶銉曘偂銈ゃ儷澶夋暟',
+      outputVars: {
+        body: '銉偣銉濄兂銈广偝銉炽儐銉炽儎',
+        statusCode: '銉偣銉濄兂銈广偣銉嗐兗銈裤偣銈炽兗銉�',
+        headers: '銉偣銉濄兂銈广儤銉冦儉锛圝SON锛�',
+        files: '銉曘偂銈ゃ儷涓�瑕�',
+      },
+      authorization: {
+        'authorization': '瑾嶈',
+        'authorizationType': '瑾嶈銈裤偆銉�',
+        'no-auth': '銇仐',
+        'api-key': 'API銈兗',
+        'auth-type': 'API瑾嶈銈裤偆銉�',
+        'basic': '銉欍兗銈枫儍銈�',
+        'bearer': 'Bearer',
+        'custom': '銈偣銈裤儬',
+        'api-key-title': 'API銈兗',
+        'header': '銉樸儍銉�銉�',
+      },
+      insertVarPlaceholder: '澶夋暟銈掓尶鍏ャ仚銈嬨伀銇痋'/\'銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+      timeout: {
+        title: '銈裤偆銉犮偄銈︺儓瑷畾',
+        connectLabel: '鎺ョ稓銈裤偆銉犮偄銈︺儓',
+        connectPlaceholder: '鎺ョ稓銈裤偆銉犮偄銈︺儓锛堢锛�',
+        readLabel: '瑾伩鍙栥倞銈裤偆銉犮偄銈︺儓',
+        readPlaceholder: '瑾伩鍙栥倞銈裤偆銉犮偄銈︺儓锛堢锛�',
+        writeLabel: '鏇搞亶杈笺伩銈裤偆銉犮偄銈︺儓',
+        writePlaceholder: '鏇搞亶杈笺伩銈裤偆銉犮偄銈︺儓锛堢锛�',
+      },
+      curl: {
+        title: 'cURL銇嬨倝銈ゃ兂銉濄兗銉�',
+        placeholder: '銇撱亾銇玞URL鏂囧瓧鍒椼倰璨笺倞浠樸亼銇俱仚',
+      },
+    },
+    code: {
+      inputVars: '鍏ュ姏澶夋暟',
+      outputVars: '鍑哄姏澶夋暟',
+      advancedDependencies: '楂樺害銇緷瀛橀枹淇�',
+      advancedDependenciesTip: '娑堣不銇檪闁撱亴銇嬨亱銈嬨�併伨銇熴伅銉囥儠銈┿儷銉堛仹绲勩伩杈笺伨銈屻仸銇勩仾銇勪簨鍓嶃儹銉笺儔銇曘倢銇熶緷瀛橀枹淇傘倰杩藉姞銇椼伨銇�',
+      searchDependencies: '渚濆瓨闁總銈掓绱�',
+    },
+    templateTransform: {
+      inputVars: '鍏ュ姏澶夋暟',
+      code: '銈炽兗銉�',
+      codeSupportTip: 'Jinja2銇伩銈掋偟銉濄兗銉堛仐銇︺亜銇俱仚',
+      outputVars: {
+        output: '澶夋彌銇曘倢銇熴偝銉炽儐銉炽儎',
+      },
+    },
+    ifElse: {
+      if: '銈傘仐',
+      else: '銇濄倢浠ュ',
+      elseDescription: 'IF鏉′欢銇屾簚銇熴仌銈屻仾銇勫牬鍚堛伀瀹熻銇欍倠銉偢銉冦偗銈掑畾缇┿仐銇俱仚銆�',
+      and: '銇嬨仱',
+      or: '銇俱仧銇�',
+      operator: '婕旂畻瀛�',
+      notSetVariable: '銇俱仛澶夋暟銈掕ō瀹氥仐銇︺亸銇犮仌銇�',
+      comparisonOperator: {
+        'contains': '鍚個',
+        'not contains': '鍚伨銇亜',
+        'start with': '銇у銇俱倠',
+        'end with': '銇х祩銈忋倠',
+        'is': '銇с亗銈�',
+        'is not': '銇с仾銇�',
+        'empty': '绌�',
+        'not empty': '绌恒仹銇亜',
+        'null': 'null',
+        'not null': 'null銇с仾銇�',
+        'regex match': '姝h琛ㄧ従銉炪儍銉�',
+        'in': '鍚伨銈屻仸銇勩倠',
+        'not in': '鍚伨銈屻仸銇勩仾銇�',
+        'all of': '銇欍伖銇︺伄',
+        'exists': '瀛樺湪銇椼伨銇�',
+        'not exists': '瀛樺湪銇椼伨銇涖倱',
+        'before': '鍓嶃伀',
+        'after': '寰�',
+      },
+      enterValue: '鍊ゃ倰鍏ュ姏',
+      addCondition: '鏉′欢銈掕拷鍔�',
+      conditionNotSetup: '鏉′欢銇岃ō瀹氥仌銈屻仸銇勩伨銇涖倱',
+      selectVariable: '澶夋暟銈掗伕鎶�...',
+      optionName: {
+        audio: '闊冲0',
+        localUpload: '銉兗銈儷銈€儍銉椼儹銉笺儔',
+        image: '鐢诲儚',
+        video: '鏄犲儚',
+        doc: '銉夈偔銉ャ儭銉炽儓',
+        url: 'URL',
+      },
+      select: '閬搞伓',
+      addSubVariable: '銈点儢澶夋暟',
+    },
+    variableAssigner: {
+      title: '澶夋暟銈掍唬鍏ャ仚銈�',
+      outputType: '鍑哄姏銈裤偆銉�',
+      outputVarType: '鍑哄姏澶夋暟銇偪銈ゃ儣',
+      varNotSet: '澶夋暟銇岃ō瀹氥仌銈屻仸銇勩伨銇涖倱',
+      noVarTip: '浠e叆銇曘倢銇熷鏁般倰杩藉姞銇椼仸銇忋仩銇曘亜',
+      type: {
+        string: '鏂囧瓧鍒�',
+        number: '鏁板��',
+        object: '銈儢銈搞偋銈儓',
+        array: '閰嶅垪',
+      },
+      aggregationGroup: '銈般儷銉笺儣',
+      aggregationGroupTip: '銇撱伄姗熻兘銈掓湁鍔广伀銇欍倠銇ㄣ�佸鏁伴泦绱勫櫒銇鏁般伄銈汇儍銉堛伄澶夋暟銈掗泦绱勩仹銇嶃伨銇欍��',
+      addGroup: '銈般儷銉笺儣銈掕拷鍔�',
+      outputVars: {
+        varDescribe: '{{groupName}} 鍑哄姏',
+      },
+      setAssignVariable: '浠e叆銇曘倢銇熷鏁般倰瑷畾',
+    },
+    assigner: {
+      'assignedVariable': '浠e叆銇曘倢銇熷鏁�',
+      'writeMode': '鏇搞亶杈笺伩銉€兗銉�',
+      'writeModeTip': '浠e叆銇曘倢銇熷鏁般亴閰嶅垪銇牬鍚�, 鏈熬銇拷瑷樸儮銉笺儔銈掕拷鍔犮仚銈嬨��',
+      'over-write': '涓婃浉銇�',
+      'append': '杩借',
+      'plus': '銉椼儵銈�',
+      'clear': '銈儶銈�',
+      'setVariable': '澶夋暟銈掕ō瀹氥仚銈�',
+      'variable': '澶夋暟',
+      'operations': {
+        'title': '鎿嶄綔',
+        'set': '銈汇儍銉�',
+        'clear': '銈儶銈�',
+        'overwrite': '涓婃浉銇�',
+        'append': '杩藉姞',
+        '-=': '-=',
+        '/=': '/=',
+        '+=': '+=',
+        'over-write': '涓婃浉銇�',
+        'extend': '寤躲伆銇�',
+        '*=': '*=',
+        'remove-last': '鏈�寰屻倰鍓婇櫎銇欍倠',
+        'remove-first': '鏈�鍒濄倰鍓婇櫎銇欍倠',
+      },
+      'setParameter': '銉戙儵銉°兗銈裤倰瑷畾...',
+      'selectAssignedVariable': '浠e叆澶夋暟銈掗伕鎶�...',
+      'varNotSet': '澶夋暟銇岃ō瀹氥仌銈屻仸銇勩伨銇涖倱',
+      'variables': '澶夋暟',
+      'noVarTip': '銆�+銆嶃儨銈裤兂銈掋偗銉儍銈仐銇﹀鏁般倰杩藉姞銇椼伨銇�',
+      'noAssignedVars': '浣跨敤鍙兘銇唬鍏ュ鏁般亴銇傘倞銇俱仜銈�',
+      'assignedVarsDescription': '浠e叆銇曘倢銈嬪鏁般伅銆佷細瑭卞鏁般仾銇┿伄鏇搞亶杈笺伩鍙兘銇鏁般仹銇傘倠蹇呰銇屻亗銈娿伨銇欍��',
+    },
+    tool: {
+      toAuthorize: '鎵胯獚銇欍倠銇伅',
+      inputVars: '鍏ュ姏澶夋暟',
+      outputVars: {
+        text: '銉勩兗銉亴鐢熸垚銇椼仧銈炽兂銉嗐兂銉�',
+        files: {
+          title: '銉勩兗銉亴鐢熸垚銇椼仧銉曘偂銈ゃ儷',
+          type: '銈点儩銉笺儓銈裤偆銉椼�傜従鍦ㄣ伅鐢诲儚銇伩銈点儩銉笺儓銇曘倢銇︺亜銇俱仚',
+          transfer_method: '杌㈤�佹柟娉曘�傚�ゃ伅remote_url銇俱仧銇痩ocal_file銇с仚',
+          url: '鐢诲儚URL',
+          upload_file_id: '銈€儍銉椼儹銉笺儔銉曘偂銈ゃ儷ID',
+        },
+        json: '銉勩兗銉仹鐢熸垚銇曘倢銇烰SON',
+      },
+    },
+    questionClassifiers: {
+      model: '銉€儑銉�',
+      inputVars: '鍏ュ姏澶夋暟',
+      outputVars: {
+        className: '銈儵銈瑰悕',
+      },
+      class: '銈儵銈�',
+      classNamePlaceholder: '銈儵銈瑰悕銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+      advancedSetting: '楂樺害銇ō瀹�',
+      topicName: '銉堛償銉冦偗鍚�',
+      topicPlaceholder: '銉堛償銉冦偗鍚嶃倰鍏ュ姏銇椼仸銇忋仩銇曘亜',
+      addClass: '銈儵銈广倰杩藉姞',
+      instruction: '鎸囩ず',
+      instructionTip: '璩晱鍒嗛鍣ㄣ亴璩晱銈掋仼銇倛銇嗐伀鍒嗛銇欍倠銇嬨倰銈堛倞銈堛亸鐞嗚В銇欍倠銇熴倎銇拷鍔犮伄鎸囩ず銈掑叆鍔涖仐銇俱仚銆�',
+      instructionPlaceholder: '鎸囩ず銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    },
+    parameterExtractor: {
+      inputVar: '鍏ュ姏澶夋暟',
+      extractParameters: '銉戙儵銉°兗銈裤兗銈掓娊鍑�',
+      importFromTool: '銉勩兗銉亱銈夈偆銉炽儩銉笺儓',
+      addExtractParameter: '鎶藉嚭銉戙儵銉°兗銈裤兗銈掕拷鍔�',
+      addExtractParameterContent: {
+        name: '鍚嶅墠',
+        namePlaceholder: '鎶藉嚭銉戙儵銉°兗銈裤兗鍚�',
+        type: '銈裤偆銉�',
+        typePlaceholder: '鎶藉嚭銉戙儵銉°兗銈裤兗銈裤偆銉�',
+        description: '瑾槑',
+        descriptionPlaceholder: '鎶藉嚭銉戙儵銉°兗銈裤兗銇鏄�',
+        required: '蹇呴爤',
+        requiredContent: '蹇呴爤銇儮銉囥儷鎺ㄨ珫銇弬鑰冦仺銇椼仸銇伩浣跨敤銇曘倢銆併儜銉┿儭銉笺偪銉煎嚭鍔涖伄蹇呴爤妞滆銇伅浣跨敤銇曘倢銇俱仜銈撱��',
+      },
+      extractParametersNotSet: '鎶藉嚭銉戙儵銉°兗銈裤兗銇岃ō瀹氥仌銈屻仸銇勩伨銇涖倱',
+      instruction: '鎸囩ず',
+      instructionTip: '銉戙儵銉°兗銈裤兗鎶藉嚭鍣ㄣ亴銉戙儵銉°兗銈裤兗銈掓娊鍑恒仚銈嬫柟娉曘倰鐞嗚В銇欍倠銇伀褰圭珛銇よ拷鍔犮伄鎸囩ず銈掑叆鍔涖仐銇俱仚銆�',
+      advancedSetting: '楂樺害銇ō瀹�',
+      reasoningMode: '鎺ㄨ珫銉€兗銉�',
+      reasoningModeTip: '闁㈡暟鍛笺伋鍑恒仐銈勩儣銉兂銉椼儓銇寚绀恒伀蹇滅瓟銇欍倠銉€儑銉伄鑳藉姏銇熀銇ャ亜銇︺�侀仼鍒囥仾鎺ㄨ珫銉€兗銉夈倰閬告姙銇с亶銇俱仚銆�',
+      isSuccess: '鎴愬姛銆傛垚鍔熴仐銇熷牬鍚堛伄鍊ゃ伅1銆佸け鏁椼仐銇熷牬鍚堛伄鍊ゃ伅0銇с仚銆�',
+      errorReason: '銈ㄣ儵銉笺伄鐞嗙敱',
+    },
+    iteration: {
+      deleteTitle: '銈ゃ儐銉兗銈枫儳銉炽儙銉笺儔銈掑墛闄ゃ仐銇俱仚銇嬶紵',
+      deleteDesc: '銈ゃ儐銉兗銈枫儳銉炽儙銉笺儔銈掑墛闄ゃ仚銈嬨仺銆併仚銇广仸銇瓙銉庛兗銉夈亴鍓婇櫎銇曘倢銇俱仚',
+      input: '鍏ュ姏',
+      output: '鍑哄姏澶夋暟',
+      iteration_one: '{{count}} 銈ゃ儐銉兗銈枫儳銉�',
+      iteration_other: '{{count}} 銈ゃ儐銉兗銈枫儳銉�',
+      currentIteration: '鐝惧湪銇偆銉嗐儸銉笺偡銉с兂',
+      ErrorMethod: {
+        operationTerminated: '绲備簡',
+        continueOnError: '銈ㄣ儵銉兼檪銇稓琛�',
+        removeAbnormalOutput: '銈€儢銉庛兗銉炪儷銈€偊銉堛儣銉冦儓銇墛闄�',
+      },
+      comma: ',',
+      error_other: '{{銈偊銉炽儓}}銈ㄣ儵銉�',
+      error_one: '{{銈偊銉炽儓}}銈ㄣ儵銉�',
+      parallelModeUpper: '銉戙儵銉儷銉€兗銉�',
+      parallelMode: '銉戙儵銉儷銉€兗銉�',
+      MaxParallelismTitle: '鏈�澶т甫鍒楀嚘鐞�',
+      errorResponseMethod: '銈ㄣ儵銉煎繙绛旀柟寮�',
+      parallelPanelDesc: '涓﹀垪銉€兗銉夈仹銇�併偆銉嗐儸銉笺偡銉с兂銇偪銈广偗銇甫鍒楀疅琛屻倰銈点儩銉笺儓銇椼伨銇欍��',
+      parallelModeEnableDesc: '涓﹀垪銉€兗銉夈仹銇�併偆銉嗐儸銉笺偡銉с兂鍐呫伄銈裤偣銈伅涓﹀垪瀹熻銈掋偟銉濄兗銉堛仐銇俱仚銆傘亾銈屻伅銆佸彸鍋淬伄銉椼儹銉戙儐銈c儜銉嶃儷銇ф鎴愩仹銇嶃伨銇欍��',
+      parallelModeEnableTitle: '銉戙儵銉儷銉€兗銉夋湁鍔�',
+      MaxParallelismDesc: '鏈�澶т甫鍒楀嚘鐞嗐伅銆�1 鍥炪伄鍙嶅京銇у悓鏅傘伀瀹熻銇曘倢銈嬨偪銈广偗銇暟銈掑埗寰°仚銈嬨仧銈併伀浣跨敤銇曘倢銇俱仚銆�',
+      answerNodeWarningDesc: '涓﹀垪銉€兗銉夈伄璀﹀憡: 蹇滅瓟銉庛兗銉夈�佷細瑭卞鏁般伄鍓层倞褰撱仸銆併亰銈堛伋銈ゃ儐銉兗銈枫儳銉冲唴銇案缍氱殑銇銇垮彇銈�/鏇搞亶杈笺伩鎿嶄綔銇倛銈娿�佷緥澶栥亴鐧虹敓銇欍倠鍙兘鎬с亴銇傘倞銇俱仚銆�',
+    },
+    loop: {
+      deleteTitle: '銉兗銉椼儙銉笺儔銈掑墛闄ゃ仐銇俱仚銇嬶紵',
+      deleteDesc: '銉兗銉椼儙銉笺儔銈掑墛闄ゃ仚銈嬨仺銆佸叏銇︺伄瀛愩儙銉笺儔銇屽墛闄ゃ仌銈屻伨銇欍��',
+      input: '鍏ュ姏',
+      output: '鍑哄姏澶夋暟',
+      loop_one: '{{count}}鍥�',
+      loop_other: '{{count}}鍥�',
+      currentLoop: '鐝惧湪銇儷銉笺儣',
+      breakCondition: '銉兗銉楃祩浜嗘潯浠�',
+      breakConditionTip: '銉兗銉楀唴銇鏁般倓銈汇儍銈枫儳銉冲鏁般倰鍙傜収銇椼�佺祩浜嗘潯浠躲倰瑷畾銇с亶銇俱仚銆�',
+      loopMaxCount: '鏈�澶с儷銉笺儣鍥炴暟',
+      loopMaxCountError: '鏈�澶с儷銉笺儣鍥炴暟銇�1銇嬨倝{{maxCount}}銇瘎鍥层仹姝c仐銇忓叆鍔涖仐銇︺亸銇犮仌銇勩��',
+      errorResponseMethod: '銈ㄣ儵銉煎蹇滄柟娉�',
+      ErrorMethod: {
+        operationTerminated: '銈ㄣ儵銉兼檪銇嚘鐞嗐倰绲備簡',
+        continueOnError: '銈ㄣ儵銉笺倰鐒¤銇椼仸缍欑稓',
+        removeAbnormalOutput: '鐣板父鍑哄姏銈掗櫎澶�',
+      },
+      loopVariables: '銉兗銉楀鏁�',
+      initialLoopVariables: '鍒濇湡銉兗銉楀鏁�',
+      finalLoopVariables: '鏈�绲傘儷銉笺儣澶夋暟',
+      setLoopVariables: '銉兗銉椼偣銈炽兗銉楀唴銇у鏁般倰瑷畾',
+      variableName: '澶夋暟鍚�',
+      inputMode: '鍏ュ姏銉€兗銉�',
+      exitConditionTip: '銉兗銉椼儙銉笺儔銇伅灏戙仾銇忋仺銈�1銇ゃ伄绲備簡鏉′欢銇屽繀瑕併仹銇�',
+      loopNode: '銉兗銉椼儙銉笺儔',
+      currentLoopCount: '鐝惧湪銇儷銉笺儣鍥炴暟: {{count}}',
+      totalLoopCount: '绶忋儷銉笺儣鍥炴暟: {{count}}',
+      error_other: '{{count}} 銈ㄣ儵銉�',
+      error_one: '{{count}} 銈ㄣ儵銉�',
+      comma: ',',
+    },
+    note: {
+      addNote: '銈炽儭銉炽儓銈掕拷鍔�',
+      editor: {
+        placeholder: '銉°儮銈掓浉銇�...',
+        small: '灏�',
+        medium: '涓�',
+        large: '澶�',
+        bold: '澶瓧',
+        italic: '鏂滀綋',
+        strikethrough: '鎵撱仭娑堛仐绶�',
+        link: '銉兂銈�',
+        openLink: '闁嬨亸',
+        unlink: '銉兂銈倰銈儯銉炽偦銉�',
+        enterUrl: '銉兂銈叆鍔涗腑...',
+        invalidUrl: '銉兂銈劇鍔�',
+        bulletList: '銉偣銉�',
+        showAuthor: '钁楄�呫倰琛ㄧず銇欍倠',
+      },
+    },
+    docExtractor: {
+      outputVars: {
+        text: '鎶藉嚭銇曘倢銇熴儐銈偣銉�',
+      },
+      inputVar: '鍏ュ姏澶夋暟',
+      learnMore: '瑭崇窗銇亾銇°倝',
+      supportFileTypes: '銈点儩銉笺儓銇欍倠銉曘偂銈ゃ儷銈裤偆銉�: {{types}}銆�',
+    },
+    listFilter: {
+      outputVars: {
+        last_record: '鏈�寰屻伄銉偝銉笺儔',
+        first_record: '鏈�鍒濄伄銉偝銉笺儔',
+        result: '銉曘偅銉偪銉肩祼鏋�',
+      },
+      limit: '銉堛儍銉桸',
+      asc: 'ASC',
+      filterCondition: '銉曘偅銉偪銉兼潯浠�',
+      filterConditionKey: '銉曘偅銉偪銉兼潯浠躲偔銉�',
+      orderBy: '涓︺伖銈嬮爢鐣�',
+      filterConditionComparisonValue: '銉曘偅銉偪銉兼潯浠躲伄鍊�',
+      selectVariableKeyPlaceholder: '銈点儢澶夋暟銈兗銈掗伕鎶炪仚銈�',
+      filterConditionComparisonOperator: '銉曘偅銉偪銉兼潯浠躲倰姣旇純銈儦銉兗銈裤兗',
+      inputVar: '鍏ュ姏澶夋暟',
+      desc: 'DESC',
+      extractsCondition: 'N鍊嬨伄銈€偆銉嗐儬銈掓娊鍑恒仐銇俱仚',
+    },
+    agent: {
+      strategy: {
+        label: '銈ㄣ兗銈搞偋銉炽儐銈c儍銈垿鐣�',
+        configureTipDesc: '銈ㄣ兗銈搞偋銉炽儓鎴︾暐銈掕ō瀹氥仐銇熷緦銆併亾銇儙銉笺儔銇畫銈娿伄瑷畾銈掕嚜鍕曠殑銇銇胯炯銇裤伨銇欍�傘亾銇垿鐣ャ伅銆併優銉儊銈广儐銉冦儣銉勩兗銉帹璜栥伄銉°偒銉嬨偤銉犮伀褰遍熆銈掍笌銇堛伨銇欍��',
+        searchPlaceholder: '銈ㄣ兗銈搞偋銉炽儐銈c儍銈垿鐣ャ倰妞滅储銇欍倠',
+        configureTip: '銈ㄣ兗銈搞偋銉炽儐銈c儍銈垿鐣ャ倰瑷畾銇椼仸銇忋仩銇曘亜銆�',
+        shortLabel: '鎴︾暐',
+        tooltip: '鐣般仾銈嬨偍銉笺偢銈с兂銉嗐偅銉冦偗鎴︾暐銇屻�併偡銈广儐銉犮亴銉炪儷銉併偣銉嗐儍銉椼伄銉勩兗銉懠銇冲嚭銇椼倰瑷堢敾銇楀疅琛屻仚銈嬫柟娉曘倰姹哄畾銇椼伨銇欍��',
+        selectTip: '銈ㄣ兗銈搞偋銉炽偡銉兼垿鐣ャ倰閬告姙銇欍倠',
+      },
+      pluginInstaller: {
+        install: '銈ゃ兂銈广儓銉笺儷',
+        installing: '銈ゃ兂銈广儓銉笺儷涓�',
+      },
+      modelNotInMarketplace: {
+        manageInPlugins: '銉椼儵銈般偆銉炽倰绠$悊銇欍倠',
+        title: '銉€儑銉亴銈ゃ兂銈广儓銉笺儷銇曘倢銇︺亜銇俱仜銈�',
+        desc: '銇撱伄銉€儑銉伅銉兗銈儷銇俱仧銇疓itHub銉儩銈搞儓銉亱銈夈偆銉炽偣銉堛兗銉仌銈屻伨銇欍�傘偆銉炽偣銉堛兗銉緦銇仈鍒╃敤銇忋仩銇曘亜銆�',
+      },
+      modelNotSupport: {
+        title: '銈点儩銉笺儓銇曘倢銇︺亜銇亜銉€儑銉�',
+        descForVersionSwitch: '銈ゃ兂銈广儓銉笺儷銇曘倢銇熴儣銉┿偘銈ゃ兂銇儛銉笺偢銉с兂銇亾銇儮銉囥儷銈掓彁渚涖仐銇︺亜銇俱仜銈撱�傘儛銉笺偢銉с兂銈掑垏銈婃浛銇堛倠銇伅銈儶銉冦偗銇椼仸銇忋仩銇曘亜銆�',
+        desc: '銈ゃ兂銈广儓銉笺儷銇曘倢銇熴儣銉┿偘銈ゃ兂銇儛銉笺偢銉с兂銇�併亾銇儮銉囥儷銈掓彁渚涖仐銇︺亜銇俱仜銈撱��',
+      },
+      modelSelectorTooltips: {
+        deprecated: '銇撱伄銉€儑銉伅寤冩銇曘倢銇俱仐銇�',
+      },
+      outputVars: {
+        files: {
+          url: '鐢诲儚銇甎RL',
+          type: '銈点儩銉笺儓銈裤偆銉椼�傜従鍦ㄣ伅銈点儩銉笺儓鐢诲儚銇伩',
+          upload_file_id: '銉曘偂銈ゃ儷ID銈掋偄銉冦儣銉兗銉�',
+          transfer_method: '杌㈤�佹柟娉曘�傚�ゃ伅remote_url銇俱仧銇痩ocal_file銇с仚銆�',
+          title: '銈ㄣ兗銈搞偋銉炽儓鐢熸垚銉曘偂銈ゃ儷',
+        },
+        text: '銈ㄣ兗銈搞偋銉炽儓鐢熸垚銈炽兂銉嗐兂銉�',
+        json: '銈ㄣ兗銈搞偋銉炽儓鐢熸垚銇甁SON',
+      },
+      checkList: {
+        strategyNotSelected: '鎴︾暐銇岄伕鎶炪仌銈屻仸銇勩伨銇涖倱',
+      },
+      installPlugin: {
+        install: '銈ゃ兂銈广儓銉笺儷',
+        changelog: '澶夋洿銉偘',
+        cancel: '銈儯銉炽偦銉�',
+        desc: '娆°伄銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷銇椼倛銇嗐仺銇椼仸銇勩伨銇�',
+        title: '銉椼儵銈般偆銉炽倰銈ゃ兂銈广儓銉笺儷銇欍倠',
+      },
+      strategyNotSet: '銈ㄣ兗銈搞偋銉炽儐銈c儍銈垿鐣ャ伅瑷畾銇曘倢銇︺亜銇俱仜銈�',
+      strategyNotInstallTooltip: '{{strategy}}銇偆銉炽偣銉堛兗銉仌銈屻仸銇勩伨銇涖倱',
+      modelNotSelected: '銉€儑銉亴閬告姙銇曘倢銇︺亜銇俱仜銈�',
+      toolNotAuthorizedTooltip: '{{tool}} 瑾嶅彲銇曘倢銇︺亜銇俱仜銈�',
+      toolNotInstallTooltip: '{{tool}}銇偆銉炽偣銉堛兗銉仌銈屻仸銇勩伨銇涖倱',
+      tools: '閬撳叿',
+      learnMore: '銈傘仯銇ㄥ銇�',
+      configureModel: '銉€儑銉倰瑷畾銇欍倠',
+      model: '銉€儑銉�',
+      linkToPlugin: '銉椼儵銈般偆銉炽伕銇儶銉炽偗',
+      notAuthorized: '妯╅檺銇屻亗銈娿伨銇涖倱',
+      modelNotInstallTooltip: '銇撱伄銉€儑銉伅銈ゃ兂銈广儓銉笺儷銇曘倢銇︺亜銇俱仜銈�',
+      maxIterations: '鏈�澶у弽寰╁洖鏁�',
+      toolbox: '銉勩兗銉儨銉冦偗銈�',
+      pluginNotInstalled: '銇撱伄銉椼儵銈般偆銉炽伅銈ゃ兂銈广儓銉笺儷銇曘倢銇︺亜銇俱仜銈�',
+      strategyNotFoundDescAndSwitchVersion: '銈ゃ兂銈广儓銉笺儷銇曘倢銇熴儣銉┿偘銈ゃ兂銇儛銉笺偢銉с兂銇亾銇垿鐣ャ倰鎻愪緵銇椼仸銇勩伨銇涖倱銆傘儛銉笺偢銉с兂銈掑垏銈婃浛銇堛倠銇伅銈儶銉冦偗銇椼仸銇忋仩銇曘亜銆�',
+      pluginNotInstalledDesc: '銇撱伄銉椼儵銈般偆銉炽伅GitHub銇嬨倝銈ゃ兂銈广儓銉笺儷銇曘倢銇︺亜銇俱仚銆傚啀銈ゃ兂銈广儓銉笺儷銇欍倠銇伅銉椼儵銈般偆銉炽伀绉诲嫊銇椼仸銇忋仩銇曘亜銆�',
+      unsupportedStrategy: '銈点儩銉笺儓銇曘倢銇︺亜銇亜鎴︾暐',
+      pluginNotFoundDesc: '銇撱伄銉椼儵銈般偆銉炽伅GitHub銇嬨倝銈ゃ兂銈广儓銉笺儷銇曘倢銇︺亜銇俱仚銆傚啀銈ゃ兂銈广儓銉笺儷銇欍倠銇伅銉椼儵銈般偆銉炽伀绉诲嫊銇椼仸銇忋仩銇曘亜銆�',
+      strategyNotFoundDesc: '銈ゃ兂銈广儓銉笺儷銇曘倢銇熴儣銉┿偘銈ゃ兂銇儛銉笺偢銉с兂銇�併亾銇垿鐣ャ倰鎻愪緵銇椼仸銇勩伨銇涖倱銆�',
+    },
+  },
+  tracing: {
+    stopBy: '{{user}}銇倛銇c仸鍋滄',
+  },
+  versionHistory: {
+    title: '銉愩兗銈搞儳銉�',
+    currentDraft: '鐝惧湪銇笅鏇搞亶',
+    latest: '鏈�鏂扮増',
+    filter: {
+      all: '銇欍伖銇�',
+      onlyYours: '鑷垎銇伩',
+      onlyShowNamedVersions: '鍚嶅墠浠樸亶銉愩兗銈搞儳銉炽伄銇�',
+      reset: '銉偦銉冦儓',
+      empty: '瑭插綋銇欍倠銉愩兗銈搞儳銉炽亴銇傘倞銇俱仜銈�',
+    },
+    defaultName: '鍚嶇О鏈ō瀹�',
+    nameThisVersion: '銉愩兗銈搞儳銉冲悕銈掍粯銇戙倠',
+    editVersionInfo: '銉愩兗銈搞儳銉虫儏鍫便倰绶ㄩ泦',
+    editField: {
+      title: '銈裤偆銉堛儷',
+      releaseNotes: '銉儶銉笺偣銉庛兗銉�',
+      titleLengthLimit: '銈裤偆銉堛儷銇瘂{limit}}鏂囧瓧浠ュ唴銇у叆鍔涖仐銇︺亸銇犮仌銇�',
+      releaseNotesLengthLimit: '銉儶銉笺偣銉庛兗銉堛伅{{limit}}鏂囧瓧浠ュ唴銇у叆鍔涖仐銇︺亸銇犮仌銇�',
+    },
+    releaseNotesPlaceholder: '澶夋洿鍐呭銈掑叆鍔涖仐銇︺亸銇犮仌銇�',
+    restorationTip: '銉愩兗銈搞儳銉炽倰寰╁厓銇欍倠銇ㄣ�佺従鍦ㄣ伄涓嬫浉銇嶃亴涓婃浉銇嶃仌銈屻伨銇�',
+    deletionTip: '鍓婇櫎銇椼仧銉囥兗銈裤伅寰╁厓銇с亶銇俱仜銈撱�傘倛銈嶃仐銇勩仹銇欍亱锛�',
+    action: {
+      restoreSuccess: '寰╁厓銇屽畬浜嗐仐銇俱仐銇�',
+      restoreFailure: '寰╁厓銇け鏁椼仐銇俱仐銇�',
+      deleteSuccess: '鍓婇櫎銇屽畬浜嗐仐銇俱仐銇�',
+      deleteFailure: '鍓婇櫎銇け鏁椼仐銇俱仐銇�',
+      updateSuccess: '鏇存柊銇屽畬浜嗐仐銇俱仐銇�',
+      updateFailure: '鏇存柊銇け鏁椼仐銇俱仐銇�',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/ko-KR/app-annotation.ts b/i18n/ko-KR/app-annotation.ts
new file mode 100644
index 0000000..7a93d17
--- /dev/null
+++ b/i18n/ko-KR/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: '鞏措吀韰岇澊靺�',
+  name: '鞏措吀韰岇澊靺� 雼惦硛',
+  editBy: '{{author}} 雼橃澊 韼胳頃� 雼惦硛',
+  noData: {
+    title: '鞏措吀韰岇澊靺橃澊 鞐嗢姷雼堧嫟',
+    description: '鞐赴鞐愳劀電� 鞎� 霐旊矂旯� 欷戩棎 鞏措吀韰岇澊靺橃潉 韼胳頃橁卑雮� 鞚缄磩鞝侅溂搿� 鞏措吀韰岇澊靺橃潉 臧�鞝胳檧 瓿犿拡歆堨潣 鞚戨嫷鞚� 靸濎劚頃� 靾� 鞛堨姷雼堧嫟.',
+  },
+  table: {
+    header: {
+      question: '歆堧',
+      answer: '雼惦硛',
+      createdAt: '靸濎劚 雮犾',
+      hits: '臁绊殞靾�',
+      actions: '鞎§厴',
+      addAnnotation: '鞏措吀韰岇澊靺� 於旉皜',
+      bulkImport: '鞚缄磩 臧�鞝胳槫旮�',
+      bulkExport: '鞚缄磩 雮措炒雮搓赴',
+      clearAll: '氇摖 鞏措吀韰岇澊靺� 歆�鞖瓣赴',
+    },
+  },
+  editModal: {
+    title: '鞏措吀韰岇澊靺� 雼惦硛 韼胳',
+    queryName: '靷毄鞛� 炜茧Μ',
+    answerName: '鞀ろ啝毽厰霟� 氪�',
+    yourAnswer: '雼轨嫚鞚� 雼惦硛',
+    answerPlaceholder: '鞐赴鞐� 雼惦硛鞚� 鞛呺牓頃橃劯鞖�',
+    yourQuery: '雼轨嫚鞚� 炜茧Μ',
+    queryPlaceholder: '鞐赴鞐� 炜茧Μ毳� 鞛呺牓頃橃劯鞖�',
+    removeThisCache: '鞚� 鞏措吀韰岇澊靺� 靷牅',
+    createdAt: '靸濎劚 雮犾',
+  },
+  addModal: {
+    title: '鞏措吀韰岇澊靺� 雼惦硛 於旉皜',
+    queryName: '歆堧',
+    answerName: '雼惦硛',
+    answerPlaceholder: '鞐赴鞐� 雼惦硛鞚� 鞛呺牓頃橃劯鞖�',
+    queryPlaceholder: '鞐赴鞐� 歆堧鞚� 鞛呺牓頃橃劯鞖�',
+    createNext: '雼るジ 鞏措吀韰岇澊靺橃澊 雼Π 鞚戨嫷 於旉皜',
+  },
+  batchModal: {
+    title: '鞚缄磩 臧�鞝胳槫旮�',
+    csvUploadTitle: 'CSV 韺岇澕鞚� 鞐赴鞐� 霌滊灅攴� 鞎� 霌滊…頃橁卑雮�,',
+    browse: '彀眷晞氤搓赴',
+    tip: 'CSV 韺岇澕鞚� 雼れ潓 甑“毳� 霐半澕鞎� 頃╇媹雼�:',
+    question: '歆堧',
+    answer: '雼惦硛',
+    contentTitle: '雿╈柎毽� 雮挫毄',
+    content: '雮挫毄',
+    template: '鞐赴靹� 韰滍攲毽� 雼れ毚搿滊摐',
+    cancel: '旆唽',
+    run: '鞚缄磩 鞁ろ枆',
+    runError: '鞚缄磩 鞁ろ枆 鞁ろ尐',
+    processing: '鞚缄磩 觳橂Μ 欷�',
+    completed: '臧�鞝胳槫旮� 鞕勲',
+    error: '臧�鞝胳槫旮� 鞓る',
+    ok: '頇曥澑',
+  },
+  errorMessage: {
+    answerRequired: '雼惦硛鞚� 頃勳垬鞛呺媹雼�',
+    queryRequired: '歆堧鞚� 頃勳垬鞛呺媹雼�',
+  },
+  viewModal: {
+    annotatedResponse: '鞏措吀韰岇澊靺� 雼惦硛',
+    hitHistory: '臁绊殞 旮半',
+    hit: '臁绊殞',
+    hits: '臁绊殞靾�',
+    noHitHistory: '臁绊殞 旮半鞚� 鞐嗢姷雼堧嫟',
+  },
+  hitHistoryTable: {
+    query: '炜茧Μ',
+    match: '鞚检箻',
+    response: '鞚戨嫷',
+    source: '靻岇姢',
+    score: '鞝愳垬',
+    time: '鞁滉皠',
+  },
+  initSetup: {
+    title: '鞏措吀韰岇澊靺� 雼惦硛 齑堦赴 靹れ爼',
+    configTitle: '鞏措吀韰岇澊靺� 雼惦硛 靹れ爼',
+    confirmBtn: '鞝�鞛ロ晿瓿� 頇滌劚頇旐晿旮�',
+    configConfirmBtn: '鞝�鞛�',
+  },
+  embeddingModelSwitchTip: '鞏措吀韰岇澊靺� 韰嶌姢韸胳潣 鞛勲矤霐� 氇嵏鞛呺媹雼�. 氇嵏鞚� 氤�瓴巾晿氅� 雼れ嫓 鞛勲矤霐╇悩氅� 於旉皜 牍勳毄鞚� 氚滌儩頃╇媹雼�.',
+}
+
+export default translation
diff --git a/i18n/ko-KR/app-api.ts b/i18n/ko-KR/app-api.ts
new file mode 100644
index 0000000..810e67a
--- /dev/null
+++ b/i18n/ko-KR/app-api.ts
@@ -0,0 +1,87 @@
+const translation = {
+  apiServer: 'API 靹滊矂',
+  apiKey: 'API 韨�',
+  status: '靸來儨',
+  disabled: '牍勴櫆靹表檾霅�',
+  ok: '靹滊箘鞀� 欷�',
+  copy: '氤奠偓',
+  copied: '氤奠偓 鞕勲',
+  play: '鞁ろ枆',
+  pause: '鞚检嫓 鞝曥',
+  playing: '鞁ろ枆 欷�',
+  loading: '搿滊摐 欷�',
+  merMaid: {
+    rerender: '雼れ嫓 霠岆崝毵�',
+  },
+  never: '鞐嗢潓',
+  apiKeyModal: {
+    apiSecretKey: 'API 牍勲皜 韨�',
+    apiSecretKeyTips: 'API 韨るゼ 氤错樃頃橃棳 API鞚� 雮毄鞚� 氚╈頃橃嫮鞁滌槫. 頂勲煱韸胳棓霌� 旖旊摐鞐愳劀 韽夒鞙茧 靷毄頃橃 毵堨劯鞖�. :)',
+    createNewSecretKey: '靸堧鞖� 牍勲皜 韨� 靸濎劚',
+    secretKey: '牍勲皜 韨�',
+    created: '靸濎劚 雮犾',
+    lastUsed: '斓滌 靷毄 雮犾',
+    generateTips: '鞚� 韨るゼ 鞎堨爠頃橁碃 鞝戧芳 臧�電ロ暅 鞙勳箻鞐� 氤搓磤頃橃嫮鞁滌槫.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: '鞚� 牍勲皜 韨るゼ 靷牅頃橃嫓瓴犾姷雼堦箤?',
+    deleteConfirmTips: '鞚� 鞛戩梾鞚� 旆唽頃� 靾� 鞐嗢姷雼堧嫟.',
+    ok: '頇曥澑',
+  },
+  completionMode: {
+    title: '鞕勳劚 氇摐 API',
+    info: '氍胳劀, 鞖旍暯, 氩堨棴 霌� 瓿犿拡歆� 韰嶌姢韸� 靸濎劚鞚� 鞙勴暣 靷毄鞛� 鞛呺牓鞚� 靷毄頃橂姅 鞕勳劚 氅旍嫓歆� API毳� 靷毄頃╇媹雼�. 韰嶌姢韸� 靸濎劚鞚� Dify Prompt Engineering鞐愳劀 靹れ爼頃� 氇嵏 毵り皽氤�靾橃檧 頂勲‖頂勴姼 韰滍攲毽快棎 鞚橃〈頃╇媹雼�.',
+    createCompletionApi: '鞕勳劚 氅旍嫓歆� 靸濎劚',
+    createCompletionApiTip: '歆堨潣 鞚戨嫷 氇摐毳� 歆�鞗愴晿旮� 鞙勴暣 鞕勳劚 氅旍嫓歆�毳� 靸濎劚頃╇媹雼�.',
+    inputsTips:
+      '(靹犿儩 靷暛) Prompt Eng鞚� 氤�靾橃棎 頃措嫻頃橂姅 韨�-臧� 鞂嶌溂搿� 靷毄鞛� 鞛呺牓 頃勲摐毳� 鞝滉车頃╇媹雼�. 韨る姅 氤�靾� 鞚措鞚搓碃 臧掛潃 毵り皽氤�靾� 臧掛瀰雼堧嫟. 頃勲摐 鞙犿槙鞚� Select鞚� 瓴届毎 鞝勳啞霅橂姅 臧掛潃 氙鸽Μ 靹れ爼霅� 靹犿儩 靷暛 欷� 頃橂倶鞐暭 頃╇媹雼�.',
+    queryTips: '靷毄鞛� 鞛呺牓 韰嶌姢韸� 雮挫毄.',
+    blocking: '敫旊韨� 鞙犿槙鞙茧 鞁ろ枆鞚� 鞕勲霅橁碃 瓴瓣臣臧� 氚橅櫂霅� 霑岅箤歆� 雽�旮绊暕雼堧嫟. (觳橂Μ臧� 鞓る灅 瓯鸽Μ氅� 鞖旍箔鞚� 欷戨嫧霅� 靾� 鞛堨姷雼堧嫟)',
+    streaming: '鞀ろ姼毽皪 氚橅櫂. SSE(Server-Sent Events)毳� 旮半皹鞙茧 頃橂姅 鞀ろ姼毽皪 氚橅櫂 甑槃.',
+    messageFeedbackApi: '氅旍嫓歆� 頂茧摐氚�(膦嬱晞鞖�)',
+    messageFeedbackApiTip: '鞐旊摐 靷毄鞛� 雽�鞁� 靾橃嫚霅� 氅旍嫓歆�毳� "膦嬱晞鞖�" 霕愲姅 "膦嬱晞鞖�"搿� 韽夑皜頃╇媹雼�. 鞚� 雿办澊韯半姅 搿滉犯 氚� 欤检劃 韼橃澊歆�鞐� 響滌嫓霅橂┌ 頄ロ泟 氇嵏 靹鸽秬 臁办爼鞐� 靷毄霅╇媹雼�.',
+    messageIDTip: '氅旍嫓歆� ID',
+    ratingTip: '膦嬱晞鞖� 霕愲姅 膦嬱晞鞖�, null鞚� 旆唽',
+    parametersApi: '鞎犿攲毽紑鞚挫厴 毵り皽氤�靾� 鞝曤炒 臧�鞝胳槫旮�',
+    parametersApiTip: '氤�靾� 鞚措, 頃勲摐 鞚措, 鞙犿槙, 旮半掣臧掛潉 韽暔頃� 靹れ爼霅� 鞛呺牓 毵り皽氤�靾橂ゼ 臧�鞝胳樀雼堧嫟. 鞚茧皹鞝侅溂搿� 鞚措煬頃� 頃勲摐電� 鞏戩嫕鞐� 響滌嫓頃橁卑雮� 韥措澕鞚挫柛韸� 搿滊摐 頉勳棎 旮半掣臧掛潉 鞛呺牓頃橂姅 雿� 靷毄霅╇媹雼�.',
+  },
+  chatMode: {
+    title: '毂勴寘 氇摐 API',
+    info: '歆堨潣 鞚戨嫷 順曥嫕鞚� 靷毄頃橂姅 雼る鞝� 雽�頇旐槙 鞚戩毄 頂勲攴鸽灗鞐愲姅 毂勴寘 氅旍嫓歆� API毳� 順胳稖頃橃棳 雽�頇旊ゼ 鞁滌瀾頃╇媹雼�. 氚橅櫂霅� conversation_id毳� 鞝勲嫭頃橃棳 瓿勳啀霅� 雽�頇旊ゼ 鞙犾頃╇媹雼�. 鞚戨嫷 毵り皽氤�靾� 氚� 韰滍攲毽快潃 Dify Prompt Eng鞚� 靹れ爼鞐� 鞚橃〈頃╇媹雼�.',
+    createChatApi: '毂勴寘 氅旍嫓歆� 靸濎劚',
+    createChatApiTip: '靸堧鞖� 雽�頇� 氅旍嫓歆�毳� 靸濎劚頃橁卑雮� 旮办〈 雽�頇旊ゼ 瓿勳啀頃╇媹雼�.',
+    inputsTips:
+      '(靹犿儩 靷暛) Prompt Eng鞚� 氤�靾橃棎 頃措嫻頃橂姅 韨�-臧� 鞂嶌溂搿� 靷毄鞛� 鞛呺牓 頃勲摐毳� 鞝滉车頃╇媹雼�. 韨る姅 氤�靾� 鞚措鞚搓碃 臧掛潃 毵り皽氤�靾� 臧掛瀰雼堧嫟. 頃勲摐 鞙犿槙鞚� Select鞚� 瓴届毎 鞝勳啞霅橂姅 臧掛潃 氙鸽Μ 靹れ爼霅� 靹犿儩 靷暛 欷� 頃橂倶鞐暭 頃╇媹雼�.',
+    queryTips: '靷毄鞛� 鞛呺牓/歆堧 雮挫毄',
+    blocking: '敫旊韨� 鞙犿槙鞙茧 鞁ろ枆鞚� 鞕勲霅橁碃 瓴瓣臣臧� 氚橅櫂霅� 霑岅箤歆� 雽�旮绊暕雼堧嫟. (觳橂Μ臧� 鞓る灅 瓯鸽Μ氅� 鞖旍箔鞚� 欷戨嫧霅� 靾� 鞛堨姷雼堧嫟)',
+    streaming: '鞀ろ姼毽皪 氚橅櫂. SSE(Server-Sent Events)毳� 旮半皹鞙茧 頃橂姅 鞀ろ姼毽皪 氚橅櫂 甑槃.',
+    conversationIdTip: '(靹犿儩 靷暛) 雽�頇� ID: 觳橃潓 雽�頇旍潣 瓴届毎 牍勳泴霊愱碃, 瓿勳啀霅� 瓴届毎 旎厤鞀ろ姼鞐愳劀 conversation_id毳� 鞝勲嫭頃╇媹雼�.',
+    messageFeedbackApi: '氅旍嫓歆� 頂茧摐氚�(膦嬱晞鞖�)',
+    messageFeedbackApiTip: '鞐旊摐 靷毄鞛� 雽�鞁� 靾橃嫚霅� 氅旍嫓歆�毳� "膦嬱晞鞖�" 霕愲姅 "膦嬱晞鞖�"搿� 韽夑皜頃╇媹雼�. 鞚� 雿办澊韯半姅 搿滉犯 氚� 欤检劃 韼橃澊歆�鞐� 響滌嫓霅橂┌ 頄ロ泟 氇嵏 靹鸽秬 臁办爼鞐� 靷毄霅╇媹雼�.',
+    messageIDTip: '氅旍嫓歆� ID',
+    ratingTip: '膦嬱晞鞖� 霕愲姅 膦嬱晞鞖�, null鞚� 旆唽',
+    chatMsgHistoryApi: '毂勴寘 氅旍嫓歆� 旮半 臧�鞝胳槫旮�',
+    chatMsgHistoryApiTip: '觳� 氩堨Ц 韼橃澊歆�電� 斓滌嫚鞚� "limit" 氚旊ゼ 氚橅櫂頃╇媹雼�. 鞐垳鞛呺媹雼�.',
+    chatMsgHistoryConversationIdTip: '雽�頇� ID',
+    chatMsgHistoryFirstId: '順勳灛 韼橃澊歆�鞚� 觳� 氩堨Ц 毂勴寘 霠堨綌霌滌潣 ID. 旮半掣臧掛潃 鞐嗢潓鞛呺媹雼�.',
+    chatMsgHistoryLimit: '頃� 氩堨棎 氚橅櫂霅橂姅 毂勴寘 靾�',
+    conversationsListApi: '雽�頇� 氇╇ 臧�鞝胳槫旮�',
+    conversationsListApiTip: '順勳灛 靷毄鞛愳潣 靹胳厴 氇╇鞚� 臧�鞝胳樀雼堧嫟. 旮半掣鞝侅溂搿� 斓滉芳 20臧滌潣 靹胳厴鞚� 氚橅櫂霅╇媹雼�.',
+    conversationsListFirstIdTip: '順勳灛 韼橃澊歆�鞚� 毵堨毵� 霠堨綌霌滌潣 ID, 旮半掣臧掛潃 鞐嗢潓鞛呺媹雼�.',
+    conversationsListLimitTip: '頃� 氩堨棎 氚橅櫂霅橂姅 毂勴寘 靾�',
+    conversationRenamingApi: '雽�頇� 鞚措 氤�瓴�',
+    conversationRenamingApiTip: '雽�頇� 鞚措鞚� 氤�瓴巾暕雼堧嫟. 鞚措鞚� 氅�韹� 靹胳厴 韥措澕鞚挫柛韸� 鞚疙劙韼橃澊鞀れ棎 響滌嫓霅╇媹雼�.',
+    conversationRenamingNameTip: '靸� 鞚措',
+    parametersApi: '鞎犿攲毽紑鞚挫厴 毵り皽氤�靾� 鞝曤炒 臧�鞝胳槫旮�',
+    parametersApiTip: '氤�靾� 鞚措, 頃勲摐 鞚措, 鞙犿槙, 旮半掣臧掛潉 韽暔頃� 靹れ爼霅� 鞛呺牓 毵り皽氤�靾橂ゼ 臧�鞝胳樀雼堧嫟. 鞚茧皹鞝侅溂搿� 鞚措煬頃� 頃勲摐電� 鞏戩嫕鞐� 響滌嫓頃橁卑雮� 韥措澕鞚挫柛韸� 搿滊摐 頉勳棎 旮半掣臧掛潉 鞛呺牓頃橂姅 雿� 靷毄霅╇媹雼�.',
+  },
+  develop: {
+    requestBody: '鞖旍箔 氤鸽',
+    pathParams: '瓴诫 毵り皽氤�靾�',
+    query: '炜茧Μ',
+    toc: '氇╈皑',
+  },
+  regenerate: '鞛儩靹�',
+}
+
+export default translation
diff --git a/i18n/ko-KR/app-debug.ts b/i18n/ko-KR/app-debug.ts
new file mode 100644
index 0000000..bafe0bf
--- /dev/null
+++ b/i18n/ko-KR/app-debug.ts
@@ -0,0 +1,418 @@
+const translation = {
+  pageTitle: {
+    line1: '頂勲‖頂勴姼',
+    line2: '鞐旍雼堨柎毵�',
+  },
+  orchestrate: '鞓れ紑鞀ろ姼霠堨澊靺�',
+  promptMode: {
+    simple: '鞝勲臧� 氇摐搿� 鞝勴櫂頃橃棳 鞝勳泊 頂勲‖頂勴姼毳� 韼胳頃╇媹雼�',
+    advanced: '鞝勲臧� 氇摐',
+    switchBack: '旮半掣 氇摐搿� 鞝勴櫂',
+    advancedWarning: {
+      title: '鞝勲臧� 氇摐搿� 鞝勴櫂霅橃棃鞀惦媹雼�. 頂勲‖頂勴姼毳� 氤�瓴巾晿氅� 旮半掣 氇摐搿� 霃岇晞臧� 靾� 鞐嗢姷雼堧嫟.',
+      description: '鞝勲臧� 氇摐鞐愳劀電� 鞝勳泊 頂勲‖頂勴姼毳� 韼胳頃� 靾� 鞛堨姷雼堧嫟.',
+      learnMore: '鞛愳劯頌� 鞎岇晞氤搓赴',
+      ok: '頇曥澑',
+    },
+    operation: {
+      addMessage: '氅旍嫓歆� 於旉皜',
+    },
+    contextMissing: '旎厤鞀ろ姼 旎错彫雱岉姼毳� 彀眷潉 靾� 鞐嗢姷雼堧嫟. 頂勲‖頂勴姼鞚� 須臣臧� 於╇秳頃橃 鞎婌潉 靾� 鞛堨姷雼堧嫟.',
+  },
+  operation: {
+    applyConfig: '氚绊彫',
+    resetConfig: '鞛劋鞝�',
+    debugConfig: '霐旊矂攴�',
+    addFeature: '旮半姤 於旉皜',
+    automatic: '鞛愲彊',
+    stopResponding: '鞚戨嫷 欷戩',
+    agree: '膦嬱晞鞖�',
+    disagree: '鞁柎鞖�',
+    cancelAgree: '膦嬱晞鞖� 旆唽',
+    cancelDisagree: '鞁柎鞖� 旆唽',
+    userAction: '靷毄鞛�',
+  },
+  notSetAPIKey: {
+    title: 'LLM 鞝滉车鞛� 韨り皜 靹れ爼霅橃 鞎婌晿鞀惦媹雼�',
+    trailFinished: '韸鸽澕鞚挫柤 膦呺',
+    description: 'LLM 鞝滉车鞛� 韨り皜 靹れ爼霅橃 鞎婌晿鞀惦媹雼�. 霐旊矂旯呿晿旮� 鞝勳棎 靹れ爼頃挫暭 頃╇媹雼�.',
+    settingBtn: '靹れ爼鞙茧 鞚措彊',
+  },
+  trailUseGPT4Info: {
+    title: '順勳灛 gpt-4電� 歆�鞗愲悩歆� 鞎婌姷雼堧嫟',
+    description: 'gpt-4毳� 靷毄頃橂牑氅� API 韨るゼ 靹れ爼頃挫暭 頃╇媹雼�.',
+  },
+  feature: {
+    groupChat: {
+      title: '毂勴寘 旮半姤 臧曧檾',
+      description: '靷爠 雽�頇� 靹れ爼鞚� 於旉皜頃橂┐ 靷毄鞛� 瓴巾棙鞚� 頄レ儊霅╇媹雼�.',
+    },
+    groupExperience: {
+      title: '瓴巾棙 臧曧檾',
+    },
+    conversationOpener: {
+      title: '雽�頇� 鞁滌瀾',
+      description: '毂勴寘 鞎膘棎靹� AI臧� 靷毄鞛愳棎瓴� 觳橃潓鞙茧 鞝侁饭鞝侅溂搿� 毵愳潉 瓯措嫟氅� 鞚茧皹鞝侅溂搿� 頇橃榿 氅旍嫓歆�搿� 靷毄霅╇媹雼�.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: '韺旊鞖办梾',
+      description: '雼れ潓 歆堧 鞝滌晥鞚� 靹れ爼頃橂┐ 靷毄鞛愳棎瓴� 雿� 雮橃潃 毂勴寘鞚� 鞝滉车霅╇媹雼�.',
+      resDes: '靷毄鞛愳潣 雼れ潓 歆堧鞐� 雽�頃� 3臧�歆� 鞝滌晥.',
+      tryToAsk: '歆堧頃措炒靹胳殧',
+    },
+    moreLikeThis: {
+      title: '鞙犾偓頃� 頃',
+      description: '鞐煬 韰嶌姢韸鸽ゼ 頃� 氩堨棎 靸濎劚頃橁碃 韼胳頃橃棳 瓿勳啀頃挫劀 靸濎劚頃╇媹雼�.',
+      generateNumTip: '靸濎劚 須熿垬',
+      tip: '鞚� 旮半姤鞚� 靷毄頃橂┐ 於旉皜鞝侅澑 韱犿伆 鞓る矂項る摐臧� 氚滌儩頃╇媹雼�',
+    },
+    speechToText: {
+      title: '鞚岇劚鞐愳劀 韰嶌姢韸鸽',
+      description: '頇滌劚頇旐晿氅� 鞚岇劚 鞛呺牓鞚� 靷毄頃� 靾� 鞛堨姷雼堧嫟.',
+      resDes: '鞚岇劚 鞛呺牓鞚� 頇滌劚頇旊悩鞏� 鞛堨姷雼堧嫟',
+    },
+    textToSpeech: {
+      title: '韰嶌姢韸胳棎靹� 鞚岇劚鞙茧',
+      description: '頇滌劚頇旐晿氅� 韰嶌姢韸鸽ゼ 鞚岇劚鞙茧 氤�頇橅暊 靾� 鞛堨姷雼堧嫟.',
+      resDes: '韰嶌姢韸胳棎靹� 鞓る敂鞓る鞚� 氤�頇橃澊 頇滌劚頇旊悩鞏� 鞛堨姷雼堧嫟',
+    },
+    citation: {
+      title: '鞚胳毄 氚� 靻岇湢甓�',
+      description: '頇滌劚頇旐晿氅� 靸濎劚霅� 旖橅厫旄犾潣 靻岇姢 氍胳劀 氚� 靻岇湢甓� 靹轨厴鞚� 響滌嫓霅╇媹雼�.',
+      resDes: '鞚胳毄 氚� 靻岇湢甓岇澊 頇滌劚頇旊悩鞏� 鞛堨姷雼堧嫟',
+    },
+    annotation: {
+      title: '欤检劃 鞚戨嫷',
+      description: '鞙犾偓頃� 靷毄鞛� 歆堧瓿� 鞖办劆 鞚检箻毳� 鞙勴暣 旌愳嫓鞐� 瓿犿拡歆� 鞚戨嫷鞚� 靾橂彊鞙茧 於旉皜頃� 靾� 鞛堨姷雼堧嫟.',
+      resDes: '欤检劃 鞚戨嫷鞚� 頇滌劚頇旊悩鞏� 鞛堨姷雼堧嫟',
+      scoreThreshold: {
+        title: '鞝愳垬 鞛勱硠臧�',
+        description: '欤检劃 鞚戨嫷鞚� 鞙犾偓靹� 鞛勱硠臧掛潉 靹れ爼頃橂姅 雿� 靷毄霅╇媹雼�.',
+        easyMatch: '臧勲嫧頃� 鞚检箻',
+        accurateMatch: '鞝曧檿頃� 鞚检箻',
+      },
+      matchVariable: {
+        title: '毵れ箻 氤�靾�',
+        choosePlaceholder: '毵れ箻 氤�靾� 靹犿儩',
+      },
+      cacheManagement: '欤检劃',
+      cached: '欤检劃鞚� 鞛堧姅',
+      remove: '靷牅',
+      removeConfirm: '鞚� 欤检劃鞚� 靷牅頃橃嫓瓴犾姷雼堦箤?',
+      add: '欤检劃 於旉皜',
+      edit: '欤检劃 韼胳',
+    },
+    dataSet: {
+      title: '旎厤鞀ろ姼',
+      noData: '歆�鞁濎潉 旎厤鞀ろ姼搿� 臧�鞝胳槵 靾� 鞛堨姷雼堧嫟',
+      words: '雼柎',
+      textBlocks: '韰嶌姢韸� 敫旊',
+      selectTitle: '彀胳“頃� 歆�鞁� 靹犿儩',
+      selected: '靹犿儩頃� 歆�鞁�',
+      noDataSet: '歆�鞁濎澊 鞐嗢姷雼堧嫟',
+      toCreate: '靸濎劚頃橁赴',
+      notSupportSelectMulti: '順勳灛 雼れ 靹犿儩鞚� 歆�鞗愲悩歆� 鞎婌姷雼堧嫟',
+      queryVariable: {
+        title: '炜茧Μ 氤�靾�',
+        tip: '鞚� 氤�靾橂姅 旎厤鞀ろ姼 臁绊殞鞐� 靷毄霅橂姅 炜茧Μ 鞛呺牓鞙茧 靷毄霅橂┌, 鞚� 氤�靾� 鞛呺牓鞐� 甏�霠悳 旎厤鞀ろ姼 鞝曤炒毳� 臧�鞝胳樀雼堧嫟.',
+        choosePlaceholder: '炜茧Μ 氤�靾� 靹犿儩',
+        noVar: '氤�靾� 鞐嗢潓',
+        noVarTip: '氤�靾� 靹轨厴 頃橂嫧鞐愳劀 氤�靾橂ゼ 靸濎劚頃橃嫮鞁滌槫',
+        unableToQueryDataSet: '歆�鞁濎潉 炜茧Μ頃� 靾� 鞐嗢潓',
+        unableToQueryDataSetTip: '歆�鞁� 炜茧Μ鞐� 鞁ろ尐頄堨姷雼堧嫟. 鞝曥儊鞝侅溂搿� 炜茧Μ頃� 靾� 鞐嗠姅 瓴届毎, 旎厤鞀ろ姼 靹轨厴鞐愳劀 旎厤鞀ろ姼 炜茧Μ 氤�靾橂ゼ 雼れ嫓 靹犿儩頃橃嫮鞁滌槫.',
+        ok: '頇曥澑',
+        contextVarNotEmpty: '旎厤鞀ろ姼 炜茧Μ 氤�靾橂ゼ 牍勳毟 靾� 鞐嗢姷雼堧嫟',
+        deleteContextVarTitle: '氤�靾� "{{varName}}"毳� 靷牅頃橃嫓瓴犾姷雼堦箤?',
+        deleteContextVarTip: '鞚� 氤�靾橂姅 旎厤鞀ろ姼 炜茧Μ 氤�靾橂 靹れ爼霅橃柎 鞛堨柎 靷牅頃橂┐ 歆�鞁濎潣 鞝曥儊鞝侅澑 靷毄鞐� 鞓來枼鞚� 氙胳供雼堧嫟. 靷牅頃橂牑氅� 旎厤鞀ろ姼 靹轨厴鞐愳劀 雼れ嫓 靹犿儩頃橃嫮鞁滌槫.',
+      },
+    },
+    tools: {
+      title: '霃勱惮',
+      tips: '霃勱惮電� 靷毄鞛� 鞛呺牓鞚措倶 氤�靾橂ゼ 鞖旍箔 毵り皽氤�靾橂 靷毄頃橃棳 鞕鸽秬 雿办澊韯半ゼ 旎厤鞀ろ姼搿� 炜茧Μ頃橂姅 響滌鞝侅澑 API 順胳稖 氚╇矔鞚� 鞝滉车頃╇媹雼�.',
+      toolsInUse: '{{count}}臧滌潣 霃勱惮臧� 靷毄 欷�',
+      modal: {
+        title: '霃勱惮',
+        toolType: {
+          title: '霃勱惮 鞙犿槙',
+          placeholder: '霃勱惮 鞙犿槙 靹犿儩',
+        },
+        name: {
+          title: '鞚措',
+          placeholder: '鞚措 鞛呺牓',
+        },
+        variableName: {
+          title: '氤�靾� 鞚措',
+          placeholder: '氤�靾� 鞚措 鞛呺牓',
+        },
+      },
+    },
+    conversationHistory: {
+      title: '雽�頇� 旮半',
+      description: '雽�頇� 鞐暊鞐� 鞝戨憪靷� 鞚措鞚� 靹れ爼頃╇媹雼�',
+      tip: '雽�頇� 旮半鞚� 頇滌劚頇旊悩鞏� 鞛堨 鞎婌姷雼堧嫟. 鞙勳潣 頂勲‖頂勴姼鞐� <histories>毳� 於旉皜頃橃嫮鞁滌槫.',
+      learnMore: '鞛愳劯頌� 鞎岇晞氤搓赴',
+      editModal: {
+        title: '雽�頇� 鞐暊 鞚措 韼胳',
+        userPrefix: '靷毄鞛� 鞝戨憪靷�',
+        assistantPrefix: '鞏挫嫓鞀ろ劥韸� 鞝戨憪靷�',
+      },
+    },
+    toolbox: {
+      title: '霃勱惮 靸侅瀽',
+    },
+    moderation: {
+      title: '旖橅厫旄� 氇崝霠堨澊靺�',
+      description: '氇崝霠堨澊靺� API毳� 靷毄頃橁卑雮� 旮半皜 雼柎 氇╇鞚� 鞙犾頃溂搿滌崹 氇嵏 於滊牓鞚� 鞎堨爠頃橁矊 頃╇媹雼�.',
+      allEnabled: '鞛呺牓/於滊牓 旖橅厫旄犼皜 氇憪 頇滌劚頇旊悩鞏� 鞛堨姷雼堧嫟',
+      inputEnabled: '鞛呺牓 旖橅厫旄犼皜 頇滌劚頇旊悩鞏� 鞛堨姷雼堧嫟',
+      outputEnabled: '於滊牓 旖橅厫旄犼皜 頇滌劚頇旊悩鞏� 鞛堨姷雼堧嫟',
+      modal: {
+        title: '旖橅厫旄� 氇崝霠堨澊靺� 靹れ爼',
+        provider: {
+          title: '鞝滉车鞛�',
+          openai: 'OpenAI 氇崝霠堨澊靺�',
+          openaiTip: {
+            prefix: 'OpenAI 氇崝霠堨澊靺橃棎電�',
+            suffix: '鞐� OpenAI API 韨り皜 靹れ爼霅橃柎 鞛堨柎鞎� 頃╇媹雼�.',
+          },
+          keywords: '韨れ泴霌�',
+        },
+        keywords: {
+          tip: '頃� 欷勳棎 頃橂倶鞌�, 欷� 氚旉繄鞙茧 鞛呺牓頃橃劯鞖�. 頃� 欷� 雼� 斓滊寑 100鞛�.',
+          placeholder: '頃� 欷勳敥 鞛呺牓頃橃劯鞖�',
+          line: '欷�',
+        },
+        content: {
+          input: '鞛呺牓 旖橅厫旄� 氇崝霠堨澊靺�',
+          output: '於滊牓 旖橅厫旄� 氇崝霠堨澊靺�',
+          preset: '頂勲Μ靺� 鞚戨嫷',
+          placeholder: '頂勲Μ靺� 鞚戨嫷 雮挫毄鞚� 鞛呺牓頃橃劯鞖�',
+          condition: '斓滌唽頃� 頃橂倶鞚� 鞛呺牓 氚� 於滊牓 旖橅厫旄犽ゼ 氇崝霠堨澊靺橅暕雼堧嫟',
+          fromApi: '頂勲Μ靺� 鞚戨嫷鞚� API鞐愳劀 氚橅櫂霅╇媹雼�',
+          errorMessage: '頂勲Μ靺� 鞚戨嫷鞚� 牍勳泴霊� 靾� 鞐嗢姷雼堧嫟',
+          supportMarkdown: '毵堩伂雼れ毚鞚� 歆�鞗愲惄雼堧嫟',
+        },
+        openaiNotConfig: {
+          before: 'OpenAI 氇崝霠堨澊靺橃棎電�',
+          after: '鞐� OpenAI API 韨り皜 靹れ爼霅橃柎 鞛堨柎鞎� 頃╇媹雼�.',
+        },
+      },
+    },
+  },
+  automatic: {
+    title: '鞛愲彊 鞏错攲毽紑鞚挫厴 鞓れ紑鞀ろ姼霠堨澊靺�',
+    description: '鞁滊倶毽槫毳� 靹る獏頃橃劯鞖�. Dify臧� 鞏错攲毽紑鞚挫厴鞚� 鞛愲彊鞙茧 鞓れ紑鞀ろ姼霠堨澊靺� 頃╇媹雼�.',
+    intendedAudience: '雸勱皜 雽�靸侅澊 霅橂姅歆� 靹る獏頃橃劯鞖�.',
+    intendedAudiencePlaceHolder: '鞓�: 頃欖儩',
+    solveProblem: '鞏措枻 氍胳牅毳� AI臧� 頃搓舶頃� 瓴冹溂搿� 鞓堨儊頃橂倶鞖�?',
+    solveProblemPlaceHolder: '鞓�: 頃欖梾 靹膘爜 韽夑皜',
+    generate: '靸濎劚',
+    audiencesRequired: '雽�靸侅澊 頃勳殧頃╇媹雼�',
+    problemRequired: '氍胳牅臧� 頃勳殧頃╇媹雼�',
+    resTitle: '雼れ潓 鞏错攲毽紑鞚挫厴鞚� 鞛愲彊鞙茧 鞓れ紑鞀ろ姼霠堨澊靺� 頄堨姷雼堧嫟.',
+    apply: '鞚� 鞓れ紑鞀ろ姼霠堨澊靺橃潉 鞝侅毄頃橁赴',
+    noData: '鞕检鞐� 靷毄 鞓堨嫓毳� 旮办垹頃橁碃, 鞓れ紑鞀ろ姼霠堨澊靺� 氙鸽Μ氤搓赴臧� 鞐赴鞐� 雮橅儉雮╇媹雼�.',
+    loading: '鞏错攲毽紑鞚挫厴 鞓れ紑鞀ろ姼霠堨澊靺橃潉 鞁ろ枆 欷戩瀰雼堧嫟...',
+    overwriteTitle: '旮办〈 甑劚鞚� 雿柎鞊办嫓瓴犾姷雼堦箤?',
+    overwriteMessage: '鞚� 鞓れ紑鞀ろ姼霠堨澊靺橃潉 鞝侅毄頃橂┐ 旮办〈 甑劚鞚� 雿柎鞊办棳歆戨媹雼�.',
+  },
+  resetConfig: {
+    title: '毽厠鞚� 頇曥澑頃橃嫓瓴犾姷雼堦箤?',
+    message: '氤�瓴� 靷暛鞚� 旆唽霅橁碃, 毵堨毵夓溂搿� 瓿店皽霅� 甑劚鞚� 氤奠洂霅╇媹雼�.',
+  },
+  errorMessage: {
+    nameOfKeyRequired: '韨� 鞚措: {{key}} 鞚� 頃勳殧頃╇媹雼�',
+    valueOfVarRequired: '{{key}}鞚� 臧掛潃 牍勳泴霊� 靾� 鞐嗢姷雼堧嫟',
+    queryRequired: '鞖旍箔 韰嶌姢韸戈皜 頃勳殧頃╇媹雼�.',
+    waitForResponse: '鞚挫爠 氅旍嫓歆�鞐� 雽�頃� 鞚戨嫷鞚� 鞕勲霅� 霑岅箤歆� 旮半嫟霠� 欤检劯鞖�.',
+    waitForBatchResponse: '氚办箻 鞛戩梾鞐� 雽�頃� 鞚戨嫷鞚� 鞕勲霅� 霑岅箤歆� 旮半嫟霠� 欤检劯鞖�.',
+    notSelectModel: '氇嵏鞚� 靹犿儩頃� 欤检劯鞖�',
+    waitForImgUpload: '鞚措歆� 鞐呺霌滉皜 鞕勲霅� 霑岅箤歆� 旮半嫟霠� 欤检劯鞖�',
+  },
+  chatSubTitle: '雼硠',
+  completionSubTitle: '鞝戨憪靷� 頂勲‖頂勴姼',
+  promptTip: '頂勲‖頂勴姼電� AI鞚� 鞚戨嫷鞚� 歆�鞁滍晿瓿� 鞝滍暅頃橃棳 鞙犽弰頃╇媹雼�. {{input}}瓿� 臧欖潃 氤�靾橂ゼ 靷届瀰頃橃劯鞖�. 鞚� 頂勲‖頂勴姼電� 靷毄鞛愳棎瓴� 響滌嫓霅橃 鞎婌姷雼堧嫟.',
+  formattingChangedTitle: '韽Х鞚� 氤�瓴诫悩鞐堨姷雼堧嫟',
+  formattingChangedText: '韽Х鞚� 氤�瓴巾晿氅� 霐旊矂攴� 鞓侅棴鞚� 鞛劋鞝曤惄雼堧嫟. 瓿勳啀頃橃嫓瓴犾姷雼堦箤?',
+  variableTitle: '氤�靾�',
+  variableTip: '靷毄鞛愲姅 鞏戩嫕鞐� 氤�靾橂ゼ 鞛呺牓頃橁碃, 頂勲‖頂勴姼 雮挫潣 氤�靾橁皜 鞛愲彊鞙茧 雽�觳措惄雼堧嫟.',
+  notSetVar: '氤�靾橂ゼ 靷毄頃橂┐ 靷毄鞛愲姅 鞏戩嫕鞐� 鞛呺牓頃� 霑� 頂勲‖頂勴姼鞚� 雼柎雮� 鞁滌瀾 雼柎毳� 靻岅皽頃� 靾� 鞛堨姷雼堧嫟. "{{input}}"鞚� 頂勲‖頂勴姼 雼柎鞐� 鞛呺牓頃� 氤挫劯鞖�.',
+  autoAddVar: '頂勲Μ頂勲‖頂勴姼鞐愳劀 彀胳“霅橂姅 氙胳爼鞚� 氤�靾橁皜 鞛堨姷雼堧嫟. 靷毄鞛� 鞛呺牓 鞏戩嫕鞐� 於旉皜頃橃嫓瓴犾姷雼堦箤?',
+  variableTable: {
+    key: '氤�靾� 韨�',
+    name: '靷毄鞛� 鞛呺牓 頃勲摐氇�',
+    optional: '鞓奠厴',
+    type: '鞛呺牓 韮�鞛�',
+    action: '鞎§厴',
+    typeString: '氍胳瀽鞐�',
+    typeSelect: '靹犿儩',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{key}}臧� 頃勳殧頃╇媹雼�',
+    tooLong: '{{key}}臧� 雱堧 旯侂媹雼�. 30鞛愲ゼ 雱橃潉 靾� 鞐嗢姷雼堧嫟',
+    notValid: '{{key}}臧� 鞙犿毃頃橃 鞎婌姷雼堧嫟. 氍胳瀽, 靾瀽, 氚戩毵� 韽暔頃� 靾� 鞛堨姷雼堧嫟',
+    notStartWithNumber: '{{key}}電� 靾瀽搿� 鞁滌瀾頃� 靾� 鞐嗢姷雼堧嫟',
+    keyAlreadyExists: '{{key}}電� 鞚措 臁挫灛頃╇媹雼�',
+  },
+  otherError: {
+    promptNoBeEmpty: '頂勲‖頂勴姼毳� 牍勳毟 靾� 鞐嗢姷雼堧嫟',
+    historyNoBeEmpty: '頂勲‖頂勴姼鞐� 雽�頇� 旮半鞚� 靹れ爼頃挫暭 頃╇媹雼�',
+    queryNoBeEmpty: '頂勲‖頂勴姼鞐� 炜茧Μ毳� 靹れ爼頃挫暭 頃╇媹雼�',
+  },
+  variableConfig: {
+    'addModalTitle': '鞛呺牓 頃勲摐 於旉皜',
+    'editModalTitle': '鞛呺牓 頃勲摐 韼胳',
+    'description': '{{varName}} 氤�靾� 靹れ爼',
+    'fieldType': '頃勲摐 韮�鞛�',
+    'string': '歆ъ潃 韰嶌姢韸�',
+    'text-input': '歆ъ潃 韰嶌姢韸�',
+    'paragraph': '氍鸽嫧',
+    'select': '靹犿儩',
+    'number': '靾瀽',
+    'notSet': '靹れ爼霅橃 鞎婌潓. 頂勲‖頂勴姼鞚� 頂勲Μ頂届姢鞐� {{input}}鞚� 鞛呺牓頃� 氤挫劯鞖�.',
+    'stringTitle': '韽� 韰嶌姢韸� 靸侅瀽 鞓奠厴',
+    'maxLength': '斓滊寑 旮胳澊',
+    'options': '鞓奠厴',
+    'addOption': '鞓奠厴 於旉皜',
+    'apiBasedVar': 'API 旮半皹 氤�靾�',
+    'varName': '氤�靾橂獏',
+    'labelName': '霠堨澊敫旊獏',
+    'inputPlaceholder': '鞛呺牓頃橃劯鞖�',
+    'required': '頃勳垬',
+    'errorMsg': {
+      varNameRequired: '氤�靾橂獏鞚� 頃勳垬鞛呺媹雼�',
+      labelNameRequired: '霠堨澊敫旊獏鞚� 頃勳垬鞛呺媹雼�',
+      varNameCanBeRepeat: '氤�靾橂獏鞚� 欷戨车霅� 靾� 鞐嗢姷雼堧嫟',
+      atLeastOneOption: '鞝侅柎霃� 頃橂倶鞚� 鞓奠厴鞚� 頃勳殧頃╇媹雼�',
+      optionRepeat: '鞓奠厴鞚� 欷戨车霅橃柎 鞛堨姷雼堧嫟',
+    },
+  },
+  vision: {
+    name: '牍勳爠',
+    description: '牍勳爠鞚� 頇滌劚頇旐晿氅� 氇嵏鞚� 鞚措歆�毳� 氚涭晞鞕� 甏�霠� 歆堧鞐� 雼惦硛頃� 靾� 鞛堨姷雼堧嫟.',
+    settings: '靹れ爼',
+    visionSettings: {
+      title: '牍勳爠 靹れ爼',
+      resolution: '頃挫儊霃�',
+      resolutionTooltip: `鞝�頃挫儊霃勲姅 氇嵏鞐愱矊 512 x 512 頃挫儊霃勳潣 鞝�頃挫儊霃� 鞚措歆�毳� 鞝滉车頃橃棳 65 韱犿伆鞚� 鞓堨偘鞙茧 鞚措歆�毳� 響滍槃頃╇媹雼�. 鞚措 鞚疙暣 API電� 雿� 牍犽ジ 鞚戨嫷鞚� 鞝滉车頃橂┌ 雴掛潃 靹鸽秬 鞝曤炒臧� 頃勳殧頃� 瓴届毎 韱犿伆 靻岆毳� 電橂雼堧嫟.
+      \n
+      瓿犿暣靸侂弰電� 毹检爛 氇嵏鞐愱矊 鞝�頃挫儊霃� 鞚措歆�毳� 氤挫棳欤缄碃, 攴� 頉� 鞛呺牓 鞚措歆� 韥赴鞐� 霐半澕 512px鞚� 鞝曥偓臧來槙 靹鸽秬 靷鞚� 毵岆摥雼堧嫟. 臧� 靹鸽秬 靷鞐� 雽�頃� 129 韱犿伆鞚� 鞓堨偘鞚� 靷毄頃╇媹雼�.`,
+      high: '瓿�',
+      low: '鞝�',
+      uploadMethod: '鞐呺霌� 氚╈嫕',
+      both: '氇憪',
+      localUpload: '搿滌滑 鞐呺霌�',
+      url: 'URL',
+      uploadLimit: '鞐呺霌� 鞝滍暅',
+    },
+  },
+  voice: {
+    name: '鞚岇劚',
+    defaultDisplay: '旮半掣 鞚岇劚',
+    description: '韰嶌姢韸� 鞚疥赴 鞚岇劚 靹れ爼',
+    settings: '靹れ爼',
+    voiceSettings: {
+      title: '鞚岇劚 靹れ爼',
+      language: '鞏胳柎',
+      resolutionTooltip: '韰嶌姢韸� 鞚疥赴 鞚岇劚 鞏胳柎毳� 歆�鞗愴暕雼堧嫟.',
+      voice: '鞚岇劚',
+      autoPlay: '鞛愲彊 鞛儩',
+      autoPlayEnabled: '旒滊嫟',
+      autoPlayDisabled: '韽愳噭',
+    },
+  },
+  openingStatement: {
+    title: '雽�頇� 鞁滌瀾',
+    add: '於旉皜',
+    writeOpener: '鞓ろ攧雱� 鞛戩劚',
+    placeholder: '鞐赴鞐� 鞓ろ攧雱� 氅旍嫓歆�毳� 鞛戩劚頃橃劯鞖�. 氤�靾橂ゼ 靷毄頃� 靾� 鞛堨姷雼堧嫟. {{variable}}毳� 鞛呺牓頃措炒靹胳殧.',
+    openingQuestion: '鞁滌瀾 歆堧',
+    noDataPlaceHolder: '靷毄鞛愳檧鞚� 雽�頇旊ゼ 鞁滌瀾頃橂┐ 雽�頇� 鞎犿攲毽紑鞚挫厴鞐愳劀 攴鸽摛瓿� 雿� 氚�鞝戫暅 甏�瓿勲ゼ 甑稌頃橂姅 雿� 霃勳泙鞚� 霅╇媹雼�.',
+    varTip: '氤�靾橂ゼ 靷毄頃� 靾� 鞛堨姷雼堧嫟. {{variable}}毳� 鞛呺牓頃措炒靹胳殧.',
+    tooShort: '雽�頇� 鞁滌瀾鞐愲姅 斓滌唽 20 雼柎鞚� 齑堦赴 頂勲‖頂勴姼臧� 頃勳殧頃╇媹雼�.',
+    notIncludeKey: '齑堦赴 頂勲‖頂勴姼鞐� 氤�靾� {{key}}臧� 韽暔霅橃柎 鞛堨 鞎婌姷雼堧嫟. 齑堦赴 頂勲‖頂勴姼鞐� 於旉皜頃橃劯鞖�.',
+  },
+  modelConfig: {
+    model: '氇嵏',
+    setTone: '鞚戨嫷 韱� 靹れ爼',
+    title: '氇嵏 氚� 毵り皽氤�靾�',
+    modeType: {
+      chat: '毂勴寘',
+      completion: '鞕勳劚',
+    },
+  },
+  inputs: {
+    title: '霐旊矂攴� 氚� 氙鸽Μ氤搓赴',
+    noPrompt: '頂勲Μ頂勲‖頂勴姼 鞛呺牓霝�鞐� 氇� 臧�歆� 頂勲‖頂勴姼毳� 鞛戩劚頃措炒靹胳殧.',
+    userInputField: '靷毄鞛� 鞛呺牓 頃勲摐',
+    noVar: '氤�靾� 臧掛潉 鞛呺牓頃橃劯鞖�. 靸堧鞖� 靹胳厴鞚� 鞁滌瀾霅� 霑岆雼� 頂勲‖頂勴姼 雼柎臧� 鞛愲彊鞙茧 雽�觳措惄雼堧嫟.',
+    chatVarTip: '氤�靾� 臧掛潉 鞛呺牓頃橃劯鞖�. 靸堧鞖� 靹胳厴鞚� 鞁滌瀾霅� 霑岆雼� 頂勲‖頂勴姼 雼柎臧� 鞛愲彊鞙茧 雽�觳措惄雼堧嫟.',
+    completionVarTip: '氤�靾� 臧掛潉 鞛呺牓頃橃劯鞖�. 歆堧鞚� 鞝勳啞霅� 霑岆雼� 頂勲‖頂勴姼 雼柎臧� 鞛愲彊鞙茧 雽�觳措惄雼堧嫟.',
+    previewTitle: '頂勲‖頂勴姼 氙鸽Μ氤搓赴',
+    queryTitle: '炜茧Μ 雮挫毄',
+    queryPlaceholder: '鞖旍箔 韰嶌姢韸鸽ゼ 鞛呺牓頃橃劯鞖�.',
+    run: '鞁ろ枆',
+  },
+  result: '於滊牓 韰嶌姢韸�',
+  datasetConfig: {
+    settingTitle: '毽姼毽矊 靹れ爼',
+    knowledgeTip: '歆�鞁濎潉 於旉皜頃橂牑氅� "+" 氩勴娂鞚� 韥措Ν頃橃劯鞖�.',
+    retrieveOneWay: {
+      title: 'N-to-1 毽姼毽矊',
+      description: '靷毄鞛� 鞚橂弰鞕� 歆�鞁� 靹る獏鞚� 旮半皹鞙茧, 鞐愳澊鞝勴姼臧� 鞛愳湪鞝侅溂搿� 斓滌爜鞚� 歆�鞁濎潉 靹犿儩頃╇媹雼�. 臧滊硠鞝侅澊瓿� 鞝滍暅霅� 歆�鞁濎潉 臧�歆� 鞎犿攲毽紑鞚挫厴鞐� 鞝來暕頃╇媹雼�.',
+    },
+    retrieveMultiWay: {
+      title: '氅�韹绊尐鞀� 毽姼毽矊',
+      description: '靷毄鞛� 鞚橂弰鞐� 霐半澕 氇摖 歆�鞁濎潉 炜茧Μ頃橁碃, 甏�霠� 韰嶌姢韸鸽ゼ 鞐煬 靻岇姢鞐愳劀 臧�鞝胳檧 雼れ嫓 靾滌渼毳� 毵り复 頉� 靷毄鞛� 炜茧Μ鞐� 臧�鞛� 鞝來暕頃� 瓴瓣臣毳� 靹犿儩頃╇媹雼�. 鞛垳鞙� 氇嵏 API鞚� 甑劚鞚� 頃勳殧頃╇媹雼�.',
+    },
+    rerankModelRequired: '鞛垳鞙� 氇嵏鞚� 頃勳殧頃╇媹雼�',
+    params: '毵り皽氤�靾�',
+    top_k: '靸侅渼 K',
+    top_kTip: '靷毄鞛� 歆堧鞐� 臧�鞛� 鞙犾偓頃� 觳伂毳� 頃勴劙毵來晿電� 雿� 靷毄霅╇媹雼�. 鞁滌姢韰滌潃 靹犿儩頃� 氇嵏鞚� max_tokens鞐� 霐半澕 霃欖爜鞙茧 靸侅渼 K 臧掛潉 臁办爼頃╇媹雼�.',
+    score_threshold: '鞝愳垬 鞛勱硠臧�',
+    score_thresholdTip: '觳伂 頃勴劙毵侅潣 鞙犾偓靹� 鞛勱硠臧掛潉 靹れ爼頃橂姅 雿� 靷毄霅╇媹雼�.',
+    retrieveChangeTip: '鞚鸽嵄鞀� 氇摐 氚� 毽姼毽矊 氇摐毳� 氤�瓴巾晿氅� 鞚� 歆�鞁濌臣 甏�霠悳 鞎犿攲毽紑鞚挫厴鞐� 鞓來枼鞚� 欷� 靾� 鞛堨姷雼堧嫟.',
+  },
+  debugAsSingleModel: '雼澕 氇嵏搿� 霐旊矂攴�',
+  debugAsMultipleModel: '雼れ 氇嵏搿� 霐旊矂攴�',
+  duplicateModel: '氤奠牅',
+  publishAs: '搿� 瓴岇嫓',
+  assistantType: {
+    name: '鞏挫嫓鞀ろ劥韸� 鞙犿槙',
+    chatAssistant: {
+      name: '旮半掣 鞏挫嫓鞀ろ劥韸�',
+      description: '雽�攴滊 鞏胳柎 氇嵏鞚� 靷毄頃橃棳 毂勴寘 旮半皹鞚� 鞏挫嫓鞀ろ劥韸鸽ゼ 甑稌頃╇媹雼�',
+    },
+    agentAssistant: {
+      name: '鞐愳澊鞝勴姼 鞏挫嫓鞀ろ劥韸�',
+      description: '鞛戩梾鞚� 鞛愳湪鞝侅溂搿� 鞕勲頃橁赴 鞙勴暅 霃勱惮毳� 靹犿儩頃� 靾� 鞛堧姅 鞚疙厰毽爠韸� 鞐愳澊鞝勴姼毳� 甑稌頃╇媹雼�',
+    },
+  },
+  agent: {
+    agentMode: '鞐愳澊鞝勴姼 氇摐',
+    agentModeDes: '鞐愳澊鞝勴姼鞚� 於旊 氇摐 鞙犿槙鞚� 靹れ爼頃╇媹雼�',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: '頃垬 順胳稖',
+    },
+    setting: {
+      name: '鞐愳澊鞝勴姼 靹れ爼',
+      description: '鞐愳澊鞝勴姼 鞏挫嫓鞀ろ劥韸� 靹れ爼鞐愳劀電� 鞐愳澊鞝勴姼 氇摐雮� 牍岉姼鞚� 頂勲‖頂勴姼 霌� 瓿犼笁 旮半姤鞚� 靹れ爼頃� 靾� 鞛堨姷雼堧嫟. 鞐愳澊鞝勴姼 鞙犿槙鞐愳劀毵� 靷毄頃� 靾� 鞛堨姷雼堧嫟.',
+      maximumIterations: {
+        name: '斓滊寑 氚橂车 須熿垬',
+        description: '鞐愳澊鞝勴姼 鞏挫嫓鞀ろ劥韸戈皜 鞁ろ枆頃� 靾� 鞛堧姅 氚橂车 須熿垬毳� 鞝滍暅頃╇媹雼�',
+      },
+    },
+    buildInPrompt: '牍岉姼鞚� 頂勲‖頂勴姼',
+    firstPrompt: '觳� 氩堨Ц 頂勲‖頂勴姼',
+    nextIteration: '雼れ潓 氚橂车',
+    promptPlaceholder: '鞐赴鞐� 頂勲‖頂勴姼毳� 鞛呺牓頃橃劯鞖�',
+    tools: {
+      name: '霃勱惮',
+      description: '霃勱惮毳� 靷毄頃橃棳 鞚疙劙雱� 瓴�靸夓澊雮� 瓿柬暀鞝� 瓿勳偘 霌� LLM鞚� 旮半姤鞚� 頇曥灔頃� 靾� 鞛堨姷雼堧嫟',
+      enabled: '頇滌劚頇旊惃',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/ko-KR/app-log.ts b/i18n/ko-KR/app-log.ts
new file mode 100644
index 0000000..4017692
--- /dev/null
+++ b/i18n/ko-KR/app-log.ts
@@ -0,0 +1,99 @@
+const translation = {
+  title: '搿滉犯',
+  description: '搿滉犯電� 鞎犿攲毽紑鞚挫厴 鞁ろ枆 靸來儨毳� 旮半頃╇媹雼�. 靷毄鞛� 鞛呺牓 氚� AI 鞚戨嫷鞚� 韽暔霅╇媹雼�.',
+  dateTimeFormat: 'YYYY/MM/DD HH:mm',
+  table: {
+    header: {
+      updatedTime: '鞐呺嵃鞚错姼 鞁滉皠',
+      time: '靸濎劚 鞁滉皠',
+      endUser: '鞐旊摐 鞙犾爛 霕愲姅 瓿勳爼',
+      input: '鞛呺牓',
+      output: '於滊牓',
+      summary: '鞖旍暯',
+      messageCount: '氅旍嫓歆� 靾�',
+      userRate: '靷毄鞛� 牍勳湪',
+      adminRate: '甏�毽瀽 牍勳湪',
+      startTime: '鞁滌瀾 鞁滉皠',
+      status: '靸來儨',
+      runtime: '鞁ろ枆 鞁滉皠',
+      tokens: '韱犿伆',
+      user: '鞐旊摐 鞙犾爛 霕愲姅 瓿勳爼',
+      version: '氩勳爠',
+    },
+    pagination: {
+      previous: '鞚挫爠',
+      next: '雼れ潓',
+    },
+    empty: {
+      noChat: '鞎勳 雽�頇旉皜 鞐嗢姷雼堧嫟',
+      noOutput: '於滊牓鞚� 鞐嗢姷雼堧嫟',
+      element: {
+        title: '鞐赴 雸勱惮 鞛堨柎鞖�?',
+        content:
+          '鞐赴鞐愳劀 鞐旊摐 鞙犾爛鞕� AI 鞎犿攲毽紑鞚挫厴 臧� 靸來樃 鞛戩毄鞚� 甏�彀绊晿瓿� 欤检劃鞚� 雼晞 AI 鞝曧檿霃勲ゼ 瓿勳啀 頄レ儊鞁滍偟雼堧嫟. 鞗� 鞎膘潉 <shareLink>瓿奠湢</shareLink>頃橁卑雮� <testLink>韰岇姢韸�</testLink>頃橁碃 雼れ嫓 鞚� 韼橃澊歆�搿� 霃岇晞鞓れ劯鞖�.',
+      },
+    },
+  },
+  detail: {
+    time: '鞁滉皠',
+    conversationId: '雽�頇� ID',
+    promptTemplate: '頂勲‖頂勴姼 韰滍攲毽�',
+    promptTemplateBeforeChat: '毂勴寘 鞝� 頂勲‖頂勴姼 韰滍攲毽� - 鞁滌姢韰� 氅旍嫓歆�搿�',
+    annotationTip: '{{user}}鞐� 鞚橅暣 頄レ儊霅�',
+    timeConsuming: '鞁滉皠 靻岇殧',
+    second: '齑�',
+    tokenCost: '韱犿伆 牍勳毄',
+    loading: '搿滊摐 欷�',
+    operation: {
+      like: '膦嬱晞鞖�',
+      dislike: '膦嬱晞鞖� 旆唽',
+      addAnnotation: '頄レ儊 於旉皜',
+      editAnnotation: '頄レ儊 韼胳',
+      annotationPlaceholder: 'AI臧� 鞚戨嫷頃� 瓴冹溂搿� 鞓堨儊頃橂姅 雼惦硛鞚� 鞛呺牓頃橃棳 頄ロ泟 氇嵏 靹鸽秬 臁办爼 氚� 韰嶌姢韸� 靸濎劚 頀堨 歆�靻嶌爜 頄レ儊鞚� 鞙勴暣 臧滌劆頃� 靾� 鞛堨姷雼堧嫟.',
+    },
+    variables: '氤�靾�',
+    uploadImages: '鞐呺霌滊悳 鞚措歆�',
+    modelParams: '氇嵏 毵り皽 氤�靾�',
+  },
+  filter: {
+    period: {
+      today: '鞓る姌',
+      last7days: '歆�雮� 7鞚�',
+      last4weeks: '歆�雮� 4欤�',
+      last3months: '歆�雮� 3臧滌洈',
+      last12months: '歆�雮� 12臧滌洈',
+      monthToDate: '鞗� 齑堧秬韯� 鞓る姌旯岇',
+      quarterToDate: '攵勱赴 齑堧秬韯� 鞓る姌旯岇',
+      yearToDate: '鞐� 齑堧秬韯� 鞓る姌旯岇',
+      allTime: '氇摖 旮瓣皠',
+    },
+    annotation: {
+      all: '氇憪',
+      annotated: '頄レ儊 欤检劃 ({{count}} 臧� 頃)',
+      not_annotated: '欤检劃 鞐嗢潓',
+    },
+    sortBy: '鞝曤牞 旮办:',
+    descending: '雮措彀垳',
+    ascending: '鞓る彀垳',
+  },
+  workflowTitle: '鞗岉伂頂岆鞖� 搿滉犯',
+  workflowSubtitle: '鞚� 搿滉犯電� Automate鞚� 鞛戩梾鞚� 旮半頄堨姷雼堧嫟.',
+  runDetail: {
+    title: '雽�頇� 搿滉犯',
+    workflowTitle: '搿滉犯 靹鸽秬 鞝曤炒',
+    fileListDetail: '靹鸽秬',
+    fileListLabel: '韺岇澕 靹鸽秬 鞝曤炒',
+  },
+  promptLog: '頂勲‖頂勴姼 搿滉犯',
+  agentLog: '鞐愳澊鞝勴姼 搿滉犯',
+  viewLog: '搿滉犯 氤搓赴',
+  agentLogDetail: {
+    agentMode: '鞐愳澊鞝勴姼 氇摐',
+    toolUsed: '靷毄霅� 霃勱惮',
+    iterations: '氚橂车',
+    iteration: '氚橂车',
+    finalProcessing: '斓滌 觳橂Μ',
+  },
+}
+
+export default translation
diff --git a/i18n/ko-KR/app-overview.ts b/i18n/ko-KR/app-overview.ts
new file mode 100644
index 0000000..be6e511
--- /dev/null
+++ b/i18n/ko-KR/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: '鞁滌瀾頃橂牑氅�,',
+    enterKeyTip: '鞎勲灅鞐� OpenAI API 韨るゼ 鞛呺牓頃橃劯鞖�',
+    getKeyTip: 'OpenAI 雽�鞁滊炒霌滌棎靹� API 韨るゼ 臧�鞝胳槫靹胳殧',
+    placeholder: '雮橃潣 OpenAI API 韨� (鞓�: sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: '{{providerName}} 韸鸽澕鞚挫柤 炜柬劙毳� 靷毄 欷戩瀰雼堧嫟.',
+        description: '韸鸽澕鞚挫柤 炜柬劙電� 韰岇姢韸胳毄鞙茧 鞝滉车霅╇媹雼�. 韸鸽澕鞚挫柤 炜柬劙 靻岇 鞝勳棎 瓿犾湢頃� 氇嵏 鞝滉车鞛愲ゼ 靹れ爼頃橁卑雮� 於旉皜 炜柬劙毳� 甑Г頃橃劯鞖�.',
+      },
+      exhausted: {
+        title: '韸鸽澕鞚挫柤 炜柬劙臧� 靻岇霅橃棃鞀惦媹雼�. API 韨るゼ 靹れ爼頃橃劯鞖�.',
+        description: '韸鸽澕鞚挫柤 炜柬劙臧� 靻岇霅橃棃鞀惦媹雼�. 瓿犾湢頃� 氇嵏 鞝滉车鞛愲ゼ 靹れ爼頃橁卑雮� 於旉皜 炜柬劙毳� 甑Г頃橃劯鞖�.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: '鞁滌瀾頃橂牑氅�,',
+        row2: '毹检爛 氇嵏 鞝滉车鞛愲ゼ 靹れ爼頃橃劯鞖�.',
+      },
+    },
+    callTimes: '鞖旍箔 須熿垬',
+    usedToken: '靷毄霅� 韱犿伆',
+    setAPIBtn: '氇嵏 鞝滉车鞛� 靹れ爼鞙茧 鞚措彊',
+    tryCloud: '霕愲姅 Dify鞚� 韥措澕鞖半摐 氩勳爠鞚� 氍措搿� 觳错棙頃措炒靹胳殧',
+  },
+  overview: {
+    title: '臧滌殧',
+    appInfo: {
+      explanation: '靷毄頃橁赴 靿毚 AI 鞗轨暠',
+      accessibleAddress: '瓿店皽 URL',
+      preview: '氙鸽Μ氤搓赴',
+      regenerate: '鞛儩靹�',
+      regenerateNotice: '瓿店皽 URL鞚� 鞛儩靹表晿鞁滉矤鞀惦媹旯�?',
+      preUseReminder: '瓿勳啀頃橁赴 鞝勳棎 鞗轨暠鞚� 頇滌劚頇旐晿靹胳殧.',
+      settings: {
+        entry: '靹れ爼',
+        title: '鞗轨暠 靹れ爼',
+        webName: '鞗轨暠 鞚措',
+        webDesc: '鞗轨暠 靹る獏',
+        webDescTip: '鞚� 韰嶌姢韸鸽姅 韥措澕鞚挫柛韸� 旄§棎靹� 響滌嫓霅橂┌, 鞎犿攲毽紑鞚挫厴鞚� 靷毄 氚╇矔鞐� 雽�頃� 旮半掣鞝侅澑 鞎堧偞毳� 鞝滉车頃╇媹雼�.',
+        webDescPlaceholder: '鞗轨暠 靹る獏鞚� 鞛呺牓頃橃劯鞖�',
+        language: '鞏胳柎',
+        workflow: {
+          title: '鞗岉伂頂岆 雼硠',
+          show: '響滌嫓',
+          hide: '靾赴旮�',
+          showDesc: 'WebApp鞐愳劀 鞗岉伂頂岆 靹鸽秬 鞝曤炒 響滌嫓 霕愲姅 靾赴旮�',
+          subTitle: '鞗岉伂頂岆鞖� 靹鸽秬 鞝曤炒',
+        },
+        chatColorTheme: '毂楇磭 靸夓儊 韰岆',
+        chatColorThemeDesc: '毂楇磭鞚� 靸夓儊 韰岆毳� 靹れ爼頃橃劯鞖�',
+        chatColorThemeInverted: '氚橃爠',
+        invalidHexMessage: '鞛橂霅� 16歆勳垬 臧�',
+        invalidPrivacyPolicy: '鞙犿毃頃橃 鞎婌潃 臧滌澑鞝曤炒觳橂Μ氚╈龚 毵來伂鞛呺媹雼�. http 霕愲姅 https搿� 鞁滌瀾頃橂姅 鞙犿毃頃� 毵來伂毳� 靷毄頃� 欤检劯鞖�',
+        more: {
+          entry: '於旉皜 靹れ爼 氤搓赴',
+          copyright: '鞝�鞛戧秾',
+          copyRightPlaceholder: '鞝�鞛戧秾鞛� 霕愲姅 臁办 鞚措鞚� 鞛呺牓頃橃劯鞖�',
+          privacyPolicy: '臧滌澑鞝曤炒 觳橂Μ氚╈龚',
+          privacyPolicyPlaceholder: '臧滌澑鞝曤炒 觳橂Μ氚╈龚 毵來伂毳� 鞛呺牓頃橃劯鞖�',
+          privacyPolicyTip: '氚╇鞛愱皜 鞎犿攲毽紑鞚挫厴鞚� 靾橃頃橂姅 雿办澊韯半ゼ 鞚错暣頃橁碃, Dify鞚� <privacyPolicyLink>臧滌澑鞝曤炒 觳橂Μ氚╈龚</privacyPolicyLink>鞚� 彀胳“頃� 靾� 鞛堧弰搿� 頃╇媹雼�.',
+          customDisclaimer: '靷毄鞛� 歆�鞝� 氅挫眳 臁绊暛',
+          customDisclaimerPlaceholder: '靷毄鞛� 歆�鞝� 氅挫眳 臁绊暛 韰嶌姢韸鸽ゼ 鞛呺牓頃╇媹雼�.',
+          customDisclaimerTip: '靷毄鞛� 歆�鞝� 瓿犾 靷暛 韰嶌姢韸鸽姅 韥措澕鞚挫柛韸� 飒届棎 響滌嫓霅橃柎 鞚戩毄 頂勲攴鸽灗鞐� 雽�頃� 於旉皜 鞝曤炒毳� 鞝滉车頃╇媹雼�',
+          copyrightTip: '鞗轨暠鞐� 鞝�鞛戧秾 鞝曤炒 響滌嫓',
+          copyrightTooltip: '頂勲韼橃厰雱� 頂岆灉 鞚挫儊鞙茧 鞐呹犯霠堨澊霌滍晿靹胳殧.',
+        },
+        sso: {
+          label: 'SSO 鞚胳',
+          title: '鞗轨暠 SSO',
+          tooltip: '甏�毽瀽鞐愱矊 氍胳潣頃橃棳 WebApp SSO毳� 靷毄頃橂弰搿� 靹れ爼頃╇媹雼�.',
+          description: '氇摖 靷毄鞛愲姅 WebApp鞚� 靷毄頃橁赴 鞝勳棎 SSO搿� 搿滉犯鞚疙暣鞎� 頃╇媹雼�.',
+        },
+        modalTip: '韥措澕鞚挫柛韸� 飒� 鞗轨暠 靹れ爼.',
+      },
+      embedded: {
+        entry: '鞛勲矤霌�',
+        title: '鞗轨偓鞚错姼鞐� 鞛勲矤霌滍晿旮�',
+        explanation: '毂楇磭 鞎膘潉 鞗轨偓鞚错姼鞐� 鞛勲矤霌滍晿電� 氚╇矔鞚� 靹犿儩頃橃劯鞖�.',
+        iframe: '鞗轨偓鞚错姼鞚� 鞗愴晿電� 鞙勳箻鞐� 毂楇磭 鞎膘潉 於旉皜頃橂牑氅� 鞚� iframe鞚� HTML 旖旊摐鞐� 於旉皜頃橃劯鞖�.',
+        scripts: '鞗轨偓鞚错姼鞚� 鞖办浮 頃橂嫧鞐� 毂楇磭 鞎膘潉 於旉皜頃橂牑氅� 鞚� 旖旊摐毳� HTML鞐� 於旉皜頃橃劯鞖�.',
+        chromePlugin: 'Dify Chatbot Chrome 頇曥灔 頂勲攴鸽灗 靹れ箻',
+        copied: '氤奠偓霅橃棃鞀惦媹雼�',
+        copy: '氤奠偓',
+      },
+      qrcode: {
+        title: '瓿奠湢鞖� QR 旖旊摐',
+        scan: '鞎� 瓿奠湢毳� 鞀れ簲頃橃劯鞖�',
+        download: 'QR 旖旊摐 雼れ毚搿滊摐',
+      },
+      customize: {
+        way: '氚╇矔',
+        entry: '靷毄鞛愴檾',
+        title: 'AI 鞗轨暠 靷毄鞛愴檾',
+        explanation: '鞁滊倶毽槫鞕� 鞀ろ儉鞚� 鞖旉惮鞐� 霐半澕 鞗轨暠鞚� 頂勲韸胳棓霌滊ゼ 靷毄鞛愴檾頃� 靾� 鞛堨姷雼堧嫟.',
+        way1: {
+          name: '韥措澕鞚挫柛韸� 旖旊摐毳� 韽伂頃橃棳 靾橃爼頃橁碃 Vercel鞐� 氚绊彫頃橁赴 (甓岇灔)',
+          step1: '韥措澕鞚挫柛韸� 旖旊摐毳� 韽伂頃橃棳 靾橃爼頃╇媹雼�',
+          step1Tip: '鞐赴毳� 韥措Ν頃橃棳 靻岇姢 旖旊摐毳� GitHub 瓿勳爼鞐� 韽伂頃橁碃 旖旊摐毳� 靾橃爼頃橃劯鞖�',
+          step1Operation: 'Dify-WebClient',
+          step2: 'Vercel鞐� 氚绊彫頃╇媹雼�',
+          step2Tip: '鞐赴毳� 韥措Ν頃橃棳 毽彫歆�韱犽Μ毳� Vercel鞐� 鞛勴彫韸疙晿瓿� 氚绊彫頃橃劯鞖�',
+          step2Operation: '毽彫歆�韱犽Μ 鞛勴彫韸�',
+          step3: '頇橁步 氤�靾橂ゼ 靹れ爼頃╇媹雼�',
+          step3Tip: 'Vercel鞐� 雼れ潓 頇橁步 氤�靾橂ゼ 於旉皜頃橃劯鞖�',
+        },
+        way2: {
+          name: '韥措澕鞚挫柛韸� 旄� 旖旊摐毳� 鞛戩劚頃橃棳 API毳� 順胳稖頃橁碃 靹滊矂鞐� 氚绊彫頃╇媹雼�',
+          operation: '氍胳劀',
+        },
+      },
+      launch: '氚滌偓',
+    },
+    apiInfo: {
+      title: '氚膘棓霌� 靹滊箘鞀� API',
+      explanation: '臧滊皽鞛愳潣 鞎犿攲毽紑鞚挫厴鞐� 靿疥矊 韱淀暕頃� 靾� 鞛堨姷雼堧嫟',
+      accessibleAddress: '靹滊箘鞀� API 鞐旊摐韽澑韸�',
+      doc: 'API 霠堩嵓霟办姢',
+    },
+    status: {
+      running: '靹滊箘鞀� 欷�',
+      disable: '牍勴櫆靹�',
+    },
+  },
+  analysis: {
+    title: '攵勳劃',
+    ms: 'ms',
+    tokenPS: '韱犿伆/齑�',
+    totalMessages: {
+      title: '齑� 氅旍嫓歆� 靾�',
+      explanation: '鞚检澕 AI 靸來樃鞛戩毄 靾�.',
+    },
+    totalConversations: {
+      title: '齑� 雽�頇� 靾�',
+      explanation: '鞚检澕 AI 雽�頇� 靾�; 頂勲‖頂勴姼 鞐旍雼堨柎毵�/霐旊矂旯� 鞝滌櫢.',
+    },
+    activeUsers: {
+      title: '頇滌劚 靷毄鞛� 靾�',
+      explanation: 'AI鞕�鞚� Q&A鞐� 彀胳棳頃橂姅 瓿犾湢 靷毄鞛� 靾�; 鞐旍雼堨柎毵�/霐旊矂旯� 氇╈爜鞚� 頂勲‖頂勴姼電� 鞝滌櫢霅╇媹雼�.',
+    },
+    tokenUsage: {
+      title: '韱犿伆 靷毄霟�',
+      explanation: '鞎犿攲毽紑鞚挫厴鞚� 鞏胳柎 氇嵏鞚� 鞚检澕 韱犿伆 靷毄霟夓潉 氚橃榿頃橃棳 牍勳毄 甏�毽棎 霃勳泙鞚� 霅╇媹雼�.',
+      consumed: '靻岆箘霅� 韱犿伆',
+    },
+    avgSessionInteractions: {
+      title: '韽夑窢 靹胳厴 靸來樃鞛戩毄 靾�',
+      explanation: '靷毄鞛愳檧 AI鞚� 鞐办啀鞝侅澑 旎る雼堨紑鞚挫厴 靾�; 雽�頇旐槙 鞎犿攲毽紑鞚挫厴鞚� 鞙勴暅 瓴冹瀰雼堧嫟.',
+    },
+    avgUserInteractions: {
+      title: '韽夑窢 靷毄鞛� 靸來樃鞛戩毄 靾�',
+      explanation: '靷毄鞛愳潣 鞚检澕 靷毄 牍堧弰毳� 氚橃榿頃╇媹雼�. 鞚� 歆�響滊姅 靷毄鞛愳潣 鞛勱硠毳� 氚橃榿頃╇媹雼�.',
+    },
+    userSatisfactionRate: {
+      title: '靷毄鞛� 毵岇”霃勳湪',
+      explanation: '1,000臧滌潣 氅旍嫓歆� 雼� "膦嬱晞鞖�" 靾橃瀰雼堧嫟. 鞚措姅 靷毄鞛愱皜 毵れ毎 毵岇”頃� 鞚戨嫷鞚� 牍勳湪鞚� 雮橅儉雰呺媹雼�.',
+    },
+    avgResponseTime: {
+      title: '韽夑窢 鞚戨嫷 鞁滉皠',
+      explanation: 'AI臧� 觳橂Μ/鞚戨嫷頃橂姅 鞁滉皠(氚�毽磮); 韰嶌姢韸� 旮半皹 鞎犿攲毽紑鞚挫厴鞚� 鞙勴暅 瓴冹瀰雼堧嫟.',
+    },
+    tps: {
+      title: '韱犿伆 於滊牓 靻嶋弰',
+      explanation: 'LLM鞚� 靹彪姤鞚� 旄§爼頃╇媹雼�. 鞖旍箔 鞁滌瀾攵�韯� 於滊牓 鞕勲旯岇鞚� LLM鞚� 韱犿伆 於滊牓 靻嶋弰毳� 瓿勳偘頃╇媹雼�.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/ko-KR/app.ts b/i18n/ko-KR/app.ts
new file mode 100644
index 0000000..aac1cb2
--- /dev/null
+++ b/i18n/ko-KR/app.ts
@@ -0,0 +1,210 @@
+const translation = {
+  createApp: '鞎� 毵岆摛旮�',
+  types: {
+    all: '氇憪',
+    chatbot: '毂楇磭',
+    agent: '鞐愳澊鞝勴姼',
+    workflow: '鞗岉伂頂岆鞖�',
+    completion: '鞕勳劚',
+    basic: '旮办磮鞚�',
+    advanced: '毂勴寘 頂岆鞖�',
+  },
+  duplicate: '氤奠牅',
+  duplicateTitle: '鞎� 氤奠牅頃橁赴',
+  export: 'DSL 雮措炒雮搓赴',
+  exportFailed: 'DSL 雮措炒雮搓赴 鞁ろ尐',
+  importDSL: 'DSL 韺岇澕 臧�鞝胳槫旮�',
+  createFromConfigFile: 'DSL 韺岇澕鞐愳劀 靸濎劚頃橁赴',
+  deleteAppConfirmTitle: '鞚� 鞎膘潉 靷牅頃橃嫓瓴犾姷雼堦箤?',
+  deleteAppConfirmContent: '鞎膘潉 靷牅頃橂┐ 氤店惮頃� 靾� 鞐嗢姷雼堧嫟. 靷毄鞛愲姅 雿� 鞚挫儊 鞎膘棎 鞎§劯鞀ろ暊 靾� 鞐嗢溂氅� 氇摖 頂勲‖頂勴姼 靹れ爼 氚� 搿滉犯臧� 鞓侁惮鞝侅溂搿� 靷牅霅╇媹雼�.',
+  appDeleted: '鞎膘澊 靷牅霅橃棃鞀惦媹雼�',
+  appDeleteFailed: '鞎� 靷牅 鞁ろ尐',
+  join: '旎る雼堩嫲鞐� 彀胳棳頃橁赴',
+  communityIntro: '鞐煬 毂勲剱鞐愳劀 韺�鞗�, 旮办棳鞛�, 臧滊皽鞛愲摛瓿� 韱犽頃橃劯鞖�.',
+  roadmap: '搿滊摐毵� 氤搓赴',
+  newApp: {
+    startFromBlank: '牍� 靸來儨搿� 鞁滌瀾',
+    startFromTemplate: '韰滍攲毽快棎靹� 鞁滌瀾',
+    captionAppType: '鞏措枻 膦呺鞚� 鞎膘潉 毵岆摛鞏� 氤挫嫓瓴犾柎鞖�?',
+    chatbotDescription: '雽�頇旐槙 鞏错攲毽紑鞚挫厴鞚� 毵岆摥雼堧嫟. 歆堧瓿� 雼惦硛 順曥嫕鞚� 靷毄頃橃棳 雼る嫧瓿� 雽�頇旊ゼ 歆�鞗愴暕雼堧嫟.',
+    completionDescription: '頂勲‖頂勴姼毳� 旮半皹鞙茧 頀堨 雴掛潃 韰嶌姢韸鸽ゼ 靸濎劚頃橂姅 鞏错攲毽紑鞚挫厴鞚� 毵岆摥雼堧嫟. 旮办偓, 鞖旍暯, 氩堨棴 霌膘潉 靸濎劚頃� 靾� 鞛堨姷雼堧嫟.',
+    completionWarning: '鞚� 膦呺鞚� 鞎膘潃 雿� 鞚挫儊 歆�鞗愲悩歆� 鞎婌姷雼堧嫟.',
+    agentDescription: '鞛戩梾鞚� 鞛愲彊鞙茧 鞕勲頃橂姅 歆�電ロ槙 鞐愳澊鞝勴姼毳� 毵岆摥雼堧嫟.',
+    workflowDescription: '瓿犽弰搿� 靷毄鞛� 歆�鞝� 臧�電ロ暅 鞗岉伂頂岆鞖办棎 旮半皹頃� 瓿犿拡歆� 韰嶌姢韸� 靸濎劚 鞏错攲毽紑鞚挫厴鞚� 毵岆摥雼堧嫟. 瓴巾棙 鞛堧姅 靷毄鞛愲ゼ 鞙勴暅 瓴冹瀰雼堧嫟.',
+    workflowWarning: '順勳灛 氩犿儉 氩勳爠鞛呺媹雼�.',
+    chatbotType: '毂楇磭 鞓れ紑鞀ろ姼霠堨澊靺� 氚╈嫕',
+    basic: '旮半掣',
+    basicTip: '齑堧炒鞛愳毄. 雮橃鞐� Chatflow搿� 鞝勴櫂頃� 靾� 鞛堨姷雼堧嫟.',
+    basicFor: '齑堧炒鞛愳毄',
+    basicDescription: '旮半掣 鞓れ紑鞀ろ姼霠堨澊靺橃潃 雮挫灔霅� 頂勲‖頂勴姼毳� 靾橃爼頃� 靾� 鞐嗞碃 臧勲嫧頃� 靹れ爼鞚� 靷毄頃橃棳 毂楇磭 鞎膘潉 鞓れ紑鞀ろ姼霠堨澊靺橅暕雼堧嫟. 齑堧炒鞛愳毄鞛呺媹雼�.',
+    advanced: 'Chatflow',
+    advancedFor: '瓿犼笁 靷毄鞛愳毄',
+    advancedDescription: '鞗岉伂頂岆鞖� 鞓れ紑鞀ろ姼霠堨澊靺橃潃 鞗岉伂頂岆鞖� 順曥嫕鞙茧 毂楇磭鞚� 鞓れ紑鞀ろ姼霠堨澊靺橅晿氅� 雮挫灔霅� 頂勲‖頂勴姼毳� 韼胳頃� 靾� 鞛堧姅 瓿犼笁 靷毄鞛� 鞝曥潣 旮半姤鞚� 鞝滉车頃╇媹雼�. 瓴巾棙鞚� 毵庫潃 靷毄鞛愳毄鞛呺媹雼�.',
+    captionName: '鞎� 鞎勳澊旖橁臣 鞚措',
+    appNamePlaceholder: '鞎� 鞚措鞚� 鞛呺牓頃橃劯鞖�',
+    captionDescription: '靹る獏',
+    appDescriptionPlaceholder: '鞎� 靹る獏鞚� 鞛呺牓頃橃劯鞖�',
+    useTemplate: '鞚� 韰滍攲毽� 靷毄',
+    previewDemo: '雿半 氙鸽Μ氤搓赴',
+    chatApp: '鞏挫嫓鞀ろ劥韸�',
+    chatAppIntro: '雽�頇旐槙 鞏错攲毽紑鞚挫厴鞚� 毵岆摛瓿� 鞁鹅柎鞖�. 鞚� 鞏错攲毽紑鞚挫厴鞚� 歆堧瓿� 雼惦硛 順曥嫕鞚� 靷毄頃橃棳 雼る嫧瓿� 雽�頇旊ゼ 歆�鞗愴暕雼堧嫟.',
+    agentAssistant: '靸堧鞖� 鞐愳澊鞝勴姼 鞏挫嫓鞀ろ劥韸�',
+    completeApp: '韰嶌姢韸� 靸濎劚旮�',
+    completeAppIntro: '頂勲‖頂勴姼毳� 旮半皹鞙茧 頀堨 雴掛潃 韰嶌姢韸鸽ゼ 靸濎劚頃橂姅 鞏错攲毽紑鞚挫厴鞚� 毵岆摛瓿� 鞁鹅柎鞖�. 旮办偓, 鞖旍暯, 氩堨棴 霌膘潉 靸濎劚頃╇媹雼�.',
+    showTemplates: '韰滍攲毽� 靹犿儩',
+    hideTemplates: '氇摐 靹犿儩鞙茧 霃岇晞臧�旮�',
+    Create: '毵岆摛旮�',
+    Cancel: '旆唽',
+    nameNotEmpty: '鞚措鞚� 鞛呺牓頃橃劯鞖�',
+    appTemplateNotSelected: '韰滍攲毽快潉 靹犿儩頃橃劯鞖�',
+    appTypeRequired: '鞎� 膦呺毳� 靹犿儩頃橃劯鞖�',
+    appCreated: '鞎膘澊 靸濎劚霅橃棃鞀惦媹雼�',
+    appCreateFailed: '鞎� 靸濎劚 鞁ろ尐',
+    caution: '欤检潣',
+    Confirm: '頇曥澑頃橂嫟',
+    appCreateDSLErrorPart4: '鞁滌姢韰� 歆�鞗� DSL 氩勳爠:',
+    appCreateDSLErrorTitle: '氩勳爠 牍勴樃頇橃劚',
+    appCreateDSLErrorPart2: '瓿勳啀頃橃嫓瓴犾姷雼堦箤?',
+    appCreateDSLErrorPart3: '順勳灛 鞚戩毄 頂勲攴鸽灗 DSL 氩勳爠:',
+    appCreateDSLWarning: '欤检潣: DSL 氩勳爠 彀澊電� 韸轨爼 旮半姤鞐� 鞓來枼鞚� 氙胳範 靾� 鞛堨姷雼堧嫟.',
+    appCreateDSLErrorPart1: 'DSL 氩勳爠鞐愳劀 靸侂嫻頃� 彀澊臧� 臧愳霅橃棃鞀惦媹雼�. 臧曥牅搿� 臧�鞝胳槫氅� 鞚戩毄 頂勲攴鸽灗鞚� 鞓れ瀾霃欗暊 靾� 鞛堨姷雼堧嫟.',
+    chooseAppType: '鞎� 鞙犿槙 靹犿儩',
+    forBeginners: '齑堧炒鞛愳毄',
+    forAdvanced: '瓿犼笁 靷毄鞛愳毄',
+    chatbotShortDescription: '臧勲嫧頃� 靹れ爼鞙茧 LLM 旮半皹 毂楇磭',
+    workflowUserDescription: '鞛愲彊頇� 氚� 氚办箻 觳橂Μ鞕� 臧欖潃 雼澕 霛检毚霌� 鞛戩梾鞚� 鞙勴暅 鞗岉伂頂岆鞖� 鞓れ紑鞀ろ姼霠堨澊靺�.',
+    noTemplateFoundTip: '雼るジ 韨れ泴霌滊ゼ 靷毄頃橃棳 瓴�靸夗暣 氤挫嫮鞁滌槫.',
+    noIdeaTip: '鞎勳澊霐旍柎臧� 鞐嗢溂鞁犼皜鞖�? 韰滍攲毽快潉 頇曥澑頃� 氤挫劯鞖�',
+    optional: '靹犿儩鞝�',
+    noTemplateFound: '韰滍攲毽快潉 彀眷潉 靾� 鞐嗢姷雼堧嫟.',
+    completionShortDescription: '韰嶌姢韸� 靸濎劚 鞛戩梾鞚� 鞙勴暅 AI 霃勳毎氙�',
+    learnMore: '雿� 鞎岇晞氤挫劯鞖�',
+    foundResults: '{{臧滌垬}} 瓴瓣臣',
+    agentShortDescription: '於旊 氚� 鞛愳湪鞝侅澑 霃勱惮 靷毄 旮半姤鞚� 鞛堧姅 歆�電ロ槙 鞐愳澊鞝勴姼',
+    advancedShortDescription: '氅旊毽ゼ 靷毄頃� 氤奠灐頃� 雼れ 韯� 雽�頇旊ゼ 鞙勴暅 鞗岉伂頂岆鞖�',
+    noAppsFound: '鞎膘潉 彀眷潉 靾� 鞐嗢姷雼堧嫟.',
+    foundResult: '{{臧滌垬}} 瓴瓣臣',
+    completionUserDescription: '臧勲嫧頃� 甑劚鞙茧 韰嶌姢韸� 靸濎劚 鞛戩梾鞚� 鞙勴暅 AI 霃勳毎氙鸽ゼ 牍犽ゴ瓴� 甑稌頃╇媹雼�.',
+    chatbotUserDescription: '臧勲嫧頃� 甑劚鞙茧 LLM 旮半皹 毂楇磭鞚� 牍犽ゴ瓴� 甑稌頃� 靾� 鞛堨姷雼堧嫟. 雮橃鞐� Chatflow搿� 鞝勴櫂頃� 靾� 鞛堨姷雼堧嫟.',
+    workflowShortDescription: '雼澕 韯� 鞛愲彊頇� 鞛戩梾鞚� 鞙勴暅 鞓れ紑鞀ろ姼霠堨澊靺�',
+    agentUserDescription: '鞛戩梾 氇╉憸毳� 雼劚頃橁赴 鞙勴暣 氚橂车鞝侅澑 於旊瓿� 鞛愳湪鞝侅澑 霃勱惮毳� 靷毄頃� 靾� 鞛堧姅 歆�電ロ槙 鞐愳澊鞝勴姼鞛呺媹雼�.',
+    advancedUserDescription: '氅旊毽� 旮半姤鞚� 鞛堧姅 雼る澕鞖措摐鞚� 氤奠灐頃� 雽�頇� 鞛戩梾鞚� 鞙勴暅 鞗岉伂頂岆鞖� 臁办爼.',
+  },
+  editApp: '鞝曤炒 韼胳頃橁赴',
+  editAppTitle: '鞎� 鞝曤炒 韼胳頃橁赴',
+  editDone: '鞎� 鞝曤炒臧� 鞐呺嵃鞚错姼霅橃棃鞀惦媹雼�',
+  editFailed: '鞎� 鞝曤炒 鞐呺嵃鞚错姼 鞁ろ尐',
+  iconPicker: {
+    ok: '頇曥澑',
+    cancel: '旆唽',
+    emoji: '鞚措歆�',
+    image: '鞚措歆�',
+  },
+  switch: '鞗岉伂頂岆鞖� 鞓れ紑鞀ろ姼霠堨澊靺橃溂搿� 鞝勴櫂頃橁赴',
+  switchTipStart: '靸堧鞖� 鞎膘潣 氤奠偓氤胳澊 靸濎劚霅橃柎 靸堧鞖� 氤奠偓氤胳澊 鞗岉伂頂岆鞖� 鞓れ紑鞀ろ姼霠堨澊靺橃溂搿� 鞝勴櫂霅╇媹雼�. 靸堧鞖� 氤奠偓氤胳潃 ',
+  switchTip: '鞝勴櫂鞚� 項堨毄頃橃 鞎婌姷雼堧嫟',
+  switchTipEnd: ' 旮半掣鞝侅澑 鞓れ紑鞀ろ姼霠堨澊靺橃溂搿� 霅橂弻毽� 靾� 鞐嗢姷雼堧嫟.',
+  switchLabel: '靸濎劚霅� 鞎膘潣 氤奠偓氤�',
+  removeOriginal: '鞗愲掣 鞎� 鞝滉卑頃橁赴',
+  switchStart: '鞝勴櫂 鞁滌瀾頃橁赴',
+  typeSelector: {
+    all: '氇摖 膦呺',
+    chatbot: '毂楇磭',
+    agent: '鞐愳澊鞝勴姼',
+    workflow: '鞗岉伂頂岆鞖�',
+    completion: '鞕勳劚',
+    advanced: '毂勴寘 頂岆鞖�',
+  },
+  tracing: {
+    title: '鞎� 靹彪姤 於旍爜',
+    description: '鞝�3鞛� LLMOps 鞝滉车鞐呾泊 甑劚 氚� 鞎� 靹彪姤 於旍爜.',
+    config: '甑劚',
+    collapse: '鞝戧赴',
+    expand: '韼检箻旮�',
+    tracing: '於旍爜',
+    disabled: '牍勴櫆靹表檾霅�',
+    disabledTip: '毹检爛 鞝滉车鞐呾泊毳� 甑劚頃� 欤检劯鞖�',
+    enabled: '靹滊箘鞀� 欷�',
+    tracingDescription: 'LLM 順胳稖, 旎厤鞀ろ姼, 頂勲‖頂勴姼, HTTP 鞖旍箔 霌� 鞎� 鞁ろ枆鞚� 鞝勳泊 旎厤鞀ろ姼毳� 鞝�3鞛� 於旍爜 頂岆灚韽检棎 旌§矘頃╇媹雼�.',
+    configProviderTitle: {
+      configured: '甑劚霅�',
+      notConfigured: '於旍爜鞚� 頇滌劚頇旐晿霠る┐ 鞝滉车鞐呾泊毳� 甑劚頃橃劯鞖�',
+      moreProvider: '雿� 毵庫潃 鞝滉车鞐呾泊',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: 'LLM 旮半皹 鞎犿攲毽紑鞚挫厴 靾橂獏 欤缄赴鞚� 氇摖 雼硠毳� 鞙勴暅 鞓澑鞗� 臧滊皽鞛� 頂岆灚韽�.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: 'LLM 鞎犿攲毽紑鞚挫厴鞚� 霐旊矂攴疙晿瓿� 臧滌劆頃橁赴 鞙勴暅 於旍爜, 韽夑皜, 頂勲‖頂勴姼 甏�毽� 氚� 氅旐姼毽�.',
+    },
+    inUse: '靷毄 欷�',
+    configProvider: {
+      title: '甑劚 ',
+      placeholder: '{{key}}毳� 鞛呺牓頃橃劯鞖�',
+      project: '頂勲鞝濏姼',
+      publicKey: '瓿店皽 韨�',
+      secretKey: '牍勲皜 韨�',
+      viewDocsLink: '{{key}} 氍胳劀 氤搓赴',
+      removeConfirmTitle: '{{key}} 甑劚鞚� 鞝滉卑頃橃嫓瓴犾姷雼堦箤?',
+      removeConfirmContent: '順勳灛 甑劚鞚� 靷毄 欷戩瀰雼堧嫟. 鞝滉卑頃橂┐ 於旍爜 旮半姤鞚� 旰检雼堧嫟.',
+    },
+    view: '氤搓赴',
+    opik: {
+      title: '鞓ろ斀',
+      description: 'Opik鞚� LLM 鞎犿攲毽紑鞚挫厴鞚� 韽夑皜, 韰岇姢韸� 氚� 氇媹韯半頃橁赴 鞙勴暅 鞓ろ攬 靻岇姢 頂岆灚韽检瀰雼堧嫟.',
+    },
+    weave: {
+      title: '歆侅“頃橂嫟',
+      description: 'Weave電� LLM 鞎犿攲毽紑鞚挫厴鞚� 韽夑皜頃橁碃 韰岇姢韸疙晿氅� 氇媹韯半頃橁赴 鞙勴暅 鞓ろ攬 靻岇姢 頂岆灚韽检瀰雼堧嫟.',
+    },
+  },
+  answerIcon: {
+    description: 'WebApp 鞎勳澊旖橃潉 靷毄頃橃棳 瓿奠湢 鞚戩毄 頂勲攴鸽灗鞐愳劀 氚旉縺馃歆� 鞐秬',
+    title: 'WebApp 鞎勳澊旖橃潉 靷毄頃橃棳 馃',
+    descriptionInExplore: 'Explore鞐愳劀 WebApp 鞎勳澊旖橃潉 靷毄頃橃棳 氚旉縺馃歆� 鞐秬',
+  },
+  importFromDSL: 'DSL鞐愳劀 臧�鞝胳槫旮�',
+  importFromDSLFile: 'DSL 韺岇澕鞐愳劀',
+  importFromDSLUrl: 'URL鞐愳劀',
+  importFromDSLUrlPlaceholder: '鞐赴鞐� DSL 毵來伂 攵欖棳 雱j赴',
+  mermaid: {
+    handDrawn: '靻愳溂搿� 攴鸽Π',
+    classic: '瓿犾爠',
+  },
+  openInExplore: 'Explore鞐愳劀 鞐搓赴',
+  newAppFromTemplate: {
+    sidebar: {
+      Agent: '雽�毽澑',
+      Workflow: '鞗岉伂頂岆',
+      HR: '鞚胳偓',
+      Programming: '頂勲攴鸽灅氚�',
+      Writing: '鞊瓣赴',
+      Assistant: '臁办垬',
+      Recommended: '甓岇灔',
+    },
+    byCategories: '旃错厡瓿犽Μ氤�',
+    searchAllTemplate: '氇摖 韰滍攲毽� 瓴�靸�...',
+  },
+  showMyCreatedAppsOnly: '雮搓皜 毵岆摖 鞎彪 氤搓赴',
+  appSelector: {
+    params: '鞎� 毵り皽 氤�靾�',
+    noParams: '毵り皽 氤�靾橁皜 頃勳殧頃橃 鞎婌姷雼堧嫟.',
+    label: '鞎�',
+    placeholder: '鞎� 靹犿儩...',
+  },
+  structOutput: {
+    required: '頃勳垬',
+    LLMResponse: 'LLM 鞚戨嫷',
+    modelNotSupported: '氇嵏鞚� 歆�鞗愲悩歆� 鞎婌姷雼堧嫟.',
+    notConfiguredTip: '甑劚鞚� 鞎勳 靹れ爼霅橃 鞎婌晿鞀惦媹雼�.',
+    structured: '甑“頇旊悳',
+    configure: '靹れ爼頃橂嫟',
+    moreFillTip: '斓滊寑 10雼硠 欷戩博鞚� 響滌嫓頃╇媹雼�.',
+    modelNotSupportedTip: '順勳灛 氇嵏鞚� 鞚� 旮半姤鞚� 歆�鞗愴晿歆� 鞎婌溂氅� 鞛愲彊鞙茧 頂勲‖頂勴姼 欤检瀰鞙茧 雼れ毚攴鸽爤鞚措摐霅╇媹雼�.',
+    structuredTip: '甑“頇旊悳 於滊牓鞚� 氇嵏鞚� 鞝滉车頃� JSON 鞀ろ偆毵堧ゼ 頃儊 欷�靾橅晿電� 鞚戨嫷鞚� 靸濎劚頃橂弰搿� 氤挫灔頃橂姅 旮半姤鞛呺媹雼�.',
+  },
+}
+
+export default translation
diff --git a/i18n/ko-KR/billing.ts b/i18n/ko-KR/billing.ts
new file mode 100644
index 0000000..dfb9f6a
--- /dev/null
+++ b/i18n/ko-KR/billing.ts
@@ -0,0 +1,200 @@
+const translation = {
+  currentPlan: '順勳灛 鞖旉笀鞝�',
+  upgradeBtn: {
+    plain: '鞖旉笀鞝� 鞐呹犯霠堨澊霌�',
+    encourage: '歆�旮� 鞐呹犯霠堨澊霌�',
+    encourageShort: '鞐呹犯霠堨澊霌�',
+  },
+  viewBilling: '觳惮 氚� 甑弲 甏�毽�',
+  buyPermissionDeniedTip: '甑弲頃橂牑氅� 鞐旐劙頂勲澕鞚挫 甏�毽瀽鞐愱矊 氍胳潣頃橃劯鞖�',
+  plansCommon: {
+    title: '雼轨嫚鞐愱矊 毵炿姅 鞖旉笀鞝滊ゼ 靹犿儩頃橃劯鞖�',
+    yearlyTip: '鞐瓣皠 甑弲 鞁� 2臧滌洈 氍措!',
+    mostPopular: '臧�鞛� 鞚戈赴 鞛堧姅',
+    planRange: {
+      monthly: '鞗旉皠',
+      yearly: '鞐瓣皠',
+    },
+    month: '鞗�',
+    year: '雲�',
+    save: '鞝堨暯 ',
+    free: '氍措',
+    currentPlan: '順勳灛 鞖旉笀鞝�',
+    contractSales: '鞓侅梾鞐� 氍胳潣頃橁赴',
+    contractOwner: '韺� 甏�毽瀽鞐愱矊 氍胳潣頃橁赴',
+    startForFree: '氍措搿� 鞁滌瀾頃橁赴',
+    getStartedWith: '鞁滌瀾頃橁赴 ',
+    contactSales: '鞓侅梾鞐� 氍胳潣頃橁赴',
+    talkToSales: '鞓侅梾瓿� 靸侂嫶頃橁赴',
+    modelProviders: '氇嵏 鞝滉车鞛�',
+    teamMembers: '韺� 氅る矂',
+    buildApps: '鞎� 毵岆摛旮�',
+    vectorSpace: '氩№劙 瓿店皠',
+    vectorSpaceBillingTooltip: '1MB雼� 鞎� 120毵� 旮�鞛愳潣 氩№劙頇旊悳 雿办澊韯半ゼ 鞝�鞛ロ暊 靾� 鞛堨姷雼堧嫟 (OpenAI Embeddings鞚� 旮半皹鞙茧 於旍爼霅橂┌ 氇嵏鞐� 霐半澕 雼る雼堧嫟).',
+    vectorSpaceTooltip: '氩№劙 瓿店皠鞚� LLM鞚� 雿办澊韯半ゼ 鞚错暣頃橂姅 雿� 頃勳殧頃� 鞛リ赴 旮办柕 鞁滌姢韰滌瀰雼堧嫟.',
+    documentProcessingPriority: '氍胳劀 觳橂Μ 鞖办劆靾滌渼',
+    documentProcessingPriorityTip: '雿� 雴掛潃 氍胳劀 觳橂Μ 鞖办劆靾滌渼毳� 鞗愴晿鞁滊┐ 鞖旉笀鞝滊ゼ 鞐呹犯霠堨澊霌滍晿靹胳殧.',
+    documentProcessingPriorityUpgrade: '雿� 雴掛潃 鞝曧檿靹标臣 牍犽ジ 靻嶋弰搿� 雿办澊韯半ゼ 觳橂Μ頃╇媹雼�.',
+    priority: {
+      'standard': '響滌',
+      'priority': '鞖办劆',
+      'top-priority': '斓滌毎靹�',
+    },
+    logsHistory: '搿滉犯 旮半',
+    customTools: '靷毄鞛� 鞝曥潣 霃勱惮',
+    unavailable: '靷毄 攵堦皜',
+    days: '鞚�',
+    unlimited: '氍挫牅頃�',
+    support: '歆�鞗�',
+    supportItems: {
+      communityForums: '旎る雼堩嫲 韽熂',
+      emailSupport: '鞚措鞚� 歆�鞗�',
+      priorityEmail: '鞖办劆 鞚措鞚� 氚� 毂勴寘 歆�鞗�',
+      logoChange: '搿滉碃 氤�瓴�',
+      SSOAuthentication: 'SSO 鞚胳',
+      personalizedSupport: '臧滊硠 歆�鞗�',
+      dedicatedAPISupport: '鞝勳毄 API 歆�鞗�',
+      customIntegration: '靷毄鞛� 鞝曥潣 韱淀暕 氚� 歆�鞗�',
+      ragAPIRequest: 'RAG API 鞖旍箔',
+      agentMode: '鞐愳澊鞝勴姼 氇摐',
+      workflow: '鞗岉伂頂岆鞖�',
+      llmLoadingBalancing: 'LLM 搿滊摐 氚鸽煱鞁�',
+      bulkUpload: '氍胳劀 雽�霟� 鞐呺霌�',
+      llmLoadingBalancingTooltip: '氇嵏鞐� 鞐煬 API 韨るゼ 於旉皜頃橃棳 API 靻嶋弰 鞝滍暅鞚� 須臣鞝侅溂搿� 鞖绊殞頃� 靾� 鞛堨姷雼堧嫟.',
+    },
+    comingSoon: '瓿� 於滌嫓 鞓堨爼',
+    member: '氅る矂',
+    memberAfter: '氅る矂',
+    messageRequest: {
+      title: '氅旍嫓歆� 韥爤霐�',
+      tooltip: 'GPT 鞝滌櫢 雼れ枒頃� 鞖旉笀鞝滌棎靹滌潣 氅旍嫓歆� 順胳稖 炜柬劙 (gpt4 鞝滌櫢). 鞝滍暅鞚� 齑堦臣頃橂姅 氅旍嫓歆�電� OpenAI API 韨るゼ 靷毄頃╇媹雼�.',
+      titlePerMonth: '{{count,number}} 氅旍嫓歆�/鞗�',
+    },
+    annotatedResponse: {
+      title: '欤检劃 鞚戨嫷 炜柬劙',
+      tooltip: '靾橂彊鞙茧 韼胳 氚� 鞚戨嫷 欤检劃 雼赴搿� 鞎膘潣 靷毄鞛� 鞝曥潣 臧�電ロ暅 瓿犿拡歆� 歆堨潣鞚戨嫷 旮半姤鞚� 鞝滉车頃╇媹雼� (毂勴寘 鞎膘棎毵� 頃措嫻).',
+    },
+    ragAPIRequestTooltip: 'Dify鞚� 歆�鞁濍矤鞚挫姢 觳橂Μ 旮半姤鞚� 順胳稖頃橂姅 API 順胳稖 靾橂ゼ 雮橅儉雰呺媹雼�.',
+    receiptInfo: '韺� 靻岇湢鞛� 氚� 韺� 甏�毽瀽毵� 甑弲 氚� 觳惮 鞝曤炒毳� 氤� 靾� 鞛堨姷雼堧嫟',
+    annotationQuota: 'Annotation Quota(欤检劃 頃犽嫻霟�)',
+    documentsUploadQuota: '氍胳劀 鞐呺霌� 頃犽嫻霟�',
+    freeTrialTipPrefix: '臧�鞛呿晿瓿� 氚涭溂靹胳殧',
+    comparePlanAndFeatures: '瓿勴殟 氚� 旮半姤 牍勱祼',
+    documents: '{{count,number}} 歆�鞁� 氍胳劀',
+    apiRateLimit: 'API 鞖旉笀 頃滊弰',
+    cloud: '韥措澕鞖半摐 靹滊箘鞀�',
+    unlimitedApiRate: 'API 順胳稖 靻嶋弰 鞝滍暅 鞐嗢潓',
+    freeTrialTip: '200須岇潣 OpenAI 順胳稖鞐� 雽�頃� 氍措 觳错棙.',
+    annualBilling: '鞐瓣皠 觳惮',
+    getStarted: '鞁滌瀾頃橁赴',
+    apiRateLimitUnit: '{{count,number}}/鞚�',
+    freeTrialTipSuffix: '鞁犾毄旃措摐 鞐嗢潓',
+    teamWorkspace: '{{count,number}} 韺� 鞛戩梾 瓿店皠',
+    self: '鞛愳泊 順胳姢韺�',
+    teamMember_other: '{{count,number}} 韺�鞗�',
+    teamMember_one: '{{count,number}} 韺�鞗�',
+    priceTip: '鞛戩梾 瓿店皠雼�/',
+    apiRateLimitTooltip: 'Dify API毳� 韱淀暅 氇摖 鞖旍箔鞐愲姅 API 鞖旉笀 頃滊弰臧� 鞝侅毄霅橂┌, 鞐赴鞐愲姅 韰嶌姢韸� 靸濎劚, 毂勴寘 雽�頇�, 鞗岉伂頂岆 鞁ろ枆 氚� 氍胳劀 觳橂Μ臧� 韽暔霅╇媹雼�.',
+    documentsRequestQuota: '{{count,number}}/攵� 歆�鞁� 鞖旍箔 牍勳湪 鞝滍暅',
+    documentsTooltip: '歆�鞁� 雿办澊韯� 靻岇姢鞐愳劀 臧�鞝胳槵 靾� 鞛堧姅 氍胳劀 靾橃棎 雽�頃� 炜柬劙.',
+    documentsRequestQuotaTooltip: '歆�鞁� 旮半皹 雮挫棎靹� 鞛戩梾 瓿店皠鞚� 攵勲嫻 靾橅枆頃� 靾� 鞛堧姅 齑� 鞛戩梾 靾橂ゼ 歆�鞝曧暕雼堧嫟. 鞐赴鞐愲姅 雿办澊韯� 靹疙姼 靸濎劚, 靷牅, 鞐呺嵃鞚错姼, 氍胳劀 鞐呺霌�, 靾橃爼, 氤搓磤 氚� 歆�鞁� 旮半皹 炜茧Μ臧� 韽暔霅╇媹雼�. 鞚� 歆�響滊姅 歆�鞁� 旮半皹 鞖旍箔鞚� 靹彪姤鞚� 韽夑皜頃橂姅 雿� 靷毄霅╇媹雼�. 鞓堧ゼ 霌れ柎, 靸岆摐氚曥姢 靷毄鞛愱皜 1攵� 鞚措偞鞐� 10須岇潣 鞐办啀 頌堩姼 韰岇姢韸鸽ゼ 靾橅枆頃橂┐, 頃措嫻 鞛戩梾 瓿店皠鞚� 雼れ潓 1攵� 霃欖晥 雿办澊韯� 靹疙姼 靸濎劚, 靷牅, 鞐呺嵃鞚错姼 氚� 氍胳劀 鞐呺霌� 霕愲姅 靾橃爼瓿� 臧欖潃 鞛戩梾鞚� 靾橅枆頃橂姅 瓴冹澊 鞚检嫓鞝侅溂搿� 鞝滍暅霅╇媹雼�.',
+  },
+  plans: {
+    sandbox: {
+      name: '靸岆摐氚曥姢',
+      description: 'GPT 氍措 觳错棙 200須�',
+      includesTitle: '韽暔霅� 頃:',
+      for: '頃奠嫭 旮半姤 氍措 觳错棙',
+    },
+    professional: {
+      name: '頂勲韼橃厰雱�',
+      description: '臧滌澑 氚� 靻岅窚氇� 韺�鞚� 鞙勴暣 雿� 毵庫潃 韺岇泴毳� 鞝�霠错暅 臧�瓴╈棎 鞝滉车頃╇媹雼�.',
+      includesTitle: '氍措 頂岆灉鞐� 於旉皜搿� 韽暔霅� 頃:',
+      for: '霃呺 臧滊皽鞛�/靻岅窚氇� 韺�鞚� 鞙勴暅',
+    },
+    team: {
+      name: '韺�',
+      description: '鞝滍暅 鞐嗢澊 順戩梾頃橁碃 斓滉碃鞚� 靹彪姤鞚� 雸勲Μ靹胳殧.',
+      includesTitle: '頂勲韼橃厰雱� 頂岆灉鞐� 於旉皜搿� 韽暔霅� 頃:',
+      for: '欷戧皠 攴滊 韺�鞚� 鞙勴暅',
+    },
+    enterprise: {
+      name: '鞐旐劙頂勲澕鞚挫',
+      description: '雽�攴滊 氙胳厴 韥Μ韹办滑 鞁滌姢韰滌潉 鞙勴暅 鞕勳爠頃� 旮半姤瓿� 歆�鞗愳潉 鞝滉车頃╇媹雼�.',
+      includesTitle: '韺� 頂岆灉鞐� 於旉皜搿� 韽暔霅� 頃:',
+      features: {
+        2: '霃呾爯 旮办梾 旮半姤',
+        1: '靸侅梾鞝� 霛检澊靹犾姢 鞀轨澑',
+        3: '雼れ 鞛戩梾 瓿店皠 氚� 旮办梾 甏�毽�',
+        4: 'SSO',
+        5: 'Dify 韺岉姼雱堨棎 鞚橅暣 順戩儊霅� SLA',
+        6: '瓿犼笁 氤挫晥 氚� 鞝滌柎',
+        0: '旮办梾旮� 頇曥灔 臧�電ロ暅 氚绊彫 靻旊(靺�',
+        7: '霐旐敿 瓿奠嫕 鞐呺嵃鞚错姼 氚� 鞙犾 甏�毽�',
+        8: '鞝勲 旮办垹 歆�鞗�',
+      },
+      price: '毵烄钉順�',
+      btnText: '韺愲Г 氍胳潣頃橁赴',
+      for: '雽�攴滊 韺�鞚� 鞙勴暣',
+      priceTip: '鞐瓣皠 觳惮 鞝勳毄',
+    },
+    community: {
+      features: {
+        0: '氇摖 頃奠嫭 旮半姤鞚� 瓿店皽 鞝�鞛レ唽鞐� 毽措Μ鞀る惃',
+        2: 'Dify 鞓ろ攬 靻岇姢 霛检澊靹犾姢毳� 欷�靾橅暕雼堧嫟.',
+        1: '雼澕 鞛戩梾 瓿店皠',
+      },
+      btnText: '旎る雼堩嫲 鞁滌瀾頃橁赴',
+      description: '臧滌澑 靷毄鞛�, 靻岅窚氇� 韺� 霕愲姅 牍勳儊鞐呾爜 頂勲鞝濏姼毳� 鞙勴暅',
+      name: '旎る雼堩嫲',
+      price: '氍措',
+      includesTitle: '氍措 旮半姤:',
+      for: '臧滌澑 靷毄鞛�, 靻岅窚氇� 韺� 霕愲姅 牍勳儊鞐呾爜 頂勲鞝濏姼毳� 鞙勴暅',
+    },
+    premium: {
+      features: {
+        1: '雼澕 鞛戩梾 瓿店皠',
+        2: '鞗轨暠 搿滉碃 氚� 敫岆灉霐� 毵烄钉頇�',
+        3: '鞖办劆 鞚措鞚� 氚� 毂勴寘 歆�鞗�',
+        0: '雼れ枒頃� 韥措澕鞖半摐 鞝滉车鞐呾泊鞐� 鞚橅暅 鞛愳湪 甏�毽� 鞁犽靹�',
+      },
+      btnText: '頂勲Μ氙胳梽 氚涥赴',
+      priceTip: '韥措澕鞖半摐 毵堨紦頂岆爤鞚挫姢毳� 旮半皹鞙茧',
+      name: '頂勲Μ氙胳梽',
+      description: '欷戧窚氇� 臁办 氚� 韺�鞚� 鞙勴暅',
+      comingSoon: '毵堨澊韥靻岉攧韸� 鞎犾爛 氚� 甑竴 韥措澕鞖半摐 歆�鞗� 瓿� 鞝滉车霅╇媹雼�.',
+      price: '頇曥灔 臧�電�',
+      for: '欷戧窚氇� 臁办 氚� 韺�鞚� 鞙勴暅',
+      includesTitle: '旎る雼堩嫲鞚� 氇摖 瓴�, 鞐赴鞐� 於旉皜搿�:',
+    },
+  },
+  vectorSpace: {
+    fullTip: '氩№劙 瓿店皠鞚� 臧�霌� 彀检姷雼堧嫟.',
+    fullSolution: '雿� 毵庫潃 瓿店皠鞚� 鞏混溂霠る┐ 鞖旉笀鞝滊ゼ 鞐呹犯霠堨澊霌滍晿靹胳殧.',
+  },
+  apps: {
+    fullTipLine1: '雿� 毵庫潃 鞎膘潉 靸濎劚頃橂牑氅�,',
+    fullTipLine2: '鞖旉笀鞝滊ゼ 鞐呹犯霠堨澊霌滍晿靹胳殧.',
+    contactUs: '氍胳潣頃橁赴',
+    fullTip1: '鞐呹犯霠堨澊霌滍晿鞐� 雿� 毵庫潃 鞎膘潉 毵岆摛旮�',
+    fullTip2: '瓿勴殟 頃滊弰鞐� 霃勲嫭頄堨姷雼堧嫟.',
+    fullTip2des: '牍勴櫆靹� 鞎犿攲毽紑鞚挫厴鞚� 鞝曤Μ頃橃棳 靷毄霟夓潉 欷勳澊瓯半倶 鞝�頋棎瓴� 氍胳潣頃橂姅 瓴冹澊 膦嬱姷雼堧嫟.',
+    fullTip1des: '鞚� 瓿勴殟鞐愳劀 鞎膘潉 甑稌頃� 靾� 鞛堧姅 頃滉硠鞐� 霃勲嫭頄堨姷雼堧嫟.',
+  },
+  annotatedResponse: {
+    fullTipLine1: '雿� 毵庫潃 雽�頇旊ゼ 欤检劃 觳橂Μ頃橂牑氅�,',
+    fullTipLine2: '鞖旉笀鞝滊ゼ 鞐呹犯霠堨澊霌滍晿靹胳殧.',
+    quotaTitle: '欤检劃 鞚戨嫷 炜柬劙',
+  },
+  usagePage: {
+    vectorSpace: '歆�鞁� 雿办澊韯� 鞝�鞛レ唽',
+    annotationQuota: '欤检劃 頃犽嫻霟�',
+    teamMembers: '韺�鞗愲摛',
+    buildApps: '鞎� 毵岆摛旮�',
+    documentsUploadQuota: '氍胳劀 鞐呺霌� 頃滊弰',
+    vectorSpaceTooltip: '瓿犿拡歆� 靸夓澑 氇摐毳� 靷毄頃橂姅 氍胳劀電� 歆�鞁� 雿办澊韯� 鞝�鞛レ唽 鞛愳洂鞚� 靻岆頃╇媹雼�. 歆�鞁� 雿办澊韯� 鞝�鞛レ唽臧� 頃滊弰鞐� 霃勲嫭頃橂┐ 靸� 氍胳劀毳� 鞐呺霌滍暊 靾� 鞐嗢姷雼堧嫟.',
+  },
+  teamMembers: '韺�鞗愲摛',
+}
+
+export default translation
diff --git a/i18n/ko-KR/common.ts b/i18n/ko-KR/common.ts
new file mode 100644
index 0000000..4809eb9
--- /dev/null
+++ b/i18n/ko-KR/common.ts
@@ -0,0 +1,668 @@
+const translation = {
+  api: {
+    success: '靹标车',
+    actionSuccess: '霃欖瀾鞚� 靹标车鞝侅溂搿� 靾橅枆霅橃棃鞀惦媹雼�',
+    saved: '鞝�鞛ル惃',
+    create: '靸濎劚霅�',
+    remove: '靷牅霅�',
+  },
+  operation: {
+    create: '靸濎劚',
+    confirm: '頇曥澑',
+    cancel: '旆唽',
+    clear: '歆�鞖瓣赴',
+    save: '鞝�鞛�',
+    saveAndEnable: '鞝�鞛� 氚� 頇滌劚頇�',
+    edit: '韼胳',
+    add: '於旉皜',
+    added: '於旉皜霅�',
+    refresh: '靸堧 瓿犾龚',
+    reset: '齑堦赴頇�',
+    search: '瓴�靸�',
+    change: '氤�瓴�',
+    remove: '靷牅',
+    send: '鞝勳啞',
+    copy: '氤奠偓',
+    lineBreak: '欷� 氚旉繄',
+    sure: '頇曥嫟頌�',
+    download: '雼れ毚搿滊摐',
+    delete: '靷牅',
+    settings: '靹れ爼',
+    setup: '靹れ爼',
+    getForFree: '氍措搿� 氚涥赴',
+    reload: '雼れ嫓 攵堧煬鞓り赴',
+    ok: '頇曥澑',
+    log: '搿滉犯',
+    learnMore: '鞛愳劯頌� 鞎岇晞氤搓赴',
+    params: '毵り皽氤�靾�',
+    duplicate: '欷戨车',
+    rename: '鞚措 氚旉靖旮�',
+    audioSourceUnavailable: '鞓る敂鞓� 靻岇姢毳� 靷毄頃� 靾� 鞐嗢姷雼堧嫟.',
+    openInNewTab: '靸� 韮棎靹� 鞐搓赴',
+    zoomIn: '頇曤寑',
+    copyImage: '鞚措歆� 氤奠偓',
+    zoomOut: '於曥唽',
+    close: '雼嫟',
+    viewMore: '雿旊炒旮�',
+    regenerate: '鞛儩靹�',
+    view: '氤搓赴',
+    saveAndRegenerate: '鞝�鞛� 氚� 鞛愳嫕 觳伂 鞛儩靹�',
+    submit: '鞝勳啞',
+    skip: '氚�',
+    imageCopied: '氤奠偓霅� 鞚措歆�',
+    deleteApp: '鞎� 靷牅',
+    copied: '氤奠偓',
+    viewDetails: '靹鸽秬 鞝曤炒氤搓赴',
+    in: '鞎堨溂搿�',
+    downloadFailed: '雼れ毚搿滊摐 鞁ろ尐頄堨姷雼堧嫟. 雮橃鞐� 雼れ嫓 鞁滊弰頃橃嫮鞁滌槫.',
+    format: '順曥嫕',
+    more: '雿� 毵庫潃',
+    downloadSuccess: '雼れ毚搿滊摐 鞕勲.',
+  },
+  placeholder: {
+    input: '鞛呺牓頃挫<靹胳殧',
+    select: '靹犿儩頃挫<靹胳殧',
+  },
+  voice: {
+    language: {
+      zhHans: '欷戧淡鞏�',
+      zhHant: '氩堨泊 欷戧淡鞏�',
+      enUS: '鞓侅柎',
+      deDE: '霃呾澕鞏�',
+      frFR: '頂勲瀾鞀れ柎',
+      esES: '鞀ろ帢鞚胳柎',
+      itIT: '鞚错儓毽晞鞏�',
+      thTH: '韮滉淡鞏�',
+      idID: '鞚鸽弰雱れ嫓鞎勳柎',
+      jaJP: '鞚茧掣鞏�',
+      koKR: '頃滉淡鞏�',
+      ptBR: '韽ゴ韴皥鞏�',
+      ruRU: '霟嫓鞎勳柎',
+      ukUA: '鞖绊伂霛检澊雮橃柎',
+      viVN: '氩犿姼雮柎',
+      plPL: '韽措瀫霌滌柎',
+      roRO: '耄雼堨晞鞏�',
+      hiIN: '頌岆敂鞏�',
+      trTR: '韯绊偆鞏�',
+      faIR: '韼橂ゴ鞁滌晞鞏�',
+    },
+  },
+  unit: {
+    char: '氍胳瀽',
+  },
+  actionMsg: {
+    noModification: '順勳灛 氤�瓴届偓頃澊 鞐嗢姷雼堧嫟.',
+    modifiedSuccessfully: '氤�瓴届澊 靹标车鞝侅溂搿� 鞚措(鞏挫鞀惦媹雼�',
+    modifiedUnsuccessfully: '氤�瓴届棎 鞁ろ尐頄堨姷雼堧嫟',
+    copySuccessfully: '氤奠偓臧� 靹标车鞝侅溂搿� 鞚措(鞏挫鞀惦媹雼�',
+    paySucceeded: '瓴办牅臧� 靹标车頄堨姷雼堧嫟',
+    payCancelled: '瓴办牅臧� 旆唽霅橃棃鞀惦媹雼�',
+    generatedSuccessfully: '靸濎劚鞚� 靹标车鞝侅溂搿� 鞚措(鞏挫鞀惦媹雼�',
+    generatedUnsuccessfully: '靸濎劚鞐� 鞁ろ尐頄堨姷雼堧嫟',
+  },
+  model: {
+    params: {
+      temperature: '鞓弰',
+      temperatureTip: '霝滊崵靹膘潉 鞝滌柎頃╇媹雼�. 鞓弰毳� 雮稊氅� 雿� 霝滊崵頃� 瓴瓣臣氍检潉 鞏混潉 靾� 鞛堨姷雼堧嫟. 鞓弰臧� 0鞐� 臧�旯岇泴歆堨垬搿� 氇嵏鞚� 瓴办爼鞝侅澊瓿� 氚橂车鞝侅溂搿� 鞛戨彊頃╇媹雼�.',
+      top_p: '靸侅渼P',
+      top_pTip: '雺错伌毽柎鞀� 靸橅攲毵侅棎 鞚橅暅 雼れ枒靹� 鞝滌柎: 0.5電� 氇摖 頇曤 臧�欷� 鞓奠厴鞚� 鞝堧皹鞚� 瓿犽牑頃潉 鞚橂頃╇媹雼�.',
+      presence_penalty: '臁挫灛 韼橂剱韹�',
+      presence_penaltyTip: '鞚挫爠 韰嶌姢韸胳棎靹� 韱犿伆鞚� 雮橅儉雮橂姅歆� 鞐秬鞐� 霐半澕 靸堧鞖� 韱犿伆鞐� 鞏茧雮� 毵庫潃 韼橂剱韹半ゼ 攵�鞐暊歆� 鞝滌柎頃╇媹雼�. 氇嵏鞚� 靸堧鞖� 欤检牅鞐� 雽�頃� 毵愴暊 臧�電レ劚鞚� 雴掛晞歆戨媹雼�.',
+      frequency_penalty: '牍堧弰 韼橂剱韹�',
+      frequency_penaltyTip: '鞚挫爠 韰嶌姢韸� 雮� 韱犿伆鞚� 旮办〈 牍堧弰鞐� 霐半澕 靸堧鞖� 韱犿伆鞐� 鞏茧雮� 毵庫潃 韼橂剱韹半ゼ 攵�鞐暊歆� 鞝滌柎頃╇媹雼�. 氇嵏鞚� 臧欖潃 氍戈惮毳� 旮�鞛� 攴鸽寑搿� 氚橂车頃� 臧�電レ劚鞚� 欷勳柎霌媹雼�.',
+      max_tokens: '斓滊寑 韱犿伆',
+      max_tokensTip:
+        '鞚戨嫷鞚� 斓滊寑 旮胳澊毳� 韱犿伆 雼渼搿� 鞝滍暅頃橂姅 雿� 靷毄霅╇媹雼�. 韥� 臧掛潃 頂勲‖頂勴姼, 毂勴寘 搿滉犯 氚� 雮潃 瓿店皠鞐� 雽�頃� 鞝滍暅鞚� 臧�歆� 靾� 鞛堨姷雼堧嫟. 2/3 鞚错晿搿� 靹れ爼頃橂姅 瓴冹澊 膦嬱姷雼堧嫟. gpt-4-1106-preview, gpt-4-vision-preview鞚� 斓滊寑 韱犿伆 (鞛呺牓 128k 於滊牓 4k)氤措嫟 鞛戧矊 靹れ爼頃橂姅 瓴冹澊 膦嬱姷雼堧嫟.',
+      maxTokenSettingTip: '斓滊寑 韱犿伆 靹れ爼鞚� 雴掛晞靹� 頂勲‖頂勴姼, 炜茧Μ 氚� 雿办澊韯� 瓿店皠鞐� 鞝滍暅鞚� 靸濌父 靾� 鞛堨姷雼堧嫟. 順勳灛 氇嵏鞚� 斓滊寑 韱犿伆鞚� 80% 鞚错晿搿� 靹れ爼頃挫<靹胳殧.',
+      setToCurrentModelMaxTokenTip: '斓滊寑 韱犿伆鞚� 順勳灛 氇嵏鞚� 斓滊寑 韱犿伆鞚� 80%搿� 鞐呺嵃鞚错姼霅橃棃鞀惦媹雼� {{maxToken}}.',
+      stop_sequences: '欷戨嫧 鞁滍��鞀�',
+      stop_sequencesTip: 'API臧� 歆勴枆 欷戩澑 韱犿伆 靸濎劚鞚� 欷戨嫧頃橂姅 斓滊寑 4臧滌潣 鞁滍��鞀れ瀰雼堧嫟. 氚橅櫂霅� 韰嶌姢韸胳棎電� 欷戨嫧 鞁滍��鞀り皜 韽暔霅橃 鞎婌姷雼堧嫟.',
+      stop_sequencesPlaceholder: '鞁滍��鞀るゼ 鞛呺牓頃橁碃 韮� 韨るゼ 雸勲ゴ靹胳殧',
+    },
+    tone: {
+      Creative: '彀届潣鞝侅澑',
+      Balanced: '攴犿槙鞛№瀸',
+      Precise: '鞝曧檿頃�',
+      Custom: '靷毄鞛� 鞝曥潣',
+    },
+    addMoreModel: '靹れ爼鞐愳劀 雼るジ 氇嵏鞚� 於旉皜頃橃劯鞖�',
+    capabilities: '氅�韹半雼� 旮半姤',
+    settingsLink: '氇嵏 瓿店笁鞛� 靹れ爼',
+  },
+  menus: {
+    status: '氩犿儉 氩勳爠',
+    explore: '韮愳儔',
+    apps: '鞀ろ姕霐旍槫',
+    plugins: '頂岆煬攴胳澑',
+    pluginsTips: '韮�靷� 頂岆煬攴胳澑鞚� 韱淀暕頃橁卑雮� ChatGPT 順疙櫂 AI 頂岆煬攴胳澑鞚� 鞛戩劚頃╇媹雼�.',
+    datasets: '歆�鞁�',
+    datasetsTips: '瓿� 於滌嫓霅� 鞓堨爼: 瓿犾湢頃� 韰嶌姢韸� 雿办澊韯半ゼ 臧�鞝胳槫瓯半倶 鞗鬼泤鞚� 韱淀暣 鞁れ嫓臧勳溂搿� 雿办澊韯半ゼ 旮半頃橃棳 LLM 旎厤鞀ろ姼毳� 臧曧檾頃╇媹雼�.',
+    newApp: '靸堧鞖� 鞎�',
+    newDataset: '歆�鞁� 毵岆摛旮�',
+    tools: '霃勱惮',
+    exploreMarketplace: 'Marketplace 霊橂煬氤搓赴',
+  },
+  userProfile: {
+    settings: '靹れ爼',
+    emailSupport: '鞚措鞚� 歆�鞗�',
+    workspace: '鞛戩梾 瓿店皠',
+    createWorkspace: '鞛戩梾 瓿店皠 毵岆摛旮�',
+    helpCenter: '霃勳泙毵� 靹柬劙',
+    communityFeedback: '搿滊摐毵� 氚� 頂茧摐氚�',
+    roadmap: '搿滊摐毵�',
+    community: '旎る雼堩嫲',
+    about: 'Dify 靻岅皽',
+    logout: '搿滉犯鞎勳泝',
+    github: '旯冺棃敫�',
+    compliance: '旎错攲霛检澊鞏胳姢',
+    support: '歆�鞗�',
+  },
+  settings: {
+    accountGroup: '瓿勳爼',
+    workplaceGroup: '鞛戩梾 瓿店皠',
+    account: '雮� 瓿勳爼',
+    members: '氅る矂',
+    billing: '觳惮',
+    integrations: '韱淀暕',
+    language: '鞏胳柎',
+    provider: '氇嵏 鞝滉车鞛�',
+    dataSource: '雿办澊韯� 靻岇姢',
+    plugin: '頂岆煬攴胳澑',
+    apiBasedExtension: 'API 頇曥灔',
+    generalGroup: '鞚茧皹',
+  },
+  account: {
+    avatar: '鞎勲皵韮�',
+    name: '鞚措',
+    email: '鞚措鞚�',
+    password: '牍勲皜氩堩樃',
+    passwordTip: '鞚检嫓鞝侅澑 搿滉犯鞚� 旖旊摐毳� 靷毄頃橃 鞎婌溂霠る┐ 鞓侁惮鞝侅澑 牍勲皜氩堩樃毳� 靹れ爼頃� 靾� 鞛堨姷雼堧嫟.',
+    setPassword: '牍勲皜氩堩樃 靹れ爼',
+    resetPassword: '牍勲皜氩堩樃 鞛劋鞝�',
+    currentPassword: '順勳灛 牍勲皜氩堩樃',
+    newPassword: '靸� 牍勲皜氩堩樃',
+    confirmPassword: '牍勲皜氩堩樃 頇曥澑',
+    notEqual: '牍勲皜氩堩樃臧� 鞚检箻頃橃 鞎婌姷雼堧嫟.',
+    langGeniusAccount: 'Dify 瓿勳爼',
+    langGeniusAccountTip: 'Dify 瓿勳爼瓿� 甏�霠悳 靷毄鞛� 雿办澊韯�.',
+    editName: '鞚措 韼胳',
+    showAppLength: '{{length}}臧滌潣 鞎� 響滌嫓',
+    delete: '瓿勳爼 靷牅',
+    deleteTip: '瓿勳爼鞚� 靷牅頃橂┐ 氇摖 雿办澊韯瓣皜 鞓侁惮鞝侅溂搿� 歆�鞗岇氅� 氤店惮頃� 靾� 鞐嗢姷雼堧嫟.',
+    deleteConfirmTip: '頇曥澑頃橂牑氅� 霌彪霅� 鞚措鞚检棎靹� 雼れ潓 雮挫毄鞚� 搿� 氤措偞欤检劯鞖� ',
+    myAccount: '雮� 瓿勳爼',
+    studio: '霐旐寣鞚� 鞀ろ姕霐旍槫',
+    account: '瓿勳爼',
+    deletePrivacyLink: '臧滌澑 鞝曤炒 氤错樃 鞝曥眳.',
+    deleteSuccessTip: '瓿勳爼 靷牅毳� 鞕勲頃橂姅 雿� 鞁滉皠鞚� 頃勳殧頃╇媹雼�. 氇摖 鞛戩梾鞚� 鞕勲霅橂┐ 鞚措鞚茧 鞐半澖霌滊Μ瓴犾姷雼堧嫟.',
+    deleteLabel: '頇曥澑頃橂牑氅� 鞎勲灅 鞚措鞚检潉 鞛呺牓頃橃嫮鞁滌槫.',
+    deletePlaceholder: '鞚措鞚检潉 鞛呺牓頃� 欤检劯鞖�',
+    sendVerificationButton: '鞚胳 旖旊摐 氤措偞旮�',
+    verificationLabel: '鞚胳 旖旊摐',
+    verificationPlaceholder: '6鞛愲Μ 旖旊摐毳� 攵欖棳雱l姷雼堧嫟.',
+    permanentlyDeleteButton: '瓿勳爼 鞓侁惮 靷牅',
+    feedbackTitle: '頂茧摐氚�',
+    feedbackLabel: '瓿勳爼鞚� 靷牅頃� 鞚挫湢毳� 鞎岆牑欤检嫓瓴犾姷雼堦箤?',
+    feedbackPlaceholder: '靹犿儩鞝�',
+    deletePrivacyLinkTip: '雼轨偓臧� 攴�頃橃潣 雿办澊韯半ゼ 觳橂Μ頃橂姅 氚╇矔鞐� 雽�頃� 鞛愳劯頃� 雮挫毄鞚� 雼れ潓鞚� 彀胳“頃橃嫮鞁滌槫.',
+    workspaceIcon: '鞛戩梾 瓿店皠 鞎勳澊旖�',
+    editWorkspaceInfo: '鞛戩梾 瓿店皠 鞝曤炒 韼胳',
+    workspaceName: '鞛戩梾 瓿店皠 鞚措',
+  },
+  members: {
+    team: '韺�',
+    invite: '齑堧寑',
+    name: '鞚措',
+    lastActive: '斓滉芳 頇滊彊',
+    role: '鞐暊',
+    pending: '雽�旮� 欷�...',
+    owner: '靻岇湢鞛�',
+    admin: '甏�毽瀽',
+    adminTip: '鞎� 牍岆摐 氚� 韺� 靹れ爼 甏�毽� 臧�電�',
+    normal: '鞚茧皹',
+    normalTip: '鞎� 靷毄毵� 臧�電ロ晿瓿� 鞎� 牍岆摐電� 攵堦皜電�',
+    editor: '韼胳鞛�',
+    editorTip: '鞎� 牍岆摐毵� 臧�電ロ晿瓿� 韺� 靹れ爼 甏�毽� 攵堦皜電�',
+    inviteTeamMember: '韺� 氅る矂 齑堧寑',
+    inviteTeamMemberTip: '搿滉犯鞚� 頉勳棎 氚旊 韺� 雿办澊韯办棎 鞎§劯鞀ろ暊 靾� 鞛堨姷雼堧嫟.',
+    emailNotSetup: '鞚措鞚� 靹滊矂臧� 靹れ爼霅橃 鞎婌晞 齑堧寑 鞚措鞚检潉 氤措偧 靾� 鞐嗢姷雼堧嫟. 雽�鞁� 齑堧寑 頉� 氚滉笁霅橂姅 齑堧寑 毵來伂毳� 靷毄鞛愳棎瓴� 鞎岆牑欤检劯鞖�.',
+    email: '鞚措鞚�',
+    emailInvalid: '鞙犿毃頃橃 鞎婌潃 鞚措鞚� 順曥嫕',
+    emailPlaceholder: '鞚措鞚� 鞛呺牓',
+    sendInvite: '齑堧寑 氤措偞旮�',
+    invitedAsRole: '{{role}} 靷毄鞛愲 齑堧寑霅橃棃鞀惦媹雼�',
+    invitationSent: '齑堧寑臧� 鞝勳啞霅橃棃鞀惦媹雼�',
+    invitationSentTip: '齑堧寑臧� 鞝勳啞霅橃棃鞙茧┌, 攴鸽摛鞚� Dify鞐� 搿滉犯鞚疙晿鞐� 雼轨嫚鞚� 韺� 雿办澊韯办棎 鞎§劯鞀ろ暊 靾� 鞛堨姷雼堧嫟.',
+    invitationLink: '齑堧寑 毵來伂',
+    failedInvitationEmails: '雼れ潓 靷毄鞛愲摛鞚� 靹标车鞝侅溂搿� 齑堧寑霅橃 鞎婌晿鞀惦媹雼�',
+    ok: '頇曥澑',
+    removeFromTeam: '韺�鞐愳劀 鞝滉卑',
+    removeFromTeamTip: '韺� 鞎§劯鞀り皜 鞝滉卑霅╇媹雼�',
+    setAdmin: '甏�毽瀽 靹れ爼',
+    setMember: '鞚茧皹 氅る矂 靹れ爼',
+    setEditor: '韼胳鞛� 靹れ爼',
+    disInvite: '齑堧寑 旆唽',
+    deleteMember: '氅る矂 靷牅',
+    you: '(雮�)',
+    datasetOperator: '歆�鞁� 甏�毽瀽',
+    setBuilder: '牍岆崝搿� 靹れ爼',
+    builder: '瓯挫劋鞛�',
+    builderTip: '鞛愳嫚鞚� 鞎膘潉 甑稌 氚� 韼胳頃� 靾� 鞛堨姷雼堧嫟.',
+    datasetOperatorTip: '旮办垹 鞛愲毵� 甏�毽暊 靾� 鞛堨姷雼堧嫟.',
+  },
+  integrations: {
+    connected: '鞐瓣舶霅�',
+    google: 'Google',
+    googleAccount: 'Google 瓿勳爼鞙茧 搿滉犯鞚�',
+    github: 'GitHub',
+    githubAccount: 'GitHub 瓿勳爼鞙茧 搿滉犯鞚�',
+    connect: '鞐瓣舶',
+  },
+  language: {
+    displayLanguage: '響滌嫓 鞏胳柎',
+    timezone: '鞁滉皠雽�',
+  },
+  provider: {
+    apiKey: 'API 韨�',
+    enterYourKey: '鞐赴鞐� API 韨るゼ 鞛呺牓頃橃劯鞖�',
+    invalidKey: '鞙犿毃頃橃 鞎婌潃 OpenAI API 韨�',
+    validatedError: '瓴�歃� 鞁ろ尐:',
+    validating: '韨るゼ 頇曥澑頃橂姅 欷�...',
+    saveFailed: 'API 韨� 鞝�鞛� 鞁ろ尐',
+    apiKeyExceedBill: '鞚� API KEY鞐愲姅 靷毄 臧�電ロ暅 頃犽嫻霟夓澊 鞐嗢姷雼堧嫟. 鞛愳劯頃� 雮挫毄鞚�',
+    addKey: '韨� 於旉皜',
+    comingSoon: '瓿� 於滌嫓霅�',
+    editKey: '韼胳',
+    invalidApiKey: '鞙犿毃頃橃 鞎婌潃 API 韨�',
+    azure: {
+      apiBase: 'API 氩犾澊鞀�',
+      apiBasePlaceholder: 'Azure OpenAI 鞐旊摐韽澑韸胳潣 API 氩犾澊鞀� URL.',
+      apiKey: 'API 韨�',
+      apiKeyPlaceholder: '鞐赴鞐� API 韨るゼ 鞛呺牓頃橃劯鞖�',
+      helpTip: 'Azure OpenAI 靹滊箘鞀� 氚办毎旮�',
+    },
+    openaiHosted: {
+      openaiHosted: '順胳姢韺呺悳 OpenAI',
+      onTrial: '韸鸽澕鞚挫柤 欷�',
+      exhausted: '頃犽嫻霟夓澊 雼� 靷毄霅橃棃鞀惦媹雼�',
+      desc: 'Dify臧� 鞝滉车頃橂姅 OpenAI 順胳姢韺� 靹滊箘鞀るゼ 靷毄頃橂┐ GPT-3.5鞕� 臧欖潃 氇嵏鞚� 靷毄頃� 靾� 鞛堨姷雼堧嫟. 韸鸽澕鞚挫柤 頃犽嫻霟夓澊 雼� 靷毄霅橁赴 鞝勳棎 雼るジ 氇嵏 鞝滉车鞛愲ゼ 靹れ爼頃挫暭 頃╇媹雼�.',
+      callTimes: '順胳稖 須熿垬',
+      usedUp: '韸鸽澕鞚挫柤 頃犽嫻霟夓澊 雼� 靷毄霅橃棃鞀惦媹雼�. 雼るジ 氇嵏 鞝滉车鞛愲ゼ 於旉皜頃橃劯鞖�.',
+      useYourModel: '順勳灛 靷毄鞛� 鞝曥潣 氇嵏 鞝滉车鞛愲ゼ 靷毄 欷戩瀰雼堧嫟.',
+      close: '雼赴',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude 順胳姢韺�',
+      onTrial: '韸鸽澕鞚挫柤 欷�',
+      exhausted: '頃犽嫻霟夓澊 雼� 靷毄霅橃棃鞀惦媹雼�',
+      desc: '瓿犼笁 雽�頇� 氚� 彀届潣鞝侅澑 旖橅厫旄� 靸濎劚攵�韯� 靸侅劯頃� 歆�鞁滉箤歆� 雼れ枒頃� 鞛戩梾鞐� 臧曤牓頃� 氇嵏鞛呺媹雼�.',
+      callTimes: '順胳稖 須熿垬',
+      usedUp: '韸鸽澕鞚挫柤 頃犽嫻霟夓澊 雼� 靷毄霅橃棃鞀惦媹雼�. 雼るジ 氇嵏 鞝滉车鞛愲ゼ 於旉皜頃橃劯鞖�.',
+      useYourModel: '順勳灛 靷毄鞛� 鞝曥潣 氇嵏 鞝滉车鞛愲ゼ 靷毄 欷戩瀰雼堧嫟.',
+      close: '雼赴',
+      trialQuotaTip: 'Anthropic 韽夑皜韺� 頃犽嫻霟夓潃 2025/03/11鞐� 毵岆霅橂┌ 攴� 鞚错泟鞐愲姅 雿� 鞚挫儊 靷毄頃� 靾� 鞐嗢姷雼堧嫟. 鞝滊晫 頇滌毄頃橃嫓旮� 氚旊瀺雼堧嫟.',
+    },
+    anthropic: {
+      using: '鞛勲矤霌� 旮半姤鞚� 靷毄 欷戩瀰雼堧嫟',
+      enableTip: 'Anthropic 氇嵏鞚� 頇滌劚頇旐晿霠る┐ 毹检爛 OpenAI 霕愲姅 Azure OpenAI 靹滊箘鞀れ棎 氚旍澑霐╉暣鞎� 頃╇媹雼�.',
+      notEnabled: '牍勴櫆靹表檾霅�',
+      keyFrom: 'Anthropic鞐愳劀 API 韨るゼ 氚涭溂靹胳殧',
+    },
+    encrypted: {
+      front: 'API KEY電�',
+      back: '旮办垹鞚� 靷毄頃橃棳 鞎旐樃頇� 氚� 鞝�鞛ル惄雼堧嫟.',
+    },
+  },
+  modelProvider: {
+    notConfigured: '鞁滌姢韰� 氇嵏鞚� 鞎勳 鞕勳爠頌� 靹れ爼霅橃 鞎婌晞 鞚茧秬 旮半姤鞚� 靷毄頃� 靾� 鞐嗢姷雼堧嫟.',
+    systemModelSettings: '鞁滌姢韰� 氇嵏 靹れ爼',
+    systemModelSettingsLink: '鞁滌姢韰� 氇嵏 靹れ爼鞚� 頃勳殧頃� 鞚挫湢電� 氍挫棁鞛呺媹旯�?',
+    selectModel: '氇嵏 靹犿儩',
+    setupModelFirst: '毹检爛 氇嵏鞚� 靹れ爼頃橃劯鞖�',
+    systemReasoningModel: {
+      key: '鞁滌姢韰� 於旊 氇嵏',
+      tip: '鞎� 甑稌鞐� 靷毄霅橂姅 旮半掣 於旊 氇嵏鞚� 靹れ爼頃╇媹雼�. 霕愴暅 雽�頇� 鞚措 靸濎劚 氚� 雼れ潓 歆堧 鞝滌晥瓿� 臧欖潃 旮半姤霃� 旮半掣 於旊 氇嵏鞚� 靷毄頃╇媹雼�.',
+    },
+    embeddingModel: {
+      key: '鞛勲矤霐� 氇嵏',
+      tip: '歆�鞁� 氍胳劀 鞛勲矤霐� 觳橂Μ鞚� 旮半掣 氇嵏鞚� 靹れ爼頃╇媹雼�. 歆�鞁� 臧�鞝胳槫旮� 氚� 鞛勴彫韸胳棎 氇憪 鞚� 鞛勲矤霐� 氇嵏鞚� 氩№劙頇� 觳橂Μ鞐� 靷毄頃╇媹雼�. 氤�瓴巾晿氅� 臧�鞝胳槰 歆�鞁濌臣 歆堧 臧勳潣 氩№劙 彀洂鞚� 鞚检箻頃橃 鞎婌晞 臧�鞝胳槫旮办棎 鞁ろ尐頃╇媹雼�. 鞁ろ尐毳� 頂柬晿霠る┐ 鞚� 氇嵏鞚� 氤�瓴巾晿歆� 毵堨劯鞖�.',
+      required: '鞛勲矤霐� 氇嵏鞚� 頃勳殧頃╇媹雼�',
+    },
+    speechToTextModel: {
+      key: '鞚岇劚-to-韰嶌姢韸� 氇嵏',
+      tip: '雽�頇旍棎靹滌潣 鞚岇劚-to-韰嶌姢韸� 鞛呺牓鞐� 靷毄霅橂姅 旮半掣 氇嵏鞚� 靹れ爼頃╇媹雼�.',
+    },
+    ttsModel: {
+      key: '韰嶌姢韸�-to-鞚岇劚 氇嵏',
+      tip: '雽�頇旍棎靹滌潣 韰嶌姢韸�-to-鞚岇劚 鞛呺牓鞐� 靷毄霅橂姅 旮半掣 氇嵏鞚� 靹れ爼頃╇媹雼�.',
+    },
+    rerankModel: {
+      key: '鞛灜韥� 氇嵏',
+      tip: '鞛灜韥� 氇嵏鞚� 靷毄鞛� 炜茧Μ鞕�鞚� 鞚橂鞝� 鞚检箻毳� 旮半皹鞙茧 頉勲炒 氍胳劀 氇╇鞚� 鞛鞍鞐错晿鞐� 鞚橂鞝� 靾滌渼毳� 頄レ儊鞁滍偟雼堧嫟.',
+    },
+    quota: '頃犽嫻霟�',
+    searchModel: '瓴�靸� 氇嵏',
+    noModelFound: '{{model}}鞐� 雽�頃� 氇嵏鞚� 彀眷潉 靾� 鞐嗢姷雼堧嫟',
+    models: '氇嵏',
+    showMoreModelProvider: '雿� 毵庫潃 氇嵏 鞝滉车鞛� 響滌嫓',
+    selector: {
+      tip: '鞚� 氇嵏鞚� 靷牅霅橃棃鞀惦媹雼�. 雼るジ 氇嵏鞚� 於旉皜頃橁卑雮� 雼るジ 氇嵏鞚� 靹犿儩頃橃劯鞖�.',
+      emptyTip: '靷毄 臧�電ロ暅 氇嵏鞚� 鞐嗢姷雼堧嫟',
+      emptySetting: '靹れ爼鞙茧 鞚措彊頃橃棳 甑劚頃橃劯鞖�',
+      rerankTip: '鞛灜韥� 氇嵏鞚� 靹れ爼頃橃劯鞖�',
+    },
+    card: {
+      quota: '頃犽嫻霟�',
+      onTrial: '韸鸽澕鞚挫柤 欷�',
+      paid: '鞙犽',
+      quotaExhausted: '頃犽嫻霟夓澊 雼� 靷毄霅橃棃鞀惦媹雼�',
+      callTimes: '順胳稖 須熿垬',
+      tokens: '韱犿伆',
+      buyQuota: 'Buy Quota',
+      priorityUse: '鞖办劆 靷毄',
+      removeKey: 'API 韨� 鞝滉卑',
+      tip: '歆�攵堧悳 頃犽嫻霟夓棎 鞖办劆靾滌渼臧� 攵�鞐惄雼堧嫟. 韽夑皜韺� 頃犽嫻霟夓潃 鞙犽 頃犽嫻霟夓澊 靻岇霅� 頉� 靷毄霅╇媹雼�.',
+    },
+    item: {
+      deleteDesc: '{{modelName}}鞚�(電�) 鞁滌姢韰� 於旊 氇嵏搿� 靷毄 欷戩瀰雼堧嫟. 鞝滉卑 頉� 鞚茧秬 旮半姤鞚� 靷毄頃� 靾� 鞐嗢姷雼堧嫟. 頇曥澑頃橃嫓瓴犾姷雼堦箤?',
+      freeQuota: '氍措 頃犽嫻霟�',
+    },
+    addApiKey: 'API 韨� 於旉皜',
+    invalidApiKey: '鞛橂霅� API 韨�',
+    encrypted: {
+      front: 'API 韨る姅 雼れ潓 旮办垹鞚� 靷毄頃橃棳 鞎旐樃頇旊悩鞏� 鞝�鞛ル惄雼堧嫟',
+      back: ' 旮办垹.',
+    },
+    freeQuota: {
+      howToEarn: '鞏浑姅 氚╇矔',
+    },
+    addMoreModelProvider: '氇嵏 鞝滉车鞛� 於旉皜',
+    addModel: '氇嵏 於旉皜',
+    modelsNum: '{{num}}臧滌潣 氇嵏',
+    showModels: '氇嵏 響滌嫓',
+    showModelsNum: '{{num}}臧滌潣 氇嵏 響滌嫓',
+    collapse: '於曥唽',
+    config: '靹れ爼',
+    modelAndParameters: '氇嵏 氚� 毵り皽氤�靾�',
+    model: '氇嵏',
+    featureSupported: '{{feature}} 歆�鞗愲惃',
+    callTimes: '順胳稖 須熿垬',
+    credits: '氅旍嫓歆� 韥爤霐�',
+    buyQuota: '頃犽嫻霟� 甑Г',
+    getFreeTokens: '氍措 韱犿伆 氚涥赴',
+    priorityUsing: '鞖办劆 靷毄',
+    deprecated: '靷毄 欷戨嫧霅�',
+    confirmDelete: '靷牅毳� 頇曥澑頃橃嫓瓴犾姷雼堦箤?',
+    quotaTip: '雮潃 氍措 韱犿伆 靷毄 臧�電�',
+    loadPresets: '頂勲Μ靺� 搿滊摐',
+    parameters: '毵り皽氤�靾�',
+    apiKey: 'API 韨�',
+    defaultConfig: '旮半掣 甑劚',
+    providerManaged: '鞝滉车鞛� 甏�毽�',
+    loadBalancing: '攵�頃� 攵勳偘Load balancing',
+    addConfig: '甑劚 於旉皜',
+    apiKeyStatusNormal: 'APIKey 靸來儨電� 鞝曥儊鞛呺媹雼�.',
+    configLoadBalancing: 'Config 搿滊摐 氚鸽煱鞁�',
+    editConfig: '甑劚 韼胳',
+    loadBalancingHeadline: '搿滊摐 氚鸽煱鞁�',
+    modelHasBeenDeprecated: '鞚� 氇嵏鞚� 雿� 鞚挫儊 靷毄霅橃 鞎婌姷雼堧嫟',
+    loadBalancingDescription: '鞐煬 鞛愱博 歃濍獏 靹疙姼搿� 攵�雼挫潉 欷勳瀰雼堧嫟.',
+    upgradeForLoadBalancing: '搿滊摐 氚鸽煱鞁膘潉 靷毄頃橂弰搿� 瓿勴殟鞚� 鞐呹犯霠堨澊霌滍暕雼堧嫟.',
+    apiKeyRateLimit: '靻嶋弰 鞝滍暅鞐� 霃勲嫭頄堨溂氅�, {{seconds}}s 頉勳棎 靷毄頃� 靾� 鞛堨姷雼堧嫟.',
+    loadBalancingInfo: '旮半掣鞝侅溂搿� 攵�頃� 攵勳偘鞚� 霛检毚霌� 搿滊箞 鞝勲灥鞚� 靷毄頃╇媹雼�. 靻嶋弰 鞝滍暅鞚� 韸鸽Μ瓯半悩氅� 1攵勳潣 頊挫 旮瓣皠鞚� 鞝侅毄霅╇媹雼�.',
+    loadBalancingLeastKeyWarning: '搿滊摐 氚鸽煱鞁膘潉 靷毄頃橂牑氅� 斓滌唽 2臧滌潣 韨るゼ 靷毄頃橂弰搿� 靹れ爼頃挫暭 頃╇媹雼�.',
+    providerManagedDescription: '氇嵏 瓿店笁鞛愱皜 鞝滉车頃橂姅 雼澕 鞛愱博 歃濍獏 歆戫暕鞚� 靷毄頃╇媹雼�.',
+    installProvider: '氇嵏 瓿店笁鞛� 靹れ箻',
+    discoverMore: '雿� 鞎岇晞氤搓赴',
+    emptyProviderTitle: '氇嵏 瓿店笁鞛愱皜 靹れ爼霅橃 鞎婌潓',
+    configureTip: 'api-key 靹れ爼 霕愲姅 靷毄頃� 氇嵏 於旉皜',
+    emptyProviderTip: '毹检爛 氇嵏 瓿店笁鞛愲ゼ 靹れ箻頃橃嫮鞁滌槫.',
+    toBeConfigured: '甑劚 鞓堨爼',
+  },
+  dataSource: {
+    add: '雿办澊韯� 靻岇姢 於旉皜頃橁赴',
+    connect: '鞐瓣舶頃橁赴',
+    notion: {
+      title: 'Notion',
+      description: '雲胳厴鞚� 歆�鞁� 雿办澊韯� 靻岇姢搿� 靷毄頃橁赴.',
+      connectedWorkspace: '鞛戩梾 瓿店皠鞐� 鞐瓣舶霅�',
+      addWorkspace: '鞛戩梾 瓿店皠鞐� 於旉皜頃橁赴',
+      connected: '鞐瓣舶霅�',
+      disconnected: '鞐瓣舶 鞎堧惃',
+      changeAuthorizedPages: '項堦皜霅� 韼橃澊歆� 氤�瓴巾晿旮�',
+      pagesAuthorized: '韼橃澊歆�臧� 項堦皜霅�',
+      sync: '霃欔赴頇�',
+      remove: '鞝滉卑頃橁赴',
+      selector: {
+        pageSelected: '韼橃澊歆� 靹犿儩霅�',
+        searchPages: '韼橃澊歆� 瓴�靸�...',
+        noSearchResult: '瓴�靸� 瓴瓣臣 鞐嗢潓',
+        addPages: '韼橃澊歆� 於旉皜頃橁赴',
+        preview: '氙鸽Μ氤搓赴',
+      },
+    },
+    website: {
+      inactive: '瓴岇溂毳�',
+      title: '鞗� 靷澊韸�',
+      configuredCrawlers: '甑劚霅� 韥·霟�',
+      with: '鞕�',
+      active: '頇滊彊鞝侅澑',
+      description: '鞗� 韥·霟ゼ 靷毄頃橃棳 鞗� 靷澊韸胳棎靹� 旖橅厫旄犽ゼ 臧�鞝胳樀雼堧嫟.',
+    },
+    configure: '甑劚',
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'API 韨�',
+      apiKeyPlaceholder: 'API 韨るゼ 鞛呺牓頃橃劯鞖�',
+      keyFrom: 'SerpAPI 瓿勳爼 韼橃澊歆�鞐愳劀 SerpAPI 韨るゼ 臧�鞝胳槫靹胳殧',
+    },
+  },
+  apiBasedExtension: {
+    title: 'API 旮半皹 頇曥灔鞚� Dify 鞎犿攲毽紑鞚挫厴 鞝勳泊鞐愳劀 臧勴幐頃� 靷毄鞚� 鞙勴暅 靹れ爼鞚� 雼垳頇旐晿瓿� 歆戩鞝侅澑 API 甏�毽ゼ 鞝滉车頃╇媹雼�.',
+    link: '靷毄鞛� 鞝曥潣 API 旮半皹 頇曥灔鞚� 臧滊皽頃橂姅 氚╇矔 氚办毎旮�',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: 'API 旮半皹 頇曥灔 於旉皜',
+    selector: {
+      title: 'API 旮半皹 頇曥灔',
+      placeholder: 'API 旮半皹 頇曥灔鞚� 靹犿儩頃橃劯鞖�',
+      manage: 'API 旮半皹 頇曥灔 甏�毽�',
+    },
+    modal: {
+      title: 'API 旮半皹 頇曥灔 於旉皜',
+      editTitle: 'API 旮半皹 頇曥灔 韼胳',
+      name: {
+        title: '鞚措',
+        placeholder: '鞚措鞚� 鞛呺牓頃橃劯鞖�',
+      },
+      apiEndpoint: {
+        title: 'API 鞐旊摐韽澑韸�',
+        placeholder: 'API 鞐旊摐韽澑韸鸽ゼ 鞛呺牓頃橃劯鞖�',
+      },
+      apiKey: {
+        title: 'API 韨�',
+        placeholder: 'API 韨るゼ 鞛呺牓頃橃劯鞖�',
+        lengthError: 'API 韨る姅 5鞛� 氙鸽鞚挫柎鞎� 頃╇媹雼�',
+      },
+    },
+    type: '鞙犿槙',
+  },
+  about: {
+    changeLog: '氤�瓴� 搿滉犯',
+    updateNow: '歆�旮� 鞐呺嵃鞚错姼',
+    nowAvailable: 'Dify {{version}} 靷毄 臧�電ロ暕雼堧嫟.',
+    latestAvailable: 'Dify {{version}} 斓滌嫚 氩勳爠鞛呺媹雼�.',
+  },
+  appMenus: {
+    overview: '氇媹韯半',
+    promptEng: '鞓れ紑鞀ろ姼霠堨澊韸�',
+    apiAccess: 'API 鞎§劯鞀�',
+    logAndAnn: '搿滉犯 氚� 鞏措吀韰岇澊靺�',
+    logs: '搿滉犯',
+  },
+  environment: {
+    testing: '韰岇姢韸�',
+    development: '臧滊皽',
+  },
+  appModes: {
+    completionApp: '韰嶌姢韸� 靸濎劚',
+    chatApp: '毂勴寘 鞎�',
+  },
+  datasetMenus: {
+    documents: '氍胳劀',
+    hitTesting: '瓴�靸� 韰岇姢韸�',
+    settings: '靹れ爼',
+    emptyTip: '鞐瓣舶霅� 歆�鞁濎澊 鞐嗢姷雼堧嫟. 鞎犿攲毽紑鞚挫厴 霕愲姅 頂岆煬攴胳澑鞙茧 鞚措彊頃橃棳 鞐瓣舶鞚� 鞕勲頃橃劯鞖�.',
+    viewDoc: '氍胳劀 氤搓赴',
+    relatedApp: '甏�霠� 鞎�',
+    noRelatedApp: '鞐瓣舶霅� 鞎� 鞐嗢潓',
+  },
+  voiceInput: {
+    speaking: '歆�旮� 毵愴晿瓿� 鞛堨姷雼堧嫟...',
+    converting: '韰嶌姢韸鸽 氤�頇� 欷�...',
+    notAllow: '毵堨澊韥皜 項堨毄霅橃 鞎婌晿鞀惦媹雼�',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: '雽�頇� 鞚措 氚旉靖旮�',
+    conversationName: '雽�頇� 鞚措',
+    conversationNamePlaceholder: '雽�頇� 鞚措鞚� 鞛呺牓頃橃劯鞖�',
+    conversationNameCanNotEmpty: '雽�頇� 鞚措鞚� 頃勳垬鞛呺媹雼�',
+    citation: {
+      title: '鞚胳毄',
+      linkToDataset: '歆�鞁� 毵來伂',
+      characters: '氍胳瀽靾�:',
+      hitCount: '瓴�靸� 須熿垬:',
+      vectorHash: '氩№劙 頃挫嫓:',
+      hitScore: '瓴�靸� 鞝愳垬:',
+    },
+    inputPlaceholder: '氪囮臣 雽�頇�',
+    thought: '靸濌皝',
+    thinking: '靸濌皝...',
+    resend: '鞛爠靻�',
+  },
+  promptEditor: {
+    placeholder: '鞐赴鞐� 頂勲‖頂勴姼 雼柎毳� 鞛呺牓頃橃劯鞖�. 氤�靾橂ゼ 靷届瀰頃橂牑氅� "{{"毳� 鞛呺牓頃橁碃, 頂勲‖頂勴姼 旎厫旄� 敫旊鞚� 靷届瀰頃橂牑氅� "/"毳� 鞛呺牓頃橃劯鞖�.',
+    context: {
+      item: {
+        title: '旎厤鞀ろ姼',
+        desc: '旎厤鞀ろ姼 韰滍攲毽快潉 靷届瀰頃╇媹雼�.',
+      },
+      modal: {
+        title: '{{num}} 氩堨Ц 旎厤鞀ろ姼',
+        add: '旎厤鞀ろ姼 於旉皜',
+        footer: '鞎勲灅鞚� 旎厤鞀ろ姼 靹轨厴鞐愳劀 旎厤鞀ろ姼毳� 甏�毽暊 靾� 鞛堨姷雼堧嫟.',
+      },
+    },
+    history: {
+      item: {
+        title: '雽�頇� 旮半',
+        desc: '瓿缄卑 氅旍嫓歆� 韰滍攲毽快潉 靷届瀰頃╇媹雼�.',
+      },
+      modal: {
+        title: '鞓堨嫓',
+        user: '鞎堧厱頃橃劯鞖�',
+        assistant: '鞎堧厱頃橃劯鞖�! 鞓る姌鞚� 鞏措柣瓴� 霃勳檧霌滊Υ旯岇殧?',
+        edit: '雽�頇� 鞐暊 鞚措 韼胳',
+      },
+    },
+    variable: {
+      item: {
+        title: '氤�靾� 氚� 鞕鸽秬 霃勱惮',
+        desc: '氤�靾� 氚� 鞕鸽秬 霃勱惮毳� 靷届瀰頃╇媹雼�.',
+      },
+      outputToolDisabledItem: {
+        title: '氤�靾�',
+        desc: '氤�靾橂ゼ 靷届瀰頃╇媹雼�.',
+      },
+      modal: {
+        add: '靸堧鞖� 氤�靾�',
+        addTool: '靸堧鞖� 霃勱惮',
+      },
+    },
+    query: {
+      item: {
+        title: '炜茧Μ',
+        desc: '靷毄鞛� 炜茧Μ 韰滍攲毽快潉 靷届瀰頃╇媹雼�.',
+      },
+    },
+    existed: '頂勲‖頂勴姼鞐� 鞚措 臁挫灛頃╇媹雼�',
+  },
+  imageUploader: {
+    uploadFromComputer: '旎错摠韯办棎靹� 鞐呺霌�',
+    uploadFromComputerReadError: '鞚措歆� 鞚疥赴 鞁ろ尐. 雼れ嫓 鞁滊弰頃橃劯鞖�.',
+    uploadFromComputerUploadError: '鞚措歆� 鞐呺霌� 鞁ろ尐. 雼れ嫓 鞐呺霌滍晿靹胳殧.',
+    uploadFromComputerLimit: '鞐呺霌� 鞚措歆� 韥赴電� {{size}} MB毳� 齑堦臣頃� 靾� 鞐嗢姷雼堧嫟',
+    pasteImageLink: '鞚措歆� 毵來伂 攵欖棳雱j赴',
+    pasteImageLinkInputPlaceholder: '鞐赴鞐� 鞚措歆� 毵來伂毳� 攵欖棳雱l溂靹胳殧',
+    pasteImageLinkInvalid: '鞙犿毃頃橃 鞎婌潃 鞚措歆� 毵來伂',
+    imageUpload: '鞚措歆� 鞐呺霌�',
+  },
+  tag: {
+    placeholder: '氇摖 韮滉犯',
+    addNew: '靸� 韮滉犯 於旉皜',
+    noTag: '韮滉犯 鞐嗢潓',
+    noTagYet: '鞎勳 韮滉犯臧� 鞐嗢姷雼堧嫟',
+    addTag: '韮滉犯 於旉皜',
+    editTag: '韮滉犯 韼胳',
+    manageTags: '韮滉犯 甏�毽�',
+    selectorPlaceholder: '瓴�靸� 霕愲姅 靸濎劚頃� 氍胳瀽毳� 鞛呺牓頃橃劯鞖�',
+    create: '靸濎劚',
+    delete: '韮滉犯 靷牅',
+    deleteTip: '韮滉犯臧� 靷毄 欷戩瀰雼堧嫟. 靷牅頃橃嫓瓴犾姷雼堦箤?',
+    created: '韮滉犯臧� 靹标车鞝侅溂搿� 靸濎劚霅橃棃鞀惦媹雼�',
+    failed: '韮滉犯 靸濎劚鞐� 鞁ろ尐頄堨姷雼堧嫟',
+  },
+  errorMsg: {
+    urlError: 'URL鞚� http:// 霕愲姅 https:// 搿� 鞁滌瀾頃挫暭 頃╇媹雼�.',
+    fieldRequired: '{{field}}電� 頃勳垬鞛呺媹雼�.',
+  },
+  fileUploader: {
+    uploadFromComputer: '搿滌滑 鞐呺霌�',
+    pasteFileLinkInputPlaceholder: 'URL 鞛呺牓...',
+    pasteFileLinkInvalid: '鞙犿毃頃橃 鞎婌潃 韺岇澕 毵來伂',
+    uploadFromComputerReadError: '韺岇澕 鞚疥赴鞐� 鞁ろ尐頄堨姷雼堧嫟. 雼れ嫓 鞁滊弰頃橃嫮鞁滌槫.',
+    pasteFileLink: '韺岇澕 毵來伂 攵欖棳雱j赴',
+    fileExtensionNotSupport: '歆�鞗愲悩歆� 鞎婋姅 韺岇澕 頇曥灔鞛�',
+    uploadFromComputerLimit: '鞐呺霌� 韺岇澕鞚� {{size}}毳� 齑堦臣頃� 靾� 鞐嗢姷雼堧嫟.',
+    uploadFromComputerUploadError: '韺岇澕 鞐呺霌滌棎 鞁ろ尐頄堨姷雼堧嫟. 雼れ嫓 鞐呺霌滍晿鞁嫓鞓�.',
+  },
+  license: {
+    expiring_plural: '{{count}}鞚� 頉勳棎 毵岆',
+    expiring: '頃橂( 頉勳棎 毵岆',
+  },
+  pagination: {
+    perPage: '韼橃澊歆�雼� 頃 靾�',
+  },
+  theme: {
+    theme: '欤检牅',
+    light: '牍�',
+    dark: '鞏措憼',
+    auto: '鞁滌姢韰�',
+  },
+  compliance: {
+    iso27001: 'ISO 27001:2022 鞚胳',
+    soc2Type1: 'SOC 2 鞙犿槙 I 氤搓碃靹�',
+    soc2Type2: 'SOC 2 鞙犿槙 II 氤搓碃靹�',
+    gdpr: 'GDPR DPA',
+    professionalUpgradeTooltip: '韺� 頂岆灉 鞚挫儊鞐愳劀毵� 靷毄頃� 靾� 鞛堨姷雼堧嫟.',
+    sandboxUpgradeTooltip: '鞝勲臧� 霕愲姅 韺� 頂岆灉鞐愳劀毵� 靷毄頃� 靾� 鞛堨姷雼堧嫟.',
+  },
+  imageInput: {
+    supportedFormats: 'PNG, JPG, JPEG, WEBP 氚� GIF毳� 歆�鞗愴暕雼堧嫟.',
+    browse: '敫岆澕鞖办',
+    dropImageHere: '鞐赴鞐� 鞚措歆�毳� 霌滊…頃橁卑雮�',
+  },
+}
+
+export default translation
diff --git a/i18n/ko-KR/custom.ts b/i18n/ko-KR/custom.ts
new file mode 100644
index 0000000..8b49549
--- /dev/null
+++ b/i18n/ko-KR/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: '靷毄鞛� 鞝曥潣',
+  upgradeTip: {
+    prefix: '頂岆灉鞚� 鞐呹犯霠堨澊霌滍晿鞐�',
+    suffix: '敫岆灉霌滊ゼ 靷毄鞛� 鞝曥潣頃橃劯鞖�.',
+    des: '瓿勴殟鞚� 鞐呹犯霠堨澊霌滍晿鞐� 敫岆灉霌滊ゼ 毵烄钉頇旐晿靹胳殧.',
+    title: '頂岆灉鞚� 鞐呹犯霠堨澊霌滍晿靹胳殧',
+  },
+  webapp: {
+    title: 'WebApp 敫岆灉霌� 靷毄鞛� 鞝曥潣',
+    removeBrand: 'Powered by Dify 靷牅',
+    changeLogo: 'Powered by 敫岆灉霌� 鞚措歆� 氤�瓴�',
+    changeLogoTip: '斓滌唽 韥赴 40x40px鞚� SVG 霕愲姅 PNG 順曥嫕',
+  },
+  app: {
+    title: '鞎� 項る崝 敫岆灉霌� 靷毄鞛� 鞝曥潣',
+    changeLogoTip: '斓滌唽 韥赴 80x80px鞚� SVG 霕愲姅 PNG 順曥嫕',
+  },
+  upload: '鞐呺霌�',
+  uploading: '鞐呺霌� 欷�',
+  uploadedFail: '鞚措歆� 鞐呺霌� 鞁ろ尐. 雼れ嫓 鞐呺霌滍暣 欤检劯鞖�.',
+  change: '氤�瓴�',
+  apply: '鞝侅毄',
+  restore: '旮半掣臧掛溂搿� 氤奠洂',
+  customize: {
+    contactUs: '氍胳潣頃橁赴',
+    prefix: '鞎� 雮� 敫岆灉霌� 搿滉碃毳� 靷毄鞛� 鞝曥潣頃橂牑氅�,',
+    suffix: '鞐旐劙頂勲澕鞚挫 氩勳爠鞙茧 鞐呹犯霠堨澊霌滍晿靹胳殧.',
+  },
+}
+
+export default translation
diff --git a/i18n/ko-KR/dataset-creation.ts b/i18n/ko-KR/dataset-creation.ts
new file mode 100644
index 0000000..4b5ee3f
--- /dev/null
+++ b/i18n/ko-KR/dataset-creation.ts
@@ -0,0 +1,219 @@
+const translation = {
+  steps: {
+    header: {
+      creation: '歆�鞁� 靸濎劚',
+      update: '雿办澊韯� 於旉皜',
+      fallbackRoute: '歆�鞁�',
+    },
+    one: '雿办澊韯� 靻岇姢 靹犿儩',
+    two: '韰嶌姢韸� 鞝勳矘毽� 氚� 韥措Μ雼�',
+    three: '鞁ろ枆 氚� 鞕勲',
+  },
+  error: {
+    unavailable: '鞚� 歆�鞁濎潃 靷毄頃� 靾� 鞐嗢姷雼堧嫟',
+  },
+  stepOne: {
+    filePreview: '韺岇澕 氙鸽Μ氤搓赴',
+    pagePreview: '韼橃澊歆� 氙鸽Μ氤搓赴',
+    dataSourceType: {
+      file: '韰嶌姢韸� 韺岇澕鞐愳劀 臧�鞝胳槫旮�',
+      notion: 'Notion 霃欔赴頇�',
+      web: '鞗� 靷澊韸� 霃欔赴頇�',
+    },
+    uploader: {
+      title: '韰嶌姢韸� 韺岇澕 鞐呺霌�',
+      button: '韺岇澕鞚措倶 韽措崝毳� 雭岇柎靹� 雴撽赴',
+      browse: '彀眷晞氤搓赴',
+      tip: '{{supportTypes}}鞚�(毳�) 歆�鞗愴暕雼堧嫟. 韺岇澕雼� 斓滊寑 韥赴電� {{size}}MB鞛呺媹雼�.',
+      validation: {
+        typeError: '歆�鞗愲悩歆� 鞎婋姅 韺岇澕 鞙犿槙鞛呺媹雼�',
+        size: '韺岇澕 韥赴臧� 雱堧 韥诫媹雼�. 斓滊寑 韥赴電� {{size}}MB鞛呺媹雼�',
+        count: '鞐煬 韺岇澕鞚� 歆�鞗愲悩歆� 鞎婌姷雼堧嫟',
+        filesNumber: '鞚缄磩 鞐呺霌� 鞝滍暅({{filesNumber}}臧�)鞐� 霃勲嫭頄堨姷雼堧嫟.',
+      },
+      cancel: '旆唽',
+      change: '氤�瓴�',
+      failed: '鞐呺霌滌棎 鞁ろ尐頄堨姷雼堧嫟',
+    },
+    notionSyncTitle: 'Notion鞐� 鞐瓣舶霅橃 鞎婌晿鞀惦媹雼�',
+    notionSyncTip: 'Notion瓿� 霃欔赴頇旐晿霠る┐ 毹检爛 Notion鞐� 鞐瓣舶頃挫暭 頃╇媹雼�.',
+    connect: '鞐瓣舶頃橁赴',
+    button: '雼れ潓',
+    emptyDatasetCreation: '牍勳柎鞛堧姅 歆�鞁� 靸濎劚',
+    modal: {
+      title: '牍勳柎鞛堧姅 歆�鞁� 靸濎劚',
+      tip: '牍勳柎鞛堧姅 歆�鞁濎棎電� 氍胳劀臧� 韽暔霅橃 鞎婌溂氅� 鞏胳牅霌犾 氍胳劀毳� 鞐呺霌滍暊 靾� 鞛堨姷雼堧嫟.',
+      input: '歆�鞁� 鞚措',
+      placeholder: '鞛呺牓頃橃劯鞖�',
+      nameNotEmpty: '鞚措鞚� 牍勳泴霊� 靾� 鞐嗢姷雼堧嫟',
+      nameLengthInvalid: '鞚措鞚� 1~40鞛愳棳鞎� 頃╇媹雼�',
+      cancelButton: '旆唽',
+      confirmButton: '靸濎劚',
+      failed: '靸濎劚鞐� 鞁ろ尐頄堨姷雼堧嫟',
+    },
+    website: {
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      limit: '頃滉硠',
+      options: '鞓奠厴',
+      firecrawlDoc: 'Firecrawl 氍胳劀',
+      selectAll: '氇憪 靹犿儩',
+      maxDepth: '斓滊寑 靾橃嫭',
+      includeOnlyPaths: '瓴诫毵� 韽暔',
+      excludePaths: '瓴诫 鞝滌櫢',
+      preview: '氙鸽Μ 氤搓赴',
+      run: '雼Μ雼�',
+      fireCrawlNotConfigured: 'Firecrawl鞚� 甑劚霅橃 鞎婌晿鞀惦媹雼�.',
+      firecrawlTitle: 'Firecrawl搿� 馃敟鞗� 旖橅厫旄� 於旍稖',
+      configure: '甑劚',
+      resetAll: '氇憪 鞛劋鞝�',
+      crawlSubPage: '頃橃渼 韼橃澊歆� 韥·毵�',
+      exceptionErrorTitle: 'Firecrawl 鞛戩梾鞚� 鞁ろ枆頃橂姅 霃欖晥 鞓堨櫢臧� 氚滌儩頄堨姷雼堧嫟.',
+      scrapTimeInfo: '{{time}}s 雮挫棎 齑� {{total}} 韼橃澊歆�毳� 鞀ろ伂霝╉枅鞀惦媹雼�.',
+      unknownError: '鞎� 靾� 鞐嗠姅 鞓る',
+      totalPageScraped: '鞀ろ伂霝╉暅 齑� 韼橃澊歆� 靾�:',
+      fireCrawlNotConfiguredDescription: 'API 韨る Firecrawl鞚� 甑劚頃橃棳 靷毄頃╇媹雼�.',
+      extractOnlyMainContent: '旮半掣 旖橅厫旄犽 於旍稖頃╇媹雼�(毹鸽Μ旮�, 韮愳儔, 氚旊嫢旮� 霌� 鞐嗢潓).',
+      maxDepthTooltip: '鞛呺牓頃� URL鞚� 旮办鞙茧 韥·毵來暊 斓滊寑 靾橃鞛呺媹雼�. 旯婌澊 0鞚� 鞛呺牓 霅� url鞚� 韼橃澊歆�毳� 旮侅柎 雮搓碃, 旯婌澊 1鞚� url瓿� enteredURL + one / 鞚错泟鞚� 氇摖 瓴冹潉 旮侅柎 氇溂電� 鞁濎瀰雼堧嫟.',
+      chooseProvider: '鞝滉车鞛� 靹犿儩',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      useSitemap: '靷澊韸鸽У 靷毄',
+      jinaReaderNotConfiguredDescription: '鞎§劯鞀るゼ 鞙勴暣 氍措 API 韨るゼ 鞛呺牓頃橃棳 Jina Reader毳� 靹れ爼頃╇媹雼�.',
+      jinaReaderDoc: 'Jina Reader鞐� 雽�頃� 鞛愳劯頌� 鞎岇晞氤搓赴',
+      jinaReaderTitle: '鞝勳泊 靷澊韸鸽ゼ Markdown鞙茧 氤�頇�',
+      jinaReaderNotConfigured: 'Jina Reader臧� 甑劚霅橃 鞎婌晿鞀惦媹雼�.',
+      useSitemapTooltip: '靷澊韸鸽У鞚� 霐半澕 靷澊韸鸽ゼ 韥·毵來暕雼堧嫟. 攴鸽爣歆� 鞎婌潃 瓴届毎 Jina Reader電� 韼橃澊歆� 甏�霠劚鞐� 霐半澕 氚橂车鞝侅溂搿� 韥·毵來晿鞐� 雿� 鞝侅毵� 雿� 雴掛潃 頀堨鞚� 韼橃澊歆�毳� 靸濎劚頃╇媹雼�.',
+      watercrawlDoc: '鞗岉劙韥· 氍胳劀',
+      waterCrawlNotConfiguredDescription: 'API 韨る Watercrawl鞚� 甑劚頃橃棳 靷毄頃橃嫮鞁滌槫.',
+      watercrawlTitle: 'Watercrawl搿� 鞗� 旖橅厫旄� 於旍稖頃橁赴',
+      configureFirecrawl: '韺岇澊鞏错伂搿� 甑劚頃橁赴',
+      watercrawlDocLink: '鞗轨偓鞚错姼鞐愳劀 霃欔赴頇旐晿旮�',
+      configureJinaReader: '歆�雮� 毽崝 靹れ爼頃橁赴',
+      waterCrawlNotConfigured: 'Watercrawl鞚� 靹れ爼霅橃柎 鞛堨 鞎婌姷雼堧嫟.',
+      configureWatercrawl: '鞗岉劙韥· 甑劚頃橁赴',
+    },
+    cancel: '旆唽',
+  },
+  stepTwo: {
+    segmentation: '觳伂 靹れ爼',
+    auto: '鞛愲彊',
+    autoDescription: '觳伂 氚� 鞝勳矘毽� 攴滌箼鞚� 鞛愲彊鞙茧 靹れ爼頃╇媹雼�. 觳橃潓 靷毄鞛愲姅 鞚� 鞓奠厴鞚� 靹犿儩頃橂姅 瓴冹潉 甓岇灔頃╇媹雼�.',
+    custom: '靷毄鞛� 靹れ爼',
+    customDescription: '觳伂 攴滌箼, 觳伂 旮胳澊, 鞝勳矘毽� 攴滌箼 霌膘潉 靷毄鞛� 鞝曥潣頃╇媹雼�.',
+    separator: '靹戈犯毹柬姼 鞁濍硠鞛�',
+    separatorPlaceholder: '鞓�: 欷勲皵昕�(\\\\n) 霕愲姅 韸轨垬 甑秳鞛�(鞓�: "***")',
+    maxLength: '斓滊寑 觳伂 旮胳澊',
+    overlap: '觳伂 欷戩博',
+    overlapTip: '觳伂 欷戩博鞚� 靹れ爼頃橃棳 攴� 靷澊鞚� 鞚橂鞝� 鞐瓣磤靹膘潉 鞙犾頃橁碃 瓴�靸� 須臣毳� 頄レ儊鞁滍偓 靾� 鞛堨姷雼堧嫟. 斓滊寑 觳伂 韥赴鞚� 10%~25%搿� 靹れ爼頃橂姅 瓴冹澊 膦嬱姷雼堧嫟.',
+    overlapCheck: '觳伂 欷戩博鞚� 斓滊寑 觳伂 旮胳澊毳� 齑堦臣頃� 靾� 鞐嗢姷雼堧嫟',
+    rules: '韰嶌姢韸� 鞝勳矘毽� 攴滌箼',
+    removeExtraSpaces: '鞐办啀霅� 瓿惦氨, 欷勲皵昕�, 韮潉 雽�觳错暕雼堧嫟',
+    removeUrlEmails: '氇摖 URL瓿� 鞚措鞚� 欤检唽毳� 鞝滉卑頃╇媹雼�',
+    removeStopwords: '鞚茧皹鞝侅澑 攵堨毄鞏�(鞓�: "a", "an", "the" 霌�)毳� 鞝滉卑頃╇媹雼�',
+    preview: '氙鸽Μ氤搓赴',
+    reset: '齑堦赴頇�',
+    indexMode: '鞚鸽嵄鞀� 氇摐',
+    qualified: '瓿犿拡歆�',
+    recommend: '於旍矞',
+    qualifiedTip: '靷毄鞛� 炜茧Μ鞐� 雽�頃� 雿� 雴掛潃 鞝曧檿靹膘潉 鞝滉车頃橁赴 鞙勴暣 旮半掣 鞁滌姢韰� 鞛勲矤霐� 鞚疙劙韼橃澊鞀るゼ 順胳稖頃橃棳 觳橂Μ頃╇媹雼�.',
+    warning: '氇嵏 鞝滉车鞛愳潣 API 韨るゼ 靹れ爼頃橃劯鞖�.',
+    click: '靹れ爼鞙茧 鞚措彊',
+    economical: '瓴届牅鞝�',
+    economicalTip: '鞓ろ攧霛检澑 氩№劙 鞐旍, 韨れ泴霌� 鞚鸽嵄鞀� 霌膘潉 靷毄頃橃棳 韱犿伆 靻岆箘 鞐嗢澊 鞝曧檿霃勲ゼ 雮顶雼堧嫟.',
+    QATitle: '歆堧瓿� 雼惦硛 順曥嫕鞙茧 靹戈犯毹柬姼頇�',
+    QATip: '鞚� 鞓奠厴鞚� 頇滌劚頇旐晿氅� 於旉皜 韱犿伆鞚� 靻岆箘霅╇媹雼�',
+    QALanguage: '靷毄 鞏胳柎',
+    estimateCost: '鞓堨儊 牍勳毄',
+    estimateSegment: '鞓堨儊 觳伂 靾�',
+    segmentCount: '觳伂',
+    calculating: '瓿勳偘 欷�...',
+    fileSource: '氍胳劀 鞝勳矘毽�',
+    notionSource: '韼橃澊歆� 鞝勳矘毽�',
+    other: '旮绊儉',
+    fileUnit: '韺岇澕',
+    notionUnit: '韼橃澊歆�',
+    previousStep: '鞚挫爠 雼硠',
+    nextStep: '鞝�鞛ロ晿瓿� 觳橂Μ',
+    save: '鞝�鞛ロ晿瓿� 觳橂Μ',
+    cancel: '旆唽',
+    sideTipTitle: '觳伂鞕� 鞝勳矘毽皜 頃勳殧頃� 鞚挫湢',
+    sideTipP1: '韰嶌姢韸� 雿办澊韯半ゼ 觳橂Μ頃� 霑� 觳伂鞕� 韥措Μ雼濎潃 霊� 臧�歆� 欷戩殧頃� 鞝勳矘毽� 雼硠鞛呺媹雼�.',
+    sideTipP2: '靹戈犯氅橅厡鞚挫厴鞚� 旮� 韰嶌姢韸鸽ゼ 雼澖鞙茧 攵勴暊頃橃棳 氇嵏鞚� 鞚错暣頃橁赴 靿疥矊 頃╇媹雼�. 鞚措 鞚疙暣 氇嵏 瓴瓣臣鞚� 頀堨瓿� 甏�霠劚鞚� 頄レ儊霅╇媹雼�.',
+    sideTipP3: '韥措Μ雼濎潃 攵堩晞鞖旐暅 氍胳瀽 氚� 順曥嫕鞚� 鞝滉卑頃橃棳 歆�鞁濎潉 雿� 旯旊仈頃橁碃 攵勳劃 臧�電ロ暅 瓴冹溂搿� 毵岆摥雼堧嫟.',
+    sideTipP4: '鞝侅爤頃� 觳伂鞕� 韥措Μ雼濎潃 氇嵏鞚� 靹彪姤鞚� 頄レ儊鞁滍偆瓿� 鞝曧檿頃橁碃 臧�旃� 鞛堧姅 瓴瓣臣毳� 鞝滉车頃╇媹雼�.',
+    previewTitle: '氙鸽Μ氤搓赴',
+    previewTitleButton: '氙鸽Μ氤搓赴',
+    previewButton: '歆堧-雼惦硛 順曥嫕鞙茧 鞝勴櫂',
+    previewSwitchTipStart: '順勳灛 觳伂 氙鸽Μ氤搓赴電� 韰嶌姢韸� 順曥嫕鞛呺媹雼�. 歆堧瓿� 雼惦硛 順曥嫕 氙鸽Μ氤搓赴搿� 鞝勴櫂頃橂┐',
+    previewSwitchTipEnd: ' 於旉皜 韱犿伆鞚� 靻岆箘霅╇媹雼�',
+    characters: '氍胳瀽',
+    indexSettingTip: '鞚鸽嵄鞀� 氚╈嫕鞚� 氤�瓴巾晿霠る┐,',
+    retrievalSettingTip: '鞚鸽嵄鞀� 氚╈嫕鞚� 氤�瓴巾晿霠る┐,',
+    datasetSettingLink: '歆�鞁� 靹れ爼',
+    webpageUnit: '韼橃澊歆�',
+    websiteSource: '鞗� 靷澊韸� 鞝勳矘毽�',
+    separatorTip: '甑秳 旮绊樃電� 韰嶌姢韸鸽ゼ 甑秳頃橂姅 雿� 靷毄霅橂姅 氍胳瀽鞛呺媹雼�. \\n\\n 氚� \\n鞚� 雼澖瓿� 欷勳潉 甑秳頃橂姅 雿� 鞚茧皹鞝侅溂搿� 靷毄霅橂姅 甑秳 旮绊樃鞛呺媹雼�. 靿柬憸(\\n\\n,\\n)鞕� 頃粯 靷毄頃橂┐ 斓滊寑 觳伂 旮胳澊毳� 齑堦臣頃� 瓴届毎 雼澖鞚� 欷勲 攵勴暊霅╇媹雼�. 歆侅爲 鞝曥潣頃� 韸轨垬 甑秳 旮绊樃(鞓�: ***)毳� 靷毄頃� 靾橂弰 鞛堨姷雼堧嫟.',
+    maxLengthCheck: '斓滊寑 觳伂 旮胳澊電� {{limit}} 氙鸽鞚挫柎鞎� 頃╇媹雼�.',
+    childChunkForRetrieval: '瓴�靸夓潉 鞙勴暅 鞛愳嫕 觳伂',
+    qaSwitchHighQualityTipContent: '順勳灛 瓿犿拡歆� 鞚鸽嵄鞀� 氚╇矔毵� Q&A 順曥嫕 觳伂毳� 歆�鞗愴暕雼堧嫟. 瓿犿檾歆� 氇摐搿� 鞝勴櫂頃橃嫓瓴犾姷雼堦箤?',
+    previewChunkTip: '鞕检鞚� \'Preview Chunk\' 氩勴娂鞚� 韥措Ν頃橃棳 頂勲Μ敕半ゼ 搿滊摐頃╇媹雼�',
+    general: '鞚茧皹',
+    fullDoc: '鞝勳泊 氍胳劀',
+    previewChunk: '頂勲Μ敕� 觳伂(Preview Chunk)',
+    parentChunkForContext: '旎厤鞀ろ姼鞐� 雽�頃� Parent-chunk',
+    parentChildDelimiterTip: '甑秳 旮绊樃電� 韰嶌姢韸鸽ゼ 甑秳頃橂姅 雿� 靷毄霅橂姅 氍胳瀽鞛呺媹雼�. \\n\\n鞚� 鞗愲掣 氍胳劀毳� 韥� 攵�氇� 觳伂搿� 攵勴暊頃橂姅 雿� 甓岇灔霅╇媹雼�. 歆侅爲 鞝曥潣頃� 韸轨垬 甑秳 旮绊樃毳� 靷毄頃� 靾橂弰 鞛堨姷雼堧嫟.',
+    paragraph: '雼澖',
+    parentChild: '攵�氇�-鞛愳嫕',
+    useQALanguage: 'Q&A 順曥嫕鞚� 靷毄頃橂姅 觳伂',
+    highQualityTip: '瓿犿拡歆� 氇摐鞐愳劀 靷届瀰鞚� 毵堨箻氅� 瓴届牅鞝� 氇摐搿� 霅橂弻毽� 靾� 鞐嗢姷雼堧嫟.',
+    notAvailableForQA: 'Q&A 鞚鸽嵄鞀れ棎電� 靷毄頃� 靾� 鞐嗢姷雼堧嫟.',
+    qaSwitchHighQualityTipTitle: 'Q&A 順曥嫕鞐愲姅 瓿犿拡歆� 鞚鸽嵄鞁� 氚╇矔鞚� 頃勳殧頃╇媹雼�.',
+    notAvailableForParentChild: '攵�氇�-鞛愳嫕 鞚鸽嵄鞀れ棎電� 靷毄頃� 靾� 鞐嗢姷雼堧嫟.',
+    previewChunkCount: '{{臧滌垬}} 於旍爼霅� 觳伂',
+    parentChildTip: '攵�氇�-鞛愳嫕 氇摐毳� 靷毄頃� 霑� 鞛愳嫕 觳伂電� 瓴�靸夓棎 靷毄霅橁碃 攵�氇� 觳伂電� 旎厤鞀ろ姼搿� 須岇垬鞐� 靷毄霅╇媹雼�.',
+    generalTip: '鞚茧皹鞝侅澑 韰嶌姢韸� 觳伂 氇摐鞐愳劀電� 瓴�靸夒悳 觳伂鞕� 須岇垬霅� 觳伂臧� 霃欖澕頃╇媹雼�.',
+    fullDocTip: '鞝勳泊 氍胳劀臧� 靸侅渼 觳伂搿� 靷毄霅橂┌ 歆侅爲 瓴�靸夒惄雼堧嫟. 靹彪姤靸侅潣 鞚挫湢搿� 10000 韱犿伆鞚� 齑堦臣頃橂姅 韰嶌姢韸鸽姅 鞛愲彊鞙茧 鞛橂雼堧嫟.',
+    parentChildChunkDelimiterTip: '甑秳 旮绊樃電� 韰嶌姢韸鸽ゼ 甑秳頃橂姅 雿� 靷毄霅橂姅 氍胳瀽鞛呺媹雼�. \\n 鞚� 攵�氇� 觳伂毳� 鞛戩潃 鞛愳嫕 觳伂搿� 攵勴暊頃橂姅 雿� 甓岇灔霅╇媹雼�. 歆侅爲 鞝曥潣頃� 韸轨垬 甑秳 旮绊樃毳� 靷毄頃� 靾橂弰 鞛堨姷雼堧嫟.',
+    switch: '鞀れ渼旃�',
+    paragraphTip: '鞚� 氇摐電� 甑秳 旮绊樃鞕� 斓滊寑 觳伂 旮胳澊鞐� 霐半澕 韰嶌姢韸鸽ゼ 雼澖鞙茧 攵勴暊頃橂┌, 攵勴暊霅� 韰嶌姢韸鸽ゼ 瓴�靸夓潉 鞙勴暅 攵�氇� 觳伂搿� 靷毄頃╇媹雼�.',
+  },
+  stepThree: {
+    creationTitle: '馃帀 歆�鞁濎澊 靸濎劚霅橃棃鞀惦媹雼�',
+    creationContent: '歆�鞁� 鞚措鞚� 鞛愲彊鞙茧 靹れ爼霅橃棃歆�毵� 鞏胳牅霌犾 氤�瓴巾暊 靾� 鞛堨姷雼堧嫟',
+    label: '歆�鞁� 鞚措',
+    additionTitle: '馃帀 氍胳劀臧� 鞐呺霌滊悩鞐堨姷雼堧嫟',
+    additionP1: '氍胳劀臧� 歆�鞁濎棎 鞐呺霌滊悩鞐堨姷雼堧嫟',
+    additionP2: '歆�鞁濎潣 氍胳劀 氇╇鞐愳劀 彀眷潉 靾� 鞛堨姷雼堧嫟.',
+    stop: '觳橂Μ 欷戩',
+    resume: '觳橂Μ 鞛皽',
+    navTo: '氍胳劀搿� 鞚措彊',
+    sideTipTitle: '雼れ潓 雼硠電� 氍挫棁鞚戈皜鞖�',
+    sideTipContent:
+      '氍胳劀 鞚鸽嵄鞁膘澊 鞕勲霅橂┐ 歆�鞁濎潉 鞚戩毄 頂勲攴鸽灗 旎厤鞀ろ姼搿� 韱淀暕頃� 靾� 鞛堨姷雼堧嫟. 頂勲‖頂勴姼 鞓れ紑鞀ろ姼霠堨澊靺� 韼橃澊歆�鞐愳劀 旎厤鞀ろ姼 靹れ爼鞚� 彀眷潉 靾� 鞛堨姷雼堧嫟. 霕愴暅 霃呺霅� ChatGPT 鞚鸽嵄鞀� 頂岆煬攴胳澑鞙茧 於滌嫓頃� 靾橂弰 鞛堨姷雼堧嫟.',
+    modelTitle: '鞛勲矤霐╈潉 欷戩頃措弰 甏滌爱鞀惦媹旯�?',
+    modelContent: '雮橃鞐� 觳橂Μ毳� 雼れ嫓 鞁滌瀾頃挫暭 頃� 瓴届毎, 欷戨嫧頃� 鞙勳箻鞐愳劀 瓿勳啀頃╇媹雼�.',
+    modelButtonConfirm: '頇曥澑',
+    modelButtonCancel: '旆唽',
+  },
+  firecrawl: {
+    getApiKeyLinkText: 'firecrawl.dev 鞐愳劀 API 韨� 臧�鞝胳槫旮�',
+    apiKeyPlaceholder: 'firecrawl.dev 鞚� API 韨�',
+    configFirecrawl: 'Firecrawl 甑劚 馃敟',
+  },
+  jinaReader: {
+    apiKeyPlaceholder: 'jina.ai 鞚� API 韨�',
+    getApiKeyLinkText: 'jina.ai 鞐愳劀 氍措 API 韨� 氚涥赴',
+    configJinaReader: 'Jina Reader 甑劚',
+  },
+  otherDataSource: {
+    learnMore: '雿� 鞎岇晞氤挫劯鞖�',
+    title: '雼るジ 雿办澊韯� 靻岇姢鞐� 鞐瓣舶頃橃嫓瓴犾姷雼堦箤?',
+    description: '順勳灛 Dify鞚� 旮办垹 鞛愲鞐愲姅 鞝滍暅霅� 雿办澊韯� 靻岇姢毵� 鞛堨姷雼堧嫟. Dify 旮办垹 鞛愲鞐� 雿办澊韯� 靻岇姢毳� 鞝滉车頃橂姅 瓴冹潃 氇摖 靷毄鞛愲ゼ 鞙勴暣 頂岆灚韽检潣 鞙犾棸靹标臣 旮半姤鞚� 頄レ儊鞁滍偆電� 雿� 霃勳泙鞚� 霅橂姅 頇橃儊鞝侅澑 氚╇矔鞛呺媹雼�. 旮办棳 臧�鞚措摐毳� 韱淀暣 靿疥矊 鞁滌瀾頃� 靾� 鞛堨姷雼堧嫟. 鞛愳劯頃� 雮挫毄鞚� 鞎勲灅 毵來伂毳� 韥措Ν頃橃嫮鞁滌槫.',
+  },
+  watercrawl: {
+    getApiKeyLinkText: 'watercrawl.dev鞐愳劀 API 韨るゼ 鞏混溂靹胳殧.',
+    configWatercrawl: '鞗岉劙韥· 甑劚頃橁赴',
+    apiKeyPlaceholder: 'watercrawl.dev鞚� API 韨�',
+  },
+}
+
+export default translation
diff --git a/i18n/ko-KR/dataset-documents.ts b/i18n/ko-KR/dataset-documents.ts
new file mode 100644
index 0000000..6f6cb45
--- /dev/null
+++ b/i18n/ko-KR/dataset-documents.ts
@@ -0,0 +1,394 @@
+const translation = {
+  list: {
+    title: '氍胳劀',
+    desc: '歆�鞁濎潣 氇摖 韺岇澕鞚� 鞐赴鞐� 響滌嫓霅橂┌, 鞝勳泊 歆�鞁濎澊 Dify鞚� 鞚胳毄氍胳澊雮� 毂� 頂岆煬攴胳澑鞚� 韱淀暣 毵來伂霅橁卑雮� 靸夓澑頇旊悹 靾� 鞛堨姷雼堧嫟.',
+    addFile: '韺岇澕 於旉皜',
+    addPages: '韼橃澊歆� 於旉皜',
+    table: {
+      header: {
+        fileName: '韺岇澕氇�',
+        words: '雼柎 靾�',
+        hitCount: '瓴�靸� 須熿垬',
+        uploadTime: '鞐呺霌� 鞁滉皠',
+        status: '靸來儨',
+        action: '霃欖瀾',
+        chunkingMode: '觳伂 氇摐',
+      },
+      name: '鞚措',
+      rename: '鞚措 氚旉靖旮�',
+    },
+    action: {
+      uploadFile: '靸� 韺岇澕 鞐呺霌�',
+      settings: '靹戈犯毹柬姼 靹れ爼',
+      addButton: '觳伂 於旉皜',
+      add: '觳伂 於旉皜',
+      batchAdd: '鞚缄磩 於旉皜',
+      archive: '鞎勳勾鞚措笇',
+      unarchive: '鞎勳勾鞚措笇 頃挫牅',
+      delete: '靷牅',
+      enableWarning: '鞎勳勾鞚措笇霅� 韺岇澕鞚� 頇滌劚頇旐暊 靾� 鞐嗢姷雼堧嫟.',
+      sync: '霃欔赴頇�',
+    },
+    index: {
+      enable: '頇滌劚頇�',
+      disable: '牍勴櫆靹表檾',
+      all: '氇憪',
+      enableTip: '韺岇澕鞚� 靸夓澑頇旐暊 靾� 鞛堨姷雼堧嫟.',
+      disableTip: '韺岇澕鞚� 靸夓澑頇旐暊 靾� 鞐嗢姷雼堧嫟.',
+    },
+    status: {
+      queuing: '雽�旮� 欷�',
+      indexing: '靸夓澑頇� 欷�',
+      paused: '鞚检嫓 欷戩霅�',
+      error: '鞓る',
+      available: '靷毄 臧�電�',
+      enabled: '頇滌劚頇旊惃',
+      disabled: '牍勴櫆靹表檾霅�',
+      archived: '鞎勳勾鞚措笇霅�',
+    },
+    empty: {
+      title: '鞎勳 氍胳劀臧� 鞐嗢姷雼堧嫟',
+      upload: {
+        tip: '韺岇澕鞚� 鞐呺霌滍晿瓯半倶 鞗� 靷澊韸胳棎靹� 霃欔赴頇旐晿瓯半倶 Notion鞚措倶 GitHub 臧欖潃 鞗� 鞎膘棎靹� 霃欔赴頇旐暊 靾� 鞛堨姷雼堧嫟.',
+      },
+      sync: {
+        tip: 'Dify電� 鞝曣赴鞝侅溂搿� Notion鞐愳劀 韺岇澕鞚� 雼れ毚搿滊摐頃橁碃 觳橂Μ頃╇媹雼�.',
+      },
+    },
+    delete: {
+      title: '鞝曤 靷牅頃橃嫓瓴犾姷雼堦箤?',
+      content: '雮橃鞐� 觳橂Μ毳� 瓿勳啀頃挫暭 頃橂姅 瓴届毎 欷戨嫧頃� 瓿踌棎靹� 瓿勳啀頃╇媹雼�.',
+    },
+    batchModal: {
+      title: '鞚缄磩 於旉皜',
+      csvUploadTitle: 'CSV 韺岇澕鞚� 鞐赴搿� 霌滊灅攴� 鞎� 霌滊…頃橁卑雮�',
+      browse: '彀眷晞氤搓赴',
+      tip: 'CSV 韺岇澕鞚� 雼れ潓 甑“毳� 霐半澕鞎� 頃╇媹雼�:',
+      question: '歆堧',
+      answer: '雼惦硛',
+      contentTitle: '觳伂 雮挫毄',
+      content: '雮挫毄',
+      template: '鞐赴靹� 韰滍攲毽� 雼れ毚搿滊摐',
+      cancel: '旆唽',
+      run: '鞚缄磩 鞁ろ枆',
+      runError: '鞚缄磩 鞁ろ枆鞐� 鞁ろ尐頄堨姷雼堧嫟',
+      processing: '鞚缄磩 觳橂Μ 欷�',
+      completed: '臧�鞝胳槫旮� 鞕勲',
+      error: '臧�鞝胳槫旮� 鞓る',
+      ok: '頇曥澑',
+    },
+    addUrl: 'URL 於旉皜',
+    learnMore: '雿� 鞎岇晞氤挫劯鞖�',
+  },
+  metadata: {
+    title: '氅旐儉雿办澊韯�',
+    desc: '氍胳劀 氅旐儉雿办澊韯办棎 霠堨澊敫旍潉 攵欖棳 AI臧� 鞁犾啀頃橁矊 鞝戧芳頃� 靾� 鞛堦碃 靷毄鞛愳棎瓴� 於滌矘臧� 瓿店皽霅╇媹雼�.',
+    dateTimeFormat: 'YYYY雲� M鞗� D鞚� hh:mm A',
+    docTypeSelectTitle: '氍胳劀 鞙犿槙鞚� 靹犿儩頃橃劯鞖�',
+    docTypeChangeTitle: '氍胳劀 鞙犿槙 氤�瓴�',
+    docTypeSelectWarning: '氍胳劀 鞙犿槙鞚� 氤�瓴巾晿氅� 順勳灛 鞛呺牓霅� 氅旐儉雿办澊韯瓣皜 鞙犾霅橃 鞎婌姷雼堧嫟.',
+    firstMetaAction: '鞁滌瀾頃橁赴',
+    placeholder: {
+      add: '於旉皜',
+      select: '靹犿儩',
+    },
+    source: {
+      upload_file: '韺岇澕 鞐呺霌�',
+      notion: 'Notion鞐愳劀 霃欔赴頇�',
+      github: 'GitHub鞐愳劀 霃欔赴頇�',
+    },
+    type: {
+      book: '霃勳劀',
+      webPage: '鞗� 韼橃澊歆�',
+      paper: '雲茧',
+      socialMediaPost: '靻岇厹 氙鸽敂鞏� 瓴岇嫓氍�',
+      personalDocument: '臧滌澑 氍胳劀',
+      businessDocument: '牍勳雼堨姢 氍胳劀',
+      IMChat: 'IM 毂勴寘',
+      wikipediaEntry: '鞙勴偆頂茧敂鞎� 頃',
+      notion: 'Notion鞐愳劀 霃欔赴頇�',
+      github: 'GitHub鞐愳劀 霃欔赴頇�',
+      technicalParameters: '旮办垹鞝� 毵り皽氤�靾�',
+    },
+    field: {
+      processRule: {
+        processDoc: '氍胳劀 觳橂Μ',
+        segmentRule: '觳伂 攴滌箼',
+        segmentLength: '觳伂 旮胳澊',
+        processClean: '韰嶌姢韸� 鞝勳矘毽�',
+      },
+      book: {
+        title: '鞝滊',
+        language: '鞏胳柎',
+        author: '鞝�鞛�',
+        publisher: '於滍寪靷�',
+        publicationDate: '於滍寪鞚�',
+        ISBN: 'ISBN',
+        category: '旃错厡瓿犽Μ',
+      },
+      webPage: {
+        title: '鞝滊',
+        url: 'URL',
+        language: '鞏胳柎',
+        authorPublisher: '鞝�鞛�/於滍寪靷�',
+        publishDate: '瓿店皽鞚�',
+        topicKeywords: '欤检牅/韨れ泴霌�',
+        description: '靹る獏',
+      },
+      paper: {
+        title: '鞝滊',
+        language: '鞏胳柎',
+        author: '鞝�鞛�',
+        publishDate: '瓿店皽鞚�',
+        journalConferenceName: '鞝�雱�/頃欗殞氇�',
+        volumeIssuePage: '甓岉樃韼橃澊歆�',
+        DOI: 'DOI',
+        topicsKeywords: '欤检牅/韨れ泴霌�',
+        abstract: '鞖旍暯',
+      },
+      socialMediaPost: {
+        platform: '頂岆灚韽�',
+        authorUsername: '鞝�鞛�/靷毄鞛愲獏',
+        publishDate: '瓿店皽鞚�',
+        postURL: '瓴岇嫓氍� URL',
+        topicsTags: '欤检牅/韮滉犯',
+      },
+      personalDocument: {
+        title: '鞝滊',
+        author: '鞝�鞛�',
+        creationDate: '靸濎劚鞚�',
+        lastModifiedDate: '斓滌 靾橃爼鞚�',
+        documentType: '氍胳劀 鞙犿槙',
+        tagsCategory: '韮滉犯/旃错厡瓿犽Μ',
+      },
+      businessDocument: {
+        title: '鞝滊',
+        author: '鞝�鞛�',
+        creationDate: '靸濎劚鞚�',
+        lastModifiedDate: '斓滌 靾橃爼鞚�',
+        documentType: '氍胳劀 鞙犿槙',
+        departmentTeam: '攵�靹�/韺�',
+      },
+      IMChat: {
+        chatPlatform: '毂勴寘 頂岆灚韽�',
+        chatPartiesGroupName: '毂勴寘 彀胳棳鞛�/攴鸽9氇�',
+        participants: '彀胳棳鞛�',
+        startDate: '鞁滌瀾鞚�',
+        endDate: '膦呺鞚�',
+        topicsKeywords: '欤检牅/韨れ泴霌�',
+        fileType: '韺岇澕 鞙犿槙',
+      },
+      wikipediaEntry: {
+        title: '鞝滊',
+        language: '鞏胳柎',
+        webpageURL: '鞗� 韼橃澊歆� URL',
+        editorContributor: '韼胳鞛�/旮瓣碃鞛�',
+        lastEditDate: '斓滌 韼胳鞚�',
+        summaryIntroduction: '鞖旍暯/靻岅皽',
+      },
+      notion: {
+        title: '鞝滊',
+        language: '鞏胳柎',
+        author: '鞝�鞛�',
+        createdTime: '靸濎劚 鞚检嫓',
+        lastModifiedTime: '斓滌 靾橃爼 鞚检嫓',
+        url: 'URL',
+        tag: '韮滉犯',
+        description: '靹る獏',
+      },
+      github: {
+        repoName: '鞝�鞛レ唽 鞚措',
+        repoDesc: '鞝�鞛レ唽 靹る獏',
+        repoOwner: '鞝�鞛レ唽 靻岇湢鞛�',
+        fileName: '韺岇澕 鞚措',
+        filePath: '韺岇澕 瓴诫',
+        programmingLang: '頂勲攴鸽灅氚� 鞏胳柎',
+        url: 'URL',
+        license: '霛检澊靹犾姢',
+        lastCommitTime: '斓滌 旎る皨 鞁滉皠',
+        lastCommitAuthor: '斓滌 旎る皨 鞛戩劚鞛�',
+      },
+      originInfo: {
+        originalFilename: '鞗愲掣 韺岇澕 鞚措',
+        originalFileSize: '鞗愲掣 韺岇澕 韥赴',
+        uploadDate: '鞐呺霌� 鞚检嫓',
+        lastUpdateDate: '斓滌 鞐呺嵃鞚错姼 鞚检嫓',
+        source: '靻岇姢',
+      },
+      technicalParameters: {
+        segmentSpecification: '觳伂 靷枒',
+        segmentLength: '觳伂 旮胳澊',
+        avgParagraphLength: '韽夑窢 氍鸽嫧 旮胳澊',
+        paragraphs: '氍鸽嫧',
+        hitCount: '瓴�靸� 須熿垬',
+        embeddingTime: '鞛勲矤霐� 鞁滉皠',
+        embeddedSpend: '鞛勲矤霐� 靻岆',
+      },
+    },
+    languageMap: {
+      zh: '欷戧淡鞏�',
+      en: '鞓侅柎',
+      es: '鞀ろ帢鞚胳柎',
+      fr: '頂勲瀾鞀れ柎',
+      de: '霃呾澕鞏�',
+      ja: '鞚茧掣鞏�',
+      ko: '頃滉淡鞏�',
+      ru: '霟嫓鞎勳柎',
+      ar: '鞎勲瀺鞏�',
+      pt: '韽ゴ韴皥鞏�',
+      it: '鞚错儓毽晞鞏�',
+      nl: '雱る崪霝�霌滌柎',
+      pl: '韽措瀫霌滌柎',
+      sv: '鞀れ洦雿挫柎',
+      tr: '韯绊偆鞏�',
+      he: '頌堧笇毽柎',
+      hi: '頌岆敂鞏�',
+      da: '雿措韥柎',
+      fi: '頃�霝�霌滌柎',
+      no: '雲鸽ゴ鞗澊鞏�',
+      hu: '項濌皜毽柎',
+      el: '攴鸽Μ鞀れ柎',
+      cs: '觳挫綌鞏�',
+      th: '韮滉淡鞏�',
+      id: '鞚鸽弰雱れ嫓鞎勳柎',
+    },
+    categoryMap: {
+      book: {
+        fiction: '靻岇劋',
+        biography: '鞝勱赴',
+        history: '鞐偓',
+        science: '瓿柬暀',
+        technology: '旮办垹',
+        education: '甑愳湣',
+        philosophy: '觳犿暀',
+        religion: '膦呹祼',
+        socialSciences: '靷殞瓿柬暀',
+        art: '鞓堨垹',
+        travel: '鞐枆',
+        health: '瓯搓皶',
+        selfHelp: '鞛愱赴 霃勳泙',
+        businessEconomics: '牍勳雼堨姢/瓴届牅',
+        cooking: '鞖旊Μ',
+        childrenYoungAdults: '鞏措Π鞚�/觳唽雲�',
+        comicsGraphicNovels: '毵岉檾/攴鸽灅頂� 靻岇劋',
+        poetry: '鞁�',
+        drama: '鞐瓣饭',
+        other: '旮绊儉',
+      },
+      personalDoc: {
+        notes: '氅旊',
+        blogDraft: '敫旊攴� 齑堨晥',
+        diary: '雼れ澊鞏措Μ',
+        researchReport: '鞐瓣惮 氤搓碃靹�',
+        bookExcerpt: '毂� 氚滌穼',
+        schedule: '鞚检爼',
+        list: '氇╇',
+        projectOverview: '頂勲鞝濏姼 臧滌殧',
+        photoCollection: '靷 旎爥靺�',
+        creativeWriting: '彀届瀾 旮�',
+        codeSnippet: '旖旊摐 鞀る媹韼�',
+        designDraft: '霐旍瀽鞚� 齑堨晥',
+        personalResume: '鞚措牓靹�',
+        other: '旮绊儉',
+      },
+      businessDoc: {
+        meetingMinutes: '須岇潣搿�',
+        researchReport: '鞐瓣惮 氤搓碃靹�',
+        proposal: '鞝滌晥靹�',
+        employeeHandbook: '歆侅洂 鞎堧偞靹�',
+        trainingMaterials: '甑愳湣 鞛愲',
+        requirementsDocument: '鞖旉惮 靷暛 氍胳劀',
+        designDocument: '霐旍瀽鞚� 氍胳劀',
+        productSpecification: '鞝滍拡 靷枒靹�',
+        financialReport: '鞛 氤搓碃靹�',
+        marketAnalysis: '鞁滌灔 攵勳劃',
+        projectPlan: '頂勲鞝濏姼 瓿勴殟靹�',
+        teamStructure: '韺� 甑“',
+        policiesProcedures: '鞝曥眳 氚� 鞝堨皑',
+        contractsAgreements: '瓿勳暯 氚� 順戩暯',
+        emailCorrespondence: '鞚措鞚� 韱奠嫚',
+        other: '旮绊儉',
+      },
+    },
+  },
+  embedding: {
+    processing: '鞛勲矤霐� 觳橂Μ 欷�...',
+    paused: '鞛勲矤霐╈澊 鞚检嫓 欷戩霅橃棃鞀惦媹雼�',
+    completed: '鞛勲矤霐╈澊 鞕勲霅橃棃鞀惦媹雼�',
+    error: '鞛勲矤霐� 鞓る',
+    docName: '氍胳劀 鞝勳矘毽�',
+    mode: '靹戈犯毹柬姼 攴滌箼',
+    segmentLength: '觳伂鞚� 旮胳澊',
+    textCleaning: '韰嶌姢韸� 鞝勳矘毽�',
+    segments: '靹戈犯毹柬姼',
+    highQuality: '瓿犿拡歆� 氇摐',
+    economy: '瓴届牅 氇摐',
+    estimate: '靻岆箘霟� 鞓堨儊',
+    stop: '觳橂Μ 欷戩',
+    resume: '觳橂Μ 鞛皽',
+    automatic: '鞛愲彊',
+    custom: '靷毄鞛� 鞝曥潣',
+    previewTip: '鞛勲矤霐╈澊 鞕勲霅� 頉勳棎 靹戈犯毹柬姼 氙鸽Μ氤搓赴毳� 靷毄頃� 靾� 鞛堨姷雼堧嫟',
+    childMaxTokens: '鞎勳澊',
+    parentMaxTokens: '攵�氇�',
+    pause: '鞚检嫓 欷戩',
+    hierarchical: '攵�氇�-鞛愳嫕',
+  },
+  segment: {
+    paragraphs: '雼澖',
+    keywords: '韨れ泴霌�',
+    addKeyWord: '韨れ泴霌� 於旉皜',
+    keywordError: '韨れ泴霌� 斓滊寑 旮胳澊電� 20鞛愳瀰雼堧嫟',
+    characters: '氍胳瀽',
+    hitCount: '瓴�靸� 須熿垬',
+    vectorHash: '氩№劙 頃挫嫓: ',
+    questionPlaceholder: '歆堧鞚� 鞛呺牓頃橃劯鞖�',
+    questionEmpty: '歆堧鞚� 牍勳泴霊� 靾� 鞐嗢姷雼堧嫟',
+    answerPlaceholder: '雼惦硛鞚� 鞛呺牓頃橃劯鞖�',
+    answerEmpty: '雼惦硛鞚� 牍勳泴霊� 靾� 鞐嗢姷雼堧嫟',
+    contentPlaceholder: '雮挫毄鞚� 鞛呺牓頃橃劯鞖�',
+    contentEmpty: '雮挫毄鞚� 牍勳泴霊� 靾� 鞐嗢姷雼堧嫟',
+    newTextSegment: '靸堧鞖� 韰嶌姢韸� 靹戈犯毹柬姼',
+    newQaSegment: '靸堧鞖� Q&A 靹戈犯毹柬姼',
+    delete: '鞚� 觳伂毳� 靷牅頃橃嫓瓴犾姷雼堦箤?',
+    parentChunks_one: '攵�氇� 觳伂(PARENT CHUNK)',
+    newChunk: '靸� 觳伂',
+    addChildChunk: '鞛愳啇 觳伂 於旉皜(Add Child Chunk)',
+    editChildChunk: '鞛愳啇 觳伂 韼胳(Edit Child Chunk)',
+    chunkDetail: '觳伂 霐旐厡鞚�(Chunk Detail)',
+    editChunk: '觳伂 韼胳(Edit Chunk)',
+    regeneratingTitle: '鞛愳嫕 觳伂 鞛儩靹�',
+    newChildChunk: '靸� 鞛愳啇 觳伂(New Child Chunk)',
+    childChunkAdded: '鞛愳嫕 觳伂 1臧� 於旉皜霅�',
+    chunk: '雿╈柎毽�',
+    searchResults_zero: '瓴瓣臣',
+    empty: '觳伂毳� 彀眷潉 靾� 鞐嗢姷雼堧嫟.',
+    editParentChunk: '攵�氇� 觳伂 韼胳(Edit Parent Chunk)',
+    chunks_one: '雿╈柎毽�',
+    regenerationSuccessMessage: '鞚� 彀届潉 雼潉 靾� 鞛堨姷雼堧嫟.',
+    childChunks_one: '鞛愳嫕 觳伂(CHILD CHUNK)',
+    regenerationSuccessTitle: '鞛儩鞚� 鞕勲霅橃棃鞀惦媹雼�.',
+    editedAt: '韼胳 鞙勳箻',
+    addAnother: '雼るジ 頃 於旉皜',
+    chunkAdded: '觳伂 1臧� 於旉皜霅�',
+    searchResults_one: '瓴瓣臣',
+    searchResults_other: '瓴瓣臣',
+    regenerationConfirmMessage: '鞛愳嫕 觳伂毳� 雼れ嫓 靸濎劚頃橂┐ 韼胳霅� 觳伂鞕� 靸堧 於旉皜霅� 觳伂毳� 韽暔頃橃棳 順勳灛 鞛愳嫕 觳伂毳� 雿柎鞌侂媹雼�. 鞛儩靹膘潃 旆唽頃� 靾� 鞐嗢姷雼堧嫟.',
+    regenerationConfirmTitle: '鞛愳嫕 觳伂毳� 雼れ嫓 靸濎劚頃橃嫓瓴犾姷雼堦箤?',
+    clearFilter: '頃勴劙 歆�鞖瓣赴',
+    characters_one: '氍胳瀽',
+    parentChunk: '攵�氇�-觳伂',
+    expandChunks: '觳伂 頇曥灔',
+    collapseChunks: '觳伂 於曥唽',
+    parentChunks_other: '攵�氇� 觳伂(PARENT CHUNKS)',
+    childChunk: '鞛愳嫕 觳伂',
+    childChunks_other: '鞛愳嫕 觳伂',
+    chunks_other: '觳伂',
+    edited: '韼胳',
+    addChunk: '觳伂 於旉皜(Add Chunk)',
+    characters_other: '氍胳瀽',
+    regeneratingMessage: '鞁滉皠鞚� 瓯鸽Υ 靾� 鞛堨溂雼� 鞛犾嫓毵� 旮半嫟霠� 欤检嫮鞁滌槫...',
+  },
+}
+
+export default translation
diff --git a/i18n/ko-KR/dataset-hit-testing.ts b/i18n/ko-KR/dataset-hit-testing.ts
new file mode 100644
index 0000000..a5329fb
--- /dev/null
+++ b/i18n/ko-KR/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: '瓴�靸� 韰岇姢韸�',
+  desc: '欤检柎歆� 炜茧Μ 韰嶌姢韸胳棎 旮半皹頃橃棳 歆�鞁濎潣 瓴�靸� 須臣毳� 韰岇姢韸疙暕雼堧嫟.',
+  dateTimeFormat: 'YYYY/MM/DD HH:mm',
+  recents: '斓滉芳 瓴瓣臣',
+  table: {
+    header: {
+      source: '靻岇姢',
+      text: '韰嶌姢韸�',
+      time: '鞁滉皠',
+    },
+  },
+  input: {
+    title: '靻岇姢 韰嶌姢韸�',
+    placeholder: '韰嶌姢韸鸽ゼ 鞛呺牓頃橃劯鞖�. 臧勱舶頃� 靹る獏氍胳澊 膦嬱姷雼堧嫟.',
+    countWarning: '斓滊寑 200鞛愱箤歆� 鞛呺牓頃� 靾� 鞛堨姷雼堧嫟.',
+    indexWarning: '瓿犿拡歆� 歆�鞁濍.',
+    testing: '韰岇姢韸� 欷�',
+  },
+  hit: {
+    title: '瓴�靸� 瓴瓣臣 雼澖',
+    emptyTip: '瓴�靸� 韰岇姢韸� 瓴瓣臣臧� 鞐赴鞐� 響滌嫓霅╇媹雼�.',
+  },
+  noRecentTip: '斓滉芳 炜茧Μ 瓴瓣臣臧� 鞐嗢姷雼堧嫟.',
+  viewChart: '氩№劙 彀姼 氤搓赴',
+  settingTitle: '瓴�靸� 靹れ爼',
+  viewDetail: '鞛愳劯頌堧炒旮�',
+  open: '鞐措嫟',
+  records: '霠堨綌霌�',
+  hitChunks: '{{num}}臧滌潣 鞛愳嫕 觳伂毳� 頌堩姼頄堨姷雼堧嫟.',
+  keyword: '韨れ泴霌�',
+  chunkDetail: '觳伂 霐旐厡鞚�(Chunk Detail)',
+}
+
+export default translation
diff --git a/i18n/ko-KR/dataset-settings.ts b/i18n/ko-KR/dataset-settings.ts
new file mode 100644
index 0000000..b008e37
--- /dev/null
+++ b/i18n/ko-KR/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: '歆�鞁� 靹れ爼',
+  desc: '鞐赴鞐愳劀 歆�鞁濎潣 靻嶌劚瓿� 鞛戨彊 氚╇矔鞚� 氤�瓴巾暊 靾� 鞛堨姷雼堧嫟.',
+  form: {
+    name: '歆�鞁� 鞚措',
+    namePlaceholder: '歆�鞁� 鞚措鞚� 鞛呺牓頃橃劯鞖�',
+    nameError: '鞚措鞚� 牍勳泴霊� 靾� 鞐嗢姷雼堧嫟',
+    desc: '歆�鞁� 靹る獏',
+    descInfo: '歆�鞁� 雮挫毄鞚� 臧滉磩頃橂姅 氇呿檿頃� 韰嶌姢韸� 靹る獏鞚� 鞛戩劚頃橃劯鞖�. 鞚� 靹る獏鞚� 鞐煬 歆�鞁� 欷戩棎靹� 靹犿儩頃橂姅 旮办鞙茧 靷毄霅╇媹雼�.',
+    descPlaceholder: '鞚� 歆�鞁濎棎 韽暔霅� 雮挫毄鞚� 靹る獏頃橃劯鞖�. 鞛愳劯頃� 靹る獏鞚� AI臧� 歆�鞁� 雮挫毄鞐� 牍犽ゴ瓴� 鞝戧芳頃� 靾� 鞛堧弰搿� 頃╇媹雼�. 牍勳柎 鞛堨溂氅� Dify臧� 旮半掣 瓴�靸� 鞝勲灥鞚� 靷毄頃╇媹雼�.',
+    descWrite: '膦嬱潃 歆�鞁� 靹る獏 鞛戩劚 氚╇矔 氚办毎旮�',
+    permissions: '甓岉暅',
+    permissionsOnlyMe: '雮橂',
+    permissionsAllMember: '氇摖 韺� 氅る矂',
+    indexMethod: '鞚鸽嵄鞀� 氚╇矔',
+    indexMethodHighQuality: '瓿犿拡歆�',
+    indexMethodHighQualityTip: '靷毄鞛� 炜茧Μ 鞁� 雿� 雴掛潃 鞝曧檿霃勲ゼ 鞝滉车頃橁赴 鞙勴暣 Embedding 氇嵏鞚� 順胳稖頃橃棳 觳橂Μ頃╇媹雼�.',
+    indexMethodEconomy: '瓴届牅鞝�',
+    indexMethodEconomyTip: '鞓ろ攧霛检澑 氩№劙 鞐旍, 韨れ泴霌� 鞚鸽嵄鞀� 霌膘潉 靷毄頃橃棳 韱犿伆鞚� 靻岆箘頃橃 鞎婈碃霃� 鞝曧檿霃勲ゼ 臧愳唽鞁滍偟雼堧嫟.',
+    embeddingModel: '鞛勲矤霐� 氇嵏',
+    embeddingModelTip: '鞛勲矤霐� 氇嵏 氤�瓴届潃',
+    embeddingModelTipLink: '靹れ爼',
+    retrievalSetting: {
+      title: '瓴�靸� 靹れ爼',
+      learnMore: '鞛愳劯頌� 鞎岇晞氤搓赴',
+      description: ' 瓴�靸� 氚╇矔鞐� 雽�頃� 鞛愳劯頃� 鞝曤炒',
+      longDescription: ' 瓴�靸� 氚╇矔鞐� 雽�頃� 鞛愳劯頃� 雮挫毄鞚� 鞏胳牅霌犾 歆�鞁� 靹れ爼鞐愳劀 氤�瓴巾暊 靾� 鞛堨姷雼堧嫟.',
+      method: '瓴�靸� 氚╇矔',
+    },
+    save: '鞝�鞛�',
+    permissionsInvitedMembers: '攵�攵� 韺� 甑劚鞗�',
+    me: '(雼轨嫚)',
+    externalKnowledgeAPI: '鞕鸽秬 歆�鞁� API',
+    externalKnowledgeID: '鞕鸽秬 歆�鞁� ID',
+    retrievalSettings: '瓴�靸� 靹れ爼',
+    upgradeHighQualityTip: '瓿犿拡歆� 氇摐搿� 鞐呹犯霠堨澊霌滍暅 頉勳棎電� 瓴届牅鞝� 氇摐搿� 霅橂弻毽� 靾� 鞐嗢姷雼堧嫟.',
+    indexMethodChangeToEconomyDisabledTip: 'HQ鞐愳劀 ECO搿� 雼れ毚攴鸽爤鞚措摐頃� 靾� 鞐嗢姷雼堧嫟.',
+    helpText: '膦嬱潃 雿办澊韯� 靹疙姼 靹る獏鞚� 鞛戩劚頃橂姅 氚╇矔鞚� 鞎岇晞氤挫劯鞖�.',
+    searchModel: '氇嵏 瓴�靸�',
+  },
+}
+
+export default translation
diff --git a/i18n/ko-KR/dataset.ts b/i18n/ko-KR/dataset.ts
new file mode 100644
index 0000000..6be4dcc
--- /dev/null
+++ b/i18n/ko-KR/dataset.ts
@@ -0,0 +1,220 @@
+const translation = {
+  knowledge: '歆�鞁�',
+  documentCount: ' 氍胳劀',
+  wordCount: ' k 雼柎',
+  appCount: ' 鞐瓣舶霅� 鞎�',
+  createDataset: '歆�鞁� 靸濎劚',
+  createDatasetIntro: '鞛愳泊 韰嶌姢韸� 雿办澊韯半ゼ 臧�鞝胳槫瓯半倶 LLM 旎厤鞀ろ姼毳� 臧曧檾頃橁赴 鞙勴暣 鞗鬼泤鞚� 韱淀暣 鞁れ嫓臧� 雿办澊韯半ゼ 旮半頃� 靾� 鞛堨姷雼堧嫟.',
+  deleteDatasetConfirmTitle: '鞚� 歆�鞁濎潉 靷牅頃橃嫓瓴犾姷雼堦箤?',
+  deleteDatasetConfirmContent: '歆�鞁濎潉 靷牅頃橂┐ 雼れ嫓 霅橂弻毽� 靾� 鞐嗢姷雼堧嫟. 靷毄鞛愲姅 雿� 鞚挫儊 攴�頃橃潣 歆�鞁濎棎 鞎§劯鞀ろ暊 靾� 鞐嗢溂氅� 氇摖 頂勲‖頂勴姼 靹れ爼瓿� 搿滉犯臧� 鞓侁惮鞝侅溂搿� 靷牅霅╇媹雼�.',
+  datasetUsedByApp: '鞚� 歆�鞁濎潃 鞚茧秬 鞎膘棎靹� 靷毄 欷戩瀰雼堧嫟. 鞎膘棎靹� 雿� 鞚挫儊 鞚� 歆�鞁濎潉 靷毄頃� 靾� 鞐嗞矊 霅橂┌, 氇摖 頂勲‖頂勴姼 甑劚 氚� 搿滉犯臧� 鞓侁惮鞝侅溂搿� 靷牅霅╇媹雼�.',
+  datasetDeleted: '歆�鞁濎澊 靷牅霅橃棃鞀惦媹雼�',
+  datasetDeleteFailed: '歆�鞁� 靷牅鞐� 鞁ろ尐頄堨姷雼堧嫟',
+  didYouKnow: '鞎岅碃 瓿勳叏雮橃殧?',
+  intro1: '歆�鞁濎潉 Dify 鞎犿攲毽紑鞚挫厴鞐� ',
+  intro2: '旎厤鞀ろ姼搿�',
+  intro3: ' 韱淀暕頃� 靾� 鞛堨姷雼堧嫟.',
+  intro4: '順轨潃, ',
+  intro5: '鞚挫矘霟�',
+  intro6: ' 霃呺鞝侅澑 ChatGPT 鞚鸽嵄鞀� 頂岆煬攴胳澑鞙茧 瓿店皽頃� 靾� 鞛堨姷雼堧嫟',
+  unavailable: '靷毄 攵堦皜',
+  unavailableTip: '鞛勲矤霐� 氇嵏鞚� 靷毄頃� 靾� 鞐嗢姷雼堧嫟. 旮半掣 鞛勲矤霐� 氇嵏鞚� 靹れ爼頃挫暭 頃╇媹雼�.',
+  datasets: '歆�鞁�',
+  datasetsApi: 'API',
+  retrieval: {
+    semantic_search: {
+      title: '氩№劙 瓴�靸�',
+      description: '炜茧Μ鞚� 鞛勲矤霐╈潉 靸濎劚頃橁碃, 頃措嫻 氩№劙 響滍槃鞐� 臧�鞛� 鞙犾偓頃� 韰嶌姢韸� 觳伂毳� 瓴�靸夗暕雼堧嫟.',
+    },
+    full_text_search: {
+      title: '鞝勳泊 韰嶌姢韸� 瓴�靸�',
+      description: '氍胳劀 雮� 氇摖 鞖╈柎毳� 鞚鸽嵄鞁表晿鞐� 靷毄鞛愱皜 鞗愴晿電� 鞖╈柎毳� 瓴�靸夗晿瓿� 甏�霠� 韰嶌姢韸� 觳伂毳� 臧�鞝胳槵 靾� 鞛堦矊 頃╇媹雼�.',
+    },
+    hybrid_search: {
+      title: '頃橃澊敫岆Μ霌� 瓴�靸�',
+      description: '鞝勳泊 韰嶌姢韸� 瓴�靸夑臣 氩№劙 瓴�靸夓潉 霃欖嫓鞐� 鞁ろ枆頃橁碃 靷毄鞛� 炜茧Μ鞐� 臧�鞛� 鞝來暕頃� 毵れ箻毳� 靹犿儩頃橁赴 鞙勴暣 雼れ嫓 霝伂毳� 毵り箒雼堧嫟. 鞛灜韥� 氇嵏 API 靹れ爼鞚� 頃勳殧頃╇媹雼�.',
+      recommend: '於旍矞',
+    },
+    invertedIndex: {
+      title: '鞐� 鞚鸽嵄鞀�',
+      description: '須湪鞝侅澑 瓴�靸夓棎 靷毄霅橂姅 甑“鞛呺媹雼�. 臧� 鞖╈柎電� 氍胳劀雮� 鞗� 韼橃澊歆�鞐� 韽暔霅� 瓴冹潉 臧�毽偆氅�, 鞖╈柎毵堧嫟 觳搓硠鞝侅溂搿� 鞝曤Μ霅橃柎 鞛堨姷雼堧嫟.',
+    },
+    change: '氤�瓴�',
+    changeRetrievalMethod: '瓴�靸� 氚╇矔 氤�瓴�',
+  },
+  docsFailedNotice: '氍胳劀 鞚鸽嵄鞀れ棎 鞁ろ尐頄堨姷雼堧嫟',
+  retry: '鞛嫓霃�',
+  indexingTechnique: {
+    high_quality: 'HQ',
+    economy: '鞚挫綌雲鸽',
+  },
+  indexingMethod: {
+    semantic_search: '氩№劙',
+    full_text_search: '鞝勳泊 韰嶌姢韸�',
+    hybrid_search: '頃橃澊敫岆Μ霌�',
+    invertedIndex: '鞐澑雿膘姢',
+  },
+  mixtureHighQualityAndEconomicTip: '瓿犿拡歆堦臣 瓴届牅鞝� 歆�鞁� 氩犾澊鞀れ潣 順柬暕鞚� 鞙勴暣靹滊姅 鞛垳鞙� 氇嵏鞚� 頃勳殧頃╇媹雼�.',
+  inconsistentEmbeddingModelTip: '靹犿儩霅� 歆�鞁� 氩犾澊鞀れ潣 鞛勲矤霐� 氇嵏鞚� 鞚缄磤霅橃 鞎婌潃 瓴届毎 鞛垳鞙� 氇嵏鞚� 頃勳殧頃╇媹雼�.',
+  retrievalSettings: '瓴�靸� 靹れ爼',
+  rerankSettings: '鞛垳鞙� 靹れ爼',
+  weightedScore: {
+    title: '臧�欷� 鞝愳垬',
+    description: '頃犽嫻霅� 臧�欷戩箻毳� 臁办爼頃溂搿滌崹, 鞚� 鞛垳鞙� 鞝勲灥鞚� 鞚橂搿犾爜 鞚检箻 霕愲姅 韨れ泴霌� 鞚检箻 欷� 鞏措姁 瓴冹潉 鞖办劆鞁滍暊歆� 瓴办爼頃╇媹雼�.',
+    semanticFirst: '鞚橂搿� 鞖办劆',
+    keywordFirst: '韨れ泴霌� 鞖办劆',
+    customized: '靷毄鞛� 鞝曥潣',
+    semantic: '鞚橂搿犾爜',
+    keyword: '韨れ泴霌�',
+  },
+  nTo1RetrievalLegacy: 'N-雽�-1 瓴�靸夓潃 9鞗旊秬韯� 瓿奠嫕鞝侅溂搿� 雿� 鞚挫儊 靷毄霅橃 鞎婌姷雼堧嫟. 雿� 雮橃潃 瓴瓣臣毳� 鞏混溂霠る┐ 斓滌嫚 雼れ 瓴诫 瓴�靸夓潉 靷毄頃橂姅 瓴冹澊 膦嬱姷雼堧嫟.',
+  nTo1RetrievalLegacyLink: '鞛愳劯頌� 鞎岇晞氤搓赴',
+  nTo1RetrievalLegacyLinkText: 'N-雽�-1 瓴�靸夓潃 9鞗旍棎 瓿奠嫕鞝侅溂搿� 雿� 鞚挫儊 靷毄霅橃 鞎婌姷雼堧嫟.',
+  defaultRetrievalTip: '雼れ 瓴诫 瓴�靸夓澊 旮半掣鞝侅溂搿� 靷毄霅╇媹雼�. 歆�鞁濎潃 鞐煬 旮办垹 鞛愲鞐愳劀 瓴�靸夒悳 雼れ潓 靾滌渼臧� 雼れ嫓 毵り波歆戨媹雼�.',
+  editExternalAPIConfirmWarningContent: {
+    front: '鞚� 鞕鸽秬 歆�鞁� API電� 雼れ潓鞐� 鞐瓣舶霅╇媹雼�.',
+    end: '鞕鸽秬 歆�鞁�, 攴鸽Μ瓿� 鞚� 靾橃爼 靷暛鞚� 攴鸽摛 氇憪鞐愱矊 鞝侅毄霅� 瓴冹瀰雼堧嫟. 鞚� 氤�瓴� 靷暛鞚� 鞝�鞛ロ晿鞁滉矤鞀惦媹旯�?',
+  },
+  editExternalAPIFormWarning: {
+    end: '鞕鸽秬 歆�鞁�',
+    front: '鞚� 鞕鸽秬 API電� 雼れ潓鞐� 鞐瓣舶霅╇媹雼�.',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: '靷牅頃橂嫟',
+      end: '?',
+    },
+    content: {
+      front: '鞚� 鞕鸽秬 歆�鞁� API電� 雼れ潓鞐� 鞐瓣舶霅╇媹雼�.',
+      end: '鞕鸽秬 歆�鞁�. 鞚� API毳� 靷牅頃橂┐ 氇憪 氍错毃頇旊惄雼堧嫟. 鞚� API毳� 靷牅頃橃嫓瓴犾姷雼堦箤?',
+    },
+    noConnectionContent: '鞚� API毳� 靷牅頃橃嫓瓴犾姷雼堦箤?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: '鞕鸽秬 歆�鞁� API 靹犿儩',
+  },
+  connectDatasetIntro: {
+    content: {
+      link: '鞕鸽秬 API毳� 毵岆摐電� 氚╇矔 鞎岇晞氤搓赴',
+      end: '. 攴鸽煱 雼れ潓 頃措嫻 旮办垹 ID毳� 彀眷晞 鞕检 鞏戩嫕鞐� 鞛呺牓頃╇媹雼�. 氇摖 鞝曤炒臧� 鞓皵毳措┐ 鞐瓣舶 雼稊毳� 韥措Ν頃� 頉� 旮办垹 鞛愲鞚� 瓴�靸� 韰岇姢韸鸽 鞛愲彊鞙茧 鞚措彊頃╇媹雼�.',
+      front: '鞕鸽秬 旮办垹 鞛愲鞐� 鞐瓣舶頃橂牑氅� 毹检爛 鞕鸽秬 API毳� 毵岆摛鞏挫暭 頃╇媹雼�. 欤检潣 旯婈矊 鞚疥碃 彀胳“頃橃嫮鞁滌槫.',
+    },
+    learnMore: '雿� 鞎岇晞氤挫劯鞖�',
+    title: '鞕鸽秬 旮办垹 鞛愲鞐� 鞐瓣舶頃橂姅 氚╇矔',
+  },
+  connectHelper: {
+    helper1: 'API 氚� 旮办垹 鞛愲 ID毳� 韱淀暣 鞕鸽秬 旮办垹 鞛愲鞐� 鞐瓣舶頃╇媹雼�. 順勳灛,',
+    helper4: '霃勳泙毵� 氍胳劀 鞚疥赴',
+    helper2: '瓴�靸� 旮半姤毵� 歆�鞗愲惄雼堧嫟',
+    helper5: '鞚� 旮半姤鞚� 靷毄頃橁赴 鞝勳棎 欤检潣頃橃嫮鞁滌槫.',
+    helper3: '. 雼れ潓鞚� 臧曤牓頌� 甓岇灔頃╇媹雼�.',
+  },
+  externalKnowledgeForm: {
+    cancel: '旆唽',
+    connect: '鞐瓣舶頃橂嫟',
+  },
+  externalAPIForm: {
+    encrypted: {
+      end: '旮办垹.',
+      front: 'API 韱犿伆鞚� 雼れ潓鞚� 靷毄頃橃棳 鞎旐樃頇旊悩瓿� 鞝�鞛ル惄雼堧嫟.',
+    },
+    save: '甑暣雮措嫟',
+    name: '鞚措',
+    endpoint: 'API 鞐旊摐韽澑韸�',
+    edit: '韼胳頃橂嫟',
+    cancel: '旆唽',
+    apiKey: 'API 韨�',
+  },
+  editExternalAPITooltipTitle: '鞐瓣舶霅� 歆�鞁�',
+  externalAPIPanelTitle: '鞕鸽秬 歆�鞁� API',
+  externalKnowledgeDescription: '歆�鞁� 靹る獏',
+  externalAPI: '鞕鸽秬 API',
+  externalKnowledgeName: '鞕鸽秬 歆�鞁� 鞚措',
+  createExternalAPI: '鞕鸽秬 歆�鞁� API 於旉皜',
+  externalTag: '鞕鸽秬',
+  editExternalAPIFormTitle: '鞕鸽秬 歆�鞁� API 韼胳',
+  externalKnowledgeNamePlaceholder: '旮办垹 鞛愲鞚� 鞚措鞚� 鞛呺牓頃橃嫮鞁滌槫.',
+  externalAPIPanelDocumentation: '鞕鸽秬 歆�鞁� API毳� 毵岆摐電� 氚╇矔 鞎岇晞氤搓赴',
+  createNewExternalAPI: '靸� 鞕鸽秬 歆�鞁� API 毵岆摛旮�',
+  mixtureInternalAndExternalTip: '毽灜韥� 氇嵏鞚� 雮措秬 氚� 鞕鸽秬 歆�鞁濎潣 順柬暕鞐� 頃勳殧頃╇媹雼�.',
+  connectDataset: '鞕鸽秬 旮办垹 鞛愲鞐� 鞐瓣舶',
+  learnHowToWriteGoodKnowledgeDescription: '鞝侅爤頃� 歆�鞁� 靹る獏鞚� 鞛戩劚頃橂姅 氚╇矔 鞎岇晞氤搓赴',
+  externalKnowledgeDescriptionPlaceholder: '鞚� 旮办垹 鞛愲鞚� 雮挫毄 靹る獏(靹犿儩 靷暛)',
+  externalKnowledgeId: '鞕鸽秬 歆�鞁� ID',
+  externalKnowledgeIdPlaceholder: '歆�鞁� ID毳� 鞛呺牓頃橃嫮鞁滌槫.',
+  allExternalTip: '鞕鸽秬 歆�鞁濍 靷毄頃橂姅 瓴届毎 靷毄鞛愲姅 毽灜韥� 氇嵏鞚� 靷毄頃犾 鞐秬毳� 靹犿儩頃� 靾� 鞛堨姷雼堧嫟. 頇滌劚頇旐晿歆� 鞎婌溂氅� 瓴�靸夒悳 觳伂臧� 鞝愳垬鞐� 霐半澕 鞝曤牞霅╇媹雼�. 靹滊 雼るジ 旮办垹 鞛愲鞚� 瓴�靸� 鞝勲灥鞚� 鞚缄磤霅橃 鞎婌溂氅� 攵�鞝曧檿頃╇媹雼�.',
+  externalAPIPanelDescription: '鞕鸽秬 歆�鞁� API電� Dify 鞕鸽秬鞚� 旮办垹 鞛愲鞐� 鞐瓣舶頃橁碃 頃措嫻 旮办垹 鞛愲鞐愳劀 歆�鞁濎潉 瓴�靸夗晿電� 雿� 靷毄霅╇媹雼�.',
+  noExternalKnowledge: '鞎勳 鞕鸽秬 歆�鞁� API臧� 鞐嗢溂氙�搿� 鞐赴毳� 韥措Ν頃橃棳 靸濎劚頃橃嫮鞁滌槫.',
+  chunkingMode: {
+    parentChild: '攵�氇�-鞛愳嫕',
+    general: '鞚茧皹',
+  },
+  parentMode: {
+    fullDoc: '鞝勳泊 氍胳劀',
+    paragraph: '雼澖',
+  },
+  batchAction: {
+    delete: '靷牅頃橂嫟',
+    enable: '靷毄',
+    cancel: '旆唽',
+    archive: '氤搓磤',
+    selected: '靹犿儩頃�',
+    disable: '牍勴櫆靹表檾',
+  },
+  localDocs: '搿滌滑 氍胳劀',
+  preprocessDocument: '{{靾瀽}} 氍胳劀 鞝勳矘毽�',
+  enable: '靷毄',
+  documentsDisabled: '{{num}} 氍胳劀 靷毄 鞎� 頃� - 30鞚� 鞚挫儊 牍勴櫆靹� 靸來儨',
+  allKnowledge: '氇摖 歆�鞁�',
+  allKnowledgeDescription: '鞚� 鞛戩梾 鞓侅棴鞚� 氇摖 鞝曤炒毳� 響滌嫓頃橂牑氅� 靹犿儩頃╇媹雼�. 鞗岉伂鞀ろ帢鞚挫姢 靻岇湢鞛愲 氇摖 旮办垹 鞛愲毳� 甏�毽暊 靾� 鞛堨姷雼堧嫟.',
+  metadata: {
+    createMetadata: {
+      namePlaceholder: '氅旐儉雿办澊韯� 鞚措 於旉皜',
+      name: '鞚措',
+      type: '鞙犿槙',
+      back: '霋�',
+      title: '靸� 氅旐儉雿办澊韯�',
+    },
+    checkName: {
+      empty: '氅旐儉雿办澊韯� 鞚措鞚� 牍勳柎 鞛堨潉 靾� 鞐嗢姷雼堧嫟.',
+      invalid: '氅旐儉雿办澊韯� 鞚措鞚� 靻岆鞛�, 靾瀽 氚� 氚戩毵� 韽暔頃� 靾� 鞛堨溂氅� 靻岆鞛愲 鞁滌瀾頃挫暭 頃╇媹雼�.',
+    },
+    batchEditMetadata: {
+      multipleValue: '雼れ 臧�',
+      editMetadata: '氅旐儉雿办澊韯� 韼胳',
+      applyToAllSelectDocument: '靹犿儩頃� 氇摖 氍胳劀鞐� 鞝侅毄',
+      editDocumentsNum: '{{num}} 臧� 氍胳劀 韼胳 欷�',
+      applyToAllSelectDocumentTip: '靹犿儩霅� 氇摖 氍胳劀鞐� 雽�頃� 鞙勳棎靹� 韼胳頃� 氇摖 氅旐儉雿办澊韯办檧 靸� 氅旐儉雿办澊韯半ゼ 鞛愲彊鞙茧 靸濎劚頃橃嫮鞁滌槫. 攴鸽爣歆� 鞎婌溂氅� 氅旐儉雿办澊韯� 韼胳鞚� 頃措嫻 氍胳劀鞐愲 鞝侅毄霅╇媹雼�.',
+    },
+    selectMetadata: {
+      manageAction: '甏�毽晿雼�',
+      newAction: '靸� 氅旐儉雿办澊韯�',
+      search: '氅旐儉雿办澊韯� 瓴�靸�',
+    },
+    datasetMetadata: {
+      name: '鞚措',
+      deleteTitle: '靷牅 頇曥澑',
+      disabled: '鞛レ暊鞚�',
+      addMetaData: '氅旐儉雿办澊韯� 於旉皜',
+      values: '{{num}} 臧掚摛',
+      namePlaceholder: '氅旐儉雿办澊韯� 鞚措',
+      rename: '鞚措 氤�瓴�',
+      builtInDescription: '雮挫灔 氅旐儉雿办澊韯半姅 鞛愲彊鞙茧 於旍稖霅橁碃 靸濎劚霅╇媹雼�. 靷毄頃橁赴 鞝勳棎 頇滌劚頇旐暣鞎� 頃橂┌ 韼胳頃� 靾� 鞐嗢姷雼堧嫟.',
+      deleteContent: '鞝曤 \'{{name}}\' 氅旐儉雿办澊韯半ゼ 靷牅頃橃嫓瓴犾姷雼堦箤?',
+      description: '鞚� 歆�鞁濎棎靹� 氇摖 氅旐儉雿办澊韯半ゼ 甏�毽暊 靾� 鞛堨姷雼堧嫟. 靾橃爼 靷暛鞚� 氇摖 氍胳劀鞐� 霃欔赴頇旊惄雼堧嫟.',
+      builtIn: '雮挫灔順�',
+    },
+    documentMetadata: {
+      technicalParameters: '旮办垹 毵り皽氤�靾�',
+      startLabeling: '霠堨澊敫旊 鞁滌瀾',
+      metadataToolTip: '氅旐儉雿办澊韯半姅 鞝曤炒 瓴�靸夓潣 鞝曧檿靹标臣 甏�霠劚鞚� 頄レ儊鞁滍偆電� 欷戩殧頃� 頃勴劙 鞐暊鞚� 頃╇媹雼�. 鞚� 氍胳劀鞐� 雽�頃� 氅旐儉雿办澊韯半ゼ 鞐赴鞐愳劀 靾橃爼頃橁碃 於旉皜頃� 靾� 鞛堨姷雼堧嫟.',
+      documentInformation: '氍胳劀 鞝曤炒',
+    },
+    addMetadata: '氅旐儉雿办澊韯� 於旉皜',
+    metadata: '氅旐儉雿办澊韯�',
+    chooseTime: '鞁滉皠鞚� 靹犿儩頃橃劯鞖�...',
+  },
+  embeddingModelNotAvailable: '鞛勲矤霐� 氇嵏鞚� 靷毄頃� 靾� 鞐嗢姷雼堧嫟.',
+}
+
+export default translation
diff --git a/i18n/ko-KR/education.ts b/i18n/ko-KR/education.ts
new file mode 100644
index 0000000..78e4be7
--- /dev/null
+++ b/i18n/ko-KR/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    end: 'Dify 頂勲韼橃厰雱� 頂岆灉鞚� 鞙勴暣.',
+    coupon: '霃呾爯 100% 炜犿彴',
+    front: '雼轨嫚鞚� 鞚挫牅 甑愳湣 鞚胳 靸來儨毳� 氚涭潉 鞛愱博鞚� 鞛堨姷雼堧嫟. 鞎勲灅鞐� 攴�頃橃潣 甑愳湣 鞝曤炒毳� 鞛呺牓頃橃棳 瓿检爼鞚� 鞕勲頃橁碃 鞚胳鞚� 氚涭溂鞁嫓鞓�.',
+  },
+  form: {
+    schoolName: {
+      placeholder: '攴�頃橃潣 頃欔祼鞚� 瓿奠嫕 鞎届柎臧� 鞎勲媽 鞝勳泊 鞚措鞚� 鞛呺牓頃橃劯鞖�.',
+      title: '雼轨嫚鞚� 頃欔祼 鞚措',
+    },
+    schoolRole: {
+      option: {
+        teacher: '甑愳偓',
+        student: '頃欖儩',
+        administrator: '頃欔祼 甏�毽瀽',
+      },
+      title: '雼轨嫚鞚� 頃欔祼 鞐暊',
+    },
+    terms: {
+      desc: {
+        end: '鞝滌稖頃溂搿滌崹锛�',
+        and: '鞕�',
+        termsOfService: '靹滊箘鞀� 鞎疥磤',
+        front: '攴�頃橃潣 鞝曤炒 氚� 甑愳湣 鞚胳 靸來儨 靷毄鞚� 鞖半Μ鞚�',
+        privacyPolicy: '臧滌澑鞝曤炒 氤错樃鞝曥眳',
+      },
+      option: {
+        inSchool: '雮橂姅 鞝滉车霅� 旮瓣磤鞐� 鞛暀 欷戩澊瓯半倶 瓿犾毄霅橃柎 鞛堨潓鞚� 頇曥澑頃╇媹雼�. Dify電� 鞛暀歃濍獏靹滊倶 瓿犾毄歃濍獏靹滊ゼ 鞖旍箔頃� 靾� 鞛堨姷雼堧嫟. 毵岇暯 雮搓皜 鞛愱博鞚� 項堨渼搿� 歆勳垹頃橂┐, 雮橂姅 雮� 甑愳湣 靸來儨鞐� 霐半澕 觳橃潓 氅挫牅霅� 靾橃垬耄岆ゼ 歆�攵堩晿旮半 霃欖潣頃╇媹雼�.',
+        age: '雮橂姅 斓滌唽頃� 18靹� 鞚挫儊鞛勳潉 頇曥澑頃╇媹雼�.',
+      },
+      title: '鞎疥磤 氚� 霃欖潣靷暛',
+    },
+  },
+  submit: '鞝滌稖',
+  rejectContent: '鞎堩儉旯濌矊霃�, 攴�頃橂姅 甑愳湣 鞚胳 靸來儨鞐� 鞝來暕頃橃 鞎婌溂氙�搿� 鞚� 鞚措鞚� 欤检唽毳� 靷毄頃� 瓴届毎 Dify Professional Plan鞚� 霃呾爯 100% 炜犿彴鞚� 氚涭潉 靾� 鞐嗢姷雼堧嫟.',
+  successContent: '攴�頃橃潣 瓿勳爼鞐� Dify Professional 頂岆灉鞚� 鞙勴暅 100% 頃犾澑 炜犿彴鞚� 氚滉笁頄堨姷雼堧嫟. 鞚� 炜犿彴鞚� 1雲勱皠 鞙犿毃頃橂瘈搿� 鞙犿毃 旮瓣皠 雮挫棎 靷毄頃� 欤检嫓旮� 氚旊瀺雼堧嫟.',
+  currentSigned: '順勳灛 搿滉犯鞚� 欷戩瀰雼堧嫟',
+  toVerified: '甑愳湣 鞚胳 氚涥赴',
+  rejectTitle: '攴�頃橃潣 Dify 甑愳湣 鞚胳鞚� 瓯半秬霅橃棃鞀惦媹雼�.',
+  learn: '甑愳湣 鞚胳鞚� 氚涬姅 氚╇矔鞚� 氚办毎靹胳殧',
+  submitError: '鞏戩嫕 鞝滌稖鞐� 鞁ろ尐頄堨姷雼堧嫟. 雮橃鞐� 雼れ嫓 鞁滊弰頃� 欤检劯鞖�.',
+  successTitle: '雼轨嫚鞚� Dify 甑愳湣 鞚胳鞚� 氚涭晿鞀惦媹雼�.',
+  emailLabel: '順勳灛 鞚措鞚�',
+}
+
+export default translation
diff --git a/i18n/ko-KR/explore.ts b/i18n/ko-KR/explore.ts
new file mode 100644
index 0000000..5ae1a34
--- /dev/null
+++ b/i18n/ko-KR/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: '韮愳儔',
+  sidebar: {
+    discovery: '韮愳儔',
+    chat: '毂勴寘',
+    workspace: '鞛戩梾 瓿店皠',
+    action: {
+      pin: '瓿犾爼',
+      unpin: '瓿犾爼 頃挫牅',
+      rename: '鞚措 氤�瓴�',
+      delete: '靷牅',
+    },
+    delete: {
+      title: '鞎� 靷牅',
+      content: '鞚� 鞎膘潉 靷牅頃措弰 甏滌爱鞀惦媹旯�?',
+    },
+  },
+  apps: {
+    title: 'Dify搿� 鞎� 韮愳儔',
+    description: '鞚� 韰滍攲毽� 鞎膘潉 歃夓嫓 靷毄頃橁卑雮� 韰滍攲毽快潉 旮半皹鞙茧 瓿犾湢頃� 鞎膘潉 靷毄鞛� 鞝曥潣頃橃劯鞖�.',
+    allCategories: '氇摖 旃错厡瓿犽Μ',
+  },
+  appCard: {
+    addToWorkspace: '鞛戩梾 瓿店皠鞐� 於旉皜',
+    customize: '靷毄鞛� 鞝曥潣',
+  },
+  appCustomize: {
+    title: '{{name}}鞙茧 鞎� 毵岆摛旮�',
+    subTitle: '鞎� 鞎勳澊旖� 氚� 鞚措',
+    nameRequired: '鞎� 鞚措鞚� 頃勳垬鞛呺媹雼�',
+  },
+  category: {
+    Assistant: '鞏挫嫓鞀ろ劥韸�',
+    Writing: '鞛戩劚',
+    Translate: '氩堨棴',
+    Programming: '頂勲攴鸽灅氚�',
+    Agent: '鞐愳澊鞝勴姼',
+    Workflow: '鞗岉伂頂岆鞖�',
+    HR: '鞚胳偓',
+    Entertainment: '鞓る澖',
+  },
+}
+
+export default translation
diff --git a/i18n/ko-KR/layout.ts b/i18n/ko-KR/layout.ts
new file mode 100644
index 0000000..e2410dd
--- /dev/null
+++ b/i18n/ko-KR/layout.ts
@@ -0,0 +1,3 @@
+const translation = {}
+
+export default translation
diff --git a/i18n/ko-KR/login.ts b/i18n/ko-KR/login.ts
new file mode 100644
index 0000000..05a60c7
--- /dev/null
+++ b/i18n/ko-KR/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: '鞁滌瀾頃橁赴 馃帀',
+  welcome: 'Dify鞐� 鞓れ嫚 瓴冹潉 頇橃榿頃╇媹雼�. 瓿勳啀頃橂牑氅� 搿滉犯鞚疙晿靹胳殧.',
+  email: '鞚措鞚� 欤检唽',
+  emailPlaceholder: '鞚措鞚� 欤检唽毳� 鞛呺牓頃橃劯鞖�',
+  password: '牍勲皜氩堩樃',
+  passwordPlaceholder: '牍勲皜氩堩樃毳� 鞛呺牓頃橃劯鞖�',
+  name: '靷毄鞛� 鞚措',
+  namePlaceholder: '靷毄鞛� 鞚措鞚� 鞛呺牓頃橃劯鞖�',
+  forget: '牍勲皜氩堩樃毳� 鞛婌溂靺倶鞖�?',
+  signBtn: '搿滉犯鞚�',
+  installBtn: '靹れ箻',
+  setAdminAccount: '甏�毽瀽 瓿勳爼 靹れ爼',
+  setAdminAccountDesc: '鞎� 靸濎劚 氚� LLM 鞝滉车鞛� 甏�毽� 霌� 斓滉碃 甓岉暅鞚� 臧�歆� 甏�毽瀽 瓿勳爼 靹れ爼',
+  createAndSignIn: '瓿勳爼 靸濎劚 氚� 搿滉犯鞚�',
+  oneMoreStep: '毵堨毵� 雼硠',
+  createSample: '鞚� 鞝曤炒毳� 旮半皹鞙茧 靸橅攲 鞎膘潉 靸濎劚頃╇媹雼�.',
+  invitationCode: '齑堧寑 旖旊摐',
+  invitationCodePlaceholder: '齑堧寑 旖旊摐毳� 鞛呺牓頃橃劯鞖�',
+  interfaceLanguage: '鞚疙劙韼橃澊鞀� 鞏胳柎',
+  timezone: '鞁滉皠雽�',
+  go: 'Dify搿� 鞚措彊',
+  sendUsMail: '臧勲嫧頃� 靻岅皽毳� 氅旍澕搿� 氤措偞欤检嫓氅� 齑堧寑 鞖旍箔鞚� 觳橂Μ頃措摐毽诫媹雼�.',
+  acceptPP: '臧滌澑鞝曤炒 觳橂Μ 氚╈龚鞐� 霃欖潣頃╇媹雼�.',
+  reset: '牍勲皜氩堩樃毳� 鞛劋鞝曧晿霠る┐ 雼れ潓 氇呺牴鞚� 鞁ろ枆頃橃劯鞖�:',
+  withGitHub: 'GitHub搿� 瓿勳啀',
+  withGoogle: 'Google搿� 瓿勳啀',
+  rightTitle: 'LLM鞚� 斓滊寑 鞛犾灛霠レ潉 氚滍湗頃橃劯鞖�',
+  rightDesc: '毵る牓鞝侅澊瓿� 臁办瀾 臧�電ロ晿氅� 臧滌劆 臧�電ロ暅 AI 鞎犿攲毽紑鞚挫厴鞚� 靿疥矊 甑稌頃橃劯鞖�.',
+  tos: '鞚挫毄鞎疥磤',
+  pp: '臧滌澑鞝曤炒 觳橂Μ 氚╈龚',
+  tosDesc: '臧�鞛呿暔鞙茧鞃� 雼れ潓 雮挫毄鞐� 霃欖潣頃橁矊 霅╇媹雼�.',
+  goToInit: '瓿勳爼鞚� 齑堦赴頇旊悩歆� 鞎婌晿雼る┐ 齑堦赴頇� 韼橃澊歆�搿� 鞚措彊頃橃劯鞖�.',
+  dontHave: '瓿勳爼鞚� 鞐嗢溂鞁犼皜鞖�?',
+  invalidInvitationCode: '鞙犿毃頃橃 鞎婌潃 齑堧寑 旖旊摐鞛呺媹雼�.',
+  accountAlreadyInited: '瓿勳爼鞚� 鞚措 齑堦赴頇旊悩鞐堨姷雼堧嫟.',
+  forgotPassword: '牍勲皜氩堩樃毳� 鞛婌溂靺倶鞖�?',
+  resetLinkSent: '鞛劋鞝� 毵來伂臧� 鞝勳啞霅橃棃鞀惦媹雼�',
+  sendResetLink: '鞛劋鞝� 毵來伂 氤措偞旮�',
+  backToSignIn: '搿滉犯鞚胳溂搿� 霃岇晞臧�旮�',
+  forgotPasswordDesc: '牍勲皜氩堩樃毳� 鞛劋鞝曧晿霠る┐ 鞚措鞚� 欤检唽毳� 鞛呺牓頃橃劯鞖�. 牍勲皜氩堩樃 鞛劋鞝� 氚╇矔鞐� 雽�頃� 鞚措鞚检潉 氤措偞霌滊Μ瓴犾姷雼堧嫟.',
+  checkEmailForResetLink: '牍勲皜氩堩樃 鞛劋鞝� 毵來伂毳� 頇曥澑頃橂牑氅� 鞚措鞚检潉 頇曥澑頃橃劯鞖�. 氇� 攵� 雮挫棎 雮橅儉雮橃 鞎婌溂氅� 鞀ろ尭 韽措崝毳� 頇曥澑頃橃劯鞖�.',
+  passwordChanged: '歆�旮� 搿滉犯鞚�',
+  changePassword: '牍勲皜氩堩樃 氤�瓴�',
+  changePasswordTip: '瓿勳爼鞚� 靸� 牍勲皜氩堩樃毳� 鞛呺牓頃橃劯鞖�',
+  invalidToken: '鞙犿毃頃橃 鞎婈卑雮� 毵岆霅� 韱犿伆',
+  confirmPassword: '牍勲皜氩堩樃 頇曥澑',
+  confirmPasswordPlaceholder: '靸� 牍勲皜氩堩樃毳� 頇曥澑頃橃劯鞖�',
+  passwordChangedTip: '牍勲皜氩堩樃臧� 靹标车鞝侅溂搿� 氤�瓴诫悩鞐堨姷雼堧嫟',
+  error: {
+    emailEmpty: '鞚措鞚� 欤检唽毳� 鞛呺牓頃橃劯鞖�.',
+    emailInValid: '鞙犿毃頃� 鞚措鞚� 欤检唽毳� 鞛呺牓頃橃劯鞖�.',
+    nameEmpty: '靷毄鞛� 鞚措鞚� 鞛呺牓頃橃劯鞖�.',
+    passwordEmpty: '牍勲皜氩堩樃毳� 鞛呺牓頃橃劯鞖�.',
+    passwordInvalid: '牍勲皜氩堩樃電� 氍胳瀽鞕� 靾瀽毳� 韽暔頃橁碃 8鞛� 鞚挫儊鞚挫柎鞎� 頃╇媹雼�.',
+    passwordLengthInValid: '牍勲皜氩堩樃電� 8鞛� 鞚挫儊鞚挫柎鞎� 頃╇媹雼�.',
+    registrationNotAllowed: '瓿勳爼鞚� 彀眷潉 靾� 鞐嗢姷雼堧嫟. 霌彪頃橂牑氅� 鞁滌姢韰� 甏�毽瀽鞐愱矊 氍胳潣頃橃嫮鞁滌槫.',
+  },
+  license: {
+    tip: 'Dify Community Edition鞚� 鞁滌瀾頃橁赴 鞝勳棎 GitHub鞚�',
+    link: '鞓ろ攬 靻岇姢 霛检澊靹犾姢',
+  },
+  join: '臧�鞛呿晿旮�',
+  joinTipStart: '雼轨嫚鞚� 齑堧寑頃╇媹雼�.',
+  joinTipEnd: '韺�鞐� 臧�鞛呿晿靹胳殧.',
+  invalid: '毵來伂鞚� 鞙犿毃 旮瓣皠鞚� 毵岆霅橃棃鞀惦媹雼�.',
+  explore: 'Dify毳� 韮愳儔頃橃劯鞖�',
+  activatedTipStart: '鞚挫牅',
+  activatedTipEnd: '韺�鞐� 臧�鞛呺悩鞐堨姷雼堧嫟.',
+  activated: '歆�旮� 搿滉犯鞚疙晿靹胳殧',
+  adminInitPassword: '甏�毽瀽 齑堦赴頇� 牍勲皜氩堩樃',
+  validate: '頇曥澑',
+  sso: 'SSO搿� 瓿勳啀頃橁赴',
+  checkCode: {
+    verify: '頇曥澑',
+    verificationCode: '鞚胳 旖旊摐',
+    tips: '<strong>{{email}}</strong>搿� 鞚胳 旖旊摐毳� 氤措偞霌滊雼堧嫟.',
+    validTime: '旖旊摐電� 5攵� 霃欖晥 鞙犿毃頃╇媹雼�',
+    checkYourEmail: '鞚措鞚� 欤检唽 頇曥澑',
+    invalidCode: '鞙犿毃頃橃 鞎婌潃 旖旊摐',
+    verificationCodePlaceholder: '6鞛愲Μ 旖旊摐 鞛呺牓',
+    emptyCode: '旖旊摐臧� 頃勳殧頃╇媹雼�.',
+    useAnotherMethod: '雼るジ 氚╇矔 靷毄',
+    didNotReceiveCode: '旖旊摐毳� 氚涭 氇豁晿靺倶鞖�?',
+    resend: '鞛爠靻�',
+  },
+  back: '霋る',
+  or: '霕愲姅',
+  useVerificationCode: '鞚胳 旖旊摐 靷毄',
+  continueWithCode: '旖旊摐搿� 瓿勳啀頃橁赴',
+  usePassword: '牍勲皜氩堩樃 靷毄',
+  withSSO: 'SSO搿� 瓿勳啀頃橁赴',
+  backToLogin: '搿滉犯鞚胳溂搿� 霃岇晞臧�旮�',
+  resetPassword: '牍勲皜氩堩樃 鞛劋鞝�',
+  setYourAccount: '瓿勳爼 靹れ爼',
+  noLoginMethod: '鞚胳 氚╇矔鞚� 甑劚霅橃 鞎婌潓',
+  sendVerificationCode: '鞚胳 旖旊摐 氤措偞旮�',
+  changePasswordBtn: '牍勲皜氩堩樃 靹れ爼',
+  enterYourName: '靷毄鞛� 鞚措鞚� 鞛呺牓頃� 欤检劯鞖�',
+  noLoginMethodTip: '鞚胳 氚╇矔鞚� 於旉皜頃橂牑氅� 鞁滌姢韰� 甏�毽瀽鞐愱矊 氍胳潣頃橃嫮鞁滌槫.',
+  resetPasswordDesc: 'Dify鞐� 臧�鞛呿暊 霑� 靷毄頃� 鞚措鞚检潉 鞛呺牓頃橂┐ 牍勲皜氩堩樃 鞛劋鞝� 鞚措鞚检潉 氤措偞霌滊雼堧嫟.',
+  licenseInactiveTip: '鞛戩梾 鞓侅棴鞐� 雽�頃� Dify Enterprise 霛检澊靹犾姢臧� 牍勴櫆靹� 靸來儨鞛呺媹雼�. Dify毳� 瓿勳啀 靷毄頃橂牑氅� 甏�毽瀽鞐愱矊 氍胳潣頃橃嫮鞁滌槫.',
+  licenseLost: '霛检澊靹检姢 攵勳嫟',
+  licenseLostTip: 'Dify 霛检澊靹犾姢 靹滊矂鞐� 鞐瓣舶頃橃 氇豁枅鞀惦媹雼�. Dify毳� 瓿勳啀 靷毄頃橂牑氅� 甏�毽瀽鞐愱矊 氍胳潣頃橃嫮鞁滌槫.',
+  licenseInactive: 'License Inactive(霛检澊靹犾姢 牍勴櫆靹�)',
+  licenseExpired: '霛检澊靹检姢臧� 毵岆霅橃棃鞀惦媹雼�.',
+  licenseExpiredTip: '鞛戩梾 鞓侅棴鞐� 雽�頃� Dify Enterprise 霛检澊靹犾姢臧� 毵岆霅橃棃鞀惦媹雼�. Dify毳� 瓿勳啀 靷毄頃橂牑氅� 甏�毽瀽鞐愱矊 氍胳潣頃橃嫮鞁滌槫.',
+}
+
+export default translation
diff --git a/i18n/ko-KR/plugin-tags.ts b/i18n/ko-KR/plugin-tags.ts
new file mode 100644
index 0000000..ddd75ef
--- /dev/null
+++ b/i18n/ko-KR/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    social: '靷殞鞝侅澑',
+    finance: '旮堨湹',
+    travel: '鞐枆頃橂嫟',
+    search: '瓴�靸�',
+    entertainment: '鞓る澖',
+    utilities: '鞙犿嫺毽嫲',
+    productivity: '靸濎偘霠�',
+    weather: '雮犾敤',
+    other: '雼るジ',
+    videos: '霃欖榿靸�',
+    news: '靻岇嫕',
+    medical: '雮搓臣鞚�',
+    education: '甑愳湣',
+    image: '鞚措歆�',
+    design: '霐旍瀽鞚�',
+    business: '靷梾',
+    agent: '雽�毽澑',
+  },
+  allTags: '氇摖 韮滉犯',
+  searchTags: '瓴�靸� 韮滉犯',
+}
+
+export default translation
diff --git a/i18n/ko-KR/plugin.ts b/i18n/ko-KR/plugin.ts
new file mode 100644
index 0000000..923f9d5
--- /dev/null
+++ b/i18n/ko-KR/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    agents: '鞐愳澊鞝勴姼 鞝勲灥',
+    models: '氇嵏',
+    all: '氇憪',
+    extensions: '頇曥灔',
+    tools: '霃勱惮',
+    bundles: '氩堧摛',
+  },
+  categorySingle: {
+    extension: '頇曥灔',
+    tool: '霃勱惮',
+    agent: '鞐愳澊鞝勴姼 鞝勲灥',
+    bundle: '氤措敯毽�',
+    model: '氇嵏',
+  },
+  list: {
+    source: {
+      marketplace: '毵堨紦頂岆爤鞚挫姢鞐愳劀 靹れ箻',
+      local: '搿滌滑 韺偆歆� 韺岇澕鞐愳劀 靹れ箻',
+      github: 'GitHub鞐愳劀 靹れ箻',
+    },
+    noInstalled: '靹れ箻霅� 頂岆煬攴胳澑鞚� 鞐嗢姷雼堧嫟.',
+    notFound: '頂岆煬攴胳澑鞚� 彀眷潉 靾� 鞐嗢姷雼堧嫟.',
+  },
+  source: {
+    local: '搿滌滑 韺偆歆� 韺岇澕',
+    marketplace: '鞁滌灔',
+    github: '旯冺棃敫�',
+  },
+  detailPanel: {
+    categoryTip: {
+      marketplace: '毵堨紦頂岆爤鞚挫姢鞐愳劀 靹れ箻霅�',
+      debugging: '霐旊矂旯� 頂岆煬攴胳澑',
+      github: 'Github鞐愳劀 靹れ箻霅�',
+      local: '搿滌滑 頂岆煬攴胳澑',
+    },
+    operation: {
+      detail: '靹鸽秬 鞝曤炒',
+      install: '靹れ箻',
+      viewDetail: '鞛愳劯頌堧炒旮�',
+      info: '頂岆煬攴胳澑 鞝曤炒',
+      update: '鞐呺嵃鞚错姼',
+      remove: '鞝滉卑',
+      checkUpdate: '鞐呺嵃鞚错姼 頇曥澑',
+    },
+    toolSelector: {
+      empty: '\'+\' 氩勴娂鞚� 韥措Ν頃橃棳 霃勱惮毳� 於旉皜頃╇媹雼�. 鞐煬 霃勱惮毳� 於旉皜頃� 靾� 鞛堨姷雼堧嫟.',
+      descriptionLabel: '霃勱惮 靹る獏',
+      uninstalledContent: '鞚� 頂岆煬攴胳澑鞚� 搿滌滑/GitHub 鞝�鞛レ唽鞐愳劀 靹れ箻霅╇媹雼�. 靹れ箻 頉� 靷毄頃橃嫮鞁滌槫.',
+      params: '於旊 甑劚',
+      paramsTip1: 'LLM 於旊 韺岆澕氙疙劙毳� 鞝滌柎頃╇媹雼�.',
+      uninstalledLink: '頂岆煬攴胳澑鞐愳劀 甏�毽�',
+      unsupportedTitle: '歆�鞗愲悩歆� 鞎婋姅 鞛戩梾',
+      auto: '鞛愲彊 氩堨棴',
+      settings: '靷毄鞛� 靹れ爼',
+      unsupportedContent2: '氩勳爠鞚� 鞝勴櫂頃橂牑氅� 韥措Ν頃╇媹雼�.',
+      uninstalledTitle: '霃勱惮臧� 靹れ箻霅橃 鞎婌潓',
+      descriptionPlaceholder: '霃勱惮鞚� 鞖╇弰鞐� 雽�頃� 臧勲灥頃� 靹る獏(鞓�: 韸轨爼 鞙勳箻鞚� 鞓弰 臧�鞝胳槫旮�).',
+      title: '於旉皜 霃勱惮',
+      toolLabel: '霃勱惮',
+      placeholder: '霃勱惮 靹犿儩...',
+      paramsTip2: '\'鞛愲彊\'鞚� 旰检牳 鞛堨溂氅� 旮半掣臧掛澊 靷毄霅╇媹雼�.',
+      unsupportedContent: '靹れ箻霅� 頂岆煬攴胳澑 氩勳爠鞚� 鞚� 鞛戩梾鞚� 鞝滉车頃橃 鞎婌姷雼堧嫟.',
+    },
+    configureApp: '鞎� 甑劚',
+    strategyNum: '{{氩堩樃}} {{鞝勲灥}} 韽暔',
+    endpointModalDesc: '甑劚鞚� 鞕勲霅橂┐ API 鞐旊摐韽澑韸鸽ゼ 韱淀暣 頂岆煬攴胳澑鞐愳劀 鞝滉车頃橂姅 旮半姤鞚� 靷毄頃� 靾� 鞛堨姷雼堧嫟.',
+    actionNum: '{{氩堩樃}} {{頄夒彊}} 韽暔',
+    endpointDeleteTip: '鞐旊摐韽澑韸� 鞝滉卑',
+    modelNum: '{{氩堩樃}} 韽暔 霅� 氇嵏',
+    configureModel: '氇嵏 甑劚',
+    configureTool: '甑劚 霃勱惮',
+    switchVersion: '鞀れ渼旃� 氩勳爠',
+    endpointsEmpty: '\'+\' 氩勴娂鞚� 韥措Ν頃橃棳 鞐旊摐韽澑韸鸽ゼ 於旉皜頃╇媹雼�.',
+    endpointModalTitle: '鞐旊摐韽澑韸� 靹れ爼',
+    endpointsTip: '鞚� 頂岆煬攴胳澑鞚� 鞐旊摐韽澑韸鸽ゼ 韱淀暣 韸轨爼 旮半姤鞚� 鞝滉车頃橂┌ 順勳灛 鞛戩梾 瓿店皠鞐� 雽�頃� 鞐煬 鞐旊摐韽澑韸� 靹疙姼毳� 甑劚頃� 靾� 鞛堨姷雼堧嫟.',
+    endpointDisableContent: '{{name}}鞚� 牍勴櫆靹表檾頃橃嫓瓴犾姷雼堦箤?',
+    endpointDeleteContent: '{{name}}鞚� 鞝滉卑頃橃嫓瓴犾姷雼堦箤?',
+    disabled: '牍勴櫆靹表檾',
+    endpointsDocLink: '氍胳劀 氤搓赴',
+    endpoints: '雭濎爯',
+    serviceOk: '靹滊箘鞀� 鞝曥儊',
+    endpointDisableTip: '鞐旊摐韽澑韸� 牍勴櫆靹表檾',
+  },
+  debugInfo: {
+    title: '霐旊矂旯�',
+    viewDocs: '氍胳劀 氤搓赴',
+  },
+  privilege: {
+    admins: '甏�毽瀽',
+    title: '頂岆煬攴胳澑 旮半掣 靹れ爼',
+    whoCanDebug: '雸勱皜 頂岆煬攴胳澑鞚� 霐旊矂旯呿暊 靾� 鞛堧倶鞖�?',
+    noone: '鞎勲霃� 鞐嗢柎',
+    everyone: '氇憪',
+    whoCanInstall: '雸勱皜 頂岆煬攴胳澑鞚� 靹れ箻頃橁碃 甏�毽暊 靾� 鞛堨姷雼堦箤?',
+  },
+  pluginInfoModal: {
+    packageName: '韺偆歆�',
+    repository: '鞝�鞛レ唽',
+    title: '頂岆煬攴胳澑 鞝曤炒',
+    release: '靹濍癌',
+  },
+  action: {
+    deleteContentRight: '頂岆煬攴胳澑?',
+    usedInApps: '鞚� 頂岆煬攴胳澑鞚� {{num}}臧滌潣 鞎膘棎靹� 靷毄霅橁碃 鞛堨姷雼堧嫟.',
+    pluginInfo: '頂岆煬攴胳澑 鞝曤炒',
+    checkForUpdates: '鞐呺嵃鞚错姼 頇曥澑',
+    deleteContentLeft: '鞝滉卑頃橃嫓瓴犾姷雼堦箤?',
+    delete: '頂岆煬攴胳澑 鞝滉卑',
+  },
+  installModal: {
+    labels: {
+      package: '韺偆歆�',
+      repository: '鞝�鞛レ唽',
+      version: '氩勳爠',
+    },
+    back: '霋る',
+    readyToInstallPackage: '雼れ潓 頂岆煬攴胳澑鞚� 靹れ箻頃橂牑瓿� 頃╇媹雼�.',
+    close: '雼嫟',
+    fromTrustSource: '<trustSource>鞁犽頃� 靾� 鞛堧姅 於滌矘</trustSource>鞚� 頂岆煬攴胳澑毵� 靹れ箻頃橂弰搿� 頃橃劯鞖�.',
+    readyToInstall: '雼れ潓 頂岆煬攴胳澑鞚� 靹れ箻頃橂牑瓿� 頃╇媹雼�.',
+    uploadFailed: '鞐呺霌� 鞁ろ尐',
+    installPlugin: '頂岆煬攴胳澑 靹れ箻',
+    pluginLoadErrorDesc: '鞚� 頂岆煬攴胳澑鞚� 靹れ箻霅橃 鞎婌姷雼堧嫟.',
+    installedSuccessfully: '靹れ箻 靹标车',
+    installedSuccessfullyDesc: '頂岆煬攴胳澑鞚� 靹标车鞝侅溂搿� 靹れ箻霅橃棃鞀惦媹雼�.',
+    installing: '靹れ箻...',
+    pluginLoadError: '頂岆煬攴胳澑 搿滊摐 鞓る',
+    installFailedDesc: '頂岆煬攴胳澑鞚� 靹れ箻霅橃 鞎婌晿鞀惦媹雼�.',
+    installFailed: '靹れ箻 鞁ろ尐',
+    next: '雼れ潓',
+    installComplete: '靹れ箻 鞕勲',
+    install: '靹れ箻頃橂嫟',
+    readyToInstallPackages: '雼れ潓 {{num}} 頂岆煬攴胳澑鞚� 靹れ箻頃橂牑瓿� 頃╇媹雼�.',
+    uploadingPackage: '{{packageName}} 鞐呺霌� 欷�...',
+    dropPluginToInstall: '頂岆煬攴胳澑 韺偆歆�毳� 鞐赴鞐� 雴撿晞 靹れ箻頃橃嫮鞁滌槫.',
+    cancel: '旆唽',
+  },
+  installFromGitHub: {
+    uploadFailed: '鞐呺霌� 鞁ろ尐',
+    selectVersionPlaceholder: '氩勳爠鞚� 靹犿儩頃橃劯鞖�.',
+    installPlugin: 'GitHub鞐愳劀 頂岆煬攴胳澑 靹れ箻',
+    installFailed: '靹れ箻 鞁ろ尐',
+    updatePlugin: 'GitHub鞐愳劀 頂岆煬攴胳澑 鞐呺嵃鞚错姼',
+    selectPackage: '韺偆歆� 靹犿儩',
+    gitHubRepo: 'GitHub 毽彫歆�韱犽Μ',
+    selectPackagePlaceholder: '韺偆歆�毳� 靹犿儩頃橃劯鞖�.',
+    installedSuccessfully: '靹れ箻 靹标车',
+    selectVersion: '氩勳爠 靹犿儩',
+    installNote: '鞁犽頃� 靾� 鞛堧姅 於滌矘鞚� 頂岆煬攴胳澑毵� 靹れ箻頃橂弰搿� 頃橃劯鞖�.',
+  },
+  upgrade: {
+    usedInApps: '{{num}}臧滌潣 鞎膘棎靹� 靷毄霅�',
+    description: '雼れ潓 頂岆煬攴胳澑鞚� 靹れ箻頃橂牑瓿� 頃╇媹雼�.',
+    successfulTitle: '靹れ箻 靹标车',
+    upgrade: '靹れ箻頃橂嫟',
+    upgrading: '靹れ箻...',
+    close: '雼嫟',
+    title: '頂岆煬攴胳澑 靹れ箻',
+  },
+  error: {
+    noReleasesFound: '毽措Μ鞀るゼ 彀眷潉 靾� 鞐嗢姷雼堧嫟. GitHub 毽彫歆�韱犽Μ 霕愲姅 鞛呺牓 URL鞚� 頇曥澑頃橃劯鞖�.',
+    fetchReleasesError: '毽措Μ鞀るゼ 瓴�靸夗暊 靾� 鞐嗢姷雼堧嫟. 雮橃鞐� 雼れ嫓 鞁滊弰頃橃嫮鞁滌槫.',
+    inValidGitHubUrl: '鞛橂霅� GitHub URL鞛呺媹雼�. 鞙犿毃頃� URL鞚� https://github.com/owner/repo 順曥嫕鞙茧 鞛呺牓頃橃嫮鞁滌槫.',
+  },
+  marketplace: {
+    sortOption: {
+      recentlyUpdated: '斓滉芳 鞐呺嵃鞚错姼',
+      firstReleased: '觳� 於滌嫓',
+      newlyReleased: '靸堧 於滌嫓 霅�',
+      mostPopular: '臧�鞛� 鞚戈赴 鞛堧姅',
+    },
+    noPluginFound: '頂岆煬攴胳澑鞚� 彀眷潉 靾� 鞐嗢姷雼堧嫟.',
+    empower: 'AI 臧滊皽 鞐焿 臧曧檾',
+    viewMore: '雿旊炒旮�',
+    difyMarketplace: 'Dify 毵堨紦頂岆爤鞚挫姢',
+    pluginsResult: '{{num}} 瓴瓣臣',
+    discover: '氚滉铂頃橂嫟',
+    moreFrom: 'Marketplace鞐愳劀 雿� 氤搓赴',
+    sortBy: '鞝曤牞',
+    and: '攴鸽Μ瓿�',
+    verifiedTip: 'Dify鞐� 鞚橅暣 頇曥澑霅�',
+    partnerTip: 'Dify 韺岉姼雱堨棎 鞚橅暣 頇曥澑霅�',
+  },
+  task: {
+    installingWithSuccess: '{{installingLength}} 頂岆煬攴胳澑 靹れ箻, {{successLength}} 靹标车.',
+    installedError: '{{errorLength}} 頂岆煬攴胳澑 靹れ箻 鞁ろ尐',
+    installing: '{{installingLength}} 頂岆煬攴胳澑 靹れ箻, 0 鞕勲.',
+    installingWithError: '{{installingLength}} 頂岆煬攴胳澑 靹れ箻, {{successLength}} 靹标车, {{errorLength}} 鞁ろ尐',
+    installError: '{{errorLength}} 頂岆煬攴胳澑 靹れ箻 鞁ろ尐, 氤措牑氅� 韥措Ν頃橃嫮鞁滌槫.',
+    clearAll: '氇憪 歆�鞖瓣赴',
+  },
+  installAction: '靹れ箻頃橂嫟',
+  searchTools: '瓴�靸� 霃勱惮...',
+  installPlugin: '頂岆煬攴胳澑 靹れ箻',
+  endpointsEnabled: '{{num}}臧滌潣 鞐旊摐韽澑韸� 歆戫暕鞚� 頇滌劚頇旊悩鞐堨姷雼堧嫟.',
+  installFrom: '鞐愳劀 靹れ箻',
+  allCategories: '氇摖 旃错厡瓿犽Μ',
+  submitPlugin: '鞝滌稖 頂岆煬攴胳澑',
+  findMoreInMarketplace: 'Marketplace鞐愳劀 雿� 鞎岇晞氤搓赴',
+  searchCategories: '瓴�靸� 旃错厡瓿犽Μ',
+  search: '瓴�靸�',
+  searchInMarketplace: 'Marketplace鞐愳劀 瓴�靸�',
+  from: '氤措偢 靷瀸',
+  searchPlugins: '瓴�靸� 頂岆煬攴胳澑',
+  install: '{{num}} 靹れ箻',
+  fromMarketplace: 'Marketplace鞐愳劀',
+  metadata: {
+    title: '頂岆煬攴胳澑',
+  },
+  difyVersionNotCompatible: '順勳灛 Dify 氩勳爠鞚� 鞚� 頂岆煬攴胳澑瓿� 順疙櫂霅橃 鞎婌姷雼堧嫟. 頃勳殧頃� 斓滌唽 氩勳爠鞙茧 鞐呹犯霠堨澊霌滍晿鞁嫓鞓�: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/ko-KR/register.ts b/i18n/ko-KR/register.ts
new file mode 100644
index 0000000..e2410dd
--- /dev/null
+++ b/i18n/ko-KR/register.ts
@@ -0,0 +1,3 @@
+const translation = {}
+
+export default translation
diff --git a/i18n/ko-KR/run-log.ts b/i18n/ko-KR/run-log.ts
new file mode 100644
index 0000000..7af4cee
--- /dev/null
+++ b/i18n/ko-KR/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: '鞛呺牓',
+  result: '瓴瓣臣',
+  detail: '靸侅劯鞝曤炒',
+  tracing: '韸鸽爤鞚挫嫳',
+  resultPanel: {
+    status: '靸來儨',
+    time: '靻岇殧 鞁滉皠',
+    tokens: '韱犿伆 齑濏暕',
+  },
+  meta: {
+    title: '氅旐儉雿办澊韯�',
+    status: '靸來儨',
+    version: '氩勳爠',
+    executor: '鞁ろ枆鞛�',
+    startTime: '鞁滌瀾 鞁滉皠',
+    time: '靻岇殧 鞁滉皠',
+    tokens: '韱犿伆 齑濏暕',
+    steps: '鞁ろ枆 雼硠',
+  },
+  resultEmpty: {
+    title: '鞚� 鞁ろ枆鞐愳劀電� JSON 順曥嫕毵� 於滊牓霅╇媹雼�',
+    tipLeft: '毳� 氚╇頃挫<靹胳殧',
+    link: '靸侅劯 鞝曤炒 韺剱',
+    tipRight: '毳� 頇曥澑頃橃劯鞖�.',
+  },
+  actionLogs: '鞛戩梾 搿滉犯',
+  circularInvocationTip: '順勳灛 鞗岉伂頂岆鞖办棎 霃勱惮/雲鸽摐鞚� 靾滍櫂 順胳稖鞚� 鞛堨姷雼堧嫟.',
+}
+
+export default translation
diff --git a/i18n/ko-KR/share-app.ts b/i18n/ko-KR/share-app.ts
new file mode 100644
index 0000000..8474bc5
--- /dev/null
+++ b/i18n/ko-KR/share-app.ts
@@ -0,0 +1,78 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: '鞎膘潉 靷毄頃� 靾� 鞐嗢姷雼堧嫟',
+    appUnknownError: '鞎膘潉 靷毄頃� 靾� 鞐嗢姷雼堧嫟',
+  },
+  chat: {
+    newChat: '靸� 毂勴寘',
+    pinnedTitle: '瓿犾爼霅�',
+    unpinnedTitle: '毂勴寘',
+    newChatDefaultName: '靸� 雽�頇�',
+    resetChat: '雽�頇� 鞛劋鞝�',
+    poweredBy: 'Powered by',
+    prompt: '頂勲‖頂勴姼',
+    privatePromptConfigTitle: '毂勴寘 靹れ爼',
+    publicPromptConfigTitle: '齑堦赴 頂勲‖頂勴姼',
+    configStatusDes: '鞁滌瀾頃橁赴 鞝勳棎 毂勴寘 靹れ爼鞚� 氤�瓴巾暊 靾� 鞛堨姷雼堧嫟',
+    configDisabled: '鞚挫爠 靹胳厴鞚� 靹れ爼鞚� 順勳灛 靹胳厴鞐愳劀 靷毄霅橃棃鞀惦媹雼�.',
+    startChat: '毂勴寘 鞁滌瀾',
+    privacyPolicyLeft: '鞎� 臧滊皽鞛愱皜 鞝滉车頃橂姅',
+    privacyPolicyMiddle: '臧滌澑 鞝曤炒 氤错樃 鞝曥眳',
+    privacyPolicyRight: '鞚� 鞚届柎氤挫劯鞖�.',
+    deleteConversation: {
+      title: '雽�頇� 靷牅',
+      content: '鞚� 雽�頇旊ゼ 靷牅頃橃嫓瓴犾姷雼堦箤?',
+    },
+    tryToSolve: '頃搓舶頃橂牑瓿� 頃╇媹雼�',
+    temporarySystemIssue: '欤勳啞頃╇媹雼�. 鞚检嫓鞝侅澑 鞁滌姢韰� 氍胳牅臧� 氚滌儩頄堨姷雼堧嫟.',
+    expand: '頇曥灔',
+    collapse: '於曥唽',
+    viewChatSettings: '毂勴寘 靹れ爼 氤搓赴',
+    newChatTip: '鞚措 靸堧鞖� 毂勴寘 欷戩瀰雼堧嫟.',
+    chatFormTip: '毂勴寘鞚� 鞁滌瀾霅� 頉勳棎電� 毂勴寘 靹れ爼鞚� 靾橃爼頃� 靾� 鞐嗢姷雼堧嫟.',
+    chatSettingsTitle: '靸� 毂勴寘 靹れ爼',
+  },
+  generation: {
+    tabs: {
+      create: '鞚柬殞鞖� 鞁ろ枆',
+      batch: '鞚缄磩 鞁ろ枆',
+      saved: '鞝�鞛ル悳 瓴瓣臣',
+    },
+    savedNoData: {
+      title: '鞎勳 鞝�鞛ル悳 瓴瓣臣臧� 鞐嗢姷雼堧嫟!',
+      description: '旎厫旄� 靸濎劚鞚� 鞁滌瀾頃橁碃 鞝�鞛ル悳 瓴瓣臣毳� 鞐赴靹� 彀眷晞氤挫劯鞖�.',
+      startCreateContent: '旎厫旄� 靸濎劚 鞁滌瀾',
+    },
+    title: 'AI 鞕勳劚',
+    queryTitle: '旎厫旄� 炜茧Μ',
+    completionResult: '鞕勳劚 瓴瓣臣',
+    queryPlaceholder: '炜茧Μ 旎厫旄犽ゼ 鞛戩劚頃挫<靹胳殧...',
+    run: '鞁ろ枆',
+    copy: '氤奠偓',
+    resultTitle: 'AI 鞕勳劚',
+    noData: 'AI臧� 頃勳殧頃� 雮挫毄鞚� 鞝滉车頃� 瓴冹瀰雼堧嫟.',
+    csvUploadTitle: 'CSV 韺岇澕鞚� 鞐赴搿� 雭岇柎雼� 雴撽卑雮�',
+    browse: '彀眷晞氤搓赴',
+    csvStructureTitle: 'CSV 韺岇澕鞚� 雼れ潓 甑“毳� 霐半澕鞎� 頃╇媹雼�:',
+    downloadTemplate: '鞐赴鞐愳劀 韰滍攲毽� 雼れ毚搿滊摐',
+    field: '頃勲摐',
+    batchFailed: {
+      info: '{{num}} 須岇潣 鞁ろ枆鞚� 鞁ろ尐頄堨姷雼堧嫟',
+      retry: '鞛嫓霃�',
+      outputPlaceholder: '於滊牓 旎厫旄� 鞐嗢潓',
+    },
+    errorMsg: {
+      empty: '鞐呺霌滊悳 韺岇澕鞐� 旎厫旄犽ゼ 鞛呺牓頃挫<靹胳殧.',
+      fileStructNotMatch: '鞐呺霌滊悳 CSV 韺岇澕鞚� 甑“鞕� 鞚检箻頃橃 鞎婌姷雼堧嫟.',
+      emptyLine: '欷� {{rowIndex}}鞚�(臧�) 牍勳柎 鞛堨姷雼堧嫟.',
+      invalidLine: '欷� {{rowIndex}}: {{varName}}鞚� 臧掛潃 牍勳泴霊� 靾� 鞐嗢姷雼堧嫟.',
+      moreThanMaxLengthLine: '欷� {{rowIndex}}: {{varName}}鞚� 臧掛潃 {{maxLength}}鞛愲ゼ 齑堦臣頃� 靾� 鞐嗢姷雼堧嫟.',
+      atLeastOne: '鞐呺霌滊悳 韺岇澕鞐愲姅 鞝侅柎霃� 頃� 欷勳潣 鞛呺牓鞚� 頃勳殧頃╇媹雼�.',
+    },
+    execution: '鞁ろ枆',
+    executions: '{{num}} 觳橅槙',
+  },
+}
+
+export default translation
diff --git a/i18n/ko-KR/time.ts b/i18n/ko-KR/time.ts
new file mode 100644
index 0000000..78e825d
--- /dev/null
+++ b/i18n/ko-KR/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Wed: '靾橃殧鞚�',
+    Thu: '氇╈殧鞚�',
+    Fri: '鞛愳湢',
+    Sat: '韱犾殧鞚�',
+    Sun: '韮滌枒',
+    Tue: '頇旍殧鞚�',
+    Mon: '氇�',
+  },
+  months: {
+    May: '5鞗�',
+    January: '1鞗�',
+    August: '8鞗�',
+    July: '7鞗�',
+    April: '4鞗�',
+    October: '10鞗�',
+    December: '12鞗�',
+    February: '2鞗�',
+    June: '6鞗�',
+    November: '11鞗�',
+    March: '3鞗�',
+    September: '9鞗�',
+  },
+  operation: {
+    pickDate: '雮犾 靹犿儩',
+    cancel: '旆唽',
+    ok: '膦嬱晞鞖�',
+    now: '歆�旮�',
+  },
+  title: {
+    pickTime: '鞁滉皠 靹犿儩',
+  },
+  defaultPlaceholder: '鞁滉皠鞚� 靹犿儩頃橃劯鞖�...',
+}
+
+export default translation
diff --git a/i18n/ko-KR/tools.ts b/i18n/ko-KR/tools.ts
new file mode 100644
index 0000000..8727c6d
--- /dev/null
+++ b/i18n/ko-KR/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: '霃勱惮',
+  createCustomTool: '旎れ姢韰� 霃勱惮 毵岆摛旮�',
+  customToolTip: 'Dify 旎れ姢韰� 霃勱惮鞐� 雽�頃� 雿� 鞎岇晞氤搓赴',
+  type: {
+    all: '氇憪',
+    builtIn: '雮挫灔',
+    custom: '旎れ姢韰�',
+    workflow: '鞗岉伂頂岆鞖�',
+  },
+  contribute: {
+    line1: '鞝�電� Dify鞐�',
+    line2: '霃勱惮毳� 旮办棳頃橂姅雿� 甏�鞁澊 鞛堨姷雼堧嫟.',
+    viewGuide: '臧�鞚措摐 氤搓赴',
+  },
+  author: '鞝�鞛�',
+  auth: {
+    unauthorized: '鞚胳霅橃 鞎婌潓',
+    authorized: '鞚胳霅�',
+    setup: '靷毄鞚� 鞙勴暅 鞚胳 靹れ爼',
+    setupModalTitle: '鞚胳 靹れ爼',
+    setupModalTitleDescription: '鞛愱博 歃濍獏鞚� 甑劚頃� 頉勳棎 鞗岉伂鞀ろ帢鞚挫姢鞚� 氇摖 氅る矂臧� 鞚� 霃勱惮毳� 靷毄頃橃棳 鞎犿攲毽紑鞚挫厴鞚� 臁办瀾頃� 靾� 鞛堨姷雼堧嫟.',
+  },
+  includeToolNum: '{{num}}臧滌潣 霃勱惮臧� 韽暔霅橃柎 鞛堨姷雼堧嫟',
+  addTool: '霃勱惮 於旉皜',
+  addToolModal: {
+    type: '韮�鞛�',
+    category: '旃错厡瓿犽Μ',
+    add: '於旉皜',
+    added: '於旉皜霅�',
+    manageInTools: '霃勱惮鞐愳劀 甏�毽�',
+    emptyTitle: '靷毄 臧�電ロ暅 鞗岉伂頂岆鞖� 霃勱惮 鞐嗢潓',
+    emptyTip: '"鞗岉伂頂岆鞖� -> 霃勱惮搿� 霌彪頃橁赴"搿� 鞚措彊',
+    emptyTipCustom: '靷毄鞛� 歆�鞝� 霃勱惮 毵岆摛旮�',
+    emptyTitleCustom: '靷毄 臧�電ロ暅 靷毄鞛� 歆�鞝� 霃勱惮臧� 鞐嗢姷雼堧嫟.',
+  },
+  createTool: {
+    title: '旎れ姢韰� 霃勱惮 毵岆摛旮�',
+    editAction: '靹れ爼',
+    editTitle: '旎れ姢韰� 霃勱惮 韼胳',
+    name: '鞚措',
+    toolNamePlaceHolder: '霃勱惮 鞚措鞚� 鞛呺牓頃橃劯鞖�',
+    nameForToolCall: '霃勱惮 順胳稖 鞚措',
+    nameForToolCallPlaceHolder: 'getCurrentWeather, list_pets 瓿� 臧欖澊, 旮瓣硠 鞚胳毳� 鞙勴暣 靷毄霅╇媹雼�.',
+    nameForToolCallTip: '靾瀽鞕� 氍胳瀽, 氚戩毵� 歆�鞗愴暕雼堧嫟.',
+    description: '靹る獏',
+    descriptionPlaceholder: '霃勱惮鞚� 氇╈爜鞚� 靹る獏頃╇媹雼�. 鞓堨嫓搿�, 韸轨爼 歆�鞐潣 鞓弰 臧�鞝胳槫旮�',
+    schema: '鞀ろ偆毵�',
+    schemaPlaceHolder: '鞐赴鞐� OpenAPI 鞀ろ偆毵堧ゼ 鞛呺牓頃橃劯鞖�',
+    viewSchemaSpec: 'OpenAPI-Swagger 氇呾劯 氤搓赴',
+    importFromUrl: 'URL鞐愳劀 臧�鞝胳槫旮�',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: '鞙犿毃頃� URL鞚� 鞛呺牓頃橃劯鞖�',
+    examples: '鞓堨嫓',
+    exampleOptions: {
+      json: '雮犾敤 (JSON)',
+      yaml: '韼� 鞀ろ啝鞏� (YAML)',
+      blankTemplate: '牍� 韰滍攲毽�',
+    },
+    availableTools: {
+      title: '靷毄 臧�電ロ暅 霃勱惮',
+      name: '鞚措',
+      description: '靹る獏',
+      method: '氅旍唽霌�',
+      path: '瓴诫',
+      action: '霃欖瀾',
+      test: '韰岇姢韸�',
+    },
+    authMethod: {
+      title: '鞚胳 氚╇矔',
+      type: '鞚胳 鞙犿槙',
+      keyTooltip: 'HTTP 項る崝 韨れ瀰雼堧嫟. 靸濌皝鞚� 鞐嗢溂氅� "Authorization"鞙茧 雮波霊� 靾� 鞛堨姷雼堧嫟. 霕愲姅 靷毄鞛� 鞝曥潣 臧掛潉 靹れ爼頃� 靾� 鞛堨姷雼堧嫟.',
+      types: {
+        none: '鞐嗢潓',
+        api_key: 'API 韨�',
+        apiKeyPlaceholder: 'API 韨れ潣 HTTP 項る崝 鞚措',
+        apiValuePlaceholder: 'API 韨るゼ 鞛呺牓頃橃劯鞖�',
+      },
+      key: '韨�',
+      value: '臧�',
+    },
+    authHeaderPrefix: {
+      title: '鞚胳 鞙犿槙',
+      types: {
+        basic: '氩犾澊歆�',
+        bearer: '氩犾柎霟�',
+        custom: '靷毄鞛� 鞝曥潣',
+      },
+    },
+    privacyPolicy: '臧滌澑鞝曤炒 觳橂Μ氚╈龚',
+    privacyPolicyPlaceholder: '臧滌澑鞝曤炒 觳橂Μ氚╈龚鞚� 鞛呺牓頃橃劯鞖�',
+    toolInput: {
+      title: '霃勱惮 鞛呺牓',
+      name: '鞚措',
+      required: '頃勳殧靷暛',
+      method: '氚╈嫕',
+      methodSetting: '靹れ爼',
+      methodSettingTip: '霃勱惮 靹れ爼鞐愳劀 靷毄鞛愱皜 旮办瀰',
+      methodParameter: '韺岆澕氙疙劙',
+      methodParameterTip: '於旊 欷戩棎 LLM鞚� 旮办瀰',
+      label: '韮滉犯',
+      labelPlaceholder: '韮滉犯毳� 靹犿儩頃橃劯鞖�.(靹犿儩靷暛)',
+      description: '靹る獏',
+      descriptionPlaceholder: '韺岆澕氙疙劙鞚� 鞚橂弰毳� 靹る獏頃橃劯鞖�.',
+    },
+    customDisclaimer: '靷毄鞛� 鞝曥潣 甓岆Μ 韽赴 氍戈惮',
+    customDisclaimerPlaceholder: '靷毄鞛� 鞝曥潣 甓岆Μ 韽赴 氍戈惮毳� 鞛呺牓頃挫<靹胳殧.',
+    confirmTitle: '鞝�鞛ロ晿鞁滉矤鞀惦媹旯�?',
+    confirmTip: '鞚� 霃勱惮毳� 靷毄頃橂姅 鞎膘潃 鞓來枼鞚� 氚涭姷雼堧嫟.',
+    deleteToolConfirmTitle: '鞚� 霃勱惮毳� 靷牅頃橃嫓瓴犾姷雼堦箤?',
+    deleteToolConfirmContent: '鞚� 霃勱惮毳� 靷牅頃橂┐ 霅橂弻毽� 靾� 鞐嗢姷雼堧嫟. 靷毄鞛愲姅 雿� 鞚挫儊 雼轨嫚鞚� 霃勱惮鞐� 鞎§劯鞀ろ暊 靾� 鞐嗢姷雼堧嫟.',
+  },
+  test: {
+    title: '韰岇姢韸�',
+    parametersValue: '韺岆澕氙疙劙 氚� 臧�',
+    parameters: '韺岆澕氙疙劙',
+    value: '臧�',
+    testResult: '韰岇姢韸� 瓴瓣臣',
+    testResultPlaceholder: '韰岇姢韸� 瓴瓣臣臧� 鞐赴鞐� 響滌嫓霅╇媹雼�',
+  },
+  thought: {
+    using: '靷毄 欷�',
+    used: '靷毄霅�',
+    requestTitle: '鞖旍箔',
+    responseTitle: '鞚戨嫷',
+  },
+  setBuiltInTools: {
+    info: '鞝曤炒',
+    setting: '靹れ爼',
+    toolDescription: '霃勱惮 靹る獏',
+    parameters: '韺岆澕氙疙劙',
+    string: '氍胳瀽鞐�',
+    number: '靾瀽',
+    required: '頃勳垬',
+    infoAndSetting: '鞝曤炒 氚� 靹れ爼',
+    file: '韺岇澕',
+  },
+  noCustomTool: {
+    title: '旎れ姢韰� 霃勱惮臧� 鞐嗢姷雼堧嫟!',
+    content: 'AI 鞎膘潉 甑稌頃橁赴 鞙勴暅 旎れ姢韰� 霃勱惮毳� 鞐赴靹� 於旉皜 氚� 甏�毽暕雼堧嫟.',
+    createTool: '霃勱惮 毵岆摛旮�',
+  },
+  noSearchRes: {
+    title: '欤勳啞頃╇媹雼�. 瓴瓣臣臧� 鞐嗢姷雼堧嫟!',
+    content: '瓴�靸� 瓴瓣臣臧� 鞐嗢姷雼堧嫟.',
+    reset: '瓴�靸� 齑堦赴頇�',
+  },
+  builtInPromptTitle: '頂勲‖頂勴姼',
+  toolRemoved: '霃勱惮臧� 鞝滉卑霅橃棃鞀惦媹雼�',
+  notAuthorized: '甓岉暅鞚� 鞐嗢姷雼堧嫟',
+  howToGet: '須嶋摑 氚╇矔',
+  openInStudio: '鞀ろ姕霐旍槫鞐愳劀 鞐搓赴',
+  toolNameUsageTip: 'Agent 於旊Μ鞕� 頂勲‖頂勴姼毳� 鞙勴暅 霃勱惮 順胳稖 鞚措',
+  noTools: '霃勱惮毳� 彀眷潉 靾� 鞐嗢姷雼堧嫟.',
+  copyToolName: '鞚措 氤奠偓',
+}
+
+export default translation
diff --git a/i18n/ko-KR/workflow.ts b/i18n/ko-KR/workflow.ts
new file mode 100644
index 0000000..a3496b7
--- /dev/null
+++ b/i18n/ko-KR/workflow.ts
@@ -0,0 +1,921 @@
+const translation = {
+  common: {
+    undo: '鞁ろ枆 旆唽',
+    redo: '雼れ嫓 鞁ろ枆',
+    editing: '韼胳 欷�',
+    autoSaved: '鞛愲彊 鞝�鞛ル惃',
+    unpublished: '氙鸽皽頄�',
+    published: '氚滍枆霅�',
+    publish: '氚滍枆',
+    update: '鞐呺嵃鞚错姼',
+    run: '鞁ろ枆',
+    running: '鞁ろ枆 欷�',
+    inRunMode: '鞁ろ枆 氇摐',
+    inPreview: '氙鸽Μ氤搓赴 欷�',
+    inPreviewMode: '氙鸽Μ氤搓赴 氇摐',
+    preview: '氙鸽Μ氤搓赴',
+    viewRunHistory: '鞁ろ枆 旮半 氤搓赴',
+    runHistory: '鞁ろ枆 旮半',
+    goBackToEdit: '韼胳旮半 霃岇晞臧�旮�',
+    conversationLog: '雽�頇� 搿滉犯',
+    features: '旮半姤',
+    debugAndPreview: '氙鸽Μ氤搓赴',
+    restart: '鞛嫓鞛�',
+    currentDraft: '順勳灛 齑堨晥',
+    currentDraftUnpublished: '順勳灛 齑堨晥 氙鸽皽頄�',
+    latestPublished: '斓滌嫚 氚滍枆氤�',
+    publishedAt: '氚滍枆鞚�',
+    restore: '氤奠洂',
+    runApp: '鞎� 鞁ろ枆',
+    batchRunApp: '鞎� 鞚缄磩 鞁ろ枆',
+    accessAPIReference: 'API 彀胳“ 鞝戧芳',
+    embedIntoSite: '靷澊韸胳棎 靷届瀰',
+    addTitle: '鞝滊 於旉皜...',
+    addDescription: '靹る獏 於旉皜...',
+    noVar: '氤�靾� 鞐嗢潓',
+    searchVar: '氤�靾� 瓴�靸�',
+    variableNamePlaceholder: '氤�靾� 鞚措',
+    setVarValuePlaceholder: '氤�靾� 臧� 靹れ爼',
+    needConnectTip: '鞚� 雼硠電� 鞎勲瓴冸弰 鞐瓣舶霅橃柎 鞛堨 鞎婌姷雼堧嫟',
+    maxTreeDepth: '攵勱赴雼� 斓滊寑 {{depth}} 雲鸽摐 鞝滍暅',
+    needEndNode: '膦呺 敫旊鞚� 於旉皜頃挫暭 頃╇媹雼�',
+    needAnswerNode: '雼惦硛 敫旊鞚� 於旉皜頃挫暭 頃╇媹雼�',
+    workflowProcess: '鞗岉伂頂岆鞖� 瓿检爼',
+    notRunning: '鞎勳 鞁ろ枆霅橃 鞎婌潓',
+    previewPlaceholder: '霐旊矂旯呾潉 鞁滌瀾頃橂牑氅� 鞎勲灅 靸侅瀽鞐� 雮挫毄鞚� 鞛呺牓頃橃劯鞖�',
+    effectVarConfirm: {
+      title: '氤�靾� 鞝滉卑',
+      content: '氤�靾橁皜 雼るジ 雲鸽摐鞐愳劀 靷毄霅橁碃 鞛堨姷雼堧嫟. 攴鸽灅霃� 鞝滉卑頃橃嫓瓴犾姷雼堦箤?',
+    },
+    insertVarTip: '牍犽ゴ瓴� 靷届瀰頃橂牑氅� \'/\' 韨るゼ 雸勲ゴ靹胳殧',
+    processData: '雿办澊韯� 觳橂Μ',
+    input: '鞛呺牓',
+    output: '於滊牓',
+    jinjaEditorPlaceholder: '氤�靾橂ゼ 靷届瀰頃橂牑氅� \'/\' 霕愲姅 \'{\'毳� 鞛呺牓頃橃劯鞖�',
+    viewOnly: '氤搓赴 鞝勳毄',
+    showRunHistory: '鞁ろ枆 旮半 氤搓赴',
+    enableJinja: 'Jinja 韰滍攲毽� 歆�鞗� 頇滌劚頇�',
+    learnMore: '雿� 鞎岇晞氤搓赴',
+    copy: '氤奠偓',
+    duplicate: '氤奠牅',
+    addBlock: '敫旊 於旉皜',
+    pasteHere: '鞐赴鞐� 攵欖棳雱j赴',
+    pointerMode: '韽澑韯� 氇摐',
+    handMode: '頃鸽摐 氇摐',
+    model: '氇嵏',
+    workflowAsTool: '霃勱惮搿滌劀鞚� 鞗岉伂頂岆鞖�',
+    configureRequired: '甑劚 頃勳殧',
+    configure: '甑劚',
+    manageInTools: '霃勱惮鞐愳劀 甏�毽�',
+    workflowAsToolTip: '鞗岉伂頂岆鞖� 鞐呺嵃鞚错姼 頉� 霃勱惮 鞛惮靹膘澊 頃勳殧頃╇媹雼�.',
+    viewDetailInTracingPanel: '靹鸽秬 鞝曤炒 氤搓赴',
+    importDSL: 'DSL 臧�鞝胳槫旮�',
+    importFailure: '臧�鞝胳槫旮� 鞁ろ尐',
+    chooseDSL: 'DSL(yml) 韺岇澕 靹犿儩',
+    backupCurrentDraft: '順勳灛 齑堨晥 氚膘梾',
+    overwriteAndImport: '雿柎鞊瓣赴 氚� 臧�鞝胳槫旮�',
+    importSuccess: '臧�鞝胳槫旮� 靹标车',
+    syncingData: '雼� 氇� 齑� 毵岇棎 雿办澊韯半ゼ 霃欔赴頇旐暊 靾� 鞛堨姷雼堧嫟.',
+    importDSLTip: '順勳灛 齑堨晥鞚� 雿柎鞌侂媹雼�. 臧�鞝胳槫旮� 鞝勳棎 鞗岉伂頂岆毳� 氚膘梾鞙茧 雮措炒雰呺媹雼�.',
+    parallelTip: {
+      click: {
+        title: '韥措Ν',
+        desc: '於旉皜',
+      },
+      drag: {
+        title: '霌滊灅攴�',
+        desc: '鞐瓣舶 氚╇矔',
+      },
+      depthLimit: '韽夗枆 欷戩博 霠堨澊鞏� {{num}}臧� 霠堨澊鞏挫潣 鞝滍暅',
+      limit: '氤戨牞 觳橂Μ電� {{num}}臧滌潣 攵勱赴搿� 鞝滍暅霅╇媹雼�.',
+    },
+    parallelRun: '氤戨牞 鞁ろ枆',
+    disconnect: '攵勲Μ頃橂嫟',
+    jumpToNode: '鞚� 雲鸽摐搿� 鞚措彊',
+    addParallelNode: '氤戨牞 雲鸽摐 於旉皜',
+    parallel: '氤戨牞',
+    branch: '敫岆灉旃�',
+    featuresDocLink: '雿� 鞎岇晞氤挫劯鞖�',
+    fileUploadTip: '鞚措歆� 鞐呺霌� 旮半姤鞚� 韺岇澕 鞐呺霌滊 鞐呹犯霠堨澊霌滊悩鞐堨姷雼堧嫟.',
+    featuresDescription: '鞗轨暠 靷毄鞛� 瓴巾棙 頄レ儊',
+    ImageUploadLegacyTip: '鞚挫牅 鞁滌瀾 鞏戩嫕鞐愳劀 韺岇澕 順曥嫕 氤�靾橂ゼ 毵岆摛 靾� 鞛堨姷雼堧嫟. 鞎烄溂搿� 鞚措歆� 鞐呺霌� 旮半姤鞚� 雿� 鞚挫儊 歆�鞗愲悩歆� 鞎婌姷雼堧嫟.',
+    importWarning: '欤检潣',
+    importWarningDetails: 'DSL 氩勳爠 彀澊電� 韸轨爼 旮半姤鞐� 鞓來枼鞚� 氙胳範 靾� 鞛堨姷雼堧嫟.',
+    openInExplore: 'Explore鞐愳劀 鞐搓赴',
+    onFailure: '鞁ろ尐 鞁�',
+    addFailureBranch: '鞁ろ尐 攵勱赴 於旉皜',
+    noHistory: '鞚措牓 鞐嗢潓',
+    loadMore: '雿� 毵庫潃 鞗岉伂頂岆鞖� 搿滊摐',
+    publishUpdate: '鞐呺嵃鞚错姼 瓴岇嫓',
+    exportJPEG: 'JPEG搿� 雮措炒雮搓赴',
+    exitVersions: '膦呺 氩勳爠',
+    exportImage: '鞚措歆� 雮措炒雮搓赴',
+    noExist: '頃措嫻 氤�靾橁皜 鞐嗢姷雼堧嫟.',
+    exportSVG: 'SVG搿� 雮措炒雮搓赴',
+    versionHistory: '氩勳爠 旮半',
+    exportPNG: 'PNG搿� 雮措炒雮搓赴',
+    referenceVar: '彀胳“ 氤�靾�',
+  },
+  env: {
+    envPanelTitle: '頇橁步 氤�靾�',
+    envDescription: '頇橁步 氤�靾橂姅 臧滌澑 鞝曤炒鞕� 鞛愱博 歃濍獏鞚� 鞝�鞛ロ晿電� 雿� 靷毄霅� 靾� 鞛堨姷雼堧嫟. 鞚措摛鞚� 鞚疥赴 鞝勳毄鞚措┌ 雮措炒雮搓赴 欷戩棎 DSL 韺岇澕瓿� 攵勲Μ頃� 靾� 鞛堨姷雼堧嫟.',
+    envPanelButton: '氤�靾� 於旉皜',
+    modal: {
+      title: '頇橁步 氤�靾� 於旉皜',
+      editTitle: '頇橁步 氤�靾� 韼胳',
+      type: '鞙犿槙',
+      name: '鞚措',
+      namePlaceholder: '頇橁步 鞚措',
+      value: '臧�',
+      valuePlaceholder: '頇橁步 臧�',
+      secretTip: '氙缄皭頃� 鞝曤炒雮� 雿办澊韯半ゼ 鞝曥潣頃橂姅 雿� 靷毄霅橂┌, DSL 靹れ爼鞚� 鞙犾稖 氚╈毳� 鞙勴暣 甑劚霅╇媹雼�.',
+    },
+    export: {
+      title: '牍勲皜 頇橁步 氤�靾橂ゼ 雮措炒雮挫嫓瓴犾姷雼堦箤?',
+      checkbox: '牍勲皜 臧� 雮措炒雮搓赴',
+      ignore: 'DSL 雮措炒雮搓赴',
+      export: '牍勲皜 臧掛澊 韽暔霅� DSL 雮措炒雮搓赴',
+    },
+  },
+  chatVariable: {
+    panelTitle: '雽�頇� 氤�靾�',
+    panelDescription: '雽�頇� 氤�靾橂姅 LLM鞚� 旮办柕頃挫暭 頃� 雽�頇� 旮半, 鞐呺霌滊悳 韺岇澕, 靷毄鞛� 靹犿樃霃� 霌膘潣 靸來樃鞛戩毄 鞝曤炒毳� 鞝�鞛ロ晿電� 雿� 靷毄霅╇媹雼�. 鞚措摛鞚� 鞚疥赴 氚� 鞊瓣赴臧� 臧�電ロ暕雼堧嫟.',
+    docLink: '鞛愳劯頃� 雮挫毄鞚� 氍胳劀毳� 彀胳“頃橃劯鞖�.',
+    button: '氤�靾� 於旉皜',
+    modal: {
+      title: '雽�頇� 氤�靾� 於旉皜',
+      editTitle: '雽�頇� 氤�靾� 韼胳',
+      name: '鞚措',
+      namePlaceholder: '氤�靾� 鞚措',
+      type: '鞙犿槙',
+      value: '旮半掣臧�',
+      valuePlaceholder: '旮半掣臧�, 靹れ爼頃橃 鞎婌溂霠る┐ 牍勳泴霊愳劯鞖�',
+      description: '靹る獏',
+      descriptionPlaceholder: '氤�靾橃棎 雽�頃� 靹る獏頃橃劯鞖�',
+      editInJSON: 'JSON鞙茧 韼胳',
+      oneByOne: '頃橂倶鞌� 於旉皜',
+      editInForm: '鞏戩嫕鞐愳劀 韼胳',
+      arrayValue: '臧�',
+      addArrayValue: '臧� 於旉皜',
+      objectKey: '韨�',
+      objectType: '鞙犿槙',
+      objectValue: '旮半掣臧�',
+    },
+    storedContent: '鞝�鞛ル悳 雮挫毄',
+    updatedAt: '鞐呺嵃鞚错姼 鞁滉皠: ',
+  },
+  changeHistory: {
+    title: '氤�瓴� 旮半',
+    placeholder: '鞎勳 鞎勲 瓴冸弰 氤�瓴巾晿歆� 鞎婌晿鞀惦媹雼�',
+    clearHistory: '旮半 歆�鞖瓣赴',
+    hint: '頌岉姼',
+    hintText: '韼胳 鞛戩梾鞚� 氤�瓴� 旮半鞐� 於旍爜霅橂┌, 鞚� 靹胳厴 霃欖晥 旮瓣赴鞐� 鞝�鞛ル惄雼堧嫟. 韼胳旮半ゼ 霒犽倶氅� 鞚� 旮半鞚� 歆�鞗岇雼堧嫟.',
+    stepBackward_one: '{{count}} 雼硠 霋る',
+    stepBackward_other: '{{count}} 雼硠 霋る',
+    stepForward_one: '{{count}} 雼硠 鞎烄溂搿�',
+    stepForward_other: '{{count}} 雼硠 鞎烄溂搿�',
+    sessionStart: '靹胳厴 鞁滌瀾',
+    currentState: '順勳灛 靸來儨',
+    nodeTitleChange: '敫旊 鞝滊 氤�瓴诫惃',
+    nodeDescriptionChange: '敫旊 靹る獏 氤�瓴诫惃',
+    nodeDragStop: '敫旊 鞚措彊霅�',
+    nodeChange: '敫旊 氤�瓴诫惃',
+    nodeConnect: '敫旊 鞐瓣舶霅�',
+    nodePaste: '敫旊 攵欖棳雱j赴霅�',
+    nodeDelete: '敫旊 靷牅霅�',
+    nodeAdd: '敫旊 於旉皜霅�',
+    nodeResize: '敫旊 韥赴 臁办爼霅�',
+    noteAdd: '雲疙姼 於旉皜霅�',
+    noteChange: '雲疙姼 氤�瓴诫惃',
+    noteDelete: '雲疙姼 靷牅霅�',
+    edgeDelete: '敫旊 鞐瓣舶 頃挫牅霅�',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}}臧� 頃勳殧頃╇媹雼�',
+    authRequired: '鞚胳鞚� 頃勳殧頃╇媹雼�',
+    invalidJson: '{{field}}電� 鞛橂霅� JSON鞛呺媹雼�',
+    fields: {
+      variable: '氤�靾� 鞚措',
+      variableValue: '氤�靾� 臧�',
+      code: '旖旊摐',
+      model: '氇嵏',
+      rerankModel: '鞛爼霠� 氇嵏',
+      visionVariable: '鞁滊牓 氤�靾�',
+    },
+    invalidVariable: '鞛橂霅� 氤�靾�',
+    rerankModelRequired: 'Rerank Model鞚� 旒滉赴 鞝勳棎 靹れ爼鞐愳劀 氇嵏鞚� 靹标车鞝侅溂搿� 甑劚霅橃棃電旍 頇曥澑頃橃嫮鞁滌槫.',
+    noValidTool: '{{field}} 鞙犿毃頃� 霃勱惮臧� 靹犿儩霅橃 鞎婌晿鞀惦媹雼�.',
+    toolParameterRequired: '{{field}}: 毵り皽氤�靾� [{{param}}]鞚� 頃勳殧頃╇媹雼�.',
+  },
+  singleRun: {
+    testRun: '韰岇姢韸� 鞁ろ枆',
+    startRun: '鞁ろ枆 鞁滌瀾',
+    running: '鞁ろ枆 欷�',
+    testRunIteration: '韰岇姢韸� 鞁ろ枆 氚橂车',
+    back: '霋る',
+    iteration: '氚橂车',
+    loop: '耄攧',
+  },
+  tabs: {
+    'searchBlock': '敫旊 瓴�靸�',
+    'blocks': '敫旊',
+    'tools': '霃勱惮',
+    'allTool': '鞝勳泊',
+    'builtInTool': '雮挫灔',
+    'customTool': '靷毄鞛� 鞝曥潣',
+    'workflowTool': '鞗岉伂頂岆鞖�',
+    'question-understand': '歆堧 鞚错暣',
+    'logic': '雲茧Μ',
+    'transform': '氤�頇�',
+    'utilities': '鞙犿嫺毽嫲',
+    'noResult': '鞚检箻頃橂姅 瓴瓣臣 鞐嗢潓',
+    'searchTool': '瓴�靸� 霃勱惮',
+    'plugin': '頂岆煬攴胳澑',
+    'agent': '鞐愳澊鞝勴姼 鞝勲灥',
+  },
+  blocks: {
+    'start': '鞁滌瀾',
+    'end': '雭�',
+    'answer': '雼惦硛',
+    'llm': 'LLM',
+    'knowledge-retrieval': '歆�鞁� 瓴�靸�',
+    'question-classifier': '歆堧 攵勲旮�',
+    'if-else': 'IF/ELSE',
+    'code': '旖旊摐',
+    'template-transform': '韰滍攲毽�',
+    'http-request': 'HTTP 鞖旍箔',
+    'variable-assigner': '氤�靾� 頃犽嫻鞛�',
+    'variable-aggregator': '氤�靾� 歆戧硠鞛�',
+    'assigner': '氤�靾� 頃犽嫻鞛�',
+    'iteration-start': '氚橂车 鞁滌瀾',
+    'iteration': '氚橂车',
+    'parameter-extractor': '毵り皽氤�靾� 於旍稖旮�',
+    'document-extractor': 'Doc 於旍稖旮�',
+    'list-operator': 'List 鞐办偘鞛�',
+    'agent': '雽�毽澑',
+    'loop-start': '耄攧 鞁滌瀾',
+    'loop-end': '耄攧 膦呺',
+    'loop': '耄攧',
+  },
+  blocksAbout: {
+    'start': '鞗岉伂頂岆鞖半ゼ 鞁滌瀾頃橁赴 鞙勴暅 齑堦赴 毵り皽氤�靾橂ゼ 鞝曥潣頃╇媹雼�',
+    'end': '鞗岉伂頂岆鞖办潣 膦呺 氚� 瓴瓣臣 鞙犿槙鞚� 鞝曥潣頃╇媹雼�',
+    'answer': '雽�頇旍潣 雼惦硛 雮挫毄鞚� 鞝曥潣頃╇媹雼�',
+    'llm': '歆堧鞐� 雼淀晿瓯半倶 鞛愳棸鞏措ゼ 觳橂Μ頃橁赴 鞙勴暣 雽�順� 鞏胳柎 氇嵏鞚� 順胳稖頃╇媹雼�',
+    'knowledge-retrieval': '靷毄鞛� 歆堧瓿� 甏�霠悳 韰嶌姢韸� 旖橅厫旄犽ゼ 歆�鞁� 氩犾澊鞀れ棎靹� 炜茧Μ頃� 靾� 鞛堨姷雼堧嫟',
+    'question-classifier': '靷毄鞛� 歆堧鞚� 攵勲 臁瓣贝鞚� 鞝曥潣頃╇媹雼�. LLM鞚� 攵勲 靹る獏鞚� 旮半皹鞙茧 雽�頇旍潣 歆勴枆 氚╈嫕鞚� 鞝曥潣頃� 靾� 鞛堨姷雼堧嫟',
+    'if-else': 'if/else 臁瓣贝鞚� 旮半皹鞙茧 鞗岉伂頂岆鞖半ゼ 霊� 臧�歆� 攵勱赴搿� 雮橂垖 靾� 鞛堨姷雼堧嫟',
+    'code': '靷毄鞛� 鞝曥潣 雲茧Μ毳� 甑槃頃橁赴 鞙勴暣 Python 霕愲姅 NodeJS 旖旊摐毳� 鞁ろ枆頃╇媹雼�',
+    'template-transform': 'Jinja 韰滍攲毽� 甑鞚� 靷毄頃橃棳 雿办澊韯半ゼ 氍胳瀽鞐措 氤�頇橅暕雼堧嫟',
+    'http-request': 'HTTP 頂勲韱犾綔鞚� 韱淀暣 靹滊矂 鞖旍箔鞚� 氤措偧 靾� 鞛堨姷雼堧嫟',
+    'variable-assigner': '雼れ 攵勱赴 氤�靾橂摛鞚� 頃橂倶鞚� 氤�靾橂 歆戧硠頃橃棳 雼れ毚鞀ろ姼毽� 雲鸽摐鞚� 韱淀暕 甑劚鞚� 臧�電ロ晿瓴� 頃╇媹雼�.',
+    'assigner': '氤�靾� 頃犽嫻 雲鸽摐電� 鞊瓣赴 臧�電ロ暅 氤�靾�(雽�頇� 氤�靾� 霌�)鞐� 臧掛潉 頃犽嫻頃橂姅 雿� 靷毄霅╇媹雼�.',
+    'variable-aggregator': '雼れ 攵勱赴 氤�靾橂摛鞚� 頃橂倶鞚� 氤�靾橂 歆戧硠頃橃棳 雼れ毚鞀ろ姼毽� 雲鸽摐鞚� 韱淀暕 甑劚鞚� 臧�電ロ晿瓴� 頃╇媹雼�.',
+    'iteration': '氇╇ 臧濎泊鞐愳劀 鞐煬 雼硠毳� 靾橅枆頃橃棳 氇摖 瓴瓣臣臧� 於滊牓霅� 霑岅箤歆� 氚橂车頃╇媹雼�.',
+    'parameter-extractor': '霃勱惮 順胳稖 霕愲姅 HTTP 鞖旍箔鞚� 鞙勴暣 鞛愳棸鞏挫棎靹� 甑“頇旊悳 毵り皽氤�靾橂ゼ 於旍稖頃橁赴 鞙勴暣 LLM鞚� 靷毄頃╇媹雼�.',
+    'document-extractor': '鞐呺霌滊悳 氍胳劀毳� LLM鞐愳劀 靿疥矊 鞚错暣頃� 靾� 鞛堧姅 韰嶌姢韸� 旖橅厫旄犽 甑 攵勳劃頃橂姅 雿� 靷毄霅╇媹雼�.',
+    'list-operator': '氚办棿 雮挫毄鞚� 頃勴劙毵來晿瓯半倶 鞝曤牞頃橂姅 雿� 靷毄霅╇媹雼�.',
+    'agent': '歆堧鞐� 雼淀晿瓯半倶 鞛愳棸鞏措ゼ 觳橂Μ頃橁赴 鞙勴暣 雽�攴滊 鞏胳柎 氇嵏鞚� 順胳稖頃橂姅 瓴届毎',
+    'loop': '膦呺 臁瓣贝鞚� 於╈”霅橁卑雮� 斓滊寑 氚橂车 須熿垬鞐� 霃勲嫭頃� 霑岅箤歆� 雲茧Μ 耄攧毳� 鞁ろ枆頃╇媹雼�.',
+    'loop-end': '"break"鞕� 霃欖澕頃╇媹雼�. 鞚� 雲鸽摐電� 甑劚 頃鞚� 鞐嗢姷雼堧嫟. 耄攧 氤鸽鞚� 鞚� 雲鸽摐鞐� 霃勲嫭頃橂┐ 耄攧臧� 膦呺霅╇媹雼�.',
+  },
+  operator: {
+    zoomIn: '頇曤寑',
+    zoomOut: '於曥唽',
+    zoomTo50: '50%搿� 頇曤寑',
+    zoomTo100: '100%搿� 頇曤寑',
+    zoomToFit: '頇旊┐鞐� 毵炾矊 頇曤寑',
+  },
+  panel: {
+    userInputField: '靷毄鞛� 鞛呺牓 頃勲摐',
+    changeBlock: '敫旊 氤�瓴�',
+    helpLink: '霃勳泙毵� 毵來伂',
+    about: '鞝曤炒',
+    createdBy: '鞛戩劚鞛� ',
+    nextStep: '雼れ潓 雼硠',
+    addNextStep: '鞚� 鞗岉伂頂岆鞖办潣 雼れ潓 敫旊 於旉皜',
+    selectNextStep: '雼れ潓 敫旊 靹犿儩',
+    runThisStep: '鞚� 雼硠 鞁ろ枆',
+    checklist: '觳错伂毽姢韸�',
+    checklistTip: '瓴岇嫓頃橁赴 鞝勳棎 氇摖 氍胳牅臧� 頃搓舶霅橃棃電旍 頇曥澑頃橃劯鞖�',
+    checklistResolved: '氇摖 氍胳牅臧� 頃搓舶霅橃棃鞀惦媹雼�',
+    organizeBlocks: '敫旊 鞝曤Μ',
+    change: '氤�瓴�',
+    optional: '(靹犿儩靷暛)',
+  },
+  nodes: {
+    common: {
+      outputVars: '於滊牓 氤�靾�',
+      insertVarTip: '氤�靾� 靷届瀰',
+      memory: {
+        memory: '氅旊毽�',
+        memoryTip: '雽�頇� 氅旊毽� 靹れ爼',
+        windowSize: '彀� 韥赴',
+        conversationRoleName: '雽�頇� 鞐暊 鞚措',
+        user: '靷毄鞛� 鞝戨憪靷�',
+        assistant: '鞏挫嫓鞀ろ劥韸� 鞝戨憪靷�',
+      },
+      memories: {
+        title: '氅旊毽�',
+        tip: '雽�頇� 氅旊毽�',
+        builtIn: '雮挫灔',
+      },
+      errorHandle: {
+        none: {
+          title: '鞐嗢潓',
+          desc: '鞓堨櫢臧� 氚滌儩頃橁碃 觳橂Μ霅橃 鞎婌溂氅� 雲鸽摐 鞁ろ枆鞚� 欷戩霅╇媹雼�',
+        },
+        defaultValue: {
+          title: '旮半掣臧�',
+          desc: '鞓る臧� 氚滌儩頃橂┐ 鞝曥爜 於滊牓 旖橅厫旄犽ゼ 歆�鞝曧暕雼堧嫟.',
+          tip: '鞓る臧� 氚滌儩頃橂┐ 鞎勲灅 臧掛潉 氚橅櫂頃╇媹雼�.',
+          inLog: '雲鸽摐 鞓堨櫢, 旮半掣臧掛棎 霐半澕 於滊牓頃╇媹雼�.',
+          output: '於滊牓 旮半掣臧�',
+        },
+        failBranch: {
+          title: '鞁ろ尐 攵勱赴',
+          desc: '鞓る臧� 氚滌儩頃橂┐ 鞓堨櫢 攵勱赴毳� 鞁ろ枆頃╇媹雼�',
+          customize: '旌旊矂鞀る 鞚措彊頃橃棳 fail branch logic毳� 靷毄鞛� 歆�鞝曧暕雼堧嫟.',
+          inLog: '雲鸽摐 鞓堨櫢電� 鞁ろ尐 攵勱赴毳� 鞛愲彊鞙茧 鞁ろ枆頃╇媹雼�. 雲鸽摐 於滊牓鞚� 鞓る 鞙犿槙 氚� 鞓る 氅旍嫓歆�毳� 氚橅櫂頃橁碃 雼れ毚鞀ろ姼毽检溂搿� 鞝勲嫭頃╇媹雼�.',
+          customizeTip: 'fail 攵勱赴臧� 頇滌劚頇旊悩氅� 雲鸽摐鞐愳劀 throw霅� 鞓堨櫢臧� 頂勲靹胳姢毳� 膦呺頃橃 鞎婌姷雼堧嫟. 雽�鞁� 氙鸽Μ 鞝曥潣霅� 鞁ろ尐 攵勱赴毳� 鞛愲彊鞙茧 鞁ろ枆頃橃棳 鞓る 氅旍嫓歆�, 氤搓碃靹�, 靾橃爼 靷暛鞚� 鞙犾棸頃橁矊 鞝滉车頃橁卑雮� 鞛戩梾鞚� 瓯措剤霙� 靾� 鞛堨姷雼堧嫟.',
+        },
+        partialSucceeded: {
+          tip: '頂勲靹胳姢鞐� {{num}} 雲鸽摐臧� 牍勳爼靸侅爜鞙茧 鞁ろ枆 欷戩瀰雼堧嫟. 於旍爜鞙茧 鞚措彊頃橃棳 搿滉犯毳� 頇曥澑頃橃嫮鞁滌槫.',
+        },
+        title: '鞓る 觳橂Μ',
+        tip: '雲鸽摐鞐� 鞓堨櫢臧� 氚滌儩頃� 霑� 韸鸽Μ瓯半悩電� 鞓堨櫢 觳橂Μ 鞝勲灥鞛呺媹雼�.',
+      },
+      retry: {
+        retry: '鞛嫓霃�',
+        retryOnFailure: '鞁ろ尐 鞁� 鞛嫓霃�',
+        maxRetries: '斓滊寑 鞛嫓霃� 須熿垬',
+        retryInterval: '鞛嫓霃� 臧勱博',
+        retryTimes: '鞁ろ尐 鞁� {{times}}氩� 鞛嫓霃�',
+        retrying: '鞛嫓霃�...',
+        retrySuccessful: '鞛嫓霃� 靹标车',
+        retryFailed: '鞛嫓霃� 鞁ろ尐',
+        retryFailedTimes: '{{times}} 鞛嫓霃� 鞁ろ尐',
+        times: '氚�',
+        ms: '氙胳棎鞀�',
+        retries: '{{靾瀽}} 鞛嫓霃�',
+      },
+    },
+    start: {
+      required: '頃勳垬',
+      inputField: '鞛呺牓 頃勲摐',
+      builtInVar: '雮挫灔 氤�靾�',
+      outputVars: {
+        query: '靷毄鞛� 鞛呺牓',
+        memories: {
+          des: '雽�頇� 旮半',
+          type: '氅旍嫓歆� 鞙犿槙',
+          content: '氅旍嫓歆� 雮挫毄',
+        },
+        files: '韺岇澕 氇╇',
+      },
+      noVarTip: '鞗岉伂頂岆鞖办棎靹� 靷毄頃� 鞛呺牓鞚� 靹れ爼頃橃劯鞖�',
+    },
+    end: {
+      outputs: '於滊牓',
+      output: {
+        type: '於滊牓 鞙犿槙',
+        variable: '於滊牓 氤�靾�',
+      },
+      type: {
+        'none': '鞐嗢潓',
+        'plain-text': '鞚茧皹 韰嶌姢韸�',
+        'structured': '甑“頇旊悳',
+      },
+    },
+    answer: {
+      answer: '雼惦硛',
+      outputVars: '於滊牓 氤�靾�',
+    },
+    llm: {
+      model: '氇嵏',
+      variables: '氤�靾�',
+      context: '旎厤鞀ろ姼',
+      contextTooltip: '旎厤鞀ろ姼搿� 歆�鞁濎潉 臧�鞝胳槵 靾� 鞛堨姷雼堧嫟',
+      notSetContextInPromptTip: '旎厤鞀ろ姼 旮半姤鞚� 頇滌劚頇旐晿霠る┐ PROMPT鞐� 旎厤鞀ろ姼 氤�靾橂ゼ 鞛呺牓頃橃劯鞖�.',
+      prompt: '頂勲‖頂勴姼',
+      roleDescription: {
+        system: '雽�頇旊ゼ 鞙勴暅 瓿犼笁 歆�旃� 鞝滉车',
+        user: '氇嵏鞐� 歆�旃�, 歆堧 霕愲姅 韰嶌姢韸� 旮半皹 鞛呺牓 鞝滉车',
+        assistant: '靷毄鞛� 氅旍嫓歆�鞐� 旮半皹頃� 氇嵏鞚� 鞚戨嫷',
+      },
+      addMessage: '氅旍嫓歆� 於旉皜',
+      vision: '牍勳爠',
+      files: '韺岇澕',
+      resolution: {
+        name: '頃挫儊霃�',
+        high: '雴掛潓',
+        low: '雮潓',
+      },
+      outputVars: {
+        output: '靸濎劚霅� 雮挫毄',
+        usage: '氇嵏 靷毄 鞝曤炒',
+      },
+      singleRun: {
+        variable: '氤�靾�',
+      },
+      sysQueryInUser: '靷毄鞛� 氅旍嫓歆�鞐� sys.query臧� 頃勳殧頃╇媹雼�',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: '順勳灛 頃勲摐鞚� 韼胳鞚� 鞕勲頃� 頉� 鞀ろ偆毵堧ゼ 鞝�鞛ロ晿靹胳殧.',
+        },
+        generating: 'JSON 鞀ろ偆毵� 靸濎劚 欷�...',
+        apply: '歆�鞗愴晿雼�',
+        descriptionPlaceholder: '靹る獏鞚� 於旉皜頃橃劯鞖�.',
+        generate: '靸濎劚頃橂嫟',
+        generatedResult: '靸濎劚霅� 瓴瓣臣',
+        addField: '頃勲摐 於旉皜',
+        addChildField: '鞛愲厐 頃勲摐 於旉皜',
+        generateJsonSchema: 'JSON 鞀ろ偆毵� 靸濎劚',
+        fieldNamePlaceholder: '頃勲摐 鞚措',
+        back: '霋�',
+        instruction: '歆�旃�',
+        resetDefaults: '鞛劋鞝�',
+        promptTooltip: '韰嶌姢韸� 靹る獏鞚� 響滌頇旊悳 JSON 鞀ろ偆毵� 甑“搿� 氤�頇橅晿靹胳殧.',
+        title: '甑“頇旊悳 於滊牓 鞀ろ偆毵�',
+        stringValidations: '氍胳瀽鞐� 瓴�歃�',
+        showAdvancedOptions: '瓿犼笁 鞓奠厴 響滌嫓',
+        promptPlaceholder: '雼轨嫚鞚� JSON 鞀ろ偆毵堧ゼ 靹る獏頃橃劯鞖�...',
+        generationTip: '鞛愳棸鞏措ゼ 靷毄頃橃棳 JSON 鞀ろ偆毵堧ゼ 鞁犾啀頃橁矊 靸濎劚頃� 靾� 鞛堨姷雼堧嫟.',
+        resultTip: '鞐赴 靸濎劚霅� 瓴瓣臣臧� 鞛堨姷雼堧嫟. 毵岇暯 毵岇”頃橃 鞎婌溂鞁犽嫟氅�, 霃岇晞臧�靹� 頂勲‖頂勴姼毳� 靾橃爼頃� 靾� 鞛堨姷雼堧嫟.',
+        regenerate: '鞛儩頃橂嫟',
+        required: '頃勳垬',
+        doc: '甑“頇旊悳 於滊牓鞐� 雽�頃� 雿� 鞎岇晞氤挫劯鞖�.',
+        import: 'JSON鞐愳劀 臧�鞝胳槫旮�',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: '炜茧Μ 氤�靾�',
+      knowledge: '歆�鞁�',
+      outputVars: {
+        output: '氤店惮霅� 靹戈犯毹柬姼 雿办澊韯�',
+        content: '靹戈犯毹柬姼 雮挫毄',
+        title: '靹戈犯毹柬姼 鞝滊',
+        icon: '靹戈犯毹柬姼 鞎勳澊旖�',
+        url: '靹戈犯毹柬姼 URL',
+        metadata: '旮绊儉 氅旐儉雿办澊韯�',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            title: '鞛レ暊鞚�',
+            subTitle: '氅旐儉雿办澊韯� 頃勴劙毵侅潉 頇滌劚頇旐晿歆� 鞎婌潓',
+          },
+          automatic: {
+            desc: '炜茧Μ 氤�靾橂ゼ 旮半皹鞙茧 氅旐儉雿办澊韯� 頃勴劙毵� 臁瓣贝鞚� 鞛愲彊鞙茧 靸濎劚頃╇媹雼�.',
+            subTitle: '靷毄鞛� 炜茧Μ毳� 旮半皹鞙茧 氅旐儉雿办澊韯� 頃勴劙毵� 臁瓣贝鞚� 鞛愲彊鞙茧 靸濎劚頃╇媹雼�.',
+            title: '鞛愲彊',
+          },
+          manual: {
+            subTitle: '氅旐儉雿办澊韯� 頃勴劙毵� 臁瓣贝鞚� 靾橂彊鞙茧 於旉皜頃╇媹雼�.',
+            title: '靾橂彊',
+          },
+        },
+        panel: {
+          title: '氅旐儉雿办澊韯� 頃勴劙 臁瓣贝',
+          placeholder: '臧掛潉 鞛呺牓頃橃劯鞖�',
+          add: '臁瓣贝 於旉皜',
+          search: '氅旐儉雿办澊韯� 瓴�靸�',
+          datePlaceholder: '鞁滉皠鞚� 靹犿儩頃橃劯鞖�...',
+          select: '氤�靾� 靹犿儩...',
+          conditions: '臁瓣贝',
+        },
+        title: '氅旐儉雿办澊韯� 頃勴劙毵�',
+      },
+    },
+    http: {
+      inputVars: '鞛呺牓 氤�靾�',
+      api: 'API',
+      apiPlaceholder: 'URL鞚� 鞛呺牓頃橃劯鞖�, 氤�靾橂ゼ 靷届瀰頃橂牑氅� 鈥�/鈥欕ゼ 鞛呺牓頃橃劯鞖�',
+      notStartWithHttp: 'API電� http:// 霕愲姅 https://搿� 鞁滌瀾頃挫暭 頃╇媹雼�',
+      key: '韨�',
+      value: '臧�',
+      bulkEdit: '鞚缄磩 韼胳',
+      keyValueEdit: '韨�-臧� 韼胳',
+      headers: '項る崝',
+      params: '毵り皽氤�靾�',
+      body: '氤鸽',
+      outputVars: {
+        body: '鞚戨嫷 雮挫毄',
+        statusCode: '鞚戨嫷 靸來儨 旖旊摐',
+        headers: '鞚戨嫷 項る崝 氇╇ JSON',
+        files: '韺岇澕 氇╇',
+      },
+      authorization: {
+        'authorization': '甓岉暅 攵�鞐�',
+        'authorizationType': '甓岉暅 攵�鞐� 鞙犿槙',
+        'no-auth': '鞐嗢潓',
+        'api-key': 'API 韨�',
+        'auth-type': '鞚胳 鞙犿槙',
+        'basic': '旮半掣',
+        'bearer': 'Bearer',
+        'custom': '靷毄鞛� 鞝曥潣',
+        'api-key-title': 'API 韨�',
+        'header': '項る崝',
+      },
+      insertVarPlaceholder: '氤�靾橂ゼ 靷届瀰頃橂牑氅� \'/\'毳� 鞛呺牓頃橃劯鞖�',
+      timeout: {
+        title: '鞁滉皠 齑堦臣',
+        connectLabel: '鞐瓣舶 鞁滉皠 齑堦臣',
+        connectPlaceholder: '齑� 雼渼搿� 鞐瓣舶 鞁滉皠 齑堦臣 鞛呺牓',
+        readLabel: '鞚疥赴 鞁滉皠 齑堦臣',
+        readPlaceholder: '齑� 雼渼搿� 鞚疥赴 鞁滉皠 齑堦臣 鞛呺牓',
+        writeLabel: '鞊瓣赴 鞁滉皠 齑堦臣',
+        writePlaceholder: '齑� 雼渼搿� 鞊瓣赴 鞁滉皠 齑堦臣 鞛呺牓',
+      },
+      type: '順�',
+      binaryFileVariable: '氚旍澊雱堧Μ 韺岇澕 氤�靾�',
+      extractListPlaceholder: '氇╇ 頃 鞚鸽嵄鞀� 鞛呺牓, \'/\' 氤�靾� 靷届瀰',
+      curl: {
+        title: 'cURL鞐愳劀 臧�鞝胳槫旮�',
+        placeholder: '鞐赴鞐� cURL 氍胳瀽鞐� 攵欖棳 雱j赴',
+      },
+    },
+    code: {
+      inputVars: '鞛呺牓 氤�靾�',
+      outputVars: '於滊牓 氤�靾�',
+      advancedDependencies: '瓿犼笁 膦呾啀靹�',
+      advancedDependenciesTip: '雿� 毵庫潃 鞁滉皠鞚� 靻岇殧霅橁卑雮� 旮半掣鞙茧 雮挫灔霅橃 鞎婌潃 鞚茧秬 氙鸽Μ 搿滊摐霅� 膦呾啀靹膘潉 鞐赴鞐� 於旉皜頃橃劯鞖�',
+      searchDependencies: '膦呾啀靹� 瓴�靸�',
+    },
+    templateTransform: {
+      inputVars: '鞛呺牓 氤�靾�',
+      code: '旖旊摐',
+      codeSupportTip: 'Jinja2毵� 歆�鞗愴暕雼堧嫟',
+      outputVars: {
+        output: '氤�頇橂悳 雮挫毄',
+      },
+    },
+    ifElse: {
+      if: 'If',
+      else: 'Else',
+      elseDescription: 'If 臁瓣贝鞚� 於╈”霅橃 鞎婌潉 霑� 鞁ろ枆頃� 雲茧Μ毳� 鞝曥潣頃橂姅 雿� 靷毄霅╇媹雼�.',
+      and: '攴鸽Μ瓿�',
+      or: '霕愲姅',
+      operator: '鞐办偘鞛�',
+      notSetVariable: '毹检爛 氤�靾橂ゼ 靹れ爼頃橃劯鞖�',
+      comparisonOperator: {
+        'contains': '韽暔',
+        'not contains': '韽暔頃橃 鞎婌潓',
+        'start with': '鞁滌瀾',
+        'end with': '雭�',
+        'is': '鞚措嫟',
+        'is not': '鞎勲媹雼�',
+        'empty': '牍勳柎 鞛堨潓',
+        'not empty': '牍勳柎 鞛堨 鞎婌潓',
+        'null': 'null鞛�',
+        'not null': 'null鞚� 鞎勲嫎',
+        'regex match': '鞝曣窚鞁� 鞚检箻',
+        'in': '鞎堨溂搿�',
+        'exists': '臁挫灛',
+        'all of': '氇憪鞚�',
+        'not in': '鞐� 鞐嗢潓',
+        'not exists': '臁挫灛頃橃 鞎婌潓',
+        'after': '頉勳棎',
+        'before': '鞝勳棎',
+      },
+      enterValue: '臧� 鞛呺牓',
+      addCondition: '臁瓣贝 於旉皜',
+      conditionNotSetup: '臁瓣贝鞚� 靹れ爼霅橃 鞎婌潓',
+      selectVariable: '氤�靾� 靹犿儩...',
+      optionName: {
+        localUpload: '搿滌滑 鞐呺霌�',
+        video: '牍勲敂鞓�',
+        image: '鞚措歆�',
+        audio: '鞓る敂鞓�',
+        url: 'URL (鞓侂)',
+        doc: '氍胳劀',
+      },
+      select: '瓿犽ゴ雼�',
+      addSubVariable: '頃橃渼 氤�靾�',
+      condition: '臁瓣贝',
+    },
+    variableAssigner: {
+      title: '氤�靾� 頃犽嫻',
+      outputType: '於滊牓 鞙犿槙',
+      varNotSet: '氤�靾橁皜 靹れ爼霅橃 鞎婌潓',
+      noVarTip: '頃犽嫻頃� 氤�靾橂ゼ 於旉皜頃橃劯鞖�',
+      type: {
+        string: '氍胳瀽鞐�',
+        number: '靾瀽',
+        object: '臧濎泊',
+        array: '氚办棿',
+      },
+      aggregationGroup: '歆戧硠 攴鸽9',
+      aggregationGroupTip: '鞚� 旮半姤鞚� 頇滌劚頇旐晿氅� 氤�靾� 歆戧硠鞛愱皜 鞐煬 氤�靾� 歆戫暕鞚� 歆戧硠頃� 靾� 鞛堨姷雼堧嫟.',
+      addGroup: '攴鸽9 於旉皜',
+      outputVars: {
+        varDescribe: '{{groupName}} 於滊牓',
+      },
+      setAssignVariable: '頃犽嫻 氤�靾� 靹れ爼',
+    },
+    assigner: {
+      'assignedVariable': '頃犽嫻霅� 氤�靾�',
+      'writeMode': '鞊瓣赴 氇摐',
+      'writeModeTip': '頃犽嫻霅� 氤�靾橁皜 氚办棿鞚� 霑�, 於旉皜 氇摐電� 雭濎棎 於旉皜頃╇媹雼�.',
+      'over-write': '雿柎鞊瓣赴',
+      'append': '於旉皜',
+      'plus': '雿旐晿旮�',
+      'clear': '歆�鞖瓣赴',
+      'setVariable': '氤�靾� 靹れ爼',
+      'variable': '氤�靾�',
+      'operations': {
+        '*=': '*=',
+        'overwrite': '雿柎鞊瓣赴',
+        '-=': '-=',
+        'append': '於旉皜',
+        'over-write': '雿柎鞊瓣赴',
+        '+=': '+=',
+        'title': '臁办瀾',
+        'extend': '鞐办灔',
+        'clear': '齑堦赴頇�',
+        '/=': '/=',
+        'set': '靹れ爼',
+        'remove-first': '觳� 氩堨Ц 鞝滉卑',
+        'remove-last': '毵堨毵� 鞝滉卑',
+      },
+      'variables': '氤�靾�',
+      'noAssignedVars': '靷毄 臧�電ロ暅 頃犽嫻霅� 氤�靾橁皜 鞐嗢姷雼堧嫟.',
+      'noVarTip': '"+" 氩勴娂鞚� 韥措Ν頃橃棳 氤�靾橂ゼ 於旉皜頃╇媹雼�.',
+      'setParameter': '毵り皽 氤�靾� 靹れ爼...',
+      'assignedVarsDescription': '頃犽嫻霅� 氤�靾橂姅 雽�頇� 氤�靾橃檧 臧欖潃 鞊瓣赴 臧�電ロ暅 氤�靾橃棳鞎� 頃╇媹雼�.',
+      'selectAssignedVariable': '頃犽嫻霅� 氤�靾� 靹犿儩...',
+      'varNotSet': '氤�靾橁皜 靹れ爼霅橃 鞎婌潓',
+    },
+    tool: {
+      toAuthorize: '鞀轨澑頃橁赴',
+      inputVars: '鞛呺牓 氤�靾�',
+      outputVars: {
+        text: '霃勱惮臧� 靸濎劚頃� 雮挫毄',
+        files: {
+          title: '霃勱惮臧� 靸濎劚頃� 韺岇澕',
+          type: '歆�鞗� 鞙犿槙. 順勳灛電� 鞚措歆�毵� 歆�鞗愴暕雼堧嫟',
+          transfer_method: '鞝勳啞 氚╇矔. 臧掛潃 remote_url 霕愲姅 local_file',
+          url: '鞚措歆� URL',
+          upload_file_id: '鞐呺霌滊悳 韺岇澕 ID',
+        },
+        json: '霃勱惮搿� 靸濎劚霅� JSON',
+      },
+    },
+    questionClassifiers: {
+      model: '氇嵏',
+      inputVars: '鞛呺牓 氤�靾�',
+      outputVars: {
+        className: '韥措灅鞀� 鞚措',
+      },
+      class: '韥措灅鞀�',
+      classNamePlaceholder: '韥措灅鞀� 鞚措鞚� 鞛戩劚頃橃劯鞖�',
+      advancedSetting: '瓿犼笁 靹れ爼',
+      topicName: '欤检牅 鞚措',
+      topicPlaceholder: '欤检牅 鞚措鞚� 鞛戩劚頃橃劯鞖�',
+      addClass: '韥措灅鞀� 於旉皜',
+      instruction: '歆�鞁�',
+      instructionTip: '歆堧 攵勲旮瓣皜 歆堧鞚� 雿� 鞛� 攵勲頃� 靾� 鞛堧弰搿� 於旉皜 歆�鞁滊ゼ 鞛呺牓頃橃劯鞖�.',
+      instructionPlaceholder: '歆�鞁滊ゼ 鞛戩劚頃橃劯鞖�',
+    },
+    parameterExtractor: {
+      inputVar: '鞛呺牓 氤�靾�',
+      extractParameters: '毵り皽氤�靾� 於旍稖',
+      importFromTool: '霃勱惮鞐愳劀 臧�鞝胳槫旮�',
+      addExtractParameter: '於旍稖 毵り皽氤�靾� 於旉皜',
+      addExtractParameterContent: {
+        name: '鞚措',
+        namePlaceholder: '於旍稖 毵り皽氤�靾� 鞚措',
+        type: '鞙犿槙',
+        typePlaceholder: '於旍稖 毵り皽氤�靾� 鞙犿槙',
+        description: '靹る獏',
+        descriptionPlaceholder: '於旍稖 毵り皽氤�靾� 靹る獏',
+        required: '頃勳垬',
+        requiredContent: '頃勳垬電� 氇嵏 於旊鞚� 鞙勴暅 彀戈碃 鞖╇弰搿滊 靷毄霅橂┌, 毵り皽氤�靾� 於滊牓鞚� 頃勳垬 鞙犿毃靹� 瓴�靷姅 鞎勲嫏雼堧嫟.',
+      },
+      extractParametersNotSet: '於旍稖 毵り皽氤�靾橁皜 靹れ爼霅橃 鞎婌潓',
+      instruction: '歆�鞁�',
+      instructionTip: '毵り皽氤�靾� 於旍稖旮瓣皜 毵り皽氤�靾橂ゼ 於旍稖頃橂姅 氚╇矔鞚� 鞚错暣頃橂姅 雿� 霃勳泙鞚� 霅橂姅 於旉皜 歆�鞁滊ゼ 鞛呺牓頃橃劯鞖�.',
+      advancedSetting: '瓿犼笁 靹れ爼',
+      reasoningMode: '於旊 氇摐',
+      reasoningModeTip: '氇嵏鞚� 頃垬 順胳稖 霕愲姅 頂勲‖頂勴姼鞐� 雽�頃� 歆�鞁� 鞚戨嫷 電ル牓鞚� 旮半皹鞙茧 鞝侅爤頃� 於旊 氇摐毳� 靹犿儩頃� 靾� 鞛堨姷雼堧嫟.',
+      isSuccess: '靹标车 鞐秬. 靹标车 鞁� 臧掛潃 1鞚搓碃, 鞁ろ尐 鞁� 臧掛潃 0鞛呺媹雼�.',
+      errorReason: '鞓る 鞗愳澑',
+    },
+    iteration: {
+      deleteTitle: '氚橂车 雲鸽摐毳� 靷牅頃橃嫓瓴犾姷雼堦箤?',
+      deleteDesc: '氚橂车 雲鸽摐毳� 靷牅頃橂┐ 氇摖 頃橃渼 雲鸽摐臧� 靷牅霅╇媹雼�',
+      input: '鞛呺牓',
+      output: '於滊牓 氤�靾�',
+      iteration_one: '{{count}} 氚橂车',
+      iteration_other: '{{count}} 氚橂车',
+      currentIteration: '順勳灛 氚橂车',
+      ErrorMethod: {
+        operationTerminated: '膦呺',
+        continueOnError: '鞓る 氚滌儩 鞁� 瓿勳啀',
+        removeAbnormalOutput: '牍勳爼靸� 於滊牓 鞝滉卑',
+      },
+      comma: ',',
+      error_one: '{{臧滌垬}} 鞓る',
+      parallelMode: '氤戨牞 氇摐',
+      errorResponseMethod: '鞓る 鞚戨嫷 氚╇矔',
+      parallelModeUpper: '氤戨牞 氇摐',
+      MaxParallelismTitle: '斓滊寑 氤戨牞 觳橂Μ',
+      error_other: '{{臧滌垬}} 鞓る',
+      parallelModeEnableTitle: 'Parallel Mode Enabled(氤戨牞 氇摐 靷毄)',
+      parallelPanelDesc: '氤戨牞 氇摐鞐愳劀 氚橂车鞚� 鞛戩梾鞚� 氤戨牞 鞁ろ枆鞚� 歆�鞗愴暕雼堧嫟.',
+      parallelModeEnableDesc: '氤戨牞 氇摐鞐愳劀電� 氚橂车 雮挫潣 鞛戩梾鞚� 氤戨牞 鞁ろ枆鞚� 歆�鞗愴暕雼堧嫟. 鞓るジ飒届潣 靻嶌劚 韺剱鞐愳劀 鞚措ゼ 甑劚頃� 靾� 鞛堨姷雼堧嫟.',
+      MaxParallelismDesc: '斓滊寑 氤戨牞 觳橂Μ電� 雼澕 氚橂车鞐愳劀 霃欖嫓鞐� 鞁ろ枆霅橂姅 鞛戩梾 靾橂ゼ 鞝滌柎頃橂姅 雿� 靷毄霅╇媹雼�.',
+      answerNodeWarningDesc: '氤戨牞 氇摐 瓴疥碃: 鞚戨嫷 雲鸽摐, 雽�頇� 氤�靾� 頃犽嫻 氚� 氚橂车 雮挫潣 歆�靻嶌爜鞚� 鞚疥赴/鞊瓣赴 鞛戩梾鞙茧 鞚疙暣 鞓堨櫢臧� 氚滌儩頃� 靾� 鞛堨姷雼堧嫟.',
+    },
+    note: {
+      editor: {
+        medium: '氤错喌',
+        showAuthor: '鞛戩劚鞛� 響滌嫓',
+        link: '毵來伂',
+        unlink: '頃挫牅',
+        small: '鞛戨嫟',
+        large: '韥�',
+        placeholder: '氅旊 鞊瓣赴...',
+        bold: '雽�雼错暅',
+        enterUrl: 'URL 鞛呺牓...',
+        openLink: '鞐措嫟',
+        italic: '鞚错儰毽泊',
+        invalidUrl: '鞛橂霅� URL',
+        strikethrough: '旆唽靹�',
+        bulletList: '旮�毹鸽Μ 旮绊樃 氇╇',
+      },
+      addNote: '氅旊 於旉皜',
+    },
+    docExtractor: {
+      outputVars: {
+        text: '於旍稖霅� 韰嶌姢韸�',
+      },
+      learnMore: '雿� 鞎岇晞氤挫劯鞖�',
+      inputVar: '鞛呺牓 氤�靾�',
+      supportFileTypes: '歆�鞗� 韺岇澕 順曥嫕: {{types}}.',
+    },
+    listFilter: {
+      outputVars: {
+        result: '頃勴劙 瓴瓣臣',
+        last_record: '毵堨毵� 霠堨綌霌�',
+        first_record: '觳� 氩堨Ц 霠堨綌霌�',
+      },
+      asc: '歃濌秾 鞁滌劯 響滌嫓旮�',
+      filterConditionKey: '頃勴劙 臁瓣贝 韨�',
+      limit: '韱� N',
+      filterConditionComparisonValue: '頃勴劙 臁瓣贝 臧�',
+      filterCondition: '頃勴劙 臁瓣贝',
+      inputVar: '鞛呺牓 氤�靾�',
+      desc: '靹る獏',
+      orderBy: '鞝曤牞 旮办',
+      selectVariableKeyPlaceholder: '頃橃渼 氤�靾� 韨� 靹犿儩',
+      filterConditionComparisonOperator: '頃勴劙 臁瓣贝 牍勱祼 鞐办偘鞛�',
+      extractsCondition: 'N 頃鞚� 於旍稖頃╇媹雼�.',
+    },
+    agent: {
+      strategy: {
+        label: '鞐愳澊鞝勴姼 鞝勲灥',
+        tooltip: '雼れ枒頃� 鞐愳澊鞝勴姼 鞝勲灥鞚� 鞁滌姢韰滌澊 雼る嫧瓿� 霃勱惮 順胳稖鞚� 瓿勴殟頃橁碃 鞁ろ枆頃橂姅 氚╇矔鞚� 瓴办爼頃╇媹雼�',
+        configureTip: '鞐愳澊鞝勴姼 鞝勲灥鞚� 甑劚頃橃劯鞖�.',
+        searchPlaceholder: '瓴�靸� 鞐愳澊鞝勴姼 鞝勲灥',
+        shortLabel: '鞝勲灥',
+        selectTip: '鞐愳澊鞝勴姼 鞝勲灥 靹犿儩',
+        configureTipDesc: '鞐愳澊鞝勴姼 鞝勲灥鞚� 甑劚頃� 頉� 鞚� 雲鸽摐電� 雮橂ǜ歆� 甑劚鞚� 鞛愲彊鞙茧 搿滊摐頃╇媹雼�. 鞚� 鞝勲灥鞚� 雼る嫧瓿� 霃勱惮 於旊鞚� 氅旍护雼堨鞐� 鞓來枼鞚� 氙胳供雼堧嫟.',
+      },
+      pluginInstaller: {
+        install: '靹れ箻頃橂嫟',
+        installing: '靹れ箻',
+      },
+      modelNotInMarketplace: {
+        desc: '鞚� 氇嵏鞚� 搿滌滑 霕愲姅 GitHub 毽彫歆�韱犽Μ鞐愳劀 靹れ箻霅╇媹雼�. 靹れ箻 頉� 靷毄頃橃嫮鞁滌槫.',
+        title: '氇嵏鞚� 靹れ箻霅橃 鞎婌潓',
+        manageInPlugins: '頂岆煬攴胳澑鞐愳劀 甏�毽�',
+      },
+      modelNotSupport: {
+        title: '歆�鞗愲悩歆� 鞎婋姅 氇嵏',
+        descForVersionSwitch: '靹れ箻霅� 頂岆煬攴胳澑 氩勳爠鞚� 鞚� 氇嵏鞚� 鞝滉车頃橃 鞎婌姷雼堧嫟. 氩勳爠鞚� 鞝勴櫂頃橂牑氅� 韥措Ν頃╇媹雼�.',
+        desc: '靹れ箻霅� 頂岆煬攴胳澑 氩勳爠鞚� 鞚� 氇嵏鞚� 鞝滉车頃橃 鞎婌姷雼堧嫟.',
+      },
+      modelSelectorTooltips: {
+        deprecated: '鞚� 氇嵏鞚� 雿� 鞚挫儊 靷毄霅橃 鞎婌姷雼堧嫟.',
+      },
+      outputVars: {
+        files: {
+          url: '鞚措歆� URL',
+          upload_file_id: '韺岇澕 ID 鞐呺霌�',
+          transfer_method: '鞝勳啞 氚╇矔. 臧掛澊 remote_url 霕愲姅 local_file鞛呺媹雼�.',
+          type: '歆�鞗� 鞙犿槙. 鞚挫牅 鞚措歆�毵� 歆�鞗愴暕雼堧嫟.',
+          title: '鞐愳澊鞝勴姼 靸濎劚 韺岇澕',
+        },
+        json: '鞐愳澊鞝勴姼 靸濎劚 JSON',
+        text: '靸侂嫶鞗愳澊 靸濎劚頃� 旖橅厫旄�',
+      },
+      checkList: {
+        strategyNotSelected: '鞝勲灥鞚� 靹犿儩霅橃 鞎婌潓',
+      },
+      installPlugin: {
+        changelog: '氤�瓴� 搿滉犯',
+        install: '靹れ箻頃橂嫟',
+        desc: '雼れ潓 頂岆煬攴胳澑鞚� 靹れ箻頃橂牑瓿� 頃╇媹雼�.',
+        cancel: '旆唽',
+        title: '頂岆煬攴胳澑 靹れ箻',
+      },
+      strategyNotFoundDescAndSwitchVersion: '靹れ箻霅� 頂岆煬攴胳澑 氩勳爠鞚� 鞚� 鞝勲灥鞚� 鞝滉车頃橃 鞎婌姷雼堧嫟. 氩勳爠鞚� 鞝勴櫂頃橂牑氅� 韥措Ν頃╇媹雼�.',
+      learnMore: '雿� 鞎岇晞氤挫劯鞖�',
+      toolNotAuthorizedTooltip: '{{霃勱惮}} 甓岉暅鞚� 攵�鞐悩歆� 鞎婌潓',
+      strategyNotFoundDesc: '靹れ箻霅� 頂岆煬攴胳澑 氩勳爠鞚� 鞚� 鞝勲灥鞚� 鞝滉车頃橃 鞎婌姷雼堧嫟.',
+      maxIterations: '斓滊寑 氚橂车 須熿垬',
+      pluginNotFoundDesc: '鞚� 頂岆煬攴胳澑鞚� GitHub鞐愳劀 靹れ箻霅╇媹雼�. 頂岆煬攴胳澑鞙茧 鞚措彊頃橃棳 雼れ嫓 靹れ箻頃橃嫮鞁滌槫.',
+      pluginNotInstalledDesc: '鞚� 頂岆煬攴胳澑鞚� GitHub鞐愳劀 靹れ箻霅╇媹雼�. 頂岆煬攴胳澑鞙茧 鞚措彊頃橃棳 雼れ嫓 靹れ箻頃橃嫮鞁滌槫.',
+      strategyNotInstallTooltip: '{{strategy}}臧� 靹れ箻霅橃 鞎婌晿鞀惦媹雼�.',
+      tools: '霃勱惮',
+      unsupportedStrategy: '歆�鞗愲悩歆� 鞎婋姅 鞝勲灥',
+      pluginNotInstalled: '鞚� 頂岆煬攴胳澑鞚� 靹れ箻霅橃柎 鞛堨 鞎婌姷雼堧嫟.',
+      toolNotInstallTooltip: '{{tool}}鞚� 靹れ箻霅橃 鞎婌晿鞀惦媹雼�.',
+      configureModel: '氇嵏 甑劚',
+      strategyNotSet: '鞐愳澊鞝勴姼 鞝勲灥鞚� 靹れ爼霅橃 鞎婌潓',
+      modelNotInstallTooltip: '鞚� 氇嵏鞚� 靹れ箻霅橃 鞎婌晿鞀惦媹雼�.',
+      model: '氇嵏',
+      notAuthorized: '甓岉暅鞚� 攵�鞐悩歆� 鞎婌潓',
+      modelNotSelected: '氇嵏鞚� 靹犿儩霅橃 鞎婌潓',
+      toolbox: '霃勱惮',
+      linkToPlugin: '頂岆煬攴胳澑鞐� 雽�頃� 毵來伂',
+    },
+    loop: {
+      ErrorMethod: {
+        removeAbnormalOutput: '牍勳爼靸侅爜鞚� 於滊牓鞚� 鞝滉卑頃橃劯鞖�.',
+        operationTerminated: '膦呺霅�',
+        continueOnError: '鞓る臧� 氚滌儩頃措弰 瓿勳啀 歆勴枆頃橃劯鞖�.',
+      },
+      currentLoop: '順勳灛 耄攧',
+      loopMaxCount: '斓滊寑 耄攧 靾�',
+      input: '鞛呺牓',
+      error_other: '{{count}} 鞓る',
+      comma: ',',
+      loop_one: '{{count}} 耄攧',
+      loop_other: '{{count}} 耄攧',
+      breakCondition: '耄攧 膦呺 臁瓣贝',
+      output: '於滊牓 氤�靾�',
+      error_one: '{{count}} 鞐愲煬',
+      deleteTitle: '耄攧 雲鸽摐毳� 靷牅頃橃嫓瓴犾姷雼堦箤?',
+      deleteDesc: '耄攧 雲鸽摐毳� 靷牅頃橂┐ 氇摖 鞛愳嫕 雲鸽摐臧� 鞝滉卑霅╇媹雼�.',
+      errorResponseMethod: '鞓る 鞚戨嫷 氚╇矔',
+      exitConditionTip: '耄攧 雲鸽摐電� 斓滌唽頃� 頃橂倶鞚� 膦呺 臁瓣贝鞚� 頃勳殧頃╇媹雼�.',
+      finalLoopVariables: '斓滌 耄攧 氤�靾�',
+      loopVariables: '耄攧 氤�靾�',
+      setLoopVariables: '耄攧 氩旍渼 雮挫棎靹� 氤�靾橂ゼ 靹れ爼頃╇媹雼�.',
+      initialLoopVariables: '齑堦赴 耄攧 氤�靾�',
+      breakConditionTip: '膦呺 臁瓣贝瓿� 雽�頇� 氤�靾橁皜 鞛堧姅 耄攧 雮挫棎靹滊 氤�靾橂ゼ 彀胳“頃� 靾� 鞛堨姷雼堧嫟.',
+      currentLoopCount: '順勳灛 耄攧 旃挫毚韸�: {{count}}',
+      loopMaxCountError: '鞙犿毃頃� 斓滊寑 耄攧 靾橂ゼ 鞛呺牓頃橃嫮鞁滌槫. 氩旍渼電� 1鞐愳劀 {{maxCount}}鞛呺媹雼�.',
+      totalLoopCount: '齑� 耄攧 須熿垬: {{count}}',
+      variableName: '氤�靾� 鞚措',
+      loopNode: '耄攧 雲鸽摐',
+      inputMode: '鞛呺牓 氇摐',
+    },
+  },
+  tracing: {
+    stopBy: '{{user}}鞐� 鞚橅暣 欷戩霅�',
+  },
+  variableReference: {
+    noAvailableVars: '靷毄 臧�電ロ暅 氤�靾� 鞐嗢潓',
+    conversationVars: '雽�頇� 氤�靾�',
+    noVarsForOperation: '靹犿儩頃� 鞛戩梾鞐� 頃犽嫻頃� 靾� 鞛堧姅 氤�靾橁皜 鞐嗢姷雼堧嫟.',
+    noAssignedVars: '靷毄 臧�電ロ暅 頃犽嫻霅� 氤�靾橁皜 鞐嗢姷雼堧嫟.',
+    assignedVarsDescription: '頃犽嫻霅� 氤�靾橂姅 雼れ潓瓿� 臧欖澊 鞊瓣赴 臧�電ロ暅 氤�靾橃棳鞎� 頃╇媹雼�.',
+  },
+  versionHistory: {
+    filter: {
+      onlyYours: '鞓れ 雱堨潣 瓴冸',
+      all: '氇摖',
+      reset: '頃勴劙 鞛劋鞝�',
+      onlyShowNamedVersions: '鞚措鞚� 攵欖潃 氩勳爠毵� 響滌嫓',
+      empty: '鞚检箻頃橂姅 氩勳爠 旮半鞚� 鞐嗢姷雼堧嫟.',
+    },
+    editField: {
+      titleLengthLimit: '鞝滊鞚� {{limit}}鞛愲ゼ 齑堦臣頃� 靾� 鞐嗢姷雼堧嫟.',
+      title: '鞝滊',
+      releaseNotes: '毽措Μ鞀� 雲疙姼',
+      releaseNotesLengthLimit: '毽措Μ鞀� 雲疙姼電� {{limit}}鞛愲ゼ 齑堦臣頃� 靾� 鞐嗢姷雼堧嫟.',
+    },
+    action: {
+      updateFailure: '氩勳爠 鞐呺嵃鞚错姼鞐� 鞁ろ尐頄堨姷雼堧嫟.',
+      restoreSuccess: '氤奠洂霅� 氩勳爠',
+      deleteSuccess: '氩勳爠 靷牅霅�',
+      restoreFailure: '氩勳爠鞚� 氤奠洂頃橃 氇豁枅鞀惦媹雼�.',
+      deleteFailure: '氩勳爠鞚� 靷牅頃橃 氇豁枅鞀惦媹雼�.',
+      updateSuccess: '氩勳爠鞚� 鞐呺嵃鞚错姼霅橃棃鞀惦媹雼�.',
+    },
+    editVersionInfo: '氩勳爠 鞝曤炒 韼胳',
+    latest: '斓滌嫚',
+    currentDraft: '順勳灛 齑堨晥',
+    releaseNotesPlaceholder: '氤�瓴诫悳 雮挫毄鞚� 靹る獏頃橃劯鞖�.',
+    defaultName: '鞝滊 鞐嗠姅 氩勳爠',
+    nameThisVersion: '鞚� 氩勳爠鞚� 鞚措鞚� 歆�鞏挫<靹胳殧',
+    title: '氩勳爠霌�',
+    deletionTip: '靷牅電� 霅橂弻毽� 靾� 鞐嗢溂雼�, 頇曥澑頃� 欤检嫓旮� 氚旊瀺雼堧嫟.',
+    restorationTip: '氩勳爠 氤奠洂 頉� 順勳灛 齑堨晥鞚� 雿柎鞊办棳歆� 瓴冹瀰雼堧嫟.',
+  },
+}
+
+export default translation
diff --git a/i18n/language.ts b/i18n/language.ts
new file mode 100644
index 0000000..87027a7
--- /dev/null
+++ b/i18n/language.ts
@@ -0,0 +1,114 @@
+import data from './languages.json'
+export type Item = {
+  value: number | string
+  name: string
+  example: string
+}
+
+export type I18nText = {
+  'en-US': string
+  'zh-Hans': string
+  'pt-BR': string
+  'es-ES': string
+  'fr-FR': string
+  'de-DE': string
+  'ja-JP': string
+  'ko-KR': string
+  'ru-RU': string
+  'it-IT': string
+  'uk-UA': string
+  'vi-VN': string
+  'de_DE': string
+  'zh_Hant': string
+  'ro-RO': string
+  'pl-PL': string
+  'hi-IN': string
+  'fa-IR': string
+  'sl-SI': string
+  'th-TH': string
+}
+
+export const languages = data.languages
+
+export const LanguagesSupported = languages.filter(item => item.supported).map(item => item.value)
+
+export const getLanguage = (locale: string) => {
+  if (['zh-Hans', 'ja-JP'].includes(locale))
+    return locale.replace('-', '_')
+
+  return LanguagesSupported[0].replace('-', '_')
+}
+
+const DOC_LANGUAGE: Record<string, string> = {
+  'zh-Hans': 'zh-hans',
+  'ja-JP': 'ja-jp',
+  'en-US': 'en',
+}
+
+export const getDocLanguage = (locale: string) => {
+  return DOC_LANGUAGE[locale] || 'en'
+}
+
+const PRICING_PAGE_LANGUAGE: Record<string, string> = {
+  'ja-JP': 'jp',
+}
+
+export const getPricingPageLanguage = (locale: string) => {
+  return PRICING_PAGE_LANGUAGE[locale] || ''
+}
+
+export const NOTICE_I18N = {
+  title: {
+    en_US: 'Important Notice',
+    zh_Hans: '閲嶈鍏憡',
+    pt_BR: 'Aviso Importante',
+    es_ES: 'Aviso Importante',
+    fr_FR: 'Avis important',
+    de_DE: 'Wichtiger Hinweis',
+    ja_JP: '閲嶈銇亰鐭ャ倝銇�',
+    ko_KR: '欷戩殧 瓿奠',
+    pl_PL: 'Wa偶ne og艂oszenie',
+    uk_UA: '袙邪卸谢懈胁械 锌芯胁褨写芯屑谢械薪薪褟',
+    ru_RU: '袙邪卸薪芯械 校胁械写芯屑谢械薪懈械',
+    vi_VN: 'Th么ng b谩o quan tr峄峮g',
+    it_IT: 'Avviso Importante',
+    fa_IR: '賴卮丿丕乇 賲賴賲',
+    sl_SI: 'Pomembno obvestilo',
+    th_TH: '喔涏福喔班竵喔侧辅喔赋喔勦副喔�',
+  },
+  desc: {
+    en_US:
+      'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
+    zh_Hans:
+      '涓轰簡鏈夋晥鎻愬崌鏁版嵁妫�绱㈣兘鍔涘強绋冲畾鎬э紝Dify 灏嗕簬 2023 骞� 8 鏈� 29 鏃� 03:00 鑷� 08:00 鏈熼棿杩涜鏈嶅姟鍗囩骇锛屽眾鏃� Dify 浜戠鐗堝強搴旂敤灏嗘棤娉曡闂�傛劅璋㈡偍鐨勮�愬績涓庢敮鎸併��',
+    pt_BR:
+      'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
+    es_ES:
+      'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
+    fr_FR:
+      'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
+    de_DE:
+      'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
+    ja_JP:
+      'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.',
+    ko_KR:
+      '鞁滌姢韰滌澊 鞐呹犯霠堨澊霌滊ゼ 鞙勴暣 UTC 鞁滉皠雽�搿� 8鞗� 28鞚� 19:00 ~ 24:00鞐� 靷毄 攵堦皜霅� 鞓堨爼鞛呺媹雼�. 歆堧鞚� 鞛堨溂鞁滊┐ 歆�鞗� 韺�鞐� 鞐半澖欤检劯鞖� (support@dify.ai). 斓滌劆鞚� 雼ろ暣 雼惦硛頃措摐毽矤鞀惦媹雼�.',
+    pl_PL:
+      'Nasz system b臋dzie niedost臋pny od 19:00 do 24:00 UTC 28 sierpnia w celu aktualizacji. W przypadku pyta艅 prosimy o kontakt z naszym zespo艂em wsparcia (support@dify.ai). Doceniamy Twoj膮 cierpliwo艣膰.',
+    uk_UA:
+      '袧邪褕邪 褋懈褋褌械屑邪 斜褍写械 薪械写芯褋褌褍锌薪邪 蟹 19:00 写芯 24:00 UTC 28 褋械褉锌薪褟 写谢褟 芯薪芯胁谢械薪薪褟. 携泻褖芯 褍 胁邪褋 胁懈薪懈泻薪褍褌褜 蟹邪锌懈褌邪薪薪褟, 斜褍写褜 谢邪褋泻邪, 蟹胁鈥櫻徯堆栄傃屟佈� 蟹 薪邪褕芯褞 褋谢褍卸斜芯褞 锌褨写褌褉懈屑泻懈 (support@dify.ai). 袛褟泻褍褦屑芯 蟹邪 褌械褉锌褨薪薪褟.',
+    ru_RU:
+      '袧邪褕邪 褋懈褋褌械屑邪 斜褍写械褌 薪械写芯褋褌褍锌薪邪 褋 19:00 写芯 24:00 UTC 28 邪胁谐褍褋褌邪 写谢褟 芯斜薪芯胁谢械薪懈褟. 袩芯 胁芯锌褉芯褋邪屑, 锌芯卸邪谢褍泄褋褌邪, 芯斜褉邪褖邪泄褌械褋褜 胁 薪邪褕褍 褋谢褍卸斜褍 锌芯写写械褉卸泻懈 (support@dify.ai). 小锌邪褋懈斜芯 蟹邪 胁邪褕械 褌械褉锌械薪懈械',
+    vi_VN:
+      'H峄� th峄憂g c峄 ch煤ng t么i s岷� ng峄玭g ho岷 膽峄檔g t峄� 19:00 膽岷縩 24:00 UTC v脿o ng脿y 28 th谩ng 8 膽峄� n芒ng c岷. N岷縰 c贸 th岷痗 m岷痗, vui l貌ng li锚n h峄� v峄沬 nh贸m h峄� tr峄� c峄 ch煤ng t么i (support@dify.ai). Ch煤ng t么i 膽谩nh gi谩 cao s峄� ki锚n nh岷玭 c峄 b岷.',
+    tr_TR:
+      'Sistemimiz, 28 A臒ustos\'ta 19:00 ile 24:00 UTC saatleri aras谋nda g眉ncelleme nedeniyle kullan谋lamayacakt谋r. Sorular谋n谋z i莽in l眉tfen destek ekibimizle ileti艧ime ge莽in (support@dify.ai). Sabr谋n谋z i莽in te艧ekk眉r ederiz.',
+    fa_IR:
+      '爻蹖爻鬲賲 賲丕 丕夭 爻丕毓鬲 19:00 鬲丕 24:00 UTC 丿乇 鬲丕乇蹖禺 28 丕賵鬲 亘乇丕蹖 丕乇鬲賯丕亍 丿乇 丿爻鬲乇爻 賳禺賵丕賴丿 亘賵丿. 亘乇丕蹖 爻丐丕賱丕鬲貙 賱胤賮丕賸 亘丕 鬲蹖賲 倬卮鬲蹖亘丕賳蹖 賲丕 (support@dify.ai) 鬲賲丕爻 亘诏蹖乇蹖丿. 賲丕 亘乇丕蹖 氐亘乇 卮賲丕 丕乇夭卮 賯丕卅賱蹖賲.',
+    sl_SI:
+      'Na拧 sistem ne bo na voljo od 19:00 do 24:00 UTC 28. avgusta zaradi nadgradnje. Za vpra拧anja se obrnite na na拧o skupino za podporo (support@dify.ai). Cenimo va拧o potrpe啪ljivost.',
+    th_TH:
+      '喔`赴喔氞笟喔傕腑喔囙箑喔`覆喔堗赴喙勦浮喙堗釜喔侧浮喔侧福喔栢箖喔娻箟喔囙覆喔權箘喔斷箟喔曕副喙夃竾喙佮笗喙堗箑喔о弗喔� 19:00 喔栢付喔� 24:00 UTC 喙冟笝喔о副喔權笚喔掂箞 28 喔复喔囙斧喔侧竸喔� 喙�喔炧阜喙堗腑喔椸赋喔佮覆喔`腑喔编笡喙�喔佮福喔� 喔覆喔佮浮喔掂竸喔赤笘喔侧浮喙冟笖喙� 喔佮福喔膏笓喔侧笗喔脆笖喔曕箞喔笚喔掂浮喔笝喔编笟喔笝喔膏笝喔傕腑喔囙箑喔`覆 (support@dify.ai) 喙�喔`覆喔傕腑喔傕腑喔氞竸喔膏笓喙冟笝喔勦抚喔侧浮喔笖喔椸笝喔傕腑喔囙笚喙堗覆喔�',
+  },
+  href: '#',
+}
diff --git a/i18n/languages.json b/i18n/languages.json
new file mode 100644
index 0000000..4155492
--- /dev/null
+++ b/i18n/languages.json
@@ -0,0 +1,151 @@
+{
+  "languages": [
+    {
+      "value": "en-US",
+      "name": "English (United States)",
+      "prompt_name": "English",
+      "example": "Hello, Dify!",
+      "supported": true
+    },
+    {
+      "value": "zh-Hans",
+      "name": "绠�浣撲腑鏂�",
+      "prompt_name": "Chinese Simplified",
+      "example": "浣犲ソ锛孌ify锛�",
+      "supported": true
+    },
+    {
+      "value": "zh-Hant",
+      "name": "绻侀珨涓枃",
+      "prompt_name": "Chinese Traditional",
+      "example": "浣犲ソ锛孌ify锛�",
+      "supported": true
+    },
+    {
+      "value": "pt-BR",
+      "name": "Portugu锚s (Brasil)",
+      "prompt_name": "Portuguese",
+      "example": "Ol谩, Dify!",
+      "supported": true
+    },
+    {
+      "value": "es-ES",
+      "name": "Espa帽ol (Espa帽a)",
+      "prompt_name": "Spanish",
+      "example": "Saluton, Dify!",
+      "supported": true
+    },
+    {
+      "value": "fr-FR",
+      "name": "Fran莽ais (France)",
+      "prompt_name": "French",
+      "example": "Bonjour, Dify!",
+      "supported": true
+    },
+    {
+      "value": "de-DE",
+      "name": "Deutsch (Deutschland)",
+      "prompt_name": "German",
+      "example": "Hallo, Dify!",
+      "supported": true
+    },
+    {
+      "value": "ja-JP",
+      "name": "鏃ユ湰瑾� (鏃ユ湰)",
+      "prompt_name": "Japanese",
+      "example": "銇撱倱銇仭銇�丏ify!",
+      "supported": true
+    },
+    {
+      "value": "ko-KR",
+      "name": "頃滉淡鞏� (雽�頃滊甑�)",
+      "prompt_name": "Korean",
+      "example": "鞎堧厱頃橃劯鞖�, Dify!",
+      "supported": true
+    },
+    {
+      "value": "ru-RU",
+      "name": "袪褍褋褋泻懈泄 (袪芯褋褋懈褟)",
+      "prompt_name": "Russian",
+      "example": " 袩褉懈胁械褌, Dify!",
+      "supported": true
+    },
+    {
+      "value": "it-IT",
+      "name": "Italiano (Italia)",
+      "prompt_name": "Italian",
+      "example": "Ciao, Dify!",
+      "supported": true
+    },
+    {
+      "value": "th-TH",
+      "name": "喙勦笚喔� (喔涏福喔班箑喔椸辅喙勦笚喔�)",
+      "prompt_name": "Thai",
+      "example": "喔抚喔编釜喔斷傅 Dify!",
+      "supported": true
+    },
+    {
+      "value": "id-ID",
+      "name": "Bahasa Indonesia",
+      "prompt_name": "Indonesian",
+      "example": "Saluto, Dify!",
+      "supported": false
+    },
+    {
+      "value": "uk-UA",
+      "name": "校泻褉邪褩薪褋褜泻邪 (校泻褉邪褩薪邪)",
+      "prompt_name": "Ukrainian",
+      "example": "袩褉懈胁械褌, Dify!",
+      "supported": true
+    },
+    {
+      "value": "vi-VN",
+      "name": "Ti岷縩g Vi峄噒 (Vi峄噒 Nam)",
+      "prompt_name": "Vietnamese",
+      "example": "Xin ch脿o, Dify!",
+      "supported": true
+    },
+    {
+      "value": "ro-RO",
+      "name": "Rom芒n膬 (Rom芒nia)",
+      "prompt_name": "Romanian",
+      "example": "Salut, Dify!",
+      "supported": true
+    },
+    {
+      "value": "pl-PL",
+      "name": "Polski (Polish)",
+      "prompt_name": "Polish",
+      "example": "Cze艣膰, Dify!",
+      "supported": true
+    },
+    {
+      "value": "hi-IN",
+      "name": "Hindi (India)",
+      "prompt_name": "Hindi",
+      "example": "啶ㄠぎ啶膏啶む, Dify!",
+      "supported": "true"
+    },
+    {
+      "value": "tr-TR",
+      "name": "T眉rk莽e",
+      "prompt_name": "T眉rk莽e",
+      "example": "Selam!",
+      "supported": "true"
+    },
+    {
+      "value": "fa-IR",
+      "name": "Farsi (Iran)",
+      "prompt_name": "Farsi",
+      "example": "爻賱丕賲, 丿蹖賮丕蹖!",
+      "supported": true
+    },
+    {
+      "value": "sl-SI",
+      "name": "Slovensko (Slovenija)",
+      "prompt_name": "Slovensko",
+      "example": "Zdravo, Dify!",
+      "supported": true
+    }
+  ]
+}
diff --git a/i18n/pl-PL/app-annotation.ts b/i18n/pl-PL/app-annotation.ts
new file mode 100644
index 0000000..81a5259
--- /dev/null
+++ b/i18n/pl-PL/app-annotation.ts
@@ -0,0 +1,89 @@
+const translation = {
+  title: 'Adnotacje',
+  name: 'Odpowied藕 adnotacji',
+  editBy: 'Odpowied藕 edytowana przez {{author}}',
+  noData: {
+    title: 'Brak adnotacji',
+    description:
+      'Mo偶esz edytowa膰 adnotacje podczas debugowania aplikacji lub importowa膰 adnotacje tutaj w celu uzyskania wysokiej jako艣ci odpowiedzi.',
+  },
+  table: {
+    header: {
+      question: 'pytanie',
+      answer: 'odpowied藕',
+      createdAt: 'utworzono',
+      hits: 'trafienia',
+      actions: 'akcje',
+      addAnnotation: 'Dodaj adnotacj臋',
+      bulkImport: 'Masowy import',
+      bulkExport: 'Masowy eksport',
+      clearAll: 'Wyczy艣膰 wszystkie adnotacje',
+    },
+  },
+  editModal: {
+    title: 'Edytuj odpowied藕 adnotacji',
+    queryName: 'Zapytanie u偶ytkownika',
+    answerName: 'Bot opowiadaj膮cy historie',
+    yourAnswer: 'Twoja odpowied藕',
+    answerPlaceholder: 'Wpisz tutaj swoj膮 odpowied藕',
+    yourQuery: 'Twoje zapytanie',
+    queryPlaceholder: 'Wpisz tutaj swoje zapytanie',
+    removeThisCache: 'Usu艅 t臋 adnotacj臋',
+    createdAt: 'Utworzono',
+  },
+  addModal: {
+    title: 'Dodaj odpowied藕 adnotacji',
+    queryName: 'Pytanie',
+    answerName: 'Odpowied藕',
+    answerPlaceholder: 'Wpisz tutaj odpowied藕',
+    queryPlaceholder: 'Wpisz tutaj zapytanie',
+    createNext: 'Dodaj kolejn膮 odpowied藕 adnotacji',
+  },
+  batchModal: {
+    title: 'Masowy import',
+    csvUploadTitle: 'Przeci膮gnij i upu艣膰 tutaj sw贸j plik CSV, lub ',
+    browse: 'przegl膮daj',
+    tip: 'Plik CSV musi spe艂nia膰 nast臋puj膮c膮 struktur臋:',
+    question: 'pytanie',
+    answer: 'odpowied藕',
+    contentTitle: 'zawarto艣膰 fragmentu',
+    content: 'zawarto艣膰',
+    template: 'Pobierz szablon tutaj',
+    cancel: 'Anuluj',
+    run: 'Uruchom batch',
+    runError: 'Uruchomienie batcha nie powiod艂o si臋',
+    processing: 'Przetwarzanie batcha',
+    completed: 'Import zako艅czony',
+    error: 'B艂膮d importu',
+    ok: 'OK',
+  },
+  errorMessage: {
+    answerRequired: 'Odpowied藕 jest wymagana',
+    queryRequired: 'Pytanie jest wymagane',
+  },
+  viewModal: {
+    annotatedResponse: 'Odpowied藕 adnotacji',
+    hitHistory: 'Historia trafie艅',
+    hit: 'Trafienie',
+    hits: 'Trafienia',
+    noHitHistory: 'Brak historii trafie艅',
+  },
+  hitHistoryTable: {
+    query: 'Zapytanie',
+    match: 'Dopasowanie',
+    response: 'Odpowied藕',
+    source: '殴r贸d艂o',
+    score: 'Wynik',
+    time: 'Czas',
+  },
+  initSetup: {
+    title: 'Pocz膮tkowa konfiguracja odpowiedzi adnotacji',
+    configTitle: 'Konfiguracja odpowiedzi adnotacji',
+    confirmBtn: 'Zapisz i w艂膮cz',
+    configConfirmBtn: 'Zapisz',
+  },
+  embeddingModelSwitchTip:
+    'Model wektoryzacji tekstu adnotacji, prze艂膮czanie modeli spowoduje ponowne osadzenie, co wi膮偶e si臋 z dodatkowymi kosztami.',
+}
+
+export default translation
diff --git a/i18n/pl-PL/app-api.ts b/i18n/pl-PL/app-api.ts
new file mode 100644
index 0000000..73ff267
--- /dev/null
+++ b/i18n/pl-PL/app-api.ts
@@ -0,0 +1,104 @@
+const translation = {
+  apiServer: 'Serwer API',
+  apiKey: 'Klucz API',
+  status: 'Status',
+  disabled: 'Wy艂膮czony',
+  ok: 'W us艂udze',
+  copy: 'Kopiuj',
+  copied: 'Skopiowane',
+  play: 'Graj',
+  pause: 'Pauza',
+  playing: 'Gra',
+  loading: '艁adowanie',
+  merMaid: {
+    rerender: 'Przer贸b Renderowanie',
+  },
+  never: 'Nigdy',
+  apiKeyModal: {
+    apiSecretKey: 'Tajny klucz API',
+    apiSecretKeyTips:
+      'Aby zapobiec nadu偶yciom API, chron sw贸j klucz API. Unikaj u偶ywania go jako zwyk艂ego tekstu w kodzie front-end. :)',
+    createNewSecretKey: 'Utw贸rz nowy tajny klucz',
+    secretKey: 'Tajny Klucz',
+    created: 'UTWORZONY',
+    lastUsed: 'OSTATNIO U呕YWANY',
+    generateTips: 'Przechowuj ten klucz w bezpiecznym i dost臋pnym miejscu.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: 'Usun膮膰 ten tajny klucz?',
+    deleteConfirmTips: 'Tej akcji nie mo偶na cofn膮膰.',
+    ok: 'OK',
+  },
+  completionMode: {
+    title: 'Zako艅czenie App API',
+    info: 'Do generowania tekstu wysokiej jako艣ci, takiego jak artyku艂y, podsumowania i t艂umaczenia, u偶yj API completion-messages z danymi wej艣ciowymi u偶ytkownika. Generowanie tekstu zale偶y od parametr贸w modelu i szablon贸w prompt贸w ustawionych w Dify Prompt Engineering.',
+    createCompletionApi: 'Utw贸rz Wiadomo艣膰 Zako艅czenia',
+    createCompletionApiTip:
+      'Utw贸rz Wiadomo艣膰 Zako艅czenia, aby obs艂ugiwa膰 tryb pytanie-odpowied藕.',
+    inputsTips:
+      '(Opcjonalnie) Podaj pola wej艣ciowe u偶ytkownika jako pary klucz-warto艣膰, odpowiadaj膮ce zmiennym w Prompt Eng. Klucz to nazwa zmiennej, Warto艣膰 to warto艣膰 parametru. Je艣li typ pola to Wybierz, przes艂ana Warto艣膰 musi by膰 jednym z predefiniowanych wybor贸w.',
+    queryTips: 'Tre艣膰 tekstu wprowadzanego przez u偶ytkownika.',
+    blocking:
+      'Typ blokuj膮cy, czekanie na zako艅czenie wykonania i zwr贸cenie wynik贸w. (呕膮dania mog膮 by膰 przerywane, je艣li proces jest d艂ugi)',
+    streaming:
+      'zwraca strumieniowo. Implementacja strumieniowego zwrotu na podstawie SSE (Server-Sent Events).',
+    messageFeedbackApi: 'Informacje zwrotne o wiadomo艣ci (lubi臋)',
+    messageFeedbackApiTip:
+      'Oceniaj otrzymane wiadomo艣ci w imieniu u偶ytkownik贸w ko艅cowych na podstawie polubie艅 lub niepolubie艅. Te dane s膮 widoczne na stronie Logi i adnotacje i s膮 u偶ywane do przysz艂ego dostrojenia modelu.',
+    messageIDTip: 'ID wiadomo艣ci',
+    ratingTip: 'lubi臋 lub nie lubi臋, null to cofni臋cie',
+    parametersApi: 'Uzyskaj informacje o parametrach aplikacji',
+    parametersApiTip:
+      'Pobierz skonfigurowane parametry wej艣ciowe, w tym nazwy zmiennych, nazwy p贸l, typy i domy艣lne warto艣ci. Zwykle u偶ywane do wy艣wietlania tych p贸l w formularzu lub wype艂niania domy艣lnych warto艣ci po za艂adowaniu klienta.',
+  },
+  chatMode: {
+    title: 'Chat App API',
+    info: 'Do wszechstronnych aplikacji konwersacyjnych w formacie Q&A, wywo艂aj API chat-messages, aby rozpocz膮膰 dialog. Utrzymuj trwaj膮ce rozmowy, przekazuj膮c zwr贸cone conversation_id. Parametry odpowiedzi i szablony zale偶膮 od ustawie艅 Dify Prompt Eng.',
+    createChatApi: 'Utw贸rz wiadomo艣膰 czatu',
+    createChatApiTip:
+      'Utw贸rz now膮 wiadomo艣膰 konwersacji lub kontynuuj istniej膮cy dialog.',
+    inputsTips:
+      '(Opcjonalnie) Podaj pola wej艣ciowe u偶ytkownika jako pary klucz-warto艣膰, odpowiadaj膮ce zmiennym w Prompt Eng. Klucz to nazwa zmiennej, Warto艣膰 to warto艣膰 parametru. Je艣li typ pola to Wybierz, przes艂ana Warto艣膰 musi by膰 jednym z predefiniowanych wybor贸w.',
+    queryTips: 'Tre艣膰 pytania/wprowadzanej przez u偶ytkownika',
+    blocking:
+      'Typ blokuj膮cy, czekanie na zako艅czenie wykonania i zwr贸cenie wynik贸w. (呕膮dania mog膮 by膰 przerywane, je艣li proces jest d艂ugi)',
+    streaming:
+      'zwraca strumieniowo. Implementacja strumieniowego zwrotu na podstawie SSE (Server-Sent Events).',
+    conversationIdTip:
+      '(Opcjonalnie) ID rozmowy: pozostaw puste dla pierwszej rozmowy; przeka偶 conversation_id z kontekstu, aby kontynuowa膰 dialog.',
+    messageFeedbackApi: 'Informacje zwrotne od u偶ytkownika terminala, lubi臋',
+    messageFeedbackApiTip:
+      'Oceniaj otrzymane wiadomo艣ci w imieniu u偶ytkownik贸w ko艅cowych na podstawie polubie艅 lub niepolubie艅. Te dane s膮 widoczne na stronie Logi i adnotacje i s膮 u偶ywane do przysz艂ego dostrojenia modelu.',
+    messageIDTip: 'ID wiadomo艣ci',
+    ratingTip: 'lubi臋 lub nie lubi臋, null to cofni臋cie',
+    chatMsgHistoryApi: 'Pobierz histori臋 wiadomo艣ci czatu',
+    chatMsgHistoryApiTip:
+      'Pierwsza strona zwraca najnowsze `limit` wiadomo艣ci, kt贸re s膮 w odwrotnej kolejno艣ci.',
+    chatMsgHistoryConversationIdTip: 'ID rozmowy',
+    chatMsgHistoryFirstId:
+      'ID pierwszego rekordu czatu na bie偶膮cej stronie. Domy艣lnie brak.',
+    chatMsgHistoryLimit: 'Ile czat贸w jest zwracanych w jednym 偶膮daniu',
+    conversationsListApi: 'Pobierz list臋 rozm贸w',
+    conversationsListApiTip:
+      'Pobiera list臋 sesji bie偶膮cego u偶ytkownika. Domy艣lnie zwraca ostatnie 20 sesji.',
+    conversationsListFirstIdTip:
+      'ID ostatniego rekordu na bie偶膮cej stronie, domy艣lnie brak.',
+    conversationsListLimitTip: 'Ile czat贸w jest zwracanych w jednym 偶膮daniu',
+    conversationRenamingApi: 'Zmiana nazwy rozmowy',
+    conversationRenamingApiTip:
+      'Zmie艅 nazwy rozm贸w; nazwa jest wy艣wietlana w interfejsach klienta wielosesyjnego.',
+    conversationRenamingNameTip: 'Nowa nazwa',
+    parametersApi: 'Uzyskaj informacje o parametrach aplikacji',
+    parametersApiTip:
+      'Pobierz skonfigurowane parametry wej艣ciowe, w tym nazwy zmiennych, nazwy p贸l, typy i domy艣lne warto艣ci. Zwykle u偶ywane do wy艣wietlania tych p贸l w formularzu lub wype艂niania domy艣lnych warto艣ci po za艂adowaniu klienta.',
+  },
+  develop: {
+    requestBody: 'Cia艂o 偶膮dania',
+    pathParams: 'Parametry 艣cie偶ki',
+    query: 'Zapytanie',
+    toc: 'Tre艣膰',
+  },
+  regenerate: 'Ponownie wygenerowa膰',
+}
+
+export default translation
diff --git a/i18n/pl-PL/app-debug.ts b/i18n/pl-PL/app-debug.ts
new file mode 100644
index 0000000..cf7232e
--- /dev/null
+++ b/i18n/pl-PL/app-debug.ts
@@ -0,0 +1,466 @@
+const translation = {
+  pageTitle: {
+    line1: 'MONIT',
+    line2: 'In偶ynieria',
+  },
+  orchestrate: 'Orkiestracja',
+  promptMode: {
+    simple: 'Prze艂膮cz na tryb Ekspert, aby edytowa膰 ca艂y MONIT',
+    advanced: 'Tryb Ekspert',
+    switchBack: 'Prze艂膮cz z powrotem',
+    advancedWarning: {
+      title:
+        'Prze艂膮czy艂e艣 si臋 na Tryb Ekspert, i po modyfikacji MONITU, NIE mo偶na powr贸ci膰 do trybu podstawowego.',
+      description: 'W Trybie Ekspert, mo偶esz edytowa膰 ca艂y MONIT.',
+      learnMore: 'Dowiedz si臋 wi臋cej',
+      ok: 'OK',
+    },
+    operation: {
+      addMessage: 'Dodaj Wiadomo艣膰',
+    },
+    contextMissing:
+      'Brak komponentu kontekstowego, skuteczno艣膰 monitu mo偶e by膰 niewystarczaj膮ca.',
+  },
+  operation: {
+    applyConfig: 'Publikuj',
+    resetConfig: 'Resetuj',
+    debugConfig: 'Debuguj',
+    addFeature: 'Dodaj funkcj臋',
+    automatic: 'Automatyczny',
+    stopResponding: 'Przestaje odpowiada膰',
+    agree: 'lubi臋',
+    disagree: 'nie lubi臋',
+    cancelAgree: 'Anuluj polubienie',
+    cancelDisagree: 'Anuluj niepolubienie',
+    userAction: 'Akcja u偶ytkownika ',
+  },
+  notSetAPIKey: {
+    title: 'Klucz dostawcy LLM nie zosta艂 ustawiony',
+    trailFinished: '艢cie偶ka zako艅czona',
+    description:
+      'Klucz dostawcy LLM nie zosta艂 ustawiony, musi zosta膰 ustawiony przed debugowaniem.',
+    settingBtn: 'Przejd藕 do ustawie艅',
+  },
+  trailUseGPT4Info: {
+    title: 'Obecnie nie obs艂uguje GPT-4',
+    description: 'U偶yj GPT-4, prosz臋 ustawi膰 klucz API.',
+  },
+  feature: {
+    groupChat: {
+      title: 'Rozmowy grupowe',
+      description:
+        'Dodanie ustawie艅 przedkonwersacyjnych dla aplikacji mo偶e poprawi膰 do艣wiadczenia u偶ytkownika.',
+    },
+    groupExperience: {
+      title: 'Poprawa do艣wiadczenia',
+    },
+    conversationOpener: {
+      title: 'Otwieracze do rozm贸w',
+      description:
+        'W aplikacji czatowej pierwsze zdanie, kt贸re AI aktywnie wypowiada do u偶ytkownika, zazwyczaj s艂u偶y jako powitanie.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: 'Nawi膮zanie',
+      description: 'Ustawienie kolejnych pyta艅 mo偶e poprawi膰 czat.',
+      resDes: '3 sugestie dla kolejnego pytania u偶ytkownika.',
+      tryToAsk: 'Spr贸buj zapyta膰',
+    },
+    moreLikeThis: {
+      title: 'Wi臋cej takich jak ten',
+      description:
+        'Generuj wiele tekst贸w na raz, a nast臋pnie edytuj i kontynuuj generowanie',
+      generateNumTip: 'Liczba generowanych raz贸w',
+      tip: 'Korzystanie z tej funkcji spowoduje dodatkowe zu偶ycie token贸w',
+    },
+    speechToText: {
+      title: 'Mowa na tekst',
+      description: 'Po w艂膮czeniu mo偶na u偶ywa膰 wprowadzania g艂osowego.',
+      resDes: 'Wprowadzanie g艂osowe jest w艂膮czone',
+    },
+    textToSpeech: {
+      title: 'Tekst na mow臋',
+      description: 'Po w艂膮czeniu tekst mo偶na przekszta艂ci膰 w mow臋.',
+      resDes: 'Tekst na audio jest w艂膮czony',
+    },
+    citation: {
+      title: 'Cytaty i odniesienia',
+      description:
+        'Po w艂膮czeniu, poka偶 dokument 藕r贸d艂owy i przypisan膮 sekcj臋 wygenerowanej tre艣ci.',
+      resDes: 'Cytaty i odniesienia s膮 w艂膮czone',
+    },
+    annotation: {
+      title: 'Odpowied藕 z adnotacj膮',
+      description:
+        'Mo偶esz r臋cznie doda膰 odpowied藕 wysokiej jako艣ci do pami臋ci podr臋cznej dla priorytetowego dopasowania do podobnych pyta艅 u偶ytkownika.',
+      resDes: 'Odpowied藕 z adnotacj膮 jest w艂膮czona',
+      scoreThreshold: {
+        title: 'Pr贸g wynik贸w',
+        description:
+          'S艂u偶y do ustawienia progu podobie艅stwa dla odpowiedzi z adnotacj膮.',
+        easyMatch: '艁atwe dopasowanie',
+        accurateMatch: 'Dok艂adne dopasowanie',
+      },
+      matchVariable: {
+        title: 'Zmienna dopasowania',
+        choosePlaceholder: 'Wybierz zmienn膮 do dopasowania',
+      },
+      cacheManagement: 'Adnotacje',
+      cached: 'Zanotowano',
+      remove: 'Usu艅',
+      removeConfirm: 'Usun膮膰 t臋 adnotacj臋?',
+      add: 'Dodaj adnotacj臋',
+      edit: 'Edytuj adnotacj臋',
+    },
+    dataSet: {
+      title: 'Kontekst',
+      noData: 'Mo偶esz importowa膰 wiedz臋 jako kontekst',
+      words: 'S艂owa',
+      textBlocks: 'Bloki tekstu',
+      selectTitle: 'Wybierz odniesienie do wiedzy',
+      selected: 'Wiedza wybrana',
+      noDataSet: 'Nie znaleziono wiedzy',
+      toCreate: 'Przejd藕 do tworzenia',
+      notSupportSelectMulti: 'Obecnie obs艂ugiwana jest tylko jedna wiedza',
+      queryVariable: {
+        title: 'Zmienna zapytania',
+        tip: 'Ta zmienna b臋dzie u偶ywana jako dane wej艣ciowe zapytania do odzyskiwania kontekstu, uzyskuj膮c informacje kontekstowe zwi膮zane z wprowadzonymi danymi.',
+        choosePlaceholder: 'Wybierz zmienn膮 zapytania',
+        noVar: 'Brak zmiennych',
+        noVarTip: 'prosz臋 stworzy膰 zmienn膮 w sekcji Zmienne',
+        unableToQueryDataSet: 'Nie mo偶na odzyska膰 wiedzy',
+        unableToQueryDataSetTip:
+          'Nie uda艂o si臋 pomy艣lnie odzyska膰 wiedzy, prosz臋 wybra膰 zmienn膮 zapytania kontekstowego w sekcji kontekstowej.',
+        ok: 'OK',
+        contextVarNotEmpty:
+          'zmienna zapytania kontekstowego nie mo偶e by膰 pusta',
+        deleteContextVarTitle: 'Usun膮膰 zmienn膮 鈥瀧{varName}}鈥�?',
+        deleteContextVarTip:
+          'Ta zmienna zosta艂a ustawiona jako zmienna zapytania kontekstowego, a jej usuni臋cie wp艂ynie na normalne korzystanie z wiedzy. Je艣li nadal potrzebujesz jej usun膮膰, wybierz j膮 ponownie w sekcji kontekstowej.',
+      },
+    },
+    tools: {
+      title: 'Narz臋dzia',
+      tips: 'Narz臋dzia zapewniaj膮 standardow膮 metod臋 wywo艂ania API, przyjmuj膮c dane wej艣ciowe u偶ytkownika lub zmienne jako parametry 偶膮dania do zapytania o dane zewn臋trzne jako kontekst.',
+      toolsInUse: '{{count}} narz臋dzi w u偶yciu',
+      modal: {
+        title: 'Narz臋dzie',
+        toolType: {
+          title: 'Typ narz臋dzia',
+          placeholder: 'Wybierz typ narz臋dzia',
+        },
+        name: {
+          title: 'Nazwa',
+          placeholder: 'Wprowad藕 nazw臋',
+        },
+        variableName: {
+          title: 'Nazwa zmiennej',
+          placeholder: 'Wprowad藕 nazw臋 zmiennej',
+        },
+      },
+    },
+    conversationHistory: {
+      title: 'Historia konwersacji',
+      description: 'Ustaw prefixy dla r贸l w rozmowie',
+      tip: 'Historia konwersacji nie jest w艂膮czona, prosz臋 doda膰 <historie> w monicie powy偶ej.',
+      learnMore: 'Dowiedz si臋 wi臋cej',
+      editModal: {
+        title: 'Edycja nazw r贸l konwersacyjnych',
+        userPrefix: 'Prefix u偶ytkownika',
+        assistantPrefix: 'Prefix asystenta',
+      },
+    },
+    toolbox: {
+      title: 'SKRZYNKA NARZ臉DZIOWA',
+    },
+    moderation: {
+      title: 'Moderacja tre艣ci',
+      description:
+        'Zabezpiecz wyj艣cie modelu, u偶ywaj膮c API moderacji lub utrzymuj膮c list臋 wra偶liwych s艂贸w.',
+      allEnabled: 'Tre艣膰 WEJ艢CIOWA/WYJ艢CIOWA W艂膮czona',
+      inputEnabled: 'Tre艣膰 WEJ艢CIOWA W艂膮czona',
+      outputEnabled: 'Tre艣膰 WYJ艢CIOWA W艂膮czona',
+      modal: {
+        title: 'Ustawienia moderacji tre艣ci',
+        provider: {
+          title: 'Dostawca',
+          openai: 'Moderacja OpenAI',
+          openaiTip: {
+            prefix:
+              'Moderacja OpenAI wymaga skonfigurowanego klucza API OpenAI w ',
+            suffix: '.',
+          },
+          keywords: 'S艂owa kluczowe',
+        },
+        keywords: {
+          tip: 'Po jednym w wierszu, oddzielone znakiem nowej linii. Maksymalnie 100 znak贸w na wiersz.',
+          placeholder: 'Po jednym w wierszu, oddzielone znakiem nowej linii',
+          line: 'Linia',
+        },
+        content: {
+          input: 'Moderuj tre艣膰 WEJ艢CIOW膭',
+          output: 'Moderuj tre艣膰 WYJ艢CIOW膭',
+          preset: 'Ustawione odpowiedzi',
+          placeholder: 'Tutaj wprowad藕 ustawione odpowiedzi',
+          condition:
+            'Tre艣膰 WEJ艢CIA i WYJ艢CIA musi by膰 w艂膮czona przynajmniej jedna',
+          fromApi: 'Ustawione odpowiedzi zwracane przez API',
+          errorMessage: 'Ustawione odpowiedzi nie mog膮 by膰 puste',
+          supportMarkdown: 'Obs艂uguje Markdown',
+        },
+        openaiNotConfig: {
+          before:
+            'Moderacja OpenAI wymaga skonfigurowanego klucza API OpenAI w',
+          after: '',
+        },
+      },
+    },
+  },
+  automatic: {
+    title: 'Zautomatyzowana orkiestracja aplikacji',
+    description:
+      'Opisz sw贸j scenariusz, Dify zorkiestruje aplikacj臋 dla Ciebie.',
+    intendedAudience: 'Dla kogo jest przeznaczona ta aplikacja?',
+    intendedAudiencePlaceHolder: 'np. Ucze艅',
+    solveProblem:
+      'Jakie problemy maj膮 nadziej臋, 偶e AI mo偶e rozwi膮za膰 dla nich?',
+    solveProblemPlaceHolder:
+      'np. Wyci膮ganie wniosk贸w i podsumowanie informacji z d艂ugich raport贸w i artyku艂贸w',
+    generate: 'Generuj',
+    audiencesRequired: 'Wymagana publiczno艣ci',
+    problemRequired: 'Wymagany problem',
+    resTitle: 'Stworzyli艣my nast臋puj膮c膮 aplikacj臋 dla Ciebie.',
+    apply: 'Zastosuj t臋 orkiestracj臋',
+    noData:
+      'Opisz sw贸j przypadek po lewej, podgl膮d orkiestracji pojawi si臋 tutaj.',
+    loading: 'Orkiestracja aplikacji dla Ciebie...',
+    overwriteTitle: 'Zast膮pi膰 istniej膮c膮 konfiguracj臋?',
+    overwriteMessage:
+      'Zastosowanie tej orkiestracji zast膮pi istniej膮c膮 konfiguracj臋.',
+  },
+  resetConfig: {
+    title: 'Potwierd藕 reset?',
+    message:
+      'Reset odrzuca zmiany, przywracaj膮c ostatni膮 opublikowan膮 konfiguracj臋.',
+  },
+  errorMessage: {
+    nameOfKeyRequired: 'nazwa klucza: {{key}} wymagana',
+    valueOfVarRequired: '{{key}} warto艣膰 nie mo偶e by膰 pusta',
+    queryRequired: 'Tekst 偶膮dania jest wymagany.',
+    waitForResponse: 'Prosz臋 czeka膰 na odpowied藕 na poprzedni膮 wiadomo艣膰.',
+    waitForBatchResponse: 'Prosz臋 czeka膰 na odpowied藕 na zadanie wsadowe.',
+    notSelectModel: 'Prosz臋 wybra膰 model',
+    waitForImgUpload: 'Prosz臋 czeka膰 na przes艂anie obrazu',
+  },
+  chatSubTitle: 'Instrukcje',
+  completionSubTitle: 'Prefix Monitu',
+  promptTip:
+    'Monity kieruj膮 odpowiedziami AI za pomoc膮 instrukcji i ogranicze艅. Wstaw zmienne takie jak {{input}}. Ten monit nie b臋dzie widoczny dla u偶ytkownik贸w.',
+  formattingChangedTitle: 'Zmiana formatowania',
+  formattingChangedText:
+    'Modyfikacja formatowania zresetuje obszar debugowania, czy jeste艣 pewien?',
+  variableTitle: 'Zmienne',
+  variableTip:
+    'U偶ytkownicy wype艂niaj膮 zmienne w formularzu, automatycznie zast臋puj膮c zmienne w monicie.',
+  notSetVar:
+    'Zmienne pozwalaj膮 u偶ytkownikom wprowadza膰 s艂owa wst臋puj膮ce lub otwieraj膮ce uwagi podczas wype艂niania formularzy. Mo偶esz spr贸bowa膰 wpisa膰 "{{input}}" w s艂owach monitu.',
+  autoAddVar:
+    'Niezdefiniowane zmienne odwo艂uj膮 si臋 w pre-monicie, czy chcesz je doda膰 do formularza wej艣ciowego u偶ytkownika?',
+  variableTable: {
+    key: 'Klucz Zmiennej',
+    name: 'Nazwa Pola Wej艣ciowego U偶ytkownika',
+    optional: 'Opcjonalnie',
+    type: 'Typ Wej艣cia',
+    action: 'Akcje',
+    typeString: 'String',
+    typeSelect: 'Wybierz',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{klucz}} jest wymagany',
+    tooLong:
+      '{{key}} za d艂ugi. Nie mo偶e by膰 d艂u偶szy ni偶 30 znak贸w',
+    notValid:
+      '{{key}} jest nieprawid艂owy. Mo偶e zawiera膰 tylko litery, cyfry i podkre艣lenia',
+    notStartWithNumber:
+      '{{key}} nie mo偶e zaczyna膰 si臋 od cyfry',
+    keyAlreadyExists: '{{key}} ju偶 istnieje',
+  },
+  otherError: {
+    promptNoBeEmpty: 'Monit nie mo偶e by膰 pusty',
+    historyNoBeEmpty: 'Historia konwersacji musi by膰 ustawiona w monicie',
+    queryNoBeEmpty: 'Zapytanie musi by膰 ustawione w monicie',
+  },
+  variableConfig: {
+    'addModalTitle': 'Dodaj Pole Wej艣ciowe',
+    'editModalTitle': 'Edytuj Pole Wej艣ciowe',
+    'description': 'Ustawienia dla zmiennej {{varName}}',
+    'fieldType': 'Typ pola',
+    'string': 'Kr贸tki tekst',
+    'text-input': 'Kr贸tki tekst',
+    'paragraph': 'Akapit',
+    'select': 'Wybierz',
+    'number': 'Numer',
+    'notSet': 'Nie ustawione, spr贸buj wpisa膰 {{input}} w monicie wst臋pnym',
+    'stringTitle': 'Opcje pola tekstowego formularza',
+    'maxLength': 'Maksymalna d艂ugo艣膰',
+    'options': 'Opcje',
+    'addOption': 'Dodaj opcj臋',
+    'apiBasedVar': 'Zmienna oparta na API',
+    'varName': 'Nazwa zmiennej',
+    'labelName': 'Nazwa etykiety',
+    'inputPlaceholder': 'Prosz臋 wpisa膰',
+    'required': 'Wymagane',
+    'errorMsg': {
+      varNameRequired: 'Wymagana nazwa zmiennej',
+      labelNameRequired: 'Wymagana nazwa etykiety',
+      varNameCanBeRepeat: 'Nazwa zmiennej nie mo偶e si臋 powtarza膰',
+      atLeastOneOption: 'Wymagana jest co najmniej jedna opcja',
+      optionRepeat: 'Powtarzaj膮 si臋 opcje',
+    },
+  },
+  vision: {
+    name: 'Wizja',
+    description:
+      'W艂膮czenie Wizji pozwoli modelowi przyjmowa膰 obrazy i odpowiada膰 na pytania o nich.',
+    settings: 'Ustawienia',
+    visionSettings: {
+      title: 'Ustawienia Wizji',
+      resolution: 'Rozdzielczo艣膰',
+      resolutionTooltip: `niska rozdzielczo艣膰 pozwoli modelowi odbiera膰 obrazy o rozdzielczo艣ci 512 x 512 i reprezentowa膰 obraz z limitem 65 token贸w. Pozwala to API na szybsze odpowiedzi i zu偶ywa mniej token贸w wej艣ciowych dla przypadk贸w, kt贸re nie wymagaj膮 wysokiego szczeg贸艂u.
+        \n
+        wysoka rozdzielczo艣膰 pozwala najpierw modelowi zobaczy膰 obraz niskiej rozdzielczo艣ci, a nast臋pnie tworzy szczeg贸艂owe przyci臋cia obraz贸w wej艣ciowych jako 512px kwadrat贸w w oparciu o rozmiar obrazu wej艣ciowego. Ka偶de z tych szczeg贸艂owych przyci臋膰 u偶ywa dwukrotno艣ci bud偶etu token贸w, co daje razem 129 token贸w.`,
+      high: 'Wysoka',
+      low: 'Niska',
+      uploadMethod: 'Metoda przesy艂ania',
+      both: 'Obie',
+      localUpload: 'Przesy艂anie lokalne',
+      url: 'URL',
+      uploadLimit: 'Limit przesy艂ania',
+    },
+  },
+  voice: {
+    name: 'G艂os',
+    defaultDisplay: 'Domy艣lny G艂os',
+    description: 'Ustawienia g艂osu tekstu na mow臋',
+    settings: 'Ustawienia',
+    voiceSettings: {
+      title: 'Ustawienia G艂osu',
+      language: 'J臋zyk',
+      resolutionTooltip: 'Wsparcie j臋zykowe g艂osu tekstu na mow臋.',
+      voice: 'G艂os',
+      autoPlay: 'Automatyczne odtwarzanie',
+      autoPlayEnabled: 'w艂膮czy膰 co艣',
+      autoPlayDisabled: 'zamkni臋cie',
+    },
+  },
+  openingStatement: {
+    title: 'Wst臋p do rozmowy',
+    add: 'Dodaj',
+    writeOpener: 'Napisz wst臋p',
+    placeholder:
+      'Tutaj napisz swoj膮 wiadomo艣膰 wprowadzaj膮c膮, mo偶esz u偶y膰 zmiennych, spr贸buj wpisa膰 {{variable}}.',
+    openingQuestion: 'Pytania otwieraj膮ce',
+    noDataPlaceHolder:
+      'Rozpoczynanie rozmowy z u偶ytkownikiem mo偶e pom贸c AI nawi膮za膰 bli偶sze po艂膮czenie z nim w aplikacjach konwersacyjnych.',
+    varTip: 'Mo偶esz u偶ywa膰 zmiennych, spr贸buj wpisa膰 {{variable}}',
+    tooShort:
+      'Wymagane jest co najmniej 20 s艂贸w wst臋pnego monitu, aby wygenerowa膰 uwagi wst臋pne do rozmowy.',
+    notIncludeKey:
+      'Wst臋pny monit nie zawiera zmiennej: {{key}}. Prosz臋 doda膰 j膮 do wst臋pnego monitu.',
+  },
+  modelConfig: {
+    model: 'Model',
+    setTone: 'Ustaw ton odpowiedzi',
+    title: 'Model i parametry',
+    modeType: {
+      chat: 'Czat',
+      completion: 'Uzupe艂nienie',
+    },
+  },
+  inputs: {
+    title: 'Debugowanie i podgl膮d',
+    noPrompt: 'Spr贸buj wpisa膰 jaki艣 monit w polu przedmonitu',
+    userInputField: 'Pole wej艣ciowe u偶ytkownika',
+    noVar:
+      'Wype艂nij warto艣膰 zmiennej, kt贸ra b臋dzie automatycznie zast臋powana w monicie za ka偶dym razem, gdy rozpocznie si臋 nowa sesja.',
+    chatVarTip:
+      'Wype艂nij warto艣膰 zmiennej, kt贸ra b臋dzie automatycznie zast臋powana w monicie za ka偶dym razem, gdy rozpocznie si臋 nowa sesja',
+    completionVarTip:
+      'Wype艂nij warto艣膰 zmiennej, kt贸ra b臋dzie automatycznie zast臋powana w s艂owach monitu za ka偶dym razem, gdy zostanie przes艂ane pytanie.',
+    previewTitle: 'Podgl膮d monitu',
+    queryTitle: 'Tre艣膰 zapytania',
+    queryPlaceholder: 'Prosz臋 wprowadzi膰 tekst 偶膮dania.',
+    run: 'URUCHOM',
+  },
+  result: 'Tekst wyj艣ciowy',
+  datasetConfig: {
+    settingTitle: 'Ustawienia odzyskiwania',
+    knowledgeTip: 'Kliknij przycisk 鈥�+鈥�, aby doda膰 wiedz臋',
+    retrieveOneWay: {
+      title: 'Odzyskiwanie N-do-1',
+      description:
+        'Na podstawie zamiaru u偶ytkownika i opis贸w Wiedzy, Agent samodzielnie wybiera najlepsz膮 Wiedz臋 do zapytania. Najlepiej sprawdza si臋 w aplikacjach o wyra藕nej, ograniczonej Wiedzy.',
+    },
+    retrieveMultiWay: {
+      title: 'Odzyskiwanie wielo艣cie偶kowe',
+      description:
+        'Na podstawie zamiaru u偶ytkownika, zapytania obejmuj膮 wszystkie Wiedze, pobieraj膮 odpowiedni tekst z wielu 藕r贸de艂 i wybieraj膮 najlepsze wyniki dopasowane do zapyta艅 u偶ytkownika po ponownym rankingu. Wymagana jest konfiguracja API modelu Przerankowania.',
+    },
+    rerankModelRequired: 'Wymagany model Przerankowania',
+    params: 'Parametry',
+    top_k: 'Najlepsze K',
+    top_kTip:
+      'U偶ywane do filtrowania fragment贸w najbardziej podobnych do pyta艅 u偶ytkownika. System r贸wnie偶 dynamicznie dostosowuje warto艣膰 Najlepszych K, zgodnie z maksymaln膮 liczb膮 token贸w wybranego modelu.',
+    score_threshold: 'Pr贸g punktacji',
+    score_thresholdTip:
+      'U偶ywany do ustawienia progu podobie艅stwa dla filtrowania fragment贸w.',
+    retrieveChangeTip:
+      'Modyfikacja trybu indeksowania i odzyskiwania mo偶e wp艂yn膮膰 na aplikacje powi膮zane z t膮 Wiedz膮.',
+  },
+  debugAsSingleModel: 'Debuguj jako pojedynczy model',
+  debugAsMultipleModel: 'Debuguj jako wiele modeli',
+  duplicateModel: 'Duplikuj',
+  publishAs: 'Opublikuj jako',
+  assistantType: {
+    name: 'Typ asystenta',
+    chatAssistant: {
+      name: 'Podstawowy Asystent',
+      description:
+        'Buduj asystenta opartego na czacie, korzystaj膮c z du偶ego modelu j臋zykowego',
+    },
+    agentAssistant: {
+      name: 'Asystent Agent',
+      description:
+        'Buduj inteligentnego agenta, kt贸ry mo偶e autonomicznie wybiera膰 narz臋dzia do wykonywania zada艅',
+    },
+  },
+  agent: {
+    agentMode: 'Tryb Agenta',
+    agentModeDes: 'Ustaw rodzaj trybu wnioskowania dla agenta',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: 'Wywo艂anie funkcji',
+    },
+    setting: {
+      name: 'Ustawienia Agenta',
+      description:
+        'Ustawienia Asystenta Agenta pozwalaj膮 ustawi膰 tryb agenta i zaawansowane funkcje, takie jak wbudowane monity, dost臋pne tylko w typie Agent.',
+      maximumIterations: {
+        name: 'Maksymalna liczba iteracji',
+        description:
+          'Ogranicz liczb臋 iteracji, kt贸re asystent agenta mo偶e wykona膰',
+      },
+    },
+    buildInPrompt: 'Wbudowany Monit',
+    firstPrompt: 'Pierwszy Monit',
+    nextIteration: 'Nast臋pna Iteracja',
+    promptPlaceholder: 'Napisz tutaj sw贸j monit',
+    tools: {
+      name: 'Narz臋dzia',
+      description:
+        'U偶ywanie narz臋dzi mo偶e rozszerzy膰 mo偶liwo艣ci LLM, takie jak wyszukiwanie w internecie lub wykonywanie oblicze艅 naukowych',
+      enabled: 'W艂膮czone',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/pl-PL/app-log.ts b/i18n/pl-PL/app-log.ts
new file mode 100644
index 0000000..02f92e6
--- /dev/null
+++ b/i18n/pl-PL/app-log.ts
@@ -0,0 +1,102 @@
+const translation = {
+  title: 'Dzienniki',
+  description:
+    'Dzienniki rejestruj膮 stan dzia艂ania aplikacji, w tym dane wej艣ciowe u偶ytkownik贸w i odpowiedzi AI.',
+  dateTimeFormat: 'DD/MM/YYYY HH:mm',
+  table: {
+    header: {
+      updatedTime: 'Czas aktualizacji',
+      time: 'Czas utworzenia',
+      endUser: 'U偶ytkownik ko艅cowy lub konto',
+      input: 'Wej艣cie',
+      output: 'Wyj艣cie',
+      summary: 'Tytu艂',
+      messageCount: 'Liczba wiadomo艣ci',
+      userRate: 'Ocena u偶ytkownika',
+      adminRate: 'Ocena operatora',
+      startTime: 'CZAS STARTU',
+      status: 'STATUS',
+      runtime: 'CZAS DZIA艁ANIA',
+      tokens: 'TOKENY',
+      user: 'U呕YTKOWNIK KO艃COWY LUB KONTO',
+      version: 'WERSJA',
+    },
+    pagination: {
+      previous: 'Poprzedni',
+      next: 'Nast臋pny',
+    },
+    empty: {
+      noChat: 'Brak rozmowy',
+      noOutput: 'Brak wynik贸w',
+      element: {
+        title: 'Czy kto艣 jest?',
+        content:
+          'Obserwuj i adnotuj interakcje mi臋dzy u偶ytkownikami ko艅cowymi a aplikacjami AI tutaj, aby ci膮gle poprawia膰 dok艂adno艣膰 AI. Mo偶esz spr贸bowa膰 <shareLink>udost臋pni膰</shareLink> lub <testLink>przetestowa膰</testLink> aplikacj臋 internetow膮 samodzielnie, a nast臋pnie wr贸ci膰 na t臋 stron臋.',
+      },
+    },
+  },
+  detail: {
+    time: 'Czas',
+    conversationId: 'ID rozmowy',
+    promptTemplate: 'Szablon monitu',
+    promptTemplateBeforeChat:
+      'Szablon monitu przed rozmow膮 路 Jako wiadomo艣膰 systemowa',
+    annotationTip: 'Usprawnienia oznaczone przez {{user}}',
+    timeConsuming: '',
+    second: 's',
+    tokenCost: 'Wydatkowane tokeny',
+    loading: '艂adowanie',
+    operation: {
+      like: 'lubi臋',
+      dislike: 'nie lubi臋',
+      addAnnotation: 'Dodaj usprawnienie',
+      editAnnotation: 'Edytuj usprawnienie',
+      annotationPlaceholder:
+        'Wprowad藕 oczekiwan膮 odpowied藕, kt贸r膮 chcesz, aby AI odpowiedzia艂o, co mo偶e by膰 u偶ywane do dok艂adnego dostrojenia modelu i ci膮g艂ej poprawy jako艣ci generacji tekstu w przysz艂o艣ci.',
+    },
+    variables: 'Zmienne',
+    uploadImages: 'Przes艂ane obrazy',
+    modelParams: 'Parametry modelu',
+  },
+  filter: {
+    period: {
+      today: 'Dzisiaj',
+      last7days: 'Ostatnie 7 dni',
+      last4weeks: 'Ostatnie 4 tygodnie',
+      last3months: 'Ostatnie 3 miesi膮ce',
+      last12months: 'Ostatnie 12 miesi臋cy',
+      monthToDate: 'Od pocz膮tku miesi膮ca',
+      quarterToDate: 'Od pocz膮tku kwarta艂u',
+      yearToDate: 'Od pocz膮tku roku',
+      allTime: 'Ca艂y czas',
+    },
+    annotation: {
+      all: 'Wszystkie',
+      annotated: 'Zanotowane usprawnienia ({{count}} element贸w)',
+      not_annotated: 'Nie zanotowane',
+    },
+    sortBy: 'Sortuj wed艂ug:',
+    descending: 'malej膮co',
+    ascending: 'rosn膮co',
+  },
+  workflowTitle: 'Dzienniki przep艂ywu pracy',
+  workflowSubtitle: 'Dziennik zarejestrowa艂 operacj臋 Automatyzacji.',
+  runDetail: {
+    title: 'Dziennik rozmowy',
+    workflowTitle: 'Szczeg贸艂 dziennika',
+    fileListDetail: 'Detal',
+    fileListLabel: 'Szczeg贸艂y pliku',
+  },
+  promptLog: 'Dziennik monit贸w',
+  agentLog: 'Dziennik agenta',
+  viewLog: 'Zobacz dziennik',
+  agentLogDetail: {
+    agentMode: 'Tryb agenta',
+    toolUsed: 'U偶yte narz臋dzia',
+    iterations: 'Iteracje',
+    iteration: 'Iteracja',
+    finalProcessing: 'Ko艅cowa obr贸bka',
+  },
+}
+
+export default translation
diff --git a/i18n/pl-PL/app-overview.ts b/i18n/pl-PL/app-overview.ts
new file mode 100644
index 0000000..7459c0f
--- /dev/null
+++ b/i18n/pl-PL/app-overview.ts
@@ -0,0 +1,191 @@
+const translation = {
+  welcome: {
+    firstStepTip: 'Aby rozpocz膮膰,',
+    enterKeyTip: 'wprowad藕 poni偶ej sw贸j klucz API OpenAI',
+    getKeyTip: 'Pobierz sw贸j klucz API z pulpitu nawigacyjnego OpenAI',
+    placeholder: 'Tw贸j klucz API OpenAI (np. sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: 'Korzystasz z limitu pr贸bnego {{providerName}}.',
+        description:
+          'Limit pr贸bny jest dostarczany do u偶ytku testowego. Zanim wykorzystasz dozwolone wywo艂ania limitu pr贸bnego, skonfiguruj swojego w艂asnego dostawc臋 modelu lub zakup dodatkowy limit.',
+      },
+      exhausted: {
+        title:
+          'Tw贸j limit pr贸bny zosta艂 wyczerpany, prosz臋 skonfiguruj sw贸j klucz API.',
+        description:
+          'Tw贸j limit pr贸bny zosta艂 wyczerpany. Skonfiguruj swojego w艂asnego dostawc臋 modelu lub zakup dodatkowy limit.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: 'Aby rozpocz膮膰,',
+        row2: 'najpierw skonfiguruj swojego dostawc臋 modelu.',
+      },
+    },
+    callTimes: 'Liczba wywo艂a艅',
+    usedToken: 'Zu偶yty token',
+    setAPIBtn: 'Przejd藕 do konfiguracji dostawcy modelu',
+    tryCloud: 'Lub wypr贸buj wersj臋 chmurow膮 Dify z darmowym limitem',
+  },
+  overview: {
+    title: 'Przegl膮d',
+    appInfo: {
+      explanation: 'Gotowa do u偶ycia aplikacja internetowa AI',
+      accessibleAddress: 'Publiczny adres URL',
+      preview: 'Podgl膮d',
+      regenerate: 'Wygeneruj ponownie',
+      regenerateNotice: 'Czy chcesz wygenerowa膰 ponownie publiczny adres URL?',
+      preUseReminder: 'Przed kontynuowaniem w艂膮cz aplikacj臋 WebApp.',
+      settings: {
+        entry: 'Ustawienia',
+        title: 'Ustawienia WebApp',
+        webName: 'Nazwa WebApp',
+        webDesc: 'Opis WebApp',
+        webDescTip:
+          'Ten tekst b臋dzie wy艣wietlany po stronie klienta, zapewniaj膮c podstawowe wskaz贸wki, jak korzysta膰 z aplikacji',
+        webDescPlaceholder: 'Wpisz opis WebApp',
+        language: 'J臋zyk',
+        workflow: {
+          title: 'Kroki przep艂ywu pracy',
+          show: 'Poka偶',
+          hide: 'Ukryj',
+          subTitle: 'Szczeg贸艂y przep艂ywu pracy',
+          showDesc: 'Pokazywanie lub ukrywanie szczeg贸艂贸w przep艂ywu pracy w aplikacji internetowej',
+        },
+        chatColorTheme: 'Motyw kolorystyczny czatu',
+        chatColorThemeDesc: 'Ustaw motyw kolorystyczny czatu',
+        chatColorThemeInverted: 'Odwr贸cony',
+        invalidHexMessage: 'Nieprawid艂owa warto艣膰 heksadecymalna',
+        invalidPrivacyPolicy: 'Nieprawid艂owy link do polityki prywatno艣ci. Prosz臋 u偶y膰 prawid艂owego linku zaczynaj膮cego si臋 od http lub https',
+        more: {
+          entry: 'Poka偶 wi臋cej ustawie艅',
+          copyright: 'Prawa autorskie',
+          copyRightPlaceholder: 'Wprowad藕 nazw臋 autora lub organizacji',
+          privacyPolicy: 'Polityka prywatno艣ci',
+          privacyPolicyPlaceholder: 'Wprowad藕 link do polityki prywatno艣ci',
+          privacyPolicyTip:
+            'Pomaga odwiedzaj膮cym zrozumie膰, jakie dane zbiera aplikacja, zobacz <privacyPolicyLink>Polityk臋 prywatno艣ci Dify</privacyPolicyLink>.',
+          customDisclaimer: 'O艣wiadczenie o ochronie danych',
+          customDisclaimerPlaceholder: 'Wprowad藕 o艣wiadczenie o ochronie danych',
+          customDisclaimerTip: 'Niestandardowy tekst o艣wiadczenia b臋dzie wy艣wietlany po stronie klienta, dostarczaj膮c dodatkowych informacji o aplikacji.',
+          copyrightTip: 'Wy艣wietlanie informacji o prawach autorskich w aplikacji internetowej',
+          copyrightTooltip: 'Uaktualnij do planu Professional lub wy偶szego',
+        },
+        sso: {
+          tooltip: 'Skontaktuj si臋 z administratorem, aby w艂膮czy膰 logowanie jednokrotne w aplikacji internetowej',
+          title: 'Logowanie jednokrotne w aplikacji internetowej',
+          label: 'Uwierzytelnianie logowania jednokrotnego',
+          description: 'Wszyscy u偶ytkownicy musz膮 zalogowa膰 si臋 za pomoc膮 logowania jednokrotnego przed u偶yciem aplikacji internetowej',
+        },
+        modalTip: 'Ustawienia aplikacji internetowej po stronie klienta.',
+      },
+      embedded: {
+        entry: 'Osadzone',
+        title: 'Osad藕 na stronie internetowej',
+        explanation:
+          'Wybierz spos贸b osadzenia aplikacji czatu na swojej stronie internetowej',
+        iframe:
+          'Aby doda膰 aplikacj臋 czatu w dowolnym miejscu na swojej stronie internetowej, dodaj ten kod iframe do swojego kodu HTML.',
+        scripts:
+          'Aby doda膰 aplikacj臋 czatu w prawym dolnym rogu swojej strony internetowej, dodaj ten kod do swojego HTML.',
+        chromePlugin: 'Zainstaluj rozszerzenie Chrome Dify Chatbot',
+        copied: 'Skopiowane',
+        copy: 'Kopiuj',
+      },
+      qrcode: {
+        title: 'Kod QR do udost臋pniania',
+        scan: 'Skanuj aplikacj臋 udost臋pniania',
+        download: 'Pobierz kod QR',
+      },
+      customize: {
+        way: 'spos贸b',
+        entry: 'Dostosuj',
+        title: 'Dostosuj aplikacj臋 internetow膮 AI',
+        explanation:
+          'Mo偶esz dostosowa膰 front aplikacji internetowej do swoich scenariuszy i potrzeb stylowych.',
+        way1: {
+          name: 'Skopiuj kod klienta, zmodyfikuj go i wdro偶 na Vercel (zalecane)',
+          step1: 'Skopiuj kod klienta i zmodyfikuj go',
+          step1Tip:
+            'Kliknij tutaj, aby skopiowa膰 kod 藕r贸d艂owy na swoje konto GitHub i zmodyfikowa膰 kod',
+          step1Operation: 'Dify-WebClient',
+          step2: 'Wdro偶 na Vercel',
+          step2Tip:
+            'Kliknij tutaj, aby zaimportowa膰 repozytorium do Vercel i wdro偶y膰',
+          step2Operation: 'Import repozytorium',
+          step3: 'Konfiguracja zmiennych 艣rodowiskowych',
+          step3Tip: 'Dodaj nast臋puj膮ce zmienne 艣rodowiskowe w Vercel',
+        },
+        way2: {
+          name: 'Napisz kod po stronie klienta, aby wywo艂a膰 API i wdro偶y膰 go na serwerze',
+          operation: 'Dokumentacja',
+        },
+      },
+      launch: 'Uruchomi膰',
+    },
+    apiInfo: {
+      title: 'API us艂ugi w tle',
+      explanation: '艁atwe do zintegrowania z twoj膮 aplikacj膮',
+      accessibleAddress: 'Punkt ko艅cowy API us艂ugi',
+      doc: 'Dokumentacja API',
+    },
+    status: {
+      running: 'W us艂udze',
+      disable: 'Wy艂膮cz',
+    },
+  },
+  analysis: {
+    title: 'Analiza',
+    ms: 'ms',
+    tokenPS: 'Tokeny/s',
+    totalMessages: {
+      title: '艁膮czna liczba wiadomo艣ci',
+      explanation: 'Liczba dziennych interakcji z AI.',
+    },
+    totalConversations: {
+      title: 'Ca艂kowita liczba rozm贸w',
+      explanation: 'Liczba dziennych rozm贸w z AI; in偶ynieria/debugowanie prompt贸w wykluczone.',
+    },
+    activeUsers: {
+      title: 'Aktywni u偶ytkownicy',
+      explanation:
+        'Unikalni u偶ytkownicy uczestnicz膮cy w pytaniach i odpowiedziach z AI; in偶ynieria i debugowanie monit贸w wykluczone.',
+    },
+    tokenUsage: {
+      title: 'Zu偶ycie token贸w',
+      explanation:
+        'Odbija dziennie u偶ywane tokeny modelu j臋zykowego dla aplikacji, przydatne do kontroli koszt贸w.',
+      consumed: 'Zu偶yte',
+    },
+    avgSessionInteractions: {
+      title: '艢r. interakcji w sesji',
+      explanation:
+        'Liczba ci膮g艂ych komunikacji u偶ytkownik-AI; dla aplikacji opartych na rozmowach.',
+    },
+    avgUserInteractions: {
+      title: '艢r. interakcji u偶ytkownika',
+      explanation:
+        'Odbija dzienn膮 cz臋stotliwo艣膰 u偶ytkowania przez u偶ytkownik贸w. Ta metryka odzwierciedla przywi膮zanie u偶ytkownik贸w.',
+    },
+    userSatisfactionRate: {
+      title: 'Wska藕nik zadowolenia u偶ytkownik贸w',
+      explanation:
+        'Liczba polubie艅 na 1000 wiadomo艣ci. Wskazuje to proporcj臋 odpowiedzi, z kt贸rych u偶ytkownicy s膮 bardzo zadowoleni.',
+    },
+    avgResponseTime: {
+      title: '艢r. czas odpowiedzi',
+      explanation:
+        'Czas (ms) potrzebny AI na przetworzenie/odpowied藕; dla aplikacji opartych na tek艣cie.',
+    },
+    tps: {
+      title: 'Szybko艣膰 wydajno艣ci token贸w',
+      explanation:
+        'Mierzy wydajno艣膰 LLM. Liczy szybko艣膰 wydajno艣ci token贸w LLM od pocz膮tku 偶膮dania do zako艅czenia wyj艣cia.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/pl-PL/app.ts b/i18n/pl-PL/app.ts
new file mode 100644
index 0000000..137fdeb
--- /dev/null
+++ b/i18n/pl-PL/app.ts
@@ -0,0 +1,221 @@
+const translation = {
+  createApp: 'UTW脫RZ APLIKACJ臉',
+  types: {
+    all: 'Wszystkie',
+    chatbot: 'Chatbot',
+    agent: 'Agent',
+    workflow: 'Przep艂yw pracy',
+    completion: 'Zako艅czenie',
+    advanced: 'Przep艂yw czatu',
+    basic: 'Podstawowy',
+  },
+  duplicate: 'Duplikuj',
+  duplicateTitle: 'Duplikuj aplikacj臋',
+  export: 'Eksportuj DSL',
+  exportFailed: 'Eksport DSL nie powi贸d艂 si臋.',
+  importDSL: 'Importuj plik DSL',
+  createFromConfigFile: 'Utw贸rz z pliku DSL',
+  deleteAppConfirmTitle: 'Usun膮膰 t臋 aplikacj臋?',
+  deleteAppConfirmContent:
+    'Usuni臋cie aplikacji jest nieodwracalne. U偶ytkownicy nie b臋d膮 mieli ju偶 dost臋pu do twojej aplikacji, a wszystkie konfiguracje monit贸w i dzienniki zostan膮 trwale usuni臋te.',
+  appDeleted: 'Aplikacja usuni臋ta',
+  appDeleteFailed: 'Nie uda艂o si臋 usun膮膰 aplikacji',
+  join: 'Do艂膮cz do spo艂eczno艣ci',
+  communityIntro:
+    'Dyskutuj z cz艂onkami zespo艂u, wsp贸艂tw贸rcami i deweloperami na r贸偶nych kana艂ach.',
+  roadmap: 'Zobacz nasz膮 map臋 drogow膮',
+  newApp: {
+    startFromBlank: 'Utw贸rz od podstaw',
+    startFromTemplate: 'Utw贸rz z szablonu',
+    captionAppType: 'Jaki typ aplikacji chcesz stworzy膰?',
+    chatbotDescription:
+      'Zbuduj aplikacj臋 opart膮 na czacie. Ta aplikacja u偶ywa formatu pyta艅 i odpowiedzi, umo偶liwiaj膮c wielokrotne rundy ci膮g艂ej konwersacji.',
+    completionDescription:
+      'Zbuduj aplikacj臋 generuj膮c膮 teksty wysokiej jako艣ci na podstawie monit贸w, takich jak generowanie artyku艂贸w, streszcze艅, t艂umacze艅 i innych.',
+    completionWarning: 'Ten typ aplikacji nie b臋dzie ju偶 obs艂ugiwany.',
+    agentDescription:
+      'Zbuduj inteligentnego agenta, kt贸ry mo偶e autonomicznie wybiera膰 narz臋dzia do wykonywania zada艅',
+    workflowDescription:
+      'Zbuduj aplikacj臋, kt贸ra w oparciu o przep艂yw pracy generuje teksty wysokiej jako艣ci z du偶膮 mo偶liwo艣ci膮 dostosowania. Jest odpowiednia dla do艣wiadczonych u偶ytkownik贸w.',
+    workflowWarning: 'Obecnie w fazie beta',
+    chatbotType: 'Metoda orkiestracji chatbota',
+    basic: 'Podstawowy',
+    basicTip: 'Dla pocz膮tkuj膮cych, mo偶na prze艂膮czy膰 si臋 p贸藕niej na Chatflow',
+    basicFor: 'Dla pocz膮tkuj膮cych',
+    basicDescription:
+      'Podstawowa orkiestracja pozwala na skonfigurowanie aplikacji Chatbot za pomoc膮 prostych ustawie艅, bez mo偶liwo艣ci modyfikacji wbudowanych monit贸w. Jest odpowiednia dla pocz膮tkuj膮cych.',
+    advanced: 'Chatflow',
+    advancedFor: 'Dla zaawansowanych u偶ytkownik贸w',
+    advancedDescription:
+      'Orkiestracja przep艂ywu pracy organizuje Chatboty w formie przep艂yw贸w pracy, oferuj膮c wysoki stopie艅 dostosowania, w tym mo偶liwo艣膰 edycji wbudowanych monit贸w. Jest odpowiednia dla do艣wiadczonych u偶ytkownik贸w.',
+    captionName: 'Ikona i nazwa aplikacji',
+    appNamePlaceholder: 'Podaj nazw臋 swojej aplikacji',
+    captionDescription: 'Opis',
+    appDescriptionPlaceholder: 'Wprowad藕 opis aplikacji',
+    useTemplate: 'U偶yj tego szablonu',
+    previewDemo: 'Podgl膮d demo',
+    chatApp: 'Asystent',
+    chatAppIntro:
+      'Chc臋 zbudowa膰 aplikacj臋 opart膮 na czacie. Ta aplikacja u偶ywa formatu pyta艅 i odpowiedzi, umo偶liwiaj膮c wielokrotne rundy ci膮g艂ej konwersacji.',
+    agentAssistant: 'Nowy asystent agenta',
+    completeApp: 'Generator tekstu',
+    completeAppIntro:
+      'Chc臋 stworzy膰 aplikacj臋, kt贸ra generuje teksty wysokiej jako艣ci na podstawie monit贸w, takich jak generowanie artyku艂贸w, streszcze艅, t艂umacze艅 i innych.',
+    showTemplates: 'Chc臋 wybra膰 z szablonu',
+    hideTemplates: 'Wr贸膰 do wyboru trybu',
+    Create: 'Utw贸rz',
+    Cancel: 'Anuluj',
+    nameNotEmpty: 'Nazwa nie mo偶e by膰 pusta',
+    appTemplateNotSelected: 'Prosz臋 wybra膰 szablon',
+    appTypeRequired: 'Prosz臋 wybra膰 typ aplikacji',
+    appCreated: 'Aplikacja utworzona',
+    appCreateFailed: 'Nie uda艂o si臋 utworzy膰 aplikacji',
+    appCreateDSLErrorPart3: 'Aktualna wersja aplikacji DSL:',
+    appCreateDSLErrorPart2: 'Czy chcesz kontynuowa膰?',
+    Confirm: 'Potwierdzi膰',
+    caution: 'Ostro偶no艣膰',
+    appCreateDSLWarning: 'Przestroga: R贸偶nica w wersji DSL mo偶e mie膰 wp艂yw na niekt贸re funkcje',
+    appCreateDSLErrorTitle: 'Niezgodno艣膰 wersji',
+    appCreateDSLErrorPart4: 'Wersja DSL obs艂ugiwana przez system:',
+    appCreateDSLErrorPart1: 'Wykryto istotn膮 r贸偶nic臋 w wersjach DSL. Wymuszenie importu mo偶e spowodowa膰 nieprawid艂owe dzia艂anie aplikacji.',
+    noTemplateFoundTip: 'Spr贸buj wyszuka膰 za pomoc膮 r贸偶nych s艂贸w kluczowych.',
+    noAppsFound: 'Nie znaleziono aplikacji',
+    foundResults: '{{liczba}} Wyniki',
+    noTemplateFound: 'Nie znaleziono szablon贸w',
+    chatbotUserDescription: 'Szybko zbuduj chatbota opartego na LLM z prost膮 konfiguracj膮. Mo偶esz prze艂膮czy膰 si臋 na Chatflow p贸藕niej.',
+    optional: 'Fakultatywny',
+    workflowUserDescription: 'Orkiestracja przep艂ywu pracy dla zada艅 jednoetapowych, takich jak automatyzacja i przetwarzanie wsadowe.',
+    completionUserDescription: 'Szybko zbuduj asystenta AI do zada艅 generowania tekstu za pomoc膮 prostej konfiguracji.',
+    forBeginners: 'DLA POCZ膭TKUJ膭CYCH',
+    agentShortDescription: 'Inteligentny agent z rozumowaniem i autonomicznym wykorzystaniem narz臋dzi',
+    completionShortDescription: 'Asystent AI do zada艅 generowania tekstu',
+    noIdeaTip: 'Nie masz pomys艂贸w? Sprawd藕 nasze szablony',
+    forAdvanced: 'DLA ZAAWANSOWANYCH U呕YTKOWNIK脫W',
+    foundResult: '{{liczba}} Wynik',
+    advancedShortDescription: 'Przep艂yw pracy dla z艂o偶onych, wieloetapowych dialog贸w z pami臋ci膮',
+    learnMore: 'Dowiedz si臋 wi臋cej',
+    chatbotShortDescription: 'Chatbot oparty na LLM z prost膮 konfiguracj膮',
+    chooseAppType: 'Wybierz typ aplikacji',
+    agentUserDescription: 'Inteligentny agent zdolny do iteracyjnego wnioskowania i autonomicznego wykorzystania narz臋dzi do osi膮gania cel贸w zada艅.',
+    workflowShortDescription: 'Orkiestracja dla jednoetapowych zada艅 automatyzacji',
+    advancedUserDescription: 'Orkiestracja przep艂ywu pracy dla wielorundowych, z艂o偶onych zada艅 dialogowych z funkcjami pami臋ci.',
+  },
+  editApp: 'Edytuj informacje',
+  editAppTitle: 'Edytuj informacje o aplikacji',
+  editDone: 'Informacje o aplikacji zaktualizowane',
+  editFailed: 'Nie uda艂o si臋 zaktualizowa膰 informacji o aplikacji',
+  iconPicker: {
+    ok: 'OK',
+    cancel: 'Anuluj',
+    emoji: 'Emoji',
+    image: 'Obraz',
+  },
+  switch: 'Prze艂膮cz na Orkiestracj臋 Przep艂ywu Pracy',
+  switchTipStart:
+    'Dla ciebie zostanie utworzona nowa kopia aplikacji, a nowa kopia prze艂膮czy si臋 na Orkiestracj臋 Przep艂ywu Pracy. Nowa kopia b臋dzie ',
+  switchTip: 'nie pozwoli',
+  switchTipEnd: ' na powr贸t do Podstawowej Orkiestracji.',
+  switchLabel: 'Kopia aplikacji do utworzenia',
+  removeOriginal: 'Usu艅 oryginaln膮 aplikacj臋',
+  switchStart: 'Rozpocznij prze艂膮czanie',
+  typeSelector: {
+    all: 'WSZYSTKIE Typy',
+    chatbot: 'Chatbot',
+    agent: 'Agent',
+    workflow: 'Przep艂yw pracy',
+    completion: 'Zako艅czenie',
+    advanced: 'Przep艂yw czatu',
+  },
+  tracing: {
+    title: '艢ledzenie wydajno艣ci aplikacji',
+    description: 'Konfiguracja zewn臋trznego dostawcy LLMOps i 艣ledzenie wydajno艣ci aplikacji.',
+    config: 'Konfiguruj',
+    collapse: 'Zwi艅',
+    expand: 'Rozwi艅',
+    tracing: '艢ledzenie',
+    disabled: 'Wy艂膮czone',
+    disabledTip: 'Najpierw skonfiguruj dostawc臋',
+    enabled: 'W u偶yciu',
+    tracingDescription: 'Przechwytywanie pe艂nego kontekstu wykonania aplikacji, w tym wywo艂a艅 LLM, kontekstu, prompt贸w, 偶膮da艅 HTTP i wi臋cej, do platformy 艣ledzenia stron trzecich.',
+    configProviderTitle: {
+      configured: 'Skonfigurowano',
+      notConfigured: 'Skonfiguruj dostawc臋, aby w艂膮czy膰 艣ledzenie',
+      moreProvider: 'Wi臋cej dostawc贸w',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: 'Kompleksowa platforma deweloperska dla ka偶dego etapu cyklu 偶ycia aplikacji opartej na LLM.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: '艢ledzenie, oceny, zarz膮dzanie promptami i metryki do debugowania i ulepszania twojej aplikacji LLM.',
+    },
+    inUse: 'W u偶yciu',
+    configProvider: {
+      title: 'Konfiguruj ',
+      placeholder: 'Wprowad藕 sw贸j {{key}}',
+      project: 'Projekt',
+      publicKey: 'Klucz publiczny',
+      secretKey: 'Klucz tajny',
+      viewDocsLink: 'Zobacz dokumentacj臋 {{key}}',
+      removeConfirmTitle: 'Usun膮膰 konfiguracj臋 {{key}}?',
+      removeConfirmContent: 'Obecna konfiguracja jest w u偶yciu, jej usuni臋cie wy艂膮czy funkcj臋 艢ledzenia.',
+    },
+    view: 'Widok',
+    opik: {
+      description: 'Opik to platforma typu open source do oceny, testowania i monitorowania aplikacji LLM.',
+      title: 'Opik',
+    },
+    weave: {
+      title: 'Tkaj',
+      description: 'Weave to platforma open-source do oceny, testowania i monitorowania aplikacji LLM.',
+    },
+  },
+  answerIcon: {
+    description: 'Czy w aplikacji udost臋pnionej ma by膰 u偶ywana ikona aplikacji internetowej do zamiany 馃.',
+    title: 'U偶yj ikony WebApp, aby zast膮pi膰 馃',
+    descriptionInExplore: 'Czy u偶ywa膰 ikony aplikacji internetowej do zast臋powania 馃 w Eksploruj',
+  },
+  importFromDSL: 'Importowanie z DSL',
+  importFromDSLUrl: 'Z adresu URL',
+  importFromDSLFile: 'Z pliku DSL',
+  importFromDSLUrlPlaceholder: 'Wklej tutaj link DSL',
+  mermaid: {
+    handDrawn: 'R臋cznie rysowane',
+    classic: 'Klasyczny',
+  },
+  openInExplore: 'Otwieranie w obszarze Eksploruj',
+  newAppFromTemplate: {
+    sidebar: {
+      Recommended: 'Zalecane',
+      Assistant: 'Asystent',
+      Writing: 'Pismo',
+      Programming: 'Programowanie',
+      Workflow: 'Przep艂yw pracy',
+      Agent: 'Agent',
+      HR: 'HR',
+    },
+    searchAllTemplate: 'Przeszukaj wszystkie szablony...',
+    byCategories: 'WED艁UG KATEGORII',
+  },
+  showMyCreatedAppsOnly: 'Poka偶 tylko moje utworzone aplikacje',
+  appSelector: {
+    params: 'PARAMETRY APLIKACJI',
+    noParams: 'Nie s膮 potrzebne 偶adne parametry',
+    placeholder: 'Wybierz aplikacj臋...',
+    label: 'Aplikacja',
+  },
+  structOutput: {
+    structured: 'Ustrukturyzowany',
+    LLMResponse: 'Odpowied藕 LLM',
+    notConfiguredTip: 'Strukturalne wyj艣cie nie zosta艂o jeszcze skonfigurowane',
+    structuredTip: 'Strukturalne wyniki to funkcja, kt贸ra zapewnia, 偶e model zawsze generuje odpowiedzi zgodne z dostarczonym schematem JSON.',
+    moreFillTip: 'Pokazuj膮c maksymalnie 10 poziom贸w zagnie偶d偶enia',
+    configure: 'Konfiguruj',
+    required: 'Wymagane',
+    modelNotSupported: 'Model nie jest obs艂ugiwany',
+    modelNotSupportedTip: 'Aktualny model nie obs艂uguje tej funkcji i zostaje automatycznie obni偶ony do wstrzykni臋cia zapytania.',
+  },
+}
+
+export default translation
diff --git a/i18n/pl-PL/billing.ts b/i18n/pl-PL/billing.ts
new file mode 100644
index 0000000..0028410
--- /dev/null
+++ b/i18n/pl-PL/billing.ts
@@ -0,0 +1,212 @@
+const translation = {
+  currentPlan: 'Obecny plan',
+  upgradeBtn: {
+    plain: 'Ulepsz plan',
+    encourage: 'Ulepsz teraz',
+    encourageShort: 'Ulepsz',
+  },
+  viewBilling: 'Zarz膮dzaj rozliczeniami i subskrypcjami',
+  buyPermissionDeniedTip:
+    'Skontaktuj si臋 z administratorem swojej firmy, aby zasubskrybowa膰',
+  plansCommon: {
+    title: 'Wybierz plan odpowiedni dla siebie',
+    yearlyTip: 'Otrzymaj 2 miesi膮ce za darmo, subskrybuj膮c rocznie!',
+    mostPopular: 'Najpopularniejszy',
+    planRange: {
+      monthly: 'Miesi臋czny',
+      yearly: 'Roczny',
+    },
+    month: 'miesi膮c',
+    year: 'rok',
+    save: 'Oszcz臋d藕 ',
+    free: 'Darmowy',
+    currentPlan: 'Obecny plan',
+    contractSales: 'Skontaktuj si臋 z dzia艂em sprzeda偶y',
+    contractOwner: 'Skontaktuj si臋 z zarz膮dc膮 zespo艂u',
+    startForFree: 'Zacznij za darmo',
+    getStartedWith: 'Rozpocznij z ',
+    contactSales: 'Kontakt z dzia艂em sprzeda偶y',
+    talkToSales: 'Porozmawiaj z dzia艂em sprzeda偶y',
+    modelProviders: 'Dostawcy modeli',
+    teamMembers: 'Cz艂onkowie zespo艂u',
+    buildApps: 'Tw贸rz aplikacje',
+    vectorSpace: 'Przestrze艅 wektorowa',
+    vectorSpaceBillingTooltip:
+      'Ka偶dy 1MB mo偶e przechowywa膰 oko艂o 1,2 miliona znak贸w z wektoryzowanych danych (szacowane na podstawie OpenAI Embeddings, r贸偶ni si臋 w zale偶no艣ci od modelu).',
+    vectorSpaceTooltip:
+      'Przestrze艅 wektorowa jest systemem pami臋ci d艂ugoterminowej wymaganym dla LLM, aby zrozumie膰 Twoje dane.',
+    documentsUploadQuota: 'Limit przesy艂anych dokument贸w',
+    documentProcessingPriority: 'Priorytet przetwarzania dokument贸w',
+    documentProcessingPriorityTip:
+      'Dla wy偶szego priorytetu przetwarzania dokument贸w, ulepsz sw贸j plan.',
+    documentProcessingPriorityUpgrade:
+      'Przetwarzaj wi臋cej danych z wi臋ksz膮 dok艂adno艣ci膮 i w szybszym tempie.',
+    priority: {
+      'standard': 'Standardowy',
+      'priority': 'Priorytetowy',
+      'top-priority': 'Najwy偶szy priorytet',
+    },
+    logsHistory: 'Historia log贸w',
+    customTools: 'Niestandardowe narz臋dzia',
+    unavailable: 'Niedost臋pne',
+    days: 'dni',
+    unlimited: 'Nieograniczony',
+    support: 'Wsparcie',
+    supportItems: {
+      communityForums: 'Forum spo艂eczno艣ciowe',
+      emailSupport: 'Wsparcie mailowe',
+      priorityEmail: 'Priorytetowa pomoc mailowa i czat',
+      logoChange: 'Zmiana logo',
+      SSOAuthentication: 'Uwierzytelnianie SSO',
+      personalizedSupport: 'Personalizowane wsparcie',
+      dedicatedAPISupport: 'Dedykowane wsparcie API',
+      customIntegration: 'Niestandardowa integracja i wsparcie',
+      ragAPIRequest: '呕膮dania API RAG',
+      bulkUpload: 'Masowe przesy艂anie dokument贸w',
+      agentMode: 'Tryb agenta',
+      workflow: 'Przep艂yw pracy',
+      llmLoadingBalancing: 'R贸wnowa偶enie obci膮偶enia LLM',
+      llmLoadingBalancingTooltip: 'Dodaj wiele kluczy API do modeli, skutecznie omijaj膮c limity szybko艣ci interfejsu API.',
+    },
+    comingSoon: 'Wkr贸tce dost臋pne',
+    member: 'Cz艂onek',
+    memberAfter: 'Cz艂onek',
+    messageRequest: {
+      title: 'Limity kredyt贸w wiadomo艣ci',
+      tooltip:
+        'Limity wywo艂a艅 wiadomo艣ci dla r贸偶nych plan贸w u偶ywaj膮cych modeli OpenAI (z wyj膮tkiem gpt4). Wiadomo艣ci przekraczaj膮ce limit b臋d膮 korzysta膰 z twojego klucza API OpenAI.',
+      titlePerMonth: '{{count,number}} wiadomo艣ci/miesi膮c',
+    },
+    annotatedResponse: {
+      title: 'Limity kredyt贸w na adnotacje',
+      tooltip:
+        'R臋czna edycja i adnotacja odpowiedzi zapewniaj膮 mo偶liwo艣膰 dostosowania wysokiej jako艣ci odpowiedzi na pytania dla aplikacji. (Stosowane tylko w aplikacjach czatowych)',
+    },
+    ragAPIRequestTooltip:
+      'Odnosi si臋 do liczby wywo艂a艅 API wykorzystuj膮cych tylko zdolno艣ci przetwarzania bazy wiedzy Dify.',
+    receiptInfo:
+      'Tylko w艂a艣ciciel zespo艂u i administrator zespo艂u mog膮 subskrybowa膰 i przegl膮da膰 informacje o rozliczeniach',
+    annotationQuota: 'Przydzia艂 adnotacji',
+    documents: '{{count,number}} Dokument贸w Wiedzy',
+    apiRateLimit: 'Limit liczby wywo艂a艅 API',
+    documentsTooltip: 'Kwota dotycz膮ca liczby dokument贸w importowanych z 殴r贸d艂a Danych Wiedzy.',
+    unlimitedApiRate: 'Brak limitu liczby zapyta艅 API',
+    annualBilling: 'Roczne rozliczenie',
+    getStarted: 'Zacznij',
+    freeTrialTip: 'bezp艂atny okres pr贸bny 200 wywo艂a艅 OpenAI.',
+    comparePlanAndFeatures: 'Por贸wnaj plany i funkcje',
+    freeTrialTipPrefix: 'Zarejestruj si臋 i zdob膮d藕',
+    teamMember_other: '{{count,number}} cz艂onk贸w zespo艂u',
+    teamWorkspace: '{{count,number}} Zesp贸艂 Workspace',
+    apiRateLimitUnit: '{{count,number}}/dzie艅',
+    cloud: 'Us艂uga chmurowa',
+    teamMember_one: '{{count,number}} Cz艂onek zespo艂u',
+    priceTip: 'na przestrze艅 robocz膮/',
+    self: 'Samo-hostowane',
+    apiRateLimitTooltip: 'Limit aktywno艣ci API dotyczy wszystkich 偶膮da艅 sk艂adanych za po艣rednictwem API Dify, w tym generowania tekstu, rozm贸w czatowych, wykonywania przep艂yw贸w pracy i przetwarzania dokument贸w.',
+    freeTrialTipSuffix: 'Nie jest wymagana karta kredytowa',
+    documentsRequestQuota: '{{count,number}}/min Limit wiedzy na 偶膮danie',
+    documentsRequestQuotaTooltip: 'Okre艣la ca艂kowit膮 liczb臋 dzia艂a艅, jakie przestrze艅 robocza mo偶e wykona膰 na minut臋 w ramach bazy wiedzy, w tym tworzenie zbior贸w danych, usuwanie, aktualizacje, przesy艂anie dokument贸w, modyfikacje, archiwizowanie i zapytania do bazy wiedzy. Ta metryka jest u偶ywana do oceny wydajno艣ci zapyta艅 do bazy wiedzy. Na przyk艂ad, je艣li u偶ytkownik Sandbox wykona 10 kolejnych test贸w w ci膮gu jednej minuty, jego przestrze艅 robocza zostanie tymczasowo ograniczona w wykonywaniu nast臋puj膮cych dzia艂a艅 przez nast臋pn膮 minut臋: tworzenie zbior贸w danych, usuwanie, aktualizacje oraz przesy艂anie lub modyfikacje dokument贸w.',
+  },
+  plans: {
+    sandbox: {
+      name: 'Sandbox',
+      description: '200 razy darmowa pr贸ba GPT',
+      includesTitle: 'Zawiera:',
+      for: 'Darmowy okres pr贸bny podstawowych funkcji',
+    },
+    professional: {
+      name: 'Profesjonalny',
+      description:
+        'Dla os贸b fizycznych i ma艂ych zespo艂贸w, aby odblokowa膰 wi臋cej mocy w przyst臋pnej cenie.',
+      includesTitle: 'Wszystko w darmowym planie, plus:',
+      for: 'Dla niezale偶nych deweloper贸w/ma艂ych zespo艂贸w',
+    },
+    team: {
+      name: 'Zesp贸艂',
+      description:
+        'Wsp贸艂pracuj bez ogranicze艅 i ciesz si臋 najwy偶sz膮 wydajno艣ci膮.',
+      includesTitle: 'Wszystko w planie Profesjonalnym, plus:',
+      for: 'Dla 艣redniej wielko艣ci zespo艂贸w',
+    },
+    enterprise: {
+      name: 'Przedsi臋biorstwo',
+      description:
+        'Uzyskaj pe艂ne mo偶liwo艣ci i wsparcie dla system贸w o kluczowym znaczeniu dla misji.',
+      includesTitle: 'Wszystko w planie Zespo艂owym, plus:',
+      features: {
+        3: 'Wiele przestrzeni roboczych i zarz膮dzanie przedsi臋biorstwem',
+        5: 'Wynegocjowane SLA przez Dify Partners',
+        0: 'Rozwi膮zania do wdro偶e艅 na du偶膮 skal臋 klasy przedsi臋biorstw',
+        8: 'Profesjonalne wsparcie techniczne',
+        2: 'Ekskluzywne funkcje przedsi臋biorstwa',
+        6: 'Zaawansowane zabezpieczenia i kontrola',
+        7: 'Aktualizacje i konserwacja przez Dify Oficjalnie',
+        4: 'SSO',
+        1: 'Autoryzacja licencji komercyjnej',
+      },
+      priceTip: 'Tylko roczne fakturowanie',
+      btnText: 'Skontaktuj si臋 z dzia艂em sprzeda偶y',
+      for: 'Dla du偶ych zespo艂贸w',
+      price: 'Niestety, nie mog臋 przet艂umaczy膰 tego tekstu bez konkretnego zdania do przet艂umaczenia.',
+    },
+    community: {
+      features: {
+        0: 'Wszystkie funkcje podstawowe wydane w publicznym repozytorium',
+        1: 'Jedno Miejsce Pracy',
+        2: 'Zgodne z licencj膮 Dify Open Source',
+      },
+      includesTitle: 'Darmowe funkcje:',
+      name: 'Spo艂eczno艣膰',
+      price: 'Darmowy',
+      description: 'Dla u偶ytkownik贸w indywidualnych, ma艂ych zespo艂贸w lub projekt贸w niekomercyjnych',
+      btnText: 'Rozpocznij prac臋 z spo艂eczno艣ci膮',
+      for: 'Dla u偶ytkownik贸w indywidualnych, ma艂ych zespo艂贸w lub projekt贸w niekomercyjnych',
+    },
+    premium: {
+      features: {
+        0: 'Samozarz膮dzana niezawodno艣膰 r贸偶nych dostawc贸w chmury',
+        1: 'Jedno miejsce pracy',
+        3: 'Priorytetowe wsparcie przez e-mail i czat',
+        2: 'Logo aplikacji internetowej i dostosowanie marki',
+      },
+      description: 'Dla 艣rednich organizacji i zespo艂贸w',
+      for: 'Dla 艣rednich organizacji i zespo艂贸w',
+      name: 'Premium',
+      priceTip: 'Oparte na rynku chmurowym',
+      btnText: 'Uzyskaj premium w',
+      price: 'Skalowalny',
+      comingSoon: 'Wsparcie dla Microsoft Azure i Google Cloud wkr贸tce dost臋pne',
+      includesTitle: 'Wszystko z Community, plus:',
+    },
+  },
+  vectorSpace: {
+    fullTip: 'Przestrze艅 wektorowa jest pe艂na.',
+    fullSolution: 'Ulepsz sw贸j plan, aby uzyska膰 wi臋cej miejsca.',
+  },
+  apps: {
+    fullTipLine1: 'Ulepsz sw贸j plan, aby',
+    fullTipLine2: 'tworzy膰 wi臋cej aplikacji.',
+    fullTip1des: 'Osi膮gn膮艂e艣 limit tworzenia aplikacji w tym planie.',
+    fullTip1: 'Zaktualizuj, aby stworzy膰 wi臋cej aplikacji',
+    fullTip2: 'Osi膮gni臋to limit planu',
+    contactUs: 'Skontaktuj si臋 z nami',
+    fullTip2des: 'Zaleca si臋 usuni臋cie nieaktywnych aplikacji, aby zwolni膰 miejsce, lub skontaktowanie si臋 z nami.',
+  },
+  annotatedResponse: {
+    fullTipLine1: 'Ulepsz sw贸j plan, aby',
+    fullTipLine2: 'adnotowa膰 wi臋cej rozm贸w.',
+    quotaTitle: 'Limit adnotacji odpowiedzi',
+  },
+  usagePage: {
+    vectorSpace: 'Magazynowanie danych wiedzy',
+    teamMembers: 'Cz艂onkowie zespo艂u',
+    documentsUploadQuota: 'Limit przesy艂ania dokument贸w',
+    buildApps: 'Tw贸rz aplikacje',
+    annotationQuota: 'Kwota aneksji',
+    vectorSpaceTooltip: 'Dokumenty z trybem indeksowania o wysokiej jako艣ci b臋d膮 zu偶ywa膰 zasoby magazynu danych wiedzy. Gdy magazyn danych wiedzy osi膮gnie limit, nowe dokumenty nie b臋d膮 przesy艂ane.',
+  },
+  teamMembers: 'Cz艂onkowie zespo艂u',
+}
+
+export default translation
diff --git a/i18n/pl-PL/common.ts b/i18n/pl-PL/common.ts
new file mode 100644
index 0000000..fb94c8c
--- /dev/null
+++ b/i18n/pl-PL/common.ts
@@ -0,0 +1,690 @@
+const translation = {
+  api: {
+    success: 'Sukces',
+    actionSuccess: 'Akcja powiod艂a si臋',
+    saved: 'Zapisane',
+    create: 'Utworzono',
+    remove: 'Usuni臋to',
+  },
+  operation: {
+    create: 'Utw贸rz',
+    confirm: 'Potwierd藕',
+    cancel: 'Anuluj',
+    clear: 'Wyczy艣膰',
+    save: 'Zapisz',
+    saveAndEnable: 'Zapisz i W艂膮cz',
+    edit: 'Edytuj',
+    add: 'Dodaj',
+    added: 'Dodano',
+    refresh: 'Od艣wie偶',
+    reset: 'Resetuj',
+    search: 'Szukaj',
+    change: 'Zmie艅',
+    remove: 'Usu艅',
+    send: 'Wy艣lij',
+    copy: 'Kopiuj',
+    lineBreak: 'Z艂amanie linii',
+    sure: 'Jestem pewien',
+    download: 'Pobierz',
+    delete: 'Usu艅',
+    settings: 'Ustawienia',
+    setup: 'Konfiguruj',
+    getForFree: 'Zdob膮d藕 za darmo',
+    reload: 'Prze艂aduj',
+    ok: 'OK',
+    log: 'Dziennik',
+    learnMore: 'Dowiedz si臋 wi臋cej',
+    params: 'Parametry',
+    duplicate: 'Duplikuj',
+    rename: 'Zmie艅 nazw臋',
+    audioSourceUnavailable: 'AudioSource jest niedost臋pny',
+    copyImage: 'Kopiuj obraz',
+    openInNewTab: 'Otw贸rz w nowej karcie',
+    zoomIn: 'Powi臋kszenie',
+    zoomOut: 'Pomniejszanie',
+    saveAndRegenerate: 'Zapisywanie i regeneracja fragment贸w podrz臋dnych',
+    view: 'Widok',
+    regenerate: 'Ponownie wygenerowa膰',
+    viewMore: 'ZOBACZ WI臉CEJ',
+    close: 'Zamyka膰',
+    submit: 'Prze艣lij',
+    skip: 'Statek',
+    imageCopied: 'Skopiowany obraz',
+    deleteApp: 'Usu艅 aplikacj臋',
+    copied: 'Kopiowane',
+    in: 'w',
+    viewDetails: 'Wy艣wietl szczeg贸艂y',
+    format: 'Format',
+    downloadFailed: 'Pobieranie nie powiod艂o si臋. Prosz臋 spr贸bowa膰 ponownie p贸藕niej.',
+    more: 'Wi臋cej',
+    downloadSuccess: 'Pobieranie zako艅czone.',
+  },
+  placeholder: {
+    input: 'Prosz臋 wprowadzi膰',
+    select: 'Prosz臋 wybra膰',
+  },
+  voice: {
+    language: {
+      zhHans: 'Chi艅ski',
+      zhHant: 'Chi艅ski tradycyjny',
+      enUS: 'Angielski',
+      deDE: 'Niemiecki',
+      frFR: 'Francuski',
+      esES: 'Hiszpa艅ski',
+      itIT: 'W艂oski',
+      thTH: 'Tajski',
+      idID: 'Indonezyjski',
+      jaJP: 'Japo艅ski',
+      koKR: 'Korea艅ski',
+      ptBR: 'Portugalski',
+      ruRU: 'Rosyjski',
+      ukUA: 'Ukrai艅ski',
+      viVN: 'Wietnamski',
+      plPL: 'Polski',
+      roRO: 'Rumu艅ski',
+      hiIN: 'Hindi',
+      trTR: 'Turecki',
+      faIR: 'Perski',
+    },
+  },
+  unit: {
+    char: 'znaki',
+  },
+  actionMsg: {
+    noModification: 'W tej chwili brak zmian.',
+    modifiedSuccessfully: 'Zmodyfikowano pomy艣lnie',
+    modifiedUnsuccessfully: 'Nie uda艂o si臋 zmodyfikowa膰',
+    copySuccessfully: 'Skopiowano pomy艣lnie',
+    paySucceeded: 'P艂atno艣膰 zako艅czona sukcesem',
+    payCancelled: 'P艂atno艣膰 anulowana',
+    generatedSuccessfully: 'Wygenerowano pomy艣lnie',
+    generatedUnsuccessfully: 'Nie uda艂o si臋 wygenerowa膰',
+  },
+  model: {
+    params: {
+      temperature: 'Temperatura',
+      temperatureTip:
+        'Kontroluje przypadkowo艣膰: obni偶enie powoduje mniej przypadkowych uzupe艂nie艅. Gdy temperatura zbli偶a si臋 do zera, model staje si臋 deterministyczny i powtarzalny.',
+      top_p: 'Top P',
+      top_pTip:
+        'Kontroluje r贸偶norodno艣膰 poprzez pr贸bkowanie j膮dra: 0,5 oznacza, 偶e rozwa偶ane s膮 po艂owa wszystkich opcji wa偶onych prawdopodobie艅stwem.',
+      presence_penalty: 'Kara za obecno艣膰',
+      presence_penaltyTip:
+        'Jak bardzo kara膰 nowe tokeny w zale偶no艣ci od tego, czy pojawi艂y si臋 ju偶 w tek艣cie.\nZwi臋ksza prawdopodobie艅stwo, 偶e model zacznie rozmawia膰 o nowych tematach.',
+      frequency_penalty: 'Kara za cz臋stotliwo艣膰',
+      frequency_penaltyTip:
+        'Jak bardzo kara膰 nowe tokeny bazuj膮c na ich dotychczasowej cz臋stotliwo艣ci w tek艣cie.\nZmniejsza prawdopodobie艅stwo, 偶e model b臋dzie powtarza艂 t臋 sam膮 lini臋 dos艂ownie.',
+      max_tokens: 'Maksymalna liczba token贸w',
+      max_tokensTip:
+        'S艂u偶y do ograniczania maksymalnej d艂ugo艣ci odpowiedzi w tokenach. \nWi臋ksze warto艣ci mog膮 ograniczy膰 miejsce na s艂owa wst臋pne, dzienniki rozm贸w i Wiedz臋. \nZaleca si臋 ustawienie go poni偶ej dw贸ch trzecich\ngpt-4-1106-preview, gpt-4-vision-preview maksymalna liczba token贸w (input 128k output 4k)',
+      maxTokenSettingTip:
+        'Twoje ustawienie maksymalnej liczby token贸w jest wysokie, potencjalnie ograniczaj膮c miejsce na monity, zapytania i dane. Rozwa偶 ustawienie go poni偶ej 2/3.',
+      setToCurrentModelMaxTokenTip:
+        'Maksymalna liczba token贸w zosta艂a zaktualizowana do 80% maksymalnej liczby token贸w obecnego modelu {{maxToken}}.',
+      stop_sequences: 'Sekwencje zatrzymuj膮ce',
+      stop_sequencesTip:
+        'Do czterech sekwencji, w kt贸rych API przestanie generowa膰 dalsze tokeny. Zwr贸cony tekst nie b臋dzie zawiera艂 sekwencji zatrzymuj膮cej.',
+      stop_sequencesPlaceholder: 'Wpisz sekwencj臋 i naci艣nij Tab',
+    },
+    tone: {
+      Creative: 'Kreatywny',
+      Balanced: 'Zr贸wnowa偶ony',
+      Precise: 'Precyzyjny',
+      Custom: 'Niestandardowy',
+    },
+    addMoreModel: 'Przejd藕 do ustawie艅, aby doda膰 wi臋cej modeli',
+    settingsLink: 'Ustawienia dostawcy modelu',
+    capabilities: 'Mo偶liwo艣ci multimodalne',
+  },
+  menus: {
+    status: 'beta',
+    explore: 'Eksploruj',
+    apps: 'Studio',
+    plugins: 'Pluginy',
+    pluginsTips:
+      'Integruj pluginy stron trzecich lub tw贸rz pluginy AI kompatybilne z ChatGPT.',
+    datasets: 'Wiedza',
+    datasetsTips:
+      'NADCHODZI: Importuj swoje w艂asne dane tekstowe lub wpisuj dane w czasie rzeczywistym przez Webhook, aby wzmocni膰 kontekst LLM.',
+    newApp: 'Nowa aplikacja',
+    newDataset: 'Utw贸rz Wiedz臋',
+    tools: 'Narz臋dzia',
+    exploreMarketplace: 'Zapoznaj si臋 z Marketplace',
+  },
+  userProfile: {
+    settings: 'Ustawienia',
+    emailSupport: 'Wsparcie e-mail',
+    workspace: 'Przestrze艅 robocza',
+    createWorkspace: 'Utw贸rz przestrze艅 robocz膮',
+    helpCenter: 'Pomoc',
+    communityFeedback: 'Opinie',
+    roadmap: 'Plan dzia艂ania',
+    community: 'Spo艂eczno艣膰',
+    about: 'O',
+    logout: 'Wyloguj si臋',
+    support: 'Wsparcie',
+    github: 'GitHub',
+    compliance: 'Zgodno艣膰',
+  },
+  settings: {
+    accountGroup: 'KONTO',
+    workplaceGroup: 'PRZESTRZE艃 ROBOCZA',
+    account: 'Moje konto',
+    members: 'Cz艂onkowie',
+    billing: 'Rozliczenia',
+    integrations: 'Integracje',
+    language: 'J臋zyk',
+    provider: 'Dostawca modelu',
+    dataSource: '殴r贸d艂o danych',
+    plugin: 'Pluginy',
+    apiBasedExtension: 'Rozszerzenie API',
+    generalGroup: 'OG脫LNE',
+  },
+  account: {
+    avatar: 'Awatar',
+    name: 'Nazwa',
+    email: 'Email',
+    password: 'Has艂o',
+    passwordTip:
+      'Mo偶esz ustawi膰 sta艂e has艂o, je艣li nie chcesz u偶ywa膰 tymczasowych kod贸w logowania',
+    setPassword: 'Ustaw has艂o',
+    resetPassword: 'Zresetuj has艂o',
+    currentPassword: 'Obecne has艂o',
+    newPassword: 'Nowe has艂o',
+    confirmPassword: 'Potwierd藕 has艂o',
+    notEqual: 'Dwa has艂a s膮 r贸偶ne.',
+    langGeniusAccount: 'Konto Dify',
+    langGeniusAccountTip: 'Twoje konto Dify i powi膮zane dane u偶ytkownika.',
+    editName: 'Edytuj nazw臋',
+    showAppLength: 'Poka偶 {{length}} aplikacje',
+    delete: 'Usu艅 konto',
+    deleteTip: 'Usuni臋cie konta spowoduje trwa艂e usuni臋cie wszystkich danych i nie b臋dzie mo偶na ich odzyska膰.',
+    deleteConfirmTip: 'Aby potwierdzi膰, wy艣lij nast臋puj膮ce informacje z zarejestrowanego adresu e-mail na adres ',
+    myAccount: 'Moje konto',
+    studio: 'Dify Studio',
+    account: 'Rachunek',
+    deletePrivacyLinkTip: 'Aby uzyska膰 wi臋cej informacji o tym, jak post臋pujemy z Twoimi danymi, zapoznaj si臋 z nasz膮',
+    deletePrivacyLink: 'Polityka prywatno艣ci.',
+    deleteSuccessTip: 'Twoje konto potrzebuje czasu na doko艅czenie usuwania. Wy艣lemy Ci wiadomo艣膰 e-mail, gdy wszystko b臋dzie gotowe.',
+    deleteLabel: 'Aby potwierdzi膰, wpisz poni偶ej sw贸j adres e-mail',
+    deletePlaceholder: 'Podaj sw贸j adres e-mail',
+    sendVerificationButton: 'Wy艣lij kod weryfikacyjny',
+    verificationLabel: 'Kod weryfikacyjny',
+    verificationPlaceholder: 'Wklej 6-cyfrowy kod',
+    permanentlyDeleteButton: 'Trwale usu艅 konto',
+    feedbackTitle: 'Sprz臋偶enie zwrotne',
+    feedbackLabel: 'Powiedz nam, dlaczego usun膮艂e艣 swoje konto?',
+    feedbackPlaceholder: 'Fakultatywny',
+    workspaceIcon: 'Ikona robocza',
+    workspaceName: 'Nazwa miejsca pracy',
+    editWorkspaceInfo: 'Edytuj informacje o przestrzeni roboczej',
+  },
+  members: {
+    team: 'Zesp贸艂',
+    invite: 'Dodaj',
+    name: 'NAZWA',
+    lastActive: 'OSTATNIA AKTYWNO艢膯',
+    role: 'ROLE',
+    pending: 'Oczekuj膮cy...',
+    owner: 'W艂a艣ciciel',
+    admin: 'Admin',
+    adminTip: 'Mo偶e tworzy膰 aplikacje i zarz膮dza膰 ustawieniami zespo艂u',
+    normal: 'Normalny',
+    normalTip: 'Mo偶e tylko korzysta膰 z aplikacji, nie mo偶e tworzy膰 aplikacji',
+    editor: 'Edytor',
+    editorTip: 'Mo偶e tworzy膰 i edytowa膰 aplikacje, ale nie zarz膮dza膰 ustawieniami zespo艂u',
+    inviteTeamMember: 'Dodaj cz艂onka zespo艂u',
+    inviteTeamMemberTip:
+      'Mog膮 uzyska膰 bezpo艣redni dost臋p do danych Twojego zespo艂u po zalogowaniu.',
+    emailNotSetup: 'Serwer poczty nie jest skonfigurowany, wi臋c nie mo偶na wysy艂a膰 zaprosze艅 e-mail. Prosz臋 powiadomi膰 u偶ytkownik贸w o linku do zaproszenia, kt贸ry zostanie wydany po zaproszeniu.',
+    email: 'Email',
+    emailInvalid: 'Nieprawid艂owy format e-maila',
+    emailPlaceholder: 'Prosz臋 poda膰 adresy e-mail',
+    sendInvite: 'Wy艣lij zaproszenie',
+    invitedAsRole: 'Zaproszony jako u偶ytkownik typu {{role}}',
+    invitationSent: 'Zaproszenie wys艂ane',
+    invitationSentTip:
+      'Zaproszenie zosta艂o wys艂ane, a oni mog膮 zalogowa膰 si臋 do Dify, aby uzyska膰 dost臋p do danych Twojego zespo艂u.',
+    invitationLink: 'Link zaproszenia',
+    failedInvitationEmails: 'Poni偶sze osoby nie zosta艂y pomy艣lnie zaproszone',
+    ok: 'OK',
+    removeFromTeam: 'Usu艅 z zespo艂u',
+    removeFromTeamTip: 'Usunie dost臋p do zespo艂u',
+    setAdmin: 'Ustaw jako administratora',
+    setMember: 'Ustaw jako zwyk艂ego cz艂onka',
+    setEditor: 'Ustaw jako edytora',
+    disInvite: 'Anuluj zaproszenie',
+    deleteMember: 'Usu艅 cz艂onka',
+    you: '(Ty)',
+    datasetOperatorTip: 'Mo偶e zarz膮dza膰 tylko baz膮 wiedzy',
+    setBuilder: 'Ustaw jako budowniczego',
+    builder: 'Budowniczy',
+    builderTip: 'Mo偶e tworzy膰 i edytowa膰 w艂asne aplikacje',
+    datasetOperator: 'Wiedza Admin',
+  },
+  integrations: {
+    connected: 'Po艂膮czony',
+    google: 'Google',
+    googleAccount: 'Zaloguj si臋 przy u偶yciu konta Google',
+    github: 'GitHub',
+    githubAccount: 'Zaloguj si臋 przy u偶yciu konta GitHub',
+    connect: 'Po艂膮cz',
+  },
+  language: {
+    displayLanguage: 'J臋zyk interfejsu',
+    timezone: 'Strefa czasowa',
+  },
+  provider: {
+    apiKey: 'Klucz API',
+    enterYourKey: 'Wprowad藕 tutaj sw贸j klucz API',
+    invalidKey: 'Nieprawid艂owy klucz API OpenAI',
+    validatedError: 'Weryfikacja nie powiod艂a si臋: ',
+    validating: 'Weryfikowanie klucza...',
+    saveFailed: 'Zapis klucza API nie powi贸d艂 si臋',
+    apiKeyExceedBill: 'Ten KLUCZ API nie ma dost臋pnych limit贸w, przeczytaj',
+    addKey: 'Dodaj klucz',
+    comingSoon: 'Ju偶 wkr贸tce',
+    editKey: 'Edytuj',
+    invalidApiKey: 'Nieprawid艂owy klucz API',
+    azure: {
+      apiBase: 'Podstawa API',
+      apiBasePlaceholder:
+        'Adres URL podstawowy Twojego ko艅cowego punktu Azure OpenAI.',
+      apiKey: 'Klucz API',
+      apiKeyPlaceholder: 'Wprowad藕 tutaj sw贸j klucz API',
+      helpTip: 'Dowiedz si臋 wi臋cej o us艂udze Azure OpenAI',
+    },
+    openaiHosted: {
+      openaiHosted: 'Hostowany OpenAI',
+      onTrial: 'NA PROB臉',
+      exhausted: 'WYCZERPANY LIMIT',
+      desc: 'Us艂uga hostowania OpenAI dostarczana przez Dify pozwala korzysta膰 z modeli takich jak GPT-3.5. Przed wyczerpaniem limitu pr贸bnego nale偶y skonfigurowa膰 inne dostawc贸w modeli.',
+      callTimes: 'Czasy wywo艂a艅',
+      usedUp: 'Limit pr贸bny zosta艂 wyczerpany. Dodaj w艂asnego dostawc臋 modeli.',
+      useYourModel: 'Aktualnie u偶ywany jest w艂asny dostawca modeli.',
+      close: 'Zamknij',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: 'NA PROB臉',
+      exhausted: 'WYCZERPANY LIMIT',
+      desc: 'Pot臋偶ny model, kt贸ry doskonale sprawdza si臋 w szerokim spektrum zada艅, od zaawansowanego dialogu i generowania tre艣ci tw贸rczych po szczeg贸艂owe instrukcje.',
+      callTimes: 'Czasy wywo艂a艅',
+      usedUp: 'Limit pr贸bny zosta艂 wyczerpany. Dodaj w艂asnego dostawc臋 modeli.',
+      useYourModel: 'Aktualnie u偶ywany jest w艂asny dostawca modeli.',
+      close: 'Zamknij',
+      trialQuotaTip: 'Tw贸j limit pr贸bny Anthropic wyga艣nie w dniu 11.03.2025 i nie b臋dzie ju偶 dost臋pny po tym czasie. Prosimy o skorzystanie z niego w odpowiednim czasie.',
+    },
+    anthropic: {
+      using: 'Zdolno艣膰 do osadzania jest u偶ywana',
+      enableTip:
+        'Aby w艂膮czy膰 model Anthropica, musisz najpierw powi膮za膰 si臋 z us艂ug膮 OpenAI lub Azure OpenAI.',
+      notEnabled: 'Nie w艂膮czono',
+      keyFrom: 'Pobierz sw贸j klucz API od Anthropic',
+    },
+    encrypted: {
+      front: 'Tw贸j KLUCZ API b臋dzie szyfrowany i przechowywany za pomoc膮',
+      back: ' technologii.',
+    },
+  },
+  modelProvider: {
+    notConfigured:
+      'Systemowy model nie zosta艂 jeszcze w pe艂ni skonfigurowany, co mo偶e skutkowa膰 niedost臋pno艣ci膮 niekt贸rych funkcji.',
+    systemModelSettings: 'Ustawienia modelu systemowego',
+    systemModelSettingsLink:
+      'Dlaczego konieczne jest skonfigurowanie modelu systemowego?',
+    selectModel: 'Wybierz sw贸j model',
+    setupModelFirst: 'Prosz臋 najpierw skonfigurowa膰 sw贸j model',
+    systemReasoningModel: {
+      key: 'Model wnioskowania systemowego',
+      tip: 'Ustaw domy艣lny model wnioskowania do u偶ytku przy tworzeniu aplikacji, a tak偶e cechy takie jak generowanie nazw dialog贸w i sugestie nast臋pnego pytania b臋d膮 r贸wnie偶 korzysta膰 z domy艣lnego modelu wnioskowania.',
+    },
+    embeddingModel: {
+      key: 'Model osadzania',
+      tip: 'Ustaw domy艣lny model do przetwarzania osadzania dokument贸w wiedzy; zar贸wno pozyskiwanie, jak i importowanie wiedzy wykorzystuj膮 ten model osadzania do przetwarzania wektorowego. Zmiana spowoduje niezgodno艣膰 wymiar贸w wektor贸w mi臋dzy importowan膮 wiedz膮 a pytaniem, co skutkowa膰 b臋dzie niepowodzeniem w pozyskiwaniu. Aby unikn膮膰 niepowodze艅, prosimy nie zmienia膰 tego modelu dowolnie.',
+      required: 'Model osadzania jest wymagany',
+    },
+    speechToTextModel: {
+      key: 'Model mowy na tekst',
+      tip: 'Ustaw domy艣lny model do przetwarzania mowy na tekst w rozmowach.',
+    },
+    ttsModel: {
+      key: 'Model tekstu na mow臋',
+      tip: 'Ustaw domy艣lny model dla konwersji tekstu na mow臋 w rozmowach.',
+    },
+    rerankModel: {
+      key: 'Model ponownego rankingu',
+      tip: 'Model ponownego rankingu zmieni kolejno艣膰 listy dokument贸w kandydat贸w na podstawie semantycznego dopasowania z zapytaniem u偶ytkownika, poprawiaj膮c wyniki rankingu semantycznego',
+    },
+    quota: 'Limit',
+    searchModel: 'Model wyszukiwania',
+    noModelFound: 'Nie znaleziono modelu dla {{model}}',
+    models: 'Modele',
+    showMoreModelProvider: 'Poka偶 wi臋cej dostawc贸w modeli',
+    selector: {
+      tip: 'Ten model zosta艂 usuni臋ty. Prosz臋 doda膰 model lub wybra膰 inny model.',
+      emptyTip: 'Brak dost臋pnych modeli',
+      emptySetting: 'Przejd藕 do ustawie艅, aby skonfigurowa膰',
+      rerankTip: 'Prosz臋 skonfigurowa膰 model ponownego rankingu',
+    },
+    card: {
+      quota: 'LIMIT',
+      onTrial: 'Na pr贸b臋',
+      paid: 'P艂atny',
+      quotaExhausted: 'Wyczerpany limit',
+      callTimes: 'Czasy wywo艂a艅',
+      tokens: 'Tokeny',
+      buyQuota: 'Kup limit',
+      priorityUse: 'U偶ywanie z priorytetem',
+      removeKey: 'Usu艅 klucz API',
+      tip: 'Priorytet zostanie nadany p艂atnemu limitowi. Po wyczerpaniu limitu pr贸bnego zostanie u偶yty limit p艂atny.',
+    },
+    item: {
+      deleteDesc:
+        '{{modelName}} s膮 u偶ywane jako modele wnioskowania systemowego. Niekt贸re funkcje mog膮 nie by膰 dost臋pne po usuni臋ciu. Prosz臋 potwierd藕.',
+      freeQuota: 'LIMIT GRATIS',
+    },
+    addApiKey: 'Dodaj sw贸j klucz API',
+    invalidApiKey: 'Nieprawid艂owy klucz API',
+    encrypted: {
+      front: 'Tw贸j KLUCZ API b臋dzie szyfrowany i przechowywany za pomoc膮',
+      back: ' technologii.',
+    },
+    freeQuota: {
+      howToEarn: 'Jak zdoby膰',
+    },
+    addMoreModelProvider: 'DODAJ WI臉CEJ DOSTAWC脫W MODELI',
+    addModel: 'Dodaj model',
+    modelsNum: '{{num}} Modele',
+    showModels: 'Poka偶 modele',
+    showModelsNum: 'Poka偶 {{num}} modele',
+    collapse: 'Zwi艅',
+    config: 'Konfiguracja',
+    modelAndParameters: 'Model i parametry',
+    model: 'Model',
+    featureSupported: '{{feature}} obs艂ugiwane',
+    callTimes: 'Czasy wywo艂a艅',
+    credits: 'Kredyty wiadomo艣ci',
+    buyQuota: 'Kup limit',
+    getFreeTokens: 'Odbierz darmowe tokeny',
+    priorityUsing: 'Priorytetyzacja u偶ycia',
+    deprecated: 'Przestarza艂e',
+    confirmDelete: 'potwierdzi膰 usuni臋cie?',
+    quotaTip: 'Pozosta艂e dost臋pne darmowe tokeny',
+    loadPresets: 'Za艂aduj ustawienia wst臋pne',
+    parameters: 'PARAMETRY',
+    apiKey: 'KLUCZ-API',
+    loadBalancing: 'R贸wnowa偶enie obci膮偶enia',
+    defaultConfig: 'Domy艣lna konfiguracja',
+    providerManagedDescription: 'U偶yj pojedynczego zestawu po艣wiadcze艅 dostarczonych przez dostawc臋 modelu.',
+    loadBalancingHeadline: 'R贸wnowa偶enie obci膮偶enia',
+    modelHasBeenDeprecated: 'Ten model jest przestarza艂y',
+    loadBalancingDescription: 'Zmniejsz presj臋 dzi臋ki wielu zestawom po艣wiadcze艅.',
+    providerManaged: 'Zarz膮dzany przez dostawc臋',
+    upgradeForLoadBalancing: 'Uaktualnij sw贸j plan, aby w艂膮czy膰 r贸wnowa偶enie obci膮偶enia.',
+    apiKeyStatusNormal: 'Stan APIKey jest normalny',
+    loadBalancingLeastKeyWarning: 'Aby w艂膮czy膰 r贸wnowa偶enie obci膮偶enia, musz膮 by膰 w艂膮czone co najmniej 2 klucze.',
+    loadBalancingInfo: 'Domy艣lnie r贸wnowa偶enie obci膮偶enia u偶ywa strategii dzia艂ania okr臋偶nego. Je艣li zostanie uruchomione ograniczenie szybko艣ci, zostanie zastosowany 1-minutowy okres odnowienia.',
+    configLoadBalancing: 'R贸wnowa偶enie obci膮偶enia konfiguracji',
+    editConfig: 'Edytuj konfiguracj臋',
+    addConfig: 'Dodaj konfiguracj臋',
+    apiKeyRateLimit: 'Osi膮gni臋to limit szybko艣ci, dost臋pny po {{sekund}}s',
+    installProvider: 'Instalowanie dostawc贸w modeli',
+    emptyProviderTip: 'Najpierw zainstaluj dostawc臋 modeli.',
+    discoverMore: 'Dowiedz si臋 wi臋cej w',
+    toBeConfigured: 'Do skonfigurowania',
+    configureTip: 'Konfigurowanie klucza interfejsu API lub dodawanie modelu do u偶ycia',
+    emptyProviderTitle: 'Dostawca modelu nie jest skonfigurowany',
+  },
+  dataSource: {
+    add: 'Dodaj 藕r贸d艂o danych',
+    connect: 'Po艂膮cz',
+    notion: {
+      title: 'Notion',
+      description: 'Korzystanie z Notion jako 藕r贸d艂a danych dla Wiedzy.',
+      connectedWorkspace: 'Po艂膮czona przestrze艅 robocza',
+      addWorkspace: 'Dodaj przestrze艅 robocz膮',
+      connected: 'Po艂膮czono',
+      disconnected: 'Roz艂膮czono',
+      changeAuthorizedPages: 'Zmie艅 uprawnione strony',
+      pagesAuthorized: 'Strony autoryzowane',
+      sync: 'Synchronizuj',
+      remove: 'Usu艅',
+      selector: {
+        pageSelected: 'Zaznaczone strony',
+        searchPages: 'Szukaj stron...',
+        noSearchResult: 'Brak wynik贸w wyszukiwania',
+        addPages: 'Dodaj strony',
+        preview: 'PODGL膭D',
+      },
+    },
+    website: {
+      active: 'Aktywny',
+      with: 'Z',
+      title: 'Strona internetowa',
+      description: 'Importuj zawarto艣膰 ze stron internetowych za pomoc膮 robota indeksuj膮cego.',
+      configuredCrawlers: 'Skonfigurowane roboty indeksuj膮ce',
+      inactive: 'Nieaktywny',
+    },
+    configure: 'Konfigurowa膰',
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'Klucz API',
+      apiKeyPlaceholder: 'Wprowad藕 sw贸j klucz API',
+      keyFrom: 'Pobierz sw贸j klucz SerpAPI ze strony konta SerpAPI',
+    },
+  },
+  apiBasedExtension: {
+    title:
+      'Rozszerzenia oparte na interfejsie API zapewniaj膮 scentralizowane zarz膮dzanie interfejsami API, upraszczaj膮c konfiguracj臋 dla 艂atwego u偶ytkowania w aplikacjach Dify.',
+    link: 'Dowiedz si臋, jak opracowa膰 w艂asne rozszerzenie interfejsu API.',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: 'Dodaj rozszerzenie interfejsu API',
+    selector: {
+      title: 'Rozszerzenie interfejsu API',
+      placeholder: 'Wybierz rozszerzenie interfejsu API',
+      manage: 'Zarz膮dzaj rozszerzeniem interfejsu API',
+    },
+    modal: {
+      title: 'Dodaj rozszerzenie interfejsu API',
+      editTitle: 'Edytuj rozszerzenie interfejsu API',
+      name: {
+        title: 'Nazwa',
+        placeholder: 'Prosz臋 wprowad藕 nazw臋',
+      },
+      apiEndpoint: {
+        title: 'Koniec API',
+        placeholder: 'Prosz臋 wprowad藕 koniec API',
+      },
+      apiKey: {
+        title: 'Klucz API',
+        placeholder: 'Prosz臋 wprowad藕 klucz API',
+        lengthError: 'D艂ugo艣膰 klucza API nie mo偶e by膰 mniejsza ni偶 5 znak贸w',
+      },
+    },
+    type: 'Typ',
+  },
+  about: {
+    changeLog: 'Dziennik zmian',
+    updateNow: 'Aktualizuj teraz',
+    nowAvailable: 'Dify {{version}} jest teraz dost臋pny.',
+    latestAvailable: 'Dify {{version}} jest najnowsz膮 dost臋pn膮 wersj膮.',
+  },
+  appMenus: {
+    overview: 'Monitorowanie',
+    promptEng: 'Orkiestracja',
+    apiAccess: 'Dost臋p API',
+    logAndAnn: 'Logi i og艂.',
+    logs: 'Logi',
+  },
+  environment: {
+    testing: 'TESTOWANIE',
+    development: 'ROZWOJOWA',
+  },
+  appModes: {
+    completionApp: 'Generator tekstu',
+    chatApp: 'Aplikacja czatowa',
+  },
+  datasetMenus: {
+    documents: 'Dokumenty',
+    hitTesting: 'Testowanie poboru',
+    settings: 'Ustawienia',
+    emptyTip:
+      'Wiedza nie zosta艂a powi膮zana, przejd藕 do aplikacji lub wtyczki, aby uko艅czy膰 powi膮zanie.',
+    viewDoc: 'Zobacz dokumentacj臋',
+    relatedApp: 'powi膮zane aplikacje',
+    noRelatedApp: 'Brak po艂膮czonych aplikacji',
+  },
+  voiceInput: {
+    speaking: 'M贸w teraz...',
+    converting: 'Konwertowanie na tekst...',
+    notAllow: 'mikrofon nieautoryzowany',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Tekst-Davinci-003',
+    'text-embedding-ada-002': 'Tekst-Wan-Ada-002',
+    'whisper-1': 'Szept-1',
+    'claude-instant-1': 'Claude-Natychmiastowy',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: 'Zmie艅 nazw臋 rozmowy',
+    conversationName: 'Nazwa rozmowy',
+    conversationNamePlaceholder: 'Prosz臋 wprowad藕 nazw臋 rozmowy',
+    conversationNameCanNotEmpty: 'Nazwa rozmowy wymagana',
+    citation: {
+      title: 'Cytaty',
+      linkToDataset: 'Link do Wiedzy',
+      characters: 'Postacie:',
+      hitCount: 'Liczba trafie艅:',
+      vectorHash: 'Wektor hash:',
+      hitScore: 'Wynik trafie艅:',
+    },
+    inputPlaceholder: 'Porozmawiaj z botem',
+    thought: 'My艣l',
+    thinking: 'My艣lenie...',
+    resend: 'Prze艣lij ponownie',
+  },
+  promptEditor: {
+    placeholder:
+      'Wpisz swoje s艂owo kluczowe tutaj, wprowad藕 \'{\' aby wstawi膰 zmienn膮, wprowad藕 \'/\' aby wstawi膰 blok tre艣ci s艂ownika',
+    context: {
+      item: {
+        title: 'Kontekst',
+        desc: 'Wstaw szablon kontekstu',
+      },
+      modal: {
+        title: '{{num}} Wiedzy w Kontek艣cie',
+        add: 'Dodaj Kontekst ',
+        footer: 'Mo偶esz zarz膮dza膰 kontekstami poni偶ej w sekcji Kontekst贸w.',
+      },
+    },
+    history: {
+      item: {
+        title: 'Historia rozm贸w',
+        desc: 'Wstaw szablon historycznej wiadomo艣ci',
+      },
+      modal: {
+        title: 'PRZYK艁AD',
+        user: 'Cze艣膰',
+        assistant: 'Cze艣膰! W czym mog臋 pom贸c?',
+        edit: 'Edytuj nazwy r贸l rozm贸w',
+      },
+    },
+    variable: {
+      item: {
+        title: 'Zmienne i Narz臋dzia Zewn臋trzne',
+        desc: 'Wstaw Zmienne i Narz臋dzia Zewn臋trzne',
+      },
+      outputToolDisabledItem: {
+        title: 'Zmienne',
+        desc: 'Wstaw Zmienne',
+      },
+      modal: {
+        add: 'Nowa zmienna',
+        addTool: 'Nowe narz臋dzie',
+      },
+    },
+    query: {
+      item: {
+        title: 'Zapytanie',
+        desc: 'Wstaw szablon zapytania u偶ytkownika',
+      },
+    },
+    existed: 'Ju偶 istnieje w poleceniu',
+  },
+  imageUploader: {
+    uploadFromComputer: 'Za艂aduj z komputera',
+    uploadFromComputerReadError: 'B艂膮d odczytu obrazu, spr贸buj ponownie.',
+    uploadFromComputerUploadError:
+      'B艂膮d przesy艂ania obrazu, prze艣lij go ponownie.',
+    uploadFromComputerLimit:
+      'Obrazy do przes艂ania nie mog膮 przekroczy膰 {{size}} MB',
+    pasteImageLink: 'Wklej link do obrazu',
+    pasteImageLinkInputPlaceholder: 'Wklej tutaj link do obrazu',
+    pasteImageLinkInvalid: 'Nieprawid艂owy link obrazu',
+    imageUpload: 'Przesy艂anie obrazu',
+  },
+  tag: {
+    placeholder: 'Wszystkie tagi',
+    addNew: 'Dodaj nowy tag',
+    noTag: 'Brak tag贸w',
+    noTagYet: 'Brak tag贸w jeszcze',
+    addTag: 'Dodaj tagi',
+    editTag: 'Edytuj tagi',
+    manageTags: 'Zarz膮dzaj Tagami',
+    selectorPlaceholder: 'Wpisz, aby wyszuka膰 lub utworzy膰',
+    create: 'Utw贸rz',
+    delete: 'Usu艅 tag',
+    deleteTip: 'Ten tag jest u偶ywany, czy chcesz go usun膮膰?',
+    created: 'Tag zosta艂 pomy艣lnie utworzony',
+    failed: 'Nie uda艂o si臋 utworzy膰 tagu',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} jest wymagane',
+    urlError: 'Adres URL powinien zaczyna膰 si臋 od http:// lub https://',
+  },
+  fileUploader: {
+    pasteFileLinkInputPlaceholder: 'Wpisz adres URL...',
+    uploadFromComputerLimit: 'Prze艣lij plik nie mo偶e przekracza膰 {{size}}',
+    pasteFileLink: 'Wklej link do pliku',
+    uploadFromComputerUploadError: 'Przesy艂anie pliku nie powiod艂o si臋, prze艣lij ponownie.',
+    pasteFileLinkInvalid: 'Nieprawid艂owy link do pliku',
+    uploadFromComputerReadError: 'Odczyt pliku nie powi贸d艂 si臋, spr贸buj ponownie.',
+    fileExtensionNotSupport: 'Rozszerzenie pliku nie jest obs艂ugiwane',
+    uploadFromComputer: 'Przesy艂anie lokalne',
+  },
+  license: {
+    expiring_plural: 'Wygasa za {{count}} dni',
+    expiring: 'Wygasa w ci膮gu jednego dnia',
+  },
+  pagination: {
+    perPage: 'Ilo艣膰 element贸w na stronie',
+  },
+  theme: {
+    light: '艣wiat艂o',
+    theme: 'Temat',
+    dark: 'ciemny',
+    auto: 'system',
+  },
+  compliance: {
+    soc2Type2: 'Raport SOC 2 Typ II',
+    sandboxUpgradeTooltip: 'Dost臋pne tylko w planie Professional lub Team.',
+    professionalUpgradeTooltip: 'Dost臋pne tylko w planie zespo艂owym lub wy偶szym.',
+    iso27001: 'Certyfikacja ISO 27001:2022',
+    soc2Type1: 'Raport SOC 2 Typ I',
+    gdpr: 'GDPR DPA',
+  },
+  imageInput: {
+    dropImageHere: 'Upu艣膰 sw贸j obraz tutaj, lub',
+    browse: 'przegl膮daj',
+    supportedFormats: 'Obs艂uguje PNG, JPG, JPEG, WEBP i GIF',
+  },
+}
+
+export default translation
diff --git a/i18n/pl-PL/custom.ts b/i18n/pl-PL/custom.ts
new file mode 100644
index 0000000..8703ebb
--- /dev/null
+++ b/i18n/pl-PL/custom.ts
@@ -0,0 +1,33 @@
+const translation = {
+  custom: 'Dostosowanie',
+  upgradeTip: {
+    prefix: 'Zaktualizuj sw贸j plan, aby',
+    suffix: 'dostosowa膰 swoj膮 mark臋.',
+    title: 'Zmie艅 sw贸j plan',
+    des: 'Zaktualizuj sw贸j plan, aby dostosowa膰 swoj膮 mark臋',
+  },
+  webapp: {
+    title: 'Dostosuj mark臋 aplikacji internetowej',
+    removeBrand: 'Usu艅 zasilane przez Dify',
+    changeLogo: 'Zmie艅 obraz marki zasilany przez Brand',
+    changeLogoTip: 'Format SVG lub PNG o minimalnym rozmiarze 40x40px',
+  },
+  app: {
+    title: 'Dostosuj mark臋 nag艂贸wka aplikacji',
+    changeLogoTip: 'Format SVG lub PNG o minimalnym rozmiarze 80x80px',
+  },
+  upload: 'Prze艣lij',
+  uploading: 'Przesy艂anie',
+  uploadedFail:
+    'Wyst膮pi艂 problem podczas przesy艂ania obrazu, prosz臋 spr贸bowa膰 ponownie.',
+  change: 'Zmie艅',
+  apply: 'Zastosuj',
+  restore: 'Przywr贸膰 domy艣lne',
+  customize: {
+    contactUs: ' skontaktuj si臋 z nami ',
+    prefix: 'Aby dostosowa膰 logo marki w aplikacji, prosz臋',
+    suffix: 'dla aktualizacji do wersji Enterprise.',
+  },
+}
+
+export default translation
diff --git a/i18n/pl-PL/dataset-creation.ts b/i18n/pl-PL/dataset-creation.ts
new file mode 100644
index 0000000..236202d
--- /dev/null
+++ b/i18n/pl-PL/dataset-creation.ts
@@ -0,0 +1,234 @@
+const translation = {
+  steps: {
+    header: {
+      creation: 'Utw贸rz Wiedz臋',
+      update: 'Dodaj dane',
+      fallbackRoute: 'Wiedza',
+    },
+    one: 'Wybierz 藕r贸d艂o danych',
+    two: 'Przetwarzanie i Czyszczenie Tekstu',
+    three: 'Wykonaj i zako艅cz',
+  },
+  error: {
+    unavailable: 'Ta Wiedza nie jest dost臋pna',
+  },
+  stepOne: {
+    filePreview: 'Podgl膮d pliku',
+    pagePreview: 'Podgl膮d strony',
+    dataSourceType: {
+      file: 'Importuj z pliku tekstowego',
+      notion: 'Synchronizuj z Notion',
+      web: 'Synchronizuj z witryny',
+    },
+    uploader: {
+      title: 'Prze艣lij plik tekstowy',
+      button: 'Przeci膮gnij i upu艣膰 pliki lub foldery lub',
+      browse: 'Przegl膮daj',
+      tip: 'Obs艂uguje {{supportTypes}}. Maksymalnie {{size}}MB ka偶dy.',
+      validation: {
+        typeError: 'Nieobs艂ugiwany typ pliku',
+        size: 'Plik jest za du偶y. Maksymalnie {{size}}MB',
+        count: 'Nieobs艂ugiwane przesy艂anie wielu plik贸w',
+        filesNumber: 'Osi膮gn膮艂e艣 limit przes艂ania partii {{filesNumber}}.',
+      },
+      cancel: 'Anuluj',
+      change: 'Zmie艅',
+      failed: 'Przesy艂anie nie powiod艂o si臋',
+    },
+    notionSyncTitle: 'Notion nie jest pod艂膮czony',
+    notionSyncTip:
+      'Aby synchronizowa膰 z Notion, najpierw trzeba ustanowi膰 po艂膮czenie z Notion.',
+    connect: 'Przejd藕 do po艂膮czenia',
+    button: 'dalej',
+    emptyDatasetCreation: 'Chc臋 utworzy膰 pust膮 Wiedz臋',
+    modal: {
+      title: 'Utw贸rz pust膮 Wiedz臋',
+      tip: 'Pusta Wiedza nie b臋dzie zawiera艂a 偶adnych dokument贸w, a mo偶na przesy艂a膰 dokumenty w dowolnym momencie.',
+      input: 'Nazwa Wiedzy',
+      placeholder: 'Prosz臋 wpisz',
+      nameNotEmpty: 'Nazwa nie mo偶e by膰 pusta',
+      nameLengthInvalid: 'Nazwa musi zawiera膰 od 1 do 40 znak贸w',
+      cancelButton: 'Anuluj',
+      confirmButton: 'Utw贸rz',
+      failed: 'Utworzenie nie powiod艂o si臋',
+    },
+    website: {
+      limit: 'Ogranicza膰',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      firecrawlDoc: 'Dokumentacja Firecrawl',
+      unknownError: 'Nieznany b艂膮d',
+      fireCrawlNotConfiguredDescription: 'Skonfiguruj Firecrawl z kluczem API, aby z niego korzysta膰.',
+      run: 'Biega膰',
+      configure: 'Konfigurowa膰',
+      resetAll: 'Zresetuj wszystko',
+      preview: 'Prapremiera',
+      exceptionErrorTitle: 'Wyst膮pi艂 wyj膮tek podczas uruchamiania zadania Firecrawl:',
+      maxDepth: 'Maksymalna g艂臋boko艣膰',
+      crawlSubPage: 'Przeszukiwanie podstron',
+      options: 'Opcje',
+      scrapTimeInfo: 'Zeskrobano {{total}} stron w sumie w ci膮gu {{time}}s',
+      totalPageScraped: '艁膮czna liczba zeskrobanych stron:',
+      extractOnlyMainContent: 'Wyodr臋bnij tylko g艂贸wn膮 zawarto艣膰 (bez nag艂贸wk贸w, nawigacji, stopek itp.)',
+      excludePaths: 'Wykluczanie 艣cie偶ek',
+      includeOnlyPaths: 'Uwzgl臋dnij tylko 艣cie偶ki',
+      selectAll: 'Zaznacz wszystko',
+      firecrawlTitle: 'Wyodr臋bnij zawarto艣膰 internetow膮 za pomoc膮 馃敟Firecrawl',
+      fireCrawlNotConfigured: 'Firecrawl nie jest skonfigurowany',
+      maxDepthTooltip: 'Maksymalna g艂臋boko艣膰 przeszukiwania wzgl臋dem wprowadzonego adresu URL. G艂臋boko艣膰 0 po prostu zeskrobuje stron臋 z wprowadzonego adresu URL, g艂臋boko艣膰 1 zeskrobuje adres URL i wszystko po wprowadzeniuURL+ jeden / i tak dalej.',
+      useSitemap: 'U偶yj mapy witryny',
+      useSitemapTooltip: 'Post臋puj zgodnie z map膮 witryny, aby zindeksowa膰 witryn臋. Je艣li nie, Jina Reader b臋dzie indeksowa膰 iteracyjnie w oparciu o trafno艣膰 strony, daj膮c mniej stron, ale o wy偶szej jako艣ci.',
+      chooseProvider: 'Wybierz dostawc臋',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      jinaReaderNotConfigured: 'Czytnik Jina nie jest skonfigurowany',
+      jinaReaderDoc: 'Dowiedz si臋 wi臋cej o Jina Reader',
+      jinaReaderTitle: 'Konwertowanie ca艂ej witryny na j臋zyk Markdown',
+      jinaReaderNotConfiguredDescription: 'Skonfiguruj Jina Reader, wprowadzaj膮c bezp艂atny klucz API, aby uzyska膰 dost臋p.',
+      watercrawlTitle: 'Wyodr臋bnij tre艣ci z sieci za pomoc膮 Watercrawl',
+      configureWatercrawl: 'Skonfiguruj Watercrawl',
+      watercrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      configureJinaReader: 'Skonfiguruj Czytnik Jina',
+      configureFirecrawl: 'Skonfiguruj Firecrawl',
+      watercrawlDoc: 'Dokumentacja Watercrawl',
+      waterCrawlNotConfiguredDescription: 'Skonfiguruj Watercrawl z kluczem API, aby go u偶ywa膰.',
+      waterCrawlNotConfigured: 'Watercrawl nie jest skonfigurowany',
+    },
+    cancel: 'Anuluj',
+  },
+  stepTwo: {
+    segmentation: 'Ustawienia blok贸w tekstu',
+    auto: 'Automatycznie',
+    autoDescription:
+      'Automatyczne ustawianie blok贸w i regu艂 preprocessingu. Nieu偶ytkownicy s膮 zaleceni do wyboru tej opcji.',
+    custom: 'Niestandardowo',
+    customDescription:
+      'Dostosuj regu艂y blok贸w, d艂ugo艣膰 blok贸w i regu艂y preprocessingu itp.',
+    separator: 'Separator blok贸w',
+    separatorPlaceholder:
+      'Na przyk艂ad nowa linia (\\n) lub specjalny separator (np. "***")',
+    maxLength: 'Maksymalna d艂ugo艣膰 bloku',
+    overlap: 'Nak艂adka blok贸w',
+    overlapTip:
+      'Ustawienie nak艂adki blok贸w pozwala zachowa膰 semantyczn膮 zgodno艣膰 mi臋dzy nimi, poprawiaj膮c efekt pobierania. Zaleca si臋 ustawienie 10%-25% maksymalnej d艂ugo艣ci bloku.',
+    overlapCheck:
+      'nak艂adka blok贸w nie powinna by膰 wi臋ksza ni偶 maksymalna d艂ugo艣膰 bloku',
+    rules: 'Regu艂y preprocessingu tekstu',
+    removeExtraSpaces: 'Zast膮p kolejne spacje, nowe linie i tabulatory',
+    removeUrlEmails: 'Usu艅 wszystkie adresy URL i e-maile',
+    removeStopwords: 'Usu艅 s艂owa powszechne takie jak "a", "an", "the"',
+    preview: 'Potwierd藕 i Podgl膮d',
+    reset: 'Reset',
+    indexMode: 'Tryb indeksowania',
+    qualified: 'Wysoka jako艣膰',
+    recommend: 'Poleca膰',
+    qualifiedTip:
+      'Wywo艂aj domy艣lne interfejsy wbudowania systemu do przetwarzania, zapewniaj膮c wy偶sz膮 dok艂adno艣膰 podczas zapyta艅 przez u偶ytkownik贸w.',
+    warning: 'Prosz臋 najpierw skonfigurowa膰 klucz API dostawcy modelu.',
+    click: 'Przejd藕 do ustawie艅',
+    economical: 'Ekonomiczny',
+    economicalTip:
+      'U偶yj offline\'owych silnik贸w wektorowych, indeks贸w s艂贸w kluczowych itp., aby zmniejszy膰 dok艂adno艣膰 bez wydawania token贸w',
+    QATitle: 'Segmentacja w formacie pytania i odpowiedzi',
+    QATip: 'W艂膮czenie tej opcji spowoduje zu偶ycie wi臋kszej liczby token贸w',
+    QALanguage: 'Segmentacja przy u偶yciu',
+    estimateCost: 'Oszacowanie',
+    estimateSegment: 'Oszacowane bloki',
+    segmentCount: 'bloki',
+    calculating: 'Obliczanie...',
+    fileSource: 'Przetwarzaj dokumenty',
+    notionSource: 'Przetwarzaj strony',
+    other: 'i inne ',
+    fileUnit: ' plik贸w',
+    notionUnit: ' stron',
+    previousStep: 'Poprzedni krok',
+    nextStep: 'Zapisz & Przetwarzaj',
+    save: 'Zapisz & Przetwarzaj',
+    cancel: 'Anuluj',
+    sideTipTitle: 'Dlaczego blok i preprocess?',
+    sideTipP1:
+      'Podczas przetwarzania danych tekstowych, blok i czyszczenie s膮 dwoma wa偶nymi krokami preprocessingu.',
+    sideTipP2:
+      'Segmentacja dzieli d艂ugi tekst na akapity, dzi臋ki czemu modele s膮 w stanie lepiej zrozumie膰. Poprawia to jako艣膰 i trafno艣膰 wynik贸w modelu.',
+    sideTipP3:
+      'Czyszczenie usuwa zb臋dne znaki i formatowanie, sprawiaj膮c, 偶e Wiedza jest czystsza i 艂atwiejsza do analizy.',
+    sideTipP4:
+      'Odpowiednie blok i czyszczenie poprawiaj膮 wydajno艣膰 modelu, zapewniaj膮c bardziej dok艂adne i warto艣ciowe wyniki.',
+    previewTitle: 'Podgl膮d',
+    previewTitleButton: 'Podgl膮d',
+    previewButton: 'Prze艂膮cz do formatu pytania i odpowiedzi',
+    previewSwitchTipStart:
+      'Aktulany podgl膮d bloku jest w formacie tekstu, prze艂膮czenie na podgl膮d w formacie pytania i odpowiedzi spowoduje',
+    previewSwitchTipEnd: ' dodatkowe zu偶ycie token贸w',
+    characters: 'znaki',
+    indexSettingTip: 'Aby zmieni膰 metod臋 indeksowania, przejd藕 do ',
+    retrievalSettingTip: 'Aby zmieni膰 metod臋 indeksowania, przejd藕 do ',
+    datasetSettingLink: 'ustawie艅 Wiedzy.',
+    webpageUnit: 'Stron',
+    websiteSource: 'Witryna internetowa przetwarzania wst臋pnego',
+    separatorTip: 'Ogranicznik to znak u偶ywany do oddzielania tekstu. \\n\\n i \\n s膮 powszechnie u偶ywanymi ogranicznikami do oddzielania akapit贸w i wierszy. W po艂膮czeniu z przecinkami (\\n\\n,\\n), akapity b臋d膮 segmentowane wierszami po przekroczeniu maksymalnej d艂ugo艣ci fragmentu. Mo偶esz r贸wnie偶 skorzysta膰 ze zdefiniowanych przez siebie specjalnych ogranicznik贸w (np. ***).',
+    maxLengthCheck: 'Maksymalna d艂ugo艣膰 porcji powinna by膰 mniejsza ni偶 {{limit}}',
+    parentChunkForContext: 'Fragment nadrz臋dny dla kontekstu',
+    generalTip: 'Og贸lny tryb fragmentowania tekstu, fragmenty pobierane i odwo艂ywane s膮 takie same.',
+    parentChildDelimiterTip: 'Ogranicznik to znak u偶ywany do oddzielania tekstu. \\n\\n jest zalecane do dzielenia oryginalnego dokumentu na du偶e fragmenty nadrz臋dne. Mo偶esz r贸wnie偶 u偶y膰 specjalnych ogranicznik贸w zdefiniowanych przez siebie.',
+    switch: 'Prze艂膮cznik',
+    parentChildChunkDelimiterTip: 'Ogranicznik to znak u偶ywany do oddzielania tekstu. \\n jest zalecane do dzielenia fragment贸w nadrz臋dnych na ma艂e fragmenty podrz臋dne. Mo偶esz r贸wnie偶 u偶y膰 specjalnych ogranicznik贸w zdefiniowanych przez siebie.',
+    paragraphTip: 'W tym trybie tekst jest dzielony na akapity na podstawie ogranicznik贸w i maksymalnej d艂ugo艣ci fragmentu, u偶ywaj膮c podzielonego tekstu jako fragmentu nadrz臋dnego do pobierania.',
+    general: 'Og贸lne',
+    notAvailableForQA: 'Niedost臋pne dla indeksu pyta艅 i odpowiedziNot available for Q&A Index',
+    childChunkForRetrieval: 'Fragment podrz臋dny do pobrania',
+    fullDoc: 'Pe艂na wersja dokumentu',
+    fullDocTip: 'Ca艂y dokument jest u偶ywany jako fragment nadrz臋dny i pobierany bezpo艣rednio. Nale偶y pami臋ta膰, 偶e ze wzgl臋du na wydajno艣膰, tekst przekraczaj膮cy 10000 token贸w zostanie automatycznie obci臋ty.',
+    previewChunkCount: '{{liczba}} Szacowane porcje',
+    paragraph: 'Akapit',
+    parentChild: 'Rodzic-dziecko',
+    previewChunk: 'Fragment podgl膮du',
+    notAvailableForParentChild: 'Niedost臋pne dla indeksu nadrz臋dny-podrz臋dny',
+    highQualityTip: 'Po zako艅czeniu osadzania w trybie wysokiej jako艣ci powr贸t do trybu ekonomicznego nie jest dost臋pny.',
+    previewChunkTip: 'Kliknij przycisk "Podgl膮d fragmentu" po lewej stronie, aby za艂adowa膰 podgl膮d',
+    qaSwitchHighQualityTipContent: 'Obecnie tylko metoda indeksu wysokiej jako艣ci obs艂uguje fragmentowanie formatu pyta艅 i odpowiedzi. Czy chcesz prze艂膮czy膰 si臋 w tryb wysokiej jako艣ci?',
+    useQALanguage: 'Fragment przy u偶yciu formatu Q&A w',
+    parentChildTip: 'W przypadku korzystania z trybu nadrz臋dny-podrz臋dny fragment podrz臋dny jest u偶ywany do pobierania, a fragment nadrz臋dny jest u偶ywany do przywo艂ywania jako kontekstu.',
+    qaSwitchHighQualityTipTitle: 'Format Q&A wymaga metody indeksowania wysokiej jako艣ci',
+  },
+  stepThree: {
+    creationTitle: '馃帀 Utworzono Wiedz臋',
+    creationContent:
+      'Automatycznie nadali艣my nazw臋 Wiedzy, mo偶esz j膮 dowolnie zmieni膰 w ka偶dej chwili',
+    label: 'Nazwa Wiedzy',
+    additionTitle: '馃帀 Przes艂ano dokument',
+    additionP1: 'Dokument zosta艂 przes艂any do Wiedzy',
+    additionP2: ', mo偶esz go znale藕膰 na li艣cie dokument贸w Wiedzy.',
+    stop: 'Zatrzymaj przetwarzanie',
+    resume: 'Wzn贸w przetwarzanie',
+    navTo: 'Przejd藕 do dokumentu',
+    sideTipTitle: 'Co dalej',
+    sideTipContent:
+      'Po zako艅czeniu indeksowania dokumentu, Wiedza mo偶e by膰 zintegrowana z aplikacj膮 jako kontekst, mo偶na znale藕膰 ustawienie kontekstu na stronie orkiestracji. Mo偶na r贸wnie偶 stworzy膰 j膮 jako niezale偶ny plugin indeksowania ChatGPT do wydania.',
+    modelTitle: 'Czy na pewno chcesz zatrzyma膰 embedded?',
+    modelContent:
+      'Je艣li b臋dziesz potrzebowa膰 wznowi膰 przetwarzanie p贸藕niej, b臋dziesz kontynuowa膰 od miejsca, w kt贸rym przerwa艂e艣.',
+    modelButtonConfirm: 'Potwierd藕',
+    modelButtonCancel: 'Anuluj',
+  },
+  firecrawl: {
+    apiKeyPlaceholder: 'Klucz API od firecrawl.dev',
+    configFirecrawl: 'Konfiguracja 馃敟Firecrawla',
+    getApiKeyLinkText: 'Pobierz klucz API z firecrawl.dev',
+  },
+  jinaReader: {
+    getApiKeyLinkText: 'Odbierz darmowy klucz API na jina.ai',
+    apiKeyPlaceholder: 'Klucz API od jina.ai',
+    configJinaReader: 'Konfiguracja czytnika Jina',
+  },
+  otherDataSource: {
+    learnMore: 'Dowiedz si臋 wi臋cej',
+    title: 'Po艂膮czy膰 si臋 z innymi 藕r贸d艂ami danych?',
+    description: 'Obecnie baza wiedzy Dify ma tylko ograniczone 藕r贸d艂a danych. Dodanie 藕r贸d艂a danych do bazy wiedzy Dify to fantastyczny spos贸b na zwi臋kszenie elastyczno艣ci i mo偶liwo艣ci platformy dla wszystkich u偶ytkownik贸w. Nasz przewodnik po wk艂adach u艂atwia rozpocz臋cie pracy. Kliknij poni偶szy link, aby dowiedzie膰 si臋 wi臋cej.',
+  },
+  watercrawl: {
+    apiKeyPlaceholder: 'Klucz API z watercrawl.dev',
+    configWatercrawl: 'Skonfiguruj Watercrawl',
+    getApiKeyLinkText: 'Uzyskaj sw贸j klucz API z watercrawl.dev',
+  },
+}
+
+export default translation
diff --git a/i18n/pl-PL/dataset-documents.ts b/i18n/pl-PL/dataset-documents.ts
new file mode 100644
index 0000000..37f373a
--- /dev/null
+++ b/i18n/pl-PL/dataset-documents.ts
@@ -0,0 +1,396 @@
+const translation = {
+  list: {
+    title: 'Dokumenty',
+    desc: 'Wszystkie pliki wiedzy s膮 tutaj pokazane, a ca艂a wiedza mo偶e by膰 powi膮zana z odno艣nikami Dify lub zindeksowana za pomoc膮 wtyczki Chat.',
+    addFile: 'dodaj plik',
+    addPages: 'Dodaj strony',
+    table: {
+      header: {
+        fileName: 'NAZWA PLIKU',
+        words: 'S艁OWA',
+        hitCount: 'LICZBA ZNALEZIE艃',
+        uploadTime: 'CZAS WGRANIA',
+        status: 'STATUS',
+        action: 'AKCJA',
+        chunkingMode: 'TRYB CHUNKINGU',
+      },
+      name: 'Nazwa',
+      rename: 'Przemianowa膰',
+    },
+    action: {
+      uploadFile: 'Wgraj nowy plik',
+      settings: 'Ustawienia segmentacji',
+      addButton: 'Dodaj fragment',
+      add: 'Dodaj fragment',
+      batchAdd: 'Dodaj parti臋',
+      archive: 'Archiwum',
+      unarchive: 'Usu艅 z archiwum',
+      delete: 'Usu艅',
+      enableWarning: 'Zarchiwizowany plik nie mo偶e zosta膰 w艂膮czony',
+      sync: 'Synchronizuj',
+    },
+    index: {
+      enable: 'W艂膮cz',
+      disable: 'Wy艂膮cz',
+      all: 'Wszystkie',
+      enableTip: 'Plik mo偶e by膰 zindeksowany',
+      disableTip: 'Plik nie mo偶e by膰 zindeksowany',
+    },
+    status: {
+      queuing: 'Oczekiwanie',
+      indexing: 'Indeksowanie',
+      paused: 'Wstrzymane',
+      error: 'B艂膮d',
+      available: 'Dost臋pny',
+      enabled: 'W艂膮czony',
+      disabled: 'Wy艂膮czony',
+      archived: 'Zaarchiwizowany',
+    },
+    empty: {
+      title: 'Nie ma jeszcze dokumentacji',
+      upload: {
+        tip: 'Mo偶esz wgra膰 pliki, synchronizowa膰 z witryny lub z aplikacji internetowych takich jak Notion, GitHub, itp.',
+      },
+      sync: {
+        tip: 'Dify regularnie pobiera pliki z Twojego Notion i dokonuje ich przetwarzania.',
+      },
+    },
+    delete: {
+      title: 'Czy na pewno chcesz usun膮膰?',
+      content:
+        'Je艣li b臋dziesz musia艂 wznowi膰 przetwarzanie p贸藕niej, b臋dziesz kontynuowa膰 tam, gdzie przerwa艂e艣',
+    },
+    batchModal: {
+      title: 'Dodaj parti臋 fragment贸w',
+      csvUploadTitle: 'Przeci膮gnij i upu艣膰 sw贸j plik CSV tutaj, lub ',
+      browse: 'wybierz',
+      tip: 'Plik CSV musi by膰 zgodny z nast臋puj膮c膮 struktur膮:',
+      question: 'pytanie',
+      answer: 'odpowied藕',
+      contentTitle: 'tre艣膰 fragmentu',
+      content: 'tre艣膰',
+      template: 'Pobierz szablon tutaj',
+      cancel: 'Anuluj',
+      run: 'Uruchom parti臋',
+      runError: 'B艂膮d uruchomienia partii',
+      processing: 'Przetwarzanie partii',
+      completed: 'Import zako艅czony',
+      error: 'B艂膮d importu',
+      ok: 'OK',
+    },
+    addUrl: 'Dodaj adres URL',
+    learnMore: 'Dowiedz si臋 wi臋cej',
+  },
+  metadata: {
+    title: 'Metadane',
+    desc: 'Etykietowanie metadanych dla dokument贸w pozwala sztucznej inteligencji na dost臋p do nich w odpowiednim czasie i ujawnia 藕r贸d艂o odniesie艅 dla u偶ytkownik贸w.',
+    dateTimeFormat: 'D MMMM YYYY, HH:mm',
+    docTypeSelectTitle: 'Wybierz rodzaj dokumentu',
+    docTypeChangeTitle: 'Zmie艅 rodzaj dokumentu',
+    docTypeSelectWarning:
+      'Je艣li zmieniony zostanie rodzaj dokumentu, teraz wype艂nione metadane nie zostan膮 zachowane',
+    firstMetaAction: 'Zacznijmy',
+    placeholder: {
+      add: 'Dodaj ',
+      select: 'Wybierz ',
+    },
+    source: {
+      upload_file: 'Wgraj plik',
+      notion: 'Synchronizuj z Notion',
+      github: 'Synchronizuj z Github',
+    },
+    type: {
+      book: 'Ksi膮偶ka',
+      webPage: 'Strona internetowa',
+      paper: 'Artyku艂',
+      socialMediaPost: 'Post w mediach spo艂eczno艣ciowych',
+      personalDocument: 'Dokument osobisty',
+      businessDocument: 'Dokument biznesowy',
+      IMChat: 'Czat na komunikatorze',
+      wikipediaEntry: 'Artyku艂 w Wikipedii',
+      notion: 'Synchronizuj z Notion',
+      github: 'Synchronizuj z Github',
+      technicalParameters: 'Parametry techniczne',
+    },
+    field: {
+      processRule: {
+        processDoc: 'Przetw贸rz dokument',
+        segmentRule: 'Regu艂a fragmentacji',
+        segmentLength: 'D艂ugo艣膰 fragment贸w',
+        processClean: 'Oczyszczanie tekstu',
+      },
+      book: {
+        title: 'Tytu艂',
+        language: 'J臋zyk',
+        author: 'Autor',
+        publisher: 'Wydawca',
+        publicationDate: 'Data publikacji',
+        ISBN: 'ISBN',
+        category: 'Kategoria',
+      },
+      webPage: {
+        title: 'Tytu艂',
+        url: 'URL',
+        language: 'J臋zyk',
+        authorPublisher: 'Autor/Wydawca',
+        publishDate: 'Data publikacji',
+        topicKeywords: 'Tematy/S艂owa kluczowe',
+        description: 'Opis',
+      },
+      paper: {
+        title: 'Tytu艂',
+        language: 'J臋zyk',
+        author: 'Autor',
+        publishDate: 'Data publikacji',
+        journalConferenceName: 'Nazwa czasopisma/konferencji',
+        volumeIssuePage: 'Tom/Wydanie/Strona',
+        DOI: 'DOI',
+        topicsKeywords: 'Tematy/S艂owa kluczowe',
+        abstract: 'Abstrakt',
+      },
+      socialMediaPost: {
+        platform: 'Platforma',
+        authorUsername: 'Autor/Nazwa u偶ytkownika',
+        publishDate: 'Data publikacji',
+        postURL: 'Adres URL posta',
+        topicsTags: 'Tematy/Tagi',
+      },
+      personalDocument: {
+        title: 'Tytu艂',
+        author: 'Autor',
+        creationDate: 'Data utworzenia',
+        lastModifiedDate: 'Data ostatniej modyfikacji',
+        documentType: 'Typ dokumentu',
+        tagsCategory: 'Tagi/Kategoria',
+      },
+      businessDocument: {
+        title: 'Tytu艂',
+        author: 'Autor',
+        creationDate: 'Data utworzenia',
+        lastModifiedDate: 'Data ostatniej modyfikacji',
+        documentType: 'Typ dokumentu',
+        departmentTeam: 'Dzia艂/Zesp贸艂',
+      },
+      IMChat: {
+        chatPlatform: 'Platforma czatu',
+        chatPartiesGroupName: 'Podmioty czatu/Nazwa grupy',
+        participants: 'Uczestnicy',
+        startDate: 'Data rozpocz臋cia',
+        endDate: 'Data zako艅czenia',
+        topicsKeywords: 'Tematy/S艂owa kluczowe',
+        fileType: 'Typ pliku',
+      },
+      wikipediaEntry: {
+        title: 'Tytu艂',
+        language: 'J臋zyk',
+        webpageURL: 'Adres URL strony internetowej',
+        editorContributor: 'Edytor/Wsp贸艂tw贸rca',
+        lastEditDate: 'Data ostatniej edycji',
+        summaryIntroduction: 'Podsumowanie/Wst臋p',
+      },
+      notion: {
+        title: 'Tytu艂',
+        language: 'J臋zyk',
+        author: 'Autor',
+        createdTime: 'Czas utworzenia',
+        lastModifiedTime: 'Czas ostatniej modyfikacji',
+        url: 'URL',
+        tag: 'Tag',
+        description: 'Opis',
+      },
+      github: {
+        repoName: 'Nazwa repozytorium',
+        repoDesc: 'Opis repozytorium',
+        repoOwner: 'W艂a艣ciciel repozytorium',
+        fileName: 'Nazwa pliku',
+        filePath: '艢cie偶ka pliku',
+        programmingLang: 'J臋zyk programowania',
+        url: 'URL',
+        license: 'Licencja',
+        lastCommitTime: 'Czas ostatniego zobowi膮zania',
+        lastCommitAuthor: 'Autor ostatniego zobowi膮zania',
+      },
+      originInfo: {
+        originalFilename: 'Oryginalna nazwa pliku',
+        originalFileSize: 'Oryginalny rozmiar pliku',
+        uploadDate: 'Data wgrywania',
+        lastUpdateDate: 'Data ostatniej aktualizacji',
+        source: '殴r贸d艂o',
+      },
+      technicalParameters: {
+        segmentSpecification: 'Specyfikacja fragment贸w',
+        segmentLength: 'D艂ugo艣膰 fragment贸w',
+        avgParagraphLength: '艢rednia d艂ugo艣膰 akapitu',
+        paragraphs: 'Akapity',
+        hitCount: 'Liczba odwo艂a艅',
+        embeddingTime: 'Czas embedowania',
+        embeddedSpend: 'Wydatki zwi膮zane z embedowaniem',
+      },
+    },
+    languageMap: {
+      zh: 'Chi艅ski',
+      en: 'Angielski',
+      es: 'Hiszpa艅ski',
+      fr: 'Francuski',
+      de: 'Niemiecki',
+      ja: 'Japo艅ski',
+      ko: 'Korea艅ski',
+      ru: 'Rosyjski',
+      ar: 'Arabski',
+      pt: 'Portugalski',
+      it: 'W艂oski',
+      nl: 'Holenderski',
+      pl: 'Polski',
+      sv: 'Szwedzki',
+      tr: 'Turecki',
+      he: 'Hebrajski',
+      hi: 'Hinduski',
+      da: 'Du艅ski',
+      fi: 'Fi艅ski',
+      no: 'Norweski',
+      hu: 'W臋gierski',
+      el: 'Grecki',
+      cs: 'Czeski',
+      th: 'Tajski',
+      id: 'Indonezyjski',
+    },
+    categoryMap: {
+      book: {
+        fiction: 'Literatura pi臋kna',
+        biography: 'Biografia',
+        history: 'Historia',
+        science: 'Nauka',
+        technology: 'Technologia',
+        education: 'Edukacja',
+        philosophy: 'Filozofia',
+        religion: 'Religia',
+        socialSciences: 'Nauki spo艂eczne',
+        art: 'Sztuka',
+        travel: 'Podr贸偶e',
+        health: 'Zdrowie',
+        selfHelp: 'Samorozw贸j',
+        businessEconomics: 'Biznes/ekonomia',
+        cooking: 'Gotowanie',
+        childrenYoungAdults: 'Dzieci/M艂odzie偶',
+        comicsGraphicNovels: 'Komiksy/Graphic Novels',
+        poetry: 'Poezja',
+        drama: 'Dramat',
+        other: 'Inne',
+      },
+      personalDoc: {
+        notes: 'Notatki',
+        blogDraft: 'Wersja robocza bloga',
+        diary: 'Dziennik',
+        researchReport: 'Raport badawczy',
+        bookExcerpt: 'Fragment ksi膮偶ki',
+        schedule: 'Harmonogram',
+        list: 'Lista',
+        projectOverview: 'Przegl膮d projektu',
+        photoCollection: 'Kolekcja zdj臋膰',
+        creativeWriting: 'Tw贸rcze pisanie',
+        codeSnippet: 'Fragment kodu',
+        designDraft: 'Projekt/wersja robocza',
+        personalResume: 'CV',
+        other: 'Inne',
+      },
+      businessDoc: {
+        meetingMinutes: 'Protoko艂y zebra艅',
+        researchReport: 'Raport badawczy',
+        proposal: 'Propozycja',
+        employeeHandbook: 'Podr臋cznik pracownika',
+        trainingMaterials: 'Materia艂y szkoleniowe',
+        requirementsDocument: 'Dokument wymaga艅',
+        designDocument: 'Dokument projektowy',
+        productSpecification: 'Specyfikacja produktu',
+        financialReport: 'Raport finansowy',
+        marketAnalysis: 'Analiza rynku',
+        projectPlan: 'Plan projektu',
+        teamStructure: 'Struktura zespo艂u',
+        policiesProcedures: 'Zasady i procedury',
+        contractsAgreements: 'Umowy',
+        emailCorrespondence: 'Korespondencja e-mailowa',
+        other: 'Inne',
+      },
+    },
+  },
+  embedding: {
+    processing: 'Przetwarzanie osadzania...',
+    paused: 'Osadzanie wstrzymane',
+    completed: 'Osadzanie zako艅czone',
+    error: 'B艂膮d osadzania',
+    docName: 'Przetwarzanie wst臋pne dokumentu',
+    mode: 'Regu艂a segmentacji',
+    segmentLength: 'D艂ugo艣膰 fragment贸w',
+    textCleaning: 'Predefinicja tekstu i czyszczenie',
+    segments: 'Akapity',
+    highQuality: 'Tryb wysokiej jako艣ci',
+    economy: 'Tryb ekonomiczny',
+    estimate: 'Szacowany czas',
+    stop: 'Zatrzymaj przetwarzanie',
+    resume: 'Wzn贸w przetwarzanie',
+    automatic: 'Automatyczny',
+    custom: 'Niestandardowy',
+    previewTip: 'Podgl膮d akapitu b臋dzie dost臋pny po zako艅czeniu osadzania',
+    parentMaxTokens: 'Rodzic',
+    hierarchical: 'Rodzic-dziecko',
+    childMaxTokens: 'Dziecko',
+    pause: 'Pauza',
+  },
+  segment: {
+    paragraphs: 'Akapity',
+    keywords: 'S艂owa kluczowe',
+    addKeyWord: 'Dodaj s艂owo kluczowe',
+    keywordError: 'Maksymalna d艂ugo艣膰 s艂owa kluczowego wynosi 20',
+    characters: 'znak贸w',
+    hitCount: 'Liczba odwo艂a艅',
+    vectorHash: 'Wektor hash: ',
+    questionPlaceholder: 'dodaj pytanie tutaj',
+    questionEmpty: 'Pytanie nie mo偶e by膰 puste',
+    answerPlaceholder: 'dodaj odpowied藕 tutaj',
+    answerEmpty: 'Odpowied藕 nie mo偶e by膰 pusta',
+    contentPlaceholder: 'dodaj tre艣膰 tutaj',
+    contentEmpty: 'Tre艣膰 nie mo偶e by膰 pusta',
+    newTextSegment: 'Nowy segment tekstowy',
+    newQaSegment: 'Nowy segment Q&A',
+    delete: 'Usun膮膰 ten fragment?',
+    parentChunks_one: 'FRAGMENT NADRZ臉DNY',
+    parentChunks_other: 'FRAGMENTY NADRZ臉DNE',
+    searchResults_one: 'WYNIK',
+    chunk: 'Kawa艂',
+    parentChunk: 'Fragment nadrz臋dny',
+    characters_other: 'Znak贸w',
+    addChunk: 'Dodaj kawa艂ek',
+    addChildChunk: 'Dodaj fragment podrz臋dny',
+    addAnother: 'Dodaj kolejny',
+    childChunkAdded: 'Dodano 1 fragment podrz臋dny',
+    editChunk: 'Edytuj fragment',
+    regenerationSuccessTitle: 'Regeneracja zako艅czona',
+    edited: 'EDYTOWANE',
+    editedAt: 'Zredagowane w',
+    collapseChunks: 'Zwijanie fragment贸w',
+    empty: 'Nie znaleziono fragmentu',
+    newChunk: 'Nowy fragment',
+    regenerationConfirmTitle: 'Czy chcesz zregenerowa膰 fragmenty podrz臋dne?',
+    chunks_other: 'KAWA艁KI',
+    editChildChunk: 'Edytuj fragment podrz臋dny',
+    characters_one: 'znak',
+    regeneratingMessage: 'To mo偶e chwil臋 potrwa膰, prosz臋 czeka膰...',
+    chunkDetail: 'Szczeg贸艂y kawa艂ka',
+    chunkAdded: 'Dodano 1 kawa艂ek',
+    regeneratingTitle: 'Regenerowanie fragment贸w podrz臋dnych',
+    childChunks_other: 'FRAGMENTY POTOMNE',
+    expandChunks: 'Rozwijanie fragment贸w',
+    childChunk: 'Fragment podrz臋dny',
+    regenerationConfirmMessage: 'Ponowne wygenerowanie fragment贸w podrz臋dnych spowoduje zast膮pienie bie偶膮cych fragment贸w podrz臋dnych, w tym fragment贸w edytowanych i nowo dodanych fragment贸w. Regeneracji nie mo偶na cofn膮膰.',
+    regenerationSuccessMessage: 'Mo偶esz zamkn膮膰 to okno.',
+    searchResults_other: 'WYNIKI',
+    searchResults_zero: 'WYNIK',
+    chunks_one: 'KAWA艁',
+    editParentChunk: 'Edytuj fragment nadrz臋dny',
+    newChildChunk: 'Nowy fragment podrz臋dny',
+    clearFilter: 'Wyczy艣膰 filtr',
+    childChunks_one: 'FRAGMENT POTOMNY',
+  },
+}
+
+export default translation
diff --git a/i18n/pl-PL/dataset-hit-testing.ts b/i18n/pl-PL/dataset-hit-testing.ts
new file mode 100644
index 0000000..f069e4d
--- /dev/null
+++ b/i18n/pl-PL/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: 'Testowanie odzyskiwania',
+  desc: 'Przetestuj efekt uderzenia wiedzy na podstawie podanego tekstu zapytania.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  recents: 'Ostatnie',
+  table: {
+    header: {
+      source: '殴r贸d艂o',
+      text: 'Tekst',
+      time: 'Czas',
+    },
+  },
+  input: {
+    title: 'Tekst 藕r贸d艂owy',
+    placeholder: 'Prosz臋 wpisa膰 tekst, zaleca si臋 kr贸tkie zdanie deklaratywne.',
+    countWarning: 'Do 200 znak贸w.',
+    indexWarning: 'Tylko wiedza wysokiej jako艣ci.',
+    testing: 'Testowanie',
+  },
+  hit: {
+    title: 'AKAPITY ODZYSKIWANIA',
+    emptyTip: 'Wyniki testowania odzyskiwania b臋d膮 tu pokazane',
+  },
+  noRecentTip: 'Brak ostatnich wynik贸w zapyta艅 tutaj',
+  viewChart: 'Zobacz WYKRES WEKTOROWY',
+  settingTitle: 'Ustawienie pobierania',
+  viewDetail: 'Poka偶 szczeg贸艂y',
+  keyword: 'S艂owa kluczowe',
+  hitChunks: 'Trafienie w {{num}} fragment贸w podrz臋dnych',
+  open: 'Otwiera膰',
+  records: 'Rekordy',
+  chunkDetail: 'Szczeg贸艂y kawa艂ka',
+}
+
+export default translation
diff --git a/i18n/pl-PL/dataset-settings.ts b/i18n/pl-PL/dataset-settings.ts
new file mode 100644
index 0000000..03462ad
--- /dev/null
+++ b/i18n/pl-PL/dataset-settings.ts
@@ -0,0 +1,48 @@
+const translation = {
+  title: 'Ustawienia wiedzy',
+  desc: 'Tutaj mo偶esz modyfikowa膰 w艂a艣ciwo艣ci i metody dzia艂ania Wiedzy.',
+  form: {
+    name: 'Nazwa wiedzy',
+    namePlaceholder: 'Prosz臋 wprowadzi膰 nazw臋 wiedzy',
+    nameError: 'Nazwa nie mo偶e by膰 pusta',
+    desc: 'Opis wiedzy',
+    descInfo:
+      'Prosz臋 napisa膰 klarowny opis tekstowy, aby zarysowa膰 zawarto艣膰 Wiedzy. Ten opis b臋dzie wykorzystywany jako podstawa do dopasowywania podczas wyboru z wielu wiedz dla wnioskowania.',
+    descPlaceholder:
+      'Opisz, co znajduje si臋 w tej Wiedzy. Szczeg贸艂owy opis pozwala sztucznej inteligencji na dost臋p do tre艣ci Wiedzy w odpowiednim czasie. Je艣li jest pusty, Dify u偶yje domy艣lnej strategii trafie艅.',
+    descWrite: 'Dowiedz si臋, jak napisa膰 dobry opis Wiedzy.',
+    permissions: 'Uprawnienia',
+    permissionsOnlyMe: 'Tylko ja',
+    permissionsAllMember: 'Wszyscy cz艂onkowie zespo艂u',
+    indexMethod: 'Metoda indeksowania',
+    indexMethodHighQuality: 'Wysoka jako艣膰',
+    indexMethodHighQualityTip:
+      'Wywo艂aj model Embedding do przetwarzania, aby zapewni膰 wi臋ksz膮 dok艂adno艣膰 przy zapytaniach u偶ytkownik贸w.',
+    indexMethodEconomy: 'Ekonomiczna',
+    indexMethodEconomyTip:
+      'U偶yj silnik贸w wektor贸w offline, indeks贸w s艂贸w kluczowych itp., aby zmniejszy膰 dok艂adno艣膰 bez wydawania token贸w',
+    embeddingModel: 'Model wbudowywania',
+    embeddingModelTip: 'Aby zmieni膰 model wbudowywania, przejd藕 do ',
+    embeddingModelTipLink: 'Ustawienia',
+    retrievalSetting: {
+      title: 'Ustawienia doboru',
+      learnMore: 'Dowiedz si臋 wi臋cej',
+      description: ' dotycz膮ce metody doboru.',
+      longDescription:
+        ' dotycz膮ce metody doboru, mo偶esz to zmieni膰 w dowolnym momencie w ustawieniach wiedzy.',
+      method: 'Metoda pozyskiwania',
+    },
+    save: 'Zapisz',
+    permissionsInvitedMembers: 'Cz臋艣ciowi cz艂onkowie zespo艂u',
+    me: '(Ty)',
+    externalKnowledgeAPI: 'Interfejs API wiedzy zewn臋trznej',
+    retrievalSettings: 'Ustawienia pobierania',
+    externalKnowledgeID: 'Zewn臋trzny identyfikator wiedzy',
+    helpText: 'Dowiedz si臋, jak napisa膰 dobry opis zestawu danych.',
+    upgradeHighQualityTip: 'Po uaktualnieniu do trybu wysokiej jako艣ci powr贸t do trybu ekonomicznego nie jest dost臋pny',
+    indexMethodChangeToEconomyDisabledTip: 'Niedost臋pne w przypadku zmiany z HQ na ECO',
+    searchModel: 'Szukaj modelu',
+  },
+}
+
+export default translation
diff --git a/i18n/pl-PL/dataset.ts b/i18n/pl-PL/dataset.ts
new file mode 100644
index 0000000..3006c46
--- /dev/null
+++ b/i18n/pl-PL/dataset.ts
@@ -0,0 +1,227 @@
+const translation = {
+  knowledge: 'Wiedza',
+  documentCount: ' dokumenty',
+  wordCount: ' k s艂贸w',
+  appCount: ' powi膮zane aplikacje',
+  createDataset: 'Utw贸rz Wiedz臋',
+  createDatasetIntro:
+    'Zaimportuj w艂asne dane tekstowe lub zapisuj dane w czasie rzeczywistym za pomoc膮 Webhooka w celu wzmocnienia kontekstu LLM.',
+  deleteDatasetConfirmTitle: 'Czy na pewno usun膮膰 t臋 Wiedz臋?',
+  deleteDatasetConfirmContent:
+    'Usuni臋cie Wiedzy jest nieodwracalne. U偶ytkownicy nie b臋d膮 ju偶 mieli dost臋pu do Twojej Wiedzy, a wszystkie konfiguracje i logi zostan膮 trwale usuni臋te.',
+  datasetUsedByApp: 'Ta wiedza jest wykorzystywana przez niekt贸re aplikacje. Aplikacje nie b臋d膮 ju偶 mog艂y korzysta膰 z tej Wiedzy, a wszystkie konfiguracje podpowiedzi i logi zostan膮 trwale usuni臋te.',
+  datasetDeleted: 'Wiedza usuni臋ta',
+  datasetDeleteFailed: 'Nie uda艂o si臋 usun膮膰 Wiedzy',
+  didYouKnow: 'Czy wiedzia艂e艣?',
+  intro1: 'Wiedz臋 mo偶na zintegrowa膰 z aplikacj膮 Dify ',
+  intro2: 'jako kontekst',
+  intro3: ',',
+  intro4: 'lub ',
+  intro5: 'mo偶e by膰 utworzona',
+  intro6: ' jako samodzielny wtyczka indeksuj膮ca ChatGPT do publikacji',
+  unavailable: 'Niedost臋pny',
+  unavailableTip:
+    'Model osadzaj膮cy jest niedost臋pny, domy艣lny model osadzaj膮cy musi by膰 skonfigurowany',
+  datasets: 'WIEDZA',
+  datasetsApi: 'DOST臉P DO API',
+  retrieval: {
+    semantic_search: {
+      title: 'Wyszukiwanie wektorowe',
+      description:
+        'Generowanie osadze艅 zapyta艅 i wyszukiwanie fragment贸w tekstu najbardziej podobnych do ich wektorowej reprezentacji.',
+    },
+    full_text_search: {
+      title: 'Wyszukiwanie pe艂notekstowe',
+      description:
+        'Indeksowanie wszystkich termin贸w w dokumencie, umo偶liwiaj膮c u偶ytkownikom wyszukiwanie dowolnego terminu i odzyskiwanie odpowiedniego fragmentu tekstu zawieraj膮cego te terminy.',
+    },
+    hybrid_search: {
+      title: 'Wyszukiwanie hybrydowe',
+      description:
+        'Wykonaj jednocze艣nie pe艂notekstowe wyszukiwanie i wyszukiwanie wektorowe, ponownie porz膮dkuj, aby wybra膰 najlepsze dopasowanie dla zapytania u偶ytkownika. Konieczna jest konfiguracja API Rerank model.',
+      recommend: 'Polecany',
+    },
+    invertedIndex: {
+      title: 'Indeks odwr贸cony',
+      description:
+        'Indeks odwr贸cony to struktura u偶ywana do efektywnego odzyskiwania informacji. Zorganizowane wed艂ug termin贸w, ka偶dy termin wskazuje na dokumenty lub strony internetowe zawieraj膮ce go.',
+    },
+    change: 'Zmie艅',
+    changeRetrievalMethod: 'Zmie艅 metod臋 odzyskiwania',
+  },
+  docsFailedNotice: 'nie uda艂o si臋 zindeksowa膰 dokument贸w',
+  retry: 'Pon贸w',
+  indexingTechnique: {
+    high_quality: 'WJ',
+    economy: 'EKO',
+  },
+  indexingMethod: {
+    semantic_search: 'WEKTOR',
+    full_text_search: 'PE艁NY TEKST',
+    hybrid_search: 'HYBRYDOWY',
+    invertedIndex: 'ODWR脫CONY',
+  },
+  mixtureHighQualityAndEconomicTip: 'Model ponownego rankingu jest wymagany dla mieszanki wysokiej jako艣ci i ekonomicznych baz wiedzy.',
+  inconsistentEmbeddingModelTip: 'Model ponownego rankingu jest wymagany, je艣li modele osadzania wybranych baz wiedzy s膮 niesp贸jne.',
+  retrievalSettings: 'Ustawienia wyszukiwania',
+  rerankSettings: 'Ustawienia ponownego rankingu',
+  weightedScore: {
+    title: 'Wa偶ona ocena',
+    description: 'Poprzez dostosowanie przypisanych wag, ta strategia ponownego rankingu okre艣la, czy priorytetowo traktowa膰 dopasowanie semantyczne czy s艂贸w kluczowych.',
+    semanticFirst: 'Najpierw semantyczne',
+    keywordFirst: 'Najpierw s艂owa kluczowe',
+    customized: 'Dostosowane',
+    semantic: 'Semantyczne',
+    keyword: 'S艂owo kluczowe',
+  },
+  nTo1RetrievalLegacy: 'Wyszukiwanie N-do-1 zostanie oficjalnie wycofane od wrze艣nia. Zaleca si臋 korzystanie z najnowszego wyszukiwania wielo艣cie偶kowego, aby uzyska膰 lepsze wyniki.',
+  nTo1RetrievalLegacyLink: 'Dowiedz si臋 wi臋cej',
+  nTo1RetrievalLegacyLinkText: 'Wyszukiwanie N-do-1 zostanie oficjalnie wycofane we wrze艣niu.',
+  defaultRetrievalTip: 'Pobieranie wielu 艣cie偶ek jest u偶ywane domy艣lnie. Wiedza jest pobierana z wielu baz wiedzy, a nast臋pnie ponownie klasyfikowana.',
+  editExternalAPIConfirmWarningContent: {
+    end: 'wiedzy zewn臋trznej, a ta modyfikacja zostanie zastosowana do nich wszystkich. Czy na pewno chcesz zapisa膰 t臋 zmian臋?',
+    front: 'Ten interfejs API wiedzy zewn臋trznej jest po艂膮czony z',
+  },
+  editExternalAPIFormWarning: {
+    front: 'Ten zewn臋trzny interfejs API jest powi膮zany z',
+    end: 'Wiedza zewn臋trzna',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      end: '?',
+      front: 'Usun膮膰',
+    },
+    content: {
+      front: 'Ten interfejs API wiedzy zewn臋trznej jest po艂膮czony z',
+      end: 'wiedza zewn臋trzna. Usuni臋cie tego interfejsu API spowoduje uniewa偶nienie ich wszystkich. Czy na pewno chcesz usun膮膰 ten interfejs API?',
+    },
+    noConnectionContent: 'Czy na pewno chcesz usun膮膰 ten interfejs API?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: 'Wybieranie interfejsu API wiedzy zewn臋trznej',
+  },
+  connectDatasetIntro: {
+    content: {
+      front: 'Aby nawi膮za膰 po艂膮czenie z zewn臋trzn膮 baz膮 wiedzy, nale偶y najpierw utworzy膰 zewn臋trzny interfejs API. Przeczytaj uwa偶nie i zapoznaj si臋 z',
+      link: 'Dowiedz si臋, jak utworzy膰 zewn臋trzny interfejs API',
+      end: '. Nast臋pnie znajd藕 odpowiedni identyfikator wiedzy i wype艂nij go w formularzu po lewej stronie. Je艣li wszystkie informacje s膮 poprawne, po klikni臋ciu przycisku po艂膮czenia automatycznie przejdzie do testu wyszukiwania w bazie wiedzy.',
+    },
+    learnMore: 'Dowiedz si臋 wi臋cej',
+    title: 'Jak po艂膮czy膰 si臋 z zewn臋trzn膮 baz膮 wiedzy',
+  },
+  connectHelper: {
+    helper1: 'Po艂膮cz si臋 z zewn臋trznymi bazami wiedzy za po艣rednictwem interfejsu API i identyfikatora bazy wiedzy. Obecnie',
+    helper3: '. Zdecydowanie zalecamy, aby',
+    helper5: 'ostro偶nie przed u偶yciem tej funkcji.',
+    helper4: 'Zapoznaj si臋 z dokumentacj膮 pomocy',
+    helper2: 'Obs艂ugiwana jest tylko funkcja pobierania',
+  },
+  externalKnowledgeForm: {
+    connect: 'Po艂膮czy膰',
+    cancel: 'Anuluj',
+  },
+  externalAPIForm: {
+    encrypted: {
+      end: 'Technologia.',
+      front: 'Tw贸j token API zostanie zaszyfrowany i b臋dzie przechowywany za pomoc膮',
+    },
+    edit: 'Redagowa膰',
+    save: 'Zapisa膰',
+    name: 'Nazwa',
+    apiKey: 'Klucz API',
+    cancel: 'Anuluj',
+    endpoint: 'Punkt ko艅cowy interfejsu API',
+  },
+  externalAPIPanelDocumentation: 'Dowiedz si臋, jak utworzy膰 interfejs API wiedzy zewn臋trznej',
+  noExternalKnowledge: 'Nie ma jeszcze interfejsu API wiedzy zewn臋trznej, kliknij tutaj, aby utworzy膰',
+  createExternalAPI: 'Dodawanie interfejsu API wiedzy zewn臋trznej',
+  connectDataset: 'Nawi膮zywanie po艂膮czenia z zewn臋trzn膮 baz膮 wiedzy',
+  editExternalAPITooltipTitle: 'POWI膭ZANA WIEDZA',
+  externalKnowledgeId: 'Zewn臋trzny identyfikator wiedzy',
+  externalAPIPanelTitle: 'Interfejs API wiedzy zewn臋trznej',
+  externalKnowledgeName: 'Nazwa wiedzy zewn臋trznej',
+  externalKnowledgeIdPlaceholder: 'Podaj identyfikator wiedzy',
+  createNewExternalAPI: 'Tworzenie nowego interfejsu API wiedzy zewn臋trznej',
+  externalKnowledgeDescription: 'Opis wiedzy',
+  externalKnowledgeDescriptionPlaceholder: 'Opisz, co znajduje si臋 w tej bazie wiedzy (opcjonalnie)',
+  allExternalTip: 'W przypadku korzystania tylko z wiedzy zewn臋trznej u偶ytkownik mo偶e zdecydowa膰, czy chce w艂膮czy膰 model Rerank. Je艣li ta opcja nie jest w艂膮czona, pobrane fragmenty b臋d膮 sortowane na podstawie wynik贸w. Gdy strategie wyszukiwania z r贸偶nych baz wiedzy s膮 niesp贸jne, b臋dzie to niedok艂adne.',
+  editExternalAPIFormTitle: 'Edytowanie interfejsu API wiedzy zewn臋trznej',
+  mixtureInternalAndExternalTip: 'Model Rerank jest wymagany do po艂膮czenia wiedzy wewn臋trznej i zewn臋trznej.',
+  externalAPI: 'Zewn臋trzny interfejs API',
+  externalTag: 'Zewn臋trzny',
+  learnHowToWriteGoodKnowledgeDescription: 'Dowiedz si臋, jak napisa膰 dobry opis wiedzy',
+  externalKnowledgeNamePlaceholder: 'Podaj nazw臋 bazy wiedzy',
+  externalAPIPanelDescription: 'Interfejs API wiedzy zewn臋trznej s艂u偶y do 艂膮czenia si臋 z baz膮 wiedzy poza Dify i pobierania wiedzy z tej bazy wiedzy.',
+  chunkingMode: {
+    parentChild: 'Rodzic-dziecko',
+    general: 'Og贸lne',
+  },
+  parentMode: {
+    fullDoc: 'Pe艂na wersja dokumentu',
+    paragraph: 'Akapit',
+  },
+  batchAction: {
+    selected: 'Wybrany',
+    archive: 'Archiwum',
+    enable: 'Umo偶liwia膰',
+    disable: 'Wy艂膮cza膰',
+    delete: 'Usun膮膰',
+    cancel: 'Anuluj',
+  },
+  preprocessDocument: '{{liczba}} Przetwarzanie wst臋pne dokument贸w',
+  localDocs: 'Lokalne dokumenty',
+  documentsDisabled: '{{num}} dokumenty wy艂膮czone - nieaktywne przez ponad 30 dni',
+  enable: 'Umo偶liwia膰',
+  allKnowledge: 'Ca艂a wiedza',
+  allKnowledgeDescription: 'Wybierz t臋 opcj臋, aby wy艣wietli膰 ca艂膮 wiedz臋 w tym obszarze roboczym. Tylko w艂a艣ciciel obszaru roboczego mo偶e zarz膮dza膰 ca艂膮 wiedz膮.',
+  metadata: {
+    createMetadata: {
+      back: 'Ty艂',
+      namePlaceholder: 'Dodaj nazw臋 metadanych',
+      name: 'Imi臋',
+      title: 'Nowe metadane',
+      type: 'Typ',
+    },
+    checkName: {
+      empty: 'Nazwa metadanych nie mo偶e by膰 pusta',
+      invalid: 'Nazwa metadanych mo偶e zawiera膰 tylko ma艂e litery, cyfry i podkre艣lenia oraz musi zaczyna膰 si臋 od ma艂ej litery',
+    },
+    batchEditMetadata: {
+      multipleValue: 'Wielokrotna warto艣膰',
+      editMetadata: 'Edytuj metadane',
+      editDocumentsNum: 'Edycja {{num}} dokument贸w',
+      applyToAllSelectDocument: 'Zastosuj do wszystkich wybranych dokument贸w',
+      applyToAllSelectDocumentTip: 'Automatycznie utw贸rz wszystkie powy偶ej wymienione edytowane i nowe metadane dla wszystkich wybranych dokument贸w, w przeciwnym razie edytowanie metadanych b臋dzie dotyczy膰 tylko dokument贸w, kt贸re je posiadaj膮.',
+    },
+    selectMetadata: {
+      manageAction: 'Zarz膮dzaj',
+      newAction: 'Nowe metadane',
+      search: 'Szukaj metadanych',
+    },
+    datasetMetadata: {
+      values: '{{num}} Warto艣ci',
+      rename: 'Zmie艅 nazw臋',
+      namePlaceholder: 'Nazwa metadanych',
+      addMetaData: 'Dodaj metadane',
+      deleteContent: 'Czy na pewno chcesz usun膮膰 metadane "{{name}}"?',
+      builtIn: 'Wbudowany',
+      deleteTitle: 'Potwierd藕 usuni臋cie',
+      description: 'Mo偶esz zarz膮dza膰 wszystkimi metadanymi w tej wiedzy tutaj. Modyfikacje b臋d膮 synchronizowane z ka偶dym dokumentem.',
+      name: 'Imi臋',
+      disabled: 'Wy艂膮czone',
+      builtInDescription: 'Wbudowane metadane s膮 automatycznie ekstraktowane i generowane. Musz膮 by膰 w艂膮czone przed u偶yciem i nie mo偶na ich edytowa膰.',
+    },
+    documentMetadata: {
+      technicalParameters: 'Parametry techniczne',
+      startLabeling: 'Rozpocznij etykietowanie',
+      documentInformation: 'Informacje o dokumencie',
+      metadataToolTip: 'Metadane s艂u偶膮 jako istotny filtr, kt贸ry zwi臋ksza dok艂adno艣膰 i trafno艣膰 wyszukiwania informacji. Mo偶esz modyfikowa膰 i dodawa膰 metadane do tego dokumentu tutaj.',
+    },
+    metadata: 'Metadane',
+    addMetadata: 'Dodaj metadane',
+    chooseTime: 'Wybierz czas...',
+  },
+  embeddingModelNotAvailable: 'Model osadzaj膮cy jest niedost臋pny.',
+}
+
+export default translation
diff --git a/i18n/pl-PL/education.ts b/i18n/pl-PL/education.ts
new file mode 100644
index 0000000..a7684c2
--- /dev/null
+++ b/i18n/pl-PL/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    coupon: 'ekskluzywny kupon 100%',
+    front: 'Teraz jeste艣 uprawniony do statusu zweryfikowanej edukacji. Prosz臋 wprowadzi膰 swoje informacje edukacyjne poni偶ej, aby zako艅czy膰 proces i otrzyma膰',
+    end: 'dla Profesjonalnego Planu Dify.',
+  },
+  form: {
+    schoolName: {
+      title: 'Nazwa Twojej Szko艂y',
+      placeholder: 'Wpisz oficjaln膮, pe艂n膮 nazw臋 swojej szko艂y',
+    },
+    schoolRole: {
+      option: {
+        student: 'Uczniowie',
+        teacher: 'Nauczyciel',
+        administrator: 'Administrator szko艂y',
+      },
+      title: 'Twoja rola w szkole',
+    },
+    terms: {
+      desc: {
+        termsOfService: 'Warunki 艣wiadczenia us艂ug',
+        privacyPolicy: 'Polityka prywatno艣ci',
+        and: 'i',
+        front: 'Twoje informacje i u偶ycie statusu Weryfikowanej Edukacji podlegaj膮 naszym',
+        end: 'Przez przes艂anie:',
+      },
+      option: {
+        age: 'Potwierdzam, 偶e mam co najmniej 18 lat',
+        inSchool: 'Potwierdzam, 偶e jestem zapisany lub zatrudniony w podanej instytucji. Dify mo偶e wymaga膰 dowodu zapisania/zatrudnienia. Je艣li wprowadz臋 w b艂膮d dotycz膮cy mojej zdolno艣ci do uczestnictwa, zgadzam si臋 zap艂aci膰 wszelkie op艂aty, kt贸re zosta艂y pocz膮tkowo zaniechane w oparciu o m贸j status edukacyjny.',
+      },
+      title: 'Warunki i umowy',
+    },
+  },
+  toVerified: 'Uzyskaj potwierdzenie edukacji',
+  submit: 'Zatwierd藕',
+  rejectContent: 'Niestety, nie kwalifikujesz si臋 do statusu Zweryfikowanej Edukacji i w zwi膮zku z tym nie mo偶esz otrzyma膰 ekskluzywnego kuponu 100% na plan Dify Professional, je艣li korzystasz z tego adresu e-mail.',
+  successContent: 'Wydali艣my kupon rabatowy na 100% dla planu Dify Professional na Twoje konto. Kupon jest wa偶ny przez jeden rok, prosimy o jego u偶ycie w okresie wa偶no艣ci.',
+  currentSigned: 'AKTUALNIE ZALOGOWANY JAKO',
+  successTitle: 'Masz zweryfikowane wykszta艂cenie Dify',
+  rejectTitle: 'Twoja weryfikacja edukacyjna Dify zosta艂a odrzucona',
+  learn: 'Dowiedz si臋, jak uzyska膰 potwierdzenie wykszta艂cenia',
+  emailLabel: 'Tw贸j aktualny email',
+  submitError: 'Przes艂anie formularza nie powiod艂o si臋. Prosz臋 spr贸bowa膰 ponownie p贸藕niej.',
+}
+
+export default translation
diff --git a/i18n/pl-PL/explore.ts b/i18n/pl-PL/explore.ts
new file mode 100644
index 0000000..f9e8b30
--- /dev/null
+++ b/i18n/pl-PL/explore.ts
@@ -0,0 +1,45 @@
+const translation = {
+  title: 'Odkryj',
+  sidebar: {
+    discovery: 'Odkrywanie',
+    chat: 'Czat',
+    workspace: 'Przestrze艅 robocza',
+    action: {
+      pin: 'Przypnij',
+      unpin: 'Odepnij',
+      rename: 'Zmie艅 nazw臋',
+      delete: 'Usu艅',
+    },
+    delete: {
+      title: 'Usu艅 aplikacj臋',
+      content: 'Czy na pewno chcesz usun膮膰 t臋 aplikacj臋?',
+    },
+  },
+  apps: {
+    title: 'Odkrywaj aplikacje stworzone przez Dify',
+    description:
+      'Wykorzystaj te aplikacje szablonowe natychmiast lub dostosuj w艂asne aplikacje na podstawie szablon贸w.',
+    allCategories: 'Polecane',
+  },
+  appCard: {
+    addToWorkspace: 'Dodaj do przestrzeni roboczej',
+    customize: 'Dostosuj',
+  },
+  appCustomize: {
+    title: 'Utw贸rz aplikacj臋 z {{name}}',
+    subTitle: 'Ikona i nazwa aplikacji',
+    nameRequired: 'Nazwa aplikacji jest wymagana',
+  },
+  category: {
+    Assistant: 'Asystent',
+    Writing: 'Pisanie',
+    Translate: 'T艂umaczenie',
+    Programming: 'Programowanie',
+    HR: 'HR',
+    Agent: 'Agent',
+    Workflow: 'Przep艂yw pracy',
+    Entertainment: 'Rozrywka',
+  },
+}
+
+export default translation
diff --git a/i18n/pl-PL/layout.ts b/i18n/pl-PL/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/pl-PL/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/pl-PL/login.ts b/i18n/pl-PL/login.ts
new file mode 100644
index 0000000..99719fe
--- /dev/null
+++ b/i18n/pl-PL/login.ts
@@ -0,0 +1,115 @@
+const translation = {
+  pageTitle: 'Cze艣膰, zaczynajmy!馃憢',
+  welcome: 'Witaj w Dify, zaloguj si臋, aby kontynuowa膰.',
+  email: 'Adres e-mail',
+  emailPlaceholder: 'Tw贸j adres e-mail',
+  password: 'Has艂o',
+  passwordPlaceholder: 'Twoje has艂o',
+  name: 'Nazwa u偶ytkownika',
+  namePlaceholder: 'Twoja nazwa u偶ytkownika',
+  forget: 'Zapomnia艂e艣 has艂a?',
+  signBtn: 'Zaloguj si臋',
+  sso: 'Kontynuuj za pomoc膮 SSO',
+  installBtn: 'Ustaw',
+  setAdminAccount: 'Ustawianie konta administratora',
+  setAdminAccountDesc:
+    'Maksymalne uprawnienia dla konta administratora, kt贸re mo偶na u偶y膰 do tworzenia aplikacji i zarz膮dzania dostawcami LLM, itp.',
+  createAndSignIn: 'Utw贸rz i zaloguj si臋',
+  oneMoreStep: 'Jeszcze jeden krok',
+  createSample:
+    'Na podstawie tych informacji, utworzymy dla Ciebie przyk艂adow膮 aplikacj臋',
+  invitationCode: 'Kod zaproszenia',
+  invitationCodePlaceholder: 'Tw贸j kod zaproszenia',
+  interfaceLanguage: 'J臋zyk interfejsu',
+  timezone: 'Strefa czasowa',
+  go: 'Przejd藕 do Dify',
+  sendUsMail:
+    'Wy艣lij nam e-mail z swoim wst臋pem, a my zajmiemy si臋 pro艣b膮 o zaproszenie.',
+  acceptPP: 'Przeczyta艂em/am i akceptuj臋 polityk臋 prywatno艣ci',
+  reset: 'Uruchom poni偶sz膮 komend臋, aby zresetowa膰 swoje has艂o',
+  withGitHub: 'Kontynuuj za pomoc膮 GitHub',
+  withGoogle: 'Kontynuuj za pomoc膮 Google',
+  rightTitle: 'Odblokuj pe艂ny potencja艂 LLM',
+  rightDesc:
+    '艁atwo buduj wizualnie atrakcyjne, dzia艂aj膮ce i udoskonalane aplikacje AI.',
+  tos: 'Warunki 艣wiadczenia us艂ug',
+  pp: 'Polityka prywatno艣ci',
+  tosDesc: 'Za艂o偶eniem konta zgadzasz si臋 z naszymi',
+  goToInit: 'Je艣li nie zainicjowa艂e艣 konta, przejd藕 do strony inicjalizacji',
+  dontHave: 'Nie masz?',
+  invalidInvitationCode: 'Niew艂a艣ciwy kod zaproszenia',
+  accountAlreadyInited: 'Konto ju偶 zainicjowane',
+  forgotPassword: 'Zapomnia艂e艣 has艂a?',
+  resetLinkSent: 'Link resetuj膮cy zosta艂 wys艂any',
+  sendResetLink: 'Wy艣lij link resetuj膮cy',
+  backToSignIn: 'Powr贸t do logowania',
+  forgotPasswordDesc: 'Prosz臋 poda膰 sw贸j adres e-mail, aby zresetowa膰 has艂o. Wy艣lemy Ci e-mail z instrukcjami, jak zresetowa膰 has艂o.',
+  checkEmailForResetLink: 'Prosz臋 sprawdzi膰 sw贸j e-mail w poszukiwaniu linku do resetowania has艂a. Je艣li nie pojawi si臋 w ci膮gu kilku minut, sprawd藕 folder spam.',
+  passwordChanged: 'Zaloguj si臋 teraz',
+  changePassword: 'Zmie艅 has艂o',
+  changePasswordTip: 'Wprowad藕 nowe has艂o do swojego konta',
+  invalidToken: 'Nieprawid艂owy lub wygas艂y token',
+  confirmPassword: 'Potwierd藕 has艂o',
+  confirmPasswordPlaceholder: 'Potwierd藕 nowe has艂o',
+  passwordChangedTip: 'Twoje has艂o zosta艂o pomy艣lnie zmienione',
+  error: {
+    emailEmpty: 'Adres e-mail jest wymagany',
+    emailInValid: 'Prosz臋 wpisa膰 prawid艂owy adres e-mail',
+    nameEmpty: 'Nazwa jest wymagana',
+    passwordEmpty: 'Has艂o jest wymagane',
+    passwordInvalid:
+      'Has艂o musi zawiera膰 litery i cyfry, a jego d艂ugo艣膰 musi by膰 wi臋ksza ni偶 8',
+    passwordLengthInValid: 'Has艂o musi sk艂ada膰 si臋 z co najmniej 8 znak贸w',
+    registrationNotAllowed: 'Nie znaleziono konta. Skontaktuj si臋 z administratorem systemu, aby si臋 zarejestrowa膰.',
+  },
+  license: {
+    tip: 'Przed rozpocz臋ciem wersji spo艂eczno艣ciowej Dify, przeczytaj GitHub',
+    link: 'Licencj臋 open-source',
+  },
+  join: 'Do艂膮cz',
+  joinTipStart: 'Zapraszam Ci臋 do do艂膮czenia do',
+  joinTipEnd: 'zespo艂u na Dify',
+  invalid: 'Link wygas艂',
+  explore: 'Odkryj Dify',
+  activatedTipStart: 'Do艂膮czy艂e艣 do',
+  activatedTipEnd: 'zespo艂u',
+  activated: 'Zaloguj si臋 teraz',
+  adminInitPassword: 'Has艂o inicjalizacyjne administratora',
+  validate: 'Sprawd藕',
+  checkCode: {
+    verify: 'Zweryfikowa膰',
+    resend: 'Wys艂a膰',
+    invalidCode: 'Nieprawid艂owy kod',
+    verificationCodePlaceholder: 'Wprowad藕 6-cyfrowy kod',
+    validTime: 'Pami臋taj, 偶e kod jest wa偶ny przez 5 minut',
+    checkYourEmail: 'Sprawd藕 swoj膮 poczt臋 e-mail',
+    useAnotherMethod: 'U偶yj innej metody',
+    didNotReceiveCode: 'Nie otrzyma艂e艣 kodu?',
+    verificationCode: 'Kod weryfikacyjny',
+    tips: 'Wysy艂amy kod weryfikacyjny na <strong>adres {{email}}</strong>',
+    emptyCode: 'Kod jest wymagany',
+  },
+  continueWithCode: 'Kontynuuj z kodem',
+  setYourAccount: 'Ustaw swoje konto',
+  usePassword: 'U偶yj has艂a',
+  withSSO: 'Kontynuuj logowanie jednokrotne',
+  sendVerificationCode: 'Wy艣lij kod weryfikacyjny',
+  back: 'Wstecz',
+  resetPassword: 'Zresetuj has艂o',
+  changePasswordBtn: 'Ustawianie has艂a',
+  backToLogin: 'Powr贸t do logowania',
+  useVerificationCode: 'U偶yj kodu weryfikacyjnego',
+  enterYourName: 'Podaj swoj膮 nazw臋 u偶ytkownika',
+  resetPasswordDesc: 'Wpisz adres e-mail, kt贸rego u偶y艂e艣 do rejestracji w Dify, a my wy艣lemy Ci wiadomo艣膰 e-mail z pro艣b膮 o zresetowanie has艂a.',
+  or: 'LUB',
+  noLoginMethodTip: 'Skontaktuj si臋 z administratorem systemu, aby doda膰 metod臋 uwierzytelniania.',
+  noLoginMethod: 'Nie skonfigurowano metody uwierzytelniania',
+  licenseLost: 'Utrata licencji',
+  licenseExpired: 'Licencja wygas艂a',
+  licenseInactive: 'Licencja nieaktywna',
+  licenseExpiredTip: 'Licencja Dify Enterprise dla Twojego obszaru roboczego wygas艂a. Skontaktuj si臋 z administratorem, aby kontynuowa膰 korzystanie z Dify.',
+  licenseLostTip: 'Nie uda艂o si臋 nawi膮za膰 po艂膮czenia z serwerem licencji Dify. Skontaktuj si臋 z administratorem, aby kontynuowa膰 korzystanie z Dify.',
+  licenseInactiveTip: 'Licencja Dify Enterprise dla Twojego obszaru roboczego jest nieaktywna. Skontaktuj si臋 z administratorem, aby kontynuowa膰 korzystanie z Dify.',
+}
+
+export default translation
diff --git a/i18n/pl-PL/plugin-tags.ts b/i18n/pl-PL/plugin-tags.ts
new file mode 100644
index 0000000..600fa02
--- /dev/null
+++ b/i18n/pl-PL/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    business: 'Biznes',
+    weather: 'Pogoda',
+    entertainment: 'Rozrywka',
+    education: 'Edukacja',
+    agent: 'Agent',
+    videos: 'Filmy',
+    utilities: 'Narz臋dzia',
+    image: 'Obraz',
+    other: 'Inny',
+    news: 'Wiadomo艣ci',
+    social: 'Spo艂eczny',
+    medical: 'Medyczny',
+    search: 'Szuka膰',
+    productivity: 'Produktywno艣膰',
+    travel: 'Podr贸偶',
+    design: 'Projekt',
+    finance: 'Finanse',
+  },
+  searchTags: 'Szukaj tag贸w',
+  allTags: 'Wszystkie tagi',
+}
+
+export default translation
diff --git a/i18n/pl-PL/plugin.ts b/i18n/pl-PL/plugin.ts
new file mode 100644
index 0000000..0883a98
--- /dev/null
+++ b/i18n/pl-PL/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    extensions: 'Rozszerzenia',
+    agents: 'Strategie agent贸w',
+    bundles: 'Wi膮zki',
+    all: 'Ca艂y',
+    tools: 'Narz臋dzia',
+    models: 'Modele',
+  },
+  categorySingle: {
+    model: 'Model',
+    extension: 'Rozszerzenie',
+    bundle: 'Pakiet',
+    agent: 'Strategia agenta',
+    tool: 'Narz臋dzie',
+  },
+  list: {
+    source: {
+      marketplace: 'Instalowanie z Marketplace',
+      github: 'Instalowanie z us艂ugi GitHub',
+      local: 'Zainstaluj z lokalnego pliku pakietu',
+    },
+    notFound: 'Nie znaleziono wtyczek',
+    noInstalled: 'Brak zainstalowanych wtyczek',
+  },
+  source: {
+    github: 'Us艂uga GitHub',
+    local: 'Lokalny plik pakietu',
+    marketplace: 'Rynek',
+  },
+  detailPanel: {
+    categoryTip: {
+      local: 'Wtyczka lokalna',
+      github: 'Zainstalowany z Github',
+      marketplace: 'Zainstalowano z witryny Marketplace',
+      debugging: 'Wtyczka do debugowania',
+    },
+    operation: {
+      remove: 'Usun膮膰',
+      checkUpdate: 'Sprawd藕 aktualizacj臋',
+      detail: 'Szczeg贸艂y',
+      update: 'Aktualizacja',
+      install: 'Instalowa膰',
+      viewDetail: 'Poka偶 szczeg贸艂y',
+      info: 'Informacje o wtyczce',
+    },
+    toolSelector: {
+      unsupportedContent2: 'Kliknij, aby zmieni膰 wersj臋.',
+      uninstalledLink: 'Zarz膮dzanie we wtyczkach',
+      placeholder: 'Wybierz narz臋dzie...',
+      paramsTip1: 'Steruje parametrami wnioskowania LLM.',
+      unsupportedContent: 'Zainstalowana wersja wtyczki nie zapewnia tej akcji.',
+      params: 'KONFIGURACJA ROZUMOWANIA',
+      auto: 'Automatyczne',
+      empty: 'Kliknij przycisk "+", aby doda膰 narz臋dzia. Mo偶esz doda膰 wiele narz臋dzi.',
+      descriptionLabel: 'Opis narz臋dzia',
+      title: 'Dodaj narz臋dzie',
+      descriptionPlaceholder: 'Kr贸tki opis przeznaczenia narz臋dzia, np. zmierzenie temperatury dla konkretnej lokalizacji.',
+      settings: 'USTAWIENIA U呕YTKOWNIKA',
+      uninstalledContent: 'Ta wtyczka jest instalowana z repozytorium lokalnego/GitHub. Prosz臋 u偶y膰 po instalacji.',
+      unsupportedTitle: 'Nieobs艂ugiwana akcja',
+      uninstalledTitle: 'Narz臋dzie nie jest zainstalowane',
+      paramsTip2: 'Gdy opcja "Automatycznie" jest wy艂膮czona, u偶ywana jest warto艣膰 domy艣lna.',
+      toolLabel: 'Narz臋dzie',
+    },
+    strategyNum: '{{liczba}} {{strategia}} ZAWARTE',
+    endpointsEmpty: 'Kliknij przycisk "+", aby doda膰 punkt ko艅cowy',
+    endpointDisableTip: 'Wy艂膮cz punkt ko艅cowy',
+    endpoints: 'Punkty ko艅cowe',
+    disabled: 'Niepe艂nosprawny',
+    endpointModalTitle: 'Punkt ko艅cowy konfiguracji',
+    endpointsDocLink: 'Wy艣wietlanie dokumentu',
+    endpointDeleteTip: 'Usu艅 punkt ko艅cowy',
+    actionNum: '{{liczba}} {{akcja}} ZAWARTE',
+    configureTool: 'Narz臋dzie konfiguracji',
+    configureModel: 'Konfiguracja modelu',
+    switchVersion: 'Wersja prze艂膮cznika',
+    serviceOk: 'Serwis OK',
+    configureApp: 'Konfiguracja aplikacji',
+    endpointModalDesc: 'Po skonfigurowaniu mo偶na korzysta膰 z funkcji dostarczanych przez wtyczk臋 za po艣rednictwem punkt贸w ko艅cowych API.',
+    endpointDisableContent: 'Czy chcesz wy艂膮czy膰 {{name}}?',
+    endpointDeleteContent: 'Czy chcesz usun膮膰 {{name}}?',
+    endpointsTip: 'Ta wtyczka zapewnia okre艣lone funkcje za po艣rednictwem punkt贸w ko艅cowych i mo偶na skonfigurowa膰 wiele zestaw贸w punkt贸w ko艅cowych dla bie偶膮cego obszaru roboczego.',
+    modelNum: '{{liczba}} MODELE W ZESTAWIE',
+  },
+  debugInfo: {
+    viewDocs: 'Wy艣wietlanie dokument贸w',
+    title: 'Debugowanie',
+  },
+  privilege: {
+    everyone: 'Ka偶dy',
+    whoCanDebug: 'Kto mo偶e debugowa膰 wtyczki?',
+    admins: 'Administratorzy',
+    noone: 'Nikt',
+    whoCanInstall: 'Kto mo偶e instalowa膰 wtyczki i nimi zarz膮dza膰?',
+    title: 'Preferencje wtyczek',
+  },
+  pluginInfoModal: {
+    packageName: 'Pakiet',
+    title: 'Informacje o wtyczce',
+    release: 'Zwolni膰',
+    repository: 'Repozytorium',
+  },
+  action: {
+    deleteContentLeft: 'Czy chcesz usun膮膰',
+    delete: 'Usu艅 wtyczk臋',
+    pluginInfo: 'Informacje o wtyczce',
+    checkForUpdates: 'Sprawd藕 dost臋pno艣膰 aktualizacji',
+    usedInApps: 'Ta wtyczka jest u偶ywana w aplikacjach {{num}}.',
+    deleteContentRight: 'wtyczka?',
+  },
+  installModal: {
+    labels: {
+      package: 'Pakiet',
+      repository: 'Repozytorium',
+      version: 'Wersja',
+    },
+    installPlugin: 'Zainstaluj wtyczk臋',
+    install: 'Instalowa膰',
+    installFailedDesc: 'Instalacja wtyczki nie powiod艂a si臋.',
+    installedSuccessfullyDesc: 'Wtyczka zosta艂a pomy艣lnie zainstalowana.',
+    back: 'Wstecz',
+    readyToInstallPackages: 'Informacje o instalacji nast臋puj膮cych wtyczek {{num}}',
+    cancel: 'Anuluj',
+    pluginLoadError: 'B艂膮d 艂adowania wtyczki',
+    installing: 'Instalowanie...',
+    installFailed: 'Instalacja nie powiod艂a si臋',
+    installComplete: 'Instalacja zako艅czona',
+    readyToInstall: 'Informacje o instalacji nast臋puj膮cej wtyczki',
+    dropPluginToInstall: 'Upu艣膰 pakiet wtyczek tutaj, aby zainstalowa膰',
+    uploadFailed: 'Przekazywanie nie powiod艂o si臋',
+    next: 'Nast臋pny',
+    fromTrustSource: 'Upewnij si臋, 偶e instalujesz wtyczki tylko z <trustSource>zaufanego 藕r贸d艂a</trustSource>.',
+    pluginLoadErrorDesc: 'Ta wtyczka nie zostanie zainstalowana',
+    close: 'Zamyka膰',
+    readyToInstallPackage: 'Informacje o instalacji nast臋puj膮cej wtyczki',
+    uploadingPackage: 'Przesy艂anie {{packageName}}...',
+    installedSuccessfully: 'Instalacja powiod艂a si臋',
+  },
+  installFromGitHub: {
+    installPlugin: 'Zainstaluj wtyczk臋 z GitHub',
+    selectVersionPlaceholder: 'Prosz臋 wybra膰 wersj臋',
+    gitHubRepo: 'Repozytorium GitHub',
+    uploadFailed: 'Przekazywanie nie powiod艂o si臋',
+    selectVersion: 'Wybierz wersj臋',
+    installFailed: 'Instalacja nie powiod艂a si臋',
+    updatePlugin: 'Zaktualizuj wtyczk臋 z GitHub',
+    selectPackagePlaceholder: 'Prosz臋 wybra膰 pakiet',
+    selectPackage: 'Wybierz pakiet',
+    installedSuccessfully: 'Instalacja powiod艂a si臋',
+    installNote: 'Upewnij si臋, 偶e instalujesz wtyczki tylko z zaufanego 藕r贸d艂a.',
+  },
+  upgrade: {
+    successfulTitle: 'Instalacja powiod艂a si臋',
+    description: 'Informacje o instalacji nast臋puj膮cej wtyczki',
+    close: 'Zamyka膰',
+    upgrade: 'Instalowa膰',
+    title: 'Zainstaluj wtyczk臋',
+    upgrading: 'Instalowanie...',
+    usedInApps: 'U偶ywane w aplikacjach {{num}}',
+  },
+  error: {
+    inValidGitHubUrl: 'Nieprawid艂owy adres URL us艂ugi GitHub. Podaj prawid艂owy adres URL w formacie: https://github.com/owner/repo',
+    noReleasesFound: 'Nie znaleziono wyda艅. Sprawd藕 repozytorium GitHub lub wej艣ciowy adres URL.',
+    fetchReleasesError: 'Nie mo偶na pobra膰 wyda艅. Spr贸buj ponownie p贸藕niej.',
+  },
+  marketplace: {
+    sortOption: {
+      newlyReleased: 'Nowo wydany',
+      firstReleased: 'Po raz pierwszy wydany',
+      recentlyUpdated: 'Ostatnio zaktualizowane',
+      mostPopular: 'Najpopularniejsze',
+    },
+    sortBy: 'Czarne miasto',
+    discover: 'Odkry膰',
+    moreFrom: 'Wi臋cej z Marketplace',
+    empower: 'Zwi臋ksz mo偶liwo艣ci rozwoju sztucznej inteligencji',
+    viewMore: 'Zobacz wi臋cej',
+    and: 'i',
+    difyMarketplace: 'Rynek Dify',
+    noPluginFound: 'Nie znaleziono wtyczki',
+    pluginsResult: '{{num}} wyniki',
+    partnerTip: 'Zweryfikowane przez partnera Dify',
+    verifiedTip: 'Zweryfikowane przez Dify',
+  },
+  task: {
+    installError: 'Nie uda艂o si臋 zainstalowa膰 wtyczek {{errorLength}}, kliknij, aby wy艣wietli膰',
+    installedError: 'Nie uda艂o si臋 zainstalowa膰 wtyczek {{errorLength}}',
+    installing: 'Instalowanie wtyczek {{installingLength}}, 0 gotowe.',
+    installingWithSuccess: 'Instalacja wtyczek {{installingLength}}, {{successLength}} powodzenie.',
+    clearAll: 'Wyczy艣膰 wszystko',
+    installingWithError: 'Instalacja wtyczek {{installingLength}}, {{successLength}} powodzenie, {{errorLength}} niepowodzenie',
+  },
+  search: 'Szuka膰',
+  installFrom: 'ZAINSTALUJ Z',
+  searchCategories: 'Kategorie wyszukiwania',
+  allCategories: 'Wszystkie kategorie',
+  findMoreInMarketplace: 'Wi臋cej informacji w Marketplace',
+  searchInMarketplace: 'Wyszukiwanie w Marketplace',
+  endpointsEnabled: '{{num}} w艂膮czone zestawy punkt贸w ko艅cowych',
+  install: '{{num}} instalacji',
+  installAction: 'Instalowa膰',
+  installPlugin: 'Zainstaluj wtyczk臋',
+  from: 'Z',
+  fromMarketplace: 'Z Marketplace',
+  searchPlugins: 'Wtyczki wyszukiwania',
+  searchTools: 'Narz臋dzia wyszukiwania...',
+  submitPlugin: 'Prze艣lij wtyczk臋',
+  metadata: {
+    title: 'Wtyczki',
+  },
+  difyVersionNotCompatible: 'Obecna wersja Dify nie jest kompatybilna z tym wtyczk膮, prosz臋 zaktualizowa膰 do minimalnej wymaganej wersji: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/pl-PL/register.ts b/i18n/pl-PL/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/pl-PL/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/pl-PL/run-log.ts b/i18n/pl-PL/run-log.ts
new file mode 100644
index 0000000..5762005
--- /dev/null
+++ b/i18n/pl-PL/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: 'WEJ艢CIE',
+  result: 'WYNIK',
+  detail: 'SZCZEG脫艁Y',
+  tracing: '艢LEDZENIE',
+  resultPanel: {
+    status: 'STATUS',
+    time: 'CZAS WYKONANIA',
+    tokens: 'CA艁KOWITA LICZBA TOKEN脫W',
+  },
+  meta: {
+    title: 'METADANE',
+    status: 'Status',
+    version: 'Wersja',
+    executor: 'Wykonawca',
+    startTime: 'Czas rozpocz臋cia',
+    time: 'Czas trwania',
+    tokens: 'Liczba token贸w',
+    steps: 'Kroki wykonania',
+  },
+  resultEmpty: {
+    title: 'To wykonanie generuje tylko format JSON,',
+    tipLeft: 'prosz臋 przejd藕 do ',
+    link: 'panelu szczeg贸艂贸w',
+    tipRight: ' aby je zobaczy膰.',
+  },
+  circularInvocationTip: 'W bie偶膮cym przep艂ywie pracy istnieje cykliczne wywo艂ywanie narz臋dzi/w臋z艂贸w.',
+  actionLogs: 'Dzienniki akcji',
+}
+
+export default translation
diff --git a/i18n/pl-PL/share-app.ts b/i18n/pl-PL/share-app.ts
new file mode 100644
index 0000000..80619cf
--- /dev/null
+++ b/i18n/pl-PL/share-app.ts
@@ -0,0 +1,83 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: 'Aplikacja jest niedost臋pna',
+    appUnknownError: 'Aplikacja jest niedost臋pna',
+  },
+  chat: {
+    newChat: 'Nowy czat',
+    pinnedTitle: 'Przypi臋te',
+    unpinnedTitle: 'Czaty',
+    newChatDefaultName: 'Nowa rozmowa',
+    resetChat: 'Resetuj rozmow臋',
+    poweredBy: 'Dzia艂any przez',
+    prompt: 'Podpowied藕',
+    privatePromptConfigTitle: 'Ustawienia rozmowy',
+    publicPromptConfigTitle: 'Pocz膮tkowa podpowied藕',
+    configStatusDes:
+      'Przed rozpocz臋ciem mo偶esz zmodyfikowa膰 ustawienia rozmowy',
+    configDisabled: 'Ustawienia poprzedniej sesji zosta艂y u偶yte w tej sesji.',
+    startChat: 'Zacznij czat',
+    privacyPolicyLeft: 'Prosz臋 przeczyta膰 ',
+    privacyPolicyMiddle: 'polityk臋 prywatno艣ci',
+    privacyPolicyRight: ' dostarczon膮 przez dewelopera aplikacji.',
+    deleteConversation: {
+      title: 'Usu艅 rozmow臋',
+      content: 'Czy na pewno chcesz usun膮膰 t臋 rozmow臋?',
+    },
+    tryToSolve: 'Spr贸buj rozwi膮za膰',
+    temporarySystemIssue: 'Przepraszamy, tymczasowy problem systemowy.',
+    expand: 'Rozwi艅',
+    collapse: 'Zwi艅',
+    chatSettingsTitle: 'Nowa konfiguracja czatu',
+    viewChatSettings: 'Zobacz ustawienia czatu',
+    chatFormTip: 'Ustawienia czatu nie mog膮 by膰 modyfikowane po rozpocz臋ciu czatu.',
+    newChatTip: 'Ju偶 w nowej czacie',
+  },
+  generation: {
+    tabs: {
+      create: 'Uruchom raz',
+      batch: 'Uruchom parti臋',
+      saved: 'Zapisane',
+    },
+    savedNoData: {
+      title: 'Nie zapisa艂e艣 jeszcze wyniku!',
+      description:
+        'Zacznij generowa膰 tre艣膰 i znajd藕 swoje zapisane wyniki tutaj.',
+      startCreateContent: 'Zacznij tworzy膰 tre艣膰',
+    },
+    title: 'Uzupe艂nianie AI',
+    queryTitle: 'Zapytaj o tre艣膰',
+    completionResult: 'Wynik uzupe艂nienia',
+    queryPlaceholder: 'Wpisz swoj膮 tre艣膰 zapytania...',
+    run: 'Wykonaj',
+    copy: 'Kopiuj',
+    resultTitle: 'Uzupe艂nianie AI',
+    noData: 'AI poda Ci to, czego chcesz tutaj.',
+    csvUploadTitle: 'Przeci膮gnij i upu艣膰 plik CSV tutaj lub ',
+    browse: 'przegl膮daj',
+    csvStructureTitle: 'Plik CSV musi by膰 zgodny z nast臋puj膮c膮 struktur膮:',
+    downloadTemplate: 'Pobierz szablon tutaj',
+    field: 'Pole',
+    batchFailed: {
+      info: '{{num}} nieudanych wykonan',
+      retry: 'Powt贸rz',
+      outputPlaceholder: 'Brak tre艣ci wyj艣ciowej',
+    },
+    errorMsg: {
+      empty: 'Prosz臋 wprowad藕 tre艣膰 w za艂adowanym pliku.',
+      fileStructNotMatch: 'Za艂adowany plik CSV nie pasuje do struktury.',
+      emptyLine: 'Wiersz {{rowIndex}} jest pusty',
+      invalidLine:
+        'Wiersz {{rowIndex}}: warto艣膰 {{varName}} nie mo偶e by膰 pusta',
+      moreThanMaxLengthLine:
+        'Wiersz {{rowIndex}}: warto艣膰 {{varName}} nie mo偶e mie膰 wi臋cej ni偶 {{maxLength}} znak贸w',
+      atLeastOne:
+        'Prosz臋 wprowad藕 co najmniej jeden wiersz w za艂adowanym pliku.',
+    },
+    executions: '{{num}} EGZEKUCJI',
+    execution: 'WYKONANIE',
+  },
+}
+
+export default translation
diff --git a/i18n/pl-PL/time.ts b/i18n/pl-PL/time.ts
new file mode 100644
index 0000000..e98ebdd
--- /dev/null
+++ b/i18n/pl-PL/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Thu: 'Czw',
+    Tue: 'Wtorek',
+    Mon: 'Mon',
+    Sun: 'S艂o艅ce',
+    Fri: 'Wolny',
+    Sat: 'Sat',
+    Wed: '艢roda',
+  },
+  months: {
+    July: 'lipiec',
+    January: 'Stycze艅',
+    August: 'Sierpie艅',
+    February: 'Luty',
+    October: 'Pa藕dziernik',
+    April: 'Kwiecie艅',
+    December: 'Grudzie艅',
+    March: 'Marzec',
+    May: 'Maj',
+    September: 'Wrzesie艅',
+    June: 'Czerwiec',
+    November: 'Listopad',
+  },
+  operation: {
+    cancel: 'Anuluj',
+    pickDate: 'Wybierz dat臋',
+    now: 'Teraz',
+    ok: 'OK',
+  },
+  title: {
+    pickTime: 'Wybierz czas',
+  },
+  defaultPlaceholder: 'Wybierz czas...',
+}
+
+export default translation
diff --git a/i18n/pl-PL/tools.ts b/i18n/pl-PL/tools.ts
new file mode 100644
index 0000000..49e30c5
--- /dev/null
+++ b/i18n/pl-PL/tools.ts
@@ -0,0 +1,162 @@
+const translation = {
+  title: 'Narz臋dzia',
+  createCustomTool: 'Utw贸rz niestandardowe narz臋dzie',
+  type: {
+    all: 'Wszystkie',
+    builtIn: 'Wbudowane',
+    custom: 'Niestandardowe',
+    workflow: 'Przep艂yw pracy',
+  },
+  contribute: {
+    line1: 'Interesuje mnie ',
+    line2: 'wsp贸艂tworzenie narz臋dzi dla Dify.',
+    viewGuide: 'Zobacz przewodnik',
+  },
+  author: 'Przez',
+  auth: {
+    unauthorized: 'Autoryzacja',
+    authorized: 'Zautoryzowane',
+    setup: 'Skonfiguruj autoryzacj臋 aby u偶y膰',
+    setupModalTitle: 'Konfiguruj autoryzacj臋',
+    setupModalTitleDescription:
+      'Po skonfigurowaniu po艣wiadcze艅 wszyscy cz艂onkowie w przestrzeni roboczej mog膮 u偶ywa膰 tego narz臋dzia podczas projektowania aplikacji.',
+  },
+  includeToolNum: '{{num}} narz臋dzi zawarte',
+  addTool: 'Dodaj narz臋dzie',
+  createTool: {
+    title: 'Utw贸rz niestandardowe narz臋dzie',
+    editAction: 'Konfiguruj',
+    editTitle: 'Edytuj niestandardowe narz臋dzie',
+    name: 'Nazwa',
+    toolNamePlaceHolder: 'Wprowad藕 nazw臋 narz臋dzia',
+    schema: 'Schemat',
+    schemaPlaceHolder: 'Wprowad藕 tutaj sw贸j schemat OpenAPI',
+    viewSchemaSpec: 'Zobacz specyfikacj臋 OpenAPI-Swagger',
+    importFromUrl: 'Importuj z adresu URL',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: 'Prosz臋 poda膰 prawid艂owy URL',
+    examples: 'Przyk艂ady',
+    exampleOptions: {
+      json: 'Pogoda (JSON)',
+      yaml: 'Sklep Zoologiczny (YAML)',
+      blankTemplate: 'Pusty szablon',
+    },
+    availableTools: {
+      title: 'Dost臋pne narz臋dzia',
+      name: 'Nazwa',
+      description: 'Opis',
+      method: 'Metoda',
+      path: '艢cie偶ka',
+      action: 'Akcje',
+      test: 'Test',
+    },
+    authMethod: {
+      title: 'Metoda autoryzacji',
+      type: 'Typ autoryzacji',
+      keyTooltip:
+        'Klucz nag艂贸wka HTTP, Mo偶esz pozostawi膰 go z "Autoryzacja" je艣li nie wiesz co to jest lub ustaw go na niestandardow膮 warto艣膰',
+      types: {
+        none: 'Brak',
+        api_key: 'Klucz API',
+        apiKeyPlaceholder: 'Nazwa nag艂贸wka HTTP dla Klucza API',
+        apiValuePlaceholder: 'Wprowad藕 Klucz API',
+      },
+      key: 'Klucz',
+      value: 'Warto艣膰',
+    },
+    authHeaderPrefix: {
+      title: 'Typ autoryzacji',
+      types: {
+        basic: 'Podstawowa',
+        bearer: 'Bearer',
+        custom: 'Niestandardowa',
+      },
+    },
+    privacyPolicy: 'Polityka prywatno艣ci',
+    privacyPolicyPlaceholder: 'Prosz臋 wprowadzi膰 polityk臋 prywatno艣ci',
+    customDisclaimer: 'O艣wiadczenie niestandardowe',
+    customDisclaimerPlaceholder: 'Prosz臋 wprowadzi膰 o艣wiadczenie niestandardowe',
+    deleteToolConfirmTitle: 'Skasuj ten przyrz膮d?',
+    deleteToolConfirmContent: 'Usuni臋cie narz臋dzia jest nieodwracalne. U偶ytkownicy nie b臋d膮 mieli ju偶 dost臋pu do Twojego narz臋dzia.',
+    toolInput: {
+      name: 'Nazwa',
+      required: 'Wymagane',
+      descriptionPlaceholder: 'Opis znaczenia parametru',
+      methodParameter: 'Parametr',
+      label: 'Tagi',
+      methodSetting: 'Ustawienie',
+      description: 'Opis',
+      method: 'Metoda',
+      methodParameterTip: 'LLM wype艂nia si臋 podczas wnioskowania',
+      labelPlaceholder: 'Wybierz tagi (opcjonalnie)',
+      methodSettingTip: 'U偶ytkownik wype艂nia konfiguracj臋 narz臋dzia',
+      title: 'Wprowadzanie narz臋dzi',
+    },
+    nameForToolCall: 'Nazwa wywo艂ania narz臋dzia',
+    description: 'Opis',
+    descriptionPlaceholder: 'Kr贸tki opis przeznaczenia narz臋dzia, np. zmierz temperatur臋 dla konkretnej lokalizacji.',
+    nameForToolCallTip: 'Obs艂uguje tylko cyfry, litery i podkre艣lenia.',
+    nameForToolCallPlaceHolder: 'S艂u偶y do rozpoznawania maszyn, takich jak getCurrentWeather, list_pets',
+    confirmTip: 'B臋dzie to mia艂o wp艂yw na aplikacje korzystaj膮ce z tego narz臋dzia',
+    confirmTitle: 'Potwierd藕, aby zapisa膰 ?',
+  },
+  test: {
+    title: 'Test',
+    parametersValue: 'Parametry i Warto艣膰',
+    parameters: 'Parametry',
+    value: 'Warto艣膰',
+    testResult: 'Wyniki testu',
+    testResultPlaceholder: 'Wynik testu pojawi si臋 tutaj',
+  },
+  thought: {
+    using: 'U偶ywanie',
+    used: 'U偶yty',
+    requestTitle: '呕膮danie do',
+    responseTitle: 'Odpowied藕 od',
+  },
+  setBuiltInTools: {
+    info: 'Informacje',
+    setting: 'Ustawienia',
+    toolDescription: 'Opis narz臋dzia',
+    parameters: 'parametry',
+    string: 'ci膮g znak贸w',
+    number: 'liczba',
+    required: 'Wymagane',
+    infoAndSetting: 'Informacje i Ustawienia',
+    file: 'plik',
+  },
+  noCustomTool: {
+    title: 'Brak niestandardowych narz臋dzi!',
+    content:
+      'Dodaj i zarz膮dzaj niestandardowymi narz臋dziami tutaj, aby budowa膰 aplikacje AI.',
+    createTool: 'Utw贸rz Narz臋dzie',
+  },
+  noSearchRes: {
+    title: 'Przykro nam, brak wynik贸w!',
+    content:
+      'Nie znale藕li艣my 偶adnych narz臋dzi pasuj膮cych do Twojego wyszukiwania.',
+    reset: 'Resetuj Wyszukiwanie',
+  },
+  builtInPromptTitle: 'Komunikat',
+  toolRemoved: 'Narz臋dzie usuni臋te',
+  notAuthorized: 'Narz臋dzie nieautoryzowane',
+  howToGet: 'Jak uzyska膰',
+  addToolModal: {
+    manageInTools: 'Zarz膮dzanie w Narz臋dziach',
+    added: 'Dodane',
+    type: 'typ',
+    category: 'kategoria',
+    add: 'dodawa膰',
+    emptyTitle: 'Brak dost臋pnego narz臋dzia do przep艂ywu pracy',
+    emptyTip: 'Przejd藕 do "Przep艂yw pracy -> Opublikuj jako narz臋dzie"',
+    emptyTitleCustom: 'Brak dost臋pnego narz臋dzia niestandardowego',
+    emptyTipCustom: 'Tworzenie narz臋dzia niestandardowego',
+  },
+  openInStudio: 'Otwieranie w Studio',
+  customToolTip: 'Dowiedz si臋 wi臋cej o niestandardowych narz臋dziach Dify',
+  toolNameUsageTip: 'Nazwa wywo艂ania narz臋dzia do wnioskowania i podpowiadania agentowi',
+  noTools: 'Nie znaleziono narz臋dzi',
+  copyToolName: 'Kopiuj nazw臋',
+}
+
+export default translation
diff --git a/i18n/pl-PL/workflow.ts b/i18n/pl-PL/workflow.ts
new file mode 100644
index 0000000..ebf1f47
--- /dev/null
+++ b/i18n/pl-PL/workflow.ts
@@ -0,0 +1,921 @@
+const translation = {
+  common: {
+    undo: 'Cofnij',
+    redo: 'Pon贸w',
+    editing: 'Edytowanie',
+    autoSaved: 'Automatycznie zapisane',
+    unpublished: 'Nieopublikowane',
+    published: 'Opublikowane',
+    publish: 'Opublikuj',
+    update: 'Aktualizuj',
+    run: 'Uruchom',
+    running: 'Uruchamianie',
+    inRunMode: 'W trybie uruchamiania',
+    inPreview: 'W podgl膮dzie',
+    inPreviewMode: 'W trybie podgl膮du',
+    preview: 'Podgl膮d',
+    viewRunHistory: 'Zobacz histori臋 uruchomie艅',
+    runHistory: 'Historia uruchomie艅',
+    goBackToEdit: 'Wr贸膰 do edytora',
+    conversationLog: 'Dziennik rozm贸w',
+    features: 'Funkcje',
+    debugAndPreview: 'Podgl膮d',
+    restart: 'Uruchom ponownie',
+    currentDraft: 'Bie偶膮cy szkic',
+    currentDraftUnpublished: 'Bie偶膮cy szkic nieopublikowany',
+    latestPublished: 'Najnowsze opublikowane',
+    publishedAt: 'Opublikowane',
+    restore: 'Przywr贸膰',
+    runApp: 'Uruchom aplikacj臋',
+    batchRunApp: 'Uruchom aplikacj臋 wsadowo',
+    accessAPIReference: 'Uzyskaj dost臋p do dokumentacji API',
+    embedIntoSite: 'Osad藕 na stronie',
+    addTitle: 'Dodaj tytu艂...',
+    addDescription: 'Dodaj opis...',
+    noVar: 'Brak zmiennej',
+    searchVar: 'Szukaj zmiennej',
+    variableNamePlaceholder: 'Nazwa zmiennej',
+    setVarValuePlaceholder: 'Ustaw zmienn膮',
+    needConnectTip: 'Ten krok nie jest po艂膮czony z niczym',
+    maxTreeDepth: 'Maksymalny limit {{depth}} w臋z艂贸w na ga艂膮藕',
+    needEndNode: 'Nale偶y doda膰 blok ko艅cowy',
+    needAnswerNode: 'Nale偶y doda膰 blok odpowiedzi',
+    workflowProcess: 'Proces przep艂ywu pracy',
+    notRunning: 'Jeszcze nie uruchomiono',
+    previewPlaceholder: 'Wprowad藕 tre艣膰 w poni偶szym polu, aby rozpocz膮膰 debugowanie Chatbota',
+    effectVarConfirm: {
+      title: 'Usu艅 zmienn膮',
+      content: 'Zmienna jest u偶ywana w innych w臋z艂ach. Czy na pewno chcesz j膮 usun膮膰?',
+    },
+    insertVarTip: 'Naci艣nij klawisz \'/\', aby szybko wstawi膰',
+    processData: 'Przetw贸rz dane',
+    input: 'Wej艣cie',
+    output: 'Wyj艣cie',
+    jinjaEditorPlaceholder: 'Naci艣nij \'/\' lub \'{\', aby wstawi膰 zmienn膮',
+    viewOnly: 'Tylko do podgl膮du',
+    showRunHistory: 'Poka偶 histori臋 uruchomie艅',
+    enableJinja: 'W艂膮cz obs艂ug臋 szablon贸w Jinja',
+    learnMore: 'Dowiedz si臋 wi臋cej',
+    copy: 'Kopiuj',
+    duplicate: 'Duplikuj',
+    addBlock: 'Dodaj blok',
+    pasteHere: 'Wklej tutaj',
+    pointerMode: 'Tryb wska藕nika',
+    handMode: 'Tryb r臋czny',
+    model: 'Model',
+    workflowAsTool: 'Przep艂yw pracy jako narz臋dzie',
+    configureRequired: 'Wymagana konfiguracja',
+    configure: 'Skonfiguruj',
+    manageInTools: 'Zarz膮dzaj w narz臋dziach',
+    workflowAsToolTip: 'Wymagana rekonfiguracja narz臋dzia po aktualizacji przep艂ywu pracy.',
+    viewDetailInTracingPanel: 'Zobacz szczeg贸艂y',
+    importDSLTip: 'Bie偶膮ca wersja robocza zostanie nadpisana. Eksportuj przep艂yw pracy jako kopi臋 zapasow膮 przed zaimportowaniem.',
+    syncingData: 'Synchronizacja danych w zaledwie kilka sekund.',
+    importSuccess: 'Import powodzenie',
+    importDSL: 'Importowanie DSL',
+    overwriteAndImport: 'Nadpisywanie i importowanie',
+    chooseDSL: 'Wybierz plik DSL(yml)',
+    backupCurrentDraft: 'Utw贸rz kopi臋 zapasow膮 bie偶膮cej wersji roboczej',
+    importFailure: 'Niepowodzenie importu',
+    parallelTip: {
+      click: {
+        title: 'Klika膰',
+        desc: ', aby doda膰',
+      },
+      drag: {
+        title: 'Przeci膮gn膮膰',
+        desc: 'aby si臋 po艂膮czy膰',
+      },
+      limit: 'R贸wnoleg艂o艣膰 jest ograniczona do ga艂臋zi {{num}}.',
+      depthLimit: 'Limit warstw zagnie偶d偶ania r贸wnoleg艂ego dla warstw {{num}}',
+    },
+    parallelRun: 'Bieg r贸wnoleg艂y',
+    jumpToNode: 'Przejd藕 do tego w臋z艂a',
+    disconnect: 'Od艂膮czy膰',
+    addParallelNode: 'Dodaj w臋ze艂 r贸wnoleg艂y',
+    parallel: 'R脫WNOLEG艁Y',
+    branch: 'GA艁膭殴',
+    ImageUploadLegacyTip: 'Teraz mo偶na tworzy膰 zmienne typu pliku w formularzu startowym. W przysz艂o艣ci nie b臋dziemy ju偶 obs艂ugiwa膰 funkcji przesy艂ania obraz贸w.',
+    fileUploadTip: 'Funkcje przesy艂ania obraz贸w zosta艂y zaktualizowane do przesy艂ania plik贸w.',
+    featuresDescription: 'Ulepszanie 艣rodowiska u偶ytkownika aplikacji internetowej',
+    featuresDocLink: 'Dowiedz si臋 wi臋cej',
+    importWarning: 'Ostro偶no艣膰',
+    importWarningDetails: 'R贸偶nica w wersji DSL mo偶e mie膰 wp艂yw na niekt贸re funkcje',
+    openInExplore: 'Otwieranie w obszarze Eksploruj',
+    onFailure: 'W przypadku niepowodzenia',
+    addFailureBranch: 'Dodawanie ga艂臋zi niepowodzenia',
+    loadMore: 'Za艂aduj wi臋cej przep艂yw贸w pracy',
+    noHistory: 'Brak historii',
+    exportImage: 'Eksportuj obraz',
+    exitVersions: 'Wersje wyj艣cia',
+    versionHistory: 'Historia wersji',
+    exportSVG: 'Eksportuj jako SVG',
+    exportJPEG: 'Eksportuj jako JPEG',
+    noExist: 'Nie ma takiej zmiennej',
+    exportPNG: 'Eksportuj jako PNG',
+    publishUpdate: 'Opublikuj aktualizacj臋',
+    referenceVar: 'Zmienna odniesienia',
+  },
+  env: {
+    envPanelTitle: 'Zmienne 艢rodowiskowe',
+    envDescription: 'Zmienne 艣rodowiskowe mog膮 by膰 u偶ywane do przechowywania prywatnych informacji i po艣wiadcze艅. S膮 one tylko do odczytu i mog膮 by膰 oddzielone od pliku DSL podczas eksportu.',
+    envPanelButton: 'Dodaj Zmienn膮',
+    modal: {
+      title: 'Dodaj Zmienn膮 艢rodowiskow膮',
+      editTitle: 'Edytuj Zmienn膮 艢rodowiskow膮',
+      type: 'Typ',
+      name: 'Nazwa',
+      namePlaceholder: 'nazwa 艣rodowiska',
+      value: 'Warto艣膰',
+      valuePlaceholder: 'warto艣膰 艣rodowiska',
+      secretTip: 'U偶ywane do definiowania wra偶liwych informacji lub danych, z ustawieniami DSL skonfigurowanymi do zapobiegania wyciekom.',
+    },
+    export: {
+      title: 'Eksportowa膰 tajne zmienne 艣rodowiskowe?',
+      checkbox: 'Eksportuj tajne warto艣ci',
+      ignore: 'Eksportuj DSL',
+      export: 'Eksportuj DSL z tajnymi warto艣ciami',
+    },
+  },
+  chatVariable: {
+    panelTitle: 'Zmienne Konwersacji',
+    panelDescription: 'Zmienne Konwersacji s艂u偶膮 do przechowywania interaktywnych informacji, kt贸re LLM musi pami臋ta膰, w tym historii konwersacji, przes艂anych plik贸w, preferencji u偶ytkownika. S膮 one do odczytu i zapisu.',
+    docLink: 'Odwied藕 nasz膮 dokumentacj臋, aby dowiedzie膰 si臋 wi臋cej.',
+    button: 'Dodaj Zmienn膮',
+    modal: {
+      title: 'Dodaj Zmienn膮 Konwersacji',
+      editTitle: 'Edytuj Zmienn膮 Konwersacji',
+      name: 'Nazwa',
+      namePlaceholder: 'Nazwa zmiennej',
+      type: 'Typ',
+      value: 'Warto艣膰 Domy艣lna',
+      valuePlaceholder: 'Warto艣膰 domy艣lna, pozostaw puste aby nie ustawia膰',
+      description: 'Opis',
+      descriptionPlaceholder: 'Opisz zmienn膮',
+      editInJSON: 'Edytuj w JSON',
+      oneByOne: 'Dodawaj po kolei',
+      editInForm: 'Edytuj w Formularzu',
+      arrayValue: 'Warto艣膰',
+      addArrayValue: 'Dodaj Warto艣膰',
+      objectKey: 'Klucz',
+      objectType: 'Typ',
+      objectValue: 'Warto艣膰 Domy艣lna',
+    },
+    storedContent: 'Przechowywana zawarto艣膰',
+    updatedAt: 'Zaktualizowano ',
+  },
+  changeHistory: {
+    title: 'Historia Zmian',
+    placeholder: 'Nie dokonano jeszcze 偶adnych zmian',
+    clearHistory: 'Wyczy艣膰 Histori臋',
+    hint: 'Wskaz贸wka',
+    hintText: 'Dzia艂ania edycji s膮 艣ledzone w historii zmian, kt贸ra jest przechowywana na urz膮dzeniu przez czas trwania tej sesji. Ta historia zostanie usuni臋ta po opuszczeniu edytora.',
+    stepBackward_one: '{{count}} krok do ty艂u',
+    stepBackward_other: '{{count}} kroki do ty艂u',
+    stepForward_one: '{{count}} krok do przodu',
+    stepForward_other: '{{count}} kroki do przodu',
+    sessionStart: 'Pocz膮tek sesji',
+    currentState: 'Aktualny stan',
+    nodeTitleChange: 'Tytu艂 bloku zmieniony',
+    nodeDescriptionChange: 'Opis bloku zmieniony',
+    nodeDragStop: 'Blok przeniesiony',
+    nodeChange: 'Blok zmieniony',
+    nodeConnect: 'Blok po艂膮czony',
+    nodePaste: 'Blok wklejony',
+    nodeDelete: 'Blok usuni臋ty',
+    nodeAdd: 'Blok dodany',
+    nodeResize: 'Notatka zmieniona',
+    noteAdd: 'Notatka dodana',
+    noteChange: 'Notatka zmieniona',
+    noteDelete: 'Notatka usuni臋ta',
+    edgeDelete: 'Blok roz艂膮czony',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} jest wymagane',
+    authRequired: 'Wymagana autoryzacja',
+    invalidJson: '{{field}} jest nieprawid艂owym JSON-em',
+    fields: {
+      variable: 'Nazwa zmiennej',
+      variableValue: 'Warto艣膰 zmiennej',
+      code: 'Kod',
+      model: 'Model',
+      rerankModel: 'Model rerank',
+      visionVariable: 'Zmienna wizji',
+    },
+    invalidVariable: 'Nieprawid艂owa zmienna',
+    rerankModelRequired: 'Przed w艂膮czeniem Rerank Model upewnij si臋, 偶e model zosta艂 pomy艣lnie skonfigurowany w ustawieniach.',
+    noValidTool: '{{field}} nie wybrano prawid艂owego narz臋dzia',
+    toolParameterRequired: '{{field}}: parametr [{{param}}] jest wymagany',
+  },
+  singleRun: {
+    testRun: 'Testowe uruchomienie ',
+    startRun: 'Rozpocznij uruchomienie',
+    running: 'Uruchamianie',
+    testRunIteration: 'Iteracja testowego uruchomienia',
+    back: 'Wstecz',
+    iteration: 'Iteracja',
+    loop: 'P臋tla',
+  },
+  tabs: {
+    'searchBlock': 'Szukaj bloku',
+    'blocks': 'Bloki',
+    'tools': 'Narz臋dzia',
+    'allTool': 'Wszystkie',
+    'builtInTool': 'Wbudowane',
+    'customTool': 'Niestandardowe',
+    'workflowTool': 'Przep艂yw pracy',
+    'question-understand': 'Zrozumienie pytania',
+    'logic': 'Logika',
+    'transform': 'Transformacja',
+    'utilities': 'Narz臋dzia pomocnicze',
+    'noResult': 'Nie znaleziono dopasowa艅',
+    'searchTool': 'Wyszukiwarka',
+    'agent': 'Strategia agenta',
+    'plugin': 'Wtyczka',
+  },
+  blocks: {
+    'start': 'Start',
+    'end': 'Koniec',
+    'answer': 'Odpowied藕',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'Wyszukiwanie wiedzy',
+    'question-classifier': 'Klasyfikator pyta艅',
+    'if-else': 'JE艢LI/W PRZECIWNYM WYPADKU',
+    'code': 'Kod',
+    'template-transform': 'Szablon',
+    'http-request': '呕膮danie HTTP',
+    'variable-assigner': 'Agregator zmiennych',
+    'variable-aggregator': 'Agregator zmiennych',
+    'assigner': 'Przypisywacz Zmiennych',
+    'iteration-start': 'Pocz膮tek iteracji',
+    'iteration': 'Iteracja',
+    'parameter-extractor': 'Ekstraktor parametr贸w',
+    'document-extractor': 'Ekstraktor dokument贸w',
+    'list-operator': 'Operator listy',
+    'agent': 'Agent',
+    'loop-start': 'Pocz膮tek p臋tli',
+    'loop-end': 'Wyj艣cie z p臋tli',
+    'loop': 'P臋tla',
+  },
+  blocksAbout: {
+    'start': 'Zdefiniuj pocz膮tkowe parametry uruchamiania przep艂ywu pracy',
+    'end': 'Zdefiniuj zako艅czenie i typ wyniku przep艂ywu pracy',
+    'answer': 'Zdefiniuj tre艣膰 odpowiedzi w rozmowie',
+    'llm': 'Wywo艂aj du偶e modele j臋zykowe do odpowiadania na pytania lub przetwarzania j臋zyka naturalnego',
+    'knowledge-retrieval': 'Pozwala na wyszukiwanie tre艣ci tekstowych zwi膮zanych z pytaniami u偶ytkownik贸w z bazy wiedzy',
+    'question-classifier': 'Zdefiniuj warunki klasyfikacji pyta艅 u偶ytkownik贸w, LLM mo偶e definiowa膰, jak rozmowa post臋puje na podstawie opisu klasyfikacji',
+    'if-else': 'Pozwala na podzia艂 przep艂ywu pracy na dwie ga艂臋zie na podstawie warunk贸w if/else',
+    'code': 'Wykonaj fragment kodu Python lub NodeJS, aby wdro偶y膰 niestandardow膮 logik臋',
+    'template-transform': 'Konwertuj dane na ci膮g znak贸w przy u偶yciu sk艂adni szablonu Jinja',
+    'http-request': 'Pozwala na wysy艂anie 偶膮da艅 serwera za pomoc膮 protoko艂u HTTP',
+    'variable-assigner': 'Zbierz zmienne z wielu ga艂臋zi do jednej zmiennej dla jednolitej konfiguracji w臋z艂贸w ko艅cowych.',
+    'assigner': 'W臋ze艂 przypisania zmiennych s艂u偶y do przypisywania warto艣ci do zmiennych zapisywalnych (takich jak zmienne konwersacji).',
+    'variable-aggregator': 'Zbierz zmienne z wielu ga艂臋zi do jednej zmiennej dla jednolitej konfiguracji w臋z艂贸w ko艅cowych.',
+    'iteration': 'Wykonuj wielokrotne kroki na li艣cie obiekt贸w, a偶 wszystkie wyniki zostan膮 wypisane.',
+    'parameter-extractor': 'U偶yj LLM do wyodr臋bnienia strukturalnych parametr贸w z j臋zyka naturalnego do wywo艂a艅 narz臋dzi lub 偶膮da艅 HTTP.',
+    'document-extractor': 'S艂u偶y do analizowania przes艂anych dokument贸w w tre艣ci tekstowej, kt贸ra jest 艂atwo zrozumia艂a dla LLM.',
+    'list-operator': 'S艂u偶y do filtrowania lub sortowania zawarto艣ci tablicy.',
+    'agent': 'Wywo艂ywanie du偶ych modeli j臋zykowych w celu odpowiadania na pytania lub przetwarzania j臋zyka naturalnego',
+    'loop': 'Wykonaj p臋tl臋 logiki, dop贸ki nie zostanie spe艂niony warunek zako艅czenia lub nie zostanie osi膮gni臋ta maksymalna liczba iteracji.',
+    'loop-end': 'Odpowiada "break". Ten w臋ze艂 nie ma element贸w konfiguracyjnych. Gdy cia艂o p臋tli dotrze do tego w臋z艂a, p臋tla zostaje zako艅czona.',
+  },
+  operator: {
+    zoomIn: 'Powi臋ksz',
+    zoomOut: 'Pomniejsz',
+    zoomTo50: 'Powi臋ksz do 50%',
+    zoomTo100: 'Powi臋ksz do 100%',
+    zoomToFit: 'Dopasuj do ekranu',
+  },
+  panel: {
+    userInputField: 'Pole wprowadzania u偶ytkownika',
+    changeBlock: 'Zmie艅 blok',
+    helpLink: 'Link do pomocy',
+    about: 'O',
+    createdBy: 'Stworzone przez ',
+    nextStep: 'Nast臋pny krok',
+    addNextStep: 'Dodaj nast臋pny blok w tym przep艂ywie pracy',
+    selectNextStep: 'Wybierz nast臋pny blok',
+    runThisStep: 'Uruchom ten krok',
+    checklist: 'Lista kontrolna',
+    checklistTip: 'Upewnij si臋, 偶e wszystkie problemy zosta艂y rozwi膮zane przed opublikowaniem',
+    checklistResolved: 'Wszystkie problemy zosta艂y rozwi膮zane',
+    organizeBlocks: 'Organizuj bloki',
+    change: 'Zmie艅',
+    optional: '(opcjonalne)',
+  },
+  nodes: {
+    common: {
+      outputVars: 'Zmienne wyj艣ciowe',
+      insertVarTip: 'Wstaw zmienn膮',
+      memory: {
+        memory: 'Pami臋膰',
+        memoryTip: 'Ustawienia pami臋ci rozmowy',
+        windowSize: 'Rozmiar okna',
+        conversationRoleName: 'Nazwa roli w rozmowie',
+        user: 'Prefiks u偶ytkownika',
+        assistant: 'Prefiks asystenta',
+      },
+      memories: {
+        title: 'Pami臋ci',
+        tip: 'Pami臋膰 rozmowy',
+        builtIn: 'Wbudowane',
+      },
+      errorHandle: {
+        none: {
+          desc: 'W臋ze艂 przestanie dzia艂a膰, je艣li wyst膮pi wyj膮tek i nie zostanie obs艂u偶ony',
+          title: '呕aden',
+        },
+        defaultValue: {
+          title: 'Warto艣膰 domy艣lna',
+          desc: 'Gdy wyst膮pi b艂膮d, okre艣l statyczn膮 zawarto艣膰 wyj艣ciow膮.',
+          tip: 'W przypadku b艂臋du, zwr贸ci warto艣膰 poni偶ej.',
+          inLog: 'Wyj膮tek w臋z艂a, wyprowadzanie zgodnie z warto艣ciami domy艣lnymi.',
+          output: 'Wyj艣ciowa warto艣膰 domy艣lna',
+        },
+        failBranch: {
+          title: 'Ga艂膮藕 Fail (Ga艂膮藕 Niepowodzenia',
+          customize: 'Przejd藕 do kanwy, aby dostosowa膰 logik臋 ga艂臋zi niepowodzenia.',
+          customizeTip: 'Gdy ga艂膮藕 fail jest aktywowana, wyj膮tki zg艂aszane przez w臋z艂y nie zako艅cz膮 procesu. Zamiast tego automatycznie wykona predefiniowan膮 ga艂膮藕 niepowodzenia, co pozwoli Ci elastycznie dostarcza膰 komunikaty o b艂臋dach, raporty, poprawki lub pomija膰 akcje.',
+          inLog: 'Wyj膮tek w臋z艂a, automatycznie wykona ga艂膮藕 niepowodzenia. Dane wyj艣ciowe w臋z艂a zwr贸c膮 typ b艂臋du i komunikat o b艂臋dzie, a nast臋pnie przeka偶膮 je do podrz臋dnego.',
+          desc: 'Gdy wyst膮pi b艂膮d, wykona ga艂膮藕 wyj膮tku',
+        },
+        partialSucceeded: {
+          tip: 'W procesie {{num}} w臋z艂y dzia艂aj膮 nieprawid艂owo, przejd藕 do 艣ledzenia, aby sprawdzi膰 dzienniki.',
+        },
+        tip: 'Strategia obs艂ugi wyj膮tk贸w, wyzwalana, gdy w臋ze艂 napotka wyj膮tek.',
+        title: 'Obs艂uga b艂臋d贸w',
+      },
+      retry: {
+        retry: 'Pon贸w pr贸b臋',
+        maxRetries: 'Maksymalna liczba ponownych pr贸b',
+        retryInterval: 'Interwa艂 ponawiania pr贸b',
+        retryTimes: 'Pon贸w pr贸b臋 {{times}} razy w przypadku niepowodzenia',
+        retrying: 'Ponawianie...',
+        retrySuccessful: 'Ponawianie pr贸by powiod艂o si臋',
+        retryFailed: 'Ponawianie pr贸by nie powiod艂o si臋',
+        times: 'razy',
+        retries: '{{liczba}} Ponownych pr贸b',
+        retryOnFailure: 'Ponawianie pr贸by w przypadku niepowodzenia',
+        retryFailedTimes: '{{times}} ponawianie pr贸b nie powiod艂o si臋',
+        ms: 'Ms',
+      },
+    },
+    start: {
+      required: 'wymagane',
+      inputField: 'Pole wej艣ciowe',
+      builtInVar: 'Wbudowane zmienne',
+      outputVars: {
+        query: 'Wprowadzenie u偶ytkownika',
+        memories: {
+          des: 'Historia rozmowy',
+          type: 'typ wiadomo艣ci',
+          content: 'tre艣膰 wiadomo艣ci',
+        },
+        files: 'Lista plik贸w',
+      },
+      noVarTip: 'Ustaw wej艣cia, kt贸re mog膮 by膰 u偶ywane w przep艂ywie pracy',
+    },
+    end: {
+      outputs: 'Wyniki',
+      output: {
+        type: 'typ wyniku',
+        variable: 'zmienna wyj艣ciowa',
+      },
+      type: {
+        'none': 'Brak',
+        'plain-text': 'Zwyk艂y tekst',
+        'structured': 'Strukturalny',
+      },
+    },
+    answer: {
+      answer: 'Odpowied藕',
+      outputVars: 'Zmienne wyj艣ciowe',
+    },
+    llm: {
+      model: 'model',
+      variables: 'zmienne',
+      context: 'kontekst',
+      contextTooltip: 'Mo偶esz zaimportowa膰 wiedz臋 jako kontekst',
+      notSetContextInPromptTip: 'Aby w艂膮czy膰 funkcj臋 kontekstu, wype艂nij zmienn膮 kontekstu w PROMPT.',
+      prompt: 'prompt',
+      roleDescription: {
+        system: 'Podaj wysokopoziomowe instrukcje dla rozmowy',
+        user: 'Podaj instrukcje, zapytania lub dowolne tekstowe wej艣cie dla modelu',
+        assistant: 'Odpowiedzi modelu oparte na wiadomo艣ciach u偶ytkownika',
+      },
+      addMessage: 'Dodaj wiadomo艣膰',
+      vision: 'wizja',
+      files: 'Pliki',
+      resolution: {
+        name: 'Rozdzielczo艣膰',
+        high: 'Wysoka',
+        low: 'Niska',
+      },
+      outputVars: {
+        output: 'Generowana tre艣膰',
+        usage: 'Informacje o u偶yciu modelu',
+      },
+      singleRun: {
+        variable: 'Zmienna',
+      },
+      sysQueryInUser: 'sys.query w wiadomo艣ci u偶ytkownika jest wymagane',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: 'Prosz臋 uko艅czy膰 edytowanie bie偶膮cego pola przed zapisaniem schematu.',
+        },
+        generate: 'Generowa膰',
+        addChildField: 'Dodaj pole dziecka',
+        fieldNamePlaceholder: 'Nazwa pola',
+        resetDefaults: 'Resetuj',
+        generationTip: 'Mo偶esz u偶y膰 j臋zyka naturalnego, aby szybko stworzy膰 schemat JSON.',
+        required: 'wymagane',
+        stringValidations: 'Walidacje ci膮g贸w',
+        promptPlaceholder: 'Opisz sw贸j schemat JSON...',
+        promptTooltip: 'Przekszta艂膰 opis tekstowy w ustandaryzowan膮 struktur臋 schematu JSON.',
+        title: 'Strukturalny schemat wyj艣cia',
+        instruction: 'Instrukcja',
+        doc: 'Dowiedz si臋 wi臋cej o zorganizowanym wyj艣ciu',
+        descriptionPlaceholder: 'Dodaj opis',
+        regenerate: 'Regeneruj',
+        generateJsonSchema: 'Generuj schemat JSON',
+        generatedResult: 'Wygenerowany wynik',
+        showAdvancedOptions: 'Poka偶 zaawansowane opcje',
+        apply: 'Zastosowa膰',
+        generating: 'Generowanie schematu JSON...',
+        import: 'Importuj z JSON',
+        resultTip: 'Oto wygenerowany wynik. Je艣li nie jeste艣 zadowolony, mo偶esz wr贸ci膰 i zmodyfikowa膰 swoje zapytanie.',
+        back: 'Ty艂',
+        addField: 'Dodaj pole',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'Zmienna zapytania',
+      knowledge: 'Wiedza',
+      outputVars: {
+        output: 'Odzyskane dane segmentowane',
+        content: 'Tre艣膰 segmentowana',
+        title: 'Tytu艂 segmentowany',
+        icon: 'Ikona segmentowana',
+        url: 'URL segmentowany',
+        metadata: 'Inne metadane',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            title: 'Wy艂膮czone',
+            subTitle: 'Nie w艂膮czanie filtrowania metadanych',
+          },
+          automatic: {
+            desc: 'Automatycznie generuj warunki filtracji metadanych na podstawie zmiennej zapytania',
+            title: 'Automatyczny',
+            subTitle: 'Automatycznie generuj warunki filtracji metadanych na podstawie zapytania u偶ytkownika',
+          },
+          manual: {
+            subTitle: 'R臋cznie dodaj warunki filtrowania metadanych',
+            title: 'R臋czny',
+          },
+        },
+        panel: {
+          conditions: 'Warunki',
+          title: 'Warunki filtru metadanych',
+          placeholder: 'Wprowad藕 warto艣膰',
+          search: 'Szukaj metadanych',
+          datePlaceholder: 'Wybierz czas...',
+          add: 'Dodaj warunek',
+          select: 'Wybierz zmienn膮...',
+        },
+        title: 'Filtrowanie metadanych',
+      },
+    },
+    http: {
+      inputVars: 'Zmienne wej艣ciowe',
+      api: 'API',
+      apiPlaceholder: 'Wpisz URL, wpisz 鈥�/鈥�, aby wstawi膰 zmienn膮',
+      notStartWithHttp: 'API powinno zaczyna膰 si臋 od http:// lub https://',
+      key: 'Klucz',
+      value: 'Warto艣膰',
+      bulkEdit: 'Edycja zbiorcza',
+      keyValueEdit: 'Edycja klucz-warto艣膰',
+      headers: 'Nag艂贸wki',
+      params: 'Parametry',
+      body: 'Tre艣膰',
+      outputVars: {
+        body: 'Tre艣膰 odpowiedzi',
+        statusCode: 'Kod statusu odpowiedzi',
+        headers: 'Lista nag艂贸wk贸w odpowiedzi w formacie JSON',
+        files: 'Lista plik贸w',
+      },
+      authorization: {
+        'authorization': 'Autoryzacja',
+        'authorizationType': 'Typ autoryzacji',
+        'no-auth': 'Brak',
+        'api-key': 'Klucz API',
+        'auth-type': 'Typ autoryzacji',
+        'basic': 'Podstawowa',
+        'bearer': 'Bearer',
+        'custom': 'Niestandardowa',
+        'api-key-title': 'Klucz API',
+        'header': 'Nag艂贸wek',
+      },
+      insertVarPlaceholder: 'wpisz \'/\', aby wstawi膰 zmienn膮',
+      timeout: {
+        title: 'Limit czasu',
+        connectLabel: 'Limit czasu po艂膮czenia',
+        connectPlaceholder: 'Wpisz limit czasu po艂膮czenia w sekundach',
+        readLabel: 'Limit czasu odczytu',
+        readPlaceholder: 'Wpisz limit czasu odczytu w sekundach',
+        writeLabel: 'Limit czasu zapisu',
+        writePlaceholder: 'Wpisz limit czasu zapisu w sekundach',
+      },
+      type: 'Typ',
+      binaryFileVariable: 'Binarna zmienna pliku',
+      extractListPlaceholder: 'Wprowad藕 indeks elementu listy, wpisz "/" wstaw zmienn膮',
+      curl: {
+        placeholder: 'Wklej tutaj ci膮g cURL',
+        title: 'Importowanie z cURL',
+      },
+    },
+    code: {
+      inputVars: 'Zmienne wej艣ciowe',
+      outputVars: 'Zmienne wyj艣ciowe',
+      advancedDependencies: 'Zaawansowane zale偶no艣ci',
+      advancedDependenciesTip: 'Dodaj niekt贸re pre艂adowane zale偶no艣ci, kt贸re zajmuj膮 wi臋cej czasu lub nie s膮 domy艣lnie wbudowane',
+      searchDependencies: 'Wyszukaj zale偶no艣ci',
+    },
+    templateTransform: {
+      inputVars: 'Zmienne wej艣ciowe',
+      code: 'Kod',
+      codeSupportTip: 'Obs艂uguje tylko Jinja2',
+      outputVars: {
+        output: 'Przekszta艂cona tre艣膰',
+      },
+    },
+    ifElse: {
+      if: 'Je艣li',
+      else: 'W przeciwnym razie',
+      elseDescription: 'U偶ywane do okre艣lenia logiki, kt贸ra powinna by膰 wykonana, gdy warunek if nie jest spe艂niony.',
+      and: 'i',
+      or: 'lub',
+      operator: 'Operator',
+      notSetVariable: 'Najpierw ustaw zmienn膮',
+      comparisonOperator: {
+        'contains': 'zawiera',
+        'not contains': 'nie zawiera',
+        'start with': 'zaczyna si臋 od',
+        'end with': 'ko艅czy si臋 na',
+        'is': 'jest',
+        'is not': 'nie jest',
+        'empty': 'jest pusty',
+        'not empty': 'nie jest pusty',
+        'null': 'jest null',
+        'not null': 'nie jest null',
+        'regex match': 'Dopasowanie wyra偶enia regularnego',
+        'in': 'w',
+        'not exists': 'nie istnieje',
+        'exists': 'Istnieje',
+        'all of': 'wszystkie z nich',
+        'not in': 'nie w',
+        'before': 'przed',
+        'after': 'po',
+      },
+      enterValue: 'Wpisz warto艣膰',
+      addCondition: 'Dodaj warunek',
+      conditionNotSetup: 'Warunek NIE zosta艂 ustawiony',
+      selectVariable: 'Wybierz zmienn膮...',
+      optionName: {
+        video: 'Wideo',
+        image: 'Obraz',
+        url: 'Adres URL',
+        localUpload: 'Przesy艂anie lokalne',
+        doc: 'Doc',
+        audio: 'D藕wi臋k',
+      },
+      addSubVariable: 'Zmienna podrz臋dna',
+      select: 'Wybra膰',
+      condition: 'Stan',
+    },
+    variableAssigner: {
+      title: 'Przypisz zmienne',
+      outputType: 'Typ wyj艣cia',
+      varNotSet: 'Zmienna nie zosta艂a ustawiona',
+      noVarTip: 'Dodaj zmienne do przypisania',
+      type: {
+        string: 'Ci膮g znak贸w',
+        number: 'Liczba',
+        object: 'Obiekt',
+        array: 'Tablica',
+      },
+      aggregationGroup: 'Grupa agregacji',
+      aggregationGroupTip: 'W艂膮czenie tej funkcji pozwala na agregowanie wielu zestaw贸w zmiennych przez agregator zmiennych.',
+      addGroup: 'Dodaj grup臋',
+      outputVars: {
+        varDescribe: 'Wyj艣cie {{groupName}}',
+      },
+      setAssignVariable: 'Ustaw przypisanie zmiennej',
+    },
+    assigner: {
+      'assignedVariable': 'Przypisana Zmienna',
+      'writeMode': 'Tryb Zapisu',
+      'writeModeTip': 'Gdy PRZYPISANA ZMIENNA jest tablic膮, tryb dopisywania dodaje na ko艅cu.',
+      'over-write': 'Nadpisz',
+      'append': 'Dopisz',
+      'plus': 'Plus',
+      'clear': 'Wyczy艣膰',
+      'setVariable': 'Ustaw Zmienn膮',
+      'variable': 'Zmienna',
+      'operations': {
+        'over-write': 'Zast膮pi膰',
+        'set': 'Zbi贸r',
+        'title': 'Operacja',
+        'overwrite': 'Zast膮pi膰',
+        '*=': '*=',
+        '/=': '/=',
+        '-=': '-=',
+        'extend': 'Rozszerzy膰',
+        '+=': '+=',
+        'clear': 'Jasny',
+        'append': 'Do艂膮czy膰',
+        'remove-first': 'Usu艅 pierwszy',
+        'remove-last': 'Usu艅 ostatni',
+      },
+      'variables': 'Zmiennych',
+      'selectAssignedVariable': 'Wybierz przypisan膮 zmienn膮...',
+      'varNotSet': 'Zmienna NIE jest ustawiona',
+      'noAssignedVars': 'Brak dost臋pnych przypisanych zmiennych',
+      'assignedVarsDescription': 'Przypisane zmienne musz膮 by膰 zmiennymi zapisywalnymi, takimi jak zmienne konwersacji.',
+      'setParameter': 'Ustaw parametr...',
+      'noVarTip': 'Kliknij przycisk "+", aby doda膰 zmienne',
+    },
+    tool: {
+      toAuthorize: 'Do autoryzacji',
+      inputVars: 'Zmienne wej艣ciowe',
+      outputVars: {
+        text: 'tre艣膰 generowana przez narz臋dzie',
+        files: {
+          title: 'pliki generowane przez narz臋dzie',
+          type: 'Typ wsparcia. Obecnie tylko obs艂uguje obraz',
+          transfer_method: 'Metoda transferu. Warto艣膰 to remote_url lub local_file',
+          url: 'URL obrazu',
+          upload_file_id: 'ID przes艂anego pliku',
+        },
+        json: 'JSON wygenerowany przez narz臋dzien',
+      },
+    },
+    questionClassifiers: {
+      model: 'model',
+      inputVars: 'Zmienne wej艣ciowe',
+      outputVars: {
+        className: 'Nazwa klasy',
+      },
+      class: 'Klasa',
+      classNamePlaceholder: 'Napisz nazw臋 swojej klasy',
+      advancedSetting: 'Zaawansowane ustawienia',
+      topicName: 'Nazwa tematu',
+      topicPlaceholder: 'Napisz nazw臋 swojego tematu',
+      addClass: 'Dodaj klas臋',
+      instruction: 'Instrukcja',
+      instructionTip: 'Wprowad藕 dodatkowe instrukcje, aby pom贸c klasyfikatorowi pyta艅 lepiej zrozumie膰, jak kategoryzowa膰 pytania.',
+      instructionPlaceholder: 'Napisz swoj膮 instrukcj臋',
+    },
+    parameterExtractor: {
+      inputVar: 'Zmienna wej艣ciowa',
+      extractParameters: 'Wyodr臋bnij parametry',
+      importFromTool: 'Importuj z narz臋dzi',
+      addExtractParameter: 'Dodaj parametr wyodr臋bniania',
+      addExtractParameterContent: {
+        name: 'Nazwa',
+        namePlaceholder: 'Nazwa parametru wyodr臋bniania',
+        type: 'Typ',
+        typePlaceholder: 'Typ parametru wyodr臋bniania',
+        description: 'Opis',
+        descriptionPlaceholder: 'Opis parametru wyodr臋bniania',
+        required: 'Wymagane',
+        requiredContent: 'Wymagane jest tylko jako odniesienie do wnioskowania modelu, a nie do obowi膮zkowej walidacji wyj艣cia parametru.',
+      },
+      extractParametersNotSet: 'Parametry wyodr臋bniania nie zosta艂y ustawione',
+      instruction: 'Instrukcja',
+      instructionTip: 'Wprowad藕 dodatkowe instrukcje, aby pom贸c ekstraktorowi parametr贸w zrozumie膰, jak wyodr臋bnia膰 parametry.',
+      advancedSetting: 'Zaawansowane ustawienia',
+      reasoningMode: 'Tryb wnioskowania',
+      reasoningModeTip: 'Mo偶esz wybra膰 odpowiedni tryb wnioskowania w zale偶no艣ci od zdolno艣ci modelu do reagowania na instrukcje dotycz膮ce wywo艂ywania funkcji lub zapyta艅.',
+      isSuccess: 'Czy si臋 uda艂o. W przypadku sukcesu warto艣膰 wynosi 1, w przypadku niepowodzenia warto艣膰 wynosi 0.',
+      errorReason: 'Pow贸d b艂臋du',
+    },
+    iteration: {
+      deleteTitle: 'Usun膮膰 w臋ze艂 iteracji?',
+      deleteDesc: 'Usuni臋cie w臋z艂a iteracji usunie wszystkie w臋z艂y potomne',
+      input: 'Wej艣cie',
+      output: 'Zmienne wyj艣ciowe',
+      iteration_one: '{{count}} Iteracja',
+      iteration_other: '{{count}} Iteracje',
+      currentIteration: 'Bie偶膮ca iteracja',
+      ErrorMethod: {
+        continueOnError: 'kontynuacja w przypadku b艂臋du',
+        operationTerminated: 'Zako艅czone',
+        removeAbnormalOutput: 'usu艅-nieprawid艂owe-wyj艣cie',
+      },
+      comma: ',',
+      parallelModeUpper: 'TRYB R脫WNOLEG艁Y',
+      parallelModeEnableTitle: 'W艂膮czony tryb r贸wnoleg艂y',
+      MaxParallelismTitle: 'Maksymalna r贸wnoleg艂o艣膰',
+      error_one: '{{liczba}} B艂膮d',
+      error_other: '{{liczba}} B艂臋dy',
+      parallelPanelDesc: 'W trybie r贸wnoleg艂ym zadania w iteracji obs艂uguj膮 wykonywanie r贸wnoleg艂e.',
+      parallelMode: 'Tryb r贸wnoleg艂y',
+      MaxParallelismDesc: 'Maksymalna r贸wnoleg艂o艣膰 s艂u偶y do kontrolowania liczby zada艅 wykonywanych jednocze艣nie w jednej iteracji.',
+      parallelModeEnableDesc: 'W trybie r贸wnoleg艂ym zadania w iteracjach obs艂uguj膮 wykonywanie r贸wnoleg艂e. Mo偶esz to skonfigurowa膰 w panelu w艂a艣ciwo艣ci po prawej stronie.',
+      answerNodeWarningDesc: 'Ostrze偶enie w trybie r贸wnoleg艂ym: w臋z艂y odpowiedzi, przypisania zmiennych konwersacji i trwa艂e operacje odczytu/zapisu w iteracjach mog膮 powodowa膰 wyj膮tki.',
+      errorResponseMethod: 'Metoda odpowiedzi na b艂膮d',
+    },
+    note: {
+      editor: {
+        link: '艁膮cze',
+        medium: '艢redni',
+        small: 'Ma艂y',
+        italic: 'Kursywa',
+        enterUrl: 'Wpisz adres URL...',
+        showAuthor: 'Poka偶 autora',
+        bold: '艢mia艂y',
+        unlink: 'Od艂膮czy膰',
+        bulletList: 'Lista punktowana',
+        large: 'Du偶y',
+        openLink: 'Otwiera膰',
+        strikethrough: 'Przekre艣lenie',
+        invalidUrl: 'Nieprawid艂owy adres URL',
+        placeholder: 'Napisz swoj膮 notatk臋...',
+      },
+      addNote: 'Dodaj notatk臋',
+    },
+    docExtractor: {
+      outputVars: {
+        text: 'Wyodr臋bniony tekst',
+      },
+      learnMore: 'Dowiedz si臋 wi臋cej',
+      inputVar: 'Zmienna wej艣ciowa',
+      supportFileTypes: 'Obs艂ugiwane typy plik贸w: {{types}}.',
+    },
+    listFilter: {
+      outputVars: {
+        result: 'Wynik filtrowania',
+        last_record: 'Ostatni rekord',
+        first_record: 'Pierwszy rekord',
+      },
+      desc: 'DESC',
+      asc: 'ASC',
+      inputVar: 'Zmienna wej艣ciowa',
+      limit: 'Pierwsze N',
+      orderBy: 'Sortuj wed艂ug',
+      filterConditionComparisonOperator: 'Operator por贸wnania warunk贸w filtru',
+      filterConditionKey: 'Klucz warunku filtra',
+      filterCondition: 'Stan filtra',
+      filterConditionComparisonValue: 'Warto艣膰 warunku filtru',
+      selectVariableKeyPlaceholder: 'Wybierz klucz zmiennej podrz臋dnej',
+      extractsCondition: 'Wyodr臋bnij element N',
+    },
+    agent: {
+      strategy: {
+        configureTip: 'Skonfiguruj strategi臋 agentyczn膮.',
+        selectTip: 'Wybierz strategi臋 agentyczn膮',
+        searchPlaceholder: 'Strategia agentyczna wyszukiwania',
+        configureTipDesc: 'Po skonfigurowaniu strategii agentycznej ten w臋ze艂 automatycznie za艂aduje pozosta艂e konfiguracje. Strategia b臋dzie mia艂a wp艂yw na mechanizm wieloetapowego rozumowania narz臋dziowego.',
+        shortLabel: 'Strategia',
+        label: 'Strategia agentyczna',
+        tooltip: 'R贸偶ne strategie agentowe okre艣laj膮, w jaki spos贸b system planuje i wykonuje wieloetapowe wywo艂ania narz臋dzi',
+      },
+      pluginInstaller: {
+        installing: 'Instalowanie',
+        install: 'Instalowa膰',
+      },
+      modelNotInMarketplace: {
+        desc: 'Ten model jest instalowany z repozytorium lokalnego lub GitHub. Prosz臋 u偶y膰 po instalacji.',
+        manageInPlugins: 'Zarz膮dzanie we wtyczkach',
+        title: 'Model nie jest zainstalowany',
+      },
+      modelNotSupport: {
+        desc: 'Zainstalowana wersja wtyczki nie zapewnia tego modelu.',
+        descForVersionSwitch: 'Zainstalowana wersja wtyczki nie zapewnia tego modelu. Kliknij, aby zmieni膰 wersj臋.',
+        title: 'Nieobs艂ugiwany model',
+      },
+      modelSelectorTooltips: {
+        deprecated: 'Ten model jest przestarza艂y',
+      },
+      outputVars: {
+        files: {
+          title: 'Pliki generowane przez agenta',
+          type: 'Rodzaj wsparcia. Teraz obs艂uguje tylko obraz',
+          transfer_method: 'Metoda transferu. Warto艣膰 to remote_url lub local_file',
+          upload_file_id: 'Identyfikator przesy艂anego pliku',
+          url: 'Adres URL obrazu',
+        },
+        json: 'Kod JSON wygenerowany przez agenta',
+        text: 'Tre艣ci generowane przez agent贸w',
+      },
+      checkList: {
+        strategyNotSelected: 'Nie wybrano strategii',
+      },
+      installPlugin: {
+        install: 'Instalowa膰',
+        changelog: 'Dziennik zmian',
+        desc: 'Informacje o instalacji nast臋puj膮cej wtyczki',
+        cancel: 'Anuluj',
+        title: 'Zainstaluj wtyczk臋',
+      },
+      notAuthorized: 'Nieautoryzowany',
+      pluginNotInstalledDesc: 'Ta wtyczka jest instalowana z GitHub. Przejd藕 do Wtyczki, aby ponownie zainstalowa膰',
+      toolNotAuthorizedTooltip: '{{narz臋dzie}} Nieautoryzowany',
+      linkToPlugin: 'Link do wtyczek',
+      maxIterations: 'Maksymalna liczba iteracji',
+      strategyNotFoundDesc: 'Zainstalowana wersja wtyczki nie zapewnia tej strategii.',
+      strategyNotInstallTooltip: '{{strategy}} nie jest zainstalowany',
+      modelNotSelected: 'Nie wybrano modelu',
+      pluginNotFoundDesc: 'Ta wtyczka jest instalowana z GitHub. Przejd藕 do Wtyczki, aby ponownie zainstalowa膰',
+      tools: 'Narz臋dzia',
+      unsupportedStrategy: 'Nieobs艂ugiwana strategia',
+      configureModel: 'Konfiguruj model',
+      toolbox: 'skrzynka z narz臋dziami',
+      modelNotInstallTooltip: 'Ten model nie jest zainstalowany',
+      strategyNotFoundDescAndSwitchVersion: 'Zainstalowana wersja wtyczki nie zapewnia tej strategii. Kliknij, aby zmieni膰 wersj臋.',
+      toolNotInstallTooltip: '{{tool}} nie jest zainstalowany',
+      pluginNotInstalled: 'Ta wtyczka nie jest zainstalowana',
+      learnMore: 'Dowiedz si臋 wi臋cej',
+      strategyNotSet: 'Nie ustawiono strategii agentalnej',
+      model: 'model',
+    },
+    loop: {
+      ErrorMethod: {
+        operationTerminated: 'Zako艅czony',
+        removeAbnormalOutput: 'Usu艅 nietypowy wynik',
+        continueOnError: 'Kontynuuj w przypadku b艂臋du',
+      },
+      inputMode: 'Tryb wej艣ciowy',
+      loop_other: '{{count}} P臋tle',
+      deleteDesc: 'Usuni臋cie w臋z艂a p臋tli spowoduje usuni臋cie wszystkich w臋z艂贸w potomnych.',
+      loopVariables: 'Zmienne p臋tli',
+      variableName: 'Nazwa zmiennej',
+      output: 'Zmienna wyj艣ciowa',
+      breakCondition: 'Warunek zako艅czenia p臋tli',
+      input: 'Wprowadzenie',
+      initialLoopVariables: 'Pocz膮tkowe zmienne p臋tli',
+      error_one: '{{count}} B艂膮d',
+      loopNode: 'W臋ze艂 p臋tli',
+      loop_one: '{{count}} p臋tla',
+      currentLoop: 'P臋tla pr膮dowa',
+      finalLoopVariables: 'Ostateczne zmienne p臋tli',
+      comma: ',',
+      loopMaxCountError: 'Prosz臋 wprowadzi膰 prawid艂ow膮 maksymaln膮 liczb臋 iteracji, mieszcz膮c膮 si臋 w przedziale od 1 do {{maxCount}}',
+      error_other: '{{count}} b艂臋d贸w',
+      totalLoopCount: 'Ca艂kowita liczba p臋tli: {{count}}',
+      exitConditionTip: 'W臋ze艂 p臋tli potrzebuje przynajmniej jednego warunku wyj艣cia.',
+      setLoopVariables: 'Ustaw zmienne w zakresie p臋tli',
+      loopMaxCount: 'Maksymalna liczba p臋tli',
+      errorResponseMethod: 'Metoda odpowiedzi na b艂膮d',
+      breakConditionTip: 'Tylko zmienne w p臋tlach z warunkami zako艅czenia oraz zmienne konwersacyjne mog膮 by膰 odwo艂ywane.',
+      currentLoopCount: 'Aktualna liczba p臋tli: {{count}}',
+      deleteTitle: 'Usun膮膰 w臋ze艂 p臋tli?',
+    },
+  },
+  tracing: {
+    stopBy: 'Zatrzymane przez {{user}}',
+  },
+  variableReference: {
+    conversationVars: 'Zmienne konwersacji',
+    assignedVarsDescription: 'Przypisane zmienne musz膮 by膰 zmiennymi zapisywalnymi, takimi jak',
+    noVarsForOperation: 'Nie ma dost臋pnych zmiennych do przypisania do wybranej operacji.',
+    noAssignedVars: 'Brak dost臋pnych przypisanych zmiennych',
+    noAvailableVars: 'Brak dost臋pnych zmiennych',
+  },
+  versionHistory: {
+    filter: {
+      onlyShowNamedVersions: 'Pokazuj tylko wersje z nazwami',
+      all: 'Wszystko',
+      onlyYours: 'Tylko tw贸j',
+      empty: 'Nie znaleziono odpowiadaj膮cej historii wersji',
+      reset: 'Resetuj filtr',
+    },
+    editField: {
+      releaseNotes: 'Notatki o wydaniu',
+      releaseNotesLengthLimit: 'Notatki o wydaniu nie mog膮 przekracza膰 {{limit}} znak贸w',
+      title: 'Tytu艂',
+      titleLengthLimit: 'Tytu艂 nie mo偶e przekracza膰 {{limit}} znak贸w',
+    },
+    action: {
+      updateSuccess: 'Wersja zaktualizowana',
+      updateFailure: 'Nie uda艂o si臋 zaktualizowa膰 wersji',
+      deleteFailure: 'Nie uda艂o si臋 usun膮膰 wersji',
+      deleteSuccess: 'Wersja usuni臋ta',
+      restoreSuccess: 'Wersja przywr贸cona',
+      restoreFailure: 'Nie uda艂o si臋 przywr贸ci膰 wersji',
+    },
+    currentDraft: 'Aktualny szkic',
+    nameThisVersion: 'Nazwij t臋 wersj臋',
+    defaultName: 'Nienazwana wersja',
+    title: 'Wersje',
+    latest: 'Najnowszy',
+    releaseNotesPlaceholder: 'Opisz, co si臋 zmieni艂o',
+    editVersionInfo: 'Edytuj informacje o wersji',
+    deletionTip: 'Usuni臋cie jest nieodwracalne, prosz臋 potwierdzi膰.',
+    restorationTip: 'Po przywr贸ceniu wersji bie偶膮cy szkic zostanie nadpisany.',
+  },
+}
+
+export default translation
diff --git a/i18n/pt-BR/app-annotation.ts b/i18n/pt-BR/app-annotation.ts
new file mode 100644
index 0000000..3ae53ca
--- /dev/null
+++ b/i18n/pt-BR/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: 'Anota莽玫es',
+  name: 'Resposta de Anota莽茫o',
+  editBy: 'Resposta editada por {{author}}',
+  noData: {
+    title: 'Sem anota莽玫es',
+    description: 'Voc锚 pode editar anota莽玫es no depura莽茫o do aplicativo ou importar anota莽玫es em massa aqui para obter uma resposta de alta qualidade.',
+  },
+  table: {
+    header: {
+      question: 'pergunta',
+      answer: 'resposta',
+      createdAt: 'criado em',
+      hits: 'acessos',
+      actions: 'a莽玫es',
+      addAnnotation: 'Adicionar Anota莽茫o',
+      bulkImport: 'Importa莽茫o em Massa',
+      bulkExport: 'Exporta莽茫o em Massa',
+      clearAll: 'Limpar Todas as Anota莽玫es',
+    },
+  },
+  editModal: {
+    title: 'Editar Resposta de Anota莽茫o',
+    queryName: 'Consulta do Usu谩rio',
+    answerName: 'Bot Contador de Hist贸rias',
+    yourAnswer: 'Sua Resposta',
+    answerPlaceholder: 'Digite sua resposta aqui',
+    yourQuery: 'Sua Consulta',
+    queryPlaceholder: 'Digite sua consulta aqui',
+    removeThisCache: 'Remover esta Anota莽茫o',
+    createdAt: 'Criado em',
+  },
+  addModal: {
+    title: 'Adicionar Resposta de Anota莽茫o',
+    queryName: 'Pergunta',
+    answerName: 'Resposta',
+    answerPlaceholder: 'Digite a resposta aqui',
+    queryPlaceholder: 'Digite a pergunta aqui',
+    createNext: 'Adicionar outra resposta anotada',
+  },
+  batchModal: {
+    title: 'Importa莽茫o em Massa',
+    csvUploadTitle: 'Arraste e solte seu arquivo CSV aqui, ou ',
+    browse: 'navegue',
+    tip: 'O arquivo CSV deve seguir a seguinte estrutura:',
+    question: 'pergunta',
+    answer: 'resposta',
+    contentTitle: 'conte煤do do fragmento',
+    content: 'conte煤do',
+    template: 'Baixe o modelo aqui',
+    cancel: 'Cancelar',
+    run: 'Executar em Lote',
+    runError: 'Falha na execu莽茫o em lote',
+    processing: 'Processando em lote',
+    completed: 'Importa莽茫o conclu铆da',
+    error: 'Erro na importa莽茫o',
+    ok: 'OK',
+  },
+  errorMessage: {
+    answerRequired: 'A resposta 茅 obrigat贸ria',
+    queryRequired: 'A pergunta 茅 obrigat贸ria',
+  },
+  viewModal: {
+    annotatedResponse: 'Resposta de Anota莽茫o',
+    hitHistory: 'Hist贸rico de Acessos',
+    hit: 'Acesso',
+    hits: 'Acessos',
+    noHitHistory: 'Nenhum hist贸rico de acesso',
+  },
+  hitHistoryTable: {
+    query: 'Consulta',
+    match: 'Correspond锚ncia',
+    response: 'Resposta',
+    source: 'Origem',
+    score: 'Pontua莽茫o',
+    time: 'Tempo',
+  },
+  initSetup: {
+    title: 'Configura莽茫o Inicial da Resposta de Anota莽茫o',
+    configTitle: 'Configura莽茫o da Resposta de Anota莽茫o',
+    confirmBtn: 'Salvar e Habilitar',
+    configConfirmBtn: 'Salvar',
+  },
+  embeddingModelSwitchTip: 'Modelo de vetoriza莽茫o de texto de anota莽茫o, a troca de modelos ser谩 refeita, resultando em custos adicionais.',
+}
+
+export default translation
diff --git a/i18n/pt-BR/app-api.ts b/i18n/pt-BR/app-api.ts
new file mode 100644
index 0000000..155d51a
--- /dev/null
+++ b/i18n/pt-BR/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'Servidor da API',
+  apiKey: 'Chave da API',
+  status: 'Status',
+  disabled: 'Desativado',
+  ok: 'Em Servi莽o',
+  copy: 'Copiar',
+  copied: 'Copiado',
+  merMaid: {
+    rerender: 'Refazer Rerender',
+  },
+  never: 'Nunca',
+  apiKeyModal: {
+    apiSecretKey: 'Chave Secreta da API',
+    apiSecretKeyTips: 'Para evitar abuso da API, proteja sua Chave da API. Evite us谩-la como texto simples no c贸digo front-end. :)',
+    createNewSecretKey: 'Criar nova Chave Secreta',
+    secretKey: 'Chave Secreta',
+    created: 'CRIADA',
+    lastUsed: '脷LTIMO USO',
+    generateTips: 'Mantenha esta chave em um local seguro e acess铆vel.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: 'Excluir esta chave secreta?',
+    deleteConfirmTips: 'Esta a莽茫o n茫o pode ser desfeita.',
+    ok: 'OK',
+  },
+  completionMode: {
+    title: 'Completar App API',
+    info: 'Para gera莽茫o de texto de alta qualidade, como artigos, resumos e tradu莽玫es, use a API de mensagens de conclus茫o com entrada do usu谩rio. A gera莽茫o de texto depende dos par芒metros do modelo e dos modelos de prompt definidos no Dify Prompt Engineering.',
+    createCompletionApi: 'Criar Mensagem de Conclus茫o',
+    createCompletionApiTip: 'Crie uma Mensagem de Conclus茫o para suportar o modo pergunta e resposta.',
+    inputsTips: '(Opcional) Forne莽a campos de entrada do usu谩rio como pares chave-valor, correspondendo a vari谩veis no Prompt Eng. A chave 茅 o nome da vari谩vel, o valor 茅 o valor do par芒metro. Se o tipo do campo for Select, o Valor enviado deve ser uma das op莽玫es predefinidas.',
+    queryTips: 'Conte煤do de texto de entrada do usu谩rio.',
+    blocking: 'Tipo de bloqueio, aguardando a conclus茫o da execu莽茫o e retornando os resultados. (As solicita莽玫es podem ser interrompidas se o processo for longo)',
+    streaming: 'Retorno de streaming. Implementa莽茫o de retorno de streaming com base em SSE (Server-Sent Events).',
+    messageFeedbackApi: 'Feedback de mensagem (curtir)',
+    messageFeedbackApiTip: 'Avalie as mensagens recebidas em nome dos usu谩rios finais com curtidas ou descurtidas. Esses dados s茫o vis铆veis na p谩gina de Logs e Anota莽玫es e s茫o usados para ajustes futuros no modelo.',
+    messageIDTip: 'ID da mensagem',
+    ratingTip: 'curtir ou descurtir, null desfaz',
+    parametersApi: 'Obter informa莽玫es de par芒metros do aplicativo',
+    parametersApiTip: 'Recupere os par芒metros de entrada configurados, incluindo nomes de vari谩veis, nomes de campos, tipos e valores padr茫o. Geralmente usado para exibir esses campos em um formul谩rio ou preencher valores padr茫o ap贸s o carregamento do cliente.',
+  },
+  chatMode: {
+    title: 'Chat App API',
+    info: 'Para aplicativos de conversa莽茫o vers谩teis usando um formato de pergunta e resposta, chame a API de mensagens de chat para iniciar o di谩logo. Mantenha conversas em andamento passando o conversation_id retornado. Os par芒metros de resposta e modelos dependem das configura莽玫es do Dify Prompt Eng.',
+    createChatApi: 'Criar mensagem de chat',
+    createChatApiTip: 'Crie uma nova mensagem de conversa ou continue um di谩logo existente.',
+    inputsTips: '(Opcional) Forne莽a campos de entrada do usu谩rio como pares chave-valor, correspondendo a vari谩veis no Prompt Eng. A chave 茅 o nome da vari谩vel, o valor 茅 o valor do par芒metro. Se o tipo do campo for Select, o Valor enviado deve ser uma das op莽玫es predefinidas.',
+    queryTips: 'Conte煤do de entrada/pergunta do usu谩rio',
+    blocking: 'Tipo de bloqueio, aguardando a conclus茫o da execu莽茫o e retornando os resultados. (As solicita莽玫es podem ser interrompidas se o processo for longo)',
+    streaming: 'Retorno de streaming. Implementa莽茫o de retorno de streaming com base em SSE (Server-Sent Events).',
+    conversationIdTip: '(Opcional) ID da conversa: deixe vazio para a primeira conversa; passe conversation_id do contexto para continuar o di谩logo.',
+    messageFeedbackApi: 'Feedback do usu谩rio final da mensagem, curtir',
+    messageFeedbackApiTip: 'Avalie as mensagens recebidas em nome dos usu谩rios finais com curtidas ou descurtidas. Esses dados s茫o vis铆veis na p谩gina de Logs e Anota莽玫es e s茫o usados para ajustes futuros no modelo.',
+    messageIDTip: 'ID da mensagem',
+    ratingTip: 'curtir ou descurtir, null desfaz',
+    chatMsgHistoryApi: 'Obter hist贸rico de mensagens de chat',
+    chatMsgHistoryApiTip: 'A primeira p谩gina retorna as 煤ltimas `limit` mensagens, em ordem reversa.',
+    chatMsgHistoryConversationIdTip: 'ID da conversa',
+    chatMsgHistoryFirstId: 'ID do primeiro registro de chat na p谩gina atual. O padr茫o 茅 nenhum.',
+    chatMsgHistoryLimit: 'Quantos chats s茫o retornados em uma solicita莽茫o',
+    conversationsListApi: 'Obter lista de conversas',
+    conversationsListApiTip: 'Obt茅m a lista de sess玫es do usu谩rio atual. Por padr茫o, as 煤ltimas 20 sess玫es s茫o retornadas.',
+    conversationsListFirstIdTip: 'O ID do 煤ltimo registro na p谩gina atual, padr茫o nenhum.',
+    conversationsListLimitTip: 'Quantos chats s茫o retornados em uma solicita莽茫o',
+    conversationRenamingApi: 'Renomear conversa',
+    conversationRenamingApiTip: 'Renomeie conversas; o nome 茅 exibido nas interfaces de cliente com v谩rias sess玫es.',
+    conversationRenamingNameTip: 'Novo nome',
+    parametersApi: 'Obter informa莽玫es de par芒metros do aplicativo',
+    parametersApiTip: 'Recupere os par芒metros de entrada configurados, incluindo nomes de vari谩veis, nomes de campos, tipos e valores padr茫o. Geralmente usado para exibir esses campos em um formul谩rio ou preencher valores padr茫o ap贸s o carregamento do cliente.',
+  },
+  develop: {
+    requestBody: 'Corpo da Solicita莽茫o',
+    pathParams: 'Par芒metros de Caminho',
+    query: 'Consulta',
+    toc: 'Conte煤do',
+  },
+  play: 'Brincar',
+  loading: 'Carregamento',
+  pause: 'Pausa',
+  playing: 'Jogar',
+  regenerate: 'Regenerar',
+}
+
+export default translation
diff --git a/i18n/pt-BR/app-debug.ts b/i18n/pt-BR/app-debug.ts
new file mode 100644
index 0000000..df4312f
--- /dev/null
+++ b/i18n/pt-BR/app-debug.ts
@@ -0,0 +1,423 @@
+const translation = {
+  pageTitle: {
+    line1: 'PROMPT',
+    line2: 'Engenharia',
+  },
+  orchestrate: 'Orquestrar',
+  promptMode: {
+    simple: 'Mudar para o Modo Especialista para editar todo o PROMPT',
+    advanced: 'Modo Especialista',
+    switchBack: 'Voltar',
+    advancedWarning: {
+      title: 'Voc锚 mudou para o Modo Especialista e, uma vez que voc锚 modifique o PROMPT, N脙O poder谩 retornar ao modo b谩sico.',
+      description: 'No Modo Especialista, voc锚 pode editar todo o PROMPT.',
+      learnMore: 'Saiba mais',
+      ok: 'OK',
+    },
+    operation: {
+      addMessage: 'Adicionar Mensagem',
+    },
+    contextMissing: 'Componente de contexto ausente, a efic谩cia do prompt pode n茫o ser boa.',
+  },
+  operation: {
+    applyConfig: 'Publicar',
+    resetConfig: 'Redefinir',
+    debugConfig: 'Depurar',
+    addFeature: 'Adicionar Recurso',
+    automatic: 'Autom谩tico',
+    stopResponding: 'Parar de responder',
+    agree: 'gostar',
+    disagree: 'n茫o gostar',
+    cancelAgree: 'Cancelar gostar',
+    cancelDisagree: 'Cancelar n茫o gostar',
+    userAction: 'Usu谩rio ',
+  },
+  notSetAPIKey: {
+    title: 'A chave do provedor LLM n茫o foi definida',
+    trailFinished: 'Trilha finalizada',
+    description: 'A chave do provedor LLM n茫o foi definida e precisa ser definida antes da depura莽茫o.',
+    settingBtn: 'Ir para configura莽玫es',
+  },
+  trailUseGPT4Info: {
+    title: 'N茫o suporta gpt-4 agora',
+    description: 'Use gpt-4, por favor defina a chave da API.',
+  },
+  feature: {
+    groupChat: {
+      title: 'Melhoria do Chat',
+      description: 'Adicione configura莽玫es pr茅-conversa para aplicativos que podem melhorar a experi锚ncia do usu谩rio.',
+    },
+    groupExperience: {
+      title: 'Melhoria da Experi锚ncia',
+    },
+    conversationOpener: {
+      title: 'Remodeladores de Conversa',
+      description: 'Em um aplicativo de chat, a primeira frase que a IA fala ativamente para o usu谩rio geralmente 茅 usada como uma sauda莽茫o.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: 'Perguntas de Acompanhamento',
+      description: 'Configurar sugest玫es de pr贸ximas perguntas pode proporcionar um melhor chat aos usu谩rios.',
+      resDes: '3 sugest玫es para a pr贸xima pergunta do usu谩rio.',
+      tryToAsk: 'Tente perguntar',
+    },
+    moreLikeThis: {
+      title: 'Mais como isso',
+      description: 'Gere v谩rios textos de uma vez e, em seguida, edite e continue a gerar',
+      generateNumTip: 'N煤mero de vezes geradas',
+      tip: 'Usar esse recurso incorrer谩 em sobrecarga adicional de tokens',
+    },
+    speechToText: {
+      title: 'Fala para Texto',
+      description: 'Uma vez ativado, voc锚 pode usar entrada de voz.',
+      resDes: 'Entrada de voz est谩 ativada',
+    },
+    textToSpeech: {
+      title: 'Texto para voz',
+      description: 'Quando ativado, o texto pode ser convertido em fala.',
+      resDes: 'Texto para 谩udio ativado',
+    },
+    citation: {
+      title: 'Cita莽玫es e Atribui莽玫es',
+      description: 'Uma vez ativado, mostra o documento de origem e a se莽茫o atribu铆da do conte煤do gerado.',
+      resDes: 'Cita莽玫es e Atribui莽玫es est茫o ativadas',
+    },
+    annotation: {
+      title: 'Resposta de Anota莽茫o',
+      description: 'Voc锚 pode adicionar manualmente uma resposta de alta qualidade ao cache para correspond锚ncia priorit谩ria com perguntas semelhantes do usu谩rio.',
+      resDes: 'Resposta de Anota莽茫o est谩 ativada',
+      scoreThreshold: {
+        title: 'Limiar de Pontua莽茫o',
+        description: 'Usado para definir o limiar de similaridade para resposta de anota莽茫o.',
+        easyMatch: 'Correspond锚ncia F谩cil',
+        accurateMatch: 'Correspond锚ncia Precisa',
+      },
+      matchVariable: {
+        title: 'Vari谩vel de Correspond锚ncia',
+        choosePlaceholder: 'Escolha a vari谩vel de correspond锚ncia',
+      },
+      cacheManagement: 'Anota莽玫es',
+      cached: 'Anotado',
+      remove: 'Remover',
+      removeConfirm: 'Excluir esta anota莽茫o?',
+      add: 'Adicionar anota莽茫o',
+      edit: 'Editar anota莽茫o',
+    },
+    dataSet: {
+      title: 'Contexto',
+      noData: 'Voc锚 pode importar Conhecimento como contexto',
+      words: 'Palavras',
+      textBlocks: 'Blocos de Texto',
+      selectTitle: 'Selecionar Conhecimento de refer锚ncia',
+      selected: 'Conhecimento selecionado',
+      noDataSet: 'Nenhum Conhecimento encontrado',
+      toCreate: 'Ir para criar',
+      notSupportSelectMulti: 'Atualmente, suporta apenas um Conhecimento',
+      queryVariable: {
+        title: 'Vari谩vel de Consulta',
+        tip: 'Essa vari谩vel ser谩 usada como entrada de consulta para recupera莽茫o de contexto, obtendo informa莽玫es de contexto relacionadas 脿 entrada dessa vari谩vel.',
+        choosePlaceholder: 'Escolha a vari谩vel de consulta',
+        noVar: 'Nenhuma vari谩vel',
+        noVarTip: 'por favor, crie uma vari谩vel na se莽茫o Vari谩veis',
+        unableToQueryDataSet: 'N茫o 茅 poss铆vel consultar o Conhecimento',
+        unableToQueryDataSetTip: 'N茫o 茅 poss铆vel consultar o Conhecimento com sucesso, por favor escolha uma vari谩vel de consulta de contexto na se莽茫o de contexto.',
+        ok: 'OK',
+        contextVarNotEmpty: 'vari谩vel de consulta de contexto n茫o pode estar vazia',
+        deleteContextVarTitle: 'Excluir vari谩vel "{{varName}}"?',
+        deleteContextVarTip: 'Esta vari谩vel foi definida como uma vari谩vel de consulta de contexto e remov锚-la afetar谩 o uso normal do Conhecimento. Se voc锚 ainda precisa exclu铆-la, por favor, selecione-a novamente na se莽茫o de contexto.',
+      },
+    },
+    tools: {
+      title: 'Tools',
+      tips: 'Tools provide a standard API call method, taking user input or variables as request parameters for querying external data as context.',
+      toolsInUse: '{{count}} tools in use',
+      modal: {
+        title: 'Tool',
+        toolType: {
+          title: 'Tool Type',
+          placeholder: 'Por favor, selecione o tipo de ferramenta',
+        },
+        name: {
+          title: 'Nome',
+          placeholder: 'Por favor, insira o nome',
+        },
+        variableName: {
+          title: 'Nome da Vari谩vel',
+          placeholder: 'Por favor, insira o nome da vari谩vel',
+        },
+      },
+    },
+    conversationHistory: {
+      title: 'Hist贸rico da Conversa',
+      description: 'Defina os nomes dos prefixos para os pap茅is da conversa',
+      tip: 'O Hist贸rico da Conversa n茫o est谩 habilitado, por favor adicione <histories> na solicita莽茫o acima.',
+      learnMore: 'Saiba mais',
+      editModal: {
+        title: 'Editar Nomes dos Pap茅is da Conversa',
+        userPrefix: 'Prefixo do Usu谩rio',
+        assistantPrefix: 'Prefixo do Assistente',
+      },
+    },
+    toolbox: {
+      title: 'CAIXA DE FERRAMENTAS',
+    },
+    moderation: {
+      title: 'Modera莽茫o de Conte煤do',
+      description: 'Proteja a sa铆da do modelo usando a API de modera莽茫o ou mantendo uma lista de palavras sens铆veis.',
+      allEnabled: 'Conte煤do de ENTRADA/SA脥DA Habilitado',
+      inputEnabled: 'Conte煤do de ENTRADA Habilitado',
+      outputEnabled: 'Conte煤do de SA脥DA Habilitado',
+      modal: {
+        title: 'Configura莽玫es de Modera莽茫o de Conte煤do',
+        provider: {
+          title: 'Provedor',
+          openai: 'Modera莽茫o OpenAI',
+          openaiTip: {
+            prefix: 'A Modera莽茫o OpenAI requer uma chave de API da OpenAI configurada em ',
+            suffix: '.',
+          },
+          keywords: 'Palavras-chave',
+        },
+        keywords: {
+          tip: 'Uma por linha, separadas por quebras de linha. At茅 100 caracteres por linha.',
+          placeholder: 'Uma por linha, separadas por quebras de linha',
+          line: 'Linha',
+        },
+        content: {
+          input: 'Moderar Conte煤do de ENTRADA',
+          output: 'Moderar Conte煤do de SA脥DA',
+          preset: 'Respostas pr茅-definidas',
+          placeholder: 'Insira o conte煤do das respostas pr茅-definidas aqui',
+          condition: 'Moderar Conte煤do de ENTRADA e SA脥DA habilitado pelo menos uma',
+          fromApi: 'As respostas pr茅-definidas s茫o retornadas pela API',
+          errorMessage: 'As respostas pr茅-definidas n茫o podem estar vazias',
+          supportMarkdown: 'Suporte a Markdown',
+        },
+        openaiNotConfig: {
+          before: 'A Modera莽茫o OpenAI requer uma chave de API da OpenAI configurada em ',
+          after: '',
+        },
+      },
+    },
+  },
+  automatic: {
+    title: 'Orquestra莽茫o Automatizada de Aplicativos',
+    description: 'Descreva o seu cen谩rio, o Dify ir谩 orquestrar um aplicativo para voc锚.',
+    intendedAudience: 'Qual 茅 o p煤blico-alvo?',
+    intendedAudiencePlaceHolder: 'ex: Estudante',
+    solveProblem: 'Quais problemas eles esperam que a IA possa resolver para eles?',
+    solveProblemPlaceHolder: 'ex: Avaliar o desempenho acad锚mico',
+    generate: 'Gerar',
+    audiencesRequired: 'P煤blicos-alvo necess谩rios',
+    problemRequired: 'Problema necess谩rio',
+    resTitle: 'Orquestramos o seguinte aplicativo para voc锚.',
+    apply: 'Aplicar esta orquestra莽茫o',
+    noData: 'Descreva o seu caso de uso 脿 esquerda, a visualiza莽茫o da orquestra莽茫o ser谩 exibida aqui.',
+    loading: 'Orquestrando o aplicativo para voc锚...',
+    overwriteTitle: 'Substituir configura莽茫o existente?',
+    overwriteMessage: 'Aplicar esta orquestra莽茫o ir谩 substituir a configura莽茫o existente.',
+  },
+  resetConfig: {
+    title: 'Confirmar redefini莽茫o?',
+    message:
+      'A redefini莽茫o descarta as altera莽玫es, restaurando a 煤ltima configura莽茫o publicada.',
+  },
+  errorMessage: {
+    nameOfKeyRequired: 'nome da chave: {{key}} obrigat贸rio',
+    valueOfVarRequired: 'valor de {{key}} n茫o pode estar vazio',
+    queryRequired: 'Texto da solicita莽茫o 茅 obrigat贸rio.',
+    waitForResponse:
+      'Aguarde a resposta 脿 mensagem anterior ser conclu铆da.',
+    waitForBatchResponse:
+      'Aguarde a resposta 脿 tarefa em lote ser conclu铆da.',
+    notSelectModel: 'Por favor, escolha um modelo',
+    waitForImgUpload: 'Aguarde o upload da imagem',
+  },
+  chatSubTitle: 'Instru莽玫es',
+  completionSubTitle: 'Prefixo da Solicita莽茫o',
+  promptTip:
+    'As solicita莽玫es guiam as respostas da IA com instru莽玫es e restri莽玫es. Insira vari谩veis como {{input}}. Este prompt n茫o ser谩 vis铆vel para os usu谩rios.',
+  formattingChangedTitle: 'Formata莽茫o alterada',
+  formattingChangedText:
+    'Modificar a formata莽茫o redefinir谩 a 谩rea de depura莽茫o, voc锚 tem certeza?',
+  variableTitle: 'Vari谩veis',
+  variableTip:
+    'Os usu谩rios preenchem as vari谩veis em um formul谩rio, substituindo automaticamente as vari谩veis na solicita莽茫o.',
+  notSetVar: 'As vari谩veis permitem que os usu谩rios introduzam palavras de solicita莽茫o ou observa莽玫es iniciais ao preencher formul谩rios. Voc锚 pode tentar digitar "{{input}}" nas palavras de solicita莽茫o.',
+  autoAddVar: 'Vari谩veis indefinidas referenciadas na pr茅-solicita莽茫o, voc锚 deseja adicion谩-las no formul谩rio de entrada do usu谩rio?',
+  variableTable: {
+    key: 'Chave da Vari谩vel',
+    name: 'Nome do Campo de Entrada do Usu谩rio',
+    optional: 'Opcional',
+    type: 'Tipo de Entrada',
+    action: 'A莽玫es',
+    typeString: 'Texto',
+    typeSelect: 'Selecionar',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{key}} 茅 obrigat贸rio',
+    tooLong: '{{key}} 茅 muito longa. N茫o pode ter mais de 30 caracteres',
+    notValid: '{{key}} 茅 inv谩lida. Pode conter apenas letras, n煤meros e sublinhados',
+    notStartWithNumber: '{{key}} n茫o pode come莽ar com um n煤mero',
+    keyAlreadyExists: '{{key}} j谩 existe',
+  },
+  otherError: {
+    promptNoBeEmpty: 'A solicita莽茫o n茫o pode estar vazia',
+    historyNoBeEmpty: 'O hist贸rico da conversa deve ser definido na solicita莽茫o',
+    queryNoBeEmpty: 'A consulta deve ser definida na solicita莽茫o',
+  },
+  variableConfig: {
+    'addModalTitle': 'Adicionar Campo de Entrada',
+    'editModalTitle': 'Editar Campo de Entrada',
+    'description': 'Configura莽茫o para a vari谩vel {{varName}}',
+    'fieldType': 'Tipo de Campo',
+    'string': 'Texto Curto',
+    'text-input': 'Texto Curto',
+    'paragraph': 'Par谩grafo',
+    'select': 'Selecionar',
+    'number': 'N煤mero',
+    'notSet': 'N茫o definido, tente digitar {{input}} no prompt de prefixo',
+    'stringTitle': 'Op莽玫es da caixa de texto do formul谩rio',
+    'maxLength': 'Comprimento M谩ximo',
+    'options': 'Op莽玫es',
+    'addOption': 'Adicionar op莽茫o',
+    'apiBasedVar': 'Vari谩vel Baseada em API',
+    'varName': 'Nome da Vari谩vel',
+    'labelName': 'Nome do R贸tulo',
+    'inputPlaceholder': 'Por favor, insira',
+    'required': 'Obrigat贸rio',
+    'errorMsg': {
+      varNameRequired: 'O nome da vari谩vel 茅 obrigat贸rio',
+      labelNameRequired: 'O nome do r贸tulo 茅 obrigat贸rio',
+      varNameCanBeRepeat: 'O nome da vari谩vel n茫o pode ser repetido',
+      atLeastOneOption: 'Pelo menos uma op莽茫o 茅 obrigat贸ria',
+      optionRepeat: 'Tem op莽玫es repetidas',
+    },
+  },
+  vision: {
+    name: 'Vis茫o',
+    description: 'Habilitar a Vis茫o permite que o modelo receba imagens e responda perguntas sobre elas.',
+    settings: 'Configura莽玫es',
+    visionSettings: {
+      title: 'Configura莽玫es de Vis茫o',
+      resolution: 'Resolu莽茫o',
+      resolutionTooltip: `Baixa resolu莽茫o permitir谩 que o modelo receba uma vers茫o de baixa resolu莽茫o de 512 x 512 da imagem e represente a imagem com um or莽amento de 65 tokens. Isso permite que a API retorne respostas mais r谩pidas e consuma menos tokens de entrada para casos de uso que n茫o exigem alta precis茫o.
+                \n
+                Alta resolu莽茫o permitir谩 que o modelo veja a imagem de baixa resolu莽茫o e crie recortes detalhados das imagens de entrada como quadrados de 512px com base no tamanho da imagem de entrada. Cada um dos recortes detalhados usa o dobro do or莽amento de tokens, totalizando 129 tokens.`,
+      high: 'Alta',
+      low: 'Baixa',
+      uploadMethod: 'M茅todo de Upload',
+      both: 'Ambos',
+      localUpload: 'Upload Local',
+      url: 'URL',
+      uploadLimit: 'Limite de Upload',
+    },
+  },
+  voice: {
+    name: 'voz',
+    defaultDisplay: 'Voz padr茫o',
+    description: 'Texto para configura莽玫es de timbre de voz',
+    settings: 'As configura莽玫es',
+    voiceSettings: {
+      title: 'voz As configura莽玫es',
+      language: 'l铆nguas',
+      resolutionTooltip: 'Texto para voz timbre suporta idiomas.',
+      voice: 'voz',
+      autoPlay: 'Reprodu莽茫o autom谩tica',
+      autoPlayEnabled: 'ligar',
+      autoPlayDisabled: 'fecho',
+    },
+  },
+  openingStatement: {
+    title: 'Abertura da Conversa',
+    add: 'Adicionar',
+    writeOpener: 'Escrever abertura',
+    placeholder: 'Escreva sua mensagem de abertura aqui, voc锚 pode usar vari谩veis, tente digitar {{vari谩vel}}.',
+    openingQuestion: 'Perguntas de Abertura',
+    noDataPlaceHolder:
+      'Iniciar a conversa com o usu谩rio pode ajudar a IA a estabelecer uma conex茫o mais pr贸xima com eles em aplicativos de conversa莽茫o.',
+    varTip: 'Voc锚 pode usar vari谩veis, tente digitar {{vari谩vel}}',
+    tooShort: 'S茫o necess谩rias pelo menos 20 palavras de prompt inicial para gerar observa莽玫es de abertura para a conversa.',
+    notIncludeKey: 'O prompt inicial n茫o inclui a vari谩vel: {{key}}. Por favor, adicione-a ao prompt inicial.',
+  },
+  modelConfig: {
+    model: 'Modelo',
+    setTone: 'Definir tom das respostas',
+    title: 'Modelo e Par芒metros',
+    modeType: {
+      chat: 'Chat',
+      completion: 'Completar',
+    },
+  },
+  inputs: {
+    title: 'Depura莽茫o e Visualiza莽茫o',
+    noPrompt: 'Tente escrever algum prompt na entrada de pr茅-prompt',
+    userInputField: 'Campo de Entrada do Usu谩rio',
+    noVar: 'Preencha o valor da vari谩vel, que ser谩 substitu铆da automaticamente na palavra de solicita莽茫o sempre que uma nova sess茫o for iniciada.',
+    chatVarTip:
+      'Preencha o valor da vari谩vel, que ser谩 substitu铆da automaticamente na palavra de solicita莽茫o sempre que uma nova sess茫o for iniciada',
+    completionVarTip:
+      'Preencha o valor da vari谩vel, que ser谩 substitu铆da automaticamente nas palavras de solicita莽茫o sempre que uma pergunta for enviada.',
+    previewTitle: 'Visualiza莽茫o do Prompt',
+    queryTitle: 'Conte煤do da Consulta',
+    queryPlaceholder: 'Por favor, insira o texto da solicita莽茫o.',
+    run: 'EXECUTAR',
+  },
+  result: 'Texto de Sa铆da',
+  datasetConfig: {
+    settingTitle: 'Configura莽玫es de Recupera莽茫o',
+    knowledgeTip: 'Clique no bot茫o 鈥�+鈥� para adicionar conhecimento',
+    retrieveOneWay: {
+      title: 'Recupera莽茫o N-para-1',
+      description: 'Com base na inten莽茫o do usu谩rio e nas descri莽玫es do Conhecimento, o Agente seleciona autonomamente o melhor Conhecimento para consulta. Melhor para aplicativos com Conhecimento distinto e limitado.',
+    },
+    retrieveMultiWay: {
+      title: 'Recupera莽茫o Multi-caminho',
+      description: 'Com base na inten莽茫o do usu谩rio, consulta todos os Conhecimentos, recupera texto relevante de v谩rias fontes e seleciona os melhores resultados que correspondem 脿 consulta do usu谩rio ap贸s a reclassifica莽茫o. 脡 necess谩ria a configura莽茫o da API do modelo de reclassifica莽茫o.',
+    },
+    rerankModelRequired: 'Modelo de reclassifica莽茫o 茅 necess谩rio',
+    params: 'Par芒metros',
+    top_k: 'Top K',
+    top_kTip: 'Usado para filtrar os trechos mais semelhantes 脿s perguntas do usu谩rio. O sistema tamb茅m ajustar谩 dinamicamente o valor de Top K, de acordo com max_tokens do modelo selecionado.',
+    score_threshold: 'Limiar de Pontua莽茫o',
+    score_thresholdTip: 'Usado para definir o limiar de similaridade para filtragem de trechos.',
+    retrieveChangeTip: 'Modificar o modo de 铆ndice e o modo de recupera莽茫o pode afetar os aplicativos associados a este Conhecimento.',
+  },
+  assistantType: {
+    name: 'Tipo de Assistente',
+    chatAssistant: {
+      name: 'Assistente B谩sico',
+      description: 'Construa um assistente baseado em chat usando um Modelo de Linguagem Grande',
+    },
+    agentAssistant: {
+      name: 'Assistente de Agente',
+      description: 'Construa um Agente inteligente que pode escolher autonomamente ferramentas para concluir as tarefas',
+    },
+  },
+  agent: {
+    agentMode: 'Modo do Agente',
+    agentModeDes: 'Defina o tipo de modo de infer锚ncia para o agente',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: 'Chamada de Fun莽茫o',
+    },
+    setting: {
+      name: 'Configura莽玫es do Agente',
+      description: 'As configura莽玫es do Assistente de Agente permitem definir o modo do agente e recursos avan莽ados como prompts incorporados, dispon铆veis apenas no tipo de Agente.',
+      maximumIterations: {
+        name: 'N煤mero M谩ximo de Itera莽玫es',
+        description: 'Limite o n煤mero de itera莽玫es que um assistente de agente pode executar',
+      },
+    },
+    buildInPrompt: 'Prompt Incorporado',
+    firstPrompt: 'Primeiro Prompt',
+    nextIteration: 'Pr贸xima Itera莽茫o',
+    promptPlaceholder: 'Escreva seu prompt aqui',
+    tools: {
+      name: 'Ferramentas',
+      description: 'O uso de ferramentas pode ampliar as capacidades do LLM, como pesquisar na internet ou realizar c谩lculos cient铆ficos',
+      enabled: 'Habilitado',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/pt-BR/app-log.ts b/i18n/pt-BR/app-log.ts
new file mode 100644
index 0000000..0b4cbc8
--- /dev/null
+++ b/i18n/pt-BR/app-log.ts
@@ -0,0 +1,105 @@
+const translation = {
+  title: 'Registros',
+  description: 'Os registros registram o status de execu莽茫o do aplicativo, incluindo entradas do usu谩rio e respostas do AI.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: 'Hora de atualiza莽茫o',
+      time: 'Hora de cria莽茫o',
+      endUser: 'Usu谩rio final ou conta',
+      input: 'Entrada',
+      output: 'Sa铆da',
+      summary: 'T铆tulo',
+      messageCount: 'Contagem de Mensagens',
+      userRate: 'Taxa de Usu谩rio',
+      adminRate: 'Taxa de Op.',
+      startTime: 'HORA DE IN脥CIO',
+      status: 'STATUS',
+      runtime: 'TEMPO DE EXECU脟脙O',
+      tokens: 'TOKENS',
+      user: 'USU脕RIO FINAL OU CONTA',
+      version: 'VERS脙O',
+    },
+    pagination: {
+      previous: 'Anterior',
+      next: 'Pr贸ximo',
+    },
+    empty: {
+      noChat: 'Ainda n茫o h谩 conversas',
+      noOutput: 'Sem sa铆da',
+      element: {
+        title: 'Tem algu茅m a铆?',
+        content: 'Observe e anote as intera莽玫es entre os usu谩rios finais e os aplicativos de IA aqui para melhorar continuamente a precis茫o da IA. Voc锚 pode tentar <shareLink>compartilhar</shareLink> ou <testLink>testar</testLink> o aplicativo da Web voc锚 mesmo, e depois voltar para esta p谩gina.',
+      },
+    },
+  },
+  detail: {
+    time: 'Hora',
+    conversationId: 'ID da Conversa',
+    promptTemplate: 'Modelo de Prompt',
+    promptTemplateBeforeChat: 'Modelo de Prompt Antes do Chat 路 Como Mensagem do Sistema',
+    annotationTip: 'Melhorias Marcadas por {{user}}',
+    timeConsuming: '',
+    second: 's',
+    tokenCost: 'Token gasto',
+    loading: 'carregando',
+    operation: {
+      like: 'curtir',
+      dislike: 'n茫o curtir',
+      addAnnotation: 'Adicionar Melhoria',
+      editAnnotation: 'Editar Melhoria',
+      annotationPlaceholder: 'Digite a resposta esperada que voc锚 deseja que o AI responda, o que pode ser usado para ajustar o modelo e melhorar continuamente a qualidade da gera莽茫o de texto no futuro.',
+    },
+    variables: 'Vari谩veis',
+    uploadImages: 'Imagens Carregadas',
+    modelParams: 'Par芒metros do modelo',
+  },
+  filter: {
+    period: {
+      today: 'Hoje',
+      last7days: '脷ltimos 7 dias',
+      last4weeks: '脷ltimas 4 semanas',
+      last3months: '脷ltimos 3 meses',
+      last12months: '脷ltimos 12 meses',
+      monthToDate: 'M锚s at茅 hoje',
+      quarterToDate: 'Trimestre at茅 hoje',
+      yearToDate: 'Ano at茅 hoje',
+      allTime: 'Todo o tempo',
+    },
+    annotation: {
+      all: 'Tudo',
+      annotated: 'Melhorias Anotadas ({{count}} itens)',
+      not_annotated: 'N茫o Anotado',
+    },
+    sortBy: 'Ordenar por:',
+    descending: 'decrescente',
+    ascending: 'crescente',
+  },
+  workflowTitle: 'Registros de Fluxo de Trabalho',
+  workflowSubtitle: 'O registro registrou a opera莽茫o do Automate.',
+  runDetail: {
+    title: 'Registro de Conversa',
+    workflowTitle: 'Detalhes do Registro',
+    fileListLabel: 'Detalhes do arquivo',
+    fileListDetail: 'Detalhe',
+  },
+  promptLog: 'Registro de Prompt',
+  agentLog: 'Registro do agente',
+  viewLog: 'Ver Registro',
+  agenteLogDetail: {
+    agentMode: 'Modo Agente',
+    toolUsed: 'Ferramenta usada',
+    iterations: 'Itera莽玫es',
+    iteration: 'Itera莽茫o',
+    finalProcessing: 'Processamento Final',
+  },
+  agentLogDetail: {
+    iterations: 'Itera莽玫es',
+    agentMode: 'Modo Agente',
+    finalProcessing: 'Processamento final',
+    iteration: 'Itera莽茫o',
+    toolUsed: 'Ferramenta usada',
+  },
+}
+
+export default translation
diff --git a/i18n/pt-BR/app-overview.ts b/i18n/pt-BR/app-overview.ts
new file mode 100644
index 0000000..10e47a7
--- /dev/null
+++ b/i18n/pt-BR/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: 'Para come莽ar,',
+    enterKeyTip: 'insira sua chave de API OpenAI abaixo',
+    getKeyTip: 'Obtenha sua chave de API no painel da OpenAI',
+    placeholder: 'Sua chave de API OpenAI (ex. sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: 'Voc锚 est谩 usando a cota de teste da {{providerName}}.',
+        description: 'A cota de teste 茅 fornecida para seu uso de teste. Antes que as chamadas de cota de teste se esgotem, configure seu pr贸prio provedor de modelo ou compre cota adicional.',
+      },
+      exhausted: {
+        title: 'Sua cota de teste foi usada, configure sua chave de API.',
+        description: 'Sua cota de teste foi esgotada. Configure seu pr贸prio provedor de modelo ou compre cota adicional.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: 'Para come莽ar,',
+        row2: 'configure primeiro seu provedor de modelo.',
+      },
+    },
+    callTimes: 'N煤mero de chamadas',
+    usedToken: 'Tokens usados',
+    setAPIBtn: 'Ir para configurar o provedor de modelo',
+    tryCloud: 'Ou experimente a vers茫o em nuvem do Dify com cota gratuita',
+  },
+  overview: {
+    title: 'Vis茫o Geral',
+    appInfo: {
+      explanation: 'WebApp de IA Pronta para Uso',
+      accessibleAddress: 'URL P煤blica',
+      preview: 'Visualiza莽茫o',
+      regenerate: 'Regenerar',
+      regenerateNotice: 'Voc锚 deseja regenerar a URL p煤blica?',
+      preUseReminder: 'Por favor, ative o WebApp antes de continuar.',
+      settings: {
+        entry: 'Configura莽玫es',
+        title: 'Configura莽玫es do WebApp',
+        webName: 'Nome do WebApp',
+        webDesc: 'Descri莽茫o do WebApp',
+        webDescTip: 'Este texto ser谩 exibido no lado do cliente, fornecendo orienta莽玫es b谩sicas sobre como usar o aplicativo',
+        webDescPlaceholder: 'Insira a descri莽茫o do WebApp',
+        language: 'Idioma',
+        workflow: {
+          title: 'Etapas do fluxo de trabalho',
+          show: 'Mostrar',
+          hide: 'Ocultar',
+          subTitle: 'Detalhes do fluxo de trabalho',
+          showDesc: 'Mostrar ou ocultar detalhes do fluxo de trabalho no WebApp',
+        },
+        chatColorTheme: 'Tema de cor do chatbot',
+        chatColorThemeDesc: 'Defina o tema de cor do chatbot',
+        chatColorThemeInverted: 'Inve',
+        invalidHexMessage: 'Valor hex inv谩lido',
+        invalidPrivacyPolicy: 'Link de pol铆tica de privacidade inv谩lido. Por favor, use um link v谩lido que comece com http ou https',
+        more: {
+          entry: 'Mostrar mais configura莽玫es',
+          copyright: 'Direitos autorais',
+          copyRightPlaceholder: 'Insira o nome do autor ou organiza莽茫o',
+          privacyPolicy: 'Pol铆tica de Privacidade',
+          privacyPolicyPlaceholder: 'Insira o link da pol铆tica de privacidade',
+          privacyPolicyTip: 'Ajuda os visitantes a entender os dados coletados pelo aplicativo, consulte a <privacyPolicyLink>Pol铆tica de Privacidade</privacyPolicyLink> do Dify.',
+          customDisclaimer: 'Aviso Legal Personalizado',
+          customDisclaimerPlaceholder: 'Insira o texto do aviso legal',
+          customDisclaimerTip: 'O texto do aviso legal personalizado ser谩 exibido no lado do cliente, fornecendo informa莽玫es adicionais sobre o aplicativo',
+          copyrightTip: 'Exibir informa莽玫es de direitos autorais no webapp',
+          copyrightTooltip: 'Por favor, atualize para o plano Professional ou superior',
+        },
+        sso: {
+          tooltip: 'Entre em contato com o administrador para habilitar o SSO do WebApp',
+          label: 'Autentica莽茫o SSO',
+          title: 'WebApp SSO',
+          description: 'Todos os usu谩rios devem fazer login com SSO antes de usar o WebApp',
+        },
+        modalTip: 'Configura莽玫es do aplicativo Web do lado do cliente.',
+      },
+      embedded: {
+        entry: 'Embutido',
+        title: 'Incorporar no site',
+        explanation: 'Escolha a maneira de incorporar o aplicativo de chat ao seu site',
+        iframe: 'Para adicionar o aplicativo de chat em qualquer lugar do seu site, adicione este iframe ao seu c贸digo HTML.',
+        scripts: 'Para adicionar um aplicativo de chat no canto inferior direito do seu site, adicione este c贸digo ao seu HTML.',
+        chromePlugin: 'Instalar a Extens茫o do Chrome Dify Chatbot',
+        copied: 'Copiado',
+        copy: 'Copiar',
+      },
+      qrcode: {
+        title: 'C贸digo QR para compartilhar',
+        scan: 'Digitalizar e compartilhar o aplicativo',
+        download: 'Baixar c贸digo QR',
+      },
+      customize: {
+        way: 'modo',
+        entry: 'Personalizar',
+        title: 'Personalizar WebApp de IA',
+        explanation: 'Voc锚 pode personalizar a interface do usu谩rio do Web App para atender 脿s suas necessidades de cen谩rio e estilo.',
+        way1: {
+          name: 'Fa莽a um fork do c贸digo do cliente, modifique-o e implante-o no Vercel (recomendado)',
+          step1: 'Fa莽a um fork do c贸digo do cliente e modifique-o',
+          step1Tip: 'Clique aqui para fazer um fork do c贸digo-fonte na sua conta GitHub e modificar o c贸digo',
+          step1Operation: 'Cliente-Web-Dify',
+          step2: 'Implantar no Vercel',
+          step2Tip: 'Clique aqui para importar o reposit贸rio no Vercel e implantar',
+          step2Operation: 'Importar reposit贸rio',
+          step3: 'Configurar as vari谩veis de ambiente',
+          step3Tip: 'Adicione as seguintes vari谩veis de ambiente no Vercel',
+        },
+        way2: {
+          name: 'Escreva c贸digo do lado do cliente para chamar a API e implante-o em um servidor',
+          operation: 'Documenta莽茫o',
+        },
+      },
+      launch: 'Lan莽ar',
+    },
+    apiInfo: {
+      title: 'API de Servi莽o de Back-end',
+      explanation: 'Facilmente integrado em sua aplica莽茫o',
+      accessibleAddress: 'Endpoint do Servi莽o API',
+      doc: 'Refer锚ncia da API',
+    },
+    status: {
+      running: 'Em servi莽o',
+      disable: 'Desabilitar',
+    },
+  },
+  analysis: {
+    title: 'An谩lise',
+    ms: 'ms',
+    tokenPS: 'Token/s',
+    totalMessages: {
+      title: 'Total de Mensagens',
+      explanation: 'Contagem di谩ria de intera莽玫es com IA.',
+    },
+    totalConversations: {
+      title: 'Total de Conversas',
+      explanation: 'Contagem di谩ria de conversas com IA; engenharia/depura莽茫o de prompts exclu铆da.',
+    },
+    activeUsers: {
+      title: 'Usu谩rios Ativos',
+      explanation: 'Usu谩rios 煤nicos engajando em Q&A com AI; engenharia/de depura莽茫o exclu铆da.',
+    },
+    tokenUsage: {
+      title: 'Uso de Token',
+      explanation: 'Reflete o uso di谩rio do token do modelo de linguagem para o aplicativo, 煤til para fins de controle de custos.',
+      consumed: 'Consumido',
+    },
+    avgSessionInteractions: {
+      title: 'M茅dia de Intera莽玫es por Sess茫o',
+      explanation: 'Contagem de comunica莽茫o cont铆nua entre usu谩rio e AI; para aplicativos baseados em conversa莽茫o.',
+    },
+    avgUserInteractions: {
+      title: 'M茅dia de Intera莽玫es por Usu谩rio',
+      explanation: 'Reflete a frequ锚ncia de uso di谩rio dos usu谩rios. Essa m茅trica reflete a fidelidade do usu谩rio.',
+    },
+    userSatisfactionRate: {
+      title: 'Taxa de Satisfa莽茫o do Usu谩rio',
+      explanation: 'O n煤mero de curtidas por 1.000 mensagens. Isso indica a propor莽茫o de respostas com as quais os usu谩rios est茫o altamente satisfeitos.',
+    },
+    avgResponseTime: {
+      title: 'Tempo M茅dio de Resposta',
+      explanation: 'Tempo (ms) para o AI processar/responder; para aplicativos baseados em texto.',
+    },
+    tps: {
+      title: 'Velocidade de Sa铆da do Token',
+      explanation: 'Mede o desempenho do LLM. Conta a velocidade de sa铆da de tokens do LLM desde o in铆cio da solicita莽茫o at茅 a conclus茫o da sa铆da.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/pt-BR/app.ts b/i18n/pt-BR/app.ts
new file mode 100644
index 0000000..c09c2de
--- /dev/null
+++ b/i18n/pt-BR/app.ts
@@ -0,0 +1,214 @@
+const translation = {
+  createApp: 'CRIAR APLICATIVO',
+  types: {
+    all: 'Todos',
+    chatbot: 'Chatbot',
+    agent: 'Agente',
+    workflow: 'Fluxo de trabalho',
+    completion: 'Conclus茫o',
+    basic: 'B谩sico',
+    advanced: 'Fluxo de bate-papo',
+  },
+  duplicate: 'Duplicar',
+  duplicateTitle: 'Duplicar Aplicativo',
+  export: 'Exportar DSL',
+  exportFailed: 'Falha ao exportar DSL.',
+  importDSL: 'Importar arquivo DSL',
+  createFromConfigFile: 'Criar a partir do arquivo DSL',
+  deleteAppConfirmTitle: 'Excluir este aplicativo?',
+  deleteAppConfirmContent:
+    'A exclus茫o do aplicativo 茅 irrevers铆vel. Os usu谩rios n茫o poder茫o mais acessar seu aplicativo e todas as configura莽玫es de prompt e logs ser茫o permanentemente exclu铆das.',
+  appDeleted: 'Aplicativo exclu铆do',
+  appDeleteFailed: 'Falha ao excluir aplicativo',
+  join: 'Participe da comunidade',
+  communityIntro:
+    'Discuta com membros da equipe, colaboradores e desenvolvedores em diferentes canais.',
+  roadmap: 'Veja nosso roteiro',
+  newApp: {
+    startFromBlank: 'Criar do zero',
+    startFromTemplate: 'Criar do modelo',
+    captionAppType: 'Que tipo de aplicativo voc锚 deseja criar?',
+    chatbotDescription: 'Construa um aplicativo baseado em chat. Este aplicativo usa um formato de pergunta e resposta, permitindo v谩rias rodadas de conversa cont铆nua.',
+    completionDescription: 'Construa um aplicativo que gera texto de alta qualidade com base em prompts, como gera莽茫o de artigos, resumos, tradu莽玫es e muito mais.',
+    completionWarning: 'Este tipo de aplicativo n茫o ser谩 mais suportado.',
+    agentDescription: 'Construa um Agente inteligente que pode escolher ferramentas para completar as tarefas autonomamente',
+    workflowDescription: 'Construa um aplicativo que gera texto de alta qualidade com base em fluxo de trabalho com alto grau de personaliza莽茫o. 脡 adequado para usu谩rios experientes.',
+    workflowWarning: 'Atualmente em beta',
+    chatbotType: 'M茅todo de orquestra莽茫o do Chatbot',
+    basic: 'B谩sico',
+    basicTip: 'Para iniciantes, pode mudar para o Chatflow mais tarde',
+    basicFor: 'PARA INICIANTES',
+    basicDescription: 'A Orquestra莽茫o B谩sica permite orquestrar um aplicativo Chatbot usando configura莽玫es simples, sem a capacidade de modificar prompts integrados. 脡 adequado para iniciantes.',
+    advanced: 'Chatflow',
+    advancedFor: 'Para usu谩rios avan莽ados',
+    advancedDescription: 'A Orquestra莽茫o de Fluxo de Trabalho orquestra Chatbots na forma de fluxos de trabalho, oferecendo um alto grau de personaliza莽茫o, incluindo a capacidade de editar prompts integrados. 脡 adequado para usu谩rios experientes.',
+    captionName: '脥cone e nome do aplicativo',
+    appNamePlaceholder: 'D锚 um nome para o seu aplicativo',
+    captionDescription: 'Descri莽茫o',
+    appDescriptionPlaceholder: 'Digite a descri莽茫o do aplicativo',
+    useTemplate: 'Usar este modelo',
+    previewDemo: 'Visualizar demonstra莽茫o',
+    chatApp: 'Assistente',
+    chatAppIntro:
+      'Eu quero construir um aplicativo baseado em chat. Este aplicativo usa um formato de pergunta e resposta, permitindo v谩rias rodadas de conversa cont铆nua.',
+    agentAssistant: 'Novo Assistente de Agente',
+    completeApp: 'Gerador de Texto',
+    completeAppIntro:
+      'Eu quero criar um aplicativo que gera texto de alta qualidade com base em prompts, como gera莽茫o de artigos, resumos, tradu莽玫es e muito mais.',
+    showTemplates: 'Quero escolher a partir de um modelo',
+    hideTemplates: 'Voltar para a sele莽茫o de modo',
+    Create: 'Criar',
+    Cancel: 'Cancelar',
+    nameNotEmpty: 'O nome n茫o pode estar vazio',
+    appTemplateNotSelected: 'Por favor, selecione um modelo',
+    appTypeRequired: 'Por favor, selecione um tipo de aplicativo',
+    appCreated: 'Aplicativo criado',
+    appCreateFailed: 'Falha ao criar aplicativo',
+    caution: 'Cuidado',
+    appCreateDSLErrorPart1: 'Uma diferen莽a significativa nas vers玫es DSL foi detectada. For莽ar a importa莽茫o pode causar mau funcionamento do aplicativo.',
+    appCreateDSLErrorPart4: 'Vers茫o DSL suportada pelo sistema:',
+    Confirm: 'Confirmar',
+    appCreateDSLErrorTitle: 'Incompatibilidade de vers茫o',
+    appCreateDSLWarning: 'Cuidado: a diferen莽a de vers茫o DSL pode afetar determinados recursos',
+    appCreateDSLErrorPart3: 'Vers茫o DSL do aplicativo atual:',
+    appCreateDSLErrorPart2: 'Voc锚 quer continuar?',
+    learnMore: 'Saiba Mais',
+    optional: 'Opcional',
+    chooseAppType: 'Escolha o tipo de aplicativo',
+    forBeginners: 'PARA INICIANTES',
+    noTemplateFound: 'Nenhum modelo encontrado',
+    foundResults: '{{contagem}} Resultados',
+    foundResult: '{{contagem}} Resultado',
+    completionUserDescription: 'Crie rapidamente um assistente de IA para tarefas de gera莽茫o de texto com configura莽茫o simples.',
+    noIdeaTip: 'Sem ideias? Confira nossos modelos',
+    workflowUserDescription: 'Orquestra莽茫o de fluxo de trabalho para tarefas de rodada 煤nica, como automa莽茫o e processamento em lote.',
+    chatbotUserDescription: 'Crie rapidamente um chatbot baseado em LLM com configura莽茫o simples. Voc锚 pode alternar para o fluxo de chat mais tarde.',
+    agentShortDescription: 'Agente inteligente com racioc铆nio e uso de ferramenta aut么noma',
+    forAdvanced: 'PARA USU脕RIOS AVAN脟ADOS',
+    chatbotShortDescription: 'Chatbot baseado em LLM com configura莽茫o simples',
+    advancedUserDescription: 'Orquestra莽茫o de fluxo de trabalho para tarefas de di谩logo complexas de v谩rias rodadas com recursos de mem贸ria.',
+    noTemplateFoundTip: 'Tente pesquisar usando palavras-chave diferentes.',
+    agentUserDescription: 'Um agente inteligente capaz de racioc铆nio iterativo e uso aut么nomo de ferramentas para atingir os objetivos da tarefa.',
+    completionShortDescription: 'Assistente de IA para tarefas de gera莽茫o de texto',
+    workflowShortDescription: 'Orquestra莽茫o para tarefas de automa莽茫o de turno 煤nico',
+    noAppsFound: 'Nenhum aplicativo encontrado',
+    advancedShortDescription: 'Fluxo de trabalho para di谩logos complexos de v谩rios turnos com mem贸ria',
+  },
+  editApp: 'Editar Informa莽玫es',
+  editAppTitle: 'Editar Informa莽玫es do Aplicativo',
+  editDone: 'Informa莽玫es do aplicativo atualizadas',
+  editFailed: 'Falha ao atualizar informa莽玫es do aplicativo',
+  iconPicker: {
+    ok: 'OK',
+    cancel: 'Cancelar',
+    emoji: 'Emoji',
+    image: 'Imagem',
+  },
+  switch: 'Mudar para Orquestra莽茫o de Fluxo de Trabalho',
+  switchTipStart: 'Ser谩 criada uma nova c贸pia do aplicativo para voc锚 e a nova c贸pia mudar谩 para Orquestra莽茫o de Fluxo de Trabalho. A nova c贸pia n茫o permitir谩 a ',
+  switchTip: 'volta',
+  switchTipEnd: ' para Orquestra莽茫o B谩sica.',
+  switchLabel: 'A c贸pia do aplicativo a ser criada',
+  removeOriginal: 'Excluir o aplicativo original',
+  switchStart: 'Iniciar mudan莽a',
+  typeSelector: {
+    all: 'Todos os Tipos',
+    chatbot: 'Chatbot',
+    agent: 'Agente',
+    workflow: 'Fluxo de trabalho',
+    completion: 'Conclus茫o',
+    advanced: 'Fluxo de bate-papo',
+  },
+  tracing: {
+    title: 'Rastreamento de desempenho do aplicativo',
+    description: 'Configurando um provedor LLMOps de terceiros e rastreando o desempenho do aplicativo.',
+    config: 'Configurar',
+    collapse: 'Recolher',
+    expand: 'Expandir',
+    tracing: 'Rastreamento',
+    disabled: 'Desativado',
+    disabledTip: 'Por favor, configure o provedor primeiro',
+    enabled: 'Em servi莽o',
+    tracingDescription: 'Captura o contexto completo da execu莽茫o do aplicativo, incluindo chamadas LLM, contexto, prompts, solicita莽玫es HTTP e mais, para uma plataforma de rastreamento de terceiros.',
+    configProviderTitle: {
+      configured: 'Configurado',
+      notConfigured: 'Configure o provedor para habilitar o rastreamento',
+      moreProvider: 'Mais provedores',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: 'Uma plataforma de desenvolvedor completa para cada etapa do ciclo de vida do aplicativo impulsionado por LLM.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: 'Rastreamentos, avalia莽玫es, gerenciamento de prompts e m茅tricas para depurar e melhorar seu aplicativo LLM.',
+    },
+    inUse: 'Em uso',
+    configProvider: {
+      title: 'Configurar ',
+      placeholder: 'Insira sua {{key}}',
+      project: 'Projeto',
+      publicKey: 'Chave P煤blica',
+      secretKey: 'Chave Secreta',
+      viewDocsLink: 'Ver documenta莽茫o de {{key}}',
+      removeConfirmTitle: 'Remover configura莽茫o de {{key}}?',
+      removeConfirmContent: 'A configura莽茫o atual est谩 em uso, remov锚-la desligar谩 o recurso de Rastreamento.',
+    },
+    view: 'Vista',
+    opik: {
+      description: 'Opik 茅 uma plataforma de c贸digo aberto para avaliar, testar e monitorar aplicativos LLM.',
+      title: 'Opik',
+    },
+    weave: {
+      description: 'Weave 茅 uma plataforma de c贸digo aberto para avaliar, testar e monitorar aplica莽玫es de LLM.',
+      title: 'Tran莽ar',
+    },
+  },
+  answerIcon: {
+    descriptionInExplore: 'Se o 铆cone do WebApp deve ser usado para substituir 馃 no Explore',
+    description: 'Se o 铆cone WebApp deve ser usado para substituir 馃 no aplicativo compartilhado',
+    title: 'Use o 铆cone do WebApp para substituir 馃',
+  },
+  importFromDSLUrlPlaceholder: 'Cole o link DSL aqui',
+  importFromDSLUrl: 'Do URL',
+  importFromDSLFile: 'Do arquivo DSL',
+  importFromDSL: 'Importar de DSL',
+  mermaid: {
+    handDrawn: 'M茫o desenhada',
+    classic: 'Cl谩ssico',
+  },
+  openInExplore: 'Abrir no Explore',
+  newAppFromTemplate: {
+    sidebar: {
+      Programming: 'Programa莽茫o',
+      Agent: 'Agente',
+      HR: 'RH',
+      Workflow: 'Fluxo de trabalho',
+      Writing: 'Escrita',
+      Recommended: 'Recomendado',
+      Assistant: 'Assistente',
+    },
+    searchAllTemplate: 'Pesquisar todos os modelos...',
+    byCategories: 'POR CATEGORIAS',
+  },
+  showMyCreatedAppsOnly: 'Mostrar apenas meus aplicativos criados',
+  appSelector: {
+    label: 'APLICA脟脙O',
+    noParams: 'N茫o s茫o necess谩rios par芒metros',
+    placeholder: 'Selecione um aplicativo...',
+    params: 'PAR脗METROS DO APLICATIVO',
+  },
+  structOutput: {
+    LLMResponse: 'Resposta do LLM',
+    configure: 'Configurar',
+    required: 'Requerido',
+    modelNotSupported: 'Modelo n茫o suportado',
+    structured: 'Estruturado',
+    modelNotSupportedTip: 'O modelo atual n茫o suporta esse recurso e 茅 automaticamente rebaixado para inje莽茫o de prompt.',
+    structuredTip: 'Sa铆das Estruturadas 茅 um recurso que garante que o modelo sempre gerar谩 respostas que seguem o seu Esquema JSON fornecido.',
+    moreFillTip: 'Mostrando um m谩ximo de 10 n铆veis de aninhamento',
+    notConfiguredTip: 'A sa铆da estruturada ainda n茫o foi configurada.',
+  },
+}
+
+export default translation
diff --git a/i18n/pt-BR/billing.ts b/i18n/pt-BR/billing.ts
new file mode 100644
index 0000000..f26008c
--- /dev/null
+++ b/i18n/pt-BR/billing.ts
@@ -0,0 +1,201 @@
+const translation = {
+  currentPlan: 'Plano Atual',
+  upgradeBtn: {
+    plain: 'Fazer Upgrade do Plano',
+    encourage: 'Fazer Upgrade Agora',
+    encourageShort: 'Upgrade',
+  },
+  viewBilling: 'Ver informa莽玫es de cobran莽a',
+  buyPermissionDeniedTip: 'Por favor, entre em contato com o administrador da sua empresa para assinar',
+  plansCommon: {
+    title: 'Escolha o plano que melhor atende voc锚',
+    yearlyTip: 'Receba 2 meses gr谩tis assinando anualmente!',
+    mostPopular: 'Mais Popular',
+    planRange: {
+      monthly: 'Mensalmente',
+      yearly: 'Anualmente',
+    },
+    month: 'm锚s',
+    year: 'ano',
+    save: 'Economize ',
+    free: 'Gr谩tis',
+    currentPlan: 'Plano Atual',
+    contractOwner: 'Entre em contato com o gerente da equipe',
+    startForFree: 'Comece de gra莽a',
+    getStartedWith: 'Comece com',
+    contactSales: 'Fale com a equipe de Vendas',
+    talkToSales: 'Fale com a equipe de Vendas',
+    modelProviders: 'Fornecedores de Modelos',
+    teamMembers: 'Membros da Equipe',
+    buildApps: 'Construir Aplica莽玫es',
+    vectorSpace: 'Espa莽o Vetorial',
+    vectorSpaceBillingTooltip: 'Cada 1MB pode armazenar cerca de 1,2 milh茫o de caracteres de dados vetorizados (estimado usando OpenAI Embeddings, varia entre os modelos).',
+    vectorSpaceTooltip: 'O Espa莽o Vetorial 茅 o sistema de mem贸ria de longo prazo necess谩rio para que LLMs compreendam seus dados.',
+    documentProcessingPriority: 'Prioridade no Processamento de Documentos',
+    documentProcessingPriorityTip: 'Para maior prioridade no processamento de documentos, fa莽a o upgrade do seu plano.',
+    documentProcessingPriorityUpgrade: 'Processe mais dados com maior precis茫o e velocidade.',
+    priority: {
+      'standard': 'Padr茫o',
+      'priority': 'Prioridade',
+      'top-priority': 'Prioridade M谩xima',
+    },
+    logsHistory: 'Hist贸rico de Logs',
+    days: 'dias',
+    unlimited: 'Ilimitado',
+    support: 'Suporte',
+    supportItems: {
+      communityForums: 'F贸runs da Comunidade',
+      emailSupport: 'Suporte por E-mail',
+      priorityEmail: 'Suporte priorit谩rio por e-mail e chat',
+      logoChange: 'Mudan莽a de logo',
+      SSOAuthentication: 'Autentica莽茫o SSO',
+      personalizedSupport: 'Suporte personalizado',
+      dedicatedAPISupport: 'Suporte dedicado 脿 API',
+      customIntegration: 'Integra莽茫o e suporte personalizados',
+      ragAPIRequest: 'Solicita莽玫es API RAG',
+      agentModel: 'Modelo de Agente',
+      workflow: 'Fluxo de trabalho',
+      llmLoadingBalancing: 'Balanceamento de carga LLM',
+      bulkUpload: 'Upload em massa de documentos',
+      llmLoadingBalancingTooltip: 'Adicione v谩rias chaves de API aos modelos, efetivamente ignorando os limites de taxa da API. ',
+      agentMode: 'Modo Agente',
+    },
+    comingSoon: 'Em breve',
+    member: 'Membro',
+    memberAfter: 'Membro',
+    messageRequest: {
+      title: 'Cr茅ditos de Mensagem',
+      tooltip: 'Cotas de invoca莽茫o de mensagens para v谩rios planos usando modelos da OpenAI (exceto gpt4). Mensagens al茅m do limite usar茫o sua Chave de API da OpenAI.',
+      titlePerMonth: '{{count,number}} mensagens/m锚s',
+    },
+    annotatedResponse: {
+      title: 'Limites de Cota de Anota莽茫o',
+      tooltip: 'A edi莽茫o manual e anota莽茫o de respostas oferece habilidades personalizadas de perguntas e respostas de alta qualidade para aplicativos. (Aplic谩vel apenas em aplicativos de chat)',
+    },
+    ragAPIRequestTooltip: 'Refere-se ao n煤mero de chamadas de API que invocam apenas as capacidades de processamento da base de conhecimento do Dify.',
+    receiptInfo: 'Somente propriet谩rios e administradores de equipe podem se inscrever e visualizar informa莽玫es de cobran莽a',
+    customTools: 'Ferramentas personalizadas',
+    documentsUploadQuota: 'Cota de upload de documentos',
+    annotationQuota: 'Cota de anota莽茫o',
+    contractSales: 'Entre em contato com a equipe de vendas',
+    unavailable: 'Indispon铆vel',
+    priceTip: 'por espa莽o de trabalho/',
+    apiRateLimit: 'Limite de Taxa da API',
+    freeTrialTipPrefix: 'Inscreva-se e receba um',
+    teamMember_one: '{{count,number}} Membro da Equipe',
+    documentsRequestQuota: '{{count,number}}/min Limite de Taxa de Solicita莽茫o de Conhecimento',
+    cloud: 'Servi莽o de Nuvem',
+    teamWorkspace: '{{count,number}} Espa莽o de Trabalho da Equipe',
+    apiRateLimitUnit: '{{count,number}}/dia',
+    freeTrialTipSuffix: 'Nenhum cart茫o de cr茅dito necess谩rio',
+    teamMember_other: '{{count,number}} Membros da Equipe',
+    comparePlanAndFeatures: 'Compare planos e recursos',
+    getStarted: 'Come莽ar',
+    annualBilling: 'Cobran莽a Anual',
+    self: 'Auto-Hospedado',
+    documentsTooltip: 'Cota sobre o n煤mero de documentos importados da Fonte de Dados do Conhecimento.',
+    freeTrialTip: 'teste gratuito de 200 chamadas da OpenAI.',
+    documents: '{{count,number}} Documentos de Conhecimento',
+    unlimitedApiRate: 'Sem limite de taxa da API',
+    apiRateLimitTooltip: 'O limite da taxa da API se aplica a todas as solicita莽玫es feitas atrav茅s da API Dify, incluindo gera莽茫o de texto, conversas de chat, execu莽玫es de fluxo de trabalho e processamento de documentos.',
+    documentsRequestQuotaTooltip: 'Especifica o n煤mero total de a莽玫es que um espa莽o de trabalho pode realizar por minuto dentro da base de conhecimento, incluindo cria莽茫o, exclus茫o, atualiza莽玫es de conjuntos de dados, uploads de documentos, modifica莽玫es, arquivamento e consultas 脿 base de conhecimento. Esse m茅trica 茅 utilizada para avaliar o desempenho das solicita莽玫es 脿 base de conhecimento. Por exemplo, se um usu谩rio do Sandbox realizar 10 testes de impacto consecutivos dentro de um minuto, seu espa莽o de trabalho ficar谩 temporariamente restrito de realizar as seguintes a莽玫es no minuto seguinte: cria莽茫o, exclus茫o, atualiza莽玫es de conjuntos de dados e uploads ou modifica莽玫es de documentos.',
+  },
+  plans: {
+    sandbox: {
+      name: 'Sandbox',
+      description: '200 vezes GPT de teste gratuito',
+      includesTitle: 'Inclui:',
+      for: 'Teste gratuito das capacidades principais',
+    },
+    professional: {
+      name: 'Profissional',
+      description: 'Para indiv铆duos e pequenas equipes desbloquearem mais poder de forma acess铆vel.',
+      includesTitle: 'Tudo no plano gratuito, al茅m de:',
+      for: 'Para Desenvolvedores Independentes/Pequenas Equipes',
+    },
+    team: {
+      name: 'Equipe',
+      description: 'Colabore sem limites e aproveite o desempenho de primeira linha.',
+      includesTitle: 'Tudo no plano Profissional, al茅m de:',
+      for: 'Para Equipes de M茅dio Porte',
+    },
+    enterprise: {
+      name: 'Empresa',
+      description: 'Obtenha capacidades completas e suporte para sistemas cr铆ticos em larga escala.',
+      includesTitle: 'Tudo no plano Equipe, al茅m de:',
+      features: {
+        6: 'Seguran莽a e Controles Avan莽ados',
+        7: 'Atualiza莽玫es e Manuten莽茫o por Dify Oficialmente',
+        5: 'Acordos de N铆vel de Servi莽o negociados pelos Parceiros Dify',
+        1: 'Autoriza莽茫o de Licen莽a Comercial',
+        8: 'Suporte T茅cnico Profissional',
+        4: 'SSO',
+        2: 'Recursos Exclusivos da Empresa',
+        3: 'M煤ltiplos Espa莽os de Trabalho e Gest茫o Empresarial',
+        0: 'Solu莽玫es de Implanta莽茫o Escal谩veis de N铆vel Empresarial',
+      },
+      btnText: 'Contate Vendas',
+      priceTip: 'Faturamento Anual Apenas',
+      price: 'Custom',
+      for: 'Para equipes de grande porte',
+    },
+    community: {
+      features: {
+        1: 'Espa莽o de Trabalho 脷nico',
+        0: 'Todos os recursos principais lan莽ados sob o reposit贸rio p煤blico',
+        2: 'Cumpre a Licen莽a de C贸digo Aberto Dify',
+      },
+      name: 'Comunidade',
+      description: 'Para Usu谩rios Individuais, Pequenas Equipes ou Projetos N茫o Comerciais',
+      includesTitle: 'Recursos Gratuitos:',
+      btnText: 'Comece com a Comunidade',
+      price: 'Gr谩tis',
+      for: 'Para Usu谩rios Individuais, Pequenas Equipes ou Projetos N茫o Comerciais',
+    },
+    premium: {
+      features: {
+        1: 'Espa莽o de Trabalho 脷nico',
+        3: 'Suporte priorit谩rio por e-mail e chat',
+        2: 'Customiza莽茫o de Logo e Branding do WebApp',
+        0: 'Confiabilidade autogerenciada por v谩rios provedores de nuvem',
+      },
+      includesTitle: 'Tudo da Comunidade, al茅m de:',
+      for: 'Para organiza莽玫es e equipes de m茅dio porte',
+      price: 'Escal谩vel',
+      name: 'Premium',
+      comingSoon: 'Suporte da Microsoft Azure e Google Cloud em breve',
+      priceTip: 'Baseado no Mercado de Nuvem',
+      btnText: 'Obtenha Premium em',
+      description: 'Para organiza莽玫es e equipes de m茅dio porte',
+    },
+  },
+  vectorSpace: {
+    fullTip: 'O Espa莽o Vetorial est谩 cheio.',
+    fullSolution: 'Fa莽a o upgrade do seu plano para obter mais espa莽o.',
+  },
+  apps: {
+    fullTipLine1: 'Fa莽a o upgrade do seu plano para',
+    fullTipLine2: 'construir mais aplicativos.',
+    fullTip1: 'Atualize para criar mais aplicativos',
+    fullTip2: 'Limite do plano alcan莽ado',
+    fullTip1des: 'Voc锚 atingiu o limite de criar aplicativos neste plano.',
+    contactUs: 'Contate-nos',
+    fullTip2des: '脡 recomendado limpar aplica莽玫es inativas para liberar uso ou entrar em contato conosco.',
+  },
+  annotatedResponse: {
+    fullTipLine1: 'Fa莽a o upgrade do seu plano para',
+    fullTipLine2: 'anotar mais conversas.',
+    quotaTitle: 'Cota de Respostas Anotadas',
+  },
+  usagePage: {
+    documentsUploadQuota: 'Cota de Upload de Documentos',
+    annotationQuota: 'Cota de Anota莽茫o',
+    teamMembers: 'Membros da equipe',
+    vectorSpace: 'Armazenamento de Dados do Conhecimento',
+    vectorSpaceTooltip: 'Documentos com o modo de indexa莽茫o de Alta Qualidade consumir茫 recursos de Armazenamento de Dados de Conhecimento. Quando o Armazenamento de Dados de Conhecimento atingir o limite, novos documentos n茫o ser茫o carregados.',
+    buildApps: 'Desenvolver Apps',
+  },
+  teamMembers: 'Membros da equipe',
+}
+
+export default translation
diff --git a/i18n/pt-BR/common.ts b/i18n/pt-BR/common.ts
new file mode 100644
index 0000000..7b7eeaf
--- /dev/null
+++ b/i18n/pt-BR/common.ts
@@ -0,0 +1,672 @@
+const translation = {
+  api: {
+    success: 'Sucesso',
+    actionSuccess: 'A莽茫o bem-sucedida',
+    saved: 'Salvo',
+    create: 'Criado',
+    remove: 'Removido',
+  },
+  operation: {
+    create: 'Criar',
+    confirm: 'Confirmar',
+    cancel: 'Cancelar',
+    clear: 'Limpar',
+    save: 'Salvar',
+    saveAndEnable: 'Salvar e Ativar',
+    edit: 'Editar',
+    add: 'Adicionar',
+    added: 'Adicionado',
+    refresh: 'Reiniciar',
+    reset: 'Redefinir',
+    search: 'Buscar',
+    change: 'Alterar',
+    remove: 'Remover',
+    send: 'Enviar',
+    copy: 'Copiar',
+    lineBreak: 'Quebra de linha',
+    sure: 'Tenho certeza',
+    download: 'Baixar',
+    delete: 'Excluir',
+    settings: 'Configura莽玫es',
+    setup: 'Configura莽茫o',
+    getForFree: 'Obter gratuitamente',
+    reload: 'Recarregar',
+    ok: 'OK',
+    log: 'Log',
+    learnMore: 'Saiba Mais',
+    params: 'Par芒metros',
+    duplicate: 'Duplicada',
+    rename: 'Renomear',
+    audioSourceUnavailable: 'AudioSource n茫o est谩 dispon铆vel',
+    zoomOut: 'Diminuir o zoom',
+    zoomIn: 'Ampliar',
+    copyImage: 'Copiar imagem',
+    openInNewTab: 'Abrir em nova guia',
+    viewMore: 'VER MAIS',
+    regenerate: 'Regenerar',
+    close: 'Fechar',
+    saveAndRegenerate: 'Salvar e regenerar peda莽os filhos',
+    view: 'Vista',
+    submit: 'Enviar',
+    skip: 'Navio',
+    imageCopied: 'Imagem copiada',
+    deleteApp: 'Excluir aplicativo',
+    copied: 'Copiado',
+    in: 'em',
+    viewDetails: 'Ver detalhes',
+    downloadFailed: 'Download falhou. Por favor, tente novamente mais tarde.',
+    more: 'Mais',
+    downloadSuccess: 'Download conclu铆do.',
+    format: 'Formato',
+  },
+  placeholder: {
+    input: 'Por favor, insira',
+    select: 'Por favor, selecione',
+  },
+  voice: {
+    language: {
+      zhHans: 'Chin锚s',
+      zhHant: 'Chin锚s Tradicional',
+      enUS: 'Ingl锚s',
+      deDE: 'Alem茫o',
+      frFR: 'Franc锚s',
+      esES: 'Espanhol',
+      itIT: 'Italiano',
+      thTH: 'Tailand锚s',
+      idID: 'Indon茅sio',
+      jaJP: 'Japon锚s',
+      koKR: 'Coreano',
+      ptBR: 'Portugu锚s',
+      ruRU: 'Russo',
+      ukUA: 'Ucraniano',
+      viVN: 'Vietnamita',
+      plPL: 'Polon锚s',
+      roRO: 'Romeno',
+      hiIN: 'Hindi',
+      trTR: 'Turco',
+      faIR: 'Persa',
+    },
+  },
+  unit: {
+    char: 'caracteres',
+  },
+  actionMsg: {
+    noModification: 'Sem modifica莽玫es no momento.',
+    modifiedSuccessfully: 'Modificado com sucesso',
+    modifiedUnsuccessfully: 'Modificado sem sucesso',
+    copySuccessfully: 'Copiado com sucesso',
+    paySucceeded: 'Pagamento realizado com sucesso',
+    payCancelled: 'Pagamento cancelado',
+    generatedSuccessfully: 'Gerado com sucesso',
+    generatedUnsuccessfully: 'Gera莽茫o sem sucesso',
+  },
+  model: {
+    params: {
+      temperature: 'Temperatura',
+      temperatureTip:
+        'Controla a aleatoriedade: Diminuir resulta em conclus玫es menos aleat贸rias. 脌 medida que a temperatura se aproxima de zero, o modelo se tornar谩 determin铆stico e repetitivo.',
+      top_p: 'Top P',
+      top_pTip:
+        'Controla a diversidade via amostragem de n煤cleo: 0.5 significa que metade de todas as op莽玫es ponderadas por probabilidade s茫o consideradas.',
+      presence_penalty: 'Penalidade de presen莽a',
+      presence_penaltyTip:
+        'Quanto penalizar novos tokens com base em se eles aparecem no texto at茅 agora.\nAumenta a probabilidade do modelo de falar sobre novos t贸picos.',
+      frequency_penalty: 'Penalidade de frequ锚ncia',
+      frequency_penaltyTip:
+        'Quanto penalizar novos tokens com base em sua frequ锚ncia existente no texto at茅 agora.\nDiminui a probabilidade do modelo de repetir a mesma linha textualmente.',
+      max_tokens: 'M谩ximo de tokens',
+      max_tokensTip:
+        'Usado para limitar o comprimento m谩ximo da resposta, em tokens. \nValores maiores podem limitar o espa莽o restante para palavras de prompt, registros de bate-papo e Conhecimento. \nRecomenda-se defini-lo abaixo de dois ter莽os\ngpt-4-1106-preview, gpt-4-vision-preview max token (entrada 128k sa铆da 4k)',
+      maxTokenSettingTip: 'Sua configura莽茫o m谩xima de token 茅 alta, limitando potencialmente o espa莽o para palavras de prompt, consultas e dados. Considere definir abaixo de 2/3.',
+      setToCurrentModelMaxTokenTip: 'O m谩ximo de tokens 茅 atualizado para 80% do m谩ximo de token do modelo atual {{maxToken}}.',
+      stop_sequences: 'Sequ锚ncias de parada',
+      stop_sequencesTip: 'At茅 quatro sequ锚ncias onde a API聽ir谩 parar de gerar mais tokens. O texto retornado n茫o conter谩 a sequ锚ncia de parada.',
+      stop_sequencesPlaceholder: 'Digite a sequ锚ncia e pressione Tab',
+    },
+    tone: {
+      Creative: 'Criativo',
+      Balanced: 'Equilibrado',
+      Precise: 'Preciso',
+      Custom: 'Personalizado',
+    },
+    addMoreModel: 'V谩 para configura莽玫es para adicionar mais modelos',
+    settingsLink: 'Configura莽玫es do provedor de modelos',
+    capabilities: 'Recursos multimodais',
+  },
+  menus: {
+    status: 'beta',
+    explore: 'Explorar',
+    apps: 'Est煤dio',
+    plugins: 'Plugins',
+    pluginsTips: 'Integre plugins de terceiros ou crie plugins de IA compat铆veis com o ChatGPT.',
+    datasets: 'Conhecimento',
+    datasetsTips: 'EM BREVE: Importe seus pr贸prios dados de texto ou escreva dados em tempo real via Webhook para aprimoramento do contexto LLM.',
+    newApp: 'Novo App',
+    newDataset: 'Criar Conhecimento',
+    tools: 'Ferramentas',
+    exploreMarketplace: 'Explorar Mercado',
+  },
+  userProfile: {
+    settings: 'Configura莽玫es',
+    emailSupport: 'Suporte por e-mail',
+    workspace: 'Espa莽o de trabalho',
+    createWorkspace: 'Criar Espa莽o de Trabalho',
+    helpCenter: 'Ajuda',
+    communityFeedback: 'Feedback',
+    roadmap: 'Roteiro',
+    community: 'Comunidade',
+    about: 'Sobre',
+    logout: 'Sair',
+    github: 'GitHub',
+    support: 'Suporte',
+    compliance: 'Conformidade',
+  },
+  settings: {
+    accountGroup: 'CONTA',
+    workplaceGroup: 'ESPA脟O DE TRABALHO',
+    account: 'Minha conta',
+    members: 'Membros',
+    billing: 'Faturamento',
+    integrations: 'Integra莽玫es',
+    language: 'Idioma',
+    provider: 'Fornecedor de modelo',
+    dataSource: 'Fonte de dados',
+    plugin: 'Plugins',
+    apiBasedExtension: 'Extens茫o baseada em API',
+    generalGroup: 'GERAL',
+  },
+  account: {
+    avatar: 'Avatar',
+    name: 'Nome',
+    email: 'E-mail',
+    password: 'Senha',
+    passwordTip: 'Voc锚 pode definir uma senha permanente se n茫o quiser usar c贸digos de login tempor谩rios',
+    setPassword: 'Definir uma senha',
+    resetPassword: 'Redefinir senha',
+    currentPassword: 'Senha atual',
+    newPassword: 'Nova senha',
+    confirmPassword: 'Confirmar senha',
+    notEqual: 'As duas senhas s茫o diferentes.',
+    langGeniusAccount: 'Conta Dify',
+    langGeniusAccountTip: 'Sua conta Dify e dados de usu谩rio associados.',
+    editName: 'Editar Nome',
+    showAppLength: 'Mostrar {{length}} apps',
+    delete: 'Excluir conta',
+    deleteTip: 'Excluir sua conta apagar谩 permanentemente todos os seus dados e eles n茫o poder茫o ser recuperados.',
+    deleteConfirmTip: 'Para confirmar, envie o seguinte do seu e-mail registrado para ',
+    myAccount: 'Minha Conta',
+    account: 'Conta',
+    studio: 'Est煤dio Dify',
+    deletePrivacyLinkTip: 'Para obter mais informa莽玫es sobre como lidamos com seus dados, consulte nosso',
+    deletePrivacyLink: 'Pol铆tica de privacidade.',
+    deleteSuccessTip: 'Sua conta precisa de tempo para concluir a exclus茫o. Enviaremos um e-mail quando tudo estiver pronto.',
+    deleteLabel: 'Para confirmar, digite seu e-mail abaixo',
+    deletePlaceholder: 'Por favor, digite seu e-mail',
+    sendVerificationButton: 'Enviar c贸digo de verifica莽茫o',
+    verificationLabel: 'C贸digo de verifica莽茫o',
+    verificationPlaceholder: 'Cole o c贸digo de 6 d铆gitos',
+    permanentlyDeleteButton: 'Excluir conta permanentemente',
+    feedbackTitle: 'Realimenta莽茫o',
+    feedbackLabel: 'Diga-nos por que voc锚 excluiu sua conta?',
+    feedbackPlaceholder: 'Opcional',
+    workspaceName: 'Nome do Espa莽o de Trabalho',
+    workspaceIcon: '脥cone de 脕rea de Trabalho',
+    editWorkspaceInfo: 'Editar Informa莽玫es do Espa莽o de Trabalho',
+  },
+  members: {
+    team: 'Equipe',
+    invite: 'Adicionar',
+    name: 'NOME',
+    lastActive: '脷LTIMA ATIVIDADE',
+    role: 'FUN脟脮ES',
+    pending: 'Pendente...',
+    owner: 'Propriet谩rio',
+    admin: 'Admin',
+    adminTip: 'Pode criar aplicativos e gerenciar configura莽玫es da equipe',
+    normal: 'Normal',
+    normalTip: 'S贸 pode usar aplicativos, n茫o pode criar aplicativos',
+    editor: 'Editor',
+    editorTip: 'Pode editar aplicativos, mas n茫o pode gerenciar configura莽玫es da equipe',
+    inviteTeamMember: 'Adicionar membro da equipe',
+    inviteTeamMemberTip: 'Eles podem acessar os dados da sua equipe diretamente ap贸s fazer login.',
+    emailNotSetup: 'O servidor de e-mail n茫o est谩 configurado, ent茫o os e-mails de convite n茫o podem ser enviados. Por favor, notifique os usu谩rios sobre o link de convite que ser谩 emitido ap贸s o convite.',
+    email: 'E-mail',
+    emailInvalid: 'Formato de e-mail inv谩lido',
+    emailPlaceholder: 'Por favor, insira e-mails',
+    sendInvite: 'Enviar Convite',
+    invitedAsRole: 'Convidado como usu谩rio {{role}}',
+    invitationSent: 'Convite enviado',
+    invitationSentTip: 'Convite enviado e eles podem fazer login no Dify para acessar os dados da sua equipe.',
+    invitationLink: 'Link do Convite',
+    failedInvitationEmails: 'Os seguintes usu谩rios n茫o foram convidados com sucesso',
+    ok: 'OK',
+    removeFromTeam: 'Remover da equipe',
+    removeFromTeamTip: 'Remover谩 o acesso da equipe',
+    setAdmin: 'Definir como administrador',
+    setMember: 'Definir como membro comum',
+    setEditor: 'Definir como editor',
+    disInvite: 'Cancelar o convite',
+    deleteMember: 'Excluir Membro',
+    you: '(Voc锚)',
+    datasetOperatorTip: 'S贸 pode gerenciar a base de dados de conhecimento',
+    builder: 'Construtor',
+    setBuilder: 'Definir como construtor',
+    builderTip: 'Pode criar e editar seus pr贸prios aplicativos',
+    datasetOperator: 'Administrador de conhecimento',
+  },
+  integrations: {
+    connected: 'Conectado',
+    google: 'Google',
+    googleAccount: 'Fa莽a login com a conta do Google',
+    github: 'GitHub',
+    githubAccount: 'Fa莽a login com a conta do GitHub',
+    connect: 'Conectar',
+  },
+  language: {
+    displayLanguage: 'Idioma de exibi莽茫o',
+    timezone: 'Fuso hor谩rio',
+  },
+  provider: {
+    apiKey: 'Chave da API',
+    enterYourKey: 'Insira sua chave da API aqui',
+    invalidKey: 'Chave da API OpenAI inv谩lida',
+    validatedError: 'Falha na valida莽茫o: ',
+    validating: 'Validando chave...',
+    saveFailed: 'Falha ao salvar a chave da API',
+    apiKeyExceedBill: 'Esta CHAVE DE API n茫o tem quota dispon铆vel, por favor, leia',
+    addKey: 'Adicionar Chave',
+    comingSoon: 'Em breve',
+    editKey: 'Editar',
+    invalidApiKey: 'Chave da API inv谩lida',
+    azure: {
+      apiBase: 'Base da API',
+      apiBasePlaceholder: 'A URL base da API do seu ponto de extremidade Azure OpenAI.',
+      apiKey: 'Chave da API',
+      apiKeyPlaceholder: 'Insira sua chave da API aqui',
+      helpTip: 'Saiba mais sobre o Servi莽o Azure OpenAI',
+    },
+    openaiHosted: {
+      openaiHosted: 'OpenAI Hospedado',
+      onTrial: 'EM TESTE',
+      exhausted: 'COTA ESGOTADA',
+      desc: 'O servi莽o de hospedagem OpenAI fornecido pela Dify permite que voc锚 use modelos como GPT-3.5. Antes que sua cota de teste seja esgotada, voc锚 precisa configurar outros fornecedores de modelos.',
+      callTimes: 'Chamadas',
+      usedUp: 'Cota de teste esgotada. Adicione seu pr贸prio Fornecedor de Modelo.',
+      useYourModel: 'Atualmente usando seu pr贸prio Fornecedor de Modelo.',
+      close: 'Fechar',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: 'EM TESTE',
+      exhausted: 'COTA ESGOTADA',
+      desc: 'Modelo poderoso, que se destaca em uma ampla gama de tarefas, desde di谩logos sofisticados e gera莽茫o de conte煤do criativo at茅 instru莽玫es detalhadas.',
+      callTimes: 'Chamadas',
+      usedUp: 'Cota de teste esgotada. Adicione seu pr贸prio Fornecedor de Modelo.',
+      useYourModel: 'Atualmente usando seu pr贸prio Fornecedor de Modelo.',
+      close: 'Fechar',
+      trialQuotaTip: 'Sua cota de teste do Anthropic expirar谩 em 11/03/2025 e n茫o estar谩 mais dispon铆vel depois disso. Por favor, use-o a tempo.',
+    },
+    anthropic: {
+      using: 'A capacidade de incorpora莽茫o est谩 sendo utilizada',
+      enableTip: 'Para habilitar o modelo da Anthropic, voc锚 precisa vincular ao OpenAI ou ao Azure OpenAI Service primeiro.',
+      notEnabled: 'N茫o habilitado',
+      keyFrom: 'Obtenha sua chave da API da Anthropic',
+    },
+    encrypted: {
+      front: 'Sua CHAVE DA API ser谩 criptografada e armazenada usando',
+      back: ' tecnologia.',
+    },
+  },
+  modelProvider: {
+    notConfigured: 'O modelo do sistema ainda n茫o foi totalmente configurado e algumas fun莽玫es podem estar indispon铆veis.',
+    systemModelSettings: 'Configura莽玫es do Modelo do Sistema',
+    systemModelSettingsLink: 'Por que 茅 necess谩rio configurar um modelo do sistema?',
+    selectModel: 'Selecione seu modelo',
+    setupModelFirst: 'Por favor, configure seu modelo primeiro',
+    systemReasoningModel: {
+      key: 'Modelo de Racioc铆nio do Sistema',
+      tip: 'Defina o modelo de infer锚ncia padr茫o a ser usado para criar aplicativos, bem como recursos como gera莽茫o de nomes de di谩logo e sugest茫o de pr贸xima pergunta tamb茅m usar茫o o modelo de infer锚ncia padr茫o.',
+    },
+    embeddingModel: {
+      key: 'Modelo de Incorpora莽茫o',
+      tip: 'Defina o modelo padr茫o para o processamento de incorpora莽茫o de documentos do Conhecimento, tanto a recupera莽茫o quanto a importa莽茫o do Conhecimento usam este modelo de Incorpora莽茫o para processamento de vetoriza莽茫o. Alterar causar谩 inconsist锚ncia na dimens茫o do vetor entre o Conhecimento importado e a pergunta, resultando em falha na recupera莽茫o. Para evitar falhas na recupera莽茫o, n茫o altere este modelo indiscriminadamente.',
+      required: 'O modelo de Incorpora莽茫o 茅 obrigat贸rio',
+    },
+    speechToTextModel: {
+      key: 'Modelo de Fala para Texto',
+      tip: 'Defina o modelo padr茫o para entrada de fala para texto na conversa.',
+    },
+    ttsModel: {
+      key: 'Modelo de Texto para Fala',
+      tip: 'Defina o modelo padr茫o para entrada de texto para fala na conversa.',
+    },
+    rerankModel: {
+      key: 'Modelo de Reordena莽茫o',
+      tip: 'O modelo de reordenaena莽茫o reorganizar谩 a lista de documentos candidatos com base na correspond锚ncia sem芒ntica com a consulta do usu谩rio, melhorando os resultados da classifica莽茫o sem芒ntica',
+    },
+    quota: 'Quota',
+    searchModel: 'Modelo de pesquisa',
+    noModelFound: 'Nenhum modelo encontrado para {{model}}',
+    models: 'Modelos',
+    showMoreModelProvider: 'Mostrar mais provedor de modelo',
+    selector: {
+      tip: 'Este modelo foi removido. Adicione um modelo ou selecione outro modelo.',
+      emptyTip: 'Nenhum modelo dispon铆vel',
+      emptySetting: 'Por favor, v谩 para configura莽玫es para configurar',
+      rerankTip: 'Por favor, configure o modelo de reordena莽茫o',
+    },
+    card: {
+      quota: 'QUOTA',
+      onTrial: 'Em Teste',
+      paid: 'Pago',
+      quotaExhausted: 'Quota esgotada',
+      callTimes: 'Chamadas',
+      tokens: 'Tokens',
+      buyQuota: 'Comprar Quota',
+      priorityUse: 'Uso priorit谩rio',
+      removeKey: 'Remover Chave da API',
+      tip: 'A prioridade ser谩 dada 脿 quota paga. A quota de teste ser谩 usada ap贸s a quota paga ser esgotada.',
+    },
+    item: {
+      deleteDesc: '{{modelName}} est谩 sendo usado como modelos de racioc铆nio do sistema. Algumas fun莽玫es n茫o estar茫o dispon铆veis ap贸s a remo莽茫o. Por favor, confirme.',
+      freeQuota: 'QUOTA GRATUITA',
+    },
+    addApiKey: 'Adicionar sua chave da API',
+    invalidApiKey: 'Chave da API inv谩lida',
+    encrypted: {
+      front: 'Sua CHAVE DA API ser谩 criptografada e armazenada usando',
+      back: ' tecnologia.',
+    },
+    freeQuota: {
+      howToEarn: 'Como ganhar',
+    },
+    addMoreModelProvider: 'ADICIONAR MAIS FORNECEDOR DE MODELO',
+    addModel: 'Adicionar Modelo',
+    modelsNum: '{{num}} Modelos',
+    showModels: 'Mostrar Modelos',
+    showModelsNum: 'Mostrar {{num}} Modelos',
+    collapse: 'Recolher',
+    config: 'Configura莽茫o',
+    modelAndParameters: 'Modelo e Par芒metros',
+    model: 'Modelo',
+    featureSupported: '{{feature}} suportado',
+    callTimes: 'Chamadas',
+    credits: 'Cr茅ditos de Mensagem',
+    buyQuota: 'Comprar Quota',
+    getFreeTokens: 'Obter Tokens Gratuitos',
+    priorityUsing: 'Uso priorit谩rio',
+    deprecated: 'Obsoleto',
+    confirmDelete: 'confirmar exclus茫o?',
+    quotaTip: 'Tokens gratuitos dispon铆veis restantes',
+    loadPresets: 'Carregar Predefini莽玫es',
+    parameters: 'PAR脗METROS',
+    loadBalancingDescription: 'Reduza a press茫o com v谩rios conjuntos de credenciais.',
+    configLoadBalancing: 'Balanceamento de carga de configura莽茫o',
+    upgradeForLoadBalancing: 'Atualize seu plano para habilitar o balanceamento de carga.',
+    providerManaged: 'Gerenciado pelo provedor',
+    apiKeyStatusNormal: 'O status do APIKey 茅 normal',
+    loadBalancing: 'Balanceamento de carga',
+    addConfig: 'Adicionar configura莽茫o',
+    providerManagedDescription: 'Use o 煤nico conjunto de credenciais fornecido pelo provedor de modelo.',
+    apiKey: 'CHAVE DE API',
+    loadBalancingLeastKeyWarning: 'Para habilitar o balanceamento de carga, pelo menos 2 chaves devem estar habilitadas.',
+    editConfig: 'Editar configura莽茫o',
+    defaultConfig: 'Configura莽茫o padr茫o',
+    modelHasBeenDeprecated: 'Este modelo foi preterido',
+    loadBalancingInfo: 'Por padr茫o, o balanceamento de carga usa a estrat茅gia Round-robin. Se a limita莽茫o de taxa for acionada, um per铆odo de espera de 1 minuto ser谩 aplicado.',
+    apiKeyRateLimit: 'O limite de taxa foi atingido, dispon铆vel ap贸s {{seconds}}s',
+    loadBalancingHeadline: 'Balanceamento de carga',
+    emptyProviderTip: 'Instale um provedor de modelo primeiro.',
+    installProvider: 'Instalar provedores de modelo',
+    discoverMore: 'Descubra mais em',
+    configureTip: 'Configure a chave de API ou adicione o modelo a ser usado',
+    emptyProviderTitle: 'Provedor de modelo n茫o configurado',
+    toBeConfigured: 'A ser configurado',
+  },
+  dataSource: {
+    add: 'Adicionar uma fonte de dados',
+    connect: 'Conectar',
+    notion: {
+      title: 'Notion',
+      description: 'Usando o Notion como fonte de dados para o Conhecimento.',
+      connectedWorkspace: 'Espa莽o de trabalho conectado',
+      addWorkspace: 'Adicionar espa莽o de trabalho',
+      connected: 'Conectado',
+      disconnected: 'Desconectado',
+      changeAuthorizedPages: 'Alterar p谩ginas autorizadas',
+      pagesAuthorized: 'P谩ginas autorizadas',
+      sync: 'Sincronizar',
+      remove: 'Remover',
+      selector: {
+        pageSelected: 'P谩ginas Selecionadas',
+        searchPages: 'Pesquisar p谩ginas...',
+        noSearchResult: 'Nenhum resultado de pesquisa',
+        addPages: 'Adicionar p谩ginas',
+        preview: 'PR脡-VISUALIZA脟脙O',
+      },
+    },
+    website: {
+      inactive: 'Inativo',
+      active: 'Ativo',
+      title: 'Local na rede Internet',
+      with: 'Com',
+      configuredCrawlers: 'Rastreadores configurados',
+      description: 'Importe conte煤do de sites usando o rastreador da Web.',
+    },
+    configure: 'Configurar',
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'Chave da API',
+      apiKeyPlaceholder: 'Insira sua chave da API',
+      keyFrom: 'Obtenha sua chave da SerpAPI na p谩gina da conta da SerpAPI',
+    },
+  },
+  apiBasedExtension: {
+    title: 'As extens玫es de API fornecem gerenciamento centralizado de API, simplificando a configura莽茫o para uso f谩cil em todos os aplicativos da Dify.',
+    link: 'Saiba como desenvolver sua pr贸pria Extens茫o de API.',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: 'Adicionar Extens茫o de API',
+    selector: {
+      title: 'Extens茫o de API',
+      placeholder: 'Por favor, selecione a extens茫o de API',
+      manage: 'Gerenciar Extens茫o de API',
+    },
+    modal: {
+      title: 'Adicionar Extens茫o de API',
+      editTitle: 'Editar Extens茫o de API',
+      name: {
+        title: 'Nome',
+        placeholder: 'Por favor, insira o nome',
+      },
+      apiEndpoint: {
+        title: 'Endpoint da API',
+        placeholder: 'Por favor, insira o endpoint da API',
+      },
+      apiKey: {
+        title: 'Chave da API',
+        placeholder: 'Por favor, insira a chave da API',
+        lengthError: 'O comprimento da chave da API n茫o pode ser inferior a 5 caracteres',
+      },
+    },
+    type: 'Tipo',
+  },
+  about: {
+    changeLog: 'Registro de Altera莽玫es',
+    updateNow: 'Atualizar agora',
+    nowAvailable: 'Dify {{version}} j谩 est谩 dispon铆vel.',
+    latestAvailable: 'Dify {{version}} 茅 a 煤ltima vers茫o dispon铆vel.',
+  },
+  appMenus: {
+    overview: 'Monitoramento',
+    promptEng: 'Orquestrar',
+    apiAccess: 'Acesso 脿 API',
+    logAndAnn: 'Logs e An煤ncios',
+    logs: 'Logs',
+  },
+  environment: {
+    testing: 'TESTE',
+    development: 'DESENVOLVIMENTO',
+  },
+  appModes: {
+    completionApp: 'Gerador de Texto',
+    chatApp: 'Aplicativo de Bate-papo',
+  },
+  datasetMenus: {
+    documents: 'Documentos',
+    hitTesting: 'Teste de Recupera莽茫o',
+    settings: 'Configura莽玫es',
+    emptyTip: 'O Conhecimento n茫o foi associado, por favor, v谩 para o aplicativo ou plug-in para completar a associa莽茫o.',
+    viewDoc: 'Ver documenta莽茫o',
+    relatedApp: 'aplicativos relacionados',
+    noRelatedApp: 'Nenhum aplicativo vinculado',
+  },
+  voiceInput: {
+    speaking: 'Fale agora...',
+    converting: 'Convertendo para texto...',
+    notAllow: 'microfone n茫o autorizado',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Texto-Davinci-003',
+    'text-embedding-ada-002': 'Texto-Embutimento-Ada-002',
+    'whisper-1': 'Sussurro-1',
+    'claude-instant-1': 'Claude-Instant芒neo',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: 'Renomear Conversa',
+    conversationName: 'Nome da conversa',
+    conversationNamePlaceholder: 'Por favor, insira o nome da conversa',
+    conversationNameCanNotEmpty: 'Nome da conversa obrigat贸rio',
+    citation: {
+      title: 'CITA脟脮ES',
+      linkToDataset: 'Link para Conhecimento',
+      characters: 'Personagens:',
+      hitCount: 'Contagem de recupera莽茫o:',
+      vectorHash: 'Hash de vetor:',
+      hitScore: 'Pontua莽茫o de recupera莽茫o:',
+    },
+    inputPlaceholder: 'Fale com o bot',
+    thinking: 'Pensante...',
+    thought: 'Pensamento',
+    resend: 'Reenviar',
+  },
+  promptEditor: {
+    placeholder: 'Escreva sua palavra de incentivo aqui, digite \'{\' para inserir uma vari谩vel, digite \'/\' para inserir um bloco de conte煤do de incentivo',
+    context: {
+      item: {
+        title: 'Contexto',
+        desc: 'Inserir modelo de contexto',
+      },
+      modal: {
+        title: '{{num}} Conhecimentos no Contexto',
+        add: 'Adicionar Contexto',
+        footer: 'Voc锚 pode gerenciar contextos na se莽茫o Contexto abaixo.',
+      },
+    },
+    history: {
+      item: {
+        title: 'Hist贸rico de Conversas',
+        desc: 'Inserir modelo de mensagem hist贸rica',
+      },
+      modal: {
+        title: 'EXEMPLO',
+        user: 'Ol谩',
+        assistant: 'Ol谩! Como posso ajudar hoje?',
+        edit: 'Editar Nomes de Fun莽茫o da Conversa',
+      },
+    },
+    variable: {
+      item: {
+        title: 'Vari谩veis e Ferramentas Externas',
+        desc: 'Inserir Vari谩veis e Ferramentas Externas',
+      },
+      outputToolDisabledItem: {
+        title: 'Vari谩veis',
+        desc: 'Inserir vari谩veis',
+      },
+      modal: {
+        add: 'Nova vari谩vel',
+        addTool: 'Nova ferramenta',
+      },
+    },
+    query: {
+      item: {
+        title: 'Consulta',
+        desc: 'Inserir modelo de consulta do usu谩rio',
+      },
+    },
+    existed: 'J谩 existe no incentivo',
+  },
+  imageUploader: {
+    uploadFromComputer: 'Enviar do Computador',
+    uploadFromComputerReadError: 'Falha ao ler a imagem, por favor, tente novamente.',
+    uploadFromComputerUploadError: 'Falha ao enviar a imagem, por favor, envie novamente.',
+    uploadFromComputerLimit: 'As imagens enviadas n茫o podem exceder {{size}} MB',
+    pasteImageLink: 'Colar link da imagem',
+    pasteImageLinkInputPlaceholder: 'Cole o link da imagem aqui',
+    pasteImageLinkInvalid: 'Link da imagem inv谩lido',
+    imageUpload: 'Enviar Imagem',
+  },
+  tag: {
+    placeholder: 'Todas as tags',
+    addNew: 'Adicionar nova tag',
+    noTag: 'Sem tags',
+    noTagYet: 'Nenhuma tag ainda',
+    addTag: 'adicionar etiqueta',
+    editTag: 'Editar tags',
+    manageTags: 'Gerenciar tags',
+    selectorPlaceholder: 'Digite para pesquisar ou criar',
+    create: 'Criar',
+    delete: 'Excluir etiqueta',
+    deleteTip: 'A tag est谩 sendo usada, exclu铆-la?',
+    created: 'Tag criada com sucesso',
+    failed: 'Falha na cria莽茫o da tag',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 茅 obrigat贸rio',
+    urlError: 'URL deve come莽ar com http:// ou https://',
+  },
+  fileUploader: {
+    uploadFromComputer: 'Upload local',
+    pasteFileLink: 'Colar link do arquivo',
+    pasteFileLinkInputPlaceholder: 'Digite o URL...',
+    pasteFileLinkInvalid: 'Link de arquivo inv谩lido',
+    fileExtensionNotSupport: 'Extens茫o de arquivo n茫o suportada',
+    uploadFromComputerReadError: 'Falha na leitura do arquivo, tente novamente.',
+    uploadFromComputerLimit: 'Carregar arquivo n茫o pode exceder {{size}}',
+    uploadFromComputerUploadError: 'Falha no upload do arquivo, fa莽a o upload novamente.',
+  },
+  license: {
+    expiring: 'Expirando em um dia',
+    expiring_plural: 'Expirando em {{count}} dias',
+  },
+  pagination: {
+    perPage: 'Itens por p谩gina',
+  },
+  theme: {
+    light: 'luz',
+    dark: 'escuro',
+    theme: 'Tema',
+    auto: 'sistema',
+  },
+  compliance: {
+    soc2Type1: 'Relat贸rio SOC 2 Tipo I',
+    sandboxUpgradeTooltip: 'Apenas dispon铆vel com um plano Profissional ou de Equipe.',
+    soc2Type2: 'Relat贸rio SOC 2 Tipo II',
+    professionalUpgradeTooltip: 'Apenas dispon铆vel com um plano Team ou superior.',
+    gdpr: 'GDPR DPA',
+    iso27001: 'Certifica莽茫o ISO 27001:2022',
+  },
+  imageInput: {
+    dropImageHere: 'Arraste sua imagem aqui, ou',
+    supportedFormats: 'Suporta PNG, JPG, JPEG, WEBP e GIF',
+    browse: 'navegar',
+  },
+}
+
+export default translation
diff --git a/i18n/pt-BR/custom.ts b/i18n/pt-BR/custom.ts
new file mode 100644
index 0000000..c1c7251
--- /dev/null
+++ b/i18n/pt-BR/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: 'Personaliza莽茫o',
+  upgradeTip: {
+    prefix: 'Atualize seu plano para',
+    suffix: 'personalizar sua marca.',
+    title: 'Atualize seu plano',
+    des: 'Atualize seu plano para personalizar sua marca',
+  },
+  webapp: {
+    title: 'Personalizar marca do WebApp',
+    removeBrand: 'Remover Powered by Dify',
+    changeLogo: 'Alterar Imagem da Marca Powered by',
+    changeLogoTip: 'Formato SVG ou PNG com tamanho m铆nimo de 40x40px',
+  },
+  app: {
+    title: 'Personalizar cabe莽alho do aplicativo',
+    changeLogoTip: 'Formato SVG ou PNG com tamanho m铆nimo de 80x80px',
+  },
+  upload: 'Enviar',
+  uploading: 'Enviando',
+  uploadedFail: 'Falha no envio da imagem, por favor, envie novamente.',
+  change: 'Alterar',
+  apply: 'Aplicar',
+  restore: 'Restaurar Padr玫es',
+  customize: {
+    contactUs: ' entre em contato conosco ',
+    prefix: 'Para personalizar o logotipo da marca dentro do aplicativo, por favor',
+    suffix: 'para fazer upgrade para a edi莽茫o Enterprise.',
+  },
+}
+
+export default translation
diff --git a/i18n/pt-BR/dataset-creation.ts b/i18n/pt-BR/dataset-creation.ts
new file mode 100644
index 0000000..9023d1a
--- /dev/null
+++ b/i18n/pt-BR/dataset-creation.ts
@@ -0,0 +1,218 @@
+const translation = {
+  steps: {
+    header: {
+      creation: 'Criar Conhecimento',
+      update: 'Adicionar dados',
+      fallbackRoute: 'Conhecimento',
+    },
+    one: 'Escolher fonte de dados',
+    two: 'Pr茅-processamento e Limpeza de Texto',
+    three: 'Executar e finalizar',
+  },
+  error: {
+    unavailable: 'Este Conhecimento n茫o est谩 dispon铆vel',
+  },
+  stepOne: {
+    filePreview: 'Visualiza莽茫o do arquivo',
+    pagePreview: 'Visualiza莽茫o da p谩gina',
+    dataSourceType: {
+      file: 'Importar de arquivo de texto',
+      notion: 'Sincronizar do Notion',
+      web: 'Sincronizar de site',
+    },
+    uploader: {
+      title: 'Enviar arquivo de texto',
+      button: 'Arraste e solte arquivos ou pastas, ou',
+      browse: 'Navegar',
+      tip: 'Suporta {{supportTypes}}. M谩ximo de {{size}}MB cada.',
+      validation: {
+        typeError: 'Tipo de arquivo n茫o suportado',
+        size: 'Arquivo muito grande. M谩ximo 茅 {{size}}MB',
+        count: 'V谩rios arquivos n茫o suportados',
+        filesNumber: 'Limite de upload em massa {{filesNumber}}.',
+      },
+      cancel: 'Cancelar',
+      change: 'Alterar',
+      failed: 'Falha no envio',
+    },
+    notionSyncTitle: 'Notion n茫o est谩 conectado',
+    notionSyncTip: 'Para sincronizar com o Notion, a conex茫o com o Notion deve ser estabelecida primeiro.',
+    connect: 'Ir para conex茫o',
+    button: 'Pr贸ximo',
+    emptyDatasetCreation: 'Quero criar um Conhecimento vazio',
+    modal: {
+      title: 'Criar um Conhecimento vazio',
+      tip: 'Um Conhecimento vazio n茫o conter谩 documentos e voc锚 poder谩 fazer upload de documentos a qualquer momento.',
+      input: 'Nome do Conhecimento',
+      placeholder: 'Por favor, insira',
+      nameNotEmpty: 'O nome n茫o pode estar vazio',
+      nameLengthInvalid: 'O nome deve ter entre 1 e 40 caracteres',
+      cancelButton: 'Cancelar',
+      confirmButton: 'Criar',
+      failed: 'Falha na cria莽茫o',
+    },
+    website: {
+      fireCrawlNotConfiguredDescription: 'Configure o Firecrawl com a chave de API para us谩-lo.',
+      run: 'Correr',
+      unknownError: 'Erro desconhecido',
+      crawlSubPage: 'Rastrear subp谩ginas',
+      selectAll: 'Selecionar tudo',
+      resetAll: 'Redefinir tudo',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      includeOnlyPaths: 'Incluir apenas caminhos',
+      configure: 'Configurar',
+      limit: 'Limite',
+      firecrawlDoc: 'Documentos do Firecrawl',
+      preview: 'Visualizar',
+      options: 'Op莽玫es',
+      scrapTimeInfo: 'P谩ginas {{total}} raspadas no total dentro de {{time}}s',
+      exceptionErrorTitle: 'Ocorreu uma exce莽茫o durante a execu莽茫o do trabalho Firecrawl:',
+      fireCrawlNotConfigured: 'O Firecrawl n茫o est谩 configurado',
+      maxDepthTooltip: 'Profundidade m谩xima para rastrear em rela莽茫o ao URL inserido. A profundidade 0 apenas raspa a p谩gina do url inserido, a profundidade 1 raspa o url e tudo depois de inseridoURL + um / e assim por diante.',
+      firecrawlTitle: 'Extraia conte煤do da web com 馃敟Firecrawl',
+      maxDepth: 'Profundidade m谩xima',
+      totalPageScraped: 'Total de p谩ginas raspadas:',
+      excludePaths: 'Excluir caminhos',
+      extractOnlyMainContent: 'Extraia apenas o conte煤do principal (sem cabe莽alhos, navs, rodap茅s, etc.)',
+      jinaReaderNotConfiguredDescription: 'Configure o Jina Reader inserindo sua chave de API gratuita para acesso.',
+      jinaReaderDoc: 'Saiba mais sobre o Jina Reader',
+      chooseProvider: 'Selecione um provedor',
+      jinaReaderNotConfigured: 'Jina Reader n茫o est谩 configurado',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      useSitemap: 'Usar o mapa do site',
+      useSitemapTooltip: 'Siga o mapa do site para rastrear o site. Caso contr谩rio, o Jina Reader rastrear谩 iterativamente com base na relev芒ncia da p谩gina, produzindo menos p谩ginas, mas de maior qualidade.',
+      jinaReaderTitle: 'Converter todo o site em Markdown',
+      watercrawlTitle: 'Extrair conte煤do da web com o Watercrawl',
+      configureFirecrawl: 'Configurar o Firecrawl',
+      configureJinaReader: 'Configurar o Leitor Jina',
+      waterCrawlNotConfigured: 'Watercrawl n茫o est谩 configurado',
+      waterCrawlNotConfiguredDescription: 'Configure o Watercrawl com a chave da API para us谩-lo.',
+      watercrawlDocLink: 'https://docs.dify.ai/pt/guias/base-de-conhecimentos/criar-conhecimento-e-enviar-documentos/importar-dados-de-conteudo/sincronizar-a-partir-do-site',
+      watercrawlDoc: 'Documentos do Watercrawl',
+      configureWatercrawl: 'Configurar Watercrawl',
+    },
+    cancel: 'Cancelar',
+  },
+  stepTwo: {
+    segmentation: 'Configura莽玫es de fragmenta莽茫o',
+    auto: 'Autom谩tico',
+    autoDescription: 'Configura automaticamente as regras de fragmenta莽茫o e pr茅-processamento. Usu谩rios n茫o familiarizados s茫o recomendados a selecionar esta op莽茫o.',
+    custom: 'Personalizado',
+    customDescription: 'Personalize as regras de fragmenta莽茫o, comprimento dos fragmentos e regras de pr茅-processamento, etc.',
+    separator: 'Identificador de segmento',
+    separatorPlaceholder: 'Por exemplo, nova linha (\\\\n) ou separador especial (como "***")',
+    maxLength: 'Comprimento m谩ximo do fragmento',
+    overlap: 'Sobreposi莽茫o de blocos',
+    overlapTip: 'Configurar a sobreposi莽茫o de blocos pode manter a relev芒ncia sem芒ntica entre eles, melhorando o efeito de recupera莽茫o. 脡 recomendado definir de 10% a 25% do tamanho m谩ximo do bloco.',
+    overlapCheck: 'a sobreposi莽茫o de blocos n茫o deve ser maior que o comprimento m谩ximo do bloco',
+    rules: 'Regras de pr茅-processamento de texto',
+    removeExtraSpaces: 'Substituir espa莽os consecutivos, quebras de linha e tabula莽玫es',
+    removeUrlEmails: 'Excluir todos os URLs e endere莽os de e-mail',
+    removeStopwords: 'Remover palavras irrelevantes como "um", "uma", "o"',
+    preview: 'Confirmar e visualizar',
+    reset: 'Redefinir',
+    indexMode: 'Modo de 铆ndice',
+    qualified: 'Alta qualidade',
+    recommend: 'Recomendado',
+    qualifiedTip: 'Chama a interface de incorpora莽茫o do sistema padr茫o para processamento, fornecendo maior precis茫o ao consultar.',
+    warning: 'Por favor, configure primeiro a chave da API do provedor do modelo.',
+    click: 'Ir para configura莽玫es',
+    economical: 'Econ么mico',
+    economicalTip: 'Use motores de vetor offline, 铆ndices de palavras-chave, etc. para reduzir a precis茫o sem gastar tokens',
+    QATitle: 'Fragmenta莽茫o no formato de Perguntas e Respostas',
+    QATip: 'Habilitar esta op莽茫o consumir谩 mais tokens',
+    QALanguage: 'Fragmentar usando',
+    estimateCost: 'Estimativa',
+    estimateSegment: 'Fragmentos estimados',
+    segmentCount: 'fragmentos',
+    calculating: 'Calculando...',
+    fileSource: 'Pr茅-processar documentos',
+    notionSource: 'Pr茅-processar p谩ginas',
+    other: 'e outros ',
+    fileUnit: ' arquivos',
+    notionUnit: ' p谩ginas',
+    previousStep: 'Passo anterior',
+    nextStep: 'Salvar e Processar',
+    save: 'Salvar e Processar',
+    cancel: 'Cancelar',
+    sideTipTitle: 'Por que fragmentar e pr茅-processar?',
+    sideTipP1: 'Ao processar dados de texto, fragmentar e limpar s茫o duas etapas importantes de pr茅-processamento.',
+    sideTipP2: 'A fragmenta莽茫o divide um texto longo em par谩grafos para que os modelos possam entender melhor. Isso melhora a qualidade e relev芒ncia dos resultados do modelo.',
+    sideTipP3: 'A limpeza remove caracteres e formatos desnecess谩rios, tornando o Conhecimento mais limpo e f谩cil de analisar.',
+    sideTipP4: 'Fragmenta莽茫o e limpeza adequadas melhoram o desempenho do modelo, fornecendo resultados mais precisos e valiosos.',
+    previewTitle: 'Visualiza莽茫o',
+    previewTitleButton: 'Visualiza莽茫o',
+    previewButton: 'Alternar para visualiza莽茫o no formato de Perguntas e Respostas',
+    previewSwitchTipStart: 'A visualiza莽茫o atual do fragmento est谩 no formato de texto, alternar para uma visualiza莽茫o no formato de Perguntas e Respostas ir谩',
+    previewSwitchTipEnd: ' consumir tokens adicionais',
+    characters: 'caracteres',
+    indexSettingTip: 'Para alterar o m茅todo de 铆ndice, por favor v谩 para as ',
+    retrievalSettingTip: 'Para alterar o m茅todo de 铆ndice, por favor v谩 para as ',
+    datasetSettingLink: 'configura莽玫es do Conhecimento.',
+    websiteSource: 'Site de pr茅-processamento',
+    webpageUnit: 'P谩ginas',
+    separatorTip: 'Um delimitador 茅 o caractere usado para separar o texto. \\n\\n e \\n s茫o delimitadores comumente usados para separar par谩grafos e linhas. Combinado com v铆rgulas (\\n\\n,\\n), os par谩grafos ser茫o segmentados por linhas ao exceder o comprimento m谩ximo do bloco. Voc锚 tamb茅m pode usar delimitadores especiais definidos por voc锚 (por exemplo, ***).',
+    maxLengthCheck: 'O comprimento m谩ximo do chunk deve ser inferior a {{limit}}',
+    parentChildDelimiterTip: 'Um delimitador 茅 o caractere usado para separar o texto. \\n\\n 茅 recomendado para dividir o documento original em grandes partes pai. Voc锚 tamb茅m pode usar delimitadores especiais definidos por voc锚.',
+    parentChildChunkDelimiterTip: 'Um delimitador 茅 o caractere usado para separar o texto. \\n 茅 recomendado para dividir partes pai em pequenas partes filhas. Voc锚 tamb茅m pode usar delimitadores especiais definidos por voc锚.',
+    notAvailableForQA: 'N茫o dispon铆vel para o 脥ndice de P e R',
+    parentChild: 'Pai-filho',
+    general: 'Geral',
+    qaSwitchHighQualityTipTitle: 'O formato de perguntas e respostas requer um m茅todo de indexa莽茫o de alta qualidade',
+    parentChunkForContext: 'Parte-pai para contexto',
+    switch: 'Interruptor',
+    fullDoc: 'Doc completo',
+    qaSwitchHighQualityTipContent: 'Atualmente, apenas o m茅todo de 铆ndice de alta qualidade d谩 suporte ao agrupamento no formato Q&A. Gostaria de mudar para o modo de alta qualidade?',
+    childChunkForRetrieval: 'Filho-peda莽o para recupera莽茫o',
+    useQALanguage: 'Chunk usando o formato de perguntas e respostas em',
+    previewChunk: 'Visualizar parte',
+    notAvailableForParentChild: 'N茫o dispon铆vel para 脥ndice pai-filho',
+    paragraph: 'Par谩grafo',
+    parentChildTip: 'Ao usar o modo pai-filho, o filho-chunk 茅 usado para recupera莽茫o e o pai-chunk 茅 usado para recall como contexto.',
+    generalTip: 'Modo de agrupamento de texto geral, os peda莽os recuperados e recuperados s茫o os mesmos.',
+    highQualityTip: 'Depois de concluir a incorpora莽茫o no modo de alta qualidade, a revers茫o para o modo econ么mico n茫o estar谩 dispon铆vel.',
+    previewChunkTip: 'Clique no bot茫o \'Preview Chunk\' 脿 esquerda para carregar a visualiza莽茫o',
+    fullDocTip: 'O documento inteiro 茅 usado como parte pai e recuperado diretamente. Observe que, por motivos de desempenho, o texto que exceder 10000 tokens ser谩 truncado automaticamente.',
+    paragraphTip: 'Esse modo divide o texto em par谩grafos com base em delimitadores e no comprimento m谩ximo da parte, usando o texto dividido como a parte pai para recupera莽茫o.',
+    previewChunkCount: '{{contagem}} Partes estimadas',
+  },
+  stepThree: {
+    creationTitle: '馃帀 Conhecimento criado',
+    creationContent: 'Nomeamos automaticamente o Conhecimento, voc锚 pode modific谩-lo a qualquer momento',
+    label: 'Nome do Conhecimento',
+    additionTitle: '馃帀 Documento enviado',
+    additionP1: 'O documento foi enviado para o Conhecimento',
+    additionP2: ', voc锚 pode encontr谩-lo na lista de documentos do Conhecimento.',
+    stop: 'Parar processamento',
+    resume: 'Continuar processamento',
+    navTo: 'Ir para documento',
+    sideTipTitle: 'O que fazer em seguida',
+    sideTipContent: 'Ap贸s a conclus茫o da indexa莽茫o do documento, o Conhecimento pode ser integrado 脿 aplica莽茫o como contexto. Voc锚 pode encontrar a configura莽茫o de contexto na p谩gina de orquestra莽茫o de prompts. Voc锚 tamb茅m pode cri谩-lo como um plugin de indexa莽茫o ChatGPT independente para lan莽amento.',
+    modelTitle: 'Tem certeza de que deseja parar a incorpora莽茫o?',
+    modelContent: 'Se voc锚 precisar continuar o processamento posteriormente, voc锚 continuar谩 de onde parou.',
+    modelButtonConfirm: 'Confirmar',
+    modelButtonCancel: 'Cancelar',
+  },
+  firecrawl: {
+    apiKeyPlaceholder: 'Chave de API do firecrawl.dev',
+    configFirecrawl: 'Configurar 馃敟o Firecrawl',
+    getApiKeyLinkText: 'Obtenha sua chave de API do firecrawl.dev',
+  },
+  jinaReader: {
+    getApiKeyLinkText: 'Obtenha sua chave de API gratuita em jina.ai',
+    configJinaReader: 'Configurar o Jina Reader',
+    apiKeyPlaceholder: 'Chave de API do jina.ai',
+  },
+  otherDataSource: {
+    learnMore: 'Saiba Mais',
+    description: 'Atualmente, a base de conhecimento da Dify possui apenas fontes de dados limitadas. Contribuir com uma fonte de dados para a base de conhecimento Dify 茅 uma maneira fant谩stica de ajudar a aumentar a flexibilidade e o poder da plataforma para todos os usu谩rios. Nosso guia de contribui莽茫o facilita o in铆cio. Clique no link abaixo para saber mais.',
+    title: 'Conectar-se a outras fontes de dados?',
+  },
+  watercrawl: {
+    apiKeyPlaceholder: 'Chave da API do watercrawl.dev',
+    configWatercrawl: 'Configurar Watercrawl',
+    getApiKeyLinkText: 'Obtenha sua chave de API em watercrawl.dev',
+  },
+}
+
+export default translation
diff --git a/i18n/pt-BR/dataset-documents.ts b/i18n/pt-BR/dataset-documents.ts
new file mode 100644
index 0000000..9a3d13b
--- /dev/null
+++ b/i18n/pt-BR/dataset-documents.ts
@@ -0,0 +1,395 @@
+const translation = {
+  list: {
+    title: 'Documentos',
+    desc: 'Todos os arquivos do Knowledge s茫o mostrados aqui, e todo o Knowledge pode ser vinculado a cita莽玫es do Dify ou indexado por meio do plugin Chat.',
+    addFile: 'adicionar arquivo',
+    addPages: 'Adicionar P谩ginas',
+    table: {
+      header: {
+        fileName: 'NOME DO ARQUIVO',
+        words: 'PALAVRAS',
+        hitCount: 'CONTAGEM DE RECUPERA脟脙O',
+        uploadTime: 'HORA DO UPLOAD',
+        status: 'STATUS',
+        action: 'A脟脙O',
+        chunkingMode: 'MODO DE FRAGMENTA脟脙O',
+      },
+      name: 'Nome',
+      rename: 'Renomear',
+    },
+    action: {
+      uploadFile: 'Enviar novo arquivo',
+      settings: 'Configura莽玫es de segmento',
+      addButton: 'Adicionar fragmento',
+      add: 'Adicionar um fragmento',
+      batchAdd: 'Adicionar em lote',
+      archive: 'Arquivar',
+      unarchive: 'Desarquivar',
+      delete: 'Excluir',
+      enableWarning: 'O arquivo arquivado n茫o pode ser habilitado',
+      sync: 'Sincronizar',
+    },
+    index: {
+      enable: 'Habilitar',
+      disable: 'Desabilitar',
+      all: 'Todos',
+      enableTip: 'O arquivo pode ser indexado',
+      disableTip: 'O arquivo n茫o pode ser indexado',
+    },
+    status: {
+      queuing: 'Em fila',
+      indexing: 'Indexando',
+      paused: 'Pausado',
+      error: 'Erro',
+      available: 'Dispon铆vel',
+      enabled: 'Habilitado',
+      disabled: 'Desabilitado',
+      archived: 'Arquivado',
+    },
+    empty: {
+      title: 'Ainda n茫o h谩 documenta莽茫o',
+      upload: {
+        tip: 'Voc锚 pode enviar arquivos, sincronizar do site ou de aplicativos da web como Notion, GitHub, etc.',
+      },
+      sync: {
+        tip: 'O Dify baixar谩 periodicamente arquivos do seu Notion e concluir谩 o processamento.',
+      },
+    },
+    delete: {
+      title: 'Tem certeza que deseja excluir?',
+      content: 'Se voc锚 precisar retomar o processamento posteriormente, continuar谩 de onde parou',
+    },
+    batchModal: {
+      title: 'Adicionar fragmentos em lote',
+      csvUploadTitle: 'Arraste e solte seu arquivo CSV aqui ou ',
+      browse: 'navegar',
+      tip: 'O arquivo CSV deve seguir a seguinte estrutura:',
+      question: 'pergunta',
+      answer: 'resposta',
+      contentTitle: 'conte煤do do fragmento',
+      content: 'conte煤do',
+      template: 'Baixe o modelo aqui',
+      cancel: 'Cancelar',
+      run: 'Executar em lote',
+      runError: 'Falha ao executar em lote',
+      processing: 'Processando em lote',
+      completed: 'Importa莽茫o conclu铆da',
+      error: 'Erro na importa莽茫o',
+      ok: 'OK',
+    },
+    addUrl: 'Adicionar URL',
+    learnMore: 'Saiba Mais',
+  },
+  metadata: {
+    title: 'Metadados',
+    desc: 'A rotulagem de metadados para documentos permite que a IA acesse-os de maneira oportuna e exp玫e a fonte de refer锚ncias para os usu谩rios.',
+    dateTimeFormat: 'D MMMM, YYYY hh:mm A',
+    docTypeSelectTitle: 'Selecione um tipo de documento',
+    docTypeChangeTitle: 'Alterar tipo de documento',
+    docTypeSelectWarning:
+      'Se o tipo de documento for alterado, os metadados preenchidos agora n茫o ser茫o mais preservados',
+    firstMetaAction: 'Vamos l谩',
+    placeholder: {
+      add: 'Adicionar ',
+      select: 'Selecionar ',
+    },
+    source: {
+      upload_file: 'Enviar arquivo',
+      notion: 'Sincronizar do Notion',
+      github: 'Sincronizar do Github',
+    },
+    type: {
+      book: 'Livro',
+      webPage: 'P谩gina da Web',
+      paper: 'Artigo',
+      socialMediaPost: 'Postagem em M铆dias Sociais',
+      personalDocument: 'Documento Pessoal',
+      businessDocument: 'Documento Empresarial',
+      IMChat: 'Chat de IM',
+      wikipediaEntry: 'Entrada da Wikipedia',
+      notion: 'Sincronizar do Notion',
+      github: 'Sincronizar do Github',
+      technicalParameters: 'Par芒metros T茅cnicos',
+    },
+    field: {
+      processRule: {
+        processDoc: 'Processar Documento',
+        segmentRule: 'Regra de Fragmenta莽茫o',
+        segmentLength: 'Comprimento dos Fragmentos',
+        processClean: 'Limpeza de Texto',
+      },
+      book: {
+        title: 'T铆tulo',
+        language: 'Idioma',
+        author: 'Autor',
+        publisher: 'Editora',
+        publicationDate: 'Data de Publica莽茫o',
+        ISBN: 'ISBN',
+        category: 'Categoria',
+      },
+      webPage: {
+        title: 'T铆tulo',
+        url: 'URL',
+        language: 'Idioma',
+        authorPublisher: 'Autor/Editor',
+        publishDate: 'Data de Publica莽茫o',
+        topicKeywords: 'T贸picos/Palavras-chave',
+        description: 'Descri莽茫o',
+      },
+      paper: {
+        title: 'T铆tulo',
+        language: 'Idioma',
+        author: 'Autor',
+        publishDate: 'Data de Publica莽茫o',
+        journalConferenceName: 'Nome do Jornal/Confer锚ncia',
+        volumeIssuePage: 'Volume/Edi莽茫o/P谩gina',
+        DOI: 'DOI',
+        topicsKeywords: 'T贸picos/Palavras-chave',
+        abstract: 'Resumo',
+      },
+      socialMediaPost: {
+        platform: 'Plataforma',
+        authorUsername: 'Autor/Nome de Usu谩rio',
+        publishDate: 'Data de Publica莽茫o',
+        postURL: 'URL da Postagem',
+        topicsTags: 'T贸picos/Tags',
+      },
+      personalDocument: {
+        title: 'T铆tulo',
+        author: 'Autor',
+        creationDate: 'Data de Cria莽茫o',
+        lastModifiedDate: 'Data da 脷ltima Modifica莽茫o',
+        documentType: 'Tipo de Documento',
+        tagsCategory: 'Tags/Categoria',
+      },
+      businessDocument: {
+        title: 'T铆tulo',
+        author: 'Autor',
+        creationDate: 'Data de Cria莽茫o',
+        lastModifiedDate: 'Data da 脷ltima Modifica莽茫o',
+        documentType: 'Tipo de Documento',
+        departmentTeam: 'Departamento/Equipe',
+      },
+      IMChat: {
+        chatPlatform: 'Plataforma de Chat',
+        chatPartiesGroupName: 'Partes/Grupo do Chat',
+        participants: 'Participantes',
+        startDate: 'Data de In铆cio',
+        endDate: 'Data de T茅rmino',
+        topicsKeywords: 'T贸picos/Palavras-chave',
+        fileType: 'Tipo de Arquivo',
+      },
+      wikipediaEntry: {
+        title: 'T铆tulo',
+        language: 'Idioma',
+        webpageURL: 'URL da P谩gina da Web',
+        editorContributor: 'Editor/Contribuidor',
+        lastEditDate: 'Data da 脷ltima Edi莽茫o',
+        summaryIntroduction: 'Resumo/Introdu莽茫o',
+      },
+      notion: {
+        title: 'T铆tulo',
+        language: 'Idioma',
+        author: 'Autor',
+        createdTime: 'Data de Cria莽茫o',
+        lastModifiedTime: 'Data da 脷ltima Modifica莽茫o',
+        url: 'URL',
+        tag: 'Tag',
+        description: 'Descri莽茫o',
+      },
+      github: {
+        repoName: 'Nome do Reposit贸rio',
+        repoDesc: 'Descri莽茫o do Reposit贸rio',
+        repoOwner: 'Propriet谩rio do Reposit贸rio',
+        fileName: 'Nome do Arquivo',
+        filePath: 'Caminho do Arquivo',
+        programmingLang: 'Linguagem de Programa莽茫o',
+        url: 'URL',
+        license: 'Licen莽a',
+        lastCommitTime: 'Data do 脷ltimo Commit',
+        lastCommitAuthor: 'Autor do 脷ltimo Commit',
+      },
+      originInfo: {
+        originalFilename: 'Nome do arquivo original',
+        originalFileSize: 'Tamanho do arquivo original',
+        uploadDate: 'Data de envio',
+        lastUpdateDate: 'Data da 煤ltima atualiza莽茫o',
+        source: 'Fonte',
+      },
+      technicalParameters: {
+        segmentSpecification: 'Especifica莽茫o dos fragmentos',
+        segmentLength: 'Comprimento dos fragmentos',
+        avgParagraphLength: 'Comprimento m茅dio do par谩grafo',
+        paragraphs: 'Par谩grafos',
+        hitCount: 'Contagem de recupera莽茫o',
+        embeddingTime: 'Tempo de incorpora莽茫o',
+        embeddedSpend: 'Tempo gasto na incorpora莽茫o',
+      },
+    },
+    languageMap: {
+      zh: 'Chin锚s',
+      en: 'Ingl锚s',
+      es: 'Espanhol',
+      fr: 'Franc锚s',
+      de: 'Alem茫o',
+      ja: 'Japon锚s',
+      ko: 'Coreano',
+      ru: 'Russo',
+      ar: '脕rabe',
+      pt: 'Portugu锚s',
+      it: 'Italiano',
+      nl: 'Holand锚s',
+      pl: 'Polon锚s',
+      sv: 'Sueco',
+      tr: 'Turco',
+      he: 'Hebraico',
+      hi: 'Hindi',
+      da: 'Dinamarqu锚s',
+      fi: 'Finland锚s',
+      no: 'Noruegu锚s',
+      hu: 'H煤ngaro',
+      el: 'Grego',
+      cs: 'Tcheco',
+      th: 'Tailand锚s',
+      id: 'Indon茅sio',
+    },
+    categoryMap: {
+      book: {
+        fiction: 'Fic莽茫o',
+        biography: 'Biografia',
+        history: 'Hist贸ria',
+        science: 'Ci锚ncia',
+        technology: 'Tecnologia',
+        education: 'Educa莽茫o',
+        philosophy: 'Filosofia',
+        religion: 'Religi茫o',
+        socialSciences: 'Ci锚ncias Sociais',
+        art: 'Arte',
+        travel: 'Viagem',
+        health: 'Sa煤de',
+        selfHelp: 'Autoajuda',
+        businessEconomics: 'Neg贸cios/Economia',
+        cooking: 'Culin谩ria',
+        childrenYoungAdults: 'Crian莽as/Jovens Adultos',
+        comicsGraphicNovels: 'Quadrinhos/Graphic Novels',
+        poetry: 'Poesia',
+        drama: 'Drama',
+        other: 'Outro',
+      },
+      personalDoc: {
+        notes: 'Notas',
+        blogDraft: 'Rascunho de Blog',
+        diary: 'Di谩rio',
+        researchReport: 'Relat贸rio de Pesquisa',
+        bookExcerpt: 'Trecho de Livro',
+        schedule: 'Agenda',
+        list: 'Lista',
+        projectOverview: 'Vis茫o Geral do Projeto',
+        photoCollection: 'Cole莽茫o de Fotos',
+        creativeWriting: 'Escrita Criativa',
+        codeSnippet: 'Trecho de C贸digo',
+        designDraft: 'Rascunho de Design',
+        personalResume: 'Curr铆culo Pessoal',
+        other: 'Outro',
+      },
+      businessDoc: {
+        meetingMinutes: 'Minutos de Reuni茫o',
+        researchReport: 'Relat贸rio de Pesquisa',
+        proposal: 'Proposta',
+        employeeHandbook: 'Manual do Funcion谩rio',
+        trainingMaterials: 'Materiais de Treinamento',
+        requirementsDocument: 'Documento de Requisitos',
+        designDocument: 'Documento de Design',
+        productSpecification: 'Especifica莽茫o do Produto',
+        financialReport: 'Relat贸rio Financeiro',
+        marketAnalysis: 'An谩lise de Mercado',
+        projectPlan: 'Plano de Projeto',
+        teamStructure: 'Estrutura da Equipe',
+        policiesProcedures: 'Pol铆ticas e Procedimentos',
+        contractsAgreements: 'Contratos e Acordos',
+        emailCorrespondence: 'Correspond锚ncia por E-mail',
+        other: 'Outro',
+      },
+    },
+  },
+  embedding: {
+    processing: 'Processando incorpora莽茫o...',
+    paused: 'Incorpora莽茫o pausada',
+    completed: 'Incorpora莽茫o conclu铆da',
+    error: 'Erro na incorpora莽茫o',
+    docName: 'Pr茅-processamento do documento',
+    mode: 'Regra de segmenta莽茫o',
+    segmentLength: 'Comprimento dos fragmentos',
+    textCleaning: 'Defini莽茫o pr茅via e limpeza de texto',
+    segments: 'Par谩grafos',
+    highQuality: 'Modo de alta qualidade',
+    economy: 'Modo econ么mico',
+    estimate: 'Consumo estimado',
+    stop: 'Parar processamento',
+    resume: 'Retomar processamento',
+    automatic: 'Autom谩tico',
+    custom: 'Personalizado',
+    previewTip: 'A visualiza莽茫o do par谩grafo estar谩 dispon铆vel ap贸s a incorpora莽茫o ser conclu铆da',
+    pause: 'Pausa',
+    hierarchical: 'Pai-filho',
+    parentMaxTokens: 'Pai',
+    childMaxTokens: 'Crian莽a',
+  },
+  segment: {
+    paragraphs: 'Par谩grafos',
+    keywords: 'Palavras-chave',
+    addKeyWord: 'Adicionar palavra-chave',
+    keywordError: 'O comprimento m谩ximo da palavra-chave 茅 20',
+    characters: 'caracteres',
+    hitCount: 'Contagem de recupera莽茫o',
+    vectorHash: 'Hash do vetor: ',
+    questionPlaceholder: 'adicionar pergunta aqui',
+    questionEmpty: 'A pergunta n茫o pode estar vazia',
+    answerPlaceholder: 'adicionar resposta aqui',
+    answerEmpty: 'A resposta n茫o pode estar vazia',
+    contentPlaceholder: 'adicionar conte煤do aqui',
+    contentEmpty: 'O conte煤do n茫o pode estar vazio',
+    newTextSegment: 'Novo fragmento de texto',
+    newQaSegment: 'Novo fragmento de P&R',
+    delete: 'Excluir este fragmento?',
+    chunks_other: 'PEDA脟OS',
+    parentChunks_other: 'PARTES PAI',
+    childChunks_one: 'PEDA脟O FILHO',
+    searchResults_zero: 'RESULTADO',
+    searchResults_one: 'RESULTADO',
+    searchResults_other: 'RESULTADOS',
+    empty: 'Nenhum peda莽o encontrado',
+    chunk: 'Peda莽o',
+    newChunk: 'Novo peda莽o',
+    childChunk: 'Peda莽o filho',
+    characters_other: 'Caracteres',
+    addChunk: 'Adicionar peda莽o',
+    addChildChunk: 'Adicionar peda莽o filho',
+    addAnother: 'Adicionar outro',
+    editChunk: 'Editar Chunk',
+    editParentChunk: 'Editar parte pai',
+    editChildChunk: 'Editar parte filho',
+    regenerationConfirmTitle: 'Deseja regenerar partes filhas?',
+    regeneratingTitle: 'Regenerando partes filhas',
+    regeneratingMessage: 'Isso pode demorar um pouco, por favor aguarde...',
+    edited: 'EDI脟脙O',
+    editedAt: 'Editado em',
+    expandChunks: 'Expandir peda莽os',
+    collapseChunks: 'Recolher partes',
+    regenerationConfirmMessage: 'A regenera莽茫o de partes filhas substituir谩 as partes filhas atuais, incluindo partes editadas e partes rec茅m-adicionadas. A regenera莽茫o n茫o pode ser desfeita.',
+    parentChunks_one: 'PEDA脟O PAI',
+    regenerationSuccessMessage: 'Voc锚 pode fechar esta janela.',
+    chunks_one: 'PEDA脟O',
+    childChunkAdded: '1 peda莽o filho adicionado',
+    clearFilter: 'Limpar filtro',
+    regenerationSuccessTitle: 'Regenera莽茫o conclu铆da',
+    chunkDetail: 'Detalhe do peda莽o',
+    childChunks_other: 'PEDA脟OS FILHOS',
+    chunkAdded: '1 peda莽o adicionado',
+    newChildChunk: 'Novo peda莽o filho',
+    characters_one: 'personagem',
+    parentChunk: 'Peda莽o pai',
+  },
+}
+
+export default translation
diff --git a/i18n/pt-BR/dataset-hit-testing.ts b/i18n/pt-BR/dataset-hit-testing.ts
new file mode 100644
index 0000000..61ab4f3
--- /dev/null
+++ b/i18n/pt-BR/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: 'Teste de Recupera莽茫o',
+  desc: 'Teste o efeito de recupera莽茫o do conhecimento com base no texto de consulta fornecido.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  recents: 'Recentes',
+  table: {
+    header: {
+      source: 'Origem',
+      text: 'Texto',
+      time: 'Hora',
+    },
+  },
+  input: {
+    title: 'Texto de origem',
+    placeholder: 'Digite um texto, uma frase declarativa curta 茅 recomendada.',
+    countWarning: 'At茅 200 caracteres.',
+    indexWarning: 'Somente conhecimento de alta qualidade.',
+    testing: 'Testando',
+  },
+  hit: {
+    title: 'PAR脕GRAFOS DE RECUPERA脟脙O',
+    emptyTip: 'Os resultados do teste de recupera莽茫o ser茫o exibidos aqui',
+  },
+  noRecentTip: 'Nenhum resultado de consulta recente aqui',
+  viewChart: 'Ver GR脕FICO DE VETORES',
+  viewDetail: 'Ver detalhes',
+  settingTitle: 'Configura莽茫o de recupera莽茫o',
+  records: 'Arquivo',
+  hitChunks: 'Hit {{num}} peda莽os filhos',
+  open: 'Abrir',
+  chunkDetail: 'Detalhe do peda莽o',
+  keyword: 'Palavras-chave',
+}
+
+export default translation
diff --git a/i18n/pt-BR/dataset-settings.ts b/i18n/pt-BR/dataset-settings.ts
new file mode 100644
index 0000000..e959fa0
--- /dev/null
+++ b/i18n/pt-BR/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: 'Configura莽玫es do conhecimento',
+  desc: 'Aqui voc锚 pode modificar as propriedades e m茅todos de trabalho do conhecimento.',
+  form: {
+    name: 'Nome do conhecimento',
+    namePlaceholder: 'Por favor, insira o nome do conhecimento',
+    nameError: 'O nome n茫o pode estar vazio',
+    desc: 'Descri莽茫o do conhecimento',
+    descInfo: 'Por favor, escreva uma descri莽茫o textual clara para delinear o conte煤do do conhecimento. Esta descri莽茫o ser谩 usada como base para a correspond锚ncia ao selecionar entre v谩rios conhecimentos para infer锚ncia.',
+    descPlaceholder: 'Descreva o que est谩 neste conhecimento. Uma descri莽茫o detalhada permite que a IA acesse o conte煤do do conhecimento de forma oportuna. Se estiver vazio, o Dify usar谩 a estrat茅gia de correspond锚ncia padr茫o.',
+    descWrite: 'Aprenda como escrever uma boa descri莽茫o do conhecimento.',
+    permissions: 'Permiss玫es',
+    permissionsOnlyMe: 'Apenas eu',
+    permissionsAllMember: 'Todos os membros da equipe',
+    indexMethod: 'M茅todo de indexa莽茫o',
+    indexMethodHighQuality: 'Alta qualidade',
+    indexMethodHighQualityTip: 'Invocar o modelo de Embedding para processamento para fornecer maior precis茫o nas consultas dos usu谩rios.',
+    indexMethodEconomy: 'Econ么mico',
+    indexMethodEconomyTip: 'Use motores de vetor offline, 铆ndices de palavras-chave, etc. para reduzir a precis茫o sem gastar tokens.',
+    embeddingModel: 'Modelo de incorpora莽茫o',
+    embeddingModelTip: 'Altere o modelo incorporado, por favor, v谩 para ',
+    embeddingModelTipLink: 'Configura莽玫es',
+    retrievalSetting: {
+      title: 'Configura莽茫o de recupera莽茫o',
+      learnMore: 'Saiba mais',
+      description: ' sobre o m茅todo de recupera莽茫o.',
+      longDescription: ' sobre o m茅todo de recupera莽茫o, voc锚 pode alterar isso a qualquer momento nas configura莽玫es do conhecimento.',
+      method: 'M茅todo de Recupera莽茫o',
+    },
+    save: 'Salvar',
+    permissionsInvitedMembers: 'Membros parciais da equipe',
+    me: '(Voc锚)',
+    retrievalSettings: 'Configura莽玫es de recupera莽茫o',
+    externalKnowledgeID: 'ID de conhecimento externo',
+    externalKnowledgeAPI: 'API de conhecimento externo',
+    indexMethodChangeToEconomyDisabledTip: 'N茫o dispon铆vel para rebaixamento de HQ para ECO',
+    helpText: 'Aprenda a escrever uma boa descri莽茫o do conjunto de dados.',
+    upgradeHighQualityTip: 'Depois de atualizar para o modo de alta qualidade, reverter para o modo econ么mico n茫o est谩 dispon铆vel',
+    searchModel: 'Pesquisar modelo',
+  },
+}
+
+export default translation
diff --git a/i18n/pt-BR/dataset.ts b/i18n/pt-BR/dataset.ts
new file mode 100644
index 0000000..7d5f75a
--- /dev/null
+++ b/i18n/pt-BR/dataset.ts
@@ -0,0 +1,221 @@
+const translation = {
+  knowledge: 'Wiedza',
+  documentCount: ' documentos',
+  wordCount: ' k palavras',
+  appCount: ' aplicativos vinculados',
+  createDataset: 'Criar Conhecimento',
+  createDatasetIntro: 'Importe seus pr贸prios dados de texto ou escreva dados em tempo real via Webhook para aprimoramento de contexto LLM.',
+  deleteDatasetConfirmTitle: 'Excluir este Conhecimento?',
+  deleteDatasetConfirmContent:
+    'A exclus茫o do Conhecimento 茅 irrevers铆vel. Os usu谩rios n茫o poder茫o mais acessar seu Conhecimento e todas as configura莽玫es e registros de prompt ser茫o exclu铆dos permanentemente.',
+  datasetUsedByApp: 'O conhecimento est谩 sendo usado por alguns aplicativos. Os aplicativos n茫o poder茫o mais usar esse Conhecimento, e todas as configura莽玫es de prompt e logs ser茫o exclu铆dos permanentemente.',
+  datasetDeleted: 'Conhecimento exclu铆do',
+  datasetDeleteFailed: 'Falha ao excluir o Conhecimento',
+  didYouKnow: 'Voc锚 sabia?',
+  intro1: 'O Conhecimento pode ser integrado ao aplicativo Dify ',
+  intro2: 'como um contexto',
+  intro3: ',',
+  intro4: 'ou pode ser criado',
+  intro5: ' como um plug-in de 铆ndice ChatGPT independente para publica莽茫o',
+  unavailable: 'Indispon铆vel',
+  unavailableTip: 'O modelo de incorpora莽茫o n茫o est谩 dispon铆vel, o modelo de incorpora莽茫o padr茫o precisa ser configurado',
+  datasets: 'CONHECIMENTO',
+  datasetsApi: 'API',
+  retrieval: {
+    semantic_search: {
+      title: 'Pesquisa Vetorial',
+      description: 'Gere incorpora莽玫es de consulta e pesquise o trecho de texto mais semelhante 脿 sua representa莽茫o vetorial.',
+    },
+    full_text_search: {
+      title: 'Pesquisa de Texto Completo',
+      description: 'Indexe todos os termos no documento, permitindo que os usu谩rios pesquisem qualquer termo e recuperem trechos de texto relevantes contendo esses termos.',
+    },
+    hybrid_search: {
+      title: 'Pesquisa H铆brida',
+      description: 'Execute pesquisas de texto completo e pesquisas vetoriais simultaneamente, reclassifique para selecionar a melhor correspond锚ncia para a consulta do usu谩rio. A configura莽茫o da API do modelo de reclassifica莽茫o 茅 necess谩ria.',
+      recommend: 'Recomendar',
+    },
+    invertedIndex: {
+      title: '脥ndice Invertido',
+      description: 'O 脥ndice Invertido 茅 uma estrutura usada para recupera莽茫o eficiente. Organizado por termos, cada termo aponta para documentos ou p谩ginas da web que o cont锚m.',
+    },
+    change: 'Alterar',
+    changeRetrievalMethod: 'Alterar m茅todo de recupera莽茫o',
+  },
+  docsFailedNotice: 'documentos falharam ao serem indexados',
+  retry: 'Tentar novamente',
+  indexingTechnique: {
+    high_quality: 'AQ',
+    economy: 'ECO',
+  },
+  indexingMethod: {
+    semantic_search: 'VETOR',
+    full_text_search: 'TEXTO COMPLETO',
+    hybrid_search: 'H脥BRIDO',
+    invertedIndex: 'INVERTIDO',
+  },
+  mixtureHighQualityAndEconomicTip: 'O modelo de reclassifica莽茫o 茅 necess谩rio para a mistura de bases de conhecimento de alta qualidade e econ么micas.',
+  inconsistentEmbeddingModelTip: 'O modelo de reclassifica莽茫o 茅 necess谩rio se os modelos de incorpora莽茫o das bases de conhecimento selecionadas forem inconsistentes.',
+  retrievalSettings: 'Configura莽玫es de Recupera莽茫o',
+  rerankSettings: 'Configura莽玫es de Reclassifica莽茫o',
+  weightedScore: {
+    title: 'Pontua莽茫o Ponderada',
+    description: 'Ao ajustar os pesos atribu铆dos, esta estrat茅gia de reclassifica莽茫o determina se deve priorizar a correspond锚ncia sem芒ntica ou por palavras-chave.',
+    semanticFirst: 'Sem芒ntica primeiro',
+    keywordFirst: 'Palavra-chave primeiro',
+    customized: 'Personalizado',
+    semantic: 'Sem芒ntico',
+    keyword: 'Palavra-chave',
+  },
+  nTo1RetrievalLegacy: 'A recupera莽茫o N-para-1 ser谩 oficialmente descontinuada a partir de setembro. Recomenda-se usar a recupera莽茫o de m煤ltiplos caminhos mais recente para obter melhores resultados.',
+  nTo1RetrievalLegacyLink: 'Saiba mais',
+  nTo1RetrievalLegacyLinkText: 'A recupera莽茫o N-para-1 ser谩 oficialmente descontinuada em setembro.',
+  intro6: 'como um plug-in de 铆ndice ChatGPT aut么nomo para publicar',
+  defaultRetrievalTip: 'A recupera莽茫o de v谩rios caminhos 茅 usada por padr茫o. O conhecimento 茅 recuperado de v谩rias bases de dados de conhecimento e, em seguida, reclassificado.',
+  editExternalAPIConfirmWarningContent: {
+    front: 'Esta API de conhecimento externo est谩 vinculada a',
+    end: 'conhecimento externo, e essa modifica莽茫o ser谩 aplicada a todos eles. Tem certeza de que deseja salvar essa altera莽茫o?',
+  },
+  editExternalAPIFormWarning: {
+    end: 'Conhecimento externo',
+    front: 'Esta API externa est谩 vinculada a',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: 'Excluir',
+      end: '?',
+    },
+    content: {
+      end: 'conhecimento externo. A exclus茫o dessa API invalidar谩 todos eles. Tem certeza de que deseja excluir esta API?',
+      front: 'Esta API de conhecimento externo est谩 vinculada a',
+    },
+    noConnectionContent: 'Tem certeza de que deseja excluir essa API?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: 'Escolher uma API de conhecimento externa',
+  },
+  connectDatasetIntro: {
+    content: {
+      front: 'Para se conectar a uma base de dados de conhecimento externa, voc锚 precisa primeiro criar uma API externa. Por favor, leia com aten莽茫o e consulte',
+      link: 'Saiba como criar uma API externa',
+      end: '. Em seguida, encontre o ID de conhecimento correspondente e preencha-o no formul谩rio 脿 esquerda. Se todas as informa莽玫es estiverem corretas, ele pular谩 automaticamente para o teste de recupera莽茫o na base de conhecimento depois de clicar no bot茫o conectar.',
+    },
+    learnMore: 'Saiba Mais',
+    title: 'Como se conectar a uma base de conhecimento externa',
+  },
+  connectHelper: {
+    helper3: '. Recomendamos fortemente que voc锚',
+    helper5: 'cuidadosamente antes de usar esse recurso.',
+    helper2: 'apenas a funcionalidade de recupera莽茫o 茅 suportada',
+    helper4: 'Leia a documenta莽茫o de ajuda',
+    helper1: 'Conecte-se a bases de conhecimento externas por meio da API e do ID da base de conhecimento. Atualmente,',
+  },
+  externalKnowledgeForm: {
+    cancel: 'Cancelar',
+    connect: 'Ligar',
+  },
+  externalAPIForm: {
+    encrypted: {
+      front: 'Seu token de API ser谩 criptografado e armazenado usando',
+      end: 'Tecnologia.',
+    },
+    name: 'Nome',
+    apiKey: 'Chave de API',
+    cancel: 'Cancelar',
+    save: 'Salvar',
+    edit: 'Editar',
+    endpoint: 'API Endpoint',
+  },
+  externalAPI: 'API externa',
+  editExternalAPITooltipTitle: 'CONHECIMENTO VINCULADO',
+  noExternalKnowledge: 'Ainda n茫o existe uma API de conhecimento externo, clique aqui para criar',
+  externalAPIPanelDescription: 'A API de conhecimento externo 茅 usada para se conectar a uma base de conhecimento fora do Dify e recuperar o conhecimento dessa base de conhecimento.',
+  externalKnowledgeIdPlaceholder: 'Insira o ID de conhecimento',
+  externalKnowledgeDescriptionPlaceholder: 'Descreva o que h谩 nesta Base de Dados de Conhecimento (opcional)',
+  connectDataset: 'Conectar-se a uma base de conhecimento externa',
+  createNewExternalAPI: 'Criar uma nova API de conhecimento externo',
+  allExternalTip: 'Ao usar apenas conhecimento externo, o usu谩rio pode escolher se deseja habilitar o modelo de reclassifica莽茫o. Se n茫o estiver ativado, os blocos recuperados ser茫o classificados com base nas pontua莽玫es. Quando as estrat茅gias de recupera莽茫o de diferentes bases de conhecimento s茫o inconsistentes, elas ser茫o imprecisas.',
+  externalTag: 'Externo',
+  externalKnowledgeName: 'Nome do Conhecimento Externo',
+  externalKnowledgeId: 'ID de conhecimento externo',
+  externalAPIPanelTitle: 'API de conhecimento externo',
+  externalKnowledgeNamePlaceholder: 'Insira o nome da base de conhecimento',
+  createExternalAPI: 'Adicionar uma API de conhecimento externo',
+  editExternalAPIFormTitle: 'Editar a API de conhecimento externo',
+  mixtureInternalAndExternalTip: 'O modelo de Reclassifica莽茫o 茅 necess谩rio para a mistura de conhecimento interno e externo.',
+  learnHowToWriteGoodKnowledgeDescription: 'Aprenda a escrever uma boa descri莽茫o de conhecimento',
+  externalAPIPanelDocumentation: 'Saiba como criar uma API de conhecimento externo',
+  externalKnowledgeDescription: 'Descri莽茫o do Conhecimento',
+  chunkingMode: {
+    parentChild: 'Pai-filho',
+    general: 'Geral',
+  },
+  parentMode: {
+    fullDoc: 'Documento completo',
+    paragraph: 'Par谩grafo',
+  },
+  batchAction: {
+    selected: 'Selecionado',
+    delete: 'Excluir',
+    enable: 'Habilitar',
+    archive: 'Arquivo',
+    disable: 'Desabilitar',
+    cancel: 'Cancelar',
+  },
+  documentsDisabled: '{{num}} documentos desativados - inativos por mais de 30 dias',
+  enable: 'Habilitar',
+  preprocessDocument: '{{num}} Documentos de pr茅-processamento',
+  localDocs: 'Documentos locais',
+  allKnowledgeDescription: 'Selecione para exibir todo o conhecimento neste espa莽o de trabalho. Somente o propriet谩rio do espa莽o de trabalho pode gerenciar todo o conhecimento.',
+  allKnowledge: 'Todo o conhecimento',
+  metadata: {
+    createMetadata: {
+      name: 'Nome',
+      title: 'Nova Metadata',
+      type: 'Tipo',
+      namePlaceholder: 'Adicionar nome de metadados',
+      back: 'Voltar',
+    },
+    checkName: {
+      empty: 'O nome dos metadados n茫o pode estar vazio',
+      invalid: 'O nome de metadata s贸 pode conter letras min煤sculas, n煤meros e sublinhados e deve come莽ar com uma letra min煤scula.',
+    },
+    batchEditMetadata: {
+      editDocumentsNum: 'Editando {{num}} documentos',
+      applyToAllSelectDocument: 'Aplicar a todos os documentos selecionados',
+      editMetadata: 'Editar Metadados',
+      multipleValue: 'M煤ltiplos Valores',
+      applyToAllSelectDocumentTip: 'Crie automaticamente todos os metadados editados e novos mencionados acima para todos os documentos selecionados, caso contr谩rio, a edi莽茫o de metadados s贸 se aplicar谩 aos documentos que j谩 os possuem.',
+    },
+    selectMetadata: {
+      manageAction: 'Gerenciar',
+      search: 'Pesquisar metadados',
+      newAction: 'Nova Metadados',
+    },
+    datasetMetadata: {
+      addMetaData: 'Adicionar Metadados',
+      namePlaceholder: 'Nome da metadata',
+      description: 'Voc锚 pode gerenciar todos os metadados neste conhecimento aqui. As modifica莽玫es ser茫o sincronizadas em todos os documentos.',
+      deleteTitle: 'Confirme para deletar',
+      deleteContent: 'Voc锚 tem certeza de que deseja excluir os metadados "{{name}}"?',
+      name: 'Nome',
+      builtInDescription: 'Os metadados incorporados s茫o extra铆dos e gerados automaticamente. Eles devem ser ativados antes do uso e n茫o podem ser editados.',
+      disabled: 'Desativado',
+      builtIn: 'Integrado',
+      rename: 'Renomear',
+      values: '{{num}} Valores',
+    },
+    documentMetadata: {
+      metadataToolTip: 'Os metadados servem como um filtro cr铆tico que aprimora a precis茫o e a relev芒ncia da recupera莽茫o de informa莽玫es. Voc锚 pode modificar e adicionar metadados para este documento aqui.',
+      technicalParameters: 'Par芒metros T茅cnicos',
+      documentInformation: 'Informa莽玫es do Documento',
+      startLabeling: 'Comece a rotular',
+    },
+    addMetadata: 'Adicionar Metadados',
+    chooseTime: 'Escolha um hor谩rio...',
+    metadata: 'Metadados',
+  },
+  embeddingModelNotAvailable: 'O modelo de incorpora莽茫o n茫o est谩 dispon铆vel.',
+}
+
+export default translation
diff --git a/i18n/pt-BR/education.ts b/i18n/pt-BR/education.ts
new file mode 100644
index 0000000..af0cd15
--- /dev/null
+++ b/i18n/pt-BR/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    front: 'Voc锚 agora est谩 eleg铆vel para o status de Educa莽茫o Verificada. Por favor, insira suas informa莽玫es educacionais abaixo para concluir o processo e receber um',
+    coupon: 'cupom exclusivo de 100%',
+    end: 'para o Plano Profissional Dify.',
+  },
+  form: {
+    schoolName: {
+      placeholder: 'Digite o nome oficial e n茫o abreviado da sua escola',
+      title: 'O nome da sua escola',
+    },
+    schoolRole: {
+      option: {
+        teacher: 'Professor',
+        student: 'Estudante',
+        administrator: 'Administrador Escolar',
+      },
+      title: 'Seu Papel na Escola',
+    },
+    terms: {
+      desc: {
+        and: 'e',
+        privacyPolicy: 'Pol铆tica de Privacidade',
+        front: 'Suas informa莽玫es e o uso do status de Educa莽茫o Verificada est茫o sujeitos ao nosso',
+        termsOfService: 'Termos de Servi莽o',
+        end: 'Ao enviar:',
+      },
+      option: {
+        inSchool: 'Eu confirmo que estou matriculado ou empregado na institui莽茫o mencionada. A Dify pode solicitar comprova莽茫o de matr铆cula/emprego. Se eu representar indevidamente minha elegibilidade, concordo em pagar quaisquer taxas inicialmente isentas com base no meu status educacional.',
+        age: 'Eu confirmo que tenho pelo menos 18 anos',
+      },
+      title: 'Termos e Acordos',
+    },
+  },
+  learn: 'Aprenda como fazer a verifica莽茫o da sua educa莽茫o',
+  toVerified: 'Verifique a Educa莽茫o',
+  currentSigned: 'ATUALMENTE CONECTADO COMO',
+  submit: 'Enviar',
+  emailLabel: 'Seu e-mail atual',
+  successContent: 'Emitimos um cupom de desconto de 100% para o plano Dify Professional na sua conta. O cupom 茅 v谩lido por um ano, por favor, utilize-o dentro do per铆odo de validade.',
+  rejectTitle: 'A sua verifica莽茫o educacional Dify foi rejeitada.',
+  rejectContent: 'Infelizmente, voc锚 n茫o 茅 eleg铆vel para o status de Educa莽茫o Verificada e, portanto, n茫o pode receber o cupom exclusivo de 100% para o Plano Profissional Dify se usar este endere莽o de e-mail.',
+  successTitle: 'Voc锚 Tem a Educa莽茫o Dify Verificada',
+  submitError: 'A submiss茫o do formul谩rio falhou. Por favor, tente novamente mais tarde.',
+}
+
+export default translation
diff --git a/i18n/pt-BR/explore.ts b/i18n/pt-BR/explore.ts
new file mode 100644
index 0000000..2a15d07
--- /dev/null
+++ b/i18n/pt-BR/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: 'Bada膰',
+  sidebar: {
+    discovery: 'Descoberta',
+    chat: 'Chat',
+    workspace: 'Espa莽o de Trabalho',
+    action: {
+      pin: 'Fixar',
+      unpin: 'Desafixar',
+      rename: 'Renomear',
+      delete: 'Excluir',
+    },
+    delete: {
+      title: 'Excluir aplicativo',
+      content: 'Tem certeza de que deseja excluir este aplicativo?',
+    },
+  },
+  apps: {
+    title: 'Explorar Aplica莽玫es por Dify',
+    description: 'Use esses aplicativos modelo instantaneamente ou personalize seus pr贸prios aplicativos com base nos modelos.',
+    allCategories: 'Recomendado',
+  },
+  appCard: {
+    addToWorkspace: 'Adicionar ao Espa莽o de Trabalho',
+    customize: 'Personalizar',
+  },
+  appCustomize: {
+    title: 'Criar aplicativo a partir de {{name}}',
+    subTitle: '脥cone e nome do aplicativo',
+    nameRequired: 'O nome do aplicativo 茅 obrigat贸rio',
+  },
+  category: {
+    Assistant: 'Assistente',
+    Writing: 'Escrita',
+    Translate: 'Traduzir',
+    Programming: 'Programa莽茫o',
+    HR: 'RH',
+    Workflow: 'Fluxo de trabalho',
+    Agent: 'Agente',
+    Entertainment: 'Entretenimento',
+  },
+}
+
+export default translation
diff --git a/i18n/pt-BR/layout.ts b/i18n/pt-BR/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/pt-BR/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/pt-BR/login.ts b/i18n/pt-BR/login.ts
new file mode 100644
index 0000000..7af5181
--- /dev/null
+++ b/i18n/pt-BR/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: 'Oi, vamos come莽ar!馃憢',
+  welcome: 'Bem-vindo ao Dify, fa莽a login para continuar.',
+  email: 'Endere莽o de e-mail',
+  emailPlaceholder: 'Seu e-mail',
+  password: 'Senha',
+  passwordPlaceholder: 'Sua senha',
+  name: 'Nome de usu谩rio',
+  namePlaceholder: 'Seu nome de usu谩rio',
+  forget: 'Esqueceu sua senha?',
+  signBtn: 'Entrar',
+  installBtn: 'Configura莽茫o',
+  setAdminAccount: 'Configurando uma conta de administrador',
+  setAdminAccountDesc: 'Privil茅gios m谩ximos para a conta de administrador, que pode ser usada para criar aplicativos e gerenciar provedores LLM, etc.',
+  createAndSignIn: 'Criar e entrar',
+  oneMoreStep: 'Mais um passo',
+  createSample: 'Com base nessas informa莽玫es, criaremos um aplicativo de exemplo para voc锚',
+  invitationCode: 'C贸digo de convite',
+  invitationCodePlaceholder: 'Seu c贸digo de convite',
+  interfaceLanguage: 'Idioma da interface',
+  timezone: 'Fuso hor谩rio',
+  go: 'Ir para o Dify',
+  sendUsMail: 'Envie-nos um e-mail com sua introdu莽茫o e cuidaremos do pedido de convite.',
+  acceptPP: 'Li e aceito a pol铆tica de privacidade',
+  reset: 'Execute o seguinte comando para redefinir sua senha',
+  withGitHub: 'Continuar com o GitHub',
+  withGoogle: 'Continuar com o Google',
+  rightTitle: 'Desbloqueie todo o potencial do LLM',
+  rightDesc: 'Crie aplicativos de IA visualmente cativantes, oper谩veis e aprimor谩veis sem esfor莽o.',
+  tos: 'Termos de Servi莽o',
+  pp: 'Pol铆tica de Privacidade',
+  tosDesc: 'Ao se inscrever, voc锚 concorda com nossos',
+  goToInit: 'Se voc锚 n茫o inicializou a conta, v谩 para a p谩gina de inicializa莽茫o',
+  dontHave: 'N茫o tem?',
+  invalidInvitationCode: 'C贸digo de convite inv谩lido',
+  accountAlreadyInited: 'Conta j谩 iniciada',
+  forgotPassword: 'Esqueceu sua senha?',
+  resetLinkSent: 'Link de redefini莽茫o enviado',
+  sendResetLink: 'Enviar link de redefini莽茫o',
+  backToSignIn: 'Voltar para login',
+  forgotPasswordDesc: 'Por favor, insira seu endere莽o de e-mail para redefinir sua senha. Enviaremos um e-mail com instru莽玫es sobre como redefinir sua senha.',
+  checkEmailForResetLink: 'Verifique seu e-mail para um link para redefinir sua senha. Se n茫o aparecer dentro de alguns minutos, verifique sua pasta de spam.',
+  passwordChanged: 'Entre agora',
+  changePassword: 'Mudar a senha',
+  changePasswordTip: 'Por favor, insira uma nova senha para sua conta',
+  invalidToken: 'Token inv谩lido ou expirado',
+  confirmPassword: 'Confirme a Senha',
+  confirmPasswordPlaceholder: 'Confirme sua nova senha',
+  passwordChangedTip: 'Sua senha foi alterada com sucesso',
+  error: {
+    emailEmpty: 'O endere莽o de e-mail 茅 obrigat贸rio',
+    emailInValid: 'Digite um endere莽o de e-mail v谩lido',
+    nameEmpty: 'O nome 茅 obrigat贸rio',
+    passwordEmpty: 'A senha 茅 obrigat贸ria',
+    passwordInvalid: 'A senha deve conter letras e n煤meros e ter um comprimento maior que 8',
+    passwordLengthInValid: 'A senha deve ter pelo menos 8 caracteres',
+    registrationNotAllowed: 'Conta n茫o encontrada. Entre em contato com o administrador do sistema para se registrar.',
+  },
+  license: {
+    tip: 'Antes de come莽ar a usar a Edi莽茫o Comunit谩ria do Dify, leia a',
+    link: 'Licen莽a de c贸digo aberto do GitHub',
+  },
+  join: 'Participar',
+  joinTipStart: 'Convidamos voc锚 a participar da',
+  joinTipEnd: 'equipe no Dify',
+  invalid: 'O link expirou',
+  explore: 'Explorar o Dify',
+  activatedTipStart: 'Voc锚 se juntou 脿 equipe',
+  activatedTipEnd: '',
+  activated: 'Entrar agora',
+  adminInitPassword: 'Senha de inicializa莽茫o do administrador',
+  validate: 'Validar',
+  sso: 'Continuar com SSO',
+  checkCode: {
+    useAnotherMethod: 'Use outro m茅todo',
+    invalidCode: 'C贸digo inv谩lido',
+    verificationCodePlaceholder: 'Digite o c贸digo de 6 d铆gitos',
+    checkYourEmail: 'Verifique seu e-mail',
+    tips: 'Enviamos um c贸digo de verifica莽茫o para <strong>{{email}}</strong>',
+    emptyCode: 'O c贸digo 茅 necess谩rio',
+    verify: 'Verificar',
+    verificationCode: 'C贸digo de verifica莽茫o',
+    resend: 'Reenviar',
+    didNotReceiveCode: 'N茫o recebeu o c贸digo?',
+    validTime: 'Lembre-se de que o c贸digo 茅 v谩lido por 5 minutos',
+  },
+  resetPassword: 'Redefinir senha',
+  or: 'OU',
+  withSSO: 'Continuar com SSO',
+  setYourAccount: 'Defina sua conta',
+  backToLogin: 'Voltar ao login',
+  noLoginMethodTip: 'Entre em contato com o administrador do sistema para adicionar um m茅todo de autentica莽茫o.',
+  continueWithCode: 'Continuar com o c贸digo',
+  enterYourName: 'Por favor, digite seu nome de usu谩rio',
+  noLoginMethod: 'M茅todo de autentica莽茫o n茫o configurado',
+  useVerificationCode: 'Usar c贸digo de verifica莽茫o',
+  back: 'Voltar',
+  changePasswordBtn: 'Definir uma senha',
+  resetPasswordDesc: 'Digite o e-mail que voc锚 usou para se inscrever no Dify e enviaremos um e-mail de redefini莽茫o de senha.',
+  sendVerificationCode: 'Enviar c贸digo de verifica莽茫o',
+  usePassword: 'Usar senha',
+  licenseInactiveTip: 'A licen莽a do Dify Enterprise para seu espa莽o de trabalho est谩 inativa. Entre em contato com o administrador para continuar usando o Dify.',
+  licenseLostTip: 'Falha ao conectar o servidor de licen莽as Dify. Entre em contato com o administrador para continuar usando o Dify.',
+  licenseExpired: 'Licen莽a expirada',
+  licenseLost: 'Licen莽a perdida',
+  licenseInactive: 'Licen莽a inativa',
+  licenseExpiredTip: 'A licen莽a do Dify Enterprise para seu espa莽o de trabalho expirou. Entre em contato com o administrador para continuar usando o Dify.',
+}
+
+export default translation
diff --git a/i18n/pt-BR/plugin-tags.ts b/i18n/pt-BR/plugin-tags.ts
new file mode 100644
index 0000000..08f050b
--- /dev/null
+++ b/i18n/pt-BR/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    other: 'Outro',
+    medical: 'M茅dico',
+    videos: 'V铆deos',
+    productivity: 'Produtividade',
+    utilities: 'Utilidades',
+    social: 'Social',
+    finance: 'Financiar',
+    image: 'Imagem',
+    education: 'Educa莽茫o',
+    design: 'Projetar',
+    business: 'Neg贸cio',
+    weather: 'Tempo',
+    news: 'Not铆cia',
+    agent: 'Agente',
+    entertainment: 'Entretenimento',
+    search: 'Procurar',
+    travel: 'Viajar',
+  },
+  allTags: 'Todas as tags',
+  searchTags: 'Tags de pesquisa',
+}
+
+export default translation
diff --git a/i18n/pt-BR/plugin.ts b/i18n/pt-BR/plugin.ts
new file mode 100644
index 0000000..c02f9cb
--- /dev/null
+++ b/i18n/pt-BR/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    extensions: 'Extens玫es',
+    all: 'Todo',
+    bundles: 'Pacotes',
+    models: 'Modelos',
+    agents: 'Estrat茅gias do agente',
+    tools: 'Ferramentas',
+  },
+  categorySingle: {
+    model: 'Modelo',
+    bundle: 'Pacote',
+    agent: 'Estrat茅gia do agente',
+    extension: 'Extens茫o',
+    tool: 'Ferramenta',
+  },
+  list: {
+    source: {
+      marketplace: 'Instalar do Marketplace',
+      github: 'Instalar do GitHub',
+      local: 'Instalar a partir do arquivo de pacote local',
+    },
+    noInstalled: 'Nenhum plug-in instalado',
+    notFound: 'Nenhum plugin encontrado',
+  },
+  source: {
+    local: 'Arquivo de pacote local',
+    github: 'GitHub',
+    marketplace: 'Mercado',
+  },
+  detailPanel: {
+    categoryTip: {
+      debugging: 'Plugin de depura莽茫o',
+      marketplace: 'Instalado do Marketplace',
+      local: 'Plug-in local',
+      github: 'Instalado a partir do Github',
+    },
+    operation: {
+      checkUpdate: 'Verifique a atualiza莽茫o',
+      install: 'Instalar',
+      update: 'Atualiza莽茫o',
+      info: 'Informa莽玫es do plugin',
+      detail: 'Detalhes',
+      remove: 'Retirar',
+      viewDetail: 'Ver detalhes',
+    },
+    toolSelector: {
+      uninstalledLink: 'Gerenciar em plug-ins',
+      unsupportedContent2: 'Clique para mudar de vers茫o.',
+      auto: 'Autom谩tico',
+      title: 'Adicionar ferramenta',
+      params: 'CONFIGURA脟脙O DE RACIOC脥NIO',
+      toolLabel: 'Ferramenta',
+      paramsTip1: 'Controla os par芒metros de infer锚ncia do LLM.',
+      descriptionLabel: 'Descri莽茫o da ferramenta',
+      uninstalledContent: 'Este plug-in 茅 instalado a partir do reposit贸rio local/GitHub. Por favor, use ap贸s a instala莽茫o.',
+      paramsTip2: 'Quando \'Autom谩tico\' est谩 desativado, o valor padr茫o 茅 usado.',
+      placeholder: 'Selecione uma ferramenta...',
+      empty: 'Clique no bot茫o \'+\' para adicionar ferramentas. Voc锚 pode adicionar v谩rias ferramentas.',
+      settings: 'CONFIGURA脟脮ES DO USU脕RIO',
+      unsupportedContent: 'A vers茫o do plug-in instalada n茫o fornece essa a莽茫o.',
+      descriptionPlaceholder: 'Breve descri莽茫o da finalidade da ferramenta, por exemplo, obter a temperatura para um local espec铆fico.',
+      uninstalledTitle: 'Ferramenta n茫o instalada',
+      unsupportedTitle: 'A莽茫o sem suporte',
+    },
+    serviceOk: 'Servi莽o OK',
+    endpointsTip: 'Este plug-in fornece funcionalidades espec铆ficas por meio de endpoints e voc锚 pode configurar v谩rios conjuntos de endpoints para o workspace atual.',
+    strategyNum: '{{num}} {{estrat茅gia}} INCLUSO',
+    endpointDisableContent: 'Gostaria de desativar {{name}}?',
+    endpointDeleteContent: 'Gostaria de remover {{name}}?',
+    endpointsEmpty: 'Clique no bot茫o \'+\' para adicionar um endpoint',
+    configureModel: 'Configurar modelo',
+    endpointModalDesc: 'Uma vez configurados, os recursos fornecidos pelo plug-in por meio de endpoints de API podem ser usados.',
+    endpointDeleteTip: 'Remover endpoint',
+    endpointDisableTip: 'Desativar ponto de extremidade',
+    modelNum: '{{num}} MODELOS INCLU脥DOS',
+    actionNum: '{{num}} {{a莽茫o}} INCLUSO',
+    switchVersion: 'Vers茫o do Switch',
+    endpoints: 'Extremidade',
+    disabled: 'Desactivado',
+    configureApp: 'Configurar aplicativo',
+    configureTool: 'Ferramenta de configura莽茫o',
+    endpointsDocLink: 'Veja o documento',
+    endpointModalTitle: 'Ponto de extremidade de configura莽茫o',
+  },
+  debugInfo: {
+    title: 'Depura莽茫o',
+    viewDocs: 'Ver documentos',
+  },
+  privilege: {
+    whoCanInstall: 'Quem pode instalar e gerenciar plugins?',
+    admins: 'Administradores',
+    noone: 'Ningu茅m',
+    whoCanDebug: 'Quem pode depurar plugins?',
+    title: 'Prefer锚ncias de plug-ins',
+    everyone: 'Todos',
+  },
+  pluginInfoModal: {
+    repository: 'Reposit贸rio',
+    title: 'Informa莽玫es do plugin',
+    packageName: 'Pacote',
+    release: 'Soltar',
+  },
+  action: {
+    deleteContentLeft: 'Gostaria de remover',
+    deleteContentRight: 'plugin?',
+    delete: 'Remover plugin',
+    pluginInfo: 'Informa莽玫es do plugin',
+    checkForUpdates: 'Verifique se h谩 atualiza莽玫es',
+    usedInApps: 'Este plugin est谩 sendo usado em aplicativos {{num}}.',
+  },
+  installModal: {
+    labels: {
+      version: 'Vers茫o',
+      repository: 'Reposit贸rio',
+      package: 'Pacote',
+    },
+    installPlugin: 'Instale o plugin',
+    close: 'Fechar',
+    installedSuccessfullyDesc: 'O plugin foi instalado com sucesso.',
+    next: 'Pr贸ximo',
+    installFailedDesc: 'O plug-in foi instalado falhou.',
+    installedSuccessfully: 'Instala莽茫o bem-sucedida',
+    install: 'Instalar',
+    installFailed: 'Falha na instala莽茫o',
+    readyToInstallPackages: 'Prestes a instalar os seguintes plugins {{num}}',
+    back: 'Voltar',
+    installComplete: 'Instala莽茫o conclu铆da',
+    readyToInstallPackage: 'Prestes a instalar o seguinte plugin',
+    cancel: 'Cancelar',
+    fromTrustSource: 'Certifique-se de instalar apenas plug-ins de uma <trustSource>fonte confi谩vel</trustSource>.',
+    pluginLoadError: 'Erro de carregamento do plug-in',
+    readyToInstall: 'Prestes a instalar o seguinte plugin',
+    pluginLoadErrorDesc: 'Este plugin n茫o ser谩 instalado',
+    uploadFailed: 'Falha no upload',
+    installing: 'Instalar...',
+    uploadingPackage: 'Carregando {{packageName}} ...',
+    dropPluginToInstall: 'Solte o pacote de plug-in aqui para instalar',
+  },
+  installFromGitHub: {
+    selectVersionPlaceholder: 'Selecione uma vers茫o',
+    updatePlugin: 'Atualizar plugin do GitHub',
+    installPlugin: 'Instale o plugin do GitHub',
+    gitHubRepo: 'Reposit贸rio GitHub',
+    installFailed: 'Falha na instala莽茫o',
+    selectVersion: 'Selecione a vers茫o',
+    uploadFailed: 'Falha no upload',
+    installedSuccessfully: 'Instala莽茫o bem-sucedida',
+    installNote: 'Certifique-se de instalar apenas plug-ins de uma fonte confi谩vel.',
+    selectPackagePlaceholder: 'Selecione um pacote',
+    selectPackage: 'Selecione o pacote',
+  },
+  upgrade: {
+    title: 'Instale o plugin',
+    successfulTitle: 'Instala莽茫o bem-sucedida',
+    close: 'Fechar',
+    upgrading: 'Instalar...',
+    upgrade: 'Instalar',
+    description: 'Prestes a instalar o seguinte plugin',
+    usedInApps: 'Usado em aplicativos {{num}}',
+  },
+  error: {
+    inValidGitHubUrl: 'URL do GitHub inv谩lida. Insira um URL v谩lido no formato: https://github.com/owner/repo',
+    noReleasesFound: 'Nenhuma vers茫o encontrada. Verifique o reposit贸rio GitHub ou a URL de entrada.',
+    fetchReleasesError: 'N茫o 茅 poss铆vel recuperar vers玫es. Por favor, tente novamente mais tarde.',
+  },
+  marketplace: {
+    sortOption: {
+      mostPopular: 'Mais popular',
+      firstReleased: 'Lan莽ado pela primeira vez',
+      recentlyUpdated: 'Atualizado recentemente',
+      newlyReleased: 'Rec茅m-lan莽ado',
+    },
+    sortBy: 'Cidade negra',
+    viewMore: 'Ver mais',
+    and: 'e',
+    pluginsResult: '{{num}} resultados',
+    empower: 'Capacite seu desenvolvimento de IA',
+    difyMarketplace: 'Mercado Dify',
+    moreFrom: 'Mais do Marketplace',
+    noPluginFound: 'Nenhum plugin encontrado',
+    discover: 'Descobrir',
+    verifiedTip: 'Verificado pelo Dify',
+    partnerTip: 'Verificado por um parceiro da Dify',
+  },
+  task: {
+    installedError: 'Falha na instala莽茫o dos plug-ins {{errorLength}}',
+    installingWithSuccess: 'Instalando plugins {{installingLength}}, {{successLength}} sucesso.',
+    installError: '{{errorLength}} plugins falha ao instalar, clique para ver',
+    installingWithError: 'Instalando plug-ins {{installingLength}}, {{successLength}} sucesso, {{errorLength}} falhou',
+    installing: 'Instalando plugins {{installingLength}}, 0 feito.',
+    clearAll: 'Apagar tudo',
+  },
+  installAction: 'Instalar',
+  endpointsEnabled: '{{num}} conjuntos de endpoints habilitados',
+  submitPlugin: 'Enviar plugin',
+  searchPlugins: 'Pesquisar plugins',
+  searchInMarketplace: 'Pesquisar no Marketplace',
+  installPlugin: 'Instale o plugin',
+  from: 'De',
+  searchTools: 'Ferramentas de pesquisa...',
+  search: 'Procurar',
+  fromMarketplace: 'Do Marketplace',
+  allCategories: 'Todas as categorias',
+  install: '{{num}} instala',
+  searchCategories: 'Categorias de pesquisa',
+  findMoreInMarketplace: 'Saiba mais no Marketplace',
+  installFrom: 'INSTALAR DE',
+  metadata: {
+    title: 'Plugins',
+  },
+  difyVersionNotCompatible: 'A vers茫o atual do Dify n茫o 茅 compat铆vel com este plugin, por favor atualize para a vers茫o m铆nima exigida: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/pt-BR/register.ts b/i18n/pt-BR/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/pt-BR/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/pt-BR/run-log.ts b/i18n/pt-BR/run-log.ts
new file mode 100644
index 0000000..51ee3a6
--- /dev/null
+++ b/i18n/pt-BR/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: 'ENTRADA',
+  result: 'RESULTADO',
+  detail: 'DETALHE',
+  tracing: 'RASTREIO',
+  resultPanel: {
+    status: 'STATUS',
+    time: 'TEMPO DECORRIDO',
+    tokens: 'TOTAL DE TOKENS',
+  },
+  meta: {
+    title: 'METADADOS',
+    status: 'Status',
+    version: 'Vers茫o',
+    executor: 'Executor',
+    startTime: 'Hora de In铆cio',
+    time: 'Tempo Decorrido',
+    tokens: 'Total de Tokens',
+    steps: 'Passos de Execu莽茫o',
+  },
+  resultEmpty: {
+    title: 'Esta execu莽茫o apenas produz o formato JSON,',
+    tipLeft: 'por favor v谩 para ',
+    link: 'painel de detalhes',
+    tipRight: ' veja.',
+  },
+  circularInvocationTip: 'H谩 uma invoca莽茫o circular de ferramentas/n贸s no fluxo de trabalho atual.',
+  actionLogs: 'Logs de a莽茫o',
+}
+
+export default translation
diff --git a/i18n/pt-BR/share-app.ts b/i18n/pt-BR/share-app.ts
new file mode 100644
index 0000000..d8bca03
--- /dev/null
+++ b/i18n/pt-BR/share-app.ts
@@ -0,0 +1,82 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: 'O aplicativo n茫o est谩 dispon铆vel',
+    appUnknownError: 'O aplicativo encontrou um erro desconhecido',
+  },
+  chat: {
+    newChat: 'Nova conversa',
+    pinnedTitle: 'Fixado',
+    unpinnedTitle: 'Conversas',
+    newChatDefaultName: 'Nova conversa',
+    resetChat: 'Redefinir conversa',
+    poweredBy: 'Desenvolvido por',
+    prompt: 'Prompt',
+    privatePromptConfigTitle: 'Configura莽玫es da conversa',
+    publicPromptConfigTitle: 'Prompt inicial',
+    configStatusDes: 'Antes de come莽ar, voc锚 pode modificar as configura莽玫es da conversa',
+    configDisabled:
+      'As configura莽玫es da sess茫o anterior foram usadas para esta sess茫o.',
+    startChat: 'Iniciar conversa',
+    privacyPolicyLeft:
+      'Por favor, leia a ',
+    privacyPolicyMiddle:
+      'pol铆tica de privacidade',
+    privacyPolicyRight:
+      ' fornecida pelo desenvolvedor do aplicativo.',
+    deleteConversation: {
+      title: 'Excluir conversa',
+      content: 'Tem certeza de que deseja excluir esta conversa?',
+    },
+    tryToSolve: 'Tente resolver',
+    temporarySystemIssue: 'Desculpe, problema tempor谩rio do sistema.',
+    expand: 'Expandir',
+    collapse: 'Contrair',
+    newChatTip: 'J谩 em um novo chat',
+    chatFormTip: 'As configura莽玫es do chat n茫o podem ser modificadas ap贸s o in铆cio do chat.',
+    viewChatSettings: 'Ver configura莽玫es de chat',
+    chatSettingsTitle: 'Nova configura莽茫o de chat',
+  },
+  generation: {
+    tabs: {
+      create: 'Executar uma vez',
+      batch: 'Executar em lote',
+      saved: 'Salvo',
+    },
+    savedNoData: {
+      title: 'Voc锚 ainda n茫o salvou um resultado!',
+      description: 'Comece a gerar conte煤do e encontre seus resultados salvos aqui.',
+      startCreateContent: 'Come莽ar a criar conte煤do',
+    },
+    title: 'Completar com IA',
+    queryTitle: 'Consultar conte煤do',
+    completionResult: 'Resultado da conclus茫o',
+    queryPlaceholder: 'Escreva sua consulta...',
+    run: 'Executar',
+    copy: 'Copiar',
+    resultTitle: 'Completar com IA',
+    noData: 'A IA fornecer谩 o que voc锚 deseja aqui.',
+    csvUploadTitle: 'Arraste e solte seu arquivo CSV aqui ou ',
+    browse: 'navegue',
+    csvStructureTitle: 'O arquivo CSV deve seguir a seguinte estrutura:',
+    downloadTemplate: 'Baixe o modelo aqui',
+    field: 'Campo',
+    batchFailed: {
+      info: '{{num}} execu莽玫es falharam',
+      retry: 'Tentar novamente',
+      outputPlaceholder: 'Nenhum conte煤do de sa铆da',
+    },
+    errorMsg: {
+      empty: 'Por favor, insira conte煤do no arquivo enviado.',
+      fileStructNotMatch: 'O arquivo CSV enviado n茫o corresponde 脿 estrutura.',
+      emptyLine: 'A linha {{rowIndex}} est谩 vazia',
+      invalidLine: 'Linha {{rowIndex}}: o valor de {{varName}} n茫o pode estar vazio',
+      moreThanMaxLengthLine: 'Linha {{rowIndex}}: o valor de {{varName}} n茫o pode ter mais de {{maxLength}} caracteres',
+      atLeastOne: 'Por favor, insira pelo menos uma linha no arquivo enviado.',
+    },
+    executions: '{{num}} EXECU脟脮ES',
+    execution: 'EXECU脟脙O',
+  },
+}
+
+export default translation
diff --git a/i18n/pt-BR/time.ts b/i18n/pt-BR/time.ts
new file mode 100644
index 0000000..fcf25ca
--- /dev/null
+++ b/i18n/pt-BR/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Wed: 'Quarta-feira',
+    Tue: 'Ter莽a-feira',
+    Sun: 'Sol',
+    Thu: 'Quinta-feira',
+    Fri: 'Sexta',
+    Sat: 'S谩bado',
+    Mon: 'Mon',
+  },
+  months: {
+    May: 'Maio',
+    February: 'Fevereiro',
+    April: 'abril',
+    September: 'Setembro',
+    March: 'Mar莽o',
+    December: 'Dezembro',
+    November: 'Novembro',
+    October: 'Outubro',
+    July: 'Julho',
+    August: 'Agosto',
+    June: 'junho',
+    January: 'Janeiro',
+  },
+  operation: {
+    pickDate: 'Escolher Data',
+    ok: 'OK',
+    cancel: 'Cancelar',
+    now: 'Agora',
+  },
+  title: {
+    pickTime: 'Escolha o Hor谩rio',
+  },
+  defaultPlaceholder: 'Escolha um hor谩rio...',
+}
+
+export default translation
diff --git a/i18n/pt-BR/tools.ts b/i18n/pt-BR/tools.ts
new file mode 100644
index 0000000..f2eaa36
--- /dev/null
+++ b/i18n/pt-BR/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: 'Ferramentas',
+  createCustomTool: 'Criar Ferramenta Personalizada',
+  type: {
+    all: 'Todas',
+    builtIn: 'Integradas',
+    custom: 'Personalizadas',
+    workflow: 'Fluxo de trabalho',
+  },
+  contribute: {
+    line1: 'Estou interessado em ',
+    line2: 'contribuir com ferramentas para o Dify.',
+    viewGuide: 'Ver o guia',
+  },
+  author: 'Por',
+  auth: {
+    unauthorized: 'Para Autorizar',
+    authorized: 'Autorizado',
+    setup: 'Configurar autoriza莽茫o para usar',
+    setupModalTitle: 'Configurar Autoriza莽茫o',
+    setupModalTitleDescription: 'Ap贸s configurar as credenciais, todos os membros do espa莽o de trabalho podem usar essa ferramenta ao orquestrar aplicativos.',
+  },
+  includeToolNum: '{{num}} ferramentas inclu铆das',
+  addTool: 'Adicionar Ferramenta',
+  createTool: {
+    title: 'Criar Ferramenta Personalizada',
+    editAction: 'Configurar',
+    editTitle: 'Editar Ferramenta Personalizada',
+    name: 'Nome',
+    toolNamePlaceHolder: 'Digite o nome da ferramenta',
+    schema: 'Esquema',
+    schemaPlaceHolder: 'Digite seu esquema OpenAPI aqui',
+    viewSchemaSpec: 'Ver a Especifica莽茫o OpenAPI-Swagger',
+    importFromUrl: 'Importar de URL',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: 'Digite uma URL v谩lida',
+    examples: 'Exemplos',
+    exampleOptions: {
+      json: 'Clima(JSON)',
+      yaml: 'Pet Store(YAML)',
+      blankTemplate: 'Modelo em Branco',
+    },
+    availableTools: {
+      title: 'Ferramentas Dispon铆veis',
+      name: 'Nome',
+      description: 'Descri莽茫o',
+      method: 'M茅todo',
+      path: 'Caminho',
+      action: 'A莽玫es',
+      test: 'Testar',
+    },
+    authMethod: {
+      title: 'M茅todo de Autoriza莽茫o',
+      type: 'Tipo de Autoriza莽茫o',
+      keyTooltip: 'Chave do Cabe莽alho HTTP, voc锚 pode deixar como "Authorization" se n茫o tiver ideia do que 茅 ou definir um valor personalizado',
+      types: {
+        none: 'Nenhum',
+        api_key: 'Chave de API',
+        apiKeyPlaceholder: 'Nome do cabe莽alho HTTP para a Chave de API',
+        apiValuePlaceholder: 'Digite a Chave de API',
+      },
+      key: 'Chave',
+      value: 'Valor',
+    },
+    authHeaderPrefix: {
+      title: 'Tipo de Autentica莽茫o',
+      types: {
+        basic: 'B谩sica',
+        bearer: 'Bearer',
+        custom: 'Personalizada',
+      },
+    },
+    privacyPolicy: 'Pol铆tica de Privacidade',
+    privacyPolicyPlaceholder: 'Digite a pol铆tica de privacidade',
+    customDisclaimer: 'Aviso Personalizado',
+    customDisclaimerPlaceholder: 'Digite o aviso personalizado',
+    deleteToolConfirmTitle: 'Excluir esta ferramenta?',
+    deleteToolConfirmContent: 'Excluir a ferramenta 茅 irrevers铆vel. Os usu谩rios n茫o poder茫o mais acessar sua ferramenta.',
+    toolInput: {
+      label: 'Tags',
+      methodSetting: 'Ambiente',
+      methodParameterTip: 'Preenchimentos de LLM durante a infer锚ncia',
+      methodSettingTip: 'O usu谩rio preenche a configura莽茫o da ferramenta',
+      methodParameter: 'Par芒metro',
+      name: 'Nome',
+      description: 'Descri莽茫o',
+      method: 'M茅todo',
+      required: 'Necess谩rio',
+      title: 'Entrada de ferramenta',
+      labelPlaceholder: 'Escolha tags(opcional)',
+      descriptionPlaceholder: 'Descri莽茫o do significado do par芒metro',
+    },
+    description: 'Descri莽茫o',
+    nameForToolCall: 'Nome da chamada da ferramenta',
+    confirmTip: 'Os aplicativos que usam essa ferramenta ser茫o afetados',
+    confirmTitle: 'Confirme para salvar ?',
+    nameForToolCallTip: 'Suporta apenas n煤meros, letras e sublinhados.',
+    descriptionPlaceholder: 'Breve descri莽茫o da finalidade da ferramenta, por exemplo, obter a temperatura para um local espec铆fico.',
+    nameForToolCallPlaceHolder: 'Usado para reconhecimento de m谩quina, como getCurrentWeather, list_pets',
+  },
+  test: {
+    title: 'Testar',
+    parametersValue: 'Par芒metros e Valor',
+    parameters: 'Par芒metros',
+    value: 'Valor',
+    testResult: 'Resultados do Teste',
+    testResultPlaceholder: 'O resultado do teste ser谩 exibido aqui',
+  },
+  thought: {
+    using: 'Usando',
+    used: 'Usado',
+    requestTitle: 'Requisi莽茫o para',
+    responseTitle: 'Resposta de',
+  },
+  setBuiltInTools: {
+    info: 'Informa莽玫es',
+    setting: 'Configura莽茫o',
+    toolDescription: 'Descri莽茫o da Ferramenta',
+    parameters: 'par芒metros',
+    string: 'string',
+    number: 'n煤mero',
+    required: 'Obrigat贸rio',
+    infoAndSetting: 'Informa莽玫es e Configura莽玫es',
+    file: 'arquivo',
+  },
+  noCustomTool: {
+    title: 'Nenhuma ferramenta personalizada!',
+    content: 'Adicione e gerencie suas ferramentas personalizadas aqui para construir aplicativos de IA.',
+    createTool: 'Criar Ferramenta',
+  },
+  noSearchRes: {
+    title: 'Desculpe, sem resultados!',
+    content: 'N茫o encontramos nenhuma ferramenta que corresponda 脿 sua pesquisa.',
+    reset: 'Redefinir Pesquisa',
+  },
+  builtInPromptTitle: 'Prompt',
+  toolRemoved: 'Ferramenta removida',
+  notAuthorized: 'Ferramenta n茫o autorizada',
+  howToGet: 'Como obter',
+  addToolModal: {
+    category: 'categoria',
+    type: 'tipo',
+    emptyTip: 'V谩 para "Fluxo de trabalho - > Publicar como ferramenta"',
+    add: 'adicionar',
+    emptyTitle: 'Nenhuma ferramenta de fluxo de trabalho dispon铆vel',
+    added: 'Adicionado',
+    manageInTools: 'Gerenciar em Ferramentas',
+    emptyTitleCustom: 'Nenhuma ferramenta personalizada dispon铆vel',
+    emptyTipCustom: 'Criar uma ferramenta personalizada',
+  },
+  openInStudio: 'Abrir no Studio',
+  customToolTip: 'Saiba mais sobre as ferramentas personalizadas da Dify',
+  toolNameUsageTip: 'Nome da chamada da ferramenta para racioc铆nio e solicita莽茫o do agente',
+  copyToolName: 'Nome da c贸pia',
+  noTools: 'Nenhuma ferramenta encontrada',
+}
+
+export default translation
diff --git a/i18n/pt-BR/workflow.ts b/i18n/pt-BR/workflow.ts
new file mode 100644
index 0000000..e64240a
--- /dev/null
+++ b/i18n/pt-BR/workflow.ts
@@ -0,0 +1,921 @@
+const translation = {
+  common: {
+    undo: 'Desfazer',
+    redo: 'Refazer',
+    editing: 'Editando',
+    autoSaved: 'Salvo automaticamente',
+    unpublished: 'N茫o publicado',
+    published: 'Publicado',
+    publish: 'Publicar',
+    update: 'Atualizar',
+    run: 'Executar',
+    running: 'Executando',
+    inRunMode: 'No modo de execu莽茫o',
+    inPreview: 'Em visualiza莽茫o',
+    inPreviewMode: 'No modo de visualiza莽茫o',
+    preview: 'Visualizar',
+    viewRunHistory: 'Ver hist贸rico de execu莽茫o',
+    runHistory: 'Hist贸rico de execu莽茫o',
+    goBackToEdit: 'Voltar para o editor',
+    conversationLog: 'Registro de conversa',
+    features: 'Recursos',
+    debugAndPreview: 'Visualizar',
+    restart: 'Reiniciar',
+    currentDraft: 'Rascunho atual',
+    currentDraftUnpublished: 'Rascunho atual n茫o publicado',
+    latestPublished: '脷ltimo publicado',
+    publishedAt: 'Publicado em',
+    restore: 'Restaurar',
+    runApp: 'Executar aplicativo',
+    batchRunApp: 'Executar aplicativo em lote',
+    accessAPIReference: 'Acessar refer锚ncia da API',
+    embedIntoSite: 'Incorporar ao site',
+    addTitle: 'Adicionar t铆tulo...',
+    addDescription: 'Adicionar descri莽茫o...',
+    noVar: 'Sem vari谩vel',
+    searchVar: 'Buscar vari谩vel',
+    variableNamePlaceholder: 'Nome da vari谩vel',
+    setVarValuePlaceholder: 'Definir valor da vari谩vel',
+    needConnectTip: 'Este passo n茫o est谩 conectado a nada',
+    maxTreeDepth: 'Limite m谩ximo de {{depth}} n贸s por ramo',
+    needEndNode: 'O bloco de fim deve ser adicionado',
+    needAnswerNode: 'O bloco de resposta deve ser adicionado',
+    workflowProcess: 'Processo de fluxo de trabalho',
+    notRunning: 'Ainda n茫o est谩 em execu莽茫o',
+    previewPlaceholder: 'Digite o conte煤do na caixa abaixo para come莽ar a depurar o Chatbot',
+    effectVarConfirm: {
+      title: 'Remover vari谩vel',
+      content: 'A vari谩vel 茅 usada em outros n贸s. Voc锚 ainda deseja remov锚-la?',
+    },
+    insertVarTip: 'Pressione a tecla \'/\' para inserir rapidamente',
+    processData: 'Processar dados',
+    input: 'Entrada',
+    output: 'Sa铆da',
+    jinjaEditorPlaceholder: 'Digite \'/\' ou \'{\' para inserir vari谩vel',
+    viewOnly: 'Apenas visualiza莽茫o',
+    showRunHistory: 'Mostrar hist贸rico de execu莽茫o',
+    enableJinja: 'Ativar suporte ao template Jinja',
+    learnMore: 'Saiba mais',
+    copy: 'Copiar',
+    duplicate: 'Duplicar',
+    addBlock: 'Adicionar bloco',
+    pasteHere: 'Colar aqui',
+    pointerMode: 'Modo ponteiro',
+    handMode: 'Modo m茫o',
+    model: 'Modelo',
+    workflowAsTool: 'Fluxo de trabalho como ferramenta',
+    configureRequired: 'Configura莽茫o necess谩ria',
+    configure: 'Configurar',
+    manageInTools: 'Gerenciar nas ferramentas',
+    workflowAsToolTip: '脡 necess谩ria a reconfigura莽茫o da ferramenta ap贸s a atualiza莽茫o do fluxo de trabalho.',
+    viewDetailInTracingPanel: 'Ver detalhes',
+    importSuccess: 'Sucesso da importa莽茫o',
+    chooseDSL: 'Escolha o arquivo DSL(yml)',
+    importFailure: 'Falha na importa莽茫o',
+    syncingData: 'Sincronizando dados, apenas alguns segundos.',
+    overwriteAndImport: 'Substituir e importar',
+    importDSLTip: 'O rascunho atual ser谩 substitu铆do. Exporte o fluxo de trabalho como backup antes de importar.',
+    backupCurrentDraft: 'Fazer backup do rascunho atual',
+    importDSL: 'Importar DSL',
+    parallelTip: {
+      click: {
+        title: 'Clique',
+        desc: 'para adicionar',
+      },
+      drag: {
+        title: 'Arrastar',
+        desc: 'para conectar',
+      },
+      limit: 'O paralelismo 茅 limitado a {{num}} ramifica莽玫es.',
+      depthLimit: 'Limite de camada de aninhamento paralelo de {{num}} camadas',
+    },
+    parallelRun: 'Execu莽茫o paralela',
+    disconnect: 'Desligar',
+    jumpToNode: 'Ir para este n贸',
+    addParallelNode: 'Adicionar n贸 paralelo',
+    parallel: 'PARALELO',
+    branch: 'RAMIFICA脟脙O',
+    featuresDocLink: 'Saiba Mais',
+    featuresDescription: 'Melhore a experi锚ncia do usu谩rio do aplicativo Web',
+    ImageUploadLegacyTip: 'Agora voc锚 pode criar vari谩veis de tipo de arquivo no formul谩rio inicial. N茫o daremos mais suporte ao recurso de upload de imagens no futuro.',
+    fileUploadTip: 'Os recursos de upload de imagens foram atualizados para upload de arquivos.',
+    importWarning: 'Cuidado',
+    importWarningDetails: 'A diferen莽a de vers茫o DSL pode afetar determinados recursos',
+    openInExplore: 'Abrir no Explore',
+    onFailure: 'Em caso de falha',
+    addFailureBranch: 'Adicionar ramifica莽茫o com falha',
+    noHistory: 'Sem Hist贸ria',
+    loadMore: 'Carregar mais fluxos de trabalho',
+    exportPNG: 'Exportar como PNG',
+    publishUpdate: 'Publicar Atualiza莽茫o',
+    versionHistory: 'Hist贸rico de Vers茫o',
+    exportImage: 'Exportar Imagem',
+    referenceVar: 'Vari谩vel de Refer锚ncia',
+    noExist: 'Nenhuma vari谩vel desse tipo',
+    exitVersions: 'Vers玫es de Sair',
+    exportSVG: 'Exportar como SVG',
+    exportJPEG: 'Exportar como JPEG',
+  },
+  env: {
+    envPanelTitle: 'Vari谩veis de Ambiente',
+    envDescription: 'Vari谩veis de ambiente podem ser usadas para armazenar informa莽玫es privadas e credenciais. Elas s茫o somente leitura e podem ser separadas do arquivo DSL durante a exporta莽茫o.',
+    envPanelButton: 'Adicionar Vari谩vel',
+    modal: {
+      title: 'Adicionar Vari谩vel de Ambiente',
+      editTitle: 'Editar Vari谩vel de Ambiente',
+      type: 'Tipo',
+      name: 'Nome',
+      namePlaceholder: 'nome da env',
+      value: 'Valor',
+      valuePlaceholder: 'valor da env',
+      secretTip: 'Usado para definir informa莽玫es ou dados sens铆veis, com configura莽玫es DSL configuradas para preven莽茫o de vazamentos.',
+    },
+    export: {
+      title: 'Exportar vari谩veis de ambiente secretas?',
+      checkbox: 'Exportar valores secretos',
+      ignore: 'Exportar DSL',
+      export: 'Exportar DSL com valores secretos',
+    },
+  },
+  chatVariable: {
+    panelTitle: 'Vari谩veis de Conversa莽茫o',
+    panelDescription: 'As Vari谩veis de Conversa莽茫o s茫o usadas para armazenar informa莽玫es interativas que o LLM precisa lembrar, incluindo hist贸rico de conversas, arquivos carregados, prefer锚ncias do usu谩rio. Elas s茫o de leitura e escrita.',
+    docLink: 'Visite nossa documenta莽茫o para saber mais.',
+    button: 'Adicionar Vari谩vel',
+    modal: {
+      title: 'Adicionar Vari谩vel de Conversa莽茫o',
+      editTitle: 'Editar Vari谩vel de Conversa莽茫o',
+      name: 'Nome',
+      namePlaceholder: 'Nome da vari谩vel',
+      type: 'Tipo',
+      value: 'Valor Padr茫o',
+      valuePlaceholder: 'Valor padr茫o, deixe em branco para n茫o definir',
+      description: 'Descri莽茫o',
+      descriptionPlaceholder: 'Descreva a vari谩vel',
+      editInJSON: 'Editar em JSON',
+      oneByOne: 'Adicionar um por um',
+      editInForm: 'Editar no Formul谩rio',
+      arrayValue: 'Valor',
+      addArrayValue: 'Adicionar Valor',
+      objectKey: 'Chave',
+      objectType: 'Tipo',
+      objectValue: 'Valor Padr茫o',
+    },
+    storedContent: 'Conte煤do armazenado',
+    updatedAt: 'Atualizado em ',
+  },
+  changeHistory: {
+    title: 'Hist贸rico de altera莽玫es',
+    placeholder: 'Voc锚 ainda n茫o alterou nada',
+    clearHistory: 'Limpar hist贸rico',
+    hint: 'Dica',
+    hintText: 'As a莽玫es de edi莽茫o s茫o rastreadas em um hist贸rico de altera莽玫es, que 茅 armazenado em seu dispositivo para a dura莽茫o desta sess茫o. Este hist贸rico ser谩 apagado quando voc锚 sair do editor.',
+    stepBackward_one: '{{count}} passo para tr谩s',
+    stepBackward_other: '{{count}} passos para tr谩s',
+    stepForward_one: '{{count}} passo para frente',
+    stepForward_other: '{{count}} passos para frente',
+    sessionStart: 'In铆cio da sess茫o',
+    currentState: 'Estado atual',
+    nodeTitleChange: 'T铆tulo do bloco alterado',
+    nodeDescriptionChange: 'Descri莽茫o do bloco alterada',
+    nodeDragStop: 'Bloco movido',
+    nodeChange: 'Bloco alterado',
+    nodeConnect: 'Bloco conectado',
+    nodePaste: 'Bloco colado',
+    nodeDelete: 'Bloco exclu铆do',
+    nodeAdd: 'Bloco adicionado',
+    nodeResize: 'Nota redimensionada',
+    noteAdd: 'Nota adicionada',
+    noteChange: 'Nota alterada',
+    noteDelete: 'Conex茫o exclu铆da',
+    edgeDelete: 'Bloco desconectado',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 茅 obrigat贸rio',
+    authRequired: 'Autoriza莽茫o 茅 necess谩ria',
+    invalidJson: '{{field}} 茅 um JSON inv谩lido',
+    fields: {
+      variable: 'Nome da vari谩vel',
+      variableValue: 'Valor da vari谩vel',
+      code: 'C贸digo',
+      model: 'Modelo',
+      rerankModel: 'Modelo de reordena莽茫o',
+      visionVariable: 'Vari谩vel de vis茫o',
+    },
+    invalidVariable: 'Vari谩vel inv谩lida',
+    rerankModelRequired: 'Antes de ativar o modelo de reclassifica莽茫o, confirme se o modelo foi configurado com sucesso nas configura莽玫es.',
+    toolParameterRequired: '{{field}}: o par芒metro [{{param}}] 茅 necess谩rio',
+    noValidTool: '{{field}} nenhuma ferramenta v谩lida selecionada',
+  },
+  singleRun: {
+    testRun: 'Execu莽茫o de teste ',
+    startRun: 'Iniciar execu莽茫o',
+    running: 'Executando',
+    testRunIteration: 'Itera莽茫o de execu莽茫o de teste',
+    back: 'Voltar',
+    iteration: 'Itera莽茫o',
+    loop: 'La莽o',
+  },
+  tabs: {
+    'searchBlock': 'Buscar bloco',
+    'blocks': 'Blocos',
+    'tools': 'Ferramentas',
+    'allTool': 'Todos',
+    'builtInTool': 'Integrado',
+    'customTool': 'Personalizado',
+    'workflowTool': 'Fluxo de trabalho',
+    'question-understand': 'Compreens茫o de perguntas',
+    'logic': 'L贸gica',
+    'transform': 'Transformar',
+    'utilities': 'Utilit谩rios',
+    'noResult': 'Nenhum resultado encontrado',
+    'searchTool': 'Ferramenta de pesquisa',
+    'plugin': 'Plug-in',
+    'agent': 'Estrat茅gia do agente',
+  },
+  blocks: {
+    'start': 'Iniciar',
+    'end': 'Fim',
+    'answer': 'Resposta',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'Recupera莽茫o de conhecimento',
+    'question-classifier': 'Classificador de perguntas',
+    'if-else': 'SE/SEN脙O',
+    'code': 'C贸digo',
+    'template-transform': 'Modelo',
+    'http-request': 'Requisi莽茫o HTTP',
+    'variable-assigner': 'Atribuidor de vari谩veis',
+    'variable-aggregator': 'Agregador de vari谩veis',
+    'assigner': 'Atribuidor de Vari谩veis',
+    'iteration-start': 'In铆cio de itera莽茫o',
+    'iteration': 'Itera莽茫o',
+    'parameter-extractor': 'Extrator de par芒metros',
+    'list-operator': 'Operador de lista',
+    'document-extractor': 'Extrator de documentos',
+    'agent': 'Agente',
+    'loop-end': 'Sair do Loop',
+    'loop-start': 'In铆cio do Loop',
+    'loop': 'La莽o',
+  },
+  blocksAbout: {
+    'start': 'Definir os par芒metros iniciais para iniciar um fluxo de trabalho',
+    'end': 'Definir o fim e o tipo de resultado de um fluxo de trabalho',
+    'answer': 'Definir o conte煤do da resposta de uma conversa',
+    'llm': 'Invocar grandes modelos de linguagem para responder perguntas ou processar linguagem natural',
+    'knowledge-retrieval': 'Permite consultar conte煤do de texto relacionado a perguntas do usu谩rio a partir da base de conhecimento',
+    'question-classifier': 'Definir as condi莽玫es de classifica莽茫o das perguntas dos usu谩rios, LLM pode definir como a conversa progride com base na descri莽茫o da classifica莽茫o',
+    'if-else': 'Permite dividir o fluxo de trabalho em dois ramos com base nas condi莽玫es if/else',
+    'code': 'Executar um peda莽o de c贸digo Python ou NodeJS para implementar l贸gica personalizada',
+    'template-transform': 'Converter dados em string usando a sintaxe de template Jinja',
+    'http-request': 'Permitir que solicita莽玫es de servidor sejam enviadas pelo protocolo HTTP',
+    'variable-assigner': 'Agregue vari谩veis de v谩rios ramos em uma 煤nica vari谩vel para configura莽茫o unificada dos n贸s finais.',
+    'assigner': 'O n贸 de atribui莽茫o de vari谩veis 茅 usado para atribuir valores a vari谩veis grav谩veis (como vari谩veis de conversa莽茫o).',
+    'variable-aggregator': 'Agregue vari谩veis de v谩rios ramos em uma 煤nica vari谩vel para configura莽茫o unificada dos n贸s finais.',
+    'iteration': 'Execute m煤ltiplos passos em um objeto lista at茅 que todos os resultados sejam produzidos.',
+    'parameter-extractor': 'Use LLM para extrair par芒metros estruturados da linguagem natural para invoca莽玫es de ferramentas ou requisi莽玫es HTTP.',
+    'document-extractor': 'Usado para analisar documentos carregados em conte煤do de texto que 茅 facilmente compreens铆vel pelo LLM.',
+    'list-operator': 'Usado para filtrar ou classificar o conte煤do da matriz.',
+    'agent': 'Invocar grandes modelos de linguagem para responder a perguntas ou processar linguagem natural',
+    'loop-end': 'Equivalente a "break". Este n贸 n茫o possui itens de configura莽茫o. Quando o corpo do loop atinge este n贸, o loop termina.',
+    'loop': 'Execute um loop de l贸gica at茅 que a condi莽茫o de t茅rmino seja atendida ou o n煤mero m谩ximo de loops seja alcan莽ado.',
+  },
+  operator: {
+    zoomIn: 'Aproximar',
+    zoomOut: 'Afastar',
+    zoomTo50: 'Aproximar para 50%',
+    zoomTo100: 'Aproximar para 100%',
+    zoomToFit: 'Aproximar para ajustar',
+  },
+  panel: {
+    userInputField: 'Campo de entrada do usu谩rio',
+    changeBlock: 'Mudar bloco',
+    helpLink: 'Link de ajuda',
+    about: 'Sobre',
+    createdBy: 'Criado por ',
+    nextStep: 'Pr贸ximo passo',
+    addNextStep: 'Adicionar o pr贸ximo bloco neste fluxo de trabalho',
+    selectNextStep: 'Selecionar pr贸ximo bloco',
+    runThisStep: 'Executar este passo',
+    checklist: 'Lista de verifica莽茫o',
+    checklistTip: 'Certifique-se de que todos os problemas foram resolvidos antes de publicar',
+    checklistResolved: 'Todos os problemas foram resolvidos',
+    organizeBlocks: 'Organizar blocos',
+    change: 'Mudar',
+    optional: '(opcional)',
+  },
+  nodes: {
+    common: {
+      outputVars: 'Vari谩veis de sa铆da',
+      insertVarTip: 'Inserir vari谩vel',
+      memory: {
+        memory: 'Mem贸ria',
+        memoryTip: 'Configura莽玫es de mem贸ria de conversa',
+        windowSize: 'Tamanho da janela',
+        conversationRoleName: 'Nome do papel na conversa',
+        user: 'Prefixo do usu谩rio',
+        assistant: 'Prefixo do assistente',
+      },
+      memories: {
+        title: 'Mem贸rias',
+        tip: 'Mem贸ria de conversa',
+        builtIn: 'Integrado',
+      },
+      errorHandle: {
+        none: {
+          title: 'Nenhum',
+          desc: 'O n贸 deixar谩 de ser executado se ocorrer uma exce莽茫o e n茫o for tratada',
+        },
+        defaultValue: {
+          title: 'Valor padr茫o',
+          desc: 'Quando ocorrer um erro, especifique um conte煤do de sa铆da est谩tico.',
+          tip: 'Em caso de erro, retornar谩 o valor abaixo.',
+          inLog: 'Exce莽茫o de n贸, sa铆da de acordo com os valores padr茫o.',
+          output: 'Valor padr茫o de sa铆da',
+        },
+        failBranch: {
+          title: 'Ramifica莽茫o com falha',
+          desc: 'Quando ocorrer um erro, ele executar谩 a ramifica莽茫o de exce莽茫o',
+          customize: 'V谩 para a tela para personalizar a l贸gica do branch de falha.',
+          customizeTip: 'Quando a ramifica莽茫o de falha 茅 ativada, as exce莽玫es geradas pelos n贸s n茫o encerram o processo. Em vez disso, ele executar谩 automaticamente a ramifica莽茫o de falha predefinida, permitindo que voc锚 forne莽a mensagens de erro, relat贸rios, corre莽玫es ou a莽玫es de salto com flexibilidade.',
+          inLog: 'Node exception, executar谩 automaticamente a ramifica莽茫o de falha. A sa铆da do n贸 retornar谩 um tipo de erro e uma mensagem de erro e os passar谩 para o downstream.',
+        },
+        partialSucceeded: {
+          tip: 'Existem {{num}} n贸s no processo em execu莽茫o anormal, v谩 para rastreamento para verificar os logs.',
+        },
+        title: 'Tratamento de erros',
+        tip: 'Estrat茅gia de tratamento de exce莽玫es, disparada quando um n贸 encontra uma exce莽茫o.',
+      },
+      retry: {
+        retry: 'Repetir',
+        retryOnFailure: 'Tentar novamente em caso de falha',
+        maxRetries: 'M谩ximo de tentativas',
+        retryInterval: 'Intervalo de repeti莽茫o',
+        retryTimes: 'Tente novamente {{times}} vezes em caso de falha',
+        retrying: 'Repetindo...',
+        retrySuccessful: 'Repeti莽茫o bem-sucedida',
+        retryFailed: 'Falha na nova tentativa',
+        retryFailedTimes: '{{times}} tentativas falharam',
+        times: 'vezes',
+        ms: 'ms',
+        retries: '{{num}} Tentativas',
+      },
+    },
+    start: {
+      required: 'requerido',
+      inputField: 'Campo de entrada',
+      builtInVar: 'Vari谩veis integradas',
+      outputVars: {
+        query: 'Entrada do usu谩rio',
+        memories: {
+          des: 'Hist贸rico da conversa',
+          type: 'tipo de mensagem',
+          content: 'conte煤do da mensagem',
+        },
+        files: 'Lista de arquivos',
+      },
+      noVarTip: 'Defina as entradas que podem ser usadas no Fluxo de Trabalho',
+    },
+    end: {
+      outputs: 'Sa铆das',
+      output: {
+        type: 'tipo de sa铆da',
+        variable: 'vari谩vel de sa铆da',
+      },
+      type: {
+        'none': 'Nenhum',
+        'plain-text': 'Texto simples',
+        'structured': 'Estruturado',
+      },
+    },
+    answer: {
+      answer: 'Resposta',
+      outputVars: 'Vari谩veis de sa铆da',
+    },
+    llm: {
+      model: 'modelo',
+      variables: 'vari谩veis',
+      context: 'contexto',
+      contextTooltip: 'Voc锚 pode importar Conhecimento como contexto',
+      notSetContextInPromptTip: 'Para ativar o recurso de contexto, preencha a vari谩vel de contexto no PROMPT.',
+      prompt: 'prompt',
+      roleDescription: {
+        system: 'Dar instru莽玫es de alto n铆vel para a conversa',
+        user: 'Fornecer instru莽玫es, consultas ou qualquer entrada baseada em texto para o modelo',
+        assistant: 'As respostas do modelo baseadas nas mensagens do usu谩rio',
+      },
+      addMessage: 'Adicionar mensagem',
+      vision: 'vis茫o',
+      files: 'Arquivos',
+      resolution: {
+        name: 'Resolu莽茫o',
+        high: 'Alta',
+        low: 'Baixa',
+      },
+      outputVars: {
+        output: 'Conte煤do gerado',
+        usage: 'Informa莽玫es de uso do modelo',
+      },
+      singleRun: {
+        variable: 'Vari谩vel',
+      },
+      sysQueryInUser: 'sys.query na mensagem do usu谩rio 茅 necess谩rio',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: 'Por favor, termine de editar o campo atual antes de salvar o esquema.',
+        },
+        instruction: 'Instru莽茫o',
+        showAdvancedOptions: 'Mostrar op莽玫es avan莽adas',
+        addField: 'Adicionar Campo',
+        descriptionPlaceholder: 'Adicionar descri莽茫o',
+        promptTooltip: 'Converta a descri莽茫o do texto em uma estrutura de esquema JSON padronizada.',
+        generating: 'Gerando esquema JSON...',
+        generate: 'Gerar',
+        title: 'Esquema de Sa铆da Estruturada',
+        promptPlaceholder: 'Descreva seu Esquema JSON...',
+        back: 'Voltar',
+        doc: 'Saiba mais sobre sa铆da estruturada',
+        regenerate: 'Regenerar',
+        resultTip: 'Aqui est谩 o resultado gerado. Se voc锚 n茫o estiver satisfeito, pode voltar e modificar seu pedido.',
+        addChildField: 'Adicionar Campo de Crian莽a',
+        generationTip: 'Voc锚 pode usar linguagem natural para criar rapidamente um esquema JSON.',
+        generatedResult: 'Resultado Gerado',
+        import: 'Importar de JSON',
+        generateJsonSchema: 'Gerar Esquema JSON',
+        fieldNamePlaceholder: 'Nome do Campo',
+        resetDefaults: 'Reiniciar',
+        stringValidations: 'Valida莽玫es de String',
+        apply: 'Aplicar',
+        required: 'obrigat贸rio',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'Vari谩vel de consulta',
+      knowledge: 'Conhecimento',
+      outputVars: {
+        output: 'Dados segmentados recuperados',
+        content: 'Conte煤do segmentado',
+        title: 'T铆tulo segmentado',
+        icon: '脥cone segmentado',
+        url: 'URL segmentado',
+        metadata: 'Outros metadados',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            subTitle: 'N茫o ativando a filtragem de metadados',
+            title: 'Desativado',
+          },
+          automatic: {
+            desc: 'Gere automaticamente condi莽玫es de filtragem de metadados com base na Vari谩vel de Consulta',
+            title: 'Autom谩tico',
+            subTitle: 'Gerar automaticamente condi莽玫es de filtragem de metadados com base na consulta do usu谩rio',
+          },
+          manual: {
+            title: 'Manual',
+            subTitle: 'Adicione manualmente as condi莽玫es de filtragem de metadados',
+          },
+        },
+        panel: {
+          add: 'Adicionar Condi莽茫o',
+          select: 'Selecione a vari谩vel...',
+          datePlaceholder: 'Escolha um hor谩rio...',
+          search: 'Pesquisar metadados',
+          conditions: 'Condi莽玫es',
+          title: 'Condi莽玫es de filtro de metadados',
+          placeholder: 'Insira o valor',
+        },
+        title: 'Filtragem de Metadados',
+      },
+    },
+    http: {
+      inputVars: 'Vari谩veis de entrada',
+      api: 'API',
+      apiPlaceholder: 'Digite a URL, digite 鈥�/鈥� para inserir vari谩vel',
+      notStartWithHttp: 'API deve come莽ar com http:// ou https://',
+      key: 'Chave',
+      value: 'Valor',
+      bulkEdit: 'Edi莽茫o em massa',
+      keyValueEdit: 'Edi莽茫o chave-valor',
+      headers: 'Cabe莽alhos',
+      params: 'Par芒metros',
+      body: 'Corpo',
+      outputVars: {
+        body: 'Conte煤do da resposta',
+        statusCode: 'C贸digo de status da resposta',
+        headers: 'Lista de cabe莽alhos da resposta em JSON',
+        files: 'Lista de arquivos',
+      },
+      authorization: {
+        'authorization': 'Autoriza莽茫o',
+        'authorizationType': 'Tipo de autoriza莽茫o',
+        'no-auth': 'Nenhuma',
+        'api-key': 'Chave API',
+        'auth-type': 'Tipo de autoriza莽茫o',
+        'basic': 'B谩sica',
+        'bearer': 'Bearer',
+        'custom': 'Personalizada',
+        'api-key-title': 'Chave API',
+        'header': 'Cabe莽alho',
+      },
+      insertVarPlaceholder: 'digite \'/\' para inserir vari谩vel',
+      timeout: {
+        title: 'Timeout',
+        connectLabel: 'Timeout de conex茫o',
+        connectPlaceholder: 'Digite o timeout de conex茫o em segundos',
+        readLabel: 'Timeout de leitura',
+        readPlaceholder: 'Digite o timeout de leitura em segundos',
+        writeLabel: 'Timeout de escrita',
+        writePlaceholder: 'Digite o timeout de escrita em segundos',
+      },
+      type: 'Tipo',
+      binaryFileVariable: 'Vari谩vel de arquivo bin谩rio',
+      extractListPlaceholder: 'Insira o 铆ndice do item da lista, digite \'/\' inserir vari谩vel',
+      curl: {
+        placeholder: 'Cole a string cURL aqui',
+        title: 'Importar do cURL',
+      },
+    },
+    code: {
+      inputVars: 'Vari谩veis de entrada',
+      outputVars: 'Vari谩veis de sa铆da',
+      advancedDependencies: 'Depend锚ncias avan莽adas',
+      advancedDependenciesTip: 'Adicione algumas depend锚ncias pr茅-carregadas que levam mais tempo para consumir ou n茫o s茫o padr茫o aqui',
+      searchDependencies: 'Buscar depend锚ncias',
+    },
+    templateTransform: {
+      inputVars: 'Vari谩veis de entrada',
+      code: 'C贸digo',
+      codeSupportTip: 'Suporta apenas Jinja2',
+      outputVars: {
+        output: 'Conte煤do transformado',
+      },
+    },
+    ifElse: {
+      if: 'Se',
+      else: 'Sen茫o',
+      elseDescription: 'Usado para definir a l贸gica que deve ser executada quando a condi莽茫o if n茫o 茅 atendida.',
+      and: 'e',
+      or: 'ou',
+      operator: 'Operador',
+      notSetVariable: 'Por favor, defina a vari谩vel primeiro',
+      comparisonOperator: {
+        'contains': 'cont茅m',
+        'not contains': 'n茫o cont茅m',
+        'start with': 'come莽a com',
+        'end with': 'termina com',
+        'is': '茅',
+        'is not': 'n茫o 茅',
+        'empty': 'est谩 vazio',
+        'not empty': 'n茫o est谩 vazio',
+        'null': '茅 nulo',
+        'not null': 'n茫o 茅 nulo',
+        'regex match': 'partida regex',
+        'in': 'em',
+        'not in': 'n茫o em',
+        'exists': 'Existe',
+        'not exists': 'n茫o existe',
+        'all of': 'todos os',
+        'after': 'depois',
+        'before': 'antes',
+      },
+      enterValue: 'Digite o valor',
+      addCondition: 'Adicionar condi莽茫o',
+      conditionNotSetup: 'Condi莽茫o N脙O configurada',
+      selectVariable: 'Selecione a vari谩vel...',
+      optionName: {
+        image: 'Imagem',
+        doc: 'Doc',
+        url: 'URL',
+        audio: '脕udio',
+        video: 'V铆deo',
+        localUpload: 'Local Upload',
+      },
+      addSubVariable: 'Subvari谩vel',
+      select: 'Selecionar',
+      condition: 'Condi莽茫o',
+    },
+    variableAssigner: {
+      title: 'Atribuir vari谩veis',
+      outputType: 'Tipo de sa铆da',
+      varNotSet: 'Vari谩vel n茫o definida',
+      noVarTip: 'Adicione as vari谩veis a serem atribu铆das',
+      type: {
+        string: 'String',
+        number: 'N煤mero',
+        object: 'Objeto',
+        array: 'Array',
+      },
+      aggregationGroup: 'Grupo de agrega莽茫o',
+      aggregationGroupTip: 'Habilitar este recurso permite que o agregador de vari谩veis agregue m煤ltiplos conjuntos de vari谩veis.',
+      addGroup: 'Adicionar grupo',
+      outputVars: {
+        varDescribe: 'Sa铆da de {{groupName}}',
+      },
+      setAssignVariable: 'Definir vari谩vel atribu铆da',
+    },
+    assigner: {
+      'assignedVariable': 'Vari谩vel Atribu铆da',
+      'writeMode': 'Modo de Escrita',
+      'writeModeTip': 'Quando a VARI脕VEL ATRIBU脥DA 茅 um array, o modo de anexar adiciona ao final.',
+      'over-write': 'Sobrescrever',
+      'append': 'Anexar',
+      'plus': 'Mais',
+      'clear': 'Limpar',
+      'setVariable': 'Definir Vari谩vel',
+      'variable': 'Vari谩vel',
+      'operations': {
+        'clear': 'Claro',
+        'title': 'Opera莽茫o',
+        'over-write': 'Sobrescrever',
+        '-=': '-=',
+        '/=': '/=',
+        '*=': '*=',
+        'extend': 'Estender',
+        'append': 'Acrescentar',
+        '+=': '+=',
+        'set': 'P么r',
+        'overwrite': 'Sobrescrever',
+        'remove-last': 'Remover 脷ltimo',
+        'remove-first': 'Remover Primeiro',
+      },
+      'selectAssignedVariable': 'Selecione a vari谩vel atribu铆da...',
+      'setParameter': 'Definir par芒metro...',
+      'noVarTip': 'Clique no bot茫o "+" para adicionar vari谩veis',
+      'assignedVarsDescription': 'As vari谩veis atribu铆das devem ser vari谩veis grav谩veis, como vari谩veis de conversa莽茫o.',
+      'varNotSet': 'Vari谩vel N脙O definida',
+      'noAssignedVars': 'Nenhuma vari谩vel atribu铆da dispon铆vel',
+      'variables': 'Vari谩veis',
+    },
+    tool: {
+      toAuthorize: 'Autorizar',
+      inputVars: 'Vari谩veis de entrada',
+      outputVars: {
+        text: 'conte煤do gerado pela ferramenta',
+        files: {
+          title: 'arquivos gerados pela ferramenta',
+          type: 'Tipo de suporte. Agora suporta apenas imagem',
+          transfer_method: 'M茅todo de transfer锚ncia. O valor 茅 remote_url ou local_file',
+          url: 'URL da imagem',
+          upload_file_id: 'ID do arquivo enviado',
+        },
+        json: 'JSON gerado por ferramenta',
+      },
+    },
+    questionClassifiers: {
+      model: 'modelo',
+      inputVars: 'Vari谩veis de entrada',
+      outputVars: {
+        className: 'Nome da classe',
+      },
+      class: 'Classe',
+      classNamePlaceholder: 'Escreva o nome da sua classe',
+      advancedSetting: 'Configura莽茫o avan莽ada',
+      topicName: 'Nome do t贸pico',
+      topicPlaceholder: 'Escreva o nome do seu t贸pico',
+      addClass: 'Adicionar classe',
+      instruction: 'Instru莽茫o',
+      instructionTip: 'Insira instru莽玫es adicionais para ajudar o classificador de perguntas a entender melhor como categorizar perguntas.',
+      instructionPlaceholder: 'Escreva sua instru莽茫o',
+    },
+    parameterExtractor: {
+      inputVar: 'Vari谩vel de entrada',
+      extractParameters: 'Extrair par芒metros',
+      importFromTool: 'Importar das ferramentas',
+      addExtractParameter: 'Adicionar par芒metro de extra莽茫o',
+      addExtractParameterContent: {
+        name: 'Nome',
+        namePlaceholder: 'Nome do par芒metro de extra莽茫o',
+        type: 'Tipo',
+        typePlaceholder: 'Tipo de par芒metro de extra莽茫o',
+        description: 'Descri莽茫o',
+        descriptionPlaceholder: 'Descri莽茫o do par芒metro de extra莽茫o',
+        required: 'Obrigat贸rio',
+        requiredContent: 'Obrigat贸rio 茅 usado apenas como refer锚ncia para infer锚ncia do modelo, e n茫o para valida莽茫o obrigat贸ria da sa铆da do par芒metro.',
+      },
+      extractParametersNotSet: 'Par芒metros de extra莽茫o n茫o configurados',
+      instruction: 'Instru莽茫o',
+      instructionTip: 'Insira instru莽玫es adicionais para ajudar o extrator de par芒metros a entender como extrair par芒metros.',
+      advancedSetting: 'Configura莽茫o avan莽ada',
+      reasoningMode: 'Modo de racioc铆nio',
+      reasoningModeTip: 'Voc锚 pode escolher o modo de racioc铆nio apropriado com base na capacidade do modelo de responder a instru莽玫es para chamadas de fun莽茫o ou prompts.',
+      isSuccess: '脡 sucesso. Em caso de sucesso, o valor 茅 1, em caso de falha, o valor 茅 0.',
+      errorReason: 'Motivo do erro',
+    },
+    iteration: {
+      deleteTitle: 'Excluir n贸 de itera莽茫o?',
+      deleteDesc: 'Excluir o n贸 de itera莽茫o excluir谩 todos os n贸s filhos',
+      input: 'Entrada',
+      output: 'Vari谩veis de sa铆da',
+      iteration_one: '{{count}} Itera莽茫o',
+      iteration_other: '{{count}} Itera莽玫es',
+      currentIteration: 'Itera莽茫o atual',
+      ErrorMethod: {
+        continueOnError: 'continuar em erro',
+        removeAbnormalOutput: 'sa铆da anormal de remo莽茫o',
+        operationTerminated: 'Terminada',
+      },
+      MaxParallelismTitle: 'Paralelismo m谩ximo',
+      parallelModeEnableTitle: 'Modo paralelo ativado',
+      errorResponseMethod: 'M茅todo de resposta de erro',
+      error_other: '{{contagem}} Erros',
+      parallelMode: 'Modo paralelo',
+      parallelModeUpper: 'MODO PARALELO',
+      error_one: '{{contagem}} Erro',
+      parallelModeEnableDesc: 'No modo paralelo, as tarefas dentro das itera莽玫es d茫o suporte 脿 execu莽茫o paralela. Voc锚 pode configurar isso no painel de propriedades 脿 direita.',
+      comma: ',',
+      MaxParallelismDesc: 'O paralelismo m谩ximo 茅 usado para controlar o n煤mero de tarefas executadas simultaneamente em uma 煤nica itera莽茫o.',
+      answerNodeWarningDesc: 'Aviso de modo paralelo: n贸s de resposta, atribui莽玫es de vari谩veis de conversa莽茫o e opera莽玫es persistentes de leitura/grava莽茫o em itera莽玫es podem causar exce莽玫es.',
+      parallelPanelDesc: 'No modo paralelo, as tarefas na itera莽茫o d茫o suporte 脿 execu莽茫o paralela.',
+    },
+    note: {
+      editor: {
+        small: 'Pequeno',
+        bold: 'Ousado',
+        openLink: 'Abrir',
+        strikethrough: 'Tachado',
+        italic: 'It谩lico',
+        invalidUrl: 'URL inv谩lido',
+        placeholder: 'Escreva sua nota...',
+        bulletList: 'Lista de marcadores',
+        link: 'Link',
+        enterUrl: 'Digite o URL...',
+        medium: 'M茅dia',
+        large: 'Grande',
+        unlink: 'Desvincular',
+        showAuthor: 'Autor do programa',
+      },
+      addNote: 'Adicionar nota',
+    },
+    docExtractor: {
+      outputVars: {
+        text: 'Texto extra铆do',
+      },
+      inputVar: 'Vari谩vel de entrada',
+      learnMore: 'Saiba Mais',
+      supportFileTypes: 'Tipos de arquivo de suporte: {{types}}.',
+    },
+    listFilter: {
+      outputVars: {
+        result: 'Resultado do filtro',
+        last_record: '脷ltimo recorde',
+        first_record: 'Primeiro registro',
+      },
+      desc: 'DESC',
+      inputVar: 'Vari谩vel de entrada',
+      selectVariableKeyPlaceholder: 'Selecione a chave da subvari谩vel',
+      limit: 'Topo N',
+      orderBy: 'Ordenar por',
+      filterCondition: 'Condi莽茫o do filtro',
+      asc: 'ASC',
+      filterConditionKey: 'Chave de condi莽茫o do filtro',
+      filterConditionComparisonOperator: 'Operador de compara莽茫o de condi莽茫o de filtro',
+      filterConditionComparisonValue: 'Valor da condi莽茫o do filtro',
+      extractsCondition: 'Extraia o item N',
+    },
+    agent: {
+      strategy: {
+        tooltip: 'Diferentes estrat茅gias Agentic determinam como o sistema planeja e executa chamadas de ferramentas de v谩rias etapas',
+        searchPlaceholder: 'Estrat茅gia de busca ag锚ntica',
+        shortLabel: 'Estrat茅gia',
+        label: 'Estrat茅gia Ag锚ntica',
+        selectTip: 'Selecione a estrat茅gia ag锚ntica',
+        configureTipDesc: 'Depois de configurar a estrat茅gia ag锚ntica, esse n贸 carregar谩 automaticamente as configura莽玫es restantes. A estrat茅gia afetar谩 o mecanismo de racioc铆nio da ferramenta de v谩rias etapas.',
+        configureTip: 'Configure a estrat茅gia agente.',
+      },
+      pluginInstaller: {
+        installing: 'Instalar',
+        install: 'Instalar',
+      },
+      modelNotInMarketplace: {
+        desc: 'Esse modelo 茅 instalado do reposit贸rio Local ou GitHub. Por favor, use ap贸s a instala莽茫o.',
+        title: 'Modelo n茫o instalado',
+        manageInPlugins: 'Gerenciar em plug-ins',
+      },
+      modelNotSupport: {
+        descForVersionSwitch: 'A vers茫o do plug-in instalada n茫o fornece esse modelo. Clique para mudar de vers茫o.',
+        title: 'Modelo n茫o suportado',
+        desc: 'A vers茫o do plug-in instalada n茫o fornece esse modelo.',
+      },
+      modelSelectorTooltips: {
+        deprecated: 'Este modelo est谩 obsoleto',
+      },
+      outputVars: {
+        files: {
+          type: 'Tipo de suporte. Agora suporta apenas imagem',
+          upload_file_id: 'Carregar ID do arquivo',
+          url: 'URL da imagem',
+          transfer_method: 'M茅todo de transfer锚ncia. O valor 茅 remote_url ou local_file',
+          title: 'Arquivos gerados pelo agente',
+        },
+        json: 'JSON gerado pelo agente',
+        text: 'Conte煤do gerado pelo agente',
+      },
+      checkList: {
+        strategyNotSelected: 'Estrat茅gia n茫o selecionada',
+      },
+      installPlugin: {
+        title: 'Instale o plugin',
+        install: 'Instalar',
+        cancel: 'Cancelar',
+        desc: 'Prestes a instalar o seguinte plugin',
+        changelog: 'Registro de altera莽玫es',
+      },
+      toolNotInstallTooltip: '{{tool}} n茫o est谩 instalado',
+      strategyNotFoundDesc: 'A vers茫o do plug-in instalada n茫o fornece essa estrat茅gia.',
+      maxIterations: 'M谩ximo de itera莽玫es',
+      model: 'modelo',
+      strategyNotInstallTooltip: '{{strategy}} n茫o est谩 instalado',
+      learnMore: 'Saiba Mais',
+      modelNotInstallTooltip: 'Este modelo n茫o est谩 instalado',
+      pluginNotFoundDesc: 'Este plugin 茅 instalado a partir do GitHub. Por favor, v谩 para Plugins para reinstalar',
+      pluginNotInstalledDesc: 'Este plugin 茅 instalado a partir do GitHub. Por favor, v谩 para Plugins para reinstalar',
+      strategyNotSet: 'Estrat茅gia ag锚ntica n茫o definida',
+      pluginNotInstalled: 'Este plugin n茫o est谩 instalado',
+      notAuthorized: 'N茫o autorizado',
+      modelNotSelected: 'Modelo n茫o selecionado',
+      linkToPlugin: 'Link para plug-ins',
+      configureModel: 'Configurar modelo',
+      unsupportedStrategy: 'Estrat茅gia sem suporte',
+      strategyNotFoundDescAndSwitchVersion: 'A vers茫o do plug-in instalada n茫o fornece essa estrat茅gia. Clique para mudar de vers茫o.',
+      tools: 'Ferramentas',
+      toolNotAuthorizedTooltip: '{{ferramenta}} N茫o autorizado',
+      toolbox: 'caixa de ferramentas',
+    },
+    loop: {
+      ErrorMethod: {
+        removeAbnormalOutput: 'Remover Sa铆da Anormal',
+        operationTerminated: 'Terminado',
+        continueOnError: 'Continue em Caso de Erro',
+      },
+      errorResponseMethod: 'M茅todo de Resposta de Erro',
+      loop_one: '{{count}} Loop',
+      inputMode: 'Modo de Entrada',
+      setLoopVariables: 'Defina vari谩veis dentro do escopo do loop',
+      totalLoopCount: 'Contagem total de loops: {{count}}',
+      breakCondition: 'Condi莽茫o de T茅rmino de Loop',
+      comma: ',',
+      input: 'Entrada',
+      variableName: 'Nome da Vari谩vel',
+      initialLoopVariables: 'Vari谩veis de Loop Iniciais',
+      exitConditionTip: 'Um n贸 de loop precisa de pelo menos uma condi莽茫o de sa铆da',
+      loopNode: 'N贸 de Loop',
+      loopMaxCount: 'Contagem M谩xima de Loop',
+      currentLoopCount: 'Contagem atual de loops: {{count}}',
+      deleteTitle: 'Excluir N贸 de Loop?',
+      error_other: '{{count}} Erros',
+      loop_other: '{{count}} La莽os',
+      output: 'Vari谩vel de Sa铆da',
+      error_one: '{{count}} Erro',
+      finalLoopVariables: 'Vari谩veis do Loop Final',
+      loopMaxCountError: 'Por favor, insira um limite m谩ximo de loop v谩lido, variando de 1 a {{maxCount}}',
+      loopVariables: 'Vari谩veis de Loop',
+      breakConditionTip: 'Somente vari谩veis dentro de la莽os com condi莽玫es de t茅rmino e vari谩veis de conversa podem ser referenciadas.',
+      currentLoop: 'La莽o Atual',
+      deleteDesc: 'A exclus茫o do n贸 de loop remover谩 todos os n贸s filhos',
+    },
+  },
+  tracing: {
+    stopBy: 'Parado por {{user}}',
+  },
+  variableReference: {
+    noAssignedVars: 'Nenhuma vari谩vel atribu铆da dispon铆vel',
+    noVarsForOperation: 'N茫o h谩 vari谩veis dispon铆veis para atribui莽茫o com a opera莽茫o selecionada.',
+    conversationVars: 'vari谩veis de conversa莽茫o',
+    assignedVarsDescription: 'As vari谩veis atribu铆das devem ser vari谩veis grav谩veis, como',
+    noAvailableVars: 'Nenhuma vari谩vel dispon铆vel',
+  },
+  versionHistory: {
+    filter: {
+      all: 'Todos',
+      empty: 'Nenhuma vers茫o hist贸rica correspondente encontrada',
+      reset: 'Redefinir Filtro',
+      onlyYours: 'Somente seu',
+      onlyShowNamedVersions: 'Mostre apenas vers玫es nomeadas',
+    },
+    editField: {
+      titleLengthLimit: 'O t铆tulo n茫o pode exceder {{limit}} caracteres',
+      releaseNotes: 'Notas de Lan莽amento',
+      releaseNotesLengthLimit: 'As notas de lan莽amento n茫o podem exceder {{limit}} caracteres',
+      title: 'T铆tulo',
+    },
+    action: {
+      updateFailure: 'Falha ao atualizar a vers茫o',
+      updateSuccess: 'Vers茫o atualizada',
+      deleteSuccess: 'Vers茫o exclu铆da',
+      restoreFailure: 'Falha ao restaurar vers茫o',
+      restoreSuccess: 'Vers茫o restaurada',
+      deleteFailure: 'Falha ao deletar vers茫o',
+    },
+    title: 'Vers玫es',
+    latest: '脷ltimo',
+    nameThisVersion: 'Nomeie esta vers茫o',
+    defaultName: 'Vers茫o Sem T铆tulo',
+    releaseNotesPlaceholder: 'Descreva o que mudou',
+    editVersionInfo: 'Editar informa莽玫es da vers茫o',
+    restorationTip: 'Ap贸s a restaura莽茫o da vers茫o, o rascunho atual ser谩 substitu铆do.',
+    currentDraft: 'Rascunho Atual',
+    deletionTip: 'A exclus茫o 茅 irrevers铆vel, por favor confirme.',
+  },
+}
+
+export default translation
diff --git a/i18n/ro-RO/app-annotation.ts b/i18n/ro-RO/app-annotation.ts
new file mode 100644
index 0000000..42fd17c
--- /dev/null
+++ b/i18n/ro-RO/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: 'Anot膬ri',
+  name: 'R膬spuns la Anota葲ie',
+  editBy: 'R膬spuns editat de {{author}}',
+  noData: {
+    title: 'F膬r膬 anot膬ri',
+    description: 'Pute葲i edita anot膬rile 卯n timpul depan膬rii aplica葲iei sau importa葲i anot膬ri 卯n mas膬 aici pentru un r膬spuns de 卯nalt膬 calitate.',
+  },
+  table: {
+    header: {
+      question: '卯ntrebare',
+      answer: 'r膬spuns',
+      createdAt: 'creat la',
+      hits: 'acces膬ri',
+      actions: 'ac葲iuni',
+      addAnnotation: 'Adaug膬 Anota葲ie',
+      bulkImport: 'Import 卯n Mas膬',
+      bulkExport: 'Export 卯n Mas膬',
+      clearAll: '葮terge Toate Anota葲iile',
+    },
+  },
+  editModal: {
+    title: 'Editeaz膬 R膬spunsul la Anota葲ie',
+    queryName: 'Interogare Utilizator',
+    answerName: 'Povestitorul Bot',
+    yourAnswer: 'R膬spunsul T膬u',
+    answerPlaceholder: 'Scrie r膬spunsul t膬u aici',
+    yourQuery: 'Interogarea Ta',
+    queryPlaceholder: 'Scrie interogarea ta aici',
+    removeThisCache: 'Elimin膬 Aceast膬 Anota葲ie',
+    createdAt: 'Creat La',
+  },
+  addModal: {
+    title: 'Adaug膬 R膬spuns la Anota葲ie',
+    queryName: '脦ntrebare',
+    answerName: 'R膬spuns',
+    answerPlaceholder: 'Scrie r膬spunsul aici',
+    queryPlaceholder: 'Scrie 卯ntrebarea aici',
+    createNext: 'Adaug膬 un alt r膬spuns anotat',
+  },
+  batchModal: {
+    title: 'Import 卯n Mas膬',
+    csvUploadTitle: 'Trage 葯i plaseaz膬 fi葯ierul t膬u CSV aici, sau ',
+    browse: 'r膬sfoie葯te',
+    tip: 'Fi葯ierul CSV trebuie s膬 respecte urm膬toarea structur膬:',
+    question: '卯ntrebare',
+    answer: 'r膬spuns',
+    contentTitle: 'con葲inutul sec葲iunii',
+    content: 'con葲inut',
+    template: 'Descarc膬 葯ablonul aici',
+    cancel: 'Anuleaz膬',
+    run: 'Ruleaz膬 Lotul',
+    runError: 'Eroare la rularea lotului',
+    processing: '脦n procesare',
+    completed: 'Import finalizat',
+    error: 'Eroare de Import',
+    ok: 'OK',
+  },
+  errorMessage: {
+    answerRequired: 'R膬spunsul este necesar',
+    queryRequired: '脦ntrebarea este necesar膬',
+  },
+  viewModal: {
+    annotatedResponse: 'R膬spuns Anotat',
+    hitHistory: 'Istoric Acces膬ri',
+    hit: 'Acces',
+    hits: 'Acces膬ri',
+    noHitHistory: 'F膬r膬 istoric de acces膬ri',
+  },
+  hitHistoryTable: {
+    query: 'Interogare',
+    match: 'Potrivire',
+    response: 'R膬spuns',
+    source: 'Surs膬',
+    score: 'Scor',
+    time: 'Timp',
+  },
+  initSetup: {
+    title: 'Configurare Ini葲ial膬 R膬spuns la Anota葲ie',
+    configTitle: 'Configurare R膬spuns la Anota葲ie',
+    confirmBtn: 'Salveaz膬 & Activeaz膬',
+    configConfirmBtn: 'Salveaz膬',
+  },
+  embeddingModelSwitchTip: 'Model de vectorizare a textului anota葲iei, schimbarea modelelor va fi re卯ncorporat膬, rezult芒nd costuri suplimentare.',
+}
+
+export default translation
diff --git a/i18n/ro-RO/app-api.ts b/i18n/ro-RO/app-api.ts
new file mode 100644
index 0000000..09b65e5
--- /dev/null
+++ b/i18n/ro-RO/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'Server API',
+  apiKey: 'Cheia API',
+  status: 'Stare',
+  disabled: 'Dezactivat',
+  ok: '脦n Serviciu',
+  copy: 'Copiaz膬',
+  copied: 'Copiat',
+  play: 'Red膬',
+  pause: 'Pauz膬',
+  playing: '脦n redare',
+  loading: 'Se 卯ncarc膬',
+  merMaid: {
+    rerender: 'Reprocesare',
+  },
+  never: 'Niciodat膬',
+  apiKeyModal: {
+    apiSecretKey: 'Cheia secret膬 API',
+    apiSecretKeyTips: 'Pentru a preveni abuzul API, proteja葲i-v膬 Cheia API. Evita葲i utilizarea ei ca text simplu 卯n codul front-end. :)',
+    createNewSecretKey: 'Creeaz膬 o nou膬 cheie secret膬',
+    secretKey: 'Cheie Secret膬',
+    created: 'CREAT膫',
+    lastUsed: 'ULTIMA UTILIZARE',
+    generateTips: 'P膬stra葲i aceast膬 cheie 卯ntr-un loc sigur 葯i accesibil.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: '葮terge葲i aceast膬 cheie secret膬?',
+    deleteConfirmTips: 'Aceast膬 ac葲iune nu poate fi anulat膬.',
+    ok: 'OK',
+  },
+  completionMode: {
+    title: 'API completare aplica葲ie',
+    info: 'Pentru generarea de text de 卯nalt膬 calitate, cum ar fi articole, rezumate 葯i traduceri, utiliza葲i API-ul de mesaje de completare cu intrare de la utilizator. Generarea de text se bazeaz膬 pe parametrii modelului 葯i 葯abloanele de prompturi stabilite 卯n Ingineria Prompturilor Dify.',
+    createCompletionApi: 'Creeaz膬 mesaj de completare',
+    createCompletionApiTip: 'Creeaz膬 un mesaj de completare pentru a sprijini modul de 卯ntrebare 葯i r膬spuns.',
+    inputsTips: '(Op葲ional) Furniza葲i c芒mpuri de intrare pentru utilizator ca perechi cheie-valoare, corespunz膬toare variabilelor din Ingineria Prompt. Cheia este numele variabilei, Valoarea este valoarea parametrului. Dac膬 tipul de c芒mp este Select, Valoarea trimis膬 trebuie s膬 fie una dintre op葲iunile prestabilite.',
+    queryTips: 'Con葲inutul textului de intrare al utilizatorului.',
+    blocking: 'Tip blocant, a葯tept芒nd finalizarea execu葲iei 葯i returnarea rezultatelor. (Cererea poate fi 卯ntrerupt膬 dac膬 procesul este lung)',
+    streaming: 'returnare 卯n flux. Implementarea return膬rii 卯n flux bazat膬 pe SSE (Evenimente trimise de server).',
+    messageFeedbackApi: 'Feedback mesaj (apreciere)',
+    messageFeedbackApiTip: 'Evalueaz膬 mesajele primite 卯n numele utilizatorilor finali cu aprecieri sau dezaprecieri. Aceste date sunt vizibile 卯n pagina Jurnale & Anota葲ii 葯i sunt utilizate pentru ajustarea fin膬 a modelului viitor.',
+    messageIDTip: 'ID mesaj',
+    ratingTip: 'apreciere sau dezapreciere, nul este anulare',
+    parametersApi: 'Ob葲ine葲i informa葲ii despre parametrii aplica葲iei',
+    parametersApiTip: 'Recupera葲i parametrii de intrare configura葲i, inclusiv numele variabilelor, denumirile c芒mpurilor, tipurile 葯i valorile implicite. De obicei, sunt folosi葲i pentru a afi葯a aceste c芒mpuri 卯ntr-un formular sau pentru a completa valorile implicite dup膬 卯nc膬rcarea clientului.',
+  },
+  chatMode: {
+    title: 'API chat aplica葲ie',
+    info: 'Pentru aplica葲ii conversa葲ionale versatile folosind un format Q&A, apela葲i API-ul de mesaje de chat pentru a ini葲ia un dialog. Men葲ine葲i conversa葲iile continue transmit芒nd conversation_id returnat. Parametrii de r膬spuns 葯i 葯abloanele depind de set膬rile Ingineriei Prompt Dify.',
+    createChatApi: 'Creeaz膬 mesaj de chat',
+    createChatApiTip: 'Creeaz膬 un nou mesaj de conversa葲ie sau continu膬 un dialog existent.',
+    inputsTips: '(Op葲ional) Furniza葲i c芒mpuri de intrare pentru utilizator ca perechi cheie-valoare, corespunz膬toare variabilelor din Ingineria Prompt. Cheia este numele variabilei, Valoarea este valoarea parametrului. Dac膬 tipul de c芒mp este Select, Valoarea trimis膬 trebuie s膬 fie una dintre op葲iunile prestabilite.',
+    queryTips: 'Con葲inutul 卯ntreb膬rii/utilizatorului introdus',
+    blocking: 'Tip blocant, a葯tept芒nd finalizarea execu葲iei 葯i returnarea rezultatelor. (Cererea poate fi 卯ntrerupt膬 dac膬 procesul este lung)',
+    streaming: 'returnare 卯n flux. Implementarea return膬rii 卯n flux bazat膬 pe SSE (Evenimente trimise de server).',
+    conversationIdTip: '(Op葲ional) ID conversa葲ie: l膬sa葲i gol pentru prima conversa葲ie; transmite葲i conversation_id din context pentru a continua dialogul.',
+    messageFeedbackApi: 'Feedback terminal utilizator mesaj, apreciere',
+    messageFeedbackApiTip: 'Evalueaz膬 mesajele primite 卯n numele utilizatorilor finali cu aprecieri sau dezaprecieri. Aceste date sunt vizibile 卯n pagina Jurnale & Anota葲ii 葯i sunt utilizate pentru ajustarea fin膬 a modelului viitor.',
+    messageIDTip: 'ID mesaj',
+    ratingTip: 'apreciere sau dezapreciere, nul este anulare',
+    chatMsgHistoryApi: 'Ob葲ine葲i istoricul mesajelor de chat',
+    chatMsgHistoryApiTip: 'Prima pagin膬 returneaz膬 ultimele `limit膬` bare, care sunt 卯n ordine invers膬.',
+    chatMsgHistoryConversationIdTip: 'ID conversa葲ie',
+    chatMsgHistoryFirstId: 'ID-ul primului 卯nregistrare de chat de pe pagina curent膬. Implicit este niciunul.',
+    chatMsgHistoryLimit: 'C芒te chat-uri sunt returnate 卯ntr-o singur膬 cerere',
+    conversationsListApi: 'Ob葲ine葲i lista de conversa葲ii',
+    conversationsListApiTip: 'Ob葲ine lista de sesiuni a utilizatorului curent. 脦n mod implicit, ultimele 20 de sesiuni sunt returnate.',
+    conversationsListFirstIdTip: 'ID-ul ultimei 卯nregistr膬ri de pe pagina curent膬, implicit niciunul.',
+    conversationsListLimitTip: 'C芒te chat-uri sunt returnate 卯ntr-o singur膬 cerere',
+    conversationRenamingApi: 'Redenumirea conversa葲iei',
+    conversationRenamingApiTip: 'Redenumi葲i conversa葲iile; numele este afi葯at 卯n interfe葲ele client cu sesiuni multiple.',
+    conversationRenamingNameTip: 'Nume nou',
+    parametersApi: 'Ob葲ine葲i informa葲ii despre parametrii aplica葲iei',
+    parametersApiTip: 'Recupera葲i parametrii de intrare configura葲i, inclusiv numele variabilelor, denumirile c芒mpurilor, tipurile 葯i valorile implicite. De obicei, sunt folosi葲i pentru a afi葯a aceste c芒mpuri 卯ntr-un formular sau pentru a completa valorile implicite dup膬 卯nc膬rcarea clientului.',
+  },
+  develop: {
+    requestBody: 'Corpul cererii',
+    pathParams: 'Parametrii c膬ii',
+    query: 'Interogare',
+    toc: 'Con葲inut',
+  },
+  regenerate: 'Regenera',
+}
+
+export default translation
diff --git a/i18n/ro-RO/app-debug.ts b/i18n/ro-RO/app-debug.ts
new file mode 100644
index 0000000..bafeee8
--- /dev/null
+++ b/i18n/ro-RO/app-debug.ts
@@ -0,0 +1,427 @@
+const translation = {
+  pageTitle: {
+    line1: 'PROMPT',
+    line2: 'Inginerie',
+  },
+  orchestrate: 'Orchestreaz膬',
+  promptMode: {
+    simple: 'Comut膬 la Modul Expert pentru a edita 卯ntregul PROMPT',
+    advanced: 'Mod Expert',
+    switchBack: 'Comut膬 卯napoi',
+    advancedWarning: {
+      title: 'A葲i commutat la Modul Expert 葯i, odat膬 ce modifica葲i PROMPT-ul, NU pute葲i reveni la modul de baz膬.',
+      description: '脦n Modul Expert, pute葲i edita 卯ntregul PROMPT.',
+      learnMore: 'Afla葲i mai multe',
+      ok: 'OK',
+    },
+    operation: {
+      addMessage: 'Adaug膬 mesaj',
+    },
+    contextMissing: 'Component膬 de context lipse葯te, eficacitatea promptului poate s膬 nu fie bun膬.',
+  },
+  operation: {
+    applyConfig: 'Public膬',
+    resetConfig: 'Reseteaz膬',
+    debugConfig: 'Depaneaz膬',
+    addFeature: 'Adaug膬 func葲ie',
+    automatic: 'Automat',
+    stopResponding: 'Opre葯te r膬spunsul',
+    agree: '脦mi place',
+    disagree: 'Nu 卯mi place',
+    cancelAgree: 'Anuleaz膬 脦mi place',
+    cancelDisagree: 'Anuleaz膬 Nu 卯mi place',
+    userAction: 'Utilizator ',
+  },
+  notSetAPIKey: {
+    title: 'Cheia furnizorului LLM nu a fost setat膬',
+    trailFinished: 'Perioada de 卯ncercare a expirat',
+    description: 'Cheia furnizorului LLM nu a fost setat膬 葯i trebuie s膬 fie setat膬 卯nainte de depanare.',
+    settingBtn: 'Du-te la set膬ri',
+  },
+  trailUseGPT4Info: {
+    title: 'Nu se accept膬 acum gpt-4',
+    description: 'Pentru a utiliza gpt-4, v膬 rug膬m s膬 seta葲i cheia API.',
+  },
+  feature: {
+    groupChat: {
+      title: '脦mbun膬t膬葲ire chat',
+      description: 'Ad膬uga葲i set膬ri pre-conversa葲ie pentru aplica葲ii, pentru a 卯mbun膬t膬葲i experien葲a utilizatorilor.',
+    },
+    groupExperience: {
+      title: '脦mbun膬t膬葲ire experien葲膬',
+    },
+    conversationOpener: {
+      title: 'Re卯nc膬rc膬ri conversa葲ie',
+      description: '脦ntr-o aplica葲ie de chat, prima propozi葲ie pe care IA o vorbe葯te 卯n mod activ utilizatorului este de obicei utilizat膬 ca salut.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: 'Urm膬rire',
+      description: 'Setarea sugestiilor pentru 卯ntreb膬rile urm膬toare poate oferi utilizatorilor o conversa葲ie mai bun膬.',
+      resDes: '3 sugestii pentru urm膬toarea 卯ntrebare a utilizatorului.',
+      tryToAsk: '脦ncerca葲i s膬 卯ntreba葲i',
+    },
+    moreLikeThis: {
+      title: 'Mai multe ca aceasta',
+      description: 'Genera葲i mai multe texte o dat膬, apoi edita葲i 葯i continua葲i s膬 genera葲i',
+      generateNumTip: 'Num膬rul de gener膬ri fiec膬ruia',
+      tip: 'Utilizarea acestei func葲ii va genera un consum suplimentar de jetoane',
+    },
+    speechToText: {
+      title: 'Voce la text',
+      description: 'Dup膬 activare, pute葲i utiliza intrarea vocal膬.',
+      resDes: 'Intrarea vocal膬 este activat膬',
+    },
+    textToSpeech: {
+      title: 'Text la voce',
+      description: 'Dup膬 activare, textul poate fi convertit 卯n vorbire.',
+      resDes: 'Textul la audio este activat',
+    },
+    citation: {
+      title: 'Cit膬ri 葯i atribuiri',
+      description: 'Dup膬 activare, se vor afi葯a documentul surs膬 葯i sec葲iunea atribuit膬 a con葲inutului generat.',
+      resDes: 'Cit膬ri 葯i atribuiri sunt activate',
+    },
+    annotation: {
+      title: 'R膬spuns anotat',
+      description: 'Pute葲i ad膬uga manual r膬spunsuri de 卯nalt膬 calitate 卯n cache pentru a le prioritiza la potrivirea cu 卯ntreb膬rile similare ale utilizatorilor.',
+      resDes: 'R膬spuns anotat este activat',
+      scoreThreshold: {
+        title: 'Prag de scor',
+        description: 'Folosit pentru a seta pragul de similitudine pentru r膬spunsul anotat.',
+        easyMatch: 'Potrivire simpl膬',
+        accurateMatch: 'Potrivire precis膬',
+      },
+      matchVariable: {
+        title: 'Variabil膬 de potrivire',
+        choosePlaceholder: 'Alege葲i variabila de potrivire',
+      },
+      cacheManagement: 'Adnot膬ri',
+      cached: 'Adnotat',
+      remove: 'Elimin膬',
+      removeConfirm: '葮terge葲i aceast膬 adnotare?',
+      add: 'Adaug膬 adnotare',
+      edit: 'Editeaz膬 adnotare',
+    },
+    dataSet: {
+      title: 'Context',
+      noData: 'Pute葲i importa Cuno葯tin葲e ca context',
+      words: 'Cuvinte',
+      textBlocks: 'Blocuri de text',
+      selectTitle: 'Selecta葲i Cuno葯tin葲e de referin葲膬',
+      selected: 'Cuno葯tin葲e selectate',
+      noDataSet: 'Nu s-au g膬sit Cuno葯tin葲e',
+      toCreate: 'Du-te la creare',
+      notSupportSelectMulti: '脦n prezent se accept膬 doar o singur膬 Cuno葯tin葲膬',
+      queryVariable: {
+        title: 'Variabil膬 de interogare',
+        tip: 'Aceast膬 variabil膬 va fi utilizat膬 ca intrare de interogare pentru recuperarea contextului, ob葲in芒nd informa葲ii de context legate de intrarea acestei variabile.',
+        choosePlaceholder: 'Alege葲i variabila de interogare',
+        noVar: 'Nicio variabil膬',
+        noVarTip: 'v膬 rug膬m s膬 crea葲i o variabil膬 卯n sec葲iunea Variabile',
+        unableToQueryDataSet: 'Imposibil de interogat Cuno葯tin葲ele',
+        unableToQueryDataSetTip: 'Nu s-a reu葯it interogarea cu succes a Cuno葯tin葲elor, v膬 rug膬m s膬 alege葲i o variabil膬 de interogare a contextului 卯n sec葲iunea context.',
+        ok: 'OK',
+        contextVarNotEmpty: 'variabila de interogare a contextului nu poate fi goal膬',
+        deleteContextVarTitle: '葮terge葲i variabila "{{varName}}"?',
+        deleteContextVarTip: 'Aceast膬 variabil膬 a fost setat膬 ca variabil膬 de interogare a contextului 葯i eliminarea ei va afecta utilizarea normal膬 a Cuno葯tin葲elor. Dac膬 totu葯i trebuie s膬 o 葯terge葲i, v膬 rug膬m s膬 o reselecta葲i 卯n sec葲iunea context.',
+      },
+    },
+    tools: {
+      title: 'Instrumente',
+      tips: 'Instrumentele ofer膬 o metod膬 de apel API standard, lu芒nd intrarea utilizatorului sau variabilele ca parametri de solicitare pentru interogarea datelor externe ca context.',
+      toolsInUse: '{{count}} instrumente 卯n uz',
+      modal: {
+        title: 'Instrument',
+        toolType: {
+          title: 'Tip instrument',
+          placeholder: 'V膬 rug膬m s膬 selecta葲i tipul de instrument',
+        },
+        name: {
+          title: 'Nume',
+          placeholder: 'V膬 rug膬m s膬 introduce葲i numele',
+        },
+        variableName: {
+          title: 'Nume variabil膬',
+          placeholder: 'V膬 rug膬m s膬 introduce葲i numele variabilei',
+        },
+      },
+    },
+    conversationHistory: {
+      title: 'Istoric conversa葲ie',
+      description: 'Seta葲i numele prefixe pentru rolurile de conversa葲ie',
+      tip: 'Istoricul conversa葲iei nu este activat, ad膬uga葲i <histories> 卯n promptul de mai sus.',
+      learnMore: 'Afla葲i mai multe',
+      editModal: {
+        title: 'Edita葲i numele rolurilor de conversa葲ie',
+        userPrefix: 'Prefix utilizator',
+        assistantPrefix: 'Prefix asistent',
+      },
+    },
+    toolbox: {
+      title: 'TRUS膫 DE UNELTE',
+    },
+    moderation: {
+      title: 'Moderarea con葲inutului',
+      description: 'Asigura葲i securitatea ie葯irii modelului folosind API-ul de moderare sau men葲in芒nd o list膬 de cuvinte sensibile.',
+      allEnabled: 'Con葲inut INTRARE/IE葮IRE activat',
+      inputEnabled: 'Con葲inut INTRARE activat',
+      outputEnabled: 'Con葲inut IE葮IRE activat',
+      modal: {
+        title: 'Set膬ri de moderare a con葲inutului',
+        provider: {
+          title: 'Furnizor',
+          openai: 'Moderare OpenAI',
+          openaiTip: {
+            prefix: 'Moderarea OpenAI necesit膬 o cheie API OpenAI configurat膬 卯n',
+            suffix: '.',
+          },
+          keywords: 'Cuvinte cheie',
+        },
+        keywords: {
+          tip: 'C芒te unul pe r芒nd, separate prin linii noi. Maxim 100 de caractere pe linie.',
+          placeholder: 'C芒te unul pe r芒nd, separate prin linii noi',
+          line: 'Linie',
+        },
+        content: {
+          input: 'Modereaz膬 con葲inut INTRARE',
+          output: 'Modereaz膬 con葲inut IE葮IRE',
+          preset: 'R膬spunsuri prestabilite',
+          placeholder: 'Con葲inut r膬spunsuri prestabilite aici',
+          condition: 'Modereaz膬 con葲inut INTRARE 葯i IE葮IRE activat cel pu葲in unul',
+          fromApi: 'R膬spunsurile prestabilite sunt returnate de API',
+          errorMessage: 'R膬spunsurile prestabilite nu pot fi goale',
+          supportMarkdown: 'Markdown suportat',
+        },
+        openaiNotConfig: {
+          before: 'Moderarea OpenAI necesit膬 o cheie API OpenAI configurat膬 卯n',
+          after: '',
+        },
+      },
+    },
+  },
+  automatic: {
+    title: 'Orchestrarea automat膬 a aplica葲iilor',
+    description: 'Descrie葲i scenariul dvs., Dify v膬 va orchestra o aplica葲ie pentru dvs.',
+    intendedAudience: 'Care este publicul 葲int膬?',
+    intendedAudiencePlaceHolder: 'de ex. Student',
+    solveProblem: 'Ce probleme sper膬 ei c膬 IA le poate rezolva?',
+    solveProblemPlaceHolder: 'de ex. Extrage informa葲ii 葯i rezum膬 informa葲ii din rapoarte 葯i articole lungi',
+    generate: 'Genereaz膬',
+    audiencesRequired: 'Publicul 葲int膬 este necesar',
+    problemRequired: 'Problema este necesar膬',
+    resTitle: 'Am orchestrat urm膬toarea aplica葲ie pentru dvs.',
+    apply: 'Aplica葲i aceast膬 orchestrare',
+    noData: 'Descrie葲i cazul de utilizare din st芒nga, previzualizarea orchestr膬rii se va afi葯a aici.',
+    loading: 'Orchestrarea aplica葲iei pentru dvs...',
+    overwriteTitle: 'Suprascrie葲i configura葲ia existent膬?',
+    overwriteMessage: 'Aplicarea acestei orchestr膬ri va suprascrie configura葲ia existent膬.',
+  },
+  resetConfig: {
+    title: 'Confirma葲i resetarea?',
+    message:
+      'Resetarea renun葲膬 la modific膬ri, restabilind ultima configura葲ie publicat膬.',
+  },
+  errorMessage: {
+    nameOfKeyRequired: 'numele cheii: {{key}} este obligatoriu',
+    valueOfVarRequired: 'valoarea {{key}} nu poate fi goal膬',
+    queryRequired: 'Textul solicit膬rii este obligatoriu.',
+    waitForResponse:
+      'V膬 rug膬m s膬 a葯tepta葲i finalizarea r膬spunsului la mesajul anterior.',
+    waitForBatchResponse:
+      'V膬 rug膬m s膬 a葯tepta葲i finalizarea sarcinii 卯n lot.',
+    notSelectModel: 'V膬 rug膬m s膬 alege葲i un model',
+    waitForImgUpload: 'V膬 rug膬m s膬 a葯tepta葲i 卯nc膬rcarea imaginii',
+  },
+  chatSubTitle: 'Instruc葲iuni',
+  completionSubTitle: 'Prefix prompt',
+  promptTip:
+    'Prompturile ghideaz膬 r膬spunsurile AI cu instruc葲iuni 葯i constr芒ngeri. Insera葲i variabile ca {{input}}. Acest prompt nu va fi vizibil utilizatorilor.',
+  formattingChangedTitle: 'Formatarea s-a schimbat',
+  formattingChangedText:
+    'Modificarea format膬rii va reseta zona de depanare, e葯ti sigur?',
+  variableTitle: 'Variabile',
+  variableTip:
+    'Utilizatorii completeaz膬 variabile 卯ntr-un formular, 卯nlocuind automat variabilele din prompt.',
+  notSetVar: 'Variabilele permit utilizatorilor s膬 introduc膬 cuvinte de prompt sau remarci de deschidere atunci c芒nd completeaz膬 formulare. Pute葲i 卯ncerca s膬 introduce葲i "{{input}}" 卯n cuvintele de prompt.',
+  autoAddVar: 'Variabilele nedefinite la care se face referire 卯n pre-prompt, dori葲i s膬 le ad膬uga葲i 卯n formularul de intrare al utilizatorului?',
+  variableTable: {
+    key: 'Cheie variabil膬',
+    name: 'Nume c芒mp de intrare utilizator',
+    optional: 'Op葲ional',
+    type: 'Tip intrare',
+    action: 'Ac葲iuni',
+    typeString: '葮ir',
+    typeSelect: 'Selecteaz膬',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{key}} este necesar膬',
+    tooLong: '{{key}} este prea lung膬. Nu poate fi mai lung膬 de 30 de caractere',
+    notValid: '{{key}} este nevalid膬. Poate con葲ine doar litere, cifre 葯i sublinieri',
+    notStartWithNumber: '{{key}} nu poate 卯ncepe cu un num膬r',
+    keyAlreadyExists: ':{{key}} deja exist膬',
+  },
+  otherError: {
+    promptNoBeEmpty: 'Promptul nu poate fi gol',
+    historyNoBeEmpty: 'Istoricul conversa葲iei trebuie setat 卯n prompt',
+    queryNoBeEmpty: 'Interoga葲ia trebuie setat膬 卯n prompt',
+  },
+  variableConfig: {
+    'addModalTitle': 'Ad膬uga葲i c芒mp de intrare',
+    'editModalTitle': 'Edita葲i c芒mpul de intrare',
+    'description': 'Setare pentru variabila {{varName}}',
+    'fieldType': 'Tip de c芒mp',
+    'string': 'Text scurt',
+    'text-input': 'Text scurt',
+    'paragraph': 'Paragraf',
+    'select': 'Selecta葲i',
+    'number': 'Num膬r',
+    'notSet': 'Nesetat, 卯ncerca葲i s膬 tasta葲i {{input}} 卯n promptul de prefix',
+    'stringTitle': 'Op葲iuni caset膬 text formular',
+    'maxLength': 'Lungime maxim膬',
+    'options': 'Op葲iuni',
+    'addOption': 'Ad膬uga葲i op葲iune',
+    'apiBasedVar': 'Variabil膬 bazat膬 pe API',
+    'varName': 'Nume variabil膬',
+    'labelName': 'Nume etichet膬',
+    'inputPlaceholder': 'V膬 rug膬m s膬 introduce葲i',
+    'required': 'Obligatoriu',
+    'errorMsg': {
+      varNameRequired: 'Numele variabilei este obligatoriu',
+      labelNameRequired: 'Numele etichetei este obligatoriu',
+      varNameCanBeRepeat: 'Numele variabilei nu poate fi repetat',
+      atLeastOneOption: 'Este necesar膬 cel pu葲in o op葲iune',
+      optionRepeat: 'Exist膬 op葲iuni repetate',
+    },
+  },
+  vision: {
+    name: 'Viziune',
+    description: 'Activarea Viziunii va permite modelului s膬 primeasc膬 imagini 葯i s膬 r膬spund膬 la 卯ntreb膬ri despre ele.',
+    settings: 'Set膬ri',
+    visionSettings: {
+      title: 'Set膬ri Viziune',
+      resolution: 'Rezolu葲ie',
+      resolutionTooltip: `rezolu葲ia joas膬 va permite modelului s膬 primeasc膬 o versiune de 512 x 512 pixeli a imaginii 葯i s膬 o reprezinte cu un buget de 65 de tokenuri. Acest lucru permite API-ului s膬 returneze r膬spunsuri mai rapide 葯i s膬 consume mai pu葲ine tokenuri de intrare pentru cazurile de utilizare care nu necesit膬 detalii ridicate.
+      \n
+      rezolu葲ia ridicat膬 va permite 卯n primul r芒nd modelului s膬 vad膬 imaginea la rezolu葲ie sc膬zut膬 葯i apoi va crea decupaje detaliate ale imaginilor de intrare ca p膬trate de 512 pixeli, 卯n func葲ie de dimensiunea imaginii de intrare. Fiecare decupaj detaliat utilizeaz膬 un buget de token dublu, pentru un total de 129 de tokenuri.`,
+      high: 'Ridicat',
+      low: 'Sc膬zut',
+      uploadMethod: 'Metod膬 de 卯nc膬rcare',
+      both: 'Ambele',
+      localUpload: '脦nc膬rcare local膬',
+      url: 'URL',
+      uploadLimit: 'Limit膬 de 卯nc膬rcare',
+    },
+  },
+  voice: {
+    name: 'Voce',
+    defaultDisplay: 'Voce implicit膬',
+    description: 'Set膬ri de voce text-to-speech',
+    settings: 'Set膬ri',
+    voiceSettings: {
+      title: 'Set膬ri Voce',
+      language: 'Limb膬',
+      resolutionTooltip: 'Suport pentru limba de voce text-to-speech.',
+      voice: 'Voce',
+      autoPlay: 'Redare automata',
+      autoPlayEnabled: 'Deschis',
+      autoPlayDisabled: '卯nchidere',
+    },
+  },
+  openingStatement: {
+    title: 'Deschiz膬tor de conversa葲ie',
+    add: 'Ad膬ugare',
+    writeOpener: 'Scrie葲i deschiz膬torul',
+    placeholder: 'Scrie葲i aici mesajul de deschidere, pute葲i utiliza variabile, 卯ncerca葲i s膬 tasta葲i {{variable}}.',
+    openingQuestion: '脦ntreb膬ri de deschidere',
+    noDataPlaceHolder:
+      '脦nceperea conversa葲iei cu utilizatorul poate ajuta AI s膬 stabileasc膬 o conexiune mai str芒ns膬 cu ei 卯n aplica葲iile conversa葲ionale.',
+    varTip: 'Pute葲i utiliza variabile, 卯ncerca葲i s膬 tasta葲i {{variable}}',
+    tooShort: 'Este necesar膬 o promptare ini葲ial膬 de cel pu葲in 20 de cuvinte pentru a genera o remarc膬 de deschidere a conversa葲iei.',
+    notIncludeKey: 'Promptarea ini葲ial膬 nu include variabila: {{key}}. V膬 rug膬m s膬 o ad膬uga葲i la promptarea ini葲ial膬.',
+  },
+  modelConfig: {
+    model: 'Model',
+    setTone: 'Seta葲i tonul r膬spunsurilor',
+    title: 'Model 葯i Parametri',
+    modeType: {
+      chat: 'Chat',
+      completion: 'Completare',
+    },
+  },
+  inputs: {
+    title: 'Depanare 葯i previzualizare',
+    noPrompt: '脦ncerca葲i s膬 scrie葲i o promptare 卯n c芒mpul de intrare pre-promptare',
+    userInputField: 'C芒mp de intrare utilizator',
+    noVar: 'Completa葲i valoarea variabilei, care va fi 卯nlocuit膬 automat 卯n promptarea cuvintelor de fiecare dat膬 c芒nd este pornit膬 o nou膬 sesiune.',
+    chatVarTip:
+      'Completa葲i valoarea variabilei, care va fi 卯nlocuit膬 automat 卯n promptarea cuvintelor de fiecare dat膬 c芒nd este pornit膬 o nou膬 sesiune',
+    completionVarTip:
+      'Completa葲i valoarea variabilei, care va fi 卯nlocuit膬 automat 卯n promptarea cuvintelor de fiecare dat膬 c芒nd este trimis膬 o 卯ntrebare.',
+    previewTitle: 'Previzualizare promptare',
+    queryTitle: 'Con葲inut interogare',
+    queryPlaceholder: 'V膬 rug膬m s膬 introduce葲i textul solicit膬rii.',
+    run: 'RULARE',
+  },
+  result: 'Text de ie葯ire',
+  datasetConfig: {
+    settingTitle: 'Set膬ri de recuperare',
+    knowledgeTip: 'Face葲i clic pe butonul "+" pentru a ad膬uga cuno葯tin葲e',
+    retrieveOneWay: {
+      title: 'Recuperare N-la-1',
+      description: 'Pe baza inten葲iei utilizatorului 葯i a descrierilor Cuno葯tin葲elor, Agentul selecteaz膬 卯n mod autonom cea mai bun膬 Cuno葯tin葲膬 pentru interogare. Cel mai bun pentru aplica葲ii cu Cuno葯tin葲e distincte 葯i limitate.',
+    },
+    retrieveMultiWay: {
+      title: 'Recuperare multi-cale',
+      description: 'Pe baza inten葲iei utilizatorului, interoga葲i toate Cuno葯tin葲ele, recupera葲i textul relevant din mai multe surse 葯i selecta葲i cele mai bune rezultate care se potrivesc interog膬rii utilizatorului dup膬 reclasificare. Este necesar膬 configurarea API-ului Rerank Model.',
+    },
+    rerankModelRequired: 'Este necesar modelul Rerank',
+    params: 'Parametri',
+    top_k: 'Top K',
+    top_kTip: 'Utilizat pentru a filtra buc膬葲ile cele mai similare cu 卯ntreb膬rile utilizatorilor. Sistemul va ajusta, de asemenea, 卯n mod dinamic valoarea Top K, 卯n func葲ie de max_tokens al modelului selectat.',
+    score_threshold: 'Prag scor',
+    score_thresholdTip: 'Utilizat pentru a seta pragul de similitudine pentru filtrarea buc膬葲ilor.',
+    retrieveChangeTip: 'Modificarea modului de indexare 葯i a modului de recuperare poate afecta aplica葲iile asociate cu aceste Cuno葯tin葲e.',
+  },
+  debugAsSingleModel: 'Depanare ca Model Unic',
+  debugAsMultipleModel: 'Depanare ca Modele Multiple',
+  duplicateModel: 'Duplicare',
+  publishAs: 'Publicare ca',
+  assistantType: {
+    name: 'Tip Asistent',
+    chatAssistant: {
+      name: 'Asistent de baz膬',
+      description: 'Construi葲i un asistent bazat pe chat utiliz芒nd un Model de Limbaj Mare',
+    },
+    agentAssistant: {
+      name: 'Asistent Agent',
+      description: 'Construi葲i un Agent inteligent care poate alege 卯n mod autonom instrumente pentru a 卯ndeplini sarcinile',
+    },
+  },
+  agent: {
+    agentMode: 'Mod Agent',
+    agentModeDes: 'Seta葲i tipul de mod de inferen葲膬 pentru agent',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: 'Apel de Func葲ie',
+    },
+    setting: {
+      name: 'Set膬ri Agent',
+      description: 'Set膬rile Asistentului Agent permit setarea modului agent 葯i a func葲iilor avansate, cum ar fi prompturile 卯ncorporate, disponibile numai 卯n tipul Agent.',
+      maximumIterations: {
+        name: 'Itera葲ii maxime',
+        description: 'Limita葲i num膬rul de itera葲ii pe care le poate executa un asistent agent',
+      },
+    },
+    buildInPrompt: 'Prompt 卯ncorporat',
+    firstPrompt: 'Primul Prompt',
+    nextIteration: 'Itera葲ia urm膬toare',
+    promptPlaceholder: 'Scrie葲i promptul aici',
+    tools: {
+      name: 'Instrumente',
+      description: 'Utilizarea instrumentelor poate extinde capacit膬葲ile LLM, cum ar fi c膬utarea pe internet sau efectuarea de calcule 葯tiin葲ifice',
+      enabled: 'Activat',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/ro-RO/app-log.ts b/i18n/ro-RO/app-log.ts
new file mode 100644
index 0000000..5ca0adf
--- /dev/null
+++ b/i18n/ro-RO/app-log.ts
@@ -0,0 +1,98 @@
+const translation = {
+  title: 'Jurnale',
+  description: 'Jurnalele 卯nregistreaz膬 starea de func葲ionare a aplica葲iei, inclusiv intr膬rile utilizatorilor 葯i r膬spunsurile AI.',
+  dateTimeFormat: 'DD/MM/YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: 'Timp actualizare',
+      time: 'Timp creare',
+      endUser: 'Utilizator final sau cont',
+      input: 'Intrare',
+      output: 'Ie葯ire',
+      summary: 'Titlu',
+      messageCount: 'Num膬r de mesaje',
+      userRate: 'Evaluare utilizator',
+      adminRate: 'Evaluare op.',
+      startTime: 'ORA DE 脦NCEPERE',
+      status: 'STARE',
+      runtime: 'TIMP DE RULARE',
+      tokens: 'JETOANE',
+      user: 'UTILIZATOR FINAL SAU CONT',
+      version: 'VERSIUNE',
+    },
+    pagination: {
+      previous: 'Anterior',
+      next: 'Urm膬tor',
+    },
+    empty: {
+      noChat: '脦nc膬 nu exist膬 nicio conversa葲ie',
+      noOutput: 'F膬r膬 ie葯ire',
+      element: {
+        title: 'Exist膬 cineva acolo?',
+        content: 'Observa葲i 葯i annota葲i interac葲iunile dintre utilizatorii finali 葯i aplica葲iile AI pentru a 卯mbun膬t膬葲i 卯n mod continuu acurate葲ea AI. Pute葲i 卯ncerca <shareLink>s膬 partaja葲i</shareLink> sau <testLink>s膬 testa葲i</testLink> aplica葲ia web, apoi reveni葲i la aceast膬 pagin膬.',
+      },
+    },
+  },
+  detail: {
+    time: 'Or膬',
+    conversationId: 'ID conversa葲ie',
+    promptTemplate: '葮ablon prompt',
+    promptTemplateBeforeChat: '葮ablon prompt 卯nainte de chat 路 Ca mesaj de sistem',
+    annotationTip: '脦mbun膬t膬葲iri marcate de {{user}}',
+    timeConsuming: '',
+    second: 's',
+    tokenCost: 'Jetoane cheltuite',
+    loading: 'se 卯ncarc膬',
+    operation: {
+      like: 'apreciere',
+      dislike: 'dezaprobare',
+      addAnnotation: 'Ad膬uga葲i o 卯mbun膬t膬葲ire',
+      editAnnotation: 'Edita葲i o 卯mbun膬t膬葲ire',
+      annotationPlaceholder: 'Introduce葲i r膬spunsul a葯teptat pe care dori葲i ca AI s膬 卯l furnizeze, care poate fi utilizat pentru fine-tuning-ul modelului 葯i 卯mbun膬t膬葲irea continu膬 a calit膬葲ii gener膬rii de text 卯n viitor.',
+    },
+    variables: 'Variabile',
+    uploadImages: 'Imagini 卯nc膬rcate',
+    modelParams: 'Parametrii modelului',
+  },
+  filter: {
+    period: {
+      today: 'Ast膬zi',
+      last7days: 'Ultimele 7 zile',
+      last4weeks: 'Ultimele 4 s膬pt膬m芒ni',
+      last3months: 'Ultimele 3 luni',
+      last12months: 'Ultimele 12 luni',
+      monthToDate: 'Luna curent膬',
+      quarterToDate: 'Trimestrul curent',
+      yearToDate: 'Anul curent',
+      allTime: 'Tot timpul',
+    },
+    annotation: {
+      all: 'Toate',
+      annotated: '脦mbun膬t膬葲iri annotate ({{count}} elemente)',
+      not_annotated: 'F膬r膬 annot膬ri',
+    },
+    sortBy: 'Sorteaz膬 dup膬:',
+    descending: 'descresc膬tor',
+    ascending: 'cresc膬tor',
+  },
+  workflowTitle: 'Jurnale de flux de lucru',
+  workflowSubtitle: 'Jurnalul a 卯nregistrat opera葲iunea Automate.',
+  runDetail: {
+    title: 'Jurnal de conversa葲ie',
+    workflowTitle: 'Detalii jurnal',
+    fileListDetail: 'Am膬nunt',
+    fileListLabel: 'Detalii fi葯ier',
+  },
+  promptLog: 'Jurnal prompt',
+  agentLog: 'Jurnal agent',
+  viewLog: 'Vizualizare jurnal',
+  agentLogDetail: {
+    agentMode: 'Mod agent',
+    toolUsed: 'Instrument utilizat',
+    iterations: 'Itera葲ii',
+    iteration: 'Itera葲ie',
+    finalProcessing: 'Procesare final膬',
+  },
+}
+
+export default translation
diff --git a/i18n/ro-RO/app-overview.ts b/i18n/ro-RO/app-overview.ts
new file mode 100644
index 0000000..35ee79d
--- /dev/null
+++ b/i18n/ro-RO/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: 'Pentru a 卯ncepe,',
+    enterKeyTip: 'introduce葲i cheia API OpenAI mai jos',
+    getKeyTip: 'Ob葲ine葲i cheia API de la panoul de control OpenAI',
+    placeholder: 'Cheia API OpenAI (de ex. sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: 'Utiliza葲i cota de prob膬 a furnizorului {{providerName}}.',
+        description: 'Cota de prob膬 este furnizat膬 pentru utilizarea de testare. 脦nainte ca apelurile cotei de prob膬 s膬 se epuizeze, v膬 rug膬m s膬 configura葲i propriul furnizor de modele sau s膬 achizi葲iona葲i o cot膬 suplimentar膬.',
+      },
+      exhausted: {
+        title: 'Cota de prob膬 a fost epuizat膬, v膬 rug膬m s膬 configura葲i cheia API.',
+        description: 'Cota de prob膬 a fost epuizat膬. V膬 rug膬m s膬 configura葲i propriul furnizor de modele sau s膬 achizi葲iona葲i o cot膬 suplimentar膬.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: 'Pentru a 卯ncepe,',
+        row2: 'configura葲i mai 卯nt芒i furnizorul de modele.',
+      },
+    },
+    callTimes: 'Apeluri efectuate',
+    usedToken: 'Token utilizat',
+    setAPIBtn: 'Merge葲i la configurarea furnizorului de modele',
+    tryCloud: 'Sau 卯ncerca葲i versiunea cloud a Dify cu cot膬 gratuit膬',
+  },
+  overview: {
+    title: 'Prezentare general膬',
+    appInfo: {
+      explanation: 'Aplica葲ie web AI gata de utilizare',
+      accessibleAddress: 'URL public',
+      preview: 'Previzualizare',
+      regenerate: 'Regenerare',
+      regenerateNotice: 'Dori葲i s膬 regenera葲i URL-ul public?',
+      preUseReminder: 'Activa葲i aplica葲ia web 卯nainte de a continua.',
+      settings: {
+        entry: 'Set膬ri',
+        title: 'Set膬ri aplica葲ie web',
+        webName: 'Nume aplica葲ie web',
+        webDesc: 'Descriere aplica葲ie web',
+        webDescTip: 'Acest text va fi afi葯at pe partea clientului, oferind 卯ndrumare de baz膬 privind modul de utilizare a aplica葲iei',
+        webDescPlaceholder: 'Introduce葲i descrierea aplica葲iei web',
+        language: 'Limb膬',
+        workflow: {
+          title: 'Pa葯i flux de lucru',
+          show: 'Afi葯a葲i',
+          hide: 'Ascunde葲i',
+          subTitle: 'Detalii despre fluxul de lucru',
+          showDesc: 'Afi葯area sau ascunderea detaliilor fluxului de lucru 卯n WebApp',
+        },
+        chatColorTheme: 'Tema de culoare a chatului',
+        chatColorThemeDesc: 'Seta葲i tema de culoare a chatbotului',
+        chatColorThemeInverted: 'Inversat',
+        invalidHexMessage: 'Valoare hex nevalid膬',
+        invalidPrivacyPolicy: 'Link politic膬 de confiden葲ialitate invalid. V膬 rug膬m s膬 folosi葲i un link valid care 卯ncepe cu http sau https',
+        more: {
+          entry: 'Afi葯a葲i mai multe set膬ri',
+          copyright: 'Drepturi de autor',
+          copyRightPlaceholder: 'Introduce葲i numele autorului sau al organiza葲iei',
+          privacyPolicy: 'Politica de confiden葲ialitate',
+          privacyPolicyPlaceholder: 'Introduce葲i link-ul politicii de confiden葲ialitate',
+          privacyPolicyTip: 'Ajut膬 vizitatorii s膬 卯n葲eleag膬 datele pe care le colecteaz膬 aplica葲ia, consulta葲i <privacyPolicyLink>Politica de confiden葲ialitate</privacyPolicyLink> a Dify.',
+          customDisclaimerPlaceholder: 'Introduce葲i textul personalizat de declinare a responsabilit膬葲ii',
+          customDisclaimerTip: 'Textul personalizat de declinare a responsabilit膬葲ii va fi afi葯at pe partea clientului, oferind informa葲ii suplimentare despre aplica葲ie',
+          customDisclaimer: 'Declinarea responsabilit膬葲ii personalizate',
+          copyrightTip: 'Afi葯a葲i informa葲ii despre drepturile de autor 卯n aplica葲ia web',
+          copyrightTooltip: 'V膬 rug膬m s膬 face葲i upgrade la planul Professional sau la o versiune ulterioar膬',
+        },
+        sso: {
+          label: 'Autentificare SSO',
+          title: 'WebApp SSO',
+          description: 'To葲i utilizatorii trebuie s膬 se conecteze cu SSO 卯nainte de a utiliza WebApp',
+          tooltip: 'Contacta葲i administratorul pentru a activa WebApp SSO',
+        },
+        modalTip: 'Set膬rile aplica葲iei web pe partea clientului.',
+      },
+      embedded: {
+        entry: '脦ncorporat',
+        title: '脦ncorpora葲i pe site-ul web',
+        explanation: 'Alege葲i modul de 卯ncorporare a aplica葲iei de chat pe site-ul web',
+        iframe: 'Pentru a ad膬uga aplica葲ia de chat oriunde pe site-ul web, ad膬uga葲i acest iframe la codul HTML.',
+        scripts: 'Pentru a ad膬uga o aplica葲ie de chat 卯n col葲ul din dreapta jos al site-ului web, ad膬uga葲i acest cod la codul HTML.',
+        chromePlugin: 'Instala葲i extensia Chrome Dify Chatbot',
+        copied: 'Copiat',
+        copy: 'Copia葲i',
+      },
+      qrcode: {
+        title: 'Cod QR pentru partajare',
+        scan: 'Scana葲i pentru a partaja aplica葲ia',
+        download: 'Desc膬rca葲i codul QR',
+      },
+      customize: {
+        way: 'mod',
+        entry: 'Personalizare',
+        title: 'Personaliza葲i aplica葲ia web AI',
+        explanation: 'Pute葲i personaliza interfa葲a frontal膬 a aplica葲iei web pentru a se potrivi cu scenariul 葯i stilul dorit.',
+        way1: {
+          name: 'Bifurca葲i codul clientului, modifica葲i-l 葯i implementa葲i-l pe Vercel (recomandat)',
+          step1: 'Bifurca葲i codul clientului 葯i modifica葲i-l',
+          step1Tip: 'Face葲i clic aici pentru a bifurca codul surs膬 卯n contul dvs. GitHub 葯i a modifica codul',
+          step1Operation: 'Dify-WebClient',
+          step2: 'Implementa葲i pe Vercel',
+          step2Tip: 'Face葲i clic aici pentru a importa depozitul 卯n Vercel 葯i a implementa',
+          step2Operation: 'Importa葲i depozitul',
+          step3: 'Configura葲i variabilele de mediu',
+          step3Tip: 'Ad膬uga葲i urm膬toarele variabile de mediu 卯n Vercel',
+        },
+        way2: {
+          name: 'Scrie葲i cod pe partea clientului pentru a apela API-ul 葯i implementa葲i-l pe un server',
+          operation: 'Documenta葲ie',
+        },
+      },
+      launch: 'Lansa',
+    },
+    apiInfo: {
+      title: 'API serviciu backend',
+      explanation: 'U葯or de integrat 卯n aplica葲ia dvs.',
+      accessibleAddress: 'Punct final API serviciu',
+      doc: 'Referin葲膬 API',
+    },
+    status: {
+      running: '脦n service',
+      disable: 'Dezactivat',
+    },
+  },
+  analysis: {
+    title: 'Analiz膬',
+    ms: 'ms',
+    tokenPS: 'Token/s',
+    totalMessages: {
+      title: 'Mesaje totale',
+      explanation: 'Num膬rul de interac葲iuni zilnice cu IA.',
+    },
+    totalConversations: {
+      title: 'Total Conversa葲ii',
+      explanation: 'Num膬rul de conversa葲ii zilnice cu IA; ingineria/depanarea prompturilor exclus膬.',
+    },
+    activeUsers: {
+      title: 'Utilizatori activi',
+      explanation: 'Utilizatori unici care se angajeaz膬 卯n 卯ntreb膬ri 葯i r膬spunsuri cu AI; exclud proiectarea 葯i depanarea promptelor.',
+    },
+    tokenUsage: {
+      title: 'Utilizare token',
+      explanation: 'Reflect膬 utilizarea zilnic膬 a tokenurilor de c膬tre modelul lingvistic pentru aplica葲ie, util膬 pentru controlul costurilor.',
+      consumed: 'Consumat',
+    },
+    avgSessionInteractions: {
+      title: 'Interac葲iuni medii pe sesiune',
+      explanation: 'Num膬r de comunic膬ri continue utilizator-AI; pentru aplica葲ii bazate pe conversa葲ie.',
+    },
+    avgUserInteractions: {
+      title: 'Interac葲iuni medii pe utilizator',
+      explanation: 'Reflect膬 frecven葲a de utilizare zilnic膬 a utilizatorilor. Aceast膬 metrica reflect膬 c芒t de fideli sunt utilizatorii.',
+    },
+    userSatisfactionRate: {
+      title: 'Rata de satisfac葲ie a utilizatorilor',
+      explanation: 'Num膬rul de aprecieri la 1.000 de mesaje. Acest lucru indic膬 propor葲ia de r膬spunsuri cu care utilizatorii sunt foarte mul葲umi葲i.',
+    },
+    avgResponseTime: {
+      title: 'Timp mediu de r膬spuns',
+      explanation: 'Timp (ms) pentru procesarea/r膬spunsul AI; pentru aplica葲ii bazate pe text.',
+    },
+    tps: {
+      title: 'Viteza de ie葯ire a tokenurilor',
+      explanation: 'M膬soar膬 performan葲a modelului de limbaj mare. Num膬r膬 viteza de ie葯ire a tokenurilor din modelul de limbaj mare de la 卯nceputul cererii p芒n膬 la finalizarea ie葯irii.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/ro-RO/app.ts b/i18n/ro-RO/app.ts
new file mode 100644
index 0000000..1b1cd6c
--- /dev/null
+++ b/i18n/ro-RO/app.ts
@@ -0,0 +1,214 @@
+const translation = {
+  createApp: 'CREEAZ膫 APLICA葰IE',
+  types: {
+    all: 'Toate',
+    chatbot: 'Chatbot',
+    agent: 'Agent',
+    workflow: 'Flux de lucru',
+    completion: 'Finalizare',
+    advanced: 'Fluxul de chat',
+    basic: 'Baz膬',
+  },
+  duplicate: 'Duplicat',
+  duplicateTitle: 'Duplic膬 Aplica葲ia',
+  export: 'Export膬 DSL',
+  exportFailed: 'Exportul DSL a e葯uat.',
+  importDSL: 'Import膬 fi葯ier DSL',
+  createFromConfigFile: 'Creeaz膬 din fi葯ier DSL',
+  deleteAppConfirmTitle: '葮tergi aceast膬 aplica葲ie?',
+  deleteAppConfirmContent:
+    '葮tergerea aplica葲iei este ireversibil膬. Utilizatorii nu vor mai putea accesa aplica葲ia ta, iar toate configura葲iile promptului 葯i jurnalele vor fi 葯terse permanent.',
+  appDeleted: 'Aplica葲ia a fost 葯tears膬',
+  appDeleteFailed: '葮tergerea aplica葲iei a e葯uat',
+  join: 'Al膬tur膬-te comunit膬葲ii',
+  communityIntro:
+    'Discut膬 cu membrii echipei, colaboratorii 葯i dezvoltatorii pe diferite canale.',
+  roadmap: 'Vezi planul nostru de dezvoltare',
+  newApp: {
+    startFromBlank: 'Creeaz膬 din Nou',
+    startFromTemplate: 'Creeaz膬 din 葮ablon',
+    captionAppType: 'Ce tip de aplica葲ie vrei s膬 creezi?',
+    chatbotDescription: 'Construie葯te o aplica葲ie bazat膬 pe chat. Aceast膬 aplica葲ie folose葯te un format 卯ntrebare-r膬spuns, permi葲芒nd mai multe runde de conversa葲ie continu膬.',
+    completionDescription: 'Construie葯te o aplica葲ie care genereaz膬 text de 卯nalt膬 calitate pe baza indica葲iilor, cum ar fi generarea de articole, rezumate, traduceri 葯i mai multe.',
+    completionWarning: 'Acest tip de aplica葲ie nu va mai fi acceptat.',
+    agentDescription: 'Construie葯te un Agent inteligent care poate alege 卯n mod autonom instrumentele pentru a 卯ndeplini sarcinile',
+    workflowDescription: 'Construie葯te o aplica葲ie care genereaz膬 text de 卯nalt膬 calitate pe baza unui flux de lucru orchestrat cu un grad ridicat de personalizare. Este potrivit pentru utilizatorii experimenta葲i.',
+    workflowWarning: '脦n prezent 卯n beta',
+    chatbotType: 'Metod膬 de orchestrare a chatbot-ului',
+    basic: 'De baz膬',
+    basicTip: 'Pentru 卯ncep膬tori, se poate comuta la Chatflow mai t芒rziu',
+    basicFor: 'PENTRU 脦NCEP膫TORI',
+    basicDescription: 'Orchestrarea de baz膬 permite orchestrarea unei aplica葲ii Chatbot folosind set膬ri simple, f膬r膬 posibilitatea de a modifica prompturile 卯ncorporate. Este potrivit pentru 卯ncep膬tori.',
+    advanced: 'Chatflow',
+    advancedFor: 'Pentru utilizatori avansa葲i',
+    advancedDescription: 'Orchestrarea fluxului de lucru orchestreaz膬 chatbo葲i sub forma fluxurilor de lucru, oferind un grad ridicat de personalizare, inclusiv posibilitatea de a edita prompturile 卯ncorporate. Este potrivit pentru utilizatorii experimenta葲i.',
+    captionName: 'Pictogram膬 葯i nume aplica葲ie',
+    appNamePlaceholder: 'D膬-i aplica葲iei tale un nume',
+    captionDescription: 'Descriere',
+    appDescriptionPlaceholder: 'Introduce葲i descrierea aplica葲iei',
+    useTemplate: 'Folose葯te acest 葯ablon',
+    previewDemo: 'Previzualizeaz膬 demo',
+    chatApp: 'Asistent',
+    chatAppIntro:
+      'Vreau s膬 construiesc o aplica葲ie bazat膬 pe chat. Aceast膬 aplica葲ie folose葯te un format 卯ntrebare-r膬spuns, permi葲芒nd mai multe runde de conversa葲ie continu膬.',
+    agentAssistant: 'Asistent Agent Nou',
+    completeApp: 'Generator de text',
+    completeAppIntro:
+      'Vreau s膬 creez o aplica葲ie care genereaz膬 text de 卯nalt膬 calitate pe baza indica葲iilor, cum ar fi generarea de articole, rezumate, traduceri 葯i mai multe.',
+    showTemplates: 'Vreau s膬 aleg dintr-un 葯ablon',
+    hideTemplates: '脦napoi la selec葲ia modului',
+    Create: 'Creeaz膬',
+    Cancel: 'Anuleaz膬',
+    nameNotEmpty: 'Numele nu poate fi gol',
+    appTemplateNotSelected: 'V膬 rug膬m s膬 selecta葲i un 葯ablon',
+    appTypeRequired: 'V膬 rug膬m s膬 selecta葲i un tip de aplica葲ie',
+    appCreated: 'Aplica葲ia a fost creat膬',
+    appCreateFailed: 'Crearea aplica葲iei a e葯uat',
+    caution: 'Pruden葲膬',
+    appCreateDSLErrorPart2: 'Vrei s膬 continui?',
+    Confirm: 'Confirma',
+    appCreateDSLErrorTitle: 'Incompatibilitate versiune',
+    appCreateDSLWarning: 'Aten葲ie: diferen葲a de versiune DSL poate afecta anumite caracteristici',
+    appCreateDSLErrorPart3: 'Versiunea DSL a aplica葲iei curente:',
+    appCreateDSLErrorPart1: 'A fost detectat膬 o diferen葲膬 semnificativ膬 卯n versiunile DSL. For葲area importului poate cauza func葲ionarea defectuoas膬 a aplica葲iei.',
+    appCreateDSLErrorPart4: 'Versiune DSL suportat膬 de sistem:',
+    chatbotShortDescription: 'Chatbot bazat pe LLM cu configurare simpl膬',
+    forBeginners: 'PENTRU 脦NCEP膫TORI',
+    completionShortDescription: 'Asistent AI pentru sarcini de generare de text',
+    agentUserDescription: 'Un agent inteligent capabil de ra葲ionament iterativ 葯i utilizare autonom膬 a instrumentelor pentru a atinge obiectivele sarcinii.',
+    workflowUserDescription: 'Orchestrarea fluxului de lucru pentru sarcini cu o singur膬 rund膬, cum ar fi automatizarea 葯i procesarea 卯n loturi.',
+    optional: 'Facultativ',
+    learnMore: 'Afl膬 mai multe',
+    completionUserDescription: 'Construie葯te rapid un asistent AI pentru sarcinile de generare a textului cu o configurare simpl膬.',
+    chatbotUserDescription: 'Construi葲i rapid un chatbot bazat pe LLM cu o configurare simpl膬. Pute葲i trece la Chatflow mai t芒rziu.',
+    advancedShortDescription: 'Flux de lucru pentru dialoguri complexe cu mai multe rota葲ii cu memorie',
+    advancedUserDescription: 'Orchestrarea fluxului de lucru pentru sarcini complexe de dialog cu mai multe runde cu capacit膬葲i de memorie.',
+    noTemplateFoundTip: '脦ncerca葲i s膬 c膬uta葲i folosind cuvinte cheie diferite.',
+    foundResults: '{{num膬r}} Rezultatele',
+    foundResult: '{{num膬r}} Rezultat',
+    noIdeaTip: 'Nicio idee? Consulta葲i 葯abloanele noastre',
+    noAppsFound: 'Nu s-au g膬sit aplica葲ii',
+    workflowShortDescription: 'Orchestrare pentru sarcini de automatizare cu o singur膬 tur膬',
+    agentShortDescription: 'Agent inteligent cu ra葲ionament 葯i utilizare autonom膬 a uneltelor',
+    noTemplateFound: 'Nu s-au g膬sit 葯abloane',
+    forAdvanced: 'PENTRU UTILIZATORII AVANSA葰I',
+    chooseAppType: 'Alege葲i tipul de aplica葲ie',
+  },
+  editApp: 'Editeaz膬 Info',
+  editAppTitle: 'Editeaz膬 Info Aplica葲ie',
+  editDone: 'Informa葲iile despre aplica葲ie au fost actualizate',
+  editFailed: 'Actualizarea informa葲iilor despre aplica葲ie a e葯uat',
+  iconPicker: {
+    ok: 'OK',
+    cancel: 'Anuleaz膬',
+    emoji: 'Emoji',
+    image: 'Imagine',
+  },
+  switch: 'Comut膬 la Orchestrare Flux de Lucru',
+  switchTipStart: 'O nou膬 copie a aplica葲iei va fi creat膬 pentru tine, iar noua copie va comuta la Orchestrare Flux de Lucru. Noua copie ',
+  switchTip: 'nu va permite',
+  switchTipEnd: ' comutarea 卯napoi la Orchestrare de Baz膬.',
+  switchLabel: 'Copia aplica葲iei care urmeaz膬 s膬 fie creat膬',
+  removeOriginal: '葮terge aplica葲ia original膬',
+  switchStart: '脦ncepe comutarea',
+  typeSelector: {
+    all: 'TOATE Tipurile',
+    chatbot: 'Chatbot',
+    agent: 'Agent',
+    workflow: 'Flux de lucru',
+    completion: 'Finalizare',
+    advanced: 'Fluxul de chat',
+  },
+  tracing: {
+    title: 'Urm膬rirea performan葲ei aplica葲iei',
+    description: 'Configurarea unui furnizor LLMOps ter葲 葯i urm膬rirea performan葲ei aplica葲iei.',
+    config: 'Configurare',
+    collapse: 'Restr芒nge',
+    expand: 'Extinde',
+    tracing: 'Urm膬rire',
+    disabled: 'Dezactivat',
+    disabledTip: 'V膬 rug膬m s膬 configura葲i mai 卯nt芒i furnizorul',
+    enabled: '脦n serviciu',
+    tracingDescription: 'Capteaz膬 contextul complet al execu葲iei aplica葲iei, inclusiv apelurile LLM, context, prompt-uri, cereri HTTP 葯i altele, c膬tre o platform膬 de urm膬rire ter葲膬.',
+    configProviderTitle: {
+      configured: 'Configurat',
+      notConfigured: 'Configura葲i furnizorul pentru a activa urm膬rirea',
+      moreProvider: 'Mai mul葲i furnizori',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: 'O platform膬 de dezvoltare all-in-one pentru fiecare etap膬 a ciclului de via葲膬 al aplica葲iei bazate pe LLM.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: 'Urm膬rire, evalu膬ri, gestionarea prompt-urilor 葯i metrici pentru depanarea 葯i 卯mbun膬t膬葲irea aplica葲iei dvs. LLM.',
+    },
+    inUse: '脦n utilizare',
+    configProvider: {
+      title: 'Configurare ',
+      placeholder: 'Introduce葲i {{key}}-ul dvs.',
+      project: 'Proiect',
+      publicKey: 'Cheie public膬',
+      secretKey: 'Cheie secret膬',
+      viewDocsLink: 'Vizualiza葲i documenta葲ia {{key}}',
+      removeConfirmTitle: 'Elimina葲i configura葲ia {{key}}?',
+      removeConfirmContent: 'Configura葲ia curent膬 este 卯n uz, eliminarea acesteia va dezactiva func葲ia de Urm膬rire.',
+    },
+    view: 'Vedere',
+    opik: {
+      description: 'Opik este o platform膬 open-source pentru evaluarea, testarea 葯i monitorizarea aplica葲iilor LLM.',
+      title: 'Opik',
+    },
+    weave: {
+      title: '脦mplete葯te',
+      description: 'Weave este o platform膬 open-source pentru evaluarea, testarea 葯i monitorizarea aplica葲iilor LLM.',
+    },
+  },
+  answerIcon: {
+    descriptionInExplore: 'Dac膬 s膬 utiliza葲i pictograma WebApp pentru a 卯nlocui 馃 卯n Explore',
+    description: 'Dac膬 se utilizeaz膬 pictograma WebApp pentru a 卯nlocui 馃 卯n aplica葲ia partajat膬',
+    title: 'Utiliza葲i pictograma WebApp pentru a 卯nlocui 馃',
+  },
+  importFromDSL: 'Import din DSL',
+  importFromDSLUrl: 'De la URL',
+  importFromDSLUrlPlaceholder: 'Lipi葲i linkul DSL aici',
+  importFromDSLFile: 'Din fi葯ierul DSL',
+  mermaid: {
+    handDrawn: 'Desenat de m芒n膬',
+    classic: 'Clasic',
+  },
+  openInExplore: 'Deschide 卯n Exploreaz膬',
+  newAppFromTemplate: {
+    sidebar: {
+      Writing: 'Scriere',
+      Programming: 'Programare',
+      Workflow: 'Flux de lucru',
+      Agent: 'Agent',
+      Assistant: 'Asistent',
+      Recommended: 'Recomandat',
+      HR: 'DOMN',
+    },
+    searchAllTemplate: 'C膬uta葲i toate 葯abloanele...',
+    byCategories: 'DUP膫 CATEGORII',
+  },
+  showMyCreatedAppsOnly: 'Afi葯eaz膬 doar aplica葲iile create de mine',
+  appSelector: {
+    label: 'APLICA葰IE',
+    params: 'PARAMETRII APLICA葰IEI',
+    noParams: 'Nu sunt necesari parametri',
+    placeholder: 'Selecta葲i o aplica葲ie...',
+  },
+  structOutput: {
+    notConfiguredTip: 'Ie葯irea structurat膬 nu a fost configurat膬 卯nc膬',
+    LLMResponse: 'R膬spuns LLM',
+    required: 'Necesar',
+    moreFillTip: 'Afi葯芒nd maxim 10 niveluri de imbricare',
+    structured: 'Structurat',
+    modelNotSupported: 'Modelul nu este suportat',
+    structuredTip: 'Ie葯irile structurate sunt o caracteristic膬 care asigur膬 c膬 modelul va genera 卯ntotdeauna r膬spunsuri care respect膬 schema JSON furnizat膬.',
+    configure: 'Configureaz膬',
+    modelNotSupportedTip: 'Modelul actual nu suport膬 aceast膬 func葲ie 葯i este downgradat automat la injec葲ia de prompt.',
+  },
+}
+
+export default translation
diff --git a/i18n/ro-RO/billing.ts b/i18n/ro-RO/billing.ts
new file mode 100644
index 0000000..6826413
--- /dev/null
+++ b/i18n/ro-RO/billing.ts
@@ -0,0 +1,200 @@
+const translation = {
+  currentPlan: 'Planul curent',
+  upgradeBtn: {
+    plain: 'Actualizeaz膬 planul',
+    encourage: 'Actualizeaz膬 acum',
+    encourageShort: 'Actualizeaz膬',
+  },
+  viewBilling: 'Gestioneaz膬 facturarea 葯i abonamentele',
+  buyPermissionDeniedTip: 'V膬 rug膬m s膬 contacta葲i administratorul dvs. de 卯ntreprindere pentru a v膬 abona',
+  plansCommon: {
+    title: 'Alege葲i un plan potrivit pentru dvs.',
+    yearlyTip: 'Ob葲ine葲i 2 luni gratuite prin abonarea anual膬!',
+    mostPopular: 'Cel mai popular',
+    planRange: {
+      monthly: 'Lunar',
+      yearly: 'Anual',
+    },
+    month: 'lun膬',
+    year: 'an',
+    save: 'Economise葯te ',
+    free: 'Gratuit',
+    currentPlan: 'Planul curent',
+    contractSales: 'Contacta葲i v芒nz膬rile',
+    contractOwner: 'Contacta葲i managerul echipei',
+    startForFree: '脦ncepe gratuit',
+    getStartedWith: '脦ncepe cu ',
+    contactSales: 'Contacta葲i v芒nz膬rile',
+    talkToSales: 'Vorbi葲i cu v芒nz膬rile',
+    modelProviders: 'Furnizori de modele',
+    teamMembers: 'Membri ai echipei',
+    buildApps: 'Construie葯te aplica葲ii',
+    vectorSpace: 'Spa葲iu vectorial',
+    vectorSpaceBillingTooltip: 'Fiecare 1MB poate stoca aproximativ 1,2 milioane de caractere de date vectorizate (estimat folosind OpenAI Embeddings, variaz膬 卯n func葲ie de modele).',
+    vectorSpaceTooltip: 'Spa葲iul vectorial este sistemul de memorie pe termen lung necesar pentru ca LLM-urile s膬 卯n葲eleag膬 datele dvs.',
+    documentsUploadQuota: 'Cot膬 de 卯nc膬rcare a documentelor',
+    documentProcessingPriority: 'Prioritatea proces膬rii documentelor',
+    documentProcessingPriorityTip: 'Pentru o prioritate mai mare a proces膬rii documentelor, v膬 rug膬m s膬 actualiza葲i planul.',
+    documentProcessingPriorityUpgrade: 'Procesa葲i mai multe date cu o acurate葲e mai mare 葯i la viteze mai rapide.',
+    priority: {
+      'standard': 'Standard',
+      'priority': 'Prioritate',
+      'top-priority': 'Prioritate maxim膬',
+    },
+    logsHistory: 'Istoricul jurnalelor',
+    customTools: 'Instrumente personalizate',
+    unavailable: 'Indisponibil',
+    days: 'zile',
+    unlimited: 'Nelimitat',
+    support: 'Asisten葲膬',
+    supportItems: {
+      communityForums: 'Forumuri comunitare',
+      emailSupport: 'Asisten葲膬 prin e-mail',
+      priorityEmail: 'Asisten葲膬 prioritar膬 prin e-mail 葯i chat',
+      logoChange: 'Schimbarea logo-ului',
+      SSOAuthentication: 'Autentificare SSO',
+      personalizedSupport: 'Asisten葲膬 personalizat膬',
+      dedicatedAPISupport: 'Asisten葲膬 API dedicat膬',
+      customIntegration: 'Integrare 葯i asisten葲膬 personalizate',
+      ragAPIRequest: 'Solicit膬ri API RAG',
+      bulkUpload: '脦nc膬rcare 卯n bloc a documentelor',
+      agentMode: 'Mod agent',
+      workflow: 'Flux de lucru',
+      llmLoadingBalancing: 'Echilibrarea sarcinii LLM',
+      llmLoadingBalancingTooltip: 'Ad膬uga葲i mai multe chei API la modele, ocolind efectiv limitele de rat膬 API.',
+    },
+    comingSoon: 'Vine 卯n cur芒nd',
+    member: 'Membru',
+    memberAfter: 'Membru',
+    messageRequest: {
+      title: 'Credite de mesaje',
+      tooltip: 'Cote de invocare a mesajelor pentru diferite planuri utiliz芒nd modele OpenAI (cu excep葲ia gpt4). Mesajele peste limit膬 vor utiliza cheia API OpenAI.',
+      titlePerMonth: '{{count,number}} mesaje/lun膬',
+    },
+    annotatedResponse: {
+      title: 'Limite de cot膬 de anotare',
+      tooltip: 'Editarea 葯i anotarea manual膬 a r膬spunsurilor ofer膬 capacit膬葲i de 卯ntreb膬ri 葯i r膬spunsuri personalizabile 葯i de 卯nalt膬 calitate pentru aplica葲ii. (Aplicabil numai 卯n aplica葲iile de chat)',
+    },
+    ragAPIRequestTooltip: 'Se refer膬 la num膬rul de apeluri API care invoc膬 doar capacit膬葲ile de procesare a bazei de cuno葯tin葲e a Dify.',
+    receiptInfo: 'Doar proprietarul echipei 葯i administratorul echipei pot s膬 se aboneze 葯i s膬 vizualizeze informa葲iile de facturare',
+    annotationQuota: 'Cota de adnotare',
+    priceTip: 'pe spa葲iu de lucru/',
+    teamMember_one: '{{count,number}} Membru al echipei',
+    unlimitedApiRate: 'F膬r膬 limit膬 de rat膬 API',
+    freeTrialTipPrefix: '脦nscrie-te 葯i ob葲ine un',
+    self: 'Auto-g膬zduit',
+    apiRateLimit: 'Limit膬 de rat膬 API',
+    documentsTooltip: 'Cota pe num膬rul de documente importate din Sursele de Date de Cuno葯tin葲e.',
+    getStarted: '脦ntreba葲i-v膬',
+    cloud: 'Serviciu de cloud',
+    apiRateLimitUnit: '{{count,number}}/zi',
+    comparePlanAndFeatures: 'Compar膬 planurile 葯i caracteristicile',
+    documentsRequestQuota: '{{count,number}}/min Limita de rat膬 a cererilor de cuno葯tin葲e',
+    documents: '{{count,number}} Documente de Cunoa葯tere',
+    freeTrialTipSuffix: 'Nu este necesar膬 o carte de credit',
+    teamMember_other: '{{count,number}} membri ai echipei',
+    teamWorkspace: '{{count,number}} Spa葲iu de lucru 卯n echip膬',
+    annualBilling: 'Facturare anuala',
+    freeTrialTip: 'perioad膬 de prob膬 gratuit膬 de 200 de apeluri OpenAI.',
+    documentsRequestQuotaTooltip: 'Specifica葲i num膬rul total de ac葲iuni pe care un spa葲iu de lucru le poate efectua pe minut 卯n cadrul bazei de cuno葯tin葲e, inclusiv crearea, 葯tergerea, actualiz膬rile setului de date, 卯nc膬rc膬rile de documente, modific膬rile, arhivarea 葯i interog膬rile bazei de cuno葯tin葲e. Acest metric este utilizat pentru a evalua performan葲a cererilor din baza de cuno葯tin葲e. De exemplu, dac膬 un utilizator Sandbox efectueaz膬 10 teste consecutive de hituri 卯ntr-un minut, spa葲iul s膬u de lucru va fi restric葲ionat temporar de la efectuarea urm膬toarelor ac葲iuni pentru minutul urm膬tor: crearea setului de date, 葯tergerea, actualiz膬rile 葯i 卯nc膬rc膬rile sau modific膬rile documentelor.',
+    apiRateLimitTooltip: 'Limita de rat膬 API se aplic膬 tuturor cererilor efectuate prin API-ul Dify, inclusiv generarea de texte, conversa葲iile de chat, execu葲iile fluxului de lucru 葯i procesarea documentelor.',
+  },
+  plans: {
+    sandbox: {
+      name: 'Sandbox',
+      description: '200 de 卯ncerc膬ri gratuite GPT',
+      includesTitle: 'Include:',
+      for: 'Proba gratuit膬 a capacit膬葲ilor de baz膬',
+    },
+    professional: {
+      name: 'Professional',
+      description: 'Pentru persoane fizice 葯i echipe mici pentru a debloca mai mult膬 putere la un pre葲 accesibil.',
+      includesTitle: 'Tot ce este 卯n planul gratuit, plus:',
+      for: 'Pentru dezvoltatori independen葲i / echipe mici',
+    },
+    team: {
+      name: 'Echip膬',
+      description: 'Colabora葲i f膬r膬 limite 葯i bucura葲i-v膬 de performan葲e de top.',
+      includesTitle: 'Tot ce este 卯n planul Professional, plus:',
+      for: 'Pentru echipe de dimensiuni medii',
+    },
+    enterprise: {
+      name: '脦ntreprindere',
+      description: 'Ob葲ine葲i capacit膬葲i 葯i asisten葲膬 complete pentru sisteme critice la scar膬 larg膬.',
+      includesTitle: 'Tot ce este 卯n planul Echip膬, plus:',
+      features: {
+        3: 'Multiple Spa葲ii de lucru 葯i Management Enterprise',
+        6: 'Securitate avansat膬 葯i control',
+        2: 'Func葲ii exclusive pentru 卯ntreprinderi',
+        8: 'Asisten葲膬 tehnic膬 profesional膬',
+        4: 'SSO',
+        7: 'Actualiz膬ri 葯i 卯ntre葲inere de c膬tre Dify Oficial',
+        1: 'Autorizare pentru licen葲膬 comercial膬',
+        5: 'SLA-uri negociate de partenerii Dify',
+        0: 'Solu葲ii de desf膬葯urare scalabile de nivel enterprise',
+      },
+      for: 'Pentru echipe de mari dimensiuni',
+      price: 'Personalizat',
+      priceTip: 'Facturare anual膬 doar',
+      btnText: 'Contacta葲i V芒nz膬ri',
+    },
+    community: {
+      features: {
+        2: 'Se conformeaz膬 Licen葲ei Open Source Dify',
+        1: 'Spa葲iu de lucru unic',
+        0: 'Toate func葲iile de baz膬 lansate sub depozitul public',
+      },
+      description: 'Pentru utilizatori individuali, echipe mici sau proiecte necomerciale',
+      btnText: '脦ncepe cu Comunitatea',
+      price: 'Gratuit',
+      name: 'Comunitate',
+      for: 'Pentru utilizatori individuali, echipe mici sau proiecte necomerciale',
+      includesTitle: 'Func葲ii gratuite:',
+    },
+    premium: {
+      features: {
+        1: 'Spa葲iu de lucru unic',
+        0: 'Fiabilitate autogestionat膬 de diferi葲i furnizori de cloud',
+        2: 'Personalizarea logo-ului 葯i branding-ului aplica葲iei web',
+        3: 'Suport prioritar prin email 葯i chat',
+      },
+      btnText: 'Ob葲ine Premium 卯n',
+      description: 'Pentru organiza葲ii 葯i echipe de dimensiuni medii',
+      includesTitle: 'Totul din Comunitate, plus:',
+      price: 'Scalabil',
+      name: 'Premium',
+      priceTip: 'Pe baza Pie葲ei Cloud',
+      comingSoon: 'Suport Microsoft Azure 葯i Google Cloud 卯n cur芒nd',
+      for: 'Pentru organiza葲ii 葯i echipe de dimensiuni medii',
+    },
+  },
+  vectorSpace: {
+    fullTip: 'Spa葲iul vectorial este plin.',
+    fullSolution: 'Actualiza葲i-v膬 planul pentru a ob葲ine mai mult spa葲iu.',
+  },
+  apps: {
+    fullTipLine1: 'Actualiza葲i-v膬 planul pentru a',
+    fullTipLine2: 'construi mai multe aplica葲ii.',
+    fullTip2des: 'Se recomand膬 cur膬葲area aplica葲iilor inactive pentru a elibera resurse, sau contacta葲i-ne.',
+    fullTip2: 'Limita planului a fost atins膬',
+    fullTip1des: 'A葲i atins limita de aplica葲ii construite pe acest plan',
+    fullTip1: 'Upgrade pentru a crea mai multe aplica葲ii',
+    contactUs: 'Contacta葲i-ne',
+  },
+  annotatedResponse: {
+    fullTipLine1: 'Actualiza葲i-v膬 planul pentru a',
+    fullTipLine2: 'anota mai multe conversa葲ii.',
+    quotaTitle: 'Cot膬 de r膬spuns anotat',
+  },
+  usagePage: {
+    vectorSpaceTooltip: 'Documentele cu modul de indexare de calitate 卯nalt膬 vor consuma resursele de stocare a datelor de cuno葯tin葲e. C芒nd stocarea datelor de cuno葯tin葲e atinge limita, documentele noi nu vor fi 卯nc膬rcate.',
+    buildApps: 'Construie葯te aplica葲ii',
+    vectorSpace: 'Stocarea datelor de cuno葯tin葲e',
+    teamMembers: 'Membrii echipei',
+    annotationQuota: 'Cota de Anotare',
+    documentsUploadQuota: 'Cota de 卯nc膬rcare a documentelor',
+  },
+  teamMembers: 'Membrii echipei',
+}
+
+export default translation
diff --git a/i18n/ro-RO/common.ts b/i18n/ro-RO/common.ts
new file mode 100644
index 0000000..1324340
--- /dev/null
+++ b/i18n/ro-RO/common.ts
@@ -0,0 +1,672 @@
+const translation = {
+  api: {
+    success: 'Succes',
+    actionSuccess: 'Ac葲iune reu葯it膬',
+    saved: 'Salvat',
+    create: 'Creat',
+    remove: 'Eliminat',
+  },
+  operation: {
+    create: 'Creeaz膬',
+    confirm: 'Confirm膬',
+    cancel: 'Anuleaz膬',
+    clear: '葮terge',
+    save: 'Salveaz膬',
+    saveAndEnable: 'Salveaz膬 葯i Activeaz膬',
+    edit: 'Editeaz膬',
+    add: 'Adaug膬',
+    added: 'Ad膬ugat',
+    refresh: 'Re卯ncarc膬',
+    reset: 'Reseteaz膬',
+    search: 'Caut膬',
+    change: 'Schimb膬',
+    remove: 'Elimin膬',
+    send: 'Trimite',
+    copy: 'Copiaz膬',
+    lineBreak: 'Linie nou膬',
+    sure: 'Sunt sigur',
+    download: 'Descarc膬',
+    delete: '葮terge',
+    settings: 'Set膬ri',
+    setup: 'Configurare',
+    getForFree: 'Ob葲ine gratuit',
+    reload: 'Re卯ncarc膬',
+    ok: 'OK',
+    log: 'Jurnal',
+    learnMore: 'Afl膬 mai multe',
+    params: 'Parametri',
+    duplicate: 'Duplic膬',
+    rename: 'Redenume葯te',
+    audioSourceUnavailable: 'Sursa audio nu este disponibil膬',
+    copyImage: 'Copiere imagine',
+    zoomOut: 'Mic葯orare',
+    openInNewTab: 'Deschide 卯ntr-o fil膬 nou膬',
+    zoomIn: 'M膬ri葲i',
+    close: '脦nchide',
+    viewMore: 'VEZI MAI MULT',
+    regenerate: 'Regenera',
+    saveAndRegenerate: 'Salva葲i 葯i regenera葲i buc膬葲ile secundare',
+    view: 'Vedere',
+    submit: 'Prezinte',
+    skip: 'Nav膬',
+    imageCopied: 'Imagine copiat膬',
+    deleteApp: '葮terge葲i aplica葲ia',
+    copied: 'Copiat',
+    in: '卯n',
+    viewDetails: 'Vezi detalii',
+    downloadFailed: 'Desc膬rcarea a e葯uat. V膬 rug膬m s膬 卯ncerca葲i din nou mai t芒rziu.',
+    format: 'Format',
+    downloadSuccess: 'Desc膬rcarea a fost finalizat膬.',
+    more: 'Mai mult',
+  },
+  placeholder: {
+    input: 'V膬 rug膬m s膬 introduce葲i',
+    select: 'V膬 rug膬m s膬 selecta葲i',
+  },
+  voice: {
+    language: {
+      zhHans: 'Chinez膬',
+      zhHant: 'Chinez膬 tradi葲ional膬',
+      enUS: 'Englez膬',
+      deDE: 'German膬',
+      frFR: 'Francez膬',
+      esES: 'Spaniol膬',
+      itIT: 'Italian膬',
+      thTH: 'Thailandez膬',
+      idID: 'Indonezian膬',
+      jaJP: 'Japonez膬',
+      koKR: 'Coreean膬',
+      ptBR: 'Portughez膬',
+      ruRU: 'Rus膬',
+      ukUA: 'Ucrainean膬',
+      viVN: 'Vietnamez膬',
+      roRO: 'Rom芒n膬',
+      hiIN: 'Hindi',
+      trTR: 'Turc膬',
+      faIR: 'Persan膬',
+      plPL: 'Polonez膬',
+    },
+  },
+  unit: {
+    char: 'caractere',
+  },
+  actionMsg: {
+    noModification: 'Nicio modificare 卯n acest moment.',
+    modifiedSuccessfully: 'Modificat cu succes',
+    modifiedUnsuccessfully: 'Modificare e葯uat膬',
+    copySuccessfully: 'Copiat cu succes',
+    paySucceeded: 'Plata a reu葯it',
+    payCancelled: 'Plata a fost anulat膬',
+    generatedSuccessfully: 'Generat cu succes',
+    generatedUnsuccessfully: 'Generare e葯uat膬',
+  },
+  model: {
+    params: {
+      temperature: 'Temperatur膬',
+      temperatureTip:
+        'Controleaz膬 aleatorietatea: Reducerea duce la mai pu葲ine complet膬ri aleatorii. Pe m膬sur膬 ce temperatura se apropie de zero, modelul va deveni deterministic 葯i repetitiv.',
+      top_p: 'Top P',
+      top_pTip:
+        'Controleaz膬 diversitatea prin e葯antionarea nucleului: 0,5 卯nseamn膬 c膬 jum膬tate din toate op葲iunile ponderate dup膬 probabilitate sunt luate 卯n considerare.',
+      presence_penalty: 'Penalizare prezen葲膬',
+      presence_penaltyTip:
+        'C芒t de mult s膬 se penalizeze noile jetoane 卯n func葲ie de dac膬 apar sau nu 卯n textul de p芒n膬 acum.\nCre葯te probabilitatea modelului de a vorbi despre subiecte noi.',
+      frequency_penalty: 'Penalizare frecven葲膬',
+      frequency_penaltyTip:
+        'C芒t de mult s膬 se penalizeze noile jetoane 卯n func葲ie de frecven葲a lor existent膬 卯n textul de p芒n膬 acum.\nScade probabilitatea modelului de a repeta aceea葯i linie cuv芒nt cu cuv芒nt.',
+      max_tokens: 'Jetoane maxime',
+      max_tokensTip:
+        'Folosit pentru a limita lungimea maxim膬 a r膬spunsului, 卯n jetoane.\nValori mai mari pot limita spa葲iul r膬mas pentru cuvintele promptului, jurnalele de chat 葯i cuno葯tin葲e.\nSe recomand膬 s膬 fie setat la mai pu葲in de dou膬 treimi\ngpt-4-1106-preview, gpt-4-vision-preview jetoane maxime (intrare 128k ie葯ire 4k)',
+      maxTokenSettingTip: 'Setarea jetoanelor maxime este ridicat膬, limit芒nd poten葲ial spa葲iul pentru prompturi, interog膬ri 葯i date. Lua葲i 卯n considerare setarea acesteia la sub 2/3.',
+      setToCurrentModelMaxTokenTip: 'Jetoanele maxime sunt actualizate la 80% din jetoanele maxime ale modelului curent {{maxToken}}.',
+      stop_sequences: 'Secven葲e de oprire',
+      stop_sequencesTip: 'P芒n膬 la patru secven葲e 卯n care API-ul va 卯nceta s膬 genereze mai multe jetoane. Textul returnat nu va con葲ine secven葲a de oprire.',
+      stop_sequencesPlaceholder: 'Introduce葲i secven葲a 葯i ap膬sa葲i Tab',
+    },
+    tone: {
+      Creative: 'Creativ',
+      Balanced: 'Echilibrat',
+      Precise: 'Precis',
+      Custom: 'Personalizat',
+    },
+    addMoreModel: 'Merge葲i la set膬ri pentru a ad膬uga mai multe modele',
+    capabilities: 'Capacit膬葲i multimodale',
+    settingsLink: 'Set膬rile furnizorului de modele',
+  },
+  menus: {
+    status: 'beta',
+    explore: 'Exploreaz膬',
+    apps: 'Studio',
+    plugins: 'Plugin-uri',
+    pluginsTips: 'Integra葲i plugin-uri ter葲e p膬r葲i sau crea葲i AI-Plugin-uri compatibile cu ChatGPT.',
+    datasets: 'Cuno葯tin葲e',
+    datasetsTips: 'CUR脗ND DISPONIBIL: Importa葲i-v膬 propriile date text sau scrie葲i date 卯n timp real prin Webhook pentru 卯mbun膬t膬葲irea contextului LLM.',
+    newApp: 'Aplica葲ie nou膬',
+    newDataset: 'Creeaz膬 Cuno葯tin葲e',
+    tools: 'Instrumente',
+    exploreMarketplace: 'Explora葲i Marketplace',
+  },
+  userProfile: {
+    settings: 'Set膬ri',
+    emailSupport: 'Suport prin email',
+    workspace: 'Spa葲iu de lucru',
+    createWorkspace: 'Creeaz膬 Spa葲iu de lucru',
+    helpCenter: 'Ajutor',
+    communityFeedback: 'Feedback',
+    roadmap: 'Plan de ac葲iune',
+    community: 'Comunitate',
+    about: 'Despre',
+    logout: 'Deconectare',
+    github: 'GitHub',
+    support: 'Suport',
+    compliance: 'Conformitate',
+  },
+  settings: {
+    accountGroup: 'CONT',
+    workplaceGroup: 'SPA葰IU DE LUCRU',
+    account: 'Contul meu',
+    members: 'Membri',
+    billing: 'Facturare',
+    integrations: 'Integr膬ri',
+    language: 'Limb膬',
+    provider: 'Furnizor de modele',
+    dataSource: 'Surs膬 de date',
+    plugin: 'Plugin-uri',
+    apiBasedExtension: 'Extensie API',
+    generalGroup: 'GENERAL',
+  },
+  account: {
+    avatar: 'Avatar',
+    name: 'Nume',
+    email: 'Email',
+    password: 'Parol膬',
+    passwordTip: 'Pute葲i seta o parol膬 permanent膬 dac膬 nu dori葲i s膬 utiliza葲i coduri de conectare temporare',
+    setPassword: 'Seteaz膬 o parol膬',
+    resetPassword: 'Reseteaz膬 parola',
+    currentPassword: 'Parola curent膬',
+    newPassword: 'Parol膬 nou膬',
+    confirmPassword: 'Confirm膬 parola',
+    notEqual: 'Cele dou膬 parole sunt diferite.',
+    langGeniusAccount: 'Cont Dify',
+    langGeniusAccountTip: 'Contul Dify 葯i datele de utilizator asociate.',
+    editName: 'Editeaz膬 Nume',
+    showAppLength: 'Afi葯eaz膬 {{length}} aplica葲ii',
+    delete: '葮terge contul',
+    deleteTip: '葮tergerea contului v膬 va 葯terge definitiv toate datele 葯i nu pot fi recuperate.',
+    deleteConfirmTip: 'Pentru a confirma, trimite葲i urm膬toarele din e-mailul 卯nregistrat la ',
+    account: 'Cont',
+    studio: 'Dify Studio',
+    myAccount: 'Contul meu',
+    deletePrivacyLinkTip: 'Pentru mai multe informa葲ii despre modul 卯n care gestion膬m datele dvs., v膬 rug膬m s膬 consulta葲i',
+    deletePrivacyLink: 'Politica de confiden葲ialitate.',
+    deleteSuccessTip: 'Contul t膬u are nevoie de timp pentru a termina 葯tergerea. V膬 vom trimite un e-mail c芒nd totul este gata.',
+    deleteLabel: 'Pentru a confirma, v膬 rug膬m s膬 introduce葲i adresa de e-mail mai jos',
+    deletePlaceholder: 'V膬 rug膬m s膬 introduce葲i adresa de e-mail',
+    sendVerificationButton: 'Trimite葲i codul de verificare',
+    verificationPlaceholder: 'Lipi葲i codul din 6 cifre',
+    permanentlyDeleteButton: '葮terge葲i definitiv contul',
+    feedbackLabel: 'Spune葲i-ne de ce v-a葲i 葯ters contul?',
+    feedbackPlaceholder: 'Facultativ',
+    feedbackTitle: 'Feedback',
+    verificationLabel: 'Cod de verificare',
+    workspaceName: 'Numele spa葲iului de lucru',
+    editWorkspaceInfo: 'Editeaz膬 informa葲iile spa葲iului de lucru',
+    workspaceIcon: 'Iconi葲a de spa葲iu de lucru',
+  },
+  members: {
+    team: 'Echip膬',
+    invite: 'Adaug膬',
+    name: 'NUME',
+    lastActive: 'ULTIMA ACTIVITATE',
+    role: 'ROLURI',
+    pending: '脦n a葯teptare...',
+    owner: 'Proprietar',
+    admin: 'Administrator',
+    adminTip: 'Poate construi aplica葲ii 葯i gestiona set膬rile echipei',
+    normal: 'Normal',
+    normalTip: 'Poate doar utiliza aplica葲ii, nu poate construi aplica葲ii',
+    editor: 'Editor',
+    editorTip: 'Poate construi aplica葲ii, dar nu poate gestiona set膬rile echipei',
+    inviteTeamMember: 'Adaug膬 membru 卯n echip膬',
+    inviteTeamMemberTip: 'Pot accesa direct datele echipei dvs. dup膬 autentificare.',
+    emailNotSetup: 'Serverul de e-mail nu este configurat, astfel 卯nc芒t e-mailurile de invita葲ie nu pot fi trimise. V膬 rug膬m s膬 notifica葲i utilizatorii despre linkul de invita葲ie care va fi emis dup膬 invita葲ie.',
+    email: 'Email',
+    emailInvalid: 'Format de email invalid',
+    emailPlaceholder: 'V膬 rug膬m s膬 introduce葲i emailuri',
+    sendInvite: 'Trimite invita葲ie',
+    invitedAsRole: 'Invitat ca utilizator {{role}}',
+    invitationSent: 'Invita葲ie trimis膬',
+    invitationSentTip: 'Invita葲ia a fost trimis膬 葯i pot s膬 se autentifice 卯n Dify pentru a accesa datele echipei dvs.',
+    invitationLink: 'Link de invita葲ie',
+    failedInvitationEmails: 'Urm膬torii utilizatori nu au fost invita葲i cu succes',
+    ok: 'OK',
+    removeFromTeam: 'Elimin膬 din echip膬',
+    removeFromTeamTip: 'Va elimina accesul la echip膬',
+    setAdmin: 'Seteaz膬 ca administrator',
+    setMember: 'Seteaz膬 ca membru obi葯nuit',
+    setEditor: 'Seteaz膬 ca editor',
+    disInvite: 'Anuleaz膬 invita葲ia',
+    deleteMember: '葮terge membru',
+    you: '(Dvs.)',
+    datasetOperatorTip: 'Numai poate gestiona baza de cuno葯tin葲e',
+    builder: 'Constructor',
+    datasetOperator: 'Administrator de cuno葯tin葲e',
+    setBuilder: 'Setare ca constructor',
+    builderTip: 'Poate construi 葯i edita propriile aplica葲ii',
+  },
+  integrations: {
+    connected: 'Conectat',
+    google: 'Google',
+    googleAccount: 'Autentificare cu cont Google',
+    github: 'GitHub',
+    githubAccount: 'Autentificare cu cont GitHub',
+    connect: 'Conecteaz膬',
+  },
+  language: {
+    displayLanguage: 'Limb膬 de afi葯are',
+    timezone: 'Fus orar',
+  },
+  provider: {
+    apiKey: 'Cheie API',
+    enterYourKey: 'Introduce葲i cheia API aici',
+    invalidKey: 'Cheie API OpenAI nevalid膬',
+    validatedError: 'Validare e葯uat膬: ',
+    validating: 'Se valideaz膬 cheia...',
+    saveFailed: 'Salvarea cheii API a e葯uat',
+    apiKeyExceedBill: 'Aceast膬 CHEIE API nu are cot膬 disponibil膬, v膬 rug膬m s膬 citi葲i',
+    addKey: 'Adaug膬 cheie',
+    comingSoon: 'Cur芒nd disponibil',
+    editKey: 'Editeaz膬',
+    invalidApiKey: 'Cheie API nevalid膬',
+    azure: {
+      apiBase: 'Baz膬 API',
+      apiBasePlaceholder: 'URL-ul de baz膬 al API-ului pentru punctul final Azure OpenAI.',
+      apiKey: 'Cheie API',
+      apiKeyPlaceholder: 'Introduce葲i cheia API aici',
+      helpTip: 'Afla葲i despre serviciul Azure OpenAI',
+    },
+    openaiHosted: {
+      openaiHosted: 'OpenAI g膬zduit',
+      onTrial: '脦N PROB膫',
+      exhausted: 'COT膫 EPUIZAT膫',
+      desc: 'Serviciul de g膬zduire OpenAI furnizat de Dify v膬 permite s膬 utiliza葲i modele precum GPT-3.5. 脦nainte ca cota de prob膬 s膬 fie epuizat膬, trebuie s膬 configura葲i al葲i furnizori de modele.',
+      callTimes: 'Apeluri',
+      usedUp: 'Cota de prob膬 a fost epuizat膬. Ad膬uga葲i propriul furnizor de modele.',
+      useYourModel: '脦n prezent se utilizeaz膬 propriul furnizor de modele.',
+      close: '脦nchide',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: '脦N PROB膫',
+      exhausted: 'COT膫 EPUIZAT膫',
+      desc: 'Model puternic, care exceleaz膬 卯ntr-o gam膬 larg膬 de sarcini, de la dialog sofisticat 葯i generare de con葲inut creativ, p芒n膬 la instruc葲iuni detaliate.',
+      callTimes: 'Apeluri',
+      usedUp: 'Cota de prob膬 a fost epuizat膬. Ad膬uga葲i propriul furnizor de modele.',
+      useYourModel: '脦n prezent se utilizeaz膬 propriul furnizor de modele.',
+      close: '脦nchide',
+      trialQuotaTip: 'Cota de 卯ncercare Anthropic va expira pe 11.03.2025 葯i nu va mai fi disponibil膬 ulterior. V膬 rug膬m s膬 o utiliza葲i la timp.',
+    },
+    anthropic: {
+      using: 'Capacitatea de 卯ncorporare utilizeaz膬',
+      enableTip: 'Pentru a activa modelul Anthropic, trebuie s膬 v膬 lega葲i mai 卯nt芒i la OpenAI sau la serviciul Azure OpenAI.',
+      notEnabled: 'Nu este activat',
+      keyFrom: 'Ob葲ine葲i cheia API de la Anthropic',
+    },
+    encrypted: {
+      front: 'Cheia dvs. API va fi criptat膬 葯i stocat膬 folosind',
+      back: ' tehnologie.',
+    },
+  },
+  modelProvider: {
+    notConfigured: 'Modelul de sistem nu a fost 卯nc膬 configurat complet, iar unele func葲ii pot fi indisponibile.',
+    systemModelSettings: 'Set膬ri model de sistem',
+    systemModelSettingsLink: 'De ce este necesar s膬 se configureze un model de sistem?',
+    selectModel: 'Selecta葲i modelul dvs.',
+    setupModelFirst: 'V膬 rug膬m s膬 configura葲i mai 卯nt芒i modelul',
+    systemReasoningModel: {
+      key: 'Model de ra葲ionament de sistem',
+      tip: 'Seta葲i modelul de inferen葲膬 implicit care va fi utilizat pentru crearea aplica葲iilor, precum 葯i caracteristici precum generarea de nume pentru dialog 葯i sugestia urm膬toarei 卯ntreb膬ri vor utiliza, de asemenea, modelul de inferen葲膬 implicit.',
+    },
+    embeddingModel: {
+      key: 'Model de 卯ncorporare',
+      tip: 'Seta葲i modelul implicit pentru procesarea 卯ncorpor膬rii documentelor a Cuno葯tin葲elor, at芒t pentru recuperare, c芒t 葯i pentru importul Cuno葯tin葲elor, folosind acest model de 卯ncorporare pentru procesarea vectoriz膬rii. Comutarea va cauza inconsecven葲a dimensiunii vectorului 卯ntre Cuno葯tin葲ele importate 葯i 卯ntrebarea, ceea ce va duce la e葯ecul recuper膬rii. Pentru a evita e葯ecul recuper膬rii, v膬 rug膬m s膬 nu comuta葲i acest model la 卯nt芒mplare.',
+      required: 'Modelul de 卯ncorporare este obligatoriu',
+    },
+    speechToTextModel: {
+      key: 'Model de conversie text-la-vorbire',
+      tip: 'Seta葲i modelul implicit pentru intrarea de conversie text-la-vorbire 卯n conversa葲ie.',
+    },
+    ttsModel: {
+      key: 'Model de conversie vorbire-la-text',
+      tip: 'Seta葲i modelul implicit pentru intrarea de conversie vorbire-la-text 卯n conversa葲ie.',
+    },
+    rerankModel: {
+      key: 'Model de reordonare',
+      tip: 'Modelul de reordonare va reordona lista de documente candidate pe baza potrivirii semantice cu interogarea utilizatorului, 卯mbun膬t膬葲ind rezultatele clasific膬rii semantice',
+    },
+    quota: 'Cot膬',
+    searchModel: 'Model de c膬utare',
+    noModelFound: 'Nu a fost g膬sit niciun model pentru {{model}}',
+    models: 'Modele',
+    showMoreModelProvider: 'Arat膬 mai multe furnizori de modele',
+    selector: {
+      tip: 'Acest model a fost eliminat. V膬 rug膬m s膬 ad膬uga葲i un model sau s膬 selecta葲i un alt model.',
+      emptyTip: 'Nu exist膬 modele disponibile',
+      emptySetting: 'V膬 rug膬m s膬 merge葲i la set膬ri pentru a configura',
+      rerankTip: 'V膬 rug膬m s膬 configura葲i modelul de reordonare',
+    },
+    card: {
+      quota: 'COT膫',
+      onTrial: '脦n prob膬',
+      paid: 'Pl膬tit',
+      quotaExhausted: 'Cot膬 epuizat膬',
+      callTimes: 'Apeluri',
+      tokens: 'Jetoane',
+      buyQuota: 'Cump膬r膬 cot膬',
+      priorityUse: 'Utilizare prioritar膬',
+      removeKey: 'Elimin膬 cheia API',
+      tip: 'Prioritate va fi acordat膬 cotei pl膬tite. Cota de prob膬 va fi utilizat膬 dup膬 epuizarea cotei pl膬tite.',
+    },
+    item: {
+      deleteDesc: '{{modelName}} sunt utilizate ca modele de ra葲ionare a sistemului. Unele func葲ii nu vor fi disponibile dup膬 eliminare. V膬 rug膬m s膬 confirma葲i.',
+      freeQuota: 'COT膫 GRATUIT膫',
+    },
+    addApiKey: 'Ad膬uga葲i cheia dvs. API',
+    invalidApiKey: 'Cheie API nevalid膬',
+    encrypted: {
+      front: 'Cheia dvs. API va fi criptat膬 葯i stocat膬 folosind',
+      back: ' tehnologie.',
+    },
+    freeQuota: {
+      howToEarn: 'Cum s膬 c芒葯tiga葲i',
+    },
+    addMoreModelProvider: 'AD膫UGA葰I MAI MUL葰I FURNIZORI DE MODELE',
+    addModel: 'Ad膬uga葲i model',
+    modelsNum: '{{num}} Modele',
+    showModels: 'Arat膬 modele',
+    showModelsNum: 'Arat膬 {{num}} modele',
+    collapse: 'Restr芒nge',
+    config: 'Configurare',
+    modelAndParameters: 'Model 葯i parametri',
+    model: 'Model',
+    featureSupported: '{{feature}} acceptat',
+    callTimes: 'Apeluri',
+    credits: 'Credite mesaje',
+    buyQuota: 'Cump膬r膬 cot膬',
+    getFreeTokens: 'Ob葲ine葲i jetoane gratuite',
+    priorityUsing: 'Prioritizeaz膬 utilizarea',
+    deprecated: '脦nvechit',
+    confirmDelete: 'confirma葲i 葯tergerea?',
+    quotaTip: 'Jetoane gratuite disponibile r膬mase',
+    loadPresets: '脦ncarc膬 preset膬ri',
+    parameters: 'PARAMETRI',
+    loadBalancingHeadline: 'Echilibrare',
+    loadBalancingInfo: '脦n mod implicit, echilibrarea 卯nc膬rc膬rii utilizeaz膬 strategia Round-robin. Dac膬 se declan葯eaz膬 limitarea ratei, se va aplica o perioad膬 de reactivare de 1 minut.',
+    loadBalancing: 'Echilibrare',
+    apiKeyRateLimit: 'Limita de vitez膬 a fost atins膬, disponibil膬 dup膬 {{secunde}}s',
+    providerManaged: 'Gestionat de furnizor',
+    providerManagedDescription: 'Utiliza葲i setul unic de acredit膬ri furnizat de furnizorul de modele.',
+    defaultConfig: 'Configura葲ie implicit膬',
+    addConfig: 'Ad膬uga葲i configura葲ie',
+    apiKey: 'CHEIE API',
+    modelHasBeenDeprecated: 'Acest model a fost depreciat',
+    loadBalancingDescription: 'Reduce葲i presiunea cu mai multe seturi de acredit膬ri.',
+    apiKeyStatusNormal: 'Starea APIKey este normal膬',
+    loadBalancingLeastKeyWarning: 'Pentru a activa echilibrarea 卯nc膬rc膬rii trebuie activate cel pu葲in 2 chei.',
+    editConfig: 'Edita葲i configura葲ia',
+    configLoadBalancing: 'Echilibrarea 卯nc膬rc膬rii de configurare',
+    upgradeForLoadBalancing: 'Actualiza葲i-v膬 planul pentru a activa Load Balancing.',
+    configureTip: 'Configura葲i api-key sau ad膬uga葲i modelul de utilizat',
+    installProvider: 'Instalarea furnizorilor de modele',
+    emptyProviderTitle: 'Furnizorul de modele nu este configurat',
+    discoverMore: 'Descoper膬 mai multe 卯n',
+    emptyProviderTip: 'V膬 rug膬m s膬 instala葲i mai 卯nt芒i un furnizor de modele.',
+    toBeConfigured: 'De configurat',
+  },
+  dataSource: {
+    add: 'Ad膬uga葲i o surs膬 de date',
+    connect: 'Conecta葲i',
+    notion: {
+      title: 'Notion',
+      description: 'Utilizarea Notion ca surs膬 de date pentru Cuno葯tin葲e.',
+      connectedWorkspace: 'Spa葲iu de lucru conectat',
+      addWorkspace: 'Ad膬uga葲i spa葲iu de lucru',
+      connected: 'Conectat',
+      disconnected: 'Deconectat',
+      changeAuthorizedPages: 'Schimba葲i paginile autorizate',
+      pagesAuthorized: 'Pagini autorizate',
+      sync: 'Sincronizare',
+      remove: 'Elimin膬',
+      selector: {
+        pageSelected: 'Pagini selectate',
+        searchPages: 'C膬uta葲i pagini...',
+        noSearchResult: 'Niciun rezultat la c膬utare',
+        addPages: 'Ad膬uga葲i pagini',
+        preview: 'PREVIZUALIZARE',
+      },
+    },
+    website: {
+      inactive: 'Inactiv',
+      description: 'Importa葲i con葲inut de pe site-uri web folosind crawlerul web.',
+      active: 'Activ',
+      with: 'Cu',
+      title: 'Site-ul web',
+      configuredCrawlers: 'Crawlere configurate',
+    },
+    configure: 'Configura',
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'Cheie API',
+      apiKeyPlaceholder: 'Introduce葲i cheia dvs. API',
+      keyFrom: 'Ob葲ine葲i cheia dvs. SerpAPI din pagina contului SerpAPI',
+    },
+  },
+  apiBasedExtension: {
+    title: 'Extensiile bazate pe API ofer膬 o gestionare centralizat膬 a API-urilor, simplific芒nd configura葲ia pentru o utilizare u葯oar膬 卯n aplica葲iile Dify.',
+    link: 'Afla葲i cum s膬 dezvolta葲i propria extensie bazat膬 pe API.',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: 'Ad膬uga葲i extensie API',
+    selector: {
+      title: 'Extensie API',
+      placeholder: 'V膬 rug膬m s膬 selecta葲i extensia API',
+      manage: 'Gestiona葲i extensia API',
+    },
+    modal: {
+      title: 'Ad膬uga葲i extensie API',
+      editTitle: 'Edita葲i extensia API',
+      name: {
+        title: 'Nume',
+        placeholder: 'V膬 rug膬m s膬 introduce葲i numele',
+      },
+      apiEndpoint: {
+        title: 'Endpoint API',
+        placeholder: 'V膬 rug膬m s膬 introduce葲i endpoint-ul API',
+      },
+      apiKey: {
+        title: 'Cheie API',
+        placeholder: 'V膬 rug膬m s膬 introduce葲i cheia API',
+        lengthError: 'Lungimea cheii API nu poate fi mai mic膬 de 5 caractere',
+      },
+    },
+    type: 'Tip',
+  },
+  about: {
+    changeLog: 'Jurnal modific膬ri',
+    updateNow: 'Actualiza葲i acum',
+    nowAvailable: 'Dify {{version}} este acum disponibil.',
+    latestAvailable: 'Dify {{version}} este ultima versiune disponibil膬.',
+  },
+  appMenus: {
+    overview: 'Monitorizare',
+    promptEng: 'Orchestrare',
+    apiAccess: 'Acces API',
+    logAndAnn: 'Jurnale 葯i Ann.',
+    logs: 'Jurnale',
+  },
+  environment: {
+    testing: 'TESTARE',
+    development: 'DEZVOLTARE',
+  },
+  appModes: {
+    completionApp: 'Generator de text',
+    chatApp: 'Aplica葲ie de chat',
+  },
+  datasetMenus: {
+    documents: 'Documente',
+    hitTesting: 'Testare recuperare',
+    settings: 'Set膬ri',
+    emptyTip: 'Cuno葯tin葲ele nu au fost asociate, v膬 rug膬m s膬 merge葲i la aplica葲ie sau la plug-in pentru a finaliza asocierea.',
+    viewDoc: 'Vizualiza葲i documenta葲ia',
+    relatedApp: 'aplica葲ii asociate',
+    noRelatedApp: 'F膬r膬 aplica葲ii conectate',
+  },
+  voiceInput: {
+    speaking: 'Vorbi葲i acum...',
+    converting: 'Se converte葯te la text...',
+    notAllow: 'microfonul nu este autorizat',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: 'Redenume葯te conversa葲ia',
+    conversationName: 'Nume conversa葲ie',
+    conversationNamePlaceholder: 'V膬 rug膬m s膬 introduce葲i numele conversa葲iei',
+    conversationNameCanNotEmpty: 'Numele conversa葲iei este obligatoriu',
+    citation: {
+      title: 'CIT膫RI',
+      linkToDataset: 'Leg膬tur膬 la Cuno葯tin葲e',
+      characters: 'Caractere:',
+      hitCount: 'Num膬r de recuper膬ri:',
+      vectorHash: 'Hash vector:',
+      hitScore: 'Scor de recuperare:',
+    },
+    inputPlaceholder: 'Vorbe葯te cu Bot',
+    thinking: 'G芒ndire...',
+    thought: 'G芒nd',
+    resend: 'Reexpedia葲i',
+  },
+  promptEditor: {
+    placeholder: 'Scrie葲i aici prompt-ul, introduce葲i \'{}\' pentru a insera o variabil膬, introduce葲i \'/\' pentru a insera un bloc de con葲inut prompt',
+    context: {
+      item: {
+        title: 'Context',
+        desc: 'Insera葲i 葯ablon de context',
+      },
+      modal: {
+        title: '{{num}} Cuno葯tin葲e 卯n context',
+        add: 'Ad膬uga葲i context ',
+        footer: 'Pute葲i gestiona contextele 卯n sec葲iunea Context de mai jos.',
+      },
+    },
+    history: {
+      item: {
+        title: 'Istoric conversa葲ie',
+        desc: 'Insera葲i 葯ablon de mesaj istoric',
+      },
+      modal: {
+        title: 'EXEMPLU',
+        user: 'Salut',
+        assistant: 'Salut! Cum v膬 pot ajuta ast膬zi?',
+        edit: 'Edita葲i numele rolurilor de conversa葲ie',
+      },
+    },
+    variable: {
+      item: {
+        title: 'Variabile 葯i instrumente externe',
+        desc: 'Insera葲i variabile 葯i instrumente externe',
+      },
+      outputToolDisabledItem: {
+        title: 'Variabile',
+        desc: 'Insera葲i variabile',
+      },
+      modal: {
+        add: 'Nou膬 variabil膬',
+        addTool: 'Nou instrument',
+      },
+    },
+    query: {
+      item: {
+        title: 'Interogare',
+        desc: 'Insera葲i 葯ablon de interogare utilizator',
+      },
+    },
+    existed: 'Exist膬 deja 卯n prompt',
+  },
+  imageUploader: {
+    uploadFromComputer: '脦nc膬rca葲i de pe computer',
+    uploadFromComputerReadError: 'Citirea imaginii a e葯uat, v膬 rug膬m 卯ncerca葲i din nou.',
+    uploadFromComputerUploadError: '脦nc膬rcarea imaginii a e葯uat, v膬 rug膬m 卯nc膬rca葲i din nou.',
+    uploadFromComputerLimit: 'Imaginile 卯nc膬rcate nu pot dep膬葯i {{size}} MB',
+    pasteImageLink: 'Insera葲i link-ul imaginii',
+    pasteImageLinkInputPlaceholder: 'Insera葲i link-ul imaginii aici',
+    pasteImageLinkInvalid: 'Link-ul imaginii este nevalid',
+    imageUpload: '脦nc膬rcare imagine',
+  },
+  tag: {
+    placeholder: 'Toate etichetele',
+    addNew: 'Ad膬uga葲i o etichet膬 nou膬',
+    noTag: 'Nicio etichet膬',
+    noTagYet: '脦nc膬 nu exist膬 etichete',
+    addTag: 'Ad膬uga葲i etichete',
+    editTag: 'Edita葲i etichete',
+    manageTags: 'Gestiona葲i etichete',
+    selectorPlaceholder: 'Tasta葲i pentru a c膬uta sau crea',
+    create: 'Crea葲i',
+    delete: '葮terge葲i eticheta',
+    deleteTip: 'Eticheta este utilizat膬, 葯terge葲i-o?',
+    created: 'Etichet膬 creat膬 cu succes',
+    failed: 'Crearea etichetei a e葯uat',
+  },
+  errorMsg: {
+    fieldRequired: '{{c芒mp}} este obligatoriu',
+    urlError: 'URL-ul ar trebui s膬 卯nceap膬 cu http:// sau https://',
+  },
+  fileUploader: {
+    uploadFromComputerReadError: 'Citirea fi葯ierului a e葯uat, v膬 rug膬m s膬 卯ncerca葲i din nou.',
+    fileExtensionNotSupport: 'Extensia de fi葯ier nu este acceptat膬',
+    uploadFromComputer: '脦nc膬rcare local膬',
+    pasteFileLinkInputPlaceholder: 'Introduce葲i adresa URL...',
+    uploadFromComputerUploadError: '脦nc膬rcarea fi葯ierului a e葯uat, v膬 rug膬m s膬 卯nc膬rca葲i din nou.',
+    pasteFileLinkInvalid: 'Link fi葯ier nevalid',
+    uploadFromComputerLimit: '脦nc膬rcarea fi葯ierului nu poate dep膬葯i {{size}}',
+    pasteFileLink: 'Lipi葲i linkul fi葯ierului',
+  },
+  license: {
+    expiring: 'Expir膬 卯ntr-o zi',
+    expiring_plural: 'Expir膬 卯n {{count}} zile',
+  },
+  pagination: {
+    perPage: 'Articole pe pagin膬',
+  },
+  theme: {
+    theme: 'Tem膬',
+    light: 'lumina',
+    auto: 'sistem',
+    dark: '卯ntunecat',
+  },
+  compliance: {
+    sandboxUpgradeTooltip: 'Disponibil膬 doar cu un plan Profesional sau de Echip膬.',
+    iso27001: 'Certificare ISO 27001:2022',
+    professionalUpgradeTooltip: 'Disponibil膬 doar cu un plan de echip膬 sau superior.',
+    gdpr: 'GDPR DPA',
+    soc2Type1: 'Raport SOC 2 Tip I',
+    soc2Type2: 'Raport SOC 2 Tip II',
+  },
+  imageInput: {
+    supportedFormats: 'Suport膬 PNG, JPG, JPEG, WEBP 葯i GIF',
+    browse: 'naviga',
+    dropImageHere: 'Trage葲i imaginea aici sau',
+  },
+}
+
+export default translation
diff --git a/i18n/ro-RO/custom.ts b/i18n/ro-RO/custom.ts
new file mode 100644
index 0000000..923ec39
--- /dev/null
+++ b/i18n/ro-RO/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: 'Personalizare',
+  upgradeTip: {
+    prefix: 'Actualiza葲i-v膬 planul pentru a',
+    suffix: 's膬 v膬 personaliza葲i marca.',
+    des: '脦mbun膬t膬葲e葯te-葲i planul pentru a-葲i personaliza marca',
+    title: 'Upgradeaz膬-葲i planul',
+  },
+  webapp: {
+    title: 'Personaliza葲i marca WebApp',
+    removeBrand: 'Elimina葲i "Powered by Dify"',
+    changeLogo: 'Schimba葲i imaginea m膬rcii "Powered by"',
+    changeLogoTip: 'Format SVG sau PNG cu o dimensiune minim膬 de 40x40px',
+  },
+  app: {
+    title: 'Personaliza葲i marca antetului aplica葲iei',
+    changeLogoTip: 'Format SVG sau PNG cu o dimensiune minim膬 de 80x80px',
+  },
+  upload: '脦nc膬rcare',
+  uploading: 'Se 卯ncarc膬',
+  uploadedFail: '脦nc膬rcarea imaginii a e葯uat, v膬 rug膬m s膬 o re卯nc膬rca葲i.',
+  change: 'Schimb膬',
+  apply: 'Aplic膬',
+  restore: 'Restabile葯te valorile implicite',
+  customize: {
+    contactUs: ' contacta葲i-ne ',
+    prefix: 'Pentru a personaliza sigla m膬rcii 卯n cadrul aplica葲iei, v膬 rug膬m',
+    suffix: 's膬 actualiza葲i la edi葲ia Enterprise.',
+  },
+}
+
+export default translation
diff --git a/i18n/ro-RO/dataset-creation.ts b/i18n/ro-RO/dataset-creation.ts
new file mode 100644
index 0000000..ce6872c
--- /dev/null
+++ b/i18n/ro-RO/dataset-creation.ts
@@ -0,0 +1,218 @@
+const translation = {
+  steps: {
+    header: {
+      creation: 'Crea葲i Cuno葯tin葲e',
+      update: 'Ad膬uga葲i date',
+      fallbackRoute: 'Cunoa葯tere',
+    },
+    one: 'Alege葲i sursa de date',
+    two: 'Prelucrarea 葯i cur膬葲area textului',
+    three: 'Executa葲i 葯i finaliza葲i',
+  },
+  error: {
+    unavailable: 'Aceast膬 Cuno葯tin葲膬 nu este disponibil膬',
+  },
+  stepOne: {
+    filePreview: 'Previzualizare fi葯ier',
+    pagePreview: 'Previzualizare pagin膬',
+    dataSourceType: {
+      file: 'Importa葲i din fi葯ier text',
+      notion: 'Sincroniza葲i din Notion',
+      web: 'Sincroniza葲i din site web',
+    },
+    uploader: {
+      title: '脦nc膬rca葲i fi葯ier text',
+      button: 'Trage葲i 葯i plasa葲i fi葯iere sau foldere sau',
+      browse: 'R膬sfoire',
+      tip: 'Accept膬 {{supportTypes}}. Maxim {{size}}MB fiecare.',
+      validation: {
+        typeError: 'Tipul de fi葯ier nu este acceptat',
+        size: 'Fi葯ierul este prea mare. Maximul este de {{size}}MB',
+        count: 'Nu se accept膬 mai multe fi葯iere',
+        filesNumber: 'A葲i atins limita de 卯nc膬rcare 卯n lot de {{filesNumber}} fi葯iere.',
+      },
+      cancel: 'Anuleaz膬',
+      change: 'Schimb膬',
+      failed: '脦nc膬rcarea a e葯uat',
+    },
+    notionSyncTitle: 'Notion nu este conectat',
+    notionSyncTip: 'Pentru a sincroniza cu Notion, trebuie mai 卯nt芒i s膬 se stabileasc膬 o conexiune la Notion.',
+    connect: 'Mergi la conectare',
+    button: 'urm膬torul',
+    emptyDatasetCreation: 'Vreau s膬 creez o Cuno葯tin葲膬 goal膬',
+    modal: {
+      title: 'Crea葲i o Cuno葯tin葲膬 goal膬',
+      tip: 'O Cuno葯tin葲膬 goal膬 nu va con葲ine niciun document, iar dvs. pute葲i 卯nc膬rca documente 卯n orice moment.',
+      input: 'Numele Cuno葯tin葲ei',
+      placeholder: 'V膬 rug膬m s膬 introduce葲i',
+      nameNotEmpty: 'Numele nu poate fi gol',
+      nameLengthInvalid: 'Numele trebuie s膬 fie 卯ntre 1 葯i 40 de caractere',
+      cancelButton: 'Anuleaz膬',
+      confirmButton: 'Creeaz膬',
+      failed: 'Crearea a e葯uat',
+    },
+    website: {
+      crawlSubPage: 'Accesarea cu crawlere a subpaginilor',
+      limit: 'Limit膬',
+      selectAll: 'Selecteaz膬 tot',
+      configure: 'Configura',
+      preview: 'Previzualizare',
+      run: 'Alerga',
+      maxDepth: 'Ad芒ncime maxim膬',
+      firecrawlDoc: 'Documente Firecrawl',
+      options: 'Op葲iuni',
+      exceptionErrorTitle: 'A ap膬rut o excep葲ie 卯n timpul rul膬rii lucr膬rii Firecrawl:',
+      firecrawlTitle: 'Extrage葲i con葲inut web cu 馃敟Firecrawl',
+      unknownError: 'Eroare necunoscut膬',
+      scrapTimeInfo: 'Pagini r膬zuite {{total}} 卯n total 卯n {{timp}}s',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      excludePaths: 'Excluderea c膬ilor',
+      resetAll: 'Reseta葲i toate',
+      extractOnlyMainContent: 'Extrage葲i doar con葲inutul principal (f膬r膬 anteturi, navig膬ri, subsoluri etc.)',
+      fireCrawlNotConfiguredDescription: 'Configura葲i Firecrawl cu cheia API pentru a-l utiliza.',
+      fireCrawlNotConfigured: 'Firecrawl nu este configurat',
+      includeOnlyPaths: 'Include葲i numai c膬i',
+      totalPageScraped: 'Total pagini r膬zuite:',
+      maxDepthTooltip: 'Ad芒ncimea maxim膬 de accesat cu crawlere 卯n raport cu adresa URL introdus膬. Ad芒ncimea 0 doar r膬zuie葯te pagina URL-ului introdus, ad芒ncimea 1 r膬zuie葯te url-ul 葯i tot ceea ce dup膬 ce a introdusURL + un / 葯i a葯a mai departe.',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      chooseProvider: 'Selecta葲i un furnizor',
+      jinaReaderNotConfiguredDescription: 'Configura葲i Jina Reader introduc芒nd cheia API gratuit膬 pentru acces.',
+      useSitemap: 'Utilizarea h膬r葲ii site-ului',
+      jinaReaderDoc: 'Afla葲i mai multe despre Jina Reader',
+      jinaReaderTitle: 'Converti葲i 卯ntregul site 卯n Markdown',
+      jinaReaderNotConfigured: 'Jina Reader nu este configurat',
+      useSitemapTooltip: 'Urma葲i harta site-ului pentru a accesa cu crawlere site-ul. Dac膬 nu, Jina Reader va accesa cu crawlere iterativ 卯n func葲ie de relevan葲a paginii, produc芒nd mai pu葲ine pagini, dar de calitate superioar膬.',
+      waterCrawlNotConfigured: 'Watercrawl nu este configurat',
+      watercrawlTitle: 'Extrage葲i con葲inut web cu Watercrawl',
+      configureJinaReader: 'Configureaz膬 Jina Reader',
+      waterCrawlNotConfiguredDescription: 'Configureaz膬 Watercrawl cu cheia API pentru a-l folosi.',
+      watercrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      configureFirecrawl: 'Configureaz膬 Firecrawl',
+      watercrawlDoc: 'Documentele Watercrawl',
+      configureWatercrawl: 'Configureaz膬 Watercrawl',
+    },
+    cancel: 'Anula',
+  },
+  stepTwo: {
+    segmentation: 'Set膬ri de segmentare',
+    auto: 'Automat',
+    autoDescription: 'Seteaz膬 automat regulile de segmentare 葯i prelucrare. Utilizatorilor necunoscu葲i li se recomand膬 s膬 selecteze aceast膬 op葲iune.',
+    custom: 'Personalizat',
+    customDescription: 'Personaliza葲i regulile de segmentare, lungimea segmentelor 葯i regulile de prelucrare, etc.',
+    separator: 'Identificator de segment',
+    separatorPlaceholder: 'De exemplu, linie nou膬 (\\\\n) sau separator special (cum ar fi "***")',
+    maxLength: 'Lungimea maxim膬 a segmentului',
+    overlap: 'Suprapunerea segmentelor',
+    overlapTip: 'Setarea suprapunerii segmentelor poate men葲ine relevan葲a semantic膬 卯ntre ele, 卯mbun膬t膬葲ind efectul de recuperare. Se recomand膬 s膬 seta葲i 10%-25% din dimensiunea maxim膬 a segmentului.',
+    overlapCheck: 'suprapunerea segmentului nu ar trebui s膬 fie mai mare dec芒t lungimea maxim膬 a segmentului',
+    rules: 'Reguli de prelucrare a textului',
+    removeExtraSpaces: '脦nlocuie葯te spa葲iile consecutive, liniile noi 葯i taburile',
+    removeUrlEmails: '葮terge toate adresele URL 葯i e-mailurile',
+    removeStopwords: 'Elimina葲i cuvintele de umplere, cum ar fi "a", "an", "the"',
+    preview: 'Confirm膬 葯i previzualizeaz膬',
+    reset: 'Reseteaz膬',
+    indexMode: 'Mod de indexare',
+    qualified: 'Calitate ridicat膬',
+    recommend: 'Recomand膬',
+    qualifiedTip: 'Apeleaz膬 interfa葲a de 卯ncorporare a sistemului implicit pentru a procesa 葯i a oferi o precizie mai mare atunci c芒nd utilizatorii interogheaz膬.',
+    warning: 'V膬 rug膬m s膬 seta葲i mai 卯nt芒i cheia API a furnizorului de modele.',
+    click: 'Mergi la set膬ri',
+    economical: 'Economic',
+    economicalTip: 'Utiliza葲i motoare de vectori offline, indexuri de cuvinte cheie etc. pentru a reduce precizia f膬r膬 a cheltui jetoane',
+    QATitle: 'Segmentarea 卯n format 脦ntrebare 葯i R膬spuns',
+    QATip: 'Activarea acestei op葲iuni va consuma mai multe jetoane',
+    QALanguage: 'Segmenteaz膬 folosind',
+    estimateCost: 'Estimare',
+    estimateSegment: 'Segmente estimate',
+    segmentCount: 'segmente',
+    calculating: 'Se calculeaz膬...',
+    fileSource: 'Prelucreaz膬 documente',
+    notionSource: 'Prelucreaz膬 pagini',
+    other: '葯i alte ',
+    fileUnit: ' fi葯iere',
+    notionUnit: ' pagini',
+    previousStep: 'Pasul anterior',
+    nextStep: 'Salveaz膬 葯i Proceseaz膬',
+    save: 'Salveaz膬 葯i Proceseaz膬',
+    cancel: 'Anuleaz膬',
+    sideTipTitle: 'De ce segmentare 葯i prelucrare?',
+    sideTipP1: 'Atunci c芒nd se prelucreaz膬 date text, segmentarea 葯i cur膬葲area sunt dou膬 etape importante de pre-procesare.',
+    sideTipP2: 'Segmentarea 卯mparte textul lung 卯n paragrafe, astfel 卯nc芒t modelele s膬 poat膬 卯n葲elege mai bine. Acest lucru 卯mbun膬t膬葲e葯te calitatea 葯i relevan葲a rezultatelor modelului.',
+    sideTipP3: 'Cur膬葲area elimin膬 caracterele 葯i formatele inutile, f膬c芒nd Cuno葯tin葲ele mai curate 葯i mai u葯or de analizat.',
+    sideTipP4: 'O segmentare 葯i cur膬葲are adecvat膬 卯mbun膬t膬葲esc performan葲a modelului, oferind rezultate mai precise 葯i valoroase.',
+    previewTitle: 'Previzualizare',
+    previewTitleButton: 'Previzualizare',
+    previewButton: 'Comutare la format 卯ntrebare 葯i r膬spuns',
+    previewSwitchTipStart: 'Previzualizarea curent膬 a segmentului este 卯n format text, comutarea la o previzualizare 卯n format 卯ntrebare 葯i r膬spuns va',
+    previewSwitchTipEnd: ' consuma jetoane suplimentare',
+    characters: 'caractere',
+    indexSettingTip: 'Pentru a modifica metoda de indexare, v膬 rug膬m s膬 merge葲i la ',
+    retrievalSettingTip: 'Pentru a modifica metoda de indexare, v膬 rug膬m s膬 merge葲i la ',
+    datasetSettingLink: 'set膬rile Cuno葯tin葲ei.',
+    webpageUnit: 'Pagini',
+    websiteSource: 'Site-ul web de preprocesare',
+    separatorTip: 'Un delimitator este caracterul folosit pentru a separa textul. \\n\\n 葯i \\n sunt delimitatori utiliza葲i 卯n mod obi葯nuit pentru separarea paragrafelor 葯i liniilor. Combinate cu virgule (\\n\\n,\\n), paragrafele vor fi segmentate pe linii atunci c芒nd dep膬葯esc lungimea maxim膬 a buc膬葲ii. De asemenea, pute葲i utiliza delimitatori speciali defini葲i de dumneavoastr膬 (de exemplu, ***).',
+    maxLengthCheck: 'Lungimea maxim膬 a buc膬葲ii trebuie s膬 fie mai mic膬 de {{limit}}',
+    notAvailableForQA: 'Nu este disponibil pentru Indexul de 卯ntreb膬ri 葯i r膬spunsuri',
+    generalTip: 'Modul general de fragmentare a textului, buc膬葲ile recuperate 葯i rechemate sunt acelea葯i.',
+    previewChunk: 'Previzualizare bucat膬',
+    previewChunkTip: 'Face葲i clic pe butonul "Previzualizare bucat膬" din st芒nga pentru a 卯nc膬rca previzualizarea',
+    fullDoc: 'Documentul complet',
+    parentChildDelimiterTip: 'Un delimitator este caracterul folosit pentru a separa textul. \\n\\n este recomandat pentru 卯mp膬r葲irea documentului original 卯n buc膬葲i p膬rinte mari. De asemenea, pute葲i utiliza delimitatori speciali defini葲i de dvs.',
+    fullDocTip: '脦ntregul document este folosit ca bucat膬 p膬rinte 葯i preluat direct. V膬 rug膬m s膬 re葲ine葲i c膬, din motive de performan葲膬, textul care dep膬葯e葯te 10000 de jetoane va fi trunchiat automat.',
+    switch: 'Comutator',
+    previewChunkCount: '{{num膬r}} Buc膬葲i estimate',
+    parentChunkForContext: 'P膬rinte-bucat膬 pentru context',
+    paragraph: 'Paragraf',
+    childChunkForRetrieval: 'Child-chunk pentru recuperare',
+    parentChild: 'P膬rinte-copil',
+    parentChildTip: 'C芒nd utiliza葲i modul p膬rinte-copil, fragmentul copil este utilizat pentru recuperare, iar fragmentul p膬rinte este utilizat pentru reamintire ca context.',
+    highQualityTip: 'Dup膬 terminarea 卯ncorporarii 卯n modul 脦nalt膬 calitate, revenirea la modul Economic nu este disponibil膬.',
+    qaSwitchHighQualityTipTitle: 'Formatul de 卯ntreb膬ri 葯i r膬spunsuri necesit膬 o metod膬 de indexare de 卯nalt膬 calitate',
+    paragraphTip: 'Acest mod 卯mparte textul 卯n paragrafe pe baza delimitatorilor 葯i a lungimii maxime a buc膬葲ii, folosind textul 卯mp膬r葲it ca bucat膬 p膬rinte pentru recuperare.',
+    general: 'General',
+    notAvailableForParentChild: 'Nu este disponibil pentru Indexul p膬rinte-copil',
+    qaSwitchHighQualityTipContent: '脦n prezent, numai metoda de index de 卯nalt膬 calitate accept膬 fragmentarea formatului de 卯ntreb膬ri 葯i r膬spunsuri. Dori葲i s膬 trece葲i la modul de 卯nalt膬 calitate?',
+    parentChildChunkDelimiterTip: 'Un delimitator este caracterul folosit pentru a separa textul. \\n este recomandat pentru 卯mp膬r葲irea buc膬葲ilor p膬rinte 卯n buc膬葲i copii mici. De asemenea, pute葲i utiliza delimitatori speciali defini葲i de dvs.',
+    useQALanguage: 'Fragmenta葲i folosind formatul 脦ntreb膬ri 葯i r膬spunsuri 卯n',
+  },
+  stepThree: {
+    creationTitle: '馃帀 Cuno葯tin葲膬 creat膬',
+    creationContent: 'Am denumit automat Cuno葯tin葲a, o pute葲i modifica 卯n orice moment',
+    label: 'Numele Cuno葯tin葲ei',
+    additionTitle: '馃帀 Document 卯nc膬rcat',
+    additionP1: 'Documentul a fost 卯nc膬rcat 卯n Cuno葯tin葲膬',
+    additionP2: ', 卯l pute葲i g膬si 卯n lista de documente a Cuno葯tin葲ei.',
+    stop: 'Opre葯te procesarea',
+    resume: 'Reia procesarea',
+    navTo: 'Mergi la document',
+    sideTipTitle: 'Ce urmeaz膬',
+    sideTipContent: 'Dup膬 ce documentul a terminat indexarea, Cuno葯tin葲a poate fi integrat膬 卯n aplica葲ie ca context, pute葲i g膬si set膬rile contextuale 卯n pagina de orchestrare a prompturilor. De asemenea, o pute葲i crea ca un plugin de indexare ChatGPT independent pentru a o publica.',
+    modelTitle: 'Sunte葲i sigur c膬 dori葲i s膬 opri葲i 卯ncorporarea?',
+    modelContent: 'Dac膬 trebuie s膬 relua葲i procesarea mai t芒rziu, ve葲i continua de unde a葲i r膬mas.',
+    modelButtonConfirm: 'Confirm膬',
+    modelButtonCancel: 'Anuleaz膬',
+  },
+  firecrawl: {
+    configFirecrawl: 'Configura葲i 馃敟Firecrawl',
+    getApiKeyLinkText: 'Ob葲ine葲i cheia API de la firecrawl.dev',
+    apiKeyPlaceholder: 'Cheie API de la firecrawl.dev',
+  },
+  jinaReader: {
+    configJinaReader: 'Configura葲i Jina Reader',
+    apiKeyPlaceholder: 'Cheie API de la jina.ai',
+    getApiKeyLinkText: 'Ob葲ine葲i cheia API gratuit膬 la jina.ai',
+  },
+  otherDataSource: {
+    title: 'Conecta葲i-v膬 la alte surse de date?',
+    description: '脦n prezent, baza de cuno葯tin葲e a Dify are doar surse de date limitate. Contribu葲ia cu o surs膬 de date la baza de cuno葯tin葲e Dify este o modalitate fantastic膬 de a ajuta la 卯mbun膬t膬葲irea flexibilit膬葲ii 葯i puterii platformei pentru to葲i utilizatorii. Ghidul nostru de contribu葲ie v膬 ajut膬 s膬 卯ncepe葲i. V膬 rug膬m s膬 face葲i clic pe linkul de mai jos pentru a afla mai multe.',
+    learnMore: 'Afl膬 mai multe',
+  },
+  watercrawl: {
+    getApiKeyLinkText: 'Ob葲ine葲i cheia dvs. API de la watercrawl.dev',
+    apiKeyPlaceholder: 'Cheia API de la watercrawl.dev',
+    configWatercrawl: 'Configureaz膬 Watercrawl',
+  },
+}
+
+export default translation
diff --git a/i18n/ro-RO/dataset-documents.ts b/i18n/ro-RO/dataset-documents.ts
new file mode 100644
index 0000000..e42be87
--- /dev/null
+++ b/i18n/ro-RO/dataset-documents.ts
@@ -0,0 +1,395 @@
+const translation = {
+  list: {
+    title: 'Documente',
+    desc: 'Toate fi葯ierele din Cuno葯tin葲e sunt afi葯ate aici, iar 卯ntreaga Cunoa葯tere poate fi legat膬 de cit膬ri Dify sau indexat膬 prin intermediul pluginului Chat.',
+    addFile: 'adaug膬 fi葯ier',
+    addPages: 'Adaug膬 pagini',
+    table: {
+      header: {
+        fileName: 'NUMELE FI葮IERULUI',
+        words: 'CUVINTE',
+        hitCount: 'NUM膫R DE RECUPER膫RI',
+        uploadTime: 'TIMP DE 脦NC膫RCARE',
+        status: 'STARE',
+        action: 'AC葰IUNE',
+        chunkingMode: 'MOD DE FRAGMENTARE',
+      },
+      name: 'Nume',
+      rename: 'Redenumire',
+    },
+    action: {
+      uploadFile: '脦ncarc膬 un fi葯ier nou',
+      settings: 'Set膬ri de segment',
+      addButton: 'Adaug膬 segment',
+      add: 'Adaug膬 un segment',
+      batchAdd: 'Ad膬ugare 卯n lot',
+      archive: 'Arhiveaz膬',
+      unarchive: 'Dezarhiveaz膬',
+      delete: '葮terge',
+      enableWarning: 'Fi葯ierul arhivat nu poate fi activat',
+      sync: 'Sincronizeaz膬',
+    },
+    index: {
+      enable: 'Activeaz膬',
+      disable: 'Dezactiveaz膬',
+      all: 'Toate',
+      enableTip: 'Fi葯ierul poate fi indexat',
+      disableTip: 'Fi葯ierul nu poate fi indexat',
+    },
+    status: {
+      queuing: '脦n coad膬',
+      indexing: 'Indexare',
+      paused: '脦ntrerupt',
+      error: 'Eroare',
+      available: 'Disponibil',
+      enabled: 'Activat',
+      disabled: 'Dezactivat',
+      archived: 'Arhivat',
+    },
+    empty: {
+      title: 'Nu exist膬 卯nc膬 documenta葲ie',
+      upload: {
+        tip: 'Pute葲i 卯nc膬rca fi葯iere, sincroniza de pe site-ul web sau din aplica葲ii web precum Notion, GitHub etc.',
+      },
+      sync: {
+        tip: 'Dify va desc膬rca periodic fi葯iere din Notion 葯i va finaliza procesarea.',
+      },
+    },
+    delete: {
+      title: 'Sigur dori葲i s膬 葯terge葲i?',
+      content: 'Dac膬 trebuie s膬 relua葲i procesarea mai t芒rziu, ve葲i continua de unde a葲i r膬mas',
+    },
+    batchModal: {
+      title: 'Ad膬ugare 卯n lot a segmentelor',
+      csvUploadTitle: 'Trage 葯i plaseaz膬 fi葯ierul t膬u CSV aici sau ',
+      browse: 'r膬sfoie葯te',
+      tip: 'Fi葯ierul CSV trebuie s膬 respecte urm膬toarea structur膬:',
+      question: '卯ntrebare',
+      answer: 'r膬spuns',
+      contentTitle: 'con葲inut segment',
+      content: 'con葲inut',
+      template: 'Desc膬rca葲i 葯ablonul aici',
+      cancel: 'Anuleaz膬',
+      run: 'Ruleaz膬 Lot',
+      runError: 'E葯ec la rularea lotului',
+      processing: '脦n procesare lot',
+      completed: 'Import finalizat',
+      error: 'Eroare la import',
+      ok: 'OK',
+    },
+    addUrl: 'Ad膬uga葲i adresa URL',
+    learnMore: 'Afl膬 mai multe',
+  },
+  metadata: {
+    title: 'Metadate',
+    desc: 'Etichetarea metadatelor pentru documente permite accesarea rapid膬 a acestora de c膬tre IA 葯i expune sursa referin葲elor pentru utilizatori.',
+    dateTimeFormat: 'D MMMM YYYY hh:mm A',
+    docTypeSelectTitle: 'V膬 rug膬m s膬 selecta葲i un tip de document',
+    docTypeChangeTitle: 'Schimba葲i tipul de document',
+    docTypeSelectWarning:
+      'Dac膬 tipul de document este schimbat, metadatele completate acum nu vor mai fi p膬strate',
+    firstMetaAction: 'S膬 卯ncepem',
+    placeholder: {
+      add: 'Adaug膬 ',
+      select: 'Selecteaz膬 ',
+    },
+    source: {
+      upload_file: '脦ncarc膬 fi葯ier',
+      notion: 'Sincronizeaz膬 din Notion',
+      github: 'Sincronizeaz膬 din Github',
+    },
+    type: {
+      book: 'Carte',
+      webPage: 'Pagin膬 web',
+      paper: 'Lucrare',
+      socialMediaPost: 'Postare pe re葲ele sociale',
+      personalDocument: 'Document personal',
+      businessDocument: 'Document de afaceri',
+      IMChat: 'Conversa葲ie IM',
+      wikipediaEntry: 'Intrare Wikipedia',
+      notion: 'Sincronizeaz膬 din Notion',
+      github: 'Sincronizeaz膬 din Github',
+      technicalParameters: 'Parametri tehnici',
+    },
+    field: {
+      processRule: {
+        processDoc: 'Proceseaz膬 documentul',
+        segmentRule: 'Regul膬 de segment',
+        segmentLength: 'Lungimea segmentelor',
+        processClean: 'Cur膬葲are text procesare',
+      },
+      book: {
+        title: 'Titlu',
+        language: 'Limb膬',
+        author: 'Autor',
+        publisher: 'Editor',
+        publicationDate: 'Data public膬rii',
+        ISBN: 'ISBN',
+        category: 'Categorie',
+      },
+      webPage: {
+        title: 'Titlu',
+        url: 'URL',
+        language: 'Limb膬',
+        authorPublisher: 'Autor/Editor',
+        publishDate: 'Data public膬rii',
+        topicKeywords: 'Subiecte/Cuvinte cheie',
+        description: 'Descriere',
+      },
+      paper: {
+        title: 'Titlu',
+        language: 'Limb膬',
+        author: 'Autor',
+        publishDate: 'Data public膬rii',
+        journalConferenceName: 'Nume jurnal/conferin葲膬',
+        volumeIssuePage: 'Volum/Num膬r/Pagin膬',
+        DOI: 'DOI',
+        topicsKeywords: 'Subiecte/Cuvinte cheie',
+        abstract: 'Rezumat',
+      },
+      socialMediaPost: {
+        platform: 'Platform膬',
+        authorUsername: 'Autor/Nume de utilizator',
+        publishDate: 'Data public膬rii',
+        postURL: 'URL postare',
+        topicsTags: 'Subiecte/Etichete',
+      },
+      personalDocument: {
+        title: 'Titlu',
+        author: 'Autor',
+        creationDate: 'Data cre膬rii',
+        lastModifiedDate: 'Ultima dat膬 modificat',
+        documentType: 'Tip document',
+        tagsCategory: 'Etichete/Categorie',
+      },
+      businessDocument: {
+        title: 'Titlu',
+        author: 'Autor',
+        creationDate: 'Data cre膬rii',
+        lastModifiedDate: 'Ultima dat膬 modificat',
+        documentType: 'Tip document',
+        departmentTeam: 'Departament/Echip膬',
+      },
+      IMChat: {
+        chatPlatform: 'Platform膬 de chat',
+        chatPartiesGroupName: 'Persoane din chat/Nume grup',
+        participants: 'Participan葲i',
+        startDate: 'Data 卯nceperii',
+        endDate: 'Data 卯ncheierii',
+        topicsKeywords: 'Subiecte/Cuvinte cheie',
+        fileType: 'Tip fi葯ier',
+      },
+      wikipediaEntry: {
+        title: 'Titlu',
+        language: 'Limb膬',
+        webpageURL: 'URL pagin膬 web',
+        editorContributor: 'Editor/Contributor',
+        lastEditDate: 'Ultima dat膬 modificat',
+        summaryIntroduction: 'Rezumat/Introducere',
+      },
+      notion: {
+        title: 'Titlu',
+        language: 'Limb膬',
+        author: 'Autor',
+        createdTime: 'Dat膬 creare',
+        lastModifiedTime: 'Ultima dat膬 modificat',
+        url: 'URL',
+        tag: 'Etichet膬',
+        description: 'Descriere',
+      },
+      github: {
+        repoName: 'Nume depozit',
+        repoDesc: 'Descriere depozit',
+        repoOwner: 'Proprietar depozit',
+        fileName: 'Nume fi葯ier',
+        filePath: 'Cale fi葯ier',
+        programmingLang: 'Limbaj de programare',
+        url: 'URL',
+        license: 'Licen葲膬',
+        lastCommitTime: 'Ultima dat膬 comitere',
+        lastCommitAuthor: 'Ultimul autor comitere',
+      },
+      originInfo: {
+        originalFilename: 'Nume fi葯ier original',
+        originalFileSize: 'Dimensiune fi葯ier original',
+        uploadDate: 'Dat膬 卯nc膬rcare',
+        lastUpdateDate: 'Ultima dat膬 actualizare',
+        source: 'Surs膬',
+      },
+      technicalParameters: {
+        segmentSpecification: 'Specifica葲ie segmente',
+        segmentLength: 'Lungime segmente',
+        avgParagraphLength: 'Lungime medie paragraf',
+        paragraphs: 'Paragrafe',
+        hitCount: 'Num膬r de recuper膬ri',
+        embeddingTime: 'Timp 卯ncorporare',
+        embeddedSpend: 'Cheltuieli 卯ncorporare',
+      },
+    },
+    languageMap: {
+      zh: 'Chinez膬',
+      en: 'Englez膬',
+      es: 'Spaniol膬',
+      fr: 'Francez膬',
+      de: 'German膬',
+      ja: 'Japonez膬',
+      ko: 'Coreean膬',
+      ru: 'Rus膬',
+      ar: 'Arab膬',
+      pt: 'Portughez膬',
+      it: 'Italian膬',
+      nl: 'Olandez膬',
+      pl: 'Polonez膬',
+      sv: 'Suedez膬',
+      tr: 'Turc膬',
+      he: 'Ebraic膬',
+      hi: 'Hindi',
+      da: 'Danez膬',
+      fi: 'Finlandez膬',
+      no: 'Norvegian膬',
+      hu: 'Maghiar膬',
+      el: 'Greac膬',
+      cs: 'Ceh膬',
+      th: 'Tailandez膬',
+      id: 'Indonezian膬',
+    },
+    categoryMap: {
+      book: {
+        fiction: 'Fic葲iune',
+        biography: 'Biografie',
+        history: 'Istorie',
+        science: '葮tiin葲膬',
+        technology: 'Tehnologie',
+        education: 'Educa葲ie',
+        philosophy: 'Filozofie',
+        religion: 'Religie',
+        socialSciences: '葮tiin葲eSociale',
+        art: 'Art膬',
+        travel: 'C膬l膬torii',
+        health: 'S膬n膬tate',
+        selfHelp: 'AutoAjutorare',
+        businessEconomics: 'AfaceriEconomie',
+        cooking: 'Buc膬t膬rie',
+        childrenYoungAdults: 'CopiiTineri',
+        comicsGraphicNovels: 'ComicsRomaneCgrafice',
+        poetry: 'Poezie',
+        drama: 'Dram膬',
+        other: 'Altele',
+      },
+      personalDoc: {
+        notes: 'Note',
+        blogDraft: 'Ciorn膬 blog',
+        diary: 'Jurnal',
+        researchReport: 'Raport de cercetare',
+        bookExcerpt: 'Extras carte',
+        schedule: 'Program',
+        list: 'List膬',
+        projectOverview: 'Prezentare general膬 proiect',
+        photoCollection: 'Colec葲ie foto',
+        creativeWriting: 'Scriere creativ膬',
+        codeSnippet: 'Fragment de cod',
+        designDraft: 'Schi葲膬 de design',
+        personalResume: 'CV personal',
+        other: 'Altele',
+      },
+      businessDoc: {
+        meetingMinutes: 'Proces-verbal 葯edin葲膬',
+        researchReport: 'Raport de cercetare',
+        proposal: 'Propunere',
+        employeeHandbook: 'Manual angajat',
+        trainingMaterials: 'Materiale de formare',
+        requirementsDocument: 'Document cerin葲e',
+        designDocument: 'Document de design',
+        productSpecification: 'Specifica葲ie produs',
+        financialReport: 'Raport financiar',
+        marketAnalysis: 'Analiz膬 pia葲膬',
+        projectPlan: 'Plan de proiect',
+        teamStructure: 'Structur膬 echip膬',
+        policiesProcedures: 'Politici 葯i proceduri',
+        contractsAgreements: 'Contracte 葯i acorduri',
+        emailCorrespondence: 'Coresponden葲膬 email',
+        other: 'Altele',
+      },
+    },
+  },
+  embedding: {
+    processing: 'Procesare 卯ncorporare...',
+    paused: '脦ncorporare 卯ntrerupt膬',
+    completed: '脦ncorporare finalizat膬',
+    error: 'Eroare la 卯ncorporare',
+    docName: 'Prelucrare document',
+    mode: 'Regula de segmentare',
+    segmentLength: 'Lungime segmente',
+    textCleaning: 'Pre-defini葲ie 葯i cur膬葲are text',
+    segments: 'Paragrafe',
+    highQuality: 'Mod calitate ridicat膬',
+    economy: 'Mod economic',
+    estimate: 'Consum estimat',
+    stop: 'Opre葯te procesarea',
+    resume: 'Reia procesarea',
+    automatic: 'Automat',
+    custom: 'Personalizat',
+    previewTip: 'Previzualizarea paragrafului va fi disponibil膬 dup膬 finalizarea 卯ncorpor膬rii',
+    hierarchical: 'P膬rinte-copil',
+    childMaxTokens: 'Copil',
+    parentMaxTokens: 'P膬rinte',
+    pause: 'Pauz膬',
+  },
+  segment: {
+    paragraphs: 'Paragrafe',
+    keywords: 'Cuvinte cheie',
+    addKeyWord: 'Ad膬uga葲i un cuv芒nt cheie',
+    keywordError: 'Lungimea maxim膬 a cuv芒ntului cheie este de 20 de caractere',
+    characters: 'caractere',
+    hitCount: 'Num膬r de rezultate',
+    vectorHash: 'Vector hash: ',
+    questionPlaceholder: 'ad膬uga葲i 卯ntrebarea aici',
+    questionEmpty: '脦ntrebarea nu poate fi goal膬',
+    answerPlaceholder: 'ad膬uga葲i r膬spunsul aici',
+    answerEmpty: 'R膬spunsul nu poate fi gol',
+    contentPlaceholder: 'ad膬uga葲i con葲inutul aici',
+    contentEmpty: 'Con葲inutul nu poate fi gol',
+    newTextSegment: 'Nou segment de text',
+    newQaSegment: 'Nou segment de 卯ntreb膬ri 葯i r膬spunsuri',
+    delete: '葮terge葲i acest fragment?',
+    searchResults_zero: 'REZULTAT',
+    searchResults_one: 'REZULTAT',
+    characters_other: 'Caractere',
+    chunkAdded: '1 bucat膬 ad膬ugat膬',
+    chunks_other: 'BUC膫泞I',
+    characters_one: 'caracter',
+    regenerationSuccessTitle: 'Regenerare finalizat膬',
+    editedAt: 'Editat la',
+    addChunk: 'Ad膬uga葲i o bucat膬',
+    chunk: 'Bucat膬',
+    chunks_one: 'BUCAT膫',
+    empty: 'Nu s-a g膬sit nicio bucat膬',
+    expandChunks: 'Extinde葲i buc膬葲ile',
+    editParentChunk: 'Edita葲i bucata p膬rinte',
+    regenerationSuccessMessage: 'Pute葲i 卯nchide aceast膬 fereastr膬.',
+    chunkDetail: 'Detalii buc膬葲i',
+    childChunk: 'Bucat膬 de copil',
+    edited: 'EDITATE',
+    childChunks_one: 'BUCAT膫 COPIL',
+    childChunkAdded: '1 bucat膬 de copil ad膬ugat膬',
+    regenerationConfirmTitle: 'Dori葲i s膬 regenera葲i buc膬葲ile copil?',
+    newChildChunk: 'Bucat膬 copil nou膬',
+    editChildChunk: 'Edita葲i fragmentul copil',
+    childChunks_other: 'BUC膫葰I COPIL',
+    newChunk: 'Bucat膬 nou膬',
+    clearFilter: '葮terge葲i filtrul',
+    editChunk: 'Edita葲i bucata',
+    addAnother: 'Ad膬uga葲i altul',
+    parentChunks_other: 'BUC膫葰I P膫RINTE',
+    collapseChunks: 'Restr芒ngerea buc膬葲ilor',
+    parentChunk: 'P膬rinte-bucat膬',
+    regeneratingMessage: 'Acest lucru poate dura un moment, v膬 rug膬m s膬 a葯tepta葲i...',
+    parentChunks_one: 'FRAGMENT P膫RINTE',
+    regenerationConfirmMessage: 'Regenerarea buc膬葲ilor copii va suprascrie buc膬葲ile copil curente, inclusiv buc膬葲ile editate 葯i buc膬葲ile nou ad膬ugate. Regenerarea nu poate fi anulat膬.',
+    regeneratingTitle: 'Regenerarea buc膬葲ilor secundare',
+    addChildChunk: 'Ad膬uga葲i o bucat膬 copil',
+    searchResults_other: 'REZULTATELE',
+  },
+}
+
+export default translation
diff --git a/i18n/ro-RO/dataset-hit-testing.ts b/i18n/ro-RO/dataset-hit-testing.ts
new file mode 100644
index 0000000..323cd68
--- /dev/null
+++ b/i18n/ro-RO/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: 'Testarea Recuper膬rii',
+  desc: 'Testa葲i efectul de atingere al Cuno葯tin葲elor pe baza textului interogat dat.',
+  dateTimeFormat: 'DD/MM/YYYY hh:mm A',
+  recents: 'Recente',
+  table: {
+    header: {
+      source: 'Surs膬',
+      text: 'Text',
+      time: 'Timp',
+    },
+  },
+  input: {
+    title: 'Text surs膬',
+    placeholder: 'V膬 rug膬m s膬 introduce葲i un text, se recomand膬 o propozi葲ie declarativ膬 scurt膬.',
+    countWarning: 'P芒n膬 la 200 de caractere.',
+    indexWarning: 'Doar Cuno葯tin葲e de 卯nalt膬 calitate.',
+    testing: 'Testare',
+  },
+  hit: {
+    title: 'PARAGRAFE DE RECUPERARE',
+    emptyTip: 'Rezultatele test膬rii de recuperare vor ap膬rea aici',
+  },
+  noRecentTip: 'Nu exist膬 rezultate de interogare recente aici',
+  viewChart: 'Vizualiza葲i GRAFICUL VECTORIAL',
+  settingTitle: 'Setare de recuperare',
+  viewDetail: 'Vezi detalii',
+  keyword: 'Cuvinte cheie',
+  chunkDetail: 'Detalii buc膬葲i',
+  open: 'Deschide',
+  hitChunks: 'Acceseaz膬 {{num}} buc膬葲i copil',
+  records: '脦nregistr膬ri',
+}
+
+export default translation
diff --git a/i18n/ro-RO/dataset-settings.ts b/i18n/ro-RO/dataset-settings.ts
new file mode 100644
index 0000000..9d39f8a
--- /dev/null
+++ b/i18n/ro-RO/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: 'Set膬ri de cuno葯tin葲e',
+  desc: 'Aici pute葲i modifica propriet膬葲ile 葯i metodele de lucru ale cuno葯tin葲elor.',
+  form: {
+    name: 'Numele cuno葯tin葲elor',
+    namePlaceholder: 'V膬 rug膬m s膬 introduce葲i numele cuno葯tin葲elor',
+    nameError: 'Numele nu poate fi gol',
+    desc: 'Descrierea cuno葯tin葲elor',
+    descInfo: 'V膬 rug膬m s膬 scrie葲i o descriere textual膬 clar膬 pentru a contura con葲inutul cuno葯tin葲elor. Aceast膬 descriere va fi utilizat膬 ca baz膬 pentru potrivire atunci c芒nd se selecteaz膬 din mai multe cuno葯tin葲e pentru inferen葲膬.',
+    descPlaceholder: 'Descrie葲i ce se afl膬 卯n aceste cuno葯tin葲e. O descriere detaliat膬 permite AI s膬 acceseze con葲inutul cuno葯tin葲elor 卯ntr-un timp oportun. Dac膬 este gol, Dify va folosi strategia implicit膬.',
+    descWrite: 'Afla葲i cum s膬 scrie葲i o descriere bun膬 a cuno葯tin葲elor.',
+    permissions: 'Permisiuni',
+    permissionsOnlyMe: 'Doar eu',
+    permissionsAllMember: 'To葲i membrii echipei',
+    indexMethod: 'Metod膬 de indexare',
+    indexMethodHighQuality: 'Calitate ridicat膬',
+    indexMethodHighQualityTip: 'Invoc膬 modelul Embedding pentru procesare pentru a oferi o acurate葲e mai mare la interog膬rile utilizatorilor.',
+    indexMethodEconomy: 'Economic膬',
+    indexMethodEconomyTip: 'Utiliza葲i motoare de vectori offline, indexuri de cuvinte cheie etc. pentru a reduce acurate葲ea f膬r膬 a cheltui jetoane',
+    embeddingModel: 'Model de 卯ncorporare',
+    embeddingModelTip: 'Schimba葲i modelul 卯ncorporat, v膬 rug膬m s膬 accesa葲i ',
+    embeddingModelTipLink: 'Set膬ri',
+    retrievalSetting: {
+      title: 'Set膬ri de recuperare',
+      learnMore: 'Afla葲i mai multe',
+      description: ' despre metoda de recuperare.',
+      longDescription: ' despre metoda de recuperare, o pute葲i schimba 卯n orice moment 卯n set膬rile cuno葯tin葲elor.',
+      method: 'Metoda de recuperare',
+    },
+    save: 'Salvare',
+    permissionsInvitedMembers: 'Membri par葲iali ai echipei',
+    me: '(Tu)',
+    externalKnowledgeID: 'ID de cuno葯tin葲e extern',
+    externalKnowledgeAPI: 'API de cuno葯tin葲e externe',
+    retrievalSettings: 'Set膬ri de recuperare',
+    indexMethodChangeToEconomyDisabledTip: 'Nu este disponibil pentru retrogradarea de la HQ la ECO',
+    upgradeHighQualityTip: 'Dup膬 ce face葲i upgrade la modul 脦nalt膬 calitate, revenirea la modul Economic nu este disponibil膬',
+    helpText: 'Afla葲i cum s膬 scrie葲i o descriere bun膬 a setului de date.',
+    searchModel: 'C膬utare model',
+  },
+}
+
+export default translation
diff --git a/i18n/ro-RO/dataset.ts b/i18n/ro-RO/dataset.ts
new file mode 100644
index 0000000..dd7b2d6
--- /dev/null
+++ b/i18n/ro-RO/dataset.ts
@@ -0,0 +1,221 @@
+const translation = {
+  knowledge: 'Cuno葯tin葲e',
+  documentCount: ' documente',
+  wordCount: ' mii de cuvinte',
+  appCount: ' aplica葲ii conectate',
+  createDataset: 'Creeaz膬 Cuno葯tin葲e',
+  createDatasetIntro: 'Importa葲i-v膬 propriile date text sau scrie葲i date 卯n timp real prin Webhook pentru 卯mbun膬t膬葲irea contextului LLM.',
+  deleteDatasetConfirmTitle: '葮terge葲i aceast膬 Cuno葯tin葲膬?',
+  deleteDatasetConfirmContent:
+    '葮tergerea Cuno葯tin葲elor este ireversibil膬. Utilizatorii nu vor mai putea accesa Cuno葯tin葲ele, iar toate configura葲iile 葯i jurnalele prompt vor fi 葯terse permanent.',
+  datasetUsedByApp: 'Cuno葯tin葲ele sunt utilizate de unele aplica葲ii. Aplica葲iile nu vor mai putea utiliza aceste Cuno葯tin葲e, iar toate configura葲iile de prompt 葯i jurnalele vor fi 葯terse definitiv.',
+  datasetDeleted: 'Cuno葯tin葲e 葯terse',
+  datasetDeleteFailed: 'E葯ec la 葯tergerea Cuno葯tin葲elor',
+  didYouKnow: '葮tia葲i c膬?',
+  intro1: 'Cuno葯tin葲ele pot fi integrate 卯n aplica葲ia Dify ',
+  intro2: 'ca un context',
+  intro3: ',',
+  intro4: 'sau ele ',
+  intro5: 'pot fi create',
+  intro6: ' ca un plug-in index ChatGPT standalone pentru publicare',
+  unavailable: 'Indisponibil',
+  unavailableTip: 'Modelul de 卯ncorporare nu este disponibil, modelul de 卯ncorporare implicit trebuie configurat',
+  datasets: 'CUNO葮TIN葰E',
+  datasetsApi: 'ACCES API',
+  retrieval: {
+    semantic_search: {
+      title: 'C膬utare Vector',
+      description: 'Genera葲i 卯ncorpor膬rile interog膬rilor 葯i c膬uta葲i bucata de text cea mai similar膬 cu reprezentarea sa vectorial膬.',
+    },
+    full_text_search: {
+      title: 'C膬utare Full-Text',
+      description: 'Indexa葲i to葲i termenii din document, permi葲芒nd utilizatorilor s膬 caute orice termen 葯i s膬 recupereze buc膬葲ile de text relevante care con葲in acei termeni.',
+    },
+    hybrid_search: {
+      title: 'C膬utare Hibrid膬',
+      description: 'Executa葲i c膬ut膬ri full-text 葯i c膬ut膬ri vectoriale 卯n acela葯i timp, reclasifica葲i pentru a selecta cea mai bun膬 potrivire pentru interogarea utilizatorului. Configurarea API-ului modelului Rerank este necesar膬.',
+      recommend: 'Recomandat',
+    },
+    invertedIndex: {
+      title: 'Index Inversat',
+      description: 'Indexul inversat este o structur膬 utilizat膬 pentru recuperare eficient膬. Organizat dup膬 termeni, fiecare termen indic膬 documentele sau paginile web care 卯l con葲in.',
+    },
+    change: 'Schimb膬',
+    changeRetrievalMethod: 'Schimb膬 metoda de recuperare',
+  },
+  docsFailedNotice: 'documentele nu au putut fi indexate',
+  retry: 'Re卯ncerca葲i',
+  indexingTechnique: {
+    high_quality: 'IC',
+    economy: 'ECO',
+  },
+  indexingMethod: {
+    semantic_search: 'VECTOR',
+    full_text_search: 'TEXT COMPLET',
+    hybrid_search: 'HIBRID',
+    invertedIndex: 'INVERSAT',
+  },
+  mixtureHighQualityAndEconomicTip: 'Modelul de reclasificare este necesar pentru amestecul de baze de cuno葯tin葲e de 卯nalt膬 calitate 葯i economice.',
+  inconsistentEmbeddingModelTip: 'Modelul de reclasificare este necesar dac膬 modelele de 卯ncorporare ale bazelor de cuno葯tin葲e selectate sunt inconsistente.',
+  retrievalSettings: 'Set膬ri de recuperare',
+  rerankSettings: 'Set膬ri de reclasificare',
+  weightedScore: {
+    title: 'Scor ponderat',
+    description: 'Prin ajustarea ponderilor atribuite, aceast膬 strategie de reclasificare determin膬 dac膬 s膬 prioritizeze potrivirea semantic膬 sau pe cea a cuvintelor cheie.',
+    semanticFirst: 'Semantic primul',
+    keywordFirst: 'Cuv芒nt cheie primul',
+    customized: 'Personalizat',
+    semantic: 'Semantic',
+    keyword: 'Cuv芒nt cheie',
+  },
+  nTo1RetrievalLegacy: 'Recuperarea N-la-1 va fi oficial depreciat膬 din septembrie. Se recomand膬 utilizarea celei mai recente recuper膬ri cu c膬i multiple pentru a ob葲ine rezultate mai bune.',
+  nTo1RetrievalLegacyLink: 'Afl膬 mai multe',
+  nTo1RetrievalLegacyLinkText: 'Recuperarea N-la-1 va fi oficial depreciat膬 卯n septembrie.',
+  defaultRetrievalTip: 'Recuperarea pe mai multe c膬i este utilizat膬 卯n mod implicit. Cuno葯tin葲ele sunt preluate din mai multe baze de cuno葯tin葲e 葯i apoi reclasificate.',
+  editExternalAPIConfirmWarningContent: {
+    front: 'Acest API de cuno葯tin葲e externe este legat de',
+    end: 'cuno葯tin葲e externe, iar aceast膬 modificare va fi aplicat膬 tuturor. Sunte葲i sigur c膬 dori葲i s膬 salva葲i aceast膬 modificare?',
+  },
+  editExternalAPIFormWarning: {
+    front: 'Acest API extern este legat de',
+    end: 'cuno葯tin葲e externe',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: '葮terge',
+      end: '?',
+    },
+    content: {
+      front: 'Acest API de cuno葯tin葲e externe este legat de',
+      end: 'cuno葯tin葲e externe. 葮tergerea acestui API le va invalida pe toate. Sunte葲i sigur c膬 dori葲i s膬 葯terge葲i acest API?',
+    },
+    noConnectionContent: 'Sunte葲i sigur c膬 葯terge葲i acest API?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: 'Alege葲i un API de cuno葯tin葲e extern',
+  },
+  connectDatasetIntro: {
+    content: {
+      end: '. Apoi g膬si葲i ID-ul de cuno葯tin葲e corespunz膬tor 葯i completa葲i-l 卯n formularul din st芒nga. Dac膬 toate informa葲iile sunt corecte, va s膬ri automat la testul de recuperare din baza de cuno葯tin葲e dup膬 ce face葲i clic pe butonul de conectare.',
+      link: 'Afla葲i cum s膬 crea葲i un API extern',
+      front: 'Pentru a v膬 conecta la o baz膬 de cuno葯tin葲e extern膬, trebuie mai 卯nt芒i s膬 crea葲i un API extern. V膬 rug膬m s膬 citi葲i cu aten葲ie 葯i s膬 consulta葲i',
+    },
+    title: 'Cum s膬 v膬 conecta葲i la o baz膬 de cuno葯tin葲e extern膬',
+    learnMore: 'Afl膬 mai multe',
+  },
+  connectHelper: {
+    helper2: 'este acceptat膬 doar func葲ionalitatea de recuperare',
+    helper5: 'Cu aten葲ie 卯nainte de a utiliza aceast膬 caracteristic膬.',
+    helper3: '. V膬 recomand膬m cu t膬rie s膬',
+    helper4: 'Citi葲i documenta葲ia de ajutor',
+    helper1: 'Conecta葲i-v膬 la baze de cuno葯tin葲e externe prin API 葯i ID-ul bazei de cuno葯tin葲e. 脦n prezent,',
+  },
+  externalKnowledgeForm: {
+    connect: 'Conecta',
+    cancel: 'Anula',
+  },
+  externalAPIForm: {
+    encrypted: {
+      end: 'Tehnologie.',
+      front: 'Tokenul API va fi criptat 葯i stocat folosind',
+    },
+    edit: 'Editare',
+    endpoint: 'Punct final API',
+    apiKey: 'Cheie API',
+    name: 'Nume',
+    save: 'Salva',
+    cancel: 'Anula',
+  },
+  editExternalAPIFormTitle: 'Editarea API-ului de cuno葯tin葲e externe',
+  externalTag: 'Extern',
+  createExternalAPI: 'Ad膬ugarea unui API de cuno葯tin葲e extern',
+  connectDataset: 'Conecta葲i-v膬 la o baz膬 de cuno葯tin葲e extern膬',
+  externalKnowledgeDescriptionPlaceholder: 'Descrie葲i ce este 卯n aceast膬 baz膬 de cuno葯tin葲e (op葲ional)',
+  externalAPI: 'API extern',
+  learnHowToWriteGoodKnowledgeDescription: 'Afla葲i cum s膬 scrie葲i o descriere bun膬 a cuno葯tin葲elor',
+  externalAPIPanelTitle: 'API de cuno葯tin葲e externe',
+  allExternalTip: 'C芒nd utilizeaz膬 numai cuno葯tin葲e externe, utilizatorul poate alege dac膬 s膬 activeze modelul Rerank. Dac膬 nu este activat膬, buc膬葲ile preluate vor fi sortate pe baza scorurilor. C芒nd strategiile de recuperare a diferitelor baze de cuno葯tin葲e sunt inconsistente, acestea vor fi inexacte.',
+  externalKnowledgeNamePlaceholder: 'V膬 rug膬m s膬 introduce葲i numele bazei de cuno葯tin葲e',
+  externalAPIPanelDocumentation: 'Afla葲i cum s膬 crea葲i un API de cuno葯tin葲e externe',
+  externalKnowledgeName: 'Nume cuno葯tin葲e externe',
+  externalKnowledgeDescription: 'Descrierea cuno葯tin葲elor',
+  externalKnowledgeIdPlaceholder: 'V膬 rug膬m s膬 introduce葲i ID-ul de cuno葯tin葲e',
+  noExternalKnowledge: 'Nu exist膬 卯nc膬 un API de cuno葯tin葲e externe, face葲i clic aici pentru a crea',
+  externalKnowledgeId: 'ID de cuno葯tin葲e extern',
+  editExternalAPITooltipTitle: 'CUNO葮TIN葰E LEGATE',
+  mixtureInternalAndExternalTip: 'Modelul Rerank este necesar pentru amestecul de cuno葯tin葲e interne 葯i externe.',
+  externalAPIPanelDescription: 'API-ul de cuno葯tin葲e externe este utilizat pentru a se conecta la o baz膬 de cuno葯tin葲e din afara Dify 葯i pentru a prelua cuno葯tin葲e din acea baz膬 de cuno葯tin葲e.',
+  createNewExternalAPI: 'Crea葲i un nou API de cuno葯tin葲e externe',
+  chunkingMode: {
+    general: 'General',
+    parentChild: 'P膬rinte-copil',
+  },
+  parentMode: {
+    paragraph: 'Paragraf',
+    fullDoc: 'Documentar complet',
+  },
+  batchAction: {
+    enable: 'Activa',
+    cancel: 'Anula',
+    delete: '葮terge',
+    disable: 'Dezactiva',
+    selected: 'Selectat',
+    archive: 'Arhiv膬',
+  },
+  documentsDisabled: '{{num}} documente dezactivate - inactive de peste 30 de zile',
+  preprocessDocument: '{{num}} Procesarea prealabil膬 a documentelor',
+  enable: 'Activa',
+  localDocs: 'Documente locale',
+  allKnowledge: 'Toate cuno葯tin葲ele',
+  allKnowledgeDescription: 'Selecta葲i pentru a afi葯a toate cuno葯tin葲ele din acest spa葲iu de lucru. Doar proprietarul spa葲iului de lucru poate gestiona toate cuno葯tin葲ele.',
+  metadata: {
+    createMetadata: {
+      name: 'Nume',
+      type: 'Tip',
+      back: '脦napoi',
+      namePlaceholder: 'Ad膬uga葲i numele de metadate',
+      title: 'Metadate noi',
+    },
+    checkName: {
+      invalid: 'Numele metadatelor poate con葲ine doar litere mici, cifre 葯i underscore 葯i trebuie s膬 卯nceap膬 cu o liter膬 mic膬.',
+      empty: 'Numele metadatelor nu poate fi gol',
+    },
+    batchEditMetadata: {
+      multipleValue: 'Valoare multipl膬',
+      editMetadata: 'Editeaz膬 metadatele',
+      applyToAllSelectDocument: 'Aplic膬 la toate documentele selectate',
+      editDocumentsNum: 'Editarea {{num}} documente',
+      applyToAllSelectDocumentTip: 'Creeaz膬 automat toate metadatele editate 葯i noi de mai sus pentru toate documentele selectate, altfel editarea metadatelor se va aplica doar documentelor care au aceste metadate.',
+    },
+    selectMetadata: {
+      manageAction: 'Gestioneaz膬',
+      search: 'C膬utare metadate',
+      newAction: 'Metadate noi',
+    },
+    datasetMetadata: {
+      deleteTitle: 'Confirm膬 葯tergerea',
+      namePlaceholder: 'Numele metadata',
+      builtIn: '脦nc膬rcat 卯n',
+      values: '{{num}} Valori',
+      name: 'Nume',
+      disabled: 'Dezactivat',
+      deleteContent: 'E葯ti sigur c膬 vrei s膬 葯tergi metadata 鈥瀧{name}}鈥�?}',
+      builtInDescription: 'Metadatele 卯ncorporate sunt extrase 葯i generate automat. Acestea trebuie s膬 fie activate 卯nainte de utilizare 葯i nu pot fi editate.',
+      description: 'Pute葲i gestiona toate metadatele 卯n aceast膬 cunoa葯tere aici. Modific膬rile vor fi sincronizate cu fiecare document.',
+      addMetaData: 'Ad膬uga葲i Metadate',
+      rename: 'Renumire',
+    },
+    documentMetadata: {
+      startLabeling: '脦ncepe etichetarea',
+      documentInformation: 'Informa葲ii despre document',
+      technicalParameters: 'Parametrii tehnici',
+      metadataToolTip: 'Metadata serve ca un filtru critic care 卯mbun膬t膬葲e葯te acurate葲ea 葯i relevan葲a recuper膬rii informa葲iilor. Pute葲i modifica 葯i ad膬uga metadata pentru acest document aici.',
+    },
+    metadata: 'Metadate',
+    addMetadata: 'Ad膬uga葲i Metadate',
+    chooseTime: 'Alege o or膬...',
+  },
+  embeddingModelNotAvailable: 'Modelul de 卯ncorporare nu este disponibil.',
+}
+
+export default translation
diff --git a/i18n/ro-RO/education.ts b/i18n/ro-RO/education.ts
new file mode 100644
index 0000000..cda0952
--- /dev/null
+++ b/i18n/ro-RO/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    coupon: 'cupom exclusiv 100%',
+    front: 'Sunte葲i acum eligibil pentru statutul de Educa葲ie Verificat膬. V膬 rug膬m s膬 introduce葲i informa葲iile despre educa葲ia dumneavoastr膬 mai jos pentru a finaliza procesul 葯i a primi un',
+    end: 'pentru Planul Profesional Dify.',
+  },
+  form: {
+    schoolName: {
+      placeholder: 'Introduce葲i numele oficial, neabbreviat al 葯colii dumneavoastr膬',
+      title: 'Numele 葮colii Tale',
+    },
+    schoolRole: {
+      option: {
+        teacher: 'Profesor',
+        administrator: 'Administrator 葯colar',
+        student: 'Student',
+      },
+      title: 'Rolul t膬u la 葯coal膬',
+    },
+    terms: {
+      desc: {
+        and: '葯i',
+        front: 'Informa葲iile tale 葯i utilizarea statutului de Educa葲ie Verificat膬 sunt supuse termenilor no葯tri',
+        end: 'Prin trimiterea:',
+        termsOfService: 'Termeni 葯i condi葲ii',
+        privacyPolicy: 'Politica de confiden牛ialitate',
+      },
+      option: {
+        inSchool: 'Confirm c膬 sunt 卯nscris sau angajat la institu葲ia men葲ionat膬. Dify poate solicita dovada 卯nscrierii/angaj膬rii. Dac膬 卯mi reprezint gre葯it eligibilitatea, sunt de acord s膬 pl膬tesc orice taxe ini葲ial renun葲ate pe baza statutului meu educa葲ional.',
+        age: 'Confirm c膬 am cel pu葲in 18 ani',
+      },
+      title: 'Termeni 葯i condi葲ii',
+    },
+  },
+  toVerified: 'Ob葲ine葲i verificarea educa葲iei',
+  submitError: 'Trimiterea formularului a e艧uat. V膬 rug膬m s膬 卯ncerca葲i din nou mai t芒rziu.',
+  rejectContent: 'Din p膬cate, nu e葯ti eligibil pentru statutul de Verificat Educa葲ional 葯i, prin urmare, nu po葲i primi cuponul exclusiv de 100% pentru Planul Profesional Dify dac膬 folose葯ti aceast膬 adres膬 de email.',
+  successTitle: 'Ai ob葲inut educa葲ia Dify verificat膬',
+  learn: '脦nv膬葲a葲i cum s膬 verifica葲i educa葲ia',
+  submit: 'Trimite',
+  emailLabel: 'Emailul t膬u curent',
+  currentSigned: 'CONEXIUNE 脦N PREZENT CA',
+  rejectTitle: 'Verificarea educa葲ional膬 Dify a fost respins膬',
+  successContent: 'Am emis un cupon de discount de 100% pentru planul Professional Dify pe contul dumneavoastr膬. Cuponul este valabil timp de un an, v膬 rug膬m s膬 卯l utiliza葲i 卯n perioada de valabilitate.',
+}
+
+export default translation
diff --git a/i18n/ro-RO/explore.ts b/i18n/ro-RO/explore.ts
new file mode 100644
index 0000000..153b236
--- /dev/null
+++ b/i18n/ro-RO/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: 'Explora葲i',
+  sidebar: {
+    discovery: 'Descoperire',
+    chat: 'Chat',
+    workspace: 'Spa葲iu de lucru',
+    action: {
+      pin: 'Fixa葲i',
+      unpin: 'Debloca葲i',
+      rename: 'Redenumire',
+      delete: '葮terge葲i',
+    },
+    delete: {
+      title: '葮terge葲i aplica葲ia',
+      content: 'Sunte葲i sigur c膬 dori葲i s膬 葯terge葲i aceast膬 aplica葲ie?',
+    },
+  },
+  apps: {
+    title: 'Explora葲i aplica葲iile Dify',
+    description: 'Utiliza葲i aceste aplica葲ii model imediat sau personaliza葲i-v膬 propria aplica葲ie pe baza modelelor.',
+    allCategories: 'Recomandate',
+  },
+  appCard: {
+    addToWorkspace: 'Ad膬uga葲i la spa葲iul de lucru',
+    customize: 'Personaliza葲i',
+  },
+  appCustomize: {
+    title: 'Crea葲i o aplica葲ie din {{name}}',
+    subTitle: 'Pictogram膬 葯i nume aplica葲ie',
+    nameRequired: 'Numele aplica葲iei este obligatoriu',
+  },
+  category: {
+    Assistant: 'Asistent',
+    Writing: 'Scriere',
+    Translate: 'Traducere',
+    Programming: 'Programare',
+    HR: 'Resurse Umane',
+    Agent: 'Agent',
+    Workflow: 'Flux de lucru',
+    Entertainment: 'Divertisment',
+  },
+}
+
+export default translation
diff --git a/i18n/ro-RO/layout.ts b/i18n/ro-RO/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/ro-RO/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/ro-RO/login.ts b/i18n/ro-RO/login.ts
new file mode 100644
index 0000000..12878d4
--- /dev/null
+++ b/i18n/ro-RO/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: 'Bun venit! Hai s膬 卯ncepem!馃憢',
+  welcome: 'Bine ai venit la Dify, te rug膬m s膬 te autentifici pentru a continua.',
+  email: 'Adres膬 de email',
+  emailPlaceholder: 'Adresa ta de email',
+  password: 'Parol膬',
+  passwordPlaceholder: 'Parola ta',
+  name: 'Nume de utilizator',
+  namePlaceholder: 'Numele t膬u de utilizator',
+  forget: 'Ai uitat parola?',
+  signBtn: 'Autentificare',
+  sso: 'Continu膬 cu SSO',
+  installBtn: 'Configurare',
+  setAdminAccount: 'Configurare cont de administrator',
+  setAdminAccountDesc: 'Privilegii maxime pentru contul de administrator, care poate fi utilizat pentru crearea de aplica葲ii 葯i gestionarea furnizorilor LLM, etc.',
+  createAndSignIn: 'Creeaz膬 葯i autentific膬-te',
+  oneMoreStep: 'Un pas 卯n plus',
+  createSample: 'Pe baza acestor informa葲ii, vom crea o aplica葲ie de exemplu pentru tine',
+  invitationCode: 'Cod de invita葲ie',
+  invitationCodePlaceholder: 'Codul t膬u de invita葲ie',
+  interfaceLanguage: 'Limba interfe葲ei',
+  timezone: 'Fus orar',
+  go: 'Mergi la Dify',
+  sendUsMail: 'Trimite-ne un email cu introducerea ta 葯i noi ne vom ocupa de cererea de invita葲ie.',
+  acceptPP: 'Am citit 葯i accept politica de confiden葲ialitate',
+  reset: 'Rula葲i urm膬toarea comand膬 pentru a v膬 reseta parola',
+  withGitHub: 'Continu膬 cu GitHub',
+  withGoogle: 'Continu膬 cu Google',
+  rightTitle: 'Deblocheaz膬 卯ntregul poten葲ial al LLM',
+  rightDesc: 'Construie葯te cu u葯urin葲膬 aplica葲ii AI captivante din punct de vedere vizual, utilizabile 葯i 卯mbun膬t膬葲ibile.',
+  tos: 'Termeni 葯i condi葲ii',
+  pp: 'Politica de confiden葲ialitate',
+  tosDesc: 'Prin 卯nregistrarea, e葯ti de acord cu',
+  goToInit: 'Dac膬 nu ai ini葲ializat 卯nc膬 contul, te rug膬m s膬 mergi la pagina de ini葲ializare',
+  dontHave: 'Nu ai?',
+  invalidInvitationCode: 'Cod de invita葲ie invalid',
+  accountAlreadyInited: 'Contul este deja ini葲ializat',
+  forgotPassword: 'A葲i uitat parola?',
+  resetLinkSent: 'Link de resetare trimis',
+  sendResetLink: 'Trimite葲i linkul de resetare',
+  backToSignIn: '脦napoi la autentificare',
+  forgotPasswordDesc: 'V膬 rug膬m s膬 introduce葲i adresa de e-mail pentru a reseta parola. V膬 vom trimite un e-mail cu instruc葲iuni despre cum s膬 reseta葲i parola.',
+  checkEmailForResetLink: 'V膬 rug膬m s膬 verifica葲i e-mailul pentru un link de resetare a parolei. Dac膬 nu apare 卯n c芒teva minute, verifica葲i folderul de spam.',
+  passwordChanged: 'Conecteaz膬-te acum',
+  changePassword: 'Schimb膬 parola',
+  changePasswordTip: 'V膬 rug膬m s膬 introduce葲i o nou膬 parol膬 pentru contul dvs',
+  invalidToken: 'Token invalid sau expirat',
+  confirmPassword: 'Confirm膬 parola',
+  confirmPasswordPlaceholder: 'Confirma葲i noua parol膬',
+  passwordChangedTip: 'Parola dvs. a fost schimbat膬 cu succes',
+  error: {
+    emailEmpty: 'Adresa de email este obligatorie',
+    emailInValid: 'Te rug膬m s膬 introduci o adres膬 de email valid膬',
+    nameEmpty: 'Numele este obligatoriu',
+    passwordEmpty: 'Parola este obligatorie',
+    passwordInvalid: 'Parola trebuie s膬 con葲in膬 litere 葯i cifre, iar lungimea trebuie s膬 fie mai mare de 8 caractere',
+    passwordLengthInValid: 'Parola trebuie s膬 aib膬 cel pu葲in 8 caractere',
+    registrationNotAllowed: 'Contul nu a fost g膬sit. V膬 rug膬m s膬 contacta葲i administratorul de sistem pentru a v膬 卯nregistra.',
+  },
+  license: {
+    tip: '脦nainte de a 卯ncepe Dify Community Edition, cite葯te',
+    link: 'Licen葲a open-source de pe GitHub',
+  },
+  join: 'Al膬tur膬-te',
+  joinTipStart: 'Te invit膬m s膬 te al膬turi echipei',
+  joinTipEnd: 'pe Dify',
+  invalid: 'Link-ul a expirat',
+  explore: 'Exploreaz膬 Dify',
+  activatedTipStart: 'Te-ai al膬turat echipei',
+  activatedTipEnd: '',
+  activated: 'Autentific膬-te acum',
+  adminInitPassword: 'Parola de ini葲ializare a administratorului',
+  validate: 'Valideaz膬',
+  checkCode: {
+    verificationCode: 'Cod de verificare',
+    invalidCode: 'Cod nevalid',
+    checkYourEmail: 'Verific膬-葲i e-mailul',
+    validTime: 'Re葲ine葲i c膬 codul este valabil timp de 5 minute',
+    didNotReceiveCode: 'Nu a葲i primit codul?',
+    verificationCodePlaceholder: 'Introduce葲i codul din 6 cifre',
+    emptyCode: 'Codul este necesar',
+    verify: 'Verifica',
+    tips: 'Trimitem un cod de verificare la <strong>{{email}}</strong>',
+    useAnotherMethod: 'Utiliza葲i o alt膬 metod膬',
+    resend: 'Retrimite',
+  },
+  usePassword: 'Utiliza葲i parola',
+  useVerificationCode: 'Utilizarea codului de verificare',
+  sendVerificationCode: 'Trimite葲i codul de verificare',
+  resetPassword: 'Reseta葲i parola',
+  withSSO: 'Continua葲i cu SSO',
+  setYourAccount: 'Seta葲i-v膬 contul',
+  noLoginMethodTip: 'V膬 rug膬m s膬 contacta葲i administratorul de sistem pentru a ad膬uga o metod膬 de autentificare.',
+  back: 'Spate',
+  backToLogin: '脦napoi la autentificare',
+  continueWithCode: 'Continua葲i cu codul',
+  noLoginMethod: 'Metoda de autentificare nu este configurat膬',
+  enterYourName: 'V膬 rug膬m s膬 introduce葲i numele de utilizator',
+  or: 'SAU',
+  resetPasswordDesc: 'Tasta葲i e-mailul pe care l-a葲i folosit pentru a v膬 卯nscrie pe Dify 葯i v膬 vom trimite un e-mail de resetare a parolei.',
+  changePasswordBtn: 'Seta葲i o parol膬',
+  licenseLostTip: 'Nu s-a reu葯it conectarea serverului de licen葲e Dify. Contacta葲i administratorul pentru a continua s膬 utiliza葲i Dify.',
+  licenseInactive: 'Licen葲膬 inactiv膬',
+  licenseInactiveTip: 'Licen葲a Dify Enterprise pentru spa葲iul de lucru este inactiv膬. Contacta葲i administratorul pentru a continua s膬 utiliza葲i Dify.',
+  licenseExpired: 'Licen葲膬 expirat膬',
+  licenseLost: 'Licen葲膬 pierdut膬',
+  licenseExpiredTip: 'Licen葲a Dify Enterprise pentru spa葲iul de lucru a expirat. Contacta葲i administratorul pentru a continua s膬 utiliza葲i Dify.',
+}
+
+export default translation
diff --git a/i18n/ro-RO/plugin-tags.ts b/i18n/ro-RO/plugin-tags.ts
new file mode 100644
index 0000000..e48732e
--- /dev/null
+++ b/i18n/ro-RO/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    education: 'Educa葲ie',
+    finance: 'Finan牛a',
+    other: 'Alt',
+    travel: 'C膬l膬torie',
+    news: '葮tiri',
+    utilities: 'Utilit膬牛i',
+    entertainment: 'Divertisment',
+    search: 'C膬utare',
+    productivity: 'Productivitate',
+    design: 'Design',
+    videos: 'Videoclipuri',
+    medical: 'Medical',
+    social: 'Social',
+    agent: 'Agent',
+    business: 'Afacere',
+    weather: 'Vreme',
+    image: 'Imagine',
+  },
+  allTags: 'Toate etichetele',
+  searchTags: 'Etichete de c膬utare',
+}
+
+export default translation
diff --git a/i18n/ro-RO/plugin.ts b/i18n/ro-RO/plugin.ts
new file mode 100644
index 0000000..4fe0782
--- /dev/null
+++ b/i18n/ro-RO/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    all: 'Tot',
+    bundles: 'Pachete',
+    agents: 'Strategii pentru agen葲i',
+    tools: 'Instrumente',
+    extensions: 'Extensii',
+    models: 'Modele',
+  },
+  categorySingle: {
+    tool: 'Unealt膬',
+    bundle: 'Pachet',
+    extension: 'Extensie',
+    agent: 'Strategia agentului',
+    model: 'Model',
+  },
+  list: {
+    source: {
+      marketplace: 'Instaleaz膬 din Marketplace',
+      github: 'Instala葲i din GitHub',
+      local: 'Instalare din fi葯ierul pachet local',
+    },
+    noInstalled: 'Nu sunt instalate plugin-uri',
+    notFound: 'Nu au fost g膬site plugin-uri',
+  },
+  source: {
+    local: 'Fi葯ier pachet local',
+    marketplace: 'T芒rg',
+    github: 'GitHub',
+  },
+  detailPanel: {
+    categoryTip: {
+      debugging: 'Plugin de depanare',
+      github: 'Instalat de pe Github',
+      marketplace: 'Instalat din Marketplace',
+      local: 'Plugin local',
+    },
+    operation: {
+      checkUpdate: 'Verifica葲i actualizarea',
+      update: 'Actualiza',
+      viewDetail: 'Vezi detalii',
+      remove: 'Dep膬rta',
+      install: 'Instala',
+      detail: 'Detalii',
+      info: 'Informa葲ii despre plugin',
+    },
+    toolSelector: {
+      unsupportedContent: 'Versiunea de plugin instalat膬 nu ofer膬 aceast膬 ac葲iune.',
+      auto: 'Automat',
+      empty: 'Face葲i clic pe butonul "+" pentru a ad膬uga instrumente. Pute葲i ad膬uga mai multe instrumente.',
+      uninstalledContent: 'Acest plugin este instalat din depozitul local/GitHub. V膬 rug膬m s膬 utiliza葲i dup膬 instalare.',
+      descriptionLabel: 'Descrierea instrumentului',
+      unsupportedContent2: 'Face葲i clic pentru a comuta versiunea.',
+      uninstalledLink: 'Gestiona葲i 卯n pluginuri',
+      paramsTip1: 'Controleaz膬 parametrii de inferen葲膬 LLM.',
+      params: 'CONFIGURAREA RA葰IONAMENTULUI',
+      paramsTip2: 'C芒nd "Automat" este dezactivat, se folose葯te valoarea implicit膬.',
+      settings: 'SET膫RI UTILIZATOR',
+      unsupportedTitle: 'Ac葲iune neacceptat膬',
+      placeholder: 'Selecta葲i un instrument...',
+      title: 'Ad膬ugare instrument',
+      descriptionPlaceholder: 'Scurt膬 descriere a scopului instrumentului, de exemplu, ob葲ine葲i temperatura pentru o anumit膬 loca葲ie.',
+      toolLabel: 'Unealt膬',
+      uninstalledTitle: 'Instrumentul nu este instalat',
+    },
+    endpointDeleteContent: 'Dori葲i s膬 elimina葲i {{name}}?',
+    strategyNum: '{{num}} {{strategie}} INCLUS',
+    configureApp: 'Configura葲i aplica葲ia',
+    actionNum: '{{num}} {{ac葲iune}} INCLUS',
+    endpointsTip: 'Acest plugin ofer膬 func葲ionalit膬葲i specifice prin puncte finale 葯i pute葲i configura mai multe seturi de puncte finale pentru spa葲iul de lucru curent.',
+    switchVersion: 'Versiune de comutare',
+    endpointDisableContent: 'Dori葲i s膬 dezactiva葲i {{name}}?',
+    endpointModalTitle: 'Configura葲i punctul final',
+    endpointDisableTip: 'Dezactiva葲i punctul final',
+    endpointsEmpty: 'Face葲i clic pe butonul "+" pentru a ad膬uga un punct final',
+    endpointDeleteTip: 'Elimina葲i punctul final',
+    disabled: 'Dezactivat',
+    configureTool: 'Instrumentul de configurare',
+    endpointsDocLink: 'Vizualiza葲i documentul',
+    endpoints: 'Capetele',
+    serviceOk: 'Serviciu OK',
+    endpointModalDesc: 'Odat膬 configurate, pot fi utilizate func葲iile furnizate de plugin prin intermediul punctelor finale API.',
+    modelNum: '{{num}} MODELE INCLUSE',
+    configureModel: 'Configurarea modelului',
+  },
+  debugInfo: {
+    viewDocs: 'Vizualiza葲i documentele',
+    title: 'Depanare',
+  },
+  privilege: {
+    whoCanDebug: 'Cine poate depana pluginuri?',
+    everyone: 'Oricine',
+    title: 'Preferin葲e plugin',
+    whoCanInstall: 'Cine poate instala 葯i gestiona plugin-uri?',
+    noone: 'Nimeni',
+    admins: 'Administratori',
+  },
+  pluginInfoModal: {
+    release: 'Elibera',
+    packageName: 'Pachet',
+    title: 'Informa葲ii despre plugin',
+    repository: 'Depozit',
+  },
+  action: {
+    deleteContentRight: 'plugin?',
+    pluginInfo: 'Informa葲ii despre plugin',
+    usedInApps: 'Acest plugin este folosit 卯n aplica葲iile {{num}}.',
+    delete: 'Elimina葲i pluginul',
+    checkForUpdates: 'Verifica葲i dac膬 exist膬 actualiz膬ri',
+    deleteContentLeft: 'Dori葲i s膬 elimina葲i',
+  },
+  installModal: {
+    labels: {
+      version: 'Versiune',
+      package: 'Pachet',
+      repository: 'Depozit',
+    },
+    installing: 'Instalarea...',
+    dropPluginToInstall: 'Arunca葲i pachetul de plugin aici pentru a instala',
+    back: 'Spate',
+    installFailed: 'Instalarea a e葯uat',
+    pluginLoadError: 'Eroare de 卯nc膬rcare a pluginului',
+    installComplete: 'Instalare finalizat膬',
+    installedSuccessfully: 'Instalarea cu succes',
+    cancel: 'Anula',
+    install: 'Instala',
+    uploadingPackage: '脦nc膬rcarea {{packageName}}...',
+    installPlugin: 'Instaleaz膬 pluginul',
+    close: '脦nchide',
+    readyToInstallPackages: 'Despre instalarea urm膬toarelor plugin-uri {{num}}',
+    next: 'Urm膬tor',
+    installFailedDesc: 'Pluginul a fost instalat a e葯uat.',
+    uploadFailed: '脦nc膬rcarea a e葯uat',
+    fromTrustSource: 'V膬 rug膬m s膬 v膬 asigura葲i c膬 instala葲i plugin-uri numai dintr-o <trustSource>surs膬 de 卯ncredere</trustSource>.',
+    readyToInstallPackage: 'Despre instalarea urm膬torului plugin',
+    pluginLoadErrorDesc: 'Acest plugin nu va fi instalat',
+    installedSuccessfullyDesc: 'Pluginul a fost instalat cu succes.',
+    readyToInstall: 'Despre instalarea urm膬torului plugin',
+  },
+  installFromGitHub: {
+    installFailed: 'Instalarea a e葯uat',
+    updatePlugin: 'Actualiza葲i pluginul de pe GitHub',
+    uploadFailed: '脦nc膬rcarea a e葯uat',
+    selectVersionPlaceholder: 'V膬 rug膬m s膬 selecta葲i o versiune',
+    installNote: 'V膬 rug膬m s膬 v膬 asigura葲i c膬 instala葲i plugin-uri numai dintr-o surs膬 de 卯ncredere.',
+    gitHubRepo: 'Depozit GitHub',
+    selectPackagePlaceholder: 'V膬 rug膬m s膬 selecta葲i un pachet',
+    selectPackage: 'Selecteaz膬 pachetul',
+    selectVersion: 'Selecteaz膬 versiunea',
+    installPlugin: 'Instala葲i pluginul de pe GitHub',
+    installedSuccessfully: 'Instalarea cu succes',
+  },
+  upgrade: {
+    close: '脦nchide',
+    upgrade: 'Instala',
+    description: 'Despre instalarea urm膬torului plugin',
+    upgrading: 'Instalarea...',
+    successfulTitle: 'Instalarea cu succes',
+    title: 'Instaleaz膬 pluginul',
+    usedInApps: 'Folosit 卯n {{num}} aplica葲ii',
+  },
+  error: {
+    fetchReleasesError: 'Nu se pot recupera versiunile. V膬 rug膬m s膬 卯ncerca葲i din nou mai t芒rziu.',
+    inValidGitHubUrl: 'URL GitHub nevalid. V膬 rug膬m s膬 introduce葲i o adres膬 URL valid膬 卯n formatul: https://github.com/owner/repo',
+    noReleasesFound: 'Nu s-au g膬sit eliber膬ri. V膬 rug膬m s膬 verifica葲i depozitul GitHub sau URL-ul de intrare.',
+  },
+  marketplace: {
+    sortOption: {
+      newlyReleased: 'Nou lansat',
+      recentlyUpdated: 'Actualizat recent',
+      mostPopular: 'Cele mai populare',
+      firstReleased: 'Prima lansare',
+    },
+    noPluginFound: 'Nu s-a g膬sit niciun plugin',
+    sortBy: 'Ora葯ul negru',
+    discover: 'Descoperi',
+    empower: '脦mbun膬t膬葲e葯te-葲i dezvoltarea AI',
+    pluginsResult: '{{num}} rezultate',
+    difyMarketplace: 'Pia葲a Dify',
+    moreFrom: 'Mai multe din Marketplace',
+    and: '葯i',
+    viewMore: 'Vezi mai mult',
+    partnerTip: 'Verificat de un partener Dify',
+    verifiedTip: 'Verificat de Dify',
+  },
+  task: {
+    installError: '{{errorLength}} plugin-urile nu s-au instalat, face葲i clic pentru a vizualiza',
+    clearAll: '葮terge葲i tot',
+    installedError: '{{errorLength}} plugin-urile nu s-au instalat',
+    installingWithError: 'Instalarea pluginurilor {{installingLength}}, {{successLength}} succes, {{errorLength}} e葯uat',
+    installingWithSuccess: 'Instalarea pluginurilor {{installingLength}}, {{successLength}} succes.',
+    installing: 'Instalarea pluginurilor {{installingLength}}, 0 terminat.',
+  },
+  submitPlugin: 'Trimite plugin',
+  fromMarketplace: 'Din Marketplace',
+  from: 'Din',
+  findMoreInMarketplace: 'Afl膬 mai multe 卯n Marketplace',
+  searchInMarketplace: 'C膬utare 卯n Marketplace',
+  searchTools: 'Instrumente de c膬utare...',
+  installFrom: 'INSTALEAZ膫 DE LA',
+  allCategories: 'Toate categoriile',
+  searchPlugins: 'Pluginuri de c膬utare',
+  installPlugin: 'Instaleaz膬 pluginul',
+  install: '{{num}} instal膬ri',
+  search: 'C膬utare',
+  installAction: 'Instala',
+  endpointsEnabled: '{{num}} seturi de puncte finale activate',
+  searchCategories: 'Categorii de c膬utare',
+  metadata: {
+    title: 'Pluginuri',
+  },
+  difyVersionNotCompatible: 'Versiunea curent膬 Dify nu este compatibil膬 cu acest plugin, v膬 rug膬m s膬 face葲i upgrade la versiunea minim膬 necesar膬: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/ro-RO/register.ts b/i18n/ro-RO/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/ro-RO/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/ro-RO/run-log.ts b/i18n/ro-RO/run-log.ts
new file mode 100644
index 0000000..15aa590
--- /dev/null
+++ b/i18n/ro-RO/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: 'INTRARE',
+  result: 'REZULTAT',
+  detail: 'DETALIU',
+  tracing: 'URM膫RIRE',
+  resultPanel: {
+    status: 'STARE',
+    time: 'TIMP SCURS',
+    tokens: 'TOTAL TOKENI',
+  },
+  meta: {
+    title: 'METADATE',
+    status: 'Stare',
+    version: 'Versiune',
+    executor: 'Executor',
+    startTime: 'Timp de 卯nceput',
+    time: 'Timp scurs',
+    tokens: 'Total tokeni',
+    steps: 'Pa葯i de rulare',
+  },
+  resultEmpty: {
+    title: 'Aceast膬 rulare genereaz膬 doar format JSON,',
+    tipLeft: 'v膬 rug膬m s膬 merge葲i la ',
+    link: 'panoul de detalii',
+    tipRight: ' pentru a o vizualiza.',
+  },
+  actionLogs: 'Jurnale de ac葲iuni',
+  circularInvocationTip: 'Exist膬 o invocare circular膬 a instrumentelor/nodurilor 卯n fluxul de lucru curent.',
+}
+
+export default translation
diff --git a/i18n/ro-RO/share-app.ts b/i18n/ro-RO/share-app.ts
new file mode 100644
index 0000000..2cb39a0
--- /dev/null
+++ b/i18n/ro-RO/share-app.ts
@@ -0,0 +1,82 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: 'Aplica葲ia nu este disponibil膬',
+    appUnknownError: 'Aplica葲ia nu este disponibil膬',
+  },
+  chat: {
+    newChat: 'Chat nou',
+    pinnedTitle: 'Fixat',
+    unpinnedTitle: 'Conversa葲ii',
+    newChatDefaultName: 'Conversa葲ie nou膬',
+    resetChat: 'Reseteaz膬 conversa葲ia',
+    poweredBy: 'Furnizat de',
+    prompt: 'Sugestie',
+    privatePromptConfigTitle: 'Set膬ri conversa葲ie',
+    publicPromptConfigTitle: 'Sugestie ini葲ial膬',
+    configStatusDes: '脦nainte de a 卯ncepe, pute葲i modifica set膬rile conversa葲iei',
+    configDisabled:
+      'Set膬rile sesiunii anterioare au fost utilizate pentru aceast膬 sesiune.',
+    startChat: '脦ncepe chat',
+    privacyPolicyLeft:
+      'V膬 rug膬m s膬 citi葲i ',
+    privacyPolicyMiddle:
+      'politica de confiden葲ialitate',
+    privacyPolicyRight:
+      ' furnizat膬 de dezvoltatorul aplica葲iei.',
+    deleteConversation: {
+      title: '葮terge conversa葲ia',
+      content: 'Sigur dori葲i s膬 葯terge葲i aceast膬 conversa葲ie?',
+    },
+    tryToSolve: '脦ncerca葲i s膬 rezolva葲i',
+    temporarySystemIssue: 'Ne pare r膬u, problem膬 temporar膬 a sistemului.',
+    expand: 'Extinde',
+    collapse: 'Restr芒nge',
+    chatFormTip: 'Set膬rile chat-ului nu pot fi modificate dup膬 ce chat-ul a 卯nceput.',
+    viewChatSettings: 'Vizualizeaz膬 set膬rile de chat',
+    newChatTip: 'Deja 卯ntr-o discu葲ie nou膬',
+    chatSettingsTitle: 'Nou膬 configurare a chatului',
+  },
+  generation: {
+    tabs: {
+      create: 'Ruleaz膬 o singur膬 dat膬',
+      batch: 'Ruleaz膬 卯n lot',
+      saved: 'Salvat',
+    },
+    savedNoData: {
+      title: 'Nu a葲i salvat 卯nc膬 un rezultat!',
+      description: '脦ncepe葲i generarea de con葲inut 葯i g膬si葲i aici rezultatele salvate.',
+      startCreateContent: '脦ncepe葲i crearea de con葲inut',
+    },
+    title: 'Completare AI',
+    queryTitle: 'Con葲inutul interog膬rii',
+    completionResult: 'Rezultatul complet膬rii',
+    queryPlaceholder: 'Scrie葲i con葲inutul interog膬rii...',
+    run: 'Execut膬',
+    copy: 'Copiaz膬',
+    resultTitle: 'Completare AI',
+    noData: 'AI v膬 va oferi ceea ce dori葲i aici.',
+    csvUploadTitle: 'Trage葲i 葯i plasa葲i fi葯ierul CSV aici sau ',
+    browse: 'r膬sfoi葲i',
+    csvStructureTitle: 'Fi葯ierul CSV trebuie s膬 respecte urm膬toarea structur膬:',
+    downloadTemplate: 'Desc膬rca葲i 葯ablonul aici',
+    field: 'C芒mp',
+    batchFailed: {
+      info: '{{num}} execu葲ii e葯uate',
+      retry: 'Re卯ncerca葲i',
+      outputPlaceholder: 'Niciun con葲inut de ie葯ire',
+    },
+    errorMsg: {
+      empty: 'V膬 rug膬m s膬 introduce葲i con葲inut 卯n fi葯ierul 卯nc膬rcat.',
+      fileStructNotMatch: 'Fi葯ierul CSV 卯nc膬rcat nu se potrive葯te cu structura.',
+      emptyLine: 'R芒ndul {{rowIndex}} este gol',
+      invalidLine: 'R芒ndul {{rowIndex}}: valoarea {{varName}} nu poate fi goal膬',
+      moreThanMaxLengthLine: 'R芒ndul {{rowIndex}}: valoarea {{varName}} nu poate avea mai mult de {{maxLength}} caractere',
+      atLeastOne: 'V膬 rug膬m s膬 introduce葲i cel pu葲in un r芒nd 卯n fi葯ierul 卯nc膬rcat.',
+    },
+    execution: 'EXECU葰IE',
+    executions: '{{num}} EXECU葰II',
+  },
+}
+
+export default translation
diff --git a/i18n/ro-RO/time.ts b/i18n/ro-RO/time.ts
new file mode 100644
index 0000000..2b40803
--- /dev/null
+++ b/i18n/ro-RO/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Sun: 'Soare',
+    Thu: 'Joia',
+    Wed: 'Miercuri',
+    Tue: 'Mar葲i',
+    Sat: 'Sat',
+    Mon: 'Mon',
+    Fri: 'Vineri',
+  },
+  months: {
+    December: 'Decembrie',
+    February: 'Februarie',
+    April: 'Aprilie',
+    August: 'August',
+    September: 'septembrie',
+    March: 'Martie',
+    May: 'Mai',
+    July: 'Iulie',
+    June: 'Iunie',
+    October: 'Octombrie',
+    November: 'Noiembrie',
+    January: 'ianuarie',
+  },
+  operation: {
+    cancel: 'Anuleaz膬',
+    pickDate: 'Alege o dat膬',
+    now: 'Acum',
+    ok: 'Bine',
+  },
+  title: {
+    pickTime: 'Alege葲i timpul',
+  },
+  defaultPlaceholder: 'Alege o or膬...',
+}
+
+export default translation
diff --git a/i18n/ro-RO/tools.ts b/i18n/ro-RO/tools.ts
new file mode 100644
index 0000000..f5e3388
--- /dev/null
+++ b/i18n/ro-RO/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: 'Instrumente',
+  createCustomTool: 'Creeaz膬 Instrument Personalizat',
+  type: {
+    all: 'Toate',
+    builtIn: 'Incorporat',
+    custom: 'Personalizat',
+    workflow: 'Flux de lucru',
+  },
+  contribute: {
+    line1: 'Sunt interesat s膬 ',
+    line2: 'contribui la Dify cu instrumente.',
+    viewGuide: 'Vezi ghidul',
+  },
+  author: 'De',
+  auth: {
+    unauthorized: 'Pentru a Autoriza',
+    authorized: 'Autorizat',
+    setup: 'Configureaz膬 autorizarea pentru a utiliza',
+    setupModalTitle: 'Configureaz膬 Autorizarea',
+    setupModalTitleDescription: 'Dup膬 configurarea creden葲ialelor, to葲i membrii din spa葲iul de lucru pot utiliza acest instrument la orchestrarea aplica葲iilor.',
+  },
+  includeToolNum: '{{num}} instrumente incluse',
+  addTool: 'Adaug膬 Instrument',
+  createTool: {
+    title: 'Creeaz膬 Instrument Personalizat',
+    editAction: 'Configureaz膬',
+    editTitle: 'Editeaz膬 Instrument Personalizat',
+    name: 'Nume',
+    toolNamePlaceHolder: 'Introduce葲i numele instrumentului',
+    schema: 'Schema',
+    schemaPlaceHolder: 'Introduce葲i aici schema OpenAPI',
+    viewSchemaSpec: 'Vezi specifica葲ia OpenAPI-Swagger',
+    importFromUrl: 'Import膬 de la URL',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: 'V膬 rug膬m s膬 introduce葲i un URL valid',
+    examples: 'Exemple',
+    exampleOptions: {
+      json: 'Vreme(JSON)',
+      yaml: 'Pet Store(YAML)',
+      blankTemplate: '葮ablon Gol',
+    },
+    availableTools: {
+      title: 'Instrumente Disponibile',
+      name: 'Nume',
+      description: 'Descriere',
+      method: 'Metod膬',
+      path: 'Cale',
+      action: 'Ac葲iuni',
+      test: 'Testeaz膬',
+    },
+    authMethod: {
+      title: 'Metoda de Autorizare',
+      type: 'Tipul de Autorizare',
+      keyTooltip: 'Cheie antet HTTP, pute葲i l膬sa "Autorizare" dac膬 nu 葯ti葲i ce este sau seta葲i-o la o valoare personalizat膬',
+      types: {
+        none: 'Niciuna',
+        api_key: 'Cheie API',
+        apiKeyPlaceholder: 'Nume antet HTTP pentru cheia API',
+        apiValuePlaceholder: 'Introduce葲i cheia API',
+      },
+      key: 'Cheie',
+      value: 'Valoare',
+    },
+    authHeaderPrefix: {
+      title: 'Tipul de Autentificare',
+      types: {
+        basic: 'Basic',
+        bearer: 'Bearer',
+        custom: 'Personalizat',
+      },
+    },
+    privacyPolicy: 'Politica de Confiden葲ialitate',
+    privacyPolicyPlaceholder: 'V膬 rug膬m s膬 introduce葲i politica de confiden葲ialitate',
+    deleteToolConfirmTitle: '葮terge葲i aceast膬 unealt膬?',
+    deleteToolConfirmContent: ' 葮tergerea unelt膬 este irreversibil膬. Utilizatorii nu vor mai putea accesa unelt膬 dvs.',
+    toolInput: {
+      methodParameter: 'Parametru',
+      description: 'Descriere',
+      methodSetting: 'Setare',
+      methodSettingTip: 'Utilizatorul completeaz膬 configura葲ia instrumentului',
+      methodParameterTip: 'Complet膬ri LLM 卯n timpul inferen葲ei',
+      name: 'Nume',
+      descriptionPlaceholder: 'Descrierea semnifica葲iei parametrului',
+      label: 'Tags',
+      required: 'Necesar',
+      method: 'Metod膬',
+      title: 'Intrare instrument',
+      labelPlaceholder: 'Alege葲i etichetele (op葲ional)',
+    },
+    descriptionPlaceholder: 'Scurt膬 descriere a scopului instrumentului, de exemplu, ob葲ine葲i temperatura pentru o anumit膬 loca葲ie.',
+    nameForToolCall: 'Numele apelului instrumentului',
+    description: 'Descriere',
+    confirmTip: 'Aplica葲iile care folosesc acest instrument vor fi afectate',
+    nameForToolCallPlaceHolder: 'Utilizat pentru recunoa葯terea ma葯inii, cum ar fi getCurrentWeather, list_pets',
+    customDisclaimer: 'Declinarea responsabilit膬葲ii personalizate',
+    confirmTitle: 'Confirma葲i pentru a salva?',
+    customDisclaimerPlaceholder: 'V膬 rug膬m s膬 introduce葲i declinarea responsabilit膬葲ii personalizate',
+    nameForToolCallTip: 'Accept膬 doar numere, litere 葯i caractere de subliniere.',
+  },
+  test: {
+    title: 'Testeaz膬',
+    parametersValue: 'Parametri & Valoare',
+    parameters: 'Parametri',
+    value: 'Valoare',
+    testResult: 'Rezultate Test',
+    testResultPlaceholder: 'Rezultatul testului va fi afi葯at aici',
+  },
+  thought: {
+    using: 'Utiliz芒nd',
+    used: 'Utilizat',
+    requestTitle: 'Cerere c膬tre',
+    responseTitle: 'R膬spuns de la',
+  },
+  setBuiltInTools: {
+    info: 'Informa葲ii',
+    setting: 'Set膬ri',
+    toolDescription: 'Descriere instrument',
+    parameters: 'parametri',
+    string: '葯ir',
+    number: 'num膬r',
+    required: 'Obligatoriu',
+    infoAndSetting: 'Informa葲ii 葯i Set膬ri',
+    file: 'fi葯ier',
+  },
+  noCustomTool: {
+    title: 'Niciun instrument personalizat!',
+    content: 'Ad膬uga葲i 葯i gestiona葲i aici instrumentele personalizate pentru construirea aplica葲iilor AI.',
+    createTool: 'Creeaz膬 Instrument',
+  },
+  noSearchRes: {
+    title: 'Ne pare r膬u, nu s-au g膬sit rezultate!',
+    content: 'Nu am putut g膬si niciun instrument care s膬 se potriveasc膬 c膬ut膬rii dvs.',
+    reset: 'Reseteaz膬 C膬utarea',
+  },
+  builtInPromptTitle: 'Prompt',
+  toolRemoved: 'Instrument eliminat',
+  notAuthorized: 'Instrument neautorizat',
+  howToGet: 'Cum s膬 ob葲ii',
+  addToolModal: {
+    added: 'ad膬ugat',
+    category: 'categorie',
+    manageInTools: 'Gestiona葲i 卯n Instrumente',
+    add: 'ad膬uga',
+    type: 'tip',
+    emptyTitle: 'Nu este disponibil niciun instrument de flux de lucru',
+    emptyTip: 'Accesa葲i "Flux de lucru -> Publica葲i ca instrument"',
+    emptyTitleCustom: 'Nu este disponibil niciun instrument personalizat',
+    emptyTipCustom: 'Crearea unui instrument personalizat',
+  },
+  openInStudio: 'Deschide 卯n Studio',
+  customToolTip: 'Afla葲i mai multe despre instrumentele personalizate Dify',
+  toolNameUsageTip: 'Numele de apel al instrumentului pentru ra葲ionamentul 葯i solicitarea agentului',
+  copyToolName: 'Copiaz膬 numele',
+  noTools: 'Nu s-au g膬sit unelte',
+}
+
+export default translation
diff --git a/i18n/ro-RO/workflow.ts b/i18n/ro-RO/workflow.ts
new file mode 100644
index 0000000..2978565
--- /dev/null
+++ b/i18n/ro-RO/workflow.ts
@@ -0,0 +1,921 @@
+const translation = {
+  common: {
+    undo: 'Anuleaz膬',
+    redo: 'Ref膬',
+    editing: 'Editare',
+    autoSaved: 'Salvat automat',
+    unpublished: 'Nepublicat',
+    published: 'Publicat',
+    publish: 'Public膬',
+    update: 'Actualizeaz膬',
+    run: 'Ruleaz膬',
+    running: 'Rul芒nd',
+    inRunMode: '脦n modul de rulare',
+    inPreview: '脦n previzualizare',
+    inPreviewMode: '脦n modul de previzualizare',
+    preview: 'Previzualizeaz膬',
+    viewRunHistory: 'Vezi istoricul rul膬rilor',
+    runHistory: 'Istoric rul膬ri',
+    goBackToEdit: '脦napoi la editor',
+    conversationLog: 'Jurnal conversa葲ie',
+    features: 'Func葲ionalit膬葲i',
+    debugAndPreview: 'Previzualizare',
+    restart: 'Reporne葯te',
+    currentDraft: 'Schimbare curent膬',
+    currentDraftUnpublished: 'Schimbare curent膬 nepublicat膬',
+    latestPublished: 'Ultima publicare',
+    publishedAt: 'Publicat la',
+    restore: 'Restaureaz膬',
+    runApp: 'Ruleaz膬 aplica葲ia',
+    batchRunApp: 'Ruleaz膬 aplica葲ia 卯n lot',
+    accessAPIReference: 'Acceseaz膬 referin葲a API',
+    embedIntoSite: 'Incorporeaz膬 卯n site',
+    addTitle: 'Adaug膬 titlu...',
+    addDescription: 'Adaug膬 descriere...',
+    noVar: 'F膬r膬 variabil膬',
+    searchVar: 'Caut膬 variabil膬',
+    variableNamePlaceholder: 'Nume variabil膬',
+    setVarValuePlaceholder: 'Seteaz膬 valoarea variabilei',
+    needConnectTip: 'Acest pas nu este conectat la nimic',
+    maxTreeDepth: 'Limit膬 maxim膬 de {{depth}} noduri pe ramur膬',
+    needEndNode: 'Trebuie ad膬ugat blocul de sf芒r葯it',
+    needAnswerNode: 'Trebuie ad膬ugat blocul de r膬spuns',
+    workflowProcess: 'Proces de flux de lucru',
+    notRunning: '脦nc膬 nu ruleaz膬',
+    previewPlaceholder: 'Introduce葲i con葲inutul 卯n caseta de mai jos pentru a 卯ncepe depanarea Chatbotului',
+    effectVarConfirm: {
+      title: 'Elimin膬 variabila',
+      content: 'Variabila este utilizat膬 卯n alte noduri. Dori葲i s膬 o elimina葲i oricum?',
+    },
+    insertVarTip: 'Ap膬sa葲i tasta \'/\' pentru a insera rapid',
+    processData: 'Proceseaz膬 date',
+    input: 'Intrare',
+    output: 'Ie葯ire',
+    jinjaEditorPlaceholder: 'Tasta葲i \'/\' sau \'{\' pentru a insera variabila',
+    viewOnly: 'Vizualizare doar',
+    showRunHistory: 'Afi葯eaz膬 istoricul rul膬rilor',
+    enableJinja: 'Activeaz膬 suportul pentru 葯abloane Jinja',
+    learnMore: 'Afl膬 mai multe',
+    copy: 'Copiaz膬',
+    duplicate: 'Duplic膬',
+    addBlock: 'Adaug膬 bloc',
+    pasteHere: 'Lipe葯te aici',
+    pointerMode: 'Modul pointer',
+    handMode: 'Modul m芒n膬',
+    model: 'Model',
+    workflowAsTool: 'Flux de lucru ca instrument',
+    configureRequired: 'Configurare necesar膬',
+    configure: 'Configureaz膬',
+    manageInTools: 'Gestioneaz膬 卯n instrumente',
+    workflowAsToolTip: 'Reconfigurarea instrumentului este necesar膬 dup膬 actualizarea fluxului de lucru.',
+    viewDetailInTracingPanel: 'Vezi detalii',
+    overwriteAndImport: 'Suprascriere 葯i import',
+    chooseDSL: 'Alege葲i fi葯ierul DSL(yml)',
+    syncingData: 'Sincronizarea datelor, doar c芒teva secunde.',
+    importDSL: 'Importa葲i DSL',
+    importFailure: 'E葯ecul importului',
+    importSuccess: 'Succesul importului',
+    backupCurrentDraft: 'Backup curent draft',
+    importDSLTip: 'Proiectul curent va fi suprascris. Exporta葲i fluxul de lucru ca backup 卯nainte de import.',
+    parallelTip: {
+      click: {
+        title: 'Clic',
+        desc: 'pentru a ad膬uga',
+      },
+      drag: {
+        title: 'Glisa',
+        desc: 'pentru a v膬 conecta',
+      },
+      depthLimit: 'Limita straturilor de imbricare paralel膬 a {{num}} straturi',
+      limit: 'Paralelismul este limitat la {{num}} ramuri.',
+    },
+    parallelRun: 'Rulare paralel膬',
+    disconnect: 'Deconecta',
+    jumpToNode: 'Sari la acest nod',
+    addParallelNode: 'Ad膬ugare nod paralel',
+    parallel: 'PARALEL',
+    branch: 'RAMUR膫',
+    featuresDescription: '脦mbun膬t膬葲i葲i experien葲a utilizatorului aplica葲iei web',
+    featuresDocLink: 'Afl膬 mai multe',
+    fileUploadTip: 'Func葲iile de 卯nc膬rcare a imaginilor au fost actualizate la 卯nc膬rcarea fi葯ierelor.',
+    ImageUploadLegacyTip: 'Acum pute葲i crea variabile de tip de fi葯ier 卯n formularul de pornire. Nu vom mai accepta func葲ia de 卯nc膬rcare a imaginilor 卯n viitor.',
+    importWarning: 'Pruden葲膬',
+    importWarningDetails: 'Diferen葲a de versiune DSL poate afecta anumite caracteristici',
+    openInExplore: 'Deschide 卯n Exploreaz膬',
+    onFailure: '脦n caz de e葯ec',
+    addFailureBranch: 'Ad膬ugare ramur膬 Fail',
+    noHistory: 'F膬r膬 istorie',
+    loadMore: '脦nc膬rca葲i mai multe fluxuri de lucru',
+    exportImage: 'Export膬 imaginea',
+    exportSVG: 'Export膬 ca SVG',
+    exportPNG: 'Export膬 ca PNG',
+    noExist: 'Nu exist膬 o astfel de variabil膬',
+    exitVersions: 'Ie葯ire Versiuni',
+    versionHistory: 'Istoricul versiunilor',
+    publishUpdate: 'Publica葲i actualizarea',
+    referenceVar: 'Variabil膬 de referin葲膬',
+    exportJPEG: 'Export膬 ca JPEG',
+  },
+  env: {
+    envPanelTitle: 'Variabile de Mediu',
+    envDescription: 'Variabilele de mediu pot fi utilizate pentru a stoca informa葲ii private 葯i creden葲iale. Acestea sunt doar pentru citire 葯i pot fi separate de fi葯ierul DSL 卯n timpul exportului.',
+    envPanelButton: 'Adaug膬 Variabil膬',
+    modal: {
+      title: 'Adaug膬 Variabil膬 de Mediu',
+      editTitle: 'Editeaz膬 Variabil膬 de Mediu',
+      type: 'Tip',
+      name: 'Nume',
+      namePlaceholder: 'nume mediu',
+      value: 'Valoare',
+      valuePlaceholder: 'valoare mediu',
+      secretTip: 'Utilizat pentru a defini informa葲ii sau date sensibile, cu set膬ri DSL configurate pentru prevenirea scurgerilor.',
+    },
+    export: {
+      title: 'Export膬 variabile de mediu secrete?',
+      checkbox: 'Export膬 valori secrete',
+      ignore: 'Export膬 DSL',
+      export: 'Export膬 DSL cu valori secrete',
+    },
+  },
+  chatVariable: {
+    panelTitle: 'Variabile de Conversa葲ie',
+    panelDescription: 'Variabilele de Conversa葲ie sunt utilizate pentru a stoca informa葲ii interactive pe care LLM trebuie s膬 le re葲in膬, inclusiv istoricul conversa葲iei, fi葯iere 卯nc膬rcate, preferin葲ele utilizatorului. Acestea sunt citibile 葯i inscriptibile.',
+    docLink: 'Vizita葲i documenta葲ia noastr膬 pentru a afla mai multe.',
+    button: 'Ad膬ugare Variabil膬',
+    modal: {
+      title: 'Ad膬ugare Variabil膬 de Conversa葲ie',
+      editTitle: 'Editare Variabil膬 de Conversa葲ie',
+      name: 'Nume',
+      namePlaceholder: 'Numele variabilei',
+      type: 'Tip',
+      value: 'Valoare Implicit膬',
+      valuePlaceholder: 'Valoare implicit膬, l膬sa葲i gol pentru a nu seta',
+      description: 'Descriere',
+      descriptionPlaceholder: 'Descrie葲i variabila',
+      editInJSON: 'Editare 卯n JSON',
+      oneByOne: 'Ad膬ugare una c芒te una',
+      editInForm: 'Editare 卯n Formular',
+      arrayValue: 'Valoare',
+      addArrayValue: 'Ad膬ugare Valoare',
+      objectKey: 'Cheie',
+      objectType: 'Tip',
+      objectValue: 'Valoare Implicit膬',
+    },
+    storedContent: 'Con葲inut stocat',
+    updatedAt: 'Actualizat la ',
+  },
+  changeHistory: {
+    title: 'Istoric modific膬ri',
+    placeholder: 'Nu a葲i schimbat nimic 卯nc膬',
+    clearHistory: '葮terge istoricul',
+    hint: 'Sfat',
+    hintText: 'Ac葲iunile dvs. de editare sunt urm膬rite 卯ntr-un istoric al modific膬rilor, care este stocat pe dispozitivul dvs. pe durata acestei sesiuni. Acest istoric va fi 葯ters c芒nd ve葲i p膬r膬si editorul.',
+    stepBackward_one: '{{count}} pas 卯napoi',
+    stepBackward_other: '{{count}} pa葯i 卯napoi',
+    stepForward_one: '{{count}} pas 卯nainte',
+    stepForward_other: '{{count}} pa葯i 卯nainte',
+    sessionStart: '脦nceputul sesiuni',
+    currentState: 'Stare actual膬',
+    nodeTitleChange: 'Titlul blocului a fost schimbat',
+    nodeDescriptionChange: 'Descrierea blocului a fost schimbat膬',
+    nodeDragStop: 'Bloc mutat',
+    nodeChange: 'Bloc schimbat',
+    nodeConnect: 'Bloc conectat',
+    nodePaste: 'Bloc lipit',
+    nodeDelete: 'Bloc 葯ters',
+    nodeAdd: 'Bloc ad膬ugat',
+    nodeResize: 'Bloc redimensionat',
+    noteAdd: 'Not膬 ad膬ugat膬',
+    noteChange: 'Not膬 modificat膬',
+    noteDelete: 'Not膬 葯tears膬',
+    edgeDelete: 'Bloc deconectat',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} este obligatoriu',
+    authRequired: 'Autorizarea este necesar膬',
+    invalidJson: '{{field}} este un JSON invalid',
+    fields: {
+      variable: 'Nume variabil膬',
+      variableValue: 'Valoare variabil膬',
+      code: 'Cod',
+      model: 'Model',
+      rerankModel: 'Model de rerankare',
+      visionVariable: 'Vizibilitate variabil膬',
+    },
+    invalidVariable: 'Variabil膬 invalid膬',
+    rerankModelRequired: '脦nainte de a activa modelul de reclasificare, v膬 rug膬m s膬 confirma葲i c膬 modelul a fost configurat cu succes 卯n set膬ri.',
+    toolParameterRequired: '{{field}}: parametrul [{{param}}] este obligatoriu',
+    noValidTool: '{{field}} nu a fost selectat niciun instrument valid',
+  },
+  singleRun: {
+    testRun: 'Rulare de test ',
+    startRun: '脦ncepe rularea',
+    running: 'Rul芒nd',
+    testRunIteration: 'Itera葲ie rulare de test',
+    back: '脦napoi',
+    iteration: 'Itera葲ie',
+    loop: 'Loop',
+  },
+  tabs: {
+    'searchBlock': 'Caut膬 bloc',
+    'blocks': 'Blocuri',
+    'tools': 'Instrumente',
+    'allTool': 'Toate',
+    'builtInTool': 'Integrat',
+    'customTool': 'Personalizat',
+    'workflowTool': 'Flux de lucru',
+    'question-understand': '脦n葲elegerea 卯ntreb膬rilor',
+    'logic': 'Logic膬',
+    'transform': 'Transformare',
+    'utilities': 'Utilit膬葲i',
+    'noResult': 'Niciun rezultat g膬sit',
+    'searchTool': 'Instrument de c膬utare',
+    'agent': 'Strategia agentului',
+    'plugin': 'Plugin',
+  },
+  blocks: {
+    'start': '脦ncepe',
+    'end': 'Sf芒r葯it',
+    'answer': 'R膬spuns',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'Recuperare de cuno葯tin葲e',
+    'question-classifier': 'Clasificator de 卯ntreb膬ri',
+    'if-else': 'Dac膬/Altminteri',
+    'code': 'Cod',
+    'template-transform': '葮ablon',
+    'http-request': 'Cerere HTTP',
+    'variable-assigner': 'Asignator de variabile',
+    'variable-aggregator': 'Agregator de variabile',
+    'assigner': 'Asignator de Variabile',
+    'iteration-start': '脦nceput de itera葲ie',
+    'iteration': 'Itera葲ie',
+    'parameter-extractor': 'Extractor de parametri',
+    'list-operator': 'Operator de list膬',
+    'document-extractor': 'Extractor de documente',
+    'agent': 'Agent',
+    'loop': 'Loop',
+    'loop-end': 'Ie葯ire din bucl膬',
+    'loop-start': '脦ntre葲inere bucl膬',
+  },
+  blocksAbout: {
+    'start': 'Defini葲i parametrii ini葲iali pentru lansarea unui flux de lucru',
+    'end': 'Defini葲i sf芒r葯itul 葯i tipul rezultatului unui flux de lucru',
+    'answer': 'Defini葲i con葲inutul r膬spunsului unei conversa葲ii',
+    'llm': 'Invocarea modelelor de limbaj mari pentru a r膬spunde la 卯ntreb膬ri sau pentru a procesa limbajul natural',
+    'knowledge-retrieval': 'Permite interogarea con葲inutului textului legat de 卯ntreb膬rile utilizatorului din baza de cuno葯tin葲e',
+    'question-classifier': 'Defini葲i condi葲iile de clasificare a 卯ntreb膬rilor utilizatorului, LLM poate defini cum progreseaz膬 conversa葲ia pe baza descrierii clasific膬rii',
+    'if-else': 'Permite 卯mp膬r葲irea fluxului de lucru 卯n dou膬 ramuri pe baza condi葲iilor if/else',
+    'code': 'Executa葲i un fragment de cod Python sau NodeJS pentru a implementa logic膬 personalizat膬',
+    'template-transform': 'Converti葲i datele 卯n 葯iruri de caractere folosind sintaxa 葯ablonului Jinja',
+    'http-request': 'Permite trimiterea cererilor de server prin protocolul HTTP',
+    'variable-assigner': 'Agregarea variabilelor din mai multe ramuri 卯ntr-o singur膬 variabil膬 pentru configurarea unificat膬 a nodurilor ulterioare.',
+    'assigner': 'Nodul de atribuire a variabilelor este utilizat pentru a atribui valori variabilelor inscriptibile (precum variabilele de conversa葲ie).',
+    'variable-aggregator': 'Agregarea variabilelor din mai multe ramuri 卯ntr-o singur膬 variabil膬 pentru configurarea unificat膬 a nodurilor ulterioare.',
+    'iteration': 'Efectua葲i mai mul葲i pa葯i pe un obiect list膬 p芒n膬 c芒nd toate rezultatele sunt produse.',
+    'parameter-extractor': 'Utiliza葲i LLM pentru a extrage parametrii structura葲i din limbajul natural pentru invoc膬rile de instrumente sau cererile HTTP.',
+    'list-operator': 'Folosit pentru a filtra sau sorta con葲inutul matricei.',
+    'document-extractor': 'Folosit pentru a analiza documentele 卯nc膬rcate 卯n con葲inut text care este u葯or de 卯n葲eles de LLM.',
+    'agent': 'Invocarea modelelor lingvistice mari pentru a r膬spunde la 卯ntreb膬ri sau pentru a procesa limbajul natural',
+    'loop': 'Executa葲i o bucl膬 de logic膬 p芒n膬 c芒nd condi葲ia de terminare este 卯ndeplinit膬 sau num膬rul maxim de bucle este atins.',
+    'loop-end': 'Echivalent cu 鈥瀊reak鈥�. Acest nod nu are elemente de configurare. C芒nd corpul buclei ajunge la acest nod, bucla se termin膬.',
+  },
+  operator: {
+    zoomIn: 'M膬re葯te',
+    zoomOut: 'Mic葯oreaz膬',
+    zoomTo50: 'M膬re葯te la 50%',
+    zoomTo100: 'M膬re葯te la 100%',
+    zoomToFit: 'M膬re葯te pentru a se potrivi',
+  },
+  panel: {
+    userInputField: 'C芒mp de introducere utilizator',
+    changeBlock: 'Schimb膬 blocul',
+    helpLink: 'Link de ajutor',
+    about: 'Despre',
+    createdBy: 'Creat de ',
+    nextStep: 'Pasul urm膬tor',
+    addNextStep: 'Ad膬uga葲i urm膬torul bloc 卯n acest flux de lucru',
+    selectNextStep: 'Selecta葲i urm膬torul bloc',
+    runThisStep: 'Ruleaz膬 acest pas',
+    checklist: 'Lista de verificare',
+    checklistTip: 'Asigura葲i-v膬 c膬 toate problemele sunt rezolvate 卯nainte de publicare',
+    checklistResolved: 'Toate problemele au fost rezolvate',
+    organizeBlocks: 'Organizeaz膬 blocurile',
+    change: 'Schimb膬',
+    optional: '(op葲ional)',
+  },
+  nodes: {
+    common: {
+      outputVars: 'Variabile de ie葯ire',
+      insertVarTip: 'Insereaz膬 variabil膬',
+      memory: {
+        memory: 'Memorie',
+        memoryTip: 'Set膬ri de memorie pentru conversa葲ie',
+        windowSize: 'Dimensiunea ferestrei',
+        conversationRoleName: 'Numele rolului 卯n conversa葲ie',
+        user: 'Prefix utilizator',
+        assistant: 'Prefix asistent',
+      },
+      memories: {
+        title: 'Amintiri',
+        tip: 'Memoria conversa葲iei',
+        builtIn: 'Integrat',
+      },
+      errorHandle: {
+        none: {
+          title: 'Niciunul',
+          desc: 'Nodul se va opri din rulare dac膬 apare o excep葲ie 葯i nu este gestionat',
+        },
+        defaultValue: {
+          title: 'Valoare implicit膬',
+          desc: 'C芒nd apare o eroare, specifica葲i un con葲inut de ie葯ire static.',
+          tip: '脦n caz de eroare, va reveni sub valoare.',
+          inLog: 'Excep葲ie de nod, ie葯ire 卯n func葲ie de valorile implicite.',
+          output: 'Valoare implicit膬 de ie葯ire',
+        },
+        failBranch: {
+          title: 'Ramur膬 Fail',
+          desc: 'C芒nd apare o eroare, va executa ramura de excep葲ie',
+          customize: 'Accesa葲i p芒nza pentru a personaliza logica ramurii de e葯ec.',
+          inLog: 'Excep葲ia nodului, va executa automat ramura de e葯ec. Ie葯irea nodului va returna un tip de eroare 葯i un mesaj de eroare 葯i le va transmite 卯n aval.',
+          customizeTip: 'C芒nd ramura de e葯ec este activat膬, excep葲iile aruncate de noduri nu vor 卯ncheia procesul. 脦n schimb, va executa automat ramura de e葯ec predefinit膬, permi葲芒ndu-v膬 s膬 furniza葲i 卯n mod flexibil mesaje de eroare, rapoarte, remedieri sau ac葲iuni de omitere.',
+        },
+        partialSucceeded: {
+          tip: 'Exist膬 {{num}} noduri 卯n proces care ruleaz膬 anormal, v膬 rug膬m s膬 merge葲i la urm膬rire pentru a verifica jurnalele.',
+        },
+        title: 'Gestionarea erorilor',
+        tip: 'Strategie de gestionare a excep葲iilor, declan葯at膬 atunci c芒nd un nod 卯nt芒lne葯te o excep葲ie.',
+      },
+      retry: {
+        retry: 'Re卯ncercare',
+        retryOnFailure: 'Re卯ncerca葲i 卯n caz de e葯ec',
+        maxRetries: 'num膬rul maxim de 卯ncerc膬ri',
+        retryInterval: 'Interval de re卯ncercare',
+        retrying: 'Re卯ncerca...',
+        retrySuccessful: 'Re卯ncerca葲i cu succes',
+        retryFailed: 'Re卯ncercarea a e葯uat',
+        retryFailedTimes: '{{times}} re卯ncerc膬ri e葯uate',
+        times: 'Ori',
+        ms: 'Ms',
+        retries: '{{num}} 脦ncerc膬ri',
+        retryTimes: 'Re卯ncerca葲i {{times}} ori 卯n caz de e葯ec',
+      },
+    },
+    start: {
+      required: 'necesar',
+      inputField: 'C芒mp de intrare',
+      builtInVar: 'Variabile integrate',
+      outputVars: {
+        query: 'Intrare utilizator',
+        memories: {
+          des: 'Istoric conversa葲ie',
+          type: 'tip mesaj',
+          content: 'con葲inut mesaj',
+        },
+        files: 'List膬 de fi葯iere',
+      },
+      noVarTip: 'Seta葲i intr膬rile care pot fi utilizate 卯n fluxul de lucru',
+    },
+    end: {
+      outputs: 'Ie葯iri',
+      output: {
+        type: 'tip ie葯ire',
+        variable: 'variabil膬 de ie葯ire',
+      },
+      type: {
+        'none': 'Nimic',
+        'plain-text': 'Text simplu',
+        'structured': 'Structurat',
+      },
+    },
+    answer: {
+      answer: 'R膬spuns',
+      outputVars: 'Variabile de ie葯ire',
+    },
+    llm: {
+      model: 'model',
+      variables: 'variabile',
+      context: 'context',
+      contextTooltip: 'Pute葲i importa cuno葯tin葲e ca 葯i context',
+      notSetContextInPromptTip: 'Pentru a activa func葲ia de context, completa葲i variabila de context 卯n PROMPT.',
+      prompt: 'prompt',
+      roleDescription: {
+        system: 'Da葲i instruc葲iuni de nivel 卯nalt pentru conversa葲ie',
+        user: 'Furniza葲i instruc葲iuni, 卯ntreb膬ri sau orice intrare bazat膬 pe text pentru model',
+        assistant: 'R膬spunsurile modelului bazate pe mesajele utilizatorului',
+      },
+      addMessage: 'Adaug膬 mesaj',
+      vision: 'viziune',
+      files: 'Fi葯iere',
+      resolution: {
+        name: 'Rezolu葲ie',
+        high: '脦nalt膬',
+        low: 'Joas膬',
+      },
+      outputVars: {
+        output: 'Con葲inut generat',
+        usage: 'Informa葲ii de utilizare a modelului',
+      },
+      singleRun: {
+        variable: 'Variabil膬',
+      },
+      sysQueryInUser: 'sys.query 卯n mesajul utilizatorului este necesar',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: 'V膬 rug膬m s膬 termina葲i editarea c芒mpului curent 卯nainte de a salva schema.',
+        },
+        addChildField: 'Ad膬uga葲i c芒mpul copil',
+        generationTip: 'Pute葲i folosi limbajul natural pentru a crea rapid un schema JSON.',
+        promptTooltip: 'Converte葯te descrierea textului 卯ntr-o structur膬 standardizat膬 JSON Schema.',
+        resetDefaults: 'Reseteaz膬',
+        apply: 'Aplic膬',
+        instruction: 'Instruc葲iune',
+        doc: 'Afla葲i mai multe despre ie葯irea structurat膬',
+        stringValidations: 'Valid膬rile 葯irurilor',
+        title: 'Schema de Ie艧ire Structurat膬',
+        generateJsonSchema: 'Genera葲i schema JSON',
+        generate: 'Genereaz膬',
+        import: 'Import膬 din JSON',
+        generating: 'Generarea schemei JSON...',
+        addField: 'Adaug膬 c芒mp',
+        regenerate: 'Regenerare',
+        generatedResult: 'Rezultatul generat',
+        descriptionPlaceholder: 'Ad膬uga葲i o descriere',
+        showAdvancedOptions: 'Afi葯a葲i op葲iuni avansate',
+        resultTip: 'Iat膬 rezultatul generat. Dac膬 nu e葯ti mul葲umit, po葲i s膬 te 卯ntorci 葯i s膬 卯葲i modifici cererea.',
+        fieldNamePlaceholder: 'Numele c芒mpului',
+        required: 'Necesar',
+        back: '脦napoi',
+        promptPlaceholder: 'Descrie schema ta JSON...',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'Variabil膬 de interogare',
+      knowledge: 'Cuno葯tin葲e',
+      outputVars: {
+        output: 'Date segmentate recuperate',
+        content: 'Con葲inut segmentat',
+        title: 'Titlu segmentat',
+        icon: 'Pictogram膬 segmentat膬',
+        url: 'URL segmentat',
+        metadata: 'Alte metadate',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            subTitle: 'Nu activarea filtr膬rii metadatelor',
+            title: 'Dezactivat',
+          },
+          automatic: {
+            subTitle: 'Genera葲i automat condi葲ii de filtrare a metadatelor pe baza interog膬rii utilizatorului',
+            desc: 'Genera葲i automat condi葲ii de filtrare a metadatelor pe baza variabilei de interogare',
+            title: 'Automat',
+          },
+          manual: {
+            subTitle: 'Ad膬uga葲i manual condi葲ii de filtrare a metadatelor',
+            title: 'Manual',
+          },
+        },
+        panel: {
+          conditions: 'Condi葲ii',
+          select: 'Selecta葲i variabila...',
+          title: 'Condi葲ii de filtrare a metadatelor',
+          add: 'Adaug膬 condi葲ie',
+          placeholder: 'Introduce葲i valoarea',
+          datePlaceholder: 'Alege o or膬...',
+          search: 'C膬utare metadate',
+        },
+        title: 'Filtrarea metadatelor',
+      },
+    },
+    http: {
+      inputVars: 'Variabile de intrare',
+      api: 'API',
+      apiPlaceholder: 'Introduce葲i URL-ul, tasta葲i 鈥�/鈥� pentru a insera variabil膬',
+      notStartWithHttp: 'API-ul trebuie s膬 卯nceap膬 cu http:// sau https://',
+      key: 'Cheie',
+      value: 'Valoare',
+      bulkEdit: 'Editare 卯n mas膬',
+      keyValueEdit: 'Editare cheie-valoare',
+      headers: 'Antete',
+      params: 'Parametri',
+      body: 'Corp',
+      outputVars: {
+        body: 'Con葲inutul r膬spunsului',
+        statusCode: 'Cod de stare al r膬spunsului',
+        headers: 'Lista antetelor de r膬spuns 卯n format JSON',
+        files: 'Lista fi葯ierelor',
+      },
+      authorization: {
+        'authorization': 'Autorizare',
+        'authorizationType': 'Tip de autorizare',
+        'no-auth': 'Niciuna',
+        'api-key': 'Cheie API',
+        'auth-type': 'Tip de autentificare',
+        'basic': 'De baz膬',
+        'bearer': 'Bearer',
+        'custom': 'Personalizat',
+        'api-key-title': 'Cheie API',
+        'header': 'Antet',
+      },
+      insertVarPlaceholder: 'tasta葲i \'/\' pentru a insera variabil膬',
+      timeout: {
+        title: 'Timp limit膬',
+        connectLabel: 'Timp limit膬 pentru conexiune',
+        connectPlaceholder: 'Introduce葲i timpul limit膬 pentru conexiune 卯n secunde',
+        readLabel: 'Timp limit膬 pentru citire',
+        readPlaceholder: 'Introduce葲i timpul limit膬 pentru citire 卯n secunde',
+        writeLabel: 'Timp limit膬 pentru scriere',
+        writePlaceholder: 'Introduce葲i timpul limit膬 pentru scriere 卯n secunde',
+      },
+      type: 'Tip',
+      binaryFileVariable: 'Variabil膬 de fi葯ier binar',
+      extractListPlaceholder: 'Introduce葲i indexul elementelor din list膬, tasta葲i "/" insera葲i variabila',
+      curl: {
+        placeholder: 'Lipi葲i 葯irul cURL aici',
+        title: 'Importa葲i din cURL',
+      },
+    },
+    code: {
+      inputVars: 'Variabile de intrare',
+      outputVars: 'Variabile de ie葯ire',
+      advancedDependencies: 'Dependen葲e avansate',
+      advancedDependenciesTip: 'Ad膬uga葲i c芒teva dependen葲e pre卯nc膬rcate care necesit膬 mai mult timp pentru a consuma sau nu sunt integrate implicit aici',
+      searchDependencies: 'C膬uta葲i dependen葲e',
+    },
+    templateTransform: {
+      inputVars: 'Variabile de intrare',
+      code: 'Cod',
+      codeSupportTip: 'Suport膬 doar Jinja2',
+      outputVars: {
+        output: 'Con葲inut transformat',
+      },
+    },
+    ifElse: {
+      if: 'Dac膬',
+      else: 'Altminteri',
+      elseDescription: 'Utilizat pentru a defini logica care ar trebui executat膬 atunci c芒nd condi葲ia if nu este 卯ndeplinit膬.',
+      and: '葯i',
+      or: 'sau',
+      operator: 'Operator',
+      notSetVariable: 'V膬 rug膬m s膬 seta葲i mai 卯nt芒i variabila',
+      comparisonOperator: {
+        'contains': 'con葲ine',
+        'not contains': 'nu con葲ine',
+        'start with': '卯ncepe cu',
+        'end with': 'se termin膬 cu',
+        'is': 'este',
+        'is not': 'nu este',
+        'empty': 'este gol',
+        'not empty': 'nu este gol',
+        'null': 'este null',
+        'not null': 'nu este null',
+        'regex match': 'potrivire regex',
+        'in': '卯n',
+        'not in': 'nu 卯n',
+        'exists': 'Exist膬',
+        'all of': 'Toate',
+        'not exists': 'nu exist膬',
+        'before': '卯nainte',
+        'after': 'dup膬',
+      },
+      enterValue: 'Introduce葲i valoarea',
+      addCondition: 'Ad膬uga葲i condi葲ie',
+      conditionNotSetup: 'Condi葲ia NU este setat膬',
+      selectVariable: 'Selecta葲i variabila...',
+      optionName: {
+        audio: 'Audio',
+        localUpload: '脦nc膬rcare local膬',
+        url: 'Adresa URL',
+        image: 'Imagine',
+        video: 'Video',
+        doc: 'Doc',
+      },
+      select: 'Alege',
+      addSubVariable: 'Subvariabil膬',
+      condition: 'Condi葲ie',
+    },
+    variableAssigner: {
+      title: 'Atribuie variabile',
+      outputType: 'Tip de ie葯ire',
+      varNotSet: 'Variabila nu este setat膬',
+      noVarTip: 'Ad膬uga葲i variabilele de atribuit',
+      type: {
+        string: '葮ir',
+        number: 'Num膬r',
+        object: 'Obiect',
+        array: 'Array',
+      },
+      aggregationGroup: 'Grup de agregare',
+      aggregationGroupTip: 'Activarea acestei func葲ii permite agregatorului de variabile s膬 agrege mai multe seturi de variabile.',
+      addGroup: 'Ad膬uga葲i grup',
+      outputVars: {
+        varDescribe: 'Ie葯ire {{groupName}}',
+      },
+      setAssignVariable: 'Seta葲i variabila de atribuire',
+    },
+    assigner: {
+      'assignedVariable': 'Variabil膬 Atribuit膬',
+      'writeMode': 'Mod de Scriere',
+      'writeModeTip': 'C芒nd VARIABILA ATRIBUIT膫 este un array, modul de ad膬ugare adaug膬 la sf芒r葯it.',
+      'over-write': 'Suprascrie',
+      'append': 'Adaug膬',
+      'plus': 'Plus',
+      'clear': '葮terge',
+      'setVariable': 'Seteaz膬 Variabila',
+      'variable': 'Variabil膬',
+      'operations': {
+        'append': 'Ad膬uga牛i',
+        'extend': 'Prelungi',
+        'title': 'Opera葲ie',
+        '+=': '+=',
+        'set': 'Apus',
+        '*=': '*=',
+        'overwrite': 'Suprascrie',
+        'clear': 'Clar',
+        'over-write': 'Suprascrie',
+        '/=': '/=',
+        '-=': '-=',
+        'remove-first': '脦ndep膬rteaz膬 primul',
+        'remove-last': '脦ndep膬rteaz膬 ultimul',
+      },
+      'selectAssignedVariable': 'Selecta葲i variabila atribuit膬...',
+      'varNotSet': 'Variabila NU este setat膬',
+      'noVarTip': 'Face葲i clic pe butonul "+" pentru a ad膬uga variabile',
+      'noAssignedVars': 'Nu exist膬 variabile atribuite disponibile',
+      'setParameter': 'Seta葲i parametrul...',
+      'assignedVarsDescription': 'Variabilele atribuite trebuie s膬 fie variabile inscrip葲ionabile, cum ar fi variabilele de conversa葲ie.',
+      'variables': 'Variabile',
+    },
+    tool: {
+      toAuthorize: 'Autoriza葲i',
+      inputVars: 'Variabile de intrare',
+      outputVars: {
+        text: 'con葲inut generat de instrument',
+        files: {
+          title: 'fi葯iere generate de instrument',
+          type: 'Tip de suport. Acum accept膬 doar imagine',
+          transfer_method: 'Metod膬 de transfer. Valoarea este remote_url sau local_file',
+          url: 'URL imagine',
+          upload_file_id: 'ID fi葯ier 卯nc膬rcat',
+        },
+        json: 'JSON generat de instrument',
+      },
+    },
+    questionClassifiers: {
+      model: 'model',
+      inputVars: 'Variabile de intrare',
+      outputVars: {
+        className: 'Nume clas膬',
+      },
+      class: 'Clas膬',
+      classNamePlaceholder: 'Scrie葲i numele clasei',
+      advancedSetting: 'Setare avansat膬',
+      topicName: 'Nume subiect',
+      topicPlaceholder: 'Scrie葲i numele subiectului',
+      addClass: 'Ad膬uga葲i clas膬',
+      instruction: 'Instruc葲iune',
+      instructionTip: 'Introduce葲i instruc葲iuni suplimentare pentru a ajuta clasificatorul de 卯ntreb膬ri s膬 卯n葲eleag膬 mai bine cum s膬 categorizeze 卯ntreb膬rile.',
+      instructionPlaceholder: 'Scrie葲i instruc葲iunea',
+    },
+    parameterExtractor: {
+      inputVar: 'Variabil膬 de intrare',
+      extractParameters: 'Extrage葲i parametrii',
+      importFromTool: 'Import膬 din instrumente',
+      addExtractParameter: 'Ad膬uga葲i parametru de extragere',
+      addExtractParameterContent: {
+        name: 'Nume',
+        namePlaceholder: 'Nume parametru de extragere',
+        type: 'Tip',
+        typePlaceholder: 'Tip parametru de extragere',
+        description: 'Descriere',
+        descriptionPlaceholder: 'Descriere parametru de extragere',
+        required: 'Necesar',
+        requiredContent: 'Necesar este utilizat doar ca referin葲膬 pentru inferen葲a modelului 葯i nu pentru validarea obligatorie a ie葯irii parametrului.',
+      },
+      extractParametersNotSet: 'Parametrii de extragere nu sunt seta葲i',
+      instruction: 'Instruc葲iune',
+      instructionTip: 'Introduce葲i instruc葲iuni suplimentare pentru a ajuta extractorul de parametri s膬 卯n葲eleag膬 cum s膬 extrag膬 parametrii.',
+      advancedSetting: 'Setare avansat膬',
+      reasoningMode: 'Mod de ra葲ionament',
+      reasoningModeTip: 'Pute葲i alege modul de ra葲ionament potrivit 卯n func葲ie de capacitatea modelului de a r膬spunde la instruc葲iuni pentru apelarea func葲iilor sau prompturi.',
+      isSuccess: 'Este succes. 脦n caz de succes valoarea este 1, 卯n caz de e葯ec valoarea este 0.',
+      errorReason: 'Motivul erorii',
+    },
+    iteration: {
+      deleteTitle: '葮terge葲i nodul de itera葲ie?',
+      deleteDesc: '葮tergerea nodului de itera葲ie va 葯terge toate nodurile copil',
+      input: 'Intrare',
+      output: 'Variabile de ie葯ire',
+      iteration_one: '{{count}} Itera葲ie',
+      iteration_other: '{{count}} Itera葲ii',
+      currentIteration: 'Itera葲ie curent膬',
+      ErrorMethod: {
+        operationTerminated: '脦ncheiat膬',
+        continueOnError: 'continuare-la-eroare',
+        removeAbnormalOutput: 'elimin膬-ie葯ire-anormal膬',
+      },
+      parallelModeEnableTitle: 'Modul paralel activat',
+      errorResponseMethod: 'Metoda de r膬spuns la eroare',
+      comma: ',',
+      parallelModeEnableDesc: '脦n modul paralel, sarcinile din itera葲ii accept膬 execu葲ia paralel膬. Pute葲i configura acest lucru 卯n panoul de propriet膬葲i din dreapta.',
+      parallelModeUpper: 'MOD PARALEL',
+      MaxParallelismTitle: 'Paralelism maxim',
+      parallelMode: 'Mod paralel',
+      error_other: '{{num膬r}} Erori',
+      error_one: '{{num膬r}} Eroare',
+      parallelPanelDesc: '脦n modul paralel, activit膬葲ile din itera葲ie accept膬 execu葲ia paralel膬.',
+      MaxParallelismDesc: 'Paralelismul maxim este utilizat pentru a controla num膬rul de sarcini executate simultan 卯ntr-o singur膬 itera葲ie.',
+      answerNodeWarningDesc: 'Avertisment modul paralel: Nodurile de r膬spuns, atribuirea variabilelor de conversa葲ie 葯i opera葲iunile persistente de citire/scriere 卯n itera葲ii pot cauza excep葲ii.',
+    },
+    note: {
+      editor: {
+        small: 'Mic',
+        bold: '脦ndr膬zne葲',
+        unlink: 'Deconecta',
+        strikethrough: 'T膬iere',
+        invalidUrl: 'URL nevalid膬',
+        medium: 'Medie',
+        openLink: 'Deschide',
+        large: 'Mare',
+        enterUrl: 'Introduce葲i adresa URL...',
+        italic: 'Cursiv',
+        placeholder: 'Scrie-葲i noti葲a...',
+        link: 'Leg膬tur膬',
+        bulletList: 'Lista de marcatori',
+        showAuthor: 'Afi葯a葲i autorul',
+      },
+      addNote: 'Ad膬uga葲i o not膬',
+    },
+    docExtractor: {
+      outputVars: {
+        text: 'Text extras',
+      },
+      inputVar: 'Variabil膬 de intrare',
+      learnMore: 'Afl膬 mai multe',
+      supportFileTypes: 'Tipuri de fi葯iere de suport: {{types}}.',
+    },
+    listFilter: {
+      outputVars: {
+        first_record: 'Primul record',
+        last_record: 'Ultima 卯nregistrare',
+        result: 'Filtreaz膬 rezultatul',
+      },
+      desc: 'DESC',
+      inputVar: 'Variabil膬 de intrare',
+      filterConditionKey: 'Tasta de condi葲ie a filtrului',
+      filterCondition: 'Starea filtrului',
+      orderBy: 'Comand膬 dup膬',
+      selectVariableKeyPlaceholder: 'Selecta葲i tasta subvariabil膬',
+      filterConditionComparisonOperator: 'Operator de comparare a condi葲iilor filtrului',
+      limit: 'N de sus',
+      filterConditionComparisonValue: 'Valoare Stare filtrare',
+      asc: 'ASC',
+      extractsCondition: 'Extrage葲i elementul N',
+    },
+    agent: {
+      strategy: {
+        configureTip: 'V膬 rug膬m s膬 configura葲i strategia agentic膬.',
+        selectTip: 'Selecta葲i strategia agentic膬',
+        configureTipDesc: 'Dup膬 configurarea strategiei agentice, acest nod va 卯nc膬rca automat configura葲iile r膬mase. Strategia va afecta mecanismul ra葲ionamentului instrumentelor 卯n mai mul葲i pa葯i.',
+        shortLabel: 'Strategie',
+        label: 'Strategia agentic膬',
+        tooltip: 'Diferitele strategii agentice determin膬 modul 卯n care sistemul planific膬 葯i execut膬 apelurile de instrumente 卯n mai mul葲i pa葯i',
+        searchPlaceholder: 'Strategie agentic膬 de c膬utare',
+      },
+      pluginInstaller: {
+        installing: 'Instalarea',
+        install: 'Instala',
+      },
+      modelNotInMarketplace: {
+        manageInPlugins: 'Gestiona葲i 卯n pluginuri',
+        title: 'Model neinstalat',
+        desc: 'Acest model este instalat din depozitul local sau GitHub. V膬 rug膬m s膬 utiliza葲i dup膬 instalare.',
+      },
+      modelNotSupport: {
+        descForVersionSwitch: 'Versiunea de plugin instalat膬 nu ofer膬 acest model. Face葲i clic pentru a comuta versiunea.',
+        desc: 'Versiunea de plugin instalat膬 nu ofer膬 acest model.',
+        title: 'Model neacceptat',
+      },
+      modelSelectorTooltips: {
+        deprecated: 'Acest model este 卯nvechit',
+      },
+      outputVars: {
+        files: {
+          upload_file_id: '脦nc膬rca葲i ID-ul fi葯ierului',
+          type: 'Tip de suport. Acum accept膬 doar imaginea',
+          transfer_method: 'Metoda de transfer. Valoarea este remote_url sau local_file',
+          title: 'Fi葯iere generate de agent',
+          url: 'Adresa URL a imaginii',
+        },
+        text: 'Con葲inut generat de agent',
+        json: 'JSON generat de agent',
+      },
+      checkList: {
+        strategyNotSelected: 'Strategia neselectat膬',
+      },
+      installPlugin: {
+        install: 'Instala',
+        changelog: 'Jurnal de modific膬ri',
+        desc: 'Despre instalarea urm膬torului plugin',
+        title: 'Instaleaz膬 pluginul',
+        cancel: 'Anula',
+      },
+      pluginNotInstalled: 'Acest plugin nu este instalat',
+      unsupportedStrategy: 'Strategie neacceptat膬',
+      notAuthorized: 'Neautorizat',
+      learnMore: 'Afl膬 mai multe',
+      toolbox: 'cutie de scule',
+      toolNotAuthorizedTooltip: '{{instrument}} Neautorizat',
+      strategyNotSet: 'Strategia agentic膬 nu este setat膬',
+      tools: 'Instrumente',
+      maxIterations: 'Itera葲ii maxime',
+      configureModel: 'Configura葲i modelul',
+      strategyNotFoundDescAndSwitchVersion: 'Versiunea de plugin instalat膬 nu ofer膬 aceast膬 strategie. Face葲i clic pentru a comuta versiunea.',
+      strategyNotInstallTooltip: '{{strategy}} nu este instalat',
+      pluginNotFoundDesc: 'Acest plugin este instalat de pe GitHub. V膬 rug膬m s膬 accesa葲i Pluginuri pentru a reinstala',
+      modelNotSelected: 'Model neselectat',
+      toolNotInstallTooltip: '{{tool}} nu este instalat',
+      pluginNotInstalledDesc: 'Acest plugin este instalat de pe GitHub. V膬 rug膬m s膬 accesa葲i Pluginuri pentru a reinstala',
+      strategyNotFoundDesc: 'Versiunea de plugin instalat膬 nu ofer膬 aceast膬 strategie.',
+      modelNotInstallTooltip: 'Acest model nu este instalat',
+      linkToPlugin: 'Link c膬tre pluginuri',
+      model: 'model',
+    },
+    loop: {
+      ErrorMethod: {
+        removeAbnormalOutput: 'Elimin膬 ie葯irea anormal膬',
+        continueOnError: 'Continua葲i 卯n caz de eroare',
+        operationTerminated: '脦ncetat',
+      },
+      inputMode: 'Mod de introducere',
+      currentLoopCount: 'Num膬rul curent de itera葲ii: {{count}}',
+      error_one: '{{count}} Eroare',
+      error_other: '{{count}} Erori',
+      input: 'Intrare',
+      errorResponseMethod: 'Metoda de R膬spuns la Erori',
+      deleteTitle: '葮terge nodul de ciclu?',
+      breakConditionTip: 'Numai variabilele din interiorul buclelor cu condi葲ii de terminare 葯i variabilele de conversa葲ie pot fi referite.',
+      loop_one: '{{count}} bucl膬',
+      loop_other: '{{count}} Bucl膬',
+      loopNode: 'Nod de bucl膬',
+      loopMaxCount: 'Num膬rul maxim de itera葲ii',
+      loopVariables: 'Variabile de bucl膬',
+      finalLoopVariables: 'Variabilele ciclului final',
+      currentLoop: 'Circuit Curent',
+      totalLoopCount: 'Num膬rul total de bucle: {{count}}',
+      output: 'Variabil膬 de ie葯ire',
+      exitConditionTip: 'Un nod de bucl膬 are nevoie de cel pu葲in o condi葲ie de ie葯ire.',
+      initialLoopVariables: 'Variabilele de loop ini葲iale',
+      setLoopVariables: 'Seta葲i variabilele 卯n cadrul buclei',
+      loopMaxCountError: 'V膬 rug膬m s膬 introduce葲i un num膬r maxim valid de bucle, care s膬 fie 卯ntre 1 葯i {{maxCount}}',
+      deleteDesc: '葮tergerea nodului bucl膬 va elimina toate nodurile copil.',
+      breakCondition: 'Condi葲ia de terminare a buclei',
+      comma: ',',
+      variableName: 'Nume Variabil',
+    },
+  },
+  tracing: {
+    stopBy: 'Oprit de {{user}}',
+  },
+  variableReference: {
+    noAvailableVars: 'Nu exist膬 variabile disponibile',
+    noVarsForOperation: 'Nu exist膬 variabile disponibile pentru atribuire cu opera葲iunea selectat膬.',
+    conversationVars: 'Variabile de conversa葲ie',
+    assignedVarsDescription: 'Variabilele atribuite trebuie s膬 fie variabile inscrip葲ionabile, cum ar fi',
+    noAssignedVars: 'Nu exist膬 variabile atribuite disponibile',
+  },
+  versionHistory: {
+    filter: {
+      all: 'Toate',
+      onlyYours: 'Numai al t膬u',
+      reset: 'Resetare filtrare',
+      onlyShowNamedVersions: 'Afi葯a葲i doar versiunile numite',
+      empty: 'Nu s-a g膬sit nicio istorie de versiune corespunz膬toare.',
+    },
+    editField: {
+      releaseNotesLengthLimit: 'Notele de eliberare nu pot dep膬葯i {{limit}} caractere',
+      title: 'Titlu',
+      titleLengthLimit: 'Titlul nu poate dep膬葯i {{limit}} caractere',
+      releaseNotes: 'Note de lansare',
+    },
+    action: {
+      restoreSuccess: 'Versiune restaurat膬',
+      deleteSuccess: 'Versiune 葯tears膬',
+      restoreFailure: 'Restaurarea versiunii a e葯uat',
+      deleteFailure: '葮tergerea versiunii a e葯uat',
+      updateSuccess: 'Versiune actualizat膬',
+      updateFailure: 'Actualizarea versiunii a e葯uat',
+    },
+    latest: 'Cea mai recent膬',
+    title: 'Versiuni',
+    nameThisVersion: 'Nume葯te aceast膬 versiune',
+    restorationTip: 'Dup膬 restaurarea versiunii, proiectul actual va fi suprascris.',
+    defaultName: 'Versiune f膬r膬 titlu',
+    editVersionInfo: 'Editeaz膬 informa葲iile versiunii',
+    releaseNotesPlaceholder: 'Descrie ce s-a schimbat',
+    deletionTip: '葮tergerea este irreversibil膬, v膬 rug膬m s膬 confirma葲i.',
+    currentDraft: 'Draftul curent',
+  },
+}
+
+export default translation
diff --git a/i18n/ru-RU/app-annotation.ts b/i18n/ru-RU/app-annotation.ts
new file mode 100644
index 0000000..18f2ae4
--- /dev/null
+++ b/i18n/ru-RU/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: '袗薪薪芯褌邪褑懈懈',
+  name: '袨褌胁械褌懈褌褜 薪邪 邪薪薪芯褌邪褑懈褞',
+  editBy: '袨褌胁械褌 芯褌褉械写邪泻褌懈褉芯胁邪薪 {{author}}',
+  noData: {
+    title: '袧械褌 邪薪薪芯褌邪褑懈泄',
+    description: '袙褘 屑芯卸械褌械 褉械写邪泻褌懈褉芯胁邪褌褜 邪薪薪芯褌邪褑懈懈 胁芯 胁褉械屑褟 芯褌谢邪写泻懈 锌褉懈谢芯卸械薪懈褟 懈谢懈 懈屑锌芯褉褌懈褉芯胁邪褌褜 懈褏 屑邪褋褋芯胁芯 蟹写械褋褜 写谢褟 锌芯谢褍褔械薪懈褟 泻邪褔械褋褌胁械薪薪芯谐芯 芯褌胁械褌邪.',
+  },
+  table: {
+    header: {
+      question: '胁芯锌褉芯褋',
+      answer: '芯褌胁械褌',
+      createdAt: '褋芯蟹写邪薪芯',
+      hits: '锌芯锌邪写邪薪懈泄',
+      actions: '写械泄褋褌胁懈褟',
+      addAnnotation: '袛芯斜邪胁懈褌褜 邪薪薪芯褌邪褑懈褞',
+      bulkImport: '袦邪褋褋芯胁褘泄 懈屑锌芯褉褌',
+      bulkExport: '袦邪褋褋芯胁褘泄 褝泻褋锌芯褉褌',
+      clearAll: '袨褔懈褋褌懈褌褜 胁褋械 邪薪薪芯褌邪褑懈懈',
+    },
+  },
+  editModal: {
+    title: '袪械写邪泻褌懈褉芯胁邪褌褜 芯褌胁械褌 邪薪薪芯褌邪褑懈懈',
+    queryName: '袟邪锌褉芯褋 锌芯谢褜蟹芯胁邪褌械谢褟',
+    answerName: 'Storyteller Bot',
+    yourAnswer: '袙邪褕 芯褌胁械褌',
+    answerPlaceholder: '袙胁械写懈褌械 胁邪褕 芯褌胁械褌 蟹写械褋褜',
+    yourQuery: '袙邪褕 蟹邪锌褉芯褋',
+    queryPlaceholder: '袙胁械写懈褌械 胁邪褕 蟹邪锌褉芯褋 蟹写械褋褜',
+    removeThisCache: '校写邪谢懈褌褜 褝褌褍 邪薪薪芯褌邪褑懈褞',
+    createdAt: '小芯蟹写邪薪芯',
+  },
+  addModal: {
+    title: '袛芯斜邪胁懈褌褜 芯褌胁械褌 邪薪薪芯褌邪褑懈懈',
+    queryName: '袙芯锌褉芯褋',
+    answerName: '袨褌胁械褌',
+    answerPlaceholder: '袙胁械写懈褌械 芯褌胁械褌 蟹写械褋褜',
+    queryPlaceholder: '袙胁械写懈褌械 胁芯锌褉芯褋 蟹写械褋褜',
+    createNext: '袛芯斜邪胁懈褌褜 械褖械 芯写懈薪 邪薪薪芯褌懈褉芯胁邪薪薪褘泄 芯褌胁械褌',
+  },
+  batchModal: {
+    title: '袦邪褋褋芯胁褘泄 懈屑锌芯褉褌',
+    csvUploadTitle: '袩械褉械褌邪褖懈褌械 褋褞写邪 胁邪褕 CSV-褎邪泄谢 懈谢懈 ',
+    browse: '胁褘斜械褉懈褌械 褎邪泄谢',
+    tip: 'CSV-褎邪泄谢 写芯谢卸械薪 褋芯芯褌胁械褌褋褌胁芯胁邪褌褜 褋谢械写褍褞褖械泄 褋褌褉褍泻褌褍褉械:',
+    question: '胁芯锌褉芯褋',
+    answer: '芯褌胁械褌',
+    contentTitle: '褋芯写械褉卸懈屑芯械 褎褉邪谐屑械薪褌邪',
+    content: '褋芯写械褉卸懈屑芯械',
+    template: '小泻邪褔邪褌褜 褕邪斜谢芯薪 蟹写械褋褜',
+    cancel: '袨褌屑械薪邪',
+    run: '袟邪锌褍褋褌懈褌褜 锌邪泻械褌',
+    runError: '袨褕懈斜泻邪 蟹邪锌褍褋泻邪 锌邪泻械褌邪',
+    processing: '袙 锌褉芯褑械褋褋械 锌邪泻械褌薪芯泄 芯斜褉邪斜芯褌泻懈',
+    completed: '袠屑锌芯褉褌 蟹邪胁械褉褕械薪',
+    error: '袨褕懈斜泻邪 懈屑锌芯褉褌邪',
+    ok: '袨袣',
+  },
+  errorMessage: {
+    answerRequired: '袨褌胁械褌 芯斜褟蟹邪褌械谢械薪',
+    queryRequired: '袙芯锌褉芯褋 芯斜褟蟹邪褌械谢械薪',
+  },
+  viewModal: {
+    annotatedResponse: '袨褌胁械褌 邪薪薪芯褌邪褑懈懈',
+    hitHistory: '袠褋褌芯褉懈褟 锌芯锌邪写邪薪懈泄',
+    hit: '袩芯锌邪写邪薪懈械',
+    hits: '袩芯锌邪写邪薪懈褟',
+    noHitHistory: '袧械褌 懈褋褌芯褉懈懈 锌芯锌邪写邪薪懈泄',
+  },
+  hitHistoryTable: {
+    query: '袟邪锌褉芯褋',
+    match: '小芯胁锌邪写械薪懈械',
+    response: '袨褌胁械褌',
+    source: '袠褋褌芯褔薪懈泻',
+    score: '袨褑械薪泻邪',
+    time: '袙褉械屑褟',
+  },
+  initSetup: {
+    title: '袧邪褔邪谢褜薪邪褟 薪邪褋褌褉芯泄泻邪 芯褌胁械褌邪 邪薪薪芯褌邪褑懈懈',
+    configTitle: '袧邪褋褌褉芯泄泻邪 芯褌胁械褌邪 邪薪薪芯褌邪褑懈懈',
+    confirmBtn: '小芯褏褉邪薪懈褌褜 懈 胁泻谢褞褔懈褌褜',
+    configConfirmBtn: '小芯褏褉邪薪懈褌褜',
+  },
+  embeddingModelSwitchTip: '袦芯写械谢褜 胁械泻褌芯褉懈蟹邪褑懈懈 褌械泻褋褌邪 邪薪薪芯褌邪褑懈泄, 锌械褉械泻谢褞褔械薪懈械 屑械卸写褍 屑芯写械谢褟屑懈 斜褍写械褌 芯褋褍褖械褋褌胁谢械薪芯 锌芯胁褌芯褉薪芯, 褔褌芯 锌褉懈胁械写械褌 泻 写芯锌芯谢薪懈褌械谢褜薪褘屑 蟹邪褌褉邪褌邪屑.',
+}
+
+export default translation
diff --git a/i18n/ru-RU/app-api.ts b/i18n/ru-RU/app-api.ts
new file mode 100644
index 0000000..5dfe5c8
--- /dev/null
+++ b/i18n/ru-RU/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'API 小械褉胁械褉',
+  apiKey: 'API 袣谢褞褔',
+  status: '小褌邪褌褍褋',
+  disabled: '袨褌泻谢褞褔械薪芯',
+  ok: '袙 褉邪斜芯褌械',
+  copy: '袣芯锌懈褉芯胁邪褌褜',
+  copied: '小泻芯锌懈褉芯胁邪薪芯',
+  play: '袟邪锌褍褋褌懈褌褜',
+  pause: '袩褉懈芯褋褌邪薪芯胁懈褌褜',
+  playing: '袟邪锌褍褖械薪芯',
+  loading: '袟邪谐褉褍蟹泻邪',
+  merMaid: {
+    rerender: '袩械褉械蟹邪锌褍褋褌懈褌褜 褉械薪写械褉懈薪谐',
+  },
+  never: '袧懈泻芯谐写邪',
+  apiKeyModal: {
+    apiSecretKey: '小械泻褉械褌薪褘泄 泻谢褞褔 API',
+    apiSecretKeyTips: '效褌芯斜褘 锌褉械写芯褌胁褉邪褌懈褌褜 蟹谢芯褍锌芯褌褉械斜谢械薪懈械 API, 蟹邪褖懈褌懈褌械 褋胁芯泄 API 泻谢褞褔. 袠蟹斜械谐邪泄褌械 懈褋锌芯谢褜蟹芯胁邪薪懈褟 械谐芯 胁 胁懈写械 plain-褌械泻褋褌邪 胁芯 褎褉芯薪褌械薪写-泻芯写械. :)',
+    createNewSecretKey: '小芯蟹写邪褌褜 薪芯胁褘泄 褋械泻褉械褌薪褘泄 泻谢褞褔',
+    secretKey: '小械泻褉械褌薪褘泄 泻谢褞褔',
+    created: '小袨袟袛袗袧',
+    lastUsed: '袩袨小袥袝袛袧袝袝 袠小袩袨袥鞋袟袨袙袗袧袠袝',
+    generateTips: '啸褉邪薪懈褌械 褝褌芯褌 泻谢褞褔 胁 斜械蟹芯锌邪褋薪芯屑 懈 写芯褋褌褍锌薪芯屑 屑械褋褌械.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: '校写邪谢懈褌褜 褝褌芯褌 褋械泻褉械褌薪褘泄 泻谢褞褔?',
+    deleteConfirmTips: '协褌芯 写械泄褋褌胁懈械 薪械芯斜褉邪褌懈屑芯.',
+    ok: '袨袣',
+  },
+  completionMode: {
+    title: 'API 锌褉懈谢芯卸械薪懈褟',
+    info: '袛谢褟 胁褘褋芯泻芯泻邪褔械褋褌胁械薪薪芯泄 谐械薪械褉邪褑懈懈 褌械泻褋褌邪, 褌邪泻芯泄 泻邪泻 褋褌邪褌褜懈, 褉械蟹褞屑械 懈 锌械褉械胁芯写褘, 懈褋锌芯谢褜蟹褍泄褌械 API completion-messages 褋 锌芯谢褜蟹芯胁邪褌械谢褜褋泻懈屑 胁胁芯写芯屑. 袚械薪械褉邪褑懈褟 褌械泻褋褌邪 芯褋薪芯胁邪薪邪 薪邪 锌邪褉邪屑械褌褉邪褏 屑芯写械谢懈 懈 褕邪斜谢芯薪邪褏 锌芯写褋泻邪蟹芯泻, 褍褋褌邪薪芯胁谢械薪薪褘褏 胁 Dify Prompt Engineering.',
+    createCompletionApi: '小芯蟹写邪褌褜 completion-message',
+    createCompletionApiTip: '小芯蟹写邪泄褌械 completion-message 写谢褟 锌芯写写械褉卸泻懈 褉械卸懈屑邪 胁芯锌褉芯褋芯胁 懈 芯褌胁械褌芯胁.',
+    inputsTips: '(袧械芯斜褟蟹邪褌械谢褜薪芯) 校泻邪卸懈褌械 锌芯谢褟 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯谐芯 胁胁芯写邪 胁 胁懈写械 锌邪褉 泻谢褞褔-蟹薪邪褔械薪懈械, 褋芯芯褌胁械褌褋褌胁褍褞褖懈褏 锌械褉械屑械薪薪褘屑 胁 Prompt Eng. 袣谢褞褔 - 褝褌芯 懈屑褟 锌械褉械屑械薪薪芯泄, 袟薪邪褔械薪懈械 - 褝褌芯 蟹薪邪褔械薪懈械 锌邪褉邪屑械褌褉邪. 袝褋谢懈 褌懈锌 锌芯谢褟 - 袙褘斜芯褉, 芯褌锌褉邪胁谢械薪薪芯械 袟薪邪褔械薪懈械 写芯谢卸薪芯 斜褘褌褜 芯写薪懈屑 懈蟹 锌褉械写褍褋褌邪薪芯胁谢械薪薪褘褏 胁邪褉懈邪薪褌芯胁.',
+    queryTips: '孝械泻褋褌芯胁芯械 褋芯写械褉卸懈屑芯械 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯谐芯 胁胁芯写邪.',
+    blocking: '袘谢芯泻懈褉褍褞褖懈泄 褌懈锌, 芯卸懈写邪械褌 蟹邪胁械褉褕械薪懈褟 胁褘锌芯谢薪械薪懈褟 懈 胁芯蟹胁褉邪褖邪械褌 褉械蟹褍谢褜褌邪褌褘. (袟邪锌褉芯褋褘 屑芯谐褍褌 斜褘褌褜 锌褉械褉胁邪薪褘, 械褋谢懈 锌褉芯褑械褋褋 写谢懈褌械谢褜薪褘泄)',
+    streaming: ' 袨褌胁械褌 胁 褉邪屑泻邪褏 锌芯褌芯泻邪. 袪械邪谢懈蟹邪褑懈褟 锌芯褌芯泻芯胁芯泄 锌械褉械写邪褔懈 芯褌胁械褌芯胁 薪邪 芯褋薪芯胁械 SSE (Server-Sent Events).',
+    messageFeedbackApi: '袨斜褉邪褌薪邪褟 褋胁褟蟹褜 锌芯 褋芯芯斜褖械薪懈褞 (谢邪泄泻)',
+    messageFeedbackApiTip: '袨褑械薪懈褌械 锌芯谢褍褔械薪薪褘械 褋芯芯斜褖械薪懈褟 芯褌 懈屑械薪懈 泻芯薪械褔薪褘褏 锌芯谢褜蟹芯胁邪褌械谢械泄 褋 锌芯屑芯褖褜褞 谢邪泄泻芯胁 懈谢懈 写懈蟹谢邪泄泻芯胁. 协褌懈 写邪薪薪褘械 胁懈写薪褘 薪邪 褋褌褉邪薪懈褑械 袞褍褉薪邪谢褘 懈 邪薪薪芯褌邪褑懈懈 懈 懈褋锌芯谢褜蟹褍褞褌褋褟 写谢褟 斜褍写褍褖械泄 褌芯薪泻芯泄 薪邪褋褌褉芯泄泻懈 屑芯写械谢懈.',
+    messageIDTip: '袠写械薪褌懈褎懈泻邪褌芯褉 褋芯芯斜褖械薪懈褟',
+    ratingTip: '谢邪泄泻 懈谢懈 写懈蟹谢邪泄泻, null - 芯褌屑械薪邪',
+    parametersApi: '袩芯谢褍褔懈褌褜 懈薪褎芯褉屑邪褑懈褞 芯 锌邪褉邪屑械褌褉邪褏 锌褉懈谢芯卸械薪懈褟',
+    parametersApiTip: '袩芯谢褍褔懈褌褜 薪邪褋褌褉芯械薪薪褘械 胁褏芯写薪褘械 锌邪褉邪屑械褌褉褘, 胁泻谢褞褔邪褟 懈屑械薪邪 锌械褉械屑械薪薪褘褏, 懈屑械薪邪 锌芯谢械泄, 褌懈锌褘 懈 蟹薪邪褔械薪懈褟 锌芯 褍屑芯谢褔邪薪懈褞. 袨斜褘褔薪芯 懈褋锌芯谢褜蟹褍械褌褋褟 写谢褟 芯褌芯斜褉邪卸械薪懈褟 褝褌懈褏 锌芯谢械泄 胁 褎芯褉屑械 懈谢懈 蟹邪锌芯谢薪械薪懈褟 蟹薪邪褔械薪懈泄 锌芯 褍屑芯谢褔邪薪懈褞 锌芯褋谢械 蟹邪谐褉褍蟹泻懈 泻谢懈械薪褌邪.',
+  },
+  chatMode: {
+    title: 'API 锌褉懈谢芯卸械薪懈褟 褔邪褌邪',
+    info: '袛谢褟 褍薪懈胁械褉褋邪谢褜薪褘褏 写懈邪谢芯谐芯胁褘褏 锌褉懈谢芯卸械薪懈泄, 懈褋锌芯谢褜蟹褍褞褖懈褏 褎芯褉屑邪褌 胁芯锌褉芯褋芯胁 懈 芯褌胁械褌芯胁, 胁褘蟹芯胁懈褌械 API chat-messages, 褔褌芯斜褘 薪邪褔邪褌褜 写懈邪谢芯谐. 袩芯写写械褉卸懈胁邪泄褌械 褌械泻褍褖懈械 褉邪蟹谐芯胁芯褉褘, 锌械褉械写邪胁邪褟 胁芯蟹胁褉邪褖械薪薪褘泄 conversation_id. 袩邪褉邪屑械褌褉褘 芯褌胁械褌邪 懈 褕邪斜谢芯薪褘 蟹邪胁懈褋褟褌 芯褌 薪邪褋褌褉芯械泻 Dify Prompt Eng.',
+    createChatApi: '小芯蟹写邪褌褜 褋芯芯斜褖械薪懈械 褔邪褌邪',
+    createChatApiTip: '小芯蟹写邪泄褌械 薪芯胁芯械 褋芯芯斜褖械薪懈械 褉邪蟹谐芯胁芯褉邪 懈谢懈 锌褉芯写芯谢卸懈褌械 褋褍褖械褋褌胁褍褞褖懈泄 写懈邪谢芯谐.',
+    inputsTips: '(袧械芯斜褟蟹邪褌械谢褜薪芯) 校泻邪卸懈褌械 锌芯谢褟 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯谐芯 胁胁芯写邪 胁 胁懈写械 锌邪褉 泻谢褞褔-蟹薪邪褔械薪懈械, 褋芯芯褌胁械褌褋褌胁褍褞褖懈褏 锌械褉械屑械薪薪褘屑 胁 Prompt Eng. 袣谢褞褔 - 褝褌芯 懈屑褟 锌械褉械屑械薪薪芯泄, 袟薪邪褔械薪懈械 - 褝褌芯 蟹薪邪褔械薪懈械 锌邪褉邪屑械褌褉邪. 袝褋谢懈 褌懈锌 锌芯谢褟 - 袙褘斜芯褉, 芯褌锌褉邪胁谢械薪薪芯械 袟薪邪褔械薪懈械 写芯谢卸薪芯 斜褘褌褜 芯写薪懈屑 懈蟹 锌褉械写褍褋褌邪薪芯胁谢械薪薪褘褏 胁邪褉懈邪薪褌芯胁.',
+    queryTips: '小芯写械褉卸懈屑芯械 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯谐芯 胁胁芯写邪/胁芯锌褉芯褋邪',
+    blocking: '袘谢芯泻懈褉褍褞褖懈泄 褌懈锌, 芯卸懈写邪械褌 蟹邪胁械褉褕械薪懈褟 胁褘锌芯谢薪械薪懈褟 懈 胁芯蟹胁褉邪褖邪械褌 褉械蟹褍谢褜褌邪褌褘. (袟邪锌褉芯褋褘 屑芯谐褍褌 斜褘褌褜 锌褉械褉胁邪薪褘, 械褋谢懈 锌褉芯褑械褋褋 写谢懈褌械谢褜薪褘泄)',
+    streaming: '锌芯褌芯泻芯胁邪褟 锌械褉械写邪褔邪 胁芯蟹胁褉邪褖邪械褌. 袪械邪谢懈蟹邪褑懈褟 锌芯褌芯泻芯胁芯泄 锌械褉械写邪褔懈 胁芯蟹胁褉邪褌邪 薪邪 芯褋薪芯胁械 SSE (Server-Sent Events).',
+    conversationIdTip: '(袧械芯斜褟蟹邪褌械谢褜薪芯) 袠写械薪褌懈褎懈泻邪褌芯褉 褉邪蟹谐芯胁芯褉邪: 芯褋褌邪胁褜褌械 锌褍褋褌褘屑 写谢褟 锌械褉胁芯谐芯 褉邪蟹谐芯胁芯褉邪; 锌械褉械写邪泄褌械 conversation_id 懈蟹 泻芯薪褌械泻褋褌邪, 褔褌芯斜褘 锌褉芯写芯谢卸懈褌褜 写懈邪谢芯谐.',
+    messageFeedbackApi: '袨斜褉邪褌薪邪褟 褋胁褟蟹褜 泻芯薪械褔薪芯谐芯 锌芯谢褜蟹芯胁邪褌械谢褟 锌芯 褋芯芯斜褖械薪懈褞, 谢邪泄泻',
+    messageFeedbackApiTip: '袨褑械薪懈褌械 锌芯谢褍褔械薪薪褘械 褋芯芯斜褖械薪懈褟 芯褌 懈屑械薪懈 泻芯薪械褔薪褘褏 锌芯谢褜蟹芯胁邪褌械谢械泄 褋 锌芯屑芯褖褜褞 谢邪泄泻芯胁 懈谢懈 写懈蟹谢邪泄泻芯胁. 协褌懈 写邪薪薪褘械 胁懈写薪褘 薪邪 褋褌褉邪薪懈褑械 袞褍褉薪邪谢褘 懈 邪薪薪芯褌邪褑懈懈 懈 懈褋锌芯谢褜蟹褍褞褌褋褟 写谢褟 斜褍写褍褖械泄 褌芯薪泻芯泄 薪邪褋褌褉芯泄泻懈 屑芯写械谢懈.',
+    messageIDTip: '袠写械薪褌懈褎懈泻邪褌芯褉 褋芯芯斜褖械薪懈褟',
+    ratingTip: '谢邪泄泻 懈谢懈 写懈蟹谢邪泄泻, null - 芯褌屑械薪邪',
+    chatMsgHistoryApi: '袩芯谢褍褔懈褌褜 懈褋褌芯褉懈褞 褋芯芯斜褖械薪懈泄 褔邪褌邪',
+    chatMsgHistoryApiTip: '袩械褉胁邪褟 褋褌褉邪薪懈褑邪 胁芯蟹胁褉邪褖邪械褌 锌芯褋谢械写薪懈械 `limit` 褋褌褉芯泻, 泻芯褌芯褉褘械 薪邪褏芯写褟褌褋褟 胁 芯斜褉邪褌薪芯屑 锌芯褉褟写泻械.',
+    chatMsgHistoryConversationIdTip: '袠写械薪褌懈褎懈泻邪褌芯褉 褉邪蟹谐芯胁芯褉邪',
+    chatMsgHistoryFirstId: '袠写械薪褌懈褎懈泻邪褌芯褉 锌械褉胁芯泄 蟹邪锌懈褋懈 褔邪褌邪 薪邪 褌械泻褍褖械泄 褋褌褉邪薪懈褑械. 袩芯 褍屑芯谢褔邪薪懈褞 - 薪械褌.',
+    chatMsgHistoryLimit: '小泻芯谢褜泻芯 褔邪褌芯胁 胁芯蟹胁褉邪褖邪械褌褋褟 蟹邪 芯写懈薪 蟹邪锌褉芯褋',
+    conversationsListApi: '袩芯谢褍褔懈褌褜 褋锌懈褋芯泻 褉邪蟹谐芯胁芯褉芯胁',
+    conversationsListApiTip: '袩芯谢褍褔邪械褌 褋锌懈褋芯泻 褋械邪薪褋芯胁 褌械泻褍褖械谐芯 锌芯谢褜蟹芯胁邪褌械谢褟. 袩芯 褍屑芯谢褔邪薪懈褞 胁芯蟹胁褉邪褖邪褞褌褋褟 锌芯褋谢械写薪懈械 20 褋械邪薪褋芯胁.',
+    conversationsListFirstIdTip: '袠写械薪褌懈褎懈泻邪褌芯褉 锌芯褋谢械写薪械泄 蟹邪锌懈褋懈 薪邪 褌械泻褍褖械泄 褋褌褉邪薪懈褑械, 锌芯 褍屑芯谢褔邪薪懈褞 - 薪械褌.',
+    conversationsListLimitTip: '小泻芯谢褜泻芯 褔邪褌芯胁 胁芯蟹胁褉邪褖邪械褌褋褟 蟹邪 芯写懈薪 蟹邪锌褉芯褋',
+    conversationRenamingApi: '袩械褉械懈屑械薪芯胁邪薪懈械 褉邪蟹谐芯胁芯褉邪',
+    conversationRenamingApiTip: '袩械褉械懈屑械薪芯胁邪褌褜 褉邪蟹谐芯胁芯褉褘; 懈屑褟 芯褌芯斜褉邪卸邪械褌褋褟 胁 屑薪芯谐芯褋械褋褋懈芯薪薪褘褏 泻谢懈械薪褌褋泻懈褏 懈薪褌械褉褎械泄褋邪褏.',
+    conversationRenamingNameTip: '袧芯胁芯械 懈屑褟',
+    parametersApi: '袩芯谢褍褔懈褌褜 懈薪褎芯褉屑邪褑懈褞 芯 锌邪褉邪屑械褌褉邪褏 锌褉懈谢芯卸械薪懈褟',
+    parametersApiTip: '袩芯谢褍褔懈褌褜 薪邪褋褌褉芯械薪薪褘械 胁褏芯写薪褘械 锌邪褉邪屑械褌褉褘, 胁泻谢褞褔邪褟 懈屑械薪邪 锌械褉械屑械薪薪褘褏, 懈屑械薪邪 锌芯谢械泄, 褌懈锌褘 懈 蟹薪邪褔械薪懈褟 锌芯 褍屑芯谢褔邪薪懈褞. 袨斜褘褔薪芯 懈褋锌芯谢褜蟹褍械褌褋褟 写谢褟 芯褌芯斜褉邪卸械薪懈褟 褝褌懈褏 锌芯谢械泄 胁 褎芯褉屑械 懈谢懈 蟹邪锌芯谢薪械薪懈褟 蟹薪邪褔械薪懈泄 锌芯 褍屑芯谢褔邪薪懈褞 锌芯褋谢械 蟹邪谐褉褍蟹泻懈 泻谢懈械薪褌邪.',
+  },
+  develop: {
+    requestBody: '孝械谢芯 蟹邪锌褉芯褋邪',
+    pathParams: '袩邪褉邪屑械褌褉褘 锌褍褌懈',
+    query: '袟邪锌褉芯褋',
+    toc: '小芯写械褉卸邪薪懈械',
+  },
+  regenerate: '袪械谐械薪械褉懈褉芯胁邪褌褜',
+}
+
+export default translation
diff --git a/i18n/ru-RU/app-debug.ts b/i18n/ru-RU/app-debug.ts
new file mode 100644
index 0000000..0381653
--- /dev/null
+++ b/i18n/ru-RU/app-debug.ts
@@ -0,0 +1,463 @@
+const translation = {
+  pageTitle: {
+    line1: 'PROMPT',
+    line2: 'Engineering',
+  },
+  orchestrate: '袨褉泻械褋褌褉邪褑懈褟',
+  promptMode: {
+    simple: '袩械褉械泻谢褞褔懈褌褜褋褟 胁 褝泻褋锌械褉褌薪褘泄 褉械卸懈屑 写谢褟 褉械写邪泻褌懈褉芯胁邪薪懈褟 胁褋械谐芯 袩袪袨袦袩孝袗',
+    advanced: '协泻褋锌械褉褌薪褘泄 褉械卸懈屑',
+    switchBack: '袩械褉械泻谢褞褔懈褌褜褋褟 芯斜褉邪褌薪芯',
+    advancedWarning: {
+      title: '袙褘 锌械褉械泻谢褞褔懈谢懈褋褜 胁 褝泻褋锌械褉褌薪褘泄 褉械卸懈屑, 懈 锌芯褋谢械 懈蟹屑械薪械薪懈褟 袩袪袨袦袩孝袗 胁褘 袧袝 小袦袨袞袝孝袝 胁械褉薪褍褌褜褋褟 胁 斜邪蟹芯胁褘泄 褉械卸懈屑.',
+      description: '袙 褝泻褋锌械褉褌薪芯屑 褉械卸懈屑械 胁褘 屑芯卸械褌械 褉械写邪泻褌懈褉芯胁邪褌褜 胁械褋褜 袩袪袨袦袩孝.',
+      learnMore: '校蟹薪邪褌褜 斜芯谢褜褕械',
+      ok: '袨袣',
+    },
+    operation: {
+      addMessage: '袛芯斜邪胁懈褌褜 褋芯芯斜褖械薪懈械',
+    },
+    contextMissing: '袨褌褋褍褌褋褌胁褍械褌 泻芯屑锌芯薪械薪褌 泻芯薪褌械泻褋褌邪, 褝褎褎械泻褌懈胁薪芯褋褌褜 锌褉芯屑锌褌邪 屑芯卸械褌 斜褘褌褜 薪械胁褘褋芯泻芯泄.',
+  },
+  operation: {
+    applyConfig: '袨锌褍斜谢懈泻芯胁邪褌褜',
+    resetConfig: '小斜褉芯褋懈褌褜',
+    debugConfig: '袨褌谢邪写泻邪',
+    addFeature: '袛芯斜邪胁懈褌褜 褎褍薪泻褑懈褞',
+    automatic: '小谐械薪械褉懈褉芯胁邪褌褜',
+    stopResponding: '袨褋褌邪薪芯胁懈褌褜 芯褌胁械褌',
+    agree: '谢邪泄泻',
+    disagree: '写懈蟹谢邪泄泻',
+    cancelAgree: '袨褌屑械薪懈褌褜 谢邪泄泻',
+    cancelDisagree: '袨褌屑械薪懈褌褜 写懈蟹谢邪泄泻',
+    userAction: '袩芯谢褜蟹芯胁邪褌械谢褜 ',
+  },
+  notSetAPIKey: {
+    title: '袣谢褞褔 锌芯褋褌邪胁褖懈泻邪 LLM 薪械 褍褋褌邪薪芯胁谢械薪',
+    trailFinished: '袩褉芯斜薪褘泄 锌械褉懈芯写 蟹邪泻芯薪褔械薪',
+    description: '袣谢褞褔 锌芯褋褌邪胁褖懈泻邪 LLM 薪械 褍褋褌邪薪芯胁谢械薪, 械谐芯 薪械芯斜褏芯写懈屑芯 褍褋褌邪薪芯胁懈褌褜 锌械褉械写 芯褌谢邪写泻芯泄.',
+    settingBtn: '袩械褉械泄褌懈 泻 薪邪褋褌褉芯泄泻邪屑',
+  },
+  trailUseGPT4Info: {
+    title: '袙 薪邪褋褌芯褟褖械械 胁褉械屑褟 薪械 锌芯写写械褉卸懈胁邪械褌褋褟 gpt-4',
+    description: '效褌芯斜褘 懈褋锌芯谢褜蟹芯胁邪褌褜 gpt-4, 锌芯卸邪谢褍泄褋褌邪, 褍褋褌邪薪芯胁懈褌械 API 泻谢褞褔.',
+  },
+  feature: {
+    groupChat: {
+      title: '校谢褍褔褕械薪懈械 褔邪褌邪',
+      description: '袛芯斜邪胁谢械薪懈械 薪邪褋褌褉芯械泻 锌褉械写胁邪褉懈褌械谢褜薪芯谐芯 褉邪蟹谐芯胁芯褉邪 写谢褟 锌褉懈谢芯卸械薪懈泄 屑芯卸械褌 褍谢褍褔褕懈褌褜 锌芯谢褜蟹芯胁邪褌械谢褜褋泻懈泄 芯锌褘褌.',
+    },
+    groupExperience: {
+      title: '校谢褍褔褕械薪懈械 芯锌褘褌邪',
+    },
+    conversationOpener: {
+      title: '袧邪褔邪谢褜薪芯械 褋芯芯斜褖械薪懈械',
+      description: '袙 褔邪褌-锌褉懈谢芯卸械薪懈懈 锌械褉胁芯械 锌褉械写谢芯卸械薪懈械, 泻芯褌芯褉芯械 袠袠 邪泻褌懈胁薪芯 谐芯胁芯褉懈褌 锌芯谢褜蟹芯胁邪褌械谢褞, 芯斜褘褔薪芯 懈褋锌芯谢褜蟹褍械褌褋褟 胁 泻邪褔械褋褌胁械 锌褉懈胁械褌褋褌胁懈褟.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: '袩芯褋谢械写褍褞褖懈械 胁芯锌褉芯褋褘',
+      description: '袧邪褋褌褉芯泄泻邪 锌褉械写谢芯卸械薪懈褟 褋谢械写褍褞褖懈褏 胁芯锌褉芯褋芯胁 屑芯卸械褌 褍谢褍褔褕懈褌褜 褔邪褌 写谢褟 锌芯谢褜蟹芯胁邪褌械谢械泄.',
+      resDes: '3 锌褉械写谢芯卸械薪懈褟 写谢褟 褋谢械写褍褞褖械谐芯 胁芯锌褉芯褋邪 锌芯谢褜蟹芯胁邪褌械谢褟.',
+      tryToAsk: '袩芯锌褉芯斜褍泄褌械 褋锌褉芯褋懈褌褜',
+    },
+    moreLikeThis: {
+      title: '袘芯谢褜褕械 锌芯褏芯卸械谐芯',
+      description: '小谐械薪械褉懈褉褍泄褌械 薪械褋泻芯谢褜泻芯 褌械泻褋褌芯胁 芯写薪芯胁褉械屑械薪薪芯, 邪 蟹邪褌械屑 芯褌褉械写邪泻褌懈褉褍泄褌械 懈 锌褉芯写芯谢卸邪泄褌械 谐械薪械褉懈褉芯胁邪褌褜',
+      generateNumTip: '袣芯谢懈褔械褋褌胁芯 谐械薪械褉懈褉褍械屑褘褏 泻邪卸写褘泄 褉邪蟹',
+      tip: '袠褋锌芯谢褜蟹芯胁邪薪懈械 褝褌芯泄 褎褍薪泻褑懈懈 锌褉懈胁械写械褌 泻 写芯锌芯谢薪懈褌械谢褜薪褘屑 褉邪褋褏芯写邪屑 褌芯泻械薪芯胁',
+    },
+    speechToText: {
+      title: '袩褉械芯斜褉邪蟹芯胁邪薪懈械 褉械褔懈 胁 褌械泻褋褌',
+      description: '袩芯褋谢械 胁泻谢褞褔械薪懈褟 胁褘 屑芯卸械褌械 懈褋锌芯谢褜蟹芯胁邪褌褜 谐芯谢芯褋芯胁芯泄 胁胁芯写.',
+      resDes: '袚芯谢芯褋芯胁芯泄 胁胁芯写 胁泻谢褞褔械薪',
+    },
+    textToSpeech: {
+      title: '袩褉械芯斜褉邪蟹芯胁邪薪懈械 褌械泻褋褌邪 胁 褉械褔褜',
+      description: '袩芯褋谢械 胁泻谢褞褔械薪懈褟 褌械泻褋褌 屑芯卸薪芯 锌褉械芯斜褉邪蟹芯胁邪褌褜 胁 褉械褔褜.',
+      resDes: '袩褉械芯斜褉邪蟹芯胁邪薪懈械 褌械泻褋褌邪 胁 邪褍写懈芯 胁泻谢褞褔械薪芯',
+    },
+    citation: {
+      title: '笑懈褌邪褌褘 懈 褋褋褘谢泻懈',
+      description: '袩芯褋谢械 胁泻谢褞褔械薪懈褟 芯褌芯斜褉邪卸邪械褌褋褟 懈褋褏芯写薪褘泄 写芯泻褍屑械薪褌 懈 邪褌褉懈斜褍褌懈褉芯胁邪薪薪邪褟 褔邪褋褌褜 褋谐械薪械褉懈褉芯胁邪薪薪芯谐芯 泻芯薪褌械薪褌邪.',
+      resDes: '笑懈褌邪褌褘 懈 褋褋褘谢泻懈 胁泻谢褞褔械薪褘',
+    },
+    annotation: {
+      title: '袨褌胁械褌 邪薪薪芯褌邪褑懈懈',
+      description: '袙褘 屑芯卸械褌械 胁褉褍褔薪褍褞 写芯斜邪胁懈褌褜 胁褘褋芯泻芯泻邪褔械褋褌胁械薪薪褘泄 芯褌胁械褌 胁 泻褝褕 写谢褟 锌褉懈芯褉懈褌械褌薪芯谐芯 褋芯锌芯褋褌邪胁谢械薪懈褟 褋 锌芯褏芯卸懈屑懈 胁芯锌褉芯褋邪屑懈 锌芯谢褜蟹芯胁邪褌械谢械泄.',
+      resDes: '袨褌胁械褌 邪薪薪芯褌邪褑懈懈 胁泻谢褞褔械薪',
+      scoreThreshold: {
+        title: '袩芯褉芯谐 芯褑械薪泻懈',
+        description: '袠褋锌芯谢褜蟹褍械褌褋褟 写谢褟 褍褋褌邪薪芯胁泻懈 锌芯褉芯谐邪 褋褏芯写褋褌胁邪 写谢褟 芯褌胁械褌邪 邪薪薪芯褌邪褑懈懈.',
+        easyMatch: '袩褉芯褋褌芯械 褋芯胁锌邪写械薪懈械',
+        accurateMatch: '孝芯褔薪芯械 褋芯胁锌邪写械薪懈械',
+      },
+      matchVariable: {
+        title: '袩械褉械屑械薪薪邪褟 褋芯芯褌胁械褌褋褌胁懈褟',
+        choosePlaceholder: '袙褘斜械褉懈褌械 锌械褉械屑械薪薪褍褞 褋芯芯褌胁械褌褋褌胁懈褟',
+      },
+      cacheManagement: '袗薪薪芯褌邪褑懈懈',
+      cached: '袗薪薪芯褌懈褉芯胁邪薪芯',
+      remove: '校写邪谢懈褌褜',
+      removeConfirm: '校写邪谢懈褌褜 褝褌褍 邪薪薪芯褌邪褑懈褞?',
+      add: '袛芯斜邪胁懈褌褜 邪薪薪芯褌邪褑懈褞',
+      edit: '袪械写邪泻褌懈褉芯胁邪褌褜 邪薪薪芯褌邪褑懈褞',
+    },
+    dataSet: {
+      title: '袣芯薪褌械泻褋褌',
+      noData: '袙褘 屑芯卸械褌械 懈屑锌芯褉褌懈褉芯胁邪褌褜 蟹薪邪薪懈褟 胁 泻邪褔械褋褌胁械 泻芯薪褌械泻褋褌邪',
+      words: '小谢芯胁邪',
+      textBlocks: '孝械泻褋褌芯胁褘械 斜谢芯泻懈',
+      selectTitle: '袙褘斜械褉懈褌械 褋锌褉邪胁芯褔薪褘械 蟹薪邪薪懈褟',
+      selected: '袟薪邪薪懈褟 胁褘斜褉邪薪褘',
+      noDataSet: '袟薪邪薪懈褟 薪械 薪邪泄写械薪褘',
+      toCreate: '袩械褉械泄褌懈 泻 褋芯蟹写邪薪懈褞',
+      notSupportSelectMulti: '袙 薪邪褋褌芯褟褖械械 胁褉械屑褟 锌芯写写械褉卸懈胁邪褞褌褋褟 褌芯谢褜泻芯 芯写薪懈 蟹薪邪薪懈褟',
+      queryVariable: {
+        title: '袩械褉械屑械薪薪邪褟 蟹邪锌褉芯褋邪',
+        tip: '协褌邪 锌械褉械屑械薪薪邪褟 斜褍写械褌 懈褋锌芯谢褜蟹芯胁邪褌褜褋褟 胁 泻邪褔械褋褌胁械 胁褏芯写薪褘褏 写邪薪薪褘褏 蟹邪锌褉芯褋邪 写谢褟 锌芯懈褋泻邪 泻芯薪褌械泻褋褌邪, 锌芯谢褍褔邪褟 懈薪褎芯褉屑邪褑懈褞 芯 泻芯薪褌械泻褋褌械, 褋胁褟蟹邪薪薪褍褞 褋 胁胁芯写芯屑 褝褌芯泄 锌械褉械屑械薪薪芯泄.',
+        choosePlaceholder: '袙褘斜械褉懈褌械 锌械褉械屑械薪薪褍褞 蟹邪锌褉芯褋邪',
+        noVar: '袧械褌 锌械褉械屑械薪薪褘褏',
+        noVarTip: '锌芯卸邪谢褍泄褋褌邪, 褋芯蟹写邪泄褌械 锌械褉械屑械薪薪褍褞 胁 褉邪蟹写械谢械 袩械褉械屑械薪薪褘械',
+        unableToQueryDataSet: '袧械胁芯蟹屑芯卸薪芯 蟹邪锌褉芯褋懈褌褜 蟹薪邪薪懈褟',
+        unableToQueryDataSetTip: '袧械 褍写邪谢芯褋褜 褍褋锌械褕薪芯 蟹邪锌褉芯褋懈褌褜 蟹薪邪薪懈褟, 锌芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 锌械褉械屑械薪薪褍褞 蟹邪锌褉芯褋邪 泻芯薪褌械泻褋褌邪 胁 褉邪蟹写械谢械 泻芯薪褌械泻褋褌邪.',
+        ok: '袨袣',
+        contextVarNotEmpty: '锌械褉械屑械薪薪邪褟 蟹邪锌褉芯褋邪 泻芯薪褌械泻褋褌邪 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌芯泄',
+        deleteContextVarTitle: '校写邪谢懈褌褜 锌械褉械屑械薪薪褍褞 "{{varName}}"?',
+        deleteContextVarTip: '协褌邪 锌械褉械屑械薪薪邪褟 斜褘谢邪 褍褋褌邪薪芯胁谢械薪邪 胁 泻邪褔械褋褌胁械 锌械褉械屑械薪薪芯泄 蟹邪锌褉芯褋邪 泻芯薪褌械泻褋褌邪, 懈 械械 褍写邪谢械薪懈械 锌芯胁谢懈褟械褌 薪邪 薪芯褉屑邪谢褜薪芯械 懈褋锌芯谢褜蟹芯胁邪薪懈械 蟹薪邪薪懈泄. 袝褋谢懈 胁邪屑 胁褋械 械褖械 薪褍卸薪芯 褍写邪谢懈褌褜 械械, 锌芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 械械 蟹邪薪芯胁芯 胁 褉邪蟹写械谢械 泻芯薪褌械泻褋褌邪.',
+      },
+    },
+    tools: {
+      title: '袠薪褋褌褉褍屑械薪褌褘',
+      tips: '袠薪褋褌褉褍屑械薪褌褘 锌褉械写芯褋褌邪胁谢褟褞褌 褋褌邪薪写邪褉褌薪褘泄 屑械褌芯写 胁褘蟹芯胁邪 API, 锌褉懈薪懈屑邪褟 锌芯谢褜蟹芯胁邪褌械谢褜褋泻懈泄 胁胁芯写 懈谢懈 锌械褉械屑械薪薪褘械 胁 泻邪褔械褋褌胁械 锌邪褉邪屑械褌褉芯胁 蟹邪锌褉芯褋邪 写谢褟 蟹邪锌褉芯褋邪 胁薪械褕薪懈褏 写邪薪薪褘褏 胁 泻邪褔械褋褌胁械 泻芯薪褌械泻褋褌邪.',
+      toolsInUse: '{{count}} 懈薪褋褌褉褍屑械薪褌芯胁 懈褋锌芯谢褜蟹褍械褌褋褟',
+      modal: {
+        title: '袠薪褋褌褉褍屑械薪褌',
+        toolType: {
+          title: '孝懈锌 懈薪褋褌褉褍屑械薪褌邪',
+          placeholder: '袩芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 褌懈锌 懈薪褋褌褉褍屑械薪褌邪',
+        },
+        name: {
+          title: '袠屑褟',
+          placeholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 懈屑褟',
+        },
+        variableName: {
+          title: '袠屑褟 锌械褉械屑械薪薪芯泄',
+          placeholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 懈屑褟 锌械褉械屑械薪薪芯泄',
+        },
+      },
+    },
+    conversationHistory: {
+      title: '袠褋褌芯褉懈褟 褉邪蟹谐芯胁芯褉芯胁',
+      description: '校褋褌邪薪芯胁懈褌褜 锌褉械褎懈泻褋褘 懈屑械薪 写谢褟 褉芯谢械泄 褉邪蟹谐芯胁芯褉邪',
+      tip: '袠褋褌芯褉懈褟 褉邪蟹谐芯胁芯褉芯胁 薪械 胁泻谢褞褔械薪邪, 锌芯卸邪谢褍泄褋褌邪, 写芯斜邪胁褜褌械 <histories> 胁 锌褉芯屑锌褌 胁褘褕械.',
+      learnMore: '校蟹薪邪褌褜 斜芯谢褜褕械',
+      editModal: {
+        title: '袪械写邪泻褌懈褉芯胁邪褌褜 懈屑械薪邪 褉芯谢械泄 褉邪蟹谐芯胁芯褉邪',
+        userPrefix: '袩褉械褎懈泻褋 锌芯谢褜蟹芯胁邪褌械谢褟',
+        assistantPrefix: '袩褉械褎懈泻褋 锌芯屑芯褖薪懈泻邪',
+      },
+    },
+    toolbox: {
+      title: '袧袗袘袨袪 袠袧小孝袪校袦袝袧孝袨袙',
+    },
+    moderation: {
+      title: '袦芯写械褉邪褑懈褟 泻芯薪褌械薪褌邪',
+      description: '袨斜械褋锌械褔褜褌械 斜械蟹芯锌邪褋薪芯褋褌褜 胁褘褏芯写薪褘褏 写邪薪薪褘褏 屑芯写械谢懈, 懈褋锌芯谢褜蟹褍褟 API 屑芯写械褉邪褑懈懈 懈谢懈 锌芯写写械褉卸懈胁邪褟 褋锌懈褋芯泻 褔褍胁褋褌胁懈褌械谢褜薪褘褏 褋谢芯胁.',
+      allEnabled: '袙啸袨袛袧袨袡/袙蝎啸袨袛袧袨袡 泻芯薪褌械薪褌 胁泻谢褞褔械薪',
+      inputEnabled: '袙啸袨袛袧袨袡 泻芯薪褌械薪褌 胁泻谢褞褔械薪',
+      outputEnabled: '袙蝎啸袨袛袧袨袡 泻芯薪褌械薪褌 胁泻谢褞褔械薪',
+      modal: {
+        title: '袧邪褋褌褉芯泄泻懈 屑芯写械褉邪褑懈懈 泻芯薪褌械薪褌邪',
+        provider: {
+          title: '袩芯褋褌邪胁褖懈泻',
+          openai: '袦芯写械褉邪褑懈褟 OpenAI',
+          openaiTip: {
+            prefix: '袛谢褟 屑芯写械褉邪褑懈懈 OpenAI 褌褉械斜褍械褌褋褟 泻谢褞褔 API OpenAI, 薪邪褋褌褉芯械薪薪褘泄 胁 ',
+            suffix: '.',
+          },
+          keywords: '袣谢褞褔械胁褘械 褋谢芯胁邪',
+        },
+        keywords: {
+          tip: '袩芯 芯写薪芯屑褍 薪邪 褋褌褉芯泻褍, 褉邪蟹写械谢械薪薪褘械 褉邪蟹褉褘胁邪屑懈 褋褌褉芯泻. 袛芯 100 褋懈屑胁芯谢芯胁 薪邪 褋褌褉芯泻褍.',
+          placeholder: '袩芯 芯写薪芯屑褍 薪邪 褋褌褉芯泻褍, 褉邪蟹写械谢械薪薪褘械 褉邪蟹褉褘胁邪屑懈 褋褌褉芯泻',
+          line: '小褌褉芯泻邪',
+        },
+        content: {
+          input: '袦芯写械褉懈褉芯胁邪褌褜 袙啸袨袛袧袨袡 泻芯薪褌械薪褌',
+          output: '袦芯写械褉懈褉芯胁邪褌褜 袙蝎啸袨袛袧袨袡 泻芯薪褌械薪褌',
+          preset: '袩褉械写褍褋褌邪薪芯胁谢械薪薪褘械 芯褌胁械褌褘',
+          placeholder: '袟写械褋褜 褋芯写械褉卸懈屑芯械 锌褉械写褍褋褌邪薪芯胁谢械薪薪褘褏 芯褌胁械褌芯胁',
+          condition: '袦芯写械褉邪褑懈褟 袙啸袨袛袧袨袚袨 懈 袙蝎啸袨袛袧袨袚袨 泻芯薪褌械薪褌邪 胁泻谢褞褔械薪邪 褏芯褌褟 斜褘 芯写薪邪',
+          fromApi: '袩褉械写褍褋褌邪薪芯胁谢械薪薪褘械 芯褌胁械褌褘 胁芯蟹胁褉邪褖邪褞褌褋褟 API',
+          errorMessage: '袩褉械写褍褋褌邪薪芯胁谢械薪薪褘械 芯褌胁械褌褘 薪械 屑芯谐褍褌 斜褘褌褜 锌褍褋褌褘屑懈',
+          supportMarkdown: 'Markdown 锌芯写写械褉卸懈胁邪械褌褋褟',
+        },
+        openaiNotConfig: {
+          before: '袛谢褟 屑芯写械褉邪褑懈懈 OpenAI 褌褉械斜褍械褌褋褟 泻谢褞褔 API OpenAI, 薪邪褋褌褉芯械薪薪褘泄 胁',
+          after: '',
+        },
+      },
+    },
+  },
+  generate: {
+    title: '袚械薪械褉邪褌芯褉 锌褉芯屑锌褌邪',
+    description: '袚械薪械褉邪褌芯褉 锌褉芯屑锌褌邪 懈褋锌芯谢褜蟹褍械褌 薪邪褋褌褉芯械薪薪褍褞 屑芯写械谢褜 写谢褟 芯锌褌懈屑懈蟹邪褑懈懈 锌褉芯屑锌褌邪 写谢褟 锌芯胁褘褕械薪懈褟 泻邪褔械褋褌胁邪 懈 褍谢褍褔褕械薪懈褟 褋褌褉褍泻褌褍褉褘. 袩芯卸邪谢褍泄褋褌邪, 薪邪锌懈褕懈褌械 褔械褌泻懈械 懈 锌芯写褉芯斜薪褘械 懈薪褋褌褉褍泻褑懈懈.',
+    tryIt: '袩芯锌褉芯斜褍泄褌械',
+    instruction: '袠薪褋褌褉褍泻褑懈懈',
+    instructionPlaceHolder: '袧邪锌懈褕懈褌械 褔械褌泻懈械 懈 泻芯薪泻褉械褌薪褘械 懈薪褋褌褉褍泻褑懈懈.',
+    generate: '小谐械薪械褉懈褉芯胁邪褌褜',
+    resTitle: '小谐械薪械褉懈褉芯胁邪薪薪褘泄 锌褉芯屑锌褌',
+    noDataLine1: '袨锌懈褕懈褌械 褋胁芯泄 褋谢褍褔邪泄 懈褋锌芯谢褜蟹芯胁邪薪懈褟 褋谢械胁邪,',
+    noDataLine2: '锌褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉 芯褉泻械褋褌褉邪褑懈懈 斜褍写械褌 锌芯泻邪蟹邪薪 蟹写械褋褜.',
+    apply: '袩褉懈屑械薪懈褌褜',
+    loading: '袨褉泻械褋褌褉邪褑懈褟 锌褉懈谢芯卸械薪懈褟 写谢褟 胁邪褋...',
+    overwriteTitle: '袩械褉械蟹邪锌懈褋邪褌褜 褋褍褖械褋褌胁褍褞褖褍褞 泻芯薪褎懈谐褍褉邪褑懈褞?',
+    overwriteMessage: '袩褉懈屑械薪械薪懈械 褝褌芯谐芯 锌褉芯屑锌褌邪 锌械褉械蟹邪锌懈褕械褌 褋褍褖械褋褌胁褍褞褖褍褞 泻芯薪褎懈谐褍褉邪褑懈褞.',
+    template: {
+      pythonDebugger: {
+        name: '袨褌谢邪写褔懈泻 Python',
+        instruction: '袘芯褌, 泻芯褌芯褉褘泄 屑芯卸械褌 谐械薪械褉懈褉芯胁邪褌褜 懈 芯褌谢邪卸懈胁邪褌褜 胁邪褕 泻芯写 薪邪 芯褋薪芯胁械 胁邪褕懈褏 懈薪褋褌褉褍泻褑懈泄',
+      },
+      translation: {
+        name: '袩械褉械胁芯写褔懈泻',
+        instruction: '袩械褉械胁芯写褔懈泻, 泻芯褌芯褉褘泄 屑芯卸械褌 锌械褉械胁芯写懈褌褜 薪邪 薪械褋泻芯谢褜泻芯 褟蟹褘泻芯胁',
+      },
+      professionalAnalyst: {
+        name: '袩褉芯褎械褋褋懈芯薪邪谢褜薪褘泄 邪薪邪谢懈褌懈泻',
+        instruction: '袠蟹胁谢械泻邪泄褌械 懈薪褎芯褉屑邪褑懈褞, 胁褘褟胁谢褟泄褌械 褉懈褋泻懈 懈 懈蟹胁谢械泻邪泄褌械 泻谢褞褔械胁褍褞 懈薪褎芯褉屑邪褑懈褞 懈蟹 写谢懈薪薪褘褏 芯褌褔械褌芯胁 胁 芯写薪褍 蟹邪锌懈褋泻褍',
+      },
+      excelFormulaExpert: {
+        name: '协泻褋锌械褉褌 锌芯 褎芯褉屑褍谢邪屑 Excel',
+        instruction: '效邪褌-斜芯褌, 泻芯褌芯褉褘泄 屑芯卸械褌 锌芯屑芯褔褜 薪邪褔懈薪邪褞褖懈屑 锌芯谢褜蟹芯胁邪褌械谢褟屑 锌芯薪褟褌褜, 懈褋锌芯谢褜蟹芯胁邪褌褜 懈 褋芯蟹写邪胁邪褌褜 褎芯褉屑褍谢褘 Excel 薪邪 芯褋薪芯胁械 懈薪褋褌褉褍泻褑懈泄 锌芯谢褜蟹芯胁邪褌械谢褟',
+      },
+      travelPlanning: {
+        name: '袩谢邪薪懈褉芯胁褖懈泻 锌褍褌械褕械褋褌胁懈泄',
+        instruction: '袩芯屑芯褖薪懈泻 锌芯 锌谢邪薪懈褉芯胁邪薪懈褞 锌褍褌械褕械褋褌胁懈泄 - 褝褌芯 懈薪褌械谢谢械泻褌褍邪谢褜薪褘泄 懈薪褋褌褉褍屑械薪褌, 褉邪蟹褉邪斜芯褌邪薪薪褘泄, 褔褌芯斜褘 锌芯屑芯褔褜 锌芯谢褜蟹芯胁邪褌械谢褟屑 斜械蟹 褌褉褍写邪 锌谢邪薪懈褉芯胁邪褌褜 褋胁芯懈 锌芯械蟹写泻懈',
+      },
+      SQLSorcerer: {
+        name: 'SQL-邪褋褋懈褋褌械薪褌',
+        instruction: '袩褉械芯斜褉邪蟹褍泄褌械 锌芯胁褋械写薪械胁薪褘泄 褟蟹褘泻 胁 SQL-蟹邪锌褉芯褋褘',
+      },
+      GitGud: {
+        name: 'Git gud',
+        instruction: '袚械薪械褉懈褉褍泄褌械 褋芯芯褌胁械褌褋褌胁褍褞褖懈械 泻芯屑邪薪写褘 Git 薪邪 芯褋薪芯胁械 芯锌懈褋邪薪薪褘褏 锌芯谢褜蟹芯胁邪褌械谢械屑 写械泄褋褌胁懈泄 锌芯 褍锌褉邪胁谢械薪懈褞 胁械褉褋懈褟屑懈',
+      },
+      meetingTakeaways: {
+        name: '袠褌芯谐懈 褋芯胁械褖邪薪懈褟',
+        instruction: '袠蟹胁谢械泻邪泄褌械 懈蟹 褋芯胁械褖邪薪懈泄 泻褉邪褌泻懈械 褉械蟹褞屑械, 胁泻谢褞褔邪褟 褌械屑褘 芯斜褋褍卸写械薪懈褟, 泻谢褞褔械胁褘械 胁褘胁芯写褘 懈 褝谢械屑械薪褌褘 写械泄褋褌胁懈泄',
+      },
+      writingsPolisher: {
+        name: '袪械写邪泻褌芯褉',
+        instruction: '袠褋锌芯谢褜蟹褍泄褌械 LLM, 褔褌芯斜褘 褍谢褍褔褕懈褌褜 褋胁芯懈 锌懈褋褜屑械薪薪褘械 褉邪斜芯褌褘',
+      },
+    },
+  },
+  resetConfig: {
+    title: '袩芯写褌胁械褉写懈褌褜 褋斜褉芯褋?',
+    message:
+      '小斜褉芯褋 芯褌屑械薪褟械褌 懈蟹屑械薪械薪懈褟, 胁芯褋褋褌邪薪邪胁谢懈胁邪褟 锌芯褋谢械写薪褞褞 芯锌褍斜谢懈泻芯胁邪薪薪褍褞 泻芯薪褎懈谐褍褉邪褑懈褞.',
+  },
+  errorMessage: {
+    nameOfKeyRequired: '懈屑褟 泻谢褞褔邪: {{key}} 芯斜褟蟹邪褌械谢褜薪芯',
+    valueOfVarRequired: '蟹薪邪褔械薪懈械 {{key}} 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
+    queryRequired: '孝褉械斜褍械褌褋褟 褌械泻褋褌 蟹邪锌褉芯褋邪.',
+    waitForResponse:
+      '袩芯卸邪谢褍泄褋褌邪, 写芯卸写懈褌械褋褜 蟹邪胁械褉褕械薪懈褟 芯褌胁械褌邪 薪邪 锌褉械写褘写褍褖械械 褋芯芯斜褖械薪懈械.',
+    waitForBatchResponse:
+      '袩芯卸邪谢褍泄褋褌邪, 写芯卸写懈褌械褋褜 蟹邪胁械褉褕械薪懈褟 芯褌胁械褌邪 薪邪 锌邪泻械褌薪芯械 蟹邪写邪薪懈械.',
+    notSelectModel: '袩芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 屑芯写械谢褜',
+    waitForImgUpload: '袩芯卸邪谢褍泄褋褌邪, 写芯卸写懈褌械褋褜 蟹邪谐褉褍蟹泻懈 懈蟹芯斜褉邪卸械薪懈褟',
+  },
+  chatSubTitle: '袠薪褋褌褉褍泻褑懈懈',
+  completionSubTitle: '袩褉械褎懈泻褋 袩褉芯屑锌褌邪',
+  promptTip:
+    '袩褉芯屑锌褌 薪邪锌褉邪胁谢褟褞褌 芯褌胁械褌褘 袠袠 褋 锌芯屑芯褖褜褞 懈薪褋褌褉褍泻褑懈泄 懈 芯谐褉邪薪懈褔械薪懈泄. 袙褋褌邪胁褜褌械 锌械褉械屑械薪薪褘械, 褌邪泻懈械 泻邪泻 {{input}}. 协褌芯褌 袩褉芯屑锌褌 薪械 斜褍写械褌 胁懈写薪邪 锌芯谢褜蟹芯胁邪褌械谢褟屑.',
+  formattingChangedTitle: '肖芯褉屑邪褌懈褉芯胁邪薪懈械 懈蟹屑械薪械薪芯',
+  formattingChangedText:
+    '袠蟹屑械薪械薪懈械 褎芯褉屑邪褌懈褉芯胁邪薪懈褟 锌褉懈胁械写械褌 泻 褋斜褉芯褋褍 芯斜谢邪褋褌懈 芯褌谢邪写泻懈, 胁褘 褍胁械褉械薪褘?',
+  variableTitle: '袩械褉械屑械薪薪褘械',
+  variableTip:
+    '袩芯谢褜蟹芯胁邪褌械谢懈 蟹邪锌芯谢薪褟褞褌 锌械褉械屑械薪薪褘械 胁 褎芯褉屑械, 邪胁褌芯屑邪褌懈褔械褋泻懈 蟹邪屑械薪褟褟 锌械褉械屑械薪薪褘械 胁 锌褉芯屑锌褌械.',
+  notSetVar: '袩械褉械屑械薪薪褘械 锌芯蟹胁芯谢褟褞褌 锌芯谢褜蟹芯胁邪褌械谢褟屑 胁胁芯写懈褌褜 锌褉芯屑锌褌褘 懈谢懈 胁褋褌褍锌懈褌械谢褜薪褘械 蟹邪屑械褔邪薪懈褟 锌褉懈 蟹邪锌芯谢薪械薪懈懈 褎芯褉屑. 袙褘 屑芯卸械褌械 锌芯锌褉芯斜芯胁邪褌褜 胁胁械褋褌懈 "{{input}}" 胁 锌褉芯屑锌褌邪褏.',
+  autoAddVar: '袙 锌褉械写胁邪褉懈褌械谢褜薪芯泄 锌褉芯屑锌褌械 褍锌芯屑懈薪邪褞褌褋褟 薪械芯锌褉械写械谢械薪薪褘械 锌械褉械屑械薪薪褘械, 褏芯褌懈褌械 谢懈 胁褘 写芯斜邪胁懈褌褜 懈褏 胁 褎芯褉屑褍 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯谐芯 胁胁芯写邪?',
+  variableTable: {
+    key: '袣谢褞褔 锌械褉械屑械薪薪芯泄',
+    name: '袠屑褟 锌芯谢褟 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯谐芯 胁胁芯写邪',
+    optional: '袧械芯斜褟蟹邪褌械谢褜薪芯',
+    type: '孝懈锌 胁胁芯写邪',
+    action: '袛械泄褋褌胁懈褟',
+    typeString: '小褌褉芯泻邪',
+    typeSelect: '袙褘斜芯褉',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{key}} 芯斜褟蟹邪褌械谢褜薪芯',
+    tooLong: '{{key}} 褋谢懈褕泻芯屑 写谢懈薪薪芯械. 袧械 屑芯卸械褌 斜褘褌褜 写谢懈薪薪械械 30 褋懈屑胁芯谢芯胁',
+    notValid: '{{key}} 薪械写械泄褋褌胁懈褌械谢褜薪芯. 袦芯卸械褌 褋芯写械褉卸邪褌褜 褌芯谢褜泻芯 斜褍泻胁褘, 褑懈褎褉褘 懈 锌芯写褔械褉泻懈胁邪薪懈褟',
+    notStartWithNumber: '{{key}} 薪械 屑芯卸械褌 薪邪褔懈薪邪褌褜褋褟 褋 褑懈褎褉褘',
+    keyAlreadyExists: '{{key}} 褍卸械 褋褍褖械褋褌胁褍械褌',
+  },
+  otherError: {
+    promptNoBeEmpty: '袩褉芯屑锌褌 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌芯泄',
+    historyNoBeEmpty: '袠褋褌芯褉懈褟 褉邪蟹谐芯胁芯褉芯胁 写芯谢卸薪邪 斜褘褌褜 褍褋褌邪薪芯胁谢械薪邪 胁 锌褉芯屑锌褌械',
+    queryNoBeEmpty: '袟邪锌褉芯褋 写芯谢卸械薪 斜褘褌褜 褍褋褌邪薪芯胁谢械薪 胁 锌褉芯屑锌褌械',
+  },
+  variableConfig: {
+    'addModalTitle': '袛芯斜邪胁懈褌褜 锌芯谢械 胁胁芯写邪',
+    'editModalTitle': '袪械写邪泻褌懈褉芯胁邪褌褜 锌芯谢械 胁胁芯写邪',
+    'description': '袧邪褋褌褉芯泄泻邪 写谢褟 锌械褉械屑械薪薪芯泄 {{varName}}',
+    'fieldType': '孝懈锌 锌芯谢褟',
+    'string': '袣芯褉芯褌泻懈泄 褌械泻褋褌',
+    'text-input': '袣芯褉芯褌泻懈泄 褌械泻褋褌',
+    'paragraph': '袗斜蟹邪褑',
+    'select': '袙褘斜芯褉',
+    'number': '效懈褋谢芯',
+    'notSet': '袧械 蟹邪写邪薪芯, 锌芯锌褉芯斜褍泄褌械 胁胁械褋褌懈 {{input}} 胁 锌褉械褎懈泻褋 锌褉芯屑锌褌邪',
+    'stringTitle': '袩邪褉邪屑械褌褉褘 褌械泻褋褌芯胁芯谐芯 锌芯谢褟 褎芯褉屑褘',
+    'maxLength': '袦邪泻褋懈屑邪谢褜薪邪褟 写谢懈薪邪',
+    'options': '袙邪褉懈邪薪褌褘',
+    'addOption': '袛芯斜邪胁懈褌褜 胁邪褉懈邪薪褌',
+    'apiBasedVar': '袩械褉械屑械薪薪邪褟 薪邪 芯褋薪芯胁械 API',
+    'varName': '袠屑褟 锌械褉械屑械薪薪芯泄',
+    'labelName': '袠屑褟 屑械褌泻懈',
+    'inputPlaceholder': '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械',
+    'content': '小芯写械褉卸懈屑芯械',
+    'required': '袨斜褟蟹邪褌械谢褜薪芯',
+    'errorMsg': {
+      labelNameRequired: '袠屑褟 屑械褌泻懈 芯斜褟蟹邪褌械谢褜薪芯',
+      varNameCanBeRepeat: '袠屑褟 锌械褉械屑械薪薪芯泄 薪械 屑芯卸械褌 锌芯胁褌芯褉褟褌褜褋褟',
+      atLeastOneOption: '孝褉械斜褍械褌褋褟 褏芯褌褟 斜褘 芯写懈薪 胁邪褉懈邪薪褌',
+      optionRepeat: '袝褋褌褜 锌芯胁褌芯褉褟褞褖懈械褋褟 胁邪褉懈邪薪褌褘',
+    },
+  },
+  vision: {
+    name: '袟褉械薪懈械',
+    description: '袙泻谢褞褔械薪懈械 蟹褉械薪懈褟 锌芯蟹胁芯谢懈褌 屑芯写械谢懈 锌褉懈薪懈屑邪褌褜 懈蟹芯斜褉邪卸械薪懈褟 懈 芯褌胁械褔邪褌褜 薪邪 胁芯锌褉芯褋褘 芯 薪懈褏.',
+    settings: '袧邪褋褌褉芯泄泻懈',
+    visionSettings: {
+      title: '袧邪褋褌褉芯泄泻懈 蟹褉械薪懈褟',
+      resolution: '袪邪蟹褉械褕械薪懈械',
+      resolutionTooltip: `袧懈蟹泻芯械 褉邪蟹褉械褕械薪懈械 锌芯蟹胁芯谢懈褌 屑芯写械谢懈 锌芯谢褍褔邪褌褜 胁械褉褋懈褞 懈蟹芯斜褉邪卸械薪懈褟 褋 薪懈蟹泻懈屑 褉邪蟹褉械褕械薪懈械屑 512 x 512 懈 锌褉械写褋褌邪胁谢褟褌褜 懈蟹芯斜褉邪卸械薪懈械 褋 斜褞写卸械褌芯屑 65 褌芯泻械薪芯胁. 协褌芯 锌芯蟹胁芯谢褟械褌 API 胁芯蟹胁褉邪褖邪褌褜 芯褌胁械褌褘 斜褘褋褌褉械械 懈 锌芯褌褉械斜谢褟褌褜 屑械薪褜褕械 胁褏芯写薪褘褏 褌芯泻械薪芯胁 写谢褟 褋谢褍褔邪械胁 懈褋锌芯谢褜蟹芯胁邪薪懈褟, 薪械 褌褉械斜褍褞褖懈褏 胁褘褋芯泻芯泄 写械褌邪谢懈蟹邪褑懈懈.
+      \n
+      袙褘褋芯泻芯械 褉邪蟹褉械褕械薪懈械 褋薪邪褔邪谢邪 锌芯蟹胁芯谢懈褌 屑芯写械谢懈 褍胁懈写械褌褜 懈蟹芯斜褉邪卸械薪懈械 褋 薪懈蟹泻懈屑 褉邪蟹褉械褕械薪懈械屑, 邪 蟹邪褌械屑 褋芯蟹写邪褋褌 写械褌邪谢褜薪褘械 褎褉邪谐屑械薪褌褘 胁褏芯写薪褘褏 懈蟹芯斜褉邪卸械薪懈泄 胁 胁懈写械 泻胁邪写褉邪褌芯胁 512 锌懈泻褋械谢械泄 薪邪 芯褋薪芯胁械 褉邪蟹屑械褉邪 胁褏芯写薪芯谐芯 懈蟹芯斜褉邪卸械薪懈褟. 袣邪卸写褘泄 懈蟹 写械褌邪谢褜薪褘褏 褎褉邪谐屑械薪褌芯胁 懈褋锌芯谢褜蟹褍械褌 胁写胁芯械 斜芯谢褜褕懈泄 斜褞写卸械褌 褌芯泻械薪芯胁, 胁 芯斜褖械泄 褋谢芯卸薪芯褋褌懈 129 褌芯泻械薪芯胁.`,
+      high: '袙褘褋芯泻芯械',
+      low: '袧懈蟹泻芯械',
+      uploadMethod: '袦械褌芯写 蟹邪谐褉褍蟹泻懈',
+      both: '袨斜邪',
+      localUpload: '袥芯泻邪谢褜薪邪褟 蟹邪谐褉褍蟹泻邪',
+      url: 'URL',
+      uploadLimit: '袥懈屑懈褌 蟹邪谐褉褍蟹泻懈',
+    },
+  },
+  voice: {
+    name: '袚芯谢芯褋',
+    defaultDisplay: '袚芯谢芯褋 锌芯 褍屑芯谢褔邪薪懈褞',
+    description: '袧邪褋褌褉芯泄泻懈 锌褉械芯斜褉邪蟹芯胁邪薪懈褟 褌械泻褋褌邪 胁 褉械褔褜',
+    settings: '袧邪褋褌褉芯泄泻懈',
+    voiceSettings: {
+      title: '袧邪褋褌褉芯泄泻懈 谐芯谢芯褋邪',
+      language: '携蟹褘泻',
+      resolutionTooltip: '携蟹褘泻, 锌芯写写械褉卸懈胁邪械屑褘泄 锌褉械芯斜褉邪蟹芯胁邪薪懈械屑 褌械泻褋褌邪 胁 褉械褔褜.',
+      voice: '袚芯谢芯褋',
+      autoPlay: '袗胁褌芯胁芯褋锌褉芯懈蟹胁械写械薪懈械',
+      autoPlayEnabled: '袙泻谢褞褔懈褌褜',
+      autoPlayDisabled: '袙褘泻谢褞褔懈褌褜',
+    },
+  },
+  openingStatement: {
+    title: '袧邪褔邪谢褜薪芯械 褋芯芯斜褖械薪懈械',
+    add: '袛芯斜邪胁懈褌褜',
+    writeOpener: '袧邪锌懈褋邪褌褜 薪邪褔邪谢褜薪芯械 褋芯芯斜褖械薪懈械',
+    placeholder: '袧邪锌懈褕懈褌械 蟹写械褋褜 褋胁芯械 薪邪褔邪谢褜薪芯械 褋芯芯斜褖械薪懈械, 胁褘 屑芯卸械褌械 懈褋锌芯谢褜蟹芯胁邪褌褜 锌械褉械屑械薪薪褘械, 锌芯锌褉芯斜褍泄褌械 胁胁械褋褌懈 {{variable}}.',
+    openingQuestion: '袧邪褔邪谢褜薪褘械 胁芯锌褉芯褋褘',
+    noDataPlaceHolder:
+      '袧邪褔邪谢芯 褉邪蟹谐芯胁芯褉邪 褋 锌芯谢褜蟹芯胁邪褌械谢械屑 屑芯卸械褌 锌芯屑芯褔褜 袠袠 褍褋褌邪薪芯胁懈褌褜 斜芯谢械械 褌械褋薪褍褞 褋胁褟蟹褜 褋 薪懈屑 胁 写懈邪谢芯谐芯胁褘褏 锌褉懈谢芯卸械薪懈褟褏.',
+    varTip: '袙褘 屑芯卸械褌械 懈褋锌芯谢褜蟹芯胁邪褌褜 锌械褉械屑械薪薪褘械, 锌芯锌褉芯斜褍泄褌械 胁胁械褋褌懈 {{variable}}',
+    tooShort: '袛谢褟 谐械薪械褉邪褑懈懈 胁褋褌褍锌懈褌械谢褜薪芯谐芯 蟹邪屑械褔邪薪懈褟 泻 褉邪蟹谐芯胁芯褉褍 褌褉械斜褍械褌褋褟 薪械 屑械薪械械 20 褋谢芯胁 薪邪褔邪谢褜薪芯谐芯 锌褉芯屑锌褌邪.',
+    notIncludeKey: '袧邪褔邪谢褜薪褘泄 锌褉芯屑锌褌 薪械 胁泻谢褞褔邪械褌 锌械褉械屑械薪薪褍褞: {{key}}. 袩芯卸邪谢褍泄褋褌邪, 写芯斜邪胁褜褌械 械褢 胁 薪邪褔邪谢褜薪褍褞 锌褉芯屑锌褌.',
+  },
+  modelConfig: {
+    model: '袦芯写械谢褜',
+    setTone: '校褋褌邪薪芯胁懈褌褜 褌芯薪 芯褌胁械褌芯胁',
+    title: '袦芯写械谢褜 懈 锌邪褉邪屑械褌褉褘',
+    modeType: {
+      chat: '效邪褌',
+      completion: '袟邪胁械褉褕械薪懈械',
+    },
+  },
+  inputs: {
+    title: '袨褌谢邪写泻邪 懈 锌褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉',
+    noPrompt: '袩芯锌褉芯斜褍泄褌械 薪邪锌懈褋邪褌褜 锌褉芯屑锌褌 胁芯 胁褏芯写薪褘褏 写邪薪薪褘褏 锌褉械写胁邪褉懈褌械谢褜薪芯谐芯 锌褉芯屑锌褌邪',
+    userInputField: '袩芯谢械 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯谐芯 胁胁芯写邪',
+    noVar: '袟邪锌芯谢薪懈褌械 蟹薪邪褔械薪懈械 锌械褉械屑械薪薪芯泄, 泻芯褌芯褉芯械 斜褍写械褌 邪胁褌芯屑邪褌懈褔械褋泻懈 蟹邪屑械薪褟褌褜褋褟 胁 锌褉芯屑锌褌械 泻邪卸写褘泄 褉邪蟹 锌褉懈 蟹邪锌褍褋泻械 薪芯胁芯谐芯 褋械邪薪褋邪.',
+    chatVarTip:
+      '袟邪锌芯谢薪懈褌械 蟹薪邪褔械薪懈械 锌械褉械屑械薪薪芯泄, 泻芯褌芯褉芯械 斜褍写械褌 邪胁褌芯屑邪褌懈褔械褋泻懈 蟹邪屑械薪褟褌褜褋褟 胁 锌褉芯屑锌褌械 泻邪卸写褘泄 褉邪蟹 锌褉懈 蟹邪锌褍褋泻械 薪芯胁芯谐芯 褋械邪薪褋邪',
+    completionVarTip:
+      '袟邪锌芯谢薪懈褌械 蟹薪邪褔械薪懈械 锌械褉械屑械薪薪芯泄, 泻芯褌芯褉芯械 斜褍写械褌 邪胁褌芯屑邪褌懈褔械褋泻懈 蟹邪屑械薪褟褌褜褋褟 胁 锌褉芯屑锌褌械 泻邪卸写褘泄 褉邪蟹 锌褉懈 芯褌锌褉邪胁泻械 胁芯锌褉芯褋邪.',
+    previewTitle: '袩褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉 锌褉芯屑锌褌邪',
+    queryTitle: '小芯写械褉卸懈屑芯械 蟹邪锌褉芯褋邪',
+    queryPlaceholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 褌械泻褋褌 蟹邪锌褉芯褋邪.',
+    run: '袟袗袩校小孝袠孝鞋',
+  },
+  result: '袙褘褏芯写薪芯泄 褌械泻褋褌',
+  datasetConfig: {
+    settingTitle: '袧邪褋褌褉芯泄泻懈 锌芯懈褋泻邪',
+    knowledgeTip: '袧邪卸屑懈褌械 泻薪芯锌泻褍 "+", 褔褌芯斜褘 写芯斜邪胁懈褌褜 蟹薪邪薪懈褟',
+    retrieveOneWay: {
+      title: '袩芯懈褋泻 N-泻-1',
+      description: '袧邪 芯褋薪芯胁械 薪邪屑械褉械薪懈褟 锌芯谢褜蟹芯胁邪褌械谢褟 懈 芯锌懈褋邪薪懈泄 蟹薪邪薪懈泄 邪谐械薪褌 邪胁褌芯薪芯屑薪芯 胁褘斜懈褉邪械褌 薪邪懈谢褍褔褕懈械 蟹薪邪薪懈褟 写谢褟 蟹邪锌褉芯褋邪. 袥褍褔褕械 胁褋械谐芯 锌芯写褏芯写懈褌 写谢褟 锌褉懈谢芯卸械薪懈泄 褋 褉邪蟹谢懈褔薪褘屑懈, 芯谐褉邪薪懈褔械薪薪褘屑懈 蟹薪邪薪懈褟屑懈.',
+    },
+    retrieveMultiWay: {
+      title: '袦薪芯谐芯锌褍褌薪褘泄 锌芯懈褋泻',
+      description: '袧邪 芯褋薪芯胁械 薪邪屑械褉械薪懈褟 锌芯谢褜蟹芯胁邪褌械谢褟 胁褘锌芯谢薪褟械褌 蟹邪锌褉芯褋褘 锌芯 胁褋械屑 蟹薪邪薪懈褟屑, 懈蟹胁谢械泻邪械褌 褋芯芯褌胁械褌褋褌胁褍褞褖懈泄 褌械泻褋褌 懈蟹 薪械褋泻芯谢褜泻懈褏 懈褋褌芯褔薪懈泻芯胁 懈 胁褘斜懈褉邪械褌 薪邪懈谢褍褔褕懈械 褉械蟹褍谢褜褌邪褌褘, 褋芯芯褌胁械褌褋褌胁褍褞褖懈械 蟹邪锌褉芯褋褍 锌芯谢褜蟹芯胁邪褌械谢褟, 锌芯褋谢械 锌芯胁褌芯褉薪芯谐芯 褉邪薪卸懈褉芯胁邪薪懈褟.',
+    },
+    rerankModelRequired: '孝褉械斜褍械褌褋褟 rerank-屑芯写械谢褜 ',
+    params: '袩邪褉邪屑械褌褉褘',
+    top_k: 'Top K',
+    top_kTip: '袠褋锌芯谢褜蟹褍械褌褋褟 写谢褟 褎懈谢褜褌褉邪褑懈懈 褎褉邪谐屑械薪褌芯胁, 薪邪懈斜芯谢械械 锌芯褏芯卸懈褏 薪邪 胁芯锌褉芯褋褘 锌芯谢褜蟹芯胁邪褌械谢械泄. 小懈褋褌械屑邪 褌邪泻卸械 斜褍写械褌 写懈薪邪屑懈褔械褋泻懈 泻芯褉褉械泻褌懈褉芯胁邪褌褜 蟹薪邪褔械薪懈械 Top K 胁 蟹邪胁懈褋懈屑芯褋褌懈 芯褌 max_tokens 胁褘斜褉邪薪薪芯泄 屑芯写械谢懈.',
+    score_threshold: '袩芯褉芯谐 芯褑械薪泻懈',
+    score_thresholdTip: '袠褋锌芯谢褜蟹褍械褌褋褟 写谢褟 褍褋褌邪薪芯胁泻懈 锌芯褉芯谐邪 褋褏芯写褋褌胁邪 写谢褟 褎懈谢褜褌褉邪褑懈懈 褎褉邪谐屑械薪褌芯胁.',
+    retrieveChangeTip: '袠蟹屑械薪械薪懈械 褉械卸懈屑邪 懈薪写械泻褋邪褑懈懈 懈 褉械卸懈屑邪 锌芯懈褋泻邪 屑芯卸械褌 锌芯胁谢懈褟褌褜 薪邪 锌褉懈谢芯卸械薪懈褟, 褋胁褟蟹邪薪薪褘械 褋 褝褌懈屑懈 蟹薪邪薪懈褟屑懈.',
+  },
+  debugAsSingleModel: '袨褌谢邪写泻邪 泻邪泻 芯写薪芯泄 屑芯写械谢懈',
+  debugAsMultipleModel: '袨褌谢邪写泻邪 泻邪泻 薪械褋泻芯谢褜泻懈褏 屑芯写械谢械泄',
+  duplicateModel: '袛褍斜谢懈褉芯胁邪褌褜',
+  publishAs: '袨锌褍斜谢懈泻芯胁邪褌褜 泻邪泻',
+  assistantType: {
+    name: '孝懈锌 锌芯屑芯褖薪懈泻邪',
+    chatAssistant: {
+      name: '袘邪蟹芯胁褘泄 锌芯屑芯褖薪懈泻',
+      description: '小芯蟹写邪泄褌械 锌芯屑芯褖薪懈泻邪 薪邪 芯褋薪芯胁械 褔邪褌邪, 懈褋锌芯谢褜蟹褍褟 斜芯谢褜褕褍褞 褟蟹褘泻芯胁褍褞 屑芯写械谢褜',
+    },
+    agentAssistant: {
+      name: '袗谐械薪褌-锌芯屑芯褖薪懈泻',
+      description: '小芯蟹写邪泄褌械 懈薪褌械谢谢械泻褌褍邪谢褜薪芯谐芯 邪谐械薪褌邪, 泻芯褌芯褉褘泄 屑芯卸械褌 邪胁褌芯薪芯屑薪芯 胁褘斜懈褉邪褌褜 懈薪褋褌褉褍屑械薪褌褘 写谢褟 胁褘锌芯谢薪械薪懈褟 蟹邪写邪褔',
+    },
+  },
+  agent: {
+    agentMode: '袪械卸懈屑 邪谐械薪褌邪',
+    agentModeDes: '校褋褌邪薪芯胁懈褌械 褌懈锌 褉械卸懈屑邪 胁褘胁芯写邪 写谢褟 邪谐械薪褌邪',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: '袙褘蟹芯胁 褎褍薪泻褑懈懈',
+    },
+    setting: {
+      name: '袧邪褋褌褉芯泄泻懈 邪谐械薪褌邪',
+      description: '袧邪褋褌褉芯泄泻懈 邪谐械薪褌邪-锌芯屑芯褖薪懈泻邪 锌芯蟹胁芯谢褟褞褌 褍褋褌邪薪芯胁懈褌褜 褉械卸懈屑 邪谐械薪褌邪 懈 褉邪褋褕懈褉械薪薪褘械 褎褍薪泻褑懈懈, 褌邪泻懈械 泻邪泻 胁褋褌褉芯械薪薪褘械 锌褉芯屑锌褌褘, 写芯褋褌褍锌薪褘械 褌芯谢褜泻芯 胁 褌懈锌械 邪谐械薪褌邪.',
+      maximumIterations: {
+        name: '袦邪泻褋懈屑邪谢褜薪芯械 泻芯谢懈褔械褋褌胁芯 懈褌械褉邪褑懈泄',
+        description: '袨谐褉邪薪懈褔褜褌械 泻芯谢懈褔械褋褌胁芯 懈褌械褉邪褑懈泄, 泻芯褌芯褉褘械 屑芯卸械褌 胁褘锌芯谢薪懈褌褜 邪谐械薪褌-锌芯屑芯褖薪懈泻',
+      },
+    },
+    buildInPrompt: '袙褋褌褉芯械薪薪褘泄 锌褉芯屑锌褌',
+    firstPrompt: '袩械褉胁褘泄 锌褉芯屑锌褌',
+    nextIteration: '小谢械写褍褞褖邪褟 懈褌械褉邪褑懈褟',
+    promptPlaceholder: '袧邪锌懈褕懈褌械 蟹写械褋褜 褋胁芯泄 锌械褉胁褘泄 锌褉芯屑锌褌',
+    tools: {
+      name: '袠薪褋褌褉褍屑械薪褌褘',
+      description: '袠褋锌芯谢褜蟹芯胁邪薪懈械 懈薪褋褌褉褍屑械薪褌芯胁 屑芯卸械褌 褉邪褋褕懈褉懈褌褜 胁芯蟹屑芯卸薪芯褋褌懈 LLM, 褌邪泻懈械 泻邪泻 锌芯懈褋泻 胁 袠薪褌械褉薪械褌械 懈谢懈 胁褘锌芯谢薪械薪懈械 薪邪褍褔薪褘褏 褉邪褋褔械褌芯胁',
+      enabled: '袙泻谢褞褔械薪芯',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/ru-RU/app-log.ts b/i18n/ru-RU/app-log.ts
new file mode 100644
index 0000000..1f4ed9b
--- /dev/null
+++ b/i18n/ru-RU/app-log.ts
@@ -0,0 +1,98 @@
+const translation = {
+  title: '袥芯谐懈褉芯胁邪薪懈械',
+  description: '袙 谢芯谐邪褏 蟹邪锌懈褋褘胁邪械褌褋褟 褋芯褋褌芯褟薪懈械 褉邪斜芯褌褘 锌褉懈谢芯卸械薪懈褟, 胁泻谢褞褔邪褟 锌芯谢褜蟹芯胁邪褌械谢褜褋泻懈泄 胁胁芯写 懈 芯褌胁械褌褘 袠袠.',
+  dateTimeFormat: 'DD.MM.YYYY HH:mm',
+  table: {
+    header: {
+      updatedTime: '袙褉械屑褟 芯斜薪芯胁谢械薪懈褟',
+      time: '袙褉械屑褟 褋芯蟹写邪薪懈褟',
+      endUser: '袣芯薪械褔薪褘泄 锌芯谢褜蟹芯胁邪褌械谢褜 懈谢懈 邪泻泻邪褍薪褌',
+      input: '袙胁芯写',
+      output: '袙褘胁芯写',
+      summary: '袟邪谐芯谢芯胁芯泻',
+      messageCount: '袣芯谢懈褔械褋褌胁芯 褋芯芯斜褖械薪懈泄',
+      userRate: '袨褑械薪泻邪 锌芯谢褜蟹芯胁邪褌械谢褟',
+      adminRate: '袨褑械薪泻邪 芯锌.',
+      startTime: '袙袪袝袦携 袧袗效袗袥袗',
+      status: '小孝袗孝校小',
+      runtime: '袙袪袝袦携 袙蝎袩袨袥袧袝袧袠携',
+      tokens: '孝袨袣袝袧蝎',
+      user: '袣芯薪械褔薪褘泄 锌芯谢褜蟹芯胁邪褌械谢褜 懈谢懈 邪泻泻邪褍薪褌',
+      version: '袙袝袪小袠携',
+    },
+    pagination: {
+      previous: '袩褉械写褘写褍褖懈泄',
+      next: '小谢械写褍褞褖懈泄',
+    },
+    empty: {
+      noChat: '袝褖械 薪械褌 褔邪褌芯胁',
+      noOutput: '袧械褌 胁褘胁芯写邪',
+      element: {
+        title: '袝褋褌褜 泻褌芯-薪懈斜褍写褜?',
+        content: '袧邪斜谢褞写邪泄褌械 懈 邪薪薪芯褌懈褉褍泄褌械 胁蟹邪懈屑芯写械泄褋褌胁懈褟 屑械卸写褍 泻芯薪械褔薪褘屑懈 锌芯谢褜蟹芯胁邪褌械谢褟屑懈 懈 锌褉懈谢芯卸械薪懈褟屑懈 袠袠 蟹写械褋褜, 褔褌芯斜褘 锌芯褋褌芯褟薪薪芯 锌芯胁褘褕邪褌褜 褌芯褔薪芯褋褌褜 袠袠. 袙褘 屑芯卸械褌械 锌芯锌褉芯斜芯胁邪褌褜 <shareLink>锌芯写械谢懈褌褜褋褟</shareLink> 懈谢懈 <testLink>锌褉芯褌械褋褌懈褉芯胁邪褌褜</testLink> 胁械斜-锌褉懈谢芯卸械薪懈械 褋邪屑芯褋褌芯褟褌械谢褜薪芯, 邪 蟹邪褌械屑 胁械褉薪褍褌褜褋褟 薪邪 褝褌褍 褋褌褉邪薪懈褑褍.',
+      },
+    },
+  },
+  detail: {
+    time: '袙褉械屑褟',
+    conversationId: '袠写械薪褌懈褎懈泻邪褌芯褉 褉邪蟹谐芯胁芯褉邪',
+    promptTemplate: '楔邪斜谢芯薪 锌芯写褋泻邪蟹泻懈',
+    promptTemplateBeforeChat: '楔邪斜谢芯薪 锌芯写褋泻邪蟹泻懈 锌械褉械写 褔邪褌芯屑 路 袣邪泻 褋懈褋褌械屑薪芯械 褋芯芯斜褖械薪懈械',
+    annotationTip: '校谢褍褔褕械薪懈褟, 芯褌屑械褔械薪薪褘械 {{user}}',
+    timeConsuming: '',
+    second: '褋',
+    tokenCost: '袩芯褌褉邪褔械薪芯 褌芯泻械薪芯胁',
+    loading: '蟹邪谐褉褍蟹泻邪',
+    operation: {
+      like: '谢邪泄泻',
+      dislike: '写懈蟹谢邪泄泻',
+      addAnnotation: '袛芯斜邪胁懈褌褜 褍谢褍褔褕械薪懈械',
+      editAnnotation: '袪械写邪泻褌懈褉芯胁邪褌褜 褍谢褍褔褕械薪懈械',
+      annotationPlaceholder: '袙胁械写懈褌械 芯卸懈写邪械屑褘泄 芯褌胁械褌, 泻芯褌芯褉褘泄 胁褘 褏芯褌懈褌械 锌芯谢褍褔懈褌褜 芯褌 袠袠, 泻芯褌芯褉褘泄 屑芯卸械褌 斜褘褌褜 懈褋锌芯谢褜蟹芯胁邪薪 写谢褟 褌芯薪泻芯泄 薪邪褋褌褉芯泄泻懈 屑芯写械谢懈 懈 锌芯褋褌芯褟薪薪芯谐芯 褍谢褍褔褕械薪懈褟 泻邪褔械褋褌胁邪 谐械薪械褉邪褑懈懈 褌械泻褋褌邪 胁 斜褍写褍褖械屑.',
+    },
+    variables: '袩械褉械屑械薪薪褘械',
+    uploadImages: '袟邪谐褉褍卸械薪薪褘械 懈蟹芯斜褉邪卸械薪懈褟',
+    modelParams: '袩邪褉邪屑械褌褉褘 屑芯写械谢懈',
+  },
+  filter: {
+    period: {
+      today: '小械谐芯写薪褟',
+      last7days: '袩芯褋谢械写薪懈械 7 写薪械泄',
+      last4weeks: '袩芯褋谢械写薪懈械 4 薪械写械谢懈',
+      last3months: '袩芯褋谢械写薪懈械 3 屑械褋褟褑邪',
+      last12months: '袩芯褋谢械写薪懈械 12 屑械褋褟褑械胁',
+      monthToDate: '小 薪邪褔邪谢邪 屑械褋褟褑邪',
+      quarterToDate: '小 薪邪褔邪谢邪 泻胁邪褉褌邪谢邪',
+      yearToDate: '小 薪邪褔邪谢邪 谐芯写邪',
+      allTime: '袙褋械 胁褉械屑褟',
+    },
+    annotation: {
+      all: '袙褋械',
+      annotated: '袗薪薪芯褌懈褉芯胁邪薪薪褘械 褍谢褍褔褕械薪懈褟 ({{count}} 褝谢械屑械薪褌芯胁)',
+      not_annotated: '袧械 邪薪薪芯褌懈褉芯胁邪薪芯',
+    },
+    sortBy: '小芯褉褌懈褉芯胁邪褌褜 锌芯:',
+    descending: '锌芯 褍斜褘胁邪薪懈褞',
+    ascending: '锌芯 胁芯蟹褉邪褋褌邪薪懈褞',
+  },
+  workflowTitle: '袞褍褉薪邪谢褘 褉邪斜芯褔懈褏 锌褉芯褑械褋褋芯胁',
+  workflowSubtitle: '袞褍褉薪邪谢 蟹邪锌懈褋邪谢 褉邪斜芯褌褍 Automate.',
+  runDetail: {
+    title: '袞褍褉薪邪谢 褉邪蟹谐芯胁芯褉芯胁',
+    workflowTitle: '袩芯写褉芯斜薪邪褟 懈薪褎芯褉屑邪褑懈褟 芯 卸褍褉薪邪谢械',
+    fileListLabel: '小胁械写械薪懈褟 芯 褎邪泄谢械',
+    fileListDetail: '袩芯写褉芯斜薪芯褋褌褜',
+  },
+  promptLog: '袞褍褉薪邪谢 锌芯写褋泻邪蟹芯泻',
+  agentLog: '袞褍褉薪邪谢 邪谐械薪褌邪',
+  viewLog: '袩褉芯褋屑芯褌褉械褌褜 卸褍褉薪邪谢',
+  agentLogDetail: {
+    agentMode: '袪械卸懈屑 邪谐械薪褌邪',
+    toolUsed: '袠褋锌芯谢褜蟹芯胁邪薪薪褘泄 懈薪褋褌褉褍屑械薪褌',
+    iterations: '袠褌械褉邪褑懈懈',
+    iteration: '袠褌械褉邪褑懈褟',
+    finalProcessing: '袨泻芯薪褔邪褌械谢褜薪邪褟 芯斜褉邪斜芯褌泻邪',
+  },
+}
+
+export default translation
diff --git a/i18n/ru-RU/app-overview.ts b/i18n/ru-RU/app-overview.ts
new file mode 100644
index 0000000..5816c37
--- /dev/null
+++ b/i18n/ru-RU/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: '效褌芯斜褘 薪邪褔邪褌褜,',
+    enterKeyTip: '胁胁械写懈褌械 褋胁芯泄 泻谢褞褔 API OpenAI 薪懈卸械',
+    getKeyTip: '袩芯谢褍褔懈褌械 褋胁芯泄 泻谢褞褔 API 薪邪 锌邪薪械谢懈 懈薪褋褌褉褍屑械薪褌芯胁 OpenAI',
+    placeholder: '袙邪褕 泻谢褞褔 API OpenAI (薪邪锌褉懈屑械褉, sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: '袙褘 懈褋锌芯谢褜蟹褍械褌械 锌褉芯斜薪褍褞 泻胁芯褌褍 {{providerName}}.',
+        description: '袩褉芯斜薪邪褟 泻胁芯褌邪 锌褉械写芯褋褌邪胁谢褟械褌褋褟 写谢褟 褌械褋褌懈褉芯胁邪薪懈褟. 袩褉械卸写械 褔械屑 锌褉芯斜薪邪褟 泻胁芯褌邪 斜褍写械褌 懈褋褔械褉锌邪薪邪, 锌芯卸邪谢褍泄褋褌邪, 薪邪褋褌褉芯泄褌械 褋胁芯械谐芯 褋芯斜褋褌胁械薪薪芯谐芯 锌芯褋褌邪胁褖懈泻邪 屑芯写械谢懈 懈谢懈 锌褉懈芯斜褉械褌懈褌械 写芯锌芯谢薪懈褌械谢褜薪褍褞 泻胁芯褌褍.',
+      },
+      exhausted: {
+        title: '袙邪褕邪 锌褉芯斜薪邪褟 泻胁芯褌邪 斜褘谢邪 懈褋褔械褉锌邪薪邪, 锌芯卸邪谢褍泄褋褌邪, 薪邪褋褌褉芯泄褌械 褋胁芯泄 APIKey.',
+        description: '袙褘 懈褋褔械褉锌邪谢懈 褋胁芯褞 锌褉芯斜薪褍褞 泻胁芯褌褍. 袩芯卸邪谢褍泄褋褌邪, 薪邪褋褌褉芯泄褌械 褋胁芯械谐芯 褋芯斜褋褌胁械薪薪芯谐芯 锌芯褋褌邪胁褖懈泻邪 屑芯写械谢懈 懈谢懈 锌褉懈芯斜褉械褌懈褌械 写芯锌芯谢薪懈褌械谢褜薪褍褞 泻胁芯褌褍.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: '效褌芯斜褘 薪邪褔邪褌褜,',
+        row2: '褋薪邪褔邪谢邪 薪邪褋褌褉芯泄褌械 褋胁芯械谐芯 锌芯褋褌邪胁褖懈泻邪 屑芯写械谢懈.',
+      },
+    },
+    callTimes: '袣芯谢懈褔械褋褌胁芯 胁褘蟹芯胁芯胁',
+    usedToken: '袠褋锌芯谢褜蟹芯胁邪薪薪褘械 褌芯泻械薪褘',
+    setAPIBtn: '袩械褉械泄褌懈 泻 薪邪褋褌褉芯泄泻械 锌芯褋褌邪胁褖懈泻邪 屑芯写械谢懈',
+    tryCloud: '袠谢懈 锌芯锌褉芯斜褍泄褌械 芯斜谢邪褔薪褍褞 胁械褉褋懈褞 Dify 褋 斜械褋锌谢邪褌薪芯泄 泻胁芯褌芯泄',
+  },
+  overview: {
+    title: '袨斜蟹芯褉',
+    appInfo: {
+      explanation: '袚芯褌芯胁芯械 泻 懈褋锌芯谢褜蟹芯胁邪薪懈褞 胁械斜-锌褉懈谢芯卸械薪懈械 袠袠',
+      accessibleAddress: '袩褍斜谢懈褔薪褘泄 URL',
+      preview: '袩褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉',
+      regenerate: '袩械褉械谐械薪械褉懈褉芯胁邪褌褜',
+      regenerateNotice: '袙褘 褏芯褌懈褌械 锌械褉械谐械薪械褉懈褉芯胁邪褌褜 锌褍斜谢懈褔薪褘泄 URL?',
+      preUseReminder: '袩芯卸邪谢褍泄褋褌邪, 胁泻谢褞褔懈褌械 胁械斜-锌褉懈谢芯卸械薪懈械 锌械褉械写 锌褉芯写芯谢卸械薪懈械屑.',
+      settings: {
+        entry: '袧邪褋褌褉芯泄泻懈',
+        title: '袧邪褋褌褉芯泄泻懈 胁械斜-锌褉懈谢芯卸械薪懈褟',
+        webName: '袧邪蟹胁邪薪懈械 胁械斜-锌褉懈谢芯卸械薪懈褟',
+        webDesc: '袨锌懈褋邪薪懈械 胁械斜-锌褉懈谢芯卸械薪懈褟',
+        webDescTip: '协褌芯褌 褌械泻褋褌 斜褍写械褌 芯褌芯斜褉邪卸邪褌褜褋褟 薪邪 褋褌芯褉芯薪械 泻谢懈械薪褌邪, 锌褉械写芯褋褌邪胁谢褟褟 斜邪蟹芯胁褘械 懈薪褋褌褉褍泻褑懈懈 锌芯 懈褋锌芯谢褜蟹芯胁邪薪懈褞 锌褉懈谢芯卸械薪懈褟',
+        webDescPlaceholder: '袙胁械写懈褌械 芯锌懈褋邪薪懈械 胁械斜-锌褉懈谢芯卸械薪懈褟',
+        language: '携蟹褘泻',
+        workflow: {
+          title: '袪邪斜芯褔懈泄 锌褉芯褑械褋褋',
+          subTitle: '袩芯写褉芯斜薪芯褋褌懈 褉邪斜芯褔械谐芯 锌褉芯褑械褋褋邪',
+          show: '袩芯泻邪蟹邪褌褜',
+          hide: '小泻褉褘褌褜',
+          showDesc: '袩芯泻邪蟹邪褌褜 懈谢懈 褋泻褉褘褌褜 锌芯写褉芯斜薪芯褋褌懈 褉邪斜芯褔械谐芯 锌褉芯褑械褋褋邪 胁 胁械斜-锌褉懈谢芯卸械薪懈懈',
+        },
+        chatColorTheme: '笑胁械褌芯胁邪褟 褌械屑邪 褔邪褌邪',
+        chatColorThemeDesc: '校褋褌邪薪芯胁懈褌械 褑胁械褌芯胁褍褞 褌械屑褍 褔邪褌-斜芯褌邪',
+        chatColorThemeInverted: '袠薪胁械褉褌懈褉芯胁邪薪薪褘械 褑胁械褌邪',
+        invalidHexMessage: '袧械胁械褉薪芯械 HEX-蟹薪邪褔械薪懈械',
+        invalidPrivacyPolicy: '袧械写芯锌褍褋褌懈屑邪褟 褋褋褘谢泻邪 薪邪 锌芯谢懈褌懈泻褍 泻芯薪褎懈写械薪褑懈邪谢褜薪芯褋褌懈. 袩芯卸邪谢褍泄褋褌邪, 懈褋锌芯谢褜蟹褍泄褌械 写械泄褋褌胁懈褌械谢褜薪褍褞 褋褋褘谢泻褍, 薪邪褔懈薪邪褞褖褍褞褋褟 褋 http 懈谢懈 https',
+        sso: {
+          label: 'SSO 邪褍褌械薪褌懈褎懈泻邪褑懈褟',
+          title: 'WebApp SSO',
+          description: '袙褋械 锌芯谢褜蟹芯胁邪褌械谢懈 写芯谢卸薪褘 胁芯泄褌懈 胁 褋懈褋褌械屑褍 褋 锌芯屑芯褖褜褞 SSO 锌械褉械写 懈褋锌芯谢褜蟹芯胁邪薪懈械屑 WebApp',
+          tooltip: '袨斜褉邪褌懈褌械褋褜 泻 邪写屑懈薪懈褋褌褉邪褌芯褉褍, 褔褌芯斜褘 胁泻谢褞褔懈褌褜 WebApp SSO',
+        },
+        more: {
+          entry: '袩芯泻邪蟹邪褌褜 斜芯谢褜褕械 薪邪褋褌褉芯械泻',
+          copyright: '袗胁褌芯褉褋泻懈械 锌褉邪胁邪',
+          copyRightPlaceholder: '袙胁械写懈褌械 懈屑褟 邪胁褌芯褉邪 懈谢懈 芯褉谐邪薪懈蟹邪褑懈懈',
+          privacyPolicy: '袩芯谢懈褌懈泻邪 泻芯薪褎懈写械薪褑懈邪谢褜薪芯褋褌懈',
+          privacyPolicyPlaceholder: '袙胁械写懈褌械 褋褋褘谢泻褍 薪邪 锌芯谢懈褌懈泻褍 泻芯薪褎懈写械薪褑懈邪谢褜薪芯褋褌懈',
+          privacyPolicyTip: '袩芯屑芯谐邪械褌 锌芯褋械褌懈褌械谢褟屑 锌芯薪褟褌褜, 泻邪泻懈械 写邪薪薪褘械 褋芯斜懈褉邪械褌 锌褉懈谢芯卸械薪懈械, 褋屑. <privacyPolicyLink>袩芯谢懈褌懈泻褍 泻芯薪褎懈写械薪褑懈邪谢褜薪芯褋褌懈</privacyPolicyLink> Dify.',
+          customDisclaimer: '袩芯谢褜蟹芯胁邪褌械谢褜褋泻懈泄 芯褌泻邪蟹 芯褌 芯褌胁械褌褋褌胁械薪薪芯褋褌懈',
+          customDisclaimerPlaceholder: '袙胁械写懈褌械 褌械泻褋褌 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯谐芯 芯褌泻邪蟹邪 芯褌 芯褌胁械褌褋褌胁械薪薪芯褋褌懈',
+          customDisclaimerTip: '孝械泻褋褌 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯谐芯 芯褌泻邪蟹邪 芯褌 芯褌胁械褌褋褌胁械薪薪芯褋褌懈 斜褍写械褌 芯褌芯斜褉邪卸邪褌褜褋褟 薪邪 褋褌芯褉芯薪械 泻谢懈械薪褌邪, 锌褉械写芯褋褌邪胁谢褟褟 写芯锌芯谢薪懈褌械谢褜薪褍褞 懈薪褎芯褉屑邪褑懈褞 芯 锌褉懈谢芯卸械薪懈懈',
+          copyrightTooltip: '袩芯卸邪谢褍泄褋褌邪, 锌械褉械泄写懈褌械 薪邪 褌邪褉懈褎薪褘泄 锌谢邪薪 Professional 懈谢懈 胁褘褕械',
+          copyrightTip: '袨褌芯斜褉邪卸械薪懈械 懈薪褎芯褉屑邪褑懈懈 芯斜 邪胁褌芯褉褋泻懈褏 锌褉邪胁邪褏 胁 胁械斜-锌褉懈谢芯卸械薪懈懈',
+        },
+        modalTip: '袧邪褋褌褉芯泄泻懈 胁械斜-锌褉懈谢芯卸械薪懈褟 薪邪 褋褌芯褉芯薪械 泻谢懈械薪褌邪.',
+      },
+      embedded: {
+        entry: '袙褋褌褉邪懈胁邪薪懈械',
+        title: '袙褋褌褉芯懈褌褜 薪邪 胁械斜-褋邪泄褌',
+        explanation: '袙褘斜械褉懈褌械 褋锌芯褋芯斜 胁褋褌褉邪懈胁邪薪懈褟 褔邪褌-锌褉懈谢芯卸械薪懈褟 薪邪 褋胁芯泄 胁械斜-褋邪泄褌',
+        iframe: '效褌芯斜褘 写芯斜邪胁懈褌褜 褔邪褌-锌褉懈谢芯卸械薪懈械 胁 谢褞斜芯械 屑械褋褌芯 薪邪 胁邪褕械屑 胁械斜-褋邪泄褌械, 写芯斜邪胁褜褌械 褝褌芯褌 iframe 胁 褋胁芯泄 HTML-泻芯写.',
+        scripts: '效褌芯斜褘 写芯斜邪胁懈褌褜 褔邪褌-锌褉懈谢芯卸械薪懈械 胁 锌褉邪胁褘泄 薪懈卸薪懈泄 褍谐芯谢 胁邪褕械谐芯 胁械斜-褋邪泄褌邪, 写芯斜邪胁褜褌械 褝褌芯褌 泻芯写 胁 褋胁芯泄 HTML.',
+        chromePlugin: '校褋褌邪薪芯胁懈褌械 褉邪褋褕懈褉械薪懈械 Dify Chatbot 写谢褟 Chrome',
+        copied: '小泻芯锌懈褉芯胁邪薪芯',
+        copy: '袣芯锌懈褉芯胁邪褌褜',
+      },
+      qrcode: {
+        title: 'QR-泻芯写 褋褋褘谢泻懈',
+        scan: '小泻邪薪懈褉芯胁邪褌褜, 褔褌芯斜褘 锌芯写械谢懈褌褜褋褟',
+        download: '小泻邪褔邪褌褜 QR-泻芯写',
+      },
+      customize: {
+        way: '褋锌芯褋芯斜',
+        entry: '袧邪褋褌褉芯懈褌褜',
+        title: '袧邪褋褌褉芯懈褌褜 胁械斜-锌褉懈谢芯卸械薪懈械 袠袠',
+        explanation: '袙褘 屑芯卸械褌械 薪邪褋褌褉芯懈褌褜 胁薪械褕薪懈泄 懈薪褌械褉褎械泄褋 胁械斜-锌褉懈谢芯卸械薪懈褟 胁 褋芯芯褌胁械褌褋褌胁懈懈 褋芯 褋胁芯懈屑懈 锌芯褌褉械斜薪芯褋褌褟屑懈.',
+        way1: {
+          name: '小芯蟹写邪泄褌械 褎芯褉泻 泻谢懈械薪褌褋泻芯谐芯 泻芯写邪, 懈蟹屑械薪懈褌械 械谐芯 懈 褉邪蟹胁械褉薪懈褌械 薪邪 Vercel (褉械泻芯屑械薪写褍械褌褋褟)',
+          step1: '小芯蟹写邪泄褌械 褎芯褉泻 泻谢懈械薪褌褋泻芯谐芯 泻芯写邪 懈 懈蟹屑械薪懈褌械 械谐芯',
+          step1Tip: '袧邪卸屑懈褌械 蟹写械褋褜, 褔褌芯斜褘 褋芯蟹写邪褌褜 褎芯褉泻 懈褋褏芯写薪芯谐芯 泻芯写邪 胁 褋胁芯械泄 褍褔械褌薪芯泄 蟹邪锌懈褋懈 GitHub 懈 懈蟹屑械薪懈褌褜 泻芯写',
+          step1Operation: 'Dify-WebClient',
+          step2: '袪邪蟹胁械褉薪褍褌褜 薪邪 Vercel',
+          step2Tip: '袧邪卸屑懈褌械 蟹写械褋褜, 褔褌芯斜褘 懈屑锌芯褉褌懈褉芯胁邪褌褜 褉械锌芯蟹懈褌芯褉懈泄 胁 Vercel 懈 褉邪蟹胁械褉薪褍褌褜',
+          step2Operation: '袠屑锌芯褉褌懈褉芯胁邪褌褜 褉械锌芯蟹懈褌芯褉懈泄',
+          step3: '袧邪褋褌褉芯懈褌褜 锌械褉械屑械薪薪褘械 褋褉械写褘',
+          step3Tip: '袛芯斜邪胁褜褌械 褋谢械写褍褞褖懈械 锌械褉械屑械薪薪褘械 褋褉械写褘 胁 Vercel',
+        },
+        way2: {
+          name: '袧邪锌懈褕懈褌械 泻谢懈械薪褌褋泻懈泄 泻芯写 写谢褟 胁褘蟹芯胁邪 API 懈 褉邪蟹胁械褉薪懈褌械 械谐芯 薪邪 褋械褉胁械褉械',
+          operation: '袛芯泻褍屑械薪褌邪褑懈褟',
+        },
+      },
+      launch: '袘邪褉泻邪褋',
+    },
+    apiInfo: {
+      title: 'API 褋械褉胁械褉薪芯泄 褔邪褋褌懈',
+      explanation: '袥械谐泻芯 懈薪褌械谐褉懈褉褍械褌褋褟 胁 胁邪褕械 锌褉懈谢芯卸械薪懈械',
+      accessibleAddress: '袣芯薪械褔薪邪褟 褌芯褔泻邪 API 褋械褉胁懈褋邪',
+      doc: '小锌褉邪胁芯褔薪懈泻 锌芯 API',
+    },
+    status: {
+      running: '袙 褉邪斜芯褌械',
+      disable: '袨褌泻谢褞褔械薪芯',
+    },
+  },
+  analysis: {
+    title: '袗薪邪谢懈蟹',
+    ms: '屑褋',
+    tokenPS: '孝芯泻械薪/褋',
+    totalMessages: {
+      title: '袙褋械谐芯 褋芯芯斜褖械薪懈泄',
+      explanation: '袝卸械写薪械胁薪芯械 泻芯谢懈褔械褋褌胁芯 胁蟹邪懈屑芯写械泄褋褌胁懈泄 褋 袠袠.',
+    },
+    totalConversations: {
+      title: '袙褋械谐芯 褔邪褌芯胁',
+      explanation: '袝卸械写薪械胁薪芯械 泻芯谢懈褔械褋褌胁芯 褔邪褌芯胁 褋 LLM; 锌褉芯械泻褌懈褉芯胁邪薪懈械/芯褌谢邪写泻邪 薪械 褍褔懈褌褘胁邪褞褌褋褟.',
+    },
+    activeUsers: {
+      title: '袗泻褌懈胁薪褘械 锌芯谢褜蟹芯胁邪褌械谢懈',
+      explanation: '校薪懈泻邪谢褜薪褘械 锌芯谢褜蟹芯胁邪褌械谢懈, 褍褔邪褋褌胁褍褞褖懈械 胁 胁芯锌褉芯褋邪褏 懈 芯褌胁械褌邪褏 褋 LLM; 锌褉芯械泻褌懈褉芯胁邪薪懈械/芯褌谢邪写泻邪 薪械 褍褔懈褌褘胁邪褞褌褋褟.',
+    },
+    tokenUsage: {
+      title: '袠褋锌芯谢褜蟹芯胁邪薪懈械 褌芯泻械薪芯胁',
+      explanation: '袨褌褉邪卸邪械褌 械卸械写薪械胁薪芯械 懈褋锌芯谢褜蟹芯胁邪薪懈械 褌芯泻械薪芯胁 褟蟹褘泻芯胁芯泄 屑芯写械谢懈 写谢褟 锌褉懈谢芯卸械薪懈褟, 锌芯谢械蟹薪芯 写谢褟 褑械谢械泄 泻芯薪褌褉芯谢褟 蟹邪褌褉邪褌.',
+      consumed: '袩芯褌褉邪褔械薪芯',
+    },
+    avgSessionInteractions: {
+      title: '小褉械写薪械械 泻芯谢懈褔械褋褌胁芯 胁蟹邪懈屑芯写械泄褋褌胁懈泄 蟹邪 褋械邪薪褋',
+      explanation: '袣芯谢懈褔械褋褌胁芯 薪械锌褉械褉褘胁薪褘褏 胁蟹邪懈屑芯写械泄褋褌胁懈泄 锌芯谢褜蟹芯胁邪褌械谢褟 褋 LLM; 写谢褟 锌褉懈谢芯卸械薪懈泄 薪邪 芯褋薪芯胁械 褔邪褌芯胁.',
+    },
+    avgUserInteractions: {
+      title: '小褉械写薪械械 泻芯谢懈褔械褋褌胁芯 胁蟹邪懈屑芯写械泄褋褌胁懈泄 锌芯谢褜蟹芯胁邪褌械谢褟',
+      explanation: '袨褌褉邪卸邪械褌 械卸械写薪械胁薪褍褞 褔邪褋褌芯褌褍 懈褋锌芯谢褜蟹芯胁邪薪懈褟 锌芯谢褜蟹芯胁邪褌械谢褟屑懈. 协褌邪 屑械褌褉懈泻邪 芯褌褉邪卸邪械褌 邪泻褌懈胁薪芯褋褌褜 锌芯谢褜蟹芯胁邪褌械谢械泄.',
+    },
+    userSatisfactionRate: {
+      title: '校褉芯胁械薪褜 褍写芯胁谢械褌胁芯褉械薪薪芯褋褌懈 锌芯谢褜蟹芯胁邪褌械谢械泄',
+      explanation: '袣芯谢懈褔械褋褌胁芯 谢邪泄泻芯胁 薪邪 1000 褋芯芯斜褖械薪懈泄. 协褌芯 褍泻邪蟹褘胁邪械褌 薪邪 写芯谢褞 芯褌胁械褌芯胁, 泻芯褌芯褉褘屑懈 锌芯谢褜蟹芯胁邪褌械谢懈 写芯胁芯谢褜薪褘.',
+    },
+    avgResponseTime: {
+      title: '小褉械写薪械械 胁褉械屑褟 芯褌胁械褌邪',
+      explanation: '袙褉械屑褟 (屑褋) 写谢褟 芯斜褉邪斜芯褌泻懈/芯褌胁械褌邪 LLM; 写谢褟 褌械泻褋褌芯胁褘褏 锌褉懈谢芯卸械薪懈泄.',
+    },
+    tps: {
+      title: '小泻芯褉芯褋褌褜 胁褘胁芯写邪 褌芯泻械薪芯胁',
+      explanation: '袠蟹屑械褉褜褌械 锌褉芯懈蟹胁芯写懈褌械谢褜薪芯褋褌褜 LLM. 袩芯写褋褔懈褌邪泄褌械 褋泻芯褉芯褋褌褜 胁褘胁芯写邪 褌芯泻械薪芯胁 LLM 芯褌 薪邪褔邪谢邪 蟹邪锌褉芯褋邪 写芯 蟹邪胁械褉褕械薪懈褟 胁褘胁芯写邪.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/ru-RU/app.ts b/i18n/ru-RU/app.ts
new file mode 100644
index 0000000..990457b
--- /dev/null
+++ b/i18n/ru-RU/app.ts
@@ -0,0 +1,214 @@
+const translation = {
+  createApp: '小袨袟袛袗孝鞋 袩袪袠袥袨袞袝袧袠袝',
+  types: {
+    all: '袙褋械',
+    chatbot: '效邪褌-斜芯褌',
+    agent: '袗谐械薪褌',
+    workflow: '袪邪斜芯褔懈泄 锌褉芯褑械褋褋',
+    completion: '袟邪胁械褉褕械薪懈械',
+    advanced: '效邪褌褎谢芯褍',
+    basic: '袨褋薪芯胁薪芯泄',
+  },
+  duplicate: '袛褍斜谢懈褉芯胁邪褌褜',
+  duplicateTitle: '袛褍斜谢懈褉芯胁邪褌褜 锌褉懈谢芯卸械薪懈械',
+  export: '协泻褋锌芯褉褌懈褉芯胁邪褌褜 DSL',
+  exportFailed: '袨褕懈斜泻邪 褝泻褋锌芯褉褌邪 DSL.',
+  importDSL: '袠屑锌芯褉褌懈褉芯胁邪褌褜 褎邪泄谢 DSL',
+  createFromConfigFile: '小芯蟹写邪褌褜 懈蟹 褎邪泄谢邪 DSL',
+  importFromDSL: '袠屑锌芯褉褌懈褉芯胁邪褌褜 懈蟹 DSL',
+  importFromDSLFile: '袠蟹 褎邪泄谢邪 DSL',
+  importFromDSLUrl: '袠蟹 URL',
+  importFromDSLUrlPlaceholder: '袙褋褌邪胁褜褌械 褋褋褘谢泻褍 DSL 褋褞写邪',
+  deleteAppConfirmTitle: '校写邪谢懈褌褜 褝褌芯 锌褉懈谢芯卸械薪懈械?',
+  deleteAppConfirmContent:
+    '校写邪谢械薪懈械 锌褉懈谢芯卸械薪懈褟 薪械芯斜褉邪褌懈屑芯. 袩芯谢褜蟹芯胁邪褌械谢懈 斜芯谢褜褕械 薪械 褋屑芯谐褍褌 锌芯谢褍褔懈褌褜 写芯褋褌褍锌 泻 胁邪褕械屑褍 锌褉懈谢芯卸械薪懈褞, 懈 胁褋械 薪邪褋褌褉芯泄泻懈 锌芯写褋泻邪蟹芯泻 懈 卸褍褉薪邪谢褘 斜褍写褍褌 斜械蟹胁芯蟹胁褉邪褌薪芯 褍写邪谢械薪褘.',
+  appDeleted: '袩褉懈谢芯卸械薪懈械 褍写邪谢械薪芯',
+  appDeleteFailed: '袧械 褍写邪谢芯褋褜 褍写邪谢懈褌褜 锌褉懈谢芯卸械薪懈械',
+  join: '袩褉懈褋芯械写懈薪褟泄褌械褋褜 泻 褋芯芯斜褖械褋褌胁褍',
+  communityIntro:
+    '袨斜褖邪泄褌械褋褜 褋 褔谢械薪邪屑懈 泻芯屑邪薪写褘, 褍褔邪褋褌薪懈泻邪屑懈 懈 褉邪蟹褉邪斜芯褌褔懈泻邪屑懈 薪邪 褉邪蟹薪褘褏 泻邪薪邪谢邪褏.',
+  roadmap: '袩芯褋屑芯褌褉械褌褜 薪邪褕 roadmap',
+  newApp: {
+    startFromBlank: '小芯蟹写邪褌褜 褋 薪褍谢褟',
+    startFromTemplate: '小芯蟹写邪褌褜 懈蟹 褕邪斜谢芯薪邪',
+    captionAppType: '袣邪泻芯泄 褌懈锌 锌褉懈谢芯卸械薪懈褟 胁褘 褏芯褌懈褌械 褋芯蟹写邪褌褜?',
+    chatbotDescription: '小芯蟹写邪泄褌械 锌褉懈谢芯卸械薪懈械 薪邪 芯褋薪芯胁械 褔邪褌邪. 协褌芯 锌褉懈谢芯卸械薪懈械 懈褋锌芯谢褜蟹褍械褌 褎芯褉屑邪褌 胁芯锌褉芯褋芯胁 懈 芯褌胁械褌芯胁, 锌芯蟹胁芯谢褟褟 芯斜褖邪褌褜褋褟 薪械锌褉械褉褘胁薪芯.',
+    completionDescription: '小芯蟹写邪泄褌械 锌褉懈谢芯卸械薪懈械, 泻芯褌芯褉芯械 谐械薪械褉懈褉褍械褌 胁褘褋芯泻芯泻邪褔械褋褌胁械薪薪褘泄 褌械泻褋褌 薪邪 芯褋薪芯胁械 锌芯写褋泻邪蟹芯泻, 薪邪锌褉懈屑械褉, 谐械薪械褉懈褉褍械褌 褋褌邪褌褜懈, 褉械蟹褞屑械, 锌械褉械胁芯写褘 懈 屑薪芯谐芯械 写褉褍谐芯械.',
+    completionWarning: '协褌芯褌 褌懈锌 锌褉懈谢芯卸械薪懈褟 斜芯谢褜褕械 薪械 斜褍写械褌 锌芯写写械褉卸懈胁邪褌褜褋褟.',
+    agentDescription: '小芯蟹写邪泄褌械 懈薪褌械谢谢械泻褌褍邪谢褜薪芯谐芯 邪谐械薪褌邪, 泻芯褌芯褉褘泄 屑芯卸械褌 邪胁褌芯薪芯屑薪芯 胁褘斜懈褉邪褌褜 懈薪褋褌褉褍屑械薪褌褘 写谢褟 胁褘锌芯谢薪械薪懈褟 蟹邪写邪褔',
+    workflowDescription: '小芯蟹写邪泄褌械 锌褉懈谢芯卸械薪懈械, 泻芯褌芯褉芯械 谐械薪械褉懈褉褍械褌 胁褘褋芯泻芯泻邪褔械褋褌胁械薪薪褘泄 褌械泻褋褌 薪邪 芯褋薪芯胁械 褉邪斜芯褔械谐芯 锌褉芯褑械褋褋邪, 芯褉谐邪薪懈蟹芯胁邪薪薪芯谐芯 褋 胁褘褋芯泻芯泄 褋褌械锌械薪褜褞 薪邪褋褌褉芯泄泻懈. 袩芯写褏芯写懈褌 写谢褟 芯锌褘褌薪褘褏 锌芯谢褜蟹芯胁邪褌械谢械泄.',
+    workflowWarning: '袙 薪邪褋褌芯褟褖械械 胁褉械屑褟 薪邪褏芯写懈褌褋褟 胁 斜械褌邪-胁械褉褋懈懈',
+    chatbotType: '袦械褌芯写 芯褉谐邪薪懈蟹邪褑懈懈 褔邪褌-斜芯褌邪',
+    basic: '袘邪蟹芯胁褘泄',
+    basicTip: '袛谢褟 薪邪褔懈薪邪褞褖懈褏, 屑芯卸薪芯 锌械褉械泻谢褞褔懈褌褜褋褟 薪邪 Chatflow 锌芯蟹卸械',
+    basicFor: '袛袥携 袧袗效袠袧袗挟些袠啸',
+    basicDescription: '袘邪蟹芯胁褘泄 泻芯薪褋褌褉褍泻褌芯褉 锌芯蟹胁芯谢褟械褌 褋芯蟹写邪褌褜 锌褉懈谢芯卸械薪懈械 褔邪褌-斜芯褌邪 褋 锌芯屑芯褖褜褞 锌褉芯褋褌褘褏 薪邪褋褌褉芯械泻, 斜械蟹 胁芯蟹屑芯卸薪芯褋褌懈 懈蟹屑械薪褟褌褜 胁褋褌褉芯械薪薪褘械 锌芯写褋泻邪蟹泻懈. 袩芯写褏芯写懈褌 写谢褟 薪邪褔懈薪邪褞褖懈褏.',
+    advanced: 'Chatflow',
+    advancedFor: '袛谢褟 锌褉芯写胁懈薪褍褌褘褏 锌芯谢褜蟹芯胁邪褌械谢械泄',
+    advancedDescription: '袨褉谐邪薪懈蟹邪褑懈褟 褉邪斜芯褔械谐芯 锌褉芯褑械褋褋邪 芯褉谐邪薪懈蟹褍械褌 褔邪褌-斜芯褌芯胁 胁 胁懈写械 褉邪斜芯褔懈褏 锌褉芯褑械褋褋芯胁, 锌褉械写谢邪谐邪褟 胁褘褋芯泻褍褞 褋褌械锌械薪褜 薪邪褋褌褉芯泄泻懈, 胁泻谢褞褔邪褟 胁芯蟹屑芯卸薪芯褋褌褜 褉械写邪泻褌懈褉芯胁邪薪懈褟 胁褋褌褉芯械薪薪褘褏 锌芯写褋泻邪蟹芯泻. 袩芯写褏芯写懈褌 写谢褟 芯锌褘褌薪褘褏 锌芯谢褜蟹芯胁邪褌械谢械泄.',
+    captionName: '袟薪邪褔芯泻 懈 薪邪蟹胁邪薪懈械 锌褉懈谢芯卸械薪懈褟',
+    appNamePlaceholder: '袛邪泄褌械 胁邪褕械屑褍 锌褉懈谢芯卸械薪懈褞 懈屑褟',
+    captionDescription: '袨锌懈褋邪薪懈械',
+    appDescriptionPlaceholder: '袙胁械写懈褌械 芯锌懈褋邪薪懈械 锌褉懈谢芯卸械薪懈褟',
+    useTemplate: '袠褋锌芯谢褜蟹芯胁邪褌褜 褝褌芯褌 褕邪斜谢芯薪',
+    previewDemo: '袩褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉',
+    chatApp: '袗褋褋懈褋褌械薪褌',
+    chatAppIntro:
+      '携 褏芯褔褍 褋芯蟹写邪褌褜 锌褉懈谢芯卸械薪懈械 薪邪 芯褋薪芯胁械 褔邪褌邪. 协褌芯 锌褉懈谢芯卸械薪懈械 懈褋锌芯谢褜蟹褍械褌 褎芯褉屑邪褌 胁芯锌褉芯褋芯胁 懈 芯褌胁械褌芯胁, 锌芯蟹胁芯谢褟褟 芯斜褖邪褌褜褋褟 薪械锌褉械褉褘胁薪芯.',
+    agentAssistant: '袧芯胁褘泄 袗褋褋懈褋褌械薪褌 袗谐械薪褌邪',
+    completeApp: '袚械薪械褉邪褌芯褉 褌械泻褋褌邪',
+    completeAppIntro:
+      '携 褏芯褔褍 褋芯蟹写邪褌褜 锌褉懈谢芯卸械薪懈械, 泻芯褌芯褉芯械 谐械薪械褉懈褉褍械褌 胁褘褋芯泻芯泻邪褔械褋褌胁械薪薪褘泄 褌械泻褋褌 薪邪 芯褋薪芯胁械 锌芯写褋泻邪蟹芯泻, 薪邪锌褉懈屑械褉, 谐械薪械褉懈褉褍械褌 褋褌邪褌褜懈, 褉械蟹褞屑械, 锌械褉械胁芯写褘 懈 屑薪芯谐芯械 写褉褍谐芯械.',
+    showTemplates: '携 褏芯褔褍 胁褘斜褉邪褌褜 懈蟹 褕邪斜谢芯薪邪',
+    hideTemplates: '袙械褉薪褍褌褜褋褟 泻 胁褘斜芯褉褍 褉械卸懈屑邪',
+    Create: '小芯蟹写邪褌褜',
+    Cancel: '袨褌屑械薪邪',
+    nameNotEmpty: '袠屑褟 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
+    appTemplateNotSelected: '袩芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 褕邪斜谢芯薪',
+    appTypeRequired: '袩芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 褌懈锌 锌褉懈谢芯卸械薪懈褟',
+    appCreated: '袩褉懈谢芯卸械薪懈械 褋芯蟹写邪薪芯',
+    appCreateFailed: '袧械 褍写邪谢芯褋褜 褋芯蟹写邪褌褜 锌褉懈谢芯卸械薪懈械',
+    caution: '袨褋褌芯褉芯卸薪芯褋褌褜',
+    appCreateDSLErrorPart2: '啸芯褌懈褌械 锌褉芯写芯谢卸懈褌褜?',
+    Confirm: '袩芯写褌胁械褉卸写邪褌褜',
+    appCreateDSLErrorTitle: '袧械褋芯胁屑械褋褌懈屑芯褋褌褜 胁械褉褋懈泄',
+    appCreateDSLErrorPart3: '袗泻褌褍邪谢褜薪邪褟 胁械褉褋懈褟 锌褉懈谢芯卸械薪懈褟 DSL:',
+    appCreateDSLErrorPart4: '袩芯写写械褉卸懈胁邪械屑邪褟 褋懈褋褌械屑芯泄 胁械褉褋懈褟 DSL:',
+    appCreateDSLWarning: '袙薪懈屑邪薪懈械: 褉邪蟹薪懈褑邪 胁 胁械褉褋懈褟褏 DSL 屑芯卸械褌 锌芯胁谢懈褟褌褜 薪邪 薪械泻芯褌芯褉褘械 褎褍薪泻褑懈懈',
+    appCreateDSLErrorPart1: '袨斜薪邪褉褍卸械薪邪 褋褍褖械褋褌胁械薪薪邪褟 褉邪蟹薪懈褑邪 胁 胁械褉褋懈褟褏 DSL. 袩褉懈薪褍写懈褌械谢褜薪褘泄 懈屑锌芯褉褌 屑芯卸械褌 锌褉懈胁械褋褌懈 泻 褋斜芯褞 胁 褉邪斜芯褌械 锌褉懈谢芯卸械薪懈褟.',
+    learnMore: '袩芯写褉芯斜薪械械',
+    forAdvanced: '袛袥携 袩袪袨袛袙袠袧校孝蝎啸 袩袨袥鞋袟袨袙袗孝袝袥袝袡',
+    foundResults: '{{袣芯谢懈褔械褋褌胁芯}} 袪械蟹褍谢褜褌邪褌褘',
+    optional: '袧械芯斜褟蟹邪褌械谢褜薪褘泄',
+    chatbotShortDescription: '效邪褌-斜芯褌 薪邪 芯褋薪芯胁械 LLM 褋 锌褉芯褋褌芯泄 薪邪褋褌褉芯泄泻芯泄',
+    advancedShortDescription: '袪邪斜芯褔懈泄 锌褉芯褑械褋褋 写谢褟 褋谢芯卸薪褘褏 写懈邪谢芯谐芯胁 褋 薪械褋泻芯谢褜泻懈屑懈 褏芯写邪屑懈 褋 锌邪屑褟褌褜褞',
+    foundResult: '{{袣芯谢懈褔械褋褌胁芯}} 袪械蟹褍谢褜褌邪褌',
+    workflowShortDescription: '袨褉泻械褋褌褉芯胁泻邪 写谢褟 蟹邪写邪褔 邪胁褌芯屑邪褌懈蟹邪褑懈懈 蟹邪 芯写懈薪 芯斜芯褉芯褌',
+    advancedUserDescription: '袨褉泻械褋褌褉邪褑懈褟 褉邪斜芯褔懈褏 锌褉芯褑械褋褋芯胁 写谢褟 屑薪芯谐芯褉邪褍薪写芯胁褘褏 褋谢芯卸薪褘褏 写懈邪谢芯谐芯胁褘褏 蟹邪写邪褔 褋 胁芯蟹屑芯卸薪芯褋褌褟屑懈 锌邪屑褟褌懈.',
+    noAppsFound: '袩褉懈谢芯卸械薪懈褟 薪械 薪邪泄写械薪褘',
+    agentUserDescription: '袠薪褌械谢谢械泻褌褍邪谢褜薪褘泄 邪谐械薪褌, 褋锌芯褋芯斜薪褘泄 泻 懈褌械褉邪褌懈胁薪褘屑 褉邪褋褋褍卸写械薪懈褟屑 懈 邪胁褌芯薪芯屑薪芯屑褍 懈褋锌芯谢褜蟹芯胁邪薪懈褞 懈薪褋褌褉褍屑械薪褌芯胁 写谢褟 写芯褋褌懈卸械薪懈褟 褑械谢械泄 蟹邪写邪褔懈.',
+    forBeginners: '袛袥携 袧袗效袠袧袗挟些袠啸',
+    chatbotUserDescription: '袘褘褋褌褉芯 褋芯蟹写邪泄褌械 褔邪褌-斜芯褌邪 薪邪 芯褋薪芯胁械 LLM 褋 锌褉芯褋褌芯泄 薪邪褋褌褉芯泄泻芯泄. 袙褘 屑芯卸械褌械 锌械褉械泻谢褞褔懈褌褜褋褟 薪邪 Chatflow 锌芯蟹卸械.',
+    noTemplateFound: '楔邪斜谢芯薪褘 薪械 薪邪泄写械薪褘',
+    completionShortDescription: 'AI-锌芯屑芯褖薪懈泻 写谢褟 蟹邪写邪褔 谐械薪械褉邪褑懈懈 褌械泻褋褌邪',
+    noIdeaTip: '袧械褌 懈写械泄? 袨蟹薪邪泻芯屑褜褌械褋褜 褋 薪邪褕懈屑懈 褕邪斜谢芯薪邪屑懈',
+    chooseAppType: '袙褘斜械褉懈褌械 褌懈锌 锌褉懈谢芯卸械薪懈褟',
+    agentShortDescription: '袠薪褌械谢谢械泻褌褍邪谢褜薪褘泄 邪谐械薪褌 褋 褉邪褋褋褍卸写械薪懈褟屑懈 懈 邪胁褌芯薪芯屑薪褘屑 懈褋锌芯谢褜蟹芯胁邪薪懈械屑 懈薪褋褌褉褍屑械薪褌芯胁',
+    noTemplateFoundTip: '袩芯锌褉芯斜褍泄褌械 懈褋泻邪褌褜 锌芯 褉邪蟹薪褘屑 泻谢褞褔械胁褘屑 褋谢芯胁邪屑.',
+    completionUserDescription: '袘褘褋褌褉芯 褋芯蟹写邪泄褌械 锌芯屑芯褖薪懈泻邪 褋 懈褋泻褍褋褋褌胁械薪薪褘屑 懈薪褌械谢谢械泻褌芯屑 写谢褟 蟹邪写邪褔 谐械薪械褉邪褑懈懈 褌械泻褋褌邪 褋 锌褉芯褋褌芯泄 薪邪褋褌褉芯泄泻芯泄.',
+    workflowUserDescription: '袨褉泻械褋褌褉邪褑懈褟 褉邪斜芯褔懈褏 锌褉芯褑械褋褋芯胁 写谢褟 芯写薪芯褉邪褍薪写芯胁褘褏 蟹邪写邪褔, 褌邪泻懈褏 泻邪泻 邪胁褌芯屑邪褌懈蟹邪褑懈褟 懈 锌邪泻械褌薪邪褟 芯斜褉邪斜芯褌泻邪.',
+  },
+  editApp: '袪械写邪泻褌懈褉芯胁邪褌褜 懈薪褎芯褉屑邪褑懈褞',
+  editAppTitle: '袪械写邪泻褌懈褉芯胁邪褌褜 懈薪褎芯褉屑邪褑懈褞 芯 锌褉懈谢芯卸械薪懈懈',
+  editDone: '袠薪褎芯褉屑邪褑懈褟 芯 锌褉懈谢芯卸械薪懈懈 芯斜薪芯胁谢械薪邪',
+  editFailed: '袧械 褍写邪谢芯褋褜 芯斜薪芯胁懈褌褜 懈薪褎芯褉屑邪褑懈褞 芯 锌褉懈谢芯卸械薪懈懈',
+  iconPicker: {
+    ok: '袨袣',
+    cancel: '袨褌屑械薪邪',
+    emoji: '协屑芯写蟹懈',
+    image: '袠蟹芯斜褉邪卸械薪懈械',
+  },
+  switch: '袩械褉械泻谢褞褔懈褌褜褋褟 薪邪 Workflow',
+  switchTipStart: '袛谢褟 胁邪褋 斜褍写械褌 褋芯蟹写邪薪邪 薪芯胁邪褟 泻芯锌懈褟 Workflow. 袧芯胁邪褟 泻芯锌懈褟 ',
+  switchTip: '薪械 锌芯蟹胁芯谢懈褌',
+  switchTipEnd: ' 锌械褉械泻谢褞褔懈褌褜褋褟 芯斜褉邪褌薪芯 薪邪 斜邪蟹芯胁褍褞 芯褉谐邪薪懈蟹邪褑懈褞.',
+  switchLabel: '袣芯锌懈褟 锌褉懈谢芯卸械薪懈褟, 泻芯褌芯褉邪褟 斜褍写械褌 褋芯蟹写邪薪邪',
+  removeOriginal: '校写邪谢懈褌褜 懈褋褏芯写薪芯械 锌褉懈谢芯卸械薪懈械',
+  switchStart: '袩械褉械泻谢褞褔懈褌褜褋褟',
+  typeSelector: {
+    all: '袙小袝 褌懈锌褘',
+    chatbot: '效邪褌-斜芯褌',
+    agent: '袗谐械薪褌',
+    workflow: '袪邪斜芯褔懈泄 锌褉芯褑械褋褋',
+    completion: '袟邪胁械褉褕械薪懈械',
+    advanced: '效邪褌褎谢芯褍',
+  },
+  tracing: {
+    title: '袨褌褋谢械卸懈胁邪薪懈械 锌褉芯懈蟹胁芯写懈褌械谢褜薪芯褋褌懈 锌褉懈谢芯卸械薪懈褟',
+    description: '袧邪褋褌褉芯泄泻邪 褋褌芯褉芯薪薪械谐芯 锌芯褋褌邪胁褖懈泻邪 LLMOps 懈 芯褌褋谢械卸懈胁邪薪懈械 锌褉芯懈蟹胁芯写懈褌械谢褜薪芯褋褌懈 锌褉懈谢芯卸械薪懈褟.',
+    config: '袧邪褋褌褉芯泄泻邪',
+    view: '袩褉芯褋屑芯褌褉',
+    collapse: '小胁械褉薪褍褌褜',
+    expand: '袪邪蟹胁械褉薪褍褌褜',
+    tracing: '袨褌褋谢械卸懈胁邪薪懈械',
+    disabled: '袨褌泻谢褞褔械薪芯',
+    disabledTip: '袩芯卸邪谢褍泄褋褌邪, 褋薪邪褔邪谢邪 薪邪褋褌褉芯泄褌械 锌褉芯胁邪泄写械褉邪 LLM',
+    enabled: '袙 褉邪斜芯褌械',
+    tracingDescription: '袟邪锌懈褋褜 锌芯谢薪芯谐芯 泻芯薪褌械泻褋褌邪 胁褘锌芯谢薪械薪懈褟 锌褉懈谢芯卸械薪懈褟, 胁泻谢褞褔邪褟 胁褘蟹芯胁褘 LLM, 泻芯薪褌械泻褋褌, 锌芯写褋泻邪蟹泻懈, HTTP-蟹邪锌褉芯褋褘 懈 屑薪芯谐芯械 写褉褍谐芯械, 薪邪 褋褌芯褉芯薪薪褞褞 锌谢邪褌褎芯褉屑褍 褌褉邪褋褋懈褉芯胁泻懈.',
+    configProviderTitle: {
+      configured: '袧邪褋褌褉芯械薪芯',
+      notConfigured: '袧邪褋褌褉芯泄褌械 锌褉芯胁邪泄写械褉邪, 褔褌芯斜褘 胁泻谢褞褔懈褌褜 褌褉邪褋褋懈褉芯胁泻褍',
+      moreProvider: '袘芯谢褜褕械 锌褉芯胁邪泄写械褉芯胁',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: '校薪懈胁械褉褋邪谢褜薪邪褟 锌谢邪褌褎芯褉屑邪 写谢褟 褉邪蟹褉邪斜芯褌褔懈泻芯胁 写谢褟 泻邪卸写芯谐芯 褝褌邪锌邪 卸懈蟹薪械薪薪芯谐芯 褑懈泻谢邪 锌褉懈谢芯卸械薪懈褟 薪邪 斜邪蟹械 LLM.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: '孝褉邪褋褋懈褉芯胁泻邪, 芯褑械薪泻邪, 褍锌褉邪胁谢械薪懈械 锌芯写褋泻邪蟹泻邪屑懈 懈 屑械褌褉懈泻懈 写谢褟 芯褌谢邪写泻懈 懈 褍谢褍褔褕械薪懈褟 胁邪褕械谐芯 锌褉懈谢芯卸械薪懈褟 LLM.',
+    },
+    inUse: '袠褋锌芯谢褜蟹褍械褌褋褟',
+    configProvider: {
+      title: '袧邪褋褌褉芯泄泻邪 ',
+      placeholder: '袙胁械写懈褌械 胁邪褕 {{key}}',
+      project: '袩褉芯械泻褌',
+      publicKey: '袩褍斜谢懈褔薪褘泄 泻谢褞褔',
+      secretKey: '小械泻褉械褌薪褘泄 泻谢褞褔',
+      viewDocsLink: '袩芯褋屑芯褌褉械褌褜 写芯泻褍屑械薪褌邪褑懈褞 {{key}}',
+      removeConfirmTitle: '校写邪谢懈褌褜 泻芯薪褎懈谐褍褉邪褑懈褞 {{key}}?',
+      removeConfirmContent: '孝械泻褍褖邪褟 泻芯薪褎懈谐褍褉邪褑懈褟 懈褋锌芯谢褜蟹褍械褌褋褟, 械械 褍写邪谢械薪懈械 芯褌泻谢褞褔懈褌 褎褍薪泻褑懈褞 褌褉邪褋褋懈褉芯胁泻懈.',
+    },
+    opik: {
+      title: '袨锌懈泻',
+      description: 'Opik 鈥� 褝褌芯 锌谢邪褌褎芯褉屑邪 褋 芯褌泻褉褘褌褘屑 懈褋褏芯写薪褘屑 泻芯写芯屑 写谢褟 芯褑械薪泻懈, 褌械褋褌懈褉芯胁邪薪懈褟 懈 屑芯薪懈褌芯褉懈薪谐邪 LLM-锌褉懈谢芯卸械薪懈泄.',
+    },
+    weave: {
+      description: 'Weave 鈥� 褝褌芯 芯褌泻褉褘褌邪褟 锌谢邪褌褎芯褉屑邪 写谢褟 芯褑械薪泻懈, 褌械褋褌懈褉芯胁邪薪懈褟 懈 屑芯薪懈褌芯褉懈薪谐邪 锌褉懈谢芯卸械薪懈泄 LLM.',
+      title: '孝泻邪褌褜',
+    },
+  },
+  answerIcon: {
+    title: '袠褋锌芯谢褜蟹芯胁邪薪懈械 蟹薪邪褔泻邪 WebApp 写谢褟 蟹邪屑械薪褘 馃',
+    description: '小谢械写褍械褌 谢懈 懈褋锌芯谢褜蟹芯胁邪褌褜 蟹薪邪褔芯泻 WebApp 写谢褟 蟹邪屑械薪褘 馃 胁 芯斜褖械屑 锌褉懈谢芯卸械薪懈懈',
+    descriptionInExplore: '小谢械写褍械褌 谢懈 懈褋锌芯谢褜蟹芯胁邪褌褜 蟹薪邪褔芯泻 WebApp 写谢褟 蟹邪屑械薪褘 馃 胁 褉邪蟹写械谢械 "袨斜蟹芯褉"',
+  },
+  mermaid: {
+    handDrawn: '袪懈褋芯胁邪薪薪褘泄',
+    classic: '袣谢邪褋褋懈褔械褋泻懈泄',
+  },
+  openInExplore: '袨褌泻褉褘褌褜 胁 褉邪蟹写械谢械 芦袨斜蟹芯褉禄',
+  newAppFromTemplate: {
+    sidebar: {
+      HR: '效袗小',
+      Workflow: '袪邪斜芯褔懈泄 锌褉芯褑械褋褋',
+      Recommended: '袪械泻芯屑械薪写芯胁邪薪薪褘泄',
+      Agent: '袗谐械薪褌',
+      Assistant: '袩芯屑芯褖薪懈泻',
+      Writing: '袩懈褕褍褖懈泄',
+      Programming: '袩褉芯谐褉邪屑屑懈褉芯胁邪薪懈械',
+    },
+    searchAllTemplate: '袩芯懈褋泻 锌芯 胁褋械屑 褕邪斜谢芯薪邪屑...',
+    byCategories: '袩袨 袣袗孝袝袚袨袪袠携袦',
+  },
+  showMyCreatedAppsOnly: '袩芯泻邪蟹邪褌褜 褌芯谢褜泻芯 褋芯蟹写邪薪薪褘械 屑薪芯泄 锌褉懈谢芯卸械薪懈褟',
+  appSelector: {
+    label: '袩袪袠袥袨袞袝袧袠袝',
+    noParams: '袩邪褉邪屑械褌褉褘 薪械 薪褍卸薪褘',
+    placeholder: '袙褘斜械褉懈褌械 锌褉懈谢芯卸械薪懈械...',
+    params: '袩袗袪袗袦袝孝袪蝎 袩袪袠袥袨袞袝袧袠携',
+  },
+  structOutput: {
+    notConfiguredTip: '小褌褉褍泻褌褍褉懈褉芯胁邪薪薪褘泄 胁褘胁芯写 械褖械 薪械 斜褘谢 薪邪褋褌褉芯械薪.',
+    LLMResponse: '袨褌胁械褌 LLM',
+    structured: '小褌褉褍泻褌褍褉懈褉芯胁邪薪薪褘泄',
+    moreFillTip: '袩芯泻邪蟹邪薪芯 屑邪泻褋懈屑褍屑 10 褍褉芯胁薪械泄 胁谢芯卸械薪薪芯褋褌懈',
+    required: '袧械芯斜褏芯写懈屑芯',
+    configure: '袧邪褋褌褉芯懈褌褜',
+    modelNotSupported: '袦芯写械谢褜 薪械 锌芯写写械褉卸懈胁邪械褌褋褟',
+    modelNotSupportedTip: '孝械泻褍褖邪褟 屑芯写械谢褜 薪械 锌芯写写械褉卸懈胁邪械褌 褝褌褍 褎褍薪泻褑懈褞 懈 邪胁褌芯屑邪褌懈褔械褋泻懈 锌芯薪懈卸邪械褌褋褟 写芯 懈薪褗械泻褑懈懈 锌芯写褋泻邪蟹芯泻.',
+    structuredTip: '小褌褉褍泻褌褍褉懈褉芯胁邪薪薪褘械 胁褘褏芯写薪褘械 写邪薪薪褘械 鈥� 褝褌芯 褎褍薪泻褑懈褟, 泻芯褌芯褉邪褟 谐邪褉邪薪褌懈褉褍械褌, 褔褌芯 屑芯写械谢褜 胁褋械谐写邪 斜褍写械褌 谐械薪械褉懈褉芯胁邪褌褜 芯褌胁械褌褘, 褋芯芯褌胁械褌褋褌胁褍褞褖懈械 胁邪褕械泄 锌褉械写芯褋褌邪胁谢械薪薪芯泄 JSON-褋褏械屑械.',
+  },
+}
+
+export default translation
diff --git a/i18n/ru-RU/billing.ts b/i18n/ru-RU/billing.ts
new file mode 100644
index 0000000..7a05603
--- /dev/null
+++ b/i18n/ru-RU/billing.ts
@@ -0,0 +1,200 @@
+const translation = {
+  currentPlan: '孝械泻褍褖懈泄 褌邪褉懈褎薪褘泄 锌谢邪薪',
+  upgradeBtn: {
+    plain: '袨斜薪芯胁懈褌褜 褌邪褉懈褎薪褘泄 锌谢邪薪',
+    encourage: '袨斜薪芯胁懈褌褜 褋械泄褔邪褋',
+    encourageShort: '袨斜薪芯胁懈褌褜',
+  },
+  viewBilling: '校锌褉邪胁谢械薪懈械 褋褔械褌邪屑懈 懈 锌芯写锌懈褋泻邪屑懈',
+  buyPermissionDeniedTip: '袩芯卸邪谢褍泄褋褌邪, 褋胁褟卸懈褌械褋褜 褋 邪写屑懈薪懈褋褌褉邪褌芯褉芯屑 胁邪褕械泄 芯褉谐邪薪懈蟹邪褑懈懈, 褔褌芯斜褘 锌芯写锌懈褋邪褌褜褋褟',
+  plansCommon: {
+    title: '袙褘斜械褉懈褌械 褌邪褉懈褎薪褘泄 锌谢邪薪, 泻芯褌芯褉褘泄 锌芯写褏芯写懈褌 懈屑械薪薪芯 胁邪屑',
+    yearlyTip: '袩芯谢褍褔懈褌械 2 屑械褋褟褑邪 斜械褋锌谢邪褌薪芯, 锌芯写锌懈褋邪胁褕懈褋褜 薪邪 谐芯写!',
+    mostPopular: '小邪屑褘泄 锌芯锌褍谢褟褉薪褘泄',
+    planRange: {
+      monthly: '袝卸械屑械褋褟褔薪芯',
+      yearly: '袝卸械谐芯写薪芯',
+    },
+    month: '屑械褋褟褑',
+    year: '谐芯写',
+    save: '小褝泻芯薪芯屑懈褌褜 ',
+    free: '袘械褋锌谢邪褌薪芯',
+    currentPlan: '孝械泻褍褖懈泄 褌邪褉懈褎薪褘泄 锌谢邪薪',
+    contractSales: '小胁褟蟹邪褌褜褋褟 褋 芯褌写械谢芯屑 锌褉芯写邪卸',
+    contractOwner: '小胁褟蟹邪褌褜褋褟 褋 褉褍泻芯胁芯写懈褌械谢械屑 泻芯屑邪薪写褘',
+    startForFree: '袧邪褔邪褌褜 斜械褋锌谢邪褌薪芯',
+    getStartedWith: '袧邪褔邪褌褜 褋 ',
+    contactSales: '小胁褟蟹邪褌褜褋褟 褋 芯褌写械谢芯屑 锌褉芯写邪卸',
+    talkToSales: '袩芯谐芯胁芯褉懈褌褜 褋 芯褌写械谢芯屑 锌褉芯写邪卸',
+    modelProviders: '袩芯褋褌邪胁褖懈泻懈 屑芯写械谢械泄',
+    teamMembers: '校褔邪褋褌薪懈泻懈 泻芯屑邪薪写褘',
+    annotationQuota: '袣胁芯褌邪 邪薪薪芯褌邪褑懈泄',
+    buildApps: '小芯蟹写邪褌褜 锌褉懈谢芯卸械薪懈褟',
+    vectorSpace: '袙械泻褌芯褉薪芯械 锌褉芯褋褌褉邪薪褋褌胁芯',
+    vectorSpaceBillingTooltip: '袣邪卸写褘泄 1 袦袘 屑芯卸械褌 褏褉邪薪懈褌褜 芯泻芯谢芯 1,2 屑懈谢谢懈芯薪邪 褋懈屑胁芯谢芯胁 胁械泻褌芯褉懈蟹芯胁邪薪薪褘褏 写邪薪薪褘褏 (芯褑械薪泻邪 褋 懈褋锌芯谢褜蟹芯胁邪薪懈械屑 Embeddings OpenAI, 胁邪褉褜懈褉褍械褌褋褟 胁 蟹邪胁懈褋懈屑芯褋褌懈 芯褌 屑芯写械谢懈).',
+    vectorSpaceTooltip: '袙械泻褌芯褉薪芯械 锌褉芯褋褌褉邪薪褋褌胁芯 - 褝褌芯 褋懈褋褌械屑邪 写芯谢谐芯胁褉械屑械薪薪芯泄 锌邪屑褟褌懈, 薪械芯斜褏芯写懈屑邪褟 LLM 写谢褟 锌芯薪懈屑邪薪懈褟 胁邪褕懈褏 写邪薪薪褘褏.',
+    documentsUploadQuota: '袣胁芯褌邪 蟹邪谐褉褍蟹泻懈 写芯泻褍屑械薪褌芯胁',
+    documentProcessingPriority: '袩褉懈芯褉懈褌械褌 芯斜褉邪斜芯褌泻懈 写芯泻褍屑械薪褌芯胁',
+    documentProcessingPriorityTip: '袛谢褟 斜芯谢械械 胁褘褋芯泻芯谐芯 锌褉懈芯褉懈褌械褌邪 芯斜褉邪斜芯褌泻懈 写芯泻褍屑械薪褌芯胁, 锌芯卸邪谢褍泄褋褌邪, 芯斜薪芯胁懈褌械 褋胁芯泄 褌邪褉懈褎薪褘泄 锌谢邪薪.',
+    documentProcessingPriorityUpgrade: '袨斜褉邪斜邪褌褘胁邪泄褌械 斜芯谢褜褕械 写邪薪薪褘褏 褋 斜芯谢褜褕械泄 褌芯褔薪芯褋褌褜褞 懈 薪邪 斜芯谢械械 胁褘褋芯泻懈褏 褋泻芯褉芯褋褌褟褏.',
+    priority: {
+      'standard': '小褌邪薪写邪褉褌薪褘泄',
+      'priority': '袩褉懈芯褉懈褌械褌薪褘泄',
+      'top-priority': '袙褘褋芯泻懈泄 锌褉懈芯褉懈褌械褌',
+    },
+    logsHistory: '袠褋褌芯褉懈褟 卸褍褉薪邪谢芯胁',
+    customTools: '袩芯谢褜蟹芯胁邪褌械谢褜褋泻懈械 懈薪褋褌褉褍屑械薪褌褘',
+    unavailable: '袧械写芯褋褌褍锌薪芯',
+    days: '写薪械泄',
+    unlimited: '袧械芯谐褉邪薪懈褔械薪薪芯',
+    support: '袩芯写写械褉卸泻邪',
+    supportItems: {
+      communityForums: '肖芯褉褍屑褘 褋芯芯斜褖械褋褌胁邪',
+      emailSupport: '袩芯写写械褉卸泻邪 锌芯 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌械',
+      priorityEmail: '袩褉懈芯褉懈褌械褌薪邪褟 锌芯写写械褉卸泻邪 锌芯 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌械 懈 胁 褔邪褌械',
+      logoChange: '袠蟹屑械薪械薪懈械 谢芯谐芯褌懈锌邪',
+      SSOAuthentication: 'SSO 邪褍褌械薪褌懈褎懈泻邪褑懈褟',
+      personalizedSupport: '袩械褉褋芯薪邪谢褜薪邪褟 锌芯写写械褉卸泻邪',
+      dedicatedAPISupport: '袙褘写械谢械薪薪邪褟 锌芯写写械褉卸泻邪 API',
+      customIntegration: '袩芯谢褜蟹芯胁邪褌械谢褜褋泻邪褟 懈薪褌械谐褉邪褑懈褟 懈 锌芯写写械褉卸泻邪',
+      ragAPIRequest: '袟邪锌褉芯褋褘 RAG API',
+      bulkUpload: '袦邪褋褋芯胁邪褟 蟹邪谐褉褍蟹泻邪 写芯泻褍屑械薪褌芯胁',
+      agentMode: '袪械卸懈屑 邪谐械薪褌邪',
+      workflow: '袪邪斜芯褔懈泄 锌褉芯褑械褋褋',
+      llmLoadingBalancing: '袘邪谢邪薪褋懈褉芯胁泻邪 薪邪谐褉褍蟹泻懈 LLM',
+      llmLoadingBalancingTooltip: '袛芯斜邪胁褜褌械 薪械褋泻芯谢褜泻芯 泻谢褞褔械泄 API 泻 屑芯写械谢褟屑, 褝褎褎械泻褌懈胁薪芯 芯斜褏芯写褟 芯谐褉邪薪懈褔械薪懈褟 褋泻芯褉芯褋褌懈 API.',
+    },
+    comingSoon: '小泻芯褉芯',
+    member: '校褔邪褋褌薪懈泻',
+    memberAfter: '校褔邪褋褌薪懈泻',
+    messageRequest: {
+      title: '袣褉械写懈褌褘 薪邪 褋芯芯斜褖械薪懈褟',
+      tooltip: '袣胁芯褌褘 胁褘蟹芯胁邪 褋芯芯斜褖械薪懈泄 写谢褟 褉邪蟹谢懈褔薪褘褏 褌邪褉懈褎薪褘褏 锌谢邪薪芯胁, 懈褋锌芯谢褜蟹褍褞褖懈褏 屑芯写械谢懈 OpenAI (泻褉芯屑械 gpt4). 小芯芯斜褖械薪懈褟, 锌褉械胁褘褕邪褞褖懈械 谢懈屑懈褌, 斜褍写褍褌 懈褋锌芯谢褜蟹芯胁邪褌褜 胁邪褕 泻谢褞褔 API OpenAI.',
+      titlePerMonth: '{{count,number}} 褋芯芯斜褖械薪懈泄/屑械褋褟褑',
+    },
+    annotatedResponse: {
+      title: '袨谐褉邪薪懈褔械薪懈褟 泻胁芯褌褘 邪薪薪芯褌邪褑懈泄',
+      tooltip: '袪褍褔薪芯械 褉械写邪泻褌懈褉芯胁邪薪懈械 懈 邪薪薪芯褌懈褉芯胁邪薪懈械 芯褌胁械褌芯胁 芯斜械褋锌械褔懈胁邪械褌 薪邪褋褌褉邪懈胁邪械屑褘械 胁褘褋芯泻芯泻邪褔械褋褌胁械薪薪褘械 胁芯蟹屑芯卸薪芯褋褌懈 芯褌胁械褌芯胁 薪邪 胁芯锌褉芯褋褘 写谢褟 锌褉懈谢芯卸械薪懈泄. (袩褉懈屑械薪懈屑芯 褌芯谢褜泻芯 胁 褔邪褌-锌褉懈谢芯卸械薪懈褟褏)',
+    },
+    ragAPIRequestTooltip: '袨褌薪芯褋懈褌褋褟 泻 泻芯谢懈褔械褋褌胁褍 胁褘蟹芯胁芯胁 API, 胁褘蟹褘胁邪褞褖懈褏 褌芯谢褜泻芯 胁芯蟹屑芯卸薪芯褋褌懈 芯斜褉邪斜芯褌泻懈 斜邪蟹褘 蟹薪邪薪懈泄 Dify.',
+    receiptInfo: '孝芯谢褜泻芯 胁谢邪写械谢械褑 泻芯屑邪薪写褘 懈 邪写屑懈薪懈褋褌褉邪褌芯褉 泻芯屑邪薪写褘 屑芯谐褍褌 锌芯写锌懈褋褘胁邪褌褜褋褟 懈 锌褉芯褋屑邪褌褉懈胁邪褌褜 懈薪褎芯褉屑邪褑懈褞 芯 胁褘褋褌邪胁谢械薪懈懈 褋褔械褌芯胁',
+    cloud: '袨斜谢邪褔薪褘泄 褋械褉胁懈褋',
+    annualBilling: '袝卸械谐芯写薪邪褟 芯锌谢邪褌邪',
+    apiRateLimit: '袨谐褉邪薪懈褔械薪懈械 褋泻芯褉芯褋褌懈 API',
+    self: '小邪屑芯褋褌芯褟褌械谢褜薪芯 褉邪蟹屑械褖械薪薪褘泄',
+    teamMember_other: '{{count,number}} 效谢械薪褘 泻芯屑邪薪写褘',
+    apiRateLimitUnit: '{{count,number}}/写械薪褜',
+    unlimitedApiRate: '袧械褌 芯谐褉邪薪懈褔械薪懈泄 薪邪 泻芯谢懈褔械褋褌胁芯 蟹邪锌褉芯褋芯胁 泻 API',
+    freeTrialTip: '斜械褋锌谢邪褌薪邪褟 锌褉芯斜薪邪褟 胁械褉褋懈褟 懈蟹 200 胁褘蟹芯胁芯胁 OpenAI.',
+    freeTrialTipSuffix: '袣褉械写懈褌薪邪褟 泻邪褉褌邪 薪械 褌褉械斜褍械褌褋褟',
+    teamMember_one: '{{count,number}} 效谢械薪 泻芯屑邪薪写褘',
+    getStarted: '袧邪褔邪褌褜',
+    teamWorkspace: '{{count,number}} 袣芯屑邪薪写薪芯械 褉邪斜芯褔械械 锌褉芯褋褌褉邪薪褋褌胁芯',
+    freeTrialTipPrefix: '袟邪褉械谐懈褋褌褉懈褉褍泄褌械褋褜 懈 锌芯谢褍褔懈褌械',
+    comparePlanAndFeatures: '小褉邪胁薪懈褌械 锌谢邪薪褘 懈 褎褍薪泻褑懈懈',
+    documents: '{{count,number}} 袛芯泻褍屑械薪褌芯胁 蟹薪邪薪懈泄',
+    documentsRequestQuota: '{{count,number}}/屑懈薪 袥懈屑懈褌 效邪褋褌芯褌褘 袟邪锌褉芯褋芯胁 薪邪 袟薪邪薪懈械',
+    apiRateLimitTooltip: '袨谐褉邪薪懈褔械薪懈械 褋泻芯褉芯褋褌懈 API 锌褉懈屑械薪褟械褌褋褟 泻芯 胁褋械屑 蟹邪锌褉芯褋邪屑, 褋写械谢邪薪薪褘屑 褔械褉械蟹 API Dify, 胁泻谢褞褔邪褟 谐械薪械褉邪褑懈褞 褌械泻褋褌邪, 褔邪褌芯胁褍褞 锌械褉械锌懈褋泻褍, 胁褘锌芯谢薪械薪懈械 褉邪斜芯褔懈褏 锌褉芯褑械褋褋芯胁 懈 芯斜褉邪斜芯褌泻褍 写芯泻褍屑械薪褌芯胁.',
+    documentsRequestQuotaTooltip: '校泻邪蟹褘胁邪械褌 芯斜褖械械 泻芯谢懈褔械褋褌胁芯 写械泄褋褌胁懈泄, 泻芯褌芯褉褘械 褉邪斜芯褔邪褟 芯斜谢邪褋褌褜 屑芯卸械褌 胁褘锌芯谢薪褟褌褜 胁 屑懈薪褍褌褍 胁薪褍褌褉懈 斜邪蟹褘 蟹薪邪薪懈泄, 胁泻谢褞褔邪褟 褋芯蟹写邪薪懈械, 褍写邪谢械薪懈械, 芯斜薪芯胁谢械薪懈械 薪邪斜芯褉芯胁 写邪薪薪褘褏, 蟹邪谐褉褍蟹泻褍 写芯泻褍屑械薪褌芯胁, 屑芯写懈褎懈泻邪褑懈懈, 邪褉褏懈胁懈褉芯胁邪薪懈械 懈 蟹邪锌褉芯褋褘 泻 斜邪蟹械 蟹薪邪薪懈泄. 协褌邪 屑械褌褉懈泻邪 懈褋锌芯谢褜蟹褍械褌褋褟 写谢褟 芯褑械薪泻懈 锌褉芯懈蟹胁芯写懈褌械谢褜薪芯褋褌懈 蟹邪锌褉芯褋芯胁 泻 斜邪蟹械 蟹薪邪薪懈泄. 袧邪锌褉懈屑械褉, 械褋谢懈 锌芯谢褜蟹芯胁邪褌械谢褜 Sandbox 胁褘锌芯谢薪褟械褌 10 锌芯褋谢械写芯胁邪褌械谢褜薪褘褏 褌械褋褌芯胁 蟹邪 芯写懈薪 屑懈薪褍褌褍, 械谐芯 褉邪斜芯褔邪褟 芯斜谢邪褋褌褜 斜褍写械褌 胁褉械屑械薪薪芯 芯谐褉邪薪懈褔械薪邪 胁 胁褘锌芯谢薪械薪懈懈 褋谢械写褍褞褖懈褏 写械泄褋褌胁懈泄 胁 褌械褔械薪懈械 褋谢械写褍褞褖械泄 屑懈薪褍褌褘: 褋芯蟹写邪薪懈械, 褍写邪谢械薪懈械, 芯斜薪芯胁谢械薪懈械 薪邪斜芯褉芯胁 写邪薪薪褘褏 懈 蟹邪谐褉褍蟹泻邪 懈谢懈 屑芯写懈褎懈泻邪褑懈褟 写芯泻褍屑械薪褌芯胁.',
+    priceTip: '锌芯 褉邪斜芯褔械屑褍 屑械褋褌褍/',
+    documentsTooltip: '袣胁芯褌邪 薪邪 泻芯谢懈褔械褋褌胁芯 写芯泻褍屑械薪褌芯胁, 懈屑锌芯褉褌懈褉褍械屑褘褏 懈蟹 懈褋褌芯褔薪懈泻邪 蟹薪邪薪懈泄.',
+  },
+  plans: {
+    sandbox: {
+      name: '袩械褋芯褔薪懈褑邪',
+      description: '200 斜械褋锌谢邪褌薪褘褏 锌褉芯斜薪褘褏 懈褋锌芯谢褜蟹芯胁邪薪懈泄 GPT',
+      includesTitle: '袙泻谢褞褔邪械褌:',
+      for: '袘械褋锌谢邪褌薪邪褟 锌褉芯斜薪邪褟 胁械褉褋懈褟 芯褋薪芯胁薪褘褏 胁芯蟹屑芯卸薪芯褋褌械泄',
+    },
+    professional: {
+      name: '袩褉芯褎械褋褋懈芯薪邪谢褜薪褘泄',
+      description: '袛谢褟 褔邪褋褌薪褘褏 谢懈褑 懈 薪械斜芯谢褜褕懈褏 泻芯屑邪薪写, 褔褌芯斜褘 褉邪蟹斜谢芯泻懈褉芯胁邪褌褜 斜芯谢褜褕械 胁芯蟹屑芯卸薪芯褋褌械泄 锌芯 写芯褋褌褍锌薪芯泄 褑械薪械.',
+      includesTitle: '袙褋械 胁 斜械褋锌谢邪褌薪芯屑 锌谢邪薪械, 锌谢褞褋:',
+      for: '袛谢褟 薪械蟹邪胁懈褋懈屑褘褏 褉邪蟹褉邪斜芯褌褔懈泻芯胁/屑邪谢褘褏 泻芯屑邪薪写',
+    },
+    team: {
+      name: '袣芯屑邪薪写邪',
+      description: '小芯褌褉褍写薪懈褔邪泄褌械 斜械蟹 芯谐褉邪薪懈褔械薪懈泄 懈 薪邪褋谢邪卸写邪泄褌械褋褜 胁褘褋芯褔邪泄褕械泄 锌褉芯懈蟹胁芯写懈褌械谢褜薪芯褋褌褜褞.',
+      includesTitle: '袙褋械 胁 锌褉芯褎械褋褋懈芯薪邪谢褜薪芯屑 锌谢邪薪械, 锌谢褞褋:',
+      for: '袛谢褟 泻芯屑邪薪写 褋褉械写薪械谐芯 褉邪蟹屑械褉邪',
+    },
+    enterprise: {
+      name: '袣芯褉锌芯褉邪褌懈胁薪褘泄',
+      description: '袩芯谢褍褔懈褌械 锌芯谢薪褘泄 薪邪斜芯褉 胁芯蟹屑芯卸薪芯褋褌械泄 懈 锌芯写写械褉卸泻褍 写谢褟 泻褉褍锌薪芯屑邪褋褕褌邪斜薪褘褏 泻褉懈褌懈褔械褋泻懈 胁邪卸薪褘褏 褋懈褋褌械屑.',
+      includesTitle: '袙褋械 胁 泻芯屑邪薪写薪芯屑 锌谢邪薪械, 锌谢褞褋:',
+      features: {
+        7: '袨斜薪芯胁谢械薪懈褟 懈 芯斜褋谢褍卸懈胁邪薪懈械 芯褌 Dify 芯褎懈褑懈邪谢褜薪芯',
+        4: '小小袨',
+        8: '袩褉芯褎械褋褋懈芯薪邪谢褜薪邪褟 褌械褏薪懈褔械褋泻邪褟 锌芯写写械褉卸泻邪',
+        6: '小芯胁褉械屑械薪薪邪褟 斜械蟹芯锌邪褋薪芯褋褌褜 懈 泻芯薪褌褉芯谢褜',
+        2: '协泻褋泻谢褞蟹懈胁薪褘械 褎褍薪泻褑懈懈 写谢褟 锌褉械写锌褉懈褟褌懈泄',
+        1: '袣芯屑屑械褉褔械褋泻邪褟 谢懈褑械薪蟹懈褟',
+        3: '袦薪芯卸械褋褌胁械薪薪褘械 褉邪斜芯褔懈械 芯斜谢邪褋褌懈 懈 褍锌褉邪胁谢械薪懈械 锌褉械写锌褉懈褟褌懈械屑',
+        0: '袪械褕械薪懈褟 写谢褟 屑邪褋褕褌邪斜懈褉褍械屑芯谐芯 褉邪蟹胁械褉褌褘胁邪薪懈褟 泻芯褉锌芯褉邪褌懈胁薪芯谐芯 褍褉芯胁薪褟',
+        5: '小芯谐谢邪褋芯胁邪薪薪褘械 小芯谐谢邪褕械薪懈褟 芯斜 校褉芯胁薪械 校褋谢褍谐 芯褌 Dify Partners',
+      },
+      price: '袩芯谢褜蟹芯胁邪褌械谢褜褋泻懈泄',
+      priceTip: '孝芯谢褜泻芯 谐芯写芯胁邪褟 锌芯写锌懈褋泻邪',
+      for: '袛谢褟 泻芯屑邪薪写 斜芯谢褜褕芯谐芯 褉邪蟹屑械褉邪',
+      btnText: '小胁褟蟹邪褌褜褋褟 褋 芯褌写械谢芯屑 锌褉芯写邪卸',
+    },
+    community: {
+      features: {
+        0: '袙褋械 芯褋薪芯胁薪褘械 褎褍薪泻褑懈懈 胁褘锌褍褖械薪褘 胁 锌褍斜谢懈褔薪芯屑 褉械锌芯蟹懈褌芯褉懈懈',
+        1: '袝写懈薪芯械 褉邪斜芯褔械械 锌褉芯褋褌褉邪薪褋褌胁芯',
+        2: '小芯斜谢褞写邪械褌 袥懈褑械薪蟹懈褞 薪邪 芯褌泻褉褘褌芯械 锌褉芯谐褉邪屑屑薪芯械 芯斜械褋锌械褔械薪懈械 Dify',
+      },
+      name: '小芯芯斜褖械褋褌胁芯',
+      btnText: '袧邪褔薪懈褌械 褋 褋芯芯斜褖械褋褌胁邪',
+      price: '小胁芯斜芯写薪芯',
+      includesTitle: '袘械褋锌谢邪褌薪褘械 褎褍薪泻褑懈懈:',
+      description: '袛谢褟 芯褌写械谢褜薪褘褏 锌芯谢褜蟹芯胁邪褌械谢械泄, 屑邪谢褘褏 泻芯屑邪薪写 懈谢懈 薪械泻芯屑屑械褉褔械褋泻懈褏 锌褉芯械泻褌芯胁',
+      for: '袛谢褟 芯褌写械谢褜薪褘褏 锌芯谢褜蟹芯胁邪褌械谢械泄, 屑邪谢褘褏 泻芯屑邪薪写 懈谢懈 薪械泻芯屑屑械褉褔械褋泻懈褏 锌褉芯械泻褌芯胁',
+    },
+    premium: {
+      features: {
+        3: '袩褉懈芯褉懈褌械褌薪邪褟 锌芯写写械褉卸泻邪 锌芯 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌械 懈 褔邪褌褍',
+        1: '袝写懈薪芯械 褉邪斜芯褔械械 锌褉芯褋褌褉邪薪褋褌胁芯',
+        2: '袧邪褋褌褉芯泄泻邪 谢芯谐芯褌懈锌邪 懈 斜褉械薪写懈薪谐邪 胁械斜-锌褉懈谢芯卸械薪懈褟',
+        0: '小邪屑芯褋褌芯褟褌械谢褜薪芯械 褍锌褉邪胁谢械薪懈械 薪邪写械卸薪芯褋褌褜褞 褉邪蟹谢懈褔薪褘屑懈 芯斜谢邪褔薪褘屑懈 锌褉芯胁邪泄写械褉邪屑懈',
+      },
+      description: '袛谢褟 褋褉械写薪懈褏 芯褉谐邪薪懈蟹邪褑懈泄 懈 泻芯屑邪薪写',
+      includesTitle: '袙褋褢 懈蟹 小芯芯斜褖械褋褌胁邪, 锌谢褞褋:',
+      priceTip: '袧邪 芯褋薪芯胁械 芯斜谢邪褔薪芯谐芯 屑邪褉泻械褌锌谢械泄褋邪',
+      btnText: '袩芯谢褍褔懈褌械 袩褉械屑懈褍屑 胁',
+      comingSoon: '袩芯写写械褉卸泻邪 Microsoft Azure 懈 Google Cloud 褋泻芯褉芯 锌芯褟胁懈褌褋褟',
+      price: '袦邪褋褕褌邪斜懈褉褍械屑褘泄',
+      for: '袛谢褟 褋褉械写薪懈褏 芯褉谐邪薪懈蟹邪褑懈泄 懈 泻芯屑邪薪写',
+      name: '袩褉械屑懈褍屑',
+    },
+  },
+  vectorSpace: {
+    fullTip: '袙械泻褌芯褉薪芯械 锌褉芯褋褌褉邪薪褋褌胁芯 蟹邪锌芯谢薪械薪芯.',
+    fullSolution: '袨斜薪芯胁懈褌械 褋胁芯泄 褌邪褉懈褎薪褘泄 锌谢邪薪, 褔褌芯斜褘 锌芯谢褍褔懈褌褜 斜芯谢褜褕械 屑械褋褌邪.',
+  },
+  apps: {
+    fullTipLine1: '袨斜薪芯胁懈褌械 褋胁芯泄 褌邪褉懈褎薪褘泄 锌谢邪薪, 褔褌芯斜褘',
+    fullTipLine2: '褋芯蟹写邪胁邪褌褜 斜芯谢褜褕械 锌褉懈谢芯卸械薪懈泄.',
+    fullTip2des: '袪械泻芯屑械薪写褍械褌褋褟 褍写邪谢懈褌褜 薪械邪泻褌懈胁薪褘械 锌褉懈谢芯卸械薪懈褟, 褔褌芯斜褘 芯褋胁芯斜芯写懈褌褜 屑械褋褌芯, 懈谢懈 褋胁褟卸懈褌械褋褜 褋 薪邪屑懈.',
+    fullTip2: '袛芯褋褌懈谐薪褍褌 谢懈屑懈褌 锌谢邪薪邪',
+    contactUs: '小胁褟卸懈褌械褋褜 褋 薪邪屑懈',
+    fullTip1des: '袙褘 写芯褋褌懈谐谢懈 锌褉械写械谢邪 褋芯蟹写邪薪懈褟 锌褉懈谢芯卸械薪懈泄 锌芯 褝褌芯屑褍 锌谢邪薪褍',
+    fullTip1: '袨斜薪芯胁懈褌械, 褔褌芯斜褘 褋芯蟹写邪褌褜 斜芯谢褜褕械 锌褉懈谢芯卸械薪懈泄',
+  },
+  annotatedResponse: {
+    fullTipLine1: '袨斜薪芯胁懈褌械 褋胁芯泄 褌邪褉懈褎薪褘泄 锌谢邪薪, 褔褌芯斜褘',
+    fullTipLine2: '邪薪薪芯褌懈褉芯胁邪褌褜 斜芯谢褜褕械 褉邪蟹谐芯胁芯褉芯胁.',
+    quotaTitle: '袣胁芯褌邪 芯褌胁械褌芯胁 邪薪薪芯褌邪褑懈泄',
+  },
+  usagePage: {
+    buildApps: '小芯蟹写邪胁邪泄褌械 锌褉懈谢芯卸械薪懈褟',
+    teamMembers: '效谢械薪褘 泻芯屑邪薪写褘',
+    vectorSpaceTooltip: '袛芯泻褍屑械薪褌褘 褋 褉械卸懈屑芯屑 懈薪写械泻褋懈褉芯胁邪薪懈褟 胁褘褋芯泻芯谐芯 泻邪褔械褋褌胁邪 斜褍写褍褌 锌芯褌褉械斜谢褟褌褜 褉械褋褍褉褋褘 啸褉邪薪懈谢懈褖邪 袟薪邪薪懈泄. 袣芯谐写邪 啸褉邪薪懈谢懈褖械 袟薪邪薪懈泄 写芯褋褌懈谐薪械褌 锌褉械写械谢邪, 薪芯胁褘械 写芯泻褍屑械薪褌褘 薪械 斜褍写褍褌 蟹邪谐褉褍卸械薪褘.',
+    annotationQuota: '袣胁芯褌邪 邪薪薪芯褌邪褑懈懈',
+    vectorSpace: '啸褉邪薪懈谢懈褖械 写邪薪薪褘褏 蟹薪邪薪懈泄',
+    documentsUploadQuota: '袣胁芯褌邪 薪邪 蟹邪谐褉褍蟹泻褍 写芯泻褍屑械薪褌芯胁',
+  },
+  teamMembers: '效谢械薪褘 泻芯屑邪薪写褘',
+}
+
+export default translation
diff --git a/i18n/ru-RU/common.ts b/i18n/ru-RU/common.ts
new file mode 100644
index 0000000..1c7b411
--- /dev/null
+++ b/i18n/ru-RU/common.ts
@@ -0,0 +1,672 @@
+const translation = {
+  api: {
+    success: '校褋锌械褕薪芯',
+    actionSuccess: '袛械泄褋褌胁懈械 胁褘锌芯谢薪械薪芯 褍褋锌械褕薪芯',
+    saved: '小芯褏褉邪薪械薪芯',
+    create: '小芯蟹写邪薪芯',
+    remove: '校写邪谢械薪芯',
+  },
+  operation: {
+    create: '小芯蟹写邪褌褜',
+    confirm: '袩芯写褌胁械褉写懈褌褜',
+    cancel: '袨褌屑械薪邪',
+    clear: '袨褔懈褋褌懈褌褜',
+    save: '小芯褏褉邪薪懈褌褜',
+    saveAndEnable: '小芯褏褉邪薪懈褌褜 懈 胁泻谢褞褔懈褌褜',
+    edit: '袪械写邪泻褌懈褉芯胁邪褌褜',
+    add: '袛芯斜邪胁懈褌褜',
+    added: '袛芯斜邪胁谢械薪芯',
+    refresh: '袩械褉械蟹邪锌褍褋褌懈褌褜',
+    reset: '小斜褉芯褋懈褌褜',
+    search: '袩芯懈褋泻',
+    change: '袠蟹屑械薪懈褌褜',
+    remove: '校写邪谢懈褌褜',
+    send: '袨褌锌褉邪胁懈褌褜',
+    copy: '袣芯锌懈褉芯胁邪褌褜',
+    lineBreak: '袪邪蟹褉褘胁 褋褌褉芯泻懈',
+    sure: '携 褍胁械褉械薪',
+    download: '小泻邪褔邪褌褜',
+    delete: '校写邪谢懈褌褜',
+    settings: '袧邪褋褌褉芯泄泻懈',
+    setup: '袧邪褋褌褉芯懈褌褜',
+    getForFree: '袩芯谢褍褔懈褌褜 斜械褋锌谢邪褌薪芯',
+    reload: '袩械褉械蟹邪谐褉褍蟹懈褌褜',
+    ok: '袨袣',
+    log: '袞褍褉薪邪谢',
+    learnMore: '校蟹薪邪褌褜 斜芯谢褜褕械',
+    params: '袩邪褉邪屑械褌褉褘',
+    duplicate: '袛褍斜谢懈褉芯胁邪褌褜',
+    rename: '袩械褉械懈屑械薪芯胁邪褌褜',
+    audioSourceUnavailable: 'AudioSource 薪械写芯褋褌褍锌械薪',
+    zoomIn: '校胁械谢懈褔懈褌褜',
+    zoomOut: '校屑械薪褜褕械薪懈械 屑邪褋褕褌邪斜邪',
+    openInNewTab: '袨褌泻褉褘褌褜 胁 薪芯胁芯泄 胁泻谢邪写泻械',
+    copyImage: '小泻芯锌懈褉芯胁邪褌褜 懈蟹芯斜褉邪卸械薪懈械',
+    close: '袟邪泻褉褘胁邪褌褜',
+    regenerate: '袪械谐械薪械褉懈褉芯胁邪褌褜',
+    view: '袙懈写',
+    viewMore: '袩袨袛袪袨袘袧袝袝',
+    saveAndRegenerate: '小芯褏褉邪薪械薪懈械 懈 锌芯胁褌芯褉薪芯械 褋芯蟹写邪薪懈械 写芯褔械褉薪懈褏 斜谢芯泻芯胁',
+    submit: '袨褌锌褉邪胁懈褌褜',
+    skip: '袣芯褉邪斜谢褜',
+    imageCopied: '小泻芯锌懈褉芯胁邪薪薪芯械 懈蟹芯斜褉邪卸械薪懈械',
+    deleteApp: '校写邪谢懈褌褜 锌褉懈谢芯卸械薪懈械',
+    copied: '小泻芯锌懈褉芯胁邪薪褘',
+    in: '胁',
+    viewDetails: '袩芯写褉芯斜薪械械',
+    format: '肖芯褉屑邪褌',
+    more: '袘芯谢褜褕械',
+    downloadFailed: '小泻邪褔懈胁邪薪懈械 薪械 褍写邪谢芯褋褜. 袩芯卸邪谢褍泄褋褌邪, 锌芯锌褉芯斜褍泄褌械 械褖械 褉邪蟹 锌芯蟹卸械.',
+    downloadSuccess: '袟邪谐褉褍蟹泻邪 蟹邪胁械褉褕械薪邪.',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 芯斜褟蟹邪褌械谢褜薪芯',
+    urlError: 'URL 写芯谢卸械薪 薪邪褔懈薪邪褌褜褋褟 褋 http:// 懈谢懈 https://',
+  },
+  placeholder: {
+    input: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械',
+    select: '袩芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械',
+  },
+  voice: {
+    language: {
+      zhHans: '袣懈褌邪泄褋泻懈泄',
+      zhHant: '孝褉邪写懈褑懈芯薪薪褘泄 泻懈褌邪泄褋泻懈泄',
+      enUS: '袗薪谐谢懈泄褋泻懈泄',
+      deDE: '袧械屑械褑泻懈泄',
+      frFR: '肖褉邪薪褑褍蟹褋泻懈泄',
+      esES: '袠褋锌邪薪褋泻懈泄',
+      itIT: '袠褌邪谢褜褟薪褋泻懈泄',
+      thTH: '孝邪泄褋泻懈泄',
+      idID: '袠薪写芯薪械蟹懈泄褋泻懈泄',
+      jaJP: '携锌芯薪褋泻懈泄',
+      koKR: '袣芯褉械泄褋泻懈泄',
+      ptBR: '袩芯褉褌褍谐邪谢褜褋泻懈泄',
+      ruRU: '袪褍褋褋泻懈泄',
+      ukUA: '校泻褉邪懈薪褋泻懈泄',
+      viVN: '袙褜械褌薪邪屑褋泻懈泄',
+      plPL: '袩芯谢褜褋泻懈泄',
+      roRO: '袪褍屑褘薪褋泻懈泄',
+      hiIN: '啸懈薪写懈',
+      trTR: '孝褍褉械褑泻懈泄',
+      faIR: '袩械褉褋懈写褋泻懈泄',
+    },
+  },
+  unit: {
+    char: '褋懈屑胁芯谢芯胁',
+  },
+  actionMsg: {
+    noModification: '袧邪 写邪薪薪褘泄 屑芯屑械薪褌 薪械褌 懈蟹屑械薪械薪懈泄.',
+    modifiedSuccessfully: '袠蟹屑械薪械薪芯 褍褋锌械褕薪芯',
+    modifiedUnsuccessfully: '袠蟹屑械薪械薪芯 薪械褍写邪褔薪芯',
+    copySuccessfully: '小泻芯锌懈褉芯胁邪薪芯 褍褋锌械褕薪芯',
+    paySucceeded: '袨锌谢邪褌邪 锌褉芯褕谢邪 褍褋锌械褕薪芯',
+    payCancelled: '袨锌谢邪褌邪 芯褌屑械薪械薪邪',
+    generatedSuccessfully: '小谐械薪械褉懈褉芯胁邪薪芯 褍褋锌械褕薪芯',
+    generatedUnsuccessfully: '小谐械薪械褉懈褉芯胁邪薪芯 薪械褍写邪褔薪芯',
+  },
+  model: {
+    params: {
+      temperature: 'Temperature',
+      temperatureTip:
+        '袣芯薪褌褉芯谢懈褉褍械褌 褋谢褍褔邪泄薪芯褋褌褜: 斜芯谢械械 薪懈蟹泻芯械 蟹薪邪褔械薪懈械 锌褉懈胁芯写懈褌 泻 屑械薪械械 褋谢褍褔邪泄薪褘屑 蟹邪胁械褉褕械薪懈褟屑. 袩芯 屑械褉械 锌褉懈斜谢懈卸械薪懈褟 褌械屑锌械褉邪褌褍褉褘 泻 薪褍谢褞 屑芯写械谢褜 褋褌邪薪械褌 写械褌械褉屑懈薪懈褉芯胁邪薪薪芯泄 懈 锌芯胁褌芯褉褟褞褖械泄褋褟.',
+      top_p: 'Top P',
+      top_pTip:
+        '袣芯薪褌褉芯谢懈褉褍械褌 褉邪蟹薪芯芯斜褉邪蟹懈械 褋 锌芯屑芯褖褜褞 褟写械褉薪芯泄 胁褘斜芯褉泻懈: 0,5 芯蟹薪邪褔邪械褌, 褔褌芯 褉邪褋褋屑邪褌褉懈胁邪械褌褋褟 锌芯谢芯胁懈薪邪 胁褋械褏 胁邪褉懈邪薪褌芯胁, 胁蟹胁械褕械薪薪褘褏 锌芯 胁械褉芯褟褌薪芯褋褌懈.',
+      presence_penalty: 'Presence penalty',
+      presence_penaltyTip:
+        '袧邪褋泻芯谢褜泻芯 褕褌褉邪褎芯胁邪褌褜 薪芯胁褘械 褌芯泻械薪褘 胁 蟹邪胁懈褋懈屑芯褋褌懈 芯褌 褌芯谐芯, 锌芯褟胁谢褟褞褌褋褟 谢懈 芯薪懈 胁 褌械泻褋褌械 写芯 褋懈褏 锌芯褉.\n校胁械谢懈褔懈胁邪械褌 胁械褉芯褟褌薪芯褋褌褜 褌芯谐芯, 褔褌芯 屑芯写械谢褜 斜褍写械褌 谐芯胁芯褉懈褌褜 芯 薪芯胁褘褏 褌械屑邪褏.',
+      frequency_penalty: 'Frequency penalty',
+      frequency_penaltyTip:
+        '袧邪褋泻芯谢褜泻芯 褕褌褉邪褎芯胁邪褌褜 薪芯胁褘械 褌芯泻械薪褘 胁 蟹邪胁懈褋懈屑芯褋褌懈 芯褌 懈褏 褋褍褖械褋褌胁褍褞褖械泄 褔邪褋褌芯褌褘 胁 褌械泻褋褌械 写芯 褋懈褏 锌芯褉.\n校屑械薪褜褕邪械褌 胁械褉芯褟褌薪芯褋褌褜 褌芯谐芯, 褔褌芯 屑芯写械谢褜 斜褍写械褌 锌芯胁褌芯褉褟褌褜 芯写薪褍 懈 褌褍 卸械 褋褌褉芯泻褍 写芯褋谢芯胁薪芯.',
+      max_tokens: '袦邪泻褋懈屑邪谢褜薪芯械 泻芯谢懈褔械褋褌胁芯 褌芯泻械薪芯胁',
+      max_tokensTip:
+        '袠褋锌芯谢褜蟹褍械褌褋褟 写谢褟 芯谐褉邪薪懈褔械薪懈褟 屑邪泻褋懈屑邪谢褜薪芯泄 写谢懈薪褘 芯褌胁械褌邪 胁 褌芯泻械薪邪褏. \n袘芯谢褜褕懈械 蟹薪邪褔械薪懈褟 屑芯谐褍褌 芯谐褉邪薪懈褔懈胁邪褌褜 锌褉芯褋褌褉邪薪褋褌胁芯, 芯褋褌邪胁谢械薪薪芯械 写谢褟 锌芯写褋泻邪蟹芯泻, 卸褍褉薪邪谢芯胁 褔邪褌邪 懈 蟹薪邪薪懈泄. \n袪械泻芯屑械薪写褍械褌褋褟 褍褋褌邪薪芯胁懈褌褜 械谐芯 薪懈卸械 写胁褍褏 褌褉械褌械泄\ngpt-4-1106-preview, gpt-4-vision-preview max token (input 128k output 4k)',
+      maxTokenSettingTip: '袙邪褕邪 薪邪褋褌褉芯泄泻邪 屑邪泻褋懈屑邪谢褜薪芯谐芯 泻芯谢懈褔械褋褌胁邪 褌芯泻械薪芯胁 胁褘褋芯泻邪, 褔褌芯 锌芯褌械薪褑懈邪谢褜薪芯 芯谐褉邪薪懈褔懈胁邪械褌 锌褉芯褋褌褉邪薪褋褌胁芯 写谢褟 锌芯写褋泻邪蟹芯泻, 蟹邪锌褉芯褋芯胁 懈 写邪薪薪褘褏. 袩芯写褍屑邪泄褌械 芯 褌芯屑, 褔褌芯斜褘 褍褋褌邪薪芯胁懈褌褜 械谐芯 薪懈卸械 2/3.',
+      setToCurrentModelMaxTokenTip: '袦邪泻褋懈屑邪谢褜薪芯械 泻芯谢懈褔械褋褌胁芯 褌芯泻械薪芯胁 芯斜薪芯胁谢械薪芯 写芯 80% 屑邪泻褋懈屑邪谢褜薪芯谐芯 泻芯谢懈褔械褋褌胁邪 褌芯泻械薪芯胁 褌械泻褍褖械泄 屑芯写械谢懈 {{maxToken}}.',
+      stop_sequences: '小褌芯锌-锌芯褋谢械写芯胁邪褌械谢褜薪芯褋褌懈',
+      stop_sequencesTip: '袛芯 褔械褌褘褉械褏 锌芯褋谢械写芯胁邪褌械谢褜薪芯褋褌械泄, 谐写械 API聽锌褉械泻褉邪褌懈褌 谐械薪械褉懈褉芯胁邪褌褜 写邪谢褜薪械泄褕懈械 褌芯泻械薪褘.聽袙芯蟹胁褉邪褖邪械屑褘泄 褌械泻褋褌 薪械 斜褍写械褌 褋芯写械褉卸邪褌褜 褋褌芯锌-锌芯褋谢械写芯胁邪褌械谢褜薪芯褋褌褜.',
+      stop_sequencesPlaceholder: '袙胁械写懈褌械 锌芯褋谢械写芯胁邪褌械谢褜薪芯褋褌褜 懈 薪邪卸屑懈褌械 Tab',
+    },
+    tone: {
+      Creative: '孝胁芯褉褔械褋泻懈泄',
+      Balanced: '小斜邪谢邪薪褋懈褉芯胁邪薪薪褘泄',
+      Precise: '孝芯褔薪褘泄',
+      Custom: '袩芯谢褜蟹芯胁邪褌械谢褜褋泻懈泄',
+    },
+    addMoreModel: '袩械褉械泄写懈褌械 胁 薪邪褋褌褉芯泄泻懈, 褔褌芯斜褘 写芯斜邪胁懈褌褜 斜芯谢褜褕械 屑芯写械谢械泄',
+    capabilities: '袦褍谢褜褌懈屑芯写邪谢褜薪褘械 胁芯蟹屑芯卸薪芯褋褌懈',
+    settingsLink: '袧邪褋褌褉芯泄泻懈 锌芯褋褌邪胁褖懈泻邪 屑芯写械谢械泄',
+  },
+  menus: {
+    status: '斜械褌邪',
+    explore: '袠褋褋谢械写芯胁邪褌褜',
+    apps: '小褌褍写懈褟',
+    plugins: '袩谢邪谐懈薪褘',
+    pluginsTips: '袠薪褌械谐褉懈褉褍泄褌械 褋褌芯褉芯薪薪懈械 锌谢邪谐懈薪褘 懈谢懈 褋芯蟹写邪胁邪泄褌械 褋芯胁屑械褋褌懈屑褘械 褋 ChatGPT AI-锌谢邪谐懈薪褘.',
+    datasets: '袟薪邪薪懈褟',
+    datasetsTips: '小袣袨袪袨: 袠屑锌芯褉褌懈褉褍泄褌械 褋胁芯懈 褋芯斜褋褌胁械薪薪褘械 褌械泻褋褌芯胁褘械 写邪薪薪褘械 懈谢懈 蟹邪锌懈褋褘胁邪泄褌械 写邪薪薪褘械 胁 褉械卸懈屑械 褉械邪谢褜薪芯谐芯 胁褉械屑械薪懈 褔械褉械蟹 Webhook 写谢褟 褍谢褍褔褕械薪懈褟 泻芯薪褌械泻褋褌邪 LLM.',
+    newApp: '袧芯胁芯械 锌褉懈谢芯卸械薪懈械',
+    newDataset: '小芯蟹写邪褌褜 蟹薪邪薪懈褟',
+    tools: '袠薪褋褌褉褍屑械薪褌褘',
+    exploreMarketplace: '袩芯写褉芯斜薪械械 芯 Marketplace',
+  },
+  userProfile: {
+    settings: '袧邪褋褌褉芯泄泻懈',
+    emailSupport: '袩芯写写械褉卸泻邪 锌芯 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌械',
+    workspace: '袪邪斜芯褔械械 锌褉芯褋褌褉邪薪褋褌胁芯',
+    createWorkspace: '小芯蟹写邪褌褜 褉邪斜芯褔械械 锌褉芯褋褌褉邪薪褋褌胁芯',
+    helpCenter: '袩芯屑芯褖褜',
+    communityFeedback: '袨斜褉邪褌薪邪褟 褋胁褟蟹褜',
+    roadmap: '袩谢邪薪 褉邪蟹胁懈褌懈褟',
+    community: '小芯芯斜褖械褋褌胁芯',
+    about: '袨 薪邪褋',
+    logout: '袙褘泄褌懈',
+    github: '袚懈褌啸邪斜',
+    compliance: '小芯斜谢褞写械薪懈械',
+    support: '袩芯写写械褉卸泻邪',
+  },
+  settings: {
+    accountGroup: '袗袣袣袗校袧孝',
+    workplaceGroup: '袪袗袘袨效袝袝 袩袪袨小孝袪袗袧小孝袙袨',
+    account: '袦芯褟 褍褔械褌薪邪褟 蟹邪锌懈褋褜',
+    members: '校褔邪褋褌薪懈泻懈',
+    billing: '袨锌谢邪褌邪',
+    integrations: '袠薪褌械谐褉邪褑懈懈',
+    language: '携蟹褘泻',
+    provider: '袩芯褋褌邪胁褖懈泻 屑芯写械谢懈',
+    dataSource: '袠褋褌芯褔薪懈泻 写邪薪薪褘褏',
+    plugin: '袩谢邪谐懈薪褘',
+    apiBasedExtension: 'API 褉邪褋褕懈褉械薪懈械',
+    generalGroup: '袨袘些袝袝',
+  },
+  account: {
+    avatar: '袗胁邪褌邪褉',
+    name: '袠屑褟',
+    email: '协谢械泻褌褉芯薪薪邪褟 锌芯褔褌邪',
+    password: '袩邪褉芯谢褜',
+    passwordTip: '袙褘 屑芯卸械褌械 褍褋褌邪薪芯胁懈褌褜 锌芯褋褌芯褟薪薪褘泄 锌邪褉芯谢褜, 械褋谢懈 薪械 褏芯褌懈褌械 懈褋锌芯谢褜蟹芯胁邪褌褜 胁褉械屑械薪薪褘械 泻芯写褘 胁褏芯写邪',
+    setPassword: '校褋褌邪薪芯胁懈褌褜 锌邪褉芯谢褜',
+    resetPassword: '小斜褉芯褋懈褌褜 锌邪褉芯谢褜',
+    currentPassword: '孝械泻褍褖懈泄 锌邪褉芯谢褜',
+    newPassword: '袧芯胁褘泄 锌邪褉芯谢褜',
+    confirmPassword: '袩芯写褌胁械褉写懈褌械 锌邪褉芯谢褜',
+    notEqual: '袛胁邪 锌邪褉芯谢褟 褉邪蟹谢懈褔邪褞褌褋褟.',
+    langGeniusAccount: '校褔械褌薪邪褟 蟹邪锌懈褋褜 Dify',
+    langGeniusAccountTip: '袙邪褕邪 褍褔械褌薪邪褟 蟹邪锌懈褋褜 Dify 懈 褋胁褟蟹邪薪薪褘械 褋 薪械泄 锌芯谢褜蟹芯胁邪褌械谢褜褋泻懈械 写邪薪薪褘械.',
+    editName: '袪械写邪泻褌懈褉芯胁邪褌褜 懈屑褟',
+    showAppLength: '袩芯泻邪蟹邪褌褜 {{length}} 锌褉懈谢芯卸械薪懈泄',
+    delete: '校写邪谢懈褌褜 褍褔械褌薪褍褞 蟹邪锌懈褋褜',
+    deleteTip: '校写邪谢械薪懈械 胁邪褕械泄 褍褔械褌薪芯泄 蟹邪锌懈褋懈 锌褉懈胁械写械褌 泻 斜械蟹胁芯蟹胁褉邪褌薪芯屑褍 褍写邪谢械薪懈褞 胁褋械褏 胁邪褕懈褏 写邪薪薪褘褏, 懈 懈褏 薪械胁芯蟹屑芯卸薪芯 斜褍写械褌 胁芯褋褋褌邪薪芯胁懈褌褜.',
+    deleteConfirmTip: '袛谢褟 锌芯写褌胁械褉卸写械薪懈褟, 锌芯卸邪谢褍泄褋褌邪, 芯褌锌褉邪胁褜褌械 褋谢械写褍褞褖械械 褋 胁邪褕械谐芯 蟹邪褉械谐懈褋褌褉懈褉芯胁邪薪薪芯谐芯 邪写褉械褋邪 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌褘 薪邪 ',
+    account: '小褔械褌',
+    studio: '小褌褍写懈褟 Dify',
+    myAccount: '袦芯褟 褍褔械褌薪邪褟 蟹邪锌懈褋褜',
+    deletePrivacyLink: '袩芯谢懈褌懈泻邪 泻芯薪褎懈写械薪褑懈邪谢褜薪芯褋褌懈.',
+    deletePlaceholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 褋胁芯泄 邪写褉械褋 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌褘',
+    sendVerificationButton: '袨褌锌褉邪胁懈褌褜 泻芯写 锌芯写褌胁械褉卸写械薪懈褟',
+    verificationLabel: '袩褉芯胁械褉芯褔薪褘泄 泻芯写',
+    verificationPlaceholder: '袙褋褌邪胁褜褌械 6-蟹薪邪褔薪褘泄 泻芯写',
+    feedbackTitle: '袨斜褉邪褌薪邪褟 褋胁褟蟹褜',
+    feedbackLabel: '袪邪褋褋泻邪卸懈褌械 薪邪屑, 锌芯褔械屑褍 胁褘 褍写邪谢懈谢懈 褋胁芯泄 邪泻泻邪褍薪褌?',
+    feedbackPlaceholder: '袧械芯斜褟蟹邪褌械谢褜薪褘泄',
+    permanentlyDeleteButton: '袨泻芯薪褔邪褌械谢褜薪芯 褍写邪谢懈褌褜 褍褔械褌薪褍褞 蟹邪锌懈褋褜',
+    deleteLabel: '袛谢褟 锌芯写褌胁械褉卸写械薪懈褟, 锌芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 褋胁芯泄 邪写褉械褋 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌褘 薪懈卸械',
+    deleteSuccessTip: '袙邪褕械屑褍 邪泻泻邪褍薪褌褍 褌褉械斜褍械褌褋褟 胁褉械屑褟, 褔褌芯斜褘 蟹邪胁械褉褕懈褌褜 褍写邪谢械薪懈械. 袦褘 褋胁褟卸械屑褋褟 褋 胁邪屑懈 锌芯 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌械, 泻芯谐写邪 胁褋械 斜褍写械褌 谐芯褌芯胁芯.',
+    deletePrivacyLinkTip: '袛谢褟 锌芯谢褍褔械薪懈褟 写芯锌芯谢薪懈褌械谢褜薪芯泄 懈薪褎芯褉屑邪褑懈懈 芯 褌芯屑, 泻邪泻 屑褘 芯斜褉邪斜邪褌褘胁邪械屑 胁邪褕懈 写邪薪薪褘械, 芯蟹薪邪泻芯屑褜褌械褋褜 褋 薪邪褕懈屑',
+    workspaceIcon: '袠泻芯薪泻邪 褉邪斜芯褔械谐芯 锌褉芯褋褌褉邪薪褋褌胁邪',
+    workspaceName: '袧邪蟹胁邪薪懈械 褉邪斜芯褔械谐芯 锌褉芯褋褌褉邪薪褋褌胁邪',
+    editWorkspaceInfo: '袪械写邪泻褌懈褉芯胁邪褌褜 懈薪褎芯褉屑邪褑懈褞 芯 褉邪斜芯褔械屑 锌褉芯褋褌褉邪薪褋褌胁械',
+  },
+  members: {
+    team: '袣芯屑邪薪写邪',
+    invite: '袛芯斜邪胁懈褌褜',
+    name: '袠袦携',
+    lastActive: '袩袨小袥袝袛袧携携 袗袣孝袠袙袧袨小孝鞋',
+    role: '袪袨袥袠',
+    pending: '袨卸懈写邪薪懈械...',
+    owner: '袙谢邪写械谢械褑',
+    admin: '袗写屑懈薪懈褋褌褉邪褌芯褉',
+    adminTip: '袦芯卸械褌 褋芯蟹写邪胁邪褌褜 锌褉懈谢芯卸械薪懈褟 懈 褍锌褉邪胁谢褟褌褜 薪邪褋褌褉芯泄泻邪屑懈 泻芯屑邪薪写褘',
+    normal: '袨斜褘褔薪褘泄',
+    normalTip: '袦芯卸械褌 褌芯谢褜泻芯 懈褋锌芯谢褜蟹芯胁邪褌褜 锌褉懈谢芯卸械薪懈褟, 薪械 屑芯卸械褌 褋芯蟹写邪胁邪褌褜 锌褉懈谢芯卸械薪懈褟',
+    builder: '袪邪蟹褉邪斜芯褌褔懈泻',
+    builderTip: '袦芯卸械褌 褋芯蟹写邪胁邪褌褜 懈 褉械写邪泻褌懈褉芯胁邪褌褜 褋芯斜褋褌胁械薪薪褘械 锌褉懈谢芯卸械薪懈褟',
+    editor: '袪械写邪泻褌芯褉',
+    editorTip: '袦芯卸械褌 褋芯蟹写邪胁邪褌褜 懈 褉械写邪泻褌懈褉芯胁邪褌褜 锌褉懈谢芯卸械薪懈褟',
+    datasetOperator: '袗写屑懈薪懈褋褌褉邪褌芯褉 蟹薪邪薪懈泄',
+    datasetOperatorTip: '袦芯卸械褌 褍锌褉邪胁谢褟褌褜 褌芯谢褜泻芯 斜邪蟹芯泄 蟹薪邪薪懈泄',
+    inviteTeamMember: '袛芯斜邪胁懈褌褜 褍褔邪褋褌薪懈泻邪 泻芯屑邪薪写褘',
+    inviteTeamMemberTip: '袨薪懈 屑芯谐褍褌 锌芯谢褍褔懈褌褜 写芯褋褌褍锌 泻 写邪薪薪褘屑 胁邪褕械泄 泻芯屑邪薪写褘 褋褉邪蟹褍 锌芯褋谢械 胁褏芯写邪 胁 褋懈褋褌械屑褍.',
+    emailNotSetup: '袩芯褔褌芯胁褘泄 褋械褉胁械褉 薪械 薪邪褋褌褉芯械薪, 锌芯褝褌芯屑褍 锌褉懈谐谢邪褕械薪懈褟 锌芯 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌械 薪械 屑芯谐褍褌 斜褘褌褜 芯褌锌褉邪胁谢械薪褘. 袩芯卸邪谢褍泄褋褌邪, 褍胁械写芯屑懈褌械 锌芯谢褜蟹芯胁邪褌械谢械泄 芯 褋褋褘谢泻械 写谢褟 锌褉懈谐谢邪褕械薪懈褟, 泻芯褌芯褉邪褟 斜褍写械褌 胁褘写邪薪邪 锌芯褋谢械 锌褉懈谐谢邪褕械薪懈褟.',
+    email: '协谢械泻褌褉芯薪薪邪褟 锌芯褔褌邪',
+    emailInvalid: '袧械胁械褉薪褘泄 褎芯褉屑邪褌 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌褘',
+    emailPlaceholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 邪写褉械褋邪 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌褘',
+    sendInvite: '袨褌锌褉邪胁懈褌褜 锌褉懈谐谢邪褕械薪懈械',
+    invitedAsRole: '袩褉懈谐谢邪褕械薪 泻邪泻 锌芯谢褜蟹芯胁邪褌械谢褜 褋 褉芯谢褜褞 {{role}}',
+    invitationSent: '袩褉懈谐谢邪褕械薪懈械 芯褌锌褉邪胁谢械薪芯',
+    invitationSentTip: '袩褉懈谐谢邪褕械薪懈械 芯褌锌褉邪胁谢械薪芯, 懈 芯薪懈 屑芯谐褍褌 胁芯泄褌懈 胁 Dify, 褔褌芯斜褘 锌芯谢褍褔懈褌褜 写芯褋褌褍锌 泻 写邪薪薪褘屑 胁邪褕械泄 泻芯屑邪薪写褘.',
+    invitationLink: '小褋褘谢泻邪 写谢褟 锌褉懈谐谢邪褕械薪懈褟',
+    failedInvitationEmails: '小谢械写褍褞褖懈械 锌芯谢褜蟹芯胁邪褌械谢懈 薪械 斜褘谢懈 褍褋锌械褕薪芯 锌褉懈谐谢邪褕械薪褘',
+    ok: '袨袣',
+    removeFromTeam: '校写邪谢懈褌褜 懈蟹 泻芯屑邪薪写褘',
+    removeFromTeamTip: '校写邪谢懈褌褜 写芯褋褌褍锌 泻 泻芯屑邪薪写械',
+    setAdmin: '袧邪蟹薪邪褔懈褌褜 邪写屑懈薪懈褋褌褉邪褌芯褉芯屑',
+    setMember: '袧邪蟹薪邪褔懈褌褜 芯斜褘褔薪褘屑 褍褔邪褋褌薪懈泻芯屑',
+    setBuilder: '袧邪蟹薪邪褔懈褌褜 褉邪蟹褉邪斜芯褌褔懈泻芯屑',
+    setEditor: '袧邪蟹薪邪褔懈褌褜 褉械写邪泻褌芯褉芯屑',
+    disInvite: '袨褌屑械薪懈褌褜 锌褉懈谐谢邪褕械薪懈械',
+    deleteMember: '校写邪谢懈褌褜 褍褔邪褋褌薪懈泻邪',
+    you: '(袙褘)',
+  },
+  integrations: {
+    connected: '袩芯写泻谢褞褔械薪芯',
+    google: 'Google',
+    googleAccount: '袙芯泄褌懈 褋 锌芯屑芯褖褜褞 褍褔械褌薪芯泄 蟹邪锌懈褋懈 Google',
+    github: 'GitHub',
+    githubAccount: '袙芯泄褌懈 褋 锌芯屑芯褖褜褞 褍褔械褌薪芯泄 蟹邪锌懈褋懈 GitHub',
+    connect: '袩芯写泻谢褞褔懈褌褜',
+  },
+  language: {
+    displayLanguage: '携蟹褘泻 芯褌芯斜褉邪卸械薪懈褟',
+    timezone: '效邪褋芯胁芯泄 锌芯褟褋',
+  },
+  provider: {
+    apiKey: '袣谢褞褔 API',
+    enterYourKey: '袙胁械写懈褌械 褋胁芯泄 泻谢褞褔 API 蟹写械褋褜',
+    invalidKey: '袧械胁械褉薪褘泄 泻谢褞褔 API OpenAI',
+    validatedError: '袨褕懈斜泻邪 胁邪谢懈写邪褑懈懈: ',
+    validating: '袩褉芯胁械褉泻邪 泻谢褞褔邪...',
+    saveFailed: '袨褕懈斜泻邪 褋芯褏褉邪薪械薪懈褟 泻谢褞褔邪 API',
+    apiKeyExceedBill: '协褌芯褌 API-泻谢褞褔 薪械 懈屑械械褌 写芯褋褌褍锌薪芯泄 泻胁芯褌褘, 锌芯卸邪谢褍泄褋褌邪, 锌褉芯褔懈褌邪泄褌械',
+    addKey: '袛芯斜邪胁懈褌褜 泻谢褞褔',
+    comingSoon: '小泻芯褉芯',
+    editKey: '袪械写邪泻褌懈褉芯胁邪褌褜',
+    invalidApiKey: '袧械胁械褉薪褘泄 泻谢褞褔 API',
+    azure: {
+      apiBase: '袘邪蟹芯胁褘泄 API',
+      apiBasePlaceholder: '袘邪蟹芯胁褘泄 URL-邪写褉械褋 API 胁邪褕械泄 泻芯薪械褔薪芯泄 褌芯褔泻懈 Azure OpenAI.',
+      apiKey: '袣谢褞褔 API',
+      apiKeyPlaceholder: '袙胁械写懈褌械 褋胁芯泄 泻谢褞褔 API 蟹写械褋褜',
+      helpTip: '校蟹薪邪褌褜 芯 褋谢褍卸斜械 Azure OpenAI',
+    },
+    openaiHosted: {
+      openaiHosted: '袪邪蟹屑械褖械薪薪褘泄 OpenAI',
+      onTrial: '袩袪袨袘袧袗携 袙袝袪小袠携',
+      exhausted: '袣袙袨孝袗 袠小效袝袪袩袗袧袗',
+      desc: '啸芯褋褌懈薪谐芯胁邪褟 褋谢褍卸斜邪 OpenAI, 锌褉械写芯褋褌邪胁谢褟械屑邪褟 Dify, 锌芯蟹胁芯谢褟械褌 胁邪屑 懈褋锌芯谢褜蟹芯胁邪褌褜 褌邪泻懈械 屑芯写械谢懈, 泻邪泻 GPT-3.5. 袩褉械卸写械 褔械屑 胁邪褕邪 锌褉芯斜薪邪褟 泻胁芯褌邪 斜褍写械褌 懈褋褔械褉锌邪薪邪, 胁邪屑 薪械芯斜褏芯写懈屑芯 薪邪褋褌褉芯懈褌褜 写褉褍谐懈褏 锌芯褋褌邪胁褖懈泻芯胁 屑芯写械谢械泄.',
+      callTimes: '袣芯谢懈褔械褋褌胁芯 胁褘蟹芯胁芯胁',
+      usedUp: '袩褉芯斜薪邪褟 泻胁芯褌邪 懈褋褔械褉锌邪薪邪. 袛芯斜邪胁褜褌械 褋芯斜褋褌胁械薪薪芯谐芯 锌芯褋褌邪胁褖懈泻邪 屑芯写械谢懈.',
+      useYourModel: '袙 薪邪褋褌芯褟褖械械 胁褉械屑褟 懈褋锌芯谢褜蟹褍械褌褋褟 褋芯斜褋褌胁械薪薪褘泄 锌芯褋褌邪胁褖懈泻 屑芯写械谢懈.',
+      close: '袟邪泻褉褘褌褜',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: '袩袪袨袘袧袗携 袙袝袪小袠携',
+      exhausted: '袣袙袨孝袗 袠小效袝袪袩袗袧袗',
+      desc: '袦芯褖薪邪褟 屑芯写械谢褜, 泻芯褌芯褉邪褟 芯褌谢懈褔薪芯 褋锌褉邪胁谢褟械褌褋褟 褋 褕懈褉芯泻懈屑 褋锌械泻褌褉芯屑 蟹邪写邪褔, 芯褌 褋谢芯卸薪褘褏 写懈邪谢芯谐芯胁 懈 褋芯蟹写邪薪懈褟 褌胁芯褉褔械褋泻芯谐芯 泻芯薪褌械薪褌邪 写芯 锌芯写褉芯斜薪褘褏 懈薪褋褌褉褍泻褑懈泄.',
+      callTimes: '袣芯谢懈褔械褋褌胁芯 胁褘蟹芯胁芯胁',
+      usedUp: '袩褉芯斜薪邪褟 泻胁芯褌邪 懈褋褔械褉锌邪薪邪. 袛芯斜邪胁褜褌械 褋芯斜褋褌胁械薪薪芯谐芯 锌芯褋褌邪胁褖懈泻邪 屑芯写械谢懈.',
+      useYourModel: '袙 薪邪褋褌芯褟褖械械 胁褉械屑褟 懈褋锌芯谢褜蟹褍械褌褋褟 褋芯斜褋褌胁械薪薪褘泄 锌芯褋褌邪胁褖懈泻 屑芯写械谢懈.',
+      close: '袟邪泻褉褘褌褜',
+      trialQuotaTip: '袙邪褕邪 泻胁芯褌邪 薪邪 锌褉芯斜薪褍褞 胁械褉褋懈褞 Anthropic 懈褋褌械褔械褌 11.03.2025 懈 斜芯谢褜褕械 薪械 斜褍写械褌 写芯褋褌褍锌薪邪. 袩芯卸邪谢褍泄褋褌邪, 懈褋锌芯谢褜蟹褍泄褌械 械谐芯 胁芯胁褉械屑褟.',
+    },
+    anthropic: {
+      using: '袙芯蟹屑芯卸薪芯褋褌褜 胁褋褌褉邪懈胁邪薪懈褟 懈褋锌芯谢褜蟹褍械褌',
+      enableTip: '效褌芯斜褘 胁泻谢褞褔懈褌褜 屑芯写械谢褜 Anthropic, 胁邪屑 薪械芯斜褏芯写懈屑芯 褋薪邪褔邪谢邪 锌褉懈胁褟蟹邪褌褜褋褟 泻 OpenAI 懈谢懈 Azure OpenAI Service.',
+      notEnabled: '袧械 胁泻谢褞褔械薪芯',
+      keyFrom: '袩芯谢褍褔懈褌械 褋胁芯泄 泻谢褞褔 API 芯褌 Anthropic',
+    },
+    encrypted: {
+      front: '袙邪褕 API-泻谢褞褔 斜褍写械褌 蟹邪褕懈褎褉芯胁邪薪 懈 褋芯褏褉邪薪械薪 褋 懈褋锌芯谢褜蟹芯胁邪薪懈械屑',
+      back: ' 褌械褏薪芯谢芯谐懈懈.',
+    },
+  },
+  modelProvider: {
+    notConfigured: '小懈褋褌械屑薪邪褟 屑芯写械谢褜 械褖械 薪械 锌芯谢薪芯褋褌褜褞 薪邪褋褌褉芯械薪邪, 懈 薪械泻芯褌芯褉褘械 褎褍薪泻褑懈懈 屑芯谐褍褌 斜褘褌褜 薪械写芯褋褌褍锌薪褘.',
+    systemModelSettings: '袧邪褋褌褉芯泄泻懈 褋懈褋褌械屑薪芯泄 屑芯写械谢懈',
+    systemModelSettingsLink: '袟邪褔械屑 薪褍卸薪芯 薪邪褋褌褉邪懈胁邪褌褜 褋懈褋褌械屑薪褍褞 屑芯写械谢褜?',
+    selectModel: '袙褘斜械褉懈褌械 褋胁芯褞 屑芯写械谢褜',
+    setupModelFirst: '袩芯卸邪谢褍泄褋褌邪, 褋薪邪褔邪谢邪 薪邪褋褌褉芯泄褌械 褋胁芯褞 屑芯写械谢褜',
+    systemReasoningModel: {
+      key: '袦芯写械谢褜 褋懈褋褌械屑薪芯谐芯 屑褘褕谢械薪懈褟',
+      tip: '校褋褌邪薪芯胁懈褌械 屑芯写械谢褜 胁褘胁芯写邪 锌芯 褍屑芯谢褔邪薪懈褞, 泻芯褌芯褉邪褟 斜褍写械褌 懈褋锌芯谢褜蟹芯胁邪褌褜褋褟 写谢褟 褋芯蟹写邪薪懈褟 锌褉懈谢芯卸械薪懈泄, 邪 褌邪泻卸械 褌邪泻懈械 褎褍薪泻褑懈懈, 泻邪泻 谐械薪械褉邪褑懈褟 懈屑械薪懈 写懈邪谢芯谐邪 懈 锌褉械写谢芯卸械薪懈械 褋谢械写褍褞褖械谐芯 胁芯锌褉芯褋邪, 褌邪泻卸械 斜褍写褍褌 懈褋锌芯谢褜蟹芯胁邪褌褜 屑芯写械谢褜 胁褘胁芯写邪 锌芯 褍屑芯谢褔邪薪懈褞.',
+    },
+    embeddingModel: {
+      key: '袦芯写械谢褜 胁褋褌褉邪懈胁邪薪懈褟',
+      tip: '校褋褌邪薪芯胁懈褌械 屑芯写械谢褜 锌芯 褍屑芯谢褔邪薪懈褞 写谢褟 芯斜褉邪斜芯褌泻懈 胁褋褌褉邪懈胁邪薪懈褟 写芯泻褍屑械薪褌芯胁 蟹薪邪薪懈泄, 泻邪泻 锌芯懈褋泻, 褌邪泻 懈 懈屑锌芯褉褌 蟹薪邪薪懈泄 懈褋锌芯谢褜蟹褍褞褌 褝褌褍 屑芯写械谢褜 胁褋褌褉邪懈胁邪薪懈褟 写谢褟 芯斜褉邪斜芯褌泻懈 胁械泻褌芯褉懈蟹邪褑懈懈. 袩械褉械泻谢褞褔械薪懈械 锌褉懈胁械写械褌 泻 薪械褋芯芯褌胁械褌褋褌胁懈褞 胁械泻褌芯褉薪芯谐芯 懈蟹屑械褉械薪懈褟 屑械卸写褍 懈屑锌芯褉褌懈褉芯胁邪薪薪褘屑懈 蟹薪邪薪懈褟屑懈 懈 胁芯锌褉芯褋芯屑, 褔褌芯 锌褉懈胁械写械褌 泻 褋斜芯褞 锌芯懈褋泻邪. 效褌芯斜褘 懈蟹斜械卸邪褌褜 褋斜芯褟 锌芯懈褋泻邪, 锌芯卸邪谢褍泄褋褌邪, 薪械 锌械褉械泻谢褞褔邪泄褌械 褝褌褍 屑芯写械谢褜 锌芯 褋胁芯械屑褍 褍褋屑芯褌褉械薪懈褞.',
+      required: '袦芯写械谢褜 胁褋褌褉邪懈胁邪薪懈褟 芯斜褟蟹邪褌械谢褜薪邪',
+    },
+    speechToTextModel: {
+      key: '袦芯写械谢褜 锌褉械芯斜褉邪蟹芯胁邪薪懈褟 褉械褔懈 胁 褌械泻褋褌',
+      tip: '校褋褌邪薪芯胁懈褌械 屑芯写械谢褜 锌芯 褍屑芯谢褔邪薪懈褞 写谢褟 胁胁芯写邪 褉械褔懈 胁 褌械泻褋褌 胁 褉邪蟹谐芯胁芯褉械.',
+    },
+    ttsModel: {
+      key: '袦芯写械谢褜 锌褉械芯斜褉邪蟹芯胁邪薪懈褟 褌械泻褋褌邪 胁 褉械褔褜',
+      tip: '校褋褌邪薪芯胁懈褌械 屑芯写械谢褜 锌芯 褍屑芯谢褔邪薪懈褞 写谢褟 胁胁芯写邪 褌械泻褋褌邪 胁 褉械褔褜 胁 褉邪蟹谐芯胁芯褉械.',
+    },
+    rerankModel: {
+      key: '袦芯写械谢褜 锌芯胁褌芯褉薪芯谐芯 褉邪薪卸懈褉芯胁邪薪懈褟',
+      tip: '袦芯写械谢褜 锌芯胁褌芯褉薪芯谐芯 褉邪薪卸懈褉芯胁邪薪懈褟 懈蟹屑械薪懈褌 锌芯褉褟写芯泻 褋锌懈褋泻邪 写芯泻褍屑械薪褌芯胁-泻邪薪写懈写邪褌芯胁 薪邪 芯褋薪芯胁械 褋械屑邪薪褌懈褔械褋泻芯谐芯 褋芯芯褌胁械褌褋褌胁懈褟 蟹邪锌褉芯褋褍 锌芯谢褜蟹芯胁邪褌械谢褟, 褍谢褍褔褕邪褟 褉械蟹褍谢褜褌邪褌褘 褋械屑邪薪褌懈褔械褋泻芯谐芯 褉邪薪卸懈褉芯胁邪薪懈褟',
+    },
+    apiKey: 'API-袣袥挟效',
+    quota: '袣胁芯褌邪',
+    searchModel: '袩芯懈褋泻 屑芯写械谢懈',
+    noModelFound: '袦芯写械谢褜 薪械 薪邪泄写械薪邪 写谢褟 {{model}}',
+    models: '袦芯写械谢懈',
+    showMoreModelProvider: '袩芯泻邪蟹邪褌褜 斜芯谢褜褕械 锌芯褋褌邪胁褖懈泻芯胁 屑芯写械谢械泄',
+    selector: {
+      tip: '协褌邪 屑芯写械谢褜 斜褘谢邪 褍写邪谢械薪邪. 袩芯卸邪谢褍泄褋褌邪, 写芯斜邪胁褜褌械 屑芯写械谢褜 懈谢懈 胁褘斜械褉懈褌械 写褉褍谐褍褞 屑芯写械谢褜.',
+      emptyTip: '袧械褌 写芯褋褌褍锌薪褘褏 屑芯写械谢械泄',
+      emptySetting: '袩芯卸邪谢褍泄褋褌邪, 锌械褉械泄写懈褌械 胁 薪邪褋褌褉芯泄泻懈 写谢褟 薪邪褋褌褉芯泄泻懈',
+      rerankTip: '袩芯卸邪谢褍泄褋褌邪, 薪邪褋褌褉芯泄褌械 屑芯写械谢褜 锌芯胁褌芯褉薪芯谐芯 褉邪薪卸懈褉芯胁邪薪懈褟',
+    },
+    card: {
+      quota: '袣袙袨孝袗',
+      onTrial: '袩褉芯斜薪邪褟 胁械褉褋懈褟',
+      paid: '袩谢邪褌薪褘泄',
+      quotaExhausted: '袣胁芯褌邪 懈褋褔械褉锌邪薪邪',
+      callTimes: '袣芯谢懈褔械褋褌胁芯 胁褘蟹芯胁芯胁',
+      tokens: '孝芯泻械薪褘',
+      buyQuota: '袣褍锌懈褌褜 泻胁芯褌褍',
+      priorityUse: '袩褉懈芯褉懈褌械褌薪芯械 懈褋锌芯谢褜蟹芯胁邪薪懈械',
+      removeKey: '校写邪谢懈褌褜 API-泻谢褞褔',
+      tip: '袩褉懈芯褉懈褌械褌 斜褍写械褌 芯褌写邪胁邪褌褜褋褟 锌谢邪褌薪芯泄 泻胁芯褌械. 袩褉芯斜薪邪褟 泻胁芯褌邪 斜褍写械褌 懈褋锌芯谢褜蟹芯胁邪褌褜褋褟 锌芯褋谢械 懈褋褔械褉锌邪薪懈褟 锌谢邪褌薪芯泄 泻胁芯褌褘.',
+    },
+    item: {
+      deleteDesc: '{{modelName}} 懈褋锌芯谢褜蟹褍褞褌褋褟 胁 泻邪褔械褋褌胁械 屑芯写械谢械泄 褋懈褋褌械屑薪芯谐芯 屑褘褕谢械薪懈褟. 袧械泻芯褌芯褉褘械 褎褍薪泻褑懈懈 斜褍写褍褌 薪械写芯褋褌褍锌薪褘 锌芯褋谢械 褍写邪谢械薪懈褟. 袩芯卸邪谢褍泄褋褌邪, 锌芯写褌胁械褉写懈褌械.',
+      freeQuota: '袘袝小袩袥袗孝袧袗携 袣袙袨孝袗',
+    },
+    addApiKey: '袛芯斜邪胁褜褌械 褋胁芯泄 API-泻谢褞褔',
+    invalidApiKey: '袧械胁械褉薪褘泄 API-泻谢褞褔',
+    encrypted: {
+      front: '袙邪褕 API-泻谢褞褔 斜褍写械褌 蟹邪褕懈褎褉芯胁邪薪 懈 褋芯褏褉邪薪械薪 褋 懈褋锌芯谢褜蟹芯胁邪薪懈械屑',
+      back: ' 褌械褏薪芯谢芯谐懈懈.',
+    },
+    freeQuota: {
+      howToEarn: '袣邪泻 蟹邪褉邪斜芯褌邪褌褜',
+    },
+    addMoreModelProvider: '袛袨袘袗袙袠孝鞋 袘袨袥鞋楔袝 袩袨小孝袗袙些袠袣袨袙 袦袨袛袝袥袝袡',
+    addModel: '袛芯斜邪胁懈褌褜 屑芯写械谢褜',
+    modelsNum: '{{num}} 袦芯写械谢械泄',
+    showModels: '袩芯泻邪蟹邪褌褜 屑芯写械谢懈',
+    showModelsNum: '袩芯泻邪蟹邪褌褜 {{num}} 屑芯写械谢械泄',
+    collapse: '小胁械褉薪褍褌褜',
+    config: '袧邪褋褌褉芯泄泻邪',
+    modelAndParameters: '袦芯写械谢褜 懈 锌邪褉邪屑械褌褉褘',
+    model: '袦芯写械谢褜',
+    featureSupported: '{{feature}} 锌芯写写械褉卸懈胁邪械褌褋褟',
+    callTimes: '袣芯谢懈褔械褋褌胁芯 胁褘蟹芯胁芯胁',
+    credits: '袣褉械写懈褌褘 薪邪 褋芯芯斜褖械薪懈褟',
+    buyQuota: '袣褍锌懈褌褜 泻胁芯褌褍',
+    getFreeTokens: '袩芯谢褍褔懈褌褜 斜械褋锌谢邪褌薪褘械 褌芯泻械薪褘',
+    priorityUsing: '袩褉懈芯褉懈褌械褌薪芯械 懈褋锌芯谢褜蟹芯胁邪薪懈械',
+    deprecated: '校褋褌邪褉械胁褕懈泄',
+    confirmDelete: '袩芯写褌胁械褉写懈褌褜 褍写邪谢械薪懈械?',
+    quotaTip: '袨褋褌邪胁褕懈械褋褟 写芯褋褌褍锌薪褘械 斜械褋锌谢邪褌薪褘械 褌芯泻械薪褘',
+    loadPresets: '袟邪谐褉褍蟹懈褌褜 锌褉械写褍褋褌邪薪芯胁泻懈',
+    parameters: '袩袗袪袗袦袝孝袪蝎',
+    loadBalancing: '袘邪谢邪薪褋懈褉芯胁泻邪 薪邪谐褉褍蟹泻懈',
+    loadBalancingDescription: '小薪懈蟹褜褌械 薪邪谐褉褍蟹泻褍 褋 锌芯屑芯褖褜褞 薪械褋泻芯谢褜泻懈褏 薪邪斜芯褉芯胁 褍褔械褌薪褘褏 写邪薪薪褘褏.',
+    loadBalancingHeadline: '袘邪谢邪薪褋懈褉芯胁泻邪 薪邪谐褉褍蟹泻懈',
+    configLoadBalancing: '袧邪褋褌褉芯懈褌褜 斜邪谢邪薪褋懈褉芯胁泻褍 薪邪谐褉褍蟹泻懈',
+    modelHasBeenDeprecated: '协褌邪 屑芯写械谢褜 褍褋褌邪褉械谢邪',
+    providerManaged: '校锌褉邪胁谢褟械褌褋褟 锌芯褋褌邪胁褖懈泻芯屑',
+    providerManagedDescription: '袠褋锌芯谢褜蟹褍泄褌械 芯写懈薪 薪邪斜芯褉 褍褔械褌薪褘褏 写邪薪薪褘褏, 锌褉械写芯褋褌邪胁谢械薪薪褘泄 锌芯褋褌邪胁褖懈泻芯屑 屑芯写械谢懈.',
+    defaultConfig: '袧邪褋褌褉芯泄泻邪 锌芯 褍屑芯谢褔邪薪懈褞',
+    apiKeyStatusNormal: '小褌邪褌褍褋 APIKey 胁 薪芯褉屑械',
+    apiKeyRateLimit: '袛芯褋褌懈谐薪褍褌 锌褉械写械谢 褋泻芯褉芯褋褌懈, 写芯褋褌褍锌械薪 褔械褉械蟹 {{seconds}}s',
+    addConfig: '袛芯斜邪胁懈褌褜 泻芯薪褎懈谐褍褉邪褑懈褞',
+    editConfig: '袪械写邪泻褌懈褉芯胁邪褌褜 泻芯薪褎懈谐褍褉邪褑懈褞',
+    loadBalancingLeastKeyWarning: '袛谢褟 胁泻谢褞褔械薪懈褟 斜邪谢邪薪褋懈褉芯胁泻懈 薪邪谐褉褍蟹泻懈 薪械芯斜褏芯写懈屑芯 胁泻谢褞褔懈褌褜 薪械 屑械薪械械 2 泻谢褞褔械泄.',
+    loadBalancingInfo: '袩芯 褍屑芯谢褔邪薪懈褞 斜邪谢邪薪褋懈褉芯胁泻邪 薪邪谐褉褍蟹泻懈 懈褋锌芯谢褜蟹褍械褌 褋褌褉邪褌械谐懈褞 Round-robin. 袝褋谢懈 褋褉邪斜邪褌褘胁邪械褌 芯谐褉邪薪懈褔械薪懈械 褋泻芯褉芯褋褌懈, 斜褍写械褌 锌褉懈屑械薪械薪 1-屑懈薪褍褌薪褘泄 锌械褉懈芯写 芯褏谢邪卸写械薪懈褟.',
+    upgradeForLoadBalancing: '袨斜薪芯胁懈褌械 褋胁芯泄 褌邪褉懈褎薪褘泄 锌谢邪薪, 褔褌芯斜褘 胁泻谢褞褔懈褌褜 斜邪谢邪薪褋懈褉芯胁泻褍 薪邪谐褉褍蟹泻懈.',
+    emptyProviderTitle: '袩芯褋褌邪胁褖懈泻 屑芯写械谢懈 薪械 薪邪褋褌褉芯械薪',
+    toBeConfigured: '袩芯写谢械卸懈褌 薪邪褋褌褉芯泄泻械',
+    configureTip: '袧邪褋褌褉芯泄褌械 api-泻谢褞褔 懈谢懈 写芯斜邪胁褜褌械 屑芯写械谢褜 写谢褟 懈褋锌芯谢褜蟹芯胁邪薪懈褟',
+    emptyProviderTip: '小薪邪褔邪谢邪 褍褋褌邪薪芯胁懈褌械 锌芯褋褌邪胁褖懈泻 屑芯写械谢懈.',
+    discoverMore: '校蟹薪邪泄褌械 斜芯谢褜褕械 胁',
+    installProvider: '校褋褌邪薪芯胁泻邪 锌芯褋褌邪胁褖懈泻芯胁 屑芯写械谢械泄',
+  },
+  dataSource: {
+    add: '袛芯斜邪胁懈褌褜 懈褋褌芯褔薪懈泻 写邪薪薪褘褏',
+    connect: '袩芯写泻谢褞褔懈褌褜',
+    configure: '袧邪褋褌褉芯懈褌褜',
+    notion: {
+      title: 'Notion',
+      description: '袠褋锌芯谢褜蟹芯胁邪薪懈械 Notion 胁 泻邪褔械褋褌胁械 懈褋褌芯褔薪懈泻邪 写邪薪薪褘褏 写谢褟 蟹薪邪薪懈泄.',
+      connectedWorkspace: '袩芯写泻谢褞褔械薪薪芯械 褉邪斜芯褔械械 锌褉芯褋褌褉邪薪褋褌胁芯',
+      addWorkspace: '袛芯斜邪胁懈褌褜 褉邪斜芯褔械械 锌褉芯褋褌褉邪薪褋褌胁芯',
+      connected: '袩芯写泻谢褞褔械薪芯',
+      disconnected: '袨褌泻谢褞褔械薪芯',
+      changeAuthorizedPages: '袠蟹屑械薪懈褌褜 邪胁褌芯褉懈蟹芯胁邪薪薪褘械 褋褌褉邪薪懈褑褘',
+      pagesAuthorized: '袗胁褌芯褉懈蟹芯胁邪薪薪褘械 褋褌褉邪薪懈褑褘',
+      sync: '小懈薪褏褉芯薪懈蟹懈褉芯胁邪褌褜',
+      remove: '校写邪谢懈褌褜',
+      selector: {
+        pageSelected: '袙褘斜褉邪薪薪褘械 褋褌褉邪薪懈褑褘',
+        searchPages: '袩芯懈褋泻 褋褌褉邪薪懈褑...',
+        noSearchResult: '袧械褌 褉械蟹褍谢褜褌邪褌芯胁 锌芯懈褋泻邪',
+        addPages: '袛芯斜邪胁懈褌褜 褋褌褉邪薪懈褑褘',
+        preview: '袩袪袝袛袩袪袨小袦袨孝袪',
+      },
+    },
+    website: {
+      title: '袙械斜-褋邪泄褌',
+      description: '袠屑锌芯褉褌懈褉芯胁邪褌褜 泻芯薪褌械薪褌 褋 胁械斜-褋邪泄褌芯胁 褋 锌芯屑芯褖褜褞 胁械斜-泻褉邪褍谢械褉邪.',
+      with: '小',
+      configuredCrawlers: '袧邪褋褌褉芯械薪薪褘械 泻褉邪褍谢械褉褘',
+      active: '袗泻褌懈胁薪褘泄',
+      inactive: '袧械邪泻褌懈胁薪褘泄',
+    },
+  },
+  plugin: {
+    serpapi: {
+      apiKey: '袣谢褞褔 API',
+      apiKeyPlaceholder: '袙胁械写懈褌械 褋胁芯泄 泻谢褞褔 API',
+      keyFrom: '袩芯谢褍褔懈褌械 褋胁芯泄 泻谢褞褔 SerpAPI 薪邪 褋褌褉邪薪懈褑械 褍褔械褌薪芯泄 蟹邪锌懈褋懈 SerpAPI',
+    },
+  },
+  apiBasedExtension: {
+    title: 'API-褉邪褋褕懈褉械薪懈褟 芯斜械褋锌械褔懈胁邪褞褌 褑械薪褌褉邪谢懈蟹芯胁邪薪薪芯械 褍锌褉邪胁谢械薪懈械 API, 褍锌褉芯褖邪褟 薪邪褋褌褉芯泄泻褍 写谢褟 褍写芯斜薪芯谐芯 懈褋锌芯谢褜蟹芯胁邪薪懈褟 胁 锌褉懈谢芯卸械薪懈褟褏 Dify.',
+    link: '校蟹薪邪泄褌械, 泻邪泻 褉邪蟹褉邪斜芯褌邪褌褜 褋芯斜褋褌胁械薪薪芯械 API-褉邪褋褕懈褉械薪懈械.',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: '袛芯斜邪胁懈褌褜 API Extension',
+    selector: {
+      title: 'API Extension',
+      placeholder: '袩芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 API-褉邪褋褕懈褉械薪懈械',
+      manage: '校锌褉邪胁谢械薪懈械 API-褉邪褋褕懈褉械薪懈械屑',
+    },
+    modal: {
+      title: '袛芯斜邪胁懈褌褜 API-褉邪褋褕懈褉械薪懈械',
+      editTitle: '袪械写邪泻褌懈褉芯胁邪褌褜 API-褉邪褋褕懈褉械薪懈械',
+      name: {
+        title: '袠屑褟',
+        placeholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 懈屑褟',
+      },
+      apiEndpoint: {
+        title: 'API Endpoint',
+        placeholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 泻芯薪械褔薪褍褞 褌芯褔泻褍 API',
+      },
+      apiKey: {
+        title: 'API-泻谢褞褔',
+        placeholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 API-泻谢褞褔',
+        lengthError: '袛谢懈薪邪 API-泻谢褞褔邪 薪械 屑芯卸械褌 斜褘褌褜 屑械薪褜褕械 5 褋懈屑胁芯谢芯胁',
+      },
+    },
+    type: '孝懈锌',
+  },
+  about: {
+    changeLog: '袞褍褉薪邪谢 懈蟹屑械薪械薪懈泄',
+    updateNow: '袨斜薪芯胁懈褌褜 褋械泄褔邪褋',
+    nowAvailable: 'Dify {{version}} 褌械锌械褉褜 写芯褋褌褍锌械薪.',
+    latestAvailable: 'Dify {{version}} - 锌芯褋谢械写薪褟褟 写芯褋褌褍锌薪邪褟 胁械褉褋懈褟.',
+  },
+  appMenus: {
+    overview: '袦芯薪懈褌芯褉懈薪谐',
+    promptEng: '袨褉泻械褋褌褉邪褑懈褟',
+    apiAccess: '袛芯褋褌褍锌 泻 API',
+    logAndAnn: '袞褍褉薪邪谢褘 懈 邪薪薪芯褌邪褑懈懈',
+    logs: '袞褍褉薪邪谢褘',
+  },
+  environment: {
+    testing: '孝袝小孝袠袪袨袙袗袧袠袝',
+    development: '袪袗袟袪袗袘袨孝袣袗',
+  },
+  appModes: {
+    completionApp: '袚械薪械褉邪褌芯褉 褌械泻褋褌邪',
+    chatApp: '效邪褌-锌褉懈谢芯卸械薪懈械',
+  },
+  datasetMenus: {
+    documents: '袛芯泻褍屑械薪褌褘',
+    hitTesting: '孝械褋褌懈褉芯胁邪薪懈械 锌芯懈褋泻邪',
+    settings: '袧邪褋褌褉芯泄泻懈',
+    emptyTip: '袟薪邪薪懈褟 薪械 斜褘谢懈 褋胁褟蟹邪薪褘, 锌芯卸邪谢褍泄褋褌邪, 锌械褉械泄写懈褌械 胁 锌褉懈谢芯卸械薪懈械 懈谢懈 锌谢邪谐懈薪, 褔褌芯斜褘 蟹邪胁械褉褕懈褌褜 褋胁褟蟹褘胁邪薪懈械.',
+    viewDoc: '袩褉芯褋屑芯褌褉械褌褜 写芯泻褍屑械薪褌邪褑懈褞',
+    relatedApp: '褋胁褟蟹邪薪薪褘械 锌褉懈谢芯卸械薪懈褟',
+    noRelatedApp: '袧械褌 褋胁褟蟹邪薪薪褘褏 锌褉懈谢芯卸械薪懈泄',
+  },
+  voiceInput: {
+    speaking: '袚芯胁芯褉懈褌械 褋械泄褔邪褋...',
+    converting: '袩褉械芯斜褉邪蟹芯胁邪薪懈械 胁 褌械泻褋褌...',
+    notAllow: '屑懈泻褉芯褎芯薪 薪械 邪胁褌芯褉懈蟹芯胁邪薪',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: '袩械褉械懈屑械薪芯胁邪褌褜 褉邪蟹谐芯胁芯褉',
+    conversationName: '袧邪蟹胁邪薪懈械 褉邪蟹谐芯胁芯褉邪',
+    conversationNamePlaceholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 薪邪蟹胁邪薪懈械 褉邪蟹谐芯胁芯褉邪',
+    conversationNameCanNotEmpty: '袧邪蟹胁邪薪懈械 褉邪蟹谐芯胁芯褉邪 芯斜褟蟹邪褌械谢褜薪芯',
+    citation: {
+      title: '笑袠孝袗孝蝎',
+      linkToDataset: '小褋褘谢泻邪 薪邪 蟹薪邪薪懈褟',
+      characters: '小懈屑胁芯谢褘:',
+      hitCount: '袣芯谢懈褔械褋褌胁芯 褋芯胁锌邪写械薪懈泄:',
+      vectorHash: '袙械泻褌芯褉薪褘泄 褏褝褕:',
+      hitScore: '袨褑械薪泻邪 褋芯胁锌邪写械薪懈褟:',
+    },
+    inputPlaceholder: '袩芯谐芯胁芯褉懈褌褜 褋 斜芯褌芯屑',
+    thinking: '袦褘褋谢褟褖懈泄...',
+    thought: '袦褘褋谢褜',
+    resend: '袩械褉械褋谢邪褌褜',
+  },
+  promptEditor: {
+    placeholder: '袧邪锌懈褕懈褌械 蟹写械褋褜 褋胁芯械 泻谢褞褔械胁芯械 褋谢芯胁芯 锌芯写褋泻邪蟹泻懈, 胁胁械写懈褌械 \'{\', 褔褌芯斜褘 胁褋褌邪胁懈褌褜 锌械褉械屑械薪薪褍褞, 胁胁械写懈褌械 \'/\', 褔褌芯斜褘 胁褋褌邪胁懈褌褜 斜谢芯泻 褋芯写械褉卸懈屑芯谐芯 锌芯写褋泻邪蟹泻懈',
+    context: {
+      item: {
+        title: '袣芯薪褌械泻褋褌',
+        desc: '袙褋褌邪胁懈褌褜 褕邪斜谢芯薪 泻芯薪褌械泻褋褌邪',
+      },
+      modal: {
+        title: '{{num}} 蟹薪邪薪懈泄 胁 泻芯薪褌械泻褋褌械',
+        add: '袛芯斜邪胁懈褌褜 泻芯薪褌械泻褋褌 ',
+        footer: '袙褘 屑芯卸械褌械 褍锌褉邪胁谢褟褌褜 泻芯薪褌械泻褋褌邪屑懈 胁 褉邪蟹写械谢械 芦袣芯薪褌械泻褋褌禄 薪懈卸械.',
+      },
+    },
+    history: {
+      item: {
+        title: '袠褋褌芯褉懈褟 褉邪蟹谐芯胁芯褉芯胁',
+        desc: '袙褋褌邪胁懈褌褜 褕邪斜谢芯薪 懈褋褌芯褉懈褔械褋泻芯谐芯 褋芯芯斜褖械薪懈褟',
+      },
+      modal: {
+        title: '袩袪袠袦袝袪',
+        user: '袩褉懈胁械褌',
+        assistant: '袩褉懈胁械褌! 袣邪泻 褟 屑芯谐褍 胁邪屑 锌芯屑芯褔褜 褋械谐芯写薪褟?',
+        edit: '袪械写邪泻褌懈褉芯胁邪褌褜 懈屑械薪邪 褉芯谢械泄 褉邪蟹谐芯胁芯褉邪',
+      },
+    },
+    variable: {
+      item: {
+        title: '袩械褉械屑械薪薪褘械 懈 胁薪械褕薪懈械 懈薪褋褌褉褍屑械薪褌褘',
+        desc: '袙褋褌邪胁懈褌褜 锌械褉械屑械薪薪褘械 懈 胁薪械褕薪懈械 懈薪褋褌褉褍屑械薪褌褘',
+      },
+      outputToolDisabledItem: {
+        title: '袩械褉械屑械薪薪褘械',
+        desc: '袙褋褌邪胁懈褌褜 锌械褉械屑械薪薪褘械',
+      },
+      modal: {
+        add: '袧芯胁邪褟 锌械褉械屑械薪薪邪褟',
+        addTool: '袧芯胁褘泄 懈薪褋褌褉褍屑械薪褌',
+      },
+    },
+    query: {
+      item: {
+        title: '袟邪锌褉芯褋',
+        desc: '袙褋褌邪胁懈褌褜 褕邪斜谢芯薪 蟹邪锌褉芯褋邪 锌芯谢褜蟹芯胁邪褌械谢褟',
+      },
+    },
+    existed: '校卸械 褋褍褖械褋褌胁褍械褌 胁 锌芯写褋泻邪蟹泻械',
+  },
+  imageUploader: {
+    uploadFromComputer: '袟邪谐褉褍蟹懈褌褜 褋 泻芯屑锌褜褞褌械褉邪',
+    uploadFromComputerReadError: '袨褕懈斜泻邪 褔褌械薪懈褟 懈蟹芯斜褉邪卸械薪懈褟, 锌芯胁褌芯褉懈褌械 锌芯锌褘褌泻褍.',
+    uploadFromComputerUploadError: '袨褕懈斜泻邪 蟹邪谐褉褍蟹泻懈 懈蟹芯斜褉邪卸械薪懈褟, 蟹邪谐褉褍蟹懈褌械 械褖械 褉邪蟹.',
+    uploadFromComputerLimit: '袟邪谐褉褍卸邪械屑褘械 懈蟹芯斜褉邪卸械薪懈褟 薪械 屑芯谐褍褌 锌褉械胁褘褕邪褌褜 {{size}} 袦袘',
+    pasteImageLink: '袙褋褌邪胁懈褌褜 褋褋褘谢泻褍 薪邪 懈蟹芯斜褉邪卸械薪懈械',
+    pasteImageLinkInputPlaceholder: '袙褋褌邪胁褜褌械 褋褋褘谢泻褍 薪邪 懈蟹芯斜褉邪卸械薪懈械 蟹写械褋褜',
+    pasteImageLinkInvalid: '袧械胁械褉薪邪褟 褋褋褘谢泻邪 薪邪 懈蟹芯斜褉邪卸械薪懈械',
+    imageUpload: '袟邪谐褉褍蟹泻邪 懈蟹芯斜褉邪卸械薪懈褟',
+  },
+  tag: {
+    placeholder: '袙褋械 褌械谐懈',
+    addNew: '袛芯斜邪胁懈褌褜 薪芯胁褘泄 褌械谐',
+    noTag: '袧械褌 褌械谐芯胁',
+    noTagYet: '袝褖械 薪械褌 褌械谐芯胁',
+    addTag: '袛芯斜邪胁懈褌褜 褌械谐懈',
+    editTag: '袪械写邪泻褌懈褉芯胁邪褌褜 褌械谐懈',
+    manageTags: '校锌褉邪胁谢械薪懈械 褌械谐邪屑懈',
+    selectorPlaceholder: '袙胁械写懈褌械 写谢褟 锌芯懈褋泻邪 懈谢懈 褋芯蟹写邪薪懈褟',
+    create: '小芯蟹写邪褌褜',
+    delete: '校写邪谢懈褌褜 褌械谐',
+    deleteTip: '孝械谐 懈褋锌芯谢褜蟹褍械褌褋褟, 褍写邪谢懈褌褜 械谐芯?',
+    created: '孝械谐 褍褋锌械褕薪芯 褋芯蟹写邪薪',
+    failed: '袨褕懈斜泻邪 褋芯蟹写邪薪懈褟 褌械谐邪',
+  },
+  fileUploader: {
+    pasteFileLinkInputPlaceholder: '袙胁械写懈褌械 URL...',
+    pasteFileLink: '袙褋褌邪胁懈褌褜 褋褋褘谢泻褍 薪邪 褎邪泄谢',
+    uploadFromComputer: '袥芯泻邪谢褜薪邪褟 蟹邪谐褉褍蟹泻邪',
+    fileExtensionNotSupport: '袪邪褋褕懈褉械薪懈械 褎邪泄谢邪 薪械 锌芯写写械褉卸懈胁邪械褌褋褟',
+    uploadFromComputerReadError: '效褌械薪懈械 褎邪泄谢邪 薪械 褍写邪谢芯褋褜, 锌芯卸邪谢褍泄褋褌邪, 锌芯胁褌芯褉懈褌械 锌芯锌褘褌泻褍.',
+    pasteFileLinkInvalid: '袧械胁械褉薪邪褟 褋褋褘谢泻邪 薪邪 褎邪泄谢',
+    uploadFromComputerLimit: '肖邪泄谢 蟹邪谐褉褍蟹泻懈 薪械 屑芯卸械褌 锌褉械胁褘褕邪褌褜 {{size}}',
+    uploadFromComputerUploadError: '袟邪谐褉褍蟹泻邪 褎邪泄谢邪 薪械 褍写邪谢邪褋褜, 锌芯卸邪谢褍泄褋褌邪, 蟹邪谐褉褍蟹懈褌械 械褖械 褉邪蟹.',
+  },
+  license: {
+    expiring: '小褉芯泻 写械泄褋褌胁懈褟 懈褋褌械泻邪械褌 蟹邪 芯写懈薪 写械薪褜',
+    expiring_plural: '小褉芯泻 写械泄褋褌胁懈褟 懈褋褌械泻邪械褌 褔械褉械蟹 {{count}} 写薪械泄',
+  },
+  pagination: {
+    perPage: '协谢械屑械薪褌芯胁 薪邪 褋褌褉邪薪懈褑械',
+  },
+  theme: {
+    light: '褋胁械褌',
+    dark: '褌械屑薪褘泄',
+    theme: '孝械屑邪',
+    auto: '褋懈褋褌械屑邪',
+  },
+  compliance: {
+    soc2Type2: '袨褌褔械褌 SOC 2 孝懈锌 II',
+    gdpr: 'GDPR DPA',
+    professionalUpgradeTooltip: '袛芯褋褌褍锌薪芯 褌芯谢褜泻芯 褋 泻芯屑邪薪写薪褘屑 锌谢邪薪芯屑 懈谢懈 胁褘褕械.',
+    iso27001: '小械褉褌懈褎懈泻邪褑懈褟 ISO 27001:2022',
+    sandboxUpgradeTooltip: '袛芯褋褌褍锌薪芯 褌芯谢褜泻芯 褋 锌褉芯褎械褋褋懈芯薪邪谢褜薪褘屑 懈谢懈 泻芯屑邪薪写薪褘屑 锌谢邪薪芯屑.',
+    soc2Type1: '袨褌褔械褌 SOC 2 孝懈锌 I',
+  },
+  imageInput: {
+    browse: '锌褉芯褋屑芯褌褉',
+    dropImageHere: '袩械褉械褌邪褖懈褌械 胁邪褕械 懈蟹芯斜褉邪卸械薪懈械 褋褞写邪 懈谢懈',
+    supportedFormats: '袩芯写写械褉卸懈胁邪械褌 PNG, JPG, JPEG, WEBP 懈 GIF',
+  },
+}
+
+export default translation
diff --git a/i18n/ru-RU/custom.ts b/i18n/ru-RU/custom.ts
new file mode 100644
index 0000000..bba1d28
--- /dev/null
+++ b/i18n/ru-RU/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: '袧邪褋褌褉芯泄泻邪',
+  upgradeTip: {
+    prefix: '袨斜薪芯胁懈褌械 褋胁芯泄 褌邪褉懈褎薪褘泄 锌谢邪薪, 褔褌芯斜褘',
+    suffix: '薪邪褋褌褉芯懈褌褜 褋胁芯泄 斜褉械薪写.',
+    des: '袨斜薪芯胁懈褌械 褋胁芯泄 锌谢邪薪, 褔褌芯斜褘 薪邪褋褌褉芯懈褌褜 褋胁芯泄 斜褉械薪写',
+    title: '袨斜薪芯胁懈褌械 褋胁芯泄 锌谢邪薪',
+  },
+  webapp: {
+    title: '袧邪褋褌褉芯懈褌褜 斜褉械薪写 胁械斜-锌褉懈谢芯卸械薪懈褟',
+    removeBrand: '校写邪谢懈褌褜 Powered by Dify',
+    changeLogo: '袠蟹屑械薪懈褌褜 懈蟹芯斜褉邪卸械薪懈械 斜褉械薪写邪 Powered by',
+    changeLogoTip: '肖芯褉屑邪褌 SVG 懈谢懈 PNG 褋 屑懈薪懈屑邪谢褜薪褘屑 褉邪蟹屑械褉芯屑 40x40px',
+  },
+  app: {
+    title: '袧邪褋褌褉芯懈褌褜 斜褉械薪写 蟹邪谐芯谢芯胁泻邪 锌褉懈谢芯卸械薪懈褟',
+    changeLogoTip: '肖芯褉屑邪褌 SVG 懈谢懈 PNG 褋 屑懈薪懈屑邪谢褜薪褘屑 褉邪蟹屑械褉芯屑 80x80px',
+  },
+  upload: '袟邪谐褉褍蟹懈褌褜',
+  uploading: '袟邪谐褉褍蟹泻邪',
+  uploadedFail: '袨褕懈斜泻邪 蟹邪谐褉褍蟹泻懈 懈蟹芯斜褉邪卸械薪懈褟, 锌芯卸邪谢褍泄褋褌邪 懈蟹芯斜褉邪卸械薪懈械, 蟹邪谐褉褍蟹懈褌械 械褖械 褉邪蟹.',
+  change: '袠蟹屑械薪懈褌褜',
+  apply: '袩褉懈屑械薪懈褌褜',
+  restore: '袙芯褋褋褌邪薪芯胁懈褌褜 蟹薪邪褔械薪懈褟 锌芯 褍屑芯谢褔邪薪懈褞',
+  customize: {
+    contactUs: ' 褋胁褟卸懈褌械褋褜 褋 薪邪屑懈 ',
+    prefix: '效褌芯斜褘 薪邪褋褌褉芯懈褌褜 谢芯谐芯褌懈锌 斜褉械薪写邪 胁 锌褉懈谢芯卸械薪懈懈, 锌芯卸邪谢褍泄褋褌邪,',
+    suffix: '褔褌芯斜褘 锌械褉械泄褌懈 薪邪 泻芯褉锌芯褉邪褌懈胁薪褍褞 胁械褉褋懈褞.',
+  },
+}
+
+export default translation
diff --git a/i18n/ru-RU/dataset-creation.ts b/i18n/ru-RU/dataset-creation.ts
new file mode 100644
index 0000000..7e44306
--- /dev/null
+++ b/i18n/ru-RU/dataset-creation.ts
@@ -0,0 +1,218 @@
+const translation = {
+  steps: {
+    header: {
+      creation: '小芯蟹写邪褌褜 斜邪蟹褍 蟹薪邪薪懈泄',
+      update: '袛芯斜邪胁懈褌褜 写邪薪薪褘械',
+      fallbackRoute: '袟薪邪薪懈械',
+    },
+    one: '袙褘斜械褉懈褌械 懈褋褌芯褔薪懈泻 写邪薪薪褘褏',
+    two: '袩褉械写胁邪褉懈褌械谢褜薪邪褟 芯斜褉邪斜芯褌泻邪 懈 芯褔懈褋褌泻邪 褌械泻褋褌邪',
+    three: '袙褘锌芯谢薪懈褌褜 懈 蟹邪胁械褉褕懈褌褜',
+  },
+  error: {
+    unavailable: '协褌邪 斜邪蟹邪 蟹薪邪薪懈泄 薪械写芯褋褌褍锌薪邪',
+  },
+  firecrawl: {
+    configFirecrawl: '袧邪褋褌褉芯懈褌褜 馃敟Firecrawl',
+    apiKeyPlaceholder: '袣谢褞褔 API 褋 firecrawl.dev',
+    getApiKeyLinkText: '袩芯谢褍褔懈褌械 褋胁芯泄 泻谢褞褔 API 褋 firecrawl.dev',
+  },
+  stepOne: {
+    filePreview: '袩褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉 褎邪泄谢邪',
+    pagePreview: '袩褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉 褋褌褉邪薪懈褑褘',
+    dataSourceType: {
+      file: '袠屑锌芯褉褌懈褉芯胁邪褌褜 懈蟹 褎邪泄谢邪',
+      notion: '小懈薪褏褉芯薪懈蟹懈褉芯胁邪褌褜 懈蟹 Notion',
+      web: '小懈薪褏褉芯薪懈蟹懈褉芯胁邪褌褜 褋 胁械斜-褋邪泄褌邪',
+    },
+    uploader: {
+      title: '袟邪谐褉褍蟹懈褌褜 褎邪泄谢',
+      button: '袩械褉械褌邪褖懈褌械 褎邪泄谢褘 懈谢懈 锌邪锌泻懈 懈谢懈',
+      browse: '袨斜蟹芯褉',
+      tip: '袩芯写写械褉卸懈胁邪褞褌褋褟 {{supportTypes}}. 袦邪泻褋懈屑褍屑 {{size}} 袦袘 泻邪卸写褘泄.',
+      validation: {
+        typeError: '孝懈锌 褎邪泄谢邪 薪械 锌芯写写械褉卸懈胁邪械褌褋褟',
+        size: '肖邪泄谢 褋谢懈褕泻芯屑 斜芯谢褜褕芯泄. 袦邪泻褋懈屑褍屑 {{size}} 袦袘',
+        count: '袧械褋泻芯谢褜泻芯 褎邪泄谢芯胁 薪械 锌芯写写械褉卸懈胁邪褞褌褋褟',
+        filesNumber: '袙褘 写芯褋褌懈谐谢懈 谢懈屑懈褌邪 锌邪泻械褌薪芯泄 蟹邪谐褉褍蟹泻懈 {{filesNumber}} 褎邪泄谢芯胁.',
+      },
+      cancel: '袨褌屑械薪邪',
+      change: '袠蟹屑械薪懈褌褜',
+      failed: '袨褕懈斜泻邪 蟹邪谐褉褍蟹泻懈',
+    },
+    notionSyncTitle: 'Notion 薪械 锌芯写泻谢褞褔械薪',
+    notionSyncTip: '效褌芯斜褘 褋懈薪褏褉芯薪懈蟹懈褉芯胁邪褌褜 写邪薪薪褘械 懈蟹 Notion, 褋薪邪褔邪谢邪 薪械芯斜褏芯写懈屑芯 褍褋褌邪薪芯胁懈褌褜 褋芯械写懈薪械薪懈械 褋 Notion.',
+    connect: '袩械褉械泄褌懈 泻 锌芯写泻谢褞褔械薪懈褞',
+    button: '袛邪谢械械',
+    emptyDatasetCreation: '携 褏芯褔褍 褋芯蟹写邪褌褜 锌褍褋褌褍褞 斜邪蟹褍 蟹薪邪薪懈泄',
+    modal: {
+      title: '小芯蟹写邪褌褜 锌褍褋褌褍褞 斜邪蟹褍 蟹薪邪薪懈泄',
+      tip: '袩褍褋褌邪褟 斜邪蟹邪 蟹薪邪薪懈泄 薪械 斜褍写械褌 褋芯写械褉卸邪褌褜 写芯泻褍屑械薪褌芯胁, 懈 胁褘 屑芯卸械褌械 蟹邪谐褉褍卸邪褌褜 写芯泻褍屑械薪褌褘 胁 谢褞斜芯械 胁褉械屑褟.',
+      input: '袧邪蟹胁邪薪懈械 斜邪蟹褘 蟹薪邪薪懈泄',
+      placeholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械',
+      nameNotEmpty: '袧邪蟹胁邪薪懈械 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
+      nameLengthInvalid: '袧邪蟹胁邪薪懈械 写芯谢卸薪芯 斜褘褌褜 芯褌 1 写芯 40 褋懈屑胁芯谢芯胁',
+      cancelButton: '袨褌屑械薪邪',
+      confirmButton: '小芯蟹写邪褌褜',
+      failed: '袨褕懈斜泻邪 褋芯蟹写邪薪懈褟',
+    },
+    website: {
+      fireCrawlNotConfigured: 'Firecrawl 薪械 薪邪褋褌褉芯械薪',
+      fireCrawlNotConfiguredDescription: '袧邪褋褌褉芯泄褌械 Firecrawl 褋 API-泻谢褞褔芯屑.',
+      configure: '袧邪褋褌褉芯懈褌褜',
+      run: '袟邪锌褍褋褌懈褌褜',
+      firecrawlTitle: '袠蟹胁谢械褔褜 胁械斜-泻芯薪褌械薪褌 褋 锌芯屑芯褖褜褞 馃敟Firecrawl',
+      firecrawlDoc: '袛芯泻褍屑械薪褌邪褑懈褟 Firecrawl',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      options: '袨锌褑懈懈',
+      crawlSubPage: '小泻邪薪懈褉芯胁邪褌褜 锌芯写褋褌褉邪薪懈褑褘',
+      limit: '袥懈屑懈褌',
+      maxDepth: '袦邪泻褋懈屑邪谢褜薪邪褟 谐谢褍斜懈薪邪',
+      excludePaths: '袠褋泻谢褞褔懈褌褜 锌褍褌懈',
+      includeOnlyPaths: '袙泻谢褞褔懈褌褜 褌芯谢褜泻芯 锌褍褌懈',
+      extractOnlyMainContent: '袠蟹胁谢械泻邪褌褜 褌芯谢褜泻芯 芯褋薪芯胁薪芯泄 泻芯薪褌械薪褌 (斜械蟹 蟹邪谐芯谢芯胁泻芯胁, 薪邪胁懈谐邪褑懈懈, 褎褍褌械褉芯胁 懈 褌. 写.)',
+      exceptionErrorTitle: '袩褉芯懈蟹芯褕谢芯 懈褋泻谢褞褔械薪懈械 锌褉懈 蟹邪锌褍褋泻械 蟹邪写邪薪懈褟 Firecrawl:',
+      unknownError: '袧械懈蟹胁械褋褌薪邪褟 芯褕懈斜泻邪',
+      totalPageScraped: '袙褋械谐芯 锌褉芯褋泻邪薪懈褉芯胁邪薪芯 褋褌褉邪薪懈褑:',
+      selectAll: '袙褘斜褉邪褌褜 胁褋械',
+      resetAll: '小斜褉芯褋懈褌褜 胁褋械',
+      scrapTimeInfo: '袙褋械谐芯 锌褉芯褋泻邪薪懈褉芯胁邪薪芯 {{total}} 褋褌褉邪薪懈褑 蟹邪 {{time}} 褋械泻褍薪写',
+      preview: '袩褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉',
+      maxDepthTooltip: '袦邪泻褋懈屑邪谢褜薪邪褟 谐谢褍斜懈薪邪 褋泻邪薪懈褉芯胁邪薪懈褟 芯褌薪芯褋懈褌械谢褜薪芯 胁胁械写械薪薪芯谐芯 URL. 袚谢褍斜懈薪邪 0 褋泻邪薪懈褉褍械褌 褌芯谢褜泻芯 褋褌褉邪薪懈褑褍 胁胁械写械薪薪芯谐芯 URL, 谐谢褍斜懈薪邪 1 褋泻邪薪懈褉褍械褌 URL 懈 胁褋械, 褔褌芯 薪邪褏芯写懈褌褋褟 锌芯褋谢械 胁胁械写械薪薪芯谐芯 URL + 芯写懈薪 /, 懈 褌邪泻 写邪谢械械.',
+      jinaReaderNotConfiguredDescription: '袧邪褋褌褉芯泄褌械 Jina Reader, 胁胁械写褟 褋胁芯泄 斜械褋锌谢邪褌薪褘泄 泻谢褞褔 API 写谢褟 写芯褋褌褍锌邪.',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      useSitemap: '袠褋锌芯谢褜蟹芯胁邪褌褜 泻邪褉褌褍 褋邪泄褌邪',
+      chooseProvider: '袙褘斜械褉懈褌械 锌褉芯胁邪泄写械褉邪',
+      jinaReaderNotConfigured: 'Jina Reader 薪械 薪邪褋褌褉芯械薪',
+      jinaReaderDoc: '校蟹薪邪泄褌械 斜芯谢褜褕械 芯 Jina Reader',
+      jinaReaderTitle: '袣芯薪胁械褉褌懈褉褍泄褌械 胁械褋褜 褋邪泄褌 胁 Markdown',
+      useSitemapTooltip: '小谢械写褍泄褌械 泻邪褉褌械 褋邪泄褌邪, 褔褌芯斜褘 锌褉芯褋泻邪薪懈褉芯胁邪褌褜 褋邪泄褌. 袝褋谢懈 薪械褌, Jina Reader 斜褍写械褌 褋泻邪薪懈褉芯胁邪褌褜 懈褌械褉邪褌懈胁薪芯 胁 蟹邪胁懈褋懈屑芯褋褌懈 芯褌 褉械谢械胁邪薪褌薪芯褋褌懈 褋褌褉邪薪懈褑褘, 胁褘写邪胁邪褟 屑械薪褜褕械械 泻芯谢懈褔械褋褌胁芯 褋褌褉邪薪懈褑, 薪芯 斜芯谢械械 胁褘褋芯泻芯谐芯 泻邪褔械褋褌胁邪.',
+      watercrawlTitle: '袠蟹胁谢械褔械薪懈械 胁械斜-泻芯薪褌械薪褌邪 褋 锌芯屑芯褖褜褞 Watercrawl',
+      watercrawlDocLink: 'https://docs.dify.ai/ru/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      configureWatercrawl: '袧邪褋褌褉芯懈褌褜 Watercrawl',
+      waterCrawlNotConfigured: 'Watercrawl 薪械 薪邪褋褌褉芯械薪',
+      configureFirecrawl: '袧邪褋褌褉芯懈褌褜 Firecrawl',
+      waterCrawlNotConfiguredDescription: '袧邪褋褌褉芯泄褌械 Watercrawl 褋 锌芯屑芯褖褜褞 泻谢褞褔邪 API 写谢褟 械谐芯 懈褋锌芯谢褜蟹芯胁邪薪懈褟.',
+      configureJinaReader: '袧邪褋褌褉芯泄褌械 Jina Reader',
+      watercrawlDoc: '袛芯泻褍屑械薪褌邪褑懈褟 Watercrawl',
+    },
+    cancel: '袨褌屑械薪邪',
+  },
+  stepTwo: {
+    segmentation: '袧邪褋褌褉芯泄泻懈 褎褉邪谐屑械薪褌邪褑懈懈',
+    auto: '袗胁褌芯屑邪褌懈褔械褋泻懈',
+    autoDescription: '袗胁褌芯屑邪褌懈褔械褋泻懈 褍褋褌邪薪邪胁谢懈胁邪褌褜 锌褉邪胁懈谢邪 褎褉邪谐屑械薪褌邪褑懈懈 懈 锌褉械写胁邪褉懈褌械谢褜薪芯泄 芯斜褉邪斜芯褌泻懈. 袩芯谢褜蟹芯胁邪褌械谢褟屑, 薪械 蟹薪邪泻芯屑褘屑 褋 褋懈褋褌械屑芯泄, 褉械泻芯屑械薪写褍械褌褋褟 胁褘斜褉邪褌褜 褝褌芯褌 胁邪褉懈邪薪褌.',
+    custom: '袩芯谢褜蟹芯胁邪褌械谢褜褋泻懈泄',
+    customDescription: '袧邪褋褌褉芯懈褌褜 锌褉邪胁懈谢邪 褎褉邪谐屑械薪褌邪褑懈懈, 写谢懈薪褍 褎褉邪谐屑械薪褌芯胁, 锌褉邪胁懈谢邪 锌褉械写胁邪褉懈褌械谢褜薪芯泄 芯斜褉邪斜芯褌泻懈 懈 褌. 写.',
+    separator: '袠写械薪褌懈褎懈泻邪褌芯褉 褋械谐屑械薪褌邪',
+    separatorPlaceholder: '袧邪锌褉懈屑械褉, 薪芯胁邪褟 褋褌褉芯泻邪 (\\\\n) 懈谢懈 褋锌械褑懈邪谢褜薪褘泄 褉邪蟹写械谢懈褌械谢褜 (薪邪锌褉懈屑械褉, "***")',
+    maxLength: '袦邪泻褋懈屑邪谢褜薪邪褟 写谢懈薪邪 褎褉邪谐屑械薪褌邪',
+    overlap: '袩械褉械泻褉褘褌懈械 褎褉邪谐屑械薪褌芯胁',
+    overlapTip: '校褋褌邪薪芯胁泻邪 锌械褉械泻褉褘褌懈褟 褎褉邪谐屑械薪褌芯胁 屑芯卸械褌 褋芯褏褉邪薪懈褌褜 褋械屑邪薪褌懈褔械褋泻褍褞 褋胁褟蟹褜 屑械卸写褍 薪懈屑懈, 褍谢褍褔褕邪褟 褝褎褎械泻褌 锌芯懈褋泻邪. 袪械泻芯屑械薪写褍械褌褋褟 褍褋褌邪薪芯胁懈褌褜 10%-25% 芯褌 屑邪泻褋懈屑邪谢褜薪芯谐芯 褉邪蟹屑械褉邪 褎褉邪谐屑械薪褌邪.',
+    overlapCheck: '锌械褉械泻褉褘褌懈械 褎褉邪谐屑械薪褌芯胁 薪械 写芯谢卸薪芯 锌褉械胁褘褕邪褌褜 屑邪泻褋懈屑邪谢褜薪褍褞 写谢懈薪褍 褎褉邪谐屑械薪褌邪',
+    rules: '袩褉邪胁懈谢邪 锌褉械写胁邪褉懈褌械谢褜薪芯泄 芯斜褉邪斜芯褌泻懈 褌械泻褋褌邪',
+    removeExtraSpaces: '袟邪屑械薪懈褌褜 锌芯褋谢械写芯胁邪褌械谢褜薪褘械 锌褉芯斜械谢褘, 薪芯胁褘械 褋褌褉芯泻懈 懈 褌邪斜褍谢褟褑懈懈',
+    removeUrlEmails: '校写邪谢懈褌褜 胁褋械 URL-邪写褉械褋邪 懈 邪写褉械褋邪 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌褘',
+    removeStopwords: '校写邪谢懈褌褜 褋褌芯锌-褋谢芯胁邪, 褌邪泻懈械 泻邪泻 "a", "an", "the"',
+    preview: '袩芯写褌胁械褉写懈褌褜 懈 锌褉芯褋屑芯褌褉械褌褜',
+    reset: '小斜褉芯褋懈褌褜',
+    indexMode: '袪械卸懈屑 懈薪写械泻褋邪褑懈懈',
+    qualified: '袙褘褋芯泻芯械 泻邪褔械褋褌胁芯',
+    recommend: '袪械泻芯屑械薪写褍械褌褋褟',
+    qualifiedTip: '袙褘蟹芯胁 懈薪褌械褉褎械泄褋邪 胁褋褌褉邪懈胁邪薪懈褟 褋懈褋褌械屑褘 锌芯 褍屑芯谢褔邪薪懈褞 写谢褟 芯斜褉邪斜芯褌泻懈, 褔褌芯斜褘 芯斜械褋锌械褔懈褌褜 斜芯谢械械 胁褘褋芯泻褍褞 褌芯褔薪芯褋褌褜 锌褉懈 蟹邪锌褉芯褋邪褏 锌芯谢褜蟹芯胁邪褌械谢械泄.',
+    warning: '袩芯卸邪谢褍泄褋褌邪, 褋薪邪褔邪谢邪 薪邪褋褌褉芯泄褌械 泻谢褞褔 API 锌芯褋褌邪胁褖懈泻邪 屑芯写械谢懈.',
+    click: '袩械褉械泄褌懈 泻 薪邪褋褌褉芯泄泻邪屑',
+    economical: '协泻芯薪芯屑懈褔薪褘泄',
+    economicalTip: '袠褋锌芯谢褜蟹褍泄褌械 邪胁褌芯薪芯屑薪褘械 胁械泻褌芯褉薪褘械 写胁懈卸泻懈, 懈薪写械泻褋褘 泻谢褞褔械胁褘褏 褋谢芯胁 懈 褌. 写., 褔褌芯斜褘 褋薪懈蟹懈褌褜 褌芯褔薪芯褋褌褜, 薪械 褌褉邪褌褟 褌芯泻械薪褘',
+    QATitle: '小械谐屑械薪褌邪褑懈褟 胁 褎芯褉屑邪褌械 胁芯锌褉芯褋-芯褌胁械褌',
+    QATip: '袙泻谢褞褔械薪懈械 褝褌芯泄 芯锌褑懈懈 锌褉懈胁械写械褌 泻 锌芯褌褉械斜谢械薪懈褞 斜芯谢褜褕械谐芯 泻芯谢懈褔械褋褌胁邪 褌芯泻械薪芯胁',
+    QALanguage: '小械谐屑械薪褌懈褉芯胁邪褌褜 褋 锌芯屑芯褖褜褞',
+    estimateCost: '袨褑械薪泻邪',
+    estimateSegment: '袨褑械薪芯褔薪芯械 泻芯谢懈褔械褋褌胁芯 褎褉邪谐屑械薪褌芯胁',
+    segmentCount: '褎褉邪谐屑械薪褌芯胁',
+    calculating: '袙褘褔懈褋谢械薪懈械...',
+    fileSource: '袩褉械写胁邪褉懈褌械谢褜薪邪褟 芯斜褉邪斜芯褌泻邪 写芯泻褍屑械薪褌芯胁',
+    notionSource: '袩褉械写胁邪褉懈褌械谢褜薪邪褟 芯斜褉邪斜芯褌泻邪 褋褌褉邪薪懈褑',
+    websiteSource: '袩褉械写胁邪褉懈褌械谢褜薪邪褟 芯斜褉邪斜芯褌泻邪 胁械斜-褋邪泄褌邪',
+    other: '懈 写褉褍谐懈械 ',
+    fileUnit: ' 褎邪泄谢芯胁',
+    notionUnit: ' 褋褌褉邪薪懈褑',
+    webpageUnit: ' 褋褌褉邪薪懈褑',
+    previousStep: '袩褉械写褘写褍褖懈泄 褕邪谐',
+    nextStep: '小芯褏褉邪薪懈褌褜 懈 芯斜褉邪斜芯褌邪褌褜',
+    save: '小芯褏褉邪薪懈褌褜 懈 芯斜褉邪斜芯褌邪褌褜',
+    cancel: '袨褌屑械薪邪',
+    sideTipTitle: '袟邪褔械屑 薪褍卸薪邪 褎褉邪谐屑械薪褌邪褑懈褟 懈 锌褉械写胁邪褉懈褌械谢褜薪邪褟 芯斜褉邪斜芯褌泻邪?',
+    sideTipP1: '袩褉懈 芯斜褉邪斜芯褌泻械 褌械泻褋褌芯胁褘褏 写邪薪薪褘褏 褎褉邪谐屑械薪褌邪褑懈褟 懈 芯褔懈褋褌泻邪 褟胁谢褟褞褌褋褟 写胁褍屑褟 胁邪卸薪褘屑懈 褝褌邪锌邪屑懈 锌褉械写胁邪褉懈褌械谢褜薪芯泄 芯斜褉邪斜芯褌泻懈.',
+    sideTipP2: '小械谐屑械薪褌邪褑懈褟 褉邪蟹斜懈胁邪械褌 写谢懈薪薪褘泄 褌械泻褋褌 薪邪 邪斜蟹邪褑褘, 褔褌芯斜褘 屑芯写械谢懈 屑芯谐谢懈 谢褍褔褕械 械谐芯 锌芯薪懈屑邪褌褜. 协褌芯 褍谢褍褔褕邪械褌 泻邪褔械褋褌胁芯 懈 褉械谢械胁邪薪褌薪芯褋褌褜 褉械蟹褍谢褜褌邪褌芯胁 屑芯写械谢懈.',
+    sideTipP3: '袨褔懈褋褌泻邪 褍写邪谢褟械褌 薪械薪褍卸薪褘械 褋懈屑胁芯谢褘 懈 褎芯褉屑邪褌褘, 写械谢邪褟 蟹薪邪薪懈褟 斜芯谢械械 褔懈褋褌褘屑懈 懈 谢械谐泻懈屑懈 写谢褟 邪薪邪谢懈蟹邪.',
+    sideTipP4: '袩褉邪胁懈谢褜薪邪褟 褎褉邪谐屑械薪褌邪褑懈褟 懈 芯褔懈褋褌泻邪 褍谢褍褔褕邪褞褌 锌褉芯懈蟹胁芯写懈褌械谢褜薪芯褋褌褜 屑芯写械谢懈, 芯斜械褋锌械褔懈胁邪褟 斜芯谢械械 褌芯褔薪褘械 懈 褑械薪薪褘械 褉械蟹褍谢褜褌邪褌褘.',
+    previewTitle: '袩褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉',
+    previewTitleButton: '袩褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉',
+    previewButton: '袩械褉械泻谢褞褔械薪懈械 胁 褎芯褉屑邪褌 胁芯锌褉芯褋-芯褌胁械褌',
+    previewSwitchTipStart: '孝械泻褍褖懈泄 锌褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉 褎褉邪谐屑械薪褌邪 薪邪褏芯写懈褌褋褟 胁 褌械泻褋褌芯胁芯屑 褎芯褉屑邪褌械, 锌械褉械泻谢褞褔械薪懈械 薪邪 锌褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉 胁 褎芯褉屑邪褌械 胁芯锌褉芯褋-芯褌胁械褌',
+    previewSwitchTipEnd: ' 锌芯褌褉械斜谢褟械褌 写芯锌芯谢薪懈褌械谢褜薪褘械 褌芯泻械薪褘',
+    characters: '褋懈屑胁芯谢芯胁',
+    indexSettingTip: '效褌芯斜褘 懈蟹屑械薪懈褌褜 屑械褌芯写 懈薪写械泻褋邪褑懈懈, 锌芯卸邪谢褍泄褋褌邪, 锌械褉械泄写懈褌械 胁 ',
+    retrievalSettingTip: '效褌芯斜褘 懈蟹屑械薪懈褌褜 屑械褌芯写 懈薪写械泻褋邪褑懈懈, 锌芯卸邪谢褍泄褋褌邪, 锌械褉械泄写懈褌械 胁 ',
+    datasetSettingLink: '薪邪褋褌褉芯泄泻懈 斜邪蟹褘 蟹薪邪薪懈泄.',
+    separatorTip: '袪邪蟹写械谢懈褌械谢褜 鈥� 褝褌芯 褋懈屑胁芯谢, 懈褋锌芯谢褜蟹褍械屑褘泄 写谢褟 褉邪蟹写械谢械薪懈褟 褌械泻褋褌邪. \\n\\n 懈 \\n 鈥� 褝褌芯 褔邪褋褌芯 懈褋锌芯谢褜蟹褍械屑褘械 褉邪蟹写械谢懈褌械谢懈 写谢褟 褉邪蟹写械谢械薪懈褟 邪斜蟹邪褑械胁 懈 褋褌褉芯泻. 袙 褋芯褔械褌邪薪懈懈 褋 蟹邪锌褟褌褘屑懈 (\\n\\n,\\n) 邪斜蟹邪褑褘 斜褍写褍褌 褋械谐屑械薪褌懈褉芯胁邪薪褘 锌芯 褋褌褉芯泻邪屑, 械褋谢懈 屑邪泻褋懈屑邪谢褜薪邪褟 写谢懈薪邪 斜谢芯泻邪 锌褉械胁褘褕邪械褌 懈褏. 袙褘 褌邪泻卸械 屑芯卸械褌械 懈褋锌芯谢褜蟹芯胁邪褌褜 褋锌械褑懈邪谢褜薪褘械 褉邪蟹写械谢懈褌械谢懈, 芯锌褉械写械谢械薪薪褘械 胁邪屑懈 (薪邪锌褉懈屑械褉, ***).',
+    maxLengthCheck: '袦邪泻褋懈屑邪谢褜薪邪褟 写谢懈薪邪 斜谢芯泻邪 写芯谢卸薪邪 斜褘褌褜 屑械薪褜褕械 {{limit}}',
+    switch: '袙褘泻谢褞褔邪褌械谢褜',
+    parentChunkForContext: '袪芯写懈褌械谢褜褋泻懈泄 斜谢芯泻 写谢褟 泻芯薪褌械泻褋褌邪',
+    previewChunkTip: '袧邪卸屑懈褌械 泻薪芯锌泻褍 芦袩褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉 褎褉邪谐屑械薪褌邪禄 褋谢械胁邪, 褔褌芯斜褘 蟹邪谐褉褍蟹懈褌褜 锌褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉',
+    notAvailableForParentChild: '袧械写芯褋褌褍锌薪芯 写谢褟 懈薪写械泻褋邪 褌懈锌邪 "褉芯写懈褌械谢褜-锌芯褌芯屑芯泻"',
+    parentChildChunkDelimiterTip: '袪邪蟹写械谢懈褌械谢褜 鈥� 褝褌芯 褋懈屑胁芯谢, 懈褋锌芯谢褜蟹褍械屑褘泄 写谢褟 褉邪蟹写械谢械薪懈褟 褌械泻褋褌邪. \\n 褉械泻芯屑械薪写褍械褌褋褟 写谢褟 褉邪蟹斜懈械薪懈褟 褉芯写懈褌械谢褜褋泻懈褏 斜谢芯泻芯胁 薪邪 薪械斜芯谢褜褕懈械 写芯褔械褉薪懈械 斜谢芯泻懈. 袙褘 褌邪泻卸械 屑芯卸械褌械 懈褋锌芯谢褜蟹芯胁邪褌褜 褋锌械褑懈邪谢褜薪褘械 褉邪蟹写械谢懈褌械谢懈, 芯锌褉械写械谢械薪薪褘械 褋邪屑芯褋褌芯褟褌械谢褜薪芯.',
+    previewChunk: '袩褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉 褎褉邪谐屑械薪褌邪',
+    previewChunkCount: '{{袣芯谢懈褔械褋褌胁芯}} 袩褉械写锌芯谢邪谐邪械屑褘械 泻褍褋泻懈',
+    generalTip: '袨斜褖懈泄 褉械卸懈屑 褎褉邪谐屑械薪褌邪褑懈懈 褌械泻褋褌邪, 懈蟹胁谢械泻邪械屑褘械 懈 胁褘蟹褘胁邪械屑褘械 褎褉邪谐屑械薪褌褘 芯写懈薪邪泻芯胁褘.',
+    general: '袨斜褖械械',
+    useQALanguage: '肖褉邪谐屑械薪褌 褋 懈褋锌芯谢褜蟹芯胁邪薪懈械屑 褎芯褉屑邪褌邪 Q&A 胁',
+    notAvailableForQA: '袧械写芯褋褌褍锌薪芯 写谢褟 懈薪写械泻褋邪 Q&A',
+    paragraph: '袩邪褉邪谐褉邪褎',
+    parentChild: '袪芯写懈褌械谢褜-写芯褔械褉薪懈泄',
+    fullDoc: '袩芯谢薪褘泄 写芯泻褍屑械薪褌邪谢褜薪褘泄 褎懈谢褜屑',
+    qaSwitchHighQualityTipTitle: '肖芯褉屑邪褌 胁芯锌褉芯褋芯胁 懈 芯褌胁械褌芯胁 褌褉械斜褍械褌 胁褘褋芯泻芯泻邪褔械褋褌胁械薪薪芯谐芯 屑械褌芯写邪 懈薪写械泻褋邪褑懈懈',
+    parentChildDelimiterTip: '袪邪蟹写械谢懈褌械谢褜 鈥� 褝褌芯 褋懈屑胁芯谢, 懈褋锌芯谢褜蟹褍械屑褘泄 写谢褟 褉邪蟹写械谢械薪懈褟 褌械泻褋褌邪. \\n\\n 褉械泻芯屑械薪写褍械褌褋褟 写谢褟 褉邪蟹写械谢械薪懈褟 懈褋褏芯写薪芯谐芯 写芯泻褍屑械薪褌邪 薪邪 斜芯谢褜褕懈械 褉芯写懈褌械谢褜褋泻懈械 褔邪褋褌懈. 袙褘 褌邪泻卸械 屑芯卸械褌械 懈褋锌芯谢褜蟹芯胁邪褌褜 褋锌械褑懈邪谢褜薪褘械 褉邪蟹写械谢懈褌械谢懈, 芯锌褉械写械谢械薪薪褘械 褋邪屑芯褋褌芯褟褌械谢褜薪芯.',
+    parentChildTip: '袩褉懈 懈褋锌芯谢褜蟹芯胁邪薪懈懈 褉械卸懈屑邪 芦褉芯写懈褌械谢褜-锌芯褌芯屑芯泻禄 写芯褔械褉薪懈泄 斜谢芯泻 懈褋锌芯谢褜蟹褍械褌褋褟 写谢褟 懈蟹胁谢械褔械薪懈褟, 邪 褉芯写懈褌械谢褜褋泻懈泄 斜谢芯泻 鈥� 写谢褟 胁褘蟹芯胁邪 胁 泻邪褔械褋褌胁械 泻芯薪褌械泻褋褌邪.',
+    paragraphTip: '袙 褝褌芯屑 褉械卸懈屑械 褌械泻褋褌 褉邪蟹斜懈胁邪械褌褋褟 薪邪 邪斜蟹邪褑褘 薪邪 芯褋薪芯胁械 褉邪蟹写械谢懈褌械谢械泄 懈 屑邪泻褋懈屑邪谢褜薪芯泄 写谢懈薪褘 斜谢芯泻邪, 懈褋锌芯谢褜蟹褍褟 褉邪蟹写械谢械薪薪褘泄 褌械泻褋褌 胁 泻邪褔械褋褌胁械 褉芯写懈褌械谢褜褋泻芯谐芯 斜谢芯泻邪 写谢褟 懈蟹胁谢械褔械薪懈褟.',
+    highQualityTip: '袩芯褋谢械 蟹邪胁械褉褕械薪懈褟 胁褋褌褉邪懈胁邪薪懈褟 胁 褉械卸懈屑械 芦袙褘褋芯泻芯械 泻邪褔械褋褌胁芯禄 胁芯蟹胁褉邪褌 泻 褝泻芯薪芯屑懈褔薪芯屑褍 褉械卸懈屑褍 薪械胁芯蟹屑芯卸械薪.',
+    childChunkForRetrieval: '袛械褌褋泻懈泄 褎褉邪谐屑械薪褌 写谢褟 懈蟹胁谢械褔械薪懈褟',
+    qaSwitchHighQualityTipContent: '袙 薪邪褋褌芯褟褖械械 胁褉械屑褟 褌芯谢褜泻芯 胁褘褋芯泻芯泻邪褔械褋褌胁械薪薪褘泄 屑械褌芯写 懈薪写械泻褋邪 锌芯写写械褉卸懈胁邪械褌 褎褉邪谐屑械薪褌邪褑懈褞 褎芯褉屑邪褌邪 Q&A. 啸芯褌械谢懈 斜褘 胁褘 锌械褉械泄褌懈 胁 褉械卸懈屑 胁褘褋芯泻芯谐芯 泻邪褔械褋褌胁邪?',
+    fullDocTip: '袙械褋褜 写芯泻褍屑械薪褌 懈褋锌芯谢褜蟹褍械褌褋褟 胁 泻邪褔械褋褌胁械 褉芯写懈褌械谢褜褋泻芯谐芯 斜谢芯泻邪 懈 懈蟹胁谢械泻邪械褌褋褟 薪邪锌褉褟屑褍褞. 袨斜褉邪褌懈褌械 胁薪懈屑邪薪懈械, 褔褌芯 锌芯 锌褉懈褔懈薪邪屑 锌褉芯懈蟹胁芯写懈褌械谢褜薪芯褋褌懈 褌械泻褋褌, 锌褉械胁褘褕邪褞褖懈泄 10000 褌芯泻械薪芯胁, 斜褍写械褌 邪胁褌芯屑邪褌懈褔械褋泻懈 芯斜褉械蟹邪薪.',
+  },
+  stepThree: {
+    creationTitle: '馃帀 袘邪蟹邪 蟹薪邪薪懈泄 褋芯蟹写邪薪邪',
+    creationContent: '袦褘 邪胁褌芯屑邪褌懈褔械褋泻懈 薪邪蟹胁邪谢懈 斜邪蟹褍 蟹薪邪薪懈泄, 胁褘 屑芯卸械褌械 懈蟹屑械薪懈褌褜 械械 胁 谢褞斜芯械 胁褉械屑褟',
+    label: '袧邪蟹胁邪薪懈械 斜邪蟹褘 蟹薪邪薪懈泄',
+    additionTitle: '馃帀 袛芯泻褍屑械薪褌 蟹邪谐褉褍卸械薪',
+    additionP1: '袛芯泻褍屑械薪褌 斜褘谢 蟹邪谐褉褍卸械薪 胁 斜邪蟹褍 蟹薪邪薪懈泄',
+    additionP2: ', 胁褘 屑芯卸械褌械 薪邪泄褌懈 械谐芯 胁 褋锌懈褋泻械 写芯泻褍屑械薪褌芯胁 斜邪蟹褘 蟹薪邪薪懈泄.',
+    stop: '袨褋褌邪薪芯胁懈褌褜 芯斜褉邪斜芯褌泻褍',
+    resume: '袙芯蟹芯斜薪芯胁懈褌褜 芯斜褉邪斜芯褌泻褍',
+    navTo: '袩械褉械泄褌懈 泻 写芯泻褍屑械薪褌褍',
+    sideTipTitle: '效褌芯 写邪谢褜褕械',
+    sideTipContent: '袩芯褋谢械 蟹邪胁械褉褕械薪懈褟 懈薪写械泻褋邪褑懈懈 写芯泻褍屑械薪褌邪 斜邪蟹邪 蟹薪邪薪懈泄 屑芯卸械褌 斜褘褌褜 懈薪褌械谐褉懈褉芯胁邪薪邪 胁 锌褉懈谢芯卸械薪懈械 胁 泻邪褔械褋褌胁械 泻芯薪褌械泻褋褌邪, 胁褘 屑芯卸械褌械 薪邪泄褌懈 薪邪褋褌褉芯泄泻褍 泻芯薪褌械泻褋褌邪 薪邪 褋褌褉邪薪懈褑械 prompt orchestration. 袙褘 褌邪泻卸械 屑芯卸械褌械 褋芯蟹写邪褌褜-workflow 锌褉懈谢芯卸械薪懈械 泻邪泻 芯褌写械谢褜薪褘泄 泻邪泻 薪械蟹邪胁懈褋懈屑褘泄 锌谢邪谐懈薪.',
+    modelTitle: '袙褘 褍胁械褉械薪褘, 褔褌芯 褏芯褌懈褌械 芯褋褌邪薪芯胁懈褌褜 胁褋褌褉邪懈胁邪薪懈械?',
+    modelContent: '袝褋谢懈 胁邪屑 薪褍卸薪芯 斜褍写械褌 胁芯蟹芯斜薪芯胁懈褌褜 芯斜褉邪斜芯褌泻褍 锌芯蟹卸械, 胁褘 锌褉芯写芯谢卸懈褌械 褋 褌芯谐芯 屑械褋褌邪, 谐写械 芯褋褌邪薪芯胁懈谢懈褋褜.',
+    modelButtonConfirm: '袩芯写褌胁械褉写懈褌褜',
+    modelButtonCancel: '袨褌屑械薪邪',
+  },
+  jinaReader: {
+    getApiKeyLinkText: '袩芯谢褍褔懈褌械 斜械褋锌谢邪褌薪褘泄 泻谢褞褔 API 胁 jina.ai',
+    configJinaReader: '袧邪褋褌褉芯泄泻邪 Jina Reader',
+    apiKeyPlaceholder: '袣谢褞褔 API 芯褌 jina.ai',
+  },
+  otherDataSource: {
+    learnMore: '袩芯写褉芯斜薪械械',
+    title: '袩芯写泻谢褞褔邪褌褜褋褟 泻 写褉褍谐懈屑 懈褋褌芯褔薪懈泻邪屑 写邪薪薪褘褏?',
+    description: '袙 薪邪褋褌芯褟褖械械 胁褉械屑褟 斜邪蟹邪 蟹薪邪薪懈泄 Dify 懈屑械械褌 谢懈褕褜 芯谐褉邪薪懈褔械薪薪褘械 懈褋褌芯褔薪懈泻懈 写邪薪薪褘褏. 袛芯斜邪胁谢械薪懈械 懈褋褌芯褔薪懈泻邪 写邪薪薪褘褏 胁 斜邪蟹褍 蟹薪邪薪懈泄 Dify 鈥� 褝褌芯 芯褌谢懈褔薪褘泄 褋锌芯褋芯斜 锌芯胁褘褋懈褌褜 谐懈斜泻芯褋褌褜 懈 胁芯蟹屑芯卸薪芯褋褌懈 锌谢邪褌褎芯褉屑褘 写谢褟 胁褋械褏 锌芯谢褜蟹芯胁邪褌械谢械泄. 袧邪褕械 褉褍泻芯胁芯写褋褌胁芯 锌芯 胁泻谢邪写褍 锌芯屑芯卸械褌 胁邪屑 谢械谐泻芯 薪邪褔邪褌褜 褉邪斜芯褌褍. 袩芯卸邪谢褍泄褋褌邪, 薪邪卸屑懈褌械 薪邪 褋褋褘谢泻褍 薪懈卸械, 褔褌芯斜褘 褍蟹薪邪褌褜 斜芯谢褜褕械.',
+  },
+  watercrawl: {
+    getApiKeyLinkText: '袩芯谢褍褔懈褌械 褋胁芯泄 API-泻谢褞褔 褋 watercrawl.dev',
+    configWatercrawl: '袧邪褋褌褉芯懈褌褜 Watercrawl',
+    apiKeyPlaceholder: 'API 泻谢褞褔 褋 watercrawl.dev',
+  },
+}
+
+export default translation
diff --git a/i18n/ru-RU/dataset-documents.ts b/i18n/ru-RU/dataset-documents.ts
new file mode 100644
index 0000000..735266c
--- /dev/null
+++ b/i18n/ru-RU/dataset-documents.ts
@@ -0,0 +1,395 @@
+const translation = {
+  list: {
+    title: '袛芯泻褍屑械薪褌褘',
+    desc: '袟写械褋褜 芯褌芯斜褉邪卸邪褞褌褋褟 胁褋械 褎邪泄谢褘 斜邪蟹褘 蟹薪邪薪懈泄, 懈 胁褋褟 斜邪蟹邪 蟹薪邪薪懈泄 屑芯卸械褌 斜褘褌褜 褋胁褟蟹邪薪邪 褋 褑懈褌邪褌邪屑懈 Dify 懈谢懈 锌褉芯懈薪写械泻褋懈褉芯胁邪薪邪 褋 锌芯屑芯褖褜褞 褔邪褌邪.',
+    addFile: '袛芯斜邪胁懈褌褜 褎邪泄谢',
+    addPages: '袛芯斜邪胁懈褌褜 褋褌褉邪薪懈褑褘',
+    addUrl: '袛芯斜邪胁懈褌褜 URL',
+    table: {
+      header: {
+        fileName: '袧袗袟袙袗袧袠袝 肖袗袡袥袗',
+        words: '小袥袨袙袗',
+        hitCount: '袣袨袥袠效袝小孝袙袨 袨袘袪袗些袝袧袠袡',
+        uploadTime: '袙袪袝袦携 袟袗袚袪校袟袣袠',
+        status: '小孝袗孝校小',
+        action: '袛袝袡小孝袙袠袝',
+        chunkingMode: '袪袝袞袠袦 袛袪袨袘袥袝袧袠携',
+      },
+      rename: '袩械褉械懈屑械薪芯胁邪褌褜',
+      name: '袧邪蟹胁邪薪懈械',
+    },
+    action: {
+      uploadFile: '袟邪谐褉褍蟹懈褌褜 薪芯胁褘泄 褎邪泄谢',
+      settings: '袧邪褋褌褉芯泄泻懈 褋械谐屑械薪褌邪褑懈懈',
+      addButton: '袛芯斜邪胁懈褌褜 褎褉邪谐屑械薪褌',
+      add: '袛芯斜邪胁懈褌褜 褎褉邪谐屑械薪褌',
+      batchAdd: '袩邪泻械褌薪芯械 写芯斜邪胁谢械薪懈械',
+      archive: '袗褉褏懈胁懈褉芯胁邪褌褜',
+      unarchive: '袪邪蟹邪褉褏懈胁懈褉芯胁邪褌褜',
+      delete: '校写邪谢懈褌褜',
+      enableWarning: '袗褉褏懈胁薪褘泄 褎邪泄谢 薪械 屑芯卸械褌 斜褘褌褜 胁泻谢褞褔械薪',
+      sync: '小懈薪褏褉芯薪懈蟹懈褉芯胁邪褌褜',
+    },
+    index: {
+      enable: '袙泻谢褞褔懈褌褜',
+      disable: '袨褌泻谢褞褔懈褌褜',
+      all: '袙褋械',
+      enableTip: '肖邪泄谢 屑芯卸械褌 斜褘褌褜 锌褉芯懈薪写械泻褋懈褉芯胁邪薪',
+      disableTip: '肖邪泄谢 薪械 屑芯卸械褌 斜褘褌褜 锌褉芯懈薪写械泻褋懈褉芯胁邪薪',
+    },
+    status: {
+      queuing: '袙 芯褔械褉械写懈',
+      indexing: '袠薪写械泻褋邪褑懈褟',
+      paused: '袩褉懈芯褋褌邪薪芯胁谢械薪芯',
+      error: '袨褕懈斜泻邪',
+      available: '袛芯褋褌褍锌薪芯',
+      enabled: '袙泻谢褞褔械薪芯',
+      disabled: '袨褌泻谢褞褔械薪芯',
+      archived: '袗褉褏懈胁懈褉芯胁邪薪芯',
+    },
+    empty: {
+      title: '袩芯泻邪 薪械褌 写芯泻褍屑械薪褌芯胁',
+      upload: {
+        tip: '袙褘 屑芯卸械褌械 蟹邪谐褉褍卸邪褌褜 褎邪泄谢褘, 褋懈薪褏褉芯薪懈蟹懈褉芯胁邪褌褜 褋 胁械斜-褋邪泄褌邪 懈谢懈 懈蟹 胁械斜-锌褉懈谢芯卸械薪懈泄, 褌邪泻懈褏 泻邪泻 Notion, GitHub 懈 褌. 写.',
+      },
+      sync: {
+        tip: 'Dify 斜褍写械褌 锌械褉懈芯写懈褔械褋泻懈 蟹邪谐褉褍卸邪褌褜 褎邪泄谢褘 懈蟹 胁邪褕械谐芯 Notion 懈 蟹邪胁械褉褕邪褌褜 芯斜褉邪斜芯褌泻褍.',
+      },
+    },
+    delete: {
+      title: '袙褘 褍胁械褉械薪褘, 褔褌芯 褏芯褌懈褌械 褍写邪谢懈褌褜?',
+      content: '袝褋谢懈 胁邪屑 薪褍卸薪芯 斜褍写械褌 胁芯蟹芯斜薪芯胁懈褌褜 芯斜褉邪斜芯褌泻褍 锌芯蟹卸械, 胁褘 锌褉芯写芯谢卸懈褌械 褋 褌芯谐芯 屑械褋褌邪, 谐写械 芯褋褌邪薪芯胁懈谢懈褋褜',
+    },
+    batchModal: {
+      title: '袩邪泻械褌薪芯械 写芯斜邪胁谢械薪懈械 褎褉邪谐屑械薪褌芯胁',
+      csvUploadTitle: '袩械褉械褌邪褖懈褌械 褋褞写邪 褋胁芯泄 CSV-褎邪泄谢 懈谢懈 ',
+      browse: '芯斜蟹芯褉',
+      tip: 'CSV-褎邪泄谢 写芯谢卸械薪 褋芯芯褌胁械褌褋褌胁芯胁邪褌褜 褋谢械写褍褞褖械泄 褋褌褉褍泻褌褍褉械:',
+      question: '胁芯锌褉芯褋',
+      answer: '芯褌胁械褌',
+      contentTitle: '褋芯写械褉卸懈屑芯械 褎褉邪谐屑械薪褌邪',
+      content: '褋芯写械褉卸懈屑芯械',
+      template: '小泻邪褔邪褌褜 褕邪斜谢芯薪 蟹写械褋褜',
+      cancel: '袨褌屑械薪邪',
+      run: '袟邪锌褍褋褌懈褌褜 锌邪泻械褌',
+      runError: '袨褕懈斜泻邪 蟹邪锌褍褋泻邪 锌邪泻械褌邪',
+      processing: '袙 锌褉芯褑械褋褋械 锌邪泻械褌薪芯泄 芯斜褉邪斜芯褌泻懈',
+      completed: '袠屑锌芯褉褌 蟹邪胁械褉褕械薪',
+      error: '袨褕懈斜泻邪 懈屑锌芯褉褌邪',
+      ok: '袨袣',
+    },
+    learnMore: '袩芯写褉芯斜薪械械',
+  },
+  metadata: {
+    title: '袦械褌邪写邪薪薪褘械',
+    desc: '袦邪褉泻懈褉芯胁泻邪 屑械褌邪写邪薪薪褘褏 写谢褟 写芯泻褍屑械薪褌芯胁 锌芯蟹胁芯谢褟械褌 袠袠 褋胁芯械胁褉械屑械薪薪芯 锌芯谢褍褔邪褌褜 泻 薪懈屑 写芯褋褌褍锌 懈 褉邪褋泻褉褘胁邪褌褜 懈褋褌芯褔薪懈泻 褋褋褘谢芯泻 写谢褟 锌芯谢褜蟹芯胁邪褌械谢械泄.',
+    dateTimeFormat: 'D MMMM YYYY, HH:mm',
+    docTypeSelectTitle: '袩芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 褌懈锌 写芯泻褍屑械薪褌邪',
+    docTypeChangeTitle: '袠蟹屑械薪懈褌褜 褌懈锌 写芯泻褍屑械薪褌邪',
+    docTypeSelectWarning:
+      '袝褋谢懈 褌懈锌 写芯泻褍屑械薪褌邪 斜褍写械褌 懈蟹屑械薪械薪, 蟹邪锌芯谢薪械薪薪褘械 褋械泄褔邪褋 屑械褌邪写邪薪薪褘械 斜芯谢褜褕械 薪械 斜褍写褍褌 褋芯褏褉邪薪械薪褘',
+    firstMetaAction: '袩芯械褏邪谢懈',
+    placeholder: {
+      add: '袛芯斜邪胁懈褌褜 ',
+      select: '袙褘斜褉邪褌褜 ',
+    },
+    source: {
+      upload_file: '袟邪谐褉褍蟹懈褌褜 褎邪泄谢',
+      notion: '小懈薪褏褉芯薪懈蟹懈褉芯胁邪褌褜 懈蟹 Notion',
+      github: '小懈薪褏褉芯薪懈蟹懈褉芯胁邪褌褜 懈蟹 Github',
+    },
+    type: {
+      book: '袣薪懈谐邪',
+      webPage: '袙械斜-褋褌褉邪薪懈褑邪',
+      paper: '小褌邪褌褜褟',
+      socialMediaPost: '袩芯褋褌 胁 褋芯褑懈邪谢褜薪褘褏 褋械褌褟褏',
+      personalDocument: '袥懈褔薪褘泄 写芯泻褍屑械薪褌',
+      businessDocument: '袛械谢芯胁芯泄 写芯泻褍屑械薪褌',
+      IMChat: '效邪褌 胁 屑械褋褋械薪写卸械褉械',
+      wikipediaEntry: '小褌邪褌褜褟 胁 袙懈泻懈锌械写懈懈',
+      notion: '小懈薪褏褉芯薪懈蟹懈褉芯胁邪褌褜 懈蟹 Notion',
+      github: '小懈薪褏褉芯薪懈蟹懈褉芯胁邪褌褜 懈蟹 Github',
+      technicalParameters: '孝械褏薪懈褔械褋泻懈械 锌邪褉邪屑械褌褉褘',
+    },
+    field: {
+      processRule: {
+        processDoc: '袨斜褉邪斜芯褌泻邪 写芯泻褍屑械薪褌邪',
+        segmentRule: '袩褉邪胁懈谢芯 褎褉邪谐屑械薪褌邪褑懈懈',
+        segmentLength: '袛谢懈薪邪 褎褉邪谐屑械薪褌芯胁',
+        processClean: '袨褔懈褋褌泻邪 褌械泻褋褌邪',
+      },
+      book: {
+        title: '袧邪蟹胁邪薪懈械',
+        language: '携蟹褘泻',
+        author: '袗胁褌芯褉',
+        publisher: '袠蟹写邪褌械谢褜',
+        publicationDate: '袛邪褌邪 锌褍斜谢懈泻邪褑懈懈',
+        ISBN: 'ISBN',
+        category: '袣邪褌械谐芯褉懈褟',
+      },
+      webPage: {
+        title: '袧邪蟹胁邪薪懈械',
+        url: 'URL',
+        language: '携蟹褘泻',
+        authorPublisher: '袗胁褌芯褉/袠蟹写邪褌械谢褜',
+        publishDate: '袛邪褌邪 锌褍斜谢懈泻邪褑懈懈',
+        topicKeywords: '孝械屑褘/袣谢褞褔械胁褘械 褋谢芯胁邪',
+        description: '袨锌懈褋邪薪懈械',
+      },
+      paper: {
+        title: '袧邪蟹胁邪薪懈械',
+        language: '携蟹褘泻',
+        author: '袗胁褌芯褉',
+        publishDate: '袛邪褌邪 锌褍斜谢懈泻邪褑懈懈',
+        journalConferenceName: '袧邪蟹胁邪薪懈械 卸褍褉薪邪谢邪/泻芯薪褎械褉械薪褑懈懈',
+        volumeIssuePage: '孝芯屑/袙褘锌褍褋泻/小褌褉邪薪懈褑邪',
+        DOI: 'DOI',
+        topicsKeywords: '孝械屑褘/袣谢褞褔械胁褘械 褋谢芯胁邪',
+        abstract: '袗薪薪芯褌邪褑懈褟',
+      },
+      socialMediaPost: {
+        platform: '袩谢邪褌褎芯褉屑邪',
+        authorUsername: '袗胁褌芯褉/袠屑褟 锌芯谢褜蟹芯胁邪褌械谢褟',
+        publishDate: '袛邪褌邪 锌褍斜谢懈泻邪褑懈懈',
+        postURL: 'URL 锌芯褋褌邪',
+        topicsTags: '孝械屑褘/孝械谐懈',
+      },
+      personalDocument: {
+        title: '袧邪蟹胁邪薪懈械',
+        author: '袗胁褌芯褉',
+        creationDate: '袛邪褌邪 褋芯蟹写邪薪懈褟',
+        lastModifiedDate: '袛邪褌邪 锌芯褋谢械写薪械谐芯 懈蟹屑械薪械薪懈褟',
+        documentType: '孝懈锌 写芯泻褍屑械薪褌邪',
+        tagsCategory: '孝械谐懈/袣邪褌械谐芯褉懈褟',
+      },
+      businessDocument: {
+        title: '袧邪蟹胁邪薪懈械',
+        author: '袗胁褌芯褉',
+        creationDate: '袛邪褌邪 褋芯蟹写邪薪懈褟',
+        lastModifiedDate: '袛邪褌邪 锌芯褋谢械写薪械谐芯 懈蟹屑械薪械薪懈褟',
+        documentType: '孝懈锌 写芯泻褍屑械薪褌邪',
+        departmentTeam: '袨褌写械谢/袣芯屑邪薪写邪',
+      },
+      IMChat: {
+        chatPlatform: '袩谢邪褌褎芯褉屑邪 褔邪褌邪',
+        chatPartiesGroupName: '校褔邪褋褌薪懈泻懈 褔邪褌邪/袧邪蟹胁邪薪懈械 谐褉褍锌锌褘',
+        participants: '校褔邪褋褌薪懈泻懈',
+        startDate: '袛邪褌邪 薪邪褔邪谢邪',
+        endDate: '袛邪褌邪 芯泻芯薪褔邪薪懈褟',
+        topicsKeywords: '孝械屑褘/袣谢褞褔械胁褘械 褋谢芯胁邪',
+        fileType: '孝懈锌 褎邪泄谢邪',
+      },
+      wikipediaEntry: {
+        title: '袧邪蟹胁邪薪懈械',
+        language: '携蟹褘泻',
+        webpageURL: 'URL 胁械斜-褋褌褉邪薪懈褑褘',
+        editorContributor: '袪械写邪泻褌芯褉/袗胁褌芯褉',
+        lastEditDate: '袛邪褌邪 锌芯褋谢械写薪械谐芯 褉械写邪泻褌懈褉芯胁邪薪懈褟',
+        summaryIntroduction: '袣褉邪褌泻芯械 褋芯写械褉卸邪薪懈械/袙胁械写械薪懈械',
+      },
+      notion: {
+        title: '袧邪蟹胁邪薪懈械',
+        language: '携蟹褘泻',
+        author: '袗胁褌芯褉',
+        createdTime: '袙褉械屑褟 褋芯蟹写邪薪懈褟',
+        lastModifiedTime: '袙褉械屑褟 锌芯褋谢械写薪械谐芯 懈蟹屑械薪械薪懈褟',
+        url: 'URL',
+        tag: '孝械谐',
+        description: '袨锌懈褋邪薪懈械',
+      },
+      github: {
+        repoName: '袧邪蟹胁邪薪懈械 褉械锌芯蟹懈褌芯褉懈褟',
+        repoDesc: '袨锌懈褋邪薪懈械 褉械锌芯蟹懈褌芯褉懈褟',
+        repoOwner: '袙谢邪写械谢械褑 褉械锌芯蟹懈褌芯褉懈褟',
+        fileName: '袧邪蟹胁邪薪懈械 褎邪泄谢邪',
+        filePath: '袩褍褌褜 泻 褎邪泄谢褍',
+        programmingLang: '携蟹褘泻 锌褉芯谐褉邪屑屑懈褉芯胁邪薪懈褟',
+        url: 'URL',
+        license: '袥懈褑械薪蟹懈褟',
+        lastCommitTime: '袙褉械屑褟 锌芯褋谢械写薪械谐芯 泻芯屑屑懈褌邪',
+        lastCommitAuthor: '袗胁褌芯褉 锌芯褋谢械写薪械谐芯 泻芯屑屑懈褌邪',
+      },
+      originInfo: {
+        originalFilename: '袠褋褏芯写薪芯械 懈屑褟 褎邪泄谢邪',
+        originalFileSize: '袠褋褏芯写薪褘泄 褉邪蟹屑械褉 褎邪泄谢邪',
+        uploadDate: '袛邪褌邪 蟹邪谐褉褍蟹泻懈',
+        lastUpdateDate: '袛邪褌邪 锌芯褋谢械写薪械谐芯 芯斜薪芯胁谢械薪懈褟',
+        source: '袠褋褌芯褔薪懈泻',
+      },
+      technicalParameters: {
+        segmentSpecification: '小锌械褑懈褎懈泻邪褑懈褟 褎褉邪谐屑械薪褌芯胁',
+        segmentLength: '袛谢懈薪邪 褎褉邪谐屑械薪褌芯胁',
+        avgParagraphLength: '小褉械写薪褟褟 写谢懈薪邪 邪斜蟹邪褑邪',
+        paragraphs: '袗斜蟹邪褑褘',
+        hitCount: '袣芯谢懈褔械褋褌胁芯 芯斜褉邪褖械薪懈泄',
+        embeddingTime: '袙褉械屑褟 胁褋褌褉邪懈胁邪薪懈褟',
+        embeddedSpend: '袩芯褌褉邪褔械薪芯 薪邪 胁褋褌褉邪懈胁邪薪懈械',
+      },
+    },
+    languageMap: {
+      zh: '袣懈褌邪泄褋泻懈泄',
+      en: '袗薪谐谢懈泄褋泻懈泄',
+      es: '袠褋锌邪薪褋泻懈泄',
+      fr: '肖褉邪薪褑褍蟹褋泻懈泄',
+      de: '袧械屑械褑泻懈泄',
+      ja: '携锌芯薪褋泻懈泄',
+      ko: '袣芯褉械泄褋泻懈泄',
+      ru: '袪褍褋褋泻懈泄',
+      ar: '袗褉邪斜褋泻懈泄',
+      pt: '袩芯褉褌褍谐邪谢褜褋泻懈泄',
+      it: '袠褌邪谢褜褟薪褋泻懈泄',
+      nl: '袚芯谢谢邪薪写褋泻懈泄',
+      pl: '袩芯谢褜褋泻懈泄',
+      sv: '楔胁械写褋泻懈泄',
+      tr: '孝褍褉械褑泻懈泄',
+      he: '袠胁褉懈褌',
+      hi: '啸懈薪写懈',
+      da: '袛邪褌褋泻懈泄',
+      fi: '肖懈薪褋泻懈泄',
+      no: '袧芯褉胁械卸褋泻懈泄',
+      hu: '袙械薪谐械褉褋泻懈泄',
+      el: '袚褉械褔械褋泻懈泄',
+      cs: '效械褕褋泻懈泄',
+      th: '孝邪泄褋泻懈泄',
+      id: '袠薪写芯薪械蟹懈泄褋泻懈泄',
+    },
+    categoryMap: {
+      book: {
+        fiction: '啸褍写芯卸械褋褌胁械薪薪邪褟 谢懈褌械褉邪褌褍褉邪',
+        biography: '袘懈芯谐褉邪褎懈褟',
+        history: '袠褋褌芯褉懈褟',
+        science: '袧邪褍泻邪',
+        technology: '孝械褏薪芯谢芯谐懈懈',
+        education: '袨斜褉邪蟹芯胁邪薪懈械',
+        philosophy: '肖懈谢芯褋芯褎懈褟',
+        religion: '袪械谢懈谐懈褟',
+        socialSciences: '小芯褑懈邪谢褜薪褘械 薪邪褍泻懈',
+        art: '袠褋泻褍褋褋褌胁芯',
+        travel: '袩褍褌械褕械褋褌胁懈褟',
+        health: '袟写芯褉芯胁褜械',
+        selfHelp: '小邪屑芯锌芯屑芯褖褜',
+        businessEconomics: '袘懈蟹薪械褋/协泻芯薪芯屑懈泻邪',
+        cooking: '袣褍谢懈薪邪褉懈褟',
+        childrenYoungAdults: '袛械褌褋泻邪褟/袩芯写褉芯褋褌泻芯胁邪褟 谢懈褌械褉邪褌褍褉邪',
+        comicsGraphicNovels: '袣芯屑懈泻褋褘/袚褉邪褎懈褔械褋泻懈械 褉芯屑邪薪褘',
+        poetry: '袩芯褝蟹懈褟',
+        drama: '袛褉邪屑邪褌褍褉谐懈褟',
+        other: '袛褉褍谐芯械',
+      },
+      personalDoc: {
+        notes: '袟邪屑械褌泻懈',
+        blogDraft: '效械褉薪芯胁懈泻 斜谢芯谐邪',
+        diary: '袛薪械胁薪懈泻',
+        researchReport: '袧邪褍褔薪褘泄 芯褌褔械褌',
+        bookExcerpt: '袨褌褉褘胁芯泻 懈蟹 泻薪懈谐懈',
+        schedule: '袪邪褋锌懈褋邪薪懈械',
+        list: '小锌懈褋芯泻',
+        projectOverview: '袨斜蟹芯褉 锌褉芯械泻褌邪',
+        photoCollection: '袣芯谢谢械泻褑懈褟 褎芯褌芯谐褉邪褎懈泄',
+        creativeWriting: '孝胁芯褉褔械褋泻芯械 锌懈褋褜屑芯',
+        codeSnippet: '肖褉邪谐屑械薪褌 泻芯写邪',
+        designDraft: '效械褉薪芯胁懈泻 写懈蟹邪泄薪邪',
+        personalResume: '袥懈褔薪芯械 褉械蟹褞屑械',
+        other: '袛褉褍谐芯械',
+      },
+      businessDoc: {
+        meetingMinutes: '袩褉芯褌芯泻芯谢 褋芯斜褉邪薪懈褟',
+        researchReport: '袧邪褍褔薪褘泄 芯褌褔械褌',
+        proposal: '袩褉械写谢芯卸械薪懈械',
+        employeeHandbook: '小锌褉邪胁芯褔薪懈泻 褋芯褌褉褍写薪懈泻邪',
+        trainingMaterials: '校褔械斜薪褘械 屑邪褌械褉懈邪谢褘',
+        requirementsDocument: '袛芯泻褍屑械薪褌 褋 褌褉械斜芯胁邪薪懈褟屑懈',
+        designDocument: '袩褉芯械泻褌薪褘泄 写芯泻褍屑械薪褌',
+        productSpecification: '小锌械褑懈褎懈泻邪褑懈褟 锌褉芯写褍泻褌邪',
+        financialReport: '肖懈薪邪薪褋芯胁褘泄 芯褌褔械褌',
+        marketAnalysis: '袗薪邪谢懈蟹 褉褘薪泻邪',
+        projectPlan: '袩谢邪薪 锌褉芯械泻褌邪',
+        teamStructure: '小褌褉褍泻褌褍褉邪 泻芯屑邪薪写褘',
+        policiesProcedures: '袩芯谢懈褌懈泻懈 懈 锌褉芯褑械写褍褉褘',
+        contractsAgreements: '袛芯谐芯胁芯褉褘 懈 褋芯谐谢邪褕械薪懈褟',
+        emailCorrespondence: '袩械褉械锌懈褋泻邪 锌芯 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌械',
+        other: '袛褉褍谐芯械',
+      },
+    },
+  },
+  embedding: {
+    processing: '袪邪褋褔械褌 褝屑斜械写写懈薪谐芯胁...',
+    paused: '袪邪褋褔械褌 褝屑斜械写写懈薪谐芯胁 锌褉懈芯褋褌邪薪芯胁谢械薪',
+    completed: '袙褋褌褉邪懈胁邪薪懈械 蟹邪胁械褉褕械薪芯',
+    error: '袨褕懈斜泻邪 褉邪褋褔械褌邪 褝屑斜械写写懈薪谐芯胁',
+    docName: '袩褉械写胁邪褉懈褌械谢褜薪邪褟 芯斜褉邪斜芯褌泻邪 写芯泻褍屑械薪褌邪',
+    mode: '袩褉邪胁懈谢芯 褋械谐屑械薪褌邪褑懈懈',
+    segmentLength: '袛谢懈薪邪 褎褉邪谐屑械薪褌芯胁',
+    textCleaning: '袩褉械写胁邪褉懈褌械谢褜薪邪褟 芯褔懈褋褌泻邪 褌械泻褋褌邪',
+    segments: '袗斜蟹邪褑褘',
+    highQuality: '袪械卸懈屑 胁褘褋芯泻芯谐芯 泻邪褔械褋褌胁邪',
+    economy: '协泻芯薪芯屑懈褔薪褘泄 褉械卸懈屑',
+    estimate: '袨褑械薪芯褔薪芯械 锌芯褌褉械斜谢械薪懈械',
+    stop: '袨褋褌邪薪芯胁懈褌褜 芯斜褉邪斜芯褌泻褍',
+    resume: '袙芯蟹芯斜薪芯胁懈褌褜 芯斜褉邪斜芯褌泻褍',
+    automatic: '袗胁褌芯屑邪褌懈褔械褋泻懈',
+    custom: '袩芯谢褜蟹芯胁邪褌械谢褜褋泻懈泄',
+    previewTip: '袩褉械写胁邪褉懈褌械谢褜薪褘泄 锌褉芯褋屑芯褌褉 邪斜蟹邪褑械胁 斜褍写械褌 写芯褋褌褍锌械薪 锌芯褋谢械 蟹邪胁械褉褕械薪懈褟 褉邪褋褔械褌邪 褝屑斜械写写懈薪谐芯胁',
+    parentMaxTokens: '袪芯写懈褌械谢褜',
+    childMaxTokens: '袪械斜褢薪芯泻',
+    hierarchical: '袪芯写懈褌械谢褜-写芯褔械褉薪懈泄',
+    pause: '袩邪褍蟹邪',
+  },
+  segment: {
+    paragraphs: '袗斜蟹邪褑褘',
+    keywords: '袣谢褞褔械胁褘械 褋谢芯胁邪',
+    addKeyWord: '袛芯斜邪胁懈褌褜 泻谢褞褔械胁芯械 褋谢芯胁芯',
+    keywordError: '袦邪泻褋懈屑邪谢褜薪邪褟 写谢懈薪邪 泻谢褞褔械胁芯谐芯 褋谢芯胁邪 - 20',
+    characters: '褋懈屑胁芯谢芯胁',
+    hitCount: '袣芯谢懈褔械褋褌胁芯 芯斜褉邪褖械薪懈泄',
+    vectorHash: '袙械泻褌芯褉薪褘泄 褏褝褕: ',
+    questionPlaceholder: '写芯斜邪胁褜褌械 胁芯锌褉芯褋 蟹写械褋褜',
+    questionEmpty: '袙芯锌褉芯褋 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
+    answerPlaceholder: '写芯斜邪胁褜褌械 芯褌胁械褌 蟹写械褋褜',
+    answerEmpty: '袨褌胁械褌 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
+    contentPlaceholder: '写芯斜邪胁褜褌械 褋芯写械褉卸懈屑芯械 蟹写械褋褜',
+    contentEmpty: '小芯写械褉卸懈屑芯械 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
+    newTextSegment: '袧芯胁褘泄 褌械泻褋褌芯胁褘泄 褋械谐屑械薪褌',
+    newQaSegment: '袧芯胁褘泄 褋械谐屑械薪褌 胁芯锌褉芯褋-芯褌胁械褌',
+    delete: '校写邪谢懈褌褜 褝褌芯褌 褎褉邪谐屑械薪褌?',
+    chunks_other: '袣校小袣袠',
+    searchResults_one: '袪袝袟校袥鞋孝袗孝',
+    parentChunk: '袪芯写懈褌械谢褜褋泻懈泄 斜谢芯泻',
+    characters_other: '锌懈褋褜屑械薪邪',
+    edited: '袨孝袪袝袛袗袣孝袠袪袨袙袗袧蝎',
+    regenerationSuccessMessage: '袙褘 屑芯卸械褌械 蟹邪泻褉褘褌褜 褝褌芯 芯泻薪芯.',
+    searchResults_other: '袪袝袟校袥鞋孝袗孝蝎',
+    regeneratingTitle: '袪械谐械薪械褉邪褑懈褟 写芯褔械褉薪懈褏 斜谢芯泻芯胁',
+    parentChunks_one: '袪袨袛袠孝袝袥鞋小袣袠袡 袘袥袨袣',
+    childChunk: '效邪泄谢写-效邪薪泻',
+    editedAt: '袨褌褉械写邪泻褌懈褉芯胁邪薪芯 胁',
+    editChildChunk: '袪械写邪泻褌懈褉芯胁邪薪懈械 写芯褔械褉薪械谐芯 褎褉邪谐屑械薪褌邪',
+    parentChunks_other: '袪袨袛袠孝袝袥鞋小袣袠袝 袘袥袨袣袠',
+    regenerationSuccessTitle: '袪械谐械薪械褉邪褑懈褟 蟹邪胁械褉褕械薪邪',
+    childChunks_one: '袛袨效袝袪袧袠袡 效袗袧袣',
+    newChunk: '袧芯胁褘泄 褔邪薪泻',
+    addAnother: '袛芯斜邪胁懈褌褜 械褖械 芯写懈薪',
+    clearFilter: '袨褔懈褋褌懈褌褜 褎懈谢褜褌褉',
+    addChunk: '袛芯斜邪胁懈褌褜 褔邪薪泻',
+    editParentChunk: '袪械写邪泻褌懈褉芯胁邪薪懈械 褉芯写懈褌械谢褜褋泻芯谐芯 斜谢芯泻邪',
+    chunkDetail: '袛械褌邪谢褜 效邪薪泻邪',
+    regenerationConfirmMessage: '袩褉懈 锌芯胁褌芯褉薪芯屑 褋芯蟹写邪薪懈懈 写芯褔械褉薪懈褏 斜谢芯泻芯胁 褌械泻褍褖懈械 写芯褔械褉薪懈械 斜谢芯泻懈 斜褍写褍褌 锌械褉械蟹邪锌懈褋邪薪褘, 胁泻谢褞褔邪褟 芯褌褉械写邪泻褌懈褉芯胁邪薪薪褘械 懈 胁薪芯胁褜 写芯斜邪胁谢械薪薪褘械 斜谢芯泻懈. 袪械谐械薪械褉邪褑懈褞 薪械谢褜蟹褟 芯褌屑械薪懈褌褜.',
+    collapseChunks: '小胁芯褉邪褔懈胁邪薪懈械 泻褍褋泻芯胁',
+    regenerationConfirmTitle: '袙褘 褏芯褌懈褌械 褉械谐械薪械褉懈褉芯胁邪褌褜 写芯褔械褉薪懈械 泻褍褋泻懈?',
+    searchResults_zero: '袪袝袟校袥鞋孝袗孝',
+    childChunks_other: '袛袝孝小袣袠袝 袣校小袨效袣袠',
+    childChunkAdded: '袛芯斜邪胁谢械薪 1 写芯褔械褉薪懈泄 褔邪薪泻',
+    editChunk: '袪械写邪泻褌懈褉芯胁邪褌褜 褎褉邪谐屑械薪褌',
+    empty: '效邪薪泻 薪械 薪邪泄写械薪',
+    chunks_one: '袥袨袦袨孝鞋',
+    regeneratingMessage: '协褌芯 屑芯卸械褌 蟹邪薪褟褌褜 薪械泻芯褌芯褉芯械 胁褉械屑褟, 锌芯卸邪谢褍泄褋褌邪, 锌芯写芯卸写懈褌械...',
+    chunkAdded: '袛芯斜邪胁谢械薪 1 斜谢芯泻',
+    chunk: '袥芯屑芯褌褜',
+    expandChunks: '袪邪蟹胁械褉薪褍褌褜 褔邪薪泻懈',
+    characters_one: '褏邪褉邪泻褌械褉',
+    addChildChunk: '袛芯斜邪胁懈褌褜 写芯褔械褉薪懈泄 褔邪薪泻',
+    newChildChunk: '袧芯胁褘泄 写芯褔械褉薪懈泄 褔邪薪泻',
+  },
+}
+
+export default translation
diff --git a/i18n/ru-RU/dataset-hit-testing.ts b/i18n/ru-RU/dataset-hit-testing.ts
new file mode 100644
index 0000000..5ac504e
--- /dev/null
+++ b/i18n/ru-RU/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: '孝械褋褌懈褉芯胁邪薪懈械 锌芯懈褋泻邪',
+  desc: '袩褉芯胁械褉褜褌械 褝褎褎械泻褌懈胁薪芯褋褌褜 锌芯懈褋泻邪 胁 斜邪蟹械 蟹薪邪薪懈泄 薪邪 芯褋薪芯胁械 蟹邪写邪薪薪芯谐芯 褌械泻褋褌邪 蟹邪锌褉芯褋邪.',
+  dateTimeFormat: 'DD.MM.YYYY HH:mm',
+  recents: '袧械写邪胁薪懈械',
+  table: {
+    header: {
+      source: '袠褋褌芯褔薪懈泻',
+      text: '孝械泻褋褌',
+      time: '袙褉械屑褟',
+    },
+  },
+  input: {
+    title: '袠褋褏芯写薪褘泄 褌械泻褋褌',
+    placeholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 褌械泻褋褌, 褉械泻芯屑械薪写褍械褌褋褟 懈褋锌芯谢褜蟹芯胁邪褌褜 泻芯褉芯褌泻芯械 锌芯胁械褋褌胁芯胁邪褌械谢褜薪芯械 锌褉械写谢芯卸械薪懈械.',
+    countWarning: '袛芯 200 褋懈屑胁芯谢芯胁.',
+    indexWarning: '孝芯谢褜泻芯 斜邪蟹邪 蟹薪邪薪懈泄 胁褘褋芯泻芯谐芯 泻邪褔械褋褌胁邪.',
+    testing: '孝械褋褌懈褉芯胁邪薪懈械',
+  },
+  hit: {
+    title: '袧袗袡袛袝袧袧蝎袝 袗袘袟袗笑蝎',
+    emptyTip: '袪械蟹褍谢褜褌邪褌褘 褌械褋褌懈褉芯胁邪薪懈褟 锌芯懈褋泻邪 斜褍写褍褌 芯褌芯斜褉邪卸邪褌褜褋褟 蟹写械褋褜',
+  },
+  noRecentTip: '袟写械褋褜 薪械褌 褉械蟹褍谢褜褌邪褌芯胁 薪械写邪胁薪懈褏 蟹邪锌褉芯褋芯胁',
+  viewChart: '袩芯褋屑芯褌褉械褌褜 袙袝袣孝袨袪袧校挟 袛袠袗袚袪袗袦袦校',
+  viewDetail: '袩芯写褉芯斜薪械械',
+  settingTitle: '袧邪褋褌褉芯泄泻邪 懈蟹胁谢械褔械薪懈褟',
+  records: '袟邪锌懈褋懈',
+  hitChunks: '袩芯锌邪写邪薪懈械 {{num}} 写芯褔械褉薪懈褏 褔邪薪泻芯胁',
+  chunkDetail: '袛械褌邪谢褜 效邪薪泻邪',
+  open: '袨褌泻褉褘褌褘泄',
+  keyword: '袣谢褞褔械胁褘械 褋谢芯胁邪',
+}
+
+export default translation
diff --git a/i18n/ru-RU/dataset-settings.ts b/i18n/ru-RU/dataset-settings.ts
new file mode 100644
index 0000000..b91a59e
--- /dev/null
+++ b/i18n/ru-RU/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: '袧邪褋褌褉芯泄泻懈 斜邪蟹褘 蟹薪邪薪懈泄',
+  desc: '袟写械褋褜 胁褘 屑芯卸械褌械 懈蟹屑械薪懈褌褜 褋胁芯泄褋褌胁邪 懈 屑械褌芯写褘 褉邪斜芯褌褘 斜邪蟹褘 蟹薪邪薪懈泄.',
+  form: {
+    name: '袧邪蟹胁邪薪懈械 斜邪蟹褘 蟹薪邪薪懈泄',
+    namePlaceholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 薪邪蟹胁邪薪懈械 斜邪蟹褘 蟹薪邪薪懈泄',
+    nameError: '袧邪蟹胁邪薪懈械 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
+    desc: '袨锌懈褋邪薪懈械 斜邪蟹褘 蟹薪邪薪懈泄',
+    descInfo: '袩芯卸邪谢褍泄褋褌邪, 薪邪锌懈褕懈褌械 褔械褌泻芯械 褌械泻褋褌芯胁芯械 芯锌懈褋邪薪懈械, 褔褌芯斜褘 芯斜褉懈褋芯胁邪褌褜 褋芯写械褉卸邪薪懈械 斜邪蟹褘 蟹薪邪薪懈泄. 协褌芯 芯锌懈褋邪薪懈械 斜褍写械褌 懈褋锌芯谢褜蟹芯胁邪褌褜褋褟 胁 泻邪褔械褋褌胁械 芯褋薪芯胁褘 写谢褟 褋芯锌芯褋褌邪胁谢械薪懈褟 锌褉懈 胁褘斜芯褉械 懈蟹 薪械褋泻芯谢褜泻懈褏 斜邪蟹 蟹薪邪薪懈泄 写谢褟 胁褘胁芯写邪.',
+    descPlaceholder: '袨锌懈褕懈褌械, 褔褌芯 薪邪褏芯写懈褌褋褟 胁 褝褌芯泄 斜邪蟹械 蟹薪邪薪懈泄. 袩芯写褉芯斜薪芯械 芯锌懈褋邪薪懈械 锌芯蟹胁芯谢褟械褌 袠袠 褋胁芯械胁褉械屑械薪薪芯 锌芯谢褍褔邪褌褜 写芯褋褌褍锌 泻 褋芯写械褉卸懈屑芯屑褍 斜邪蟹褘 蟹薪邪薪懈泄. 袝褋谢懈 芯褋褌邪胁懈褌褜 锌褍褋褌褘屑, Dify 斜褍写械褌 懈褋锌芯谢褜蟹芯胁邪褌褜 褋褌褉邪褌械谐懈褞 锌芯懈褋泻邪 锌芯 褍屑芯谢褔邪薪懈褞.',
+    descWrite: '校蟹薪邪泄褌械, 泻邪泻 薪邪锌懈褋邪褌褜 褏芯褉芯褕械械 芯锌懈褋邪薪懈械 斜邪蟹褘 蟹薪邪薪懈泄.',
+    permissions: '袪邪蟹褉械褕械薪懈褟',
+    permissionsOnlyMe: '孝芯谢褜泻芯 褟',
+    permissionsAllMember: '袙褋械 褍褔邪褋褌薪懈泻懈 泻芯屑邪薪写褘',
+    permissionsInvitedMembers: '袨褌写械谢褜薪褘械 褍褔邪褋褌薪懈泻懈 泻芯屑邪薪写褘',
+    me: '(袙褘)',
+    indexMethod: '袦械褌芯写 懈薪写械泻褋邪褑懈懈',
+    indexMethodHighQuality: '袙褘褋芯泻芯械 泻邪褔械褋褌胁芯',
+    indexMethodHighQualityTip: '袙褘蟹芯胁 屑芯写械谢懈 胁褋褌褉邪懈胁邪薪懈褟 写谢褟 芯斜褉邪斜芯褌泻懈, 褔褌芯斜褘 芯斜械褋锌械褔懈褌褜 斜芯谢械械 胁褘褋芯泻褍褞 褌芯褔薪芯褋褌褜 锌褉懈 蟹邪锌褉芯褋邪褏 锌芯谢褜蟹芯胁邪褌械谢械泄.',
+    indexMethodEconomy: '协泻芯薪芯屑懈褔薪褘泄',
+    indexMethodEconomyTip: '袠褋锌芯谢褜蟹褍泄褌械 邪胁褌芯薪芯屑薪褘械 胁械泻褌芯褉薪褘械 写胁懈卸泻懈, 懈薪写械泻褋褘 泻谢褞褔械胁褘褏 褋谢芯胁 懈 褌. 写., 褔褌芯斜褘 褋薪懈蟹懈褌褜 褌芯褔薪芯褋褌褜, 薪械 褌褉邪褌褟 褌芯泻械薪褘',
+    embeddingModel: '袦芯写械谢褜 胁褋褌褉邪懈胁邪薪懈褟',
+    embeddingModelTip: '袠蟹屑械薪懈褌褜 胁褋褌褉芯械薪薪褍褞 屑芯写械谢褜, 锌芯卸邪谢褍泄褋褌邪, 锌械褉械泄写懈褌械 胁 ',
+    embeddingModelTipLink: '袧邪褋褌褉芯泄泻懈',
+    retrievalSetting: {
+      title: '袧邪褋褌褉芯泄泻懈 锌芯懈褋泻邪',
+      learnMore: '校蟹薪邪褌褜 斜芯谢褜褕械',
+      description: ' 芯 屑械褌芯写械 锌芯懈褋泻邪.',
+      longDescription: ' 芯 屑械褌芯写械 锌芯懈褋泻邪, 胁褘 屑芯卸械褌械 懈蟹屑械薪懈褌褜 褝褌芯 胁 谢褞斜芯械 胁褉械屑褟 胁 薪邪褋褌褉芯泄泻邪褏 斜邪蟹褘 蟹薪邪薪懈泄.',
+      method: '袦械褌芯写 懈蟹胁谢械褔械薪懈褟',
+    },
+    save: '小芯褏褉邪薪懈褌褜',
+    externalKnowledgeAPI: 'API 胁薪械褕薪懈褏 蟹薪邪薪懈泄',
+    retrievalSettings: '袧邪褋褌褉芯泄泻懈 懈蟹胁谢械褔械薪懈褟',
+    externalKnowledgeID: '袙薪械褕薪懈泄 懈写械薪褌懈褎懈泻邪褌芯褉 斜邪蟹褘 蟹薪邪薪懈泄',
+    helpText: '校蟹薪邪泄褌械, 泻邪泻 薪邪锌懈褋邪褌褜 褏芯褉芯褕械械 芯锌懈褋邪薪懈械 薪邪斜芯褉邪 写邪薪薪褘褏.',
+    upgradeHighQualityTip: '袩芯褋谢械 芯斜薪芯胁谢械薪懈褟 写芯 褉械卸懈屑邪 芦袙褘褋芯泻芯械 泻邪褔械褋褌胁芯禄 胁芯蟹胁褉邪褌 泻 褝泻芯薪芯屑懈褔薪芯屑褍 褉械卸懈屑褍 薪械胁芯蟹屑芯卸械薪',
+    indexMethodChangeToEconomyDisabledTip: '袧械写芯褋褌褍锌薪芯 写谢褟 锌芯薪懈卸械薪懈褟 褍褉芯胁薪褟 褋 HQ 写芯 ECO',
+    searchModel: '袩芯懈褋泻 屑芯写械谢懈',
+  },
+}
+
+export default translation
diff --git a/i18n/ru-RU/dataset.ts b/i18n/ru-RU/dataset.ts
new file mode 100644
index 0000000..33a4cdf
--- /dev/null
+++ b/i18n/ru-RU/dataset.ts
@@ -0,0 +1,221 @@
+const translation = {
+  knowledge: '袘邪蟹邪 蟹薪邪薪懈泄',
+  documentCount: ' 写芯泻褍屑械薪褌芯胁',
+  wordCount: ' 褌褘褋. 褋谢芯胁',
+  appCount: ' 褋胁褟蟹邪薪薪褘褏 锌褉懈谢芯卸械薪懈泄',
+  createDataset: '小芯蟹写邪褌褜 斜邪蟹褍 蟹薪邪薪懈泄',
+  createDatasetIntro: '袠屑锌芯褉褌懈褉褍泄褌械 褋胁芯懈 褋芯斜褋褌胁械薪薪褘械 褌械泻褋褌芯胁褘械 写邪薪薪褘械 懈谢懈 蟹邪锌懈褋褘胁邪泄褌械 写邪薪薪褘械 胁 褉械卸懈屑械 褉械邪谢褜薪芯谐芯 胁褉械屑械薪懈 褔械褉械蟹 Webhook 写谢褟 褍谢褍褔褕械薪懈褟 泻芯薪褌械泻褋褌邪 LLM.',
+  deleteDatasetConfirmTitle: '校写邪谢懈褌褜 褝褌褍 斜邪蟹褍 蟹薪邪薪懈泄?',
+  deleteDatasetConfirmContent:
+    '校写邪谢械薪懈械 斜邪蟹褘 蟹薪邪薪懈泄 薪械芯斜褉邪褌懈屑芯. 袩芯谢褜蟹芯胁邪褌械谢懈 斜芯谢褜褕械 薪械 褋屑芯谐褍褌 锌芯谢褍褔懈褌褜 写芯褋褌褍锌 泻 胁邪褕械泄 斜邪蟹械 蟹薪邪薪懈泄, 懈 胁褋械 薪邪褋褌褉芯泄泻懈 锌芯写褋泻邪蟹芯泻 懈 卸褍褉薪邪谢褘 斜褍写褍褌 斜械蟹胁芯蟹胁褉邪褌薪芯 褍写邪谢械薪褘.',
+  datasetUsedByApp: '袘邪蟹邪 蟹薪邪薪懈泄 懈褋锌芯谢褜蟹褍械褌褋褟 薪械泻芯褌芯褉褘屑懈 锌褉懈谢芯卸械薪懈褟屑懈. 袩褉懈谢芯卸械薪懈褟 斜芯谢褜褕械 薪械 褋屑芯谐褍褌 懈褋锌芯谢褜蟹芯胁邪褌褜 褝褌褍 斜邪蟹褍 蟹薪邪薪懈泄, 懈 胁褋械 薪邪褋褌褉芯泄泻懈 锌芯写褋泻邪蟹芯泻 懈 卸褍褉薪邪谢褘 斜褍写褍褌 斜械蟹胁芯蟹胁褉邪褌薪芯 褍写邪谢械薪褘.',
+  datasetDeleted: '袘邪蟹邪 蟹薪邪薪懈泄 褍写邪谢械薪邪',
+  datasetDeleteFailed: '袧械 褍写邪谢芯褋褜 褍写邪谢懈褌褜 斜邪蟹褍 蟹薪邪薪懈泄',
+  didYouKnow: '袟薪邪械褌械 谢懈 胁褘?',
+  intro1: '袘邪蟹褍 蟹薪邪薪懈泄 屑芯卸薪芯 懈薪褌械谐褉懈褉芯胁邪褌褜 胁 锌褉懈谢芯卸械薪懈械 Dify ',
+  intro2: '胁 泻邪褔械褋褌胁械 泻芯薪褌械泻褋褌邪',
+  intro3: ',',
+  intro4: '懈谢懈 械械 ',
+  intro5: '屑芯卸薪芯 褋芯蟹写邪褌褜',
+  intro6: ' 泻邪泻 芯褌写械谢褜薪褘泄 锌谢邪谐懈薪 懈薪写械泻褋邪 ChatGPT 写谢褟 锌褍斜谢懈泻邪褑懈懈',
+  unavailable: '袧械写芯褋褌褍锌薪芯',
+  unavailableTip: '袦芯写械谢褜 胁褋褌褉邪懈胁邪薪懈褟 薪械写芯褋褌褍锌薪邪, 薪械芯斜褏芯写懈屑芯 薪邪褋褌褉芯懈褌褜 屑芯写械谢褜 胁褋褌褉邪懈胁邪薪懈褟 锌芯 褍屑芯谢褔邪薪懈褞',
+  datasets: '袘袗袟蝎 袟袧袗袧袠袡',
+  datasetsApi: '袛袨小孝校袩 袣 API',
+  retrieval: {
+    semantic_search: {
+      title: '袙械泻褌芯褉薪褘泄 锌芯懈褋泻',
+      description: '小芯蟹写邪泄褌械 胁褋褌褉邪懈胁邪薪懈褟 蟹邪锌褉芯褋芯胁 懈 薪邪泄写懈褌械 褎褉邪谐屑械薪褌 褌械泻褋褌邪, 薪邪懈斜芯谢械械 锌芯褏芯卸懈泄 薪邪 械谐芯 胁械泻褌芯褉薪芯械 锌褉械写褋褌邪胁谢械薪懈械.',
+    },
+    full_text_search: {
+      title: '袩芯谢薪芯褌械泻褋褌芯胁褘泄 锌芯懈褋泻',
+      description: '袠薪写械泻褋懈褉褍泄褌械 胁褋械 褌械褉屑懈薪褘 胁 写芯泻褍屑械薪褌械, 锌芯蟹胁芯谢褟褟 锌芯谢褜蟹芯胁邪褌械谢褟屑 懈褋泻邪褌褜 谢褞斜芯泄 褌械褉屑懈薪 懈 懈蟹胁谢械泻邪褌褜 褋芯芯褌胁械褌褋褌胁褍褞褖懈泄 褎褉邪谐屑械薪褌 褌械泻褋褌邪, 褋芯写械褉卸邪褖懈泄 褝褌懈 褌械褉屑懈薪褘.',
+    },
+    hybrid_search: {
+      title: '袚懈斜褉懈写薪褘泄 锌芯懈褋泻',
+      description: '袙褘锌芯谢薪褟泄褌械 锌芯谢薪芯褌械泻褋褌芯胁褘泄 锌芯懈褋泻 懈 胁械泻褌芯褉薪褘泄 锌芯懈褋泻 芯写薪芯胁褉械屑械薪薪芯, 锌械褉械褉邪薪卸懈褉褍泄褌械, 褔褌芯斜褘 胁褘斜褉邪褌褜 薪邪懈谢褍褔褕械械 褋芯芯褌胁械褌褋褌胁懈械 蟹邪锌褉芯褋褍 锌芯谢褜蟹芯胁邪褌械谢褟. 袩芯谢褜蟹芯胁邪褌械谢懈 屑芯谐褍褌 胁褘斜褉邪褌褜 褍褋褌邪薪芯胁泻褍 胁械褋芯胁 懈谢懈 薪邪褋褌褉芯泄泻褍 屑芯写械谢懈 锌械褉械褉邪薪卸懈褉芯胁邪薪懈褟.',
+      recommend: '袪械泻芯屑械薪写褍械褌褋褟',
+    },
+    invertedIndex: {
+      title: '袠薪胁械褉褌懈褉芯胁邪薪薪褘泄 懈薪写械泻褋',
+      description: '袠薪胁械褉褌懈褉芯胁邪薪薪褘泄 懈薪写械泻褋 - 褝褌芯 褋褌褉褍泻褌褍褉邪, 懈褋锌芯谢褜蟹褍械屑邪褟 写谢褟 褝褎褎械泻褌懈胁薪芯谐芯 锌芯懈褋泻邪. 袨褉谐邪薪懈蟹芯胁邪薪薪褘泄 锌芯 褌械褉屑懈薪邪屑, 泻邪卸写褘泄 褌械褉屑懈薪 褍泻邪蟹褘胁邪械褌 薪邪 写芯泻褍屑械薪褌褘 懈谢懈 胁械斜-褋褌褉邪薪懈褑褘, 褋芯写械褉卸邪褖懈械 械谐芯.',
+    },
+    change: '袠蟹屑械薪懈褌褜',
+    changeRetrievalMethod: '袠蟹屑械薪懈褌褜 屑械褌芯写 锌芯懈褋泻邪',
+  },
+  docsFailedNotice: '写芯泻褍屑械薪褌芯胁 薪械 褍写邪谢芯褋褜 锌褉芯懈薪写械泻褋懈褉芯胁邪褌褜',
+  retry: '袩芯胁褌芯褉懈褌褜 锌芯锌褘褌泻褍',
+  indexingTechnique: {
+    high_quality: 'HQ',
+    economy: 'ECO',
+  },
+  indexingMethod: {
+    semantic_search: '袙袝袣孝袨袪',
+    full_text_search: '袩袨袥袧蝎袡 孝袝袣小孝',
+    hybrid_search: '袚袠袘袪袠袛',
+    invertedIndex: '袠袧袙袝袪孝袠袪袨袙袗袧袧蝎袡',
+  },
+  mixtureHighQualityAndEconomicTip: '袛谢褟 褋屑械褕懈胁邪薪懈褟 胁褘褋芯泻芯泻邪褔械褋褌胁械薪薪褘褏 懈 褝泻芯薪芯屑懈褔薪褘褏 斜邪蟹 蟹薪邪薪懈泄 褌褉械斜褍械褌褋褟 屑芯写械谢褜 锌械褉械褉邪薪卸懈褉芯胁邪薪懈褟.',
+  inconsistentEmbeddingModelTip: '袦芯写械谢褜 锌械褉械褉邪薪卸懈褉芯胁邪薪懈褟 褌褉械斜褍械褌褋褟, 械褋谢懈 屑芯写械谢懈 胁褋褌褉邪懈胁邪薪懈褟 胁褘斜褉邪薪薪褘褏 斜邪蟹 蟹薪邪薪懈泄 薪械褋芯胁屑械褋褌懈屑褘.',
+  retrievalSettings: '袧邪褋褌褉芯泄泻懈 锌芯懈褋泻邪',
+  rerankSettings: '袧邪褋褌褉芯泄泻懈 锌械褉械褉邪薪卸懈褉芯胁邪薪懈褟',
+  weightedScore: {
+    title: '袙蟹胁械褕械薪薪邪褟 芯褑械薪泻邪',
+    description: '袪械谐褍谢懈褉褍褟 薪邪蟹薪邪褔械薪薪褘械 胁械褋邪, 褝褌邪 褋褌褉邪褌械谐懈褟 锌械褉械褉邪薪卸懈褉芯胁邪薪懈褟 芯锌褉械写械谢褟械褌, 褋谢械写褍械褌 谢懈 芯褌写邪胁邪褌褜 锌褉懈芯褉懈褌械褌 褋械屑邪薪褌懈褔械褋泻芯屑褍 懈谢懈 泻谢褞褔械胁芯屑褍 褋芯芯褌胁械褌褋褌胁懈褞.',
+    semanticFirst: '小械屑邪薪褌懈泻邪 胁 锌械褉胁褍褞 芯褔械褉械写褜',
+    keywordFirst: '袣谢褞褔械胁褘械 褋谢芯胁邪 胁 锌械褉胁褍褞 芯褔械褉械写褜',
+    customized: '袧邪褋褌褉邪懈胁邪械屑褘泄',
+    semantic: '小械屑邪薪褌懈泻邪',
+    keyword: '袣谢褞褔械胁褘械 褋谢芯胁邪',
+  },
+  nTo1RetrievalLegacy: '袩芯懈褋泻 N-泻-1 斜褍写械褌 芯褎懈褑懈邪谢褜薪芯 锌褉械泻褉邪褖械薪 褋 褋械薪褌褟斜褉褟. 袪械泻芯屑械薪写褍械褌褋褟 懈褋锌芯谢褜蟹芯胁邪褌褜 薪芯胁械泄褕懈泄 屑薪芯谐芯锌褍褌薪褘泄 锌芯懈褋泻 写谢褟 锌芯谢褍褔械薪懈褟 谢褍褔褕懈褏 褉械蟹褍谢褜褌邪褌芯胁.',
+  nTo1RetrievalLegacyLink: '校蟹薪邪褌褜 斜芯谢褜褕械',
+  nTo1RetrievalLegacyLinkText: ' 袩芯懈褋泻 N-泻-1 斜褍写械褌 芯褎懈褑懈邪谢褜薪芯 锌褉械泻褉邪褖械薪 胁 褋械薪褌褟斜褉械.',
+  defaultRetrievalTip: '袩芯 褍屑芯谢褔邪薪懈褞 懈褋锌芯谢褜蟹褍械褌褋褟 屑薪芯谐芯泻邪薪邪谢褜薪邪褟 锌褉芯胁械褉泻邪. 袟薪邪薪懈褟 懈蟹胁谢械泻邪褞褌褋褟 懈蟹 薪械褋泻芯谢褜泻懈褏 斜邪蟹 蟹薪邪薪懈泄, 邪 蟹邪褌械屑 锌芯胁褌芯褉薪芯 褉邪薪卸懈褉褍褞褌褋褟.',
+  editExternalAPIConfirmWarningContent: {
+    end: '胁薪械褕薪懈褏 蟹薪邪薪懈泄, 懈 褝褌邪 屑芯写懈褎懈泻邪褑懈褟 斜褍写械褌 锌褉懈屑械薪械薪邪 泻芯 胁褋械屑 懈屑. 袙褘 褍胁械褉械薪褘, 褔褌芯 褏芯褌懈褌械 褋芯褏褉邪薪懈褌褜 褝褌芯 懈蟹屑械薪械薪懈械?',
+    front: '协褌芯褌 API 胁薪械褕薪懈褏 蟹薪邪薪懈泄 褋胁褟蟹邪薪 褋',
+  },
+  editExternalAPIFormWarning: {
+    end: '袙薪械褕薪懈械 蟹薪邪薪懈褟',
+    front: '协褌芯褌 胁薪械褕薪懈泄 API 褋胁褟蟹邪薪 褋',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      end: '?',
+      front: '校写邪谢懈褌褜',
+    },
+    content: {
+      front: '协褌芯褌 API 胁薪械褕薪懈褏 蟹薪邪薪懈泄 褋胁褟蟹邪薪 褋',
+      end: '胁薪械褕薪械械 蟹薪邪薪懈械. 校写邪谢械薪懈械 褝褌芯谐芯 API 褋写械谢邪械褌 懈褏 胁褋械 薪械写械泄褋褌胁懈褌械谢褜薪褘屑懈. 袙褘 褍胁械褉械薪褘, 褔褌芯 褏芯褌懈褌械 褍写邪谢懈褌褜 褝褌芯褌 API?',
+    },
+    noConnectionContent: '袙褘 褍胁械褉械薪褘, 褔褌芯 褍写邪谢懈褌械 褝褌芯褌 API?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: '袙褘斜芯褉 API 胁薪械褕薪懈褏 蟹薪邪薪懈泄',
+  },
+  connectDatasetIntro: {
+    content: {
+      link: '校蟹薪邪泄褌械, 泻邪泻 褋芯蟹写邪褌褜 胁薪械褕薪懈泄 API',
+      front: '效褌芯斜褘 锌芯写泻谢褞褔懈褌褜褋褟 泻 胁薪械褕薪械泄 斜邪蟹械 蟹薪邪薪懈泄, 薪械芯斜褏芯写懈屑芯 褋薪邪褔邪谢邪 褋芯蟹写邪褌褜 胁薪械褕薪懈泄 API. 袩芯卸邪谢褍泄褋褌邪, 胁薪懈屑邪褌械谢褜薪芯 锌褉芯褔褌懈褌械 懈 芯斜褉邪褌懈褌械褋褜 泻',
+      end: '. 袟邪褌械屑 薪邪泄写懈褌械 褋芯芯褌胁械褌褋褌胁褍褞褖懈泄 懈写械薪褌懈褎懈泻邪褌芯褉 蟹薪邪薪懈褟 懈 蟹邪锌芯谢薪懈褌械 械谐芯 胁 褎芯褉屑械 褋谢械胁邪. 袝褋谢懈 胁褋褟 懈薪褎芯褉屑邪褑懈褟 胁械褉薪邪, 芯薪 邪胁褌芯屑邪褌懈褔械褋泻懈 锌械褉械泄写械褌 泻 褌械褋褌褍 懈蟹胁谢械褔械薪懈褟 胁 斜邪蟹械 蟹薪邪薪懈泄 锌芯褋谢械 薪邪卸邪褌懈褟 泻薪芯锌泻懈 锌芯写泻谢褞褔械薪懈褟.',
+    },
+    learnMore: '袩芯写褉芯斜薪械械',
+    title: '袣邪泻 锌芯写泻谢褞褔懈褌褜褋褟 泻 胁薪械褕薪械泄 斜邪蟹械 蟹薪邪薪懈泄',
+  },
+  connectHelper: {
+    helper2: '袩芯写写械褉卸懈胁邪械褌褋褟 褌芯谢褜泻芯 褎褍薪泻褑懈褟 懈蟹胁谢械褔械薪懈褟',
+    helper3: '. 袦褘 薪邪褋褌芯褟褌械谢褜薪芯 褉械泻芯屑械薪写褍械屑 胁邪屑',
+    helper4: '袨蟹薪邪泻芯屑褜褌械褋褜 褋 褋锌褉邪胁芯褔薪芯泄 写芯泻褍屑械薪褌邪褑懈械泄',
+    helper5: '袘褍写褜褌械 胁薪懈屑邪褌械谢褜薪褘 锌械褉械写 懈褋锌芯谢褜蟹芯胁邪薪懈械屑 褝褌芯泄 褎褍薪泻褑懈懈.',
+    helper1: '袩芯写泻谢褞褔械薪懈械 泻 胁薪械褕薪懈屑 斜邪蟹邪屑 蟹薪邪薪懈泄 褔械褉械蟹 API 懈 懈写械薪褌懈褎懈泻邪褌芯褉 斜邪蟹褘 蟹薪邪薪懈泄. 袙 薪邪褋褌芯褟褖械械 胁褉械屑褟',
+  },
+  externalKnowledgeForm: {
+    connect: '小芯械写懈薪褟褌褜',
+    cancel: '袨褌屑械薪邪',
+  },
+  externalAPIForm: {
+    encrypted: {
+      end: '孝械褏薪芯谢芯谐懈懈.',
+      front: '袙邪褕 褌芯泻械薪 API 斜褍写械褌 蟹邪褕懈褎褉芯胁邪薪 懈 褋芯褏褉邪薪械薪 褋 锌芯屑芯褖褜褞',
+    },
+    cancel: '袨褌屑械薪邪',
+    endpoint: '袣芯薪械褔薪邪褟 褌芯褔泻邪 API',
+    save: '小锌邪褋邪褌褜',
+    edit: '袪械写邪泻褌懈褉芯胁邪褌褜',
+    name: '袠屑褟',
+    apiKey: '袣谢褞褔 API',
+  },
+  externalKnowledgeNamePlaceholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 薪邪蟹胁邪薪懈械 斜邪蟹褘 蟹薪邪薪懈泄',
+  externalTag: '袙薪械褕薪懈泄',
+  learnHowToWriteGoodKnowledgeDescription: '校蟹薪邪泄褌械, 泻邪泻 薪邪锌懈褋邪褌褜 褏芯褉芯褕械械 芯锌懈褋邪薪懈械 蟹薪邪薪懈泄',
+  externalAPIPanelTitle: 'API 胁薪械褕薪懈褏 蟹薪邪薪懈泄',
+  externalKnowledgeDescription: '袨锌懈褋邪薪懈械 蟹薪邪薪懈泄',
+  editExternalAPITooltipTitle: '小袙携袟袗袧袧蝎袝 袟袧袗袧袠携',
+  externalKnowledgeName: '袠屑褟 胁薪械褕薪械谐芯 斜邪蟹褘 蟹薪邪薪懈泄',
+  createExternalAPI: '袛芯斜邪胁谢械薪懈械 API 胁薪械褕薪懈褏 蟹薪邪薪懈泄',
+  externalKnowledgeIdPlaceholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 懈写械薪褌懈褎懈泻邪褌芯褉 蟹薪邪薪懈泄',
+  externalKnowledgeDescriptionPlaceholder: '袨锌懈褕懈褌械, 褔褌芯 胁褏芯写懈褌 胁 褝褌褍 斜邪蟹褍 蟹薪邪薪懈泄 (薪械芯斜褟蟹邪褌械谢褜薪芯)',
+  noExternalKnowledge: '校 薪邪褋 械褖械 薪械褌 External Knowledge API, 薪邪卸屑懈褌械 蟹写械褋褜, 褔褌芯斜褘 褋芯蟹写邪褌褜',
+  externalAPI: '袙薪械褕薪懈泄 API',
+  externalKnowledgeId: '袙薪械褕薪懈泄 懈写械薪褌懈褎懈泻邪褌芯褉 斜邪蟹褘 蟹薪邪薪懈泄',
+  createNewExternalAPI: '小芯蟹写邪薪懈械 薪芯胁芯谐芯 API 胁薪械褕薪懈褏 蟹薪邪薪懈泄',
+  editExternalAPIFormTitle: '袪械写邪泻褌懈褉芯胁邪薪懈械 API 胁薪械褕薪懈褏 蟹薪邪薪懈泄',
+  connectDataset: '袩芯写泻谢褞褔械薪懈械 泻 胁薪械褕薪械泄 斜邪蟹械 蟹薪邪薪懈泄',
+  mixtureInternalAndExternalTip: '袦芯写械谢褜 Rerank 薪械芯斜褏芯写懈屑邪 写谢褟 褋屑械褕懈胁邪薪懈褟 胁薪褍褌褉械薪薪懈褏 懈 胁薪械褕薪懈褏 蟹薪邪薪懈泄.',
+  allExternalTip: '袩褉懈 懈褋锌芯谢褜蟹芯胁邪薪懈懈 褌芯谢褜泻芯 胁薪械褕薪懈褏 蟹薪邪薪懈泄 锌芯谢褜蟹芯胁邪褌械谢褜 屑芯卸械褌 胁褘斜褉邪褌褜, 褋谢械写褍械褌 谢懈 胁泻谢褞褔邪褌褜 屑芯写械谢褜 锌芯胁褌芯褉薪芯谐芯 褉邪薪卸懈褉芯胁邪薪懈褟. 袝褋谢懈 褝褌芯褌 锌邪褉邪屑械褌褉 薪械 胁泻谢褞褔械薪, 锌芯谢褍褔械薪薪褘械 褎褉邪谐屑械薪褌褘 斜褍写褍褌 褋芯褉褌懈褉芯胁邪褌褜褋褟 薪邪 芯褋薪芯胁械 斜邪谢谢芯胁. 袣芯谐写邪 褋褌褉邪褌械谐懈懈 懈蟹胁谢械褔械薪懈褟 懈蟹 褉邪蟹薪褘褏 斜邪蟹 蟹薪邪薪懈泄 薪械褋芯胁屑械褋褌懈屑褘, 芯薪懈 斜褍写褍褌 薪械褌芯褔薪褘屑懈.',
+  externalAPIPanelDocumentation: '校蟹薪邪泄褌械, 泻邪泻 褋芯蟹写邪褌褜 API 胁薪械褕薪懈褏 蟹薪邪薪懈泄',
+  externalAPIPanelDescription: '袙薪械褕薪懈泄 API 斜邪蟹褘 蟹薪邪薪懈泄 懈褋锌芯谢褜蟹褍械褌褋褟 写谢褟 锌芯写泻谢褞褔械薪懈褟 泻 斜邪蟹械 蟹薪邪薪懈泄 蟹邪 锌褉械写械谢邪屑懈 Dify 懈 懈蟹胁谢械褔械薪懈褟 蟹薪邪薪懈泄 懈蟹 褝褌芯泄 斜邪蟹褘 蟹薪邪薪懈泄.',
+  chunkingMode: {
+    general: '袨斜褖械械',
+    parentChild: '袪芯写懈褌械谢褜-写芯褔械褉薪懈泄',
+  },
+  parentMode: {
+    fullDoc: '袩芯谢薪褘泄 写芯泻褍屑械薪褌',
+    paragraph: '袩邪褉邪谐褉邪褎',
+  },
+  batchAction: {
+    enable: '袛邪胁邪褌褜 胁芯蟹屑芯卸薪芯褋褌褜',
+    delete: '校写邪谢懈褌褜',
+    selected: '袙褘斜褉邪薪薪褘泄',
+    disable: '袨褌泻谢褞褔懈褌褜',
+    cancel: '袨褌屑械薪邪',
+    archive: '袗褉褏懈胁',
+  },
+  preprocessDocument: '{{褔懈褋谢芯}} 袩褉械写胁邪褉懈褌械谢褜薪邪褟 芯斜褉邪斜芯褌泻邪 写芯泻褍屑械薪褌芯胁',
+  documentsDisabled: '袛芯泻褍屑械薪褌褘 {{num}} 芯褌泻谢褞褔械薪褘 - 薪械邪泻褌懈胁薪褘 斜芯谢械械 30 写薪械泄',
+  localDocs: '袦械褋褌薪邪褟 写芯泻褍屑械薪褌邪褑懈褟',
+  enable: '袛邪胁邪褌褜 胁芯蟹屑芯卸薪芯褋褌褜',
+  allKnowledge: '袙褋械 蟹薪邪薪懈褟',
+  allKnowledgeDescription: '袙褘斜械褉懈褌械, 褔褌芯斜褘 芯褌芯斜褉邪蟹懈褌褜 胁褋械 蟹薪邪薪懈褟 胁 褝褌芯泄 褉邪斜芯褔械泄 芯斜谢邪褋褌懈. 孝芯谢褜泻芯 胁谢邪写械谢械褑 褉邪斜芯褔械谐芯 锌褉芯褋褌褉邪薪褋褌胁邪 屑芯卸械褌 褍锌褉邪胁谢褟褌褜 胁褋械屑懈 蟹薪邪薪懈褟屑懈.',
+  metadata: {
+    createMetadata: {
+      type: '孝懈锌',
+      namePlaceholder: '袛芯斜邪胁褜褌械 懈屑褟 屑械褌邪写邪薪薪褘褏',
+      back: '薪邪蟹邪写',
+      name: '袠屑褟',
+      title: '袧芯胁褘械 屑械褌邪写邪薪薪褘械',
+    },
+    checkName: {
+      empty: '袠屑褟 屑械褌邪写邪薪薪褘褏 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
+      invalid: '袠屑褟 屑械褌邪写邪薪薪褘褏 屑芯卸械褌 褋芯写械褉卸邪褌褜 褌芯谢褜泻芯 褋褌褉芯褔薪褘械 斜褍泻胁褘, 褑懈褎褉褘 懈 蟹薪邪泻懈 薪懈卸薪械谐芯 锌芯写褔械褉泻懈胁邪薪懈褟 懈 写芯谢卸薪芯 薪邪褔懈薪邪褌褜褋褟 褋芯 褋褌褉芯褔薪芯泄 斜褍泻胁褘.',
+    },
+    batchEditMetadata: {
+      applyToAllSelectDocumentTip: '袗胁褌芯屑邪褌懈褔械褋泻懈 褋芯蟹写邪泄褌械 胁褋械 胁褘褕械褍泻邪蟹邪薪薪褘械 褉械写邪泻褌懈褉褍械屑褘械 懈 薪芯胁褘械 屑械褌邪写邪薪薪褘械 写谢褟 胁褋械褏 胁褘斜褉邪薪薪褘褏 写芯泻褍屑械薪褌芯胁, 懈薪邪褔械 褉械写邪泻褌懈褉芯胁邪薪懈械 屑械褌邪写邪薪薪褘褏 斜褍写械褌 锌褉懈屑械薪褟褌褜褋褟 褌芯谢褜泻芯 泻 写芯泻褍屑械薪褌邪屑 褋 薪懈屑懈.',
+      applyToAllSelectDocument: '袩褉懈屑械薪懈褌褜 泻芯 胁褋械屑 胁褘斜褉邪薪薪褘屑 写芯泻褍屑械薪褌邪屑',
+      editDocumentsNum: '袪械写邪泻褌懈褉芯胁邪薪懈械 {{num}} 写芯泻褍屑械薪褌芯胁',
+      multipleValue: '袦薪芯卸械褋褌胁械薪薪芯械 蟹薪邪褔械薪懈械',
+      editMetadata: '袪械写邪泻褌懈褉芯胁邪褌褜 屑械褌邪写邪薪薪褘械',
+    },
+    selectMetadata: {
+      manageAction: '校锌褉邪胁谢褟褌褜',
+      newAction: '袧芯胁褘械 屑械褌邪写邪薪薪褘械',
+      search: '袩芯懈褋泻 屑械褌邪写邪薪薪褘褏',
+    },
+    datasetMetadata: {
+      deleteContent: '袙褘 褍胁械褉械薪褘, 褔褌芯 褏芯褌懈褌械 褍写邪谢懈褌褜 屑械褌邪写邪薪薪褘械 "{{name}}"?',
+      values: '{{num}} 袟薪邪褔械薪懈泄',
+      builtIn: '袙褋褌褉芯械薪薪褘泄',
+      description: '袙褘 屑芯卸械褌械 褍锌褉邪胁谢褟褌褜 胁褋械屑懈 屑械褌邪写邪薪薪褘屑懈 胁 褝褌懈褏 蟹薪邪薪懈褟褏 蟹写械褋褜. 袠蟹屑械薪械薪懈褟 斜褍写褍褌 褋懈薪褏褉芯薪懈蟹懈褉芯胁邪薪褘 褋 泻邪卸写褘屑 写芯泻褍屑械薪褌芯屑.',
+      deleteTitle: '袩芯写褌胁械褉写懈褌械 褍写邪谢械薪懈械',
+      builtInDescription: '袙褋褌褉芯械薪薪褘械 屑械褌邪写邪薪薪褘械 邪胁褌芯屑邪褌懈褔械褋泻懈 懈蟹胁谢械泻邪褞褌褋褟 懈 谐械薪械褉懈褉褍褞褌褋褟. 袠褏 薪械芯斜褏芯写懈屑芯 邪泻褌懈胁懈褉芯胁邪褌褜 锌械褉械写 懈褋锌芯谢褜蟹芯胁邪薪懈械屑, 懈 芯薪懈 薪械 锌芯写谢械卸邪褌 褉械写邪泻褌懈褉芯胁邪薪懈褞.',
+      addMetaData: '袛芯斜邪胁懈褌褜 屑械褌邪写邪薪薪褘械',
+      rename: '袩械褉械懈屑械薪芯胁邪褌褜',
+      disabled: '袨褌泻谢褞褔械薪芯',
+      name: '袠屑褟',
+      namePlaceholder: '袠屑褟 屑械褌邪写邪薪薪褘褏',
+    },
+    documentMetadata: {
+      startLabeling: '袧邪褔邪褌褜 屑邪褉泻懈褉芯胁泻褍',
+      documentInformation: '袠薪褎芯褉屑邪褑懈褟 芯 写芯泻褍屑械薪褌械',
+      metadataToolTip: '袦械褌邪写邪薪薪褘械 褋谢褍卸邪褌 胁邪卸薪褘屑 褎懈谢褜褌褉芯屑, 泻芯褌芯褉褘泄 锌芯胁褘褕邪械褌 褌芯褔薪芯褋褌褜 懈 邪泻褌褍邪谢褜薪芯褋褌褜 懈蟹胁谢械褔械薪懈褟 懈薪褎芯褉屑邪褑懈懈. 袙褘 屑芯卸械褌械 懈蟹屑械薪懈褌褜 懈 写芯斜邪胁懈褌褜 屑械褌邪写邪薪薪褘械 写谢褟 褝褌芯谐芯 写芯泻褍屑械薪褌邪 蟹写械褋褜.',
+      technicalParameters: '孝械褏薪懈褔械褋泻懈械 锌邪褉邪屑械褌褉褘',
+    },
+    chooseTime: '袙褘斜械褉懈褌械 胁褉械屑褟...',
+    metadata: '袦械褌邪写邪薪薪褘械',
+    addMetadata: '袛芯斜邪胁懈褌褜 屑械褌邪写邪薪薪褘械',
+  },
+  embeddingModelNotAvailable: '袦芯写械谢褜 胁褋褌褉邪懈胁邪薪懈褟 薪械写芯褋褌褍锌薪邪.',
+}
+
+export default translation
diff --git a/i18n/ru-RU/education.ts b/i18n/ru-RU/education.ts
new file mode 100644
index 0000000..b614f04
--- /dev/null
+++ b/i18n/ru-RU/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    end: '写谢褟 锌褉芯褎械褋褋懈芯薪邪谢褜薪芯谐芯 锌谢邪薪邪 Dify.',
+    front: '孝械锌械褉褜 胁褘 懈屑械械褌械 锌褉邪胁芯 薪邪 褋褌邪褌褍褋 "袩褉芯胁械褉械薪薪芯械 芯斜褉邪蟹芯胁邪薪懈械". 袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 褋胁芯懈 芯斜褉邪蟹芯胁邪褌械谢褜薪褘械 写邪薪薪褘械 薪懈卸械, 褔褌芯斜褘 蟹邪胁械褉褕懈褌褜 锌褉芯褑械褋褋 懈 锌芯谢褍褔懈褌褜',
+    coupon: '褝泻褋泻谢褞蟹懈胁薪褘泄 100% 泻褍锌芯薪',
+  },
+  form: {
+    schoolName: {
+      title: '袧邪蟹胁邪薪懈械 胁邪褕械泄 褕泻芯谢褘',
+      placeholder: '袙胁械写懈褌械 芯褎懈褑懈邪谢褜薪芯械, 锌芯谢薪芯械 薪邪蟹胁邪薪懈械 胁邪褕械泄 褕泻芯谢褘',
+    },
+    schoolRole: {
+      option: {
+        student: '小褌褍写械薪褌',
+        teacher: '校褔懈褌械谢褜',
+        administrator: '楔泻芯谢褜薪褘泄 邪写屑懈薪懈褋褌褉邪褌芯褉',
+      },
+      title: '袙邪褕邪 褕泻芯谢褜薪邪褟 褉芯谢褜',
+    },
+    terms: {
+      desc: {
+        termsOfService: '校褋谢芯胁懈褟 芯斜褋谢褍卸懈胁邪薪懈褟',
+        front: '袙邪褕邪 懈薪褎芯褉屑邪褑懈褟 懈 懈褋锌芯谢褜蟹芯胁邪薪懈械 褋褌邪褌褍褋邪 袩褉芯胁械褉械薪薪芯械 芯斜褉邪蟹芯胁邪薪懈械 锌芯写谢械卸邪褌 薪邪褕懈屑',
+        privacyPolicy: '袩芯谢懈褌懈泻邪 泻芯薪褎懈写械薪褑懈邪谢褜薪芯褋褌懈',
+        and: '懈',
+        end: '. 袨褌锌褉邪胁谢褟褟:',
+      },
+      option: {
+        age: '携 锌芯写褌胁械褉卸写邪褞, 褔褌芯 屑薪械 薪械 屑械薪褜褕械 18 谢械褌',
+        inSchool: '携 锌芯写褌胁械褉卸写邪褞, 褔褌芯 褟 蟹邪褔懈褋谢械薪 懈谢懈 褉邪斜芯褌邪褞 胁 褍泻邪蟹邪薪薪芯泄 褍褔褉械卸写械薪懈懈. Dify 屑芯卸械褌 蟹邪锌褉芯褋懈褌褜 锌芯写褌胁械褉卸写械薪懈械 蟹邪褔懈褋谢械薪懈褟/褌褉褍写芯褍褋褌褉芯泄褋褌胁邪. 袝褋谢懈 褟 薪械锌褉邪胁懈谢褜薪芯 褍泻邪卸褍 褋胁芯褞 锌褉邪胁芯芯斜谢邪写邪薪薪芯褋褌褜, 褟 褋芯谐谢邪褋械薪 芯锌谢邪褌懈褌褜 谢褞斜褘械 褋斜芯褉褘, 泻芯褌芯褉褘械 懈蟹薪邪褔邪谢褜薪芯 斜褘谢懈 芯褌屑械薪械薪褘 薪邪 芯褋薪芯胁邪薪懈懈 屑芯械谐芯 芯斜褉邪蟹芯胁邪褌械谢褜薪芯谐芯 褋褌邪褌褍褋邪.',
+      },
+      title: '校褋谢芯胁懈褟 懈 褋芯谐谢邪褕械薪懈褟',
+    },
+  },
+  submit: '袨褌锌褉邪胁懈褌褜',
+  rejectTitle: '袙邪褕邪 芯斜褉邪蟹芯胁邪褌械谢褜薪邪褟 锌褉芯胁械褉泻邪 Dify 斜褘谢邪 芯褌泻谢芯薪械薪邪',
+  currentSigned: '袙 袛袗袧袧蝎袡 袦袨袦袝袧孝 袙啸袨袛 袙 袩袪袨肖袠袥鞋 袣袗袣',
+  toVerified: '袩芯谢褍褔懈褌械 锌芯写褌胁械褉卸写械薪懈械 芯斜褉邪蟹芯胁邪薪懈褟',
+  learn: '校蟹薪邪泄褌械, 泻邪泻 锌芯谢褍褔懈褌褜 锌芯写褌胁械褉卸写械薪懈械 芯斜褉邪蟹芯胁邪薪懈褟',
+  submitError: '袨褌锌褉邪胁泻邪 褎芯褉屑褘 薪械 褍写邪谢邪褋褜. 袩芯卸邪谢褍泄褋褌邪, 锌芯锌褉芯斜褍泄褌械 锌芯蟹卸械.',
+  successTitle: '袙褘 锌芯谢褍褔懈谢懈 锌芯写褌胁械褉卸写械薪薪芯械 芯斜褉邪蟹芯胁邪薪懈械 Dify',
+  emailLabel: '袙邪褕 褌械泻褍褖懈泄 邪写褉械褋 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌褘',
+  rejectContent: '袣 褋芯卸邪谢械薪懈褞, 胁褘 薪械 懈屑械械褌械 锌褉邪胁邪 薪邪 褋褌邪褌褍褋 袩褉芯胁械褉械薪薪芯谐芯 芯斜褉邪蟹芯胁邪薪懈械屑 懈, 褋谢械写芯胁邪褌械谢褜薪芯, 薪械 屑芯卸械褌械 锌芯谢褍褔懈褌褜 褝泻褋泻谢褞蟹懈胁薪褘泄 泻褍锌芯薪 薪邪 100% 写谢褟 锌褉芯褎械褋褋懈芯薪邪谢褜薪芯谐芯 锌谢邪薪邪 Dify, 械褋谢懈 胁褘 懈褋锌芯谢褜蟹褍械褌械 褝褌芯褌 邪写褉械褋 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌褘.',
+  successContent: '袦褘 胁褘写邪谢懈 泻褍锌芯薪 薪邪 100% 褋泻懈写泻褍 薪邪 锌谢邪薪 Dify Professional 写谢褟 胁邪褕械谐芯 邪泻泻邪褍薪褌邪. 袣褍锌芯薪 写械泄褋褌胁懈褌械谢械薪 胁 褌械褔械薪懈械 芯写薪芯谐芯 谐芯写邪, 锌芯卸邪谢褍泄褋褌邪, 懈褋锌芯谢褜蟹褍泄褌械 械谐芯 胁 褌械褔械薪懈械 褋褉芯泻邪 写械泄褋褌胁懈褟.',
+}
+
+export default translation
diff --git a/i18n/ru-RU/explore.ts b/i18n/ru-RU/explore.ts
new file mode 100644
index 0000000..919d1e4
--- /dev/null
+++ b/i18n/ru-RU/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: '袨斜蟹芯褉',
+  sidebar: {
+    discovery: '袨褌泻褉褘褌懈褟',
+    chat: '效邪褌',
+    workspace: '袪邪斜芯褔械械 锌褉芯褋褌褉邪薪褋褌胁芯',
+    action: {
+      pin: '袟邪泻褉械锌懈褌褜',
+      unpin: '袨褌泻褉械锌懈褌褜',
+      rename: '袩械褉械懈屑械薪芯胁邪褌褜',
+      delete: '校写邪谢懈褌褜',
+    },
+    delete: {
+      title: '校写邪谢懈褌褜 锌褉懈谢芯卸械薪懈械',
+      content: '袙褘 褍胁械褉械薪褘, 褔褌芯 褏芯褌懈褌械 褍写邪谢懈褌褜 褝褌芯 锌褉懈谢芯卸械薪懈械?',
+    },
+  },
+  apps: {
+    title: '袨斜蟹芯褉 锌褉懈谢芯卸械薪懈泄 芯褌 Dify',
+    description: '袠褋锌芯谢褜蟹褍泄褌械 褝褌懈 褕邪斜谢芯薪薪褘械 锌褉懈谢芯卸械薪懈褟 屑谐薪芯胁械薪薪芯 懈谢懈 薪邪褋褌褉芯泄褌械 褋胁芯懈 褋芯斜褋褌胁械薪薪褘械 锌褉懈谢芯卸械薪懈褟 薪邪 芯褋薪芯胁械 褕邪斜谢芯薪芯胁.',
+    allCategories: '袪械泻芯屑械薪写褍械屑褘械',
+  },
+  appCard: {
+    addToWorkspace: '袛芯斜邪胁懈褌褜 胁 褉邪斜芯褔械械 锌褉芯褋褌褉邪薪褋褌胁芯',
+    customize: '袧邪褋褌褉芯懈褌褜',
+  },
+  appCustomize: {
+    title: '小芯蟹写邪褌褜 锌褉懈谢芯卸械薪懈械 懈蟹 {{name}}',
+    subTitle: '袟薪邪褔芯泻 懈 薪邪蟹胁邪薪懈械 锌褉懈谢芯卸械薪懈褟',
+    nameRequired: '袧邪蟹胁邪薪懈械 锌褉懈谢芯卸械薪懈褟 芯斜褟蟹邪褌械谢褜薪芯',
+  },
+  category: {
+    Assistant: '袗褋褋懈褋褌械薪褌',
+    Writing: '袧邪锌懈褋邪薪懈械',
+    Translate: '袩械褉械胁芯写',
+    Programming: '袩褉芯谐褉邪屑屑懈褉芯胁邪薪懈械',
+    HR: 'HR',
+    Agent: '袗谐械薪褌',
+    Workflow: '袪邪斜芯褔懈泄 锌褉芯褑械褋褋',
+    Entertainment: '袪邪蟹胁谢械褔械薪懈械',
+  },
+}
+
+export default translation
diff --git a/i18n/ru-RU/layout.ts b/i18n/ru-RU/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/ru-RU/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/ru-RU/login.ts b/i18n/ru-RU/login.ts
new file mode 100644
index 0000000..5c46cb7
--- /dev/null
+++ b/i18n/ru-RU/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: '袩褉懈胁械褌, 写邪胁邪泄褌械 薪邪褔薪械屑!馃憢',
+  welcome: '袛芯斜褉芯 锌芯卸邪谢芯胁邪褌褜 胁 Dify, 锌芯卸邪谢褍泄褋褌邪, 胁芯泄写懈褌械, 褔褌芯斜褘 锌褉芯写芯谢卸懈褌褜.',
+  email: '袗写褉械褋 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌褘',
+  emailPlaceholder: '袙邪褕 邪写褉械褋 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌褘',
+  password: '袩邪褉芯谢褜',
+  passwordPlaceholder: '袙邪褕 锌邪褉芯谢褜',
+  name: '袠屑褟 锌芯谢褜蟹芯胁邪褌械谢褟',
+  namePlaceholder: '袙邪褕械 懈屑褟 锌芯谢褜蟹芯胁邪褌械谢褟',
+  forget: '袟邪斜褘谢懈 锌邪褉芯谢褜?',
+  signBtn: '袙芯泄褌懈',
+  sso: '袩褉芯写芯谢卸懈褌褜 褋 SSO',
+  installBtn: '袧邪褋褌褉芯懈褌褜',
+  setAdminAccount: '袧邪褋褌褉芯泄泻邪 褍褔械褌薪芯泄 蟹邪锌懈褋懈 邪写屑懈薪懈褋褌褉邪褌芯褉邪',
+  setAdminAccountDesc: '袦邪泻褋懈屑邪谢褜薪褘械 锌褉懈胁懈谢械谐懈懈 写谢褟 褍褔械褌薪芯泄 蟹邪锌懈褋懈 邪写屑懈薪懈褋褌褉邪褌芯褉邪, 泻芯褌芯褉褘械 屑芯卸薪芯 懈褋锌芯谢褜蟹芯胁邪褌褜 写谢褟 褋芯蟹写邪薪懈褟 锌褉懈谢芯卸械薪懈泄, 褍锌褉邪胁谢械薪懈褟 锌芯褋褌邪胁褖懈泻邪屑懈 LLM 懈 褌. 写.',
+  createAndSignIn: '小芯蟹写邪褌褜 懈 胁芯泄褌懈',
+  oneMoreStep: '袝褖械 芯写懈薪 褕邪谐',
+  createSample: '袧邪 芯褋薪芯胁械 褝褌芯泄 懈薪褎芯褉屑邪褑懈懈 屑褘 褋芯蟹写邪写懈屑 写谢褟 胁邪褋 锌褉懈屑械褉 锌褉懈谢芯卸械薪懈褟',
+  invitationCode: '袩褉懈谐谢邪褋懈褌械谢褜薪褘泄 泻芯写',
+  invitationCodePlaceholder: '袙邪褕 锌褉懈谐谢邪褋懈褌械谢褜薪褘泄 泻芯写',
+  interfaceLanguage: '携蟹褘泻 懈薪褌械褉褎械泄褋邪',
+  timezone: '效邪褋芯胁芯泄 锌芯褟褋',
+  go: '袩械褉械泄褌懈 泻 Dify',
+  sendUsMail: '袨褌锌褉邪胁褜褌械 薪邪屑 锌芯 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌械 褋胁芯械 锌褉械写褋褌邪胁谢械薪懈械, 懈 屑褘 芯斜褉邪斜芯褌邪械屑 蟹邪锌褉芯褋 薪邪 锌褉懈谐谢邪褕械薪懈械.',
+  acceptPP: '携 锌褉芯褔懈褌邪谢 懈 锌褉懈薪懈屑邪褞 锌芯谢懈褌懈泻褍 泻芯薪褎懈写械薪褑懈邪谢褜薪芯褋褌懈',
+  reset: '袩芯卸邪谢褍泄褋褌邪, 胁褘锌芯谢薪懈褌械 褋谢械写褍褞褖褍褞 泻芯屑邪薪写褍, 褔褌芯斜褘 褋斜褉芯褋懈褌褜 锌邪褉芯谢褜',
+  withGitHub: '袩褉芯写芯谢卸懈褌褜 褋 GitHub',
+  withGoogle: '袩褉芯写芯谢卸懈褌褜 褋 Google',
+  rightTitle: '袪邪褋泻褉芯泄褌械 胁械褋褜 锌芯褌械薪褑懈邪谢 LLM',
+  rightDesc: '袘械蟹 褌褉褍写邪 褋芯蟹写邪胁邪泄褌械 胁懈蟹褍邪谢褜薪芯 锌褉懈胁谢械泻邪褌械谢褜薪褘械, 褉邪斜芯褌芯褋锌芯褋芯斜薪褘械 懈 褍谢褍褔褕邪械屑褘械 锌褉懈谢芯卸械薪懈褟 袠袠.',
+  tos: '校褋谢芯胁懈褟 芯斜褋谢褍卸懈胁邪薪懈褟',
+  pp: '袩芯谢懈褌懈泻邪 泻芯薪褎懈写械薪褑懈邪谢褜薪芯褋褌懈',
+  tosDesc: '袪械谐懈褋褌褉懈褉褍褟褋褜, 胁褘 褋芯谐谢邪褕邪械褌械褋褜 褋 薪邪褕懈屑懈',
+  goToInit: '袝褋谢懈 胁褘 薪械 懈薪懈褑懈邪谢懈蟹懈褉芯胁邪谢懈 褍褔械褌薪褍褞 蟹邪锌懈褋褜, 锌械褉械泄写懈褌械 薪邪 褋褌褉邪薪懈褑褍 懈薪懈褑懈邪谢懈蟹邪褑懈懈',
+  dontHave: '袧械褌?',
+  invalidInvitationCode: '袧械胁械褉薪褘泄 锌褉懈谐谢邪褋懈褌械谢褜薪褘泄 泻芯写',
+  accountAlreadyInited: '校褔械褌薪邪褟 蟹邪锌懈褋褜 褍卸械 懈薪懈褑懈邪谢懈蟹懈褉芯胁邪薪邪',
+  forgotPassword: '袟邪斜褘谢懈 锌邪褉芯谢褜?',
+  resetLinkSent: '小褋褘谢泻邪 写谢褟 褋斜褉芯褋邪 芯褌锌褉邪胁谢械薪邪',
+  sendResetLink: '袨褌锌褉邪胁懈褌褜 褋褋褘谢泻褍 写谢褟 褋斜褉芯褋邪',
+  backToSignIn: '袙械褉薪褍褌褜褋褟 泻 胁褏芯写褍',
+  forgotPasswordDesc: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 褋胁芯泄 邪写褉械褋 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌褘, 褔褌芯斜褘 褋斜褉芯褋懈褌褜 锌邪褉芯谢褜. 袦褘 芯褌锌褉邪胁懈屑 胁邪屑 褝谢械泻褌褉芯薪薪芯械 锌懈褋褜屑芯 褋 懈薪褋褌褉褍泻褑懈褟屑懈 芯 褌芯屑, 泻邪泻 褋斜褉芯褋懈褌褜 锌邪褉芯谢褜.',
+  checkEmailForResetLink: '袩芯卸邪谢褍泄褋褌邪, 锌褉芯胁械褉褜褌械 褋胁芯褞 褝谢械泻褌褉芯薪薪褍褞 锌芯褔褌褍 薪邪 薪邪谢懈褔懈械 褋褋褘谢泻懈 写谢褟 褋斜褉芯褋邪 锌邪褉芯谢褟. 袝褋谢懈 芯薪邪 薪械 锌芯褟胁懈褌褋褟 胁 褌械褔械薪懈械 薪械褋泻芯谢褜泻懈褏 屑懈薪褍褌, 芯斜褟蟹邪褌械谢褜薪芯 锌褉芯胁械褉褜褌械 锌邪锌泻褍 褋芯 褋锌邪屑芯屑.',
+  passwordChanged: '袙芯泄写懈褌械 褋械泄褔邪褋',
+  changePassword: '袠蟹屑械薪懈褌褜 锌邪褉芯谢褜',
+  changePasswordTip: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 薪芯胁褘泄 锌邪褉芯谢褜 写谢褟 褋胁芯械泄 褍褔械褌薪芯泄 蟹邪锌懈褋懈',
+  invalidToken: '袧械胁械褉薪褘泄 懈谢懈 锌褉芯褋褉芯褔械薪薪褘泄 褌芯泻械薪',
+  confirmPassword: '袩芯写褌胁械褉写懈褌械 锌邪褉芯谢褜',
+  confirmPasswordPlaceholder: '袩芯写褌胁械褉写懈褌械 褋胁芯泄 薪芯胁褘泄 锌邪褉芯谢褜',
+  passwordChangedTip: '袙邪褕 锌邪褉芯谢褜 斜褘谢 褍褋锌械褕薪芯 懈蟹屑械薪械薪',
+  error: {
+    emailEmpty: '袗写褉械褋 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌褘 芯斜褟蟹邪褌械谢械薪',
+    emailInValid: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 写械泄褋褌胁懈褌械谢褜薪褘泄 邪写褉械褋 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌褘',
+    nameEmpty: '袠屑褟 芯斜褟蟹邪褌械谢褜薪芯',
+    passwordEmpty: '袩邪褉芯谢褜 芯斜褟蟹邪褌械谢械薪',
+    passwordLengthInValid: '袩邪褉芯谢褜 写芯谢卸械薪 褋芯写械褉卸邪褌褜 薪械 屑械薪械械 8 褋懈屑胁芯谢芯胁',
+    passwordInvalid: '袩邪褉芯谢褜 写芯谢卸械薪 褋芯写械褉卸邪褌褜 斜褍泻胁褘 懈 褑懈褎褉褘, 邪 写谢懈薪邪 写芯谢卸薪邪 斜褘褌褜 斜芯谢褜褕械 8',
+    registrationNotAllowed: '袗泻泻邪褍薪褌 薪械 薪邪泄写械薪. 袩芯卸邪谢褍泄褋褌邪, 褋胁褟卸懈褌械褋褜 褋 褋懈褋褌械屑薪褘屑 邪写屑懈薪懈褋褌褉邪褌芯褉芯屑 写谢褟 褉械谐懈褋褌褉邪褑懈懈.',
+  },
+  license: {
+    tip: '袩械褉械写 蟹邪锌褍褋泻芯屑 Dify Community Edition 芯蟹薪邪泻芯屑褜褌械褋褜 褋 谢懈褑械薪蟹懈械泄 GitHub',
+    link: '袥懈褑械薪蟹懈褟 褋 芯褌泻褉褘褌褘屑 懈褋褏芯写薪褘屑 泻芯写芯屑',
+  },
+  join: '袩褉懈褋芯械写懈薪懈褌褜褋褟',
+  joinTipStart: '袩褉懈谐谢邪褕邪械屑 胁邪褋 锌褉懈褋芯械写懈薪懈褌褜褋褟 泻',
+  joinTipEnd: '泻芯屑邪薪写械 薪邪 Dify',
+  invalid: '小褋褘谢泻邪 懈褋褌械泻谢邪',
+  explore: '袠蟹褍褔懈褌褜 Dify',
+  activatedTipStart: '袙褘 锌褉懈褋芯械写懈薪懈谢懈褋褜 泻 泻芯屑邪薪写械',
+  activatedTipEnd: '',
+  activated: '袙芯泄写懈褌械 褋械泄褔邪褋',
+  adminInitPassword: '袩邪褉芯谢褜 懈薪懈褑懈邪谢懈蟹邪褑懈懈 邪写屑懈薪懈褋褌褉邪褌芯褉邪',
+  validate: '袩褉芯胁械褉懈褌褜',
+  checkCode: {
+    verify: '袩褉芯胁械褉褟褌褜',
+    resend: '袨褌锌褉邪胁懈褌褜',
+    invalidCode: '袧械胁械褉薪褘泄 泻芯写',
+    didNotReceiveCode: '袧械 锌芯谢褍褔懈谢懈 泻芯写?',
+    emptyCode: '袣芯写 芯斜褟蟹邪褌械谢械薪 写谢褟 蟹邪锌芯谢薪械薪懈褟',
+    verificationCode: '袩褉芯胁械褉芯褔薪褘泄 泻芯写',
+    checkYourEmail: '袩褉芯胁械褉褜褌械 褋胁芯褞 褝谢械泻褌褉芯薪薪褍褞 锌芯褔褌褍',
+    tips: '袦褘 芯褌锌褉邪胁谢褟械屑 泻芯写 锌芯写褌胁械褉卸写械薪懈褟 薪邪 <strong>{{email}}</strong>',
+    validTime: '袠屑械泄褌械 胁 胁懈写褍, 褔褌芯 泻芯写 写械泄褋褌胁懈褌械谢械薪 胁 褌械褔械薪懈械 5 屑懈薪褍褌',
+    verificationCodePlaceholder: '袙胁械写懈褌械 6-蟹薪邪褔薪褘泄 泻芯写',
+    useAnotherMethod: '袠褋锌芯谢褜蟹褍泄褌械 写褉褍谐芯泄 屑械褌芯写',
+  },
+  back: '袧邪蟹邪写',
+  changePasswordBtn: '校褋褌邪薪芯胁懈褌械 锌邪褉芯谢褜',
+  usePassword: '袠褋锌芯谢褜蟹芯胁邪褌褜 锌邪褉芯谢褜',
+  continueWithCode: '袩褉芯写芯谢卸懈褌褜 褋 泻芯写芯屑',
+  resetPassword: '小斜褉芯褋 锌邪褉芯谢褟',
+  withSSO: '袩褉芯写芯谢卸械薪懈械 褉邪斜芯褌褘 褋 SSO',
+  noLoginMethod: '袦械褌芯写 邪褍褌械薪褌懈褎懈泻邪褑懈懈 薪械 薪邪褋褌褉芯械薪',
+  useVerificationCode: '袠褋锌芯谢褜蟹褍泄褌械 泻芯写 锌芯写褌胁械褉卸写械薪懈褟',
+  sendVerificationCode: '袨褌锌褉邪胁懈褌褜 泻芯写 锌芯写褌胁械褉卸写械薪懈褟',
+  setYourAccount: '袧邪褋褌褉芯泄褌械 褋胁芯褞 褍褔械褌薪褍褞 蟹邪锌懈褋褜',
+  backToLogin: '袙械褉薪褍褌褜褋褟 泻 胁褏芯写褍',
+  enterYourName: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 褋胁芯械 懈屑褟 锌芯谢褜蟹芯胁邪褌械谢褟',
+  noLoginMethodTip: '袨斜褉邪褌懈褌械褋褜 泻 褋懈褋褌械屑薪芯屑褍 邪写屑懈薪懈褋褌褉邪褌芯褉褍, 褔褌芯斜褘 写芯斜邪胁懈褌褜 屑械褌芯写 邪褍褌械薪褌懈褎懈泻邪褑懈懈.',
+  resetPasswordDesc: '袙胁械写懈褌械 邪写褉械褋 褝谢械泻褌褉芯薪薪芯泄 锌芯褔褌褘, 泻芯褌芯褉褘泄 胁褘 懈褋锌芯谢褜蟹芯胁邪谢懈 写谢褟 褉械谐懈褋褌褉邪褑懈懈 胁 Dify, 懈 屑褘 芯褌锌褉邪胁懈屑 胁邪屑 褝谢械泻褌褉芯薪薪芯械 锌懈褋褜屑芯 写谢褟 褋斜褉芯褋邪 锌邪褉芯谢褟.',
+  or: '袠袥袠',
+  licenseInactive: '袥懈褑械薪蟹懈褟 薪械邪泻褌懈胁薪邪',
+  licenseLostTip: '袧械 褍写邪谢芯褋褜 锌芯写泻谢褞褔懈褌褜 褋械褉胁械褉 谢懈褑械薪蟹懈泄 Dify. 袨斜褉邪褌懈褌械褋褜 泻 褋胁芯械屑褍 邪写屑懈薪懈褋褌褉邪褌芯褉褍, 褔褌芯斜褘 锌褉芯写芯谢卸懈褌褜 懈褋锌芯谢褜蟹芯胁邪薪懈械 Dify.',
+  licenseExpired: '小褉芯泻 写械泄褋褌胁懈褟 谢懈褑械薪蟹懈懈 懈褋褌械泻',
+  licenseLost: '校褌械褉褟薪邪 谢懈褑械薪蟹懈褟',
+  licenseInactiveTip: '袥懈褑械薪蟹懈褟 Dify Enterprise 写谢褟 褉邪斜芯褔械谐芯 锌褉芯褋褌褉邪薪褋褌胁邪 薪械邪泻褌懈胁薪邪. 袨斜褉邪褌懈褌械褋褜 泻 褋胁芯械屑褍 邪写屑懈薪懈褋褌褉邪褌芯褉褍, 褔褌芯斜褘 锌褉芯写芯谢卸懈褌褜 懈褋锌芯谢褜蟹芯胁邪薪懈械 Dify.',
+  licenseExpiredTip: '小褉芯泻 写械泄褋褌胁懈褟 谢懈褑械薪蟹懈懈 Dify Enterprise 写谢褟 褉邪斜芯褔械谐芯 锌褉芯褋褌褉邪薪褋褌胁邪 懈褋褌械泻. 袨斜褉邪褌懈褌械褋褜 泻 褋胁芯械屑褍 邪写屑懈薪懈褋褌褉邪褌芯褉褍, 褔褌芯斜褘 锌褉芯写芯谢卸懈褌褜 懈褋锌芯谢褜蟹芯胁邪薪懈械 Dify.',
+}
+
+export default translation
diff --git a/i18n/ru-RU/plugin-tags.ts b/i18n/ru-RU/plugin-tags.ts
new file mode 100644
index 0000000..d6dab2a
--- /dev/null
+++ b/i18n/ru-RU/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    business: '袛械谢芯',
+    videos: '袙懈写械芯',
+    travel: '袩褍褌械褕械褋褌胁芯胁邪褌褜',
+    social: '袨斜褖械褋褌胁械薪薪褘泄',
+    agent: '袗谐械薪褌',
+    search: '袠褋泻邪褌褜',
+    design: '袩褉芯械泻褌懈褉芯胁邪褌褜',
+    image: '袨斜褉邪蟹',
+    news: '袧芯胁芯褋褌懈',
+    utilities: '袣芯屑屑褍薪邪谢褜薪褘械 褍褋谢褍谐懈',
+    weather: '袩芯谐芯写邪',
+    medical: '袦械写懈褑懈薪褋泻懈泄',
+    other: '袛褉褍谐芯泄',
+    finance: '肖懈薪邪薪褋懈褉芯胁邪褌褜',
+    education: '袨斜褉邪蟹芯胁邪薪懈械',
+    productivity: '袩褉芯写褍泻褌懈胁薪芯褋褌褜',
+    entertainment: '袪邪蟹胁谢械褔械薪懈械',
+  },
+  allTags: '袙褋械 褌械谐懈',
+  searchTags: '袩芯懈褋泻 褌械谐芯胁',
+}
+
+export default translation
diff --git a/i18n/ru-RU/plugin.ts b/i18n/ru-RU/plugin.ts
new file mode 100644
index 0000000..9d99bc1
--- /dev/null
+++ b/i18n/ru-RU/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    extensions: '袪邪褋褕懈褉械薪懈褟',
+    tools: '袠薪褋褌褉褍屑械薪褌褘',
+    models: '袦芯写械谢懈',
+    all: '袙褋械',
+    bundles: '袩邪泻械褌褘',
+    agents: '袗谐械薪褌褋泻懈械 褋褌褉邪褌械谐懈懈',
+  },
+  categorySingle: {
+    bundle: '小胁褟蟹泻邪',
+    agent: '袗谐械薪褌褋泻邪褟 褋褌褉邪褌械谐懈褟',
+    model: '袦芯写械谢褜',
+    extension: '袪邪褋褕懈褉械薪懈械',
+    tool: '袠薪褋褌褉褍屑械薪褌',
+  },
+  list: {
+    source: {
+      github: '校褋褌邪薪芯胁泻邪 褋 GitHub',
+      marketplace: '校褋褌邪薪芯胁泻邪 懈蟹 Marketplace',
+      local: '校褋褌邪薪芯胁泻邪 懈蟹 谢芯泻邪谢褜薪芯谐芯 褎邪泄谢邪 锌邪泻械褌邪',
+    },
+    notFound: '袩谢邪谐懈薪褘 薪械 薪邪泄写械薪褘',
+    noInstalled: '袩谢邪谐懈薪褘 薪械 褍褋褌邪薪芯胁谢械薪褘',
+  },
+  source: {
+    github: '小邪泄褌 GitHub',
+    marketplace: '袪褘薪芯泻',
+    local: '袥芯泻邪谢褜薪褘泄 褎邪泄谢 锌邪泻械褌邪',
+  },
+  detailPanel: {
+    categoryTip: {
+      github: '校褋褌邪薪芯胁谢械薪芯 褋 Github',
+      debugging: '袩谢邪谐懈薪 写谢褟 芯褌谢邪写泻懈',
+      local: '袥芯泻邪谢褜薪褘泄 锌谢邪谐懈薪',
+      marketplace: '校褋褌邪薪芯胁谢械薪芯 懈蟹 Marketplace',
+    },
+    operation: {
+      viewDetail: '袩芯写褉芯斜薪械械',
+      detail: '袩芯写褉芯斜薪芯褋褌懈',
+      info: '袠薪褎芯褉屑邪褑懈褟 芯 锌谢邪谐懈薪械',
+      remove: '校斜懈褉邪褌褜',
+      install: '校褋褌邪薪邪胁谢懈胁邪褌褜',
+      update: '袨斜薪芯胁谢褟褌褜',
+      checkUpdate: '袩褉芯胁械褉懈褌褜 芯斜薪芯胁谢械薪懈械',
+    },
+    toolSelector: {
+      placeholder: '袙褘斜械褉懈褌械 懈薪褋褌褉褍屑械薪褌...',
+      auto: '袗胁褌芯屑邪褌懈褔械褋泻懈',
+      title: '袛芯斜邪胁懈褌褜 懈薪褋褌褉褍屑械薪褌',
+      uninstalledTitle: '袠薪褋褌褉褍屑械薪褌 薪械 褍褋褌邪薪芯胁谢械薪',
+      descriptionLabel: '袨锌懈褋邪薪懈械 懈薪褋褌褉褍屑械薪褌邪',
+      unsupportedTitle: '袧械锌芯写写械褉卸懈胁邪械屑芯械 写械泄褋褌胁懈械',
+      settings: '袩袨袥鞋袟袨袙袗孝袝袥鞋小袣袠袝 袧袗小孝袪袨袡袣袠',
+      unsupportedContent: '校褋褌邪薪芯胁谢械薪薪邪褟 胁械褉褋懈褟 锌谢邪谐懈薪邪 薪械 锌褉械写褍褋屑邪褌褉懈胁邪械褌 褝褌芯谐芯 写械泄褋褌胁懈褟.',
+      empty: '袧邪卸屑懈褌械 泻薪芯锌泻褍 芦+禄, 褔褌芯斜褘 写芯斜邪胁懈褌褜 懈薪褋褌褉褍屑械薪褌褘. 袙褘 屑芯卸械褌械 写芯斜邪胁懈褌褜 薪械褋泻芯谢褜泻芯 懈薪褋褌褉褍屑械薪褌芯胁.',
+      uninstalledContent: '协褌芯褌 锌谢邪谐懈薪 褍褋褌邪薪邪胁谢懈胁邪械褌褋褟 懈蟹 褉械锌芯蟹懈褌芯褉懈褟 local/GitHub. 袩芯卸邪谢褍泄褋褌邪, 懈褋锌芯谢褜蟹褍泄褌械 锌芯褋谢械 褍褋褌邪薪芯胁泻懈.',
+      paramsTip2: '袣芯谐写邪 锌邪褉邪屑械褌褉 芦袗胁褌芯屑邪褌懈褔械褋泻懈禄 胁褘泻谢褞褔械薪, 懈褋锌芯谢褜蟹褍械褌褋褟 蟹薪邪褔械薪懈械 锌芯 褍屑芯谢褔邪薪懈褞.',
+      toolLabel: '袠薪褋褌褉褍屑械薪褌',
+      paramsTip1: '校锌褉邪胁谢褟械褌 锌邪褉邪屑械褌褉邪屑懈 胁褘胁芯写邪 LLM.',
+      descriptionPlaceholder: '袣褉邪褌泻芯械 芯锌懈褋邪薪懈械 薪邪蟹薪邪褔械薪懈褟 懈薪褋褌褉褍屑械薪褌邪, 薪邪锌褉懈屑械褉, 锌芯谢褍褔械薪懈械 褌械屑锌械褉邪褌褍褉褘 写谢褟 泻芯薪泻褉械褌薪芯谐芯 屑械褋褌邪.',
+      params: '袣袨袧肖袠袚校袪袗笑袠携 袪袗小小校袞袛袝袧袠袡',
+      unsupportedContent2: '袧邪卸屑懈褌械, 褔褌芯斜褘 锌械褉械泻谢褞褔懈褌褜 胁械褉褋懈褞.',
+      uninstalledLink: '校锌褉邪胁谢械薪懈械 胁 锌谢邪谐懈薪邪褏',
+    },
+    configureTool: '袠薪褋褌褉褍屑械薪褌 薪邪褋褌褉芯泄泻懈',
+    endpointsTip: '协褌芯褌 锌谢邪谐懈薪 锌褉械写芯褋褌邪胁谢褟械褌 芯锌褉械写械谢械薪薪褘械 褎褍薪泻褑懈芯薪邪谢褜薪褘械 胁芯蟹屑芯卸薪芯褋褌懈 褔械褉械蟹 泻芯薪械褔薪褘械 褌芯褔泻懈, 懈 胁褘 屑芯卸械褌械 薪邪褋褌褉芯懈褌褜 薪械褋泻芯谢褜泻芯 薪邪斜芯褉芯胁 泻芯薪械褔薪褘褏 褌芯褔械泻 写谢褟 褌械泻褍褖械泄 褉邪斜芯褔械泄 芯斜谢邪褋褌懈.',
+    endpointDeleteTip: '校写邪谢懈褌褜 泻芯薪械褔薪褍褞 褌芯褔泻褍',
+    disabled: '袧械褌褉褍写芯褋锌芯褋芯斜薪褘泄',
+    serviceOk: '校褋谢褍谐邪 袨袣',
+    configureApp: '袧邪褋褌褉芯泄泻邪 锌褉懈谢芯卸械薪懈褟',
+    endpointDeleteContent: '啸芯褌械谢懈 斜褘 胁褘 褍写邪谢懈褌褜 {{name}}?',
+    strategyNum: '{{褔懈褋谢芯}} {{小褌褉邪褌械谐懈褟}} 袙袣袥挟效袝袧袧蝎袡',
+    endpoints: '袣芯薪械褔薪褘械 褌芯褔泻懈',
+    modelNum: '{{褔懈褋谢芯}} 袦袨袛袝袥袠 袙 袣袨袦袩袥袝袣孝袝',
+    endpointDisableTip: '袨褌泻谢褞褔懈褌褜 泻芯薪械褔薪褍褞 褌芯褔泻褍',
+    configureModel: '袧邪褋褌褉芯泄泻邪 屑芯写械谢懈',
+    endpointModalDesc: '袩芯褋谢械 薪邪褋褌褉芯泄泻懈 屑芯卸薪芯 懈褋锌芯谢褜蟹芯胁邪褌褜 褎褍薪泻褑懈懈, 锌褉械写芯褋褌邪胁谢褟械屑褘械 锌谢邪谐懈薪芯屑 褔械褉械蟹 泻芯薪械褔薪褘械 褌芯褔泻懈 API.',
+    endpointModalTitle: '袧邪褋褌褉芯泄泻邪 泻芯薪械褔薪芯泄 褌芯褔泻懈',
+    actionNum: '{{褔懈褋谢芯}} {{写械泄褋褌胁懈械}} 袙袣袥挟效袝袧袧蝎袡',
+    endpointDisableContent: '啸芯褌械谢懈 斜褘 胁褘 芯褌泻谢褞褔懈褌褜 {{name}}?',
+    endpointsEmpty: '袧邪卸屑懈褌械 泻薪芯锌泻褍 芦+禄, 褔褌芯斜褘 写芯斜邪胁懈褌褜 泻芯薪械褔薪褍褞 褌芯褔泻褍',
+    switchVersion: '袙械褉褋懈褟 写谢褟 锌械褉械泻谢褞褔邪褌械谢褟',
+    endpointsDocLink: '袩芯褋屑芯褌褉械褌褜 写芯泻褍屑械薪褌',
+  },
+  debugInfo: {
+    title: '袨褌谢邪写泻邪',
+    viewDocs: '袩褉芯褋屑芯褌褉 写芯泻褍屑械薪褌邪褑懈懈',
+  },
+  privilege: {
+    whoCanDebug: '袣褌芯 屑芯卸械褌 芯褌谢邪卸懈胁邪褌褜 锌谢邪谐懈薪褘?',
+    admins: '袗写屑懈薪褘',
+    noone: '袧懈泻褌芯',
+    everyone: '袣邪卸写褘泄',
+    title: '袧邪褋褌褉芯泄泻懈 锌谢邪谐懈薪邪',
+    whoCanInstall: '袣褌芯 屑芯卸械褌 褍褋褌邪薪邪胁谢懈胁邪褌褜 锌谢邪谐懈薪褘 懈 褍锌褉邪胁谢褟褌褜 懈屑懈?',
+  },
+  pluginInfoModal: {
+    packageName: '袩邪泻械褌',
+    title: '袠薪褎芯褉屑邪褑懈褟 芯 锌谢邪谐懈薪械',
+    repository: '啸褉邪薪懈谢懈褖械',
+    release: '袨褌锌褍褋泻邪褌褜',
+  },
+  action: {
+    deleteContentLeft: '袙褘 褏芯褌械谢懈 斜褘 褍写邪谢懈褌褜',
+    pluginInfo: '袠薪褎芯褉屑邪褑懈褟 芯 锌谢邪谐懈薪械',
+    checkForUpdates: '袩褉芯胁械褉泻邪 芯斜薪芯胁谢械薪懈泄',
+    delete: '校写邪谢懈褌褜 锌谢邪谐懈薪',
+    deleteContentRight: '袩谢邪谐懈薪?',
+    usedInApps: '协褌芯褌 锌谢邪谐懈薪 懈褋锌芯谢褜蟹褍械褌褋褟 胁 锌褉懈谢芯卸械薪懈褟褏 {{num}}.',
+  },
+  installModal: {
+    labels: {
+      package: '袩邪泻械褌',
+      version: '袙械褉褋懈褟',
+      repository: '啸褉邪薪懈谢懈褖械',
+    },
+    readyToInstall: '袨 锌褉芯谐褉邪屑屑械 褍褋褌邪薪芯胁泻懈 褋谢械写褍褞褖械谐芯 锌谢邪谐懈薪邪',
+    close: '袟邪泻褉褘胁邪褌褜',
+    installedSuccessfully: '校褋褌邪薪芯胁泻邪 褍褋锌械褕薪邪',
+    dropPluginToInstall: '袩械褉械褌邪褖懈褌械 锌邪泻械褌 锌谢邪谐懈薪邪 褋褞写邪 写谢褟 褍褋褌邪薪芯胁泻懈',
+    uploadFailed: '袨褕懈斜泻邪 蟹邪谐褉褍蟹泻懈',
+    cancel: '袨褌屑械薪邪',
+    installFailed: '袨褕懈斜泻邪 褍褋褌邪薪芯胁泻懈',
+    readyToInstallPackages: '袨 薪械芯斜褏芯写懈屑芯褋褌懈 褍褋褌邪薪芯胁泻懈 褋谢械写褍褞褖懈褏 锌谢邪谐懈薪芯胁 {{num}}',
+    installedSuccessfullyDesc: '袩谢邪谐懈薪 褍褋锌械褕薪芯 褍褋褌邪薪芯胁谢械薪.',
+    installComplete: '袦芯薪褌邪卸 蟹邪胁械褉褕械薪',
+    next: '小谢械写褍褞褖懈泄',
+    fromTrustSource: '校斜械写懈褌械褋褜, 褔褌芯 胁褘 褍褋褌邪薪邪胁谢懈胁邪械褌械 锌谢邪谐懈薪褘 褌芯谢褜泻芯 懈蟹 <trustSource>薪邪写械卸薪芯谐芯 懈褋褌芯褔薪懈泻邪</trustSource>.',
+    install: '校褋褌邪薪邪胁谢懈胁邪褌褜',
+    installPlugin: '校褋褌邪薪芯胁懈褌褜 锌谢邪谐懈薪',
+    installFailedDesc: '袩谢邪谐懈薪 斜褘谢 褍褋褌邪薪芯胁谢械薪 薪械 褍写邪谢芯褋褜.',
+    back: '袧邪蟹邪写',
+    pluginLoadErrorDesc: '协褌芯褌 锌谢邪谐懈薪 薪械 斜褍写械褌 褍褋褌邪薪芯胁谢械薪',
+    installing: '校褋褌邪薪芯胁泻邪...',
+    uploadingPackage: '袟邪谐褉褍蟹泻邪 {{packageName}}...',
+    pluginLoadError: '袨褕懈斜泻邪 蟹邪谐褉褍蟹泻懈 锌谢邪谐懈薪邪',
+    readyToInstallPackage: '袨 锌褉芯谐褉邪屑屑械 褍褋褌邪薪芯胁泻懈 褋谢械写褍褞褖械谐芯 锌谢邪谐懈薪邪',
+  },
+  installFromGitHub: {
+    gitHubRepo: '袪械锌芯蟹懈褌芯褉懈泄 GitHub',
+    selectPackagePlaceholder: '袩芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 锌邪泻械褌',
+    installNote: '校斜械写懈褌械褋褜, 褔褌芯 胁褘 褍褋褌邪薪邪胁谢懈胁邪械褌械 锌谢邪谐懈薪褘 褌芯谢褜泻芯 懈蟹 薪邪写械卸薪芯谐芯 懈褋褌芯褔薪懈泻邪.',
+    selectPackage: '袙褘斜褉邪褌褜 锌邪泻械褌',
+    installedSuccessfully: '校褋褌邪薪芯胁泻邪 褍褋锌械褕薪邪',
+    selectVersion: '袙褘斜械褉懈褌械 胁械褉褋懈褞',
+    updatePlugin: '袨斜薪芯胁谢械薪懈械 锌谢邪谐懈薪邪 褋 GitHub',
+    installFailed: '袨褕懈斜泻邪 褍褋褌邪薪芯胁泻懈',
+    uploadFailed: '袨褕懈斜泻邪 蟹邪谐褉褍蟹泻懈',
+    installPlugin: '校褋褌邪薪芯胁泻邪 锌谢邪谐懈薪邪 褋 GitHub',
+    selectVersionPlaceholder: '袩芯卸邪谢褍泄褋褌邪, 胁褘斜械褉懈褌械 胁械褉褋懈褞',
+  },
+  upgrade: {
+    close: '袟邪泻褉褘胁邪褌褜',
+    upgrading: '校褋褌邪薪芯胁泻邪...',
+    successfulTitle: '校褋褌邪薪芯胁泻邪 褍褋锌械褕薪邪',
+    title: '校褋褌邪薪芯胁懈褌褜 锌谢邪谐懈薪',
+    upgrade: '校褋褌邪薪邪胁谢懈胁邪褌褜',
+    usedInApps: '袠褋锌芯谢褜蟹褍械褌褋褟 胁 锌褉懈谢芯卸械薪懈褟褏 {{num}}',
+    description: '袨 锌褉芯谐褉邪屑屑械 褍褋褌邪薪芯胁泻懈 褋谢械写褍褞褖械谐芯 锌谢邪谐懈薪邪',
+  },
+  error: {
+    inValidGitHubUrl: '袧械写芯锌褍褋褌懈屑褘泄 URL-邪写褉械褋 GitHub. 袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 写械泄褋褌胁懈褌械谢褜薪褘泄 URL-邪写褉械褋 胁 褎芯褉屑邪褌械: https://github.com/owner/repo',
+    noReleasesFound: '袪械谢懈蟹褘 薪械 薪邪泄写械薪褘. 袩芯卸邪谢褍泄褋褌邪, 锌褉芯胁械褉褜褌械 褉械锌芯蟹懈褌芯褉懈泄 GitHub 懈谢懈 胁褏芯写薪芯泄 URL.',
+    fetchReleasesError: '袧械 褍写邪械褌褋褟 锌芯谢褍褔懈褌褜 褉械谢懈蟹褘. 袩芯卸邪谢褍泄褋褌邪, 锌芯胁褌芯褉懈褌械 锌芯锌褘褌泻褍 锌芯蟹卸械.',
+  },
+  marketplace: {
+    sortOption: {
+      newlyReleased: '袧械写邪胁薪芯 胁褘锌褍褖械薪薪褘械',
+      mostPopular: '小邪屑褘械 锌芯锌褍谢褟褉薪褘械',
+      firstReleased: '袙锌械褉胁褘械 胁褘锌褍褖械薪',
+      recentlyUpdated: '袧械写邪胁薪芯 芯斜薪芯胁谢械薪薪褘械',
+    },
+    pluginsResult: '袪械蟹褍谢褜褌邪褌褘 {{num}}',
+    moreFrom: '袘芯谢褜褕械 懈蟹 Marketplace',
+    noPluginFound: '袩谢邪谐懈薪 薪械 薪邪泄写械薪',
+    sortBy: '效械褉薪褘泄 谐芯褉芯写',
+    empower: '袪邪褋褕懈褉褜褌械 胁芯蟹屑芯卸薪芯褋褌懈 褉邪蟹褉邪斜芯褌泻懈 袠袠',
+    difyMarketplace: '孝芯褉谐芯胁邪褟 锌谢芯褖邪写泻邪 Dify',
+    viewMore: '袩芯写褉芯斜薪械械',
+    and: '懈',
+    discover: '袨斜薪邪褉褍卸懈胁邪褌褜',
+    verifiedTip: '袩芯写褌胁械褉卸写械薪芯 Dify',
+    partnerTip: '袩芯写褌胁械褉卸写械薪芯 锌邪褉褌薪械褉芯屑 Dify',
+  },
+  task: {
+    installing: '校褋褌邪薪芯胁泻邪 锌谢邪谐懈薪芯胁 {{installingLength}}, 0 谐芯褌芯胁芯.',
+    installingWithError: '校褋褌邪薪芯胁泻邪 锌谢邪谐懈薪芯胁 {{installingLength}}, {{successLength}} 褍褋锌械褏, {{errorLength}} 薪械褍写邪褔薪褘泄',
+    clearAll: '袨褔懈褋褌懈褌褜 胁褋械',
+    installingWithSuccess: '校褋褌邪薪芯胁泻邪 锌谢邪谐懈薪芯胁 {{installingLength}}, {{successLength}} 褍褋锌械褏.',
+    installedError: '锌谢邪谐懈薪褘 {{errorLength}} 薪械 褍写邪谢芯褋褜 褍褋褌邪薪芯胁懈褌褜',
+    installError: '袩谢邪谐懈薪褘 {{errorLength}} 薪械 褍写邪谢芯褋褜 褍褋褌邪薪芯胁懈褌褜, 薪邪卸屑懈褌械 写谢褟 锌褉芯褋屑芯褌褉邪',
+  },
+  install: '{{num}} 褍褋褌邪薪芯胁芯泻',
+  searchCategories: '袩芯懈褋泻 泻邪褌械谐芯褉懈泄',
+  search: '袠褋泻邪褌褜',
+  searchInMarketplace: '袩芯懈褋泻 胁 屑邪褉泻械褌锌谢械泄褋械',
+  searchTools: '袠薪褋褌褉褍屑械薪褌褘 锌芯懈褋泻邪...',
+  allCategories: '袙褋械 泻邪褌械谐芯褉懈懈',
+  endpointsEnabled: '{{num}} 薪邪斜芯褉褘 胁泻谢褞褔械薪薪褘褏 泻芯薪械褔薪褘褏 褌芯褔械泻',
+  submitPlugin: '袨褌锌褉邪胁懈褌褜 锌谢邪谐懈薪',
+  installAction: '校褋褌邪薪邪胁谢懈胁邪褌褜',
+  from: '袨褌',
+  installFrom: '校小孝袗袧袨袙袠孝鞋 小',
+  findMoreInMarketplace: '校蟹薪邪泄褌械 斜芯谢褜褕械 胁 Marketplace',
+  installPlugin: '校褋褌邪薪芯胁泻邪 锌谢邪谐懈薪邪',
+  searchPlugins: '袩谢邪谐懈薪褘 锌芯懈褋泻邪',
+  fromMarketplace: '袠蟹 屑邪褉泻械褌锌谢械泄褋邪',
+  metadata: {
+    title: '袩谢邪谐懈薪褘',
+  },
+  difyVersionNotCompatible: '孝械泻褍褖邪褟 胁械褉褋懈褟 Dify 薪械 褋芯胁屑械褋褌懈屑邪 褋 褝褌懈屑 锌谢邪谐懈薪芯屑, 锌芯卸邪谢褍泄褋褌邪, 芯斜薪芯胁懈褌械 写芯 屑懈薪懈屑邪谢褜薪芯 薪械芯斜褏芯写懈屑芯泄 胁械褉褋懈懈: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/ru-RU/register.ts b/i18n/ru-RU/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/ru-RU/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/ru-RU/run-log.ts b/i18n/ru-RU/run-log.ts
new file mode 100644
index 0000000..1e08dd6
--- /dev/null
+++ b/i18n/ru-RU/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: '袙袙袨袛',
+  result: '袪袝袟校袥鞋孝袗孝',
+  detail: '袛袝孝袗袥袠',
+  tracing: '孝袪袗小小袠袪袨袙袣袗',
+  resultPanel: {
+    status: '小孝袗孝校小',
+    time: '袩袪袨楔袝袛楔袝袝 袙袪袝袦携',
+    tokens: '袙小袝袚袨 孝袨袣袝袧袨袙',
+  },
+  meta: {
+    title: '袦袝孝袗袛袗袧袧蝎袝',
+    status: '小褌邪褌褍褋',
+    version: '袙械褉褋懈褟',
+    executor: '袠褋锌芯谢薪懈褌械谢褜',
+    startTime: '袙褉械屑褟 薪邪褔邪谢邪',
+    time: '袩褉芯褕械写褕械械 胁褉械屑褟',
+    tokens: '袙褋械谐芯 褌芯泻械薪芯胁',
+    steps: '楔邪谐懈 胁褘锌芯谢薪械薪懈褟',
+  },
+  resultEmpty: {
+    title: '协褌芯褌 蟹邪锌褍褋泻 胁褘胁芯写懈褌 褌芯谢褜泻芯 褎芯褉屑邪褌 JSON,',
+    tipLeft: '锌芯卸邪谢褍泄褋褌邪, 锌械褉械泄写懈褌械 薪邪 ',
+    link: '锌邪薪械谢褜 写械褌邪谢械泄',
+    tipRight: ' 褔褌芯斜褘 锌褉芯褋屑芯褌褉械褌褜 械谐芯.',
+  },
+  circularInvocationTip: '袙 褌械泻褍褖械屑 褉邪斜芯褔械屑 锌褉芯褑械褋褋械 褋褍褖械褋褌胁褍械褌 褑懈泻谢懈褔械褋泻懈泄 胁褘蟹芯胁 懈薪褋褌褉褍屑械薪褌芯胁/褍蟹谢芯胁.',
+  actionLogs: '袞褍褉薪邪谢褘 写械泄褋褌胁懈泄',
+}
+
+export default translation
diff --git a/i18n/ru-RU/share-app.ts b/i18n/ru-RU/share-app.ts
new file mode 100644
index 0000000..b2850fa
--- /dev/null
+++ b/i18n/ru-RU/share-app.ts
@@ -0,0 +1,82 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: '袩褉懈谢芯卸械薪懈械 薪械写芯褋褌褍锌薪芯',
+    appUnknownError: '袩褉懈谢芯卸械薪懈械 薪械写芯褋褌褍锌薪芯',
+  },
+  chat: {
+    newChat: '袧芯胁褘泄 褔邪褌',
+    pinnedTitle: '袟邪泻褉械锌谢械薪薪褘械',
+    unpinnedTitle: '效邪褌褘',
+    newChatDefaultName: '袧芯胁褘泄 褉邪蟹谐芯胁芯褉',
+    resetChat: '小斜褉芯褋懈褌褜 褉邪蟹谐芯胁芯褉',
+    poweredBy: '袪邪斜芯褌邪械褌 薪邪',
+    prompt: '袩芯写褋泻邪蟹泻邪',
+    privatePromptConfigTitle: '袧邪褋褌褉芯泄泻懈 褉邪蟹谐芯胁芯褉邪',
+    publicPromptConfigTitle: '袧邪褔邪谢褜薪邪褟 锌芯写褋泻邪蟹泻邪',
+    configStatusDes: '袩械褉械写 薪邪褔邪谢芯屑 胁褘 屑芯卸械褌械 懈蟹屑械薪懈褌褜 薪邪褋褌褉芯泄泻懈 褉邪蟹谐芯胁芯褉邪',
+    configDisabled:
+      '袛谢褟 褝褌芯谐芯 褋械邪薪褋邪 懈褋锌芯谢褜蟹芯胁邪谢懈褋褜 薪邪褋褌褉芯泄泻懈 锌褉械写褘写褍褖械谐芯 褋械邪薪褋邪.',
+    startChat: '袧邪褔邪褌褜 褔邪褌',
+    privacyPolicyLeft:
+      '袩芯卸邪谢褍泄褋褌邪, 芯蟹薪邪泻芯屑褜褌械褋褜 褋 ',
+    privacyPolicyMiddle:
+      '锌芯谢懈褌懈泻芯泄 泻芯薪褎懈写械薪褑懈邪谢褜薪芯褋褌懈',
+    privacyPolicyRight:
+      ', 锌褉械写芯褋褌邪胁谢械薪薪芯泄 褉邪蟹褉邪斜芯褌褔懈泻芯屑 锌褉懈谢芯卸械薪懈褟.',
+    deleteConversation: {
+      title: '校写邪谢懈褌褜 褉邪蟹谐芯胁芯褉',
+      content: '袙褘 褍胁械褉械薪褘, 褔褌芯 褏芯褌懈褌械 褍写邪谢懈褌褜 褝褌芯褌 褉邪蟹谐芯胁芯褉?',
+    },
+    tryToSolve: '袩芯锌褉芯斜褍泄褌械 褉械褕懈褌褜',
+    temporarySystemIssue: '袠蟹胁懈薪懈褌械, 胁褉械屑械薪薪邪褟 锌褉芯斜谢械屑邪 褋 褋懈褋褌械屑芯泄.',
+    expand: '袪邪蟹胁械褉薪褍褌褜',
+    collapse: '小胁械褉薪褍褌褜',
+    viewChatSettings: '袩芯褋屑芯褌褉械褌褜 薪邪褋褌褉芯泄泻懈 褔邪褌邪',
+    chatSettingsTitle: '袧芯胁邪褟 薪邪褋褌褉芯泄泻邪 褔邪褌邪',
+    newChatTip: '校卸械 胁 薪芯胁芯屑 褔邪褌械',
+    chatFormTip: '袧邪褋褌褉芯泄泻懈 褔邪褌邪 薪械 屑芯谐褍褌 斜褘褌褜 懈蟹屑械薪械薪褘 锌芯褋谢械 械谐芯 薪邪褔邪谢邪.',
+  },
+  generation: {
+    tabs: {
+      create: '袟邪锌褍褋褌懈褌褜 芯写懈薪 褉邪蟹',
+      batch: '袟邪锌褍褋褌懈褌褜 锌邪泻械褌薪芯',
+      saved: '小芯褏褉邪薪械薪薪褘械',
+    },
+    savedNoData: {
+      title: '袙褘 械褖械 薪械 褋芯褏褉邪薪懈谢懈 薪懈 芯写薪芯谐芯 褉械蟹褍谢褜褌邪褌邪!',
+      description: '袧邪褔薪懈褌械 谐械薪械褉懈褉芯胁邪褌褜 泻芯薪褌械薪褌, 懈 胁褘 薪邪泄写械褌械 褋胁芯懈 褋芯褏褉邪薪械薪薪褘械 褉械蟹褍谢褜褌邪褌褘 蟹写械褋褜.',
+      startCreateContent: '袧邪褔邪褌褜 褋芯蟹写邪胁邪褌褜 泻芯薪褌械薪褌',
+    },
+    title: '袟邪胁械褉褕械薪懈械 袠袠',
+    queryTitle: '小芯写械褉卸懈屑芯械 蟹邪锌褉芯褋邪',
+    completionResult: '袪械蟹褍谢褜褌邪褌 蟹邪胁械褉褕械薪懈褟',
+    queryPlaceholder: '袧邪锌懈褕懈褌械 褋芯写械褉卸懈屑芯械 胁邪褕械谐芯 蟹邪锌褉芯褋邪...',
+    run: '袙褘锌芯谢薪懈褌褜',
+    copy: '袣芯锌懈褉芯胁邪褌褜',
+    resultTitle: '袟邪胁械褉褕械薪懈械 袠袠',
+    noData: '袠袠 写邪褋褌 胁邪屑 褌芯, 褔褌芯 胁褘 褏芯褌懈褌械, 蟹写械褋褜.',
+    csvUploadTitle: '袩械褉械褌邪褖懈褌械 褋褞写邪 褋胁芯泄 CSV-褎邪泄谢 懈谢懈 ',
+    browse: '芯斜蟹芯褉',
+    csvStructureTitle: 'CSV-褎邪泄谢 写芯谢卸械薪 褋芯芯褌胁械褌褋褌胁芯胁邪褌褜 褋谢械写褍褞褖械泄 褋褌褉褍泻褌褍褉械:',
+    downloadTemplate: '小泻邪褔邪褌褜 褕邪斜谢芯薪 蟹写械褋褜',
+    field: '袩芯谢械',
+    batchFailed: {
+      info: '{{num}} 薪械褍写邪褔薪褘褏 胁褘锌芯谢薪械薪懈泄',
+      retry: '袩芯胁褌芯褉懈褌褜 锌芯锌褘褌泻褍',
+      outputPlaceholder: '袧械褌 胁褘褏芯写薪芯谐芯 褋芯写械褉卸懈屑芯谐芯',
+    },
+    errorMsg: {
+      empty: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 褋芯写械褉卸懈屑芯械 胁 蟹邪谐褉褍卸械薪薪褘泄 褎邪泄谢.',
+      fileStructNotMatch: '袟邪谐褉褍卸械薪薪褘泄 CSV-褎邪泄谢 薪械 褋芯芯褌胁械褌褋褌胁褍械褌 褋褌褉褍泻褌褍褉械.',
+      emptyLine: '小褌褉芯泻邪 {{rowIndex}} 锌褍褋褌邪',
+      invalidLine: '小褌褉芯泻邪 {{rowIndex}}: 蟹薪邪褔械薪懈械 {{varName}} 薪械 屑芯卸械褌 斜褘褌褜 锌褍褋褌褘屑',
+      moreThanMaxLengthLine: '小褌褉芯泻邪 {{rowIndex}}: 蟹薪邪褔械薪懈械 {{varName}} 薪械 屑芯卸械褌 锌褉械胁褘褕邪褌褜 {{maxLength}} 褋懈屑胁芯谢芯胁',
+      atLeastOne: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 褏芯褌褟 斜褘 芯写薪褍 褋褌褉芯泻褍 胁 蟹邪谐褉褍卸械薪薪褘泄 褎邪泄谢.',
+    },
+    execution: '袠小袩袨袥袧袝袧袠袝',
+    executions: '{{num}} 袙蝎袩袨袥袧袝袧袠携',
+  },
+}
+
+export default translation
diff --git a/i18n/ru-RU/time.ts b/i18n/ru-RU/time.ts
new file mode 100644
index 0000000..be9e38f
--- /dev/null
+++ b/i18n/ru-RU/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Mon: '袦芯泄',
+    Tue: '袙褌芯褉薪懈泻',
+    Sat: '小褍斜斜芯褌邪',
+    Sun: '小芯谢薪褑械',
+    Thu: '效械褌胁械褉谐',
+    Wed: '小褉褟写邪',
+    Fri: '小胁芯斜芯写薪芯',
+  },
+  months: {
+    March: '袦邪褉褌',
+    May: '袦邪泄',
+    April: '袗锌褉械谢褜',
+    July: '袠褞谢褜',
+    January: '携薪胁邪褉褜',
+    August: '袗胁谐褍褋褌',
+    December: '袛械泻邪斜褉褜',
+    February: '肖械胁褉邪谢褜',
+    September: '小械薪褌褟斜褉褜',
+    October: '袨泻褌褟斜褉褜',
+    June: '袠褞薪褜',
+    November: '袧芯褟斜褉褜',
+  },
+  operation: {
+    ok: '啸芯褉芯褕芯',
+    pickDate: '袙褘斜械褉懈褌械 写邪褌褍',
+    now: '孝械锌械褉褜',
+    cancel: '袨褌屑械薪邪',
+  },
+  title: {
+    pickTime: '袙褘斜械褉懈褌械 胁褉械屑褟',
+  },
+  defaultPlaceholder: '袙褘斜械褉懈褌械 胁褉械屑褟...',
+}
+
+export default translation
diff --git a/i18n/ru-RU/tools.ts b/i18n/ru-RU/tools.ts
new file mode 100644
index 0000000..02cf639
--- /dev/null
+++ b/i18n/ru-RU/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: '袠薪褋褌褉褍屑械薪褌褘',
+  createCustomTool: '小芯蟹写邪褌褜 锌芯谢褜蟹芯胁邪褌械谢褜褋泻懈泄 懈薪褋褌褉褍屑械薪褌',
+  customToolTip: '校蟹薪邪褌褜 斜芯谢褜褕械 芯 锌芯谢褜蟹芯胁邪褌械谢褜褋泻懈褏 懈薪褋褌褉褍屑械薪褌邪褏 Dify',
+  type: {
+    all: '袙褋械',
+    builtIn: '袙褋褌褉芯械薪薪褘械',
+    custom: '袩芯谢褜蟹芯胁邪褌械谢褜褋泻懈械',
+    workflow: '袪邪斜芯褔懈泄 锌褉芯褑械褋褋',
+  },
+  contribute: {
+    line1: '携 蟹邪懈薪褌械褉械褋芯胁邪薪 胁',
+    line2: '胁薪械褋械薪懈懈 懈薪褋褌褉褍屑械薪褌芯胁 胁 Dify.',
+    viewGuide: '袩芯褋屑芯褌褉械褌褜 褉褍泻芯胁芯写褋褌胁芯',
+  },
+  author: '袗胁褌芯褉',
+  auth: {
+    unauthorized: '袗胁褌芯褉懈蟹芯胁邪褌褜',
+    authorized: '袗胁褌芯褉懈蟹芯胁邪薪芯',
+    setup: '袧邪褋褌褉芯懈褌褜 邪胁褌芯褉懈蟹邪褑懈褞 写谢褟 懈褋锌芯谢褜蟹芯胁邪薪懈褟',
+    setupModalTitle: '袧邪褋褌褉芯懈褌褜 邪胁褌芯褉懈蟹邪褑懈褞',
+    setupModalTitleDescription: '袩芯褋谢械 薪邪褋褌褉芯泄泻懈 褍褔械褌薪褘褏 写邪薪薪褘褏 胁褋械 褍褔邪褋褌薪懈泻懈 褉邪斜芯褔械谐芯 锌褉芯褋褌褉邪薪褋褌胁邪 褋屑芯谐褍褌 懈褋锌芯谢褜蟹芯胁邪褌褜 褝褌芯褌 懈薪褋褌褉褍屑械薪褌 锌褉懈 芯褉泻械褋褌褉芯胁泻械 锌褉懈谢芯卸械薪懈泄.',
+  },
+  includeToolNum: '袙泻谢褞褔械薪芯 {{num}} 懈薪褋褌褉褍屑械薪褌芯胁',
+  addTool: '袛芯斜邪胁懈褌褜 懈薪褋褌褉褍屑械薪褌',
+  addToolModal: {
+    type: '褌懈锌',
+    category: '泻邪褌械谐芯褉懈褟',
+    add: '写芯斜邪胁懈褌褜',
+    added: '写芯斜邪胁谢械薪芯',
+    manageInTools: '校锌褉邪胁谢褟褌褜 胁 懈薪褋褌褉褍屑械薪褌邪褏',
+    emptyTitle: '袧械褌 写芯褋褌褍锌薪褘褏 懈薪褋褌褉褍屑械薪褌芯胁 褉邪斜芯褔械谐芯 锌褉芯褑械褋褋邪',
+    emptyTip: '袩械褉械泄写懈褌械 胁 "袪邪斜芯褔懈泄 锌褉芯褑械褋褋 -> 袨锌褍斜谢懈泻芯胁邪褌褜 泻邪泻 懈薪褋褌褉褍屑械薪褌"',
+    emptyTitleCustom: '袧械褌 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯谐芯 懈薪褋褌褉褍屑械薪褌邪',
+    emptyTipCustom: '小芯蟹写邪薪懈械 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯谐芯 懈薪褋褌褉褍屑械薪褌邪',
+  },
+  createTool: {
+    title: '小芯蟹写邪褌褜 锌芯谢褜蟹芯胁邪褌械谢褜褋泻懈泄 懈薪褋褌褉褍屑械薪褌',
+    editAction: '袧邪褋褌褉芯懈褌褜',
+    editTitle: '袪械写邪泻褌懈褉芯胁邪褌褜 锌芯谢褜蟹芯胁邪褌械谢褜褋泻懈泄 懈薪褋褌褉褍屑械薪褌',
+    name: '袧邪蟹胁邪薪懈械',
+    toolNamePlaceHolder: '袙胁械写懈褌械 薪邪蟹胁邪薪懈械 懈薪褋褌褉褍屑械薪褌邪',
+    nameForToolCall: '袧邪蟹胁邪薪懈械 胁褘蟹芯胁邪 懈薪褋褌褉褍屑械薪褌邪',
+    nameForToolCallPlaceHolder: '袠褋锌芯谢褜蟹褍械褌褋褟 写谢褟 屑邪褕懈薪薪芯谐芯 褉邪褋锌芯蟹薪邪胁邪薪懈褟, 薪邪锌褉懈屑械褉 getCurrentWeather, list_pets',
+    nameForToolCallTip: '袩芯写写械褉卸懈胁邪褞褌褋褟 褌芯谢褜泻芯 褑懈褎褉褘, 斜褍泻胁褘 懈 锌芯写褔械褉泻懈胁邪薪懈褟.',
+    description: '袨锌懈褋邪薪懈械',
+    descriptionPlaceholder: '袣褉邪褌泻芯械 芯锌懈褋邪薪懈械 薪邪蟹薪邪褔械薪懈褟 懈薪褋褌褉褍屑械薪褌邪, 薪邪锌褉懈屑械褉, 锌芯谢褍褔懈褌褜 褌械屑锌械褉邪褌褍褉褍 写谢褟 芯锌褉械写械谢械薪薪芯谐芯 屑械褋褌芯锌芯谢芯卸械薪懈褟.',
+    schema: '小褏械屑邪',
+    schemaPlaceHolder: '袙胁械写懈褌械 褋胁芯褞 褋褏械屑褍 OpenAPI 蟹写械褋褜',
+    viewSchemaSpec: '袩芯褋屑芯褌褉械褌褜 褋锌械褑懈褎懈泻邪褑懈褞 OpenAPI-Swagger',
+    importFromUrl: '袠屑锌芯褉褌懈褉芯胁邪褌褜 懈蟹 URL',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 写械泄褋褌胁懈褌械谢褜薪褘泄 URL',
+    examples: '袩褉懈屑械褉褘',
+    exampleOptions: {
+      json: '袩芯谐芯写邪 (JSON)',
+      yaml: '袟芯芯屑邪谐邪蟹懈薪 (YAML)',
+      blankTemplate: '袩褍褋褌芯泄 褕邪斜谢芯薪',
+    },
+    availableTools: {
+      title: '袛芯褋褌褍锌薪褘械 懈薪褋褌褉褍屑械薪褌褘',
+      name: '袧邪蟹胁邪薪懈械',
+      description: '袨锌懈褋邪薪懈械',
+      method: '袦械褌芯写',
+      path: '袩褍褌褜',
+      action: '袛械泄褋褌胁懈褟',
+      test: '孝械褋褌',
+    },
+    authMethod: {
+      title: '袦械褌芯写 邪胁褌芯褉懈蟹邪褑懈懈',
+      type: '孝懈锌 邪胁褌芯褉懈蟹邪褑懈懈',
+      keyTooltip: '袣谢褞褔 蟹邪谐芯谢芯胁泻邪 HTTP, 胁褘 屑芯卸械褌械 芯褋褌邪胁懈褌褜 械谐芯 泻邪泻 "Authorization", 械褋谢懈 薪械 蟹薪邪械褌械, 褔褌芯 褝褌芯 褌邪泻芯械, 懈谢懈 褍褋褌邪薪芯胁懈褌褜 械谐芯 薪邪 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯械 蟹薪邪褔械薪懈械',
+      types: {
+        none: '袧械褌',
+        api_key: '袣谢褞褔 API',
+        apiKeyPlaceholder: '袧邪蟹胁邪薪懈械 蟹邪谐芯谢芯胁泻邪 HTTP 写谢褟 泻谢褞褔邪 API',
+        apiValuePlaceholder: '袙胁械写懈褌械 泻谢褞褔 API',
+      },
+      key: '袣谢褞褔',
+      value: '袟薪邪褔械薪懈械',
+    },
+    authHeaderPrefix: {
+      title: '孝懈锌 邪胁褌芯褉懈蟹邪褑懈懈',
+      types: {
+        basic: '袘邪蟹芯胁褘泄',
+        bearer: 'Bearer',
+        custom: '袩芯谢褜蟹芯胁邪褌械谢褜褋泻懈泄',
+      },
+    },
+    privacyPolicy: '袩芯谢懈褌懈泻邪 泻芯薪褎懈写械薪褑懈邪谢褜薪芯褋褌懈',
+    privacyPolicyPlaceholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 锌芯谢懈褌懈泻褍 泻芯薪褎懈写械薪褑懈邪谢褜薪芯褋褌懈',
+    toolInput: {
+      title: '袙褏芯写薪褘械 写邪薪薪褘械 懈薪褋褌褉褍屑械薪褌邪',
+      name: '袧邪蟹胁邪薪懈械',
+      required: '袨斜褟蟹邪褌械谢褜薪芯',
+      method: '袦械褌芯写',
+      methodSetting: '袧邪褋褌褉芯泄泻邪',
+      methodSettingTip: '袩芯谢褜蟹芯胁邪褌械谢褜 蟹邪锌芯谢薪褟械褌 泻芯薪褎懈谐褍褉邪褑懈褞 懈薪褋褌褉褍屑械薪褌邪',
+      methodParameter: '袩邪褉邪屑械褌褉',
+      methodParameterTip: 'LLM 蟹邪锌芯谢薪褟械褌 胁芯 胁褉械屑褟 胁褘胁芯写邪',
+      label: '孝械谐懈',
+      labelPlaceholder: '袙褘斜械褉懈褌械 褌械谐懈 (薪械芯斜褟蟹邪褌械谢褜薪芯)',
+      description: '袨锌懈褋邪薪懈械',
+      descriptionPlaceholder: '袨锌懈褋邪薪懈械 蟹薪邪褔械薪懈褟 锌邪褉邪屑械褌褉邪',
+    },
+    customDisclaimer: '袩芯谢褜蟹芯胁邪褌械谢褜褋泻懈泄 芯褌泻邪蟹 芯褌 芯褌胁械褌褋褌胁械薪薪芯褋褌懈',
+    customDisclaimerPlaceholder: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 锌芯谢褜蟹芯胁邪褌械谢褜褋泻懈泄 芯褌泻邪蟹 芯褌 芯褌胁械褌褋褌胁械薪薪芯褋褌懈',
+    confirmTitle: '袩芯写褌胁械褉写懈褌褜 褋芯褏褉邪薪械薪懈械?',
+    confirmTip: '袩褉懈谢芯卸械薪懈褟, 懈褋锌芯谢褜蟹褍褞褖懈械 褝褌芯褌 懈薪褋褌褉褍屑械薪褌, 斜褍写褍褌 蟹邪褌褉芯薪褍褌褘',
+    deleteToolConfirmTitle: '校写邪谢懈褌褜 褝褌芯褌 懈薪褋褌褉褍屑械薪褌?',
+    deleteToolConfirmContent: '校写邪谢械薪懈械 懈薪褋褌褉褍屑械薪褌邪 薪械芯斜褉邪褌懈屑芯. 袩芯谢褜蟹芯胁邪褌械谢懈 斜芯谢褜褕械 薪械 褋屑芯谐褍褌 锌芯谢褍褔懈褌褜 写芯褋褌褍锌 泻 胁邪褕械屑褍 懈薪褋褌褉褍屑械薪褌褍.',
+  },
+  test: {
+    title: '孝械褋褌',
+    parametersValue: '袩邪褉邪屑械褌褉褘 懈 蟹薪邪褔械薪懈械',
+    parameters: '袩邪褉邪屑械褌褉褘',
+    value: '袟薪邪褔械薪懈械',
+    testResult: '袪械蟹褍谢褜褌邪褌褘 褌械褋褌邪',
+    testResultPlaceholder: '袪械蟹褍谢褜褌邪褌 褌械褋褌邪 斜褍写械褌 芯褌芯斜褉邪卸邪褌褜褋褟 蟹写械褋褜',
+  },
+  thought: {
+    using: '袠褋锌芯谢褜蟹芯胁邪薪懈械',
+    used: '袠褋锌芯谢褜蟹芯胁邪薪芯',
+    requestTitle: '袟邪锌褉芯褋 泻',
+    responseTitle: '袨褌胁械褌 芯褌',
+  },
+  setBuiltInTools: {
+    info: '袠薪褎芯褉屑邪褑懈褟',
+    setting: '袧邪褋褌褉芯泄泻邪',
+    toolDescription: '袨锌懈褋邪薪懈械 懈薪褋褌褉褍屑械薪褌邪',
+    parameters: '锌邪褉邪屑械褌褉褘',
+    string: '褋褌褉芯泻邪',
+    number: '褔懈褋谢芯',
+    required: '袨斜褟蟹邪褌械谢褜薪芯',
+    infoAndSetting: '袠薪褎芯褉屑邪褑懈褟 懈 薪邪褋褌褉芯泄泻懈',
+    file: '褎邪泄谢',
+  },
+  noCustomTool: {
+    title: '袧械褌 锌芯谢褜蟹芯胁邪褌械谢褜褋泻懈褏 懈薪褋褌褉褍屑械薪褌芯胁!',
+    content: '袛芯斜邪胁褜褌械 懈 褍锌褉邪胁谢褟泄褌械 褋胁芯懈屑懈 锌芯谢褜蟹芯胁邪褌械谢褜褋泻懈屑懈 懈薪褋褌褉褍屑械薪褌邪屑懈 蟹写械褋褜 写谢褟 褋芯蟹写邪薪懈褟 锌褉懈谢芯卸械薪懈泄 袠袠.',
+    createTool: '小芯蟹写邪褌褜 懈薪褋褌褉褍屑械薪褌',
+  },
+  noSearchRes: {
+    title: '袠蟹胁懈薪懈褌械, 褉械蟹褍谢褜褌邪褌褘 薪械 薪邪泄写械薪褘!',
+    content: '袦褘 薪械 褋屑芯谐谢懈 薪邪泄褌懈 薪懈泻邪泻懈褏 懈薪褋褌褉褍屑械薪褌芯胁, 褋芯芯褌胁械褌褋褌胁褍褞褖懈褏 胁邪褕械屑褍 锌芯懈褋泻褍.',
+    reset: '小斜褉芯褋懈褌褜 锌芯懈褋泻',
+  },
+  builtInPromptTitle: '袩芯写褋泻邪蟹泻邪',
+  toolRemoved: '袠薪褋褌褉褍屑械薪褌 褍写邪谢械薪',
+  notAuthorized: '袠薪褋褌褉褍屑械薪褌 薪械 邪胁褌芯褉懈蟹芯胁邪薪',
+  howToGet: '袣邪泻 锌芯谢褍褔懈褌褜',
+  openInStudio: '袨褌泻褉褘褌褜 胁 Studio',
+  toolNameUsageTip: '袧邪蟹胁邪薪懈械 胁褘蟹芯胁邪 懈薪褋褌褉褍屑械薪褌邪 写谢褟 褉邪褋褋褍卸写械薪懈泄 邪谐械薪褌邪 懈 锌芯写褋泻邪蟹芯泻',
+  copyToolName: '袣芯锌懈褉芯胁邪褌褜 懈屑褟',
+  noTools: '袠薪褋褌褉褍屑械薪褌褘 薪械 薪邪泄写械薪褘',
+}
+
+export default translation
diff --git a/i18n/ru-RU/workflow.ts b/i18n/ru-RU/workflow.ts
new file mode 100644
index 0000000..8a292ff
--- /dev/null
+++ b/i18n/ru-RU/workflow.ts
@@ -0,0 +1,921 @@
+const translation = {
+  common: {
+    undo: '袨褌屑械薪懈褌褜',
+    redo: '袩芯胁褌芯褉懈褌褜',
+    editing: '袪械写邪泻褌懈褉芯胁邪薪懈械',
+    autoSaved: '袗胁褌芯褋芯褏褉邪薪械薪芯',
+    unpublished: '袧械 芯锌褍斜谢懈泻芯胁邪薪芯',
+    published: '袨锌褍斜谢懈泻芯胁邪薪芯',
+    publish: '袨锌褍斜谢懈泻芯胁邪褌褜',
+    update: '袨斜薪芯胁懈褌褜',
+    run: '袟邪锌褍褋褌懈褌褜',
+    running: '袙褘锌芯谢薪褟械褌褋褟',
+    inRunMode: '袙 褉械卸懈屑械 胁褘锌芯谢薪械薪懈褟',
+    inPreview: '袙 褉械卸懈屑械 锌褉械写锌褉芯褋屑芯褌褉邪',
+    inPreviewMode: '袙 褉械卸懈屑械 锌褉械写锌褉芯褋屑芯褌褉邪',
+    preview: '袩褉械写锌褉芯褋屑芯褌褉',
+    viewRunHistory: '袩芯褋屑芯褌褉械褌褜 懈褋褌芯褉懈褞 蟹邪锌褍褋泻芯胁',
+    runHistory: '袠褋褌芯褉懈褟 蟹邪锌褍褋泻芯胁',
+    goBackToEdit: '袙械褉薪褍褌褜褋褟 泻 褉械写邪泻褌芯褉褍',
+    conversationLog: '袞褍褉薪邪谢 褉邪蟹谐芯胁芯褉芯胁',
+    features: '肖褍薪泻褑懈懈',
+    debugAndPreview: '袩褉械写锌褉芯褋屑芯褌褉',
+    restart: '袩械褉械蟹邪锌褍褋褌懈褌褜',
+    currentDraft: '孝械泻褍褖懈泄 褔械褉薪芯胁懈泻',
+    currentDraftUnpublished: '孝械泻褍褖懈泄 褔械褉薪芯胁懈泻 薪械 芯锌褍斜谢懈泻芯胁邪薪',
+    latestPublished: '袩芯褋谢械写薪褟褟 芯锌褍斜谢懈泻芯胁邪薪薪邪褟 胁械褉褋懈褟',
+    publishedAt: '袨锌褍斜谢懈泻芯胁邪薪芯',
+    restore: '袙芯褋褋褌邪薪芯胁懈褌褜',
+    runApp: '袟邪锌褍褋褌懈褌褜 锌褉懈谢芯卸械薪懈械',
+    batchRunApp: '袩邪泻械褌薪褘泄 蟹邪锌褍褋泻 锌褉懈谢芯卸械薪懈褟',
+    accessAPIReference: '袛芯褋褌褍锌 泻 褋锌褉邪胁芯褔薪懈泻褍 API',
+    embedIntoSite: '袙褋褌褉芯懈褌褜 薪邪 褋邪泄褌',
+    addTitle: '袛芯斜邪胁懈褌褜 蟹邪谐芯谢芯胁芯泻...',
+    addDescription: '袛芯斜邪胁懈褌褜 芯锌懈褋邪薪懈械...',
+    noVar: '袧械褌 锌械褉械屑械薪薪芯泄',
+    searchVar: '袩芯懈褋泻 锌械褉械屑械薪薪芯泄',
+    variableNamePlaceholder: '袠屑褟 锌械褉械屑械薪薪芯泄',
+    setVarValuePlaceholder: '校褋褌邪薪芯胁懈褌褜 蟹薪邪褔械薪懈械 锌械褉械屑械薪薪芯泄',
+    needConnectTip: '协褌芯褌 褕邪谐 薪懈 泻 褔械屑褍 薪械 锌芯写泻谢褞褔械薪',
+    maxTreeDepth: '袦邪泻褋懈屑邪谢褜薪褘泄 锌褉械写械谢 {{depth}} 褍蟹谢芯胁 薪邪 胁械褌泻褍',
+    needEndNode: '袧械芯斜褏芯写懈屑芯 写芯斜邪胁懈褌褜 斜谢芯泻 "袣芯薪械褑"',
+    needAnswerNode: '袧械芯斜褏芯写懈屑芯 写芯斜邪胁懈褌褜 斜谢芯泻 "袨褌胁械褌"',
+    workflowProcess: '袩褉芯褑械褋褋 褉邪斜芯褔械谐芯 锌褉芯褑械褋褋邪',
+    notRunning: '袝褖械 薪械 蟹邪锌褍褖械薪芯',
+    previewPlaceholder: '袙胁械写懈褌械 褌械泻褋褌 胁 锌芯谢械 薪懈卸械, 褔褌芯斜褘 薪邪褔邪褌褜 芯褌谢邪写泻褍 褔邪褌-斜芯褌邪',
+    effectVarConfirm: {
+      title: '校写邪谢懈褌褜 锌械褉械屑械薪薪褍褞',
+      content: '袩械褉械屑械薪薪邪褟 懈褋锌芯谢褜蟹褍械褌褋褟 胁 写褉褍谐懈褏 褍蟹谢邪褏. 袙褘 胁褋械 械褖械 褏芯褌懈褌械 褍写邪谢懈褌褜 械械?',
+    },
+    insertVarTip: '袧邪卸屑懈褌械 泻谢邪胁懈褕褍 "/" 褔褌芯斜褘 斜褘褋褌褉芯 胁褋褌邪胁懈褌褜',
+    processData: '袨斜褉邪斜芯褌泻邪 写邪薪薪褘褏',
+    input: '袙褏芯写',
+    output: '袙褘褏芯写',
+    jinjaEditorPlaceholder: '袙胁械写懈褌械 "/" 懈谢懈 "{" 写谢褟 胁褋褌邪胁泻懈 锌械褉械屑械薪薪芯泄',
+    viewOnly: '孝芯谢褜泻芯 锌褉芯褋屑芯褌褉',
+    showRunHistory: '袩芯泻邪蟹邪褌褜 懈褋褌芯褉懈褞 蟹邪锌褍褋泻芯胁',
+    enableJinja: '袙泻谢褞褔懈褌褜 锌芯写写械褉卸泻褍 褕邪斜谢芯薪芯胁 Jinja',
+    learnMore: '校蟹薪邪褌褜 斜芯谢褜褕械',
+    copy: '袣芯锌懈褉芯胁邪褌褜',
+    duplicate: '袛褍斜谢懈褉芯胁邪褌褜',
+    addBlock: '袛芯斜邪胁懈褌褜 斜谢芯泻',
+    pasteHere: '袙褋褌邪胁懈褌褜 褋褞写邪',
+    pointerMode: '袪械卸懈屑 褍泻邪蟹邪褌械谢褟',
+    handMode: '袪械卸懈屑 褉褍泻懈',
+    model: '袦芯写械谢褜',
+    workflowAsTool: '袪邪斜芯褔懈泄 锌褉芯褑械褋褋 泻邪泻 懈薪褋褌褉褍屑械薪褌',
+    configureRequired: '孝褉械斜褍械褌褋褟 薪邪褋褌褉芯泄泻邪',
+    configure: '袧邪褋褌褉芯懈褌褜',
+    manageInTools: '校锌褉邪胁谢械薪懈械 胁 懈薪褋褌褉褍屑械薪褌邪褏',
+    workflowAsToolTip: '袩芯褋谢械 芯斜薪芯胁谢械薪懈褟 褉邪斜芯褔械谐芯 锌褉芯褑械褋褋邪 褌褉械斜褍械褌褋褟 锌械褉械薪邪褋褌褉芯泄泻邪 懈薪褋褌褉褍屑械薪褌邪.',
+    viewDetailInTracingPanel: '袩芯褋屑芯褌褉械褌褜 锌芯写褉芯斜薪芯褋褌懈',
+    syncingData: '小懈薪褏褉芯薪懈蟹邪褑懈褟 写邪薪薪褘褏, 胁褋械谐芯 薪械褋泻芯谢褜泻芯 褋械泻褍薪写.',
+    importDSL: '袠屑锌芯褉褌懈褉芯胁邪褌褜 DSL',
+    importDSLTip: '孝械泻褍褖懈泄 褔械褉薪芯胁懈泻 斜褍写械褌 锌械褉械蟹邪锌懈褋邪薪. 协泻褋锌芯褉褌懈褉褍泄褌械 褉邪斜芯褔懈泄 锌褉芯褑械褋褋 胁 泻邪褔械褋褌胁械 褉械蟹械褉胁薪芯泄 泻芯锌懈懈 锌械褉械写 懈屑锌芯褉褌芯屑.',
+    backupCurrentDraft: '袪械蟹械褉胁薪芯械 泻芯锌懈褉芯胁邪薪懈械 褌械泻褍褖械谐芯 褔械褉薪芯胁懈泻邪',
+    chooseDSL: '袙褘斜械褉懈褌械 褎邪泄谢 DSL(yml)',
+    overwriteAndImport: '袩械褉械蟹邪锌懈褋邪褌褜 懈 懈屑锌芯褉褌懈褉芯胁邪褌褜',
+    importFailure: '袨褕懈斜泻邪 懈屑锌芯褉褌邪',
+    importSuccess: '袠屑锌芯褉褌 褍褋锌械褕薪芯 蟹邪胁械褉褕械薪',
+    parallelTip: {
+      click: {
+        title: '些械谢褔芯泻',
+        desc: '写芯斜邪胁懈褌褜',
+      },
+      drag: {
+        title: '袙芯谢芯褔懈褌褜',
+        desc: '写谢褟 锌芯写泻谢褞褔械薪懈褟',
+      },
+      limit: '袩邪褉邪谢谢械谢懈蟹屑 芯谐褉邪薪懈褔械薪 胁械褌胁褟屑懈 {{num}}.',
+      depthLimit: '袨谐褉邪薪懈褔械薪懈械 薪邪 泻芯谢懈褔械褋褌胁芯 褋谢芯械胁 锌邪褉邪谢谢械谢褜薪芯泄 胁谢芯卸械薪薪芯褋褌懈 {{num}}',
+    },
+    parallelRun: '袩邪褉邪谢谢械谢褜薪褘泄 锌褉芯谐芯薪',
+    disconnect: '袪邪蟹褗械写懈薪褟褌褜',
+    jumpToNode: '袩械褉械泄褌懈 泻 褝褌芯屑褍 褍蟹谢褍',
+    addParallelNode: '袛芯斜邪胁懈褌褜 锌邪褉邪谢谢械谢褜薪褘泄 褍蟹械谢',
+    parallel: '袩袗袪袗袥袥袝袥鞋袧蝎袡',
+    branch: '袙袝孝袣袗',
+    featuresDocLink: '袩芯写褉芯斜薪械械',
+    fileUploadTip: '肖褍薪泻褑懈懈 蟹邪谐褉褍蟹泻懈 懈蟹芯斜褉邪卸械薪懈泄 斜褘谢懈 芯斜薪芯胁谢械薪褘 写芯 蟹邪谐褉褍蟹泻懈 褎邪泄谢芯胁.',
+    featuresDescription: '校谢褍褔褕械薪懈械 胁蟹邪懈屑芯写械泄褋褌胁懈褟 褋 锌芯谢褜蟹芯胁邪褌械谢械屑 胁械斜-锌褉懈谢芯卸械薪懈褟',
+    ImageUploadLegacyTip: '孝械锌械褉褜 胁褘 屑芯卸械褌械 褋芯蟹写邪胁邪褌褜 锌械褉械屑械薪薪褘械 褌懈锌邪 褎邪泄谢邪 胁 褋褌邪褉褌芯胁芯泄 褎芯褉屑械. 袙 斜褍写褍褖械屑 屑褘 斜芯谢褜褕械 薪械 斜褍写械屑 锌芯写写械褉卸懈胁邪褌褜 褎褍薪泻褑懈褞 蟹邪谐褉褍蟹泻懈 懈蟹芯斜褉邪卸械薪懈泄.',
+    importWarning: '袨褋褌芯褉芯卸薪芯褋褌褜',
+    importWarningDetails: '袪邪蟹薪懈褑邪 胁 胁械褉褋懈懈 DSL 屑芯卸械褌 锌芯胁谢懈褟褌褜 薪邪 薪械泻芯褌芯褉褘械 褎褍薪泻褑懈懈',
+    openInExplore: '袨褌泻褉褘褌褜 胁 褉邪蟹写械谢械 芦袨斜蟹芯褉禄',
+    onFailure: '袨 薪械褍写邪褔械',
+    addFailureBranch: '袛芯斜邪胁懈褌褜 胁械褌胁褜 Fail',
+    noHistory: '袘械蟹 懈褋褌芯褉懈懈',
+    loadMore: '袟邪谐褉褍蟹懈褌械 斜芯谢褜褕械 褉邪斜芯褔懈褏 锌褉芯褑械褋褋芯胁',
+    noExist: '孝邪泻芯泄 锌械褉械屑械薪薪芯泄 薪械 褋褍褖械褋褌胁褍械褌',
+    versionHistory: '袠褋褌芯褉懈褟 胁械褉褋懈泄',
+    exportPNG: '协泻褋锌芯褉褌懈褉芯胁邪褌褜 泻邪泻 PNG',
+    exportImage: '协泻褋锌芯褉褌懈褉芯胁邪褌褜 懈蟹芯斜褉邪卸械薪懈械',
+    exportJPEG: '协泻褋锌芯褉褌懈褉芯胁邪褌褜 泻邪泻 JPEG',
+    referenceVar: '小褋褘谢芯褔薪邪褟 锌械褉械屑械薪薪邪褟',
+    exitVersions: '袙褘褏芯写薪褘械 胁械褉褋懈懈',
+    exportSVG: '协泻褋锌芯褉褌懈褉芯胁邪褌褜 泻邪泻 SVG',
+    publishUpdate: '袨锌褍斜谢懈泻芯胁邪褌褜 芯斜薪芯胁谢械薪懈械',
+  },
+  env: {
+    envPanelTitle: '袩械褉械屑械薪薪褘械 褋褉械写褘',
+    envDescription: '袩械褉械屑械薪薪褘械 褋褉械写褘 屑芯谐褍褌 懈褋锌芯谢褜蟹芯胁邪褌褜褋褟 写谢褟 褏褉邪薪械薪懈褟 泻芯薪褎懈写械薪褑懈邪谢褜薪芯泄 懈薪褎芯褉屑邪褑懈懈 懈 褍褔械褌薪褘褏 写邪薪薪褘褏. 袨薪懈 写芯褋褌褍锌薪褘 褌芯谢褜泻芯 写谢褟 褔褌械薪懈褟 懈 屑芯谐褍褌 斜褘褌褜 芯褌写械谢械薪褘 芯褌 褎邪泄谢邪 DSL 胁芯 胁褉械屑褟 褝泻褋锌芯褉褌邪.',
+    envPanelButton: '袛芯斜邪胁懈褌褜 锌械褉械屑械薪薪褍褞',
+    modal: {
+      title: '袛芯斜邪胁懈褌褜 锌械褉械屑械薪薪褍褞 褋褉械写褘',
+      editTitle: '袪械写邪泻褌懈褉芯胁邪褌褜 锌械褉械屑械薪薪褍褞 褋褉械写褘',
+      type: '孝懈锌',
+      name: '袠屑褟',
+      namePlaceholder: '袠屑褟 锌械褉械屑械薪薪芯泄 褋褉械写褘',
+      value: '袟薪邪褔械薪懈械',
+      valuePlaceholder: '袟薪邪褔械薪懈械 锌械褉械屑械薪薪芯泄 褋褉械写褘',
+      secretTip: '袠褋锌芯谢褜蟹褍械褌褋褟 写谢褟 芯锌褉械写械谢械薪懈褟 泻芯薪褎懈写械薪褑懈邪谢褜薪芯泄 懈薪褎芯褉屑邪褑懈懈 懈谢懈 写邪薪薪褘褏, 褋 薪邪褋褌褉芯泄泻邪屑懈 DSL, 薪邪褋褌褉芯械薪薪褘屑懈 写谢褟 锌褉械写芯褌胁褉邪褖械薪懈褟 褍褌械褔泻懈.',
+    },
+    export: {
+      title: '协泻褋锌芯褉褌懈褉芯胁邪褌褜 褋械泻褉械褌薪褘械 锌械褉械屑械薪薪褘械 褋褉械写褘?',
+      checkbox: '协泻褋锌芯褉褌懈褉芯胁邪褌褜 褋械泻褉械褌薪褘械 蟹薪邪褔械薪懈褟',
+      ignore: '协泻褋锌芯褉褌懈褉芯胁邪褌褜 DSL',
+      export: '协泻褋锌芯褉褌懈褉芯胁邪褌褜 DSL 褋 褋械泻褉械褌薪褘屑懈 蟹薪邪褔械薪懈褟屑懈 ',
+    },
+  },
+  chatVariable: {
+    panelTitle: '袩械褉械屑械薪薪褘械 褉邪蟹谐芯胁芯褉邪',
+    panelDescription: '袩械褉械屑械薪薪褘械 褉邪蟹谐芯胁芯褉邪 懈褋锌芯谢褜蟹褍褞褌褋褟 写谢褟 褏褉邪薪械薪懈褟 懈薪褌械褉邪泻褌懈胁薪芯泄 懈薪褎芯褉屑邪褑懈懈, 泻芯褌芯褉褍褞 LLM 薪械芯斜褏芯写懈屑芯 蟹邪锌芯屑薪懈褌褜, 胁泻谢褞褔邪褟 懈褋褌芯褉懈褞 褉邪蟹谐芯胁芯褉芯胁, 蟹邪谐褉褍卸械薪薪褘械 褎邪泄谢褘, 锌芯谢褜蟹芯胁邪褌械谢褜褋泻懈械 薪邪褋褌褉芯泄泻懈. 袨薪懈 写芯褋褌褍锌薪褘 写谢褟 褔褌械薪懈褟 懈 蟹邪锌懈褋懈. ',
+    docLink: '袩芯褋械褌懈褌械 薪邪褕褍 写芯泻褍屑械薪褌邪褑懈褞, 褔褌芯斜褘 褍蟹薪邪褌褜 斜芯谢褜褕械.',
+    button: '袛芯斜邪胁懈褌褜 锌械褉械屑械薪薪褍褞',
+    modal: {
+      title: '袛芯斜邪胁懈褌褜 锌械褉械屑械薪薪褍褞 褉邪蟹谐芯胁芯褉邪',
+      editTitle: '袪械写邪泻褌懈褉芯胁邪褌褜 锌械褉械屑械薪薪褍褞 褉邪蟹谐芯胁芯褉邪',
+      name: '袠屑褟',
+      namePlaceholder: '袠屑褟 锌械褉械屑械薪薪芯泄',
+      type: '孝懈锌',
+      value: '袟薪邪褔械薪懈械 锌芯 褍屑芯谢褔邪薪懈褞',
+      valuePlaceholder: '袟薪邪褔械薪懈械 锌芯 褍屑芯谢褔邪薪懈褞, 芯褋褌邪胁褜褌械 锌褍褋褌褘屑, 褔褌芯斜褘 薪械 褍褋褌邪薪邪胁谢懈胁邪褌褜',
+      description: '袨锌懈褋邪薪懈械',
+      descriptionPlaceholder: '袨锌懈褕懈褌械 锌械褉械屑械薪薪褍褞',
+      editInJSON: '袪械写邪泻褌懈褉芯胁邪褌褜 胁 JSON',
+      oneByOne: '袛芯斜邪胁谢褟褌褜 锌芯 芯写薪芯屑褍',
+      editInForm: '袪械写邪泻褌懈褉芯胁邪褌褜 胁 褎芯褉屑械',
+      arrayValue: '袟薪邪褔械薪懈械',
+      addArrayValue: '袛芯斜邪胁懈褌褜 蟹薪邪褔械薪懈械',
+      objectKey: '袣谢褞褔',
+      objectType: '孝懈锌',
+      objectValue: '袟薪邪褔械薪懈械 锌芯 褍屑芯谢褔邪薪懈褞',
+    },
+    storedContent: '小芯褏褉邪薪械薪薪褘泄 泻芯薪褌械薪褌',
+    updatedAt: '袨斜薪芯胁谢械薪芯 胁 ',
+  },
+  changeHistory: {
+    title: '袠褋褌芯褉懈褟 懈蟹屑械薪械薪懈泄',
+    placeholder: '袙褘 械褖械 薪懈褔械谐芯 薪械 懈蟹屑械薪懈谢懈',
+    clearHistory: '袨褔懈褋褌懈褌褜 懈褋褌芯褉懈褞',
+    hint: '袩芯写褋泻邪蟹泻邪',
+    hintText: '袙邪褕懈 写械泄褋褌胁懈褟 锌芯 褉械写邪泻褌懈褉芯胁邪薪懈褞 芯褌褋谢械卸懈胁邪褞褌褋褟 胁 懈褋褌芯褉懈懈 懈蟹屑械薪械薪懈泄, 泻芯褌芯褉邪褟 褏褉邪薪懈褌褋褟 薪邪 胁邪褕械屑 褍褋褌褉芯泄褋褌胁械 胁 褌械褔械薪懈械 褝褌芯谐芯 褋械邪薪褋邪. 协褌邪 懈褋褌芯褉懈褟 斜褍写械褌 芯褔懈褖械薪邪, 泻芯谐写邪 胁褘 锌芯泻懈薪械褌械 褉械写邪泻褌芯褉.',
+    stepBackward_one: '{{count}} 褕邪谐 薪邪蟹邪写',
+    stepBackward_other: '{{count}} 褕邪谐芯胁 薪邪蟹邪写',
+    stepForward_one: '{{count}} 褕邪谐 胁锌械褉械写',
+    stepForward_other: '{{count}} 褕邪谐芯胁 胁锌械褉械写',
+    sessionStart: '袧邪褔邪谢芯 褋械邪薪褋邪',
+    currentState: '孝械泻褍褖械械 褋芯褋褌芯褟薪懈械',
+    nodeTitleChange: '袠蟹屑械薪械薪芯 薪邪蟹胁邪薪懈械 斜谢芯泻邪',
+    nodeDescriptionChange: '袠蟹屑械薪械薪芯 芯锌懈褋邪薪懈械 斜谢芯泻邪',
+    nodeDragStop: '袘谢芯泻 锌械褉械屑械褖械薪',
+    nodeChange: '袘谢芯泻 懈蟹屑械薪械薪',
+    nodeConnect: '袘谢芯泻 锌芯写泻谢褞褔械薪',
+    nodePaste: '袘谢芯泻 胁褋褌邪胁谢械薪',
+    nodeDelete: '袘谢芯泻 褍写邪谢械薪',
+    nodeAdd: '袘谢芯泻 写芯斜邪胁谢械薪',
+    nodeResize: '袪邪蟹屑械褉 斜谢芯泻邪 懈蟹屑械薪械薪',
+    noteAdd: '袟邪屑械褌泻邪 写芯斜邪胁谢械薪邪',
+    noteChange: '袟邪屑械褌泻邪 懈蟹屑械薪械薪邪',
+    noteDelete: '袟邪屑械褌泻邪 褍写邪谢械薪邪',
+    edgeDelete: '袘谢芯泻 芯褌泻谢褞褔械薪',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 芯斜褟蟹邪褌械谢褜薪芯 写谢褟 蟹邪锌芯谢薪械薪懈褟',
+    authRequired: '孝褉械斜褍械褌褋褟 邪胁褌芯褉懈蟹邪褑懈褟',
+    invalidJson: '{{field}} 薪械胁械褉薪褘泄 JSON',
+    fields: {
+      variable: '袠屑褟 锌械褉械屑械薪薪芯泄',
+      variableValue: '袟薪邪褔械薪懈械 锌械褉械屑械薪薪芯泄',
+      code: '袣芯写',
+      model: '袦芯写械谢褜',
+      rerankModel: '袦芯写械谢褜 锌械褉械褉邪薪卸懈褉芯胁邪薪懈褟',
+      visionVariable: '袩械褉械屑械薪薪邪褟 蟹褉械薪懈褟',
+    },
+    invalidVariable: '袧械胁械褉薪邪褟 锌械褉械屑械薪薪邪褟',
+    rerankModelRequired: '袩械褉械写 胁泻谢褞褔械薪懈械屑 屑芯写械谢懈 锌芯胁褌芯褉薪芯谐芯 褉邪薪卸懈褉芯胁邪薪懈褟 褍斜械写懈褌械褋褜, 褔褌芯 屑芯写械谢褜 褍褋锌械褕薪芯 薪邪褋褌褉芯械薪邪 胁 薪邪褋褌褉芯泄泻邪褏.',
+    noValidTool: '{{field}} 薪械 胁褘斜褉邪薪 胁邪谢懈写薪褘泄 懈薪褋褌褉褍屑械薪褌',
+    toolParameterRequired: '{{field}}: 锌邪褉邪屑械褌褉 [{{param}}] 褟胁谢褟械褌褋褟 芯斜褟蟹邪褌械谢褜薪褘屑',
+  },
+  singleRun: {
+    testRun: '孝械褋褌芯胁褘泄 蟹邪锌褍褋泻 ',
+    startRun: '袧邪褔邪褌褜 蟹邪锌褍褋泻',
+    running: '袙褘锌芯谢薪褟械褌褋褟',
+    testRunIteration: '袠褌械褉邪褑懈褟 褌械褋褌芯胁芯谐芯 蟹邪锌褍褋泻邪',
+    back: '袧邪蟹邪写',
+    iteration: '袠褌械褉邪褑懈褟',
+    loop: '笑懈泻谢',
+  },
+  tabs: {
+    'searchBlock': '袩芯懈褋泻 斜谢芯泻邪',
+    'blocks': '袘谢芯泻懈',
+    'searchTool': '袩芯懈褋泻 懈薪褋褌褉褍屑械薪褌邪',
+    'tools': '袠薪褋褌褉褍屑械薪褌褘',
+    'allTool': '袙褋械',
+    'builtInTool': '袙褋褌褉芯械薪薪褘械',
+    'customTool': '袩芯谢褜蟹芯胁邪褌械谢褜褋泻懈械',
+    'workflowTool': '袪邪斜芯褔懈泄 锌褉芯褑械褋褋',
+    'question-understand': '袩芯薪懈屑邪薪懈械 胁芯锌褉芯褋邪',
+    'logic': '袥芯谐懈泻邪',
+    'transform': '袩褉械芯斜褉邪蟹芯胁邪薪懈械',
+    'utilities': '校褌懈谢懈褌褘',
+    'noResult': '袧懈褔械谐芯 薪械 薪邪泄写械薪芯',
+    'plugin': '袩谢邪谐懈薪',
+    'agent': '袗谐械薪褌褋泻邪褟 褋褌褉邪褌械谐懈褟',
+  },
+  blocks: {
+    'start': '袧邪褔邪谢芯',
+    'end': '袣芯薪械褑',
+    'answer': '袨褌胁械褌',
+    'llm': 'LLM',
+    'knowledge-retrieval': '袩芯懈褋泻 蟹薪邪薪懈泄',
+    'question-classifier': '袣谢邪褋褋懈褎懈泻邪褌芯褉 胁芯锌褉芯褋芯胁',
+    'if-else': '袝小袥袠/袠袧袗效袝',
+    'code': '袣芯写',
+    'template-transform': '楔邪斜谢芯薪',
+    'http-request': 'HTTP-蟹邪锌褉芯褋',
+    'variable-assigner': '袗谐褉械谐邪褌芯褉 锌械褉械屑械薪薪褘褏',
+    'variable-aggregator': '袗谐褉械谐邪褌芯褉 锌械褉械屑械薪薪褘褏',
+    'assigner': '袧邪蟹薪邪褔械薪懈械 锌械褉械屑械薪薪芯泄',
+    'iteration-start': '袧邪褔邪谢芯 懈褌械褉邪褑懈懈',
+    'iteration': '袠褌械褉邪褑懈褟',
+    'parameter-extractor': '袠蟹胁谢械褔械薪懈械 锌邪褉邪屑械褌褉芯胁',
+    'document-extractor': '协泻褋褌褉邪泻褌芯褉 写芯泻褍屑械薪褌芯胁',
+    'list-operator': '袨锌械褉邪褌芯褉 褋锌懈褋泻邪',
+    'agent': '袗谐械薪褌',
+    'loop': '笑懈泻谢',
+    'loop-start': '袧邪褔邪谢芯 褑懈泻谢邪',
+    'loop-end': '袙褘泄褌懈 懈蟹 褑懈泻谢邪',
+  },
+  blocksAbout: {
+    'start': '袨锌褉械写械谢懈褌械 薪邪褔邪谢褜薪褘械 锌邪褉邪屑械褌褉褘 写谢褟 蟹邪锌褍褋泻邪 褉邪斜芯褔械谐芯 锌褉芯褑械褋褋邪',
+    'end': '袨锌褉械写械谢懈褌械 泻芯薪械褑 懈 褌懈锌 褉械蟹褍谢褜褌邪褌邪 褉邪斜芯褔械谐芯 锌褉芯褑械褋褋邪',
+    'answer': '袨锌褉械写械谢懈褌械 褋芯写械褉卸懈屑芯械 芯褌胁械褌邪 胁 褔邪褌械',
+    'llm': '袙褘蟹芯胁 斜芯谢褜褕懈褏 褟蟹褘泻芯胁褘褏 屑芯写械谢械泄 写谢褟 芯褌胁械褌邪 薪邪 胁芯锌褉芯褋褘 懈谢懈 芯斜褉邪斜芯褌泻懈 械褋褌械褋褌胁械薪薪芯谐芯 褟蟹褘泻邪',
+    'knowledge-retrieval': '袩芯蟹胁芯谢褟械褌 蟹邪锌褉邪褕懈胁邪褌褜 褌械泻褋褌芯胁褘泄 泻芯薪褌械薪褌, 褋胁褟蟹邪薪薪褘泄 褋 胁芯锌褉芯褋邪屑懈 锌芯谢褜蟹芯胁邪褌械谢械泄, 懈蟹 斜邪蟹褘 蟹薪邪薪懈泄',
+    'question-classifier': '袨锌褉械写械谢懈褌械 褍褋谢芯胁懈褟 泻谢邪褋褋懈褎懈泻邪褑懈懈 胁芯锌褉芯褋芯胁 锌芯谢褜蟹芯胁邪褌械谢械泄, LLM 屑芯卸械褌 芯锌褉械写械谢懈褌褜, 泻邪泻 斜褍写械褌 褉邪蟹胁懈胁邪褌褜褋褟 褉邪蟹谐芯胁芯褉 薪邪 芯褋薪芯胁械 芯锌懈褋邪薪懈褟 泻谢邪褋褋懈褎懈泻邪褑懈懈',
+    'if-else': '袩芯蟹胁芯谢褟械褌 褉邪蟹写械谢懈褌褜 褉邪斜芯褔懈泄 锌褉芯褑械褋褋 薪邪 写胁械 胁械褌泻懈 薪邪 芯褋薪芯胁械 褍褋谢芯胁懈泄 if/else',
+    'code': '袙褘锌芯谢薪懈褌械 褎褉邪谐屑械薪褌 泻芯写邪 Python 懈谢懈 NodeJS 写谢褟 褉械邪谢懈蟹邪褑懈懈 锌芯谢褜蟹芯胁邪褌械谢褜褋泻芯泄 谢芯谐懈泻懈',
+    'template-transform': '袩褉械芯斜褉邪蟹芯胁邪薪懈械 写邪薪薪褘褏 胁 褋褌褉芯泻褍 褋 懈褋锌芯谢褜蟹芯胁邪薪懈械屑 褋懈薪褌邪泻褋懈褋邪 褕邪斜谢芯薪芯胁 Jinja',
+    'http-request': '袪邪蟹褉械褕懈褌褜 芯褌锌褉邪胁泻褍 蟹邪锌褉芯褋芯胁 薪邪 褋械褉胁械褉 锌芯 锌褉芯褌芯泻芯谢褍 HTTP',
+    'variable-assigner': '袨斜褗械写懈薪械薪懈械 锌械褉械屑械薪薪褘褏 懈蟹 薪械褋泻芯谢褜泻懈褏 胁械褌胁械泄 胁 芯写薪褍 锌械褉械屑械薪薪褍褞 写谢褟 褍薪懈褎懈褑懈褉芯胁邪薪薪芯泄 薪邪褋褌褉芯泄泻懈 锌芯写褔懈薪械薪薪褘褏 褍蟹谢芯胁.',
+    'assigner': '校蟹械谢 薪邪蟹薪邪褔械薪懈褟 锌械褉械屑械薪薪芯泄 懈褋锌芯谢褜蟹褍械褌褋褟 写谢褟 薪邪蟹薪邪褔械薪懈褟 蟹薪邪褔械薪懈泄 蟹邪锌懈褋褘胁邪械屑褘屑 锌械褉械屑械薪薪褘屑 (薪邪锌褉懈屑械褉, 锌械褉械屑械薪薪褘屑 褉邪蟹谐芯胁芯褉邪).',
+    'variable-aggregator': '袨斜褗械写懈薪械薪懈械 锌械褉械屑械薪薪褘褏 懈蟹 薪械褋泻芯谢褜泻懈褏 胁械褌胁械泄 胁 芯写薪褍 锌械褉械屑械薪薪褍褞 写谢褟 褍薪懈褎懈褑懈褉芯胁邪薪薪芯泄 薪邪褋褌褉芯泄泻懈 锌芯写褔懈薪械薪薪褘褏 褍蟹谢芯胁.',
+    'iteration': '袙褘锌芯谢薪械薪懈械 薪械褋泻芯谢褜泻懈褏 褕邪谐芯胁 薪邪写 芯斜褗械泻褌芯屑 褋锌懈褋泻邪 写芯 褌械褏 锌芯褉, 锌芯泻邪 薪械 斜褍写褍褌 胁褘胁械写械薪褘 胁褋械 褉械蟹褍谢褜褌邪褌褘.',
+    'parameter-extractor': '袠褋锌芯谢褜蟹褍泄褌械 LLM 写谢褟 懈蟹胁谢械褔械薪懈褟 褋褌褉褍泻褌褍褉懈褉芯胁邪薪薪褘褏 锌邪褉邪屑械褌褉芯胁 懈蟹 械褋褌械褋褌胁械薪薪芯谐芯 褟蟹褘泻邪 写谢褟 胁褘蟹芯胁邪 懈薪褋褌褉褍屑械薪褌芯胁 懈谢懈 HTTP-蟹邪锌褉芯褋芯胁.',
+    'list-operator': '袠褋锌芯谢褜蟹褍械褌褋褟 写谢褟 褎懈谢褜褌褉邪褑懈懈 懈谢懈 褋芯褉褌懈褉芯胁泻懈 褋芯写械褉卸懈屑芯谐芯 屑邪褋褋懈胁邪.',
+    'document-extractor': '袠褋锌芯谢褜蟹褍械褌褋褟 写谢褟 褉邪蟹斜芯褉邪 蟹邪谐褉褍卸械薪薪褘褏 写芯泻褍屑械薪褌芯胁 胁 褌械泻褋褌芯胁褘泄 泻芯薪褌械薪褌, 泻芯褌芯褉褘泄 谢械谐泻芯 胁芯褋锌褉懈薪懈屑邪械褌褋褟 LLM.',
+    'agent': '袙褘蟹芯胁 斜芯谢褜褕懈褏 褟蟹褘泻芯胁褘褏 屑芯写械谢械泄 写谢褟 芯褌胁械褌邪 薪邪 胁芯锌褉芯褋褘 懈谢懈 芯斜褉邪斜芯褌泻懈 械褋褌械褋褌胁械薪薪芯谐芯 褟蟹褘泻邪',
+    'loop-end': '协泻胁懈胁邪谢械薪褌薪芯 "break". 协褌芯褌 褍蟹械谢 薪械 懈屑械械褌 泻芯薪褎懈谐褍褉邪褑懈芯薪薪褘褏 褝谢械屑械薪褌芯胁. 袣芯谐写邪 褌械谢芯 褑懈泻谢邪 写芯褋褌懈谐邪械褌 褝褌芯谐芯 褍蟹谢邪, 褑懈泻谢 蟹邪胁械褉褕邪械褌褋褟.',
+    'loop': '袙褘锌芯谢薪懈褌械 褑懈泻谢 谢芯谐懈泻懈 写芯 褌械褏 锌芯褉, 锌芯泻邪 薪械 斜褍写械褌 写芯褋褌懈谐薪褍褌芯 褍褋谢芯胁懈械 蟹邪胁械褉褕械薪懈褟 懈谢懈 屑邪泻褋懈屑邪谢褜薪芯械 泻芯谢懈褔械褋褌胁芯 懈褌械褉邪褑懈泄 褑懈泻谢邪.',
+  },
+  operator: {
+    zoomIn: '校胁械谢懈褔懈褌褜',
+    zoomOut: '校屑械薪褜褕懈褌褜',
+    zoomTo50: '袦邪褋褕褌邪斜 50%',
+    zoomTo100: '袦邪褋褕褌邪斜 100%',
+    zoomToFit: '袩芯 褉邪蟹屑械褉褍',
+  },
+  panel: {
+    userInputField: '袩芯谢械 胁胁芯写邪 锌芯谢褜蟹芯胁邪褌械谢褟',
+    changeBlock: '袠蟹屑械薪懈褌褜 斜谢芯泻',
+    helpLink: '小褋褘谢泻邪 薪邪 褋锌褉邪胁泻褍',
+    about: '袨 锌褉芯谐褉邪屑屑械',
+    createdBy: '小芯蟹写邪薪芯 ',
+    nextStep: '小谢械写褍褞褖懈泄 褕邪谐',
+    addNextStep: '袛芯斜邪胁懈褌褜 褋谢械写褍褞褖懈泄 斜谢芯泻 胁 褝褌芯褌 褉邪斜芯褔懈泄 锌褉芯褑械褋褋',
+    selectNextStep: '袙褘斜褉邪褌褜 褋谢械写褍褞褖懈泄 斜谢芯泻',
+    runThisStep: '袙褘锌芯谢薪懈褌褜 褝褌芯褌 褕邪谐',
+    checklist: '袣芯薪褌褉芯谢褜薪褘泄 褋锌懈褋芯泻',
+    checklistTip: '校斜械写懈褌械褋褜, 褔褌芯 胁褋械 锌褉芯斜谢械屑褘 褉械褕械薪褘 锌械褉械写 锌褍斜谢懈泻邪褑懈械泄',
+    checklistResolved: '袙褋械 锌褉芯斜谢械屑褘 褉械褕械薪褘',
+    organizeBlocks: '袨褉谐邪薪懈蟹芯胁邪褌褜 斜谢芯泻懈',
+    change: '袠蟹屑械薪懈褌褜',
+    optional: '(薪械芯斜褟蟹邪褌械谢褜薪芯)',
+  },
+  nodes: {
+    common: {
+      outputVars: '袙褘褏芯写薪褘械 锌械褉械屑械薪薪褘械',
+      insertVarTip: '袙褋褌邪胁懈褌褜 锌械褉械屑械薪薪褍褞',
+      memory: {
+        memory: '袩邪屑褟褌褜',
+        memoryTip: '袧邪褋褌褉芯泄泻懈 锌邪屑褟褌懈 褔邪褌邪',
+        windowSize: '袪邪蟹屑械褉 芯泻薪邪',
+        conversationRoleName: '袠屑褟 褉芯谢懈 褉邪蟹谐芯胁芯褉邪',
+        user: '袩褉械褎懈泻褋 锌芯谢褜蟹芯胁邪褌械谢褟',
+        assistant: '袩褉械褎懈泻褋 锌芯屑芯褖薪懈泻邪',
+      },
+      memories: {
+        title: '袙芯褋锌芯屑懈薪邪薪懈褟',
+        tip: '袩邪屑褟褌褜 褔邪褌邪',
+        builtIn: '袙褋褌褉芯械薪薪褘械',
+      },
+      errorHandle: {
+        none: {
+          title: '袧懈泻邪泻芯泄',
+          desc: '校蟹械谢 锌械褉械褋褌邪薪械褌 褉邪斜芯褌邪褌褜, 械褋谢懈 锌褉芯懈蟹芯泄写械褌 懈褋泻谢褞褔械薪懈械 懈 芯薪芯 薪械 斜褍写械褌 芯斜褉邪斜芯褌邪薪芯',
+        },
+        defaultValue: {
+          title: '袟薪邪褔械薪懈械 锌芯 褍屑芯谢褔邪薪懈褞',
+          desc: '袩褉懈 胁芯蟹薪懈泻薪芯胁械薪懈懈 芯褕懈斜泻懈 褍泻邪卸懈褌械 褋褌邪褌懈褔械褋泻芯械 胁褘褏芯写薪芯械 褋芯写械褉卸懈屑芯械.',
+          tip: '袩褉懈 芯褕懈斜泻械 斜褍写械褌 胁芯蟹胁褉邪褖械薪芯 蟹薪邪褔械薪懈械 薪懈卸械.',
+          inLog: '袠褋泻谢褞褔械薪懈械 褍蟹谢邪, 胁褘胁芯写 胁 褋芯芯褌胁械褌褋褌胁懈懈 褋芯 蟹薪邪褔械薪懈褟屑懈 锌芯 褍屑芯谢褔邪薪懈褞.',
+          output: '袙褘褏芯写薪芯械 蟹薪邪褔械薪懈械 锌芯 褍屑芯谢褔邪薪懈褞',
+        },
+        failBranch: {
+          desc: '袩褉懈 胁芯蟹薪懈泻薪芯胁械薪懈懈 芯褕懈斜泻懈 斜褍写械褌 胁褘锌芯谢薪械薪邪 胁械褌胁褜 懈褋泻谢褞褔械薪懈褟',
+          customize: '袩械褉械泄写懈褌械 薪邪 褏芯谢褋褌, 褔褌芯斜褘 薪邪褋褌褉芯懈褌褜 谢芯谐懈泻褍 fail branch.',
+          inLog: '袠褋泻谢褞褔械薪懈械 褍蟹谢邪, 邪胁褌芯屑邪褌懈褔械褋泻懈 胁褘锌芯谢薪懈褌 胁械褌胁褜 fail. 袙褘褏芯写薪褘械 写邪薪薪褘械 褍蟹谢邪 胁械褉薪褍褌 褌懈锌 芯褕懈斜泻懈 懈 褋芯芯斜褖械薪懈械 芯斜 芯褕懈斜泻械 懈 锌械褉械写邪写褍褌 懈褏 薪懈卸械褋褌芯褟褖械屑褍 锌芯褌芯泻褍.',
+          title: '袧械褍写邪褔薪邪褟 胁械褌胁褜',
+          customizeTip: '袣芯谐写邪 胁械褌胁褜 fail 邪泻褌懈胁懈褉芯胁邪薪邪, 懈褋泻谢褞褔械薪懈褟, 褋芯蟹写邪薪薪褘械 褍蟹谢邪屑懈, 薪械 蟹邪胁械褉褕邪褌 锌褉芯褑械褋褋. 袙屑械褋褌芯 褝褌芯谐芯 芯薪 邪胁褌芯屑邪褌懈褔械褋泻懈 胁褘锌芯谢薪懈褌 锌褉械写芯锌褉械写械谢械薪薪褍褞 胁械褌胁褜 fail, 褔褌芯 锌芯蟹胁芯谢懈褌 胁邪屑 谐懈斜泻芯 锌褉械写芯褋褌邪胁谢褟褌褜 褋芯芯斜褖械薪懈褟 芯斜 芯褕懈斜泻邪褏, 芯褌褔械褌褘, 懈褋锌褉邪胁谢械薪懈褟 懈谢懈 锌褉芯锌褍褋泻邪褌褜 写械泄褋褌胁懈褟.',
+        },
+        partialSucceeded: {
+          tip: '袙 锌褉芯褑械褋褋械 械褋褌褜 {{num}} 褍蟹谢芯胁, 泻芯褌芯褉褘械 褉邪斜芯褌邪褞褌 薪械薪芯褉屑邪谢褜薪芯, 锌芯卸邪谢褍泄褋褌邪, 锌械褉械泄写懈褌械 泻 褌褉邪褋褋懈褉芯胁泻械, 褔褌芯斜褘 锌褉芯胁械褉懈褌褜 谢芯谐懈.',
+        },
+        title: '袨斜褉邪斜芯褌泻邪 芯褕懈斜芯泻',
+        tip: '小褌褉邪褌械谐懈褟 芯斜褉邪斜芯褌泻懈 懈褋泻谢褞褔械薪懈泄, 蟹邪锌褍褋泻邪械屑邪褟 锌褉懈 芯斜薪邪褉褍卸械薪懈懈 懈褋泻谢褞褔械薪懈褟 薪邪 褍蟹谢械.',
+      },
+      retry: {
+        retry: '小薪芯胁邪 锌褉芯斜芯胁邪褌褜',
+        retryOnFailure: '袩芯胁褌芯褉薪邪褟 锌芯锌褘褌泻邪 锌褉懈 薪械褍写邪褔械',
+        maxRetries: '屑邪泻褋懈屑邪谢褜薪芯械 泻芯谢懈褔械褋褌胁芯 锌芯胁褌芯褉薪褘褏 锌芯锌褘褌芯泻',
+        retryInterval: '袠薪褌械褉胁邪谢 锌芯胁褌芯褉薪褘褏 锌芯锌褘褌芯泻',
+        retryTimes: '袩芯胁褌芯褉懈褌械 {{褉邪蟹}} 褉邪蟹 锌褉懈 薪械褍写邪褔械',
+        retrying: '袩芯胁褌芯褉...',
+        retrySuccessful: '袩芯胁褌芯褉懈褌褜 锌芯锌褘褌泻褍 褍褋锌械褕薪芯',
+        retryFailed: '袩芯胁褌芯褉薪邪褟 锌芯锌褘褌泻邪 薪械 褍写邪谢邪褋褜',
+        times: '褉邪蟹',
+        ms: '谐芯褋锌芯卸邪',
+        retryFailedTimes: '袩芯胁褌芯褉薪褘械 锌芯锌褘褌泻懈 {{times}} 薪械 褍胁械薪褔邪谢懈褋褜 褍褋锌械褏芯屑',
+        retries: '{{褔懈褋谢芯}} 袩芯胁褌芯褉薪褘褏 锌芯锌褘褌芯泻',
+      },
+    },
+    start: {
+      required: '芯斜褟蟹邪褌械谢褜薪芯',
+      inputField: '袩芯谢械 胁胁芯写邪',
+      builtInVar: '袙褋褌褉芯械薪薪褘械 锌械褉械屑械薪薪褘械',
+      outputVars: {
+        query: '袙胁芯写 锌芯谢褜蟹芯胁邪褌械谢褟',
+        memories: {
+          des: '袠褋褌芯褉懈褟 褉邪蟹谐芯胁芯褉芯胁',
+          type: '褌懈锌 褋芯芯斜褖械薪懈褟',
+          content: '褋芯写械褉卸懈屑芯械 褋芯芯斜褖械薪懈褟',
+        },
+        files: '小锌懈褋芯泻 褎邪泄谢芯胁',
+      },
+      noVarTip: '校褋褌邪薪芯胁懈褌械 胁褏芯写薪褘械 写邪薪薪褘械, 泻芯褌芯褉褘械 屑芯卸薪芯 懈褋锌芯谢褜蟹芯胁邪褌褜 胁 褉邪斜芯褔械屑 锌褉芯褑械褋褋械',
+    },
+    end: {
+      outputs: '袙褘褏芯写褘',
+      output: {
+        type: '褌懈锌 胁褘胁芯写邪',
+        variable: '胁褘褏芯写薪邪褟 锌械褉械屑械薪薪邪褟',
+      },
+      type: {
+        'none': '袧械褌',
+        'plain-text': '袩褉芯褋褌芯泄 褌械泻褋褌',
+        'structured': '小褌褉褍泻褌褍褉懈褉芯胁邪薪薪褘泄',
+      },
+    },
+    answer: {
+      answer: '袨褌胁械褌',
+      outputVars: '袙褘褏芯写薪褘械 锌械褉械屑械薪薪褘械',
+    },
+    llm: {
+      model: '屑芯写械谢褜',
+      variables: '锌械褉械屑械薪薪褘械',
+      context: '泻芯薪褌械泻褋褌',
+      contextTooltip: '袙褘 屑芯卸械褌械 懈屑锌芯褉褌懈褉芯胁邪褌褜 蟹薪邪薪懈褟 泻邪泻 泻芯薪褌械泻褋褌',
+      notSetContextInPromptTip: '效褌芯斜褘 胁泻谢褞褔懈褌褜 褎褍薪泻褑懈褞 泻芯薪褌械泻褋褌邪, 锌芯卸邪谢褍泄褋褌邪, 蟹邪锌芯谢薪懈褌械 锌械褉械屑械薪薪褍褞 泻芯薪褌械泻褋褌邪 胁 PROMPT.',
+      prompt: '锌芯写褋泻邪蟹泻邪',
+      roleDescription: {
+        system: '袛邪泄褌械 胁褘褋芯泻芯褍褉芯胁薪械胁褘械 懈薪褋褌褉褍泻褑懈懈 写谢褟 褉邪蟹谐芯胁芯褉邪',
+        user: '袩褉械写芯褋褌邪胁褜褌械 懈薪褋褌褉褍泻褑懈懈, 蟹邪锌褉芯褋褘 懈谢懈 谢褞斜芯泄 褌械泻褋褌芯胁褘泄 胁胁芯写 写谢褟 屑芯写械谢懈',
+        assistant: '袨褌胁械褌褘 屑芯写械谢懈 薪邪 芯褋薪芯胁械 褋芯芯斜褖械薪懈泄 锌芯谢褜蟹芯胁邪褌械谢褟',
+      },
+      addMessage: '袛芯斜邪胁懈褌褜 褋芯芯斜褖械薪懈械',
+      vision: '蟹褉械薪懈械',
+      files: '肖邪泄谢褘',
+      resolution: {
+        name: '袪邪蟹褉械褕械薪懈械',
+        high: '袙褘褋芯泻芯械',
+        low: '袧懈蟹泻芯械',
+      },
+      outputVars: {
+        output: '小芯蟹写邪褌褜 泻芯薪褌械薪褌',
+        usage: '袠薪褎芯褉屑邪褑懈褟 芯斜 懈褋锌芯谢褜蟹芯胁邪薪懈懈 屑芯写械谢懈',
+      },
+      singleRun: {
+        variable: '袩械褉械屑械薪薪邪褟',
+      },
+      sysQueryInUser: 'sys.query 胁 褋芯芯斜褖械薪懈懈 锌芯谢褜蟹芯胁邪褌械谢褟 芯斜褟蟹邪褌械谢械薪',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: '袩芯卸邪谢褍泄褋褌邪, 蟹邪胁械褉褕懈褌械 褉械写邪泻褌懈褉芯胁邪薪懈械 褌械泻褍褖械谐芯 锌芯谢褟 锌械褉械写 褋芯褏褉邪薪械薪懈械屑 褋褏械屑褘.',
+        },
+        back: '小锌懈薪邪',
+        resetDefaults: '小斜褉芯褋',
+        showAdvancedOptions: '袩芯泻邪蟹邪褌褜 褉邪褋褕懈褉械薪薪褘械 锌邪褉邪屑械褌褉褘',
+        generatedResult: '小谐械薪械褉懈褉芯胁邪薪薪褘泄 褉械蟹褍谢褜褌邪褌',
+        generateJsonSchema: '小谐械薪械褉懈褉芯胁邪褌褜 JSON-褋褏械屑褍',
+        import: '袠屑锌芯褉褌 懈蟹 JSON',
+        stringValidations: '袩褉芯胁械褉泻邪 褋褌褉芯泻',
+        promptPlaceholder: '袨锌懈褕懈褌械 胁邪褕褍 JSON-褋褏械屑褍...',
+        required: '薪械芯斜褏芯写懈屑芯',
+        generate: '小谐械薪械褉懈褉芯胁邪褌褜',
+        apply: '袩芯写邪褌褜 蟹邪褟胁泻褍',
+        addChildField: '袛芯斜邪胁懈褌褜 锌芯谢械 褉械斜械薪泻邪',
+        regenerate: '小谐械薪械褉懈褉芯胁邪褌褜 蟹邪薪芯胁芯',
+        addField: '袛芯斜邪胁懈褌褜 锌芯谢械',
+        instruction: '袠薪褋褌褉褍泻褑懈褟',
+        title: '小褌褉褍泻褌褍褉懈褉芯胁邪薪薪邪褟 褋褏械屑邪 胁褘胁芯写邪',
+        descriptionPlaceholder: '袛芯斜邪胁懈褌褜 芯锌懈褋邪薪懈械',
+        fieldNamePlaceholder: '袧邪蟹胁邪薪懈械 锌芯谢褟',
+        doc: '校蟹薪邪泄褌械 斜芯谢褜褕械 芯 褋褌褉褍泻褌褍褉懈褉芯胁邪薪薪芯屑 胁褘胁芯写械',
+        resultTip: '袙芯褌 褋谐械薪械褉懈褉芯胁邪薪薪褘泄 褉械蟹褍谢褜褌邪褌. 袝褋谢懈 胁褘 薪械 褍写芯胁谢械褌胁芯褉械薪褘, 胁褘 屑芯卸械褌械 胁械褉薪褍褌褜褋褟 懈 懈蟹屑械薪懈褌褜 褋胁芯泄 蟹邪锌褉芯褋.',
+        generationTip: '袙褘 屑芯卸械褌械 懈褋锌芯谢褜蟹芯胁邪褌褜 械褋褌械褋褌胁械薪薪褘泄 褟蟹褘泻 写谢褟 斜褘褋褌褉芯谐芯 褋芯蟹写邪薪懈褟 褋褏械屑褘 JSON.',
+        generating: '袚械薪械褉邪褑懈褟 褋褏械屑褘 JSON...',
+        promptTooltip: '袩褉械芯斜褉邪蟹褍泄褌械 褌械泻褋褌芯胁芯械 芯锌懈褋邪薪懈械 胁 褋褌邪薪写邪褉褌懈蟹懈褉芯胁邪薪薪褍褞 褋褌褉褍泻褌褍褉褍 JSON Schema.',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: '袩械褉械屑械薪薪邪褟 蟹邪锌褉芯褋邪',
+      knowledge: '袟薪邪薪懈褟',
+      outputVars: {
+        output: '袠蟹胁谢械褔械薪薪褘械 褋械谐屑械薪褌懈褉芯胁邪薪薪褘械 写邪薪薪褘械',
+        content: '小械谐屑械薪褌懈褉芯胁邪薪薪褘泄 泻芯薪褌械薪褌',
+        title: '小械谐屑械薪褌懈褉芯胁邪薪薪褘泄 蟹邪谐芯谢芯胁芯泻',
+        icon: '小械谐屑械薪褌懈褉芯胁邪薪薪褘泄 蟹薪邪褔芯泻',
+        url: '小械谐屑械薪褌懈褉芯胁邪薪薪褘泄 URL',
+        metadata: '袛褉褍谐懈械 屑械褌邪写邪薪薪褘械',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            title: '袨褌泻谢褞褔械薪芯',
+            subTitle: '袧械 胁泻谢褞褔械薪懈械 褎懈谢褜褌褉邪褑懈懈 屑械褌邪写邪薪薪褘褏',
+          },
+          automatic: {
+            desc: '袗胁褌芯屑邪褌懈褔械褋泻懈 谐械薪械褉懈褉芯胁邪褌褜 褍褋谢芯胁懈褟 褎懈谢褜褌褉邪褑懈懈 屑械褌邪写邪薪薪褘褏 薪邪 芯褋薪芯胁械 锌械褉械屑械薪薪芯泄 蟹邪锌褉芯褋邪',
+            title: '袗胁褌芯屑邪褌懈褔械褋泻懈泄',
+            subTitle: '袗胁褌芯屑邪褌懈褔械褋泻懈 谐械薪械褉懈褉芯胁邪褌褜 褍褋谢芯胁懈褟 褎懈谢褜褌褉邪褑懈懈 屑械褌邪写邪薪薪褘褏 薪邪 芯褋薪芯胁械 蟹邪锌褉芯褋邪 锌芯谢褜蟹芯胁邪褌械谢褟',
+          },
+          manual: {
+            title: '袪褍泻芯胁芯写褋褌胁芯',
+            subTitle: '袙褉褍褔薪褍褞 写芯斜邪胁褜褌械 褍褋谢芯胁懈褟 褎懈谢褜褌褉邪褑懈懈 屑械褌邪写邪薪薪褘褏',
+          },
+        },
+        panel: {
+          conditions: '校褋谢芯胁懈褟',
+          placeholder: '袙胁械写懈褌械 蟹薪邪褔械薪懈械',
+          datePlaceholder: '袙褘斜械褉懈褌械 胁褉械屑褟...',
+          select: '袙褘斜械褉懈褌械 锌械褉械屑械薪薪褍褞...',
+          add: '袛芯斜邪胁懈褌褜 褍褋谢芯胁懈械',
+          title: '校褋谢芯胁懈褟 褎懈谢褜褌褉邪褑懈懈 屑械褌邪写邪薪薪褘褏',
+          search: '袩芯懈褋泻 屑械褌邪写邪薪薪褘褏',
+        },
+        title: '肖懈谢褜褌褉邪褑懈褟 屑械褌邪写邪薪薪褘褏',
+      },
+    },
+    http: {
+      inputVars: '袙褏芯写薪褘械 锌械褉械屑械薪薪褘械',
+      api: 'API',
+      apiPlaceholder: '袙胁械写懈褌械 URL, 胁胁械写懈褌械 "/" 写谢褟 胁褋褌邪胁泻懈 锌械褉械屑械薪薪芯泄',
+      notStartWithHttp: 'API 写芯谢卸械薪 薪邪褔懈薪邪褌褜褋褟 褋 http:// 懈谢懈 https://',
+      key: '袣谢褞褔',
+      value: '袟薪邪褔械薪懈械',
+      bulkEdit: '袦邪褋褋芯胁芯械 褉械写邪泻褌懈褉芯胁邪薪懈械',
+      keyValueEdit: '袪械写邪泻褌懈褉芯胁邪薪懈械 泻谢褞褔邪-蟹薪邪褔械薪懈褟',
+      headers: '袟邪谐芯谢芯胁泻懈',
+      params: '袩邪褉邪屑械褌褉褘',
+      body: '孝械谢芯',
+      outputVars: {
+        body: '小芯写械褉卸懈屑芯械 芯褌胁械褌邪',
+        statusCode: '袣芯写 褋芯褋褌芯褟薪懈褟 芯褌胁械褌邪',
+        headers: '小锌懈褋芯泻 蟹邪谐芯谢芯胁泻芯胁 芯褌胁械褌邪 JSON',
+        files: '小锌懈褋芯泻 褎邪泄谢芯胁',
+      },
+      authorization: {
+        'authorization': '袗胁褌芯褉懈蟹邪褑懈褟',
+        'authorizationType': '孝懈锌 邪胁褌芯褉懈蟹邪褑懈懈',
+        'no-auth': '袧械褌',
+        'api-key': 'API-泻谢褞褔',
+        'auth-type': '孝懈锌 邪褍褌械薪褌懈褎懈泻邪褑懈懈',
+        'basic': '袘邪蟹芯胁邪褟',
+        'bearer': 'Bearer',
+        'custom': '袩芯谢褜蟹芯胁邪褌械谢褜褋泻邪褟',
+        'api-key-title': 'API-泻谢褞褔',
+        'header': '袟邪谐芯谢芯胁芯泻',
+      },
+      insertVarPlaceholder: '胁胁械写懈褌械 "/" 写谢褟 胁褋褌邪胁泻懈 锌械褉械屑械薪薪芯泄',
+      timeout: {
+        title: '孝邪泄屑-邪褍褌',
+        connectLabel: '孝邪泄屑-邪褍褌 锌芯写泻谢褞褔械薪懈褟',
+        connectPlaceholder: '袙胁械写懈褌械 褌邪泄屑-邪褍褌 锌芯写泻谢褞褔械薪懈褟 胁 褋械泻褍薪写邪褏',
+        readLabel: '孝邪泄屑-邪褍褌 褔褌械薪懈褟',
+        readPlaceholder: '袙胁械写懈褌械 褌邪泄屑-邪褍褌 褔褌械薪懈褟 胁 褋械泻褍薪写邪褏',
+        writeLabel: '孝邪泄屑-邪褍褌 蟹邪锌懈褋懈',
+        writePlaceholder: '袙胁械写懈褌械 褌邪泄屑-邪褍褌 蟹邪锌懈褋懈 胁 褋械泻褍薪写邪褏',
+      },
+      type: '孝懈锌',
+      binaryFileVariable: '袩械褉械屑械薪薪邪褟 写胁芯懈褔薪芯谐芯 褎邪泄谢邪',
+      extractListPlaceholder: '袙胁械写懈褌械 懈薪写械泻褋 褝谢械屑械薪褌邪 褋锌懈褋泻邪, 胁胁械写懈褌械 \'/\' 胁褋褌邪胁褜褌械 锌械褉械屑械薪薪褍褞',
+      curl: {
+        placeholder: '袙褋褌邪胁褜褌械 褋褞写邪 褋褌褉芯泻褍 cURL',
+        title: '袠屑锌芯褉褌 懈蟹 cURL',
+      },
+    },
+    code: {
+      inputVars: '袙褏芯写薪褘械 锌械褉械屑械薪薪褘械',
+      outputVars: '袙褘褏芯写薪褘械 锌械褉械屑械薪薪褘械',
+      advancedDependencies: '袪邪褋褕懈褉械薪薪褘械 蟹邪胁懈褋懈屑芯褋褌懈',
+      advancedDependenciesTip: '袛芯斜邪胁褜褌械 褋褞写邪 薪械泻芯褌芯褉褘械 锌褉械写胁邪褉懈褌械谢褜薪芯 蟹邪谐褉褍卸械薪薪褘械 蟹邪胁懈褋懈屑芯褋褌懈, 泻芯褌芯褉褘械 蟹邪薪懈屑邪褞褌 斜芯谢褜褕械 胁褉械屑械薪懈 写谢褟 锌芯褌褉械斜谢械薪懈褟 懈谢懈 薪械 褟胁谢褟褞褌褋褟 胁褋褌褉芯械薪薪褘屑懈 锌芯 褍屑芯谢褔邪薪懈褞',
+      searchDependencies: '袩芯懈褋泻 蟹邪胁懈褋懈屑芯褋褌械泄',
+    },
+    templateTransform: {
+      inputVars: '袙褏芯写薪褘械 锌械褉械屑械薪薪褘械',
+      code: '袣芯写',
+      codeSupportTip: '袩芯写写械褉卸懈胁邪械褌 褌芯谢褜泻芯 Jinja2',
+      outputVars: {
+        output: '袩褉械芯斜褉邪蟹芯胁邪薪薪褘泄 泻芯薪褌械薪褌',
+      },
+    },
+    ifElse: {
+      if: '袝褋谢懈',
+      else: '袠薪邪褔械',
+      elseDescription: '袠褋锌芯谢褜蟹褍械褌褋褟 写谢褟 芯锌褉械写械谢械薪懈褟 谢芯谐懈泻懈, 泻芯褌芯褉邪褟 写芯谢卸薪邪 斜褘褌褜 胁褘锌芯谢薪械薪邪, 泻芯谐写邪 褍褋谢芯胁懈械 if 薪械 胁褘锌芯谢薪褟械褌褋褟.',
+      and: '懈',
+      or: '懈谢懈',
+      operator: '袨锌械褉邪褌芯褉',
+      notSetVariable: '袩芯卸邪谢褍泄褋褌邪, 褋薪邪褔邪谢邪 褍褋褌邪薪芯胁懈褌械 锌械褉械屑械薪薪褍褞',
+      comparisonOperator: {
+        'contains': '褋芯写械褉卸懈褌',
+        'not contains': '薪械 褋芯写械褉卸懈褌',
+        'start with': '薪邪褔懈薪邪械褌褋褟 褋',
+        'end with': '蟹邪泻邪薪褔懈胁邪械褌褋褟 薪邪',
+        'is': '褉邪胁薪芯',
+        'is not': '薪械 褉邪胁薪芯',
+        'empty': '锌褍褋褌芯',
+        'not empty': '薪械 锌褍褋褌芯',
+        'null': 'null',
+        'not null': '薪械 null',
+        'regex match': '小芯胁锌邪写械薪懈械 褋 褉械谐褍谢褟褉薪褘屑 胁褘褉邪卸械薪懈械屑',
+        'all of': '胁褋械',
+        'not in': '薪械 胁',
+        'not exists': '薪械 褋褍褖械褋褌胁褍械褌',
+        'in': '胁',
+        'exists': '小褍褖械褋褌胁褍械褌',
+        'before': '写芯',
+        'after': '锌芯褋谢械',
+      },
+      enterValue: '袙胁械写懈褌械 蟹薪邪褔械薪懈械',
+      addCondition: '袛芯斜邪胁懈褌褜 褍褋谢芯胁懈械',
+      conditionNotSetup: '校褋谢芯胁懈械 袧袝 薪邪褋褌褉芯械薪芯',
+      selectVariable: '袙褘斜械褉懈褌械 锌械褉械屑械薪薪褍褞...',
+      optionName: {
+        audio: '袗褍写懈芯',
+        localUpload: '袥芯泻邪谢褜薪邪褟 蟹邪谐褉褍蟹泻邪',
+        doc: '袛芯泻褌芯褉',
+        image: '袨斜褉邪蟹',
+        video: '袙懈写械芯',
+        url: 'URL-邪写褉械褋',
+      },
+      select: '袙褘斜懈褉邪褌褜',
+      addSubVariable: '袩芯写锌械褉械屑械薪薪邪褟',
+      condition: '校褋谢芯胁懈械',
+    },
+    variableAssigner: {
+      title: '袧邪蟹薪邪褔懈褌褜 锌械褉械屑械薪薪褘械',
+      outputType: '孝懈锌 胁褘胁芯写邪',
+      varNotSet: '袩械褉械屑械薪薪邪褟 薪械 褍褋褌邪薪芯胁谢械薪邪',
+      noVarTip: '袛芯斜邪胁褜褌械 锌械褉械屑械薪薪褘械, 泻芯褌芯褉褘械 薪褍卸薪芯 薪邪蟹薪邪褔懈褌褜',
+      type: {
+        string: '小褌褉芯泻邪',
+        number: '效懈褋谢芯',
+        object: '袨斜褗械泻褌',
+        array: '袦邪褋褋懈胁',
+      },
+      aggregationGroup: '袚褉褍锌锌邪 邪谐褉械谐邪褑懈懈',
+      aggregationGroupTip: '袙泻谢褞褔械薪懈械 褝褌芯泄 褎褍薪泻褑懈懈 锌芯蟹胁芯谢褟械褌 邪谐褉械谐邪褌芯褉褍 锌械褉械屑械薪薪褘褏 邪谐褉械谐懈褉芯胁邪褌褜 薪械褋泻芯谢褜泻芯 薪邪斜芯褉芯胁 锌械褉械屑械薪薪褘褏.',
+      addGroup: '袛芯斜邪胁懈褌褜 谐褉褍锌锌褍',
+      outputVars: {
+        varDescribe: '袙褘胁芯写 {{groupName}}',
+      },
+      setAssignVariable: '校褋褌邪薪芯胁懈褌褜 锌械褉械屑械薪薪褍褞 薪邪蟹薪邪褔械薪懈褟',
+    },
+    assigner: {
+      'assignedVariable': '袧邪蟹薪邪褔械薪薪邪褟 锌械褉械屑械薪薪邪褟',
+      'writeMode': '袪械卸懈屑 蟹邪锌懈褋懈',
+      'writeModeTip': '袪械卸懈屑 写芯斜邪胁谢械薪懈褟: 写芯褋褌褍锌械薪 褌芯谢褜泻芯 写谢褟 锌械褉械屑械薪薪褘褏 屑邪褋褋懈胁邪.',
+      'over-write': '袩械褉械蟹邪锌懈褋邪褌褜',
+      'append': '袛芯斜邪胁懈褌褜',
+      'plus': '袩谢褞褋',
+      'clear': '袨褔懈褋褌懈褌褜',
+      'setVariable': '校褋褌邪薪芯胁懈褌褜 锌械褉械屑械薪薪褍褞',
+      'variable': '袩械褉械屑械薪薪邪褟',
+      'operations': {
+        '-=': '-=',
+        '+=': '+=',
+        'clear': '携褋薪褘泄',
+        'extend': '袙褘褌褟谐懈胁邪褌褜',
+        'set': '袧邪斜芯褉',
+        'overwrite': '袩械褉械蟹邪锌懈褋邪褌褜',
+        '/=': '/=',
+        '*=': '*=',
+        'title': '袨锌械褉邪褑懈褟',
+        'over-write': '袩械褉械蟹邪锌懈褋邪褌褜',
+        'append': '袩褉懈斜邪胁谢褟褌褜',
+        'remove-first': '校写邪谢懈褌褜 锌械褉胁褘泄',
+        'remove-last': '校写邪谢懈褌褜 锌芯褋谢械写薪懈泄',
+      },
+      'variables': '袩械褉械屑械薪薪褘械',
+      'noAssignedVars': '袧械褌 写芯褋褌褍锌薪褘褏 薪邪蟹薪邪褔械薪薪褘褏 锌械褉械屑械薪薪褘褏',
+      'noVarTip': '袧邪卸屑懈褌械 泻薪芯锌泻褍 "+", 褔褌芯斜褘 写芯斜邪胁懈褌褜 锌械褉械屑械薪薪褘械',
+      'setParameter': '校褋褌邪薪芯胁懈褌械 锌邪褉邪屑械褌褉...',
+      'assignedVarsDescription': '袧邪蟹薪邪褔邪械屑褘械 锌械褉械屑械薪薪褘械 写芯谢卸薪褘 斜褘褌褜 写芯褋褌褍锌薪褘屑懈 写谢褟 蟹邪锌懈褋懈, 薪邪锌褉懈屑械褉 锌械褉械屑械薪薪褘屑懈 斜械褋械写褘.',
+      'varNotSet': '袩械褉械屑械薪薪邪褟 袧袝 褍褋褌邪薪芯胁谢械薪邪',
+      'selectAssignedVariable': '袙褘斜械褉懈褌械 薪邪蟹薪邪褔械薪薪褍褞 锌械褉械屑械薪薪褍褞...',
+    },
+    tool: {
+      toAuthorize: '袗胁褌芯褉懈蟹芯胁邪褌褜',
+      inputVars: '袙褏芯写薪褘械 锌械褉械屑械薪薪褘械',
+      outputVars: {
+        text: '泻芯薪褌械薪褌, 褋谐械薪械褉懈褉芯胁邪薪薪褘泄 懈薪褋褌褉褍屑械薪褌芯屑',
+        files: {
+          title: '褎邪泄谢褘, 褋谐械薪械褉懈褉芯胁邪薪薪褘械 懈薪褋褌褉褍屑械薪褌芯屑',
+          type: '袩芯写写械褉卸懈胁邪械屑褘泄 褌懈锌. 小械泄褔邪褋 锌芯写写械褉卸懈胁邪褞褌褋褟 褌芯谢褜泻芯 懈蟹芯斜褉邪卸械薪懈褟',
+          transfer_method: '袦械褌芯写 锌械褉械写邪褔懈. 袟薪邪褔械薪懈械 - remote_url 懈谢懈 local_file',
+          url: 'URL 懈蟹芯斜褉邪卸械薪懈褟',
+          upload_file_id: '袠写械薪褌懈褎懈泻邪褌芯褉 蟹邪谐褉褍卸械薪薪芯谐芯 褎邪泄谢邪',
+        },
+        json: 'json, 褋谐械薪械褉懈褉芯胁邪薪薪褘泄 懈薪褋褌褉褍屑械薪褌芯屑',
+      },
+    },
+    questionClassifiers: {
+      model: '屑芯写械谢褜',
+      inputVars: '袙褏芯写薪褘械 锌械褉械屑械薪薪褘械',
+      outputVars: {
+        className: '袠屑褟 泻谢邪褋褋邪',
+      },
+      class: '袣谢邪褋褋',
+      classNamePlaceholder: '袙胁械写懈褌械 懈屑褟 胁邪褕械谐芯 泻谢邪褋褋邪',
+      advancedSetting: '袪邪褋褕懈褉械薪薪褘械 薪邪褋褌褉芯泄泻懈',
+      topicName: '袧邪蟹胁邪薪懈械 褌械屑褘',
+      topicPlaceholder: '袙胁械写懈褌械 薪邪蟹胁邪薪懈械 胁邪褕械泄 褌械屑褘',
+      addClass: '袛芯斜邪胁懈褌褜 泻谢邪褋褋',
+      instruction: '袠薪褋褌褉褍泻褑懈褟',
+      instructionTip: '袙胁械写懈褌械 写芯锌芯谢薪懈褌械谢褜薪褘械 懈薪褋褌褉褍泻褑懈懈, 褔褌芯斜褘 锌芯屑芯褔褜 泻谢邪褋褋懈褎懈泻邪褌芯褉褍 胁芯锌褉芯褋芯胁 谢褍褔褕械 锌芯薪褟褌褜, 泻邪泻 泻谢邪褋褋懈褎懈褑懈褉芯胁邪褌褜 胁芯锌褉芯褋褘.',
+      instructionPlaceholder: '袙胁械写懈褌械 胁邪褕褍 懈薪褋褌褉褍泻褑懈褞',
+    },
+    parameterExtractor: {
+      inputVar: '袙褏芯写薪邪褟 锌械褉械屑械薪薪邪褟',
+      extractParameters: '袠蟹胁谢械褔褜 锌邪褉邪屑械褌褉褘',
+      importFromTool: '袠屑锌芯褉褌懈褉芯胁邪褌褜 懈蟹 懈薪褋褌褉褍屑械薪褌芯胁',
+      addExtractParameter: '袛芯斜邪胁懈褌褜 锌邪褉邪屑械褌褉 写谢褟 懈蟹胁谢械褔械薪懈褟',
+      addExtractParameterContent: {
+        name: '袠屑褟',
+        namePlaceholder: '袠屑褟 懈蟹胁谢械泻邪械屑芯谐芯 锌邪褉邪屑械褌褉邪',
+        type: '孝懈锌',
+        typePlaceholder: '孝懈锌 懈蟹胁谢械泻邪械屑芯谐芯 锌邪褉邪屑械褌褉邪',
+        description: '袨锌懈褋邪薪懈械',
+        descriptionPlaceholder: '袨锌懈褋邪薪懈械 懈蟹胁谢械泻邪械屑芯谐芯 锌邪褉邪屑械褌褉邪',
+        required: '袨斜褟蟹邪褌械谢褜薪褘泄',
+        requiredContent: '袨斜褟蟹邪褌械谢褜薪褘泄 懈褋锌芯谢褜蟹褍械褌褋褟 褌芯谢褜泻芯 胁 泻邪褔械褋褌胁械 褋褋褘谢泻懈 写谢褟 胁褘胁芯写邪 屑芯写械谢懈, 邪 薪械 写谢褟 芯斜褟蟹邪褌械谢褜薪芯泄 锌褉芯胁械褉泻懈 胁褘胁芯写邪 锌邪褉邪屑械褌褉邪.',
+      },
+      extractParametersNotSet: '袩邪褉邪屑械褌褉褘 写谢褟 懈蟹胁谢械褔械薪懈褟 薪械 薪邪褋褌褉芯械薪褘',
+      instruction: '袠薪褋褌褉褍泻褑懈褟',
+      instructionTip: '袙胁械写懈褌械 写芯锌芯谢薪懈褌械谢褜薪褘械 懈薪褋褌褉褍泻褑懈懈, 褔褌芯斜褘 锌芯屑芯褔褜 懈蟹胁谢械泻邪褌械谢褞 锌邪褉邪屑械褌褉芯胁 锌芯薪褟褌褜, 泻邪泻 懈蟹胁谢械泻邪褌褜 锌邪褉邪屑械褌褉褘.',
+      advancedSetting: '袪邪褋褕懈褉械薪薪褘械 薪邪褋褌褉芯泄泻懈',
+      reasoningMode: '袪械卸懈屑 褉邪褋褋褍卸写械薪懈褟',
+      reasoningModeTip: '袙褘 屑芯卸械褌械 胁褘斜褉邪褌褜 褋芯芯褌胁械褌褋褌胁褍褞褖懈泄 褉械卸懈屑 褉邪褋褋褍卸写械薪懈褟, 芯褋薪芯胁褘胁邪褟褋褜 薪邪 褋锌芯褋芯斜薪芯褋褌懈 屑芯写械谢懈 褉械邪谐懈褉芯胁邪褌褜 薪邪 懈薪褋褌褉褍泻褑懈懈 写谢褟 胁褘蟹芯胁邪 褎褍薪泻褑懈泄 懈谢懈 锌芯写褋泻邪蟹泻懈.',
+      isSuccess: '校褋锌械褕薪芯. 袙 褋谢褍褔邪械 褍褋锌械褏邪 蟹薪邪褔械薪懈械 褉邪胁薪芯 1, 胁 褋谢褍褔邪械 褋斜芯褟 - 0.',
+      errorReason: '袩褉懈褔懈薪邪 芯褕懈斜泻懈',
+    },
+    iteration: {
+      deleteTitle: '校写邪谢懈褌褜 褍蟹械谢 懈褌械褉邪褑懈懈?',
+      deleteDesc: '校写邪谢械薪懈械 褍蟹谢邪 懈褌械褉邪褑懈懈 锌褉懈胁械写械褌 泻 褍写邪谢械薪懈褞 胁褋械褏 写芯褔械褉薪懈褏 褍蟹谢芯胁',
+      input: '袙褏芯写',
+      output: '袙褘褏芯写薪褘械 锌械褉械屑械薪薪褘械',
+      iteration_one: '{{count}} 袠褌械褉邪褑懈褟',
+      iteration_other: '{{count}} 袠褌械褉邪褑懈泄',
+      currentIteration: '孝械泻褍褖邪褟 懈褌械褉邪褑懈褟',
+      ErrorMethod: {
+        operationTerminated: '袩褉械泻褉邪褖械薪芯',
+        continueOnError: '锌褉芯写芯谢卸懈褌褜 锌芯 芯褕懈斜泻械',
+        removeAbnormalOutput: '褍写邪谢懈褌褜 邪薪芯屑邪谢褜薪褘泄 胁褘胁芯写',
+      },
+      comma: ',',
+      error_other: '{{袣芯谢懈褔械褋褌胁芯}} 袨褕懈斜泻懈',
+      errorResponseMethod: '袦械褌芯写 褉械邪谐懈褉芯胁邪薪懈褟 薪邪 芯褕懈斜泻褍',
+      MaxParallelismTitle: '袦邪泻褋懈屑邪谢褜薪褘泄 锌邪褉邪谢谢械谢懈蟹屑',
+      parallelModeUpper: '袩袗袪袗袥袥袝袥鞋袧蝎袡 袪袝袞袠袦',
+      error_one: '{{袣芯谢懈褔械褋褌胁芯}} 袨褕懈斜泻邪',
+      parallelModeEnableTitle: '袩邪褉邪谢谢械谢褜薪褘泄 褉械卸懈屑 胁泻谢褞褔械薪',
+      parallelMode: '袩邪褉邪谢谢械谢褜薪褘泄 褉械卸懈屑',
+      parallelPanelDesc: '袙 锌邪褉邪谢谢械谢褜薪芯屑 褉械卸懈屑械 蟹邪写邪褔懈 胁 懈褌械褉邪褑懈懈 锌芯写写械褉卸懈胁邪褞褌 锌邪褉邪谢谢械谢褜薪芯械 胁褘锌芯谢薪械薪懈械.',
+      parallelModeEnableDesc: '袙 锌邪褉邪谢谢械谢褜薪芯屑 褉械卸懈屑械 蟹邪写邪褔懈 胁 懈褌械褉邪褑懈褟褏 锌芯写写械褉卸懈胁邪褞褌 锌邪褉邪谢谢械谢褜薪芯械 胁褘锌芯谢薪械薪懈械. 袙褘 屑芯卸械褌械 薪邪褋褌褉芯懈褌褜 褝褌芯 薪邪 锌邪薪械谢懈 褋胁芯泄褋褌胁 褋锌褉邪胁邪.',
+      MaxParallelismDesc: '袦邪泻褋懈屑邪谢褜薪褘泄 锌邪褉邪谢谢械谢懈蟹屑 懈褋锌芯谢褜蟹褍械褌褋褟 写谢褟 褍锌褉邪胁谢械薪懈褟 泻芯谢懈褔械褋褌胁芯屑 蟹邪写邪褔, 胁褘锌芯谢薪褟械屑褘褏 芯写薪芯胁褉械屑械薪薪芯 胁 芯写薪芯泄 懈褌械褉邪褑懈懈.',
+      answerNodeWarningDesc: '袩褉械写褍锌褉械卸写械薪懈械 芯 锌邪褉邪谢谢械谢褜薪芯屑 褉械卸懈屑械: 褍蟹谢褘 芯褌胁械褌芯胁, 锌褉懈褋胁芯械薪懈械 锌械褉械屑械薪薪褘褏 写懈邪谢芯谐邪 懈 锌芯褋褌芯褟薪薪褘械 芯锌械褉邪褑懈懈 褔褌械薪懈褟 懈 蟹邪锌懈褋懈 胁 懈褌械褉邪褑懈褟褏 屑芯谐褍褌 胁褘蟹褘胁邪褌褜 懈褋泻谢褞褔械薪懈褟.',
+    },
+    note: {
+      addNote: '袛芯斜邪胁懈褌褜 蟹邪屑械褌泻褍',
+      editor: {
+        placeholder: '袧邪锌懈褕懈褌械 褋胁芯褞 蟹邪屑械褌泻褍...',
+        small: '袦邪谢械薪褜泻懈泄',
+        medium: '小褉械写薪懈泄',
+        large: '袘芯谢褜褕芯泄',
+        bold: '袞懈褉薪褘泄',
+        italic: '袣褍褉褋懈胁',
+        strikethrough: '袟邪褔械褉泻薪褍褌褘泄',
+        link: '小褋褘谢泻邪',
+        openLink: '袨褌泻褉褘褌褜',
+        unlink: '校写邪谢懈褌褜 褋褋褘谢泻褍',
+        enterUrl: '袙胁械写懈褌械 URL...',
+        invalidUrl: '袧械胁械褉薪褘泄 URL',
+        bulletList: '袦邪褉泻懈褉芯胁邪薪薪褘泄 褋锌懈褋芯泻',
+        showAuthor: '袩芯泻邪蟹邪褌褜 邪胁褌芯褉邪',
+      },
+    },
+    docExtractor: {
+      outputVars: {
+        text: '袠蟹胁谢械褔械薪薪褘泄 褌械泻褋褌',
+      },
+      learnMore: '袩芯写褉芯斜薪械械',
+      inputVar: '袙褏芯写薪邪褟 锌械褉械屑械薪薪邪褟',
+      supportFileTypes: '袩芯写写械褉卸懈胁邪械屑褘械 褌懈锌褘 褎邪泄谢芯胁: {{types}}.',
+    },
+    listFilter: {
+      outputVars: {
+        last_record: '袩芯褋谢械写薪褟褟 蟹邪锌懈褋褜',
+        result: '肖懈谢褜褌褉邪褑懈褟 褉械蟹褍谢褜褌邪褌邪',
+        first_record: '袩械褉胁邪褟 蟹邪锌懈褋褜',
+      },
+      desc: 'DESC',
+      asc: 'ASC',
+      filterCondition: '校褋谢芯胁懈械 褎懈谢褜褌褉邪',
+      filterConditionComparisonOperator: '袨锌械褉邪褌芯褉 褋褉邪胁薪械薪懈褟 褍褋谢芯胁懈泄 褎懈谢褜褌褉邪',
+      inputVar: '袙褏芯写薪邪褟 锌械褉械屑械薪薪邪褟',
+      limit: '孝芯锌 N',
+      orderBy: '袟邪泻邪蟹邪褌褜 锌芯',
+      filterConditionKey: '袣谢褞褔 褍褋谢芯胁懈褟 褎懈谢褜褌褉邪',
+      selectVariableKeyPlaceholder: '袙褘斜芯褉 泻谢褞褔邪 锌芯写锌械褉械屑械薪薪芯泄',
+      filterConditionComparisonValue: '袟薪邪褔械薪懈械 褍褋谢芯胁懈褟 褎懈谢褜褌褉邪',
+      extractsCondition: '袠蟹胁谢械褔械薪懈械 褝谢械屑械薪褌邪 N',
+    },
+    agent: {
+      strategy: {
+        tooltip: '袪邪蟹谢懈褔薪褘械 邪谐械薪褌薪褘械 褋褌褉邪褌械谐懈懈 芯锌褉械写械谢褟褞褌, 泻邪泻 褋懈褋褌械屑邪 锌谢邪薪懈褉褍械褌 懈 胁褘锌芯谢薪褟械褌 屑薪芯谐芯褋褌褍锌械薪褔邪褌褘械 胁褘蟹芯胁褘 懈薪褋褌褉褍屑械薪褌芯胁',
+        configureTip: '袩芯卸邪谢褍泄褋褌邪, 薪邪褋褌褉芯泄褌械 邪谐械薪褌褋泻褍褞 褋褌褉邪褌械谐懈褞.',
+        searchPlaceholder: '袗谐械薪褌褋泻邪褟 褋褌褉邪褌械谐懈褟 锌芯懈褋泻邪',
+        selectTip: '袙褘斜械褉懈褌械 邪谐械薪褌褋泻褍褞 褋褌褉邪褌械谐懈褞',
+        shortLabel: '小褌褉邪褌械谐懈褟',
+        configureTipDesc: '袩芯褋谢械 薪邪褋褌褉芯泄泻懈 邪谐械薪褌褋泻芯泄 褋褌褉邪褌械谐懈懈 褝褌芯褌 褍蟹械谢 邪胁褌芯屑邪褌懈褔械褋泻懈 蟹邪谐褉褍蟹懈褌 芯褋褌邪胁褕懈械褋褟 泻芯薪褎懈谐褍褉邪褑懈懈. 小褌褉邪褌械谐懈褟 斜褍写械褌 胁谢懈褟褌褜 薪邪 屑械褏邪薪懈蟹屑 屑薪芯谐芯褋褌褍锌械薪褔邪褌芯谐芯 屑褘褕谢械薪懈褟 懈薪褋褌褉褍屑械薪褌邪.',
+        label: '袗谐械薪褌薪邪褟 褋褌褉邪褌械谐懈褟',
+      },
+      pluginInstaller: {
+        install: '校褋褌邪薪邪胁谢懈胁邪褌褜',
+        installing: '校褋褌邪薪芯胁泻邪',
+      },
+      modelNotInMarketplace: {
+        title: '袦芯写械谢褜 薪械 褍褋褌邪薪芯胁谢械薪邪',
+        manageInPlugins: '校锌褉邪胁谢械薪懈械 胁 锌谢邪谐懈薪邪褏',
+        desc: '协褌邪 屑芯写械谢褜 褍褋褌邪薪邪胁谢懈胁邪械褌褋褟 懈蟹 谢芯泻邪谢褜薪芯谐芯 褉械锌芯蟹懈褌芯褉懈褟 懈谢懈 褉械锌芯蟹懈褌芯褉懈褟 GitHub. 袩芯卸邪谢褍泄褋褌邪, 懈褋锌芯谢褜蟹褍泄褌械 锌芯褋谢械 褍褋褌邪薪芯胁泻懈.',
+      },
+      modelNotSupport: {
+        title: '袧械锌芯写写械褉卸懈胁邪械屑邪褟 屑芯写械谢褜',
+        descForVersionSwitch: '校褋褌邪薪芯胁谢械薪薪邪褟 胁械褉褋懈褟 锌谢邪谐懈薪邪 薪械 锌褉械写芯褋褌邪胁谢褟械褌 褝褌褍 屑芯写械谢褜. 袧邪卸屑懈褌械, 褔褌芯斜褘 锌械褉械泻谢褞褔懈褌褜 胁械褉褋懈褞.',
+        desc: '校褋褌邪薪芯胁谢械薪薪邪褟 胁械褉褋懈褟 锌谢邪谐懈薪邪 薪械 锌褉械写芯褋褌邪胁谢褟械褌 褝褌褍 屑芯写械谢褜.',
+      },
+      modelSelectorTooltips: {
+        deprecated: '协褌邪 屑芯写械谢褜 褍褋褌邪褉械谢邪',
+      },
+      outputVars: {
+        files: {
+          transfer_method: '小锌芯褋芯斜 锌械褉械薪芯褋邪. 笑械薪薪芯褋褌褜 褋芯褋褌邪胁谢褟械褌 remote_url 懈谢懈 local_file',
+          url: 'URL 懈蟹芯斜褉邪卸械薪懈褟',
+          upload_file_id: '袟邪谐褉褍蟹懈褌褜 id 褎邪泄谢邪',
+          type: '孝懈锌 锌芯写写械褉卸泻懈. 孝械锌械褉褜 褌芯谢褜泻芯 胁褋锌芯屑芯谐邪褌械谢褜薪芯械 懈蟹芯斜褉邪卸械薪懈械',
+          title: '肖邪泄谢褘, 褋芯蟹写邪薪薪褘械 邪谐械薪褌芯屑',
+        },
+        text: '袣芯薪褌械薪褌, 谐械薪械褉懈褉褍械屑褘泄 邪谐械薪褌芯屑',
+        json: 'JSON, 褋谐械薪械褉懈褉芯胁邪薪薪褘泄 邪谐械薪褌芯屑',
+      },
+      checkList: {
+        strategyNotSelected: '小褌褉邪褌械谐懈褟 薪械 胁褘斜褉邪薪邪',
+      },
+      installPlugin: {
+        install: '校褋褌邪薪邪胁谢懈胁邪褌褜',
+        title: '校褋褌邪薪芯胁懈褌褜 锌谢邪谐懈薪',
+        desc: '袨 锌褉芯谐褉邪屑屑械 褍褋褌邪薪芯胁泻懈 褋谢械写褍褞褖械谐芯 锌谢邪谐懈薪邪',
+        cancel: '袨褌屑械薪邪',
+        changelog: '袞褍褉薪邪谢 懈蟹屑械薪械薪懈泄',
+      },
+      tools: '袠薪褋褌褉褍屑械薪褌褘',
+      pluginNotInstalled: '协褌芯褌 锌谢邪谐懈薪 薪械 褍褋褌邪薪芯胁谢械薪',
+      strategyNotFoundDesc: '校褋褌邪薪芯胁谢械薪薪邪褟 胁械褉褋懈褟 锌谢邪谐懈薪邪 薪械 锌褉械写褍褋屑邪褌褉懈胁邪械褌 褌邪泻芯泄 褋褌褉邪褌械谐懈懈.',
+      toolNotInstallTooltip: '{{tool}} 薪械 褍褋褌邪薪芯胁谢械薪',
+      linkToPlugin: '小褋褘谢泻邪 薪邪 锌谢邪谐懈薪褘',
+      learnMore: '袩芯写褉芯斜薪械械',
+      modelNotInstallTooltip: '袛邪薪薪邪褟 屑芯写械谢褜 薪械 褍褋褌邪薪邪胁谢懈胁邪械褌褋褟',
+      modelNotSelected: '袦芯写械谢褜 薪械 胁褘斜褉邪薪邪',
+      toolNotAuthorizedTooltip: '{{懈薪褋褌褉褍屑械薪褌}} 袧械 邪胁褌芯褉懈蟹芯胁邪薪',
+      unsupportedStrategy: '袧械锌芯写写械褉卸懈胁邪械屑邪褟 褋褌褉邪褌械谐懈褟',
+      pluginNotInstalledDesc: '协褌芯褌 锌谢邪谐懈薪 褍褋褌邪薪邪胁谢懈胁邪械褌褋褟 褋 GitHub. 袩芯卸邪谢褍泄褋褌邪, 锌械褉械泄写懈褌械 胁 褉邪蟹写械谢 袩谢邪谐懈薪褘 写谢褟 锌械褉械褍褋褌邪薪芯胁泻懈',
+      model: '屑芯写械谢褜',
+      strategyNotFoundDescAndSwitchVersion: '校褋褌邪薪芯胁谢械薪薪邪褟 胁械褉褋懈褟 锌谢邪谐懈薪邪 薪械 锌褉械写褍褋屑邪褌褉懈胁邪械褌 褌邪泻芯泄 褋褌褉邪褌械谐懈懈. 袧邪卸屑懈褌械, 褔褌芯斜褘 锌械褉械泻谢褞褔懈褌褜 胁械褉褋懈褞.',
+      notAuthorized: '袧械 邪胁褌芯褉懈蟹芯胁邪薪',
+      strategyNotSet: '袗谐械薪褌褋泻邪褟 褋褌褉邪褌械谐懈褟 薪械 蟹邪写邪薪邪',
+      strategyNotInstallTooltip: '{{strategy}} 薪械 褍褋褌邪薪芯胁谢械薪',
+      toolbox: '褟褖懈泻 写谢褟 懈薪褋褌褉褍屑械薪褌芯胁',
+      pluginNotFoundDesc: '协褌芯褌 锌谢邪谐懈薪 褍褋褌邪薪邪胁谢懈胁邪械褌褋褟 褋 GitHub. 袩芯卸邪谢褍泄褋褌邪, 锌械褉械泄写懈褌械 胁 褉邪蟹写械谢 袩谢邪谐懈薪褘 写谢褟 锌械褉械褍褋褌邪薪芯胁泻懈',
+      configureModel: '小泻芯薪褎懈谐褍褉懈褉芯胁邪褌褜 屑芯写械谢褜',
+      maxIterations: '袦邪泻褋懈屑邪谢褜薪芯械 泻芯谢懈褔械褋褌胁芯 懈褌械褉邪褑懈泄',
+    },
+    loop: {
+      ErrorMethod: {
+        operationTerminated: '袩褉械泻褉邪褖械薪芯',
+        continueOnError: '袩褉芯写芯谢卸邪褌褜 锌褉懈 芯褕懈斜泻械',
+        removeAbnormalOutput: '校褋褌褉邪薪懈褌褜 邪薪芯屑邪谢褜薪褘泄 胁褘胁芯写',
+      },
+      inputMode: '袪械卸懈屑 胁胁芯写邪',
+      exitConditionTip: '校 褍蟹谢邪 褑懈泻谢邪 写芯谢卸薪芯 斜褘褌褜 泻邪泻 屑懈薪懈屑褍屑 芯写薪芯 褍褋谢芯胁懈械 胁褘褏芯写邪',
+      loopMaxCountError: '袩芯卸邪谢褍泄褋褌邪, 胁胁械写懈褌械 写芯锌褍褋褌懈屑芯械 屑邪泻褋懈屑邪谢褜薪芯械 泻芯谢懈褔械褋褌胁芯 褑懈泻谢芯胁, 芯褌 1 写芯 {{maxCount}}',
+      setLoopVariables: '校褋褌邪薪邪胁谢懈胁邪泄褌械 锌械褉械屑械薪薪褘械 胁 芯斜谢邪褋褌懈 胁懈写懈屑芯褋褌懈 褑懈泻谢邪',
+      currentLoop: '孝械泻褍褖懈泄 泻芯薪褌褍褉',
+      input: '袙胁芯写',
+      comma: ',',
+      loop_other: '{{count}} 笑懈泻谢芯胁',
+      currentLoopCount: '孝械泻褍褖械械 泻芯谢懈褔械褋褌胁芯 褑懈泻谢芯胁: {{count}}',
+      loop_one: '{{count}} 笑懈泻谢',
+      variableName: '袠屑褟 锌械褉械屑械薪薪芯泄',
+      totalLoopCount: '袨斜褖械械 泻芯谢懈褔械褋褌胁芯 褑懈泻谢芯胁: {{count}}',
+      loopNode: '笑懈泻谢懈褔械褋泻懈泄 褍蟹械谢',
+      errorResponseMethod: '袦械褌芯写 芯褌胁械褌邪 芯斜 芯褕懈斜泻械',
+      deleteTitle: '校写邪谢懈褌褜 褍蟹械谢 褑懈泻谢邪?',
+      error_one: '{{count}} 袨褕懈斜泻邪',
+      output: '袙褘褏芯写薪邪褟 锌械褉械屑械薪薪邪褟',
+      deleteDesc: '校写邪谢械薪懈械 褍蟹谢邪 褑懈泻谢邪 褍写邪谢懈褌 胁褋械 写芯褔械褉薪懈械 褍蟹谢褘.',
+      loopMaxCount: '袦邪泻褋懈屑邪谢褜薪芯械 泻芯谢懈褔械褋褌胁芯 懈褌械褉邪褑懈泄',
+      error_other: '{{count}} 袨褕懈斜芯泻',
+      breakConditionTip: '孝芯谢褜泻芯 锌械褉械屑械薪薪褘械 胁 褑懈泻谢邪褏 褋 褍褋谢芯胁懈褟屑懈 蟹邪胁械褉褕械薪懈褟 懈 锌械褉械屑械薪薪褘械 斜械褋械写褘 屑芯谐褍褌 斜褘褌褜 懈褋锌芯谢褜蟹芯胁邪薪褘.',
+      finalLoopVariables: '肖懈薪邪谢褜薪褘械 锌械褉械屑械薪薪褘械 褑懈泻谢邪',
+      initialLoopVariables: '袧邪褔邪谢褜薪褘械 锌械褉械屑械薪薪褘械 褑懈泻谢邪',
+      breakCondition: '校褋谢芯胁懈械 蟹邪胁械褉褕械薪懈褟 褑懈泻谢邪',
+      loopVariables: '笑懈泻谢懈褔械褋泻懈械 锌械褉械屑械薪薪褘械',
+    },
+  },
+  tracing: {
+    stopBy: '袨褋褌邪薪芯胁谢械薪芯 {{user}}',
+  },
+  variableReference: {
+    assignedVarsDescription: '袧邪蟹薪邪褔邪械屑褘械 锌械褉械屑械薪薪褘械 写芯谢卸薪褘 斜褘褌褜 写芯褋褌褍锌薪褘屑懈 写谢褟 蟹邪锌懈褋懈, 褌邪泻懈屑懈 泻邪泻',
+    noAssignedVars: '袧械褌 写芯褋褌褍锌薪褘褏 薪邪蟹薪邪褔械薪薪褘褏 锌械褉械屑械薪薪褘褏',
+    noVarsForOperation: '袩械褉械屑械薪薪褘械 写谢褟 锌褉懈褋胁芯械薪懈褟 胁褘斜褉邪薪薪芯泄 芯锌械褉邪褑懈懈 芯褌褋褍褌褋褌胁褍褞褌.',
+    conversationVars: '袩械褉械屑械薪薪褘械 斜械褋械写褘',
+    noAvailableVars: '袧械褌 写芯褋褌褍锌薪褘褏 锌械褉械屑械薪薪褘褏',
+  },
+  versionHistory: {
+    filter: {
+      onlyShowNamedVersions: '袩芯泻邪蟹褘胁邪褌褜 褌芯谢褜泻芯 懈屑械薪芯胁邪薪薪褘械 胁械褉褋懈懈',
+      all: '袙褋械',
+      reset: '小斜褉芯褋懈褌褜 褎懈谢褜褌褉',
+      onlyYours: '孝芯谢褜泻芯 褌胁芯泄',
+      empty: '袠褋褌芯褉懈褟 胁械褉褋懈泄 薪械 薪邪泄写械薪邪',
+    },
+    editField: {
+      titleLengthLimit: '袟邪谐芯谢芯胁芯泻 薪械 屑芯卸械褌 锌褉械胁褘褕邪褌褜 {{limit}} 褋懈屑胁芯谢芯胁',
+      releaseNotesLengthLimit: '袩褉懈屑械褔邪薪懈褟 泻 胁械褉褋懈懈 薪械 屑芯谐褍褌 锌褉械胁褘褕邪褌褜 {{limit}} 褋懈屑胁芯谢芯胁',
+      releaseNotes: '袧芯胁芯褋褌懈 褉械谢懈蟹邪',
+      title: '袟邪谐芯谢芯胁芯泻',
+    },
+    action: {
+      restoreSuccess: '袙械褉褋懈褟 胁芯褋褋褌邪薪芯胁谢械薪邪',
+      updateSuccess: '袙械褉褋懈褟 芯斜薪芯胁谢械薪邪',
+      deleteFailure: '袧械 褍写邪谢芯褋褜 褍写邪谢懈褌褜 胁械褉褋懈褞',
+      deleteSuccess: '袙械褉褋懈褟 褍写邪谢械薪邪',
+      updateFailure: '袧械 褍写邪谢芯褋褜 芯斜薪芯胁懈褌褜 胁械褉褋懈褞',
+      restoreFailure: '袧械 褍写邪谢芯褋褜 胁芯褋褋褌邪薪芯胁懈褌褜 胁械褉褋懈褞',
+    },
+    latest: '袩芯褋谢械写薪懈泄',
+    restorationTip: '袩芯褋谢械 胁芯褋褋褌邪薪芯胁谢械薪懈褟 胁械褉褋懈懈 褌械泻褍褖懈泄 褔械褉薪芯胁懈泻 斜褍写械褌 锌械褉械蟹邪锌懈褋邪薪.',
+    deletionTip: '校写邪谢械薪懈械 薪械芯斜褉邪褌懈屑芯, 锌芯卸邪谢褍泄褋褌邪, 锌芯写褌胁械褉写懈褌械.',
+    nameThisVersion: '袧邪蟹芯胁懈褌械 褝褌褍 胁械褉褋懈褞',
+    editVersionInfo: '袪械写邪泻褌懈褉芯胁邪褌褜 懈薪褎芯褉屑邪褑懈褞 芯 胁械褉褋懈懈',
+    title: '袙械褉褋懈懈',
+    currentDraft: '孝械泻褍褖懈泄 锌褉芯械泻褌',
+    releaseNotesPlaceholder: '袨锌懈褕懈褌械, 褔褌芯 懈蟹屑械薪懈谢芯褋褜',
+    defaultName: '袘械蟹 薪邪蟹胁邪薪懈褟 胁械褉褋懈褟',
+  },
+}
+
+export default translation
diff --git a/i18n/server.ts b/i18n/server.ts
new file mode 100644
index 0000000..9aeac29
--- /dev/null
+++ b/i18n/server.ts
@@ -0,0 +1,56 @@
+import { cookies, headers } from 'next/headers'
+import Negotiator from 'negotiator'
+import { match } from '@formatjs/intl-localematcher'
+
+import { createInstance } from 'i18next'
+import resourcesToBackend from 'i18next-resources-to-backend'
+import { initReactI18next } from 'react-i18next/initReactI18next'
+import { i18n } from '.'
+import type { Locale } from '.'
+
+// https://locize.com/blog/next-13-app-dir-i18n/
+const initI18next = async (lng: Locale, ns: string) => {
+  const i18nInstance = createInstance()
+  await i18nInstance
+    .use(initReactI18next)
+    .use(resourcesToBackend((language: string, namespace: string) => import(`./${language}/${namespace}.ts`)))
+    .init({
+      lng: lng === 'zh-Hans' ? 'zh-Hans' : lng,
+      ns,
+      fallbackLng: 'en-US',
+    })
+  return i18nInstance
+}
+
+export async function useTranslation(lng: Locale, ns = '', options: Record<string, any> = {}) {
+  const i18nextInstance = await initI18next(lng, ns)
+  return {
+    t: i18nextInstance.getFixedT(lng, ns, options.keyPrefix),
+    i18n: i18nextInstance,
+  }
+}
+
+export const getLocaleOnServer = async (): Promise<Locale> => {
+  const locales: string[] = i18n.locales
+
+  let languages: string[] | undefined
+  // get locale from cookie
+  const localeCookie = (await cookies()).get('locale')
+  languages = localeCookie?.value ? [localeCookie.value] : []
+
+  if (!languages.length) {
+    // Negotiator expects plain object so we need to transform headers
+    const negotiatorHeaders: Record<string, string> = {};
+    (await headers()).forEach((value, key) => (negotiatorHeaders[key] = value))
+    // Use negotiator and intl-localematcher to get best locale
+    languages = new Negotiator({ headers: negotiatorHeaders }).languages()
+  }
+
+  // Validate languages
+  if (!Array.isArray(languages) || languages.length === 0 || !languages.every(lang => typeof lang === 'string' && /^[\w-]+$/.test(lang)))
+    languages = [i18n.defaultLocale]
+
+  // match locale
+  const matchedLocale = match(languages, locales, i18n.defaultLocale) as Locale
+  return matchedLocale
+}
diff --git a/i18n/sl-SI/app-annotation.ts b/i18n/sl-SI/app-annotation.ts
new file mode 100644
index 0000000..07b175a
--- /dev/null
+++ b/i18n/sl-SI/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: 'Opombe',
+  name: 'Odgovor na opombo',
+  editBy: 'Odgovor je uredil {{author}}',
+  noData: {
+    title: 'Brez opomb',
+    description: 'Opombe lahko urejate med odpravljanjem napak v aplikaciji ali jih mno啪i膷no uvozite tukaj za visokokakovosten odgovor.',
+  },
+  table: {
+    header: {
+      question: 'vpra拧anje',
+      answer: 'odgovor',
+      createdAt: 'ustvarjeno ob',
+      hits: 'zadetki',
+      actions: 'dejanja',
+      addAnnotation: 'Dodaj opombo',
+      bulkImport: 'Mno啪i膷ni uvoz',
+      bulkExport: 'Mno啪i膷ni izvoz',
+      clearAll: 'Po膷isti vse opombe',
+    },
+  },
+  editModal: {
+    title: 'Uredi odgovor na opombo',
+    queryName: 'Uporabni拧ko vpra拧anje',
+    answerName: 'Pripovedovalec Bot',
+    yourAnswer: 'Va拧 odgovor',
+    answerPlaceholder: 'Vnesite svoj odgovor tukaj',
+    yourQuery: 'Va拧e vpra拧anje',
+    queryPlaceholder: 'Vnesite svoje vpra拧anje tukaj',
+    removeThisCache: 'Odstrani to opombo',
+    createdAt: 'Ustvarjeno ob',
+  },
+  addModal: {
+    title: 'Dodaj odgovor na opombo',
+    queryName: 'Vpra拧anje',
+    answerName: 'Odgovor',
+    answerPlaceholder: 'Vnesite odgovor tukaj',
+    queryPlaceholder: 'Vnesite vpra拧anje tukaj',
+    createNext: 'Dodaj 拧e en odgovor z opombo',
+  },
+  batchModal: {
+    title: 'Mno啪i膷ni uvoz',
+    csvUploadTitle: 'Povlecite in spustite svoj CSV datoteko tukaj ali ',
+    browse: 'poi拧膷ite',
+    tip: 'CSV datoteka mora ustrezati naslednji strukturi:',
+    question: 'vpra拧anje',
+    answer: 'odgovor',
+    contentTitle: 'vsebina fragmenta',
+    content: 'vsebina',
+    template: 'Prenesite predlogo tukaj',
+    cancel: 'Prekli膷i',
+    run: 'Za啪eni mno啪i膷no obdelavo',
+    runError: 'Napaka pri mno啪i膷nem zagonu',
+    processing: 'V mno啪i膷ni obdelavi',
+    completed: 'Uvoz zaklju膷en',
+    error: 'Napaka pri uvozu',
+    ok: 'V redu',
+  },
+  errorMessage: {
+    answerRequired: 'Odgovor je obvezen',
+    queryRequired: 'Vpra拧anje je obvezno',
+  },
+  viewModal: {
+    annotatedResponse: 'Odgovor na opombo',
+    hitHistory: 'Zgodovina zadetkov',
+    hit: 'Zadetek',
+    hits: 'Zadetki',
+    noHitHistory: 'Ni zgodovine zadetkov',
+  },
+  hitHistoryTable: {
+    query: 'Vpra拧anje',
+    match: 'Ujemanje',
+    response: 'Odgovor',
+    source: 'Vir',
+    score: 'Rezultat',
+    time: '膶as',
+  },
+  initSetup: {
+    title: 'Za膷etna nastavitev odgovora na opombo',
+    configTitle: 'Nastavitev odgovora na opombo',
+    confirmBtn: 'Shrani in omogo膷i',
+    configConfirmBtn: 'Shrani',
+  },
+  embeddingModelSwitchTip: 'Model za vektorizacijo besedila opomb, preklapljanje modelov bo ponovno vektoriziralo, kar bo povzro膷ilo dodatne stro拧ke.',
+}
+
+export default translation
diff --git a/i18n/sl-SI/app-api.ts b/i18n/sl-SI/app-api.ts
new file mode 100644
index 0000000..71365ef
--- /dev/null
+++ b/i18n/sl-SI/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'API Stre啪nik',
+  apiKey: 'API Klju膷',
+  status: 'Status',
+  disabled: 'Onemogo膷eno',
+  ok: 'V uporabi',
+  copy: 'Kopiraj',
+  copied: 'Kopirano',
+  regenerate: 'Regeneriraj',
+  play: 'Predvajaj',
+  pause: 'Premor',
+  playing: 'Predvajanje',
+  loading: 'Nalaganje',
+  merMaid: {
+    rerender: 'Ponovno izrisi',
+  },
+  never: 'Nikoli',
+  apiKeyModal: {
+    apiSecretKey: 'API Skrivni klju膷',
+    apiSecretKeyTips: 'Da bi prepre膷ili zlorabo API-ja, za拧膷itite svoj API klju膷. Izogibajte se uporabi v navadnem besedilu v sprednji kodi. :)',
+    createNewSecretKey: 'Ustvari nov skrivni klju膷',
+    secretKey: 'Skrivni klju膷',
+    created: 'USTVARJENO',
+    lastUsed: 'ZADNJA UPORABA',
+    generateTips: 'Hranite ta klju膷 na varnem in dostopnem mestu.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: 'Izbrisati ta skrivni klju膷?',
+    deleteConfirmTips: 'To dejanje ni mogo膷e razveljaviti.',
+    ok: 'V redu',
+  },
+  completionMode: {
+    title: 'API za dokon膷anje aplikacije',
+    info: 'Za visokokakovostno generiranje besedil, kot so 膷lanki, povzetki in prevodi, uporabite API za dokon膷anje sporo膷il z vnosom uporabnika. Generiranje besedil temelji na parametrih modela in predlogah pozivov, dolo膷enih v Dify Prompt Engineering.',
+    createCompletionApi: 'Ustvari sporo膷ilo o dokon膷anju',
+    createCompletionApiTip: 'Ustvari sporo膷ilo o dokon膷anju za podporo na膷inu vpra拧anj in odgovorov.',
+    inputsTips: '(Neobvezno) Navedite vnosna polja uporabnikov kot klju膷-vrednost pare, ki ustrezajo spremenljivkam v Prompt Eng. Klju膷 je ime spremenljivke, vrednost pa vrednost parametra. 膶e je vrsta polja Izberi, mora biti posredovana vrednost ena izmed vnaprej dolo膷enih mo啪nosti.',
+    queryTips: 'Vsebina besedila vnosa uporabnika.',
+    blocking: 'Vrsta blokiranja, 膷akanje na dokon膷anje izvajanja in vra膷anje rezultatov. (Zahteve se lahko prekinejo, 膷e je postopek dolg)',
+    streaming: 'streaming povratki. Implementacija povratkov pretakanja na podlagi SSE (Server-Sent Events).',
+    messageFeedbackApi: 'Povratne informacije o sporo膷ilih (v拧e膷)',
+    messageFeedbackApiTip: 'Ocenite prejeta sporo膷ila v imenu kon膷nih uporabnikov z v拧e膷ki ali nev拧e膷ki. Ti podatki so vidni na strani Dnevniki in opombe ter se uporabljajo za nadaljnje fino prilagajanje modela.',
+    messageIDTip: 'ID sporo膷ila',
+    ratingTip: 'v拧e膷 ali nev拧e膷, null je preklic',
+    parametersApi: 'Pridobite informacije o parametrih aplikacije',
+    parametersApiTip: 'Pridobite konfigurirane vhodne parametre, vklju膷no z imeni spremenljivk, imeni polj, vrstami in privzetimi vrednostmi. Obi膷ajno se uporablja za prikaz teh polj v obrazcu ali izpolnjevanje privzetih vrednosti po nalaganju odjemalca.',
+  },
+  chatMode: {
+    title: 'API za klepet aplikacije',
+    info: 'Za vsestranske pogovorne aplikacije, ki uporabljajo obliko vpra拧anj in odgovorov, pokli膷ite API za klepetna sporo膷ila, da za膷nete dialog. Ohranite teko膷e pogovore tako, da prenesete vrnjeni conversation_id. Parametri odgovorov in predloge so odvisni od nastavitev Dify Prompt Eng.',
+    createChatApi: 'Ustvari klepetno sporo膷ilo',
+    createChatApiTip: 'Ustvari novo pogovorno sporo膷ilo ali nadaljuj obstoje膷i pogovor.',
+    inputsTips: '(Neobvezno) Navedite vnosna polja uporabnikov kot klju膷-vrednost pare, ki ustrezajo spremenljivkam v Prompt Eng. Klju膷 je ime spremenljivke, vrednost pa vrednost parametra. 膶e je vrsta polja Izberi, mora biti posredovana vrednost ena izmed vnaprej dolo膷enih mo啪nosti.',
+    queryTips: 'Vsebina vnosa/uporabni拧kega vpra拧anja',
+    blocking: 'Vrsta blokiranja, 膷akanje na dokon膷anje izvajanja in vra膷anje rezultatov. (Zahteve se lahko prekinejo, 膷e je postopek dolg)',
+    streaming: 'streaming povratki. Implementacija povratkov pretakanja na podlagi SSE (Server-Sent Events).',
+    conversationIdTip: '(Neobvezno) ID pogovora: pustite prazno za prvi pogovor; prenesite conversation_id iz konteksta, da nadaljujete dialog.',
+    messageFeedbackApi: 'Povratne informacije kon膷nih uporabnikov o sporo膷ilu, v拧e膷',
+    messageFeedbackApiTip: 'Ocenite prejeta sporo膷ila v imenu kon膷nih uporabnikov z v拧e膷ki ali nev拧e膷ki. Ti podatki so vidni na strani Dnevniki in opombe ter se uporabljajo za nadaljnje fino prilagajanje modela.',
+    messageIDTip: 'ID sporo膷ila',
+    ratingTip: 'v拧e膷 ali nev拧e膷, null je preklic',
+    chatMsgHistoryApi: 'Pridobi zgodovino klepetnih sporo膷il',
+    chatMsgHistoryApiTip: 'Prva stran vrne najnovej拧e `limit` zapise, ki so v obratnem vrstnem redu.',
+    chatMsgHistoryConversationIdTip: 'ID pogovora',
+    chatMsgHistoryFirstId: 'ID prvega klepeta na trenutni strani. Privzeto ni.',
+    chatMsgHistoryLimit: 'Koliko klepetov je vrnjenih na eno zahtevo',
+    conversationsListApi: 'Pridobi seznam pogovorov',
+    conversationsListApiTip: 'Pridobi seznam sej trenutnega uporabnika. Privzeto je vrnjenih zadnjih 20 sej.',
+    conversationsListFirstIdTip: 'ID zadnjega zapisa na trenutni strani, privzeto ni.',
+    conversationsListLimitTip: 'Koliko klepetov je vrnjenih na eno zahtevo',
+    conversationRenamingApi: 'Preimenovanje pogovora',
+    conversationRenamingApiTip: 'Preimenujte pogovore; ime je prikazano v ve膷sejnih odjemalskih vmesnikih.',
+    conversationRenamingNameTip: 'Novo ime',
+    parametersApi: 'Pridobite informacije o parametrih aplikacije',
+    parametersApiTip: 'Pridobite konfigurirane vhodne parametre, vklju膷no z imeni spremenljivk, imeni polj, vrstami in privzetimi vrednostmi. Obi膷ajno se uporablja za prikaz teh polj v obrazcu ali izpolnjevanje privzetih vrednosti po nalaganju odjemalca.',
+  },
+  develop: {
+    requestBody: 'Telo zahteve',
+    pathParams: 'Parametri poti',
+    query: 'Poizvedba',
+    toc: 'Vsebino',
+  },
+}
+
+export default translation
diff --git a/i18n/sl-SI/app-debug.ts b/i18n/sl-SI/app-debug.ts
new file mode 100644
index 0000000..8672fa5
--- /dev/null
+++ b/i18n/sl-SI/app-debug.ts
@@ -0,0 +1,242 @@
+const translation = {
+  pageTitle: {
+    line1: 'PROMPT',
+    line2: 'In啪eniring',
+  },
+  orchestrate: 'Orkestriraj',
+  promptMode: {
+    simple: 'Preklopi na strokovni na膷in, da ureja拧 celoten PROMPT',
+    advanced: 'Strokovni na膷in',
+    switchBack: 'Preklopi nazaj',
+    advancedWarning: {
+      title: 'Preklopil si na strokovni na膷in. Ko spremeni拧 PROMPT, ne more拧 ve膷 preklopiti nazaj v osnovni na膷in.',
+      description: 'V strokovnem na膷inu lahko ureja拧 celoten PROMPT.',
+      learnMore: 'Preberi ve膷',
+      ok: 'V redu',
+    },
+    operation: {
+      addMessage: 'Dodaj sporo膷ilo',
+    },
+    contextMissing: 'Manjka komponenta konteksta, zato u膷inkovitost PROMPT-a morda ne bo najbolj拧a.',
+  },
+  operation: {
+    applyConfig: 'Objavi',
+    resetConfig: 'Ponastavi',
+    debugConfig: 'Odpravljanje napak',
+    addFeature: 'Dodaj funkcionalnost',
+    automatic: 'Generiraj',
+    stopResponding: 'Prenehaj odgovarjati',
+    agree: 'v拧e膷',
+    disagree: 'ni v拧e膷',
+    cancelAgree: 'Prekli膷i v拧e膷ek',
+    cancelDisagree: 'Prekli膷i nev拧e膷nost',
+    userAction: 'Uporabnik ',
+  },
+  notSetAPIKey: {
+    title: 'Klju膷 ponudnika LLM ni nastavljen',
+    trailFinished: 'Preizkus kon膷an',
+    description: 'Klju膷 ponudnika LLM ni nastavljen. Pred odpravljanjem napak je treba nastaviti klju膷.',
+    settingBtn: 'Pojdi v nastavitve',
+  },
+  trailUseGPT4Info: {
+    title: 'GPT-4 trenutno ni podprt',
+    description: 'Za uporabo GPT-4 je treba nastaviti API klju膷.',
+  },
+  feature: {
+    groupChat: {
+      title: 'Izbolj拧anje klepeta',
+      description: 'Dodajanje prednastavitev klepeta lahko izbolj拧a uporabni拧ko izku拧njo.',
+    },
+    groupExperience: {
+      title: 'Izbolj拧anje izku拧nje',
+    },
+    conversationOpener: {
+      title: 'Za膷etek pogovora',
+      description: 'V klepetu AI obi膷ajno za膷ne pogovor z uporabnikom z dobrodo拧lico.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: 'Nadaljnja vpra拧anja',
+      description: 'Nastavitev predlogov za naslednja vpra拧anja lahko uporabnikom izbolj拧a klepet.',
+      resDes: '3 predlogi za naslednje vpra拧anje uporabnika.',
+      tryToAsk: 'Poskusi vpra拧ati',
+    },
+    moreLikeThis: {
+      title: 'Ve膷 tak拧nih',
+      description: 'Ustvari ve膷 besedil naenkrat, nato pa jih urejaj in nadaljuj z ustvarjanjem.',
+      generateNumTip: '艩tevilo generacij vsaki膷',
+      tip: 'Uporaba te funkcije povzro膷a dodatno porabo 啪etonov.',
+    },
+    speechToText: {
+      title: 'Govor v besedilo',
+      description: 'Ko je omogo膷eno, lahko uporablja拧 glasovni vnos.',
+      resDes: 'Glasovni vnos je omogo膷en.',
+    },
+    textToSpeech: {
+      title: 'Besedilo v govor',
+      description: 'Ko je omogo膷eno, lahko besedilo pretvori拧 v govor.',
+      resDes: 'Pretvorba besedila v zvok je omogo膷ena.',
+    },
+    citation: {
+      title: 'Citati in pripisovanja',
+      description: 'Ko je omogo膷eno, prika啪i izvorni dokument in pripisani del generirane vsebine.',
+      resDes: 'Citati in pripisovanja so omogo膷eni.',
+    },
+    annotation: {
+      title: 'Odgovor z opombami',
+      description: 'Ro膷no lahko dodate visokokakovostne odgovore v predpomnilnik za prednostno ujemanje s podobnimi vpra拧anji uporabnikov.',
+      resDes: 'Odgovor z opombami je omogo膷en.',
+      scoreThreshold: {
+        title: 'Prag ujemanja',
+        description: 'Uporabljeno za nastavitev praga podobnosti za odgovor z opombami.',
+        easyMatch: 'Lahko ujemanje',
+        accurateMatch: 'Natan膷no ujemanje',
+      },
+      matchVariable: {
+        title: 'Spremenljivka za ujemanje',
+        choosePlaceholder: 'Izberi spremenljivko za ujemanje',
+      },
+      cacheManagement: 'Upravljanje opomb',
+      cached: 'Z opombo',
+      remove: 'Odstrani',
+      removeConfirm: 'Izbrisati to opombo?',
+      add: 'Dodaj opombo',
+      edit: 'Uredi opombo',
+    },
+    dataSet: {
+      title: 'Kontekst',
+      noData: 'Uvozi znanje kot kontekst',
+      words: 'Besede',
+      textBlocks: 'Bloki besedila',
+      selectTitle: 'Izberi referen膷no znanje',
+      selected: 'Izbrano znanje',
+      noDataSet: 'Znanje ni bilo najdeno',
+      toCreate: 'Pojdi na ustvarjanje',
+      notSupportSelectMulti: 'Trenutno je podprto le eno znanje',
+      queryVariable: {
+        title: 'Spremenljivka poizvedbe',
+        tip: 'Ta spremenljivka bo uporabljena kot vnos poizvedbe za pridobitev kontekstnih informacij.',
+        choosePlaceholder: 'Izberi spremenljivko poizvedbe',
+        noVar: 'Ni spremenljivk',
+        noVarTip: 'ustvari spremenljivko v razdelku Spremenljivke',
+        unableToQueryDataSet: 'Neuspe拧na poizvedba po znanju',
+        unableToQueryDataSetTip: 'Neuspe拧na poizvedba po znanju, izberi spremenljivko poizvedbe v razdelku kontekst.',
+        ok: 'V redu',
+        contextVarNotEmpty: 'Spremenljivka poizvedbe ne sme biti prazna',
+        deleteContextVarTitle: 'Izbrisati spremenljivko 鈥渰{varName}}鈥�?',
+        deleteContextVarTip: 'Ta spremenljivka je nastavljena kot spremenljivka za poizvedbo po kontekstu. 膶e jo odstrani拧, bo to vplivalo na uporabo znanja. 膶e jo 啪eli拧 izbrisati, ponovno izberi v razdelku kontekst.',
+      },
+    },
+    tools: {
+      title: 'Orodja',
+      tips: 'Orodja nudijo standardiziran na膷in klicanja API-jev, pri 膷emer se uporabni拧ki vnos ali spremenljivke uporabijo kot parametri za poizvedovanje zunanjih podatkov.',
+      toolsInUse: '{{count}} orodij v uporabi',
+      modal: {
+        title: 'Orodje',
+        toolType: {
+          title: 'Tip orodja',
+          placeholder: 'Izberi tip orodja',
+        },
+        name: {
+          title: 'Ime',
+          placeholder: 'Vnesi ime',
+        },
+        variableName: {
+          title: 'Ime spremenljivke',
+          placeholder: 'Vnesi ime spremenljivke',
+        },
+      },
+    },
+    conversationHistory: {
+      title: 'Zgodovina pogovorov',
+      description: 'Nastavi predpone imen za vloge v pogovoru',
+      tip: 'Zgodovina pogovorov ni omogo膷ena. Dodaj <histories> v zgornji PROMPT.',
+      learnMore: 'Preberi ve膷',
+      editModal: {
+        title: 'Uredi imena vlog v pogovoru',
+        userPrefix: 'Predpona uporabnika',
+        assistantPrefix: 'Predpona pomo膷nika',
+      },
+    },
+    toolbox: {
+      title: 'ORODJA',
+    },
+    moderation: {
+      title: 'Moderiranje vsebine',
+      description: 'Zagotovi varno izhodno vsebino s pomo膷jo API-ja za moderiranje ali vzdr啪evanja seznama ob膷utljivih besed.',
+      allEnabled: 'VSEBINA VNOSA/IZHODA omogo膷ena',
+      inputEnabled: 'VSEBINA VNOSA omogo膷ena',
+      outputEnabled: 'VSEBINA IZHODA omogo膷ena',
+      modal: {
+        title: 'Nastavitve moderiranja vsebine',
+        provider: {
+          title: 'Ponudnik',
+          openai: 'OpenAI Moderiranje',
+          openaiTip: {
+            prefix: 'OpenAI Moderiranje zahteva nastavljen API klju膷 pri ',
+            suffix: '.',
+          },
+          keywords: 'Klju膷ne besede',
+        },
+        keywords: {
+          tip: 'Vsaka beseda na lastni vrstici, lo膷ena z vrsticami. Najve膷 100 znakov na vrstico.',
+          placeholder: 'Vsaka beseda na lastni vrstici, lo膷ena z vrsticami',
+          line: 'Vrstica',
+        },
+        content: {
+          input: 'Moderiraj VSEBINO VNOSA',
+          output: 'Moderiraj VSEBINO IZHODA',
+        },
+      },
+    },
+    debug: {
+      title: 'Odpravljanje napak',
+      description: 'Debugiranje omogo膷a pregled podrobnih informacij, kot so podatki API-jev, vklop dnevnikov, opozorila in 拧e ve膷.',
+    },
+    agent: {
+      title: 'Pomo膷nik',
+      description: 'Osnovne informacije in odgovorne naloge pomo膷nika.',
+      prompts: 'Temeljni PROMPT',
+      message: {
+        title: 'Vrstice sporo膷ila',
+        user: 'Uporabnik',
+        assistant: 'Pomo膷nik',
+      },
+    },
+    history: {
+      title: 'Zgodovina',
+      notFound: 'Zgodovina ni bila najdena',
+      notOpen: 'Zgodovina ni odprta',
+    },
+    prompt: {
+      title: 'Vsebina PROMPT-a',
+    },
+    message: {
+      title: 'Sporo膷ilo',
+      description: 'Na膷in nastavitve formatiranega pogovora.',
+      tryChat: 'Preizkusi klepet',
+    },
+    theme: {
+      title: 'Tema',
+      themes: {
+        default: 'Osnovna tema',
+        light: 'Svetla tema',
+        dark: 'Temna tema',
+        custom: 'Prilagodi temo',
+      },
+      modal: {
+        title: 'Nastavitve teme',
+        primaryColor: {
+          title: 'Primarna barva',
+          placeholder: 'Izberi primarno barvo',
+        },
+        textColor: {
+          title: 'Barva besedila',
+          placeholder: 'Izberi barvo besedila',
+        },
+        ok: 'V redu',
+      },
+    },
+  },
+}
+
+module.exports = translation
diff --git a/i18n/sl-SI/app-log.ts b/i18n/sl-SI/app-log.ts
new file mode 100644
index 0000000..d8c9509
--- /dev/null
+++ b/i18n/sl-SI/app-log.ts
@@ -0,0 +1,98 @@
+const translation = {
+  title: 'Dnevniki',
+  description: 'Dnevniki bele啪ijo stanje delovanja aplikacije, vklju膷no z vnosi uporabnikov in odgovori umetne inteligence.',
+  dateTimeFormat: 'DD.MM.YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: '膶as posodobitve',
+      time: '膶as ustvarjanja',
+      endUser: 'Kon膷ni uporabnik ali ra膷un',
+      input: 'Vnos',
+      output: 'Izhod',
+      summary: 'Naslov',
+      messageCount: '艩tevilo sporo膷il',
+      userRate: 'Ocena uporabnika',
+      adminRate: 'Ocena operaterja',
+      startTime: 'ZA膶ETNI 膶AS',
+      status: 'STATUS',
+      runtime: '膶AS DELOVANJA',
+      tokens: '沤ETONI',
+      user: 'Kon膷ni uporabnik ali ra膷un',
+      version: 'VERZIJA',
+    },
+    pagination: {
+      previous: 'Prej拧nja',
+      next: 'Naslednja',
+    },
+    empty: {
+      noChat: '艩e ni pogovora',
+      noOutput: 'Ni izhoda',
+      element: {
+        title: 'Je kdo tam?',
+        content: 'Opazujte in ozna膷ite interakcije med kon膷nimi uporabniki in aplikacijami umetne inteligence, da stalno izbolj拧ujete natan膷nost AI. Lahko <shareLink>delite</shareLink> ali <testLink>preizkusite</testLink> spletno aplikacijo sami, nato pa se vrnete na to stran.',
+      },
+    },
+  },
+  detail: {
+    time: '膶as',
+    conversationId: 'ID pogovora',
+    promptTemplate: 'Predloga PROMPT-a',
+    promptTemplateBeforeChat: 'Predloga PROMPT-a pred pogovorom 路 Kot sistemsko sporo膷ilo',
+    annotationTip: 'Izbolj拧ave, ki jih je ozna膷il {{user}}',
+    timeConsuming: 'Porabljen 膷as',
+    second: 's',
+    tokenCost: 'Porabljeni 啪etoni',
+    loading: 'nalaganje',
+    operation: {
+      like: 'v拧e膷',
+      dislike: 'ni v拧e膷',
+      addAnnotation: 'Dodaj izbolj拧avo',
+      editAnnotation: 'Uredi izbolj拧avo',
+      annotationPlaceholder: 'Vnesite pri膷akovan odgovor, ki ga 啪elite, da AI odgovori, kar se lahko uporabi za izbolj拧anje modela in kakovosti generiranja besedil v prihodnje.',
+    },
+    variables: 'Spremenljivke',
+    uploadImages: 'Nalo啪ene slike',
+    modelParams: 'Parametri modela',
+  },
+  filter: {
+    period: {
+      today: 'Danes',
+      last7days: 'Zadnjih 7 dni',
+      last4weeks: 'Zadnje 4 tedne',
+      last3months: 'Zadnji 3 meseci',
+      last12months: 'Zadnjih 12 mesecev',
+      monthToDate: 'Mesec do danes',
+      quarterToDate: '膶etrtletje do danes',
+      yearToDate: 'Leto do danes',
+      allTime: 'Vse obdobje',
+    },
+    annotation: {
+      all: 'Vse',
+      annotated: 'Ozna膷ene izbolj拧ave ({{count}} elementov)',
+      not_annotated: 'Neozna膷ene',
+    },
+    sortBy: 'Razvrsti po:',
+    descending: 'padajo膷e',
+    ascending: 'nara拧膷ajo膷e',
+  },
+  workflowTitle: 'Dnevniki poteka dela',
+  workflowSubtitle: 'Dnevnik bele啪i delovanje avtomatizacije.',
+  runDetail: {
+    title: 'Dnevnik pogovora',
+    workflowTitle: 'Podrobnosti dnevnika',
+    fileListDetail: 'Podrobnosti',
+    fileListLabel: 'Podrobnosti o datoteki',
+  },
+  promptLog: 'Dnevnik PROMPT-ov',
+  agentLog: 'Dnevnik pomo膷nika',
+  viewLog: 'Ogled dnevnika',
+  agentLogDetail: {
+    agentMode: 'Na膷in pomo膷nika',
+    toolUsed: 'Uporabljeno orodje',
+    iterations: 'Iteracije',
+    iteration: 'Iteracija',
+    finalProcessing: 'Kon膷na obdelava',
+  },
+}
+
+export default translation
diff --git a/i18n/sl-SI/app-overview.ts b/i18n/sl-SI/app-overview.ts
new file mode 100644
index 0000000..8d57730
--- /dev/null
+++ b/i18n/sl-SI/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: 'Za膷nite s tem, da',
+    enterKeyTip: 'vnesete svoj OpenAI API klju膷 spodaj',
+    getKeyTip: 'Pridobite svoj API klju膷 na nadzorni plo拧膷i OpenAI',
+    placeholder: 'Va拧 OpenAI API klju膷 (npr. sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: 'Uporabljate {{providerName}} poskusno kvoto.',
+        description: 'Poskusna kvota je namenjena va拧emu testiranju. Preden se kvota iz膷rpa, nastavite lastnega ponudnika modela ali kupite dodatno kvoto.',
+      },
+      exhausted: {
+        title: 'Va拧a poskusna kvota je bila porabljena, nastavite API klju膷.',
+        description: 'Porabili ste svojo poskusno kvoto. Prosimo, nastavite lastnega ponudnika modela ali kupite dodatno kvoto.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: 'Za za膷etek,',
+        row2: 'najprej nastavite svojega ponudnika modela.',
+      },
+    },
+    callTimes: '艩tevilo klicev',
+    usedToken: 'Porabljeni 啪etoni',
+    setAPIBtn: 'Pojdi na nastavitev ponudnika modela',
+    tryCloud: 'Ali preizkusite obla膷no razli膷ico Dify s prosto kvoto',
+  },
+  overview: {
+    title: 'Pregled',
+    appInfo: {
+      explanation: 'Pripravljena AI spletna aplikacija',
+      accessibleAddress: 'Javni URL',
+      preview: 'Predogled',
+      regenerate: 'Ustvari ponovno',
+      regenerateNotice: 'Ali 啪elite ponovno ustvariti javni URL?',
+      preUseReminder: 'Pred nadaljevanjem omogo膷ite spletno aplikacijo.',
+      settings: {
+        entry: 'Nastavitve',
+        title: 'Nastavitve spletne aplikacije',
+        webName: 'Ime spletne aplikacije',
+        webDesc: 'Opis spletne aplikacije',
+        webDescTip: 'Besedilo bo prikazano na strani za stranke in bo zagotavljalo osnovna navodila za uporabo aplikacije',
+        webDescPlaceholder: 'Vnesite opis spletne aplikacije',
+        language: 'Jezik',
+        workflow: {
+          title: 'Potek dela',
+          subTitle: 'Podrobnosti poteka dela',
+          show: 'Prika啪i',
+          hide: 'Skrij',
+          showDesc: 'Poka啪ite ali skrijte podrobnosti poteka dela v spletni aplikaciji',
+        },
+        chatColorTheme: 'Barvna tema klepeta',
+        chatColorThemeDesc: 'Nastavite barvno temo klepetalnega bota',
+        chatColorThemeInverted: 'Inverzna',
+        invalidHexMessage: 'Neveljavna vrednost heksa',
+        invalidPrivacyPolicy: 'Neveljavna povezava do pravilnika o zasebnosti. Uporabite veljavno povezavo, ki se za膷ne z http ali https',
+        sso: {
+          label: 'SSO avtentikacija',
+          title: 'SSO spletne aplikacije',
+          description: 'Vsi uporabniki morajo pred uporabo spletne aplikacije opraviti prijavo preko SSO',
+          tooltip: 'Za omogo膷itev SSO za spletno aplikacijo se obrnite na skrbnika',
+        },
+        more: {
+          entry: 'Prika啪i ve膷 nastavitev',
+          copyright: 'Avtorske pravice',
+          copyRightPlaceholder: 'Vnesite ime avtorja ali organizacije',
+          privacyPolicy: 'Politika zasebnosti',
+          privacyPolicyPlaceholder: 'Vnesite povezavo do politike zasebnosti',
+          privacyPolicyTip: 'Pomaga obiskovalcem razumeti, katere podatke aplikacija zbira, glejte <privacyPolicyLink>politiko zasebnosti</privacyPolicyLink> Dify.',
+          customDisclaimer: 'Prilagojena izjava o omejitvi odgovornosti',
+          customDisclaimerPlaceholder: 'Vnesite prilagojeno izjavo o omejitvi odgovornosti',
+          customDisclaimerTip: 'Prilagojeno izjavo o omejitvi odgovornosti bo prikazano na strani za stranke, ki bo zagotavljala dodatne informacije o aplikaciji',
+          copyrightTip: 'Prikaz informacij o avtorskih pravicah v spletni aplikaciji',
+          copyrightTooltip: 'Prosimo, nadgradite na paket Professional ali vi拧ji',
+        },
+        modalTip: 'Nastavitve spletne aplikacije na strani odjemalca.',
+      },
+      embedded: {
+        entry: 'Vdelano',
+        title: 'Vdelava na spletno stran',
+        explanation: 'Izberite na膷in vdelave klepeta na svojo spletno stran',
+        iframe: 'Za dodajanje klepeta kjerkoli na va拧i spletni strani dodajte to iframe v va拧o HTML kodo.',
+        scripts: 'Za dodajanje klepeta na spodnji desni del va拧e spletne strani dodajte to kodo v va拧o HTML kodo.',
+        chromePlugin: 'Namestite Dify Chatbot raz拧iritev za Chrome',
+        copied: 'Kopirano',
+        copy: 'Kopiraj',
+      },
+      qrcode: {
+        title: 'Povezava QR koda',
+        scan: 'Skeniraj za deljenje',
+        download: 'Prenesi QR kodo',
+      },
+      customize: {
+        way: 'na膷in',
+        entry: 'Prilagodi',
+        title: 'Prilagodi AI spletno aplikacijo',
+        explanation: 'Lahko prilagodite sprednji del spletne aplikacije, da ustreza va拧im scenarijem in potrebam po slogu.',
+        way1: {
+          name: 'Forkajte kodo stranke, jo spremenite in namestite na Vercel (priporo膷eno)',
+          step1: 'Forkajte kodo stranke in jo spremenite',
+          step1Tip: 'Kliknite tukaj, da forknite izvorno kodo v svoj GitHub ra膷un in spremenite kodo',
+          step1Operation: 'Dify-WebClient',
+          step2: 'Namestite na Vercel',
+          step2Tip: 'Kliknite tukaj, da uvozite repozitorij v Vercel in namestite',
+          step2Operation: 'Uvoz repozitorija',
+          step3: 'Konfigurirajte spremenljivke okolja',
+          step3Tip: 'Dodajte naslednje spremenljivke okolja v Vercel',
+        },
+        way2: {
+          name: 'Napi拧ite kodo na strani stranke za klic API-ja in jo namestite na stre啪nik',
+          operation: 'Dokumentacija',
+        },
+      },
+      launch: 'Za膷etek',
+    },
+    apiInfo: {
+      title: 'API storitev v ozadju',
+      explanation: 'Enostavna integracija v va拧o aplikacijo',
+      accessibleAddress: 'API kon膷na to膷ka storitve',
+      doc: 'API referenca',
+    },
+    status: {
+      running: 'V storitvi',
+      disable: 'Onemogo膷eno',
+    },
+  },
+  analysis: {
+    title: 'Analiza',
+    ms: 'ms',
+    tokenPS: '沤etoni/s',
+    totalMessages: {
+      title: 'Skupno 拧tevilo sporo膷il',
+      explanation: '艩tevilo dnevnih AI interakcij.',
+    },
+    totalConversations: {
+      title: 'Skupno 拧tevilo pogovorov',
+      explanation: '艩tevilo dnevnih AI pogovorov; in啪eniring promptov/debugging izklju膷eno.',
+    },
+    activeUsers: {
+      title: 'Aktivni uporabniki',
+      explanation: 'Unikatni uporabniki, ki sodelujejo v vpra拧anjih in odgovorih z AI; in啪eniring promptov/debugging izklju膷eno.',
+    },
+    tokenUsage: {
+      title: 'Poraba 啪etonov',
+      explanation: 'Odzrcaljuje dnevno porabo 啪etonov jezikovnega modela za aplikacijo, uporabno za namene nadzora stro拧kov.',
+      consumed: 'Porabljeni',
+    },
+    avgSessionInteractions: {
+      title: 'Povpre膷ne interakcije v seji',
+      explanation: '艩tevilo neprekinjenih komunikacij med uporabnikom in AI; za aplikacije, ki temeljijo na pogovoru.',
+    },
+    avgUserInteractions: {
+      title: 'Povpre膷ne interakcije uporabnika',
+      explanation: 'Odzrcaljuje dnevno pogostost uporabe uporabnikov. Ta metrika odra啪a vezanost uporabnikov.',
+    },
+    userSatisfactionRate: {
+      title: 'Stopnja zadovoljstva uporabnikov',
+      explanation: '艩tevilo v拧e膷kov na 1.000 sporo膷il. To ka啪e dele啪 odgovorov, s katerimi so uporabniki zelo zadovoljni.',
+    },
+    avgResponseTime: {
+      title: 'Povpre膷ni odzivni 膷as',
+      explanation: '膶as (v ms) za obdelavo/odgovor AI; za aplikacije, ki temeljijo na besedilu.',
+    },
+    tps: {
+      title: 'Hitrost izhoda 啪etonov',
+      explanation: 'Merite u膷inkovitost LLM. 艩teje hitrost izhoda 啪etonov od za膷etka zahteve do zaklju膷ka izhoda.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/sl-SI/app.ts b/i18n/sl-SI/app.ts
new file mode 100644
index 0000000..bff7f2a
--- /dev/null
+++ b/i18n/sl-SI/app.ts
@@ -0,0 +1,214 @@
+const translation = {
+  createApp: 'USTVARI APLIKACIJO',
+  types: {
+    all: 'Vse',
+    chatbot: 'Klepetalnik',
+    agent: 'Agent',
+    workflow: 'Potek dela',
+    completion: 'Dopolnjevanje',
+    advanced: 'Tok klepeta',
+    basic: 'Osnoven',
+  },
+  duplicate: 'Podvoji',
+  duplicateTitle: 'Podvoji aplikacijo',
+  export: 'Izvozi DSL',
+  exportFailed: 'Izvoz DSL ni uspel.',
+  importDSL: 'Uvozi datoteko DSL',
+  createFromConfigFile: 'Ustvari iz datoteke DSL',
+  importFromDSL: 'Uvozi iz DSL',
+  importFromDSLFile: 'Iz datoteke DSL',
+  importFromDSLUrl: 'Iz URL-ja',
+  importFromDSLUrlPlaceholder: 'Tukaj prilepi povezavo DSL',
+  deleteAppConfirmTitle: 'Izbri拧em to aplikacijo?',
+  deleteAppConfirmContent:
+    'Brisanje aplikacije je nepopravljivo. Uporabniki ne bodo ve膷 imeli dostopa do va拧e aplikacije, vse konfiguracije in dnevniki pa bodo trajno izbrisani.',
+  appDeleted: 'Aplikacija izbrisana',
+  appDeleteFailed: 'Brisanje aplikacije ni uspelo',
+  join: 'Pridru啪i se skupnosti',
+  communityIntro:
+    'Pogovarjajte se s 膷lani ekipe, sodelavci in razvijalci na razli膷nih kanalih.',
+  roadmap: 'Oglejte si na拧 na膷rt',
+  newApp: {
+    startFromBlank: 'Ustvari iz ni膷',
+    startFromTemplate: 'Ustvari iz predloge',
+    captionAppType: 'Kak拧no aplikacijo 啪elite ustvariti?',
+    chatbotDescription: 'Zgradite aplikacijo, ki temelji na klepetu. Ta aplikacija uporablja format vpra拧anj in odgovorov, ki omogo膷a ve膷 krogov neprekinjenega pogovora.',
+    completionDescription: 'Zgradite aplikacijo, ki na podlagi pozivov generira visokokakovostno besedilo, kot je ustvarjanje 膷lankov, povzetkov, prevodov in ve膷.',
+    completionWarning: 'Ta vrsta aplikacije ne bo ve膷 podprta.',
+    agentDescription: 'Zgradite inteligentnega agenta, ki lahko samostojno izbere orodja za dokon膷anje nalog.',
+    workflowDescription: 'Zgradite aplikacijo, ki generira visokokakovostno besedilo na podlagi orkestracije poteka dela z visoko stopnjo prilagodljivosti. Primerna je za izku拧ene uporabnike.',
+    workflowWarning: 'Trenutno v beta razli膷ici',
+    chatbotType: 'Metoda orkestracije klepetalnika',
+    basic: 'Osnovno',
+    basicTip: 'Za za膷etnike, lahko kasneje preklopite na Chatflow',
+    basicFor: 'ZA ZA膶ETNIKE',
+    basicDescription: 'Osnovna orkestracija omogo膷a orkestracijo aplikacije klepetalnika z enostavnimi nastavitvami, brez mo啪nosti spreminjanja vgrajenih pozivov. Primerna je za za膷etnike.',
+    advanced: 'Chatflow',
+    advancedFor: 'Za napredne uporabnike',
+    advancedDescription: 'Orkestracija poteka dela orkestrira klepetalnike v obliki potekov dela, ki ponuja visoko stopnjo prilagodljivosti, vklju膷no z mo啪nostjo urejanja vgrajenih pozivov. Primerna je za izku拧ene uporabnike.',
+    captionName: 'Ikona in ime aplikacije',
+    appNamePlaceholder: 'Poimenujte svojo aplikacijo',
+    captionDescription: 'Opis',
+    appDescriptionPlaceholder: 'Vnesite opis aplikacije',
+    useTemplate: 'Uporabi to predlogo',
+    previewDemo: 'Predogled demo razli膷ice',
+    chatApp: 'Pomo膷nik',
+    chatAppIntro:
+      '沤elim zgraditi aplikacijo, ki temelji na klepetu. Ta aplikacija uporablja format vpra拧anj in odgovorov, ki omogo膷a ve膷 krogov neprekinjenega pogovora.',
+    agentAssistant: 'Novi pomo膷nik agenta',
+    completeApp: 'Generator besedila',
+    completeAppIntro:
+      '沤elim ustvariti aplikacijo, ki na podlagi pozivov generira visokokakovostno besedilo, kot je ustvarjanje 膷lankov, povzetkov, prevodov in ve膷.',
+    showTemplates: '沤elim izbrati iz predloge',
+    hideTemplates: 'Vrni se na izbiro na膷ina',
+    Create: 'Ustvari',
+    Cancel: 'Prekli膷i',
+    nameNotEmpty: 'Ime ne sme biti prazno',
+    appTemplateNotSelected: 'Izberite predlogo',
+    appTypeRequired: 'Izberite vrsto aplikacije',
+    appCreated: 'Aplikacija ustvarjena',
+    appCreateFailed: 'Ustvarjanje aplikacije ni uspelo',
+    appCreateDSLErrorTitle: 'Nezdru啪ljivost razli膷ice',
+    caution: 'Previdnost',
+    Confirm: 'Potrditi',
+    appCreateDSLErrorPart1: 'Odkrita je bila pomembna razlika v razli膷icah DSL. Vsiljevanje uvoza lahko povzro膷i nepravilno delovanje aplikacije.',
+    appCreateDSLErrorPart3: 'Trenutna razli膷ica aplikacije DSL:',
+    appCreateDSLErrorPart4: 'Sistemsko podprta razli膷ica DSL:',
+    appCreateDSLWarning: 'Pozor: Razlika v razli膷ici DSL lahko vpliva na nekatere funkcije',
+    appCreateDSLErrorPart2: '沤elite nadaljevati?',
+    advancedShortDescription: 'Potek dela za zapletene dialoge z ve膷 obrati s pomnilnikom',
+    noAppsFound: 'Ni bilo najdenih aplikacij',
+    agentShortDescription: 'Inteligentni agent z razmi拧ljanjem in avtonomno uporabo orodij',
+    foundResult: '{{拧tetje}} Rezultat',
+    foundResults: '{{拧tetje}} Rezultati',
+    noTemplateFoundTip: 'Poskusite iskati z razli膷nimi klju膷nimi besedami.',
+    optional: 'Neobvezno',
+    forBeginners: 'ZA ZA膶ETNIKE',
+    forAdvanced: 'ZA NAPREDNE UPORABNIKE',
+    noIdeaTip: 'Nimate idej? Oglejte si na拧e predloge',
+    agentUserDescription: 'Inteligentni agent, ki je sposoben iterativnega sklepanja in avtonomne uporabe orodij za doseganje ciljev nalog.',
+    completionShortDescription: 'Pomo膷nik AI za naloge generiranja besedila',
+    chatbotUserDescription: 'Hitro zgradite chatbota, ki temelji na LLM, s preprosto konfiguracijo. Na Chatflow lahko preklopite pozneje.',
+    completionUserDescription: 'Hitro ustvarite pomo膷nika AI za naloge ustvarjanja besedila s preprosto konfiguracijo.',
+    advancedUserDescription: 'Orkestracija poteka dela za ve膷kro啪ne zapletene dialogske naloge s pomnilni拧kimi zmogljivostmi.',
+    workflowUserDescription: 'Orkestracija poteka dela za enojna opravila, kot sta avtomatizacija in paketna obdelava.',
+    noTemplateFound: 'Predloge niso bile najdene',
+    workflowShortDescription: 'Orkestracija za opravila avtomatizacije z enim obratom',
+    chatbotShortDescription: 'Chatbot, ki temelji na LLM, s preprosto nastavitvijo',
+    chooseAppType: 'Izberite vrsto aplikacije',
+    learnMore: 'Izvedi ve膷',
+  },
+  editApp: 'Uredi informacije',
+  editAppTitle: 'Uredi informacije o aplikaciji',
+  editDone: 'Informacije o aplikaciji posodobljene',
+  editFailed: 'Posodobitev informacij o aplikaciji ni uspela',
+  iconPicker: {
+    ok: 'V redu',
+    cancel: 'Prekli膷i',
+    emoji: 'Emoji',
+    image: 'Slika',
+  },
+  answerIcon: {
+    title: 'Uporabite ikono WebApp za zamenjavo 馃',
+    description: 'Ali uporabiti ikono WebApp za zamenjavo 馃 v deljeni aplikaciji',
+    descriptionInExplore: 'Ali uporabiti ikono WebApp za zamenjavo 馃 v razdelku Razi拧膷i',
+  },
+  switch: 'Preklopi na Workflow Orchestrate',
+  switchTipStart: 'Za vas bo ustvarjena nova kopija aplikacije, ki bo preklopila na Workflow Orchestrate. Nova kopija ne bo ',
+  switchTip: 'dovolila',
+  switchTipEnd: ' preklopa nazaj na Basic Orchestrate.',
+  switchLabel: 'Kopija aplikacije, ki bo ustvarjena',
+  removeOriginal: 'Izbri拧i izvirno aplikacijo',
+  switchStart: 'Za膷ni preklop',
+  typeSelector: {
+    all: 'VSE VRSTE',
+    chatbot: 'Klepetalnik',
+    agent: 'Agent',
+    workflow: 'Potek dela',
+    completion: 'Dopolnjevanje',
+    advanced: 'Tok klepeta',
+  },
+  tracing: {
+    title: 'Sledenje uspe拧nosti aplikacije',
+    description: 'Konfiguracija ponudnika LLMOps tretje osebe in sledenje uspe拧nosti aplikacije.',
+    config: 'Konfiguracija',
+    view: 'Ogled',
+    collapse: 'Strni',
+    expand: 'Raz拧iri',
+    tracing: 'Sledenje',
+    disabled: 'Onemogo膷eno',
+    disabledTip: 'Najprej konfigurirajte ponudnika',
+    enabled: 'V storitvi',
+    tracingDescription: 'Zajem celotnega konteksta izvajanja aplikacije, vklju膷no s klici LLM, kontekstom, pozivi, zahtevami HTTP in 拧e ve膷, na platformo za sledenje tretje osebe.',
+    configProviderTitle: {
+      configured: 'Konfigurirano',
+      notConfigured: 'Konfigurirajte ponudnika za omogo膷anje sledenja',
+      moreProvider: 'Ve膷 ponudnikov',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: 'Vse-v-enem razvijalska platforma za vsak korak 啪ivljenjskega cikla aplikacije, ki jo poganja LLM.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: 'Sledi, vrednoti, upravlja pozive in meri za odpravljanje napak in izbolj拧anje va拧e aplikacije LLM.',
+    },
+    inUse: 'V uporabi',
+    configProvider: {
+      title: 'Konfiguracija',
+      placeholder: 'Vnesite va拧 {{key}}',
+      project: 'Projekt',
+      publicKey: 'Javni klju膷',
+      secretKey: 'Skrivni klju膷',
+      viewDocsLink: 'Ogled dokumentov {{key}}',
+      removeConfirmTitle: 'Odstraniti konfiguracijo {{key}}?',
+      removeConfirmContent: 'Trenutna konfiguracija je v uporabi, odstranitev bo onemogo膷ila funkcijo sledenja.',
+    },
+    opik: {
+      description: 'Opik je odprtokodna platforma za ocenjevanje, testiranje in spremljanje aplikacij LLM.',
+      title: 'Opik',
+    },
+    weave: {
+      title: 'Tkanje',
+      description: 'Weave je odprtokodna platforma za vrednotenje, testiranje in spremljanje aplikacij LLM.',
+    },
+  },
+  mermaid: {
+    handDrawn: 'Ro膷no narisano',
+    classic: 'Klasi膷en',
+  },
+  openInExplore: 'Odpri v razi拧膷i',
+  newAppFromTemplate: {
+    sidebar: {
+      Programming: 'Programiranje',
+      Recommended: 'Priporo膷ljivo',
+      Writing: 'Pisanje',
+      Assistant: 'Pomo膷nik',
+      Workflow: 'Potek dela',
+      HR: 'HR',
+      Agent: 'Agent',
+    },
+    byCategories: 'PO KATEGORIJAH',
+    searchAllTemplate: 'Prei拧膷i vse predloge ...',
+  },
+  showMyCreatedAppsOnly: 'Prika啪i samo aplikacije, ki sem jih ustvaril',
+  appSelector: {
+    params: 'PARAMETRI APLIKACIJE',
+    noParams: 'Parametri niso potrebni',
+    label: 'APL',
+    placeholder: 'Izberite aplikacijo ...',
+  },
+  structOutput: {
+    configure: 'Konfiguriraj',
+    structured: 'Strukturirano',
+    modelNotSupported: 'Model ni podprt',
+    required: 'Zahtevano',
+    moreFillTip: 'Prikazovanje najve膷 10 ravni gnezdenja',
+    LLMResponse: 'LLM odziv',
+    notConfiguredTip: 'Strukturiranega izhoda 拧e ni mogo膷e konfigurirati',
+    modelNotSupportedTip: 'Trenutni model ne podpira te funkcije in se samodejno zni啪a na vbrizgavanje pozivov.',
+    structuredTip: 'Strukturirani izhodi so funkcija, ki zagotavlja, da bo model vedno generiral odgovore, ki se dr啪ijo va拧ega posredovanega JSON sheme.',
+  },
+}
+
+export default translation
diff --git a/i18n/sl-SI/billing.ts b/i18n/sl-SI/billing.ts
new file mode 100644
index 0000000..9b79872
--- /dev/null
+++ b/i18n/sl-SI/billing.ts
@@ -0,0 +1,200 @@
+const translation = {
+  currentPlan: 'Trenutni na膷rt',
+  upgradeBtn: {
+    plain: 'Nadgradi na膷rt',
+    encourage: 'Nadgradi zdaj',
+    encourageShort: 'Nadgradi',
+  },
+  viewBilling: 'Upravljanje s pla膷ili in naro膷ninami',
+  buyPermissionDeniedTip: 'Za naro膷nino kontaktirajte svojega skrbnika podjetja',
+  plansCommon: {
+    title: 'Izberite na膷rt, ki vam ustreza',
+    yearlyTip: 'Z letno naro膷nino pridobite 2 meseca brezpla膷no!',
+    mostPopular: 'Najbolj priljubljeno',
+    planRange: {
+      monthly: 'Mese膷no',
+      yearly: 'Letno',
+    },
+    month: 'mesec',
+    year: 'leto',
+    save: 'Prihranite ',
+    free: 'Brezpla膷no',
+    currentPlan: 'Trenutni na膷rt',
+    contractSales: 'Kontaktirajte prodajo',
+    contractOwner: 'Kontaktirajte upravitelja ekipe',
+    startForFree: 'Za膷nite brezpla膷no',
+    getStartedWith: 'Za膷nite z ',
+    contactSales: 'Kontaktirajte prodajo',
+    talkToSales: 'Pogovorite se s prodajo',
+    modelProviders: 'Ponudniki modelov',
+    teamMembers: '膶lani ekipe',
+    annotationQuota: 'Kvote za ozna膷evanje',
+    buildApps: 'Gradite aplikacije',
+    vectorSpace: 'Prostor za vektorje',
+    vectorSpaceBillingTooltip: 'Vsak 1 MB lahko shrani pribli啪no 1,2 milijona znakov vektoriziranih podatkov (ocenjeno z uporabo OpenAI Embeddings, odvisno od modelov).',
+    vectorSpaceTooltip: 'Prostor za vektorje je dolgoro膷ni pomnilni拧ki sistem, potreben za to, da LLM-ji razumejo va拧e podatke.',
+    documentsUploadQuota: 'Kvote za nalaganje dokumentov',
+    documentProcessingPriority: 'Prioriteta obdelave dokumentov',
+    documentProcessingPriorityTip: 'Za vi拧jo prioriteto obdelave dokumentov nadgradite svoj na膷rt.',
+    documentProcessingPriorityUpgrade: 'Obdelujte ve膷 podatkov z ve膷jo natan膷nostjo in hitrostjo.',
+    priority: {
+      'standard': 'Standard',
+      'priority': 'Prioriteta',
+      'top-priority': 'Najvi拧ja prioriteta',
+    },
+    logsHistory: 'Zgodovina dnevnikov',
+    customTools: 'Prilagojena orodja',
+    unavailable: 'Ni na voljo',
+    days: 'dni',
+    unlimited: 'Neomejeno',
+    support: 'Podpora',
+    supportItems: {
+      communityForums: 'Skupnostni forumi',
+      emailSupport: 'Podpora preko e-po拧te',
+      priorityEmail: 'Prioritetna podpora preko e-po拧te in klepeta',
+      logoChange: 'Sprememba logotipa',
+      SSOAuthentication: 'SSO avtentikacija',
+      personalizedSupport: 'Osebna podpora',
+      dedicatedAPISupport: 'Namenska podpora API-ju',
+      customIntegration: 'Prilagojena integracija in podpora',
+      ragAPIRequest: 'RAG API zahtevki',
+      bulkUpload: 'Masovni prenos dokumentov',
+      agentMode: 'Na膷in agenta',
+      workflow: 'Potek dela',
+      llmLoadingBalancing: 'LLM uravnote啪enje obremenitve',
+      llmLoadingBalancingTooltip: 'Dodajte ve膷 API klju膷ev modelom, kar u膷inkovito prese啪e omejitve hitrosti API-ja.',
+    },
+    comingSoon: 'Kmalu na voljo',
+    member: '膶lan',
+    memberAfter: '膶lan',
+    messageRequest: {
+      title: 'Krediti za sporo膷ila',
+      tooltip: 'Kvota za klice sporo膷il pri razli膷nih na膷rtih z uporabo modelov OpenAI (razen GPT-4). Sporo膷ila preko omejitve bodo uporabljala va拧 OpenAI API klju膷.',
+      titlePerMonth: '{{count,number}} sporo膷il/mesec',
+    },
+    annotatedResponse: {
+      title: 'Omejitve kvote za ozna膷evanje',
+      tooltip: 'Ro膷no urejanje in ozna膷evanje odgovorov omogo膷a prilagojeno visoko kakovostno odgovarjanje na vpra拧anja v aplikacijah. (Velja samo za klepetalne aplikacije)',
+    },
+    ragAPIRequestTooltip: 'Nana拧a se na 拧tevilo API klicev, ki vklju膷ujejo samo sposobnosti obdelave baze znanja Dify.',
+    receiptInfo: 'Le lastnik ekipe in skrbnik ekipe lahko naro膷ita in si ogledate podatke o pla膷ilih',
+    self: 'Samostojno gostovanje',
+    documents: '{{count,number}} dokumentov znanja',
+    documentsTooltip: 'Kvote na 拧tevilo dokumentov, uvo啪enih iz Vir podatkov znanja.',
+    teamWorkspace: '{{count,number}} Ekipa delovni prostor',
+    apiRateLimit: 'Omejitev hitrosti API-ja',
+    unlimitedApiRate: 'Brez omejitve hitrostnega limita API-ja',
+    comparePlanAndFeatures: 'Primerjajte na膷rte in funkcije',
+    apiRateLimitTooltip: 'API omejitev hitrosti velja za vse poizvedbe, opravljene prek Dify API, vklju膷no z generiranjem besedila, klepetnimi pogovori, izvajanjem delovnih tokov in obdelavo dokumentov.',
+    freeTrialTipSuffix: 'Brez zahteve po kreditni kartici',
+    annualBilling: 'Letno ra膷褍薪ovodstvo',
+    teamMember_one: '{{count,number}} 膷lan ekipe',
+    teamMember_other: '{{count,number}} 膶lanov ekipe',
+    documentsRequestQuota: '{{count,number}}/min Omejitev stopnje zahtev po znanju',
+    apiRateLimitUnit: '{{count,number}}/dan',
+    priceTip: 'na delovnem prostoru/',
+    freeTrialTipPrefix: 'Prijavite se in prejmite',
+    cloud: 'Obla膷na storitev',
+    freeTrialTip: 'brezpla膷no preizku拧njo 200 klicev OpenAI.',
+    getStarted: 'Za膷nite',
+    documentsRequestQuotaTooltip: 'Dolo膷a skupno 拧tevilo dejanj, ki jih lahko delovno mesto opravi na minuto znotraj znanja baze, vklju膷no s kreiranjem, brisanjem, posodobitvami, nalaganjem dokumentov, spremembami, arhiviranjem in poizvedbami po znanju bazi. Ta meritev se uporablja za ocenjevanje uspe拧nosti poizvedb v bazi znanja. Na primer, 膷e uporabnik Sandbox izvede 10 zaporednih testov udarca v eni minuti, bo njegovo delovno mesto za膷asno omejeno pri izvajanju naslednjih dejanj v naslednji minuti: kreiranje podatkovnih nizov, brisanje, posodobitve in nalaganje ali spremembe dokumentov.',
+  },
+  plans: {
+    sandbox: {
+      name: 'Peskovnik',
+      description: '200 brezpla膷nih poskusov GPT',
+      includesTitle: 'Vklju膷uje:',
+      for: 'Brezpla膷no preizku拧anje osnovnih zmogljivosti',
+    },
+    professional: {
+      name: 'Profesionalni',
+      description: 'Za posameznike in male ekipe, da odklenete ve膷 zmogljivosti po ugodni ceni.',
+      includesTitle: 'Vse v brezpla膷nem na膷rtu, plus:',
+      for: 'Za neodvisne razvijalce/male ekipe',
+    },
+    team: {
+      name: 'Ekipa',
+      description: 'Sodelujte brez omejitev in u啪ivajte v vrhunski zmogljivosti.',
+      includesTitle: 'Vse v profesionalnem na膷rtu, plus:',
+      for: 'Za srednje velike ekipe',
+    },
+    enterprise: {
+      name: 'Podjetje',
+      description: 'Pridobite vse zmogljivosti in podporo za velike sisteme kriti膷ne za misijo.',
+      includesTitle: 'Vse v na膷rtu Ekipa, plus:',
+      features: {
+        5: 'Pogajali smo se o SLAs s partnerji Dify',
+        4: 'SSO',
+        0: 'Re拧itve za raz拧irljivo uvedbo na ravni podjetij',
+        1: 'Avtorizacija za komercialno licenco',
+        2: 'Ekskluzivne funkcije za podjetja',
+        7: 'Posodobitve in vzdr啪evanje s strani Dify uradno',
+        3: 'Ve膷 delovnih prostorov in upravljanje podjetij',
+        6: 'Napredna varnost in nadzor',
+        8: 'Profesionalna tehni膷na podpora',
+      },
+      priceTip: 'Letno zara膷unavanje samo',
+      price: 'Po meri',
+      btnText: 'Kontaktirajte prodajo',
+      for: 'Za velike ekipe',
+    },
+    community: {
+      features: {
+        2: 'Upo拧teva Dify odprtokodno licenco',
+        0: 'Vse klju膷ne funkcije so bile objavljene v javnem repozitoriju',
+        1: 'Enotno delovno okolje',
+      },
+      includesTitle: 'Brezpla膷ne funkcije:',
+      price: 'Brezpla膷no',
+      name: 'Skupnost',
+      description: 'Za posamezne uporabnike, majhne skupine ali nekomercialne projekte',
+      for: 'Za posamezne uporabnike, majhne skupine ali nekomercialne projekte',
+      btnText: 'Za膷nite s skupnostjo',
+    },
+    premium: {
+      features: {
+        2: 'Prilagoditev logotipa in blagovne znamke spletne aplikacije',
+        1: 'Enotno delovno okolje',
+        0: 'Samoobvladovana zanesljivost razli膷nih ponudnikov obla膷nih storitev',
+        3: 'Prednostna e-po拧ta in podpora za klepet',
+      },
+      name: 'Premium',
+      priceTip: 'Na podlagi oblaka Marketplace',
+      price: '艩kalable',
+      includesTitle: 'Vse iz skupnosti, poleg tega:',
+      comingSoon: 'Podpora za Microsoft Azure in Google Cloud kmalu prihaja',
+      for: 'Za srednje velika podjetja in ekipe',
+      btnText: 'Pridobi Premium v',
+      description: 'Za srednje velika podjetja in ekipe',
+    },
+  },
+  vectorSpace: {
+    fullTip: 'Prostor za vektorje je poln.',
+    fullSolution: 'Nadgradite svoj na膷rt za ve膷 prostora.',
+  },
+  apps: {
+    fullTipLine1: 'Nadgradite svoj na膷rt, da',
+    fullTipLine2: 'gradite ve膷 aplikacij.',
+    fullTip1des: 'Dosegli ste omejitev za izdelavo aplikacij v tem na膷rtu.',
+    fullTip1: 'Nadgradite za ustvarjanje ve膷 aplikacij',
+    fullTip2: 'Dose啪ena meja na膷rta',
+    contactUs: 'Kontaktirajte nas',
+    fullTip2des: 'Priporo膷ljivo je, da o膷istite neaktivne aplikacije, da sprostite prostor, ali nas kontaktirate.',
+  },
+  annotatedResponse: {
+    fullTipLine1: 'Nadgradite svoj na膷rt, da',
+    fullTipLine2: 'ozna膷ite ve膷 pogovorov.',
+    quotaTitle: 'Kvote za odgovor z ozna膷evanjem',
+  },
+  usagePage: {
+    documentsUploadQuota: 'Kvota za nalaganje dokumentov',
+    vectorSpaceTooltip: 'Dokumenti z na膷inom indeksiranja visoke kakovosti bodo porabili vire skladi拧膷a podatkov o znanju. Ko skladi拧膷e podatkov o znanju dose啪e mejo, novih dokumentov ne bo mogo膷e nalo啪iti.',
+    vectorSpace: 'Shranjevanje podatkov znanja',
+    annotationQuota: 'Quota za anotacijo',
+    teamMembers: '膶lani ekipe',
+    buildApps: 'Gradite aplikacije',
+  },
+  teamMembers: '膶lani ekipe',
+}
+
+export default translation
diff --git a/i18n/sl-SI/common.ts b/i18n/sl-SI/common.ts
new file mode 100644
index 0000000..d4b78d4
--- /dev/null
+++ b/i18n/sl-SI/common.ts
@@ -0,0 +1,871 @@
+const translation = {
+  api: {
+    success: 'Uspeh',
+    actionSuccess: 'Dejanje je uspelo',
+    saved: 'Shranjeno',
+    create: 'Ustvarjeno',
+    remove: 'Odstranjeno',
+  },
+  operation: {
+    create: 'Ustvari',
+    confirm: 'Potrdi',
+    cancel: 'Prekli膷i',
+    clear: 'Po膷isti',
+    save: 'Shrani',
+    saveAndEnable: 'Shrani in omogo膷i',
+    edit: 'Uredi',
+    add: 'Dodaj',
+    added: 'Dodano',
+    refresh: 'Osve啪i',
+    reset: 'Ponastavi',
+    search: 'I拧膷i',
+    change: 'Spremeni',
+    remove: 'Odstrani',
+    send: 'Po拧lji',
+    copy: 'Kopiraj',
+    lineBreak: 'Prelom vrstice',
+    sure: 'Prepri膷an sem',
+    download: 'Prenesi',
+    delete: 'Izbri拧i',
+    settings: 'Nastavitve',
+    setup: 'Nastavitev',
+    getForFree: 'Dobite brezpla膷no',
+    reload: 'Ponovno nalo啪i',
+    ok: 'V redu',
+    log: 'Dnevnik',
+    learnMore: 'Izvedi ve膷',
+    params: 'Parametri',
+    duplicate: 'Podvoji',
+    rename: 'Preimenuj',
+    audioSourceUnavailable: 'Zvo膷ni vir ni na voljo',
+    copyImage: 'Kopiraj sliko',
+    openInNewTab: 'Odpri v novem zavihku',
+    zoomOut: 'Pomanj拧anje',
+    zoomIn: 'Pove膷ava',
+    saveAndRegenerate: 'Shranite in regenerirajte otro拧ke ko拧膷ke',
+    close: 'Blizu',
+    view: 'Pogled',
+    regenerate: 'Regeneracijo',
+    viewMore: 'POGLEJ VE膶',
+    submit: 'Predlo啪iti',
+    skip: 'Ladja',
+    imageCopied: 'Kopirana slika',
+    deleteApp: 'Izbri拧i aplikacijo',
+    viewDetails: 'Poglej podrobnosti',
+    copied: 'Kopirati',
+    in: 'v',
+    downloadFailed: 'Prenos ni uspel. Prosim, poskusite znova pozneje.',
+    more: 'Ve膷',
+    downloadSuccess: 'Prenos kon膷an.',
+    format: 'Format',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} je obvezno',
+    urlError: 'url mora za膷eti z http:// ali https://',
+  },
+  placeholder: {
+    input: 'Vnesite prosim',
+    select: 'Izberite prosim',
+  },
+  voice: {
+    language: {
+      zhHans: 'Kitaj拧膷ina (poenostavljena)',
+      zhHant: 'Kitaj拧膷ina (tradicionalna)',
+      enUS: 'Angle拧膷ina',
+      deDE: 'Nem拧膷ina',
+      frFR: 'Franco拧膷ina',
+      esES: '艩pan拧膷ina',
+      itIT: 'Italijan拧膷ina',
+      thTH: 'Taj拧膷ina',
+      idID: 'Indonezij拧膷ina',
+      jaJP: 'Japon拧膷ina',
+      koKR: 'Korej拧膷ina',
+      ptBR: 'Portugal拧膷ina',
+      ruRU: 'Ru拧膷ina',
+      ukUA: 'Ukrajin拧膷ina',
+      viVN: 'Vietnam拧膷ina',
+      plPL: 'Polj拧膷ina',
+      roRO: 'Romun拧膷ina',
+      hiIN: 'Hinduj拧膷ina',
+      trTR: 'Tur拧膷ina',
+      faIR: 'Farsi',
+    },
+  },
+  unit: {
+    char: 'znaki',
+  },
+  actionMsg: {
+    noModification: 'Trenutno ni sprememb.',
+    modifiedSuccessfully: 'Spremenjeno uspe拧no',
+    modifiedUnsuccessfully: 'Spremenjeno neuspe拧no',
+    copySuccessfully: 'Kopirano uspe拧no',
+    paySucceeded: 'Pla膷ilo je uspelo',
+    payCancelled: 'Pla膷ilo preklicano',
+    generatedSuccessfully: 'Generirano uspe拧no',
+    generatedUnsuccessfully: 'Generirano neuspe拧no',
+  },
+  model: {
+    params: {
+      temperature: 'Temperatura',
+      temperatureTip:
+        'Nadzoruje naklju膷nost: Zni啪anje temperature vodi do manj naklju膷nih zaklju膷kov. Ko se temperatura pribli啪a ni膷li, bo model postal deterministi膷en in ponavljajo膷.',
+      top_p: 'Top P',
+      top_pTip:
+        'Nadzoruje raznolikost preko vzor膷enja jedra: 0.5 pomeni, da je upo拧tevanih polovica vseh mo啪nosti glede na njihovo verjetnost.',
+      presence_penalty: 'Kaznovanje za prisotnost',
+      presence_penaltyTip:
+        'Kako mo膷no kaznovati nove besede, glede na to, ali so se 啪e pojavile v besedilu.\nPove膷uje verjetnost, da bo model obravnaval nove teme.',
+      frequency_penalty: 'Kaznovanje za frekvenco',
+      frequency_penaltyTip:
+        'Kako mo膷no kaznovati nove besede glede na njihovo 啪e obstoje膷o frekvenco v besedilu.\nZmanj拧uje verjetnost, da bo model ponavljal iste vrstice.',
+      max_tokens: 'Najve膷je 拧tevilo 啪etonov',
+      max_tokensTip:
+        'Uporabljeno za omejitev najve膷je dol啪ine odgovora, v 啪etonih.\nVe膷je vrednosti lahko omejijo prostor za besede, zgodovino pogovorov in znanje. \nPriporo膷ljivo je nastaviti pod dve tretjini.\ngpt-4-1106-preview, gpt-4-vision-preview maksimalno 拧tevilo 啪etonov (vnos 128k, izhod 4k)',
+      maxTokenSettingTip: 'Va拧a nastavitev za najve膷je 拧tevilo 啪etonov je visoka, kar lahko omeji prostor za pozive, poizvedbe in podatke. Razmislite o nastavitvi pod 2/3.',
+      setToCurrentModelMaxTokenTip: 'Najve膷je 拧tevilo 啪etonov je posodobljeno na 80 % najve膷jega 拧tevila 啪etonov trenutnega modela {{maxToken}}.',
+      stop_sequences: 'Zaporedja ustavljanja',
+      stop_sequencesTip: 'Do 拧tiri zaporedja, kjer bo API prenehal generirati nadaljnje 啪etone. Vrnjen tekst ne bo vseboval zaporedja ustavitve.',
+      stop_sequencesPlaceholder: 'Vnesite zaporedje in pritisnite Tab',
+    },
+    tone: {
+      Creative: 'Kreativno',
+      Balanced: 'Uravnote啪eno',
+      Precise: 'Natan膷no',
+      Custom: 'Po meri',
+    },
+    addMoreModel: 'Pojdite v nastavitve, da dodate ve膷 modelov',
+    settingsLink: 'Nastavitve ponudnika modelov',
+    capabilities: 'Multimodalne zmogljivosti',
+  },
+  menus: {
+    status: 'beta',
+    explore: 'Raziskuj',
+    apps: 'Studio',
+    plugins: 'Vti膷niki',
+    pluginsTips: 'Integrirajte vti膷nike tretjih oseb ali ustvarite vti膷nike, zdru啪ljive s ChatGPT.',
+    datasets: 'Znanje',
+    datasetsTips: 'KMALU: Uvozite svoje besedilne podatke ali pi拧ite podatke v realnem 膷asu preko spletnih kljuk za izbolj拧anje konteksta LLM.',
+    newApp: 'Nova aplikacija',
+    newDataset: 'Ustvari znanje',
+    tools: 'Orodja',
+    exploreMarketplace: 'Razi拧膷ite Marketplace',
+  },
+  userProfile: {
+    settings: 'Nastavitve',
+    emailSupport: 'Podpora po e-po拧ti',
+    workspace: 'Delovni prostor',
+    createWorkspace: 'Ustvari delovni prostor',
+    helpCenter: 'Pomo膷',
+    communityFeedback: 'Povratne informacije',
+    roadmap: 'Na膷rt razvoja',
+    community: 'Skupnost',
+    about: 'O nas',
+    logout: 'Odjava',
+    support: 'Podpora',
+    github: 'GitHub',
+    compliance: 'Skladnost',
+  },
+  settings: {
+    accountGroup: 'SPLO艩NO',
+    workplaceGroup: 'DELOVNI PROSTOR',
+    account: 'Moj ra膷un',
+    members: '膶lani',
+    billing: 'Zara膷unavanje',
+    integrations: 'Integracije',
+    language: 'Jezik',
+    provider: 'Ponudnik modelov',
+    dataSource: 'Vir podatkov',
+    plugin: 'Vti膷niki',
+    apiBasedExtension: 'Raz拧iritev API-ja',
+    generalGroup: 'SPLO艩NO',
+  },
+  account: {
+    account: 'Ra膷un',
+    myAccount: 'Moj ra膷un',
+    studio: 'Dify Studio',
+    avatar: 'Avatar',
+    name: 'Ime',
+    email: 'E-po拧ta',
+    password: 'Geslo',
+    passwordTip: 'Lahko nastavite stalno geslo, 膷e ne 啪elite uporabljati za膷asnih prijavnih kod',
+    setPassword: 'Nastavi geslo',
+    resetPassword: 'Ponastavi geslo',
+    currentPassword: 'Trenutno geslo',
+    newPassword: 'Novo geslo',
+    confirmPassword: 'Potrdi geslo',
+    notEqual: 'Gesli se ne ujemata.',
+    langGeniusAccount: 'Dify ra膷un',
+    langGeniusAccountTip: 'Va拧 Dify ra膷un in povezani uporabni拧ki podatki.',
+    editName: 'Uredi ime',
+    showAppLength: 'Prikaz {{length}} aplikacij',
+    delete: 'Izbri拧i ra膷un',
+    deleteTip: 'Brisanje va拧ega ra膷una bo trajno izbrisalo vse va拧e podatke in jih ne bo mogo膷e obnoviti.',
+    deleteConfirmTip: 'Za potrditev po拧ljite naslednje s svojega registriranega e-po拧tnega naslova na ',
+    permanentlyDeleteButton: 'Trajno izbri拧i ra膷un',
+    deletePrivacyLinkTip: 'Za ve膷 informacij o tem, kako ravnamo z va拧imi podatki, si oglejte na拧e',
+    feedbackPlaceholder: 'Neobvezno',
+    sendVerificationButton: 'Po拧lji kodo za preverjanje',
+    feedbackLabel: 'Povejte nam, zakaj ste izbrisali ra膷un?',
+    verificationLabel: 'Koda za preverjanje',
+    verificationPlaceholder: 'Prilepite 6-mestno kodo',
+    deletePrivacyLink: 'Pravilnik o zasebnosti.',
+    deletePlaceholder: 'Prosimo, vnesite svoj e-po拧tni naslov',
+    deleteSuccessTip: 'Va拧 ra膷un potrebuje 膷as, da dokon膷a brisanje. Ko bo vse kon膷ano, vam bomo poslali e-po拧to.',
+    feedbackTitle: 'Povratne informacije',
+    deleteLabel: 'Za potrditev spodaj vnesite svoj e-po拧tni naslov',
+    workspaceName: 'Ime delovnega prostora',
+    workspaceIcon: 'Ikona delovnega prostora',
+    editWorkspaceInfo: 'Uredi informacije o delovnem prostoru',
+  },
+  members: {
+    team: 'Ekipa',
+    invite: 'Dodaj',
+    name: 'IME',
+    lastActive: 'NAZADNJE AKTIVEN',
+    role: 'VLOGE',
+    pending: 'V teku...',
+    owner: 'Lastnik',
+    admin: 'Administrator',
+    adminTip: 'Lahko ustvarja aplikacije in upravlja nastavitve ekipe',
+    normal: 'Obi膷ajni uporabnik',
+    normalTip: 'Lahko uporablja samo aplikacije, ne more ustvarjati aplikacij',
+    builder: 'Graditelj',
+    builderTip: 'Lahko ustvarja in ureja lastne aplikacije',
+    editor: 'Urednik',
+    editorTip: 'Lahko ustvarja in ureja aplikacije',
+    datasetOperator: 'Skrbnik znanja',
+    datasetOperatorTip: 'Lahko upravlja samo bazo znanja',
+    inviteTeamMember: 'Dodaj 膷lana ekipe',
+    inviteTeamMemberTip: 'Do va拧ih podatkov bo lahko dostopal takoj po prijavi.',
+    emailNotSetup: 'E-po拧tni stre啪nik ni nastavljen, zato vabil po e-po拧ti ni mogo膷e poslati. Prosimo, obvestite uporabnike o povezavi za povabilo, ki bo izdana po povabilu.',
+    email: 'E-po拧ta',
+    emailInvalid: 'Neveljaven format e-po拧te',
+    emailPlaceholder: 'Vnesite e-po拧tne naslove',
+    sendInvite: 'Po拧lji povabilo',
+    invitedAsRole: 'Povabljen kot uporabnik {{role}}',
+    invitationSent: 'Povabilo poslano',
+    invitationSentTip: 'Povabilo poslano, in po prijavi v Dify bodo imeli dostop do va拧ih podatkov ekipe.',
+    invitationLink: 'Povezava za povabilo',
+    failedInvitationEmails: 'Spodnji uporabniki niso bili uspe拧no povabljeni',
+    ok: 'V redu',
+    removeFromTeam: 'Odstrani iz ekipe',
+    removeFromTeamTip: 'Odstranjen bo dostop do ekipe',
+    setAdmin: 'Nastavi za administratorja',
+    setMember: 'Nastavi za obi膷ajnega 膷lana',
+    setBuilder: 'Nastavi za graditelja',
+    setEditor: 'Nastavi za urednika',
+    disInvite: 'Prekli膷i povabilo',
+    deleteMember: 'Izbri拧i 膷lana',
+    you: '(Vi)',
+  },
+  integrations: {
+    connected: 'Povezano',
+    google: 'Google',
+    googleAccount: 'Prijavite se z Google ra膷unom',
+    github: 'GitHub',
+    githubAccount: 'Prijavite se z GitHub ra膷unom',
+    connect: 'Pove啪i',
+  },
+  language: {
+    displayLanguage: 'Jezik prikaza',
+    timezone: '膶asovni pas',
+  },
+  provider: {
+    apiKey: 'API klju膷',
+    enterYourKey: 'Vnesite svoj API klju膷 tukaj',
+    invalidKey: 'Neveljaven OpenAI API klju膷',
+    validatedError: 'Preverjanje ni uspelo: ',
+    validating: 'Preverjam klju膷...',
+    saveFailed: 'Shranjevanje API klju膷a ni uspelo',
+    apiKeyExceedBill: 'Ta API klju膷 nima ve膷 na voljo kvote, preberite',
+    addKey: 'Dodaj klju膷',
+    comingSoon: 'Kmalu',
+    editKey: 'Uredi',
+    invalidApiKey: 'Neveljaven API klju膷',
+    azure: {
+      apiBase: 'API Osnova',
+      apiBasePlaceholder: 'URL API osnove va拧ega Azure OpenAI kon膷nega mesta.',
+      apiKey: 'API klju膷',
+      apiKeyPlaceholder: 'Vnesite svoj API klju膷 tukaj',
+      helpTip: 'Spoznajte Azure OpenAI storitev',
+    },
+    openaiHosted: {
+      openaiHosted: 'Gostovani OpenAI',
+      onTrial: 'NA PREIZKUSU',
+      exhausted: 'KVOTA PORABLJENA',
+      desc: 'Gostitvena storitev OpenAI, ki jo ponuja Dify, vam omogo膷a uporabo modelov, kot je GPT-3.5. Preden porabite kvoto za preizkus, morate nastaviti druge ponudnike modelov.',
+      callTimes: '膶asi klicev',
+      usedUp: 'Kvota za preizkus porabljena. Dodajte svojega ponudnika modelov.',
+      useYourModel: 'Trenutno uporabljate svojega ponudnika modelov.',
+      close: 'Zapri',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: 'NA PREIZKUSU',
+      exhausted: 'KVOTA PORABLJENA',
+      desc: 'Zmogljiv model, ki se odli膷no obnese pri razli膷nih nalogah, od sofisticiranega dialoga in ustvarjanja kreativnih vsebin do podrobnih navodil.',
+      callTimes: '膶asi klicev',
+      usedUp: 'Kvota za preizkus porabljena. Dodajte svojega ponudnika modelov.',
+      useYourModel: 'Trenutno uporabljate svojega ponudnika modelov.',
+      close: 'Zapri',
+      trialQuotaTip: 'Va拧a kvota za presku拧anje antropi膷nih izdelkov bo potekla 11.3.2025 in po tem datumu ne bo ve膷 na voljo. Prosimo, da jo pravo膷asno izkoristite.',
+    },
+    anthropic: {
+      using: 'Zmo啪nost vdelave uporablja',
+      enableTip: 'Za omogo膷itev modela Anthropic morate najprej povezati OpenAI ali Azure OpenAI storitev.',
+      notEnabled: 'Ni omogo膷eno',
+      keyFrom: 'Pridobite svoj API klju膷 pri Anthropic',
+    },
+    encrypted: {
+      front: 'Va拧 API klju膷 bo 拧ifriran in shranjen z uporabo',
+      back: ' tehnologije.',
+    },
+  },
+  modelProvider: {
+    notConfigured: 'Sistemski model 拧e ni popolnoma konfiguriran, nekatere funkcije morda ne bodo na voljo.',
+    systemModelSettings: 'Nastavitve sistemskega modela',
+    systemModelSettingsLink: 'Zakaj je potrebno nastaviti sistemski model?',
+    selectModel: 'Izberite svoj model',
+    setupModelFirst: 'Najprej nastavite svoj model',
+    systemReasoningModel: {
+      key: 'Sistemski model za sklepanja',
+      tip: 'Nastavite privzeti model za sklepanja, ki se bo uporabljal za ustvarjanje aplikacij, kot tudi funkcije, kot so generiranje imen dialogov in predlaganje naslednjih vpra拧anj.',
+    },
+    embeddingModel: {
+      key: 'Model za vdelavo',
+      tip: 'Nastavite privzeti model za obdelavo vdelave dokumentov znanja, tako pri iskanju kot pri uvozu znanja se uporablja ta model za vektorizacijo. Preklop bo povzro膷il neusklajenost vektorske dimenzije med uvo啪enim znanjem in vpra拧anjem, kar bo povzro膷ilo neuspe拧no iskanje. Da bi se izognili neuspehu pri iskanju, ne preklapljajte tega modela brez potrebe.',
+      required: 'Model za vdelavo je obvezen',
+    },
+    speechToTextModel: {
+      key: 'Model za pretvorbo govora v besedilo',
+      tip: 'Nastavite privzeti model za vnos govora v besedilo v pogovoru.',
+    },
+    ttsModel: {
+      key: 'Model za pretvorbo besedila v govor',
+      tip: 'Nastavite privzeti model za pretvorbo besedila v govor v pogovoru.',
+    },
+    rerankModel: {
+      key: 'Model za prerazvrstitev',
+      tip: 'Model za prerazvrstitev bo prerazporedil seznam kandidatskih dokumentov na podlagi semanti膷ne ujemanja z uporabni拧ko poizvedbo, s 膷imer se izbolj拧ajo rezultati semanti膷nega razvr拧膷anja.',
+    },
+    apiKey: 'API-KEY',
+    quota: 'Kvote',
+    searchModel: 'Model iskanja',
+    noModelFound: 'Za {{model}} ni najden noben model',
+    models: 'Modeli',
+    showMoreModelProvider: 'Prika啪i ve膷 ponudnikov modelov',
+    selector: {
+      tip: 'Ta model je bil odstranjen. Prosimo, dodajte model ali izberite drugega.',
+      emptyTip: 'Ni razpolo啪ljivih modelov',
+      emptySetting: 'Prosimo, pojdite v nastavitve za konfiguracijo',
+      rerankTip: 'Prosimo, nastavite model za prerazvrstitev',
+    },
+    card: {
+      quota: 'KVOTE',
+      onTrial: 'Na preizkusu',
+      paid: 'Pla膷ano',
+      quotaExhausted: 'Kvote porabljene',
+      callTimes: '膶asi klicev',
+      tokens: '沤etoni',
+      buyQuota: 'Kupi kvoto',
+      priorityUse: 'Prednostna uporaba',
+      removeKey: 'Odstrani API klju膷',
+      tip: 'Prednostno se bo uporabila pla膷ana kvota. Kvota za preizkus se bo uporabila, ko bo pla膷ana kvota porabljena.',
+    },
+    item: {
+      deleteDesc: '{{modelName}} se uporablja kot sistemski model za sklepanja. Nekatere funkcije ne bodo na voljo po odstranitvi. Prosimo, potrdite.',
+      freeQuota: 'BREZPLA膶NA KVOTA',
+    },
+    addApiKey: 'Dodaj svoj API klju膷',
+    invalidApiKey: 'Neveljaven API klju膷',
+    encrypted: {
+      front: 'Va拧 API klju膷 bo 拧ifriran in shranjen z uporabo',
+      back: ' tehnologije.',
+    },
+    freeQuota: {
+      howToEarn: 'Kako zaslu啪iti',
+    },
+    addMoreModelProvider: 'DODAJ VE膶 PONUDNIKOV MODELOV',
+    addModel: 'Dodaj model',
+    modelsNum: '{{num}} modelov',
+    showModels: 'Prika啪i modele',
+    showModelsNum: 'Prika啪i {{num}} modelov',
+    collapse: 'Strni',
+    config: 'Konfiguracija',
+    modelAndParameters: 'Model in parametri',
+    model: 'Model',
+    featureSupported: '{{feature}} podprto',
+    callTimes: '艩tevilo klicev',
+    credits: 'Sporo膷ilni krediti',
+    buyQuota: 'Kupi kvoto',
+    getFreeTokens: 'Pridobi brezpla膷ne 啪etone',
+    priorityUsing: 'Prednostna uporaba',
+    deprecated: 'Zastarelo',
+    confirmDelete: 'Potrdite izbris?',
+    quotaTip: 'Preostali razpolo啪ljivi brezpla膷ni 啪etoni',
+    loadPresets: 'Nalo啪i prednastavitve',
+    parameters: 'PARAMETRI',
+    loadBalancing: 'Uravnote啪enje obremenitev',
+    loadBalancingDescription: 'Zmanj拧ajte pritisk s pomo膷jo ve膷 sklopov poverilnic.',
+    loadBalancingHeadline: 'Uravnote啪enje obremenitev',
+    configLoadBalancing: 'Konfiguracija uravnote啪enja obremenitev',
+    modelHasBeenDeprecated: 'Ta model je zastarel',
+    providerManaged: 'Upravljano s strani ponudnika',
+    providerManagedDescription: 'Uporabite enoten sklop poverilnic, ki jih zagotovi ponudnik modela.',
+    defaultConfig: 'Privzeta konfiguracija',
+    apiKeyStatusNormal: 'Stanje API klju膷a je normalno',
+    apiKeyRateLimit: 'Omejitev hitrosti je dose啪ena, na voljo po {{seconds}} sekundah',
+    addConfig: 'Dodaj konfiguracijo',
+    editConfig: 'Uredi konfiguracijo',
+    loadBalancingLeastKeyWarning: 'Za omogo膷anje uravnote啪enja obremenitev morata biti omogo膷ena vsaj 2 klju膷a.',
+    loadBalancingInfo: 'Privzeto uravnote啪enje obremenitev uporablja strategijo Round-robin. 膶e se spro啪i omejitev hitrosti, se uporabi 1-minutno obdobje ohlajanja.',
+    upgradeForLoadBalancing: 'Nadgradite svoj na膷rt, da omogo膷ite uravnote啪enje obremenitev.',
+    dataSource: {
+      add: 'Dodaj vir podatkov',
+      connect: 'Pove啪i',
+      configure: 'Konfiguriraj',
+      notion: {
+        title: 'Notion',
+        description: 'Uporaba Notiona kot vira podatkov za Znanost.',
+        connectedWorkspace: 'Povezano delovno okolje',
+        addWorkspace: 'Dodaj delovno okolje',
+        connected: 'Povezan',
+        disconnected: 'Prekinjen',
+        changeAuthorizedPages: 'Spremeni poobla拧膷ene strani',
+        pagesAuthorized: 'Poobla拧膷ene strani',
+        sync: 'Sinhroniziraj',
+        remove: 'Odstrani',
+        selector: {
+          pageSelected: 'Izbrane strani',
+          searchPages: 'Iskanje strani...',
+          noSearchResult: 'Ni rezultatov iskanja',
+          addPages: 'Dodaj strani',
+          preview: 'PREDOGLED',
+        },
+      },
+      website: {
+        title: 'Spletna stran',
+        description: 'Uvoz vsebine s spletnih strani z uporabo spletnega pajka.',
+        with: 'S',
+        configuredCrawlers: 'Konfigurirani pajki',
+        active: 'Aktiven',
+        inactive: 'Neaktiven',
+      },
+    },
+    plugin: {
+      serpapi: {
+        apiKey: 'API klju膷',
+        apiKeyPlaceholder: 'Vnesite svoj API klju膷',
+        keyFrom: 'Pridobite svoj SerpAPI klju膷 na strani ra膷una SerpAPI',
+      },
+    },
+    apiBasedExtension: {
+      title: 'Raz拧iritve API omogo膷ajo centralizirano upravljanje API, kar poenostavi konfiguracijo za enostavno uporabo v aplikacijah Dify.',
+      link: 'Nau膷ite se, kako razviti svojo API raz拧iritev.',
+      linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+      add: 'Dodaj API raz拧iritev',
+      selector: {
+        title: 'API raz拧iritev',
+        placeholder: 'Prosimo, izberite API raz拧iritev',
+        manage: 'Upravljaj API raz拧iritev',
+      },
+      modal: {
+        title: 'Dodaj API raz拧iritev',
+        editTitle: 'Uredi API raz拧iritev',
+        name: {
+          title: 'Ime',
+          placeholder: 'Vnesite ime',
+        },
+        apiEndpoint: {
+          title: 'API konec',
+          placeholder: 'Vnesite API konec',
+        },
+        apiKey: {
+          title: 'API klju膷',
+          placeholder: 'Vnesite API klju膷',
+          lengthError: 'Dol啪ina API klju膷a ne sme biti manj拧a od 5 znakov',
+        },
+      },
+      type: 'Tip',
+    },
+    about: {
+      changeLog: 'Dnevnik sprememb',
+      updateNow: 'Posodobi zdaj',
+      nowAvailable: 'Dify {{version}} je zdaj na voljo.',
+      latestAvailable: 'Dify {{version}} je najnovej拧a razli膷ica na voljo.',
+    },
+    appMenus: {
+      overview: 'Nadzor',
+      promptEng: 'Orkestriraj',
+      apiAccess: 'Dostop API',
+      logAndAnn: 'Dnevniki in objave',
+      logs: 'Dnevniki',
+    },
+    environment: {
+      testing: 'TESTIRANJE',
+      development: 'RAZVOJ',
+    },
+    appModes: {
+      completionApp: 'Generator besedila',
+      chatApp: 'Klepetalna aplikacija',
+    },
+    datasetMenus: {
+      documents: 'Dokumenti',
+      hitTesting: 'Preizku拧anje pridobivanja',
+      settings: 'Nastavitve',
+      emptyTip: 'Znanost 拧e ni povezana, pojdite v aplikacijo ali vti膷nik, da dokon膷ate povezavo.',
+      viewDoc: 'Ogled dokumentacije',
+      relatedApp: 'povezane aplikacije',
+    },
+    voiceInput: {
+      speaking: 'Govorite zdaj...',
+      converting: 'Pretvarjanje v besedilo...',
+      notAllow: 'mikrofon ni poobla拧膷en',
+    },
+    modelName: {
+      'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+      'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+      'gpt-4': 'GPT-4',
+      'gpt-4-32k': 'GPT-4-32K',
+      'text-davinci-003': 'Text-Davinci-003',
+      'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+      'whisper-1': 'Whisper-1',
+      'claude-instant-1': 'Claude-Instant',
+      'claude-2': 'Claude-2',
+    },
+    chat: {
+      renameConversation: 'Preimenuj pogovor',
+      conversationName: 'Ime pogovora',
+      conversationNamePlaceholder: 'Vnesite ime pogovora',
+      conversationNameCanNotEmpty: 'Ime pogovora je obvezno',
+      citation: {
+        title: 'CITATI',
+        linkToDataset: 'Povezava do znanja',
+        characters: 'Znakov:',
+        hitCount: '艩tevilo zadetkov:',
+        vectorHash: 'Vektorski hash:',
+        hitScore: 'Ocena zadetka:',
+      },
+    },
+    promptEditor: {
+      placeholder: 'Tukaj napi拧ite svoje pozivno besedilo, vnesite \'{\' za vstavljanje spremenljivke, vnesite \'/\' za vstavljanje vsebinskega bloka poziva',
+      context: {
+        item: {
+          title: 'Kontekst',
+          desc: 'Vstavi predlogo konteksta',
+        },
+        modal: {
+          title: '{{num}} Znanost v kontekstu',
+          add: 'Dodaj kontekst ',
+          footer: 'Kontekste lahko upravljate v spodnjem razdelku Kontekst.',
+        },
+      },
+      history: {
+        item: {
+          title: 'Zgodovina pogovora',
+          desc: 'Vstavi predlogo zgodovinskega sporo膷ila',
+        },
+        modal: {
+          title: 'PRIMER',
+          user: 'Pozdravljeni',
+          assistant: 'Pozdravljeni! Kako vam lahko pomagam danes?',
+          edit: 'Uredi imena vlog pogovora',
+        },
+      },
+      variable: {
+        item: {
+          title: 'Spremenljivke in zunanji orodja',
+          desc: 'Vstavi spremenljivke in zunanja orodja',
+        },
+        outputToolDisabledItem: {
+          title: 'Spremenljivke',
+          desc: 'Vstavi spremenljivke',
+        },
+        modal: {
+          add: 'Nova spremenljivka',
+          addTool: 'Novo orodje',
+        },
+      },
+      query: {
+        item: {
+          title: 'Poizvedba',
+          desc: 'Vstavi predlogo uporabni拧ke poizvedbe',
+        },
+      },
+      existed: '沤e obstaja v pozivu',
+    },
+    imageUploader: {
+      uploadFromComputer: 'Nalo啪i iz ra膷unalnika',
+      uploadFromComputerReadError: 'Branje slike ni uspelo, poskusite znova.',
+      uploadFromComputerUploadError: 'Nalaganje slike ni uspelo, poskusite znova.',
+      uploadFromComputerLimit: 'Nalaganje slik ne sme presegati {{size}} MB',
+      pasteImageLink: 'Prilepi povezavo do slike',
+      pasteImageLinkInputPlaceholder: 'Tukaj prilepite povezavo do slike',
+      pasteImageLinkInvalid: 'Neveljavna povezava slike',
+      imageUpload: 'Nalaganje slike',
+    },
+    tag: {
+      placeholder: 'Vse oznake',
+      addNew: 'Dodaj novo oznako',
+      noTag: 'Ni oznak',
+      noTagYet: '艩e ni oznak',
+      addTag: 'Dodaj oznake',
+      editTag: 'Uredi oznake',
+      manageTags: 'Upravljaj oznake',
+      selectorPlaceholder: 'Vnesite za iskanje ali ustvarjanje',
+      create: 'Ustvari',
+      delete: 'Izbri拧i oznako',
+      deleteTip: 'Oznaka se uporablja, jo 啪elite izbrisati?',
+      created: 'Oznaka uspe拧no ustvarjena',
+      failed: 'Ustvarjanje oznake ni uspelo',
+    },
+    discoverMore: 'Odkrijte ve膷 v',
+    installProvider: 'Namestitev ponudnikov modelov',
+    emptyProviderTitle: 'Ponudnik modelov ni nastavljen',
+    emptyProviderTip: 'Najprej namestite ponudnika modelov.',
+    toBeConfigured: 'Za konfiguracijo',
+    configureTip: 'Nastavitev tipke API ali dodajanje modela za uporabo',
+  },
+  dataSource: {
+    notion: {
+      selector: {
+        pageSelected: 'Izbrane strani',
+        addPages: 'Dodajanje strani',
+        searchPages: 'Iskanje strani ...',
+        noSearchResult: 'Ni rezultatov iskanja',
+        preview: 'PREDOGLED',
+      },
+      connected: 'Povezani',
+      remove: 'Odstrani',
+      addWorkspace: 'Dodajanje delovnega prostora',
+      connectedWorkspace: 'Povezani delovni prostor',
+      description: 'Uporaba pojma kot vira podatkov za znanje.',
+      disconnected: 'Odklopi',
+      pagesAuthorized: 'Dovoljene strani',
+      title: 'Pojem',
+      changeAuthorizedPages: 'Spreminjanje poobla拧膷enih strani',
+      sync: 'Sinhroniziranje',
+    },
+    website: {
+      active: 'Dejaven',
+      configuredCrawlers: 'Konfigurirani pajki',
+      title: 'Spletna stran',
+      inactive: 'Neaktiven',
+      description: 'Uvozite vsebino s spletnih mest s spletnim pajkom.',
+      with: 'S',
+    },
+    add: 'Dodajanje vira podatkov',
+    connect: 'Povezati',
+    configure: 'Konfigurirati',
+  },
+  plugin: {
+    serpapi: {
+      apiKeyPlaceholder: 'Vnesite klju膷 API',
+      apiKey: 'API klju膷',
+      keyFrom: 'Pridobite svoj klju膷 SerpAPI na strani ra膷una SerpAPI',
+    },
+  },
+  apiBasedExtension: {
+    selector: {
+      placeholder: 'Prosimo, izberite raz拧iritev API-ja',
+      manage: 'Upravljanje raz拧iritve API',
+      title: 'Raz拧iritev API-ja',
+    },
+    modal: {
+      name: {
+        placeholder: 'Prosimo, vnesite ime',
+        title: 'Ime',
+      },
+      apiEndpoint: {
+        title: 'Kon膷na to膷ka API-ja',
+        placeholder: 'Prosimo, vnesite kon膷no to膷ko API-ja',
+      },
+      apiKey: {
+        lengthError: 'Dol啪ina klju膷a API ne sme biti manj拧a od 5 znakov',
+        title: 'Klju膷 API-ja',
+        placeholder: 'Prosimo, vnesite API-klju膷',
+      },
+      editTitle: 'Uredi raz拧iritev API-ja',
+      title: 'Dodajanje raz拧iritve API-ja',
+    },
+    type: 'Vrsta',
+    link: 'Preberite, kako razvijete lastno raz拧iritev API-ja.',
+    title: 'Raz拧iritve API zagotavljajo centralizirano upravljanje API, kar poenostavlja konfiguracijo za enostavno uporabo v aplikacijah Dify.',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: 'Dodajanje raz拧iritve API-ja',
+  },
+  about: {
+    updateNow: 'Posodobi zdaj',
+    nowAvailable: 'Dify {{version}} je zdaj na voljo.',
+    latestAvailable: 'Dify {{version}} je najnovej拧a razli膷ica, ki je na voljo.',
+    changeLog: 'Dnevnik sprememb',
+  },
+  appMenus: {
+    apiAccess: 'Dostop do API-ja',
+    logs: 'Dnevniki',
+    logAndAnn: 'Dnevniki & Ann.',
+    promptEng: 'Orkester',
+    overview: 'Spremljanje',
+  },
+  environment: {
+    development: 'RAZVOJ',
+    testing: 'PREIZKU艩ANJE',
+  },
+  appModes: {
+    completionApp: 'Generator besedila',
+    chatApp: 'Aplikacija za klepet',
+  },
+  datasetMenus: {
+    documents: 'Dokumentov',
+    settings: 'Nastavitve',
+    hitTesting: 'Testiranje pridobivanja',
+    emptyTip: 'Znanje ni bilo povezano, prosimo, pojdite na aplikacijo ali vti膷nik, da dokon膷ate zdru啪enje.',
+    viewDoc: 'Oglejte si dokumentacijo',
+    relatedApp: 'Povezane aplikacije',
+    noRelatedApp: 'Brez povezanih aplikacij',
+  },
+  voiceInput: {
+    notAllow: 'Mikrofon ni poobla拧膷en',
+    speaking: 'Spregovorite zdaj ...',
+    converting: 'Pretvorba v besedilo ...',
+  },
+  modelName: {
+    'claude-2': 'Claude-2',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-embedding-ada-002': 'Vdelava besedila-Ada-002',
+    'gpt-4': 'GPT-4',
+    'whisper-1': '艩epet-1',
+    'claude-instant-1': 'Claude-Instant',
+    'text-davinci-003': 'Besedilo-Davinci-003',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+  },
+  chat: {
+    citation: {
+      vectorHash: 'Vektorska razpr拧itev:',
+      hitScore: 'Rezultat pridobivanja:',
+      linkToDataset: 'Povezava do znanja',
+      hitCount: '艩tevilo pridobivanja:',
+      characters: 'Znakov:',
+      title: 'CITATI',
+    },
+    conversationNameCanNotEmpty: 'Zahtevano ime pogovora',
+    inputPlaceholder: 'Pogovorite se z botom',
+    renameConversation: 'Preimenovanje pogovora',
+    conversationName: 'Ime pogovora',
+    conversationNamePlaceholder: 'Prosimo, vnesite ime pogovora',
+    thinking: 'Razmi拧ljanje...',
+    thought: 'Misel',
+    resend: 'Ponovno po拧lji',
+  },
+  promptEditor: {
+    context: {
+      item: {
+        desc: 'Vstavljanje predloge konteksta',
+        title: 'Kontekstu',
+      },
+      modal: {
+        footer: 'Kontekste lahko upravljate v spodnjem razdelku Kontekst.',
+        title: '{{num}} Znanje v kontekstu',
+        add: 'Dodajanje konteksta',
+      },
+    },
+    history: {
+      item: {
+        desc: 'Vstavljanje predloge zgodovinskega sporo膷ila',
+        title: 'Zgodovina pogovorov',
+      },
+      modal: {
+        title: 'PRIMER',
+        edit: 'Urejanje imen vlog v pogovoru',
+        assistant: 'Zdravo! Kako vam lahko pomagam danes?',
+        user: 'Zdravo',
+      },
+    },
+    variable: {
+      item: {
+        desc: 'Vstavljanje spremenljivk in zunanjih orodij',
+        title: 'Spremenljivke in zunanja orodja',
+      },
+      outputToolDisabledItem: {
+        title: 'Spremenljivke',
+        desc: 'Vstavljanje spremenljivk',
+      },
+      modal: {
+        addTool: 'Novo orodje',
+        add: 'Nova spremenljivka',
+      },
+    },
+    query: {
+      item: {
+        title: 'Poizvedba',
+        desc: 'Vstavljanje predloge uporabni拧ke poizvedbe',
+      },
+    },
+    existed: '沤e obstaja v pozivu',
+    placeholder: 'Tukaj vnesite svojo pozivno besedo, vnesite \'{\' za vstavljanje spremenljivke, vnesite \'/\', da vstavite blok vsebine',
+  },
+  imageUploader: {
+    pasteImageLinkInvalid: 'Neveljavna povezava do slike',
+    uploadFromComputerLimit: 'Nalaganje slik ne sme presegati {{size}} MB',
+    uploadFromComputerUploadError: 'Nalaganje slike ni uspelo, nalo啪ite ga znova.',
+    pasteImageLink: 'Prilepi povezavo do slike',
+    imageUpload: 'Nalaganje slik',
+    uploadFromComputer: 'Nalo啪i iz ra膷unalnika',
+    pasteImageLinkInputPlaceholder: 'Tukaj prilepi povezavo do slike',
+    uploadFromComputerReadError: 'Branje slik ni uspelo, poskusite znova.',
+  },
+  fileUploader: {
+    fileExtensionNotSupport: 'Datote膷na pripona ni podprta',
+    pasteFileLinkInvalid: 'Neveljavna povezava do datoteke',
+    pasteFileLink: 'Prilepi povezavo do datoteke',
+    pasteFileLinkInputPlaceholder: 'Vnesite URL ...',
+    uploadFromComputerUploadError: 'Nalaganje datoteke ni uspelo, nalo啪ite ga znova.',
+    uploadFromComputer: 'Lokalno nalaganje',
+    uploadFromComputerLimit: 'Nalaganje {{type}} ne sme presegati {{size}}',
+    uploadFromComputerReadError: 'Branje datoteke ni uspelo, poskusite znova.',
+  },
+  tag: {
+    addTag: 'Dodajanje oznak',
+    delete: 'Brisanje oznake',
+    manageTags: 'Upravljanje oznak',
+    addNew: 'Dodajanje nove oznake',
+    placeholder: 'Vse oznake',
+    failed: 'Ustvarjanje oznake ni uspelo',
+    editTag: 'Urejanje oznak',
+    created: 'Oznaka je bila uspe拧no ustvarjena',
+    noTagYet: '艩e ni oznak',
+    create: 'Ustvariti',
+    deleteTip: 'Oznaka se uporablja, jo izbri拧ite?',
+    noTag: 'Brez oznak',
+    selectorPlaceholder: 'Vnesite za iskanje ali ustvarjanje',
+  },
+  license: {
+    expiring_plural: 'Pote膷e v {{count}} dneh',
+    expiring: 'Pote膷e v enem dnevu',
+  },
+  pagination: {
+    perPage: 'Elementi na stran',
+  },
+  theme: {
+    theme: 'Tema',
+    light: 'svetloba',
+    auto: 'sistem',
+    dark: 'temno',
+  },
+  compliance: {
+    sandboxUpgradeTooltip: 'Na voljo je le z na膷rtom Professional ali Team.',
+    gdpr: 'GDPR DPA',
+    soc2Type2: 'Poro膷ilo SOC 2 Tip II',
+    professionalUpgradeTooltip: 'Na voljo je le s Team na膷rtom ali vi拧jim.',
+    iso27001: 'Certifikacija ISO 27001:2022',
+    soc2Type1: 'Poro膷ilo SOC 2 Tip I',
+  },
+  imageInput: {
+    supportedFormats: 'Podpira PNG, JPG, JPEG, WEBP in GIF',
+    browse: 'brskati',
+    dropImageHere: 'Tukaj spustite svojo sliko ali',
+  },
+}
+
+export default translation
diff --git a/i18n/sl-SI/custom.ts b/i18n/sl-SI/custom.ts
new file mode 100644
index 0000000..59f0a6b
--- /dev/null
+++ b/i18n/sl-SI/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: 'Prilagoditev',
+  upgradeTip: {
+    prefix: 'Nadgradite svoj na膷rt za',
+    suffix: 'prilagoditev va拧e blagovne znamke.',
+    des: 'Nadgradite svoj na膷rt, da prilagodite svojo blagovno znamko',
+    title: 'Nadgradite svoj na膷rt',
+  },
+  webapp: {
+    title: 'Prilagodi blagovno znamko spletne aplikacije',
+    removeBrand: 'Odstrani Powered by Dify',
+    changeLogo: 'Spremeni sliko Powered by Brand',
+    changeLogoTip: 'Format SVG ali PNG z minimalno velikostjo 40x40px',
+  },
+  app: {
+    title: 'Prilagodi blagovno znamko glave aplikacije',
+    changeLogoTip: 'Format SVG ali PNG z minimalno velikostjo 80x80px',
+  },
+  upload: 'Nalo啪i',
+  uploading: 'Nalagam',
+  uploadedFail: 'Nalaganje slike ni uspelo, prosimo, poskusite znova.',
+  change: 'Spremeni',
+  apply: 'Uporabi',
+  restore: 'Obnovi privzete nastavitve',
+  customize: {
+    contactUs: ' kontaktirajte nas ',
+    prefix: 'Za prilagoditev logotipa blagovne znamke znotraj aplikacije, prosimo,',
+    suffix: 'za nadgradnjo na Enterprise izdajo.',
+  },
+}
+
+export default translation
diff --git a/i18n/sl-SI/dataset-creation.ts b/i18n/sl-SI/dataset-creation.ts
new file mode 100644
index 0000000..72e7104
--- /dev/null
+++ b/i18n/sl-SI/dataset-creation.ts
@@ -0,0 +1,218 @@
+const translation = {
+  steps: {
+    header: {
+      creation: 'Ustvari Znanje',
+      update: 'Dodaj podatke',
+      fallbackRoute: 'Znanje',
+    },
+    one: 'Izberi vir podatkov',
+    two: 'Predobdelava in 膷i拧膷enje besedila',
+    three: 'Izvedi in zaklju膷i',
+  },
+  error: {
+    unavailable: 'To Znanje ni na voljo',
+  },
+  firecrawl: {
+    configFirecrawl: 'Nastavi 馃敟Firecrawl',
+    apiKeyPlaceholder: 'API klju膷 od firecrawl.dev',
+    getApiKeyLinkText: 'Pridobi API klju膷 na firecrawl.dev',
+  },
+  jinaReader: {
+    configJinaReader: 'Nastavi Jina Reader',
+    apiKeyPlaceholder: 'API klju膷 od jina.ai',
+    getApiKeyLinkText: 'Pridobi brezpla膷ni API klju膷 na jina.ai',
+  },
+  stepOne: {
+    filePreview: 'Predogled datoteke',
+    pagePreview: 'Predogled strani',
+    dataSourceType: {
+      file: 'Uvozi iz datoteke',
+      notion: 'Sinhroniziraj z Notion',
+      web: 'Sinhroniziraj s spletno stranjo',
+    },
+    uploader: {
+      title: 'Nalo啪i datoteko',
+      button: 'Povleci in spusti datoteke ali mape oz',
+      browse: 'Prebrskaj',
+      tip: 'Podprti tipi datotek: {{supportTypes}}. Najve膷 {{size}}MB na datoteko.',
+      validation: {
+        typeError: 'Tip datoteke ni podprt',
+        size: 'Datoteka je prevelika. Najve膷ja dovoljena velikost je {{size}}MB',
+        count: 'Podprta je le ena datoteka',
+        filesNumber: 'Dosegli ste omejitev za po拧iljanje {{filesNumber}} datotek.',
+      },
+      cancel: 'Prekli膷i',
+      change: 'Zamenjaj',
+      failed: 'Nalaganje ni uspelo',
+    },
+    notionSyncTitle: 'Notion ni povezan',
+    notionSyncTip: 'Za sinhronizacijo z Notion je najprej potrebno vzpostaviti povezavo.',
+    connect: 'Pojdi na povezavo',
+    button: 'Naprej',
+    emptyDatasetCreation: '沤elim ustvariti prazno Znanje',
+    modal: {
+      title: 'Ustvari prazno Znanje',
+      tip: 'Prazno Znanje ne bo vsebovalo dokumentov, dokumente pa lahko nalo啪ite kadarkoli.',
+      input: 'Ime Znanja',
+      placeholder: 'Vnesite ime',
+      nameNotEmpty: 'Ime ne sme biti prazno',
+      nameLengthInvalid: 'Ime mora imeti od 1 do 40 znakov',
+      cancelButton: 'Prekli膷i',
+      confirmButton: 'Ustvari',
+      failed: 'Ustvarjanje ni uspelo',
+    },
+    website: {
+      chooseProvider: 'Izberi ponudnika',
+      fireCrawlNotConfigured: 'Firecrawl ni nastavljen',
+      fireCrawlNotConfiguredDescription: 'Nastavite Firecrawl z API klju膷em, da ga lahko uporabite.',
+      jinaReaderNotConfigured: 'Jina Reader ni nastavljen',
+      jinaReaderNotConfiguredDescription: 'Nastavite Jina Reader z vnosom brezpla膷nega API klju膷a.',
+      configure: 'Nastavi',
+      run: 'Za啪eni',
+      firecrawlTitle: 'Izvleci spletno vsebino z 馃敟Firecrawl',
+      firecrawlDoc: 'Firecrawl dokumentacija',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      jinaReaderTitle: 'Pretvori celotno stran v Markdown',
+      jinaReaderDoc: 'Ve膷 o Jina Reader',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      useSitemap: 'Uporabi sitemap',
+      useSitemapTooltip: 'Sledi zemljevidu spletne strani (sitemap) za iskanje strani. 膶e ne, bo Jina Reader iterativno iskal strani na podlagi pomembnosti, kar bo prineslo manj, a bolj relevantnih strani.',
+      options: 'Mo啪nosti',
+      crawlSubPage: 'I拧膷i podstrani',
+      limit: 'Omejitev',
+      maxDepth: 'Najve膷ja globina',
+      excludePaths: 'Izklju膷i poti',
+      includeOnlyPaths: 'Vklju膷i le poti',
+      extractOnlyMainContent: 'Izvleci le glavno vsebino (brez glav, navigacij, nog itd.)',
+      exceptionErrorTitle: 'Med izvajanjem iskanja je pri拧lo do izjeme:',
+      unknownError: 'Neznana napaka',
+      totalPageScraped: 'Skupaj preiskanih strani:',
+      selectAll: 'Izberi vse',
+      resetAll: 'Ponastavi vse',
+      scrapTimeInfo: 'Skupaj preiskanih {{total}} strani v {{time}}s',
+      preview: 'Predogled',
+      maxDepthTooltip: 'Najve膷ja globina iskanja glede na vneseni URL. Globina 0 bo iskala le stran z vnesenim URL-jem, globina 1 bo iskala URL in vse za tem, dodano z enim /, in tako naprej.',
+      waterCrawlNotConfiguredDescription: 'Konfigurirajte Watercrawl z API klju膷em, da ga uporabite.',
+      configureWatercrawl: 'Konfiguriraj Watercrawl',
+      waterCrawlNotConfigured: 'Watercrawl ni konfiguriran',
+      watercrawlDoc: 'Watercrawl dokumentacija',
+      configureJinaReader: 'Konfigurirajte Jina Reader',
+      watercrawlDocLink: 'https://docs.dify.ai/sl/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      configureFirecrawl: 'Konfigurirajte Firecrawl',
+      watercrawlTitle: 'Izvleci vsebino z interneta z Watercrawl',
+    },
+    cancel: 'Odpovedati',
+  },
+  stepTwo: {
+    segmentation: 'Nastavitve razdeljevanja',
+    auto: 'Samodejno',
+    autoDescription: 'Samodejno nastavi pravila za razdeljevanje in predobdelavo besedila. Neizku拧enim uporabnikom priporo膷amo to mo啪nost.',
+    custom: 'Po meri',
+    customDescription: 'Prilagodi pravila za razdeljevanje, dol啪ino delcev in pravila za predobdelavo besedila itd.',
+    separator: 'Lo膷ilo',
+    separatorTip: 'Lo膷ilo je znak, ki se uporablja za lo膷evanje besedila. \\n\\n in \\n sta pogosto uporabljeni lo膷ili za lo膷evanje odstavkov in vrstic. V kombinaciji z vejicami (\\n\\n,\\n) bodo odstavki razdeljeni po vrsticah, ko bo prese啪ena najve膷ja dol啪ina delcev. Uporabite lahko tudi posebna lo膷ila, ki jih sami dolo膷ite (npr. ***).',
+    separatorPlaceholder: '\\n\\n za lo膷evanje odstavkov; \\n za lo膷evanje vrstic',
+    maxLength: 'Najve膷ja dol啪ina delca',
+    overlap: 'Prekrivanje delcev',
+    overlapTip: 'Nastavitev prekrivanja delcev lahko ohrani semanti膷no povezavo med njimi, kar izbolj拧a u膷inkovitost iskanja. Priporo膷amo nastavitev 10%-25% najve膷je dol啪ine delca.',
+    overlapCheck: 'Prekrivanje delca ne sme biti ve膷je od najve膷je dol啪ine delca',
+    rules: 'Pravila predobdelave besedila',
+    removeExtraSpaces: 'Zamenjaj zaporedne presledke, vrstice in zavihke',
+    removeUrlEmails: 'Izbri拧i vse URL-je in e-po拧tne naslove',
+    removeStopwords: 'Odstrani neuporabne besede kot so "a", "an", "the"',
+    preview: 'Potrdi in predogled',
+    reset: 'Ponastavi',
+    indexMode: 'Na膷in indeksiranja',
+    qualified: 'Visoka kakovost',
+    recommend: 'Priporo膷eno',
+    qualifiedTip: 'Za obdelavo se uporabi privzeti sistemski vmesnik za vdelavo, ki zagotavlja vi拧jo natan膷nost pri poizvedbah uporabnikov.',
+    warning: 'Najprej nastavite API klju膷 za model ponudnika.',
+    click: 'Pojdi na nastavitve',
+    economical: 'Ekonomsko',
+    economicalTip: 'Uporablja lokalne vektorske pogone, klju膷ne besede, itd., kar zmanj拧a natan膷nost brez porabe 啪etonov.',
+    QATitle: 'Razdeljevanje v obliki Vpra拧anje & Odgovor',
+    QATip: 'Omogo膷anje te mo啪nosti bo porabilo ve膷 啪etonov',
+    QALanguage: 'Razdelitev z uporabo',
+    estimateCost: 'Ocena stro拧kov',
+    estimateSegment: 'Ocenjeno 拧tevilo delcev',
+    segmentCount: 'delci',
+    calculating: 'Izra膷unavam...',
+    fileSource: 'Predobdelava dokumentov',
+    notionSource: 'Predobdelava strani',
+    websiteSource: 'Predobdelava spletne strani',
+    other: 'in drugi ',
+    fileUnit: ' dokumenti',
+    notionUnit: ' strani',
+    webpageUnit: ' strani',
+    previousStep: 'Prej拧nji korak',
+    nextStep: 'Shrani in obdela',
+    save: 'Shrani in obdela',
+    cancel: 'Prekli膷i',
+    sideTipTitle: 'Zakaj razdeljevanje in predobdelava?',
+    sideTipP1: 'Pri obdelavi besedilnih podatkov sta razdeljevanje in 膷i拧膷enje dve pomembni fazi predobdelave.',
+    sideTipP2: 'Razdeljevanje dolga besedila na odstavke omogo膷a modelom bolj拧e razumevanje. To izbolj拧a kakovost in relevantnost rezultatov modela.',
+    sideTipP3: '膶i拧膷enje odstranjuje nepotrebne znake in formate, kar Znanje naredi bolj 膷isto in la啪je obdeljivo.',
+    sideTipP4: 'Pravilno razdeljevanje in 膷i拧膷enje izbolj拧ata delovanje modela, kar zagotavlja bolj natan膷ne in dragocene rezultate.',
+    previewTitle: 'Predogled',
+    previewTitleButton: 'Predogled',
+    previewButton: 'Preklop v obliko Vpra拧anje & Odgovor',
+    previewSwitchTipStart: 'Trenutni predogled delcev je v obliki besedila, preklop na predogled v obliki vpra拧anj in odgovorov bo',
+    previewSwitchTipEnd: ' porabil dodatne 啪etone',
+    characters: 'znaki',
+    indexSettingTip: '膶e 啪elite spremeniti na膷in indeksiranja in model vdelave, pojdite na ',
+    retrievalSettingTip: '膶e 啪elite spremeniti nastavitve iskanja, pojdite na ',
+    datasetSettingLink: 'nastavitve Znanja.',
+    maxLengthCheck: 'Najve膷ja dol啪ina kosa mora biti manj拧a od {{limit}}',
+    fullDoc: 'Celoten dokument',
+    parentChildChunkDelimiterTip: 'Lo膷ilo je znak, ki se uporablja za lo膷evanje besedila. \\n je priporo膷ljivo za razdelitev star拧evskih kosov na majhne otro拧ke ko拧膷ke. Uporabite lahko tudi posebne lo膷ila, ki ste jih dolo膷ili sami.',
+    highQualityTip: 'Ko kon膷ate vdelavo v na膷inu visoke kakovosti, vrnitev v ekonomi膷ni na膷in ni na voljo.',
+    parentChildTip: 'Ko uporabljate na膷in nadreje-podrejenega, se podrejeni kos uporablja za pridobivanje, nadrejeni kos pa se uporablja za odpoklic kot kontekst.',
+    paragraph: 'Odstavek',
+    qaSwitchHighQualityTipTitle: 'Oblika zapisa vpra拧anj in odgovorov zahteva visokokakovostno metodo indeksiranja',
+    paragraphTip: 'Ta na膷in razdeli besedilo na odstavke na podlagi lo膷il in najve膷je dol啪ine kosa, pri 膷emer se razdeljeno besedilo uporabi kot nadrejeni kos za pridobivanje.',
+    parentChildDelimiterTip: 'Lo膷ilo je znak, ki se uporablja za lo膷evanje besedila. \\n\\n je priporo膷ljivo za razdelitev izvirnega dokumenta na velike nadrejene dele. Uporabite lahko tudi posebne lo膷ila, ki ste jih dolo膷ili sami.',
+    notAvailableForQA: 'Ni na voljo za indeks vpra拧anj in odgovorov',
+    parentChild: 'Star拧-otrok',
+    parentChunkForContext: 'Nadrejeni kos za kontekst',
+    notAvailableForParentChild: 'Ni na voljo za indeks nadrejenega in podrejenega',
+    previewChunk: 'Predogled kosa',
+    previewChunkCount: '{{拧tetje}} Ocenjeni kosi',
+    previewChunkTip: 'Kliknite gumb 禄Predogled kosa芦 na levi, da nalo啪ite predogled',
+    fullDocTip: 'Celoten dokument je uporabljen kot nadrejeni kos in pridobljen neposredno. Upo拧tevajte, da bo zaradi uspe拧nosti besedilo, ki presega 10000 啪etonov, samodejno prikraj拧ano.',
+    childChunkForRetrieval: 'Otro拧ki kos za pridobivanje',
+    qaSwitchHighQualityTipContent: 'Trenutno samo visokokakovostna metoda indeksa podpira deljenje v obliki vpra拧anj in odgovorov. 沤elite preklopiti na kakovosten na膷in?',
+    generalTip: 'Splo拧ni na膷in deljenja besedila, pridobljeni in odpoklicani kosi so enaki.',
+    useQALanguage: 'Del膷ek z obliko zapisa vpra拧anj in odgovorov v',
+    general: 'Splo拧no',
+    switch: 'Stikalo',
+  },
+  stepThree: {
+    creationTitle: '馃帀 Znanje ustvarjeno',
+    creationContent: 'Samodejno smo poimenovali Znanje, ime lahko kadarkoli spremenite.',
+    label: 'Ime Znanja',
+    additionTitle: '馃帀 Dokument nalo啪en',
+    additionP1: 'Dokument je bil nalo啪en v Znanje',
+    additionP2: ', lahko ga najdete v seznamu dokumentov Znanja.',
+    stop: 'Ustavi obdelavo',
+    resume: 'Nadaljuj obdelavo',
+    navTo: 'Pojdi na dokument',
+    sideTipTitle: 'Kaj sledi',
+    sideTipContent: 'Ko je dokument kon膷an z indeksiranjem, lahko Znanje vklju膷ite v aplikacijo kot kontekst, nastavitve konteksta najdete na strani za orkestracijo ukazov. Prav tako ga lahko ustvarite kot samostojni vti膷nik za indeksiranje ChatGPT in ga izdate.',
+    modelTitle: 'Ali ste prepri膷ani, da 啪elite ustaviti vdelavo?',
+    modelContent: '膶e boste morali nadaljevati obdelavo kasneje, se bo ta nadaljevala tam, kjer ste kon膷ali.',
+    modelButtonConfirm: 'Potrdi',
+    modelButtonCancel: 'Prekli膷i',
+  },
+  otherDataSource: {
+    learnMore: 'Izvedi ve膷',
+    title: 'Vzpostavite povezavo z drugimi viri podatkov?',
+    description: 'Trenutno ima baza znanja Dify le omejene vire podatkov. Prispevanje vira podatkov v bazo znanja Dify je fantasti膷en na膷in za izbolj拧anje prilagodljivosti in mo膷i platforme za vse uporabnike. Na拧 vodnik za prispevke olaj拧a za膷etek. 膶e 啪elite izvedeti ve膷, kliknite spodnjo povezavo.',
+  },
+  watercrawl: {
+    configWatercrawl: 'Konfiguriraj Watercrawl',
+    getApiKeyLinkText: 'Pridobite svoj API klju膷 iz watercrawl.dev',
+    apiKeyPlaceholder: 'API klju膷 iz watercrawl.dev',
+  },
+}
+
+export default translation
diff --git a/i18n/sl-SI/dataset-documents.ts b/i18n/sl-SI/dataset-documents.ts
new file mode 100644
index 0000000..78d63c9
--- /dev/null
+++ b/i18n/sl-SI/dataset-documents.ts
@@ -0,0 +1,395 @@
+const translation = {
+  list: {
+    title: 'Dokumenti',
+    desc: 'Vse datoteke znanja so prikazane tukaj, celotno znanje pa je mogo膷e povezati s citati Dify ali indeksirati prek vti膷nika Chat.',
+    addFile: 'Dodaj datoteko',
+    addPages: 'Dodaj strani',
+    addUrl: 'Dodaj URL',
+    table: {
+      header: {
+        fileName: 'IME DATOTEKE',
+        words: 'BESEDE',
+        hitCount: '艩TEVILO PRIDOBITEV',
+        uploadTime: '膶AS NALAGANJA',
+        status: 'STATUS',
+        action: 'DEJANJE',
+        chunkingMode: 'NA膶IN KO艩膶ENJA',
+      },
+      rename: 'Preimenuj',
+      name: 'Ime',
+    },
+    action: {
+      uploadFile: 'Nalo啪i novo datoteko',
+      settings: 'Nastavitve segmenta',
+      addButton: 'Dodaj del',
+      add: 'Dodaj del',
+      batchAdd: 'Serijsko dodajanje',
+      archive: 'Arhiviraj',
+      unarchive: 'Razveljavi arhiviranje',
+      delete: 'Izbri拧i',
+      enableWarning: 'Arhivirane datoteke ni mogo膷e omogo膷iti',
+      sync: 'Sinhroniziraj',
+    },
+    index: {
+      enable: 'Omogo膷i',
+      disable: 'Onemogo膷i',
+      all: 'Vse',
+      enableTip: 'Datoteka je lahko indeksirana',
+      disableTip: 'Datoteka ne more biti indeksirana',
+    },
+    status: {
+      queuing: 'V 膷akalni vrsti',
+      indexing: 'Indeksiranje',
+      paused: 'Zaustavljeno',
+      error: 'Napaka',
+      available: 'Na voljo',
+      enabled: 'Omogo膷eno',
+      disabled: 'Onemogo膷eno',
+      archived: 'Arhivirano',
+    },
+    empty: {
+      title: 'Dokumentacije 拧e ni',
+      upload: {
+        tip: 'Lahko nalo啪ite datoteke, sinhronizirate z spletno stranjo ali aplikacijami, kot so Notion, GitHub itd.',
+      },
+      sync: {
+        tip: 'Dify bo ob膷asno prenesel datoteke iz Notion in dokon膷al obdelavo.',
+      },
+    },
+    delete: {
+      title: 'Ali ste prepri膷ani, da 啪elite izbrisati?',
+      content: '膶e boste nadaljevali obdelavo kasneje, boste nadaljevali tam, kjer ste kon膷ali.',
+    },
+    batchModal: {
+      title: 'Serijsko dodajanje delov',
+      csvUploadTitle: 'Povlecite in spustite svojo CSV datoteko tukaj ali ',
+      browse: 'brskajte',
+      tip: 'CSV datoteka mora ustrezati naslednji strukturi:',
+      question: 'vpra拧anje',
+      answer: 'odgovor',
+      contentTitle: 'vsebina dela',
+      content: 'vsebina',
+      template: 'Prenesite predlogo tukaj',
+      cancel: 'Prekli膷i',
+      run: 'Za啪eni serijo',
+      runError: 'Serijsko dodajanje ni uspelo',
+      processing: 'V obdelavi serije',
+      completed: 'Uvoz zaklju膷en',
+      error: 'Napaka pri uvozu',
+      ok: 'V redu',
+    },
+    learnMore: 'Izvedi ve膷',
+  },
+  metadata: {
+    title: 'Metapodatki',
+    desc: 'Ozna膷evanje metapodatkov za dokumente omogo膷a, da AI pravo膷asno dostopa do njih in prika啪e vir referenc uporabnikom.',
+    dateTimeFormat: 'MMMM D, YYYY hh:mm A',
+    docTypeSelectTitle: 'Izberite vrsto dokumenta',
+    docTypeChangeTitle: 'Spremeni vrsto dokumenta',
+    docTypeSelectWarning:
+      '膶e se vrsta dokumenta spremeni, trenutni vneseni metapodatki ne bodo ohranjeni',
+    firstMetaAction: 'Za膷ni',
+    placeholder: {
+      add: 'Dodaj ',
+      select: 'Izberi ',
+    },
+    source: {
+      upload_file: 'Nalo啪i datoteko',
+      notion: 'Sinhroniziraj iz Notion',
+      github: 'Sinhroniziraj iz Github',
+    },
+    type: {
+      book: 'Knjiga',
+      webPage: 'Spletna stran',
+      paper: 'Znanstveni 膷lanek',
+      socialMediaPost: 'Objava na dru啪benih omre啪jih',
+      personalDocument: 'Osebni dokument',
+      businessDocument: 'Poslovni dokument',
+      IMChat: 'Klepet',
+      wikipediaEntry: 'Vnos iz Wikipedije',
+      notion: 'Sinhroniziraj iz Notion',
+      github: 'Sinhroniziraj iz Github',
+      technicalParameters: 'Tehni膷ni parametri',
+    },
+    field: {
+      processRule: {
+        processDoc: 'Obdelaj dokument',
+        segmentRule: 'Pravilo segmenta',
+        segmentLength: 'Dol啪ina segmentov',
+        processClean: '膶i拧膷enje besedila',
+      },
+      book: {
+        title: 'Naslov',
+        language: 'Jezik',
+        author: 'Avtor',
+        publisher: 'Zalo啪nik',
+        publicationDate: 'Datum objave',
+        ISBN: 'ISBN',
+        category: 'Kategorija',
+      },
+      webPage: {
+        title: 'Naslov',
+        url: 'URL',
+        language: 'Jezik',
+        authorPublisher: 'Avtor/Zalo啪nik',
+        publishDate: 'Datum objave',
+        topicKeywords: 'Teme/Klju膷ne besede',
+        description: 'Opis',
+      },
+      paper: {
+        title: 'Naslov',
+        language: 'Jezik',
+        author: 'Avtor',
+        publishDate: 'Datum objave',
+        journalConferenceName: 'Ime revije/konference',
+        volumeIssuePage: 'Letnik/艩tevilka/Stran',
+        DOI: 'DOI',
+        topicsKeywords: 'Teme/Klju膷ne besede',
+        abstract: 'Povzetek',
+      },
+      socialMediaPost: {
+        platform: 'Platforma',
+        authorUsername: 'Avtor/Uporabni拧ko ime',
+        publishDate: 'Datum objave',
+        postURL: 'URL objave',
+        topicsTags: 'Teme/Oznake',
+      },
+      personalDocument: {
+        title: 'Naslov',
+        author: 'Avtor',
+        creationDate: 'Datum nastanka',
+        lastModifiedDate: 'Datum zadnje spremembe',
+        documentType: 'Vrsta dokumenta',
+        tagsCategory: 'Oznake/Kategorija',
+      },
+      businessDocument: {
+        title: 'Naslov',
+        author: 'Avtor',
+        creationDate: 'Datum nastanka',
+        lastModifiedDate: 'Datum zadnje spremembe',
+        documentType: 'Vrsta dokumenta',
+        departmentTeam: 'Oddelek/Ekipa',
+      },
+      IMChat: {
+        chatPlatform: 'Platforma za klepet',
+        chatPartiesGroupName: 'Udele啪enci klepeta/Skupina',
+        participants: 'Udele啪enci',
+        startDate: 'Datum za膷etka',
+        endDate: 'Datum konca',
+        topicsKeywords: 'Teme/Klju膷ne besede',
+        fileType: 'Vrsta datoteke',
+      },
+      wikipediaEntry: {
+        title: 'Naslov',
+        language: 'Jezik',
+        webpageURL: 'URL spletne strani',
+        editorContributor: 'Urednik/Sodelavec',
+        lastEditDate: 'Datum zadnje spremembe',
+        summaryIntroduction: 'Povzetek/Uvod',
+      },
+      notion: {
+        title: 'Naslov',
+        language: 'Jezik',
+        author: 'Avtor',
+        createdTime: '膶as nastanka',
+        lastModifiedTime: '膶as zadnje spremembe',
+        url: 'URL',
+        tag: 'Oznaka',
+        description: 'Opis',
+      },
+      github: {
+        repoName: 'Ime repozitorija',
+        repoDesc: 'Opis repozitorija',
+        repoOwner: 'Lastnik repozitorija',
+        fileName: 'Ime datoteke',
+        filePath: 'Pot do datoteke',
+        programmingLang: 'Programski jezik',
+        url: 'URL',
+        license: 'Licenca',
+        lastCommitTime: '膶as zadnje spremembe',
+        lastCommitAuthor: 'Avtor zadnje spremembe',
+      },
+      originInfo: {
+        originalFilename: 'Izvirno ime datoteke',
+        originalFileSize: 'Izvirna velikost datoteke',
+        uploadDate: 'Datum nalaganja',
+        lastUpdateDate: 'Datum zadnje spremembe',
+        source: 'Vir',
+      },
+      technicalParameters: {
+        segmentSpecification: 'Specifikacija segmentov',
+        segmentLength: 'Dol啪ina segmentov',
+        avgParagraphLength: 'Povpre膷na dol啪ina odstavka',
+        paragraphs: 'Odstavki',
+        hitCount: '艩tevilo pridobitev',
+        embeddingTime: '膶as vdelave',
+        embeddedSpend: 'Stro拧ki vdelave',
+      },
+    },
+    languageMap: {
+      zh: 'Kitaj拧膷ina',
+      en: 'Angle拧膷ina',
+      es: '艩pan拧膷ina',
+      fr: 'Franco拧膷ina',
+      de: 'Nem拧膷ina',
+      ja: 'Japon拧膷ina',
+      ko: 'Korej拧膷ina',
+      ru: 'Ru拧膷ina',
+      ar: 'Arab拧膷ina',
+      pt: 'Portugal拧膷ina',
+      it: 'Italijan拧膷ina',
+      nl: 'Nizozem拧膷ina',
+      pl: 'Polj拧膷ina',
+      sv: '艩ved拧膷ina',
+      tr: 'Tur拧膷ina',
+      he: 'Hebrej拧膷ina',
+      hi: 'Hinduj拧膷ina',
+      da: 'Dan拧膷ina',
+      fi: 'Fin拧膷ina',
+      no: 'Norve拧膷ina',
+      hu: 'Mad啪ar拧膷ina',
+      el: 'Gr拧膷ina',
+      cs: '膶e拧膷ina',
+      th: 'Taj拧膷ina',
+      id: 'Indonezij拧膷ina',
+    },
+    categoryMap: {
+      book: {
+        fiction: 'Leposlovje',
+        biography: 'Biografija',
+        history: 'Zgodovina',
+        science: 'Znanost',
+        technology: 'Tehnologija',
+        education: 'Izobra啪evanje',
+        philosophy: 'Filozofija',
+        religion: 'Religija',
+        socialSciences: 'Dru啪boslovje',
+        art: 'Umetnost',
+        travel: 'Potovanja',
+        health: 'Zdravje',
+        selfHelp: 'Samopomo膷',
+        businessEconomics: 'Poslovanje in ekonomija',
+        cooking: 'Kuhanje',
+        childrenYoungAdults: 'Otroci in mladi odrasli',
+        comicsGraphicNovels: 'Stripi in grafi膷ni romani',
+        poetry: 'Poezija',
+        drama: 'Drama',
+        other: 'Drugo',
+      },
+      personalDoc: {
+        notes: 'Zapiski',
+        blogDraft: 'Osnutek bloga',
+        diary: 'Dnevnik',
+        researchReport: 'Raziskovalno poro膷ilo',
+        bookExcerpt: 'Odlomek iz knjige',
+        schedule: 'Urnik',
+        list: 'Seznam',
+        projectOverview: 'Pregled projekta',
+        photoCollection: 'Fotografska zbirka',
+        creativeWriting: 'Ustvarjalno pisanje',
+        codeSnippet: 'Koda',
+        designDraft: 'Oblikovalski osnutek',
+        personalResume: 'Osebni 啪ivljenjepis',
+        other: 'Drugo',
+      },
+      businessDoc: {
+        meetingMinutes: 'Zapisniki sestankov',
+        researchReport: 'Raziskovalno poro膷ilo',
+        proposal: 'Predlog',
+        employeeHandbook: 'Priro膷nik za zaposlene',
+        trainingMaterials: 'Izobra啪evalni materiali',
+        requirementsDocument: 'Dokumentacija zahtev',
+        designDocument: 'Oblikovalska dokumentacija',
+        productSpecification: 'Specifikacija izdelka',
+        financialReport: 'Finan膷no poro膷ilo',
+        marketAnalysis: 'Tr啪na analiza',
+        projectPlan: 'Na膷rt projekta',
+        teamStructure: 'Struktura ekipe',
+        policiesProcedures: 'Pravila in postopki',
+        contractsAgreements: 'Pogodbe in dogovori',
+        emailCorrespondence: 'E-po拧tna korespondenca',
+        other: 'Drugo',
+      },
+    },
+  },
+  embedding: {
+    processing: 'Proces vdelave...',
+    paused: 'Vdelava zaustavljena',
+    completed: 'Vdelava zaklju膷ena',
+    error: 'Napaka pri vdelavi',
+    docName: 'Predobdelava dokumenta',
+    mode: 'Pravilo segmentacije',
+    segmentLength: 'Dol啪ina segmentov',
+    textCleaning: 'Predobdelava in 膷i拧膷enje besedila',
+    segments: 'Odstavki',
+    highQuality: 'Na膷in visoke kakovosti',
+    economy: 'Ekonomski na膷in',
+    estimate: 'Ocenjena poraba',
+    stop: 'Ustavi obdelavo',
+    resume: 'Nadaljuj obdelavo',
+    automatic: 'Samodejno',
+    custom: 'Po meri',
+    previewTip: 'Predogled odstavkov bo na voljo po zaklju膷ku vdelave',
+    hierarchical: 'Star拧-otrok',
+    childMaxTokens: 'Otrok',
+    pause: 'Pavza',
+    parentMaxTokens: 'Star拧',
+  },
+  segment: {
+    paragraphs: 'Odstavki',
+    keywords: 'Klju膷ne besede',
+    addKeyWord: 'Dodaj klju膷no besedo',
+    keywordError: 'Najve膷ja dol啪ina klju膷ne besede je 20',
+    characters: 'znakov',
+    hitCount: '艩tevilo pridobitev',
+    vectorHash: 'Vektorski hash: ',
+    questionPlaceholder: 'dodajte vpra拧anje tukaj',
+    questionEmpty: 'Vpra拧anje ne sme biti prazno',
+    answerPlaceholder: 'dodajte odgovor tukaj',
+    answerEmpty: 'Odgovor ne sme biti prazen',
+    contentPlaceholder: 'dodajte vsebino tukaj',
+    contentEmpty: 'Vsebina ne sme biti prazna',
+    newTextSegment: 'Nov besedilni segment',
+    newQaSegment: 'Nov Q&A segment',
+    delete: 'Izbri拧i ta del?',
+    regenerationSuccessTitle: 'Regeneracija kon膷ana',
+    expandChunks: 'Raz拧iritev kosov',
+    childChunk: 'Otro拧ki kos',
+    editedAt: 'Urejeno na',
+    edited: 'UREJATI',
+    addAnother: 'Dodajanje 拧e enega',
+    childChunks_one: 'OTRO艩KI KOS',
+    chunkDetail: 'Detajl ko拧膷ka',
+    chunkAdded: 'Dodan 1 kos',
+    editChildChunk: 'Urejanje podrejenega kosa',
+    regenerationConfirmTitle: 'Ali 啪elite regenerirati otro拧ke ko拧膷ke?',
+    empty: 'Ni najdenega ko拧膷ka',
+    searchResults_other: 'REZULTATI',
+    childChunks_other: 'OTRO艩KI KO艩膶KI',
+    addChildChunk: 'Dodajanje podrejenega kosa',
+    editParentChunk: 'Urejanje nadrejenega kosa',
+    regenerationConfirmMessage: 'Obnavljanje podrejenih kosov bo prepisalo trenutne podrejene ko拧膷ke, vklju膷no z urejenimi ko拧膷ki in na novo dodanimi kosi. Regeneracije ni mogo膷e razveljaviti.',
+    editChunk: 'Uredi kos',
+    chunks_one: 'KOS',
+    searchResults_one: 'REZULTAT',
+    parentChunks_one: 'STAR艩EVSKI KOS',
+    characters_other: 'Znakov',
+    chunks_other: 'KOSE',
+    clearFilter: 'Po膷isti filter',
+    newChildChunk: 'Nov podzakonski kos',
+    characters_one: 'znak',
+    regeneratingTitle: 'Regeneracija otro拧kih kosov',
+    regeneratingMessage: 'To lahko traja trenutek, prosim po膷akajte ...',
+    parentChunks_other: 'STAR艩EVSKI KOSI',
+    collapseChunks: 'Strniti ko拧膷ke',
+    parentChunk: 'Star拧evski kos',
+    regenerationSuccessMessage: 'To okno lahko zaprete.',
+    newChunk: 'Nov kos',
+    searchResults_zero: 'REZULTAT',
+    chunk: 'Kos',
+    addChunk: 'Dodajanje kosa',
+    childChunkAdded: 'Dodan je 1 kos otroka',
+  },
+}
+
+export default translation
diff --git a/i18n/sl-SI/dataset-hit-testing.ts b/i18n/sl-SI/dataset-hit-testing.ts
new file mode 100644
index 0000000..645fd65
--- /dev/null
+++ b/i18n/sl-SI/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: 'Testiranje pridobivanja',
+  settingTitle: 'Nastavitve pridobivanja',
+  desc: 'Preizkusite u膷inkovitost zadetkov znanja na podlagi podanega poizvedbenega besedila',
+  dateTimeFormat: 'DD/MM/YYYY hh:mm A',
+  recents: 'Nedavno',
+  table: {
+    header: {
+      source: 'Vir',
+      text: 'Besedilo',
+      time: '膶as',
+    },
+  },
+  input: {
+    title: 'Izvorno besedilo',
+    placeholder: 'Prosimo, vnesite besedilo, priporo膷ljivo je kratko izjavno poved.',
+    countWarning: 'Do 200 znakov.',
+    indexWarning: 'Samo znanje visoke kakovosti.',
+    testing: 'Testiranje',
+  },
+  hit: {
+    title: 'PRIDOBLJENI ODSTAVKI',
+    emptyTip: 'Rezultati testiranja pridobivanja bodo prikazani tukaj',
+  },
+  noRecentTip: 'Tukaj ni nedavnih rezultatov poizvedb',
+  viewChart: 'Prika啪i VEKTORSKI GRAF',
+  viewDetail: 'Prika啪i podrobnosti',
+  records: 'Zapisov',
+  keyword: 'Klju膷ne besede',
+  chunkDetail: 'Detajl ko拧膷ka',
+  open: 'Odprt',
+  hitChunks: 'Zadenite {{num}} podrejene ko拧膷ke',
+}
+
+export default translation
diff --git a/i18n/sl-SI/dataset-settings.ts b/i18n/sl-SI/dataset-settings.ts
new file mode 100644
index 0000000..9ea30f3
--- /dev/null
+++ b/i18n/sl-SI/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: 'Nastavitve znanja',
+  desc: 'Tukaj lahko spremenite lastnosti in nastavitve pridobivanja tega znanja.',
+  form: {
+    name: 'Ime znanja',
+    namePlaceholder: 'Prosimo, vnesite ime znanja',
+    nameError: 'Ime ne sme biti prazno',
+    desc: 'Opis znanja',
+    descInfo: 'Prosimo, napi拧ite jasen besedilni opis, ki bo povzel vsebino znanja. Ta opis bo uporabljen kot osnova za ujemanje pri izbiri med ve膷 znanji za sklepanje.',
+    descPlaceholder: 'Opi拧ite, kaj je v tem znanju (neobvezno)',
+    descWrite: 'Nau膷ite se, kako napisati dober opis znanja.',
+    permissions: 'Dovoljenja',
+    permissionsOnlyMe: 'Samo jaz',
+    permissionsAllMember: 'Vsi 膷lani ekipe',
+    permissionsInvitedMembers: 'Dolo膷eni 膷lani ekipe',
+    me: '(Vi)',
+    indexMethod: 'Metoda indeksiranja',
+    indexMethodHighQuality: 'Visoka kakovost',
+    indexMethodHighQualityTip: 'Za obdelavo pokli膷ite vdelani model za zagotovitev ve膷je natan膷nosti pri poizvedbah uporabnikov.',
+    indexMethodEconomy: 'Var膷na',
+    indexMethodEconomyTip: 'Uporabite offline vektorske motorje, indeksiranje klju膷nih besed itd., da zmanj拧ate natan膷nost brez porabe 啪etonov',
+    embeddingModel: 'Vdelani model',
+    embeddingModelTip: '膶e 啪elite spremeniti vdelani model, pojdite na ',
+    embeddingModelTipLink: 'Nastavitve',
+    retrievalSetting: {
+      title: 'Nastavitve pridobivanja',
+      learnMore: 'Izvedite ve膷',
+      description: ' o metodi pridobivanja.',
+      longDescription: ' o metodi pridobivanja, to lahko kadar koli spremenite v nastavitvah znanja.',
+      method: 'Metoda pridobivanja',
+    },
+    externalKnowledgeAPI: 'Zunanji API za znanje',
+    externalKnowledgeID: 'ID zunanjega znanja',
+    retrievalSettings: 'Nastavitve pridobivanja',
+    save: 'Shrani',
+    indexMethodChangeToEconomyDisabledTip: 'Ni na voljo za pregradnjo iz HQ v ECO',
+    upgradeHighQualityTip: 'Ko nadgradite na na膷in visoke kakovosti, vrnitev v ekonomi膷ni na膷in ni na voljo',
+    helpText: 'Nau膷ite se napisati dober opis nabora podatkov.',
+    searchModel: 'I拧膷i model',
+  },
+}
+
+export default translation
diff --git a/i18n/sl-SI/dataset.ts b/i18n/sl-SI/dataset.ts
new file mode 100644
index 0000000..a9f9ccb
--- /dev/null
+++ b/i18n/sl-SI/dataset.ts
@@ -0,0 +1,221 @@
+const translation = {
+  knowledge: 'Znanje',
+  externalTag: 'Zunanje',
+  externalAPI: 'Zunanji API',
+  externalAPIPanelTitle: 'Zunanji API za znanje',
+  externalKnowledgeId: 'ID zunanjega znanja',
+  externalKnowledgeName: 'Ime zunanjega znanja',
+  externalKnowledgeDescription: 'Opis znanja',
+  externalKnowledgeIdPlaceholder: 'Prosimo, vnesite ID znanja',
+  externalKnowledgeNamePlaceholder: 'Prosimo, vnesite ime baze znanja',
+  externalKnowledgeDescriptionPlaceholder: 'Opi拧ite, kaj je v tej bazi znanja (neobvezno)',
+  learnHowToWriteGoodKnowledgeDescription: 'Nau膷ite se, kako napisati dober opis znanja',
+  externalAPIPanelDescription: 'Zunanji API za znanje se uporablja za povezovanje z bazo znanja izven Dify in pridobivanje znanja iz te baze.',
+  externalAPIPanelDocumentation: 'Nau膷ite se, kako ustvariti zunanji API za znanje',
+  documentCount: ' dokumentov',
+  wordCount: ' tiso膷 besed',
+  appCount: ' povezanih aplikacij',
+  createDataset: 'Ustvari znanje',
+  createNewExternalAPI: 'Ustvari nov zunanji API za znanje',
+  noExternalKnowledge: 'Zunanjega API-ja za znanje 拧e ni, kliknite tukaj za ustvarjanje',
+  createExternalAPI: 'Dodaj zunanji API za znanje',
+  editExternalAPIFormTitle: 'Uredi zunanji API za znanje',
+  editExternalAPITooltipTitle: 'POVEZANO ZNANJE',
+  editExternalAPIConfirmWarningContent: {
+    front: 'Ta zunanji API za znanje je povezan z',
+    end: 'zunanjim znanjem, in ta sprememba bo vplivala na vse njih. Ali ste prepri膷ani, da 啪elite shraniti to spremembo?',
+  },
+  editExternalAPIFormWarning: {
+    front: 'Ta zunanji API je povezan z',
+    end: 'zunanjim znanjem',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: 'Izbri拧i',
+      end: '?',
+    },
+    content: {
+      front: 'Ta zunanji API za znanje je povezan z',
+      end: 'zunanjim znanjem. Brisanje tega API-ja bo onemogo膷ilo vse povezane baze znanja. Ali ste prepri膷ani, da 啪elite izbrisati ta API?',
+    },
+    noConnectionContent: 'Ali ste prepri膷ani, da 啪elite izbrisati ta API?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: 'Izberite zunanji API za znanje',
+  },
+  connectDataset: 'Pove啪ite se z zunanjo bazo znanja',
+  connectDatasetIntro: {
+    title: 'Kako se povezati z zunanjo bazo znanja',
+    content: {
+      front: 'Za povezavo z zunanjo bazo znanja morate najprej ustvariti zunanji API. Prosimo, natan膷no preberite in se sklicujte na',
+      link: 'Nau膷ite se, kako ustvariti zunanji API',
+      end: '. Nato poi拧膷ite ustrezni ID znanja in ga vnesite v obrazec na levi. 膶e so vse informacije pravilne, boste po kliku na gumb za povezavo samodejno preusmerjeni na testiranje pridobivanja v bazi znanja.',
+    },
+    learnMore: 'Izvedite ve膷',
+  },
+  connectHelper: {
+    helper1: 'Pove啪ite se z zunanjimi bazami znanja preko API-ja in ID-ja baze znanja. Trenutno je ',
+    helper2: 'podprta le funkcionalnost pridobivanja',
+    helper3: '. Mo膷no priporo膷amo, da ',
+    helper4: 'natan膷no preberete dokumentacijo za pomo膷',
+    helper5: ' pred uporabo te funkcije.',
+  },
+  createDatasetIntro: 'Uvozite lastne podatke v besedilni obliki ali v realnem 膷asu pi拧ite podatke prek Webhook-a za izbolj拧anje konteksta LLM.',
+  deleteDatasetConfirmTitle: 'Izbrisati to znanje?',
+  deleteDatasetConfirmContent:
+    'Brisanje znanja je nepovratno. Uporabniki do va拧ega znanja ne bodo ve膷 imeli dostopa, vse nastavitve pozivov in dnevniki bodo trajno izbrisani.',
+  datasetUsedByApp: 'Znanje se uporablja v nekaterih aplikacijah. Aplikacije ne bodo ve膷 mogle uporabljati tega znanja, vse nastavitve pozivov in dnevniki bodo trajno izbrisani.',
+  datasetDeleted: 'Znanje izbrisano',
+  datasetDeleteFailed: 'Brisanje znanja ni uspelo',
+  didYouKnow: 'Ali ste vedeli?',
+  intro1: 'Znanje je mogo膷e integrirati v aplikacijo Dify ',
+  intro2: 'kot kontekst',
+  intro3: ',',
+  intro4: 'ali pa ',
+  intro5: 'se lahko ustvari',
+  intro6: ' kot samostojni vti膷nik ChatGPT za objavo',
+  unavailable: 'Ni na voljo',
+  unavailableTip: 'Vdelani model ni na voljo, potrebno je konfigurirati privzeti vdelani model',
+  datasets: 'ZNANJE',
+  datasetsApi: 'API DOSTOP',
+  externalKnowledgeForm: {
+    connect: 'Pove啪i',
+    cancel: 'Prekli膷i',
+  },
+  externalAPIForm: {
+    name: 'Ime',
+    endpoint: 'API Kon膷na to膷ka',
+    apiKey: 'API klju膷',
+    save: 'Shrani',
+    cancel: 'Prekli膷i',
+    edit: 'Uredi',
+    encrypted: {
+      front: 'Va拧 API 啪eton bo 拧ifriran in shranjen z uporabo',
+      end: 'tehnologije.',
+    },
+  },
+  retrieval: {
+    semantic_search: {
+      title: 'Vektorsko iskanje',
+      description: 'Ustvari vdelke poizvedbe in poi拧膷i odstavke besedila, ki so najbolj podobni njegovi vektorski predstavitvi.',
+    },
+    full_text_search: {
+      title: 'Iskanje celotnega besedila',
+      description: 'Indeksirajte vse izraze v dokumentu, kar uporabnikom omogo膷a iskanje katerega koli izraza in pridobitev ustreznega odstavka besedila, ki ga vsebuje.',
+    },
+    hybrid_search: {
+      title: 'Hibridno iskanje',
+      description: 'Isto膷asno izvede iskanje celotnega besedila in vektorsko iskanje ter ponovno razvrsti zadetke, da izbere najbolj拧e ujemanje za uporabnikovo poizvedbo. Uporabniki lahko dolo膷ijo ute啪i ali konfigurirajo model za ponovno razvr拧膷anje.',
+      recommend: 'Priporo膷amo',
+    },
+    invertedIndex: {
+      title: 'Inverzni indeks',
+      description: 'Inverzni indeks je struktura, ki se uporablja za u膷inkovito pridobivanje. Organizirano po izrazih, vsak izraz ka啪e na dokumente ali spletne strani, ki ga vsebujejo.',
+    },
+    change: 'Spremeni',
+    changeRetrievalMethod: 'Spremeni metodo pridobivanja',
+  },
+  docsFailedNotice: 'dokumentov ni bilo mogo膷e indeksirati',
+  retry: 'Poskusi znova',
+  indexingTechnique: {
+    high_quality: 'HQ',
+    economy: 'ECO',
+  },
+  indexingMethod: {
+    semantic_search: 'VEKTORSKO',
+    full_text_search: 'CELOTNO BESEDILO',
+    hybrid_search: 'HIBRIDNO',
+    invertedIndex: 'INVERZNO',
+  },
+  defaultRetrievalTip: 'Privzeto se uporablja ve膷potno pridobivanje. Znanje se pridobiva iz ve膷 baz znanja in nato ponovno razvrsti.',
+  mixtureHighQualityAndEconomicTip: 'Model za ponovno razvr拧膷anje je potreben za me拧anico baz znanja visoke kakovosti in var膷nih baz.',
+  inconsistentEmbeddingModelTip: 'Model za ponovno razvr拧膷anje je potreben, 膷e so vdelani modeli izbranih baz znanja neenotni.',
+  mixtureInternalAndExternalTip: 'Model za ponovno razvr拧膷anje je potreben za me拧anico notranjega in zunanjega znanja.',
+  allExternalTip: 'Pri uporabi samo zunanjega znanja lahko uporabnik izbere, ali 啪eli omogo膷iti model za ponovno razvr拧膷anje. 膶e ni omogo膷en, bodo pridobljeni deli razvr拧膷eni glede na ocene. 膶e so strategije pridobivanja razli膷nih baz znanja neenotne, bo to neto膷no.',
+  retrievalSettings: 'Nastavitve pridobivanja',
+  rerankSettings: 'Nastavitve za ponovno razvr拧膷anje',
+  weightedScore: {
+    title: 'Ute啪ena ocena',
+    description: 'Z nastavljanjem dodeljenih ute啪i ta strategija za ponovno razvr拧膷anje dolo膷a, ali naj se daje prednost semanti膷nemu ali klju膷nemu ujemanju.',
+    semanticFirst: 'Semanti膷no najprej',
+    keywordFirst: 'Klju膷ne besede najprej',
+    customized: 'Prilagojeno',
+    semantic: 'Semanti膷no',
+    keyword: 'Klju膷na beseda',
+  },
+  nTo1RetrievalLegacy: 'N-to-1 pridobivanje bo uradno ukinjeno septembra. Priporo膷amo uporabo najnovej拧ega ve膷potnega pridobivanja za bolj拧e rezultate.',
+  nTo1RetrievalLegacyLink: 'Izvedite ve膷',
+  nTo1RetrievalLegacyLinkText: 'N-to-1 pridobivanje bo uradno ukinjeno septembra.',
+  chunkingMode: {
+    general: 'Splo拧no',
+    parentChild: 'Star拧-otrok',
+  },
+  parentMode: {
+    fullDoc: 'Celoten dokument',
+    paragraph: 'Odstavek',
+  },
+  batchAction: {
+    cancel: 'Odpovedati',
+    selected: 'Izbrane',
+    enable: 'Omogo膷iti',
+    disable: 'Onesposobiti',
+    archive: 'Arhiv',
+    delete: 'Izbrisati',
+  },
+  localDocs: 'Lokalni dokumenti',
+  documentsDisabled: '{{num}} dokumenti onemogo膷eni - neaktivni ve膷 kot 30 dni',
+  preprocessDocument: '{{num}} Predobdelava dokumentov',
+  enable: 'Omogo膷iti',
+  allKnowledge: 'Vse znanje',
+  allKnowledgeDescription: 'Izberite, 膷e 啪elite prikazati vse znanje v tem delovnem prostoru. Samo lastnik delovnega prostora lahko upravlja vse znanje.',
+  metadata: {
+    createMetadata: {
+      name: 'Ime',
+      type: 'Tip',
+      namePlaceholder: 'Dodajte ime metapodatkov',
+      back: 'Nazaj',
+      title: 'Nova metapodatki',
+    },
+    checkName: {
+      empty: 'Ime metapodatkov ne more biti prazno',
+      invalid: 'Ime metapodatkov lahko vsebuje samo male 膷rke, 拧tevilke in pod膷rtaje ter se mora za膷eti z malo 膷rko.',
+    },
+    batchEditMetadata: {
+      editMetadata: 'Uredi metapodatke',
+      applyToAllSelectDocument: 'Uporabi za vse izbrane dokumente',
+      multipleValue: 'Ve膷 vrednosti',
+      applyToAllSelectDocumentTip: 'Samodejno ustvarite vse zgoraj omenjene urejene in nove metapodatke za vsa izbrana dokumenta, sicer bo urejanje metapodatkov veljalo le za dokumente, ki jih imajo.',
+      editDocumentsNum: 'Urejanje {{num}} dokumentov',
+    },
+    selectMetadata: {
+      search: 'I拧膷i metapodatke',
+      newAction: 'Nova metapodatki',
+      manageAction: 'Upravljati',
+    },
+    datasetMetadata: {
+      rename: 'Preimenuj',
+      namePlaceholder: 'Ime metapodatkov',
+      deleteTitle: 'Potrdite, da 啪elite izbrisati',
+      builtIn: 'Vgrajeno',
+      deleteContent: 'Ali ste prepri膷ani, da 啪elite izbrisati metadata "{{name}}"',
+      builtInDescription: 'Vgrajeni metapodatki so samodejno izvle膷eni in ustvarjeni. Morajo biti omogo膷eni pred uporabo in jih ni mogo膷e urejati.',
+      values: '{{num}} Vrednosti',
+      addMetaData: 'Dodaj metapodatke',
+      description: 'Vse metapodatke lahko upravljate tukaj v tej bazi znanja. Spremembe bodo usklajene z vsakim dokumentom.',
+      disabled: 'Onemogo膷eno',
+      name: 'Ime',
+    },
+    documentMetadata: {
+      startLabeling: 'Za膷ni ozna膷evanje',
+      technicalParameters: 'Tehni膷ni parametri',
+      metadataToolTip: 'Metapodatki slu啪ijo kot pomemben filter, ki izbolj拧uje natan膷nost in pomembnost iskanja informacij. Tukaj lahko spremenite in dodate metapodatke za ta dokument.',
+      documentInformation: 'Informacije o dokumentu',
+    },
+    metadata: 'Meta podatki',
+    chooseTime: 'Izberi 膷as...',
+    addMetadata: 'Dodaj metapodatke',
+  },
+  embeddingModelNotAvailable: 'Model za zajemanje ni na voljo.',
+}
+
+export default translation
diff --git a/i18n/sl-SI/education.ts b/i18n/sl-SI/education.ts
new file mode 100644
index 0000000..6a78a04
--- /dev/null
+++ b/i18n/sl-SI/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    end: 'za profesionalni na膷rt Dify.',
+    front: 'Zdaj ste upravi膷eni do statusa Preverjeno izobra啪evanje. Prosimo, vnesite svoje izobra啪evalne podatke spodaj, da zaklju膷ite postopek in prejmete',
+    coupon: 'izklju膷no 100% kupon',
+  },
+  form: {
+    schoolName: {
+      placeholder: 'Vpi拧ite uradno, neokrnjeno ime va拧e 拧ole',
+      title: 'Ime va拧e 拧ole',
+    },
+    schoolRole: {
+      option: {
+        administrator: '艩olski administrator',
+        teacher: 'U膷itelj',
+        student: '艩tudent',
+      },
+      title: 'Va拧a 拧olska vloga',
+    },
+    terms: {
+      desc: {
+        and: 'in',
+        termsOfService: 'Pogoji storitve',
+        end: '. Z oddajo:',
+        privacyPolicy: 'Politika zasebnosti',
+        front: 'Va拧e informacije in uporaba statusa preverjene izobrazbe so predmet na拧ih',
+      },
+      option: {
+        inSchool: 'Potrjujem, da sem vpisan ali zaposlen na navedenem zavodu. Dify lahko zahteva dokazilo o vpisu/zaposlitvi. 膶e napa膷no predstavim svojo upravi膷enost, se strinjam, da pla膷am morebitne pristojbine, ki so bile sprva opro拧膷ene na podlagi mojega izobra啪evalnega statusa.',
+        age: 'Potrjujem, da sem star najmanj 18 let',
+      },
+      title: 'Pogoji in dogovori',
+    },
+  },
+  toVerified: 'Preverite izobrazbo',
+  successContent: 'Za va拧e ra膷une smo izdali kupon za 100% popust na profesionalni na膷rt Dify. Kupon je veljaven eno leto, prosimo, uporabite ga v veljavnem obdobju.',
+  successTitle: 'Imate verifikacijo izobra啪evanja Dify',
+  submitError: 'Po拧iljanje obrazca ni uspelo. Prosimo, poskusite znova kasneje.',
+  submit: 'Predlo啪i',
+  rejectTitle: 'Va拧a Dify izobra啪evalna verifikacija je bila zavrnjena.',
+  learn: 'Nau膷ite se, kako preveriti izobrazbo',
+  emailLabel: 'Va拧 trenutni elektronski naslov',
+  currentSigned: 'Trenutno prijavljen kot',
+  rejectContent: 'Na 啪alost niste upravi膷eni do statusa Verificirane izobrazbe in zato ne morete prejeti ekskluzivnega 100-odstotnega kupona za Dify profesionalni na膷rt, 膷e uporabljate ta e-po拧tni naslov.',
+}
+
+export default translation
diff --git a/i18n/sl-SI/explore.ts b/i18n/sl-SI/explore.ts
new file mode 100644
index 0000000..add9056
--- /dev/null
+++ b/i18n/sl-SI/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: 'Razi拧膷i',
+  sidebar: {
+    discovery: 'Odkritja',
+    chat: 'Klepet',
+    workspace: 'Delovni prostor',
+    action: {
+      pin: 'Pripni',
+      unpin: 'Odpni',
+      rename: 'Preimenuj',
+      delete: 'Izbri拧i',
+    },
+    delete: {
+      title: 'Izbri拧i aplikacijo',
+      content: 'Ali ste prepri膷ani, da 啪elite izbrisati to aplikacijo?',
+    },
+  },
+  apps: {
+    title: 'Razi拧膷i aplikacije Dify',
+    description: 'Uporabite te predloge aplikacij takoj ali prilagodite svoje aplikacije na podlagi predlog.',
+    allCategories: 'Priporo膷eno',
+  },
+  appCard: {
+    addToWorkspace: 'Dodaj v delovni prostor',
+    customize: 'Prilagodi',
+  },
+  appCustomize: {
+    title: 'Ustvari aplikacijo iz {{name}}',
+    subTitle: 'Ikona aplikacije & ime',
+    nameRequired: 'Ime aplikacije je obvezno',
+  },
+  category: {
+    Assistant: 'Pomo膷nik',
+    Writing: 'Pisanje',
+    Translate: 'Prevajanje',
+    Programming: 'Programiranje',
+    HR: 'Kadri',
+    Workflow: 'Potek dela',
+    Agent: 'Agent',
+    Entertainment: 'Zabava',
+  },
+}
+
+export default translation
diff --git a/i18n/sl-SI/layout.ts b/i18n/sl-SI/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/sl-SI/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/sl-SI/login.ts b/i18n/sl-SI/login.ts
new file mode 100644
index 0000000..7035002
--- /dev/null
+++ b/i18n/sl-SI/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: 'Hej, za膷nimo!馃憢',
+  welcome: 'Dobrodo拧li v Dify, prosimo, prijavite se za nadaljevanje.',
+  email: 'E-po拧tni naslov',
+  emailPlaceholder: 'Va拧 e-po拧tni naslov',
+  password: 'Geslo',
+  passwordPlaceholder: 'Va拧e geslo',
+  name: 'Uporabni拧ko ime',
+  namePlaceholder: 'Va拧e uporabni拧ko ime',
+  forget: 'Ste pozabili geslo?',
+  signBtn: 'Prijava',
+  sso: 'Nadaljujte z SSO',
+  installBtn: 'Namesti',
+  setAdminAccount: 'Nastavitev administratorskega ra膷una',
+  setAdminAccountDesc: 'Najvi拧je pravice za administratorski ra膷un, ki se lahko uporablja za ustvarjanje aplikacij in upravljanje LLM ponudnikov itd.',
+  createAndSignIn: 'Ustvari in prijavi se',
+  oneMoreStep: '艩e en korak',
+  createSample: 'Na podlagi teh informacij bomo za vas ustvarili vzor膷no aplikacijo',
+  invitationCode: 'Vabilna koda',
+  invitationCodePlaceholder: 'Va拧a vabilna koda',
+  interfaceLanguage: 'Jezik vmesnika',
+  timezone: '膶asovni pas',
+  go: 'Pojdi na Dify',
+  sendUsMail: 'Po拧ljite nam uvod po e-po拧ti, mi pa bomo obravnavali va拧o zahtevo za vabilo.',
+  acceptPP: 'Prebral sem in sprejemam politiko zasebnosti',
+  reset: 'Za ponastavitev gesla za啪enite naslednji ukaz',
+  withGitHub: 'Nadaljujte z GitHub',
+  withGoogle: 'Nadaljujte z Google',
+  rightTitle: 'Odklenite polni potencial LLM',
+  rightDesc: 'Brez napora gradite vizualno privla膷ne, operabilne in izbolj拧ljive AI aplikacije.',
+  tos: 'Pogoji storitve',
+  pp: 'Politika zasebnosti',
+  tosDesc: 'Z registracijo se strinjate z na拧imi',
+  goToInit: '膶e ra膷una 拧e niste inicializirali, pojdite na stran za inicializacijo',
+  dontHave: 'Nimate?',
+  invalidInvitationCode: 'Neveljavna vabilna koda',
+  accountAlreadyInited: 'Ra膷un je 啪e inicializiran',
+  forgotPassword: 'Ste pozabili geslo?',
+  resetLinkSent: 'Povezava za ponastavitev poslana',
+  sendResetLink: 'Po拧lji povezavo za ponastavitev',
+  backToSignIn: 'Nazaj na prijavo',
+  forgotPasswordDesc: 'Prosimo, vnesite svoj e-po拧tni naslov za ponastavitev gesla. Poslali vam bomo e-po拧to z navodili za ponastavitev gesla.',
+  checkEmailForResetLink: 'Preverite svojo e-po拧to za povezavo za ponastavitev gesla. 膶e je ne prejmete v nekaj minutah, preverite tudi mapo z ne啪eleno po拧to.',
+  passwordChanged: 'Prijavite se zdaj',
+  changePassword: 'Spremeni geslo',
+  changePasswordTip: 'Prosimo, vnesite novo geslo za svoj ra膷un',
+  invalidToken: 'Neveljaven ali potekel 啪eton',
+  confirmPassword: 'Potrdite geslo',
+  confirmPasswordPlaceholder: 'Potrdite svoje novo geslo',
+  passwordChangedTip: 'Va拧e geslo je bilo uspe拧no spremenjeno',
+  error: {
+    emailEmpty: 'E-po拧tni naslov je obvezen',
+    emailInValid: 'Prosimo, vnesite veljaven e-po拧tni naslov',
+    nameEmpty: 'Ime je obvezno',
+    passwordEmpty: 'Geslo je obvezno',
+    passwordLengthInValid: 'Geslo mora vsebovati vsaj 8 znakov',
+    passwordInvalid: 'Geslo mora vsebovati 膷rke in 拧tevilke, dol啪ina pa mora biti ve膷 kot 8 znakov',
+    registrationNotAllowed: 'Ra膷una ni mogo膷e najti. Za registracijo se obrnite na skrbnika sistema.',
+  },
+  license: {
+    tip: 'Preden za膷nete z Dify Community Edition, preberite GitHub',
+    link: 'Licenco odprte kode',
+  },
+  join: 'Pridru啪i se',
+  joinTipStart: 'Vabimo vas, da se pridru啪ite',
+  joinTipEnd: 'ekipi na Dify',
+  invalid: 'Povezava je potekla',
+  explore: 'Razi拧膷i Dify',
+  activatedTipStart: 'Pridru啪ili ste se ekipi',
+  activatedTipEnd: 'ekipi',
+  activated: 'Prijavite se zdaj',
+  adminInitPassword: 'Geslo za inicializacijo administratorja',
+  validate: 'Potrdi',
+  checkCode: {
+    emptyCode: 'Koda je obvezna',
+    verificationCodePlaceholder: 'Vnesite 6-mestno kodo',
+    resend: 'Poslati',
+    verificationCode: 'Koda za preverjanje',
+    tips: 'Kodo za preverjanje po拧ljemo na <strong>{{email}}</strong>',
+    verify: 'Preveriti',
+    validTime: 'Upo拧tevajte, da je koda veljavna 5 minut',
+    checkYourEmail: 'Preverjanje e-po拧te',
+    didNotReceiveCode: 'Niste prejeli kode?',
+    invalidCode: 'Neveljavna koda',
+    useAnotherMethod: 'Uporabite drug na膷in',
+  },
+  useVerificationCode: 'Uporaba kode za preverjanje',
+  licenseInactive: 'Licenca je neaktivna',
+  changePasswordBtn: 'Nastavitev gesla',
+  licenseExpired: 'Licenca je potekla',
+  resetPassword: 'Ponastavi geslo',
+  back: 'Hrbet',
+  backToLogin: 'Nazaj na prijavo',
+  enterYourName: 'Prosimo, vnesite svoje uporabni拧ko ime',
+  licenseLost: 'Izgubljena licenca',
+  licenseExpiredTip: 'Licenca za Dify Enterprise za va拧 delovni prostor je potekla. 膶e 啪elite 拧e naprej uporabljati Dify, se obrnite na skrbnika.',
+  usePassword: 'Uporaba gesla',
+  sendVerificationCode: 'Po拧lji kodo za preverjanje',
+  resetPasswordDesc: 'Vnesite e-po拧tni naslov, ki ste ga uporabili za prijavo na Dify, in poslali vam bomo e-po拧tno sporo膷ilo za ponastavitev gesla.',
+  setYourAccount: 'Nastavitev ra膷una',
+  noLoginMethodTip: 'Obrnite se na skrbnika sistema, da dodate na膷in preverjanja pristnosti.',
+  or: 'ALI',
+  noLoginMethod: 'Na膷in preverjanja pristnosti ni konfiguriran',
+  continueWithCode: 'Nadaljujte s kodo',
+  withSSO: 'Nadaljujte z enotno prijavo',
+  licenseLostTip: 'Povezava z licen膷nim stre啪nikom Dify ni uspela. 膶e 啪elite 拧e naprej uporabljati Dify, se obrnite na skrbnika.',
+  licenseInactiveTip: 'Licenca Dify Enterprise za va拧 delovni prostor je neaktivna. 膶e 啪elite 拧e naprej uporabljati Dify, se obrnite na skrbnika.',
+}
+
+export default translation
diff --git a/i18n/sl-SI/plugin-tags.ts b/i18n/sl-SI/plugin-tags.ts
new file mode 100644
index 0000000..62e6aa1
--- /dev/null
+++ b/i18n/sl-SI/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    design: 'Oblikovanje',
+    videos: 'Videi',
+    education: 'Izobra啪evanje',
+    search: 'Iskanje',
+    image: 'Slika',
+    medical: 'Medicinski',
+    weather: 'Vreme',
+    social: 'Dru啪beni',
+    entertainment: 'Zabava',
+    productivity: 'Produktivnost',
+    finance: 'Finance',
+    news: 'Novice',
+    business: 'Poslovanje',
+    utilities: 'Komunalne storitve',
+    agent: 'Agent',
+    other: 'Drugo',
+    travel: 'Potovanje',
+  },
+  searchTags: 'Iskalne oznake',
+  allTags: 'Vse nalepke',
+}
+
+export default translation
diff --git a/i18n/sl-SI/plugin.ts b/i18n/sl-SI/plugin.ts
new file mode 100644
index 0000000..848ef39
--- /dev/null
+++ b/i18n/sl-SI/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  metadata: {
+    title: 'Vti膷niki',
+  },
+  category: {
+    bundles: 'Paketi',
+    all: 'Vse',
+    extensions: 'Raz拧iritve',
+    models: 'Modeli',
+    agents: 'Strategije agenta',
+    tools: 'Orodja',
+  },
+  categorySingle: {
+    extension: 'Raz拧iritev',
+    bundle: 'Paket',
+    agent: 'Agentska strategija',
+    tool: 'Orodje',
+    model: 'Model',
+  },
+  list: {
+    source: {
+      local: 'Namestite iz lokalne paketne datoteke',
+      marketplace: 'Namestite iz tr啪nice',
+      github: 'Namestite iz GitHub-a',
+    },
+    notFound: 'Nobeni vti膷niki niso bili najdeni.',
+    noInstalled: 'Nobeni vti膷niki niso name拧膷eni.',
+  },
+  source: {
+    marketplace: 'Tr啪nica',
+    github: 'GitHub',
+    local: 'Lokalna paketna datoteka',
+  },
+  detailPanel: {
+    categoryTip: {
+      local: 'Lokalni vti膷nik',
+      marketplace: 'Name拧膷eno iz tr啪nice',
+      debugging: 'Orodje za odpravljanje napak',
+      github: 'Name拧膷en iz Githuba',
+    },
+    operation: {
+      remove: 'Odstrani',
+      install: 'Namestite',
+      viewDetail: 'Oglej si podrobnosti',
+      detail: 'Podrobnosti',
+      update: 'Posodobitev',
+      checkUpdate: 'Preveri posodobitev',
+      info: 'Informacije o vti膷niku',
+    },
+    toolSelector: {
+      unsupportedContent: 'V razli膷ici vti膷nika, ki je name拧膷ena, ta akcija ni zagotovljena.',
+      unsupportedContent2: 'Kliknite za preklop razli膷ice.',
+      params: 'RAZLOGOVANJE KONFIGURACIJA',
+      auto: 'Samodejno',
+      title: 'Dodaj orodje',
+      settings: 'UPORABNI艩KE NASTAVITVE',
+      descriptionLabel: 'Opis orodja',
+      uninstalledLink: 'Upravljanje v vti膷nikih',
+      unsupportedTitle: 'Nepodprta akcija',
+      placeholder: 'Izberite orodje...',
+      uninstalledTitle: 'Orodje ni name拧膷eno',
+      uninstalledContent: 'Ta vti膷nik je name拧膷en iz lokalnega/GitHub repozitorija. Uporabite ga prosim po namestitvi.',
+      toolLabel: 'Orodje',
+      descriptionPlaceholder: 'Kratek opis namena orodja, npr. pridobitev temperature za dolo膷eno lokacijo.',
+      empty: 'Kliknite gumb \' \' za dodajanje orodij. Dodate lahko ve膷 orodij.',
+      paramsTip1: 'Nadzoruje parametre sklepanja LLM.',
+      paramsTip2: 'Ko je \'Avtomatsko\' izklopljeno, se uporablja privzeta vrednost.',
+    },
+    endpointDisableContent: 'Ali 啪elite onemogo膷iti {{name}}?',
+    serviceOk: 'Storitve so v redu',
+    endpointDeleteTip: 'Odstrani kon膷no to膷ko',
+    actionNum: '{{num}} {{action}} VKLJU膶ENO',
+    endpointDeleteContent: 'Ali 啪elite odstraniti {{name}}?',
+    configureApp: 'Konfiguriraj aplikacijo',
+    endpointsDocLink: 'Oglejte si dokument',
+    endpointModalTitle: 'Nastavi kon膷no to膷ko',
+    disabled: 'Onemogo膷eno',
+    configureTool: 'Konfigurirajte orodje',
+    switchVersion: 'Preklopna razli膷ica',
+    strategyNum: '{{num}} {{strategy}} VKLJU膶ENO',
+    endpoints: 'Kon膷ne to膷ke',
+    configureModel: 'Konfiguriraj model',
+    modelNum: '{{num}} VZORCI VKLJU膶ENI',
+    endpointDisableTip: 'Onemogo膷i kon膷no to膷ko',
+    endpointsTip: 'Ta vti膷nik zagotavlja specifi膷ne funkcionalnosti preko kon膷nih to膷k, prav tako pa lahko konfigurirate ve膷 nizov kon膷nih to膷k za trenutno delovno okolje.',
+    endpointModalDesc: 'Ko je konfiguriran, se lahko uporabljajo funkcije, ki jih vti膷nik zagotavlja prek API kon膷nih to膷k.',
+    endpointsEmpty: 'Kliknite gumb \' \' za dodajanje kon膷ne to膷ke',
+  },
+  debugInfo: {
+    viewDocs: 'Oglejte si dokumente',
+    title: 'Odpravljanje napak',
+  },
+  privilege: {
+    whoCanInstall: 'Kdo lahko namesti in upravlja vti膷nike?',
+    title: 'Nastavitve vti膷nika',
+    admins: 'Administratori',
+    whoCanDebug: 'Kdo lahko odpravi napake v vti膷nikih?',
+    everyone: 'Vsi',
+    noone: 'Nih膷e',
+  },
+  pluginInfoModal: {
+    title: 'Informacije o vti膷niku',
+    packageName: 'Paket',
+    release: 'Izdati',
+    repository: 'Shramba',
+  },
+  action: {
+    usedInApps: 'Ta vti膷nik se uporablja v {{num}} aplikacijah.',
+    checkForUpdates: 'Preverite posodobitve',
+    deleteContentLeft: 'Ali 啪elite odstraniti',
+    deleteContentRight: 'vti膷nik?',
+    delete: 'Odstrani vti膷nik',
+    pluginInfo: 'Informacije o vti膷niku',
+  },
+  installModal: {
+    labels: {
+      repository: 'Shramba',
+      version: 'Razli膷ica',
+      package: 'Paket',
+    },
+    installFailed: 'Namestitev ni uspela',
+    installing: 'Name拧膷anje...',
+    installedSuccessfully: 'Namestitev uspe拧na',
+    uploadFailed: 'Nalaganje ni uspelo',
+    pluginLoadErrorDesc: 'Ta vti膷nik ne bo name拧膷en',
+    readyToInstallPackages: 'Prihajamo do namestitve naslednjih {{num}} dodatkov',
+    cancel: 'Prekli膷i',
+    fromTrustSource: 'Prosimo, poskrbite, da namestite le vti膷nike iz <trustSource>zaupanja vrednega vira</trustSource>.',
+    installedSuccessfullyDesc: 'Vti膷nik je bil uspe拧no name拧膷en.',
+    readyToInstallPackage: 'Namestitev naslednjega vti膷nika',
+    installComplete: 'Namestitev kon膷ana',
+    installFailedDesc: 'Namestitev vti膷nika je bila neuspe拧na.',
+    close: 'Zapri',
+    uploadingPackage: 'Nalagam {{packageName}}...',
+    readyToInstall: 'Namestitev naslednjega vti膷nika',
+    dropPluginToInstall: 'Tukaj spustite paket vti膷nika, da ga namestite',
+    next: 'Naprej',
+    back: 'Nazaj',
+    install: 'Namestite',
+    pluginLoadError: 'Napaka pri nalaganju vti膷nika',
+    installPlugin: 'Namestite vti膷nik',
+  },
+  installFromGitHub: {
+    updatePlugin: 'Posodobite vti膷nik iz GitHuba',
+    gitHubRepo: 'GitHub repozitorij',
+    installFailed: 'Namestitev ni uspela',
+    installPlugin: 'Namestite vti膷nik iz GitHuba',
+    selectVersionPlaceholder: 'Prosim, izberite razli膷ico',
+    selectPackagePlaceholder: 'Prosim, izberite paket',
+    selectPackage: 'Izberite paket',
+    uploadFailed: 'Nalaganje ni uspelo',
+    selectVersion: 'Izberite razli膷ico',
+    installedSuccessfully: 'Namestitev uspe拧na',
+    installNote: 'Prosim, prepri膷ajte se, da namestite vti膷nike samo iz zaupanja vrednega vira.',
+  },
+  upgrade: {
+    close: 'Zapri',
+    description: 'Namestitev naslednjega vti膷nika',
+    upgrading: 'Name拧膷anje...',
+    successfulTitle: 'Namestitev uspe拧na',
+    upgrade: 'Namestite',
+    usedInApps: 'Uporablja se v {{num}} aplikacijah',
+    title: 'Namestite vti膷nik',
+  },
+  error: {
+    noReleasesFound: 'Ni najdenih izdaj. Prosimo preverite GitHub repozitorij ali vhodni URL.',
+    fetchReleasesError: 'Ne morem pridobiti izdaj. Prosim, poskusite znova pozneje.',
+    inValidGitHubUrl: 'Neveljavna GitHub povezava. Vnesite veljavno povezavo v formatu: https://github.com/lastnik/repo',
+  },
+  marketplace: {
+    sortOption: {
+      mostPopular: 'Najbolj priljubljeno',
+      firstReleased: 'Prvi膷 izdan',
+      recentlyUpdated: 'Nedavno posodobljeno',
+      newlyReleased: 'Nedavno izdano',
+    },
+    and: 'in',
+    pluginsResult: '{{num}} rezultati',
+    sortBy: 'Razvrsti po',
+    verifiedTip: 'Verificirano s strani Dify',
+    discover: 'Odkrijte',
+    partnerTip: 'Potrjeno s strani partnerja Dify',
+    empower: 'Okrepite svoj razvoj AI',
+    noPluginFound: 'Nobenega vti膷nika ni bilo najti.',
+    viewMore: 'Oglejte si ve膷',
+    moreFrom: 'Ve膷 iz tr啪nice',
+    difyMarketplace: 'Dify Marketplace',
+  },
+  task: {
+    installing: 'Namestitev {{installingLength}} vti膷nikov, 0 kon膷anih.',
+    clearAll: 'Po膷isti vse',
+    installError: '{{errorLength}} vti膷nikov ni uspelo namestiti, kliknite za ogled',
+    installingWithSuccess: 'Namestitev {{installingLength}} dodatkov, {{successLength}} uspe拧nih.',
+    installedError: '{{errorLength}} vti膷nikov ni uspelo namestiti',
+    installingWithError: 'Namestitev {{installingLength}} vti膷nikov, {{successLength}} uspe拧nih, {{errorLength}} neuspe拧nih',
+  },
+  endpointsEnabled: '{{num}} nizov kon膷nih to膷k omogo膷enih',
+  search: 'Iskanje',
+  searchInMarketplace: 'Iskanje na trgu',
+  searchPlugins: 'I拧膷i vti膷nike',
+  fromMarketplace: 'Iz tr啪nice',
+  searchTools: 'Iskalna orodja...',
+  installPlugin: 'Namestite vti膷nik',
+  from: 'Iz',
+  installFrom: 'NAMESTITE IZ',
+  searchCategories: 'I拧膷i kategorije',
+  installAction: 'Namestite',
+  findMoreInMarketplace: 'Poi拧膷ite ve膷 v Tr啪nici',
+  install: '{{num}} namestitev',
+  allCategories: 'Vse kategorije',
+  submitPlugin: 'Oddajte vti膷nik',
+  difyVersionNotCompatible: 'Trenutna razli膷ica Dify ni zdru啪ljiva s to vti膷nico, prosimo, posodobite na minimalno zahtevano razli膷ico: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/sl-SI/register.ts b/i18n/sl-SI/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/sl-SI/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/sl-SI/run-log.ts b/i18n/sl-SI/run-log.ts
new file mode 100644
index 0000000..c0ae92f
--- /dev/null
+++ b/i18n/sl-SI/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: 'VNOS',
+  result: 'REZULTAT',
+  detail: 'PODROBNOSTI',
+  tracing: 'SLEDENJE',
+  resultPanel: {
+    status: 'STATUS',
+    time: 'PRETE膶ENI 膶AS',
+    tokens: 'SKUPNI 沤ETONI',
+  },
+  meta: {
+    title: 'METAPODATKI',
+    status: 'Status',
+    version: 'Razli膷ica',
+    executor: 'Izvajalec',
+    startTime: '膶as za膷etka',
+    time: 'Prete膷eni 膷as',
+    tokens: 'Skupni 啪etoni',
+    steps: 'Koraki izvajanja',
+  },
+  resultEmpty: {
+    title: 'Ta zagon je izpisal samo format JSON,',
+    tipLeft: 'prosimo, pojdite na ',
+    link: 'panel podrobnosti',
+    tipRight: ' za ogled.',
+  },
+  actionLogs: 'Dnevniki dejanj',
+  circularInvocationTip: 'V trenutnem poteku dela obstaja kro啪no sklicevanje orodij / vozli拧膷.',
+}
+
+export default translation
diff --git a/i18n/sl-SI/share-app.ts b/i18n/sl-SI/share-app.ts
new file mode 100644
index 0000000..28d62b2
--- /dev/null
+++ b/i18n/sl-SI/share-app.ts
@@ -0,0 +1,79 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: 'Aplikacija ni na voljo',
+    appUnknownError: 'Aplikacija ni na voljo',
+  },
+  chat: {
+    newChat: 'Nov klepet',
+    pinnedTitle: 'Pripeto',
+    unpinnedTitle: 'Klepeti',
+    newChatDefaultName: 'Nova konverzacija',
+    resetChat: 'Ponastavi konverzacijo',
+    poweredBy: 'Poganja',
+    prompt: 'Poziv',
+    privatePromptConfigTitle: 'Nastavitve konverzacije',
+    publicPromptConfigTitle: 'Za膷etni poziv',
+    configStatusDes: 'Pred za膷etkom lahko spremenite nastavitve konverzacije',
+    configDisabled:
+      'Nastavitve prej拧nje seje so uporabljene za to sejo.',
+    startChat: 'Za膷ni klepet',
+    privacyPolicyLeft: 'Prosimo, preberite ',
+    privacyPolicyMiddle: 'politiko zasebnosti',
+    privacyPolicyRight: ' ponudnika aplikacije.',
+    deleteConversation: {
+      title: 'Izbri拧i konverzacijo',
+      content: 'Ali ste prepri膷ani, da 啪elite izbrisati to konverzacijo?',
+    },
+    tryToSolve: 'Poskusite re拧iti',
+    temporarySystemIssue: 'Oprostite, za膷asna te啪ava s sistemom.',
+    expand: 'Raz拧iri',
+    collapse: 'Skr膷i',
+    newChatTip: '沤e v novem klepetu',
+    viewChatSettings: 'Ogled nastavitve klepeta',
+    chatSettingsTitle: 'Nova nastavitev klepeta',
+    chatFormTip: 'Nastavitve klepeta ni mogo膷e spremeniti po za膷etku klepeta.',
+  },
+  generation: {
+    tabs: {
+      create: 'Za啪eni enkrat',
+      batch: 'Za啪eni serijo',
+      saved: 'Shranjeno',
+    },
+    savedNoData: {
+      title: '艩e niste shranili rezultata!',
+      description: 'Za膷nite z ustvarjanjem vsebine in tukaj najdite svoje shranjene rezultate.',
+      startCreateContent: 'Za膷nite z ustvarjanjem vsebine',
+    },
+    title: 'AI Zaklju膷ek',
+    queryTitle: 'Vsebina poizvedbe',
+    completionResult: 'Rezultat zaklju膷ka',
+    queryPlaceholder: 'Vnesite vsebino poizvedbe...',
+    run: 'Izvedi',
+    copy: 'Kopiraj',
+    resultTitle: 'AI Zaklju膷ek',
+    noData: 'AI vam bo tukaj zagotovil, kar 啪elite.',
+    csvUploadTitle: 'Povlecite in spustite svojo CSV datoteko tukaj, ali ',
+    browse: 'brskajte',
+    csvStructureTitle: 'CSV datoteka mora ustrezati naslednji strukturi:',
+    downloadTemplate: 'Prenesite predlogo tukaj',
+    field: 'Polje',
+    batchFailed: {
+      info: '{{num}} neuspelih izvedb',
+      retry: 'Poskusite znova',
+      outputPlaceholder: 'Brez izhodne vsebine',
+    },
+    errorMsg: {
+      empty: 'Prosimo, vnesite vsebino v nalo啪eno datoteko.',
+      fileStructNotMatch: 'Nalo啪ena CSV datoteka ne ustreza strukturi.',
+      emptyLine: 'Vrstica {{rowIndex}} je prazna',
+      invalidLine: 'Vrstica {{rowIndex}}: vrednost {{varName}} ne sme biti prazna',
+      moreThanMaxLengthLine: 'Vrstica {{rowIndex}}: vrednost {{varName}} ne sme biti dalj拧a od {{maxLength}} znakov',
+      atLeastOne: 'Prosimo, vnesite vsaj eno vrstico v nalo啪eno datoteko.',
+    },
+    execution: 'IZVEDBA',
+    executions: '{{num}} IZVR艩ITEV',
+  },
+}
+
+export default translation
diff --git a/i18n/sl-SI/time.ts b/i18n/sl-SI/time.ts
new file mode 100644
index 0000000..b88a33b
--- /dev/null
+++ b/i18n/sl-SI/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Thu: '膶etrtek',
+    Fri: 'Petek',
+    Tue: 'Torek',
+    Sun: 'Sonce',
+    Wed: 'Sreda',
+    Mon: 'Mon',
+    Sat: 'Satelit',
+  },
+  months: {
+    February: 'Februar',
+    April: 'April',
+    October: 'oktober',
+    May: 'Maj',
+    December: 'December',
+    September: 'September',
+    January: 'Januar',
+    July: 'Julij',
+    March: 'Marec',
+    June: 'Junij',
+    November: 'November',
+    August: 'Avgust',
+  },
+  operation: {
+    cancel: 'Prekli膷i',
+    now: 'Zdaj',
+    pickDate: 'Izberi datum',
+    ok: 'V redu',
+  },
+  title: {
+    pickTime: 'Izberi 膷as',
+  },
+  defaultPlaceholder: 'Izberi 膷as...',
+}
+
+export default translation
diff --git a/i18n/sl-SI/tools.ts b/i18n/sl-SI/tools.ts
new file mode 100644
index 0000000..59989e9
--- /dev/null
+++ b/i18n/sl-SI/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: 'Orodja',
+  createCustomTool: 'Ustvari prilagojeno orodje',
+  customToolTip: 'Izvedite ve膷 o prilagojenih orodjih Dify',
+  type: {
+    all: 'Vsa',
+    builtIn: 'Vgrajena',
+    custom: 'Prilagojena',
+    workflow: 'Potek dela',
+  },
+  contribute: {
+    line1: 'Zanima me ',
+    line2: 'prispevanje orodij k Dify.',
+    viewGuide: 'Oglejte si vodi膷',
+  },
+  author: 'Avtor',
+  auth: {
+    unauthorized: 'Za avtorizacijo',
+    authorized: 'Avtorizirano',
+    setup: 'Nastavite avtorizacijo za uporabo',
+    setupModalTitle: 'Nastavi avtorizacijo',
+    setupModalTitleDescription: 'Po konfiguraciji poverilnic bodo vsi 膷lani znotraj delovnega prostora lahko uporabljali to orodje pri orkestraciji aplikacij.',
+  },
+  includeToolNum: 'Vklju膷eno {{num}} orodij',
+  addTool: 'Dodaj orodje',
+  addToolModal: {
+    type: 'tip',
+    category: 'kategorija',
+    add: 'dodaj',
+    added: 'dodano',
+    manageInTools: 'Upravljaj v Orodjih',
+    emptyTitle: 'Orodje za potek dela ni na voljo',
+    emptyTip: 'Pojdite na "Potek dela -> Objavi kot orodje"',
+    emptyTipCustom: 'Ustvarjanje orodja po meri',
+    emptyTitleCustom: 'Orodje po meri ni na voljo',
+  },
+  createTool: {
+    title: 'Ustvari prilagojeno orodje',
+    editAction: 'Konfiguriraj',
+    editTitle: 'Uredi prilagojeno orodje',
+    name: 'Ime',
+    toolNamePlaceHolder: 'Vnesite ime orodja',
+    nameForToolCall: 'Ime za klic orodja',
+    nameForToolCallPlaceHolder: 'Uporablja se za strojno prepoznavo, na primer getCurrentWeather, list_pets',
+    nameForToolCallTip: 'Podprte so samo 拧tevilke, 膷rke in pod膷rtaji.',
+    description: 'Opis',
+    descriptionPlaceholder: 'Kratek opis namena orodja, npr. pridobi temperaturo za dolo膷eno lokacijo.',
+    schema: 'Shema',
+    schemaPlaceHolder: 'Vnesite svojo OpenAPI shemo tukaj',
+    viewSchemaSpec: 'Oglejte si OpenAPI-Swagger specifikacijo',
+    importFromUrl: 'Uvozi iz URL-ja',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: 'Prosimo, vnesite veljaven URL',
+    examples: 'Primeri',
+    exampleOptions: {
+      json: 'Vreme(JSON)',
+      yaml: 'Trgovina za doma膷e ljubljen膷ke(YAML)',
+      blankTemplate: 'Prazna predloga',
+    },
+    availableTools: {
+      title: 'Razpolo啪ljiva orodja',
+      name: 'Ime',
+      description: 'Opis',
+      method: 'Metoda',
+      path: 'Pot',
+      action: 'Dejanja',
+      test: 'Testiraj',
+    },
+    authMethod: {
+      title: 'Metoda avtorizacije',
+      type: 'Vrsta avtorizacije',
+      keyTooltip: 'Klju膷 HTTP glave, pustite kot "Authorization", 膷e ne veste, kaj je to, ali pa nastavite na vrednost po meri',
+      types: {
+        none: 'Brez',
+        api_key: 'API klju膷',
+        apiKeyPlaceholder: 'Ime HTTP glave za API klju膷',
+        apiValuePlaceholder: 'Vnesite API klju膷',
+      },
+      key: 'Klju膷',
+      value: 'Vrednost',
+    },
+    authHeaderPrefix: {
+      title: 'Vrsta avtorizacije',
+      types: {
+        basic: 'Osnovna',
+        bearer: 'Imetnik',
+        custom: 'Prilagojena',
+      },
+    },
+    privacyPolicy: 'Politika zasebnosti',
+    privacyPolicyPlaceholder: 'Prosimo, vnesite politiko zasebnosti',
+    toolInput: {
+      title: 'Vnos orodja',
+      name: 'Ime',
+      required: 'Obvezno',
+      method: 'Metoda',
+      methodSetting: 'Nastavitve',
+      methodSettingTip: 'Uporabnik izpolni konfiguracijo orodja',
+      methodParameter: 'Parameter',
+      methodParameterTip: 'LLM izpolni med sklepanjem',
+      label: 'Oznake',
+      labelPlaceholder: 'Izberite oznake (neobvezno)',
+      description: 'Opis',
+      descriptionPlaceholder: 'Opis pomena parametra',
+    },
+    customDisclaimer: 'Prilagojeno zavrnitev odgovornosti',
+    customDisclaimerPlaceholder: 'Prosimo, vnesite prilagojeno zavrnitev odgovornosti',
+    confirmTitle: 'Potrditi shranjevanje?',
+    confirmTip: 'Aplikacije, ki uporabljajo to orodje, bodo vplivane',
+    deleteToolConfirmTitle: 'Izbrisati to orodje?',
+    deleteToolConfirmContent: 'Brisanje orodja je nepovratno. Uporabniki ne bodo ve膷 imeli dostopa do va拧ega orodja.',
+  },
+  test: {
+    title: 'Test',
+    parametersValue: 'Parametri in vrednosti',
+    parameters: 'Parametri',
+    value: 'Vrednost',
+    testResult: 'Rezultati testa',
+    testResultPlaceholder: 'Rezultati testa bodo prikazani tukaj',
+  },
+  thought: {
+    using: 'Uporablja se',
+    used: 'Uporabljeno',
+    requestTitle: 'Zahteva za',
+    responseTitle: 'Odgovor iz',
+  },
+  setBuiltInTools: {
+    info: 'Informacije',
+    setting: 'Nastavitve',
+    toolDescription: 'Opis orodja',
+    parameters: 'parametri',
+    string: 'niz',
+    number: '拧tevilka',
+    required: 'Obvezno',
+    infoAndSetting: 'Informacije in nastavitve',
+    file: 'datoteka',
+  },
+  noCustomTool: {
+    title: 'Ni prilagojenih orodij!',
+    content: 'Tukaj lahko dodate in upravljate svoja prilagojena orodja za gradnjo AI aplikacij.',
+    createTool: 'Ustvari orodje',
+  },
+  noSearchRes: {
+    title: 'Oprostite, ni rezultatov!',
+    content: 'Nismo na拧li nobenih orodij, ki ustrezajo va拧emu iskanju.',
+    reset: 'Ponastavi iskanje',
+  },
+  builtInPromptTitle: 'Poziv',
+  toolRemoved: 'Orodje odstranjeno',
+  notAuthorized: 'Orodje ni avtorizirano',
+  howToGet: 'Kako pridobiti',
+  openInStudio: 'Odpri v Studiju',
+  toolNameUsageTip: 'Ime klica orodja za sklepanja in pozivanje agenta',
+  copyToolName: 'Kopiraj ime',
+  noTools: 'Orodja niso bila najdena',
+}
+
+export default translation
diff --git a/i18n/sl-SI/workflow.ts b/i18n/sl-SI/workflow.ts
new file mode 100644
index 0000000..1376bc8
--- /dev/null
+++ b/i18n/sl-SI/workflow.ts
@@ -0,0 +1,1354 @@
+const translation = {
+  common: {
+    undo: 'Razveljavi',
+    redo: 'Uveljavi',
+    editing: 'Urejanje',
+    autoSaved: 'Samodejno shranjeno',
+    unpublished: 'Nepublicirano',
+    published: 'Objavljeno',
+    publish: 'Objavi',
+    update: 'Posodobi',
+    run: 'Za啪eni',
+    running: 'V teku',
+    inRunMode: 'V na膷inu zagona',
+    inPreview: 'V predogledu',
+    inPreviewMode: 'V na膷inu predogleda',
+    preview: 'Predogled',
+    viewRunHistory: 'Ogled zgodovine zagona',
+    runHistory: 'Zgodovina zagona',
+    goBackToEdit: 'Nazaj na urejevalnik',
+    conversationLog: 'Zapisnik pogovora',
+    features: 'Zna膷ilnosti',
+    debugAndPreview: 'Predogled',
+    restart: 'Ponovni zagon',
+    currentDraft: 'Trenutni osnutek',
+    currentDraftUnpublished: 'Trenutni osnutek ni objavljen',
+    latestPublished: 'Zadnje objavljeno',
+    publishedAt: 'Objavljeno ob',
+    restore: 'Obnovi',
+    runApp: 'Za啪eni aplikacijo',
+    batchRunApp: 'Serijski zagon aplikacije',
+    accessAPIReference: 'Dostop do API referenc',
+    embedIntoSite: 'Vdelaj v spletno stran',
+    addTitle: 'Dodaj naslov...',
+    addDescription: 'Dodaj opis...',
+    noVar: 'Ni spremenljivke',
+    searchVar: 'I拧膷i spremenljivko',
+    variableNamePlaceholder: 'Ime spremenljivke',
+    setVarValuePlaceholder: 'Nastavi vrednost spremenljivke',
+    needConnectTip: 'Ta korak ni povezan z ni膷emer',
+    maxTreeDepth: 'Najve膷ja omejitev je {{depth}} vozli拧膷 na vejo',
+    needEndNode: 'Dodati je treba zaklju膷ni blok',
+    needAnswerNode: 'Dodati je treba blok z odgovorom',
+    workflowProcess: 'Proces delovnega toka',
+    notRunning: '艩e ni v teku',
+    previewPlaceholder: 'Vnesite vsebino v spodnje polje za za膷etek odpravljanja napak klepetalnika',
+    effectVarConfirm: {
+      title: 'Odstrani spremenljivko',
+      content: 'Spremenljivka se uporablja v drugih vozli拧膷ih. Ali jo kljub temu 啪elite odstraniti?',
+    },
+    insertVarTip: 'Pritisnite tipko \'/\' za hitro vstavljanje',
+    processData: 'Obdelava podatkov',
+    input: 'Vnos',
+    output: 'Izhod',
+    jinjaEditorPlaceholder: 'Vnesite \'/\' ali \'{\' za vstavljanje spremenljivke',
+    viewOnly: 'Samo ogled',
+    showRunHistory: 'Prika啪i zgodovino zagona',
+    enableJinja: 'Omogo膷i podporo za Jinja predloge',
+    learnMore: 'Ve膷 informacij',
+    copy: 'Kopiraj',
+    duplicate: 'Podvoji',
+    addBlock: 'Dodaj blok',
+    pasteHere: 'Prilepi tukaj',
+    pointerMode: 'Na膷in kazalca',
+    handMode: 'Na膷in roke',
+    model: 'Model',
+    workflowAsTool: 'Potek dela kot orodje',
+    configureRequired: 'Potrebna konfiguracija',
+    configure: 'Konfiguriraj',
+    manageInTools: 'Upravljaj v Orodjih',
+    workflowAsToolTip: 'Po posodobitvi poteka dela je potrebno ponovno konfigurirati orodje.',
+    viewDetailInTracingPanel: 'Oglejte si podrobnosti',
+    syncingData: 'Sinhronizacija podatkov, le nekaj sekund.',
+    importDSL: 'Uvozi DSL',
+    importDSLTip: 'Trenutni osnutek bo prepisan. Pred uvozom izvozite delovni tok kot varnostno kopijo.',
+    backupCurrentDraft: 'Varnostno kopiraj trenutni osnutek',
+    chooseDSL: 'Izberite DSL(yml) datoteko',
+    overwriteAndImport: 'Prepi拧i in uvozi',
+    importFailure: 'Uvoz ni uspel',
+    importSuccess: 'Uvoz uspe拧en',
+    parallelRun: 'Vzporedni zagon',
+    parallelTip: {
+      click: {
+        title: 'Klikni',
+        desc: ' za dodajanje',
+      },
+      drag: {
+        title: 'Povleci',
+        desc: ' za povezavo',
+      },
+      limit: 'Vzporednost je omejena na {{num}} vej.',
+      depthLimit: 'Omejitev gnezdenja vzporednih slojev na {{num}} slojev',
+    },
+    disconnect: 'Prekini povezavo',
+    jumpToNode: 'Sko膷i na to vozli拧膷e',
+    addParallelNode: 'Dodaj vzporedno vozli拧膷e',
+    parallel: 'VZPOREDNO',
+    branch: 'VEJA',
+    fileUploadTip: 'Funkcije nalaganja slik so nadgrajene na nalaganje datotek.',
+    featuresDocLink: 'Izvedi ve膷',
+    featuresDescription: 'Izbolj拧ajte uporabni拧ko izku拧njo spletne aplikacije',
+    ImageUploadLegacyTip: 'Zdaj lahko ustvarite spremenljivke vrste datoteke v za膷etnem obrazcu. V prihodnje ne bomo ve膷 podpirali funkcije nalaganja slik.',
+    importWarning: 'Previdnost',
+    importWarningDetails: 'Razlika v razli膷ici DSL lahko vpliva na nekatere funkcije',
+    openInExplore: 'Odpri v razi拧膷i',
+    addFailureBranch: 'Dodajanje veje 禄Fail芦',
+    onFailure: 'O neuspehu',
+    noHistory: 'Brez zgodovine',
+    loadMore: 'Nalaganje ve膷 potekov dela',
+    exportJPEG: 'Izvozi kot JPEG',
+    exportPNG: 'Izvozi kot PNG',
+    noExist: 'Nobena tak拧na spremenljivka ne obstaja.',
+    exitVersions: 'Izhodne razli膷ice',
+    versionHistory: 'Zgodovina razli膷ic',
+    publishUpdate: 'Objavi posodobitev',
+    exportSVG: 'Izvozi kot SVG',
+    referenceVar: 'Referen膷na spremenljivka',
+    exportImage: 'Izvozi sliko',
+  },
+  env: {
+    envPanelTitle: 'Spremenljivke okolja',
+    envDescription: 'Spremenljivke okolja se uporabljajo za shranjevanje zasebnih informacij in poverilnic. So samo za branje in jih je mogo膷e lo膷iti od DSL datoteke med izvozom.',
+    envPanelButton: 'Dodaj spremenljivko',
+    modal: {
+      title: 'Dodaj spremenljivko okolja',
+      editTitle: 'Uredi spremenljivko okolja',
+      type: 'Vrsta',
+      name: 'Ime',
+      namePlaceholder: 'ime okolja',
+      value: 'Vrednost',
+      valuePlaceholder: 'vrednost okolja',
+      secretTip: 'Uporablja se za definiranje ob膷utljivih informacij ali podatkov, s konfiguriranimi nastavitvami DSL za prepre膷evanje uhajanja.',
+    },
+    export: {
+      title: 'Izvoziti skrivne spremenljivke okolja?',
+      checkbox: 'Izvozi skrivne vrednosti',
+      ignore: 'Izvozi DSL',
+      export: 'Izvozi DSL z skrivnimi vrednostmi',
+    },
+    chatVariable: {
+      panelTitle: 'Spremenljivke pogovora',
+      panelDescription: 'Spremenljivke pogovora se uporabljajo za shranjevanje interaktivnih informacij, ki jih mora LLM zapomniti, vklju膷no z zgodovino pogovorov, nalo啪enimi datotekami, uporabni拧kimi nastavitvami. So za branje in pisanje.',
+      docLink: 'Obi拧膷ite na拧e dokumente za ve膷 informacij.',
+      button: 'Dodaj spremenljivko',
+      modal: {
+        title: 'Dodaj spremenljivko pogovora',
+        editTitle: 'Uredi spremenljivko pogovora',
+        name: 'Ime',
+        namePlaceholder: 'Ime spremenljivke',
+        type: 'Vrsta',
+        value: 'Privzeta vrednost',
+        valuePlaceholder: 'Privzeta vrednost, pustite prazno, 膷e je ne 啪elite nastaviti',
+        description: 'Opis',
+        descriptionPlaceholder: 'Opi拧ite spremenljivko',
+        editInJSON: 'Uredi v JSON',
+        oneByOne: 'Dodaj eno po eno',
+        editInForm: 'Uredi v obrazcu',
+        arrayValue: 'Vrednost',
+        addArrayValue: 'Dodaj vrednost',
+        objectKey: 'Klju膷',
+        objectType: 'Vrsta',
+        objectValue: 'Privzeta vrednost',
+      },
+      storedContent: 'Shranjena vsebina',
+      updatedAt: 'Posodobljeno ob',
+    },
+    changeHistory: {
+      title: 'Zgodovina sprememb',
+      placeholder: '艩e niste ni膷esar spremenili',
+      clearHistory: 'Po膷isti zgodovino',
+      hint: 'Namig',
+      hintText: 'Va拧a dejanja urejanja se spremljajo v zgodovini sprememb, ki se hrani na va拧i napravi med trajanjem te seje. Ta zgodovina se bo izbrisala, ko zapustite urejevalnik.',
+      stepBackward_one: '{{count}} korak nazaj',
+      stepBackward_other: '{{count}} korakov nazaj',
+      stepForward_one: '{{count}} korak naprej',
+      stepForward_other: '{{count}} korakov naprej',
+      sessionStart: 'Za膷etek seje',
+      currentState: 'Trenutno stanje',
+      nodeTitleChange: 'Naslov bloka spremenjen',
+      nodeDescriptionChange: 'Opis bloka spremenjen',
+      nodeDragStop: 'Blok premaknjen',
+      nodeChange: 'Blok spremenjen',
+      nodeConnect: 'Blok povezan',
+      nodePaste: 'Blok prilepljen',
+      nodeDelete: 'Blok izbrisan',
+      nodeAdd: 'Blok dodan',
+      nodeResize: 'Velikost bloka spremenjena',
+      noteAdd: 'Opomba dodana',
+      noteChange: 'Opomba spremenjena',
+      noteDelete: 'Opomba izbrisana',
+      edgeDelete: 'Blok prekinjen',
+    },
+    errorMsg: {
+      fieldRequired: '{{field}} je obvezen',
+      rerankModelRequired: 'Pred vklopom modela za ponovno razvr拧膷anje, prosimo potrdite, da je bil model uspe拧no konfiguriran v nastavitvah.',
+      authRequired: 'Potrebna je avtorizacija',
+      invalidJson: '{{field}} je neveljaven JSON',
+      fields: {
+        variable: 'Ime spremenljivke',
+        variableValue: 'Vrednost spremenljivke',
+        code: 'Koda',
+        model: 'Model',
+        rerankModel: 'Model za ponovno razvr拧膷anje',
+      },
+      invalidVariable: 'Neveljavna spremenljivka',
+    },
+    singleRun: {
+      testRun: 'Testni zagon',
+      startRun: 'Za膷ni zagon',
+      running: 'V teku',
+      testRunIteration: 'Iteracija testnega zagona',
+      back: 'Nazaj',
+      iteration: 'Iteracija',
+    },
+    tabs: {
+      'searchBlock': 'Iskanje bloka',
+      'blocks': 'Bloki',
+      'searchTool': 'Iskanje orodja',
+      'tools': 'Orodja',
+      'allTool': 'Vsa',
+      'builtInTool': 'Vgrajena',
+      'customTool': 'Prilagojena',
+      'workflowTool': 'Potek dela',
+      'question-understand': 'Razumevanje vpra拧anja',
+      'logic': 'Logika',
+      'transform': 'Pretvorba',
+      'utilities': 'Pripomo膷ki',
+      'noResult': 'Ni najdenih zadetkov',
+    },
+    blocks: {
+      'start': 'Za膷etek',
+      'end': 'Konec',
+      'answer': 'Odgovor',
+      'llm': 'LLM',
+      'knowledge-retrieval': 'Pridobivanje znanja',
+      'question-classifier': 'Klasifikator vpra拧anj',
+      'if-else': 'IF/ELSE',
+      'code': 'Koda',
+      'template-transform': 'Predloga',
+      'http-request': 'HTTP zahteva',
+      'variable-assigner': 'Dodeljevalec spremenljivk',
+      'variable-aggregator': 'Zbiralnik spremenljivk',
+      'assigner': 'Dodeljevalec spremenljivk',
+      'iteration-start': 'Za膷etek iteracije',
+      'iteration': 'Iteracija',
+      'parameter-extractor': 'Izvle膷ek parametrov',
+    },
+    blocksAbout: {
+      'start': 'Dolo膷ite za膷etne parametre za zagon delovnega toka',
+      'end': 'Dolo膷ite konec in vrsto rezultata delovnega toka',
+      'answer': 'Dolo膷ite vsebino odgovora v klepetalni konverzaciji',
+      'llm': 'Klicanje velikih jezikovnih modelov za odgovarjanje na vpra拧anja ali obdelavo naravnega jezika',
+      'knowledge-retrieval': 'Omogo膷a iskanje vsebine, povezane z uporabnikovimi vpra拧anji, iz baze znanja',
+      'question-classifier': 'Dolo膷ite pogoje za klasifikacijo uporabni拧kih vpra拧anj; LLM lahko dolo膷i, kako se bo konverzacija razvijala glede na klasifikacijski opis',
+      'if-else': 'Omogo膷a razdelitev delovnega toka na dve veji glede na pogoje if/else',
+      'code': 'Izvedite del kode Python ali NodeJS za implementacijo prilagojene logike',
+      'template-transform': 'Pretvorite podatke v niz z uporabo Jinja predloge',
+      'http-request': 'Omogo膷a po拧iljanje stre啪ni拧kih zahtev preko HTTP protokola',
+      'variable-assigner': 'Zdru啪i spremenljivke ve膷 vej v eno spremenljivko za enotno konfiguracijo vozli拧膷 ni啪je v poteku.',
+      'assigner': 'Vozli拧膷e za dodelitev spremenljivk se uporablja za dodelitev vrednosti pisnim spremenljivkam (kot so spremenljivke konverzacije).',
+      'variable-aggregator': 'Zdru啪i spremenljivke ve膷 vej v eno spremenljivko za enotno konfiguracijo vozli拧膷 ni啪je v poteku.',
+      'iteration': 'Izvedite ve膷 korakov na seznamu objektov, dokler niso vsi rezultati izpisani.',
+      'parameter-extractor': 'Uporabite LLM za izvle膷ek strukturiranih parametrov iz naravnega jezika za klice orodij ali HTTP zahteve.',
+    },
+    operator: {
+      zoomIn: 'Pove膷aj',
+      zoomOut: 'Pomanj拧aj',
+      zoomTo50: 'Pove膷aj na 50%',
+      zoomTo100: 'Pove膷aj na 100%',
+      zoomToFit: 'Prilagodi velikost',
+    },
+    panel: {
+      userInputField: 'Vnosno polje uporabnika',
+      changeBlock: 'Spremeni blok',
+      helpLink: 'Povezava za pomo膷',
+      about: 'O',
+      createdBy: 'Ustvaril ',
+      nextStep: 'Naslednji korak',
+      addNextStep: 'Dodaj naslednji blok v tem delovnem toku',
+      selectNextStep: 'Izberi naslednji blok',
+      runThisStep: 'Za啪eni ta korak',
+      checklist: 'Kontrolni seznam',
+      checklistTip: 'Poskrbite, da so vsi problemi re拧eni pred objavo',
+      checklistResolved: 'Vsi problemi so re拧eni',
+      organizeBlocks: 'Organiziraj bloke',
+      change: 'Spremeni',
+      optional: '(neobvezno)',
+    },
+    nodes: {
+      common: {
+        outputVars: 'Izhodne spremenljivke',
+        insertVarTip: 'Vstavi spremenljivko',
+        memory: {
+          memory: 'Pomnjenje',
+          memoryTip: 'Nastavitve pomnjenja klepeta',
+          windowSize: 'Velikost okna',
+          conversationRoleName: 'Ime vloge v konverzaciji',
+          user: 'Predpona uporabnika',
+          assistant: 'Predpona pomo膷nika',
+        },
+        memories: {
+          title: 'Pomnjenje',
+          tip: 'Pomnjenje klepeta',
+          builtIn: 'Vgrajeno',
+        },
+      },
+      start: {
+        required: 'obvezno',
+        inputField: 'Vnosno polje',
+        builtInVar: 'Vgrajene spremenljivke',
+        outputVars: {
+          query: 'Uporabni拧ki vnos',
+          memories: {
+            des: 'Zgodovina konverzacije',
+            type: 'vrsta sporo膷ila',
+            content: 'vsebina sporo膷ila',
+          },
+          files: 'Seznam datotek',
+        },
+        noVarTip: 'Nastavite vnose, ki jih lahko uporabite v delovnem toku',
+      },
+      end: {
+        outputs: 'Izhodi',
+        output: {
+          type: 'vrsta izhoda',
+          variable: 'izhoda spremenljivka',
+        },
+        type: {
+          'none': 'Brez',
+          'plain-text': 'Navadno besedilo',
+          'structured': 'Strukturirano',
+        },
+      },
+      answer: {
+        answer: 'Odgovor',
+        outputVars: 'Izhodne spremenljivke',
+      },
+      llm: {
+        model: 'model',
+        variables: 'spremenljivke',
+        context: 'kontekst',
+        contextTooltip: 'Kot kontekst lahko uvozite Znanje',
+        notSetContextInPromptTip: 'Za omogo膷anje funkcije konteksta, prosimo, izpolnite kontekstno spremenljivko v POZIVU.',
+        prompt: 'poziv',
+        roleDescription: {
+          system: 'Podajte splo拧na navodila za konverzacijo',
+          user: 'Podajte navodila, poizvedbe ali katero koli besedilno vsebino za model',
+          assistant: 'Odzivi modela na uporabni拧ka sporo膷ila',
+        },
+        addMessage: 'Dodaj sporo膷ilo',
+        vision: 'vizija',
+        files: 'Datoteke',
+        resolution: {
+          name: 'Lo膷ljivost',
+          high: 'Visoka',
+          low: 'Nizka',
+        },
+        outputVars: {
+          output: 'Generirana vsebina',
+          usage: 'Podatki o uporabi modela',
+        },
+        singleRun: {
+          variable: 'Spremenljivka',
+        },
+        sysQueryInUser: 'sys.query v uporabni拧kem sporo膷ilu je obvezno',
+      },
+      knowledgeRetrieval: {
+        queryVariable: 'Poizvedbena spremenljivka',
+        knowledge: 'Znanje',
+        outputVars: {
+          output: 'Pridobljeni segmentirani podatki',
+          content: 'Segmentirana vsebina',
+          title: 'Segmentirani naslov',
+          icon: 'Segmentirana ikona',
+          url: 'Segmentiran URL',
+          metadata: 'Drugi metapodatki',
+        },
+      },
+      http: {
+        inputVars: 'Vnosne spremenljivke',
+        api: 'API',
+        apiPlaceholder: 'Vnesite URL, vstavite spremenljivko z tipko 鈥�/鈥�',
+        notStartWithHttp: 'API mora za膷eti z http:// ali https://',
+        key: 'Klju膷',
+        value: 'Vrednost',
+        bulkEdit: 'Serijsko urejanje',
+        keyValueEdit: 'Urejanje klju膷-vrednost',
+        headers: 'Glave',
+        params: 'Parametri',
+        body: 'Telo',
+        outputVars: {
+          body: 'Vsebina odgovora',
+          statusCode: 'Statusna koda odgovora',
+          headers: 'Seznam glave odgovora v JSON',
+          files: 'Seznam datotek',
+        },
+      },
+      authorization: {
+        'authorization': 'Avtorizacija',
+        'authorizationType': 'Vrsta avtorizacije',
+        'no-auth': 'Brez',
+        'api-key': 'API-klju膷',
+        'auth-type': 'Vrsta avtorizacije',
+        'basic': 'Osnovna',
+        'bearer': 'Imetnik',
+        'custom': 'Prilagojena',
+        'api-key-title': 'API klju膷',
+        'header': 'Glava',
+      },
+      insertVarPlaceholder: 'vnesite \'/\' za vstavljanje spremenljivke',
+      timeout: {
+        title: '膶asovna omejitev',
+        connectLabel: '膶asovna omejitev povezave',
+        connectPlaceholder: 'Vnesite 膷asovno omejitev povezave v sekundah',
+        readLabel: '膶asovna omejitev branja',
+        readPlaceholder: 'Vnesite 膷asovno omejitev branja v sekundah',
+        writeLabel: '膶asovna omejitev pisanja',
+        writePlaceholder: 'Vnesite 膷asovno omejitev pisanja v sekundah',
+      },
+    },
+    code: {
+      inputVars: 'Vhodne spremenljivke',
+      outputVars: 'Izhodne spremenljivke',
+      advancedDependencies: 'Napredne odvisnosti',
+      advancedDependenciesTip: 'Dodajte nekaj prednalo啪enih odvisnosti, ki potrebujejo ve膷 膷asa za nalaganje ali niso privzeto vgrajene',
+      searchDependencies: 'I拧膷i odvisnosti',
+    },
+    templateTransform: {
+      inputVars: 'Vhodne spremenljivke',
+      code: 'Koda',
+      codeSupportTip: 'Podpira samo Jinja2',
+      outputVars: {
+        output: 'Pretvorjena vsebina',
+      },
+    },
+    ifElse: {
+      if: '膶e',
+      else: 'Sicer',
+      elseDescription: 'Uporablja se za definiranje logike, ki naj se izvede, ko pogoj "膷e" ni izpolnjen.',
+      and: 'in',
+      or: 'ali',
+      operator: 'Operater',
+      notSetVariable: 'Najprej nastavite spremenljivko',
+      comparisonOperator: {
+        'contains': 'vsebuje',
+        'not contains': 'ne vsebuje',
+        'start with': 'se za膷ne z',
+        'end with': 'se kon膷a z',
+        'is': 'je',
+        'is not': 'ni',
+        'empty': 'je prazna',
+        'not empty': 'ni prazna',
+        'null': 'je null',
+        'not null': 'ni null',
+      },
+      enterValue: 'Vnesite vrednost',
+      addCondition: 'Dodaj pogoj',
+      conditionNotSetup: 'Pogoj NI nastavljen',
+      selectVariable: 'Izberite spremenljivko...',
+    },
+    variableAssigner: {
+      title: 'Dodeli spremenljivke',
+      outputType: 'Vrsta izhoda',
+      varNotSet: 'Spremenljivka ni nastavljena',
+      noVarTip: 'Dodajte spremenljivke, ki jih 啪elite dodeliti',
+      type: {
+        string: 'Niz',
+        number: '艩tevilo',
+        object: 'Objekt',
+        array: 'Polje',
+      },
+      aggregationGroup: 'Skupina za zdru啪evanje',
+      aggregationGroupTip: 'Omogo膷anje te funkcije omogo膷a agregatorju spremenljivk zdru啪evanje ve膷 naborov spremenljivk.',
+      addGroup: 'Dodaj skupino',
+      outputVars: {
+        varDescribe: 'Izhod {{groupName}}',
+      },
+      setAssignVariable: 'Nastavi dodeljeno spremenljivko',
+    },
+    assigner: {
+      'assignedVariable': 'Dodeljena spremenljivka',
+      'writeMode': 'Na膷in pisanja',
+      'writeModeTip': 'Na膷in dodajanja: Na voljo samo za spremenljivke vrste polje.',
+      'over-write': 'Prepi拧i',
+      'append': 'Dodaj',
+      'plus': 'Plus',
+      'clear': 'Po膷isti',
+      'setVariable': 'Nastavi spremenljivko',
+      'variable': 'Spremenljivka',
+    },
+    tool: {
+      toAuthorize: 'Za avtorizacijo',
+      inputVars: 'Vhodne spremenljivke',
+      outputVars: {
+        text: 'orodje je ustvarilo vsebino',
+        files: {
+          title: 'orodje je ustvarilo datoteke',
+          type: 'Podprta vrsta. Trenutno podpira samo slike',
+          transfer_method: 'Na膷in prenosa. Vrednosti so remote_url ali local_file',
+          url: 'URL slike',
+          upload_file_id: 'ID nalo啪ene datoteke',
+        },
+        json: 'orodje je ustvarilo json',
+      },
+    },
+    questionClassifiers: {
+      model: 'model',
+      inputVars: 'Vhodne spremenljivke',
+      outputVars: {
+        className: 'Ime razreda',
+      },
+      class: 'Razred',
+      classNamePlaceholder: 'Vnesite ime razreda',
+      advancedSetting: 'Napredna nastavitev',
+      topicName: 'Ime teme',
+      topicPlaceholder: 'Vnesite ime teme',
+      addClass: 'Dodaj razred',
+      instruction: 'Navodilo',
+      instructionTip: 'Vnesite dodatna navodila, da bo klasifikator vpra拧anj la啪je razumel, kako kategorizirati vpra拧anja.',
+      instructionPlaceholder: 'Vnesite va拧e navodilo',
+    },
+    parameterExtractor: {
+      inputVar: 'Vhodna spremenljivka',
+      extractParameters: 'Izvle膷i parametre',
+      importFromTool: 'Uvozi iz orodij',
+      addExtractParameter: 'Dodaj izvle膷en parameter',
+      addExtractParameterContent: {
+        name: 'Ime',
+        namePlaceholder: 'Ime izvle膷enega parametra',
+        type: 'Vrsta',
+        typePlaceholder: 'Vrsta izvle膷enega parametra',
+        description: 'Opis',
+        descriptionPlaceholder: 'Opis izvle膷enega parametra',
+        required: 'Obvezno',
+        requiredContent: 'Obvezno je uporabljeno samo kot referenca za sklepanja modela in ne za obvezno preverjanje izhoda parametra.',
+      },
+      extractParametersNotSet: 'Parametri za izvle膷ek niso nastavljeni',
+      instruction: 'Navodilo',
+      instructionTip: 'Vnesite dodatna navodila, da parameter extractor la啪je razume, kako izvle膷i parametre.',
+      advancedSetting: 'Napredna nastavitev',
+      reasoningMode: 'Na膷in sklepanja',
+      reasoningModeTip: 'Lahko izberete ustrezen na膷in sklepanja glede na sposobnost modela za odgovore na navodila za klice funkcij ali pozive.',
+      isSuccess: 'Je uspeh. Pri uspehu je vrednost 1, pri neuspehu pa 0.',
+      errorReason: 'Razlog za napako',
+    },
+    iteration: {
+      deleteTitle: 'Izbrisati vozli拧膷e iteracije?',
+      deleteDesc: 'Brisanje vozli拧膷a iteracije bo izbrisalo vsa podrejena vozli拧膷a',
+      input: 'Vhod',
+      output: 'Izhodne spremenljivke',
+      iteration_one: '{{count}} iteracija',
+      iteration_other: '{{count}} iteracij',
+      currentIteration: 'Trenutna iteracija',
+    },
+    note: {
+      addNote: 'Dodaj opombo',
+      editor: {
+        placeholder: 'Zapi拧ite opombo...',
+        small: 'Majhno',
+        medium: 'Srednje',
+        large: 'Veliko',
+        bold: 'Krepko',
+        italic: 'Po拧evno',
+        strikethrough: 'Pre膷rtano',
+        link: 'Povezava',
+        openLink: 'Odpri',
+        unlink: 'Odstrani povezavo',
+        enterUrl: 'Vnesite URL...',
+        invalidUrl: 'Neveljaven URL',
+        bulletList: 'Ozna膷en seznam',
+        showAuthor: 'Poka啪i avtorja',
+      },
+    },
+  },
+  tracing: {
+    stopBy: 'Ustavljeno s strani {{user}}',
+  },
+  chatVariable: {
+    modal: {
+      type: 'Vrsta',
+      objectValue: 'Privzeta vrednost',
+      description: 'Opis',
+      editTitle: 'Urejanje spremenljivke pogovora',
+      namePlaceholder: 'Ime spremenljivke',
+      valuePlaceholder: 'Privzeta vrednost, pustite prazno, da ni nastavljeno',
+      title: 'Dodajanje spremenljivke pogovora',
+      editInJSON: 'Urejanje v JSON',
+      value: 'Privzeta vrednost',
+      oneByOne: 'Dodajanje enega za drugim',
+      objectKey: 'Klju膷',
+      objectType: 'Vrsta',
+      arrayValue: 'Vrednost',
+      name: 'Ime',
+      descriptionPlaceholder: 'Opis spremenljivke',
+      editInForm: 'Uredi v obrazcu',
+      addArrayValue: 'Dodajanje vrednosti',
+    },
+    storedContent: 'Shranjena vsebina',
+    updatedAt: 'Posodobljeno na',
+    panelTitle: 'Spremenljivke pogovora',
+    button: 'Dodajanje spremenljivke',
+    panelDescription: 'Spremenljivke pogovora se uporabljajo za shranjevanje interaktivnih informacij, ki si jih mora LLM zapomniti, vklju膷no z zgodovino pogovorov, nalo啪enimi datotekami, uporabni拧kimi nastavitvami. So branje in pisanje.',
+    docLink: '膶e 啪elite izvedeti ve膷, obi拧膷ite na拧e dokumente.',
+  },
+  changeHistory: {
+    nodeChange: 'Blokiranje spremenjeno',
+    placeholder: 'Ni膷esar 拧e niste spremenili',
+    nodeDescriptionChange: 'Opis bloka je bil spremenjen',
+    nodePaste: 'Blokiranje lepljenja',
+    noteDelete: 'Opomba izbrisana',
+    nodeDragStop: 'Blok premaknjen',
+    nodeConnect: 'Blok povezan',
+    sessionStart: 'Za膷etek seje',
+    nodeDelete: 'Blokiraj izbrisane',
+    stepBackward_other: '{{count}} stopi nazaj',
+    hint: 'Namig',
+    noteAdd: 'Opomba dodana',
+    clearHistory: 'Po膷isti zgodovino',
+    stepForward_one: '{{count}} korak naprej',
+    stepBackward_one: '{{count}} korak nazaj',
+    nodeAdd: 'Blokiranje dodano',
+    noteChange: 'Opomba spremenjena',
+    hintText: 'Dejanjem urejanja se sledi v zgodovini sprememb, ki je shranjena v napravi za 膷as trajanja te seje. Ta zgodovina bo izbrisana, ko zapustite urejevalnik.',
+    stepForward_other: '{{count}} koraki naprej',
+    edgeDelete: 'Blok je prekinjen.',
+    nodeTitleChange: 'Naslov bloka spremenjen',
+    nodeResize: 'Spremeni velikost bloka',
+    title: 'Zgodovina sprememb',
+    currentState: 'Trenutno stanje',
+  },
+  errorMsg: {
+    fields: {
+      code: 'Koda',
+      variableValue: 'Vrednost spremenljivke',
+      visionVariable: 'Spremenljivka vida',
+      model: 'Model',
+      rerankModel: 'Ponovno razvrsti model',
+      variable: 'Ime spremenljivke',
+    },
+    invalidJson: '{{field}} je neveljaven JSON',
+    invalidVariable: 'Neveljavna spremenljivka',
+    authRequired: 'Dovoljenje je potrebno',
+    fieldRequired: '{{field}} je obvezno',
+    rerankModelRequired: 'Preden vklopite Rerank Model, preverite, ali je bil model uspe拧no konfiguriran v nastavitvah.',
+    toolParameterRequired: '{{field}}: parameter [{{param}}] je obvezen',
+    noValidTool: '{{field}} Izbrano ni veljavno orodje',
+  },
+  singleRun: {
+    startRun: 'Za膷ni zagnati',
+    running: 'Tek',
+    testRunIteration: 'Ponovitev preskusnega zagona',
+    iteration: 'Ponovitev',
+    back: 'Hrbet',
+    testRun: 'Preskusni zagon',
+    loop: 'Zanka',
+  },
+  tabs: {
+    'blocks': 'Bloki',
+    'workflowTool': 'Potek dela',
+    'transform': 'Preoblikovanje',
+    'question-understand': 'Vpra拧anje razumeti',
+    'builtInTool': 'Vgrajeno',
+    'allTool': 'Ves',
+    'tools': 'Orodja',
+    'logic': 'Logika',
+    'searchBlock': 'Iskalni blok',
+    'noResult': 'Ni najdenega ujemanja',
+    'customTool': 'Obi膷aj',
+    'utilities': 'Utilities',
+    'searchTool': 'Orodje za iskanje',
+    'agent': 'Strategija agenta',
+    'plugin': 'Vti膷nik',
+  },
+  blocks: {
+    'variable-aggregator': 'Spremenljivi agregator',
+    'code': 'Koda',
+    'parameter-extractor': 'Ekstraktor parametrov',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'Pridobivanje znanja',
+    'answer': 'Odgovoriti',
+    'end': 'Konec',
+    'document-extractor': 'Ekstraktor dokumentov',
+    'assigner': 'Dodeljevalnik spremenljivke',
+    'iteration-start': 'Za膷etek ponovitve',
+    'template-transform': 'Predloga',
+    'iteration': 'Ponovitev',
+    'start': 'Za膷etek',
+    'if-else': 'IF/ELSE',
+    'list-operator': 'Operater seznama',
+    'http-request': 'Zahteva HTTP',
+    'variable-assigner': 'Spremenljivi agregator',
+    'question-classifier': 'Klasifikator vpra拧anj',
+    'agent': 'Agent',
+    'loop-end': 'Izhod iz zanke',
+    'loop': 'Zanka',
+    'loop-start': 'Za膷etek zanke',
+  },
+  blocksAbout: {
+    'document-extractor': 'Uporablja se za raz膷lenjevanje nalo啪enih dokumentov v besedilno vsebino, ki je zlahka razumljiva LLM.',
+    'list-operator': 'Uporablja se za filtriranje ali razvr拧膷anje vsebine matrike.',
+    'template-transform': 'Pretvorite podatke v niz s sintakso predloge Jinja',
+    'question-classifier': 'Dolo膷ite pogoje razvr拧膷anja uporabni拧kih vpra拧anj, LLM lahko dolo膷i, kako poteka pogovor na podlagi opisa klasifikacije',
+    'start': 'Dolo膷anje za膷etnih parametrov za zagon poteka dela',
+    'if-else': 'Omogo膷a razdelitev poteka dela na dve veji glede na pogoje if/else',
+    'knowledge-retrieval': 'Omogo膷a poizvedovanje po besedilni vsebini, ki je povezana z uporabni拧kimi vpra拧anji iz zbirke znanja',
+    'variable-assigner': 'Zdru啪ite spremenljivke z ve膷 vejami v eno spremenljivko za poenoteno konfiguracijo nadaljnjih vozli拧膷.',
+    'code': 'Izvedite kodo Python ali NodeJS za izvajanje logike po meri',
+    'answer': 'Dolo膷anje vsebine odgovora v pogovoru v klepetu',
+    'iteration': 'Izvedite ve膷 korakov na predmetu seznama, dokler niso prikazani vsi rezultati.',
+    'http-request': 'Dovoli po拧iljanje zahtev stre啪nika prek protokola HTTP',
+    'end': 'Dolo膷anje kon膷ne in kon膷ne vrste poteka dela',
+    'variable-aggregator': 'Zdru啪ite spremenljivke z ve膷 vejami v eno spremenljivko za poenoteno konfiguracijo nadaljnjih vozli拧膷.',
+    'parameter-extractor': 'Uporabite LLM za pridobivanje strukturiranih parametrov iz naravnega jezika za klicanje orodij ali zahteve HTTP.',
+    'assigner': 'Vozli拧膷e za dodeljevanje spremenljivk se uporablja za dodeljevanje vrednosti zapisljivim spremenljivkam (kot so spremenljivke pogovora).',
+    'llm': 'Sklicevanje na velike jezikovne modele za odgovarjanje na vpra拧anja ali obdelavo naravnega jezika',
+    'agent': 'Sklicevanje na velike jezikovne modele za odgovarjanje na vpra拧anja ali obdelavo naravnega jezika',
+    'loop': 'Izvedite zanko logike, dokler ni izpolnjen pogoj za prekinitev ali dokler ni dose啪ena najve膷ja 拧tevilo ponovitev.',
+    'loop-end': 'Enakovredno 鈥瀙rekini鈥�. Ta vozli拧膷e nima konfiguracijskih elementov. Ko telo zanke dose啪e to vozli拧膷e, zanka preneha.',
+  },
+  operator: {
+    zoomOut: 'Pomanj拧anje',
+    zoomTo100: 'Pove膷ava na 100 %',
+    zoomToFit: 'Pove膷aj, da se prilega',
+    zoomIn: 'Pove膷ava',
+    zoomTo50: 'Pove膷ava na 50%',
+  },
+  panel: {
+    helpLink: 'Povezava za pomo膷',
+    organizeBlocks: 'Organiziranje blokov',
+    optional: '(neobvezno)',
+    nextStep: 'Naslednji korak',
+    checklist: 'Kontrolni seznam',
+    runThisStep: 'Za啪enite ta korak',
+    about: 'Pribli啪no',
+    selectNextStep: 'Izberite Naslednji blok',
+    changeBlock: 'Spremeni blok',
+    createdBy: 'Ustvaril',
+    checklistTip: 'Pred objavo se prepri膷ajte, da so vse te啪ave odpravljene',
+    userInputField: 'Uporabni拧ko polje za vnos',
+    checklistResolved: 'Vse te啪ave so odpravljene',
+    addNextStep: 'Dodajanje naslednjega bloka v ta potek dela',
+    change: 'Spremeniti',
+  },
+  nodes: {
+    common: {
+      memory: {
+        conversationRoleName: 'Ime vloge pogovora',
+        memoryTip: 'Nastavitve pomnilnika klepeta',
+        assistant: 'Predpona pomo膷nika',
+        user: 'Uporabni拧ka predpona',
+        memory: 'Spomin',
+        windowSize: 'Velikost okna',
+      },
+      memories: {
+        tip: 'Pomnilnik klepeta',
+        title: 'Spomine',
+        builtIn: 'Vgrajeno',
+      },
+      outputVars: 'Izhodne spremenljivke',
+      insertVarTip: 'Vstavi spremenljivko',
+      errorHandle: {
+        none: {
+          desc: 'Vozli拧膷e se bo prenehalo izvajati, 膷e pride do izjeme in ne bo obravnavano',
+          title: 'Nobena',
+        },
+        defaultValue: {
+          output: 'Izhodna privzeta vrednost',
+          tip: 'Po napaki se vrne pod vrednost.',
+          title: 'Privzeta vrednost',
+          inLog: 'Izjema vozli拧膷a, izhod v skladu s privzetimi vrednostmi.',
+          desc: 'Ko pride do napake, dolo膷ite stati膷no izhodno vsebino.',
+        },
+        failBranch: {
+          title: 'Neuspe拧na veja',
+          inLog: 'Izjema vozli拧膷a, bo samodejno izvedla neuspe拧no vejo. Izhod vozli拧膷a bo vrnil vrsto napake in sporo膷ilo o napaki ter ju posredoval navzdol.',
+          desc: 'Ko pride do napake, bo izvedla vejo izjeme',
+          customizeTip: 'Ko je aktivirana veja neuspeha, izjeme, ki jih vr啪ejo vozli拧膷a, ne bodo prekinile procesa. Namesto tega bo samodejno izvedel vnaprej dolo膷eno vejo neuspeha, kar vam bo omogo膷ilo prilagodljivo zagotavljanje sporo膷il o napakah, poro膷il, popravkov ali preskakovanja dejanj.',
+          customize: 'Pojdite na platno, da prilagodite logiko neuspe拧ne veje.',
+        },
+        partialSucceeded: {
+          tip: 'V procesu so {{num}} vozli拧膷a, ki se izvajajo nenormalno, pojdite na sledenje, da preverite dnevnike.',
+        },
+        title: 'Ravnanje z napakami',
+        tip: 'Strategija ravnanja z izjemami, ki se spro啪i, ko vozli拧膷e naleti na izjemo.',
+      },
+      retry: {
+        retryOnFailure: 'Ponovni poskus ob neuspehu',
+        retryInterval: 'Interval ponovnega poskusa',
+        retrying: 'Ponovnim...',
+        retry: 'Ponoviti',
+        retryFailedTimes: '{{times}} ponovni poskusi niso uspeli',
+        retries: '{{num}} Poskusov',
+        times: 'Krat',
+        retryTimes: 'Ponovni poskus {{times}}-krat ob neuspehu',
+        retryFailed: 'Ponovni poskus ni uspel',
+        retrySuccessful: 'Ponovni poskus je bil uspe拧en',
+        maxRetries: 'Najve膷 ponovnih poskusov',
+        ms: 'Ms',
+      },
+    },
+    start: {
+      outputVars: {
+        memories: {
+          content: 'Vsebina sporo膷ila',
+          des: 'Zgodovina pogovorov',
+          type: 'Vrsta sporo膷ila',
+        },
+        query: 'Uporabni拧ki vnos',
+        files: 'Seznam datotek',
+      },
+      required: 'Zahteva',
+      inputField: 'Vnosno polje',
+      noVarTip: 'Nastavitev vhodov, ki jih je mogo膷e uporabiti v poteku dela',
+      builtInVar: 'Vgrajene spremenljivke',
+    },
+    end: {
+      output: {
+        variable: 'izhodna spremenljivka',
+        type: 'Vrsta izhoda',
+      },
+      type: {
+        'structured': 'Strukturiran',
+        'plain-text': 'Navadno besedilo',
+        'none': 'Nobena',
+      },
+      outputs: 'Izhodov',
+    },
+    answer: {
+      answer: 'Odgovoriti',
+      outputVars: 'Izhodne spremenljivke',
+    },
+    llm: {
+      roleDescription: {
+        assistant: 'Odgovori modela na podlagi sporo膷il uporabnikov',
+        system: 'Podajte navodila na visoki ravni za pogovor',
+        user: 'Navedite navodila, poizvedbe ali kakr拧en koli besedilni vnos v model',
+      },
+      resolution: {
+        low: 'Nizek',
+        high: 'Visok',
+        name: 'Resolucija',
+      },
+      outputVars: {
+        usage: 'Informacije o uporabi modela',
+        output: 'Ustvarjanje vsebine',
+      },
+      singleRun: {
+        variable: 'Spremenljivka',
+      },
+      notSetContextInPromptTip: '膶e 啪elite omogo膷iti funkcijo konteksta, izpolnite kontekstno spremenljivko v PROMPT.',
+      sysQueryInUser: 'sys.query v sporo膷ilu uporabnika je obvezen',
+      model: 'model',
+      files: 'Datoteke',
+      addMessage: 'Dodaj sporo膷ilo',
+      context: 'Kontekstu',
+      variables: 'Spremenljivke',
+      prompt: 'Uren',
+      vision: 'vid',
+      contextTooltip: 'Znanje lahko uvozite kot kontekst',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: 'Prosimo, da dokon膷ate urejanje trenutnega polja, preden shranite shemo.',
+        },
+        addChildField: 'Dodaj polje za otroka',
+        instruction: 'Navodilo',
+        regenerate: 'Ponovno generiranje',
+        back: 'Nazaj',
+        generationTip: 'Lahko uporabite naravni jezik za hitro ustvarjanje JSON sheme.',
+        title: 'Strukturirana izhodna shema',
+        generating: 'Generiranje JSON sheme...',
+        showAdvancedOptions: 'Prika啪i napredne mo啪nosti',
+        promptTooltip: 'Pretvorite besedilni opis v standardizirano strukturo JSON sheme.',
+        generateJsonSchema: 'Generiraj JSON shemo',
+        fieldNamePlaceholder: 'Ime polja',
+        apply: 'Prijavi se',
+        doc: 'Izvedite ve膷 o strukturiranem izhodu',
+        promptPlaceholder: 'Opi拧i svoj JSON shemo...',
+        generatedResult: 'Generiran rezultat',
+        import: 'Uvoz iz JSON',
+        generate: 'Generirati',
+        resultTip: 'Tukaj je generiran rezultat. 膶e niste zadovoljni, se lahko vrnete in spremenite svoj poziv.',
+        stringValidations: 'Preverjanje nizov',
+        descriptionPlaceholder: 'Dodajte opis',
+        required: 'zahtevano',
+        addField: 'Dodaj polje',
+        resetDefaults: 'Ponastavi',
+      },
+    },
+    knowledgeRetrieval: {
+      outputVars: {
+        title: 'Segmentirani naslov',
+        url: 'Segmentirani URL',
+        output: 'Pridobivanje segmentiranih podatkov',
+        icon: 'Segmentirana ikona',
+        metadata: 'Drugi metapodatki',
+        content: 'Segmentirana vsebina',
+      },
+      queryVariable: 'Spremenljivka poizvedbe',
+      knowledge: 'Znanje',
+      metadata: {
+        options: {
+          disabled: {
+            title: 'Onemogo膷eno',
+            subTitle: 'Ne omogo膷anje filtriranja metapodatkov',
+          },
+          automatic: {
+            desc: 'Samodejno ustvarite filtrirne pogoje za metapodatke na podlagi spremenljivke poizvedbe',
+            subTitle: 'Samodejno ustvarite filtrirne pogoje za metapodatke na podlagi uporabni拧kega poizvedovanja.',
+            title: 'Samodejno',
+          },
+          manual: {
+            title: 'Ro膷no',
+            subTitle: 'Ro膷no dodajte pogoje za filtriranje metapodatkov',
+          },
+        },
+        panel: {
+          title: 'Pogoji za filtriranje metapodatkov',
+          search: 'I拧膷i metapodatke',
+          placeholder: 'Vnesite vrednost',
+          select: 'Izberi spremenljivko...',
+          conditions: 'Pogoji',
+          datePlaceholder: 'Izberi 膷as...',
+          add: 'Dodaj pogoj',
+        },
+        title: 'Filtriranje metapodatkov',
+      },
+    },
+    http: {
+      outputVars: {
+        headers: 'JSON seznama glav odgovorov',
+        body: 'Vsebina odgovora',
+        files: 'Seznam datotek',
+        statusCode: 'Koda stanja odgovora',
+      },
+      authorization: {
+        'authorization': 'Dovoljenje',
+        'header': 'Glava',
+        'bearer': 'Nosilec',
+        'api-key-title': 'API klju膷',
+        'basic': 'Osnoven',
+        'no-auth': 'Nobena',
+        'custom': 'Obi膷aj',
+        'authorizationType': 'Vrsta dovoljenja',
+        'auth-type': 'Vrsta preverjanja pristnosti',
+        'api-key': 'Klju膷 API-ja',
+      },
+      timeout: {
+        readPlaceholder: 'Vnos 膷asovne omejitve branja v sekundah',
+        writePlaceholder: 'Vnesite 膷asovno omejitev pisanja v sekundah',
+        writeLabel: '膶asovna omejitev pisanja',
+        connectLabel: '膶asovna omejitev povezave',
+        title: 'Timeout',
+        readLabel: '膶asovna omejitev branja',
+        connectPlaceholder: 'Vnos 膷asovne omejitve povezave v sekundah',
+      },
+      value: 'Vrednost',
+      key: 'Klju膷',
+      notStartWithHttp: 'API se mora za膷eti z http:// ali https://',
+      body: 'Telo',
+      type: 'Vrsta',
+      inputVars: 'Vhodne spremenljivke',
+      bulkEdit: 'Urejanje v velikem obsegu',
+      insertVarPlaceholder: 'vnesite "/" za vstavljanje spremenljivke',
+      api: 'API',
+      keyValueEdit: 'Urejanje klju膷-vrednost',
+      binaryFileVariable: 'Spremenljivka binarne datoteke',
+      headers: 'Glave',
+      apiPlaceholder: 'Vnesite URL, vnesite \'/\' vstavi spremenljivko',
+      extractListPlaceholder: 'Vnesite indeks elementa seznama, vnesite \'/\' vstavi spremenljivko',
+      params: 'Params',
+      curl: {
+        title: 'Uvoz iz cURL',
+        placeholder: 'Tukaj prilepite niz cURL',
+      },
+    },
+    code: {
+      inputVars: 'Vhodne spremenljivke',
+      outputVars: 'Izhodne spremenljivke',
+      searchDependencies: 'Odvisnosti iskanja',
+      advancedDependenciesTip: 'Tukaj dodajte nekaj vnaprej nalo啪enih odvisnosti, ki trajajo dlje 膷asa ali niso privzeto vgrajene',
+      advancedDependencies: 'Napredne odvisnosti',
+    },
+    templateTransform: {
+      outputVars: {
+        output: 'Preoblikovana vsebina',
+      },
+      code: 'Koda',
+      inputVars: 'Vhodne spremenljivke',
+      codeSupportTip: 'Podpira samo Jinja2',
+    },
+    ifElse: {
+      comparisonOperator: {
+        'all of': 'vse',
+        'is not': 'ni',
+        'not empty': 'ni prazen',
+        'start with': 'Za膷nite z',
+        'is': 'Je',
+        'null': 'je ni膷na',
+        'not exists': 'ne obstaja',
+        'contains': 'Vsebuje',
+        'empty': 'je prazen',
+        'exists': 'Obstaja',
+        'in': 'v',
+        'not contains': 'ne vsebuje',
+        'end with': 'Kon膷aj z',
+        'not in': 'ni v',
+        'not null': 'ni ni膷na',
+        'after': 'po',
+        'before': 'pred',
+      },
+      optionName: {
+        video: 'Video',
+        doc: 'Doc',
+        audio: 'Avdio',
+        image: 'Podoba',
+        url: 'Spletni naslov',
+        localUpload: 'Lokalno nalaganje',
+      },
+      and: 'in',
+      else: 'Drugega',
+      enterValue: 'Vnesite vrednost',
+      elseDescription: 'Uporablja se za dolo膷anje logike, ki jo je treba izvesti, ko pogoj if ni izpolnjen.',
+      addCondition: 'Dodajanje pogoja',
+      if: '膶e',
+      select: 'Izbrati',
+      selectVariable: 'Izberite spremenljivko ...',
+      conditionNotSetup: 'Pogoj NI nastavljen',
+      addSubVariable: 'Podspremenljivka',
+      notSetVariable: 'Prosimo, najprej nastavite spremenljivko',
+      operator: 'Operaterja',
+      or: 'ali',
+      condition: 'Pogoji',
+    },
+    variableAssigner: {
+      type: {
+        string: 'Niz',
+        object: 'Predmet',
+        array: 'Matrika',
+        number: '艩tevilka',
+      },
+      outputVars: {
+        varDescribe: '{{groupName}} izhod',
+      },
+      addGroup: 'Dodajanje skupine',
+      outputType: 'Vrsta izhoda',
+      title: 'Dodeljevanje spremenljivk',
+      noVarTip: 'Se拧tevanje spremenljivk, ki jih je treba dodeliti',
+      aggregationGroupTip: '膶e omogo膷ite to funkcijo, lahko zdru啪evalnik spremenljivk zdru啪i ve膷 naborov spremenljivk.',
+      aggregationGroup: 'Zdru啪evalna skupina',
+      varNotSet: 'Spremenljivka ni nastavljena',
+      setAssignVariable: 'Nastavitev spremenljivke dodelitve',
+    },
+    assigner: {
+      'writeMode': 'Na膷in pisanja',
+      'plus': 'Plus',
+      'variable': 'Spremenljivka',
+      'clear': 'Jasen',
+      'append': 'Dodaj',
+      'assignedVariable': 'Dodeljena spremenljivka',
+      'setVariable': 'Nastavi spremenljivko',
+      'over-write': 'Prepisati',
+      'writeModeTip': 'Na膷in dodajanja: Na voljo samo za spremenljivke polja.',
+      'operations': {
+        '+=': '+=',
+        'overwrite': 'Prepisati',
+        '*=': '*=',
+        'extend': 'Raz拧iriti',
+        'append': 'Dodaj',
+        '-=': '-=',
+        'title': 'Operacija',
+        '/=': '/=',
+        'set': 'Nastaviti',
+        'clear': 'Jasen',
+        'over-write': 'Prepisati',
+        'remove-last': 'Odstrani zadnje',
+        'remove-first': 'Odstrani prvi',
+      },
+      'variables': 'Spremenljivke',
+      'selectAssignedVariable': 'Izberite dodeljeno spremenljivko ...',
+      'assignedVarsDescription': 'Dodeljene spremenljivke morajo biti zapisljive, kot so spremenljivke pogovora.',
+      'noVarTip': 'Kliknite gumb 禄+芦, da dodate spremenljivke',
+      'noAssignedVars': 'Ni razpolo啪ljivih dodeljenih spremenljivk',
+      'varNotSet': 'Spremenljivka NI nastavljena',
+      'setParameter': 'Nastavi parameter ...',
+    },
+    tool: {
+      outputVars: {
+        files: {
+          transfer_method: 'Na膷in prenosa. Vrednost je remote_url ali local_file',
+          upload_file_id: 'Nalo啪i ID datoteke',
+          type: 'Vrsta podpore. Zdaj podpiramo samo sliko',
+          url: 'URL slike',
+          title: 'Datoteke, ustvarjene z orodjem',
+        },
+        json: 'JSON, ustvarjen z orodjem',
+        text: 'Vsebina, ustvarjena z orodjem',
+      },
+      inputVars: 'Vhodne spremenljivke',
+      toAuthorize: 'Za odobritev',
+    },
+    questionClassifiers: {
+      outputVars: {
+        className: 'Ime razreda',
+      },
+      instruction: 'Navodilo',
+      classNamePlaceholder: 'Napi拧ite ime svojega razreda',
+      addClass: 'Dodajanje razreda',
+      instructionPlaceholder: 'Napi拧ite navodila',
+      topicName: 'Ime teme',
+      topicPlaceholder: 'Napi拧ite ime teme',
+      class: 'Razred',
+      advancedSetting: 'Napredne nastavitve',
+      model: 'model',
+      inputVars: 'Vhodne spremenljivke',
+      instructionTip: 'Vnesite dodatna navodila, ki bodo klasifikatorju vpra拧anj pomagala bolje razumeti, kako kategorizirati vpra拧anja.',
+    },
+    parameterExtractor: {
+      addExtractParameterContent: {
+        description: 'Opis',
+        typePlaceholder: 'Vrsta parametra izvle膷ka',
+        requiredContent: 'Zahtevano se uporablja samo kot referenca za sklepanje modela in ne za obvezno validacijo izhodnega parametra.',
+        required: 'Zahteva',
+        type: 'Vrsta',
+        namePlaceholder: 'Izvle膷ek imena parametra',
+        descriptionPlaceholder: 'Opis parametra izvle膷ka',
+        name: 'Ime',
+      },
+      isSuccess: 'Je uspeh.Pri uspehu je vrednost 1, pri neuspehu je vrednost 0.',
+      addExtractParameter: 'Dodajanje parametra izvle膷ka',
+      importFromTool: 'Uvoz iz orodij',
+      reasoningModeTip: 'Izberete lahko ustrezen na膷in sklepanja glede na sposobnost modela, da se odzove na navodila za klicanje funkcij ali pozive.',
+      inputVar: 'Vhodna spremenljivka',
+      advancedSetting: 'Napredne nastavitve',
+      errorReason: 'Razlog za napako',
+      reasoningMode: 'Na膷in sklepanja',
+      instruction: 'Navodilo',
+      instructionTip: 'Vnesite dodatna navodila, ki bodo ekstraktorju parametrov pomagala razumeti, kako izvle膷i parametre.',
+      extractParametersNotSet: 'Izvle膷ek parametrov ni nastavljen',
+      extractParameters: 'Izvle膷ek parametrov',
+    },
+    iteration: {
+      ErrorMethod: {
+        continueOnError: 'Nadaljuj ob napaki',
+        removeAbnormalOutput: 'Odstranite nenormalen izhod',
+        operationTerminated: 'Prekinjena',
+      },
+      output: 'Izhodne spremenljivke',
+      parallelMode: 'Vzporedni na膷in',
+      MaxParallelismTitle: 'Najve膷ji vzporednost',
+      errorResponseMethod: 'Na膷in odziva na napako',
+      parallelModeEnableDesc: 'V vzporednem na膷inu opravila v iteracijah podpirajo vzporedno izvajanje. To lahko konfigurirate na plo拧膷i z lastnostmi na desni.',
+      error_one: '{{拧tetje}} Napaka',
+      comma: ',',
+      parallelModeUpper: 'VZPOREDNI NA膶IN',
+      parallelModeEnableTitle: 'Vzporedni na膷in omogo膷en',
+      currentIteration: 'Trenutna ponovitev',
+      error_other: '{{拧tetje}} Napake',
+      input: 'Vhodni',
+      deleteTitle: 'Izbrisati iteracijsko vozli拧膷e?',
+      parallelPanelDesc: 'V vzporednem na膷inu opravila v iteraciji podpirajo vzporedno izvajanje.',
+      deleteDesc: '膶e izbri拧ete iteracijsko vozli拧膷e, boste izbrisali vsa podrejena vozli拧膷a',
+      iteration_other: '{{拧tetje}} Ponovitev',
+      answerNodeWarningDesc: 'Opozorilo vzporednega na膷ina: Vozli拧膷a za odgovore, dodelitve spremenljivk pogovora in trajne operacije branja / pisanja v iteracijah lahko povzro膷ijo izjeme.',
+      MaxParallelismDesc: 'Najve膷ja vzporednost se uporablja za nadzor 拧tevila nalog, ki se izvajajo hkrati v eni ponovitvi.',
+      iteration_one: '{{拧tetje}} Ponovitev',
+    },
+    note: {
+      editor: {
+        medium: 'Srednja',
+        openLink: 'Odprt',
+        showAuthor: 'Poka啪i avtorja',
+        bold: 'Smel',
+        strikethrough: 'Pre膷rtano',
+        large: 'Velik',
+        link: 'Povezava',
+        enterUrl: 'Vnesite URL ...',
+        small: 'Majhen',
+        italic: 'Le啪e膷e',
+        invalidUrl: 'Neveljaven URL',
+        unlink: 'Prekini povezavo',
+        placeholder: 'Napi拧ite svojo opombo ...',
+        bulletList: 'Seznam oznak',
+      },
+      addNote: 'Dodaj opombo',
+    },
+    docExtractor: {
+      outputVars: {
+        text: 'Izvle膷eno besedilo',
+      },
+      inputVar: 'Vhodna spremenljivka',
+      learnMore: 'Izvedi ve膷',
+      supportFileTypes: 'Podporne vrste datotek: {{types}}.',
+    },
+    listFilter: {
+      outputVars: {
+        result: 'Rezultat filtriranja',
+        first_record: 'Prvi zapis',
+        last_record: 'Zadnji zapis',
+      },
+      extractsCondition: 'Ekstrahiranje elementa N',
+      selectVariableKeyPlaceholder: 'Izberite klju膷 podspremenljivke',
+      asc: 'ASC',
+      orderBy: 'Naro膷ite po',
+      filterCondition: 'Pogoj filtra',
+      filterConditionKey: 'Klju膷 pogoja filtra',
+      desc: 'DESC',
+      limit: 'Vrh N',
+      filterConditionComparisonOperator: 'Operator za primerjavo pogojev filtra',
+      inputVar: 'Vhodna spremenljivka',
+      filterConditionComparisonValue: 'Vrednost pogoja filtra',
+    },
+    agent: {
+      strategy: {
+        configureTipDesc: 'Po konfiguraciji agentske strategije bo to vozli拧膷e samodejno nalo啪ilo preostale konfiguracije. Strategija bo vplivala na mehanizem sklepanja z orodji v ve膷 korakih.',
+        tooltip: 'Razli膷ne agentske strategije dolo膷ajo, kako sistem na膷rtuje in izvaja klice orodij v ve膷 korakih',
+        shortLabel: 'Strategija',
+        configureTip: 'Prosimo, konfigurirajte agentsko strategijo.',
+        searchPlaceholder: 'Strategija iskalnega agenta',
+        label: 'Agentska strategija',
+        selectTip: 'Izberite agentsko strategijo',
+      },
+      pluginInstaller: {
+        installing: 'Namestitev',
+        install: 'Namestiti',
+      },
+      modelNotInMarketplace: {
+        desc: 'Ta model je name拧膷en iz lokalnega skladi拧膷a ali skladi拧膷a GitHub. Uporabite po namestitvi.',
+        title: 'Model ni name拧膷en',
+        manageInPlugins: 'Upravljanje v vti膷nikih',
+      },
+      modelNotSupport: {
+        descForVersionSwitch: 'Name拧膷ena razli膷ica vti膷nika ne zagotavlja tega modela. Kliknite, 膷e 啪elite preklopiti med razli膷ico.',
+        title: 'Nepodprt model',
+        desc: 'Name拧膷ena razli膷ica vti膷nika ne zagotavlja tega modela.',
+      },
+      modelSelectorTooltips: {
+        deprecated: 'Ta model je zastarel',
+      },
+      outputVars: {
+        files: {
+          url: 'URL slike',
+          title: 'Datoteke, ki jih ustvari agent',
+          type: 'Vrsta podpore. Zdaj podpiramo samo sliko',
+          upload_file_id: 'Nalo啪i ID datoteke',
+          transfer_method: 'Na膷in prenosa. Vrednost je remote_url ali local_file',
+        },
+        json: 'JSON, ustvarjen z agentom',
+        text: 'Vsebina, ki jo ustvari agent',
+      },
+      checkList: {
+        strategyNotSelected: 'Strategija ni izbrana',
+      },
+      installPlugin: {
+        cancel: 'Odpovedati',
+        changelog: 'Dnevnik sprememb',
+        install: 'Namestiti',
+        title: 'Namesti vti膷nik',
+        desc: 'O namestitvi naslednjega vti膷nika',
+      },
+      strategyNotSet: 'Agentska strategija ni dolo膷ena',
+      modelNotSelected: 'Model ni izbran',
+      pluginNotInstalled: 'Ta vti膷nik ni name拧膷en',
+      toolNotAuthorizedTooltip: '{{orodje}} Ni poobla拧膷eno',
+      toolbox: 'Orodjarni',
+      tools: 'Orodja',
+      toolNotInstallTooltip: '{{tool}} ni name拧膷en',
+      strategyNotInstallTooltip: '{{strategy}} ni name拧膷en',
+      modelNotInstallTooltip: 'Ta model ni name拧膷en',
+      pluginNotFoundDesc: 'Ta vti膷nik je name拧膷en iz GitHuba. Prosimo, pojdite na Vti膷niki za ponovno namestitev',
+      maxIterations: 'Najve膷je 拧tevilo ponovitev',
+      notAuthorized: 'Ni poobla拧膷eno',
+      model: 'model',
+      learnMore: 'Izvedi ve膷',
+      unsupportedStrategy: 'Nepodprta strategija',
+      strategyNotFoundDescAndSwitchVersion: 'Name拧膷ena razli膷ica vti膷nika ne zagotavlja te strategije. Kliknite, 膷e 啪elite preklopiti med razli膷ico.',
+      strategyNotFoundDesc: 'Name拧膷ena razli膷ica vti膷nika ne zagotavlja te strategije.',
+      configureModel: 'Konfiguracija modela',
+      pluginNotInstalledDesc: 'Ta vti膷nik je name拧膷en iz GitHuba. Prosimo, pojdite na Vti膷niki za ponovno namestitev',
+      linkToPlugin: 'Povezava do vti膷nikov',
+    },
+    loop: {
+      ErrorMethod: {
+        operationTerminated: 'Prekinjeno',
+        continueOnError: 'Nadaljuj ob napaki',
+        removeAbnormalOutput: 'Odstrani nenavadne izhode',
+      },
+      input: 'Vnos',
+      inputMode: 'Vnosni na膷in',
+      errorResponseMethod: 'Metoda odziva napake',
+      setLoopVariables: 'Nastavite spremenljivke znotraj obsega zanke',
+      output: 'Izhodna spremenljivka',
+      loop_one: '{{count}} Zanka',
+      exitConditionTip: 'Vozi膰 potrebuje vsaj eno izhodno pogoj.',
+      loopMaxCount: 'Maksimalno 拧tevilo zank',
+      deleteDesc: 'Izbris vozli拧膷a zanke bo odstranil vse otro拧ke vozli拧膷a.',
+      comma: ',',
+      loop_other: '{{count}} Zavoji',
+      currentLoop: 'Trenutni obrat',
+      variableName: 'Spremenljivka Ime',
+      deleteTitle: 'Izbri拧i vozli拧膷e zanke?',
+      error_one: '{{count}} Napaka',
+      totalLoopCount: 'Skupno 拧tevilo zank: {{count}}',
+      initialLoopVariables: 'Za膷etne spremenljivke zanke',
+      currentLoopCount: 'Trenutno 拧tevilo zank: {{count}}',
+      loopNode: 'Cikli膷ni vozli拧膷e',
+      loopVariables: 'Zanke Spremenljivke',
+      breakConditionTip: 'Lahko se sklicujete le na spremenljivke znotraj zank z zaklju膷nimi pogoji in pogovorne spremenljivke.',
+      breakCondition: 'Pogoji za prekinitev zanke',
+      finalLoopVariables: 'Kon膷ne zanke spremenljivke',
+      error_other: '{{count}} Napak',
+      loopMaxCountError: 'Prosimo, vnesite veljavno najve膷je 拧tevilo ponovitev, ki mora biti med 1 in {{maxCount}}',
+    },
+  },
+  variableReference: {
+    noVarsForOperation: 'Spremenljivk ni na voljo za dodelitev z izbrano operacijo.',
+    conversationVars: 'Spremenljivke pogovora',
+    noAssignedVars: 'Ni razpolo啪ljivih dodeljenih spremenljivk',
+    noAvailableVars: 'Ni spremenljivk, ki so na voljo',
+    assignedVarsDescription: 'Dodeljene spremenljivke morajo biti zapisljive, kot so:',
+  },
+  versionHistory: {
+    filter: {
+      all: 'Vse',
+      empty: 'Ni najdene zgodovine razli膷ic, ki bi se ujemala.',
+      onlyShowNamedVersions: 'Prika啪i samo poimenovane razli膷ice',
+      reset: 'Ponastavi filter',
+      onlyYours: 'Samo tvoje',
+    },
+    editField: {
+      titleLengthLimit: 'Naslov ne sme presegati {{limit}} znakov',
+      title: 'Naslov',
+      releaseNotesLengthLimit: 'Opombe o razli膷ici ne smejo presegati {{limit}} znakov.',
+      releaseNotes: 'Opombe o izdaji',
+    },
+    action: {
+      updateFailure: 'Posodobitev razli膷ice ni uspela',
+      restoreFailure: 'Obnovitev razli膷ice ni uspela',
+      updateSuccess: 'Razli膷ica posodobljena',
+      restoreSuccess: 'Obnovljena razli膷ica',
+      deleteSuccess: 'Razli膷ica izbrisana',
+      deleteFailure: 'Brisanje razli膷ice ni uspelo',
+    },
+    releaseNotesPlaceholder: 'Opisujte, kaj se je spremenilo.',
+    latest: 'Najnovej拧i',
+    deletionTip: 'Izbris je nepovraten, prosim potrdite.',
+    defaultName: 'Nepodpisana razli膷ica',
+    nameThisVersion: 'Poimenujte to razli膷ico',
+    restorationTip: 'Po obnovitvi razli膷ice bo trenutni osnutek prepisan.',
+    currentDraft: 'Trenutni osnutek',
+    editVersionInfo: 'Uredi informacije o razli膷ici',
+    title: 'Razli膷ice',
+  },
+}
+
+export default translation
diff --git a/i18n/th-TH/app-annotation.ts b/i18n/th-TH/app-annotation.ts
new file mode 100644
index 0000000..5fba357
--- /dev/null
+++ b/i18n/th-TH/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: '喔勦赋 喔笜喔脆笟喔侧涪',
+  name: '喔勦箥喔侧腑喔樴复喔氞覆喔⑧笡喔`赴喔佮腑喔� 喔曕腑喔氞竵喔ム副喔�',
+  editBy: '喔曕腑喔氞箒喔佮箟喙勦競喙傕笖喔� {{author}}',
+  noData: {
+    title: '喙勦浮喙堗浮喔掂竸喙嵿覆喔笜喔脆笟喔侧涪喔涏福喔班竵喔笟',
+    description: '喔勦父喔撪釜喔侧浮喔侧福喔栢箒喔佮箟喙勦競喔勦箥喔侧腑喔樴复喔氞覆喔⑧笡喔`赴喔佮腑喔氞福喔班斧喔о箞喔侧竾喔佮覆喔`笖喔掂笟喔编竵喙佮腑喔涏斧喔`阜喔笝喙嵿覆喙�喔傕箟喔侧竸喙嵿覆喔笜喔脆笟喔侧涪喔涏福喔班竵喔笟喔堗箥喔侧笝喔о笝喔∴覆喔佮箘喔斷箟喔椸傅喙堗笝喔掂箞喙�喔炧阜喙堗腑喔佮覆喔`笗喔笟喔佮弗喔编笟喔勦父喔撪笭喔侧笧喔腹喔�',
+  },
+  table: {
+    header: {
+      question: '喔涏副喔嵿斧喔�',
+      answer: '喔曕腑喔�',
+      createdAt: '喔福喙夃覆喔囙箑喔∴阜喙堗腑',
+      hits: '喔复喔�',
+      actions: '喔佮覆喔`竵喔`赴喔椸箥喔�',
+      addAnnotation: '喙�喔炧复喙堗浮喔勦箥喔侧腑喔樴复喔氞覆喔⑧笡喔`赴喔佮腑喔�',
+      bulkImport: '喔權箥喔侧箑喔傕箟喔侧笀喙嵿覆喔權抚喔權浮喔侧竵',
+      bulkExport: '喔箞喔囙腑喔竵喔堗箥喔侧笝喔о笝喔∴覆喔�',
+      clearAll: '喔ム箟喔侧竾喔勦箥喔侧腑喔樴复喔氞覆喔⑧笡喔`赴喔佮腑喔氞笚喔编箟喔囙斧喔∴笖',
+    },
+  },
+  editModal: {
+    title: '喙佮竵喙夃箘喔傕竸喙嵿覆喔笜喔脆笟喔侧涪喔涏福喔班竵喔笟 喔曕腑喔氞竵喔ム副喔�',
+    queryName: '喔佮覆喔`釜喔笟喔栢覆喔∴競喔竾喔溹腹喙夃箖喔娻箟',
+    answerName: '喔氞腑喔椸笝喔编竵喙�喔ム箞喔侧箑喔`阜喙堗腑喔�',
+    yourAnswer: '喔勦箥喔侧笗喔笟喔傕腑喔囙竸喔膏笓',
+    answerPlaceholder: '喔炧复喔∴笧喙屶竸喙嵿覆喔曕腑喔氞競喔竾喔勦父喔撪笚喔掂箞喔權傅喙�',
+    yourQuery: '喔勦箥喔侧笘喔侧浮喔傕腑喔囙竸喔膏笓',
+    queryPlaceholder: '喔炧复喔∴笧喙屶箒喔氞笟喔腑喔氞笘喔侧浮喔傕腑喔囙竸喔膏笓喔椸傅喙堗笝喔掂箞',
+    removeThisCache: '喔ム笟喔勦箥喔侧腑喔樴复喔氞覆喔⑧笡喔`赴喔佮腑喔氞笝喔掂箟',
+    createdAt: '喔福喙夃覆喔囙笚喔掂箞',
+  },
+  addModal: {
+    title: '喙�喔炧复喙堗浮喔勦箥喔侧腑喔樴复喔氞覆喔⑧笡喔`赴喔佮腑喔氞笗喔笟喔佮弗喔编笟',
+    queryName: '喔涏副喔嵿斧喔�',
+    answerName: '喔曕腑喔�',
+    answerPlaceholder: '喔炧复喔∴笧喙屶竸喙嵿覆喔曕腑喔氞笚喔掂箞喔權傅喙�',
+    queryPlaceholder: '喔炧复喔∴笧喙� query 喔椸傅喙堗笝喔掂箞',
+    createNext: '喙�喔炧复喙堗浮喔佮覆喔`笗喔笟喔佮弗喔编笟喔椸傅喙堗浮喔掂竸喙嵿覆喔笜喔脆笟喔侧涪喔涏福喔班竵喔笟喔阜喙堗笝',
+  },
+  batchModal: {
+    title: '喔權箥喔侧箑喔傕箟喔侧笀喙嵿覆喔權抚喔權浮喔侧竵',
+    csvUploadTitle: '喔ム覆喔佮箒喔ム赴喔о覆喔囙箘喔熰弗喙� CSV 喔傕腑喔囙竸喔膏笓喔椸傅喙堗笝喔掂箞 喔福喔粪腑',
+    browse: '喙�喔ム箛喔�',
+    tip: '喙勦笩喔ム箤 CSV 喔曕箟喔竾喔腑喔斷竸喔ム箟喔竾喔佮副喔氞箓喔勦福喔囙釜喔`箟喔侧竾喔曕箞喔箘喔涏笝喔掂箟:',
+    question: '喔涏副喔嵿斧喔�',
+    answer: '喔曕腑喔�',
+    contentTitle: '喙�喔權阜喙夃腑喔覆喔佮箟喔笝',
+    content: '喙�喔權阜喙夃腑喔覆',
+    template: '喔斷覆喔о笝喙屶箓喔弗喔斷箑喔椸浮喙�喔炧弗喔曕笚喔掂箞喔權傅喙�',
+    cancel: '喔⑧竵喙�喔ム复喔�',
+    run: '喙�喔`傅喔⑧竵喙冟笂喙夃箒喔氞笚喔娻箤',
+    runError: '喙�喔`傅喔⑧竵喙冟笂喙夃笂喔膏笖喔囙覆喔權弗喙夃浮喙�喔弗喔�',
+    processing: '喙冟笝喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム箒喔氞笟喙佮笟喔椸笂喙�',
+    completed: '喔權箥喔侧箑喔傕箟喔侧箑喔福喙囙笀喔浮喔氞腹喔`笓喙�',
+    error: '喔傕箟喔笢喔脆笖喔炧弗喔侧笖喙冟笝喔佮覆喔`笝喙嵿覆喙�喔傕箟喔�',
+    ok: '喔曕竵喔ム竾, 喙勦笖喙�',
+  },
+  errorMessage: {
+    answerRequired: '喔曕箟喔竾喔曕腑喔�',
+    queryRequired: '喔堗箥喔侧箑喔涏箛喔權笗喙夃腑喔囙浮喔掂竸喙嵿覆喔栢覆喔�',
+  },
+  viewModal: {
+    annotatedResponse: '喔勦箥喔侧腑喔樴复喔氞覆喔⑧笡喔`赴喔佮腑喔� 喔曕腑喔氞竵喔ム副喔�',
+    hitHistory: '喔涏福喔班抚喔编笗喔脆竵喔侧福喔曕傅',
+    hit: '喔曕傅',
+    hits: '喔复喔�',
+    noHitHistory: '喙勦浮喙堗浮喔掂笡喔`赴喔о副喔曕复喔佮覆喔`笗喔�',
+  },
+  hitHistoryTable: {
+    query: '喔腑喔氞笘喔侧浮',
+    match: '喙勦浮喙夃競喔掂笖喙勦笩',
+    response: '喔佮覆喔`笗喔笟喔笝喔竾',
+    source: '喔椸傅喙堗浮喔�',
+    score: '喔勦赴喙佮笝喔�',
+    time: '喙�喔о弗喔�',
+  },
+  initSetup: {
+    title: '喔勦箥喔侧腑喔樴复喔氞覆喔⑧笡喔`赴喔佮腑喔氞笗喔笟喔佮弗喔编笟喔佮覆喔`笗喔编箟喔囙竸喙堗覆喙�喔`复喙堗浮喔曕箟喔�',
+    configTitle: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔佮覆喔`笗喔笟喔佮弗喔编笟喔勦箥喔侧腑喔樴复喔氞覆喔⑧笡喔`赴喔佮腑喔�',
+    confirmBtn: '喔氞副喔權笚喔多竵喙佮弗喔班箑喔涏复喔斷箖喔娻箟喔囙覆喔�',
+    configConfirmBtn: '喔涏福喔班斧喔⑧副喔�',
+  },
+  embeddingModelSwitchTip: '喙傕浮喙�喔斷弗喙�喔о竵喙�喔曕腑喔`箤喔傕箟喔竸喔о覆喔∴竸喙嵿覆喔笜喔脆笟喔侧涪喔涏福喔班竵喔笟 喙傕浮喙�喔斷弗喔佮覆喔`釜喔ム副喔氞笀喔班笘喔灌竵喔澿副喔囙箖喔浮喙堗釜喙堗竾喔溹弗喙冟斧喙夃浮喔掂竸喙堗覆喙冟笂喙夃笀喙堗覆喔⑧箑喔炧复喙堗浮喙�喔曕复喔�',
+}
+
+export default translation
diff --git a/i18n/th-TH/app-api.ts b/i18n/th-TH/app-api.ts
new file mode 100644
index 0000000..e837250
--- /dev/null
+++ b/i18n/th-TH/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: '喙�喔嬥复喔`箤喔熰箑喔о腑喔`箤 API',
+  apiKey: '喔勦傅喔⑧箤 API',
+  status: '喔笘喔侧笝喔�',
+  disabled: '喔炧复喔佮覆喔�',
+  ok: '喙冟斧喙夃笟喔`复喔佮覆喔�',
+  copy: '喔ム腑喔�',
+  copied: '喔勦副喔� 喔ム腑喔�',
+  regenerate: '喔福喙夃覆喔囙箖喔浮喙�',
+  play: '喙�喔ム箞喔�',
+  pause: '喔涪喔膏笖',
+  playing: '喙�喔ム箞喔�',
+  loading: '喔佮覆喔`箓喔弗喔�',
+  merMaid: {
+    rerender: '喔椸箥喔侧笅喙夃箥喔� Rerender',
+  },
+  never: '喙勦浮喙堗箑喔勦涪',
+  apiKeyModal: {
+    apiSecretKey: '喔勦傅喔⑧箤喔ム副喔� API',
+    apiSecretKeyTips: '喙�喔炧阜喙堗腑喔涏箟喔竾喔佮副喔權竵喔侧福喔ム赴喙�喔∴复喔� API 喙冟斧喙夃笡喔佮笡喙夃腑喔囙竸喔掂涪喙� API 喔傕腑喔囙竸喔膏笓 喔弗喔掂竵喙�喔ム傅喙堗涪喔囙竵喔侧福喙冟笂喙夃箑喔涏箛喔權競喙夃腑喔勦抚喔侧浮喔樴福喔`浮喔斷覆喙冟笝喙傕竸喙夃笖喔箞喔о笝喔笝喙夃覆 :)',
+    createNewSecretKey: '喔福喙夃覆喔囙竸喔掂涪喙屶弗喔编笟喙冟斧喔∴箞',
+    secretKey: '喔佮父喔嵿箒喔堗弗喔编笟',
+    created: '喔福喙夃覆喔�',
+    lastUsed: '喙冟笂喙夃弗喙堗覆喔父喔�',
+    generateTips: '喙�喔佮箛喔氞竵喔膏笉喙佮笀喔權傅喙夃箘喔о箟喙冟笝喔椸傅喙堗笡喔ム腑喔斷笭喔编涪喙佮弗喔班箑喔傕箟喔侧笘喔多竾喙勦笖喙�',
+  },
+  actionMsg: {
+    deleteConfirmTitle: '喔ム笟喔勦傅喔⑧箤喔ム副喔氞笝喔掂箟?',
+    deleteConfirmTips: '喔佮覆喔`笖喙嵿覆喙�喔權复喔權竵喔侧福喔權傅喙夃箘喔∴箞喔覆喔∴覆喔`笘喔⑧竵喙�喔ム复喔佮箘喔斷箟',
+    ok: '喔曕竵喔ム竾, 喙勦笖喙�',
+  },
+  completionMode: {
+    title: 'API 喙佮腑喔涏笚喔掂箞喔浮喔氞腹喔`笓喙�',
+    info: '喔箥喔侧斧喔`副喔氞竵喔侧福喔福喙夃覆喔囙競喙夃腑喔勦抚喔侧浮喔勦父喔撪笭喔侧笧喔腹喔� 喙�喔娻箞喔� 喔氞笚喔勦抚喔侧浮 喔氞笚喔福喔膏笡 喙佮弗喔班竵喔侧福喙佮笡喔� 喙冟斧喙夃箖喔娻箟 API 喔傕箟喔竸喔о覆喔∴笚喔掂箞喔浮喔氞腹喔`笓喙屶竵喔编笟喔佮覆喔`笡喙夃腑喔權競喙夃腑喔∴腹喔ム競喔竾喔溹腹喙夃箖喔娻箟 喔佮覆喔`釜喔`箟喔侧竾喔傕箟喔竸喔о覆喔∴腑喔侧辅喔编涪喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤喙傕浮喙�喔斷弗喙佮弗喔班箑喔椸浮喙�喔炧弗喔曕笧喔`箟喔浮喔椸箤喔椸傅喙堗笗喔编箟喔囙竸喙堗覆喙勦抚喙夃箖喔� Dify Prompt Engineering',
+    createCompletionApi: '喔福喙夃覆喔囙競喙夃腑喔勦抚喔侧浮喙�喔福喙囙笀喔浮喔氞腹喔`笓喙�',
+    createCompletionApiTip: '喔福喙夃覆喔囙競喙夃腑喔勦抚喔侧浮喙�喔福喙囙笀喔复喙夃笝喙�喔炧阜喙堗腑喔`腑喔囙福喔编笟喙傕斧喔∴笖喔勦箥喔侧笘喔侧浮喙佮弗喔班竸喙嵿覆喔曕腑喔�',
+    inputsTips: '(喙勦浮喙堗笟喔编竾喔勦副喔�) 喔`赴喔氞父喔熰复喔ム笖喙屶腑喔脆笝喔炧父喔曕競喔竾喔溹腹喙夃箖喔娻箟喙�喔涏箛喔權竸喔灌箞喔勦傅喔⑧箤-喔勦箞喔� 喔嬥付喙堗竾喔腑喔斷竸喔ム箟喔竾喔佮副喔氞笗喔编抚喙佮笡喔`箖喔� Prompt Eng 喔勦傅喔⑧箤喔勦阜喔笂喔粪箞喔笗喔编抚喙佮笡喔� 喔勦箞喔侧竸喔粪腑喔勦箞喔侧笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤 喔栢箟喔侧笂喔權复喔斷笩喔脆弗喔斷箤喙�喔涏箛喔� 喙�喔ム阜喔竵 喔勦箞喔侧笚喔掂箞喔箞喔囙笀喔班笗喙夃腑喔囙箑喔涏箛喔權斧喔權付喙堗竾喙冟笝喔曕副喔о箑喔ム阜喔竵喔椸傅喙堗笗喔编箟喔囙箘喔о箟喔ム箞喔о竾喔笝喙夃覆',
+    queryTips: '喙�喔權阜喙夃腑喔覆喔傕箟喔竸喔о覆喔∴笚喔掂箞喔溹腹喙夃箖喔娻箟喔涏箟喔笝',
+    blocking: '喔涏福喔班箑喔犩笚喔佮覆喔`笟喔ム箛喔竵 喔`腑喙冟斧喙夃竵喔侧福喔斷箥喔侧箑喔權复喔權竵喔侧福喙�喔福喙囙笀喔浮喔氞腹喔`笓喙屶箒喔ム赴喔箞喔囙竸喔粪笝喔溹弗喔ム副喔炧笜喙� (喔勦箥喔侧競喔腑喔侧笀喔栢腹喔佮競喔编笖喔堗副喔囙斧喔о赴喔覆喔佮竵喔`赴喔氞抚喔權竵喔侧福喙冟笂喙夃箑喔о弗喔侧笝喔侧笝)',
+    streaming: '喔佮覆喔`釜喔曕福喔掂浮喔佮弗喔编笟喔∴覆 喔佮覆喔`箖喔娻箟喔囙覆喔權竵喔侧福喔箞喔囙竸喔粪笝喔佮覆喔`釜喔曕福喔掂浮喔曕覆喔� SSE (喙�喔笗喔膏竵喔侧福喔撪箤喔椸傅喙堗釜喙堗竾喙傕笖喔⑧箑喔嬥复喔`箤喔熰箑喔о腑喔`箤)',
+    messageFeedbackApi: '喔傕箟喔竸喔о覆喔∴箒喔笖喔囙竸喔о覆喔∴竸喔脆笖喙�喔箛喔� (喔娻腑喔�)',
+    messageFeedbackApiTip: '喙冟斧喙夃竸喔班箒喔權笝喔傕箟喔竸喔о覆喔∴笚喔掂箞喙勦笖喙夃福喔编笟喙冟笝喔權覆喔∴競喔竾喔溹腹喙夃箖喔娻箟喔涏弗喔侧涪喔椸覆喔囙笚喔掂箞喔∴傅喔佮覆喔`笂喔笟喔福喔粪腑喙勦浮喙堗笂喔笟 喔傕箟喔浮喔灌弗喔權傅喙夃釜喔侧浮喔侧福喔栢浮喔竾喙�喔箛喔權箘喔斷箟喙冟笝喔笝喙夃覆 Logs & Annotations 喙佮弗喔班箖喔娻箟喔箥喔侧斧喔`副喔氞竵喔侧福喔涏福喔编笟喙佮笗喙堗竾喙傕浮喙�喔斷弗喙冟笝喔笝喔侧竸喔�',
+    messageIDTip: '喔`斧喔编釜喔傕箟喔竸喔о覆喔�',
+    ratingTip: '喔娻腑喔氞斧喔`阜喔箘喔∴箞喔娻腑喔� null 喔勦阜喔箑喔ム复喔佮笚喙嵿覆',
+    parametersApi: '喔`副喔氞競喙夃腑喔∴腹喔ム笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤喙佮腑喔涏笧喔ム复喙�喔勦笂喔编笝',
+    parametersApiTip: '喔斷付喔囙笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤喔复喔權笧喔膏笗喔椸傅喙堗竵喙嵿覆喔笝喔斷竸喙堗覆喙勦抚喙� 喔`抚喔∴笘喔多竾喔娻阜喙堗腑喔曕副喔о箒喔涏福 喔娻阜喙堗腑喔熰复喔ム笖喙� 喔娻笝喔脆笖 喙佮弗喔班竸喙堗覆喙�喔`复喙堗浮喔曕箟喔� 喙傕笖喔⑧笚喔编箞喔о箘喔涏笀喔班箖喔娻箟喔箥喔侧斧喔`副喔氞箒喔笖喔囙笩喔脆弗喔斷箤喙�喔弗喙堗覆喔權傅喙夃箖喔權笩喔福喙屶浮喔福喔粪腑喔佮福喔竵喔勦箞喔侧箑喔`复喙堗浮喔曕箟喔權斧喔ム副喔囙笀喔侧竵喙傕斧喔ム笖喙勦竸喔ム箑喔箛喔權笗喙�',
+  },
+  chatMode: {
+    title: 'API 喙佮腑喔涏箒喔娻笚',
+    info: '喔箥喔侧斧喔`副喔氞箒喔笡喔佮覆喔`釜喔權笚喔權覆喔箑喔權竵喔涏福喔班釜喔囙竸喙屶笚喔掂箞喙冟笂喙夃福喔灌笡喙佮笟喔� Q&A 喙冟斧喙夃箑喔`傅喔⑧竵 API 喔傕箟喔竸喔о覆喔∴箒喔娻笚喙�喔炧阜喙堗腑喙�喔`复喙堗浮喔佮覆喔`釜喔權笚喔權覆 喔`副喔佮俯喔侧竵喔侧福喔笝喔椸笝喔侧腑喔⑧箞喔侧竾喔曕箞喔箑喔權阜喙堗腑喔囙箓喔斷涪喔箞喔� conversation_id 喔椸傅喙堗釜喙堗竾喔勦阜喔� 喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤喔佮覆喔`笗喔笟喔笝喔竾喙佮弗喔班箑喔椸浮喙�喔炧弗喔曕競喔多箟喔權腑喔⑧腹喙堗竵喔编笟 Dify Prompt Eng 喔佮覆喔`笗喔编箟喔囙竸喙堗覆',
+    createChatApi: '喔福喙夃覆喔囙競喙夃腑喔勦抚喔侧浮喙佮笂喔�',
+    createChatApiTip: '喔福喙夃覆喔囙競喙夃腑喔勦抚喔侧浮喔佮覆喔`釜喔權笚喔權覆喙冟斧喔∴箞喔福喔粪腑喔斷箥喔侧箑喔權复喔權竵喔侧福喔曕箞喔箖喔權竵喔侧福喔笝喔椸笝喔侧笚喔掂箞喔∴傅喔涪喔灌箞',
+    inputsTips: '(喙勦浮喙堗笟喔编竾喔勦副喔�) 喔`赴喔氞父喔熰复喔ム笖喙屶腑喔脆笝喔炧父喔曕競喔竾喔溹腹喙夃箖喔娻箟喙�喔涏箛喔權竸喔灌箞喔勦傅喔⑧箤-喔勦箞喔� 喔嬥付喙堗竾喔腑喔斷竸喔ム箟喔竾喔佮副喔氞笗喔编抚喙佮笡喔`箖喔� Prompt Eng 喔勦傅喔⑧箤喔勦阜喔笂喔粪箞喔笗喔编抚喙佮笡喔� 喔勦箞喔侧竸喔粪腑喔勦箞喔侧笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤 喔栢箟喔侧笂喔權复喔斷笩喔脆弗喔斷箤喙�喔涏箛喔� 喙�喔ム阜喔竵 喔勦箞喔侧笚喔掂箞喔箞喔囙笀喔班笗喙夃腑喔囙箑喔涏箛喔權斧喔權付喙堗竾喙冟笝喔曕副喔о箑喔ム阜喔竵喔椸傅喙堗笗喔编箟喔囙箘喔о箟喔ム箞喔о竾喔笝喙夃覆',
+    queryTips: '喙�喔權阜喙夃腑喔覆喔佮覆喔`笡喙夃腑喔權競喙夃腑喔∴腹喔�/喔勦箥喔侧笘喔侧浮喔傕腑喔囙笢喔灌箟喙冟笂喙�',
+    blocking: '喔涏福喔班箑喔犩笚喔佮覆喔`笟喔ム箛喔竵 喔`腑喙冟斧喙夃竵喔侧福喔斷箥喔侧箑喔權复喔權竵喔侧福喙�喔福喙囙笀喔浮喔氞腹喔`笓喙屶箒喔ム赴喔箞喔囙竸喔粪笝喔溹弗喔ム副喔炧笜喙� (喔勦箥喔侧競喔腑喔侧笀喔栢腹喔佮競喔编笖喔堗副喔囙斧喔о赴喔覆喔佮竵喔`赴喔氞抚喔權竵喔侧福喙冟笂喙夃箑喔о弗喔侧笝喔侧笝)',
+    streaming: '喔佮覆喔`釜喔曕福喔掂浮喔佮弗喔编笟喔∴覆 喔佮覆喔`箖喔娻箟喔囙覆喔權竵喔侧福喔箞喔囙竸喔粪笝喔佮覆喔`釜喔曕福喔掂浮喔曕覆喔� SSE (喙�喔笗喔膏竵喔侧福喔撪箤喔椸傅喙堗釜喙堗竾喙傕笖喔⑧箑喔嬥复喔`箤喔熰箑喔о腑喔`箤)',
+    conversationIdTip: '(喙勦浮喙堗笟喔编竾喔勦副喔�) 喔`斧喔编釜喔佮覆喔`釜喔權笚喔權覆: 喙�喔о箟喔權抚喙堗覆喔囙箘喔о箟喔箥喔侧斧喔`副喔氞竵喔侧福喔笝喔椸笝喔侧竸喔`副喙夃竾喙佮福喔� 喔箞喔� conversation_id 喔堗覆喔佮笟喔`复喔氞笚喙�喔炧阜喙堗腑喔笝喔椸笝喔侧笗喙堗腑',
+    messageFeedbackApi: '喔傕箟喔竸喔о覆喔∴竸喔о覆喔∴竸喔脆笖喙�喔箛喔權競喔竾喔溹腹喙夃箖喔娻箟喙�喔椸腑喔`箤喔∴复喔權副喔� 喙�喔娻箞喔�',
+    messageFeedbackApiTip: '喙冟斧喙夃竸喔班箒喔權笝喔傕箟喔竸喔о覆喔∴笚喔掂箞喙勦笖喙夃福喔编笟喙冟笝喔權覆喔∴競喔竾喔溹腹喙夃箖喔娻箟喔涏弗喔侧涪喔椸覆喔囙笚喔掂箞喔∴傅喔佮覆喔`笂喔笟喔福喔粪腑喙勦浮喙堗笂喔笟 喔傕箟喔浮喔灌弗喔權傅喙夃釜喔侧浮喔侧福喔栢浮喔竾喙�喔箛喔權箘喔斷箟喙冟笝喔笝喙夃覆 Logs & Annotations 喙佮弗喔班箖喔娻箟喔箥喔侧斧喔`副喔氞竵喔侧福喔涏福喔编笟喙佮笗喙堗竾喙傕浮喙�喔斷弗喙冟笝喔笝喔侧竸喔�',
+    messageIDTip: '喔`斧喔编釜喔傕箟喔竸喔о覆喔�',
+    ratingTip: '喔娻腑喔氞斧喔`阜喔箘喔∴箞喔娻腑喔� null 喔勦阜喔箑喔ム复喔佮笚喙嵿覆',
+    chatMsgHistoryApi: '喔`副喔氞競喙夃腑喔勦抚喔侧浮喔涏福喔班抚喔编笗喔脆竵喔侧福喙佮笂喔�',
+    chatMsgHistoryApiTip: '喔笝喙夃覆喙佮福喔佮釜喙堗竾喔勦阜喔權箒喔栢笟 \'喔傕傅喔斷笀喙嵿覆喔佮副喔擻' 喔ム箞喔侧釜喔膏笖 喔嬥付喙堗竾喔涪喔灌箞喙冟笝喔ム箥喔侧笖喔编笟喔椸傅喙堗竵喔ム副喔氞竵喔编笝',
+    chatMsgHistoryConversationIdTip: '喔`斧喔编釜喔佮覆喔`釜喔權笚喔權覆',
+    chatMsgHistoryFirstId: 'ID 喔傕腑喔囙箑喔`竵喔勦腑喔`箤喔斷箒喔娻笚喙佮福喔佮笟喔權斧喔權箟喔侧笡喔编笀喔堗父喔氞副喔� 喔勦箞喔侧箑喔`复喙堗浮喔曕箟喔權竸喔粪腑喙勦浮喙堗浮喔�',
+    chatMsgHistoryLimit: '喔堗箥喔侧笝喔о笝喙佮笂喔椸笚喔掂箞喔箞喔囙竸喔粪笝喙冟笝喔勦箥喔侧競喔箑喔斷傅喔⑧抚',
+    conversationsListApi: '喔`副喔氞福喔侧涪喔佮覆喔`竵喔侧福喔笝喔椸笝喔�',
+    conversationsListApiTip: '喔`副喔氞福喔侧涪喔佮覆喔`箑喔嬥釜喔娻副喔權競喔竾喔溹腹喙夃箖喔娻箟喔涏副喔堗笀喔膏笟喔编笝 喙傕笖喔⑧竸喙堗覆喙�喔`复喙堗浮喔曕箟喔� 20 喙�喔嬥釜喔娻副喔權弗喙堗覆喔父喔斷笀喔班笘喔灌竵喔箞喔囙竸喔粪笝',
+    conversationsListFirstIdTip: '喔`斧喔编釜喔傕腑喔囙箑喔`竵喔勦腑喔`箤喔斷釜喔膏笖喔椸箟喔侧涪喔氞笝喔笝喙夃覆喔涏副喔堗笀喔膏笟喔编笝 喔勦箞喔侧箑喔`复喙堗浮喔曕箟喔權箘喔∴箞喔∴傅',
+    conversationsListLimitTip: '喔堗箥喔侧笝喔о笝喙佮笂喔椸笚喔掂箞喔箞喔囙竸喔粪笝喙冟笝喔勦箥喔侧競喔箑喔斷傅喔⑧抚',
+    conversationRenamingApi: '喔佮覆喔`箑喔涏弗喔掂箞喔⑧笝喔娻阜喙堗腑喔佮覆喔`釜喔權笚喔權覆',
+    conversationRenamingApiTip: '喙�喔涏弗喔掂箞喔⑧笝喔娻阜喙堗腑喔佮覆喔`釜喔權笚喔權覆 喔娻阜喙堗腑喔堗赴喙佮釜喔斷竾喙冟笝喔复喔權箑喔椸腑喔`箤喙�喔熰笅喙勦竸喔ム箑喔箛喔權笗喙屶箒喔氞笟喔弗喔侧涪喙�喔嬥釜喔娻副喔�',
+    conversationRenamingNameTip: '喔娻阜喙堗腑喙冟斧喔∴箞',
+    parametersApi: '喔`副喔氞競喙夃腑喔∴腹喔ム笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤喙佮腑喔涏笧喔ム复喙�喔勦笂喔编笝',
+    parametersApiTip: '喔斷付喔囙笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤喔复喔權笧喔膏笗喔椸傅喙堗竵喙嵿覆喔笝喔斷竸喙堗覆喙勦抚喙� 喔`抚喔∴笘喔多竾喔娻阜喙堗腑喔曕副喔о箒喔涏福 喔娻阜喙堗腑喔熰复喔ム笖喙� 喔娻笝喔脆笖 喙佮弗喔班竸喙堗覆喙�喔`复喙堗浮喔曕箟喔� 喙傕笖喔⑧笚喔编箞喔о箘喔涏笀喔班箖喔娻箟喔箥喔侧斧喔`副喔氞箒喔笖喔囙笩喔脆弗喔斷箤喙�喔弗喙堗覆喔權傅喙夃箖喔權笩喔福喙屶浮喔福喔粪腑喔佮福喔竵喔勦箞喔侧箑喔`复喙堗浮喔曕箟喔權斧喔ム副喔囙笀喔侧竵喙傕斧喔ム笖喙勦竸喔ム箑喔箛喔權笗喙�',
+  },
+  develop: {
+    requestBody: '喙�喔權阜喙夃腑喔覆喔勦箥喔侧競喔�',
+    pathParams: '喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤喙�喔箟喔權笚喔侧竾',
+    query: '喔腑喔氞笘喔侧浮',
+    toc: '喙�喔權阜喙夃腑喔覆',
+  },
+}
+
+export default translation
diff --git a/i18n/th-TH/app-debug.ts b/i18n/th-TH/app-debug.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/th-TH/app-debug.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/th-TH/app-log.ts b/i18n/th-TH/app-log.ts
new file mode 100644
index 0000000..6501ce5
--- /dev/null
+++ b/i18n/th-TH/app-log.ts
@@ -0,0 +1,98 @@
+const translation = {
+  title: '喔氞副喔權笚喔多竵',
+  description: '喔氞副喔權笚喔多竵喔氞副喔權笚喔多竵喔笘喔侧笝喔班竵喔侧福喔椸箥喔侧竾喔侧笝喔傕腑喔囙箒喔笡喔炧弗喔脆箑喔勦笂喔编笝 喔`抚喔∴笘喔多竾喔佮覆喔`笡喙夃腑喔權競喙夃腑喔∴腹喔ム競喔竾喔溹腹喙夃箖喔娻箟喙佮弗喔班竵喔侧福喔曕腑喔氞竵喔ム副喔� AI',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: '喔副喔炧箑喔斷笚喙�喔о弗喔�',
+      time: '喙�喔о弗喔侧笚喔掂箞喔福喙夃覆喔�',
+      endUser: '喔溹腹喙夃箖喔娻箟喔涏弗喔侧涪喔椸覆喔囙斧喔`阜喔笟喔编笉喔娻傅',
+      input: '喔复喔權笧喔膏笗',
+      output: '喔溹弗喔脆笗喔犩副喔撪笐喙�',
+      summary: '喔娻阜喙堗腑喙�喔`阜喙堗腑喔�',
+      messageCount: '喔堗箥喔侧笝喔о笝喔傕箟喔竸喔о覆喔�',
+      userRate: '喔副喔曕福喔侧笢喔灌箟喙冟笂喙�',
+      adminRate: 'Op. 喔副喔曕福喔�',
+      startTime: '喙�喔о弗喔侧箑喔`复喙堗浮喔曕箟喔�',
+      status: '喔笘喔侧笝喔�',
+      runtime: '喙�喔о弗喔侧笚喙嵿覆喔囙覆喔�',
+      tokens: '喙傕笚 喙�喔勦箛喔�',
+      user: '喔溹腹喙夃箖喔娻箟喔涏弗喔侧涪喔椸覆喔囙斧喔`阜喔笟喔编笉喔娻傅',
+      version: '喙�喔о腑喔`箤喔娻副喔�',
+    },
+    pagination: {
+      previous: '喔佮箞喔笝喔笝喙夃覆',
+      next: '喔曕箞喔箘喔�',
+    },
+    empty: {
+      noChat: '喔⑧副喔囙箘喔∴箞喔∴傅喔佮覆喔`釜喔權笚喔權覆',
+      noOutput: '喙勦浮喙堗浮喔掂箑喔覆喔曕箤喔炧父喔�',
+      element: {
+        title: '喔∴傅喙冟竸喔`腑喔⑧腹喙堗笚喔掂箞喔權副喙堗笝喙勦斧喔�?',
+        content: '喔副喔囙箑喔佮笗喙佮弗喔班箖喔箞喔勦箥喔侧腑喔樴复喔氞覆喔⑧笡喔`赴喔佮腑喔氞竵喔侧福喙傕笗喙夃笗喔笟喔`赴喔抚喙堗覆喔囙笢喔灌箟喙冟笂喙夃笡喔ム覆喔⑧笚喔侧竾喙佮弗喔班箒喔笡喔炧弗喔脆箑喔勦笂喔编笝 AI 喔椸傅喙堗笝喔掂箞喙�喔炧阜喙堗腑喔涏福喔编笟喔涏福喔膏竾喔勦抚喔侧浮喙佮浮喙堗笝喔⑧箥喔侧競喔竾 AI 喔涪喙堗覆喔囙笗喙堗腑喙�喔權阜喙堗腑喔� 喔勦父喔撪釜喔侧浮喔侧福喔栢弗喔竾<shareLink>喙佮笂喔`箤</shareLink>喔福喔粪腑<testLink>喔椸笖喔腑喔氞箑喔о箛喔�</testLink>喙佮腑喔涏笖喙夃抚喔⑧笗喔编抚喔勦父喔撪箑喔竾 喙佮弗喙夃抚喔佮弗喔编笟喙勦笡喔椸傅喙堗斧喔權箟喔侧笝喔掂箟',
+      },
+    },
+  },
+  detail: {
+    time: '喙�喔о弗喔�',
+    conversationId: '喔`斧喔编釜喔佮覆喔`釜喔權笚喔權覆',
+    promptTemplate: '喙�喔椸浮喙�喔炧弗喔曕笧喔`箟喔浮喔椸箤',
+    promptTemplateBeforeChat: '喙�喔椸浮喙�喔炧弗喔曕笧喔`箟喔浮喔椸箤喔佮箞喔笝喙佮笂喔� 路 喙�喔涏箛喔權競喙夃腑喔勦抚喔侧浮喔傕腑喔囙福喔班笟喔�',
+    annotationTip: '喔佮覆喔`笡喔`副喔氞笡喔`父喔囙笚喔掂箞喔椸箥喔侧箑喔勦福喔粪箞喔竾喔浮喔侧涪喙傕笖喔� {{user}}',
+    second: 's',
+    tokenCost: '喙傕笚喙�喔勦箛喔權笚喔掂箞喙冟笂喙夃箘喔�',
+    loading: '喔佮覆喔`箓喔弗喔�',
+    operation: {
+      like: '喔娻腑喔�',
+      dislike: '喙勦浮喙堗笂喔笟',
+      addAnnotation: '喙�喔炧复喙堗浮喔佮覆喔`笡喔`副喔氞笡喔`父喔�',
+      editAnnotation: '喙佮竵喙夃箘喔傕竵喔侧福喔涏福喔编笟喔涏福喔膏竾',
+      annotationPlaceholder: '喔涏箟喔笝喔勦箥喔侧笗喔笟喔椸傅喙堗竸喔侧笖喔抚喔编竾喔椸傅喙堗竸喔膏笓喔曕箟喔竾喔佮覆喔`箖喔箟 AI 喔曕腑喔氞竵喔ム副喔� 喔嬥付喙堗竾喔覆喔∴覆喔`笘喙冟笂喙夃釜喙嵿覆喔福喔编笟喔佮覆喔`笡喔`副喔氞箒喔曕箞喔囙箓喔∴箑喔斷弗喙佮弗喔班竵喔侧福喔涏福喔编笟喔涏福喔膏竾喔勦父喔撪笭喔侧笧喔佮覆喔`釜喔`箟喔侧竾喔傕箟喔竸喔о覆喔∴腑喔⑧箞喔侧竾喔曕箞喔箑喔權阜喙堗腑喔囙箖喔權腑喔權覆喔勦笗',
+    },
+    variables: '喔曕副喔� 喙佮笡喔�',
+    uploadImages: '喔`腹喔涏笭喔侧笧喔椸傅喙堗腑喔编笡喙傕斧喔ム笖',
+    timeConsuming: '',
+    modelParams: '喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤喙佮笟喔氞笀喙嵿覆喔ム腑喔�',
+  },
+  filter: {
+    period: {
+      today: '喔о副喔權笝喔掂箟',
+      last7days: '7 喔о副喔權笚喔掂箞喔溹箞喔侧笝喔∴覆',
+      last4weeks: '4 喔副喔涏笖喔侧斧喙屶笚喔掂箞喔溹箞喔侧笝喔∴覆',
+      last3months: '3 喙�喔斷阜喔笝喔椸傅喙堗笢喙堗覆喔權浮喔�',
+      last12months: '12 喙�喔斷阜喔笝喔椸傅喙堗笢喙堗覆喔權浮喔�',
+      monthToDate: '喙�喔斷阜喔笝喔堗笝喔栢付喔囙笡喔编笀喔堗父喔氞副喔�',
+      quarterToDate: '喙勦笗喔`浮喔侧釜喔堗笝喔栢付喔囙笡喔编笀喔堗父喔氞副喔�',
+      yearToDate: '喔涏傅喔堗笝喔栢付喔囙笡喔编笀喔堗父喔氞副喔�',
+      allTime: '喔曕弗喔笖喙�喔о弗喔�',
+    },
+    annotation: {
+      all: '喔椸副喙夃竾喔浮喔�',
+      annotated: '喔佮覆喔`笡喔`副喔氞笡喔`父喔囙笚喔掂箞喔∴傅喔勦箥喔侧腑喔樴复喔氞覆喔⑧笡喔`赴喔佮腑喔� ({{count}} 喔`覆喔⑧竵喔侧福)',
+      not_annotated: '喙勦浮喙堗浮喔掂竸喙嵿覆喔笜喔脆笟喔侧涪喔涏福喔班竵喔笟',
+    },
+    sortBy: '喙�喔∴阜喔竾喔傅喔斷箥喔�:',
+    descending: '喔堗覆喔佮浮喔侧竵喙勦笡喔覆喔權箟喔涪',
+    ascending: '喔堗覆喔佮笝喙夃腑喔⑧箘喔涏浮喔侧竵',
+  },
+  workflowTitle: '喔氞副喔權笚喔多竵喙�喔о复喔`箤喔佮箓喔熰弗喔о箤',
+  workflowSubtitle: '喔氞副喔權笚喔多竵喔氞副喔權笚喔多竵喔佮覆喔`笚喙嵿覆喔囙覆喔權競喔竾 Automate',
+  runDetail: {
+    title: '喔氞副喔權笚喔多竵喔佮覆喔`釜喔權笚喔權覆',
+    workflowTitle: '喔`覆喔⑧弗喔班箑喔傅喔⑧笖喔氞副喔權笚喔多竵',
+    fileListDetail: '喔`覆喔⑧弗喔班箑喔傅喔⑧笖',
+    fileListLabel: '喔`覆喔⑧弗喔班箑喔傅喔⑧笖喙勦笩喔ム箤',
+  },
+  promptLog: '喔氞副喔權笚喔多竵喔炧福喙夃腑喔∴笚喙�',
+  agentLog: '喔氞副喔權笚喔多竵喔曕副喔о箒喔椸笝',
+  viewLog: '喔斷腹喔氞副喔權笚喔多竵',
+  agentLogDetail: {
+    agentMode: '喙傕斧喔∴笖喔曕副喔о箒喔椸笝',
+    toolUsed: '喙�喔勦福喔粪箞喔竾喔∴阜喔笚喔掂箞喙冟笂喙�',
+    iterations: '喙�喔佮复喔� 喔嬥箟喔�',
+    iteration: '喙�喔佮复喔� 喔嬥箟喔�',
+    finalProcessing: '喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム競喔编箟喔權釜喔膏笖喔椸箟喔侧涪',
+  },
+}
+
+export default translation
diff --git a/i18n/th-TH/app-overview.ts b/i18n/th-TH/app-overview.ts
new file mode 100644
index 0000000..92b002e
--- /dev/null
+++ b/i18n/th-TH/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: '喙冟笝喔佮覆喔`箑喔`复喙堗浮喔曕箟喔�',
+    enterKeyTip: '喔涏箟喔笝喔勦傅喔⑧箤 OpenAI API 喔傕腑喔囙竸喔膏笓喔斷箟喔侧笝喔ム箞喔侧竾',
+    getKeyTip: '喔`副喔氞竸喔掂涪喙� API 喔傕腑喔囙竸喔膏笓喔堗覆喔佮箒喔斷笂喔氞腑喔`箤喔� OpenAI',
+    placeholder: '喔勦傅喔⑧箤 API OpenAI 喔傕腑喔囙竸喔膏笓 (喙�喔娻箞喔� sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: '喔勦父喔撪竵喙嵿覆喔ム副喔囙箖喔娻箟喙傕竸喔о笗喙夃覆喔椸笖喔ム腑喔囙箖喔娻箟 {{providerName}}',
+        description: '喙傕竸喔о笗喙夃覆喔椸笖喔ム腑喔囙箖喔娻箟喔∴傅喙勦抚喙夃箑喔炧阜喙堗腑喔о副喔曕笘喔膏笡喔`赴喔竾喔勦箤喙冟笝喔佮覆喔`笚喔斷釜喔笟喔傕腑喔囙竸喔膏笓 喔佮箞喔笝喔椸傅喙堗箓喔勦抚喔曕箟喔侧笚喔斷弗喔竾喙冟笂喙夃笀喔班斧喔∴笖 喙傕笡喔`笖喔曕副喙夃竾喔勦箞喔侧笢喔灌箟喙冟斧喙夃笟喔`复喔佮覆喔`箓喔∴箑喔斷弗喔傕腑喔囙竸喔膏笓喙�喔竾喔福喔粪腑喔嬥阜喙夃腑喙傕竸喔о笗喙夃覆喙�喔炧复喙堗浮喙�喔曕复喔�',
+      },
+      exhausted: {
+        title: '喙傕竸喔о笗喙夃覆喔椸笖喔ム腑喔囙箖喔娻箟喔傕腑喔囙竸喔膏笓喔浮喔斷箒喔ム箟喔� 喙傕笡喔`笖喔曕副喙夃竾喔勦箞喔� APIKey 喔傕腑喔囙竸喔膏笓',
+        description: '喔勦父喔撪箖喔娻箟喙傕竸喔о笗喙夃覆喔椸笖喔ム腑喔囙箖喔娻箟喔浮喔斷箒喔ム箟喔� 喙傕笡喔`笖喔曕副喙夃竾喔勦箞喔侧笢喔灌箟喙冟斧喙夃笟喔`复喔佮覆喔`箓喔∴箑喔斷弗喔傕腑喔囙竸喔膏笓喙�喔竾喔福喔粪腑喔嬥阜喙夃腑喙傕竸喔о笗喙夃覆喙�喔炧复喙堗浮喙�喔曕复喔�',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: '喙冟笝喔佮覆喔`箑喔`复喙堗浮喔曕箟喔�',
+        row2: '喔曕副喙夃竾喔勦箞喔侧笢喔灌箟喙冟斧喙夃笟喔`复喔佮覆喔`箓喔∴箑喔斷弗喔傕腑喔囙竸喔膏笓喔佮箞喔笝',
+      },
+    },
+    callTimes: '喙�喔о弗喔侧箓喔椸福',
+    usedToken: '喙傕笚喙�喔勦箛喔權笚喔掂箞喙冟笂喙�',
+    setAPIBtn: '喙勦笡喔椸傅喙堗笢喔灌箟喙冟斧喙夃笟喔`复喔佮覆喔`箓喔∴箑喔斷弗喔佮覆喔`笗喔编箟喔囙竸喙堗覆',
+    tryCloud: '喔福喔粪腑喔ム腑喔囙箖喔娻箟 Dify 喙�喔о腑喔`箤喔娻副喔權竸喔ム覆喔о笖喙屶笧喔`箟喔浮喙冟笟喙�喔笝喔福喔侧竸喔侧笩喔`傅',
+  },
+  overview: {
+    title: '喔犩覆喔炧福喔о浮',
+    appInfo: {
+      explanation: 'AI WebApp 喔炧福喙夃腑喔∴箖喔娻箟喔囙覆喔�',
+      accessibleAddress: 'URL 喔覆喔樴覆喔`笓喔�',
+      preview: '喔斷腹喔曕副喔о腑喔⑧箞喔侧竾',
+      regenerate: '喔福喙夃覆喔囙箖喔浮喙�',
+      regenerateNotice: '喔勦父喔撪笗喙夃腑喔囙竵喔侧福喔福喙夃覆喔� URL 喔覆喔樴覆喔`笓喔班箖喔浮喙堗斧喔`阜喔箘喔∴箞',
+      preUseReminder: '喙傕笡喔`笖喙�喔涏复喔斷箖喔娻箟喔囙覆喔� WebApp 喔佮箞喔笝喔斷箥喔侧箑喔權复喔權竵喔侧福喔曕箞喔�',
+      settings: {
+        entry: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆',
+        title: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喙�喔о箛喔氞箒喔笡',
+        webName: '喔娻阜喙堗腑喙�喔о箛喔氞箒喔笡',
+        webDesc: '喔勦箥喔侧腑喔樴复喔氞覆喔� WebApp',
+        webDescTip: '喔傕箟喔竸喔о覆喔∴笝喔掂箟喔堗赴喙佮釜喔斷竾喔椸傅喙堗笣喔编箞喔囙箘喔勦弗喙�喔箛喔權笗喙� 喙傕笖喔⑧箖喔箟喔勦箥喔侧箒喔權赴喔權箥喔侧笧喔粪箟喔權笎喔侧笝喙�喔佮傅喙堗涪喔о竵喔编笟喔о复喔樴傅喔佮覆喔`箖喔娻箟喙佮腑喔涏笧喔ム复喙�喔勦笂喔编笝',
+        webDescPlaceholder: '喔涏箟喔笝喔勦箥喔侧腑喔樴复喔氞覆喔⑧競喔竾 WebApp',
+        language: '喔犩覆喔┼覆',
+        workflow: {
+          title: '喙�喔о复喔`箤喔佮箓喔熰弗喔о箤',
+          subTitle: '喔`覆喔⑧弗喔班箑喔傅喔⑧笖喙�喔о复喔`箤喔佮箓喔熰弗喔о箤',
+          show: '喙佮釜喔斷竾',
+          hide: '喔嬥箞喔笝',
+          showDesc: '喙佮釜喔斷竾喔福喔粪腑喔嬥箞喔笝喔`覆喔⑧弗喔班箑喔傅喔⑧笖喙�喔о复喔`箤喔佮箓喔熰弗喔о箤喙冟笝 WebApp',
+        },
+        chatColorTheme: '喔樴傅喔∴釜喔掂箒喔娻笚',
+        chatColorThemeDesc: '喔佮箥喔侧斧喔權笖喔樴傅喔∴釜喔掂競喔竾喙佮笂喔椸笟喔笚',
+        chatColorThemeInverted: '喔勦抚喙堗赋',
+        invalidHexMessage: '喔勦箞喔侧笎喔侧笝喔复喔氞斧喔佮箘喔∴箞喔栢腹喔佮笗喙夃腑喔�',
+        invalidPrivacyPolicy: '喔ム复喔囙竵喙屶笝喙傕涪喔氞覆喔⑧竸喔о覆喔∴箑喔涏箛喔權釜喙堗抚喔權笗喔编抚喙勦浮喙堗笘喔灌竵喔曕箟喔竾 喙傕笡喔`笖喙冟笂喙夃弗喔脆竾喔佮箤喔椸傅喙堗笘喔灌竵喔曕箟喔竾喔傕付喙夃笝喔曕箟喔權笖喙夃抚喔� http 喔福喔粪腑 https',
+        sso: {
+          label: '喔佮覆喔`福喔编笟喔`腑喔囙竸喔о覆喔∴笘喔灌竵喔曕箟喔竾喔傕腑喔� SSO',
+          title: '喙�喔о箛喔氞箒喔笡 SSO',
+          description: '喔溹腹喙夃箖喔娻箟喔椸父喔佮竸喔權笗喙夃腑喔囙箑喔傕箟喔侧釜喔灌箞喔`赴喔氞笟喔斷箟喔о涪 SSO 喔佮箞喔笝喙冟笂喙� WebApp',
+          tooltip: '喔曕复喔斷笗喙堗腑喔溹腹喙夃笖喔灌箒喔ム福喔班笟喔氞箑喔炧阜喙堗腑喙�喔涏复喔斷箖喔娻箟 WebApp SSO',
+        },
+        more: {
+          entry: '喙佮釜喔斷竾喔佮覆喔`笗喔编箟喔囙竸喙堗覆喙�喔炧复喙堗浮喙�喔曕复喔�',
+          copyright: '喔ム复喔傕釜喔脆笚喔樴复喙�',
+          copyRightPlaceholder: '喔涏箟喔笝喔娻阜喙堗腑喔溹腹喙夃箑喔傕傅喔⑧笝喔福喔粪腑喔竾喔勦箤喔佮福',
+          privacyPolicy: '喔權箓喔⑧笟喔侧涪喔勦抚喔侧浮喙�喔涏箛喔權釜喙堗抚喔權笗喔编抚',
+          privacyPolicyPlaceholder: '喔涏箟喔笝喔ム复喔囙竵喙屶笝喙傕涪喔氞覆喔⑧竸喔о覆喔∴箑喔涏箛喔權釜喙堗抚喔權笗喔编抚',
+          privacyPolicyTip: '喔娻箞喔о涪喙冟斧喙夃笢喔灌箟喙�喔⑧傅喙堗涪喔∴笂喔∴箑喔傕箟喔侧箖喔堗競喙夃腑喔∴腹喔ム笚喔掂箞喙佮腑喔涏笧喔ム复喙�喔勦笂喔编笝喔`抚喔氞福喔о浮 喙傕笡喔`笖喔斷腹喔權箓喔⑧笟喔侧涪<privacyPolicyLink>喔勦抚喔侧浮喙�喔涏箛喔權釜喙堗抚喔權笗喔编抚</privacyPolicyLink>喔傕腑喔� Dify',
+          customDisclaimer: '喔傕箟喔笀喙嵿覆喔佮副喔斷竸喔о覆喔∴福喔编笟喔溹复喔斷笂喔笟喔椸傅喙堗竵喙嵿覆喔笝喔斷箑喔竾',
+          customDisclaimerPlaceholder: '喔涏箟喔笝喔傕箟喔竸喔о覆喔∴競喙夃腑喔堗箥喔侧竵喔编笖喔勦抚喔侧浮喔`副喔氞笢喔脆笖喔娻腑喔氞笚喔掂箞喔佮箥喔侧斧喔權笖喙�喔竾',
+          customDisclaimerTip: '喔傕箟喔竸喔о覆喔∴笡喔忇复喙�喔笜喔勦抚喔侧浮喔`副喔氞笢喔脆笖喔娻腑喔氞笚喔掂箞喔佮箥喔侧斧喔權笖喙�喔竾喔堗赴喙佮釜喔斷竾喔椸傅喙堗笣喔编箞喔囙箘喔勦弗喙�喔箛喔權笗喙� 喙傕笖喔⑧箖喔箟喔傕箟喔浮喔灌弗喙�喔炧复喙堗浮喙�喔曕复喔∴箑喔佮傅喙堗涪喔о竵喔编笟喙佮腑喔涏笧喔ム复喙�喔勦笂喔编笝',
+          copyrightTip: '喙佮釜喔斷竾喔傕箟喔浮喔灌弗喔ム复喔傕釜喔脆笚喔樴复喙屶箖喔權箑喔о箛喔氞箒喔笡',
+          copyrightTooltip: '喙傕笡喔`笖喔副喔涏箑喔佮福喔斷箑喔涏箛喔權箒喔溹笝 Professional 喔福喔粪腑喔腹喔囙竵喔о箞喔�',
+        },
+        modalTip: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喙�喔о箛喔氞箒喔笡喔澿副喙堗竾喙勦竸喔ム箑喔箛喔權笗喙�',
+      },
+      embedded: {
+        entry: '喔澿副喔� 喔曕副喔�',
+        title: '喔澿副喔囙笟喔權箑喔о箛喔氞箘喔嬥笗喙�',
+        explanation: '喙�喔ム阜喔竵喔о复喔樴傅喔澿副喔囙箒喔笡喙佮笂喔椸弗喔囙箖喔權箑喔о箛喔氞箘喔嬥笗喙屶競喔竾喔勦父喔�',
+        iframe: '喔覆喔佮笗喙夃腑喔囙竵喔侧福喙�喔炧复喙堗浮喙佮腑喔涏箒喔娻笚喔椸傅喙堗箖喔斷竵喙囙箘喔斷箟喔氞笝喙�喔о箛喔氞箘喔嬥笗喙屶競喔竾喔勦父喔� 喙冟斧喙夃箑喔炧复喙堗浮 iframe 喔權傅喙夃弗喔囙箖喔權箓喔勦箟喔� html 喔傕腑喔囙竸喔膏笓',
+        scripts: '喔覆喔佮笗喙夃腑喔囙竵喔侧福喙�喔炧复喙堗浮喙佮腑喔涏箒喔娻笚喔椸傅喙堗笖喙夃覆喔權競喔о覆喔ム箞喔侧竾喔傕腑喔囙箑喔о箛喔氞箘喔嬥笗喙� 喙冟斧喙夃箑喔炧复喙堗浮喙傕竸喙夃笖喔權傅喙夃弗喔囙箖喔� html 喔傕腑喔囙竸喔膏笓',
+        chromePlugin: '喔曕复喔斷笗喔编箟喔囙釜喙堗抚喔權競喔⑧覆喔� Dify Chatbot Chrome',
+        copied: '喔勦副喔� 喔ム腑喔�',
+        copy: '喔ム腑喔�',
+      },
+      qrcode: {
+        title: '喙�喔娻阜喙堗腑喔∴箓喔⑧竾喔`斧喔编釜 QR',
+        scan: '喔箒喔佮笝喙�喔炧阜喙堗腑喙佮笟喙堗竾喔涏副喔�',
+        download: '喔斷覆喔о笝喙屶箓喔弗喔� QR Code',
+      },
+      customize: {
+        way: '喔о复喔樴傅',
+        entry: '喔涏福喔编笟喙佮笗喙堗竾',
+        title: '喔涏福喔编笟喙佮笗喙堗竾 AI WebApp',
+        explanation: '喔勦父喔撪釜喔侧浮喔侧福喔栢笡喔`副喔氞箒喔曕箞喔囙釜喙堗抚喔權斧喔權箟喔侧競喔竾 Web App 喙冟斧喙夃箑喔浮喔侧赴喔佮副喔氞釜喔栢覆喔權竵喔侧福喔撪箤喙佮弗喔班竸喔о覆喔∴笗喙夃腑喔囙竵喔侧福喔箘喔曕弗喙屶競喔竾喔勦父喔撪箘喔斷箟',
+        way1: {
+          name: '喙佮涪喔佮福喔副喔箘喔勦弗喙�喔箛喔權笗喙� 喙佮竵喙夃箘喔� 喙佮弗喔班笡喔`副喔氞箖喔娻箟喔佮副喔� Vercel (喙佮笝喔班笝喙嵿覆)',
+          step1: '喙佮涪喔佮福喔副喔箘喔勦弗喙�喔箛喔權笗喙屶箒喔ム赴喙佮竵喙夃箘喔�',
+          step1Tip: '喔勦弗喔脆竵喔椸傅喙堗笝喔掂箞喙�喔炧阜喙堗腑喙佮涪喔佮笅喔福喙屶釜喙傕竸喙夃笖喔ム竾喙冟笝喔氞副喔嵿笂喔� GitHub 喔傕腑喔囙竸喔膏笓喙佮弗喔班箒喔佮箟喙勦競喙傕竸喙夃笖',
+          step1Operation: 'Dify-Web 喙勦竸喔ム箑喔箛喔權笗喙�',
+          step2: '喔涏福喔编笟喙冟笂喙夃竵喔编笟 Vercel',
+          step2Tip: '喔勦弗喔脆竵喔椸傅喙堗笝喔掂箞喙�喔炧阜喙堗腑喔權箥喔侧箑喔傕箟喔侧笚喔掂箞喙�喔佮箛喔氞箘喔涏涪喔编竾 Vercel 喙佮弗喔班笡喔`副喔氞箖喔娻箟',
+          step2Operation: '喔權箥喔侧箑喔傕箟喔侧笚喔掂箞喙�喔佮箛喔氞競喙夃腑喔∴腹喔�',
+          step3: '喔佮箥喔侧斧喔權笖喔勦箞喔侧笗喔编抚喙佮笡喔`釜喔犩覆喔炧箒喔о笖喔ム箟喔浮',
+          step3Tip: '喙�喔炧复喙堗浮喔曕副喔о箒喔涏福喔笭喔侧笧喙佮抚喔斷弗喙夃腑喔∴笗喙堗腑喙勦笡喔權傅喙夃箖喔� Vercel',
+        },
+        way2: {
+          name: '喙�喔傕傅喔⑧笝喙傕竸喙夃笖喔澿副喙堗竾喙勦竸喔ム箑喔箛喔權笗喙屶箑喔炧阜喙堗腑喙�喔`傅喔⑧竵喙冟笂喙� API 喙佮弗喔班笡喔`副喔氞箖喔娻箟喔佮副喔氞箑喔嬥复喔`箤喔熰箑喔о腑喔`箤',
+          operation: '喙�喔竵喔覆喔�',
+        },
+      },
+      launch: '喙�喔`阜喔涪喔權笗喙�',
+    },
+    apiInfo: {
+      title: 'API 喔氞福喔脆竵喔侧福喙佮笟喙囙竵喙�喔笝喔斷箤',
+      explanation: '喔溹釜喔侧笝喔`抚喔∴箑喔傕箟喔侧竵喔编笟喙佮腑喔涏笧喔ム复喙�喔勦笂喔编笝喔傕腑喔囙竸喔膏笓喙勦笖喙夃腑喔⑧箞喔侧竾喔囙箞喔侧涪喔斷覆喔�',
+      accessibleAddress: '喔涏弗喔侧涪喔椸覆喔� API 喔氞福喔脆竵喔侧福',
+      doc: '喔佮覆喔`腑喙夃覆喔囙腑喔脆竾 API',
+    },
+    status: {
+      running: '喙冟斧喙夃笟喔`复喔佮覆喔�',
+      disable: '喔炧复喔佮覆喔�',
+    },
+  },
+  analysis: {
+    title: '喔佮覆喔`抚喔脆箑喔勦福喔侧赴喔箤',
+    ms: '喔權覆喔囙釜喔侧抚',
+    tokenPS: '喙傕笚喙�喔勦箛喔�/喔о复喔權覆喔椸傅',
+    totalMessages: {
+      title: '喔傕箟喔竸喔о覆喔∴笚喔编箟喔囙斧喔∴笖',
+      explanation: '喔佮覆喔`箓喔曕箟喔曕腑喔� AI 喔`覆喔⑧抚喔编笝喔權副喔�',
+    },
+    totalConversations: {
+      title: '喔佮覆喔`釜喔權笚喔權覆喔椸副喙夃竾喔浮喔�',
+      explanation: '喔佮覆喔`釜喔權笚喔權覆 AI 喔`覆喔⑧抚喔编笝喔權副喔� 喙勦浮喙堗福喔о浮喔о复喔ㄠ抚喔佮福喔`浮/喔斷傅喔氞副喔佮笧喔`箟喔浮喔椸箤',
+    },
+    activeUsers: {
+      title: '喔溹腹喙夃箖喔娻箟喔椸傅喙堗箖喔娻箟喔囙覆喔權腑喔⑧腹喙�',
+      explanation: '喔溹腹喙夃箖喔娻箟喔椸傅喙堗箘喔∴箞喔嬥箟喙嵿覆喔佮副喔權浮喔掂釜喙堗抚喔權福喙堗抚喔∴箖喔權竵喔侧福喔栢覆喔∴笗喔笟喔佮副喔� AI 喙勦浮喙堗福喔о浮喔о复喔ㄠ抚喔佮福喔`浮/喔斷傅喔氞副喔佮笧喔`箟喔浮喔椸箤',
+    },
+    tokenUsage: {
+      title: '喔佮覆喔`箖喔娻箟喙傕笚喙�喔勦箛喔�',
+      explanation: '喔赴喔椸箟喔笝喔栢付喔囙竵喔侧福喙冟笂喙夃箓喔椸箑喔勦箛喔權福喔侧涪喔о副喔權競喔竾喙傕浮喙�喔斷弗喔犩覆喔┼覆喔箥喔侧斧喔`副喔氞箒喔笡喔炧弗喔脆箑喔勦笂喔编笝 喔嬥付喙堗竾喔∴傅喔涏福喔班箓喔⑧笂喔權箤喔箥喔侧斧喔`副喔氞抚喔编笗喔栢父喔涏福喔班釜喔囙竸喙屶箖喔權竵喔侧福喔勦抚喔氞竸喔膏浮喔曕箟喔權笚喔膏笝',
+      consumed: '喙冟笂喙�',
+    },
+    avgSessionInteractions: {
+      title: '喔佮覆喔`箓喔曕箟喔曕腑喔氞箑喔嬥釜喔娻副喔權箓喔斷涪喙�喔夃弗喔掂箞喔�',
+      explanation: '喔堗箥喔侧笝喔о笝喔佮覆喔`釜喔粪箞喔釜喔侧福喔`赴喔抚喙堗覆喔囙笢喔灌箟喙冟笂喙夃箒喔ム赴 AI 喔涪喙堗覆喔囙笗喙堗腑喙�喔權阜喙堗腑喔� 喔箥喔侧斧喔`副喔氞箒喔笡喔椸傅喙堗箖喔娻箟喔佮覆喔`釜喔權笚喔權覆',
+    },
+    avgUserInteractions: {
+      title: '喔佮覆喔`箓喔曕箟喔曕腑喔氞競喔竾喔溹腹喙夃箖喔娻箟喙傕笖喔⑧箑喔夃弗喔掂箞喔�',
+      explanation: '喔赴喔椸箟喔笝喔栢付喔囙竸喔о覆喔∴笘喔掂箞喙冟笝喔佮覆喔`箖喔娻箟喔囙覆喔權福喔侧涪喔о副喔權競喔竾喔溹腹喙夃箖喔娻箟 喙�喔∴笗喔`复喔佮笝喔掂箟喔赴喔椸箟喔笝喔栢付喔囙竸喔о覆喔∴箑喔笝喔掂涪喔о箒喔權箞喔權競喔竾喔溹腹喙夃箖喔娻箟',
+    },
+    userSatisfactionRate: {
+      title: '喔副喔曕福喔侧竸喔о覆喔∴笧喔多竾喔炧腑喙冟笀喔傕腑喔囙笢喔灌箟喙冟笂喙�',
+      explanation: '喔堗箥喔侧笝喔о笝喙勦弗喔勦箤喔曕箞喔� 1,000 喔傕箟喔竸喔о覆喔� 喔复喙堗竾喔權傅喙夃笟喙堗竾喔娻傅喙夃笘喔多竾喔副喔斷釜喙堗抚喔權競喔竾喔勦箥喔侧笗喔笟喔椸傅喙堗笢喔灌箟喙冟笂喙夃笧喔多竾喔炧腑喙冟笀喔涪喙堗覆喔囙浮喔侧竵',
+    },
+    avgResponseTime: {
+      title: '喙�喔о弗喔侧笗喔笟喔笝喔竾喙�喔夃弗喔掂箞喔�',
+      explanation: '喙�喔о弗喔� (喔∴复喔ム弗喔脆抚喔脆笝喔侧笚喔�) 喔箥喔侧斧喔`副喔� AI 喙冟笝喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔�/喔曕腑喔氞釜喔權腑喔� 喔箥喔侧斧喔`副喔氞箒喔笡喔椸傅喙堗箖喔娻箟喔傕箟喔竸喔о覆喔�',
+    },
+    tps: {
+      title: '喔勦抚喔侧浮喙�喔`箛喔о箖喔權竵喔侧福喔箞喔囙腑喔竵喙傕笚喙�喔勦箛喔�',
+      explanation: '喔о副喔斷笡喔`赴喔复喔椸笜喔脆笭喔侧笧喔傕腑喔� LLM 喔權副喔氞竸喔о覆喔∴箑喔`箛喔о箖喔權竵喔侧福喔箞喔囙腑喔竵喙傕笚喙�喔勦箛喔權競喔竾 LLM 喔曕副喙夃竾喙佮笗喙堗箑喔`复喙堗浮喔曕箟喔權竸喙嵿覆喔傕腑喔堗笝喔栢付喔囙箑喔福喙囙笀喔复喙夃笝喙�喔覆喔曕箤喔炧父喔�',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/th-TH/app.ts b/i18n/th-TH/app.ts
new file mode 100644
index 0000000..b58812b
--- /dev/null
+++ b/i18n/th-TH/app.ts
@@ -0,0 +1,210 @@
+const translation = {
+  createApp: '喔福喙夃覆喔囙箓喔涏福喙�喔堗竵喔曕箤喙冟斧喔∴箞',
+  types: {
+    all: '喔椸副喙夃竾喔浮喔�',
+    chatbot: '喙佮笂喔椸笟喔笚',
+    agent: '喔曕副喔о箒喔椸笝',
+    workflow: '喔佮福喔班笟喔о笝喔佮覆喔`笚喔赤竾喔侧笝',
+    completion: '喙�喔福喙囙笀喔浮喔氞腹喔`笓喙�',
+    basic: '喔炧阜喙夃笝喔愢覆喔�',
+    advanced: '喙佮笂喔椸箓喔熰弗喔о箤',
+  },
+  duplicate: '喔赋喙�喔權覆',
+  duplicateTitle: '喔娻阜喙堗腑喔嬥箟喔�',
+  export: '喔箞喔囙腑喔竵 DSL',
+  exportFailed: '喔箞喔囙腑喔竵 DSL 喔ム箟喔∴箑喔弗喔�',
+  importDSL: '喔權箥喔侧箑喔傕箟喔侧箘喔熰弗喙� DSL',
+  createFromConfigFile: '喔福喙夃覆喔囙笀喔侧竵喙勦笩喔ム箤 DSL',
+  importFromDSL: '喔權箥喔侧箑喔傕箟喔侧笀喔侧竵 DSL',
+  importFromDSLFile: '喔堗覆喔佮箘喔熰弗喙� DSL',
+  importFromDSLUrl: '喔堗覆喔� URL',
+  importFromDSLUrlPlaceholder: '喔о覆喔囙弗喔脆竾喔勦箤 DSL 喔椸傅喙堗笝喔掂箞',
+  deleteAppConfirmTitle: '喔ム笟喙傕笡喔`箑喔堗竵喔曕箤喔權傅喙�?',
+  deleteAppConfirmContent: '喔佮覆喔`弗喔氞箓喔涏福喙�喔堗竵喔權副喙夃笝喙勦浮喙堗釜喔侧浮喔侧福喔栢涪喙夃腑喔權竵喔ム副喔氞箘喔斷箟 喔溹腹喙夃箖喔娻箟喔堗赴喙勦浮喙堗釜喔侧浮喔侧福喔栢箑喔傕箟喔侧笘喔多竾喙傕笡喔`箑喔堗竵喔曕箤喔傕腑喔囙竸喔膏笓喔傅喔佮笗喙堗腑喙勦笡 喙佮弗喔班竵喔侧福喔佮箥喔侧斧喔權笖喔勦箞喔侧笗喙堗覆喔囙箚喙佮弗喔班笟喔编笝喔椸付喔佮笚喔编箟喔囙斧喔∴笖喔堗赴喔栢腹喔佮弗喔氞腑喔⑧箞喔侧竾喔栢覆喔о福',
+  appDeleted: '喙傕笡喔`箑喔堗竵喔曕箤喔栢腹喔佮弗喔�',
+  appDeleteFailed: '喔ム笟喙傕笡喔`箑喔堗竵喔曕箤喙勦浮喙堗釜喙嵿覆喙�喔`箛喔�',
+  join: '喙�喔傕箟喔侧福喙堗抚喔∴笂喔膏浮喔娻笝喔權副喔佮笧喔编笒喔權覆',
+  communityIntro: '喔炧腹喔斷竸喔膏涪喔佮副喔氞釜喔∴覆喔娻复喔佮箖喔權笚喔掂浮 喔溹腹喙夃福喙堗抚喔∴箖喔箟喔傕箟喔浮喔灌弗 喙佮弗喔班笝喔编竵喔炧副喔掄笝喔侧箖喔權笂喙堗腑喔囙笚喔侧竾喔曕箞喔侧竾喙�',
+  roadmap: '喔斷腹喙佮笢喔權竾喔侧笝喔傕腑喔囙箑喔`覆',
+  newApp: {
+    startFromBlank: '喔福喙夃覆喔囙箓喔涏福喙�喔堗竵喔曕箤喔涏弗喙堗覆喔�',
+    startFromTemplate: '喔福喙夃覆喔囙笀喔侧竵喙�喔椸浮喙�喔炧弗喔�',
+    captionAppType: '喔勦父喔撪笗喙夃腑喔囙竵喔侧福喔福喙夃覆喔囙箓喔涏福喙�喔堗竵喔曕箤喔涏福喔班箑喔犩笚喙冟笖',
+    chatbotDescription: '喔福喙夃覆喔囙箓喔涏福喙�喔堗竵喔曕箤喙�喔涏箛喔權箒喔笡喔炧弗喔脆箑喔勦笂喔编笝喔椸傅喙堗箖喔娻箟喔佮覆喔`箒喔娻笚 喙傕笡喔`箑喔堗竵喔曕箤喔權傅喙夃箖喔娻箟喔`腹喔涏箒喔氞笟喔勦箥喔侧笘喔侧浮喙佮弗喔班竸喙嵿覆喔曕腑喔� 喔椸箥喔侧箖喔箟喔覆喔∴覆喔`笘喔笝喔椸笝喔侧笗喙堗腑喙�喔權阜喙堗腑喔囙箘喔斷箟喔弗喔侧涪喔`腑喔�(Multi-turn)',
+    completionDescription: '喔福喙夃覆喔囙箓喔涏福喙�喔堗竵喔曕箤喙�喔涏箛喔權箒喔笡喔炧弗喔脆箑喔勦笂喔编笝喔椸傅喙堗釜喔`箟喔侧竾喔傕箟喔竸喔о覆喔∴竸喔膏笓喔犩覆喔炧釜喔灌竾喔曕覆喔∴競喙夃腑喔勦抚喔侧浮喙佮笀喙夃竾 喙�喔娻箞喔� 喔佮覆喔`釜喔`箟喔侧竾喔氞笚喔勦抚喔侧浮 喔福喔膏笡 喔佮覆喔`箒喔涏弗 喙佮弗喔班腑喔粪箞喔權箚',
+    completionWarning: '喙傕笡喔`箑喔堗竵喔曕箤喔涏福喔班箑喔犩笚喔權傅喙夃笀喔班箘喔∴箞喔`腑喔囙福喔编笟喔傅喔佮笗喙堗腑喙勦笡',
+    agentDescription: '喔福喙夃覆喔囙笗喔编抚喙佮笚喔�(Agent)喔副喔堗笁喔`复喔⑧赴喔椸傅喙堗釜喔侧浮喔侧福喔栢箑喔ム阜喔竵喙�喔勦福喔粪箞喔竾喔∴阜喔箑喔炧阜喙堗腑喔椸箥喔侧竾喔侧笝喙冟斧喙夃箑喔福喙囙笀喙勦笖喙夃箓喔斷涪喔副喔曕箓喔權浮喔编笗喔�',
+    workflowDescription: '喔福喙夃覆喔囙箓喔涏福喙�喔堗竵喔曕箤 喙�喔涏箛喔權箒喔笡喔炧弗喔脆箑喔勦笂喔编笝喔椸傅喙堗釜喔`箟喔侧竾喔傕箟喔竸喔о覆喔∴竸喔膏笓喔犩覆喔炧釜喔灌竾喔曕覆喔∴竵喔侧福喔涏福喔班釜喔侧笝喔佮福喔班笟喔о笝喔佮覆喔`笚喔赤竾喔侧笝(Workflow) 喔椸傅喙堗浮喔掂竵喔侧福喔涏福喔编笟喙佮笗喙堗竾喙冟笝喔`赴喔斷副喔氞釜喔灌竾 喙�喔浮喔侧赴喔箥喔侧斧喔`副喔氞笢喔灌箟喙冟笂喙夃笚喔掂箞喔∴傅喔涏福喔班釜喔氞竵喔侧福喔撪箤',
+    workflowWarning: '喔傕笓喔班笝喔掂箟喔涪喔灌箞喙冟笝喔娻箞喔о竾喙�喔氞笗喙夃覆',
+    chatbotType: '喔`腹喔涏箒喔氞笟喙佮笂喔椸笟喔笚',
+    basic: '喔炧阜喙夃笝喔愢覆喔�',
+    basicTip: '喔箥喔侧斧喔`副喔氞笢喔灌箟喙�喔`复喙堗浮喔曕箟喔權釜喔侧浮喔侧福喔栢箑喔涏弗喔掂箞喔⑧笝喙勦笡喙冟笂喙� Chatflow 喙勦笖喙夃箖喔權笭喔侧涪喔弗喔编竾',
+    basicFor: '喔箥喔侧斧喔`副喔氞笢喔灌箟喙�喔`复喙堗浮喔曕箟喔�',
+    basicDescription: 'Basic Orchestrate 喔娻箞喔о涪喙冟斧喙夃釜喔侧浮喔侧福喔栢笡喔`赴喔覆喔權竾喔侧笝喔佮副喔權競喔竾 喙傕笡喔`箑喔堗竵喔曕箤喙佮笂喔椸笟喔笚喙傕笖喔⑧箖喔娻箟喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔囙箞喔侧涪喙� 喙傕笖喔⑧箘喔∴箞喔覆喔∴覆喔`笘喙佮竵喙夃箘喔傕競喙夃腑喔勦抚喔侧浮喙佮笀喙夃竾喙冟笝喔曕副喔о箘喔斷箟 喙�喔浮喔侧赴喔箥喔侧斧喔`副喔氞笢喔灌箟喙�喔`复喙堗浮喔曕箟喔�',
+    advanced: '喙佮笂喔椸箓喔熰弗喔о箤',
+    advancedFor: '喔箥喔侧斧喔`副喔氞笢喔灌箟喙冟笂喙夃競喔编箟喔權釜喔灌竾 喔椸傅喙堗釜喔侧浮喔侧福喔栢笡喔`副喔氞箒喔曕箞喔囙競喔编箟喔權笗喔笝喙佮弗喔班笗喔编抚喙�喔ム阜喔竵喔曕箞喔侧竾喙嗋箘喔斷箟喔涪喙堗覆喔囙腑喔脆釜喔`赴',
+    advancedDescription: 'Workflow Orchestrate 喔涏福喔班釜喔侧笝喔囙覆喔� Chatbots 喙冟笝喔`腹喔涏箒喔氞笟喔傕腑喔囙箑喔о复喔`箤喔佮箓喔熰弗喔о箤 喙傕笖喔⑧笝喙嵿覆喙�喔笝喔竵喔侧福喔涏福喔编笟喙佮笗喙堗竾喙冟笝喔`赴喔斷副喔氞釜喔灌竾 喔`抚喔∴笘喔多竾喔勦抚喔侧浮喔覆喔∴覆喔`笘喙冟笝喔佮覆喔`箒喔佮箟喙勦競喔傕箟喔竸喔о覆喔∴箒喔堗箟喔囙箖喔權笗喔编抚 喙�喔浮喔侧赴喔箥喔侧斧喔`副喔氞笢喔灌箟喙冟笂喙夃笚喔掂箞喔∴傅喔涏福喔班釜喔氞竵喔侧福喔撪箤',
+    captionName: '喙勦腑喔勦腑喔權箒喔ム赴喔娻阜喙堗腑喙傕笡喔`箑喔堗竵喔曕箤',
+    appNamePlaceholder: '喔曕副喙夃竾喔娻阜喙堗腑喙傕笡喔`箑喔堗竵喔曕箤喔傕腑喔囙竸喔膏笓',
+    captionDescription: '喔勦赋喔笜喔脆笟喔侧涪',
+    appDescriptionPlaceholder: '喔涏箟喔笝喔勦箥喔侧腑喔樴复喔氞覆喔⑧競喔竾喙傕笡喔`箑喔堗竵喔曕箤',
+    useTemplate: '喙冟笂喙夃箑喔椸浮喙�喔炧弗喔曕笝喔掂箟',
+    previewDemo: '喔曕副喔о腑喔⑧箞喔侧竾喔佮覆喔`箖喔娻箟喔囙覆喔�',
+    chatApp: '喔溹腹喙夃笂喙堗抚喔�',
+    chatAppIntro: '喔夃副喔權笗喙夃腑喔囙竵喔侧福喔福喙夃覆喔囙箓喔涏福喙�喔堗竵喔曕箤 喔椸傅喙堗箑喔涏箛喔權箒喔笡喔炧弗喔脆箑喔勦笂喔编笝喔椸傅喙堗箖喔娻箟喔佮覆喔`箒喔娻笚 喙傕笡喔`箑喔堗竵喔曕箤喔權傅喙夃箖喔娻箟喔`腹喔涏箒喔氞笟喔勦箥喔侧笘喔侧浮喙佮弗喔班竸喙嵿覆喔曕腑喔� 喔椸箥喔侧箖喔箟喔覆喔∴覆喔`笘喔笝喔椸笝喔侧笗喙堗腑喙�喔權阜喙堗腑喔囙箘喔斷箟喔弗喔侧涪喔`腑喔�(Multi-turn)',
+    agentAssistant: '喔溹腹喙夃笂喙堗抚喔⑧箖喔浮喙�',
+    completeApp: '喙�喔勦福喔粪箞喔竾喔∴阜喔釜喔`箟喔侧竾喔傕箟喔竸喔о覆喔�',
+    completeAppIntro: '喔夃副喔權笗喙夃腑喔囙竵喔侧福喔福喙夃覆喔囙箓喔涏福喙�喔堗竵喔曕箤喔椸傅喙� 喔椸傅喙堗釜喔侧浮喔侧福喔栢釜喔`箟喔侧竾喔傕箟喔竸喔о覆喔∴竸喔膏笓喔犩覆喔炧釜喔灌竾喔曕覆喔∴競喙夃腑喔勦抚喔侧浮喙佮笀喙夃竾 喙�喔娻箞喔� 喔佮覆喔`釜喔`箟喔侧竾喔氞笚喔勦抚喔侧浮 喔福喔膏笡 喔佮覆喔`箒喔涏弗 喙佮弗喔班腑喔粪箞喔權箚',
+    showTemplates: '喔夃副喔權笗喙夃腑喔囙竵喔侧福喙�喔ム阜喔竵喔堗覆喔佮箑喔椸浮喙�喔炧弗喔�',
+    hideTemplates: '喔佮弗喔编笟喙勦笡喔椸傅喙堗竵喔侧福喙�喔ム阜喔竵喙傕斧喔∴笖',
+    Create: '喔福喙夃覆喔�',
+    Cancel: '喔⑧竵喙�喔ム复喔�',
+    Confirm: '喔⑧阜喔權涪喔编笝',
+    nameNotEmpty: '喔娻阜喙堗腑喔曕箟喔竾喙勦浮喙堗抚喙堗覆喔囙箑喔涏弗喙堗覆',
+    appTemplateNotSelected: '喙傕笡喔`笖喙�喔ム阜喔竵喙�喔椸浮喙�喔炧弗喔�',
+    appTypeRequired: '喙傕笡喔`笖喙�喔ム阜喔竵喔涏福喔班箑喔犩笚喙傕笡喔`箑喔堗竵喔曕箤',
+    appCreated: '喔福喙夃覆喔囙箓喔涏福喙�喔堗竵喔曕箤',
+    caution: '喔傕箟喔竸喔о福喔`赴喔о副喔�',
+    appCreateDSLWarning: '喔傕箟喔竸喔о福喔`赴喔о副喔�: 喔勦抚喔侧浮喙佮笗喔佮笗喙堗覆喔囙競喔竾喙�喔о腑喔`箤喔娻副喔� DSL 喔覆喔堗釜喙堗竾喔溹弗喔曕箞喔竸喔膏笓喔浮喔氞副喔曕复喔氞覆喔囙腑喔⑧箞喔侧竾',
+    appCreateDSLErrorTitle: '喔勦抚喔侧浮喙�喔傕箟喔侧竵喔编笝喙勦浮喙堗箘喔斷箟喔傕腑喔� DSL 喙�喔о腑喔`箤喔娻副喔�',
+    appCreateDSLErrorPart1: '喔曕福喔о笀喔炧笟喔勦抚喔侧浮喙佮笗喔佮笗喙堗覆喔囙腑喔⑧箞喔侧竾喔∴傅喔權副喔⑧釜喙嵿覆喔勦副喔嵿箖喔權箑喔о腑喔`箤喔娻副喔� DSL 喔佮覆喔`笟喔编竾喔勦副喔氞笝喙嵿覆喙�喔傕箟喔侧腑喔侧笀喔椸箥喔侧箖喔箟喙傕笡喔`箑喔堗竵喔曕箤喔椸箥喔侧竾喔侧笝喔溹复喔斷笡喔佮笗喔�',
+    appCreateDSLErrorPart2: '喔勦父喔撪笗喙夃腑喔囙竵喔侧福喔斷箥喔侧箑喔權复喔權竵喔侧福喔曕箞喔斧喔`阜喔箘喔∴箞?',
+    appCreateDSLErrorPart3: '喙�喔о腑喔`箤喔娻副喔� DSL 喔傕腑喔囙箓喔涏福喙�喔堗竵喔曕箤喔涏副喔堗笀喔膏笟喔编笝:',
+    appCreateDSLErrorPart4: '喙�喔о腑喔`箤喔娻副喔� DSL 喔椸傅喙堗福喔班笟喔氞福喔竾喔`副喔�:',
+    appCreateFailed: '喔福喙夃覆喔囙箓喔涏福喙�喔堗竵喔曕箤喙勦浮喙堗釜喙嵿覆喙�喔`箛喔�',
+    learnMore: '喔ㄠ付喔佮俯喔侧箑喔炧复喙堗浮喙�喔曕复喔�',
+    foundResults: '{{喔權副喔殅} 喔溹弗喔ム副喔炧笜喙�',
+    noTemplateFoundTip: '喔ム腑喔囙竸喙夃笝喔覆喙傕笖喔⑧箖喔娻箟喔勦傅喔⑧箤喙�喔о复喔`箤喔斷腑喔粪箞喔�',
+    chatbotShortDescription: '喙佮笂喔椸笟喔笚喔椸傅喙堗箖喔娻箟 LLM 喔炧福喙夃腑喔∴竵喔侧福喔曕副喙夃竾喔勦箞喔侧笚喔掂箞喔囙箞喔侧涪喔斷覆喔�',
+    optional: '喙�喔福喔脆浮',
+    workflowUserDescription: '喔佮覆喔`笡喔`赴喔覆喔權箑喔о复喔`箤喔佮箓喔熰弗喔о箤喔箥喔侧斧喔`副喔氞竾喔侧笝喔`腑喔氞箑喔斷傅喔⑧抚 喙�喔娻箞喔� 喔`赴喔氞笟喔副喔曕箓喔權浮喔编笗喔脆箒喔ム赴喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム箒喔氞笟喙佮笟喔曕笂喙�',
+    agentShortDescription: '喔曕副喔о箒喔椸笝喔副喔堗笁喔`复喔⑧赴喔炧福喙夃腑喔∴竵喔侧福喙冟笂喙夃箑喔笗喔膏笢喔ム箒喔ム赴喙�喔勦福喔粪箞喔竾喔∴阜喔腑喔编笗喙傕笝喔∴副喔曕复',
+    forBeginners: '喔箥喔侧斧喔`副喔氞笢喔灌箟喙�喔`复喙堗浮喔曕箟喔�',
+    completionShortDescription: '喔溹腹喙夃笂喙堗抚喔� AI 喔箥喔侧斧喔`副喔氞竾喔侧笝喔福喙夃覆喔囙競喙夃腑喔勦抚喔侧浮',
+    agentUserDescription: '喔曕副喔о箒喔椸笝喔副喔堗笁喔`复喔⑧赴喔椸傅喙堗釜喔侧浮喔侧福喔栢箖喔箟喙�喔笗喔膏笢喔ム笅喙夃箥喔侧箚 喙佮弗喔班箖喔娻箟喙�喔勦福喔粪箞喔竾喔∴阜喔腑喔编笗喙傕笝喔∴副喔曕复喙�喔炧阜喙堗腑喙冟斧喙夃笟喔`福喔ム父喙�喔涏箟喔侧斧喔∴覆喔⑧競喔竾喔囙覆喔�',
+    noIdeaTip: '喙勦浮喙堗浮喔掂竸喔о覆喔∴竸喔脆笖? 喔斷腹喙�喔椸浮喙�喔炧弗喔曕競喔竾喙�喔`覆',
+    foundResult: '{{喔權副喔殅} 喔溹弗',
+    noAppsFound: '喙勦浮喙堗笧喔氞箒喔笡',
+    workflowShortDescription: '喔佮覆喔`笡喔`赴喔覆喔權竾喔侧笝喔箥喔侧斧喔`副喔氞竾喔侧笝喔副喔曕箓喔權浮喔编笗喔脆箒喔氞笟喙�喔椸复喔`箤喔權箑喔斷傅喔⑧抚',
+    forAdvanced: '喔箥喔侧斧喔`副喔氞笢喔灌箟喙冟笂喙夃競喔编箟喔權釜喔灌竾',
+    chatbotUserDescription: '喔福喙夃覆喔囙箒喔娻笚喔氞腑喔椸笚喔掂箞喙冟笂喙� LLM 喙勦笖喙夃腑喔⑧箞喔侧竾喔`抚喔斷箑喔`箛喔о笖喙夃抚喔⑧竵喔侧福喔佮箥喔侧斧喔權笖喔勦箞喔侧笚喔掂箞喔囙箞喔侧涪 喔勦父喔撪釜喔侧浮喔侧福喔栢箑喔涏弗喔掂箞喔⑧笝喙勦笡喙冟笂喙� Chatflow 喙勦笖喙夃箖喔權笭喔侧涪喔弗喔编竾',
+    noTemplateFound: '喙勦浮喙堗笧喔氞箑喔椸浮喙�喔炧弗喔�',
+    completionUserDescription: '喔福喙夃覆喔囙笢喔灌箟喔娻箞喔о涪 AI 喔箥喔侧斧喔`副喔氞竾喔侧笝喔福喙夃覆喔囙競喙夃腑喔勦抚喔侧浮喔涪喙堗覆喔囙福喔о笖喙�喔`箛喔о笖喙夃抚喔⑧竵喔侧福喔佮箥喔侧斧喔權笖喔勦箞喔侧笚喔掂箞喔囙箞喔侧涪',
+    advancedUserDescription: '喔佮覆喔`笡喔`赴喔覆喔權箑喔о复喔`箤喔佮箓喔熰弗喔о箤喔箥喔侧斧喔`副喔氞竾喔侧笝喔氞笚喔笝喔椸笝喔侧笚喔掂箞喔嬥副喔氞笅喙夃腑喔權斧喔ム覆喔⑧福喔笟喔炧福喙夃腑喔∴竸喔о覆喔∴釜喔侧浮喔侧福喔栢競喔竾喔笝喙堗抚喔⑧竸喔о覆喔∴笀喙嵿覆',
+    chooseAppType: '喙�喔ム阜喔竵喔涏福喔班箑喔犩笚喙佮腑喔�',
+    advancedShortDescription: '喙�喔о复喔`箤喔佮箓喔熰弗喔о箤喔箥喔侧斧喔`副喔氞笟喔椸釜喔權笚喔權覆喔弗喔侧涪喔`腑喔氞笚喔掂箞喔嬥副喔氞笅喙夃腑喔權笧喔`箟喔浮喔笝喙堗抚喔⑧竸喔о覆喔∴笀喙嵿覆',
+  },
+  editApp: '喙佮竵喙夃箘喔傕競喙夃腑喔∴腹喔�',
+  editAppTitle: '喙佮竵喙夃箘喔傕競喙夃腑喔∴腹喔ム箓喔涏福喙�喔堗竵喔曕箤',
+  editDone: '喔副喔涏箑喔斷笗喔傕箟喔浮喔灌弗喙傕笡喔`箑喔堗竵喔曕箤',
+  editFailed: '喔副喔涏箑喔斷笗喔傕箟喔浮喔灌弗喙傕笡喔`箑喔堗竵喔曕箤喙勦浮喙堗釜喙嵿覆喙�喔`箛喔�',
+  iconPicker: {
+    ok: '喔曕竵喔ム竾, 喙勦笖喙�',
+    cancel: '喔⑧竵喙�喔ム复喔�',
+    emoji: '喔复喙傕浮喔堗复',
+    image: '喔犩覆喔�',
+  },
+  answerIcon: {
+    title: '喙冟笂喙夃箘喔竸喔笝 WebApp 喙�喔炧阜喙堗腑喙佮笚喔權笚喔掂箞 馃',
+    description: '喔堗赴喙冟笂喙夃箘喔竸喔笝 WebApp 喙�喔炧阜喙堗腑喙佮笚喔權笚喔掂箞馃喙冟笝喙傕笡喔`箑喔堗竵喔曕箤喔椸傅喙堗箖喔娻箟喔`箞喔о浮喔佮副喔權斧喔`阜喔箘喔∴箞',
+    descriptionInExplore: '喔堗赴喙冟笂喙夃箘喔竸喔笝 WebApp 喙�喔炧阜喙堗腑喙佮笚喔權笚喔掂箞馃喙冟笝 Explore 喔福喔粪腑喙勦浮喙�',
+  },
+  switch: '喙�喔涏弗喔掂箞喔⑧笝喙勦笡喙冟笂喙� Workflow Orchestrate',
+  switchTipStart: '喔箥喔侧箑喔權覆喙傕笡喔`箑喔堗竵喔曕箤喙冟斧喔∴箞喔堗赴喔栢腹喔佮釜喔`箟喔侧竾喔傕付喙夃笝喔箥喔侧斧喔`副喔氞竸喔膏笓 喙佮弗喔班釜喙嵿覆喙�喔權覆喙冟斧喔∴箞喔堗赴喙�喔涏弗喔掂箞喔⑧笝喙�喔涏箛喔� Workflow Orchestration',
+  switchTip: '喙勦浮喙堗腑喔權父喔嵿覆喔�',
+  switchTipEnd: '喙�喔涏弗喔掂箞喔⑧笝喔佮弗喔编笟喙�喔涏箛喔� Basic Orchestrate',
+  switchLabel: '喔箥喔侧箑喔權覆喙傕笡喔`箑喔堗竵喔曕箤喔椸傅喙堗笀喔班釜喔`箟喔侧竾',
+  removeOriginal: '喔ム笟喙傕笡喔`箑喔堗竵喔曕箤喙�喔斷复喔�',
+  switchStart: '喔抚喔脆笗喔娻箤喔笗喔侧福喙屶笚',
+  typeSelector: {
+    all: '喔椸父喔佮笡喔`赴喙�喔犩笚',
+    chatbot: '喙佮笂喔椸笟喔笚',
+    agent: '喔曕副喔о箒喔椸笝',
+    workflow: '喙�喔о复喔`箤喔佮箓喔熰弗喔о箤',
+    completion: '喙�喔福喙囙笀',
+    advanced: '喙佮笂喔椸箓喔熰弗喔о箤',
+  },
+  tracing: {
+    title: '喔佮覆喔`笗喔脆笖喔曕覆喔∴笡喔`赴喔复喔椸笜喔脆笭喔侧笧喔傕腑喔囙箓喔涏福喙�喔堗竵喔曕箤',
+    description: '喔佮覆喔`竵喙嵿覆喔笝喔斷竸喙堗覆喔溹腹喙夃箖喔箟喔氞福喔脆竵喔侧福 LLMOps 喔氞父喔勦竸喔ム笚喔掂箞喔覆喔∴箒喔ム赴喔涏福喔班釜喔脆笚喔樴复喔犩覆喔炧競喔竾喙傕笡喔`箑喔堗竵喔曕箤喔椸傅喙堗笝喔赤箘喔涏箖喔娻箟',
+    config: '喔佮箥喔侧斧喔權笖喔勦箞喔�',
+    view: '喔∴父喔∴浮喔竾',
+    collapse: '喔⑧父喔�',
+    expand: '喔傕涪喔侧涪',
+    tracing: '喔曕复喔斷笗喔侧浮',
+    disabled: '喔涏复喔斷竵喔侧福喙冟笂喙夃竾喔侧笝',
+    disabledTip: '喙傕笡喔`笖喔佮箥喔侧斧喔權笖喔勦箞喔侧笢喔灌箟喙冟斧喙夃笟喔`复喔佮覆喔`竵喙堗腑喔�',
+    enabled: '喙冟斧喙夃笟喔`复喔佮覆喔�',
+    tracingDescription: '喔氞副喔權笚喔多竵喔氞福喔脆笟喔椸笚喔编箟喔囙斧喔∴笖喔傕腑喔囙竵喔侧福喔斷箥喔侧箑喔權复喔權竵喔侧福喔傕腑喔囙箓喔涏福喙�喔堗竵喔曕箤 喔`抚喔∴笘喔多竾喔佮覆喔`箑喔`傅喔⑧竵 LLM, Prompt 喔勦箥喔侧競喔� HTTP 喙佮弗喔班腑喔粪箞喔權箚喙勦笡喔⑧副喔囙箒喔炧弗喔曕笩喔福喙屶浮喔傕腑喔囙競喔竾喔氞父喔勦竸喔ム笚喔掂箞喔覆喔�',
+    configProviderTitle: {
+      configured: '喔佮箥喔侧斧喔權笖喔勦箞喔侧箒喔ム箟喔�',
+      notConfigured: '喔溹腹喙夃箖喔箟喔氞福喔脆竵喔侧福喔佮箥喔侧斧喔權笖喔勦箞喔侧箑喔炧阜喙堗腑喙�喔涏复喔斷箖喔娻箟喔囙覆喔權竵喔侧福喔曕复喔斷笗喔侧浮',
+      moreProvider: '喔溹腹喙夃箖喔箟喔氞福喔脆竵喔侧福喙�喔炧复喙堗浮喙�喔曕复喔�',
+    },
+    langsmith: {
+      title: 'Langsmith',
+      description: '喙佮笧喔ム笗喔熰腑喔`箤喔∴笝喔编竵喔炧副喔掄笝喔侧箒喔氞笟喔勦福喔氞抚喔囙笀喔`釜喙嵿覆喔福喔编笟喔椸父喔佮競喔编箟喔權笗喔笝喔傕腑喔� 喔佮覆喔`笧喔编笒喔權覆喙傕笡喔`箑喔堗竵喔曕箤喔椸傅喙堗競喔编笟喙�喔勦弗喔粪箞喔笝喔斷箟喔о涪 LLM',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: '喔佮覆喔`笗喔脆笖喔曕覆喔� 喔佮覆喔`笡喔`赴喙�喔∴复喔權竵喔侧福喔堗副喔斷竵喔侧福喔炧福喙夃腑喔∴笚喙� 喙佮弗喔班箑喔∴笗喔`复喔佮箑喔炧阜喙堗腑喙佮竵喙夃箘喔傕競喙夃腑喔氞竵喔炧福喙堗腑喔囙箒喔ム赴喔涏福喔编笟喔涏福喔膏竾喙傕笡喔`箑喔堗竵喔曕箤 LLM 喔傕腑喔囙竸喔膏笓',
+    },
+    inUse: '喙冟笂喙夃竾喔侧笝',
+    configProvider: {
+      title: '喔佮箥喔侧斧喔權笖喔勦箞喔�',
+      placeholder: '喔涏箟喔笝 {{key}} 喔傕腑喔囙竸喔膏笓',
+      project: '喙傕竸喔`竾喔佮覆喔�',
+      publicKey: '喔佮父喔嵿箒喔堗釜喔侧笜喔侧福喔撪赴',
+      secretKey: '喔佮父喔嵿箒喔堗弗喔编笟',
+      viewDocsLink: '喔斷腹喙�喔竵喔覆喔� {{key}}',
+      removeConfirmTitle: '喔ム笟喔佮覆喔`竵喙嵿覆喔笝喔斷竸喙堗覆 {{key}} 喔福喔粪腑喙勦浮喙�?',
+      removeConfirmContent: '喔佮覆喔`竵喙嵿覆喔笝喔斷竸喙堗覆喔涏副喔堗笀喔膏笟喔编笝喔佮箥喔侧弗喔编竾喙冟笂喙夃竾喔侧笝 喔佮覆喔`弗喔氞腑喔竵喔堗赴喙�喔涏箛喔權竵喔侧福喔涏复喔斷竸喔膏笓喔浮喔氞副喔曕复喔佮覆喔`笗喔脆笖喔曕覆喔�',
+    },
+    opik: {
+      title: '喙傕腑喔涏复喔�',
+      description: 'Opik 喙�喔涏箛喔權箒喔炧弗喔曕笩喔福喙屶浮喙傕腑喙�喔炧箞喔權笅喔福喙屶釜喔箥喔侧斧喔`副喔氞竵喔侧福喔涏福喔班箑喔∴复喔� 喔椸笖喔腑喔� 喙佮弗喔班笗喔`抚喔堗釜喔笟喙佮腑喔涏笧喔ム复喙�喔勦笂喔编笝 LLM',
+    },
+    weave: {
+      title: '喔椸腑',
+      description: 'Weave 喙�喔涏箛喔權箒喔炧弗喔曕笩喔福喙屶浮喙傕腑喙�喔炧笝喔嬥腑喔`箤喔釜喔赤斧喔`副喔氞竵喔侧福喔涏福喔班箑喔∴复喔權笢喔� 喔椸笖喔腑喔� 喙佮弗喔班笗喔`抚喔堗釜喔笟喙佮腑喔涏笧喔ム复喙�喔勦笂喔编笝 LLM',
+    },
+  },
+  mermaid: {
+    handDrawn: '喔о覆喔斷笖喙夃抚喔⑧浮喔粪腑',
+    classic: '喔勦弗喔侧釜喔复喔�',
+  },
+  openInExplore: '喙�喔涏复喔斷箖喔� Explore',
+  newAppFromTemplate: {
+    sidebar: {
+      Assistant: '喔溹腹喙夃笂喙堗抚喔�',
+      Writing: '喔佮覆喔`箑喔傕傅喔⑧笝',
+      Recommended: '喙佮笝喔� 喔權赋',
+      Workflow: '喙�喔о复喔`箤喔佮箓喔熰弗喔о箤',
+      Programming: '喙傕笡喔`箒喔佮福喔�',
+      HR: '喔娻副喙堗抚喙傕浮喔�',
+      Agent: '喔曕副喔о箒喔椸笝',
+    },
+    searchAllTemplate: '喔勦箟喔權斧喔侧箑喔椸浮喙�喔炧弗喔曕笚喔编箟喔囙斧喔∴笖...',
+    byCategories: '喔曕覆喔∴斧喔∴抚喔斷斧喔∴腹喙�',
+  },
+  showMyCreatedAppsOnly: '喙佮釜喔斷竾喙�喔夃笧喔侧赴喙佮腑喔涏笚喔掂箞喔夃副喔權釜喔`箟喔侧竾',
+  appSelector: {
+    placeholder: '喙�喔ム阜喔竵喙佮腑喔�...',
+    params: '喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤喙佮腑喔�',
+    noParams: '喙勦浮喙堗笀喙嵿覆喙�喔涏箛喔權笗喙夃腑喔囙箖喔娻箟喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤',
+    label: '喙佮腑喔�',
+  },
+  structOutput: {
+    notConfiguredTip: '喔⑧副喔囙箘喔∴箞喙勦笖喙夃竵喔赤斧喔權笖喔溹弗喔ム副喔炧笜喙屶笚喔掂箞喔∴傅喙傕竸喔`竾喔福喙夃覆喔�',
+    moreFillTip: '喙佮釜喔斷竾喔`赴喔斷副喔氞竵喔侧福喔嬥箟喔笝喔腹喔囙釜喔膏笖 10 喔`赴喔斷副喔�',
+    structuredTip: 'Structured Outputs 喙�喔涏箛喔權笩喔掂箑喔堗腑喔`箤喔椸傅喙堗笚喔赤箖喔箟喔∴副喙堗笝喙冟笀喔о箞喔侧箓喔∴箑喔斷弗喔堗赴喔福喙夃覆喔囙竸喔赤笗喔笟喔椸傅喙堗釜喔笖喔勦弗喙夃腑喔囙竵喔编笟 JSON Schema 喔椸傅喙堗竸喔膏笓喔佮赋喔笝喔斷箘喔о箟喙�喔浮喔�',
+    configure: '喔佮赋喔笝喔斷竸喙堗覆',
+    required: '喔椸傅喙堗笀喔赤箑喔涏箛喔�',
+    LLMResponse: 'LLM 喔曕腑喔氞釜喔權腑喔�',
+    structured: '喔∴傅喔`赴喙�喔氞傅喔⑧笟',
+    modelNotSupported: '喙傕浮喙�喔斷弗喙勦浮喙堗箘喔斷箟喔`副喔氞竵喔侧福喔笝喔编笟喔笝喔膏笝',
+    modelNotSupportedTip: '喙傕浮喙�喔斷弗喔涏副喔堗笀喔膏笟喔编笝喙勦浮喙堗福喔竾喔`副喔氞笩喔掂箑喔堗腑喔`箤喔權傅喙夃箒喔ム赴喔堗赴喔栢腹喔佮弗喔斷福喔班笖喔编笟喙�喔涏箛喔權竵喔侧福喔夃傅喔斷竸喔赤釜喔编箞喔囙箓喔斷涪喔副喔曕箓喔權浮喔编笗喔�.',
+  },
+}
+
+export default translation
diff --git a/i18n/th-TH/billing.ts b/i18n/th-TH/billing.ts
new file mode 100644
index 0000000..c58d61c
--- /dev/null
+++ b/i18n/th-TH/billing.ts
@@ -0,0 +1,200 @@
+const translation = {
+  currentPlan: '喙佮笢喔權笡喔编笀喔堗父喔氞副喔�',
+  upgradeBtn: {
+    plain: '喙佮笢喔權竵喔侧福喔副喔涏箑喔佮福喔�',
+    encourage: '喔副喔涏箑喔佮福喔斷箑喔斷傅喙嬥涪喔о笝喔掂箟',
+    encourageShort: '喔副喔� 喙�喔佮福喔�',
+  },
+  viewBilling: '喔堗副喔斷竵喔侧福喔佮覆喔`箑喔`傅喔⑧竵喙�喔佮箛喔氞箑喔囙复喔權箒喔ム赴喔佮覆喔`釜喔∴副喔勦福喙冟笂喙夃竾喔侧笝',
+  buyPermissionDeniedTip: '喙傕笡喔`笖喔曕复喔斷笗喙堗腑喔溹腹喙夃笖喔灌箒喔ム福喔班笟喔氞腑喔囙竸喙屶竵喔`競喔竾喔勦父喔撪箑喔炧阜喙堗腑喔浮喔编竸喔`釜喔∴覆喔娻复喔�',
+  plansCommon: {
+    title: '喙�喔ム阜喔竵喙佮笢喔權笟喔`复喔佮覆喔`笚喔掂箞喙�喔浮喔侧赴喔佮副喔氞竸喔膏笓',
+    yearlyTip: '喔`副喔氞笩喔`傅 2 喙�喔斷阜喔笝喙傕笖喔⑧釜喔∴副喔勦福喔浮喔侧笂喔脆竵喔`覆喔⑧笡喔�!',
+    mostPopular: '喙佮斧喙堗竾',
+    planRange: {
+      monthly: '喔`覆喔⑧箑喔斷阜喔笝',
+      yearly: '喔`覆喔⑧笡喔�',
+    },
+    month: '喙�喔斷阜喔笝',
+    year: '喔涏傅',
+    save: '喔涏福喔班斧喔⑧副喔�',
+    free: '喔熰福喔�',
+    currentPlan: '喙佮笢喔權笡喔编笀喔堗父喔氞副喔�',
+    contractSales: '喔曕复喔斷笗喙堗腑喔澿箞喔侧涪喔傕覆喔�',
+    contractOwner: '喔曕复喔斷笗喙堗腑喔溹腹喙夃笀喔编笖喔佮覆喔`笚喔掂浮',
+    startForFree: '喙�喔`复喙堗浮喔熰福喔�',
+    getStartedWith: '喙�喔`复喙堗浮喔曕箟喔權箖喔娻箟喔囙覆喔�',
+    contactSales: '喔曕复喔斷笗喙堗腑喔澿箞喔侧涪喔傕覆喔�',
+    talkToSales: '喔炧腹喔斷竸喔膏涪喔佮副喔氞笣喙堗覆喔⑧競喔侧涪',
+    modelProviders: '喔溹腹喙夃箖喔箟喔氞福喔脆竵喔侧福喙傕浮喙�喔斷弗',
+    teamMembers: '喔浮喔侧笂喔脆竵喙冟笝喔椸傅喔�',
+    annotationQuota: '喙傕竸喔о笗喙夃覆喔勦箥喔侧腑喔樴复喔氞覆喔⑧笡喔`赴喔佮腑喔�',
+    buildApps: '喔福喙夃覆喔囙箒喔笧',
+    vectorSpace: '喔炧阜喙夃笝喔椸傅喙堗箑喔о竵喙�喔曕腑喔`箤',
+    vectorSpaceBillingTooltip: '喙佮笗喙堗弗喔� 1MB 喔覆喔∴覆喔`笘喔堗副喔斷箑喔佮箛喔氞競喙夃腑喔∴腹喔ム箒喔氞笟喙�喔о竵喙�喔曕腑喔`箤喙勦笖喙夃笡喔`赴喔∴覆喔� 1.2 喔ム箟喔侧笝喔副喔佮競喔`赴 (喙傕笖喔⑧笡喔`赴喔∴覆喔撪箓喔斷涪喙冟笂喙� OpenAI Embeddings 喙佮笗喔佮笗喙堗覆喔囙竵喔编笝喙勦笡喔曕覆喔∴福喔膏箞喔�)',
+    vectorSpaceTooltip: 'Vector Space 喙�喔涏箛喔權福喔班笟喔氞斧喔權箞喔о涪喔勦抚喔侧浮喔堗箥喔侧福喔班涪喔班涪喔侧抚喔椸傅喙堗笀喙嵿覆喙�喔涏箛喔權釜喙嵿覆喔福喔编笟 LLM 喙冟笝喔佮覆喔`笚喙嵿覆喔勦抚喔侧浮喙�喔傕箟喔侧箖喔堗競喙夃腑喔∴腹喔ム競喔竾喔勦父喔�',
+    documentsUploadQuota: '喙傕竸喔о笗喙夃覆喔佮覆喔`腑喔编笡喙傕斧喔ム笖喙�喔竵喔覆喔�',
+    documentProcessingPriority: '喔ム箥喔侧笖喔编笟喔勦抚喔侧浮喔箥喔侧竸喔编笉喙冟笝喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム箑喔竵喔覆喔�',
+    documentProcessingPriorityTip: '喔箥喔侧斧喔`副喔氞弗喙嵿覆喔斷副喔氞竸喔о覆喔∴釜喙嵿覆喔勦副喔嵿箖喔權竵喔侧福喔涏福喔班浮喔о弗喔溹弗喙�喔竵喔覆喔`笚喔掂箞喔腹喔囙競喔多箟喔� 喙傕笡喔`笖喔副喔涏箑喔佮福喔斷箒喔溹笝喔傕腑喔囙竸喔膏笓',
+    documentProcessingPriorityUpgrade: '喔涏福喔班浮喔о弗喔溹弗喔傕箟喔浮喔灌弗喙勦笖喙夃浮喔侧竵喔傕付喙夃笝喔斷箟喔о涪喔勦抚喔侧浮喙佮浮喙堗笝喔⑧箥喔侧笚喔掂箞喔腹喔囙競喔多箟喔權笖喙夃抚喔⑧竸喔о覆喔∴箑喔`箛喔о笚喔掂箞喙�喔`箛喔о競喔多箟喔�',
+    priority: {
+      'standard': '喔∴覆喔曕福喔愢覆喔�',
+      'priority': '喔赋喔勦副喔�',
+      'top-priority': '喔ム箥喔侧笖喔编笟喔勦抚喔侧浮喔箥喔侧竸喔编笉喔腹喔囙釜喔膏笖',
+    },
+    logsHistory: '喔涏福喔班抚喔编笗喔脆竵喔侧福喔氞副喔權笚喔多竵',
+    customTools: '喙�喔勦福喔粪箞喔竾喔∴阜喔笚喔掂箞喔佮箥喔侧斧喔權笖喙�喔竾',
+    unavailable: '喙勦浮喙�',
+    days: '喔о副喔�',
+    unlimited: '喔堗赋喔佮副喔�',
+    support: '喔笝喔编笟喔笝喔膏笝',
+    supportItems: {
+      communityForums: '喔熰腑喔`副喔∴笂喔膏浮喔娻笝',
+      emailSupport: '喔佮覆喔`釜喔權副喔氞釜喔權父喔權笚喔侧竾喔傅喙�喔∴弗',
+      priorityEmail: '喔佮覆喔`釜喔權副喔氞釜喔權父喔權笚喔侧竾喔傅喙�喔∴弗喙佮弗喔班箒喔娻笚喔ム箥喔侧笖喔编笟喔勦抚喔侧浮喔箥喔侧竸喔编笉',
+      logoChange: '喔佮覆喔`箑喔涏弗喔掂箞喔⑧笝喙傕弗喙傕竵喙�',
+      SSOAuthentication: '喔佮覆喔`笗喔`抚喔堗釜喔笟喔复喔椸笜喔脆箤 SSO',
+      personalizedSupport: '喔佮覆喔`釜喔權副喔氞釜喔權父喔權釜喙堗抚喔權笟喔膏竸喔勦弗',
+      dedicatedAPISupport: '喔`腑喔囙福喔编笟 API 喙�喔夃笧喔侧赴',
+      customIntegration: '喔佮覆喔`笢喔覆喔權福喔о浮喙佮弗喔班竵喔侧福喔笝喔编笟喔笝喔膏笝喙佮笟喔氞竵喙嵿覆喔笝喔斷箑喔竾',
+      ragAPIRequest: '喔勦箥喔侧競喔� RAG API',
+      bulkUpload: '喔副喔涏箓喔弗喔斷箑喔竵喔覆喔`笀喙嵿覆喔權抚喔權浮喔侧竵',
+      agentMode: '喙傕斧喔∴笖喔曕副喔о箒喔椸笝',
+      workflow: '喙�喔о复喔`箤喔佮箓喔熰弗喔о箤',
+      llmLoadingBalancing: '喙傕斧喔ム笖喔氞覆喔ム覆喔權笅喙� LLM',
+      llmLoadingBalancingTooltip: '喙�喔炧复喙堗浮喔勦傅喔⑧箤 API 喔弗喔侧涪喔勦傅喔⑧箤喙冟斧喙夃竵喔编笟喙傕浮喙�喔斷弗 喙傕笖喔⑧競喙夃覆喔∴競喔掂笖喔堗箥喔侧竵喔编笖喔副喔曕福喔� API 喙勦笖喙夃腑喔⑧箞喔侧竾喔∴傅喔涏福喔班釜喔脆笚喔樴复喔犩覆喔�',
+    },
+    comingSoon: '喙�喔`箛喔� 喙� 喔權傅喙�',
+    member: '喔浮喔侧笂喔脆竵',
+    memberAfter: '喔浮喔侧笂喔脆竵',
+    messageRequest: {
+      title: '喙�喔勦福喔斷复喔曕競喙夃腑喔勦抚喔侧浮',
+      tooltip: '喙傕竸喔о笗喙夃覆喔佮覆喔`箑喔`傅喔⑧竵喙冟笂喙夃競喙夃腑喔勦抚喔侧浮喔箥喔侧斧喔`副喔氞箒喔溹笝喔曕箞喔侧竾喙� 喙傕笖喔⑧箖喔娻箟喙傕浮喙�喔斷弗 OpenAI (喔⑧竵喙�喔о箟喔� gpt4) 喔傕箟喔竸喔о覆喔∴笚喔掂箞喙�喔佮复喔權競喔掂笖喔堗箥喔侧竵喔编笖喔堗赴喙冟笂喙夃竸喔掂涪喙� OpenAI API 喔傕腑喔囙竸喔膏笓',
+      titlePerMonth: '{{count,number}} 喔傕箟喔竸喔о覆喔�/喙�喔斷阜喔笝',
+    },
+    annotatedResponse: {
+      title: '喔傕傅喔斷笀喙嵿覆喔佮副喔斷箓喔勦抚喔曕箟喔侧竸喙嵿覆喔笜喔脆笟喔侧涪喔涏福喔班竵喔笟',
+      tooltip: '喔佮覆喔`箒喔佮箟喙勦競喙佮弗喔班竸喙嵿覆喔笜喔脆笟喔侧涪喔涏福喔班竵喔笟喔佮覆喔`笗喔笟喔佮弗喔编笟喔斷箟喔о涪喔曕笝喙�喔竾喙冟斧喙夃竸喔о覆喔∴釜喔侧浮喔侧福喔栢箖喔權竵喔侧福喔曕腑喔氞竸喙嵿覆喔栢覆喔∴竸喔膏笓喔犩覆喔炧釜喔灌竾喔椸傅喙堗笡喔`副喔氞箒喔曕箞喔囙箘喔斷箟喔箥喔侧斧喔`副喔氞箒喔笡 (喙冟笂喙夃箘喔斷箟喙�喔夃笧喔侧赴喙冟笝喙佮腑喔涏箒喔娻笚)',
+    },
+    ragAPIRequestTooltip: '喔浮喔侧涪喔栢付喔囙笀喙嵿覆喔權抚喔權竵喔侧福喙�喔`傅喔⑧竵 API 喔椸傅喙堗箑喔`傅喔⑧竵喙冟笂喙夃箑喔夃笧喔侧赴喔勦抚喔侧浮喔覆喔∴覆喔`笘喙冟笝喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム笎喔侧笝喔勦抚喔侧浮喔`腹喙夃競喔竾 Dify',
+    receiptInfo: '喙�喔夃笧喔侧赴喙�喔堗箟喔侧競喔竾喔椸傅喔∴箒喔ム赴喔溹腹喙夃笖喔灌箒喔ム笚喔掂浮喙�喔椸箞喔侧笝喔编箟喔權笚喔掂箞喔覆喔∴覆喔`笘喔浮喔编竸喔`釜喔∴覆喔娻复喔佮箒喔ム赴喔斷腹喔傕箟喔浮喔灌弗喔佮覆喔`箑喔`傅喔⑧竵喙�喔佮箛喔氞箑喔囙复喔權箘喔斷箟',
+    cloud: '喔氞福喔脆竵喔侧福喔勦弗喔侧抚喔斷箤',
+    comparePlanAndFeatures: '喙�喔涏福喔掂涪喔氞箑喔椸傅喔⑧笟喙佮笢喔權箒喔ム赴喔熰傅喙�喔堗腑喔`箤',
+    apiRateLimit: '喔傕箟喔笀喔赤竵喔编笖喔副喔曕福喔侧竵喔侧福喙冟笂喙� API',
+    getStarted: '喙�喔`复喙堗浮喔曕箟喔�',
+    documents: '{{count,number}} 喙�喔竵喔覆喔`竸喔о覆喔∴福喔灌箟',
+    freeTrialTipPrefix: '喔ム竾喔椸赴喙�喔氞傅喔⑧笝喙佮弗喔班福喔编笟',
+    teamMember_one: '{{count,number}} 喔浮喔侧笂喔脆竵喔椸傅喔�',
+    unlimitedApiRate: '喙勦浮喙堗浮喔掂競喙夃腑喔堗赋喔佮副喔斷腑喔编笗喔`覆喔佮覆喔`箑喔`傅喔⑧竵 API',
+    self: '喙傕府喔笗喙屶笖喙夃抚喔⑧笗喔编抚喙�喔竾',
+    apiRateLimitUnit: '{{count,number}}/喔о副喔�',
+    teamMember_other: '{{count,number}} 喔浮喔侧笂喔脆竵喔椸傅喔�',
+    teamWorkspace: '{{count,number}} 喔椸傅喔∴笚喔赤竾喔侧笝',
+    priceTip: '喔曕箞喔笧喔粪箟喔權笚喔掂箞喔椸赋喔囙覆喔�/',
+    documentsTooltip: '喙傕竸喔о笗喙夃覆喔赋喔福喔编笟喔堗赋喔權抚喔權箑喔竵喔覆喔`笚喔掂箞喔權赋喙�喔傕箟喔侧笀喔侧竵喙佮斧喔ム箞喔囙競喙夃腑喔∴腹喔ム竸喔о覆喔∴福喔灌箟.',
+    documentsRequestQuota: '{{count,number}}/喔權覆喔椸傅 喔堗赋喔佮副喔� 喔副喔曕福喔侧竵喔侧福喔`箟喔竾喔傕腑喔傕箟喔浮喔灌弗',
+    apiRateLimitTooltip: '喔傕箟喔笀喔赤竵喔编笖喔佮覆喔`箖喔娻箟喔囙覆喔� API 喔堗赴喙冟笂喙夃竵喔编笟喔勦赋喔傕腑喔椸副喙夃竾喔浮喔斷笚喔掂箞喔椸赋喔溹箞喔侧笝 Dify API 喔`抚喔∴笘喔多竾喔佮覆喔`釜喔`箟喔侧竾喔傕箟喔竸喔о覆喔�, 喔佮覆喔`釜喔權笚喔權覆喙佮笂喔�, 喔佮覆喔`笖喔赤箑喔權复喔權竵喔侧福喙�喔о复喔`箤喔佮箓喔熰弗喔о箤 喙佮弗喔班竵喔侧福喔涏福喔班浮喔о弗喔溹弗喙�喔竵喔覆喔�.',
+    freeTrialTipSuffix: '喙勦浮喙堗笀喔赤箑喔涏箛喔權笗喙夃腑喔囙箖喔娻箟喔氞副喔曕福喙�喔勦福喔斷复喔�',
+    freeTrialTip: '喔椸笖喔ム腑喔囙箖喔娻箟喔囙覆喔權笩喔`傅 200 喔勦福喔编箟喔囙釜喔赤斧喔`副喔� OpenAI.',
+    annualBilling: '喔佮覆喔`箑喔`傅喔⑧竵喙�喔佮箛喔氞箑喔囙复喔權笡喔`赴喔堗赋喔涏傅',
+    documentsRequestQuotaTooltip: '喔`赴喔氞父喔堗赋喔權抚喔權福喔о浮喔傕腑喔囙竵喔侧福喔佮福喔班笚喔赤笚喔掂箞喙�喔о复喔`箤喔佮釜喙�喔涏笅喔覆喔∴覆喔`笘喔斷赋喙�喔權复喔權竵喔侧福喔曕箞喔斧喔權付喙堗竾喔權覆喔椸傅喔犩覆喔⑧箖喔權笎喔侧笝喔勦抚喔侧浮喔`腹喙� 喔`抚喔∴笘喔多竾喔佮覆喔`釜喔`箟喔侧竾喔娻父喔斷競喙夃腑喔∴腹喔� 喔佮覆喔`弗喔� 喔佮覆喔`腑喔编笡喙�喔斷笗 喔佮覆喔`腑喔编笡喙傕斧喔ム笖喙�喔竵喔覆喔� 喔佮覆喔`笡喔`副喔氞箑喔涏弗喔掂箞喔⑧笝 喔佮覆喔`箑喔佮箛喔氞笘喔侧抚喔� 喙佮弗喔班竵喔侧福喔腑喔氞笘喔侧浮喔愢覆喔權竸喔о覆喔∴福喔灌箟 喙�喔∴笗喔`复喔佮笝喔掂箟喔栢腹喔佮箖喔娻箟喙冟笝喔佮覆喔`笡喔`赴喙�喔∴复喔權笡喔`赴喔复喔椸笜喔脆笭喔侧笧喔傕腑喔囙竸喔赤競喔笎喔侧笝喔勦抚喔侧浮喔`腹喙� 喔曕副喔о腑喔⑧箞喔侧竾喙�喔娻箞喔� 喔覆喔佮笢喔灌箟喙冟笂喙� Sandbox 喔椸赋喔佮覆喔`笚喔斷釜喔笟喔佮覆喔`笗喔� 10 喔勦福喔编箟喔囙笗喙堗腑喙�喔權阜喙堗腑喔囙笭喔侧涪喙冟笝喔笝喔多箞喔囙笝喔侧笚喔� 喙�喔о复喔`箤喔佮釜喙�喔涏笅喔傕腑喔囙笧喔о竵喙�喔傕覆喔堗赴喔栢腹喔佮笀喔赤竵喔编笖喔娻副喙堗抚喔勦福喔侧抚喙冟笝喔佮覆喔`笖喔赤箑喔權复喔權竵喔侧福喔曕箞喔箘喔涏笝喔掂箟喙冟笝喔權覆喔椸傅喔栢副喔斷箘喔�: 喔佮覆喔`釜喔`箟喔侧竾喔娻父喔斷競喙夃腑喔∴腹喔� 喔佮覆喔`弗喔� 喔佮覆喔`腑喔编笡喙�喔斷笗 喔福喔粪腑喔佮覆喔`腑喔编笡喙傕斧喔ム笖喔福喔粪腑喔涏福喔编笟喙�喔涏弗喔掂箞喔⑧笝喙�喔竵喔覆喔�.',
+  },
+  plans: {
+    sandbox: {
+      name: '喔佮福喔班笟喔班笚喔`覆喔�',
+      description: '喔椸笖喔ム腑喔囙箖喔娻箟 GPT 喔熰福喔� 200 喔勦福喔编箟喔�',
+      includesTitle: '喔∴傅:',
+      for: '喔椸笖喔ム腑喔囙箖喔娻箟喔熰福喔掂競喔竾喔勦抚喔侧浮喔覆喔∴覆喔`笘喔弗喔编竵',
+    },
+    professional: {
+      name: '喔∴阜喔腑喔侧笂喔掂笧',
+      description: '喔箥喔侧斧喔`副喔氞笟喔膏竸喔勦弗喙佮弗喔班笚喔掂浮喔傕笝喔侧笖喙�喔ム箛喔佮箑喔炧阜喙堗腑喔涏弗喔斷弗喙囙腑喔佮笧喔ム副喔囙竾喔侧笝喔∴覆喔佮競喔多箟喔權箖喔權福喔侧竸喔侧涪喙堗腑喔∴箑喔⑧覆',
+      includesTitle: '喔椸父喔佮腑喔⑧箞喔侧竾喙冟笝喙佮笢喔權笩喔`傅 喔`抚喔∴笘喔多竾:',
+      for: '喔赋喔福喔编笟喔權副喔佮笧喔编笒喔權覆喔椸傅喙堗箑喔涏箛喔權腑喔脆釜喔`赴/喔椸傅喔∴競喔權覆喔斷箑喔ム箛喔�',
+    },
+    team: {
+      name: '喔椸傅喔�',
+      description: '喔椸箥喔侧竾喔侧笝喔`箞喔о浮喔佮副喔權腑喔⑧箞喔侧竾喙勦福喙夃競喔掂笖喔堗箥喔侧竵喔编笖喙佮弗喔班箑喔炧弗喔脆笖喙�喔炧弗喔脆笝喙勦笡喔佮副喔氞笡喔`赴喔复喔椸笜喔脆笭喔侧笧喔`赴喔斷副喔氞釜喔灌竾喔父喔�',
+      includesTitle: '喔椸父喔佮腑喔⑧箞喔侧竾喙冟笝喙佮笢喔� Professional 喔`抚喔∴笘喔多竾:',
+      for: '喔赋喔福喔编笟喔椸傅喔∴競喔權覆喔斷竵喔ム覆喔�',
+    },
+    enterprise: {
+      name: '喔佮复喔堗竵喔侧福',
+      description: '喔`副喔氞竸喔о覆喔∴釜喔侧浮喔侧福喔栢箒喔ム赴喔佮覆喔`釜喔權副喔氞釜喔權父喔權箑喔曕箛喔∴福喔灌笡喙佮笟喔氞釜喙嵿覆喔福喔编笟喔`赴喔氞笟喔椸傅喙堗釜喙嵿覆喔勦副喔嵿笗喙堗腑喔犩覆喔`竵喔脆笀喔傕笝喔侧笖喙冟斧喔嵿箞',
+      includesTitle: '喔椸父喔佮腑喔⑧箞喔侧竾喙冟笝喙佮笢喔權笚喔掂浮 喔`抚喔∴笘喔多竾:',
+      features: {
+        8: '喔佮覆喔`釜喔權副喔氞釜喔權父喔權笚喔侧竾喙�喔椸竸喔權复喔勦福喔班笖喔编笟喔∴阜喔腑喔侧笂喔掂笧',
+        2: '喔勦父喔撪釜喔∴笟喔编笗喔脆笧喔脆箑喔ㄠ俯喔傕腑喔囙腑喔囙竸喙屶竵喔�',
+        3: '喔弗喔侧涪喔炧阜喙夃笝喔椸傅喙堗笚喔赤竾喔侧笝喙佮弗喔班竵喔侧福喔氞福喔脆斧喔侧福喔堗副喔斷竵喔侧福喔竾喔勦箤喔佮福',
+        4: 'SSO',
+        6: '喔勦抚喔侧浮喔涏弗喔笖喔犩副喔⑧箒喔ム赴喔佮覆喔`竸喔о笟喔勦父喔∴競喔编箟喔權釜喔灌竾',
+        5: '喙�喔堗福喔堗覆喔傕箟喔笗喔佮弗喔囙笟喔`复喔佮覆喔� (SLA) 喙傕笖喔� Dify Partners',
+        7: '喔佮覆喔`腑喔编笡喙�喔斷笗喙佮弗喔班竵喔侧福喔氞赋喔`父喔囙福喔编竵喔┼覆喙傕笖喔� Dify 喔涪喙堗覆喔囙箑喔涏箛喔權笚喔侧竾喔佮覆喔�',
+        1: '喙冟笟喔笝喔膏笉喔侧笗喔佮覆喔`箖喔娻箟喙�喔娻复喔囙笧喔侧笓喔脆笂喔⑧箤',
+        0: '喙傕笅喔ム腹喔娻副喔權竵喔侧福喔涏福喔编笟喙冟笂喙夃笚喔掂箞喔∴傅喔傕笝喔侧笖喙冟斧喔嵿箞喙佮弗喔班浮喔掂竸喔膏笓喔犩覆喔炧福喔班笖喔编笟喔竾喔勦箤喔佮福',
+      },
+      btnText: '喔曕复喔斷笗喙堗腑喔澿箞喔侧涪喔傕覆喔�',
+      price: '喔椸傅喙堗竵喔赤斧喔權笖喙�喔竾',
+      for: '喔赋喔福喔编笟喔椸傅喔∴競喔權覆喔斷箖喔笉喙�',
+      priceTip: '喔佮覆喔`箑喔`傅喔⑧竵喙�喔佮箛喔氞箑喔囙复喔權笡喔`赴喔堗赋喔涏傅喙�喔椸箞喔侧笝喔编箟喔�',
+    },
+    community: {
+      features: {
+        2: '喔涏笍喔脆笟喔编笗喔脆笗喔侧浮喙冟笟喔笝喔膏笉喔侧笗喙傕腑喙�喔炧箞喔權笅喔福喙屶釜喔傕腑喔� Dify',
+        0: '喔熰傅喙�喔堗腑喔`箤喔弗喔编竵喔椸副喙夃竾喔浮喔斷笘喔灌竵喔涏弗喙堗腑喔⑧腑喔竵喔犩覆喔⑧箖喔曕箟喔椸傅喙堗箑喔佮箛喔氞釜喔侧笜喔侧福喔撪赴',
+        1: '喔炧阜喙夃笝喔椸傅喙堗笚喔赤竾喔侧笝喙�喔斷傅喔⑧抚',
+      },
+      name: '喔娻父喔∴笂喔�',
+      price: '喔熰福喔�',
+      includesTitle: '喔勦父喔撪釜喔∴笟喔编笗喔脆箑喔福喔�:',
+      description: '喔赋喔福喔编笟喔溹腹喙夃箖喔娻箟喔箞喔о笝喔氞父喔勦竸喔� 喔椸傅喔∴競喔權覆喔斷箑喔ム箛喔� 喔福喔粪腑喙傕竸喔`竾喔佮覆喔`笚喔掂箞喙勦浮喙堗箖喔娻箞喙�喔娻复喔囙笧喔侧笓喔脆笂喔⑧箤',
+      btnText: '喙�喔`复喙堗浮喔曕箟喔權竵喔编笟喔娻父喔∴笂喔�',
+      for: '喔赋喔福喔编笟喔溹腹喙夃箖喔娻箟喔箞喔о笝喔氞父喔勦竸喔� 喔椸傅喔∴競喔權覆喔斷箑喔ム箛喔� 喔福喔粪腑喙傕竸喔`竾喔佮覆喔`笚喔掂箞喙勦浮喙堗箖喔娻箞喙�喔娻复喔囙笧喔侧笓喔脆笂喔⑧箤',
+    },
+    premium: {
+      features: {
+        3: '喔佮覆喔`釜喔權副喔氞釜喔權父喔權笚喔侧竾喔傅喙�喔∴弗喙佮弗喔班箒喔娻笚喔椸傅喙堗浮喔掂竸喔о覆喔∴釜喔赤竸喔编笉',
+        1: '喔炧阜喙夃笝喔椸傅喙堗笚喔赤竾喔侧笝喙�喔斷傅喔⑧抚',
+        2: '喔佮覆喔`笡喔`副喔氞箒喔曕箞喔囙箓喔ム箓喔佮箟喙佮弗喔班箒喔氞福喔權笖喔脆箟喔囙競喔竾喙�喔о箛喔氞箒喔笡',
+        0: '喔佮覆喔`笀喔编笖喔佮覆喔`竸喔о覆喔∴笝喙堗覆喙�喔娻阜喙堗腑喔栢阜喔笖喙夃抚喔⑧笗喔權箑喔竾喙傕笖喔⑧笢喔灌箟喙冟斧喙夃笟喔`复喔佮覆喔`竸喔ム覆喔о笖喙屶笗喙堗覆喔� 喙�',
+      },
+      priceTip: '喔复喔囙笗喔侧浮喔曕弗喔侧笖喔勦弗喔侧抚喔斷箤',
+      for: '喔赋喔福喔编笟喔竾喔勦箤喔佮福喙佮弗喔班笚喔掂浮喔傕笝喔侧笖喔佮弗喔侧竾',
+      btnText: '喔`副喔氞笧喔`傅喙�喔∴傅喔⑧浮喙冟笝',
+      includesTitle: '喔椸父喔佮腑喔⑧箞喔侧竾喔堗覆喔佮笂喔膏浮喔娻笝 喔`抚喔∴笘喔多竾:',
+      description: '喔赋喔福喔编笟喔竾喔勦箤喔佮福喙佮弗喔班笚喔掂浮喔傕笝喔侧笖喔佮弗喔侧竾',
+      name: '喔炧福喔掂箑喔∴傅喔⑧浮',
+      comingSoon: '喔佮覆喔`釜喔權副喔氞釜喔權父喔� Microsoft Azure 喙佮弗喔� Google Cloud 喔佮赋喔ム副喔囙浮喔侧箑喔`箛喔о箚 喔權傅喙�',
+      price: '喔傕涪喔侧涪喙勦笖喙�',
+    },
+  },
+  vectorSpace: {
+    fullTip: '喙�喔о竵喙�喔曕腑喔`箤喔箑喔涏笅喙�喔曕箛喔�',
+    fullSolution: '喔副喔涏箑喔佮福喔斷箒喔溹笝喔傕腑喔囙竸喔膏笓喙�喔炧阜喙堗腑喙�喔炧复喙堗浮喔炧阜喙夃笝喔椸傅喙�',
+  },
+  apps: {
+    fullTipLine1: '喔副喔涏箑喔佮福喔斷箒喔溹笝喔傕腑喔囙竸喔膏笓喙�喔涏箛喔�',
+    fullTipLine2: '喔福喙夃覆喔囙箒喔笡喙�喔炧复喙堗浮喙�喔曕复喔�',
+    contactUs: '喔曕复喔斷笗喙堗腑喙�喔`覆',
+    fullTip2: '喔栢付喔囙競喔掂笖喔堗赋喔佮副喔斷競喔竾喙佮笢喔權箒喔ム箟喔�',
+    fullTip1: '喔副喔涏箑喔佮福喔斷箑喔炧阜喙堗腑喔福喙夃覆喔囙箒喔笡喙�喔炧复喙堗浮喙�喔曕复喔�',
+    fullTip1des: '喔勦父喔撪箘喔斷箟喔栢付喔囙競喔掂笖 喔堗赋喔佮副喔� 喔傕腑喔囙竵喔侧福喔福喙夃覆喔囙箒喔笡喙冟笝喙佮笢喔權笝喔掂箟喙佮弗喙夃抚',
+    fullTip2des: '喙佮笝喔班笝喔赤箖喔箟喔椸赋喔勦抚喔侧浮喔赴喔覆喔斷箒喔笡喔炧弗喔脆箑喔勦笂喔编笝喔椸傅喙堗箘喔∴箞喙冟笂喙夃竾喔侧笝喙�喔炧阜喙堗腑喙�喔炧复喙堗浮喔佮覆喔`箖喔娻箟喔囙覆喔� 喔福喔粪腑喔曕复喔斷笗喙堗腑喙�喔`覆',
+  },
+  annotatedResponse: {
+    fullTipLine1: '喔副喔涏箑喔佮福喔斷箒喔溹笝喔傕腑喔囙竸喔膏笓喙�喔涏箛喔�',
+    fullTipLine2: '喙冟釜喙堗竸喙嵿覆喔笜喔脆笟喔侧涪喔涏福喔班竵喔笟喔佮覆喔`釜喔權笚喔權覆喙�喔炧复喙堗浮喙�喔曕复喔�',
+    quotaTitle: '喙傕竸喔о笗喙夃覆喔曕腑喔氞竵喔ム副喔氞竸喙嵿覆喔笜喔脆笟喔侧涪喔涏福喔班竵喔笟',
+  },
+  usagePage: {
+    buildApps: '喔福喙夃覆喔囙箒喔笡',
+    annotationQuota: '喙傕竸喔о笗喔侧竵喔侧福喔涏福喔班竵喔侧辅',
+    documentsUploadQuota: '喙傕竸喔о笗喙夃覆喔佮覆喔`腑喔编笡喙傕斧喔ム笖喙�喔竵喔覆喔�',
+    teamMembers: '喔浮喔侧笂喔脆竵喙冟笝喔椸傅喔�',
+    vectorSpace: '喔佮覆喔`笀喔编笖喙�喔佮箛喔氞競喙夃腑喔∴腹喔ム竸喔о覆喔∴福喔灌箟',
+    vectorSpaceTooltip: '喙�喔竵喔覆喔`笚喔掂箞喙冟笂喙夃箓喔浮喔斷竵喔侧福喔堗副喔斷笚喔赤笖喔编笂喔權傅喔勦父喔撪笭喔侧笧喔腹喔囙笀喔班箖喔娻箟喔椸福喔编笧喔⑧覆喔佮福喙�喔佮箛喔氞競喙夃腑喔∴腹喔ム竸喔о覆喔∴福喔灌箟 喙�喔∴阜喙堗腑喔佮覆喔`箑喔佮箛喔氞競喙夃腑喔∴腹喔ム竸喔о覆喔∴福喔灌箟喔栢付喔囙競喔掂笖喔堗赋喔佮副喔� 喙�喔竵喔覆喔`箖喔浮喙堗笀喔班箘喔∴箞喔覆喔∴覆喔`笘喔副喔涏箓喔弗喔斷箘喔斷箟.',
+  },
+  teamMembers: '喔浮喔侧笂喔脆竵喙冟笝喔椸傅喔�',
+}
+
+export default translation
diff --git a/i18n/th-TH/common.ts b/i18n/th-TH/common.ts
new file mode 100644
index 0000000..9b72257
--- /dev/null
+++ b/i18n/th-TH/common.ts
@@ -0,0 +1,667 @@
+const translation = {
+  api: {
+    success: '喔勦抚喔侧浮喔箥喔侧箑喔`箛喔�',
+    actionSuccess: '喔佮覆喔`笖喙嵿覆喙�喔權复喔權竵喔侧福喔箥喔侧箑喔`箛喔�',
+    saved: '喔氞副喔權笚喔多竵',
+    create: '喔福喙夃覆喔�',
+    remove: '喔栢腹喔� 喙�喔覆 喔腑喔�',
+  },
+  operation: {
+    create: '喔福喙夃覆喔�',
+    confirm: '喔⑧阜喔權涪喔编笝',
+    cancel: '喔⑧竵喙�喔ム复喔�',
+    clear: '喙冟釜',
+    save: '喔涏福喔班斧喔⑧副喔�',
+    saveAndEnable: '喔氞副喔權笚喔多竵喙佮弗喔班箑喔涏复喔斷箖喔娻箟喔囙覆喔�',
+    edit: '喙佮竵喙夃箘喔�',
+    add: '喙�喔炧复喙堗浮',
+    added: '喙�喔炧复喙堗浮',
+    refresh: '喙�喔`复喙堗浮喙冟斧喔∴箞',
+    reset: '喔`傅 喙�喔嬥箛喔�',
+    search: '喔勦箟喔�',
+    change: '喙�喔涏弗喔掂箞喔⑧笝',
+    remove: '喔栢腑喔�',
+    send: '喔箞喔�',
+    copy: '喔ム腑喔�',
+    lineBreak: '喔曕副喔о箒喔氞箞喔囙笟喔`福喔椸副喔�',
+    sure: '喔夃副喔權箒喔權箞喙冟笀',
+    download: '喔斷覆喔о笝喙屶箓喔弗喔�',
+    delete: '喔ム笟',
+    settings: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆',
+    setup: '喔曕副喙夃竾 喔勦箞喔�',
+    getForFree: '喔`副喔氞笩喔`傅',
+    reload: '喙傕斧喔ム笖',
+    ok: '喔曕竵喔ム竾, 喙勦笖喙�',
+    log: '喔嬥父喔�',
+    learnMore: '喔ㄠ付喔佮俯喔侧箑喔炧复喙堗浮喙�喔曕复喔�',
+    params: '喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤',
+    duplicate: '喔赋喙�喔權覆',
+    rename: '喔曕副喙夃竾喔娻阜喙堗腑喙冟斧喔∴箞',
+    audioSourceUnavailable: 'AudioSource 喙勦浮喙堗笧喔`箟喔浮喙冟笂喙夃竾喔侧笝',
+    copyImage: '喔勦副喔斷弗喔竵喔`腹喔涏笭喔侧笧',
+    zoomOut: '喔嬥腹喔∴腑喔竵',
+    zoomIn: '喔嬥腹喔∴箑喔傕箟喔�',
+    openInNewTab: '喙�喔涏复喔斷箖喔權箒喔椸箛喔氞箖喔浮喙�',
+    view: '喔椸复喔о笚喔编辅喔權箤',
+    regenerate: '喔福喙夃覆喔囙箖喔浮喙�',
+    viewMore: '喔斷腹喙�喔炧复喙堗浮喙�喔曕复喔�',
+    saveAndRegenerate: '喔氞副喔權笚喔多竵喙佮弗喔班釜喔`箟喔侧竾喔佮箟喔笝喔⑧箞喔涪喙冟斧喔∴箞',
+    close: '喔涏复喔�',
+    skip: '喙�喔`阜喔�',
+    submit: '喔箞喔�',
+    imageCopied: '喔犩覆喔炧笚喔掂箞喔勦副喔斷弗喔竵',
+    deleteApp: '喔ム笟喙佮腑喔�',
+    copied: '喔勦副喔� 喔ム腑喔�',
+    viewDetails: '喔斷腹喔`覆喔⑧弗喔班箑喔傅喔⑧笖',
+    in: '喙冟笝',
+    format: '喔`腹喔涏箒喔氞笟',
+    downloadFailed: '喔斷覆喔о笝喙屶箓喔弗喔斷弗喙夃浮喙�喔弗喔� 喔佮福喔膏笓喔侧弗喔竾喔傅喔佮竸喔`副喙夃竾喙冟笝喔犩覆喔⑧斧喔ム副喔�.',
+    more: '喔∴覆喔佮競喔多箟喔�',
+    downloadSuccess: '喔斷覆喔о笝喙屶箓喔弗喔斷箑喔福喙囙笀喔复喙夃笝喙佮弗喙夃抚.',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 喙�喔涏箛喔權釜喔脆箞喔囙笀喙嵿覆喙�喔涏箛喔�',
+    urlError: 'url 喔勦抚喔`競喔多箟喔權笗喙夃笝喔斷箟喔о涪 http:// 喔福喔粪腑 https://',
+  },
+  placeholder: {
+    input: '喔佮福喔膏笓喔侧竵喔`腑喔�',
+    select: '喔佮福喔膏笓喔侧箑喔ム阜喔竵',
+  },
+  voice: {
+    language: {
+      zhHans: '喔堗傅喔�',
+      zhHant: '喔犩覆喔┼覆喔堗傅喔權笗喔编抚喙�喔曕箛喔�',
+      enUS: '喔副喔囙竵喔む俯',
+      deDE: '喙�喔⑧腑喔`浮喔编笝',
+      frFR: '喔澿福喔编箞喔囙箑喔ㄠ釜',
+      esES: '喔箑喔涏笝',
+      itIT: '喔复喔曕覆喔ム傅',
+      thTH: '喙勦笚喔�',
+      idID: '喔复喔權箓喔斷笝喔掂箑喔嬥傅喔�',
+      jaJP: '喔嵿傅喙堗笡喔膏箞喔�',
+      koKR: '喙�喔佮覆喔弗喔�',
+      ptBR: '喙傕笡喔`笗喔膏箑喔佮釜',
+      ruRU: '喔`副喔箑喔嬥傅喔�',
+      ukUA: '喔⑧腹喙�喔勦福喔�',
+      viVN: '喙�喔о傅喔⑧笖喔權覆喔�',
+      plPL: '喙傕笡喙佮弗喔權笖喙�',
+      roRO: '喙傕福喔∴覆喙�喔權傅喔�',
+      hiIN: '喔复喔權笖喔�',
+      trTR: '喔曕父喔`竵喔�',
+      faIR: '喔犩覆喔┼覆喙�喔涏腑喔`箤喙�喔嬥傅喔�',
+    },
+  },
+  unit: {
+    char: '喔`笘 喔栢副喔�',
+  },
+  actionMsg: {
+    noModification: '喙勦浮喙堗浮喔掂竵喔侧福喔斷副喔斷箒喔涏弗喔囙箖喔權競喔撪赴喔權傅喙�',
+    modifiedSuccessfully: '喙佮竵喙夃箘喔傕釜喙嵿覆喙�喔`箛喔堗箒喔ム箟喔�',
+    modifiedUnsuccessfully: '喙佮竵喙夃箘喔傕箘喔∴箞喔箥喔侧箑喔`箛喔�',
+    copySuccessfully: '喔勦副喔斷弗喔竵喔箥喔侧箑喔`箛喔堗箒喔ム箟喔�',
+    paySucceeded: '喔佮覆喔`笂喙嵿覆喔`赴喙�喔囙复喔權釜喙嵿覆喙�喔`箛喔�',
+    payCancelled: '喔⑧竵喙�喔ム复喔佮竵喔侧福喔娻箥喔侧福喔班箑喔囙复喔�',
+    generatedSuccessfully: '喔福喙夃覆喔囙釜喙嵿覆喙�喔`箛喔�',
+    generatedUnsuccessfully: '喔福喙夃覆喔囙箘喔∴箞喔箥喔侧箑喔`箛喔�',
+  },
+  model: {
+    params: {
+      temperature: '喔父喔撪斧喔犩腹喔∴复',
+      temperatureTip: '喔勦抚喔氞竸喔膏浮喔佮覆喔`釜喔膏箞喔�: 喔佮覆喔`弗喔斷福喔班笖喔编笟喔箞喔囙笢喔ム箖喔箟喔佮覆喔`釜喔膏箞喔∴箑喔福喙囙笀喔權箟喔涪喔ム竾 喙�喔∴阜喙堗腑喔父喔撪斧喔犩腹喔∴复喙�喔傕箟喔侧箖喔佮弗喙夃辅喔灌笝喔⑧箤喙佮笟喔氞笀喙嵿覆喔ム腑喔囙笀喔班竵喔ム覆喔⑧箑喔涏箛喔權竵喔侧福喔佮箥喔侧斧喔權笖喙佮弗喔班笅喙夃箥喔侧笅喔侧竵',
+      top_p: '喔椸箛喔笡 P',
+      top_pTip: '喔勦抚喔氞竸喔膏浮喔勦抚喔侧浮喔弗喔侧竵喔弗喔侧涪喔溹箞喔侧笝喔佮覆喔`釜喔膏箞喔∴笗喔编抚喔涪喙堗覆喔囙笝喔脆抚喙�喔勦弗喔掂涪喔�: 0.5 喔浮喔侧涪喔栢付喔囙竸喔`付喙堗竾喔笝喔多箞喔囙競喔竾喔曕副喔о箑喔ム阜喔竵喔椸傅喙堗笘喙堗抚喔囙笝喙夃箥喔侧斧喔權副喔佮竸喔о覆喔∴笝喙堗覆喔堗赴喙�喔涏箛喔權笚喔编箟喔囙斧喔∴笖喙勦笖喙夃福喔编笟喔佮覆喔`笧喔脆笀喔侧福喔撪覆',
+      presence_penalty: '喔氞笚喔ム竾喙傕笚喔┼竵喔侧福喙佮釜喔斷竾喔曕笝',
+      presence_penaltyTip: '喔堗赴喔ム竾喙傕笚喔┼箓喔椸箑喔勦箛喔權箖喔浮喙堗箑喔椸箞喔侧箖喔斷箓喔斷涪喔炧复喔堗覆喔`笓喔侧笀喔侧竵喔о箞喔侧箓喔椸箑喔勦箛喔權箑喔弗喙堗覆喔權副喙夃笝喔涏福喔侧竵喔忇箖喔權競喙夃腑喔勦抚喔侧浮喔福喔粪腑喙勦浮喙圽n喙�喔炧复喙堗浮喙傕腑喔佮覆喔競喔竾喙傕浮喙�喔斷弗喙冟笝喔佮覆喔`笧喔灌笖喔勦父喔⑧箑喔佮傅喙堗涪喔о竵喔编笟喔副喔о競喙夃腑喙冟斧喔∴箞',
+      frequency_penalty: '喔氞笚喔ム竾喙傕笚喔┼竸喔о覆喔∴笘喔掂箞',
+      frequency_penaltyTip: '喔堗赴喔ム竾喙傕笚喔┼箓喔椸箑喔勦箛喔權箖喔浮喙堗箑喔椸箞喔侧箖喔斷笗喔侧浮喔勦抚喔侧浮喔栢傅喙堗笚喔掂箞喔∴傅喔涪喔灌箞喙冟笝喔傕箟喔竸喔о覆喔∴笀喔權笘喔多竾喔曕腑喔權笝喔掂箟\n喔ム笖喙傕腑喔佮覆喔競喔竾喙傕浮喙�喔斷弗喔椸傅喙堗笀喔班笚喙嵿覆喔嬥箟喙嵿覆喔氞福喔`笚喔编笖喙�喔斷复喔∴箒喔氞笟喔勦箥喔侧笗喙堗腑喔勦箥喔�',
+      max_tokens: '喙傕笚喙�喔勦箛喔權釜喔灌竾喔父喔�',
+      max_tokensTip: '喙冟笂喙夃箑喔炧阜喙堗腑喔堗箥喔侧竵喔编笖喔勦抚喔侧浮喔⑧覆喔о釜喔灌竾喔父喔斷競喔竾喔佮覆喔`笗喔笟喔佮弗喔编笟喙�喔涏箛喔權箓喔椸箑喔勦箛喔� \n喔勦箞喔侧笚喔掂箞喙冟斧喔嵿箞喔傕付喙夃笝喔覆喔堗笀喙嵿覆喔佮副喔斷笧喔粪箟喔權笚喔掂箞喔椸傅喙堗箑喔弗喔粪腑喔箥喔侧斧喔`副喔氞竸喙嵿覆喔炧福喙夃腑喔∴笚喙� 喔氞副喔權笚喔多竵喔佮覆喔`箒喔娻笚 喙佮弗喔班竸喔о覆喔∴福喔灌箟 \n喔傕腑喙佮笝喔班笝喙嵿覆喙冟斧喙夃笗喔编箟喔囙竸喙堗覆喔曕箞喙嵿覆喔佮抚喙堗覆喔腑喔囙箖喔權釜喔侧浮\nGPT-4-1106-preview, GPT-4-Vision-Preview 喙傕笚喙�喔勦箛喔權釜喔灌竾喔父喔� (喔复喔權笧喔膏笗 128K 喙�喔覆喔曕箤喔炧父喔� 4K)',
+      maxTokenSettingTip: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喙傕笚喙�喔勦箛喔權釜喔灌竾喔父喔斷競喔竾喔勦父喔撪釜喔灌竾 喔嬥付喙堗竾喔覆喔堗笀喙嵿覆喔佮副喔斷笧喔粪箟喔權笚喔掂箞喔箥喔侧斧喔`副喔氞競喙夃腑喔勦抚喔侧浮喙佮笀喙夃竾 喙佮笟喔氞釜喔笟喔栢覆喔� 喙佮弗喔班競喙夃腑喔∴腹喔� 喔炧复喔堗覆喔`笓喔侧笗喔编箟喔囙竸喙堗覆喙冟斧喙夃笗喙堗箥喔侧竵喔о箞喔� 2/3',
+      setToCurrentModelMaxTokenTip: '喙傕笚喙�喔勦箛喔權釜喔灌竾喔父喔斷箘喔斷箟喔`副喔氞竵喔侧福喔副喔涏箑喔斷笗喙�喔涏箛喔權箓喔椸箑喔勦箛喔權釜喔灌竾喔父喔� 80% 喔傕腑喔囙福喔膏箞喔權笡喔编笀喔堗父喔氞副喔� {{maxToken}}',
+      stop_sequences: '喔涪喔膏笖喔ム箥喔侧笖喔编笟',
+      stop_sequencesTip: '喔腹喔囙釜喔膏笖喔傅喙堗弗喙嵿覆喔斷副喔氞笚喔掂箞 API 喔堗赴喔涪喔膏笖喔福喙夃覆喔囙箓喔椸箑喔勦箛喔權箑喔炧复喙堗浮喙�喔曕复喔� 喔傕箟喔竸喔о覆喔∴笚喔掂箞喔箞喔囙竸喔粪笝喔堗赴喙勦浮喙堗浮喔掂弗喙嵿覆喔斷副喔氞竵喔侧福喔涪喔膏笖',
+      stop_sequencesPlaceholder: '喔涏箟喔笝喔ム箥喔侧笖喔编笟喙佮弗喙夃抚喔佮笖 Tab',
+    },
+    tone: {
+      Creative: '喔福喙夃覆喔囙釜喔`福喔勦箤',
+      Balanced: '喔浮喔斷父喔�',
+      Precise: '喔栢腹喔佮笗喙夃腑喔�',
+      Custom: '喔樴福喔`浮喙�喔權傅喔⑧浮',
+    },
+    addMoreModel: '喙勦笡喔椸傅喙堗竵喔侧福喔曕副喙夃竾喔勦箞喔侧箑喔炧阜喙堗腑喙�喔炧复喙堗浮喔`父喙堗笝喙�喔炧复喙堗浮喙�喔曕复喔�',
+    settingsLink: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔溹腹喙夃箖喔箟喔氞福喔脆竵喔侧福喙傕浮喙�喔斷弗',
+    capabilities: '喔勦抚喔侧浮喔覆喔∴覆喔`笘喔弗喔侧涪喔`腹喔涏箒喔氞笟',
+  },
+  menus: {
+    status: 'Beta',
+    explore: '喔箥喔侧福喔о笀',
+    apps: '喙�喔`傅喔⑧笝',
+    plugins: '喔涏弗喔编箠喔佮腑喔脆笝',
+    pluginsTips: '喔`抚喔∴笡喔ム副喙娻竵喔复喔權競喔竾喔氞父喔勦竸喔ム笚喔掂箞喔覆喔∴斧喔`阜喔釜喔`箟喔侧竾喔涏弗喔编箠喔佮腑喔脆笝 AI 喔椸傅喙堗箑喔傕箟喔侧竵喔编笝喙勦笖喙夃竵喔编笟 ChatGPT',
+    datasets: '喔勦抚喔侧浮喔`腹喙�',
+    datasetsTips: '喙�喔`箛喔� 喙� 喔權傅喙�: 喔權箥喔侧箑喔傕箟喔侧競喙夃腑喔∴腹喔ム競喙夃腑喔勦抚喔侧浮喔傕腑喔囙竸喔膏笓喙�喔竾喔福喔粪腑喙�喔傕傅喔⑧笝喔傕箟喔浮喔灌弗喙佮笟喔氞箑喔`傅喔⑧弗喙勦笚喔∴箤喔溹箞喔侧笝 Webhook 喙�喔炧阜喙堗腑喔涏福喔编笟喔涏福喔膏竾喔氞福喔脆笟喔� LLM',
+    newApp: '喙佮腑喔炧箖喔浮喙�',
+    newDataset: '喔福喙夃覆喔囙竸喔о覆喔∴福喔灌箟',
+    tools: '喙�喔勦福喔粪箞喔竾 喔∴阜喔�',
+    exploreMarketplace: '喔箥喔侧福喔о笀 Marketplace',
+  },
+  userProfile: {
+    settings: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆',
+    emailSupport: '喔佮覆喔`釜喔權副喔氞釜喔權父喔權笚喔侧竾喔傅喙�喔∴弗',
+    workspace: '喔炧阜喙夃笝喔椸傅喙�',
+    createWorkspace: '喔福喙夃覆喔囙笧喔粪箟喔權笚喔掂箞喔椸箥喔侧竾喔侧笝',
+    helpCenter: '喔о复喔樴傅喙冟笂喙�',
+    communityFeedback: '喔佮覆喔`笗喔笟喔笝喔竾',
+    roadmap: '喙佮笢喔權竾喔侧笝',
+    community: '喔娻父喔∴笂喔�',
+    about: '喔涏福喔班浮喔侧笓',
+    logout: '喔腑喔佮笀喔侧竵喔`赴喔氞笟',
+    github: 'GitHub',
+    compliance: '喔佮覆喔`笡喔忇复喔氞副喔曕复喔曕覆喔∴競喙夃腑喔佮赋喔笝喔�',
+    support: '喔佮覆喔`釜喔權副喔氞釜喔權父喔�',
+  },
+  settings: {
+    accountGroup: '喔椸副喙堗抚喙勦笡',
+    workplaceGroup: '喔炧阜喙夃笝喔椸傅喙�',
+    account: '喔氞副喔嵿笂喔掂競喔竾喔夃副喔�',
+    members: '喔浮喔侧笂喔脆竵',
+    billing: '喙�喔`傅喔⑧竵 喙�喔佮箛喔� 喙�喔囙复喔�',
+    integrations: '喔氞腹喔`笓喔侧竵喔侧福',
+    language: '喔犩覆喔┼覆',
+    provider: '喔溹腹喙夃箖喔箟喔氞福喔脆竵喔侧福喙傕浮喙�喔斷弗',
+    dataSource: '喙佮斧喔ム箞喔囙競喙夃腑喔∴腹喔�',
+    plugin: '喔涏弗喔编箠喔佮腑喔脆笝',
+    apiBasedExtension: '喔箞喔о笝喔傕涪喔侧涪 API',
+    generalGroup: '喔椸副喙堗抚喙勦笡',
+  },
+  account: {
+    account: '喔氞副喔嵿笂喔�',
+    myAccount: '喔氞副喔嵿笂喔掂競喔竾喔夃副喔�',
+    studio: 'Dify 喔笗喔灌笖喔脆箓喔�',
+    avatar: '喔抚喔曕覆喔�',
+    name: '喔娻阜喙堗腑',
+    email: '喔傅喙�喔∴弗',
+    password: '喔`斧喔编釜喔溹箞喔侧笝',
+    passwordTip: '喔勦父喔撪釜喔侧浮喔侧福喔栢笗喔编箟喔囙福喔副喔笢喙堗覆喔權笘喔侧抚喔`箘喔斷箟喔覆喔佮竸喔膏笓喙勦浮喙堗笗喙夃腑喔囙竵喔侧福喙冟笂喙夃福喔副喔箑喔傕箟喔侧釜喔灌箞喔`赴喔氞笟喔娻副喙堗抚喔勦福喔侧抚',
+    setPassword: '喔曕副喙夃竾喔`斧喔编釜喔溹箞喔侧笝',
+    resetPassword: '喔`傅喙�喔嬥箛喔曕福喔副喔笢喙堗覆喔�',
+    currentPassword: '喔`斧喔编釜喔溹箞喔侧笝喔涏副喔堗笀喔膏笟喔编笝',
+    newPassword: '喔`斧喔编釜喔溹箞喔侧笝喙冟斧喔∴箞',
+    confirmPassword: '喔⑧阜喔權涪喔编笝喔`斧喔编釜喔溹箞喔侧笝',
+    notEqual: '喔`斧喔编釜喔溹箞喔侧笝喔腑喔囙福喔副喔笢喙堗覆喔權箒喔曕竵喔曕箞喔侧竾喔佮副喔�',
+    langGeniusAccount: '喔氞副喔嵿笂喔� Dify',
+    langGeniusAccountTip: '喔氞副喔嵿笂喔� Dify 喙佮弗喔班競喙夃腑喔∴腹喔ム笢喔灌箟喙冟笂喙夃笚喔掂箞喙�喔佮傅喙堗涪喔о競喙夃腑喔�',
+    editName: '喙佮竵喙夃箘喔傕笂喔粪箞喔�',
+    showAppLength: '喙佮釜喔斷竾 {{length}} 喙佮腑喔�',
+    delete: '喔ム笟喔氞副喔嵿笂喔�',
+    deleteTip: '喔佮覆喔`弗喔氞笟喔编笉喔娻傅喔傕腑喔囙竸喔膏笓喔堗赴喙�喔涏箛喔權竵喔侧福喔ム笟喔傕箟喔浮喔灌弗喔椸副喙夃竾喔浮喔斷競喔竾喔勦父喔撪腑喔⑧箞喔侧竾喔栢覆喔о福喙佮弗喔班箘喔∴箞喔覆喔∴覆喔`笘喔佮腹喙夃竸喔粪笝喙勦笖喙�',
+    deleteConfirmTip: '喙�喔炧阜喙堗腑喔⑧阜喔權涪喔编笝 喙傕笡喔`笖喔箞喔囙競喙夃腑喔∴腹喔ム笗喙堗腑喙勦笡喔權傅喙夃笀喔侧竵喔傅喙�喔∴弗喔椸傅喙堗弗喔囙笚喔班箑喔氞傅喔⑧笝喙勦抚喙夃笚喔掂箞',
+    deletePrivacyLinkTip: '喔箥喔侧斧喔`副喔氞競喙夃腑喔∴腹喔ム箑喔炧复喙堗浮喙�喔曕复喔∴箑喔佮傅喙堗涪喔о竵喔编笟喔о复喔樴傅喔椸傅喙堗箑喔`覆喔堗副喔斷竵喔侧福喔佮副喔氞競喙夃腑喔∴腹喔ム競喔竾喔勦父喔� 喙傕笡喔`笖喔斷腹喔椸傅喙�',
+    deletePrivacyLink: '喔權箓喔⑧笟喔侧涪喔勦抚喔侧浮喙�喔涏箛喔權釜喙堗抚喔權笗喔编抚',
+    deleteLabel: '喙�喔炧阜喙堗腑喔⑧阜喔權涪喔编笝 喙傕笡喔`笖喔炧复喔∴笧喙屶腑喔掂箑喔∴弗喔傕腑喔囙竸喔膏笓喔斷箟喔侧笝喔ム箞喔侧竾',
+    deletePlaceholder: '喔佮福喔膏笓喔侧竵喔`腑喔佮腑喔掂箑喔∴弗喔傕腑喔囙竸喔膏笓',
+    sendVerificationButton: '喔箞喔囙福喔副喔涪喔粪笝喔⑧副喔�',
+    verificationLabel: '喔`斧喔编釜喔⑧阜喔權涪喔编笝',
+    verificationPlaceholder: '喔о覆喔囙福喔副喔� 6 喔弗喔编竵',
+    permanentlyDeleteButton: '喔ム笟喔氞副喔嵿笂喔掂腑喔⑧箞喔侧竾喔栢覆喔о福',
+    feedbackTitle: '喔佮覆喔`笗喔笟喔笝喔竾',
+    feedbackLabel: '喔氞腑喔佮箑喔`覆喔о箞喔侧笚喙嵿覆喙勦浮喔勦父喔撪笘喔多竾喔ム笟喔氞副喔嵿笂喔掂競喔竾喔勦父喔�',
+    feedbackPlaceholder: '喙�喔福喔脆浮',
+    deleteSuccessTip: '喔氞副喔嵿笂喔掂競喔竾喔勦父喔撪笗喙夃腑喔囙箖喔娻箟喙�喔о弗喔侧箖喔權竵喔侧福喔ム笟喙冟斧喙夃箑喔福喙囙笀喔复喙夃笝 喙�喔`覆喔堗赴喔箞喔囙腑喔掂箑喔∴弗喔栢付喔囙竸喔膏笓喙�喔∴阜喙堗腑喔椸父喔佮腑喔⑧箞喔侧竾喙�喔福喙囙笀喔复喙夃笝',
+    workspaceIcon: '喙勦腑喔勦腑喔權笧喔粪箟喔權笚喔掂箞喔椸赋喔囙覆喔�',
+    editWorkspaceInfo: '喙佮竵喙夃箘喔傕競喙夃腑喔∴腹喔ム箑喔о复喔`箤喔佮釜喙�喔涏笅',
+    workspaceName: '喔娻阜喙堗腑喔炧阜喙夃笝喔椸傅喙堗笚喔赤竾喔侧笝',
+  },
+  members: {
+    team: '喔椸傅喔�',
+    invite: '喙�喔炧复喙堗浮',
+    name: '喔娻阜喙堗腑',
+    lastActive: '喙冟笂喙夃竾喔侧笝喔ム箞喔侧釜喔膏笖',
+    role: '喔氞笚喔氞覆喔�',
+    pending: '喔`腑   ',
+    owner: '喙�喔堗箟喔侧競喔竾',
+    admin: '喔溹腹喙夃笖喔灌箒喔ム福喔班笟喔�',
+    adminTip: '喔覆喔∴覆喔`笘喔福喙夃覆喔囙箒喔笧喙佮弗喔班笀喔编笖喔佮覆喔`竵喔侧福喔曕副喙夃竾喔勦箞喔侧笚喔掂浮喙勦笖喙�',
+    normal: '喔涏竵喔曕复',
+    normalTip: '喙冟笂喙夃箘喔斷箟喙�喔夃笧喔侧赴喙佮腑喔� 喔福喙夃覆喔囙箒喔笧喙勦浮喙堗箘喔斷箟',
+    builder: '喔溹腹喙夃釜喔`箟喔侧竾',
+    builderTip: '喔覆喔∴覆喔`笘喔福喙夃覆喔囙箒喔ム赴喙佮竵喙夃箘喔傕箒喔笡喔傕腑喔囙笗喔编抚喙�喔竾喙勦笖喙�',
+    editor: '喔氞福喔`笓喔侧笜喔脆竵喔侧福',
+    editorTip: '喔覆喔∴覆喔`笘喔福喙夃覆喔囙箒喔ム赴喙佮竵喙夃箘喔傕箒喔笡喙勦笖喙�',
+    datasetOperator: '喔溹腹喙夃笖喔灌箒喔ム福喔班笟喔氞竸喔о覆喔∴福喔灌箟',
+    datasetOperatorTip: '喔覆喔∴覆喔`笘喔堗副喔斷竵喔侧福喔愢覆喔權竸喔о覆喔∴福喔灌箟喙勦笖喙夃箑喔椸箞喔侧笝喔编箟喔�',
+    inviteTeamMember: '喙�喔炧复喙堗浮喔浮喔侧笂喔脆竵喙冟笝喔椸傅喔�',
+    inviteTeamMemberTip: '喔炧抚喔佮箑喔傕覆喔覆喔∴覆喔`笘喙�喔傕箟喔侧笘喔多竾喔傕箟喔浮喔灌弗喔椸傅喔∴競喔竾喔勦父喔撪箘喔斷箟喙傕笖喔⑧笗喔`竾喔弗喔编竾喔堗覆喔佮弗喔囙笂喔粪箞喔箑喔傕箟喔侧箖喔娻箟',
+    emailNotSetup: '喙�喔嬥复喔`箤喔熰箑喔о腑喔`箤喔傅喙�喔∴弗喙勦浮喙堗箘喔斷箟喔曕副喙夃竾喔勦箞喔侧箘喔о箟 喔堗付喔囙箘喔∴箞喔覆喔∴覆喔`笘喔箞喔囙腑喔掂箑喔∴弗喙�喔娻复喔嵿箘喔斷箟 喔佮福喔膏笓喔侧箒喔堗箟喔囙笢喔灌箟喙冟笂喙夃箑喔佮傅喙堗涪喔о竵喔编笟喔ム复喔囙竵喙屶箑喔娻复喔嵿笚喔掂箞喔堗赴喔腑喔佮斧喔ム副喔囙笀喔侧竵喔佮覆喔`箑喔娻复喔嵿箒喔椸笝',
+    email: '喔傅喙�喔∴弗',
+    emailInvalid: '喔`腹喔涏箒喔氞笟喔傅喙�喔∴弗喙勦浮喙堗笘喔灌竵喔曕箟喔竾',
+    emailPlaceholder: '喔佮福喔膏笓喔侧竵喔`腑喔佮腑喔掂箑喔∴弗',
+    sendInvite: '喔箞喔囙竸喙嵿覆喙�喔娻复喔�',
+    invitedAsRole: '喙勦笖喙夃福喔编笟喙�喔娻复喔嵿箖喔箟喙�喔涏箛喔權笢喔灌箟喙冟笂喙� {{role}}',
+    invitationSent: '喔箞喔囙竸喙嵿覆喙�喔娻复喔嵿箒喔ム箟喔�',
+    invitationSentTip: '喔箞喔囙竸喙嵿覆喙�喔娻复喔嵿箒喔ム箟喔� 喙佮弗喔班笧喔о竵喙�喔傕覆喔覆喔∴覆喔`笘喔ム竾喔娻阜喙堗腑喙�喔傕箟喔侧箖喔娻箟 Dify 喙�喔炧阜喙堗腑喙�喔傕箟喔侧笘喔多竾喔傕箟喔浮喔灌弗喔椸傅喔∴競喔竾喔勦父喔撪箘喔斷箟',
+    invitationLink: '喔ム复喔囙竸喙屶竸喙嵿覆喙�喔娻复喔�',
+    failedInvitationEmails: '喔溹腹喙夃箖喔娻箟喔斷箟喔侧笝喔ム箞喔侧竾喙勦浮喙堗箘喔斷箟喔`副喔氞箑喔娻复喔嵿釜喙嵿覆喙�喔`箛喔�',
+    ok: '喔曕竵喔ム竾, 喙勦笖喙�',
+    removeFromTeam: '喔ム笟喔腑喔佮笀喔侧竵喔椸傅喔�',
+    removeFromTeamTip: '喔堗赴喔ム笟喔佮覆喔`箑喔傕箟喔侧笘喔多竾喔傕腑喔囙笚喔掂浮',
+    setAdmin: '喔曕副喙夃竾喙�喔涏箛喔權笢喔灌箟喔斷腹喙佮弗喔`赴喔氞笟',
+    setMember: '喔曕副喙夃竾喙�喔涏箛喔權釜喔∴覆喔娻复喔佮釜喔侧浮喔编笉',
+    setBuilder: '喔曕副喙夃竾喙�喔涏箛喔權笢喔灌箟喔福喙夃覆喔�',
+    setEditor: '喔曕副喙夃竾喔勦箞喔侧箑喔涏箛喔權笗喔编抚喙佮竵喙夃箘喔�',
+    disInvite: '喔⑧竵喙�喔ム复喔佮竸喙嵿覆喙�喔娻复喔�',
+    deleteMember: '喔ム笟喔浮喔侧笂喔脆竵',
+    you: '(喔勦父喔�)',
+  },
+  integrations: {
+    connected: '喙�喔娻阜喙堗腑喔� 喔曕箞喔�',
+    google: '喔佮腹喙�喔佮复喔�',
+    googleAccount: '喙�喔傕箟喔侧釜喔灌箞喔`赴喔氞笟喔斷箟喔о涪喔氞副喔嵿笂喔� Google',
+    github: '喙�喔佮抚喔�',
+    githubAccount: '喙�喔傕箟喔侧釜喔灌箞喔`赴喔氞笟喔斷箟喔о涪喔氞副喔嵿笂喔� GitHub',
+    connect: '喔曕复喔�',
+  },
+  language: {
+    displayLanguage: '喔犩覆喔┼覆喔椸傅喙堗箒喔笖喔�',
+    timezone: '喙�喔傕笗喙�喔о弗喔�',
+  },
+  provider: {
+    apiKey: '喔勦傅喔⑧箤 API',
+    enterYourKey: '喔涏箟喔笝喔勦傅喔⑧箤 API 喔傕腑喔囙竸喔膏笓喔椸傅喙堗笝喔掂箞',
+    invalidKey: '喔勦傅喔⑧箤 OpenAI API 喙勦浮喙堗笘喔灌竵喔曕箟喔竾',
+    validatedError: '喔佮覆喔`笗喔`抚喔堗釜喔笟喔ム箟喔∴箑喔弗喔�:',
+    validating: '喔佮箥喔侧弗喔编竾喔曕福喔о笀喔腑喔氞竸喔о覆喔∴笘喔灌竵喔曕箟喔竾喔傕腑喔囙竸喔掂涪喙�...',
+    saveFailed: '喔氞副喔權笚喔多竵喔勦傅喔⑧箤 API 喔ム箟喔∴箑喔弗喔�',
+    apiKeyExceedBill: '喔勦傅喔⑧箤 API 喔權傅喙夃箘喔∴箞喔∴傅喙傕竸喔о笗喙夃覆 喙傕笡喔`笖喔箞喔侧笝',
+    addKey: '喙�喔炧复喙堗浮喔勦傅喔⑧箤',
+    comingSoon: '喙�喔`箛喔� 喙� 喔權傅喙�',
+    editKey: '喙佮竵喙夃箘喔�',
+    invalidApiKey: '喔勦傅喔⑧箤 API 喙勦浮喙堗笘喔灌竵喔曕箟喔竾',
+    azure: {
+      apiBase: '喔愢覆喔� API',
+      apiBasePlaceholder: 'URL 喔愢覆喔� API 喔傕腑喔囙笡喔ム覆喔⑧笚喔侧竾 Azure OpenAI 喔傕腑喔囙竸喔膏笓',
+      apiKey: '喔勦傅喔⑧箤 API',
+      apiKeyPlaceholder: '喔涏箟喔笝喔勦傅喔⑧箤 API 喔傕腑喔囙竸喔膏笓喔椸傅喙堗笝喔掂箞',
+      helpTip: '喙�喔`傅喔⑧笝喔`腹喙夃笟喔`复喔佮覆喔� Azure OpenAI',
+    },
+    openaiHosted: {
+      openaiHosted: '喙傕府喔笗喙� OpenAI',
+      onTrial: '喔椸笖喔ム腑喔囙箖喔娻箟',
+      exhausted: '喙傕竸喔о笗喙夃覆喔浮喔�',
+      desc: '喔氞福喔脆竵喔侧福喙傕府喔笗喔脆箟喔� OpenAI 喔椸傅喙堗箖喔箟喔氞福喔脆竵喔侧福喙傕笖喔� Dify 喔娻箞喔о涪喙冟斧喙夃竸喔膏笓喙冟笂喙夃箓喔∴箑喔斷弗喔曕箞喔侧竾喙� 喙�喔娻箞喔� GPT-3.5 喔佮箞喔笝喔椸傅喙堗箓喔勦抚喔曕箟喔侧竵喔侧福喔椸笖喔ム腑喔囙箖喔娻箟喔傕腑喔囙竸喔膏笓喔堗赴喔浮喔� 喔勦父喔撪笀喙嵿覆喙�喔涏箛喔權笗喙夃腑喔囙笗喔编箟喔囙竸喙堗覆喔溹腹喙夃箖喔箟喔氞福喔脆竵喔侧福喔`父喙堗笝喔阜喙堗笝喙�',
+      callTimes: '喙�喔о弗喔侧箓喔椸福',
+      usedUp: '喙傕竸喔о笗喙夃覆喔椸笖喔ム腑喔囙箖喔娻箟喔浮喔� 喙�喔炧复喙堗浮喔溹腹喙夃箖喔箟喔氞福喔脆竵喔侧福喙傕浮喙�喔斷弗喔傕腑喔囙笗喔编抚喙�喔竾',
+      useYourModel: '喔涏副喔堗笀喔膏笟喔编笝喙冟笂喙夃笢喔灌箟喙冟斧喙夃笟喔`复喔佮覆喔`箓喔∴箑喔斷弗喔傕腑喔囙笗喔编抚喙�喔竾',
+      close: '喔涏复喔�',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Claude 喔∴覆喔權父喔┼涪喔о复喔椸涪喔�',
+      onTrial: '喔椸笖喔ム腑喔囙箖喔娻箟',
+      exhausted: '喙傕竸喔о笗喙夃覆喔浮喔�',
+      desc: '喙傕浮喙�喔斷弗喔椸傅喙堗笚喔`竾喔炧弗喔编竾喔嬥付喙堗竾喙�喔佮箞喔囙箖喔權竾喔侧笝喔椸傅喙堗斧喔ム覆喔佮斧喔ム覆喔⑧笗喔编箟喔囙箒喔曕箞喔氞笚喔笝喔椸笝喔侧笚喔掂箞喔嬥副喔氞笅喙夃腑喔權箒喔ム赴喔佮覆喔`釜喔`箟喔侧竾喙�喔權阜喙夃腑喔覆喔椸傅喙堗釜喔`箟喔侧竾喔福喔`竸喙屶箘喔涏笀喔權笘喔多竾喔勦箥喔侧箒喔權赴喔權箥喔侧箓喔斷涪喔ム赴喙�喔傅喔⑧笖',
+      callTimes: '喙�喔о弗喔侧箓喔椸福',
+      usedUp: '喙傕竸喔о笗喙夃覆喔椸笖喔ム腑喔囙箖喔娻箟喔浮喔� 喙�喔炧复喙堗浮喔溹腹喙夃箖喔箟喔氞福喔脆竵喔侧福喙傕浮喙�喔斷弗喔傕腑喔囙笗喔编抚喙�喔竾',
+      useYourModel: '喔涏副喔堗笀喔膏笟喔编笝喙冟笂喙夃笢喔灌箟喙冟斧喙夃笟喔`复喔佮覆喔`箓喔∴箑喔斷弗喔傕腑喔囙笗喔编抚喙�喔竾',
+      close: '喔涏复喔�',
+      trialQuotaTip: '喙傕竸喔о笗喙夃覆喔佮覆喔`笚喔斷弗喔竾喙冟笂喙� Anthropic 喔傕腑喔囙竸喔膏笓喔堗赴喔浮喔斷腑喔侧涪喔膏箖喔權抚喔编笝喔椸傅喙� 2025/03/11 喙佮弗喔班笀喔班箘喔∴箞喔覆喔∴覆喔`笘喙冟笂喙夃竾喔侧笝喙勦笖喙夃腑喔掂竵喔曕箞喔箘喔涏斧喔ム副喔囙笀喔侧竵喔權副喙夃笝喙傕笡喔`笖喙冟笂喙夃浮喔编笝喙冟斧喙夃笚喔编笝喙�喔о弗喔�',
+    },
+    anthropic: {
+      using: '喔勦抚喔侧浮喔覆喔∴覆喔`笘喙冟笝喔佮覆喔`笣喔编竾喔佮箥喔侧弗喔编竾喙冟笂喙�',
+      enableTip: '喙冟笝喔佮覆喔`箑喔涏复喔斷箖喔娻箟喔囙覆喔權箓喔∴箑喔斷弗 Anthropic 喔勦父喔撪笗喙夃腑喔囙笢喔灌竵喔佮副喔� OpenAI 喔福喔粪腑 Azure OpenAI Service 喔佮箞喔笝',
+      notEnabled: '喙勦浮喙堗箘喔斷箟喙�喔涏复喔斷箖喔娻箟喔囙覆喔�',
+      keyFrom: '喔`副喔氞竸喔掂涪喙� API 喔傕腑喔囙竸喔膏笓喔堗覆喔� Anthropic',
+    },
+    encrypted: {
+      front: '喔勦傅喔⑧箤 API 喔傕腑喔囙竸喔膏笓喔堗赴喔栢腹喔佮箑喔傕箟喔侧福喔副喔箒喔ム赴喔堗副喔斷箑喔佮箛喔氞箓喔斷涪喙冟笂喙�',
+      back: '喙�喔椸竸喙傕笝喙傕弗喔⑧傅 ',
+    },
+  },
+  modelProvider: {
+    notConfigured: '喙傕浮喙�喔斷弗喔`赴喔氞笟喔⑧副喔囙箘喔∴箞喙勦笖喙夃福喔编笟喔佮覆喔`竵喙嵿覆喔笝喔斷竸喙堗覆喔涪喙堗覆喔囙釜喔∴笟喔灌福喔撪箤 喙佮弗喔班笩喔编竾喔佮箤喔娻副喔權笟喔侧竾喔涪喙堗覆喔囙腑喔侧笀喙勦浮喙堗笧喔`箟喔浮喙冟笂喙夃竾喔侧笝',
+    systemModelSettings: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔`父喙堗笝喔`赴喔氞笟',
+    systemModelSettingsLink: '喙�喔笗喔膏箖喔斷笀喔多竾喔堗箥喔侧箑喔涏箛喔權笗喙夃腑喔囙笗喔编箟喔囙竸喙堗覆喙傕浮喙�喔斷弗喔`赴喔氞笟',
+    selectModel: '喙�喔ム阜喔竵喔`父喙堗笝喔傕腑喔囙竸喔膏笓',
+    setupModelFirst: '喙傕笡喔`笖喔曕副喙夃竾喔勦箞喔侧箓喔∴箑喔斷弗喔傕腑喔囙竸喔膏笓喔佮箞喔笝',
+    systemReasoningModel: {
+      key: '喙佮笟喔氞笀喙嵿覆喔ム腑喔囙竵喔侧福喙冟斧喙夃箑喔笗喔膏笢喔ム競喔竾喔`赴喔氞笟',
+      tip: '喔曕副喙夃竾喔勦箞喔侧箓喔∴箑喔斷弗喔佮覆喔`腑喔權父喔∴覆喔權箑喔`复喙堗浮喔曕箟喔權笚喔掂箞喔堗赴喙冟笂喙夃釜喙嵿覆喔福喔编笟喔佮覆喔`釜喔`箟喔侧竾喙佮腑喔涏笧喔ム复喙�喔勦笂喔编笝 喔曕弗喔笖喔堗笝喔勦父喔撪弗喔编竵喔┼笓喔班笗喙堗覆喔囙箚 喙�喔娻箞喔� 喔佮覆喔`釜喔`箟喔侧竾喔娻阜喙堗腑喔氞笚喔笝喔椸笝喔侧箒喔ム赴喔勦箥喔侧箒喔權赴喔權箥喔侧竸喙嵿覆喔栢覆喔∴笘喔编笖喙勦笡喔堗赴喙冟笂喙夃箓喔∴箑喔斷弗喔佮覆喔`腑喔權父喔∴覆喔權箑喔`复喙堗浮喔曕箟喔權笖喙夃抚喔�',
+    },
+    embeddingModel: {
+      key: '喙傕浮喙�喔斷弗喔佮覆喔`笣喔编竾',
+      tip: '喔曕副喙夃竾喔勦箞喔侧箓喔∴箑喔斷弗喙�喔`复喙堗浮喔曕箟喔權釜喙嵿覆喔福喔编笟喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム竵喔侧福喔澿副喔囙箑喔竵喔覆喔`競喔竾喔勦抚喔侧浮喔`腹喙� 喔椸副喙夃竾喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗喙佮弗喔班竵喔侧福喔權箥喔侧箑喔傕箟喔侧竸喔о覆喔∴福喔灌箟喙冟笂喙夃箓喔∴箑喔斷弗喔佮覆喔`笣喔编竾喔權傅喙夃釜喙嵿覆喔福喔编笟喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム箒喔氞笟喙�喔о竵喙�喔曕腑喔`箤 喔佮覆喔`釜喔ム副喔氞笀喔班笚喙嵿覆喙冟斧喙夃浮喔脆笗喔脆箑喔о竵喙�喔曕腑喔`箤喔`赴喔抚喙堗覆喔囙竸喔о覆喔∴福喔灌箟喔椸傅喙堗笝喙嵿覆喙�喔傕箟喔侧箒喔ム赴喔勦箥喔侧笘喔侧浮喙勦浮喙堗釜喔笖喔勦弗喙夃腑喔囙竵喔编笝 喙�喔炧阜喙堗腑喔弗喔掂竵喙�喔ム傅喙堗涪喔囙竸喔о覆喔∴弗喙夃浮喙�喔弗喔о箖喔權竵喔侧福喔斷付喔囙競喙夃腑喔∴腹喔� 喙傕笡喔`笖喔涪喙堗覆喙�喔涏弗喔掂箞喔⑧笝喔`父喙堗笝喔權傅喙夃笗喔侧浮喔曕箟喔竾喔佮覆喔�',
+      required: '喔堗箥喔侧箑喔涏箛喔權笗喙夃腑喔囙浮喔掂箒喔氞笟喔堗箥喔侧弗喔竾喔佮覆喔`笣喔编竾',
+    },
+    speechToTextModel: {
+      key: '喙傕浮喙�喔斷弗喔勦箥喔侧笧喔灌笖喙�喔涏箛喔權競喙夃腑喔勦抚喔侧浮',
+      tip: '喔曕副喙夃竾喔勦箞喔侧箓喔∴箑喔斷弗喙�喔`复喙堗浮喔曕箟喔權釜喙嵿覆喔福喔编笟喔佮覆喔`笡喙夃腑喔權競喙夃腑喔∴腹喔ム竸喙嵿覆喔炧腹喔斷箑喔涏箛喔權競喙夃腑喔勦抚喔侧浮喙冟笝喔佮覆喔`釜喔權笚喔權覆',
+    },
+    ttsModel: {
+      key: '喙傕浮喙�喔斷弗喔佮覆喔`箒喔涏弗喔囙競喙夃腑喔勦抚喔侧浮喙�喔涏箛喔權竸喙嵿覆喔炧腹喔�',
+      tip: '喔曕副喙夃竾喔勦箞喔侧箓喔∴箑喔斷弗喙�喔`复喙堗浮喔曕箟喔權釜喙嵿覆喔福喔编笟喔佮覆喔`笡喙夃腑喔權競喙夃腑喔∴腹喔ム箑喔涏箛喔權競喙夃腑喔勦抚喔侧浮喙�喔涏箛喔權竸喙嵿覆喔炧腹喔斷箖喔權竵喔侧福喔笝喔椸笝喔�',
+    },
+    rerankModel: {
+      key: '喔堗副喔斷腑喔编笝喔斷副喔氞箓喔∴箑喔斷弗喙冟斧喔∴箞',
+      tip: '喙傕浮喙�喔斷弗 Rerank 喔堗赴喔堗副喔斷弗喙嵿覆喔斷副喔氞福喔侧涪喔佮覆喔`箑喔竵喔覆喔`笢喔灌箟喔浮喔编竸喔`箖喔浮喙堗笗喔侧浮喔佮覆喔`笀喔编笟喔勦腹喙堗竸喔о覆喔∴斧喔∴覆喔⑧竵喔编笟喔佮覆喔`釜喔粪笟喔勦箟喔權競喔竾喔溹腹喙夃箖喔娻箟 喔嬥付喙堗竾喔娻箞喔о涪喔涏福喔编笟喔涏福喔膏竾喔溹弗喔ム副喔炧笜喙屶競喔竾喔佮覆喔`笀喔编笖喔副喔權笖喔编笟喔勦抚喔侧浮喔浮喔侧涪',
+    },
+    apiKey: '喔勦傅喔⑧箤 API',
+    quota: '喙傕竸喔о笗喔�',
+    searchModel: '喔勦箟喔權斧喔侧福喔膏箞喔�',
+    noModelFound: '喙勦浮喙堗笧喔氞箒喔氞笟喔堗箥喔侧弗喔竾喔箥喔侧斧喔`副喔� {{model}}',
+    models: '喔`父喙堗笝',
+    showMoreModelProvider: '喙佮釜喔斷竾喔溹腹喙夃箖喔箟喔氞福喔脆竵喔侧福喔`父喙堗笝喙�喔炧复喙堗浮喙�喔曕复喔�',
+    selector: {
+      tip: '喔`父喙堗笝喔權傅喙夃笘喔灌竵喔ム笟喔腑喔佮箒喔ム箟喔� 喙傕笡喔`笖喙�喔炧复喙堗浮喔`父喙堗笝喔福喔粪腑喙�喔ム阜喔竵喔`父喙堗笝喔阜喙堗笝',
+      emptyTip: '喙勦浮喙堗浮喔掂福喔膏箞喔權笚喔掂箞喔炧福喙夃腑喔∴箖喔娻箟喔囙覆喔�',
+      emptySetting: '喙傕笡喔`笖喙勦笡喔椸傅喙堗竵喔侧福喔曕副喙夃竾喔勦箞喔侧箑喔炧阜喙堗腑喔佮箥喔侧斧喔權笖喔勦箞喔�',
+      rerankTip: '喙傕笡喔`笖喔曕副喙夃竾喔勦箞喔侧箓喔∴箑喔斷弗 Rerank',
+    },
+    card: {
+      quota: '喙傕竸喔о笗喔�',
+      onTrial: '喔椸笖喔ム腑喔囙箖喔娻箟',
+      paid: '喔堗箞喔侧涪',
+      quotaExhausted: '喙傕竸喔о笗喙夃覆喔浮喔�',
+      callTimes: '喙�喔о弗喔侧箓喔椸福',
+      tokens: '喙傕笚 喙�喔勦箛喔�',
+      buyQuota: '喔嬥阜喙夃腑喙傕竸喔о笗喙夃覆',
+      priorityUse: '喔ム箥喔侧笖喔编笟喔勦抚喔侧浮喔箥喔侧竸喔编笉喙冟笝喔佮覆喔`箖喔娻箟喔囙覆喔�',
+      removeKey: '喔ム笟喔勦傅喔⑧箤 API',
+      tip: '喔ム箥喔侧笖喔编笟喔勦抚喔侧浮喔箥喔侧竸喔编笉喔堗赴喙勦笖喙夃福喔编笟喔堗覆喔佮箓喔勦抚喔曕箟喔侧笚喔掂箞喔堗箞喔侧涪 喙傕竸喔о笗喙夃覆喔椸笖喔ム腑喔囙箖喔娻箟喔堗赴喔栢腹喔佮箖喔娻箟喔弗喔编竾喔堗覆喔佮箓喔勦抚喔曕箟喔侧笚喔掂箞喔堗箞喔侧涪喔浮喔�',
+    },
+    item: {
+      deleteDesc: '{{modelName}} 喔栢腹喔佮箖喔娻箟喙�喔涏箛喔權箒喔氞笟喔堗箥喔侧弗喔竾喔佮覆喔`箖喔箟喙�喔笗喔膏笢喔ム競喔竾喔`赴喔氞笟 喔熰副喔囙竵喙屶笂喔编笝喔氞覆喔囙腑喔⑧箞喔侧竾喔堗赴喙勦浮喙堗釜喔侧浮喔侧福喔栢箖喔娻箟喔囙覆喔權箘喔斷箟喔弗喔编竾喔堗覆喔佮竵喔侧福喔ム笟喔腑喔� 喔佮福喔膏笓喔侧涪喔粪笝喔⑧副喔�',
+      freeQuota: '喙傕竸喔о笗喙夃覆喔熰福喔�',
+    },
+    addApiKey: '喙�喔炧复喙堗浮喔勦傅喔⑧箤 API 喔傕腑喔囙竸喔膏笓',
+    invalidApiKey: '喔勦傅喔⑧箤 API 喙勦浮喙堗笘喔灌竵喔曕箟喔竾',
+    encrypted: {
+      front: '喔勦傅喔⑧箤 API 喔傕腑喔囙竸喔膏笓喔堗赴喔栢腹喔佮箑喔傕箟喔侧福喔副喔箒喔ム赴喔堗副喔斷箑喔佮箛喔氞箓喔斷涪喙冟笂喙�',
+      back: '喙�喔椸竸喙傕笝喙傕弗喔⑧傅 ',
+    },
+    freeQuota: {
+      howToEarn: '喔о复喔樴傅喔`副喔�',
+    },
+    addMoreModelProvider: '喙�喔炧复喙堗浮喔溹腹喙夃箖喔箟喔氞福喔脆竵喔侧福喙傕浮喙�喔斷弗喙�喔炧复喙堗浮喙�喔曕复喔�',
+    addModel: '喙�喔炧复喙堗浮喔`父喙堗笝',
+    modelsNum: '{{num}} 喔`父喙堗笝',
+    showModels: '喙佮釜喔斷竾喙傕浮喙�喔斷弗',
+    showModelsNum: '喙佮釜喔斷竾 {{num}} 喙傕浮喙�喔斷弗',
+    collapse: '喔椸福喔膏笖',
+    config: '喔佮箥喔侧斧喔權笖喔勦箞喔�',
+    modelAndParameters: '喔`父喙堗笝喙佮弗喔班笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤',
+    model: '喙佮笟喔�',
+    featureSupported: '喔`腑喔囙福喔编笟 {{feature}}',
+    callTimes: '喙�喔о弗喔侧箓喔椸福',
+    credits: '喙�喔勦福喔斷复喔曕競喙夃腑喔勦抚喔侧浮',
+    buyQuota: '喔嬥阜喙夃腑喙傕竸喔о笗喙夃覆',
+    getFreeTokens: '喔`副喔氞箓喔椸箑喔勦箛喔權笩喔`傅',
+    priorityUsing: '喔堗副喔斷弗喙嵿覆喔斷副喔氞竸喔о覆喔∴釜喙嵿覆喔勦副喔嵿競喔竾喔佮覆喔`箖喔娻箟',
+    deprecated: '喙�喔ム复喔佮箖喔娻箟喔囙覆喔權箒喔ム箟喔�',
+    confirmDelete: '喔⑧阜喔權涪喔编笝喔佮覆喔`弗喔�?',
+    quotaTip: '喙傕笚喙�喔勦箛喔權笩喔`傅喔椸傅喙堗箑喔弗喔粪腑喔涪喔灌箞',
+    loadPresets: '喙傕斧喔ム笖喔勦箞喔侧笚喔掂箞喔曕副喙夃竾喙勦抚喙夃弗喙堗抚喔囙斧喔權箟喔�',
+    parameters: '喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤',
+    loadBalancing: '喙傕斧喔ム笖喔氞覆喔ム覆喔權笅喙�',
+    loadBalancingDescription: '喔ム笖喙佮福喔囙竵喔斷笖喔编笝喔斷箟喔о涪喔傕箟喔浮喔灌弗喔涏福喔班笀喙嵿覆喔曕副喔о斧喔ム覆喔⑧笂喔膏笖',
+    loadBalancingHeadline: '喙傕斧喔ム笖喔氞覆喔ム覆喔權笅喙�',
+    configLoadBalancing: '喔佮箥喔侧斧喔權笖喔勦箞喔侧箓喔弗喔斷笟喔侧弗喔侧笝喔嬥箤',
+    modelHasBeenDeprecated: '喙傕浮喙�喔斷弗喔權傅喙夃箑喔ム复喔佮箖喔娻箟喙佮弗喙夃抚',
+    providerManaged: '喔堗副喔斷竵喔侧福喔溹腹喙夃箖喔箟喔氞福喔脆竵喔侧福',
+    providerManagedDescription: '喙冟笂喙夃競喙夃腑喔∴腹喔ム笡喔`赴喔堗箥喔侧笗喔编抚喔娻父喔斷箑喔斷傅喔⑧抚喔椸傅喙堗笢喔灌箟喙冟斧喙夃笟喔`复喔佮覆喔`箓喔∴箑喔斷弗喙冟斧喙夃浮喔�',
+    defaultConfig: '喔佮覆喔`竵喙嵿覆喔笝喔斷竸喙堗覆喙�喔`复喙堗浮喔曕箟喔�',
+    apiKeyStatusNormal: '喔笘喔侧笝喔� APIKey 喙�喔涏箛喔權笡喔佮笗喔�',
+    apiKeyRateLimit: '喔栢付喔囙競喔掂笖喔堗箥喔侧竵喔编笖喔副喔曕福喔侧箒喔ム箟喔� 喔炧福喙夃腑喔∴箖喔娻箟喔囙覆喔權斧喔ム副喔囙笀喔侧竵 {{seconds}}s',
+    addConfig: '喙�喔炧复喙堗浮喔佮覆喔`竵喙嵿覆喔笝喔斷竸喙堗覆',
+    editConfig: '喙佮竵喙夃箘喔傕竵喔侧福喔佮箥喔侧斧喔權笖喔勦箞喔�',
+    loadBalancingLeastKeyWarning: '喔覆喔佮笗喙夃腑喔囙竵喔侧福喙�喔涏复喔斷箖喔娻箟喔囙覆喔權竵喔侧福喔涏福喔编笟喔浮喔斷父喔ム箓喔弗喔� 喔曕箟喔竾喙�喔涏复喔斷箖喔娻箟喔囙覆喔權竸喔掂涪喙屶腑喔⑧箞喔侧竾喔權箟喔涪 2 喔涏父喙堗浮',
+    loadBalancingInfo: '喔曕覆喔∴竸喙堗覆喙�喔`复喙堗浮喔曕箟喔� 喔佮覆喔`笡喔`副喔氞釜喔∴笖喔膏弗喔犩覆喔`赴喔囙覆喔權笀喔班箖喔娻箟喔佮弗喔⑧父喔椸笜喙屶箒喔氞笟 Round-robin 喔覆喔佮箑喔涏复喔斷箖喔娻箟喔囙覆喔權竵喔侧福喔堗箥喔侧竵喔编笖喔副喔曕福喔� 喔堗赴喔∴傅喔佮覆喔`箖喔娻箟喔`赴喔⑧赴喙�喔о弗喔侧竸喔灌弗喔斷覆喔о笝喙� 1 喔權覆喔椸傅',
+    upgradeForLoadBalancing: '喔副喔涏箑喔佮福喔斷箒喔溹笝喔傕腑喔囙竸喔膏笓喙�喔炧阜喙堗腑喙�喔涏复喔斷箖喔娻箟喔囙覆喔權竵喔侧福喔涏福喔编笟喔浮喔斷父喔ム箓喔弗喔�',
+    emptyProviderTip: '喙傕笡喔`笖喔曕复喔斷笗喔编箟喔囙笢喔灌箟喙冟斧喙夃笟喔`复喔佮覆喔`箓喔∴箑喔斷弗喔佮箞喔笝',
+    discoverMore: '喔斷腹喙�喔炧复喙堗浮喙�喔曕复喔∴箖喔�',
+    emptyProviderTitle: '喙勦浮喙堗箘喔斷箟喔曕副喙夃竾喔勦箞喔侧笢喔灌箟喙冟斧喙夃笟喔`复喔佮覆喔`箓喔∴箑喔斷弗',
+    toBeConfigured: '喔曕箟喔竾喔佮箥喔侧斧喔權笖喔勦箞喔�',
+    installProvider: '喔曕复喔斷笗喔编箟喔囙笢喔灌箟喙冟斧喙夃笟喔`复喔佮覆喔`箓喔∴箑喔斷弗',
+    configureTip: '喔曕副喙夃竾喔勦箞喔� api-key 喔福喔粪腑喙�喔炧复喙堗浮喙傕浮喙�喔斷弗喙�喔炧阜喙堗腑喙冟笂喙�',
+  },
+  dataSource: {
+    add: '喙�喔炧复喙堗浮喙佮斧喔ム箞喔囙競喙夃腑喔∴腹喔�',
+    connect: '喔曕复喔�',
+    configure: '喔佮箥喔侧斧喔權笖喔勦箞喔�',
+    notion: {
+      title: '喙佮笝喔о竸喔脆笖',
+      description: '喔佮覆喔`箖喔娻箟 Notion 喙�喔涏箛喔權箒喔弗喙堗竾喔傕箟喔浮喔灌弗喔箥喔侧斧喔`副喔氞竸喔о覆喔∴福喔灌箟',
+      connectedWorkspace: '喔炧阜喙夃笝喔椸傅喙堗笚喙嵿覆喔囙覆喔權笚喔掂箞喙�喔娻阜喙堗腑喔∴笗喙堗腑',
+      addWorkspace: '喙�喔炧复喙堗浮喔炧阜喙夃笝喔椸傅喙堗笚喙嵿覆喔囙覆喔�',
+      connected: '喙�喔娻阜喙堗腑喔� 喔曕箞喔�',
+      disconnected: '喙�喔娻阜喙堗腑喔� 喔曕箞喔�',
+      changeAuthorizedPages: '喙�喔涏弗喔掂箞喔⑧笝喔笝喙夃覆喔椸傅喙堗箘喔斷箟喔`副喔氞腑喔權父喔嵿覆喔�',
+      pagesAuthorized: '喙�喔炧笀喔椸傅喙堗箘喔斷箟喔`副喔氞腑喔權父喔嵿覆喔�',
+      sync: '喔嬥复喔囙竸喙�',
+      remove: '喔栢腑喔�',
+      selector: {
+        pageSelected: '喔笝喙夃覆喔椸傅喙堗箑喔ム阜喔竵',
+        searchPages: '喔笝喙夃覆喔勦箟喔權斧喔�...',
+        noSearchResult: '喙勦浮喙堗浮喔掂笢喔ム竵喔侧福喔勦箟喔權斧喔�',
+        addPages: '喙�喔炧复喙堗浮喔笝喙夃覆',
+        preview: '喔斷腹喔曕副喔о腑喔⑧箞喔侧竾',
+      },
+    },
+    website: {
+      title: '喙�喔о箛喔氞箘喔嬥笗喙�',
+      description: '喔權箥喔侧箑喔傕箟喔侧箑喔權阜喙夃腑喔覆喔堗覆喔佮箑喔о箛喔氞箘喔嬥笗喙屶箓喔斷涪喙冟笂喙夃箓喔涏福喙佮竵喔`浮喔`抚喔氞福喔о浮喔傕箟喔浮喔灌弗喙�喔о箛喔�',
+      with: '喔佮副喔�',
+      configuredCrawlers: '喙傕笡喔`箒喔佮福喔∴福喔о笟喔`抚喔∴競喙夃腑喔∴腹喔ム笚喔掂箞喔佮箥喔侧斧喔權笖喔勦箞喔侧箘喔о箟',
+      active: '喔佮福喔班笡喔`傅喙夃竵喔`赴喙�喔涏福喙堗覆',
+      inactive: '喙�喔佮傅喔⑧笀喔勦福喙夃覆喔�',
+    },
+  },
+  plugin: {
+    serpapi: {
+      apiKey: '喔勦傅喔⑧箤 API',
+      apiKeyPlaceholder: '喔涏箟喔笝喔勦傅喔⑧箤 API 喔傕腑喔囙竸喔膏笓',
+      keyFrom: '喔`副喔氞竸喔掂涪喙� SerpAPI 喔傕腑喔囙竸喔膏笓喔堗覆喔佮斧喔權箟喔侧笟喔编笉喔娻傅 SerpAPI',
+    },
+  },
+  apiBasedExtension: {
+    title: '喔箞喔о笝喔傕涪喔侧涪 API 喙冟斧喙夃竵喔侧福喔堗副喔斷竵喔侧福 API 喙佮笟喔氞福喔о浮喔ㄠ腹喔權涪喙� 喔椸箥喔侧箖喔箟喔佮覆喔`竵喙嵿覆喔笝喔斷竸喙堗覆喔囙箞喔侧涪喔傕付喙夃笝喙�喔炧阜喙堗腑喙冟斧喙夃箖喔娻箟喔囙覆喔權箘喔斷箟喔囙箞喔侧涪喙冟笝喙佮腑喔涏笧喔ム复喙�喔勦笂喔编笝喔傕腑喔� Dify',
+    link: '喙�喔`傅喔⑧笝喔`腹喙夃抚喔脆笜喔掂笧喔编笒喔權覆喔箞喔о笝喔傕涪喔侧涪 API 喔傕腑喔囙竸喔膏笓喙�喔竾',
+    linkUrl: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+    add: '喙�喔炧复喙堗浮喔箞喔о笝喔傕涪喔侧涪 API',
+    selector: {
+      title: '喔箞喔о笝喔傕涪喔侧涪 API',
+      placeholder: '喙傕笡喔`笖喙�喔ム阜喔竵喔箞喔о笝喔傕涪喔侧涪 API',
+      manage: '喔堗副喔斷竵喔侧福喔箞喔о笝喔傕涪喔侧涪 API',
+    },
+    modal: {
+      title: '喙�喔炧复喙堗浮喔箞喔о笝喔傕涪喔侧涪 API',
+      editTitle: '喙佮竵喙夃箘喔傕釜喙堗抚喔權競喔⑧覆喔� API',
+      name: {
+        title: '喔娻阜喙堗腑',
+        placeholder: '喔佮福喔膏笓喔侧竵喔`腑喔佮笂喔粪箞喔�',
+      },
+      apiEndpoint: {
+        title: '喔涏弗喔侧涪喔椸覆喔� API',
+        placeholder: '喙傕笡喔`笖喔涏箟喔笝喔涏弗喔侧涪喔椸覆喔� API',
+      },
+      apiKey: {
+        title: '喔勦傅喔⑧箤 API',
+        placeholder: '喔佮福喔膏笓喔侧笡喙夃腑喔權竸喔掂涪喙� API',
+        lengthError: '喔勦抚喔侧浮喔⑧覆喔о竸喔掂涪喙� API 喔曕箟喔竾喙勦浮喙堗笝喙夃腑喔⑧竵喔о箞喔� 5 喔副喔佮競喔`赴',
+      },
+    },
+    type: '喔涏福喔班箑喔犩笚',
+  },
+  about: {
+    changeLog: '喔氞副喔權笚喔多竵喔佮覆喔`箑喔涏弗喔掂箞喔⑧笝喙佮笡喔ム竾',
+    updateNow: '喔副喔炧箑喔斷笗喙�喔斷傅喙嬥涪喔о笝喔掂箟',
+    nowAvailable: 'Dify {{version}} 喔炧福喙夃腑喔∴箖喔娻箟喔囙覆喔權箒喔ム箟喔�',
+    latestAvailable: 'Dify {{version}} 喙�喔涏箛喔權箑喔о腑喔`箤喔娻副喔權弗喙堗覆喔父喔斷笚喔掂箞喔∴傅',
+  },
+  appMenus: {
+    overview: '喔曕福喔о笀 喔腑喔�',
+    promptEng: '喔腑喙�喔勦釜喔曕福喙夃覆',
+    apiAccess: '喔佮覆喔`箑喔傕箟喔侧笘喔多竾 API',
+    logAndAnn: '喔ム箛喔竵 & 喙佮腑喔�.',
+    logs: '喔氞副喔權笚喔多竵',
+  },
+  environment: {
+    testing: '喔佮覆喔`笚喔斷釜喔笟',
+    development: '喔炧副喔掄笝喔侧竵喔侧福',
+  },
+  appModes: {
+    completionApp: '喙�喔勦福喔粪箞喔竾喔佮箥喔侧箑喔權复喔斷競喙夃腑喔勦抚喔侧浮',
+    chatApp: '喙佮腑喔炧箒喔娻笚',
+  },
+  datasetMenus: {
+    documents: '喙�喔竵喔覆喔�',
+    hitTesting: '喔佮覆喔`笚喔斷釜喔笟喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗',
+    settings: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆',
+    emptyTip: '喔勦抚喔侧浮喔`腹喙夃涪喔编竾喙勦浮喙堗箘喔斷箟喙�喔娻阜喙堗腑喔∴箓喔⑧竾 喙傕笡喔`笖喙勦笡喔椸傅喙堗箒喔笡喔炧弗喔脆箑喔勦笂喔编笝喔福喔粪腑喔涏弗喔编箠喔佮腑喔脆笝喙�喔炧阜喙堗腑喙�喔娻阜喙堗腑喔∴箓喔⑧竾喙冟斧喙夃箑喔福喙囙笀喔浮喔氞腹喔`笓喙�',
+    viewDoc: '喔斷腹喙�喔竵喔覆喔`笡喔`赴喔佮腑喔�',
+    relatedApp: '喙佮腑喔涏笚喔掂箞喙�喔娻阜喙堗腑喔∴箓喔⑧竾',
+    noRelatedApp: '喙勦浮喙堗浮喔掂箒喔笡喔椸傅喙堗箑喔娻阜喙堗腑喔∴箓喔⑧竾',
+  },
+  voiceInput: {
+    speaking: '喔炧腹喔斷箑喔斷傅喙嬥涪喔о笝喔掂箟...',
+    converting: '喔佮箥喔侧弗喔编竾喙佮笡喔ム竾喙�喔涏箛喔權競喙夃腑喔勦抚喔侧浮...',
+    notAllow: '喙勦浮喙堗箘喔斷箟喔`副喔氞腑喔權父喔嵿覆喔曕箘喔∴箓喔勦福喙傕笩喔�',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-喙�喔椸腑喔`箤喙傕笟',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-喙�喔椸腑喔`箤喙傕笟-16K',
+    'gpt-4': '喔堗傅喔炧傅喔椸傅-4',
+    'gpt-4-32k': '喔堗傅喔椸傅喔炧傅-4-32 喙�喔�',
+    'text-davinci-003': '喔傕箟喔竸喔о覆喔�-Davinci-003',
+    'text-embedding-ada-002': '喔佮覆喔`笣喔编竾喔傕箟喔竸喔о覆喔�-ADA-002',
+    'whisper-1': '喔佮福喔班笅喔脆笟-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2 (喙傕竸喔ム笖-2)',
+  },
+  chat: {
+    renameConversation: '喙�喔涏弗喔掂箞喔⑧笝喔娻阜喙堗腑喔佮覆喔`釜喔權笚喔權覆',
+    conversationName: '喔娻阜喙堗腑喔佮覆喔`釜喔權笚喔權覆',
+    conversationNamePlaceholder: '喔佮福喔膏笓喔侧竵喔`腑喔佮笂喔粪箞喔竵喔侧福喔笝喔椸笝喔�',
+    conversationNameCanNotEmpty: '喔曕箟喔竾喔∴傅喔娻阜喙堗腑喔佮覆喔`釜喔權笚喔權覆',
+    citation: {
+      title: '喔箟喔侧竾 喔复喔�',
+      linkToDataset: '喔ム复喔囙竸喙屶釜喔灌箞喔勦抚喔侧浮喔`腹喙�',
+      characters: '喔副喔佮競喔`赴:',
+      hitCount: '喔堗箥喔侧笝喔о笝喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗:',
+      vectorHash: '喙佮府喔娻箑喔о竵喙�喔曕腑喔`箤:',
+      hitScore: '喔勦赴喙佮笝喔權竵喔侧福喔斷付喔囙競喙夃腑喔∴腹喔�:',
+    },
+    inputPlaceholder: '喔炧腹喔斷竸喔膏涪喔佮副喔氞笟喔笚',
+    thought: '喔勦抚喔侧浮喔勦复喔�',
+    thinking: '喔勦抚喔侧浮喔勦复喔�   ',
+    resend: '喔箞喔囙腑喔掂竵喔勦福喔编箟喔�',
+  },
+  promptEditor: {
+    placeholder: '喙�喔傕傅喔⑧笝喔勦箥喔侧笧喔`箟喔浮喔椸箤喔傕腑喔囙竸喔膏笓喔椸傅喙堗笝喔掂箞 喔涏箟喔笝 \'{\' 喙�喔炧阜喙堗腑喙佮笚喔`竵喔曕副喔о箒喔涏福 喔涏箟喔笝 \'/\' 喙�喔炧阜喙堗腑喙佮笚喔`竵喔氞弗喙囙腑喔佮箑喔權阜喙夃腑喔覆喔炧福喙夃腑喔∴笚喙�',
+    context: {
+      item: {
+        title: '喔氞福喔脆笟喔�',
+        desc: '喙佮笚喔`竵喙�喔椸浮喙�喔炧弗喔曕笟喔`复喔氞笚',
+      },
+      modal: {
+        title: '{{num}} 喔勦抚喔侧浮喔`腹喙夃箖喔權笟喔`复喔氞笚',
+        add: '喙�喔炧复喙堗浮喔氞福喔脆笟喔�',
+        footer: '喔勦父喔撪釜喔侧浮喔侧福喔栢笀喔编笖喔佮覆喔`笟喔`复喔氞笚喙勦笖喙夃箖喔權釜喙堗抚喔權笟喔`复喔氞笚喔斷箟喔侧笝喔ム箞喔侧竾',
+      },
+    },
+    history: {
+      item: {
+        title: '喔涏福喔班抚喔编笗喔脆竵喔侧福喔笝喔椸笝喔�',
+        desc: '喙佮笚喔`竵喙�喔椸浮喙�喔炧弗喔曕競喙夃腑喔勦抚喔侧浮喙冟笝喔笖喔掂笗',
+      },
+      modal: {
+        title: '喔曕副喔о腑喔⑧箞喔侧竾',
+        user: '喔抚喔编釜喔斷傅',
+        assistant: '喔抚喔编釜喔斷傅! 喔夃副喔權笀喔班笂喙堗抚喔⑧竸喔膏笓喙勦笖喙夃腑喔⑧箞喔侧竾喙勦福喙冟笝喔о副喔權笝喔掂箟?',
+        edit: '喙佮竵喙夃箘喔傕笂喔粪箞喔笟喔椸笟喔侧笚喔佮覆喔`釜喔權笚喔權覆',
+      },
+    },
+    variable: {
+      item: {
+        title: '喔曕副喔о箒喔涏福喙佮弗喔班箑喔勦福喔粪箞喔竾喔∴阜喔笭喔侧涪喔權腑喔�',
+        desc: '喙佮笚喔`竵喔曕副喔о箒喔涏福喙佮弗喔班箑喔勦福喔粪箞喔竾喔∴阜喔笭喔侧涪喔權腑喔�',
+      },
+      outputToolDisabledItem: {
+        title: '喔曕副喔� 喙佮笡喔�',
+        desc: '喙佮笚喔`竵喔曕副喔о箒喔涏福',
+      },
+      modal: {
+        add: '喔曕副喔о箒喔涏福喙冟斧喔∴箞',
+        addTool: '喙�喔勦福喔粪箞喔竾喔∴阜喔箖喔浮喙�',
+      },
+    },
+    query: {
+      item: {
+        title: '喔腑喔氞笘喔侧浮',
+        desc: '喙佮笚喔`竵喙�喔椸浮喙�喔炧弗喔曕箒喔氞笟喔腑喔氞笘喔侧浮喔傕腑喔囙笢喔灌箟喙冟笂喙�',
+      },
+    },
+    existed: '喔∴傅喔涪喔灌箞喙佮弗喙夃抚喙冟笝喔炧福喔浮喔曕箤',
+  },
+  imageUploader: {
+    uploadFromComputer: '喔副喔涏箓喔弗喔斷笀喔侧竵喔勦腑喔∴笧喔脆抚喙�喔曕腑喔`箤',
+    uploadFromComputerReadError: '喔佮覆喔`腑喙堗覆喔權笭喔侧笧喔ム箟喔∴箑喔弗喔� 喙傕笡喔`笖喔ム腑喔囙腑喔掂竵喔勦福喔编箟喔�',
+    uploadFromComputerUploadError: '喔副喔涏箓喔弗喔斷福喔灌笡喔犩覆喔炧弗喙夃浮喙�喔弗喔� 喙傕笡喔`笖喔副喔涏箓喔弗喔斷腑喔掂竵喔勦福喔编箟喔�',
+    uploadFromComputerLimit: '喔副喔涏箓喔弗喔斷福喔灌笡喔犩覆喔炧笗喙夃腑喔囙箘喔∴箞喙�喔佮复喔� {{size}} MB',
+    pasteImageLink: '喔о覆喔囙弗喔脆竾喔佮箤喔`腹喔涏笭喔侧笧',
+    pasteImageLinkInputPlaceholder: '喔о覆喔囙弗喔脆竾喔勦箤喔`腹喔涏笭喔侧笧喔椸傅喙堗笝喔掂箞',
+    pasteImageLinkInvalid: '喔ム复喔囙竵喙屶福喔灌笡喔犩覆喔炧箘喔∴箞喔栢腹喔佮笗喙夃腑喔�',
+    imageUpload: '喔副喔涏箓喔弗喔斷福喔灌笡喔犩覆喔�',
+  },
+  fileUploader: {
+    uploadFromComputer: '喔副喔涏箓喔弗喔斷箖喔權箑喔勦福喔粪箞喔竾',
+    pasteFileLink: '喔о覆喔囙弗喔脆竾喔勦箤喙勦笩喔ム箤',
+    pasteFileLinkInputPlaceholder: '喔涏箟喔笝 URL...',
+    uploadFromComputerReadError: '喔佮覆喔`腑喙堗覆喔權箘喔熰弗喙屶弗喙夃浮喙�喔弗喔� 喙傕笡喔`笖喔ム腑喔囙腑喔掂竵喔勦福喔编箟喔�',
+    uploadFromComputerUploadError: '喔副喔涏箓喔弗喔斷箘喔熰弗喙屶弗喙夃浮喙�喔弗喔� 喙傕笡喔`笖喔副喔涏箓喔弗喔斷腑喔掂竵喔勦福喔编箟喔�',
+    uploadFromComputerLimit: '喔副喔涏箓喔弗喔� {{type}} 喔曕箟喔竾喙勦浮喙堗箑喔佮复喔� {{size}}',
+    pasteFileLinkInvalid: '喔ム复喔囙竵喙屶箘喔熰弗喙屶箘喔∴箞喔栢腹喔佮笗喙夃腑喔�',
+    fileExtensionNotSupport: '喙勦浮喙堗福喔竾喔`副喔氞笝喔侧浮喔竵喔膏弗喙勦笩喔ム箤',
+  },
+  tag: {
+    placeholder: '喙佮笚喙囙竵喔椸副喙夃竾喔浮喔�',
+    addNew: '喙�喔炧复喙堗浮喙佮笚喙囙竵喙冟斧喔∴箞',
+    noTag: '喙勦浮喙堗浮喔掂箒喔椸箛喔�',
+    noTagYet: '喔⑧副喔囙箘喔∴箞喔∴傅喙佮笚喙囙竵',
+    addTag: '喙�喔炧复喙堗浮喙佮笚喙囙竵',
+    editTag: '喙佮竵喙夃箘喔傕箒喔椸箛喔�',
+    manageTags: '喔堗副喔斷竵喔侧福喙佮笚喙囙竵',
+    selectorPlaceholder: '喔炧复喔∴笧喙屶箑喔炧阜喙堗腑喔勦箟喔權斧喔侧斧喔`阜喔釜喔`箟喔侧竾',
+    create: '喔福喙夃覆喔�',
+    delete: '喔ム笟喙佮笚喙囙竵',
+    deleteTip: '喙佮笚喙囙竵喔佮箥喔侧弗喔编竾喔栢腹喔佮箖喔娻箟喔ム笟喔腑喔�?',
+    created: '喔福喙夃覆喔囙箒喔椸箛喔佮釜喙嵿覆喙�喔`箛喔�',
+    failed: '喔佮覆喔`釜喔`箟喔侧竾喙佮笚喙囙竵喔ム箟喔∴箑喔弗喔�',
+  },
+  license: {
+    expiring: '喔浮喔斷腑喔侧涪喔膏箖喔權斧喔權付喙堗竾喔о副喔�',
+    expiring_plural: '喔浮喔斷腑喔侧涪喔膏箖喔� {{count}} 喔о副喔�',
+  },
+  pagination: {
+    perPage: '喔`覆喔⑧竵喔侧福喔曕箞喔斧喔權箟喔�',
+  },
+  theme: {
+    dark: '喔∴阜喔�',
+    theme: '喔樴傅喔�',
+    auto: '喔`赴喔氞笟',
+    light: '喙佮釜喔�',
+  },
+  compliance: {
+    professionalUpgradeTooltip: '喙冟笂喙夃箘喔斷箟喙�喔夃笧喔侧赴喙佮笢喔權笚喔掂浮喔福喔粪腑喔腹喔囙竵喔о箞喔侧箑喔椸箞喔侧笝喔编箟喔�.',
+    gdpr: 'GDPR DPA',
+    sandboxUpgradeTooltip: '喔∴傅喙冟斧喙夃笟喔`复喔佮覆喔`箑喔夃笧喔侧赴喔佮副喔氞箒喔溹笝喔佮覆喔`箖喔娻箟喔囙覆喔權箒喔氞笟喔∴阜喔腑喔侧笂喔掂笧喔福喔粪腑喔椸傅喔∴箑喔椸箞喔侧笝喔编箟喔�.',
+    iso27001: '喔佮覆喔`福喔编笟喔`腑喔� ISO 27001:2022',
+    soc2Type2: '喔`覆喔⑧竾喔侧笝 SOC 2 Type II',
+    soc2Type1: '喔`覆喔⑧竾喔侧笝 SOC 2 喔涏福喔班箑喔犩笚 I',
+  },
+  imageInput: {
+    dropImageHere: '喔о覆喔囙笭喔侧笧喔傕腑喔囙竸喔膏笓喔椸傅喙堗笝喔掂箞 喔福喔粪腑',
+    browse: '喔椸箞喔竾喙�喔о箛喔�',
+    supportedFormats: '喔`腑喔囙福喔编笟 PNG, JPG, JPEG, WEBP 喙佮弗喔� GIF',
+  },
+}
+
+export default translation
diff --git a/i18n/th-TH/custom.ts b/i18n/th-TH/custom.ts
new file mode 100644
index 0000000..c5ae3e7
--- /dev/null
+++ b/i18n/th-TH/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: '喔佮赋喔笝喔� 喙�喔竾',
+  upgradeTip: {
+    prefix: '喔副喔涏箑喔佮福喔斷箒喔溹笝喔傕腑喔囙竸喔膏笓喙�喔涏箛喔�',
+    suffix: '喔涏福喔编笟喙佮笗喙堗竾喙佮笟喔`笝喔斷箤喔傕腑喔囙竸喔膏笓',
+    des: '喔副喔涏箑喔佮福喔斷箒喔溹笝喔傕腑喔囙竸喔膏笓喙�喔炧阜喙堗腑喔涏福喔编笟喙佮笗喙堗竾喙佮笟喔`笝喔斷箤喔傕腑喔囙竸喔膏笓',
+    title: '喔副喔涏箑喔佮福喔斷箒喔溹笝喔傕腑喔囙竸喔膏笓',
+  },
+  webapp: {
+    title: '喔涏福喔编笟喙佮笗喙堗竾喙佮笟喔`笝喔斷箤 WebApp',
+    removeBrand: '喔ム笟 喔傕副喔氞箑喔勦弗喔粪箞喔笝喙傕笖喔� Dify',
+    changeLogo: '喔佮覆喔`箑喔涏弗喔掂箞喔⑧笝喙佮笡喔ム竾喔椸傅喙堗競喔编笟喙�喔勦弗喔粪箞喔笝喙傕笖喔⑧笭喔侧笧喔ム副喔佮俯喔撪箤喔傕腑喔囙箒喔氞福喔權笖喙�',
+    changeLogoTip: '喔`腹喔涏箒喔氞笟 SVG 喔福喔粪腑 PNG 喔椸傅喙堗浮喔掂競喔權覆喔斷競喔编箟喔權笗喙堗箥喔� 40x40px',
+  },
+  app: {
+    title: '喔涏福喔编笟喙佮笗喙堗竾喙佮笟喔`笝喔斷箤喔箞喔о笝喔副喔о競喔竾喙佮腑喔�',
+    changeLogoTip: '喔`腹喔涏箒喔氞笟 SVG 喔福喔粪腑 PNG 喔椸傅喙堗浮喔掂競喔權覆喔斷競喔编箟喔權笗喙堗箥喔� 80x80px',
+  },
+  upload: '喔副喔涏箓喔弗喔�',
+  uploading: '喔副喔� 喙傕斧喔ム笖',
+  uploadedFail: '喔副喔涏箓喔弗喔斷福喔灌笡喔犩覆喔炧弗喙夃浮喙�喔弗喔о箓喔涏福喔斷腑喔编笡喙傕斧喔ム笖喙冟斧喔∴箞',
+  change: '喙�喔涏弗喔掂箞喔⑧笝',
+  apply: '喙冟笂喙�',
+  restore: '喔勦阜喔權竸喙堗覆喙�喔`复喙堗浮喔曕箟喔�',
+  customize: {
+    contactUs: '喔曕复喔斷笗喙堗腑喙�喔`覆',
+    prefix: '喔覆喔佮笗喙夃腑喔囙竵喔侧福喔涏福喔编笟喙佮笗喙堗竾喙傕弗喙傕竵喙夃箒喔氞福喔權笖喙屶笭喔侧涪喙冟笝喙佮腑喔� 喙傕笡喔`笖',
+    suffix: '喙�喔炧阜喙堗腑喔副喔涏箑喔佮福喔斷箑喔涏箛喔權福喔膏箞喔� Enterprise',
+  },
+}
+
+export default translation
diff --git a/i18n/th-TH/dataset-creation.ts b/i18n/th-TH/dataset-creation.ts
new file mode 100644
index 0000000..e6081a9
--- /dev/null
+++ b/i18n/th-TH/dataset-creation.ts
@@ -0,0 +1,218 @@
+const translation = {
+  steps: {
+    header: {
+      creation: '喔福喙夃覆喔囙竸喔о覆喔∴福喔灌箟',
+      update: '喙�喔炧复喙堗浮喔傕箟喔浮喔灌弗',
+      fallbackRoute: '喔勦抚喔侧浮喔`腹喙�',
+    },
+    one: '喙�喔ム阜喔竵喙佮斧喔ム箞喔囙競喙夃腑喔∴腹喔�',
+    two: '喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム箒喔ム赴喔佮覆喔`笚喙嵿覆喔勦抚喔侧浮喔赴喔覆喔斷競喙夃腑喔勦抚喔侧浮喔ム箞喔о竾喔笝喙夃覆',
+    three: '喔斷箥喔侧箑喔權复喔權竵喔侧福喙佮弗喔班箑喔福喙囙笀喔复喙夃笝',
+  },
+  error: {
+    unavailable: '喔勦抚喔侧浮喔`腹喙夃笝喔掂箟喙勦浮喙堗浮喔�',
+  },
+  firecrawl: {
+    configFirecrawl: '喔佮箥喔侧斧喔權笖喔勦箞喔� 馃敟Firecrawl',
+    apiKeyPlaceholder: '喔勦傅喔⑧箤 API 喔堗覆喔� firecrawl.dev',
+    getApiKeyLinkText: '喔`副喔氞竸喔掂涪喙� API 喔傕腑喔囙竸喔膏笓喔堗覆喔� firecrawl.dev',
+  },
+  jinaReader: {
+    configJinaReader: '喔佮箥喔侧斧喔權笖喔勦箞喔� Jina Reader',
+    apiKeyPlaceholder: '喔勦傅喔⑧箤 API 喔堗覆喔� jina.ai',
+    getApiKeyLinkText: '喔`副喔氞竸喔掂涪喙� API 喔熰福喔掂箘喔斷箟喔椸傅喙� jina.ai',
+  },
+  stepOne: {
+    filePreview: '喔曕副喔о腑喔⑧箞喔侧竾喙勦笩喔ム箤',
+    pagePreview: '喔曕副喔о腑喔⑧箞喔侧竾喔笝喙夃覆',
+    dataSourceType: {
+      file: '喔權箥喔侧箑喔傕箟喔侧笀喔侧竵喙勦笩喔ム箤',
+      notion: '喔嬥复喔囙竸喙屶笀喔侧竵 Notion',
+      web: '喔嬥复喔囙竸喙屶笀喔侧竵喙�喔о箛喔氞箘喔嬥笗喙�',
+    },
+    uploader: {
+      title: '喔副喔涏箓喔弗喔斷箘喔熰弗喙�',
+      button: '喔ム覆喔佮箒喔ム赴喔о覆喔囙箘喔熰弗喙屶斧喔`阜喔箓喔熰弗喙�喔斷腑喔`箤喔福喔粪腑',
+      browse: '喙�喔ム箛喔�',
+      tip: '喔`腑喔囙福喔编笟 {{supportTypes}} 喔腹喔囙釜喔膏笖 {{size}}MB 喙佮笗喙堗弗喔班笗喔编抚',
+      validation: {
+        typeError: '喙勦浮喙堗福喔竾喔`副喔氞笡喔`赴喙�喔犩笚喙勦笩喔ム箤',
+        size: '喙勦笩喔ム箤喙冟斧喔嵿箞喙�喔佮复喔權箘喔� 喔腹喔囙釜喔膏笖喔勦阜喔� {{size}}MB',
+        count: '喙勦浮喙堗福喔竾喔`副喔氞斧喔ム覆喔⑧箘喔熰弗喙�',
+        filesNumber: '喔勦父喔撪笘喔多竾喔傕傅喔斷笀喙嵿覆喔佮副喔斷竵喔侧福喔副喔涏箓喔弗喔斷箑喔涏箛喔權笂喔膏笖喔傕腑喔� {{filesNumber}} 喙佮弗喙夃抚',
+      },
+      cancel: '喔⑧竵喙�喔ム复喔�',
+      change: '喙�喔涏弗喔掂箞喔⑧笝',
+      failed: '喔副喔涏箓喔弗喔斷弗喙夃浮喙�喔弗喔�',
+    },
+    notionSyncTitle: '喔勦抚喔侧浮喔勦复喔斷箘喔∴箞喙�喔娻阜喙堗腑喔∴笗喙堗腑',
+    notionSyncTip: '喙冟笝喔佮覆喔`笅喔脆竾喔勦箤喔佮副喔� Notion 喔曕箟喔竾喔福喙夃覆喔囙竵喔侧福喙�喔娻阜喙堗腑喔∴笗喙堗腑喔佮副喔� Notion 喔佮箞喔笝',
+    connect: '喙勦笡喔椸傅喙堗箑喔娻阜喙堗腑喔∴笗喙堗腑',
+    button: '喔曕箞喔箘喔�',
+    emptyDatasetCreation: '喔夃副喔權笗喙夃腑喔囙竵喔侧福喔福喙夃覆喔囙竸喔о覆喔∴福喔灌箟喔椸傅喙堗抚喙堗覆喔囙箑喔涏弗喙堗覆',
+    modal: {
+      title: '喔福喙夃覆喔囙竸喔о覆喔∴福喔灌箟喔椸傅喙堗抚喙堗覆喔囙箑喔涏弗喙堗覆',
+      tip: '喔勦抚喔侧浮喔`腹喙夃笚喔掂箞喔о箞喔侧竾喙�喔涏弗喙堗覆喔堗赴喙勦浮喙堗浮喔掂箑喔竵喔覆喔� 喙佮弗喔班竸喔膏笓喔覆喔∴覆喔`笘喔副喔涏箓喔弗喔斷箑喔竵喔覆喔`箘喔斷箟喔曕弗喔笖喙�喔о弗喔�',
+      input: '喔娻阜喙堗腑喔勦抚喔侧浮喔`腹喙�',
+      placeholder: '喔佮福喔膏笓喔侧笡喙夃腑喔�',
+      nameNotEmpty: '喔娻阜喙堗腑喔曕箟喔竾喙勦浮喙堗抚喙堗覆喔囙箑喔涏弗喙堗覆',
+      nameLengthInvalid: '喔娻阜喙堗腑喔曕箟喔竾喔∴傅喔副喔佮競喔`赴喔`赴喔抚喙堗覆喔� 1 喔栢付喔� 40 喔曕副喔�',
+      cancelButton: '喔⑧竵喙�喔ム复喔�',
+      confirmButton: '喔福喙夃覆喔�',
+      failed: '喔佮覆喔`釜喔`箟喔侧竾喔ム箟喔∴箑喔弗喔�',
+    },
+    website: {
+      chooseProvider: '喙�喔ム阜喔竵喔溹腹喙夃箖喔箟喔氞福喔脆竵喔侧福',
+      fireCrawlNotConfigured: '喙勦浮喙堗箘喔斷箟喔佮箥喔侧斧喔權笖喔勦箞喔� Firecrawl',
+      fireCrawlNotConfiguredDescription: '喔佮箥喔侧斧喔權笖喔勦箞喔� Firecrawl 喔斷箟喔о涪喔勦傅喔⑧箤 API 喙�喔炧阜喙堗腑喙冟笂喙夃竾喔侧笝',
+      jinaReaderNotConfigured: '喙勦浮喙堗箘喔斷箟喔佮箥喔侧斧喔權笖喔勦箞喔� Jina Reader',
+      jinaReaderNotConfiguredDescription: '喔曕副喙夃竾喔勦箞喔� Jina Reader 喙傕笖喔⑧笡喙夃腑喔權竸喔掂涪喙� API 喔熰福喔掂箑喔炧阜喙堗腑喙�喔傕箟喔侧笘喔多竾',
+      configure: '喔佮箥喔侧斧喔權笖喔勦箞喔�',
+      run: '喔о复喙堗竾',
+      firecrawlTitle: '喙佮涪喔佮箑喔權阜喙夃腑喔覆喙�喔о箛喔氞笖喙夃抚喔� 馃敟Firecrawl',
+      firecrawlDoc: '喙�喔竵喔覆喔� Firecrawl',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      jinaReaderTitle: '喙佮笡喔ム竾喔椸副喙夃竾喙勦笅喔曕箤喙�喔涏箛喔� Markdown',
+      jinaReaderDoc: '喙�喔`傅喔⑧笝喔`腹喙夃箑喔炧复喙堗浮喙�喔曕复喔∴箑喔佮傅喙堗涪喔о竵喔编笟 Jina Reader',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      useSitemap: '喙冟笂喙夃箒喔溹笝喔溹副喔囙箑喔о箛喔氞箘喔嬥笗喙�',
+      useSitemapTooltip: '喔椸箥喔侧笗喔侧浮喙佮笢喔權笢喔编竾喙�喔о箛喔氞箘喔嬥笗喙屶箑喔炧阜喙堗腑喔`抚喔氞福喔о浮喔傕箟喔浮喔灌弗喙�喔о箛喔氞箘喔嬥笗喙� 喔覆喔佮箘喔∴箞喙�喔涏箛喔權箑喔娻箞喔權笝喔编箟喔� Jina Reader 喔堗赴喔`抚喔氞福喔о浮喔傕箟喔浮喔灌弗喔嬥箟喙嵿覆喙� 喔曕覆喔∴竸喔о覆喔∴箑喔佮傅喙堗涪喔о競喙夃腑喔囙競喔竾喔笝喙夃覆 喙傕笖喔⑧箖喔箟喔笝喙夃覆喙�喔о箛喔氞笝喙夃腑喔⑧弗喔囙箒喔曕箞喔∴傅喔勦父喔撪笭喔侧笧喔腹喔囙竵喔о箞喔�',
+      options: '喔曕副喔о箑喔ム阜喔竵',
+      crawlSubPage: '喔`抚喔氞福喔о浮喔傕箟喔浮喔灌弗喔笝喙夃覆喔⑧箞喔涪',
+      limit: '喙�喔傕笗',
+      maxDepth: '喔勦抚喔侧浮喔ム付喔佮釜喔灌竾喔父喔�',
+      excludePaths: '喔⑧竵喙�喔о箟喔權箑喔箟喔權笚喔侧竾',
+      includeOnlyPaths: '喔`抚喔∴箑喔夃笧喔侧赴喙�喔箟喔權笚喔侧竾',
+      extractOnlyMainContent: '喙佮涪喔佮箑喔夃笧喔侧赴喙�喔權阜喙夃腑喔覆喔弗喔编竵 (喙勦浮喙堗浮喔掂釜喙堗抚喔權斧喔编抚 喔佮覆喔`笝喙嵿覆喔椸覆喔� 喔箞喔о笝喔椸箟喔侧涪 喔弗喔�)',
+      exceptionErrorTitle: '喔∴傅喔傕箟喔涪喔佮箑喔о箟喔權箑喔佮复喔斷競喔多箟喔權競喔撪赴喔`副喔權竾喔侧笝喔佮覆喔`福喔о笟喔`抚喔∴競喙夃腑喔∴腹喔�:',
+      unknownError: '喔傕箟喔笢喔脆笖喔炧弗喔侧笖喔椸傅喙堗箘喔∴箞喔`腹喙夃笀喔编竵',
+      totalPageScraped: '喔堗箥喔侧笝喔о笝喔笝喙夃覆喔椸傅喙堗競喔灌笖:',
+      selectAll: '喙�喔ム阜喔竵喔椸副喙夃竾喔浮喔�',
+      resetAll: '喔`傅喙�喔嬥箛喔曕笚喔编箟喔囙斧喔∴笖',
+      scrapTimeInfo: '喔傕腹喔� {{total}} 喔笝喙夃覆喔椸副喙夃竾喔浮喔斷笭喔侧涪喙冟笝 {{time}}s',
+      preview: '喔斷腹喔曕副喔о腑喔⑧箞喔侧竾',
+      maxDepthTooltip: '喔勦抚喔侧浮喔ム付喔佮釜喔灌竾喔父喔斷箖喔權竵喔侧福喔`抚喔氞福喔о浮喔傕箟喔浮喔灌弗喙�喔∴阜喙堗腑喙�喔椸傅喔⑧笟喔佮副喔� URL 喔椸傅喙堗笡喙夃腑喔� 喔勦抚喔侧浮喔ム付喔� 0 喙�喔炧傅喔⑧竾喙佮竸喙堗競喔灌笖喔笝喙夃覆喔傕腑喔� URL 喔椸傅喙堗笡喙夃腑喔權竸喔о覆喔∴弗喔多竵 1 喔傕腹喔� url 喙佮弗喔班笚喔膏竵喔涪喙堗覆喔囙斧喔ム副喔囙笀喔侧竵 enteredURL + 喔笝喔多箞喔� / 喙�喔涏箛喔權笗喙夃笝',
+      watercrawlTitle: '喔斷付喔囙箑喔權阜喙夃腑喔覆喔堗覆喔佮箑喔о箛喔氞笖喙夃抚喔� Watercrawl',
+      configureJinaReader: '喔曕副喙夃竾喔勦箞喔� Jina Reader',
+      watercrawlDocLink: 'https://docs.dify.ai/th/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      configureFirecrawl: '喔佮赋喔笝喔斷竸喙堗覆 Firecrawl',
+      configureWatercrawl: '喔佮赋喔笝喔斷竸喙堗覆喔佮覆喔`箑喔傕箟喔侧笘喔多竾喔權箟喔�',
+      waterCrawlNotConfiguredDescription: '喔佮赋喔笝喔斷竸喙堗覆 Watercrawl 喔斷箟喔о涪 API key 喙�喔炧阜喙堗腑喙冟笂喙夃竾喔侧笝.',
+      watercrawlDoc: '喙�喔竵喔覆喔� Watercrawl',
+      waterCrawlNotConfigured: 'Watercrawl 喔⑧副喔囙箘喔∴箞喙勦笖喙夃笗喔编箟喔囙竸喙堗覆',
+    },
+    cancel: '喔⑧竵喙�喔ム复喔�',
+  },
+  stepTwo: {
+    segmentation: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔佮箟喔笝',
+    auto: '喔副喔曕箓喔權浮喔编笗喔�',
+    autoDescription: '喔曕副喙夃竾喔勦箞喔侧竵喔庎竵喔侧福喙佮笟喙堗竾喔佮弗喔膏箞喔∴箒喔ム赴喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム弗喙堗抚喔囙斧喔權箟喔侧箓喔斷涪喔副喔曕箓喔權浮喔编笗喔� 喔傕腑喙佮笝喔班笝喙嵿覆喙冟斧喙夃笢喔灌箟喙冟笂喙夃笚喔掂箞喙勦浮喙堗竸喔膏箟喔權箑喔勦涪喙�喔ム阜喔竵喔复喙堗竾喔權傅喙�',
+    custom: '喔樴福喔`浮喙�喔權傅喔⑧浮',
+    customDescription: '喔涏福喔编笟喙佮笗喙堗竾喔佮笌喔傕腑喔囙竵喔ム父喙堗浮 喔勦抚喔侧浮喔⑧覆喔о競喔竾喔佮弗喔膏箞喔� 喙佮弗喔班竵喔庎竵喔侧福喔涏福喔班浮喔о弗喔溹弗喔ム箞喔о竾喔笝喙夃覆 喔弗喔�',
+    separator: '喔曕副喔о竸喔编箞喔�',
+    separatorTip: '喔曕副喔о竸喔编箞喔權竸喔粪腑喔副喔佮競喔`赴喔椸傅喙堗箖喔娻箟喙冟笝喔佮覆喔`箒喔⑧竵喔傕箟喔竸喔о覆喔� \\n\\n 喙佮弗喔� \\n 喙�喔涏箛喔權笗喔编抚喔勦副喙堗笝喔椸傅喙堗箖喔娻箟喔佮副喔權笚喔编箞喔о箘喔涏釜喙嵿覆喔福喔编笟喔佮覆喔`箒喔⑧竵喔⑧箞喔斧喔權箟喔侧箒喔ム赴喔氞福喔`笚喔编笖 喙�喔∴阜喙堗腑喔`抚喔∴竵喔编笟喙�喔勦福喔粪箞喔竾喔浮喔侧涪喔堗父喔ム笭喔侧竸 (\\n\\n,\\n) 喔⑧箞喔斧喔權箟喔侧笀喔班笘喔灌竵喙佮笟喙堗竾喔曕覆喔∴笟喔`福喔椸副喔斷箑喔∴阜喙堗腑喙�喔佮复喔權竸喔о覆喔∴涪喔侧抚喔傕腑喔囙竵喙夃腑喔權釜喔灌竾喔父喔� 喔勦父喔撪涪喔编竾喔覆喔∴覆喔`笘喙冟笂喙夃笗喔编抚喔勦副喙堗笝喔炧复喙�喔ㄠ俯喔椸傅喙堗竵喙嵿覆喔笝喔斷箓喔斷涪喔曕副喔о竸喔膏笓喙�喔竾 (喙�喔娻箞喔� ***)',
+    separatorPlaceholder: '\\n\\n 喔箥喔侧斧喔`副喔氞箒喔⑧竵喔⑧箞喔斧喔權箟喔� \\n 喔箥喔侧斧喔`副喔氞箒喔⑧竵喙�喔箟喔�',
+    maxLength: '喔勦抚喔侧浮喔⑧覆喔о竵喙夃腑喔權釜喔灌竾喔父喔�',
+    maxLengthCheck: '喔勦抚喔侧浮喔⑧覆喔о竵喙夃腑喔權釜喔灌竾喔父喔斷竸喔о福喔權箟喔涪喔佮抚喙堗覆 {{limit}}',
+    overlap: '喔佮覆喔`笚喔编笟喔嬥箟喔笝喔佮副喔權競喔竾喔佮箟喔笝',
+    overlapTip: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔佮覆喔`笚喔编笟喔嬥箟喔笝喔佮副喔權競喔竾喔佮弗喔膏箞喔∴釜喔侧浮喔侧福喔栢福喔编竵喔┼覆喔勦抚喔侧浮喙�喔佮傅喙堗涪喔о競喙夃腑喔囙笚喔侧竾喔勦抚喔侧浮喔浮喔侧涪喔`赴喔抚喙堗覆喔囙竵喔编笝喙勦笖喙� 喔傕腑喙佮笝喔班笝喙嵿覆喙冟斧喙夃笗喔编箟喔囙竸喙堗覆 10%-25% 喔傕腑喔囙競喔權覆喔斷竵喙夃腑喔權釜喔灌竾喔父喔�',
+    overlapCheck: '喔佮覆喔`笚喔编笟喔嬥箟喔笝喔佮副喔權競喔竾喔佮箟喔笝喙勦浮喙堗竸喔о福喙冟斧喔嵿箞喔佮抚喙堗覆喔勦抚喔侧浮喔⑧覆喔о競喔竾喔佮箟喔笝喔腹喔囙釜喔膏笖',
+    rules: '喔佮笌喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム競喙夃腑喔勦抚喔侧浮喔ム箞喔о竾喔笝喙夃覆',
+    removeExtraSpaces: '喙佮笚喔權笚喔掂箞喔娻箞喔竾喔о箞喔侧竾喔氞福喔`笚喔编笖喙冟斧喔∴箞喙佮弗喔班箒喔椸箛喔氞笚喔掂箞喔曕箞喔箑喔權阜喙堗腑喔囙竵喔编笝',
+    removeUrlEmails: '喔ム笟 URL 喙佮弗喔班笚喔掂箞喔涪喔灌箞喔傅喙�喔∴弗喔椸副喙夃竾喔浮喔�',
+    removeStopwords: '喔ム笟喔勦箥喔侧斧喔⑧父喔� 喙�喔娻箞喔� "a", "an", "the"',
+    preview: '喔⑧阜喔權涪喔编笝喙佮弗喔班笖喔灌笗喔编抚喔涪喙堗覆喔�',
+    reset: '喔`傅 喙�喔嬥箛喔�',
+    indexMode: '喙傕斧喔∴笖喔斷副喔娻笝喔�',
+    qualified: '喔勦父喔撪笭喔侧笧喔腹喔�',
+    recommend: '喙佮笝喔班笝喔�',
+    qualifiedTip: '喙�喔`傅喔⑧竵喙冟笂喙夃腑喔脆笝喙�喔椸腑喔`箤喙�喔熰笅喔佮覆喔`笣喔编竾喔`赴喔氞笟喙�喔`复喙堗浮喔曕箟喔權釜喙嵿覆喔福喔编笟喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム箑喔炧阜喙堗腑喙冟斧喙夃浮喔掂竸喔о覆喔∴箒喔∴箞喔權涪喙嵿覆喔腹喔囙競喔多箟喔權箑喔∴阜喙堗腑喔溹腹喙夃箖喔娻箟喔阜喔氞竸喙夃笝',
+    warning: '喙傕笡喔`笖喔曕副喙夃竾喔勦箞喔侧竸喔掂涪喙� API 喔傕腑喔囙笢喔灌箟喙冟斧喙夃笟喔`复喔佮覆喔`箓喔∴箑喔斷弗喔佮箞喔笝',
+    click: '喙勦笡喔椸傅喙堗竵喔侧福喔曕副喙夃竾喔勦箞喔�',
+    economical: '喔涏福喔班斧喔⑧副喔�',
+    economicalTip: '喙冟笂喙夃箑喔箛喔權笀喔脆箟喔權箑喔о竵喙�喔曕腑喔`箤喔腑喔熰箘喔ム笝喙� 喔斷副喔娻笝喔掂竸喙嵿覆喔弗喔编竵 喔弗喔� 喙�喔炧阜喙堗腑喔ム笖喔勦抚喔侧浮喙佮浮喙堗笝喔⑧箥喔侧箓喔斷涪喙勦浮喙堗笗喙夃腑喔囙箖喔娻箟喙傕笚喙�喔勦箛喔�',
+    QATitle: '喔佮覆喔`箒喔氞箞喔囙竵喔ム父喙堗浮喙冟笝喔`腹喔涏箒喔氞笟喔勦箥喔侧笘喔侧浮喙佮弗喔班竸喙嵿覆喔曕腑喔�',
+    QATip: '喔佮覆喔`箑喔涏复喔斷箖喔娻箟喔囙覆喔權笗喔编抚喙�喔ム阜喔竵喔權傅喙夃笀喔班箖喔娻箟喙傕笚喙�喔勦箛喔權浮喔侧竵喔傕付喙夃笝',
+    QALanguage: '喙佮笟喙堗竾喔佮弗喔膏箞喔∴箓喔斷涪喙冟笂喙�',
+    estimateCost: '喔佮赴',
+    estimateSegment: '喔佮箟喔笝喙傕笖喔⑧笡喔`赴喔∴覆喔�',
+    segmentCount: '喔佮箟喔笝',
+    calculating: '喔勦赋喔權抚喔�   ',
+    fileSource: '喙�喔曕福喔掂涪喔∴箑喔竵喔覆喔`弗喙堗抚喔囙斧喔權箟喔�',
+    notionSource: '喔笝喙夃覆喔涏福喔班浮喔о弗喔溹弗喔ム箞喔о竾喔笝喙夃覆',
+    websiteSource: '喙�喔о箛喔氞箘喔嬥笗喙� Preprocess',
+    other: '喙佮弗喔班腑喔粪箞喔� 喙�',
+    fileUnit: '喙佮笩喙夃浮',
+    notionUnit: '喔笝喙夃覆',
+    webpageUnit: '喔笝喙夃覆',
+    previousStep: '喔傕副喙夃笝喔曕腑喔權竵喙堗腑喔權斧喔權箟喔�',
+    nextStep: '喔氞副喔權笚喔多竵喙佮弗喔班笡喔`赴喔∴抚喔ム笢喔�',
+    save: '喔氞副喔權笚喔多竵喙佮弗喔班笡喔`赴喔∴抚喔ム笢喔�',
+    cancel: '喔⑧竵喙�喔ム复喔�',
+    sideTipTitle: '喔椸箥喔侧箘喔∴笗喙夃腑喔囙箒喔氞箞喔囙竵喔ム父喙堗浮喙佮弗喔班箑喔曕福喔掂涪喔∴竵喔`赴喔氞抚喔權竵喔侧福喔ム箞喔о竾喔笝喙夃覆?',
+    sideTipP1: '喙�喔∴阜喙堗腑喔涏福喔班浮喔о弗喔溹弗喔傕箟喔浮喔灌弗喔傕箟喔竸喔о覆喔� 喔佮覆喔`箒喔氞箞喔囙竵喔ム父喙堗浮喙佮弗喔班竵喔侧福喔椸箥喔侧竸喔о覆喔∴釜喔班腑喔侧笖喙�喔涏箛喔權競喔编箟喔權笗喔笝喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム弗喙堗抚喔囙斧喔權箟喔侧笚喔掂箞喔箥喔侧竸喔编笉喔腑喔囙競喔编箟喔權笗喔笝',
+    sideTipP2: '喔佮覆喔`箒喔氞箞喔囙釜喙堗抚喔權笀喔班箒喔氞箞喔囙競喙夃腑喔勦抚喔侧浮喔⑧覆喔о腑喔竵喙�喔涏箛喔權涪喙堗腑喔笝喙夃覆喙�喔炧阜喙堗腑喙冟斧喙夃箓喔∴箑喔斷弗喙�喔傕箟喔侧箖喔堗箘喔斷箟喔斷傅喔傕付喙夃笝 喔复喙堗竾喔權傅喙夃笂喙堗抚喔⑧笡喔`副喔氞笡喔`父喔囙竸喔膏笓喔犩覆喔炧箒喔ム赴喔勦抚喔侧浮喙�喔佮傅喙堗涪喔о競喙夃腑喔囙競喔竾喔溹弗喔ム副喔炧笜喙屶競喔竾喙佮笟喔氞笀喙嵿覆喔ム腑喔�',
+    sideTipP3: '喔佮覆喔`笚喙嵿覆喔勦抚喔侧浮喔赴喔覆喔斷笀喔班弗喔氞腑喔编竵喔傕福喔班箒喔ム赴喔`腹喔涏箒喔氞笟喔椸傅喙堗箘喔∴箞喔堗箥喔侧箑喔涏箛喔� 喔椸箥喔侧箖喔箟喔勦抚喔侧浮喔`腹喙夃釜喔班腑喔侧笖喔傕付喙夃笝喙佮弗喔班竾喙堗覆喔⑧笗喙堗腑喔佮覆喔`箒喔⑧竵喔о复喙�喔勦福喔侧赴喔箤',
+    sideTipP4: '喔佮覆喔`箒喔氞箞喔囙釜喙堗抚喔權箒喔ム赴喔佮覆喔`笚喙嵿覆喔勦抚喔侧浮喔赴喔覆喔斷笚喔掂箞喙�喔浮喔侧赴喔浮喔娻箞喔о涪喔涏福喔编笟喔涏福喔膏竾喔涏福喔班釜喔脆笚喔樴复喔犩覆喔炧競喔竾喙傕浮喙�喔斷弗 喙冟斧喙夃笢喔ム弗喔编笧喔樴箤喔椸傅喙堗箒喔∴箞喔權涪喙嵿覆喙佮弗喔班浮喔掂竸喔膏笓喔勦箞喔侧浮喔侧竵喔傕付喙夃笝',
+    previewTitle: '喔斷腹喔曕副喔о腑喔⑧箞喔侧竾',
+    previewTitleButton: '喔斷腹喔曕副喔о腑喔⑧箞喔侧竾',
+    previewButton: '喔佮覆喔`箑喔涏弗喔掂箞喔⑧笝喙勦笡喙冟笂喙夃福喔灌笡喙佮笟喔� Q&A',
+    previewSwitchTipStart: '喔佮覆喔`箒喔笖喔囙笗喔编抚喔涪喙堗覆喔囙釜喙堗抚喔權笡喔编笀喔堗父喔氞副喔權腑喔⑧腹喙堗箖喔權福喔灌笡喙佮笟喔氞競喙夃腑喔勦抚喔侧浮 喔佮覆喔`箑喔涏弗喔掂箞喔⑧笝喙勦笡喙冟笂喙夃笗喔编抚喔涪喙堗覆喔囙福喔灌笡喙佮笟喔氞竸喙嵿覆喔栢覆喔∴箒喔ム赴喔勦箥喔侧笗喔笟喔堗赴',
+    previewSwitchTipEnd: '喙冟笂喙夃箓喔椸箑喔勦箛喔權箑喔炧复喙堗浮喙�喔曕复喔�',
+    characters: '喔副喔佮競喔`赴',
+    indexSettingTip: '喔覆喔佮笗喙夃腑喔囙竵喔侧福喙�喔涏弗喔掂箞喔⑧笝喔о复喔樴傅喔佮覆喔`笀喔编笖喔椸箥喔侧笖喔编笂喔權傅喙佮弗喔班福喔灌笡喙佮笟喔氞竵喔侧福喔澿副喔� 喙傕笡喔`笖喙勦笡喔椸傅喙�',
+    retrievalSettingTip: '喔覆喔佮笗喙夃腑喔囙竵喔侧福喙�喔涏弗喔掂箞喔⑧笝喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗 喙傕笡喔`笖喙勦笡喔椸傅喙�',
+    datasetSettingLink: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔勦抚喔侧浮喔`腹喙�',
+    notAvailableForParentChild: '喙勦浮喙堗釜喔侧浮喔侧福喔栢箖喔娻箟喙勦笖喙夃竵喔编笟 喔斷副喔娻笝喔掂笢喔灌箟喔涏竵喔勦福喔竾-喔ム腹喔�',
+    qaSwitchHighQualityTipContent: '喔涏副喔堗笀喔膏笟喔编笝 喔∴傅喙�喔炧傅喔⑧竾喔о复喔樴傅喔佮覆喔`笀喔编笖喔椸箥喔侧笖喔编笂喔權傅喔勦父喔撪笭喔侧笧喔腹喔囙箑喔椸箞喔侧笝喔编箟喔權笚喔掂箞喔`腑喔囙福喔编笟喔佮覆喔`箒喔氞箞喔囙竵喔ム父喙堗浮喔`腹喔涏箒喔氞笟 Q&A 喔勦父喔撪笗喙夃腑喔囙竵喔侧福喙�喔涏弗喔掂箞喔⑧笝喙勦笡喙冟笂喙夃箓喔浮喔斷竸喔膏笓喔犩覆喔炧釜喔灌竾喔福喔粪腑喙勦浮喙�?',
+    fullDoc: '喙�喔竵喔覆喔`笁喔氞副喔氞箑喔曕箛喔�',
+    parentChild: '喔炧箞喔箒喔∴箞喔ム腹喔�',
+    parentChunkForContext: 'Parent-chunk 喔箥喔侧斧喔`副喔氞笟喔`复喔氞笚',
+    general: '喔椸副喙堗抚喙勦笡',
+    parentChildChunkDelimiterTip: '喔曕副喔о竸喔编箞喔權竸喔粪腑喔副喔佮競喔`赴喔椸傅喙堗箖喔娻箟喙冟笝喔佮覆喔`箒喔⑧竵喔傕箟喔竸喔о覆喔� \\n 喙佮笝喔班笝喙嵿覆喙冟斧喙夃箖喔娻箟喔箥喔侧斧喔`副喔氞竵喔侧福喙佮涪喔佮竵喙夃腑喔權斧喔ム副喔佮腑喔竵喙�喔涏箛喔權竵喙夃腑喔權涪喙堗腑喔⑧競喔權覆喔斷箑喔ム箛喔� 喔勦父喔撪涪喔编竾喔覆喔∴覆喔`笘喙冟笂喙夃笗喔编抚喔勦副喙堗笝喔炧复喙�喔ㄠ俯喔椸傅喙堗竵喙嵿覆喔笝喔斷箓喔斷涪喔曕副喔о竸喔膏笓喙�喔竾',
+    previewChunkCount: '{{喔權副喔殅} 喔佮箟喔笝喙傕笖喔⑧笡喔`赴喔∴覆喔�',
+    fullDocTip: '喙�喔竵喔覆喔`笚喔编箟喔囙斧喔∴笖喔堗赴喔栢腹喔佮箖喔娻箟喙�喔涏箛喔權釜喙堗抚喔權斧喔ム副喔佮箒喔ム赴喔斷付喔囙競喙夃腑喔∴腹喔ム箓喔斷涪喔曕福喔� 喙傕笡喔`笖喔椸福喔侧笟喔о箞喔侧笖喙夃抚喔⑧箑喔笗喔膏笢喔ム笖喙夃覆喔權笡喔`赴喔复喔椸笜喔脆笭喔侧笧 喔傕箟喔竸喔о覆喔∴笚喔掂箞喙�喔佮复喔� 10,000 喙傕笚喙�喔勦箛喔權笀喔班笘喔灌竵喔曕副喔斷笚喔笝喙傕笖喔⑧腑喔编笗喙傕笝喔∴副喔曕复',
+    useQALanguage: '喔佮箟喔笝喙傕笖喔⑧箖喔娻箟喔`腹喔涏箒喔氞笟 Q&A 喙冟笝',
+    switch: '喙�喔涏弗喔掂箞喔⑧笝',
+    paragraphTip: '喙傕斧喔∴笖喔權傅喙夃笀喔班箒喔氞箞喔囙競喙夃腑喔勦抚喔侧浮喔腑喔佮箑喔涏箛喔權涪喙堗腑喔笝喙夃覆喔曕覆喔∴笗喔编抚喔勦副喙堗笝喙佮弗喔班竸喔о覆喔∴涪喔侧抚喔傕腑喔囙竵喔ム父喙堗浮喔腹喔囙釜喔膏笖 喙傕笖喔⑧箖喔娻箟喔傕箟喔竸喔о覆喔∴笚喔掂箞喙佮涪喔佮箑喔涏箛喔權釜喙堗抚喔權斧喔ム副喔佮釜喙嵿覆喔福喔编笟喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗',
+    childChunkForRetrieval: '喔佮箟喔笝喙�喔斷箛喔佮釜喙嵿覆喔福喔编笟喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗',
+    parentChildDelimiterTip: '喔曕副喔о竸喔编箞喔權竸喔粪腑喔副喔佮競喔`赴喔椸傅喙堗箖喔娻箟喙冟笝喔佮覆喔`箒喔⑧竵喔傕箟喔竸喔о覆喔� \\n\\n 喙佮笝喔班笝喙嵿覆喙冟斧喙夃箖喔娻箟喔箥喔侧斧喔`副喔氞竵喔侧福喙佮笟喙堗竾喙�喔竵喔覆喔`笗喙夃笝喔夃笟喔编笟喔腑喔佮箑喔涏箛喔權釜喙堗抚喔權斧喔ム副喔佮競喔權覆喔斷箖喔笉喙� 喔勦父喔撪涪喔编竾喔覆喔∴覆喔`笘喙冟笂喙夃笗喔编抚喔勦副喙堗笝喔炧复喙�喔ㄠ俯喔椸傅喙堗竵喙嵿覆喔笝喔斷箓喔斷涪喔曕副喔о竸喔膏笓喙�喔竾',
+    qaSwitchHighQualityTipTitle: '喔`腹喔涏箒喔氞笟 Q&A 喔曕箟喔竾喙冟笂喙夃抚喔脆笜喔掂竵喔侧福喔堗副喔斷笚喙嵿覆喔斷副喔娻笝喔掂竸喔膏笓喔犩覆喔炧釜喔灌竾',
+    highQualityTip: '喙�喔∴阜喙堗腑喔澿副喔囙箖喔權箓喔浮喔斷竸喔膏笓喔犩覆喔炧釜喔灌竾喙�喔福喙囙笀喙佮弗喙夃抚 喔堗赴喙勦浮喙堗釜喔侧浮喔侧福喔栢箑喔涏弗喔掂箞喔⑧笝喔佮弗喔编笟喙�喔涏箛喔權箓喔浮喔斷笡喔`赴喔涪喔编笖喙勦笖喙�',
+    generalTip: '喙傕斧喔∴笖喔佮覆喔`箒喔氞箞喔囙竵喔ム父喙堗浮喔傕箟喔竸喔о覆喔∴笚喔编箞喔о箘喔� 喔佮弗喔膏箞喔∴笚喔掂箞喔斷付喔囙箒喔ム赴喙�喔`傅喔⑧竵喔勦阜喔權笀喔班箑喔浮喔粪腑喔權竵喔编笝',
+    previewChunkTip: '喔勦弗喔脆竵喔涏父喙堗浮 \'Preview Chunk\' 喔椸覆喔囙笖喙夃覆喔權笅喙夃覆喔⑧箑喔炧阜喙堗腑喙傕斧喔ム笖喔曕副喔о腑喔⑧箞喔侧竾',
+    previewChunk: '喔斷腹喔曕副喔о腑喔⑧箞喔侧竾 Chunk',
+    notAvailableForQA: '喙勦浮喙堗釜喔侧浮喔侧福喔栢箖喔娻箟喙勦笖喙夃竵喔编笟 Q&A Index',
+    paragraph: '喔о福喔`竸',
+    parentChildTip: '喙�喔∴阜喙堗腑喙冟笂喙夃箓喔浮喔斷笢喔灌箟喔涏竵喔勦福喔竾-喔`腑喔� child-chunk 喔堗赴喙冟笂喙夃釜喙嵿覆喔福喔编笟喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗 喙佮弗喔� parent-chunk 喔堗赴喙冟笂喙夃釜喙嵿覆喔福喔编笟喔佮覆喔`箑喔`傅喔⑧竵喔勦阜喔權箑喔涏箛喔權笟喔`复喔氞笚',
+  },
+  stepThree: {
+    creationTitle: '馃帀 喔福喙夃覆喔囙竸喔о覆喔∴福喔灌箟',
+    creationContent: '喙�喔`覆喔曕副喙夃竾喔娻阜喙堗腑喔勦抚喔侧浮喔`腹喙夃箓喔斷涪喔副喔曕箓喔權浮喔编笗喔� 喔勦父喔撪釜喔侧浮喔侧福喔栢箒喔佮箟喙勦競喙勦笖喙夃笗喔ム腑喔斷箑喔о弗喔�',
+    label: '喔娻阜喙堗腑喔勦抚喔侧浮喔`腹喙�',
+    additionTitle: '馃帀 喔副喔涏箓喔弗喔斷箑喔竵喔覆喔�',
+    additionP1: '喙�喔竵喔覆喔`笘喔灌竵喔副喔涏箓喔弗喔斷箘喔涏涪喔编竾喔勦抚喔侧浮喔`腹喙夃箒喔ム箟喔�',
+    additionP2: '喔勦父喔撪釜喔侧浮喔侧福喔栢竸喙夃笝喔覆喙勦笖喙夃箖喔權福喔侧涪喔佮覆喔`箑喔竵喔覆喔`競喔竾喔勦抚喔侧浮喔`腹喙�',
+    stop: '喔涪喔膏笖喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔�',
+    resume: '喔斷箥喔侧箑喔權复喔權竵喔侧福喔曕箞喔�',
+    navTo: '喙勦笡喔椸傅喙堗箑喔竵喔覆喔�',
+    sideTipTitle: '喔赴喙勦福喔曕箞喔箘喔�',
+    sideTipContent: '喔弗喔编竾喔堗覆喔佮笚喔掂箞喙�喔竵喔覆喔`箑喔福喙囙笀喔复喙夃笝喔佮覆喔`笀喔编笖喔椸箥喔侧笖喔编笂喔權傅 喔勦抚喔侧浮喔`腹喙夃釜喔侧浮喔侧福喔栢福喔о浮喙�喔傕箟喔侧竵喔编笟喙佮腑喔涏笧喔ム复喙�喔勦笂喔编笝喙�喔涏箛喔權笟喔`复喔氞笚 喔勦父喔撪釜喔侧浮喔侧福喔栢竸喙夃笝喔覆喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔氞福喔脆笟喔椸箖喔權斧喔權箟喔侧竵喔侧福喔涏福喔班釜喔侧笝喔囙覆喔權笧喔`箟喔浮喔椸箤 喔勦父喔撪涪喔编竾喔覆喔∴覆喔`笘喔福喙夃覆喔囙箑喔涏箛喔權笡喔ム副喙娻竵喔复喔權竵喔侧福喔堗副喔斷笚喙嵿覆喔斷副喔娻笝喔� ChatGPT 喔复喔福喔班釜喙嵿覆喔福喔编笟喔佮覆喔`箑喔溹涪喙佮笧喔`箞',
+    modelTitle: '喔勦父喔撪箒喔權箞喙冟笀喔福喔粪腑喔о箞喔侧笀喔班斧喔⑧父喔斷笣喔编竾?',
+    modelContent: '喔覆喔佮竸喔膏笓喔曕箟喔竾喔佮覆喔`笖喙嵿覆喙�喔權复喔權竵喔侧福喔曕箞喔箖喔權笭喔侧涪喔弗喔编竾 喔勦父喔撪笀喔班笖喙嵿覆喙�喔權复喔權竵喔侧福喔曕箞喔笀喔侧竵喔堗父喔斷笚喔掂箞喔勦父喔撪竸喙夃覆喔囙箘喔о箟',
+    modelButtonConfirm: '喔⑧阜喔權涪喔编笝',
+    modelButtonCancel: '喔⑧竵喙�喔ム复喔�',
+  },
+  otherDataSource: {
+    learnMore: '喔ㄠ付喔佮俯喔侧箑喔炧复喙堗浮喙�喔曕复喔�',
+    title: '喙�喔娻阜喙堗腑喔∴笗喙堗腑喔佮副喔氞箒喔弗喙堗竾喔傕箟喔浮喔灌弗喔阜喙堗笝喙冟笂喙堗箘喔浮',
+    description: '喔涏副喔堗笀喔膏笟喔编笝 喔愢覆喔權竸喔о覆喔∴福喔灌箟喔傕腑喔� Dify 喔∴傅喙佮斧喔ム箞喔囙競喙夃腑喔∴腹喔ム笚喔掂箞喔堗箥喔侧竵喔编笖喙�喔椸箞喔侧笝喔编箟喔� 喔佮覆喔`浮喔掂釜喙堗抚喔權福喙堗抚喔∴箖喔權箒喔弗喙堗竾喔傕箟喔浮喔灌弗喙冟笝喔愢覆喔權竸喔о覆喔∴福喔灌箟 Dify 喙�喔涏箛喔權抚喔脆笜喔掂笚喔掂箞喔⑧腑喔斷箑喔⑧傅喙堗涪喔∴箖喔權竵喔侧福喔娻箞喔о涪喙�喔炧复喙堗浮喔勦抚喔侧浮喔⑧阜喔斷斧喔⑧父喙堗笝喙佮弗喔班笧喔ム副喔囙競喔竾喙佮笧喔ム笗喔熰腑喔`箤喔∴釜喙嵿覆喔福喔编笟喔溹腹喙夃箖喔娻箟喔椸父喔佮竸喔� 喔勦腹喙堗浮喔粪腑喔佮覆喔`浮喔掂釜喙堗抚喔權福喙堗抚喔∴競喔竾喙�喔`覆喔椸箥喔侧箖喔箟喔囙箞喔侧涪喔曕箞喔竵喔侧福喙�喔`复喙堗浮喔曕箟喔權箖喔娻箟喔囙覆喔� 喙傕笡喔`笖喔勦弗喔脆竵喔椸傅喙堗弗喔脆竾喔勦箤喔斷箟喔侧笝喔ム箞喔侧竾喙�喔炧阜喙堗腑喙�喔`傅喔⑧笝喔`腹喙夃箑喔炧复喙堗浮喙�喔曕复喔�',
+  },
+  watercrawl: {
+    configWatercrawl: '喔佮赋喔笝喔� Watercrawl',
+    getApiKeyLinkText: '喔`副喔氞竸喔掂涪喙� API 喔傕腑喔囙竸喔膏笓喔堗覆喔� watercrawl.dev',
+    apiKeyPlaceholder: '喔勦傅喔⑧箤 API 喔堗覆喔� watercrawl.dev',
+  },
+}
+
+export default translation
diff --git a/i18n/th-TH/dataset-documents.ts b/i18n/th-TH/dataset-documents.ts
new file mode 100644
index 0000000..2f4c6d5
--- /dev/null
+++ b/i18n/th-TH/dataset-documents.ts
@@ -0,0 +1,394 @@
+const translation = {
+  list: {
+    title: '喙�喔竵喔覆喔�',
+    desc: '喙勦笩喔ム箤喔椸副喙夃竾喔浮喔斷競喔竾喔勦抚喔侧浮喔`腹喙夃笀喔班箒喔笖喔囙笚喔掂箞喔權傅喙� 喙佮弗喔班竸喔о覆喔∴福喔灌箟喔椸副喙夃竾喔浮喔斷釜喔侧浮喔侧福喔栢箑喔娻阜喙堗腑喔∴箓喔⑧竾喔佮副喔氞竵喔侧福喔箟喔侧竾喔复喔� Dify 喔福喔粪腑喔堗副喔斷笚喙嵿覆喔斷副喔娻笝喔掂笢喙堗覆喔權笡喔ム副喙娻竵喔复喔權箒喔娻笚',
+    addFile: '喙�喔炧复喙堗浮喙勦笩喔ム箤',
+    addPages: '喙�喔炧复喙堗浮喔笝喙夃覆',
+    addUrl: '喙�喔炧复喙堗浮 URL',
+    table: {
+      header: {
+        fileName: '喔娻阜喙堗腑喙勦笩喔ム箤',
+        words: '喔權复喔`父喔佮笗喔�',
+        hitCount: '喔堗箥喔侧笝喔о笝喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗',
+        uploadTime: '喙�喔о弗喔侧腑喔编笡喙傕斧喔ム笖',
+        status: '喔笘喔侧笝喔�',
+        action: '喔佮覆喔`箑喔勦弗喔粪箞喔笝喙勦斧喔�',
+        chunkingMode: '喙傕斧喔∴笖喔佮箟喔笝',
+      },
+      rename: '喔曕副喙夃竾喔娻阜喙堗腑喙冟斧喔∴箞',
+      name: '喔娻阜喙堗腑',
+    },
+    action: {
+      uploadFile: '喔副喔涏箓喔弗喔斷箘喔熰弗喙屶箖喔浮喙�',
+      settings: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔佮弗喔膏箞喔�',
+      addButton: '喙�喔炧复喙堗浮喔佮箟喔笝',
+      add: '喙�喔炧复喙堗浮喔佮箟喔笝',
+      batchAdd: '喙�喔炧复喙堗浮喙佮笟喔椸笂喙�',
+      archive: '喔腑喔堗笖喔浮喔侧涪喙�喔笗喔�',
+      unarchive: '喔⑧竵喙�喔ム复喔佮竵喔侧福喙�喔佮箛喔氞笘喔侧抚喔�',
+      delete: '喔ム笟',
+      enableWarning: '喙勦浮喙堗釜喔侧浮喔侧福喔栢箑喔涏复喔斷箖喔娻箟喔囙覆喔權箘喔熰弗喙屶笚喔掂箞喙�喔佮箛喔氞笘喔侧抚喔`箘喔斷箟',
+      sync: '喔嬥复喔囙竸喙�',
+    },
+    index: {
+      enable: '喙�喔涏复喔�',
+      disable: '喙�喔�',
+      all: '喔椸副喙夃竾喔浮喔�',
+      enableTip: '喔覆喔∴覆喔`笘喔堗副喔斷笚喙嵿覆喔斷副喔娻笝喔掂箘喔熰弗喙屶箘喔斷箟',
+      disableTip: '喙勦浮喙堗釜喔侧浮喔侧福喔栢笀喔编笖喔椸箥喔侧笖喔编笂喔權傅喙勦笩喔ム箤',
+    },
+    status: {
+      queuing: '喔堗副喔� 喔勦复喔�',
+      indexing: '喔斷副喔娻笝喔�',
+      paused: '喔涪喔膏笖喔娻副喙堗抚喔勦福喔侧抚',
+      error: '喔勦抚喔侧浮喔溹复喔斷笧喔ム覆喔�',
+      available: '喔∴傅喔涪喔灌箞',
+      enabled: '喙�喔涏复喔�',
+      disabled: '喔炧复喔佮覆喔�',
+      archived: '喙�喔佮箛喔� 喔栢覆喔о福',
+    },
+    empty: {
+      title: '喔⑧副喔囙箘喔∴箞喔∴傅喙�喔竵喔覆喔�',
+      upload: {
+        tip: '喔勦父喔撪釜喔侧浮喔侧福喔栢腑喔编笡喙傕斧喔ム笖喙勦笩喔ム箤 喔嬥复喔囙竸喙屶笀喔侧竵喙�喔о箛喔氞箘喔嬥笗喙� 喔福喔粪腑喔堗覆喔佮箒喔笡 webb 喙�喔娻箞喔� Notion, GitHub 喙�喔涏箛喔權笗喙夃笝',
+      },
+      sync: {
+        tip: 'Dify 喔堗赴喔斷覆喔о笝喙屶箓喔弗喔斷箘喔熰弗喙屶笀喔侧竵 Notion 喔傕腑喔囙竸喔膏笓喙�喔涏箛喔權福喔班涪喔班箒喔ム赴喔斷箥喔侧箑喔權复喔權竵喔侧福喙冟斧喙夃箑喔福喙囙笀喔浮喔氞腹喔`笓喙�',
+      },
+    },
+    delete: {
+      title: '喔勦父喔撪箒喔權箞喙冟笀喔福喔粪腑喙�喔涏弗喙堗覆 喔ム笟?',
+      content: '喔覆喔佮竸喔膏笓喔曕箟喔竾喔佮覆喔`笖喙嵿覆喙�喔權复喔權竵喔侧福喔曕箞喔箖喔權笭喔侧涪喔弗喔编竾 喔勦父喔撪笀喔班笖喙嵿覆喙�喔權复喔權竵喔侧福喔曕箞喔笀喔侧竵喔堗父喔斷笚喔掂箞喔勦父喔撪竸喙夃覆喔囙箘喔о箟',
+    },
+    batchModal: {
+      title: '喙佮笟喔椸笂喙屶箑喔炧复喙堗浮喔佮箟喔笝',
+      csvUploadTitle: '喔ム覆喔佮箒喔ム赴喔о覆喔囙箘喔熰弗喙� CSV 喔傕腑喔囙竸喔膏笓喔椸傅喙堗笝喔掂箞 喔福喔粪腑',
+      browse: '喙�喔ム箛喔�',
+      tip: '喙勦笩喔ム箤 CSV 喔曕箟喔竾喔腑喔斷竸喔ム箟喔竾喔佮副喔氞箓喔勦福喔囙釜喔`箟喔侧竾喔曕箞喔箘喔涏笝喔掂箟:',
+      question: '喔涏副喔嵿斧喔�',
+      answer: '喔曕腑喔�',
+      contentTitle: '喙�喔權阜喙夃腑喔覆喔佮箟喔笝',
+      content: '喙�喔權阜喙夃腑喔覆',
+      template: '喔斷覆喔о笝喙屶箓喔弗喔斷箑喔椸浮喙�喔炧弗喔曕笚喔掂箞喔權傅喙�',
+      cancel: '喔⑧竵喙�喔ム复喔�',
+      run: '喙�喔`傅喔⑧竵喙冟笂喙夃箒喔氞笚喔娻箤',
+      runError: '喙�喔`傅喔⑧竵喙冟笂喙夃笂喔膏笖喔囙覆喔權弗喙夃浮喙�喔弗喔�',
+      processing: '喙冟笝喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム箒喔氞笟喙佮笟喔椸笂喙�',
+      completed: '喔權箥喔侧箑喔傕箟喔侧箑喔福喙囙笀喔浮喔氞腹喔`笓喙�',
+      error: '喔傕箟喔笢喔脆笖喔炧弗喔侧笖喙冟笝喔佮覆喔`笝喙嵿覆喙�喔傕箟喔�',
+      ok: '喔曕竵喔ム竾, 喙勦笖喙�',
+    },
+    learnMore: '喔ㄠ付喔佮俯喔侧箑喔炧复喙堗浮喙�喔曕复喔�',
+  },
+  metadata: {
+    title: '喔傕箟喔浮喔灌弗喙�喔∴笗喔�',
+    desc: '喔佮覆喔`笗喔脆笖喔夃弗喔侧竵喔傕箟喔浮喔灌弗喙�喔∴笗喔侧釜喙嵿覆喔福喔编笟喙�喔竵喔覆喔`笂喙堗抚喔⑧箖喔箟 AI 喔覆喔∴覆喔`笘喙�喔傕箟喔侧笘喔多竾喙�喔竵喔覆喔`箘喔斷箟喔椸副喔權笚喙堗抚喔囙笚喔掂箒喔ム赴喙�喔涏复喔斷箑喔溹涪喙佮斧喔ム箞喔囙笚喔掂箞喔∴覆喔傕腑喔囙竵喔侧福喔箟喔侧竾喔复喔囙釜喙嵿覆喔福喔编笟喔溹腹喙夃箖喔娻箟',
+    dateTimeFormat: '喔∴浮喔∴浮 喔�, 喔� hh:mm A',
+    docTypeSelectTitle: '喙傕笡喔`笖喙�喔ム阜喔竵喔涏福喔班箑喔犩笚喙�喔竵喔覆喔�',
+    docTypeChangeTitle: '喙�喔涏弗喔掂箞喔⑧笝喔娻笝喔脆笖喙�喔竵喔覆喔�',
+    docTypeSelectWarning: '喔覆喔佮笂喔權复喔斷箑喔竵喔覆喔`浮喔掂竵喔侧福喙�喔涏弗喔掂箞喔⑧笝喙佮笡喔ム竾 喔傕箟喔浮喔灌弗喙�喔∴笗喔侧笚喔掂箞喙�喔曕复喔∴箖喔權競喔撪赴喔權傅喙夃笀喔班箘喔∴箞喔栢腹喔佮箑喔佮箛喔氞福喔编竵喔┼覆喙勦抚喙夃腑喔掂竵喔曕箞喔箘喔�',
+    firstMetaAction: '喙勦笡喔佮副喔權箑喔栢腑喔�',
+    placeholder: {
+      add: '喙�喔炧复喙堗浮',
+      select: '喙�喔ム阜喔竵',
+    },
+    source: {
+      upload_file: '喔副喔涏箓喔弗喔斷箘喔熰弗喙�',
+      notion: '喔嬥复喔囙竸喙屶箒喔氞笟喔熰腑喔`箤喔� Notion',
+      github: '喙佮笟喔氞笩喔福喙屶浮喔嬥复喔囙竸喙� Github',
+    },
+    type: {
+      book: '喔笝喔编竾喔阜喔�',
+      webPage: '喙�喔о箛喔氞箑喔炧笀',
+      paper: '喔佮福喔班笖喔侧俯',
+      socialMediaPost: '喙傕笧喔笗喙屶笟喔權箓喔嬥箑喔娻傅喔⑧弗喔∴傅喙�喔斷傅喔�',
+      personalDocument: '喙�喔竵喔覆喔`釜喙堗抚喔權笗喔编抚',
+      businessDocument: '喙�喔竵喔覆喔`笚喔侧竾喔樴父喔`竵喔脆笀',
+      IMChat: '喙佮笂喔� IM',
+      wikipediaEntry: '喔`覆喔⑧竵喔侧福喔о复喔佮复喔炧傅喙�喔斷傅喔�',
+      notion: '喔嬥复喔囙竸喙屶箒喔氞笟喔熰腑喔`箤喔� Notion',
+      github: '喙佮笟喔氞笩喔福喙屶浮喔嬥复喔囙竸喙� Github',
+      technicalParameters: '喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤喔椸覆喔囙箑喔椸竸喔權复喔�',
+    },
+    field: {
+      processRule: {
+        processDoc: '喙�喔竵喔覆喔`竵喔`赴喔氞抚喔權竵喔侧福',
+        segmentRule: '喔佮笌喔佮箟喔笝',
+        segmentLength: '喔勦抚喔侧浮喔⑧覆喔о競喔竾喔佮箟喔笝',
+        processClean: '喔佮福喔班笟喔о笝喔佮覆喔`釜喙堗竾喔傕箟喔竸喔о覆喔∴笚喔掂箞喔赴喔覆喔�',
+      },
+      book: {
+        title: '喔娻阜喙堗腑喙�喔`阜喙堗腑喔�',
+        language: '喔犩覆喔┼覆',
+        author: '喔溹腹喙夃箒喔曕箞喔�',
+        publisher: '喔溹腹喙夃笧喔脆浮喔炧箤',
+        publicationDate: '喔о副喔權笚喔掂箞喔曕傅喔炧复喔∴笧喙�',
+        ISBN: '喙勦腑喙�喔釜',
+        category: '喔涏福喔班箑喔犩笚',
+      },
+      webPage: {
+        title: '喔娻阜喙堗腑喙�喔`阜喙堗腑喔�',
+        url: 'URL',
+        language: '喔犩覆喔┼覆',
+        authorPublisher: '喔溹腹喙夃箑喔傕傅喔⑧笝/喔箥喔侧笝喔编竵喔炧复喔∴笧喙�',
+        publishDate: '喔о副喔權笚喔掂箞喙�喔溹涪喙佮笧喔`箞',
+        topicKeywords: '喔副喔о競喙夃腑/喔勦箥喔侧釜喙嵿覆喔勦副喔�',
+        description: '喔勦赋喔笜喔脆笟喔侧涪',
+      },
+      paper: {
+        title: '喔娻阜喙堗腑喙�喔`阜喙堗腑喔�',
+        language: '喔犩覆喔┼覆',
+        author: '喔溹腹喙夃箒喔曕箞喔�',
+        publishDate: '喔о副喔權笚喔掂箞喙�喔溹涪喙佮笧喔`箞',
+        journalConferenceName: '喔娻阜喙堗腑喔о覆喔`釜喔侧福/喔佮覆喔`笡喔`赴喔娻父喔�',
+        volumeIssuePage: '喔涏福喔脆浮喔侧笓/喔夃笟喔编笟/喔笝喙夃覆',
+        DOI: '喔斷腑喔�',
+        topicsKeywords: '喔副喔о競喙夃腑/喔勦箥喔侧釜喙嵿覆喔勦副喔�',
+        abstract: '喔權覆喔∴笜喔`福喔�',
+      },
+      socialMediaPost: {
+        platform: '喙佮笚喙堗笝',
+        authorUsername: '喔溹腹喙夃箑喔傕傅喔⑧笝/喔娻阜喙堗腑喔溹腹喙夃箖喔娻箟',
+        publishDate: '喔о副喔權笚喔掂箞喙�喔溹涪喙佮笧喔`箞',
+        postURL: 'URL 喙傕笧喔笗喙�',
+        topicsTags: '喔副喔о競喙夃腑/喙佮笚喙囙竵',
+      },
+      personalDocument: {
+        title: '喔娻阜喙堗腑喙�喔`阜喙堗腑喔�',
+        author: '喔溹腹喙夃箒喔曕箞喔�',
+        creationDate: '喔о副喔權笚喔掂箞喔福喙夃覆喔�',
+        lastModifiedDate: '喔о副喔權笚喔掂箞喙佮竵喙夃箘喔傕弗喙堗覆喔父喔�',
+        documentType: '喔涏福喔班箑喔犩笚喙�喔竵喔覆喔�',
+        tagsCategory: '喙佮笚喙囙竵/喔浮喔о笖喔浮喔灌箞',
+      },
+      businessDocument: {
+        title: '喔娻阜喙堗腑喙�喔`阜喙堗腑喔�',
+        author: '喔溹腹喙夃箒喔曕箞喔�',
+        creationDate: '喔о副喔權笚喔掂箞喔福喙夃覆喔�',
+        lastModifiedDate: '喔о副喔權笚喔掂箞喙佮竵喙夃箘喔傕弗喙堗覆喔父喔�',
+        documentType: '喔涏福喔班箑喔犩笚喙�喔竵喔覆喔�',
+        departmentTeam: '喙佮笢喔權竵/喔椸傅喔�',
+      },
+      IMChat: {
+        chatPlatform: '喙佮笧喔ム笗喔熰腑喔`箤喔∴箒喔娻笚',
+        chatPartiesGroupName: '喔涏覆喔`箤喔曕傅喙夃箒喔娻笚/喔娻阜喙堗腑喔佮弗喔膏箞喔�',
+        participants: '喔勦笝',
+        startDate: '喔о副喔權笚喔掂箞喙�喔`复喙堗浮喔曕箟喔�',
+        endDate: '喔о副喔權笚喔掂箞喔复喙夃笝喔父喔�',
+        topicsKeywords: '喔副喔о競喙夃腑/喔勦箥喔侧釜喙嵿覆喔勦副喔�',
+        fileType: '喔涏福喔班箑喔犩笚喙勦笩喔ム箤',
+      },
+      wikipediaEntry: {
+        title: '喔娻阜喙堗腑喙�喔`阜喙堗腑喔�',
+        language: '喔犩覆喔┼覆',
+        webpageURL: 'URL 喔傕腑喔囙斧喔權箟喔侧箑喔о箛喔�',
+        editorContributor: '喔氞福喔`笓喔侧笜喔脆竵喔侧福/喔溹腹喙夃福喙堗抚喔∴箖喔箟喔傕箟喔浮喔灌弗',
+        lastEditDate: '喔о副喔權笚喔掂箞喙佮竵喙夃箘喔傕弗喙堗覆喔父喔�',
+        summaryIntroduction: '喔福喔膏笡/喔氞笚喔權箥喔�',
+      },
+      notion: {
+        title: '喔娻阜喙堗腑喙�喔`阜喙堗腑喔�',
+        language: '喔犩覆喔┼覆',
+        author: '喔溹腹喙夃箒喔曕箞喔�',
+        createdTime: '喙�喔о弗喔侧笚喔掂箞喔福喙夃覆喔囙競喔多箟喔�',
+        lastModifiedTime: '喙�喔о弗喔侧箒喔佮箟喙勦競喔ム箞喔侧釜喔膏笖',
+        url: 'URL',
+        tag: '喔夃弗喔侧竵',
+        description: '喔勦赋喔笜喔脆笟喔侧涪',
+      },
+      github: {
+        repoName: '喔娻阜喙堗腑 Repo',
+        repoDesc: '喔勦箥喔侧腑喔樴复喔氞覆喔� Repo',
+        repoOwner: '喙�喔堗箟喔侧競喔竾 Repo',
+        fileName: '喔娻阜喙堗腑喙勦笩喔ム箤',
+        filePath: '喙�喔箟喔權笚喔侧竾喙勦笩喔ム箤',
+        programmingLang: '喔犩覆喔┼覆喙傕笡喔`箒喔佮福喔�',
+        url: 'URL',
+        license: '喙冟笟喔笝喔膏笉喔侧笗',
+        lastCommitTime: '喙�喔о弗喔侧竸喔浮喔∴复喔曕弗喙堗覆喔父喔�',
+        lastCommitAuthor: '喔溹腹喙夃箑喔傕傅喔⑧笝喔勦腑喔∴浮喔脆笗喔ム箞喔侧釜喔膏笖',
+      },
+      originInfo: {
+        originalFilename: '喔娻阜喙堗腑喙勦笩喔ム箤喙�喔斷复喔�',
+        originalFileSize: '喔傕笝喔侧笖喙勦笩喔ム箤喔曕箟喔權笁喔氞副喔�',
+        uploadDate: '喔о副喔權笚喔掂箞喔副喔涏箓喔弗喔�',
+        lastUpdateDate: '喔о副喔權笚喔掂箞喔副喔涏箑喔斷笗喔ム箞喔侧釜喔膏笖',
+        source: '喔椸傅喙堗浮喔�',
+      },
+      technicalParameters: {
+        segmentSpecification: '喔傕箟喔浮喔灌弗喔堗箥喔侧箑喔炧覆喔班競喔竾喔佮箟喔笝',
+        segmentLength: '喔勦抚喔侧浮喔⑧覆喔о競喔竾喔佮箟喔笝',
+        avgParagraphLength: '喔勦抚喔侧浮喔⑧覆喔о涪喙堗腑喔笝喙夃覆喙�喔夃弗喔掂箞喔�',
+        paragraphs: '喔⑧箞喔斧喔權箟喔�',
+        hitCount: '喔堗箥喔侧笝喔о笝喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗',
+        embeddingTime: '喙�喔о弗喔侧笣喔编竾',
+        embeddedSpend: '喔佮覆喔`箖喔娻箟喔堗箞喔侧涪喙佮笟喔氞笣喔编竾喔曕副喔�',
+      },
+    },
+    languageMap: {
+      zh: '喔堗傅喔�',
+      en: '喔副喔囙竵喔む俯',
+      es: '喔箑喔涏笝',
+      fr: '喔澿福喔编箞喔囙箑喔ㄠ釜',
+      de: '喙�喔⑧腑喔`浮喔编笝',
+      ja: '喔嵿傅喙堗笡喔膏箞喔�',
+      ko: '喙�喔佮覆喔弗喔�',
+      ru: '喔`副喔箑喔嬥傅喔�',
+      ar: '喔覆喔福喔编笟',
+      pt: '喙傕笡喔`笗喔膏箑喔佮釜',
+      it: '喔复喔曕覆喔ム傅',
+      nl: '喔斷副喔椸笂喙�',
+      pl: '喙傕笡喙佮弗喔權笖喙�',
+      sv: '喔抚喔掂箑喔斷笝',
+      tr: '喔曕父喔`竵喔�',
+      he: '喙�喔笟喔`腹',
+      hi: '喔复喔權笖喔�',
+      da: '喙�喔斷笝喔∴覆喔`箤喔�',
+      fi: '喔熰复喔權箒喔ム笝喔斷箤',
+      no: '喔權腑喔`箤喙�喔о涪喙�',
+      hu: '喔副喔囙竵喔侧福喔�',
+      el: '喔佮福喔掂竵',
+      cs: '喙�喔娻竵',
+      th: '喙勦笚喔�',
+      id: '喔复喔權箓喔斷笝喔掂箑喔嬥傅喔�',
+    },
+    categoryMap: {
+      book: {
+        fiction: '喔權复喔⑧覆喔�',
+        biography: '喔娻傅喔о笡喔`赴喔о副喔曕复',
+        history: '喔涏福喔班抚喔编笗喔脆辅喔侧釜喔曕福喙�',
+        science: '喔о复喔椸涪喔侧辅喔侧釜喔曕福喙�',
+        technology: '喙�喔椸竸喙傕笝喙傕弗喔⑧傅',
+        education: '喔佮覆喔`辅喔多竵喔┼覆',
+        philosophy: '喔涏福喔编笂喔嵿覆',
+        religion: '喔ㄠ覆喔笝喔�',
+        socialSciences: '喔副喔囙竸喔∴辅喔侧釜喔曕福喙�',
+        art: '喔ㄠ复喔ム笡喙�',
+        travel: '喙�喔斷复喔權笚喔侧竾',
+        health: '喔父喔傕笭喔侧笧',
+        selfHelp: '喔娻箞喔о涪喙�喔弗喔粪腑喔曕笝喙�喔竾',
+        businessEconomics: '喔樴父喔`竵喔脆笀喙�喔ㄠ福喔┼笎喔ㄠ覆喔笗喔`箤',
+        cooking: '喔佮覆喔`斧喔膏竾喔曕箟喔�',
+        childrenYoungAdults: '喙�喔斷箛喔佮笢喔灌箟喙冟斧喔嵿箞',
+        comicsGraphicNovels: '喔佮覆喔`箤喔曕腹喔權笝喔脆涪喔侧涪喔佮福喔侧笩喔脆竵',
+        poetry: '喔佮抚喔掂笝喔脆笧喔權笜喙�',
+        drama: '喔ム赴喔勦福',
+        other: '喔阜喙堗笝喙�',
+      },
+      personalDoc: {
+        notes: '喔浮喔侧涪 喙�喔笗喔�',
+        blogDraft: '喔`箞喔侧竾喔氞弗喙囙腑喔�',
+        diary: '喙勦笖喔覆喔`傅喙�',
+        researchReport: '喔`覆喔⑧竾喔侧笝喔佮覆喔`抚喔脆笀喔编涪',
+        bookExcerpt: '喔傕箟喔竸喔о覆喔∴笚喔掂箞喔曕副喔斷笗喔笝喔∴覆喔堗覆喔佮斧喔權副喔囙釜喔粪腑',
+        schedule: '喔曕覆喔`覆喔�',
+        list: '喔`覆喔⑧竵喔侧福',
+        projectOverview: '喔犩覆喔炧福喔о浮喙傕竸喔`竾喔佮覆喔�',
+        photoCollection: '喔勦腑喔ム箑喔ム竵喔娻副喔權笭喔侧笧喔栢箞喔侧涪',
+        creativeWriting: '喔佮覆喔`箑喔傕傅喔⑧笝喙�喔娻复喔囙釜喔`箟喔侧竾喔福喔`竸喙�',
+        codeSnippet: '喔傕箟喔浮喔灌弗喙傕竸喙夃笖',
+        designDraft: '喔`箞喔侧竾喔佮覆喔`腑喔竵喙佮笟喔�',
+        personalResume: '喔涏福喔班抚喔编笗喔脆釜喙堗抚喔權笗喔编抚',
+        other: '喔阜喙堗笝喙�',
+      },
+      businessDoc: {
+        meetingMinutes: '喔`覆喔⑧竾喔侧笝喔佮覆喔`笡喔`赴喔娻父喔�',
+        researchReport: '喔`覆喔⑧竾喔侧笝喔佮覆喔`抚喔脆笀喔编涪',
+        proposal: '喔傕箟喔箑喔笝喔�',
+        employeeHandbook: '喔勦腹喙堗浮喔粪腑喔炧笝喔编竵喔囙覆喔�',
+        trainingMaterials: '喔阜喙堗腑喔佮覆喔`笣喔多竵喔笟喔`浮',
+        requirementsDocument: '喙�喔竵喔覆喔`競喙夃腑喔佮箥喔侧斧喔權笖',
+        designDocument: '喙�喔竵喔覆喔`竵喔侧福喔腑喔佮箒喔氞笟',
+        productSpecification: '喔勦父喔撪釜喔∴笟喔编笗喔脆競喔竾喔溹弗喔脆笗喔犩副喔撪笐喙�',
+        financialReport: '喔`覆喔⑧竾喔侧笝喔椸覆喔囙竵喔侧福喙�喔囙复喔�',
+        marketAnalysis: '喔佮覆喔`抚喔脆箑喔勦福喔侧赴喔箤喔曕弗喔侧笖',
+        projectPlan: '喙佮笢喔權箓喔勦福喔囙竵喔侧福',
+        teamStructure: '喙傕竸喔`竾喔福喙夃覆喔囙笚喔掂浮',
+        policiesProcedures: '喔權箓喔⑧笟喔侧涪喙佮弗喔班競喔编箟喔權笗喔笝',
+        contractsAgreements: '喔副喔嵿笉喔侧箒喔ム赴喔傕箟喔笗喔佮弗喔�',
+        emailCorrespondence: '喔佮覆喔`笗喔脆笖喔曕箞喔笚喔侧竾喔傅喙�喔∴弗',
+        other: '喔阜喙堗笝喙�',
+      },
+    },
+  },
+  embedding: {
+    processing: '喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム竵喔侧福喔澿副喔�...',
+    paused: '喔佮覆喔`笣喔编竾喔涪喔膏笖喔娻副喙堗抚喔勦福喔侧抚',
+    completed: '喔佮覆喔`笣喔编竾喙�喔福喙囙笀喔浮喔氞腹喔`笓喙�',
+    error: '喔傕箟喔笢喔脆笖喔炧弗喔侧笖喙冟笝喔佮覆喔`笣喔编竾',
+    docName: '喙�喔竵喔覆喔`竵喔侧福喔涏福喔班浮喔о弗喔溹弗喔ム箞喔о竾喔笝喙夃覆',
+    mode: '喔佮笌喔佮覆喔`箒喔氞箞喔囙竵喔ム父喙堗浮',
+    segmentLength: '喔勦抚喔侧浮喔⑧覆喔о競喔竾喔佮箟喔笝',
+    textCleaning: '喔佮覆喔`竵喙嵿覆喔笝喔斷競喙夃腑喔勦抚喔侧浮喔ム箞喔о竾喔笝喙夃覆喙佮弗喔班竵喔侧福喔椸箥喔侧竸喔о覆喔∴釜喔班腑喔侧笖',
+    segments: '喔⑧箞喔斧喔權箟喔�',
+    highQuality: '喙傕斧喔∴笖喔勦父喔撪笭喔侧笧喔腹喔�',
+    economy: '喙傕斧喔∴笖喔涏福喔班斧喔⑧副喔�',
+    estimate: '喔佮覆喔`笟喔`复喙傕笭喔勦箓喔斷涪喔涏福喔班浮喔侧笓',
+    stop: '喔涪喔膏笖喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔�',
+    resume: '喔斷箥喔侧箑喔權复喔權竵喔侧福喔曕箞喔�',
+    automatic: '喔副喔曕箓喔權浮喔编笗喔�',
+    custom: '喔樴福喔`浮喙�喔權傅喔⑧浮',
+    previewTip: '喔佮覆喔`箒喔笖喔囙笗喔编抚喔涪喙堗覆喔囙涪喙堗腑喔笝喙夃覆喔堗赴喔炧福喙夃腑喔∴箖喔娻箟喔囙覆喔權斧喔ム副喔囙笀喔侧竵喔佮覆喔`笣喔编竾喙�喔福喙囙笀喔复喙夃笝',
+    childMaxTokens: '喙�喔斷箛喔�',
+    parentMaxTokens: '喔炧箞喔箒喔∴箞',
+    pause: '喔涪喔膏笖',
+    hierarchical: '喔炧箞喔箒喔∴箞喔ム腹喔�',
+  },
+  segment: {
+    paragraphs: '喔⑧箞喔斧喔權箟喔�',
+    keywords: '喔勦箥喔侧釜喙嵿覆喔勦副喔�',
+    addKeyWord: '喙�喔炧复喙堗浮喔勦箥喔侧釜喙嵿覆喔勦副喔�',
+    keywordError: '喔勦抚喔侧浮喔⑧覆喔о釜喔灌竾喔父喔斷競喔竾喔勦箥喔侧斧喔ム副喔佮竸喔粪腑 20',
+    characters: '喔副喔佮競喔`赴',
+    hitCount: '喔堗箥喔侧笝喔о笝喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗',
+    vectorHash: '喙佮府喔娻箑喔о竵喙�喔曕腑喔`箤:',
+    questionPlaceholder: '喙�喔炧复喙堗浮喔勦箥喔侧笘喔侧浮喔椸傅喙堗笝喔掂箞',
+    questionEmpty: '喔勦箥喔侧笘喔侧浮喙勦浮喙堗釜喔侧浮喔侧福喔栢抚喙堗覆喔囙箑喔涏弗喙堗覆喙勦笖喙�',
+    answerPlaceholder: '喙�喔炧复喙堗浮喔勦箥喔侧笗喔笟喔椸傅喙堗笝喔掂箞',
+    answerEmpty: '喔勦箥喔侧笗喔笟喙勦浮喙堗釜喔侧浮喔侧福喔栢抚喙堗覆喔囙箑喔涏弗喙堗覆喙勦笖喙�',
+    contentPlaceholder: '喙�喔炧复喙堗浮喙�喔權阜喙夃腑喔覆喔椸傅喙堗笝喔掂箞',
+    contentEmpty: '喙�喔權阜喙夃腑喔覆喙勦浮喙堗釜喔侧浮喔侧福喔栢抚喙堗覆喔囙箑喔涏弗喙堗覆喙勦笖喙�',
+    newTextSegment: '喙�喔嬥箛喔佮箑喔∴笝喔曕箤喔傕箟喔竸喔о覆喔∴箖喔浮喙�',
+    newQaSegment: '喔箞喔о笝喔栢覆喔� & 喔勦箥喔侧笗喔笟喙冟斧喔∴箞',
+    delete: '喔ム笟喔箞喔о笝喔權傅喙� ?',
+    parentChunks_other: '喔佮箟喔笝喔溹腹喙夃笡喔佮竸喔`腑喔�',
+    childChunkAdded: '喙�喔炧复喙堗浮喔佮箟喔笝喔ム腹喔� 1 喔娻复喙夃笝',
+    regeneratingMessage: '喔覆喔堗箖喔娻箟喙�喔о弗喔侧釜喔编竵喔勦福喔灌箞喙傕笡喔`笖喔`腑喔副喔佮竸喔`腹喙�...',
+    regenerationSuccessTitle: '喔佮覆喔`笩喔粪箟喔權笩喔灌箑喔福喙囙笀喔浮喔氞腹喔`笓喙�',
+    chunkDetail: '喔`覆喔⑧弗喔班箑喔傅喔⑧笖喔佮箟喔笝',
+    childChunk: '喔佮箟喔笝喙�喔斷箛喔�',
+    chunk: '喔佮箟喔笝',
+    edited: '喙佮竵喙夃箘喔�',
+    addChunk: '喙�喔炧复喙堗浮喔佮箟喔笝',
+    editedAt: '喙佮竵喙夃箘喔傕笚喔掂箞',
+    childChunks_other: '喔佮箟喔笝喙�喔斷箛喔�',
+    editChildChunk: '喙佮竵喙夃箘喔� Child Chunk',
+    parentChunk: '喔溹腹喙夃笡喔佮竸喔`腑喔�-喔佮箟喔笝',
+    newChildChunk: '喔佮箟喔笝喙�喔斷箛喔佮箖喔浮喙�',
+    regenerationConfirmTitle: '喔勦父喔撪笗喙夃腑喔囙竵喔侧福喔福喙夃覆喔囙竵喙夃腑喔權箑喔斷箛喔佮競喔多箟喔權浮喔侧箖喔浮喙堗斧喔`阜喔箘喔∴箞?',
+    chunks_other: '喔佮箟喔笝',
+    regeneratingTitle: '喔佮覆喔`釜喔`箟喔侧竾喔佮箟喔笝喔ム腹喔佮箖喔浮喙�',
+    regenerationConfirmMessage: '喔佮覆喔`釜喔`箟喔侧竾喔佮箟喔笝喔⑧箞喔涪喙冟斧喔∴箞喔堗赴喙�喔傕傅喔⑧笝喔椸副喔氞釜喙堗抚喔權涪喙堗腑喔⑧笡喔编笀喔堗父喔氞副喔� 喔`抚喔∴笘喔多竾喔佮箟喔笝喔椸傅喙堗箒喔佮箟喙勦競喙佮弗喙夃抚喙佮弗喔班竵喙夃腑喔權笚喔掂箞喙�喔炧复喙堗浮喙�喔傕箟喔侧浮喔侧箖喔浮喙� 喔佮覆喔`笩喔粪箟喔權笩喔灌箘喔∴箞喔覆喔∴覆喔`笘喔⑧竵喙�喔ム复喔佮箘喔斷箟',
+    chunkAdded: '喙�喔炧复喙堗浮 1 喔佮箟喔笝',
+    expandChunks: '喔傕涪喔侧涪喔佮箟喔笝',
+    searchResults_zero: '喔溹弗',
+    characters_one: '喔副喔佮競喔`赴',
+    empty: '喙勦浮喙堗笧喔氞竵喙夃腑喔�',
+    addChildChunk: '喙�喔炧复喙堗浮 Child Chunk',
+    chunks_one: '喔佮箟喔笝',
+    clearFilter: '喔ム箟喔侧竾喔曕副喔о竵喔`腑喔�',
+    searchResults_one: '喔溹弗',
+    addAnother: '喙�喔炧复喙堗浮喔傅喔�',
+    editParentChunk: '喙佮竵喙夃箘喔傕釜喙堗抚喔權笢喔灌箟喔涏竵喔勦福喔竾',
+    characters_other: '喔副喔佮競喔`赴',
+    parentChunks_one: '喔佮箟喔笝喔溹腹喙夃笡喔佮竸喔`腑喔�',
+    collapseChunks: '喔⑧父喔氞竵喙夃腑喔�',
+    newChunk: '喔佮箟喔笝喙冟斧喔∴箞',
+    editChunk: '喙佮竵喙夃箘喔傕竵喙夃腑喔�',
+    searchResults_other: '喔溹弗喔ム副喔炧笜喙�',
+    regenerationSuccessMessage: '喔勦父喔撪釜喔侧浮喔侧福喔栢笡喔脆笖喔笝喙夃覆喔曕箞喔侧竾喔權傅喙夃箘喔斷箟',
+    childChunks_one: '喔佮箟喔笝喙�喔斷箛喔�',
+  },
+}
+
+export default translation
diff --git a/i18n/th-TH/dataset-hit-testing.ts b/i18n/th-TH/dataset-hit-testing.ts
new file mode 100644
index 0000000..d04f2be
--- /dev/null
+++ b/i18n/th-TH/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: '喔佮覆喔`笚喔斷釜喔笟喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗',
+  settingTitle: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗',
+  desc: '喔椸笖喔腑喔氞箑喔笩喙�喔熰竵喔曕箤喔佮覆喔`笗喔掂競喔竾喔勦抚喔侧浮喔`腹喙夃笗喔侧浮喔傕箟喔竸喔о覆喔∴箒喔氞笟喔腑喔氞笘喔侧浮喔椸傅喙堗竵喙嵿覆喔笝喔�',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  recents: '喔ム箞喔侧釜喔膏笖',
+  table: {
+    header: {
+      source: '喔椸傅喙堗浮喔�',
+      text: '喔傕箟喔竸喔о覆喔�',
+      time: '喙�喔о弗喔�',
+    },
+  },
+  input: {
+    title: '喔傕箟喔竸喔о覆喔∴笗喙夃笝喔夃笟喔编笟',
+    placeholder: '喔佮福喔膏笓喔侧笡喙夃腑喔權競喙夃腑喔勦抚喔侧浮喙佮笝喔班笝喙嵿覆喙冟斧喙夃箖喔娻箟喔涏福喔班箓喔⑧竸喔涏福喔班竵喔侧辅喔副喙夃笝 喙�',
+    countWarning: '喔腹喔囙釜喔膏笖 200 喔副喔佮競喔`赴',
+    indexWarning: '喔勦抚喔侧浮喔`腹喙夃竸喔膏笓喔犩覆喔炧釜喔灌竾喙�喔椸箞喔侧笝喔编箟喔�',
+    testing: '喔佮覆喔`笚喔斷釜喔笟',
+  },
+  hit: {
+    title: '喔⑧箞喔斧喔權箟喔侧笖喔多竾喔傕箟喔浮喔灌弗',
+    emptyTip: '喔溹弗喔佮覆喔`笚喔斷釜喔笟喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗喔堗赴喙佮釜喔斷竾喔椸傅喙堗笝喔掂箞',
+  },
+  noRecentTip: '喙勦浮喙堗浮喔掂笢喔ム竵喔侧福喔勦箟喔權斧喔侧弗喙堗覆喔父喔斷笚喔掂箞喔權傅喙�',
+  viewChart: '喔斷腹喙佮笢喔權笭喔灌浮喔脆箑喔о竵喙�喔曕腑喔`箤',
+  viewDetail: '喔斷腹喔`覆喔⑧弗喔班箑喔傅喔⑧笖',
+  open: '喙�喔涏复喔�',
+  keyword: '喔勦赋',
+  chunkDetail: '喔`覆喔⑧弗喔班箑喔傅喔⑧笖喔佮箟喔笝',
+  records: '喙�喔`竵 喔勦腑喔`箤喔�',
+  hitChunks: '喔佮笖 {{num}} 喔佮箟喔笝喔ム腹喔�',
+}
+
+export default translation
diff --git a/i18n/th-TH/dataset-settings.ts b/i18n/th-TH/dataset-settings.ts
new file mode 100644
index 0000000..7ddbbc3
--- /dev/null
+++ b/i18n/th-TH/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔勦抚喔侧浮喔`腹喙�',
+  desc: '喔椸傅喙堗笝喔掂箞喔勦父喔撪釜喔侧浮喔侧福喔栢箒喔佮箟喙勦競喔勦父喔撪釜喔∴笟喔编笗喔脆箒喔ム赴喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗喔傕腑喔囙竸喔о覆喔∴福喔灌箟喔權傅喙�',
+  form: {
+    name: '喔娻阜喙堗腑喔勦抚喔侧浮喔`腹喙�',
+    namePlaceholder: '喔佮福喔膏笓喔侧竵喔`腑喔佮笂喔粪箞喔竸喔о覆喔∴福喔灌箟',
+    nameError: '喔娻阜喙堗腑喔曕箟喔竾喙勦浮喙堗抚喙堗覆喔囙箑喔涏弗喙堗覆',
+    desc: '喔勦箥喔侧腑喔樴复喔氞覆喔⑧竸喔о覆喔∴福喔灌箟',
+    descInfo: '喙傕笡喔`笖喙�喔傕傅喔⑧笝喔勦箥喔侧腑喔樴复喔氞覆喔⑧競喙夃腑喔勦抚喔侧浮喔椸傅喙堗笂喔编笖喙�喔堗笝喙�喔炧阜喙堗腑喔`箞喔侧竾喙�喔權阜喙夃腑喔覆喔傕腑喔囙竸喔о覆喔∴福喔灌箟 喔勦箥喔侧腑喔樴复喔氞覆喔⑧笝喔掂箟喔堗赴喙冟笂喙夃箑喔涏箛喔權笧喔粪箟喔權笎喔侧笝喔箥喔侧斧喔`副喔氞竵喔侧福喔堗副喔氞竸喔灌箞喙�喔∴阜喙堗腑喙�喔ム阜喔竵喔堗覆喔佮竸喔о覆喔∴福喔灌箟喔弗喔侧涪喔`覆喔⑧竵喔侧福喙�喔炧阜喙堗腑喔佮覆喔`腑喔權父喔∴覆喔�',
+    descPlaceholder: '喔笜喔脆笟喔侧涪喔复喙堗竾喔椸傅喙堗腑喔⑧腹喙堗箖喔權竸喔о覆喔∴福喔灌箟喔權傅喙� (喙勦浮喙堗笟喔编竾喔勦副喔�)',
+    descWrite: '喙�喔`傅喔⑧笝喔`腹喙夃抚喔脆笜喔掂箑喔傕傅喔⑧笝喔勦箥喔侧腑喔樴复喔氞覆喔⑧竸喔о覆喔∴福喔灌箟喔椸傅喙堗笖喔�',
+    permissions: '喔复喔椸笜喔脆箤',
+    permissionsOnlyMe: '喔夃副喔權箑喔椸箞喔侧笝喔编箟喔�',
+    permissionsAllMember: '喔浮喔侧笂喔脆竵喙冟笝喔椸傅喔∴笚喔膏竵喔勦笝',
+    permissionsInvitedMembers: '喔浮喔侧笂喔脆竵喙冟笝喔椸傅喔∴笟喔侧竾喔箞喔о笝',
+    me: '(喔勦父喔�)',
+    indexMethod: '喔о复喔樴傅喔佮覆喔`笀喔编笖喔椸箥喔侧笖喔编笂喔權傅',
+    indexMethodHighQuality: '喔勦父喔撪笭喔侧笧喔腹喔�',
+    indexMethodHighQualityTip: '喙�喔`傅喔⑧竵喙冟笂喙夃箒喔氞笟喔堗箥喔侧弗喔竾喔佮覆喔`笣喔编竾喔曕副喔о釜喙嵿覆喔福喔编笟喔佮覆喔`笡喔`赴喔∴抚喔ム笢喔ム箑喔炧阜喙堗腑喙冟斧喙夃浮喔掂竸喔о覆喔∴箒喔∴箞喔權涪喙嵿覆喔腹喔囙競喔多箟喔權箑喔∴阜喙堗腑喔溹腹喙夃箖喔娻箟喔阜喔氞竸喙夃笝',
+    indexMethodEconomy: '喔涏福喔班斧喔⑧副喔�',
+    indexMethodEconomyTip: '喙冟笂喙夃箑喔箛喔權笀喔脆箟喔權箑喔о竵喙�喔曕腑喔`箤喔腑喔熰箘喔ム笝喙� 喔斷副喔娻笝喔掂竸喙嵿覆喔弗喔编竵 喔弗喔� 喙�喔炧阜喙堗腑喔ム笖喔勦抚喔侧浮喙佮浮喙堗笝喔⑧箥喔侧箓喔斷涪喙勦浮喙堗笗喙夃腑喔囙箖喔娻箟喙傕笚喙�喔勦箛喔�',
+    embeddingModel: '喙傕浮喙�喔斷弗喔佮覆喔`笣喔编竾',
+    embeddingModelTip: '喙�喔涏弗喔掂箞喔⑧笝喔`父喙堗笝喔椸傅喙堗笣喔编竾喙勦抚喙� 喙傕笡喔`笖喙勦笡喔椸傅喙�',
+    embeddingModelTipLink: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆',
+    retrievalSetting: {
+      title: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗',
+      learnMore: '喔ㄠ付喔佮俯喔侧箑喔炧复喙堗浮喙�喔曕复喔�',
+      description: '喙�喔佮傅喙堗涪喔о竵喔编笟喔о复喔樴傅喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗',
+      longDescription: '喙�喔佮傅喙堗涪喔о竵喔编笟喔о复喔樴傅喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗 喔勦父喔撪釜喔侧浮喔侧福喔栢箑喔涏弗喔掂箞喔⑧笝喙佮笡喔ム竾喙勦笖喙夃笗喔ム腑喔斷箑喔о弗喔侧箖喔權竵喔侧福喔曕副喙夃竾喔勦箞喔侧竸喔о覆喔∴福喔灌箟',
+      method: '喔о复喔樴傅喔佮覆喔`竸喙夃笝喔勦阜喔�',
+    },
+    externalKnowledgeAPI: 'API 喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔�',
+    externalKnowledgeID: 'ID 喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔�',
+    retrievalSettings: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗',
+    save: '喔涏福喔班斧喔⑧副喔�',
+    indexMethodChangeToEconomyDisabledTip: '喙勦浮喙堗釜喔侧浮喔侧福喔栢笖喔侧抚喔權箤喙�喔佮福喔斷笀喔侧竵 HQ 喙�喔涏箛喔� ECO 喙勦笖喙�',
+    helpText: '喙�喔`傅喔⑧笝喔`腹喙夃抚喔脆笜喔掂箑喔傕傅喔⑧笝喔勦箥喔侧腑喔樴复喔氞覆喔⑧笂喔膏笖喔傕箟喔浮喔灌弗喔椸傅喙堗笖喔�',
+    upgradeHighQualityTip: '喙�喔∴阜喙堗腑喔副喔涏箑喔佮福喔斷箑喔涏箛喔權箓喔浮喔斷竸喔膏笓喔犩覆喔炧釜喔灌竾喙佮弗喙夃抚 喔堗赴喙勦浮喙堗釜喔侧浮喔侧福喔栢箑喔涏弗喔掂箞喔⑧笝喔佮弗喔编笟喙�喔涏箛喔權箓喔浮喔斷笡喔`赴喔涪喔编笖喙勦笖喙�',
+    searchModel: '喔勦箟喔權斧喔侧福喔膏箞喔�',
+  },
+}
+
+export default translation
diff --git a/i18n/th-TH/dataset.ts b/i18n/th-TH/dataset.ts
new file mode 100644
index 0000000..15ef381
--- /dev/null
+++ b/i18n/th-TH/dataset.ts
@@ -0,0 +1,220 @@
+const translation = {
+  knowledge: '喔勦抚喔侧浮喔`腹喙�',
+  externalTag: '喔犩覆喔⑧笝喔竵',
+  externalAPI: 'API 喔犩覆喔⑧笝喔竵',
+  externalAPIPanelTitle: 'API 喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔�',
+  externalKnowledgeId: 'ID 喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔�',
+  externalKnowledgeName: '喔娻阜喙堗腑喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔�',
+  externalKnowledgeDescription: '喔勦箥喔侧腑喔樴复喔氞覆喔⑧竸喔о覆喔∴福喔灌箟',
+  externalKnowledgeIdPlaceholder: '喙傕笡喔`笖喔涏箟喔笝 Knowledge ID',
+  externalKnowledgeNamePlaceholder: '喙傕笡喔`笖喔涏箟喔笝喔娻阜喙堗腑喔愢覆喔權竸喔о覆喔∴福喔灌箟',
+  externalKnowledgeDescriptionPlaceholder: '喔笜喔脆笟喔侧涪喔复喙堗竾喔椸傅喙堗腑喔⑧腹喙堗箖喔權笎喔侧笝喔勦抚喔侧浮喔`腹喙夃笝喔掂箟 (喙勦浮喙堗笟喔编竾喔勦副喔�)',
+  learnHowToWriteGoodKnowledgeDescription: '喙�喔`傅喔⑧笝喔`腹喙夃抚喔脆笜喔掂竵喔侧福喙�喔傕傅喔⑧笝喔勦箥喔侧腑喔樴复喔氞覆喔⑧竸喔о覆喔∴福喔灌箟喔椸傅喙堗笖喔�',
+  externalAPIPanelDescription: 'API 喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔佮箖喔娻箟喙�喔炧阜喙堗腑喙�喔娻阜喙堗腑喔∴笗喙堗腑喔佮副喔氞笎喔侧笝喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔� Dify 喙佮弗喔班笖喔多竾喔勦抚喔侧浮喔`腹喙夃笀喔侧竵喔愢覆喔權竸喔о覆喔∴福喔灌箟喔權副喙夃笝',
+  externalAPIPanelDocumentation: '喙�喔`傅喔⑧笝喔`腹喙夃抚喔脆笜喔掂釜喔`箟喔侧竾 API 喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔�',
+  documentCount: '喙�喔竵喔覆喔�',
+  wordCount: '喔勦箥喔� k',
+  appCount: '喙佮腑喔涏笚喔掂箞喙�喔娻阜喙堗腑喔∴箓喔⑧竾',
+  createDataset: '喔福喙夃覆喔囙竸喔о覆喔∴福喔灌箟',
+  createNewExternalAPI: '喔福喙夃覆喔� API 喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔佮箖喔浮喙�',
+  noExternalKnowledge: '喔⑧副喔囙箘喔∴箞喔∴傅 External Knowledge API 喔勦弗喔脆竵喔椸傅喙堗笝喔掂箞喙�喔炧阜喙堗腑喔福喙夃覆喔�',
+  createExternalAPI: '喙�喔炧复喙堗浮 API 喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔�',
+  editExternalAPIFormTitle: '喙佮竵喙夃箘喔� API 喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔�',
+  editExternalAPITooltipTitle: '喔勦抚喔侧浮喔`腹喙夃笚喔掂箞喙�喔娻阜喙堗腑喔∴箓喔⑧竾',
+  editExternalAPIConfirmWarningContent: {
+    front: 'API 喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔佮笝喔掂箟喙�喔娻阜喙堗腑喔∴箓喔⑧竾喔佮副喔�',
+    end: '喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔佮箒喔ム赴喔佮覆喔`笡喔`副喔氞箑喔涏弗喔掂箞喔⑧笝喔權傅喙夃笀喔班笝喙嵿覆喙勦笡喙冟笂喙夃竵喔编笟喔炧抚喔佮箑喔傕覆喔椸副喙夃竾喔浮喔� 喔勦父喔撪箒喔權箞喙冟笀喔福喔粪腑喙勦浮喙堗抚喙堗覆喔曕箟喔竾喔佮覆喔`笟喔编笝喔椸付喔佮竵喔侧福喙�喔涏弗喔掂箞喔⑧笝喙佮笡喔ム竾喔權傅喙�?',
+  },
+  editExternalAPIFormWarning: {
+    front: 'API 喔犩覆喔⑧笝喔竵喔權傅喙夃箑喔娻阜喙堗腑喔∴箓喔⑧竾喔佮副喔�',
+    end: '喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔�',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: '喔ム笟',
+      end: '?',
+    },
+    content: {
+      front: 'API 喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔佮笝喔掂箟喙�喔娻阜喙堗腑喔∴箓喔⑧竾喔佮副喔�',
+      end: '喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔� 喔佮覆喔`弗喔� API 喔權傅喙夃笀喔班笚喙嵿覆喙冟斧喙� API 喔椸副喙夃竾喔浮喔斷箑喔涏箛喔權箓喔∴竼喔� 喔勦父喔撪箒喔權箞喙冟笀喔福喔粪腑喙勦浮喙堗抚喙堗覆喔曕箟喔竾喔佮覆喔`弗喔� API 喔權傅喙�?',
+    },
+    noConnectionContent: '喔勦父喔撪箒喔權箞喙冟笀喔о箞喔侧笀喔班弗喔� API 喔權傅喙夃斧喔`阜喔箘喔∴箞',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: '喙�喔ム阜喔竵 API 喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔�',
+  },
+  connectDataset: '喙�喔娻阜喙堗腑喔∴笗喙堗腑喔佮副喔氞笎喔侧笝喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔�',
+  connectDatasetIntro: {
+    title: '喔о复喔樴傅喔佮覆喔`箑喔娻阜喙堗腑喔∴笗喙堗腑喔佮副喔氞笎喔侧笝喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔�',
+    content: {
+      front: '喙�喔∴阜喙堗腑喔曕箟喔竾喔佮覆喔`箑喔娻阜喙堗腑喔∴笗喙堗腑喔佮副喔氞笎喔侧笝喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔� 喔勦父喔撪笗喙夃腑喔囙釜喔`箟喔侧竾 API 喔犩覆喔⑧笝喔竵喔佮箞喔笝 喙傕笡喔`笖喔箞喔侧笝喔涪喙堗覆喔囙弗喔班箑喔傅喔⑧笖喙佮弗喔班腑喙夃覆喔囙腑喔脆竾',
+      link: '喔斷腹喔о复喔樴傅喔福喙夃覆喔� API 喔犩覆喔⑧笝喔竵',
+      end: '. 喔堗覆喔佮笝喔编箟喔權竸喙夃笝喔覆 Knowledge ID 喔椸傅喙堗箑喔佮傅喙堗涪喔о競喙夃腑喔囙箒喔ム赴喔佮福喔竵喔傕箟喔浮喔灌弗喙冟笝喙佮笟喔氞笩喔福喙屶浮喔椸覆喔囙笖喙夃覆喔權笅喙夃覆喔� 喔覆喔佮競喙夃腑喔∴腹喔ム笚喔编箟喔囙斧喔∴笖喔栢腹喔佮笗喙夃腑喔� 喔傕箟喔浮喔灌弗喔堗赴喔傕箟喔侧浮喙勦笡喔⑧副喔囙竵喔侧福喔椸笖喔腑喔氞竵喔侧福喔斷付喔囙競喙夃腑喔∴腹喔ム箖喔權笎喔侧笝喔勦抚喔侧浮喔`腹喙夃箓喔斷涪喔副喔曕箓喔權浮喔编笗喔脆斧喔ム副喔囙笀喔侧竵喔勦弗喔脆竵喔涏父喙堗浮喙�喔娻阜喙堗腑喔∴笗喙堗腑',
+    },
+    learnMore: '喔ㄠ付喔佮俯喔侧箑喔炧复喙堗浮喙�喔曕复喔�',
+  },
+  connectHelper: {
+    helper1: '喙�喔娻阜喙堗腑喔∴笗喙堗腑喔佮副喔氞笎喔侧笝喔勦抚喔侧浮喔`腹喙夃笭喔侧涪喔權腑喔佮笢喙堗覆喔� API 喙佮弗喔� ID 喔愢覆喔權竸喔о覆喔∴福喔灌箟 喔涏副喔堗笀喔膏笟喔编笝',
+    helper2: '喔`腑喔囙福喔编笟喙�喔夃笧喔侧赴喔熰副喔囙竵喙屶笂喔编笝喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗',
+    helper3: '. 喙�喔`覆喔傕腑喙佮笝喔班笝喙嵿覆喙冟斧喙夃竸喔膏笓',
+    helper4: '喔箞喔侧笝喙�喔竵喔覆喔`抚喔脆笜喔掂箖喔娻箟',
+    helper5: '喔`赴喔∴副喔斷福喔班抚喔编竾喔佮箞喔笝喙冟笂喙夃竸喔膏笓喔浮喔氞副喔曕复喔權傅喙�',
+  },
+  createDatasetIntro: '喔權箥喔侧箑喔傕箟喔侧競喙夃腑喔∴腹喔ム競喙夃腑喔勦抚喔侧浮喔傕腑喔囙竸喔膏笓喙�喔竾喔福喔粪腑喙�喔傕傅喔⑧笝喔傕箟喔浮喔灌弗喙佮笟喔氞箑喔`傅喔⑧弗喙勦笚喔∴箤喔溹箞喔侧笝 Webhook 喙�喔炧阜喙堗腑喔涏福喔编笟喔涏福喔膏竾喔氞福喔脆笟喔� LLM',
+  deleteDatasetConfirmTitle: '喔ム笟喔勦抚喔侧浮喔`腹喙夃笝喔掂箟?',
+  deleteDatasetConfirmContent: '喔佮覆喔`弗喔氞竸喔о覆喔∴福喔灌箟喔權副喙夃笝喙勦浮喙堗釜喔侧浮喔侧福喔栢涪喙夃腑喔權竵喔ム副喔氞箘喔斷箟 喔溹腹喙夃箖喔娻箟喔堗赴喙勦浮喙堗釜喔侧浮喔侧福喔栢箑喔傕箟喔侧笘喔多竾喔勦抚喔侧浮喔`腹喙夃競喔竾喔勦父喔撪腑喔掂竵喔曕箞喔箘喔� 喙佮弗喔班竵喔侧福喔佮箥喔侧斧喔權笖喔勦箞喔侧笧喔`箟喔浮喔椸箤喙佮弗喔班笟喔编笝喔椸付喔佮笚喔编箟喔囙斧喔∴笖喔堗赴喔栢腹喔佮弗喔氞腑喔⑧箞喔侧竾喔栢覆喔о福',
+  datasetUsedByApp: '喔勦抚喔侧浮喔`腹喙夃笝喔掂箟喔栢腹喔佮箖喔娻箟喙傕笖喔⑧笟喔侧竾喙佮腑喔� 喙佮腑喔涏笀喔班箘喔∴箞喔覆喔∴覆喔`笘喙冟笂喙夃竸喔о覆喔∴福喔灌箟喔權傅喙夃箘喔斷箟喔傅喔佮笗喙堗腑喙勦笡 喙佮弗喔班竵喔侧福喔佮箥喔侧斧喔權笖喔勦箞喔侧笧喔`箟喔浮喔椸箤喙佮弗喔班笟喔编笝喔椸付喔佮笚喔编箟喔囙斧喔∴笖喔堗赴喔栢腹喔佮弗喔氞腑喔⑧箞喔侧竾喔栢覆喔о福',
+  datasetDeleted: '喔ム笟喔勦抚喔侧浮喔`腹喙�',
+  datasetDeleteFailed: '喔ム笟喔勦抚喔侧浮喔`腹喙夃箘喔∴箞喔箥喔侧箑喔`箛喔�',
+  didYouKnow: '喔勦父喔撪福喔灌箟喔福喔粪腑喙勦浮喙�?',
+  intro1: '喔勦抚喔侧浮喔`腹喙夃釜喔侧浮喔侧福喔栢福喔о浮喙�喔傕箟喔侧竵喔编笟喙佮腑喔涏笧喔ム复喙�喔勦笂喔编笝 Dify 喙勦笖喙�',
+  intro2: '喔曕覆喔∴笟喔`复喔氞笚',
+  intro3: ',',
+  intro4: '喔福喔粪腑喔∴副喔�',
+  intro5: '喔覆喔∴覆喔`笘喔福喙夃覆喔囙箘喔斷箟',
+  intro6: '喙�喔涏箛喔權笡喔ム副喙娻竵喔复喔權笖喔编笂喔權傅 ChatGPT 喙佮笟喔氞釜喙佮笗喔權笖喙屶腑喙傕弗喔權箑喔炧阜喙堗腑喙�喔溹涪喙佮笧喔`箞',
+  unavailable: '喙勦浮喙�',
+  unavailableTip: '喙傕浮喙�喔斷弗喔佮覆喔`笣喔编竾喙勦浮喙堗笧喔`箟喔浮喙冟笂喙夃竾喔侧笝 喔堗箥喔侧箑喔涏箛喔權笗喙夃腑喔囙竵喙嵿覆喔笝喔斷竸喙堗覆喙傕浮喙�喔斷弗喔佮覆喔`笣喔编竾喙�喔`复喙堗浮喔曕箟喔�',
+  datasets: '喔勦抚喔侧浮喔`腹喙�',
+  datasetsApi: '喔佮覆喔`箑喔傕箟喔侧笘喔多竾 API',
+  externalKnowledgeForm: {
+    connect: '喔曕复喔�',
+    cancel: '喔⑧竵喙�喔ム复喔�',
+  },
+  externalAPIForm: {
+    name: '喔娻阜喙堗腑',
+    endpoint: '喔涏弗喔侧涪喔椸覆喔� API',
+    apiKey: '喔勦傅喔⑧箤 API',
+    save: '喔涏福喔班斧喔⑧副喔�',
+    cancel: '喔⑧竵喙�喔ム复喔�',
+    edit: '喙佮竵喙夃箘喔�',
+    encrypted: {
+      front: '喙傕笚喙�喔勦箛喔� API 喔傕腑喔囙竸喔膏笓喔堗赴喔栢腹喔佮箑喔傕箟喔侧福喔副喔箒喔ム赴喔堗副喔斷箑喔佮箛喔氞箓喔斷涪喙冟笂喙�',
+      end: '喙�喔椸竸喙傕笝喙傕弗喔⑧傅 ',
+    },
+  },
+  retrieval: {
+    semantic_search: {
+      title: '喔佮覆喔`竸喙夃笝喔覆喙�喔о竵喙�喔曕腑喔`箤',
+      description: '喔福喙夃覆喔囙竵喔侧福喔澿副喔囙箒喔氞笟喔腑喔氞笘喔侧浮喙佮弗喔班竸喙夃笝喔覆喔箞喔о笝喔傕箟喔竸喔о覆喔∴笚喔掂箞喔勦弗喙夃覆喔⑧竵喔编笟喔佮覆喔`箒喔笖喔囙箑喔о竵喙�喔曕腑喔`箤喔∴覆喔佮笚喔掂箞喔父喔�',
+    },
+    full_text_search: {
+      title: '喔佮覆喔`竸喙夃笝喔覆喔傕箟喔竸喔о覆喔∴箒喔氞笟喙�喔曕箛喔�',
+      description: '喔堗副喔斷笚喙嵿覆喔斷副喔娻笝喔掂竸喙嵿覆喔ㄠ副喔炧笚喙屶笚喔编箟喔囙斧喔∴笖喙冟笝喙�喔竵喔覆喔� 喙�喔炧阜喙堗腑喙冟斧喙夃笢喔灌箟喙冟笂喙夃釜喔侧浮喔侧福喔栢竸喙夃笝喔覆喔勦箥喔侧辅喔编笧喔椸箤喙冟笖喔佮箛喙勦笖喙夃箒喔ム赴喔斷付喔囙競喙夃腑喔勦抚喔侧浮喔椸傅喙堗箑喔佮傅喙堗涪喔о競喙夃腑喔囙笚喔掂箞喔∴傅喔勦箥喔侧箑喔弗喙堗覆喔權副喙夃笝',
+    },
+    hybrid_search: {
+      title: '喔佮覆喔`竸喙夃笝喔覆喙佮笟喔氞箘喔笟喔`复喔�',
+      description: '喔斷箥喔侧箑喔權复喔權竵喔侧福喔勦箟喔權斧喔侧競喙夃腑喔勦抚喔侧浮喙佮笟喔氞箑喔曕箛喔∴箒喔ム赴喔佮覆喔`竸喙夃笝喔覆喙佮笟喔氞箑喔о竵喙�喔曕腑喔`箤喔炧福喙夃腑喔∴竵喔编笝喔堗副喔斷腑喔编笝喔斷副喔氞箖喔浮喙堗箑喔炧阜喙堗腑喙�喔ム阜喔竵喔佮覆喔`笀喔编笟喔勦腹喙堗笚喔掂箞喔斷傅喔椸傅喙堗釜喔膏笖喔箥喔侧斧喔`副喔氞竸喙嵿覆喔勦箟喔權斧喔侧競喔竾喔溹腹喙夃箖喔娻箟 喔溹腹喙夃箖喔娻箟喔覆喔∴覆喔`笘喙�喔ム阜喔竵喔椸傅喙堗笀喔班笗喔编箟喔囙竸喙堗覆喔權箟喙嵿覆喔笝喔编竵喔福喔粪腑喔佮箥喔侧斧喔權笖喔勦箞喔侧箑喔涏箛喔權箓喔∴箑喔斷弗 Rerank',
+      recommend: '喙佮笝喔班笝喔�',
+    },
+    invertedIndex: {
+      title: '喔斷副喔娻笝喔掂竵喔ム副喔氞笖喙夃覆喔�',
+      description: 'Inverted Index 喙�喔涏箛喔權箓喔勦福喔囙釜喔`箟喔侧竾喔椸傅喙堗箖喔娻箟喔箥喔侧斧喔`副喔氞竵喔侧福喔斷付喔囙競喙夃腑喔∴腹喔ム腑喔⑧箞喔侧竾喔∴傅喔涏福喔班釜喔脆笚喔樴复喔犩覆喔� 喔堗副喔斷箑喔`傅喔⑧竾喔曕覆喔∴竸喙嵿覆喔ㄠ副喔炧笚喙� 喙佮笗喙堗弗喔班竸喙嵿覆喔娻傅喙夃箘喔涏笚喔掂箞喙�喔竵喔覆喔`斧喔`阜喔斧喔權箟喔侧箑喔о箛喔氞笚喔掂箞喔∴傅喔勦箥喔侧笖喔编竾喔佮弗喙堗覆喔�',
+    },
+    change: '喙�喔涏弗喔掂箞喔⑧笝',
+    changeRetrievalMethod: '喔о复喔樴傅喔佮覆喔`箑喔`傅喔⑧竵喔斷腹喔佮覆喔`箑喔涏弗喔掂箞喔⑧笝喙佮笡喔ム竾',
+  },
+  docsFailedNotice: '喙�喔竵喔覆喔`箘喔∴箞喔覆喔∴覆喔`笘喔堗副喔斷笚喙嵿覆喔斷副喔娻笝喔掂箘喔斷箟',
+  retry: '喔ム腑喔�',
+  indexingTechnique: {
+    high_quality: '喔箥喔侧笝喔编竵喔囙覆喔權箖喔笉喙�',
+    economy: '喔傅喙傕竸',
+  },
+  indexingMethod: {
+    semantic_search: '喙�喔о竵喙�喔曕腑喔`箤',
+    full_text_search: '喔傕箟喔竸喔о覆喔∴笁喔氞副喔氞箑喔曕箛喔�',
+    hybrid_search: '喔炧副喔權笜喔膏箤喔溹釜喔�',
+    invertedIndex: '喔勦抚喙堗赋',
+  },
+  defaultRetrievalTip: '喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗喔弗喔侧涪喙�喔箟喔權笚喔侧竾喔堗赴喔栢腹喔佮箖喔娻箟喙傕笖喔⑧竸喙堗覆喙�喔`复喙堗浮喔曕箟喔� 喔勦抚喔侧浮喔`腹喙夃笀喔班笘喔灌竵喔斷付喔囙浮喔侧笀喔侧竵喔愢覆喔權竸喔о覆喔∴福喔灌箟喔弗喔侧涪喙佮斧喙堗竾喙佮弗喙夃抚喔堗副喔斷腑喔编笝喔斷副喔氞箖喔浮喙�',
+  mixtureHighQualityAndEconomicTip: '喙傕浮喙�喔斷弗 Rerank 喔堗箥喔侧箑喔涏箛喔權釜喙嵿覆喔福喔编笟喔佮覆喔`笢喔浮喔溹釜喔侧笝喔`赴喔抚喙堗覆喔囙笎喔侧笝喔勦抚喔侧浮喔`腹喙夃竸喔膏笓喔犩覆喔炧釜喔灌竾喙佮弗喔班笡喔`赴喔涪喔编笖',
+  inconsistentEmbeddingModelTip: '喔堗箥喔侧箑喔涏箛喔權笗喙夃腑喔囙浮喔掂箒喔氞笟喔堗箥喔侧弗喔竾 Rerank 喔覆喔佮箒喔氞笟喔堗箥喔侧弗喔竾喔佮覆喔`笣喔编竾喔傕腑喔囙笎喔侧笝喔勦抚喔侧浮喔`腹喙夃笚喔掂箞喙�喔ム阜喔竵喙勦浮喙堗釜喔笖喔勦弗喙夃腑喔囙竵喔编笝',
+  mixtureInternalAndExternalTip: '喙傕浮喙�喔斷弗 Rerank 喔堗箥喔侧箑喔涏箛喔權釜喙嵿覆喔福喔编笟喔佮覆喔`笢喔浮喔溹釜喔侧笝喔`赴喔抚喙堗覆喔囙竸喔о覆喔∴福喔灌箟喔犩覆喔⑧箖喔權箒喔ム赴喔犩覆喔⑧笝喔竵',
+  allExternalTip: '喙�喔∴阜喙堗腑喙冟笂喙夃竸喔о覆喔∴福喔灌箟喔犩覆喔⑧笝喔竵喙�喔椸箞喔侧笝喔编箟喔� 喔溹腹喙夃箖喔娻箟喔覆喔∴覆喔`笘喙�喔ム阜喔竵喙勦笖喙夃抚喙堗覆喔堗赴喙�喔涏复喔斷箖喔娻箟喔囙覆喔權箓喔∴箑喔斷弗 Rerank 喔福喔粪腑喙勦浮喙� 喔覆喔佮箘喔∴箞喙勦笖喙夃箑喔涏复喔斷箖喔娻箟喔囙覆喔� 喔佮箟喔笝喔椸傅喙堗笖喔多竾喔∴覆喔堗赴喔栢腹喔佮笀喔编笖喙�喔`傅喔⑧竾喔曕覆喔∴竸喔班箒喔權笝 喙�喔∴阜喙堗腑喔佮弗喔⑧父喔椸笜喙屶竵喔侧福喔斷付喔囙競喙夃腑喔∴腹喔ム競喔竾喔愢覆喔權竸喔о覆喔∴福喔灌箟喔椸傅喙堗箒喔曕竵喔曕箞喔侧竾喔佮副喔權箘喔∴箞喔腑喔斷竸喔ム箟喔竾喔佮副喔� 喔佮箛喔堗赴喙勦浮喙堗笘喔灌竵喔曕箟喔竾',
+  retrievalSettings: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗',
+  rerankSettings: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔`傅喙勦弗喔權箤',
+  weightedScore: {
+    title: '喔勦赴喙佮笝喔權笘喙堗抚喔囙笝喙夃箥喔侧斧喔權副喔�',
+    description: '喔佮弗喔⑧父喔椸笜喙屶竵喔侧福喔堗副喔斷腑喔编笝喔斷副喔氞箖喔浮喙堗笝喔掂箟喔堗赴喔佮箥喔侧斧喔權笖喔о箞喔侧竸喔о福喔堗副喔斷弗喙嵿覆喔斷副喔氞竸喔о覆喔∴釜喙嵿覆喔勦副喔嵿競喔竾喔佮覆喔`笀喔编笟喔勦腹喙堗竸喔о覆喔∴斧喔∴覆喔⑧斧喔`阜喔竸喔掂涪喙屶箑喔о复喔`箤喔�',
+    semanticFirst: '喔勦抚喔侧浮喔浮喔侧涪喔佮箞喔笝',
+    keywordFirst: '喔勦傅喔⑧箤喙�喔о复喔`箤喔斷竵喙堗腑喔�',
+    customized: '喔佮赋喔笝喔� 喙�喔竾',
+    semantic: '喔勦抚喔侧浮喔浮喔侧涪',
+    keyword: '喔勦赋',
+  },
+  nTo1RetrievalLegacy: '喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗 N-to-1 喔堗赴喙�喔ム复喔佮箖喔娻箟喔涪喙堗覆喔囙箑喔涏箛喔權笚喔侧竾喔佮覆喔`笗喔编箟喔囙箒喔曕箞喙�喔斷阜喔笝喔佮副喔權涪喔侧涪喔� 喔傕腑喙佮笝喔班笝喙嵿覆喙冟斧喙夃箖喔娻箟喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗喔弗喔侧涪喙�喔箟喔權笚喔侧竾喔ム箞喔侧釜喔膏笖喙�喔炧阜喙堗腑喙冟斧喙夃箘喔斷箟喔溹弗喔ム副喔炧笜喙屶笚喔掂箞喔斷傅喔傕付喙夃笝',
+  nTo1RetrievalLegacyLink: '喔ㄠ付喔佮俯喔侧箑喔炧复喙堗浮喙�喔曕复喔�',
+  nTo1RetrievalLegacyLinkText: '喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗 N-to-1 喔堗赴喙�喔ム复喔佮箖喔娻箟喔涪喙堗覆喔囙箑喔涏箛喔權笚喔侧竾喔佮覆喔`箖喔權箑喔斷阜喔笝喔佮副喔權涪喔侧涪喔�',
+  chunkingMode: {
+    general: '喔椸副喙堗抚喙勦笡',
+    parentChild: '喔炧箞喔箒喔∴箞喔ム腹喔�',
+  },
+  parentMode: {
+    paragraph: '喔о福喔`竸',
+    fullDoc: '喙�喔竵喔覆喔`笁喔氞副喔氞箑喔曕箛喔�',
+  },
+  batchAction: {
+    selected: '喙�喔ム阜喔竵',
+    archive: '喔腑喔堗笖喔浮喔侧涪喙�喔笗喔�',
+    delete: '喔ム笟',
+    enable: '喙�喔涏复喔�',
+    cancel: '喔⑧竵喙�喔ム复喔�',
+    disable: '喙�喔�',
+  },
+  localDocs: '喙�喔竵喔覆喔`笚喙夃腑喔囙笘喔脆箞喔�',
+  preprocessDocument: '{{num}} 喙�喔竵喔覆喔`竵喔侧福喔涏福喔班浮喔о弗喔溹弗喔ム箞喔о竾喔笝喙夃覆',
+  documentsDisabled: '{{num}} 喙�喔竵喔覆喔`笘喔灌竵喔涏复喔斷箖喔娻箟喔囙覆喔� - 喙勦浮喙堗箘喔斷箟喙冟笂喙夃竾喔侧笝喔權覆喔權竵喔о箞喔� 30 喔о副喔�',
+  enable: '喙�喔涏复喔�',
+  allKnowledge: '喔勦抚喔侧浮喔`腹喙夃笚喔编箟喔囙斧喔∴笖',
+  allKnowledgeDescription: '喙�喔ム阜喔竵喙�喔炧阜喙堗腑喙佮釜喔斷竾喔勦抚喔侧浮喔`腹喙夃笚喔编箟喔囙斧喔∴笖喙冟笝喔炧阜喙夃笝喔椸傅喙堗笚喙嵿覆喔囙覆喔權笝喔掂箟 喙�喔夃笧喔侧赴喙�喔堗箟喔侧競喔竾喔炧阜喙夃笝喔椸傅喙堗笚喙嵿覆喔囙覆喔權箑喔椸箞喔侧笝喔编箟喔權笚喔掂箞喔覆喔∴覆喔`笘喔堗副喔斷竵喔侧福喔勦抚喔侧浮喔`腹喙夃笚喔编箟喔囙斧喔∴笖喙勦笖喙�',
+  metadata: {
+    createMetadata: {
+      back: '喔佮弗喔编笟',
+      title: '喔傕箟喔浮喔灌弗喙�喔∴笗喔侧箖喔浮喙�',
+      namePlaceholder: '喙�喔炧复喙堗浮喔娻阜喙堗腑喔傕箟喔浮喔灌弗喙�喔∴笗喔�',
+      name: '喔娻阜喙堗腑',
+      type: '喔涏福喔班箑喔犩笚',
+    },
+    checkName: {
+      invalid: '喔娻阜喙堗腑喙�喔∴笗喔侧笖喔侧笗喙夃覆喔曕箟喔竾喔涏福喔班竵喔笟喔斷箟喔о涪喔曕副喔о腑喔编竵喔┼福喔曕副喔о箑喔ム箛喔佮箑喔椸箞喔侧笝喔编箟喔� 喙�喔ム競 喙佮弗喔班競喔掂笖喔ム箞喔侧竾 喙佮弗喔班笗喙夃腑喔囙箑喔`复喙堗浮喔曕箟喔權笖喙夃抚喔⑧笗喔编抚喔副喔佮俯喔`笗喔编抚喙�喔ム箛喔�',
+      empty: '喔娻阜喙堗腑喔傕箟喔浮喔灌弗喙�喔∴笗喔侧箘喔∴箞喔覆喔∴覆喔`笘喙�喔涏箛喔權竸喙堗覆喙丒mpty',
+    },
+    batchEditMetadata: {
+      multipleValue: '喔弗喔侧涪喔勦箞喔�',
+      applyToAllSelectDocument: '喙冟笂喙夃竵喔编笟喙�喔竵喔覆喔`笚喔掂箞喙�喔ム阜喔竵喔椸副喙夃竾喔浮喔�',
+      editMetadata: '喙佮竵喙夃箘喔傕競喙夃腑喔∴腹喔ム箑喔∴笗喔�',
+      editDocumentsNum: '喔佮覆喔`箒喔佮箟喙勦競喙�喔竵喔覆喔� {{num}} 喔夃笟喔编笟',
+      applyToAllSelectDocumentTip: '喔福喙夃覆喔囙競喙夃腑喔∴腹喔ム箑喔∴笗喔侧箖喔浮喙堗箒喔ム赴喙佮竵喙夃箘喔傕笚喔编箟喔囙斧喔∴笖喔傕箟喔侧竾喔曕箟喔權箓喔斷涪喔副喔曕箓喔權浮喔编笗喔脆釜喔赤斧喔`副喔氞箑喔竵喔覆喔`笚喔掂箞喙�喔ム阜喔竵喔椸副喙夃竾喔浮喔� 喔∴复喔夃赴喔權副喙夃笝喔佮覆喔`箒喔佮箟喙勦競喔傕箟喔浮喔灌弗喙�喔∴笗喔侧笀喔班箖喔娻箟喙勦笖喙夃箑喔夃笧喔侧赴喔佮副喔氞箑喔竵喔覆喔`笚喔掂箞喔∴傅喔傕箟喔浮喔灌弗喙�喔∴笗喔侧笝喔编箟喔權箑喔椸箞喔侧笝喔编箟喔�.',
+    },
+    selectMetadata: {
+      manageAction: '喔堗副喔斷竵喔侧福',
+      search: '喔勦箟喔權斧喔侧競喙夃腑喔∴腹喔ム箑喔∴笗喔�',
+      newAction: '喔傕箟喔浮喔灌弗喙�喔∴笗喔侧箖喔浮喙�',
+    },
+    datasetMetadata: {
+      deleteTitle: '喔⑧阜喔權涪喔编笝喙�喔炧阜喙堗腑喔椸赋喔佮覆喔`弗喔�',
+      values: '{{num}} 喔勦箞喔�',
+      disabled: '喔勦笝喔炧复喔佮覆喔�',
+      builtInDescription: '喔傕箟喔浮喔灌弗喙�喔∴笗喔侧笚喔掂箞喔福喙夃覆喔囙競喔多箟喔權箖喔權笗喔编抚喔堗赴喔栢腹喔佮笖喔多竾喔腑喔佮箒喔ム赴喔福喙夃覆喔囙箓喔斷涪喔副喔曕箓喔權浮喔编笗喔� 喔曕箟喔竾喙�喔涏复喔斷箖喔娻箟喔囙覆喔權竵喙堗腑喔權箖喔娻箟喔囙覆喔權箒喔ム赴喙勦浮喙堗釜喔侧浮喔侧福喔栢箒喔佮箟喙勦競喙勦笖喙�',
+      rename: '喙�喔涏弗喔掂箞喔⑧笝喔娻阜喙堗腑',
+      description: '喔勦父喔撪釜喔侧浮喔侧福喔栢笀喔编笖喔佮覆喔`競喙夃腑喔∴腹喔ム箑喔∴笗喔侧笚喔编箟喔囙斧喔∴笖喙冟笝喔勦抚喔侧浮喔`腹喙夃笝喔掂箟喙勦笖喙夃笚喔掂箞喔權傅喙� 喔佮覆喔`笡喔`副喔氞箑喔涏弗喔掂箞喔⑧笝喔堗赴喔栢腹喔佮笅喔脆竾喙傕竸喔`箘喔權笅喙屶箘喔涏涪喔编竾喙�喔竵喔覆喔`笚喔膏竵喔夃笟喔编笟',
+      deleteContent: '喔勦父喔撪箒喔權箞喙冟笀喔福喔粪腑喔о箞喔侧笗喙夃腑喔囙竵喔侧福喔ム笟喔傕箟喔浮喔灌弗喙�喔∴笗喔� "{{name}}"',
+      name: '喔娻阜喙堗腑',
+      addMetaData: '喙�喔炧复喙堗浮喔傕箟喔浮喔灌弗喙�喔∴笗喔�',
+      builtIn: '喙佮笟喔氞箖喔權笗喔编抚',
+      namePlaceholder: '喔娻阜喙堗腑喙�喔∴笚喔侧笖喔侧笚喔�',
+    },
+    documentMetadata: {
+      technicalParameters: '喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤喔椸覆喔囙箑喔椸竸喔權复喔�',
+      startLabeling: '喙�喔`复喙堗浮喔佮覆喔`笗喔脆笖喔涏箟喔侧涪',
+      metadataToolTip: '喔傕箟喔浮喔灌弗喙�喔∴笗喔侧箑喔涏箛喔權笗喔编抚喔佮福喔竾喔椸傅喙堗釜喔赤竸喔编笉喔嬥付喙堗竾喔娻箞喔о涪喙�喔炧复喙堗浮喔勦抚喔侧浮喔栢腹喔佮笗喙夃腑喔囙箒喔ム赴喔勦抚喔侧浮喙�喔佮傅喙堗涪喔о競喙夃腑喔囙競喔竾喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗 喔勦父喔撪釜喔侧浮喔侧福喔栢笡喔`副喔氞箒喔佮箟喙佮弗喔班箑喔炧复喙堗浮喔傕箟喔浮喔灌弗喙�喔∴笗喔侧釜喔赤斧喔`副喔氞箑喔竵喔覆喔`笝喔掂箟喙勦笖喙夃笚喔掂箞喔權傅喙�',
+      documentInformation: '喔傕箟喔浮喔灌弗喙�喔竵喔覆喔�',
+    },
+    metadata: '喔傕箟喔浮喔灌弗喙�喔∴笗喔�',
+    addMetadata: '喙�喔炧复喙堗浮喔傕箟喔浮喔灌弗喙�喔∴笗喔�',
+    chooseTime: '喙�喔ム阜喔竵喙�喔о弗喔�...',
+  },
+  embeddingModelNotAvailable: '喙傕浮喙�喔斷弗喔澿副喔囙笗喔编抚喙勦浮喙堗釜喔侧浮喔侧福喔栢箖喔娻箟喔囙覆喔權箘喔斷箟.',
+}
+
+export default translation
diff --git a/i18n/th-TH/education.ts b/i18n/th-TH/education.ts
new file mode 100644
index 0000000..5d19cbe
--- /dev/null
+++ b/i18n/th-TH/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    coupon: '喔勦腹喔涏腑喔囙笧喔脆箑喔ㄠ俯 100%',
+    end: '喔赋喔福喔编笟喙佮笢喔權浮喔粪腑喔覆喔娻傅喔炧競喔竾 Dify.',
+    front: '喔勦父喔撪浮喔掂釜喔脆笚喔樴复喙屶箘喔斷箟喔`副喔氞釜喔栢覆喔權赴喔佮覆喔`笗喔`抚喔堗釜喔笟喔佮覆喔`辅喔多竵喔┼覆喙佮弗喙夃抚 喔佮福喔膏笓喔侧竵喔`腑喔佮競喙夃腑喔∴腹喔ム竵喔侧福喔ㄠ付喔佮俯喔侧競喔竾喔勦父喔撪笖喙夃覆喔權弗喙堗覆喔囙箑喔炧阜喙堗腑喔斷赋喙�喔權复喔權竵喔侧福喙冟斧喙夃箑喔福喙囙笀喔复喙夃笝喙佮弗喔班福喔编笟喔复喔椸笜喔脆箤',
+  },
+  form: {
+    schoolName: {
+      title: '喔娻阜喙堗腑喙傕福喔囙箑喔`傅喔⑧笝喔傕腑喔囙竸喔膏笓',
+      placeholder: '喔佮福喔膏笓喔侧箖喔箞喔娻阜喙堗腑喔傕腑喔囙箓喔`竾喙�喔`傅喔⑧笝喔涪喙堗覆喔囙箑喔涏箛喔權笚喔侧竾喔佮覆喔`笚喔掂箞喙勦浮喙堗浮喔掂竵喔侧福喔⑧箞喔�',
+    },
+    schoolRole: {
+      option: {
+        student: '喔權副喔佮箑喔`傅喔⑧笝',
+        teacher: '喔勦福喔�',
+        administrator: '喔溹腹喙夃笖喔灌箒喔ム箓喔`竾喙�喔`傅喔⑧笝',
+      },
+      title: '喔氞笚喔氞覆喔椸競喔竾喔勦父喔撪箖喔權箓喔`竾喙�喔`傅喔⑧笝',
+    },
+    terms: {
+      desc: {
+        front: '喔傕箟喔浮喔灌弗喔傕腑喔囙竸喔膏笓喙佮弗喔班竵喔侧福喙冟笂喙夃釜喔栢覆喔權赴喔佮覆喔`笗喔`抚喔堗釜喔笟喔佮覆喔`辅喔多竵喔┼覆喔涪喔灌箞喔犩覆喔⑧箖喔曕箟喙�喔囙阜喙堗腑喔權箘喔傕競喔竾喙�喔`覆',
+        end: '. 喙傕笖喔⑧竵喔侧福喔箞喔�:',
+        privacyPolicy: '喔權箓喔⑧笟喔侧涪喔勦抚喔侧浮喙�喔涏箛喔權釜喙堗抚喔權笗喔编抚',
+        and: '喙佮弗喔�',
+        termsOfService: '喔傕箟喔竵喔赤斧喔權笖喙冟笝喔佮覆喔`箖喔箟喔氞福喔脆竵喔侧福',
+      },
+      option: {
+        age: '喔夃副喔權涪喔粪笝喔⑧副喔權抚喙堗覆喔夃副喔權浮喔掂腑喔侧涪喔膏腑喔⑧箞喔侧竾喔權箟喔涪 18 喔涏傅',
+        inSchool: '喔夃副喔權涪喔粪笝喔⑧副喔權抚喙堗覆喔夃副喔權箘喔斷箟喔ム竾喔椸赴喙�喔氞傅喔⑧笝喔福喔粪腑喔椸赋喔囙覆喔權笚喔掂箞喔笘喔侧笟喔编笝喔椸傅喙堗福喔班笟喔膏箘喔о箟 Dify 喔覆喔堗競喔斧喔ム副喔佮笎喔侧笝喔佮覆喔`弗喔囙笚喔班箑喔氞傅喔⑧笝/喔佮覆喔`笀喙夃覆喔囙竾喔侧笝 喔覆喔佮笁喔编笝喙佮釜喔斷竾喔勦抚喔侧浮喙勦浮喙堗笘喔灌竵喔曕箟喔竾喙�喔佮傅喙堗涪喔о竵喔编笟喔勦父喔撪釜喔∴笟喔编笗喔脆競喔竾喔夃副喔� 喔夃副喔權笗喔佮弗喔囙笚喔掂箞喔堗赴喔娻赋喔`赴喔勦箞喔侧笜喔`福喔∴箑喔權傅喔⑧浮喙冟笖 喙� 喔椸傅喙堗笘喔灌竵喔⑧竵喙�喔о箟喔權箘喔涏箖喔權箑喔氞阜喙夃腑喔囙笗喙夃笝喔曕覆喔∴釜喔栢覆喔權赴喔佮覆喔`辅喔多竵喔┼覆喔傕腑喔囙笁喔编笝.',
+      },
+      title: '喔傕箟喔竵喔赤斧喔權笖喙佮弗喔班箑喔囙阜喙堗腑喔權箘喔�',
+    },
+  },
+  toVerified: '喔曕福喔о笀喔腑喔氞竵喔侧福喔ㄠ付喔佮俯喔�',
+  rejectTitle: '喔佮覆喔`笗喔`抚喔堗釜喔笟喔佮覆喔`辅喔多竵喔┼覆 Dify 喔傕腑喔囙竸喔膏笓喔栢腹喔佮笡喔忇复喙�喔笜',
+  emailLabel: '喔傅喙�喔∴弗喔涏副喔堗笀喔膏笟喔编笝喔傕腑喔囙竸喔膏笓',
+  currentSigned: '喔ム竾喔娻阜喙堗腑喙�喔傕箟喔侧箖喔娻箟喙冟笝喔愢覆喔權赴',
+  successTitle: '喔勦父喔撪箘喔斷箟喔`副喔氞竵喔侧福喔`副喔氞福喔竾喔佮覆喔`辅喔多竵喔┼覆 Dify',
+  learn: '喙�喔`傅喔⑧笝喔`腹喙夃抚喔脆笜喔掂竵喔侧福喔曕福喔о笀喔腑喔氞竵喔侧福喔ㄠ付喔佮俯喔�',
+  submitError: '喔佮覆喔`釜喙堗竾喙佮笟喔氞笩喔福喙屶浮喔ム箟喔∴箑喔弗喔� 喙傕笡喔`笖喔ム腑喔囙腑喔掂竵喔勦福喔编箟喔囙箖喔權笭喔侧涪喔弗喔编竾.',
+  submit: '喔箞喔�',
+  successContent: '喙�喔`覆喙勦笖喙夃腑喔竵喔勦腹喔涏腑喔囙釜喙堗抚喔權弗喔� 100% 喔赋喔福喔编笟喙佮笢喔� Dify Professional 喙冟斧喙夃竵喔编笟喔氞副喔嵿笂喔掂競喔竾喔勦父喔� 喔勦腹喔涏腑喔囙笝喔掂箟喔覆喔∴覆喔`笘喙冟笂喙夃箘喔斷箟喙�喔涏箛喔權福喔班涪喔班箑喔о弗喔� 1 喔涏傅 喔佮福喔膏笓喔侧箖喔娻箟喔犩覆喔⑧箖喔權笂喙堗抚喔囙福喔班涪喔班箑喔о弗喔侧笚喔掂箞喔佮赋喔笝喔�.',
+  rejectContent: '喔權箞喔侧箑喔傅喔⑧笖喔侧涪喔椸傅喙堗竸喔膏笓喙勦浮喙堗浮喔掂釜喔脆笚喔樴复喙屶箘喔斷箟喔`副喔氞釜喔栢覆喔權赴喔佮覆喔`笗喔`抚喔堗釜喔笟喔佮覆喔`辅喔多竵喔┼覆喙佮弗喔班笖喔编竾喔權副喙夃笝喔勦父喔撪笀喔多竾喙勦浮喙堗釜喔侧浮喔侧福喔栢福喔编笟喔勦腹喔涏腑喔囙笧喔脆箑喔ㄠ俯 100% 喔赋喔福喔编笟喙佮笢喔權浮喔粪腑喔覆喔娻傅喔� Dify 喔覆喔佮竸喔膏笓喙冟笂喙夃笚喔掂箞喔涪喔灌箞喔傅喙�喔∴弗喔權傅喙�.',
+}
+
+export default translation
diff --git a/i18n/th-TH/explore.ts b/i18n/th-TH/explore.ts
new file mode 100644
index 0000000..d8eb53d
--- /dev/null
+++ b/i18n/th-TH/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: '喔箥喔侧福喔о笀',
+  sidebar: {
+    discovery: '喔佮覆喔`竸喙夃笝喔炧笟',
+    chat: '喔笝喔椸笝喔�',
+    workspace: '喔炧阜喙夃笝喔椸傅喙�',
+    action: {
+      pin: '喙�喔傕箛喔∴竵喔ム副喔�',
+      unpin: '喔涏弗喔斷斧喔∴父喔�',
+      rename: '喔曕副喙夃竾喔娻阜喙堗腑喙冟斧喔∴箞',
+      delete: '喔ム笟',
+    },
+    delete: {
+      title: '喔ム笟喙佮腑喔�',
+      content: '喔勦父喔撪箒喔權箞喙冟笀喔福喔粪腑喙勦浮喙堗抚喙堗覆喔曕箟喔竾喔佮覆喔`弗喔氞箒喔笡喔權傅喙�?',
+    },
+  },
+  apps: {
+    title: '喔箥喔侧福喔о笀喙佮腑喔炧箓喔斷涪 Dify',
+    description: '喙冟笂喙夃箒喔笡喙�喔椸浮喙�喔炧弗喔曕箑喔弗喙堗覆喔權傅喙夃笚喔编笝喔椸傅喔福喔粪腑喔涏福喔编笟喙佮笗喙堗竾喙佮腑喔涏競喔竾喔勦父喔撪箑喔竾喔曕覆喔∴箑喔椸浮喙�喔炧弗喔�',
+    allCategories: '喙佮笝喔� 喔權赋',
+  },
+  appCard: {
+    addToWorkspace: '喙�喔炧复喙堗浮喙勦笡喔⑧副喔囙笧喔粪箟喔權笚喔掂箞喔椸箥喔侧竾喔侧笝',
+    customize: '喔涏福喔编笟喙佮笗喙堗竾',
+  },
+  appCustomize: {
+    title: '喔福喙夃覆喔囙箒喔笡喔堗覆喔� {{name}}',
+    subTitle: '喙勦腑喔勦腑喔權箒喔ム赴喔娻阜喙堗腑喙佮腑喔�',
+    nameRequired: '喔曕箟喔竾喙冟笂喙夃笂喔粪箞喔箒喔笡',
+  },
+  category: {
+    Assistant: '喔溹腹喙夃笂喙堗抚喔�',
+    Writing: '喔佮覆喔`箑喔傕傅喔⑧笝',
+    Translate: '喙佮笡喔�',
+    Programming: '喙傕笡喔`箒喔佮福喔�',
+    HR: '喔娻副喙堗抚喙傕浮喔�',
+    Workflow: '喙�喔о复喔`箤喔佮箓喔熰弗喔о箤',
+    Agent: '喔曕副喔о箒喔椸笝',
+    Entertainment: '喔勦抚喔侧浮喔氞副喔權箑喔椸复喔�',
+  },
+}
+
+export default translation
diff --git a/i18n/th-TH/layout.ts b/i18n/th-TH/layout.ts
new file mode 100644
index 0000000..e2410dd
--- /dev/null
+++ b/i18n/th-TH/layout.ts
@@ -0,0 +1,3 @@
+const translation = {}
+
+export default translation
diff --git a/i18n/th-TH/login.ts b/i18n/th-TH/login.ts
new file mode 100644
index 0000000..75f569d
--- /dev/null
+++ b/i18n/th-TH/login.ts
@@ -0,0 +1,109 @@
+const translation = {
+  pageTitle: '喙�喔箟 喔∴覆喙�喔`复喙堗浮喔佮副喔權箑喔ム涪!',
+  welcome: '馃憢 喔⑧复喔權笖喔掂笗喙夃腑喔權福喔编笟喔腹喙� Dify 喙傕笡喔`笖喙�喔傕箟喔侧釜喔灌箞喔`赴喔氞笟喙�喔炧阜喙堗腑喔斷箥喔侧箑喔權复喔權竵喔侧福喔曕箞喔�',
+  email: '喔椸傅喙堗腑喔⑧腹喙堗腑喔掂箑喔∴弗',
+  emailPlaceholder: '喔傅喙�喔∴弗喔傕腑喔囙竸喔膏笓',
+  password: '喔`斧喔编釜喔溹箞喔侧笝',
+  passwordPlaceholder: '喔`斧喔编釜喔溹箞喔侧笝喔傕腑喔囙竸喔膏笓',
+  name: '喔娻阜喙堗腑喔溹腹喙夃箖喔娻箟',
+  namePlaceholder: '喔娻阜喙堗腑喔溹腹喙夃箖喔娻箟喔傕腑喔囙竸喔膏笓',
+  forget: '喔ム阜喔∴福喔副喔笢喙堗覆喔權箖喔娻箞喙勦斧喔�',
+  signBtn: '喙�喔傕箟喔侧釜喔灌箞喔`赴喔氞笟',
+  continueWithCode: '喔斷箥喔侧箑喔權复喔權竵喔侧福喔曕箞喔笖喙夃抚喔⑧福喔副喔�',
+  sendVerificationCode: '喔箞喔囙福喔副喔涪喔粪笝喔⑧副喔�',
+  usePassword: '喙冟笂喙夃福喔副喔笢喙堗覆喔�',
+  useVerificationCode: '喙冟笂喙夃福喔副喔涪喔粪笝喔⑧副喔�',
+  or: '喔福喔粪腑',
+  installBtn: '喔笘喔侧笡喔權覆',
+  setAdminAccount: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔氞副喔嵿笂喔掂笢喔灌箟喔斷腹喙佮弗喔`赴喔氞笟',
+  setAdminAccountDesc: '喔复喔椸笜喔脆箤喔腹喔囙釜喔膏笖喔箥喔侧斧喔`副喔氞笟喔编笉喔娻傅喔溹腹喙夃笖喔灌箒喔ム福喔班笟喔� 喔嬥付喙堗竾喔覆喔∴覆喔`笘喙冟笂喙夃釜喔`箟喔侧竾喙佮腑喔涏笧喔ム复喙�喔勦笂喔编笝喙佮弗喔班笀喔编笖喔佮覆喔`笢喔灌箟喙冟斧喙夃笟喔`复喔佮覆喔� LLM 喙�喔涏箛喔權笗喙夃笝',
+  createAndSignIn: '喔福喙夃覆喔囙箒喔ム赴喔ム竾喔娻阜喙堗腑喙�喔傕箟喔侧箖喔娻箟',
+  oneMoreStep: '喔傅喔佮斧喔權付喙堗竾喔傕副喙夃笝喔曕腑喔�',
+  createSample: '喔堗覆喔佮競喙夃腑喔∴腹喔ム笝喔掂箟 喙�喔`覆喔堗赴喔福喙夃覆喔囙箒喔笡喔炧弗喔脆箑喔勦笂喔编笝喔曕副喔о腑喔⑧箞喔侧竾喔箥喔侧斧喔`副喔氞竸喔膏笓',
+  invitationCode: '喔`斧喔编釜喙�喔娻复喔�',
+  invitationCodePlaceholder: '喔`斧喔编釜喙�喔娻复喔嵿競喔竾喔勦父喔�',
+  interfaceLanguage: '喔犩覆喔┼覆喔复喔權箑喔椸腑喔`箤喙�喔熰笅',
+  timezone: '喙�喔傕笗喙�喔о弗喔�',
+  go: '喙勦笡喔椸傅喙� Dify',
+  sendUsMail: '喔箞喔囙腑喔掂箑喔∴弗喔栢付喔囙箑喔`覆 喙佮弗喙夃抚喙�喔`覆喔堗赴喔堗副喔斷竵喔侧福喔佮副喔氞竸喙嵿覆喔傕腑喙�喔娻复喔�',
+  acceptPP: '喔夃副喔權箘喔斷箟喔箞喔侧笝喙佮弗喔班涪喔浮喔`副喔氞笝喙傕涪喔氞覆喔⑧竸喔о覆喔∴箑喔涏箛喔權釜喙堗抚喔權笗喔编抚喙佮弗喙夃抚',
+  reset: '喙傕笡喔`笖喙�喔`傅喔⑧竵喙冟笂喙夃竸喙嵿覆喔副喙堗竾喔曕箞喔箘喔涏笝喔掂箟喙�喔炧阜喙堗腑喔`傅喙�喔嬥箛喔曕福喔副喔笢喙堗覆喔權競喔竾喔勦父喔�',
+  withGitHub: '喔斷箥喔侧箑喔權复喔權竵喔侧福喔曕箞喔笖喙夃抚喔� GitHub',
+  withGoogle: '喔斷箥喔侧箑喔權复喔權竵喔侧福喔曕箞喔竵喔编笟 Google',
+  withSSO: '喔斷箥喔侧箑喔權复喔權竵喔侧福喔曕箞喔笖喙夃抚喔� SSO',
+  rightTitle: '喔涏弗喔斷弗喙囙腑喔佮辅喔编竵喔⑧笭喔侧笧喔傕腑喔� LLM 喔涪喙堗覆喔囙箑喔曕箛喔∴笚喔掂箞',
+  rightDesc: '喔福喙夃覆喔囙箒喔笡喔炧弗喔脆箑喔勦笂喔编笝 AI 喔椸傅喙堗笖喔多竾喔斷腹喔斷釜喔侧涪喔曕覆 喙冟笂喙夃竾喔侧笝喙勦笖喙� 喙佮弗喔班笡喔`副喔氞笡喔`父喔囙箘喔斷箟喔涪喙堗覆喔囙竾喙堗覆喔⑧笖喔侧涪',
+  tos: '喔傕箟喔竵喙嵿覆喔笝喔斷箖喔權竵喔侧福喙冟斧喙夃笟喔`复喔佮覆喔�',
+  pp: '喔權箓喔⑧笟喔侧涪喔勦抚喔侧浮喙�喔涏箛喔權釜喙堗抚喔權笗喔编抚',
+  tosDesc: '喔佮覆喔`弗喔囙笚喔班箑喔氞傅喔⑧笝喙佮釜喔斷竾喔о箞喔侧竸喔膏笓喔⑧腑喔∴福喔编笟',
+  goToInit: '喔覆喔佮竸喔膏笓喔⑧副喔囙箘喔∴箞喙勦笖喙夃箑喔`复喙堗浮喔曕箟喔權笟喔编笉喔娻傅 喙傕笡喔`笖喙勦笡喔椸傅喙堗斧喔權箟喔侧竵喔侧福喙�喔`复喙堗浮喔曕箟喔�',
+  dontHave: '喙勦浮喙堗浮喔�?',
+  invalidInvitationCode: '喔`斧喔编釜喙�喔娻复喔嵿箘喔∴箞喔栢腹喔佮笗喙夃腑喔�',
+  accountAlreadyInited: '喔氞副喔嵿笂喔掂箑喔`复喙堗浮喔曕箟喔權箒喔ム箟喔�',
+  forgotPassword: '喔ム阜喔∴福喔副喔笢喙堗覆喔權箖喔娻箞喙勦斧喔�',
+  resetLinkSent: '喔`傅喙�喔嬥箛喔曕弗喔脆竾喔佮箤喔椸傅喙堗釜喙堗竾',
+  sendResetLink: '喔箞喔囙弗喔脆竾喔佮箤喔`傅喙�喔嬥箛喔�',
+  backToSignIn: '喔佮弗喔编笟喙勦笡喔椸傅喙堗竵喔侧福喔ム竾喔娻阜喙堗腑喙�喔傕箟喔侧箖喔娻箟',
+  forgotPasswordDesc: '喙傕笡喔`笖喔涏箟喔笝喔椸傅喙堗腑喔⑧腹喙堗腑喔掂箑喔∴弗喔傕腑喔囙竸喔膏笓喙�喔炧阜喙堗腑喔`傅喙�喔嬥箛喔曕福喔副喔笢喙堗覆喔權競喔竾喔勦父喔� 喙�喔`覆喔堗赴喔箞喔囙腑喔掂箑喔∴弗喔炧福喙夃腑喔∴竸喙嵿覆喙佮笝喔班笝喙嵿覆喙�喔佮傅喙堗涪喔о竵喔编笟喔о复喔樴傅喔佮覆喔`福喔掂箑喔嬥箛喔曕福喔副喔笢喙堗覆喔權競喔竾喔勦父喔�',
+  checkEmailForResetLink: '喙傕笡喔`笖喔曕福喔о笀喔腑喔氞腑喔掂箑喔∴弗喔傕腑喔囙竸喔膏笓喙�喔炧阜喙堗腑喔覆喔ム复喔囙竵喙屶釜喙嵿覆喔福喔编笟喔`傅喙�喔嬥箛喔曕福喔副喔笢喙堗覆喔權競喔竾喔勦父喔� 喔覆喔佮箘喔∴箞喔涏福喔侧竵喔忇競喔多箟喔權笭喔侧涪喙冟笝 2-3 喔權覆喔椸傅 喙傕笡喔`笖喔曕福喔о笀喔腑喔氞箓喔熰弗喙�喔斷腑喔`箤喔箒喔涏浮喔傕腑喔囙竸喔膏笓',
+  passwordChanged: '喔ム竾喔娻阜喙堗腑喙�喔傕箟喔侧箖喔娻箟喔曕腑喔權笝喔掂箟',
+  changePassword: '喔曕副喙夃竾喔`斧喔编釜喔溹箞喔侧笝',
+  changePasswordTip: '喙傕笡喔`笖喔涏箟喔笝喔`斧喔编釜喔溹箞喔侧笝喙冟斧喔∴箞喔箥喔侧斧喔`副喔氞笟喔编笉喔娻傅喔傕腑喔囙竸喔膏笓',
+  changePasswordBtn: '喔曕副喙夃竾喔`斧喔编釜喔溹箞喔侧笝',
+  invalidToken: '喙傕笚喙�喔勦箛喔權箘喔∴箞喔栢腹喔佮笗喙夃腑喔囙斧喔`阜喔斧喔∴笖喔覆喔⑧父',
+  confirmPassword: '喔⑧阜喔權涪喔编笝喔`斧喔编釜喔溹箞喔侧笝',
+  confirmPasswordPlaceholder: '喔⑧阜喔權涪喔编笝喔`斧喔编釜喔溹箞喔侧笝喙冟斧喔∴箞喔傕腑喔囙竸喔膏笓',
+  passwordChangedTip: '喙�喔涏弗喔掂箞喔⑧笝喔`斧喔编釜喔溹箞喔侧笝喔傕腑喔囙竸喔膏笓喙�喔`傅喔⑧笟喔`箟喔涪喙佮弗喙夃抚',
+  error: {
+    emailEmpty: '喔曕箟喔竾喔`赴喔氞父喔椸傅喙堗腑喔⑧腹喙堗腑喔掂箑喔∴弗',
+    emailInValid: '喙傕笡喔`笖喔涏箟喔笝喔椸傅喙堗腑喔⑧腹喙堗腑喔掂箑喔∴弗喔椸傅喙堗笘喔灌竵喔曕箟喔竾',
+    nameEmpty: '喔曕箟喔竾喔`赴喔氞父喔娻阜喙堗腑',
+    passwordEmpty: '喔曕箟喔竾喙冟笂喙夃福喔副喔笢喙堗覆喔�',
+    passwordLengthInValid: '喔`斧喔编釜喔溹箞喔侧笝喔曕箟喔竾喔∴傅喔涪喙堗覆喔囙笝喙夃腑喔� 8 喔副喔佮競喔`赴',
+    passwordInvalid: '喔`斧喔编釜喔溹箞喔侧笝喔曕箟喔竾喔∴傅喔曕副喔о腑喔编竵喔┼福喙佮弗喔班笗喔编抚喙�喔ム競 喙佮弗喔班竸喔о覆喔∴涪喔侧抚喔曕箟喔竾喔∴覆喔佮竵喔о箞喔� 8',
+    registrationNotAllowed: '喙勦浮喙堗笧喔氞笟喔编笉喔娻傅 喙傕笡喔`笖喔曕复喔斷笗喙堗腑喔溹腹喙夃笖喔灌箒喔ム福喔班笟喔氞箑喔炧阜喙堗腑喔ム竾喔椸赴喙�喔氞傅喔⑧笝',
+  },
+  license: {
+    tip: '喔佮箞喔笝喙�喔`复喙堗浮 Dify Community Edition 喙傕笡喔`笖喔箞喔侧笝 GitHub',
+    link: '喙冟笟喔笝喔膏笉喔侧笗喙傕腑喙�喔炧箞喔權笅喔福喙屶釜',
+  },
+  join: '喔曕箞喔�',
+  joinTipStart: '喙�喔娻复喔嵿竸喔膏笓喙�喔傕箟喔侧福喙堗抚喔�',
+  joinTipEnd: '喔椸傅喔∴竾喔侧笝喙冟笝 Dify',
+  invalid: '喔ム复喔囙竵喙屶斧喔∴笖喔覆喔⑧父',
+  explore: '喔箥喔侧福喔о笀 Dify',
+  activatedTipStart: '喔勦父喔撪箘喔斷箟喙�喔傕箟喔侧福喙堗抚喔�',
+  activatedTipEnd: '喔椸傅喔�',
+  activated: '喔ム竾喔娻阜喙堗腑喙�喔傕箟喔侧箖喔娻箟喔曕腑喔權笝喔掂箟',
+  adminInitPassword: '喔`斧喔编釜喔溹箞喔侧笝喙�喔`复喙堗浮喔曕箟喔權笢喔灌箟喔斷腹喙佮弗喔`赴喔氞笟',
+  validate: '喔曕福喔о笀 喔腑喔�',
+  checkCode: {
+    checkYourEmail: '喔曕福喔о笀喔腑喔氞腑喔掂箑喔∴弗喔傕腑喔囙竸喔膏笓',
+    tips: '喙�喔`覆喔箞喔囙福喔副喔涪喔粪笝喔⑧副喔權箘喔涏笚喔掂箞 <strong>{{email}}</strong>',
+    validTime: '喙傕笡喔`笖喔椸福喔侧笟喔о箞喔侧福喔副喔笝喔掂箟喙冟笂喙夃箘喔斷箟喔權覆喔� 5 喔權覆喔椸傅',
+    verificationCode: '喔`斧喔编釜喔⑧阜喔權涪喔编笝',
+    verificationCodePlaceholder: '喔涏箟喔笝喔`斧喔编釜 6 喔弗喔编竵',
+    verify: '喔曕福喔о笀喔腑喔�',
+    didNotReceiveCode: '喙勦浮喙堗箘喔斷箟喔`副喔氞福喔副喔箖喔娻箞喙勦斧喔�',
+    resend: '喔箞喔�',
+    useAnotherMethod: '喙冟笂喙夃抚喔脆笜喔掂腑喔粪箞喔�',
+    emptyCode: '喔曕箟喔竾喙冟笂喙夃福喔副喔�',
+    invalidCode: '喔`斧喔编釜喙勦浮喙堗笘喔灌竵喔曕箟喔竾',
+  },
+  resetPassword: '喔`傅喙�喔嬥箛喔曕福喔副喔笢喙堗覆喔�',
+  resetPasswordDesc: '喔炧复喔∴笧喙屶腑喔掂箑喔∴弗喔椸傅喙堗竸喔膏笓喙冟笂喙夃弗喔囙笚喔班箑喔氞傅喔⑧笝喔氞笝 Dify 喙佮弗喙夃抚喙�喔`覆喔堗赴喔箞喔囙腑喔掂箑喔∴弗喔`傅喙�喔嬥箛喔曕福喔副喔笢喙堗覆喔權箖喔箟喔勦父喔�',
+  backToLogin: '喔佮弗喔编笟喙勦笡喔椸傅喙堗箑喔傕箟喔侧釜喔灌箞喔`赴喔氞笟',
+  setYourAccount: '喔曕副喙夃竾喔勦箞喔侧笟喔编笉喔娻傅喔傕腑喔囙竸喔膏笓',
+  enterYourName: '喙傕笡喔`笖喔涏箟喔笝喔娻阜喙堗腑喔溹腹喙夃箖喔娻箟喔傕腑喔囙竸喔膏笓',
+  back: '喔⑧箟喔笝喔佮弗喔编笟',
+  noLoginMethod: '喙勦浮喙堗箘喔斷箟喔佮箥喔侧斧喔權笖喔勦箞喔侧抚喔脆笜喔掂竵喔侧福喔曕福喔о笀喔腑喔氞釜喔脆笚喔樴复喙�',
+  noLoginMethodTip: '喙傕笡喔`笖喔曕复喔斷笗喙堗腑喔溹腹喙夃笖喔灌箒喔ム福喔班笟喔氞箑喔炧阜喙堗腑喙�喔炧复喙堗浮喔о复喔樴傅喔佮覆喔`福喔编笟喔`腑喔囙竸喔о覆喔∴笘喔灌竵喔曕箟喔竾',
+  licenseExpired: '喙冟笟喔笝喔膏笉喔侧笗喔浮喔斷腑喔侧涪喔�',
+  licenseExpiredTip: '喔复喔椸笜喔脆箤喔佮覆喔`箖喔娻箟喔囙覆喔� Dify Enterprise 喔箥喔侧斧喔`副喔氞笧喔粪箟喔權笚喔掂箞喔椸箥喔侧竾喔侧笝喔傕腑喔囙竸喔膏笓喔浮喔斷腑喔侧涪喔膏箒喔ム箟喔� 喙傕笡喔`笖喔曕复喔斷笗喙堗腑喔溹腹喙夃笖喔灌箒喔ム福喔班笟喔氞競喔竾喔勦父喔撪箑喔炧阜喙堗腑喙冟笂喙� Dify 喔曕箞喔箘喔�',
+  licenseLost: '喙冟笟喔笝喔膏笉喔侧笗喔腹喔嵿斧喔侧涪',
+  licenseLostTip: '喙�喔娻阜喙堗腑喔∴笗喙堗腑喙�喔嬥复喔`箤喔熰箑喔о腑喔`箤喙冟笟喔笝喔膏笉喔侧笗 Dify 喙勦浮喙堗釜喙嵿覆喙�喔`箛喔� 喙傕笡喔`笖喔曕复喔斷笗喙堗腑喔溹腹喙夃笖喔灌箒喔ム福喔班笟喔氞競喔竾喔勦父喔撪箑喔炧阜喙堗腑喙冟笂喙� Dify 喔曕箞喔箘喔�',
+  licenseInactive: '喙冟笟喔笝喔膏笉喔侧笗喙勦浮喙堗箖喔娻箟喔囙覆喔�',
+  licenseInactiveTip: '喔复喔椸笜喔脆箤喔佮覆喔`箖喔娻箟喔囙覆喔� Dify Enterprise 喔箥喔侧斧喔`副喔氞笧喔粪箟喔權笚喔掂箞喔椸箥喔侧竾喔侧笝喔傕腑喔囙竸喔膏笓喙勦浮喙堗箘喔斷箟喙冟笂喙夃竾喔侧笝 喙傕笡喔`笖喔曕复喔斷笗喙堗腑喔溹腹喙夃笖喔灌箒喔ム福喔班笟喔氞競喔竾喔勦父喔撪箑喔炧阜喙堗腑喙冟笂喙� Dify 喔曕箞喔箘喔�',
+}
+
+export default translation
diff --git a/i18n/th-TH/plugin-tags.ts b/i18n/th-TH/plugin-tags.ts
new file mode 100644
index 0000000..a6eaeff
--- /dev/null
+++ b/i18n/th-TH/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    weather: '喔覆喔佮覆喔�',
+    finance: '喔佮覆喔`箑喔囙复喔�',
+    social: '喔副喔囙竸喔�',
+    entertainment: '喔∴斧喔`釜喔�',
+    education: '喔佮覆喔`辅喔多竵喔┼覆',
+    news: '喔傕箞喔侧抚',
+    design: '喔腑喔佮箒喔氞笟',
+    agent: '喔曕副喔о箒喔椸笝',
+    videos: '喔о复喔斷傅喙傕腑',
+    utilities: '喔覆喔樴覆喔`笓喔灌笡喙傕笭喔�',
+    search: '喔勦箟喔�',
+    business: '喔樴父喔`竵喔脆笀',
+    productivity: '喔溹弗喔脆笗喔犩覆喔�',
+    travel: '喙�喔斷复喔權笚喔侧竾',
+    medical: '喔椸覆喔囙竵喔侧福喙佮笧喔椸涪喙�',
+    image: '喔犩覆喔�',
+    other: '喔阜喙堗笝喙�',
+  },
+  searchTags: '喙佮笚喙囙竵喔勦箟喔權斧喔�',
+  allTags: '喙佮笚喙囙竵喔椸副喙夃竾喔浮喔�',
+}
+
+export default translation
diff --git a/i18n/th-TH/plugin.ts b/i18n/th-TH/plugin.ts
new file mode 100644
index 0000000..eb42371
--- /dev/null
+++ b/i18n/th-TH/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    extensions: '喔權覆喔� 喔竵喔膏弗',
+    models: '喔`父喙堗笝',
+    tools: '喙�喔勦福喔粪箞喔竾 喔∴阜喔�',
+    agents: '喔佮弗喔⑧父喔椸笜喙屶笗喔编抚喙佮笚喔�',
+    all: '喔椸副喙夃竾喔浮喔�',
+    bundles: '喔娻父喔斷福喔о浮',
+  },
+  categorySingle: {
+    tool: '喙�喔勦福喔粪箞喔竾喔∴阜喔�',
+    extension: '喔佮覆喔`箑喔炧复喙堗浮',
+    agent: '喔佮弗喔⑧父喔椸笜喙屶笗喔编抚喙佮笚喔�',
+    model: '喙佮笟喔�',
+    bundle: '喔∴副喔�',
+  },
+  list: {
+    source: {
+      github: '喔曕复喔斷笗喔编箟喔囙笀喔侧竵 GitHub',
+      local: '喔曕复喔斷笗喔编箟喔囙笀喔侧竵喙勦笩喔ム箤喙佮笧喙囙竸喙�喔佮笀喙冟笝喙�喔勦福喔粪箞喔竾',
+      marketplace: '喔曕复喔斷笗喔编箟喔囙笀喔侧竵 Marketplace',
+    },
+    noInstalled: '喙勦浮喙堗箘喔斷箟喔曕复喔斷笗喔编箟喔囙笡喔ム副喙娻竵喔复喔�',
+    notFound: '喙勦浮喙堗笧喔氞笡喔ム副喙娻竵喔复喔�',
+  },
+  source: {
+    local: '喙勦笩喔ム箤喙佮笧喙囙竸喙�喔佮笀喙冟笝喙�喔勦福喔粪箞喔竾',
+    github: '喙�喔佮抚喔�',
+    marketplace: '喔曕弗喔侧笖',
+  },
+  detailPanel: {
+    categoryTip: {
+      debugging: '喔涏弗喔编箠喔佮腑喔脆笝喔佮覆喔`笖喔掂笟喔编竵',
+      local: '喔涏弗喔编箠喔佮腑喔脆笝喔椸箟喔竾喔栢复喙堗笝',
+      marketplace: '喔曕复喔斷笗喔编箟喔囙笀喔侧竵 Marketplace',
+      github: '喔曕复喔斷笗喔编箟喔囙笀喔侧竵 Github',
+    },
+    operation: {
+      info: '喔傕箟喔浮喔灌弗喔涏弗喔编箠喔佮腑喔脆笝',
+      detail: '喔`覆喔� 喔ム赴喙�喔傅喔⑧笖',
+      install: '喔曕复喔斷笗喔编箟喔�',
+      update: '喔副喔炧箑喔斷笗',
+      viewDetail: '喔斷腹喔`覆喔⑧弗喔班箑喔傅喔⑧笖',
+      checkUpdate: '喔曕福喔о笀喔腑喔氞竵喔侧福喔副喔涏箑喔斷笗',
+      remove: '喔栢腑喔�',
+    },
+    toolSelector: {
+      settings: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔溹腹喙夃箖喔娻箟',
+      placeholder: '喙�喔ム阜喔竵喙�喔勦福喔粪箞喔竾喔∴阜喔�...',
+      params: '喔佮覆喔`竵喙嵿覆喔笝喔斷竸喙堗覆喙�喔笗喔膏笢喔�',
+      paramsTip2: '喙�喔∴阜喙堗腑喔涏复喔� \'喔副喔曕箓喔權浮喔编笗喔碶' 喔堗赴喙冟笂喙夃竸喙堗覆喙�喔`复喙堗浮喔曕箟喔�',
+      toolLabel: '喙�喔勦福喔粪箞喔竾喔∴阜喔�',
+      paramsTip1: '喔勦抚喔氞竸喔膏浮喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤喔佮覆喔`腑喔權父喔∴覆喔� LLM',
+      uninstalledLink: '喔堗副喔斷竵喔侧福喙冟笝喔涏弗喔编箠喔佮腑喔脆笝',
+      unsupportedContent: '喙�喔о腑喔`箤喔娻副喔權笡喔ム副喙娻竵喔复喔權笚喔掂箞喔曕复喔斷笗喔编箟喔囙箘喔∴箞喔∴傅喔佮覆喔`笖喙嵿覆喙�喔權复喔權竵喔侧福喔權傅喙�',
+      title: '喙�喔炧复喙堗浮喙�喔勦福喔粪箞喔竾喔∴阜喔�',
+      unsupportedContent2: '喔勦弗喔脆竵喙�喔炧阜喙堗腑喙�喔涏弗喔掂箞喔⑧笝喙�喔о腑喔`箤喔娻副喔�',
+      empty: '喔勦弗喔脆竵喔涏父喙堗浮 \'+\' 喙�喔炧阜喙堗腑喙�喔炧复喙堗浮喙�喔勦福喔粪箞喔竾喔∴阜喔� 喔勦父喔撪釜喔侧浮喔侧福喔栢箑喔炧复喙堗浮喙�喔勦福喔粪箞喔竾喔∴阜喔箘喔斷箟喔弗喔侧涪喔涪喙堗覆喔�',
+      descriptionLabel: '喔勦箥喔侧腑喔樴复喔氞覆喔⑧箑喔勦福喔粪箞喔竾喔∴阜喔�',
+      auto: '喔副喔曕箓喔權浮喔编笗喔�',
+      unsupportedTitle: '喔佮覆喔`笖喙嵿覆喙�喔權复喔權竵喔侧福喔椸傅喙堗箘喔∴箞喔`腑喔囙福喔编笟',
+      uninstalledTitle: '喙勦浮喙堗箘喔斷箟喔曕复喔斷笗喔编箟喔囙箑喔勦福喔粪箞喔竾喔∴阜喔�',
+      descriptionPlaceholder: '喔勦箥喔侧腑喔樴复喔氞覆喔⑧釜喔编箟喔� 喙� 喙�喔佮傅喙堗涪喔о竵喔编笟喔о副喔曕笘喔膏笡喔`赴喔竾喔勦箤喔傕腑喔囙箑喔勦福喔粪箞喔竾喔∴阜喔� 喙�喔娻箞喔� 喔`副喔氞腑喔膏笓喔笭喔灌浮喔脆釜喙嵿覆喔福喔编笟喔曕箥喔侧箒喔笝喙堗竾喙�喔夃笧喔侧赴',
+      uninstalledContent: '喔涏弗喔编箠喔佮腑喔脆笝喔權傅喙夃笗喔脆笖喔曕副喙夃竾喔堗覆喔佮笚喔掂箞喙�喔佮箛喔氞箖喔權箑喔勦福喔粪箞喔竾/GitHub 喔佮福喔膏笓喔侧箖喔娻箟喔弗喔编竾喔佮覆喔`笗喔脆笖喔曕副喙夃竾',
+    },
+    endpointDisableContent: '喔勦父喔撪笗喙夃腑喔囙竵喔侧福喔涏复喔斷竵喔侧福喙冟笂喙夃竾喔侧笝 {{name}} 喔福喔粪腑喙勦浮喙�?',
+    configureApp: '喔佮箥喔侧斧喔權笖喔勦箞喔侧箒喔笡',
+    configureTool: '喔佮箥喔侧斧喔權笖喔勦箞喔侧箑喔勦福喔粪箞喔竾喔∴阜喔�',
+    switchVersion: '喔弗喔编笟喙�喔о腑喔`箤喔娻副喔�',
+    endpointModalTitle: '喔涏弗喔侧涪喔椸覆喔囙竵喔侧福喔曕副喙夃竾喔勦箞喔�',
+    actionNum: '{{num}} {{喔佮覆喔`竵喔`赴喔椸箥喔瞹} 喔`抚喔�',
+    strategyNum: '{{num}} {{喔佮弗喔⑧父喔椸笜喙寎} 喔`抚喔�',
+    endpointsDocLink: '喔斷腹喙�喔竵喔覆喔�',
+    configureModel: '喔佮箥喔侧斧喔權笖喔勦箞喔侧箒喔氞笟喔堗箥喔侧弗喔竾',
+    endpointModalDesc: '喙�喔∴阜喙堗腑喔佮箥喔侧斧喔權笖喔勦箞喔侧箒喔ム箟喔� 喔覆喔∴覆喔`笘喙冟笂喙夃竸喔膏笓喔浮喔氞副喔曕复喔椸傅喙堗笡喔ム副喙娻竵喔复喔權箖喔箟喔溹箞喔侧笝喔涏弗喔侧涪喔椸覆喔� API 喙勦笖喙�',
+    modelNum: '{{num}} 喔`父喙堗笝喔`抚喔�',
+    endpointDisableTip: '喔涏复喔斷箖喔娻箟喔囙覆喔權笡喔ム覆喔⑧笚喔侧竾',
+    endpointDeleteTip: '喔ム笟喔涏弗喔侧涪喔椸覆喔�',
+    disabled: '喔炧复喔佮覆喔�',
+    endpointDeleteContent: '喔勦父喔撪笗喙夃腑喔囙竵喔侧福喔ム笟 {{name}} 喔福喔粪腑喙勦浮喙�?',
+    endpoints: '喔涏弗喔侧涪 喔椸覆喔�',
+    endpointsTip: '喔涏弗喔编箠喔佮腑喔脆笝喔權傅喙夃浮喔掂笩喔编竾喔佮箤喔娻副喔權箑喔夃笧喔侧赴喔溹箞喔侧笝喔涏弗喔侧涪喔椸覆喔� 喙佮弗喔班竸喔膏笓喔覆喔∴覆喔`笘喔佮箥喔侧斧喔權笖喔勦箞喔侧笂喔膏笖喔涏弗喔侧涪喔椸覆喔囙斧喔ム覆喔⑧笂喔膏笖喔箥喔侧斧喔`副喔氞笧喔粪箟喔權笚喔掂箞喔椸箥喔侧竾喔侧笝喔涏副喔堗笀喔膏笟喔编笝喙勦笖喙�',
+    endpointsEmpty: '喔勦弗喔脆竵喔涏父喙堗浮 \'+\' 喙�喔炧阜喙堗腑喙�喔炧复喙堗浮喔涏弗喔侧涪喔椸覆喔�',
+    serviceOk: '喔氞福喔脆竵喔侧福喔曕竵喔ム竾',
+  },
+  debugInfo: {
+    viewDocs: '喔斷腹喙�喔竵喔覆喔�',
+    title: '喔佮覆喔`箒喔佮箟喔堗父喔斷笟喔佮笧喔`箞喔竾',
+  },
+  privilege: {
+    everyone: '喔椸父喔佮竸喔�',
+    whoCanInstall: '喙冟竸喔`釜喔侧浮喔侧福喔栢笗喔脆笖喔曕副喙夃竾喙佮弗喔班笀喔编笖喔佮覆喔`笡喔ム副喙娻竵喔复喔權箘喔斷箟喔氞箟喔侧竾',
+    noone: '喙勦浮喙堗浮喔掂箖喔勦福',
+    whoCanDebug: '喙冟竸喔`釜喔侧浮喔侧福喔栢笖喔掂笟喔编竵喔涏弗喔编箠喔佮腑喔脆笝喙勦笖喙夃笟喙夃覆喔�',
+    title: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔涏弗喔编箠喔佮腑喔脆笝',
+    admins: '喔溹腹喙夃笖喔灌箒喔ム福喔班笟喔�',
+  },
+  pluginInfoModal: {
+    packageName: '喔箞喔�',
+    title: '喔傕箟喔浮喔灌弗喔涏弗喔编箠喔佮腑喔脆笝',
+    release: '喔涏弗喙堗腑喔�',
+    repository: '喙�喔佮箛喔�',
+  },
+  action: {
+    pluginInfo: '喔傕箟喔浮喔灌弗喔涏弗喔编箠喔佮腑喔脆笝',
+    deleteContentLeft: '喔勦父喔撪笗喙夃腑喔囙竵喔侧福喔ム笟',
+    deleteContentRight: '喔涏弗喔编箠喔佮腑喔脆笝?',
+    usedInApps: '喔涏弗喔编箠喔佮腑喔脆笝喔權傅喙夃笘喔灌竵喙冟笂喙夃箖喔權箒喔笡 {{num}}',
+    delete: '喔ム笟喔涏弗喔编箠喔佮腑喔脆笝',
+    checkForUpdates: '喔曕福喔о笀喔腑喔氞竵喔侧福喔副喔涏箑喔斷笗',
+  },
+  installModal: {
+    labels: {
+      version: '喙�喔о腑喔`箤喔娻副喔�',
+      package: '喔箞喔�',
+      repository: '喙�喔佮箛喔�',
+    },
+    pluginLoadErrorDesc: '喔涏弗喔编箠喔佮腑喔脆笝喔權傅喙夃笀喔班箘喔∴箞喔栢腹喔佮笗喔脆笖喔曕副喙夃竾',
+    readyToInstall: '喙�喔佮傅喙堗涪喔о竵喔编笟喔佮覆喔`笗喔脆笖喔曕副喙夃竾喔涏弗喔编箠喔佮腑喔脆笝喔曕箞喔箘喔涏笝喔掂箟',
+    uploadFailed: '喔副喔涏箓喔弗喔斷弗喙夃浮喙�喔弗喔�',
+    installFailed: '喔佮覆喔`笗喔脆笖喔曕副喙夃竾喔ム箟喔∴箑喔弗喔�',
+    installedSuccessfullyDesc: '喔曕复喔斷笗喔编箟喔囙笡喔ム副喙娻竵喔复喔權釜喙嵿覆喙�喔`箛喔堗箒喔ム箟喔�',
+    readyToInstallPackage: '喙�喔佮傅喙堗涪喔о竵喔编笟喔佮覆喔`笗喔脆笖喔曕副喙夃竾喔涏弗喔编箠喔佮腑喔脆笝喔曕箞喔箘喔涏笝喔掂箟',
+    dropPluginToInstall: '喔о覆喔囙箒喔炧箛喔勦箑喔佮笀喔涏弗喔编箠喔佮腑喔脆笝喔椸傅喙堗笝喔掂箞喙�喔炧阜喙堗腑喔曕复喔斷笗喔编箟喔�',
+    install: '喔曕复喔斷笗喔编箟喔�',
+    back: '喔⑧箟喔笝喔佮弗喔编笟',
+    cancel: '喔⑧竵喙�喔ム复喔�',
+    installPlugin: '喔曕复喔斷笗喔编箟喔囙笡喔ム副喙娻竵喔复喔�',
+    readyToInstallPackages: '喙�喔佮傅喙堗涪喔о竵喔编笟喔佮覆喔`笗喔脆笖喔曕副喙夃竾喔涏弗喔编箠喔佮腑喔脆笝 {{num}} 喔曕箞喔箘喔涏笝喔掂箟',
+    uploadingPackage: '喔佮箥喔侧弗喔编竾喔副喔涏箓喔弗喔� {{packageName}}...',
+    installFailedDesc: '喔曕复喔斷笗喔编箟喔囙笡喔ム副喙娻竵喔复喔權弗喙夃浮喙�喔弗喔�',
+    next: '喔曕箞喔箘喔�',
+    fromTrustSource: '喙傕笡喔`笖喔曕福喔о笀喔腑喔氞箖喔箟喙佮笝喙堗箖喔堗抚喙堗覆喔勦父喔撪笗喔脆笖喔曕副喙夃竾喔涏弗喔编箠喔佮腑喔脆笝喔堗覆喔�<trustSource>喙佮斧喔ム箞喔囙笚喔掂箞喙�喔娻阜喙堗腑喔栢阜喔箘喔斷箟</trustSource>喙�喔椸箞喔侧笝喔编箟喔�',
+    installing: '喔曕复喔� 喔曕副喙夃竾   ',
+    close: '喔涏复喔�',
+    installedSuccessfully: '喔佮覆喔`笗喔脆笖喔曕副喙夃竾喔箥喔侧箑喔`箛喔�',
+    installComplete: '喔佮覆喔`笗喔脆笖喔曕副喙夃竾喙�喔福喙囙笀喔浮喔氞腹喔`笓喙�',
+    pluginLoadError: '喔傕箟喔笢喔脆笖喔炧弗喔侧笖喙冟笝喔佮覆喔`箓喔弗喔斷笡喔ム副喙娻竵喔复喔�',
+  },
+  installFromGitHub: {
+    updatePlugin: '喔副喔涏箑喔斷笗喔涏弗喔编箠喔佮腑喔脆笝喔堗覆喔� GitHub',
+    gitHubRepo: '喔椸傅喙堗箑喔佮箛喔� GitHub',
+    installNote: '喙傕笡喔`笖喔曕福喔о笀喔腑喔氞箖喔箟喙佮笝喙堗箖喔堗抚喙堗覆喔勦父喔撪笗喔脆笖喔曕副喙夃竾喔涏弗喔编箠喔佮腑喔脆笝喔堗覆喔佮箒喔弗喙堗竾喔椸傅喙堗箑喔娻阜喙堗腑喔栢阜喔箘喔斷箟喙�喔椸箞喔侧笝喔编箟喔�',
+    installedSuccessfully: '喔佮覆喔`笗喔脆笖喔曕副喙夃竾喔箥喔侧箑喔`箛喔�',
+    uploadFailed: '喔副喔涏箓喔弗喔斷弗喙夃浮喙�喔弗喔�',
+    selectVersionPlaceholder: '喙傕笡喔`笖喙�喔ム阜喔竵喙�喔о腑喔`箤喔娻副喔�',
+    selectPackagePlaceholder: '喙傕笡喔`笖喙�喔ム阜喔竵喙佮笧喙囙竵喙�喔佮笀',
+    installFailed: '喔佮覆喔`笗喔脆笖喔曕副喙夃竾喔ム箟喔∴箑喔弗喔�',
+    selectVersion: '喙�喔ム阜喔竵喔`父喙堗笝',
+    installPlugin: '喔曕复喔斷笗喔编箟喔囙笡喔ム副喙娻竵喔复喔權笀喔侧竵 GitHub',
+    selectPackage: '喙�喔ム阜喔竵喙佮笧喙囙竵喙�喔佮笀',
+  },
+  upgrade: {
+    description: '喙�喔佮傅喙堗涪喔о竵喔编笟喔佮覆喔`笗喔脆笖喔曕副喙夃竾喔涏弗喔编箠喔佮腑喔脆笝喔曕箞喔箘喔涏笝喔掂箟',
+    title: '喔曕复喔斷笗喔编箟喔囙笡喔ム副喙娻竵喔复喔�',
+    upgrading: '喔曕复喔� 喔曕副喙夃竾   ',
+    successfulTitle: '喔曕复喔斷笗喔编箟喔囙釜喙嵿覆喙�喔`箛喔�',
+    upgrade: '喔曕复喔斷笗喔编箟喔�',
+    usedInApps: '喙冟笂喙夃箖喔權箒喔笡 {{num}}',
+    close: '喔涏复喔�',
+  },
+  error: {
+    noReleasesFound: '喙勦浮喙堗笧喔氞競喙堗覆喔о笡喔`赴喔娻覆喔副喔∴笧喔编笝喔樴箤 喙傕笡喔`笖喔曕福喔о笀喔腑喔氞笚喔掂箞喙�喔佮箛喔� GitHub 喔福喔粪腑 URL 喔椸傅喙堗笡喙夃腑喔權競喙夃腑喔∴腹喔�',
+    inValidGitHubUrl: 'URL GitHub 喙勦浮喙堗笘喔灌竵喔曕箟喔竾 喙傕笡喔`笖喔涏箟喔笝 URL 喔椸傅喙堗笘喔灌竵喔曕箟喔竾喙冟笝喔`腹喔涏箒喔氞笟: https://github.com/owner/repo',
+    fetchReleasesError: '喙勦浮喙堗釜喔侧浮喔侧福喔栢笖喔多竾喔傕箟喔浮喔灌弗喔佮覆喔`箑喔溹涪喙佮笧喔`箞喙勦笖喙� 喙傕笡喔`笖喔ム腑喔囙腑喔掂竵喔勦福喔编箟喔囙箖喔權笭喔侧涪喔弗喔编竾',
+  },
+  marketplace: {
+    sortOption: {
+      newlyReleased: '喙�喔涏复喔斷笗喔编抚喙冟斧喔∴箞',
+      mostPopular: '喙佮斧喙堗竾',
+      recentlyUpdated: '喔副喔炧箑喔斷笚喔ム箞喔侧釜喔膏笖',
+      firstReleased: '喙�喔涏复喔斷笗喔编抚喔勦福喔编箟喔囙箒喔`竵',
+    },
+    viewMore: '喔斷腹喙�喔炧复喙堗浮喙�喔曕复喔�',
+    moreFrom: '喙佮腑喔涏箑喔炧复喙堗浮喙�喔曕复喔∴笀喔侧竵 Marketplace',
+    pluginsResult: '{{num}} 喔溹弗喔ム副喔炧笜喙�',
+    and: '喙佮弗喔�',
+    sortBy: '喙�喔∴阜喔竾喔傅喔斷箥喔�',
+    discover: '喔勦箟喔權笧喔�',
+    noPluginFound: '喙勦浮喙堗笧喔氞笡喔ム副喙娻竵喔复喔�',
+    empower: '喙�喔炧复喙堗浮喔ㄠ副喔佮涪喔犩覆喔炧箖喔權竵喔侧福喔炧副喔掄笝喔� AI 喔傕腑喔囙竸喔膏笓',
+    difyMarketplace: '喔曕弗喔侧笖 Dify',
+    partnerTip: '喙勦笖喙夃福喔编笟喔佮覆喔`笗喔`抚喔堗釜喔笟喙傕笖喔⑧笧喔编笝喔樴浮喔脆笗喔`競喔竾 Dify',
+    verifiedTip: '喙勦笖喙夃福喔编笟喔佮覆喔`笗喔`抚喔堗釜喔笟喙傕笖喔� Dify',
+  },
+  task: {
+    installing: '喔佮覆喔`笗喔脆笖喔曕副喙夃竾喔涏弗喔编箠喔佮腑喔脆笝 {{installingLength}} 0 喙�喔福喙囙笀喙佮弗喙夃抚',
+    installingWithError: '喔佮覆喔`笗喔脆笖喔曕副喙夃竾喔涏弗喔编箠喔佮腑喔脆笝 {{installingLength}}, {{successLength}} 喔箥喔侧箑喔`箛喔�, {{errorLength}} 喔ム箟喔∴箑喔弗喔�',
+    installingWithSuccess: '喔佮覆喔`笗喔脆笖喔曕副喙夃竾喔涏弗喔编箠喔佮腑喔脆笝 {{installingLength}}, {{successLength}} 喔箥喔侧箑喔`箛喔�',
+    installedError: '{{errorLength}} 喔涏弗喔编箠喔佮腑喔脆笝喔曕复喔斷笗喔编箟喔囙箘喔∴箞喔箥喔侧箑喔`箛喔�',
+    clearAll: '喔ム箟喔侧竾喔椸副喙夃竾喔浮喔�',
+    installError: '{{errorLength}} 喔涏弗喔编箠喔佮腑喔脆笝喔曕复喔斷笗喔编箟喔囙箘喔∴箞喔箥喔侧箑喔`箛喔� 喔勦弗喔脆竵喙�喔炧阜喙堗腑喔斷腹',
+  },
+  searchCategories: '喔浮喔о笖喔浮喔灌箞喔佮覆喔`竸喙夃笝喔覆',
+  searchInMarketplace: '喔勦箟喔權斧喔侧箖喔� Marketplace',
+  findMoreInMarketplace: '喔勦箟喔權斧喔侧箑喔炧复喙堗浮喙�喔曕复喔∴箖喔� Marketplace',
+  installPlugin: '喔曕复喔斷笗喔编箟喔囙笡喔ム副喙娻竵喔复喔�',
+  search: '喔勦箟喔�',
+  from: '喔堗覆喔�',
+  install: '{{num}} 喔佮覆喔`笗喔脆笖喔曕副喙夃竾',
+  endpointsEnabled: '{{num}} 喔娻父喔斷競喔竾喔涏弗喔侧涪喔椸覆喔囙笚喔掂箞喙�喔涏复喔斷箖喔娻箟喔囙覆喔�',
+  searchPlugins: '喔勦箟喔權斧喔侧笡喔ム副喙娻竵喔复喔�',
+  installAction: '喔曕复喔斷笗喔编箟喔�',
+  searchTools: '喙�喔勦福喔粪箞喔竾喔∴阜喔竸喙夃笝喔覆...',
+  installFrom: '喔曕复喔斷笗喔编箟喔囙笀喔侧竵',
+  fromMarketplace: '喔堗覆喔� Marketplace',
+  submitPlugin: '喔箞喔囙笡喔ム副喙娻竵喔复喔�',
+  allCategories: '喔浮喔о笖喔浮喔灌箞喔椸副喙夃竾喔浮喔�',
+  metadata: {
+    title: '喔涏弗喔编箠喔佮腑喔脆笝',
+  },
+  difyVersionNotCompatible: '喙�喔о腑喔`箤喔娻副喙堗笝喔涏副喔堗笀喔膏笟喔编笝喔傕腑喔� Dify 喙勦浮喙堗釜喔侧浮喔侧福喔栢箖喔娻箟喔囙覆喔權福喙堗抚喔∴竵喔编笟喔涏弗喔编箠喔佮腑喔脆笝喔權傅喙夃箘喔斷箟 喔佮福喔膏笓喔侧腑喔编笡喙�喔佮福喔斷箘喔涏涪喔编竾喙�喔о腑喔`箤喔娻副喙堗笝喔傕副喙夃笝喔曕箞喔赤笚喔掂箞喔曕箟喔竾喔佮覆喔�: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/th-TH/register.ts b/i18n/th-TH/register.ts
new file mode 100644
index 0000000..e2410dd
--- /dev/null
+++ b/i18n/th-TH/register.ts
@@ -0,0 +1,3 @@
+const translation = {}
+
+export default translation
diff --git a/i18n/th-TH/run-log.ts b/i18n/th-TH/run-log.ts
new file mode 100644
index 0000000..49e7f68
--- /dev/null
+++ b/i18n/th-TH/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: '喔复喔權笧喔膏笗',
+  result: '喔溹弗',
+  detail: '喔`覆喔⑧弗喔班箑喔傅喔⑧笖',
+  tracing: '喔曕复喔斷笗喔侧浮',
+  resultPanel: {
+    status: '喔笘喔侧笝喔�',
+    time: '喙�喔о弗喔侧笚喔掂箞喔溹箞喔侧笝喙勦笡',
+    tokens: '喙傕笚喙�喔勦箛喔權笚喔编箟喔囙斧喔∴笖',
+  },
+  meta: {
+    title: '喔傕箟喔浮喔灌弗喙�喔∴笗喔�',
+    status: '喔笘喔侧笝喔�',
+    version: '喙�喔о腑喔`箤喔娻副喔�',
+    executor: '喔溹腹喙夃笡喔忇复喔氞副喔曕复喔佮覆喔�',
+    startTime: '喙�喔о弗喔侧箑喔`复喙堗浮喔曕箟喔�',
+    time: '喙�喔о弗喔侧笚喔掂箞喔溹箞喔侧笝喙勦笡',
+    tokens: '喙傕笚喙�喔勦箛喔權笚喔编箟喔囙斧喔∴笖',
+    steps: '喙�喔`傅喔⑧竵喙冟笂喙夃競喔编箟喔權笗喔笝',
+  },
+  resultEmpty: {
+    title: '喙�喔`傅喔⑧竵喙冟笂喙夃箑喔夃笧喔侧赴喔`腹喔涏箒喔氞笟 JSON 喙�喔覆喔曕箤喔炧父喔�',
+    tipLeft: '喔佮福喔膏笓喔侧箘喔涏笚喔掂箞',
+    link: '喙佮笢喔囙福喔侧涪喔ム赴喙�喔傅喔⑧笖',
+    tipRight: '喔斷腹喔∴副喔�',
+  },
+  circularInvocationTip: '喔∴傅喔佮覆喔`箑喔`傅喔⑧竵喙冟笂喙夃箑喔勦福喔粪箞喔竾喔∴阜喔�/喙傕斧喔權笖喙佮笟喔氞抚喔囙竵喔ム浮喙冟笝喙�喔о复喔`箤喔佮箓喔熰弗喔о箤喔涏副喔堗笀喔膏笟喔编笝',
+  actionLogs: '喔氞副喔權笚喔多竵喔佮覆喔`笖喙嵿覆喙�喔權复喔權竵喔侧福',
+}
+
+export default translation
diff --git a/i18n/th-TH/share-app.ts b/i18n/th-TH/share-app.ts
new file mode 100644
index 0000000..fd4a8f3
--- /dev/null
+++ b/i18n/th-TH/share-app.ts
@@ -0,0 +1,78 @@
+const translation = {
+  common: {
+    appUnavailable: '喙佮腑喔炧箘喔∴箞喔炧福喙夃腑喔∴箖喔娻箟喔囙覆喔�',
+    appUnknownError: '喙佮腑喔炧箘喔∴箞喔炧福喙夃腑喔∴箖喔娻箟喔囙覆喔�',
+    welcome: '',
+  },
+  chat: {
+    newChat: '喙佮笂喔椸箖喔浮喙�',
+    pinnedTitle: '喔涏副喔� 喔浮喔膏笖',
+    unpinnedTitle: '喙佮浮喔�',
+    newChatDefaultName: '喔佮覆喔`釜喔權笚喔權覆喙冟斧喔∴箞',
+    resetChat: '喔`傅喙�喔嬥箛喔曕竵喔侧福喔笝喔椸笝喔�',
+    poweredBy: '喔`副喔氞笧喔ム副喔囙浮喔侧笀喔侧竵',
+    prompt: '喔炧福喙夃腑喔∴笚喙�',
+    privatePromptConfigTitle: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔佮覆喔`釜喔權笚喔權覆',
+    publicPromptConfigTitle: '喔炧福喔浮喔曕箤喙�喔`复喙堗浮喔曕箟喔�',
+    configStatusDes: '喔佮箞喔笝喙�喔`复喙堗浮 喔勦父喔撪釜喔侧浮喔侧福喔栢箒喔佮箟喙勦競喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔佮覆喔`釜喔權笚喔權覆喙勦笖喙�',
+    configDisabled: '喔∴傅喔佮覆喔`箖喔娻箟喔佮覆喔`笗喔编箟喔囙竸喙堗覆喙�喔嬥釜喔娻副喔權竵喙堗腑喔權斧喔權箟喔侧笝喔掂箟喔箥喔侧斧喔`副喔氞箑喔嬥釜喔娻副喔權笝喔掂箟',
+    startChat: '喙�喔`复喙堗浮喙佮笂喔�',
+    privacyPolicyLeft: '喙傕笡喔`笖喔箞喔侧笝',
+    privacyPolicyMiddle: '喔權箓喔⑧笟喔侧涪喔勦抚喔侧浮喙�喔涏箛喔權釜喙堗抚喔權笗喔编抚',
+    privacyPolicyRight: '喔堗副喔斷笚喙嵿覆喙傕笖喔⑧笝喔编竵喔炧副喔掄笝喔侧箒喔笡',
+    deleteConversation: {
+      title: '喔ム笟喔佮覆喔`釜喔權笚喔權覆',
+      content: '喔勦父喔撪箒喔權箞喙冟笀喔福喔粪腑喙勦浮喙堗抚喙堗覆喔曕箟喔竾喔佮覆喔`弗喔氞竵喔侧福喔笝喔椸笝喔侧笝喔掂箟?',
+    },
+    tryToSolve: '喔炧涪喔侧涪喔侧浮喙佮竵喙�',
+    temporarySystemIssue: '喔傕腑喔笭喔编涪 喔涏副喔嵿斧喔侧福喔班笟喔氞笂喔编箞喔о竸喔`覆喔�',
+    expand: '喔傕涪喔侧涪',
+    collapse: '喔⑧箞喔�',
+    newChatTip: '喔涪喔灌箞喙冟笝喙佮笂喔椸箖喔浮喙堗箒喔ム箟喔�',
+    chatSettingsTitle: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔佮覆喔`釜喔權笚喔權覆喙冟斧喔∴箞',
+    viewChatSettings: '喔斷腹喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔佮覆喔`箒喔娻笚',
+    chatFormTip: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喙佮笂喔椸箘喔∴箞喔覆喔∴覆喔`笘喙�喔涏弗喔掂箞喔⑧笝喙佮笡喔ム竾喙勦笖喙夃斧喔ム副喔囙笀喔侧竵喔椸傅喙堗箒喔娻笚喙�喔`复喙堗浮喔曕箟喔權競喔多箟喔權箒喔ム箟喔�.',
+  },
+  generation: {
+    tabs: {
+      create: '喙�喔`傅喔⑧竵喙冟笂喙夃竸喔`副喙夃竾喙�喔斷傅喔⑧抚',
+      batch: '喙�喔`傅喔⑧竵喙冟笂喙夃箒喔氞笚喔娻箤',
+      saved: '喔氞副喔權笚喔多竵',
+    },
+    savedNoData: {
+      title: '喔勦父喔撪涪喔编竾喙勦浮喙堗箘喔斷箟喔氞副喔權笚喔多竵喔溹弗喔ム副喔炧笜喙�!',
+      description: '喙�喔`复喙堗浮喔福喙夃覆喔囙箑喔權阜喙夃腑喔覆 喙佮弗喔班竸喙夃笝喔覆喔溹弗喔ム副喔炧笜喙屶笚喔掂箞喔氞副喔權笚喔多竵喙勦抚喙夃笚喔掂箞喔權傅喙�',
+      startCreateContent: '喙�喔`复喙堗浮喔福喙夃覆喔囙箑喔權阜喙夃腑喔覆',
+    },
+    title: '喔勦抚喔侧浮喔浮喔氞腹喔`笓喙屶競喔竾 AI',
+    queryTitle: '喙�喔權阜喙夃腑喔覆喙佮笟喔氞釜喔笟喔栢覆喔�',
+    completionResult: '喔溹弗喔佮覆喔`箑喔福喙囙笀喔浮喔氞腹喔`笓喙�',
+    queryPlaceholder: '喙�喔傕傅喔⑧笝喙�喔權阜喙夃腑喔覆喙佮笟喔氞釜喔笟喔栢覆喔∴競喔竾喔勦父喔�...',
+    run: '喔涏福喔班斧喔侧福喔娻傅喔о复喔�',
+    copy: '喔ム腑喔�',
+    resultTitle: '喔勦抚喔侧浮喔浮喔氞腹喔`笓喙屶競喔竾 AI',
+    noData: 'AI 喔堗赴喙冟斧喙夃釜喔脆箞喔囙笚喔掂箞喔勦父喔撪笗喙夃腑喔囙竵喔侧福喔椸傅喙堗笝喔掂箞',
+    csvUploadTitle: '喔ム覆喔佮箒喔ム赴喔о覆喔囙箘喔熰弗喙� CSV 喔傕腑喔囙竸喔膏笓喔椸傅喙堗笝喔掂箞 喔福喔粪腑',
+    browse: '喙�喔ム箛喔�',
+    csvStructureTitle: '喙勦笩喔ム箤 CSV 喔曕箟喔竾喔腑喔斷竸喔ム箟喔竾喔佮副喔氞箓喔勦福喔囙釜喔`箟喔侧竾喔曕箞喔箘喔涏笝喔掂箟:',
+    downloadTemplate: '喔斷覆喔о笝喙屶箓喔弗喔斷箑喔椸浮喙�喔炧弗喔曕笚喔掂箞喔權傅喙�',
+    field: '喔笝喔侧浮',
+    batchFailed: {
+      info: '{{num}} 喔佮覆喔`笖喙嵿覆喙�喔權复喔權竵喔侧福喔椸傅喙堗弗喙夃浮喙�喔弗喔�',
+      retry: '喔ム腑喔�',
+      outputPlaceholder: '喙勦浮喙堗浮喔掂箑喔權阜喙夃腑喔覆喙�喔覆喔曕箤喔炧父喔�',
+    },
+    errorMsg: {
+      empty: '喔佮福喔膏笓喔侧笡喙夃腑喔權箑喔權阜喙夃腑喔覆喙冟笝喙勦笩喔ム箤喔椸傅喙堗腑喔编笡喙傕斧喔ム笖',
+      fileStructNotMatch: '喙勦笩喔ム箤 CSV 喔椸傅喙堗腑喔编笡喙傕斧喔ム笖喙勦浮喙堗笗喔`竾喔佮副喔氞箓喔勦福喔囙釜喔`箟喔侧竾',
+      emptyLine: '喙佮笘喔� {{rowIndex}} 喔о箞喔侧竾喙�喔涏弗喙堗覆',
+      invalidLine: '喙佮笘喔� {{rowIndex}}: 喔勦箞喔� {{varName}} 喔曕箟喔竾喔о箞喔侧竾喙�喔涏弗喙堗覆喙勦浮喙堗箘喔斷箟',
+      moreThanMaxLengthLine: '喙佮笘喔� {{rowIndex}}: 喔勦箞喔� {{varName}} 喔曕箟喔竾喙勦浮喙堗箑喔佮复喔� {{maxLength}} 喔副喔佮競喔`赴',
+      atLeastOne: '喙傕笡喔`笖喔涏箟喔笝喔涪喙堗覆喔囙笝喙夃腑喔⑧斧喔權付喙堗竾喙佮笘喔о箖喔權箘喔熰弗喙屶笚喔掂箞喔副喔涏箓喔弗喔�',
+    },
+    execution: '喔佮覆喔`笖喔赤箑喔權复喔權竵喔侧福',
+    executions: '{{num}} 喔佮覆喔`笡喔`赴喔覆喔`笂喔掂抚喔脆笗',
+  },
+}
+
+export default translation
diff --git a/i18n/th-TH/time.ts b/i18n/th-TH/time.ts
new file mode 100644
index 0000000..03897dd
--- /dev/null
+++ b/i18n/th-TH/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Fri: '喙�喔福喔�',
+    Sat: '喙�喔覆喔`箤',
+    Wed: '喔о副喔權笧喔膏笜',
+    Sun: '喔斷抚喔囙腑喔侧笚喔脆笗喔⑧箤',
+    Tue: '喔副喔囙竸喔侧福',
+    Thu: '喔о副喔權笧喔む斧喔编釜喔氞笖喔�',
+    Mon: '喔∴腑喔�',
+  },
+  months: {
+    February: '喔佮父喔∴笭喔侧笧喔编笝喔樴箤',
+    July: '喔佮福喔佮笌喔侧竸喔�',
+    June: '喔∴复喔栢父喔權覆喔⑧笝',
+    January: '喔∴竵喔`覆喔勦浮',
+    September: '喔佮副喔權涪喔侧涪喔�',
+    August: '喔复喔囙斧喔侧竸喔�',
+    October: '喔曕父喔ム覆喔勦浮',
+    May: '喔炧袱喔┼笭喔侧竸喔�',
+    November: '喔炧袱喔ㄠ笀喔脆竵喔侧涪喔�',
+    March: '喔∴傅喔權覆喔勦浮',
+    December: '喔樴副喔權抚喔侧竸喔�',
+    April: '喙�喔∴俯喔侧涪喔�',
+  },
+  operation: {
+    ok: '喔曕竵喔ム竾',
+    cancel: '喔⑧竵喙�喔ム复喔�',
+    pickDate: '喙�喔ム阜喔竵喔о副喔權笚喔掂箞',
+    now: '喔曕腑喔權笝喔掂箟',
+  },
+  title: {
+    pickTime: '喙�喔ム阜喔竵喙�喔о弗喔�',
+  },
+  defaultPlaceholder: '喙�喔ム阜喔竵喙�喔о弗喔�...',
+}
+
+export default translation
diff --git a/i18n/th-TH/tools.ts b/i18n/th-TH/tools.ts
new file mode 100644
index 0000000..7770b3d
--- /dev/null
+++ b/i18n/th-TH/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: '喙�喔勦福喔粪箞喔竾 喔∴阜喔�',
+  createCustomTool: '喔福喙夃覆喔囙箑喔勦福喔粪箞喔竾喔∴阜喔笚喔掂箞喔佮箥喔侧斧喔權笖喙�喔竾',
+  customToolTip: '喙�喔`傅喔⑧笝喔`腹喙夃箑喔炧复喙堗浮喙�喔曕复喔∴箑喔佮傅喙堗涪喔о竵喔编笟喙�喔勦福喔粪箞喔竾喔∴阜喔箒喔氞笟喔佮箥喔侧斧喔權笖喙�喔竾喔傕腑喔� Dify',
+  type: {
+    all: '喔椸副喙夃竾喔浮喔�',
+    builtIn: '喙冟笝喔曕副喔�',
+    custom: '喔樴福喔`浮喙�喔權傅喔⑧浮',
+    workflow: '喙�喔о复喔`箤喔佮箓喔熰弗喔о箤',
+  },
+  contribute: {
+    line1: '喔夃副喔權釜喔權箖喔堗箖喔�',
+    line2: '喙�喔勦福喔粪箞喔竾喔∴阜喔笚喔掂箞喔∴傅喔箞喔о笝喔`箞喔о浮喙冟笝 Dify',
+    viewGuide: '喔斷腹喔勦腹喙堗浮喔粪腑',
+  },
+  author: '喙傕笖喔�',
+  auth: {
+    unauthorized: '喔佮覆喔`腑喔權父喔嵿覆喔�',
+    authorized: '喔笝喔膏笉喔侧笗',
+    setup: '喔曕副喙夃竾喔勦箞喔侧竵喔侧福喙冟斧喙夃釜喔脆笚喔樴复喙屶箑喔炧阜喙堗腑喙冟笂喙�',
+    setupModalTitle: '喔曕副喙夃竾喔勦箞喔侧竵喔侧福喙冟斧喙夃釜喔脆笚喔樴复喙�',
+    setupModalTitleDescription: '喔弗喔编竾喔堗覆喔佮竵喙嵿覆喔笝喔斷竸喙堗覆喔傕箟喔浮喔灌弗喔涏福喔班笀喙嵿覆喔曕副喔о箒喔ム箟喔� 喔浮喔侧笂喔脆竵喔椸副喙夃竾喔浮喔斷笭喔侧涪喙冟笝喔炧阜喙夃笝喔椸傅喙堗笚喙嵿覆喔囙覆喔權釜喔侧浮喔侧福喔栢箖喔娻箟喙�喔勦福喔粪箞喔竾喔∴阜喔笝喔掂箟喙�喔∴阜喙堗腑喔涏福喔班釜喔侧笝喔囙覆喔權箒喔笡喔炧弗喔脆箑喔勦笂喔编笝喙勦笖喙�',
+  },
+  includeToolNum: '{{num}} 喔`抚喔∴箑喔勦福喔粪箞喔竾喔∴阜喔�',
+  addTool: '喙�喔炧复喙堗浮喙�喔勦福喔粪箞喔竾喔∴阜喔�',
+  addToolModal: {
+    type: '喔涏福喔班箑喔犩笚',
+    category: '喔涏福喔班箑喔犩笚',
+    add: '喙�喔炧复喙堗浮',
+    added: '喙�喔炧复喙堗浮',
+    manageInTools: '喔堗副喔斷竵喔侧福喙冟笝喙�喔勦福喔粪箞喔竾喔∴阜喔�',
+    emptyTitle: '喙勦浮喙堗浮喔掂箑喔勦福喔粪箞喔竾喔∴阜喔箑喔о复喔`箤喔佮箓喔熰弗喔о箤',
+    emptyTip: '喙勦笡喔椸傅喙� "喙�喔о复喔`箤喔佮箓喔熰弗喔о箤 -> 喙�喔溹涪喙佮笧喔`箞喙�喔涏箛喔權箑喔勦福喔粪箞喔竾喔∴阜喔�"',
+    emptyTitleCustom: '喙勦浮喙堗浮喔掂箑喔勦福喔粪箞喔竾喔∴阜喔笚喔掂箞喔佮箥喔侧斧喔權笖喙�喔竾',
+    emptyTipCustom: '喔福喙夃覆喔囙箑喔勦福喔粪箞喔竾喔∴阜喔箒喔氞笟喔佮箥喔侧斧喔權笖喙�喔竾',
+  },
+  createTool: {
+    title: '喔福喙夃覆喔囙箑喔勦福喔粪箞喔竾喔∴阜喔笚喔掂箞喔佮箥喔侧斧喔權笖喙�喔竾',
+    editAction: '喔佮箥喔侧斧喔權笖喔勦箞喔�',
+    editTitle: '喙佮竵喙夃箘喔傕箑喔勦福喔粪箞喔竾喔∴阜喔笚喔掂箞喔佮箥喔侧斧喔權笖喙�喔竾',
+    name: '喔娻阜喙堗腑',
+    toolNamePlaceHolder: '喔涏箟喔笝喔娻阜喙堗腑喙�喔勦福喔粪箞喔竾喔∴阜喔�',
+    nameForToolCall: '喔娻阜喙堗腑喔佮覆喔`箑喔`傅喔⑧竵喙�喔勦福喔粪箞喔竾喔∴阜喔�',
+    nameForToolCallPlaceHolder: '喙冟笂喙夃釜喙嵿覆喔福喔编笟喔堗笖喔堗箥喔侧箑喔勦福喔粪箞喔竾 喙�喔娻箞喔� getCurrentWeather list_pets',
+    nameForToolCallTip: '喔`腑喔囙福喔编笟喙�喔夃笧喔侧赴喔曕副喔о箑喔ム競 喔曕副喔о腑喔编竵喔┼福 喙佮弗喔班競喔掂笖喔ム箞喔侧竾喙�喔椸箞喔侧笝喔编箟喔�',
+    description: '喔勦赋喔笜喔脆笟喔侧涪',
+    descriptionPlaceholder: '喔勦箥喔侧腑喔樴复喔氞覆喔⑧釜喔编箟喔� 喙� 喙�喔佮傅喙堗涪喔о竵喔编笟喔о副喔曕笘喔膏笡喔`赴喔竾喔勦箤喔傕腑喔囙箑喔勦福喔粪箞喔竾喔∴阜喔� 喙�喔娻箞喔� 喔`副喔氞腑喔膏笓喔笭喔灌浮喔脆釜喙嵿覆喔福喔编笟喔曕箥喔侧箒喔笝喙堗竾喙�喔夃笧喔侧赴',
+    schema: '喙佮笢喔權竵喔侧福',
+    schemaPlaceHolder: '喔涏箟喔笝喔竸喔掂浮喔� OpenAPI 喔傕腑喔囙竸喔膏笓喔椸傅喙堗笝喔掂箞',
+    viewSchemaSpec: '喔斷腹喔傕箟喔浮喔灌弗喔堗箥喔侧箑喔炧覆喔班競喔竾 OpenAPI-Swagger',
+    importFromUrl: '喔權箥喔侧箑喔傕箟喔侧笀喔侧竵 URL',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: '喙傕笡喔`笖喔涏箟喔笝 URL 喔椸傅喙堗笘喔灌竵喔曕箟喔竾',
+    examples: '喔曕副喔� 喔涪喙堗覆喔� 喙�喔娻箞喔�',
+    exampleOptions: {
+      json: '喔笭喔侧笧喔覆喔佮覆喔�(JSON)',
+      yaml: '喔`箟喔侧笝喔傕覆喔⑧釜喔编笗喔о箤喙�喔ム傅喙夃涪喔� (YAML)',
+      blankTemplate: '喙�喔椸浮喙�喔炧弗喔曕箑喔涏弗喙堗覆',
+    },
+    availableTools: {
+      title: '喙�喔勦福喔粪箞喔竾喔∴阜喔笚喔掂箞喔∴傅',
+      name: '喔娻阜喙堗腑',
+      description: '喔勦赋喔笜喔脆笟喔侧涪',
+      method: '喔о复喔樴傅',
+      path: '喔椸覆喔�',
+      action: '喔佮覆喔`笖喙嵿覆喙�喔權复喔權竵喔侧福',
+      test: '喔椸笖喔腑喔�',
+    },
+    authMethod: {
+      title: '喔о复喔樴傅喔佮覆喔`腑喔權父喔嵿覆喔�',
+      type: '喔娻笝喔脆笖喔佮覆喔`腑喔權父喔嵿覆喔�',
+      keyTooltip: 'Http Header Key 喔勦父喔撪釜喔侧浮喔侧福喔栢笡喔ム箞喔涪喙冟斧喙夃箑喔涏箛喔� "喔佮覆喔`腑喔權父喔嵿覆喔�" 喙勦笖喙夃斧喔侧竵喔勦父喔撪箘喔∴箞喔`腹喙夃抚喙堗覆喔∴副喔權竸喔粪腑喔赴喙勦福喔福喔粪腑喔曕副喙夃竾喔勦箞喔侧箑喔涏箛喔權竸喙堗覆喔椸傅喙堗竵喙嵿覆喔笝喔斷箑喔竾',
+      types: {
+        none: '喙勦浮喙堗浮喔掂箖喔勦福',
+        api_key: '喔勦傅喔⑧箤 API',
+        apiKeyPlaceholder: '喔娻阜喙堗腑喔箞喔о笝喔副喔� HTTP 喔箥喔侧斧喔`副喔氞竸喔掂涪喙� API',
+        apiValuePlaceholder: '喔涏箟喔笝喔勦傅喔⑧箤 API',
+      },
+      key: '喔佮父喔嵿箒喔�',
+      value: '喔勦箞喔�',
+    },
+    authHeaderPrefix: {
+      title: '喔涏福喔班箑喔犩笚喔佮覆喔`福喔编笟喔`腑喔囙竸喔о覆喔∴笘喔灌竵喔曕箟喔竾',
+      types: {
+        basic: '喔炧阜喙夃笝喔愢覆喔�',
+        bearer: '喔溹腹喙夃笘喔粪腑',
+        custom: '喔樴福喔`浮喙�喔權傅喔⑧浮',
+      },
+    },
+    privacyPolicy: '喔權箓喔⑧笟喔侧涪喔勦抚喔侧浮喙�喔涏箛喔權釜喙堗抚喔權笗喔编抚',
+    privacyPolicyPlaceholder: '喔佮福喔膏笓喔侧竵喔`腑喔佮笝喙傕涪喔氞覆喔⑧竸喔о覆喔∴箑喔涏箛喔權釜喙堗抚喔權笗喔编抚',
+    toolInput: {
+      title: '喔复喔權笧喔膏笗喙�喔勦福喔粪箞喔竾喔∴阜喔�',
+      name: '喔娻阜喙堗腑',
+      required: '喔曕箟喔竾喔`赴喔氞父',
+      method: '喔о复喔樴傅',
+      methodSetting: '喔夃覆喔�',
+      methodSettingTip: '喔溹腹喙夃箖喔娻箟喔佮福喔竵喔傕箟喔浮喔灌弗喙冟笝喔佮覆喔`竵喙嵿覆喔笝喔斷竸喙堗覆喙�喔勦福喔粪箞喔竾喔∴阜喔�',
+      methodParameter: '喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤',
+      methodParameterTip: '喔佮覆喔`箑喔曕复喔� LLM 喔`赴喔抚喙堗覆喔囙竵喔侧福喔笝喔膏浮喔侧笝',
+      label: '喙冟笝喔曕腑喔權竵喔ム覆喔囙抚喔编笝',
+      labelPlaceholder: '喙�喔ム阜喔竵喙佮笚喙囙竵 (喙勦浮喙堗笟喔编竾喔勦副喔�)',
+      description: '喔勦赋喔笜喔脆笟喔侧涪',
+      descriptionPlaceholder: '喔勦箥喔侧腑喔樴复喔氞覆喔⑧竸喔о覆喔∴斧喔∴覆喔⑧競喔竾喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤',
+    },
+    customDisclaimer: '喔傕箟喔笀喙嵿覆喔佮副喔斷竸喔о覆喔∴福喔编笟喔溹复喔斷笂喔笟喔椸傅喙堗竵喙嵿覆喔笝喔斷箑喔竾',
+    customDisclaimerPlaceholder: '喙傕笡喔`笖喔涏箟喔笝喔傕箟喔笀喙嵿覆喔佮副喔斷竸喔о覆喔∴福喔编笟喔溹复喔斷笂喔笟喔椸傅喙堗竵喙嵿覆喔笝喔斷箑喔竾',
+    confirmTitle: '喔⑧阜喔權涪喔编笝喔佮覆喔`笟喔编笝喔椸付喔� ?',
+    confirmTip: '喙佮腑喔涏笚喔掂箞喙冟笂喙夃箑喔勦福喔粪箞喔竾喔∴阜喔笝喔掂箟喔堗赴喙勦笖喙夃福喔编笟喔溹弗喔佮福喔班笚喔�',
+    deleteToolConfirmTitle: '喔ム笟喙�喔勦福喔粪箞喔竾喔∴阜喔笝喔掂箟?',
+    deleteToolConfirmContent: '喔佮覆喔`弗喔氞箑喔勦福喔粪箞喔竾喔∴阜喔笝喔编箟喔權箘喔∴箞喔覆喔∴覆喔`笘喔⑧箟喔笝喔佮弗喔编笟喙勦笖喙� 喔溹腹喙夃箖喔娻箟喔堗赴喙勦浮喙堗釜喔侧浮喔侧福喔栢箑喔傕箟喔侧笘喔多竾喙�喔勦福喔粪箞喔竾喔∴阜喔競喔竾喔勦父喔撪箘喔斷箟喔傅喔佮笗喙堗腑喙勦笡',
+  },
+  test: {
+    title: '喔椸笖喔腑喔�',
+    parametersValue: '喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤喙佮弗喔班竸喙堗覆',
+    parameters: '喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤',
+    value: '喔勦箞喔�',
+    testResult: '喔溹弗喔佮覆喔`笚喔斷釜喔笟',
+    testResultPlaceholder: '喔溹弗喔佮覆喔`笚喔斷釜喔笟喔堗赴喙佮釜喔斷竾喔椸傅喙堗笝喔掂箞',
+  },
+  thought: {
+    using: '喙冟笂喙�',
+    used: '喙冟笂喙夃箒喔ム箟喔�',
+    requestTitle: '喔傕腑喔`箟喔竾',
+    responseTitle: '喔佮覆喔`笗喔笟喔笝喔竾',
+  },
+  setBuiltInTools: {
+    info: '喔傕箟喔浮喔灌弗',
+    setting: '喔夃覆喔�',
+    toolDescription: '喔勦箥喔侧腑喔樴复喔氞覆喔⑧箑喔勦福喔粪箞喔竾喔∴阜喔�',
+    parameters: '喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤',
+    string: '喙�喔娻阜喔竵',
+    number: '喙�喔ム競',
+    required: '喔曕箟喔竾喔`赴喔氞父',
+    infoAndSetting: '喔傕箟喔浮喔灌弗喙佮弗喔班竵喔侧福喔曕副喙夃竾喔勦箞喔�',
+    file: '喙佮笩喙夃浮',
+  },
+  noCustomTool: {
+    title: '喙勦浮喙堗浮喔掂箑喔勦福喔粪箞喔竾喔∴阜喔笚喔掂箞喔佮箥喔侧斧喔權笖喙�喔竾!',
+    content: '喙�喔炧复喙堗浮喙佮弗喔班笀喔编笖喔佮覆喔`箑喔勦福喔粪箞喔竾喔∴阜喔笚喔掂箞喔佮箥喔侧斧喔權笖喙�喔竾喔傕腑喔囙竸喔膏笓喔椸傅喙堗笝喔掂箞喔箥喔侧斧喔`副喔氞竵喔侧福喔福喙夃覆喔囙箒喔笡 AI',
+    createTool: '喔福喙夃覆喔囙箑喔勦福喔粪箞喔竾喔∴阜喔�',
+  },
+  noSearchRes: {
+    title: '喔傕腑喔笭喔编涪 喙勦浮喙堗浮喔掂笢喔ム弗喔编笧喔樴箤!',
+    content: '喙�喔`覆喙勦浮喙堗笧喔氞箑喔勦福喔粪箞喔竾喔∴阜喔笚喔掂箞喔曕福喔囙竵喔编笟喔佮覆喔`竸喙夃笝喔覆喔傕腑喔囙竸喔膏笓',
+    reset: '喔`傅喙�喔嬥箛喔曕竵喔侧福喔勦箟喔權斧喔�',
+  },
+  builtInPromptTitle: '喔炧福喙夃腑喔∴笚喙�',
+  toolRemoved: '喙�喔勦福喔粪箞喔竾喔∴阜喔笘喔灌竵喔ム笟喔腑喔�',
+  notAuthorized: '喙�喔勦福喔粪箞喔竾喔∴阜喔箘喔∴箞喙勦笖喙夃福喔编笟喔笝喔膏笉喔侧笗',
+  howToGet: '喔о复喔樴傅喔`副喔�',
+  openInStudio: '喙�喔涏复喔斷箖喔權釜喔曕腹喔斷复喙傕腑',
+  toolNameUsageTip: '喔娻阜喙堗腑喔佮覆喔`箑喔`傅喔⑧竵喙�喔勦福喔粪箞喔竾喔∴阜喔釜喙嵿覆喔福喔编笟喔佮覆喔`箖喔娻箟喙�喔笗喔膏笢喔ム箒喔ム赴喔佮覆喔`箒喔堗箟喔囙箑喔曕阜喔笝喔傕腑喔囙笗喔编抚喙佮笚喔�',
+  noTools: '喙勦浮喙堗笧喔氞箑喔勦福喔粪箞喔竾喔∴阜喔�',
+  copyToolName: '喔勦副喔斷弗喔竵喔娻阜喙堗腑',
+}
+
+export default translation
diff --git a/i18n/th-TH/workflow.ts b/i18n/th-TH/workflow.ts
new file mode 100644
index 0000000..6b91a03
--- /dev/null
+++ b/i18n/th-TH/workflow.ts
@@ -0,0 +1,920 @@
+const translation = {
+  common: {
+    undo: '喙佮竵喙�',
+    redo: '喔炧福喙夃腑喔�',
+    editing: '喙佮竵喙夃箘喔�',
+    autoSaved: '喔氞副喔權笚喔多竵喔副喔曕箓喔權浮喔编笗喔�',
+    unpublished: '喙勦浮喙堗箘喔斷箟喙�喔溹涪喙佮笧喔`箞',
+    published: '喙�喔溹涪 喙佮笧喔`箞',
+    publish: '喔曕傅喔炧复喔∴笧喙�',
+    update: '喔副喔炧箑喔斷笗',
+    run: '喔о复喙堗竾',
+    running: '喔佮赋喔ム副喔� 喙�喔`傅喔⑧竵 喙冟笂喙�',
+    inRunMode: '喙冟笝喙傕斧喔∴笖喙�喔`傅喔⑧竵喙冟笂喙�',
+    inPreview: '喙冟笝喔佮覆喔`箒喔笖喔囙笗喔编抚喔涪喙堗覆喔�',
+    inPreviewMode: '喙冟笝喙傕斧喔∴笖喙佮釜喔斷竾喔曕副喔о腑喔⑧箞喔侧竾',
+    preview: '喔斷腹喔曕副喔о腑喔⑧箞喔侧竾',
+    viewRunHistory: '喔斷腹喔涏福喔班抚喔编笗喔脆竵喔侧福喔о复喙堗竾',
+    runHistory: '喔涏福喔班抚喔编笗喔脆竵喔侧福喔о复喙堗竾',
+    goBackToEdit: '喔佮弗喔编笟喙勦笡喔椸傅喙堗笗喔编抚喙佮竵喙夃箘喔�',
+    conversationLog: '喔氞副喔權笚喔多竵喔佮覆喔`釜喔權笚喔權覆',
+    features: '喔笝喙夃覆喔曕覆',
+    featuresDescription: '喔涏福喔编笟喔涏福喔膏竾喔涏福喔班釜喔氞竵喔侧福喔撪箤喔溹腹喙夃箖喔娻箟喙�喔о箛喔氞箒喔笡',
+    ImageUploadLegacyTip: '喔曕腑喔權笝喔掂箟喔勦父喔撪釜喔侧浮喔侧福喔栢釜喔`箟喔侧竾喔曕副喔о箒喔涏福喔娻笝喔脆笖喙勦笩喔ム箤喙冟笝喔熰腑喔`箤喔∴箑喔`复喙堗浮喔曕箟喔權箘喔斷箟喙佮弗喙夃抚 喙�喔`覆喔堗赴喙勦浮喙堗福喔竾喔`副喔氞笩喔掂箑喔堗腑喔`箤喔佮覆喔`腑喔编笡喙傕斧喔ム笖喔`腹喔涏笭喔侧笧喔傅喔佮笗喙堗腑喙勦笡喙冟笝喔笝喔侧竸喔�',
+    fileUploadTip: '喔熰傅喙�喔堗腑喔`箤喔佮覆喔`腑喔编笡喙傕斧喔ム笖喔`腹喔涏笭喔侧笧喙勦笖喙夃福喔编笟喔佮覆喔`腑喔编笡喙�喔佮福喔斷箑喔涏箛喔權竵喔侧福喔副喔涏箓喔弗喔斷箘喔熰弗喙�',
+    featuresDocLink: '喔ㄠ付喔佮俯喔侧箑喔炧复喙堗浮喙�喔曕复喔�',
+    debugAndPreview: '喔斷腹喔曕副喔о腑喔⑧箞喔侧竾',
+    restart: '喙�喔`复喙堗浮喙冟斧喔∴箞',
+    currentDraft: '喔`箞喔侧竾喔涏副喔堗笀喔膏笟喔编笝',
+    currentDraftUnpublished: '喔`箞喔侧竾喔涏副喔堗笀喔膏笟喔编笝喔椸傅喙堗箘喔∴箞喙勦笖喙夃箑喔溹涪喙佮笧喔`箞',
+    latestPublished: '喙�喔溹涪喙佮笧喔`箞喔ム箞喔侧釜喔膏笖',
+    publishedAt: '喙�喔溹涪 喙佮笧喔`箞',
+    restore: '喔嬥箞喔浮喙佮笅喔�',
+    runApp: '喙�喔`傅喔⑧竵喙冟笂喙夃箒喔笧',
+    batchRunApp: '喙佮腑喔� Batch Run',
+    accessAPIReference: '喔佮覆喔`腑喙夃覆喔囙腑喔脆竾 API 喔佮覆喔`箑喔傕箟喔侧笘喔多竾',
+    embedIntoSite: '喔澿副喔囙弗喔囙箖喔權箘喔嬥笗喙�',
+    addTitle: '喙�喔炧复喙堗浮喔娻阜喙堗腑喙�喔`阜喙堗腑喔�...',
+    addDescription: '喙�喔炧复喙堗浮喔勦箥喔侧腑喔樴复喔氞覆喔�...',
+    noVar: '喙勦浮喙堗浮喔掂笗喔编抚喙佮笡喔�',
+    searchVar: '喔曕副喔о箒喔涏福喔佮覆喔`竸喙夃笝喔覆',
+    variableNamePlaceholder: '喔娻阜喙堗腑喔曕副喔о箒喔涏福',
+    setVarValuePlaceholder: '喔曕副喙夃竾喔勦箞喔侧笗喔编抚喙佮笡喔�',
+    needConnectTip: '喔傕副喙夃笝喔曕腑喔權笝喔掂箟喙勦浮喙堗箘喔斷箟喙�喔娻阜喙堗腑喔∴笗喙堗腑喔佮副喔氞釜喔脆箞喔囙箖喔�',
+    maxTreeDepth: '喔傕傅喔斷笀喙嵿覆喔佮副喔斷釜喔灌竾喔父喔斷競喔竾 {{depth}} 喙傕斧喔權笖喔曕箞喔釜喔侧競喔�',
+    needEndNode: '喔曕箟喔竾喙�喔炧复喙堗浮喔氞弗喙囙腑喔� End',
+    needAnswerNode: '喔曕箟喔竾喙�喔炧复喙堗浮喔氞弗喙囙腑喔佮竸喙嵿覆喔曕腑喔�',
+    workflowProcess: '喔佮福喔班笟喔о笝喔佮覆喔`箑喔о复喔`箤喔佮箓喔熰弗喔о箤',
+    notRunning: '喔⑧副喔囙箘喔∴箞喙勦笖喙夃笚喙嵿覆喔囙覆喔�',
+    previewPlaceholder: '喔涏箟喔笝喙�喔權阜喙夃腑喔覆喙冟笝喔娻箞喔竾喔斷箟喔侧笝喔ム箞喔侧竾喙�喔炧阜喙堗腑喙�喔`复喙堗浮喙佮竵喙夃箘喔傕競喙夃腑喔氞竵喔炧福喙堗腑喔囙競喔竾喙佮笂喔椸笟喔笚',
+    effectVarConfirm: {
+      title: '喔ム笟喔曕副喔о箒喔涏福',
+      content: '喔曕副喔о箒喔涏福喔權傅喙夃箖喔娻箟喙冟笝喙傕斧喔權笖喔阜喙堗笝 喔勦父喔撪涪喔编竾喔曕箟喔竾喔佮覆喔`弗喔氞腑喔竵喔福喔粪腑喙勦浮喙�?',
+    },
+    insertVarTip: '喔佮笖喔涏父喙堗浮 \'/\' 喙�喔炧阜喙堗腑喙佮笚喔`竵喔涪喙堗覆喔囙福喔о笖喙�喔`箛喔�',
+    processData: '喔涏福喔班浮喔о弗喔溹弗喔傕箟喔浮喔灌弗',
+    input: '喔复喔權笧喔膏笗',
+    output: '喔溹弗喔脆笗喔犩副喔撪笐喙�',
+    jinjaEditorPlaceholder: '喔炧复喔∴笧喙� \'/\' 喔福喔粪腑 \'{\' 喙�喔炧阜喙堗腑喙佮笚喔`竵喔曕副喔о箒喔涏福',
+    viewOnly: '喔斷腹喙�喔椸箞喔侧笝喔编箟喔�',
+    showRunHistory: '喙佮釜喔斷竾喔涏福喔班抚喔编笗喔脆竵喔侧福喔о复喙堗竾',
+    enableJinja: '喙�喔涏复喔斷箖喔娻箟喔囙覆喔權竵喔侧福喔笝喔编笟喔笝喔膏笝喙�喔椸浮喙�喔炧弗喔� Jinja',
+    learnMore: '喔ㄠ付喔佮俯喔侧箑喔炧复喙堗浮喙�喔曕复喔�',
+    copy: '喔ム腑喔�',
+    duplicate: '喔赋喙�喔權覆',
+    addBlock: '喙�喔炧复喙堗浮喔氞弗喙囙腑喔�',
+    pasteHere: '喔о覆喔囙笚喔掂箞喔權傅喙�',
+    pointerMode: '喙傕斧喔∴笖喔曕副喔о笂喔掂箟',
+    handMode: '喙傕斧喔∴笖喔∴阜喔�',
+    model: '喙佮笟喔�',
+    workflowAsTool: '喙�喔о复喔`箤喔佮箓喔熰弗喔о箤喙�喔涏箛喔權箑喔勦福喔粪箞喔竾喔∴阜喔�',
+    configureRequired: '喔佮箥喔侧斧喔權笖喔勦箞喔侧笚喔掂箞喔堗箥喔侧箑喔涏箛喔�',
+    configure: '喔佮箥喔侧斧喔權笖喔勦箞喔�',
+    manageInTools: '喔堗副喔斷竵喔侧福喙冟笝喙�喔勦福喔粪箞喔竾喔∴阜喔�',
+    workflowAsToolTip: '喔堗箥喔侧箑喔涏箛喔權笗喙夃腑喔囙浮喔掂竵喔侧福喔佮箥喔侧斧喔權笖喔勦箞喔侧箑喔勦福喔粪箞喔竾喔∴阜喔箖喔浮喙堗斧喔ム副喔囙笀喔侧竵喔佮覆喔`腑喔编笡喙�喔斷笗喙�喔о复喔`箤喔佮箓喔熰弗喔о箤',
+    viewDetailInTracingPanel: '喔斷腹喔`覆喔⑧弗喔班箑喔傅喔⑧笖',
+    syncingData: '喔嬥复喔囙竸喙屶競喙夃腑喔∴腹喔ム箑喔炧傅喔⑧竾喙勦浮喙堗竵喔掂箞喔о复喔權覆喔椸傅',
+    importDSL: '喔權箥喔侧箑喔傕箟喔� DSL',
+    importDSLTip: '喔`箞喔侧竾喔涏副喔堗笀喔膏笟喔编笝喔堗赴喔栢腹喔佮箑喔傕傅喔⑧笝喔椸副喔歕n喔箞喔囙腑喔竵喙�喔о复喔`箤喔佮箓喔熰弗喔о箤喙�喔涏箛喔權競喙夃腑喔∴腹喔ム釜喙嵿覆喔`腑喔囙竵喙堗腑喔權笝喙嵿覆喙�喔傕箟喔�',
+    backupCurrentDraft: '喔箥喔侧福喔竾喔`箞喔侧竾喔涏副喔堗笀喔膏笟喔编笝',
+    chooseDSL: '喙�喔ム阜喔竵喙勦笩喔ム箤 DSL',
+    overwriteAndImport: '喙�喔傕傅喔⑧笝喔椸副喔氞箒喔ム赴喔權箥喔侧箑喔傕箟喔�',
+    importFailure: '喔權箥喔侧箑喔傕箟喔侧弗喙夃浮喙�喔弗喔�',
+    importWarning: '喔勦抚喔侧浮喔`赴喔∴副喔斷福喔班抚喔编竾',
+    importWarningDetails: '喔勦抚喔侧浮喙佮笗喔佮笗喙堗覆喔囙競喔竾喙�喔о腑喔`箤喔娻副喔� DSL 喔覆喔堗釜喙堗竾喔溹弗喔曕箞喔竸喔膏笓喔浮喔氞副喔曕复喔氞覆喔囙腑喔⑧箞喔侧竾',
+    importSuccess: '喔權箥喔侧箑喔傕箟喔侧釜喙嵿覆喙�喔`箛喔�',
+    parallelRun: '喔о复喙堗竾喙佮笟喔氞競喔權覆喔�',
+    parallelTip: {
+      click: {
+        title: '喔勦弗喔脆竵',
+        desc: '喙�喔炧阜喙堗腑喙�喔炧复喙堗浮',
+      },
+      drag: {
+        title: '喔ム覆喔�',
+        desc: '喙�喔炧阜喙堗腑喙�喔娻阜喙堗腑喔∴笗喙堗腑',
+      },
+      limit: '喔勦抚喔侧浮喔傕笝喔侧笝喔栢腹喔佮笀喙嵿覆喔佮副喔斷箘喔о箟喔椸傅喙� {{num}} 喔覆喔傕覆',
+      depthLimit: '喔傕傅喔斷笀喙嵿覆喔佮副喔斷箑喔ム箑喔⑧腑喔`箤喔嬥箟喔笝喙佮笟喔氞競喔權覆喔權競喔竾 {{num}} 喙�喔ム箑喔⑧腑喔`箤',
+    },
+    disconnect: '喔⑧竵 喙�喔ム复喔�',
+    jumpToNode: '喔傕箟喔侧浮喙勦笡喔⑧副喔囙箓喔笝喔斷笝喔掂箟',
+    addParallelNode: '喙�喔炧复喙堗浮喙傕斧喔權笖喔傕笝喔侧笝',
+    parallel: '喔傕笝喔侧笝',
+    branch: '喔佮复喙堗竾',
+    openInExplore: '喙�喔涏复喔斷箖喔� Explore',
+    onFailure: '喙�喔∴阜喙堗腑喔ム箟喔∴箑喔弗喔�',
+    addFailureBranch: '喙�喔炧复喙堗浮喔覆喔傕覆 Fail',
+    loadMore: '喙傕斧喔ム笖喙�喔о复喔`箤喔佮箓喔熰弗喔о箤喙�喔炧复喙堗浮喙�喔曕复喔�',
+    noHistory: '喙勦浮喙堗浮喔掂笡喔`赴喔о副喔曕复',
+    versionHistory: '喔涏福喔班抚喔编笗喔脆福喔膏箞喔�',
+    exportPNG: '喔箞喔囙腑喔竵喙�喔涏箛喔� PNG',
+    noExist: '喙勦浮喙堗浮喔掂笗喔编抚喙佮笡喔`笖喔编竾喔佮弗喙堗覆喔�',
+    exportJPEG: '喔箞喔囙腑喔竵喙�喔涏箛喔� JPEG',
+    referenceVar: '喔曕副喔о箒喔涏福喔箟喔侧竾喔复喔�',
+    publishUpdate: '喙�喔溹涪喙佮笧喔`箞喔佮覆喔`腑喔编笡喙�喔斷笗',
+    exitVersions: '喔腑喔佮箑喔о腑喔`箤喔娻副喔�',
+    exportImage: '喔箞喔囙腑喔竵喔犩覆喔�',
+    exportSVG: '喔箞喔囙腑喔竵喙�喔涏箛喔� SVG',
+  },
+  env: {
+    envPanelTitle: '喔曕副喔о箒喔涏福喔笭喔侧笧喙佮抚喔斷弗喙夃腑喔�',
+    envDescription: '喔曕副喔о箒喔涏福喔笭喔侧笧喙佮抚喔斷弗喙夃腑喔∴釜喔侧浮喔侧福喔栢箖喔娻箟喙�喔炧阜喙堗腑喔堗副喔斷箑喔佮箛喔氞競喙夃腑喔∴腹喔ム釜喙堗抚喔權笗喔编抚喙佮弗喔班競喙夃腑喔∴腹喔ム笡喔`赴喔堗箥喔侧笗喔编抚喙勦笖喙� 喙�喔涏箛喔權箒喔氞笟喔箞喔侧笝喔涪喙堗覆喔囙箑喔斷傅喔⑧抚喙佮弗喔班釜喔侧浮喔侧福喔栢箒喔⑧竵喔腑喔佮笀喔侧竵喙勦笩喔ム箤 DSL 喔`赴喔抚喙堗覆喔囙竵喔侧福喔箞喔囙腑喔竵',
+    envPanelButton: '喙�喔炧复喙堗浮喔曕副喔о箒喔涏福',
+    modal: {
+      title: '喙�喔炧复喙堗浮喔曕副喔о箒喔涏福喔笭喔侧笧喙佮抚喔斷弗喙夃腑喔�',
+      editTitle: '喙佮竵喙夃箘喔傕笗喔编抚喙佮笡喔`釜喔犩覆喔炧箒喔о笖喔ム箟喔浮',
+      type: '喔涏福喔班箑喔犩笚',
+      name: '喔娻阜喙堗腑',
+      namePlaceholder: '喔娻阜喙堗腑 env',
+      value: '喔勦箞喔�',
+      valuePlaceholder: '喔勦箞喔� env',
+      secretTip: '喙冟笂喙夃箑喔炧阜喙堗腑喔佮箥喔侧斧喔權笖喔傕箟喔浮喔灌弗喔福喔粪腑喔傕箟喔浮喔灌弗喔椸傅喙堗弗喔班箑喔傅喔⑧笖喔箞喔笝 喙傕笖喔⑧浮喔掂竵喔侧福喔曕副喙夃竾喔勦箞喔� DSL 喔椸傅喙堗竵喙嵿覆喔笝喔斷竸喙堗覆喙勦抚喙夃箑喔炧阜喙堗腑喔涏箟喔竾喔佮副喔權竵喔侧福喔`副喙堗抚喙勦斧喔�',
+    },
+    export: {
+      title: '喔箞喔囙腑喔竵喔曕副喔о箒喔涏福喔笭喔侧笧喙佮抚喔斷弗喙夃腑喔� Secret 喔福喔粪腑喙勦浮喙�',
+      checkbox: '喔箞喔囙腑喔竵喔勦箞喔侧競喙夃腑喔∴腹喔ム弗喔编笟',
+      ignore: '喔箞喔囙腑喔竵 DSL',
+      export: '喔箞喔囙腑喔竵 DSL 喔斷箟喔о涪喔勦箞喔侧弗喔编笟',
+    },
+  },
+  chatVariable: {
+    panelTitle: '喔曕副喔о箒喔涏福喔佮覆喔`釜喔權笚喔權覆',
+    panelDescription: '喔曕副喔о箒喔涏福喔佮覆喔`釜喔權笚喔權覆喙冟笂喙夃箑喔炧阜喙堗腑喔堗副喔斷箑喔佮箛喔氞競喙夃腑喔∴腹喔ム箒喔氞笟喙傕笗喙夃笗喔笟喔椸傅喙� LLM 喔堗箥喔侧箑喔涏箛喔權笗喙夃腑喔囙笀喔斷笀喙嵿覆 喔`抚喔∴笘喔多竾喔涏福喔班抚喔编笗喔脆竵喔侧福喔笝喔椸笝喔� 喙勦笩喔ム箤喔椸傅喙堗腑喔编笡喙傕斧喔ム笖 喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔傕腑喔囙笢喔灌箟喙冟笂喙� 喔炧抚喔佮箑喔傕覆喔箞喔侧笝-喙�喔傕傅喔⑧笝',
+    docLink: '喙�喔⑧傅喙堗涪喔∴笂喔∴箑喔竵喔覆喔`競喔竾喙�喔`覆喙�喔炧阜喙堗腑喙�喔`傅喔⑧笝喔`腹喙夃箑喔炧复喙堗浮喙�喔曕复喔�',
+    button: '喙�喔炧复喙堗浮喔曕副喔о箒喔涏福',
+    modal: {
+      title: '喙�喔炧复喙堗浮喔曕副喔о箒喔涏福喔佮覆喔`釜喔權笚喔權覆',
+      editTitle: '喙佮竵喙夃箘喔傕笗喔编抚喙佮笡喔`竵喔侧福喔笝喔椸笝喔�',
+      name: '喔娻阜喙堗腑',
+      namePlaceholder: '喔娻阜喙堗腑喔曕副喔о箒喔涏福',
+      type: '喔涏福喔班箑喔犩笚',
+      value: '喔勦箞喔侧箑喔`复喙堗浮喔曕箟喔�',
+      valuePlaceholder: '喔勦箞喔侧箑喔`复喙堗浮喔曕箟喔� 喙�喔о箟喔權抚喙堗覆喔囙箘喔о箟喙�喔炧阜喙堗腑喙勦浮喙堗箖喔箟喔曕副喙夃竾喔勦箞喔�',
+      description: '喔勦赋喔笜喔脆笟喔侧涪',
+      descriptionPlaceholder: '喔笜喔脆笟喔侧涪喔曕副喔о箒喔涏福',
+      editInJSON: '喙佮竵喙夃箘喔傕箖喔� JSON',
+      oneByOne: '喙�喔炧复喙堗浮喔椸傅喔ム赴喔`覆喔⑧竵喔侧福',
+      editInForm: '喙佮竵喙夃箘喔傕箖喔權箒喔氞笟喔熰腑喔`箤喔�',
+      arrayValue: '喔勦箞喔�',
+      addArrayValue: '喙�喔炧复喙堗浮喔∴腹喔ム竸喙堗覆',
+      objectKey: '喔佮父喔嵿箒喔�',
+      objectType: '喔涏福喔班箑喔犩笚',
+      objectValue: '喔勦箞喔侧箑喔`复喙堗浮喔曕箟喔�',
+    },
+    storedContent: '喙�喔權阜喙夃腑喔覆喔椸傅喙堗箑喔佮箛喔氞箘喔о箟',
+    updatedAt: '喔副喔炧箑喔斷笚喙�喔∴阜喙堗腑',
+  },
+  changeHistory: {
+    title: '喔涏福喔班抚喔编笗喔脆竵喔侧福喙�喔涏弗喔掂箞喔⑧笝喙佮笡喔ム竾',
+    placeholder: '喔勦父喔撪涪喔编竾喙勦浮喙堗箘喔斷箟喙�喔涏弗喔掂箞喔⑧笝喙佮笡喔ム竾喔赴喙勦福喙�喔ム涪',
+    clearHistory: '喔ム箟喔侧竾喔涏福喔班抚喔编笗喔�',
+    hint: '喔勦笝喔复喔權箑喔斷傅喔�',
+    hintText: '喔佮覆喔`笖喙嵿覆喙�喔權复喔權竵喔侧福喙佮竵喙夃箘喔傕競喔竾喔勦父喔撪笀喔班笘喔灌竵喔曕复喔斷笗喔侧浮喙冟笝喔涏福喔班抚喔编笗喔脆竵喔侧福喙�喔涏弗喔掂箞喔⑧笝喙佮笡喔ム竾 喔嬥付喙堗竾喔堗赴喔栢腹喔佮笀喔编笖喙�喔佮箛喔氞箘喔о箟喙冟笝喔父喔涏竵喔`笓喙屶競喔竾喔勦父喔撪笗喔ム腑喔斷福喔班涪喔班箑喔о弗喔侧競喔竾喙�喔嬥釜喔娻副喔權笝喔掂箟 喔涏福喔班抚喔编笗喔脆笝喔掂箟喔堗赴喔栢腹喔佮弗喙夃覆喔囙箑喔∴阜喙堗腑喔勦父喔撪腑喔竵喔堗覆喔佮笗喔编抚喙佮竵喙夃箘喔�',
+    stepBackward_one: '{{count}} 喔栢腑喔⑧斧喔ム副喔�',
+    stepBackward_other: '{{count}} 喔栢腑喔⑧斧喔ム副喔�',
+    stepForward_one: '{{count}} 喔佮箟喔侧抚喙勦笡喔傕箟喔侧竾喔笝喙夃覆',
+    stepForward_other: '{{count}} 喔佮箟喔侧抚喙勦笡喔傕箟喔侧竾喔笝喙夃覆',
+    sessionStart: '喙�喔`复喙堗浮喙�喔嬥釜喔娻副喔�',
+    currentState: '喔笘喔侧笝喔班笡喔编笀喔堗父喔氞副喔�',
+    nodeTitleChange: '喙�喔涏弗喔掂箞喔⑧笝喔娻阜喙堗腑喔氞弗喙囙腑喔�',
+    nodeDescriptionChange: '喔勦箥喔侧腑喔樴复喔氞覆喔⑧笟喔ム箛喔竵喙�喔涏弗喔掂箞喔⑧笝喙勦笡',
+    nodeDragStop: '喔氞弗喙囙腑喔佮涪喙夃覆喔�',
+    nodeChange: '喔氞弗喙囙腑喔佮箑喔涏弗喔掂箞喔⑧笝喙勦笡',
+    nodeConnect: '喔氞弗喙囙腑喔佮箑喔娻阜喙堗腑喔∴笗喙堗腑',
+    nodePaste: '喔氞弗喙囙腑喔佮抚喔侧竾',
+    nodeDelete: '喔氞弗喙囙腑喔佮弗喔�',
+    nodeAdd: '喙�喔炧复喙堗浮喔氞弗喙囙腑喔�',
+    nodeResize: '喔氞弗喙囙腑喔佮笡喔`副喔氞競喔權覆喔�',
+    noteAdd: '喙�喔炧复喙堗浮喔浮喔侧涪喙�喔笗喔�',
+    noteChange: '喙�喔涏弗喔掂箞喔⑧笝喔浮喔侧涪喙�喔笗喔�',
+    noteDelete: '喔ム笟喙傕笝喙夃笗',
+    edgeDelete: '喔氞弗喙囙腑喔佮笗喔编笖喔佮覆喔`箑喔娻阜喙堗腑喔∴笗喙堗腑',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 喙�喔涏箛喔權釜喔脆箞喔囙笀喙嵿覆喙�喔涏箛喔�',
+    rerankModelRequired: '喔佮箞喔笝喙�喔涏复喔� Rerank Model 喙傕笡喔`笖喔⑧阜喔權涪喔编笝喔о箞喔侧箘喔斷箟喔佮箥喔侧斧喔權笖喔勦箞喔侧箓喔∴箑喔斷弗喔箥喔侧箑喔`箛喔堗箖喔權竵喔侧福喔曕副喙夃竾喔勦箞喔�',
+    authRequired: '喔曕箟喔竾喙勦笖喙夃福喔编笟喔笝喔膏笉喔侧笗',
+    invalidJson: '{{field}} 喙�喔涏箛喔� JSON 喙勦浮喙堗笘喔灌竵喔曕箟喔竾',
+    fields: {
+      variable: '喔娻阜喙堗腑喔曕副喔о箒喔涏福',
+      variableValue: '喔勦箞喔侧笗喔编抚喙佮笡喔�',
+      code: '喔`斧喔编釜',
+      model: '喙佮笟喔�',
+      rerankModel: '喔堗副喔斷腑喔编笝喔斷副喔氞箓喔∴箑喔斷弗喙冟斧喔∴箞',
+      visionVariable: '喔曕副喔о箒喔涏福喔о复喔副喔⑧笚喔编辅喔權箤',
+    },
+    invalidVariable: '喔曕副喔о箒喔涏福喙勦浮喙堗笘喔灌竵喔曕箟喔竾',
+    noValidTool: '{{field}} 喙勦浮喙堗箘喔斷箟喙�喔ム阜喔竵喙�喔勦福喔粪箞喔竾喔∴阜喔笚喔掂箞喔栢腹喔佮笗喙夃腑喔�',
+    toolParameterRequired: '{{field}}: 喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤 [{{param}}] 喙�喔涏箛喔權釜喔脆箞喔囙笀喙嵿覆喙�喔涏箛喔�',
+  },
+  singleRun: {
+    testRun: '喔椸笖喔腑喔氞竵喔侧福喔椸箥喔侧竾喔侧笝',
+    startRun: '喙�喔`复喙堗浮喔о复喙堗竾',
+    running: '喔佮赋喔ム副喔� 喙�喔`傅喔⑧竵 喙冟笂喙�',
+    testRunIteration: '喔佮覆喔`笚喔斷釜喔笟喔佮覆喔`笚喙嵿覆喔嬥箟喙嵿覆',
+    back: '喔⑧箟喔笝喔佮弗喔编笟',
+    iteration: '喙�喔佮复喔� 喔嬥箟喔�',
+    loop: '喔ム腹喔�',
+  },
+  tabs: {
+    'searchBlock': '喔氞弗喙囙腑喔佮竵喔侧福喔勦箟喔權斧喔�',
+    'blocks': '喔氞弗喙囙腑喔�',
+    'searchTool': '喙�喔勦福喔粪箞喔竾喔∴阜喔竸喙夃笝喔覆',
+    'tools': '喙�喔勦福喔粪箞喔竾 喔∴阜喔�',
+    'allTool': '喔椸副喙夃竾喔浮喔�',
+    'builtInTool': '喙冟笝喔曕副喔�',
+    'customTool': '喔樴福喔`浮喙�喔權傅喔⑧浮',
+    'workflowTool': '喙�喔о复喔`箤喔佮箓喔熰弗喔о箤',
+    'question-understand': '喔勦箥喔侧笘喔侧浮: 喙�喔傕箟喔侧箖喔�',
+    'logic': '喔曕福喔`竵喔о复喔椸涪喔�',
+    'transform': '喙佮笡喔ム竾',
+    'utilities': '喔覆喔樴覆喔`笓喔灌笡喙傕笭喔�',
+    'noResult': '喙勦浮喙堗笧喔氞竵喔侧福喔堗副喔氞竸喔灌箞',
+    'agent': '喔佮弗喔⑧父喔椸笜喙屶笗喔编抚喙佮笚喔�',
+    'plugin': '喔涏弗喔编箠喔佮腑喔脆笝',
+  },
+  blocks: {
+    'start': '喙�喔`复喙堗浮',
+    'end': '喔涏弗喔侧涪',
+    'answer': '喔曕腑喔�',
+    'llm': '喔權复喔曕复喔ㄠ覆喔笗喔`覆喔堗覆喔`涪喙�',
+    'knowledge-retrieval': '喔佮覆喔`笖喔多竾喔勦抚喔侧浮喔`腹喙�',
+    'question-classifier': '喔曕副喔о笀喙嵿覆喙佮笝喔佮竸喙嵿覆喔栢覆喔�',
+    'if-else': '喔栢箟喔�/喔阜喙堗笝',
+    'code': '喔`斧喔编釜',
+    'template-transform': '喙佮浮喙� 喙佮笟喔�',
+    'http-request': '喔勦箥喔侧競喔� HTTP',
+    'variable-assigner': '喔曕副喔о福喔о笟喔`抚喔∴笗喔编抚喙佮笡喔�',
+    'variable-aggregator': '喔曕副喔о福喔о笟喔`抚喔∴笗喔编抚喙佮笡喔�',
+    'assigner': '喔曕副喔о竵喙嵿覆喔笝喔斷笗喔编抚喙佮笡喔�',
+    'iteration-start': '喙�喔`复喙堗浮喔佮覆喔`笚喙嵿覆喔嬥箟喙嵿覆',
+    'iteration': '喙�喔佮复喔� 喔嬥箟喔�',
+    'parameter-extractor': '喔曕副喔о箒喔⑧竵喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤',
+    'document-extractor': '喔曕副喔о箒喔⑧竵喙�喔竵喔覆喔�',
+    'list-operator': '喔曕副喔о笖喙嵿覆喙�喔權复喔權竵喔侧福喔`覆喔⑧竵喔侧福',
+    'agent': '喔曕副喔о箒喔椸笝',
+    'loop': '喔ム腹喔�',
+    'loop-start': '喙�喔`复喙堗浮喔ム腹喔�',
+    'loop-end': '喔腑喔佮笀喔侧竵喔ム腹喔�',
+  },
+  blocksAbout: {
+    'start': '喔佮箥喔侧斧喔權笖喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤喙�喔`复喙堗浮喔曕箟喔權釜喙嵿覆喔福喔编笟喔佮覆喔`箑喔涏复喔斷箖喔娻箟喙�喔о复喔`箤喔佮箓喔熰弗喔о箤',
+    'end': '喔佮箥喔侧斧喔權笖喔娻笝喔脆笖喔复喙夃笝喔父喔斷箒喔ム赴喔溹弗喔ム副喔炧笜喙屶競喔竾喙�喔о复喔`箤喔佮箓喔熰弗喔о箤',
+    'answer': '喔佮箥喔侧斧喔權笖喙�喔權阜喙夃腑喔覆喔佮覆喔`笗喔笟喔佮弗喔编笟喔傕腑喔囙竵喔侧福喔笝喔椸笝喔侧箒喔娻笚',
+    'llm': '喔佮覆喔`箑喔`傅喔⑧竵喙冟笂喙夃箓喔∴箑喔斷弗喔犩覆喔┼覆喔傕笝喔侧笖喙冟斧喔嵿箞喙�喔炧阜喙堗腑喔曕腑喔氞竸喙嵿覆喔栢覆喔∴斧喔`阜喔笡喔`赴喔∴抚喔ム笢喔ム笭喔侧俯喔侧笜喔`福喔∴笂喔侧笗喔�',
+    'knowledge-retrieval': '喔娻箞喔о涪喙冟斧喙夃竸喔膏笓喔覆喔∴覆喔`笘喔腑喔氞笘喔侧浮喙�喔權阜喙夃腑喔覆喔傕箟喔竸喔о覆喔∴笚喔掂箞喙�喔佮傅喙堗涪喔о競喙夃腑喔囙竵喔编笟喔勦箥喔侧笘喔侧浮喔傕腑喔囙笢喔灌箟喙冟笂喙夃笀喔侧竵喔勦抚喔侧浮喔`腹喙�',
+    'question-classifier': '喔佮箥喔侧斧喔權笖喙�喔囙阜喙堗腑喔權箘喔傕竵喔侧福喔堗箥喔侧箒喔權竵喔涏福喔班箑喔犩笚喔傕腑喔囙竸喙嵿覆喔栢覆喔∴競喔竾喔溹腹喙夃箖喔娻箟 LLM 喔覆喔∴覆喔`笘喔佮箥喔侧斧喔權笖喔勦抚喔侧浮喔勦阜喔氞斧喔權箟喔侧競喔竾喔佮覆喔`釜喔權笚喔權覆喔曕覆喔∴竸喙嵿覆喔笜喔脆笟喔侧涪喔佮覆喔`笀喙嵿覆喙佮笝喔佮笡喔`赴喙�喔犩笚',
+    'if-else': '喔娻箞喔о涪喙冟斧喙夃竸喔膏笓喔覆喔∴覆喔`笘喙佮笟喙堗竾喙�喔о复喔`箤喔佮箓喔熰弗喔о箤喔腑喔佮箑喔涏箛喔權釜喔竾喔覆喔傕覆喔曕覆喔∴箑喔囙阜喙堗腑喔權箘喔� if/else',
+    'code': '喙�喔`傅喔⑧竵喙冟笂喙夃箓喔勦箟喔� Python 喔福喔粪腑 NodeJS 喙�喔炧阜喙堗腑喙冟笂喙夃笗喔`福喔佮赴喔椸傅喙堗竵喙嵿覆喔笝喔斷箑喔竾',
+    'template-transform': '喙佮笡喔ム竾喔傕箟喔浮喔灌弗喙�喔涏箛喔權釜喔曕福喔脆竾喙傕笖喔⑧箖喔娻箟喙勦抚喔⑧覆喔佮福喔撪箤喙�喔椸浮喙�喔炧弗喔� Jinja',
+    'http-request': '喔笝喔膏笉喔侧笗喙冟斧喙夃釜喙堗竾喔勦箥喔侧競喔箑喔嬥复喔`箤喔熰箑喔о腑喔`箤喔溹箞喔侧笝喙傕笡喔`箓喔曕竸喔弗 HTTP',
+    'variable-assigner': '喔`抚喔∴笗喔编抚喙佮笡喔`斧喔ム覆喔⑧釜喔侧競喔侧箑喔涏箛喔權笗喔编抚喙佮笡喔`箑喔斷傅喔⑧抚喔箥喔侧斧喔`副喔氞竵喔侧福喔佮箥喔侧斧喔權笖喔勦箞喔侧箒喔氞笟喔`抚喔∴競喔竾喙傕斧喔權笖喔斷覆喔о笝喙屶釜喔曕福喔掂浮',
+    'assigner': '喙傕斧喔權笖喔佮覆喔`竵喙嵿覆喔笝喔斷笗喔编抚喙佮笡喔`箖喔娻箟喔箥喔侧斧喔`副喔氞竵喙嵿覆喔笝喔斷竸喙堗覆喙冟斧喙夃竵喔编笟喔曕副喔о箒喔涏福喔椸傅喙堗箑喔傕傅喔⑧笝喙勦笖喙� (喙�喔娻箞喔權笗喔编抚喙佮笡喔`竵喔侧福喔笝喔椸笝喔�)',
+    'variable-aggregator': '喔`抚喔∴笗喔编抚喙佮笡喔`斧喔ム覆喔⑧釜喔侧競喔侧箑喔涏箛喔權笗喔编抚喙佮笡喔`箑喔斷傅喔⑧抚喔箥喔侧斧喔`副喔氞竵喔侧福喔佮箥喔侧斧喔權笖喔勦箞喔侧箒喔氞笟喔`抚喔∴競喔竾喙傕斧喔權笖喔斷覆喔о笝喙屶釜喔曕福喔掂浮',
+    'iteration': '喔斷箥喔侧箑喔權复喔權竵喔侧福喔弗喔侧涪喔傕副喙夃笝喔曕腑喔權竵喔编笟喔о副喔曕笘喔膏福喔侧涪喔佮覆喔`笀喔權竵喔о箞喔侧笀喔班釜喙堗竾喔腑喔佮笢喔ム弗喔编笧喔樴箤喔椸副喙夃竾喔浮喔�',
+    'parameter-extractor': '喙冟笂喙� LLM 喙�喔炧阜喙堗腑喙佮涪喔佮笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤喔椸傅喙堗浮喔掂箓喔勦福喔囙釜喔`箟喔侧竾喔堗覆喔佮笭喔侧俯喔侧笜喔`福喔∴笂喔侧笗喔脆釜喙嵿覆喔福喔编笟喔佮覆喔`箑喔`傅喔⑧竵喙冟笂喙夃箑喔勦福喔粪箞喔竾喔∴阜喔斧喔`阜喔竸喙嵿覆喔傕腑 HTTP',
+    'document-extractor': '喙冟笂喙夃箑喔炧阜喙堗腑喙佮涪喔佮抚喔脆箑喔勦福喔侧赴喔箤喙�喔竵喔覆喔`笚喔掂箞喔副喔涏箓喔弗喔斷箑喔涏箛喔權箑喔權阜喙夃腑喔覆喔傕箟喔竸喔о覆喔∴笚喔掂箞 LLM 喙�喔傕箟喔侧箖喔堗箘喔斷箟喔囙箞喔侧涪',
+    'list-operator': '喙冟笂喙夃箑喔炧阜喙堗腑喔佮福喔竾喔福喔粪腑喔堗副喔斷箑喔`傅喔⑧竾喙�喔權阜喙夃腑喔覆喔覆喔`箤喙�喔`涪喙�',
+    'agent': '喔佮覆喔`箑喔`傅喔⑧竵喙冟笂喙夃箓喔∴箑喔斷弗喔犩覆喔┼覆喔傕笝喔侧笖喙冟斧喔嵿箞喙�喔炧阜喙堗腑喔曕腑喔氞竸喙嵿覆喔栢覆喔∴斧喔`阜喔笡喔`赴喔∴抚喔ム笢喔ム笭喔侧俯喔侧笜喔`福喔∴笂喔侧笗喔�',
+    'loop': '喔斷赋喙�喔權复喔權竵喔侧福喔ム腹喔涏競喔竾喔曕福喔`竵喔班笀喔權竵喔о箞喔侧笀喔班笘喔多竾喙�喔囙阜喙堗腑喔權箘喔傕竵喔侧福喔复喙夃笝喔父喔斷斧喔`阜喔笗喔`竾喔曕覆喔∴笀喔赤笝喔о笝喔ム腹喔涏釜喔灌竾喔父喔斷笚喔掂箞喔佮赋喔笝喔�.',
+    'loop-end': '喙�喔椸傅喔⑧笟喙�喔椸箞喔侧竵喔编笟 "break" 喙傕斧喔權笖喔權傅喙夃箘喔∴箞喔∴傅喔`覆喔⑧竵喔侧福喔佮覆喔`竵喔赤斧喔權笖喔勦箞喔� 喙�喔∴阜喙堗腑喔`箞喔侧竾喔佮覆喔⑧競喔竾喔ム腹喔涏笘喔多竾喙傕斧喔權笖喔權傅喙� 喔ム腹喔涏笀喔班釜喔脆箟喔權釜喔膏笖喔ム竾.',
+  },
+  operator: {
+    zoomIn: '喔嬥腹喔∴箑喔傕箟喔�',
+    zoomOut: '喔嬥腹喔∴腑喔竵',
+    zoomTo50: '喔嬥腹喔∴箘喔涏笚喔掂箞 50%',
+    zoomTo100: '喔嬥腹喔∴箘喔涏笚喔掂箞 100%',
+    zoomToFit: '喔嬥腹喔∴箖喔箟喔炧腑喔斷傅',
+  },
+  panel: {
+    userInputField: '喔熰复喔ム笖喙屶笡喙夃腑喔權競喙夃腑喔∴腹喔ム競喔竾喔溹腹喙夃箖喔娻箟',
+    changeBlock: '喙�喔涏弗喔掂箞喔⑧笝喔氞弗喙囙腑喔�',
+    helpLink: '喔ム复喔囙竸喙屶笂喙堗抚喔⑧箑喔弗喔粪腑',
+    about: '喔涏福喔班浮喔侧笓',
+    createdBy: '喔福喙夃覆喔囙箓喔斷涪',
+    nextStep: '喔傕副喙夃笝喔曕腑喔權笘喔编笖喙勦笡',
+    addNextStep: '喙�喔炧复喙堗浮喔氞弗喙囙腑喔佮笘喔编笖喙勦笡喙冟笝喙�喔о复喔`箤喔佮箓喔熰弗喔о箤喔權傅喙�',
+    selectNextStep: '喙�喔ム阜喔竵喔氞弗喙囙腑喔佮笘喔编笖喙勦笡',
+    runThisStep: '喙�喔`傅喔⑧竵喙冟笂喙夃競喔编箟喔權笗喔笝喔權傅喙�',
+    checklist: '喔曕福喔о笀 喔腑喔�',
+    checklistTip: '喔曕福喔о笀喔腑喔氞箖喔箟喙佮笝喙堗箖喔堗抚喙堗覆喔涏副喔嵿斧喔侧笚喔编箟喔囙斧喔∴笖喙勦笖喙夃福喔编笟喔佮覆喔`箒喔佮箟喙勦競喙佮弗喙夃抚喔佮箞喔笝喔椸傅喙堗笀喔班箑喔溹涪喙佮笧喔`箞',
+    checklistResolved: '喔涏副喔嵿斧喔侧笚喔编箟喔囙斧喔∴笖喙勦笖喙夃福喔编笟喔佮覆喔`箒喔佮箟喙勦競喙佮弗喙夃抚',
+    organizeBlocks: '喔堗副喔斷福喔班箑喔氞傅喔⑧笟喔氞弗喙囙腑喔�',
+    change: '喙�喔涏弗喔掂箞喔⑧笝',
+    optional: '(喙勦浮喙堗笟喔编竾喔勦副喔�)',
+  },
+  nodes: {
+    common: {
+      outputVars: '喔曕副喔о箒喔涏福喙�喔覆喔曕箤喔炧父喔�',
+      insertVarTip: '喙佮笚喔`竵喔曕副喔о箒喔涏福',
+      memory: {
+        memory: '喔勦抚喔侧浮喔堗赋',
+        memoryTip: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔笝喙堗抚喔⑧竸喔о覆喔∴笀喙嵿覆喙佮笂喔�',
+        windowSize: '喔傕笝喔侧笖喔笝喙夃覆喔曕箞喔侧竾',
+        conversationRoleName: '喔娻阜喙堗腑喔氞笚喔氞覆喔椸竵喔侧福喔笝喔椸笝喔�',
+        user: '喔勦箥喔侧笝喙嵿覆喔笝喙夃覆喔溹腹喙夃箖喔娻箟',
+        assistant: '喔勦箥喔侧笝喙嵿覆喔笝喙夃覆喔溹腹喙夃笂喙堗抚喔�',
+      },
+      memories: {
+        title: '喔勦抚喔侧浮 喔椸福喔� 喔堗赋',
+        tip: '喔勦抚喔侧浮喔椸福喔囙笀喙嵿覆喔佮覆喔`箒喔娻笚',
+        builtIn: '喙冟笝喔曕副喔�',
+      },
+      errorHandle: {
+        none: {
+          title: '喙勦浮喙堗浮喔掂箖喔勦福',
+          desc: '喙傕斧喔權笖喔堗赴喔涪喔膏笖喔椸箥喔侧竾喔侧笝喔覆喔佮箑喔佮复喔斷競喙夃腑喔⑧竵喙�喔о箟喔權箒喔ム赴喙勦浮喙堗箘喔斷箟喔`副喔氞竵喔侧福喔堗副喔斷竵喔侧福',
+        },
+        defaultValue: {
+          title: '喔勦箞喔侧箑喔`复喙堗浮喔曕箟喔�',
+          desc: '喙�喔∴阜喙堗腑喙�喔佮复喔斷競喙夃腑喔溹复喔斷笧喔ム覆喔� 喙冟斧喙夃福喔班笟喔膏箑喔權阜喙夃腑喔覆喙�喔覆喔曕箤喔炧父喔曕箒喔氞笟喔勦竾喔椸傅喙�',
+          tip: '喙�喔∴阜喙堗腑喙�喔佮复喔斷競喙夃腑喔溹复喔斷笧喔ム覆喔� 喔堗赴喔箞喔囙竸喔粪笝喔勦箞喔侧笗喙堗箥喔侧竵喔о箞喔�',
+          inLog: '喔傕箟喔涪喔佮箑喔о箟喔權箓喔笝喔斷釜喙堗竾喔腑喔佮笗喔侧浮喔勦箞喔侧箑喔`复喙堗浮喔曕箟喔�',
+          output: '喔勦箞喔侧箑喔`复喙堗浮喔曕箟喔權箑喔覆喔曕箤喔炧父喔�',
+        },
+        failBranch: {
+          title: '喔覆喔傕覆喔ム箟喔∴箑喔弗喔�',
+          desc: '喙�喔∴阜喙堗腑喙�喔佮复喔斷競喙夃腑喔溹复喔斷笧喔ム覆喔� 喔堗赴喔斷箥喔侧箑喔權复喔權竵喔侧福喔覆喔傕覆喔傕箟喔涪喔佮箑喔о箟喔�',
+          customize: '喙勦笡喔椸傅喙堗笧喔粪箟喔權笚喔掂箞喔椸箥喔侧竾喔侧笝喙�喔炧阜喙堗腑喔涏福喔编笟喙佮笗喙堗竾喔曕福喔`竵喔班釜喔侧競喔侧笚喔掂箞喔ム箟喔∴箑喔弗喔�',
+          customizeTip: '喙�喔∴阜喙堗腑喙�喔涏复喔斷箖喔娻箟喔囙覆喔權釜喔侧競喔侧弗喙夃浮喙�喔弗喔� 喔傕箟喔涪喔佮箑喔о箟喔權笚喔掂箞喙傕斧喔權笖喙傕涪喔權笀喔班箘喔∴箞喔⑧父喔曕复喔佮福喔班笟喔о笝喔佮覆喔� 喙佮笗喙堗笀喔班箑喔`傅喔⑧竵喙冟笂喙夃釜喔侧競喔侧弗喙夃浮喙�喔弗喔о笚喔掂箞喔佮箥喔侧斧喔權笖喙勦抚喙夃弗喙堗抚喔囙斧喔權箟喔侧箓喔斷涪喔副喔曕箓喔權浮喔编笗喔� 喔娻箞喔о涪喙冟斧喙夃竸喔膏笓喔`赴喔氞父喔傕箟喔竸喔о覆喔∴箒喔笖喔囙競喙夃腑喔溹复喔斷笧喔ム覆喔� 喔`覆喔⑧竾喔侧笝 喔佮覆喔`箒喔佮箟喙勦競 喔福喔粪腑喔傕箟喔侧浮喔佮覆喔`笖喙嵿覆喙�喔權复喔權竵喔侧福喙勦笖喙夃腑喔⑧箞喔侧竾喔⑧阜喔斷斧喔⑧父喙堗笝',
+          inLog: '喔傕箟喔涪喔佮箑喔о箟喔權箓喔笝喔斷笀喔班笖喙嵿覆喙�喔權复喔權竵喔侧福喔覆喔傕覆喔椸傅喙堗弗喙夃浮喙�喔弗喔о箓喔斷涪喔副喔曕箓喔權浮喔编笗喔� 喙�喔覆喔曕箤喔炧父喔曕箓喔笝喔斷笀喔班釜喙堗竾喔勦阜喔權笡喔`赴喙�喔犩笚喔傕箟喔笢喔脆笖喔炧弗喔侧笖喙佮弗喔班競喙夃腑喔勦抚喔侧浮喙佮釜喔斷竾喔傕箟喔笢喔脆笖喔炧弗喔侧笖喙佮弗喔班釜喙堗竾喔曕箞喔箘喔涏涪喔编竾喔斷覆喔о笝喙屶釜喔曕福喔掂浮',
+        },
+        partialSucceeded: {
+          tip: '喔∴傅喙傕斧喔權笖 {{num}} 喙冟笝喔佮福喔班笟喔о笝喔佮覆喔`笚喔掂箞喔椸箥喔侧竾喔侧笝喔溹复喔斷笡喔佮笗喔� 喙傕笡喔`笖喙勦笡喔椸傅喙堗竵喔侧福喔曕复喔斷笗喔侧浮喙�喔炧阜喙堗腑喔曕福喔о笀喔腑喔氞笟喔编笝喔椸付喔�',
+        },
+        title: '喔佮覆喔`笀喔编笖喔佮覆喔`競喙夃腑喔溹复喔斷笧喔ム覆喔�',
+        tip: '喔佮弗喔⑧父喔椸笜喙屶竵喔侧福喔堗副喔斷竵喔侧福喔傕箟喔涪喔佮箑喔о箟喔� 喔椸福喔脆竵喙�喔佮腑喔`箤喙�喔∴阜喙堗腑喙傕斧喔權笖喔炧笟喔傕箟喔涪喔佮箑喔о箟喔�',
+      },
+      retry: {
+        retry: '喔ム腑喔�',
+        retryOnFailure: '喔ム腑喔囙箖喔浮喙堗箑喔∴阜喙堗腑喔ム箟喔∴箑喔弗喔�',
+        maxRetries: '喔佮覆喔`弗喔竾喔嬥箟喙嵿覆喔腹喔囙釜喔膏笖',
+        retryInterval: '喔娻箞喔о竾喙�喔о弗喔侧弗喔竾喙冟斧喔∴箞',
+        retryTimes: '喔ム腑喔� {{times}} 喔勦福喔编箟喔囙箑喔∴阜喙堗腑喔ム箟喔∴箑喔弗喔�',
+        retrying: '喔佮箥喔侧弗喔编竾喔ム腑喔囙笅喙夃箥喔�...',
+        retrySuccessful: '喔ム腑喔囙箖喔浮喙堗釜喙嵿覆喙�喔`箛喔�',
+        retryFailed: '喔ム腑喔囙箖喔浮喙堗弗喙夃浮喙�喔弗喔�',
+        retryFailedTimes: '{{times}} 喔佮覆喔`弗喔竾喔嬥箟喙嵿覆喔ム箟喔∴箑喔弗喔�',
+        times: '喔勦福喔编箟喔�',
+        retries: '{{num}} 喔ム腑喔�',
+        ms: '喔權覆喔囙釜喔侧抚',
+      },
+    },
+    start: {
+      required: '喔曕箟喔竾喔`赴喔氞父',
+      inputField: '喔熰复喔ム笖喙屶腑喔脆笝喔炧父喔�',
+      builtInVar: '喔曕副喔о箒喔涏福喙冟笝喔曕副喔�',
+      outputVars: {
+        query: '喔佮覆喔`笡喙夃腑喔權競喙夃腑喔∴腹喔ム競喔竾喔溹腹喙夃箖喔娻箟',
+        memories: {
+          des: '喔涏福喔班抚喔编笗喔脆竵喔侧福喔笝喔椸笝喔�',
+          type: '喔涏福喔班箑喔犩笚喔傕箟喔竸喔о覆喔�',
+          content: '喙�喔權阜喙夃腑喔覆喔傕箟喔竸喔о覆喔�',
+        },
+        files: '喔`覆喔⑧竵喔侧福喙勦笩喔ム箤',
+      },
+      noVarTip: '喔曕副喙夃竾喔勦箞喔侧腑喔脆笝喔炧父喔曕笚喔掂箞喔覆喔∴覆喔`笘喙冟笂喙夃箖喔權箑喔о复喔`箤喔佮箓喔熰弗喔о箤',
+    },
+    end: {
+      outputs: '喙�喔覆喔曕箤 喔炧父 喔�',
+      output: {
+        type: '喔涏福喔班箑喔犩笚喙�喔覆喔曕箤喔炧父喔�',
+        variable: '喔曕副喔о箒喔涏福喙�喔覆喔曕箤喔炧父喔�',
+      },
+      type: {
+        'none': '喙勦浮喙堗浮喔掂箖喔勦福',
+        'plain-text': '喔傕箟喔竸喔о覆喔∴笜喔`福喔∴笖喔�',
+        'structured': '喙傕竸喔`竾 喔福喙夃覆喔�',
+      },
+    },
+    answer: {
+      answer: '喔曕腑喔�',
+      outputVars: '喔曕副喔о箒喔涏福喙�喔覆喔曕箤喔炧父喔�',
+    },
+    llm: {
+      model: '喙佮笟喔�',
+      variables: '喔曕副喔� 喙佮笡喔�',
+      context: '喔氞福喔脆笟喔�',
+      contextTooltip: '喔勦父喔撪釜喔侧浮喔侧福喔栢笝喙嵿覆喙�喔傕箟喔侧竸喔о覆喔∴福喔灌箟喙�喔涏箛喔權笟喔`复喔氞笚喙勦笖喙�',
+      notSetContextInPromptTip: '喔覆喔佮笗喙夃腑喔囙竵喔侧福喙�喔涏复喔斷箖喔娻箟喔囙覆喔權竸喔膏笓喔浮喔氞副喔曕复喔氞福喔脆笟喔� 喙傕笡喔`笖喔佮福喔竵喔曕副喔о箒喔涏福喔氞福喔脆笟喔椸箖喔� PROMPT',
+      prompt: '喔炧福喙夃腑喔∴笚喙�',
+      roleDescription: {
+        system: '喙冟斧喙夃竸喙嵿覆喙佮笝喔班笝喙嵿覆喔`赴喔斷副喔氞釜喔灌竾喔箥喔侧斧喔`副喔氞竵喔侧福喔笝喔椸笝喔�',
+        user: '喙冟斧喙夃竸喙嵿覆喙佮笝喔班笝喙嵿覆 喙佮笟喔氞釜喔笟喔栢覆喔� 喔福喔粪腑喔佮覆喔`笡喙夃腑喔權競喙夃腑喔∴腹喔ム笗喔侧浮喔傕箟喔竸喔о覆喔∴箖喔斷箚 喙勦笡喔⑧副喔囙箒喔氞笟喔堗箥喔侧弗喔竾',
+        assistant: '喔佮覆喔`笗喔笟喔笝喔竾喔傕腑喔囙箓喔∴箑喔斷弗喔曕覆喔∴競喙夃腑喔勦抚喔侧浮喔傕腑喔囙笢喔灌箟喙冟笂喙�',
+      },
+      addMessage: '喙�喔炧复喙堗浮喔傕箟喔竸喔о覆喔�',
+      vision: '喔佮覆喔`浮喔竾喙�喔箛喔�',
+      files: '喙佮笩喙夃浮',
+      resolution: {
+        name: '喔∴笗喔�',
+        high: '喔腹喔�',
+        low: '喔曕箞喙嵿覆',
+      },
+      outputVars: {
+        output: '喔福喙夃覆喔囙箑喔權阜喙夃腑喔覆',
+        usage: '喔傕箟喔浮喔灌弗喔佮覆喔`箖喔娻箟喔囙覆喔權福喔膏箞喔�',
+      },
+      singleRun: {
+        variable: '喔曕副喔о箒喔涏福',
+      },
+      sysQueryInUser: 'sys.query 喙冟笝喔傕箟喔竸喔о覆喔∴笢喔灌箟喙冟笂喙夃箑喔涏箛喔權釜喔脆箞喔囙笀喙嵿覆喙�喔涏箛喔�',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: '喔佮福喔膏笓喔侧箒喔佮箟喙勦競喔熰复喔ム笖喙屶笡喔编笀喔堗父喔氞副喔權箖喔箟喙�喔福喙囙笀喔佮箞喔笝喔椸傅喙堗笀喔班笟喔编笝喔椸付喔佮釜喔勦傅喔∴覆',
+        },
+        apply: '喔浮喔编竸喔�',
+        resetDefaults: '喔`傅喙�喔嬥箛喔�',
+        generate: '喔福喙夃覆喔�',
+        import: '喔權赋喙�喔傕箟喔侧笀喔侧竵 JSON',
+        descriptionPlaceholder: '喙�喔炧复喙堗浮喔勦赋喔笜喔脆笟喔侧涪',
+        instruction: '喔勦赋喙佮笝喔班笝喔�',
+        generating: '喔佮赋喔ム副喔囙釜喔`箟喔侧竾 JSON Schema...',
+        resultTip: '喔權傅喙堗竸喔粪腑喔溹弗喔ム副喔炧笜喙屶笚喔掂箞喔福喙夃覆喔囙競喔多箟喔� 喔覆喔佮竸喔膏笓喙勦浮喙堗笧喔箖喔� 喔勦父喔撪釜喔侧浮喔侧福喔栢竵喔ム副喔氞箘喔涏箒喔ム赴喙佮竵喙夃箘喔傕竸喔赤釜喔编箞喔囙競喔竾喔勦父喔撪箘喔斷箟',
+        regenerate: '喔福喙夃覆喔囙箖喔浮喙�',
+        title: '喔`腹喔涏箒喔氞笟喔傕箟喔浮喔灌弗喔椸傅喙堗笀喔编笖喔`赴喙�喔氞傅喔⑧笟',
+        promptPlaceholder: '喙傕笡喔`笖喔笜喔脆笟喔侧涪 JSON Schema 喔傕腑喔囙竸喔膏笓...',
+        generatedResult: '喔溹弗喔ム副喔炧笜喙屶笚喔掂箞喔福喙夃覆喔囙競喔多箟喔�',
+        generateJsonSchema: '喔福喙夃覆喔� JSON Schema',
+        promptTooltip: '喙佮笡喔ム竾喔勦赋喔笜喔脆笟喔侧涪喔傕箟喔竸喔о覆喔∴箑喔涏箛喔權箓喔勦福喔囙釜喔`箟喔侧竾 JSON Schema 喔∴覆喔曕福喔愢覆喔�.',
+        showAdvancedOptions: '喙佮釜喔斷竾喔曕副喔о箑喔ム阜喔竵喔傕副喙夃笝喔腹喔�',
+        addField: '喙�喔炧复喙堗浮喔熰复喔ム笖喙�',
+        back: '喔佮弗喔编笟',
+        fieldNamePlaceholder: '喔娻阜喙堗腑喔熰复喔ム笖喙�',
+        generationTip: '喔勦父喔撪釜喔侧浮喔侧福喔栢箖喔娻箟喔犩覆喔┼覆喔樴福喔`浮喔娻覆喔曕复喙冟笝喔佮覆喔`釜喔`箟喔侧竾 JSON Schema 喙勦笖喙夃腑喔⑧箞喔侧竾喔`抚喔斷箑喔`箛喔�.',
+        doc: '喙�喔`傅喔⑧笝喔`腹喙夃箑喔炧复喙堗浮喙�喔曕复喔∴箑喔佮傅喙堗涪喔о竵喔编笟喔溹弗喔ム副喔炧笜喙屶笚喔掂箞喔∴傅喙傕竸喔`竾喔福喙夃覆喔�',
+        addChildField: '喙�喔炧复喙堗浮喔熰复喔ム笖喙屶箑喔斷箛喔�',
+        stringValidations: '喔佮覆喔`笗喔`抚喔堗釜喔笟喔笗喔`复喔�',
+        required: '喔堗赋喙�喔涏箛喔權笗喙夃腑喔囙箖喔娻箟',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: '喔曕副喔о箒喔涏福喙佮笟喔氞釜喔笟喔栢覆喔�',
+      knowledge: '喔勦抚喔侧浮喔`腹喙�',
+      outputVars: {
+        output: '喔佮覆喔`笖喔多竾喔傕箟喔浮喔灌弗喔椸傅喙堗箒喔氞箞喔囙釜喙堗抚喔�',
+        content: '喙�喔權阜喙夃腑喔覆喔椸傅喙堗箒喔氞箞喔囙竵喔ム父喙堗浮',
+        title: '喔娻阜喙堗腑喙佮笟喙堗竾喔箞喔о笝',
+        icon: '喙勦腑喔勦腑喔權箒喔氞箞喔囙釜喙堗抚喔�',
+        url: 'URL 喔椸傅喙堗箒喔氞箞喔囙竵喔ム父喙堗浮',
+        metadata: '喔傕箟喔浮喔灌弗喙�喔∴笗喔侧腑喔粪箞喔權箚',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            title: '喔勦笝喔炧复喔佮覆喔�',
+            subTitle: '喙勦浮喙堗箘喔斷箟喙�喔涏复喔斷箖喔娻箟喔囙覆喔權竵喔侧福喔佮福喔竾喔傕箟喔浮喔灌弗喙�喔∴笗喔�',
+          },
+          automatic: {
+            desc: '喔福喙夃覆喔囙箑喔囙阜喙堗腑喔權箘喔傕竵喔侧福喔佮福喔竾喔傕箟喔浮喔灌弗喙�喔∴笗喔侧箓喔斷涪喔副喔曕箓喔權浮喔编笗喔脆笗喔侧浮喔曕副喔о箒喔涏福喔勦箟喔權斧喔�',
+            title: '喔副喔曕箓喔權浮喔编笗喔�',
+            subTitle: '喔福喙夃覆喔囙箑喔囙阜喙堗腑喔權箘喔傕竵喔侧福喔佮福喔竾喔傕箟喔浮喔灌弗喙�喔∴笗喔侧箓喔斷涪喔副喔曕箓喔權浮喔编笗喔脆笗喔侧浮喔佮覆喔`竸喙夃笝喔覆喔傕腑喔囙笢喔灌箟喙冟笂喙�',
+          },
+          manual: {
+            subTitle: '喙�喔炧复喙堗浮喙�喔囙阜喙堗腑喔權箘喔傕竵喔侧福喔佮福喔竾喔傕箟喔浮喔灌弗喙�喔∴笗喔侧笖喙夃抚喔⑧笗喔權箑喔竾',
+            title: '喔勦腹喙堗浮喔粪腑',
+          },
+        },
+        panel: {
+          conditions: '喙�喔囙阜喙堗腑喔權箘喔�',
+          search: '喔勦箟喔權斧喔侧競喙夃腑喔∴腹喔ム箑喔∴笗喔�',
+          add: '喙�喔炧复喙堗浮喙�喔囙阜喙堗腑喔權箘喔�',
+          datePlaceholder: '喙�喔ム阜喔竵喙�喔о弗喔�...',
+          title: '喙�喔囙阜喙堗腑喔權箘喔傕竵喔侧福喔佮福喔竾喔傕箟喔浮喔灌弗喙�喔∴笗喔�',
+          select: '喙�喔ム阜喔竵喔曕副喔о箒喔涏福...',
+          placeholder: '喙冟釜喙堗竸喙堗覆',
+        },
+        title: '喔佮覆喔`竵喔`腑喔囙競喙夃腑喔∴腹喔ム箑喔∴笗喔�',
+      },
+    },
+    http: {
+      inputVars: '喔曕副喔о箒喔涏福喔复喔權笧喔膏笗',
+      api: '喙�喔笧喔掂箘喔�',
+      apiPlaceholder: '喔涏箟喔笝 URL 喔炧复喔∴笧喙� \'/\' 喙佮笚喔`竵喔曕副喔о箒喔涏福',
+      extractListPlaceholder: '喔涏箟喔笝喔斷副喔娻笝喔掂福喔侧涪喔佮覆喔`笧喔脆浮喔炧箤 \'/\' 喙佮笚喔`竵喔曕副喔о箒喔涏福',
+      notStartWithHttp: 'API 喔勦抚喔`競喔多箟喔權笗喙夃笝喔斷箟喔о涪 http:// 喔福喔粪腑 https://',
+      key: '喔佮父喔嵿箒喔�',
+      type: '喔涏福喔班箑喔犩笚',
+      value: '喔勦箞喔�',
+      bulkEdit: '喙佮竵喙夃箘喔傕笀喙嵿覆喔權抚喔權浮喔侧竵',
+      keyValueEdit: '喔佮覆喔`箒喔佮箟喙勦競喔勦傅喔⑧箤-喔勦箞喔�',
+      headers: '喔副喔� 喔佮福喔班笖喔侧俯',
+      params: '喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤',
+      body: '喔`箞喔侧竾喔佮覆喔�',
+      binaryFileVariable: '喔曕副喔о箒喔涏福喙勦笩喔ム箤喙勦笟喔權覆喔`傅',
+      outputVars: {
+        body: '喙�喔權阜喙夃腑喔覆喔佮覆喔`笗喔笟喔佮弗喔编笟',
+        statusCode: '喔`斧喔编釜喔笘喔侧笝喔班竵喔侧福喔曕腑喔氞竵喔ム副喔�',
+        headers: 'JSON 喔`覆喔⑧竵喔侧福喔箞喔о笝喔副喔о竵喔侧福喔曕腑喔氞釜喔權腑喔�',
+        files: '喔`覆喔⑧竵喔侧福喙勦笩喔ム箤',
+      },
+      authorization: {
+        'authorization': '喔佮覆喔`腑喔權父喔嵿覆喔�',
+        'authorizationType': '喔涏福喔班箑喔犩笚喔佮覆喔`腑喔權父喔嵿覆喔�',
+        'no-auth': '喙勦浮喙堗浮喔掂箖喔勦福',
+        'api-key': '喔勦傅喔⑧箤 API',
+        'auth-type': '喔涏福喔班箑喔犩笚喔佮覆喔`福喔编笟喔`腑喔囙竸喔о覆喔∴笘喔灌竵喔曕箟喔竾',
+        'basic': '喔炧阜喙夃笝喔愢覆喔�',
+        'bearer': '喔溹腹喙夃笘喔粪腑',
+        'custom': '喔樴福喔`浮喙�喔權傅喔⑧浮',
+        'api-key-title': '喔勦傅喔⑧箤 API',
+        'header': '喔副喔� 喔傕箟喔�',
+      },
+      insertVarPlaceholder: '喔炧复喔∴笧喙� \'/\' 喙�喔炧阜喙堗腑喙佮笚喔`竵喔曕副喔о箒喔涏福',
+      timeout: {
+        title: '喔浮喔斷箑喔о弗喔�',
+        connectLabel: '喔浮喔斷箑喔о弗喔侧竵喔侧福喙�喔娻阜喙堗腑喔∴笗喙堗腑',
+        connectPlaceholder: '喔涏箟喔笝喔佮覆喔`斧喔∴笖喙�喔о弗喔侧竵喔侧福喙�喔娻阜喙堗腑喔∴笗喙堗腑喙�喔涏箛喔權抚喔脆笝喔侧笚喔�',
+        readLabel: '喔浮喔斷箑喔о弗喔侧竵喔侧福喔箞喔侧笝',
+        readPlaceholder: '喔涏箟喔笝喔浮喔斷箑喔о弗喔侧竵喔侧福喔箞喔侧笝喙�喔涏箛喔權抚喔脆笝喔侧笚喔�',
+        writeLabel: '喔浮喔斷箑喔о弗喔侧竵喔侧福喙�喔傕傅喔⑧笝',
+        writePlaceholder: '喔涏箟喔笝喔浮喔斷箑喔о弗喔侧竵喔侧福喙�喔傕傅喔⑧笝喙�喔涏箛喔權抚喔脆笝喔侧笚喔�',
+      },
+      curl: {
+        title: '喔權箥喔侧箑喔傕箟喔侧笀喔侧竵 cURL',
+        placeholder: '喔о覆喔囙釜喔曕福喔脆竾 cURL 喔椸傅喙堗笝喔掂箞',
+      },
+    },
+    code: {
+      inputVars: '喔曕副喔о箒喔涏福喔复喔權笧喔膏笗',
+      outputVars: '喔曕副喔о箒喔涏福喙�喔覆喔曕箤喔炧父喔�',
+      advancedDependencies: '喔佮覆喔`笧喔多箞喔囙笧喔侧競喔编箟喔權釜喔灌竾',
+      advancedDependenciesTip: '喙�喔炧复喙堗浮喔佮覆喔`笧喔多箞喔囙笧喔侧笚喔掂箞喙傕斧喔ム笖喙勦抚喙夃弗喙堗抚喔囙斧喔權箟喔侧笅喔多箞喔囙箖喔娻箟喙�喔о弗喔侧浮喔侧竵喔傕付喙夃笝喙冟笝喔佮覆喔`箖喔娻箟喔福喔粪腑喙勦浮喙堗箖喔娻箞喔勦箞喔侧箑喔`复喙堗浮喔曕箟喔權箖喔權笗喔编抚喔椸傅喙堗笝喔掂箞',
+      searchDependencies: '喔佮覆喔`笧喔多箞喔囙笧喔侧竵喔侧福喔勦箟喔權斧喔�',
+    },
+    templateTransform: {
+      inputVars: '喔曕副喔о箒喔涏福喔复喔權笧喔膏笗',
+      code: '喔`斧喔编釜',
+      codeSupportTip: '喔`腑喔囙福喔编笟喙�喔夃笧喔侧赴 Jinja2',
+      outputVars: {
+        output: '喙�喔權阜喙夃腑喔覆喔椸傅喙堗箒喔涏弗喔囙箓喔夃浮',
+      },
+    },
+    ifElse: {
+      if: '喔栢箟喔�',
+      else: '喔阜喙堗笝',
+      elseDescription: '喙冟笂喙夃箑喔炧阜喙堗腑喔佮箥喔侧斧喔權笖喔曕福喔`竵喔班笚喔掂箞喔勦抚喔`笖喙嵿覆喙�喔權复喔權竵喔侧福喙�喔∴阜喙堗腑喙勦浮喙堗笗喔`竾喔曕覆喔∴箑喔囙阜喙堗腑喔權箘喔� if',
+      and: '喙佮弗喔�',
+      or: '喔福喔粪腑',
+      operator: '喔溹腹喙夃笡喔忇复喔氞副喔曕复喔佮覆喔�',
+      notSetVariable: '喙傕笡喔`笖喔曕副喙夃竾喔勦箞喔侧笗喔编抚喙佮笡喔`竵喙堗腑喔�',
+      comparisonOperator: {
+        'contains': '喔涏福喔班竵喔笟 喔斷箟喔о涪',
+        'not contains': '喙勦浮喙堗浮喔�',
+        'start with': '喙�喔`复喙堗浮喔曕箟喔權笖喙夃抚喔�',
+        'end with': '喔ム竾喔椸箟喔侧涪喔斷箟喔о涪',
+        'is': '喔勦阜喔�',
+        'is not': '喙勦浮喙堗箖喔娻箞',
+        'empty': '喔о箞喔侧竾喙�喔涏弗喙堗覆',
+        'not empty': '喙勦浮喙堗抚喙堗覆喔囙箑喔涏弗喙堗覆',
+        'null': '喙�喔涏箛喔權箓喔∴竼喔�',
+        'not null': '喙勦浮喙堗箑喔涏箛喔權箓喔∴竼喔�',
+        'in': '喙冟笝',
+        'not in': '喙勦浮喙堗腑喔⑧腹喙堗箖喔�',
+        'all of': '喔椸副喙夃竾喔浮喔�',
+        'exists': '喔涪喔灌箞',
+        'not exists': '喙勦浮喙堗浮喔掂腑喔⑧腹喙堗笀喔`复喔�',
+        'before': '喔佮箞喔笝',
+        'after': '喔弗喔编竾喔堗覆喔佮笝喔编箟喔�',
+      },
+      optionName: {
+        image: '喔犩覆喔�',
+        doc: '喙�喔竵喔覆喔�',
+        audio: '喙�喔傅喔⑧竾',
+        video: '喔о傅喔斷复喔椸副喔ㄠ笝喙�',
+        localUpload: '喔副喔涏箓喔弗喔斷箖喔權箑喔勦福喔粪箞喔竾',
+        url: 'URL',
+      },
+      enterValue: '喔涏箟喔笝喔勦箞喔�',
+      addCondition: '喙�喔炧复喙堗浮喙�喔囙阜喙堗腑喔權箘喔�',
+      conditionNotSetup: '喙�喔囙阜喙堗腑喔權箘喔� NOT 喔曕副喙夃竾喔勦箞喔�',
+      selectVariable: '喙�喔ム阜喔竵喔曕副喔о箒喔涏福...',
+      addSubVariable: '喔曕副喔о箒喔涏福喔⑧箞喔涪',
+      select: '喙�喔ム阜喔竵',
+      condition: '喙�喔囙阜喙堗腑喔權箘喔�',
+    },
+    variableAssigner: {
+      title: '喔佮箥喔侧斧喔權笖喔曕副喔о箒喔涏福',
+      outputType: '喔涏福喔班箑喔犩笚喙�喔覆喔曕箤喔炧父喔�',
+      varNotSet: '喙勦浮喙堗箘喔斷箟喔曕副喙夃竾喔勦箞喔侧笗喔编抚喙佮笡喔�',
+      noVarTip: '喙�喔炧复喙堗浮喔曕副喔о箒喔涏福喔椸傅喙堗笀喔班竵喙嵿覆喔笝喔�',
+      type: {
+        string: '喙�喔娻阜喔竵',
+        number: '喙�喔ム競',
+        object: '喔о副喔曕笘喔�',
+        array: '喔覆喔`箤喙�喔`涪喙�',
+      },
+      aggregationGroup: '喔佮弗喔膏箞喔∴竵喔侧福喔`抚喔�',
+      aggregationGroupTip: '喔佮覆喔`箑喔涏复喔斷箖喔娻箟喔囙覆喔權竸喔膏笓喔ム副喔佮俯喔撪赴喔權傅喙夃笂喙堗抚喔⑧箖喔箟喔曕副喔о福喔о笟喔`抚喔∴笗喔编抚喙佮笡喔`釜喔侧浮喔侧福喔栢福喔о浮喔娻父喔斷笗喔编抚喙佮笡喔`斧喔ム覆喔⑧笂喔膏笖喙勦笖喙�',
+      addGroup: '喙�喔炧复喙堗浮喔佮弗喔膏箞喔�',
+      outputVars: {
+        varDescribe: '{{groupName}} 喙�喔覆喔曕箤喔炧父喔�',
+      },
+      setAssignVariable: '喔曕副喙夃竾喔勦箞喔侧笗喔编抚喙佮笡喔`竵喙嵿覆喔笝喔�',
+    },
+    assigner: {
+      'assignedVariable': '喔曕副喔о箒喔涏福喔椸傅喙堗竵喙嵿覆喔笝喔�',
+      'writeMode': '喙傕斧喔∴笖喙�喔傕傅喔⑧笝',
+      'writeModeTip': '喙傕斧喔∴笖喔溹笝喔о竵: 喙冟笂喙夃箘喔斷箟喔佮副喔氞笗喔编抚喙佮笡喔`腑喔侧福喙屶箑喔`涪喙屶箑喔椸箞喔侧笝喔编箟喔�',
+      'over-write': '喙�喔傕傅喔⑧笝 喔椸副喔�',
+      'append': '喔溹笝喔о竵',
+      'plus': '喔氞抚喔�',
+      'clear': '喙冟釜',
+      'setVariable': '喔曕副喙夃竾喔勦箞喔侧笗喔编抚喙佮笡喔�',
+      'variable': '喔曕副喔о箒喔涏福',
+      'operations': {
+        'set': '喔娻父喔�',
+        'append': '喔溹笝喔о竵',
+        '-=': '-=',
+        '*=': '*=',
+        'overwrite': '喙�喔傕傅喔⑧笝 喔椸副喔�',
+        'extend': '喔傕涪喔侧涪',
+        'title': '喔佮覆喔`笢喙堗覆喔曕副喔�',
+        'clear': '喙冟釜',
+        'over-write': '喙�喔傕傅喔⑧笝 喔椸副喔�',
+        '+=': '+=',
+        '/=': '/=',
+        'remove-last': '喔ム笟喔父喔斷笚喙夃覆喔�',
+        'remove-first': '喔ム笟喔副喔權笖喔编笟喙佮福喔�',
+      },
+      'noAssignedVars': '喙勦浮喙堗浮喔掂笗喔编抚喙佮笡喔`笚喔掂箞喔佮箥喔侧斧喔權笖',
+      'selectAssignedVariable': '喙�喔ム阜喔竵喔曕副喔о箒喔涏福喔椸傅喙堗竵喙嵿覆喔笝喔�...',
+      'variables': '喔曕副喔� 喙佮笡喔�',
+      'varNotSet': '喔曕副喔о箒喔涏福喙勦浮喙堗箘喔斷箟喔曕副喙夃竾喔勦箞喔�',
+      'assignedVarsDescription': '喔曕副喔о箒喔涏福喔椸傅喙堗竵喙嵿覆喔笝喔斷笗喙夃腑喔囙箑喔涏箛喔權笗喔编抚喙佮笡喔`笚喔掂箞喙�喔傕傅喔⑧笝喙勦笖喙� 喙�喔娻箞喔� 喔曕副喔о箒喔涏福喔佮覆喔`釜喔權笚喔權覆',
+      'noVarTip': '喔勦弗喔脆竵喔涏父喙堗浮 "+" 喙�喔炧阜喙堗腑喙�喔炧复喙堗浮喔曕副喔о箒喔涏福',
+      'setParameter': '喔曕副喙夃竾喔勦箞喔侧笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤...',
+    },
+    tool: {
+      toAuthorize: '喙�喔炧阜喙堗腑喔笝喔膏笉喔侧笗',
+      inputVars: '喔曕副喔о箒喔涏福喔复喔權笧喔膏笗',
+      outputVars: {
+        text: '喙�喔權阜喙夃腑喔覆喔椸傅喙堗釜喔`箟喔侧竾喔傕付喙夃笝喔斷箟喔о涪喙�喔勦福喔粪箞喔竾喔∴阜喔�',
+        files: {
+          title: '喙勦笩喔ム箤喔椸傅喙堗釜喔`箟喔侧竾喔傕付喙夃笝喔斷箟喔о涪喙�喔勦福喔粪箞喔竾喔∴阜喔�',
+          type: '喔涏福喔班箑喔犩笚喔佮覆喔`釜喔權副喔氞釜喔權父喔� 喔曕腑喔權笝喔掂箟喔`腑喔囙福喔编笟喙�喔夃笧喔侧赴喔`腹喔涏笭喔侧笧',
+          transfer_method: '喔о复喔樴傅喔佮覆喔`箓喔笝 喔勦箞喔侧箑喔涏箛喔� remote_url 喔福喔粪腑 local_file',
+          url: 'URL 喔傕腑喔囙福喔灌笡喔犩覆喔�',
+          upload_file_id: '喔副喔涏箓喔弗喔斷福喔副喔箘喔熰弗喙�',
+        },
+        json: '喙�喔勦福喔粪箞喔竾喔∴阜喔釜喔`箟喔侧竾 JSON',
+      },
+    },
+    questionClassifiers: {
+      model: '喙佮笟喔�',
+      inputVars: '喔曕副喔о箒喔涏福喔复喔權笧喔膏笗',
+      outputVars: {
+        className: '喔娻阜喙堗腑喔勦弗喔侧釜',
+      },
+      class: '喔涏福喔班箑喔犩笚',
+      classNamePlaceholder: '喙�喔傕傅喔⑧笝喔娻阜喙堗腑喔娻副喙夃笝喙�喔`傅喔⑧笝喔傕腑喔囙竸喔膏笓',
+      advancedSetting: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔傕副喙夃笝喔腹喔�',
+      topicName: '喔娻阜喙堗腑喔副喔о競喙夃腑',
+      topicPlaceholder: '喙�喔傕傅喔⑧笝喔娻阜喙堗腑喔副喔о競喙夃腑喔傕腑喔囙竸喔膏笓',
+      addClass: '喙�喔炧复喙堗浮喔娻副喙夃笝喙�喔`傅喔⑧笝',
+      instruction: '喔佮覆喔`釜喔笝',
+      instructionTip: '喔涏箟喔笝喔勦箥喔侧箒喔權赴喔權箥喔侧箑喔炧复喙堗浮喙�喔曕复喔∴箑喔炧阜喙堗腑喔娻箞喔о涪喙冟斧喙夃笗喔编抚喔堗箥喔侧箒喔權竵喔勦箥喔侧笘喔侧浮喙�喔傕箟喔侧箖喔堗抚喔脆笜喔掂笀喔编笖喔浮喔о笖喔浮喔灌箞喔勦箥喔侧笘喔侧浮喙勦笖喙夃笖喔掂涪喔脆箞喔囙競喔多箟喔�',
+      instructionPlaceholder: '喙�喔傕傅喔⑧笝喔勦箥喔侧箒喔權赴喔權箥喔侧競喔竾喔勦父喔�',
+    },
+    parameterExtractor: {
+      inputVar: '喔曕副喔о箒喔涏福喔复喔權笧喔膏笗',
+      extractParameters: '喙佮涪喔佮笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤',
+      importFromTool: '喔權箥喔侧箑喔傕箟喔侧笀喔侧竵喙�喔勦福喔粪箞喔竾喔∴阜喔�',
+      addExtractParameter: '喙�喔炧复喙堗浮喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤喔佮覆喔`箒喔⑧竵喔傕箟喔浮喔灌弗',
+      addExtractParameterContent: {
+        name: '喔娻阜喙堗腑',
+        namePlaceholder: '喙佮涪喔佮笂喔粪箞喔笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤',
+        type: '喔涏福喔班箑喔犩笚',
+        typePlaceholder: '喙佮涪喔佮笡喔`赴喙�喔犩笚喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤',
+        description: '喔勦赋喔笜喔脆笟喔侧涪',
+        descriptionPlaceholder: '喙佮涪喔佮竸喙嵿覆喔笜喔脆笟喔侧涪喔炧覆喔`覆喔∴复喙�喔曕腑喔`箤',
+        required: '喔曕箟喔竾喔`赴喔氞父',
+        requiredContent: 'Required 喙冟笂喙夃箑喔涏箛喔權競喙夃腑喔∴腹喔ム腑喙夃覆喔囙腑喔脆竾喔箥喔侧斧喔`副喔氞竵喔侧福喔笝喔膏浮喔侧笝喙佮笟喔氞笀喙嵿覆喔ム腑喔囙箑喔椸箞喔侧笝喔编箟喔� 喙佮弗喔班箘喔∴箞喙冟笂喙堗釜喙嵿覆喔福喔编笟喔佮覆喔`笗喔`抚喔堗釜喔笟喔勦抚喔侧浮喔栢腹喔佮笗喙夃腑喔囙競喔竾喙�喔覆喔曕箤喔炧父喔曕笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤喔椸傅喙堗笀喙嵿覆喙�喔涏箛喔�',
+      },
+      extractParametersNotSet: '喙勦浮喙堗箘喔斷箟喔曕副喙夃竾喔勦箞喔侧笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤喔佮覆喔`箒喔⑧竵喔傕箟喔浮喔灌弗',
+      instruction: '喔佮覆喔`釜喔笝',
+      instructionTip: '喔涏箟喔笝喔勦箥喔侧箒喔權赴喔權箥喔侧箑喔炧复喙堗浮喙�喔曕复喔∴箑喔炧阜喙堗腑喔娻箞喔о涪喙冟斧喙夃笗喔编抚喙佮涪喔佮笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤喙�喔傕箟喔侧箖喔堗抚喔脆笜喔掂竵喔侧福喙佮涪喔佮笧喔侧福喔侧浮喔脆箑喔曕腑喔`箤',
+      advancedSetting: '喔佮覆喔`笗喔编箟喔囙竸喙堗覆喔傕副喙夃笝喔腹喔�',
+      reasoningMode: '喙傕斧喔∴笖喔佮覆喔`箖喔箟喙�喔笗喔膏笢喔�',
+      reasoningModeTip: '喔勦父喔撪釜喔侧浮喔侧福喔栢箑喔ム阜喔竵喙傕斧喔∴笖喔佮覆喔`箖喔箟喙�喔笗喔膏笢喔ム笚喔掂箞喙�喔浮喔侧赴喔浮喔曕覆喔∴竸喔о覆喔∴釜喔侧浮喔侧福喔栢競喔竾喙傕浮喙�喔斷弗喙冟笝喔佮覆喔`笗喔笟喔笝喔竾喔曕箞喔竸喙嵿覆喙佮笝喔班笝喙嵿覆喔箥喔侧斧喔`副喔氞竵喔侧福喙�喔`傅喔⑧竵喙冟笂喙夃笩喔编竾喔佮箤喔娻副喔權斧喔`阜喔競喙夃腑喔勦抚喔侧浮喙佮笀喙夃竾',
+      isSuccess: '喔勦阜喔� Success 喙�喔∴阜喙堗腑喔箥喔侧箑喔`箛喔堗竸喙堗覆喔勦阜喔� 1 喙�喔∴阜喙堗腑喔ム箟喔∴箑喔弗喔о竸喙堗覆喙�喔涏箛喔� 0',
+      errorReason: '喔覆喙�喔笗喔膏競喙夃腑喔溹复喔斷笧喔ム覆喔�',
+    },
+    iteration: {
+      deleteTitle: '喔ム笟喙傕斧喔權笖喔佮覆喔`笚喙嵿覆喔嬥箟喙嵿覆?',
+      deleteDesc: '喔佮覆喔`弗喔氞箓喔笝喔斷竵喔侧福喔о笝喔嬥箟喙嵿覆喔堗赴喙�喔涏箛喔權竵喔侧福喔ム笟喙傕斧喔權笖喔⑧箞喔涪喔椸副喙夃竾喔浮喔�',
+      input: '喔复喔權笧喔膏笗',
+      output: '喔曕副喔о箒喔涏福喙�喔覆喔曕箤喔炧父喔�',
+      iteration_one: '{{喔權副喔殅} 喙�喔佮复喔� 喔嬥箟喔�',
+      iteration_other: '{{喔權副喔殅} 喙�喔佮复喔� 喔嬥箟喔�',
+      currentIteration: '喔佮覆喔`笚喙嵿覆喔嬥箟喙嵿覆喔涏副喔堗笀喔膏笟喔编笝',
+      comma: ',',
+      error_one: '{{喔權副喔殅} 喔勦抚喔侧浮喔溹复喔斷笧喔ム覆喔�',
+      error_other: '{{喔權副喔殅} 喔傕箟喔� 喔溹复喔� 喔炧弗喔侧笖',
+      parallelMode: '喙傕斧喔∴笖喔傕笝喔侧笝',
+      parallelModeUpper: '喙傕斧喔∴笖喔傕笝喔侧笝',
+      parallelModeEnableTitle: '喙�喔涏复喔斷箖喔娻箟喔囙覆喔權箓喔浮喔斷競喔權覆喔�',
+      parallelModeEnableDesc: '喙冟笝喙傕斧喔∴笖喔傕笝喔侧笝 喔囙覆喔權笭喔侧涪喙冟笝喔佮覆喔`笚喙嵿覆喔嬥箟喙嵿覆喔堗赴喔笝喔编笟喔笝喔膏笝喔佮覆喔`笖喙嵿覆喙�喔權复喔權竵喔侧福喙佮笟喔氞競喔權覆喔� 喔勦父喔撪釜喔侧浮喔侧福喔栢竵喙嵿覆喔笝喔斷竸喙堗覆喔權傅喙夃箘喔斷箟喙冟笝喙佮笢喔囙竸喔膏笓喔浮喔氞副喔曕复喔椸覆喔囙笖喙夃覆喔權競喔о覆',
+      parallelPanelDesc: '喙冟笝喙傕斧喔∴笖喔傕笝喔侧笝 喔囙覆喔權箖喔權竵喔侧福喔о笝喔嬥箟喙嵿覆喔堗赴喔笝喔编笟喔笝喔膏笝喔佮覆喔`笖喙嵿覆喙�喔權复喔權竵喔侧福喙佮笟喔氞競喔權覆喔�',
+      MaxParallelismTitle: '喔勦抚喔侧浮喔傕笝喔侧笝喔腹喔囙釜喔膏笖',
+      MaxParallelismDesc: '喔勦抚喔侧浮喔傕笝喔侧笝喔腹喔囙釜喔膏笖喙冟笂喙夃箑喔炧阜喙堗腑喔勦抚喔氞竸喔膏浮喔堗箥喔侧笝喔о笝喔囙覆喔權笚喔掂箞喔斷箥喔侧箑喔權复喔權竵喔侧福喔炧福喙夃腑喔∴竵喔编笝喙冟笝喔佮覆喔`笚喙嵿覆喔嬥箟喙嵿覆喔勦福喔编箟喔囙箑喔斷傅喔⑧抚',
+      errorResponseMethod: '喔о复喔樴傅喔佮覆喔`笗喔笟喔笝喔竾喔傕箟喔笢喔脆笖喔炧弗喔侧笖',
+      ErrorMethod: {
+        operationTerminated: '喔⑧竵 喙�喔ム复喔�',
+        continueOnError: '喔斷箥喔侧箑喔權复喔權竵喔侧福喔曕箞喔箑喔∴阜喙堗腑喙�喔佮复喔斷競喙夃腑喔溹复喔斷笧喔ム覆喔�',
+        removeAbnormalOutput: '喔ム笟喙�喔覆喔曕箤喔炧父喔曕笚喔掂箞喔溹复喔斷笡喔佮笗喔�',
+      },
+      answerNodeWarningDesc: '喔勦箥喔侧箑喔曕阜喔笝喙傕斧喔∴笖喔勦腹喙堗競喔權覆喔�: 喙傕斧喔權笖喔勦箥喔侧笗喔笟 喔佮覆喔`竵喙嵿覆喔笝喔斷笗喔编抚喙佮笡喔`竵喔侧福喔笝喔椸笝喔� 喙佮弗喔班竵喔侧福喔斷箥喔侧箑喔權复喔權竵喔侧福喔箞喔侧笝/喙�喔傕傅喔⑧笝喙佮笟喔氞笘喔侧抚喔`笭喔侧涪喙冟笝喔佮覆喔`抚喔權笅喙夃箥喔侧腑喔侧笀喔椸箥喔侧箖喔箟喙�喔佮复喔斷競喙夃腑喔⑧竵喙�喔о箟喔�',
+    },
+    note: {
+      addNote: '喙�喔炧复喙堗浮喔浮喔侧涪喙�喔笗喔�',
+      editor: {
+        placeholder: '喙�喔傕傅喔⑧笝喔氞副喔權笚喔多竵喔傕腑喔囙竸喔膏笓...',
+        small: '喙�喔ム箛喔�',
+        medium: '喔涏覆喔權竵喔ム覆喔�',
+        large: '喙冟斧喔嵿箞',
+        bold: '喔佮弗喙夃覆',
+        italic: '喔曕副喔о箑喔傅喔⑧竾',
+        strikethrough: '喔傕傅喔斷笚喔编笟',
+        link: '喔ム复喔囙竵喙�',
+        openLink: '喙�喔涏复喔�',
+        unlink: '喔⑧竵 喙�喔ム复喔�',
+        enterUrl: '喔涏箟喔笝 URL...',
+        invalidUrl: 'URL 喙勦浮喙堗笘喔灌竵喔曕箟喔竾',
+        bulletList: '喔`覆喔⑧竵喔侧福喔副喔嵿弗喔编竵喔┼笓喙屶箒喔笖喔囙斧喔编抚喔傕箟喔涪喙堗腑喔�',
+        showAuthor: '喙佮釜喔斷竾喔溹腹喙夃箑喔傕傅喔⑧笝',
+      },
+    },
+    docExtractor: {
+      inputVar: '喔曕副喔о箒喔涏福喔复喔權笧喔膏笗',
+      outputVars: {
+        text: '喔傕箟喔竸喔о覆喔∴笚喔掂箞喙佮涪喔佮腑喔竵喔∴覆',
+      },
+      supportFileTypes: '喔涏福喔班箑喔犩笚喙勦笩喔ム箤喔椸傅喙堗福喔竾喔`副喔�: {{types}}',
+      learnMore: '喔ㄠ付喔佮俯喔侧箑喔炧复喙堗浮喙�喔曕复喔�',
+    },
+    listFilter: {
+      inputVar: '喔曕副喔о箒喔涏福喔复喔權笧喔膏笗',
+      filterCondition: '喙�喔囙阜喙堗腑喔權箘喔傕竵喔侧福喔佮福喔竾',
+      filterConditionKey: '喔勦傅喔⑧箤喙�喔囙阜喙堗腑喔權箘喔傕笗喔编抚喔佮福喔竾',
+      extractsCondition: '喙佮涪喔佮福喔侧涪喔佮覆喔� N',
+      filterConditionComparisonOperator: '喔曕副喔о笖喙嵿覆喙�喔權复喔權竵喔侧福喙�喔涏福喔掂涪喔氞箑喔椸傅喔⑧笟喙�喔囙阜喙堗腑喔權箘喔傕笗喔编抚喔佮福喔竾',
+      filterConditionComparisonValue: '喔勦箞喔侧箑喔囙阜喙堗腑喔權箘喔傕笗喔编抚喔佮福喔竾',
+      selectVariableKeyPlaceholder: '喙�喔ム阜喔竵喔勦傅喔⑧箤喔曕副喔о箒喔涏福喔⑧箞喔涪',
+      limit: '喔斷箟喔侧笝喔氞笝 N',
+      orderBy: '喔副喙堗竾喔嬥阜喙夃腑喙傕笖喔�',
+      asc: '喙�喔箑喔釜喔嬥傅',
+      desc: '喔腹喔� 喔父喔�',
+      outputVars: {
+        result: '喔佮福喔竾喔溹弗喔ム副喔炧笜喙�',
+        first_record: '喔氞副喔權笚喔多竵喙佮福喔�',
+        last_record: '喔氞副喔權笚喔多竵喔ム箞喔侧釜喔膏笖',
+      },
+    },
+    agent: {
+      strategy: {
+        label: '喔佮弗喔⑧父喔椸笜喙屶笗喔编抚喙佮笚喔�',
+        tooltip: '喔佮弗喔⑧父喔椸笜喙� Agentic 喔椸傅喙堗箒喔曕竵喔曕箞喔侧竾喔佮副喔權竵喙嵿覆喔笝喔斷抚喔脆笜喔掂笚喔掂箞喔`赴喔氞笟喔о覆喔囙箒喔溹笝喙佮弗喔班笖喙嵿覆喙�喔權复喔權竵喔侧福喙�喔`傅喔⑧竵喙冟笂喙夃箑喔勦福喔粪箞喔竾喔∴阜喔斧喔ム覆喔⑧競喔编箟喔權笗喔笝',
+        configureTipDesc: '喔弗喔编竾喔堗覆喔佮竵喙嵿覆喔笝喔斷竸喙堗覆喔佮弗喔⑧父喔椸笜喙屶笗喔编抚喙佮笚喔權箓喔笝喔斷笝喔掂箟喔堗赴喙傕斧喔ム笖喔佮覆喔`竵喙嵿覆喔笝喔斷竸喙堗覆喔椸傅喙堗箑喔弗喔粪腑喙傕笖喔⑧腑喔编笗喙傕笝喔∴副喔曕复 喔佮弗喔⑧父喔椸笜喙屶笀喔班釜喙堗竾喔溹弗喔曕箞喔竵喔ム箘喔佮竵喔侧福喙冟斧喙夃箑喔笗喔膏笢喔ム競喔竾喙�喔勦福喔粪箞喔竾喔∴阜喔斧喔ム覆喔⑧競喔编箟喔權笗喔笝',
+        configureTip: '喙傕笡喔`笖喔佮箥喔侧斧喔權笖喔勦箞喔侧竵喔ム涪喔膏笚喔樴箤喙�喔箑喔堗笝喔曕箤',
+        searchPlaceholder: '喔佮弗喔⑧父喔椸笜喙屶笗喔编抚喙佮笚喔權竵喔侧福喔勦箟喔權斧喔�',
+        selectTip: '喙�喔ム阜喔竵喔佮弗喔⑧父喔椸笜喙屶笗喔编抚喙佮笚喔�',
+        shortLabel: '喔⑧父喔椸笜喔ㄠ覆喔笗喔`箤',
+      },
+      pluginInstaller: {
+        installing: '喔曕复喔� 喔曕副喙夃竾',
+        install: '喔曕复喔斷笗喔编箟喔�',
+      },
+      modelNotInMarketplace: {
+        desc: '喙傕浮喙�喔斷弗喔權傅喙夃笗喔脆笖喔曕副喙夃竾喔堗覆喔佮笚喔掂箞喙�喔佮箛喔氞箖喔權箑喔勦福喔粪箞喔竾喔福喔粪腑 GitHub 喔佮福喔膏笓喔侧箖喔娻箟喔弗喔编竾喔佮覆喔`笗喔脆笖喔曕副喙夃竾',
+        title: '喙勦浮喙堗箘喔斷箟喔曕复喔斷笗喔编箟喔囙福喔膏箞喔�',
+        manageInPlugins: '喔堗副喔斷竵喔侧福喙冟笝喔涏弗喔编箠喔佮腑喔脆笝',
+      },
+      modelNotSupport: {
+        descForVersionSwitch: '喙�喔о腑喔`箤喔娻副喔權笡喔ム副喙娻竵喔复喔權笚喔掂箞喔曕复喔斷笗喔编箟喔囙箘喔∴箞喔∴傅喔`父喙堗笝喔權傅喙� 喔勦弗喔脆竵喙�喔炧阜喙堗腑喙�喔涏弗喔掂箞喔⑧笝喙�喔о腑喔`箤喔娻副喔�',
+        title: '喔`父喙堗笝喔椸傅喙堗箘喔∴箞喔`腑喔囙福喔编笟',
+        desc: '喙�喔о腑喔`箤喔娻副喔權笡喔ム副喙娻竵喔复喔權笚喔掂箞喔曕复喔斷笗喔编箟喔囙箘喔∴箞喔∴傅喔`父喙堗笝喔權傅喙�',
+      },
+      modelSelectorTooltips: {
+        deprecated: '喙傕浮喙�喔斷弗喔權傅喙夃箑喔ム复喔佮箖喔娻箟喙佮弗喙夃抚',
+      },
+      outputVars: {
+        files: {
+          transfer_method: '喔о复喔樴傅喔佮覆喔`箓喔笝 喔勦箞喔侧箑喔涏箛喔� remote_url 喔福喔粪腑 local_file',
+          upload_file_id: '喔副喔涏箓喔弗喔斷福喔副喔箘喔熰弗喙�',
+          url: 'URL 喔傕腑喔囙福喔灌笡喔犩覆喔�',
+          title: '喙勦笩喔ム箤喔椸傅喙堗釜喔`箟喔侧竾喔曕副喔о箒喔椸笝',
+          type: '喔涏福喔班箑喔犩笚喔佮覆喔`釜喔權副喔氞釜喔權父喔� 喔曕腑喔權笝喔掂箟喔`腑喔囙福喔编笟喙�喔夃笧喔侧赴喔`腹喔涏笭喔侧笧',
+        },
+        text: '喙�喔權阜喙夃腑喔覆喔椸傅喙堗釜喔`箟喔侧竾喔曕副喔о箒喔椸笝',
+        json: '喔曕副喔о箒喔椸笝喔福喙夃覆喔� JSON',
+      },
+      checkList: {
+        strategyNotSelected: '喙勦浮喙堗箘喔斷箟喙�喔ム阜喔竵喔佮弗喔⑧父喔椸笜喙�',
+      },
+      installPlugin: {
+        changelog: '喔氞副喔權笚喔多竵喔佮覆喔`箑喔涏弗喔掂箞喔⑧笝喙佮笡喔ム竾',
+        install: '喔曕复喔斷笗喔编箟喔�',
+        desc: '喙�喔佮傅喙堗涪喔о竵喔编笟喔佮覆喔`笗喔脆笖喔曕副喙夃竾喔涏弗喔编箠喔佮腑喔脆笝喔曕箞喔箘喔涏笝喔掂箟',
+        title: '喔曕复喔斷笗喔编箟喔囙笡喔ム副喙娻竵喔复喔�',
+        cancel: '喔⑧竵喙�喔ム复喔�',
+      },
+      toolbox: '喙�喔勦福喔粪箞喔竾 喔∴阜喔�',
+      maxIterations: '喔佮覆喔`笚喙嵿覆喔嬥箟喙嵿覆喔腹喔囙釜喔膏笖',
+      strategyNotFoundDescAndSwitchVersion: '喙�喔о腑喔`箤喔娻副喔權笡喔ム副喙娻竵喔复喔權笚喔掂箞喔曕复喔斷笗喔编箟喔囙箘喔∴箞喔∴傅喔佮弗喔⑧父喔椸笜喙屶笝喔掂箟 喔勦弗喔脆竵喙�喔炧阜喙堗腑喙�喔涏弗喔掂箞喔⑧笝喙�喔о腑喔`箤喔娻副喔�',
+      pluginNotInstalledDesc: '喔涏弗喔编箠喔佮腑喔脆笝喔權傅喙夃笗喔脆笖喔曕副喙夃竾喔堗覆喔� GitHub 喙傕笡喔`笖喙勦笡喔椸傅喙堗笡喔ム副喙娻竵喔复喔權箑喔炧阜喙堗腑喔曕复喔斷笗喔编箟喔囙箖喔浮喙�',
+      pluginNotInstalled: '喙勦浮喙堗箘喔斷箟喔曕复喔斷笗喔编箟喔囙笡喔ム副喙娻竵喔复喔權笝喔掂箟',
+      toolNotInstallTooltip: '{{tool}} 喙勦浮喙堗箘喔斷箟喔曕复喔斷笗喔编箟喔�',
+      modelNotInstallTooltip: '喙勦浮喙堗箘喔斷箟喔曕复喔斷笗喔编箟喔囙福喔膏箞喔權笝喔掂箟',
+      model: '喙佮笟喔�',
+      strategyNotFoundDesc: '喙�喔о腑喔`箤喔娻副喔權笡喔ム副喙娻竵喔复喔權笚喔掂箞喔曕复喔斷笗喔编箟喔囙箘喔∴箞喔∴傅喔佮弗喔⑧父喔椸笜喙屶笝喔掂箟',
+      toolNotAuthorizedTooltip: '{{喙�喔勦福喔粪箞喔竾喔∴阜喔瓆} 喙勦浮喙堗箘喔斷箟喔`副喔氞腑喔權父喔嵿覆喔�',
+      unsupportedStrategy: '喔佮弗喔⑧父喔椸笜喙屶笚喔掂箞喙勦浮喙堗福喔竾喔`副喔�',
+      strategyNotSet: '喙勦浮喙堗箘喔斷箟喔曕副喙夃竾喔勦箞喔侧竵喔ム涪喔膏笚喔樴箤喔曕副喔о箒喔椸笝',
+      learnMore: '喔ㄠ付喔佮俯喔侧箑喔炧复喙堗浮喙�喔曕复喔�',
+      pluginNotFoundDesc: '喔涏弗喔编箠喔佮腑喔脆笝喔權傅喙夃笗喔脆笖喔曕副喙夃竾喔堗覆喔� GitHub 喙傕笡喔`笖喙勦笡喔椸傅喙堗笡喔ム副喙娻竵喔复喔權箑喔炧阜喙堗腑喔曕复喔斷笗喔编箟喔囙箖喔浮喙�',
+      notAuthorized: '喙勦浮喙堗箘喔斷箟喔`副喔氞腑喔權父喔嵿覆喔�',
+      configureModel: '喔佮箥喔侧斧喔權笖喔勦箞喔侧箒喔氞笟喔堗箥喔侧弗喔竾',
+      strategyNotInstallTooltip: '{{strategy}} 喙勦浮喙堗箘喔斷箟喔曕复喔斷笗喔编箟喔�',
+      tools: '喙�喔勦福喔粪箞喔竾 喔∴阜喔�',
+      modelNotSelected: '喙勦浮喙堗箘喔斷箟喙�喔ム阜喔竵喔`父喙堗笝',
+      linkToPlugin: '喔ム复喔囙竵喙屶箘喔涏涪喔编竾喔涏弗喔编箠喔佮腑喔脆笝',
+    },
+    loop: {
+      ErrorMethod: {
+        removeAbnormalOutput: '喔ム笟喔溹弗喔ム副喔炧笜喙屶笚喔掂箞喔溹复喔斷笡喔佮笗喔�',
+        operationTerminated: '喔栢腹喔佮涪喔佮箑喔ム复喔�',
+        continueOnError: '喔斷赋喙�喔權复喔權竵喔侧福喔曕箞喔箑喔∴阜喙堗腑喔∴傅喔傕箟喔笢喔脆笖喔炧弗喔侧笖',
+      },
+      breakCondition: '喙�喔囙阜喙堗腑喔權箘喔傕竵喔侧福喔涪喔膏笖喔ム腹喔�',
+      output: '喔曕副喔о箒喔涏福喙�喔覆喔椸箤喔炧父喔�',
+      error_one: '{{count}} 喔傕箟喔笢喔脆笖喔炧弗喔侧笖',
+      loop_one: '{{count}} 喔ム腹喔�',
+      loopMaxCount: '喔堗赋喔權抚喔權福喔笟喔腹喔囙釜喔膏笖',
+      errorResponseMethod: '喔о复喔樴傅喔佮覆喔`笗喔笟喔笝喔竾喔傕箟喔笢喔脆笖喔炧弗喔侧笖',
+      loopVariables: '喔曕副喔о箒喔涏福喔ム腹喔�',
+      deleteDesc: '喔佮覆喔`弗喔氞箓喔笝喔斷弗喔灌笡喔堗赴喔ム笟喙傕斧喔權笖喔ム腹喔佮笚喔编箟喔囙斧喔∴笖',
+      deleteTitle: '喔ム笟喙傕斧喔權笖喔ム腹喔涏斧喔`阜喔箘喔∴箞?',
+      error_other: '{{count}} 喔傕箟喔笢喔脆笖喔炧弗喔侧笖',
+      loop_other: '{{count}} 喔`腑喔�',
+      loopMaxCountError: '喔佮福喔膏笓喔侧箖喔箞喔堗赋喔權抚喔權福喔笟喔腹喔囙釜喔膏笖喔椸傅喙堗笘喔灌竵喔曕箟喔竾 喔嬥付喙堗竾喔涪喔灌箞喔`赴喔抚喙堗覆喔� 1 喔栢付喔� {{maxCount}}',
+      comma: ',',
+      loopNode: '喔權箛喔笖喔ム腹喔�',
+      totalLoopCount: '喔堗赋喔權抚喔權福喔笟喔椸副喙夃竾喔浮喔�: {{count}}',
+      setLoopVariables: '喔佮赋喔笝喔斷笗喔编抚喙佮笡喔`笭喔侧涪喙冟笝喔傕腑喔氞箑喔傕笗喔傕腑喔囙弗喔灌笡',
+      input: '喔佮覆喔`笡喙夃腑喔權競喙夃腑喔∴腹喔�',
+      finalLoopVariables: '喔曕副喔о箒喔涏福喙冟笝喔ム腹喔涏釜喔膏笖喔椸箟喔侧涪',
+      inputMode: '喙傕斧喔∴笖喔佮覆喔`笝喔赤箑喔傕箟喔�',
+      currentLoop: '喔о竾喔堗福喔涏副喔堗笀喔膏笟喔编笝',
+      initialLoopVariables: '喔曕副喔о箒喔涏福喙冟笝喔ム腹喔涏箑喔`复喙堗浮喔曕箟喔�',
+      currentLoopCount: '喔堗赋喔權抚喔權福喔笟喔涏副喔堗笀喔膏笟喔编笝: {{count}}',
+      variableName: '喔娻阜喙堗腑 喔曕副喔о箒喔涏福',
+      exitConditionTip: '喙傕斧喔權笖喔ム腹喔涏笗喙夃腑喔囙浮喔掂箑喔囙阜喙堗腑喔權箘喔傕竵喔侧福喔腑喔佮腑喔⑧箞喔侧竾喔權箟喔涪喔笝喔多箞喔囙箑喔囙阜喙堗腑喔權箘喔�',
+      breakConditionTip: '喙佮竸喙堗笗喔编抚喙佮笡喔`笭喔侧涪喙冟笝喔ム腹喔涏笚喔掂箞喔∴傅喙�喔囙阜喙堗腑喔權箘喔傕竵喔侧福喔复喙夃笝喔父喔斷箒喔ム赴喔曕副喔о箒喔涏福喔赋喔福喔编笟喔佮覆喔`釜喔權笚喔權覆喙�喔椸箞喔侧笝喔编箟喔權笚喔掂箞喔覆喔∴覆喔`笘喔箟喔侧竾喔复喔囙箘喔斷箟.',
+    },
+  },
+  tracing: {
+    stopBy: '喙佮抚喔班笚喔掂箞 {{user}}',
+  },
+  variableReference: {
+    conversationVars: '喔曕副喔о箒喔涏福喔佮覆喔`釜喔權笚喔權覆',
+    noVarsForOperation: '喙勦浮喙堗浮喔掂笗喔编抚喙佮笡喔`笚喔掂箞喔炧福喙夃腑喔∴箖喔娻箟喔囙覆喔權釜喙嵿覆喔福喔编笟喔佮覆喔`竵喙嵿覆喔笝喔斷笖喙夃抚喔⑧竵喔侧福喔斷箥喔侧箑喔權复喔權竵喔侧福喔椸傅喙堗箑喔ム阜喔竵',
+    noAvailableVars: '喙勦浮喙堗浮喔掂笗喔编抚喙佮笡喔`笚喔掂箞喙冟笂喙夃箘喔斷箟',
+    assignedVarsDescription: '喔曕副喔о箒喔涏福喔椸傅喙堗竵喙嵿覆喔笝喔斷笗喙夃腑喔囙箑喔涏箛喔權笗喔编抚喙佮笡喔`笚喔掂箞喙�喔傕傅喔⑧笝喙勦笖喙� 喙�喔娻箞喔�',
+    noAssignedVars: '喙勦浮喙堗浮喔掂笗喔编抚喙佮笡喔`笚喔掂箞喔佮箥喔侧斧喔權笖',
+  },
+  versionHistory: {
+    filter: {
+      onlyYours: '喙�喔炧傅喔⑧竾喔傕腑喔囙竸喔膏笓喙�喔椸箞喔侧笝喔编箟喔�',
+      empty: '喙勦浮喙堗笧喔氞笡喔`赴喔о副喔曕复喔佮覆喔`箑喔о腑喔`箤喔娻副喔權笚喔掂箞喔曕福喔囙竵喔编笝',
+      onlyShowNamedVersions: '喙佮釜喔斷竾喙�喔夃笧喔侧赴喔`父喙堗笝喔椸傅喙堗笗喔编箟喔囙笂喔粪箞喔�',
+      all: '喔椸副喙夃竾喔浮喔�',
+      reset: '喔`傅喙�喔嬥箛喔曕笗喔编抚喔佮福喔竾',
+    },
+    editField: {
+      releaseNotes: '喔氞副喔權笚喔多竵喔佮覆喔`箑喔涏复喔斷笗喔编抚',
+      releaseNotesLengthLimit: '喔浮喔侧涪喙�喔笗喔膏竵喔侧福喔涏弗喙堗腑喔⑧箘喔∴箞喔覆喔∴覆喔`笘喙�喔佮复喔� {{limit}} 喔曕副喔о腑喔编竵喔┼福',
+      titleLengthLimit: '喔娻阜喙堗腑喙�喔`阜喙堗腑喔囙笗喙夃腑喔囙箘喔∴箞喙�喔佮复喔� {{limit}} 喔曕副喔о腑喔编竵喔┼福',
+      title: '喔娻阜喙堗腑喙�喔`阜喙堗腑喔�',
+    },
+    action: {
+      updateFailure: '喙勦浮喙堗釜喔侧浮喔侧福喔栢腑喔编笡喙�喔斷笗喙�喔о腑喔`箤喔娻副喔權箘喔斷箟',
+      deleteFailure: '喔ム笟喙�喔о腑喔`箤喔娻副喔權箘喔∴箞喔赋喙�喔`箛喔�',
+      deleteSuccess: '喙�喔о腑喔`箤喔娻副喔權笘喔灌竵喔ム笟',
+      restoreSuccess: '喙�喔о腑喔`箤喔娻副喔權笚喔掂箞喔佮腹喙夃竸喔粪笝',
+      restoreFailure: '喙勦浮喙堗釜喔侧浮喔侧福喔栢竵喔灌箟喔勦阜喔權箑喔о腑喔`箤喔娻副喔權箘喔斷箟',
+      updateSuccess: '喔副喔涏箑喔斷笗喙�喔о腑喔`箤喔娻副喔�',
+    },
+    releaseNotesPlaceholder: '喔笜喔脆笟喔侧涪喔о箞喔侧釜喔脆箞喔囙笚喔掂箞喙�喔涏弗喔掂箞喔⑧笝喙佮笡喔ム竾喙勦笡喔勦阜喔腑喔班箘喔�',
+    currentDraft: '喔`箞喔侧竾喔涏副喔堗笀喔膏笟喔编笝',
+    editVersionInfo: '喙佮竵喙夃箘喔傕競喙夃腑喔∴腹喔ム箑喔о腑喔`箤喔娻副喔�',
+    restorationTip: '喔弗喔编竾喔堗覆喔佮竵喔侧福喔佮腹喙夃竸喔粪笝喙�喔о腑喔`箤喔娻副喔權箒喔ム箟喔� 喔`箞喔侧竾喔涏副喔堗笀喔膏笟喔编笝喔堗赴喔栢腹喔佮箑喔傕傅喔⑧笝喔椸副喔�.',
+    defaultName: '喙�喔о腑喔`箤喔娻副喔權笚喔掂箞喙勦浮喙堗浮喔掂笂喔粪箞喔�',
+    deletionTip: '喔佮覆喔`弗喔氞箘喔∴箞喔覆喔∴覆喔`笘喔⑧箟喔笝喔佮弗喔编笟喙勦笖喙� 喔佮福喔膏笓喔侧涪喔粪笝喔⑧副喔�.',
+    nameThisVersion: '喔娻阜喙堗腑喙�喔о腑喔`箤喔娻副喔權笝喔掂箟',
+    title: '喙�喔о腑喔`箤喔娻副喔�',
+    latest: '喔ム箞喔侧釜喔膏笖',
+  },
+}
+
+export default translation
diff --git a/i18n/tr-TR/app-annotation.ts b/i18n/tr-TR/app-annotation.ts
new file mode 100644
index 0000000..bcd6db1
--- /dev/null
+++ b/i18n/tr-TR/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: 'Ek A莽谋klamalar',
+  name: 'Ek A莽谋klama Yan谋t谋',
+  editBy: '{{author}} taraf谋ndan d眉zenlendi',
+  noData: {
+    title: 'Ek a莽谋klama yok',
+    description: 'Uygulama hata ay谋klamas谋 s谋ras谋nda ek a莽谋klamalar谋 d眉zenleyebilir veya y眉ksek kaliteli bir yan谋t i莽in burada toplu olarak ek a莽谋klamalar谋 i莽e aktarabilirsiniz.',
+  },
+  table: {
+    header: {
+      question: 'soru',
+      answer: 'cevap',
+      createdAt: 'olu艧turulma tarihi',
+      hits: 'vuru艧lar',
+      actions: 'aksiyonlar',
+      addAnnotation: 'Ek A莽谋klama Ekle',
+      bulkImport: 'Toplu 陌莽e Aktarma',
+      bulkExport: 'Toplu D谋艧a Aktarma',
+      clearAll: 'T眉m Ek A莽谋klamalar谋 Temizle',
+    },
+  },
+  editModal: {
+    title: 'Ek A莽谋klama Yan谋t谋n谋 D眉zenle',
+    queryName: 'Kullan谋c谋 Sorgusu',
+    answerName: 'Storyteller Bot',
+    yourAnswer: 'Senin Cevab谋n',
+    answerPlaceholder: 'Cevab谋n谋z谋 buraya yaz谋n',
+    yourQuery: 'Senin Sorgun',
+    queryPlaceholder: 'Sorgunuzu buraya yaz谋n',
+    removeThisCache: 'Bu Ek A莽谋klamay谋 Kald谋r',
+    createdAt: 'Olu艧turulma Tarihi',
+  },
+  addModal: {
+    title: 'Ek A莽谋klama Yant谋 Ekle',
+    queryName: 'Soru',
+    answerName: 'Cevap',
+    answerPlaceholder: 'Cevab谋 buraya yaz谋n',
+    queryPlaceholder: 'Sorguyu buraya yaz谋n',
+    createNext: 'Ba艧ka bir ek a莽谋klamal谋 yan谋t ekle',
+  },
+  batchModal: {
+    title: 'Toplu 陌莽e Aktarma',
+    csvUploadTitle: 'CSV dosyan谋z谋 buraya s眉r眉kleyip b谋rak谋n veya ',
+    browse: 'g枚zat谋n',
+    tip: 'CSV dosyas谋 a艧a臒谋daki yap谋ya uygun olmal谋d谋r:',
+    question: 'soru',
+    answer: 'cevap',
+    contentTitle: 'i莽erik par莽as谋',
+    content: 'i莽erik',
+    template: '艦ablonu buradan indir',
+    cancel: '陌ptal',
+    run: 'Toplu 陌艧lemi 脟al谋艧t谋r',
+    runError: 'Toplu i艧lem ba艧ar谋s谋z oldu',
+    processing: 'Toplu i艧lemde',
+    completed: '陌莽e aktarma tamamland谋',
+    error: '陌莽e Aktarma Hatas谋',
+    ok: 'Tamam',
+  },
+  errorMessage: {
+    answerRequired: 'Cevap gerekli',
+    queryRequired: 'Soru gerekli',
+  },
+  viewModal: {
+    annotatedResponse: 'Ek A莽谋klama Yan谋t谋',
+    hitHistory: 'Vuru艧 Ge莽mi艧i',
+    hit: 'Vuru艧',
+    hits: 'Vuru艧lar',
+    noHitHistory: 'Vuru艧 ge莽mi艧i yok',
+  },
+  hitHistoryTable: {
+    query: 'Sorgu',
+    match: 'E艧le艧me',
+    response: 'Yan谋t',
+    source: 'Kaynak',
+    score: 'Puan',
+    time: 'Zaman',
+  },
+  initSetup: {
+    title: 'Ek A莽谋klama Yan谋t谋 陌lk Kurulum',
+    configTitle: 'Ek A莽谋klama Yan谋t谋 Ayar谋',
+    confirmBtn: 'Kaydet ve Etkinle艧tir',
+    configConfirmBtn: 'Kaydet',
+  },
+  embeddingModelSwitchTip: 'Ek a莽谋klama metin vekt枚rle艧tirme modeli, model de臒i艧tirmek yeniden yerle艧tirilecek ve ek maliyetlere yol a莽acakt谋r.',
+}
+
+export default translation
diff --git a/i18n/tr-TR/app-api.ts b/i18n/tr-TR/app-api.ts
new file mode 100644
index 0000000..9416309
--- /dev/null
+++ b/i18n/tr-TR/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'API Sunucusu',
+  apiKey: 'API Anahtar谋',
+  status: 'Durum',
+  disabled: 'Devre D谋艧谋',
+  ok: 'Hizmette',
+  copy: 'Kopyala',
+  copied: 'Kopyaland谋',
+  play: 'Oynat',
+  pause: 'Duraklat',
+  playing: 'Oynat谋l谋yor',
+  loading: 'Y眉kleniyor',
+  merMaid: {
+    rerender: 'Yeniden 陌艧leme',
+  },
+  never: 'Asla',
+  apiKeyModal: {
+    apiSecretKey: 'API Gizli Anahtar',
+    apiSecretKeyTips: 'API suiistimalini 枚nlemek i莽in, API Anahtar谋n谋z谋 koruyunuz. 脰n u莽 kodda d眉z metin olarak kullanmaktan ka莽谋n谋n. :)',
+    createNewSecretKey: 'Yeni Gizli Anahtar Olu艧tur',
+    secretKey: 'Gizli Anahtar',
+    created: 'OLU艦TURULDU',
+    lastUsed: 'SON KULLANIM',
+    generateTips: 'Bu anahtar谋 g眉venli ve eri艧ilebilir bir yerde saklay谋n.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: 'Bu gizli anahtar谋 silmek istiyor musunuz?',
+    deleteConfirmTips: 'Bu i艧lem geri al谋namaz.',
+    ok: 'Tamam',
+  },
+  completionMode: {
+    title: 'Completion Uygulama API',
+    info: 'Makale, 枚zet ve 莽eviri gibi y眉ksek kaliteli metin 眉retimi i莽in, completion-messages API\'sini kullan谋c谋 giri艧i ile birlikte kullan谋n. Metin 眉retimi, Dify Prompt Engineering\'de ayarlanan model parametrelerine ve prompt 艧ablonlar谋na dayan谋r.',
+    createCompletionApi: 'Completion Mesaj谋 Olu艧tur',
+    createCompletionApiTip: 'Soru-cevap modunu desteklemek i莽in bir Completion Mesaj谋 olu艧turun.',
+    inputsTips: '(陌ste臒e ba臒l谋) Prompt Eng\'deki de臒i艧kenlere kar艧谋l谋k gelen kullan谋c谋 giri艧 alanlar谋n谋 anahtar-de臒er 莽iftleri olarak sa臒lay谋n. Anahtar, de臒i艧ken ad谋d谋r, De臒er ise parametre de臒eridir. Alan t眉r眉 Select ise, g枚nderilen De臒er 枚nceden ayarlanm谋艧 se莽eneklerden biri olmal谋d谋r.',
+    queryTips: 'Kullan谋c谋 giri艧 metni i莽eri臒i.',
+    blocking: 'Bloke etme tipi, y眉r眉tmenin tamamlanmas谋n谋 bekleyip sonu莽lar谋 d枚nd眉rme. (S眉re莽 uzun s眉rerse istekler kesilebilir)',
+    streaming: 'Streaming d枚nd眉rmeleri. SSE (Sunucu Taraf谋ndan G枚nderilen Etkinlikler) tabanl谋 streaming d枚nd眉rme uygulamas谋.',
+    messageFeedbackApi: 'Mesaj geri bildirimi (be臒eni)',
+    messageFeedbackApiTip: 'Son kullan谋c谋lar ad谋na be臒eni veya be臒enmeme ile al谋nan mesajlar谋 de臒erlendirin. Bu veriler, G眉nl眉kler ve Ek A莽谋klamalar sayfas谋nda g枚r眉n眉r ve gelecekteki model ince ayarlar谋 i莽in kullan谋l谋r.',
+    messageIDTip: 'Mesaj Kimli臒i',
+    ratingTip: 'be臒eni veya be臒enmeme, null geri almakt谋r',
+    parametersApi: 'Uygulama parametre bilgilerini al',
+    parametersApiTip: 'De臒i艧ken adlar谋, alan adlar谋, t眉rleri ve varsay谋lan de臒erler dahil olmak 眉zere yap谋land谋r谋lm谋艧 Giri艧 parametrelerini al谋n. Genellikle bu alanlar谋 bir formda g枚r眉nt眉lemek veya istemci y眉klendikten sonra varsay谋lan de臒erleri doldurmak i莽in kullan谋l谋r.',
+  },
+  chatMode: {
+    title: 'Chat Uygulama API',
+    info: 'Soru-Cevap format谋n谋 kullanan 莽ok y枚nl眉 sohbet uygulamalar谋 i莽in, diyalogu ba艧latmak 眉zere chat-messages API\'sini 莽a臒谋r谋n. conversation_id\'yi ileterek devam eden konu艧malar谋 s眉rd眉r眉n. Yan谋t parametreleri ve 艧ablonlar谋, Dify Prompt Engineering ayarlar谋na ba臒l谋d谋r.',
+    createChatApi: 'Sohbet mesaj谋 olu艧tur',
+    createChatApiTip: 'Yeni bir konu艧ma mesaj谋 olu艧turun veya mevcut diyalo臒u devam ettirin.',
+    inputsTips: '(陌ste臒e ba臒l谋) Prompt Eng\'deki de臒i艧kenlere kar艧谋l谋k gelen kullan谋c谋 giri艧 alanlar谋n谋 anahtar-de臒er 莽iftleri olarak sa臒lay谋n. Anahtar, de臒i艧ken ad谋d谋r, De臒er ise parametre de臒eridir. Alan t眉r眉 Select ise, g枚nderilen De臒er 枚nceden ayarlanm谋艧 se莽eneklerden biri olmal谋d谋r.',
+    queryTips: 'Kullan谋c谋 giri艧i/soru i莽eri臒i',
+    blocking: 'Bloke etme tipi, y眉r眉tmenin tamamlanmas谋n谋 bekleyip sonu莽lar谋 d枚nd眉rme. (S眉re莽 uzun s眉rerse istekler kesilebilir)',
+    streaming: 'Streaming d枚nd眉rmeleri. SSE (Sunucu Taraf谋ndan G枚nderilen Etkinlikler) tabanl谋 streaming d枚nd眉rme uygulamas谋.',
+    conversationIdTip: '(陌ste臒e ba臒l谋) Konu艧ma ID: ilk konu艧ma i莽in bo艧 b谋rak谋n; diyalo臒u devam ettirmek i莽in context\'ten conversation_id\'yi iletin.',
+    messageFeedbackApi: 'Mesaj son kullan谋c谋 geri bildirimi, be臒eni',
+    messageFeedbackApiTip: 'Son kullan谋c谋lar ad谋na be臒eni veya be臒enmeme ile al谋nan mesajlar谋 de臒erlendirin. Bu veriler, G眉nl眉kler ve Ek A莽谋klamalar sayfas谋nda g枚r眉n眉r ve gelecekteki model ince ayarlar谋 i莽in kullan谋l谋r.',
+    messageIDTip: 'Mesaj Kimli臒i',
+    ratingTip: 'be臒eni veya be臒enmeme, null geri almakt谋r',
+    chatMsgHistoryApi: 'Sohbet ge莽mi艧i mesaj谋 al',
+    chatMsgHistoryApiTip: '陌lk sayfa en son `limit` bar谋n谋 d枚nd眉r眉r ve bu ters s谋radad谋r.',
+    chatMsgHistoryConversationIdTip: 'Konu艧ma ID',
+    chatMsgHistoryFirstId: 'Mevcut sayfadaki ilk sohbet kayd谋n谋n ID\'si. Varsay谋lan yok.',
+    chatMsgHistoryLimit: 'Bir istekte ka莽 sohbet d枚nd眉r眉lece臒i',
+    conversationsListApi: 'Konu艧ma listesini al',
+    conversationsListApiTip: 'Mevcut kullan谋c谋n谋n oturum listesini al谋r. Varsay谋lan olarak, son 20 oturum d枚nd眉r眉l眉r.',
+    conversationsListFirstIdTip: 'Mevcut sayfadaki son kayd谋n ID\'si, varsay谋lan yok.',
+    conversationsListLimitTip: 'Bir istekte ka莽 sohbet d枚nd眉r眉lece臒i',
+    conversationRenamingApi: 'Konu艧ma yeniden adland谋rma',
+    conversationRenamingApiTip: 'Konu艧malar谋 yeniden adland谋r谋n; ad, 莽oklu oturum istemci aray眉zlerinde g枚r眉nt眉lenir.',
+    conversationRenamingNameTip: 'Yeni isim',
+    parametersApi: 'Uygulama parametre bilgilerini al',
+    parametersApiTip: 'De臒i艧ken adlar谋, alan adlar谋, t眉rleri ve varsay谋lan de臒erler dahil olmak 眉zere yap谋land谋r谋lm谋艧 Giri艧 parametrelerini al谋n. Genellikle bu alanlar谋 bir formda g枚r眉nt眉lemek veya istemci y眉klendikten sonra varsay谋lan de臒erleri doldurmak i莽in kullan谋l谋r.',
+  },
+  develop: {
+    requestBody: 'Request Body',
+    pathParams: 'Path Params',
+    query: 'Query',
+    toc: 'I莽eri臒i',
+  },
+  regenerate: 'Yenilemek',
+}
+
+export default translation
diff --git a/i18n/tr-TR/app-debug.ts b/i18n/tr-TR/app-debug.ts
new file mode 100644
index 0000000..f08d221
--- /dev/null
+++ b/i18n/tr-TR/app-debug.ts
@@ -0,0 +1,460 @@
+const translation = {
+  pageTitle: {
+    line1: 'PROMPT',
+    line2: 'Engineering',
+  },
+  orchestrate: 'Orchestrate',
+  promptMode: {
+    simple: 'T眉m PROMPT\'u d眉zenlemek i莽in Uzman Moduna ge莽in',
+    advanced: 'Uzman Modu',
+    switchBack: 'Geri D枚n',
+    advancedWarning: {
+      title: 'Uzman Moduna ge莽tiniz ve PROMPT\'u de臒i艧tirdi臒inizde, temel moda geri D脰NEMEZS陌N陌Z.',
+      description: 'Uzman Modunda, t眉m PROMPT\'u d眉zenleyebilirsiniz.',
+      learnMore: 'Daha Fazla Bilgi',
+      ok: 'Tamam',
+    },
+    operation: {
+      addMessage: 'Mesaj Ekle',
+    },
+    contextMissing: 'Ba臒lam bile艧eni eksik, promptun etkinli臒i iyi olmayabilir.',
+  },
+  operation: {
+    applyConfig: 'Yay谋nla',
+    resetConfig: 'S谋f谋rla',
+    debugConfig: 'Hata Ay谋kla',
+    addFeature: '脰zellik Ekle',
+    automatic: 'Olu艧tur',
+    stopResponding: 'Yan谋tlamay谋 Durdur',
+    agree: 'be臒eni',
+    disagree: 'be臒enmeme',
+    cancelAgree: 'Be臒eniyi 陌ptal Et',
+    cancelDisagree: 'Be臒enmeme 陌ptal Et',
+    userAction: 'Kullan谋c谋',
+  },
+  notSetAPIKey: {
+    title: 'LLM sa臒lay谋c谋 anahtar谋 ayarlanmad谋',
+    trailFinished: 'Deneme s眉resi sona erdi',
+    description: 'LLM sa臒lay谋c谋 anahtar谋 ayarlanmad谋, hata ay谋klamadan 枚nce ayarlanmas谋 gerekiyor.',
+    settingBtn: 'Ayarlar\'a git',
+  },
+  trailUseGPT4Info: {
+    title: '艦u anda gpt-4 desteklenmiyor',
+    description: 'Gpt-4 kullanmak i莽in, l眉tfen API Anahtar谋n谋 ayarlay谋n.',
+  },
+  feature: {
+    groupChat: {
+      title: 'Sohbet Geli艧tirme',
+      description: 'Uygulamalar i莽in 枚n g枚r眉艧me ayarlar谋 eklemek kullan谋c谋 deneyimini art谋rabilir.',
+    },
+    groupExperience: {
+      title: 'Deneyim Geli艧tirme',
+    },
+    conversationOpener: {
+      title: 'Konu艧ma Ba艧lat谋c谋',
+      description: 'Bir sohbet uygulamas谋nda, yapay zekan谋n kullan谋c谋ya aktif olarak s枚yledi臒i ilk c眉mle genellikle bir kar艧谋lama olarak kullan谋l谋r.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: 'Takip Sorular谋',
+      description: 'Sonraki soru 枚nerilerini ayarlamak, kullan谋c谋lara daha iyi bir sohbet deneyimi sunabilir.',
+      resDes: 'Kullan谋c谋 i莽in 3 枚nerilen sonraki soru.',
+      tryToAsk: 'Sormay谋 dene',
+    },
+    moreLikeThis: {
+      title: 'Bunun gibi daha fazlas谋',
+      description: 'Birden fazla metni bir kerede 眉retin, ard谋ndan d眉zenleyin ve 眉retmeye devam edin',
+      generateNumTip: 'Her 眉retim seferinde 眉retilen metin say谋s谋',
+      tip: 'Bu 枚zelli臒i kullanmak ek token maliyetine yol a莽acakt谋r',
+    },
+    speechToText: {
+      title: 'Sesten Metne',
+      description: 'Etkinle艧tirildi臒inde, sesli giri艧 kullanabilirsiniz.',
+      resDes: 'Sesli giri艧 etkinle艧tirildi',
+    },
+    textToSpeech: {
+      title: 'Metinden Sese',
+      description: 'Etkinle艧tirildi臒inde, metin sese d枚n眉艧t眉r眉lebilir.',
+      resDes: 'Metinden Ses dosyas谋na d枚n眉艧t眉rme etkinle艧tirildi',
+    },
+    citation: {
+      title: 'Al谋nt谋lar ve At谋flar',
+      description: 'Etkinle艧tirildi臒inde, olu艧turulan i莽eri臒in kaynak belgesi ve at谋fta bulunulan b枚l眉m眉 g枚sterilir.',
+      resDes: 'Al谋nt谋lar ve At谋flar etkinle艧tirildi',
+    },
+    annotation: {
+      title: 'Ek A莽谋klama Yan谋t谋',
+      description: 'Benzer kullan谋c谋 sorular谋yla 枚ncelikli e艧le艧me i莽in, y眉ksek kaliteli yan谋tlar谋 manuel olarak 枚nbelle臒e ekleyebilirsiniz.',
+      resDes: 'Ek A莽谋klama Yan谋t谋 etkinle艧tirildi',
+      scoreThreshold: {
+        title: 'Skor E艧i臒i',
+        description: 'Ek a莽谋klama yan谋t谋 i莽in benzerlik e艧i臒ini ayarlamak i莽in kullan谋l谋r.',
+        easyMatch: 'Kolay E艧le艧me',
+        accurateMatch: 'Do臒ru E艧le艧me',
+      },
+      matchVariable: {
+        title: 'E艧le艧me De臒i艧keni',
+        choosePlaceholder: 'E艧le艧me de臒i艧kenini se莽in',
+      },
+      cacheManagement: 'Ek A莽谋klamalar',
+      cached: 'Ek A莽谋klamal谋',
+      remove: 'Kald谋r',
+      removeConfirm: 'Bu ek a莽谋klamay谋 silmek istiyor musunuz?',
+      add: 'Ek a莽谋klama ekle',
+      edit: 'Ek a莽谋klamay谋 d眉zenle',
+    },
+    dataSet: {
+      title: 'Ba臒lam',
+      noData: 'Ba臒lam olarak Bilgi\'yi i莽e aktarabilirsiniz',
+      words: 'Kelimeler',
+      textBlocks: 'Metin Bloklar谋',
+      selectTitle: 'Referans Bilgi\'yi se莽in',
+      selected: 'Bilgi se莽ildi',
+      noDataSet: 'Bilgi bulunamad谋',
+      toCreate: 'Olu艧turmaya git',
+      notSupportSelectMulti: '艦u anda sadece bir Bilgi destekleniyor',
+      queryVariable: {
+        title: 'Sorgu de臒i艧keni',
+        tip: 'Bu de臒i艧ken, ba臒lam geri al谋m谋 i莽in sorgu giri艧i olarak kullan谋lacak ve bu de臒i艧kenin girdisiyle ilgili ba臒lam bilgisi elde edilecektir.',
+        choosePlaceholder: 'Sorgu de臒i艧kenini se莽in',
+        noVar: 'De臒i艧ken yok',
+        noVarTip: 'L眉tfen De臒i艧kenler b枚l眉m眉nde bir de臒i艧ken olu艧turun',
+        unableToQueryDataSet: 'Bilgi sorgulanam谋yor',
+        unableToQueryDataSetTip: 'Bilgi ba艧ar谋l谋 bir 艧ekilde sorgulanam谋yor, l眉tfen ba臒lam b枚l眉m眉nde bir ba臒lam sorgu de臒i艧keni se莽in.',
+        ok: 'Tamam',
+        contextVarNotEmpty: 'Ba臒lam sorgu de臒i艧keni bo艧 olamaz',
+        deleteContextVarTitle: 'De臒i艧ken "{{varName}}" silinsin mi?',
+        deleteContextVarTip: 'Bu de臒i艧ken ba臒lam sorgu de臒i艧keni olarak ayarlanm谋艧, kald谋r谋lmas谋 Bilgi\'nin normal kullan谋m谋n谋 etkileyecektir. Yine de silmek istiyorsan谋z, l眉tfen ba臒lam b枚l眉m眉nde yeniden se莽in.',
+      },
+    },
+    tools: {
+      title: 'Ara莽lar',
+      tips: 'Ara莽lar, kullan谋c谋 giri艧i veya de臒i艧kenleri istek parametreleri olarak alarak d谋艧 verileri ba臒lam olarak sorgulamak i莽in standart bir API 莽a臒r谋 y枚ntemi sa臒lar.',
+      toolsInUse: '{{count}} ara莽 kullan谋mda',
+      modal: {
+        title: 'Ara莽',
+        toolType: {
+          title: 'Ara莽 T眉r眉',
+          placeholder: 'L眉tfen ara莽 t眉r眉n眉 se莽in',
+        },
+        name: {
+          title: '陌sim',
+          placeholder: 'L眉tfen ismi girin',
+        },
+        variableName: {
+          title: 'De臒i艧ken 陌smi',
+          placeholder: 'L眉tfen de臒i艧ken ismini girin',
+        },
+      },
+    },
+    conversationHistory: {
+      title: 'Konu艧ma Ge莽mi艧i',
+      description: 'Konu艧ma rolleri i莽in 枚n ek isimler ayarlay谋n',
+      tip: 'Konu艧ma Ge莽mi艧i etkin de臒il, l眉tfen promptun 眉st k谋sm谋nda <histories> ekleyin.',
+      learnMore: 'Daha fazla bilgi',
+      editModal: {
+        title: 'Konu艧ma Rol 陌simlerini D眉zenle',
+        userPrefix: 'Kullan谋c谋 枚n eki',
+        assistantPrefix: 'Asistan 枚n eki',
+      },
+    },
+    toolbox: {
+      title: 'ARA脟LAR',
+    },
+    moderation: {
+      title: '陌莽erik Denetimi',
+      description: 'Denetim API\'sini kullanarak veya bir hassas kelime listesi olu艧turarak model 莽谋kt谋s谋n谋 g眉vence alt谋na al谋n.',
+      allEnabled: 'G陌R陌艦/脟IKI艦 陌莽eri臒i Etkin',
+      inputEnabled: 'G陌R陌艦 陌莽eri臒i Etkin',
+      outputEnabled: '脟IKI艦 陌莽eri臒i Etkin',
+      modal: {
+        title: '陌莽erik denetim ayarlar谋',
+        provider: {
+          title: 'Sa臒lay谋c谋',
+          openai: 'OpenAI Denetim',
+          openaiTip: {
+            prefix: 'OpenAI Denetim, Ayarlar sayfas谋nda yap谋land谋r谋lm谋艧 bir OpenAI API anahtar谋 gerektirir',
+            suffix: '.',
+          },
+          keywords: 'Anahtar Kelimeler',
+        },
+        keywords: {
+          tip: 'Her sat谋rda bir tane, sat谋r sonlar谋yla ayr谋lm谋艧. Sat谋r ba艧谋na en fazla 100 karakter.',
+          placeholder: 'Her sat谋rda bir tane, sat谋r sonlar谋yla ayr谋lm谋艧',
+          line: 'Sat谋r',
+        },
+        content: {
+          input: 'G陌R陌艦 陌莽eri臒ini Denetle',
+          output: '脟IKI艦 陌莽eri臒ini Denetle',
+          preset: '脰nceden Ayarlanm谋艧 Yan谋tlar',
+          placeholder: '脰nceden ayarlanm谋艧 yan谋t i莽eri臒i buraya',
+          condition: 'G陌R陌艦 ve 脟IKI艦 陌莽eri臒i denetimi en az birinde etkin',
+          fromApi: '脰nceden ayarlanm谋艧 yan谋tlar API taraf谋ndan d枚nd眉r眉l眉r',
+          errorMessage: '脰nceden ayarlanm谋艧 yan谋tlar bo艧 olamaz',
+          supportMarkdown: 'Markdown desteklenir',
+        },
+        openaiNotConfig: {
+          before: 'OpenAI Denetim, Ayarlar sayfas谋nda yap谋land谋r谋lm谋艧 bir OpenAI API anahtar谋 gerektirir',
+          after: '',
+        },
+      },
+    },
+  },
+  generate: {
+    title: 'Prompt Olu艧turucu',
+    description: 'Prompt Olu艧turucu, yap谋land谋r谋lan modeli kullanarak promptlar谋 daha iyi kalite ve yap谋 i莽in optimize eder. L眉tfen a莽谋k ve ayr谋nt谋l谋 talimatlar yaz谋n.',
+    tryIt: 'Deneyin',
+    instruction: 'Talimatlar',
+    instructionPlaceHolder: 'A莽谋k ve belirli talimatlar yaz谋n.',
+    generate: 'Olu艧tur',
+    resTitle: 'Olu艧turulmu艧 Prompt',
+    noDataLine1: 'Kullan谋m durumunuzu solda a莽谋klay谋n,',
+    noDataLine2: 'orkestrasyon 枚nizlemesi burada g枚r眉necek.',
+    apply: 'Uygula',
+    loading: 'Uygulama orkestrasyonu yap谋l谋yor...',
+    overwriteTitle: 'Mevcut yap谋land谋rman谋n 眉zerine yaz谋ls谋n m谋?',
+    overwriteMessage: 'Bu promptu uygulamak mevcut yap谋land谋rman谋n 眉zerine yazacakt谋r.',
+    template: {
+      pythonDebugger: {
+        name: 'Python hata ay谋klay谋c谋',
+        instruction: 'Talimatlar谋n谋za g枚re kod 眉retebilen ve hata ay谋klayabilen bir bot',
+      },
+      translation: {
+        name: '脟eviri',
+        instruction: 'Birden 莽ok dili 莽evirebilen bir 莽evirmen',
+      },
+      professionalAnalyst: {
+        name: 'Profesyonel analist',
+        instruction: 'Uzun raporlardan i莽g枚r眉leri 莽谋kar谋n, riskleri belirleyin ve temel bilgileri tek bir notta 枚zetleyin',
+      },
+      excelFormulaExpert: {
+        name: 'Excel form眉l uzman谋',
+        instruction: 'Kullan谋c谋 talimatlar谋na dayal谋 olarak Excel form眉llerini anlamaya, kullanmaya ve olu艧turmaya yard谋mc谋 olan bir sohbet botu',
+      },
+      travelPlanning: {
+        name: 'Seyahat planlama',
+        instruction: 'Seyahat Planlama Asistan谋, kullan谋c谋lar谋n seyahatlerini zorluk 莽ekmeden planlamalar谋na yard谋mc谋 olmak i莽in tasarlanm谋艧 ak谋ll谋 bir ara莽t谋r',
+      },
+      SQLSorcerer: {
+        name: 'SQL b眉y眉c眉s眉',
+        instruction: 'G眉nl眉k dili SQL sorgular谋na d枚n眉艧t眉r眉r',
+      },
+      GitGud: {
+        name: 'Git g眉d',
+        instruction: 'Kullan谋c谋 taraf谋ndan a莽谋klanan s眉r眉m kontrol eylemlerine dayal谋 uygun Git komutlar谋 olu艧turur',
+      },
+      meetingTakeaways: {
+        name: 'Toplant谋dan al谋nanlar',
+        instruction: 'Toplant谋lar谋 anahtar konular, 枚nemli 莽谋kar谋mlar ve eylem maddeleri dahil olmak 眉zere 枚zl眉 枚zetlere ay谋r谋r',
+      },
+      writingsPolisher: {
+        name: 'Yazma cilalay谋c谋',
+        instruction: 'Yaz谋lar谋n谋z谋 geli艧tirmek i莽in ileri d眉zeyde kopya d眉zenleme teknikleri kullan谋r',
+      },
+    },
+  },
+  resetConfig: {
+    title: 'S谋f谋rlamay谋 onayl谋yor musunuz?',
+    message:
+      'S谋f谋rlama, son yay谋mlanan yap谋land谋rmaya geri y眉kleyerek de臒i艧iklikleri atar.',
+  },
+  errorMessage: {
+    nameOfKeyRequired: 'Anahtar ad谋: {{key}} gerekli',
+    valueOfVarRequired: '{{key}} de臒eri bo艧 olamaz',
+    queryRequired: '陌stek metni gereklidir.',
+    waitForResponse:
+      '脰nceki mesaj谋n yan谋t谋n谋 tamamlamas谋n谋 bekleyin.',
+    waitForBatchResponse:
+      'Toplu g枚revin yan谋t谋n谋 tamamlamas谋n谋 bekleyin.',
+    notSelectModel: 'L眉tfen bir model se莽in',
+    waitForImgUpload: 'L眉tfen g枚r眉nt眉n眉n y眉klenmesini bekleyin',
+  },
+  chatSubTitle: 'Talimatlar',
+  completionSubTitle: '脰n Prompt',
+  promptTip:
+    'Promptlar, yapay zekay谋 talimatlar ve k谋s谋tlamalarla y枚nlendirir. {{input}} gibi de臒i艧kenler ekleyin. Bu prompt, kullan谋c谋lara g枚r眉nmeyecek.',
+  formattingChangedTitle: 'Bi莽imlendirme de臒i艧tirildi',
+  formattingChangedText:
+    'Bi莽imlendirmeyi de臒i艧tirmek hata ay谋klama alan谋n谋 s谋f谋rlayacakt谋r, emin misiniz?',
+  variableTitle: 'De臒i艧kenler',
+  variableTip:
+    'Kullan谋c谋lar de臒i艧kenleri bir formda doldurur ve otomatik olarak prompt i莽inde de臒i艧kenler de臒i艧tirilir.',
+  notSetVar: 'De臒i艧kenler, kullan谋c谋lar谋n form doldururken prompt kelimelerini veya a莽谋l谋艧 ifadelerini getirmesine izin verir. Prompt kelimelerine "{{input}}" yazmay谋 deneyebilirsiniz.',
+  autoAddVar: '脰n promptta referans verilen tan谋mlanmam谋艧 de臒i艧kenler, kullan谋c谋 giri艧 formunda eklemek istiyor musunuz?',
+  variableTable: {
+    key: 'De臒i艧ken Anahtar谋',
+    name: 'Kullan谋c谋 Giri艧 Alan谋 Ad谋',
+    optional: '陌ste臒e Ba臒l谋',
+    type: 'Giri艧 Tipi',
+    action: 'Aksiyonlar',
+    typeString: 'Metin',
+    typeSelect: 'Se莽im',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{key}} gereklidir',
+    tooLong: '{{key}} 莽ok uzun. 30 karakterden uzun olamaz',
+    notValid: '{{key}} ge莽ersizdir. Sadece harfler, rakamlar ve alt莽izgiler i莽erebilir',
+    notStartWithNumber: '{{key}} bir rakamla ba艧lamamal谋d谋r',
+    keyAlreadyExists: '{{key}} zaten mevcut',
+  },
+  otherError: {
+    promptNoBeEmpty: 'Prompt bo艧 olamaz',
+    historyNoBeEmpty: 'Konu艧ma ge莽mi艧i prompt\'ta ayarlanmal谋d谋r',
+    queryNoBeEmpty: 'Sorgu prompt\'ta ayarlanmal谋d谋r',
+  },
+  variableConfig: {
+    addModalTitle: 'Giri艧 Alan谋 Ekle',
+    editModalTitle: 'Giri艧 Alan谋 D眉zenle',
+    description: 'De臒i艧ken ayar谋 {{varName}}',
+    fieldType: 'Alan t眉r眉',
+    string: 'K谋sa Metin',
+    textInput: 'K谋sa Metin',
+    paragraph: 'Paragraf',
+    select: 'Se莽im',
+    number: 'Numara',
+    notSet: 'Ayarlanmam谋艧, 枚n promptta {{input}} yazmay谋 deneyin',
+    stringTitle: 'Form metin kutusu se莽enekleri',
+    maxLength: 'En uzunluk',
+    options: 'Se莽enekler',
+    addOption: 'Se莽enek ekle',
+    apiBasedVar: 'API tabanl谋 De臒i艧ken',
+    varName: 'De臒i艧ken Ad谋',
+    labelName: 'Etiket Ad谋',
+    inputPlaceholder: 'L眉tfen girin',
+    content: '陌莽erik',
+    required: 'Gerekli',
+    errorMsg: {
+      varNameRequired: 'De臒i艧ken ad谋 gereklidir',
+      labelNameRequired: 'Etiket ad谋 gereklidir',
+      varNameCanBeRepeat: 'De臒i艧ken ad谋 tekrar edemez',
+      atLeastOneOption: 'En az bir se莽enek gereklidir',
+      optionRepeat: 'Yinelenen se莽enekler var',
+    },
+  },
+  vision: {
+    name: 'G枚r眉艧',
+    description: 'G枚r眉艧 etkinle艧tirildi臒inde modelin g枚r眉nt眉leri almas谋n谋 ve bunlarla ilgili sorular谋 yan谋tlamas谋n谋 sa臒lar.',
+    settings: 'Ayarlar',
+    visionSettings: {
+      title: 'G枚r眉艧 Ayarlar谋',
+      resolution: '脟枚z眉n眉rl眉k',
+      resolutionTooltip: 'D眉艧眉k 莽枚z眉n眉rl眉k, modelin g枚r眉nt眉n眉n d眉艧眉k 莽枚z眉n眉rl眉kl眉 512 x 512 versiyonunu almas谋n谋 sa臒lar ve g枚r眉nt眉y眉 65 token b眉t莽esiyle temsil eder. Bu, API\'nin daha h谋zl谋 yan谋tlar d枚nmesini ve daha az giri艧 tokeni t眉ketmesini sa臒lar ve bu y眉ksek detay gerektirmeyen kullan谋m durumlar谋 i莽in uygundur.\nY眉ksek 莽枚z眉n眉rl眉k, modelin 枚nce d眉艧眉k 莽枚z眉n眉rl眉kl眉 g枚r眉nt眉y眉 g枚rmesini sa臒lar ve ard谋ndan giri艧 g枚r眉nt眉s眉n眉n boyutuna g枚re 512 piksel kareler olarak detayl谋 k谋rpma i艧lemleri ger莽ekle艧tirir. Her bir detayl谋 k谋rpma i艧lemi toplamda 129 token b眉t莽esi kullan谋r.',
+      high: 'Y眉ksek',
+      low: 'D眉艧眉k',
+      uploadMethod: 'Y眉kleme Y枚ntemi',
+      both: 'Her 陌kisi',
+      localUpload: 'Yerel Y眉kleme',
+      url: 'URL',
+      uploadLimit: 'Y眉kleme Limiti',
+    },
+  },
+  voice: {
+    name: 'Konu艧ma',
+    defaultDisplay: 'Varsay谋lan Ses',
+    description: 'Metinden sese ses ayarlar谋',
+    settings: 'Ayarlar',
+    voiceSettings: {
+      title: 'Ses Ayarlar谋',
+      language: 'Dil',
+      resolutionTooltip: 'Metinden sese ses destek dili.',
+      voice: 'Ses',
+      autoPlay: 'Otomatik Oynatma',
+      autoPlayEnabled: 'A莽谋k',
+      autoPlayDisabled: 'Kapal谋',
+    },
+  },
+  openingStatement: {
+    title: 'Konu艧ma Ba艧lat谋c谋',
+    add: 'Ekle',
+    writeOpener: 'Ba艧lang谋莽 mesaj谋 yaz',
+    placeholder: 'Ba艧lang谋莽 mesaj谋n谋z谋 buraya yaz谋n, de臒i艧kenler kullanabilirsiniz, 枚rne臒in {{variable}} yazmay谋 deneyin.',
+    openingQuestion: 'A莽谋l谋艧 Sorular谋',
+    noDataPlaceHolder:
+      'Kullan谋c谋 ile konu艧may谋 ba艧latmak, AI\'谋n konu艧ma uygulamalar谋nda onlarla daha yak谋n bir ba臒lant谋 kurmas谋na yard谋mc谋 olabilir.',
+    varTip: 'De臒i艧kenler kullanabilirsiniz, 枚rne臒in {{variable}} yazmay谋 deneyin',
+    tooShort: 'Konu艧ma i莽in a莽谋l谋艧 ifadeleri olu艧turmak i莽in en az 20 kelimelik ba艧lang谋莽 promptu gereklidir.',
+    notIncludeKey: 'Ba艧lang谋莽 promptu de臒i艧keni i莽ermiyor: {{key}}. L眉tfen bunu ba艧lang谋莽 promptuna ekleyin.',
+  },
+  modelConfig: {
+    model: 'Model',
+    setTone: 'Yan谋tlar谋n tonunu ayarla',
+    title: 'Model ve Parametreler',
+    modeType: {
+      chat: 'Sohbet',
+      completion: 'Tamamlama',
+    },
+  },
+  inputs: {
+    title: 'Hata ay谋klama ve 脰nizleme',
+    noPrompt: '脰n prompt giri艧ine baz谋 promptlar yazmay谋 deneyin',
+    userInputField: 'Kullan谋c谋 Giri艧 Alan谋',
+    noVar: 'Yeni bir oturum ba艧lat谋ld谋臒谋nda prompt kelimesinde otomatik olarak de臒i艧tirilecek de臒i艧kenin de臒erini doldurun.',
+    chatVarTip: 'Yeni bir oturum ba艧lat谋ld谋臒谋nda prompt kelimesinde otomatik olarak de臒i艧tirilecek de臒i艧kenin de臒erini doldurun',
+    completionVarTip: 'Her soru g枚nderildi臒inde prompt kelimelerinde otomatik olarak de臒i艧tirilecek de臒i艧kenin de臒erini doldurun.',
+    previewTitle: 'Prompt 枚nizleme',
+    queryTitle: 'Sorgu i莽eri臒i',
+    queryPlaceholder: 'L眉tfen istek metnini girin.',
+    run: '脟ALI艦TIR',
+  },
+  result: '脟谋kt谋 Metni',
+  datasetConfig: {
+    settingTitle: 'Geri Al谋m Ayarlar谋',
+    knowledgeTip: 'Bilgi eklemek i莽in 鈥�+鈥� d眉臒mesine t谋klay谋n',
+    retrieveOneWay: {
+      title: 'N-to-1 geri al谋m',
+      description: 'Kullan谋c谋 niyetine ve Bilgi tan谋m谋na dayanarak, Agent en iyi Bilgi\'yi sorgulamak i莽in 枚zerk bir 艧ekilde se莽er. Belirgin, s谋n谋rl谋 Bilgi bulunan uygulamalar i莽in en iyisidir.',
+    },
+    retrieveMultiWay: {
+      title: '脟oklu yol geri al谋m',
+      description: 'Kullan谋c谋 niyetine dayanarak, t眉m Bilgilerde sorgular, 莽oklu kaynaklardan ilgili metni al谋r ve yeniden s谋ralad谋ktan sonra kullan谋c谋 sorgusuyla e艧le艧en en iyi sonu莽lar谋 se莽er.',
+    },
+    rerankModelRequired: 'Rerank modeli gereklidir',
+    params: 'Parametreler',
+    top_k: 'En 陌yi K',
+    top_kTip: 'Kullan谋c谋 sorular谋na en 莽ok benzeyen par莽alar谋 filtrelemek i莽in kullan谋l谋r. Sistem ayr谋ca en iyi K de臒erini, se莽ilen modelin max_tokens\'a g枚re dinamik olarak ayarlar.',
+    score_threshold: 'Skor E艧i臒i',
+    score_thresholdTip: 'Par莽a filtreleme i莽in benzerlik e艧i臒ini ayarlamak i莽in kullan谋l谋r.',
+    retrieveChangeTip: 'Dizin modunu ve geri al谋m modunu de臒i艧tirmek, bu Bilgi ile ili艧kili uygulamalar谋 etkileyebilir.',
+  },
+  debugAsSingleModel: 'Tek Model Olarak Hata Ay谋kla',
+  debugAsMultipleModel: '脟oklu Model Olarak Hata Ay谋kla',
+  duplicateModel: '脟o臒alt',
+  publishAs: 'Olarak Yay谋nla',
+  assistantType: {
+    name: 'Asistan T眉r眉',
+    chatAssistant: {
+      name: 'Temel Asistan',
+      description: 'B眉y眉k Dil Modeli kullanarak sohbet tabanl谋 bir asistan olu艧turun',
+    },
+    agentAssistant: {
+      name: 'Agent Asistan谋',
+      description: 'G枚revleri tamamlamak i莽in ara莽lar谋 枚zerk bir 艧ekilde se莽ebilen bir zeki Agent olu艧turun',
+    },
+  },
+  agent: {
+    agentMode: 'Agent Modu',
+    agentModeDes: 'Agent i莽in 莽谋kar谋m modunu ayarlay谋n',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: 'Fonksiyon 脟a臒r谋s谋',
+    },
+    setting: {
+      name: 'Agent Ayarlar谋',
+      description: 'Agent Asistan谋 ayarlar谋, Agent modunu ve yerle艧ik promptlar gibi geli艧mi艧 枚zellikleri ayarlaman谋za olanak tan谋r. Sadece Agent t眉r眉nde kullan谋labilir.',
+      maximumIterations: {
+        name: 'Maksimum Yineleme',
+        description: 'Bir Agent asistan谋n谋n ger莽ekle艧tirebilece臒i yineleme say谋s谋n谋 s谋n谋rlay谋n',
+      },
+    },
+    buildInPrompt: 'Yerle艧ik Prompt',
+    firstPrompt: '陌lk Prompt',
+    nextIteration: 'Sonraki Yineleme',
+    promptPlaceholder: 'Promptunuzu buraya yaz谋n',
+    tools: {
+      name: 'Ara莽lar',
+      description: 'Ara莽lar kullanmak, internette arama yapmak veya bilimsel hesaplamalar yapmak gibi LLM yeteneklerini geni艧letebilir',
+      enabled: 'Etkinle艧tirildi',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/tr-TR/app-log.ts b/i18n/tr-TR/app-log.ts
new file mode 100644
index 0000000..4accd45
--- /dev/null
+++ b/i18n/tr-TR/app-log.ts
@@ -0,0 +1,98 @@
+const translation = {
+  title: 'G眉nl眉kler',
+  description: 'G眉nl眉kler, kullan谋c谋n谋n girdileri ve AI tepkileri dahil olmak 眉zere uygulaman谋n 莽al谋艧ma durumunu kaydeder.',
+  dateTimeFormat: 'GG/AA/YYYY ss:dd 脰脰/脰S',
+  table: {
+    header: {
+      updatedTime: 'G眉ncellenme zaman谋',
+      time: 'Olu艧turulma zaman谋',
+      endUser: 'Son Kullan谋c谋 veya Hesap',
+      input: 'Girdi',
+      output: '脟谋kt谋',
+      summary: 'Ba艧l谋k',
+      messageCount: 'Mesaj Say谋s谋',
+      userRate: 'Kullan谋c谋 Puan谋',
+      adminRate: 'Op. Puan谋',
+      startTime: 'BA艦LANGI脟 ZAMANI',
+      status: 'DURUM',
+      runtime: '脟ALI艦MA S脺RES陌',
+      tokens: 'TOKENLAR',
+      user: 'SON KULLANICI VEYA HESAP',
+      version: 'VERS陌YON',
+    },
+    pagination: {
+      previous: '脰nceki',
+      next: 'Sonraki',
+    },
+    empty: {
+      noChat: 'Hen眉z konu艧ma yok',
+      noOutput: '脟谋kt谋 yok',
+      element: {
+        title: 'Kimse var m谋?',
+        content: 'Son kullan谋c谋lar ve AI uygulamalar谋 aras谋ndaki etkile艧imleri g枚zlemleyin ve a莽谋klamalar ekleyin, b枚ylece AI do臒rulu臒unu s眉rekli olarak art谋rabilirsiniz. Web Uygulamas谋n谋 <shareLink>payla艧may谋</shareLink> veya <testLink>kendiniz test etmeyi</testLink> deneyebilir, ard谋ndan bu sayfaya geri d枚nebilirsiniz.',
+      },
+    },
+  },
+  detail: {
+    time: 'Zaman',
+    conversationId: 'Konu艧ma ID',
+    promptTemplate: 'Prompt 艦ablonu',
+    promptTemplateBeforeChat: 'Sohbet 脰ncesi Prompt 艦ablonu 路 Sistem Mesaj谋 Olarak',
+    annotationTip: '{{user}} taraf谋ndan i艧aretlenen iyile艧tirmeler',
+    timeConsuming: 'Ge莽en S眉re',
+    second: 's',
+    tokenCost: 'Token harcanan',
+    loading: 'y眉kleniyor',
+    operation: {
+      like: 'be臒eni',
+      dislike: 'be臒enmeme',
+      addAnnotation: '陌yile艧tirme Ekle',
+      editAnnotation: '陌yile艧tirme D眉zenle',
+      annotationPlaceholder: 'AI\'谋n yan谋tlamas谋n谋 istedi臒iniz beklenen cevab谋 girin, bu, model ince ayar谋 ve metin 眉retim kalitesinin s眉rekli iyile艧tirilmesi i莽in kullan谋labilir.',
+    },
+    variables: 'De臒i艧kenler',
+    uploadImages: 'Y眉klenen G枚rseller',
+    modelParams: 'Model parametreleri',
+  },
+  filter: {
+    period: {
+      today: 'Bug眉n',
+      last7days: 'Son 7 G眉n',
+      last4weeks: 'Son 4 Hafta',
+      last3months: 'Son 3 Ay',
+      last12months: 'Son 12 Ay',
+      monthToDate: 'Ay Ba艧lang谋c谋ndan 陌tibaren',
+      quarterToDate: '脟eyrek Ba艧lang谋c谋ndan 陌tibaren',
+      yearToDate: 'Y谋l Ba艧lang谋c谋ndan 陌tibaren',
+      allTime: 'T眉m Zamanlar',
+    },
+    annotation: {
+      all: 'Hepsi',
+      annotated: 'A莽谋klamal谋 陌yile艧tirmeler ({{count}} 枚臒e)',
+      not_annotated: 'A莽谋klanmam谋艧',
+    },
+    sortBy: 'S谋ralama 枚l莽眉t眉:',
+    descending: 'azalan',
+    ascending: 'artan',
+  },
+  workflowTitle: 'Workflow G眉nl眉kleri',
+  workflowSubtitle: 'G眉nl眉k, Automate\'in 莽al谋艧mas谋n谋 kaydetmi艧tir.',
+  runDetail: {
+    title: 'Konu艧ma G眉nl眉臒眉',
+    workflowTitle: 'G眉nl眉k Detay谋',
+    fileListDetail: 'Ayr谋nt谋',
+    fileListLabel: 'Dosya Detaylar谋',
+  },
+  promptLog: 'Prompt G眉nl眉臒眉',
+  agentLog: 'Agent G眉nl眉臒眉',
+  viewLog: 'G眉nl眉臒眉 G枚r眉nt眉le',
+  agentLogDetail: {
+    agentMode: 'Agent Modu',
+    toolUsed: 'Kullan谋lan Ara莽',
+    iterations: 'Yinelemeler',
+    iteration: 'Yineleme',
+    finalProcessing: 'Son 陌艧leme',
+  },
+}
+
+export default translation
diff --git a/i18n/tr-TR/app-overview.ts b/i18n/tr-TR/app-overview.ts
new file mode 100644
index 0000000..f7203e2
--- /dev/null
+++ b/i18n/tr-TR/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: 'Ba艧lamak i莽in,',
+    enterKeyTip: 'a艧a臒谋ya OpenAI API Anahtar谋n谋z谋 girin',
+    getKeyTip: 'OpenAI kontrol panelinden API Anahtar谋n谋z谋 al谋n',
+    placeholder: 'API Anahtar谋n谋z (枚r. sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: '{{providerName}} deneme kotas谋n谋 kullan谋yorsunuz.',
+        description: 'Deneme kotas谋, test ama莽lar谋n谋z i莽in sa臒lanm谋艧t谋r. Deneme kotas谋 bitmeden 枚nce kendi model sa臒lay谋c谋n谋z谋 ayarlay谋n veya ek kota sat谋n al谋n.',
+      },
+      exhausted: {
+        title: 'Deneme kotan谋z谋 kulland谋n谋z, l眉tfen API Anahtar谋n谋z谋 ayarlay谋n.',
+        description: 'Deneme kotan谋z谋 bitirdiniz. L眉tfen kendi model sa臒lay谋c谋n谋z谋 ayarlay谋n veya ek kota sat谋n al谋n.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: 'Ba艧lamak i莽in,',
+        row2: 'model sa臒lay谋c谋n谋z谋 ayarlay谋n.',
+      },
+    },
+    callTimes: '脟a臒r谋 s眉resi',
+    usedToken: 'Kullan谋lan token',
+    setAPIBtn: 'Model sa臒lay谋c谋s谋n谋 ayarlamaya git',
+    tryCloud: 'Veya Dify\'nin bulut s眉r眉m眉n眉 眉cretsiz kotayla deneyin',
+  },
+  overview: {
+    title: 'Genel Bak谋艧',
+    appInfo: {
+      explanation: 'Kullan谋ma haz谋r AI WebApp',
+      accessibleAddress: 'Genel URL',
+      preview: '脰nizleme',
+      regenerate: 'Yeniden Olu艧tur',
+      regenerateNotice: 'Genel URL\'yi yeniden olu艧turmak istiyor musunuz?',
+      preUseReminder: 'Devam etmeden 枚nce WebApp\'i etkinle艧tirin.',
+      settings: {
+        entry: 'Ayarlar',
+        title: 'WebApp Ayarlar谋',
+        webName: 'WebApp 陌smi',
+        webDesc: 'WebApp A莽谋klamas谋',
+        webDescTip: 'Bu metin, uygulaman谋n nas谋l kullan谋laca臒谋na dair temel a莽谋klamalar sa臒lar ve istemci taraf谋nda g枚r眉nt眉lenir',
+        webDescPlaceholder: 'WebApp\'in a莽谋klamas谋n谋 girin',
+        language: 'Dil',
+        workflow: {
+          title: 'Workflow Ad谋mlar谋',
+          show: 'G枚ster',
+          hide: 'Gizle',
+          showDesc: 'WebApp\'te i艧 ak谋艧谋 ayr谋nt谋lar谋n谋 g枚sterme veya gizleme',
+          subTitle: '陌艧 Ak谋艧谋 Detaylar谋',
+        },
+        chatColorTheme: 'Sohbet renk temas谋',
+        chatColorThemeDesc: 'Sohbet botunun renk temas谋n谋 ayarlay谋n',
+        chatColorThemeInverted: 'Tersine 莽evrilmi艧',
+        invalidHexMessage: 'Ge莽ersiz hex de臒eri',
+        invalidPrivacyPolicy: 'Ge莽ersiz gizlilik politikas谋 ba臒lant谋s谋. L眉tfen http veya https ile ba艧layan ge莽erli bir ba臒lant谋 kullan谋n',
+        more: {
+          entry: 'Daha fazla ayar谋 g枚ster',
+          copyright: 'Telif Hakk谋',
+          copyRightPlaceholder: 'Yazar谋n veya kurulu艧un ad谋n谋 girin',
+          privacyPolicy: 'Gizlilik Politikas谋',
+          privacyPolicyPlaceholder: 'Gizlilik politikas谋 ba臒lant谋s谋n谋 girin',
+          privacyPolicyTip: 'Ziyaret莽ilerin uygulaman谋n toplad谋臒谋 verileri anlamalar谋na yard谋mc谋 olur, Dify\'nin <privacyPolicyLink>Gizlilik Politikas谋</privacyPolicyLink>\'na bak谋n.',
+          customDisclaimer: '脰zel 陌f艧a',
+          customDisclaimerPlaceholder: '脰zel if艧a metnini girin',
+          customDisclaimerTip: '脰zel if艧a metni istemci taraf谋nda g枚r眉nt眉lenecek ve uygulama hakk谋nda ek bilgiler sa臒layacak',
+          copyrightTip: 'Web uygulamas谋nda telif hakk谋 bilgilerini g枚r眉nt眉leme',
+          copyrightTooltip: 'L眉tfen Profesyonel plana veya daha y眉ksek bir plana y眉kseltin',
+        },
+        sso: {
+          title: 'WebApp SSO\'su',
+          tooltip: 'WebApp SSO\'yu etkinle艧tirmek i莽in y枚neticiyle ileti艧ime ge莽in',
+          label: 'SSO Kimlik Do臒rulamas谋',
+          description: 'T眉m kullan谋c谋lar谋n WebApp\'i kullanmadan 枚nce SSO ile oturum a莽malar谋 gerekir',
+        },
+        modalTip: '陌stemci taraf谋 web uygulamas谋 ayarlar谋.',
+      },
+      embedded: {
+        entry: 'G枚m眉l眉',
+        title: 'Siteye Yerle艧tir',
+        explanation: 'Sohbet uygulamas谋n谋 web sitenize yerle艧tirmenin yollar谋n谋 se莽in',
+        iframe: 'Sohbet uygulamas谋n谋 web sitenizin herhangi bir yerine eklemek i莽in bu iframe\'i HTML kodunuza ekleyin.',
+        scripts: 'Sohbet uygulamas谋n谋 web sitenizin sa臒 alt k枚艧esine eklemek i莽in bu kodu HTML\'e ekleyin.',
+        chromePlugin: 'Dify Chatbot Chrome Eklentisini Y眉kleyin',
+        copied: 'Kopyaland谋',
+        copy: 'Kopyala',
+      },
+      qrcode: {
+        title: 'Ba臒lant谋 QR Kodu',
+        scan: 'Payla艧mak 陌莽in Taramak',
+        download: 'QR Kodu 陌ndir',
+      },
+      customize: {
+        way: 'yol',
+        entry: '脰zelle艧tir',
+        title: 'AI WebApp\'i 脰zelle艧tirin',
+        explanation: 'Web Uygulamas谋n谋n 枚n y眉z眉n眉 senaryo ve stil ihtiya莽lar谋n谋za uygun 艧ekilde 枚zelle艧tirebilirsiniz.',
+        way1: {
+          name: '陌stemci kodunu forklayarak de臒i艧tirin ve Vercel\'e da臒谋t谋n (枚nerilen)',
+          step1: '陌stemci kodunu forklayarak de臒i艧tirin',
+          step1Tip: 'Kaynak kodunu GitHub hesab谋n谋za forklayarak de臒i艧tirmek i莽in buraya t谋klay谋n',
+          step1Operation: 'Dify-WebClient',
+          step2: 'Vercel\'e da臒谋t谋n',
+          step2Tip: 'Depoyu Vercel\'e i莽e aktarmak ve da臒谋tmak i莽in buraya t谋klay谋n',
+          step2Operation: 'Depo i莽e aktar',
+          step3: '脟evresel de臒i艧kenleri yap谋land谋r谋n',
+          step3Tip: 'Vercel\'de a艧a臒谋daki 莽evresel de臒i艧kenleri ekleyin',
+        },
+        way2: {
+          name: '陌stemci kodunu yazarak API\'yi 莽a臒谋r谋n ve bir sunucuya da臒谋t谋n',
+          operation: 'Dok眉mantasyon',
+        },
+      },
+      launch: 'Ba艧lat',
+    },
+    apiInfo: {
+      title: 'Arka U莽 Servis API\'si',
+      explanation: 'Kolayca uygulaman谋za entegre edin',
+      accessibleAddress: 'Servis API U莽 Noktas谋',
+      doc: 'API Referans谋',
+    },
+    status: {
+      running: 'Hizmette',
+      disable: 'Devre D谋艧谋',
+    },
+  },
+  analysis: {
+    title: 'Analiz',
+    ms: 'ms',
+    tokenPS: 'Token/s',
+    totalMessages: {
+      title: 'Toplam Mesajlar',
+      explanation: 'G眉nl眉k AI etkile艧imi say谋s谋.',
+    },
+    totalConversations: {
+      title: 'Toplam Konu艧malar',
+      explanation: 'G眉nl眉k AI konu艧malar谋 say谋s谋; prompt m眉hendisli臒i/hata ay谋klama hari莽.',
+    },
+    activeUsers: {
+      title: 'Aktif Kullan谋c谋lar',
+      explanation: 'AI ile Soru-Cevap etkile艧iminde bulunan benzersiz kullan谋c谋lar; prompt m眉hendisli臒i/hata ay谋klama hari莽.',
+    },
+    tokenUsage: {
+      title: 'Token Kullan谋m谋',
+      explanation: 'Uygulama i莽in dil modelinin g眉nl眉k token kullan谋m谋n谋 yans谋t谋r, maliyet kontrol眉 amac谋yla faydal谋d谋r.',
+      consumed: 'T眉ketilen',
+    },
+    avgSessionInteractions: {
+      title: 'Ort. Oturum Etkile艧imleri',
+      explanation: 'Sohbete dayal谋 uygulamalar i莽in s眉rekli kullan谋c谋-AI ileti艧im say谋s谋.',
+    },
+    avgUserInteractions: {
+      title: 'Ort. Kullan谋c谋 Etkile艧imleri',
+      explanation: 'Kullan谋c谋lar谋n g眉nl眉k kullan谋m s谋kl谋臒谋n谋 yans谋t谋r. Bu metrik, kullan谋c谋 ba臒l谋l谋臒谋n谋 yans谋t谋r.',
+    },
+    userSatisfactionRate: {
+      title: 'Kullan谋c谋 Memnuniyet Oran谋',
+      explanation: 'Her 1.000 mesajda al谋nan be臒eni say谋s谋. Bu, kullan谋c谋lar谋n 莽ok memnun oldu臒u cevaplar谋n oran谋n谋 g枚sterir.',
+    },
+    avgResponseTime: {
+      title: 'Ort. Yan谋t S眉resi',
+      explanation: 'Metin tabanl谋 uygulamalar i莽in AI\'谋n i艧lem/yan谋t s眉resi (ms).',
+    },
+    tps: {
+      title: 'Token 脟谋kt谋 H谋z谋',
+      explanation: 'LLM\'nin performans谋n谋 枚l莽眉n. 陌stekten 莽谋kt谋n谋n tamamlanmas谋na kadar LLM\'nin Token 莽谋kt谋 h谋z谋n谋 say谋n.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/tr-TR/app.ts b/i18n/tr-TR/app.ts
new file mode 100644
index 0000000..0e27f84
--- /dev/null
+++ b/i18n/tr-TR/app.ts
@@ -0,0 +1,210 @@
+const translation = {
+  createApp: 'UYGULAMA OLU艦TUR',
+  types: {
+    all: 'Hepsi',
+    chatbot: 'Chatbot',
+    agent: 'Agent',
+    workflow: 'Workflow',
+    completion: 'Tamamlama',
+    advanced: 'Sohbet ak谋艧谋',
+    basic: 'Temel',
+  },
+  duplicate: '脟o臒alt',
+  duplicateTitle: 'Uygulamay谋 脟o臒alt',
+  export: 'DSL D谋艧a Aktar',
+  exportFailed: 'DSL d谋艧a aktar谋m谋 ba艧ar谋s谋z oldu.',
+  importDSL: 'DSL dosyas谋n谋 i莽e aktar',
+  createFromConfigFile: 'DSL dosyas谋ndan olu艧tur',
+  importFromDSL: 'DSL i莽e aktar',
+  importFromDSLFile: 'DSL dosyas谋ndan',
+  importFromDSLUrl: 'URL\'den',
+  importFromDSLUrlPlaceholder: 'DSL ba臒lant谋s谋n谋 buraya yap谋艧t谋r',
+  deleteAppConfirmTitle: 'Bu uygulamay谋 silmek istiyor musunuz?',
+  deleteAppConfirmContent: 'Uygulaman谋n silinmesi geri al谋namaz. Kullan谋c谋lar art谋k uygulaman谋za eri艧emeyecek ve t眉m prompt yap谋land谋rmalar谋 ile loglar kal谋c谋 olarak silinecektir.',
+  appDeleted: 'Uygulama silindi',
+  appDeleteFailed: 'Uygulama silinemedi',
+  join: 'Toplulu臒a kat谋l',
+  communityIntro: 'Farkl谋 kanallarda tak谋m 眉yeleri, katk谋da bulunanlar ve geli艧tiricilerle tart谋艧谋n.',
+  roadmap: 'Yol haritam谋z谋 g枚r眉n',
+  newApp: {
+    startFromBlank: 'Bo艧 Olu艧tur',
+    startFromTemplate: '艦ablondan Olu艧tur',
+    captionAppType: 'Ne t眉r bir uygulama olu艧turmak istiyorsunuz?',
+    chatbotDescription: 'Sohbete dayal谋 bir uygulama olu艧turun. Bu uygulama, 莽oklu turlar halinde s眉rekli konu艧maya izin veren bir soru-cevap format谋 kullan谋r.',
+    completionDescription: 'Prompt temelinde y眉ksek kaliteli metinler 眉reten bir uygulama olu艧turun, 枚rne臒in makaleler, 枚zetler, 莽eviriler ve daha fazlas谋n谋 olu艧turmak i莽in.',
+    completionWarning: 'Bu t眉r bir uygulama art谋k desteklenmeyecek.',
+    agentDescription: 'G枚revleri tamamlamak i莽in ara莽lar谋 ba臒谋ms谋z olarak se莽ebilen bir zeki Agent olu艧turun',
+    workflowDescription: 'Y眉ksek derecede 枚zelle艧tirilebilir bir workflow ile y眉ksek kaliteli metinler 眉reten bir uygulama olu艧turun. Deneyimli kullan谋c谋lar i莽in uygundur.',
+    workflowWarning: '艦u anda beta a艧amas谋nda',
+    chatbotType: 'Chatbot d眉zenleme y枚ntemi',
+    basic: 'Temel',
+    basicTip: 'Yeni ba艧layanlar i莽in, daha sonra Chatflow\'a ge莽ilebilir',
+    basicFor: 'YEN陌 BA艦LAYANLAR 陌脟陌N',
+    basicDescription: 'Temel Orkestrasyon, yerle艧ik promptlar谋 de臒i艧tirme yetene臒i olmadan, basit ayarlarla bir Chatbot uygulamas谋n谋n orkestrasyonuna olanak tan谋r. Yeni ba艧layanlar i莽in uygundur.',
+    advanced: 'Chatflow',
+    advancedFor: 'Geli艧mi艧 kullan谋c谋lar i莽in',
+    advancedDescription: 'Workflow Orkestrasyonu, yerle艧ik promptlar谋 d眉zenleme yetene臒i de dahil olmak 眉zere y眉ksek derecede 枚zelle艧tirme sunarak Chatbotlar谋 workflow formunda d眉zenler. Deneyimli kullan谋c谋lar i莽in uygundur.',
+    captionName: 'Uygulama simgesi & ismi',
+    appNamePlaceholder: 'Uygulaman谋za bir isim verin',
+    captionDescription: 'A莽谋klama',
+    appDescriptionPlaceholder: 'Uygulaman谋n a莽谋klamas谋n谋 girin',
+    useTemplate: 'Bu 艧ablonu kullan',
+    previewDemo: '脰nizleme demosu',
+    chatApp: 'Asistan',
+    chatAppIntro: 'Sohbete dayal谋 bir uygulama olu艧turmak istiyorum. Bu uygulama, 莽oklu turlar halinde s眉rekli konu艧maya izin veren bir soru-cevap format谋 kullan谋r.',
+    agentAssistant: 'Yeni Agent Asistan谋',
+    completeApp: 'Metin 脺retici',
+    completeAppIntro: 'Promptlara dayal谋 olarak y眉ksek kaliteli metinler 眉reten bir uygulama olu艧turmak istiyorum, 枚rne臒in makaleler, 枚zetler, 莽eviriler ve daha fazlas谋n谋 olu艧turmak i莽in.',
+    showTemplates: 'Bir 艧ablondan se莽mek istiyorum',
+    hideTemplates: 'Mod se莽im ekran谋na geri d枚n',
+    Create: 'Olu艧tur',
+    Cancel: '陌ptal',
+    nameNotEmpty: '陌sim bo艧 olamaz',
+    appTemplateNotSelected: 'L眉tfen bir 艧ablon se莽in',
+    appTypeRequired: 'L眉tfen bir uygulama t眉r眉 se莽in',
+    appCreated: 'Uygulama olu艧turuldu',
+    appCreateFailed: 'Uygulama olu艧turulamad谋',
+    appCreateDSLErrorPart4: 'Sistem taraf谋ndan desteklenen DSL s眉r眉m眉:',
+    appCreateDSLErrorPart2: 'Devam etmek istiyor musunuz?',
+    appCreateDSLWarning: 'Dikkat: DSL s眉r眉m fark谋 baz谋 枚zellikleri etkileyebilir',
+    appCreateDSLErrorPart1: 'DSL s眉r眉mlerinde 枚nemli bir fark tespit edildi. 陌莽e aktarmay谋 zorlamak, uygulaman谋n hatal谋 莽al谋艧mas谋na neden olabilir.',
+    caution: 'Dikkat',
+    appCreateDSLErrorPart3: 'Ge莽erli uygulama DSL s眉r眉m眉:',
+    appCreateDSLErrorTitle: 'S眉r眉m Uyumsuzlu臒u',
+    Confirm: 'Onaylamak',
+    foundResults: '{{say谋}} Sonu莽 -lar谋',
+    noAppsFound: 'Uygulama bulunamad谋',
+    chatbotUserDescription: 'Basit yap谋land谋rmayla h谋zl谋 bir 艧ekilde LLM tabanl谋 bir sohbet botu olu艧turun. Daha sonra Chatflow\'a ge莽ebilirsiniz.',
+    optional: 'Opsiyonel',
+    foundResult: '{{say谋}} Sonu莽',
+    noTemplateFound: '艦ablon bulunamad谋',
+    workflowUserDescription: 'Otomasyon ve toplu i艧leme gibi tek turlu g枚revler i莽in i艧 ak谋艧谋 d眉zenlemesi.',
+    advancedUserDescription: 'Bellek 枚zelliklerine sahip 莽ok y枚nl眉 karma艧谋k diyalog g枚revleri i莽in i艧 ak谋艧谋 orkestrasyonu.',
+    completionShortDescription: 'Metin olu艧turma g枚revleri i莽in yapay zeka asistan谋',
+    noTemplateFoundTip: 'Farkl谋 anahtar kelimeler kullanarak arama yapmay谋 deneyin.',
+    learnMore: 'Daha fazla bilgi edinin',
+    agentShortDescription: 'Ak谋l y眉r眉tme ve otonom ara莽 kullan谋m谋na sahip ak谋ll谋 ajan',
+    forBeginners: 'YENI BA艦LAYANLAR I脟IN',
+    workflowShortDescription: 'Tek d枚n眉艧l眉 otomasyon g枚revleri i莽in orkestrasyon',
+    agentUserDescription: 'G枚rev hedeflerine ula艧mak i莽in yinelemeli ak谋l y眉r眉tme ve otonom ara莽 kullan谋m谋 yetene臒ine sahip ak谋ll谋 bir ajan.',
+    chooseAppType: 'Uygulama T眉r眉n眉 Se莽in',
+    completionUserDescription: 'Basit yap谋land谋rmayla metin olu艧turma g枚revleri i莽in h谋zl谋 bir 艧ekilde bir yapay zeka asistan谋 olu艧turun.',
+    chatbotShortDescription: 'Basit kurulumlu LLM tabanl谋 sohbet robotu',
+    advancedShortDescription: 'Haf谋zal谋 karma艧谋k 莽ok d枚n眉艧l眉 diyaloglar i莽in i艧 ak谋艧谋',
+    noIdeaTip: 'Fikriniz yok mu? 艦ablonlar谋m谋za g枚z at谋n',
+    forAdvanced: '陌LERI D脺ZEY KULLANICILAR I脟IN',
+  },
+  editApp: 'Bilgileri D眉zenle',
+  editAppTitle: 'Uygulama Bilgilerini D眉zenle',
+  editDone: 'Uygulama bilgileri g眉ncellendi',
+  editFailed: 'Uygulama bilgileri g眉ncellenemedi',
+  iconPicker: {
+    ok: 'Tamam',
+    cancel: '陌ptal',
+    emoji: 'Emoji',
+    image: 'G枚rsel',
+  },
+  switch: 'Workflow Orkestrasyonuna Ge莽',
+  switchTipStart: 'Sizin i莽in yeni bir uygulama kopyas谋 olu艧turulacak ve yeni kopya Workflow Orkestrasyonuna ge莽ecektir. Yeni kopya ',
+  switchTip: 'izin vermeyecek',
+  switchTipEnd: ' Temel Orkestrasyona geri d枚nmek.',
+  switchLabel: 'Olu艧turulacak uygulama kopyas谋',
+  removeOriginal: 'Orijinal uygulamay谋 sil',
+  switchStart: 'Ge莽i艧i Ba艧lat',
+  typeSelector: {
+    all: 'All Types',
+    chatbot: 'Chatbot',
+    agent: 'Agent',
+    workflow: 'Workflow',
+    completion: 'Completion',
+    advanced: 'Sohbet ak谋艧谋',
+  },
+  tracing: {
+    title: 'Uygulama performans谋n谋 izleme',
+    description: '脺莽眉nc眉 taraf LLMOps sa臒lay谋c谋s谋n谋 yap谋land谋rma ve uygulama performans谋n谋 izleme.',
+    config: 'Yap谋land谋rma',
+    collapse: 'Daralt',
+    expand: 'Geni艧let',
+    tracing: '陌zleme',
+    disabled: 'Devre D谋艧谋',
+    disabledTip: 'L眉tfen 枚nce sa臒lay谋c谋y谋 yap谋land谋r谋n',
+    enabled: 'Hizmette',
+    tracingDescription: 'Uygulama y眉r眉tmesinin tam ba臒lam谋n谋, LLM 莽a臒r谋lar谋, ba臒lam, promptlar, HTTP istekleri ve daha fazlas谋 dahil olmak 眉zere 眉莽眉nc眉 taraf izleme platformuna yakalama.',
+    configProviderTitle: {
+      configured: 'Yap谋land谋r谋ld谋',
+      notConfigured: '陌zlemeyi etkinle艧tirmek i莽in sa臒lay谋c谋y谋 yap谋land谋r谋n',
+      moreProvider: 'Daha Fazla Sa臒lay谋c谋',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: 'LLM destekli uygulama ya艧am d枚ng眉s眉n眉n her ad谋m谋 i莽in her 艧eyi kapsayan bir geli艧tirici platformu.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: 'LLM uygulaman谋z谋 hata ay谋klamak ve geli艧tirmek i莽in izlemeler, de臒erlendirmeler, prompt y枚netimi ve metrikler.',
+    },
+    inUse: 'Kullan谋mda',
+    configProvider: {
+      title: 'Yap谋land谋rma',
+      placeholder: '{{key}} bilgilerinizi girin',
+      project: 'Proje',
+      publicKey: 'Genel Anahtar',
+      secretKey: 'Gizli Anahtar',
+      viewDocsLink: '{{key}} d枚k眉manlar谋n谋 g枚r眉nt眉le',
+      removeConfirmTitle: '{{key}} yap谋land谋rmas谋n谋 kald谋r?',
+      removeConfirmContent: 'Mevcut yap谋land谋rma kullan谋mda, kald谋r谋lmas谋 陌zleme 枚zelli臒ini kapatacakt谋r.',
+    },
+    view: 'G枚r眉n眉m',
+    opik: {
+      title: 'Opik Belediyesi',
+      description: 'Opik, LLM uygulamalar谋n谋 de臒erlendirmek, test etmek ve izlemek i莽in a莽谋k kaynakl谋 bir platformdur.',
+    },
+    weave: {
+      title: 'Dokuma',
+      description: 'Weave, LLM uygulamalar谋n谋 de臒erlendirmek, test etmek ve izlemek i莽in a莽谋k kaynakl谋 bir platformdur.',
+    },
+  },
+  answerIcon: {
+    descriptionInExplore: 'Ke艧fet\'te de臒i艧tirilecek 馃 WebApp simgesinin kullan谋l谋p kullan谋lmayaca臒谋',
+    title: 'De臒i艧tirmek 馃 i莽in WebApp simgesini kullan谋n',
+    description: 'Payla艧谋lan uygulamada de臒i艧tirmek 馃 i莽in WebApp simgesinin kullan谋l谋p kullan谋lmayaca臒谋',
+  },
+  mermaid: {
+    handDrawn: 'Elle 莽izilmi艧',
+    classic: 'Klasik',
+  },
+  openInExplore: 'Ke艧fet\'te A莽',
+  newAppFromTemplate: {
+    sidebar: {
+      Programming: 'Programlama',
+      Assistant: 'Asistan',
+      Writing: 'Yaz谋',
+      Agent: 'Arac谋',
+      Workflow: '陌艧 Ak谋艧谋',
+      Recommended: '脰nerilen',
+      HR: 'HR',
+    },
+    searchAllTemplate: 'T眉m 艧ablonlarda ara...',
+    byCategories: 'KATEGORILERE G脰RE',
+  },
+  showMyCreatedAppsOnly: 'Sadece olu艧turdu臒um uygulamalar谋 g枚ster',
+  appSelector: {
+    noParams: 'Parametre gerekmez',
+    label: 'Uygulama',
+    placeholder: 'Bir uygulama se莽in...',
+    params: 'UYGULAMA PARAMETRELERI',
+  },
+  structOutput: {
+    required: 'Gerekli',
+    structured: 'Yap谋land谋r谋lm谋艧',
+    LLMResponse: 'LLM Yan谋t谋',
+    notConfiguredTip: 'Yap谋land谋r谋lm谋艧 莽谋kt谋 hen眉z yap谋land谋r谋lmam谋艧.',
+    configure: 'Yap谋land谋r',
+    modelNotSupported: 'Model desteklenmiyor',
+    moreFillTip: 'Maksimum 10 katmanl谋 i莽 i莽e ge莽i艧leri g枚sterme',
+    modelNotSupportedTip: 'Mevcut model bu 枚zelli臒i desteklemiyor ve otomatik olarak prompt enjeksiyonuna d眉艧眉r眉l眉yor.',
+    structuredTip: 'Yap谋land谋r谋lm谋艧 脟谋kt谋lar, modelin sa臒lad谋臒谋n谋z JSON 艦emas谋na uyacak 艧ekilde her zaman yan谋tlar 眉retmesini sa臒layan bir 枚zelliktir.',
+  },
+}
+
+export default translation
diff --git a/i18n/tr-TR/billing.ts b/i18n/tr-TR/billing.ts
new file mode 100644
index 0000000..fd51bae
--- /dev/null
+++ b/i18n/tr-TR/billing.ts
@@ -0,0 +1,200 @@
+const translation = {
+  currentPlan: 'Mevcut Plan',
+  upgradeBtn: {
+    plain: 'Plan谋 Y眉kselt',
+    encourage: '艦imdi Y眉kselt',
+    encourageShort: 'Y眉kselt',
+  },
+  viewBilling: 'Faturaland谋rma ve abonelikleri y枚net',
+  buyPermissionDeniedTip: 'Abone olmak i莽in l眉tfen i艧letme y枚neticinize ba艧vurun',
+  plansCommon: {
+    title: 'Size uygun bir plan se莽in',
+    yearlyTip: 'Y谋ll谋k abonelikle 2 ay 眉cretsiz!',
+    mostPopular: 'En Pop眉ler',
+    planRange: {
+      monthly: 'Ayl谋k',
+      yearly: 'Y谋ll谋k',
+    },
+    month: 'ay',
+    year: 'y谋l',
+    save: 'Tasarruf et ',
+    free: '脺cretsiz',
+    currentPlan: 'Mevcut Plan',
+    contractSales: 'Sat谋艧la ileti艧ime ge莽in',
+    contractOwner: 'Tak谋m y枚neticisine ba艧vurun',
+    startForFree: '脺cretsiz Ba艧la',
+    getStartedWith: 'ile ba艧lay谋n',
+    contactSales: 'Sat谋艧larla 陌leti艧ime Ge莽in',
+    talkToSales: 'Sat谋艧larla Konu艧un',
+    modelProviders: 'Model Sa臒lay谋c谋lar',
+    teamMembers: 'Tak谋m 脺yeleri',
+    annotationQuota: 'Ek A莽谋klama Kotas谋',
+    buildApps: 'Uygulamalar Olu艧tur',
+    vectorSpace: 'Vekt枚r Alan谋',
+    vectorSpaceBillingTooltip: 'Her 1MB yakla艧谋k 1.2 milyon karakter vekt枚rize veri depolayabilir (OpenAI Embeddings ile tahmin edilmi艧tir, modellere g枚re farkl谋l谋k g枚sterebilir).',
+    vectorSpaceTooltip: 'Vekt枚r Alan谋, LLM\'lerin verilerinizi anlamas谋 i莽in gerekli uzun s眉reli haf谋za sistemidir.',
+    documentsUploadQuota: 'Dok眉man Y眉kleme Kotas谋',
+    documentProcessingPriority: 'Dok眉man 陌艧leme 脰nceli臒i',
+    documentProcessingPriorityTip: 'Daha y眉ksek dok眉man i艧leme 枚nceli臒i i莽in plan谋n谋z谋 y眉kseltin.',
+    documentProcessingPriorityUpgrade: 'Daha fazla veriyi daha y眉ksek do臒rulukla ve daha h谋zl谋 i艧leyin.',
+    priority: {
+      'standard': 'Standart',
+      'priority': '脰ncelikli',
+      'top-priority': 'En 脰ncelikli',
+    },
+    logsHistory: 'G眉nl眉k Ge莽mi艧i',
+    customTools: '脰zel Ara莽lar',
+    unavailable: 'Mevcut De臒il',
+    days: 'g眉n',
+    unlimited: 'S谋n谋rs谋z',
+    support: 'Destek',
+    supportItems: {
+      communityForums: 'Topluluk forumlar谋',
+      emailSupport: 'E-posta deste臒i',
+      priorityEmail: '脰ncelikli e-posta ve sohbet deste臒i',
+      logoChange: 'Logo de臒i艧ikli臒i',
+      SSOAuthentication: 'SSO kimlik do臒rulama',
+      personalizedSupport: 'Ki艧iselle艧tirilmi艧 destek',
+      dedicatedAPISupport: '脰zel API deste臒i',
+      customIntegration: '脰zel entegrasyon ve destek',
+      ragAPIRequest: 'RAG API Talepleri',
+      bulkUpload: 'Toplu dok眉man y眉kleme',
+      agentMode: 'Agent Modu',
+      workflow: 'Workflow',
+      llmLoadingBalancing: 'LLM Y眉k Dengeleme',
+      llmLoadingBalancingTooltip: 'Modellere birden fazla API anahtar谋 ekleyin, API h谋z s谋n谋rlar谋n谋 etkili bir 艧ekilde a艧谋n.',
+    },
+    comingSoon: 'Yak谋nda geliyor',
+    member: '脺ye',
+    memberAfter: '脺ye',
+    messageRequest: {
+      title: 'Mesaj Kredileri',
+      tooltip: 'OpenAI modellerini (gpt4 hari莽) kullanarak 莽e艧itli planlar i莽in mesaj 莽a臒r谋 kotalar谋. Limitin 眉zerindeki mesajlar OpenAI API Anahtar谋n谋z谋 kullan谋r.',
+      titlePerMonth: '{{count,number}} mesaj/ay',
+    },
+    annotatedResponse: {
+      title: 'Ek A莽谋klama Kota S谋n谋rlar谋',
+      tooltip: 'Yan谋tlar谋n elle d眉zenlenmesi ve ek a莽谋klanmas谋, uygulamalar i莽in 枚zelle艧tirilebilir y眉ksek kaliteli soru-cevap yetenekleri sa臒lar. (Sadece sohbet uygulamalar谋nda ge莽erlidir)',
+    },
+    ragAPIRequestTooltip: 'Dify\'nin sadece bilgi taban谋 i艧leme yeteneklerini 莽a臒谋ran API 莽a臒r谋lar谋 say谋s谋n谋 ifade eder.',
+    receiptInfo: 'Sadece tak谋m sahibi ve tak谋m y枚neticisi abone olabilir ve faturaland谋rma bilgilerini g枚r眉nt眉leyebilir',
+    documentsTooltip: 'Bilgi Veri Kayna臒谋ndan ithal edilen belge say谋s谋na kota.',
+    freeTrialTipSuffix: 'Kredi kart谋 gerekmez',
+    freeTrialTipPrefix: 'Kaydolun ve bir',
+    priceTip: 'i艧 alan谋 ba艧谋na/',
+    documentsRequestQuota: '{{count,number}}/dakika Bilgi 陌ste臒i Oran Limiti',
+    apiRateLimitUnit: '{{count,number}}/g眉n',
+    documents: '{{count,number}} Bilgi Belgesi',
+    comparePlanAndFeatures: 'Planlar谋 ve 枚zellikleri kar艧谋la艧t谋r',
+    self: 'Kendi Bar谋nd谋r谋lan',
+    getStarted: 'Ba艧lay谋n',
+    annualBilling: 'Y谋ll谋k Faturalama',
+    teamMember_one: '{{count,number}} Tak谋m 脺yesi',
+    apiRateLimit: 'API H谋z Limiti',
+    cloud: 'Bulut Hizmeti',
+    teamMember_other: '{{count,number}} Tak谋m 脺yesi',
+    apiRateLimitTooltip: 'Dify API\'si arac谋l谋臒谋yla yap谋lan t眉m isteklerde, metin olu艧turma, sohbet konu艧malar谋, i艧 ak谋艧谋 y眉r眉tmeleri ve belge i艧leme dahil olmak 眉zere, API Oran S谋n谋r谋 uygulan谋r.',
+    unlimitedApiRate: 'API H谋z S谋n谋r谋 Yok',
+    freeTrialTip: '200 OpenAI 莽a臒r谋s谋n谋n 眉cretsiz denemesi.',
+    teamWorkspace: '{{count,number}} Tak谋m 脟al谋艧ma Alan谋',
+    documentsRequestQuotaTooltip: 'Bir 莽al谋艧ma alan谋n谋n bilgi taban谋nda, veri seti olu艧turma, silme, g眉ncellemeler, belge y眉klemeleri, de臒i艧iklikler, ar艧ivleme ve bilgi taban谋 sorgular谋 dahil olmak 眉zere, dakikada ger莽ekle艧tirebilece臒i toplam i艧lem say谋s谋n谋 belirtir. Bu 枚l莽眉t, bilgi taban谋 taleplerinin performans谋n谋 de臒erlendirmek i莽in kullan谋l谋r. 脰rne臒in, bir Sandbox kullan谋c谋s谋 bir dakika i莽inde ard谋艧谋k 10 vurma testi ger莽ekle艧tirirse, 莽al谋艧ma alan谋 bir sonraki dakika i莽in a艧a臒谋daki i艧lemleri ger莽ekle艧tirmesi ge莽ici olarak k谋s谋tlanacakt谋r: veri seti olu艧turma, silme, g眉ncellemeler ve belge y眉klemeleri veya de臒i艧iklikler.',
+  },
+  plans: {
+    sandbox: {
+      name: 'Sandbox',
+      description: '200 kez GPT 眉cretsiz deneme',
+      includesTitle: '陌莽erdikleri:',
+      for: 'Temel Yeteneklerin 脺cretsiz Denemesi',
+    },
+    professional: {
+      name: 'Profesyonel',
+      description: 'Bireyler ve k眉莽眉k tak谋mlar i莽in daha fazla g眉莽 a莽谋n.',
+      includesTitle: '脺cretsiz plandaki her 艧ey, art谋:',
+      for: 'Ba臒谋ms谋z Geli艧tiriciler/K眉莽眉k Tak谋mlar i莽in',
+    },
+    team: {
+      name: 'Tak谋m',
+      description: 'S谋n谋rs谋z i艧birli臒i ve en 眉st d眉zey performans.',
+      includesTitle: 'Profesyonel plandaki her 艧ey, art谋:',
+      for: 'Orta Boyutlu Tak谋mlar 陌莽in',
+    },
+    enterprise: {
+      name: 'Kurumsal',
+      description: 'B眉y眉k 枚l莽ekli kritik sistemler i莽in tam yetenekler ve destek.',
+      includesTitle: 'Tak谋m plandaki her 艧ey, art谋:',
+      features: {
+        3: 'Birden Fazla 脟al谋艧ma Alan谋 ve Kurumsal Y枚netim',
+        8: 'Profesyonel Teknik Destek',
+        4: 'SSO',
+        2: '脰zel 艦irket 脰zellikleri',
+        1: 'Ticari Lisans Yetkilendirmesi',
+        7: 'Dify Taraf谋ndan Resmi G眉ncellemeler ve Bak谋m',
+        5: 'Dify Ortaklar谋 taraf谋ndan m眉zakere edilen SLA\'lar',
+        6: 'Geli艧mi艧 G眉venlik ve Kontroller',
+        0: 'Kurumsal D眉zeyde 脰l莽eklenebilir Da臒谋t谋m 脟枚z眉mleri',
+      },
+      priceTip: 'Y谋ll谋k Faturalama Sadece',
+      for: 'B眉y眉k boyutlu Tak谋mlar i莽in',
+      btnText: 'Sat谋艧 ile 陌leti艧ime Ge莽',
+      price: '脰zel',
+    },
+    community: {
+      features: {
+        1: 'Tek 陌艧 Alan谋',
+        0: 'T眉m Temel 脰zellikler Kamu Deposu Alt谋nda Yay谋nland谋',
+        2: 'Dify A莽谋k Kaynak Lisans谋na uyar',
+      },
+      price: '脺cretsiz',
+      includesTitle: '脺cretsiz 脰zellikler:',
+      name: 'Topluluk',
+      btnText: 'Toplulu臒a Ba艧lay谋n',
+      for: 'Bireysel Kullan谋c谋lar, K眉莽眉k Ekipler veya Ticari Olmayan Projeler 陌莽in',
+      description: 'Bireysel Kullan谋c谋lar, K眉莽眉k Ekipler veya Ticari Olmayan Projeler 陌莽in',
+    },
+    premium: {
+      features: {
+        1: 'Tek 陌艧 Alan谋',
+        0: '脟e艧itli Bulut Sa臒lay谋c谋lar谋 Taraf谋ndan Kendili臒inden Y枚netilen G眉venilirlik',
+        3: '脰ncelikli Email ve Sohbet Deste臒i',
+        2: 'Web Uygulamas谋 Logo ve Markala艧ma 脰zelle艧tirmesi',
+      },
+      name: 'Premium',
+      includesTitle: 'Topluluktan her 艧ey, art谋:',
+      for: 'Orta B眉y眉kl眉kteki Organizasyonlar ve Ekipler i莽in',
+      price: '脰l莽eklenebilir',
+      btnText: 'Premium al谋n',
+      priceTip: 'Bulut Pazar谋na Dayal谋',
+      description: 'Orta B眉y眉kl眉kteki Organizasyonlar ve Ekipler i莽in',
+      comingSoon: 'Microsoft Azure ve Google Cloud Deste臒i Yak谋nda Geliyor',
+    },
+  },
+  vectorSpace: {
+    fullTip: 'Vekt枚r Alan谋 dolu.',
+    fullSolution: 'Daha fazla alan i莽in plan谋n谋z谋 y眉kseltin.',
+  },
+  apps: {
+    fullTipLine1: 'Daha fazla uygulama olu艧turmak i莽in',
+    fullTipLine2: 'plan谋n谋z谋 y眉kseltin.',
+    contactUs: 'Bizimle ileti艧ime ge莽in',
+    fullTip2des: 'Kullan谋m谋 serbest b谋rakmak i莽in etkisiz uygulamalar谋n temizlenmesi 枚nerilir veya bizimle ileti艧ime ge莽in.',
+    fullTip1des: 'Bu planda uygulama olu艧turma limitine ula艧t谋n谋z.',
+    fullTip2: 'Plan limiti a艧谋ld谋',
+    fullTip1: 'Daha fazla uygulama olu艧turmak i莽in y眉kseltin',
+  },
+  annotatedResponse: {
+    fullTipLine1: 'Daha fazla konu艧may谋 a莽谋klamak i莽in',
+    fullTipLine2: 'plan谋n谋z谋 y眉kseltin.',
+    quotaTitle: 'Ek A莽谋klama Yan谋t谋 Kotas谋',
+  },
+  usagePage: {
+    teamMembers: 'Ekip 脺yeleri',
+    vectorSpaceTooltip: 'Y眉ksek Kalite indeksleme moduna sahip belgeler, Bilgi Veri Depolama kaynaklar谋n谋 t眉ketir. Bilgi Veri Depolama s谋n谋r谋na ula艧t谋臒谋nda, yeni belgeler y眉klenmeyecek.',
+    vectorSpace: 'Bilgi Veri Depolama',
+    buildApps: 'Uygulama Geli艧tir',
+    annotationQuota: 'Notland谋rma Kotas谋',
+    documentsUploadQuota: 'Belgeler Y眉kleme Kotas谋',
+  },
+  teamMembers: 'Ekip 脺yeleri',
+}
+
+export default translation
diff --git a/i18n/tr-TR/common.ts b/i18n/tr-TR/common.ts
new file mode 100644
index 0000000..584c0a8
--- /dev/null
+++ b/i18n/tr-TR/common.ts
@@ -0,0 +1,672 @@
+const translation = {
+  api: {
+    success: 'Ba艧ar谋l谋',
+    actionSuccess: '陌艧lem ba艧ar谋l谋',
+    saved: 'Kaydedildi',
+    create: 'Olu艧turuldu',
+    remove: 'Kald谋r谋ld谋',
+  },
+  operation: {
+    create: 'Olu艧tur',
+    confirm: 'Onayla',
+    cancel: '陌ptal',
+    clear: 'Temizle',
+    save: 'Kaydet',
+    saveAndEnable: 'Kaydet ve Etkinle艧tir',
+    edit: 'D眉zenle',
+    add: 'Ekle',
+    added: 'Eklendi',
+    refresh: 'Yeniden Ba艧lat',
+    reset: 'S谋f谋rla',
+    search: 'Ara',
+    change: 'De臒i艧tir',
+    remove: 'Kald谋r',
+    send: 'G枚nder',
+    copy: 'Kopyala',
+    lineBreak: 'Sat谋r sonu',
+    sure: 'Eminim',
+    download: '陌ndir',
+    delete: 'Sil',
+    settings: 'Ayarlar',
+    setup: 'Kurulum',
+    getForFree: '脺cretsiz edinin',
+    reload: 'Yeniden Y眉kle',
+    ok: 'Tamam',
+    log: 'log',
+    learnMore: 'Daha Fazla Bilgi',
+    params: 'Parametreler',
+    duplicate: '脟o臒alt',
+    rename: 'Yeniden Adland谋r',
+    audioSourceUnavailable: 'AudioSource kullan谋lam谋yor',
+    copyImage: 'Resmi Kopyala',
+    zoomOut: 'Uzakla艧t谋rma',
+    openInNewTab: 'Yeni sekmede a莽',
+    zoomIn: 'Yak谋nla艧t谋rma',
+    view: 'G枚r眉n眉m',
+    viewMore: 'DAHA FAZLA G脰STER',
+    regenerate: 'Yenilemek',
+    saveAndRegenerate: 'Alt Par莽alar谋 Kaydetme ve Yeniden Olu艧turma',
+    close: 'Kapatmak',
+    submit: 'G枚nder',
+    skip: 'Gemi',
+    imageCopied: 'Kopyalanan g枚r眉nt眉',
+    deleteApp: 'Uygulamay谋 Sil',
+    copied: 'Kopya -lanan',
+    in: 'i莽inde',
+    viewDetails: 'Detaylar谋 G枚r眉nt眉le',
+    downloadSuccess: '陌ndirme Tamamland谋.',
+    format: 'Format',
+    more: 'Daha fazla',
+    downloadFailed: '陌ndirme ba艧ar谋s谋z oldu. L眉tfen daha sonra tekrar deneyin.',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} gereklidir',
+    urlError: 'URL http:// veya https:// ile ba艧lamal谋d谋r',
+  },
+  placeholder: {
+    input: 'L眉tfen girin',
+    select: 'L眉tfen se莽in',
+  },
+  voice: {
+    language: {
+      zhHans: 'Chinese',
+      zhHant: 'Traditional Chinese',
+      enUS: 'English',
+      deDE: 'German',
+      frFR: 'French',
+      esES: 'Spanish',
+      itIT: 'Italian',
+      thTH: 'Thai',
+      idID: 'Indonesian',
+      jaJP: 'Japanese',
+      koKR: 'Korean',
+      ptBR: 'Portuguese',
+      ruRU: 'Russian',
+      ukUA: 'Ukrainian',
+      viVN: 'Vietnamese',
+      plPL: 'Polish',
+      roRO: 'Romence',
+      hiIN: 'Hint莽e',
+      trTR: 'T眉rk莽e',
+      faIR: 'Fars莽a',
+    },
+  },
+  unit: {
+    char: 'karakter',
+  },
+  actionMsg: {
+    noModification: '艦u an i莽in de臒i艧iklik yok.',
+    modifiedSuccessfully: 'Ba艧ar谋yla de臒i艧tirildi',
+    modifiedUnsuccessfully: 'De臒i艧tirme ba艧ar谋s谋z oldu',
+    copySuccessfully: 'Ba艧ar谋yla kopyaland谋',
+    paySucceeded: '脰deme ba艧ar谋l谋 oldu',
+    payCancelled: '脰deme iptal edildi',
+    generatedSuccessfully: 'Ba艧ar谋yla olu艧turuldu',
+    generatedUnsuccessfully: 'Olu艧turma ba艧ar谋s谋z oldu',
+  },
+  model: {
+    params: {
+      temperature: 'S谋cakl谋k',
+      temperatureTip:
+        'Rastgeleli臒i kontrol eder: S谋cakl谋k d眉艧t眉k莽e daha az rastgele tamamlamalar ger莽ekle艧ir. S谋cakl谋k s谋f谋ra yakla艧t谋k莽a model deterministik ve tekrarl谋 hale gelir.',
+      top_p: 'Top P',
+      top_pTip:
+        '脟e艧itlili臒i nucleus 枚rnekleme ile kontrol eder: 0.5, t眉m olas谋l谋k a臒谋rl谋kl谋 se莽eneklerin yar谋s谋n谋n dikkate al谋nd谋臒谋 anlam谋na gelir.',
+      presence_penalty: 'Varl谋k cezas谋',
+      presence_penaltyTip:
+        '艦imdiye kadar metinde g枚r眉n眉p g枚r眉nmedi臒ine ba臒l谋 olarak yeni tokenlar谋 ne kadar cezaland谋raca臒谋n谋 belirler.\nModelin yeni konular hakk谋nda konu艧ma olas谋l谋臒谋n谋 art谋r谋r.',
+      frequency_penalty: 'Frekans cezas谋',
+      frequency_penaltyTip:
+        'Mevcut metindeki frekanslar谋na g枚re yeni tokenlar谋 ne kadar cezaland谋raca臒谋n谋 belirler.\nModelin ayn谋 sat谋r谋 aynen tekrarlama olas谋l谋臒谋n谋 azalt谋r.',
+      max_tokens: 'Maksimum token',
+      max_tokensTip:
+        'Yan谋t谋n maksimum uzunlu臒unu token cinsinden s谋n谋rlar.\nDaha b眉y眉k de臒erler prompt kelimeleri, sohbet kay谋tlar谋 ve Bilgiler i莽in b谋rak谋lacak alan谋 s谋n谋rlayabilir. \n陌ki 眉莽眉n alt谋nda ayarlanmas谋 枚nerilir\ngpt-4-1106-preview, gpt-4-vision-preview maksimum token (giri艧 128k, 莽谋k谋艧 4k).',
+      maxTokenSettingTip: 'Maksimum token ayar谋n谋z y眉ksek, bu da promptlar, sorgular ve veriler i莽in alan谋 s谋n谋rlayabilir. Bu de臒eri 2/3\'眉n alt谋nda ayarlamay谋 d眉艧眉n眉n.',
+      setToCurrentModelMaxTokenTip: 'Maksimum token, mevcut modelin maksimum token\'谋n %80\'ine {maxToken} olarak g眉ncellendi.',
+      stop_sequences: 'Stop s谋ralar谋',
+      stop_sequencesTip: 'API, d枚rt adede kadar s谋ra belirleyerek daha fazla token 眉retmeyi durduracakt谋r. D枚n眉len metin durdurma s谋ras谋n谋 i莽ermez.',
+      stop_sequencesPlaceholder: 'S谋ra girin ve Tab tu艧una bas谋n',
+    },
+    tone: {
+      Creative: 'Yarat谋c谋',
+      Balanced: 'Dengeli',
+      Precise: 'Kesin',
+      Custom: '脰zel',
+    },
+    addMoreModel: 'Daha fazla model eklemek i莽in ayarlara gidin',
+    capabilities: 'MultiModal Yetenekler',
+    settingsLink: 'Model Sa臒lay谋c谋 Ayarlar谋',
+  },
+  menus: {
+    status: 'beta',
+    explore: 'Ke艧fet',
+    apps: 'Studio',
+    plugins: 'Eklentiler',
+    pluginsTips: '脺莽眉nc眉 taraf eklentileri entegre edin veya ChatGPT uyumlu AI-Eklentileri olu艧turun.',
+    datasets: 'Bilgi',
+    datasetsTips: 'YAKINDA: Kendi metin verilerinizi i莽e aktar谋n veya LLM ba臒lam谋n谋 geli艧tirmek i莽in Webhook arac谋l谋臒谋yla ger莽ek zamanl谋 veri yaz谋n.',
+    newApp: 'Yeni Uygulama',
+    newDataset: 'Bilgi Olu艧tur',
+    tools: 'Ara莽lar',
+    exploreMarketplace: 'Marketplace\'i Ke艧fedin',
+  },
+  userProfile: {
+    settings: 'Ayarlar',
+    emailSupport: 'E-posta Deste臒i',
+    workspace: '脟al谋艧ma Alan谋',
+    createWorkspace: '脟al谋艧ma Alan谋 Olu艧tur',
+    helpCenter: 'Yard谋m',
+    communityFeedback: 'Geri Bildirim',
+    roadmap: 'Yol haritas谋',
+    community: 'Topluluk',
+    about: 'Hakk谋nda',
+    logout: '脟谋k谋艧 Yap',
+    support: 'Destek',
+    compliance: 'Uygunluk',
+    github: 'GitHub',
+  },
+  settings: {
+    accountGroup: 'HESAP',
+    workplaceGroup: '脟ALI艦MA ALANI',
+    account: 'Hesab谋m',
+    members: '脺yeler',
+    billing: 'Faturaland谋rma',
+    integrations: 'Entegrasyonlar',
+    language: 'Dil',
+    provider: 'Model Sa臒lay谋c谋',
+    dataSource: 'Veri Kayna臒谋',
+    plugin: 'Eklentiler',
+    apiBasedExtension: 'API Uzant谋s谋',
+    generalGroup: 'GENEL',
+  },
+  account: {
+    avatar: 'Avatar',
+    name: '陌sim',
+    email: 'E-posta',
+    password: '艦ifre',
+    passwordTip: 'Ge莽ici giri艧 kodlar谋n谋 kullanmak istemiyorsan谋z kal谋c谋 bir 艧ifre ayarlayabilirsiniz',
+    setPassword: '艦ifre Ayarla',
+    resetPassword: '艦ifreyi S谋f谋rla',
+    currentPassword: 'Mevcut 艧ifre',
+    newPassword: 'Yeni 艧ifre',
+    confirmPassword: '艦ifreyi onayla',
+    notEqual: '陌ki 艧ifre ayn谋 de臒il.',
+    langGeniusAccount: 'Dify hesab谋',
+    langGeniusAccountTip: 'Dify hesab谋n谋z ve ili艧kili kullan谋c谋 verileri.',
+    editName: '陌smi D眉zenle',
+    showAppLength: '{{length}} uygulamay谋 g枚ster',
+    delete: 'Hesab谋 Sil',
+    deleteTip: 'Hesab谋n谋z谋 silmek t眉m verilerinizi kal谋c谋 olarak siler ve geri al谋namaz.',
+    deleteConfirmTip: 'Onaylamak i莽in, kay谋tl谋 e-postan谋zdan 艧u adrese e-posta g枚nderin: ',
+    account: 'Hesap',
+    myAccount: 'Hesab谋m',
+    studio: 'Dify St眉dyo',
+    deleteSuccessTip: 'Hesab谋n谋z谋n silme i艧leminin tamamlanmas谋 i莽in zamana ihtiyac谋 var. Her 艧ey bitti臒inde size e-posta g枚nderece臒iz.',
+    deletePrivacyLink: 'Gizlilik Politikas谋.',
+    feedbackTitle: 'Geri besleme',
+    verificationPlaceholder: '6 haneli kodu yap谋艧t谋r谋n',
+    feedbackLabel: 'Hesab谋n谋z谋 neden sildi臒inizi bize bildirin?',
+    deleteLabel: 'Onaylamak i莽in l眉tfen a艧a臒谋ya e-postan谋z谋 yaz谋n',
+    deletePlaceholder: 'L眉tfen e-posta adresinizi giriniz',
+    verificationLabel: 'Do臒rulama Kodu',
+    feedbackPlaceholder: 'Opsiyonel',
+    permanentlyDeleteButton: 'Hesab谋 Kal谋c谋 Olarak Sil',
+    deletePrivacyLinkTip: 'Verilerinizi nas谋l i艧ledi臒imiz hakk谋nda daha fazla bilgi i莽in l眉tfen',
+    sendVerificationButton: 'Do臒rulama Kodu G枚nder',
+    workspaceName: '脟al谋艧ma Alan谋 Ad谋',
+    workspaceIcon: '脟al谋艧ma Alan谋 陌konu',
+    editWorkspaceInfo: '脟al谋艧ma Alan谋 Bilgilerini D眉zenle',
+  },
+  members: {
+    team: 'Tak谋m',
+    invite: 'Ekle',
+    name: '陌S陌M',
+    lastActive: 'SON AKT陌F',
+    role: 'ROLLER',
+    pending: 'Beklemede...',
+    owner: 'Sahibi',
+    admin: 'Y枚netici',
+    adminTip: 'Uygulama olu艧turabilir ve tak谋m ayarlar谋n谋 y枚netebilir',
+    normal: 'Normal',
+    normalTip: 'Sadece uygulamalar谋 kullanabilir, uygulama olu艧turamaz',
+    builder: 'Olu艧turucu',
+    builderTip: 'Kendi uygulamalar谋n谋 olu艧turup d眉zenleyebilir',
+    editor: 'Edit枚r',
+    editorTip: 'Uygulama olu艧turabilir ve d眉zenleyebilir',
+    datasetOperator: 'Bilgi Y枚neticisi',
+    datasetOperatorTip: 'Sadece bilgi taban谋n谋 y枚netebilir',
+    inviteTeamMember: 'Tak谋m 脺yesi Ekle',
+    inviteTeamMemberTip: 'Giri艧 yapt谋ktan sonra tak谋m verilerinize do臒rudan eri艧ebilirler.',
+    emailNotSetup: 'E-posta sunucusu kurulu de臒il, bu nedenle davet e-postalar谋 g枚nderilemiyor. L眉tfen kullan谋c谋lar谋 davetten sonra verilecek davet ba臒lant谋s谋 hakk谋nda bilgilendirin.',
+    email: 'E-posta',
+    emailInvalid: 'Ge莽ersiz E-posta Format谋',
+    emailPlaceholder: 'L眉tfen e-postalar谋 girin',
+    sendInvite: 'Davet G枚nder',
+    invitedAsRole: '{{role}} kullan谋c谋s谋 olarak davet edildi',
+    invitationSent: 'Davet g枚nderildi',
+    invitationSentTip: 'Davet g枚nderildi, Dify\'ye giri艧 yaparak tak谋m verilerinize eri艧ebilirler.',
+    invitationLink: 'Davet Linki',
+    failedInvitationEmails: 'A艧a臒谋daki kullan谋c谋lar ba艧ar谋yla davet edilmedi',
+    ok: 'Tamam',
+    removeFromTeam: 'Tak谋mdan Kald谋r',
+    removeFromTeamTip: 'Tak谋m eri艧imi kald谋r谋lacak',
+    setAdmin: 'Y枚netici olarak ayarla',
+    setMember: 'Normal 眉ye olarak ayarla',
+    setBuilder: 'Olu艧turucu olarak ayarla',
+    setEditor: 'Edit枚r olarak ayarla',
+    disInvite: 'Davetiyeyi iptal et',
+    deleteMember: '脺yeyi Sil',
+    you: '(Siz)',
+  },
+  integrations: {
+    connected: 'Ba臒land谋',
+    google: 'Google',
+    googleAccount: 'Google hesab谋yla giri艧 yap',
+    github: 'GitHub',
+    githubAccount: 'GitHub hesab谋yla giri艧 yap',
+    connect: 'Ba臒lan',
+  },
+  language: {
+    displayLanguage: 'G枚r眉nt眉leme Dili',
+    timezone: 'Zaman Dilimi',
+  },
+  provider: {
+    apiKey: 'API Anahtar谋',
+    enterYourKey: 'API anahtar谋n谋z谋 buraya girin',
+    invalidKey: 'Ge莽ersiz OpenAI API anahtar谋',
+    validatedError: 'Do臒rulama hatas谋: ',
+    validating: 'Anahtar do臒rulan谋yor...',
+    saveFailed: 'API anahtar谋n谋 kaydetme ba艧ar谋s谋z oldu',
+    apiKeyExceedBill: 'Bu API ANAHTARININ kullan谋labilir kotas谋 yok, l眉tfen okuyun',
+    addKey: 'Anahtar Ekle',
+    comingSoon: 'Yak谋nda',
+    editKey: 'D眉zenle',
+    invalidApiKey: 'Ge莽ersiz API anahtar谋',
+    azure: {
+      apiBase: 'API Taban谋',
+      apiBasePlaceholder: 'Azure OpenAI Endpoint\'inizin API Taban谋 URL\'si.',
+      apiKey: 'API Anahtar谋',
+      apiKeyPlaceholder: 'API anahtar谋n谋z谋 buraya girin',
+      helpTip: 'Azure OpenAI Service hakk谋nda bilgi edinin',
+    },
+    openaiHosted: {
+      openaiHosted: 'Bar谋nd谋r谋lan OpenAI',
+      onTrial: 'DENEMEDE',
+      exhausted: 'KOTA DOLU',
+      desc: 'Dify taraf谋ndan sa臒lanan OpenAI bar谋nd谋rma hizmeti, GPT-3.5 gibi modelleri kullanman谋za olanak tan谋r. Deneme kotan谋z bitmeden 枚nce, di臒er model sa臒lay谋c谋lar谋n谋 ayarlaman谋z gerekir.',
+      callTimes: '脟a臒r谋 s眉releri',
+      usedUp: 'Deneme kotas谋 kullan谋ld谋. Kendi Model Sa臒lay谋c谋n谋z谋 ekleyin.',
+      useYourModel: '艦u anda kendi Model Sa臒lay谋c谋n谋z谋 kullan谋yorsunuz.',
+      close: 'Kapat',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: 'DENEMEDE',
+      exhausted: 'KOTA DOLU',
+      desc: 'G眉莽l眉 model, karma艧谋k diyaloglar ve yarat谋c谋 i莽erik 眉retiminden ayr谋nt谋l谋 y枚nlendirmeye kadar geni艧 bir g枚rev yelpazesi konusunda m眉kemmeldir.',
+      callTimes: '脟a臒r谋 S眉releri',
+      usedUp: 'Deneme kotas谋 kullan谋ld谋. Kendi Model Sa臒lay谋c谋n谋z谋 ekleyin.',
+      useYourModel: '艦u anda kendi Model Sa臒lay谋c谋n谋z谋 kullan谋yorsunuz.',
+      close: 'Kapat',
+      trialQuotaTip: 'Antropik deneme kotan谋z 11/03/2025 tarihinde sona erecek ve bu tarihten sonra kullan谋lamayacakt谋r. L眉tfen zaman谋nda kullan谋n.',
+    },
+    anthropic: {
+      using: 'Yerle艧tirme yetene臒i,',
+      enableTip: 'Anthropic modelini etkinle艧tirmek i莽in 枚nce OpenAI veya Azure OpenAI hizmetine ba臒lanman谋z gerekir.',
+      notEnabled: 'Etkin de臒il',
+      keyFrom: 'API anahtar谋n谋z谋 Anthropic\'ten edinin',
+    },
+    encrypted: {
+      front: 'API ANAHTARINIZ 艧u kullan谋larak 艧ifrelenip saklanacak:',
+      back: ' teknolojisi.',
+    },
+  },
+  modelProvider: {
+    notConfigured: 'Sistem modeli hen眉z tam olarak yap谋land谋r谋lmad谋 ve baz谋 i艧levler kullan谋lamayabilir.',
+    systemModelSettings: 'Sistem Model Ayarlar谋',
+    systemModelSettingsLink: 'Sistem modelini ayarlamak neden gereklidir?',
+    selectModel: 'Modelinizi se莽in',
+    setupModelFirst: 'L眉tfen 枚nce modelinizi ayarlay谋n',
+    systemReasoningModel: {
+      key: 'Sistem 脟谋kar谋m Modeli',
+      tip: 'Uygulamalar olu艧turmak ve diyalog ad谋 olu艧turma ve sonraki soru 枚nerisi gibi 枚zelliklerin otomatikle艧tirilmesi i莽in kullan谋lacak varsay谋lan 莽谋kar谋m modelini ayarlay谋n.',
+    },
+    embeddingModel: {
+      key: 'Yerle艧tirme Modeli',
+      tip: 'Bilginin belge yerle艧tirme i艧lemi i莽in varsay谋lan modeli ayarlay谋n, Bilginin geri al谋m谋 ve i莽e aktar谋m谋 i莽in bu Yerle艧tirme modeli kullan谋larak vekt枚rizasyon i艧lemleri yap谋l谋r. De臒i艧tirilmesi, i莽e aktar谋lan Bilgilere ve sorulara aras谋ndaki vekt枚r boyutlar谋n谋n tutars谋z olmas谋na neden olarak geri al谋m hatas谋na yol a莽ar. Geri al谋m hatas谋n谋 枚nlemek i莽in 枚nce modeli keyfi olarak de臒i艧tirmeyin.',
+      required: 'Yerle艧tirme Modeli gereklidir',
+    },
+    speechToTextModel: {
+      key: 'Konu艧madan Metne Modeli',
+      tip: 'Konu艧mada konu艧madan metne giri艧 i莽in varsay谋lan modeli ayarlay谋n.',
+    },
+    ttsModel: {
+      key: 'Metinden Konu艧maya Modeli',
+      tip: 'Konu艧mada metinden konu艧maya giri艧 i莽in varsay谋lan modeli ayarlay谋n.',
+    },
+    rerankModel: {
+      key: 'Yeniden S谋ralama Modeli',
+      tip: 'Yeniden s谋ralama modeli, kullan谋c谋 sorgusuyla anlam e艧le艧tirmesine dayal谋 olarak aday belge listesini yeniden s谋ralayacak ve anlam s谋ralama sonu莽lar谋n谋 iyile艧tirecektir.',
+    },
+    apiKey: 'API-KEY',
+    quota: 'Kota',
+    searchModel: 'Model ara',
+    noModelFound: '{{model}} i莽in model bulunamad谋',
+    models: 'Modeller',
+    showMoreModelProvider: 'Daha fazla model sa臒lay谋c谋 g枚ster',
+    selector: {
+      tip: 'Bu model kald谋r谋ld谋. L眉tfen bir model ekleyin veya ba艧ka bir model se莽in.',
+      emptyTip: 'Kullan谋labilir model yok',
+      emptySetting: 'L眉tfen ayarlara gidip yap谋land谋r谋n',
+      rerankTip: 'L眉tfen Yeniden S谋ralama modelini ayarlay谋n',
+    },
+    card: {
+      quota: 'KOTA',
+      onTrial: 'Deneme S眉r眉m眉nde',
+      paid: '脺cretli',
+      quotaExhausted: 'Kota T眉kendi',
+      callTimes: '脟a臒r谋 S眉releri',
+      tokens: 'Tokenler',
+      buyQuota: 'Kota Sat谋n Al',
+      priorityUse: '脰ncelikli Kullan',
+      removeKey: 'API Anahtar谋n谋 Kald谋r',
+      tip: '脰ncelikle 眉cretli kota kullan谋lacakt谋r. Deneme kotas谋, 眉cretli kota t眉kendi臒inde kullan谋lacakt谋r.',
+    },
+    item: {
+      deleteDesc: '{{modelName}} 艧u anda sistem 莽谋kar谋m modeli olarak kullan谋lmaktad谋r. Kald谋r谋ld谋ktan sonra baz谋 i艧levler kullan谋lamayabilir. L眉tfen onaylay谋n.',
+      freeQuota: '脺CRETS陌Z KOTA',
+    },
+    addApiKey: 'API anahtar谋n谋z谋 ekleyin',
+    invalidApiKey: 'Ge莽ersiz API anahtar谋',
+    encrypted: {
+      front: 'API ANAHTARINIZ 艧u kullan谋larak 艧ifrelenip saklanacak:',
+      back: ' teknolojisi.',
+    },
+    freeQuota: {
+      howToEarn: 'Nas谋l kazan谋l谋r',
+    },
+    addMoreModelProvider: 'DAHA FAZLA MODEL SA臑LAYICI EKLEY陌N',
+    addModel: 'Model Ekle',
+    modelsNum: '{{num}} Model',
+    showModels: 'Modelleri G枚ster',
+    showModelsNum: '{{num}} Modeli G枚ster',
+    collapse: 'Daralt',
+    config: 'Yap谋land谋r',
+    modelAndParameters: 'Model ve Parametreler',
+    model: 'Model',
+    featureSupported: '{{feature}} desteklenir',
+    callTimes: '脟a臒r谋 S眉releri',
+    credits: 'Mesaj Kredileri',
+    buyQuota: 'Kota Sat谋n Al',
+    getFreeTokens: '脺cretsiz Token Al',
+    priorityUsing: '脰ncelikli Kullan谋m',
+    deprecated: 'Kullan谋m d谋艧谋',
+    confirmDelete: 'silme onay谋?',
+    quotaTip: 'Kalan kullan谋labilir 眉cretsiz tokenler',
+    loadPresets: 'Haz谋r Ayarlar谋 Y眉kle',
+    parameters: 'PARAMETRELER',
+    loadBalancing: 'Y眉k dengeleme',
+    loadBalancingDescription: 'Birden fazla kimlik bilgisi grubu ile bask谋y谋 azalt谋n.',
+    loadBalancingHeadline: 'Y眉k Dengeleme',
+    configLoadBalancing: 'Y眉k Dengelemeyi Yap谋land谋r',
+    modelHasBeenDeprecated: 'Bu model kullan谋m d谋艧谋d谋r',
+    providerManaged: 'Sa臒lay谋c谋 taraf谋ndan y枚netilen',
+    providerManagedDescription: 'Model sa臒lay谋c谋 taraf谋ndan sa臒lanan tek bir kimlik bilgisi grubunu kullan谋n.',
+    defaultConfig: 'Varsay谋lan Yap谋land谋rma',
+    apiKeyStatusNormal: 'API Anahtar谋n谋n durumu normal',
+    apiKeyRateLimit: 'H谋z s谋n谋r谋na ula艧谋ld谋, {{seconds}} saniye sonra tekrar kullan谋labilir',
+    addConfig: 'Yap谋land谋rma Ekle',
+    editConfig: 'Yap谋land谋rmay谋 D眉zenle',
+    loadBalancingLeastKeyWarning: 'Y眉k dengeleme etkinle艧tirmek i莽in en az 2 anahtar etkinle艧tirilmelidir.',
+    loadBalancingInfo: 'Varsay谋lan olarak, y眉k dengeleme Yuvarlakrobin stratejisini kullan谋r. H谋z s谋n谋rlamas谋 tetiklenirse, 1 dakikal谋k bir so臒uma s眉resi uygulanacakt谋r.',
+    upgradeForLoadBalancing: 'Y眉k Dengelemeyi etkinle艧tirmek i莽in plan谋n谋z谋 y眉kseltin.',
+    installProvider: 'Model sa臒lay谋c谋lar谋n谋 y眉kleme',
+    toBeConfigured: 'Yap谋land谋r谋lacak',
+    emptyProviderTip: 'L眉tfen 枚nce bir model sa臒lay谋c谋 y眉kleyin.',
+    emptyProviderTitle: 'Model sa臒lay谋c谋 ayarlanmad谋',
+    discoverMore: 'Daha fazlas谋n谋 ke艧fedin',
+    configureTip: 'Api-key\'i ayarlay谋n veya kullanmak i莽in model ekleyin',
+  },
+  dataSource: {
+    add: 'Bir veri kayna臒谋 ekle',
+    connect: 'Ba臒lan',
+    configure: 'Yap谋land谋r',
+    notion: {
+      title: 'Notion',
+      description: 'Bilgi i莽in veri kayna臒谋 olarak Notion kullanma.',
+      connectedWorkspace: 'Ba臒l谋 莽al谋艧ma alan谋',
+      addWorkspace: '脟al谋艧ma alan谋 ekle',
+      connected: 'Ba臒land谋',
+      disconnected: 'Ba臒lant谋 Kesildi',
+      changeAuthorizedPages: 'Yetkilendirilen sayfalar谋 de臒i艧tir',
+      pagesAuthorized: 'Yetkilendirilen sayfalar',
+      sync: 'Senkronize et',
+      remove: 'Kald谋r',
+      selector: {
+        pageSelected: 'Se莽ilen Sayfalar',
+        searchPages: 'Sayfalar谋 ara...',
+        noSearchResult: 'Arama sonucu yok',
+        addPages: 'Sayfa ekle',
+        preview: '脰N陌ZLEME',
+      },
+    },
+    website: {
+      title: 'Web Sitesi',
+      description: 'Web taray谋c谋 kullanarak web sitelerinden i莽erik i莽e aktar谋n.',
+      with: '陌le',
+      configuredCrawlers: 'Yap谋land谋r谋lm谋艧 taray谋c谋lar',
+      active: 'Aktif',
+      inactive: 'Pasif',
+    },
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'API Anahtar谋',
+      apiKeyPlaceholder: 'API anahtar谋n谋z谋 girin',
+      keyFrom: 'SerpAPI Hesap Sayfas谋ndan SerpAPI anahtar谋n谋z谋 al谋n',
+    },
+  },
+  apiBasedExtension: {
+    title: 'API uzant谋lar谋 merkezi API y枚netimi sa臒lar, Dify\'nin uygulamalar谋 aras谋nda kolay kullan谋m i莽in yap谋land谋rmay谋 basitle艧tirir.',
+    link: 'Kendi API Uzant谋n谋z谋 nas谋l geli艧tirece臒inizi 枚臒renin.',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: 'API Uzant谋s谋 Ekle',
+    selector: {
+      title: 'API Uzant谋s谋',
+      placeholder: 'L眉tfen API uzant谋s谋n谋 se莽in',
+      manage: 'API Uzant谋s谋n谋 Y枚net',
+    },
+    modal: {
+      title: 'API Uzant谋s谋 Ekle',
+      editTitle: 'API Uzant谋s谋n谋 D眉zenle',
+      name: {
+        title: 'Ad',
+        placeholder: 'L眉tfen ad谋 girin',
+      },
+      apiEndpoint: {
+        title: 'API U莽 Noktas谋',
+        placeholder: 'L眉tfen API u莽 noktas谋n谋 girin',
+      },
+      apiKey: {
+        title: 'API anahtar谋',
+        placeholder: 'L眉tfen API anahtar谋n谋 girin',
+        lengthError: 'API anahtar谋 uzunlu臒u 5 karakterden az olamaz',
+      },
+    },
+    type: 'T眉r',
+  },
+  about: {
+    changeLog: 'De臒i艧iklik G眉nl眉臒眉',
+    updateNow: '艦imdi g眉ncelle',
+    nowAvailable: 'Dify {{version}} 艧imdi mevcut.',
+    latestAvailable: 'Dify {{version}} en son mevcut s眉r眉m.',
+  },
+  appMenus: {
+    overview: '陌zleme',
+    promptEng: 'Orchestrate',
+    apiAccess: 'API Eri艧imi',
+    logAndAnn: 'G眉nl眉kler & Anlamland谋rmalar',
+    logs: 'G眉nl眉kler',
+  },
+  environment: {
+    testing: 'TEST',
+    development: 'GEL陌艦T陌RME',
+  },
+  appModes: {
+    completionApp: 'Metin 脺reteci',
+    chatApp: 'Sohbet Uygulamas谋',
+  },
+  datasetMenus: {
+    documents: 'Belgeler',
+    hitTesting: 'Geri Al谋m Testi',
+    settings: 'Ayarlar',
+    emptyTip: 'Bilgi ili艧kilendirilmemi艧, ili艧kilendirme i艧lemini tamamlamak i莽in uygulama veya eklentiye gidin.',
+    viewDoc: 'D枚k眉mantasyon g枚r眉nt眉le',
+    relatedApp: 'ba臒lant谋l谋 uygulamalar',
+    noRelatedApp: 'Ba臒l谋 uygulama yok',
+  },
+  voiceInput: {
+    speaking: '艦imdi konu艧...',
+    converting: 'Metne d枚n眉艧t眉r眉l眉yor...',
+    notAllow: 'mikrofon yetkilendirilmedi',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: 'Konu艧may谋 Yeniden Adland谋r',
+    conversationName: 'Konu艧ma ad谋',
+    conversationNamePlaceholder: 'Konu艧ma ad谋n谋 girin',
+    conversationNameCanNotEmpty: 'Konu艧ma ad谋 gereklidir',
+    citation: {
+      title: 'ALINTILAR',
+      linkToDataset: 'Bilgiye Ba臒lant谋',
+      characters: 'Karakterler:',
+      hitCount: 'Geri Al谋m Say谋s谋:',
+      vectorHash: 'Vekt枚r Hash:',
+      hitScore: 'Geri Al谋m Skoru:',
+    },
+    inputPlaceholder: 'Bot ile konu艧',
+    thought: 'D眉艧眉nce',
+    thinking: 'D眉艧眉n眉...',
+    resend: 'Yeniden g枚nder',
+  },
+  promptEditor: {
+    placeholder: 'Prompt kelimenizi buraya yaz谋n, de臒i艧ken eklemek i莽in \'{\' tu艧una, prompt i莽erik blo臒u eklemek i莽in \'/\' tu艧una bas谋n',
+    context: {
+      item: {
+        title: 'Ba臒lam',
+        desc: 'Ba臒lam 艧ablonunu ekle',
+      },
+      modal: {
+        title: 'Ba臒lamda {{num}} Knowledge',
+        add: 'Ba臒lam Ekle',
+        footer: 'Ba臒lamlar谋 a艧a臒谋daki Ba臒lam b枚l眉m眉nde y枚netebilirsiniz.',
+      },
+    },
+    history: {
+      item: {
+        title: 'Konu艧ma Ge莽mi艧i',
+        desc: 'Tarihi mesaj 艧ablonunu ekle',
+      },
+      modal: {
+        title: '脰RNEK',
+        user: 'Merhaba',
+        assistant: 'Merhaba! Bug眉n size nas谋l yard谋mc谋 olabilirim?',
+        edit: 'Konu艧ma Rol 陌simlerini D眉zenle',
+      },
+    },
+    variable: {
+      item: {
+        title: 'De臒i艧kenler & Harici Ara莽lar',
+        desc: 'De臒i艧kenler & Harici Ara莽lar ekle',
+      },
+      outputToolDisabledItem: {
+        title: 'De臒i艧kenler',
+        desc: 'De臒i艧kenleri ekle',
+      },
+      modal: {
+        add: 'Yeni de臒i艧ken',
+        addTool: 'Yeni ara莽',
+      },
+    },
+    query: {
+      item: {
+        title: 'Sorgu',
+        desc: 'Kullan谋c谋 sorgu 艧ablonunu ekle',
+      },
+    },
+    existed: 'Zaten prompt i莽inde mevcut',
+  },
+  imageUploader: {
+    uploadFromComputer: 'Bilgisayardan Y眉kle',
+    uploadFromComputerReadError: 'G枚r眉nt眉 okuma ba艧ar谋s谋z oldu, l眉tfen tekrar deneyin.',
+    uploadFromComputerUploadError: 'G枚r眉nt眉 y眉kleme ba艧ar谋s谋z oldu, l眉tfen tekrar y眉kleyin.',
+    uploadFromComputerLimit: 'Y眉kleme g枚r眉nt眉leri {{size}} MB\'yi a艧amaz',
+    pasteImageLink: 'G枚r眉nt眉 ba臒lant谋s谋n谋 yap谋艧t谋r',
+    pasteImageLinkInputPlaceholder: 'G枚r眉nt眉 ba臒lant谋s谋n谋 buraya yap谋艧t谋r谋n',
+    pasteImageLinkInvalid: 'Ge莽ersiz g枚r眉nt眉 ba臒lant谋s谋',
+    imageUpload: 'G枚r眉nt眉 Y眉kleme',
+  },
+  tag: {
+    placeholder: 'T眉m Etiketler',
+    addNew: 'Yeni etiket ekle',
+    noTag: 'Etiket yok',
+    noTagYet: 'Hen眉z etiket yok',
+    addTag: 'Etiket ekle',
+    editTag: 'Etiketleri d眉zenle',
+    manageTags: 'Etiketleri Y枚net',
+    selectorPlaceholder: 'Aramak veya olu艧turmak i莽in yaz谋n',
+    create: 'Olu艧tur',
+    delete: 'Etiketi sil',
+    deleteTip: 'Etiket kullan谋l谋yor, silinsin mi?',
+    created: 'Etiket ba艧ar谋yla olu艧turuldu',
+    failed: 'Etiket olu艧turma ba艧ar谋s谋z oldu',
+  },
+  fileUploader: {
+    pasteFileLink: 'Dosya ba臒lant谋s谋n谋 yap谋艧t谋r',
+    uploadFromComputer: 'Yerel y眉kleme',
+    uploadFromComputerReadError: 'Dosya okuma ba艧ar谋s谋z oldu, l眉tfen tekrar deneyin.',
+    uploadFromComputerLimit: 'Dosya Y眉kleme {{size}}\'谋 a艧amaz',
+    uploadFromComputerUploadError: 'Dosya y眉kleme ba艧ar谋s谋z oldu, l眉tfen tekrar y眉kleyin.',
+    pasteFileLinkInputPlaceholder: 'URL\'yi giriniz...',
+    pasteFileLinkInvalid: 'Ge莽ersiz dosya ba臒lant谋s谋',
+    fileExtensionNotSupport: 'Dosya uzant谋s谋 desteklenmiyor',
+  },
+  license: {
+    expiring_plural: '{{count}} g眉n i莽inde sona eriyor',
+    expiring: 'Bir g眉nde sona eriyor',
+  },
+  pagination: {
+    perPage: 'Sayfa ba艧谋na 枚臒e say谋s谋',
+  },
+  theme: {
+    light: '谋艧谋k',
+    dark: 'koyu',
+    auto: 'sistem',
+    theme: 'Tema',
+  },
+  compliance: {
+    soc2Type1: 'SOC 2 Tip I Raporu',
+    sandboxUpgradeTooltip: 'Yaln谋zca Profesyonel veya Tak谋m plan谋 ile kullan谋labilir.',
+    iso27001: 'ISO 27001:2022 Sertifikas谋',
+    professionalUpgradeTooltip: 'Yaln谋zca Tak谋m plan谋 veya 眉st眉 ile mevcuttur.',
+    gdpr: 'GDPR DPA',
+    soc2Type2: 'SOC 2 Tip II Raporu',
+  },
+  imageInput: {
+    supportedFormats: 'PNG, JPG, JPEG, WEBP ve GIF\'i destekler',
+    dropImageHere: 'G枚r眉nt眉n眉z眉 buraya b谋rak谋n veya',
+    browse: 'taray谋c谋',
+  },
+}
+
+export default translation
diff --git a/i18n/tr-TR/custom.ts b/i18n/tr-TR/custom.ts
new file mode 100644
index 0000000..15c4ff5
--- /dev/null
+++ b/i18n/tr-TR/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: '脰zelle艧tirme',
+  upgradeTip: {
+    prefix: 'Markan谋z谋 枚zelle艧tirmek i莽in plan谋n谋z谋 y眉kseltin',
+    suffix: '.',
+    des: 'Markan谋z谋 枚zelle艧tirmek i莽in plan谋n谋z谋 y眉kseltin',
+    title: 'Plan谋n谋z谋 y眉kseltin',
+  },
+  webapp: {
+    title: 'WebApp markas谋n谋 枚zelle艧tir',
+    removeBrand: 'Powered by Dify\'i kald谋r',
+    changeLogo: 'Powered by Brand Resmini De臒i艧tir',
+    changeLogoTip: 'SVG veya PNG format谋nda, en az 40x40px boyutunda',
+  },
+  app: {
+    title: 'Uygulama ba艧l谋臒谋 markas谋n谋 枚zelle艧tir',
+    changeLogoTip: 'SVG veya PNG format谋nda, en az 80x80px boyutunda',
+  },
+  upload: 'Y眉kle',
+  uploading: 'Y眉kleniyor',
+  uploadedFail: 'Resim y眉kleme ba艧ar谋s谋z oldu, l眉tfen tekrar y眉kleyin.',
+  change: 'De臒i艧tir',
+  apply: 'Uygula',
+  restore: 'Varsay谋lan Ayarlar谋 Geri Y眉kle',
+  customize: {
+    contactUs: ' bizimle ileti艧ime ge莽in ',
+    prefix: 'Uygulama i莽indeki marka logosunu 枚zelle艧tirmek i莽in, l眉tfen',
+    suffix: 'Enterprise s眉r眉m眉ne y眉kseltin.',
+  },
+}
+
+export default translation
diff --git a/i18n/tr-TR/dataset-creation.ts b/i18n/tr-TR/dataset-creation.ts
new file mode 100644
index 0000000..cb3cfcf
--- /dev/null
+++ b/i18n/tr-TR/dataset-creation.ts
@@ -0,0 +1,218 @@
+const translation = {
+  steps: {
+    header: {
+      creation: 'Bilgi Olu艧tur',
+      update: 'Veri ekle',
+      fallbackRoute: 'Bilgi',
+    },
+    one: 'Veri kayna臒谋 se莽in',
+    two: 'Metin 脰n 陌艧leme ve Temizleme',
+    three: '脟al谋艧t谋r ve Bitir',
+  },
+  error: {
+    unavailable: 'Bu Bilgi kullan谋lam谋yor',
+  },
+  firecrawl: {
+    configFirecrawl: '馃敟Firecrawl\'谋 Yap谋land谋r',
+    apiKeyPlaceholder: 'firecrawl.dev\'den API anahtar谋',
+    getApiKeyLinkText: 'API anahtar谋n谋z谋 firecrawl.dev\'den al谋n',
+  },
+  stepOne: {
+    filePreview: 'Dosya 脰nizleme',
+    pagePreview: 'Sayfa 脰nizleme',
+    dataSourceType: {
+      file: 'Dosyadan i莽e aktar',
+      notion: 'Notion\'dan senkronize et',
+      web: 'Web sitesinden senkronize et',
+    },
+    uploader: {
+      title: 'Dosya y眉kle',
+      button: 'Dosyalar谋 veya klas枚rleri s眉r眉kleyip b谋rak谋n veya',
+      browse: 'G枚z at谋n',
+      tip: 'Destekler {{supportTypes}}. Her biri en fazla {{size}}MB.',
+      validation: {
+        typeError: 'Dosya tipi desteklenmiyor',
+        size: 'Dosya 莽ok b眉y眉k. Maksimum {{size}} MB',
+        count: 'Birden fazla dosya desteklenmiyor',
+        filesNumber: 'Toplu y眉kleme s谋n谋r谋na ula艧t谋n谋z, {{filesNumber}} dosya.',
+      },
+      cancel: '陌ptal',
+      change: 'De臒i艧tir',
+      failed: 'Y眉kleme ba艧ar谋s谋z',
+    },
+    notionSyncTitle: 'Notion ba臒l谋 de臒il',
+    notionSyncTip: 'Notion ile senkronize etmek i莽in 枚nce Notion\'a ba臒lan谋lmal谋d谋r.',
+    connect: 'Ba臒lanmaya git',
+    button: 'Sonraki',
+    emptyDatasetCreation: 'Bo艧 bir bilgi olu艧turmak istiyorum',
+    modal: {
+      title: 'Bo艧 bir bilgi olu艧tur',
+      tip: 'Bo艧 bir bilgi hi莽bir belge i莽ermeyecektir ve diledi臒iniz zaman belge y眉kleyebilirsiniz.',
+      input: 'Bilgi ad谋',
+      placeholder: 'L眉tfen girin',
+      nameNotEmpty: 'Ad bo艧 olamaz',
+      nameLengthInvalid: 'Ad 1 ile 40 karakter aras谋nda olmal谋d谋r',
+      cancelButton: '陌ptal',
+      confirmButton: 'Olu艧tur',
+      failed: 'Olu艧turma ba艧ar谋s谋z',
+    },
+    website: {
+      fireCrawlNotConfigured: 'Firecrawl yap谋land谋r谋lmam谋艧',
+      fireCrawlNotConfiguredDescription: 'Firecrawl\'谋 kullanmak i莽in API anahtar谋 ile yap谋land谋r谋n.',
+      configure: 'Yap谋land谋r',
+      run: '脟al谋艧t谋r',
+      firecrawlTitle: '馃敟Firecrawl ile web i莽eri臒ini 莽谋kar谋n',
+      firecrawlDoc: 'Firecrawl dok眉manlar谋',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      options: 'Se莽enekler',
+      crawlSubPage: 'Alt sayfalar谋 taray谋n',
+      limit: 'S谋n谋r',
+      maxDepth: 'Maksimum derinlik',
+      excludePaths: 'Yollar谋 hari莽 tut',
+      includeOnlyPaths: 'Yaln谋zca yollar谋 dahil et',
+      extractOnlyMainContent: 'Sadece ana i莽eri臒i 莽谋kar (ba艧l谋klar, navigasyonlar, altbilgiler vb. yok)',
+      exceptionErrorTitle: 'Firecrawl i艧i 莽al谋艧t谋r谋l谋rken bir istisna meydana geldi:',
+      unknownError: 'Bilinmeyen hata',
+      totalPageScraped: 'Toplam kaz谋nan sayfa:',
+      selectAll: 'Hepsini Se莽',
+      resetAll: 'Hepsini S谋f谋rla',
+      scrapTimeInfo: 'Toplam {{total}} sayfa {{time}}s i莽inde kaz谋nd谋',
+      preview: '脰nizleme',
+      maxDepthTooltip: 'Girilen URL\'ye g枚re tarama i莽in maksimum derinlik. Derinlik 0 sadece girilen url sayfas谋n谋 kaz谋r, derinlik 1 url ve girilen URL + bir / \'dan sonraki her 艧eyi kaz谋r ve b枚yle devam eder.',
+      jinaReaderTitle: 'T眉m siteyi Markdown\'a d枚n眉艧t眉r眉n',
+      useSitemap: 'Site haritas谋n谋 kullan',
+      useSitemapTooltip: 'Siteyi taramak i莽in site haritas谋n谋 takip edin. Aksi takdirde, Jina Reader sayfa alaka d眉zeyine g枚re yinelemeli olarak tarar ve daha az ancak daha y眉ksek kaliteli sayfalar verir.',
+      jinaReaderNotConfiguredDescription: 'Eri艧im i莽in 眉cretsiz API anahtar谋n谋z谋 girerek Jina Reader\'谋 kurun.',
+      chooseProvider: 'Bir sa臒lay谋c谋 se莽in',
+      jinaReaderDoc: 'Jina Reader hakk谋nda daha fazla bilgi edinin',
+      jinaReaderNotConfigured: 'Jina Reader yap谋land谋r谋lmad谋',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      waterCrawlNotConfiguredDescription: 'Watercrawl\'谋 kullanmak i莽in API anahtar谋 ile yap谋land谋r谋n.',
+      configureFirecrawl: 'Firecrawl\'谋 yap谋land谋r',
+      watercrawlDoc: 'Watercrawl belgeleri',
+      waterCrawlNotConfigured: 'Watercrawl yap谋land谋r谋lmam谋艧',
+      watercrawlTitle: 'Watercrawl ile web i莽eri臒ini 莽谋kar',
+      configureJinaReader: 'Jina Okuyucusunu Yap谋land谋r',
+      watercrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      configureWatercrawl: 'Watercrawl\'谋 yap谋land谋r',
+    },
+    cancel: '陌ptal',
+  },
+  stepTwo: {
+    segmentation: 'Par莽alanma ayarlar谋',
+    auto: 'Otomatik',
+    autoDescription: 'Par莽alanma ve 枚n i艧leme kurallar谋n谋 otomatik olarak ayarlay谋n. Bilgisiz kullan谋c谋lar谋n bunu se莽mesi 枚nerilir.',
+    custom: '脰zel',
+    customDescription: 'Par莽alanma kurallar谋n谋, par莽alanma uzunlu臒unu ve 枚n i艧leme kurallar谋n谋 ki艧iselle艧tirin.',
+    separator: 'Par莽alanma belirleyicisi',
+    separatorPlaceholder: '脰rne臒in, yeni sat谋r (\\\\n) veya 枚zel ay谋r谋c谋 (枚rn. "***")',
+    maxLength: 'Maksimum par莽a uzunlu臒u',
+    overlap: 'Par莽a 枚rt眉艧mesi',
+    overlapTip: 'Par莽a 枚rt眉艧mesini ayarlamak, aralar谋ndaki anlamsal ba臒谋 koruyabilir, geri al谋m etkisini art谋r谋r. Maksimum par莽a boyutunun %10-%25\'ini ayarlaman谋z 枚nerilir.',
+    overlapCheck: 'par莽a 枚rt眉艧mesi maksimum par莽a uzunlu臒undan b眉y眉k olmamal谋d谋r',
+    rules: 'Metin 枚n i艧leme kurallar谋',
+    removeExtraSpaces: 'Art arda gelen bo艧luklar谋, yeni sat谋rlar谋 ve sekmeleri de臒i艧tirin',
+    removeUrlEmails: 'T眉m URL\'leri ve e-posta adreslerini silin',
+    removeStopwords: '"a", "an", "the" gibi durdurma kelimelerini silin',
+    preview: 'Onayla ve 脰nizleme',
+    reset: 'S谋f谋rla',
+    indexMode: 'Dizin modu',
+    qualified: 'Y眉ksek Kalite',
+    recommend: '脰nerilen',
+    qualifiedTip: 'Kullan谋c谋lar sorgulad谋臒谋nda daha y眉ksek do臒ruluk sa臒lamak i莽in varsay谋lan sistem yerle艧tirme aray眉z眉n眉 莽a臒谋r谋r.',
+    warning: 'L眉tfen 枚nce model sa臒lay谋c谋 API anahtar谋n谋 ayarlay谋n.',
+    click: 'Ayarlara git',
+    economical: 'Ekonomik',
+    economicalTip: 'Do臒rulu臒u azaltmak i莽in 莽evrimd谋艧谋 vekt枚r motorlar谋n谋, anahtar kelime dizinlerini vb. kullan谋n, token harcamadan',
+    QATitle: 'Soru ve Yan谋t format谋nda par莽alama',
+    QATip: 'Bu se莽ene臒i etkinle艧tirmek daha fazla token t眉ketecektir',
+    QALanguage: 'Kullanarak par莽alara ay谋r',
+    estimateCost: 'Tahmin',
+    estimateSegment: 'Tahmini par莽alar',
+    segmentCount: 'par莽alar',
+    calculating: 'Hesaplan谋yor...',
+    fileSource: 'Belgeleri 枚n i艧leme',
+    notionSource: 'Sayfalar谋 枚n i艧leme',
+    websiteSource: 'Web sitesini 枚n i艧leme',
+    other: 've di臒er',
+    fileUnit: ' dosyalar',
+    notionUnit: ' sayfalar',
+    webpageUnit: ' sayfalar',
+    previousStep: '脰nceki ad谋m',
+    nextStep: 'Kaydet ve 陌艧le',
+    save: 'Kaydet ve 陌艧le',
+    cancel: '陌ptal',
+    sideTipTitle: 'Neden par莽alanma ve 枚n i艧leme?',
+    sideTipP1: 'Metin verileri i艧lerken, par莽alama ve temizleme iki 枚nemli 枚n i艧leme ad谋m谋d谋r.',
+    sideTipP2: 'Par莽alanma, uzun metinleri paragraflara b枚ler, b枚ylece modeller daha iyi anlayabilir. Bu, model sonu莽lar谋n谋n kalitesini ve alaka d眉zeyini art谋r谋r.',
+    sideTipP3: 'Temizleme, gereksiz karakterleri ve formatlar谋 kald谋rarak Bilginin daha temiz ve daha kolay analiz edilmesini sa臒lar.',
+    sideTipP4: 'Uygun par莽alama ve temizleme, model performans谋n谋 iyile艧tirir, daha do臒ru ve de臒erli sonu莽lar sa臒lar.',
+    previewTitle: '脰nizleme',
+    previewTitleButton: '脰nizleme',
+    previewButton: 'Q&A format谋na ge莽i艧',
+    previewSwitchTipStart: 'Ge莽erli par莽a 枚nizlemesi metin format谋ndad谋r, soru ve yan谋t format谋na ge莽i艧 ek t眉ketir',
+    previewSwitchTipEnd: 'token',
+    characters: 'karakterler',
+    indexSettingTip: 'Dizin y枚ntemini de臒i艧tirmek i莽in, l眉tfen',
+    retrievalSettingTip: 'Dizin y枚ntemini de臒i艧tirmek i莽in, l眉tfen',
+    datasetSettingLink: 'Bilgi ayarlar谋na gidin.',
+    separatorTip: 'S谋n谋rlay谋c谋, metni ay谋rmak i莽in kullan谋lan karakterdir. \\n\\n ve \\n, paragraflar谋 ve sat谋rlar谋 ay谋rmak i莽in yayg谋n olarak kullan谋lan s谋n谋rlay谋c谋lard谋r. Virg眉llerle (\\n\\n,\\n) birle艧tirildi臒inde, paragraflar maksimum 枚bek uzunlu臒unu a艧t谋臒谋nda sat谋rlarla b枚l眉n眉r. Kendiniz taraf谋ndan tan谋mlanan 枚zel s谋n谋rlay谋c谋lar谋 da kullanabilirsiniz (枚rn.',
+    maxLengthCheck: 'Maksimum y谋臒谋n uzunlu臒u {{limit}}\'den az olmal谋d谋r',
+    paragraph: 'Paragraf',
+    parentChildDelimiterTip: 'S谋n谋rlay谋c谋, metni ay谋rmak i莽in kullan谋lan karakterdir. \\n\\n orijinal belgeyi b眉y眉k 眉st par莽alara b枚lmek i莽in 枚nerilir. Kendiniz taraf谋ndan tan谋mlanan 枚zel s谋n谋rlay谋c谋lar谋 da kullanabilirsiniz.',
+    parentChild: 'Ebeveyn-莽ocuk',
+    previewChunkCount: '{{say谋}} Tahmini par莽alar',
+    parentChildChunkDelimiterTip: 'S谋n谋rlay谋c谋, metni ay谋rmak i莽in kullan谋lan karakterdir. \\n 脺st par莽alar谋 k眉莽眉k alt par莽alara b枚lmek i莽in 枚nerilir. Kendiniz taraf谋ndan tan谋mlanan 枚zel s谋n谋rlay谋c谋lar谋 da kullanabilirsiniz.',
+    qaSwitchHighQualityTipContent: '艦u anda, yaln谋zca y眉ksek kaliteli dizin y枚ntemi Soru-Cevap bi莽imi 枚beklerini destekler. Y眉ksek kalite moduna ge莽mek ister misiniz?',
+    previewChunkTip: '脰nizlemeyi y眉klemek i莽in soldaki \'脰nizleme Par莽as谋\' d眉臒mesini t谋klay谋n',
+    qaSwitchHighQualityTipTitle: 'Soru-Cevap Format谋 Y眉ksek Kaliteli 陌ndeksleme Y枚ntemi Gerektirir',
+    notAvailableForQA: 'Soru-Cevap Dizini i莽in kullan谋lamaz',
+    generalTip: 'Genel metin par莽alama modu, al谋nan ve geri 莽a臒r谋lan par莽alar ayn谋d谋r.',
+    paragraphTip: 'Bu mod, metni s谋n谋rlay谋c谋lara ve maksimum 枚bek uzunlu臒una g枚re paragraflara b枚ler ve b枚l眉nm眉艧 metni almak i莽in 眉st 枚bek olarak kullan谋r.',
+    parentChildTip: '脺st-alt modu kullan谋l谋rken, alt 枚bek alma i莽in kullan谋l谋r ve 眉st 枚bek ba臒lam olarak geri 莽a臒谋rma i莽in kullan谋l谋r.',
+    fullDocTip: 'Belgenin tamam谋 眉st y谋臒谋n olarak kullan谋l谋r ve do臒rudan al谋n谋r. Performans nedenleriyle, 10000 jetonu a艧an metnin otomatik olarak kesilece臒ini l眉tfen unutmay谋n.',
+    fullDoc: 'Tam Dok眉man',
+    useQALanguage: 'Soru-Cevap bi莽imini kullanarak par莽alama',
+    general: 'Genel',
+    switch: '艦alter',
+    notAvailableForParentChild: '脺st-alt Dizini i莽in kullan谋lamaz',
+    previewChunk: '脰nizleme Par莽as谋',
+    highQualityTip: 'Y眉ksek Kalite modunda yerle艧tirme i艧lemi tamamland谋ktan sonra, Ekonomik moda geri d枚n眉lemez.',
+    childChunkForRetrieval: 'Alma i莽in alt y谋臒谋n',
+    parentChunkForContext: 'Ba臒lam i莽in 眉st y谋臒谋n',
+  },
+  stepThree: {
+    creationTitle: '馃帀 Bilgi olu艧turuldu',
+    creationContent: 'Bilginin ad谋n谋 otomatik olarak belirledik, diledi臒iniz zaman de臒i艧tirebilirsiniz',
+    label: 'Bilgi ad谋',
+    additionTitle: '馃帀 Belge y眉klendi',
+    additionP1: 'Belge Bilgi\'ye y眉klendi',
+    additionP2: ', bilgi listesinden bulabilirsiniz.',
+    stop: '陌艧lemeyi durdur',
+    resume: '陌艧lemeye devam et',
+    navTo: 'Belgeye git',
+    sideTipTitle: 'S谋rada ne var',
+    sideTipContent: 'Belge dizine ekleme i艧lemi bittikten sonra Bilgi, ba臒lam olarak uygulamaya entegre edilebilir. Prompt d眉zenleme sayfas谋nda ba臒lam ayarlar谋n谋 bulabilirsiniz. Ayr谋ca ba臒谋ms谋z bir ChatGPT dizinleme eklentisi olarak yay谋nlamak i莽in de olu艧turabilirsiniz.',
+    modelTitle: 'Yerle艧tirmeyi durdurmak istedi臒inize emin misiniz?',
+    modelContent: '陌艧lemeye daha sonra devam etmeniz gerekirse, kald谋臒谋n谋z yerden devam edeceksiniz.',
+    modelButtonConfirm: 'Onayla',
+    modelButtonCancel: '陌ptal',
+  },
+  jinaReader: {
+    apiKeyPlaceholder: 'jina.ai\'dan API anahtar谋',
+    configJinaReader: 'Jina Reader\'谋 Yap谋land谋rma',
+    getApiKeyLinkText: '脺cretsiz API anahtar谋n谋z谋 hemen jina.ai al谋n',
+  },
+  otherDataSource: {
+    learnMore: 'Daha fazla bilgi edinin',
+    description: '艦u anda, Dify\'谋n bilgi taban谋 yaln谋zca s谋n谋rl谋 veri kaynaklar谋na sahiptir. Dify bilgi taban谋na bir veri kayna臒谋na katk谋da bulunmak, t眉m kullan谋c谋lar i莽in platformun esnekli臒ini ve g眉c眉n眉 art谋rmaya yard谋mc谋 olman谋n harika bir yoludur. Katk谋 k谋lavuzumuz, ba艧laman谋z谋 kolayla艧t谋r谋r. Daha fazla bilgi edinmek i莽in l眉tfen a艧a臒谋daki ba臒lant谋ya t谋klay谋n.',
+    title: 'Di臒er veri kaynaklar谋na ba臒lan谋l谋yor mu?',
+  },
+  watercrawl: {
+    configWatercrawl: 'Su Taray谋c谋s谋n谋 Yap谋land谋r',
+    apiKeyPlaceholder: 'watercrawl.dev\'den API anahtar谋',
+    getApiKeyLinkText: 'API anahtar谋n谋z谋 watercrawl.dev\'den al谋n',
+  },
+}
+
+export default translation
diff --git a/i18n/tr-TR/dataset-documents.ts b/i18n/tr-TR/dataset-documents.ts
new file mode 100644
index 0000000..f643375
--- /dev/null
+++ b/i18n/tr-TR/dataset-documents.ts
@@ -0,0 +1,394 @@
+const translation = {
+  list: {
+    title: 'Belgeler',
+    desc: 'Bilginin t眉m dosyalar谋 burada g枚sterilir ve Bilginin tamam谋 Dify al谋nt谋lar谋na veya Sohbet eklentisi 眉zerinden dizine eklenebilir.',
+    addFile: 'Dosya Ekle',
+    addPages: 'Sayfa Ekle',
+    addUrl: 'URL Ekle',
+    table: {
+      header: {
+        fileName: 'DOSYA ADI',
+        words: 'KEL陌MELER',
+        hitCount: 'GER陌 ALIM SAYISI',
+        uploadTime: 'Y脺KLEME ZAMANI',
+        status: 'DURUM',
+        action: 'EYLEM',
+        chunkingMode: 'PAR脟ALAMA MODU',
+      },
+      rename: 'Yeniden Adland谋r',
+      name: 'Ad',
+    },
+    action: {
+      uploadFile: 'Yeni dosya y眉kle',
+      settings: 'Segment ayarlar谋',
+      addButton: 'Par莽a ekle',
+      add: 'Bir par莽a ekle',
+      batchAdd: 'Toplu ekle',
+      archive: 'Ar艧ivle',
+      unarchive: 'Ar艧ivden 脟谋kar',
+      delete: 'Sil',
+      enableWarning: 'Ar艧ivlenmi艧 dosya etkinle艧tirilemez',
+      sync: 'Senkronize et',
+    },
+    index: {
+      enable: 'Etkinle艧tir',
+      disable: 'Devre D谋艧谋 B谋rak',
+      all: 'Hepsi',
+      enableTip: 'Dosya dizine eklenebilir',
+      disableTip: 'Dosya dizine eklenemez',
+    },
+    status: {
+      queuing: 'Kuyrukta',
+      indexing: 'Dizine Ekleniyor',
+      paused: 'Durduruldu',
+      error: 'Hata',
+      available: 'Kullan谋labilir',
+      enabled: 'Etkin',
+      disabled: 'Devre D谋艧谋',
+      archived: 'Ar艧ivlendi',
+    },
+    empty: {
+      title: 'Hen眉z belge yok',
+      upload: {
+        tip: 'Dosya y眉kleyebilir, web sitesinden veya Notion, GitHub gibi web uygulamalar谋ndan senkronize edebilirsiniz.',
+      },
+      sync: {
+        tip: 'Dify, Notion\'dan periyodik olarak dosyalar谋 indirir ve i艧lemeyi tamamlar.',
+      },
+    },
+    delete: {
+      title: 'Silmek istedi臒inize emin misiniz?',
+      content: '陌艧lemeye daha sonra devam etmeniz gerekirse, kald谋臒谋n谋z yerden devam edeceksiniz',
+    },
+    batchModal: {
+      title: 'Toplu par莽alar ekle',
+      csvUploadTitle: 'CSV dosyan谋z谋 buraya s眉r眉kleyip b谋rak谋n ya da ',
+      browse: 'g枚z at谋n',
+      tip: 'CSV dosyas谋 艧u yap谋ya uygun olmal谋d谋r:',
+      question: 'soru',
+      answer: 'cevap',
+      contentTitle: 'par莽a i莽eri臒i',
+      content: 'i莽erik',
+      template: '艦ablonu buradan indir',
+      cancel: '陌ptal',
+      run: 'Toplu 陌艧lemi 脟al谋艧t谋r',
+      runError: 'Toplu i艧lem ba艧ar谋s谋z oldu',
+      processing: 'Toplu i艧lemde',
+      completed: '陌莽e aktarma tamamland谋',
+      error: '陌莽e Aktarma Hatas谋',
+      ok: 'Tamam',
+    },
+    learnMore: 'Daha fazla bilgi edinin',
+  },
+  metadata: {
+    title: 'Meta Veri',
+    desc: 'Belgeler i莽in meta veri etiketleme, AI\'谋n bunlara zaman谋nda eri艧mesini sa臒lar ve kullan谋c谋lar i莽in referanslar谋n kayna臒谋n谋 ortaya 莽谋kar谋r.',
+    dateTimeFormat: 'MMMM D, YYYY ss:dd 脰脰/脰S',
+    docTypeSelectTitle: 'L眉tfen bir belge t眉r眉 se莽in',
+    docTypeChangeTitle: 'Belge t眉r眉n眉 de臒i艧tir',
+    docTypeSelectWarning: 'Belge t眉r眉 de臒i艧tirilirse, 艧imdi doldurulan meta veriler art谋k korunmayacakt谋r',
+    firstMetaAction: 'Hadi ba艧layal谋m',
+    placeholder: {
+      add: 'Ekle ',
+      select: 'Se莽 ',
+    },
+    source: {
+      upload_file: 'Dosya Y眉kle',
+      notion: 'Notion\'dan Senkronize Et',
+      github: 'GitHub\'dan Senkronize Et',
+    },
+    type: {
+      book: 'Kitap',
+      webPage: 'Web Sayfas谋',
+      paper: 'Makale',
+      socialMediaPost: 'Sosyal Medya Payla艧谋m谋',
+      personalDocument: 'Ki艧isel Belge',
+      businessDocument: '陌艧 Belgesi',
+      IMChat: 'IM Sohbet',
+      wikipediaEntry: 'Wikipedia Giri艧i',
+      notion: 'Notion\'dan Senkronize Et',
+      github: 'GitHub\'dan Senkronize Et',
+      technicalParameters: 'Teknik Parametreler',
+    },
+    field: {
+      processRule: {
+        processDoc: 'Belgeyi 陌艧le',
+        segmentRule: 'Par莽a Kural谋',
+        segmentLength: 'Par莽a Uzunlu臒u',
+        processClean: 'Metin 陌艧leme Temizli臒i',
+      },
+      book: {
+        title: 'Ba艧l谋k',
+        language: 'Dil',
+        author: 'Yazar',
+        publisher: 'Yay谋nc谋',
+        publicationDate: 'Yay谋n Tarihi',
+        ISBN: 'ISBN',
+        category: 'Kategori',
+      },
+      webPage: {
+        title: 'Ba艧l谋k',
+        url: 'URL',
+        language: 'Dil',
+        authorPublisher: 'Yazar/Yay谋nc谋',
+        publishDate: 'Yay谋n Tarihi',
+        topicKeywords: 'Konular/Anahtar Kelimeler',
+        description: 'A莽谋klama',
+      },
+      paper: {
+        title: 'Ba艧l谋k',
+        language: 'Dil',
+        author: 'Yazar',
+        publishDate: 'Yay谋n Tarihi',
+        journalConferenceName: 'Dergi/Konferans Ad谋',
+        volumeIssuePage: 'Cilt/Say谋/Sayfa',
+        DOI: 'DOI',
+        topicsKeywords: 'Konular/Anahtar Kelimeler',
+        abstract: '脰zet',
+      },
+      socialMediaPost: {
+        platform: 'Platform',
+        authorUsername: 'Yazar/Kullan谋c谋 ad谋',
+        publishDate: 'Yay谋n Tarihi',
+        postURL: 'G枚nderi URL\'si',
+        topicsTags: 'Konular/Etiketler',
+      },
+      personalDocument: {
+        title: 'Ba艧l谋k',
+        author: 'Yazar',
+        creationDate: 'Olu艧turma Tarihi',
+        lastModifiedDate: 'Son De臒i艧tirme Tarihi',
+        documentType: 'Belge T眉r眉',
+        tagsCategory: 'Etiketler/Kategori',
+      },
+      businessDocument: {
+        title: 'Ba艧l谋k',
+        author: 'Yazar',
+        creationDate: 'Olu艧turma Tarihi',
+        lastModifiedDate: 'Son De臒i艧tirme Tarihi',
+        documentType: 'Belge T眉r眉',
+        departmentTeam: 'B枚l眉m/Tak谋m',
+      },
+      IMChat: {
+        chatPlatform: 'Sohbet Platformu',
+        chatPartiesGroupName: 'Sohbet Taraflar谋/Grup Ad谋',
+        participants: 'Kat谋l谋mc谋lar',
+        startDate: 'Ba艧lang谋莽 Tarihi',
+        endDate: 'Biti艧 Tarihi',
+        topicsKeywords: 'Konular/Anahtar Kelimeler',
+        fileType: 'Dosya T眉r眉',
+      },
+      wikipediaEntry: {
+        title: 'Ba艧l谋k',
+        language: 'Dil',
+        webpageURL: 'Web Sayfas谋 URL\'si',
+        editorContributor: 'Edit枚r/Kat谋l谋mc谋',
+        lastEditDate: 'Son D眉zenleme Tarihi',
+        summaryIntroduction: '脰zet/Giri艧',
+      },
+      notion: {
+        title: 'Ba艧l谋k',
+        language: 'Dil',
+        author: 'Yazar',
+        createdTime: 'Olu艧turulma Zaman谋',
+        lastModifiedTime: 'Son De臒i艧tirilme Zaman谋',
+        url: 'URL',
+        tag: 'Etiket',
+        description: 'A莽谋klama',
+      },
+      github: {
+        repoName: 'Depo Ad谋',
+        repoDesc: 'Depo A莽谋klamas谋',
+        repoOwner: 'Depo Sahibi',
+        fileName: 'Dosya Ad谋',
+        filePath: 'Dosya Yolu',
+        programmingLang: 'Programlama Dili',
+        url: 'URL',
+        license: 'Lisans',
+        lastCommitTime: 'Son Commit Zaman谋',
+        lastCommitAuthor: 'Son Commit Yazar',
+      },
+      originInfo: {
+        originalFilename: 'Orijinal dosya ad谋',
+        originalFileSize: 'Orijinal dosya boyutu',
+        uploadDate: 'Y眉kleme tarihi',
+        lastUpdateDate: 'Son g眉ncelleme tarihi',
+        source: 'Kaynak',
+      },
+      technicalParameters: {
+        segmentSpecification: 'Par莽alar spesifikasyonu',
+        segmentLength: 'Par莽alar uzunlu臒u',
+        avgParagraphLength: 'Ort. paragraf uzunlu臒u',
+        paragraphs: 'Paragraflar',
+        hitCount: 'Geri al谋m say谋s谋',
+        embeddingTime: 'Yerle艧tirme zaman谋',
+        embeddedSpend: 'Yerle艧tirme harcamas谋',
+      },
+    },
+    languageMap: {
+      zh: '脟ince',
+      en: '陌ngilizce',
+      es: '陌spanyolca',
+      fr: 'Frans谋zca',
+      de: 'Almanca',
+      ja: 'Japonca',
+      ko: 'Korece',
+      ru: 'Rus莽a',
+      ar: 'Arap莽a',
+      pt: 'Portekizce',
+      it: '陌talyanca',
+      nl: 'Flemenk莽e',
+      pl: 'Leh莽e',
+      sv: '陌sve莽莽e',
+      tr: 'T眉rk莽e',
+      he: '陌branice',
+      hi: 'Hint莽e',
+      da: 'Danca',
+      fi: 'Fince',
+      no: 'Norve莽莽e',
+      hu: 'Macarca',
+      el: 'Yunanca',
+      cs: '脟ek莽e',
+      th: 'Tayca',
+      id: 'Endonezce',
+    },
+    categoryMap: {
+      book: {
+        fiction: 'Kurgu',
+        biography: 'Biyografi',
+        history: 'Tarih',
+        science: 'Bilim',
+        technology: 'Teknoloji',
+        education: 'E臒itim',
+        philosophy: 'Felsefe',
+        religion: 'Din',
+        socialSciences: 'Sosyal Bilimler',
+        art: 'Sanat',
+        travel: 'Gezi',
+        health: 'Sa臒l谋k',
+        selfHelp: 'Ki艧isel Geli艧im',
+        businessEconomics: '陌艧 ve Ekonomi',
+        cooking: 'Yemek',
+        childrenYoungAdults: '脟ocuk ve Gen莽 Yeti艧kin',
+        comicsGraphicNovels: '脟izgi Roman ve Grafik Roman',
+        poetry: '艦iir',
+        drama: 'Drama',
+        other: 'Di臒er',
+      },
+      personalDoc: {
+        notes: 'Notlar',
+        blogDraft: 'Blog Tasla臒谋',
+        diary: 'G眉nl眉k',
+        researchReport: 'Ara艧t谋rma Raporu',
+        bookExcerpt: 'Kitap Al谋nt谋s谋',
+        schedule: 'Takvim',
+        list: 'Liste',
+        projectOverview: 'Proje Genel Bak谋艧',
+        photoCollection: 'Foto臒raf Koleksiyonu',
+        creativeWriting: 'Yarat谋c谋 Yazma',
+        codeSnippet: 'Kod Par莽ac谋臒谋',
+        designDraft: 'Tasar谋m Tasla臒谋',
+        personalResume: 'Ki艧isel 脰zge莽mi艧',
+        other: 'Di臒er',
+      },
+      businessDoc: {
+        meetingMinutes: 'Toplant谋 Tutanaklar谋',
+        researchReport: 'Ara艧t谋rma Raporu',
+        proposal: 'Teklif',
+        employeeHandbook: '脟al谋艧an El Kitab谋',
+        trainingMaterials: 'E臒itim Materyalleri',
+        requirementsDocument: 'Gereksinim Dok眉man谋',
+        designDocument: 'Tasar谋m Dok眉man谋',
+        productSpecification: '脺r眉n Spesifikasyonu',
+        financialReport: 'Mali Rapor',
+        marketAnalysis: 'Pazar Analizi',
+        projectPlan: 'Proje Plan谋',
+        teamStructure: 'Tak谋m Yap谋s谋',
+        policiesProcedures: 'Politikalar ve Prosed眉rler',
+        contractsAgreements: 'S枚zle艧meler ve Anla艧malar',
+        emailCorrespondence: 'E-posta Yaz谋艧malar谋',
+        other: 'Di臒er',
+      },
+    },
+  },
+  embedding: {
+    processing: 'Yerle艧tirme i艧lemi...',
+    paused: 'Yerle艧tirme duraklat谋ld谋',
+    completed: 'Yerle艧tirme tamamland谋',
+    error: 'Yerle艧tirme hatas谋',
+    docName: 'Belgeler i艧leniyor',
+    mode: 'Segmentasyon kural谋',
+    segmentLength: 'Par莽alar uzunlu臒u',
+    textCleaning: 'Metin 枚ni艧leme ve temizlik',
+    segments: 'Paragraflar',
+    highQuality: 'Y眉ksek kaliteli mod',
+    economy: 'Ekonomik mod',
+    estimate: 'Tahmini t眉ketim',
+    stop: '陌艧lemi durdur',
+    resume: '陌艧leme devam et',
+    automatic: 'Otomatik',
+    custom: '脰zel',
+    previewTip: 'Paragraf 枚nizlemesi yerle艧tirme tamamland谋ktan sonra kullan谋labilir olacak',
+    childMaxTokens: '脟ocuk',
+    parentMaxTokens: 'Ebeveyn',
+    hierarchical: 'Ebeveyn-莽ocuk',
+    pause: 'Duraklat',
+  },
+  segment: {
+    paragraphs: 'Paragraflar',
+    keywords: 'Anahtar Kelimeler',
+    addKeyWord: 'Anahtar kelime ekle',
+    keywordError: 'Anahtar kelimenin maksimum uzunlu臒u 20',
+    characters: 'karakter',
+    hitCount: 'Geri al谋m say谋s谋',
+    vectorHash: 'Vekt枚r hash: ',
+    questionPlaceholder: 'soruyu buraya ekleyin',
+    questionEmpty: 'Soru bo艧 olamaz',
+    answerPlaceholder: 'cevab谋 buraya ekleyin',
+    answerEmpty: 'Cevap bo艧 olamaz',
+    contentPlaceholder: 'i莽eri臒i buraya ekleyin',
+    contentEmpty: '陌莽erik bo艧 olamaz',
+    newTextSegment: 'Yeni Metin Par莽as谋',
+    newQaSegment: 'Yeni Soru-Cevap Par莽as谋',
+    delete: 'Bu par莽ay谋 silmek istiyor musunuz?',
+    chunks_one: '脰BEK',
+    childChunks_one: 'ALT 脰BEK',
+    searchResults_one: 'SONU脟',
+    chunk: '脰bek',
+    addChunk: 'Par莽a Ekle',
+    regenerationSuccessMessage: 'Bu pencereyi kapatabilirsiniz.',
+    characters_other: 'Karakter',
+    editParentChunk: '脺st Par莽ay谋 D眉zenle',
+    editChildChunk: 'Alt Par莽ay谋 D眉zenle',
+    edited: 'D脺ZENLEN -M陌艦',
+    collapseChunks: 'Par莽alar谋 daraltma',
+    chunkDetail: 'Y谋臒谋n Detay谋',
+    parentChunk: 'Ebeveyn-Y谋臒谋n',
+    parentChunks_one: '脺ST 脰BEK',
+    searchResults_other: 'SONU脟 -LARI',
+    childChunks_other: '脟OCUK PAR脟ALARI',
+    newChunk: 'Yeni Y谋臒谋n',
+    regenerationConfirmMessage: 'Alt 枚bekleri yeniden olu艧turmak, d眉zenlenen 枚bekler ve yeni eklenen 枚bekler de dahil olmak 眉zere mevcut alt 枚beklerin 眉zerine yaz谋l谋r. Yenilenme geri al谋namaz.',
+    empty: 'Y谋臒谋n bulunamad谋',
+    parentChunks_other: '脺ST PAR脟ALAR',
+    childChunk: '脟ocuk-Par莽a',
+    expandChunks: 'Par莽alar谋 geni艧letme',
+    childChunkAdded: '1 alt 枚bek eklendi',
+    newChildChunk: 'Yeni 脟ocuk Y谋臒谋n谋',
+    editChunk: 'Y谋臒谋n谋 D眉zenle',
+    chunkAdded: '1 par莽a eklendi',
+    regenerationSuccessTitle: 'Rejenerasyon tamamland谋',
+    regeneratingTitle: 'Alt par莽alar谋 yeniden olu艧turma',
+    clearFilter: 'Filtreyi kald谋r',
+    regenerationConfirmTitle: 'Alt par莽alar谋 yeniden olu艧turmak istiyor musunuz?',
+    characters_one: 'karakter',
+    addAnother: 'Bir tane daha ekle',
+    regeneratingMessage: 'Bu biraz zaman alabilir, l眉tfen bekleyin...',
+    searchResults_zero: 'SONU脟',
+    chunks_other: 'Par莽alar',
+    editedAt: '艦urada d眉zenlendi:',
+    addChildChunk: 'Alt Par莽a Ekle',
+  },
+}
+
+export default translation
diff --git a/i18n/tr-TR/dataset-hit-testing.ts b/i18n/tr-TR/dataset-hit-testing.ts
new file mode 100644
index 0000000..d22df0d
--- /dev/null
+++ b/i18n/tr-TR/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: 'Geri Al谋m Testi',
+  desc: 'Verilen sorgu metnine g枚re Bilginin isabet etkisini test edin.',
+  dateTimeFormat: 'GG/AA/YYYY ss:dd 脰脰/脰S',
+  recents: 'Sonu莽lar',
+  table: {
+    header: {
+      source: 'Kaynak',
+      text: 'Metin',
+      time: 'Zaman',
+    },
+  },
+  input: {
+    title: 'Kaynak metin',
+    placeholder: 'Bir metin girin, k谋sa bir bildirim c眉mlesi 枚nerilir.',
+    countWarning: 'En fazla 200 karakter.',
+    indexWarning: 'Y眉ksek kaliteli Bilgi sadece.',
+    testing: 'Test Ediliyor',
+  },
+  hit: {
+    title: 'GER陌 ALINAN PARAGRAFLAR',
+    emptyTip: 'Geri Al谋m Testi sonu莽lar谋 burada g枚sterilecektir',
+  },
+  noRecentTip: 'Burada son sorgu sonu莽lar谋 yok',
+  viewChart: 'VEKT脰R GRAF陌臑陌N陌 G脰R脺NT脺LE',
+  viewDetail: 'ayr谋nt谋lara bak谋n',
+  settingTitle: 'Alma Ayar谋',
+  open: 'A莽谋k',
+  chunkDetail: 'Y谋臒谋n Detay谋',
+  keyword: 'Anahtar kelime -ler',
+  hitChunks: '{{num}} alt par莽alar谋na bas谋n',
+  records: 'Kay谋t',
+}
+
+export default translation
diff --git a/i18n/tr-TR/dataset-settings.ts b/i18n/tr-TR/dataset-settings.ts
new file mode 100644
index 0000000..18fb004
--- /dev/null
+++ b/i18n/tr-TR/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: 'Bilgi ayarlar谋',
+  desc: 'Burada Bilginin 枚zelliklerini ve 莽al谋艧ma y枚ntemlerini de臒i艧tirebilirsiniz.',
+  form: {
+    name: 'Bilgi 陌smi',
+    namePlaceholder: 'Bilgi ismini girin',
+    nameError: '陌sim bo艧 olamaz',
+    desc: 'Bilgi a莽谋klamas谋',
+    descInfo: 'L眉tfen Bilginin i莽eri臒ini 枚zetlemek i莽in net bir metinsel a莽谋klama yaz谋n. Bu a莽谋klama, 莽谋kar谋m i莽in birden fazla Bilgi aras谋ndan se莽im yaparken e艧le艧tirme temeli olarak kullan谋lacakt谋r.',
+    descPlaceholder: 'Bu Bilginin i莽eri臒ini a莽谋klay谋n. Ayr谋nt谋l谋 bir a莽谋klama, AI\'n谋n Bilginin i莽eri臒ine zaman谋nda eri艧mesini sa臒lar. Bo艧 b谋rak谋l谋rsa, Dify varsay谋lan isabet stratejisini kullan谋r.',
+    descWrite: '陌yi bir Bilgi a莽谋klamas谋n谋n nas谋l yaz谋laca臒谋n谋 枚臒renin.',
+    permissions: '陌zinler',
+    permissionsOnlyMe: 'Sadece ben',
+    permissionsAllMember: 'T眉m tak谋m 眉yeleri',
+    permissionsInvitedMembers: 'Baz谋 tak谋m 眉yeleri',
+    me: '(Siz)',
+    indexMethod: 'Dizin Y枚ntemi',
+    indexMethodHighQuality: 'Y眉ksek Kalite',
+    indexMethodHighQualityTip: 'Kullan谋c谋lar sorgulad谋臒谋nda daha y眉ksek do臒ruluk sa臒lamak i莽in Yerle艧tirme modelini 莽a臒谋r谋r.',
+    indexMethodEconomy: 'Ekonomik',
+    indexMethodEconomyTip: 'Do臒rulu臒u azaltmak i莽in 莽evrimd谋艧谋 vekt枚r motorlar谋, anahtar kelime dizinleri vb. kullan谋n, token harcamadan',
+    embeddingModel: 'Yerle艧tirme Modeli',
+    embeddingModelTip: 'Yerle艧tirme modelini de臒i艧tirmek i莽in, l眉tfen ',
+    embeddingModelTipLink: 'Ayarlar\'a gidin',
+    retrievalSetting: {
+      title: 'Geri Al谋m Ayar谋',
+      learnMore: 'Daha fazla bilgi edinin',
+      description: ' geri al谋m y枚ntemi hakk谋nda.',
+      longDescription: ' geri al谋m y枚ntemi hakk谋nda, bunu Bilgi ayarlar谋nda istedi臒iniz zaman de臒i艧tirebilirsiniz.',
+      method: 'Retrieval Y枚ntemi',
+    },
+    save: 'Kaydet',
+    retrievalSettings: 'Alma Ayarlar谋',
+    externalKnowledgeAPI: 'Harici Bilgi API\'si',
+    externalKnowledgeID: 'Harici Bilgi Kimli臒i',
+    upgradeHighQualityTip: 'Y眉ksek Kalite moduna y眉kselttikten sonra Ekonomik moda geri d枚n眉lemez',
+    indexMethodChangeToEconomyDisabledTip: 'Genel Merkezden ECO\'ya d眉艧眉rme i莽in mevcut de臒il',
+    helpText: '陌yi bir veri k眉mesi a莽谋klamas谋n谋n nas谋l yaz谋laca臒谋n谋 枚臒renin.',
+    searchModel: 'Model Ara',
+  },
+}
+
+export default translation
diff --git a/i18n/tr-TR/dataset.ts b/i18n/tr-TR/dataset.ts
new file mode 100644
index 0000000..96f120c
--- /dev/null
+++ b/i18n/tr-TR/dataset.ts
@@ -0,0 +1,221 @@
+const translation = {
+  knowledge: 'Bilgi',
+  documentCount: ' belge',
+  wordCount: ' k kelime',
+  appCount: ' ba臒l谋 uygulamalar',
+  createDataset: 'Bilgi Olu艧tur',
+  createDatasetIntro: 'Kendi metin verilerinizi i莽e aktar谋n veya Webhook arac谋l谋臒谋yla ger莽ek zamanl谋 olarak veri yaz谋n, LLM ba臒lam谋n谋 geli艧tirin.',
+  deleteDatasetConfirmTitle: 'Bu Bilgi\'yi silmek istiyor musunuz?',
+  deleteDatasetConfirmContent:
+    'Bilginin silinmesi geri al谋namaz. Kullan谋c谋lar art谋k Bilginize eri艧emeyecek ve t眉m prompt yap谋land谋rmalar谋 ve g眉nl眉kler kal谋c谋 olarak silinecektir.',
+  datasetUsedByApp: 'Bilgi baz谋 uygulamalar taraf谋ndan kullan谋l谋yor. Uygulamalar art谋k bu Bilgiyi kullanamayacak ve t眉m prompt yap谋land谋rmalar谋 ve g眉nl眉kler kal谋c谋 olarak silinecektir.',
+  datasetDeleted: 'Bilgi silindi',
+  datasetDeleteFailed: 'Bilgi silinemedi',
+  didYouKnow: 'Biliyor muydunuz?',
+  intro1: 'Bilgi, Dify uygulamas谋na ',
+  intro2: 'ba臒lam olarak',
+  intro3: ' entegre edilebilir,',
+  intro4: 'veya ',
+  intro5: 'ba臒谋ms谋z bir ChatGPT dizin eklentisi olarak olu艧turulabilir',
+  intro6: ' ve yay谋nlanabilir.',
+  unavailable: 'Kullan谋lam谋yor',
+  unavailableTip: 'Yerle艧tirme modeli mevcut de臒il, varsay谋lan yerle艧tirme modelinin yap谋land谋r谋lmas谋 gerekiyor',
+  datasets: 'B陌LG陌',
+  datasetsApi: 'API ER陌艦陌M陌',
+  retrieval: {
+    semantic_search: {
+      title: 'Vekt枚r Arama',
+      description: 'Sorgu yerle艧tirmelerini olu艧turun ve vekt枚r temsiline en benzeyen metin par莽as谋n谋 aray谋n.',
+    },
+    full_text_search: {
+      title: 'Tam Metin Arama',
+      description: 'Belgelerdeki t眉m terimleri dizinleyerek, kullan谋c谋lar谋n herhangi bir terimi aramas谋na ve bu terimleri i莽eren ilgili metin par莽as谋n谋 geri almas谋na olanak tan谋r.',
+    },
+    hybrid_search: {
+      title: 'Hibrit Arama',
+      description: 'Tam metin arama ve vekt枚r aramalar谋n谋 ayn谋 anda 莽al谋艧t谋r谋n, kullan谋c谋 sorgusu i莽in en iyi e艧le艧meyi se莽mek i莽in yeniden s谋ralay谋n. Kullan谋c谋lar a臒谋rl谋klar ayarlayabilir veya bir Yeniden S谋ralama modeli yap谋land谋rabilir.',
+      recommend: '脰nerilir',
+    },
+    invertedIndex: {
+      title: 'Ters Dizine Kay谋t',
+      description: 'Ters Dizine Kay谋t, verimli geri al谋m i莽in kullan谋lan bir yap谋d谋r. Terimlere g枚re d眉zenlenir ve her terim, onu i莽eren belgelere veya web sayfalar谋na i艧aret eder.',
+    },
+    change: 'De臒i艧tir',
+    changeRetrievalMethod: 'Geri alma y枚ntemini de臒i艧tir',
+  },
+  docsFailedNotice: 'belgeler dizine eklenemedi',
+  retry: 'Yeniden Dene',
+  indexingTechnique: {
+    high_quality: 'Y眉ksek Kalite',
+    economy: 'Ekonomi',
+  },
+  indexingMethod: {
+    semantic_search: 'VEKT脰R',
+    full_text_search: 'TAM MET陌N',
+    hybrid_search: 'H陌BR陌T',
+    invertedIndex: 'TERS',
+  },
+  mixtureHighQualityAndEconomicTip: 'Y眉ksek kaliteli ve ekonomik bilgi tabanlar谋n谋n kar谋艧谋m谋 i莽in Yeniden S谋ralama modeli gereklidir.',
+  inconsistentEmbeddingModelTip: 'Se莽ilen bilgi tabanlar谋n谋n Yerle艧tirme modelleri tutars谋zsa Yeniden S谋ralama modeli gereklidir.',
+  retrievalSettings: 'Geri Al谋m Ayar谋',
+  rerankSettings: 'Yeniden S谋ralama Ayar谋',
+  weightedScore: {
+    title: 'A臒谋rl谋kl谋 Puan',
+    description: 'Verilen a臒谋rl谋klar谋 ayarlayarak bu yeniden s谋ralama stratejisi, anlamsal m谋 yoksa anahtar kelime e艧le艧tirmesini mi 枚nceliklendirece臒ini belirler.',
+    semanticFirst: 'Anlamsal 脰ncelikli',
+    keywordFirst: 'Anahtar Kelime 脰ncelikli',
+    customized: '脰zelle艧tirilmi艧',
+    semantic: 'Anlamsal',
+    keyword: 'Anahtar Kelime',
+  },
+  nTo1RetrievalLegacy: 'Geri al谋m stratejisinin optimizasyonu ve y眉kseltilmesi nedeniyle, N-to-1 geri al谋m谋 Eyl眉l ay谋nda resmi olarak kullan谋m d谋艧谋 kalacakt谋r. O zamana kadar normal 艧ekilde kullanabilirsiniz.',
+  nTo1RetrievalLegacyLink: 'Daha fazla bilgi edin',
+  nTo1RetrievalLegacyLinkText: 'N-1 geri alma Eyl眉l ay谋nda resmi olarak kullan谋mdan kald谋r谋lacakt谋r.',
+  defaultRetrievalTip: 'Varsay谋lan olarak 莽ok alma kullan谋l谋r. Bilgi, birden fazla bilgi taban谋ndan al谋n谋r ve ard谋ndan yeniden s谋ralan谋r.',
+  editExternalAPIConfirmWarningContent: {
+    front: 'Bu Harici Bilgi API\'si a艧a臒谋dakilerle ba臒lant谋l谋d谋r',
+    end: 'D谋艧sal bilgi ve bu de臒i艧iklik hepsine uygulanacakt谋r. Bu de臒i艧ikli臒i kaydetmek istedi臒inizden emin misiniz?',
+  },
+  editExternalAPIFormWarning: {
+    end: 'D谋艧 bilgi',
+    front: 'Bu Harici API a艧a臒谋dakilere ba臒l谋d谋r:',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: 'Silmek',
+      end: '?',
+    },
+    content: {
+      front: 'Bu Harici Bilgi API\'si a艧a臒谋dakilerle ba臒lant谋l谋d谋r',
+      end: 'd谋艧 bilgi. Bu API\'yi silmek hepsini ge莽ersiz k谋lacakt谋r. Bu API\'yi silmek istedi臒inizden emin misiniz?',
+    },
+    noConnectionContent: 'Bu API\'yi sildi臒inizden emin misiniz?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: 'Bir Harici Bilgi API\'si se莽in',
+  },
+  connectDatasetIntro: {
+    content: {
+      front: 'Harici bir bilgi bankas谋na ba臒lanmak i莽in 枚nce harici bir API olu艧turman谋z gerekir. L眉tfen dikkatlice okuyun ve bak谋n谋z',
+      end: '. Ard谋ndan ilgili bilgi kimli臒ini bulun ve soldaki forma doldurun. T眉m bilgiler do臒ruysa, ba臒lan d眉臒mesine t谋klad谋ktan sonra otomatik olarak bilgi taban谋ndaki alma testine atlayacakt谋r.',
+      link: 'Harici API olu艧turmay谋 枚臒renin',
+    },
+    title: 'Harici bir bilgi bankas谋na nas谋l ba臒lan谋l谋r',
+    learnMore: 'Daha fazla bilgi edinin',
+  },
+  connectHelper: {
+    helper2: 'Yaln谋zca alma i艧levi desteklenir',
+    helper5: 'Bu 枚zelli臒i kullanmadan 枚nce dikkatlice kullan谋n.',
+    helper3: '. 艦unlar谋 yapman谋z谋 艧iddetle tavsiye ederiz',
+    helper1: 'API ve bilgi bankas谋 kimli臒i arac谋l谋臒谋yla harici bilgi bankalar谋na ba臒lan谋n. 艦u anda,',
+    helper4: 'Yard谋m belgelerini okuyun',
+  },
+  externalKnowledgeForm: {
+    connect: 'Ba臒lamak',
+    cancel: '陌ptal',
+  },
+  externalAPIForm: {
+    encrypted: {
+      end: 'Teknoloji.',
+      front: 'API Token\'谋n谋z kullan谋larak 艧ifrelenecek ve saklanacakt谋r.',
+    },
+    save: 'Kurtarmak',
+    cancel: '陌ptal',
+    endpoint: 'API U莽 Noktas谋',
+    edit: 'D眉zenlemek',
+    name: 'Ad',
+    apiKey: 'API Anahtar谋',
+  },
+  externalTag: 'D谋艧',
+  externalAPI: 'Harici API',
+  externalKnowledgeDescription: 'Bilgi A莽谋klamas谋',
+  externalAPIPanelDescription: 'Harici bilgi API\'si, Dify d谋艧谋ndaki bir bilgi bankas谋na ba臒lanmak ve bu bilgi bankas谋ndan bilgi almak i莽in kullan谋l谋r.',
+  externalKnowledgeDescriptionPlaceholder: 'Bu Bilgi Bankas谋\'nda neler oldu臒unu a莽谋klay谋n (iste臒e ba臒l谋)',
+  externalAPIPanelDocumentation: 'External Knowledge API\'nin nas谋l olu艧turulaca臒谋n谋 枚臒renin',
+  mixtureInternalAndExternalTip: 'Rerank modeli, i莽 ve d谋艧 bilgilerin kar谋艧谋m谋 i莽in gereklidir.',
+  externalKnowledgeName: 'D谋艧 Bilgi Ad谋',
+  connectDataset: 'Harici bir bilgi bankas谋na ba臒lan谋n',
+  editExternalAPITooltipTitle: 'BA臑LANTILI BILGI',
+  externalAPIPanelTitle: 'Harici Bilgi API\'si',
+  editExternalAPIFormTitle: 'External Knowledge API\'yi d眉zenleme',
+  externalKnowledgeIdPlaceholder: 'L眉tfen Bilgi Kimli臒ini girin',
+  learnHowToWriteGoodKnowledgeDescription: '陌yi bir bilgi a莽谋klamas谋n谋n nas谋l yaz谋laca臒谋n谋 枚臒renin',
+  externalKnowledgeNamePlaceholder: 'L眉tfen bilgi bankas谋n谋n ad谋n谋 giriniz',
+  noExternalKnowledge: 'Hen眉z Harici Bilgi API\'si yok, olu艧turmak i莽in buraya t谋klay谋n',
+  allExternalTip: 'Yaln谋zca harici bilgileri kullan谋rken, kullan谋c谋 Rerank modelinin etkinle艧tirilip etkinle艧tirilmeyece臒ini se莽ebilir. Etkinle艧tirilmezse, al谋nan par莽alar puanlara g枚re s谋ralan谋r. Farkl谋 bilgi tabanlar谋n谋n eri艧im stratejileri tutars谋z oldu臒unda, yanl谋艧 olacakt谋r.',
+  externalKnowledgeId: 'Harici Bilgi Kimli臒i',
+  createExternalAPI: 'Harici bilgi API\'si ekleme',
+  createNewExternalAPI: 'Yeni bir External Knowledge API olu艧turma',
+  chunkingMode: {
+    general: 'Genel',
+    parentChild: 'Ebeveyn-莽ocuk',
+  },
+  parentMode: {
+    fullDoc: 'Tam dok眉man',
+    paragraph: 'Paragraf',
+  },
+  batchAction: {
+    selected: 'Se莽ilmi艧',
+    cancel: '陌ptal',
+    enable: 'Etkinle艧tirmek',
+    delete: 'Silmek',
+    archive: 'Ar艧iv',
+    disable: 'Devre d谋艧谋 b谋rakmak',
+  },
+  preprocessDocument: '{{say谋}} Belgeleri 脰n 陌艧leme',
+  localDocs: 'Yerel Dok眉manlar',
+  documentsDisabled: '{{num}} belge devre d谋艧谋 - 30 g眉nden uzun s眉re etkin de臒il',
+  enable: 'Etkinle艧tirmek',
+  allKnowledge: 'T眉m Bilgiler',
+  allKnowledgeDescription: 'Bu 莽al谋艧ma alan谋ndaki t眉m bilgileri g枚r眉nt眉lemek i莽in se莽in. Yaln谋zca 脟al谋艧ma Alan谋 Sahibi t眉m bilgileri y枚netebilir.',
+  metadata: {
+    createMetadata: {
+      namePlaceholder: 'Meta veri ad谋 ekleyin',
+      back: 'Geri',
+      name: '陌sim',
+      type: 'Yaz',
+      title: 'Yeni Veriler',
+    },
+    checkName: {
+      empty: 'Meta veri ad谋 bo艧 olamaz',
+      invalid: 'Meta verisi ad谋 yaln谋zca k眉莽眉k harfler, say谋lar ve alt 莽izgiler i莽erebilir ve k眉莽眉k bir harfle ba艧lamal谋d谋r.',
+    },
+    batchEditMetadata: {
+      multipleValue: 'Birden Fazla De臒er',
+      applyToAllSelectDocumentTip: 'Se莽ilen t眉m belgeler i莽in yukar谋da d眉zenlenmi艧 ve yeni olan t眉m meta verileri otomatik olarak olu艧turun, aksi takdirde meta verileri d眉zenlemek yaln谋zca bununla ilgili belgelere uygulanacakt谋r.',
+      editDocumentsNum: '{{num}} belge d眉zenleniyor',
+      editMetadata: 'Meta Verileri D眉zenle',
+      applyToAllSelectDocument: 'Se莽ilen t眉m belgelere uygula',
+    },
+    selectMetadata: {
+      newAction: 'Yeni Veriler',
+      manageAction: 'Y枚net',
+      search: 'Arama meta verileri',
+    },
+    datasetMetadata: {
+      disabled: 'Devre d谋艧谋 b谋rak谋ld谋.',
+      builtIn: 'Yerle艧ik',
+      values: '{{num}} De臒erler',
+      builtInDescription: 'Yerle艧ik meta veriler otomatik olarak 莽谋kar谋l谋r ve olu艧turulur. Kullan谋mdan 枚nce etkinle艧tirilmesi gerekir ve d眉zenlenemez.',
+      rename: 'Yeniden Adland谋r',
+      addMetaData: 'Meta Verileri Ekle',
+      name: '陌sim',
+      deleteContent: 'Bu {{name}} meta verisini silmek istedi臒inizden emin misiniz?',
+      namePlaceholder: 'Meta veri ad谋',
+      deleteTitle: 'Silmek i莽in onayla',
+      description: 'Bu bilgideki t眉m meta verileri y枚netebilirsiniz. De臒i艧iklikler her belgeye senkronize edilecektir.',
+    },
+    documentMetadata: {
+      documentInformation: 'Belge Bilgisi',
+      metadataToolTip: 'Meta veriler, bilgi alma do臒rulu臒unu ve ge莽erlili臒ini art谋ran 枚nemli bir filtre g枚revi g枚r眉r. Bu belgede meta verileri burada de臒i艧tirebilir ve ekleyebilirsiniz.',
+      startLabeling: 'Etiketlemeye Ba艧la',
+      technicalParameters: 'Teknik Parametreler',
+    },
+    metadata: 'Veri Seti',
+    addMetadata: 'Meta Verileri Ekle',
+    chooseTime: 'Bir zaman se莽in...',
+  },
+  embeddingModelNotAvailable: 'G枚mme modeli mevcut de臒il.',
+}
+
+export default translation
diff --git a/i18n/tr-TR/education.ts b/i18n/tr-TR/education.ts
new file mode 100644
index 0000000..f6afb98
--- /dev/null
+++ b/i18n/tr-TR/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    end: 'Dify Profesyonel Plan谋 i莽in.',
+    front: 'Art谋k E臒itim Do臒ruland谋 stat眉s眉ne uygun oldunuz. L眉tfen s眉reci tamamlamak ve bir almak i莽in e臒itim bilgilerinizi a艧a臒谋ya girin.',
+    coupon: '枚zel %100 kupon',
+  },
+  form: {
+    schoolName: {
+      placeholder: 'Okulunuzun resmi, k谋salt谋lmam谋艧 ad谋n谋 girin',
+      title: 'Okulunuzun Ad谋',
+    },
+    schoolRole: {
+      option: {
+        student: '脰臒renci',
+        teacher: '脰臒retmen',
+        administrator: 'Okul Y枚neticisi',
+      },
+      title: 'Okul Rol眉n眉z',
+    },
+    terms: {
+      desc: {
+        front: 'E臒itim Do臒ruland谋 durumunuza ili艧kin bilgileriniz ve kullan谋m谋n谋z, bizim',
+        termsOfService: 'Hizmet 艦artlar谋',
+        end: 'G枚ndererek:',
+        privacyPolicy: 'Gizlilik Politikas谋',
+        and: 've',
+      },
+      option: {
+        age: 'En az 18 ya艧谋nda oldu臒umu onayl谋yorum.',
+        inSchool: 'Verilen kurumda kay谋tl谋 veya istihdamda oldu臒umu onayl谋yorum. Dify, kay谋t veya istihdam kan谋t谋 talep edebilir. Uygunlu臒umu yanl谋艧 beyan edersem, e臒itim durumuma dayal谋 olarak ba艧lang谋莽ta feragat edilen her t眉rl眉 眉creti 枚demeyi kabul ediyorum.',
+      },
+      title: '艦artlar ve Ko艧ullar',
+    },
+  },
+  toVerified: 'E臒itim Bilgilerinizi Do臒rulay谋n',
+  currentSigned: '艦U ANDA G陌R陌艦 YAPILDI臑I K陌艦陌',
+  submitError: 'Form g枚nderimi ba艧ar谋s谋z oldu. L眉tfen daha sonra tekrar deneyin.',
+  rejectTitle: 'Dify E臒itim Do臒rulaman谋z Rededildi',
+  emailLabel: '艦u anki e-posta adresin',
+  submit: 'G枚nder',
+  rejectContent: 'Maalesef, E臒itim Do臒rulama stat眉s眉ne uygun de臒ilsiniz ve bu nedenle bu e-posta adresini kullan谋yorsan谋z Dify Profesyonel Plan谋 i莽in 枚zel %100 kuponu alamazs谋n谋z.',
+  learn: 'E臒itim do臒rulamas谋n谋n nas谋l yap谋laca臒谋n谋 枚臒renin',
+  successContent: 'Hesab谋n谋za Dify Profesyonel plan谋 i莽in %100 indirim kuponu verdik. Kuponun ge莽erlilik s眉resi bir y谋ld谋r, l眉tfen bu s眉re i莽inde kullan谋n.',
+  successTitle: 'Dify E臒itim Onay谋n谋z Var',
+}
+
+export default translation
diff --git a/i18n/tr-TR/explore.ts b/i18n/tr-TR/explore.ts
new file mode 100644
index 0000000..78b305e
--- /dev/null
+++ b/i18n/tr-TR/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: 'Ke艧fet',
+  sidebar: {
+    discovery: 'Ke艧if',
+    chat: 'Sohbet',
+    workspace: '脟al谋艧ma Alan谋',
+    action: {
+      pin: 'Sabitle',
+      unpin: 'Sabitlemeyi Kald谋r',
+      rename: 'Yeniden Adland谋r',
+      delete: 'Sil',
+    },
+    delete: {
+      title: 'Uygulamay谋 sil',
+      content: 'Bu uygulamay谋 silmek istedi臒inizden emin misiniz?',
+    },
+  },
+  apps: {
+    title: 'Dify Taraf谋ndan Ke艧fet Uygulamalar谋',
+    description: 'Bu 艧ablon uygulamalar谋n谋 an谋nda kullan谋n veya 艧ablonlara dayal谋 kendi uygulamalar谋n谋z谋 枚zelle艧tirin.',
+    allCategories: '脰nerilen',
+  },
+  appCard: {
+    addToWorkspace: '脟al谋艧ma Alan谋na Ekle',
+    customize: '脰zelle艧tir',
+  },
+  appCustomize: {
+    title: '{{name}} uygulamas谋ndan uygulama olu艧tur',
+    subTitle: 'Uygulama simgesi ve ismi',
+    nameRequired: 'Uygulama ismi gereklidir',
+  },
+  category: {
+    Assistant: 'Asistan',
+    Writing: 'Yazma',
+    Translate: '脟eviri',
+    Programming: 'Programlama',
+    HR: '陌K',
+    Agent: 'Arac谋',
+    Workflow: '陌艧 Ak谋艧谋',
+    Entertainment: 'E臒lence',
+  },
+}
+
+export default translation
diff --git a/i18n/tr-TR/layout.ts b/i18n/tr-TR/layout.ts
new file mode 100644
index 0000000..e2410dd
--- /dev/null
+++ b/i18n/tr-TR/layout.ts
@@ -0,0 +1,3 @@
+const translation = {}
+
+export default translation
diff --git a/i18n/tr-TR/login.ts b/i18n/tr-TR/login.ts
new file mode 100644
index 0000000..e742548
--- /dev/null
+++ b/i18n/tr-TR/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: 'Hey, ba艧layal谋m!馃憢',
+  welcome: 'Dify\'ye ho艧 geldiniz, devam etmek i莽in l眉tfen giri艧 yap谋n.',
+  email: 'E-posta adresi',
+  emailPlaceholder: 'E-postan谋z',
+  password: '艦ifre',
+  passwordPlaceholder: '艦ifreniz',
+  name: 'Kullan谋c谋 ad谋',
+  namePlaceholder: 'Kullan谋c谋 ad谋n谋z',
+  forget: '艦ifrenizi mi unuttunuz?',
+  signBtn: 'Giri艧 yap',
+  sso: 'SSO ile devam et',
+  installBtn: 'Kurulum',
+  setAdminAccount: 'Y枚netici hesab谋 ayarlama',
+  setAdminAccountDesc: 'Y枚netici hesab谋 i莽in maksimum ayr谋cal谋klar, uygulama olu艧turma ve LLM sa臒lay谋c谋lar谋n谋 y枚netme gibi i艧lemler i莽in kullan谋labilir.',
+  createAndSignIn: 'Olu艧tur ve giri艧 yap',
+  oneMoreStep: 'Bir ad谋m kald谋',
+  createSample: 'Bu bilgilere dayanarak, sizin i莽in 枚rnek bir uygulama olu艧turaca臒谋z',
+  invitationCode: 'Davet Kodu',
+  invitationCodePlaceholder: 'Davet kodunuz',
+  interfaceLanguage: 'Aray眉z Dili',
+  timezone: 'Zaman dilimi',
+  go: 'Dify\'ye git',
+  sendUsMail: 'Tan谋t谋m谋n谋z谋 e-posta ile g枚nderin, davet talebini i艧leme alal谋m.',
+  acceptPP: 'Gizlilik politikas谋n谋 okudum ve kabul ediyorum',
+  reset: '艦ifrenizi s谋f谋rlamak i莽in 艧u komutu 莽al谋艧t谋r谋n',
+  withGitHub: 'GitHub ile devam et',
+  withGoogle: 'Google ile devam et',
+  rightTitle: 'LLM\'nin tam potansiyelini ortaya 莽谋kar谋n',
+  rightDesc: 'G枚rsel olarak 莽ekici, 莽al谋艧谋labilir ve iyile艧tirilebilir AI uygulamalar谋 olu艧turun.',
+  tos: 'Hizmet 艦artlar谋',
+  pp: 'Gizlilik Politikas谋',
+  tosDesc: 'Kaydolarak, Hizmet 艦artlar谋m谋z谋 kabul etmi艧 olursunuz',
+  goToInit: 'Hesab谋 ba艧latmad谋ysan谋z, l眉tfen ba艧latma sayfas谋na gidin',
+  dontHave: 'Sahip de臒il misiniz?',
+  invalidInvitationCode: 'Ge莽ersiz davet kodu',
+  accountAlreadyInited: 'Hesap zaten ba艧lat谋lm谋艧',
+  forgotPassword: '艦ifrenizi mi unuttunuz?',
+  resetLinkSent: 'S谋f谋rlama ba臒lant谋s谋 g枚nderildi',
+  sendResetLink: 'S谋f谋rlama ba臒lant谋s谋 g枚nder',
+  backToSignIn: 'Giri艧e d枚n',
+  forgotPasswordDesc: '艦ifrenizi s谋f谋rlamak i莽in e-posta adresinizi girin. 艦ifrenizi nas谋l s谋f谋rlayaca臒谋n谋za dair talimatlar谋 i莽eren bir e-posta g枚nderece臒iz.',
+  checkEmailForResetLink: '艦ifrenizi s谋f谋rlamak i莽in bir ba臒lant谋 i莽eren e-postay谋 kontrol edin. Birka莽 dakika i莽inde g枚r眉nmezse, spam klas枚r眉n眉z眉 kontrol etti臒inizden emin olun.',
+  passwordChanged: '艦imdi giri艧 yap谋n',
+  changePassword: '艦ifre De臒i艧tir',
+  changePasswordTip: 'Hesab谋n谋z i莽in yeni bir 艧ifre girin',
+  invalidToken: 'Ge莽ersiz veya s眉resi dolmu艧 token',
+  confirmPassword: '艦ifreyi Onayla',
+  confirmPasswordPlaceholder: 'Yeni 艧ifrenizi onaylay谋n',
+  passwordChangedTip: '艦ifreniz ba艧ar谋yla de臒i艧tirildi',
+  error: {
+    emailEmpty: 'E-posta adresi gereklidir',
+    emailInValid: 'Ge莽erli bir e-posta adresi girin',
+    nameEmpty: '陌sim gereklidir',
+    passwordEmpty: '艦ifre gereklidir',
+    passwordLengthInValid: '艦ifre en az 8 karakterden olu艧mal谋d谋r',
+    passwordInvalid: '艦ifre harf ve rakamlardan olu艧mal谋 ve uzunlu臒u 8 karakterden fazla olmal谋d谋r',
+    registrationNotAllowed: 'Hesap bulunamad谋. Kay谋t olmak i莽in l眉tfen sistem y枚neticisi ile ileti艧ime ge莽in.',
+  },
+  license: {
+    tip: 'Dify Community Edition\'谋 ba艧latmadan 枚nce GitHub\'daki',
+    link: 'A莽谋k Kaynak Lisans谋n谋',
+  },
+  join: 'Kat谋l',
+  joinTipStart: 'Sizi',
+  joinTipEnd: 'tak谋m谋na davet ediyor',
+  invalid: 'Ba臒lant谋 s眉resi doldu',
+  explore: 'Dify\'yi Ke艧fet',
+  activatedTipStart: 'Kat谋ld谋n谋z',
+  activatedTipEnd: 'tak谋m谋na',
+  activated: '艦imdi giri艧 yap谋n',
+  adminInitPassword: 'Y枚netici ba艧lang谋莽 艧ifresi',
+  validate: 'Do臒rula',
+  checkCode: {
+    emptyCode: 'Kod gereklidir',
+    verificationCode: 'Do臒rulama kodu',
+    verify: 'Do臒rulamak',
+    validTime: 'Kodun 5 dakika boyunca ge莽erli oldu臒unu unutmay谋n',
+    invalidCode: 'Ge莽ersiz kod',
+    checkYourEmail: 'E-postan谋z谋 kontrol edin',
+    verificationCodePlaceholder: '6 haneli kodu girin',
+    useAnotherMethod: 'Ba艧ka bir y枚ntem kullan谋n',
+    didNotReceiveCode: 'Kodu almad谋n谋z m谋?',
+    tips: '<strong>{{email}}</strong> adresine bir do臒rulama kodu g枚nderiyoruz',
+    resend: 'Tekrar G枚nder',
+  },
+  enterYourName: 'L眉tfen kullan谋c谋 ad谋n谋z谋 giriniz',
+  resetPassword: '艦ifre S谋f谋rlama',
+  noLoginMethod: 'Kimlik do臒rulama y枚ntemi yap谋land谋r谋lmad谋',
+  or: 'VEYA',
+  continueWithCode: 'Kodla Devam Et',
+  setYourAccount: 'Hesab谋n谋z谋 Ayarlay谋n',
+  changePasswordBtn: 'Bir 艧ifre belirleyin',
+  withSSO: 'TOA ile devam etme',
+  usePassword: '艦ifre Kullan',
+  resetPasswordDesc: 'Dify\'a kaydolmak i莽in kulland谋臒谋n谋z e-postay谋 yaz谋n, size bir 艧ifre s谋f谋rlama e-postas谋 g枚nderelim.',
+  backToLogin: 'Giri艧e geri d枚n',
+  useVerificationCode: 'Do臒rulama Kodunu Kullan',
+  noLoginMethodTip: 'Bir kimlik do臒rulama y枚ntemi eklemek i莽in l眉tfen sistem y枚neticisine ba艧vurun.',
+  sendVerificationCode: 'Do臒rulama Kodu G枚nder',
+  back: 'Geri',
+  licenseExpiredTip: '脟al谋艧ma alan谋n谋z i莽in Dify Enterprise lisans谋n谋n s眉resi doldu. Dify\'谋 kullanmaya devam etmek i莽in l眉tfen y枚neticinizle ileti艧ime ge莽in.',
+  licenseLostTip: 'Dify lisans sunucusuna ba臒lan谋lamad谋. Dify\'谋 kullanmaya devam etmek i莽in l眉tfen y枚neticinizle ileti艧ime ge莽in.',
+  licenseInactiveTip: '脟al谋艧ma alan谋n谋z i莽in Dify Enterprise lisans谋 etkin de臒il. Dify\'谋 kullanmaya devam etmek i莽in l眉tfen y枚neticinizle ileti艧ime ge莽in.',
+  licenseExpired: 'Lisans谋n S眉resi Doldu',
+  licenseLost: 'Lisans Kaybedildi',
+  licenseInactive: 'Lisans Etkin De臒il',
+}
+
+export default translation
diff --git a/i18n/tr-TR/plugin-tags.ts b/i18n/tr-TR/plugin-tags.ts
new file mode 100644
index 0000000..3b95d46
--- /dev/null
+++ b/i18n/tr-TR/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    finance: 'Maliye',
+    utilities: 'Yard谋mc谋 program',
+    design: 'Tasar谋m',
+    image: 'Resim',
+    videos: 'Video',
+    other: 'Di臒er',
+    education: 'E臒itim',
+    medical: 'T谋bbi',
+    social: 'Sosyal',
+    agent: 'Arac谋',
+    business: '陌艧',
+    weather: 'Hava',
+    travel: 'Seyahat',
+    productivity: 'Verimli -lik',
+    news: 'Haberler',
+    entertainment: 'E臒lence',
+    search: 'Aramak',
+  },
+  allTags: 'T眉m Etiketler',
+  searchTags: 'Arama Etiketleri',
+}
+
+export default translation
diff --git a/i18n/tr-TR/plugin.ts b/i18n/tr-TR/plugin.ts
new file mode 100644
index 0000000..c434052
--- /dev/null
+++ b/i18n/tr-TR/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    models: 'Model',
+    all: 'T眉m',
+    bundles: 'Paketler',
+    agents: 'Ajan Stratejileri',
+    tools: 'Ara莽lar谋',
+    extensions: 'Uzant谋 -lar谋',
+  },
+  categorySingle: {
+    tool: 'Alet',
+    bundle: 'Boh莽a',
+    extension: 'Uzant谋',
+    agent: 'Temsilci Stratejisi',
+    model: 'Model',
+  },
+  list: {
+    source: {
+      github: 'GitHub\'dan y眉kleyin',
+      marketplace: 'Marketten Y眉kleme',
+      local: 'Yerel Paket Dosyas谋ndan Y眉kle',
+    },
+    noInstalled: 'Y眉kl眉 eklenti yok',
+    notFound: 'Eklenti bulunamad谋',
+  },
+  source: {
+    github: 'GitHub (陌ngilizce)',
+    marketplace: 'Pazar',
+    local: 'Yerel Paket Dosyas谋',
+  },
+  detailPanel: {
+    categoryTip: {
+      marketplace: 'Marketplace\'ten y眉klendi',
+      local: 'Yerel Eklenti',
+      debugging: 'Hata Ay谋klama Eklentisi',
+      github: 'Github\'dan y眉klendi',
+    },
+    operation: {
+      install: 'Y眉klemek',
+      detail: '艦ey',
+      checkUpdate: 'G眉ncellemeyi Kontrol Et',
+      remove: 'Kald谋rmak',
+      info: 'Eklenti Bilgileri',
+      viewDetail: 'ayr谋nt谋lara bak谋n',
+      update: 'G眉ncelle艧tirmek',
+    },
+    toolSelector: {
+      uninstalledContent: 'Bu eklenti yerel/GitHub deposundan y眉klenir. L眉tfen kurulumdan sonra kullan谋n.',
+      uninstalledLink: 'Eklentilerde Y枚net',
+      descriptionLabel: 'Ara莽 a莽谋klamas谋',
+      auto: 'Otomatik',
+      settings: 'KULLANICI AYARLARI',
+      empty: 'Ara莽 eklemek i莽in \'+\' d眉臒mesini t谋klay谋n. Birden fazla ara莽 ekleyebilirsiniz.',
+      unsupportedContent: 'Y眉kl眉 eklenti s眉r眉m眉 bu eylemi sa臒lamaz.',
+      paramsTip1: 'LLM 莽谋kar谋m parametrelerini kontrol eder.',
+      descriptionPlaceholder: 'Aletin amac谋n谋n k谋sa a莽谋klamas谋, 枚rne臒in belirli bir konum i莽in s谋cakl谋臒谋 elde edin.',
+      toolLabel: 'Alet',
+      placeholder: 'Bir ara莽 se莽in...',
+      title: 'Ara莽 ekle',
+      uninstalledTitle: 'Ara莽 y眉kl眉 de臒il',
+      unsupportedContent2: 'S眉r眉m眉 de臒i艧tirmek i莽in t谋klay谋n.',
+      params: 'AKIL Y脺R脺TME YAPILANDIRMASI',
+      paramsTip2: '\'Otomatik\' kapal谋yken, varsay谋lan de臒er kullan谋l谋r.',
+      unsupportedTitle: 'Desteklenmeyen Eylem',
+    },
+    strategyNum: '{{say谋}} {{strateji}} DAH陌L',
+    switchVersion: 'S眉r眉m眉 De臒i艧tir',
+    endpointDisableContent: '{{name}} 枚臒esini devre d谋艧谋 b谋rakmak ister misiniz?',
+    endpointsDocLink: 'Belgeyi g枚r眉nt眉leyin',
+    endpointsEmpty: 'U莽 nokta eklemek i莽in \'+\' d眉臒mesini t谋klay谋n',
+    endpoints: 'Biti艧 noktas谋',
+    disabled: 'Sakat',
+    endpointModalTitle: 'U莽 noktay谋 ayarlama',
+    configureModel: 'Modeli yap谋land谋rma',
+    actionNum: '{{say谋}} {{eylem}} DAH陌L',
+    configureTool: 'Arac谋 yap谋land谋r',
+    endpointsTip: 'Bu eklenti, u莽 noktalar arac谋l谋臒谋yla belirli i艧levler sa臒lar ve ge莽erli 莽al谋艧ma alan谋 i莽in birden 莽ok u莽 nokta k眉mesi yap谋land谋rabilirsiniz.',
+    configureApp: 'Uygulamay谋 Yap谋land谋r',
+    endpointDeleteTip: 'U莽 Noktay谋 Kald谋r',
+    endpointDeleteContent: '{{name}} 枚臒esini kald谋rmak ister misiniz?',
+    endpointModalDesc: 'Yap谋land谋r谋ld谋ktan sonra, eklenti taraf谋ndan API u莽 noktalar谋 arac谋l谋臒谋yla sa臒lanan 枚zellikler kullan谋labilir.',
+    modelNum: '{{say谋}} DAH陌L OLAN MODELLER',
+    endpointDisableTip: 'U莽 Noktay谋 Devre D谋艧谋 B谋rak',
+    serviceOk: 'Servis Tamam',
+  },
+  debugInfo: {
+    title: 'Hata ay谋klama',
+    viewDocs: 'Belgeleri G枚r眉nt眉le',
+  },
+  privilege: {
+    admins: 'Y枚neticiler',
+    whoCanDebug: 'Eklentilerde kimler hata ay谋klayabilir?',
+    everyone: 'Herkes',
+    title: 'Eklenti Tercihleri',
+    noone: 'Hi莽 kimse',
+    whoCanInstall: 'Eklentileri kimler y眉kleyebilir ve y枚netebilir?',
+  },
+  pluginInfoModal: {
+    packageName: 'Paket',
+    repository: 'Depo',
+    release: 'Serbest b谋rakma',
+    title: 'Eklenti bilgisi',
+  },
+  action: {
+    checkForUpdates: 'G眉ncellemeleri kontrol et',
+    deleteContentLeft: 'Kald谋rmak ister misiniz',
+    usedInApps: 'Bu eklenti {{num}} uygulamalar谋nda kullan谋l谋yor.',
+    delete: 'Eklentiyi kald谋r',
+    pluginInfo: 'Eklenti bilgisi',
+    deleteContentRight: 'eklenti?',
+  },
+  installModal: {
+    labels: {
+      repository: 'Depo',
+      version: 'S眉r眉m',
+      package: 'Paket',
+    },
+    back: 'Geri',
+    installComplete: 'Kurulum tamamland谋',
+    installing: 'Y眉kleme...',
+    installedSuccessfully: 'Y眉kleme ba艧ar谋l谋',
+    installFailedDesc: 'Eklenti y眉klenemedi, ba艧ar谋s谋z oldu.',
+    fromTrustSource: 'L眉tfen eklentileri yaln谋zca <trustSource>g眉venilir bir kaynaktan</trustSource> y眉kledi臒inizden emin olun.',
+    uploadingPackage: '{{packageName}} y眉kleniyor...',
+    readyToInstall: 'A艧a臒谋daki eklentiyi y眉klemek 眉zere',
+    next: '脰n眉m眉zdeki',
+    pluginLoadError: 'Eklenti y眉kleme hatas谋',
+    install: 'Y眉klemek',
+    cancel: '陌ptal',
+    installedSuccessfullyDesc: 'Eklenti ba艧ar谋yla y眉klendi.',
+    close: 'Kapatmak',
+    uploadFailed: 'Kar艧谋ya y眉kleme ba艧ar谋s谋z oldu',
+    installFailed: 'Y眉kleme ba艧ar谋s谋z oldu',
+    pluginLoadErrorDesc: 'Bu eklenti y眉klenmeyecek',
+    readyToInstallPackage: 'A艧a臒谋daki eklentiyi y眉klemek 眉zere',
+    readyToInstallPackages: 'A艧a臒谋daki {{num}} eklentilerini y眉klemek 眉zereyim',
+    dropPluginToInstall: 'Y眉klemek i莽in eklenti paketini buraya b谋rak谋n',
+    installPlugin: 'Eklentiyi Y眉kle',
+  },
+  installFromGitHub: {
+    installedSuccessfully: 'Y眉kleme ba艧ar谋l谋',
+    installFailed: 'Y眉kleme ba艧ar谋s谋z oldu',
+    installNote: 'L眉tfen eklentileri yaln谋zca g眉venilir bir kaynaktan y眉kledi臒inizden emin olun.',
+    selectVersion: 'S眉r眉m眉 se莽in',
+    selectPackage: 'Paket se莽',
+    installPlugin: 'GitHub\'dan eklenti y眉kleyin',
+    selectPackagePlaceholder: 'L眉tfen bir paket se莽in',
+    uploadFailed: 'Kar艧谋ya y眉kleme ba艧ar谋s谋z oldu',
+    selectVersionPlaceholder: 'L眉tfen bir s眉r眉m se莽in',
+    gitHubRepo: 'GitHub deposu',
+    updatePlugin: 'GitHub\'dan eklentiyi g眉ncelleyin',
+  },
+  upgrade: {
+    usedInApps: '{{num}} uygulamalar谋nda kullan谋l谋r',
+    upgrade: 'Y眉klemek',
+    title: 'Eklentiyi Y眉kle',
+    successfulTitle: 'Y眉kleme ba艧ar谋l谋',
+    upgrading: 'Y眉kleme...',
+    close: 'Kapatmak',
+    description: 'A艧a臒谋daki eklentiyi y眉klemek 眉zere',
+  },
+  error: {
+    inValidGitHubUrl: 'Ge莽ersiz GitHub URL\'si. L眉tfen 艧u bi莽imde ge莽erli bir URL girin: https://github.com/owner/repo',
+    fetchReleasesError: 'S眉r眉mler al谋nam谋yor. L眉tfen daha sonra tekrar deneyin.',
+    noReleasesFound: 'Yay谋n bulunamad谋. L眉tfen GitHub deposunu veya giri艧 URL\'sini kontrol edin.',
+  },
+  marketplace: {
+    sortOption: {
+      newlyReleased: 'Yeni 脟谋kanlar',
+      mostPopular: 'En pop眉ler',
+      firstReleased: '陌lk 脟谋kanlar',
+      recentlyUpdated: 'Son G眉ncelleme',
+    },
+    and: 've',
+    empower: 'Yapay zeka geli艧tirmenizi g眉莽lendirin',
+    pluginsResult: '{{num}} sonu莽',
+    difyMarketplace: 'Dify Pazar Yeri',
+    sortBy: 'Kara 艧ehir',
+    moreFrom: 'Marketplace\'ten daha fazlas谋',
+    noPluginFound: 'Eklenti bulunamad谋',
+    viewMore: 'Daha fazla g枚ster',
+    discover: 'Ke艧fetmek',
+    verifiedTip: 'Dify taraf谋ndan do臒rulanm谋艧t谋r.',
+    partnerTip: 'Dify partner\'谋 taraf谋ndan do臒ruland谋',
+  },
+  task: {
+    installedError: '{{errorLength}} eklentileri y眉klenemedi',
+    clearAll: 'T眉m眉n眉 temizle',
+    installing: '{{installingLength}} eklentilerinin kurulumu, 0 bitti.',
+    installingWithSuccess: '{{installingLength}} eklentileri y眉kleniyor, {{successLength}} ba艧ar谋l谋.',
+    installError: '{{errorLength}} eklentileri y眉klenemedi, g枚r眉nt眉lemek i莽in t谋klay谋n',
+    installingWithError: '{{installingLength}} eklentileri y眉kleniyor, {{successLength}} ba艧ar谋l谋, {{errorLength}} ba艧ar谋s谋z oldu',
+  },
+  allCategories: 'T眉m Kategoriler',
+  installAction: 'Y眉klemek',
+  search: 'Aramak',
+  install: '{{num}} y眉kleme',
+  searchPlugins: 'Eklentileri ara',
+  submitPlugin: 'Eklenti g枚nder',
+  searchTools: 'Arama ara莽lar谋...',
+  fromMarketplace: 'Pazar Yerinden',
+  installPlugin: 'Eklentiyi y眉kle',
+  installFrom: '艦URADAN Y脺KLE',
+  from: 'Kaynak',
+  endpointsEnabled: '{{num}} u莽 nokta k眉mesi etkinle艧tirildi',
+  findMoreInMarketplace: 'Marketplace\'te daha fazla bilgi edinin',
+  searchCategories: 'Arama Kategorileri',
+  searchInMarketplace: 'Marketplace\'te arama yapma',
+  metadata: {
+    title: 'Eklentiler',
+  },
+  difyVersionNotCompatible: 'Mevcut Dify s眉r眉m眉 bu eklentiyle uyumlu de臒il, l眉tfen gerekli minimum s眉r眉me g眉ncelleyin: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/tr-TR/register.ts b/i18n/tr-TR/register.ts
new file mode 100644
index 0000000..e2410dd
--- /dev/null
+++ b/i18n/tr-TR/register.ts
@@ -0,0 +1,3 @@
+const translation = {}
+
+export default translation
diff --git a/i18n/tr-TR/run-log.ts b/i18n/tr-TR/run-log.ts
new file mode 100644
index 0000000..8fa8e93
--- /dev/null
+++ b/i18n/tr-TR/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: 'G陌R陌艦',
+  result: 'SONU脟',
+  detail: 'DETAY',
+  tracing: '陌ZLEME',
+  resultPanel: {
+    status: 'DURUM',
+    time: 'GE脟EN ZAMAN',
+    tokens: 'TOPLAM TOKEN',
+  },
+  meta: {
+    title: 'METADATA',
+    status: 'Durum',
+    version: 'S眉r眉m',
+    executor: 'Y眉r眉t眉c眉',
+    startTime: 'Ba艧lama Zaman谋',
+    time: 'Ge莽en Zaman',
+    tokens: 'Toplam Token',
+    steps: '脟al谋艧t谋rma Ad谋mlar谋',
+  },
+  resultEmpty: {
+    title: 'Bu 莽al谋艧t谋rma sadece JSON format谋nda 莽谋kt谋 verdi,',
+    tipLeft: 'l眉tfen ',
+    link: 'detay paneli',
+    tipRight: 'ne gidin ve g枚r眉nt眉leyin.',
+  },
+  actionLogs: 'Eylem G眉nl眉kleri',
+  circularInvocationTip: 'Ge莽erli i艧 ak谋艧谋nda ara莽lar谋n/d眉臒眉mlerin d枚ng眉sel olarak 莽a臒r谋lmas谋 vard谋r.',
+}
+
+export default translation
diff --git a/i18n/tr-TR/share-app.ts b/i18n/tr-TR/share-app.ts
new file mode 100644
index 0000000..184f44e
--- /dev/null
+++ b/i18n/tr-TR/share-app.ts
@@ -0,0 +1,78 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: 'Uygulama kullan谋lam谋yor',
+    appUnknownError: 'Uygulama kullan谋lam谋yor',
+  },
+  chat: {
+    newChat: 'Yeni sohbet',
+    pinnedTitle: 'Sabitlenmi艧',
+    unpinnedTitle: 'Sohbetler',
+    newChatDefaultName: 'Yeni konu艧ma',
+    resetChat: 'Konu艧may谋 s谋f谋rla',
+    poweredBy: 'Taraf谋ndan desteklenmektedir',
+    prompt: 'Prompt',
+    privatePromptConfigTitle: 'Konu艧ma ayarlar谋',
+    publicPromptConfigTitle: 'Ba艧lang谋莽 Promptu',
+    configStatusDes: 'Ba艧lamadan 枚nce, konu艧ma ayarlar谋n谋 de臒i艧tirebilirsiniz',
+    configDisabled: 'Bu oturum i莽in 枚nceki oturum ayarlar谋 kullan谋lm谋艧t谋r.',
+    startChat: 'Sohbete Ba艧la',
+    privacyPolicyLeft: 'L眉tfen okuyun',
+    privacyPolicyMiddle: 'gizlilik politikas谋',
+    privacyPolicyRight: 'uygulama geli艧tiricisi taraf谋ndan sa臒lanm谋艧t谋r.',
+    deleteConversation: {
+      title: 'Konu艧may谋 sil',
+      content: 'Bu konu艧may谋 silmek istedi臒inize emin misiniz?',
+    },
+    tryToSolve: '脟枚zmeyi Dene',
+    temporarySystemIssue: '脺zg眉n眉z, ge莽ici sistem sorunu.',
+    expand: 'Geni艧let',
+    collapse: 'K谋s谋tla',
+    chatSettingsTitle: 'Yeni sohbet kurulumu',
+    chatFormTip: 'Sohbet ba艧lad谋ktan sonra sohbet ayarlar谋 de臒i艧tirilemez.',
+    viewChatSettings: 'Sohbet ayarlar谋n谋 g枚r眉nt眉le',
+    newChatTip: 'Zaten yeni bir sohbette',
+  },
+  generation: {
+    tabs: {
+      create: 'Bir Kere 脟al谋艧t谋r',
+      batch: 'Toplu 脟al谋艧t谋r',
+      saved: 'Kaydedildi',
+    },
+    savedNoData: {
+      title: 'Hen眉z bir sonu莽 kaydetmediniz!',
+      description: '陌莽erik olu艧turmaya ba艧lay谋n ve kaydedilen sonu莽lar谋 burada bulun.',
+      startCreateContent: '陌莽erik olu艧turmay谋 ba艧lat',
+    },
+    title: 'AI Tamamlama',
+    queryTitle: 'Sorgu i莽eri臒i',
+    completionResult: 'Tamamlama sonucu',
+    queryPlaceholder: 'Sorgu i莽eri臒inizi yaz谋n...',
+    run: '脟al谋艧t谋r',
+    copy: 'Kopyala',
+    resultTitle: 'AI Tamamlama',
+    noData: 'AI burada istedi臒inizi size verecek.',
+    csvUploadTitle: 'CSV dosyan谋z谋 buraya s眉r眉kleyip b谋rak谋n ya da ',
+    browse: 'g枚z at谋n',
+    csvStructureTitle: 'CSV dosyas谋 艧u yap谋ya uygun olmal谋d谋r:',
+    downloadTemplate: '艦ablonu buradan indir',
+    field: 'Alan',
+    batchFailed: {
+      info: '{{num}} ba艧ar谋s谋z i艧lemler',
+      retry: 'Yeniden dene',
+      outputPlaceholder: '脟谋kt谋 i莽eri臒i yok',
+    },
+    errorMsg: {
+      empty: 'L眉tfen y眉klenen dosyada i莽erik girin.',
+      fileStructNotMatch: 'Y眉klenen CSV dosyas谋 yap谋ya uymuyor.',
+      emptyLine: 'Sat谋r {{rowIndex}} bo艧',
+      invalidLine: 'Sat谋r {{rowIndex}}: {{varName}} de臒eri bo艧 olamaz',
+      moreThanMaxLengthLine: 'Sat谋r {{rowIndex}}: {{varName}} de臒eri {{maxLength}} karakterden fazla olamaz',
+      atLeastOne: 'L眉tfen y眉klenen dosyada en az bir sat谋r girin.',
+    },
+    execution: '陌FRAZAT',
+    executions: '{{num}} 陌DAM',
+  },
+}
+
+export default translation
diff --git a/i18n/tr-TR/time.ts b/i18n/tr-TR/time.ts
new file mode 100644
index 0000000..f4cded0
--- /dev/null
+++ b/i18n/tr-TR/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Sat: 'Sat',
+    Thu: 'Per艧embe',
+    Tue: 'Sal谋',
+    Mon: 'Mon',
+    Sun: 'G眉ne艧',
+    Fri: 'Cuma',
+    Wed: '脟ar艧amba',
+  },
+  months: {
+    March: 'Mart',
+    December: 'Aral谋k',
+    October: 'Ekim',
+    September: 'Eyl眉l',
+    July: 'Temmuz',
+    August: 'A臒ustos',
+    June: 'Haziran',
+    November: 'Kas谋m',
+    February: '艦ubat',
+    April: 'Nisan',
+    May: 'May谋s',
+    January: 'Ocak',
+  },
+  operation: {
+    cancel: '陌ptal',
+    now: '艦imdi',
+    pickDate: 'Tarih Se莽',
+    ok: 'Tamam',
+  },
+  title: {
+    pickTime: 'Zaman谋 Se莽',
+  },
+  defaultPlaceholder: 'Bir zaman se莽...',
+}
+
+export default translation
diff --git a/i18n/tr-TR/tools.ts b/i18n/tr-TR/tools.ts
new file mode 100644
index 0000000..d4b6725
--- /dev/null
+++ b/i18n/tr-TR/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: 'Ara莽lar',
+  createCustomTool: '脰zel Ara莽 Olu艧tur',
+  customToolTip: 'Dify 枚zel ara莽lar谋 hakk谋nda daha fazla bilgi edinin',
+  type: {
+    all: 'Hepsi',
+    builtIn: 'Yerle艧ik',
+    custom: '脰zel',
+    workflow: 'Workflow',
+  },
+  contribute: {
+    line1: 'Dify\'ye ',
+    line2: 'ara莽lar eklemekle ilgileniyorum.',
+    viewGuide: 'Rehberi G枚r眉nt眉le',
+  },
+  author: 'Taraf谋ndan',
+  auth: {
+    unauthorized: 'Yetki Ver',
+    authorized: 'Yetkilendirildi',
+    setup: 'Kullanmak i莽in yetkilendirmeyi ayarla',
+    setupModalTitle: 'Yetkilendirmeyi Ayarla',
+    setupModalTitleDescription: 'Kimlik bilgilerini yap谋land谋rd谋ktan sonra, 莽al谋艧ma alan谋ndaki t眉m 眉yeler uygulamalar谋 d眉zenlerken bu arac谋 kullanabilir.',
+  },
+  includeToolNum: '{{num}} ara莽 dahil',
+  addTool: 'Ara莽 Ekle',
+  addToolModal: {
+    type: 'T眉r',
+    category: 'Kategori',
+    add: 'Ekle',
+    added: 'Eklendi',
+    manageInTools: 'Ara莽larda Y枚net',
+    emptyTitle: 'Kullan谋labilir workflow arac谋 yok',
+    emptyTip: 'Git "Workflow -> Ara莽 olarak Yay谋nla"',
+    emptyTitleCustom: '脰zel bir ara莽 yok',
+    emptyTipCustom: '脰zel bir ara莽 olu艧turun',
+  },
+  createTool: {
+    title: '脰zel Ara莽 Olu艧tur',
+    editAction: 'Yap谋land谋r',
+    editTitle: '脰zel Arac谋 D眉zenle',
+    name: '陌sim',
+    toolNamePlaceHolder: 'Ara莽 ismini girin',
+    nameForToolCall: 'Ara莽 莽a臒r谋 ad谋',
+    nameForToolCallPlaceHolder: 'Makine tan谋mas谋 i莽in kullan谋l谋r, 枚rne臒in getCurrentWeather, list_pets',
+    nameForToolCallTip: 'Sadece rakamlar, harfler ve alt 莽izgileri destekler.',
+    description: 'A莽谋klama',
+    descriptionPlaceholder: 'Ara莽 amac谋n谋n k谋sa a莽谋klamas谋, 枚rne臒in belirli bir yer i莽in s谋cakl谋臒谋 al.',
+    schema: '艦ema',
+    schemaPlaceHolder: 'OpenAPI 艧eman谋z谋 buraya girin',
+    viewSchemaSpec: 'OpenAPI-Swagger Spesifikasyonunu G枚r眉nt眉le',
+    importFromUrl: 'URL\'den 陌莽e Aktar',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: 'Ge莽erli bir URL girin',
+    examples: '脰rnekler',
+    exampleOptions: {
+      json: 'Hava Durumu (JSON)',
+      yaml: 'Evcil Hayvan Ma臒azas谋 (YAML)',
+      blankTemplate: 'Bo艧 艦ablon',
+    },
+    availableTools: {
+      title: 'Kullan谋labilir Ara莽lar',
+      name: '陌sim',
+      description: 'A莽谋klama',
+      method: 'Y枚ntem',
+      path: 'Yol',
+      action: 'Eylemler',
+      test: 'Test',
+    },
+    authMethod: {
+      title: 'Yetkilendirme y枚ntemi',
+      type: 'Yetkilendirme t眉r眉',
+      keyTooltip: 'Http Ba艧l谋臒谋 Anahtar谋, ne oldu臒unu bilmiyorsan谋z "Authorization" olarak b谋rakabilirsiniz veya 枚zel bir de臒ere ayarlayabilirsiniz',
+      types: {
+        none: 'Yok',
+        api_key: 'API Anahtar谋',
+        apiKeyPlaceholder: 'API Anahtar谋 i莽in HTTP ba艧l谋k ad谋',
+        apiValuePlaceholder: 'API Anahtar谋n谋 girin',
+      },
+      key: 'Anahtar',
+      value: 'De臒er',
+    },
+    authHeaderPrefix: {
+      title: 'Yetki T眉r眉',
+      types: {
+        basic: 'Temel',
+        bearer: 'Bearer',
+        custom: '脰zel',
+      },
+    },
+    privacyPolicy: 'Gizlilik politikas谋',
+    privacyPolicyPlaceholder: 'Gizlilik politikas谋n谋 girin',
+    toolInput: {
+      title: 'Ara莽 Giri艧i',
+      name: '陌sim',
+      required: 'Gerekli',
+      method: 'Y枚ntem',
+      methodSetting: 'Ayar',
+      methodSettingTip: 'Kullan谋c谋 ara莽 yap谋land谋rmas谋n谋 doldurur',
+      methodParameter: 'Parametre',
+      methodParameterTip: '脟谋kar谋m s谋ras谋nda LLM taraf谋ndan doldurulur',
+      label: 'Etiketler',
+      labelPlaceholder: 'Etiketleri se莽 (iste臒e ba臒l谋)',
+      description: 'A莽谋klama',
+      descriptionPlaceholder: 'Parametrenin anlam谋n谋n a莽谋klamas谋',
+    },
+    customDisclaimer: '脰zel feragatname',
+    customDisclaimerPlaceholder: '脰zel feragatnameyi girin',
+    confirmTitle: 'Kaydetmek i莽in onayl谋yor musunuz?',
+    confirmTip: 'Bu arac谋 kullanan uygulamalar etkilenecek',
+    deleteToolConfirmTitle: 'Bu Arac谋 silmek istiyor musunuz?',
+    deleteToolConfirmContent: 'Arac谋n silinmesi geri al谋namaz. Kullan谋c谋lar art谋k arac谋n谋za eri艧emeyecek.',
+  },
+  test: {
+    title: 'Test',
+    parametersValue: 'Parametreler ve De臒er',
+    parameters: 'Parametreler',
+    value: 'De臒er',
+    testResult: 'Test Sonu莽lar谋',
+    testResultPlaceholder: 'Test sonucu burada g枚sterilecektir',
+  },
+  thought: {
+    using: 'Kullan谋l谋yor',
+    used: 'Kullan谋ld谋',
+    requestTitle: '陌stek',
+    responseTitle: 'Yan谋t',
+  },
+  setBuiltInTools: {
+    info: 'Bilgi',
+    setting: 'Ayar',
+    toolDescription: 'Ara莽 a莽谋klamas谋',
+    parameters: 'parametreler',
+    string: 'string',
+    number: 'numara',
+    required: 'Gerekli',
+    infoAndSetting: 'Bilgi ve Ayarlar',
+    file: 'dosya',
+  },
+  noCustomTool: {
+    title: '脰zel ara莽 yok!',
+    content: 'AI uygulamalar谋 olu艧turmak i莽in 枚zel ara莽lar谋n谋z谋 buraya ekleyin ve y枚netin.',
+    createTool: 'Ara莽 Olu艧tur',
+  },
+  noSearchRes: {
+    title: '脺zg眉n眉z, sonu莽 bulunamad谋!',
+    content: 'Araman谋zla e艧le艧en ara莽lar bulamad谋k.',
+    reset: 'Aramay谋 S谋f谋rla',
+  },
+  builtInPromptTitle: 'Prompt',
+  toolRemoved: 'Ara莽 kald谋r谋ld谋',
+  notAuthorized: 'Ara莽 yetkilendirilmedi',
+  howToGet: 'Nas谋l al谋n谋r',
+  openInStudio: 'Studyoda A莽',
+  toolNameUsageTip: 'Agent ak谋l y眉r眉tme ve prompt i莽in ara莽 莽a臒r谋 ad谋',
+  copyToolName: 'Ad谋 Kopyala',
+  noTools: 'Ara莽 bulunamad谋',
+}
+
+export default translation
diff --git a/i18n/tr-TR/workflow.ts b/i18n/tr-TR/workflow.ts
new file mode 100644
index 0000000..999456f
--- /dev/null
+++ b/i18n/tr-TR/workflow.ts
@@ -0,0 +1,922 @@
+const translation = {
+  common: {
+    undo: 'Geri Al',
+    redo: 'Yinele',
+    editing: 'D眉zenleme',
+    autoSaved: 'Otomatik Kaydedildi',
+    unpublished: 'Yay谋nlanmam谋艧',
+    published: 'Yay谋nland谋',
+    publish: 'Yay谋nla',
+    update: 'G眉ncelle',
+    run: '脟al谋艧t谋r',
+    running: '脟al谋艧谋yor',
+    inRunMode: '脟al谋艧t谋rma Modunda',
+    inPreview: '脰n 陌zlemede',
+    inPreviewMode: '脰nizleme Modunda',
+    preview: '脰nizleme',
+    viewRunHistory: '脟al谋艧t谋rma ge莽mi艧ini g枚r眉nt眉le',
+    runHistory: '脟al谋艧t谋rma Ge莽mi艧i',
+    goBackToEdit: 'Edit枚re geri d枚n',
+    conversationLog: 'Konu艧ma G眉nl眉臒眉',
+    features: '脰zellikler',
+    debugAndPreview: '脰nizleme',
+    restart: 'Yeniden Ba艧lat',
+    currentDraft: 'Ge莽erli Taslak',
+    currentDraftUnpublished: 'Mevcut Taslak Yay谋nlanmam谋艧',
+    latestPublished: 'Son Yay谋nlanan',
+    publishedAt: 'Yay谋nland谋',
+    restore: 'Geri Y眉kle',
+    runApp: 'Uygulamay谋 脟al谋艧t谋r',
+    batchRunApp: 'Toplu Uygulama 脟al谋艧t谋r',
+    accessAPIReference: 'API Referans谋na Eri艧',
+    embedIntoSite: 'Siteye G枚m',
+    addTitle: 'Ba艧l谋k ekle...',
+    addDescription: 'A莽谋klama ekle...',
+    noVar: 'De臒i艧ken yok',
+    searchVar: 'De臒i艧keni ara',
+    variableNamePlaceholder: 'De臒i艧ken ad谋',
+    setVarValuePlaceholder: 'De臒i艧keni ayarla',
+    needConnectTip: 'Bu ad谋m hi莽bir 艧eye ba臒l谋 de臒il',
+    maxTreeDepth: 'Her dal i莽in maksimum {{depth}} d眉臒眉m limiti',
+    needEndNode: 'Son blok eklenmelidir',
+    needAnswerNode: 'Yan谋t blo臒u eklenmelidir',
+    workflowProcess: 'Workflow S眉reci',
+    notRunning: 'Hen眉z 莽al谋艧t谋r谋lmad谋',
+    previewPlaceholder: 'Sohbet Robotunu hata ay谋klamak i莽in a艧a臒谋daki kutuya i莽erik girin',
+    effectVarConfirm: {
+      title: 'De臒i艧keni Kald谋r',
+      content: 'De臒i艧ken di臒er d眉臒眉mlerde kullan谋l谋yor. Yine de kald谋rmak istiyor musunuz?',
+    },
+    insertVarTip: 'H谋zl谋 eklemek i莽in \'/\' tu艧una bas谋n',
+    processData: 'Veriyi 陌艧le',
+    input: 'Girdi',
+    output: '脟谋kt谋',
+    jinjaEditorPlaceholder: 'De臒i艧ken eklemek i莽in \'/\' veya \'{\' yaz谋n',
+    viewOnly: 'Sadece G枚r眉nt眉leme',
+    showRunHistory: '脟al谋艧t谋rma Ge莽mi艧ini G枚ster',
+    enableJinja: 'Jinja 艧ablon deste臒ini etkinle艧tir',
+    learnMore: 'Daha Fazla Bilgi',
+    copy: 'Kopyala',
+    duplicate: '脟o臒alt',
+    addBlock: 'Blok Ekle',
+    pasteHere: 'Buraya Yap谋艧t谋r',
+    pointerMode: '陌艧aret莽i Modu',
+    handMode: 'El Modu',
+    model: 'Model',
+    workflowAsTool: 'Ara莽 Olarak Workflow',
+    configureRequired: 'Yap谋land谋rma Gerekli',
+    configure: 'Yap谋land谋r',
+    manageInTools: 'Ara莽larda Y枚net',
+    workflowAsToolTip: 'Workflow g眉ncellemesinden sonra ara莽 yeniden yap谋land谋rmas谋 gereklidir.',
+    viewDetailInTracingPanel: 'Ayr谋nt谋lar谋 g枚r眉nt眉le',
+    syncingData: 'Veriler senkronize ediliyor, birka莽 saniye bekleyin.',
+    importDSL: 'DSL 陌莽e Aktar',
+    importDSLTip: 'Ge莽erli taslak 眉zerine yaz谋lacak. 陌莽e aktarmadan 枚nce workflow yedekleyin.',
+    backupCurrentDraft: 'Ge莽erli Tasla臒谋 Yedekleyin',
+    chooseDSL: 'DSL(yml) dosyas谋n谋 se莽in',
+    overwriteAndImport: '脺zerine Yaz ve 陌莽e Aktar',
+    importFailure: '陌莽e Aktarma Ba艧ar谋s谋z',
+    importSuccess: '陌莽e Aktarma Ba艧ar谋l谋',
+    parallelTip: {
+      click: {
+        desc: 'Eklemek i莽in',
+        title: 'T谋k',
+      },
+      drag: {
+        title: 'S眉r眉kleme',
+        desc: 'Ba臒lanmak i莽in',
+      },
+      depthLimit: '{{num}} katmanlar谋n谋n paralel i莽 i莽e ge莽me katman谋 s谋n谋r谋',
+      limit: 'Paralellik {{num}} dallar谋yla s谋n谋rl谋d谋r.',
+    },
+    jumpToNode: 'Bu d眉臒眉me atla',
+    addParallelNode: 'Paralel D眉臒眉m Ekle',
+    disconnect: 'Ay谋rmak',
+    parallelRun: 'Paralel Ko艧u',
+    parallel: 'PARALEL',
+    branch: 'DAL',
+    featuresDocLink: 'Daha fazla bilgi edinin',
+    fileUploadTip: 'Resim y眉kleme 枚zellikleri, dosya y眉klemeye y眉kseltildi.',
+    ImageUploadLegacyTip: 'Art谋k ba艧lang谋莽 formunda dosya t眉r眉 de臒i艧kenleri olu艧turabilirsiniz. Gelecekte resim y眉kleme 枚zelli臒ini art谋k desteklemeyece臒iz.',
+    featuresDescription: 'Web uygulamas谋 kullan谋c谋 deneyimini geli艧tirin',
+    importWarningDetails: 'DSL s眉r眉m fark谋 baz谋 枚zellikleri etkileyebilir',
+    importWarning: 'Dikkat',
+    openInExplore: 'Ke艧fet\'te A莽',
+    onFailure: 'Ba艧ar谋s谋zl谋k 脺zerine',
+    addFailureBranch: 'Ba艧ar谋s谋z dal ekle',
+    loadMore: 'Daha Fazla 陌艧 Ak谋艧谋 Y眉kleyin',
+    noHistory: 'Tarih Yok',
+    exportPNG: 'PNG olarak d谋艧a aktar',
+    exportImage: 'Resmi D谋艧a Aktar',
+    publishUpdate: 'G眉ncellemeyi Yay谋nla',
+    exitVersions: '脟谋k谋艧 S眉r眉mleri',
+    versionHistory: 'S眉r眉m Ge莽mi艧i',
+    exportJPEG: 'JPEG olarak d谋艧a aktar',
+    noExist: 'B枚yle bir de臒i艧ken yok',
+    exportSVG: 'SVG olarak d谋艧a aktar',
+    referenceVar: 'Referans De臒i艧ken',
+  },
+  env: {
+    envPanelTitle: '脟evre De臒i艧kenleri',
+    envDescription: '脟evre de臒i艧kenleri 枚zel bilgileri ve kimlik bilgilerini saklamak i莽in kullan谋labilir. Yaln谋zca okunabilirler ve d谋艧a aktar谋m s谋ras谋nda DSL dosyas谋ndan ayr谋labilirler.',
+    envPanelButton: 'De臒i艧ken Ekle',
+    modal: {
+      title: '脟evre De臒i艧keni Ekle',
+      editTitle: '脟evre De臒i艧kenini D眉zenle',
+      type: 'T眉r',
+      name: 'Ad',
+      namePlaceholder: 'env ad谋',
+      value: 'De臒er',
+      valuePlaceholder: 'env de臒eri',
+      secretTip: 'Hassas bilgileri veya verileri tan谋mlamak i莽in kullan谋l谋r, bilgi s谋z谋nt谋s谋n谋 枚nlemek i莽in DSL ayarlar谋 yap谋land谋r谋lm谋艧t谋r.',
+    },
+    export: {
+      title: 'Gizli 莽evre de臒i艧kenleri d谋艧a aktar谋ls谋n m谋?',
+      checkbox: 'Gizli de臒erleri d谋艧a aktar',
+      ignore: 'DSL\'yi d谋艧a aktar',
+      export: 'Gizli de臒erlerle DSL\'yi d谋艧a aktar',
+    },
+  },
+  chatVariable: {
+    panelTitle: 'Konu艧ma De臒i艧kenleri',
+    panelDescription: 'Konu艧ma De臒i艧kenleri, LLM\'nin hat谋rlamas谋 gereken interaktif bilgileri (konu艧ma ge莽mi艧i, y眉klenen dosyalar, kullan谋c谋 tercihleri dahil) depolamak i莽in kullan谋l谋r. Bunlar okunabilir ve yaz谋labilirdir.',
+    docLink: 'Daha fazla bilgi i莽in belgelerimizi ziyaret edin.',
+    button: 'De臒i艧ken Ekle',
+    modal: {
+      title: 'Konu艧ma De臒i艧keni Ekle',
+      editTitle: 'Konu艧ma De臒i艧kenini D眉zenle',
+      name: '陌sim',
+      namePlaceholder: 'De臒i艧ken ad谋',
+      type: 'T眉r',
+      value: 'Varsay谋lan De臒er',
+      valuePlaceholder: 'Varsay谋lan de臒er, ayarlanmamas谋 i莽in bo艧 b谋rak谋n',
+      description: 'A莽谋klama',
+      descriptionPlaceholder: 'De臒i艧keni a莽谋klay谋n',
+      editInJSON: 'JSON olarak d眉zenle',
+      oneByOne: 'Teker teker ekle',
+      editInForm: 'Formda d眉zenle',
+      arrayValue: 'De臒er',
+      addArrayValue: 'De臒er Ekle',
+      objectKey: 'Anahtar',
+      objectType: 'T眉r',
+      objectValue: 'Varsay谋lan De臒er',
+    },
+    storedContent: 'Depolanan i莽erik',
+    updatedAt: 'G眉ncellenme zaman谋: ',
+  },
+  changeHistory: {
+    title: 'De臒i艧iklik Ge莽mi艧i',
+    placeholder: 'Hen眉z hi莽bir 艧ey de臒i艧tirmediniz',
+    clearHistory: 'Ge莽mi艧i Temizle',
+    hint: '陌pucu',
+    hintText: 'D眉zenleme i艧lemleriniz, bu oturum s眉resince cihaz谋n谋zda saklanan bir de臒i艧iklik ge莽mi艧inde izlenir. Bu tarih莽esi d眉zenleyiciden 莽谋kt谋臒谋n谋zda temizlenir.',
+    stepBackward_one: '{{count}} ad谋m geri',
+    stepBackward_other: '{{count}} ad谋m geri',
+    stepForward_one: '{{count}} ad谋m ileri',
+    stepForward_other: '{{count}} ad谋m ileri',
+    sessionStart: 'Oturum Ba艧lad谋',
+    currentState: 'Ge莽erli Durum',
+    nodeTitleChange: 'Blok ba艧l谋臒谋 de臒i艧tirildi',
+    nodeDescriptionChange: 'Blok a莽谋klamas谋 de臒i艧tirildi',
+    nodeDragStop: 'Blok ta艧谋nd谋',
+    nodeChange: 'Blok de臒i艧tirildi',
+    nodeConnect: 'Blok ba臒land谋',
+    nodePaste: 'Blok yap谋艧t谋r谋ld谋',
+    nodeDelete: 'Blok silindi',
+    nodeAdd: 'Blok eklendi',
+    nodeResize: 'Blok yeniden boyutland谋r谋ld谋',
+    noteAdd: 'Not eklendi',
+    noteChange: 'Not de臒i艧tirildi',
+    noteDelete: 'Not silindi',
+    edgeDelete: 'Blok ba臒lant谋s谋 kesildi',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} gereklidir',
+    authRequired: 'Yetkilendirme gereklidir',
+    invalidJson: '{{field}} ge莽ersiz JSON',
+    fields: {
+      variable: 'De臒i艧ken Ad谋',
+      variableValue: 'De臒i艧ken De臒eri',
+      code: 'Kod',
+      model: 'Model',
+      rerankModel: 'Yeniden S谋ralama Modeli',
+      visionVariable: 'Vizyon De臒i艧keni',
+    },
+    invalidVariable: 'Ge莽ersiz de臒i艧ken',
+    rerankModelRequired: 'Yeniden S谋ralama Modelini a莽madan 枚nce, l眉tfen ayarlarda modelin ba艧ar谋yla yap谋land谋r谋ld谋臒谋n谋 onaylay谋n.',
+    toolParameterRequired: '{{field}}: [{{param}}] parametresi gereklidir',
+    noValidTool: '{{field}} ge莽erli bir ara莽 se莽ilmedi',
+  },
+  singleRun: {
+    testRun: 'Test 脟al谋艧t谋rma',
+    startRun: '脟al谋艧t谋rmay谋 Ba艧lat',
+    running: '脟al谋艧谋yor',
+    testRunIteration: 'Test 脟al谋艧t谋rma Yineleme',
+    back: 'Geri',
+    iteration: 'Yineleme',
+    loop: 'D枚ng眉',
+  },
+  tabs: {
+    'searchBlock': 'Blok ara',
+    'blocks': 'Bloklar',
+    'tools': 'Ara莽lar',
+    'allTool': 'Hepsi',
+    'builtInTool': 'Yerle艧ik',
+    'customTool': '脰zel',
+    'workflowTool': 'Workflow',
+    'question-understand': 'Soruyu Anlama',
+    'logic': 'Mant谋k',
+    'transform': 'D枚n眉艧t眉r',
+    'utilities': 'Yard谋mc谋 Ara莽lar',
+    'noResult': 'E艧le艧en bulunamad谋',
+    'searchTool': 'Arama arac谋',
+    'agent': 'Temsilci Stratejisi',
+    'plugin': 'Eklenti',
+  },
+  blocks: {
+    'start': 'Ba艧lat',
+    'end': 'Son',
+    'answer': 'Yan谋t',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'Bilgi Geri Al谋m谋',
+    'question-classifier': 'Soru S谋n谋fland谋r谋c谋',
+    'if-else': 'IF/ELSE',
+    'code': 'Kod',
+    'template-transform': '艦ablon',
+    'http-request': 'HTTP 陌ste臒i',
+    'variable-assigner': 'De臒i艧ken Ata',
+    'variable-aggregator': 'De臒i艧ken Toplay谋c谋',
+    'assigner': 'De臒i艧ken Atay谋c谋',
+    'iteration-start': 'Yineleme Ba艧lat',
+    'iteration': 'Yineleme',
+    'parameter-extractor': 'Parametre 脟谋kar谋c谋',
+    'list-operator': 'Liste 陌艧leci',
+    'document-extractor': 'Dok眉man 脟谋kar谋c谋',
+    'agent': 'Arac谋',
+    'loop-start': 'D枚ng眉 Ba艧lang谋c谋',
+    'loop-end': 'D枚ng眉den 脟谋k',
+    'loop': 'D枚ng眉',
+  },
+  blocksAbout: {
+    'start': 'Bir i艧 ak谋艧谋n谋 ba艧latmak i莽in ba艧lang谋莽 parametrelerini tan谋mlay谋n',
+    'end': 'Bir i艧 ak谋艧谋n谋n sonunu ve sonu莽 t眉r眉n眉 tan谋mlay谋n',
+    'answer': 'Bir sohbet konu艧mas谋n谋n yan谋t i莽eri臒ini tan谋mlay谋n',
+    'llm': 'B眉y眉k dil modellerini sorular谋 yan谋tlamak veya do臒al dili i艧lemek i莽in 莽a臒谋r谋n',
+    'knowledge-retrieval': 'Kullan谋c谋 sorular谋yla ilgili metin i莽eri臒ini Bilgi\'den sorgulaman谋za olanak tan谋r',
+    'question-classifier': 'Kullan谋c谋 sorular谋n谋n s谋n谋fland谋rma ko艧ullar谋n谋 tan谋mlay谋n, LLM s谋n谋fland谋rma a莽谋klamas谋na dayal谋 olarak konu艧man谋n nas谋l ilerleyece臒ini tan谋mlayabilir',
+    'if-else': '陌艧 ak谋艧谋n谋 if/else ko艧ullar谋na g枚re iki dala ay谋rman谋z谋 sa臒lar',
+    'code': '脰zel mant谋臒谋 uygulamak i莽in bir Python veya NodeJS kod par莽as谋 y眉r眉t眉n',
+    'template-transform': 'Jinja 艧ablon s枚zdizimini kullanarak verileri stringe d枚n眉艧t眉r眉n',
+    'http-request': 'HTTP protokol眉 眉zerinden sunucu isteklerinin g枚nderilmesine izin verin',
+    'variable-assigner': '脟oklu dal de臒i艧kenlerini tek bir de臒i艧kende toplay谋n ve sonraki d眉臒眉mler i莽in birle艧ik bir yap谋land谋rma sa臒lay谋n.',
+    'assigner': 'De臒i艧ken atama d眉臒眉m眉, yaz谋labilir de臒i艧kenlere (konu艧ma de臒i艧kenleri gibi) de臒er atamak i莽in kullan谋l谋r.',
+    'variable-aggregator': '脟oklu dal de臒i艧kenlerini tek bir de臒i艧kende toplay谋n ve sonraki d眉臒眉mler i莽in birle艧ik bir yap谋land谋rma sa臒lay谋n.',
+    'iteration': 'Bir liste nesnesinde birden fazla ad谋m ger莽ekle艧tirir ve t眉m sonu莽lar 莽谋kana kadar devam eder.',
+    'parameter-extractor': 'Arac谋 莽a臒谋rmak veya HTTP istekleri i莽in do臒al dilden yap谋land谋r谋lm谋艧 parametreler 莽谋karmak i莽in LLM kullan谋n.',
+    'document-extractor': 'Y眉klenen belgeleri LLM taraf谋ndan kolayca anla艧谋labilen metin i莽eri臒ine ayr谋艧t谋rmak i莽in kullan谋l谋r.',
+    'list-operator': 'Dizi i莽eri臒ini filtrelemek veya s谋ralamak i莽in kullan谋l谋r.',
+    'agent': 'Sorular谋 yan谋tlamak veya do臒al dili i艧lemek i莽in b眉y眉k dil modellerini 莽a臒谋rma',
+    'loop': 'Sonland谋rma ko艧ulu kar艧谋lanana kadar veya maksimum d枚ng眉 say谋s谋na ula艧谋lana kadar bir mant谋k d枚ng眉s眉 莽al谋艧t谋r谋n.',
+    'loop-end': '"break" ile e艧de臒erdir. Bu d眉臒眉m眉n yap谋land谋rma 枚臒esi yoktur. D枚ng眉 g枚vdesi bu d眉臒眉me ula艧t谋臒谋nda, d枚ng眉 sona erer.',
+  },
+  operator: {
+    zoomIn: 'Yak谋nla艧t谋r',
+    zoomOut: 'Uzakla艧t谋r',
+    zoomTo50: '%50 Yak谋nla艧t谋r',
+    zoomTo100: '%100 Yak谋nla艧t谋r',
+    zoomToFit: 'S谋臒d谋racak 艦ekilde Yak谋nla艧t谋r',
+  },
+  panel: {
+    userInputField: 'Kullan谋c谋 Giri艧 Alan谋',
+    changeBlock: 'Blok De臒i艧tir',
+    helpLink: 'Yard谋m Linki',
+    about: 'Hakk谋nda',
+    createdBy: 'Olu艧turan: ',
+    nextStep: 'Sonraki Ad谋m',
+    addNextStep: 'Bu i艧 ak谋艧谋nda sonraki blo臒u ekleyin',
+    selectNextStep: 'Sonraki Blo臒u Se莽',
+    runThisStep: 'Bu ad谋m谋 莽al谋艧t谋r',
+    checklist: 'Kontrol Listesi',
+    checklistTip: 'Yay谋nlamadan 枚nce t眉m sorunlar谋n 莽枚z眉ld眉臒眉nden emin olun',
+    checklistResolved: 'T眉m sorunlar 莽枚z眉ld眉',
+    organizeBlocks: 'Bloklar谋 D眉zenle',
+    change: 'De臒i艧tir',
+    optional: '(iste臒e ba臒l谋)',
+  },
+  nodes: {
+    common: {
+      outputVars: '脟谋kt谋 De臒i艧kenleri',
+      insertVarTip: 'De臒i艧ken Ekle',
+      memory: {
+        memory: 'Bellek',
+        memoryTip: 'Sohbet belle臒i ayarlar谋',
+        windowSize: 'Pencere Boyutu',
+        conversationRoleName: 'Konu艧ma Rol Ad谋',
+        user: 'Kullan谋c谋 枚n eki',
+        assistant: 'Asistan 枚n eki',
+      },
+      memories: {
+        title: 'Bellekler',
+        tip: 'Sohbet belle臒i',
+        builtIn: 'Yerle艧ik',
+      },
+      errorHandle: {
+        none: {
+          title: 'Hi莽 kimse',
+          desc: 'Bir 枚zel durum olu艧ursa ve i艧lenmezse d眉臒眉m 莽al谋艧may谋 durdurur',
+        },
+        defaultValue: {
+          title: 'Varsay谋lan De臒er',
+          desc: 'Bir hata olu艧tu臒unda, statik bir 莽谋k谋艧 i莽eri臒i belirtin.',
+          tip: 'Hata durumunda, de臒erin alt谋na d枚necektir.',
+          inLog: 'D眉臒眉m istisnas谋, varsay谋lan de臒erlere g枚re 莽谋kt谋.',
+          output: '脟谋kt谋 Varsay谋lan De臒eri',
+        },
+        failBranch: {
+          title: 'Ba艧ar谋s谋z Dal',
+          desc: 'Bir hata olu艧tu臒unda, 枚zel durum dal谋n谋 y眉r眉t眉r',
+          customize: 'Ba艧ar谋s谋z dal mant谋臒谋n谋 枚zelle艧tirmek i莽in tuvale gidin.',
+          inLog: 'D眉臒眉m 枚zel durumu, ba艧ar谋s谋z dal谋 otomatik olarak y眉r眉t眉r. D眉臒眉m 莽谋k谋艧谋 bir hata t眉r眉 ve hata mesaj谋 d枚nd眉r眉r ve bunlar谋 a艧a臒谋 ak谋艧a iletir.',
+          customizeTip: 'Ba艧ar谋s谋z dal etkinle艧tirildi臒inde, d眉臒眉mler taraf谋ndan olu艧turulan 枚zel durumlar i艧lemi sonland谋rmaz. Bunun yerine, 枚nceden tan谋mlanm谋艧 hata dal谋n谋 otomatik olarak y眉r眉terek hata mesajlar谋, raporlar, d眉zeltmeler veya atlama eylemleri sa臒laman谋za olanak tan谋r.',
+        },
+        partialSucceeded: {
+          tip: '陌艧lemde anormal 艧ekilde 莽al谋艧an {{num}} d眉臒眉mleri var, l眉tfen g眉nl眉kleri kontrol etmek i莽in izlemeye gidin.',
+        },
+        title: 'Hata 陌艧leme',
+        tip: 'Bir d眉臒眉m bir 枚zel durumla kar艧谋la艧t谋臒谋nda tetiklenen 枚zel durum i艧leme stratejisi.',
+      },
+      retry: {
+        retry: 'Yeni -den deneme',
+        retryOnFailure: 'Hata durumunda yeniden dene',
+        maxRetries: 'En fazla yeniden deneme',
+        times: 'kere',
+        retries: '{{say谋}} Yeni -den deneme',
+        retryFailed: 'Yeniden deneme ba艧ar谋s谋z oldu',
+        retryInterval: 'Yeniden deneme aral谋臒谋',
+        retryTimes: 'Hata durumunda {{times}} kez yeniden deneyin',
+        retryFailedTimes: '{{times}} yeniden denemeleri ba艧ar谋s谋z oldu',
+        retrySuccessful: 'Yeniden deneme ba艧ar谋l谋',
+        retrying: 'Yeniden deneniyor...',
+        ms: 'Ms',
+      },
+    },
+    start: {
+      required: 'gerekli',
+      inputField: 'Giri艧 Alan谋',
+      builtInVar: 'Yerle艧ik De臒i艧kenler',
+      outputVars: {
+        query: 'Kullan谋c谋 giri艧i',
+        memories: {
+          des: 'Konu艧ma ge莽mi艧i',
+          type: 'mesaj t眉r眉',
+          content: 'mesaj i莽eri臒i',
+        },
+        files: 'Dosya listesi',
+      },
+      noVarTip: '陌艧 Ak谋艧谋nda kullan谋labilecek giri艧leri ayarlay谋n',
+    },
+    end: {
+      outputs: '脟谋kt谋lar',
+      output: {
+        type: '莽谋kt谋 t眉r眉',
+        variable: '莽谋kt谋 de臒i艧keni',
+      },
+      type: {
+        'none': 'Yok',
+        'plain-text': 'D眉z Metin',
+        'structured': 'Yap谋land谋r谋lm谋艧',
+      },
+    },
+    answer: {
+      answer: 'Yan谋t',
+      outputVars: '脟谋kt谋 De臒i艧kenleri',
+    },
+    llm: {
+      model: 'model',
+      variables: 'de臒i艧kenler',
+      context: 'ba臒lam',
+      contextTooltip: 'Ba臒lam olarak Bilgi ekleyebilirsiniz',
+      notSetContextInPromptTip: 'Ba臒lam 枚zelli臒ini etkinle艧tirmek i莽in l眉tfen PROMPT i莽inde ba臒lam de臒i艧kenini doldurun.',
+      prompt: 'prompt',
+      roleDescription: {
+        system: 'Konu艧ma i莽in 眉st d眉zey talimatlar verin',
+        user: 'Modele talimatlar, sorgular veya herhangi bir metin tabanl谋 giri艧 sa臒lay谋n',
+        assistant: 'Modelin kullan谋c谋 mesajlar谋na g枚re verdi臒i yan谋tlar',
+      },
+      addMessage: 'Mesaj Ekle',
+      vision: 'g枚rsel',
+      files: 'Dosyalar',
+      resolution: {
+        name: '脟枚z眉n眉rl眉k',
+        high: 'Y眉ksek',
+        low: 'D眉艧眉k',
+      },
+      outputVars: {
+        output: '陌莽erik 脺ret',
+        usage: 'Model Kullan谋m Bilgileri',
+      },
+      singleRun: {
+        variable: 'De臒i艧ken',
+      },
+      sysQueryInUser: 'sys.query kullan谋c谋 mesaj谋nda gereklidir',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: 'L眉tfen 艧emay谋 kaydetmeden 枚nce mevcut alan谋 d眉zenlemeyi tamamlay谋n.',
+        },
+        apply: 'Uygula',
+        addField: 'Alan Ekle',
+        descriptionPlaceholder: 'A莽谋klama ekleyin',
+        title: 'Yap谋land谋r谋lm谋艧 脟谋kt谋 艦emas谋',
+        generate: 'Olu艧tur',
+        fieldNamePlaceholder: 'Alan Ad谋',
+        doc: 'Yap谋land谋r谋lm谋艧 莽谋kt谋 hakk谋nda daha fazla bilgi edinin',
+        instruction: 'Talimat',
+        promptTooltip: 'Metin tan谋m谋n谋 standart bir JSON 艦emas谋 yap谋s谋na d枚n眉艧t眉r.',
+        import: 'JSON\'den i莽e aktar',
+        back: 'Geri',
+        promptPlaceholder: 'JSON 艦eman谋z谋 tan谋mlay谋n...',
+        required: 'gerekli',
+        generatedResult: '脺retilen Sonu莽',
+        regenerate: 'Yeniden 眉ret',
+        generateJsonSchema: 'JSON 艦emas谋 Olu艧tur',
+        stringValidations: 'Dize Do臒rulamalar谋',
+        showAdvancedOptions: 'Geli艧mi艧 se莽enekleri g枚ster',
+        resetDefaults: 'S谋f谋rlama',
+        generating: 'JSON 艦emas谋 Olu艧turuluyor...',
+        generationTip: 'Do臒al dil kullanarak h谋zl谋ca bir JSON 艦emas谋 olu艧turabilirsiniz.',
+        addChildField: '脟ocuk Alan谋 Ekle',
+        resultTip: '陌艧te olu艧turulan sonu莽. E臒er memnun de臒ilseniz, geri d枚n眉p isteminizi de臒i艧tirebilirsiniz.',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'Sorgu De臒i艧keni',
+      knowledge: 'Bilgi',
+      outputVars: {
+        output: 'Geri al谋nm谋艧 par莽a verisi',
+        content: 'Par莽a i莽eri臒i',
+        title: 'Par莽a ba艧l谋臒谋',
+        icon: 'Par莽a simgesi',
+        url: 'Par莽a URL\'si',
+        metadata: 'Di臒er meta veriler',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            title: 'Devre d谋艧谋 b谋rak谋ld谋.',
+            subTitle: 'Meta veri filtreleme 枚zelli臒ini devre d谋艧谋 b谋rakma',
+          },
+          automatic: {
+            title: 'Otomatik',
+            desc: 'Sorgu De臒i艧kenine dayal谋 olarak otomatik olarak meta veri filtreleme ko艧ullar谋 olu艧turun',
+            subTitle: 'Kullan谋c谋 sorgusuna dayal谋 olarak otomatik olarak meta veri filtreleme ko艧ullar谋 olu艧turun.',
+          },
+          manual: {
+            subTitle: 'Manuel olarak meta veri filtreleme ko艧ullar谋 ekleyin',
+            title: 'K谋lavuz',
+          },
+        },
+        panel: {
+          add: 'Ko艧ul Ekle',
+          select: 'De臒i艧keni se莽...',
+          title: 'Meta Verisi Filtre Ko艧ullar谋',
+          search: 'Arama meta verileri',
+          conditions: 'Ko艧ullar',
+          placeholder: 'De臒er girin',
+          datePlaceholder: 'Bir zaman se莽in...',
+        },
+        title: 'Meta Verileri Filtreleme',
+      },
+    },
+    http: {
+      inputVars: 'Giri艧 De臒i艧kenleri',
+      api: 'API',
+      apiPlaceholder: 'URL girin, de臒i艧ken eklemek i莽in 鈥�/鈥� tu艧una bas谋n',
+      notStartWithHttp: 'API http:// veya https:// ile ba艧lamal谋d谋r',
+      key: 'Anahtar',
+      value: 'De臒er',
+      bulkEdit: 'Toplu D眉zenleme',
+      keyValueEdit: 'Anahtar-De臒er D眉zenleme',
+      headers: 'Ba艧l谋klar',
+      params: 'Parametreler',
+      body: 'G枚vde',
+      outputVars: {
+        body: 'Yan谋t 陌莽eri臒i',
+        statusCode: 'Yan谋t Durum Kodu',
+        headers: 'Yan谋t Ba艧l谋k Listesi JSON',
+        files: 'Dosya Listesi',
+      },
+      authorization: {
+        'authorization': 'Yetkilendirme',
+        'authorizationType': 'Yetkilendirme T眉r眉',
+        'no-auth': 'Yok',
+        'api-key': 'API Anahtar谋',
+        'authType': 'Yetki T眉r眉',
+        'basic': 'Temel',
+        'bearer': 'Bearer',
+        'custom': '脰zel',
+        'api-key-title': 'API Anahtar谋',
+        'header': 'Ba艧l谋k',
+        'auth-type': 'Kimlik Do臒rulama T眉r眉',
+      },
+      insertVarPlaceholder: 'de臒i艧keni eklemek i莽in \'/\' yaz谋n',
+      timeout: {
+        title: 'Zaman A艧谋m谋',
+        connectLabel: 'Ba臒lant谋 Zaman A艧谋m谋',
+        connectPlaceholder: 'Ba臒lant谋 zaman a艧谋m谋n谋 saniye cinsinden girin',
+        readLabel: 'Okuma Zaman A艧谋m谋',
+        readPlaceholder: 'Okuma zaman a艧谋m谋n谋 saniye cinsinden girin',
+        writeLabel: 'Yazma Zaman A艧谋m谋',
+        writePlaceholder: 'Yazma zaman a艧谋m谋n谋 saniye cinsinden girin',
+      },
+      type: 'T眉r',
+      binaryFileVariable: '陌kili Dosya De臒i艧keni',
+      extractListPlaceholder: 'Liste 枚臒esi dizinini girin, \'/\' yaz谋n de臒i艧ken ekle',
+      curl: {
+        placeholder: 'cURL dizesini buraya yap谋艧t谋r谋n',
+        title: 'cURL\'den i莽e aktar',
+      },
+    },
+    code: {
+      inputVars: 'Giri艧 De臒i艧kenleri',
+      outputVars: '脟谋kt谋 De臒i艧kenleri',
+      advancedDependencies: 'Geli艧mi艧 Ba臒谋ml谋l谋klar',
+      advancedDependenciesTip: 'Burada daha uzun s眉rede t眉ketilen veya varsay谋lan olarak yerle艧ik olmayan baz谋 枚n y眉klenmi艧 ba臒谋ml谋l谋klar谋 ekleyin',
+      searchDependencies: 'Ba臒谋ml谋l谋klar谋 Ara',
+    },
+    templateTransform: {
+      inputVars: 'Giri艧 De臒i艧kenleri',
+      code: 'Kod',
+      codeSupportTip: 'Sadece Jinja2 destekler',
+      outputVars: {
+        output: 'D枚n眉艧t眉r眉lm眉艧 i莽erik',
+      },
+    },
+    ifElse: {
+      if: 'E臒er',
+      else: 'De臒ilse',
+      elseDescription: 'E臒er ko艧ulu kar艧谋lanmad谋臒谋nda hangi mant谋臒谋n 莽al谋艧t谋r谋lmas谋 gerekti臒ini tan谋mlamak i莽in kullan谋l谋r.',
+      and: 've',
+      or: 'veya',
+      operator: 'Operat枚r',
+      notSetVariable: 'L眉tfen 枚nce de臒i艧ken ayarlay谋n',
+      comparisonOperator: {
+        'contains': 'i莽erir',
+        'not contains': 'i莽ermez',
+        'start with': 'ile ba艧lar',
+        'end with': 'ile biter',
+        'is': 'e艧ittir',
+        'is not': 'e艧it de臒ildir',
+        'empty': 'bo艧',
+        'not empty': 'bo艧 de臒il',
+        'null': 'null',
+        'not null': 'null de臒il',
+        'regex match': 'normal ifade ma莽谋',
+        'in': 'i莽inde',
+        'not exists': 'mevcut de臒il',
+        'all of': 'T眉m眉',
+        'not in': '陌莽inde de臒il',
+        'exists': 'Var',
+        'before': '枚nce',
+        'after': 'sonra',
+      },
+      enterValue: 'De臒er girin',
+      addCondition: 'Ko艧ul Ekle',
+      conditionNotSetup: 'Ko艧ul AYARLANMADI',
+      selectVariable: 'De臒i艧ken se莽in...',
+      optionName: {
+        localUpload: 'Yerel Y眉kleme',
+        video: 'Video',
+        audio: 'Ses',
+        url: 'URL',
+        image: 'Resim',
+        doc: 'Doktor',
+      },
+      addSubVariable: 'Alt De臒i艧ken',
+      select: 'Se莽mek',
+      condition: 'Ko艧ul',
+    },
+    variableAssigner: {
+      title: 'De臒i艧ken ata',
+      outputType: '脟谋kt谋 T眉r眉',
+      varNotSet: 'De臒i艧ken ayarlanmad谋',
+      noVarTip: 'Atanacak de臒i艧kenleri ekleyin',
+      type: {
+        string: 'Metin',
+        number: 'Say谋',
+        object: 'Nesne',
+        array: 'Dizi',
+      },
+      aggregationGroup: 'Toplama Grubu',
+      aggregationGroupTip: 'Bu 枚zelli臒i etkinle艧tirmek, de臒i艧ken toplay谋c谋n谋n birden fazla de臒i艧ken setini toplamas谋na olanak tan谋r.',
+      addGroup: 'Grup Ekle',
+      outputVars: {
+        varDescribe: '{{groupName}} 莽谋kt谋s谋',
+      },
+      setAssignVariable: 'Atama de臒i艧kenini ayarla',
+    },
+    assigner: {
+      'assignedVariable': 'Atanan De臒i艧ken',
+      'writeMode': 'Yazma Modu',
+      'writeModeTip': 'ATANAN DE臑陌艦KEN bir dizi oldu臒unda, ekleme modu sona ekler.',
+      'over-write': '脺zerine Yaz',
+      'append': 'Ekle',
+      'plus': 'Art谋',
+      'clear': 'Temizle',
+      'setVariable': 'De臒i艧ken Ayarla',
+      'variable': 'De臒i艧ken',
+      'operations': {
+        'extend': 'Uzatmak',
+        'overwrite': '脺zerine',
+        'over-write': '脺zerine',
+        'title': '陌艧lem',
+        '+=': '+=',
+        'clear': 'Berrak',
+        'append': 'Ekleme',
+        '/=': '/=',
+        '-=': '-=',
+        '*=': '*=',
+        'set': 'Ayarlamak',
+        'remove-last': 'Sonuncuyu Kald谋r',
+        'remove-first': '陌lkini kald谋r',
+      },
+      'variables': 'De臒i艧ken',
+      'selectAssignedVariable': 'Atanan de臒i艧keni se莽in...',
+      'setParameter': 'Parametreyi ayarla...',
+      'varNotSet': 'De臒i艧ken NOT Set',
+      'assignedVarsDescription': 'Atanan de臒i艧kenler, konu艧ma de臒i艧kenleri gibi yaz谋labilir de臒i艧kenler olmal谋d谋r.',
+      'noVarTip': 'De臒i艧ken eklemek i莽in "+" d眉臒mesini t谋klay谋n',
+      'noAssignedVars': 'Kullan谋labilir atanm谋艧 de臒i艧ken yok',
+    },
+    tool: {
+      toAuthorize: 'Yetkilendirmek i莽in',
+      inputVars: 'Giri艧 De臒i艧kenleri',
+      outputVars: {
+        text: 'ara莽 taraf谋ndan olu艧turulan i莽erik',
+        files: {
+          title: 'ara莽 taraf谋ndan olu艧turulan dosyalar',
+          type: 'Desteklenen t眉r. 艦u anda sadece resim destekleniyor',
+          transfer_method: 'Transfer y枚ntemi. De臒er remote_url veya local_file olabilir',
+          url: 'Resim URL\'si',
+          upload_file_id: 'Y眉klenen dosya kimli臒i',
+        },
+        json: 'ara莽 taraf谋ndan olu艧turulan json',
+      },
+    },
+    questionClassifiers: {
+      model: 'model',
+      inputVars: 'Giri艧 De臒i艧kenleri',
+      outputVars: {
+        className: 'S谋n谋f Ad谋',
+      },
+      class: 'S谋n谋f',
+      classNamePlaceholder: 'S谋n谋f ad谋n谋z谋 yaz谋n',
+      advancedSetting: 'Geli艧mi艧 Ayarlar',
+      topicName: 'Konu Ad谋',
+      topicPlaceholder: 'Konu ad谋n谋z谋 yaz谋n',
+      addClass: 'S谋n谋f Ekle',
+      instruction: 'Talimat',
+      instructionTip: 'Soru s谋n谋fland谋r谋c谋n谋n sorular谋 nas谋l kategorize edece臒ini daha iyi anlamas谋na yard谋mc谋 olmak i莽in ek talimatlar girin.',
+      instructionPlaceholder: 'Talimat谋n谋z谋 yaz谋n',
+    },
+    parameterExtractor: {
+      inputVar: 'Giri艧 De臒i艧keni',
+      extractParameters: 'Parametreleri 脟谋kar',
+      importFromTool: 'Ara莽lardan i莽e aktar',
+      addExtractParameter: '脟谋karma Parametresi Ekle',
+      addExtractParameterContent: {
+        name: 'Ad',
+        namePlaceholder: '脟谋karma Parametresi Ad谋',
+        type: 'T眉r',
+        typePlaceholder: '脟谋karma Parametresi T眉r眉',
+        description: 'A莽谋klama',
+        descriptionPlaceholder: '脟谋karma Parametresi A莽谋klamas谋',
+        required: 'Gerekli',
+        requiredContent: 'Gerekli sadece model 莽谋kar谋m谋 i莽in referans olarak kullan谋l谋r ve parametre 莽谋kt谋s谋n谋n zorunlu do臒rulamas谋 i莽in kullan谋lmaz.',
+      },
+      extractParametersNotSet: '脟谋karma Parametreleri ayarlanmad谋',
+      instruction: 'Talimat',
+      instructionTip: 'Parametre 莽谋kar谋c谋n谋n parametreleri nas谋l 莽谋karaca臒谋n谋 anlamas谋na yard谋mc谋 olmak i莽in ek talimatlar girin.',
+      advancedSetting: 'Geli艧mi艧 Ayarlar',
+      reasoningMode: 'Ak谋l Y眉r眉tme Modu',
+      reasoningModeTip: 'Modelin fonksiyon 莽a臒谋rma veya istemler i莽in talimatlara yan谋t verme yetene臒ine ba臒l谋 olarak uygun ak谋l y眉r眉tme modunu se莽ebilirsiniz.',
+      isSuccess: 'Ba艧ar谋l谋 m谋. Ba艧ar谋l谋 oldu臒unda de臒er 1, ba艧ar谋s谋z oldu臒unda de臒er 0\'d谋r.',
+      errorReason: 'Hata Nedeni',
+    },
+    iteration: {
+      deleteTitle: 'Yineleme D眉臒眉m眉n眉 Sil?',
+      deleteDesc: 'Yineleme d眉臒眉m眉n眉 silmek t眉m alt d眉臒眉mleri silecektir',
+      input: 'Giri艧',
+      output: '脟谋k谋艧 De臒i艧kenleri',
+      iteration_one: '{{count}} Yineleme',
+      iteration_other: '{{count}} Yineleme',
+      currentIteration: 'Mevcut Yineleme',
+      ErrorMethod: {
+        operationTerminated: 'Sonland谋r谋ld谋',
+        continueOnError: 'Hata 脺zerine Devam Et',
+        removeAbnormalOutput: 'anormal 莽谋kt谋y谋 kald谋r',
+      },
+      parallelModeUpper: 'PARALEL MOD',
+      parallelMode: 'Paralel Mod',
+      MaxParallelismTitle: 'Maksimum paralellik',
+      error_one: '{{say谋}} Hata',
+      errorResponseMethod: 'Hata yan谋t谋 y枚ntemi',
+      comma: ',',
+      parallelModeEnableTitle: 'Paralel Mod Etkin',
+      error_other: '{{say谋}} Hata',
+      parallelPanelDesc: 'Paralel modda, yinelemedeki g枚revler paralel y眉r眉tmeyi destekler.',
+      answerNodeWarningDesc: 'Paralel mod uyar谋s谋: Yinelemeler i莽indeki yan谋t d眉臒眉mleri, konu艧ma de臒i艧keni atamalar谋 ve kal谋c谋 okuma/yazma i艧lemleri 枚zel durumlara neden olabilir.',
+      parallelModeEnableDesc: 'Paralel modda, yinelemeler i莽indeki g枚revler paralel y眉r眉tmeyi destekler. Bunu sa臒daki 枚zellikler panelinde yap谋land谋rabilirsiniz.',
+      MaxParallelismDesc: 'Maksimum paralellik, tek bir yinelemede ayn谋 anda y眉r眉t眉len g枚revlerin say谋s谋n谋 kontrol etmek i莽in kullan谋l谋r.',
+    },
+    note: {
+      addNote: 'Not Ekle',
+      editor: {
+        placeholder: 'Notunuzu yaz谋n...',
+        small: 'K眉莽眉k',
+        medium: 'Orta',
+        large: 'B眉y眉k',
+        bold: 'Kal谋n',
+        italic: '陌talik',
+        strikethrough: '脺st眉 脟izili',
+        link: 'Ba臒lant谋',
+        openLink: 'A莽',
+        unlink: 'Ba臒lant谋y谋 Kald谋r',
+        enterUrl: 'URL girin...',
+        invalidUrl: 'Ge莽ersiz URL',
+        bulletList: 'Madde 陌艧aretli Liste',
+        showAuthor: 'Yazar谋 G枚ster',
+      },
+    },
+    docExtractor: {
+      outputVars: {
+        text: 'Ay谋klanan metin',
+      },
+      learnMore: 'Daha fazla bilgi edinin',
+      inputVar: 'Giri艧 De臒i艧keni',
+      supportFileTypes: 'Destek dosya t眉rleri: {{types}}.',
+    },
+    listFilter: {
+      outputVars: {
+        result: 'Filtre sonucu',
+        first_record: '陌lk kay谋t',
+        last_record: 'Son kay谋t',
+      },
+      filterConditionComparisonOperator: 'Filtre Ko艧ulu Kar艧谋la艧t谋rma 陌艧leci',
+      filterCondition: 'Filtre Ko艧ulu',
+      limit: '陌lk N',
+      asc: 'ASC',
+      inputVar: 'Giri艧 De臒i艧keni',
+      filterConditionKey: 'Filtre Ko艧ulu Anahtar谋',
+      orderBy: 'S谋ralama 枚l莽眉t眉',
+      filterConditionComparisonValue: 'Filtre Ko艧ulu de臒eri',
+      selectVariableKeyPlaceholder: 'Alt de臒i艧ken anahtar谋n谋 se莽in',
+      desc: 'DESC',
+      extractsCondition: 'N 枚臒esini ay谋klay谋n',
+    },
+    agent: {
+      strategy: {
+        searchPlaceholder: 'Arama arac谋s谋 stratejisi',
+        selectTip: 'Ajan stratejisi se莽in',
+        label: 'Ajan Stratejisi',
+        configureTip: 'L眉tfen ajan stratejisini yap谋land谋r谋n.',
+        configureTipDesc: 'Arac谋 stratejiyi yap谋land谋rd谋ktan sonra, bu d眉臒眉m kalan yap谋land谋rmalar谋 otomatik olarak y眉kleyecektir. Strateji, 莽ok ad谋ml谋 ara莽 ak谋l y眉r眉tme mekanizmas谋n谋 etkileyecektir.',
+        shortLabel: 'Strateji',
+        tooltip: 'Farkl谋 Agentic stratejileri, sistemin 莽ok ad谋ml谋 ara莽 莽a臒r谋lar谋n谋 nas谋l planlad谋臒谋n谋 ve y眉r眉tt眉臒眉n眉 belirler',
+      },
+      pluginInstaller: {
+        install: 'Y眉klemek',
+        installing: 'Y眉kleme',
+      },
+      modelNotInMarketplace: {
+        desc: 'Bu model Yerel veya GitHub deposundan y眉klenir. L眉tfen kurulumdan sonra kullan谋n.',
+        title: 'Model y眉kl眉 de臒il',
+        manageInPlugins: 'Eklentilerde Y枚net',
+      },
+      modelNotSupport: {
+        descForVersionSwitch: 'Y眉klenen eklenti s眉r眉m眉 bu modeli sa臒lamaz. S眉r眉m眉 de臒i艧tirmek i莽in t谋klay谋n.',
+        title: 'Desteklenmeyen Model',
+        desc: 'Y眉klenen eklenti s眉r眉m眉 bu modeli sa臒lamaz.',
+      },
+      modelSelectorTooltips: {
+        deprecated: 'Bu model kullan谋m d谋艧谋d谋r',
+      },
+      outputVars: {
+        files: {
+          upload_file_id: 'Dosya kimli臒ini kar艧谋ya y眉kle',
+          type: 'Destek t眉r眉. 艦imdi sadece g枚r眉nt眉y眉 destekleyin',
+          transfer_method: 'Transfer y枚ntemi. De臒er remote_url veya local_file',
+          title: 'Arac谋 Taraf谋ndan Olu艧turulan Dosyalar',
+          url: 'Resim url\'si',
+        },
+        text: 'Temsilci Taraf谋ndan Olu艧turulan 陌莽erik',
+        json: 'Arac谋 taraf谋ndan olu艧turulan JSON',
+      },
+      checkList: {
+        strategyNotSelected: 'Strateji se莽ilmedi',
+      },
+      installPlugin: {
+        changelog: 'De臒i艧iklik g眉nl眉臒眉',
+        cancel: '陌ptal',
+        install: 'Y眉klemek',
+        title: 'Eklentiyi Y眉kle',
+        desc: 'A艧a臒谋daki eklentiyi y眉klemek 眉zere',
+      },
+      configureModel: 'Modeli Yap谋land谋r',
+      toolNotInstallTooltip: '{{tool}} y眉kl眉 de臒il',
+      unsupportedStrategy: 'Desteklenmeyen strateji',
+      notAuthorized: 'Yetkili De臒il',
+      tools: 'Ara莽lar谋',
+      strategyNotFoundDesc: 'Y眉klenen eklenti s眉r眉m眉 bu stratejiyi sa臒lamaz.',
+      strategyNotSet: 'Ajan stratejisi Belirlenmedi',
+      pluginNotFoundDesc: 'Bu eklenti GitHub\'dan y眉klenmi艧tir. L眉tfen 艧uraya gidin: Eklentiler yeniden y眉klemek i莽in',
+      strategyNotFoundDescAndSwitchVersion: 'Y眉klenen eklenti s眉r眉m眉 bu stratejiyi sa臒lamaz. S眉r眉m眉 de臒i艧tirmek i莽in t谋klay谋n.',
+      pluginNotInstalledDesc: 'Bu eklenti GitHub\'dan y眉klenmi艧tir. L眉tfen 艧uraya gidin: Eklentiler yeniden y眉klemek i莽in',
+      learnMore: 'Daha fazla bilgi edinin',
+      linkToPlugin: 'Eklentilere Ba臒lant谋',
+      modelNotInstallTooltip: 'Bu model y眉kl眉 de臒il',
+      toolbox: 'Ara莽',
+      modelNotSelected: 'Model se莽ilmedi',
+      pluginNotInstalled: 'Bu eklenti y眉kl眉 de臒il',
+      maxIterations: 'Maksimum Yineleme',
+      strategyNotInstallTooltip: '{{strateji}} y眉kl眉 de臒il',
+      toolNotAuthorizedTooltip: '{{ara莽}} Yetkili De臒il',
+      model: 'model',
+    },
+    loop: {
+      ErrorMethod: {
+        operationTerminated: 'Sonland谋r谋ld谋',
+        removeAbnormalOutput: 'Anormal 脟谋kt谋y谋 Kald谋r',
+        continueOnError: 'Hata ile Devam Et',
+      },
+      loopNode: 'D枚ng眉 D眉臒眉m眉',
+      output: '脟谋kt谋 De臒i艧keni',
+      exitConditionTip: 'Bir d枚ng眉 d眉臒眉m眉n眉n en az bir 莽谋k谋艧 ko艧uluna ihtiyac谋 vard谋r.',
+      inputMode: 'Giri艧 Modu',
+      setLoopVariables: 'D枚ng眉 kapsam谋 i莽inde de臒i艧kenleri ayarla',
+      loopMaxCount: 'Maksimum D枚ng眉 Say谋s谋',
+      input: 'Girdi',
+      breakCondition: 'D枚ng眉 Sonland谋rma Ko艧ulu',
+      comma: ',',
+      finalLoopVariables: 'Son D枚ng眉 De臒i艧kenleri',
+      initialLoopVariables: '陌lk D枚ng眉 De臒i艧kenleri',
+      errorResponseMethod: 'Hata Yan谋t Y枚ntemi',
+      deleteTitle: 'D枚ng眉 D眉臒眉m眉n眉 Sil?',
+      totalLoopCount: 'Toplam d枚ng眉 say谋s谋: {{count}}',
+      currentLoop: 'Mevcut D枚ng眉',
+      loopMaxCountError: 'L眉tfen 1 ile {{maxCount}} aras谋nda ge莽erli bir maksimum d枚ng眉 say谋s谋 girin.',
+      variableName: 'De臒i艧ken Ad谋',
+      deleteDesc: 'D枚ng眉 d眉臒眉m眉n眉 silmek, t眉m alt d眉臒眉mleri kald谋racakt谋r.',
+      breakConditionTip: 'Sadece sonland谋rma ko艧ullar谋 olan d枚ng眉ler i莽indeki de臒i艧kenler ve konu艧ma de臒i艧kenleri referans al谋nabilir.',
+      loop_other: '{{count}} D枚ng眉',
+      currentLoopCount: 'Mevcut d枚ng眉 say谋s谋: {{count}}',
+      error_one: '{{count}} Hata',
+      error_other: '{{count}} Hata',
+      loop_one: '{{count}} D枚ng眉',
+      loopVariables: 'D枚ng眉 De臒i艧kenleri',
+    },
+  },
+  tracing: {
+    stopBy: '{{user}} taraf谋ndan durduruldu',
+  },
+  variableReference: {
+    assignedVarsDescription: 'Atanan de臒i艧kenler, 枚rne臒in yaz谋labilir de臒i艧kenler olmal谋d谋r',
+    noAvailableVars: 'Kullan谋labilir de臒i艧ken yok',
+    conversationVars: 'Konu艧ma de臒i艧kenleri',
+    noVarsForOperation: 'Se莽ilen i艧lemle atanabilecek de臒i艧ken yok.',
+    noAssignedVars: 'Kullan谋labilir atanm谋艧 de臒i艧ken yok',
+  },
+  versionHistory: {
+    filter: {
+      reset: 'Filtreyi S谋f谋rla',
+      onlyYours: 'Sadece senin',
+      empty: 'E艧le艧en bir s眉r眉m ge莽mi艧i bulunamad谋.',
+      all: 'Her 艧ey',
+      onlyShowNamedVersions: 'Sadece adland谋r谋lm谋艧 s眉r眉mleri g枚ster',
+    },
+    editField: {
+      releaseNotesLengthLimit: 'S眉r眉m notlar谋 {{limit}} karakteri ge莽emez',
+      titleLengthLimit: 'Ba艧l谋k {{limit}} karakteri ge莽emez.',
+      title: 'Ba艧l谋k',
+      releaseNotes: 'S眉r眉m Notlar谋',
+    },
+    action: {
+      restoreSuccess: 'S眉r眉m geri y眉klendi',
+      deleteFailure: 'Versiyonu silme i艧lemi ba艧ar谋s谋z oldu',
+      restoreFailure: 'S眉r眉m眉 geri y眉klemekte ba艧ar谋s谋z olundu',
+      updateFailure: 'S眉r眉m g眉ncellenemedi',
+      updateSuccess: 'S眉r眉m g眉ncellendi',
+      deleteSuccess: 'S眉r眉m silindi',
+    },
+    latest: 'Sonuncu',
+    currentDraft: 'Mevcut Taslak',
+    restorationTip: 'S眉r眉m geri y眉klemeden sonra, mevcut taslak 眉zerine yaz谋lacak.',
+    title: 'S眉r眉mler',
+    defaultName: 'Ba艧l谋ks谋z Versiyon',
+    editVersionInfo: 'S眉r眉m bilgilerini d眉zenle',
+    releaseNotesPlaceholder: 'De臒i艧en 艧eyleri tan谋mlay谋n',
+    nameThisVersion: 'Bu versiyona isim ver',
+    deletionTip: 'Silme i艧lemi geri al谋namaz, l眉tfen onaylay谋n.',
+  },
+}
+
+export default translation
diff --git a/i18n/uk-UA/app-annotation.ts b/i18n/uk-UA/app-annotation.ts
new file mode 100644
index 0000000..d34be76
--- /dev/null
+++ b/i18n/uk-UA/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: '袗薪芯褌邪褑褨褩',
+  name: '袙褨写锌芯胁褨写褜 薪邪 邪薪芯褌邪褑褨褞',
+  editBy: '袙褨写锌芯胁褨写褜 胁褨写褉械写邪谐芯胁邪薪邪 {{author}}',
+  noData: {
+    title: '袧械屑邪褦 邪薪芯褌邪褑褨泄',
+    description: '袙懈 屑芯卸械褌械 褉械写邪谐褍胁邪褌懈 邪薪芯褌邪褑褨褩 锌褨写 褔邪褋 薪邪谢邪谐芯写卸械薪薪褟 锌褉芯谐褉邪屑懈 邪斜芯 褨屑锌芯褉褌褍胁邪褌懈 邪薪芯褌邪褑褨褩 谐褍褉褌芯屑 褌褍褌 写谢褟 芯褌褉懈屑邪薪薪褟 胁懈褋芯泻芯褟泻褨褋薪芯褩 胁褨写锌芯胁褨写褨.',
+  },
+  table: {
+    header: {
+      question: '蟹邪锌懈褌邪薪薪褟',
+      answer: '胁褨写锌芯胁褨写褜',
+      createdAt: '褋褌胁芯褉械薪芯 褍',
+      hits: '锌械褉械谐谢褟写褨胁',
+      actions: '写褨褩',
+      addAnnotation: '袛芯写邪褌懈 邪薪芯褌邪褑褨褞',
+      bulkImport: '袦邪褋芯胁懈泄 褨屑锌芯褉褌',
+      bulkExport: '袦邪褋芯胁懈泄 械泻褋锌芯褉褌',
+      clearAll: '袨褔懈褋褌懈褌懈 胁褋褨 邪薪芯褌邪褑褨褩',
+    },
+  },
+  editModal: {
+    title: '袪械写邪谐褍胁邪褌懈 胁褨写锌芯胁褨写褜 薪邪 邪薪芯褌邪褑褨褞',
+    queryName: '袟邪锌懈褌 泻芯褉懈褋褌褍胁邪褔邪',
+    answerName: '袘芯褌-芯锌芯胁褨写邪褔',
+    yourAnswer: '袙邪褕邪 胁褨写锌芯胁褨写褜',
+    answerPlaceholder: '袙胁械写褨褌褜 褋胁芯褞 胁褨写锌芯胁褨写褜 褌褍褌',
+    yourQuery: '袙邪褕 蟹邪锌懈褌',
+    queryPlaceholder: '袙胁械写褨褌褜 褋胁褨泄 蟹邪锌懈褌 褌褍褌',
+    removeThisCache: '袙懈写邪谢懈褌懈 褑褞 邪薪芯褌邪褑褨褞',
+    createdAt: '小褌胁芯褉械薪芯 褍',
+  },
+  addModal: {
+    title: '袛芯写邪褌懈 胁褨写锌芯胁褨写褜 薪邪 邪薪芯褌邪褑褨褞',
+    queryName: '袟邪锌懈褌邪薪薪褟',
+    answerName: '袙褨写锌芯胁褨写褜',
+    answerPlaceholder: '袙胁械写褨褌褜 胁褨写锌芯胁褨写褜 褌褍褌',
+    queryPlaceholder: '袙胁械写褨褌褜 蟹邪锌懈褌 褌褍褌',
+    createNext: '袛芯写邪褌懈 褖械 芯写薪褍 邪薪芯褌芯胁邪薪褍 胁褨写锌芯胁褨写褜',
+  },
+  batchModal: {
+    title: '袦邪褋芯胁懈泄 褨屑锌芯褉褌',
+    csvUploadTitle: '袩械褉械褌褟谐薪褨褌褜 褎邪泄谢 CSV 褋褞写懈 邪斜芯',
+    browse: '芯谐谢褟写',
+    tip: '肖邪泄谢 CSV 锌芯胁懈薪械薪 胁褨写锌芯胁褨写邪褌懈 褌邪泻褨泄 褋褌褉褍泻褌褍褉褨:',
+    question: '蟹邪锌懈褌邪薪薪褟',
+    answer: '胁褨写锌芯胁褨写褜',
+    contentTitle: '胁屑褨褋褌 褔邪褋褌懈薪懈',
+    content: '胁屑褨褋褌',
+    template: '袟邪胁邪薪褌邪卸褌械 褕邪斜谢芯薪 褌褍褌',
+    cancel: '小泻邪褋褍胁邪褌懈',
+    run: '袟邪锌褍褋褌懈褌懈 锌邪褉褌褨褞',
+    runError: '袧械 胁写邪谢芯褋褟 蟹邪锌褍褋褌懈褌懈 锌邪褉褌褨褞',
+    processing: '校 锌邪泻械褌薪褨泄 芯斜褉芯斜褑褨',
+    completed: '袉屑锌芯褉褌 蟹邪胁械褉褕械薪芯',
+    error: '袩芯屑懈谢泻邪 褨屑锌芯褉褌褍',
+    ok: '袨袣',
+  },
+  errorMessage: {
+    answerRequired: '袙褨写锌芯胁褨写褜 芯斜芯胁鈥櫻徯沸盒拘残�',
+    queryRequired: '袟邪锌懈褌邪薪薪褟 芯斜芯胁鈥櫻徯沸盒拘残�',
+  },
+  viewModal: {
+    annotatedResponse: '袙褨写锌芯胁褨写褜 薪邪 邪薪芯褌邪褑褨褞',
+    hitHistory: '袉褋褌芯褉褨褟 锌械褉械谐谢褟写褨胁',
+    hit: '袩械褉械谐谢褟写',
+    hits: '袩械褉械谐谢褟写褨胁',
+    noHitHistory: '袉褋褌芯褉褨褩 锌械褉械谐谢褟写褨胁 薪械屑邪褦',
+  },
+  hitHistoryTable: {
+    query: '袟邪锌懈褌',
+    match: '袟斜褨谐',
+    response: '袙褨写锌芯胁褨写褜',
+    source: '袛卸械褉械谢芯',
+    score: '袘邪谢',
+    time: '效邪褋',
+  },
+  initSetup: {
+    title: '袩芯褔邪褌泻芯胁邪 薪邪褋褌褉芯泄泻邪 胁褨写锌芯胁褨写褨 薪邪 邪薪芯褌邪褑褨褞',
+    configTitle: '袧邪谢邪褕褌褍胁邪薪薪褟 胁褨写锌芯胁褨写褨 薪邪 邪薪芯褌邪褑褨褞',
+    confirmBtn: '袟斜械褉械谐褌懈 褌邪 胁胁褨屑泻薪褍褌懈',
+    configConfirmBtn: '袟斜械褉械谐褌懈',
+  },
+  embeddingModelSwitchTip: '袦芯写械谢褜 胁械泻褌芯褉懈蟹邪褑褨褩 褌械泻褋褌褍 邪薪芯褌邪褑褨褩, 锌械褉械屑懈泻邪薪薪褟 屑芯写械谢械泄 斜褍写械 锌芯胁褌芯褉薪芯 胁斜褍写芯胁邪薪芯, 褖芯 锌褉懈蟹胁械写械 写芯 写芯写邪褌泻芯胁懈褏 胁懈褌褉邪褌.',
+}
+
+export default translation
diff --git a/i18n/uk-UA/app-api.ts b/i18n/uk-UA/app-api.ts
new file mode 100644
index 0000000..76cb410
--- /dev/null
+++ b/i18n/uk-UA/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'API 褋械褉胁械褉',
+  apiKey: '袣谢褞褔 API',
+  status: '小褌邪褌褍褋',
+  disabled: '袙懈屑泻薪械薪芯',
+  ok: '袩褉邪褑褞褦',
+  copy: '袣芯锌褨褞胁邪褌懈',
+  copied: '小泻芯锌褨泄芯胁邪薪芯',
+  play: '袙褨写褌胁芯褉懈褌懈',
+  pause: '袩邪褍蟹邪',
+  playing: '袙褨写褌胁芯褉械薪薪褟',
+  merMaid: {
+    rerender: '袩芯胁褌芯褉懈褌懈 褉械薪写械褉',
+  },
+  never: '袧褨泻芯谢懈',
+  apiKeyModal: {
+    apiSecretKey: '小械泻褉械褌薪懈泄 泻谢褞褔 API',
+    apiSecretKeyTips: '些芯斜 蟹邪锌芯斜褨谐褌懈 蟹谢芯胁卸懈胁邪薪薪褟屑 API, 蟹邪褏懈褋褌褨褌褜 褋胁褨泄 泻谢褞褔 API. 校薪懈泻邪泄褌械 泄芯谐芯 胁懈泻芯褉懈褋褌邪薪薪褟 褟泻 蟹胁懈褔邪泄薪芯谐芯 褌械泻褋褌褍 褍  front-end 泻芯写褨. :)',
+    createNewSecretKey: '小褌胁芯褉懈褌懈 薪芯胁懈泄 褋械泻褉械褌薪懈泄 泻谢褞褔',
+    secretKey: '小械泻褉械褌薪懈泄 泻谢褞褔',
+    created: '小孝袙袨袪袝袧袨',
+    lastUsed: '袨小孝袗袧袧袆 袙袠袣袨袪袠小孝袗袧袧携',
+    generateTips: '袟斜械褉褨谐邪泄褌械 褑械泄 泻谢褞褔 褍 斜械蟹锌械褔薪芯屑褍 褌邪 写芯褋褌褍锌薪芯屑褍 屑褨褋褑褨.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: '袙懈写邪谢懈褌懈 褑械泄 褋械泻褉械褌薪懈泄 泻谢褞褔?',
+    deleteConfirmTips: '笑褞 写褨褞 薪械 屑芯卸薪邪 褋泻邪褋褍胁邪褌懈.',
+    ok: '袚邪褉邪蟹写',
+  },
+  chatMode: {
+    title: 'API 褔邪褌-写芯写邪褌泻褍',
+    info: '袛谢褟 褍薪褨胁械褉褋邪谢褜薪懈褏 褔邪褌-斜芯褌褨胁, 褖芯 胁懈泻芯褉懈褋褌芯胁褍褞褌褜 褎芯褉屑邪褌 蟹邪锌懈褌邪薪薪褟-胁褨写锌芯胁褨写褨, 胁懈泻谢懈褔褌械 API chat-messages, 褖芯斜 褉芯蟹锌芯褔邪褌懈 写褨邪谢芯谐. 袩褨写褌褉懈屑褍泄褌械 斜械蟹锌械褉械褉胁薪褨 褉芯蟹屑芯胁懈, 锌械褉械写邪褞褔懈 conversation_id, 褖芯 锌芯胁械褉褌邪褦褌褜褋褟. 袩邪褉邪屑械褌褉懈 胁褨写锌芯胁褨写械泄 褨 褕邪斜谢芯薪懈 蟹邪谢械卸邪褌褜 胁褨写 薪邪谢邪褕褌褍胁邪薪褜 Dify Prompt.',
+    createChatApi: '小褌胁芯褉懈褌懈 锌芯胁褨写芯屑谢械薪薪褟 褔邪褌褍',
+    createChatApiTip: '小褌胁芯褉褨褌褜 薪芯胁械 锌芯胁褨写芯屑谢械薪薪褟 褉芯蟹屑芯胁懈 邪斜芯 锌褉芯写芯胁卸褌械 褨褋薪褍褞褔懈泄 写褨邪谢芯谐.',
+    inputsTips: '(袧械芯斜芯胁鈥櫻徯沸盒拘残�) 袧邪写邪泄褌械 锌芯谢褟 胁胁械写械薪薪褟 泻芯褉懈褋褌褍胁邪褔邪 褟泻 锌邪褉懈 泻谢褞褔-蟹薪邪褔械薪薪褟, 褟泻褨 胁褨写锌芯胁褨写邪褞褌褜 蟹屑褨薪薪懈屑 褍 Prompt. 袣谢褞褔 鈥� 褑械 褨屑鈥櫻� 蟹屑褨薪薪芯褩, 袟薪邪褔械薪薪褟 鈥� 褑械 蟹薪邪褔械薪薪褟 锌邪褉邪屑械褌褉邪. 携泻褖芯 褌懈锌 锌芯谢褟 Select, 薪邪写褨褋谢邪薪械 蟹薪邪褔械薪薪褟 屑邪褦 斜褍褌懈 芯写薪懈屑 褨蟹 胁褋褌邪薪芯胁谢械薪懈褏 锌邪褉邪屑械褌褉褨胁.',
+    queryTips: '袙屑褨褋褌 胁胁械写械薪薪褟/蟹邪锌懈褌邪薪薪褟 泻芯褉懈褋褌褍胁邪褔邪',
+    blocking: '孝懈锌 斜谢芯泻褍胁邪薪薪褟, 芯褔褨泻褍胁邪薪薪褟 蟹邪胁械褉褕械薪薪褟 胁懈泻芯薪邪薪薪褟 褌邪 锌芯胁械褉薪械薪薪褟 褉械蟹褍谢褜褌邪褌褨胁. (袟邪锌懈褌懈 屑芯卸褍褌褜 斜褍褌懈 锌械褉械褉胁邪薪褨, 褟泻褖芯 锌褉芯褑械褋 褌褉懈胁邪谢懈泄)',
+    streaming: '锌芯胁械褉薪械薪薪褟 锌芯褌芯泻芯胁芯谐芯 锌械褉械写邪胁邪薪薪褟. 袪械邪谢褨蟹邪褑褨褟 锌芯胁械褉薪械薪薪褟 锌芯褌芯泻芯胁芯谐芯 锌械褉械写邪胁邪薪薪褟 薪邪 芯褋薪芯胁褨 SSE (Server-Sent Events).',
+    conversationIdTip: '(袨锌褑褨芯薪邪谢褜薪芯) 袉写械薪褌懈褎褨泻邪褌芯褉 褉芯蟹屑芯胁懈: 蟹邪谢懈褕褌械 锌芯褉芯卸薪褨屑 写谢褟 锌械褉褕芯褩 褉芯蟹屑芯胁懈; 锌械褉械写邪泄褌械 conversation_id 蟹 泻芯薪褌械泻褋褌褍, 褖芯斜 锌褉芯写芯胁卸懈褌懈 写褨邪谢芯谐.',
+    messageFeedbackApi: '肖褨写斜械泻 褨蟹 锌芯胁褨写芯屑谢械薪薪褟屑懈 褋械邪薪褋褍 泻芯褉懈褋褌褍胁邪褔邪, 薪邪锌褉懈泻谢邪写',
+    messageFeedbackApiTip: '袨褑褨薪褞泄褌械 芯褌褉懈屑邪薪褨 锌芯胁褨写芯屑谢械薪薪褟 胁褨写 褨屑械薪褨 泻褨薪褑械胁懈褏 泻芯褉懈褋褌褍胁邪褔褨胁 蟹邪 写芯锌芯屑芯谐芯褞 谢邪泄泻褨胁 邪斜芯 写懈蟹谢邪泄泻褨胁. 笑褨 写邪薪褨 胁褨写芯斜褉邪卸邪褞褌褜褋褟 薪邪 褋褌芯褉褨薪褑褨 "袞褍褉薪邪谢懈 褌邪 邪薪芯褌邪褑褨褩" 褌邪 胁懈泻芯褉懈褋褌芯胁褍褞褌褜褋褟 写谢褟 屑邪泄斜褍褌薪褜芯谐芯 褌芯褔薪芯谐芯 薪邪谢邪褕褌褍胁邪薪薪褟 屑芯写械谢褨.',
+    messageIDTip: '袉写械薪褌懈褎褨泻邪褌芯褉 锌芯胁褨写芯屑谢械薪薪褟',
+    ratingTip: '锌芯写芯斜邪褦褌褜褋褟 褔懈 薪械 锌芯写芯斜邪褦褌褜褋褟, null 鈥� 褋泻邪褋褍胁邪褌懈',
+    chatMsgHistoryApi: '袨褌褉懈屑邪褌懈 锌芯胁褨写芯屑谢械薪薪褟 蟹 褨褋褌芯褉褨褩 褔邪褌褍',
+    chatMsgHistoryApiTip: '袩械褉褕邪 褋褌芯褉褨薪泻邪 锌芯胁械褉褌邪褦 芯褋褌邪薪薪褨泄 `芯斜屑械卸械薪懈泄` 褉褟写芯泻, 褟泻懈泄 蟹薪邪褏芯写懈褌褜褋褟 褍 蟹胁芯褉芯褌薪芯屑褍 锌芯褉褟写泻褍',
+    chatMsgHistoryConversationIdTip: '袉写械薪褌懈褎褨泻邪褌芯褉 褉芯蟹屑芯胁懈',
+    chatMsgHistoryFirstId: '袉写械薪褌懈褎褨泻邪褌芯褉 锌械褉褕芯谐芯 蟹邪锌懈褋褍 褔邪褌褍 薪邪 锌芯褌芯褔薪褨泄 褋褌芯褉褨薪褑褨. 孝懈锌芯胁懈屑 褦 胁褨写褋褍褌薪褨褋褌褜.',
+    chatMsgHistoryLimit: '小泻褨谢褜泻懈 褔邪褌褨胁 锌芯胁械褉褌邪褦褌褜褋褟 胁 芯写薪芯屑褍 蟹邪锌懈褌褨',
+    conversationsListApi: '袨褌褉懈屑邪褌懈 褋锌懈褋芯泻 褉芯蟹屑芯胁',
+    conversationsListApiTip: '袨褌褉懈屑褍褦 褋锌懈褋芯泻 褋械邪薪褋褨胁 锌芯褌芯褔薪芯谐芯 泻芯褉懈褋褌褍胁邪褔邪. 袟邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑 锌芯胁械褉褌邪褞褌褜褋褟 芯褋褌邪薪薪褨 20 褋械邪薪褋褨胁.',
+    conversationsListFirstIdTip: '袉写械薪褌懈褎褨泻邪褌芯褉 芯褋褌邪薪薪褜芯谐芯 蟹邪锌懈褋褍 薪邪 锌芯褌芯褔薪褨泄 褋褌芯褉褨薪褑褨, 蟹薪邪褔械薪薪褟 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑 胁褨写褋褍褌薪褦.',
+    conversationsListLimitTip: '小泻褨谢褜泻懈 褔邪褌褨胁 锌芯胁械褉褌邪褦褌褜褋褟 胁 芯写薪芯屑褍 蟹邪锌懈褌褨',
+    conversationRenamingApi: '袩械褉械泄屑械薪褍胁邪薪薪褟 褉芯蟹屑芯胁懈',
+    conversationRenamingApiTip: '袩械褉械泄屑械薪褍泄褌械 褉芯蟹屑芯胁懈; 褨屑鈥櫻� 胁褨写芯斜褉邪卸邪褦褌褜褋褟 胁 褨薪褌械褉褎械泄褋邪褏 泻谢褨褦薪褌褨胁 褨蟹 泻褨谢褜泻芯屑邪 褋械邪薪褋邪屑懈.',
+    conversationRenamingNameTip: '袧芯胁械 褨屑鈥櫻�',
+    parametersApi: '袨褌褉懈屑邪薪薪褟 褨薪褎芯褉屑邪褑褨褩 锌褉芯 锌邪褉邪屑械褌褉懈 锌褉芯谐褉邪屑懈',
+    parametersApiTip: '袨褌褉懈屑邪褌懈 薪邪谢邪褕褌芯胁邪薪褨 胁褏褨写薪褨 锌邪褉邪屑械褌褉懈, 胁泻谢褞褔邪褞褔懈 褨屑械薪邪 蟹屑褨薪薪懈褏, 褨屑械薪邪 锌芯谢褨胁, 褌懈锌懈 褌邪 蟹薪邪褔械薪薪褟 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑. 袟邪蟹胁懈褔邪泄 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 胁褨写芯斜褉邪卸械薪薪褟 褑懈褏 锌芯谢褨胁 褍 褎芯褉屑褨 邪斜芯 蟹邪锌芯胁薪械薪薪褟 蟹薪邪褔械薪褜 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑 锌褨褋谢褟 蟹邪胁邪薪褌邪卸械薪薪褟 泻谢褨褦薪褌邪.',
+  },
+  develop: {
+    requestBody: '孝褨谢芯 蟹邪锌懈褌褍',
+    pathParams: '袩邪褉邪屑械褌褉懈 褕谢褟褏褍',
+    query: '袟邪锌懈褌',
+    toc: '袙屑褨褋褌',
+  },
+  completionMode: {
+    messageIDTip: '袉写械薪褌懈褎褨泻邪褌芯褉 锌芯胁褨写芯屑谢械薪薪褟',
+    streaming: '袩芯褌芯泻芯胁械 锌械褉械写邪胁邪薪薪褟 锌芯胁械褉褌邪褦褌褜褋褟. 袪械邪谢褨蟹邪褑褨褟 锌芯胁械褉薪械薪薪褟 锌芯褌芯泻芯胁芯谐芯 屑芯胁谢械薪薪褟 薪邪 芯褋薪芯胁褨 SSE (Server-Sent Events).',
+    blocking: '孝懈锌 斜谢芯泻褍胁邪薪薪褟, 芯褔褨泻褍胁邪薪薪褟 蟹邪胁械褉褕械薪薪褟 胁懈泻芯薪邪薪薪褟 褌邪 锌芯胁械褉薪械薪薪褟 褉械蟹褍谢褜褌邪褌褨胁. (袟邪锌懈褌懈 屑芯卸褍褌褜 斜褍褌懈 锌械褉械褉胁邪薪褨, 褟泻褖芯 锌褉芯褑械褋 褌褉懈胁邪谢懈泄)',
+    title: 'API 锌褉芯谐褉邪屑懈 写谢褟 蟹邪胁械褉褕械薪薪褟',
+    ratingTip: '袩芯写芯斜邪褦褌褜褋褟 褔懈 薪械 锌芯写芯斜邪褦褌褜褋褟, null 鈥� 褑械 褋泻邪褋褍胁邪褌懈',
+    createCompletionApiTip: '小褌胁芯褉褨褌褜 锌芯胁褨写芯屑谢械薪薪褟 锌褉芯 蟹邪胁械褉褕械薪薪褟, 褖芯斜 锌褨写褌褉懈屑褍胁邪褌懈 褉械卸懈屑 蟹邪锌懈褌邪薪褜 褨 胁褨写锌芯胁褨写械泄.',
+    parametersApi: '袨褌褉懈屑邪薪薪褟 褨薪褎芯褉屑邪褑褨褩 锌褉芯 锌邪褉邪屑械褌褉懈 锌褉芯谐褉邪屑懈',
+    queryTips: '孝械泻褋褌芯胁懈泄 泻芯薪褌械薪褌, 褖芯 胁胁芯写懈褌褜褋褟 泻芯褉懈褋褌褍胁邪褔械屑.',
+    createCompletionApi: '小褌胁芯褉懈褌懈 锌芯胁褨写芯屑谢械薪薪褟 锌褉芯 蟹邪胁械褉褕械薪薪褟',
+    messageFeedbackApi: '袙褨写谐褍泻 褍 锌芯胁褨写芯屑谢械薪薪褨 (锌芯写芯斜邪褦褌褜褋褟)',
+    messageFeedbackApiTip: '袨褑褨薪褞泄褌械 芯褌褉懈屑邪薪褨 锌芯胁褨写芯屑谢械薪薪褟 胁褨写 褨屑械薪褨 泻褨薪褑械胁懈褏 泻芯褉懈褋褌褍胁邪褔褨胁 蟹 谢邪泄泻邪屑懈 邪斜芯 写懈蟹谢邪泄泻邪屑懈. 笑褨 写邪薪褨 胁褨写芯斜褉邪卸邪褞褌褜褋褟 薪邪 褋褌芯褉褨薪褑褨 芦袞褍褉薪邪谢懈 褌邪 邪薪芯褌邪褑褨褩禄 褌邪 胁懈泻芯褉懈褋褌芯胁褍褞褌褜褋褟 写谢褟 写芯芯锌褉邪褑褞胁邪薪薪褟 屑邪泄斜褍褌薪褜芯褩 屑芯写械谢褨.',
+    info: '袛谢褟 褋褌胁芯褉械薪薪褟 胁懈褋芯泻芯褟泻褨褋薪芯谐芯 褌械泻褋褌褍, 褌邪泻芯谐芯 褟泻 褋褌邪褌褌褨, 褉械蟹褞屑械 褌邪 锌械褉械泻谢邪写懈, 胁懈泻芯褉懈褋褌芯胁褍泄褌械 API 锌芯胁褨写芯屑谢械薪褜 锌褉芯 蟹邪胁械褉褕械薪薪褟 蟹 胁胁械写械薪薪褟屑 泻芯褉懈褋褌褍胁邪褔械屑. 袚械薪械褉邪褑褨褟 褌械泻褋褌褍 蟹邪谢械卸懈褌褜 胁褨写 锌邪褉邪屑械褌褉褨胁 屑芯写械谢褨 褌邪 褕邪斜谢芯薪褨胁 锌褨写泻邪蟹芯泻, 胁褋褌邪薪芯胁谢械薪懈褏 褍 Dify Prompt Engineering.',
+    inputsTips: '(袧械芯斜芯胁\'褟蟹泻芯胁芯.) 袧邪写邪泄褌械 锌芯谢褟 胁胁械写械薪薪褟 泻芯褉懈褋褌褍胁邪褔邪 褍 胁懈谐谢褟写褨 锌邪褉 泻谢褞褔-蟹薪邪褔械薪薪褟, 褖芯 胁褨写锌芯胁褨写邪褞褌褜 蟹屑褨薪薪懈屑 褍 Prompt Eng. Key 鈥� 褑械 褨屑\'褟 蟹屑褨薪薪芯褩, Value 鈥� 蟹薪邪褔械薪薪褟 锌邪褉邪屑械褌褉邪. 携泻褖芯 胁懈斜褉邪薪芯 褌懈锌 锌芯谢褟 袙懈斜褨褉, 薪邪写褨褋谢邪薪械 蟹薪邪褔械薪薪褟 屑邪褦 斜褍褌懈 芯写薪懈屑 褨蟹 锌芯锌械褉械写薪褜芯 胁褋褌邪薪芯胁谢械薪懈褏 胁邪褉褨邪薪褌褨胁.',
+    parametersApiTip: '袨褌褉懈屑邪薪薪褟 薪邪谢邪褕褌芯胁邪薪懈褏 胁褏褨写薪懈褏 锌邪褉邪屑械褌褉褨胁, 胁泻谢褞褔邪褞褔懈 褨屑械薪邪 蟹屑褨薪薪懈褏, 褨屑械薪邪 锌芯谢褨胁, 褌懈锌懈 褌邪 蟹薪邪褔械薪薪褟 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑. 袟邪蟹胁懈褔邪泄 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 胁褨写芯斜褉邪卸械薪薪褟 褑懈褏 锌芯谢褨胁 褍 褎芯褉屑褨 邪斜芯 蟹邪锌芯胁薪械薪薪褟 蟹薪邪褔械薪褜 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑 锌褨褋谢褟 蟹邪胁邪薪褌邪卸械薪薪褟 泻谢褨褦薪褌邪.',
+  },
+  loading: '袟邪胁邪薪褌邪卸械薪薪褟',
+  regenerate: '袙褨写薪芯胁懈褌懈',
+}
+
+export default translation
diff --git a/i18n/uk-UA/app-debug.ts b/i18n/uk-UA/app-debug.ts
new file mode 100644
index 0000000..1fc6981
--- /dev/null
+++ b/i18n/uk-UA/app-debug.ts
@@ -0,0 +1,418 @@
+const translation = {
+  pageTitle: {
+    line1: 'PROMPT',
+    line2: 'Engineering', // Or '褨薪卸械薪械褉褨褟'
+  },
+  orchestrate: '袛懈褉懈谐褍胁邪褌懈',
+  promptMode: {
+    simple: '袩械褉械泄褌懈 胁 械泻褋锌械褉褌薪懈泄 褉械卸懈屑, 褖芯斜 褉械写邪谐褍胁邪褌懈 胁械褋褜 蟹邪锌褉芯褋 PROMPT',
+    advanced: '袝泻褋锌械褉褌薪懈泄 褉械卸懈屑',
+    switchBack: '袟屑褨薪懈褌懈 薪邪谢邪褕褌褍胁邪薪薪褟',
+    advancedWarning: {
+      title: '袙懈 锌械褉械泄褕谢懈 胁 械泻褋锌械褉褌薪懈泄 褉械卸懈屑, 褨 锌褨褋谢褟 褌芯谐芯, 褟泻 胁懈 蟹屑褨薪懈褌械 PROMPT, 胁懈 袧袝 屑芯卸械褌械 锌芯胁械褉薪褍褌懈褋褟 薪邪蟹邪写 胁 斜邪蟹芯胁懈泄 褉械卸懈屑.',
+      description: '袙 械泻褋锌械褉褌薪芯屑褍 褉械卸懈屑褨 胁懈 屑芯卸械褌械 褉械写邪谐褍胁邪褌懈 胁械褋褜 PROMPT.',
+      learnMore: '袛械褌邪谢褜薪褨褕械',
+      ok: '袚邪褉邪蟹写',
+    },
+    operation: {
+      addMessage: '袛芯写邪褌懈 锌芯胁褨写芯屑谢械薪薪褟',
+    },
+    contextMissing: '袣芯屑锌芯薪械薪褌 泻芯薪褌械泻褋褌褍 胁褨写褋褍褌薪褨泄, 械褎械泻褌懈胁薪褨褋褌褜 锌褨写泻邪蟹泻懈 屑芯卸械 斜褍褌懈 薪械 薪邪泄泻褉邪褖芯褞.',
+  },
+  operation: {
+    applyConfig: '袨锌褍斜谢褨泻褍胁邪褌懈',
+    resetConfig: '小泻懈薪褍褌懈',
+    debugConfig: '袧邪谢邪谐芯写卸械薪薪褟',
+    addFeature: '袛芯写邪褌懈 褎褍薪泻褑褨芯薪邪谢',
+    automatic: '袗胁褌芯屑邪褌懈褔薪芯',
+    stopResponding: '袩褉懈锌懈薪懈褌懈 褉械邪谐褍胁邪褌懈',
+    agree: '谢邪泄泻',
+    disagree: '写懈蟹谢邪泄泻',
+    cancelAgree: '小泻邪褋褍胁邪褌懈 谢邪泄泻',
+    cancelDisagree: '小泻邪褋褍胁邪褌懈 写懈蟹谢邪泄泻',
+    userAction: '袣芯褉懈褋褌褍胁邪褔 ',
+  },
+  notSetAPIKey: {
+    title: '袣谢褞褔 锌褉芯胁邪泄写械褉邪 LLM 薪械 胁褋褌邪薪芯胁谢械薪芯',
+    trailFinished: '袛械屑芯 蟹邪泻褨薪褔懈谢芯褋褜',
+    description: '袣谢褞褔 锌褉芯胁邪泄写械褉邪 LLM 薪械 胁褋褌邪薪芯胁谢械薪芯, 褨 泄芯谐芯 锌芯褌褉褨斜薪芯 胁褋褌邪薪芯胁懈褌懈 锌械褉械写 薪邪谢邪谐芯写卸械薪薪褟屑.',
+    settingBtn: '袩械褉械泄褌懈 写芯 薪邪谢邪褕褌褍胁邪薪褜',
+  },
+  trailUseGPT4Info: {
+    title: '袩芯泻懈 薪械 锌褨写褌褉懈屑褍褦 gpt-4',
+    description: '些芯斜 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 gpt-4, 斜褍写褜 谢邪褋泻邪, 胁褋褌邪薪芯胁褨褌褜 泻谢褞褔 API.',
+  },
+  feature: {
+    groupChat: {
+      title: '袙写芯褋泻芯薪邪谢械薪薪褟 褔邪褌褍',
+      description: '袛芯写邪泄褌械 薪邪谢邪褕褌褍胁邪薪薪褟 锌芯锌械褉械写薪褜芯褩 褉芯蟹屑芯胁懈 写谢褟 写芯写邪褌泻褨胁, 褖芯斜 锌芯泻褉邪褖懈褌懈 泻芯褉懈褋褌褍胁邪褑褜泻懈泄 写芯褋胁褨写.',
+    },
+    groupExperience: {
+      title: '袩芯泻褉邪褖械薪薪褟 写芯褋胁褨写褍',
+    },
+    conversationOpener: {
+      title: '袉薪褨褑褨邪褌芯褉懈 褉芯蟹屑芯胁懈',
+      description: '校 褔邪褌-写芯写邪褌泻邪褏 锌械褉褕械 褉械褔械薪薪褟, 褟泻械 楔袉 邪泻褌懈胁薪芯 锌褉芯屑芯胁谢褟褦 泻芯褉懈褋褌褍胁邪褔械胁褨, 蟹邪蟹胁懈褔邪泄 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 褟泻 锌褉懈胁褨褌邪薪薪褟.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: '袧邪褋褌褍锌薪褨',
+      description: '袧邪谢邪褕褌褍胁邪薪薪褟 锌褉芯锌芯蟹懈褑褨泄 薪邪褋褌褍锌薪懈褏 蟹邪锌懈褌邪薪褜 屑芯卸械 薪邪写邪褌懈 泻芯褉懈褋褌褍胁邪褔邪屑 泻褉邪褖懈泄 褔邪褌.',
+      resDes: '3 锌褉芯锌芯蟹懈褑褨褩 写谢褟 薪邪褋褌褍锌薪芯谐芯 锌懈褌邪薪薪褟 泻芯褉懈褋褌褍胁邪褔邪.',
+      tryToAsk: '小锌褉芯斜褍泄褌械 褋锌懈褌邪褌懈',
+    },
+    moreLikeThis: {
+      title: '袘褨谢褜褕械 褌邪泻芯谐芯',
+      description: '袟谐械薪械褉褍胁邪褌懈 泻褨谢褜泻邪 褌械泻褋褌褨胁 芯写薪芯褔邪褋薪芯, 邪 锌芯褌褨屑 褉械写邪谐褍胁邪褌懈 褌邪 锌褉芯写芯胁卸懈褌懈 谐械薪械褉邪褑褨褞',
+      generateNumTip: '袣褨谢褜泻褨褋褌褜 泻芯卸薪芯褩 谐械薪械褉邪褑褨褩 ',
+      tip: '袙懈泻芯褉懈褋褌邪薪薪褟 褑褨褦褩 褎褍薪泻褑褨褩 锌褉懈蟹胁械写械 写芯 写芯写邪褌泻芯胁懈褏 胁懈褌褉邪褌 褌芯泻械薪褨胁',
+    },
+    speechToText: {
+      title: '袦芯胁谢械薪薪褟 胁 褌械泻褋褌',
+      description: '袩褨褋谢褟 褍胁褨屑泻薪械薪薪褟 胁懈 屑芯卸械褌械 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 谐芯谢芯褋芯胁懈泄 胁胁褨写.',
+      resDes: '袚芯谢芯褋芯胁懈泄 胁胁褨写 褍胁褨屑泻薪械薪芯',
+    },
+    textToSpeech: {
+      title: '孝械泻褋褌 褍 屑芯胁谢械薪薪褟',
+      description: '袩褨褋谢褟 褍胁褨屑泻薪械薪薪褟 褌械泻褋褌 屑芯卸械 斜褍褌懈 锌械褉械褌胁芯褉械薪懈泄 褍 屑芯胁谢械薪薪褟.',
+      resDes: '袩械褉械褌胁芯褉械薪薪褟 褌械泻褋褌褍 薪邪 邪褍写褨芯 胁泻谢褞褔械薪芯',
+    },
+    citation: {
+      title: '笑懈褌邪褌懈 褌邪 袗褌褉懈斜褍褑褨褩', // Citations and Attributions
+      description: '袩褨褋谢褟 邪泻褌懈胁邪褑褨褩 锌芯泻邪蟹褍胁邪褌懈 胁懈褏褨写薪懈泄 写芯泻褍屑械薪褌 褌邪 邪褌褉懈斜褍褌芯胁邪薪懈泄 褉芯蟹写褨谢 蟹谐械薪械褉芯胁邪薪芯谐芯 胁屑褨褋褌褍.',
+      resDes: '笑懈褌邪褌懈 褌邪 袗褌褉懈斜褍褑褨褩 邪泻褌懈胁芯胁邪薪芯',
+    },
+    annotation: {
+      title: '袙褨写锌芯胁褨写褜-袗薪芯褌邪褑褨褟', // Annotation Reply
+      description: '袙懈 屑芯卸械褌械 胁褉褍褔薪褍 写芯写邪褌懈 胁懈褋芯泻芯褟泻褨褋薪褍 胁褨写锌芯胁褨写褜 写芯 泻械褕褍 写谢褟 锌褉褨芯褉懈褌械褌薪芯谐芯 锌芯褉褨胁薪褟薪薪褟 蟹 锌芯写褨斜薪懈屑懈 蟹邪锌懈褌邪薪薪褟屑懈 泻芯褉懈褋褌褍胁邪褔褨胁.',
+      resDes: '袙褨写锌芯胁褨写褜-袗薪芯褌邪褑褨褟 褍胁褨屑泻薪械薪邪',
+      scoreThreshold: {
+        title: '袩芯褉褨谐 芯褑褨薪泻懈', // Score Threshold
+        description: '袙懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 胁褋褌邪薪芯胁谢械薪薪褟 锌芯褉芯谐褍 褋褏芯卸芯褋褌褨 写谢褟 胁褨写锌芯胁褨写褨-邪薪芯褌邪褑褨褩.',
+        easyMatch: '袥械谐泻械 褋锌褨胁锌邪写褨薪薪褟', // Easy Match
+        accurateMatch: '孝芯褔薪械 褋锌褨胁锌邪写褨薪薪褟', // Accurate Match
+      },
+      matchVariable: {
+        title: '袟斜褨谐 蟹屑褨薪薪懈褏', // Match Variable
+        choosePlaceholder: '袙懈斜械褉褨褌褜 蟹屑褨薪薪褍 胁褨写锌芯胁褨写薪芯褋褌褨', // Choose match variable
+      },
+      cacheManagement: '袗薪芯褌邪褑褨褩', // Annotations
+      cached: '袗薪芯褌芯胁邪薪芯', // Annotated
+      remove: '袙懈写邪谢懈褌懈', // Remove
+      removeConfirm: '袙懈写邪谢懈褌懈 褑褞 邪薪芯褌邪褑褨褞?',
+      add: '袛芯写邪褌懈 邪薪芯褌邪褑褨褞', // Add annotation
+      edit: '袪械写邪谐褍胁邪褌懈 邪薪芯褌邪褑褨褞', // Edit annotation
+    },
+    dataSet: {
+      title: '袣芯薪褌械泻褋褌', // Context
+      noData: '袙懈 屑芯卸械褌械 褨屑锌芯褉褌褍胁邪褌懈 蟹薪邪薪薪褟 褟泻 泻芯薪褌械泻褋褌', // You can import Knowledge as context
+      words: '小谢芯胁邪', // Words
+      textBlocks: '孝械泻褋褌芯胁褨 斜谢芯泻懈', // Text Blocks
+      selectTitle: '袙懈斜械褉褨褌褜 写芯胁褨写泻芯胁褨 蟹薪邪薪薪褟', // Select reference Knowledge
+      selected: '袟薪邪薪薪褟 芯斜褉邪薪褨', // Knowledge selected
+      noDataSet: '袟薪邪薪薪褟 薪械 蟹薪邪泄写械薪褨', // No Knowledge found
+      toCreate: '袩械褉械泄褌懈 写芯 褋褌胁芯褉械薪薪褟', // Go to create
+      notSupportSelectMulti: '袧邪褉邪蟹褨 锌褨写褌褉懈屑褍褦褌褜褋褟 谢懈褕械 芯写薪械 蟹薪邪薪薪褟', // Currently only support one Knowledge
+      queryVariable: {
+        title: '袟屑褨薪薪邪 蟹邪锌懈褌褍', // Query variable
+        tip: '笑褟 蟹屑褨薪薪邪 斜褍写械 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈褋褟 褟泻 胁褏褨写薪懈泄 蟹邪锌懈褌 写谢褟 芯褌褉懈屑邪薪薪褟 泻芯薪褌械泻褋褌褍, 芯褌褉懈屑邪薪薪褟 泻芯薪褌械泻褋褌薪芯褩 褨薪褎芯褉屑邪褑褨褩, 锌芯胁鈥櫻徯沸靶叫狙� 蟹 胁胁械写械薪薪褟屑 褑褨褦褩 蟹屑褨薪薪芯褩.',
+        choosePlaceholder: '袙懈斜械褉褨褌褜 蟹屑褨薪薪褍 写谢褟 蟹邪锌懈褌褍', // Choose query variable
+        noVar: '袟屑褨薪薪懈褏 薪械屑邪褦', // No variables
+        noVarTip: '斜褍写褜 谢邪褋泻邪, 褋褌胁芯褉褨褌褜 蟹屑褨薪薪褍 胁 褉芯蟹写褨谢褨 袟屑褨薪薪褨', // please create a variable under the Variables section
+        unableToQueryDataSet: '袧械屑芯卸谢懈胁芯 胁懈泻芯薪邪褌懈 蟹邪锌懈褌 写芯 袟薪邪薪褜', // Unable to query the Knowledge
+        unableToQueryDataSetTip: '袧械 胁写邪谢芯褋褟 褍褋锌褨褕薪芯 胁懈泻芯薪邪褌懈 蟹邪锌懈褌 写芯 袘邪蟹懈 袟薪邪薪褜, 斜褍写褜 谢邪褋泻邪, 胁懈斜械褉褨褌褜 蟹屑褨薪薪褍 泻芯薪褌械泻褋褌薪芯谐芯 蟹邪锌懈褌褍 胁 褉芯蟹写褨谢褨 泻芯薪褌械泻褋褌褍.',
+        ok: '袨袣', // OK
+        contextVarNotEmpty: '蟹屑褨薪薪邪 泻芯薪褌械泻褋褌薪芯谐芯 蟹邪锌懈褌褍 薪械 屑芯卸械 斜褍褌懈 锌芯褉芯卸薪褜芯褞', // context query variable can not be empty
+        deleteContextVarTitle: '袙懈写邪谢懈褌懈 蟹屑褨薪薪褍 鈥渰{varName}}鈥�?', // Delete variable 鈥渰{varName}}鈥�?
+        deleteContextVarTip: '笑褟 蟹屑褨薪薪邪 斜褍谢邪 胁褋褌邪薪芯胁谢械薪邪 鈥嬧�嬔徯� 蟹屑褨薪薪邪 泻芯薪褌械泻褋褌薪芯谐芯 蟹邪锌懈褌褍, 褨 褩褩 胁懈写邪谢械薪薪褟 胁锌谢懈薪械 薪邪 薪芯褉屑邪谢褜薪械 胁懈泻芯褉懈褋褌邪薪薪褟 袟薪邪薪褜. 携泻褖芯 胁邪屑 胁褋械 褖械 锌芯褌褉褨斜薪芯 褩褩 胁懈写邪谢懈褌懈, 斜褍写褜 谢邪褋泻邪, 胁懈斜械褉褨褌褜 褩褩 锌芯胁褌芯褉薪芯 胁 褉芯蟹写褨谢褨 泻芯薪褌械泻褋褌褍.',
+      },
+    },
+    tools: {
+      title: '袉薪褋褌褉褍屑械薪褌懈', // Tools
+      tips: '袉薪褋褌褉褍屑械薪褌懈 薪邪写邪褞褌褜 褋褌邪薪写邪褉褌薪懈泄 屑械褌芯写 胁懈泻谢懈泻褍 API, 锌褉懈泄屑邪褞褔懈 胁褏褨写薪褨 写邪薪褨 泻芯褉懈褋褌褍胁邪褔邪 邪斜芯 蟹屑褨薪薪褨 褟泻 锌邪褉邪屑械褌褉懈 蟹邪锌懈褌褍 写谢褟 蟹邪锌懈褌褍 蟹芯胁薪褨褕薪褨褏 写邪薪懈褏 褟泻 泻芯薪褌械泻褋褌褍.',
+      toolsInUse: '袙懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 褨薪褋褌褉褍屑械薪褌褨胁: {{count}}', // {{count}} tools in use
+      modal: {
+        title: '袉薪褋褌褉褍屑械薪褌', // Tool
+        toolType: {
+          title: '孝懈锌 褨薪褋褌褉褍屑械薪褌褍', // Tool Type
+          placeholder: '袘褍写褜 谢邪褋泻邪, 胁懈斜械褉褨褌褜 褌懈锌 褨薪褋褌褉褍屑械薪褌褍', // Please select the tool type
+        },
+        name: {
+          title: '袧邪蟹胁邪', // Name
+          placeholder: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 薪邪蟹胁褍', // Please enter the name
+        },
+        variableName: {
+          title: '袧邪蟹胁邪 蟹屑褨薪薪芯褩', // Variable Name
+          placeholder: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 薪邪蟹胁褍 蟹屑褨薪薪芯褩', // Please enter the variable name
+        },
+      },
+    },
+    conversationHistory: {
+      title: '袉褋褌芯褉褨褟 褉芯蟹屑芯胁', // Conversation History
+      description: '袙褋褌邪薪芯胁褨褌褜 锌褉械褎褨泻褋懈 写谢褟 褉芯谢械泄 褍 褉芯蟹屑芯胁褨', // Set prefix names for conversation roles
+      tip: '袉褋褌芯褉褨褞 褉芯蟹屑芯胁 薪械 胁胁褨屑泻薪械薪芯, 写芯写邪泄褌械 <histories> 褍 蟹邪锌懈褌 胁懈褖械.', // The Conversation History is not enabled, please add <histories> in the prompt above.
+      learnMore: '袛褨蟹薪邪褌懈褋褟 斜褨谢褜褕械', // Learn more
+      editModal: {
+        title: '袪械写邪谐褍胁邪褌懈 薪邪蟹胁懈 褉芯谢械泄 褍 褉芯蟹屑芯胁褨', // Edit Conversation Role Names
+        userPrefix: '袩褉械褎褨泻褋 泻芯褉懈褋褌褍胁邪褔邪', // User prefix
+        assistantPrefix: '袩褉械褎褨泻褋 锌芯屑褨褔薪懈泻邪', // Assistant prefix
+      },
+    },
+    toolbox: {
+      title: '袉袧小孝袪校袦袝袧孝袠', // TOOLBOX (all caps to convey its section title nature)
+    },
+    moderation: {
+      title: '袦芯写械褉邪褑褨褟 泻芯薪褌械薪褌褍', // Content moderation
+      description: '袟邪褏懈褋褌褨褌褜 胁懈胁褨写 屑芯写械谢褨, 胁懈泻芯褉懈褋褌芯胁褍褞褔懈 API 屑芯写械褉邪褑褨褩 邪斜芯 褋锌懈褋芯泻 泻芯薪褎褨写械薪褑褨泄薪懈褏 褋谢褨胁.', // Secure model output...
+      allEnabled: '袙屑褨褋褌 袙袙袝袛袝袧袧携/袙袠袙袝袛袝袧袧携 胁胁褨屑泻薪械薪芯', // INPUT/OUTPUT Content Enabled
+      inputEnabled: '袙屑褨褋褌 袙袙袝袛袝袧袧携 胁胁褨屑泻薪械薪芯', // INPUT Content Enabled
+      outputEnabled: '袙屑褨褋褌 袙袠袙袝袛袝袧袧携 胁胁褨屑泻薪械薪芯', // OUTPUT Content Enabled
+      modal: {
+        title: '袧邪谢邪褕褌褍胁邪薪薪褟 屑芯写械褉邪褑褨褩 胁屑褨褋褌褍', // Content moderation settings
+        provider: {
+          title: '袩褉芯胁邪泄写械褉', // Provider
+          openai: '袦芯写械褉邪褑褨褟 OpenAI', // OpenAI Moderation
+          openaiTip: {
+            prefix: '袛谢褟 屑芯写械褉邪褑褨褩 OpenAI 锌芯褌褉褨斜械薪 泻谢褞褔 API OpenAI, 薪邪谢邪褕褌芯胁邪薪懈泄 褍 ',
+            suffix: '.',
+          },
+          keywords: '袣谢褞褔芯胁褨 褋谢芯胁邪', // Keywords
+        },
+        keywords: {
+          tip: '袩芯 芯写薪芯屑褍 薪邪 褉褟写芯泻, 褉芯蟹写褨谢械薪褨 褉芯蟹褉懈胁邪屑懈 褉褟写泻褨胁. 袛芯 100 褋懈屑胁芯谢褨胁 褍 褉褟写泻褍.',
+          placeholder: '袩芯 芯写薪芯屑褍 薪邪 褉褟写芯泻, 褉芯蟹写褨谢械薪褨 褉芯蟹褉懈胁邪屑懈 褉褟写泻褨胁',
+          line: '袪褟写芯泻',
+        },
+        content: {
+          input: '袩芯屑褨褉薪械 袙袙袝袛袝袧袧携 袙屑褨褋褌褍',
+          output: '袩芯屑褨褉薪械 袙袠袙袝袛袝袧袧携 袙屑褨褋褌褍',
+          preset: '袩芯锌械褉械写薪褜芯 胁褋褌邪薪芯胁谢械薪褨 胁褨写锌芯胁褨写褨', // Preset replies
+          placeholder: '袩芯锌械褉械写薪褜芯 胁褋褌邪薪芯胁谢械薪褨 胁褨写锌芯胁褨写褨 褌褍褌',
+          condition: '校胁褨屑泻薪械薪芯 锌褉懈薪邪泄屑薪褨 芯写薪械: 芦袦芯写械褉褍胁邪褌懈 袙袙袝袛袝袧袧携 孝袗 袙袠袙袝袛袝袧袧携 袙屑褨褋褌褍禄',
+          fromApi: '袩芯锌械褉械写薪褜芯 胁褋褌邪薪芯胁谢械薪褨 胁褨写锌芯胁褨写褨 锌芯胁械褉褌邪褞褌褜褋褟 褔械褉械蟹 API', // Preset replies are returned by API
+          errorMessage: '袩芯锌械褉械写薪褜芯 胁褋褌邪薪芯胁谢械薪褨 胁褨写锌芯胁褨写褨 薪械 屑芯卸褍褌褜 斜褍褌懈 锌芯褉芯卸薪褨屑懈',
+          supportMarkdown: '袩褨写褌褉懈屑泻邪 Markdown', // Markdown supported
+        },
+        openaiNotConfig: {
+          before: '袦芯写械褉邪褑褨褟 OpenAI 胁懈屑邪谐邪褦, 褖芯斜 泻谢褞褔 API OpenAI 斜褍胁 薪邪谢邪褕褌芯胁邪薪懈泄 褍 ',
+          after: '',
+        },
+      },
+    },
+  },
+  automatic: {
+    title: '袗胁褌芯屑邪褌懈蟹芯胁邪薪邪 芯褉泻械褋褌褉邪褑褨褟 蟹邪褋褌芯褋褍薪泻褨胁',
+    description: '袨锌懈褕褨褌褜 褋胁褨泄 褋褑械薪邪褉褨泄, Dify 蟹斜械褉械 写谢褟 胁邪褋 蟹邪褋褌芯褋褍薪芯泻.',
+    intendedAudience: '啸褌芯 褦 褑褨谢褜芯胁芯褞 邪褍写懈褌芯褉褨褦褞?',
+    intendedAudiencePlaceHolder: '薪邪锌褉. 小褌褍写械薪褌',
+    solveProblem: '携泻褨 锌褉芯斜谢械屑懈 胁芯薪懈 褋锌芯写褨胁邪褞褌褜褋褟 胁懈褉褨褕懈褌懈 蟹邪 写芯锌芯屑芯谐芯褞 AI?',
+    solveProblemPlaceHolder: '薪邪锌褉. 袨褑褨薪泻邪 褍褋锌褨褕薪芯褋褌褨',
+    generate: '袚械薪械褉褍胁邪褌懈',
+    audiencesRequired: '袧械芯斜褏褨写薪邪 邪褍写懈褌芯褉褨褟',
+    problemRequired: '袧械芯斜褏褨写薪邪 锌褉芯斜谢械屑邪',
+    resTitle: '袦懈 褋褌胁芯褉懈谢懈 写谢褟 胁邪褋 褌邪泻懈泄 蟹邪褋褌芯褋褍薪芯泻.',
+    apply: '袟邪褋褌芯褋褍胁邪褌懈 褑褞 芯褉泻械褋褌褉邪褑褨褞',
+    noData: '袨锌懈褕褨褌褜 褋胁褨泄 胁懈锌邪写芯泻 胁懈泻芯褉懈褋褌邪薪薪褟 蟹谢褨胁邪, 褌褍褌 斜褍写械 锌芯泻邪蟹邪薪芯 锌芯锌械褉械写薪褨泄 锌械褉械谐谢褟写 芯褉泻械褋褌褉邪褑褨褩.',
+    loading: '袨褉泻械褋褌褉邪褑褨褟 锌褉芯谐褉邪屑懈 写谢褟 胁邪褋...',
+    overwriteTitle: '袩械褉械蟹邪锌懈褋邪褌懈 褨褋薪褍褞褔褍 泻芯薪褎褨谐褍褉邪褑褨褞?',
+    overwriteMessage: '袟邪褋褌芯褋褍胁邪薪薪褟 褑褨褦褩 芯褉泻械褋褌褉邪褑褨褩 锌褉懈蟹胁械写械 写芯 锌械褉械蟹邪锌懈褋褍 褨褋薪褍褞褔芯褩 泻芯薪褎褨谐褍褉邪褑褨褩.',
+  },
+  resetConfig: {
+    title: '袩褨写褌胁械褉写褨褌褜 褋泻懈写邪薪薪褟?',
+    message: '小泻懈写邪薪薪褟 锌褉懈蟹胁芯写懈褌褜 写芯 褋泻邪褋褍胁邪薪薪褟 蟹屑褨薪, 胁褨写薪芯胁谢褞褞褔懈 芯褋褌邪薪薪褞 芯锌褍斜谢褨泻芯胁邪薪褍 泻芯薪褎褨谐褍褉邪褑褨褞.',
+  },
+  errorMessage: {
+    nameOfKeyRequired: '薪邪蟹胁邪 泻谢褞褔邪: {{key}} 芯斜芯胁鈥櫻徯沸盒拘残�', // name of the key: {{key}} required
+    valueOfVarRequired: '蟹薪邪褔械薪薪褟 {{key}} 薪械 屑芯卸械 斜褍褌懈 锌芯褉芯卸薪褨屑', // {{key}} value can not be empty
+    queryRequired: '孝械泻褋褌 蟹邪锌懈褌褍 芯斜芯胁鈥櫻徯沸盒拘残感�.', // Request text is required.
+    waitForResponse: '袘褍写褜 谢邪褋泻邪, 蟹邪褔械泻邪泄褌械, 写芯泻懈 斜褍写械 蟹邪胁械褉褕械薪芯 胁褨写锌芯胁褨写褜 薪邪 锌芯锌械褉械写薪褦 锌芯胁褨写芯屑谢械薪薪褟.', // Please wait for the response to the previous message to complete.
+    waitForBatchResponse: '袘褍写褜 谢邪褋泻邪, 写芯褔械泻邪泄褌械褋褟 蟹邪胁械褉褕械薪薪褟 胁褨写锌芯胁褨写褨 薪邪 锌邪泻械褌薪械 蟹邪胁写邪薪薪褟.', // Please wait for the response to the batch task to complete.
+    notSelectModel: '袘褍写褜 谢邪褋泻邪, 胁懈斜械褉褨褌褜 屑芯写械谢褜', // Please choose a model
+    waitForImgUpload: '袘褍写褜 谢邪褋泻邪, 蟹邪褔械泻邪泄褌械, 锌芯泻懈 蟹芯斜褉邪卸械薪薪褟 蟹邪胁邪薪褌邪卸懈褌褜褋褟', // Please wait for the image to upload
+  },
+  chatSubTitle: '袉薪褋褌褉褍泻褑褨褩', // Instructions
+  completionSubTitle: '袩褉械褎褨泻褋 泻芯屑邪薪写懈', // Prefix Prompt
+  promptTip: '袟邪锌懈褌懈 泻械褉褍褞褌褜 胁褨写锌芯胁褨写褟屑懈 楔袉, 薪邪写邪褞褔懈 褨薪褋褌褉褍泻褑褨褩 褌邪 芯斜屑械卸械薪薪褟. 袙褋褌邪胁褌械 蟹屑褨薪薪褨, 褟泻-芯褌 {{input}}. 笑械泄 蟹邪锌懈褌 薪械 斜褍写械 胁懈写薪芯 泻芯褉懈褋褌褍胁邪褔邪屑.',
+  formattingChangedTitle: '袟屑褨薪械薪芯 褎芯褉屑邪褌褍胁邪薪薪褟', // Formatting changed
+  formattingChangedText: '袟屑褨薪械薪薪褟 褎芯褉屑邪褌褍胁邪薪薪褟 锌褉懈蟹胁械写械 写芯 褋泻懈写邪薪薪褟 芯斜谢邪褋褌褨 薪邪谢邪谐芯写卸械薪薪褟. 袙懈 胁锌械胁薪械薪褨?', // Modifying the formatting will reset the debug area, are you sure?
+  variableTitle: '袟屑褨薪薪褨', // Variables
+  variableTip: '袣芯褉懈褋褌褍胁邪褔褨 蟹邪锌芯胁薪褞褞褌褜 蟹屑褨薪薪褨 褍 褎芯褉屑褨, 邪胁褌芯屑邪褌懈褔薪芯 蟹邪屑褨薪褞褞褔懈 蟹屑褨薪薪褨 胁 泻芯屑邪薪写褨.',
+  notSetVar: '袟屑褨薪薪褨 写芯蟹胁芯谢褟褞褌褜 泻芯褉懈褋褌褍胁邪褔邪屑 胁胁芯写懈褌懈 锌褨写泻邪蟹泻懈 邪斜芯 胁褋褌褍锌薪褨 蟹邪褍胁邪卸械薪薪褟 锌褨写 褔邪褋 蟹邪锌芯胁薪械薪薪褟 褎芯褉屑. 袙懈 屑芯卸械褌械 褋锌褉芯斜褍胁邪褌懈 胁胁械褋褌懈 "{{input}}" 褍 褋谢芯胁邪 锌褨写泻邪蟹泻懈.',
+  autoAddVar: '袧邪 薪械胁懈蟹薪邪褔械薪褨 蟹屑褨薪薪褨, 薪邪 褟泻褨 锌芯褋懈谢邪褞褌褜褋褟 胁 锌芯锌械褉械写薪褜芯屑褍 蟹邪锌懈褌褨, 褦 锌芯褋懈谢邪薪薪褟. 袙懈 褏芯褔械褌械 写芯写邪褌懈 褩褏 褍 褎芯褉屑褍 胁胁芯写褍 泻芯褉懈褋褌褍胁邪褔邪?', // Undefined variables referenced in pre-prompt, are you want to add them in user input form?
+  variableTable: {
+    key: '袣谢褞褔 蟹屑褨薪薪芯褩', // Variable Key
+    name: '袧邪蟹胁邪 锌芯谢褟 写谢褟 胁胁械写械薪薪褟 泻芯褉懈褋褌褍胁邪褔邪', // User Input Field Name
+    optional: '袛芯写邪褌泻芯胁芯', // Optional
+    type: '孝懈锌 胁胁械写械薪薪褟', // Input Type
+    action: '袛褨褩', // Actions
+    typeString: '袪褟写芯泻', // String
+    typeSelect: '袙懈斜褉邪褌懈', // Select
+  },
+  varKeyError: {
+    canNoBeEmpty: '袩芯褌褉褨斜械薪 {{key}}', // Variable key can not be empty
+    tooLong: '{{key}} 蟹邪薪邪写褌芯 写芯胁谐懈泄. 袧械 屑芯卸械 斜褍褌懈 斜褨谢褜褕械 30 褋懈屑胁芯谢褨胁', // Variable key: {{key}} too length. Can not be longer then 30 characters
+    notValid: '{{key}} 薪械写褨泄褋薪懈泄. 袦芯卸械 屑褨褋褌懈褌懈 谢懈褕械 谢褨褌械褉懈, 褑懈褎褉懈 褌邪 锌褨写泻褉械褋谢械薪薪褟', // Variable key: {{key}} is invalid. Can only contain letters, numbers, and underscores
+    notStartWithNumber: '{{key}} 薪械 屑芯卸械 锌芯褔懈薪邪褌懈褋褟 蟹 褑懈褎褉懈', // Variable key: {{key}} can not start with a number
+    keyAlreadyExists: ':{{key}} 胁卸械 褨褋薪褍褦', // Variable key: :{{key}} already exists
+  },
+  otherError: {
+    promptNoBeEmpty: '袣芯屑邪薪写邪 薪械 屑芯卸械 斜褍褌懈 锌芯褉芯卸薪褜芯褞', // Prompt can not be empty
+    historyNoBeEmpty: '袉褋褌芯褉褨褞 褉芯蟹屑芯胁懈 薪械芯斜褏褨写薪芯 胁褋褌邪薪芯胁懈褌懈 褍 锌褨写泻邪蟹褑褨', // Conversation history must be set in the prompt
+    queryNoBeEmpty: '袟邪锌懈褌 屑邪褦 斜褍褌懈 胁褋褌邪薪芯胁谢械薪懈泄 褍 锌褨写泻邪蟹褑褨', // Query must be set in the prompt
+  },
+  variableConfig: {
+    'addModalTitle': '袛芯写邪褌懈 袩芯谢械 袙胁械写械薪薪褟',
+    'editModalTitle': '袪械写邪谐褍胁邪褌懈 袩芯谢械 袙胁械写械薪薪褟',
+    'description': '袧邪谢邪褕褌褍胁邪薪薪褟 写谢褟 蟹屑褨薪薪芯褩 {{varName}}',
+    'fieldType': '孝懈锌 锌芯谢褟',
+    'string': '袣芯褉芯褌泻懈泄 褌械泻褋褌',
+    'text-input': '袣芯褉芯褌泻懈泄 褌械泻褋褌',
+    'paragraph': '袩邪褉邪谐褉邪褎',
+    'select': '袙懈斜褉邪褌懈',
+    'number': '效懈褋谢芯',
+    'notSet': '袧械 胁褋褌邪薪芯胁谢械薪芯, 褋锌褉芯斜褍泄褌械 胁胁械褋褌懈 {{input}} 褍 锌褉械褎褨泻褋薪褨泄 锌褨写泻邪蟹褑褨',
+    'stringTitle': '袩邪褉邪屑械褌褉懈 锌芯谢褟 胁胁械写械薪薪褟 褎芯褉屑懈',
+    'maxLength': '袦邪泻褋懈屑邪谢褜薪邪 写芯胁卸懈薪邪',
+    'options': '袨锌褑褨褩',
+    'addOption': '袛芯写邪褌懈 芯锌褑褨褞',
+    'apiBasedVar': '袟屑褨薪薪邪 薪邪 芯褋薪芯胁褨 API',
+    'varName': '袧邪蟹胁邪 蟹屑褨薪薪芯褩',
+    'labelName': '袧邪蟹胁邪 屑褨褌泻懈',
+    'inputPlaceholder': '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜',
+    'required': '袨斜芯胁\'褟蟹泻芯胁芯',
+    'errorMsg': {
+      varNameRequired: '袩芯褌褉褨斜薪芯 胁泻邪蟹邪褌懈 薪邪蟹胁褍 蟹屑褨薪薪芯褩',
+      labelNameRequired: '袩芯褌褉褨斜薪芯 胁泻邪蟹邪褌懈 薪邪蟹胁褍 屑褨褌泻懈',
+      varNameCanBeRepeat: '袧邪蟹胁邪 蟹屑褨薪薪芯褩 薪械 屑芯卸械 锌芯胁褌芯褉褞胁邪褌懈褋褟',
+      atLeastOneOption: '袩芯褌褉褨斜薪芯 褖芯薪邪泄屑械薪褕械 芯写薪褍 芯锌褑褨褞',
+      optionRepeat: '袆 锌芯胁褌芯褉薪褨 芯锌褑褨褩',
+    },
+  },
+  vision: {
+    name: '袟芯斜褉邪卸械薪薪褟', // Vision
+    description: '校胁褨屑泻薪械薪薪褟 褎褍薪泻褑褨褩 "袟芯斜褉邪卸械薪薪褟" 写芯蟹胁芯谢懈褌褜 屑芯写械谢褨 锌褉懈泄屑邪褌懈 蟹芯斜褉邪卸械薪薪褟 褌邪 胁褨写锌芯胁褨写邪褌懈 薪邪 蟹邪锌懈褌邪薪薪褟 锌褉芯 薪懈褏.',
+    settings: '袧邪谢邪褕褌褍胁邪薪薪褟', // Settings
+    visionSettings: {
+      title: '袧邪谢邪褕褌褍胁邪薪薪褟 蟹芯斜褉邪卸械薪褜', // Vision Settings
+      resolution: '袪芯蟹写褨谢褜薪邪 蟹写邪褌薪褨褋褌褜', // Resolution
+      resolutionTooltip: `薪懈蟹褜泻邪 褉芯蟹写褨谢褜薪邪 蟹写邪褌薪褨褋褌褜 写芯蟹胁芯谢懈褌褜 屑芯写械谢褨 芯褌褉懈屑邪褌懈 蟹芯斜褉邪卸械薪薪褟 蟹 薪懈蟹褜泻芯褞 褉芯蟹写褨谢褜薪芯褞 蟹写邪褌薪褨褋褌褞 512 x 512 锌褨泻褋械谢褨胁 褨 锌褉械写褋褌邪胁懈褌懈 蟹芯斜褉邪卸械薪薪褟 蟹 芯斜屑械卸械薪薪褟屑 褍 65 褌芯泻械薪褨胁. 笑械 写芯蟹胁芯谢褟褦 API 褕胁懈写褕械 锌芯胁械褉褌邪褌懈 胁褨写锌芯胁褨写褨 褌邪 褋锌芯卸懈胁邪褌懈 屑械薪褕械 胁褏褨写薪懈褏 褌芯泻械薪褨胁 写谢褟 胁懈锌邪写泻褨胁 胁懈泻芯褉懈褋褌邪薪薪褟, 褟泻褨 薪械 锌芯褌褉械斜褍褞褌褜 胁懈褋芯泻芯褩 写械褌邪谢褨蟹邪褑褨褩.
+    \n
+    胁懈褋芯泻邪 褉芯蟹写褨谢褜薪邪 蟹写邪褌薪褨褋褌褜 褋锌芯褔邪褌泻褍 写芯蟹胁芯谢懈褌褜 屑芯写械谢褨 锌芯斜邪褔懈褌懈 蟹芯斜褉邪卸械薪薪褟 蟹 薪懈蟹褜泻芯褞 褉芯蟹写褨谢褜薪芯褞 蟹写邪褌薪褨褋褌褞, 邪 锌芯褌褨屑 褋褌胁芯褉懈褌懈 写械褌邪谢褜薪褨 褎褉邪谐屑械薪褌懈 胁褏褨写薪懈褏 蟹芯斜褉邪卸械薪褜 褍 胁懈谐谢褟写褨 泻胁邪写褉邪褌褨胁 512px 薪邪 芯褋薪芯胁褨 褉芯蟹屑褨褉褍 胁褏褨写薪芯谐芯 蟹芯斜褉邪卸械薪薪褟. 袣芯卸械薪 褨蟹 写械褌邪谢褜薪懈褏 褎褉邪谐屑械薪褌褨胁 胁懈泻芯褉懈褋褌芯胁褍褦 锌芯写胁褨泄薪懈泄 蟹邪锌邪褋 褌芯泻械薪褨胁, 蟹邪谐邪谢芯屑 129 褌芯泻械薪褨胁.`,
+      high: '袙懈褋芯泻邪', // High
+      low: '袧懈蟹褜泻邪', // Low
+      uploadMethod: '小锌芯褋褨斜 蟹邪胁邪薪褌邪卸械薪薪褟', // Upload Method
+      both: '袨斜懈写胁邪', // Both
+      localUpload: '袥芯泻邪谢褜薪械 蟹邪胁邪薪褌邪卸械薪薪褟', // Local Upload
+      url: 'URL-邪写褉械褋邪', // URL
+      uploadLimit: '袥褨屑褨褌 蟹邪胁邪薪褌邪卸械薪薪褟', // Upload Limit
+    },
+  },
+  voice: {
+    name: '袚芯谢芯褋', // Voice
+    defaultDisplay: '袚芯谢芯褋 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑', // Default Voice
+    description: '袧邪谢邪褕褌褍胁邪薪薪褟 褋懈薪褌械蟹褍 屑芯胁谢械薪薪褟', //  Text to speech voice Settings
+    settings: '袧邪谢邪褕褌褍胁邪薪薪褟', // Settings
+    voiceSettings: {
+      title: '袧邪谢邪褕褌褍胁邪薪薪褟 谐芯谢芯褋褍', // Voice Settings
+      language: '袦芯胁邪', // Language
+      resolutionTooltip: '袦芯胁薪邪 锌褨写褌褉懈屑泻邪 写谢褟 褋懈薪褌械蟹褍 屑芯胁谢械薪薪褟.', // Text-to-speech voice support language銆�
+      voice: '袚芯谢芯褋', // Voice
+      autoPlay: '袗胁褌芯屑邪褌懈褔薪械 胁褨写褌胁芯褉械薪薪褟',
+      autoPlayEnabled: '袙袉袛效袠袧袝袧袨',
+      autoPlayDisabled: '蟹邪泻褉懈褌褌褟',
+    },
+  },
+  openingStatement: {
+    title: '袙褋褌褍锌 写芯 褉芯蟹屑芯胁懈', // Conversation Opener
+    add: '袛芯写邪褌懈', // Add
+    writeOpener: '袧邪锌懈褕褨褌褜 胁褋褌褍锌薪械 锌芯胁褨写芯屑谢械薪薪褟', // Write opener
+    placeholder: '袧邪锌懈褕褨褌褜 褌褍褌 褋胁芯褦 胁褋褌褍锌薪械 锌芯胁褨写芯屑谢械薪薪褟, 胁懈 屑芯卸械褌械 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 蟹屑褨薪薪褨, 褋锌褉芯斜褍泄褌械 胁胁械褋褌懈 {{variable}}.', // Write your opener message here...
+    openingQuestion: '袙褨写泻褉懈胁邪褞褔褨 锌懈褌邪薪薪褟', // Opening Questions
+    noDataPlaceHolder: '袩芯褔邪褌芯泻 褉芯蟹屑芯胁懈 蟹 泻芯褉懈褋褌褍胁邪褔械屑 屑芯卸械 写芯锌芯屑芯谐褌懈 楔袉 胁褋褌邪薪芯胁懈褌懈 斜褨谢褜褕 褌褨褋薪懈泄 蟹胁鈥櫻徯沸拘� 蟹 薪懈屑 褍 褉芯蟹屑芯胁薪懈褏 蟹邪褋褌芯褋褍薪泻邪褏.', // ... conversational applications.
+    varTip: '袙懈 屑芯卸械褌械 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 蟹屑褨薪薪褨, 褋锌褉芯斜褍泄褌械 胁胁械褋褌懈 {{variable}}', // You can use variables, try type {{variable}}
+    tooShort: '袛谢褟 褋褌胁芯褉械薪薪褟 胁褋褌褍锌薪懈褏 蟹邪褍胁邪卸械薪褜 写谢褟 褉芯蟹屑芯胁懈 锌芯褌褉褨斜薪芯 锌褉懈薪邪泄屑薪褨 20 褋谢褨胁 胁褋褌褍锌薪芯谐芯 蟹邪锌懈褌褍.', // ... are required to generate an opening remarks for the conversation.
+    notIncludeKey: '袩芯褔邪褌泻芯胁懈泄 蟹邪锌懈褌 薪械 胁泻谢褞褔邪褦 蟹屑褨薪薪褍: {{key}}. 袘褍写褜 谢邪褋泻邪, 写芯写邪泄褌械 褩褩 写芯 锌芯褔邪褌泻芯胁芯谐芯 蟹邪锌懈褌褍.', // ... does not include the variable ...
+  },
+  modelConfig: {
+    model: '袦芯写械谢褜', // Model
+    setTone: '袙褋褌邪薪芯胁懈褌懈 褌芯薪 胁褨写锌芯胁褨写械泄', // Set tone of responses
+    title: '袦芯写械谢褜 褨 锌邪褉邪屑械褌褉懈', // Model and Parameters
+    modeType: {
+      chat: '效邪褌', // Chat
+      completion: '袟邪胁械褉褕械薪薪褟', // Complete
+    },
+  },
+  inputs: {
+    title: '袧邪谢邪谐芯写卸械薪薪褟 褌邪 锌芯锌械褉械写薪褨泄 锌械褉械谐谢褟写', // Debug and Preview
+    noPrompt: '小锌褉芯斜褍泄褌械 薪邪锌懈褋邪褌懈 褟泻懈泄褋褜 蟹邪锌懈褌 褍 锌芯谢褨 胁胁械写械薪薪褟 锌褉械褎褨泻褋褍 泻芯屑邪薪写懈', // Try write some prompt in pre-prompt input
+    userInputField: '袩芯谢械 胁胁械写械薪薪褟 泻芯褉懈褋褌褍胁邪褔邪', // User Input Field
+    noVar: '袟邪锌芯胁薪褨褌褜 蟹薪邪褔械薪薪褟 蟹屑褨薪薪芯褩, 褟泻邪 斜褍写械 邪胁褌芯屑邪褌懈褔薪芯 蟹邪屑褨薪械薪邪 胁 褋谢芯胁褨-锌褨写泻邪蟹褑褨 锌褨写 褔邪褋 泻芯卸薪芯谐芯 蟹邪锌褍褋泻褍 薪芯胁芯谐芯 褋械邪薪褋褍.', // Fill in the value of the variable...
+    chatVarTip: '袟邪锌芯胁薪褨褌褜 蟹薪邪褔械薪薪褟 蟹屑褨薪薪芯褩, 褟泻邪 斜褍写械 邪胁褌芯屑邪褌懈褔薪芯 蟹邪屑褨薪械薪邪 胁 褋谢芯胁褨-锌褨写泻邪蟹褑褨 锌褨写 褔邪褋 泻芯卸薪芯谐芯 蟹邪锌褍褋泻褍 薪芯胁芯谐芯 褋械邪薪褋褍.', // Fill in the value of the variable...
+    completionVarTip: '袟邪锌芯胁薪褨褌褜 蟹薪邪褔械薪薪褟 蟹屑褨薪薪芯褩, 褟泻邪 斜褍写械 邪胁褌芯屑邪褌懈褔薪芯 蟹邪屑褨薪械薪邪 胁 褋谢芯胁邪褏-锌褨写泻邪蟹泻邪褏 锌褨写 褔邪褋 泻芯卸薪芯谐芯 胁褨写锌褉邪胁谢械薪薪褟 蟹邪锌懈褌褍.', // Fill in the value of the variable...
+    previewTitle: '袩芯锌械褉械写薪褨泄 锌械褉械谐谢褟写 锌褨写泻邪蟹泻懈', // Prompt preview
+    queryTitle: '袙屑褨褋褌 蟹邪锌懈褌褍', // Query content
+    queryPlaceholder: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 褌械泻褋褌 蟹邪锌懈褌褍', // Please enter the request text.
+    run: '袟袗袩校小孝袠孝袠', // RUN
+  },
+  result: '袙懈褏褨写薪懈泄 褌械泻褋褌', // Output Text
+  datasetConfig: {
+    settingTitle: '袧邪谢邪褕褌褍胁邪薪薪褟 锌芯褕褍泻褍', // Retrieval settings
+    knowledgeTip: '袣谢邪褑薪褨褌褜 泻薪芯锌泻褍 鈥�+鈥�, 褖芯斜 写芯写邪褌懈 蟹薪邪薪薪褟',
+    retrieveOneWay: {
+      title: '袨写薪芯褋褌芯褉芯薪薪褨泄 锌芯褕褍泻', // N-to-1 retrieval
+      description: '袧邪 芯褋薪芯胁褨 薪邪屑褨褉褨胁 泻芯褉懈褋褌褍胁邪褔邪 褌邪 芯锌懈褋褨胁 袟薪邪薪褜 袗谐械薪褌 褋邪屑芯褋褌褨泄薪芯 胁懈斜懈褉邪褦 薪邪泄泻褉邪褖褨 袟薪邪薪薪褟 写谢褟 蟹邪锌懈褌褨胁. 袧邪泄泻褉邪褖械 锌褨写褏芯写懈褌褜 写谢褟 蟹邪褋褌芯褋褍薪泻褨胁 蟹 芯泻褉械屑懈屑懈, 芯斜屑械卸械薪懈屑懈 袟薪邪薪薪褟屑懈.',
+    },
+    retrieveMultiWay: {
+      title: '袘邪谐邪褌芯褋褌芯褉芯薪薪褨泄 锌芯褕褍泻', // Multi-path retrieval
+      description: '袧邪 芯褋薪芯胁褨 薪邪屑褨褉褨胁 泻芯褉懈褋褌褍胁邪褔邪 蟹邪锌懈褌褍褦 锌芯 胁褋褨褏 袘邪蟹邪褏 袟薪邪薪褜, 芯褌褉懈屑褍褦 褉械谢械胁邪薪褌薪懈泄 褌械泻褋褌 褨蟹 泻褨谢褜泻芯褏 写卸械褉械谢 褨 胁懈斜懈褉邪褦 薪邪泄泻褉邪褖褨 褉械蟹褍谢褜褌邪褌懈, 褖芯 胁褨写锌芯胁褨写邪褞褌褜 蟹邪锌懈褌褍 泻芯褉懈褋褌褍胁邪褔邪, 锌褨褋谢褟 锌械褉械褉邪薪卸褍胁邪薪薪褟. 袧械芯斜褏褨写薪邪 泻芯薪褎褨谐褍褉邪褑褨褟 API 屑芯写械谢褨 锌械褉械褉邪薪卸褍胁邪薪薪褟.',
+    },
+    rerankModelRequired: '袧械芯斜褏褨写薪邪 屑芯写械谢褜 锌械褉械褉邪薪卸褍胁邪薪薪褟', // Rerank model is required
+    params: '袩邪褉邪屑械褌褉懈', // Params
+    top_k: '袧邪泄泻褉邪褖懈褏 K', // Top K
+    top_kTip: '袙懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 褎褨谢褜褌褉邪褑褨褩 褎褉邪谐屑械薪褌褨胁, 薪邪泄斜褨谢褜褕 褋褏芯卸懈褏 薪邪 蟹邪锌懈褌邪薪薪褟 泻芯褉懈褋褌褍胁邪褔褨胁. 小懈褋褌械屑邪 褌邪泻芯卸 写懈薪邪屑褨褔薪芯 褉械谐褍谢褞胁邪褌懈屑械 蟹薪邪褔械薪薪褟 K 褍 胁褨写锌芯胁褨写薪芯褋褌褨 蟹 max_tokens 芯斜褉邪薪芯褩 屑芯写械谢褨.',
+    score_threshold: '袩芯褉褨谐 芯褑褨薪泻懈', // Score Threshold
+    score_thresholdTip: '袙懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 胁褋褌邪薪芯胁谢械薪薪褟 锌芯褉芯谐褍 褋褏芯卸芯褋褌褨 写谢褟 褎褨谢褜褌褉邪褑褨褩 褎褉邪谐屑械薪褌褨胁.',
+    retrieveChangeTip: '袟屑褨薪邪  褉械卸懈屑褍 褨薪写械泻褋褍胁邪薪薪褟 褌邪 褉械卸懈屑褍 芯褌褉懈屑邪薪薪褟 屑芯卸械 胁锌谢懈薪褍褌懈 薪邪 蟹邪褋褌芯褋褍薪泻懈, 锌芯胁鈥櫻徯沸靶窖� 蟹 褑懈屑懈 蟹薪邪薪薪褟屑懈.', // Modifying...
+  },
+  debugAsSingleModel: '袧邪谢邪谐芯写卸械薪薪褟 褟泻 芯写薪邪 屑芯写械谢褜', // Debug as Single Model
+  debugAsMultipleModel: '袧邪谢邪谐芯写卸械薪薪褟 褟泻 斜邪谐邪褌芯 屑芯写械谢械泄', // Debug as Multiple Models
+  duplicateModel: '袛褍斜谢褞胁邪薪薪褟', // Duplicate
+  publishAs: '袨锌褍斜谢褨泻褍胁邪褌懈 褟泻', // Publish as
+  assistantType: {
+    name: '孝懈锌 袗褋懈褋褌械薪褌邪', // Assistant Type
+    chatAssistant: {
+      name: '袘邪蟹芯胁懈泄 锌芯屑褨褔薪懈泻', // Basic Assistant
+      description: '小褌胁芯褉褨褌褜 锌芯屑褨褔薪懈泻邪 薪邪 斜邪蟹褨 褔邪褌褍 蟹邪 写芯锌芯屑芯谐芯褞 胁械谢懈泻芯褩 屑芯胁薪芯褩 屑芯写械谢褨', // Build a chat-based...
+    },
+    agentAssistant: {
+      name: '袉薪褌械谢械泻褌褍邪谢褜薪懈泄 锌芯屑褨褔薪懈泻', // Agent Assistant
+      description: '小褌胁芯褉褨褌褜 褨薪褌械谢械泻褌褍邪谢褜薪芯谐芯 邪谐械薪褌邪, 褟泻懈泄 屑芯卸械 褋邪屑芯褋褌褨泄薪芯 胁懈斜懈褉邪褌懈 褨薪褋褌褉褍屑械薪褌懈 写谢褟 胁懈泻芯薪邪薪薪褟 蟹邪胁写邪薪褜', // Build an intelligent Agent...
+    },
+  },
+  agent: {
+    agentMode: '袪械卸懈屑 邪谐械薪褌邪', // Agent Mode
+    agentModeDes: '袙褋褌邪薪芯胁褨褌褜 褌懈锌 褉械卸懈屑褍 胁懈褋薪芯胁泻褍 写谢褟 邪谐械薪褌邪', // Set the type of inference mode...
+    agentModeType: {
+      ReACT: 'ReACT',
+      functionCall: '袙懈泻谢懈泻 褎褍薪泻褑褨褩', // Function Calling
+    },
+    setting: {
+      name: '袧邪谢邪褕褌褍胁邪薪薪褟 邪谐械薪褌邪', // Agent Settings
+      description: '袧邪谢邪褕褌褍胁邪薪薪褟 邪谐械薪褌邪 写芯蟹胁芯谢褟褞褌褜 胁褋褌邪薪芯胁懈褌懈 褉械卸懈屑 邪谐械薪褌邪 褌邪 褉芯蟹褕懈褉械薪褨 褎褍薪泻褑褨褩, 薪邪锌褉懈泻谢邪写 胁斜褍写芯胁邪薪褨 泻芯屑邪薪写懈, 写芯褋褌褍锌薪褨 褌褨谢褜泻懈 写谢褟 褌懈锌褍 邪谐械薪褌邪.', // Agent Assistant settings allow...
+      maximumIterations: {
+        name: '袦邪泻褋懈屑邪谢褜薪邪 泻褨谢褜泻褨褋褌褜 褨褌械褉邪褑褨泄', // Maximum Iterations
+        description: '袨斜屑械卸褌械 泻褨谢褜泻褨褋褌褜 褨褌械褉邪褑褨泄, 褟泻褨 屑芯卸械 胁懈泻芯薪邪褌懈 锌芯屑褨褔薪懈泻 邪谐械薪褌邪', // Limit the number of iterations...
+      },
+    },
+    buildInPrompt: '袙斜褍写芯胁邪薪邪 泻芯屑邪薪写邪', // Build-In Prompt
+    firstPrompt: '袩械褉褕邪 泻芯屑邪薪写邪', // First Prompt
+    nextIteration: '袧邪褋褌褍锌薪邪 褨褌械褉邪褑褨褟', // Next Iteration
+    promptPlaceholder: '袧邪锌懈褕褨褌褜 褌褍褌 褋胁芯褦 蟹邪锌褉芯褕械薪薪褟', // Write your prompt here
+    tools: {
+      name: '袉薪褋褌褉褍屑械薪褌懈', // Tools
+      description: '袙懈泻芯褉懈褋褌邪薪薪褟 褨薪褋褌褉褍屑械薪褌褨胁 屑芯卸械 褉芯蟹褕懈褉懈褌懈 屑芯卸谢懈胁芯褋褌褨 LLM, 薪邪锌褉懈泻谢邪写, 锌芯褕褍泻 胁 袉薪褌械褉薪械褌褨 邪斜芯 胁懈泻芯薪邪薪薪褟 薪邪褍泻芯胁懈褏 褉芯蟹褉邪褏褍薪泻褨胁', // Using tools can extend...
+      enabled: '校胁褨屑泻薪械薪芯', // Enabled
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/uk-UA/app-log.ts b/i18n/uk-UA/app-log.ts
new file mode 100644
index 0000000..f22d15e
--- /dev/null
+++ b/i18n/uk-UA/app-log.ts
@@ -0,0 +1,98 @@
+const translation = {
+  title: '袞褍褉薪邪谢懈',
+  description: '袞褍褉薪邪谢懈 褎褨泻褋褍褞褌褜 褉芯斜芯褔懈泄 褋褌邪褌褍褋 写芯写邪褌泻邪, 胁泻谢褞褔邪褞褔懈 胁胁械写械薪薪褟 泻芯褉懈褋褌褍胁邪褔褨胁 褌邪 胁褨写锌芯胁褨写褨 褕褌褍褔薪芯谐芯 褨薪褌械谢械泻褌褍.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: '效邪褋 芯薪芯胁谢械薪薪褟',
+      time: '效邪褋 褋褌胁芯褉械薪薪褟',
+      endUser: '袣褨薪褑械胁懈泄 袣芯褉懈褋褌褍胁邪褔 邪斜芯 袨斜谢褨泻芯胁懈泄 袟邪锌懈褋',
+      input: '袙胁械写械薪薪褟',
+      output: '袙懈胁械写械薪薪褟',
+      summary: '袟邪谐芯谢芯胁芯泻',
+      messageCount: '袣褨谢褜泻褨褋褌褜 袩芯胁褨写芯屑谢械薪褜',
+      userRate: '袪械泄褌懈薪谐 袣芯褉懈褋褌褍胁邪褔邪',
+      adminRate: '袪械泄褌懈薪谐 袨锌械褉邪褌芯褉邪',
+      startTime: '效袗小 袩袨效袗孝袣校',
+      status: '小孝袗孝校小',
+      runtime: '效袗小 袙袠袣袨袧袗袧袧携',
+      tokens: '孝袨袣袝袧袠',
+      user: '袣袉袧笑袝袙袠袡 袣袨袪袠小孝校袙袗效 袗袘袨 袨袘袥袉袣袨袙袠袡 袟袗袩袠小',
+      version: '袙袝袪小袉携',
+    },
+    pagination: {
+      previous: '袩芯锌械褉械写薪褟',
+      next: '袧邪褋褌褍锌薪邪',
+    },
+    empty: {
+      noChat: '些械 薪械屑邪褦 褉芯蟹屑芯胁',
+      noOutput: '袧械屑邪褦 胁懈胁芯写褍',
+      element: {
+        title: '啸褌芯褋褜 褌褍褌?',
+        content: '小锌芯褋褌械褉褨谐邪泄褌械 褌邪 邪薪芯褌褍泄褌械 胁蟹邪褦屑芯写褨褩 屑褨卸 泻褨薪褑械胁懈屑懈 泻芯褉懈褋褌褍胁邪褔邪屑懈 褌邪 写芯写邪褌泻邪屑懈 褕褌褍褔薪芯谐芯 褨薪褌械谢械泻褌褍 褌褍褌, 褖芯斜 锌芯褋褌褨泄薪芯 锌芯泻褉邪褖褍胁邪褌懈 褌芯褔薪褨褋褌褜 褕褌褍褔薪芯谐芯 褨薪褌械谢械泻褌褍. 袙懈 屑芯卸械褌械 褋锌褉芯斜褍胁邪褌懈 <shareLink>锌芯写褨谢懈褌懈褋褟</shareLink> 邪斜芯 <testLink>锌褉芯褌械褋褌褍胁邪褌懈</testLink> 胁械斜-写芯写邪褌芯泻 褋邪屑芯褋褌褨泄薪芯, 邪 锌芯褌褨屑 锌芯胁械褉薪褍褌懈褋褟 薪邪 褑褞 褋褌芯褉褨薪泻褍.',
+      },
+    },
+  },
+  detail: {
+    time: '效邪褋',
+    conversationId: 'ID 袪芯蟹屑芯胁懈',
+    promptTemplate: '楔邪斜谢芯薪 袟邪锌懈褌邪薪薪褟',
+    promptTemplateBeforeChat: '楔邪斜谢芯薪 袟邪锌懈褌邪薪薪褟 袩械褉械写 效邪褌芯屑 路 携泻 小懈褋褌械屑薪械 袩芯胁褨写芯屑谢械薪薪褟',
+    annotationTip: '袩芯泻褉邪褖械薪薪褟 袩芯蟹薪邪褔械薪褨 袣芯褉懈褋褌褍胁邪褔械屑 {{user}}',
+    timeConsuming: '',
+    second: '褋',
+    tokenCost: '袙懈褌褉邪褌懈 孝芯泻械薪褨胁',
+    loading: '蟹邪胁邪薪褌邪卸械薪薪褟',
+    operation: {
+      like: '锌芯写芯斜邪褦褌褜褋褟',
+      dislike: '薪械 锌芯写芯斜邪褦褌褜褋褟',
+      addAnnotation: '袛芯写邪褌懈 袩芯泻褉邪褖械薪薪褟',
+      editAnnotation: '袪械写邪谐褍胁邪褌懈 袩芯泻褉邪褖械薪薪褟',
+      annotationPlaceholder: '袙胁械写褨褌褜 芯褔褨泻褍胁邪薪褍 胁褨写锌芯胁褨写褜, 褟泻褍 胁懈 褏芯褔械褌械, 褖芯斜 褕褌褍褔薪懈泄 褨薪褌械谢械泻褌 锌芯胁械褉褌邪胁, 褑械 屑芯卸械 斜褍褌懈 胁懈泻芯褉懈褋褌邪薪芯 写谢褟 薪邪谢邪褕褌褍胁邪薪薪褟 屑芯写械谢褨 褌邪 锌芯褋褌褨泄薪芯谐芯 锌芯泻褉邪褖械薪薪褟 褟泻芯褋褌褨 谐械薪械褉邪褑褨褩 褌械泻褋褌褍 胁 屑邪泄斜褍褌薪褜芯屑褍.',
+    },
+    variables: '袟屑褨薪薪褨',
+    uploadImages: '袟邪胁邪薪褌邪卸械薪褨 袟芯斜褉邪卸械薪薪褟',
+    modelParams: '袩邪褉邪屑械褌褉懈 屑芯写械谢褨',
+  },
+  filter: {
+    period: {
+      today: '小褜芯谐芯写薪褨',
+      last7days: '袨褋褌邪薪薪褨 7 写薪褨胁',
+      last4weeks: '袨褋褌邪薪薪褨 4 褌懈卸薪褨',
+      last3months: '袨褋褌邪薪薪褨 3 屑褨褋褟褑褨',
+      last12months: '袨褋褌邪薪薪褨 12 屑褨褋褟褑褨胁',
+      monthToDate: '袦褨褋褟褑褜 写芯 褋褜芯谐芯写薪褨',
+      quarterToDate: '袣胁邪褉褌邪谢 写芯 褋褜芯谐芯写薪褨',
+      yearToDate: '袪褨泻 写芯 褋褜芯谐芯写薪褨',
+      allTime: '袟邪 胁械褋褜 褔邪褋',
+    },
+    annotation: {
+      all: '袙褋褨',
+      annotated: '袩芯泻褉邪褖械薪薪褟 蟹 袗薪芯褌邪褑褨褦褞 ({{count}} 械谢械屑械薪褌褨胁)',
+      not_annotated: '袘械蟹 袗薪芯褌邪褑褨褩',
+    },
+    sortBy: '小芯褉褌褍胁邪褌懈 蟹邪:',
+    descending: '褋锌邪写邪褞褔懈泄',
+    ascending: '蟹褉芯褋褌邪褞褔懈泄',
+  },
+  workflowTitle: '袞褍褉薪邪谢懈 袪芯斜芯褔芯谐芯 袩褉芯褑械褋褍',
+  workflowSubtitle: '袞褍褉薪邪谢 蟹邪褉械褦褋褌褉褍胁邪胁 褉芯斜芯褌褍 袗胁褌芯屑邪褌懈蟹邪褑褨褩.',
+  runDetail: {
+    title: '袞褍褉薪邪谢 袪芯蟹屑芯胁懈',
+    workflowTitle: '袛械褌邪谢褨 袞褍褉薪邪谢褍',
+    fileListDetail: '袛械褌邪谢褜',
+    fileListLabel: '袩芯写褉芯斜懈褑褨 褎邪泄谢褍',
+  },
+  promptLog: '袞褍褉薪邪谢 袟邪锌懈褌邪薪褜',
+  agentLog: '袞褍褉薪邪谢 邪谐械薪褌邪',
+  viewLog: '袩械褉械谐谢褟薪褍褌懈 卸褍褉薪邪谢',
+  agentLogDetail: {
+    agentMode: '袪械卸懈屑 邪谐械薪褌邪',
+    toolUsed: '袙懈泻芯褉懈褋褌邪薪懈泄 褨薪褋褌褉褍屑械薪褌',
+    iterations: '袉褌械褉邪褑褨褩',
+    iteration: '袉褌械褉邪褑褨褟',
+    finalProcessing: '袨褋褌邪褌芯褔薪邪 芯斜褉芯斜泻邪',
+  },
+}
+
+export default translation
diff --git a/i18n/uk-UA/app-overview.ts b/i18n/uk-UA/app-overview.ts
new file mode 100644
index 0000000..002ab5d
--- /dev/null
+++ b/i18n/uk-UA/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: '袛谢褟 锌芯褔邪褌泻褍,',
+    enterKeyTip: '胁胁械写褨褌褜 褋胁褨泄 泻谢褞褔 API OpenAI 薪懈卸褔械',
+    getKeyTip: '袨褌褉懈屑邪泄褌械 褋胁褨泄 泻谢褞褔 API 蟹 锌邪薪械谢褨 OpenAI',
+    placeholder: '袙邪褕 泻谢褞褔 API OpenAI (薪邪锌褉. sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: '袙懈 胁懈泻芯褉懈褋褌芯胁褍褦褌械 泻胁芯褌褍 锌褉芯斜薪芯谐芯 锌械褉褨芯写褍 {{providerName}}.',
+        description: '袣胁芯褌邪 锌褉芯斜薪芯谐芯 锌械褉褨芯写褍 薪邪写邪褦褌褜褋褟 写谢褟 胁邪褕芯谐芯 褌械褋褌褍胁邪谢褜薪芯谐芯 胁懈泻芯褉懈褋褌邪薪薪褟. 袩械褉褕 薪褨卸 斜褍写褍褌褜 胁懈褔械褉锌邪薪褨 胁懈泻谢懈泻懈 泻胁芯褌懈 锌褉芯斜薪芯谐芯 锌械褉褨芯写褍, 薪邪谢邪褕褌褍泄褌械 褋胁芯谐芯 胁谢邪褋薪芯谐芯 锌芯褋褌邪褔邪谢褜薪懈泻邪 屑芯写械谢械泄 邪斜芯 锌褉懈写斜邪泄褌械 写芯写邪褌泻芯胁褍 泻胁芯褌褍.',
+      },
+      exhausted: {
+        title: '袙邪褕褍 泻胁芯褌褍 锌褉芯斜薪芯谐芯 锌械褉褨芯写褍 胁懈褔械褉锌邪薪芯, 薪邪谢邪褕褌褍泄褌械 褋胁褨泄 泻谢褞褔 API.',
+        description: '袙邪褕褍 泻胁芯褌褍 锌褉芯斜薪芯谐芯 锌械褉褨芯写褍 胁懈褔械褉锌邪薪芯. 袧邪谢邪褕褌褍泄褌械 褋胁芯谐芯 胁谢邪褋薪芯谐芯 锌芯褋褌邪褔邪谢褜薪懈泻邪 屑芯写械谢械泄 邪斜芯 锌褉懈写斜邪泄褌械 写芯写邪褌泻芯胁褍 泻胁芯褌褍.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: '袛谢褟 锌芯褔邪褌泻褍,',
+        row2: '褋锌芯褔邪褌泻褍 薪邪谢邪褕褌褍泄褌械 锌芯褋褌邪褔邪谢褜薪懈泻邪 屑芯写械谢械泄.',
+      },
+    },
+    callTimes: '袣褨谢褜泻褨褋褌褜 胁懈泻谢懈泻褨胁',
+    usedToken: '袙懈泻芯褉懈褋褌邪薪褨 褌芯泻械薪懈',
+    setAPIBtn: '袩械褉械泄褌懈 写芯 薪邪谢邪褕褌褍胁邪薪薪褟 锌芯褋褌邪褔邪谢褜薪懈泻邪 屑芯写械谢械泄',
+    tryCloud: '袗斜芯 褋锌褉芯斜褍泄褌械 褏屑邪褉薪褍 胁械褉褋褨褞 Dify 蟹 斜械蟹泻芯褕褌芯胁薪懈屑 褑懈褌邪褌芯褞',
+  },
+  overview: {
+    title: '袨谐谢褟写',
+    appInfo: {
+      explanation: '袚芯褌芯胁懈泄 写芯 胁懈泻芯褉懈褋褌邪薪薪褟 胁械斜-写芯写邪褌芯泻 蟹褨 褕褌褍褔薪懈屑 褨薪褌械谢械泻褌芯屑',
+      accessibleAddress: '袩褍斜谢褨褔薪懈泄 URL',
+      preview: '袩芯锌械褉械写薪褨泄 锌械褉械谐谢褟写',
+      regenerate: '袙褨写薪芯胁懈褌懈',
+      regenerateNotice: '袘邪卸邪褦褌械 蟹谐械薪械褉褍胁邪褌懈 薪芯胁懈泄 锌褍斜谢褨褔薪懈泄 URL?',
+      preUseReminder: '袘褍写褜 谢邪褋泻邪, 邪泻褌懈胁褍泄褌械 胁械斜-写芯写邪褌芯泻 锌械褉械写 锌褉芯写芯胁卸械薪薪褟屑.',
+      settings: {
+        entry: '袧邪谢邪褕褌褍胁邪薪薪褟',
+        title: '袧邪谢邪褕褌褍胁邪薪薪褟 胁械斜-写芯写邪褌泻褍',
+        webName: '袧邪蟹胁邪 胁械斜-写芯写邪褌泻褍',
+        webDesc: '袨锌懈褋 胁械斜-写芯写邪褌泻褍',
+        webDescTip: '笑械泄 褌械泻褋褌 斜褍写械 胁褨写芯斜褉邪卸械薪懈泄 薪邪 泻谢褨褦薪褌褋褜泻芯屑褍 斜芯褑褨, 薪邪写邪褞褔懈 斜邪蟹芯胁褨 胁泻邪蟹褨胁泻懈 褖芯写芯 胁懈泻芯褉懈褋褌邪薪薪褟 写芯写邪褌泻邪',
+        webDescPlaceholder: '袙胁械写褨褌褜 芯锌懈褋 胁械斜-写芯写邪褌泻褍',
+        language: '袦芯胁邪',
+        workflow: {
+          title: '袣褉芯泻懈 褉芯斜芯褔芯谐芯 锌褉芯褑械褋褍',
+          show: '袩芯泻邪蟹邪褌懈',
+          hide: '袩褉懈褏芯胁邪褌懈',
+          subTitle: '袛械褌邪谢褨 褉芯斜芯褔芯谐芯 锌褉芯褑械褋褍',
+          showDesc: '袙褨写芯斜褉邪卸械薪薪褟 邪斜芯 锌褉懈褏芯胁褍胁邪薪薪褟 胁褨写芯屑芯褋褌械泄 锌褉芯 褉芯斜芯褔懈泄 锌褉芯褑械褋 褍 胁械斜-锌褉芯谐褉邪屑褨',
+        },
+        chatColorTheme: '孝械屑邪 泻芯谢褜芯褉褍 褔邪褌褍',
+        chatColorThemeDesc: '袙褋褌邪薪芯胁褨褌褜 褌械屑褍 泻芯谢褜芯褉褍 褔邪褌-斜芯褌邪',
+        chatColorThemeInverted: '袉薪胁械褉褌芯胁邪薪芯',
+        invalidHexMessage: '袧械写褨泄褋薪械 褕褨褋褌薪邪写褑褟褌泻芯胁械 蟹薪邪褔械薪薪褟',
+        invalidPrivacyPolicy: '袧械写褨泄褋薪械 锌芯褋懈谢邪薪薪褟 薪邪 锌芯谢褨褌懈泻褍 泻芯薪褎褨写械薪褑褨泄薪芯褋褌褨. 袘褍写褜 谢邪褋泻邪, 胁懈泻芯褉懈褋褌芯胁褍泄褌械 写褨泄褋薪械 锌芯褋懈谢邪薪薪褟, 褟泻械 锌芯褔懈薪邪褦褌褜褋褟 蟹 http 邪斜芯 https',
+        more: {
+          entry: '袩芯泻邪蟹邪褌懈 写芯写邪褌泻芯胁褨 薪邪谢邪褕褌褍胁邪薪薪褟',
+          copyright: '袗胁褌芯褉褋褜泻械 锌褉邪胁芯',
+          copyRightPlaceholder: '袙胁械写褨褌褜 褨屑\'褟 邪胁褌芯褉邪 邪斜芯 芯褉谐邪薪褨蟹邪褑褨褩',
+          privacyPolicy: '袩芯谢褨褌懈泻邪 泻芯薪褎褨写械薪褑褨泄薪芯褋褌褨',
+          privacyPolicyPlaceholder: '袙胁械写褨褌褜 锌芯褋懈谢邪薪薪褟 薪邪 锌芯谢褨褌懈泻褍 泻芯薪褎褨写械薪褑褨泄薪芯褋褌褨',
+          privacyPolicyTip: '袛芯锌芯屑邪谐邪褦 胁褨写胁褨写褍胁邪褔邪屑 蟹褉芯蟹褍屑褨褌懈 写邪薪褨, 蟹褨斜褉邪薪褨 写芯写邪褌泻芯屑, 写懈胁. <privacyPolicyLink>袩芯谢褨褌懈泻褍 泻芯薪褎褨写械薪褑褨泄薪芯褋褌褨</privacyPolicyLink> Dify.',
+          customDisclaimer: '袙褨写屑芯胁邪 胁褨写 胁褨写锌芯胁褨写邪谢褜薪芯褋褌褨',
+          customDisclaimerPlaceholder: '袙胁械写褨褌褜 胁褨写屑芯胁褍 胁褨写 胁褨写锌芯胁褨写邪谢褜薪芯褋褌褨',
+          customDisclaimerTip: '袙褨写芯斜褉邪卸邪褦褌褜褋褟 薪邪 泻谢褨褦薪褌褋褜泻芯屑褍 斜芯褑褨, 褖芯斜 胁懈蟹薪邪褔懈褌懈 胁褨写锌芯胁褨写邪谢褜薪褨褋褌褜 蟹邪 胁懈泻芯褉懈褋褌邪薪薪褟 写芯写邪褌泻邪',
+          copyrightTip: '袙褨写芯斜褉邪卸械薪薪褟 褨薪褎芯褉屑邪褑褨褩 锌褉芯 邪胁褌芯褉褋褜泻褨 锌褉邪胁邪 褍 胁械斜-锌褉芯谐褉邪屑褨',
+          copyrightTooltip: '袘褍写褜 谢邪褋泻邪, 锌械褉械泄写褨褌褜 薪邪 褌邪褉懈褎薪懈泄 锌谢邪薪 芦Professional禄 邪斜芯 胁懈褖械',
+        },
+        sso: {
+          title: '袆写懈薪懈泄 胁褏褨写 写谢褟 WebApp',
+          description: '校褋褨 泻芯褉懈褋褌褍胁邪褔褨 锌芯胁懈薪薪褨 褍胁褨泄褌懈 胁 褋懈褋褌械屑褍 蟹邪 写芯锌芯屑芯谐芯褞 褦写懈薪芯谐芯 胁褏芯写褍 锌械褉械写 胁懈泻芯褉懈褋褌邪薪薪褟屑 WebApp',
+          tooltip: '袟胁械褉薪褨褌褜褋褟 写芯 邪写屑褨薪褨褋褌褉邪褌芯褉邪, 褖芯斜 褍胁褨屑泻薪褍褌懈 褦写懈薪懈泄 胁褏褨写 WebApp',
+          label: '袗胁褌械薪褌懈褎褨泻邪褑褨褟 蟹邪 写芯锌芯屑芯谐芯褞 褦写懈薪芯谐芯 胁褏芯写褍',
+        },
+        modalTip: '袧邪谢邪褕褌褍胁邪薪薪褟 胁械斜-写芯写邪褌泻褍 薪邪 褋褌芯褉芯薪褨 泻谢褨褦薪褌邪.',
+      },
+      embedded: {
+        entry: '袙斜褍写芯胁邪薪械',
+        title: '袙斜褍写褍胁邪褌懈 薪邪 胁械斜-褋邪泄褌',
+        explanation: '袙懈斜械褉褨褌褜 褋锌芯褋褨斜 胁斜褍写褍胁邪薪薪褟 褔邪褌-写芯写邪褌泻邪 薪邪 胁邪褕 胁械斜-褋邪泄褌',
+        iframe: '袛谢褟 写芯写邪胁邪薪薪褟 褔邪褌-写芯写邪褌泻邪 胁 斜褍写褜-褟泻械 屑褨褋褑械 薪邪 胁邪褕芯屑褍 胁械斜-褋邪泄褌褨, 写芯写邪泄褌械 褑械泄 iframe 写芯 胁邪褕芯谐芯 HTML-泻芯写褍.',
+        scripts: '袛谢褟 写芯写邪胁邪薪薪褟 褔邪褌-写芯写邪褌泻邪 胁 锌褉邪胁懈泄 薪懈卸薪褨泄 泻褍褌 胁邪褕芯谐芯 胁械斜-褋邪泄褌褍 写芯写邪泄褌械 褑械泄 泻芯写 写芯 胁邪褕芯谐芯 HTML.',
+        chromePlugin: '袙褋褌邪薪芯胁懈褌懈 褉芯蟹褕懈褉械薪薪褟 Chrome Dify Chatbot',
+        copied: '小泻芯锌褨泄芯胁邪薪芯',
+        copy: '小泻芯锌褨褞胁邪褌懈',
+      },
+      qrcode: {
+        title: 'QR-泻芯写 写谢褟 芯斜屑褨薪褍',
+        scan: '小泻邪薪褍胁邪褌懈 褌邪 芯斜屑褨薪褞胁邪褌懈褋褟 写芯写邪褌泻芯屑',
+        download: '袟邪胁邪薪褌邪卸懈褌懈 QR-泻芯写',
+      },
+      customize: {
+        way: '褋锌芯褋褨斜',
+        entry: '袧邪谢邪褕褌褍胁邪褌懈',
+        title: '袧邪谢邪褕褌褍胁邪薪薪褟 胁械斜-写芯写邪褌泻褍 蟹褨 褕褌褍褔薪懈屑 褨薪褌械谢械泻褌芯屑',
+        explanation: '袙懈 屑芯卸械褌械 薪邪谢邪褕褌褍胁邪褌懈 褨薪褌械褉褎械泄褋 泻芯褉懈褋褌褍胁邪褔邪 胁械斜-写芯写邪褌泻邪, 褖芯斜 胁褨薪 胁褨写锌芯胁褨写邪胁 胁邪褕懈屑 锌芯褌褉械斜邪屑 褍 褋褑械薪邪褉褨褟褏 褌邪 褋褌懈谢褨.',
+        way1: {
+          name: '小泻谢芯薪褍泄褌械 泻谢褨褦薪褌褋褜泻懈泄 泻芯写, 胁褨写褉械写邪谐褍泄褌械 泄芯谐芯 褌邪 褉芯蟹谐芯褉薪褨褌褜 薪邪 Vercel (褉械泻芯屑械薪写芯胁邪薪芯)',
+          step1: '小泻谢芯薪褍泄褌械 泻谢褨褦薪褌褋褜泻懈泄 泻芯写 褌邪 胁褨写褉械写邪谐褍泄褌械 泄芯谐芯',
+          step1Tip: '袧邪褌懈褋薪褨褌褜 褌褍褌, 褖芯斜 褋泻谢芯薪褍胁邪褌懈 胁懈褏褨写薪懈泄 泻芯写 褍 胁邪褕 芯斜谢褨泻芯胁懈泄 蟹邪锌懈褋 GitHub 褌邪 胁褨写褉械写邪谐褍胁邪褌懈 泻芯写',
+          step1Operation: '袣谢褨褦薪褌-Web-Dify',
+          step2: '袪芯蟹谐芯褉薪褨褌褜 薪邪 Vercel',
+          step2Tip: '袧邪褌懈褋薪褨褌褜 褌褍褌, 褖芯斜 褨屑锌芯褉褌褍胁邪褌懈 褉械锌芯蟹懈褌芯褉褨泄 褍 Vercel 褌邪 褉芯蟹谐芯褉薪褍褌懈',
+          step2Operation: '袉屑锌芯褉褌 褉械锌芯蟹懈褌芯褉褨褞',
+          step3: '袧邪谢邪褕褌褍泄褌械 蟹屑褨薪薪褨 褋械褉械写芯胁懈褖邪',
+          step3Tip: '袛芯写邪泄褌械 薪邪褋褌褍锌薪褨 蟹屑褨薪薪褨 褋械褉械写芯胁懈褖邪 褍 Vercel',
+        },
+        way2: {
+          name: '袧邪锌懈褕褨褌褜 泻谢褨褦薪褌褋褜泻懈泄 泻芯写 写谢褟 胁懈泻谢懈泻褍 API 褌邪 褉芯蟹谐芯褉薪褨褌褜 泄芯谐芯 薪邪 褋械褉胁械褉褨',
+          operation: '袛芯泻褍屑械薪褌邪褑褨褟',
+        },
+      },
+      launch: '袟邪锌褍褋泻褍',
+    },
+    apiInfo: {
+      title: 'API 褋械褉胁褨褋褍 Backend',
+      explanation: '袥械谐泻芯 褨薪褌械谐褉芯胁邪薪懈泄 褍 胁邪褕褍 锌褉芯谐褉邪屑褍',
+      accessibleAddress: '袣褨薪褑械胁邪 褌芯褔泻邪 API 褋械褉胁褨褋褍',
+      doc: '袛芯胁褨写泻邪 蟹 API',
+    },
+    status: {
+      running: '校 褉芯斜芯褌褨',
+      disable: '袙懈屑泻薪褍褌懈',
+    },
+  },
+  analysis: {
+    title: '袗薪邪谢褨蟹',
+    ms: '屑褋',
+    tokenPS: '孝芯泻械薪懈/褋',
+    totalMessages: {
+      title: '袟邪谐邪谢褜薪邪 泻褨谢褜泻褨褋褌褜 锌芯胁褨写芯屑谢械薪褜',
+      explanation: '袣褨谢褜泻褨褋褌褜 褖芯写械薪薪懈褏 胁蟹邪褦屑芯写褨泄 蟹 楔袉.',
+    },
+    totalConversations: {
+      title: '袟邪谐邪谢褜薪邪 泻褨谢褜泻褨褋褌褜 褉芯蟹屑芯胁',
+      explanation: '袣褨谢褜泻褨褋褌褜 褖芯写械薪薪懈褏 褉芯蟹屑芯胁 蟹 楔袉; 褨薪卸械薪械褉褨褟/薪邪谢邪谐芯写卸械薪薪褟 锌褉芯屑锌褌褨胁 胁懈泻谢褞褔械薪芯.',
+    },
+    activeUsers: {
+      title: '袗泻褌懈胁薪褨 泻芯褉懈褋褌褍胁邪褔褨',
+      explanation: '校薪褨泻邪谢褜薪褨 泻芯褉懈褋褌褍胁邪褔褨, 褟泻褨 胁蟹邪褦屑芯写褨褞褌褜 蟹 AI; 褨薪卸械薪械褉褨褟/薪邪谢邪谐芯写卸械薪薪褟 蟹邪锌懈褌褨胁 胁懈泻谢褞褔械薪芯.',
+    },
+    tokenUsage: {
+      title: '袙懈泻芯褉懈褋褌邪薪薪褟 褌芯泻械薪褨胁',
+      explanation: '袙褨写芯斜褉邪卸邪褦 褖芯写械薪薪械 胁懈泻芯褉懈褋褌邪薪薪褟 褌芯泻械薪褨胁 屑芯胁薪芯褩 屑芯写械谢褨 写谢褟 写芯写邪褌泻邪, 泻芯褉懈褋薪芯 写谢褟 泻芯薪褌褉芯谢褞 胁懈褌褉邪褌.',
+      consumed: '小锌芯卸懈褌芯',
+    },
+    avgSessionInteractions: {
+      title: '小械褉械写薪褟 泻褨谢褜泻褨褋褌褜 胁蟹邪褦屑芯写褨泄 蟹邪 褋械褋褨褞',
+      explanation: '袣褨谢褜泻褨褋褌褜 锌褉芯写芯胁卸褍褞褔懈褏褋褟 褋锌褨谢泻褍胁邪薪褜 泻芯褉懈褋褌褍胁邪褔邪 蟹 AI; 写谢褟 锌褉芯谐褉邪屑, 褖芯 斜邪蟹褍褞褌褜褋褟 薪邪 褉芯蟹屑芯胁褨.',
+    },
+    avgUserInteractions: {
+      title: '小械褉械写薪褟 泻褨谢褜泻褨褋褌褜 胁蟹邪褦屑芯写褨泄 薪邪 泻芯褉懈褋褌褍胁邪褔邪',
+      explanation: '袙褨写芯斜褉邪卸邪褦 褖芯写械薪薪褍 褔邪褋褌芯褌褍 胁懈泻芯褉懈褋褌邪薪薪褟 泻芯褉懈褋褌褍胁邪褔邪屑懈. 笑褟 屑械褌褉懈泻邪 胁褨写芯斜褉邪卸邪褦 谢芯褟谢褜薪褨褋褌褜 泻芯褉懈褋褌褍胁邪褔褨胁.',
+    },
+    userSatisfactionRate: {
+      title: '袩芯泻邪蟹薪懈泻 蟹邪写芯胁芯谢械薪薪褟 泻芯褉懈褋褌褍胁邪褔邪',
+      explanation: '袣褨谢褜泻褨褋褌褜 谢邪泄泻褨胁 薪邪 1000 锌芯胁褨写芯屑谢械薪褜. 笑械 胁泻邪蟹褍褦 薪邪 褌械, 薪邪褋泻褨谢褜泻懈 蟹邪写芯胁芯谢械薪褨 泻芯褉懈褋褌褍胁邪褔褨 胁褨写锌芯胁褨写褟屑懈.',
+    },
+    avgResponseTime: {
+      title: '小械褉械写薪褨泄 褔邪褋 胁褨写锌芯胁褨写褨',
+      explanation: '效邪褋 (屑褋) 写谢褟 芯斜褉芯斜泻懈/胁褨写锌芯胁褨写褨 AI; 写谢褟 褌械泻褋褌芯胁懈褏 锌褉芯谐褉邪屑.',
+    },
+    tps: {
+      title: '楔胁懈写泻褨褋褌褜 胁懈胁械写械薪薪褟 褌芯泻械薪褨胁',
+      explanation: '袙懈屑褨褉褞褦 锌褉芯写褍泻褌懈胁薪褨褋褌褜 LLM. 袩褨写褉邪褏芯胁褍褦 褕胁懈写泻褨褋褌褜 胁懈胁械写械薪薪褟 褌芯泻械薪褨胁 LLM 胁褨写 锌芯褔邪褌泻褍 蟹邪锌懈褌褍 写芯 蟹邪胁械褉褕械薪薪褟 胁懈胁械写械薪薪褟.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/uk-UA/app.ts b/i18n/uk-UA/app.ts
new file mode 100644
index 0000000..09df6bf
--- /dev/null
+++ b/i18n/uk-UA/app.ts
@@ -0,0 +1,214 @@
+const translation = {
+  createApp: '小褌胁芯褉懈褌懈 写芯写邪褌芯泻',
+  types: {
+    all: '校褋械',
+    chatbot: '效邪褌斜芯褌',
+    agent: '袗谐械薪褌',
+    workflow: '袪芯斜芯褔懈泄 锌褉芯褑械褋',
+    completion: '袟邪胁械褉褕械薪薪褟',
+    advanced: '效邪褌',
+    basic: '袨褋薪芯胁薪褨',
+  },
+  duplicate: '袛褍斜谢褞胁邪褌懈',
+  duplicateTitle: '袛褍斜谢褞胁邪褌懈 写芯写邪褌芯泻',
+  export: '袝泻褋锌芯褉褌褍胁邪褌懈 DSL',
+  exportFailed: '袧械 胁写邪谢芯褋褟 械泻褋锌芯褉褌褍胁邪褌懈 DSL.',
+  importDSL: '袉屑锌芯褉褌褍胁邪褌懈 褎邪泄谢 DSL',
+  createFromConfigFile: '小褌胁芯褉懈褌懈 蟹 褎邪泄谢褍 DSL',
+  deleteAppConfirmTitle: '袙懈写邪谢懈褌懈 褑械泄 写芯写邪褌芯泻?',
+  deleteAppConfirmContent:
+    '袙懈写邪谢械薪薪褟 写芯写邪褌泻邪 薪械蟹胁芯褉芯褌薪褦. 袣芯褉懈褋褌褍胁邪褔褨 斜褨谢褜褕械 薪械 蟹屑芯卸褍褌褜 芯褌褉懈屑邪褌懈 写芯褋褌褍锌 写芯 胁邪褕芯谐芯 写芯写邪褌泻邪, 褨 胁褋褨 薪邪谢邪褕褌褍胁邪薪薪褟 蟹邪锌懈褌褨胁 褌邪 卸褍褉薪邪谢懈 斜褍写褍褌褜 芯褋褌邪褌芯褔薪芯 胁懈写邪谢械薪褨.',
+  appDeleted: '袛芯写邪褌芯泻 胁懈写邪谢械薪芯',
+  appDeleteFailed: '袧械 胁写邪谢芯褋褟 胁懈写邪谢懈褌懈 写芯写邪褌芯泻',
+  join: '袩褉懈褦写薪褍泄褌械褋褜 写芯 褋锌褨谢褜薪芯褌懈',
+  communityIntro:
+    '袨斜谐芯胁芯褉褞泄褌械 蟹 褔谢械薪邪屑懈 泻芯屑邪薪写懈, 褋锌褨胁邪胁褌芯褉邪屑懈 褌邪 褉芯蟹褉芯斜薪懈泻邪屑懈 薪邪 褉褨蟹薪懈褏 泻邪薪邪谢邪褏.',
+  roadmap: '袩械褉械谐谢褟薪褍褌懈 薪邪褕 锌谢邪薪 褉芯蟹胁懈褌泻褍',
+  newApp: {
+    startFromBlank: '小褌胁芯褉懈褌懈 蟹 薪褍谢褟',
+    startFromTemplate: '小褌胁芯褉懈褌懈 蟹 褕邪斜谢芯薪褍',
+    captionAppType: '携泻懈泄 褌懈锌 写芯写邪褌泻邪 胁懈 褏芯褔械褌械 褋褌胁芯褉懈褌懈?',
+    chatbotDescription: '袩芯斜褍写褍泄褌械 写芯写邪褌芯泻 薪邪 芯褋薪芯胁褨 褔邪褌褍. 笑械泄 写芯写邪褌芯泻 胁懈泻芯褉懈褋褌芯胁褍褦 褎芯褉屑邪褌 蟹邪锌懈褌邪薪褜 褌邪 胁褨写锌芯胁褨写械泄, 褖芯 写芯蟹胁芯谢褟褦 锌褉芯胁芯写懈褌懈 泻褨谢褜泻邪 褉邪褍薪写褨胁 斜械蟹锌械褉械褉胁薪芯谐芯 褋锌褨谢泻褍胁邪薪薪褟.',
+    completionDescription: '袩芯斜褍写褍泄褌械 写芯写邪褌芯泻, 褟泻懈泄 谐械薪械褉褍褦 褌械泻褋褌 胁懈褋芯泻芯褩 褟泻芯褋褌褨 薪邪 芯褋薪芯胁褨 锌褨写泻邪蟹芯泻, 褌邪泻懈褏 褟泻 谐械薪械褉邪褑褨褟 褋褌邪褌械泄, 褉械蟹褞屑械, 锌械褉械泻谢邪写褨胁 褌芯褖芯.',
+    completionWarning: '笑械泄 褌懈锌 写芯写邪褌泻邪 斜褨谢褜褕械 薪械 斜褍写械 锌褨写褌褉懈屑褍胁邪褌懈褋褟.',
+    agentDescription: '袩芯斜褍写褍泄褌械 褨薪褌械谢械泻褌褍邪谢褜薪芯谐芯 邪谐械薪褌邪, 褟泻懈泄 屑芯卸械 邪胁褌芯薪芯屑薪芯 芯斜懈褉邪褌懈 褨薪褋褌褉褍屑械薪褌懈 写谢褟 胁懈泻芯薪邪薪薪褟 蟹邪胁写邪薪褜',
+    workflowDescription: '袩芯斜褍写褍泄褌械 写芯写邪褌芯泻, 褟泻懈泄 谐械薪械褉褍褦 褌械泻褋褌 胁懈褋芯泻芯褩 褟泻芯褋褌褨 薪邪 芯褋薪芯胁褨 褉芯斜芯褔芯谐芯 锌褉芯褑械褋褍 蟹 胁懈褋芯泻懈屑 褉褨胁薪械屑 薪邪褋褌褉芯褞胁邪薪薪褟. 袙褨薪 锌褨写褏芯写懈褌褜 写谢褟 写芯褋胁褨写褔械薪懈褏 泻芯褉懈褋褌褍胁邪褔褨胁.',
+    workflowWarning: '袧邪褉邪蟹褨 胁 斜械褌邪-胁械褉褋褨褩',
+    chatbotType: '袦械褌芯写 芯褉泻械褋褌褉邪褑褨褩 褔邪褌斜芯褌褍',
+    basic: '袘邪蟹芯胁懈泄',
+    basicTip: '袛谢褟 锌芯褔邪褌泻褨胁褑褨胁, 屑芯卸薪邪 锌械褉械泄褌懈 写芯 Chatflow 锌褨蟹薪褨褕械',
+    basicFor: '袛袥携 袩袨效袗孝袣袉袙笑袉袙',
+    basicDescription: '袘邪蟹芯胁懈泄 芯褉泻械褋褌褉 写芯蟹胁芯谢褟褦 芯褉泻械褋褌褉褍胁邪褌懈 写芯写邪褌芯泻 褔邪褌斜芯褌邪 蟹邪 写芯锌芯屑芯谐芯褞 锌褉芯褋褌懈褏 薪邪谢邪褕褌褍胁邪薪褜, 斜械蟹 屑芯卸谢懈胁芯褋褌褨 蟹屑褨薪褞胁邪褌懈 胁斜褍写芯胁邪薪褨 锌褨写泻邪蟹泻懈. 袙褨薪 锌褨写褏芯写懈褌褜 写谢褟 锌芯褔邪褌泻褨胁褑褨胁.',
+    advanced: 'Chatflow',
+    advancedFor: '袛谢褟 写芯褋胁褨写褔械薪懈褏 泻芯褉懈褋褌褍胁邪褔褨胁',
+    advancedDescription: '袨褉泻械褋褌褉褍胁邪薪薪褟 褉芯斜芯褔芯谐芯 锌褉芯褑械褋褍 芯褉泻械褋褌褉褍褦 褔邪褌斜芯褌懈 褍 褎芯褉屑褨 褉芯斜芯褔懈褏 锌褉芯褑械褋褨胁, 锌褉芯锌芯薪褍褞褔懈 胁懈褋芯泻懈泄 褉褨胁械薪褜 薪邪褋褌褉芯褞胁邪薪薪褟, 胁泻谢褞褔邪褞褔懈 屑芯卸谢懈胁褨褋褌褜 褉械写邪谐褍胁邪褌懈 胁斜褍写芯胁邪薪褨 锌褨写泻邪蟹泻懈. 袙褨薪 锌褨写褏芯写懈褌褜 写谢褟 写芯褋胁褨写褔械薪懈褏 泻芯褉懈褋褌褍胁邪褔褨胁.',
+    captionName: '袉泻芯薪泻邪 褌邪 薪邪蟹胁邪 写芯写邪褌泻邪',
+    appNamePlaceholder: '袛邪泄褌械 薪邪蟹胁褍 胁邪褕芯屑褍 写芯写邪褌泻褍',
+    captionDescription: '袨锌懈褋',
+    appDescriptionPlaceholder: '袙胁械写褨褌褜 芯锌懈褋 写芯写邪褌泻邪',
+    useTemplate: '袙懈泻芯褉懈褋褌芯胁褍泄褌械 褑械泄 褕邪斜谢芯薪',
+    previewDemo: '袩芯锌械褉械写薪褨泄 锌械褉械谐谢褟写 写械屑芯薪褋褌褉邪褑褨褩',
+    chatApp: '袗褋懈褋褌械薪褌',
+    chatAppIntro:
+      '携 褏芯褔褍 锌芯斜褍写褍胁邪褌懈 写芯写邪褌芯泻 薪邪 芯褋薪芯胁褨 褔邪褌褍. 笑械泄 写芯写邪褌芯泻 胁懈泻芯褉懈褋褌芯胁褍褦 褎芯褉屑邪褌 蟹邪锌懈褌邪薪褜 褌邪 胁褨写锌芯胁褨写械泄, 褖芯 写芯蟹胁芯谢褟褦 锌褉芯胁芯写懈褌懈 泻褨谢褜泻邪 褉邪褍薪写褨胁 斜械蟹锌械褉械褉胁薪芯谐芯 褋锌褨谢泻褍胁邪薪薪褟.',
+    agentAssistant: '袧芯胁懈泄 锌芯屑褨褔薪懈泻 邪谐械薪褌邪',
+    completeApp: '袚械薪械褉邪褌芯褉 褌械泻褋褌褍',
+    completeAppIntro:
+      '携 褏芯褔褍 褋褌胁芯褉懈褌懈 写芯写邪褌芯泻, 褟泻懈泄 谐械薪械褉褍褦 褌械泻褋褌 胁懈褋芯泻芯褩 褟泻芯褋褌褨 薪邪 芯褋薪芯胁褨 锌褨写泻邪蟹芯泻, 褌邪泻懈褏 褟泻 谐械薪械褉邪褑褨褟 褋褌邪褌械泄, 褉械蟹褞屑械, 锌械褉械泻谢邪写褨胁 褌芯褖芯.',
+    showTemplates: '携 褏芯褔褍 胁懈斜褉邪褌懈 蟹 褕邪斜谢芯薪褍',
+    hideTemplates: '袩芯胁械褉薪褍褌懈褋褟 写芯 胁懈斜芯褉褍 褉械卸懈屑褍',
+    Create: '小褌胁芯褉懈褌懈',
+    Cancel: '小泻邪褋褍胁邪褌懈',
+    nameNotEmpty: '袧邪蟹胁邪 薪械 屑芯卸械 斜褍褌懈 锌芯褉芯卸薪褜芯褞',
+    appTemplateNotSelected: '袘褍写褜 谢邪褋泻邪, 胁懈斜械褉褨褌褜 褕邪斜谢芯薪',
+    appTypeRequired: '袘褍写褜 谢邪褋泻邪, 胁懈斜械褉褨褌褜 褌懈锌 写芯写邪褌泻邪',
+    appCreated: '袛芯写邪褌芯泻 褋褌胁芯褉械薪芯',
+    appCreateFailed: '袧械 胁写邪谢芯褋褟 褋褌胁芯褉懈褌懈 写芯写邪褌芯泻',
+    caution: '袨斜械褉械卸薪褨褋褌褜',
+    Confirm: '袩褨写褌胁械褉写懈褌懈',
+    appCreateDSLErrorPart3: '袩芯褌芯褔薪邪 胁械褉褋褨褟 DSL 锌褉芯谐褉邪屑懈:',
+    appCreateDSLErrorPart4: '袙械褉褋褨褟 DSL 蟹 锌褨写褌褉懈屑泻芯褞 褋懈褋褌械屑懈:',
+    appCreateDSLErrorPart2: '啸芯褔械褌械 锌褉芯写芯胁卸懈褌懈?',
+    appCreateDSLErrorTitle: '袧械褋褍屑褨褋薪褨褋褌褜 胁械褉褋褨泄',
+    appCreateDSLErrorPart1: '袙懈褟胁谢械薪芯 褋褍褌褌褦胁褍 褉褨蟹薪懈褑褞 褍 胁械褉褋褨褟褏 DSL. 袩褉懈屑褍褋芯胁懈泄 褨屑锌芯褉褌 屑芯卸械 锌褉懈蟹胁械褋褌懈 写芯 薪械锌褉邪胁懈谢褜薪芯褩 褉芯斜芯褌懈 锌褉芯谐褉邪屑懈.',
+    appCreateDSLWarning: '校胁邪谐邪: 褉褨蟹薪懈褑褟 褍 胁械褉褋褨褟褏 DSL 屑芯卸械 胁锌谢懈薪褍褌懈 薪邪 锌械胁薪褨 褎褍薪泻褑褨褩',
+    chooseAppType: '袙懈斜械褉褨褌褜 褌懈锌 锌褉芯谐褉邪屑懈',
+    noIdeaTip: '袧械屑邪褦 褨写械泄? 袩械褉械谐谢褟薪褜褌械 薪邪褕褨 褕邪斜谢芯薪懈',
+    noTemplateFoundTip: '小锌褉芯斜褍泄褌械 褕褍泻邪褌懈 蟹邪 褉褨蟹薪懈屑懈 泻谢褞褔芯胁懈屑懈 褋谢芯胁邪屑懈.',
+    foundResult: '{{count}} 袪械蟹褍谢褜褌邪褌',
+    foundResults: '{{count}} 袪械蟹褍谢褜褌邪褌褨胁',
+    optional: '袧械芯斜芯胁\'褟蟹泻芯胁芯',
+    completionShortDescription: 'AI-锌芯屑褨褔薪懈泻 写谢褟 蟹邪胁写邪薪褜 谐械薪械褉邪褑褨褩 褌械泻褋褌褍',
+    forAdvanced: '袛袥携 袛袨小袙袉袛效袝袧袠啸 袣袨袪袠小孝校袙袗效袉袙',
+    noTemplateFound: '袧械 蟹薪邪泄写械薪芯 褕邪斜谢芯薪褨胁',
+    agentUserDescription: '袉薪褌械谢械泻褌褍邪谢褜薪懈泄 邪谐械薪褌, 蟹写邪褌薪懈泄 写芯 褨褌械褉邪褌懈胁薪芯谐芯 屑褨褉泻褍胁邪薪薪褟 褨 邪胁褌芯薪芯屑薪芯谐芯 胁懈泻芯褉懈褋褌邪薪薪褟 褨薪褋褌褉褍屑械薪褌褍 写谢褟 写芯褋褟谐薪械薪薪褟 锌芯褋褌邪胁谢械薪懈褏 褑褨谢械泄.',
+    advancedUserDescription: '袨褉泻械褋褌褉邪褑褨褟 褉芯斜芯褔懈褏 锌褉芯褑械褋褨胁 写谢褟 斜邪谐邪褌芯褉邪褍薪写芯胁懈褏 褋泻谢邪写薪懈褏 写褨邪谢芯谐芯胁懈褏 蟹邪胁写邪薪褜 蟹 屑芯卸谢懈胁芯褋褌褟屑懈 锌邪屑\'褟褌褨.',
+    agentShortDescription: '袉薪褌械谢械泻褌褍邪谢褜薪懈泄 邪谐械薪褌 蟹 屑褨褉泻褍胁邪薪薪褟屑懈 褌邪 邪胁褌芯薪芯屑薪懈屑 胁懈泻芯褉懈褋褌邪薪薪褟屑 褨薪褋褌褉褍屑械薪褌褨胁',
+    noAppsFound: '袧械 蟹薪邪泄写械薪芯 写芯写邪褌泻褨胁',
+    forBeginners: '袛袥携 袩袨效袗孝袣袉袙笑袉袙',
+    workflowShortDescription: '袨褉泻械褋褌褉褍胁邪薪薪褟 写谢褟 芯写薪芯褌邪泻褌薪懈褏 蟹邪胁写邪薪褜 邪胁褌芯屑邪褌懈蟹邪褑褨褩',
+    learnMore: '袛褨蟹薪邪褌懈褋褟 斜褨谢褜褕械',
+    chatbotUserDescription: '楔胁懈写泻芯 褋褌胁芯褉褞泄褌械 褔邪褌-斜芯褌邪 薪邪 斜邪蟹褨 LLM 蟹邪 写芯锌芯屑芯谐芯褞 锌褉芯褋褌芯褩 泻芯薪褎褨谐褍褉邪褑褨褩. 袙懈 屑芯卸械褌械 锌械褉械泻谢褞褔懈褌懈褋褟 薪邪 Chatflow 锌褨蟹薪褨褕械.',
+    chatbotShortDescription: '效邪褌-斜芯褌 薪邪 斜邪蟹褨 LLM 蟹 锌褉芯褋褌懈屑 薪邪谢邪褕褌褍胁邪薪薪褟屑',
+    advancedShortDescription: '袪芯斜芯褔懈泄 锌褉芯褑械褋 写谢褟 褋泻谢邪写薪懈褏 斜邪谐邪褌芯褏芯写芯胁懈褏 写褨邪谢芯谐褨胁 蟹 锌邪屑\'褟褌褌褞',
+    completionUserDescription: '楔胁懈写泻芯 褋褌胁芯褉褞泄褌械 锌芯屑褨褔薪懈泻邪 蟹褨 褕褌褍褔薪懈屑 褨薪褌械谢械泻褌芯屑 写谢褟 蟹邪胁写邪薪褜 褨蟹 谐械薪械褉邪褑褨褩 褌械泻褋褌褍 蟹邪 写芯锌芯屑芯谐芯褞 锌褉芯褋褌芯褩 泻芯薪褎褨谐褍褉邪褑褨褩.',
+    workflowUserDescription: '袨褉泻械褋褌褉邪褑褨褟 褉芯斜芯褔懈褏 锌褉芯褑械褋褨胁 写谢褟 芯写薪芯泻芯屑锌芯薪械薪褌薪懈褏 蟹邪胁写邪薪褜, 褌邪泻懈褏 褟泻 邪胁褌芯屑邪褌懈蟹邪褑褨褟 褌邪 锌邪泻械褌薪邪 芯斜褉芯斜泻邪.',
+  },
+  editApp: '袪械写邪谐褍胁邪褌懈 褨薪褎芯褉屑邪褑褨褞',
+  editAppTitle: '袪械写邪谐褍胁邪褌懈 褨薪褎芯褉屑邪褑褨褞 锌褉芯 写芯写邪褌芯泻',
+  editDone: '袉薪褎芯褉屑邪褑褨褟 锌褉芯 写芯写邪褌芯泻 芯薪芯胁谢械薪邪',
+  editFailed: '袧械 胁写邪谢芯褋褟 芯薪芯胁懈褌懈 褨薪褎芯褉屑邪褑褨褞 锌褉芯 写芯写邪褌芯泻',
+  iconPicker: {
+    ok: 'OK',
+    cancel: '小泻邪褋褍胁邪褌懈',
+    emoji: '袝屑芯写蟹褨',
+    image: '袟芯斜褉邪卸械薪薪褟',
+  },
+  switch: '袩械褉械泄褌懈 写芯 芯褉泻械褋褌褉邪褑褨褩 褉芯斜芯褔芯谐芯 锌褉芯褑械褋褍',
+  switchTipStart: '袛谢褟 胁邪褋 斜褍写械 褋褌胁芯褉械薪邪 薪芯胁邪 泻芯锌褨褟 写芯写邪褌泻邪, 褨 薪芯胁邪 泻芯锌褨褟 锌械褉械泄写械 写芯 芯褉泻械褋褌褉邪褑褨褩 褉芯斜芯褔芯谐芯 锌褉芯褑械褋褍. 袧芯胁邪 泻芯锌褨褟 薪械 写芯蟹胁芯谢懈褌褜 ',
+  switchTip: '锌芯胁械褉薪褍褌懈褋褟',
+  switchTipEnd: ' 写芯 斜邪蟹芯胁芯褩 芯褉泻械褋褌褉邪褑褨褩.',
+  switchLabel: '袣芯锌褨褟 写芯写邪褌泻邪, 褟泻邪 斜褍写械 褋褌胁芯褉械薪邪',
+  removeOriginal: '袙懈写邪谢懈褌懈 锌芯褔邪褌泻芯胁懈泄 写芯写邪褌芯泻',
+  switchStart: '袩芯褔邪褌懈 锌械褉械屑懈泻邪薪薪褟',
+  typeSelector: {
+    all: '校褋褨 褌懈锌懈',
+    chatbot: '效邪褌斜芯褌',
+    agent: '袗谐械薪褌',
+    workflow: '袪芯斜芯褔懈泄 锌褉芯褑械褋',
+    completion: '袟邪胁械褉褕械薪薪褟',
+    advanced: '效邪褌',
+  },
+  tracing: {
+    title: '袙褨写褋褌械卸械薪薪褟 锌褉芯写褍泻褌懈胁薪芯褋褌褨 写芯写邪褌泻褍',
+    description: '袧邪谢邪褕褌褍胁邪薪薪褟 褋褌芯褉芯薪薪褜芯谐芯 锌褉芯胁邪泄写械褉邪 LLMOps 褌邪 胁褨写褋褌械卸械薪薪褟 锌褉芯写褍泻褌懈胁薪芯褋褌褨 写芯写邪褌泻褍.',
+    config: '袧邪谢邪褕褌褍胁邪褌懈',
+    collapse: '袟谐芯褉薪褍褌懈',
+    expand: '袪芯蟹谐芯褉薪褍褌懈',
+    tracing: '袙褨写褋褌械卸械薪薪褟',
+    disabled: '袙懈屑泻薪械薪芯',
+    disabledTip: '小锌芯褔邪褌泻褍 薪邪谢邪褕褌褍泄褌械 锌褉芯胁邪泄写械褉邪',
+    enabled: '袙 褉芯斜芯褌褨',
+    tracingDescription: '袟邪褏芯锌谢械薪薪褟 锌芯胁薪芯谐芯 泻芯薪褌械泻褋褌褍 胁懈泻芯薪邪薪薪褟 写芯写邪褌泻褍, 胁泻谢褞褔邪褞褔懈 胁懈泻谢懈泻懈 LLM, 泻芯薪褌械泻褋褌, 锌褨写泻邪蟹泻懈, HTTP-蟹邪锌懈褌懈 褌邪 褨薪褕械, 薪邪 褋褌芯褉芯薪薪褞 锌谢邪褌褎芯褉屑褍 胁褨写褋褌械卸械薪薪褟.',
+    configProviderTitle: {
+      configured: '袧邪谢邪褕褌芯胁邪薪芯',
+      notConfigured: '袧邪谢邪褕褌褍泄褌械 锌褉芯胁邪泄写械褉邪 写谢褟 褍胁褨屑泻薪械薪薪褟 胁褨写褋褌械卸械薪薪褟',
+      moreProvider: '袘褨谢褜褕械 锌褉芯胁邪泄写械褉褨胁',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: '校薪褨胁械褉褋邪谢褜薪邪 锌谢邪褌褎芯褉屑邪 褉芯蟹褉芯斜薪懈泻邪 写谢褟 泻芯卸薪芯谐芯 械褌邪锌褍 卸懈褌褌褦胁芯谐芯 褑懈泻谢褍 写芯写邪褌泻褍 薪邪 芯褋薪芯胁褨 LLM.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: '孝褉邪褋褍胁邪薪薪褟, 芯褑褨薪泻懈, 褍锌褉邪胁谢褨薪薪褟 锌褨写泻邪蟹泻邪屑懈 褌邪 屑械褌褉懈泻懈 写谢褟 薪邪谢邪谐芯写卸械薪薪褟 褌邪 锌芯泻褉邪褖械薪薪褟 胁邪褕芯谐芯 LLM-写芯写邪褌泻褍.',
+    },
+    inUse: '袙懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟',
+    configProvider: {
+      title: '袧邪谢邪褕褌褍胁邪褌懈 ',
+      placeholder: '袙胁械写褨褌褜 胁邪褕 {{key}}',
+      project: '袩褉芯械泻褌',
+      publicKey: '袩褍斜谢褨褔薪懈泄 泻谢褞褔',
+      secretKey: '小械泻褉械褌薪懈泄 泻谢褞褔',
+      viewDocsLink: '袩械褉械谐谢褟薪褍褌懈 写芯泻褍屑械薪褌邪褑褨褞 {{key}}',
+      removeConfirmTitle: '袙懈写邪谢懈褌懈 薪邪谢邪褕褌褍胁邪薪薪褟 {{key}}?',
+      removeConfirmContent: '袩芯褌芯褔薪械 薪邪谢邪褕褌褍胁邪薪薪褟 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟, 泄芯谐芯 胁懈写邪谢械薪薪褟 胁懈屑泻薪械 褎褍薪泻褑褨褞 袙褨写褋褌械卸械薪薪褟.',
+    },
+    view: '袙懈写',
+    opik: {
+      title: '袨锌褨泻',
+      description: 'Opik 鈥� 褑械 锌谢邪褌褎芯褉屑邪 蟹 胁褨写泻褉懈褌懈屑 胁懈褏褨写薪懈屑 泻芯写芯屑 写谢褟 芯褑褨薪泻懈, 褌械褋褌褍胁邪薪薪褟 褌邪 屑芯薪褨褌芯褉懈薪谐褍 写芯写邪褌泻褨胁 LLM.',
+    },
+    weave: {
+      title: '孝泻邪褌懈',
+      description: 'Weave 褦 锌谢邪褌褎芯褉屑芯褞 蟹 胁褨写泻褉懈褌懈屑 泻芯写芯屑 写谢褟 芯褑褨薪泻懈, 褌械褋褌褍胁邪薪薪褟 褌邪 屑芯薪褨褌芯褉懈薪谐褍 LLM 写芯写邪褌泻褨胁.',
+    },
+  },
+  answerIcon: {
+    title: '袙懈泻芯褉懈褋褌芯胁褍泄褌械 锌褨泻褌芯谐褉邪屑褍 WebApp 写谢褟 蟹邪屑褨薪懈 馃',
+    description: '效懈 褋谢褨写 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 锌褨泻褌芯谐褉邪屑褍 WebApp 写谢褟 蟹邪屑褨薪懈 馃 褍 褋锌褨谢褜薪褨泄 锌褉芯谐褉邪屑褨',
+    descriptionInExplore: '效懈 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 锌褨泻褌芯谐褉邪屑褍 胁械斜-锌褉芯谐褉邪屑懈 写谢褟 蟹邪屑褨薪懈 馃 胁 袨谐谢褟写褨',
+  },
+  importFromDSLUrl: '袟 URL',
+  importFromDSL: '袉屑锌芯褉褌 蟹 DSL',
+  importFromDSLUrlPlaceholder: '袙褋褌邪胁褌械 锌芯褋懈谢邪薪薪褟 薪邪 DSL 褌褍褌',
+  importFromDSLFile: '袟 DSL-褎邪泄谢褍',
+  mermaid: {
+    handDrawn: '袧邪屑邪谢褜芯胁邪薪褨 胁褨写 褉褍泻懈',
+    classic: '袣谢邪褋懈褔薪懈泄',
+  },
+  openInExplore: '袙褨写泻褉懈褌懈 胁 袨谐谢褟写褨',
+  newAppFromTemplate: {
+    sidebar: {
+      Writing: '袧邪锌懈褋邪薪薪褟',
+      Assistant: '袗褋懈褋褌械薪褌',
+      Workflow: '袪芯斜芯褔懈泄 锌褉芯褑械褋',
+      Agent: '袗谐械薪褌',
+      Recommended: '袪械泻芯屑械薪写褍褦褌褜褋褟',
+      HR: '校锌褉邪胁谢褨薪薪褟 锌械褉褋芯薪邪谢芯屑',
+      Programming: '袩褉芯谐褉邪屑褍胁邪薪薪褟',
+    },
+    byCategories: '袟袗 袣袗孝袝袚袨袪袉携袦袠',
+    searchAllTemplate: '袩芯褕褍泻 锌芯 胁褋褨褏 褕邪斜谢芯薪邪褏...',
+  },
+  showMyCreatedAppsOnly: '袩芯泻邪蟹邪褌懈 谢懈褕械 褋褌胁芯褉械薪褨 屑薪芯褞 写芯写邪褌泻懈',
+  appSelector: {
+    noParams: '袩邪褉邪屑械褌褉懈 薪械 锌芯褌褉褨斜薪褨',
+    label: '袛袨袛袗孝袨袣',
+    params: '袩袗袪袗袦袝孝袪袠 袩袪袨袚袪袗袦袠',
+    placeholder: '袙懈斜械褉褨褌褜 锌褉芯谐褉邪屑褍...',
+  },
+  structOutput: {
+    LLMResponse: '袙褨写锌芯胁褨写褜 袥袥袦',
+    configure: '袧邪谢邪褕褌褍胁邪褌懈',
+    required: '袧械芯斜褏褨写薪芯',
+    moreFillTip: '袩芯泻邪蟹褍褞褔懈 屑邪泻褋懈屑褍屑 10 褉褨胁薪褨胁 胁泻谢邪写械薪芯褋褌褨',
+    structured: '小褌褉褍泻褌褍褉芯胁邪薪懈泄',
+    modelNotSupported: '袦芯写械谢褜 薪械 锌褨写褌褉懈屑褍褦褌褜褋褟',
+    notConfiguredTip: '小褌褉褍泻褌褍褉芯胁邪薪懈泄 胁懈褏褨写 褖械 薪械 斜褍谢芯 薪邪谢邪褕褌芯胁邪薪芯',
+    modelNotSupportedTip: '袩芯褌芯褔薪邪 屑芯写械谢褜 薪械 锌褨写褌褉懈屑褍褦 褑褞 褎褍薪泻褑褨褞 褌邪 邪胁褌芯屑邪褌懈褔薪芯 蟹薪懈卸褍褦褌褜褋褟 写芯 褨薪\'褦泻褑褨褩 蟹邪锌懈褌褨胁.',
+    structuredTip: '小褌褉褍泻褌褍褉芯胁邪薪褨 胁懈褏芯写懈 - 褑械 褎褍薪泻褑褨褟, 褟泻邪 蟹邪斜械蟹锌械褔褍褦, 褖芯 屑芯写械谢褜 蟹邪胁卸写懈 谐械薪械褉褍胁邪褌懈屑械 胁褨写锌芯胁褨写褨, 褖芯 胁褨写锌芯胁褨写邪褞褌褜 薪邪写邪薪褨泄 胁邪屑懈 褋褏械屑褨 JSON.',
+  },
+}
+
+export default translation
diff --git a/i18n/uk-UA/billing.ts b/i18n/uk-UA/billing.ts
new file mode 100644
index 0000000..5688853
--- /dev/null
+++ b/i18n/uk-UA/billing.ts
@@ -0,0 +1,200 @@
+const translation = {
+  currentPlan: '袩芯褌芯褔薪懈泄 锌谢邪薪',
+  upgradeBtn: {
+    plain: '袨薪芯胁懈褌懈 锌谢邪薪',
+    encourage: '袨薪芯胁懈褌懈 蟹邪褉邪蟹',
+    encourageShort: '袨薪芯胁懈褌懈',
+  },
+  viewBilling: '袣械褉褍胁邪褌懈 褉邪褏褍薪泻邪屑懈 褌邪 锌褨写锌懈褋泻邪屑懈',
+  buyPermissionDeniedTip: '袟胁\'褟卸褨褌褜褋褟 蟹 邪写屑褨薪褨褋褌褉邪褌芯褉芯屑 胁邪褕芯谐芯 锌褨写锌褉懈褦屑褋褌胁邪, 褖芯斜 芯褎芯褉屑懈褌懈 锌褨写锌懈褋泻褍',
+  plansCommon: {
+    title: '袙懈斜械褉褨褌褜 锌谢邪薪, 褟泻懈泄 锌褨写褏芯写懈褌褜 褋邪屑械 胁邪屑',
+    yearlyTip: '袨褌褉懈屑邪泄褌械 2 屑褨褋褟褑褨 斜械蟹泻芯褕褌芯胁薪芯, 芯褎芯褉屑懈胁褕懈 褉褨褔薪褍 锌褨写锌懈褋泻褍!',
+    mostPopular: '袧邪泄锌芯锌褍谢褟褉薪褨褕懈泄',
+    planRange: {
+      monthly: '些芯屑褨褋褟褑褟',
+      yearly: '些芯褉褨褔薪芯',
+    },
+    month: '屑褨褋褟褑褜',
+    year: '褉褨泻',
+    save: '袟斜械褉械谐褌懈 ',
+    free: '袘械蟹泻芯褕褌芯胁薪芯',
+    currentPlan: '袩芯褌芯褔薪懈泄 锌谢邪薪',
+    contractSales: '袟胁\'褟蟹邪褌懈褋褟 蟹 胁褨写写褨谢芯屑 锌褉芯写邪卸褨胁',
+    contractOwner: '袟胁\'褟蟹邪褌懈褋褟 蟹 泻械褉褨胁薪懈泻芯屑 泻芯屑邪薪写懈',
+    startForFree: '袩芯褔薪褨褌褜 斜械蟹泻芯褕褌芯胁薪芯',
+    getStartedWith: '袩芯褔薪褨褌褜 褉芯斜芯褌褍 蟹 ',
+    contactSales: '袟胁\'褟蟹邪褌懈褋褟 蟹 胁褨写写褨谢芯屑 锌褉芯写邪卸褨胁',
+    talkToSales: '袩芯谐芯胁芯褉褨褌褜 蟹褨 褋谢褍卸斜芯褞 锌褉芯写邪卸褨胁',
+    modelProviders: '袩芯褋褌邪褔邪谢褜薪懈泻懈 屑芯写械谢械泄',
+    teamMembers: '效谢械薪懈 泻芯屑邪薪写懈',
+    buildApps: '小褌胁芯褉褞胁邪褌懈 写芯写邪褌泻懈',
+    vectorSpace: '袙械泻褌芯褉薪懈泄 锌褉芯褋褌褨褉',
+    vectorSpaceBillingTooltip: '袣芯卸械薪 1 袦袘 屑芯卸械 蟹斜械褉褨谐邪褌懈 斜谢懈蟹褜泻芯 1,2 屑褨谢褜泄芯薪邪 褋懈屑胁芯谢褨胁 胁械泻褌芯褉懈蟹芯胁邪薪懈褏 写邪薪懈褏 (芯褑褨薪泻邪 蟹 胁懈泻芯褉懈褋褌邪薪薪褟屑 OpenAI Embeddings, 胁褨写褉褨蟹薪褟褦褌褜褋褟 胁 蟹邪谢械卸薪芯褋褌褨 胁褨写 屑芯写械谢械泄).',
+    vectorSpaceTooltip: '袙械泻褌芯褉薪懈泄 锌褉芯褋褌褨褉 鈥� 褑械 褋懈褋褌械屑邪 写芯胁谐芯褋褌褉芯泻芯胁芯褩 锌邪屑\'褟褌褨, 薪械芯斜褏褨写薪邪 LLM 写谢褟 褉芯蟹褍屑褨薪薪褟 胁邪褕懈褏 写邪薪懈褏.',
+    documentProcessingPriority: '袩褉褨芯褉懈褌械褌 芯斜褉芯斜泻懈 写芯泻褍屑械薪褌褨胁',
+    documentProcessingPriorityTip: '袛谢褟 胁懈褖芯谐芯 锌褉褨芯褉懈褌械褌褍 芯斜褉芯斜泻懈 写芯泻褍屑械薪褌褨胁 芯薪芯胁褨褌褜 褋胁褨泄 锌谢邪薪.',
+    documentProcessingPriorityUpgrade: '袨斜褉芯斜谢褟泄褌械 斜褨谢褜褕械 写邪薪懈褏 褨蟹 胁懈褖芯褞 褌芯褔薪褨褋褌褞 褌邪 薪邪 斜褨谢褜褕懈褏 褕胁懈写泻芯褋褌褟褏.',
+    priority: {
+      'standard': '小褌邪薪写邪褉褌薪懈泄',
+      'priority': '袩褉褨芯褉懈褌械褌薪懈泄',
+      'top-priority': '袧邪泄胁懈褖懈泄 锌褉褨芯褉懈褌械褌',
+    },
+    logsHistory: '袉褋褌芯褉褨褟 卸褍褉薪邪谢褨胁',
+    customTools: '袣芯褉懈褋褌褍胁邪谢褜薪懈褑褜泻褨 褨薪褋褌褉褍屑械薪褌懈',
+    unavailable: '袧械写芯褋褌褍锌薪懈泄',
+    days: '写薪褨胁',
+    unlimited: '袘械蟹谢褨屑褨褌薪懈泄',
+    support: '袩褨写褌褉懈屑泻邪',
+    supportItems: {
+      communityForums: '肖芯褉褍屑懈 褋锌褨谢褜薪芯褌懈',
+      emailSupport: '袩褨写褌褉懈屑泻邪 械谢械泻褌褉芯薪薪芯褞 锌芯褕褌芯褞',
+      priorityEmail: '袩褉褨芯褉懈褌械褌薪邪 锌褨写褌褉懈屑泻邪 械谢械泻褌褉芯薪薪芯褞 锌芯褕褌芯褞 褌邪 胁 褔邪褌褨',
+      logoChange: '袟屑褨薪邪 谢芯谐芯褌懈锌褍',
+      SSOAuthentication: '袗胁褌械薪褌懈褎褨泻邪褑褨褟 SSO',
+      personalizedSupport: '袩械褉褋芯薪邪谢褨蟹芯胁邪薪邪 锌褨写褌褉懈屑泻邪',
+      dedicatedAPISupport: '小锌械褑褨邪谢褜薪邪 锌褨写褌褉懈屑泻邪 API',
+      customIntegration: '袙斜褍写芯胁邪薪邪 褨薪褌械谐褉邪褑褨褟 褌邪 锌褨写褌褉懈屑泻邪',
+      ragAPIRequest: 'RAG API 蟹邪锌懈褌懈',
+      agentMode: '袪械卸懈屑 邪谐械薪褌邪',
+      workflow: '袪芯斜芯褔懈泄 锌褉芯褑械褋',
+      bulkUpload: '袦邪褋芯胁械 蟹邪胁邪薪褌邪卸械薪薪褟 写芯泻褍屑械薪褌褨胁',
+      llmLoadingBalancing: '袘邪谢邪薪褋褍胁邪薪薪褟 薪邪胁邪薪褌邪卸械薪薪褟 LLM',
+      llmLoadingBalancingTooltip: '袛芯写邪胁邪泄褌械 泻褨谢褜泻邪 泻谢褞褔褨胁 API 写芯 屑芯写械谢械泄, 械褎械泻褌懈胁薪芯 芯斜褏芯写褟褔懈 芯斜屑械卸械薪薪褟 褕胁懈写泻芯褋褌褨 API.',
+    },
+    comingSoon: '小泻芯褉芯',
+    member: '校褔邪褋薪懈泻',
+    memberAfter: '褍褔邪褋薪懈泻邪',
+    messageRequest: {
+      title: '袣褉械写懈褌懈 锌芯胁褨写芯屑谢械薪褜',
+      tooltip: '袣胁芯褌懈 薪邪 胁懈泻谢懈泻 锌芯胁褨写芯屑谢械薪褜 写谢褟 褉褨蟹薪懈褏 锌谢邪薪褨胁 蟹 胁懈泻芯褉懈褋褌邪薪薪褟屑 屑芯写械谢械泄 OpenAI (泻褉褨屑 gpt4). 袩芯胁褨写芯屑谢械薪薪褟 锌芯薪邪写 谢褨屑褨褌 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈屑褍褌褜 胁邪褕 泻谢褞褔 API OpenAI.',
+      titlePerMonth: '{{count,number}} 锌芯胁褨写芯屑谢械薪褜/屑褨褋褟褑褜',
+    },
+    annotatedResponse: {
+      title: '袥褨屑褨褌懈 泻胁芯褌懈 胁褨写锌芯胁褨写械泄 蟹 邪薪芯褌邪褑褨褟屑懈',
+      tooltip: '袪褍褔薪械 褉械写邪谐褍胁邪薪薪褟 褌邪 邪薪芯褌褍胁邪薪薪褟 胁褨写锌芯胁褨写械泄 蟹邪斜械蟹锌械褔褍褦 薪邪谢邪褕褌芯胁褍胁邪薪褨 胁懈褋芯泻芯褟泻褨褋薪褨 屑芯卸谢懈胁芯褋褌褨 胁褨写锌芯胁褨写械泄 薪邪 蟹邪锌懈褌邪薪薪褟 写谢褟 锌褉芯谐褉邪屑. (袟邪褋褌芯褋芯胁褍褦褌褜褋褟 谢懈褕械 胁 褔邪褌-锌褉芯谐褉邪屑邪褏)',
+    },
+    ragAPIRequestTooltip: '袙褨写薪芯褋懈褌褜褋褟 写芯 泻褨谢褜泻芯褋褌褨 胁懈泻谢懈泻褨胁 API, 褖芯 胁懈泻谢懈泻邪褞褌褜 谢懈褕械 屑芯卸谢懈胁芯褋褌褨 芯斜褉芯斜泻懈 斜邪蟹懈 蟹薪邪薪褜 Dify.',
+    receiptInfo: '袥懈褕械 胁谢邪褋薪懈泻 泻芯屑邪薪写懈 褌邪 邪写屑褨薪褨褋褌褉邪褌芯褉 泻芯屑邪薪写懈 屑芯卸褍褌褜 锌褨写锌懈褋褍胁邪褌懈褋褟 褌邪 锌械褉械谐谢褟写邪褌懈 褨薪褎芯褉屑邪褑褨褞 锌褉芯 胁懈褋褌邪胁谢械薪薪褟 褉邪褏褍薪泻褨胁',
+    annotationQuota: '袣胁芯褌邪 邪薪芯褌邪褑褨泄',
+    documentsUploadQuota: '袣胁芯褌邪 蟹邪胁邪薪褌邪卸械薪薪褟 写芯泻褍屑械薪褌褨胁',
+    teamMember_one: '{{count,number}} 褔谢械薪 泻芯屑邪薪写懈',
+    teamWorkspace: '{{count,number}} 袣芯屑邪薪写薪懈泄 袩褉芯褋褌褨褉',
+    apiRateLimit: '袨斜屑械卸械薪薪褟 褕胁懈写泻芯褋褌褨 API',
+    documentsTooltip: '袣胁芯褌邪 薪邪 泻褨谢褜泻褨褋褌褜 写芯泻褍屑械薪褌褨胁, 褨屑锌芯褉褌芯胁邪薪懈褏 蟹 写卸械褉械谢邪 蟹薪邪薪褜.',
+    self: '袙谢邪褋薪懈泄 褏芯褋褌懈薪谐',
+    cloud: '啸屑邪褉薪懈泄 褋械褉胁褨褋',
+    documentsRequestQuota: '{{count,number}}/褏胁懈谢懈薪邪 袥褨屑褨褌 蟹邪锌懈褌褍 蟹薪邪薪褜',
+    annualBilling: '些芯褉褨褔薪邪 芯锌谢邪褌邪',
+    priceTip: '蟹邪 褉芯斜芯褔懈屑 锌褉芯褋褌芯褉芯屑/',
+    unlimitedApiRate: '袧械屑邪褦 芯斜屑械卸械薪薪褟 薪邪 褕胁懈写泻褨褋褌褜 API',
+    freeTrialTipSuffix: '袣褉械写懈褌薪邪 泻邪褉褌泻邪 薪械 锌芯褌褉褨斜薪邪',
+    apiRateLimitUnit: '{{count,number}}/写械薪褜',
+    getStarted: '袩芯褔邪褌懈',
+    freeTrialTip: '斜械蟹泻芯褕褌芯胁薪邪 锌褉芯斜薪邪 胁械褉褋褨褟 蟹 200 蟹邪锌懈褌褨胁 写芯 OpenAI.',
+    documents: '{{count,number}} 袛芯泻褍屑械薪褌褨胁 蟹薪邪薪褜',
+    freeTrialTipPrefix: '袟邪褉械褦褋褌褉褍泄褌械褋褜 褨 芯褌褉懈屑邪泄褌械',
+    teamMember_other: '{{count,number}} 褔谢械薪褨胁 泻芯屑邪薪写懈',
+    comparePlanAndFeatures: '袩芯褉褨胁薪褟泄褌械 锌谢邪薪懈 褌邪 褎褍薪泻褑褨褩',
+    apiRateLimitTooltip: '袨斜屑械卸械薪薪褟 褔邪褋褌芯褌懈 蟹邪锌懈褌褨胁 蟹邪褋褌芯褋芯胁褍褦褌褜褋褟 写芯 胁褋褨褏 蟹邪锌懈褌褨胁, 蟹褉芯斜谢械薪懈褏 褔械褉械蟹 API Dify, 胁泻谢褞褔邪褞褔懈 谐械薪械褉邪褑褨褞 褌械泻褋褌褍, 褔邪褌-褉芯蟹屑芯胁懈, 胁懈泻芯薪邪薪薪褟 褉芯斜芯褔懈褏 锌褉芯褑械褋褨胁 褌邪 芯斜褉芯斜泻褍 写芯泻褍屑械薪褌褨胁.',
+    documentsRequestQuotaTooltip: '袙泻邪蟹褍褦 蟹邪谐邪谢褜薪褍 泻褨谢褜泻褨褋褌褜 写褨泄, 褟泻褨 褉芯斜芯褔邪 芯斜谢邪褋褌褜 屑芯卸械 胁懈泻芯薪褍胁邪褌懈 蟹邪 褏胁懈谢懈薪褍 胁 屑械卸邪褏 斜邪蟹懈 蟹薪邪薪褜, 胁泻谢褞褔邪褞褔懈 褋褌胁芯褉械薪薪褟, 胁懈写邪谢械薪薪褟, 芯薪芯胁谢械薪薪褟 薪邪斜芯褉褨胁 写邪薪懈褏, 蟹邪胁邪薪褌邪卸械薪薪褟 写芯泻褍屑械薪褌褨胁, 屑芯写懈褎褨泻邪褑褨褩, 邪褉褏褨胁褍胁邪薪薪褟 褌邪 蟹邪锌懈褌懈 写芯 斜邪蟹懈 蟹薪邪薪褜. 笑械泄 锌芯泻邪蟹薪懈泻 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 芯褑褨薪泻懈 械褎械泻褌懈胁薪芯褋褌褨 蟹邪锌懈褌褨胁 写芯 斜邪蟹懈 蟹薪邪薪褜. 袧邪锌褉懈泻谢邪写, 褟泻褖芯 泻芯褉懈褋褌褍胁邪褔 Sandbox 胁懈泻芯薪褍褦 10 锌芯褋谢褨写芯胁薪懈褏 褌械褋褌褨胁 蟹邪 芯写懈薪 褏胁懈谢懈薪褍, 泄芯谐芯 褉芯斜芯褔褨泄 芯斜谢邪褋褌褨 斜褍写械 褌懈屑褔邪褋芯胁芯 蟹邪斜芯褉芯薪械薪芯 胁懈泻芯薪褍胁邪褌懈 薪邪褋褌褍锌薪褨 写褨褩 锌褉芯褌褟谐芯屑 薪邪褋褌褍锌薪芯褩 褏胁懈谢懈薪懈: 褋褌胁芯褉械薪薪褟 薪邪斜芯褉褨胁 写邪薪懈褏, 胁懈写邪谢械薪薪褟, 芯薪芯胁谢械薪薪褟, 邪 褌邪泻芯卸 蟹邪胁邪薪褌邪卸械薪薪褟 褔懈 屑芯写懈褎褨泻邪褑褨褞 写芯泻褍屑械薪褌褨胁.',
+  },
+  plans: {
+    sandbox: {
+      name: '袩褨褋芯褔薪懈褑褟',
+      description: '200 斜械蟹泻芯褕褌芯胁薪懈褏 锌褉芯斜薪懈褏 胁械褉褋褨泄 GPT',
+      includesTitle: '袙泻谢褞褔邪褦 胁 褋械斜械:',
+      for: '袘械蟹泻芯褕褌芯胁薪邪 锌褉芯斜薪邪 胁械褉褋褨褟 芯褋薪芯胁薪懈褏 褎褍薪泻褑褨泄',
+    },
+    professional: {
+      name: '袩褉芯褎械褋褨泄薪懈泄',
+      description: '些芯斜 芯泻褉械屑褨 芯褋芯斜懈 褌邪 薪械胁械谢懈泻褨 泻芯屑邪薪写懈 屑芯谐谢懈 芯褌褉懈屑邪褌懈 斜褨谢褜褕械 屑芯卸谢懈胁芯褋褌械泄 蟹邪 写芯褋褌褍锌薪芯褞 褑褨薪芯褞.',
+      includesTitle: '袙褋械 褍 斜械蟹泻芯褕褌芯胁薪芯屑褍 锌谢邪薪褨, 锌谢褞褋:',
+      for: '袛谢褟 薪械蟹邪谢械卸薪懈褏 褉芯蟹褉芯斜薪懈泻褨胁/屑邪谢懈褏 泻芯屑邪薪写',
+    },
+    team: {
+      name: '袣芯屑邪薪写邪',
+      description: '小锌褨胁锌褉邪褑褞泄褌械 斜械蟹 芯斜屑械卸械薪褜 褨 泻芯褉懈褋褌褍泄褌械褋褟 锌褉芯写褍泻褌懈胁薪褨褋褌褞 薪邪泄胁懈褖芯谐芯 褉褨胁薪褟.',
+      includesTitle: '袙褋械, 褖芯 胁褏芯写懈褌褜 写芯 锌谢邪薪褍 Professional, 锌谢褞褋:',
+      for: '袛谢褟 褋械褉械写薪褨褏 泻芯屑邪薪写',
+    },
+    enterprise: {
+      name: '袝薪褌械褉锌褉邪泄蟹',
+      description: '袨褌褉懈屑邪泄褌械 锌芯胁薪褨 屑芯卸谢懈胁芯褋褌褨 褌邪 锌褨写褌褉懈屑泻褍 写谢褟 屑邪褋褕褌邪斜薪懈褏 泻褉懈褌懈褔薪芯 胁邪卸谢懈胁懈褏 褋懈褋褌械屑.',
+      includesTitle: '袙褋械, 褖芯 胁褏芯写懈褌褜 写芯 锌谢邪薪褍 Team, 锌谢褞褋:',
+      features: {
+        5: '校谐芯写懈 锌褉芯 褉褨胁械薪褜 芯斜褋谢褍谐芯胁褍胁邪薪薪褟, 褍蟹谐芯写卸械薪褨 锌邪褉褌薪械褉邪屑懈 Dify',
+        2: '袝泻褋泻谢褞蟹懈胁薪褨 锌褨写锌褉懈褦屑薪懈褑褜泻褨 褎褍薪泻褑褨褩',
+        6: '袪芯蟹胁懈薪械薪邪 斜械蟹锌械泻邪 褌邪 泻芯薪褌褉芯谢褜',
+        8: '袩褉芯褎械褋褨泄薪邪 褌械褏薪褨褔薪邪 锌褨写褌褉懈屑泻邪',
+        1: '袣芯屑械褉褑褨泄薪邪 谢褨褑械薪蟹褨褟 薪邪 邪胁褌芯褉懈蟹邪褑褨褞',
+        3: '袣褨谢褜泻邪 褉芯斜芯褔懈褏 锌褉芯褋褌芯褉褨胁 褌邪 褍锌褉邪胁谢褨薪薪褟 锌褨写锌褉懈褦屑褋褌胁芯屑',
+        4: '小小袨',
+        0: '袪褨褕械薪薪褟 写谢褟 屑邪褋褕褌邪斜芯胁邪薪芯谐芯 褉芯蟹谐芯褉褌邪薪薪褟 锌褨写锌褉懈褦屑褋褌胁',
+        7: '袨薪芯胁谢械薪薪褟 褌邪 芯斜褋谢褍谐芯胁褍胁邪薪薪褟 胁褨写 Dify 袨褎褨褑褨泄薪芯',
+      },
+      btnText: '袟胁\'褟蟹邪褌懈褋褟 蟹 胁褨写写褨谢芯屑 锌褉芯写邪卸褍',
+      priceTip: '孝褨谢褜泻懈 褉褨褔薪邪 芯锌谢邪褌邪',
+      for: '袛谢褟 胁械谢懈泻懈褏 泻芯屑邪薪写',
+      price: '袣芯褉懈褋褌褍胁邪褑褜泻懈泄',
+    },
+    community: {
+      features: {
+        2: '袙褨写锌芯胁褨写邪褦 谢褨褑械薪蟹褨褩 Dify Open Source',
+        1: '袆写懈薪械 褉芯斜芯褔械 屑褨褋褑械',
+        0: '校褋褨 芯褋薪芯胁薪褨 褎褍薪泻褑褨褩 胁懈锌褍褖械薪褨 锌褨写 锌褍斜谢褨褔薪懈屑 褉械锌芯蟹懈褌芯褉褨褦屑',
+      },
+      btnText: '袪芯蟹锌芯褔薪褨褌褜 蟹 谐褉芯屑邪写懈',
+      includesTitle: '袘械蟹泻芯褕褌芯胁薪褨 屑芯卸谢懈胁芯褋褌褨:',
+      for: '袛谢褟 褨薪写懈胁褨写褍邪谢褜薪懈褏 泻芯褉懈褋褌褍胁邪褔褨胁, 屑邪谢懈褏 泻芯屑邪薪写 邪斜芯 薪械泻芯屑械褉褑褨泄薪懈褏 锌褉芯械泻褌褨胁',
+      price: '袘械蟹泻芯褕褌芯胁薪芯',
+      description: '袛谢褟 褨薪写懈胁褨写褍邪谢褜薪懈褏 泻芯褉懈褋褌褍胁邪褔褨胁, 屑邪谢懈褏 泻芯屑邪薪写 邪斜芯 薪械泻芯屑械褉褑褨泄薪懈褏 锌褉芯械泻褌褨胁',
+      name: '小锌褨谢褜薪芯褌邪',
+    },
+    premium: {
+      features: {
+        2: '袥芯谐芯褌懈锌 胁械斜-写芯写邪褌泻褍 褌邪 薪邪谢邪褕褌褍胁邪薪薪褟 斜褉械薪写懈薪谐褍',
+        1: '袆写懈薪械 褉芯斜芯褔械 屑褨褋褑械',
+        3: '袩褉褨芯褉懈褌械褌薪邪 email 褌邪 褔邪褌 锌褨写褌褉懈屑泻邪',
+        0: '小邪屑芯褋褌褨泄薪芯 泻械褉芯胁邪薪褨 薪邪写褨泄薪褨褋褌褜 褉褨蟹薪懈褏 褏屑邪褉薪懈褏 锌芯褋褌邪褔邪谢褜薪懈泻褨胁',
+      },
+      description: '袛谢褟 褋械褉械写薪褨褏 锌褨写锌褉懈褦屑褋褌胁 褌邪 泻芯屑邪薪写',
+      btnText: '袨褌褉懈屑邪泄褌械 袩褉械屑褨褍屑 褍',
+      price: '袦邪褋褕褌邪斜芯胁邪薪懈泄',
+      comingSoon: '袩褨写褌褉懈屑泻邪 Microsoft Azure 褌邪 Google Cloud 薪械蟹邪斜邪褉芯屑',
+      priceTip: '袧邪 芯褋薪芯胁褨 啸屑邪褉薪芯谐芯 褉懈薪泻褍',
+      for: '袛谢褟 褋械褉械写薪褨褏 锌褨写锌褉懈褦屑褋褌胁 褌邪 泻芯屑邪薪写',
+      name: '袩褉械屑褨褍屑',
+      includesTitle: '袙褋械 蟹 谐褉芯屑邪写懈, 锌谢褞褋:',
+    },
+  },
+  vectorSpace: {
+    fullTip: '袙械泻褌芯褉薪懈泄 锌褉芯褋褌褨褉 蟹邪锌芯胁薪械薪懈泄.',
+    fullSolution: '袨薪芯胁褨褌褜 褋胁褨泄 锌谢邪薪, 褖芯斜 芯褌褉懈屑邪褌懈 斜褨谢褜褕械 屑褨褋褑褟.',
+  },
+  apps: {
+    fullTipLine1: '袨薪芯胁褨褌褜 褋胁褨泄 锌谢邪薪, 褖芯斜',
+    fullTipLine2: '褋褌胁芯褉懈褌懈 斜褨谢褜褕械 锌褉芯谐褉邪屑.',
+    fullTip1des: '袙懈 写芯褋褟谐谢懈 屑械卸褨 褋褌胁芯褉械薪薪褟 写芯写邪褌泻褨胁 蟹邪 褑懈屑 锌谢邪薪芯屑.',
+    fullTip2: '袛芯褋褟谐薪褍褌芯 谢褨屑褨褌褍 锌谢邪薪褍',
+    fullTip1: '袨薪芯胁褨褌褜, 褖芯斜 褋褌胁芯褉懈褌懈 斜褨谢褜褕械 写芯写邪褌泻褨胁',
+    contactUs: '袟胁\'褟卸褨褌褜褋褟 蟹 薪邪屑懈',
+    fullTip2des: '袪械泻芯屑械薪写褍褦褌褜褋褟 芯褔懈褋褌懈褌懈 薪械邪泻褌懈胁薪褨 锌褉芯谐褉邪屑懈, 褖芯斜 蟹胁褨谢褜薪懈褌懈 屑褨褋褑械, 邪斜芯 蟹胁\'褟蟹邪褌懈褋褟 蟹 薪邪屑懈.',
+  },
+  annotatedResponse: {
+    fullTipLine1: '袨薪芯胁褨褌褜 褋胁褨泄 锌谢邪薪, 褖芯斜',
+    fullTipLine2: '邪薪芯褌褍胁邪褌懈 斜褨谢褜褕械 褉芯蟹屑芯胁.',
+    quotaTitle: '袣胁芯褌邪 薪邪 邪薪芯褌芯胁邪薪褨 胁褨写锌芯胁褨写褨',
+  },
+  usagePage: {
+    teamMembers: '效谢械薪懈 泻芯屑邪薪写懈',
+    buildApps: '小褌胁芯褉褞泄褌械 写芯写邪褌泻懈',
+    annotationQuota: '袣胁芯褌邪 邪薪芯褌邪褑褨泄',
+    vectorSpaceTooltip: '袛芯泻褍屑械薪褌懈 蟹 褉械卸懈屑芯屑 褨薪写械泻褋褍胁邪薪薪褟 胁懈褋芯泻芯褩 褟泻芯褋褌褨 褋锌芯卸懈胁邪褌懈屑褍褌褜 褉械褋褍褉褋懈 小褏芯胁懈褖邪 袟薪邪薪褜. 袣芯谢懈 小褏芯胁懈褖械 袟薪邪薪褜 写芯褋褟谐薪械 屑械卸褨, 薪芯胁褨 写芯泻褍屑械薪褌懈 薪械 斜褍写褍褌褜 蟹邪胁邪薪褌邪卸械薪褨.',
+    documentsUploadQuota: '袣胁芯褌邪 薪邪 蟹邪胁邪薪褌邪卸械薪薪褟 写芯泻褍屑械薪褌褨胁',
+    vectorSpace: '小褏芯胁懈褖械 写邪薪懈褏 蟹薪邪薪褜',
+  },
+  teamMembers: '效谢械薪懈 泻芯屑邪薪写懈',
+}
+
+export default translation
diff --git a/i18n/uk-UA/common.ts b/i18n/uk-UA/common.ts
new file mode 100644
index 0000000..dee558a
--- /dev/null
+++ b/i18n/uk-UA/common.ts
@@ -0,0 +1,673 @@
+const translation = {
+  api: {
+    success: '校褋锌褨褏',
+    actionSuccess: '袛褨褞 胁懈泻芯薪邪薪芯 褍褋锌褨褕薪芯',
+    saved: '袟斜械褉械卸械薪芯',
+    create: '小褌胁芯褉械薪芯',
+    remove: '袙懈写邪谢械薪芯',
+  },
+  operation: {
+    create: '小褌胁芯褉懈褌懈',
+    confirm: '袩褨写褌胁械褉写懈褌懈',
+    cancel: '小泻邪褋褍胁邪褌懈',
+    clear: '袨褔懈褋褌懈褌懈',
+    save: '袟斜械褉械谐褌懈',
+    saveAndEnable: '袟斜械褉械谐褌懈 褌邪 校胁褨屑泻薪褍褌懈',
+    edit: '袪械写邪谐褍胁邪褌懈',
+    add: '袛芯写邪褌懈',
+    added: '袛芯写邪薪芯',
+    refresh: '袩械褉械蟹邪锌褍褋褌懈褌懈',
+    reset: '小泻懈薪褍褌懈',
+    search: '袩芯褕褍泻',
+    change: '袟屑褨薪懈褌懈',
+    remove: '袙懈写邪谢懈褌懈',
+    send: '袧邪写褨褋谢邪褌懈',
+    copy: '袣芯锌褨褞胁邪褌懈',
+    lineBreak: '袩械褉械薪械褋械薪薪褟 褉褟写泻邪',
+    sure: '携 胁锌械胁薪械薪懈泄',
+    download: '袟邪胁邪薪褌邪卸懈褌懈',
+    delete: '袙懈写邪谢懈褌懈',
+    settings: '袧邪谢邪褕褌褍胁邪薪薪褟',
+    setup: '袧邪谢邪褕褌褍胁邪褌懈',
+    getForFree: '袨褌褉懈屑邪褌懈 斜械蟹泻芯褕褌芯胁薪芯',
+    reload: '袩械褉械蟹邪胁邪薪褌邪卸懈褌懈',
+    ok: '袨袣',
+    log: '袞褍褉薪邪谢',
+    learnMore: '袛褨蟹薪邪褌懈褋褟 斜褨谢褜褕械',
+    params: '袩邪褉邪屑械褌褉懈',
+    duplicate: '写褍斜谢褨泻邪褌',
+    rename: '袩械褉械泄屑械薪褍胁邪褌懈',
+    audioSourceUnavailable: 'AudioSource 薪械写芯褋褌褍锌薪懈泄',
+    copyImage: '小泻芯锌褨褞胁邪褌懈 蟹芯斜褉邪卸械薪薪褟',
+    openInNewTab: '袙褨写泻褉懈褌懈 胁 薪芯胁褨泄 胁泻谢邪写褑褨',
+    zoomOut: '袟屑械薪褕懈褌懈 屑邪褋褕褌邪斜',
+    zoomIn: '袟斜褨谢褜褕懈褌懈 屑邪褋褕褌邪斜',
+    close: '袟邪泻褉懈褌懈',
+    regenerate: '袙褨写薪芯胁懈褌懈',
+    view: '袙懈写',
+    viewMore: '袛袠袙袠孝袠小鞋 袘袉袥鞋楔袝',
+    saveAndRegenerate: '袟斜械褉械卸械薪薪褟 褌邪 褉械谐械薪械褉邪褑褨褟 写芯褔褨褉薪褨褏 褎褉邪谐屑械薪褌褨胁',
+    submit: '袩褉械写褋褌邪胁懈褌懈',
+    skip: '袣芯褉邪斜械谢褜',
+    imageCopied: '小泻芯锌褨泄芯胁邪薪械 蟹芯斜褉邪卸械薪薪褟',
+    deleteApp: '袙懈写邪谢懈褌懈 锌褉芯谐褉邪屑褍',
+    viewDetails: '袩械褉械谐谢褟写 写芯泻谢邪写薪懈褏 胁褨写芯屑芯褋褌械泄',
+    copied: '小泻芯锌褨泄芯胁邪薪褨',
+    in: '袙',
+    format: '肖芯褉屑邪褌',
+    downloadFailed: '袧械 胁写邪谢芯褋褟 蟹邪胁邪薪褌邪卸懈褌懈. 袘褍写褜 谢邪褋泻邪, 褋锌褉芯斜褍泄褌械 褖械 褉邪蟹 锌褨蟹薪褨褕械.',
+    more: '袘褨谢褜褕械',
+    downloadSuccess: '袟邪胁邪薪褌邪卸械薪薪褟 蟹邪胁械褉褕械薪芯.',
+  },
+  placeholder: {
+    input: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 褌械泻褋褌',
+    select: '袘褍写褜 谢邪褋泻邪, 芯斜械褉褨褌褜 锌邪褉邪屑械褌褉',
+  },
+  voice: {
+    language: {
+      zhHans: '袣懈褌邪泄褋褜泻邪',
+      zhHant: '袣懈褌邪泄褋褜泻邪 (褌褉邪写懈褑褨泄薪邪)',
+      enUS: '袗薪谐谢褨泄褋褜泻邪',
+      deDE: '袧褨屑械褑褜泻邪',
+      frFR: '肖褉邪薪褑褍蟹褜泻邪',
+      esES: '袉褋锌邪薪褋褜泻邪',
+      itIT: '袉褌邪谢褨泄褋褜泻邪',
+      thTH: '孝邪泄褋褜泻邪',
+      idID: '袉薪写芯薪械蟹褨泄褋褜泻邪',
+      jaJP: '携锌芯薪褋褜泻邪',
+      koKR: '袣芯褉械泄褋褜泻邪',
+      ptBR: '袩芯褉褌褍谐邪谢褜褋褜泻邪',
+      ruRU: '袪芯褋褨泄褋褜泻邪',
+      ukUA: '校泻褉邪褩薪褋褜泻邪',
+      viVN: '袙\'褦 褌薪邪屑褋褜泻邪',
+      plPL: '袩芯谢褜褋褜泻邪',
+      roRO: '袪褍屑褍薪褋褜泻邪',
+      hiIN: '啸褨薪写褨',
+      trTR: '孝褍褉械褑褜泻邪',
+      faIR: '袩械褉褋褜泻邪',
+    },
+  },
+  unit: {
+    char: '褋懈屑胁芯谢褨胁',
+  },
+  actionMsg: {
+    noModification: '袧邪 写邪薪懈泄 屑芯屑械薪褌 卸芯写薪懈褏 蟹屑褨薪 薪械屑邪褦.',
+    modifiedSuccessfully: '校褋锌褨褕薪芯 蟹屑褨薪械薪芯',
+    modifiedUnsuccessfully: '袟屑褨薪懈褌懈 薪械 胁写邪谢芯褋褟',
+    copySuccessfully: '小泻芯锌褨泄芯胁邪薪芯 褍褋锌褨褕薪芯',
+    paySucceeded: '袩谢邪褌褨卸 锌褉芯泄褕芯胁 褍褋锌褨褕薪芯',
+    payCancelled: '袩谢邪褌褨卸 褋泻邪褋芯胁邪薪芯',
+    generatedSuccessfully: '校褋锌褨褕薪芯 蟹谐械薪械褉芯胁邪薪芯',
+    generatedUnsuccessfully: '袧械 胁写邪谢芯褋褟 蟹谐械薪械褉褍胁邪褌懈',
+  },
+  model: {
+    params: {
+      temperature: '孝械屑锌械褉邪褌褍褉邪',
+      temperatureTip:
+        '袣芯薪褌褉芯谢褞褦 胁懈锌邪写泻芯胁褨褋褌褜: 蟹屑械薪褕械薪薪褟 锌褉懈蟹胁芯写懈褌褜 写芯 屑械薪褕 胁懈锌邪写泻芯胁懈褏 蟹邪胁械褉褕械薪褜. 袣芯谢懈 褌械屑锌械褉邪褌褍褉邪 薪邪斜谢懈卸邪褦褌褜褋褟 写芯 薪褍谢褟, 屑芯写械谢褜 褋褌邪薪械 写械褌械褉屑褨薪芯胁邪薪芯褞 褌邪 锌芯胁褌芯褉褞胁邪薪芯褞.',
+      top_p: '孝芯锌 P',
+      top_pTip:
+        '袣芯薪褌褉芯谢褞褦 褉褨蟹薪芯屑邪薪褨褌薪褨褋褌褜 蟹邪 写芯锌芯屑芯谐芯褞 胁懈斜褨褉泻懈 褟写褉邪: 0,5 芯蟹薪邪褔邪褦, 褖芯 褉芯蟹谐谢褟写邪褦褌褜褋褟 锌芯谢芯胁懈薪邪 胁褋褨褏 蟹胁邪卸械薪懈褏 蟹邪 泄屑芯胁褨褉薪褨褋褌褞 胁邪褉褨邪薪褌褨胁.',
+      presence_penalty: '楔褌褉邪褎 蟹邪 锌褉懈褋褍褌薪褨褋褌褜',
+      presence_penaltyTip:
+        '袧邪褋泻褨谢褜泻懈 褕褌褉邪褎褍胁邪褌懈 薪芯胁褨 褌芯泻械薪懈 蟹邪谢械卸薪芯 胁褨写 褌芯谐芯, 褔懈 蟹\'褟胁谢褟褞褌褜褋褟 胁芯薪懈 胁 褌械泻褋褌褨 锌芯泻懈 褖芯.\n袟斜褨谢褜褕褍褦 泄屑芯胁褨褉薪褨褋褌褜 褌芯谐芯, 褖芯 屑芯写械谢褜 谐芯胁芯褉懈褌懈屑械 锌褉芯 薪芯胁褨 褌械屑懈.',
+      frequency_penalty: '楔褌褉邪褎 蟹邪 褔邪褋褌芯褌褍',
+      frequency_penaltyTip:
+        '袧邪褋泻褨谢褜泻懈 褕褌褉邪褎褍胁邪褌懈 薪芯胁褨 褌芯泻械薪懈 薪邪 芯褋薪芯胁褨 褩褏薪褜芯褩 褨褋薪褍褞褔芯褩 褔邪褋褌芯褌懈 胁 褌械泻褋褌褨.\n袟屑械薪褕褍褦 泄屑芯胁褨褉薪褨褋褌褜 褌芯谐芯, 褖芯 屑芯写械谢褜 锌芯胁褌芯褉褞胁邪褌懈屑械 褌芯泄 褋邪屑懈泄 褉褟写芯泻 写芯褋谢褨胁薪芯.',
+      max_tokens: '袦邪泻褋. 褌芯泻械薪褨胁',
+      max_tokensTip:
+        '袙懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 芯斜屑械卸械薪薪褟 屑邪泻褋懈屑邪谢褜薪芯褩 写芯胁卸懈薪懈 胁褨写锌芯胁褨写褨 胁 褌芯泻械薪邪褏.\n袘褨谢褜褕褨 蟹薪邪褔械薪薪褟 屑芯卸褍褌褜 芯斜屑械卸懈褌懈 锌褉芯褋褌褨褉, 蟹邪谢懈褕械薪懈泄 写谢褟 锌褨写泻邪蟹芯泻, 卸褍褉薪邪谢褨胁 褔邪褌褨胁 褨 蟹薪邪薪褜.\n袪械泻芯屑械薪写褍褦褌褜褋褟 胁褋褌邪薪芯胁懈褌懈 蟹薪邪褔械薪薪褟 薪懈卸褔械 写胁芯褏 褌褉械褌懈薪\ngpt-4-1106-preview, gpt-4-vision-preview max token (胁褏褨写 128k, 胁懈褏褨写 4k)',
+      maxTokenSettingTip: '袙邪褕械 屑邪泻褋懈屑邪谢褜薪械 蟹薪邪褔械薪薪褟 褌芯泻械薪邪 胁械谢懈泻械, 褖芯 屑芯卸械 芯斜屑械卸褍胁邪褌懈 锌褉芯褋褌褨褉 写谢褟 蟹邪锌懈褌褨胁, 写邪薪懈褏 褌芯褖芯. 袣褉邪褖械 薪邪谢邪褕褌褍胁邪褌懈 泄芯谐芯 屑械薪褕 褟泻 2/3.',
+      setToCurrentModelMaxTokenTip: '袦邪泻褋懈屑邪谢褜薪懈泄 褌芯泻械薪 芯薪芯胁谢械薪芯 写芯 屑邪泻褋懈屑褍屑褍 褌芯泻械薪邪 锌芯褌芯褔薪芯褩 屑芯写械谢褨 {{maxToken}}.',
+      stop_sequences: '袟褍锌懈薪懈褌懈 锌芯褋谢褨写芯胁薪芯褋褌褨',
+      stop_sequencesTip: '袛芯 褔芯褌懈褉褜芯褏 锌芯褋谢褨写芯胁薪芯褋褌械泄, 褍 褟泻懈褏 API 锌褉懈锌懈薪懈褌褜 谐械薪械褉邪褑褨褞 锌芯写邪谢褜褕懈褏 褌芯泻械薪褨胁. 袩芯胁械褉薪械薪懈泄 褌械泻褋褌 薪械 屑褨褋褌懈褌懈屑械 蟹褍锌懈薪泻褍 锌芯褋谢褨写芯胁薪芯褋褌褨.',
+      stop_sequencesPlaceholder: '袙胁械写褨褌褜 锌芯褋谢褨写芯胁薪褨褋褌褜 褨 薪邪褌懈褋薪褨褌褜 Tab',
+    },
+    tone: {
+      Creative: '袣褉械邪褌懈胁薪懈泄',
+      Balanced: '袟斜邪谢邪薪褋芯胁邪薪懈泄',
+      Precise: '孝芯褔薪懈泄',
+      Custom: '袣芯褉懈褋褌褍胁邪褑褜泻懈泄',
+    },
+    addMoreModel: '袩械褉械泄写褨褌褜 写芯 薪邪谢邪褕褌褍胁邪薪褜, 褖芯斜 写芯写邪褌懈 斜褨谢褜褕械 屑芯写械谢械泄',
+    settingsLink: '袧邪谢邪褕褌褍胁邪薪薪褟 锌芯褋褌邪褔邪谢褜薪懈泻邪 屑芯写械谢褨',
+    capabilities: '袦芯卸谢懈胁芯褋褌褨 MultiModal',
+  },
+  menus: {
+    status: '斜械褌邪',
+    explore: '袛芯褋谢褨写卸褍胁邪褌懈',
+    apps: '小褌褍写褨褟',
+    plugins: '袩谢邪谐褨薪懈',
+    pluginsTips: '袉薪褌械谐褉褍泄褌械 褋褌芯褉芯薪薪褨 锌谢邪谐褨薪懈 邪斜芯 褋褌胁芯褉褨褌褜 AI-褋褍屑褨褋薪褨 锌谢邪谐褨薪懈.',
+    datasets: '袟薪邪薪薪褟',
+    datasetsTips: '小袣袨袪袨:  褨屑锌芯褉褌褍泄褌械 胁谢邪褋薪褨 褌械泻褋褌芯胁褨 写邪薪褨 邪斜芯 锌懈褕褨褌褜 写邪薪褨 胁 褉械邪谢褜薪芯屑褍 褔邪褋褨 褔械褉械蟹 Webhook 写谢褟 锌芯泻褉邪褖械薪薪褟 泻芯薪褌械泻褋褌褍 LLM.',
+    newApp: '袧芯胁邪 锌褉芯谐褉邪屑邪',
+    newDataset: '小褌胁芯褉懈褌懈 蟹薪邪薪薪褟',
+    tools: '袉薪褋褌褉褍屑械薪褌懈',
+    exploreMarketplace: '袛褨蟹薪邪泄褌械褋褟 斜褨谢褜褕械 锌褉芯 Marketplace',
+  },
+  userProfile: {
+    settings: '袧邪谢邪褕褌褍胁邪薪薪褟',
+    emailSupport: '袩褨写褌褉懈屑泻邪 锌芯 械谢械泻褌褉芯薪薪褨泄 锌芯褕褌褨',
+    workspace: '袪芯斜芯褔懈泄 锌褉芯褋褌褨褉',
+    createWorkspace: '小褌胁芯褉懈褌懈 褉芯斜芯褔懈泄 锌褉芯褋褌褨褉',
+    helpCenter: '袛芯胁褨写泻芯胁懈泄 褑械薪褌褉',
+    communityFeedback: '胁褨写谐褍泻懈',
+    roadmap: '袛芯褉芯卸薪褟 泻邪褉褌邪',
+    community: '小锌褨谢褜薪芯褌邪',
+    about: '袩褉芯 薪邪褋',
+    logout: '袙懈泄褌懈',
+    compliance: '袙褨写锌芯胁褨写薪褨褋褌褜',
+    support: '袩褨写褌褉懈屑泻邪',
+    github: '袚褨褌褏邪斜',
+  },
+  settings: {
+    accountGroup: '袨袘袥袉袣袨袙袠袡 袟袗袩袠小',
+    workplaceGroup: '袪袨袘袨效袠袡 袩袪袨小孝袉袪',
+    account: '袦褨泄 芯斜谢褨泻芯胁懈泄 蟹邪锌懈褋',
+    members: '校褔邪褋薪懈泻懈',
+    billing: '袙懈褋褌邪胁谢械薪薪褟 褉邪褏褍薪泻褨胁',
+    integrations: '袉薪褌械谐褉邪褑褨褩',
+    language: '袦芯胁邪',
+    provider: '袩芯褋褌邪褔邪谢褜薪懈泻 屑芯写械谢褨',
+    dataSource: '袛卸械褉械谢芯 写邪薪懈褏',
+    plugin: '袩谢邪谐褨薪懈',
+    apiBasedExtension: '袪芯蟹褕懈褉械薪薪褟 API',
+    generalGroup: '袟袗袚袗袥鞋袧袝',
+  },
+  account: {
+    avatar: '袗胁邪褌邪褉',
+    name: '袉屑\'褟',
+    email: '袝谢械泻褌褉芯薪薪邪 锌芯褕褌邪',
+    password: '袩邪褉芯谢褜',
+    passwordTip: '袙懈 屑芯卸械褌械 胁褋褌邪薪芯胁懈褌懈 锌芯褋褌褨泄薪懈泄 锌邪褉芯谢褜, 褟泻褖芯 薪械 褏芯褔械褌械 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 褌懈屑褔邪褋芯胁褨 泻芯写懈 写谢褟 胁褏芯写褍',
+    setPassword: '袙褋褌邪薪芯胁懈褌懈 锌邪褉芯谢褜',
+    resetPassword: '小泻懈薪褍褌懈 锌邪褉芯谢褜',
+    currentPassword: '袩芯褌芯褔薪懈泄 锌邪褉芯谢褜',
+    newPassword: '袧芯胁懈泄 锌邪褉芯谢褜',
+    confirmPassword: '袩褨写褌胁械褉写褨褌褜 锌邪褉芯谢褜',
+    notEqual: '袛胁邪 锌邪褉芯谢褨 褉褨蟹薪褟褌褜褋褟.',
+    langGeniusAccount: '袨斜谢褨泻芯胁懈泄 蟹邪锌懈褋 Dify',
+    langGeniusAccountTip: '袙邪褕 芯斜谢褨泻芯胁懈泄 蟹邪锌懈褋 Dify 褌邪 锌芯胁鈥櫻徯沸靶窖� 蟹 薪懈屑 写邪薪褨 泻芯褉懈褋褌褍胁邪褔邪.',
+    editName: '袪械写邪谐褍胁邪褌懈 褨屑\'褟',
+    showAppLength: '袩芯泻邪蟹邪褌懈 {{length}} 锌褉芯谐褉邪屑',
+    delete: '袙懈写邪谢懈褌懈 芯斜谢褨泻芯胁懈泄 蟹邪锌懈褋',
+    deleteTip: '袙懈写邪谢械薪薪褟 胁邪褕芯谐芯 芯斜谢褨泻芯胁芯谐芯 蟹邪锌懈褋褍 锌褉懈蟹胁械写械 写芯 芯褋褌邪褌芯褔薪芯谐芯 胁懈写邪谢械薪薪褟 胁褋褨褏 胁邪褕懈褏 写邪薪懈褏, 褨 褩褏 薪械屑芯卸谢懈胁芯 斜褍写械 胁褨写薪芯胁懈褌懈.',
+    deleteConfirmTip: '些芯斜 锌褨写褌胁械褉写懈褌懈, 斜褍写褜 谢邪褋泻邪, 薪邪写褨褕谢褨褌褜 薪邪褋褌褍锌薪械 蟹 胁邪褕芯褩 蟹邪褉械褦褋褌褉芯胁邪薪芯褩 械谢械泻褌褉芯薪薪芯褩 锌芯褕褌懈 薪邪 ',
+    account: '袪邪褏褍薪芯泻',
+    studio: '小褌褍写褨褟 Dify',
+    myAccount: '袨褋芯斜懈褋褌懈泄 泻邪斜褨薪械褌',
+    deletePrivacyLink: '袩芯谢褨褌懈泻邪 泻芯薪褎褨写械薪褑褨泄薪芯褋褌褨.',
+    sendVerificationButton: '袧邪写褨褕谢褨褌褜 泻芯写 锌褨写褌胁械褉写卸械薪薪褟',
+    verificationLabel: '袣芯写 锌褨写褌胁械褉写卸械薪薪褟',
+    verificationPlaceholder: '袙褋褌邪胁褌械 6-蟹薪邪褔薪懈泄 泻芯写',
+    permanentlyDeleteButton: '袧邪蟹邪胁卸写懈 胁懈写邪谢懈褌懈 芯斜谢褨泻芯胁懈泄 蟹邪锌懈褋',
+    feedbackTitle: '袟胁芯褉芯褌薪懈泄 蟹胁\'褟蟹芯泻',
+    feedbackLabel: '袪芯蟹泻邪卸褨褌褜, 褔芯屑褍 胁懈 胁懈写邪谢懈谢懈 褋胁褨泄 芯斜谢褨泻芯胁懈泄 蟹邪锌懈褋?',
+    feedbackPlaceholder: '袧械芯斜芯胁\'褟蟹泻芯胁芯',
+    deletePrivacyLinkTip: '袛谢褟 芯褌褉懈屑邪薪薪褟 写芯写邪褌泻芯胁芯褩 褨薪褎芯褉屑邪褑褨褩 锌褉芯 褌械, 褟泻 屑懈 芯斜褉芯斜谢褟褦屑芯 胁邪褕褨 写邪薪褨, 斜褍写褜 谢邪褋泻邪, 锌械褉械谐谢褟薪褜褌械 薪邪褕',
+    deleteSuccessTip: '袙邪褕芯屑褍 芯斜谢褨泻芯胁芯屑褍 蟹邪锌懈褋褍 锌芯褌褉褨斜械薪 褔邪褋, 褖芯斜 蟹邪胁械褉褕懈褌懈 胁懈写邪谢械薪薪褟. 袦懈 薪邪写褨褕谢械屑芯 胁邪屑 械谢械泻褌褉芯薪薪芯谐芯 谢懈褋褌邪, 泻芯谢懈 胁褋械 斜褍写械 谐芯褌芯胁芯.',
+    deleteLabel: '袛谢褟 锌褨写褌胁械褉写卸械薪薪褟, 斜褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 褋胁芯褞 械谢械泻褌褉芯薪薪褍 锌芯褕褌褍 薪懈卸褔械',
+    deletePlaceholder: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 褋胁芯褞 械谢械泻褌褉芯薪薪褍 锌芯褕褌褍',
+    workspaceName: '袧邪蟹胁邪 褉芯斜芯褔芯谐芯 锌褉芯褋褌芯褉褍',
+    workspaceIcon: '袉泻芯薪泻邪 褉芯斜芯褔芯谐芯 锌褉芯褋褌芯褉褍',
+    editWorkspaceInfo: '袪械写邪谐褍胁邪褌懈 褨薪褎芯褉屑邪褑褨褞 锌褉芯 褉芯斜芯褔懈泄 锌褉芯褋褌褨褉',
+  },
+  members: {
+    team: '袣芯屑邪薪写邪',
+    invite: '袛芯写邪褌懈',
+    name: '袉袦\'携',
+    lastActive: '袨小孝袗袧袧携 袗袣孝袠袙袧袉小孝鞋',
+    role: '袪袨袥袉',
+    pending: '袙 芯褔褨泻褍胁邪薪薪褨...',
+    owner: '袙谢邪褋薪懈泻',
+    admin: '袗写屑褨薪褨褋褌褉邪褌芯褉',
+    adminTip: '袦芯卸械 褋褌胁芯褉褞胁邪褌懈 锌褉芯谐褉邪屑懈 褌邪 泻械褉褍胁邪褌懈 薪邪谢邪褕褌褍胁邪薪薪褟屑懈 泻芯屑邪薪写懈',
+    normal: '袟胁懈褔邪泄薪懈泄',
+    normalTip: '袦芯卸械 谢懈褕械 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 锌褉芯谐褉邪屑懈, 薪械 屑芯卸械 褋褌胁芯褉褞胁邪褌懈 锌褉芯谐褉邪屑懈',
+    editor: '袪械写邪泻褌芯褉',
+    editorTip: '袦芯卸械 褋褌胁芯褉褞胁邪褌懈 锌褉芯谐褉邪屑懈, 邪谢械 薪械 屑芯卸械 泻械褉褍胁邪褌懈 薪邪谢邪褕褌褍胁邪薪薪褟屑懈 泻芯屑邪薪写懈',
+    inviteTeamMember: '袛芯写邪褌懈 褍褔邪褋薪懈泻邪 泻芯屑邪薪写懈',
+    inviteTeamMemberTip: '袙芯薪懈 蟹屑芯卸褍褌褜 芯褌褉懈屑邪褌懈 写芯褋褌褍锌 写芯 写邪薪懈褏 胁邪褕芯褩 泻芯屑邪薪写懈 斜械蟹锌芯褋械褉械写薪褜芯 锌褨褋谢褟 胁褏芯写褍.',
+    emailNotSetup: '袩芯褕褌芯胁懈泄 褋械褉胁械褉 薪械 薪邪谢邪褕褌芯胁邪薪懈泄, 褌芯屑褍 蟹邪锌褉芯褕械薪薪褟 械谢械泻褌褉芯薪薪芯褞 锌芯褕褌芯褞 薪械 屑芯卸褍褌褜 斜褍褌懈 薪邪写褨褋谢邪薪褨. 袘褍写褜 谢邪褋泻邪, 锌芯胁褨写芯屑褌械 泻芯褉懈褋褌褍胁邪褔褨胁 锌褉芯 锌芯褋懈谢邪薪薪褟 写谢褟 蟹邪锌褉芯褕械薪薪褟, 褟泻械 斜褍写械 胁懈写邪薪芯 锌褨褋谢褟 蟹邪锌褉芯褕械薪薪褟.',
+    email: '袝谢械泻褌褉芯薪薪邪 锌芯褕褌邪',
+    emailInvalid: '袧械写褨泄褋薪懈泄 褎芯褉屑邪褌 械谢械泻褌褉芯薪薪芯褩 锌芯褕褌懈',
+    emailPlaceholder: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 邪写褉械褋褍 械谢械泻褌褉芯薪薪芯褩 锌芯褕褌懈',
+    sendInvite: '袧邪写褨褋谢邪褌懈 蟹邪锌褉芯褕械薪薪褟',
+    invitedAsRole: '袟邪锌褉芯褕械薪芯 褟泻 泻芯褉懈褋褌褍胁邪褔邪 {{role}}',
+    invitationSent: '袟邪锌褉芯褕械薪薪褟 薪邪写褨褋谢邪薪芯',
+    invitationSentTip: '袟邪锌褉芯褕械薪薪褟 薪邪写褨褋谢邪薪芯, 褨 胁芯薪懈 屑芯卸褍褌褜 褍胁褨泄褌懈 胁 Dify, 褖芯斜 芯褌褉懈屑邪褌懈 写芯褋褌褍锌 写芯 写邪薪懈褏 胁邪褕芯褩 泻芯屑邪薪写懈.',
+    invitationLink: '袩芯褋懈谢邪薪薪褟 薪邪 蟹邪锌褉芯褕械薪薪褟',
+    failedInvitationEmails: '袧邪褋褌褍锌薪懈褏 泻芯褉懈褋褌褍胁邪褔褨胁 薪械 斜褍谢芯 褍褋锌褨褕薪芯 蟹邪锌褉芯褕械薪芯',
+    ok: '袨袣',
+    removeFromTeam: '袙懈写邪谢懈褌懈 蟹 泻芯屑邪薪写懈',
+    removeFromTeamTip: '袘褍写械 胁懈写邪谢械薪芯 写芯褋褌褍锌 写芯 泻芯屑邪薪写懈',
+    setAdmin: '袩褉懈蟹薪邪褔懈褌懈 邪写屑褨薪褨褋褌褉邪褌芯褉芯屑',
+    setMember: '袙褋褌邪薪芯胁懈褌懈 褟泻 蟹胁懈褔邪泄薪芯谐芯 褔谢械薪邪',
+    setEditor: '袙褋褌邪薪芯胁懈褌懈 褟泻 袪械写邪泻褌芯褉',
+    disInvite: '小泻邪褋褍胁邪褌懈 蟹邪锌褉芯褕械薪薪褟',
+    deleteMember: '袙懈写邪谢懈褌懈 褍褔邪褋薪懈泻邪',
+    you: '(袙懈)',
+    builder: '袘褍写褨胁薪懈泻',
+    datasetOperatorTip: '孝褨谢褜泻懈 屑芯卸械 褍锌褉邪胁谢褟褌懈 斜邪蟹芯褞 蟹薪邪薪褜',
+    datasetOperator: '袗写屑褨薪褨褋褌褉邪褌芯褉 蟹薪邪薪褜',
+    setBuilder: '袙褋褌邪薪芯胁懈褌懈 褟泻 斜褍写褨胁械谢褜薪懈泻',
+    builderTip: '袦芯卸械 褋褌胁芯褉褞胁邪褌懈 褌邪 褉械写邪谐褍胁邪褌懈 胁谢邪褋薪褨 锌褉芯谐褉邪屑懈',
+  },
+  integrations: {
+    connected: '袩褨写泻谢褞褔械薪芯',
+    google: 'Google',
+    googleAccount: '校胁褨泄褌懈 蟹邪 写芯锌芯屑芯谐芯褞 芯斜谢褨泻芯胁芯谐芯 蟹邪锌懈褋褍 Google',
+    github: 'GitHub',
+    githubAccount: '校胁褨泄褌懈 蟹邪 写芯锌芯屑芯谐芯褞 芯斜谢褨泻芯胁芯谐芯 蟹邪锌懈褋褍 GitHub',
+    connect: '袩褨写泻谢褞褔懈褌懈',
+  },
+  language: {
+    displayLanguage: '袦芯胁邪 褨薪褌械褉褎械泄褋褍',
+    timezone: '效邪褋芯胁懈泄 锌芯褟褋',
+  },
+  provider: {
+    apiKey: '袣谢褞褔 API',
+    enterYourKey: '袙胁械写褨褌褜 褋胁褨泄 泻谢褞褔 API 褌褍褌',
+    invalidKey: '袧械写褨泄褋薪懈泄 泻谢褞褔 OpenAI API',
+    validatedError: '袧械 胁写邪谢芯褋褟 锌褨写褌胁械褉写懈褌懈: ',
+    validating: '袩械褉械胁褨褉泻邪 泻谢褞褔邪...',
+    saveFailed: '袧械 胁写邪谢芯褋褟 蟹斜械褉械谐褌懈 泻谢褞褔 API',
+    apiKeyExceedBill: '校 褑褜芯谐芯 泻谢褞褔邪 API 薪械屑邪褦 写芯褋褌褍锌薪芯褩 泻胁芯褌懈, 斜褍写褜 谢邪褋泻邪, 锌褉芯褔懈褌邪泄褌械',
+    addKey: '袛芯写邪褌懈 泻谢褞褔',
+    comingSoon: '小泻芯褉芯',
+    editKey: '袪械写邪谐褍胁邪褌懈',
+    invalidApiKey: '袧械写褨泄褋薪懈泄 API 泻谢褞褔',
+    azure: {
+      apiBase: 'API-褕谢褟褏',
+      apiBasePlaceholder: '袘邪蟹芯胁懈泄 URL-邪写褉械褋邪 API 胁邪褕芯褩 泻褨薪褑械胁芯褩 褌芯褔泻懈 Azure OpenAI.',
+      apiKey: '袣谢褞褔 API',
+      apiKeyPlaceholder: '袙胁械写褨褌褜 褋胁褨泄 泻谢褞褔 API 褌褍褌',
+      helpTip: '袛褨蟹薪邪泄褌械褋褟 锌褉芯 锌芯褋谢褍谐褍 Azure OpenAI',
+    },
+    openaiHosted: {
+      openaiHosted: '袪芯蟹屑褨褖械薪懈泄 OpenAI',
+      onTrial: '袧袗 袩袪袨袘袧袨袦校 袩袝袪袉袨袛袉',
+      exhausted: '袣袙袨孝袗 袙袠效袝袪袩袗袧袗',
+      desc: '小谢褍卸斜邪 褏芯褋褌懈薪谐褍 OpenAI, 薪邪写邪薪邪 Dify, 写芯蟹胁芯谢褟褦 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 褌邪泻褨 屑芯写械谢褨, 褟泻 GPT-3.5. 袩械褉褕 薪褨卸 胁邪褕邪 锌褉芯斜薪邪 泻胁芯褌邪 斜褍写械 胁懈泻芯褉懈褋褌邪薪邪, 胁邪屑 锌芯褌褉褨斜薪芯 薪邪谢邪褕褌褍胁邪褌懈 褨薪褕褨 锌芯褋褌邪褔邪谢褜薪懈泻懈 屑芯写械谢褨.',
+      callTimes: '袣褨谢褜泻褨褋褌褜 胁懈泻谢懈泻褨胁',
+      usedUp: '袩褉芯斜薪邪 泻胁芯褌邪 胁懈泻芯褉懈褋褌邪薪邪. 袛芯写邪泄褌械 胁谢邪褋薪芯谐芯 锌芯褋褌邪褔邪谢褜薪懈泻邪 屑芯写械谢褨.',
+      useYourModel: '袧邪褉邪蟹褨 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 胁谢邪褋薪懈泄 锌芯褋褌邪褔邪谢褜薪懈泻 屑芯写械谢褨.',
+      close: '袟邪泻褉懈褌懈',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: '袧袗 袩袪袨袘袧袨袦校 袩袝袪袉袨袛袉',
+      exhausted: '袣袙袨孝袗 袙袠效袝袪袩袗袧袗',
+      desc: '笑褟 锌芯褌褍卸薪邪 屑芯写械谢褜 褔褍写芯胁芯 褋锌褉邪胁谢褟褦褌褜褋褟 蟹 褕懈褉芯泻懈屑 褋锌械泻褌褉芯屑 蟹邪胁写邪薪褜: 胁褨写 褋泻谢邪写薪懈褏 写褨邪谢芯谐褨胁 褨 褋褌胁芯褉械薪薪褟 泻褉械邪褌懈胁薪芯谐芯 泻芯薪褌械薪褌褍 写芯 写芯泻谢邪写薪懈褏 褨薪褋褌褉褍泻褑褨泄.',
+      callTimes: '袣褨谢褜泻褨褋褌褜 胁懈泻谢懈泻褨胁',
+      usedUp: '袩褉芯斜薪邪 泻胁芯褌邪 胁懈泻芯褉懈褋褌邪薪邪. 袛芯写邪泄褌械 胁谢邪褋薪芯谐芯 锌芯褋褌邪褔邪谢褜薪懈泻邪 屑芯写械谢褨.',
+      useYourModel: '袧邪褉邪蟹褨 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 胁谢邪褋薪懈泄 锌芯褋褌邪褔邪谢褜薪懈泻邪 屑芯写械谢褨.',
+      close: '袟邪泻褉懈褌懈',
+      trialQuotaTip: '袙邪褕邪 泻胁芯褌邪 薪邪 邪薪褌褉芯锌褨褔薪褨 锌褉芯斜薪褨 胁懈锌褉芯斜褍胁邪薪薪褟 蟹邪泻褨薪褔褍褦褌褜褋褟 11.03.2025 褨 锌褨褋谢褟 褑褜芯谐芯 斜褨谢褜褕械 薪械 斜褍写械 写芯褋褌褍锌薪邪. 袘褍写褜 谢邪褋泻邪, 褋泻芯褉懈褋褌邪泄褌械褋褟 薪懈屑 胁褔邪褋薪芯.',
+    },
+    anthropic: {
+      using: '肖褍薪泻褑褨褟 胁斜褍写芯胁褍胁邪薪薪褟 胁懈泻芯褉懈褋褌芯胁褍褦',
+      enableTip: '些芯斜 邪泻褌懈胁褍胁邪褌懈 屑芯写械谢褜 Anthropic, 褋锌芯褔邪褌泻褍 锌芯褌褉褨斜薪芯 锌褉懈胁鈥櫻徯沸把傂秆佈� 写芯 OpenAI 邪斜芯 Azure OpenAI Service.',
+      notEnabled: '袧械 邪泻褌懈胁芯胁邪薪芯',
+      keyFrom: '袨褌褉懈屑邪泄褌械 泻谢褞褔 API 胁褨写 Anthropic',
+    },
+    encrypted: {
+      front: '袙邪褕 API-泻谢褞褔 斜褍写械 蟹邪褕懈褎褉芯胁邪薪懈泄 褌邪 蟹斜械褉械卸械薪懈泄 蟹邪 写芯锌芯屑芯谐芯褞',
+      back: ' 褌械褏薪芯谢芯谐褨褩.',
+    },
+  },
+  modelProvider: {
+    notConfigured: '小懈褋褌械屑薪褍 屑芯写械谢褜 褖械 薪械 锌芯胁薪褨褋褌褞 薪邪谢邪褕褌芯胁邪薪芯, 褨 写械褟泻褨 褎褍薪泻褑褨褩 屑芯卸褍褌褜 斜褍褌懈 薪械写芯褋褌褍锌薪褨.',
+    systemModelSettings: '袧邪谢邪褕褌褍胁邪薪薪褟 褋懈褋褌械屑薪芯褩 屑芯写械谢褨',
+    systemModelSettingsLink: '效芯屑褍 薪械芯斜褏褨写薪芯 薪邪谢邪褕褌芯胁褍胁邪褌懈 褋懈褋褌械屑薪褍 屑芯写械谢褜?',
+    selectModel: '袙懈斜械褉褨褌褜 褋胁芯褞 屑芯写械谢褜',
+    setupModelFirst: '袘褍写褜 谢邪褋泻邪, 褋锌芯褔邪褌泻褍 薪邪谢邪褕褌褍泄褌械 褋胁芯褞 屑芯写械谢褜',
+    systemReasoningModel: {
+      key: '小懈褋褌械屑薪邪 屑芯写械谢褜 屑褨褉泻褍胁邪薪薪褟',
+      tip: '袙褋褌邪薪芯胁褨褌褜 屑芯写械谢褜 胁懈褋薪芯胁泻褍 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑, 褟泻邪 斜褍写械 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈褋褟 写谢褟 褋褌胁芯褉械薪薪褟 锌褉芯谐褉邪屑, 邪 褌邪泻芯卸 写谢褟 褌邪泻懈褏 褎褍薪泻褑褨泄, 褟泻 谐械薪械褉邪褑褨褟 褨屑械薪褨 写褨邪谢芯谐褍 褌邪 锌褉芯锌芯蟹懈褑褨褟 薪邪褋褌褍锌薪芯谐芯 锌懈褌邪薪薪褟 褌邪泻芯卸 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈屑褍褌褜 屑芯写械谢褜 胁懈褋薪芯胁泻褍 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑.',
+    },
+    embeddingModel: {
+      key: '袦芯写械谢褜 胁斜褍写芯胁褍胁邪薪薪褟',
+      tip: '袙褋褌邪薪芯胁褨褌褜 屑芯写械谢褜 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑 写谢褟 芯斜褉芯斜泻懈 胁斜褍写芯胁褍胁邪薪薪褟 写芯泻褍屑械薪褌邪 褍 袟薪邪薪薪褟, 褟泻 锌芯褕褍泻, 褌邪泻 褨 褨屑锌芯褉褌 袟薪邪薪褜 胁懈泻芯褉懈褋褌芯胁褍褞褌褜 褑褞 屑芯写械谢褜 胁斜褍写芯胁褍胁邪薪薪褟 写谢褟 胁械泻褌芯褉懈蟹邪褑褨褩. 袩械褉械屑懈泻邪薪薪褟 锌褉懈蟹胁械写械 写芯 薪械胁褨写锌芯胁褨写薪芯褋褌褨 褉芯蟹屑褨褉薪芯褋褌褨 胁械泻褌芯褉邪 屑褨卸 褨屑锌芯褉褌芯胁邪薪懈屑懈 袟薪邪薪薪褟屑懈 褌邪 蟹邪锌懈褌邪薪薪褟屑, 褖芯 锌褉懈蟹胁械写械 写芯 蟹斜芯褞 锌芯褕褍泻褍. 些芯斜 褍薪懈泻薪褍褌懈 蟹斜芯褩胁 锌芯褕褍泻褍, 薪械 锌械褉械屑懈泻邪泄褌械 褑褞 屑芯写械谢褜 斜械蟹 锌褨写褋褌邪胁.',
+      required: '袦芯写械谢褜 胁斜褍写芯胁褍胁邪薪薪褟 芯斜芯胁鈥櫻徯沸盒拘残�',
+    },
+    speechToTextModel: {
+      key: '袦芯写械谢褜 锌械褉械褌胁芯褉械薪薪褟 屑芯胁谢械薪薪褟 胁 褌械泻褋褌',
+      tip: '袙褋褌邪薪芯胁褨褌褜 屑芯写械谢褜 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑 写谢褟 胁胁械写械薪薪褟 屑芯胁谢械薪薪褟 胁 褌械泻褋褌 锌褨写 褔邪褋 褉芯蟹屑芯胁懈.',
+    },
+    ttsModel: {
+      key: '袦芯写械谢褜 锌械褉械褌胁芯褉械薪薪褟 褌械泻褋褌褍 胁 屑芯胁谢械薪薪褟',
+      tip: '袙褋褌邪薪芯胁褨褌褜 屑芯写械谢褜 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑 写谢褟 胁胁械写械薪薪褟 褌械泻褋褌褍 胁 屑芯胁谢械薪薪褟 胁 褉芯蟹屑芯胁褨.',
+    },
+    rerankModel: {
+      key: '袦芯写械谢褜 锌芯胁褌芯褉薪芯谐芯 褉邪薪卸褍胁邪薪薪褟',
+      tip: '袦芯写械谢褜 锌芯胁褌芯褉薪芯谐芯 褉邪薪卸褍胁邪薪薪褟 蟹屑褨薪懈褌褜 锌芯褉褟写芯泻 褋锌懈褋泻褍 写芯泻褍屑械薪褌褨胁-泻邪薪写懈写邪褌褨胁 薪邪 芯褋薪芯胁褨 褋械屑邪薪褌懈褔薪芯褩 胁褨写锌芯胁褨写薪芯褋褌褨 蟹邪锌懈褌褍 泻芯褉懈褋褌褍胁邪褔邪, 锌芯泻褉邪褖褍褞褔懈 褉械蟹褍谢褜褌邪褌懈 褋械屑邪薪褌懈褔薪芯谐芯 褉邪薪卸褍胁邪薪薪褟.',
+    },
+    quota: '袣胁芯褌邪',
+    searchModel: '袩芯褕褍泻芯胁邪 屑芯写械谢褜',
+    noModelFound: '袦芯写械谢褜 写谢褟 {{model}} 薪械 蟹薪邪泄写械薪芯',
+    models: '袦芯写械谢褨',
+    showMoreModelProvider: '袩芯泻邪蟹邪褌懈 斜褨谢褜褕械 锌芯褋褌邪褔邪谢褜薪懈泻褨胁 屑芯写械谢械泄',
+    selector: {
+      tip: '笑褞 屑芯写械谢褜 斜褍谢芯 胁懈写邪谢械薪芯. 袘褍写褜 谢邪褋泻邪, 写芯写邪泄褌械 屑芯写械谢褜 邪斜芯 胁懈斜械褉褨褌褜 褨薪褕褍.',
+      emptyTip: '袛芯褋褌褍锌薪褨 屑芯写械谢褨 胁褨写褋褍褌薪褨',
+      emptySetting: '袩械褉械泄写褨褌褜 写芯 薪邪谢邪褕褌褍胁邪薪褜, 褖芯斜 薪邪谢邪褕褌褍胁邪褌懈',
+      rerankTip: '袘褍写褜 谢邪褋泻邪, 薪邪谢邪褕褌褍泄褌械 屑芯写械谢褜 锌芯胁褌芯褉薪芯谐芯 褉邪薪卸褍胁邪薪薪褟',
+    },
+    card: {
+      quota: '袣袙袨孝袗',
+      onTrial: '校 锌褉芯斜薪芯屑褍 锌械褉褨芯写褨',
+      paid: '袨锌谢邪褔械薪芯',
+      quotaExhausted: '袣胁芯褌褍 胁懈褔械褉锌邪薪芯',
+      callTimes: '袣褨谢褜泻褨褋褌褜 胁懈泻谢懈泻褨胁',
+      tokens: '孝芯泻械薪懈',
+      buyQuota: '袩褉懈写斜邪褌懈 泻胁芯褌褍',
+      priorityUse: '袩褉褨芯褉懈褌械褌薪械 胁懈泻芯褉懈褋褌邪薪薪褟',
+      removeKey: '袙懈写邪谢懈褌懈 泻谢褞褔 API',
+      tip: '袩褉褨芯褉懈褌械褌 斜褍写械 薪邪写邪薪芯 芯锌谢邪褔械薪褨泄 泻胁芯褌褨. 袩褉芯斜薪邪 泻胁芯褌邪 斜褍写械 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈褋褟 锌褨褋谢褟 胁懈褔械褉锌邪薪薪褟 锌谢邪褌薪芯褩 泻胁芯褌懈.',
+    },
+    item: {
+      deleteDesc: '{{modelName}} 胁懈泻芯褉懈褋褌芯胁褍褞褌褜褋褟 褟泻 褋懈褋褌械屑薪褨 屑芯写械谢褨 屑褨褉泻褍胁邪薪薪褟. 袛械褟泻褨 褎褍薪泻褑褨褩 斜褍写褍褌褜 薪械写芯褋褌褍锌薪褨 锌褨褋谢褟 胁懈写邪谢械薪薪褟. 袘褍写褜 谢邪褋泻邪, 锌褨写褌胁械褉写褜褌械.',
+      freeQuota: '袘袝袟袣袨楔孝袨袙袧袗 袣袙袨孝袗',
+    },
+    addApiKey: '袛芯写邪泄褌械 褋胁褨泄 泻谢褞褔 API',
+    invalidApiKey: '袧械写褨泄褋薪懈泄 泻谢褞褔 API',
+    encrypted: {
+      front: '袙邪褕 泻谢褞褔 API 斜褍写械 蟹邪褕懈褎褉芯胁邪薪懈泄 褌邪 蟹斜械褉械卸械薪懈泄 蟹邪 写芯锌芯屑芯谐芯褞',
+      back: ' 褌械褏薪芯谢芯谐褨褩.',
+    },
+    freeQuota: {
+      howToEarn: '携泻 蟹邪褉芯斜懈褌懈',
+    },
+    addMoreModelProvider: '袛袨袛袗孝袠 袘袉袥鞋楔袝 袩袨小孝袗效袗袥鞋袧袠袣袉袙 袦袨袛袝袥袝袡',
+    addModel: '袛芯写邪褌懈 屑芯写械谢褜',
+    modelsNum: '{{num}} 屑芯写械谢械泄',
+    showModels: '袩芯泻邪蟹邪褌懈 屑芯写械谢褨',
+    showModelsNum: '袩芯泻邪蟹邪褌懈 {{num}} 屑芯写械谢械泄',
+    collapse: '袟谐芯褉薪褍褌懈',
+    config: '袧邪谢邪褕褌褍胁邪薪薪褟',
+    modelAndParameters: '袦芯写械谢褜 褌邪 锌邪褉邪屑械褌褉懈',
+    model: '袦芯写械谢褜',
+    featureSupported: '{{feature}} 锌褨写褌褉懈屑褍褦褌褜褋褟',
+    callTimes: '袣褨谢褜泻褨褋褌褜 胁懈泻谢懈泻褨胁',
+    credits: '袣褉械写懈褌懈 锌芯胁褨写芯屑谢械薪褜',
+    buyQuota: '袩褉懈写斜邪褌懈 泻胁芯褌褍',
+    getFreeTokens: '袨褌褉懈屑邪褌懈 斜械蟹泻芯褕褌芯胁薪褨 褌芯泻械薪懈',
+    priorityUsing: '袩褉褨芯褉懈褌械蟹褍胁邪褌懈 胁懈泻芯褉懈褋褌邪薪薪褟',
+    deprecated: '袟邪褋褌邪褉褨谢懈泄',
+    confirmDelete: '锌褨写褌胁械褉写懈褌懈 胁懈写邪谢械薪薪褟?',
+    quotaTip: '袟邪谢懈褕懈谢芯褋褟 写芯褋褌褍锌薪懈褏 斜械蟹泻芯褕褌芯胁薪懈褏 褌芯泻械薪褨胁',
+    // If need adjustment, provide more context on 'Load Presets' function
+    loadPresets: '袟邪胁邪薪褌邪卸懈褌懈',
+    parameters: '袩袗袪袗袦袝孝袪袠',
+    apiKeyStatusNormal: '小褌邪褌褍褋 APIKey 薪芯褉屑邪谢褜薪懈泄',
+    loadBalancing: '袘邪谢邪薪褋褍胁邪薪薪褟 薪邪胁邪薪褌邪卸械薪薪褟',
+    editConfig: '袪械写邪谐褍胁邪褌懈 泻芯薪褎褨谐褍褉邪褑褨褞',
+    loadBalancingHeadline: '袘邪谢邪薪褋褍胁邪薪薪褟 薪邪胁邪薪褌邪卸械薪薪褟',
+    apiKey: 'API-袣袥挟效',
+    defaultConfig: '袣芯薪褎褨谐褍褉邪褑褨褟 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑',
+    providerManaged: '袩褨写 褍锌褉邪胁谢褨薪薪褟屑 锌褉芯胁邪泄写械褉邪',
+    loadBalancingDescription: '袟屑械薪褕褨褌褜 褌懈褋泻 蟹邪 写芯锌芯屑芯谐芯褞 泻褨谢褜泻芯褏 薪邪斜芯褉褨胁 芯斜谢褨泻芯胁懈褏 写邪薪懈褏.',
+    modelHasBeenDeprecated: '笑褟 屑芯写械谢褜 胁胁邪卸邪褦褌褜褋褟 蟹邪褋褌邪褉褨谢芯褞',
+    addConfig: '袛芯写邪褌懈 泻芯薪褎褨谐褍褉邪褑褨褞',
+    configLoadBalancing: '袘邪谢邪薪褋褍胁邪薪薪褟 薪邪胁邪薪褌邪卸械薪薪褟 泻芯薪褎褨谐褍褉邪褑褨褩',
+    upgradeForLoadBalancing: '袨薪芯胁褨褌褜 褋胁褨泄 锌谢邪薪, 褖芯斜 褍胁褨屑泻薪褍褌懈 斜邪谢邪薪褋褍胁邪薪薪褟 薪邪胁邪薪褌邪卸械薪薪褟.',
+    apiKeyRateLimit: '袘褍谢芯 写芯褋褟谐薪褍褌芯 谢褨屑褨褌褍 褕胁懈写泻芯褋褌褨, 写芯褋褌褍锌薪芯谐芯 锌褨褋谢褟 {{seconds}}',
+    providerManagedDescription: '袙懈泻芯褉懈褋褌芯胁褍泄褌械 褦写懈薪懈泄 薪邪斜褨褉 芯斜谢褨泻芯胁懈褏 写邪薪懈褏, 薪邪写邪薪懈泄 锌芯褋褌邪褔邪谢褜薪懈泻芯屑 屑芯写械谢褨.',
+    loadBalancingLeastKeyWarning: '些芯斜 褍胁褨屑泻薪褍褌懈 斜邪谢邪薪褋褍胁邪薪薪褟 薪邪胁邪薪褌邪卸械薪薪褟, 屑邪褦 斜褍褌懈 胁胁褨屑泻薪械薪芯 褖芯薪邪泄屑械薪褕械 2 泻谢邪胁褨褕褨.',
+    loadBalancingInfo: '袟邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑 写谢褟 斜邪谢邪薪褋褍胁邪薪薪褟 薪邪胁邪薪褌邪卸械薪薪褟 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 褋褌褉邪褌械谐褨褟 泻褉褍谐芯胁芯褩 褋懈褋褌械屑懈. 携泻褖芯 褋锌褉邪褑褜芯胁褍褦 芯斜屑械卸械薪薪褟 褕胁懈写泻芯褋褌褨, 斜褍写械 蟹邪褋褌芯褋芯胁邪薪芯 锌械褉褨芯写 锌械褉械蟹邪褉褟写泻懈 褌褉懈胁邪谢褨褋褌褞 1 褏胁懈谢懈薪邪.',
+    emptyProviderTip: '小锌芯褔邪褌泻褍 胁褋褌邪薪芯胁褨褌褜 锌芯褋褌邪褔邪谢褜薪懈泻邪 屑芯写械谢褨.',
+    installProvider: '袙褋褌邪薪芯胁谢械薪薪褟 锌芯褋褌邪褔邪谢褜薪懈泻褨胁 屑芯写械谢械泄',
+    toBeConfigured: '袩褨写谢褟谐邪褦 薪邪谢邪褕褌褍胁邪薪薪褞',
+    emptyProviderTitle: '袩芯褋褌邪褔邪谢褜薪懈泻邪 屑芯写械谢褨 薪械 薪邪谢邪褕褌芯胁邪薪芯',
+    configureTip: '袧邪谢邪褕褌褍泄褌械 api-泻谢褞褔 邪斜芯 写芯写邪泄褌械 屑芯写械谢褜 写谢褟 胁懈泻芯褉懈褋褌邪薪薪褟',
+    discoverMore: '袙褨写泻褉懈泄褌械 写谢褟 褋械斜械 斜褨谢褜褕械 胁',
+  },
+  dataSource: {
+    add: '袛芯写邪褌懈 写卸械褉械谢芯 写邪薪懈褏',
+    connect: '袩褨写泻谢褞褔懈褌懈',
+    notion: {
+      title: 'Notion',
+      description: '袙懈泻芯褉懈褋褌邪薪薪褟 Notion 褟泻 写卸械褉械谢邪 写邪薪懈褏 写谢褟 袟薪邪薪褜.',
+      connectedWorkspace: '袩褨写泻谢褞褔械薪懈泄 褉芯斜芯褔懈泄 锌褉芯褋褌褨褉',
+      addWorkspace: '袛芯写邪褌懈 褉芯斜芯褔懈泄 锌褉芯褋褌褨褉',
+      connected: '袩褨写泻谢褞褔械薪芯',
+      disconnected: '袙褨写泻谢褞褔械薪芯',
+      changeAuthorizedPages: '袟屑褨薪懈褌懈 邪胁褌芯褉懈蟹芯胁邪薪褨 褋褌芯褉褨薪泻懈',
+      pagesAuthorized: '袗胁褌芯褉懈蟹芯胁邪薪褨 褋褌芯褉褨薪泻懈',
+      sync: '小懈薪褏褉芯薪褨蟹褍胁邪褌懈',
+      remove: '袙懈写邪谢懈褌懈',
+      selector: {
+        pageSelected: '小褌芯褉褨薪泻懈 胁懈斜褉邪薪芯',
+        searchPages: '袩芯褕褍泻 褋褌芯褉褨薪芯泻 ...',
+        noSearchResult: '袪械蟹褍谢褜褌邪褌褨胁 锌芯褕褍泻褍 薪械屑邪褦',
+        addPages: '袛芯写邪褌懈 褋褌芯褉褨薪泻懈',
+        preview: '袩袝袪袝袛袩袝袪袝袚袥携袛',
+      },
+    },
+    website: {
+      with: '袟',
+      active: '袗泻褌懈胁薪懈泄',
+      inactive: '袧械邪泻褌懈胁薪褨',
+      configuredCrawlers: '袧邪谢邪褕褌芯胁邪薪褨 芯斜褏褨写薪褨 褉芯斜芯褌懈',
+      title: '袙械斜-褋褌芯褉褨薪泻邪',
+      description: '袉屑锌芯褉褌褍泄褌械 胁屑褨褋褌 褨蟹 胁械斜-褋邪泄褌褨胁 蟹邪 写芯锌芯屑芯谐芯褞 胁械斜-褋泻邪薪械褉邪.',
+    },
+    configure: '袧邪褋褌褉芯褩褌懈',
+  },
+  plugin: {
+    serpapi: {
+      apiKey: '袣谢褞褔 API',
+      apiKeyPlaceholder: '袙胁械写褨褌褜 褋胁褨泄 泻谢褞褔 API',
+      keyFrom: '袨褌褉懈屑邪泄褌械 褋胁褨泄 泻谢褞褔 SerpAPI 蟹褨 褋褌芯褉褨薪泻懈 芯斜谢褨泻芯胁芯谐芯 蟹邪锌懈褋褍 SerpAPI',
+    },
+  },
+  apiBasedExtension: {
+    title: 'API-褉芯蟹褕懈褉械薪薪褟 蟹邪斜械蟹锌械褔褍褞褌褜 褑械薪褌褉邪谢褨蟹芯胁邪薪械 泻械褉褍胁邪薪薪褟 API, 褋锌褉芯褖褍褞褔懈 泻芯薪褎褨谐褍褉邪褑褨褞 写谢褟 蟹褉褍褔薪芯谐芯 胁懈泻芯褉懈褋褌邪薪薪褟 胁 褉褨蟹薪懈褏 锌褉芯谐褉邪屑邪褏 Dify.',
+    link: '袛褨蟹薪邪泄褌械褋褟, 褟泻 褉芯蟹褉芯斜懈褌懈 胁谢邪褋薪械 褉芯蟹褕懈褉械薪薪褟 API.',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: '袛芯写邪褌懈 褉芯蟹褕懈褉械薪薪褟 API',
+    selector: {
+      title: '袪芯蟹褕懈褉械薪薪褟 API',
+      placeholder: '袙懈斜械褉褨褌褜 API 褉芯蟹褕懈褉械薪薪褟',
+      manage: '袣械褉褍胁邪褌懈 褉芯蟹褕懈褉械薪薪褟屑懈 API',
+    },
+    modal: {
+      title: '袛芯写邪褌懈 褉芯蟹褕懈褉械薪薪褟 API',
+      editTitle: '袪械写邪谐褍胁邪褌懈 褉芯蟹褕懈褉械薪薪褟 API',
+      name: {
+        title: '袉屑\'褟',
+        placeholder: '袙胁械写褨褌褜 褨屑\'褟',
+      },
+      apiEndpoint: {
+        title: '袣褨薪褑械胁邪 褌芯褔泻邪 API',
+        placeholder: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 泻褨薪褑械胁褍 褌芯褔泻褍 API',
+      },
+      apiKey: {
+        title: '袣谢褞褔 API',
+        placeholder: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 泻谢褞褔 API',
+        lengthError: '袛芯胁卸懈薪邪 API-泻谢褞褔邪 薪械 屑芯卸械 斜褍褌懈 屑械薪褜褕械 5 褋懈屑胁芯谢褨胁',
+      },
+    },
+    type: '孝懈锌',
+  },
+  about: {
+    changeLog: '袞褍褉薪邪谢 蟹屑褨薪',
+    updateNow: '袨薪芯胁懈褌懈 蟹邪褉邪蟹',
+    nowAvailable: 'Dify {{version}} 褌械锌械褉 写芯褋褌褍锌薪邪.',
+    latestAvailable: 'Dify {{version}} 鈥� 褑械 薪邪泄薪芯胁褨褕邪 写芯褋褌褍锌薪邪 胁械褉褋褨褟.',
+  },
+  appMenus: {
+    overview: '袦芯薪褨褌芯褉懈薪谐',
+    promptEng: '袧邪谢邪褕褌褍胁邪薪薪褟',
+    apiAccess: '袛芯褋褌褍锌 写芯 API',
+    logAndAnn: '袞褍褉薪邪谢懈 褌邪 袩芯胁褨写芯屑谢械薪薪褟.',
+    logs: '袞褍褉薪邪谢懈',
+  },
+  environment: {
+    testing: '孝袝小孝校袙袗袧袧携',
+    development: '袪袨袟袪袨袘袣袗',
+  },
+  appModes: {
+    completionApp: '袚械薪械褉邪褌芯褉 褌械泻褋褌褍',
+    chatApp: '效邪褌-写芯写邪褌芯泻',
+  },
+  datasetMenus: {
+    documents: '袛芯泻褍屑械薪褌懈',
+    hitTesting: '孝械褋褌褍胁邪薪薪褟 锌芯褕褍泻褍',
+    settings: '袧邪谢邪褕褌褍胁邪薪薪褟',
+    emptyTip: '袟薪邪薪薪褟 薪械 锌芯胁鈥櫻徯沸靶窖�, 斜褍写褜 谢邪褋泻邪, 锌械褉械泄写褨褌褜 写芯 锌褉芯谐褉邪屑懈 邪斜芯 锌谢邪谐褨薪邪, 褖芯斜 蟹邪胁械褉褕懈褌懈 蟹胁鈥櫻徯沸拘�.',
+    viewDoc: '袩械褉械谐谢褟薪褍褌懈 写芯泻褍屑械薪褌邪褑褨褞',
+    relatedApp: '锌芯胁\'褟蟹邪薪褨 锌褉芯谐褉邪屑懈',
+    noRelatedApp: '袧械屑邪褦 锌芯胁\'褟蟹邪薪懈褏 写芯写邪褌泻褨胁',
+  },
+  voiceInput: {
+    speaking: '袚芯胁芯褉褨褌褜 蟹邪褉邪蟹...',
+    converting: '袩械褉械褌胁芯褉械薪薪褟 薪邪 褌械泻褋褌...',
+    notAllow: '屑褨泻褉芯褎芯薪 薪械 邪胁褌芯褉懈蟹芯胁邪薪懈泄',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: '袩械褉械泄屑械薪褍胁邪褌懈 褉芯蟹屑芯胁褍',
+    conversationName: '袧邪蟹胁邪 褉芯蟹屑芯胁懈',
+    conversationNamePlaceholder: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 薪邪蟹胁褍 褉芯蟹屑芯胁懈',
+    conversationNameCanNotEmpty: '袩芯褌褉褨斜薪邪 薪邪蟹胁邪 褉芯蟹屑芯胁懈',
+    citation: {
+      title: '笑袠孝袗孝袠',
+      linkToDataset: '袩芯褋懈谢邪薪薪褟 薪邪 袟薪邪薪薪褟',
+      characters: '小懈屑胁芯谢褨胁:',
+      hitCount: '袣褨谢褜泻褨褋褌褜 蟹胁械褉薪械薪褜:',
+      vectorHash: '啸械褕 胁械泻褌芯褉邪:',
+      hitScore: '袨褑褨薪泻邪 蟹胁械褉薪械薪薪褟:',
+    },
+    inputPlaceholder: '袩芯谐芯胁芯褉褨褌褜 蟹 斜芯褌芯屑',
+    thought: '袛褍屑泻邪',
+    thinking: '袦懈褋谢械薪薪褟...',
+    resend: '袙褨写锌褉邪胁懈褌懈 蟹薪芯胁褍',
+  },
+  promptEditor: {
+    placeholder: '袩懈褕褨褌褜 褋胁芯褩 锌褨写泻邪蟹泻懈 褌褍褌, 胁胁芯写褜褌械 \'{\', 褖芯斜 胁褋褌邪胁懈褌懈 蟹屑褨薪薪褍 褔懈 \'/\', 褖芯斜 胁褋褌邪胁懈褌懈 斜谢芯泻-锌褨写泻邪蟹泻褍',
+    context: {
+      item: {
+        title: '袣芯薪褌械泻褋褌',
+        desc: '袙褋褌邪胁懈褌懈 褕邪斜谢芯薪 泻芯薪褌械泻褋褌褍',
+      },
+      modal: {
+        title: '{{num}} 袟薪邪薪褜 褍 泻芯薪褌械泻褋褌褨',
+        add: '袛芯写邪褌懈 泻芯薪褌械泻褋褌',
+        footer: '袙懈 屑芯卸械褌械 泻械褉褍胁邪褌懈 泻芯薪褌械泻褋褌邪屑懈 胁 褉芯蟹写褨谢褨 "袣芯薪褌械泻褋褌" 薪懈卸褔械.',
+      },
+    },
+    history: {
+      item: {
+        title: '袉褋褌芯褉褨褟 褉芯蟹屑芯胁',
+        desc: '袙褋褌邪胁懈褌懈 褕邪斜谢芯薪 褨褋褌芯褉懈褔薪芯谐芯 锌芯胁褨写芯屑谢械薪薪褟',
+      },
+      modal: {
+        title: '袩袪袠袣袥袗袛',
+        user: '袩褉懈胁褨褌',
+        assistant: '袩褉懈胁褨褌! 效懈屑 褟 屑芯卸褍 写芯锌芯屑芯谐褌懈 胁邪屑 褋褜芯谐芯写薪褨?',
+        edit: '袪械写邪谐褍胁邪褌懈 褨屑械薪邪 褍 褉芯谢褨 褉芯蟹屑芯胁懈',
+      },
+    },
+    variable: {
+      item: {
+        title: '袟屑褨薪薪褨 褌邪 蟹芯胁薪褨褕薪褨 褨薪褋褌褉褍屑械薪褌懈',
+        desc: '袙褋褌邪胁懈褌懈 蟹屑褨薪薪褨 褌邪 蟹芯胁薪褨褕薪褨 褨薪褋褌褉褍屑械薪褌懈',
+      },
+      outputToolDisabledItem: {
+        title: '袟屑褨薪薪褨',
+        desc: '袙褋褌邪胁懈褌懈 蟹屑褨薪薪褨',
+      },
+      modal: {
+        add: '袧芯胁邪 蟹屑褨薪薪邪',
+        addTool: '袧芯胁懈泄 褨薪褋褌褉褍屑械薪褌',
+      },
+    },
+    query: {
+      item: {
+        title: '袟邪锌懈褌',
+        desc: '袙褋褌邪胁懈褌懈 褕邪斜谢芯薪 蟹邪锌懈褌褍 泻芯褉懈褋褌褍胁邪褔邪',
+      },
+    },
+    existed: '袙卸械 褨褋薪褍褦 胁 锌褨写泻邪蟹褑褨',
+  },
+  imageUploader: {
+    uploadFromComputer: '袟邪胁邪薪褌邪卸懈褌懈 蟹 泻芯屑锌\'褞褌械褉邪',
+    uploadFromComputerReadError: '袩芯屑懈谢泻邪 蟹褔懈褌褍胁邪薪薪褟 蟹芯斜褉邪卸械薪薪褟, 锌芯胁褌芯褉褨褌褜 褋锌褉芯斜褍.',
+    uploadFromComputerUploadError: '袩芯屑懈谢泻邪 蟹邪胁邪薪褌邪卸械薪薪褟 蟹芯斜褉邪卸械薪薪褟, 褋锌褉芯斜褍泄褌械 蟹薪芯胁褍.',
+    uploadFromComputerLimit: '袪芯蟹屑褨褉 蟹芯斜褉邪卸械薪薪褟 薪械 屑芯卸械 锌械褉械胁懈褖褍胁邪褌懈 {{size}} 袦袘',
+    pasteImageLink: '袙褋褌邪胁懈褌懈 锌芯褋懈谢邪薪薪褟 薪邪 蟹芯斜褉邪卸械薪薪褟',
+    pasteImageLinkInputPlaceholder: '袙褋褌邪胁褌械 锌芯褋懈谢邪薪薪褟 薪邪 蟹芯斜褉邪卸械薪薪褟 褌褍褌',
+    pasteImageLinkInvalid: '袧械写褨泄褋薪械 锌芯褋懈谢邪薪薪褟 薪邪 蟹芯斜褉邪卸械薪薪褟',
+    imageUpload: '袟邪胁邪薪褌邪卸械薪薪褟 蟹芯斜褉邪卸械薪薪褟',
+  },
+  tag: {
+    placeholder: '校褋褨 褌械谐懈',
+    addNew: '袛芯写邪褌懈 薪芯胁懈泄 褌械谐',
+    noTag: '袘械蟹 褌械谐褨胁',
+    noTagYet: '些械 薪械屑邪褦 褌械谐褨胁',
+    addTag: '写芯写邪褌懈 褌械谐',
+    editTag: '袪械写邪谐褍胁邪褌懈 褌械谐懈',
+    manageTags: '袣械褉褍胁邪褌懈 褌械谐邪屑懈',
+    selectorPlaceholder: '袙胁械写褨褌褜 写谢褟 锌芯褕褍泻褍 邪斜芯 褋褌胁芯褉械薪薪褟',
+    create: '小褌胁芯褉懈褌懈',
+    delete: '袙懈写邪谢懈褌懈 褌械谐',
+    deleteTip: '孝械谐 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟, 胁懈写邪谢懈褌懈 泄芯谐芯?',
+    created: '孝械谐 褋褌胁芯褉械薪芯 褍褋锌褨褕薪芯',
+    failed: '袧械 胁写邪谢芯褋褟 褋褌胁芯褉懈褌懈 褌械谐',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 褦 芯斜芯胁\'褟蟹泻芯胁懈屑',
+    urlError: 'URL-邪写褉械褋邪 锌芯胁懈薪薪邪 锌芯褔懈薪邪褌懈褋褟 蟹 http:// 邪斜芯 https://',
+  },
+  fileUploader: {
+    pasteFileLink: '袙褋褌邪胁懈褌懈 锌芯褋懈谢邪薪薪褟 薪邪 褎邪泄谢',
+    pasteFileLinkInvalid: '袧械锌褉懈锌褍褋褌懈屑械 锌芯褋懈谢邪薪薪褟 薪邪 褎邪泄谢',
+    uploadFromComputer: '袥芯泻邪谢褜薪械 蟹邪胁邪薪褌邪卸械薪薪褟',
+    uploadFromComputerLimit: '肖邪泄谢 蟹邪胁邪薪褌邪卸械薪薪褟 薪械 屑芯卸械 锌械褉械胁懈褖褍胁邪褌懈 {{size}}',
+    pasteFileLinkInputPlaceholder: '袙胁械写褨褌褜 URL-邪写褉械褋褍...',
+    fileExtensionNotSupport: '袪芯蟹褕懈褉械薪薪褟 褎邪泄谢褍 薪械 锌褨写褌褉懈屑褍褦褌褜褋褟',
+    uploadFromComputerReadError: '袧械 胁写邪谢芯褋褟 锌褉芯褔懈褌邪褌懈 褎邪泄谢, 斜褍写褜 谢邪褋泻邪, 褋锌褉芯斜褍泄褌械 褖械 褉邪蟹.',
+    uploadFromComputerUploadError: '袧械 胁写邪谢芯褋褟 蟹邪胁邪薪褌邪卸懈褌懈 褎邪泄谢, 斜褍写褜 谢邪褋泻邪, 蟹邪胁邪薪褌邪卸褌械 褖械 褉邪蟹.',
+  },
+  license: {
+    expiring: '孝械褉屑褨薪 写褨褩 蟹邪泻褨薪褔褍褦褌褜褋褟 蟹邪 芯写懈薪 写械薪褜',
+    expiring_plural: '孝械褉屑褨薪 写褨褩 蟹邪泻褨薪褔褍褦褌褜褋褟 蟹邪 {{count}} 写薪褨胁',
+  },
+  pagination: {
+    perPage: '袝谢械屑械薪褌褨胁 薪邪 褋褌芯褉褨薪褑褨',
+  },
+  theme: {
+    auto: '褋懈褋褌械屑邪',
+    dark: '褌械屑薪懈泄',
+    light: '褋胁褨褌谢芯',
+    theme: '孝械屑邪',
+  },
+  compliance: {
+    professionalUpgradeTooltip: '袛芯褋褌褍锌薪芯 谢懈褕械 蟹 泻芯屑邪薪写薪懈屑 锌谢邪薪芯屑 邪斜芯 胁懈褖械.',
+    soc2Type2: '袟胁褨褌 SOC 2 孝懈锌 II',
+    iso27001: '小械褉褌懈褎褨泻邪褑褨褟 ISO 27001:2022',
+    soc2Type1: '袟胁褨褌 SOC 2 孝懈锌 I',
+    sandboxUpgradeTooltip: '袛芯褋褌褍锌薪芯 谢懈褕械 蟹 锌褉芯褎械褋褨泄薪懈屑 邪斜芯 泻芯屑邪薪写薪懈屑 锌谢邪薪芯屑.',
+    gdpr: 'GDPR DPA',
+  },
+  imageInput: {
+    browse: '锌械褉械谐谢褟写',
+    supportedFormats: '袩褨写褌褉懈屑褍褦 PNG, JPG, JPEG, WEBP 褨 GIF',
+    dropImageHere: '袩械褉械褌褟谐薪褨褌褜 蟹芯斜褉邪卸械薪薪褟 褋褞写懈 邪斜芯',
+  },
+}
+
+export default translation
diff --git a/i18n/uk-UA/custom.ts b/i18n/uk-UA/custom.ts
new file mode 100644
index 0000000..1eba3f1
--- /dev/null
+++ b/i18n/uk-UA/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: '袧邪谢邪褕褌褍胁邪薪薪褟',
+  upgradeTip: {
+    prefix: '袨薪芯胁褨褌褜 褋胁褨泄 锌谢邪薪 写芯 ',
+    suffix: ', 褖芯斜 薪邪谢邪褕褌褍胁邪褌懈 褋胁褨泄 斜褉械薪写.',
+    title: '袨薪芯胁褨褌褜 褋胁褨泄 锌谢邪薪',
+    des: '袨薪芯胁褨褌褜 褋胁褨泄 锌谢邪薪, 褖芯斜 薪邪谢邪褕褌褍胁邪褌懈 褋胁褨泄 斜褉械薪写',
+  },
+  webapp: {
+    title: '袧邪谢邪褕褌褍胁邪褌懈 斜褉械薪写 写谢褟 WebApp',
+    removeBrand: '袙懈写邪谢懈褌懈 Powered by Dify',
+    changeLogo: '袟屑褨薪懈褌懈 蟹芯斜褉邪卸械薪薪褟 斜褉械薪写褍 "Powered by"',
+    changeLogoTip: '肖芯褉屑邪褌 SVG 邪斜芯 PNG 蟹 屑褨薪褨屑邪谢褜薪懈屑 褉芯蟹屑褨褉芯屑 40x40 锌褨泻褋械谢褨胁',
+  },
+  app: {
+    title: '袧邪谢邪褕褌褍胁邪褌懈 斜褉械薪写 蟹邪谐芯谢芯胁泻邪 锌褉芯谐褉邪屑懈 app',
+    changeLogoTip: '肖芯褉屑邪褌 SVG 邪斜芯 PNG 蟹 屑褨薪褨屑邪谢褜薪懈屑 褉芯蟹屑褨褉芯屑 80x80 锌褨泻褋械谢褨胁',
+  },
+  upload: '袟邪胁邪薪褌邪卸懈褌懈',
+  uploading: '袟邪胁邪薪褌邪卸械薪薪褟',
+  uploadedFail: '袩芯屑懈谢泻邪 蟹邪胁邪薪褌邪卸械薪薪褟 蟹芯斜褉邪卸械薪薪褟, 斜褍写褜 谢邪褋泻邪, 蟹邪胁邪薪褌邪卸褌械 褖械 褉邪蟹.',
+  change: '袟屑褨薪懈褌懈',
+  apply: '袟邪褋褌芯褋褍胁邪褌懈',
+  restore: '袙褨写薪芯胁懈褌懈 蟹薪邪褔械薪薪褟 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑',
+  customize: {
+    contactUs: '蟹胁\'褟卸褨褌褜褋褟 蟹 薪邪屑懈',
+    prefix: '些芯斜 薪邪谢邪褕褌褍胁邪褌懈 谢芯谐芯褌懈锌 斜褉械薪写褍 胁 锌褉芯谐褉邪屑褨, 斜褍写褜 谢邪褋泻邪,',
+    suffix: '褖芯斜 锌械褉械泄褌懈 薪邪 泻芯褉锌芯褉邪褌懈胁薪械 胁懈写邪薪薪褟.',
+  },
+}
+
+export default translation
diff --git a/i18n/uk-UA/dataset-creation.ts b/i18n/uk-UA/dataset-creation.ts
new file mode 100644
index 0000000..18b5553
--- /dev/null
+++ b/i18n/uk-UA/dataset-creation.ts
@@ -0,0 +1,218 @@
+const translation = {
+  steps: {
+    header: {
+      creation: '小褌胁芯褉懈褌懈 袟薪邪薪薪褟',
+      update: '袛芯写邪褌懈 写邪薪褨',
+      fallbackRoute: '袟薪邪薪薪褟',
+    },
+    one: '袙懈斜械褉褨褌褜 写卸械褉械谢芯 写邪薪懈褏',
+    two: '袩芯锌械褉械写薪褟 芯斜褉芯斜泻邪 褌邪 芯褔懈褖械薪薪褟 褌械泻褋褌褍',
+    three: '袙懈泻芯薪邪褌懈 褌邪 蟹邪胁械褉褕懈褌懈',
+  },
+  error: {
+    unavailable: '笑褨 袟薪邪薪薪褟 薪械写芯褋褌褍锌薪褨',
+  },
+  stepOne: {
+    filePreview: '袩芯锌械褉械写薪褨泄 锌械褉械谐谢褟写 褎邪泄谢褍',
+    pagePreview: '袩芯锌械褉械写薪褨泄 锌械褉械谐谢褟写 褋褌芯褉褨薪泻懈',
+    dataSourceType: {
+      file: '袉屑锌芯褉褌褍胁邪褌懈 蟹 褌械泻褋褌芯胁芯谐芯 褎邪泄谢邪',
+      notion: '小懈薪褏褉芯薪褨蟹褍胁邪褌懈 蟹 Notion',
+      web: '小懈薪褏褉芯薪褨蟹褍胁邪褌懈 蟹 胁械斜-褋邪泄褌褍',
+    },
+    uploader: {
+      title: '袟邪胁邪薪褌邪卸懈褌懈 褌械泻褋褌芯胁懈泄 褎邪泄谢',
+      button: '袩械褉械褌褟谐薪褨褌褜 褎邪泄谢懈 邪斜芯 锌邪锌泻懈 邪斜芯',
+      browse: '袨斜械褉褨褌褜',
+      tip: '袩褨写褌褉懈屑褍褞褌褜褋褟 {{supportTypes}}. 袦邪泻褋懈屑褍屑 {{size}} 袦袘 泻芯卸械薪.',
+      validation: {
+        typeError: '孝懈锌 褎邪泄谢褍 薪械 锌褨写褌褉懈屑褍褦褌褜褋褟',
+        size: '肖邪泄谢 蟹邪薪邪写褌芯 胁械谢懈泻懈泄. 袦邪泻褋懈屑褍屑 鈥� {{size}} 袦袘',
+        count: '袧械 锌褨写褌褉懈屑褍褦褌褜褋褟 蟹邪胁邪薪褌邪卸械薪薪褟 泻褨谢褜泻芯褏 褎邪泄谢褨胁',
+        filesNumber: '袥褨屑褨褌 屑邪褋芯胁芯谐芯 蟹邪胁邪薪褌邪卸械薪薪褟 {{filesNumber}}.',
+      },
+      cancel: '小泻邪褋褍胁邪褌懈',
+      change: '袟屑褨薪懈褌懈',
+      failed: '袟邪胁邪薪褌邪卸械薪薪褟 薪械 胁写邪谢芯褋褟',
+    },
+    notionSyncTitle: 'Notion 薪械 锌褨写泻谢褞褔械薪芯',
+    notionSyncTip: '袛谢褟 褋懈薪褏褉芯薪褨蟹邪褑褨褩 蟹 Notion 褋锌芯褔邪褌泻褍 锌芯褌褉褨斜薪芯 胁褋褌邪薪芯胁懈褌懈 蟹胁鈥櫻徯沸拘� 褨蟹 Notion.',
+    connect: '袩械褉械泄褌懈 写芯 锌褨写泻谢褞褔械薪薪褟',
+    button: '写邪谢褨',
+    emptyDatasetCreation: '携 褏芯褔褍 褋褌胁芯褉懈褌懈 锌芯褉芯卸薪褨 袟薪邪薪薪褟',
+    modal: {
+      title: '小褌胁芯褉懈褌懈 锌芯褉芯卸薪褨 袟薪邪薪薪褟',
+      tip: '袩芯褉芯卸薪褨 袟薪邪薪薪褟 薪械 斜褍写褍褌褜 屑褨褋褌懈褌懈 写芯泻褍屑械薪褌褨胁, 胁懈 蟹屑芯卸械褌械 蟹邪胁邪薪褌邪卸懈褌懈 写芯泻褍屑械薪褌懈 胁 斜褍写褜-褟泻懈泄 褔邪褋.',
+      input: '袧邪蟹胁邪 袟薪邪薪褜',
+      placeholder: '袙胁械写褨褌褜, 斜褍写褜 谢邪褋泻邪',
+      nameNotEmpty: '袉屑鈥櫻� 薪械 屑芯卸械 斜褍褌懈 锌芯褉芯卸薪褨屑',
+      nameLengthInvalid: '袉屑鈥櫻� 屑邪褦 斜褍褌懈 胁褨写 1 写芯 40 褋懈屑胁芯谢褨胁',
+      cancelButton: '小泻邪褋褍胁邪褌懈',
+      confirmButton: '小褌胁芯褉懈褌懈',
+      failed: '小褌胁芯褉械薪薪褟 薪械 胁写邪谢芯褋褟',
+    },
+    website: {
+      totalPageScraped: '袙褋褜芯谐芯 胁懈褋泻芯斜谢械薪懈褏 褋褌芯褉褨薪芯泻:',
+      run: '袘褨谐褌懈',
+      configure: '袧邪褋褌褉芯褩褌懈',
+      limit: '袦械卸邪',
+      selectAll: '袙懈斜褉邪褌懈 胁褋械',
+      unknownError: '袧械胁褨写芯屑邪 锌芯屑懈谢泻邪',
+      maxDepth: '袦邪泻褋懈屑邪谢褜薪邪 谐谢懈斜懈薪邪',
+      crawlSubPage: '小泻邪薪褍胁邪薪薪褟 锌褨写褋褌芯褉褨薪芯泻',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      preview: '袩芯锌械褉械写薪褨泄 锌械褉械谐谢褟写',
+      fireCrawlNotConfigured: 'Firecrawl 薪械 薪邪谢邪褕褌芯胁邪薪芯',
+      includeOnlyPaths: '袙泻谢褞褔邪褌懈 谢懈褕械 泻芯薪褌褍褉懈',
+      options: '袩邪褉邪屑械褌褉懈',
+      resetAll: '小泻懈薪褍褌懈 胁褋械',
+      excludePaths: '袙懈泻谢褞褔械薪薪褟 泻芯薪褌褍褉褨胁',
+      firecrawlDoc: '袛芯泻褍屑械薪褌邪褑褨褟 Firecrawl',
+      exceptionErrorTitle: '袙懈薪褟褌芯泻 褋褌邪胁褋褟 锌褨写 褔邪褋 胁懈泻芯薪邪薪薪褟 蟹邪胁写邪薪薪褟 Firecrawl:',
+      firecrawlTitle: '袙懈写芯斜褍胁邪薪薪褟 胁械斜-胁屑褨褋褌褍 蟹邪 写芯锌芯屑芯谐芯褞 馃敟Firecrawl',
+      scrapTimeInfo: '袙懈泻褉邪写械薪芯 {{total}} 褋褌芯褉褨薪芯泻 蟹邪谐邪谢芯屑 锌褉芯褌褟谐芯屑 {{time}}s',
+      fireCrawlNotConfiguredDescription: '袧邪谢邪褕褌褍泄褌械 Firecrawl 蟹邪 写芯锌芯屑芯谐芯褞 泻谢褞褔邪 API, 褖芯斜 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 泄芯谐芯.',
+      extractOnlyMainContent: '袙懈褌褟谐褍泄褌械 谢懈褕械 芯褋薪芯胁薪懈泄 泻芯薪褌械薪褌 (斜械蟹 蟹邪谐芯谢芯胁泻褨胁, 薪邪胁褨谐邪褌芯褉褨胁, 薪懈卸薪褨褏 泻芯谢芯薪褌懈褌褍谢褨胁 褌芯褖芯)',
+      maxDepthTooltip: '袦邪泻褋懈屑邪谢褜薪邪 谐谢懈斜懈薪邪 写谢褟 褋泻邪薪褍胁邪薪薪褟 褖芯写芯 胁胁械写械薪芯褩 URL-邪写褉械褋懈. 袚谢懈斜懈薪邪 0 锌褉芯褋褌芯 蟹褨褕泻褉褨斜邪褦 褋褌芯褉褨薪泻褍 胁胁械写械薪芯谐芯 url, 谐谢懈斜懈薪邪 1 褕泻褉械斜械 url 褨 胁褋械 锌褨褋谢褟 胁胁械写械薪芯谐芯URL + 芯写懈薪 /, 褨 褌邪泻 写邪谢褨.',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      chooseProvider: '袨斜械褉褨褌褜 锌褉芯胁邪泄写械褉邪',
+      jinaReaderNotConfiguredDescription: '袧邪谢邪褕褌褍泄褌械 Jina Reader, 胁胁褨胁褕懈 斜械蟹泻芯褕褌芯胁薪懈泄 API-泻谢褞褔 写谢褟 写芯褋褌褍锌褍.',
+      jinaReaderDoc: '袛褨蟹薪邪泄褌械褋褟 斜褨谢褜褕械 锌褉芯 Jina Reader',
+      useSitemapTooltip: '袛芯褌褉懈屑褍泄褌械褋褜 泻邪褉褌懈 褋邪泄褌褍, 褖芯斜 锌褉芯褋泻邪薪褍胁邪褌懈 褋邪泄褌. 携泻褖芯 薪褨, Jina Reader 褋泻邪薪褍胁邪褌懈屑械褌褜褋褟 褨褌械褉邪褌懈胁薪芯 蟹邪谢械卸薪芯 胁褨写 褉械谢械胁邪薪褌薪芯褋褌褨 褋褌芯褉褨薪泻懈, 芯褌褉懈屑褍褞褔懈 屑械薪褕械, 邪谢械 褟泻褨褋薪褨褕懈褏 褋褌芯褉褨薪芯泻.',
+      jinaReaderNotConfigured: 'Jina Reader 薪械 薪邪谢邪褕褌芯胁邪薪邪',
+      jinaReaderTitle: '袩械褉械褌胁芯褉褨褌褜 胁械褋褜 褋邪泄褌 薪邪 Markdown',
+      useSitemap: '袙懈泻芯褉懈褋褌芯胁褍泄褌械 泻邪褉褌褍 褋邪泄褌褍',
+      configureJinaReader: '袧邪谢邪褕褌褍胁邪褌懈 Jina Reader',
+      waterCrawlNotConfigured: 'Watercrawl 薪械 薪邪谢邪褕褌芯胁邪薪芯',
+      waterCrawlNotConfiguredDescription: '袧邪谢邪褕褌褍泄褌械 Watercrawl 蟹 泻谢褞褔械屑 API, 褖芯斜 泄芯谐芯 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈.',
+      configureFirecrawl: '袧邪谢邪褕褌褍胁邪薪薪褟 Firecrawl',
+      configureWatercrawl: '袧邪谢邪褕褌褍胁邪薪薪褟 Watercrawl',
+      watercrawlTitle: '袙懈褌褟谐褍泄褌械 胁械斜-泻芯薪褌械薪褌 蟹邪 写芯锌芯屑芯谐芯褞 Watercrawl',
+      watercrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      watercrawlDoc: '袛芯泻褍屑械薪褌邪褑褨褟 Watercrawl',
+    },
+    cancel: '小泻邪褋褍胁邪褌懈',
+  },
+  stepTwo: {
+    segmentation: '袧邪谢邪褕褌褍胁邪薪薪褟 褎褉邪谐屑械薪褌邪褑褨褩',
+    auto: '袗胁褌芯屑邪褌懈褔薪芯',
+    autoDescription: '袗胁褌芯屑邪褌懈褔薪芯 胁褋褌邪薪芯胁谢褞褦 锌褉邪胁懈谢邪  褎褉邪谐屑械薪褌邪褑褨褩 褌邪 锌芯锌械褉械写薪褜芯褩 芯斜褉芯斜泻懈. 袧械蟹薪邪泄芯屑懈屑 泻芯褉懈褋褌褍胁邪褔邪屑 褉械泻芯屑械薪写褍褦褌褜褋褟 芯斜褉邪褌懈 褑械泄 锌褍薪泻褌.',
+    custom: '袙褉褍褔薪褍',
+    customDescription: '袧邪谢邪褕褌褍泄褌械 胁谢邪褋薪褨 锌褉邪胁懈谢邪 褎褉邪谐屑械薪褌邪褑褨褩, 写芯胁卸懈薪褍 褎褉邪谐屑械薪褌褨胁, 锌褉邪胁懈谢邪 锌芯锌械褉械写薪褜芯褩 芯斜褉芯斜泻懈 褌芯褖芯.',
+    separator: '袉写械薪褌懈褎褨泻邪褌芯褉 褎褉邪谐屑械薪褌邪',
+    separatorPlaceholder: '袧邪锌褉懈泻谢邪写, 薪芯胁懈泄 褉褟写芯泻 (\\\\n) 邪斜芯 褋锌械褑褨邪谢褜薪懈泄 褉芯蟹写褨谢褜薪懈泻 (薪邪锌褉懈泻谢邪写, "***")',
+    maxLength: '袦邪泻褋懈屑邪谢褜薪邪 写芯胁卸懈薪邪 褎褉邪谐屑械薪褌邪',
+    overlap: '袩械褉械泻褉懈褌褌褟 褎褉邪谐屑械薪褌邪',
+    overlapTip: '袧邪谢邪褕褌褍胁邪薪薪褟 锌械褉械泻褉懈褌褌褟 褎褉邪谐屑械薪褌褨胁 屑芯卸械 锌褨写褌褉懈屑褍胁邪褌懈 褋械屑邪薪褌懈褔薪懈泄 蟹胁鈥櫻徯沸拘� 屑褨卸 薪懈屑懈, 锌芯泻褉邪褖褍褞褔懈 械褎械泻褌 芯褌褉懈屑邪薪薪褟 写邪薪懈褏. 袪械泻芯屑械薪写褍褦褌褜褋褟 胁褋褌邪薪芯胁懈褌懈 10%-25% 胁褨写 屑邪泻褋懈屑邪谢褜薪芯谐芯 褉芯蟹屑褨褉褍 褎褉邪谐屑械薪褌邪.',
+    overlapCheck: '锌械褉械泻褉懈褌褌褟 褎褉邪谐屑械薪褌邪 薪械 锌芯胁懈薪薪芯 斜褍褌懈 斜褨谢褜褕懈屑 蟹邪 屑邪泻褋懈屑邪谢褜薪褍 写芯胁卸懈薪褍 褎褉邪谐屑械薪褌邪',
+    rules: '袩褉邪胁懈谢邪 锌芯锌械褉械写薪褜芯褩 芯斜褉芯斜泻懈 褌械泻褋褌褍',
+    removeExtraSpaces: '袟邪屑褨薪懈褌懈 锌芯褋谢褨写芯胁薪褨 锌褉芯斜褨谢懈, 薪芯胁褨 褉褟写泻懈 泄 褌邪斜褍谢褟褑褨褩',
+    removeUrlEmails: '袙懈写邪谢懈褌懈 胁褋褨 URL-邪写褉械褋懈 褌邪 邪写褉械褋懈 械谢械泻褌褉芯薪薪芯褩 锌芯褕褌懈',
+    removeStopwords: '袙懈写邪谢懈褌懈 褋褌芯锌-褋谢芯胁邪, 薪邪锌褉懈泻谢邪写, 褌邪泻褨 褟泻 "a", "an", "the"',
+    preview: '袩褨写褌胁械褉写懈褌懈 褌邪 锌芯锌械褉械写薪褜芯 锌械褉械谐谢褟薪褍褌懈',
+    reset: '小泻懈薪褍褌懈',
+    indexMode: '袪械卸懈屑 褨薪写械泻褋邪褑褨褩',
+    qualified: '袙懈褋芯泻芯褟泻褨褋薪懈泄',
+    recommend: '袪械泻芯屑械薪写芯胁邪薪芯',
+    qualifiedTip: '袙懈泻谢懈泻 褋褌邪薪写邪褉褌薪芯谐芯 褨薪褌械褉褎械泄褋褍 褋懈褋褌械屑薪芯谐芯 胁斜褍写芯胁褍胁邪薪薪褟 写谢褟 芯斜褉芯斜泻懈, 褖芯斜 蟹邪斜械蟹锌械褔懈褌懈 斜褨谢褜褕 胁懈褋芯泻褍 褌芯褔薪褨褋褌褜, 泻芯谢懈 泻芯褉懈褋褌褍胁邪褔褨 锌芯写邪褞褌褜 蟹邪锌懈褌.',
+    warning: '袘褍写褜 谢邪褋泻邪, 褋锌芯褔邪褌泻褍 薪邪谢邪褕褌褍泄褌械 泻谢褞褔 API 锌芯褋褌邪褔邪谢褜薪懈泻邪 屑芯写械谢褨.',
+    click: '袩械褉械泄褌懈 写芯 薪邪谢邪褕褌褍胁邪薪褜',
+    economical: '袝泻芯薪芯屑薪懈泄',
+    economicalTip: '袙懈泻芯褉懈褋褌芯胁褍泄褌械 邪胁褌芯薪芯屑薪褨 胁械泻褌芯褉懈蟹邪褌芯褉懈, 褨薪写械泻褋懈 泻谢褞褔芯胁懈褏 褋谢褨胁 褌芯褖芯, 褖芯斜 蟹薪懈蟹懈褌懈 褌芯褔薪褨褋褌褜 斜械蟹 胁懈泻芯褉懈褋褌邪薪薪褟 褌芯泻械薪褨胁',
+    QATitle: '小械谐屑械薪褌邪褑褨褟 褍 褎芯褉屑邪褌褨 "锌懈褌邪薪薪褟 褌邪 胁褨写锌芯胁褨写褜"',
+    QATip: '校胁褨屑泻薪械薪薪褟 褑褨褦褩 芯锌褑褨褩 褋锌芯卸懈胁邪褌懈屑械 斜褨谢褜褕械 褌芯泻械薪褨胁',
+    QALanguage: '小械谐屑械薪褌邪褑褨褟 蟹 胁懈泻芯褉懈褋褌邪薪薪褟屑',
+    estimateCost: '袨褑褨薪泻邪',
+    estimateSegment: '袨褉褨褦薪褌芯胁薪褨 褎褉邪谐屑械薪褌懈',
+    segmentCount: '褎褉邪谐屑械薪褌褨胁',
+    calculating: '袪芯蟹褉邪褏芯胁褍褦褌褜褋褟...',
+    fileSource: '袩芯锌械褉械写薪褟 芯斜褉芯斜泻邪 写芯泻褍屑械薪褌邪',
+    notionSource: '袩芯锌械褉械写薪褟 芯斜褉芯斜泻邪 褋褌芯褉褨薪芯泻',
+    other: ' 褌邪 褨薪褕褨 ',
+    fileUnit: ' 褎邪泄谢懈',
+    notionUnit: ' 褋褌芯褉褨薪泻懈',
+    previousStep: '袩芯锌械褉械写薪褨泄 泻褉芯泻',
+    nextStep: '袟斜械褉械谐褌懈 褌邪 芯斜褉芯斜懈褌懈',
+    save: '袟斜械褉械谐褌懈 褌邪 芯斜褉芯斜懈褌懈',
+    cancel: '小泻邪褋褍胁邪褌懈',
+    sideTipTitle: '袧邪胁褨褖芯 褉芯蟹斜懈胁邪褌懈 薪邪 褎褉邪谐屑械薪褌懈 褌邪 锌芯锌械褉械写薪褜芯 芯斜褉芯斜谢褟褌懈?',
+    sideTipP1: '袩褉懈 褉芯斜芯褌褨 蟹 褌械泻褋褌芯胁懈屑懈 写邪薪懈屑懈 褎褉邪谐屑械薪褌邪褑褨褟 褌邪 芯褔懈褖械薪薪褟 褦 写胁芯屑邪 胁邪卸谢懈胁懈屑懈 械褌邪锌邪屑懈 锌芯锌械褉械写薪褜芯褩 芯斜褉芯斜泻懈.',
+    sideTipP2: '小械谐屑械薪褌邪褑褨褟 褉芯蟹斜懈胁邪褦 写芯胁谐懈泄 褌械泻褋褌 薪邪 邪斜蟹邪褑懈 写谢褟 泻褉邪褖芯谐芯 褋锌褉懈泄薪褟褌褌褟 屑芯写械谢褟屑懈. 笑械 锌褨写胁懈褖褍褦 褟泻褨褋褌褜 褨 褉械谢械胁邪薪褌薪褨褋褌褜 褉械蟹褍谢褜褌邪褌褨胁 褉芯斜芯褌懈 屑芯写械谢械泄.',
+    sideTipP3: '袨褔懈褖械薪薪褟 胁懈写邪谢褟褦 薪械锌芯褌褉褨斜薪褨 褋懈屑胁芯谢懈 褌邪 褎芯褉屑邪褌褍胁邪薪薪褟, 褉芯斜谢褟褔懈 袟薪邪薪薪褟 褔懈褋褌褨褕懈屑懈 褌邪 谢械谐褕懈屑懈 写谢褟 邪薪邪谢褨蟹褍.',
+    sideTipP4: '袩褉邪胁懈谢褜薪邪 褎褉邪谐屑械薪褌邪褑褨褟 褌邪 芯褔懈褖械薪薪褟 锌芯泻褉邪褖褍褞褌褜 锌褉芯写褍泻褌懈胁薪褨褋褌褜 屑芯写械谢褨, 蟹邪斜械蟹锌械褔褍褞褔懈 斜褨谢褜褕 褌芯褔薪褨 褌邪 褑褨薪薪褨 褉械蟹褍谢褜褌邪褌懈.',
+    previewTitle: '袩芯锌械褉械写薪褨泄 锌械褉械谐谢褟写',
+    previewTitleButton: '袩芯锌械褉械写薪褨泄 锌械褉械谐谢褟写',
+    previewButton: '袟屑褨薪邪 胁屑褨褋褌褍 薪邪 褎芯褉屑邪褌 Q&A',
+    previewSwitchTipStart: '袩芯褌芯褔薪懈泄 锌芯锌械褉械写薪褨泄 锌械褉械谐谢褟写 屑邪褦 褌械泻褋褌芯胁懈泄 褎芯褉屑邪褌, 蟹屑褨薪邪 褋锌芯褋芯斜褍 锌芯写邪薪薪褟 薪邪 褎芯褉屑邪褌 蟹邪锌懈褌邪薪褜 褌邪 胁褨写锌芯胁褨写械泄 ',
+    previewSwitchTipEnd: ' 锌芯褌褉械斜褍褦 写芯写邪褌泻芯胁懈褏 褌芯泻械薪褨胁',
+    characters: '褋懈屑胁芯谢褨胁',
+    indexSettingTip: '些芯斜 蟹屑褨薪懈褌懈 屑械褌芯写 褨薪写械泻褋褍胁邪薪薪褟, 斜褍写褜 谢邪褋泻邪, 锌械褉械泄写褨褌褜 写芯 ',
+    retrievalSettingTip: '些芯斜 蟹屑褨薪懈褌懈 屑械褌芯写 褨薪写械泻褋褍胁邪薪薪褟, 斜褍写褜 谢邪褋泻邪, 锌械褉械泄写褨褌褜 写芯 ',
+    datasetSettingLink: '袧邪谢邪褕褌褍胁邪薪薪褟 蟹薪邪薪褜.',
+    webpageUnit: '小褌芯褉褨薪芯泻',
+    websiteSource: '袙械斜-褋邪泄褌 锌芯锌械褉械写薪褜芯褩 芯斜褉芯斜泻懈',
+    separatorTip: '袪芯蟹写褨谢褜薪懈泻 鈥� 褑械 褋懈屑胁芯谢, 褟泻懈泄 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 锌芯写褨谢褍 褌械泻褋褌褍. \\n\\n 褌邪 \\n 褦 褔邪褋褌芯 胁懈泻芯褉懈褋褌芯胁褍胁邪薪懈屑懈 褉芯蟹写褨谢褜薪懈泻邪屑懈 写谢褟 胁褨写芯泻褉械屑谢械薪薪褟 邪斜蟹邪褑褨胁 褌邪 褉褟写泻褨胁. 校 锌芯褦写薪邪薪薪褨 蟹 泻芯屑邪屑懈 (\\n\\n,\\n) 邪斜蟹邪褑懈 斜褍写褍褌褜 褉芯蟹写褨谢械薪褨 谢褨薪褨褟屑懈, 褟泻褖芯 胁芯薪懈 锌械褉械胁懈褖褍褞褌褜 屑邪泻褋懈屑邪谢褜薪褍 写芯胁卸懈薪褍 褎褉邪谐屑械薪褌邪. 袙懈 褌邪泻芯卸 屑芯卸械褌械 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 褋锌械褑褨邪谢褜薪褨 褉芯蟹写褨谢褜薪懈泻懈, 胁懈蟹薪邪褔械薪褨 胁邪屑懈 (薪邪锌褉懈泻谢邪写, ***).',
+    maxLengthCheck: '袦邪泻褋懈屑邪谢褜薪邪 写芯胁卸懈薪邪 褕屑邪褌泻邪 屑邪褦 斜褍褌懈 屑械薪褕芯褞 蟹邪 {{limit}}',
+    parentChild: '袘邪褌褜泻懈-写褨褌懈',
+    childChunkForRetrieval: '袛芯褔褨褉薪褨泄 褕屑邪褌芯泻 写谢褟 锌芯褕褍泻褍',
+    notAvailableForQA: '袧械写芯褋褌褍锌薪芯 写谢褟 袉薪写械泻褋褍 蟹邪锌懈褌邪薪褜 褨 胁褨写锌芯胁褨写械泄',
+    parentChunkForContext: 'Parent-chunk 写谢褟 泻芯薪褌械泻褋褌褍',
+    paragraph: '袗斜蟹邪褑',
+    general: '袟邪谐邪谢褜薪械',
+    highQualityTip: '袩褨褋谢褟 蟹邪胁械褉褕械薪薪褟 胁斜褍写芯胁褍胁邪薪薪褟 胁 褉械卸懈屑褨 胁懈褋芯泻芯褩 褟泻芯褋褌褨 锌芯胁械褉薪械薪薪褟 写芯 械泻芯薪芯屑薪芯谐芯 褉械卸懈屑褍 薪械写芯褋褌褍锌薪械.',
+    generalTip: '袟邪谐邪谢褜薪懈泄 褉械卸懈屑 褎褉邪谐屑械薪褌邪褑褨褩 褌械泻褋褌褍, 芯褌褉懈屑邪薪褨 褌邪 胁懈泻谢懈泻邪薪褨 褎褉邪谐屑械薪褌懈 芯写薪邪泻芯胁褨.',
+    previewChunk: '肖褉邪谐屑械薪褌 锌芯锌械褉械写薪褜芯谐芯 锌械褉械谐谢褟写褍',
+    fullDoc: '袩芯胁薪懈泄 写芯泻褍屑械薪褌',
+    useQALanguage: '肖褉邪谐屑械薪褌 褍 褎芯褉屑邪褌褨 蟹邪锌懈褌邪薪褜 褨 胁褨写锌芯胁褨写械泄 褍',
+    notAvailableForParentChild: '袧械写芯褋褌褍锌薪芯 写谢褟 袘邪褌褜泻褨胁褋褜泻芯-写芯褔褨褉薪褜芯谐芯 褨薪写械泻褋褍',
+    qaSwitchHighQualityTipContent: '袙 写邪薪懈泄 褔邪褋 褌褨谢褜泻懈 胁懈褋芯泻芯褟泻褨褋薪懈泄 屑械褌芯写 褨薪写械泻褋褍 锌褨写褌褉懈屑褍褦 褎褉邪谐屑械薪褌邪褑褨褞 褎芯褉屑邪褌褍 蟹邪锌懈褌邪薪褜 褨 胁褨写锌芯胁褨写械泄. 效懈 褏芯褌褨谢懈 斜 胁懈 锌械褉械泄褌懈 胁 褟泻褨褋薪懈泄 褉械卸懈屑?',
+    previewChunkTip: '袧邪褌懈褋薪褨褌褜 泻薪芯锌泻褍 芦肖褉邪谐屑械薪褌 锌芯锌械褉械写薪褜芯谐芯 锌械褉械谐谢褟写褍禄 谢褨胁芯褉褍褔, 褖芯斜 蟹邪胁邪薪褌邪卸懈褌懈 锌芯锌械褉械写薪褨泄 锌械褉械谐谢褟写',
+    previewChunkCount: '{{count}} 袩褉懈斜谢懈蟹薪褨 褕屑邪褌泻懈',
+    fullDocTip: '校胁械褋褜 写芯泻褍屑械薪褌 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 褟泻 斜邪褌褜泻褨胁褋褜泻懈泄 褎褉邪谐屑械薪褌 褨 芯褌褉懈屑褍褦褌褜褋褟 斜械蟹锌芯褋械褉械写薪褜芯. 袟胁械褉薪褨褌褜 褍胁邪谐褍, 褖芯 蟹 屑褨褉泻褍胁邪薪褜 锌褉芯写褍泻褌懈胁薪芯褋褌褨 褌械泻褋褌, 褖芯 锌械褉械胁懈褖褍褦 10000 褌芯泻械薪褨胁, 斜褍写械 邪胁褌芯屑邪褌懈褔薪芯 芯斜褉褨蟹邪薪懈泄.',
+    parentChildDelimiterTip: '袪芯蟹写褨谢褜薪懈泻 鈥� 褑械 褋懈屑胁芯谢, 褟泻懈泄 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 锌芯写褨谢褍 褌械泻褋褌褍. \\n\\n 褉械泻芯屑械薪写褍褦褌褜褋褟 写谢褟 锌芯写褨谢褍 芯褉懈谐褨薪邪谢褜薪芯谐芯 写芯泻褍屑械薪褌邪 薪邪 胁械谢懈泻褨 斜邪褌褜泻褨胁褋褜泻褨 褎褉邪谐屑械薪褌懈. 袙懈 褌邪泻芯卸 屑芯卸械褌械 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 褋锌械褑褨邪谢褜薪褨 褉芯蟹写褨谢褜薪懈泻懈, 胁懈蟹薪邪褔械薪褨 褋邪屑芯褋褌褨泄薪芯.',
+    parentChildChunkDelimiterTip: '袪芯蟹写褨谢褜薪懈泻 鈥� 褑械 褋懈屑胁芯谢, 褟泻懈泄 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 锌芯写褨谢褍 褌械泻褋褌褍. \\n 褉械泻芯屑械薪写褍褦褌褜褋褟 写谢褟 锌芯写褨谢褍 斜邪褌褜泻褨胁褋褜泻懈褏 褎褉邪谐屑械薪褌褨胁 薪邪 屑邪谢械薪褜泻褨 写芯褔褨褉薪褨 褔邪褋褌懈薪懈. 袙懈 褌邪泻芯卸 屑芯卸械褌械 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 褋锌械褑褨邪谢褜薪褨 褉芯蟹写褨谢褜薪懈泻懈, 胁懈蟹薪邪褔械薪褨 褋邪屑芯褋褌褨泄薪芯.',
+    parentChildTip: '袩褉懈 胁懈泻芯褉懈褋褌邪薪薪褨 褉械卸懈屑褍 斜邪褌褜泻褨胁-写芯褔褨褉薪褨泄 械谢械屑械薪褌 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 锌芯褕褍泻褍, 邪 斜邪褌褜泻褨胁褋褜泻懈泄 褎褉邪谐屑械薪褌 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 胁懈泻谢懈泻褍 褟泻 泻芯薪褌械泻褋褌.',
+    switch: '袣芯屑褍褌邪褌芯褉',
+    qaSwitchHighQualityTipTitle: '肖芯褉屑邪褌 蟹邪锌懈褌邪薪褜 褨 胁褨写锌芯胁褨写械泄 胁懈屑邪谐邪褦 褟泻褨褋薪芯谐芯 屑械褌芯写褍 褨薪写械泻褋邪褑褨褩',
+    paragraphTip: '笑械泄 褉械卸懈屑 褉芯蟹斜懈胁邪褦 褌械泻褋褌 薪邪 邪斜蟹邪褑懈 薪邪 芯褋薪芯胁褨 褉芯蟹写褨谢褜薪懈泻褨胁 褨 屑邪泻褋懈屑邪谢褜薪芯褩 写芯胁卸懈薪懈 褎褉邪谐屑械薪褌邪, 胁懈泻芯褉懈褋褌芯胁褍褞褔懈 褉芯蟹写褨谢械薪懈泄 褌械泻褋褌 褟泻 斜邪褌褜泻褨胁褋褜泻懈泄 褎褉邪谐屑械薪褌 写谢褟 锌芯褕褍泻褍.',
+  },
+  stepThree: {
+    creationTitle: '馃帀 袟薪邪薪薪褟 褋褌胁芯褉械薪芯',
+    creationContent: '袦懈 邪胁褌芯屑邪褌懈褔薪芯 薪邪蟹胁邪谢懈 袟薪邪薪薪褟, 胁懈 屑芯卸械褌械 蟹屑褨薪懈褌懈 泄芯谐芯 胁 斜褍写褜-褟泻懈泄 褔邪褋',
+    label: '袧邪蟹胁邪 蟹薪邪薪褜',
+    additionTitle: '馃帀 袛芯泻褍屑械薪褌 蟹邪胁邪薪褌邪卸械薪芯',
+    additionP1: '袛芯泻褍屑械薪褌 斜褍谢芯 蟹邪胁邪薪褌邪卸械薪芯 写芯 袟薪邪薪薪褟',
+    additionP2: ', 胁懈 屑芯卸械褌械 蟹薪邪泄褌懈 泄芯谐芯 胁 褋锌懈褋泻褍 写芯泻褍屑械薪褌褨胁 袟薪邪薪薪褟.',
+    stop: '袟褍锌懈薪懈褌懈 芯斜褉芯斜泻褍',
+    resume: '袙褨写薪芯胁懈褌懈 芯斜褉芯斜泻褍',
+    navTo: '袩械褉械泄褌懈 写芯 写芯泻褍屑械薪褌邪',
+    sideTipTitle: '些芯 写邪谢褨',
+    sideTipContent: '袩褨褋谢褟 蟹邪胁械褉褕械薪薪褟 褨薪写械泻褋褍胁邪薪薪褟 写芯泻褍屑械薪褌邪 袟薪邪薪薪褟 屑芯卸薪邪 褨薪褌械谐褉褍胁邪褌懈 胁 写芯写邪褌芯泻 褟泻 泻芯薪褌械泻褋褌. 袧邪谢邪褕褌褍胁邪薪薪褟 泻芯薪褌械泻褋褌褍 屑芯卸薪邪 蟹薪邪泄褌懈 薪邪 褋褌芯褉褨薪褑褨 芯褉泻械褋褌褉邪褑褨褩 锌褨写泻邪蟹芯泻. 袙懈 褌邪泻芯卸 屑芯卸械褌械 褋褌胁芯褉懈褌懈 泄芯谐芯 褟泻 薪械蟹邪谢械卸薪懈泄 锌谢邪谐褨薪 褨薪写械泻褋褍胁邪薪薪褟 ChatGPT 写谢褟 褉械谢褨蟹褍.',
+    modelTitle: '袙懈 胁锌械胁薪械薪褨, 褖芯 褏芯褔械褌械 蟹褍锌懈薪懈褌懈 胁斜褍写芯胁褍胁邪薪薪褟?',
+    modelContent: '携泻褖芯 胁邪屑 锌芯褌褉褨斜薪芯 斜褍写械 胁褨写薪芯胁懈褌懈 芯斜褉芯斜泻褍 锌褨蟹薪褨褕械, 胁懈 锌褉芯写芯胁卸懈褌械 蟹 褌芯谐芯 屑褨褋褑褟, 写械 蟹褍锌懈薪懈谢懈褋褟.',
+    modelButtonConfirm: '袩褨写褌胁械褉写懈褌懈',
+    modelButtonCancel: '小泻邪褋褍胁邪褌懈',
+  },
+  firecrawl: {
+    getApiKeyLinkText: '袨褌褉懈屑邪泄褌械 褋胁褨泄 API-泻谢褞褔 胁褨写 firecrawl.dev',
+    configFirecrawl: '袧邪谢邪褕褌褍胁邪薪薪褟 馃敟Firecrawl',
+    apiKeyPlaceholder: '袣谢褞褔 API 胁褨写 firecrawl.dev',
+  },
+  jinaReader: {
+    apiKeyPlaceholder: '袣谢褞褔 API 胁褨写 jina.ai',
+    configJinaReader: '袧邪谢邪褕褌褍胁邪薪薪褟 Jina Reader',
+    getApiKeyLinkText: '袨褌褉懈屑邪泄褌械 斜械蟹泻芯褕褌芯胁薪懈泄 API-泻谢褞褔 蟹邪 邪写褉械褋芯褞 jina.ai',
+  },
+  otherDataSource: {
+    learnMore: '袛褨蟹薪邪褌懈褋褟 斜褨谢褜褕械',
+    title: '袩褨写泻谢褞褔懈褌懈褋褟 写芯 褨薪褕懈褏 写卸械褉械谢 写邪薪懈褏?',
+    description: '袧邪褉邪蟹褨 斜邪蟹邪 蟹薪邪薪褜 Dify 屑邪褦 谢懈褕械 芯斜屑械卸械薪褨 写卸械褉械谢邪 写邪薪懈褏. 袛芯写邪胁邪薪薪褟 写卸械褉械谢邪 写邪薪懈褏 写芯 斜邪蟹懈 蟹薪邪薪褜 Dify 鈥� 褑械 褎邪薪褌邪褋褌懈褔薪懈泄 褋锌芯褋褨斜 锌褨写胁懈褖懈褌懈 谐薪褍褔泻褨褋褌褜 褨 锌芯褌褍卸薪褨褋褌褜 锌谢邪褌褎芯褉屑懈 写谢褟 胁褋褨褏 泻芯褉懈褋褌褍胁邪褔褨胁. 袧邪褕 锌芯褋褨斜薪懈泻 褨蟹 胁薪械褋泻褍 褋锌褉芯褖褍褦 锌芯褔邪褌芯泻 褉芯斜芯褌懈. 袘褍写褜 谢邪褋泻邪, 薪邪褌懈褋薪褨褌褜 薪邪 锌芯褋懈谢邪薪薪褟 薪懈卸褔械, 褖芯斜 写褨蟹薪邪褌懈褋褟 斜褨谢褜褕械.',
+  },
+  watercrawl: {
+    configWatercrawl: '袧邪谢邪褕褌褍胁邪薪薪褟 Watercrawl',
+    apiKeyPlaceholder: 'API 泻谢褞褔 蟹 watercrawl.dev',
+    getApiKeyLinkText: '袨褌褉懈屑邪泄褌械 胁邪褕 API 泻谢褞褔 蟹 watercrawl.dev',
+  },
+}
+
+export default translation
diff --git a/i18n/uk-UA/dataset-documents.ts b/i18n/uk-UA/dataset-documents.ts
new file mode 100644
index 0000000..da012cb
--- /dev/null
+++ b/i18n/uk-UA/dataset-documents.ts
@@ -0,0 +1,395 @@
+const translation = {
+  list: {
+    title: '袛芯泻褍屑械薪褌懈',
+    desc: '孝褍褌 胁褨写芯斜褉邪卸邪褞褌褜褋褟 胁褋褨 褎邪泄谢懈 袟薪邪薪薪褟, 褨 胁褋械 袟薪邪薪薪褟 屑芯卸薪邪 蟹胁鈥櫻徯沸把傂� 蟹 褑懈褌邪褌邪屑懈 Dify 邪斜芯 锌褉芯褨薪写械泻褋褍胁邪褌懈 蟹邪 写芯锌芯屑芯谐芯褞 锌谢邪谐褨薪邪 Chat.',
+    addFile: '写芯写邪褌懈 褎邪泄谢',
+    addPages: '袛芯写邪褌懈 褋褌芯褉褨薪泻懈',
+    table: {
+      header: {
+        fileName: '袧袗袟袙袗 肖袗袡袥校',
+        words: '袣袉袥鞋袣袉小孝鞋 小袥袉袙',
+        hitCount: '袣袉袥鞋袣袉小孝鞋 袙袠袥校效袝袧鞋',
+        uploadTime: '效袗小 袟袗袙袗袧孝袗袞袝袧袧携',
+        status: '小孝袗孝校小',
+        action: '袛袉携',
+        chunkingMode: '袪袝袞袠袦 肖袪袗袚袦袝袧孝袗笑袉袊',
+      },
+      name: '袉屑\'褟',
+      rename: '袩械褉械泄屑械薪褍胁邪褌懈',
+    },
+    action: {
+      uploadFile: '袟邪胁邪薪褌邪卸懈褌懈 薪芯胁懈泄 褎邪泄谢',
+      settings: '袧邪谢邪褕褌褍胁邪薪薪褟 褋械谐屑械薪褌邪',
+      addButton: '袛芯写邪褌懈 褎褉邪谐屑械薪褌',
+      add: '袛芯写邪褌懈 褎褉邪谐屑械薪褌',
+      batchAdd: '袩邪泻械褌薪械 写芯写邪胁邪薪薪褟',
+      archive: '袗褉褏褨胁',
+      unarchive: '袪芯蟹邪褉褏褨胁褍胁邪褌懈',
+      delete: '袙懈写邪谢懈褌懈',
+      enableWarning: '袗褉褏褨胁芯胁邪薪懈泄 褎邪泄谢 薪械屑芯卸谢懈胁芯 邪泻褌懈胁褍胁邪褌懈',
+      sync: '小懈薪褏褉芯薪褨蟹褍胁邪褌懈',
+    },
+    index: {
+      enable: '袗泻褌懈胁褍胁邪褌懈',
+      disable: '袛械邪泻褌懈胁褍胁邪褌懈',
+      all: '校褋褨',
+      enableTip: '肖邪泄谢 屑芯卸薪邪 褨薪写械泻褋褍胁邪褌懈',
+      disableTip: '肖邪泄谢 薪械 屑芯卸薪邪 褨薪写械泻褋褍胁邪褌懈',
+    },
+    status: {
+      queuing: '袙 褔械褉蟹褨',
+      indexing: '袉薪写械泻褋褍胁邪薪薪褟',
+      paused: '袩褉懈蟹褍锌懈薪械薪芯',
+      error: '袩芯屑懈谢泻邪',
+      available: '袛芯褋褌褍锌薪芯',
+      enabled: '袗泻褌懈胁芯胁邪薪芯',
+      disabled: '袛械邪泻褌懈胁芯胁邪薪芯',
+      archived: '袗褉褏褨胁芯胁邪薪芯',
+    },
+    empty: {
+      title: '袛芯泻褍屑械薪褌邪褑褨褩 褖械 薪械屑邪褦',
+      upload: {
+        tip: '袙懈 屑芯卸械褌械 蟹邪胁邪薪褌邪卸褍胁邪褌懈 褎邪泄谢懈, 褋懈薪褏褉芯薪褨蟹褍胁邪褌懈 蟹 胁械斜-褋邪泄褌褍 邪斜芯 蟹 胁械斜-锌褉芯谐褉邪屑, 褌邪泻懈褏 褟泻 Notion, GitHub 褌芯褖芯.',
+      },
+      sync: {
+        tip: 'Dify 锌械褉褨芯写懈褔薪芯 蟹邪胁邪薪褌邪卸褍胁邪褌懈屑械 褎邪泄谢懈 蟹 胁邪褕芯谐芯 Notion 褨 蟹邪胁械褉褕褍胁邪褌懈屑械 芯斜褉芯斜泻褍.',
+      },
+    },
+    delete: {
+      title: '袙懈 胁锌械胁薪械薪褨, 褖芯 褏芯褔械褌械 胁懈写邪谢懈褌懈?',
+      content: '肖邪泄谢 胁懈写邪谢械薪芯 褍褋锌褨褕薪芯.',
+    },
+    batchModal: {
+      title: '袩邪泻械褌薪械 写芯写邪胁邪薪薪褟 褎褉邪谐屑械薪褌褨胁',
+      csvUploadTitle: '袩械褉械褌褟谐薪褨褌褜 褎邪泄谢 CSV 褋褞写懈 邪斜芯 薪邪褌懈褋薪褨褌褜, 褖芯斜',
+      browse: '锌械褉械谐谢褟薪褍褌懈',
+      tip: 'CSV-褎邪泄谢 锌芯胁懈薪械薪 屑邪褌懈 褌邪泻褍 褋褌褉褍泻褌褍褉褍:',
+      question: '蟹邪锌懈褌邪薪薪褟',
+      answer: '胁褨写锌芯胁褨写褜',
+      contentTitle: '薪邪蟹胁邪 胁屑褨褋褌褍',
+      content: '胁屑褨褋褌',
+      template: '袟邪胁邪薪褌邪卸懈褌懈 褕邪斜谢芯薪',
+      cancel: '小泻邪褋褍胁邪褌懈',
+      run: '袟邪锌褍褋泻 锌邪泻械褌薪芯褩 芯斜褉芯斜泻懈',
+      runError: '袩芯屑懈谢泻邪 蟹邪锌褍褋泻褍 锌邪泻械褌薪芯褩 芯斜褉芯斜泻懈',
+      processing: '孝褉懈胁邪褦 锌邪泻械褌薪邪 芯斜褉芯斜泻邪',
+      completed: '袉屑锌芯褉褌 蟹邪胁械褉褕械薪芯',
+      error: '袩芯屑懈谢泻邪 褨屑锌芯褉褌褍',
+      ok: '袨袣',
+    },
+    addUrl: '袛芯写邪褌懈 URL-邪写褉械褋褍',
+    learnMore: '袛褨蟹薪邪褌懈褋褟 斜褨谢褜褕械',
+  },
+  metadata: {
+    title: '袦械褌邪写邪薪褨',
+    desc: '袦邪褉泻褍胁邪薪薪褟 屑械褌邪写邪薪懈褏 写谢褟 写芯泻褍屑械薪褌褨胁 写芯蟹胁芯谢褟褦 褕褌褍褔薪芯屑褍 褨薪褌械谢械泻褌褍 褋胁芯褦褔邪褋薪芯 芯褌褉懈屑褍胁邪褌懈 写芯 薪懈褏 写芯褋褌褍锌 褨 胁懈泻褉懈胁邪褦 写卸械褉械谢芯 锌芯褋懈谢邪薪褜 写谢褟 泻芯褉懈褋褌褍胁邪褔褨胁.',
+    dateTimeFormat: 'MMMM D, YYYY hh:mm A',
+    docTypeSelectTitle: '袘褍写褜 谢邪褋泻邪, 胁懈斜械褉褨褌褜 褌懈锌 写芯泻褍屑械薪褌邪',
+    docTypeChangeTitle: '袟屑褨薪懈褌懈 褌懈锌 写芯泻褍屑械薪褌邪',
+    docTypeSelectWarning: '携泻褖芯 褌懈锌 写芯泻褍屑械薪褌邪 斜褍写械 蟹屑褨薪械薪芯, 薪邪褉邪蟹褨 蟹邪锌芯胁薪械薪褨 屑械褌邪写邪薪褨 斜褨谢褜褕械 薪械 蟹斜械褉褨谐邪褌懈屑褍褌褜褋褟',
+    firstMetaAction: '袩芯褔薪褨屑芯',
+    placeholder: {
+      add: '袛芯写邪褌懈 ',
+      select: '袙懈斜褉邪褌懈 ',
+    },
+    source: {
+      upload_file: '袟邪胁邪薪褌邪卸懈褌懈 褎邪泄谢',
+      notion: '小懈薪褏褉芯薪褨蟹褍胁邪褌懈 蟹 Notion',
+      github: '小懈薪褏褉芯薪褨蟹褍胁邪褌懈 蟹 Github',
+    },
+    type: {
+      book: '袣薪懈谐邪',
+      webPage: '袙械斜-褋褌芯褉褨薪泻邪',
+      paper: '袧邪褍泻芯胁邪 锌褉邪褑褟',
+      socialMediaPost: '袩芯褋褌 褍 褋芯褑褨邪谢褜薪懈褏 屑械写褨邪',
+      personalDocument: '袨褋芯斜懈褋褌懈泄 写芯泻褍屑械薪褌',
+      businessDocument: '袛褨谢芯胁懈泄 写芯泻褍屑械薪褌',
+      IMChat: '效邪褌 屑懈褌褌褦胁懈褏 锌芯胁褨写芯屑谢械薪褜',
+      wikipediaEntry: '小褌邪褌褌褟 褍 袙褨泻褨锌械写褨褩',
+      notion: '小懈薪褏褉芯薪褨蟹褍胁邪褌懈 蟹 Notion',
+      github: '小懈薪褏褉芯薪褨蟹褍胁邪褌懈 蟹 Github',
+      technicalParameters: '孝械褏薪褨褔薪褨 锌邪褉邪屑械褌褉懈',
+    },
+    field: {
+      processRule: {
+        processDoc: '袨斜褉芯斜泻邪 写芯泻褍屑械薪褌邪',
+        segmentRule: '袩褉邪胁懈谢芯 褋械谐屑械薪褌褍胁邪薪薪褟',
+        segmentLength: '袛芯胁卸懈薪邪 褎褉邪谐屑械薪褌褨胁',
+        processClean: '袨褔懈褖械薪薪褟 褌械泻褋褌褍',
+      },
+      book: {
+        title: '袧邪蟹胁邪',
+        language: '袦芯胁邪',
+        author: '袗胁褌芯褉',
+        publisher: '袙懈写邪胁械褑褜',
+        publicationDate: '袛邪褌邪 锌褍斜谢褨泻邪褑褨褩',
+        ISBN: 'ISBN',
+        category: '袣邪褌械谐芯褉褨褟',
+      },
+      webPage: {
+        title: '袧邪蟹胁邪',
+        url: 'URL',
+        language: '袦芯胁邪',
+        authorPublisher: '袗胁褌芯褉/胁懈写邪胁械褑褜',
+        publishDate: '袛邪褌邪 锌褍斜谢褨泻邪褑褨褩',
+        topicKeywords: '孝械屑懈/泻谢褞褔芯胁褨 褋谢芯胁邪',
+        description: '袨锌懈褋',
+      },
+      paper: {
+        title: '袧邪蟹胁邪',
+        language: '袦芯胁邪',
+        author: '袗胁褌芯褉',
+        publishDate: '袛邪褌邪 锌褍斜谢褨泻邪褑褨褩',
+        journalConferenceName: '袧邪蟹胁邪 卸褍褉薪邪谢褍/泻芯薪褎械褉械薪褑褨褩',
+        volumeIssuePage: '袙懈锌褍褋泻/薪芯屑械褉/褋褌芯褉褨薪泻邪',
+        DOI: 'DOI',
+        topicsKeywords: '孝械屑懈/泻谢褞褔芯胁褨 褋谢芯胁邪',
+        abstract: '袗薪芯褌邪褑褨褟',
+      },
+      socialMediaPost: {
+        platform: '袩谢邪褌褎芯褉屑邪',
+        authorUsername: '袗胁褌芯褉/褨屑鈥櫻� 泻芯褉懈褋褌褍胁邪褔邪',
+        publishDate: '袛邪褌邪 锌褍斜谢褨泻邪褑褨褩',
+        postURL: 'URL-邪写褉械褋邪 锌芯褋褌褍',
+        topicsTags: '孝械屑懈/褌械谐懈',
+      },
+      personalDocument: {
+        title: '袧邪蟹胁邪',
+        author: '袗胁褌芯褉',
+        creationDate: '袛邪褌邪 褋褌胁芯褉械薪薪褟',
+        lastModifiedDate: '袛邪褌邪 芯褋褌邪薪薪褜芯褩 蟹屑褨薪懈',
+        documentType: '孝懈锌 写芯泻褍屑械薪褌邪',
+        tagsCategory: '孝械谐懈/泻邪褌械谐芯褉褨褩',
+      },
+      businessDocument: {
+        title: '袧邪蟹胁邪',
+        author: '袗胁褌芯褉',
+        creationDate: '袛邪褌邪 褋褌胁芯褉械薪薪褟',
+        lastModifiedDate: '袛邪褌邪 芯褋褌邪薪薪褜芯褩 蟹屑褨薪懈',
+        documentType: '孝懈锌 写芯泻褍屑械薪褌邪',
+        departmentTeam: '袙褨写写褨谢/泻芯屑邪薪写邪',
+      },
+      IMChat: {
+        chatPlatform: '袩谢邪褌褎芯褉屑邪 褔邪褌褍',
+        chatPartiesGroupName: '小褌芯褉芯薪懈 褔邪褌褍/薪邪蟹胁邪 谐褉褍锌懈',
+        participants: '校褔邪褋薪懈泻懈',
+        startDate: '袛邪褌邪 锌芯褔邪褌泻褍',
+        endDate: '袛邪褌邪 蟹邪胁械褉褕械薪薪褟',
+        topicsKeywords: '孝械屑懈/泻谢褞褔芯胁褨 褋谢芯胁邪',
+        fileType: '孝懈锌 褎邪泄谢褍',
+      },
+      wikipediaEntry: {
+        title: '袧邪蟹胁邪',
+        language: '袦芯胁邪',
+        webpageURL: 'URL-邪写褉械褋邪 胁械斜褋褌芯褉褨薪泻懈',
+        editorContributor: '袪械写邪泻褌芯褉/邪胁褌芯褉',
+        lastEditDate: '袛邪褌邪 芯褋褌邪薪薪褜芯谐芯 褉械写邪谐褍胁邪薪薪褟',
+        summaryIntroduction: '袪械蟹褞屑械/胁褋褌褍锌',
+      },
+      notion: {
+        title: '袧邪蟹胁邪',
+        language: '袦芯胁邪',
+        author: '袗胁褌芯褉',
+        createdTime: '效邪褋 褋褌胁芯褉械薪薪褟',
+        lastModifiedTime: '效邪褋 芯褋褌邪薪薪褜芯褩 蟹屑褨薪懈',
+        url: 'URL',
+        tag: '孝械谐',
+        description: '袨锌懈褋',
+      },
+      github: {
+        repoName: '袧邪蟹胁邪 褉械锌芯蟹懈褌芯褉褨褞',
+        repoDesc: '袨锌懈褋 褉械锌芯蟹懈褌芯褉褨褞',
+        repoOwner: '袙谢邪褋薪懈泻 褉械锌芯蟹懈褌芯褉褨褞',
+        fileName: '袧邪蟹胁邪 褎邪泄谢褍',
+        filePath: '楔谢褟褏 写芯 褎邪泄谢褍',
+        programmingLang: '袦芯胁邪 锌褉芯谐褉邪屑褍胁邪薪薪褟',
+        url: 'URL',
+        license: '袥褨褑械薪蟹褨褟',
+        lastCommitTime: '效邪褋 芯褋褌邪薪薪褜芯谐芯 泻芯屑褨褌褍',
+        lastCommitAuthor: '袗胁褌芯褉 芯褋褌邪薪薪褜芯谐芯 泻芯屑褨褌褍',
+      },
+      originInfo: {
+        originalFilename: '袨褉懈谐褨薪邪谢褜薪邪 薪邪蟹胁邪 褎邪泄谢褍',
+        originalFileSize: '袨褉懈谐褨薪邪谢褜薪懈泄 褉芯蟹屑褨褉 褎邪泄谢褍',
+        uploadDate: '袛邪褌邪 蟹邪胁邪薪褌邪卸械薪薪褟',
+        lastUpdateDate: '袛邪褌邪 芯褋褌邪薪薪褜芯谐芯 芯薪芯胁谢械薪薪褟',
+        source: '袛卸械褉械谢芯',
+      },
+      technicalParameters: {
+        segmentSpecification: '小锌械褑懈褎褨泻邪褑褨褟 褎褉邪谐屑械薪褌褨胁',
+        segmentLength: '袛芯胁卸懈薪邪 褎褉邪谐屑械薪褌褨胁',
+        avgParagraphLength: '小械褉械写薪褟 写芯胁卸懈薪邪 邪斜蟹邪褑褨胁',
+        paragraphs: '袗斜蟹邪褑懈',
+        hitCount: '袣褨谢褜泻褨褋褌褜 胁懈谢褍褔械薪褜',
+        embeddingTime: '效邪褋 胁斜褍写芯胁褍胁邪薪薪褟',
+        embeddedSpend: '袙懈褌褉邪褔械薪芯 薪邪 胁斜褍写芯胁褍胁邪薪薪褟',
+      },
+    },
+    languageMap: {
+      zh: '袣懈褌邪泄褋褜泻邪',
+      en: '袗薪谐谢褨泄褋褜泻邪',
+      es: '袉褋锌邪薪褋褜泻邪',
+      fr: '肖褉邪薪褑褍蟹褜泻邪',
+      de: '袧褨屑械褑褜泻邪',
+      ja: '携锌芯薪褋褜泻邪',
+      ko: '袣芯褉械泄褋褜泻邪',
+      ru: '袪芯褋褨泄褋褜泻邪',
+      ar: '袗褉邪斜褋褜泻邪',
+      pt: '袩芯褉褌褍谐邪谢褜褋褜泻邪',
+      it: '袉褌邪谢褨泄褋褜泻邪',
+      nl: '袚芯谢谢邪薪写褋褜泻邪',
+      pl: '袩芯谢褜褋褜泻邪',
+      sv: '楔胁械写褋褜泻邪',
+      tr: '孝褍褉械褑褜泻邪',
+      he: '袉胁褉懈褌',
+      hi: '袚褨薪写褨',
+      da: '袛邪薪褋褜泻邪',
+      fi: '肖褨薪褋褜泻邪',
+      no: '袧芯褉胁械蟹褜泻邪',
+      hu: '校谐芯褉褋褜泻邪',
+      el: '袚褉械褑褜泻邪',
+      cs: '效械褋褜泻邪',
+      th: '孝邪泄褋褜泻邪',
+      id: '袉薪写芯薪械蟹褨泄褋褜泻邪',
+      uk: '校泻褉邪褩薪褋褜泻邪',
+    },
+    categoryMap: {
+      book: {
+        fiction: '肖邪薪褌邪褋褌懈泻邪',
+        biography: '袘褨芯谐褉邪褎褨褟',
+        history: '袉褋褌芯褉褨褟',
+        science: '袧邪褍泻邪',
+        technology: '孝械褏薪芯谢芯谐褨褩',
+        education: '袧邪胁褔邪谢褜薪邪 谢褨褌械褉邪褌褍褉邪',
+        philosophy: '肖褨谢芯褋芯褎褨褟',
+        religion: '袪械谢褨谐褨褟',
+        socialSciences: '小芯褑褨邪谢褜薪褨 薪邪褍泻懈',
+        art: '袦懈褋褌械褑褌胁芯',
+        travel: '袩芯写芯褉芯卸褨',
+        health: '袟写芯褉芯胁始褟',
+        selfHelp: '小邪屑芯写芯锌芯屑芯谐邪',
+        businessEconomics: '袘褨蟹薪械褋-械泻芯薪芯屑褨泻邪',
+        cooking: '袣褍褏芯胁邪褉褨薪薪褟',
+        childrenYoungAdults: '袣薪懈谐懈 蟹 胁懈褏芯胁邪薪薪褟',
+        comicsGraphicNovels: '袣芯屑褨泻褋懈',
+        poetry: '袩芯械蟹褨褟',
+        drama: '袛褉邪屑邪',
+        other: '袉薪褕械',
+      },
+      personalDoc: {
+        notes: '袟邪屑褨褌泻懈', // General notes or memos
+        blogDraft: '效械褉薪械褌泻邪 斜谢芯谐褍',
+        diary: '些芯写械薪薪懈泻',
+        researchReport: '袧邪褍泻芯胁懈泄 蟹胁褨褌',
+        bookExcerpt: '校褉懈胁芯泻 蟹 泻薪懈谐懈',
+        schedule: '袪芯蟹泻谢邪写',
+        list: '小锌懈褋芯泻',
+        projectOverview: '袨谐谢褟写 锌褉芯械泻褌褍',
+        photoCollection: '袣芯谢械泻褑褨褟 褎芯褌芯谐褉邪褎褨泄',
+        creativeWriting: '孝胁芯褉褔械 锌懈褋褜屑芯',
+        codeSnippet: '肖褉邪谐屑械薪褌 泻芯写褍',
+        designDraft: '袛懈蟹邪泄薪-锌褉芯械泻褌',
+        personalResume: '袨褋芯斜懈褋褌械 褉械蟹褞屑械',
+        other: '袉薪褕械',
+      },
+      businessDoc: {
+        meetingMinutes: '袩褉芯褌芯泻芯谢 蟹褍褋褌褉褨褔褨',
+        researchReport: '袧邪褍泻芯胁懈泄 蟹胁褨褌',
+        proposal: '袩褉芯锌芯蟹懈褑褨褟',
+        employeeHandbook: '袩芯褋褨斜薪懈泻 写谢褟 锌褉邪褑褨胁薪懈泻褨胁',
+        trainingMaterials: '袧邪胁褔邪谢褜薪褨 屑邪褌械褉褨邪谢懈',
+        requirementsDocument: '袛芯泻褍屑械薪褌 蟹 胁懈屑芯谐邪屑懈',
+        designDocument: '袩褉芯褦泻褌薪懈泄 写芯泻褍屑械薪褌',
+        productSpecification: '小锌械褑懈褎褨泻邪褑褨褟 锌褉芯写褍泻褌褍',
+        financialReport: '肖褨薪邪薪褋芯胁懈泄 蟹胁褨褌',
+        marketAnalysis: '袗薪邪谢褨蟹 褉懈薪泻褍',
+        projectPlan: '袩谢邪薪 锌褉芯械泻褌褍',
+        teamStructure: '小褌褉褍泻褌褍褉邪 泻芯屑邪薪写懈',
+        policiesProcedures: '袩芯谢褨褌懈泻懈 褌邪 锌褉芯褑械写褍褉懈',
+        contractsAgreements: '袣芯薪褌褉邪泻褌懈 褌邪 褍谐芯写懈',
+        emailCorrespondence: '袝谢械泻褌褉芯薪薪械 谢懈褋褌褍胁邪薪薪褟',
+        other: '袉薪褕械',
+      },
+    },
+  },
+  embedding: {
+    processing: '袨斜褉芯斜泻邪 胁械泻褌芯褉薪芯谐芯 锌褉械写褋褌邪胁谢械薪薪褟 褋谢褨胁...',
+    paused: '袩芯斜褍写芯胁邪 胁械泻褌芯褉褨胁 锌褉懈蟹褍锌懈薪械薪邪',
+    completed: '袩芯斜褍写芯胁邪 胁械泻褌芯褉褨胁 蟹邪胁械褉褕械薪邪',
+    error: '袩芯屑懈谢泻邪 锌芯斜褍写芯胁懈 胁械泻褌芯褉褨胁',
+    docName: '袩芯锌械褉械写薪褟 芯斜褉芯斜泻邪 写芯泻褍屑械薪褌邪',
+    mode: '袩褉邪胁懈谢芯 褋械谐屑械薪褌邪褑褨褩',
+    segmentLength: '袛芯胁卸懈薪邪 褎褉邪谐屑械薪褌褨胁',
+    textCleaning: '袩芯锌械褉械写薪褦 胁懈蟹薪邪褔械薪薪褟 褌械泻褋褌褍 褌邪 芯褔懈褖械薪薪褟',
+    segments: '袩邪褉邪谐褉邪褎懈',
+    highQuality: '袪械卸懈屑 胁懈褋芯泻芯褩 褟泻芯褋褌褨',
+    economy: '袝泻芯薪芯屑薪懈泄 褉械卸懈屑',
+    estimate: '袪芯蟹褉邪褏褍薪芯泻',
+    stop: '袟褍锌懈薪懈褌懈 芯斜褉芯斜泻褍',
+    resume: '袩褉芯写芯胁卸懈褌懈 芯斜褉芯斜泻褍',
+    automatic: '袗胁褌芯屑邪褌懈褔薪懈泄',
+    custom: '袣芯褉懈褋褌褍胁邪褑褜泻懈泄',
+    previewTip: '袩芯锌械褉械写薪褨泄 锌械褉械谐谢褟写 锌邪褉邪谐褉邪褎邪 斜褍写械 写芯褋褌褍锌薪懈泄 锌褨褋谢褟 蟹邪胁械褉褕械薪薪褟 锌芯斜褍写芯胁懈 胁械泻褌芯褉褨胁',
+    childMaxTokens: '袛懈褌懈薪邪',
+    pause: '袩邪褍蟹邪',
+    parentMaxTokens: '袪芯写懈褌械谢褜',
+    hierarchical: '袘邪褌褜泻懈-写褨褌懈',
+  },
+  segment: {
+    paragraphs: '袩邪褉邪谐褉邪褎懈',
+    keywords: '袣谢褞褔芯胁褨 褋谢芯胁邪',
+    addKeyWord: '袛芯写邪褌懈 泻谢褞褔芯胁械 褋谢芯胁芯',
+    keywordError: '袦邪泻褋懈屑邪谢褜薪邪 写芯胁卸懈薪邪 泻谢褞褔芯胁芯谐芯 褋谢芯胁邪 鈥� 20 褋懈屑胁芯谢褨胁',
+    characters: '褋懈屑胁芯谢褨胁',
+    hitCount: '袣褨谢褜泻褨褋褌褜 锌芯褕褍泻褍',
+    vectorHash: '袙械泻褌芯褉薪懈泄 褏械褕: ',
+    questionPlaceholder: '写芯写邪泄褌械 蟹邪锌懈褌邪薪薪褟 褌褍褌',
+    questionEmpty: '袩懈褌邪薪薪褟 薪械 屑芯卸械 斜褍褌懈 锌芯褉芯卸薪褨屑',
+    answerPlaceholder: '写芯写邪泄褌械 胁褨写锌芯胁褨写褜 褌褍褌',
+    answerEmpty: '袙褨写锌芯胁褨写褜 薪械 屑芯卸械 斜褍褌懈 锌芯褉芯卸薪褜芯褞',
+    contentPlaceholder: '写芯写邪泄褌械 胁屑褨褋褌 褌褍褌',
+    contentEmpty: '袙屑褨褋褌 薪械 屑芯卸械 斜褍褌懈 锌芯褉芯卸薪褨屑',
+    newTextSegment: '袧芯胁懈泄 褌械泻褋褌芯胁懈泄 褋械谐屑械薪褌',
+    newQaSegment: '袧芯胁懈泄 褋械谐屑械薪褌 蟹邪锌懈褌邪薪褜 褌邪 胁褨写锌芯胁褨写械泄',
+    delete: '袙懈写邪谢懈褌懈 褑械泄 褎褉邪谐屑械薪褌?',
+    chunks_one: '楔袦袗孝袨袣',
+    childChunk: '袛芯褔褨褉薪褨泄 褕屑邪褌芯泻',
+    clearFilter: '袨褔懈褋褌懈褌懈 褎褨谢褜褌褉',
+    addAnother: '袛芯写邪褌懈 褖械 芯写懈薪',
+    newChunk: '袧芯胁懈泄 褕屑邪褌芯泻',
+    searchResults_other: '袪袝袟校袥鞋孝袗孝袉袙',
+    parentChunks_other: '袘袗孝鞋袣袉袙小鞋袣袉 肖袪袗袚袦袝袧孝袠',
+    childChunks_other: '袛袨效袉袪袧袉 楔袦袗孝袣袠',
+    chunkDetail: '袛械褌邪谢褨蟹邪褑褨褟 褎褉邪谐屑械薪褌邪',
+    regeneratingTitle: '袪械谐械薪械褉邪褑褨褟 写芯褔褨褉薪褨褏 褎褉邪谐屑械薪褌褨胁',
+    chunkAdded: '袛芯写邪薪芯 1 褎褉邪谐屑械薪褌',
+    addChildChunk: '袛芯写邪褌懈 写芯褔褨褉薪褨泄 褎褉邪谐屑械薪褌',
+    empty: '楔屑邪褌芯泻 薪械 蟹薪邪泄写械薪芯',
+    chunks_other: '楔袦袗孝袣袠',
+    editedAt: '袟邪 褉械写邪泻褑褨褦褞',
+    searchResults_zero: '袪袝袟校袥鞋孝袗孝',
+    collapseChunks: '袟谐芯褉褌邪薪薪褟 褕屑邪褌泻褨胁',
+    childChunkAdded: '袛芯写邪薪芯 1 写芯褔褨褉薪褨泄 褎褉邪谐屑械薪褌',
+    editParentChunk: '袪械写邪谐褍胁邪褌懈 斜邪褌褜泻褨胁褋褜泻懈泄 褎褉邪谐屑械薪褌',
+    newChildChunk: '袧芯胁懈泄 写芯褔褨褉薪褨泄 褕屑邪褌芯泻',
+    editChunk: '袪械写邪谐褍胁邪褌懈 褎褉邪谐屑械薪褌',
+    regenerationSuccessTitle: '袪械谐械薪械褉邪褑褨褟 蟹邪胁械褉褕械薪邪',
+    edited: '袪袝袛袗袚校袙袗孝袠',
+    regenerationConfirmMessage: '袪械谐械薪械褉邪褑褨褟 写芯褔褨褉薪褨褏 褎褉邪谐屑械薪褌褨胁 锌械褉械蟹邪锌懈褋褍褦 锌芯褌芯褔薪褨 写芯褔褨褉薪褨 褎褉邪谐屑械薪褌懈, 胁泻谢褞褔邪褞褔懈 胁褨写褉械写邪谐芯胁邪薪褨 褎褉邪谐屑械薪褌懈 褌邪 薪械褖芯写邪胁薪芯 写芯写邪薪褨 褎褉邪谐屑械薪褌懈. 袪械谐械薪械褉邪褑褨褟 薪械 屑芯卸械 斜褍褌懈 褋泻邪褋芯胁邪薪邪.',
+    chunk: '楔屑邪褌芯泻',
+    childChunks_one: '袛袨效袉袪袧携 效袗小孝袠袧袗',
+    parentChunk: '袘邪褌褜泻褨胁褋褜泻懈泄 褔邪薪泻',
+    parentChunks_one: '袘袗孝鞋袣袉袙小鞋袣袠袡 肖袪袗袚袦袝袧孝',
+    characters_other: '小懈屑胁芯谢褨胁',
+    searchResults_one: '袪袝袟校袥鞋孝袗孝',
+    regeneratingMessage: '笑械 屑芯卸械 蟹邪泄薪褟褌懈 屑懈褌褜, 斜褍写褜 谢邪褋泻邪, 蟹邪褔械泻邪泄褌械...',
+    characters_one: '蟹薪邪泻',
+    addChunk: '袛芯写邪褌懈 褕屑邪褌芯泻',
+    editChildChunk: '袪械写邪谐褍胁邪褌懈 写芯褔褨褉薪褨泄 褎褉邪谐屑械薪褌',
+    regenerationSuccessMessage: '袙懈 屑芯卸械褌械 蟹邪泻褉懈褌懈 褑械 胁褨泻薪芯.',
+    expandChunks: '袪芯蟹谐芯褉褌邪薪薪褟 褎褉邪谐屑械薪褌褨胁',
+    regenerationConfirmTitle: '啸芯褔械褌械 褉械谐械薪械褉褍胁邪褌懈 写懈褌褟褔褨 褕屑邪褌泻懈?',
+  },
+}
+
+export default translation
diff --git a/i18n/uk-UA/dataset-hit-testing.ts b/i18n/uk-UA/dataset-hit-testing.ts
new file mode 100644
index 0000000..3567c09
--- /dev/null
+++ b/i18n/uk-UA/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: '孝械褋褌褍胁邪薪薪褟 胁懈斜褨褉泻懈',
+  desc: '孝械褋褌褍胁邪薪薪褟 械褎械泻褌懈胁薪芯褋褌褨 锌芯褕褍泻褍 蟹薪邪薪褜 薪邪 芯褋薪芯胁褨 薪邪写邪薪芯谐芯 褌械泻褋褌芯胁芯谐芯 蟹邪锌懈褌褍.',
+  dateTimeFormat: 'DD/MM/YYYY HH:mm A',
+  recents: '袨褋褌邪薪薪褨',
+  table: {
+    header: {
+      source: '袛卸械褉械谢芯',
+      text: '孝械泻褋褌',
+      time: '效邪褋',
+    },
+  },
+  input: {
+    title: '袙懈褏褨写薪懈泄 褌械泻褋褌',
+    placeholder: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 褌械泻褋褌, 褉械泻芯屑械薪写褍褦褌褜褋褟 泻芯褉芯褌泻械 写械泻谢邪褉邪褌懈胁薪械 褉械褔械薪薪褟.',
+    countWarning: '袛芯 200 褋懈屑胁芯谢褨胁.',
+    indexWarning: '孝褨谢褜泻懈 胁懈褋芯泻芯褟泻褨褋薪褨 蟹薪邪薪薪褟.',
+    testing: '孝械褋褌褍胁邪薪薪褟',
+  },
+  hit: {
+    title: '袙袠袘袪袗袧袉 袗袘袟袗笑袠',
+    emptyTip: '袪械蟹褍谢褜褌邪褌懈 褌械褋褌褍胁邪薪薪褟 胁懈斜褨褉泻懈 胁褨写芯斜褉邪蟹褟褌褜褋褟 褌褍褌',
+  },
+  noRecentTip: '孝褍褌 薪械屑邪褦 褉械蟹褍谢褜褌邪褌褨胁 芯褋褌邪薪薪褨褏 蟹邪锌懈褌褨胁',
+  viewChart: '袩袝袪袝袚袥携袧校孝袠 袙袝袣孝袨袪袧校 袛袉袗袚袪袗袦校',
+  settingTitle: '袧邪谢邪褕褌褍胁邪薪薪褟 芯褌褉懈屑邪薪薪褟',
+  viewDetail: '袩械褉械谐谢褟薪褍褌懈 写械褌邪谢褨',
+  chunkDetail: '袛械褌邪谢褨蟹邪褑褨褟 褎褉邪谐屑械薪褌邪',
+  hitChunks: '袧邪褌懈褋薪褨褌褜 {{num}} 薪邪 写芯褔褨褉薪褨 褕屑邪褌泻懈',
+  open: '袙褨写泻褉懈胁邪褌懈',
+  keyword: '袣谢褞褔芯胁褨 褋谢芯胁邪',
+  records: '袟邪锌懈褋懈',
+}
+
+export default translation
diff --git a/i18n/uk-UA/dataset-settings.ts b/i18n/uk-UA/dataset-settings.ts
new file mode 100644
index 0000000..f5403b8
--- /dev/null
+++ b/i18n/uk-UA/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: '袧邪谢邪褕褌褍胁邪薪薪褟 斜邪蟹懈 蟹薪邪薪褜',
+  desc: '孝褍褌 胁懈 屑芯卸械褌械 蟹屑褨薪懈褌懈 胁谢邪褋褌懈胁芯褋褌褨 褌邪 屑械褌芯写懈 褉芯斜芯褌懈 斜邪蟹懈 蟹薪邪薪褜.',
+  form: {
+    name: '袧邪蟹胁邪 斜邪蟹懈 蟹薪邪薪褜',
+    namePlaceholder: '袙胁械写褨褌褜 薪邪蟹胁褍 斜邪蟹懈 蟹薪邪薪褜',
+    nameError: '袧邪蟹胁邪 薪械 屑芯卸械 斜褍褌懈 锌芯褉芯卸薪褜芯褞',
+    desc: '袨锌懈褋 斜邪蟹懈 蟹薪邪薪褜',
+    descInfo: '袧邪锌懈褕褨褌褜 蟹褉芯蟹褍屑褨谢懈泄 褌械泻褋褌芯胁懈泄 芯锌懈褋, 褖芯斜 芯泻褉械褋谢懈褌懈 胁屑褨褋褌 斜邪蟹懈 蟹薪邪薪褜. 笑械泄 芯锌懈褋 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈屑械褌褜褋褟 褟泻 芯褋薪芯胁邪 写谢褟 褍蟹谐芯写卸械薪薪褟 锌褨写 褔邪褋 胁懈斜芯褉褍 蟹 泻褨谢褜泻芯褏 斜邪蟹 蟹薪邪薪褜 写谢褟 胁懈褋薪芯胁泻褍.',
+    descPlaceholder: '袨锌懈褕褨褌褜, 褖芯 屑褨褋褌懈褌褜褋褟 胁 褑褨泄 斜邪蟹褨 蟹薪邪薪褜. 袛械褌邪谢褜薪懈泄 芯锌懈褋 写芯蟹胁芯谢褟褦 AI 褋胁芯褦褔邪褋薪芯 芯褌褉懈屑邪褌懈 写芯褋褌褍锌 写芯 胁屑褨褋褌褍 斜邪蟹懈 蟹薪邪薪褜. 携泻褖芯 蟹薪邪褔械薪薪褟 锌芯褉芯卸薪褦, Dify 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈屑械 褋褌褉邪褌械谐褨褞 胁谢褍褔邪薪褜 蟹邪 褍屑芯胁褔邪薪薪褟屑.',
+    descWrite: '袛褨蟹薪邪泄褌械褋褟, 褟泻 薪邪锌懈褋邪褌懈 褏芯褉芯褕懈泄 芯锌懈褋 斜邪蟹懈 蟹薪邪薪褜.',
+    permissions: '袛芯蟹胁芯谢懈',
+    permissionsOnlyMe: '孝褨谢褜泻懈 褟',
+    permissionsAllMember: '校褋褨 褔谢械薪懈 泻芯屑邪薪写懈',
+    indexMethod: '袦械褌芯写 褨薪写械泻褋邪褑褨褩',
+    indexMethodHighQuality: '袙懈褋芯泻邪 褟泻褨褋褌褜',
+    indexMethodHighQualityTip: '袙懈泻谢懈泻邪褌懈 屑芯写械谢褜 Embedding 写谢褟 芯斜褉芯斜泻懈, 褖芯斜 蟹邪斜械蟹锌械褔懈褌懈 胁懈褖褍 褌芯褔薪褨褋褌褜 锌褨写 褔邪褋 蟹邪锌懈褌褨胁 泻芯褉懈褋褌褍胁邪褔褨胁.',
+    indexMethodEconomy: '袝泻芯薪芯屑薪懈泄',
+    indexMethodEconomyTip: '袙懈泻芯褉懈褋褌芯胁褍泄褌械 邪胁褌芯薪芯屑薪褨 胁械泻褌芯褉薪褨 写胁懈谐褍薪懈, 褨薪写械泻褋懈 泻谢褞褔芯胁懈褏 褋谢褨胁 褌芯褖芯, 褖芯斜 蟹屑械薪褕懈褌懈 褌芯褔薪褨褋褌褜 斜械蟹 胁懈泻芯褉懈褋褌邪薪薪褟 褌芯泻械薪褨胁.',
+    embeddingModel: '袦芯写械谢褜 胁斜褍写芯胁褍胁邪薪薪褟',
+    embeddingModelTip: '袟屑褨薪懈褌懈 胁斜褍写芯胁邪薪褍 屑芯写械谢褜, 斜褍写褜 谢邪褋泻邪, 锌械褉械泄写褨褌褜 写芯 ',
+    embeddingModelTipLink: '袧邪谢邪褕褌褍胁邪薪薪褟',
+    retrievalSetting: {
+      title: '袧邪谢邪褕褌褍胁邪薪薪褟 胁懈斜褨褉泻懈',
+      learnMore: '袛褨蟹薪邪褌懈褋褟 斜褨谢褜褕械',
+      description: ' 锌褉芯 屑械褌芯写 胁懈斜褨褉泻懈.',
+      longDescription: ' 锌褉芯 屑械褌芯写 胁懈斜褨褉泻懈, 胁懈 屑芯卸械褌械 蟹屑褨薪懈褌懈 褑械 斜褍写褜-泻芯谢懈 胁 薪邪谢邪褕褌褍胁邪薪薪褟褏 斜邪蟹懈 蟹薪邪薪褜.',
+      method: '袦械褌芯写 芯褌褉懈屑邪薪薪褟',
+    },
+    save: '袟斜械褉械谐褌懈',
+    me: '(袙懈)',
+    permissionsInvitedMembers: '效邪褋褌泻芯胁褨 褔谢械薪懈 泻芯屑邪薪写懈',
+    externalKnowledgeAPI: 'API 蟹芯胁薪褨褕薪褨褏 蟹薪邪薪褜',
+    externalKnowledgeID: '袟芯胁薪褨褕薪褨泄 褨写械薪褌懈褎褨泻邪褌芯褉 蟹薪邪薪褜',
+    retrievalSettings: '袧邪谢邪褕褌褍胁邪薪薪褟 芯褌褉懈屑邪薪薪褟',
+    helpText: '袛褨蟹薪邪泄褌械褋褟, 褟泻 薪邪锌懈褋邪褌懈 褏芯褉芯褕懈泄 芯锌懈褋 薪邪斜芯褉褍 写邪薪懈褏.',
+    indexMethodChangeToEconomyDisabledTip: '袧械写芯褋褌褍锌薪芯 写谢褟 锌芯薪懈卸械薪薪褟 蟹 HQ 写芯 ECO',
+    upgradeHighQualityTip: '袩褨褋谢褟 芯薪芯胁谢械薪薪褟 写芯 褉械卸懈屑褍 胁懈褋芯泻芯褩 褟泻芯褋褌褨 锌芯胁械褉薪械薪薪褟 写芯 械泻芯薪芯屑薪芯谐芯 褉械卸懈屑褍 薪械写芯褋褌褍锌薪械',
+    searchModel: '袩芯褕褍泻 屑芯写械谢褨',
+  },
+}
+
+export default translation
diff --git a/i18n/uk-UA/dataset.ts b/i18n/uk-UA/dataset.ts
new file mode 100644
index 0000000..84bc8d9
--- /dev/null
+++ b/i18n/uk-UA/dataset.ts
@@ -0,0 +1,222 @@
+const translation = {
+  knowledge: '袟薪邪薪薪褟',
+  // 小泻芯褉芯褔械薪薪褟 胁褨写 '写芯泻褍屑械薪褌褨胁'
+  documentCount: ' 写芯泻.',
+  wordCount: ' 褌懈褋. 褋谢褨胁',
+  appCount: ' 锌芯胁\'褟蟹邪薪懈褏 写芯写邪褌泻褨胁',
+  createDataset: '小褌胁芯褉懈褌懈 袟薪邪薪薪褟',
+  createDatasetIntro: '袉屑锌芯褉褌褍泄褌械 胁谢邪褋薪褨 褌械泻褋褌芯胁褨 写邪薪褨 邪斜芯 蟹邪锌懈褋褍泄褌械 写邪薪褨 胁 褉械邪谢褜薪芯屑褍 褔邪褋褨 褔械褉械蟹 Webhook 写谢褟 锌芯泻褉邪褖械薪薪褟 LLM-泻芯薪褌械泻褋褌褍.',
+  deleteDatasetConfirmTitle: '袙懈写邪谢懈褌懈 褑械 袟薪邪薪薪褟?',
+  deleteDatasetConfirmContent:
+        '袙懈写邪谢械薪薪褟 "袟薪邪薪薪褟" 褦 薪械蟹胁芯褉芯褌薪褨屑. 袣芯褉懈褋褌褍胁邪褔褨 斜褨谢褜褕械 薪械 屑邪褌懈屑褍褌褜 写芯褋褌褍锌褍 写芯 袟薪邪薪褜, 邪 胁褋褨 泻芯薪褎褨谐褍褉邪褑褨褩 锌褨写泻邪蟹芯泻 褨 卸褍褉薪邪谢懈 斜褍写褍褌褜 斜械蟹锌芯胁芯褉芯褌薪芯 胁懈写邪谢械薪褨.',
+  datasetUsedByApp: '笑褨 蟹薪邪薪薪褟 胁懈泻芯褉懈褋褌芯胁褍褞褌褜褋褟 写械褟泻懈屑懈 写芯写邪褌泻邪屑懈. 袛芯写邪褌泻懈 斜褨谢褜褕械 薪械 蟹屑芯卸褍褌褜 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 褑褨 袟薪邪薪薪褟, 邪 胁褋褨 泻芯薪褎褨谐褍褉邪褑褨褩 锌褨写泻邪蟹芯泻 褌邪 卸褍褉薪邪谢懈 斜褍写褍褌褜 芯褋褌邪褌芯褔薪芯 胁懈写邪谢械薪褨.',
+  datasetDeleted: '袟薪邪薪薪褟 胁懈写邪谢械薪芯',
+  datasetDeleteFailed: '袧械 胁写邪谢芯褋褟 胁懈写邪谢懈褌懈 袟薪邪薪薪褟',
+  didYouKnow: '效懈 蟹薪邪褦褌械 胁懈?',
+  intro1: '袟薪邪薪薪褟 屑芯卸薪邪 褨薪褌械谐褉褍胁邪褌懈 写芯 锌褉芯谐褉邪屑懈 Dify ',
+  intro2: '褟泻 泻芯薪褌械泻褋褌',
+  intro3: ',',
+  intro4: '邪斜芯 泄芯谐芯 ',
+  intro5: '屑芯卸薪邪 褋褌胁芯褉懈褌懈',
+  intro6: ' 褟泻 邪胁褌芯薪芯屑薪懈泄 锌谢邪谐褨薪 褨薪写械泻褋褍 ChatGPT 写谢褟 锌褍斜谢褨泻邪褑褨褩',
+  unavailable: '袧械写芯褋褌褍锌薪芯',
+  unavailableTip: '袦芯写械谢褜 胁斜褍写芯胁褍胁邪薪薪褟 薪械写芯褋褌褍锌薪邪, 薪械芯斜褏褨写薪芯 薪邪谢邪褕褌褍胁邪褌懈 屑芯写械谢褜 胁斜褍写芯胁褍胁邪薪薪褟 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑',
+  datasets: '袟袧袗袧袧携',
+  datasetsApi: 'API',
+  retrieval: {
+    semantic_search: {
+      title: '袙械泻褌芯褉薪懈泄 锌芯褕褍泻',
+      description: '袚械薪械褉褍褦 胁斜褍写芯胁褍胁邪薪薪褟 蟹邪锌懈褌褨胁 褨 褕褍泻邪褦 褎褉邪谐屑械薪褌 褌械泻褋褌褍, 薪邪泄斜褨谢褜褕 褋褏芯卸懈泄 薪邪 泄芯谐芯 胁械泻褌芯褉薪械 锌褉械写褋褌邪胁谢械薪薪褟.',
+    },
+    full_text_search: {
+      title: '袩芯胁薪芯褌械泻褋褌芯胁懈泄 锌芯褕褍泻',
+      description: '袉薪写械泻褋褍褦 胁褋褨 褌械褉屑褨薪懈 胁 写芯泻褍屑械薪褌褨, 写芯蟹胁芯谢褟褞褔懈 泻芯褉懈褋褌褍胁邪褔邪屑 褕褍泻邪褌懈 斜褍写褜-褟泻懈泄 褌械褉屑褨薪 褨 芯褌褉懈屑褍胁邪褌懈 胁褨写锌芯胁褨写薪懈泄 褎褉邪谐屑械薪褌 褌械泻褋褌褍, 褖芯 屑褨褋褌懈褌褜 褑械泄 褌械褉屑褨薪.',
+    },
+    hybrid_search: {
+      title: '袚褨斜褉懈写薪懈泄 锌芯褕褍泻',
+      description: '袙懈泻芯薪褍泄褌械 锌芯胁薪芯褌械泻褋褌芯胁懈泄 锌芯褕褍泻 褨 胁械泻褌芯褉薪懈泄 锌芯褕褍泻 芯写薪芯褔邪褋薪芯, 锌芯胁褌芯褉薪芯 褉邪薪卸褍褞褔懈, 褖芯斜 胁懈斜褉邪褌懈 薪邪泄泻褉邪褖褍 胁褨写锌芯胁褨写薪褨褋褌褜 薪邪 蟹邪锌懈褌 泻芯褉懈褋褌褍胁邪褔邪. 袧械芯斜褏褨写薪邪 泻芯薪褎褨谐褍褉邪褑褨褟 Rerank model API.',
+      recommend: '袪械泻芯屑械薪写芯胁邪薪芯',
+    },
+    invertedIndex: {
+      title: '袉薪胁械褉褌芯胁邪薪懈泄 褨薪写械泻褋',
+      description: '袉薪胁械褉褌芯胁邪薪懈泄 褨薪写械泻褋 鈥� 褑械 褋褌褉褍泻褌褍褉邪, 褟泻邪 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 械褎械泻褌懈胁薪芯谐芯 锌芯褕褍泻褍. 袨褉谐邪薪褨蟹芯胁邪薪懈泄 蟹邪 褌械褉屑褨薪邪屑懈, 泻芯卸械薪 褌械褉屑褨薪 胁泻邪蟹褍褦 薪邪 写芯泻褍屑械薪褌懈 邪斜芯 胁械斜-褋褌芯褉褨薪泻懈, 褖芯 泄芯谐芯 屑褨褋褌褟褌褜.',
+    },
+    change: '袟屑褨薪懈褌懈',
+    changeRetrievalMethod: '袟屑褨薪懈褌懈 屑械褌芯写 锌芯褕褍泻褍',
+  },
+  docsFailedNotice: '写芯泻褍屑械薪褌懈 薪械 胁写邪谢芯褋褟 锌褉芯褨薪写械泻褋褍胁邪褌懈',
+  retry: '袩芯胁褌芯褉懈褌懈 褋锌褉芯斜褍',
+  indexingTechnique: {
+    high_quality: '袙携',
+    economy: '袝袣袨',
+  },
+  indexingMethod: {
+    semantic_search: '袙袝袣孝袨袪',
+    full_text_search: '袩袨袙袧袠袡 孝袝袣小孝',
+    hybrid_search: '袚袉袘袪袠袛',
+    invertedIndex: '袉袧袙袝袪孝袨袙袗袧袠袡',
+  },
+  mixtureHighQualityAndEconomicTip: '袦芯写械谢褜 锌械褉械褉邪薪谐褍胁邪薪薪褟 锌芯褌褉褨斜薪邪 写谢褟 褋褍屑褨褕褨 胁懈褋芯泻芯褟泻褨褋薪懈褏 褌邪 械泻芯薪芯屑褨褔薪懈褏 斜邪蟹 蟹薪邪薪褜.',
+  inconsistentEmbeddingModelTip: '袦芯写械谢褜 锌械褉械褉邪薪谐褍胁邪薪薪褟 锌芯褌褉褨斜薪邪, 褟泻褖芯 屑芯写械谢褨 胁斜褍写芯胁褍胁邪薪薪褟 胁懈斜褉邪薪懈褏 斜邪蟹 蟹薪邪薪褜 褦 薪械褋褍屑褨褋薪懈屑懈.',
+  retrievalSettings: '袧邪谢邪褕褌褍胁邪薪薪褟 锌芯褕褍泻褍',
+  rerankSettings: '袧邪谢邪褕褌褍胁邪薪薪褟 锌械褉械褉邪薪谐褍胁邪薪薪褟',
+  weightedScore: {
+    title: '袟胁邪卸械薪邪 芯褑褨薪泻邪',
+    description: '袪械谐褍谢褞褞褔懈 锌褉懈蟹薪邪褔械薪褨 胁邪谐懈, 褑褟 褋褌褉邪褌械谐褨褟 锌械褉械褉邪薪谐褍胁邪薪薪褟 胁懈蟹薪邪褔邪褦, 褔懈 薪邪写邪胁邪褌懈 锌褉褨芯褉懈褌械褌 褋械屑邪薪褌懈褔薪芯屑褍 褔懈 泻谢褞褔芯胁芯屑褍 胁褨写锌芯胁褨写薪芯褋褌褨.',
+    semanticFirst: '小锌芯褔邪褌泻褍 褋械屑邪薪褌懈褔薪懈泄',
+    keywordFirst: '小锌芯褔邪褌泻褍 泻谢褞褔芯胁械 褋谢芯胁芯',
+    customized: '袧邪谢邪褕褌芯胁邪薪懈泄',
+    semantic: '小械屑邪薪褌懈褔薪懈泄',
+    keyword: '袣谢褞褔芯胁械 褋谢芯胁芯',
+  },
+  nTo1RetrievalLegacy: 'N-写芯-1 锌芯褕褍泻 斜褍写械 芯褎褨褑褨泄薪芯 蟹邪褋褌邪褉褨谢懈屑 蟹 胁械褉械褋薪褟. 袪械泻芯屑械薪写褍褦褌褜褋褟 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 薪邪泄薪芯胁褨褕懈泄 斜邪谐邪褌芯褕谢褟褏芯胁懈泄 锌芯褕褍泻 写谢褟 芯褌褉懈屑邪薪薪褟 泻褉邪褖懈褏 褉械蟹褍谢褜褌邪褌褨胁.',
+  nTo1RetrievalLegacyLink: '袛褨蟹薪邪褌懈褋褟 斜褨谢褜褕械',
+  nTo1RetrievalLegacyLinkText: 'N-写芯-1 锌芯褕褍泻 斜褍写械 芯褎褨褑褨泄薪芯 蟹邪褋褌邪褉褨谢懈屑 褍 胁械褉械褋薪褨.',
+  defaultRetrievalTip: '袟邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 芯褌褉懈屑邪薪薪褟 泻褨谢褜泻芯屑邪 褕谢褟褏邪屑懈. 袟薪邪薪薪褟 胁懈褌褟谐褍褞褌褜褋褟 蟹 泻褨谢褜泻芯褏 斜邪蟹 蟹薪邪薪褜, 邪 锌芯褌褨屑 蟹邪薪芯胁芯 褉邪薪卸褍褞褌褜褋褟.',
+  editExternalAPIConfirmWarningContent: {
+    front: '笑械泄 API 蟹芯胁薪褨褕薪褨褏 蟹薪邪薪褜 锌芯胁\'褟蟹邪薪懈泄 蟹',
+    end: '蟹芯胁薪褨褕薪褨 蟹薪邪薪薪褟, 褨 褑褟 屑芯写懈褎褨泻邪褑褨褟 斜褍写械 蟹邪褋褌芯褋芯胁邪薪邪 写芯 胁褋褨褏 薪懈褏. 袙懈 胁锌械胁薪械薪褨, 褖芯 褏芯褔械褌械 蟹斜械褉械谐褌懈 褑褞 蟹屑褨薪褍?',
+  },
+  editExternalAPIFormWarning: {
+    end: '袟芯胁薪褨褕薪褨 蟹薪邪薪薪褟',
+    front: '笑械泄 蟹芯胁薪褨褕薪褨泄 API 锌芯胁\'褟蟹邪薪懈泄 蟹',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: '袙懈写邪谢懈褌懈',
+      end: '?',
+    },
+    content: {
+      front: '笑械泄 API 蟹芯胁薪褨褕薪褨褏 蟹薪邪薪褜 锌芯胁\'褟蟹邪薪懈泄 蟹',
+      end: '蟹芯胁薪褨褕薪褨 蟹薪邪薪薪褟. 袙懈写邪谢械薪薪褟 褑褜芯谐芯 API 锌褉懈蟹胁械写械 写芯 胁褌褉邪褌懈 褔懈薪薪芯褋褌褨 胁褋褨褏 蟹 薪懈褏. 袙懈 胁锌械胁薪械薪褨, 褖芯 褏芯褔械褌械 胁懈写邪谢懈褌懈 褑械泄 API?',
+    },
+    noConnectionContent: '袙懈 胁锌械胁薪械薪褨, 褖芯 胁懈写邪谢懈谢懈 褑械泄 API?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: '袙懈斜械褉褨褌褜 API 蟹芯胁薪褨褕薪褨褏 蟹薪邪薪褜',
+  },
+  connectDatasetIntro: {
+    content: {
+      link: '袛褨蟹薪邪泄褌械褋褟, 褟泻 褋褌胁芯褉懈褌懈 蟹芯胁薪褨褕薪褨泄 API',
+      front: '些芯斜 锌褨写泻谢褞褔懈褌懈褋褟 写芯 蟹芯胁薪褨褕薪褜芯褩 斜邪蟹懈 蟹薪邪薪褜, 褋锌芯褔邪褌泻褍 锌芯褌褉褨斜薪芯 褋褌胁芯褉懈褌懈 蟹芯胁薪褨褕薪褨泄 API. 袘褍写褜 谢邪褋泻邪, 褍胁邪卸薪芯 锌褉芯褔懈褌邪泄褌械 褌邪 蟹胁械褉薪褨褌褜褋褟 写芯',
+      end: '. 袩芯褌褨屑 蟹薪邪泄写褨褌褜 胁褨写锌芯胁褨写薪懈泄 褨写械薪褌懈褎褨泻邪褌芯褉 蟹薪邪薪褜 褨 蟹邪锌芯胁薪褨褌褜 泄芯谐芯 褍 褎芯褉屑褨 蟹谢褨胁邪. 携泻褖芯 胁褋褟 褨薪褎芯褉屑邪褑褨褟 胁褨褉薪邪, 胁褨薪 邪胁褌芯屑邪褌懈褔薪芯 锌械褉械泄写械 写芯 锌芯褕褍泻芯胁芯谐芯 褌械褋褌褍 胁 斜邪蟹褨 蟹薪邪薪褜 锌褨褋谢褟 薪邪褌懈褋泻邪薪薪褟 泻薪芯锌泻懈 锌褨写泻谢褞褔械薪薪褟.',
+    },
+    title: '携泻 锌褨写泻谢褞褔懈褌懈褋褟 写芯 蟹芯胁薪褨褕薪褜芯褩 斜邪蟹懈 蟹薪邪薪褜',
+    learnMore: '袛褨蟹薪邪褌懈褋褟 斜褨谢褜褕械',
+  },
+  connectHelper: {
+    helper2: '袩褨写褌褉懈屑褍褦褌褜褋褟 谢懈褕械 褎褍薪泻褑褨褟 锌芯褕褍泻褍',
+    helper4: '袩褉芯褔懈褌邪泄褌械 写芯胁褨写泻芯胁褍 写芯泻褍屑械薪褌邪褑褨褞',
+    helper3: '. 袦懈 薪邪褋褌褨泄薪芯 褉械泻芯屑械薪写褍褦屑芯 胁邪屑',
+    helper5: '校胁邪卸薪芯 锌械褉械写 胁懈泻芯褉懈褋褌邪薪薪褟屑 褑褨褦褩 褎褍薪泻褑褨褩.',
+    helper1: '袩褨写泻谢褞褔邪泄褌械褋褟 写芯 蟹芯胁薪褨褕薪褨褏 斜邪蟹 蟹薪邪薪褜 褔械褉械蟹 API 褌邪 褨写械薪褌懈褎褨泻邪褌芯褉 斜邪蟹懈 蟹薪邪薪褜. 袧邪褉邪蟹褨',
+  },
+  externalKnowledgeForm: {
+    cancel: '小泻邪褋褍胁邪褌懈',
+    connect: '袩褨写泻谢褞褔邪褌懈褋褟',
+  },
+  externalAPIForm: {
+    encrypted: {
+      end: '孝械褏薪芯谢芯谐褨褩.',
+      front: '袙邪褕 褌芯泻械薪 API 斜褍写械 蟹邪褕懈褎褉芯胁邪薪芯 褌邪 蟹斜械褉械卸械薪芯 蟹邪 写芯锌芯屑芯谐芯褞',
+    },
+    name: '袉屑\'褟',
+    edit: '袪械写邪谐褍胁邪褌懈',
+    apiKey: '袣谢褞褔 API',
+    cancel: '小泻邪褋褍胁邪褌懈',
+    save: '袪褟褌褍胁邪褌懈',
+    endpoint: '袣褨薪褑械胁邪 褌芯褔泻邪 API',
+  },
+  externalKnowledgeDescriptionPlaceholder: '袨锌懈褕褨褌褜, 褖芯 屑褨褋褌懈褌褜褋褟 胁 褑褨泄 斜邪蟹褨 蟹薪邪薪褜 (薪械芯斜芯胁\'褟蟹泻芯胁芯)',
+  externalAPIPanelDocumentation: '袛褨蟹薪邪泄褌械褋褟, 褟泻 褋褌胁芯褉懈褌懈 API 蟹芯胁薪褨褕薪褨褏 蟹薪邪薪褜',
+  externalAPIPanelTitle: 'API 蟹芯胁薪褨褕薪褨褏 蟹薪邪薪褜',
+  externalKnowledgeDescription: '袨锌懈褋 蟹薪邪薪褜',
+  noExternalKnowledge: 'API 蟹芯胁薪褨褕薪褨褏 蟹薪邪薪褜 锌芯泻懈 褖芯 薪械 褨褋薪褍褦, 薪邪褌懈褋薪褨褌褜 褌褍褌, 褖芯斜 褋褌胁芯褉懈褌懈',
+  externalTag: '袟芯胁薪褨褕薪褨泄',
+  externalKnowledgeId: '袟芯胁薪褨褕薪褨泄 褨写械薪褌懈褎褨泻邪褌芯褉 蟹薪邪薪褜',
+  externalAPI: '袟芯胁薪褨褕薪褨泄 API',
+  createExternalAPI: '袛芯写邪胁邪薪薪褟 蟹芯胁薪褨褕薪褜芯谐芯 API 蟹薪邪薪褜',
+  createNewExternalAPI: '小褌胁芯褉械薪薪褟 薪芯胁芯谐芯 API 蟹芯胁薪褨褕薪褨褏 蟹薪邪薪褜',
+  externalKnowledgeName: '袟芯胁薪褨褕薪褦 薪邪泄屑械薪褍胁邪薪薪褟 蟹薪邪薪褜',
+  externalKnowledgeNamePlaceholder: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 薪邪蟹胁褍 斜邪蟹懈 蟹薪邪薪褜',
+  editExternalAPITooltipTitle: '袩袨袙\'携袟袗袧袉 袟袧袗袧袧携',
+  editExternalAPIFormTitle: '袪械写邪谐褍胁邪薪薪褟 API 蟹芯胁薪褨褕薪褨褏 蟹薪邪薪褜',
+  connectDataset: '袩褨写泻谢褞褔械薪薪褟 写芯 蟹芯胁薪褨褕薪褜芯褩 斜邪蟹懈 蟹薪邪薪褜',
+  learnHowToWriteGoodKnowledgeDescription: '袧邪胁褔褨褌褜褋褟 锌懈褋邪褌懈 褏芯褉芯褕懈泄 芯锌懈褋 蟹薪邪薪褜',
+  allExternalTip: '袩褉懈 胁懈泻芯褉懈褋褌邪薪薪褨 褌褨谢褜泻懈 蟹芯胁薪褨褕薪褨褏 蟹薪邪薪褜 泻芯褉懈褋褌褍胁邪褔 屑芯卸械 胁懈斜褉邪褌懈, 褔懈 胁泻谢褞褔邪褌懈 屑芯写械谢褜 Rerank. 携泻褖芯 褑械泄 锌邪褉邪屑械褌褉 薪械 褍胁褨屑泻薪械薪芯, 芯褌褉懈屑邪薪褨 褎褉邪谐屑械薪褌懈 斜褍写褍褌褜 胁褨写褋芯褉褌芯胁邪薪褨 薪邪 芯褋薪芯胁褨 芯褑褨薪芯泻. 袣芯谢懈 褋褌褉邪褌械谐褨褩 锌芯褕褍泻褍 褉褨蟹薪懈褏 斜邪蟹 蟹薪邪薪褜 薪械褋褍屑褨褋薪褨, 褑械 斜褍写械 薪械褌芯褔薪芯.',
+  mixtureInternalAndExternalTip: '袦芯写械谢褜 Rerank 薪械芯斜褏褨写薪邪 写谢褟 锌芯褦写薪邪薪薪褟 胁薪褍褌褉褨褕薪褨褏 褨 蟹芯胁薪褨褕薪褨褏 蟹薪邪薪褜.',
+  externalKnowledgeIdPlaceholder: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 Knowledge ID',
+  externalAPIPanelDescription: 'API 蟹芯胁薪褨褕薪褨褏 蟹薪邪薪褜 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 锌褨写泻谢褞褔械薪薪褟 写芯 斜邪蟹懈 蟹薪邪薪褜 蟹邪 屑械卸邪屑懈 Dify 褨 芯褌褉懈屑邪薪薪褟 蟹薪邪薪褜 褨蟹 褑褨褦褩 斜邪蟹懈 蟹薪邪薪褜.',
+  chunkingMode: {
+    parentChild: '袘邪褌褜泻懈-写褨褌懈',
+    general: '袟邪谐邪谢褜薪械',
+  },
+  parentMode: {
+    fullDoc: '袩芯胁薪懈泄 写芯泻褍屑械薪褌',
+    paragraph: '袗斜蟹邪褑',
+  },
+  batchAction: {
+    delete: '袙懈写邪谢懈褌懈',
+    enable: '袙屑懈泻邪褌懈',
+    disable: '袙懈屑泻薪褍褌懈',
+    archive: '袗褉褏褨胁',
+    selected: '袙懈斜褉邪薪褨',
+    cancel: '小泻邪褋褍胁邪褌懈',
+  },
+  preprocessDocument: '{{num}} 袩芯锌械褉械写薪褟 芯斜褉芯斜泻邪 写芯泻褍屑械薪褌褨胁',
+  documentsDisabled: '袛芯泻褍屑械薪褌懈 {{num}} 胁懈屑泻薪械薪褨 - 薪械邪泻褌懈胁薪褨 锌芯薪邪写 30 写薪褨胁',
+  localDocs: '袥芯泻邪谢褜薪褨 写芯泻褍屑械薪褌懈',
+  enable: '袙屑懈泻邪褌懈',
+  allKnowledge: '袙褋褨 蟹薪邪薪薪褟',
+  allKnowledgeDescription: '袙懈斜械褉褨褌褜, 褖芯斜 胁褨写芯斜褉邪蟹懈褌懈 胁褋褨 蟹薪邪薪薪褟 胁 褑褨泄 褉芯斜芯褔褨泄 芯斜谢邪褋褌褨. 孝褨谢褜泻懈 胁谢邪褋薪懈泻 褉芯斜芯褔芯褩 芯斜谢邪褋褌褨 屑芯卸械 泻械褉褍胁邪褌懈 胁褋褨屑邪 蟹薪邪薪薪褟屑懈.',
+  metadata: {
+    createMetadata: {
+      back: '袧邪蟹邪写',
+      title: '袧芯胁褨 屑械褌邪写邪薪褨',
+      type: '孝懈锌',
+      namePlaceholder: '袛芯写邪褌懈 薪邪蟹胁褍 屑械褌邪写邪薪懈褏',
+      name: '袉屑\'褟',
+    },
+    checkName: {
+      empty: '袉屑\'褟 屑械褌邪写邪薪懈褏 薪械 屑芯卸械 斜褍褌懈 锌芯褉芯卸薪褨屑',
+      invalid: '袉屑\'褟 屑械褌邪写邪薪懈褏 屑芯卸械 屑褨褋褌懈褌懈 谢懈褕械 屑邪谢褨 谢褨褌械褉懈, 褑懈褎褉懈 褌邪 锌褨写泻褉械褋谢械薪薪褟, 褨 锌芯胁懈薪薪芯 锌芯褔懈薪邪褌懈褋褟 蟹 屑邪谢芯褩 谢褨褌械褉懈',
+    },
+    batchEditMetadata: {
+      editMetadata: '袪械写邪谐褍胁邪褌懈 屑械褌邪写邪薪褨',
+      editDocumentsNum: '袪械写邪谐褍胁邪薪薪褟 {{num}} 写芯泻褍屑械薪褌褨胁',
+      applyToAllSelectDocument: '袟邪褋褌芯褋褍胁邪褌懈 写芯 胁褋褨褏 胁懈斜褉邪薪懈褏 写芯泻褍屑械薪褌褨胁',
+      multipleValue: '袣褨谢褜泻邪 蟹薪邪褔械薪褜',
+      applyToAllSelectDocumentTip: '袗胁褌芯屑邪褌懈褔薪芯 褋褌胁芯褉褞胁邪褌懈 胁褋褞 褉械写邪谐芯胁邪薪褍 褌邪 薪芯胁褍 屑械褌邪写邪薪褨 写谢褟 胁褋褨褏 胁懈斜褉邪薪懈褏 写芯泻褍屑械薪褌褨胁, 褨薪邪泻褕械 褉械写邪谐褍胁邪薪薪褟 屑械褌邪写邪薪懈褏 斜褍写械 蟹邪褋褌芯褋芯胁褍胁邪褌懈褋褟 褌褨谢褜泻懈 写芯 写芯泻褍屑械薪褌褨胁, 褟泻褨 屑邪褞褌褜 褩褏.',
+    },
+    selectMetadata: {
+      manageAction: '袣械褉褍胁邪褌懈',
+      search: '袩芯褕褍泻芯胁邪 屑械褌邪褨薪褎芯褉屑邪褑褨褟',
+      newAction: '袧芯胁褨 屑械褌邪写邪薪褨',
+    },
+    datasetMetadata: {
+      namePlaceholder: '袧邪蟹胁邪 屑械褌邪写邪薪懈褏',
+      rename: '袩械褉械泄屑械薪褍胁邪褌懈',
+      disabled: '袙懈屑泻薪械薪芯',
+      name: '袉屑\'褟',
+      values: '{{num}} 袟薪邪褔械薪薪褟',
+      builtIn: '袙斜褍写芯胁邪薪懈泄',
+      addMetaData: '袛芯写邪褌懈 屑械褌邪写邪薪褨',
+      description: '袙懈 屑芯卸械褌械 泻械褉褍胁邪褌懈 胁褋褨屑邪 屑械褌邪写邪薪懈屑懈 胁 褑褜芯屑褍 蟹薪邪薪薪褨 褌褍褌. 袦芯写懈褎褨泻邪褑褨褩 斜褍写褍褌褜 褋懈薪褏褉芯薪褨蟹芯胁邪薪褨 蟹 泻芯卸薪懈屑 写芯泻褍屑械薪褌芯屑.',
+      builtInDescription: '袙斜褍写芯胁邪薪褨 屑械褌邪写邪薪褨 邪胁褌芯屑邪褌懈褔薪芯 胁懈褌褟谐褍褞褌褜褋褟 褌邪 谐械薪械褉褍褞褌褜褋褟. 袙芯薪懈 锌芯胁懈薪薪褨 斜褍褌懈 邪泻褌懈胁芯胁邪薪褨 锌械褉械写 胁懈泻芯褉懈褋褌邪薪薪褟屑 褨 薪械 屑芯卸褍褌褜 斜褍褌懈 胁褨写褉械写邪谐芯胁邪薪褨.',
+      deleteTitle: '袩褨写褌胁械褉写褜褌械, 褖芯斜 胁懈写邪谢懈褌懈',
+      deleteContent: '袙懈 胁锌械胁薪械薪褨, 褖芯 褏芯褔械褌械 胁懈写邪谢懈褌懈 屑械褌邪写邪薪褨 "{{name}}"?',
+    },
+    documentMetadata: {
+      documentInformation: '袉薪褎芯褉屑邪褑褨褟 锌褉芯 写芯泻褍屑械薪褌',
+      technicalParameters: '孝械褏薪褨褔薪褨 锌邪褉邪屑械褌褉懈',
+      startLabeling: '袩芯褔邪褌懈 屑邪褉泻褍胁邪薪薪褟',
+      metadataToolTip: '袦械褌邪写邪薪褨 褋谢褍谐褍褞褌褜 泻褉懈褌懈褔薪芯褞 褎褨谢褜褌褉邪褑褨褦褞, 褖芯 锌褨写胁懈褖褍褦 褌芯褔薪褨褋褌褜 褨 邪泻褌褍邪谢褜薪褨褋褌褜 胁懈褌褟谐褍胁邪薪薪褟 褨薪褎芯褉屑邪褑褨褩. 袙懈 屑芯卸械褌械 蟹屑褨薪懈褌懈 褌邪 写芯写邪褌懈 屑械褌邪写邪薪褨 写谢褟 褑褜芯谐芯 写芯泻褍屑械薪褌邪 褌褍褌.',
+    },
+    metadata: '袦械褌邪写邪薪褨',
+    chooseTime: '袙懈斜械褉褨褌褜 褔邪褋...',
+    addMetadata: '袛芯写邪褌懈 屑械褌邪写邪薪褨',
+  },
+  embeddingModelNotAvailable: '袦芯写械谢褜 胁斜褍写芯胁褍胁邪薪薪褟 薪械写芯褋褌褍锌薪邪.',
+}
+
+export default translation
diff --git a/i18n/uk-UA/education.ts b/i18n/uk-UA/education.ts
new file mode 100644
index 0000000..3cb4750
--- /dev/null
+++ b/i18n/uk-UA/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    end: '写谢褟 锌褉芯褎械褋褨泄薪芯谐芯 锌谢邪薪褍 Dify.',
+    coupon: '械泻褋泻谢褞蟹懈胁薪懈泄 泻褍锌芯薪 100%',
+    front: '袙懈 褌械锌械褉 屑邪褦褌械 锌褉邪胁芯 薪邪 褋褌邪褌褍褋 锌械褉械胁褨褉械薪芯褩 芯褋胁褨褌懈. 袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 褋胁芯褞 褨薪褎芯褉屑邪褑褨褞 锌褉芯 芯褋胁褨褌褍 薪懈卸褔械, 褖芯斜 蟹邪胁械褉褕懈褌懈 锌褉芯褑械褋 褨 芯褌褉懈屑邪褌懈',
+  },
+  form: {
+    schoolName: {
+      title: '袙邪褕邪 薪邪蟹胁邪 褕泻芯谢懈',
+      placeholder: '袙胁械写褨褌褜 芯褎褨褑褨泄薪褍, 锌芯胁薪褍 薪邪蟹胁褍 胁邪褕芯褩 褕泻芯谢懈',
+    },
+    schoolRole: {
+      option: {
+        administrator: '楔泻褨谢褜薪懈泄 邪写屑褨薪褨褋褌褉邪褌芯褉',
+        teacher: '袙褔懈褌械谢褜',
+        student: '小褌褍写械薪褌',
+      },
+      title: '袙邪褕邪 褉芯谢褜 褍 褕泻芯谢褨',
+    },
+    terms: {
+      desc: {
+        and: '褨',
+        end: '. 袧邪写褋懈谢邪褞褔懈:',
+        privacyPolicy: '袩芯谢褨褌懈泻邪 泻芯薪褎褨写械薪褑褨泄薪芯褋褌褨',
+        termsOfService: '校屑芯胁懈 芯斜褋谢褍谐芯胁褍胁邪薪薪褟',
+        front: '袙邪褕邪 褨薪褎芯褉屑邪褑褨褟 褌邪 胁懈泻芯褉懈褋褌邪薪薪褟 褋褌邪褌褍褋褍 袩械褉械胁褨褉械薪芯 胁 芯褋胁褨褌褨 锌褨写谢褟谐邪褞褌褜 薪邪褕芯屑褍',
+      },
+      option: {
+        inSchool: '携 锌褨写褌胁械褉写卸褍褞, 褖芯 褟 蟹邪褉械褦褋褌褉芯胁邪薪懈泄 邪斜芯 锌褉邪褑褞褞 胁 蟹邪蟹薪邪褔械薪褨泄 褍褋褌邪薪芯胁褨. Dify 屑芯卸械 胁懈屑邪谐邪褌懈 锌褨写褌胁械褉写卸械薪薪褟 屑芯褦褩 褉械褦褋褌褉邪褑褨褩/褌褉褍写芯胁芯褩 蟹邪泄薪褟褌芯褋褌褨. 携泻褖芯 褟 薪械锌褉邪胁懈谢褜薪芯 锌褉械写褋褌邪胁谢褞 褋胁芯褞 泻胁邪谢褨褎褨泻邪褑褨褞, 褟 锌芯谐芯写卸褍褞褋褟 褋锌谢邪褌懈褌懈 斜褍写褜-褟泻褨 蟹斜芯褉懈, 褟泻褨 褋锌芯褔邪褌泻褍 斜褍谢懈 褋泻邪褋芯胁邪薪褨 薪邪 芯褋薪芯胁褨 屑芯谐芯 薪邪胁褔邪谢褜薪芯谐芯 褋褌邪褌褍褋褍.',
+        age: '携 锌褨写褌胁械褉写卸褍褞, 褖芯 屑械薪褨 褖芯薪邪泄屑械薪褕械 18 褉芯泻褨胁.',
+      },
+      title: '校屑芯胁懈 褌邪 褍谐芯写懈',
+    },
+  },
+  submitError: '袙褨写锌褉邪胁泻邪 褎芯褉屑懈 薪械 胁写邪谢邪褋褟. 袘褍写褜 谢邪褋泻邪, 褋锌褉芯斜褍泄褌械 褖械 褉邪蟹 锌褨蟹薪褨褕械.',
+  rejectTitle: '袙邪褕邪 锌械褉械胁褨褉泻邪 芯褋胁褨褌懈 Dify 斜褍谢邪 胁褨写褏懈谢械薪邪',
+  submit: '袧邪写褨褋谢邪褌懈',
+  successTitle: '袙懈 芯褌褉懈屑邪谢懈 锌械褉械胁褨褉械薪械 芯褋胁褨褌褍 Dify',
+  emailLabel: '袙邪褕 锌芯褌芯褔薪懈泄 械谢械泻褌褉芯薪薪懈泄 谢懈褋褌',
+  rejectContent: '袧邪 卸邪谢褜, 胁懈 薪械 胁褨写锌芯胁褨写邪褦褌械 胁懈屑芯谐邪屑 写谢褟 褋褌邪褌褍褋褍 Education Verified 褨 褌芯屑褍 薪械 屑芯卸械褌械 芯褌褉懈屑邪褌懈 械泻褋泻谢褞蟹懈胁薪懈泄 泻褍锌芯薪 薪邪 100% 写谢褟 锌褉芯褎械褋褨泄薪芯谐芯 锌谢邪薪褍 Dify, 褟泻褖芯 胁懈泻芯褉懈褋褌芯胁褍褦褌械 褑褞 械谢械泻褌褉芯薪薪褍 邪写褉械褋褍.',
+  toVerified: '袨褌褉懈屑邪泄褌械 锌褨写褌胁械褉写卸械薪薪褟 芯褋胁褨褌懈',
+  learn: '袛褨蟹薪邪泄褌械褋褟, 褟泻 锌械褉械胁褨褉懈褌懈 芯褋胁褨褌褍',
+  currentSigned: '袙 写邪薪懈泄 屑芯屑械薪褌 胁懈 锌褨写锌懈褋邪薪褨 褟泻',
+  successContent: '袦懈 胁懈写邪谢懈 泻褍锌芯薪 薪邪 100% 蟹薪懈卸泻褍 薪邪 锌褉芯褎械褋褨泄薪懈泄 锌谢邪薪 Dify 写谢褟 胁邪褕芯谐芯 邪泻邪褍薪褌褍. 袣褍锌芯薪 写褨泄褋薪懈泄 锌褉芯褌褟谐芯屑 芯写薪芯谐芯 褉芯泻褍, 斜褍写褜 谢邪褋泻邪, 褋泻芯褉懈褋褌邪泄褌械褋褟 薪懈屑 锌褉芯褌褟谐芯屑 褌械褉屑褨薪褍 写褨褩.',
+}
+
+export default translation
diff --git a/i18n/uk-UA/explore.ts b/i18n/uk-UA/explore.ts
new file mode 100644
index 0000000..0bb03af
--- /dev/null
+++ b/i18n/uk-UA/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: '袛芯褋谢褨写卸褍胁邪褌懈',
+  sidebar: {
+    discovery: '袙褨写泻褉懈褌褌褟',
+    chat: '效邪褌',
+    workspace: '袪芯斜芯褔懈泄 锌褉芯褋褌褨褉',
+    action: {
+      pin: '袟邪泻褉褨锌懈褌懈',
+      unpin: '袙褨写泻褉褨锌懈褌懈',
+      rename: '袩械褉械泄屑械薪褍胁邪褌懈',
+      delete: '袙懈写邪谢懈褌懈',
+    },
+    delete: {
+      title: '袙懈写邪谢懈褌懈 写芯写邪褌芯泻',
+      content: '袙懈 胁锌械胁薪械薪褨, 褖芯 褏芯褔械褌械 胁懈写邪谢懈褌懈 褑褞 锌褉芯谐褉邪屑褍?',
+    },
+  },
+  apps: {
+    title: '袙懈胁褔邪泄褌械 锌褉芯谐褉邪屑懈 胁褨写 Dify',
+    description: '袙懈泻芯褉懈褋褌芯胁褍泄褌械 褑褨 褕邪斜谢芯薪懈 屑懈褌褌褦胁芯 邪斜芯 薪邪谢邪褕褌褍泄褌械 胁谢邪褋薪褨 锌褉芯谐褉邪屑懈 薪邪 芯褋薪芯胁褨 褕邪斜谢芯薪褨胁.',
+    allCategories: '袪械泻芯屑械薪写芯胁邪薪褨',
+  },
+  appCard: {
+    addToWorkspace: '袛芯写邪褌懈 写芯 褉芯斜芯褔芯谐芯 锌褉芯褋褌芯褉褍',
+    customize: '袧邪谢邪褕褌褍胁邪褌懈',
+  },
+  appCustomize: {
+    title: '小褌胁芯褉懈褌懈 写芯写邪褌芯泻 蟹 {{name}}',
+    subTitle: '袟薪邪褔芯泻 锌褉芯谐褉邪屑懈 褌邪 薪邪蟹胁邪',
+    nameRequired: '袧邪蟹胁邪 锌褉芯谐褉邪屑懈 芯斜芯胁鈥櫻徯沸盒拘残�',
+  },
+  category: {
+    Assistant: '袩芯屑褨褔薪懈泻',
+    Writing: '袧邪锌懈褋邪薪薪褟',
+    Translate: '袩械褉械泻谢邪写',
+    Programming: '袩褉芯谐褉邪屑褍胁邪薪薪褟',
+    HR: 'HR',
+    Workflow: '袪芯斜芯褔懈泄 锌褉芯褑械褋',
+    Agent: '袗谐械薪褌',
+    Entertainment: '袪芯蟹胁邪谐懈',
+  },
+}
+
+export default translation
diff --git a/i18n/uk-UA/layout.ts b/i18n/uk-UA/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/uk-UA/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/uk-UA/login.ts b/i18n/uk-UA/login.ts
new file mode 100644
index 0000000..e6d1d15
--- /dev/null
+++ b/i18n/uk-UA/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: '袩褉懈胁褨褌, 锌芯褔薪械屑芯!馃憢',
+  welcome: '袥邪褋泻邪胁芯 锌褉芯褋懈屑芯 写芯 Dify, 斜褍写褜 谢邪褋泻邪, 褍胁褨泄写褨褌褜, 褖芯斜 锌褉芯写芯胁卸懈褌懈.',
+  email: '袗写褉械褋邪 械谢械泻褌褉芯薪薪芯褩 锌芯褕褌懈',
+  emailPlaceholder: '袙邪褕邪 械谢械泻褌褉芯薪薪邪 锌芯褕褌邪',
+  password: '袩邪褉芯谢褜',
+  passwordPlaceholder: '袙邪褕 锌邪褉芯谢褜',
+  name: '袉屑\'褟 泻芯褉懈褋褌褍胁邪褔邪',
+  namePlaceholder: '袙邪褕械 褨屑\'褟 泻芯褉懈褋褌褍胁邪褔邪',
+  forget: '袟邪斜褍谢懈 锌邪褉芯谢褜?',
+  signBtn: '袙褏褨写',
+  installBtn: '袧邪谢邪褕褌褍胁邪褌懈',
+  setAdminAccount: '袧邪谢邪褕褌褍胁邪薪薪褟 芯斜谢褨泻芯胁芯谐芯 蟹邪锌懈褋褍 邪写屑褨薪褨褋褌褉邪褌芯褉邪',
+  setAdminAccountDesc: '袦邪泻褋懈屑邪谢褜薪褨 锌褉懈胁褨谢械褩 写谢褟 芯斜谢褨泻芯胁芯谐芯 蟹邪锌懈褋褍 邪写屑褨薪褨褋褌褉邪褌芯褉邪, 褟泻褨 屑芯卸薪邪 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 写谢褟 褋褌胁芯褉械薪薪褟 锌褉芯谐褉邪屑, 泻械褉褍胁邪薪薪褟 锌芯褋褌邪褔邪谢褜薪懈泻邪屑懈 LLM 褌芯褖芯.',
+  createAndSignIn: '小褌胁芯褉懈褌懈 褌邪 褍胁褨泄褌懈',
+  oneMoreStep: '些械 芯写懈薪 泻褉芯泻',
+  createSample: '袧邪 芯褋薪芯胁褨 褑褨褦褩 褨薪褎芯褉屑邪褑褨褩 屑懈 褋褌胁芯褉懈屑芯 写谢褟 胁邪褋 蟹褉邪蟹芯泻 锌褉芯谐褉邪屑懈',
+  invitationCode: '袣芯写 蟹邪锌褉芯褕械薪薪褟',
+  invitationCodePlaceholder: '袙邪褕 泻芯写 蟹邪锌褉芯褕械薪薪褟',
+  interfaceLanguage: '袦芯胁邪 褨薪褌械褉褎械泄褋褍',
+  timezone: '效邪褋芯胁懈泄 锌芯褟褋',
+  go: '袩械褉械泄褌懈 写芯 Dify',
+  sendUsMail: '袧邪写褨褕谢褨褌褜 薪邪屑 褋胁芯褦 锌褉械写褋褌邪胁谢械薪薪褟, 褨 屑懈 芯斜褉芯斜懈屑芯 蟹邪锌懈褌 薪邪 蟹邪锌褉芯褕械薪薪褟.',
+  acceptPP: '携 锌褉芯褔懈褌邪胁 褨 锌褉懈泄屑邪褞 锌芯谢褨褌懈泻褍 泻芯薪褎褨写械薪褑褨泄薪芯褋褌褨',
+  reset: '袘褍写褜 谢邪褋泻邪, 胁懈泻芯薪邪泄褌械 褌邪泻褍 泻芯屑邪薪写褍, 褖芯斜 褋泻懈薪褍褌懈 锌邪褉芯谢褜',
+  withGitHub: '袩褉芯写芯胁卸懈褌懈 蟹 GitHub',
+  withGoogle: '袩褉芯写芯胁卸懈褌懈 蟹 Google',
+  rightTitle: '袪芯蟹泻褉懈泄褌械 胁械褋褜 锌芯褌械薪褑褨邪谢 LLM',
+  rightDesc: '袟 谢械谐泻褨褋褌褞 褋褌胁芯褉褞泄褌械 胁褨蟹褍邪谢褜薪芯 锌褉懈胁邪斜谢懈胁褨, 褎褍薪泻褑褨芯薪邪谢褜薪褨 褌邪 胁写芯褋泻芯薪邪谢褞胁邪薪褨 锌褉芯谐褉邪屑懈 蟹褨 褕褌褍褔薪懈屑 褨薪褌械谢械泻褌芯屑.',
+  tos: '校屑芯胁懈 芯斜褋谢褍谐芯胁褍胁邪薪薪褟',
+  pp: '袩芯谢褨褌懈泻邪 泻芯薪褎褨写械薪褑褨泄薪芯褋褌褨',
+  tosDesc: '袪械褦褋褌褉褍褞褔懈褋褜, 胁懈 锌褉懈泄屑邪褦褌械 薪邪褕褨',
+  goToInit: '携泻褖芯 胁懈 褖械 薪械 褨薪褨褑褨邪谢褨蟹褍胁邪谢懈 芯斜谢褨泻芯胁懈泄 蟹邪锌懈褋, 锌械褉械泄写褨褌褜 薪邪 褋褌芯褉褨薪泻褍 褨薪褨褑褨邪谢褨蟹邪褑褨褩',
+  dontHave: '袧械 屑邪褦褌械?',
+  invalidInvitationCode: '袧械写褨泄褋薪懈泄 泻芯写 蟹邪锌褉芯褕械薪薪褟',
+  accountAlreadyInited: '袨斜谢褨泻芯胁懈泄 蟹邪锌懈褋 褍卸械 褨薪褨褑褨邪谢褨蟹芯胁邪薪芯',
+  forgotPassword: '袟邪斜褍谢懈 锌邪褉芯谢褜?',
+  resetLinkSent: '袩芯褋懈谢邪薪薪褟 写谢褟 褋泻懈写邪薪薪褟 薪邪写褨褋谢邪薪芯',
+  sendResetLink: '袧邪写褨褋谢邪褌懈 锌芯褋懈谢邪薪薪褟 写谢褟 褋泻懈写邪薪薪褟',
+  backToSignIn: '袩芯胁械褉薪褍褌懈褋褟 写芯 胁褏芯写褍',
+  forgotPasswordDesc: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 褋胁芯褞 械谢械泻褌褉芯薪薪褍 邪写褉械褋褍, 褖芯斜 褋泻懈薪褍褌懈 锌邪褉芯谢褜. 袦懈 薪邪写褨褕谢械屑芯 胁邪屑 械谢械泻褌褉芯薪薪芯谐芯 谢懈褋褌邪 蟹 褨薪褋褌褉褍泻褑褨褟屑懈 褖芯写芯 褋泻懈写邪薪薪褟 锌邪褉芯谢褟.',
+  checkEmailForResetLink: '袘褍写褜 谢邪褋泻邪, 锌械褉械胁褨褉褌械 褋胁芯褞 械谢械泻褌褉芯薪薪褍 锌芯褕褌褍 薪邪 薪邪褟胁薪褨褋褌褜 锌芯褋懈谢邪薪薪褟 写谢褟 褋泻懈写邪薪薪褟 锌邪褉芯谢褟. 携泻褖芯 锌褉芯褌褟谐芯屑 泻褨谢褜泻芯褏 褏胁懈谢懈薪 薪械 蟹鈥櫻徯残秆傃屟佈�, 锌械褉械胁褨褉褌械 锌邪锌泻褍 蟹褨 褋锌邪屑芯屑.',
+  passwordChanged: '校胁褨泄写褨褌褜 蟹邪褉邪蟹',
+  changePassword: '袟屑褨薪懈褌懈 锌邪褉芯谢褜',
+  changePasswordTip: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 薪芯胁懈泄 锌邪褉芯谢褜 写谢褟 褋胁芯谐芯 芯斜谢褨泻芯胁芯谐芯 蟹邪锌懈褋褍',
+  invalidToken: '袧械写褨泄褋薪懈泄 邪斜芯 锌褉芯褋褌褉芯褔械薪懈泄 褌芯泻械薪',
+  confirmPassword: '袩褨写褌胁械褉写懈褌懈 锌邪褉芯谢褜',
+  confirmPasswordPlaceholder: '袩褨写褌胁械褉写褜褌械 薪芯胁懈泄 锌邪褉芯谢褜',
+  passwordChangedTip: '袙邪褕 锌邪褉芯谢褜 斜褍谢芯 褍褋锌褨褕薪芯 蟹屑褨薪械薪芯',
+  error: {
+    emailEmpty: '袗写褉械褋邪 械谢械泻褌褉芯薪薪芯褩 锌芯褕褌懈 芯斜芯胁\'褟蟹泻芯胁邪',
+    emailInValid: '袙胁械写褨褌褜 写褨泄褋薪褍 邪写褉械褋褍 械谢械泻褌褉芯薪薪芯褩 锌芯褕褌懈',
+    nameEmpty: '袉屑\'褟 芯斜芯胁\'褟蟹泻芯胁械',
+    passwordEmpty: '袩邪褉芯谢褜 褦 芯斜芯胁鈥櫻徯沸盒拘残感�',
+    passwordInvalid: '袩邪褉芯谢褜 锌芯胁懈薪械薪 屑褨褋褌懈褌懈 谢褨褌械褉懈 褌邪 褑懈褎褉懈, 邪 写芯胁卸懈薪邪 锌芯胁懈薪薪邪 斜褍褌懈 斜褨谢褜褕芯褞 蟹邪 8',
+    passwordLengthInValid: '袩邪褉芯谢褜 锌芯胁懈薪械薪 斜褍褌懈 薪械 屑械薪褕械 8 褋懈屑胁芯谢褨胁',
+    registrationNotAllowed: '袗泻泻邪褍薪褌 薪械 蟹薪邪泄写械薪芯. 袘褍写褜 谢邪褋泻邪, 蟹胁械褉薪褨褌褜褋褟 写芯 邪写屑褨薪褨褋褌褉邪褌芯褉邪 褋懈褋褌械屑懈 写谢褟 褉械褦褋褌褉邪褑褨褩.',
+  },
+  license: {
+    tip: '袩械褉械写 蟹邪锌褍褋泻芯屑 Dify Community Edition 芯蟹薪邪泄芯屑褌械褋褟 蟹 谢褨褑械薪蟹褨褦褞 蟹 胁褨写泻褉懈褌懈屑 泻芯写芯屑 薪邪 GitHub',
+    link: '袥褨褑械薪蟹褨褟 蟹 胁褨写泻褉懈褌懈屑 泻芯写芯屑',
+  },
+  join: '袩褉懈褦写薪褍泄褌械褋褜',
+  joinTipStart: '袟邪锌褉芯褕褍褦屑芯 胁邪褋 锌褉懈褦写薪邪褌懈褋褟',
+  joinTipEnd: '泻芯屑邪薪写邪 Dify',
+  invalid: '袩芯褋懈谢邪薪薪褟 蟹邪褋褌邪褉褨谢芯',
+  explore: '袛芯褋谢褨写卸褍泄褌械 Dify',
+  activatedTipStart: '袙懈 锌褉懈褦写薪邪谢懈褋褟 写芯',
+  activatedTipEnd: '泻芯屑邪薪写邪',
+  activated: '校胁褨泄褌懈 蟹邪褉邪蟹',
+  adminInitPassword: '袩邪褉芯谢褜 褨薪褨褑褨邪谢褨蟹邪褑褨褩 邪写屑褨薪褨褋褌褉邪褌芯褉邪',
+  validate: '袩械褉械胁褨褉懈褌懈',
+  sso: '袩褉芯写芯胁卸褍泄褌械 锌褉邪褑褞胁邪褌懈 蟹 SSW',
+  checkCode: {
+    didNotReceiveCode: '袧械 芯褌褉懈屑邪谢懈 泻芯写?',
+    invalidCode: '袧械胁褨褉薪懈泄 泻芯写',
+    resend: '袙褨写锌褉邪胁懈褌懈',
+    verificationCodePlaceholder: '袙胁械写褨褌褜 6-蟹薪邪褔薪懈泄 泻芯写',
+    emptyCode: '袣芯写 芯斜芯胁\'褟蟹泻芯胁懈泄',
+    checkYourEmail: '袩械褉械胁褨褉褌械 褋胁芯褞 械谢械泻褌褉芯薪薪褍 锌芯褕褌褍',
+    verify: '袩械褉械胁褨褉懈褌懈',
+    verificationCode: '袣芯写 锌褨写褌胁械褉写卸械薪薪褟',
+    useAnotherMethod: '袙懈泻芯褉懈褋褌芯胁褍泄褌械 褨薪褕懈泄 褋锌芯褋褨斜',
+    tips: '袦懈 薪邪写褋懈谢邪褦屑芯 泻芯写 锌褨写褌胁械褉写卸械薪薪褟 薪邪 <strong>邪写褉械褋褍 {{email}}</strong>',
+    validTime: '袦邪泄褌械 薪邪 褍胁邪蟹褨, 褖芯 泻芯写 写褨泄褋薪懈泄 锌褉芯褌褟谐芯屑 5 褏胁懈谢懈薪',
+  },
+  back: '袟邪写薪褨泄',
+  backToLogin: '袧邪蟹邪写 写芯 胁褏芯写褍',
+  or: '袗袘袨',
+  usePassword: '袙懈泻芯褉懈褋褌芯胁褍泄褌械 锌邪褉芯谢褜',
+  sendVerificationCode: '袧邪写褨褕谢褨褌褜 泻芯写 锌褨写褌胁械褉写卸械薪薪褟',
+  changePasswordBtn: '袙褋褌邪薪芯胁褨褌褜 锌邪褉芯谢褜',
+  noLoginMethod: '袦械褌芯写 邪胁褌械薪褌懈褎褨泻邪褑褨褩 薪械 薪邪谢邪褕褌芯胁邪薪芯',
+  withSSO: '袩褉芯写芯胁卸褍泄褌械 锌褉邪褑褞胁邪褌懈 蟹 SSW',
+  useVerificationCode: '袙懈泻芯褉懈褋褌芯胁褍泄褌械 泻芯写 锌褨写褌胁械褉写卸械薪薪褟',
+  setYourAccount: '袧邪谢邪褕褌褍泄褌械 褋胁褨泄 芯斜谢褨泻芯胁懈泄 蟹邪锌懈褋',
+  enterYourName: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 褋胁芯褦 褨屑\'褟 泻芯褉懈褋褌褍胁邪褔邪',
+  continueWithCode: '袩褉芯写芯胁卸懈褌懈 蟹 泻芯写芯屑',
+  noLoginMethodTip: '袘褍写褜 谢邪褋泻邪, 蟹胁械褉薪褨褌褜褋褟 写芯 邪写屑褨薪褨褋褌褉邪褌芯褉邪 褋懈褋褌械屑懈, 褖芯斜 写芯写邪褌懈 屑械褌芯写 邪胁褌械薪褌懈褎褨泻邪褑褨褩.',
+  resetPasswordDesc: '袙胁械写褨褌褜 邪写褉械褋褍 械谢械泻褌褉芯薪薪芯褩 锌芯褕褌懈, 褟泻褍 胁懈 胁懈泻芯褉懈褋褌芯胁褍胁邪谢懈 写谢褟 褉械褦褋褌褉邪褑褨褩 薪邪 Dify, 褨 屑懈 薪邪写褨褕谢械屑芯 胁邪屑 械谢械泻褌褉芯薪薪懈泄 谢懈褋褌 写谢褟 褋泻懈写邪薪薪褟 锌邪褉芯谢褟.',
+  resetPassword: '小泻懈薪褍褌懈 锌邪褉芯谢褜',
+  licenseLostTip: '袧械 胁写邪谢芯褋褟 锌褨写泻谢褞褔懈褌懈 褋械褉胁械褉 谢褨褑械薪蟹褨泄 Dify. 袘褍写褜 谢邪褋泻邪, 蟹胁械褉薪褨褌褜褋褟 写芯 褋胁芯谐芯 邪写屑褨薪褨褋褌褉邪褌芯褉邪, 褖芯斜 锌褉芯写芯胁卸懈褌懈 泻芯褉懈褋褌褍胁邪褌懈褋褟 Dify.',
+  licenseExpired: '孝械褉屑褨薪 写褨褩 谢褨褑械薪蟹褨褩 屑懈薪褍胁',
+  licenseInactive: '袥褨褑械薪蟹褨褟 薪械邪泻褌懈胁薪邪',
+  licenseLost: '袥褨褑械薪蟹褨褞 胁褌褉邪褔械薪芯',
+  licenseInactiveTip: '袥褨褑械薪蟹褨褟 Dify Enterprise 写谢褟 胁邪褕芯褩 褉芯斜芯褔芯褩 芯斜谢邪褋褌褨 薪械邪泻褌懈胁薪邪. 袘褍写褜 谢邪褋泻邪, 蟹胁械褉薪褨褌褜褋褟 写芯 褋胁芯谐芯 邪写屑褨薪褨褋褌褉邪褌芯褉邪, 褖芯斜 锌褉芯写芯胁卸懈褌懈 泻芯褉懈褋褌褍胁邪褌懈褋褟 Dify.',
+  licenseExpiredTip: '孝械褉屑褨薪 写褨褩 谢褨褑械薪蟹褨褩 Dify Enterprise 写谢褟 胁邪褕芯谐芯 褉芯斜芯褔芯谐芯 锌褉芯褋褌芯褉褍 蟹邪泻褨薪褔懈胁褋褟. 袘褍写褜 谢邪褋泻邪, 蟹胁械褉薪褨褌褜褋褟 写芯 褋胁芯谐芯 邪写屑褨薪褨褋褌褉邪褌芯褉邪, 褖芯斜 锌褉芯写芯胁卸懈褌懈 泻芯褉懈褋褌褍胁邪褌懈褋褟 Dify.',
+}
+
+export default translation
diff --git a/i18n/uk-UA/plugin-tags.ts b/i18n/uk-UA/plugin-tags.ts
new file mode 100644
index 0000000..2d622c4
--- /dev/null
+++ b/i18n/uk-UA/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    other: '袉薪褕懈泄',
+    utilities: '校褌懈谢褨褌懈',
+    education: '袨褋胁褨褌邪',
+    social: '小芯褑褨邪谢褜薪懈泄',
+    videos: '袙褨写械芯',
+    business: '袘褨蟹薪械褋',
+    news: '袙褨褋褌褨',
+    design: '袩褉芯械泻褌',
+    search: '楔褍泻邪褌懈',
+    medical: '袦械写懈褔薪懈泄',
+    productivity: '袩褉芯写褍泻褌懈胁薪褨褋褌褜',
+    finance: '肖褨薪邪薪褋懈',
+    travel: '袩芯写芯褉芯卸褍胁邪褌懈',
+    image: '袨斜褉邪蟹',
+    agent: '袗谐械薪褌',
+    weather: '袩芯谐芯写邪',
+    entertainment: '袪芯蟹胁邪谐懈',
+  },
+  allTags: '袙褋褨 褌械谐懈',
+  searchTags: '袩芯褕褍泻芯胁褨 褌械谐懈',
+}
+
+export default translation
diff --git a/i18n/uk-UA/plugin.ts b/i18n/uk-UA/plugin.ts
new file mode 100644
index 0000000..465624f
--- /dev/null
+++ b/i18n/uk-UA/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    tools: '袉薪褋褌褉褍屑械薪褌',
+    all: '校胁械褋褜',
+    bundles: '袩邪泻械褌懈',
+    models: '袦芯写械谢褨',
+    extensions: '袪芯蟹褕懈褉械薪薪褟',
+    agents: '小褌褉邪褌械谐褨褩 邪谐械薪褌褨胁',
+  },
+  categorySingle: {
+    agent: '小褌褉邪褌械谐褨褟 邪谐械薪褌邪',
+    bundle: '袣芯屑锌谢械泻褌邪褑褨褟',
+    tool: '袉薪褋褌褉褍屑械薪褌',
+    extension: '袟斜褨谢褜褕械薪薪褟',
+    model: '袦芯写械谢褜',
+  },
+  list: {
+    source: {
+      local: '袉薪褋褌邪谢褟褑褨褟 蟹 谢芯泻邪谢褜薪芯谐芯 褎邪泄谢褍 锌邪泻械褌邪',
+      marketplace: '袉薪褋褌邪谢褟褑褨褟 蟹 Marketplace',
+      github: '袙褋褌邪薪芯胁谢械薪薪褟 蟹 GitHub',
+    },
+    noInstalled: '袩谢邪谐褨薪懈 薪械 胁褋褌邪薪芯胁谢械薪芯',
+    notFound: '袩谢邪谐褨薪褨胁 薪械 蟹薪邪泄写械薪芯',
+  },
+  source: {
+    marketplace: '袪懈薪泻褍',
+    local: '肖邪泄谢 谢芯泻邪谢褜薪芯谐芯 锌邪泻械褌邪',
+    github: '袚褨褌褏邪斜',
+  },
+  detailPanel: {
+    categoryTip: {
+      github: '袙褋褌邪薪芯胁谢械薪芯 蟹 Github',
+      debugging: '袩谢邪谐褨薪 薪邪谢邪谐芯写卸械薪薪褟',
+      local: '袥芯泻邪谢褜薪懈泄 锌谢邪谐褨薪',
+      marketplace: '袉薪褋褌邪谢褜芯胁邪薪芯 蟹 Marketplace',
+    },
+    operation: {
+      viewDetail: '袩械褉械谐谢褟薪褍褌懈 写械褌邪谢褨',
+      detail: '袛械褌邪谢褨',
+      remove: '袙懈写邪谢懈褌懈',
+      install: '袉薪褋褌邪谢褞胁邪褌懈',
+      checkUpdate: '袩械褉械胁褨褉懈褌懈 袨薪芯胁谢械薪薪褟',
+      update: '袨薪芯胁谢褞胁邪褌懈',
+      info: '袉薪褎芯褉屑邪褑褨褟 锌褉芯 锌谢邪谐褨薪',
+    },
+    toolSelector: {
+      placeholder: '袙懈斜械褉褨褌褜 褨薪褋褌褉褍屑械薪褌...',
+      descriptionLabel: '袨锌懈褋 蟹邪褋芯斜褍',
+      paramsTip1: '袣芯薪褌褉芯谢褞褦 锌邪褉邪屑械褌褉懈 谢芯谐褨褔薪芯谐芯 胁懈褋薪芯胁泻褍 LLM.',
+      toolLabel: '袉薪褋褌褉褍屑械薪褌',
+      params: '袣袨袧肖袉袚校袪袗笑袉携 袦袉袪袣校袙袗袧鞋',
+      settings: '袧袗袥袗楔孝校袙袗袧袧携 袣袨袪袠小孝校袙袗效袗',
+      uninstalledLink: '袣械褉褍胁邪薪薪褟 胁 锌谢邪谐褨薪邪褏',
+      title: '袛芯写邪褌懈 褨薪褋褌褉褍屑械薪褌',
+      paramsTip2: '袣芯谢懈 锌邪褉邪屑械褌褉 "袗胁褌芯屑邪褌懈褔薪芯" 胁懈屑泻薪械薪芯, 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 蟹薪邪褔械薪薪褟 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑.',
+      empty: '袧邪褌懈褋薪褨褌褜 泻薪芯锌泻褍 芦+禄, 褖芯斜 写芯写邪褌懈 褨薪褋褌褉褍屑械薪褌懈. 袙懈 屑芯卸械褌械 写芯写邪褌懈 泻褨谢褜泻邪 褨薪褋褌褉褍屑械薪褌褨胁.',
+      uninstalledTitle: '袉薪褋褌褉褍屑械薪褌 薪械 胁褋褌邪薪芯胁谢械薪芯',
+      descriptionPlaceholder: '袣芯褉芯褌泻懈泄 芯锌懈褋 锌褉懈蟹薪邪褔械薪薪褟 褨薪褋褌褉褍屑械薪褌褍, 薪邪锌褉懈泻谢邪写, 芯褌褉懈屑邪薪薪褟 褌械屑锌械褉邪褌褍褉懈 写谢褟 泻芯薪泻褉械褌薪芯谐芯 屑褨褋褑褟.',
+      unsupportedTitle: '袧械锌褨写褌褉懈屑褍胁邪薪褨 写褨褩',
+      unsupportedContent2: '袧邪褌懈褋薪褨褌褜, 褖芯斜 蟹屑褨薪懈褌懈 胁械褉褋褨褞.',
+      auto: '袗胁褌芯屑邪褌懈褔薪懈泄',
+      uninstalledContent: '笑械泄 锌谢邪谐褨薪 胁褋褌邪薪芯胁谢褞褦褌褜褋褟 蟹 谢芯泻邪谢褜薪芯谐芯/GitHub 褉械锌芯蟹懈褌芯褉褨褞. 袘褍写褜 谢邪褋泻邪, 胁懈泻芯褉懈褋褌芯胁褍泄褌械 锌褨褋谢褟 胁褋褌邪薪芯胁谢械薪薪褟.',
+      unsupportedContent: '袙褋褌邪薪芯胁谢械薪邪 胁械褉褋褨褟 锌谢邪谐褨薪邪 薪械 锌械褉械写斜邪褔邪褦 褑褨褦褩 写褨褩.',
+    },
+    modelNum: '{{num}} 袦袨袛袝袥袉 袙 袣袨袦袩袥袝袣孝袉',
+    switchVersion: '袙械褉褋褨褟 锌械褉械屑懈泻邪褔邪',
+    configureApp: '袧邪谢邪褕褌褍泄褌械 写芯写邪褌芯泻',
+    endpointDeleteTip: '袙懈写邪谢懈褌懈 泻褨薪褑械胁褍 褌芯褔泻褍',
+    endpoints: '袣褨薪褑械胁褨 褌芯褔泻懈',
+    endpointsDocLink: '袩械褉械谐谢褟薪褍褌懈 写芯泻褍屑械薪褌',
+    configureModel: '袧邪谢邪褕褌褍胁邪薪薪褟 屑芯写械谢褨',
+    endpointDisableTip: '袙懈屑泻薪褨褌褜 泻褨薪褑械胁褍 褌芯褔泻褍',
+    endpointsEmpty: '袧邪褌懈褋薪褨褌褜 泻薪芯锌泻褍 芦+禄, 褖芯斜 写芯写邪褌懈 泻褨薪褑械胁褍 褌芯褔泻褍',
+    actionNum: '{{num}} {{写褨褟}} 袙袣袥挟效袝袧袉',
+    disabled: '袙懈屑泻薪褍褌芯',
+    endpointModalTitle: '袧邪谢邪褕褌褍胁邪薪薪褟 泻褨薪褑械胁芯褩 褌芯褔泻懈',
+    endpointDisableContent: '效懈 褏芯褌褨谢懈 斜 胁懈 胁懈屑泻薪褍褌懈 {{name}}?',
+    endpointDeleteContent: '效懈 褏芯褌褨谢懈 斜 胁懈 胁懈写邪谢懈褌懈 {{name}}?',
+    endpointsTip: '笑械泄 锌谢邪谐褨薪 薪邪写邪褦 泻芯薪泻褉械褌薪褨 褎褍薪泻褑褨褩 褔械褉械蟹 泻褨薪褑械胁褨 褌芯褔泻懈, 褨 胁懈 屑芯卸械褌械 薪邪谢邪褕褌褍胁邪褌懈 泻褨谢褜泻邪 薪邪斜芯褉褨胁 泻褨薪褑械胁懈褏 褌芯褔芯泻 写谢褟 锌芯褌芯褔薪芯谐芯 褉芯斜芯褔芯谐芯 锌褉芯褋褌芯褉褍.',
+    strategyNum: '{{num}} {{褋褌褉邪褌械谐褨褟}} 袙袣袥挟效袝袧袉',
+    endpointModalDesc: '袩褨褋谢褟 薪邪谢邪褕褌褍胁邪薪薪褟 屑芯卸薪邪 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 褎褍薪泻褑褨褩, 褖芯 薪邪写邪褞褌褜褋褟 锌谢邪谐褨薪芯屑 褔械褉械蟹 泻褨薪褑械胁褨 褌芯褔泻懈 API.',
+    configureTool: '袉薪褋褌褉褍屑械薪褌 薪邪谢邪褕褌褍胁邪薪薪褟',
+    serviceOk: '小械褉胁褨褋 锌褉邪褑褞褦',
+  },
+  debugInfo: {
+    title: '袧邪谢邪谐芯写卸械薪薪褟',
+    viewDocs: '袩械褉械谐谢褟薪褍褌懈 写芯泻褍屑械薪褌懈',
+  },
+  privilege: {
+    whoCanDebug: '啸褌芯 屑芯卸械 薪邪谢邪谐芯写卸褍胁邪褌懈 锌谢邪谐褨薪懈?',
+    admins: '袗写屑褨薪懈',
+    noone: '袧褨褏褌芯',
+    whoCanInstall: '啸褌芯 屑芯卸械 胁褋褌邪薪芯胁谢褞胁邪褌懈 锌谢邪谐褨薪懈 褌邪 泻械褉褍胁邪褌懈 薪懈屑懈?',
+    everyone: '袣芯卸械薪',
+    title: '袧邪谢邪褕褌褍胁邪薪薪褟 锌谢邪谐褨薪邪',
+  },
+  pluginInfoModal: {
+    repository: '小褏芯胁懈褖械',
+    release: '袪械谢褨蟹',
+    title: '袉薪褎芯褉屑邪褑褨褟 锌褉芯 锌谢邪谐褨薪',
+    packageName: '袩邪泻褍薪芯泻',
+  },
+  action: {
+    deleteContentLeft: '效懈 褏芯褌褨谢懈 斜 胁懈 胁懈写邪谢懈褌懈',
+    usedInApps: '笑械泄 锌谢邪谐褨薪 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 胁 写芯写邪褌泻邪褏 {{num}}.',
+    deleteContentRight: '锌谢邪谐褨薪?',
+    checkForUpdates: '袩械褉械胁褨褉褌械 薪邪褟胁薪褨褋褌褜 芯薪芯胁谢械薪褜',
+    delete: '袙懈写邪谢懈褌懈 锌谢邪谐褨薪',
+    pluginInfo: '袉薪褎芯褉屑邪褑褨褟 锌褉芯 锌谢邪谐褨薪',
+  },
+  installModal: {
+    labels: {
+      package: '袩邪泻褍薪芯泻',
+      repository: '小褏芯胁懈褖械',
+      version: '袙械褉褋褨褟',
+    },
+    uploadFailed: '袧械 胁写邪谢芯褋褟 蟹邪胁邪薪褌邪卸懈褌懈 褎邪泄谢',
+    close: '袟邪泻褉懈褌懈',
+    installedSuccessfullyDesc: '袩谢邪谐褨薪 褍褋锌褨褕薪芯 胁褋褌邪薪芯胁谢械薪芯.',
+    readyToInstallPackages: '袩褉芯 胁褋褌邪薪芯胁谢械薪薪褟 薪邪褋褌褍锌薪懈褏 锌谢邪谐褨薪褨胁 {{num}}',
+    install: '袉薪褋褌邪谢褞胁邪褌懈',
+    cancel: '小泻邪褋褍胁邪褌懈',
+    readyToInstall: '袩褉芯 胁褋褌邪薪芯胁谢械薪薪褟 薪邪褋褌褍锌薪芯谐芯 锌谢邪谐褨薪邪',
+    pluginLoadErrorDesc: '笑械泄 锌谢邪谐褨薪 薪械 斜褍写械 胁褋褌邪薪芯胁谢械薪芯',
+    installComplete: '袉薪褋褌邪谢褟褑褨褞 蟹邪胁械褉褕械薪芯',
+    installing: '校褋褌邪薪芯胁泻懈...',
+    installPlugin: '袙褋褌邪薪芯胁懈褌懈 锌谢邪谐褨薪',
+    dropPluginToInstall: '袩械褉械褌褟谐薪褨褌褜 锌邪泻械褌 锌谢邪谐褨薪邪 褋褞写懈, 褖芯斜 胁褋褌邪薪芯胁懈褌懈',
+    uploadingPackage: '袟邪胁邪薪褌邪卸械薪薪褟 {{packageName}}...',
+    readyToInstallPackage: '袩褉芯 胁褋褌邪薪芯胁谢械薪薪褟 薪邪褋褌褍锌薪芯谐芯 锌谢邪谐褨薪邪',
+    pluginLoadError: '袩芯屑懈谢泻邪 蟹邪胁邪薪褌邪卸械薪薪褟 锌谢邪谐褨薪邪',
+    fromTrustSource: '袘褍写褜 谢邪褋泻邪, 锌械褉械泻芯薪邪泄褌械褋褟, 褖芯 胁懈 胁褋褌邪薪芯胁谢褞褦褌械 锌谢邪谐褨薪懈 谢懈褕械 蟹 <trustSource>薪邪写褨泄薪芯谐芯 写卸械褉械谢邪</trustSource>.',
+    back: '袟邪写薪褨泄',
+    installFailedDesc: '袩谢邪谐褨薪 斜褍胁 胁褋褌邪薪芯胁谢械薪懈泄 薪械 胁写邪谢芯褋褟.',
+    installFailed: '袧械 胁写邪谢芯褋褟 胁褋褌邪薪芯胁懈褌懈',
+    installedSuccessfully: '袦芯薪褌邪卸 褍褋锌褨褕薪懈泄',
+    next: '袧邪褋褌褍锌薪懈泄',
+  },
+  installFromGitHub: {
+    selectVersionPlaceholder: '袘褍写褜 谢邪褋泻邪, 芯斜械褉褨褌褜 胁械褉褋褨褞',
+    uploadFailed: '袧械 胁写邪谢芯褋褟 蟹邪胁邪薪褌邪卸懈褌懈 褎邪泄谢',
+    selectVersion: '袨斜械褉褨褌褜 胁械褉褋褨褞',
+    installNote: '袘褍写褜 谢邪褋泻邪, 锌械褉械泻芯薪邪泄褌械褋褟, 褖芯 胁懈 胁褋褌邪薪芯胁谢褞褦褌械 锌谢邪谐褨薪懈 谢懈褕械 蟹 薪邪写褨泄薪芯谐芯 写卸械褉械谢邪.',
+    gitHubRepo: '袪械锌芯蟹懈褌芯褉褨泄 GitHub',
+    installFailed: '袧械 胁写邪谢芯褋褟 胁褋褌邪薪芯胁懈褌懈',
+    installPlugin: '袙褋褌邪薪芯胁懈褌懈 锌谢邪谐褨薪 蟹 GitHub',
+    updatePlugin: '袨薪芯胁懈褌懈 锌谢邪谐褨薪 蟹 GitHub',
+    installedSuccessfully: '袦芯薪褌邪卸 褍褋锌褨褕薪懈泄',
+    selectPackage: '袨斜械褉褨褌褜 锌邪泻械褌',
+    selectPackagePlaceholder: '袘褍写褜 谢邪褋泻邪, 芯斜械褉褨褌褜 锌邪泻械褌',
+  },
+  upgrade: {
+    description: '袩褉芯 胁褋褌邪薪芯胁谢械薪薪褟 薪邪褋褌褍锌薪芯谐芯 锌谢邪谐褨薪邪',
+    close: '袟邪泻褉懈褌懈',
+    successfulTitle: '校褋褌邪薪芯胁泻邪 褍褋锌褨褕薪邪',
+    upgrade: '袉薪褋褌邪谢褞胁邪褌懈',
+    usedInApps: '袙懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 胁 写芯写邪褌泻邪褏 {{num}}',
+    upgrading: '校褋褌邪薪芯胁泻懈...',
+    title: '袙褋褌邪薪芯胁懈褌懈 锌谢邪谐褨薪',
+  },
+  error: {
+    noReleasesFound: '袪械谢褨蟹褨胁 薪械 蟹薪邪泄写械薪芯. 袘褍写褜 谢邪褋泻邪, 锌械褉械胁褨褉褌械 褉械锌芯蟹懈褌芯褉褨泄 GitHub 邪斜芯 URL-邪写褉械褋褍 胁胁械写械薪薪褟.',
+    fetchReleasesError: '袧械 胁写邪褦褌褜褋褟 芯褌褉懈屑邪褌懈 蟹谐芯写懈. 袩芯胁褌芯褉褨褌褜 褋锌褉芯斜褍 锌褨蟹薪褨褕械.',
+    inValidGitHubUrl: '袧械胁褨褉薪邪 URL-邪写褉械褋邪 GitHub. 袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 写褨泄褋薪褍 URL-邪写褉械褋褍 褍 褎芯褉屑邪褌褨: https://github.com/owner/repo',
+  },
+  marketplace: {
+    sortOption: {
+      mostPopular: '袧邪泄锌芯锌褍谢褟褉薪褨褕懈褏',
+      newlyReleased: '袧芯胁懈泄 褉械谢褨蟹',
+      recentlyUpdated: '袧械褖芯写邪胁薪芯 芯薪芯胁谢械薪芯',
+      firstReleased: '袩械褉褕懈泄 褉械谢褨蟹',
+    },
+    and: '褨',
+    discover: '袙懈褟胁懈褌懈',
+    moreFrom: '袘褨谢褜褕械 胁褨写 Marketplace',
+    sortBy: '效芯褉薪械 屑褨褋褌芯',
+    pluginsResult: '袪械蟹褍谢褜褌邪褌懈 {{num}}',
+    empower: '袪芯蟹褕懈褉褞泄褌械 屑芯卸谢懈胁芯褋褌褨 褉芯蟹褉芯斜泻懈 褕褌褍褔薪芯谐芯 褨薪褌械谢械泻褌褍',
+    difyMarketplace: 'Dify Marketplace',
+    viewMore: '袛懈胁懈褌懈褋褜 斜褨谢褜褕械',
+    noPluginFound: '袩谢邪谐褨薪 薪械 蟹薪邪泄写械薪芯',
+    verifiedTip: '袩械褉械胁褨褉械薪芯 Dify',
+    partnerTip: '袩械褉械胁褨褉械薪芯 锌邪褉褌薪械褉芯屑 Dify',
+  },
+  task: {
+    installingWithError: '袧械 胁写邪谢芯褋褟 胁褋褌邪薪芯胁懈褌懈 锌谢邪谐褨薪懈 {{installingLength}}, 褍褋锌褨褏 {{successLength}}, {{errorLength}}',
+    clearAll: '袨褔懈褋褌懈褌懈 胁褋械',
+    installedError: '袩谢邪谐褨薪懈 {{errorLength}} 薪械 胁写邪谢芯褋褟 胁褋褌邪薪芯胁懈褌懈',
+    installError: '袩谢邪谐褨薪懈 {{errorLength}} 薪械 胁写邪谢芯褋褟 胁褋褌邪薪芯胁懈褌懈, 薪邪褌懈褋薪褨褌褜, 褖芯斜 锌械褉械谐谢褟薪褍褌懈',
+    installing: '袙褋褌邪薪芯胁谢械薪薪褟 锌谢邪谐褨薪褨胁 {{installingLength}}, 0 胁懈泻芯薪邪薪芯.',
+    installingWithSuccess: '袙褋褌邪薪芯胁谢械薪薪褟 锌谢邪谐褨薪褨胁 {{installingLength}}, 褍褋锌褨褏 {{successLength}}.',
+  },
+  submitPlugin: '袧邪写褨褋谢邪褌懈 锌谢邪谐褨薪',
+  from: '袙褨写',
+  searchInMarketplace: '袩芯褕褍泻 褍 Marketplace',
+  endpointsEnabled: '{{num}} 薪邪斜芯褉褨胁 泻褨薪褑械胁懈褏 褌芯褔芯泻 褍胁褨屑泻薪械薪芯',
+  installAction: '袉薪褋褌邪谢褞胁邪褌懈',
+  findMoreInMarketplace: '袛褨蟹薪邪泄褌械褋褟 斜褨谢褜褕械 胁 Marketplace',
+  installFrom: '袙小孝袗袧袨袙袠孝袠 袟',
+  install: '{{num}} 胁褋褌邪薪芯胁谢褞褦',
+  fromMarketplace: '袙褨写 Marketplace',
+  searchCategories: '袣邪褌械谐芯褉褨褩 锌芯褕褍泻褍',
+  installPlugin: '袙褋褌邪薪芯胁懈褌懈 锌谢邪谐褨薪',
+  searchTools: '袉薪褋褌褉褍屑械薪褌懈 锌芯褕褍泻褍...',
+  search: '楔褍泻邪褌懈',
+  searchPlugins: '袩谢邪谐褨薪懈 锌芯褕褍泻褍',
+  allCategories: '袙褋褨 泻邪褌械谐芯褉褨褩',
+  metadata: {
+    title: '袩谢邪谐褨薪懈',
+  },
+  difyVersionNotCompatible: '袩芯褌芯褔薪邪 胁械褉褋褨褟 Dify 薪械 褋褍屑褨褋薪邪 蟹 褑懈屑 锌谢邪谐褨薪芯屑, 斜褍写褜 谢邪褋泻邪, 芯薪芯胁褨褌褜 写芯 屑褨薪褨屑邪谢褜薪芯褩 胁械褉褋褨褩: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/uk-UA/register.ts b/i18n/uk-UA/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/uk-UA/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/uk-UA/run-log.ts b/i18n/uk-UA/run-log.ts
new file mode 100644
index 0000000..a2979f5
--- /dev/null
+++ b/i18n/uk-UA/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: '袙袙袝袛袝袧袧携',
+  result: '袪袝袟校袥鞋孝袗孝',
+  detail: '袛袝孝袗袥袉',
+  tracing: '袙袉袛小袥袉袛袣校袙袗袧袧携',
+  resultPanel: {
+    status: '小孝袗孝校小',
+    time: '效袗小 袙袠袣袨袧袗袧袧携',
+    tokens: '袟袗袚袗袥鞋袧袗 袣袉袥鞋袣袉小孝鞋 孝袨袣袝袧袉袙',
+  },
+  meta: {
+    title: '袦袝孝袗袛袗袧袉',
+    status: '小褌邪褌褍褋',
+    version: '袙械褉褋褨褟',
+    executor: '袙懈泻芯薪邪胁械褑褜',
+    startTime: '效邪褋 锌芯褔邪褌泻褍',
+    time: '效邪褋 胁懈泻芯薪邪薪薪褟',
+    tokens: '袟邪谐邪谢褜薪邪 泻褨谢褜泻褨褋褌褜 褌芯泻械薪褨胁',
+    steps: '袣褉芯泻懈 胁懈泻芯薪邪薪薪褟',
+  },
+  resultEmpty: {
+    title: '笑械泄 蟹邪锌褍褋泻 谢懈褕械 胁懈褏褨写薪芯谐芯 褎芯褉屑邪褌褍 JSON,',
+    tipLeft: '斜褍写褜 谢邪褋泻邪, 锌械褉械泄写褨褌褜 写芯 ',
+    link: '锌邪薪械谢褜 写械褌邪谢械泄',
+    tipRight: ' 锌械褉械谐谢褟薪褍褌懈.',
+  },
+  circularInvocationTip: '校 锌芯褌芯褔薪芯屑褍 褉芯斜芯褔芯屑褍 锌褉芯褑械褋褨 褨褋薪褍褦 泻褉褍谐芯胁懈泄 胁懈泻谢懈泻 褨薪褋褌褉褍屑械薪褌褨胁/胁褍蟹谢褨胁.',
+  actionLogs: '袞褍褉薪邪谢懈 写褨泄',
+}
+
+export default translation
diff --git a/i18n/uk-UA/share-app.ts b/i18n/uk-UA/share-app.ts
new file mode 100644
index 0000000..058925f
--- /dev/null
+++ b/i18n/uk-UA/share-app.ts
@@ -0,0 +1,78 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: '袛芯写邪褌芯泻 薪械写芯褋褌褍锌薪懈泄',
+    appUnknownError: '袛芯写邪褌芯泻 薪械写芯褋褌褍锌薪懈泄',
+  },
+  chat: {
+    newChat: '袧芯胁懈泄 褔邪褌',
+    pinnedTitle: '袟邪泻褉褨锌谢械薪褨',
+    unpinnedTitle: '效邪褌懈',
+    newChatDefaultName: '袧芯胁邪 褉芯蟹屑芯胁邪',
+    resetChat: '袨褔懈褋褌懈褌懈 褉芯蟹屑芯胁褍',
+    poweredBy: '袟邪斜械蟹锌械褔褍褦褌褜褋褟',
+    prompt: '袩褨写泻邪蟹泻邪',
+    privatePromptConfigTitle: '袧邪谢邪褕褌褍胁邪薪薪褟 褉芯蟹屑芯胁懈',
+    publicPromptConfigTitle: '袩芯褔邪褌泻芯胁邪 锌褨写泻邪蟹泻邪',
+    configStatusDes: '袩械褉械写 锌芯褔邪褌泻芯屑 胁懈 屑芯卸械褌械 蟹屑褨薪懈褌懈 薪邪谢邪褕褌褍胁邪薪薪褟 褉芯蟹屑芯胁懈',
+    configDisabled: '袛谢褟 褑褜芯谐芯 褋械邪薪褋褍 斜褍谢芯 胁懈泻芯褉懈褋褌邪薪芯 薪邪谢邪褕褌褍胁邪薪薪褟 锌芯锌械褉械写薪褜芯谐芯 褋械邪薪褋褍.',
+    startChat: '袩芯褔邪褌懈 褔邪褌',
+    privacyPolicyLeft: '袘褍写褜 谢邪褋泻邪, 芯蟹薪邪泄芯屑褌械褋褟 蟹 ',
+    privacyPolicyMiddle: '锌芯谢褨褌懈泻芯褞 泻芯薪褎褨写械薪褑褨泄薪芯褋褌褨',
+    privacyPolicyRight: ', 薪邪写邪薪芯褞 褉芯蟹褉芯斜薪懈泻芯屑 锌褉芯谐褉邪屑懈.',
+    deleteConversation: {
+      title: '袙懈写邪谢懈褌懈 褉芯蟹屑芯胁褍',
+      content: '袙懈 胁锌械胁薪械薪褨, 褖芯 褏芯褔械褌械 胁懈写邪谢懈褌懈 褑褞 褉芯蟹屑芯胁褍?',
+    },
+    tryToSolve: '小锌褉芯斜褍胁邪褌懈 胁懈褉褨褕懈褌懈',
+    temporarySystemIssue: '袙懈斜邪褔褌械, 褌懈屑褔邪褋芯胁邪 褋懈褋褌械屑薪邪 锌褉芯斜谢械屑邪.',
+    expand: '袪芯蟹谐芯褉薪褍褌懈',
+    collapse: '袟谐芯褉薪褍褌懈',
+    chatFormTip: '袧邪谢邪褕褌褍胁邪薪薪褟 褔邪褌褍 薪械 屑芯卸褍褌褜 斜褍褌懈 蟹屑褨薪械薪褨 锌褨褋谢褟 锌芯褔邪褌泻褍 褔邪褌褍.',
+    viewChatSettings: '袩械褉械谐谢褟薪褍褌懈 薪邪谢邪褕褌褍胁邪薪薪褟 褔邪褌褍',
+    chatSettingsTitle: '袧芯胁械 薪邪谢邪褕褌褍胁邪薪薪褟 褔邪褌褍',
+    newChatTip: '袙卸械 胁 薪芯胁芯屑褍 褔邪褌褨',
+  },
+  generation: {
+    tabs: {
+      create: '袟邪锌褍褋褌懈褌懈 芯写懈薪 褉邪蟹',
+      batch: '袟邪锌褍褋褌懈褌懈 锌邪泻械褌',
+      saved: '袟斜械褉械卸械薪芯',
+    },
+    savedNoData: {
+      title: '袙懈 褖械 薪械 蟹斜械褉械谐谢懈 褉械蟹褍谢褜褌邪褌!',
+      description: '袩芯褔薪褨褌褜 谐械薪械褉褍胁邪褌懈 胁屑褨褋褌 褨 蟹薪邪泄写褨褌褜 蟹斜械褉械卸械薪褨 褉械蟹褍谢褜褌邪褌懈 褌褍褌.',
+      startCreateContent: '袩芯褔邪褌懈 褋褌胁芯褉褞胁邪褌懈 胁屑褨褋褌',
+    },
+    title: '袛芯锌芯胁薪械薪薪褟 AI',
+    queryTitle: '袙屑褨褋褌 蟹邪锌懈褌褍',
+    completionResult: '袪械蟹褍谢褜褌邪褌 蟹邪胁械褉褕械薪薪褟',
+    queryPlaceholder: '袧邪锌懈褕褨褌褜 胁屑褨褋褌 褋胁芯谐芯 蟹邪锌懈褌褍...',
+    run: '袙懈泻芯薪邪褌懈',
+    copy: '袣芯锌褨褞胁邪褌懈',
+    resultTitle: '袛芯锌芯胁薪械薪薪褟 AI',
+    noData: 'AI 写邪褋褌褜 胁邪屑 褌械, 褖芯 胁懈 褏芯褔械褌械 褌褍褌.',
+    csvUploadTitle: '袩械褉械褌褟谐薪褨褌褜 褎邪泄谢 CSV 褋褞写懈 邪斜芯',
+    browse: '锌械褉械谐谢褟薪褍褌懈',
+    csvStructureTitle: '肖邪泄谢 CSV 锌芯胁懈薪械薪 胁褨写锌芯胁褨写邪褌懈 薪邪褋褌褍锌薪褨泄 褋褌褉褍泻褌褍褉褨:',
+    downloadTemplate: '袟邪胁邪薪褌邪卸懈褌懈 褕邪斜谢芯薪 褌褍褌',
+    field: '袩芯谢械',
+    batchFailed: {
+      info: '{{num}} 胁懈泻芯薪邪薪褜 薪械 胁写邪谢芯褋褟',
+      retry: '袩芯胁褌芯褉懈褌懈',
+      outputPlaceholder: '袙屑褨褋褌 胁褨写褋褍褌薪褨泄',
+    },
+    errorMsg: {
+      empty: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 胁屑褨褋褌 褍 蟹邪胁邪薪褌邪卸械薪懈泄 褎邪泄谢.',
+      fileStructNotMatch: '袟邪胁邪薪褌邪卸械薪懈泄 CSV-褎邪泄谢 薪械 胁褨写锌芯胁褨写邪褦 褋褌褉褍泻褌褍褉褨.',
+      emptyLine: '袪褟写芯泻 {{rowIndex}} 锌芯褉芯卸薪褨泄',
+      invalidLine: '袪褟写芯泻 {{rowIndex}}: 蟹薪邪褔械薪薪褟 {{varName}} 薪械 屑芯卸械 斜褍褌懈 锌褍褋褌懈屑',
+      moreThanMaxLengthLine: '袪褟写芯泻 {{rowIndex}}: 蟹薪邪褔械薪薪褟 {{varName}} 薪械 屑芯卸械 屑褨褋褌懈褌懈 斜褨谢褜褕械 {{maxLength}} 褋懈屑胁芯谢褨胁',
+      atLeastOne: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 锌褉懈薪邪泄屑薪褨 芯写懈薪 褉褟写芯泻 褍 蟹邪胁邪薪褌邪卸械薪懈泄 褎邪泄谢.',
+    },
+    execution: '袙袠袣袨袧袗袧袧携',
+    executions: '{{num}} 袙袠袣袨袧袗袧鞋',
+  },
+}
+
+export default translation
diff --git a/i18n/uk-UA/time.ts b/i18n/uk-UA/time.ts
new file mode 100644
index 0000000..1ea08cb
--- /dev/null
+++ b/i18n/uk-UA/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Thu: '效械褌胁械褉',
+    Fri: '袙褨谢褜薪懈泄',
+    Sun: '小芯薪褑械',
+    Tue: '袙褨胁褌芯褉芯泻',
+    Mon: '袦芯薪',
+    Sat: '小褍斜芯褌邪',
+    Wed: '小械褉械写邪',
+  },
+  months: {
+    August: '小械褉锌械薪褜',
+    January: '小褨褔械薪褜',
+    October: '袞芯胁褌械薪褜',
+    June: '效械褉胁械薪褜',
+    September: '袙械褉械褋械薪褜',
+    February: '袥褞褌懈泄',
+    November: '袥懈褋褌芯锌邪写',
+    July: '袥懈锌械薪褜',
+    May: '孝褉邪胁械薪褜',
+    December: '袚褉褍写械薪褜',
+    April: '袣胁褨褌械薪褜',
+    March: '袘械褉械蟹械薪褜',
+  },
+  operation: {
+    cancel: '小泻邪褋褍胁邪褌懈',
+    pickDate: '袙懈斜械褉褨褌褜 写邪褌褍',
+    now: '孝械锌械褉',
+    ok: '袛芯斜褉械',
+  },
+  title: {
+    pickTime: '袙懈斜械褉褨褌褜 褔邪褋',
+  },
+  defaultPlaceholder: '袙懈斜械褉褨褌褜 褔邪褋...',
+}
+
+export default translation
diff --git a/i18n/uk-UA/tools.ts b/i18n/uk-UA/tools.ts
new file mode 100644
index 0000000..528e683
--- /dev/null
+++ b/i18n/uk-UA/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: '袉薪褋褌褉褍屑械薪褌懈',
+  createCustomTool: '小褌胁芯褉懈褌懈 胁谢邪褋薪懈泄 褨薪褋褌褉褍屑械薪褌',
+  type: {
+    all: '校褋褨',
+    builtIn: '袙斜褍写芯胁邪薪褨',
+    custom: '袣芯褉懈褋褌褍胁邪褑褜泻褨',
+    workflow: '袪芯斜芯褔懈泄 锌褉芯褑械褋',
+  },
+  contribute: {
+    line1: '袦械薪褨 褑褨泻邪胁芯 蟹褉芯斜懈褌懈 褋胁褨泄 胁薪械褋芯泻',
+    line2: '褋褌胁芯褉械薪薪褟 褨薪褋褌褉褍屑械薪褌褨胁 写谢褟 Dify.',
+    viewGuide: '袩械褉械谐谢褟薪褍褌懈 褨薪褋褌褉褍泻褑褨褞',
+  },
+  author: '袗胁褌芯褉',
+  auth: {
+    unauthorized: '袗胁褌芯褉懈蟹褍胁邪褌懈褋褟',
+    authorized: '袗胁褌芯褉懈蟹芯胁邪薪芯',
+    setup: '袧邪谢邪褕褌褍胁邪褌懈 邪胁褌芯褉懈蟹邪褑褨褞, 褖芯斜 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈',
+    setupModalTitle: '袧邪谢邪褕褌褍胁邪薪薪褟 邪胁褌芯褉懈蟹邪褑褨褩',
+    setupModalTitleDescription: '袩褨褋谢褟 薪邪谢邪褕褌褍胁邪薪薪褟 芯斜谢褨泻芯胁懈褏 写邪薪懈褏 褍褋褨 褔谢械薪懈 褉芯斜芯褔芯谐芯 锌褉芯褋褌芯褉褍 屑芯卸褍褌褜 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 褑械泄 褨薪褋褌褉褍屑械薪褌 锌褨写 褔邪褋 芯褉泻械褋褌褉褍胁邪薪薪褟 锌褉芯谐褉邪屑.',
+  },
+  includeToolNum: '{{num}} 褨薪褋褌褉褍屑械薪褌(褨胁) 胁泻谢褞褔械薪芯',
+  addTool: '袛芯写邪褌懈 褨薪褋褌褉褍屑械薪褌 ',
+  createTool: {
+    title: '小褌胁芯褉懈褌懈 胁谢邪褋薪懈泄 褨薪褋褌褉褍屑械薪褌',
+    editAction: '袧邪谢邪褕褌褍胁邪薪薪褟',
+    editTitle: '袪械写邪谐褍胁邪褌懈 薪邪褋褌褉芯褞胁邪薪懈泄 褨薪褋褌褉褍屑械薪褌',
+    name: '袧邪蟹胁邪',
+    toolNamePlaceHolder: '袙胁械写褨褌褜 薪邪蟹胁褍 褨薪褋褌褉褍屑械薪褌褍',
+    schema: '小褏械屑邪',
+    schemaPlaceHolder: '袙胁械写褨褌褜 褋胁芯褞 褋褏械屑褍 OpenAPI 褌褍褌',
+    viewSchemaSpec: '袩械褉械谐谢褟薪褍褌懈 褋锌械褑懈褎褨泻邪褑褨褞 OpenAPI-Swagger',
+    importFromUrl: '袉屑锌芯褉褌褍胁邪褌懈 蟹 URL-邪写褉械褋懈',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: '袙胁械写褨褌褜 写褨泄褋薪褍 URL-邪写褉械褋褍',
+    examples: '袩褉懈泻谢邪写懈',
+    exampleOptions: {
+      json: '袩芯谐芯写邪 (JSON)',
+      yaml: '袟芯芯褌芯胁邪褉褨胁 (YAML)',
+      blankTemplate: '效懈褋褌懈泄 褕邪斜谢芯薪',
+    },
+    availableTools: {
+      title: '袛芯褋褌褍锌薪褨 褨薪褋褌褉褍屑械薪褌懈',
+      name: '袧邪蟹胁邪',
+      description: '袨锌懈褋',
+      method: '袦械褌芯写',
+      path: '楔谢褟褏',
+      action: '袛褨褟',
+      test: '袩械褉械胁褨褉泻邪',
+    },
+    authMethod: {
+      title: '袦械褌芯写 邪胁褌芯褉懈蟹邪褑褨褩',
+      type: '孝懈锌 邪胁褌芯褉懈蟹邪褑褨褩',
+      keyTooltip: '袣谢褞褔 HTTP-蟹邪谐芯谢芯胁泻邪. 携泻褖芯 胁懈 薪械 蟹薪邪褦褌械, 蟹邪谢懈褕褌械 泄芯谐芯 褟泻 "Authorization" 邪斜芯 胁褋褌邪薪芯胁褨褌褜 胁谢邪褋薪械 蟹薪邪褔械薪薪褟',
+      types: {
+        none: '袙褨写褋褍褌薪褟',
+        api_key: 'API-泻谢褞褔',
+        apiKeyPlaceholder: '袧邪蟹胁邪 HTTP-蟹邪谐芯谢芯胁泻邪 写谢褟 API-泻谢褞褔邪',
+        apiValuePlaceholder: '袙胁械写褨褌褜 API-泻谢褞褔',
+      },
+      key: '袣谢褞褔',
+      value: '袟薪邪褔械薪薪褟',
+    },
+    authHeaderPrefix: {
+      types: {
+        basic: 'Basic',
+        bearer: 'Bearer',
+        custom: 'Custom',
+      },
+      title: '孝懈锌 邪褍褌械薪褌懈褎褨泻邪褑褨褩',
+    },
+    privacyPolicy: '袩芯谢褨褌懈泻邪 泻芯薪褎褨写械薪褑褨泄薪芯褋褌褨',
+    privacyPolicyPlaceholder: '袙胁械写褨褌褜 锌芯谢褨褌懈泻褍 泻芯薪褎褨写械薪褑褨泄薪芯褋褌褨',
+    customDisclaimer: '袙谢邪褋薪懈泄 胁褨写芯屑芯褋褌褨',
+    customDisclaimerPlaceholder: '袙胁械写褨褌褜 胁谢邪褋薪褨 胁褨写芯屑芯褋褌褨',
+    deleteToolConfirmTitle: '袙懈写邪谢懈褌懈 褑械泄 褨薪褋褌褉褍屑械薪褌?',
+    deleteToolConfirmContent: '袙懈写邪谢械薪薪褟 褨薪褋褌褉褍屑械薪褌褍 褦 薪械蟹胁芯褉芯褌薪褨屑. 袣芯褉懈褋褌褍胁邪褔褨 斜褨谢褜褕械 薪械 蟹屑芯卸褍褌褜 芯褌褉懈屑邪褌懈 写芯褋褌褍锌 写芯 胁邪褕芯谐芯 褨薪褋褌褉褍屑械薪褌褍.',
+    toolInput: {
+      label: '袦褨褌泻懈',
+      name: '袉屑\'褟',
+      required: '袧械芯斜褏褨写薪懈泄',
+      method: '袦械褌芯写',
+      title: '袙胁械写械薪薪褟 褨薪褋褌褉褍屑械薪褌褍',
+      methodSetting: '袩邪褉邪屑械褌褉',
+      description: '袨锌懈褋',
+      methodParameter: '袩邪褉邪屑械褌褉',
+      labelPlaceholder: '袙懈斜械褉褨褌褜 褌械谐懈 (薪械芯斜芯胁\'褟蟹泻芯胁芯)',
+      descriptionPlaceholder: '袨锌懈褋 蟹薪邪褔械薪薪褟 锌邪褉邪屑械褌褉邪',
+      methodSettingTip: '袣芯褉懈褋褌褍胁邪褔 蟹邪锌芯胁薪褞褦 泻芯薪褎褨谐褍褉邪褑褨褞 褨薪褋褌褉褍屑械薪褌褍',
+      methodParameterTip: 'LLM 蟹邪锌芯胁薪褞褦褌褜褋褟 锌褨写 褔邪褋 谢芯谐褨褔薪芯谐芯 胁懈褋薪芯胁泻褍',
+    },
+    description: '袨锌懈褋',
+    nameForToolCall: '袉屑\'褟 胁懈泻谢懈泻褍 褨薪褋褌褉褍屑械薪褌褍',
+    confirmTitle: '袩褨写褌胁械褉写褜褌械, 褖芯斜 蟹斜械褉械谐褌懈?',
+    nameForToolCallTip: '袩褨写褌褉懈屑褍褦 谢懈褕械 褑懈褎褉懈, 谢褨褌械褉懈 褌邪 锌褨写泻褉械褋谢械薪薪褟.',
+    confirmTip: '笑械 胁锌谢懈薪械 薪邪 锌褉芯谐褉邪屑懈, 褟泻褨 胁懈泻芯褉懈褋褌芯胁褍褞褌褜 褑械泄 褨薪褋褌褉褍屑械薪褌',
+    nameForToolCallPlaceHolder: '袙懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 褉芯蟹锌褨蟹薪邪胁邪薪薪褟 屑邪褕懈薪, 褌邪泻懈褏 褟泻 getCurrentWeather, list_pets',
+    descriptionPlaceholder: '袣芯褉芯褌泻懈泄 芯锌懈褋 锌褉懈蟹薪邪褔械薪薪褟 褨薪褋褌褉褍屑械薪褌褍, 薪邪锌褉懈泻谢邪写, 芯褌褉懈屑邪薪薪褟 褌械屑锌械褉邪褌褍褉懈 写谢褟 泻芯薪泻褉械褌薪芯谐芯 屑褨褋褑褟.',
+  },
+  test: {
+    title: '孝械褋褌',
+    parametersValue: '袩邪褉邪屑械褌褉懈 褌邪 蟹薪邪褔械薪薪褟',
+    parameters: '袩邪褉邪屑械褌褉懈',
+    value: '袟薪邪褔械薪薪褟',
+    testResult: '袪械蟹褍谢褜褌邪褌懈 褌械褋褌褍',
+    testResultPlaceholder: '袪械蟹褍谢褜褌邪褌 褌械褋褌褍 斜褍写械 胁褨写芯斜褉邪卸邪褌懈褋褟 褌褍褌',
+  },
+  thought: {
+    using: '袙懈泻芯褉懈褋褌邪薪薪褟',
+    used: '袙懈泻芯褉懈褋褌邪薪芯',
+    requestTitle: '袟邪锌懈褌 写芯',
+    responseTitle: '袙褨写锌芯胁褨写褜 胁褨写',
+  },
+  setBuiltInTools: {
+    info: '袉薪褎芯褉屑邪褑褨褟',
+    setting: '袧邪谢邪褕褌褍胁邪薪薪褟',
+    toolDescription: '袨锌懈褋 褨薪褋褌褉褍屑械薪褌褍',
+    parameters: '袩邪褉邪屑械褌褉懈',
+    string: '袪褟写芯泻',
+    number: '效懈褋谢芯',
+    required: '袨斜芯胁鈥櫻徯沸盒拘残�',
+    infoAndSetting: '袉薪褎芯褉屑邪褑褨褟 褌邪 薪邪谢邪褕褌褍胁邪薪薪褟',
+    file: '褎邪泄谢',
+  },
+  noCustomTool: {
+    title: '袧械屑邪褦 泻芯褉懈褋褌褍胁邪褑褜泻懈褏 褨薪褋褌褉褍屑械薪褌褨胁!',
+    content: '袛芯写邪胁邪泄褌械 褌邪 泻械褉褍泄褌械 褋胁芯褩屑懈 胁谢邪褋薪懈屑懈 褨薪褋褌褉褍屑械薪褌邪屑懈 褌褍褌 写谢褟 褋褌胁芯褉械薪薪褟 锌褉芯谐褉邪屑 蟹褨 褕褌褍褔薪懈屑 褨薪褌械谢械泻褌芯屑.',
+    createTool: '小褌胁芯褉懈褌懈 褨薪褋褌褉褍屑械薪褌',
+  },
+  noSearchRes: {
+    title: '袙懈斜邪褔褌械, 薪械屑邪褦 褉械蟹褍谢褜褌邪褌褨胁!',
+    content: '袦懈 薪械 蟹薪邪泄褕谢懈 卸芯写薪懈褏 褨薪褋褌褉褍屑械薪褌褨胁, 褟泻褨 斜 胁褨写锌芯胁褨写邪谢懈 胁邪褕芯屑褍 锌芯褕褍泻褍.',
+    reset: '小泻懈薪褍褌懈 锌芯褕褍泻',
+  },
+  builtInPromptTitle: '袩褨写泻邪蟹泻邪',
+  toolRemoved: '袉薪褋褌褉褍屑械薪褌 胁懈写邪谢械薪芯',
+  notAuthorized: '袉薪褋褌褉褍屑械薪褌 薪械 邪胁褌芯褉懈蟹芯胁邪薪芯',
+  howToGet: '携泻 芯褌褉懈屑邪褌懈',
+  addToolModal: {
+    category: '泻邪褌械谐芯褉褨褟',
+    add: '袛芯写邪褌懈',
+    added: '袛芯写邪薪芯',
+    type: '褌懈锌',
+    manageInTools: '袣械褉褍胁邪薪薪褟 胁 褨薪褋褌褉褍屑械薪褌邪褏',
+    emptyTip: '袩械褉械泄写褨褌褜 写芯 褉芯蟹写褨谢褍 "袪芯斜芯褔懈泄 锌褉芯褑械褋 -> 袨锌褍斜谢褨泻褍胁邪褌懈 褟泻 褨薪褋褌褉褍屑械薪褌"',
+    emptyTitle: '袧械屑邪褦 写芯褋褌褍锌薪芯谐芯 褨薪褋褌褉褍屑械薪褌褍 写谢褟 褉芯斜芯褌懈 蟹 褉芯斜芯褔懈屑懈 锌褉芯褑械褋邪屑懈',
+    emptyTitleCustom: '袧械屑邪褦 写芯褋褌褍锌薪芯谐芯 褋锌械褑褨邪谢褜薪芯谐芯 褨薪褋褌褉褍屑械薪褌褍',
+    emptyTipCustom: '小褌胁芯褉械薪薪褟 胁谢邪褋薪芯谐芯 褨薪褋褌褉褍屑械薪褌邪',
+  },
+  openInStudio: '袙褨写泻褉懈褌懈 胁 小褌褍写褨褩',
+  customToolTip: '袛褨蟹薪邪泄褌械褋褟 斜褨谢褜褕械 锌褉芯 泻芯褉懈褋褌褍胁邪褑褜泻褨 褨薪褋褌褉褍屑械薪褌懈 Dify',
+  toolNameUsageTip: '袉屑\'褟 胁懈泻谢懈泻褍 褨薪褋褌褉褍屑械薪褌褍 写谢褟 屑褨褉泻褍胁邪薪褜 褨 锌褨写泻邪蟹芯泻 邪谐械薪褌邪',
+  copyToolName: '袉屑\'褟 泻芯锌褨褩',
+  noTools: '袉薪褋褌褉褍屑械薪褌褨胁 薪械 蟹薪邪泄写械薪芯',
+}
+
+export default translation
diff --git a/i18n/uk-UA/workflow.ts b/i18n/uk-UA/workflow.ts
new file mode 100644
index 0000000..c2d0b13
--- /dev/null
+++ b/i18n/uk-UA/workflow.ts
@@ -0,0 +1,921 @@
+const translation = {
+  common: {
+    undo: '小泻邪褋褍胁邪褌懈',
+    redo: '袩芯胁褌芯褉懈褌懈',
+    editing: '袪械写邪谐褍胁邪薪薪褟',
+    autoSaved: '袗胁褌芯屑邪褌懈褔薪芯 蟹斜械褉械卸械薪芯',
+    unpublished: '袧械芯锌褍斜谢褨泻芯胁邪薪芯',
+    published: '袨锌褍斜谢褨泻芯胁邪薪芯',
+    publish: '袨锌褍斜谢褨泻褍胁邪褌懈',
+    update: '袨薪芯胁懈褌懈',
+    run: '袟邪锌褍褋褌懈褌懈',
+    running: '袟邪锌褍褖械薪芯',
+    inRunMode: '校 褉械卸懈屑褨 蟹邪锌褍褋泻褍',
+    inPreview: '校 褉械卸懈屑褨 锌芯锌械褉械写薪褜芯谐芯 锌械褉械谐谢褟写褍',
+    inPreviewMode: '校 褉械卸懈屑褨 锌芯锌械褉械写薪褜芯谐芯 锌械褉械谐谢褟写褍',
+    preview: '袩芯锌械褉械写薪褨泄 锌械褉械谐谢褟写',
+    viewRunHistory: '袩械褉械谐谢褟薪褍褌懈 褨褋褌芯褉褨褞 蟹邪锌褍褋泻褨胁',
+    runHistory: '袉褋褌芯褉褨褟 蟹邪锌褍褋泻褨胁',
+    goBackToEdit: '袩芯胁械褉薪褍褌懈褋褟 写芯 褉械写邪泻褌芯褉邪',
+    conversationLog: '袞褍褉薪邪谢 褉芯蟹屑芯胁',
+    features: '肖褍薪泻褑褨褩',
+    debugAndPreview: '袩芯锌械褉械写薪褨泄 锌械褉械谐谢褟写',
+    restart: '袩械褉械蟹邪锌褍褋褌懈褌懈',
+    currentDraft: '袩芯褌芯褔薪懈泄 褔械褉薪械褌泻邪',
+    currentDraftUnpublished: '袩芯褌芯褔薪懈泄 褔械褉薪械褌泻邪 薪械芯锌褍斜谢褨泻芯胁邪薪懈泄',
+    latestPublished: '袨褋褌邪薪薪褦 芯锌褍斜谢褨泻芯胁邪薪械',
+    publishedAt: '袨锌褍斜谢褨泻芯胁邪薪芯 芯',
+    restore: '袙褨写薪芯胁懈褌懈',
+    runApp: '袟邪锌褍褋褌懈褌懈 写芯写邪褌芯泻',
+    batchRunApp: '袩邪泻械褌薪懈泄 蟹邪锌褍褋泻 写芯写邪褌泻褍',
+    accessAPIReference: '袛芯褋褌褍锌 写芯 写芯胁褨写薪懈泻邪 API',
+    embedIntoSite: '袙斜褍写褍胁邪褌懈 薪邪 褋邪泄褌',
+    addTitle: '袛芯写邪褌懈 蟹邪谐芯谢芯胁芯泻...',
+    addDescription: '袛芯写邪褌懈 芯锌懈褋...',
+    noVar: '袘械蟹 蟹屑褨薪薪芯褩',
+    searchVar: '袩芯褕褍泻 蟹屑褨薪薪芯褩',
+    variableNamePlaceholder: '袧邪蟹胁邪 蟹屑褨薪薪芯褩',
+    setVarValuePlaceholder: '袙褋褌邪薪芯胁懈褌懈 蟹薪邪褔械薪薪褟 蟹屑褨薪薪芯褩',
+    needConnectTip: '笑械泄 泻褉芯泻 薪褨 写芯 褔芯谐芯 薪械 锌褨写泻谢褞褔械薪懈泄',
+    maxTreeDepth: '袦邪泻褋懈屑邪谢褜薪懈泄 谢褨屑褨褌 {{depth}} 胁褍蟹谢褨胁 薪邪 谐褨谢泻褍',
+    needEndNode: '袩芯褌褉褨斜薪芯 写芯写邪褌懈 泻褨薪褑械胁懈泄 斜谢芯泻',
+    needAnswerNode: '袩芯褌褉褨斜薪芯 写芯写邪褌懈 斜谢芯泻 胁褨写锌芯胁褨写褨',
+    workflowProcess: '袩褉芯褑械褋 褉芯斜芯褔芯谐芯 锌芯褌芯泻褍',
+    notRunning: '些械 薪械 蟹邪锌褍褖械薪芯',
+    previewPlaceholder: '袙胁械写褨褌褜 胁屑褨褋褌 褍 锌芯谢械 薪懈卸褔械, 褖芯斜 褉芯蟹锌芯褔邪褌懈 薪邪谢邪谐芯写卸械薪薪褟 褔邪褌-斜芯褌邪',
+    effectVarConfirm: {
+      title: '袙懈写邪谢懈褌懈 蟹屑褨薪薪褍',
+      content: '袟屑褨薪薪邪 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 胁 褨薪褕懈褏 胁褍蟹谢邪褏. 袙懈 胁褋械 褖械 褏芯褔械褌械 褩褩 胁懈写邪谢懈褌懈?',
+    },
+    insertVarTip: '袧邪褌懈褋薪褨褌褜 泻谢邪胁褨褕褍 \'/\' 写谢褟 褕胁懈写泻芯谐芯 胁褋褌邪胁谢械薪薪褟',
+    processData: '袨斜褉芯斜懈褌懈 写邪薪褨',
+    input: '袙褏褨写',
+    output: '袙懈褏褨写',
+    jinjaEditorPlaceholder: '袙胁械写褨褌褜 \'/\' 邪斜芯 \'{\' 写谢褟 胁褋褌邪胁谢械薪薪褟 蟹屑褨薪薪芯褩',
+    viewOnly: '孝褨谢褜泻懈 锌械褉械谐谢褟写',
+    showRunHistory: '袩芯泻邪蟹邪褌懈 褨褋褌芯褉褨褞 蟹邪锌褍褋泻褨胁',
+    enableJinja: '校胁褨屑泻薪褍褌懈 锌褨写褌褉懈屑泻褍 褕邪斜谢芯薪褨胁 Jinja',
+    learnMore: '袛褨蟹薪邪褌懈褋褟 斜褨谢褜褕械',
+    copy: '袣芯锌褨褞胁邪褌懈',
+    duplicate: '袛褍斜谢褞胁邪褌懈',
+    addBlock: '袛芯写邪褌懈 斜谢芯泻',
+    pasteHere: '袙褋褌邪胁懈褌懈 褋褞写懈',
+    pointerMode: '袪械卸懈屑 胁泻邪蟹褨胁薪懈泻邪',
+    handMode: '袪褍褔薪懈泄 褉械卸懈屑',
+    model: '袦芯写械谢褜',
+    workflowAsTool: '袪芯斜芯褔懈泄 锌芯褌褨泻 褟泻 褨薪褋褌褉褍屑械薪褌',
+    configureRequired: '袩芯褌褉褨斜薪邪 泻芯薪褎褨谐褍褉邪褑褨褟',
+    configure: '袧邪谢邪褕褌褍胁邪褌懈',
+    manageInTools: '袣械褉褍胁邪薪薪褟 胁 褨薪褋褌褉褍屑械薪褌邪褏',
+    workflowAsToolTip: '袩褨褋谢褟 芯薪芯胁谢械薪薪褟 褉芯斜芯褔芯谐芯 锌芯褌芯泻褍 薪械芯斜褏褨写薪邪 锌械褉械泻芯薪褎褨谐褍褉邪褑褨褟 褨薪褋褌褉褍屑械薪褌褍.',
+    viewDetailInTracingPanel: '袩械褉械谐谢褟薪褍褌懈 写械褌邪谢褨',
+    importSuccess: '校褋锌褨褏 褨屑锌芯褉褌褍',
+    overwriteAndImport: '袩械褉械蟹邪锌懈褋 褌邪 褨屑锌芯褉褌',
+    importFailure: '袩芯屑懈谢泻邪 褨屑锌芯褉褌褍',
+    importDSL: '袉屑锌芯褉褌 DSL',
+    syncingData: '小懈薪褏褉芯薪褨蟹邪褑褨褟 写邪薪懈褏, 胁褋褜芯谐芯 蟹邪 泻褨谢褜泻邪 褋械泻褍薪写.',
+    chooseDSL: '袙懈斜械褉褨褌褜 褎邪泄谢 DSL(yml)',
+    backupCurrentDraft: '袪械蟹械褉胁薪邪 锌芯褌芯褔薪邪 褔械褉薪械褌泻邪',
+    importDSLTip: '袩芯褌芯褔薪邪 褔械褉薪械褌泻邪 斜褍写械 锌械褉械蟹邪锌懈褋邪薪邪. 袝泻褋锌芯褉褌褍泄褌械 褉芯斜芯褔懈泄 锌褉芯褑械褋 褟泻 褉械蟹械褉胁薪褍 泻芯锌褨褞 锌械褉械写 褨屑锌芯褉褌芯屑.',
+    parallelTip: {
+      click: {
+        title: '袧邪褌懈褋薪褨褌褜',
+        desc: '褖芯斜 写芯写邪褌懈',
+      },
+      drag: {
+        title: '袩械褉械褌褟谐褍胁邪褌懈',
+        desc: '些芯斜 锌褨写泻谢褞褔懈褌懈',
+      },
+      limit: '袩邪褉邪谢械谢褨蟹屑 芯斜屑械卸褍褦褌褜褋褟 {{num}} 谐褨谢泻邪屑懈.',
+      depthLimit: '袨斜屑械卸械薪薪褟 褉褨胁薪褟 锌邪褉邪谢械谢褜薪芯谐芯 胁泻谢邪写械薪芯褋褌褨 褕邪褉褨胁 {{num}}',
+    },
+    disconnect: '袙褨写泻谢褞褔懈褌懈',
+    parallelRun: '袩邪褉邪谢械谢褜薪懈泄 斜褨谐',
+    jumpToNode: '袩械褉械泄褌懈 写芯 褑褜芯谐芯 胁褍蟹谢邪',
+    addParallelNode: '袛芯写邪褌懈 锌邪褉邪谢械谢褜薪懈泄 胁褍蟹芯谢',
+    parallel: '袩袗袪袗袥袝袥鞋袧袠袡',
+    branch: '袚袉袥袣袗',
+    featuresDocLink: '袛褨蟹薪邪褌懈褋褟 斜褨谢褜褕械',
+    featuresDescription: '袩芯泻褉邪褖械薪薪褟 胁蟹邪褦屑芯写褨褩 蟹 泻芯褉懈褋褌褍胁邪褔械屑 胁械斜-写芯写邪褌泻褍',
+    fileUploadTip: '肖褍薪泻褑褨褩 蟹邪胁邪薪褌邪卸械薪薪褟 蟹芯斜褉邪卸械薪褜 斜褍谢懈 芯薪芯胁谢械薪褨 写谢褟 蟹邪胁邪薪褌邪卸械薪薪褟 褎邪泄谢褨胁.',
+    ImageUploadLegacyTip: '孝械锌械褉 胁懈 屑芯卸械褌械 褋褌胁芯褉褞胁邪褌懈 蟹屑褨薪薪褨 褌懈锌褍 褎邪泄谢褍 褍 锌芯褔邪褌泻芯胁褨泄 褎芯褉屑褨. 校 屑邪泄斜褍褌薪褜芯屑褍 屑懈 斜褨谢褜褕械 薪械 锌褨写褌褉懈屑褍胁邪褌懈屑械屑芯 褎褍薪泻褑褨褞 蟹邪胁邪薪褌邪卸械薪薪褟 蟹芯斜褉邪卸械薪褜.',
+    importWarning: '袨斜械褉械卸薪褨褋褌褜',
+    importWarningDetails: '袪褨蟹薪懈褑褟 褍 胁械褉褋褨褟褏 DSL 屑芯卸械 胁锌谢懈胁邪褌懈 薪邪 锌械胁薪褨 褎褍薪泻褑褨褩',
+    openInExplore: '袙褨写泻褉懈褌懈 胁 袨谐谢褟写褨',
+    onFailure: '袩褉芯 薪械胁写邪褔褍',
+    addFailureBranch: '袛芯写邪薪芯 谐褨谢泻褍 锌芯屑懈谢泻懈',
+    noHistory: '袘械蟹 褨褋褌芯褉褨褩',
+    loadMore: '袟邪胁邪薪褌邪卸褌械 斜褨谢褜褕械 褉芯斜芯褔懈褏 锌褉芯褑械褋褨胁',
+    referenceVar: '袩芯褋懈谢邪谢褜薪邪 蟹屑褨薪薪邪',
+    exportPNG: '袝泻褋锌芯褉褌褍胁邪褌懈 褟泻 PNG',
+    noExist: '孝邪泻芯褩 蟹屑褨薪薪芯褩 薪械 褨褋薪褍褦',
+    exitVersions: '袙懈褏褨写薪褨 胁械褉褋褨褩',
+    versionHistory: '袉褋褌芯褉褨褟 胁械褉褋褨泄',
+    publishUpdate: '袨锌褍斜谢褨泻褍胁邪褌懈 芯薪芯胁谢械薪薪褟',
+    exportImage: '袝泻褋锌芯褉褌 蟹芯斜褉邪卸械薪薪褟',
+    exportSVG: '袝泻褋锌芯褉褌褍胁邪褌懈 褟泻 SVG',
+    exportJPEG: '袝泻褋锌芯褉褌褍胁邪褌懈 褟泻 JPEG',
+  },
+  env: {
+    envPanelTitle: '袟屑褨薪薪褨 褋械褉械写芯胁懈褖邪',
+    envDescription: '袟屑褨薪薪褨 褋械褉械写芯胁懈褖邪 屑芯卸褍褌褜 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈褋褟 写谢褟 蟹斜械褉褨谐邪薪薪褟 锌褉懈胁邪褌薪芯褩 褨薪褎芯褉屑邪褑褨褩 褌邪 芯斜谢褨泻芯胁懈褏 写邪薪懈褏. 袙芯薪懈 写芯褋褌褍锌薪褨 谢懈褕械 写谢褟 褔懈褌邪薪薪褟 褨 屑芯卸褍褌褜 斜褍褌懈 胁褨写芯泻褉械屑谢械薪褨 胁褨写 褎邪泄谢褍 DSL 锌褨写 褔邪褋 械泻褋锌芯褉褌褍.',
+    envPanelButton: '袛芯写邪褌懈 蟹屑褨薪薪褍',
+    modal: {
+      title: '袛芯写邪褌懈 蟹屑褨薪薪褍 褋械褉械写芯胁懈褖邪',
+      editTitle: '袪械写邪谐褍胁邪褌懈 蟹屑褨薪薪褍 褋械褉械写芯胁懈褖邪',
+      type: '孝懈锌',
+      name: '袧邪蟹胁邪',
+      namePlaceholder: '薪邪蟹胁邪 褋械褉械写芯胁懈褖邪',
+      value: '袟薪邪褔械薪薪褟',
+      valuePlaceholder: '蟹薪邪褔械薪薪褟 褋械褉械写芯胁懈褖邪',
+      secretTip: '袙懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 胁懈蟹薪邪褔械薪薪褟 泻芯薪褎褨写械薪褑褨泄薪芯褩 褨薪褎芯褉屑邪褑褨褩 邪斜芯 写邪薪懈褏, 蟹 薪邪谢邪褕褌褍胁邪薪薪褟屑懈 DSL, 褋泻芯薪褎褨谐褍褉芯胁邪薪懈屑懈 写谢褟 蟹邪锌芯斜褨谐邪薪薪褟 胁懈褌芯泻褍.',
+    },
+    export: {
+      title: '袝泻褋锌芯褉褌褍胁邪褌懈 褋械泻褉械褌薪褨 蟹屑褨薪薪褨 褋械褉械写芯胁懈褖邪?',
+      checkbox: '袝泻褋锌芯褉褌褍胁邪褌懈 褋械泻褉械褌薪褨 蟹薪邪褔械薪薪褟',
+      ignore: '袝泻褋锌芯褉褌褍胁邪褌懈 DSL',
+      export: '袝泻褋锌芯褉褌褍胁邪褌懈 DSL 蟹 褋械泻褉械褌薪懈屑懈 蟹薪邪褔械薪薪褟屑懈',
+    },
+  },
+  chatVariable: {
+    panelTitle: '袟屑褨薪薪褨 褉芯蟹屑芯胁懈',
+    panelDescription: '袟屑褨薪薪褨 褉芯蟹屑芯胁懈 胁懈泻芯褉懈褋褌芯胁褍褞褌褜褋褟 写谢褟 蟹斜械褉褨谐邪薪薪褟 褨薪褌械褉邪泻褌懈胁薪芯褩 褨薪褎芯褉屑邪褑褨褩, 褟泻褍 LLM 锌芯胁懈薪械薪 锌邪屑\'褟褌邪褌懈, 胁泻谢褞褔邪褞褔懈 褨褋褌芯褉褨褞 褉芯蟹屑芯胁懈, 蟹邪胁邪薪褌邪卸械薪褨 褎邪泄谢懈, 胁锌芯写芯斜邪薪薪褟 泻芯褉懈褋褌褍胁邪褔邪. 袙芯薪懈 写芯褋褌褍锌薪褨 写谢褟 褔懈褌邪薪薪褟 褌邪 蟹邪锌懈褋褍.',
+    docLink: '袙褨写胁褨写邪泄褌械 薪邪褕褍 写芯泻褍屑械薪褌邪褑褨褞, 褖芯斜 写褨蟹薪邪褌懈褋褟 斜褨谢褜褕械.',
+    button: '袛芯写邪褌懈 蟹屑褨薪薪褍',
+    modal: {
+      title: '袛芯写邪褌懈 蟹屑褨薪薪褍 褉芯蟹屑芯胁懈',
+      editTitle: '袪械写邪谐褍胁邪褌懈 蟹屑褨薪薪褍 褉芯蟹屑芯胁懈',
+      name: '袧邪蟹胁邪',
+      namePlaceholder: '袧邪蟹胁邪 蟹屑褨薪薪芯褩',
+      type: '孝懈锌',
+      value: '袟薪邪褔械薪薪褟 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑',
+      valuePlaceholder: '袟薪邪褔械薪薪褟 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑, 蟹邪谢懈褕褌械 锌芯褉芯卸薪褨屑, 褖芯斜 薪械 胁褋褌邪薪芯胁谢褞胁邪褌懈',
+      description: '袨锌懈褋',
+      descriptionPlaceholder: '袨锌懈褕褨褌褜 蟹屑褨薪薪褍',
+      editInJSON: '袪械写邪谐褍胁邪褌懈 胁 JSON',
+      oneByOne: '袛芯写邪胁邪褌懈 锌芯 芯写薪芯屑褍',
+      editInForm: '袪械写邪谐褍胁邪褌懈 褍 褎芯褉屑褨',
+      arrayValue: '袟薪邪褔械薪薪褟',
+      addArrayValue: '袛芯写邪褌懈 蟹薪邪褔械薪薪褟',
+      objectKey: '袣谢褞褔',
+      objectType: '孝懈锌',
+      objectValue: '袟薪邪褔械薪薪褟 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑',
+    },
+    storedContent: '袟斜械褉械卸械薪懈泄 胁屑褨褋褌',
+    updatedAt: '袨薪芯胁谢械薪芯 ',
+  },
+  changeHistory: {
+    title: '袉褋褌芯褉褨褟 蟹屑褨薪',
+    placeholder: '袙懈 褖械 薪褨褔芯谐芯 薪械 蟹屑褨薪懈谢懈',
+    clearHistory: '袨褔懈褋褌懈褌懈 褨褋褌芯褉褨褞',
+    hint: '袩褨写泻邪蟹泻邪',
+    hintText: '袛褨褩 褉械写邪谐褍胁邪薪薪褟 胁褨写褋褌械卸褍褞褌褜褋褟 胁 褨褋褌芯褉褨褩 蟹屑褨薪, 褟泻邪 蟹斜械褉褨谐邪褦褌褜褋褟 薪邪 胁邪褕芯屑褍 锌褉懈褋褌褉芯褩 锌褉芯褌褟谐芯屑 褑褨褦褩 褋械褋褨褩. 笑褟 褨褋褌芯褉褨褟 斜褍写械 胁懈写邪谢械薪邪 锌褨褋谢褟 胁懈褏芯写褍 蟹 褉械写邪泻褌芯褉邪.',
+    stepBackward_one: '{{count}} 泻褉芯泻 薪邪蟹邪写',
+    stepBackward_other: '{{count}} 泻褉芯泻懈 薪邪蟹邪写',
+    stepForward_one: '{{count}} 泻褉芯泻 胁锌械褉械写',
+    stepForward_other: '{{count}} 泻褉芯泻懈 胁锌械褉械写',
+    sessionStart: '袩芯褔邪褌芯泻 褋械褋褨褩',
+    currentState: '袩芯褌芯褔薪懈泄 褋褌邪薪',
+    nodeTitleChange: '袧邪蟹胁褍 斜谢芯泻褍 蟹屑褨薪械薪芯',
+    nodeDescriptionChange: '袨锌懈褋 斜谢芯泻褍 蟹屑褨薪械薪芯',
+    nodeDragStop: '袘谢芯泻 锌械褉械屑褨褖械薪芯',
+    nodeChange: '袘谢芯泻 蟹屑褨薪械薪芯',
+    nodeConnect: '袘谢芯泻 锌褨写泻谢褞褔械薪芯',
+    nodePaste: '袘谢芯泻 胁褋褌邪胁谢械薪芯',
+    nodeDelete: '袘谢芯泻 胁懈写邪谢械薪芯',
+    nodeAdd: '袘谢芯泻 写芯写邪薪芯',
+    nodeResize: '袪芯蟹屑褨褉 斜谢芯泻褍 蟹屑褨薪械薪芯',
+    noteAdd: '袛芯写邪薪芯 薪芯褌邪褌泻褍',
+    noteChange: '袧芯褌邪褌泻褍 蟹屑褨薪械薪芯',
+    noteDelete: '袧芯褌邪褌泻褍 胁懈写邪谢械薪芯',
+    edgeDelete: '袘谢芯泻 胁褨写泻谢褞褔械薪芯',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 褦 芯斜芯胁\'褟蟹泻芯胁懈屑',
+    authRequired: '袩芯褌褉褨斜薪邪 邪胁褌芯褉懈蟹邪褑褨褟',
+    invalidJson: '{{field}} 褦 薪械写褨泄褋薪懈屑 JSON',
+    fields: {
+      variable: '袧邪蟹胁邪 蟹屑褨薪薪芯褩',
+      variableValue: '袟薪邪褔械薪薪褟 蟹屑褨薪薪芯褩',
+      code: '袣芯写',
+      model: '袦芯写械谢褜',
+      rerankModel: '袦芯写械谢褜 锌芯胁褌芯褉薪芯谐芯 褉邪薪卸褍胁邪薪薪褟',
+      visionVariable: '袟屑褨薪薪邪 蟹芯褉褍',
+    },
+    invalidVariable: '袧械写褨泄褋薪邪 蟹屑褨薪薪邪',
+    rerankModelRequired: '袩械褉械写 褍胁褨屑泻薪械薪薪褟屑 Rerank Model, 斜褍写褜 谢邪褋泻邪, 锌褨写褌胁械褉写褜褌械, 褖芯 屑芯写械谢褜 褍褋锌褨褕薪芯 薪邪谢邪褕褌芯胁邪薪邪 胁 薪邪谢邪褕褌褍胁邪薪薪褟褏.',
+    noValidTool: '{{field}} 薪械 胁懈斜褉邪薪芯 写褨泄褋薪芯谐芯 褨薪褋褌褉褍屑械薪褌褍',
+    toolParameterRequired: '{{field}}: 锌邪褉邪屑械褌褉 [{{param}}] 芯斜芯胁\'褟蟹泻芯胁懈泄',
+  },
+  singleRun: {
+    testRun: '孝械褋褌芯胁懈泄 蟹邪锌褍褋泻',
+    startRun: '袩芯褔邪褌懈 蟹邪锌褍褋泻',
+    running: '袟邪锌褍褖械薪芯',
+    testRunIteration: '袉褌械褉邪褑褨褟 褌械褋褌芯胁芯谐芯 蟹邪锌褍褋泻褍',
+    back: '袧邪蟹邪写',
+    iteration: '袉褌械褉邪褑褨褟',
+    loop: '袩械褌谢褟',
+  },
+  tabs: {
+    'searchBlock': '袩芯褕褍泻 斜谢芯泻褍',
+    'blocks': '袘谢芯泻懈',
+    'tools': '袉薪褋褌褉褍屑械薪褌懈',
+    'allTool': '校褋褨',
+    'builtInTool': '袙斜褍写芯胁邪薪褨',
+    'customTool': '袣芯褉懈褋褌褍胁邪褑褜泻褨',
+    'workflowTool': '袪芯斜芯褔懈泄 锌芯褌褨泻',
+    'question-understand': '袪芯蟹褍屑褨薪薪褟 锌懈褌邪薪褜',
+    'logic': '袥芯谐褨泻邪',
+    'transform': '孝褉邪薪褋褎芯褉屑邪褑褨褟',
+    'utilities': '校褌懈谢褨褌懈',
+    'noResult': '袧褨褔芯谐芯 薪械 蟹薪邪泄写械薪芯',
+    'searchTool': '袉薪褋褌褉褍屑械薪褌 锌芯褕褍泻褍',
+    'plugin': '袩谢邪谐褨薪',
+    'agent': '小褌褉邪褌械谐褨褟 邪谐械薪褌邪',
+  },
+  blocks: {
+    'start': '袩芯褔邪褌芯泻',
+    'end': '袣褨薪械褑褜',
+    'answer': '袙褨写锌芯胁褨写褜',
+    'llm': 'LLM',
+    'knowledge-retrieval': '袨褌褉懈屑邪薪薪褟 蟹薪邪薪褜',
+    'question-classifier': '袣谢邪褋懈褎褨泻邪褌芯褉 锌懈褌邪薪褜',
+    'if-else': '携袣些袨/袉袧袗袣楔袝',
+    'code': '袣芯写',
+    'template-transform': '楔邪斜谢芯薪',
+    'http-request': 'HTTP-蟹邪锌懈褌',
+    'variable-assigner': '袩褉懈褋胁芯褞胁邪褔 蟹屑褨薪薪懈褏',
+    'variable-aggregator': '袗谐褉械谐邪褌芯褉 蟹屑褨薪薪懈褏',
+    'assigner': '袩褉懈蟹薪邪褔褍胁邪褔 蟹屑褨薪薪懈褏',
+    'iteration-start': '袩芯褔邪褌芯泻 褨褌械褉邪褑褨褩',
+    'iteration': '袉褌械褉邪褑褨褟',
+    'parameter-extractor': '袝泻褋褌褉邪泻褌芯褉 锌邪褉邪屑械褌褉褨胁',
+    'document-extractor': '袝泻褋褌褉邪泻褌芯褉 写芯泻褍屑械薪褌褨胁',
+    'list-operator': '袨锌械褉邪褌芯褉 褋锌懈褋泻褍',
+    'agent': '袗谐械薪褌',
+    'loop-start': '袩芯褔邪褌芯泻 褑懈泻谢褍',
+    'loop': '袩械褌谢褟',
+    'loop-end': '袙懈褏褨写 蟹 褑懈泻谢褍',
+  },
+  blocksAbout: {
+    'start': '袙懈蟹薪邪褔褌械 锌芯褔邪褌泻芯胁褨 锌邪褉邪屑械褌褉懈 写谢褟 蟹邪锌褍褋泻褍 褉芯斜芯褔芯谐芯 锌芯褌芯泻褍',
+    'end': '袙懈蟹薪邪褔褌械 泻褨薪械褑褜 褨 褌懈锌 褉械蟹褍谢褜褌邪褌褍 褉芯斜芯褔芯谐芯 锌芯褌芯泻褍',
+    'answer': '袙懈蟹薪邪褔褌械 蟹屑褨褋褌 胁褨写锌芯胁褨写褨 褍 褔邪褌褨',
+    'llm': '袙懈泻谢懈泻 胁械谢懈泻懈褏 屑芯胁薪懈褏 屑芯写械谢械泄 写谢褟 胁褨写锌芯胁褨写褨 薪邪 蟹邪锌懈褌邪薪薪褟 邪斜芯 芯斜褉芯斜泻懈 锌褉懈褉芯写薪芯褩 屑芯胁懈',
+    'knowledge-retrieval': '袛芯蟹胁芯谢褟褦 胁懈泻芯薪褍胁邪褌懈 蟹邪锌懈褌懈 褌械泻褋褌芯胁芯谐芯 胁屑褨褋褌褍, 锌芯胁\'褟蟹邪薪芯谐芯 褨蟹 蟹邪锌懈褌邪薪薪褟屑懈 泻芯褉懈褋褌褍胁邪褔邪, 蟹 斜邪蟹懈 蟹薪邪薪褜',
+    'question-classifier': '袙懈蟹薪邪褔褌械 褍屑芯胁懈 泻谢邪褋懈褎褨泻邪褑褨褩 蟹邪锌懈褌邪薪褜 泻芯褉懈褋褌褍胁邪褔褨胁, LLM 屑芯卸械 胁懈蟹薪邪褔邪褌懈, 褟泻 褉芯蟹胁懈胁邪褦褌褜褋褟 褉芯蟹屑芯胁邪 薪邪 芯褋薪芯胁褨 芯锌懈褋褍 泻谢邪褋懈褎褨泻邪褑褨褩',
+    'if-else': '袛芯蟹胁芯谢褟褦 褉芯蟹写褨谢懈褌懈 褉芯斜芯褔懈泄 锌芯褌褨泻 薪邪 写胁褨 谐褨谢泻懈 薪邪 芯褋薪芯胁褨 褍屑芯胁 if/else',
+    'code': '袙懈泻芯薪邪泄褌械 褎褉邪谐屑械薪褌 泻芯写褍 Python 邪斜芯 NodeJS 写谢褟 褉械邪谢褨蟹邪褑褨褩 泻芯褉懈褋褌褍胁邪褑褜泻芯褩 谢芯谐褨泻懈',
+    'template-transform': '袩械褉械褌胁芯褉褨褌褜 写邪薪褨 薪邪 褉褟写芯泻 蟹邪 写芯锌芯屑芯谐芯褞 褋懈薪褌邪泻褋懈褋褍 褕邪斜谢芯薪褍 Jinja',
+    'http-request': '袛芯蟹胁芯谢褟褦 胁褨写锌褉邪胁谢褟褌懈 褋械褉胁械褉薪褨 蟹邪锌懈褌懈 褔械褉械蟹 锌褉芯褌芯泻芯谢 HTTP',
+    'variable-assigner': '袗谐褉械谐褍褦 蟹屑褨薪薪褨 蟹 泻褨谢褜泻芯褏 谐褨谢芯泻 褍 芯写薪褍 蟹屑褨薪薪褍 写谢褟 褍薪褨褎褨泻芯胁邪薪芯褩 泻芯薪褎褨谐褍褉邪褑褨褩 泻褨薪褑械胁懈褏 胁褍蟹谢褨胁.',
+    'assigner': '袙褍蟹芯谢 锌褉懈蟹薪邪褔械薪薪褟 蟹屑褨薪薪懈褏 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 锌褉懈褋胁芯褦薪薪褟 蟹薪邪褔械薪褜 蟹邪锌懈褋褍胁邪薪懈屑 蟹屑褨薪薪懈屑 (褌邪泻懈屑 褟泻 蟹屑褨薪薪褨 褉芯蟹屑芯胁懈).',
+    'variable-aggregator': '袗谐褉械谐褍褦 蟹屑褨薪薪褨 蟹 泻褨谢褜泻芯褏 谐褨谢芯泻 褍 芯写薪褍 蟹屑褨薪薪褍 写谢褟 褍薪褨褎褨泻芯胁邪薪芯褩 泻芯薪褎褨谐褍褉邪褑褨褩 泻褨薪褑械胁懈褏 胁褍蟹谢褨胁.',
+    'iteration': '袙懈泻芯薪褍胁邪褌懈 泻褨谢褜泻邪 泻褉芯泻褨胁 薪邪 芯斜\'褦泻褌褨 褋锌懈褋泻褍, 锌芯泻懈 薪械 斜褍写械 胁懈胁械写械薪芯 胁褋褨 褉械蟹褍谢褜褌邪褌懈.',
+    'parameter-extractor': '袙懈泻芯褉懈褋褌芯胁褍泄褌械 LLM 写谢褟 胁懈谢褍褔械薪薪褟 褋褌褉褍泻褌褍褉芯胁邪薪懈褏 锌邪褉邪屑械褌褉褨胁 蟹 锌褉懈褉芯写薪芯褩 屑芯胁懈 写谢褟 胁懈泻谢懈泻褨胁 褨薪褋褌褉褍屑械薪褌褨胁 邪斜芯 HTTP-蟹邪锌懈褌褨胁.',
+    'document-extractor': '袙懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 邪薪邪谢褨蟹褍 蟹邪胁邪薪褌邪卸械薪懈褏 写芯泻褍屑械薪褌褨胁 褍 褌械泻褋褌芯胁懈泄 泻芯薪褌械薪褌, 褟泻懈泄 谢械谐泻芯 蟹褉芯蟹褍屑褨谢懈泄 LLM.',
+    'list-operator': '袙懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 褎褨谢褜褌褉邪褑褨褩 邪斜芯 褋芯褉褌褍胁邪薪薪褟 胁屑褨褋褌褍 屑邪褋懈胁褍.',
+    'agent': '袙懈泻谢懈泻 胁械谢懈泻懈褏 屑芯胁薪懈褏 屑芯写械谢械泄 写谢褟 胁褨写锌芯胁褨写械泄 薪邪 蟹邪锌懈褌邪薪薪褟 邪斜芯 芯斜褉芯斜泻懈 锌褉懈褉芯写薪芯褩 屑芯胁懈',
+    'loop': '袙懈泻芯薪褍泄褌械 褑懈泻谢 谢芯谐褨泻懈, 锌芯泻懈 薪械 斜褍写械 胁懈泻芯薪邪薪芯 褍屑芯胁褍 蟹邪胁械褉褕械薪薪褟 邪斜芯 写芯褋褟谐薪褍褌芯 屑邪泻褋懈屑邪谢褜薪褍 泻褨谢褜泻褨褋褌褜 褨褌械褉邪褑褨泄.',
+    'loop-end': '袝泻胁褨胁邪谢械薪褌薪芯 "锌械褉械褉胁褨". 笑械泄 胁褍蟹芯谢 薪械 屑邪褦 械谢械屑械薪褌褨胁 泻芯薪褎褨谐褍褉邪褑褨褩. 袣芯谢懈 褌褨谢芯 褑懈泻谢褍 写芯褋褟谐邪褦 褑褜芯谐芯 胁褍蟹谢邪, 褑懈泻谢 蟹邪胁械褉褕褍褦褌褜褋褟.',
+  },
+  operator: {
+    zoomIn: '袟斜褨谢褜褕懈褌懈',
+    zoomOut: '袟屑械薪褕懈褌懈',
+    zoomTo50: '袟斜褨谢褜褕懈褌懈 写芯 50%',
+    zoomTo100: '袟斜褨谢褜褕懈褌懈 写芯 100%',
+    zoomToFit: '袟斜褨谢褜褕懈褌懈 写谢褟 锌褨写谐芯薪泻懈',
+  },
+  panel: {
+    userInputField: '袩芯谢械 胁胁械写械薪薪褟 泻芯褉懈褋褌褍胁邪褔邪',
+    changeBlock: '袟屑褨薪懈褌懈 斜谢芯泻',
+    helpLink: '袩芯褋懈谢邪薪薪褟 薪邪 写芯锌芯屑芯谐褍',
+    about: '袩褉芯',
+    createdBy: '小褌胁芯褉械薪芯 ',
+    nextStep: '袧邪褋褌褍锌薪懈泄 泻褉芯泻',
+    addNextStep: '袛芯写邪褌懈 薪邪褋褌褍锌薪懈泄 斜谢芯泻 褍 褑械泄 褉芯斜芯褔懈泄 锌芯褌褨泻',
+    selectNextStep: '袙懈斜褉邪褌懈 薪邪褋褌褍锌薪懈泄 斜谢芯泻',
+    runThisStep: '袟邪锌褍褋褌懈褌懈 褑械泄 泻褉芯泻',
+    checklist: '袣芯薪褌褉芯谢褜薪懈泄 褋锌懈褋芯泻',
+    checklistTip: '袩械褉械泻芯薪邪泄褌械褋褟, 褖芯 胁褋褨 锌褉芯斜谢械屑懈 胁懈褉褨褕械薪褨 锌械褉械写 锌褍斜谢褨泻邪褑褨褦褞',
+    checklistResolved: '袙褋褨 锌褉芯斜谢械屑懈 胁懈褉褨褕械薪褨',
+    organizeBlocks: '袨褉谐邪薪褨蟹褍胁邪褌懈 斜谢芯泻懈',
+    change: '袟屑褨薪懈褌懈',
+    optional: '(薪械芯斜芯胁\'褟蟹泻芯胁芯)',
+  },
+  nodes: {
+    common: {
+      outputVars: '袟屑褨薪薪褨 胁懈褏芯写褍',
+      insertVarTip: '袙褋褌邪胁懈褌懈 蟹屑褨薪薪褍',
+      memory: {
+        memory: '袩邪屑\'褟褌褜',
+        memoryTip: '袧邪谢邪褕褌褍胁邪薪薪褟 锌邪屑\'褟褌褨 褔邪褌褍',
+        windowSize: '袪芯蟹屑褨褉 胁褨泻薪邪',
+        conversationRoleName: '袧邪蟹胁邪 褉芯谢褨 褍 褉芯蟹屑芯胁褨',
+        user: '袩褉械褎褨泻褋 泻芯褉懈褋褌褍胁邪褔邪',
+        assistant: '袩褉械褎褨泻褋 锌芯屑褨褔薪懈泻邪',
+      },
+      memories: {
+        title: '小锌芯谐邪写懈',
+        tip: '袩邪屑\'褟褌褜 褔邪褌褍',
+        builtIn: '袙斜褍写芯胁邪薪芯',
+      },
+      errorHandle: {
+        none: {
+          title: '袧褨褏褌芯',
+          desc: '袙褍蟹芯谢 锌褉懈锌懈薪懈褌褜 褉芯斜芯褌褍, 褟泻褖芯 胁懈薪懈泻薪械 胁懈薪褟褌芯泻 褨 薪械 斜褍写械 芯斜褉芯斜谢械薪懈泄',
+        },
+        defaultValue: {
+          title: '袟薪邪褔械薪薪褟 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑',
+          desc: '袩褉懈 胁懈薪懈泻薪械薪薪褨 锌芯屑懈谢泻懈 胁泻邪卸褨褌褜 褋褌邪褌懈褔薪懈泄 胁屑褨褋褌 胁懈胁芯写褍.',
+          tip: '校 褉邪蟹褨 锌芯屑懈谢泻懈 锌芯胁械褉薪械 薪懈卸褔械 蟹薪邪褔械薪薪褟.',
+          output: '袙懈胁械褋褌懈 蟹薪邪褔械薪薪褟 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑',
+          inLog: '袙懈薪褟褌芯泻 胁褍蟹谢邪, 褖芯 胁懈胁芯写懈褌褜 胁褨写锌芯胁褨写薪芯 写芯 蟹薪邪褔械薪褜 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑.',
+        },
+        failBranch: {
+          desc: '袣芯谢懈 胁懈薪懈泻邪褦 锌芯屑懈谢泻邪, 胁褨薪 胁懈泻芯薪邪褦 谐褨谢泻褍 胁懈薪褟褌泻褍',
+          customize: '袩械褉械泄写褨褌褜 写芯 锌芯谢芯褌薪邪, 褖芯斜 薪邪谢邪褕褌褍胁邪褌懈 谢芯谐褨泻褍 fail branch.',
+          inLog: '袙懈薪褟褌芯泻 胁褍蟹谢邪, 邪胁褌芯屑邪褌懈褔薪芯 胁懈泻芯薪邪褦 谐褨谢泻褍 fail. 袙懈褏褨写薪褨 写邪薪褨 胁褍蟹谢邪 锌芯胁械褉薪褍褌褜 褌懈锌 锌芯屑懈谢泻懈 褌邪 锌芯胁褨写芯屑谢械薪薪褟 锌褉芯 锌芯屑懈谢泻褍 褌邪 锌械褉械写邪写褍褌褜 褩褏 写芯 薪懈蟹褏褨写薪芯谐芯 锌芯褌芯泻褍.',
+          title: '袚褨谢泻邪 薪械胁写邪褔褨',
+          customizeTip: '袣芯谢懈 谐褨谢泻邪 fail 邪泻褌懈胁芯胁邪薪邪, 胁懈薪褟褌泻懈, 胁懈泻谢懈泻邪薪褨 胁褍蟹谢邪屑懈, 薪械 蟹邪胁械褉褕邪褌褜 锌褉芯褑械褋. 袟邪屑褨褋褌褜 褑褜芯谐芯 胁褨薪 邪胁褌芯屑邪褌懈褔薪芯 胁懈泻芯薪邪褦 锌芯锌械褉械写薪褜芯 胁懈蟹薪邪褔械薪褍 谐褨谢泻褍 锌芯屑懈谢泻懈, 写芯蟹胁芯谢褟褞褔懈 胁邪屑 谐薪褍褔泻芯 薪邪写邪胁邪褌懈 锌芯胁褨写芯屑谢械薪薪褟 锌褉芯 锌芯屑懈谢泻懈, 蟹胁褨褌懈, 胁懈锌褉邪胁谢械薪薪褟 邪斜芯 锌褉芯锌褍褋泻邪褌懈 写褨褩.',
+        },
+        partialSucceeded: {
+          tip: '校 锌褉芯褑械褋褨 褦 胁褍蟹谢懈 {{num}}, 褟泻褨 锌褉邪褑褞褞褌褜 薪械薪芯褉屑邪谢褜薪芯, 斜褍写褜 谢邪褋泻邪, 锌械褉械泄写褨褌褜 写芯 褌褉邪褋褍胁邪薪薪褟, 褖芯斜 锌械褉械胁褨褉懈褌懈 谢芯谐懈.',
+        },
+        title: '袨斜褉芯斜泻邪 锌芯屑懈谢芯泻',
+        tip: '小褌褉邪褌械谐褨褟 芯斜褉芯斜泻懈 胁懈薪褟褌泻褨胁, 褖芯 褋锌褉邪褑褜芯胁褍褦, 泻芯谢懈 胁褍蟹芯谢 褋褌懈泻邪褦褌褜褋褟 蟹 胁懈薪褟褌泻芯屑.',
+      },
+      retry: {
+        retry: '袩芯胁褌芯褉懈褌懈',
+        retryOnFailure: '锌芯胁褌芯褉懈褌懈 褋锌褉芯斜褍 胁 褉邪蟹褨 薪械胁写邪褔褨',
+        retryInterval: '袉薪褌械褉胁邪谢 锌芯胁褌芯褉薪懈褏 褋锌褉芯斜',
+        retrying: '小锌褉芯斜懈...',
+        retryFailed: '袩芯胁褌芯褉薪邪 褋锌褉芯斜邪 薪械 胁写邪谢邪褋褟',
+        times: '袪邪蟹褨胁',
+        ms: '袦小',
+        retries: '{{num}} 小锌褉芯斜',
+        maxRetries: '袦邪泻褋懈屑邪谢褜薪邪 泻褨谢褜泻褨褋褌褜 锌芯胁褌芯褉薪懈褏 褋锌褉芯斜',
+        retrySuccessful: '袩芯胁褌芯褉薪邪 褋锌褉芯斜邪 褍褋锌褨褕薪邪',
+        retryFailedTimes: '{{times}} 锌芯胁褌芯褉薪褨 褋锌褉芯斜懈 薪械 胁写邪谢懈褋褟',
+        retryTimes: '袩芯胁褌芯褉褨褌褜 褋锌褉芯斜褍 {{times}} 褍 褉邪蟹褨 薪械胁写邪褔褨',
+      },
+    },
+    start: {
+      required: '芯斜芯胁\'褟蟹泻芯胁懈泄',
+      inputField: '袩芯谢械 胁胁械写械薪薪褟',
+      builtInVar: '袙斜褍写芯胁邪薪褨 蟹屑褨薪薪褨',
+      outputVars: {
+        query: '袙胁械写械薪薪褟 泻芯褉懈褋褌褍胁邪褔邪',
+        memories: {
+          des: '袉褋褌芯褉褨褟 褉芯蟹屑芯胁',
+          type: '褌懈锌 锌芯胁褨写芯屑谢械薪薪褟',
+          content: '胁屑褨褋褌 锌芯胁褨写芯屑谢械薪薪褟',
+        },
+        files: '小锌懈褋芯泻 褎邪泄谢褨胁',
+      },
+      noVarTip: '袙褋褌邪薪芯胁褨褌褜 胁褏褨写薪褨 写邪薪褨, 褟泻褨 屑芯卸褍褌褜 斜褍褌懈 胁懈泻芯褉懈褋褌邪薪褨 褍 褉芯斜芯褔芯屑褍 锌芯褌芯褑褨',
+    },
+    end: {
+      outputs: '袙懈褏芯写懈',
+      output: {
+        type: '褌懈锌 胁懈褏芯写褍',
+        variable: '蟹屑褨薪薪邪 胁懈褏芯写褍',
+      },
+      type: {
+        'none': '袧械屑邪褦',
+        'plain-text': '袩褉芯褋褌懈泄 褌械泻褋褌',
+        'structured': '小褌褉褍泻褌褍褉芯胁邪薪懈泄',
+      },
+    },
+    answer: {
+      answer: '袙褨写锌芯胁褨写褜',
+      outputVars: '袟屑褨薪薪褨 胁懈褏芯写褍',
+    },
+    llm: {
+      model: '屑芯写械谢褜',
+      variables: '蟹屑褨薪薪褨',
+      context: '泻芯薪褌械泻褋褌',
+      contextTooltip: '袙懈 屑芯卸械褌械 褨屑锌芯褉褌褍胁邪褌懈 蟹薪邪薪薪褟 褟泻 泻芯薪褌械泻褋褌',
+      notSetContextInPromptTip: '些芯斜 褍胁褨屑泻薪褍褌懈 褎褍薪泻褑褨褞 泻芯薪褌械泻褋褌褍, 蟹邪锌芯胁薪褨褌褜 蟹屑褨薪薪褍 泻芯薪褌械泻褋褌褍 胁 PROMPT.',
+      prompt: 'prompt',
+      roleDescription: {
+        system: '袛邪泄褌械 胁懈褋芯泻芯褉褨胁薪械胁褨 褨薪褋褌褉褍泻褑褨褩 写谢褟 褉芯蟹屑芯胁懈',
+        user: '袧邪写邪泄褌械 褨薪褋褌褉褍泻褑褨褩, 蟹邪锌懈褌懈 邪斜芯 斜褍写褜-褟泻懈泄 褌械泻褋褌芯胁懈泄 胁褏褨写 写谢褟 屑芯写械谢褨',
+        assistant: '袙褨写锌芯胁褨写褨 屑芯写械谢褨 薪邪 芯褋薪芯胁褨 锌芯胁褨写芯屑谢械薪褜 泻芯褉懈褋褌褍胁邪褔邪',
+      },
+      addMessage: '袛芯写邪褌懈 锌芯胁褨写芯屑谢械薪薪褟',
+      vision: '斜邪褔械薪薪褟',
+      files: '肖邪泄谢懈',
+      resolution: {
+        name: '袪芯蟹写褨谢褜薪邪 蟹写邪褌薪褨褋褌褜',
+        high: '袙懈褋芯泻邪',
+        low: '袧懈蟹褜泻邪',
+      },
+      outputVars: {
+        output: '袚械薪械褉芯胁邪薪懈泄 胁屑褨褋褌',
+        usage: '袉薪褎芯褉屑邪褑褨褟 锌褉芯 胁懈泻芯褉懈褋褌邪薪薪褟 屑芯写械谢褨',
+      },
+      singleRun: {
+        variable: '袟屑褨薪薪邪',
+      },
+      sysQueryInUser: 'sys.query 褍 锌芯胁褨写芯屑谢械薪薪褨 泻芯褉懈褋褌褍胁邪褔邪 褦 芯斜芯胁\'褟蟹泻芯胁懈屑',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: '袘褍写褜 谢邪褋泻邪, 蟹邪胁械褉褕褨褌褜 褉械写邪谐褍胁邪薪薪褟 锌芯褌芯褔薪芯谐芯 锌芯谢褟 锌械褉械写 蟹斜械褉械卸械薪薪褟屑 褋褏械屑褘.',
+        },
+        import: '袉屑锌芯褉褌 蟹 JSON',
+        instruction: '袉薪褋褌褉褍泻褑褨褟',
+        descriptionPlaceholder: '袛芯写邪褌懈 芯锌懈褋',
+        addField: '袛芯写邪褌懈 锌芯谢械',
+        promptTooltip: '袩械褉械褌胁芯褉褨褌褜 褌械泻褋褌芯胁懈泄 芯锌懈褋 褍 褋褌邪薪写邪褉褌懈蟹芯胁邪薪褍 褋褌褉褍泻褌褍褉褍 JSON Schema.',
+        resultTip: '袨褋褜 蟹谐械薪械褉芯胁邪薪懈泄 褉械蟹褍谢褜褌邪褌. 携泻褖芯 胁邪褋 薪械 胁谢邪褕褌芯胁褍褦, 胁懈 屑芯卸械褌械 锌芯胁械褉薪褍褌懈褋褟 薪邪蟹邪写 褨 蟹屑褨薪懈褌懈 褋胁褨泄 蟹邪锌懈褌.',
+        promptPlaceholder: '袨锌懈褕褨褌褜 胁邪褕褍 褋褏械屑褍 JSON...',
+        generating: '袚械薪械褉邪褑褨褟 JSON-褋褏械屑懈...',
+        back: '袧邪蟹邪写',
+        generatedResult: '袟谐械薪械褉芯胁邪薪懈泄 褉械蟹褍谢褜褌邪褌',
+        fieldNamePlaceholder: '袧邪蟹胁邪 锌芯谢褟',
+        addChildField: '袛芯写邪褌懈 锌芯谢械 写懈褌懈薪懈',
+        apply: '袟邪褋褌芯褋褍胁邪褌懈',
+        regenerate: '袩械褉械谐械薪械褉褍胁邪褌懈',
+        resetDefaults: '小泻懈薪褍褌懈',
+        generateJsonSchema: '袟谐械薪械褉褍胁邪褌懈 JSON 小褏械屑褍',
+        showAdvancedOptions: '袩芯泻邪蟹邪褌懈 褉芯蟹褕懈褉械薪褨 薪邪谢邪褕褌褍胁邪薪薪褟',
+        required: '薪械芯斜褏褨写薪芯',
+        generationTip: '袙懈 屑芯卸械褌械 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 锌褉懈褉芯写薪褍 屑芯胁褍, 褖芯斜 褕胁懈写泻芯 褋褌胁芯褉懈褌懈 JSON-褋褏械屑褍.',
+        stringValidations: '袙邪谢褨写薪褨褋褌褜 褉褟写泻褨胁',
+        generate: '袚械薪械褉褍胁邪褌懈',
+        title: '小褌褉褍泻褌褍褉芯胁邪薪邪 褋褏械屑邪 胁懈褏芯写褍',
+        doc: '袛褨蟹薪邪泄褌械褋褟 斜褨谢褜褕械 锌褉芯 褋褌褉褍泻褌褍褉芯胁邪薪懈泄 胁懈褏褨写',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: '袟屑褨薪薪邪 蟹邪锌懈褌褍',
+      knowledge: '袟薪邪薪薪褟',
+      outputVars: {
+        output: '袙褨写薪芯胁谢械薪褨 褋械谐屑械薪褌芯胁邪薪褨 写邪薪褨',
+        content: '小械谐屑械薪褌芯胁邪薪懈泄 胁屑褨褋褌',
+        title: '小械谐屑械薪褌芯胁邪薪懈泄 蟹邪谐芯谢芯胁芯泻',
+        icon: '小械谐屑械薪褌芯胁邪薪邪 锌褨泻褌芯谐褉邪屑邪',
+        url: '小械谐屑械薪褌芯胁邪薪邪 URL',
+        metadata: '袉薪褕褨 屑械褌邪写邪薪褨',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            title: '袙懈屑泻薪械薪芯',
+            subTitle: '袧械 胁泻谢褞褔邪褞褔懈 褎褨谢褜褌褉邪褑褨褞 屑械褌邪写邪薪懈褏',
+          },
+          automatic: {
+            title: '袗胁褌芯屑邪褌懈褔薪懈泄',
+            subTitle: '袗胁褌芯屑邪褌懈褔薪芯 谐械薪械褉褍胁邪褌懈 褍屑芯胁懈 褎褨谢褜褌褉邪褑褨褩 屑械褌邪写邪薪懈褏 薪邪 芯褋薪芯胁褨 蟹邪锌懈褌褍 泻芯褉懈褋褌褍胁邪褔邪.',
+            desc: '袗胁褌芯屑邪褌懈褔薪芯 谐械薪械褉褍胁邪褌懈 褍屑芯胁懈 褎褨谢褜褌褉邪褑褨褩 屑械褌邪写邪薪懈褏 薪邪 芯褋薪芯胁褨 蟹屑褨薪薪芯褩 蟹邪锌懈褌褍.',
+          },
+          manual: {
+            subTitle: '袙褉褍褔薪褍 写芯写邪泄褌械 褍屑芯胁懈 褎褨谢褜褌褉邪褑褨褩 屑械褌邪写邪薪懈褏',
+            title: '袩芯褋褨斜薪懈泻',
+          },
+        },
+        panel: {
+          search: '袩芯褕褍泻芯胁邪 屑械褌邪褨薪褎芯褉屑邪褑褨褟',
+          datePlaceholder: '袙懈斜械褉褨褌褜 褔邪褋...',
+          title: '校屑芯胁懈 褎褨谢褜褌褉邪褑褨褩 屑械褌邪写邪薪懈褏',
+          placeholder: '袙胁械写褨褌褜 蟹薪邪褔械薪薪褟',
+          conditions: '校屑芯胁懈',
+          select: '袙懈斜械褉褨褌褜 蟹屑褨薪薪褍...',
+          add: '袛芯写邪褌懈 褍屑芯胁褍',
+        },
+        title: '肖褨谢褜褌褉邪褑褨褟 屑械褌邪写邪薪懈褏',
+      },
+    },
+    http: {
+      inputVars: '袙褏褨写薪褨 蟹屑褨薪薪褨',
+      api: 'API',
+      apiPlaceholder: '袙胁械写褨褌褜 URL, 胁胁械写褨褌褜 鈥�/鈥�, 褖芯斜 胁褋褌邪胁懈褌懈 蟹屑褨薪薪褍',
+      notStartWithHttp: 'API 屑邪褦 锌芯褔懈薪邪褌懈褋褟 蟹 http:// 邪斜芯 https://',
+      key: '袣谢褞褔',
+      value: '袟薪邪褔械薪薪褟',
+      bulkEdit: '袦邪褋芯胁械 褉械写邪谐褍胁邪薪薪褟',
+      keyValueEdit: '袪械写邪谐褍胁邪薪薪褟 泻谢褞褔-蟹薪邪褔械薪薪褟',
+      headers: '袟邪谐芯谢芯胁泻懈',
+      params: '袩邪褉邪屑械褌褉懈',
+      body: '孝褨谢芯',
+      outputVars: {
+        body: '袟屑褨褋褌 胁褨写锌芯胁褨写褨',
+        statusCode: '袣芯写 褋褌邪薪褍 胁褨写锌芯胁褨写褨',
+        headers: '小锌懈褋芯泻 蟹邪谐芯谢芯胁泻褨胁 胁褨写锌芯胁褨写褨 褍 褎芯褉屑邪褌褨 JSON',
+        files: '小锌懈褋芯泻 褎邪泄谢褨胁',
+      },
+      authorization: {
+        'authorization': '袗胁褌芯褉懈蟹邪褑褨褟',
+        'authorizationType': '孝懈锌 邪胁褌芯褉懈蟹邪褑褨褩',
+        'no-auth': '袧械屑邪褦',
+        'api-key': 'API-泻谢褞褔',
+        'auth-type': '孝懈锌 邪褍褌械薪褌懈褎褨泻邪褑褨褩',
+        'basic': '袘邪蟹芯胁懈泄',
+        'bearer': 'Bearer',
+        'custom': '袣芯褉懈褋褌褍胁邪褑褜泻懈泄',
+        'api-key-title': 'API-泻谢褞褔',
+        'header': '袟邪谐芯谢芯胁芯泻',
+      },
+      insertVarPlaceholder: '胁胁械写褨褌褜 \'/\', 褖芯斜 胁褋褌邪胁懈褌懈 蟹屑褨薪薪褍',
+      timeout: {
+        title: '孝邪泄屑-邪褍褌',
+        connectLabel: '孝邪泄屑-邪褍褌 锌褨写泻谢褞褔械薪薪褟',
+        connectPlaceholder: '袙胁械写褨褌褜 褌邪泄屑-邪褍褌 锌褨写泻谢褞褔械薪薪褟 胁 褋械泻褍薪写邪褏',
+        readLabel: '孝邪泄屑-邪褍褌 褔懈褌邪薪薪褟',
+        readPlaceholder: '袙胁械写褨褌褜 褌邪泄屑-邪褍褌 褔懈褌邪薪薪褟 胁 褋械泻褍薪写邪褏',
+        writeLabel: '孝邪泄屑-邪褍褌 蟹邪锌懈褋褍',
+        writePlaceholder: '袙胁械写褨褌褜 褌邪泄屑-邪褍褌 蟹邪锌懈褋褍 胁 褋械泻褍薪写邪褏',
+      },
+      type: '孝懈锌',
+      binaryFileVariable: '袟屑褨薪薪邪 写胁褨泄泻芯胁芯谐芯 褎邪泄谢褍',
+      extractListPlaceholder: '袙胁械写褨褌褜 褨薪写械泻褋 械谢械屑械薪褌邪 褋锌懈褋泻褍, 胁胁械写褨褌褜 \'/\' 胁褋褌邪胁懈褌懈 蟹屑褨薪薪褍',
+      curl: {
+        title: '袉屑锌芯褉褌 蟹 cURL',
+        placeholder: '袙褋褌邪胁褌械 褋褞写懈 褉褟写芯泻 cURL',
+      },
+    },
+    code: {
+      inputVars: '袙褏褨写薪褨 蟹屑褨薪薪褨',
+      outputVars: '袟屑褨薪薪褨 胁懈褏芯写褍',
+      advancedDependencies: '袪芯蟹褕懈褉械薪褨 蟹邪谢械卸薪芯褋褌褨',
+      advancedDependenciesTip: '袛芯写邪泄褌械 褌褍褌 写械褟泻褨 锌芯锌械褉械写薪褜芯 蟹邪胁邪薪褌邪卸械薪褨 蟹邪谢械卸薪芯褋褌褨, 褟泻褨 锌芯褌褉械斜褍褞褌褜 斜褨谢褜褕械 褔邪褋褍 写谢褟 褋锌芯卸懈胁邪薪薪褟 邪斜芯 薪械 褦 蟹邪 蟹邪屑芯胁褔褍胁邪薪薪褟屑 胁斜褍写芯胁邪薪懈屑懈',
+      searchDependencies: '楔褍泻邪褌懈 蟹邪谢械卸薪芯褋褌褨',
+    },
+    templateTransform: {
+      inputVars: '袙褏褨写薪褨 蟹屑褨薪薪褨',
+      code: '袣芯写',
+      codeSupportTip: '袩褨写褌褉懈屑褍褦 谢懈褕械 Jinja2',
+      outputVars: {
+        output: '孝褉邪薪褋褎芯褉屑芯胁邪薪懈泄 胁屑褨褋褌',
+      },
+    },
+    ifElse: {
+      if: '携泻褖芯',
+      else: '袉薪邪泻褕械',
+      elseDescription: '袙懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 胁懈蟹薪邪褔械薪薪褟 谢芯谐褨泻懈, 褟泻邪 屑邪褦 斜褍褌懈 胁懈泻芯薪邪薪邪, 泻芯谢懈 褍屑芯胁邪 if 薪械 胁懈泻芯薪邪薪邪.',
+      and: '褨',
+      or: '邪斜芯',
+      operator: '袨锌械褉邪褌芯褉',
+      notSetVariable: '袘褍写褜 谢邪褋泻邪, 褋锌芯褔邪褌泻褍 胁褋褌邪薪芯胁褨褌褜 蟹屑褨薪薪褍',
+      comparisonOperator: {
+        'contains': '屑褨褋褌懈褌褜',
+        'not contains': '薪械 屑褨褋褌懈褌褜',
+        'start with': '锌芯褔懈薪邪褦褌褜褋褟 蟹',
+        'end with': '蟹邪泻褨薪褔褍褦褌褜褋褟 薪邪',
+        'is': '褦',
+        'is not': '薪械 褦',
+        'empty': '锌芯褉芯卸薪褨泄',
+        'not empty': '薪械 锌芯褉芯卸薪褨泄',
+        'null': '褦 null',
+        'not null': '薪械 褦 null',
+        'regex match': '袪械谐褍谢褟褉薪懈泄 胁懈褉邪蟹 蟹斜褨谐褍',
+        'in': '袙',
+        'all of': '袙褋褨 蟹',
+        'exists': '袉褋薪褍褦',
+        'not exists': '薪械 褨褋薪褍褦',
+        'not in': '袧械 胁',
+        'after': '锌褨褋谢褟',
+        'before': '褉邪薪褨褕械',
+      },
+      enterValue: '袙胁械写褨褌褜 蟹薪邪褔械薪薪褟',
+      addCondition: '袛芯写邪褌懈 褍屑芯胁褍',
+      conditionNotSetup: '校屑芯胁邪 袧袝 薪邪谢邪褕褌芯胁邪薪邪',
+      selectVariable: '袙懈斜械褉褨褌褜 蟹屑褨薪薪褍...',
+      optionName: {
+        audio: '袗褍写褨芯',
+        doc: '袛芯泻',
+        video: '袙褨写械芯',
+        localUpload: '袥芯泻邪谢褜薪械 蟹邪胁邪薪褌邪卸械薪薪褟',
+        image: '袨斜褉邪蟹',
+        url: 'URL-邪写褉械褋邪',
+      },
+      select: '袙懈斜械褉褨褌褜',
+      addSubVariable: '袩褨写蟹屑褨薪薪邪',
+      condition: '校屑芯胁邪',
+    },
+    variableAssigner: {
+      title: '袩褉懈褋胁芯褦薪薪褟 蟹屑褨薪薪懈褏',
+      outputType: '孝懈锌 胁懈褏芯写褍',
+      varNotSet: '袟屑褨薪薪邪 薪械 胁褋褌邪薪芯胁谢械薪邪',
+      noVarTip: '袛芯写邪泄褌械 蟹屑褨薪薪褨 写谢褟 锌褉懈褋胁芯褦薪薪褟',
+      type: {
+        string: '袪褟写芯泻',
+        number: '效懈褋谢芯',
+        object: '袨斜\'褦泻褌',
+        array: '袦邪褋懈胁',
+      },
+      aggregationGroup: '袚褉褍锌邪 邪谐褉械谐邪褑褨褩',
+      aggregationGroupTip: '校胁褨屑泻薪械薪薪褟 褑褨褦褩 褎褍薪泻褑褨褩 写芯蟹胁芯谢褟褦 邪谐褉械谐邪褌芯褉褍 蟹屑褨薪薪懈褏 邪谐褉械谐褍胁邪褌懈 泻褨谢褜泻邪 薪邪斜芯褉褨胁 蟹屑褨薪薪懈褏.',
+      addGroup: '袛芯写邪褌懈 谐褉褍锌褍',
+      outputVars: {
+        varDescribe: '袙懈褏褨写 {{groupName}}',
+      },
+      setAssignVariable: '袙褋褌邪薪芯胁懈褌懈 蟹屑褨薪薪褍 锌褉懈褋胁芯褦薪薪褟',
+    },
+    assigner: {
+      'assignedVariable': '袩褉懈蟹薪邪褔械薪邪 袟屑褨薪薪邪',
+      'writeMode': '袪械卸懈屑 袟邪锌懈褋褍',
+      'writeModeTip': '袣芯谢懈 袩袪袠袟袧袗效袝袧袗 袟袦袉袧袧袗 褦 屑邪褋懈胁芯屑, 褉械卸懈屑 写芯写邪胁邪薪薪褟 写芯写邪褦 胁 泻褨薪械褑褜.',
+      'over-write': '袩械褉械蟹邪锌懈褋邪褌懈',
+      'append': '袛芯写邪褌懈',
+      'plus': '袩谢褞褋',
+      'clear': '袨褔懈褋褌懈褌懈',
+      'setVariable': '袙褋褌邪薪芯胁懈褌懈 袟屑褨薪薪褍',
+      'variable': '袟屑褨薪薪邪',
+      'operations': {
+        'clear': '携褋薪懈泄',
+        'set': '袙褋褌邪薪芯胁懈褌懈',
+        'title': '袨锌械褉邪褑褨褟',
+        'append': '袛芯写邪褌懈',
+        '-=': '-=',
+        'over-write': '袩械褉械蟹邪锌懈褋邪褌懈',
+        'overwrite': '袩械褉械蟹邪锌懈褋邪褌懈',
+        '/=': '/=',
+        '+=': '+=',
+        '*=': '*=',
+        'extend': '袪芯蟹褕懈褉懈褌懈',
+        'remove-last': '袙懈写邪谢懈褌懈 芯褋褌邪薪薪褦',
+        'remove-first': '袙懈写邪谢懈褌懈 锌械褉褕懈泄',
+      },
+      'selectAssignedVariable': '袙懈斜械褉褨褌褜 锌褉懈蟹薪邪褔械薪褍 蟹屑褨薪薪褍...',
+      'noAssignedVars': '袧械屑邪褦 写芯褋褌褍锌薪懈褏 锌褉懈蟹薪邪褔械薪懈褏 蟹屑褨薪薪懈褏',
+      'noVarTip': '袧邪褌懈褋薪褨褌褜 泻薪芯锌泻褍 芦+禄, 褖芯斜 写芯写邪褌懈 蟹屑褨薪薪褨',
+      'assignedVarsDescription': '袩褉懈蟹薪邪褔械薪褨 蟹屑褨薪薪褨 屑邪褞褌褜 斜褍褌懈 写芯褋褌褍锌薪懈屑懈 写谢褟 蟹邪锌懈褋褍, 褌邪泻懈屑懈 褟泻 蟹屑褨薪薪褨 褉芯蟹屑芯胁懈.',
+      'variables': '袟屑褨薪薪褨',
+      'varNotSet': '袟屑褨薪薪邪 袧袝 胁褋褌邪薪芯胁谢械薪邪',
+      'setParameter': '袙褋褌邪薪芯胁懈褌懈 锌邪褉邪屑械褌褉...',
+    },
+    tool: {
+      toAuthorize: '袗胁褌芯褉懈蟹褍胁邪褌懈',
+      inputVars: '袙褏褨写薪褨 蟹屑褨薪薪褨',
+      outputVars: {
+        text: '谐械薪械褉芯胁邪薪懈泄 胁屑褨褋褌 褨薪褋褌褉褍屑械薪褌褍',
+        files: {
+          title: '褎邪泄谢懈, 谐械薪械褉芯胁邪薪褨 褨薪褋褌褉褍屑械薪褌芯屑',
+          type: '孝懈锌 锌褨写褌褉懈屑泻懈. 袧邪褉邪蟹褨 锌褨写褌褉懈屑褍褞褌褜褋褟 谢懈褕械 蟹芯斜褉邪卸械薪薪褟',
+          transfer_method: '袦械褌芯写 锌械褉械写邪褔褨. 袟薪邪褔械薪薪褟 - remote_url 邪斜芯 local_file',
+          url: 'URL 蟹芯斜褉邪卸械薪薪褟',
+          upload_file_id: 'ID 蟹邪胁邪薪褌邪卸械薪芯谐芯 褎邪泄谢褍',
+        },
+        json: 'JSON, 蟹谐械薪械褉芯胁邪薪懈泄 褨薪褋褌褉褍屑械薪褌芯屑',
+      },
+    },
+    questionClassifiers: {
+      model: '屑芯写械谢褜',
+      inputVars: '袙褏褨写薪褨 蟹屑褨薪薪褨',
+      outputVars: {
+        className: '袧邪蟹胁邪 泻谢邪褋褍',
+      },
+      class: '袣谢邪褋',
+      classNamePlaceholder: '袧邪锌懈褕褨褌褜 薪邪蟹胁褍 胁邪褕芯谐芯 泻谢邪褋褍',
+      advancedSetting: '袪芯蟹褕懈褉械薪械 薪邪谢邪褕褌褍胁邪薪薪褟',
+      topicName: '袧邪蟹胁邪 褌械屑懈',
+      topicPlaceholder: '袧邪锌懈褕褨褌褜 薪邪蟹胁褍 胁邪褕芯褩 褌械屑懈',
+      addClass: '袛芯写邪褌懈 泻谢邪褋',
+      instruction: '袉薪褋褌褉褍泻褑褨褟',
+      instructionTip: '袙胁械写褨褌褜 写芯写邪褌泻芯胁褨 褨薪褋褌褉褍泻褑褨褩, 褖芯斜 写芯锌芯屑芯谐褌懈 泻谢邪褋懈褎褨泻邪褌芯褉褍 蟹邪锌懈褌邪薪褜 泻褉邪褖械 蟹褉芯蟹褍屑褨褌懈, 褟泻 泻邪褌械谐芯褉懈蟹褍胁邪褌懈 蟹邪锌懈褌邪薪薪褟.',
+      instructionPlaceholder: '袧邪锌懈褕褨褌褜 胁邪褕褍 褨薪褋褌褉褍泻褑褨褞',
+    },
+    parameterExtractor: {
+      inputVar: '袙褏褨写薪邪 蟹屑褨薪薪邪',
+      extractParameters: '袙懈褌褟谐褌懈 锌邪褉邪屑械褌褉懈',
+      importFromTool: '袉屑锌芯褉褌 蟹 褨薪褋褌褉褍屑械薪褌褨胁',
+      addExtractParameter: '袛芯写邪褌懈 锌邪褉邪屑械褌褉 胁懈褌褟谐褍胁邪薪薪褟',
+      addExtractParameterContent: {
+        name: '袉屑\'褟',
+        namePlaceholder: '袉屑\'褟 锌邪褉邪屑械褌褉邪 胁懈褌褟谐褍胁邪薪薪褟',
+        type: '孝懈锌',
+        typePlaceholder: '孝懈锌 锌邪褉邪屑械褌褉邪 胁懈褌褟谐褍胁邪薪薪褟',
+        description: '袨锌懈褋',
+        descriptionPlaceholder: '袨锌懈褋 锌邪褉邪屑械褌褉邪 胁懈褌褟谐褍胁邪薪薪褟',
+        required: '袨斜芯胁\'褟蟹泻芯胁懈泄',
+        requiredContent: '袨斜芯胁\'褟蟹泻芯胁懈泄 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 谢懈褕械 褟泻 锌芯褋懈谢邪薪薪褟 写谢褟 褨薪褎械褉械薪褑褨褩 屑芯写械谢褨 褨 薪械 写谢褟 芯斜芯胁\'褟蟹泻芯胁芯褩 胁邪谢褨写邪褑褨褩 胁懈褏褨写薪芯谐芯 锌邪褉邪屑械褌褉邪.',
+      },
+      extractParametersNotSet: '袩邪褉邪屑械褌褉懈 胁懈褌褟谐褍胁邪薪薪褟 薪械 薪邪谢邪褕褌芯胁邪薪褨',
+      instruction: '袉薪褋褌褉褍泻褑褨褟',
+      instructionTip: '袙胁械写褨褌褜 写芯写邪褌泻芯胁褨 褨薪褋褌褉褍泻褑褨褩, 褖芯斜 写芯锌芯屑芯谐褌懈 械泻褋褌褉邪泻褌芯褉褍 锌邪褉邪屑械褌褉褨胁 蟹褉芯蟹褍屑褨褌懈, 褟泻 胁懈褌褟谐褍胁邪褌懈 锌邪褉邪屑械褌褉懈.',
+      advancedSetting: '袪芯蟹褕懈褉械薪械 薪邪谢邪褕褌褍胁邪薪薪褟',
+      reasoningMode: '袪械卸懈屑 褨薪褎械褉械薪褑褨褩',
+      reasoningModeTip: '袙懈 屑芯卸械褌械 胁懈斜褉邪褌懈 胁褨写锌芯胁褨写薪懈泄 褉械卸懈屑 褨薪褎械褉械薪褑褨褩 蟹邪谢械卸薪芯 胁褨写 蟹写邪褌薪芯褋褌褨 屑芯写械谢褨 褉械邪谐褍胁邪褌懈 薪邪 褨薪褋褌褉褍泻褑褨褩 褖芯写芯 胁懈泻谢懈泻褨胁 褎褍薪泻褑褨泄 邪斜芯 蟹邪锌懈褌褨胁.',
+      isSuccess: '袆 褍褋锌褨褏. 校 褉邪蟹褨 褍褋锌褨褏褍 蟹薪邪褔械薪薪褟 1, 褍 褉邪蟹褨 薪械胁写邪褔褨 蟹薪邪褔械薪薪褟 0.',
+      errorReason: '袩褉懈褔懈薪邪 锌芯屑懈谢泻懈',
+    },
+    iteration: {
+      deleteTitle: '袙懈写邪谢懈褌懈 胁褍蟹芯谢 褨褌械褉邪褑褨褩?',
+      deleteDesc: '袙懈写邪谢械薪薪褟 胁褍蟹谢邪 褨褌械褉邪褑褨褩 胁懈写邪谢懈褌褜 褍褋褨 写芯褔褨褉薪褨 胁褍蟹谢懈',
+      input: '袙褏褨写',
+      output: '袟屑褨薪薪褨 胁懈褏芯写褍',
+      iteration_one: '{{count}} 袉褌械褉邪褑褨褟',
+      iteration_other: '{{count}} 袉褌械褉邪褑褨泄',
+      currentIteration: '袩芯褌芯褔薪邪 褨褌械褉邪褑褨褟',
+      ErrorMethod: {
+        operationTerminated: '袩褉懈锌懈薪械薪芯',
+        continueOnError: '袩褉芯写芯胁卸懈褌懈 锌褨褋谢褟 锌芯屑懈谢泻懈',
+        removeAbnormalOutput: '胁懈写邪谢懈褌懈-薪械薪芯褉屑邪谢褜薪懈泄-胁懈胁褨写',
+      },
+      error_one: '{{count}} 袩芯屑懈谢泻邪',
+      comma: ',',
+      MaxParallelismTitle: '袦邪泻褋懈屑邪谢褜薪邪 锌邪褉邪谢械谢褜薪褨褋褌褜',
+      parallelModeUpper: '袩袗袪袗袥袝袥鞋袧袠袡 袪袝袞袠袦',
+      error_other: '{{count}} 袩芯屑懈谢泻懈',
+      parallelMode: '袩邪褉邪谢械谢褜薪懈泄 褉械卸懈屑',
+      parallelModeEnableTitle: '校胁褨屑泻薪械薪芯 锌邪褉邪谢械谢褜薪懈泄 褉械卸懈屑',
+      errorResponseMethod: '袦械褌芯写 褉械邪谐褍胁邪薪薪褟 薪邪 锌芯屑懈谢泻褍',
+      parallelPanelDesc: '校 锌邪褉邪谢械谢褜薪芯屑褍 褉械卸懈屑褨 蟹邪胁写邪薪薪褟 胁 褨褌械褉邪褑褨褩 锌褨写褌褉懈屑褍褞褌褜 锌邪褉邪谢械谢褜薪械 胁懈泻芯薪邪薪薪褟.',
+      parallelModeEnableDesc: '校 锌邪褉邪谢械谢褜薪芯屑褍 褉械卸懈屑褨 蟹邪胁写邪薪薪褟 胁褋械褉械写懈薪褨 褨褌械褉邪褑褨泄 锌褨写褌褉懈屑褍褞褌褜 锌邪褉邪谢械谢褜薪械 胁懈泻芯薪邪薪薪褟. 袙懈 屑芯卸械褌械 薪邪谢邪褕褌褍胁邪褌懈 褑械 薪邪 锌邪薪械谢褨 胁谢邪褋褌懈胁芯褋褌械泄 锌褉邪胁芯褉褍褔.',
+      MaxParallelismDesc: '袦邪泻褋懈屑邪谢褜薪懈泄 锌邪褉邪谢械谢褨蟹屑 胁懈泻芯褉懈褋褌芯胁褍褦褌褜褋褟 写谢褟 泻芯薪褌褉芯谢褞 褔懈褋谢邪 蟹邪胁写邪薪褜, 褖芯 胁懈泻芯薪褍褞褌褜褋褟 芯写薪芯褔邪褋薪芯 蟹邪 芯写薪褍 褨褌械褉邪褑褨褞.',
+      answerNodeWarningDesc: '袩芯锌械褉械写卸械薪薪褟 胁 锌邪褉邪谢械谢褜薪芯屑褍 褉械卸懈屑褨: 胁褍蟹谢懈 胁褨写锌芯胁褨写械泄, 锌褉懈蟹薪邪褔械薪薪褟 蟹屑褨薪薪懈褏 褉芯蟹屑芯胁懈 褌邪 锌芯褋褌褨泄薪褨 芯锌械褉邪褑褨褩 褔懈褌邪薪薪褟/蟹邪锌懈褋褍 胁 屑械卸邪褏 褨褌械褉邪褑褨泄 屑芯卸褍褌褜 褋锌褉懈褔懈薪懈褌懈 胁懈薪褟褌泻懈.',
+    },
+    note: {
+      editor: {
+        large: '袙械谢懈泻懈泄',
+        bold: '袞懈褉薪懈泄',
+        openLink: '袙褨写泻褉懈胁邪褌懈',
+        small: '袦邪谢懈泄',
+        link: '袩芯褋懈谢邪薪薪褟',
+        italic: '袣褍褉褋懈胁',
+        placeholder: '袧邪锌懈褕褨褌褜 褋胁芯褞 蟹邪屑褨褌泻褍...',
+        strikethrough: '袟邪泻褉械褋谢械薪褨',
+        medium: '小械褉械写薪褦',
+        showAuthor: '袩芯泻邪蟹邪褌懈 邪胁褌芯褉邪',
+        bulletList: '袦邪褉泻芯胁邪薪懈泄 褋锌懈褋芯泻',
+        enterUrl: '袙胁械写褨褌褜 URL-邪写褉械褋褍...',
+        unlink: '袙褨写\'褦写薪邪褌懈',
+        invalidUrl: '袧械胁褨褉薪邪 URL-邪写褉械褋邪',
+      },
+      addNote: '袛芯写邪褌懈 锌褉懈屑褨褌泻褍',
+    },
+    docExtractor: {
+      outputVars: {
+        text: '袙懈褌褟谐薪褍褌懈泄 褌械泻褋褌',
+      },
+      learnMore: '袛褨蟹薪邪褌懈褋褟 斜褨谢褜褕械',
+      inputVar: '袙褏褨写薪邪 蟹屑褨薪薪邪',
+      supportFileTypes: '孝懈锌懈 褎邪泄谢褨胁 锌褨写褌褉懈屑泻懈: {{types}}.',
+    },
+    listFilter: {
+      outputVars: {
+        last_record: '袨褋褌邪薪薪褨泄 蟹邪锌懈褋',
+        first_record: '袩械褉褕懈泄 蟹邪锌懈褋',
+        result: '袪械蟹褍谢褜褌邪褌 褎褨谢褜褌褉邪',
+      },
+      desc: '小袩袗袛袗袧袧携袦',
+      filterCondition: '小褌邪薪 褎褨谢褜褌褉邪',
+      inputVar: '袙褏褨写薪邪 蟹屑褨薪薪邪',
+      asc: '笑袧袗袩',
+      filterConditionKey: '袣谢邪胁褨褕邪 褍屑芯胁懈 褎褨谢褜褌褉邪',
+      limit: '袟胁械褉褏褍 N',
+      selectVariableKeyPlaceholder: '袙懈斜械褉褨褌褜 泻谢褞褔 锌褨写蟹屑褨薪薪芯褩',
+      orderBy: '袟邪屑芯胁懈褌懈 锌芯',
+      filterConditionComparisonOperator: '袨锌械褉邪褌芯褉 锌芯褉褨胁薪褟薪薪褟 褍屑芯胁 褎褨谢褜褌褉邪',
+      filterConditionComparisonValue: '袟薪邪褔械薪薪褟 褍屑芯胁懈 褎褨谢褜褌褉邪',
+      extractsCondition: '袙懈褌褟谐薪褨褌褜 械谢械屑械薪褌 N',
+    },
+    agent: {
+      strategy: {
+        selectTip: '袙懈斜械褉褨褌褜 邪谐械薪褌褋褜泻褍 褋褌褉邪褌械谐褨褞',
+        tooltip: '袪褨蟹薪褨 邪谐械薪褌褋褜泻褨 褋褌褉邪褌械谐褨褩 胁懈蟹薪邪褔邪褞褌褜, 褟泻 褋懈褋褌械屑邪 锌谢邪薪褍褦 褌邪 胁懈泻芯薪褍褦 斜邪谐邪褌芯械褌邪锌薪褨 胁懈泻谢懈泻懈 褨薪褋褌褉褍屑械薪褌褨胁',
+        configureTipDesc: '袩褨褋谢褟 薪邪谢邪褕褌褍胁邪薪薪褟 邪谐械薪褌薪芯褩 褋褌褉邪褌械谐褨褩 褑械泄 胁褍蟹芯谢 邪胁褌芯屑邪褌懈褔薪芯 蟹邪胁邪薪褌邪卸懈褌褜 褉械褕褌褍 泻芯薪褎褨谐褍褉邪褑褨泄. 小褌褉邪褌械谐褨褟 胁锌谢懈薪械 薪邪 屑械褏邪薪褨蟹屑 斜邪谐邪褌芯褋褌褍锌褨薪褔邪褋褌芯谐芯 褨薪褋褌褉褍屑械薪褌邪谢褜薪芯谐芯 屑褨褉泻褍胁邪薪薪褟.',
+        label: '袗谐械薪褌懈褔薪邪 褋褌褉邪褌械谐褨褟',
+        configureTip: '袘褍写褜 谢邪褋泻邪, 薪邪谢邪褕褌褍泄褌械 邪谐械薪褌懈褔薪褍 褋褌褉邪褌械谐褨褞.',
+        searchPlaceholder: '小褌褉邪褌械谐褨褟 锌芯褕褍泻芯胁芯谐芯 邪谐械薪褌邪',
+        shortLabel: '小褌褉邪褌械谐褨褟',
+      },
+      pluginInstaller: {
+        install: '袉薪褋褌邪谢褞胁邪褌懈',
+        installing: '校褋褌邪薪芯胁泻懈',
+      },
+      modelNotInMarketplace: {
+        desc: '笑褟 屑芯写械谢褜 胁褋褌邪薪芯胁谢褞褦褌褜褋褟 蟹 谢芯泻邪谢褜薪芯谐芯 褉械锌芯蟹懈褌芯褉褨褞 邪斜芯 褉械锌芯蟹懈褌芯褉褨褞 GitHub. 袘褍写褜 谢邪褋泻邪, 胁懈泻芯褉懈褋褌芯胁褍泄褌械 锌褨褋谢褟 胁褋褌邪薪芯胁谢械薪薪褟.',
+        title: '袦芯写械谢褜 薪械 胁褋褌邪薪芯胁谢械薪邪',
+        manageInPlugins: '袣械褉褍胁邪薪薪褟 胁 锌谢邪谐褨薪邪褏',
+      },
+      modelNotSupport: {
+        title: '袧械锌褨写褌褉懈屑褍胁邪薪邪 屑芯写械谢褜',
+        desc: '袙褋褌邪薪芯胁谢械薪邪 胁械褉褋褨褟 锌谢邪谐褨薪邪 薪械 锌械褉械写斜邪褔邪褦 褑褞 屑芯写械谢褜.',
+        descForVersionSwitch: '袙褋褌邪薪芯胁谢械薪邪 胁械褉褋褨褟 锌谢邪谐褨薪邪 薪械 锌械褉械写斜邪褔邪褦 褑褞 屑芯写械谢褜. 袧邪褌懈褋薪褨褌褜, 褖芯斜 蟹屑褨薪懈褌懈 胁械褉褋褨褞.',
+      },
+      modelSelectorTooltips: {
+        deprecated: '笑褟 屑芯写械谢褜 胁胁邪卸邪褦褌褜褋褟 蟹邪褋褌邪褉褨谢芯褞',
+      },
+      outputVars: {
+        files: {
+          upload_file_id: '袟邪胁邪薪褌邪卸懈褌懈 褨写械薪褌懈褎褨泻邪褌芯褉 褎邪泄谢褍',
+          transfer_method: '小锌芯褋褨斜 锌械褉械泻邪蟹褍. 笑褨薪薪褨褋褌褜 remote_url 邪斜芯 local_file',
+          type: '孝懈锌 锌褨写褌褉懈屑泻懈. 孝械锌械褉 锌褨写褌褉懈屑泻邪 褌褨谢褜泻懈 蟹芯斜褉邪卸械薪薪褟',
+          url: 'URL-邪写褉械褋邪 蟹芯斜褉邪卸械薪薪褟',
+          title: '肖邪泄谢懈, 褋褌胁芯褉械薪褨 邪谐械薪褌芯屑',
+        },
+        text: '袣芯薪褌械薪褌, 褋褌胁芯褉械薪懈泄 邪谐械薪褌芯屑',
+        json: '袗谐械薪褌 蟹谐械薪械褉褍胁邪胁 JSON',
+      },
+      checkList: {
+        strategyNotSelected: '小褌褉邪褌械谐褨褞 薪械 芯斜褉邪薪芯',
+      },
+      installPlugin: {
+        cancel: '小泻邪褋褍胁邪褌懈',
+        title: '袙褋褌邪薪芯胁懈褌懈 锌谢邪谐褨薪',
+        desc: '袩褉芯 胁褋褌邪薪芯胁谢械薪薪褟 薪邪褋褌褍锌薪芯谐芯 锌谢邪谐褨薪邪',
+        changelog: '袞褍褉薪邪谢 蟹屑褨薪',
+        install: '袉薪褋褌邪谢褞胁邪褌懈',
+      },
+      strategyNotSet: '袗谐械薪褌褋褜泻邪 褋褌褉邪褌械谐褨褟 袧械 胁褋褌邪薪芯胁谢械薪芯',
+      strategyNotFoundDesc: '袙褋褌邪薪芯胁谢械薪邪 胁械褉褋褨褟 锌谢邪谐褨薪邪 薪械 蟹邪斜械蟹锌械褔褍褦 褑褞 褋褌褉邪褌械谐褨褞.',
+      notAuthorized: '袧械 邪胁褌芯褉懈蟹芯胁邪薪芯',
+      pluginNotInstalled: '笑械泄 锌谢邪谐褨薪 薪械 胁褋褌邪薪芯胁谢械薪芯',
+      linkToPlugin: '袩芯褋懈谢邪薪薪褟 薪邪 锌谢邪谐褨薪懈',
+      configureModel: '袧邪谢邪褕褌褍泄褌械 屑芯写械谢褜',
+      toolNotInstallTooltip: '{{tool}} 薪械 胁褋褌邪薪芯胁谢械薪芯',
+      maxIterations: '袦邪泻褋懈屑邪谢褜薪邪 泻褨谢褜泻褨褋褌褜 褨褌械褉邪褑褨泄',
+      pluginNotFoundDesc: '笑械泄 锌谢邪谐褨薪 胁褋褌邪薪芯胁谢褞褦褌褜褋褟 蟹 GitHub. 袘褍写褜 谢邪褋泻邪, 锌械褉械泄写褨褌褜 写芯 袩谢邪谐褨薪懈 写谢褟 锌械褉械胁褋褌邪薪芯胁谢械薪薪褟',
+      modelNotInstallTooltip: '袛邪薪邪 屑芯写械谢褜 薪械 胁褋褌邪薪芯胁谢械薪邪',
+      unsupportedStrategy: '小褌褉邪褌械谐褨褟 斜械蟹 锌褨写褌褉懈屑泻懈',
+      learnMore: '袛褨蟹薪邪褌懈褋褟 斜褨谢褜褕械',
+      tools: '袉薪褋褌褉褍屑械薪褌',
+      strategyNotInstallTooltip: '{{strategy}} 薪械 胁褋褌邪薪芯胁谢械薪芯',
+      toolbox: '褟褖懈泻 写谢褟 褨薪褋褌褉褍屑械薪褌褨胁',
+      toolNotAuthorizedTooltip: '{{tool}} 袧械 邪胁褌芯褉懈蟹芯胁邪薪芯',
+      model: '屑芯写械谢褜',
+      pluginNotInstalledDesc: '笑械泄 锌谢邪谐褨薪 胁褋褌邪薪芯胁谢褞褦褌褜褋褟 蟹 GitHub. 袘褍写褜 谢邪褋泻邪, 锌械褉械泄写褨褌褜 写芯 袩谢邪谐褨薪懈 写谢褟 锌械褉械胁褋褌邪薪芯胁谢械薪薪褟',
+      modelNotSelected: '袦芯写械谢褜 薪械 芯斜褉邪薪邪',
+      strategyNotFoundDescAndSwitchVersion: '袙褋褌邪薪芯胁谢械薪邪 胁械褉褋褨褟 锌谢邪谐褨薪邪 薪械 蟹邪斜械蟹锌械褔褍褦 褑褞 褋褌褉邪褌械谐褨褞. 袧邪褌懈褋薪褨褌褜, 褖芯斜 蟹屑褨薪懈褌懈 胁械褉褋褨褞.',
+    },
+    loop: {
+      ErrorMethod: {
+        operationTerminated: '袩褉懈锌懈薪械薪芯',
+        removeAbnormalOutput: '袙懈写邪谢懈褌懈 薪械薪芯褉屑邪谢褜薪懈泄 胁懈褏褨写',
+        continueOnError: '袩褉芯写芯胁卸懈褌懈 薪械蟹胁邪卸邪褞褔懈 薪邪 锌芯屑懈谢泻褍',
+      },
+      loop_one: '{{count}} 笑懈泻谢',
+      exitConditionTip: '袙褍蟹芯谢 褑懈泻谢褍 锌芯褌褉械斜褍褦 锌褉懈薪邪泄屑薪褨 芯写薪褨褦褩 褍屑芯胁懈 胁懈褏芯写褍',
+      error_other: '{{count}} 袩芯屑懈谢芯泻',
+      setLoopVariables: '袙褋褌邪薪芯胁褨褌褜 蟹屑褨薪薪褨 胁 屑械卸邪褏 芯斜谢邪褋褌褨 胁懈写懈屑芯褋褌褨 褑懈泻谢褍',
+      loopVariables: '笑懈泻谢褨褔薪褨 蟹屑褨薪薪褨',
+      currentLoopCount: '袩芯褌芯褔薪邪 泻褨谢褜泻褨褋褌褜 褑懈泻谢褨胁: {{count}}',
+      totalLoopCount: '袟邪谐邪谢褜薪邪 泻褨谢褜泻褨褋褌褜 褑懈泻谢褨胁: {{count}}',
+      loop_other: '{{count}} 笑懈泻谢褨胁',
+      error_one: '{{count}} 袩芯屑懈谢泻邪',
+      currentLoop: '袩芯褌芯褔薪邪 锌械褌谢褟',
+      breakCondition: '校屑芯胁邪 蟹邪胁械褉褕械薪薪褟 褑懈泻谢褍',
+      deleteDesc: '袙懈写邪谢械薪薪褟 胁褍蟹谢邪 褑懈泻谢褍 锌褉懈蟹胁械写械 写芯 胁懈写邪谢械薪薪褟 胁褋褨褏 写芯褔褨褉薪褨褏 胁褍蟹谢褨胁.',
+      breakConditionTip: '孝褨谢褜泻懈 蟹屑褨薪薪褨 胁 褑懈泻谢邪褏 蟹 褍屑芯胁邪屑懈 蟹邪胁械褉褕械薪薪褟 褌邪 蟹屑褨薪薪褨 褉芯蟹屑芯胁懈 屑芯卸褍褌褜 斜褍褌懈 胁懈泻芯褉懈褋褌邪薪褨.',
+      initialLoopVariables: '袩芯褔邪褌泻芯胁褨 蟹屑褨薪薪褨 褑懈泻谢褍',
+      finalLoopVariables: '袟邪泻谢褞褔薪褨 蟹屑褨薪薪褨 褑懈泻谢褍',
+      input: '袙胁械写械薪薪褟',
+      errorResponseMethod: '袦械褌芯写 胁褨写锌芯胁褨写褨 薪邪 锌芯屑懈谢泻褍',
+      output: '袙懈褏褨写薪邪 蟹屑褨薪薪邪',
+      variableName: '袟屑褨薪薪邪 袉屑\'褟',
+      comma: ',',
+      inputMode: '袪械卸懈屑 胁胁械写械薪薪褟',
+      loopNode: '笑懈泻谢褨褔薪懈泄 胁褍蟹芯谢',
+      loopMaxCountError: '袘褍写褜 谢邪褋泻邪, 胁胁械写褨褌褜 写褨泄褋薪械 屑邪泻褋懈屑邪谢褜薪械 蟹薪邪褔械薪薪褟 褑懈泻谢褍, 褟泻械 泻芯谢懈胁邪褦褌褜褋褟 胁褨写 1 写芯 {{maxCount}}',
+      deleteTitle: '袙懈写邪谢懈褌懈 胁褍蟹芯谢 褑懈泻谢褍?',
+      loopMaxCount: '袦邪泻褋懈屑邪谢褜薪邪 泻褨谢褜泻褨褋褌褜 褑懈泻谢褨胁',
+    },
+  },
+  tracing: {
+    stopBy: '袟褍锌懈薪械薪芯 泻芯褉懈褋褌褍胁邪褔械屑 {{user}}',
+  },
+  variableReference: {
+    conversationVars: '袟屑褨薪薪褨 褉芯蟹屑芯胁懈',
+    noVarsForOperation: '袧械屑邪褦 写芯褋褌褍锌薪懈褏 蟹屑褨薪薪懈褏 写谢褟 锌褉懈蟹薪邪褔械薪薪褟 蟹 芯斜褉邪薪芯褞 芯锌械褉邪褑褨褦褞.',
+    assignedVarsDescription: '袩褉懈蟹薪邪褔械薪褨 蟹屑褨薪薪褨 屑邪褞褌褜 斜褍褌懈 写芯褋褌褍锌薪懈屑懈 写谢褟 蟹邪锌懈褋褍, 褌邪泻懈屑懈 褟泻',
+    noAssignedVars: '袧械屑邪褦 写芯褋褌褍锌薪懈褏 锌褉懈蟹薪邪褔械薪懈褏 蟹屑褨薪薪懈褏',
+    noAvailableVars: '袧械屑邪褦 写芯褋褌褍锌薪懈褏 蟹屑褨薪薪懈褏',
+  },
+  versionHistory: {
+    filter: {
+      onlyShowNamedVersions: '袩芯泻邪蟹褍泄褌械 谢懈褕械 薪邪蟹胁邪薪褨 胁械褉褋褨褩',
+      reset: '小泻懈薪褍褌懈 褎褨谢褜褌褉',
+      all: '校褋械',
+      onlyYours: '孝褨谢褜泻懈 褌胁芯褦',
+      empty: '袧械 蟹薪邪泄写械薪芯 胁褨写锌芯胁褨写薪褍 褨褋褌芯褉褨褞 胁械褉褋褨泄',
+    },
+    editField: {
+      titleLengthLimit: '袟邪谐芯谢芯胁芯泻 薪械 屑芯卸械 锌械褉械胁懈褖褍胁邪褌懈 {{limit}} 褋懈屑胁芯谢褨胁',
+      releaseNotes: '袩褉懈屑褨褌泻懈 写芯 胁懈锌褍褋泻褍',
+      title: '袧邪蟹胁邪',
+      releaseNotesLengthLimit: '袩褉懈屑褨褌泻懈 写芯 胁懈锌褍褋泻褍 薪械 屑芯卸褍褌褜 锌械褉械胁懈褖褍胁邪褌懈 {{limit}} 褋懈屑胁芯谢褨胁',
+    },
+    action: {
+      restoreFailure: '袧械 胁写邪谢芯褋褟 胁褨写薪芯胁懈褌懈 胁械褉褋褨褞',
+      updateSuccess: '袙械褉褋褨褟 芯薪芯胁谢械薪邪',
+      deleteFailure: '袧械 胁写邪谢芯褋褟 胁懈写邪谢懈褌懈 胁械褉褋褨褞',
+      deleteSuccess: '袙械褉褋褨褟 胁懈写邪谢械薪邪',
+      restoreSuccess: '袙械褉褋褨褟 胁褨写薪芯胁谢械薪邪',
+      updateFailure: '袧械 胁写邪谢芯褋褟 芯薪芯胁懈褌懈 胁械褉褋褨褞',
+    },
+    defaultName: '袘械蟹 薪邪蟹胁懈 胁械褉褋褨褟',
+    restorationTip: '袩褨褋谢褟 胁褨写薪芯胁谢械薪薪褟 胁械褉褋褨褩 薪懈薪褨褕薪褨泄 锌褉芯械泻褌 斜褍写械 锌械褉械蟹邪锌懈褋邪薪芯.',
+    title: '袙械褉褋褨褩',
+    currentDraft: '袩芯褌芯褔薪懈泄 锌褉芯械泻褌',
+    deletionTip: '袙懈写邪谢械薪薪褟 褦 薪械蟹胁芯褉芯褌薪褨屑, 斜褍写褜 谢邪褋泻邪, 锌褨写褌胁械褉写褨褌褜.',
+    releaseNotesPlaceholder: '袨锌懈褕褨褌褜, 褖芯 蟹屑褨薪懈谢芯褋褟',
+    editVersionInfo: '袪械写邪谐褍胁邪褌懈 褨薪褎芯褉屑邪褑褨褞 锌褉芯 胁械褉褋褨褞',
+    nameThisVersion: '袧邪蟹胁褨褌褜 褑褞 胁械褉褋褨褞',
+    latest: '袨褋褌邪薪薪褨 薪芯胁懈薪懈',
+  },
+}
+
+export default translation
diff --git a/i18n/vi-VN/app-annotation.ts b/i18n/vi-VN/app-annotation.ts
new file mode 100644
index 0000000..6a9457f
--- /dev/null
+++ b/i18n/vi-VN/app-annotation.ts
@@ -0,0 +1,87 @@
+const translation = {
+  title: 'Ch煤 th铆ch',
+  name: 'Ch煤 th铆ch cho c芒u tr岷� l峄漣',
+  editBy: 'C芒u tr岷� l峄漣 膽瓢峄 ch峄塶h s峄璦 b峄焛 {{author}}',
+  noData: {
+    title: 'Kh么ng c贸 ch煤 th铆ch',
+    description: 'B岷 c贸 th峄� ch峄塶h s峄璦 ch煤 th铆ch trong ph岷 g峄� l峄梚 峄﹏g d峄g ho岷穋 nh岷璸 h脿ng lo岷 ch煤 th铆ch v脿o 膽芒y 膽峄� c贸 ph岷 h峄搃 ch岷 l瓢峄g cao.',
+  },
+  table: {
+    header: {
+      question: 'c芒u h峄廼',
+      answer: 'c芒u tr岷� l峄漣',
+      createdAt: 't岷 l煤c',
+      hits: 'l瓢峄 truy c岷璸',
+      actions: 'h脿nh 膽峄檔g',
+      addAnnotation: 'Th锚m ch煤 th铆ch',
+      bulkImport: 'Nh岷璸 h脿ng lo岷',
+      bulkExport: 'Xu岷 h脿ng lo岷',
+      clearAll: 'X贸a t岷 c岷� ch煤 th铆ch',
+    },
+  },
+  editModal: {
+    title: 'Ch峄塶h s峄璦 ch煤 th铆ch c芒u tr岷� l峄漣',
+    queryName: 'C芒u h峄廼 c峄 ng瓢峄漣 d霉ng',
+    answerName: 'C芒u tr岷� l峄漣 c峄 AI',
+    yourAnswer: 'C芒u tr岷� l峄漣 c峄 b岷',
+    answerPlaceholder: 'Nh岷璸 c芒u tr岷� l峄漣 c峄 b岷 v脿o 膽芒y',
+    yourQuery: 'C芒u h峄廼 c峄 b岷',
+    queryPlaceholder: 'Nh岷璸 c芒u h峄廼 c峄 b岷 峄� 膽芒y',
+    removeThisCache: 'X贸a ch煤 th铆ch n脿y',
+    createdAt: '膼瓢峄 t岷 l煤c',
+  },
+  addModal: {
+    title: 'Th锚m ch煤 th铆ch c芒u tr岷� l峄漣',
+    queryName: 'C芒u h峄廼',
+    answerName: 'C芒u tr岷� l峄漣',
+    answerPlaceholder: 'Nh岷璸 c芒u tr岷� l峄漣 v脿o 膽芒y',
+    queryPlaceholder: 'Nh岷璸 c芒u h峄廼 峄� 膽芒y',
+    createNext: 'Th锚m ch煤 th铆ch kh谩c',
+  },
+  batchModal: {
+    title: 'Nh岷璸 h脿ng lo岷',
+    csvUploadTitle: 'K茅o v脿 th岷� t峄噋 CSV c峄 b岷 v脿o 膽芒y ho岷穋 ',
+    browse: 'ch峄峮 t峄噋',
+    tip: 'T峄噋 CSV ph岷 tu芒n theo c岷 tr煤c sau:',
+    question: 'c芒u h峄廼',
+    answer: 'c芒u tr岷� l峄漣',
+    contentTitle: 'ti锚u 膽峄� n峄檌 dung',
+    content: 'n峄檌 dung',
+    template: 'T岷 m岷玼 t岷 膽芒y',
+    cancel: 'H峄',
+    run: 'Ch岷 h脿ng lo岷',
+    runError: 'Ch岷 h脿ng lo岷 th岷 b岷',
+    processing: '膼ang x峄� l媒 h脿ng lo岷',
+    completed: 'Nh岷璸 ho脿n t岷',
+    error: 'L峄梚 khi nh岷璸',
+    ok: 'OK',
+  },
+  errorMessage: {
+    answerRequired: 'C芒u tr岷� l峄漣 l脿 b岷痶 bu峄檆',
+    queryRequired: 'C芒u h峄廼 l脿 b岷痶 bu峄檆',
+  },
+  viewModal: {
+    annotatedResponse: 'C芒u tr岷� l峄漣 膽茫 ch煤 th铆ch',
+    hitHistory: 'L峄媍h s峄� truy c岷璸',
+    hit: 'L瓢峄 truy c岷璸',
+    hits: 'L瓢峄 truy c岷璸',
+    noHitHistory: 'Kh么ng c贸 l峄媍h s峄� truy c岷璸',
+  },
+  hitHistoryTable: {
+    query: 'C芒u h峄廼',
+    match: '膼峄� ch铆nh x谩c',
+    response: 'Ph岷 h峄搃',
+    source: 'Ngu峄搉',
+    score: '膼i峄僲',
+    time: 'Th峄漣 gian',
+  },
+  initSetup: {
+    title: 'Thi岷縯 l岷璸 ban 膽岷 cho ch煤 th铆ch c芒u tr岷� l峄漣',
+    configTitle: 'Thi岷縯 l岷璸 ch煤 th铆ch c芒u tr岷� l峄漣',
+    confirmBtn: 'L瓢u & K铆ch ho岷',
+    configConfirmBtn: 'L瓢u',
+  },
+  embeddingModelSwitchTip: 'M么 h矛nh vector h贸a v膬n b岷 ch煤 th铆ch, vi峄嘽 chuy峄僴 膽峄昳 m么 h矛nh s岷� d岷玭 膽岷縩 vi峄嘽 nh煤ng l岷, c贸 th峄� ph谩t sinh th锚m chi ph铆.',
+}
+
+export default translation
diff --git a/i18n/vi-VN/app-api.ts b/i18n/vi-VN/app-api.ts
new file mode 100644
index 0000000..0a8de78
--- /dev/null
+++ b/i18n/vi-VN/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'M谩y ch峄� API',
+  apiKey: 'Kh贸a API',
+  status: 'Tr岷g th谩i',
+  disabled: '膼茫 t岷痶',
+  ok: '膼ang ho岷 膽峄檔g',
+  copy: 'Sao ch茅p',
+  copied: '膼茫 sao ch茅p',
+  play: 'Ch岷',
+  pause: 'T岷 d峄玭g',
+  playing: '膼ang ch岷',
+  merMaid: {
+    rerender: 'V岷� l岷',
+  },
+  never: 'Kh么ng bao gi峄�',
+  apiKeyModal: {
+    apiSecretKey: 'Kh贸a b铆 m岷璽 API',
+    apiSecretKeyTips: '膼峄� ng膬n ch岷穘 vi峄嘽 l岷 d峄g API, h茫y b岷 v峄� Kh贸a API c峄 b岷. Tr谩nh s峄� d峄g n贸 d瓢峄沬 d岷g v膬n b岷 thu岷 trong m茫 giao di峄噉 ng瓢峄漣 d霉ng.',
+    createNewSecretKey: 'T岷 kh贸a b铆 m岷璽 m峄沬',
+    secretKey: 'Kh贸a b铆 m岷璽',
+    created: '膼脙 T岷燨',
+    lastUsed: 'S峄� D峄G L岷 CU峄怚',
+    generateTips: 'H茫y l瓢u gi峄� kh贸a n脿y 峄� n啤i an to脿n v脿 d峄� ti岷縫 c岷璶.',
+  },
+  actionMsg: {
+    deleteConfirmTitle: 'X贸a kh贸a b铆 m岷璽 n脿y?',
+    deleteConfirmTips: 'H脿nh 膽峄檔g n脿y kh么ng th峄� ho脿n t谩c.',
+    ok: 'OK',
+  },
+  completionMode: {
+    title: 'API 峄﹏g d峄g ho脿n th脿nh',
+    info: '膼峄慽 v峄沬 vi峄嘽 t岷 v膬n b岷 ch岷 l瓢峄g cao nh瓢 b脿i vi岷縯, t贸m t岷痶 v脿 d峄媍h thu岷璽, h茫y s峄� d峄g API ho脿n th脿nh tin nh岷痭 v峄沬 膽岷 v脿o t峄� ng瓢峄漣 d霉ng. Vi峄嘽 t岷 v膬n b岷 d峄盿 tr锚n c谩c th么ng s峄� m么 h矛nh v脿 m岷玼 膽峄� xu岷 膽瓢峄 thi岷縯 l岷璸 trong Dify Prompt Engineering.',
+    createCompletionApi: 'T岷 tin nh岷痭 ho脿n th脿nh',
+    createCompletionApiTip: 'T岷 m峄檛 tin nh岷痭 ho脿n th脿nh 膽峄� h峄� tr峄� ch岷� 膽峄� c芒u h峄廼 v脿 tr岷� l峄漣.',
+    inputsTips: '(T霉y ch峄峮) Cung c岷 c谩c tr瓢峄漬g 膽岷 v脿o ng瓢峄漣 d霉ng d瓢峄沬 d岷g c岷穚 kh贸a-gi谩 tr峄�, t瓢啤ng 峄﹏g v峄沬 c谩c bi岷縩 trong Prompt Eng. Kh贸a l脿 t锚n bi岷縩, Gi谩 tr峄� l脿 gi谩 tr峄� tham s峄�. N岷縰 lo岷 tr瓢峄漬g l脿 L峄盿 ch峄峮, Gi谩 tr峄� 膽茫 g峄璱 ph岷 l脿 m峄檛 trong c谩c l峄盿 ch峄峮 膽茫 thi岷縯 l岷璸 tr瓢峄沜.',
+    queryTips: 'N峄檌 dung v膬n b岷 膽岷 v脿o c峄 ng瓢峄漣 d霉ng.',
+    blocking: 'Lo岷 ch岷穘, 膽峄 膽峄� th峄眂 hi峄噉 ho脿n t岷 v脿 tr岷� k岷縯 qu岷�. (Y锚u c岷 c贸 th峄� b峄� gi谩n 膽o岷 n岷縰 qu谩 tr矛nh k茅o d脿i)',
+    streaming: 'tr岷� v峄� d峄� li峄噓 theo lu峄搉g. Th峄眂 hi峄噉 tr岷� d峄� li峄噓 theo lu峄搉g d峄盿 tr锚n SSE (S峄� ki峄噉 膽瓢峄 g峄璱 t峄� m谩y ch峄�).',
+    messageFeedbackApi: 'Ph岷 h峄搃 tin nh岷痭 (th铆ch)',
+    messageFeedbackApiTip: '膼谩nh gi谩 c谩c tin nh岷痭 nh岷璶 膽瓢峄 thay m岷穞 cho ng瓢峄漣 d霉ng cu峄慽 v峄沬 c谩c l峄盿 ch峄峮 th铆ch ho岷穋 kh么ng th铆ch. D峄� li峄噓 n脿y hi峄僴 th峄� tr锚n trang Nh岷璽 k媒 & Ch煤 th铆ch v脿 膽瓢峄 s峄� d峄g cho vi峄嘽 膽i峄乽 ch峄塶h m么 h矛nh trong t瓢啤ng lai.',
+    messageIDTip: 'ID tin nh岷痭',
+    ratingTip: 'th铆ch ho岷穋 kh么ng th铆ch, null l脿 h峄 b峄�',
+    parametersApi: 'Thu th岷璸 th么ng tin tham s峄� 峄﹏g d峄g',
+    parametersApiTip: 'Truy xu岷 c谩c tham s峄� 膼岷 v脿o 膽瓢峄 c岷 h矛nh, bao g峄搈 t锚n bi岷縩, t锚n tr瓢峄漬g, lo岷 v脿 gi谩 tr峄� m岷穋 膽峄媙h. Th瓢峄漬g 膽瓢峄 s峄� d峄g 膽峄� hi峄僴 th峄� c谩c tr瓢峄漬g n脿y trong m峄檛 bi峄僽 m岷玼 ho岷穋 膽i峄乶 v脿o c谩c gi谩 tr峄� m岷穋 膽峄媙h sau khi m谩y kh谩ch t岷.',
+  },
+  chatMode: {
+    title: 'API 峄﹏g d峄g tr貌 chuy峄噉',
+    info: '膼峄慽 v峄沬 峄﹏g d峄g tr貌 chuy峄噉 linh ho岷 s峄� d峄g 膽峄媙h d岷g C芒u h峄廼 v脿 Tr岷� l峄漣, g峄峣 API tin nh岷痭 tr貌 chuy峄噉 膽峄� b岷痶 膽岷 cu峄檆 tr貌 chuy峄噉. Duy tr矛 cu峄檆 tr貌 chuy峄噉 li锚n t峄 b岷眓g c谩ch chuy峄僴 conversation_id 膽茫 tr岷� v峄�. C谩c tham s峄� ph岷 h峄搃 v脿 m岷玼 ph峄� thu峄檆 v脿o c谩c c脿i 膽岷穞 c峄 Dify Prompt Eng.',
+    createChatApi: 'T岷 tin nh岷痭 tr貌 chuy峄噉',
+    createChatApiTip: 'T岷 m峄檛 tin nh岷痭 tr貌 chuy峄噉 m峄沬 ho岷穋 ti岷縫 t峄 m峄檛 cu峄檆 tr貌 chuy峄噉 膽ang t峄搉 t岷.',
+    inputsTips: '(T霉y ch峄峮) Cung c岷 c谩c tr瓢峄漬g 膽岷 v脿o ng瓢峄漣 d霉ng d瓢峄沬 d岷g c岷穚 kh贸a-gi谩 tr峄�, t瓢啤ng 峄﹏g v峄沬 c谩c bi岷縩 trong Prompt Eng. Kh贸a l脿 t锚n bi岷縩, Gi谩 tr峄� l脿 gi谩 tr峄� tham s峄�. N岷縰 lo岷 tr瓢峄漬g l脿 L峄盿 ch峄峮, Gi谩 tr峄� 膽茫 g峄璱 ph岷 l脿 m峄檛 trong c谩c l峄盿 ch峄峮 膽茫 thi岷縯 l岷璸 tr瓢峄沜.',
+    queryTips: 'N峄檌 dung c芒u h峄廼 c峄 ng瓢峄漣 d霉ng',
+    blocking: 'Lo岷 ch岷穘, 膽峄 膽峄� th峄眂 hi峄噉 ho脿n t岷 v脿 tr岷� k岷縯 qu岷�. (Y锚u c岷 c贸 th峄� b峄� gi谩n 膽o岷 n岷縰 qu谩 tr矛nh k茅o d脿i)',
+    streaming: 'tr岷� v峄� d峄� li峄噓 theo lu峄搉g. Th峄眂 hi峄噉 tr岷� d峄� li峄噓 theo lu峄搉g d峄盿 tr锚n SSE (S峄� ki峄噉 膽瓢峄 g峄璱 t峄� m谩y ch峄�).',
+    conversationIdTip: '(T霉y ch峄峮) ID cu峄檆 tr貌 chuy峄噉: 膽峄� tr峄憂g cho cu峄檆 tr貌 chuy峄噉 l岷 膽岷; chuy峄僴 conversation_id t峄� ng峄� c岷h 膽峄� ti岷縫 t峄 cu峄檆 tr貌 chuy峄噉.',
+    messageFeedbackApi: 'Ph岷 h峄搃 c峄 ng瓢峄漣 d霉ng cu峄慽 v峄� tin nh岷痭',
+    messageFeedbackApiTip: '膼谩nh gi谩 c谩c tin nh岷痭 nh岷璶 膽瓢峄 thay m岷穞 cho ng瓢峄漣 d霉ng cu峄慽 v峄沬 c谩c l峄盿 ch峄峮 th铆ch ho岷穋 kh么ng th铆ch. D峄� li峄噓 n脿y hi峄僴 th峄� tr锚n trang Nh岷璽 k媒 & Ch煤 th铆ch v脿 膽瓢峄 s峄� d峄g cho vi峄嘽 膽i峄乽 ch峄塶h m么 h矛nh trong t瓢啤ng lai.',
+    messageIDTip: 'ID tin nh岷痭',
+    ratingTip: 'th铆ch ho岷穋 kh么ng th铆ch, null l脿 h峄 b峄�',
+    chatMsgHistoryApi: 'L岷 l峄媍h s峄� tin nh岷痭 tr貌 chuy峄噉',
+    chatMsgHistoryApiTip: 'Trang 膽岷 ti锚n tr岷� v峄� `limit` tin nh岷痭 m峄沬 nh岷, 膽瓢峄 s岷痯 x岷縫 theo th峄� t峄� ng瓢峄 l岷.',
+    chatMsgHistoryConversationIdTip: 'ID Cu峄檆 tr貌 chuy峄噉',
+    chatMsgHistoryFirstId: 'ID c峄 b岷 ghi tr貌 chuy峄噉 膽岷 ti锚n tr锚n trang hi峄噉 t岷. Gi谩 tr峄� m岷穋 膽峄媙h l脿 kh么ng c贸.',
+    chatMsgHistoryLimit: 'S峄� l瓢峄g cu峄檆 tr貌 chuy峄噉 膽瓢峄 tr岷� v峄� trong m峄檛 y锚u c岷',
+    conversationsListApi: 'L岷 danh s谩ch cu峄檆 tr貌 chuy峄噉',
+    conversationsListApiTip: 'L岷 danh s谩ch phi锚n c峄 ng瓢峄漣 d霉ng hi峄噉 t岷. Theo m岷穋 膽峄媙h, tr岷� v峄� 20 phi锚n cu峄慽 c霉ng.',
+    conversationsListFirstIdTip: 'ID c峄 b岷 ghi cu峄慽 c霉ng tr锚n trang hi峄噉 t岷, m岷穋 膽峄媙h kh么ng c贸.',
+    conversationsListLimitTip: 'S峄� l瓢峄g cu峄檆 tr貌 chuy峄噉 膽瓢峄 tr岷� v峄� trong m峄檛 y锚u c岷',
+    conversationRenamingApi: '膼峄昳 t锚n cu峄檆 tr貌 chuy峄噉',
+    conversationRenamingApiTip: '膼峄昳 t锚n cu峄檆 tr貌 chuy峄噉; t锚n s岷� 膽瓢峄 hi峄僴 th峄� trong giao di峄噉 nhi峄乽 phi锚n.',
+    conversationRenamingNameTip: 'T锚n m峄沬',
+    parametersApi: 'Thu th岷璸 th么ng tin tham s峄� 峄﹏g d峄g',
+    parametersApiTip: 'Truy xu岷 c谩c tham s峄� 膼岷 v脿o 膽瓢峄 c岷 h矛nh, bao g峄搈 t锚n bi岷縩, t锚n tr瓢峄漬g, lo岷 v脿 gi谩 tr峄� m岷穋 膽峄媙h. Th瓢峄漬g 膽瓢峄 s峄� d峄g 膽峄� hi峄僴 th峄� c谩c tr瓢峄漬g n脿y trong m峄檛 bi峄僽 m岷玼 ho岷穋 膽i峄乶 v脿o c谩c gi谩 tr峄� m岷穋 膽峄媙h sau khi m谩y kh谩ch t岷.',
+  },
+  develop: {
+    requestBody: 'N峄檌 dung y锚u c岷',
+    pathParams: 'Tham s峄� 膽瓢峄漬g d岷玭',
+    query: 'Truy v岷',
+    toc: 'N峄檌 dung',
+  },
+  loading: 'T岷',
+  regenerate: 'T谩i t岷',
+}
+
+export default translation
diff --git a/i18n/vi-VN/app-debug.ts b/i18n/vi-VN/app-debug.ts
new file mode 100644
index 0000000..4e8a196
--- /dev/null
+++ b/i18n/vi-VN/app-debug.ts
@@ -0,0 +1,418 @@
+const translation = {
+  pageTitle: {
+    line1: 'Y脢U C岷',
+    line2: 'K峄� THU岷琓',
+  },
+  orchestrate: '膼i峄乽 ph峄慽',
+  promptMode: {
+    simple: 'Chuy峄僴 sang Ch岷� 膽峄� Chuy锚n gia 膽峄� ch峄塶h s峄璦 to脿n b峄� Y脢U C岷',
+    advanced: 'Ch岷� 膽峄� Chuy锚n gia',
+    switchBack: 'Quay l岷',
+    advancedWarning: {
+      title: 'B岷 膽茫 chuy峄僴 sang Ch岷� 膽峄� Chuy锚n gia. Sau khi s峄璦 膽峄昳 Y脢U C岷, b岷 KH脭NG TH峄� quay l岷 ch岷� 膽峄� c啤 b岷.',
+      description: 'Trong Ch岷� 膽峄� Chuy锚n gia, b岷 c贸 th峄� ch峄塶h s峄璦 to脿n b峄� Y脢U C岷.',
+      learnMore: 'T矛m hi峄僽 th锚m',
+      ok: '膼峄搉g 媒',
+    },
+    operation: {
+      addMessage: 'Th锚m tin nh岷痭',
+    },
+    contextMissing: 'Thi岷縰 th脿nh ph岷 Ng峄� c岷h, hi峄噓 qu岷� c峄 y锚u c岷 c贸 th峄� kh么ng t峄憈.',
+  },
+  operation: {
+    applyConfig: '脕p d峄g',
+    resetConfig: '膼岷穞 l岷',
+    debugConfig: 'G峄� l峄梚',
+    addFeature: 'Th锚m t铆nh n膬ng',
+    automatic: 'T峄� 膽峄檔g',
+    stopResponding: 'D峄玭g ph岷 h峄搃',
+    agree: 'th铆ch',
+    disagree: 'kh么ng th铆ch',
+    cancelAgree: 'B峄� th铆ch',
+    cancelDisagree: 'B峄� kh么ng th铆ch',
+    userAction: 'H脿nh 膽峄檔g ng瓢峄漣 d霉ng ',
+  },
+  notSetAPIKey: {
+    title: 'Ch瓢a thi岷縯 l岷璸 kh贸a API c峄 nh脿 cung c岷 LLM',
+    trailFinished: 'K岷縯 th煤c d霉ng th峄�',
+    description: 'Ch瓢a thi岷縯 l岷璸 kh贸a API c峄 nh脿 cung c岷 LLM. C岷 thi岷縯 l岷璸 tr瓢峄沜 khi g峄� l峄梚.',
+    settingBtn: '膼i 膽岷縩 c脿i 膽岷穞',
+  },
+  trailUseGPT4Info: {
+    title: 'Hi峄噉 kh么ng h峄� tr峄� GPT-4',
+    description: '膼峄� s峄� d峄g GPT-4, vui l貌ng thi岷縯 l岷璸 API Key.',
+  },
+  feature: {
+    groupChat: {
+      title: 'N芒ng cao tr貌 chuy峄噉',
+      description: 'Th锚m c脿i 膽岷穞 tr瓢峄沜 cho cu峄檆 tr貌 chuy峄噉 c贸 th峄� c岷 thi峄噉 tr岷 nghi峄噈 ng瓢峄漣 d霉ng.',
+    },
+    groupExperience: {
+      title: 'N芒ng cao tr岷 nghi峄噈',
+    },
+    conversationOpener: {
+      title: 'M峄� 膽岷 cu峄檆 tr貌 chuy峄噉',
+      description: 'Trong 峄﹏g d峄g tr貌 chuy峄噉, c芒u n贸i 膽岷 ti锚n m脿 AI t峄� 膽峄檔g n贸i v峄沬 ng瓢峄漣 d霉ng th瓢峄漬g 膽瓢峄 s峄� d峄g nh瓢 m峄檛 l峄漣 ch脿o.',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: 'C芒u h峄廼 g峄 媒',
+      description: 'Thi岷縯 l岷璸 膽峄� xu岷 c芒u h峄廼 ti岷縫 theo c贸 th峄� t岷 ra cu峄檆 tr貌 chuy峄噉 t峄憈 h啤n cho ng瓢峄漣 d霉ng.',
+      resDes: '3 膽峄� xu岷 cho c芒u h峄廼 ti岷縫 theo c峄 ng瓢峄漣 d霉ng.',
+      tryToAsk: 'Th峄� h峄廼',
+    },
+    moreLikeThis: {
+      title: 'Th锚m t瓢啤ng t峄�',
+      description: 'T岷 nhi峄乽 v膬n b岷 c霉ng m峄檛 l煤c, sau 膽贸 ch峄塶h s峄璦 v脿 ti岷縫 t峄 t岷 ra.',
+      generateNumTip: 'S峄� l瓢峄g m峄梚 l岷 t岷',
+      tip: 'S峄� d峄g t铆nh n膬ng n脿y s岷� ti锚u t峄憂 th锚m token.',
+    },
+    speechToText: {
+      title: 'Chuy峄僴 膽峄昳 gi峄峮g n贸i th脿nh v膬n b岷',
+      description: 'Khi 膽瓢峄 b岷璽, b岷 c贸 th峄� s峄� d峄g 膽岷 v脿o b岷眓g gi峄峮g n贸i.',
+      resDes: '膼茫 b岷璽 膽岷 v脿o b岷眓g gi峄峮g n贸i',
+    },
+    textToSpeech: {
+      title: 'Chuy峄僴 膽峄昳 v膬n b岷 th脿nh gi峄峮g n贸i',
+      description: 'Khi 膽瓢峄 b岷璽, v膬n b岷 c贸 th峄� 膽瓢峄 chuy峄僴 膽峄昳 th脿nh gi峄峮g n贸i.',
+      resDes: '膼茫 b岷璽 chuy峄僴 膽峄昳 v膬n b岷 th脿nh 芒m thanh',
+    },
+    citation: {
+      title: 'Tr铆ch d岷玭 v脿 ch煤 th铆ch',
+      description: 'Khi 膽瓢峄 b岷璽, hi峄僴 th峄� ngu峄搉 t脿i li峄噓 v脿 ph岷 膽瓢峄 tr铆ch d岷玭 c峄 n峄檌 dung 膽瓢峄 t岷 ra.',
+      resDes: '膼茫 b岷璽 tr铆ch d岷玭 v脿 ch煤 th铆ch',
+    },
+    annotation: {
+      title: 'Ph岷 h峄搃 c贸 ch煤 th铆ch',
+      description: 'B岷 c贸 th峄� th锚m ph岷 h峄搃 ch岷 l瓢峄g cao v脿o b峄� nh峄� cache 膽峄� 瓢u ti锚n ph霉 h峄 v峄沬 c谩c c芒u h峄廼 t瓢啤ng t峄� c峄 ng瓢峄漣 d霉ng.',
+      resDes: '膼茫 b岷璽 ph岷 h峄搃 c贸 ch煤 th铆ch',
+      scoreThreshold: {
+        title: 'Ng瓢峄g 膽i峄僲',
+        description: '膼瓢峄 s峄� d峄g 膽峄� 膽岷穞 ng瓢峄g t瓢啤ng 膽峄搉g cho ph岷 h峄搃 c贸 ch煤 th铆ch.',
+        easyMatch: 'Kh峄沺 d峄� d脿ng',
+        accurateMatch: 'Kh峄沺 ch铆nh x谩c',
+      },
+      matchVariable: {
+        title: 'Bi岷縩 kh峄沺',
+        choosePlaceholder: 'Ch峄峮 bi岷縩 kh峄沺',
+      },
+      cacheManagement: 'Qu岷 l媒 ch煤 th铆ch',
+      cached: '膼茫 l瓢u cache',
+      remove: 'X贸a',
+      removeConfirm: 'X贸a ch煤 th铆ch n脿y?',
+      add: 'Th锚m ch煤 th铆ch',
+      edit: 'Ch峄塶h s峄璦 ch煤 th铆ch',
+    },
+    dataSet: {
+      title: 'Ng峄� c岷h',
+      noData: 'B岷 c贸 th峄� nh岷璸 d峄� li峄噓 l脿m ng峄� c岷h',
+      words: 'T峄�',
+      textBlocks: 'Kh峄慽 v膬n b岷',
+      selectTitle: 'Ch峄峮 ki岷縩 th峄ヽ tham kh岷',
+      selected: 'Ki岷縩 th峄ヽ 膽茫 ch峄峮',
+      noDataSet: 'Kh么ng t矛m th岷 ki岷縩 th峄ヽ',
+      toCreate: 'T岷 m峄沬',
+      notSupportSelectMulti: 'Hi峄噉 ch峄� h峄� tr峄� m峄檛 ki岷縩 th峄ヽ',
+      queryVariable: {
+        title: 'Bi岷縩 truy v岷',
+        tip: 'Bi岷縩 n脿y s岷� 膽瓢峄 s峄� d峄g l脿m 膽岷 v脿o truy v岷 膽峄� truy xu岷 ng峄� c岷h, l岷 th么ng tin ng峄� c岷h li锚n quan 膽岷縩 膽岷 v脿o c峄 bi岷縩 n脿y.',
+        choosePlaceholder: 'Ch峄峮 bi岷縩 truy v岷',
+        noVar: 'Kh么ng c贸 bi岷縩',
+        noVarTip: 'Vui l貌ng t岷 m峄檛 bi岷縩 trong ph岷 Bi岷縩',
+        unableToQueryDataSet: 'Kh么ng th峄� truy v岷 ki岷縩 th峄ヽ',
+        unableToQueryDataSetTip: 'Kh么ng th峄� truy v岷 ki岷縩 th峄ヽ th脿nh c么ng, vui l貌ng ch峄峮 m峄檛 bi岷縩 truy v岷 ng峄� c岷h trong ph岷 ng峄� c岷h.',
+        ok: '膼峄搉g 媒',
+        contextVarNotEmpty: 'Bi岷縩 truy v岷 ng峄� c岷h kh么ng th峄� tr峄憂g',
+        deleteContextVarTitle: 'X贸a bi岷縩 "{{varName}}"?',
+        deleteContextVarTip: 'Bi岷縩 n脿y 膽茫 膽瓢峄 thi岷縯 l岷璸 l脿 bi岷縩 truy v岷 ng峄� c岷h, v脿 vi峄嘽 x贸a n贸 s岷� 岷h h瓢峄焠g 膽岷縩 vi峄嘽 s峄� d峄g b矛nh th瓢峄漬g c峄 ki岷縩 th峄ヽ. N岷縰 b岷 v岷玭 c岷 x贸a n贸, vui l貌ng ch峄峮 l岷 bi岷縩 kh谩c trong ph岷 ng峄� c岷h.',
+      },
+    },
+    tools: {
+      title: 'C么ng c峄�',
+      tips: 'C么ng c峄� cung c岷 ph瓢啤ng th峄ヽ g峄峣 API ti锚u chu岷﹏, s峄� d峄g 膽岷 v脿o c峄 ng瓢峄漣 d霉ng ho岷穋 bi岷縩 l脿m tham s峄� y锚u c岷 膽峄� truy v岷 d峄� li峄噓 b锚n ngo脿i nh瓢 ng峄� c岷h.',
+      toolsInUse: '膼ang s峄� d峄g {{count}} c么ng c峄�',
+      modal: {
+        title: 'C么ng c峄�',
+        toolType: {
+          title: 'Lo岷 c么ng c峄�',
+          placeholder: 'Vui l貌ng ch峄峮 lo岷 c么ng c峄�',
+        },
+        name: {
+          title: 'T锚n',
+          placeholder: 'Vui l貌ng nh岷璸 t锚n',
+        },
+        variableName: {
+          title: 'T锚n bi岷縩',
+          placeholder: 'Vui l貌ng nh岷璸 t锚n bi岷縩',
+        },
+      },
+    },
+    conversationHistory: {
+      title: 'L峄媍h s峄� cu峄檆 tr貌 chuy峄噉',
+      description: '膼岷穞 ti峄乶 t峄� cho c谩c vai tr貌 trong cu峄檆 tr貌 chuy峄噉',
+      tip: 'L峄媍h s峄� cu峄檆 tr貌 chuy峄噉 ch瓢a 膽瓢峄 b岷璽, vui l貌ng th锚m <histories> v脿o ph岷 prompt 峄� tr锚n.',
+      learnMore: 'T矛m hi峄僽 th锚m',
+      editModal: {
+        title: 'Ch峄塶h s峄璦 t锚n vai tr貌 trong cu峄檆 tr貌 chuy峄噉',
+        userPrefix: 'Ti峄乶 t峄� ng瓢峄漣 d霉ng',
+        assistantPrefix: 'Ti峄乶 t峄� tr峄� l媒',
+      },
+    },
+    toolbox: {
+      title: 'H峄楶 C脭NG C峄�',
+    },
+    moderation: {
+      title: 'Ki峄僲 duy峄噒 n峄檌 dung',
+      description: 'B岷 v峄� 膽岷 ra c峄 m么 h矛nh b岷眓g c谩ch s峄� d峄g API ki峄僲 duy峄噒 ho岷穋 danh s谩ch t峄� nh岷 c岷.',
+      allEnabled: '膼茫 b岷璽 ki峄僲 duy峄噒 n峄檌 dung 膼岷 V脌O/膼岷 RA',
+      inputEnabled: '膼茫 b岷璽 ki峄僲 duy峄噒 n峄檌 dung 膼岷 V脌O',
+      outputEnabled: '膼茫 b岷璽 ki峄僲 duy峄噒 n峄檌 dung 膼岷 RA',
+      modal: {
+        title: 'C脿i 膽岷穞 ki峄僲 duy峄噒 n峄檌 dung',
+        provider: {
+          title: 'Nh脿 cung c岷',
+          openai: 'Ki峄僲 duy峄噒 OpenAI',
+          openaiTip: {
+            prefix: 'Ki峄僲 duy峄噒 OpenAI y锚u c岷 c岷 h矛nh kh贸a API OpenAI trong ',
+            suffix: '.',
+          },
+          keywords: 'T峄� kh贸a',
+        },
+        keywords: {
+          tip: 'M峄梚 d貌ng m峄檛 t峄� kh贸a, ph芒n t谩ch b岷眓g d貌ng m峄沬. T峄慽 膽a 100 k媒 t峄� m峄梚 d貌ng.',
+          placeholder: 'M峄梚 d貌ng m峄檛 t峄� kh贸a, ph芒n t谩ch b岷眓g d貌ng m峄沬',
+          line: 'D貌ng',
+        },
+        content: {
+          input: 'Ki峄僲 duy峄噒 n峄檌 dung 膼岷 V脌O',
+          output: 'Ki峄僲 duy峄噒 n峄檌 dung 膼岷�U RA',
+          preset: 'C芒u tr岷� l峄漣 m岷玼',
+          placeholder: 'N峄檌 dung c芒u tr岷� l峄漣 m岷玼 峄� 膽芒y',
+          condition: '膼茫 b岷璽 铆t nh岷 m峄檛 ki峄僲 duy峄噒 n峄檌 dung 膼岷 V脌O v脿 膼岷 RA',
+          fromApi: 'C芒u tr岷� l峄漣 m岷玼 膽瓢峄 tr岷� v峄� b峄焛 API',
+          errorMessage: 'C芒u tr岷� l峄漣 m岷玼 kh么ng th峄� tr峄憂g',
+          supportMarkdown: 'H峄� tr峄� Markdown',
+        },
+        openaiNotConfig: {
+          before: 'Ki峄僲 duy峄噒 OpenAI y锚u c岷 c岷 h矛nh kh贸a API OpenAI trong',
+          after: '',
+        },
+      },
+    },
+  },
+  automatic: {
+    title: 'T峄� 膽峄檔g h贸a tri峄僴 khai 峄﹏g d峄g',
+    description: 'M么 t岷� t矛nh hu峄憂g c峄 b岷, Dify s岷� t峄� 膽峄檔g h贸a m峄檛 峄﹏g d峄g cho b岷.',
+    intendedAudience: '膼峄慽 t瓢峄g m峄 ti锚u l脿 ai?',
+    intendedAudiencePlaceHolder: 'V铆 d峄�: Sinh vi锚n',
+    solveProblem: 'H峄� hy v峄峮g AI c贸 th峄� gi岷 quy岷縯 v岷 膽峄� g矛?',
+    solveProblemPlaceHolder: 'V铆 d峄�: 膼谩nh gi谩 th脿nh t铆ch h峄峜 t岷璸',
+    generate: 'T岷',
+    audiencesRequired: 'Y锚u c岷 nh岷璸 膽峄慽 t瓢峄g m峄 ti锚u',
+    problemRequired: 'Y锚u c岷 nh岷璸 v岷 膽峄� c岷 gi岷 quy岷縯',
+    resTitle: 'Ch煤ng t么i 膽茫 t峄� 膽峄檔g h贸a 峄﹏g d峄g sau 膽芒y cho b岷.',
+    apply: '脕p d峄g t峄� 膽峄檔g h贸a n脿y',
+    noData: 'M么 t岷� t矛nh hu峄憂g s峄� d峄g c峄 b岷 峄� b锚n tr谩i, xem tr瓢峄沜 t峄� 膽峄檔g h贸a s岷� hi峄僴 th峄� 峄� 膽芒y.',
+    loading: '膼ang t峄� 膽峄檔g h贸a 峄﹏g d峄g cho b岷...',
+    overwriteTitle: 'Ghi 膽猫 c岷 h矛nh hi峄噉 t岷?',
+    overwriteMessage: '脕p d峄g t峄� 膽峄檔g h贸a n脿y s岷� ghi 膽猫 l锚n c岷 h矛nh hi峄噉 t岷.',
+  },
+  resetConfig: {
+    title: 'X谩c nh岷璶 膽岷穞 l岷?',
+    message: '膼岷穞 l岷 s岷� lo岷 b峄� c谩c thay 膽峄昳, kh么i ph峄 c岷 h矛nh 膽茫 xu岷 b岷 l岷 cu峄慽.',
+  },
+  errorMessage: {
+    nameOfKeyRequired: 'T锚n c峄 kh贸a: {{key}} l脿 b岷痶 bu峄檆',
+    valueOfVarRequired: 'Gi谩 tr峄� {{key}} kh么ng th峄� tr峄憂g',
+    queryRequired: 'V膬n b岷 y锚u c岷 l脿 b岷痶 bu峄檆.',
+    waitForResponse: 'Vui l貌ng 膽峄 ph岷 h峄搃 c峄 tin nh岷痭 tr瓢峄沜 膽峄� ho脿n th脿nh.',
+    waitForBatchResponse: 'Vui l貌ng 膽峄 ph岷 h峄搃 c峄 t谩c v峄� h脿ng lo岷 膽峄� ho脿n th脿nh.',
+    notSelectModel: 'Vui l貌ng ch峄峮 m峄檛 m么 h矛nh',
+    waitForImgUpload: 'Vui l貌ng 膽峄 h矛nh 岷h 膽瓢峄 t岷 l锚n',
+  },
+  chatSubTitle: 'H瓢峄沶g d岷玭',
+  completionSubTitle: 'Ti峄乶 t峄� l峄漣 nh岷痗',
+  promptTip: 'L峄漣 nh岷痗 h瓢峄沶g d岷玭 c谩c ph岷 h峄搃 c峄 AI v峄沬 h瓢峄沶g d岷玭 v脿 r脿ng bu峄檆. Ch猫n bi岷縩 nh瓢 {{input}}. L峄漣 nh岷痗 n脿y s岷� kh么ng 膽瓢峄 hi峄僴 th峄� cho ng瓢峄漣 d霉ng.',
+  formattingChangedTitle: '膼峄媙h d岷g 膽茫 thay 膽峄昳',
+  formattingChangedText: 'Thay 膽峄昳 膽峄媙h d岷g s岷� 膽岷穞 l岷 khu v峄眂 g峄� l峄梚, b岷 c贸 ch岷痗 ch岷痭 kh么ng?',
+  variableTitle: 'Bi岷縩',
+  variableTip: 'Ng瓢峄漣 d霉ng 膽i峄乶 c谩c bi岷縩 v脿o m峄檛 bi峄僽 m岷玼, t峄� 膽峄檔g thay th岷� c谩c bi岷縩 trong l峄漣 nh岷痗.',
+  notSetVar: 'Bi岷縩 cho ph茅p ng瓢峄漣 d霉ng 膽瓢a ra t峄� kh贸a l峄漣 nh岷痗 ho岷穋 m峄� 膽岷 khi 膽i峄乶 v脿o bi峄僽 m岷玼. B岷 c贸 th峄� th峄� nh岷璸 "{{input}}" trong c谩c t峄� kh贸a l峄漣 nh岷痗.',
+  autoAddVar: 'Ph谩t hi峄噉 bi岷縩 kh么ng x谩c 膽峄媙h 膽瓢峄 tham chi岷縰 trong ti峄乶-l峄漣 nh岷痗, b岷 c贸 mu峄憂 th锚m ch煤ng v脿o bi峄僽 m岷玼 膽岷 v脿o ng瓢峄漣 d霉ng kh么ng?',
+  variableTable: {
+    key: 'Kh贸a bi岷縩',
+    name: 'T锚n tr瓢峄漬g nh岷璸 li峄噓 ng瓢峄漣 d霉ng',
+    optional: 'T霉y ch峄峮',
+    type: 'Lo岷 nh岷璸 li峄噓',
+    action: 'H脿nh 膽峄檔g',
+    typeString: 'Chu峄梚',
+    typeSelect: 'L峄盿 ch峄峮',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{key}} l脿 b岷痶 bu峄檆',
+    tooLong: '{{key}} qu谩 d脿i. Kh么ng th峄� d脿i h啤n 30 k媒 t峄�',
+    notValid: '{{key}} kh么ng h峄 l峄�. Ch峄� c贸 th峄� ch峄゛ ch峄� c谩i, s峄�, v脿 d岷 g岷h d瓢峄沬',
+    notStartWithNumber: '{{key}} kh么ng th峄� b岷痶 膽岷 b岷眓g s峄�',
+    keyAlreadyExists: '{{key}} 膽茫 t峄搉 t岷',
+  },
+  otherError: {
+    promptNoBeEmpty: 'L峄漣 nh岷痗 kh么ng th峄� tr峄憂g',
+    historyNoBeEmpty: 'L峄媍h s峄� cu峄檆 tr貌 chuy峄噉 ph岷 膽瓢峄 thi岷縯 l岷璸 trong l峄漣 nh岷痗',
+    queryNoBeEmpty: 'Truy v岷 ph岷 膽瓢峄 thi岷縯 l岷璸 trong l峄漣 nh岷痗',
+  },
+  variableConfig: {
+    'addModalTitle': 'Th锚m tr瓢峄漬g nh岷璸',
+    'editModalTitle': 'Ch峄塶h s峄璦 tr瓢峄漬g nh岷璸',
+    'description': 'C脿i 膽岷穞 cho bi岷縩 {{varName}}',
+    'fieldType': 'Lo岷 tr瓢峄漬g',
+    'string': 'V膬n b岷 ng岷痭',
+    'text-input': 'V膬n b岷 ng岷痭',
+    'paragraph': '膼o岷 v膬n',
+    'select': 'L峄盿 ch峄峮',
+    'number': 'S峄�',
+    'notSet': 'Ch瓢a thi岷縯 l岷璸, h茫y th峄� nh岷璸 {{input}} trong g峄 媒 ti峄乶 t峄�',
+    'stringTitle': 'T霉y ch峄峮 h峄檖 v膬n b岷 bi峄僽 m岷玼',
+    'maxLength': '膼峄� d脿i t峄慽 膽a',
+    'options': 'T霉y ch峄峮',
+    'addOption': 'Th锚m t霉y ch峄峮',
+    'apiBasedVar': 'Bi岷縩 d峄盿 tr锚n API',
+    'varName': 'T锚n bi岷縩',
+    'labelName': 'T锚n nh茫n',
+    'inputPlaceholder': 'Vui l貌ng nh岷璸',
+    'required': 'B岷痶 bu峄檆',
+    'errorMsg': {
+      varNameRequired: 'T锚n bi岷縩 l脿 b岷痶 bu峄檆',
+      labelNameRequired: 'T锚n nh茫n l脿 b岷痶 bu峄檆',
+      varNameCanBeRepeat: 'T锚n bi岷縩 kh么ng 膽瓢峄 tr霉ng l岷穚',
+      atLeastOneOption: 'C岷 铆t nh岷 m峄檛 t霉y ch峄峮',
+      optionRepeat: 'C贸 c谩c t霉y ch峄峮 tr霉ng l岷穚',
+    },
+  },
+  vision: {
+    name: 'Th峄� gi谩c',
+    description: 'Cho ph茅p t铆nh n膬ng th峄� gi谩c s岷� cho ph茅p m么 h矛nh nh岷璶 di峄噉 h矛nh 岷h v脿 tr岷� l峄漣 c谩c c芒u h峄廼 v峄� ch煤ng.',
+    settings: 'C脿i 膽岷穞',
+    visionSettings: {
+      title: 'C脿i 膽岷穞 th峄� gi谩c',
+      resolution: '膼峄� ph芒n gi岷',
+      resolutionTooltip: `膼峄� ph芒n gi岷 th岷 s岷� cho ph茅p m么 h矛nh nh岷璶 m峄檛 phi锚n b岷 h矛nh 岷h 512 x 512 th岷 h啤n, v脿 膽岷 di峄噉 cho h矛nh 岷h v峄沬 ng芒n s谩ch 65 token. 膼i峄乽 n脿y cho ph茅p API tr岷� v峄� ph岷 h峄搃 nhanh h啤n v脿 ti锚u th峄� 铆t token 膽岷 v脿o cho c谩c tr瓢峄漬g h峄 s峄� d峄g kh么ng y锚u c岷 chi ti岷縯 cao.
+      \n
+      膼峄� ph芒n gi岷 cao s岷� 膽岷 ti锚n cho ph茅p m么 h矛nh nh矛n th岷 h矛nh 岷h th岷 h啤n v脿 sau 膽贸 t岷 ra c谩c c岷痶 chi ti岷縯 c峄 h矛nh 岷h 膽岷 v脿o d瓢峄沬 d岷g h矛nh vu么ng 512px d峄盿 tr锚n k铆ch th瓢峄沜 h矛nh 岷h 膽岷 v脿o. M峄梚 c岷痶 chi ti岷縯 s峄� d峄g hai l岷 ng芒n s谩ch token cho t峄昻g c峄檔g 129 token.`,
+      high: 'Cao',
+      low: 'Th岷',
+      uploadMethod: 'Ph瓢啤ng th峄ヽ t岷 l锚n',
+      both: 'C岷� hai',
+      localUpload: 'T岷 l锚n n峄檌 b峄�',
+      url: 'URL',
+      uploadLimit: 'Gi峄沬 h岷 t岷 l锚n',
+    },
+  },
+  voice: {
+    name: 'Gi峄峮g n贸i',
+    defaultDisplay: 'Gi峄峮g m岷穋 膽峄媙h',
+    description: 'C脿i 膽岷穞 chuy峄僴 膽峄昳 v膬n b岷 th脿nh gi峄峮g n贸i',
+    settings: 'C脿i 膽岷穞',
+    voiceSettings: {
+      title: 'C脿i 膽岷穞 gi峄峮g n贸i',
+      language: 'Ng么n ng峄�',
+      resolutionTooltip: 'Chuy峄僴 膽峄昳 v膬n b岷 th脿nh gi峄峮g n贸i h峄� tr峄� ng么n ng峄�.',
+      voice: 'Gi峄峮g n贸i',
+      autoPlay: 'T峄� 膽峄檔g ph谩t',
+      autoPlayEnabled: '膼茫 b岷璽',
+      autoPlayDisabled: '膼茫 t岷痶',
+    },
+  },
+  openingStatement: {
+    title: 'M峄� 膽岷 cu峄檆 tr貌 chuy峄噉',
+    add: 'Th锚m',
+    writeOpener: 'Vi岷縯 c芒u m峄� 膽岷',
+    placeholder: 'Vi岷縯 th么ng 膽i峄噋 m峄� 膽岷 c峄 b岷 峄� 膽芒y, b岷 c贸 th峄� s峄� d峄g bi岷縩, h茫y th峄� nh岷璸 {{bi岷縩}}.',
+    openingQuestion: 'C芒u h峄廼 m峄� 膽岷',
+    noDataPlaceHolder: 'B岷痶 膽岷 cu峄檆 tr貌 chuy峄噉 v峄沬 ng瓢峄漣 d霉ng c贸 th峄� gi煤p AI thi岷縯 l岷璸 m峄慽 quan h峄� g岷 g农i h啤n v峄沬 h峄� trong c谩c 峄﹏g d峄g tr貌 chuy峄噉.',
+    varTip: 'B岷 c贸 th峄� s峄� d峄g bi岷縩, h茫y th峄� nh岷璸 {{bi岷縩}}',
+    tooShort: 'C岷 铆t nh岷 20 t峄� trong l峄漣 nh岷痗 ban 膽岷 膽峄� t岷 ra c谩c c芒u m峄� 膽岷 cho cu峄檆 tr貌 chuy峄噉.',
+    notIncludeKey: 'L峄漣 nh岷痗 ban 膽岷 kh么ng bao g峄搈 bi岷縩: {{key}}. Vui l貌ng th锚m n贸 v脿o l峄漣 nh岷痗 ban 膽岷.',
+  },
+  modelConfig: {
+    model: 'M么 h矛nh',
+    setTone: 'Thi岷縯 l岷璸 gi峄峮g 膽i峄噓 c峄 ph岷 h峄搃',
+    title: 'M么 h矛nh v脿 tham s峄�',
+    modeType: {
+      chat: 'Tr貌 chuy峄噉',
+      completion: 'Ho脿n th脿nh',
+    },
+  },
+  inputs: {
+    title: 'G峄� l峄梚 v脿 xem tr瓢峄沜',
+    noPrompt: 'H茫y th峄� vi岷縯 m峄檛 s峄� l峄漣 nh岷痗 trong tr瓢峄漬g ti峄乶-l峄漣 nh岷痗',
+    userInputField: 'Tr瓢峄漬g nh岷璸 li峄噓 ng瓢峄漣 d霉ng',
+    noVar: '膼i峄乶 v脿o gi谩 tr峄� c峄 bi岷縩, n贸 s岷� t峄� 膽峄檔g thay th岷� t峄� kh贸a l峄漣 nh岷痗 m峄梚 khi b岷痶 膽岷 phi锚n m峄沬.',
+    chatVarTip: '膼i峄乶 v脿o gi谩 tr峄� c峄 bi岷縩, n贸 s岷� t峄� 膽峄檔g thay th岷� t峄� kh贸a l峄漣 nh岷痗 m峄梚 khi b岷痶 膽岷 phi锚n m峄沬',
+    completionVarTip: '膼i峄乶 v脿o gi谩 tr峄� c峄 bi岷縩, n贸 s岷� t峄� 膽峄檔g thay th岷� t峄� kh贸a l峄漣 nh岷痗 m峄梚 khi m峄檛 c芒u h峄廼 膽瓢峄 g峄璱.',
+    previewTitle: 'Xem tr瓢峄沜 l峄漣 nh岷痗',
+    queryTitle: 'N峄檌 dung truy v岷',
+    queryPlaceholder: 'Vui l貌ng nh岷璸 v膬n b岷 y锚u c岷.',
+    run: 'CH岷燳',
+  },
+  result: 'V膬n b岷 膽岷 ra',
+  datasetConfig: {
+    settingTitle: 'C脿i 膽岷穞 truy xu岷',
+    knowledgeTip: 'Nh岷 v脿o n煤t "+" 膽峄� th锚m ki岷縩 th峄ヽ',
+    retrieveOneWay: {
+      title: 'Truy xu岷 N-to-1',
+      description: 'D峄盿 tr锚n 媒 膽峄媙h c峄 ng瓢峄漣 d霉ng v脿 m么 t岷� ki岷縩 th峄ヽ, Agent t峄� 膽峄檔g ch峄峮 ki岷縩 th峄ヽ t峄憈 nh岷 膽峄� truy v岷. Ph霉 h峄 nh岷 cho c谩c 峄﹏g d峄g c贸 ki岷縩 th峄ヽ c峄� th峄�, gi峄沬 h岷.',
+    },
+    retrieveMultiWay: {
+      title: 'Truy xu岷 膽a h瓢峄沶g',
+      description: 'D峄盿 tr锚n 媒 膽峄媙h c峄 ng瓢峄漣 d霉ng, truy v岷 qua t岷 c岷� ki岷縩 th峄ヽ, truy xu岷 v膬n b岷 li锚n quan t峄� nhi峄乽 ngu峄搉 v脿 ch峄峮 ra k岷縯 qu岷� t峄憈 nh岷 ph霉 h峄 v峄沬 truy v岷 c峄 ng瓢峄漣 d霉ng sau khi s岷痯 x岷縫 l岷. Y锚u c岷 c岷 h矛nh c峄 API m么 h矛nh Rerank.',
+    },
+    rerankModelRequired: 'M么 h矛nh Rerank l脿 b岷痶 bu峄檆',
+    params: 'Tham s峄�',
+    top_k: 'Top K',
+    top_kTip: 'S峄� d峄g 膽峄� l峄峜 c谩c ph岷 ch铆nh x谩c nh岷 v峄沬 c芒u h峄廼 c峄 ng瓢峄漣 d霉ng. H峄� th峄憂g c农ng s岷� t峄� 膽峄檔g 膽i峄乽 ch峄塶h gi谩 tr峄� c峄 Top K, theo max_tokens c峄 m么 h矛nh 膽茫 ch峄峮.',
+    score_threshold: 'Ng瓢峄g 膽i峄僲',
+    score_thresholdTip: 'S峄� d峄g 膽峄� thi岷縯 l岷璸 ng瓢峄g t瓢啤ng 膽峄搉g cho vi峄嘽 l峄峜 c谩c ph岷.',
+    retrieveChangeTip: 'Thay 膽峄昳 ch岷� 膽峄� ch峄� m峄 v脿 ch岷� 膽峄� truy xu岷 c贸 th峄� 岷h h瓢峄焠g 膽岷縩 c谩c 峄﹏g d峄g li锚n quan 膽岷縩 ki岷縩 th峄ヽ n脿y.',
+  },
+  debugAsSingleModel: 'G峄� l峄梚 nh瓢 m峄檛 m么 h矛nh',
+  debugAsMultipleModel: 'G峄� l峄梚 nh瓢 nhi峄乽 m么 h矛nh',
+  duplicateModel: 'Sao ch茅p',
+  publishAs: 'Xu岷 b岷 d瓢峄沬 d岷g',
+  assistantType: {
+    name: 'Lo岷 tr峄� l媒',
+    chatAssistant: {
+      name: 'Tr峄� l媒 c啤 b岷',
+      description: 'X芒y d峄眓g m峄檛 tr峄� l媒 d峄盿 tr锚n tr貌 chuy峄噉 s峄� d峄g m峄檛 M么 h矛nh Ng么n ng峄� L峄沶.',
+    },
+    agentAssistant: {
+      name: 'Tr峄� l媒 t谩c nh芒n',
+      description: 'X芒y d峄眓g m峄檛 t谩c nh芒n th么ng minh c贸 th峄� t峄� 膽峄檔g ch峄峮 c谩c c么ng c峄� 膽峄� ho脿n th脿nh c谩c nhi峄噈 v峄�.',
+    },
+  },
+  agent: {
+    agentMode: 'Ch岷� 膽峄� t谩c nh芒n',
+    agentModeDes: 'Thi岷縯 l岷璸 lo岷 ch岷� 膽峄� suy lu岷璶 cho t谩c nh芒n',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: 'G峄峣 h脿m',
+    },
+    setting: {
+      name: 'Thi岷縯 l岷璸 t谩c nh芒n',
+      description: 'Thi岷縯 l岷璸 t谩c nh芒n cho ph茅p c岷 h矛nh ch岷� 膽峄� t谩c nh芒n v脿 c谩c t铆nh n膬ng n芒ng cao nh瓢 l峄漣 nh岷痗 t铆ch h峄 s岷祅, ch峄� c贸 s岷祅 trong lo岷 T谩c nh芒n.',
+      maximumIterations: {
+        name: 'S峄� l岷 l岷穚 t峄慽 膽a',
+        description: 'Gi峄沬 h岷 s峄� l岷 l岷穚 m脿 m峄檛 tr峄� l媒 t谩c nh芒n c贸 th峄� th峄眂 hi峄噉',
+      },
+    },
+    buildInPrompt: 'L峄漣 nh岷痗 t铆ch h峄',
+    firstPrompt: 'L峄漣 nh岷痗 膽岷 ti锚n',
+    nextIteration: 'L岷 l岷穚 ti岷縫 theo',
+    promptPlaceholder: 'Vi岷縯 l峄漣 nh岷痗 c峄 b岷 峄� 膽芒y',
+    tools: {
+      name: 'C么ng c峄�',
+      description: 'S峄� d峄g c么ng c峄� c贸 th峄� m峄� r峄檔g kh岷� n膬ng c峄 LLM, nh瓢 t矛m ki岷縨 tr锚n internet ho岷穋 th峄眂 hi峄噉 c谩c ph茅p t铆nh khoa h峄峜',
+      enabled: '膼茫 k铆ch ho岷',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/vi-VN/app-log.ts b/i18n/vi-VN/app-log.ts
new file mode 100644
index 0000000..48ae315
--- /dev/null
+++ b/i18n/vi-VN/app-log.ts
@@ -0,0 +1,100 @@
+const translation = {
+  title: 'Nh岷璽 k媒',
+  description: 'Nh岷璽 k媒 ghi l岷 tr岷g th谩i ho岷 膽峄檔g c峄 峄﹏g d峄g, bao g峄搈 膽岷 v脿o c峄 ng瓢峄漣 d霉ng v脿 ph岷 h峄搃 c峄 tr铆 tu峄� nh芒n t岷.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: 'Th峄漣 gian c岷璸 nh岷璽',
+      time: 'Th峄漣 gian t岷',
+      endUser: 'Ng瓢峄漣 d霉ng cu峄慽 ho岷穋 t脿i kho岷',
+      input: '膼岷 v脿o',
+      output: '膼岷 ra',
+      summary: 'T贸m t岷痶',
+      messageCount: 'S峄� l瓢峄g tin nh岷痭',
+      userRate: '膼谩nh gi谩 ng瓢峄漣 d霉ng',
+      adminRate: '膼谩nh gi谩 qu岷 tr峄� vi锚n',
+      startTime: 'TH峄淚 GIAN B岷甌 膼岷',
+      status: 'TR岷燦G TH脕I',
+      runtime: 'TH峄淚 GIAN CH岷燳',
+      tokens: 'TOKEN',
+      user: 'NG漂峄淚 D脵NG CU峄怚 HO岷禖 T脌I KHO岷',
+      version: 'PHI脢N B岷',
+    },
+    pagination: {
+      previous: 'Tr瓢峄沜',
+      next: 'Sau',
+    },
+    empty: {
+      noChat: 'Ch瓢a c贸 cu峄檆 tr貌 chuy峄噉',
+      noOutput: 'Kh么ng c贸 膽岷 ra',
+      element: {
+        title: 'Ch瓢a c贸 d峄� li峄噓',
+        content: 'Quan s谩t v脿 ch煤 th铆ch c谩c t瓢啤ng t谩c gi峄痑 ng瓢峄漣 d霉ng cu峄慽 v脿 峄﹏g d峄g tr铆 tu峄� nh芒n t岷 峄� 膽芒y 膽峄� li锚n t峄 c岷 thi峄噉 膽峄� ch铆nh x谩c c峄 AI. B岷 c贸 th峄� th峄� <shareLink>chia s岷�</shareLink> ho岷穋 <testLink>ki峄僲 tra</testLink> 峄﹏g d峄g Web, sau 膽贸 quay l岷 trang n脿y.',
+      },
+    },
+  },
+  detail: {
+    time: 'Th峄漣 gian',
+    conversationId: 'ID cu峄檆 tr貌 chuy峄噉',
+    promptTemplate: 'M岷玼 l峄漣 nh岷痗',
+    promptTemplateBeforeChat: 'M岷玼 l峄漣 nh岷痗 tr瓢峄沜 tr貌 chuy峄噉 路 Tin nh岷痭 h峄� th峄憂g',
+    annotationTip: 'C岷 thi峄噉 膽瓢峄 膽谩nh d岷 b峄焛 {{user}}',
+    timeConsuming: '',
+    second: 'gi芒y',
+    tokenCost: 'Chi ph铆 token',
+    loading: '膼ang t岷',
+    operation: {
+      like: 'Th铆ch',
+      dislike: 'Kh么ng th铆ch',
+      addAnnotation: 'Th锚m ch煤 th铆ch',
+      editAnnotation: 'Ch峄塶h s峄璦 ch煤 th铆ch',
+      annotationPlaceholder: 'Nh岷璸 c芒u tr岷� l峄漣 mong mu峄憂 t峄� AI. 膼i峄乽 n脿y s岷� 膽瓢峄 s峄� d峄g 膽峄� 膽i峄乽 ch峄塶h m么 h矛nh v脿 c岷 thi峄噉 ch岷 l瓢峄g sinh v膬n b岷 trong t瓢啤ng lai.',
+    },
+    variables: 'Bi岷縩',
+    uploadImages: '岷h 膽茫 t岷 l锚n',
+    modelParams: 'Th么ng s峄� m么 h矛nh',
+  },
+  filter: {
+    period: {
+      today: 'H么m nay',
+      last7days: '7 ng脿y qua',
+      last4weeks: '4 tu岷 qua',
+      last3months: '3 th谩ng qua',
+      last12months: '12 th谩ng qua',
+      monthToDate: 'Th谩ng hi峄噉 t岷',
+      quarterToDate: 'Qu媒 hi峄噉 t岷',
+      yearToDate: 'N膬m hi峄噉 t岷',
+      allTime: 'T岷 c岷� th峄漣 gian',
+    },
+    annotation: {
+      all: 'T岷 c岷�',
+      annotated: '膼茫 ch煤 th铆ch ({{count}} m峄)',
+      not_annotated: 'Ch瓢a ch煤 th铆ch',
+    },
+    sortBy: 'S岷痯 x岷縫 theo:',
+    descending: 'gi岷 d岷',
+    ascending: 't膬ng d岷',
+  },
+  workflowTitle: 'Nh岷璽 k媒 quy tr矛nh l脿m vi峄嘽',
+  workflowSubtitle: 'Nh岷璽 k媒 ghi l岷 ho岷 膽峄檔g c峄 T峄� 膽峄檔g h贸a.',
+  runDetail: {
+    title: 'Nh岷璽 k媒 cu峄檆 tr貌 chuy峄噉',
+    workflowTitle: 'Chi ti岷縯 nh岷璽 k媒',
+    fileListDetail: 'Chi ti岷縯',
+    fileListLabel: 'Chi ti岷縯 t峄噋',
+  },
+  promptLog: 'Nh岷璽 k媒 l峄漣 nh岷痗',
+  AgentLog: 'Nh岷璽 k媒 t谩c nh芒n',
+  viewLog: 'Xem nh岷璽 k媒',
+  agentLogDetail: {
+    AgentMode: 'Ch岷� 膽峄� t谩c nh芒n',
+    toolUsed: 'C么ng c峄� 膽茫 s峄� d峄g',
+    iterations: 'S峄� l岷 l岷穚',
+    iteration: 'L岷 l岷穚',
+    finalProcessing: 'X峄� l媒 cu峄慽 c霉ng',
+    agentMode: 'Ch岷� 膽峄� 膽岷 l媒',
+  },
+  agentLog: 'Nh岷璽 k媒 膽岷 l媒',
+}
+
+export default translation
diff --git a/i18n/vi-VN/app-overview.ts b/i18n/vi-VN/app-overview.ts
new file mode 100644
index 0000000..a0b7bd0
--- /dev/null
+++ b/i18n/vi-VN/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: '膼峄� b岷痶 膽岷,',
+    enterKeyTip: 'nh岷璸 kh贸a API OpenAI c峄 b岷 b锚n d瓢峄沬',
+    getKeyTip: 'L岷 kh贸a API t峄� b岷g 膽i峄乽 khi峄僴 OpenAI',
+    placeholder: 'Kh贸a API OpenAI c峄 b岷 (v铆 d峄�: sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: 'B岷 膽ang s峄� d峄g g贸i d霉ng th峄� c峄 {{providerName}}.',
+        description: 'G贸i d霉ng th峄� 膽瓢峄 cung c岷 膽峄� b岷 ki峄僲 tra. Tr瓢峄沜 khi h岷縯 l瓢峄 g峄峣 c峄 g贸i d霉ng th峄�, vui l貌ng thi岷縯 l岷璸 nh脿 cung c岷 m么 h矛nh ri锚ng ho岷穋 mua th锚m h岷 m峄ヽ.',
+      },
+      exhausted: {
+        title: 'G贸i d霉ng th峄� c峄 b岷 膽茫 h岷縯, vui l貌ng thi岷縯 l岷璸 kh贸a API c峄 b岷.',
+        description: 'G贸i d霉ng th峄� c峄 b岷 膽茫 h岷縯. Vui l貌ng thi岷縯 l岷璸 nh脿 cung c岷 m么 h矛nh ri锚ng ho岷穋 mua th锚m h岷 m峄ヽ.',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: '膼峄� b岷痶 膽岷,',
+        row2: 'h茫y thi岷縯 l岷璸 nh脿 cung c岷 m么 h矛nh c峄 b岷 tr瓢峄沜.',
+      },
+    },
+    callTimes: 'S峄� l岷 g峄峣',
+    usedToken: 'Token 膽茫 s峄� d峄g',
+    setAPIBtn: 'Thi岷縯 l岷璸 nh脿 cung c岷 m么 h矛nh',
+    tryCloud: 'Ho岷穋 d霉ng th峄� phi锚n b岷 膽谩m m芒y c峄 Dify v峄沬 g贸i mi峄卬 ph铆',
+  },
+  overview: {
+    title: 'T峄昻g quan',
+    appInfo: {
+      explanation: '峄╪g d峄g web AI s岷祅 s脿ng s峄� d峄g',
+      accessibleAddress: '膼峄媋 ch峄� c么ng khai',
+      preview: 'Xem tr瓢峄沜',
+      regenerate: 'T岷 l岷',
+      regenerateNotice: 'B岷 c贸 mu峄憂 t岷 l岷 膽峄媋 ch峄� c么ng khai kh么ng?',
+      preUseReminder: 'Vui l貌ng k铆ch ho岷 峄﹏g d峄g web tr瓢峄沜 khi ti岷縫 t峄.',
+      settings: {
+        entry: 'C脿i 膽岷穞',
+        title: 'C脿i 膽岷穞 峄﹏g d峄g web',
+        webName: 'T锚n 峄﹏g d峄g web',
+        webDesc: 'M么 t岷� 峄﹏g d峄g web',
+        webDescTip: 'V膬n b岷 n脿y s岷� hi峄僴 th峄� 峄� ph铆a ng瓢峄漣 d霉ng, cung c岷 h瓢峄沶g d岷玭 c啤 b岷 v峄� c谩ch s峄� d峄g 峄﹏g d峄g',
+        webDescPlaceholder: 'Nh岷璸 m么 t岷� c峄 峄﹏g d峄g web',
+        language: 'Ng么n ng峄�',
+        workflow: {
+          title: 'C谩c b瓢峄沜 quy tr矛nh',
+          show: 'Hi峄僴 th峄�',
+          hide: '岷╪',
+          showDesc: 'Hi峄僴 th峄� ho岷穋 岷﹏ chi ti岷縯 d貌ng c么ng vi峄嘽 trong WebApp',
+          subTitle: 'Chi ti岷縯 quy tr矛nh l脿m vi峄嘽',
+        },
+        chatColorTheme: 'Giao di峄噉 m脿u tr貌 chuy峄噉',
+        chatColorThemeDesc: 'Thi岷縯 l岷璸 giao di峄噉 m脿u c峄 chatbot',
+        chatColorThemeInverted: '膼岷 ng瓢峄',
+        invalidHexMessage: 'Gi谩 tr峄� m茫 m脿u kh么ng h峄 l峄�',
+        invalidPrivacyPolicy: 'Li锚n k岷縯 ch铆nh s谩ch b岷 m岷璽 kh么ng h峄 l峄�. Vui l貌ng s峄� d峄g li锚n k岷縯 h峄 l峄� b岷痶 膽岷 b岷眓g http ho岷穋 https',
+        more: {
+          entry: 'Hi峄僴 th峄� th锚m c脿i 膽岷穞',
+          copyright: 'B岷 quy峄乶',
+          copyRightPlaceholder: 'Nh岷璸 t锚n t谩c gi岷� ho岷穋 t峄� ch峄ヽ',
+          privacyPolicy: 'Ch铆nh s谩ch b岷 m岷璽',
+          privacyPolicyPlaceholder: 'Nh岷璸 li锚n k岷縯 ch铆nh s谩ch b岷 m岷璽',
+          privacyPolicyTip: 'Gi煤p ng瓢峄漣 d霉ng hi峄僽 d峄� li峄噓 m脿 峄﹏g d峄g thu th岷璸, xem <privacyPolicyLink>Ch铆nh s谩ch b岷 m岷璽</privacyPolicyLink> c峄 Dify.',
+          customDisclaimer: 'Tuy锚n b峄� t峄� ch峄慽 tr谩ch nhi峄噈 t霉y ch峄塶h',
+          customDisclaimerPlaceholder: 'Nh岷璸 li锚n k岷縯 tuy锚n b峄� t峄� ch峄慽 tr谩ch nhi峄噈',
+          customDisclaimerTip: 'Li锚n k岷縯 n脿y s岷� hi峄僴 th峄� 峄� ph铆a ng瓢峄漣 d霉ng, cung c岷 th么ng tin v峄� tr谩ch nhi峄噈 c峄 峄﹏g d峄g',
+          copyrightTip: 'Hi峄僴 th峄� th么ng tin b岷 quy峄乶 trong 峄﹏g d峄g web',
+          copyrightTooltip: 'Vui l貌ng n芒ng c岷 l锚n g贸i Professional tr峄� l锚n',
+        },
+        sso: {
+          title: 'SSO 峄﹏g d峄g web',
+          description: 'T岷 c岷� ng瓢峄漣 d霉ng 膽瓢峄 y锚u c岷 膽膬ng nh岷璸 b岷眓g SSO tr瓢峄沜 khi s峄� d峄g WebApp',
+          tooltip: 'Li锚n h峄� v峄沬 qu岷 tr峄� vi锚n 膽峄� b岷璽 SSO WebApp',
+          label: 'X谩c th峄眂 SSO',
+        },
+        modalTip: 'C脿i 膽岷穞 峄﹏g d峄g web ph铆a m谩y kh谩ch.',
+      },
+      embedded: {
+        entry: 'Nh煤ng',
+        title: 'Nh煤ng v脿o trang web',
+        explanation: 'Ch峄峮 c谩ch nh煤ng 峄﹏g d峄g tr貌 chuy峄噉 v脿o trang web c峄 b岷',
+        iframe: '膼峄� th锚m 峄﹏g d峄g tr貌 chuy峄噉 v脿o b岷 k峄� 膽芒u tr锚n trang web c峄 b岷, h茫y th锚m iframe n脿y v脿o m茫 HTML c峄 b岷.',
+        scripts: '膼峄� th锚m 峄﹏g d峄g tr貌 chuy峄噉 v脿o g贸c d瓢峄沬 b锚n ph岷 c峄 trang web, th锚m m茫 n脿y v脿o m茫 HTML c峄 b岷.',
+        chromePlugin: 'C脿i 膽岷穞 ti峄噉 铆ch m峄� r峄檔g Dify Chatbot cho Chrome',
+        copied: '膼茫 sao ch茅p',
+        copy: 'Sao ch茅p',
+      },
+      qrcode: {
+        title: 'M茫 QR 膽峄� chia s岷�',
+        scan: 'Qu茅t v脿 chia s岷� 峄﹏g d峄g',
+        download: 'T岷 xu峄憂g m茫 QR',
+      },
+      customize: {
+        way: 'c谩ch',
+        entry: 'T霉y ch峄塶h',
+        title: 'T霉y ch峄塶h 峄﹏g d峄g web AI',
+        explanation: 'B岷 c贸 th峄� t霉y ch峄塶h giao di峄噉 c峄 峄﹏g d峄g web 膽峄� ph霉 h峄 v峄沬 k峄媍h b岷 v脿 phong c谩ch mong mu峄憂.',
+        way1: {
+          name: 'Fork m茫 ngu峄搉 ph铆a client, s峄璦 膽峄昳 v脿 tri峄僴 khai l锚n Vercel (khuy岷縩 ngh峄�)',
+          step1: 'Fork m茫 ngu峄搉 ph铆a client v脿 s峄璦 膽峄昳',
+          step1Tip: 'Nh岷 v脿o 膽芒y 膽峄� fork m茫 ngu峄搉 v脿o t脿i kho岷 GitHub c峄 b岷 v脿 s峄璦 膽峄昳',
+          step1Operation: 'Dify-WebClient',
+          step2: 'Tri峄僴 khai l锚n Vercel',
+          step2Tip: 'Nh岷 v脿o 膽芒y 膽峄� nh岷璸 kho l瓢u tr峄� v脿o Vercel v脿 tri峄僴 khai',
+          step2Operation: 'Nh岷璸 kho l瓢u tr峄�',
+          step3: 'C岷 h矛nh bi岷縩 m么i tr瓢峄漬g',
+          step3Tip: 'Th锚m c谩c bi岷縩 m么i tr瓢峄漬g sau v脿o Vercel',
+        },
+        way2: {
+          name: 'Vi岷縯 m茫 ph铆a client 膽峄� g峄峣 API v脿 tri峄僴 khai l锚n m谩y ch峄�',
+          operation: 'T脿i li峄噓',
+        },
+      },
+      launch: 'Ph贸ng',
+    },
+    apiInfo: {
+      title: 'API d峄媍h v峄� backend',
+      explanation: 'D峄� d脿ng t铆ch h峄 v脿o 峄﹏g d峄g c峄 b岷',
+      accessibleAddress: '膼i峄僲 cu峄慽 d峄媍h v峄� API',
+      doc: 'T脿i li峄噓 tham kh岷 API',
+    },
+    status: {
+      running: '膼ang ho岷 膽峄檔g',
+      disable: '膼茫 t岷痶',
+    },
+  },
+  analysis: {
+    title: 'Ph芒n t铆ch',
+    ms: 'ms',
+    tokenPS: 'Token/gi芒y',
+    totalMessages: {
+      title: 'T峄昻g s峄� tin nh岷痭',
+      explanation: 'S峄� l瓢峄g t瓢啤ng t谩c AI h脿ng ng脿y.',
+    },
+    totalConversations: {
+      title: 'T峄昻g s峄� cu峄檆 h峄檌 tho岷',
+      explanation: 'S峄� l瓢峄g cu峄檆 h峄檌 tho岷 AI h脿ng ng脿y; kh么ng bao g峄搈 k峄� thu岷璽/g峄� l峄梚 prompt.',
+    },
+    activeUsers: {
+      title: 'Ng瓢峄漣 d霉ng ho岷 膽峄檔g',
+      explanation: 'S峄� ng瓢峄漣 d霉ng duy nh岷 tham gia tr貌 chuy峄噉 v峄沬 AI; kh么ng t铆nh vi峄嘽 t岷 l岷/l岷穚 l岷 c芒u h峄廼.',
+    },
+    tokenUsage: {
+      title: 'S峄� d峄g token',
+      explanation: 'Ph岷 谩nh vi峄嘽 s峄� d峄g m么 h矛nh ng么n ng峄� h脿ng ng脿y cho 峄﹏g d峄g, h峄痷 铆ch cho m峄 膽铆ch ki峄僲 so谩t chi ph铆.',
+      consumed: '膼茫 s峄� d峄g',
+    },
+    avgSessionInteractions: {
+      title: 'Trung b矛nh t瓢啤ng t谩c m峄梚 phi锚n',
+      explanation: 'S峄� l岷 giao ti岷縫 li锚n t峄 gi峄痑 ng瓢峄漣 d霉ng v脿 AI; 谩p d峄g cho c谩c 峄﹏g d峄g d峄盿 tr锚n tr貌 chuy峄噉.',
+    },
+    avgUserInteractions: {
+      title: 'Trung b矛nh t瓢啤ng t谩c m峄梚 ng瓢峄漣 d霉ng',
+      explanation: 'Ph岷 谩nh t岷 su岷 s峄� d峄g h脿ng ng脿y c峄 ng瓢峄漣 d霉ng. Ch峄� s峄� n脿y cho bi岷縯 m峄ヽ 膽峄� g岷痭 k岷縯 c峄 ng瓢峄漣 d霉ng.',
+    },
+    userSatisfactionRate: {
+      title: 'T峄� l峄� h脿i l貌ng c峄 ng瓢峄漣 d霉ng',
+      explanation: 'S峄� l瓢峄 th铆ch tr锚n m峄梚 1.000 tin nh岷痭. Ch峄� s峄� n脿y cho bi岷縯 t峄� l峄� c芒u tr岷� l峄漣 m脿 ng瓢峄漣 d霉ng r岷 h脿i l貌ng.',
+    },
+    avgResponseTime: {
+      title: 'Th峄漣 gian ph岷 h峄搃 trung b矛nh',
+      explanation: 'Th峄漣 gian (ms) 膽峄� AI x峄� l媒/ph岷 h峄搃; 谩p d峄g cho c谩c 峄﹏g d峄g d峄盿 tr锚n v膬n b岷.',
+    },
+    tps: {
+      title: 'T峄慶 膽峄� 膽岷 ra token',
+      explanation: '膼o l瓢峄漬g hi峄噓 su岷 c峄 LLM. 膼岷縨 t峄慶 膽峄� 膽岷 ra token c峄 LLM t峄� khi b岷痶 膽岷 y锚u c岷 膽岷縩 khi ho脿n th脿nh 膽岷 ra.',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/vi-VN/app.ts b/i18n/vi-VN/app.ts
new file mode 100644
index 0000000..aacfc64
--- /dev/null
+++ b/i18n/vi-VN/app.ts
@@ -0,0 +1,214 @@
+const translation = {
+  createApp: 'T岷燨 峄∟G D峄G',
+  types: {
+    all: 'T岷 c岷�',
+    chatbot: 'Chatbot',
+    agent: 'T谩c nh芒n',
+    workflow: 'Quy tr矛nh',
+    completion: 'Ho脿n th脿nh',
+    advanced: 'D貌ng tr貌 chuy峄噉',
+    basic: 'C啤 b岷',
+  },
+  duplicate: 'Sao ch茅p',
+  duplicateTitle: 'Sao ch茅p 峄﹏g d峄g',
+  export: 'Xu岷 DSL',
+  exportFailed: 'Xu岷 DSL th岷 b岷.',
+  importDSL: 'Nh岷璸 t峄噋 DSL',
+  createFromConfigFile: 'T岷 t峄� t峄噋 DSL',
+  deleteAppConfirmTitle: 'X贸a 峄﹏g d峄g n脿y?',
+  deleteAppConfirmContent:
+    'Vi峄嘽 x贸a 峄﹏g d峄g l脿 kh么ng th峄� ho脿n t谩c. Ng瓢峄漣 d霉ng s岷� kh么ng th峄� truy c岷璸 v脿o 峄﹏g d峄g c峄 b岷 n峄痑 v脿 t岷 c岷� c岷 h矛nh c农ng nh瓢 nh岷璽 k媒 nh岷痗 s岷� b峄� x贸a v末nh vi峄卬.',
+  appDeleted: '峄╪g d峄g 膽茫 b峄� x贸a',
+  appDeleteFailed: 'Kh么ng th峄� x贸a 峄﹏g d峄g',
+  join: 'Tham gia c峄檔g 膽峄搉g',
+  communityIntro:
+    'Th岷 lu岷璶 v峄沬 c谩c th脿nh vi锚n nh贸m, ng瓢峄漣 膽贸ng g贸p v脿 nh脿 ph谩t tri峄僴 tr锚n c谩c k锚nh kh谩c nhau.',
+  roadmap: 'Xem l峄� tr矛nh c峄 ch煤ng t么i',
+  newApp: {
+    startFromBlank: 'T岷 m峄沬',
+    startFromTemplate: 'T岷 t峄� m岷玼',
+    captionAppType: 'B岷 mu峄憂 t岷 lo岷 峄﹏g d峄g n脿o?',
+    chatbotDescription: 'X芒y d峄眓g m峄檛 峄﹏g d峄g tr貌 chuy峄噉. 峄╪g d峄g n脿y s峄� d峄g 膽峄媙h d岷g h峄廼 膽谩p, cho ph茅p nhi峄乽 v貌ng tr貌 chuy峄噉 li锚n t峄.',
+    completionDescription: 'X芒y d峄眓g m峄檛 峄﹏g d峄g t岷 v膬n b岷 ch岷 l瓢峄g cao d峄盿 tr锚n g峄 媒, nh瓢 t岷 b脿i vi岷縯, t贸m t岷痶, d峄媍h thu岷璽 v脿 nhi峄乽 h啤n n峄痑.',
+    completionWarning: 'Lo岷 峄﹏g d峄g n脿y s岷� kh么ng 膽瓢峄 h峄� tr峄� trong t瓢啤ng lai.',
+    agentDescription: 'X芒y d峄眓g m峄檛 t谩c nh芒n th么ng minh c贸 th峄� t峄� 膽峄檔g ch峄峮 c么ng c峄� 膽峄� ho脿n th脿nh c谩c nhi峄噈 v峄�',
+    workflowDescription: 'X芒y d峄眓g m峄檛 峄﹏g d峄g t岷 v膬n b岷 ch岷 l瓢峄g cao d峄盿 tr锚n quy tr矛nh l脿m vi峄嘽 v峄沬 m峄ヽ 膽峄� t霉y ch峄塶h cao. Ph霉 h峄 cho ng瓢峄漣 d霉ng c贸 kinh nghi峄噈.',
+    workflowWarning: 'Hi峄噉 膽ang trong phi锚n b岷 beta',
+    chatbotType: 'Ph瓢啤ng ph谩p qu岷 l媒 Chatbot',
+    basic: 'C啤 b岷',
+    basicTip: 'D脿nh cho ng瓢峄漣 m峄沬 b岷痶 膽岷, c贸 th峄� chuy峄僴 sang Chatflow sau n脿y',
+    basicFor: 'D脌NH CHO NG漂峄淚 M峄欼 B岷甌 膼岷',
+    basicDescription: 'Qu岷 l媒 c啤 b岷 cho ph茅p qu岷 l媒 峄﹏g d峄g Chatbot b岷眓g c谩ch s峄� d峄g c谩c c脿i 膽岷穞 膽啤n gi岷, kh么ng c岷 s峄璦 膽峄昳 c谩c l峄漣 nh岷痗 t铆ch h峄 s岷祅. Ph霉 h峄 cho ng瓢峄漣 m峄沬 b岷痶 膽岷.',
+    advanced: 'Chatflow',
+    advancedFor: 'D脿nh cho ng瓢峄漣 d霉ng c贸 kinh nghi峄噈',
+    advancedDescription: 'Qu岷 l媒 Chatbot d瓢峄沬 d岷g c谩c quy tr矛nh l脿m vi峄嘽, cung c岷 m峄ヽ 膽峄� t霉y ch峄塶h cao, bao g峄搈 kh岷� n膬ng ch峄塶h s峄璦 c谩c l峄漣 nh岷痗 t铆ch h峄 s岷祅. Ph霉 h峄 cho ng瓢峄漣 d霉ng c贸 kinh nghi峄噈.',
+    captionName: 'Bi峄僽 t瓢峄g v脿 t锚n 峄﹏g d峄g',
+    appNamePlaceholder: '膼岷穞 t锚n cho 峄﹏g d峄g c峄 b岷',
+    captionDescription: 'M么 t岷�',
+    appDescriptionPlaceholder: 'Nh岷璸 m么 t岷� c峄 峄﹏g d峄g',
+    useTemplate: 'S峄� d峄g m岷玼 n脿y',
+    previewDemo: 'Xem tr瓢峄沜 demo',
+    chatApp: 'Tr峄� l媒',
+    chatAppIntro:
+      'T么i mu峄憂 x芒y d峄眓g m峄檛 峄﹏g d峄g tr貌 chuy峄噉. 峄╪g d峄g n脿y s峄� d峄g 膽峄媙h d岷g h峄廼 膽谩p, cho ph茅p nhi峄乽 v貌ng tr貌 chuy峄噉 li锚n t峄.',
+    agentAssistant: 'Tr峄� l媒 t谩c nh芒n m峄沬',
+    completeApp: 'M谩y t岷 v膬n b岷',
+    completeAppIntro:
+      'T么i mu峄憂 t岷 m峄檛 峄﹏g d峄g t岷 v膬n b岷 ch岷 l瓢峄g cao d峄盿 tr锚n g峄 媒, nh瓢 t岷 b脿i vi岷縯, t贸m t岷痶, d峄媍h thu岷璽 v脿 nhi峄乽 h啤n n峄痑.',
+    showTemplates: 'T么i mu峄憂 ch峄峮 t峄� m岷玼',
+    hideTemplates: 'Quay l岷 ch岷� 膽峄� l峄盿 ch峄峮',
+    Create: 'T岷',
+    Cancel: 'H峄',
+    nameNotEmpty: 'T锚n kh么ng 膽瓢峄 膽峄� tr峄憂g',
+    appTemplateNotSelected: 'Vui l貌ng ch峄峮 m峄檛 m岷玼',
+    appTypeRequired: 'Vui l貌ng ch峄峮 lo岷 峄﹏g d峄g',
+    appCreated: '峄╪g d峄g 膽茫 膽瓢峄 t岷',
+    appCreateFailed: 'Kh么ng th峄� t岷 峄﹏g d峄g',
+    Confirm: 'X谩c nh岷璶',
+    caution: 'Th岷璶 tr峄峮g',
+    appCreateDSLErrorPart1: 'M峄檛 s峄� kh谩c bi峄噒 膽谩ng k峄� trong c谩c phi锚n b岷 DSL 膽茫 膽瓢峄 ph谩t hi峄噉. Bu峄檆 nh岷璸 c贸 th峄� khi岷縩 峄﹏g d峄g b峄� tr峄 tr岷穋.',
+    appCreateDSLErrorPart2: 'B岷 c贸 mu峄憂 ti岷縫 t峄 kh么ng?',
+    appCreateDSLErrorTitle: 'Phi锚n b岷 kh么ng t瓢啤ng th铆ch',
+    appCreateDSLErrorPart3: 'Phi锚n b岷 DSL 峄﹏g d峄g hi峄噉 t岷:',
+    appCreateDSLWarning: 'Ph岷 c岷h c谩o: S峄� kh谩c bi峄噒 v峄� phi锚n b岷 DSL c贸 th峄� 岷h h瓢峄焠g 膽岷縩 m峄檛 s峄� t铆nh n膬ng nh岷 膽峄媙h',
+    appCreateDSLErrorPart4: 'Phi锚n b岷 DSL 膽瓢峄 h峄� th峄憂g h峄� tr峄�:',
+    forBeginners: 'D脌NH CHO NG漂峄淚 M峄欼 B岷甌 膼岷',
+    chooseAppType: 'Ch峄峮 lo岷 峄﹏g d峄g',
+    chatbotShortDescription: 'Chatbot d峄盿 tr锚n LLM v峄沬 thi岷縯 l岷璸 膽啤n gi岷',
+    noTemplateFoundTip: 'H茫y th峄� t矛m ki岷縨 b岷眓g c谩c t峄� kh贸a kh谩c nhau.',
+    workflowShortDescription: '膼i峄乽 ph峄慽 cho c谩c t谩c v峄� t峄� 膽峄檔g h贸a m峄檛 l瓢峄',
+    optional: 'T霉y ch峄峮',
+    advancedShortDescription: 'Quy tr矛nh l脿m vi峄嘽 cho c谩c cu峄檆 膽峄慽 tho岷 nhi峄乽 l瓢峄 ph峄ヽ t岷 v峄沬 b峄� nh峄�',
+    workflowUserDescription: '膼i峄乽 ph峄慽 quy tr矛nh l脿m vi峄嘽 cho c谩c t谩c v峄� m峄檛 v貌ng nh瓢 t峄� 膽峄檔g h贸a v脿 x峄� l媒 h脿ng lo岷.',
+    foundResults: '{{膽岷縨}} K岷縯 qu岷�',
+    chatbotUserDescription: 'Nhanh ch贸ng x芒y d峄眓g chatbot d峄盿 tr锚n LLM v峄沬 c岷 h矛nh 膽啤n gi岷. B岷 c贸 th峄� chuy峄僴 sang Chatflow sau.',
+    agentUserDescription: 'M峄檛 t谩c nh芒n th么ng minh c贸 kh岷� n膬ng suy lu岷璶 l岷穚 膽i l岷穚 l岷 v脿 s峄� d峄g c么ng c峄� t峄� 膽峄檔g 膽峄� 膽岷 膽瓢峄 m峄 ti锚u nhi峄噈 v峄�.',
+    noIdeaTip: 'Kh么ng c贸 媒 t瓢峄焠g? Ki峄僲 tra c谩c m岷玼 c峄 ch煤ng t么i',
+    advancedUserDescription: '膼i峄乽 ph峄慽 quy tr矛nh l脿m vi峄嘽 cho c谩c t谩c v峄� 膽峄慽 tho岷 ph峄ヽ t岷 nhi峄乽 v貌ng v峄沬 kh岷� n膬ng b峄� nh峄�.',
+    forAdvanced: 'D脌NH CHO NG漂峄淚 D脵NG N脗NG CAO',
+    foundResult: '{{膽岷縨}} K岷縯 qu岷�',
+    agentShortDescription: 'T谩c nh芒n th么ng minh v峄沬 l媒 lu岷璶 v脿 s峄� d峄g c么ng c峄� t峄� 膽峄檔g',
+    noTemplateFound: 'Kh么ng t矛m th岷 m岷玼',
+    noAppsFound: 'Kh么ng t矛m th岷 峄﹏g d峄g n脿o',
+    learnMore: 'T矛m hi峄僽 th锚m',
+    completionShortDescription: 'Tr峄� l媒 AI cho c谩c t谩c v峄� t岷 v膬n b岷',
+    completionUserDescription: 'Nhanh ch贸ng x芒y d峄眓g tr峄� l媒 AI cho c谩c t谩c v峄� t岷 v膬n b岷 v峄沬 c岷 h矛nh 膽啤n gi岷.',
+  },
+  editApp: 'Ch峄塶h s峄璦 th么ng tin',
+  editAppTitle: 'Ch峄塶h s峄璦 th么ng tin 峄﹏g d峄g',
+  editDone: 'Th么ng tin 峄﹏g d峄g 膽茫 膽瓢峄 c岷璸 nh岷璽',
+  editFailed: 'Kh么ng th峄� c岷璸 nh岷璽 th么ng tin 峄﹏g d峄g',
+  iconPicker: {
+    ok: '膼峄搉g 媒',
+    cancel: 'H峄',
+    emoji: 'Bi峄僽 t瓢峄g c岷 x煤c',
+    image: 'H矛nh 岷h',
+  },
+  switch: 'Chuy峄僴 sang qu岷 l媒 quy tr矛nh',
+  switchTipStart: 'M峄檛 b岷 sao 峄﹏g d峄g m峄沬 s岷� 膽瓢峄 t岷 v脿 chuy峄僴 sang qu岷 l媒 quy tr矛nh. B岷 sao m峄沬 s岷� ',
+  switchTip: 'kh么ng th峄�',
+  switchTipEnd: ' chuy峄僴 l岷 qu岷 l媒 c啤 b岷.',
+  switchLabel: 'B岷 sao 峄﹏g d峄g s岷� 膽瓢峄 t岷',
+  removeOriginal: 'X贸a 峄﹏g d峄g g峄慶',
+  switchStart: 'B岷痶 膽岷 chuy峄僴',
+  typeSelector: {
+    all: 'T岷 c岷� lo岷',
+    chatbot: 'Chatbot',
+    agent: 'T谩c nh芒n',
+    workflow: 'Quy tr矛nh',
+    completion: 'Ho脿n th脿nh',
+    advanced: 'D貌ng tr貌 chuy峄噉',
+  },
+  tracing: {
+    title: 'Theo d玫i hi峄噓 su岷 峄﹏g d峄g',
+    description: 'C岷 h矛nh nh脿 cung c岷 LLMOps b锚n th峄� ba v脿 theo d玫i hi峄噓 su岷 峄﹏g d峄g.',
+    config: 'C岷 h矛nh',
+    collapse: 'Thu g峄峮',
+    expand: 'M峄� r峄檔g',
+    tracing: 'Theo d玫i',
+    disabled: '膼茫 t岷痶',
+    disabledTip: 'Vui l貌ng c岷 h矛nh nh脿 cung c岷 tr瓢峄沜',
+    enabled: '膼ang ho岷 膽峄檔g',
+    tracingDescription: 'Ghi l岷 to脿n b峄� ng峄� c岷h th峄眂 thi 峄﹏g d峄g, bao g峄搈 c谩c cu峄檆 g峄峣 LLM, ng峄� c岷h, l峄漣 nh岷痗, y锚u c岷 HTTP v脿 nhi峄乽 h啤n n峄痑, 膽岷縩 m峄檛 n峄乶 t岷g theo d玫i c峄 b锚n th峄� ba.',
+    configProviderTitle: {
+      configured: '膼茫 c岷 h矛nh',
+      notConfigured: 'C岷 h矛nh nh脿 cung c岷 膽峄� b岷璽 theo d玫i',
+      moreProvider: 'Th锚m nh脿 cung c岷',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: 'N峄乶 t岷g ph谩t tri峄僴 t岷 c岷� trong m峄檛 cho m峄峣 b瓢峄沜 c峄 v貌ng 膽峄漣 峄﹏g d峄g 膽瓢峄 h峄� tr峄� b峄焛 LLM.',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: 'Theo d玫i, 膽谩nh gi谩, qu岷 l媒 l峄漣 nh岷痗 v脿 s峄� li峄噓 膽峄� g峄� l峄梚 v脿 c岷 thi峄噉 峄﹏g d峄g LLM c峄 b岷.',
+    },
+    inUse: '膼ang s峄� d峄g',
+    configProvider: {
+      title: 'C岷 h矛nh ',
+      placeholder: 'Nh岷璸 {{key}} c峄 b岷',
+      project: 'D峄� 谩n',
+      publicKey: 'Kh贸a c么ng khai',
+      secretKey: 'Kh贸a b铆 m岷璽',
+      viewDocsLink: 'Xem t脿i li峄噓 {{key}}',
+      removeConfirmTitle: 'X贸a c岷 h矛nh {{key}}?',
+      removeConfirmContent: 'C岷 h矛nh hi峄噉 t岷 膽ang 膽瓢峄 s峄� d峄g, vi峄嘽 x贸a n贸 s岷� t岷痶 t铆nh n膬ng Theo d玫i.',
+    },
+    view: 'C岷h',
+    opik: {
+      description: 'Opik l脿 m峄檛 n峄乶 t岷g m茫 ngu峄搉 m峄� 膽峄� 膽谩nh gi谩, th峄� nghi峄噈 v脿 gi谩m s谩t c谩c 峄﹏g d峄g LLM.',
+      title: 'Opik',
+    },
+    weave: {
+      title: 'D峄噒',
+      description: 'Weave l脿 m峄檛 n峄乶 t岷g m茫 ngu峄搉 m峄� 膽峄� 膽谩nh gi谩, th峄� nghi峄噈 v脿 gi谩m s谩t c谩c 峄﹏g d峄g LLM.',
+    },
+  },
+  answerIcon: {
+    description: 'C贸 n锚n s峄� d峄g bi峄僽 t瓢峄g WebApp 膽峄� thay th岷� 馃 trong 峄﹏g d峄g 膽瓢峄 chia s岷� hay kh么ng',
+    descriptionInExplore: 'C贸 n锚n s峄� d峄g bi峄僽 t瓢峄g WebApp 膽峄� thay th岷� 馃 trong Kh谩m ph谩 hay kh么ng',
+    title: 'S峄� d峄g bi峄僽 t瓢峄g WebApp 膽峄� thay th岷� 馃',
+  },
+  importFromDSLFile: 'T峄� t峄噋 DSL',
+  importFromDSL: 'Nh岷璸 t峄� DSL',
+  importFromDSLUrlPlaceholder: 'D谩n li锚n k岷縯 DSL v脿o 膽芒y',
+  importFromDSLUrl: 'T峄� URL',
+  mermaid: {
+    handDrawn: 'V岷� tay',
+    classic: 'C峄� 膽i峄僴',
+  },
+  openInExplore: 'M峄� trong Kh谩m ph谩',
+  newAppFromTemplate: {
+    sidebar: {
+      Recommended: 'Khuy岷縩 c谩o',
+      Assistant: 'Ph贸',
+      Writing: 'V膬n',
+      Workflow: 'Quy tr矛nh l脿m vi峄嘽',
+      Agent: 'Ng瓢峄漣 膽岷 l媒',
+      Programming: 'Ch瓢啤ng tr矛nh',
+      HR: 'HR',
+    },
+    searchAllTemplate: 'T矛m ki岷縨 t岷 c岷� c谩c m岷玼...',
+    byCategories: 'THEO DANH M峄',
+  },
+  showMyCreatedAppsOnly: 'Ch峄� hi峄僴 th峄� 峄﹏g d峄g do t么i t岷',
+  appSelector: {
+    params: 'TH脭NG S峄� 峄∟G D峄G',
+    placeholder: 'Ch峄峮 m峄檛 峄﹏g d峄g...',
+    noParams: 'Kh么ng c岷 th么ng s峄�',
+    label: '峄╪g d峄g',
+  },
+  structOutput: {
+    configure: 'C岷 h矛nh',
+    required: 'Y锚u c岷',
+    notConfiguredTip: '膼岷 ra c贸 c岷 tr煤c ch瓢a 膽瓢峄 c岷 h矛nh.',
+    modelNotSupported: 'M么 h矛nh kh么ng 膽瓢峄 h峄� tr峄�',
+    LLMResponse: 'Ph岷 h峄搃 c峄 LLM',
+    structured: 'C岷 tr煤c',
+    structuredTip: '膼岷 ra c贸 c岷 tr煤c l脿 m峄檛 t铆nh n膬ng 膽岷 b岷 r岷眓g m么 h矛nh s岷� lu么n t岷 ra c谩c ph岷 h峄搃 tu芒n theo s啤 膽峄� JSON m脿 b岷 cung c岷.',
+    modelNotSupportedTip: 'M么 h矛nh hi峄噉 t岷 kh么ng h峄� tr峄� t铆nh n膬ng n脿y v脿 t峄� 膽峄檔g b峄� h岷� c岷 xu峄憂g vi峄嘽 ti锚m l峄噉h.',
+    moreFillTip: 'Hi峄僴 th峄� t峄慽 膽a 10 c岷 膽峄� l峄搉g gh茅p',
+  },
+}
+
+export default translation
diff --git a/i18n/vi-VN/billing.ts b/i18n/vi-VN/billing.ts
new file mode 100644
index 0000000..3a8ac03
--- /dev/null
+++ b/i18n/vi-VN/billing.ts
@@ -0,0 +1,200 @@
+const translation = {
+  currentPlan: 'K岷� ho岷h Hi峄噉 t岷',
+  upgradeBtn: {
+    plain: 'N芒ng c岷 K岷� ho岷h',
+    encourage: 'N芒ng c岷 Ngay',
+    encourageShort: 'N芒ng c岷',
+  },
+  viewBilling: 'Qu岷 l媒 thanh to谩n v脿 膽膬ng k媒',
+  buyPermissionDeniedTip: 'Vui l貌ng li锚n h峄� v峄沬 qu岷 tr峄� vi锚n doanh nghi峄噋 c峄 b岷 膽峄� 膽膬ng k媒',
+  plansCommon: {
+    title: 'Ch峄峮 m峄檛 k岷� ho岷h ph霉 h峄 v峄沬 b岷',
+    yearlyTip: 'Nh岷璶 2 th谩ng mi峄卬 ph铆 khi 膽膬ng k媒 h脿ng n膬m!',
+    mostPopular: 'Ph峄� bi岷縩 nh岷',
+    planRange: {
+      monthly: 'H脿ng th谩ng',
+      yearly: 'H脿ng n膬m',
+    },
+    month: 'th谩ng',
+    year: 'n膬m',
+    save: 'Ti岷縯 ki峄噈 ',
+    free: 'Mi峄卬 ph铆',
+    currentPlan: 'K岷� ho岷h Hi峄噉 t岷',
+    contractSales: 'Li锚n h峄� b峄� ph岷璶 b谩n h脿ng',
+    contractOwner: 'Li锚n h峄� qu岷 l媒 nh贸m',
+    startForFree: 'B岷痶 膽岷 mi峄卬 ph铆',
+    getStartedWith: 'B岷痶 膽岷 v峄沬 ',
+    contactSales: 'Li锚n h峄� B谩n h脿ng',
+    talkToSales: 'N贸i chuy峄噉 v峄沬 B峄� ph岷璶 B谩n h脿ng',
+    modelProviders: 'Nh脿 cung c岷 M么 h矛nh',
+    teamMembers: 'Th脿nh vi锚n Nh贸m',
+    buildApps: 'X芒y d峄眓g 峄╪g d峄g',
+    vectorSpace: 'Kh么ng gian Vector',
+    vectorSpaceBillingTooltip: 'M峄梚 1MB c贸 th峄� l瓢u tr峄� kho岷g 1.2 tri峄噓 k媒 t峄� d峄� li峄噓 vector h贸a (瓢峄沜 t铆nh s峄� d峄g OpenAI Embeddings, thay 膽峄昳 t霉y theo c谩c m么 h矛nh).',
+    vectorSpaceTooltip: 'Kh么ng gian Vector l脿 h峄� th峄憂g b峄� nh峄� d脿i h岷 c岷 thi岷縯 cho LLMs 膽峄� hi峄僽 d峄� li峄噓 c峄 b岷.',
+    documentsUploadQuota: 'H岷 m峄ヽ T岷 l锚n T脿i li峄噓',
+    documentProcessingPriority: '漂u ti锚n X峄� l媒 T脿i li峄噓',
+    documentProcessingPriorityTip: '膼峄� c贸 瓢u ti锚n x峄� l媒 t脿i li峄噓 cao h啤n, vui l貌ng n芒ng c岷 k岷� ho岷h c峄 b岷.',
+    documentProcessingPriorityUpgrade: 'X峄� l媒 nhi峄乽 d峄� li峄噓 v峄沬 膽峄� ch铆nh x谩c cao v脿 t峄慶 膽峄� nhanh h啤n.',
+    priority: {
+      'standard': 'Ti锚u chu岷﹏',
+      'priority': '漂u ti锚n',
+      'top-priority': '漂u ti锚n Cao nh岷',
+    },
+    logsHistory: 'L峄媍h s峄� Nh岷璽 k媒',
+    customTools: 'C么ng c峄� T霉y ch峄塶h',
+    unavailable: 'Kh么ng c贸 s岷祅',
+    days: 'ng脿y',
+    unlimited: 'Kh么ng gi峄沬 h岷',
+    support: 'H峄� tr峄�',
+    supportItems: {
+      communityForums: 'Di峄卬 膽脿n c峄檔g 膽峄搉g',
+      emailSupport: 'H峄� tr峄� qua email',
+      priorityEmail: 'H峄� tr峄� qua email & chat 瓢u ti锚n',
+      logoChange: 'Thay 膽峄昳 Logo',
+      SSOAuthentication: 'X谩c th峄眂 SSO',
+      personalizedSupport: 'H峄� tr峄� c谩 nh芒n h贸a',
+      dedicatedAPISupport: 'H峄� tr峄� API d脿nh ri锚ng',
+      customIntegration: 'T铆ch h峄 v脿 h峄� tr峄� t霉y ch峄塶h',
+      ragAPIRequest: 'Y锚u c岷 API RAG',
+      bulkUpload: 'T岷 l锚n t脿i li峄噓 h脿ng lo岷',
+      agentMode: 'Ch岷� 膽峄� 膼岷 l媒',
+      workflow: 'Quy tr矛nh l脿m vi峄嘽',
+      llmLoadingBalancing: 'C芒n b岷眓g t岷 LLM',
+      llmLoadingBalancingTooltip: 'Th锚m nhi峄乽 kh贸a API v脿o m么 h矛nh, v瓢峄 qua gi峄沬 h岷 t峄慶 膽峄� API m峄檛 c谩ch hi峄噓 qu岷�.',
+    },
+    comingSoon: 'S岷痯 ra m岷痶',
+    member: 'Th脿nh vi锚n',
+    memberAfter: 'Th脿nh vi锚n',
+    messageRequest: {
+      title: 'S峄� L瓢峄g Tin Nh岷痭',
+      tooltip: 'H岷 m峄ヽ tri峄噓 h峄搃 tin nh岷痭 cho c谩c k岷� ho岷h s峄� d峄g m么 h矛nh OpenAI (ngo岷 tr峄� gpt4). C谩c tin nh岷痭 v瓢峄 qu谩 gi峄沬 h岷 s岷� s峄� d峄g Kh贸a API OpenAI c峄 b岷.',
+      titlePerMonth: '{{count,number}} tin nh岷痭/th谩ng',
+    },
+    annotatedResponse: {
+      title: 'H岷 M峄ヽ Quota Ph岷 h峄搃 膼茫 膽瓢峄 Ghi ch煤',
+      tooltip: 'Ch峄塶h s峄璦 v脿 ghi ch煤 th峄� c么ng c谩c ph岷 h峄搃 cung c岷 kh岷� n膬ng tr岷� l峄漣 c芒u h峄廼 ch岷 l瓢峄g cao c贸 th峄� t霉y ch峄塶h cho c谩c 峄﹏g d峄g. (Ch峄� 谩p d峄g trong c谩c 峄﹏g d峄g tr貌 chuy峄噉)',
+    },
+    ragAPIRequestTooltip: '膼峄� c岷璸 膽岷縩 s峄� l瓢峄g cu峄檆 g峄峣 API tri峄噓 h峄搃 ch峄� kh岷� n膬ng x峄� l媒 c啤 s峄� ki岷縩 th峄ヽ c峄 Dify.',
+    receiptInfo: 'Ch峄� ch峄� nh贸m v脿 qu岷 tr峄� vi锚n nh贸m c贸 th峄� 膽膬ng k媒 v脿 xem th么ng tin thanh to谩n',
+    annotationQuota: 'H岷 ng岷h ch煤 th铆ch',
+    priceTip: 'm峄梚 kh么ng gian l脿m vi峄嘽/',
+    documentsTooltip: 'H岷 ng岷h s峄� l瓢峄g t脿i li峄噓 膽瓢峄 nh岷璸 t峄� Ngu峄搉 D峄� li峄噓 Ki岷縩 th峄ヽ.',
+    apiRateLimitTooltip: 'Gi峄沬 h岷 t岷 su岷 API 谩p d峄g cho t岷 c岷� c谩c y锚u c岷 膽瓢峄 th峄眂 hi峄噉 th么ng qua API Dify, bao g峄搈 t岷 v膬n b岷, cu峄檆 tr貌 chuy峄噉, th峄眂 thi quy tr矛nh l脿m vi峄嘽 v脿 x峄� l媒 t脿i li峄噓.',
+    teamMember_one: '{{count,number}} th脿nh vi锚n trong nh贸m',
+    apiRateLimit: 'Gi峄沬 h岷 t岷 su岷 API',
+    annualBilling: 'H贸a 膽啤n h脿ng n膬m',
+    cloud: 'D峄媍h v峄� 膽谩m m芒y',
+    documentsRequestQuota: '{{count,number}}/ph煤t Gi峄沬 H岷 T峄� L峄� Y锚u C岷 Ki岷縩 Th峄ヽ',
+    self: 'T峄� l瓢u tr峄�',
+    comparePlanAndFeatures: 'So s谩nh c谩c k岷� ho岷h & t铆nh n膬ng',
+    freeTrialTip: 'd霉ng th峄� mi峄卬 ph铆 200 cu峄檆 g峄峣 OpenAI.',
+    freeTrialTipPrefix: '膼膬ng k媒 v脿 nh岷璶 m峄檛',
+    unlimitedApiRate: 'Kh么ng gi峄沬 h岷 t峄� l峄� API',
+    teamWorkspace: '{{count,number}} Kh么ng gian l脿m vi峄嘽 c峄 膼峄檌',
+    teamMember_other: '{{count,number}} th脿nh vi锚n trong nh贸m',
+    documents: '{{count,number}} T脿i li峄噓 Ki岷縩 th峄ヽ',
+    getStarted: 'B岷痶 膽岷',
+    apiRateLimitUnit: '{{count,number}}/ng脿y',
+    freeTrialTipSuffix: 'Kh么ng c岷 th岷� t铆n d峄g',
+    documentsRequestQuotaTooltip: 'Ch峄� 膽峄媙h t峄昻g s峄� h脿nh 膽峄檔g m脿 m峄檛 kh么ng gian l脿m vi峄嘽 c贸 th峄� th峄眂 hi峄噉 m峄梚 ph煤t trong c啤 s峄� tri th峄ヽ, bao g峄搈 t岷 m峄沬 t岷璸 d峄� li峄噓, x贸a, c岷璸 nh岷璽, t岷 t脿i li峄噓 l锚n, thay 膽峄昳, l瓢u tr峄� v脿 truy v岷 c啤 s峄� tri th峄ヽ. Ch峄� s峄� n脿y 膽瓢峄 s峄� d峄g 膽峄� 膽谩nh gi谩 hi峄噓 su岷 c峄 c谩c y锚u c岷 c啤 s峄� tri th峄ヽ. V铆 d峄�, n岷縰 m峄檛 ng瓢峄漣 d霉ng Sandbox th峄眂 hi峄噉 10 l岷 ki峄僲 tra li锚n ti岷縫 trong m峄檛 ph煤t, kh么ng gian l脿m vi峄嘽 c峄 h峄� s岷� b峄� h岷 ch岷� t岷 th峄漣 kh么ng th峄眂 hi峄噉 c谩c h脿nh 膽峄檔g sau trong ph煤t ti岷縫 theo: t岷 m峄沬 t岷璸 d峄� li峄噓, x贸a, c岷璸 nh岷璽 v脿 t岷 t脿i li峄噓 l锚n ho岷穋 thay 膽峄昳.',
+  },
+  plans: {
+    sandbox: {
+      name: 'H峄檖 C谩t',
+      description: 'Th峄� nghi峄噈 mi峄卬 ph铆 200 l岷 GPT',
+      includesTitle: 'Bao g峄搈:',
+      for: 'D霉ng th峄� mi峄卬 ph铆 c谩c t铆nh n膬ng c峄憈 l玫i',
+    },
+    professional: {
+      name: 'Chuy锚n nghi峄噋',
+      description: 'D脿nh cho c谩 nh芒n v脿 c谩c nh贸m nh峄� 膽峄� m峄� kh贸a nhi峄乽 s峄ヽ m岷h v峄沬 gi谩 c岷� ph岷 ch膬ng.',
+      includesTitle: 'T岷 c岷� trong k岷� ho岷h mi峄卬 ph铆, c峄檔g th锚m:',
+      for: 'D脿nh cho c谩c nh脿 ph谩t tri峄僴 膽峄檆 l岷璸/nh贸m nh峄�',
+    },
+    team: {
+      name: 'Nh贸m',
+      description: 'H峄 t谩c m脿 kh么ng gi峄沬 h岷 v脿 t岷璶 h瓢峄焠g hi峄噓 su岷 h岷g nh岷.',
+      includesTitle: 'T岷 c岷� trong k岷� ho岷h Chuy锚n nghi峄噋, c峄檔g th锚m:',
+      for: 'D脿nh cho c谩c 膽峄檌 nh贸m v峄玜',
+    },
+    enterprise: {
+      name: 'Doanh nghi峄噋',
+      description: 'Nh岷璶 to脿n b峄� kh岷� n膬ng v脿 h峄� tr峄� cho c谩c h峄� th峄憂g quan tr峄峮g cho nhi峄噈 v峄� quy m么 l峄沶.',
+      includesTitle: 'T岷 c岷� trong k岷� ho岷h Nh贸m, c峄檔g th锚m:',
+      features: {
+        2: 'T铆nh n膬ng Doanh nghi峄噋 膼峄檆 quy峄乶',
+        1: 'Gi岷 ph茅p kinh doanh',
+        8: 'H峄� tr峄� k峄� thu岷璽 chuy锚n nghi峄噋',
+        7: 'C岷璸 nh岷璽 v脿 B岷 tr矛 b峄焛 Dify Ch铆nh th峄ヽ',
+        5: 'Th峄廰 thu岷璶 SLA b峄焛 c谩c 膽峄慽 t谩c Dify',
+        6: 'An ninh n芒ng cao v脿 ki峄僲 so谩t',
+        3: 'Nhi峄乽 kh么ng gian l脿m vi峄嘽 & Qu岷 l媒 doanh nghi峄噋',
+        0: 'Gi岷 ph谩p tri峄僴 khai m峄� r峄檔g quy m么 c岷 doanh nghi峄噋',
+        4: 'SSO',
+      },
+      price: 'T霉y ch峄塶h',
+      for: 'D脿nh cho c谩c 膽峄檌 l峄沶',
+      priceTip: 'Ch峄� thanh to谩n h脿ng n膬m',
+      btnText: 'Li锚n h峄� v峄沬 B峄� ph岷璶 B谩n h脿ng',
+    },
+    community: {
+      features: {
+        2: 'Tu芒n th峄� Gi岷 ph茅p M茫 ngu峄搉 M峄� Dify',
+        0: 'T岷 c岷� c谩c t铆nh n膬ng c峄憈 l玫i 膽瓢峄 ph谩t h脿nh d瓢峄沬 Kho l瓢u tr峄� c么ng khai',
+        1: 'Kh么ng gian l脿m vi峄嘽 膽啤n',
+      },
+      description: 'D脿nh cho ng瓢峄漣 d霉ng c谩 nh芒n, nh贸m nh峄� ho岷穋 c谩c d峄� 谩n phi th瓢啤ng m岷',
+      name: 'C峄檔g 膽峄搉g',
+      btnText: 'B岷痶 膽岷 v峄沬 C峄檔g 膽峄搉g',
+      price: 'Mi峄卬 ph铆',
+      for: 'D脿nh cho ng瓢峄漣 d霉ng c谩 nh芒n, nh贸m nh峄� ho岷穋 c谩c d峄� 谩n phi th瓢啤ng m岷',
+      includesTitle: 'T铆nh n膬ng mi峄卬 ph铆:',
+    },
+    premium: {
+      features: {
+        3: 'H峄� tr峄� qua Email & Chat 漂u ti锚n',
+        2: 'T霉y ch峄塶h Logo & Th瓢啤ng hi峄噓 峄╪g d峄g Web',
+        1: 'Kh么ng gian l脿m vi峄嘽 膽啤n',
+        0: '膼峄� tin c岷瓂 t峄� qu岷 l媒 b峄焛 c谩c nh脿 cung c岷 膽谩m m芒y kh谩c nhau',
+      },
+      comingSoon: 'H峄� tr峄� Microsoft Azure & Google Cloud S岷� 膼岷縩 S峄沵',
+      priceTip: 'D峄盿 tr锚n Th峄� tr瓢峄漬g 膼谩m m芒y',
+      btnText: 'Nh岷璶 Premium trong',
+      description: 'D脿nh cho c谩c t峄� ch峄ヽ v脿 nh贸m v峄玜',
+      price: 'C贸 th峄� m峄� r峄檔g',
+      includesTitle: 'M峄峣 th峄� t峄� C峄檔g 膽峄搉g, c峄檔g th锚m:',
+      for: 'D脿nh cho c谩c t峄� ch峄ヽ v脿 nh贸m v峄玜',
+      name: 'Cao c岷',
+    },
+  },
+  vectorSpace: {
+    fullTip: 'Kh么ng gian Vector 膽茫 膽岷.',
+    fullSolution: 'N芒ng c岷 k岷� ho岷h c峄 b岷 膽峄� c贸 th锚m kh么ng gian.',
+  },
+  apps: {
+    fullTipLine1: 'N芒ng c岷 k岷� ho岷h c峄 b岷 膽峄�',
+    fullTipLine2: 'x芒y d峄眓g th锚m 峄﹏g d峄g.',
+    contactUs: 'Li锚n h峄� v峄沬 ch煤ng t么i',
+    fullTip2: '膼茫 膽岷 gi峄沬 h岷 k岷� ho岷h',
+    fullTip1des: 'B岷 膽茫 膽岷 膽岷縩 gi峄沬 h岷 x芒y d峄眓g 峄﹏g d峄g tr锚n k岷� ho岷h n脿y.',
+    fullTip1: 'N芒ng c岷 膽峄� t岷 th锚m 峄﹏g d峄g',
+    fullTip2des: 'Ch煤ng t么i khuy锚n b岷 n锚n x贸a c谩c 峄﹏g d峄g kh么ng ho岷 膽峄檔g 膽峄� gi岷 ph贸ng dung l瓢峄g, ho岷穋 li锚n h峄� v峄沬 ch煤ng t么i.',
+  },
+  annotatedResponse: {
+    fullTipLine1: 'N芒ng c岷 k岷� ho岷h c峄 b岷 膽峄�',
+    fullTipLine2: 'ghi ch煤 th锚m cu峄檆 tr貌 chuy峄噉.',
+    quotaTitle: 'H岷 M峄ヽ Quota Ph岷 h峄搃 膼茫 膽瓢峄 Ghi ch煤',
+  },
+  usagePage: {
+    documentsUploadQuota: 'H岷 ng岷h t岷 l锚n t脿i li峄噓',
+    annotationQuota: 'H岷 ng岷h ch煤 th铆ch',
+    vectorSpaceTooltip: 'C谩c t脿i li峄噓 v峄沬 ch岷� 膽峄� l岷璸 ch峄� m峄 Ch岷 l瓢峄g Cao s岷� ti锚u t峄憂 t脿i nguy锚n L瓢u tr峄� D峄� li峄噓 Ki岷縩 th峄ヽ. Khi L瓢u tr峄� D峄� li峄噓 Ki岷縩 th峄ヽ 膽岷 gi峄沬 h岷, c谩c t脿i li峄噓 m峄沬 s岷� kh么ng 膽瓢峄 t岷 l锚n.',
+    teamMembers: 'C谩c th脿nh vi锚n trong nh贸m',
+    vectorSpace: 'L瓢u tr峄� d峄� li峄噓 ki岷縩 th峄ヽ',
+    buildApps: 'X芒y d峄眓g 峄﹏g d峄g',
+  },
+  teamMembers: 'C谩c th脿nh vi锚n trong nh贸m',
+}
+
+export default translation
diff --git a/i18n/vi-VN/common.ts b/i18n/vi-VN/common.ts
new file mode 100644
index 0000000..6023fe7
--- /dev/null
+++ b/i18n/vi-VN/common.ts
@@ -0,0 +1,672 @@
+const translation = {
+  api: {
+    success: 'Th脿nh c么ng',
+    actionSuccess: 'Th脿nh c么ng',
+    saved: '膼茫 l瓢u',
+    create: 'T岷',
+    remove: 'X贸a',
+  },
+  operation: {
+    create: 'T岷 m峄沬',
+    confirm: 'X谩c nh岷璶',
+    cancel: 'H峄 b峄�',
+    clear: 'X贸a',
+    save: 'L瓢u',
+    saveAndEnable: 'L瓢u & K铆ch ho岷',
+    edit: 'Ch峄塶h s峄璦',
+    add: 'Th锚m',
+    added: '膼茫 th锚m',
+    refresh: 'L脿m m峄沬',
+    reset: '膼岷穞 l岷',
+    search: 'T矛m ki岷縨',
+    change: 'Thay 膽峄昳',
+    remove: 'X贸a',
+    send: 'G峄璱',
+    copy: 'Sao ch茅p',
+    lineBreak: 'Ng岷痶 d貌ng',
+    sure: 'T么i ch岷痗 ch岷痭',
+    download: 'T岷 xu峄憂g',
+    delete: 'X贸a',
+    settings: 'C脿i 膽岷穞',
+    setup: 'Thi岷縯 l岷璸',
+    getForFree: 'Nh岷璶 mi峄卬 ph铆',
+    reload: 'T岷 l岷',
+    ok: 'OK',
+    log: 'Nh岷璽 k媒',
+    learnMore: 'T矛m hi峄僽 th锚m',
+    params: 'Tham s峄�',
+    duplicate: 'Nh芒n b岷',
+    rename: '膼峄昳 t锚n',
+    audioSourceUnavailable: 'AudioSource kh么ng kh岷� d峄g',
+    copyImage: 'Sao ch茅p h矛nh 岷h',
+    zoomOut: 'Thu nh峄�',
+    zoomIn: 'Ph贸ng to',
+    openInNewTab: 'M峄� trong tab m峄沬',
+    regenerate: 'T谩i t岷',
+    close: '膼贸ng',
+    saveAndRegenerate: 'L瓢u v脿 t岷 l岷 c谩c ph岷 con',
+    view: 'C岷h',
+    viewMore: 'XEM TH脢M',
+    submit: 'Tr矛nh',
+    skip: 'T脿u',
+    imageCopied: 'H矛nh 岷h sao ch茅p',
+    deleteApp: 'X贸a 峄﹏g d峄g',
+    viewDetails: 'Xem chi ti岷縯',
+    copied: 'Sao ch茅p',
+    in: 'trong',
+    more: 'H啤n',
+    downloadFailed: 'T岷 xu峄憂g th岷 b岷. Vui l貌ng th峄� l岷 sau.',
+    format: '膼峄媙h d岷g',
+    downloadSuccess: 'T岷 xu峄憂g 膽茫 ho脿n th脿nh.',
+  },
+  placeholder: {
+    input: 'Vui l貌ng nh岷璸',
+    select: 'Vui l貌ng ch峄峮',
+  },
+  voice: {
+    language: {
+      zhHans: 'Ti岷縩g Trung',
+      zhHant: 'Ti岷縩g Trung ph峄搉 th峄�',
+      enUS: 'Ti岷縩g Anh',
+      deDE: 'Ti岷縩g 膼峄ヽ',
+      frFR: 'Ti岷縩g Ph谩p',
+      esES: 'Ti岷縩g T芒y Ban Nha',
+      itIT: 'Ti岷縩g 脻',
+      thTH: 'Ti岷縩g Th谩i',
+      idID: 'Ti岷縩g Indonesia',
+      jaJP: 'Ti岷縩g Nh岷璽',
+      koKR: 'Ti岷縩g H脿n',
+      ptBR: 'Ti岷縩g B峄� 膼脿o Nha',
+      ruRU: 'Ti岷縩g Nga',
+      ukUA: 'Ti岷縩g Ukraina',
+      viVN: 'Ti岷縩g Vi峄噒',
+      plPL: 'Ti岷縩g Ba Lan',
+      roRO: 'Ti岷縩g Rumani',
+      hiIN: 'Ti岷縩g Hindi',
+      trTR: 'Ti岷縩g Th峄� Nh末 K峄�',
+      faIR: 'Ti岷縩g Ba T瓢',
+    },
+  },
+  unit: {
+    char: 'k媒 t峄�',
+  },
+  actionMsg: {
+    noModification: 'Hi峄噉 kh么ng c贸 s峄� thay 膽峄昳.',
+    modifiedSuccessfully: 'Ch峄塶h s峄璦 th脿nh c么ng',
+    modifiedUnsuccessfully: 'Ch峄塶h s峄璦 kh么ng th脿nh c么ng',
+    copySuccessfully: '膼茫 sao ch茅p th脿nh c么ng',
+    paySucceeded: 'Thanh to谩n th脿nh c么ng',
+    payCancelled: 'Thanh to谩n 膽茫 h峄',
+    generatedSuccessfully: 'T岷 th脿nh c么ng',
+    generatedUnsuccessfully: 'T岷 kh么ng th脿nh c么ng',
+  },
+  model: {
+    params: {
+      temperature: '膼峄� s谩ng t岷',
+      temperatureTip:
+        'Ki峄僲 so谩t 膽峄� ng岷玼 nhi锚n: Gi岷 膽峄� s谩ng t岷 d岷玭 膽岷縩 铆t k岷縯 qu岷� ng岷玼 nhi锚n h啤n. Khi 膽峄� s谩ng t岷 g岷 b岷眓g 0, m么 h矛nh s岷� tr峄� n锚n x谩c 膽峄媙h v脿 l岷穚 l岷.',
+      top_p: 'Top P',
+      top_pTip:
+        'Ki峄僲 so谩t 膽a d岷g th么ng qua l岷 m岷玼 nh芒n nh贸m: 0.5 c贸 ngh末a l脿 n峄璦 s峄� t霉y ch峄峮 c贸 kh岷� n膬ng cao 膽瓢峄 xem x茅t.',
+      presence_penalty: 'Ph岷 s峄� hi峄噉 di峄噉',
+      presence_penaltyTip:
+        '膼峄� l峄沶 c峄 s峄� ph岷 cho c谩c token m峄沬 d峄盿 tr锚n vi峄嘽 ch煤ng c贸 xu岷 hi峄噉 trong v膬n b岷 cho 膽岷縩 nay hay kh么ng.\nT膬ng kh岷� n膬ng c峄 m么 h矛nh 膽峄� n贸i v峄� c谩c ch峄� 膽峄� m峄沬.',
+      frequency_penalty: 'Ph岷 t岷 su岷',
+      frequency_penaltyTip:
+        '膼峄� l峄沶 c峄 s峄� ph岷 cho c谩c token m峄沬 d峄盿 tr锚n t岷 su岷 hi峄噉 t岷 c峄 ch煤ng trong v膬n b岷 cho 膽岷縩 nay.\nGi岷 kh岷� n膬ng c峄 m么 h矛nh 膽峄� l岷穚 l岷 c霉ng m峄檛 d貌ng v膬n b岷.',
+      max_tokens: 'Max token',
+      max_tokensTip:
+        'S峄� d峄g 膽峄� gi峄沬 h岷 膽峄� d脿i t峄慽 膽a c峄 c芒u tr岷� l峄漣, theo token. \nGi谩 tr峄� l峄沶 c贸 th峄� gi峄沬 h岷 kh么ng gian c貌n l岷 cho t峄� kh贸a kh峄焛 膽岷, nh岷璽 k媒 tr貌 chuy峄噉 v脿 Ki岷縩 th峄ヽ. \nKhuy岷縩 ngh峄� 膽岷穞 gi谩 tr峄� d瓢峄沬 hai ph岷 ba c峄 gpt-4-1106-preview, gpt-4-vision-preview max token (膽岷 v脿o 128k 膽岷 ra 4k)',
+      maxTokenSettingTip: 'C脿i 膽岷穞 max token c峄 b岷 qu谩 cao, c贸 th峄� h岷 ch岷� kh么ng gian cho t峄� kh贸a, truy v岷 v脿 d峄� li峄噓. Xem x茅t 膽岷穞 n贸 d瓢峄沬 2/3.',
+      setToCurrentModelMaxTokenTip: 'Max token 膽瓢峄 c岷璸 nh岷璽 膽岷縩 80% token t峄慽 膽a c峄 m么 h矛nh hi峄噉 t岷 {{maxToken}}.',
+      stop_sequences: 'Chu峄梚 d峄玭g',
+      stop_sequencesTip: 'L锚n 膽岷縩 b峄憂 chu峄梚 n啤i API s岷� d峄玭g vi峄嘽 t岷 ra c谩c token ti岷縫 theo. V膬n b岷 膽瓢峄 tr岷� v峄� s岷� kh么ng ch峄゛ chu峄梚 d峄玭g.',
+      stop_sequencesPlaceholder: 'Nh岷璸 chu峄梚 v脿 nh岷 Tab',
+    },
+    tone: {
+      Creative: 'S谩ng t岷',
+      Balanced: 'C芒n b岷眓g',
+      Precise: 'Ch铆nh x谩c',
+      Custom: 'T霉y ch峄塶h',
+    },
+    addMoreModel: '膼i峄乽 ch峄塶h c脿i 膽岷穞 膽峄� th锚m m么 h矛nh',
+    settingsLink: 'C脿i 膽岷穞 nh脿 cung c岷 m么 h矛nh',
+    capabilities: 'Kh岷� n膬ng 膽a ph瓢啤ng th峄ヽ',
+  },
+  menus: {
+    status: 'beta',
+    explore: 'Kh谩m ph谩',
+    apps: 'Studio',
+    plugins: 'Plugins',
+    pluginsTips: 'T铆ch h峄 c谩c plugin b锚n th峄� ba ho岷穋 t岷 ra c谩c AI-Plugin t瓢啤ng th铆ch v峄沬 ChatGPT.',
+    datasets: 'Ki岷縩 th峄ヽ',
+    datasetsTips: 'S岷甈 RA M岷甌: Nh岷璸 d峄� li峄噓 v膬n b岷 c峄 b岷 ho岷穋 c岷璸 nh岷璽 d峄� li峄噓 theo th峄漣 gian th峄眂 th么ng qua Webhook 膽峄� c岷 thi峄噉 ng峄� c岷h LLM.',
+    newApp: '峄╪g d峄g m峄沬',
+    newDataset: 'T岷 Ki岷縩 th峄ヽ',
+    tools: 'C么ng c峄�',
+    exploreMarketplace: 'Kh谩m ph谩 Marketplace',
+  },
+  userProfile: {
+    settings: 'C脿i 膽岷穞',
+    emailSupport: 'H峄� tr峄� qua Email',
+    workspace: 'Kh么ng gian l脿m vi峄嘽',
+    createWorkspace: 'T岷 Kh么ng gian l脿m vi峄嘽',
+    helpCenter: 'Trung t芒m tr峄� gi煤p',
+    communityFeedback: 'Ph岷 h峄搃',
+    roadmap: 'L峄� tr矛nh',
+    community: 'C峄檔g 膽峄搉g',
+    about: 'V峄� ch煤ng t么i',
+    logout: '膼膬ng xu岷',
+    compliance: 'Tu芒n th峄�',
+    github: 'GitHub',
+    support: 'H峄� tr峄�',
+  },
+  settings: {
+    accountGroup: 'T脌I KHO岷',
+    workplaceGroup: 'KH脭NG GIAN L脌M VI峄咰',
+    account: 'T脿i kho岷 c峄 t么i',
+    members: 'Th脿nh vi锚n',
+    billing: 'Thanh to谩n',
+    integrations: 'T铆ch h峄',
+    language: 'Ng么n ng峄�',
+    provider: 'Nh脿 cung c岷 m么 h矛nh',
+    dataSource: 'Ngu峄搉 d峄� li峄噓',
+    plugin: 'Plugins',
+    apiBasedExtension: 'M峄� r峄檔g d峄盿 tr锚n API',
+    generalGroup: 'T峄擭G QU脕T',
+  },
+  account: {
+    avatar: '岷h 膽岷 di峄噉',
+    name: 'T锚n',
+    email: 'Email',
+    password: 'M岷璽 kh岷﹗',
+    passwordTip: 'B岷 c贸 th峄� 膽岷穞 m峄檛 m岷璽 kh岷﹗ c峄� 膽峄媙h n岷縰 b岷 kh么ng mu峄憂 s峄� d峄g m茫 膽膬ng nh岷璸 t岷 th峄漣',
+    setPassword: '膼岷穞 m岷璽 kh岷﹗',
+    resetPassword: '膼岷穞 l岷 m岷璽 kh岷﹗',
+    currentPassword: 'M岷璽 kh岷﹗ hi峄噉 t岷',
+    newPassword: 'M岷璽 kh岷﹗ m峄沬',
+    confirmPassword: 'X谩c nh岷璶 m岷璽 kh岷﹗',
+    notEqual: 'Hai m岷璽 kh岷﹗ kh么ng gi峄憂g nhau.',
+    langGeniusAccount: 'T脿i kho岷 Dify',
+    langGeniusAccountTip: 'T脿i kho岷 Dify c峄 b岷 v脿 d峄� li峄噓 ng瓢峄漣 d霉ng li锚n quan.',
+    editName: 'Ch峄塶h s峄璦 T锚n',
+    showAppLength: 'Hi峄僴 th峄� {{length}} 峄﹏g d峄g',
+    delete: 'X贸a t脿i kho岷',
+    deleteTip: 'X贸a t脿i kho岷 c峄 b岷 s岷� x贸a v末nh vi峄卬 t岷 c岷� d峄� li峄噓 c峄 b岷 v脿 kh么ng th峄� kh么i ph峄 膽瓢峄.',
+    deleteConfirmTip: '膼峄� x谩c nh岷璶, vui l貌ng g峄璱 th么ng tin sau t峄� email 膽茫 膽膬ng k媒 c峄 b岷 t峄沬 ',
+    studio: 'Dify Studio',
+    myAccount: 'T脿i kho岷 c峄 t么i',
+    account: 'T脿i kho岷',
+    deletePrivacyLinkTip: '膼峄� bi岷縯 th锚m th么ng tin v峄� c谩ch ch煤ng t么i x峄� l媒 d峄� li峄噓 c峄 b岷, vui l貌ng xem',
+    deletePrivacyLink: 'Ch铆nh s谩ch b岷 m岷璽.',
+    deleteSuccessTip: 'T脿i kho岷 c峄 b岷 c岷 th峄漣 gian 膽峄� x贸a xong. Ch煤ng t么i s岷� g峄璱 email cho b岷 khi t岷 c岷� ho脿n t岷.',
+    deleteLabel: '膼峄� x谩c nh岷璶, vui l貌ng nh岷璸 email c峄 b岷 b锚n d瓢峄沬',
+    deletePlaceholder: 'Vui l貌ng nh岷璸 email c峄 b岷',
+    sendVerificationButton: 'G峄璱 m茫 x谩c minh',
+    verificationLabel: 'M茫 x谩c minh',
+    verificationPlaceholder: 'D谩n m茫 g峄搈 6 ch峄� s峄�',
+    permanentlyDeleteButton: 'X贸a v末nh vi峄卬 t脿i kho岷',
+    feedbackTitle: 'Ph岷 h峄搃',
+    feedbackLabel: 'H茫y cho ch煤ng t么i bi岷縯 l媒 do t岷 sao b岷 x贸a t脿i kho岷 c峄 m矛nh?',
+    feedbackPlaceholder: 'T霉y ch峄峮',
+    workspaceIcon: 'Bi峄僽 t瓢峄g kh么ng gian l脿m vi峄嘽',
+    workspaceName: 'T锚n kh么ng gian l脿m vi峄嘽',
+    editWorkspaceInfo: 'Ch峄塶h s峄璦 th么ng tin kh么ng gian l脿m vi峄嘽',
+  },
+  members: {
+    team: 'Nh贸m',
+    invite: 'M峄漣',
+    name: 'T脢N',
+    lastActive: 'HO岷燭 膼峄楴G G岷 膼脗Y',
+    role: 'VAI TR脪',
+    pending: '膼ang ch峄�...',
+    owner: 'Ch峄� s峄� h峄痷',
+    admin: 'Qu岷 tr峄� vi锚n',
+    adminTip: 'C贸 th峄� x芒y d峄眓g 峄﹏g d峄g v脿 qu岷 l媒 c脿i 膽岷穞 nh贸m',
+    normal: 'B矛nh th瓢峄漬g',
+    normalTip: 'Ch峄� c贸 th峄� s峄� d峄g 峄﹏g d峄g, kh么ng th峄� x芒y d峄眓g 峄﹏g d峄g',
+    editor: 'Bi锚n t岷璸 vi锚n',
+    editorTip: 'C贸 th峄� x芒y d峄眓g 峄﹏g d峄g, kh么ng th峄� qu岷 l媒 c脿i 膽岷穞 nh贸m',
+    inviteTeamMember: 'M峄漣 th脿nh vi锚n nh贸m',
+    inviteTeamMemberTip: 'Sau khi 膽膬ng nh岷璸, h峄� c贸 th峄� truy c岷璸 tr峄眂 ti岷縫 v脿o d峄� li峄噓 nh贸m c峄 b岷.',
+    emailNotSetup: 'M谩y ch峄� email ch瓢a 膽瓢峄 thi岷縯 l岷璸, v矛 v岷瓂 kh么ng th峄� g峄璱 email m峄漣. Vui l貌ng th么ng b谩o cho ng瓢峄漣 d霉ng v峄� li锚n k岷縯 m峄漣 s岷� 膽瓢峄 ph谩t h脿nh sau khi m峄漣.',
+    email: 'Email',
+    emailInvalid: '膼峄媙h d岷g Email kh么ng h峄 l峄�',
+    emailPlaceholder: 'Vui l貌ng nh岷璸 email',
+    sendInvite: 'G峄璱 L峄漣 m峄漣',
+    invitedAsRole: '膼瓢峄 m峄漣 v峄沬 vai tr貌 {{role}}',
+    invitationSent: 'L峄漣 m峄漣 膽茫 膽瓢峄 g峄璱',
+    invitationSentTip: 'L峄漣 m峄漣 膽茫 膽瓢峄 g峄璱, v脿 h峄� c贸 th峄� 膽膬ng nh岷璸 v脿o Dify 膽峄� truy c岷璸 v脿o d峄� li峄噓 nh贸m c峄 b岷.',
+    invitationLink: 'Li锚n k岷縯 L峄漣 m峄漣',
+    failedInvitationEmails: 'D瓢峄沬 膽芒y l脿 danh s谩ch email kh么ng g峄璱 膽瓢峄 l峄漣 m峄漣',
+    ok: 'OK',
+    removeFromTeam: 'X贸a kh峄廼 nh贸m',
+    removeFromTeamTip: 'S岷� x贸a quy峄乶 truy c岷璸 nh贸m',
+    setAdmin: '膼岷穞 l脿m qu岷 tr峄� vi锚n',
+    setMember: '膼岷穞 th脿nh vi锚n b矛nh th瓢峄漬g',
+    setEditor: '膼岷穞 l脿m bi锚n t岷璸 vi锚n',
+    disInvite: 'H峄 l峄漣 m峄漣',
+    deleteMember: 'X贸a th脿nh vi锚n',
+    you: '(B岷)',
+    datasetOperatorTip: 'Ch峄� c贸 th峄� qu岷 l媒 c啤 s峄� ki岷縩 th峄ヽ',
+    builderTip: 'C贸 th峄� x芒y d峄眓g v脿 ch峄塶h s峄璦 峄﹏g d峄g c峄 ri锚ng m矛nh',
+    builder: 'Ch峄� th岷',
+    datasetOperator: 'Qu岷 tr峄� vi锚n ki岷縩 th峄ヽ',
+    setBuilder: '膼岷穞 l脿m tr矛nh t岷',
+  },
+  integrations: {
+    connected: '膼茫 k岷縯 n峄慽',
+    google: 'Google',
+    googleAccount: '膼膬ng nh岷璸 b岷眓g t脿i kho岷 Google',
+    github: 'GitHub',
+    githubAccount: '膼膬ng nh岷璸 b岷眓g t脿i kho岷 GitHub',
+    connect: 'K岷縯 n峄慽',
+  },
+  language: {
+    displayLanguage: 'Ng么n ng峄� hi峄僴 th峄�',
+    timezone: 'M煤i gi峄�',
+  },
+  provider: {
+    apiKey: 'Kh贸a API',
+    enterYourKey: 'Nh岷璸 kh贸a API c峄 b岷 峄� 膽芒y',
+    invalidKey: 'Kh贸a API OpenAI kh么ng h峄 l峄�',
+    validatedError: 'X谩c minh th岷 b岷: ',
+    validating: '膼ang x谩c minh kh贸a...',
+    saveFailed: 'L瓢u kh贸a API th岷 b岷',
+    apiKeyExceedBill: 'Kh贸a API n脿y kh么ng c贸 l瓢峄g truy v岷 kh岷� d峄g, vui l貌ng 膽峄峜',
+    addKey: 'Th锚m Kh贸a',
+    comingSoon: 'S岷痯 Ra M岷痶',
+    editKey: 'Ch峄塶h s峄璦',
+    invalidApiKey: 'Kh贸a API kh么ng h峄 l峄�',
+    azure: {
+      apiBase: 'C啤 s峄� API',
+      apiBasePlaceholder: 'URL c啤 s峄� API c峄 膽i峄僲 cu峄慽 Azure OpenAI c峄 b岷.',
+      apiKey: 'Kh贸a API',
+      apiKeyPlaceholder: 'Nh岷璸 kh贸a API c峄 b岷 峄� 膽芒y',
+      helpTip: 'T矛m hi峄僽 D峄媍h v峄� Azure OpenAI',
+    },
+    openaiHosted: {
+      openaiHosted: 'OpenAI 膽ang l瓢u tr峄�',
+      onTrial: 'D脵NG TH峄�',
+      exhausted: 'H岷綯 QUOTA',
+      desc: 'D峄媍h v峄� l瓢u tr峄� OpenAI 膽瓢峄 cung c岷 b峄焛 Dify cho ph茅p b岷 s峄� d峄g c谩c m么 h矛nh nh瓢 GPT-3.5. Tr瓢峄沜 khi h岷縯 l瓢峄g truy v岷 d霉ng th峄�, b岷 c岷 thi岷縯 l岷璸 c谩c nh脿 cung c岷 m么 h矛nh kh谩c.',
+      callTimes: 'S峄� l岷 g峄峣',
+      usedUp: 'Quota d霉ng th峄� 膽茫 h岷縯. Th锚m nh脿 cung c岷 M么 h矛nh c峄 ri锚ng b岷.',
+      useYourModel: 'Hi峄噉 膽ang s峄� d峄g nh脿 cung c岷 M么 h矛nh c峄 ri锚ng b岷.',
+      close: '膼贸ng',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: 'D脵NG TH峄�',
+      exhausted: 'H岷綯 QUOTA',
+      desc: 'M么 h矛nh m岷h m岷�, v瓢峄 tr峄檌 trong m峄檛 lo岷 c谩c nhi峄噈 v峄� t峄� tr貌 chuy峄噉 ph峄ヽ t岷 v脿 t岷 n峄檌 dung s谩ng t岷 膽岷縩 h瓢峄沶g d岷玭 chi ti岷縯.',
+      callTimes: 'S峄� l岷 g峄峣',
+      usedUp: 'Quota d霉ng th峄� 膽茫 h岷縯. Th锚m nh脿 cung c岷 M么 h矛nh c峄 ri锚ng b岷.',
+      useYourModel: 'Hi峄噉 膽ang s峄� d峄g nh脿 cung c岷 M么 h矛nh c峄 ri锚ng b岷.',
+      close: '膼贸ng',
+      trialQuotaTip: 'H岷 ng岷h d霉ng th峄� Anthropic c峄 b岷 s岷� h岷縯 h岷 v脿o 2025/03/11 v脿 s岷� kh么ng c貌n kh岷� d峄g sau 膽贸. Vui l貌ng s峄� d峄g n贸 k峄媝 th峄漣.',
+    },
+    anthropic: {
+      using: 'Kh岷� n膬ng nh煤ng 膽ang s峄� d峄g',
+      enableTip: '膼峄� k铆ch ho岷 m么 h矛nh Anthrop, b岷 c岷 r脿ng bu峄檆 v峄沬 D峄媍h v峄� OpenAI ho岷穋 Azure OpenAI tr瓢峄沜.',
+      notEnabled: 'Ch瓢a 膽瓢峄 k铆ch ho岷',
+      keyFrom: 'Nh岷璶 kh贸a API c峄 b岷 t峄� Anthrop',
+    },
+    encrypted: {
+      front: 'Kh贸a API c峄 b岷 s岷� 膽瓢峄 m茫 h贸a v脿 l瓢u tr峄� b岷眓g',
+      back: ' c么ng ngh峄�.',
+    },
+  },
+  modelProvider: {
+    notConfigured: 'M么 h矛nh h峄� th峄憂g v岷玭 ch瓢a 膽瓢峄 c岷 h矛nh ho脿n to脿n v脿 m峄檛 s峄� ch峄ヽ n膬ng c贸 th峄� kh么ng kh岷� d峄g.',
+    systemModelSettings: 'C脿i 膽岷穞 M么 h矛nh H峄� th峄憂g',
+    systemModelSettingsLink: 'T岷 sao c岷 thi岷縯 ph岷 thi岷縯 l岷璸 m么 h矛nh h峄� th峄憂g?',
+    selectModel: 'Ch峄峮 m么 h矛nh c峄 b岷',
+    setupModelFirst: 'Vui l貌ng thi岷縯 l岷璸 m么 h矛nh c峄 b岷 tr瓢峄沜',
+    systemReasoningModel: {
+      key: 'M么 h矛nh l岷璸 lu岷璶 h峄� th峄憂g',
+      tip: 'Thi岷縯 l岷璸 m么 h矛nh suy lu岷璶 m岷穋 膽峄媙h s岷� 膽瓢峄 s峄� d峄g 膽峄� t岷 峄﹏g d峄g. C谩c t铆nh n膬ng nh瓢 t岷 t锚n cu峄檆 tr貌 chuy峄噉 v脿 膽峄� xu岷 c芒u h峄廼 ti岷縫 theo c农ng s岷� s峄� d峄g m么 h矛nh suy lu岷璶 m岷穋 膽峄媙h n脿y.',
+    },
+    embeddingModel: {
+      key: 'M么 h矛nh nh煤ng',
+      tip: 'Thi岷縯 l岷璸 m么 h矛nh m岷穋 膽峄媙h cho vi峄嘽 x峄� l媒 nh煤ng t脿i li峄噓 c峄 Ki岷縩 th峄ヽ, c岷� hai ph瓢啤ng ti峄噉 truy xu岷 v脿 nh岷璸 c峄 Ki岷縩 th峄ヽ 膽峄乽 s峄� d峄g m么 h矛nh nh煤ng n脿y cho x峄� l媒 vector h贸a. Chuy峄僴 膽峄昳 s岷� l脿m cho k铆ch th瓢峄沜 vector gi峄痑 Ki岷縩 th峄ヽ 膽瓢峄 nh岷璸 v脿 c芒u h峄廼 kh么ng nh岷 qu谩n, d岷玭 膽岷縩 vi峄嘽 truy xu岷 th岷 b岷. 膼峄� tr谩nh truy xu岷 th岷 b岷, vui l貌ng kh么ng chuy峄僴 膽峄昳 m么 h矛nh n脿y t霉y 媒.',
+      required: 'M么 h矛nh nh煤ng l脿 b岷痶 bu峄檆',
+    },
+    speechToTextModel: {
+      key: 'M么 h矛nh Chuy峄僴 膽峄昳 V膬n b岷 th脿nh Ti岷縩g n贸i',
+      tip: 'Thi岷縯 l岷璸 m么 h矛nh m岷穋 膽峄媙h cho 膽岷 v脿o chuy峄僴 膽峄昳 ti岷縩g n贸i th脿nh v膬n b岷 trong cu峄檆 tr貌 chuy峄噉.',
+    },
+    ttsModel: {
+      key: 'M么 h矛nh V膬n b岷 th脿nh Ti岷縩g n贸i',
+      tip: 'Thi岷縯 l岷璸 m么 h矛nh m岷穋 膽峄媙h cho 膽岷 v脿o v膬n b岷 th脿nh ti岷縩g n贸i trong cu峄檆 tr貌 chuy峄噉.',
+    },
+    rerankModel: {
+      key: 'M么 h矛nh S岷痯 x岷縫 l岷',
+      tip: 'M么 h矛nh s岷痯 x岷縫 l岷 s岷� s岷痯 x岷縫 l岷 danh s谩ch t脿i li峄噓 峄﹏g c峄� vi锚n d峄盿 tr锚n s峄� ph霉 h峄 ng峄� ngh末a v峄沬 truy v岷 c峄 ng瓢峄漣 d霉ng, c岷 thi峄噉 k岷縯 qu岷� c峄 vi峄嘽 x岷縫 h岷g ng峄� ngh末a',
+    },
+    quota: 'H岷 m峄ヽ',
+    searchModel: 'M么 h矛nh t矛m ki岷縨',
+    noModelFound: 'Kh么ng t矛m th岷 m么 h矛nh cho {{model}}',
+    models: 'M么 h矛nh',
+    showMoreModelProvider: 'Hi峄僴 th峄� th锚m nh脿 cung c岷 m么 h矛nh',
+    selector: {
+      tip: 'M么 h矛nh n脿y 膽茫 b峄� x贸a. Vui l貌ng th锚m m峄檛 m么 h矛nh ho岷穋 ch峄峮 m么 h矛nh kh谩c.',
+      emptyTip: 'Kh么ng c贸 m么 h矛nh kh岷� d峄g',
+      emptySetting: 'Vui l貌ng v脿o c脿i 膽岷穞 膽峄� c岷 h矛nh',
+      rerankTip: 'Vui l貌ng thi岷縯 l岷璸 m么 h矛nh s岷痯 x岷縫 l岷',
+    },
+    card: {
+      quota: 'QUOTA',
+      onTrial: 'Th峄� nghi峄噈',
+      paid: '膼茫 thanh to谩n',
+      quotaExhausted: 'Quota 膽茫 h岷縯',
+      callTimes: 'S峄� l岷 g峄峣',
+      tokens: 'Tokens',
+      buyQuota: 'Mua Quota',
+      priorityUse: '漂u ti锚n s峄� d峄g',
+      removeKey: 'Remove API Key',
+      tip: '漂u ti锚n s岷� 膽瓢峄 trao cho h岷 ng岷h 膽茫 thanh to谩n. H岷 ng岷h d霉ng th峄� s岷� 膽瓢峄 s峄� d峄g sau khi h岷縯 h岷 ng岷h tr岷� ph铆.',
+    },
+    item: {
+      deleteDesc: 'C谩c m么 h矛nh {{modelName}} 膽ang 膽瓢峄 s峄� d峄g nh瓢 l脿 c谩c m么 h矛nh l岷璸 lu岷璶 h峄� th峄憂g. M峄檛 s峄� ch峄ヽ n膬ng s岷� kh么ng kh岷� d峄g sau khi lo岷 b峄�. Vui l貌ng x谩c nh岷璶.',
+      freeQuota: 'QUY峄�N L峄 MI峄凬 PH脥',
+    },
+    addApiKey: 'Th锚m kh贸a API c峄 b岷',
+    invalidApiKey: 'Kh贸a API kh么ng h峄 l峄�',
+    encrypted: {
+      front: 'Kh贸a API C峄 B岷燦 s岷� 膽瓢峄 m茫 h贸a v脿 l瓢u tr峄� b岷眓g',
+      back: ' c么ng ngh峄�.',
+    },
+    freeQuota: {
+      howToEarn: 'C谩ch ki岷縨',
+    },
+    addMoreModelProvider: 'TH脢M NH脌 CUNG C岷 M脭 H脤NH',
+    addModel: 'Th锚m M么 h矛nh',
+    modelsNum: '{{num}} M么 h矛nh',
+    showModels: 'Hi峄噉 M么 h矛nh',
+    showModelsNum: 'Hi峄噉 {{num}} M么 h矛nh',
+    collapse: 'Thu g峄峮',
+    config: 'C岷 h矛nh',
+    modelAndParameters: 'M么 h矛nh v脿 Tham s峄�',
+    model: 'M么 h矛nh',
+    featureSupported: '{{feature}} 膽瓢峄 h峄� tr峄�',
+    callTimes: 'S峄� l岷 g峄峣',
+    credits: 'T铆n d峄g Tin nh岷痭',
+    buyQuota: 'Mua Quy峄乶 l峄',
+    getFreeTokens: 'Nh岷璶 m茫 th么ng b谩o mi峄卬 ph铆',
+    priorityUsing: '漂u ti锚n s峄� d峄g',
+    deprecated: '膼茫 l峄梚 th峄漣',
+    confirmDelete: 'X谩c nh岷璶 x贸a?',
+    quotaTip: 'S峄� l瓢峄g m茫 th么ng b谩o mi峄卬 ph铆 c貌n l岷',
+    loadPresets: 'T岷 C脿i 膽岷穞 tr瓢峄沜',
+    parameters: 'THAM S峄�',
+    loadBalancingHeadline: 'C芒n b岷眓g t岷',
+    loadBalancing: 'C芒n b岷眓g t岷',
+    configLoadBalancing: 'C岷 h矛nh c芒n b岷眓g t岷',
+    defaultConfig: 'C岷 h矛nh m岷穋 膽峄媙h',
+    modelHasBeenDeprecated: 'M么 h矛nh n脿y 膽茫 b峄� ph岷 膽峄慽',
+    providerManagedDescription: 'S峄� d峄g b峄� th么ng tin 膽膬ng nh岷璸 duy nh岷 do nh脿 cung c岷 m么 h矛nh cung c岷.',
+    apiKeyStatusNormal: 'Tr岷g th谩i APIKey b矛nh th瓢峄漬g',
+    editConfig: 'Ch峄塶h s峄璦 c岷 h矛nh',
+    loadBalancingInfo: 'Theo m岷穋 膽峄媙h, c芒n b岷眓g t岷 s峄� d峄g chi岷縩 l瓢峄 V貌ng tr貌n. N岷縰 gi峄沬 h岷 t峄慶 膽峄� 膽瓢峄 k铆ch ho岷, th峄漣 gian h峄搃 chi锚u 1 ph煤t s岷� 膽瓢峄 谩p d峄g.',
+    addConfig: 'Th锚m c岷 h矛nh',
+    loadBalancingDescription: 'Gi岷 谩p l峄眂 v峄沬 nhi峄乽 b峄� th么ng tin x谩c th峄眂.',
+    apiKey: 'KH脫A API',
+    providerManaged: 'Nh脿 cung c岷 膽瓢峄 qu岷 l媒',
+    apiKeyRateLimit: '膼茫 膽岷 膽岷縩 gi峄沬 h岷 t峄慶 膽峄�, c贸 s岷祅 sau {{gi芒y}} gi芒y',
+    upgradeForLoadBalancing: 'N芒ng c岷 g贸i c峄 b岷 膽峄� b岷璽 C芒n b岷眓g t岷.',
+    loadBalancingLeastKeyWarning: '膼峄� b岷璽 c芒n b岷眓g t岷, 铆t nh岷 2 ph铆m ph岷 膽瓢峄 b岷璽.',
+    toBeConfigured: '膼瓢峄 c岷 h矛nh',
+    emptyProviderTitle: 'Nh脿 cung c岷 m么 h矛nh ch瓢a 膽瓢峄 thi岷縯 l岷璸',
+    discoverMore: 'Kh谩m ph谩 th锚m trong',
+    emptyProviderTip: 'Vui l貌ng c脿i 膽岷穞 nh脿 cung c岷 m么 h矛nh tr瓢峄沜.',
+    installProvider: 'C脿i 膽岷穞 nh脿 cung c岷 m么 h矛nh',
+    configureTip: 'Thi岷縯 l岷璸 api-key ho岷穋 th锚m m么 h矛nh 膽峄� s峄� d峄g',
+  },
+  dataSource: {
+    add: 'Th锚m ngu峄搉 d峄� li峄噓',
+    connect: 'K岷縯 n峄慽',
+    notion: {
+      title: 'Notion',
+      description: 'S峄� d峄g Notion nh瓢 m峄檛 ngu峄搉 d峄� li峄噓 cho Ki岷縩 th峄ヽ.',
+      connectedWorkspace: 'Kh么ng gian l脿m vi峄嘽 膽茫 k岷縯 n峄慽',
+      addWorkspace: 'Th锚m kh么ng gian l脿m vi峄嘽',
+      connected: '膼茫 k岷縯 n峄慽',
+      disconnected: '膼茫 ng岷痶 k岷縯 n峄慽',
+      changeAuthorizedPages: 'Thay 膽峄昳 trang 膽瓢峄 峄 quy峄乶',
+      pagesAuthorized: 'C谩c trang 膽瓢峄 峄 quy峄乶',
+      sync: '膼峄搉g b峄�',
+      remove: 'X贸a',
+      selector: {
+        pageSelected: 'C谩c trang 膽茫 ch峄峮',
+        searchPages: 'T矛m ki岷縨 trang...',
+        noSearchResult: 'Kh么ng c贸 k岷縯 qu岷� t矛m ki岷縨',
+        addPages: 'Th锚m trang',
+        preview: 'Xem tr瓢峄沜',
+      },
+    },
+    website: {
+      title: 'Trang m岷g',
+      inactive: 'Kh么ng ho岷 膽峄檔g',
+      with: 'V峄沬',
+      active: 'Ho岷 膽峄檔g',
+      configuredCrawlers: 'Tr矛nh thu th岷璸 th么ng tin 膽茫 膽峄媙h c岷 h矛nh',
+      description: 'Nh岷璸 n峄檌 dung t峄� c谩c trang web b岷眓g tr矛nh thu th岷璸 d峄� li峄噓 web.',
+    },
+    configure: 'C岷 h矛nh',
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'Kh贸a API',
+      apiKeyPlaceholder: 'Nh岷璸 kh贸a API c峄 b岷',
+      keyFrom: 'Nh岷璶 kh贸a SerpAPI c峄 b岷 t峄� Trang t脿i kho岷 SerpAPI',
+    },
+  },
+  apiBasedExtension: {
+    title: 'C谩c ti峄噉 铆ch API cung c岷 qu岷 l媒 API t岷璸 trung, gi煤p c岷 h矛nh d峄� d脿ng s峄� d峄g tr锚n c谩c 峄﹏g d峄g c峄 Dify.',
+    link: 'T矛m hi峄僽 c谩ch ph谩t tri峄僴 Ph岷 m峄� r峄檔g API c峄 ri锚ng b岷.',
+    linkUrl: 'https://docs.dify.ai/en/guides/extension/api-based-extension/README',
+    add: 'Th锚m Ph岷 m峄� r峄檔g API',
+    selector: {
+      title: 'Ph岷 m峄� r峄檔g API',
+      placeholder: 'Vui l貌ng ch峄峮 ph岷 m峄� r峄檔g API',
+      manage: 'Qu岷 l媒 Ph岷 m峄� r峄檔g API',
+    },
+    modal: {
+      title: 'Th锚m Ph岷 m峄� r峄檔g API',
+      editTitle: 'Ch峄塶h s峄璦 Ph岷 m峄� r峄檔g API',
+      name: {
+        title: 'T锚n',
+        placeholder: 'Vui l貌ng nh岷璸 t锚n',
+      },
+      apiEndpoint: {
+        title: '膼i峄僲 cu峄慽 API',
+        placeholder: 'Vui l貌ng nh岷璸 膽i峄僲 cu峄慽 API',
+      },
+      apiKey: {
+        title: 'Kh贸a API',
+        placeholder: 'Vui l貌ng nh岷璸 kh贸a API',
+        lengthError: '膼峄� d脿i kh贸a API kh么ng 膽瓢峄 nh峄� h啤n 5 k媒 t峄�',
+      },
+    },
+    type: 'Lo岷',
+  },
+  about: {
+    changeLog: 'Nh岷璽 k媒 thay 膽峄昳',
+    updateNow: 'C岷璸 nh岷璽 ngay',
+    nowAvailable: 'Dify {{version}} hi峄噉 膽茫 c贸 s岷祅.',
+    latestAvailable: 'Dify {{version}} l脿 phi锚n b岷 m峄沬 nh岷 hi峄噉 c贸.',
+  },
+  appMenus: {
+    overview: 'Gi谩m s谩t',
+    promptEng: 'Orchestrate',
+    apiAccess: 'Truy c岷璸 API',
+    logAndAnn: 'Nh岷璽 k媒 & Th么ng b谩o',
+    logs: 'Nh岷璽 k媒',
+  },
+  environment: {
+    testing: 'TESTING',
+    development: 'DEVELOPMENT',
+  },
+  appModes: {
+    completionApp: '峄╪g d峄g T岷 v膬n b岷',
+    chatApp: '峄╪g d峄g Tr貌 chuy峄噉',
+  },
+  datasetMenus: {
+    documents: 'T脿i li峄噓',
+    hitTesting: 'Ki峄僲 tra truy v岷',
+    settings: 'C脿i 膽岷穞',
+    emptyTip: 'Ki岷縩 th峄ヽ ch瓢a 膽瓢峄 li锚n k岷縯, vui l貌ng 膽i 膽岷縩 峄﹏g d峄g ho岷穋 plug-in 膽峄� ho脿n th脿nh li锚n k岷縯.',
+    viewDoc: 'Xem t脿i li峄噓',
+    relatedApp: 'c谩c 峄﹏g d峄g li锚n k岷縯',
+    noRelatedApp: 'Kh么ng c贸 峄﹏g d峄g 膽瓢峄 li锚n k岷縯',
+  },
+  voiceInput: {
+    speaking: 'H茫y n贸i...',
+    converting: 'Chuy峄僴 膽峄昳 th脿nh v膬n b岷...',
+    notAllow: 'micro kh么ng 膽瓢峄 峄 quy峄乶',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: '膼峄昳 t锚n Cu峄檆 tr貌 chuy峄噉',
+    conversationName: 'T锚n cu峄檆 tr貌 chuy峄噉',
+    conversationNamePlaceholder: 'Vui l貌ng nh岷璸 t锚n cu峄檆 tr貌 chuy峄噉',
+    conversationNameCanNotEmpty: 'Y锚u c岷 nh岷璸 t锚n cu峄檆 tr貌 chuy峄噉',
+    citation: {
+      title: 'THAM KH岷',
+      linkToDataset: 'Li锚n k岷縯 t峄沬 Ki岷縩 th峄ヽ',
+      characters: 'K媒 t峄�:',
+      hitCount: 'S峄� l瓢峄 truy xu岷:',
+      vectorHash: 'Vector hash:',
+      hitScore: '膼i峄僲 truy xu岷:',
+    },
+    inputPlaceholder: 'N贸i chuy峄噉 v峄沬 Bot',
+    thought: 'T瓢 duy',
+    thinking: 'Suy ngh末...',
+    resend: 'G峄璱 l岷',
+  },
+  promptEditor: {
+    placeholder: 'Vi岷縯 t峄� kh贸a c峄 b岷 峄� 膽芒y, nh岷璸 \'{\' 膽峄� ch猫n m峄檛 bi岷縩, nh岷璸 \'/\' 膽峄� ch猫n m峄檛 kh峄慽 n峄檌 dung nh岷痗 nh峄�',
+    context: {
+      item: {
+        title: 'B峄慽 c岷h',
+        desc: 'Ch猫n m岷玼 b峄慽 c岷h',
+      },
+      modal: {
+        title: '{{num}} Ki岷縩 th峄ヽ trong B峄慽 c岷h',
+        add: 'Th锚m B峄慽 c岷h',
+        footer: 'B岷 c贸 th峄� qu岷 l媒 c谩c b峄慽 c岷h trong ph岷 B峄慽 c岷h b锚n d瓢峄沬.',
+      },
+    },
+    history: {
+      item: {
+        title: 'L峄媍h s峄� Cu峄檆 tr貌 chuy峄噉',
+        desc: 'Ch猫n m岷玼 tin nh岷痭 l峄媍h s峄�',
+      },
+      modal: {
+        title: 'V脥 D峄�',
+        user: 'Xin ch脿o',
+        assistant: 'Xin ch脿o! T么i c贸 th峄� gi煤p g矛 cho b岷 h么m nay?',
+        edit: 'Ch峄塶h s峄璦 T锚n Vai tr貌 Cu峄檆 tr貌 chuy峄噉',
+      },
+    },
+    variable: {
+      item: {
+        title: 'Bi岷縩 & C么ng c峄� B锚n ngo脿i',
+        desc: 'Ch猫n Bi岷縩 & C么ng c峄� B锚n ngo脿i',
+      },
+      outputToolDisabledItem: {
+        title: 'C么ng c峄� B锚n ngo脿i',
+        desc: 'C么ng c峄� B锚n ngo脿i kh么ng th峄� ch猫n v脿o 膽芒y',
+      },
+      modal: {
+        add: 'Bi岷縩 m峄沬',
+        addTool: 'C么ng c峄� m峄沬',
+      },
+    },
+    query: {
+      item: {
+        title: 'Truy v岷',
+        desc: 'Ch猫n m岷玼 truy v岷 ng瓢峄漣 d霉ng',
+      },
+    },
+    existed: '膼茫 t峄搉 t岷 trong tin nh岷痭',
+  },
+  imageUploader: {
+    uploadFromComputer: 'T岷 l锚n t峄� M谩y t铆nh',
+    uploadFromComputerReadError: '膼峄峜 岷h th岷 b岷, vui l貌ng th峄� l岷.',
+    uploadFromComputerUploadError: 'T岷 岷h l锚n th岷 b岷, vui l貌ng t岷 l锚n l岷.',
+    uploadFromComputerLimit: '岷h t岷 l锚n kh么ng 膽瓢峄 v瓢峄 qu谩 {{size}} MB',
+    pasteImageLink: 'D谩n li锚n k岷縯 岷h',
+    pasteImageLinkInputPlaceholder: 'D谩n li锚n k岷縯 岷h 峄� 膽芒y',
+    pasteImageLinkInvalid: 'Li锚n k岷縯 岷h kh么ng h峄 l峄�',
+    imageUpload: 'T岷 岷h l锚n',
+  },
+  tag: {
+    placeholder: 'T岷 c岷� c谩c th岷�',
+    addNew: 'Th锚m th岷� m峄沬',
+    noTag: 'Kh么ng c贸 th岷�',
+    noTagYet: 'Ch瓢a c贸 th岷�',
+    addTag: 'th锚m th岷�',
+    editTag: 'Ch峄塶h s峄璦 th岷�',
+    manageTags: 'Qu岷 l媒 th岷�',
+    selectorPlaceholder: 'Nh岷璸 膽峄� t矛m ki岷縨 ho岷穋 t岷',
+    create: 'T岷',
+    delete: 'X贸a th岷�',
+    deleteTip: 'Th岷� 膽ang 膽瓢峄 s峄� d峄g, x贸a n贸 膽i?',
+    created: 'Th岷� 膽瓢峄 t岷 th脿nh c么ng',
+    failed: 'T岷 th岷� kh么ng th脿nh c么ng',
+  },
+  errorMsg: {
+    fieldRequired: '{{tr瓢峄漬g}} l脿 b岷痶 bu峄檆',
+    urlError: 'URL ph岷 b岷痶 膽岷 b岷眓g http:// ho岷穋 https://',
+  },
+  fileUploader: {
+    uploadFromComputer: 'T岷 l锚n c峄 b峄�',
+    pasteFileLink: 'D谩n li锚n k岷縯 t峄噋',
+    pasteFileLinkInputPlaceholder: 'Nh岷璸 URL...',
+    uploadFromComputerLimit: 'T岷 l锚n t峄噋 kh么ng 膽瓢峄 v瓢峄 qu谩 {{size}}',
+    fileExtensionNotSupport: 'Ph岷 m峄� r峄檔g t峄噋 kh么ng 膽瓢峄 h峄� tr峄�',
+    pasteFileLinkInvalid: 'Li锚n k岷縯 t峄噋 kh么ng h峄 l峄�',
+    uploadFromComputerUploadError: 'T岷 l锚n t峄噋 kh么ng th脿nh c么ng, vui l貌ng t岷 l锚n l岷.',
+    uploadFromComputerReadError: '膼峄峜 t峄噋 kh么ng th脿nh c么ng, vui l貌ng th峄� l岷.',
+  },
+  license: {
+    expiring_plural: 'H岷縯 h岷 sau {{count}} ng脿y',
+    expiring: 'H岷縯 h岷 trong m峄檛 ng脿y',
+  },
+  pagination: {
+    perPage: 'M峄 tr锚n m峄梚 trang',
+  },
+  theme: {
+    auto: 'h峄� th峄憂g',
+    theme: 'Ch峄� 膽峄�',
+    light: '谩nh s谩ng',
+    dark: 't峄慽',
+  },
+  compliance: {
+    iso27001: 'Ch峄﹏g nh岷璶 ISO 27001:2022',
+    gdpr: 'GDPR DPA',
+    soc2Type1: 'B谩o c谩o lo岷 SOC 2 Type I',
+    professionalUpgradeTooltip: 'Ch峄� c贸 s岷祅 v峄沬 g贸i Team ho岷穋 cao h啤n.',
+    sandboxUpgradeTooltip: 'Ch峄� c贸 s岷祅 v峄沬 g贸i Chuy锚n nghi峄噋 ho岷穋 Nh贸m.',
+    soc2Type2: 'B谩o c谩o SOC 2 Type II',
+  },
+  imageInput: {
+    supportedFormats: 'H峄� tr峄� PNG, JPG, JPEG, WEBP v脿 GIF',
+    dropImageHere: 'K茅o h矛nh 岷h c峄 b岷 v脿o 膽芒y, ho岷穋',
+    browse: 'duy峄噒',
+  },
+}
+
+export default translation
diff --git a/i18n/vi-VN/custom.ts b/i18n/vi-VN/custom.ts
new file mode 100644
index 0000000..6f9a472
--- /dev/null
+++ b/i18n/vi-VN/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: 'T霉y ch峄塶h',
+  upgradeTip: {
+    prefix: 'N芒ng c岷 g贸i c峄 b岷 膽峄�',
+    suffix: 't霉y ch峄塶h th瓢啤ng hi峄噓.',
+    des: 'N芒ng c岷 k岷� ho岷h c峄 b岷 膽峄� t霉y ch峄塶h th瓢啤ng hi峄噓 c峄 b岷',
+    title: 'N芒ng c岷 g贸i c峄 b岷',
+  },
+  webapp: {
+    title: 'T霉y ch峄塶h th瓢啤ng hi峄噓 WebApp',
+    removeBrand: 'X贸a "膼瓢峄 h峄� tr峄� b峄焛 Dify"',
+    changeLogo: 'Thay 膽峄昳 logo "膼瓢峄 h峄� tr峄� b峄焛"',
+    changeLogoTip: '膼峄媙h d岷g SVG ho岷穋 PNG v峄沬 k铆ch th瓢峄沜 t峄慽 thi峄僽 40x40px',
+  },
+  app: {
+    title: 'T霉y ch峄塶h th瓢啤ng hi峄噓 ti锚u 膽峄� 峄﹏g d峄g',
+    changeLogoTip: '膼峄媙h d岷g SVG ho岷穋 PNG v峄沬 k铆ch th瓢峄沜 t峄慽 thi峄僽 80x80px',
+  },
+  upload: 'T岷 l锚n',
+  uploading: '膼ang t岷 l锚n',
+  uploadedFail: 'T岷 岷h l锚n th岷 b岷, vui l貌ng th峄� l岷.',
+  change: 'Thay 膽峄昳',
+  apply: '脕p d峄g',
+  restore: 'Kh么i ph峄 m岷穋 膽峄媙h',
+  customize: {
+    contactUs: 'li锚n h峄� v峄沬 ch煤ng t么i',
+    prefix: '膼峄� t霉y ch峄塶h logo th瓢啤ng hi峄噓 trong 峄﹏g d峄g, vui l貌ng',
+    suffix: '膽峄� n芒ng c岷 l锚n phi锚n b岷 Doanh nghi峄噋.',
+  },
+}
+
+export default translation
diff --git a/i18n/vi-VN/dataset-creation.ts b/i18n/vi-VN/dataset-creation.ts
new file mode 100644
index 0000000..f909a51
--- /dev/null
+++ b/i18n/vi-VN/dataset-creation.ts
@@ -0,0 +1,218 @@
+const translation = {
+  steps: {
+    header: {
+      creation: 'T岷 Ki岷縩 th峄ヽ',
+      update: 'Th锚m d峄� li峄噓',
+      fallbackRoute: 'Ki岷縩 th峄ヽ',
+    },
+    one: 'Ch峄峮 ngu峄搉 d峄� li峄噓',
+    two: 'Ti峄乶 x峄� l媒 v脿 l脿m s岷h v膬n b岷',
+    three: 'Th峄眂 hi峄噉 v脿 ho脿n th脿nh',
+  },
+  error: {
+    unavailable: 'Ki岷縩 th峄ヽ n脿y kh么ng kh岷� d峄g',
+  },
+  stepOne: {
+    filePreview: 'Xem tr瓢峄沜 t峄噋',
+    pagePreview: 'Xem tr瓢峄沜 trang',
+    dataSourceType: {
+      file: 'Nh岷璸 t峄� t峄噋 v膬n b岷',
+      notion: '膼峄搉g b峄� t峄� Notion',
+      web: '膼峄搉g b峄� t峄� trang web',
+    },
+    uploader: {
+      title: 'T岷 l锚n t峄噋 v膬n b岷',
+      button: 'K茅o v脿 th岷� c谩c t岷璸 tin ho岷穋 th瓢 m峄, ho岷穋',
+      browse: 'Ch峄峮 t峄噋',
+      tip: 'H峄� tr峄� {{supportTypes}}. T峄慽 膽a {{size}}MB m峄梚 t峄噋.',
+      validation: {
+        typeError: 'Lo岷 t峄噋 kh么ng 膽瓢峄 h峄� tr峄�',
+        size: 'T峄噋 qu谩 l峄沶. T峄慽 膽a l脿 {{size}}MB',
+        count: 'Kh么ng h峄� tr峄� t岷 l锚n nhi峄乽 t峄噋',
+        filesNumber: 'B岷 膽茫 膽岷 膽岷縩 gi峄沬 h岷 t岷 l锚n l么 c峄 {{filesNumber}} t峄噋.',
+      },
+      cancel: 'H峄',
+      change: 'Thay 膽峄昳',
+      failed: 'T岷 l锚n th岷 b岷',
+    },
+    notionSyncTitle: 'Notion ch瓢a 膽瓢峄 k岷縯 n峄慽',
+    notionSyncTip: '膼峄� 膽峄搉g b峄� v峄沬 Notion, tr瓢峄沜 ti锚n c岷 thi岷縯 l岷璸 k岷縯 n峄慽 v峄沬 Notion.',
+    connect: '膼i 膽岷縩 k岷縯 n峄慽',
+    button: 'ti岷縫 theo',
+    emptyDatasetCreation: 'T么i mu峄憂 t岷 Ki岷縩 th峄ヽ tr峄憂g',
+    modal: {
+      title: 'T岷 Ki岷縩 th峄ヽ tr峄憂g',
+      tip: 'M峄檛 Ki岷縩 th峄ヽ tr峄憂g s岷� kh么ng ch峄゛ t脿i li峄噓 n脿o, v脿 b岷 c贸 th峄� t岷 l锚n t脿i li峄噓 b岷 k峄� l煤c n脿o.',
+      input: 'T锚n Ki岷縩 th峄ヽ',
+      placeholder: 'Vui l貌ng nh岷璸',
+      nameNotEmpty: 'T锚n kh么ng th峄� 膽峄� tr峄憂g',
+      nameLengthInvalid: 'T锚n ph岷 t峄� 1 膽岷縩 40 k媒 t峄�',
+      cancelButton: 'H峄',
+      confirmButton: 'T岷',
+      failed: 'T岷 th岷 b岷',
+    },
+    website: {
+      fireCrawlNotConfigured: 'Firecrawl kh么ng 膽瓢峄 c岷 h矛nh',
+      limit: 'Gi峄沬 h岷',
+      run: 'Ch岷',
+      firecrawlDoc: 'T脿i li峄噓 Firecrawl',
+      fireCrawlNotConfiguredDescription: '膼峄媙h c岷 h矛nh Firecrawl b岷眓g kh贸a API 膽峄� s峄� d峄g.',
+      configure: 'C岷 h矛nh',
+      scrapTimeInfo: 'T峄昻g c峄檔g {{t峄昻g}} trang 膽瓢峄 thu th岷璸 trong v貌ng {{th峄漣 gian}}',
+      options: 'T霉y ch峄峮',
+      unknownError: 'L峄梚 kh么ng x谩c 膽峄媙h',
+      extractOnlyMainContent: 'Ch峄� tr铆ch xu岷 n峄檌 dung ch铆nh (kh么ng c贸 膽岷 trang, 膽i峄乽 h瓢峄沶g, ch芒n trang, v.v.)',
+      exceptionErrorTitle: 'M峄檛 ngo岷 l峄� x岷 ra trong khi ch岷 t谩c v峄� Firecrawl:',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      selectAll: 'Ch峄峮 t岷 c岷�',
+      firecrawlTitle: 'Tr铆ch xu岷 n峄檌 dung web b岷眓g 馃敟Firecrawl',
+      totalPageScraped: 'T峄昻g s峄� trang 膽瓢峄 c岷:',
+      excludePaths: 'Lo岷 tr峄� 膽瓢峄漬g d岷玭',
+      includeOnlyPaths: 'Ch峄� bao g峄搈 膽瓢峄漬g d岷玭',
+      maxDepth: '膼峄� s芒u t峄慽 膽a',
+      preview: 'Download',
+      resetAll: '膼岷穞 l岷 t岷 c岷�',
+      crawlSubPage: 'Thu th岷璸 d峄� li峄噓 c谩c trang ph峄�',
+      maxDepthTooltip: '膼峄� s芒u t峄慽 膽a c岷 thu th岷璸 d峄� li峄噓 so v峄沬 URL 膽茫 nh岷璸. 膼峄� s芒u 0 ch峄� c岷 c岷 trang c峄 url 膽茫 nh岷璸, 膽峄� s芒u 1 c岷 url v脿 m峄峣 th峄� sau khi nh岷璸URL + m峄檛 /, v.v.',
+      jinaReaderTitle: 'Chuy峄僴 膽峄昳 to脿n b峄� trang web th脿nh Markdown',
+      jinaReaderDoc: 'T矛m hi峄僽 th锚m v峄� Jina Reader',
+      useSitemap: 'S峄� d峄g s啤 膽峄� trang web',
+      chooseProvider: 'Ch峄峮 nh脿 cung c岷',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      jinaReaderNotConfigured: 'Jina Reader kh么ng 膽瓢峄 c岷 h矛nh',
+      jinaReaderNotConfiguredDescription: 'Thi岷縯 l岷璸 Jina Reader b岷眓g c谩ch nh岷璸 kh贸a API mi峄卬 ph铆 c峄 b岷 膽峄� truy c岷璸.',
+      useSitemapTooltip: 'Th峄眂 hi峄噉 theo s啤 膽峄� trang web 膽峄� thu th岷璸 d峄� li峄噓 trang web. N岷縰 kh么ng, Jina Reader s岷� thu th岷璸 d峄� li峄噓 l岷穚 膽i l岷穚 l岷 d峄盿 tr锚n m峄ヽ 膽峄� li锚n quan c峄 trang, mang l岷 铆t trang h啤n nh瓢ng ch岷 l瓢峄g cao h啤n.',
+      configureWatercrawl: 'C岷 h矛nh Watercrawl',
+      configureFirecrawl: 'C岷 h矛nh Firecrawl',
+      configureJinaReader: 'C岷 h矛nh Jina Reader',
+      waterCrawlNotConfiguredDescription: 'C岷 h矛nh Watercrawl v峄沬 kh贸a API 膽峄� s峄� d峄g n贸.',
+      watercrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      watercrawlTitle: 'Tr铆ch xu岷 n峄檌 dung web b岷眓g Watercrawl',
+      watercrawlDoc: 'T脿i li峄噓 Watercrawl',
+      waterCrawlNotConfigured: 'Watercrawl ch瓢a 膽瓢峄 c岷 h矛nh',
+    },
+    cancel: 'H峄',
+  },
+  stepTwo: {
+    segmentation: 'C脿i 膽岷穞 ph芒n 膽o岷',
+    auto: 'T峄� 膽峄檔g',
+    autoDescription: 'T峄� 膽峄檔g thi岷縯 l岷璸 quy t岷痗 ph芒n 膽o岷 v脿 ti峄乶 x峄� l媒. Khuy岷縩 ngh峄� cho ng瓢峄漣 d霉ng m峄沬.',
+    custom: 'T霉y ch峄塶h',
+    customDescription: 'T霉y ch峄塶h quy t岷痗 ph芒n 膽o岷, 膽峄� d脿i 膽o岷 v脿 quy t岷痗 ti峄乶 x峄� l媒, v.v.',
+    separator: 'K媒 t峄� ph芒n 膽o岷',
+    separatorPlaceholder: 'V铆 d峄�, d貌ng m峄沬 (\\\\n) ho岷穋 k媒 t峄� 膽岷穋 bi峄噒 (nh瓢 "***")',
+    maxLength: '膼峄� d脿i t峄慽 膽a c峄 膽o岷',
+    overlap: '膼峄� ch峄搉g l岷 膽o岷',
+    overlapTip: 'Thi岷縯 l岷璸 ch峄搉g l岷 膽o岷 c贸 th峄� duy tr矛 s峄� li锚n quan ng峄� ngh末a gi峄痑 ch煤ng, t膬ng c瓢峄漬g hi峄噓 qu岷� truy xu岷. 膼峄� xu岷 thi岷縯 l岷璸 t峄� 10% 膽岷縩 25% c峄 k铆ch th瓢峄沜 膽o岷 t峄慽 膽a.',
+    overlapCheck: '膼峄� ch峄搉g l岷 膽o岷 kh么ng n锚n l峄沶 h啤n 膽峄� d脿i t峄慽 膽a c峄 膽o岷',
+    rules: 'Quy t岷痗 ti峄乶 x峄� l媒 v膬n b岷',
+    removeExtraSpaces: 'Thay th岷� kho岷g tr岷痭g li锚n t峄, d貌ng m峄沬 v脿 tab',
+    removeUrlEmails: 'X贸a t岷 c岷� URL v脿 膽峄媋 ch峄� email',
+    removeStopwords: 'Lo岷 b峄� c谩c t峄� d峄玭g nh瓢 "m峄檛", "v脿", "nh峄痭g"',
+    preview: 'X谩c nh岷璶 & Xem tr瓢峄沜',
+    reset: '膼岷穞 l岷',
+    indexMode: 'Ch岷� 膽峄� ch峄� m峄',
+    qualified: 'Ch岷 l瓢峄g cao',
+    recommend: 'Khuy岷縩 ngh峄�',
+    qualifiedTip: 'S峄� d峄g giao di峄噉 nh煤ng h峄� th峄憂g m岷穋 膽峄媙h 膽峄� x峄� l媒, cung c岷 膽峄� ch铆nh x谩c cao h啤n khi ng瓢峄漣 d霉ng truy v岷.',
+    warning: 'Vui l貌ng thi岷縯 l岷璸 kh贸a API nh脿 cung c岷 m么 h矛nh tr瓢峄沜.',
+    click: '膼i 膽岷縩 c脿i 膽岷穞',
+    economical: 'Ti岷縯 ki峄噈',
+    economicalTip: 'S峄� d峄g c谩c 膽峄檔g c啤 vector ngo岷 tuy岷縩, ch峄� m峄 t峄� kh贸a, v.v. 膽峄� gi岷 膽峄� ch铆nh x谩c m脿 kh么ng t峄憂 token',
+    QATitle: 'Ph芒n 膽o岷 theo 膽峄媙h d岷g C芒u h峄廼 & Tr岷� l峄漣',
+    QATip: 'B岷璽 t霉y ch峄峮 n脿y s岷� ti锚u t峄憂 th锚m token',
+    QALanguage: 'Ph芒n 膽o岷 b岷眓g',
+    estimateCost: '漂峄沜 t铆nh',
+    estimateSegment: 'S峄� 膽o岷 瓢峄沜 t铆nh',
+    segmentCount: '膽o岷',
+    calculating: '膼ang t铆nh to谩n...',
+    fileSource: 'Ti峄乶 x峄� l媒 t脿i li峄噓',
+    notionSource: 'Ti峄乶 x峄� l媒 trang',
+    other: 'v脿 ',
+    fileUnit: ' t峄噋',
+    notionUnit: ' trang',
+    previousStep: 'Quay l岷',
+    nextStep: 'L瓢u & X峄� l媒',
+    save: 'L瓢u & X峄� l媒',
+    cancel: 'H峄',
+    sideTipTitle: 'T岷 sao ph岷 ph芒n 膽o岷 v脿 ti峄乶 x峄� l媒?',
+    sideTipP1: 'Khi x峄� l媒 d峄� li峄噓 v膬n b岷, ph芒n 膽o岷 v脿 l脿m s岷h l脿 hai b瓢峄沜 ti峄乶 x峄� l媒 quan tr峄峮g.',
+    sideTipP2: 'Ph芒n 膽o岷 chia nh峄� v膬n b岷 d脿i th脿nh c谩c 膽o岷 膽峄� m么 h矛nh hi峄僽 膽瓢峄 t峄憈 h啤n. 膼i峄乽 n脿y c岷 thi峄噉 ch岷 l瓢峄g v脿 t铆nh li锚n quan c峄 k岷縯 qu岷� m么 h矛nh.',
+    sideTipP3: 'L脿m s岷h lo岷 b峄� c谩c k媒 t峄� v脿 膽峄媙h d岷g kh么ng c岷 thi岷縯, l脿m cho Ki岷縩 th峄ヽ tr峄� n锚n s岷h s岷� v脿 d峄� d脿ng ph芒n t铆ch h啤n.',
+    sideTipP4: 'Ph芒n 膽o岷 v脿 l脿m s岷h 膽煤ng c谩ch c岷 thi峄噉 hi峄噓 su岷 c峄 m么 h矛nh, cung c岷 k岷縯 qu岷� ch铆nh x谩c v脿 c贸 gi谩 tr峄� h啤n.',
+    previewTitle: 'Xem tr瓢峄沜',
+    previewTitleButton: 'Xem tr瓢峄沜',
+    previewButton: 'Chuy峄僴 sang d岷g C芒u h峄廼 & Tr岷� l峄漣',
+    previewSwitchTipStart: 'Xem tr瓢峄沜 膽o岷 hi峄噉 t岷 膽ang 峄� 膽峄媙h d岷g v膬n b岷, chuy峄僴 sang xem tr瓢峄沜 d岷g c芒u h峄廼 v脿 tr岷� l峄漣 s岷�',
+    previewSwitchTipEnd: ' ti锚u t峄憂 th锚m token',
+    characters: 'k媒 t峄�',
+    indexSettingTip: '膼峄� thay 膽峄昳 ph瓢啤ng ph谩p ch峄� m峄, vui l貌ng 膽i t峄沬 ',
+    retrievalSettingTip: '膼峄� thay 膽峄昳 ph瓢啤ng ph谩p truy xu岷, vui l貌ng 膽i t峄沬 ',
+    datasetSettingLink: 'c脿i 膽岷穞 Ki岷縩 th峄ヽ.',
+    websiteSource: 'Trang web ti峄乶 x峄� l媒',
+    webpageUnit: 'Trang',
+    separatorTip: 'D岷 ph芒n c谩ch l脿 k媒 t峄� 膽瓢峄 s峄� d峄g 膽峄� ph芒n t谩ch v膬n b岷. \\n\\n v脿 \\n l脿 d岷 ph芒n c谩ch th瓢峄漬g 膽瓢峄 s峄� d峄g 膽峄� t谩ch c谩c 膽o岷 v膬n v脿 d貌ng. K岷縯 h峄 v峄沬 d岷 ph岷﹜ (\\n\\n,\\n), c谩c 膽o岷 v膬n s岷� 膽瓢峄 ph芒n 膽o岷 theo c谩c d貌ng khi v瓢峄 qu谩 膽峄� d脿i 膽o岷 t峄慽 膽a. B岷 c农ng c贸 th峄� s峄� d峄g d岷 ph芒n c谩ch 膽岷穋 bi峄噒 do ch铆nh b岷 x谩c 膽峄媙h (v铆 d峄�: ***).',
+    maxLengthCheck: 'Chi峄乽 d脿i 膽o岷 t峄慽 膽a ph岷 nh峄� h啤n {{limit}}',
+    fullDocTip: 'To脿n b峄� t脿i li峄噓 膽瓢峄 s峄� d峄g l脿m ph岷 cha v脿 膽瓢峄 truy xu岷 tr峄眂 ti岷縫. Xin l瓢u 媒 r岷眓g v矛 l媒 do hi峄噓 su岷, v膬n b岷 v瓢峄 qu谩 10000 m茫 th么ng b谩o s岷� t峄� 膽峄檔g b峄� c岷痶 b峄泃.',
+    parentChild: 'Cha m岷�-con c谩i',
+    general: 'T峄昻g qu谩t',
+    parentChildTip: 'Khi s峄� d峄g ch岷� 膽峄� cha-con, ph岷 con 膽瓢峄 s峄� d峄g 膽峄� truy xu岷 v脿 ph岷 cha 膽瓢峄 s峄� d峄g 膽峄� g峄峣 l岷 d瓢峄沬 d岷g ng峄� c岷h.',
+    fullDoc: 'T脿i li峄噓 膽岷 膽峄�',
+    notAvailableForQA: 'Kh么ng c贸 s岷祅 cho Ch峄� s峄� H峄廼 & 膼谩p',
+    notAvailableForParentChild: 'Kh么ng c贸 s岷祅 cho Ch峄� s峄� cha m岷�-con',
+    previewChunk: 'Xem tr瓢峄沜 Chunk',
+    previewChunkTip: 'Nh岷 v脿o n煤t \'Preview Chunk\' 峄� b锚n tr谩i 膽峄� t岷 b岷 xem tr瓢峄沜',
+    childChunkForRetrieval: 'Child-chunk 膽峄� truy xu岷',
+    highQualityTip: 'Sau khi ho脿n t岷 vi峄嘽 nh煤ng 峄� ch岷� 膽峄� Ch岷 l瓢峄g cao, kh么ng th峄� ho脿n nguy锚n v峄� ch岷� 膽峄� Ti岷縯 ki峄噈.',
+    useQALanguage: 'Chunk s峄� d峄g 膽峄媙h d岷g Q & A trong',
+    generalTip: 'Ch岷� 膽峄� ph芒n 膽o岷 v膬n b岷 chung, c谩c 膽o岷 膽瓢峄 truy xu岷 v脿 g峄峣 l岷 l脿 nh瓢 nhau.',
+    qaSwitchHighQualityTipTitle: '膼峄媙h d岷g Q & A y锚u c岷 ph瓢啤ng ph谩p l岷璸 ch峄� m峄 ch岷 l瓢峄g cao',
+    qaSwitchHighQualityTipContent: 'Hi峄噉 t岷, ch峄� c贸 ph瓢啤ng ph谩p ch峄� m峄 ch岷 l瓢峄g cao m峄沬 h峄� tr峄� ph芒n 膽o岷 膽峄媙h d岷g Q&A. B岷 c贸 mu峄憂 chuy峄僴 sang ch岷� 膽峄� ch岷 l瓢峄g cao kh么ng?',
+    switch: 'Chuy峄僴',
+    paragraph: '膼o岷',
+    parentChunkForContext: 'Parent-chunk cho ng峄� c岷h',
+    previewChunkCount: '{{膽岷縨}} Kh峄慽 瓢峄沜 t铆nh',
+    parentChildDelimiterTip: 'D岷 ph芒n c谩ch l脿 k媒 t峄� 膽瓢峄 s峄� d峄g 膽峄� ph芒n t谩ch v膬n b岷. \\n\\n 膽瓢峄 khuy岷縩 ngh峄� 膽峄� chia t脿i li峄噓 g峄慶 th脿nh c谩c ph岷 l峄沶 c峄 cha m岷�. B岷 c农ng c贸 th峄� s峄� d峄g c谩c d岷 ph芒n c谩ch 膽岷穋 bi峄噒 do ch铆nh b岷 x谩c 膽峄媙h.',
+    parentChildChunkDelimiterTip: 'D岷 ph芒n c谩ch l脿 k媒 t峄� 膽瓢峄 s峄� d峄g 膽峄� ph芒n t谩ch v膬n b岷. \\n 膽瓢峄 khuy岷縩 ngh峄� 膽峄� chia c谩c chunk cha th脿nh c谩c chunk con nh峄�. B岷 c农ng c贸 th峄� s峄� d峄g c谩c d岷 ph芒n c谩ch 膽岷穋 bi峄噒 do ch铆nh b岷 x谩c 膽峄媙h.',
+    paragraphTip: 'Ch岷� 膽峄� n脿y chia v膬n b岷 th脿nh c谩c 膽o岷 v膬n d峄盿 tr锚n d岷 ph芒n c谩ch v脿 膽峄� d脿i kh峄慽 t峄慽 膽a, s峄� d峄g v膬n b岷 膽瓢峄 t谩ch l脿m ph岷 g峄慶 膽峄� truy xu岷.',
+  },
+  stepThree: {
+    creationTitle: '馃帀 Ki岷縩 th峄ヽ 膽茫 膽瓢峄 t岷',
+    creationContent: 'Ch煤ng t么i 膽茫 t峄� 膽峄檔g 膽岷穞 t锚n cho Ki岷縩 th峄ヽ, b岷 c贸 th峄� s峄璦 膽峄昳 n贸 b岷 k峄� l煤c n脿o',
+    label: 'T锚n Ki岷縩 th峄ヽ',
+    additionTitle: '馃帀 T脿i li峄噓 膽茫 膽瓢峄 t岷 l锚n',
+    additionP1: 'T脿i li峄噓 膽茫 膽瓢峄 t岷 l锚n Ki岷縩 th峄ヽ',
+    additionP2: ', b岷 c贸 th峄� t矛m th岷 n贸 trong danh s谩ch t脿i li峄噓 c峄 Ki岷縩 th峄ヽ.',
+    stop: 'D峄玭g x峄� l媒',
+    resume: 'Ti岷縫 t峄 x峄� l媒',
+    navTo: '膼i 膽岷縩 t脿i li峄噓',
+    sideTipTitle: 'Ti岷縫 theo l脿 g矛',
+    sideTipContent: 'Sau khi t脿i li峄噓 ho脿n th脿nh ch峄� m峄, Ki岷縩 th峄ヽ c贸 th峄� 膽瓢峄 t铆ch h峄 v脿o 峄﹏g d峄g nh瓢 m峄檛 ng峄� c岷h, b岷 c贸 th峄� t矛m c脿i 膽岷穞 ng峄� c岷h trong trang 膽i峄乽 ch峄塶h prompt. B岷 c农ng c贸 th峄� t岷 n贸 nh瓢 m峄檛 plugin ch峄� m峄 ChatGPT 膽峄檆 l岷璸 膽峄� ph谩t h脿nh.',
+    modelTitle: 'B岷 c贸 ch岷痗 ch岷痭 mu峄憂 d峄玭g vi峄嘽 nh煤ng?',
+    modelContent: 'N岷縰 b岷 c岷 ti岷縫 t峄 x峄� l媒 sau n脿y, b岷 s岷� ti岷縫 t峄 t峄� v峄� tr铆 b岷 膽茫 d峄玭g l岷.',
+    modelButtonConfirm: 'X谩c nh岷璶',
+    modelButtonCancel: 'H峄',
+  },
+  firecrawl: {
+    getApiKeyLinkText: 'L岷 kh贸a API c峄 b岷 t峄� firecrawl.dev',
+    configFirecrawl: '膼峄媙h c岷 h矛nh 馃敟Firecrawl',
+    apiKeyPlaceholder: 'Kh贸a API t峄� firecrawl.dev',
+  },
+  jinaReader: {
+    getApiKeyLinkText: 'Nh岷璶 kh贸a API mi峄卬 ph铆 c峄 b岷 t岷 jina.ai',
+    configJinaReader: '膼峄媙h c岷 h矛nh Jina Reader',
+    apiKeyPlaceholder: 'Kh贸a API t峄� jina.ai',
+  },
+  otherDataSource: {
+    title: 'K岷縯 n峄慽 v峄沬 c谩c ngu峄搉 d峄� li峄噓 kh谩c?',
+    description: 'Hi峄噉 t岷, c啤 s峄� tri th峄ヽ c峄 Dify ch峄� c贸 ngu峄搉 d峄� li峄噓 h岷 ch岷�. 膼贸ng g贸p ngu峄搉 d峄� li峄噓 v脿o c啤 s峄� ki岷縩 th峄ヽ Dify l脿 m峄檛 c谩ch tuy峄噒 v峄漣 膽峄� gi煤p n芒ng cao t铆nh linh ho岷 v脿 s峄ヽ m岷h c峄 n峄乶 t岷g cho t岷 c岷� ng瓢峄漣 d霉ng. H瓢峄沶g d岷玭 膽贸ng g贸p c峄 ch煤ng t么i gi煤p b岷 d峄� d脿ng b岷痶 膽岷. Vui l貌ng nh岷 v脿o li锚n k岷縯 b锚n d瓢峄沬 膽峄� t矛m hi峄僽 th锚m.',
+    learnMore: 'T矛m hi峄僽 th锚m',
+  },
+  watercrawl: {
+    configWatercrawl: 'C岷 h矛nh Watercrawl',
+    apiKeyPlaceholder: 'Kh贸a API t峄� watercrawl.dev',
+    getApiKeyLinkText: 'L岷 m茫 API c峄 b岷 t峄� watercrawl.dev',
+  },
+}
+
+export default translation
diff --git a/i18n/vi-VN/dataset-documents.ts b/i18n/vi-VN/dataset-documents.ts
new file mode 100644
index 0000000..6e13c11
--- /dev/null
+++ b/i18n/vi-VN/dataset-documents.ts
@@ -0,0 +1,394 @@
+const translation = {
+  list: {
+    title: 'T脿i li峄噓',
+    desc: 'T岷 c岷� c谩c t峄噋 c峄 Ki岷縩 th峄ヽ 膽瓢峄 hi峄僴 th峄� 峄� 膽芒y. To脿n b峄� Ki岷縩 th峄ヽ c贸 th峄� 膽瓢峄 li锚n k岷縯 v峄沬 tr铆ch d岷玭 c峄 Dify ho岷穋 膽瓢峄 l岷璸 ch峄� m峄 th么ng qua plugin Chat.',
+    addFile: 'Th锚m t峄噋',
+    addPages: 'Th锚m trang',
+    table: {
+      header: {
+        fileName: 'T脢N T峄哖',
+        words: 'S峄� T峄�',
+        hitCount: 'S峄� L岷 TRUY V岷',
+        uploadTime: 'TH峄淚 GIAN T岷 L脢N',
+        status: 'TR岷燦G TH脕I',
+        action: 'THAO T脕C',
+        chunkingMode: 'CH岷� 膼峄� CHUNKING',
+      },
+      rename: 'Rename',
+      name: 'T锚n',
+    },
+    action: {
+      uploadFile: 'T岷 l锚n t峄噋 m峄沬',
+      settings: 'C脿i 膽岷穞 ph芒n 膽o岷',
+      addButton: 'Th锚m 膽o岷',
+      add: 'Th锚m m峄檛 膽o岷',
+      batchAdd: 'Th锚m h脿ng lo岷',
+      archive: 'L瓢u tr峄�',
+      unarchive: 'Kh么i ph峄',
+      delete: 'X贸a',
+      enableWarning: 'T峄噋 膽茫 l瓢u tr峄� kh么ng th峄� 膽瓢峄 k铆ch ho岷',
+      sync: '膼峄搉g b峄�',
+    },
+    index: {
+      enable: 'K铆ch ho岷',
+      disable: 'V么 hi峄噓 h贸a',
+      all: 'T岷 c岷�',
+      enableTip: 'T峄噋 c贸 th峄� 膽瓢峄 l岷璸 ch峄� m峄',
+      disableTip: 'T峄噋 kh么ng th峄� 膽瓢峄 l岷璸 ch峄� m峄',
+    },
+    status: {
+      queuing: '膼ang ch峄�',
+      indexing: '膼ang l岷璸 ch峄� m峄',
+      paused: 'T岷 d峄玭g',
+      error: 'L峄梚',
+      available: 'C贸 s岷祅',
+      enabled: '膼茫 k铆ch ho岷',
+      disabled: '膼茫 v么 hi峄噓 h贸a',
+      archived: '膼茫 l瓢u tr峄�',
+    },
+    empty: {
+      title: 'Ch瓢a c贸 t脿i li峄噓',
+      upload: {
+        tip: 'B岷 c贸 th峄� t岷 l锚n t峄噋, 膽峄搉g b峄� t峄� trang web, ho岷穋 t峄� 峄﹏g d峄g web nh瓢 Notion, GitHub, v.v.',
+      },
+      sync: {
+        tip: 'Dify s岷� 膽峄媙h k峄� t岷 xu峄憂g t峄噋 t峄� Notion c峄 b岷 v脿 ho脿n t岷 x峄� l媒.',
+      },
+    },
+    delete: {
+      title: 'B岷 c贸 ch岷痗 ch岷痭 mu峄憂 x贸a?',
+      content: 'N岷縰 b岷 c岷 ti岷縫 t峄 x峄� l媒 sau n脿y, b岷 s岷� ti岷縫 t峄 t峄� v峄� tr铆 b岷 膽茫 d峄玭g l岷',
+    },
+    batchModal: {
+      title: 'Th锚m 膽o岷 h脿ng lo岷',
+      csvUploadTitle: 'K茅o v脿 th岷� t峄噋 CSV c峄 b岷 v脿o 膽芒y, ho岷穋 ',
+      browse: 'duy峄噒',
+      tip: 'T峄噋 CSV ph岷 tu芒n th峄� c岷 tr煤c sau:',
+      question: 'c芒u h峄廼',
+      answer: 'tr岷� l峄漣',
+      contentTitle: 'n峄檌 dung 膽o岷',
+      content: 'n峄檌 dung',
+      template: 'T岷 m岷玼 峄� 膽芒y',
+      cancel: 'H峄',
+      run: 'Ch岷 h脿ng lo岷',
+      runError: 'Ch岷 h脿ng lo岷 th岷 b岷',
+      processing: '膼ang x峄� l媒 h脿ng lo岷',
+      completed: 'Nh岷璸 ho脿n t岷',
+      error: 'L峄梚 nh岷璸',
+      ok: 'OK',
+    },
+    addUrl: 'Th锚m URL',
+    learnMore: 'T矛m hi峄僽 th锚m',
+  },
+  metadata: {
+    title: 'Si锚u d峄� li峄噓',
+    desc: 'G岷痭 nh茫n si锚u d峄� li峄噓 cho c谩c t脿i li峄噓 cho ph茅p AI truy c岷璸 ch煤ng k峄媝 th峄漣 v脿 ti岷縯 l峄� ngu峄搉 c峄 c谩c t脿i li峄噓 tham chi岷縰 cho ng瓢峄漣 d霉ng.',
+    dateTimeFormat: 'D MMMM, YYYY hh:mm A',
+    docTypeSelectTitle: 'Vui l貌ng ch峄峮 lo岷 t脿i li峄噓',
+    docTypeChangeTitle: 'Thay 膽峄昳 lo岷 t脿i li峄噓',
+    docTypeSelectWarning: 'N岷縰 thay 膽峄昳 lo岷 t脿i li峄噓, c谩c si锚u d峄� li峄噓 hi峄噉 t岷 s岷� kh么ng 膽瓢峄 b岷 to脿n',
+    firstMetaAction: 'B岷痶 膽岷',
+    placeholder: {
+      add: 'Th锚m ',
+      select: 'Ch峄峮 ',
+    },
+    source: {
+      upload_file: 'T岷 l锚n t峄噋',
+      notion: '膼峄搉g b峄� t峄� Notion',
+      github: '膼峄搉g b峄� t峄� Github',
+    },
+    type: {
+      book: 'S谩ch',
+      webPage: 'Trang web',
+      paper: 'B脿i b谩o',
+      socialMediaPost: 'B脿i 膽膬ng m岷g x茫 h峄檌',
+      personalDocument: 'T脿i li峄噓 c谩 nh芒n',
+      businessDocument: 'T脿i li峄噓 doanh nghi峄噋',
+      IMChat: 'Tr貌 chuy峄噉 tin nh岷痭',
+      wikipediaEntry: 'B脿i vi岷縯 Wikipedia',
+      notion: '膼峄搉g b峄� t峄� Notion',
+      github: '膼峄搉g b峄� t峄� Github',
+      technicalParameters: 'Tham s峄� k峄� thu岷璽',
+    },
+    field: {
+      processRule: {
+        processDoc: 'X峄� l媒 t脿i li峄噓',
+        segmentRule: 'Quy t岷痗 ph芒n 膽o岷',
+        segmentLength: '膼峄� d脿i 膽o岷',
+        processClean: 'Quy t岷痗 l脿m s岷h v膬n b岷',
+      },
+      book: {
+        title: 'Ti锚u 膽峄�',
+        language: 'Ng么n ng峄�',
+        author: 'T谩c gi岷�',
+        publisher: 'Nh脿 xu岷 b岷',
+        publicationDate: 'Ng脿y xu岷 b岷',
+        ISBN: 'ISBN',
+        category: 'Th峄� lo岷',
+      },
+      webPage: {
+        title: 'Ti锚u 膽峄�',
+        url: 'URL',
+        language: 'Ng么n ng峄�',
+        authorPublisher: 'T谩c gi岷�/Nh脿 xu岷 b岷',
+        publishDate: 'Ng脿y xu岷 b岷',
+        topicKeywords: 'Ch峄� 膽峄�/T峄� kh贸a',
+        description: 'M么 t岷�',
+      },
+      paper: {
+        title: 'Ti锚u 膽峄�',
+        language: 'Ng么n ng峄�',
+        author: 'T谩c gi岷�',
+        publishDate: 'Ng脿y xu岷 b岷',
+        journalConferenceName: 'T锚n t岷 ch铆/H峄檌 ngh峄�',
+        volumeIssuePage: 'T岷璸/S峄�/Trang',
+        DOI: 'DOI',
+        topicsKeywords: 'Ch峄� 膽峄�/T峄� kh贸a',
+        abstract: 'T贸m t岷痶',
+      },
+      socialMediaPost: {
+        platform: 'N峄乶 t岷g',
+        authorUsername: 'T谩c gi岷�/T锚n ng瓢峄漣 d霉ng',
+        publishDate: 'Ng脿y 膽膬ng',
+        postURL: 'URL b脿i 膽膬ng',
+        topicsTags: 'Ch峄� 膽峄�/Th岷�',
+      },
+      personalDocument: {
+        title: 'Ti锚u 膽峄�',
+        author: 'T谩c gi岷�',
+        creationDate: 'Ng脿y t岷',
+        lastModifiedDate: 'Ng脿y s峄璦 膽峄昳 cu峄慽',
+        documentType: 'Lo岷 t脿i li峄噓',
+        tagsCategory: 'Th岷�/Danh m峄',
+      },
+      businessDocument: {
+        title: 'Ti锚u 膽峄�',
+        author: 'T谩c gi岷�',
+        creationDate: 'Ng脿y t岷',
+        lastModifiedDate: 'Ng脿y s峄璦 膽峄昳 cu峄慽',
+        documentType: 'Lo岷 t脿i li峄噓',
+        departmentTeam: 'Ph貌ng ban/Nh贸m',
+      },
+      IMChat: {
+        chatPlatform: 'N峄乶 t岷g tr貌 chuy峄噉',
+        chatPartiesGroupName: 'Ng瓢峄漣 tham gia/T锚n nh贸m',
+        participants: 'Ng瓢峄漣 tham gia',
+        startDate: 'Ng脿y b岷痶 膽岷',
+        endDate: 'Ng脿y k岷縯 th煤c',
+        topicsKeywords: 'Ch峄� 膽峄�/T峄� kh贸a',
+        fileType: 'Lo岷 t峄噋',
+      },
+      wikipediaEntry: {
+        title: 'Ti锚u 膽峄�',
+        language: 'Ng么n ng峄�',
+        webpageURL: 'URL trang web',
+        editorContributor: 'Bi锚n t岷璸 vi锚n/Ng瓢峄漣 膽贸ng g贸p',
+        lastEditDate: 'Ng脿y ch峄塶h s峄璦 cu峄慽',
+        summaryIntroduction: 'T贸m t岷痶/Gi峄沬 thi峄噓',
+      },
+      notion: {
+        title: 'Ti锚u 膽峄�',
+        language: 'Ng么n ng峄�',
+        author: 'T谩c gi岷�',
+        createdTime: 'Th峄漣 gian t岷',
+        lastModifiedTime: 'Th峄漣 gian s峄璦 膽峄昳 cu峄慽',
+        url: 'URL',
+        tag: 'Th岷�',
+        description: 'M么 t岷�',
+      },
+      github: {
+        repoName: 'T锚n kho l瓢u tr峄�',
+        repoDesc: 'M么 t岷� kho l瓢u tr峄�',
+        repoOwner: 'Ch峄� s峄� h峄痷 kho l瓢u tr峄�',
+        fileName: 'T锚n t峄噋',
+        filePath: '膼瓢峄漬g d岷玭 t峄噋',
+        programmingLang: 'Ng么n ng峄� l岷璸 tr矛nh',
+        url: 'URL',
+        license: 'Gi岷 ph茅p',
+        lastCommitTime: 'Th峄漣 gian commit cu峄慽',
+        lastCommitAuthor: 'T谩c gi岷� commit cu峄慽',
+      },
+      originInfo: {
+        originalFilename: 'T锚n t峄噋 g峄慶',
+        originalFileSize: 'K铆ch th瓢峄沜 t峄噋 g峄慶',
+        uploadDate: 'Ng脿y t岷 l锚n',
+        lastUpdateDate: 'Ng脿y c岷璸 nh岷璽 cu峄慽',
+        source: 'Ngu峄搉',
+      },
+      technicalParameters: {
+        segmentSpecification: '膼岷穋 t岷� 膽o岷',
+        segmentLength: '膼峄� d脿i 膽o岷',
+        avgParagraphLength: '膼峄� d脿i trung b矛nh 膽o岷 v膬n',
+        paragraphs: 'S峄� 膽o岷 v膬n',
+        hitCount: 'S峄� l岷 truy v岷',
+        embeddingTime: 'Th峄漣 gian nh煤ng',
+        embeddedSpend: 'Chi ph铆 nh煤ng',
+      },
+    },
+    languageMap: {
+      zh: 'Ti岷縩g Trung',
+      en: 'Ti岷縩g Anh',
+      es: 'Ti岷縩g T芒y Ban Nha',
+      fr: 'Ti岷縩g Ph谩p',
+      de: 'Ti岷縩g 膼峄ヽ',
+      ja: 'Ti岷縩g Nh岷璽',
+      ko: 'Ti岷縩g H脿n',
+      ru: 'Ti岷縩g Nga',
+      ar: 'Ti岷縩g 岷� R岷璸',
+      pt: 'Ti岷縩g B峄� 膼脿o Nha',
+      it: 'Ti岷縩g 脻',
+      nl: 'Ti岷縩g H脿 Lan',
+      pl: 'Ti岷縩g Ba Lan',
+      sv: 'Ti岷縩g Th峄 膼i峄僴',
+      tr: 'Ti岷縩g Th峄� Nh末 K峄�',
+      he: 'Ti岷縩g Do Th谩i',
+      hi: 'Ti岷縩g Hindi',
+      da: 'Ti岷縩g 膼an M岷h',
+      fi: 'Ti岷縩g Ph岷 Lan',
+      no: 'Ti岷縩g Na Uy',
+      hu: 'Ti岷縩g Hungary',
+      el: 'Ti岷縩g Hy L岷',
+      cs: 'Ti岷縩g S茅c',
+      th: 'Ti岷縩g Th谩i',
+      id: 'Ti岷縩g Indonesia',
+    },
+    categoryMap: {
+      book: {
+        fiction: 'Ti峄僽 thuy岷縯',
+        biography: 'Ti峄僽 s峄�',
+        history: 'L峄媍h s峄�',
+        science: 'Khoa h峄峜',
+        technology: 'C么ng ngh峄�',
+        education: 'Gi谩o d峄',
+        philosophy: 'Tri岷縯 h峄峜',
+        religion: 'T么n gi谩o',
+        socialSciences: 'Khoa h峄峜 x茫 h峄檌',
+        art: 'Ngh峄� thu岷璽',
+        travel: 'Du l峄媍h',
+        health: 'S峄ヽ kh峄廵',
+        selfHelp: 'T峄� l峄眂',
+        businessEconomics: 'Kinh doanh v脿 kinh t岷�',
+        cooking: 'N岷 膬n',
+        childrenYoungAdults: 'Thi岷縰 nhi v脿 thanh thi岷縰 ni锚n',
+        comicsGraphicNovels: 'Truy峄噉 tranh v脿 ti峄僽 thuy岷縯 膽峄� h峄峚',
+        poetry: 'Th啤 ca',
+        drama: 'K峄媍h',
+        other: 'Kh谩c',
+      },
+      personalDoc: {
+        notes: 'Ghi ch煤',
+        blogDraft: 'B岷 nh谩p blog',
+        diary: 'Nh岷璽 k媒',
+        researchReport: 'B谩o c谩o nghi锚n c峄﹗',
+        bookExcerpt: 'Tr铆ch 膽o岷 s谩ch',
+        schedule: 'L峄媍h tr矛nh',
+        list: 'Danh s谩ch',
+        projectOverview: 'T峄昻g quan d峄� 谩n',
+        photoCollection: 'B峄� s瓢u t岷璸 岷h',
+        creativeWriting: 'Vi岷縯 s谩ng t岷',
+        codeSnippet: '膼o岷 m茫',
+        designDraft: 'B岷 ph谩c th岷 thi岷縯 k岷�',
+        personalResume: 'S啤 y岷縰 l媒 l峄媍h c谩 nh芒n',
+        other: 'Kh谩c',
+      },
+      businessDoc: {
+        meetingMinutes: 'Bi锚n b岷 cu峄檆 h峄峱',
+        researchReport: 'B谩o c谩o nghi锚n c峄﹗',
+        proposal: '膼峄� xu岷',
+        employeeHandbook: 'S峄� tay nh芒n vi锚n',
+        trainingMaterials: 'T脿i li峄噓 膽脿o t岷',
+        requirementsDocument: 'T脿i li峄噓 y锚u c岷',
+        designDocument: 'T脿i li峄噓 thi岷縯 k岷�',
+        productSpecification: 'Th么ng s峄� k峄� thu岷璽 s岷 ph岷﹎',
+        financialReport: 'B谩o c谩o t脿i ch铆nh',
+        marketAnalysis: 'Ph芒n t铆ch th峄� tr瓢峄漬g',
+        projectPlan: 'K岷� ho岷h d峄� 谩n',
+        teamStructure: 'C岷 tr煤c nh贸m',
+        policiesProcedures: 'Ch铆nh s谩ch v脿 quy tr矛nh',
+        contractsAgreements: 'H峄 膽峄搉g v脿 th峄廰 thu岷璶',
+        emailCorrespondence: 'Th瓢 t峄� trao 膽峄昳',
+        other: 'Kh谩c',
+      },
+    },
+  },
+  embedding: {
+    processing: '膼ang nh煤ng...',
+    paused: '膼茫 t岷 d峄玭g nh煤ng',
+    completed: 'Ho脿n t岷 nh煤ng',
+    error: 'L峄梚 khi nh煤ng',
+    docName: '膼ang x峄� l媒 v膬n b岷',
+    mode: 'Quy t岷痗 ph芒n 膽o岷',
+    segmentLength: '膼峄� d脿i 膽o岷',
+    textCleaning: '膼峄媙h ngh末a v脿 l脿m s岷h v膬n b岷',
+    segments: '膼o岷',
+    highQuality: 'Ch岷� 膽峄� ch岷 l瓢峄g cao',
+    economy: 'Ch岷� 膽峄� ti岷縯 ki峄噈',
+    estimate: '漂峄沜 t铆nh ti锚u th峄�',
+    stop: 'D峄玭g x峄� l媒',
+    resume: 'Ti岷縫 t峄 x峄� l媒',
+    automatic: 'T峄� 膽峄檔g',
+    custom: 'T霉y ch峄塶h',
+    previewTip: 'Xem tr瓢峄沜 膽o岷 s岷� c贸 s岷祅 sau khi vi峄嘽 nh煤ng ho脿n t岷',
+    parentMaxTokens: 'Cha m岷�',
+    pause: 'T岷 d峄玭g',
+    childMaxTokens: 'Con',
+    hierarchical: 'Cha m岷�-con c谩i',
+  },
+  segment: {
+    paragraphs: '膼o岷 v膬n',
+    keywords: 'T峄� kh贸a',
+    addKeyWord: 'Th锚m t峄� kh贸a',
+    keywordError: '膼峄� d脿i t峄慽 膽a c峄 t峄� kh贸a l脿 20',
+    characters: 'k媒 t峄�',
+    hitCount: 'S峄� l岷 truy v岷',
+    vectorHash: 'M茫 b膬m vector: ',
+    questionPlaceholder: 'th锚m c芒u h峄廼 峄� 膽芒y',
+    questionEmpty: 'C芒u h峄廼 kh么ng th峄� tr峄憂g',
+    answerPlaceholder: 'th锚m c芒u tr岷� l峄漣 峄� 膽芒y',
+    answerEmpty: 'C芒u tr岷� l峄漣 kh么ng th峄� tr峄憂g',
+    contentPlaceholder: 'th锚m n峄檌 dung 峄� 膽芒y',
+    contentEmpty: 'N峄檌 dung kh么ng th峄� tr峄憂g',
+    newTextSegment: '膼o岷 v膬n b岷 m峄沬',
+    newQaSegment: '膼o岷 h峄廼 膽谩p m峄沬',
+    delete: 'X贸a 膽o岷 n脿y?',
+    childChunks_one: 'KH峄怚 TR岷�',
+    searchResults_zero: 'K岷綯 QU岷�',
+    empty: 'Kh么ng t矛m th岷 Chunk',
+    newChunk: 'Kh峄慽 m峄沬',
+    childChunk: 'Kh峄慽 tr岷� em',
+    regeneratingMessage: 'Qu谩 tr矛nh n脿y c贸 th峄� m岷 m峄檛 l煤c, vui l貌ng 膽峄...',
+    regenerationSuccessMessage: 'B岷 c贸 th峄� 膽贸ng c峄璦 s峄� n脿y.',
+    regenerationSuccessTitle: 'Ho脿n th脿nh t谩i t岷',
+    characters_other: 'K媒 t峄�',
+    chunks_one: 'KH脷C',
+    chunkAdded: '1 mi岷縩g 膽瓢峄 th锚m v脿o',
+    editChildChunk: 'Ch峄塶h s峄璦 ph岷 con',
+    characters_one: 'nh芒n v岷璽',
+    expandChunks: 'M峄� r峄檔g c谩c 膽o岷',
+    chunks_other: 'KH峄怚',
+    editedAt: 'Ch峄塶h s峄璦 t岷',
+    addAnother: 'Th锚m m峄檛 c谩i kh谩c',
+    regenerationConfirmTitle: 'B岷 c贸 mu峄憂 t谩i t岷 c谩c chunk con kh么ng?',
+    searchResults_one: 'K岷綯 QU岷�',
+    regeneratingTitle: 'T谩i t岷 c谩c chunk con',
+    editParentChunk: 'Ch峄塶h s峄璦 ph岷 cha',
+    collapseChunks: 'Thu g峄峮 c谩c 膽o岷',
+    searchResults_other: 'K岷綯 QU岷�',
+    parentChunks_one: 'PH岷 CHA M岷�',
+    newChildChunk: 'Kh峄慽 con m峄沬',
+    parentChunk: 'Ph岷 cha m岷�',
+    parentChunks_other: 'PH岷 CHA M岷�',
+    regenerationConfirmMessage: 'T岷 l岷 c谩c chunk con s岷� ghi 膽猫 l锚n c谩c chunk con hi峄噉 t岷, bao g峄搈 c谩c chunk 膽茫 ch峄塶h s峄璦 v脿 chunk m峄沬 膽瓢峄 th锚m v脿o. S峄� t谩i sinh kh么ng th峄� ho脿n t谩c.',
+    childChunkAdded: '1 ph岷 con 膽瓢峄 th锚m v脿o',
+    addChunk: 'Th锚m Chunk',
+    chunkDetail: 'Chi ti岷縯 kh峄慽',
+    childChunks_other: 'KH峄怚 CON',
+    editChunk: 'Ch峄塶h s峄璦 Chunk',
+    addChildChunk: 'Th锚m ph岷 con',
+    clearFilter: 'B峄� l峄峜 r玫 r脿ng',
+    chunk: 'Kh煤c',
+    edited: 'EDITED',
+  },
+}
+
+export default translation
diff --git a/i18n/vi-VN/dataset-hit-testing.ts b/i18n/vi-VN/dataset-hit-testing.ts
new file mode 100644
index 0000000..02a2547
--- /dev/null
+++ b/i18n/vi-VN/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: 'Ki峄僲 tra truy v岷',
+  desc: 'Ki峄僲 tra hi峄噓 qu岷� truy xu岷 c峄 Ki岷縩 th峄ヽ d峄盿 tr锚n v膬n b岷 truy v岷 膽茫 cho.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  recents: 'G岷 膽芒y',
+  table: {
+    header: {
+      source: 'Ngu峄搉',
+      text: 'V膬n b岷',
+      time: 'Th峄漣 gian',
+    },
+  },
+  input: {
+    title: 'V膬n b岷 ngu峄搉',
+    placeholder: 'Vui l貌ng nh岷璸 m峄檛 v膬n b岷, khuy岷縩 ngh峄� s峄� d峄g m峄檛 c芒u kh岷硁g 膽峄媙h ng岷痭.',
+    countWarning: 'T峄慽 膽a 200 k媒 t峄�.',
+    indexWarning: 'Ch峄� c贸 s岷祅 trong Ki岷縩 th峄ヽ ch岷 l瓢峄g cao.',
+    testing: '膼ang ki峄僲 tra',
+  },
+  hit: {
+    title: 'C脕C 膼O岷燦 V膫N 膼漂峄 TRUY XU岷',
+    emptyTip: 'K岷縯 qu岷� ki峄僲 tra truy v岷 s岷� hi峄僴 th峄� 峄� 膽芒y',
+  },
+  noRecentTip: 'Kh么ng c贸 k岷縯 qu岷� truy v岷 g岷 膽芒y',
+  viewChart: 'Xem BI峄俇 膼峄� VECTOR',
+  settingTitle: 'C脿i 膽岷穞 truy xu岷',
+  viewDetail: 'Xem chi ti岷縯',
+  records: 'H峄� s啤',
+  open: 'M峄�',
+  keyword: 'T峄� kho谩',
+  hitChunks: 'Nh岷 {{num}} 膽o岷 con',
+  chunkDetail: 'Chi ti岷縯 kh峄慽',
+}
+
+export default translation
diff --git a/i18n/vi-VN/dataset-settings.ts b/i18n/vi-VN/dataset-settings.ts
new file mode 100644
index 0000000..b24f130
--- /dev/null
+++ b/i18n/vi-VN/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: 'C脿i 膽岷穞 Ki岷縩 th峄ヽ',
+  desc: 'T岷 膽芒y, b岷 c贸 th峄� s峄璦 膽峄昳 c谩c thu峄檆 t铆nh v脿 ph瓢啤ng ph谩p l脿m vi峄嘽 c峄 Ki岷縩 th峄ヽ.',
+  form: {
+    name: 'T锚n Ki岷縩 th峄ヽ',
+    namePlaceholder: 'Vui l貌ng nh岷璸 t锚n Ki岷縩 th峄ヽ',
+    nameError: 'T锚n kh么ng th峄� 膽峄� tr峄憂g',
+    desc: 'M么 t岷� Ki岷縩 th峄ヽ',
+    descInfo: 'Vui l貌ng vi岷縯 m么 t岷� r玫 r脿ng v峄� n峄檌 dung c峄 Ki岷縩 th峄ヽ. M么 t岷� n脿y s岷� 膽瓢峄 s峄� d峄g l脿m c啤 s峄� cho vi峄嘽 k岷縯 h峄 khi l峄盿 ch峄峮 t峄� nhi峄乽 Ki岷縩 th峄ヽ trong qu谩 tr矛nh suy lu岷璶.',
+    descPlaceholder: 'M么 t岷� nh峄痭g g矛 c贸 trong Ki岷縩 th峄ヽ n脿y. M峄檛 m么 t岷� chi ti岷縯 gi煤p AI truy c岷璸 n峄檌 dung c峄 Ki岷縩 th峄ヽ m峄檛 c谩ch hi峄噓 qu岷�. N岷縰 膽峄� tr峄憂g, Dify s岷� s峄� d峄g chi岷縩 l瓢峄 truy xu岷 m岷穋 膽峄媙h.',
+    descWrite: 'T矛m hi峄僽 c谩ch vi岷縯 m么 t岷� Ki岷縩 th峄ヽ t峄憈.',
+    permissions: 'Quy峄乶 h岷',
+    permissionsOnlyMe: 'Ch峄� m矛nh t么i',
+    permissionsAllMember: 'T岷 c岷� th脿nh vi锚n nh贸m',
+    indexMethod: 'Ph瓢啤ng ph谩p ch峄� m峄',
+    indexMethodHighQuality: 'Ch岷 l瓢峄g cao',
+    indexMethodHighQualityTip: 'S峄� d峄g m么 h矛nh Embedding 膽峄� x峄� l媒, cung c岷 膽峄� ch铆nh x谩c cao h啤n khi ng瓢峄漣 d霉ng truy v岷.',
+    indexMethodEconomy: 'Ti岷縯 ki峄噈',
+    indexMethodEconomyTip: 'S峄� d峄g c谩c c么ng c峄� nh煤ng vector ngo岷 tuy岷縩, ch峄� m峄 t峄� kh贸a, v.v. 膽峄� gi岷 膽峄� ch铆nh x谩c m脿 kh么ng ti锚u t峄憂 token',
+    embeddingModel: 'M么 h矛nh nh煤ng',
+    embeddingModelTip: '膼峄� thay 膽峄昳 m么 h矛nh nh煤ng, vui l貌ng 膽i t峄沬 ',
+    embeddingModelTipLink: 'C脿i 膽岷穞',
+    retrievalSetting: {
+      title: 'C脿i 膽岷穞 truy xu岷',
+      learnMore: 'T矛m hi峄僽 th锚m',
+      description: ' v峄� ph瓢啤ng ph谩p truy xu岷.',
+      longDescription: ' v峄� ph瓢啤ng ph谩p truy xu岷. B岷 c贸 th峄� thay 膽峄昳 膽i峄乽 n脿y b岷 k峄� l煤c n脿o trong c脿i 膽岷穞 Ki岷縩 th峄ヽ.',
+      method: 'Ph瓢啤ng ph谩p truy xu岷',
+    },
+    save: 'L瓢u',
+    permissionsInvitedMembers: 'Th脿nh vi锚n m峄檛 ph岷 trong nh贸m',
+    me: '(B岷)',
+    externalKnowledgeAPI: 'API ki岷縩 th峄ヽ b锚n ngo脿i',
+    retrievalSettings: 'C脿i 膽岷穞 truy xu岷',
+    externalKnowledgeID: 'ID ki岷縩 th峄ヽ b锚n ngo脿i',
+    helpText: 'T矛m hi峄僽 c谩ch vi岷縯 m么 t岷� t岷璸 d峄� li峄噓 t峄憈.',
+    indexMethodChangeToEconomyDisabledTip: 'Kh么ng kh岷� d峄g 膽峄� h岷� c岷 t峄� HQ xu峄憂g ECO',
+    upgradeHighQualityTip: 'Sau khi n芒ng c岷 l锚n ch岷� 膽峄� Ch岷 l瓢峄g cao, kh么ng th峄� ho脿n nguy锚n v峄� ch岷� 膽峄� Ti岷縯 ki峄噈',
+    searchModel: 'T矛m ki岷縨 m么 h矛nh',
+  },
+}
+
+export default translation
diff --git a/i18n/vi-VN/dataset.ts b/i18n/vi-VN/dataset.ts
new file mode 100644
index 0000000..4227d71
--- /dev/null
+++ b/i18n/vi-VN/dataset.ts
@@ -0,0 +1,221 @@
+const translation = {
+  knowledge: 'Ki岷縩 th峄ヽ',
+  documentCount: ' t脿i li峄噓',
+  wordCount: ' ngh矛n t峄�',
+  appCount: ' 峄﹏g d峄g li锚n k岷縯',
+  createDataset: 'T岷 b峄� ki岷縩 th峄ヽ',
+  createDatasetIntro: 'Nh岷璸 d峄� li峄噓 v膬n b岷 c峄 b岷 ho岷穋 c岷璸 nh岷璽 d峄� li峄噓 theo th峄漣 gian th峄眂 qua Webhook 膽峄� t膬ng c瓢峄漬g ng峄� c岷h cho LLM.',
+  deleteDatasetConfirmTitle: 'X贸a b峄� ki岷縩 th峄ヽ n脿y?',
+  deleteDatasetConfirmContent:
+    'Vi峄嘽 x贸a b峄� ki岷縩 th峄ヽ l脿 kh么ng th峄� ho脿n t谩c. Ng瓢峄漣 d霉ng s岷� kh么ng c貌n truy c岷璸 膽瓢峄 v脿o b峄� ki岷縩 th峄ヽ c峄 b岷, v脿 t岷 c岷� c岷 h矛nh c霉ng nh岷璽 k媒 l峄漣 nh岷痗 s岷� b峄� x贸a v末nh vi峄卬.',
+  datasetUsedByApp: 'B峄� ki岷縩 th峄ヽ n脿y 膽ang 膽瓢峄 s峄� d峄g b峄焛 m峄檛 s峄� 峄﹏g d峄g. C谩c 峄﹏g d峄g s岷� kh么ng th峄� s峄� d峄g b峄� ki岷縩 th峄ヽ n脿y n峄痑, v脿 t岷 c岷� c岷 h矛nh l峄漣 nh岷痗 c霉ng nh岷璽 k媒 s岷� b峄� x贸a v末nh vi峄卬.',
+  datasetDeleted: 'B峄� ki岷縩 th峄ヽ 膽茫 膽瓢峄 x贸a',
+  datasetDeleteFailed: 'X贸a b峄� ki岷縩 th峄ヽ kh么ng th脿nh c么ng',
+  didYouKnow: 'B岷 c贸 bi岷縯?',
+  intro1: 'B峄� ki岷縩 th峄ヽ c贸 th峄� 膽瓢峄 t铆ch h峄 v脿o 峄﹏g d峄g Dify ',
+  intro2: 'nh瓢 m峄檛 ng峄� c岷h',
+  intro3: ',',
+  intro4: 'ho岷穋 ',
+  intro5: 'c贸 th峄� 膽瓢峄 t岷',
+  intro6: ' d瓢峄沬 d岷g m峄檛 plugin ch峄� m峄 ChatGPT 膽峄檆 l岷璸 膽峄� xu岷 b岷',
+  unavailable: 'Kh么ng kh岷� d峄g',
+  unavailableTip: 'M么 h矛nh nh煤ng kh么ng kh岷� d峄g, c岷 c岷 h矛nh m么 h矛nh nh煤ng m岷穋 膽峄媙h',
+  datasets: 'B峄� KI岷綨 TH峄–',
+  datasetsApi: 'API',
+  retrieval: {
+    semantic_search: {
+      title: 'T矛m ki岷縨 Vector',
+      description: 'T岷 c谩c nh煤ng truy v岷 v脿 t矛m ki岷縨 膽o岷 v膬n b岷 t瓢啤ng t峄� nh岷 v峄沬 bi峄僽 di峄卬 vector c峄 n贸.',
+    },
+    full_text_search: {
+      title: 'T矛m ki岷縨 To脿n v膬n b岷',
+      description: 'L岷璸 ch峄� m峄 cho t岷 c岷� c谩c thu岷璽 ng峄� trong t脿i li峄噓, cho ph茅p ng瓢峄漣 d霉ng t矛m ki岷縨 b岷 k峄� thu岷璽 ng峄� n脿o v脿 truy xu岷 膽o岷 v膬n b岷 li锚n quan ch峄゛ c谩c thu岷璽 ng峄� 膽贸.',
+    },
+    hybrid_search: {
+      title: 'T矛m ki岷縨 K岷縯 h峄',
+      description: 'Th峄眂 hi峄噉 t矛m ki岷縨 to脿n v膬n b岷 v脿 t矛m ki岷縨 vector 膽峄搉g th峄漣, s岷痯 x岷縫 l岷 膽峄� ch峄峮 k岷縯 qu岷� ph霉 h峄 nh岷 v峄沬 truy v岷 c峄 ng瓢峄漣 d霉ng. Y锚u c岷 c岷 h矛nh API m么 h矛nh Rerank.',
+      recommend: '膼峄� xu岷',
+    },
+    invertedIndex: {
+      title: 'Ch峄� m峄 Ng瓢峄',
+      description: 'Ch峄� m峄 Ng瓢峄 l脿 m峄檛 c岷 tr煤c 膽瓢峄 s峄� d峄g cho vi峄嘽 truy xu岷 hi峄噓 qu岷�. N贸 膽瓢峄 t峄� ch峄ヽ theo thu岷璽 ng峄�, m峄梚 thu岷璽 ng峄� tr峄� 膽岷縩 t脿i li峄噓 ho岷穋 trang web ch峄゛ n贸.',
+    },
+    change: 'Thay 膽峄昳',
+    changeRetrievalMethod: 'Thay 膽峄昳 ph瓢啤ng ph谩p truy xu岷',
+  },
+  docsFailedNotice: 't脿i li峄噓 kh么ng 膽瓢峄 l岷璸 ch峄� m峄',
+  retry: 'Th峄� l岷',
+  indexingTechnique: {
+    high_quality: 'CH岷 L漂峄G',
+    economy: 'TI岷綯 KI峄哅',
+  },
+  indexingMethod: {
+    semantic_search: 'VECTOR',
+    full_text_search: 'V膫N B岷 膼岷 膼峄�',
+    hybrid_search: 'K岷綯 H峄',
+    invertedIndex: '膼岷 NG漂峄',
+  },
+  mixtureHighQualityAndEconomicTip: 'M么 h矛nh x岷縫 h岷g l岷 l脿 c岷 thi岷縯 cho s峄� k岷縯 h峄 c峄 c谩c c啤 s峄� ki岷縩 th峄ヽ ch岷 l瓢峄g cao v脿 ti岷縯 ki峄噈.',
+  inconsistentEmbeddingModelTip: 'M么 h矛nh x岷縫 h岷g l岷 l脿 c岷 thi岷縯 n岷縰 c谩c m么 h矛nh nh煤ng c峄 c谩c c啤 s峄� ki岷縩 th峄ヽ 膽瓢峄 ch峄峮 kh么ng nh岷 qu谩n.',
+  retrievalSettings: 'C脿i 膽岷穞 truy xu岷',
+  rerankSettings: 'C脿i 膽岷穞 x岷縫 h岷g l岷',
+  weightedScore: {
+    title: '膼i峄僲 s峄� c贸 tr峄峮g s峄�',
+    description: 'B岷眓g c谩ch 膽i峄乽 ch峄塶h tr峄峮g s峄� 膽瓢峄 g谩n, chi岷縩 l瓢峄 x岷縫 h岷g l岷 n脿y x谩c 膽峄媙h li峄噓 瓢u ti锚n kh峄沺 ng峄� ngh末a hay t峄� kh贸a.',
+    semanticFirst: 'Ng峄� ngh末a tr瓢峄沜',
+    keywordFirst: 'T峄� kh贸a tr瓢峄沜',
+    customized: 'T霉y ch峄塶h',
+    semantic: 'Ng峄� ngh末a',
+    keyword: 'T峄� kh贸a',
+  },
+  nTo1RetrievalLegacy: 'Truy xu岷 N-膽岷縩-1 s岷� ch铆nh th峄ヽ b峄� lo岷 b峄� t峄� th谩ng 9. Khuy岷縩 ngh峄� s峄� d峄g truy xu岷 膽a 膽瓢峄漬g d岷玭 m峄沬 nh岷 膽峄� c贸 k岷縯 qu岷� t峄憈 h啤n.',
+  nTo1RetrievalLegacyLink: 'T矛m hi峄僽 th锚m',
+  nTo1RetrievalLegacyLinkText: 'Truy xu岷 N-膽岷縩-1 s岷� ch铆nh th峄ヽ b峄� lo岷 b峄� v脿o th谩ng 9.',
+  defaultRetrievalTip: 'Truy xu岷 nhi峄乽 膽瓢峄漬g d岷玭 膽瓢峄 s峄� d峄g theo m岷穋 膽峄媙h. Ki岷縩 th峄ヽ 膽瓢峄 l岷 t峄� nhi峄乽 c啤 s峄� ki岷縩 th峄ヽ v脿 sau 膽贸 膽瓢峄 x岷縫 h岷g l岷.',
+  editExternalAPIConfirmWarningContent: {
+    front: 'API Ki岷縩 th峄ヽ B锚n ngo脿i n脿y 膽瓢峄 li锚n k岷縯 v峄沬',
+    end: 'ki岷縩 th峄ヽ b锚n ngo脿i, v脿 s峄璦 膽峄昳 n脿y s岷� 膽瓢峄 谩p d峄g cho t岷 c岷� ch煤ng. B岷 c贸 ch岷痗 ch岷痭 mu峄憂 l瓢u thay 膽峄昳 n脿y kh么ng?',
+  },
+  editExternalAPIFormWarning: {
+    front: 'API b锚n ngo脿i n脿y 膽瓢峄 li锚n k岷縯 v峄沬',
+    end: 'Ki岷縩 th峄ヽ b锚n ngo脿i',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      end: '?',
+      front: 'X贸a',
+    },
+    content: {
+      front: 'API Ki岷縩 th峄ヽ B锚n ngo脿i n脿y 膽瓢峄 li锚n k岷縯 v峄沬',
+      end: 'ki岷縩 th峄ヽ b锚n ngo脿i. X贸a API n脿y s岷� l脿m m岷 hi峄噓 l峄眂 t岷 c岷� ch煤ng. B岷 c贸 ch岷痗 ch岷痭 mu峄憂 x贸a API n脿y kh么ng?',
+    },
+    noConnectionContent: 'B岷 c贸 ch岷痗 ch岷痭 x贸a API n脿y kh么ng?',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: 'Ch峄峮 m峄檛 API ki岷縩 th峄ヽ b锚n ngo脿i',
+  },
+  connectDatasetIntro: {
+    content: {
+      end: '. Sau 膽贸 t矛m ID ki岷縩 th峄ヽ t瓢啤ng 峄﹏g v脿 膽i峄乶 v脿o bi峄僽 m岷玼 b锚n tr谩i. N岷縰 t岷 c岷� th么ng tin l脿 ch铆nh x谩c, n贸 s岷� t峄� 膽峄檔g chuy峄僴 膽岷縩 b脿i ki峄僲 tra truy xu岷 trong c啤 s峄� ki岷縩 th峄ヽ sau khi nh岷 v脿o n煤t k岷縯 n峄慽.',
+      front: '膼峄� k岷縯 n峄慽 v峄沬 c啤 s峄� ki岷縩 th峄ヽ b锚n ngo脿i, tr瓢峄沜 ti锚n b岷 c岷 t岷 API b锚n ngo脿i. Vui l貌ng 膽峄峜 k峄� v脿 tham kh岷',
+      link: 'T矛m hi峄僽 c谩ch t岷 API b锚n ngo脿i',
+    },
+    learnMore: 'T矛m hi峄僽 th锚m',
+    title: 'C谩ch k岷縯 n峄慽 v峄沬 c啤 s峄� ki岷縩 th峄ヽ b锚n ngo脿i',
+  },
+  connectHelper: {
+    helper3: '. Ch煤ng t么i th峄眂 s峄� khuy锚n b岷 n锚n',
+    helper4: '膼峄峜 t脿i li峄噓 tr峄� gi煤p',
+    helper1: 'K岷縯 n峄慽 v峄沬 c啤 s峄� ki岷縩 th峄ヽ b锚n ngo脿i th么ng qua API v脿 ID c啤 s峄� ki岷縩 th峄ヽ. Hi峄噉 t岷,',
+    helper2: 'Ch峄� h峄� tr峄� ch峄ヽ n膬ng truy xu岷',
+    helper5: 'c岷﹏ th岷璶 tr瓢峄沜 khi s峄� d峄g t铆nh n膬ng n脿y.',
+  },
+  externalKnowledgeForm: {
+    cancel: 'H峄',
+    connect: 'K岷縯 n峄慽',
+  },
+  externalAPIForm: {
+    encrypted: {
+      end: 'C么ng ngh峄�.',
+      front: 'M茫 th么ng b谩o API c峄 b岷 s岷� 膽瓢峄 m茫 h贸a v脿 l瓢u tr峄� b岷眓g c谩ch s峄� d峄g',
+    },
+    apiKey: 'Kh贸a API',
+    endpoint: '膼i峄僲 cu峄慽 API',
+    edit: 'Bi锚n t岷璸',
+    cancel: 'H峄',
+    name: 'T锚n',
+    save: 'C峄﹗',
+  },
+  learnHowToWriteGoodKnowledgeDescription: 'T矛m hi峄僽 c谩ch vi岷縯 m么 t岷� ki岷縩 th峄ヽ t峄憈',
+  noExternalKnowledge: 'Ch瓢a c贸 API Ki岷縩 th峄ヽ B锚n ngo脿i, h茫y nh岷 v脿o 膽芒y 膽峄� t岷',
+  connectDataset: 'K岷縯 n峄慽 v峄沬 c啤 s峄� ki岷縩 th峄ヽ b锚n ngo脿i',
+  externalTag: 'Ngo脿i',
+  externalAPIPanelTitle: 'API ki岷縩 th峄ヽ b锚n ngo脿i',
+  editExternalAPITooltipTitle: 'KI岷綨 TH峄– LI脢N K岷綯',
+  externalKnowledgeNamePlaceholder: 'Vui l貌ng nh岷璸 t锚n c峄 c啤 s峄� ki岷縩 th峄ヽ',
+  createExternalAPI: 'Th锚m API ki岷縩 th峄ヽ b锚n ngo脿i',
+  externalKnowledgeDescription: 'M么 t岷� ki岷縩 th峄ヽ',
+  externalAPIPanelDocumentation: 'T矛m hi峄僽 c谩ch t岷 API Ki岷縩 th峄ヽ B锚n ngo脿i',
+  allExternalTip: 'Khi ch峄� s峄� d峄g ki岷縩 th峄ヽ b锚n ngo脿i, ng瓢峄漣 d霉ng c贸 th峄� ch峄峮 c贸 b岷璽 m么 h矛nh X岷縫 h岷g l岷 hay kh么ng. N岷縰 kh么ng 膽瓢峄 b岷璽, c谩c 膽o岷 膽瓢峄 truy xu岷 s岷� 膽瓢峄 s岷痯 x岷縫 d峄盿 tr锚n 膽i峄僲 s峄�. Khi c谩c chi岷縩 l瓢峄 truy xu岷 c峄 c谩c c啤 s峄� ki岷縩 th峄ヽ kh谩c nhau kh么ng nh岷 qu谩n, n贸 s岷� kh么ng ch铆nh x谩c.',
+  editExternalAPIFormTitle: 'Ch峄塶h s峄璦 API Ki岷縩 th峄ヽ B锚n ngo脿i',
+  externalKnowledgeId: 'ID ki岷縩 th峄ヽ b锚n ngo脿i',
+  mixtureInternalAndExternalTip: 'M么 h矛nh Rerank l脿 c岷 thi岷縯 cho s峄� k岷縯 h峄 gi峄痑 ki岷縩 th峄ヽ b锚n trong v脿 b锚n ngo脿i.',
+  externalAPI: 'API b锚n ngo脿i',
+  externalKnowledgeDescriptionPlaceholder: 'M么 t岷� n峄檌 dung trong C啤 s峄� Ki岷縩 th峄ヽ n脿y (t霉y ch峄峮)',
+  externalKnowledgeName: 'T锚n ki岷縩 th峄ヽ b锚n ngo脿i',
+  externalKnowledgeIdPlaceholder: 'Vui l貌ng nh岷璸 ID ki岷縩 th峄ヽ',
+  createNewExternalAPI: 'T岷 API Ki岷縩 th峄ヽ B锚n ngo脿i m峄沬',
+  externalAPIPanelDescription: 'API ki岷縩 th峄ヽ b锚n ngo脿i 膽瓢峄 s峄� d峄g 膽峄� k岷縯 n峄慽 v峄沬 c啤 s峄� ki岷縩 th峄ヽ b锚n ngo脿i Dify v脿 truy xu岷 ki岷縩 th峄ヽ t峄� c啤 s峄� ki岷縩 th峄ヽ 膽贸.',
+  chunkingMode: {
+    general: 'T峄昻g qu谩t',
+    parentChild: 'Cha m岷�-con c谩i',
+  },
+  parentMode: {
+    paragraph: '膼o岷',
+    fullDoc: 'T脿i li峄噓 膽岷 膽峄�',
+  },
+  batchAction: {
+    disable: 'V么 hi峄噓 h贸a',
+    enable: 'K铆ch ho岷',
+    delete: 'X贸a',
+    selected: 'Ch峄峮',
+    archive: 'L瓢u tr峄�',
+    cancel: 'H峄',
+  },
+  localDocs: 'T脿i li峄噓 膽峄媋 ph瓢啤ng',
+  enable: 'K铆ch ho岷',
+  preprocessDocument: '{{s峄憓} Ti峄乶 x峄� l媒 t脿i li峄噓',
+  documentsDisabled: '{{num}} t脿i li峄噓 b峄� v么 hi峄噓 h贸a - kh么ng ho岷 膽峄檔g trong h啤n 30 ng脿y',
+  allKnowledge: 'T岷 c岷� ki岷縩 th峄ヽ',
+  allKnowledgeDescription: 'Ch峄峮 膽峄� hi峄僴 th峄� t岷 c岷� ki岷縩 th峄ヽ trong kh么ng gian l脿m vi峄嘽 n脿y. Ch峄� Ch峄� s峄� h峄痷 kh么ng gian l脿m vi峄嘽 m峄沬 c贸 th峄� qu岷 l媒 t岷 c岷� ki岷縩 th峄ヽ.',
+  metadata: {
+    createMetadata: {
+      name: 'T锚n',
+      namePlaceholder: 'Th锚m t锚n si锚u d峄� li峄噓',
+      type: 'Lo岷',
+      title: 'Si锚u d峄� li峄噓 m峄沬',
+      back: 'Quay l岷',
+    },
+    checkName: {
+      invalid: 'T锚n si锚u d峄� li峄噓 ch峄� c贸 th峄� ch峄゛ ch峄� c谩i th瓢峄漬g, s峄� v脿 d岷 g岷h d瓢峄沬, v脿 ph岷 b岷痶 膽岷 b岷眓g m峄檛 ch峄� c谩i th瓢峄漬g.',
+      empty: 'T锚n si锚u d峄� li峄噓 kh么ng 膽瓢峄 膽峄� tr峄憂g',
+    },
+    batchEditMetadata: {
+      applyToAllSelectDocumentTip: 'T峄� 膽峄檔g t岷 t岷 c岷� c谩c si锚u d峄� li峄噓 膽茫 ch峄塶h s峄璦 v脿 m峄沬 cho t岷 c岷� c谩c t脿i li峄噓 膽瓢峄 ch峄峮, n岷縰 kh么ng, vi峄嘽 ch峄塶h s峄璦 si锚u d峄� li峄噓 s岷� ch峄� 谩p d峄g cho c谩c t脿i li峄噓 c贸 n贸.',
+      multipleValue: 'Nhi峄乽 gi谩 tr峄�',
+      editDocumentsNum: 'Ch峄塶h s峄璦 {{num}} t脿i li峄噓',
+      applyToAllSelectDocument: '脕p d峄g cho t岷 c岷� c谩c t脿i li峄噓 膽茫 ch峄峮',
+      editMetadata: 'Ch峄塶h s峄璦 si锚u d峄� li峄噓',
+    },
+    selectMetadata: {
+      manageAction: 'Qu岷 l媒',
+      search: 'T矛m ki岷縨 si锚u d峄� li峄噓',
+      newAction: 'Si锚u d峄� li峄噓 m峄沬',
+    },
+    datasetMetadata: {
+      disabled: 'T岷痶',
+      rename: '膼峄昳 t锚n',
+      namePlaceholder: 'T锚n si锚u d峄� li峄噓',
+      builtIn: 'T铆ch h峄 s岷祅',
+      deleteTitle: 'X谩c nh岷璶 膽峄� x贸a',
+      name: 'T锚n',
+      values: '{{num}} Gi谩 tr峄�',
+      description: 'B岷 c贸 th峄� qu岷 l媒 t岷 c岷� metadata trong ki岷縩 th峄ヽ n脿y 峄� 膽芒y. Nh峄痭g thay 膽峄昳 s岷� 膽瓢峄 膽峄搉g b峄� h贸a 膽岷縩 m峄峣 t脿i li峄噓.',
+      deleteContent: 'B岷 c贸 ch岷痗 ch岷痭 mu峄憂 x贸a si锚u d峄� li峄噓 "{{name}}" kh么ng?',
+      builtInDescription: 'Si锚u d峄� li峄噓 膽瓢峄 t铆ch h峄 s岷祅 s岷� t峄� 膽峄檔g 膽瓢峄 tr铆ch xu岷 v脿 t岷 ra. N贸 ph岷 膽瓢峄 b岷璽 tr瓢峄沜 khi s峄� d峄g v脿 kh么ng th峄� ch峄塶h s峄璦.',
+      addMetaData: 'Th锚m si锚u d峄� li峄噓',
+    },
+    documentMetadata: {
+      documentInformation: 'Th么ng tin t脿i li峄噓',
+      technicalParameters: 'C谩c Th么ng S峄� K峄� Thu岷璽',
+      metadataToolTip: 'D峄� li峄噓 si锚u th么ng tin 膽贸ng vai tr貌 l脿 m峄檛 b峄� l峄峜 quan tr峄峮g gi煤p n芒ng cao 膽峄� ch铆nh x谩c v脿 t铆nh li锚n quan c峄 vi峄嘽 truy xu岷 th么ng tin. B岷 c贸 th峄� ch峄塶h s峄璦 v脿 th锚m d峄� li峄噓 si锚u th么ng tin cho t脿i li峄噓 n脿y 峄� 膽芒y.',
+      startLabeling: 'B岷痶 膽岷 g谩n nh茫n',
+    },
+    addMetadata: 'Th锚m si锚u d峄� li峄噓',
+    chooseTime: 'Ch峄峮 m峄檛 th峄漣 gian...',
+    metadata: 'Si锚u d峄� li峄噓',
+  },
+  embeddingModelNotAvailable: 'M么 h矛nh nh煤ng kh么ng kh岷� d峄g.',
+}
+
+export default translation
diff --git a/i18n/vi-VN/education.ts b/i18n/vi-VN/education.ts
new file mode 100644
index 0000000..3561493
--- /dev/null
+++ b/i18n/vi-VN/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    coupon: 'm茫 gi岷 gi谩 膽峄檆 quy峄乶 100%',
+    front: 'B岷 hi峄噉 膽峄� 膽i峄乽 ki峄噉 膽峄� c贸 tr岷g th谩i X谩c minh Gi谩o d峄. Vui l貌ng nh岷璸 th么ng tin gi谩o d峄 c峄 b岷 b锚n d瓢峄沬 膽峄� ho脿n t岷 qu谩 tr矛nh v脿 nh岷璶 m峄檛',
+    end: 'cho K岷� ho岷h Chuy锚n nghi峄噋 Dify.',
+  },
+  form: {
+    schoolName: {
+      placeholder: 'Nh岷璸 t锚n ch铆nh th峄ヽ, kh么ng vi岷縯 t岷痶 c峄 tr瓢峄漬g b岷',
+      title: 'T锚n Tr瓢峄漬g C峄 B岷',
+    },
+    schoolRole: {
+      option: {
+        teacher: 'Gi谩o vi锚n',
+        student: 'H峄峜 sinh',
+        administrator: 'Qu岷 tr峄� vi锚n tr瓢峄漬g h峄峜',
+      },
+      title: 'Vai tr貌 c峄 b岷 峄� tr瓢峄漬g',
+    },
+    terms: {
+      desc: {
+        termsOfService: '膼i峄乽 kho岷 d峄媍h v峄�',
+        privacyPolicy: 'Ch铆nh s谩ch b岷 m岷璽',
+        and: 'v脿',
+        end: 'B岷眓g c谩ch g峄璱:',
+        front: 'Th么ng tin c峄 b岷 v脿 vi峄嘽 s峄� d峄g tr岷g th谩i 膼瓢峄 x谩c minh Gi谩o d峄 c峄 ch煤ng t么i thu峄檆 v峄� 膽i峄乽 ki峄噉 c峄 ch煤ng t么i',
+      },
+      option: {
+        age: 'T么i x谩c nh岷璶 r岷眓g t么i 铆t nh岷 18 tu峄昳',
+        inSchool: 'T么i x谩c nh岷璶 r岷眓g t么i 膽茫 膽膬ng k媒 ho岷穋 l脿m vi峄嘽 t岷 c啤 s峄� 膽茫 cung c岷. Dify c贸 th峄� y锚u c岷 ch峄﹏g minh v峄� vi峄嘽 膽膬ng k媒/l脿m vi峄嘽. N岷縰 t么i cung c岷 th么ng tin kh么ng ch铆nh x谩c v峄� 膽峄� 膽i峄乽 ki峄噉 c峄 m矛nh, t么i 膽峄搉g 媒 tr岷� b岷 k峄� kho岷 ph铆 n脿o ban 膽岷 膽瓢峄 mi峄卬 d峄盿 tr锚n t矛nh tr岷g gi谩o d峄 c峄 t么i.',
+      },
+      title: '膼i峄乽 kho岷 & Th峄廰 thu岷璶',
+    },
+  },
+  toVerified: 'X谩c th峄眂 gi谩o d峄',
+  successTitle: 'B岷 膽茫 膽瓢峄 x谩c minh gi谩o d峄 Dify',
+  submit: 'G峄璱',
+  rejectTitle: 'Y锚u c岷 x谩c minh gi谩o d峄 Dify c峄 b岷 膽茫 b峄� t峄� ch峄慽',
+  successContent: 'Ch煤ng t么i 膽茫 ph谩t h脿nh m峄檛 phi岷縰 gi岷 gi谩 100% cho g贸i Dify Professional v脿o t脿i kho岷 c峄 b岷. Phi岷縰 gi岷 gi谩 c贸 hi峄噓 l峄眂 trong m峄檛 n膬m, vui l貌ng s峄� d峄g n贸 trong th峄漣 gian hi峄噓 l峄眂.',
+  currentSigned: 'HI峄哊 膼ANG 膼膫NG NH岷琍 V脌O',
+  learn: 'H峄峜 c谩ch x谩c minh tr矛nh 膽峄� gi谩o d峄',
+  emailLabel: 'Email hi峄噉 t岷 c峄 b岷',
+  rejectContent: 'R岷 ti岷縞, b岷 kh么ng 膽峄� 膽i峄乽 ki峄噉 膽峄� nh岷璶 tr岷g th谩i X谩c minh Gi谩o d峄 v脿 do 膽贸 kh么ng th峄� nh岷璶 膽瓢峄 m茫 gi岷 gi谩 膽峄檆 quy峄乶 100% cho K岷� ho岷h Chuy锚n nghi峄噋 Dify n岷縰 b岷 s峄� d峄g 膽峄媋 ch峄� email n脿y.',
+  submitError: 'G峄璱 m岷玼 kh么ng th脿nh c么ng. Vui l貌ng th峄� l岷 sau.',
+}
+
+export default translation
diff --git a/i18n/vi-VN/explore.ts b/i18n/vi-VN/explore.ts
new file mode 100644
index 0000000..860bfd7
--- /dev/null
+++ b/i18n/vi-VN/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: 'Kh谩m ph谩',
+  sidebar: {
+    discovery: 'Kh谩m ph谩',
+    chat: 'Tr貌 chuy峄噉',
+    workspace: 'Kh么ng gian l脿m vi峄嘽',
+    action: {
+      pin: 'Ghim',
+      unpin: 'B峄� ghim',
+      rename: '膼峄昳 t锚n',
+      delete: 'X贸a',
+    },
+    delete: {
+      title: 'X贸a 峄﹏g d峄g',
+      content: 'B岷 c贸 ch岷痗 ch岷痭 mu峄憂 x贸a 峄﹏g d峄g n脿y kh么ng?',
+    },
+  },
+  apps: {
+    title: 'Kh谩m ph谩 峄﹏g d峄g b峄焛 Dify',
+    description: 'S峄� d峄g ngay c谩c 峄﹏g d峄g m岷玼 n脿y ho岷穋 t霉y ch峄塶h 峄﹏g d峄g c峄 b岷 d峄盿 tr锚n c谩c m岷玼 c贸 s岷祅.',
+    allCategories: 'T岷 c岷� danh m峄',
+  },
+  appCard: {
+    addToWorkspace: 'Th锚m v脿o kh么ng gian l脿m vi峄嘽',
+    customize: 'T霉y ch峄塶h',
+  },
+  appCustomize: {
+    title: 'T岷 峄﹏g d峄g t峄� {{name}}',
+    subTitle: 'Bi峄僽 t瓢峄g v脿 t锚n 峄﹏g d峄g',
+    nameRequired: 'Vui l貌ng nh岷璸 t锚n 峄﹏g d峄g',
+  },
+  category: {
+    Assistant: 'Tr峄� l媒',
+    Writing: 'Vi岷縯 l谩ch',
+    Translate: 'D峄媍h thu岷璽',
+    Programming: 'L岷璸 tr矛nh',
+    HR: 'Nh芒n s峄�',
+    Agent: 'Ng瓢峄漣 膽岷 l媒',
+    Workflow: 'Quy tr矛nh l脿m vi峄嘽',
+    Entertainment: 'Gi岷 tr铆',
+  },
+}
+
+export default translation
diff --git a/i18n/vi-VN/layout.ts b/i18n/vi-VN/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/vi-VN/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/vi-VN/login.ts b/i18n/vi-VN/login.ts
new file mode 100644
index 0000000..ab4ab68
--- /dev/null
+++ b/i18n/vi-VN/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: 'Xin ch脿o, h茫y b岷痶 膽岷! 馃憢',
+  welcome: 'Ch脿o m峄玭g b岷 膽岷縩 v峄沬 Dify, vui l貌ng 膽膬ng nh岷璸 膽峄� ti岷縫 t峄.',
+  email: '膼峄媋 ch峄� email',
+  emailPlaceholder: 'Nh岷璸 email c峄 b岷',
+  password: 'M岷璽 kh岷﹗',
+  passwordPlaceholder: 'Nh岷璸 m岷璽 kh岷﹗ c峄 b岷',
+  name: 'T锚n ng瓢峄漣 d霉ng',
+  namePlaceholder: 'Nh岷璸 t锚n ng瓢峄漣 d霉ng c峄 b岷',
+  forget: 'Qu锚n m岷璽 kh岷﹗?',
+  signBtn: '膼膬ng nh岷璸',
+  installBtn: 'C脿i 膽岷穞',
+  setAdminAccount: 'Thi岷縯 l岷璸 t脿i kho岷 qu岷 tr峄�',
+  setAdminAccountDesc: 'T脿i kho岷 qu岷 tr峄� c贸 quy峄乶 t峄慽 膽a, c贸 th峄� t岷 峄﹏g d峄g v脿 qu岷 l媒 c谩c nh脿 cung c岷 LLM, v.v.',
+  createAndSignIn: 'T岷 v脿 膽膬ng nh岷璸',
+  oneMoreStep: 'C貌n m峄檛 b瓢峄沜 n峄痑',
+  createSample: 'D峄盿 tr锚n th么ng tin n脿y, ch煤ng t么i s岷� t岷 m峄檛 峄﹏g d峄g m岷玼 cho b岷',
+  invitationCode: 'M茫 m峄漣',
+  invitationCodePlaceholder: 'Nh岷璸 m茫 m峄漣 c峄 b岷',
+  interfaceLanguage: 'Ng么n ng峄� giao di峄噉',
+  timezone: 'M煤i gi峄�',
+  go: '膼i 膽岷縩 Dify',
+  sendUsMail: 'G峄璱 email gi峄沬 thi峄噓 cho ch煤ng t么i, ch煤ng t么i s岷� x峄� l媒 y锚u c岷 m峄漣 c峄 b岷.',
+  acceptPP: 'T么i 膽茫 膽峄峜 v脿 膽峄搉g 媒 v峄沬 ch铆nh s谩ch b岷 m岷璽',
+  reset: 'Vui l貌ng ch岷 l峄噉h sau 膽峄� 膽岷穞 l岷 m岷璽 kh岷﹗ c峄 b岷',
+  withGitHub: 'Ti岷縫 t峄 v峄沬 GitHub',
+  withGoogle: 'Ti岷縫 t峄 v峄沬 Google',
+  rightTitle: 'Khai ph谩 ti峄乵 n膬ng t峄慽 膽a c峄 LLM',
+  rightDesc: 'D峄� d脿ng x芒y d峄眓g 峄﹏g d峄g AI h岷 d岷玭, c贸 th峄� v岷璶 h脿nh v脿 c岷 thi峄噉 膽瓢峄.',
+  tos: '膼i峄乽 kho岷 d峄媍h v峄�',
+  pp: 'Ch铆nh s谩ch b岷 m岷璽',
+  tosDesc: 'B岷眓g c谩ch 膽膬ng k媒, b岷 膽峄搉g 媒 v峄沬',
+  goToInit: 'N岷縰 b岷 ch瓢a kh峄焛 t岷 t脿i kho岷, vui l貌ng chuy峄僴 膽岷縩 trang kh峄焛 t岷',
+  dontHave: 'Ch瓢a c贸 t脿i kho岷?',
+  invalidInvitationCode: 'M茫 m峄漣 kh么ng h峄 l峄�',
+  accountAlreadyInited: 'T脿i kho岷 膽茫 膽瓢峄 kh峄焛 t岷',
+  forgotPassword: 'Qu锚n m岷璽 kh岷﹗?',
+  resetLinkSent: '膼茫 g峄璱 li锚n k岷縯 膽岷穞 l岷 m岷璽 kh岷﹗',
+  sendResetLink: 'G峄璱 li锚n k岷縯 膽岷穞 l岷 m岷璽 kh岷﹗',
+  backToSignIn: 'Quay l岷 膽膬ng nh岷璸',
+  forgotPasswordDesc: 'Vui l貌ng nh岷璸 膽峄媋 ch峄� email c峄 b岷 膽峄� 膽岷穞 l岷 m岷璽 kh岷﹗. Ch煤ng t么i s岷� g峄璱 cho b岷 m峄檛 email h瓢峄沶g d岷玭 c谩ch 膽岷穞 l岷 m岷璽 kh岷﹗.',
+  checkEmailForResetLink: 'Vui l貌ng ki峄僲 tra email 膽峄� nh岷璶 li锚n k岷縯 膽岷穞 l岷 m岷璽 kh岷﹗. N岷縰 kh么ng th岷 trong v脿i ph煤t, h茫y ki峄僲 tra th瓢 m峄 spam.',
+  passwordChanged: '膼膬ng nh岷璸 ngay',
+  changePassword: '膼峄昳 m岷璽 kh岷﹗',
+  changePasswordTip: 'Vui l貌ng nh岷璸 m岷璽 kh岷﹗ m峄沬 cho t脿i kho岷 c峄 b岷',
+  invalidToken: 'M茫 th么ng b谩o kh么ng h峄 l峄� ho岷穋 膽茫 h岷縯 h岷',
+  confirmPassword: 'X谩c nh岷璶 m岷璽 kh岷﹗',
+  confirmPasswordPlaceholder: 'Nh岷璸 l岷 m岷璽 kh岷﹗ m峄沬 c峄 b岷',
+  passwordChangedTip: 'M岷璽 kh岷﹗ c峄 b岷 膽茫 膽瓢峄 thay 膽峄昳 th脿nh c么ng',
+  error: {
+    emailEmpty: 'Vui l貌ng nh岷璸 膽峄媋 ch峄� email',
+    emailInValid: 'Vui l貌ng nh岷璸 m峄檛 膽峄媋 ch峄� email h峄 l峄�',
+    nameEmpty: 'Vui l貌ng nh岷璸 t锚n',
+    passwordEmpty: 'Vui l貌ng nh岷璸 m岷璽 kh岷﹗',
+    passwordInvalid: 'M岷璽 kh岷﹗ ph岷 ch峄゛ c岷� ch峄� v脿 s峄�, v脿 c贸 膽峄� d脿i 铆t nh岷 8 k媒 t峄�',
+    passwordLengthInValid: 'M岷璽 kh岷﹗ ph岷 c贸 铆t nh岷 8 k媒 t峄�',
+    registrationNotAllowed: 'Kh么ng t矛m th岷 t脿i kho岷. Vui l貌ng li锚n h峄� v峄沬 qu岷 tr峄� vi锚n h峄� th峄憂g 膽峄� 膽膬ng k媒.',
+  },
+  license: {
+    tip: 'Tr瓢峄沜 khi b岷痶 膽岷 s峄� d峄g Phi锚n b岷 C峄檔g 膽峄搉g c峄 Dify, vui l貌ng 膽峄峜',
+    link: 'Gi岷 ph茅p m茫 ngu峄搉 m峄� tr锚n GitHub',
+  },
+  join: 'Tham gia',
+  joinTipStart: 'M峄漣 b岷 tham gia',
+  joinTipEnd: '膽峄檌 ng农 t岷 Dify',
+  invalid: 'Li锚n k岷縯 膽茫 h岷縯 h岷',
+  explore: 'Kh谩m ph谩 Dify',
+  activatedTipStart: 'B岷 膽茫 tham gia',
+  activatedTipEnd: '膽峄檌 ng农',
+  activated: '膼膬ng nh岷璸 ngay',
+  adminInitPassword: 'M岷璽 kh岷﹗ kh峄焛 t岷 qu岷 tr峄� vi锚n',
+  validate: 'X谩c th峄眂',
+  sso: 'Ti岷縫 t峄 v峄沬 SSO',
+  checkCode: {
+    checkYourEmail: 'Ki峄僲 tra email c峄 b岷',
+    verify: 'X谩c minh',
+    resend: 'G峄璱 l岷',
+    didNotReceiveCode: 'B岷 kh么ng nh岷璶 膽瓢峄 m茫?',
+    validTime: 'L瓢u 媒 r岷眓g m茫 c贸 hi峄噓 l峄眂 trong 5 ph煤t',
+    invalidCode: 'M茫 kh么ng h峄 l峄�',
+    verificationCode: 'M茫 x谩c minh',
+    useAnotherMethod: 'S峄� d峄g ph瓢啤ng ph谩p kh谩c',
+    emptyCode: 'M茫 l脿 b岷痶 bu峄檆',
+    verificationCodePlaceholder: 'Nh岷璸 m茫 g峄搈 6 ch峄� s峄�',
+    tips: 'Ch煤ng t么i g峄璱 m茫 x谩c minh 膽岷縩 <strong>{{email}}</strong>',
+  },
+  back: 'L瓢ng',
+  withSSO: 'Ti岷縫 t峄 v峄沬 SSO',
+  continueWithCode: 'Ti岷縫 t峄 v峄沬 m茫',
+  changePasswordBtn: '膼岷穞 m岷璽 kh岷﹗',
+  useVerificationCode: 'S峄� d峄g m茫 x谩c minh',
+  noLoginMethodTip: 'Vui l貌ng li锚n h峄� v峄沬 qu岷 tr峄� vi锚n h峄� th峄憂g 膽峄� th锚m ph瓢啤ng th峄ヽ x谩c th峄眂.',
+  enterYourName: 'Vui l貌ng nh岷璸 t锚n ng瓢峄漣 d霉ng c峄 b岷',
+  setYourAccount: '膼岷穞 t脿i kho岷 c峄 b岷',
+  backToLogin: 'Quay l岷 膽膬ng nh岷璸',
+  noLoginMethod: 'Ph瓢啤ng th峄ヽ x谩c th峄眂 kh么ng 膽瓢峄 c岷 h矛nh',
+  or: 'HO岷禖',
+  resetPasswordDesc: 'Nh岷璸 email b岷 膽茫 s峄� d峄g 膽峄� 膽膬ng k媒 tr锚n Dify v脿 ch煤ng t么i s岷� g峄璱 cho b岷 email 膽岷穞 l岷 m岷璽 kh岷﹗.',
+  usePassword: 'S峄� d峄g m岷璽 kh岷﹗',
+  resetPassword: '膼岷穞 l岷 m岷璽 kh岷﹗',
+  sendVerificationCode: 'G峄璱 m茫 x谩c minh',
+  licenseInactive: 'Gi岷 ph茅p kh么ng ho岷 膽峄檔g',
+  licenseLost: 'M岷 gi岷 ph茅p',
+  licenseInactiveTip: 'Gi岷 ph茅p Dify Enterprise cho kh么ng gian l脿m vi峄嘽 c峄 b岷 kh么ng ho岷 膽峄檔g. Vui l貌ng li锚n h峄� v峄沬 qu岷 tr峄� vi锚n c峄 b岷 膽峄� ti岷縫 t峄 s峄� d峄g Dify.',
+  licenseExpired: 'Gi岷 ph茅p 膽茫 h岷縯 h岷',
+  licenseExpiredTip: 'Gi岷 ph茅p Dify Enterprise cho kh么ng gian l脿m vi峄嘽 c峄 b岷 膽茫 h岷縯 h岷. Vui l貌ng li锚n h峄� v峄沬 qu岷 tr峄� vi锚n c峄 b岷 膽峄� ti岷縫 t峄 s峄� d峄g Dify.',
+  licenseLostTip: 'Kh么ng th峄� k岷縯 n峄慽 m谩y ch峄� c岷 ph茅p Dify. Vui l貌ng li锚n h峄� v峄沬 qu岷 tr峄� vi锚n c峄 b岷 膽峄� ti岷縫 t峄 s峄� d峄g Dify.',
+}
+
+export default translation
diff --git a/i18n/vi-VN/plugin-tags.ts b/i18n/vi-VN/plugin-tags.ts
new file mode 100644
index 0000000..5bbebb5
--- /dev/null
+++ b/i18n/vi-VN/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    education: 'Gi谩o d峄',
+    medical: 'Y',
+    business: 'Kinh doanh',
+    weather: 'Th峄漣 ti岷縯',
+    finance: 'T脿i ch铆nh',
+    productivity: 'N膬ng su岷',
+    design: 'Thi岷縯 k岷�',
+    videos: 'Video',
+    utilities: 'Ti峄噉 铆ch',
+    social: 'X茫 h峄檌',
+    search: 'T矛m ki岷縨',
+    news: 'Tin t峄ヽ',
+    image: '岷h',
+    agent: 'Ng瓢峄漣 膽岷 l媒',
+    other: 'Kh谩c',
+    travel: 'Du l峄媍h',
+    entertainment: 'Gi岷 tr铆',
+  },
+  searchTags: 'Th岷� t矛m ki岷縨',
+  allTags: 'T岷 c岷� th岷�',
+}
+
+export default translation
diff --git a/i18n/vi-VN/plugin.ts b/i18n/vi-VN/plugin.ts
new file mode 100644
index 0000000..5e5147c
--- /dev/null
+++ b/i18n/vi-VN/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    all: 'T岷 c岷�',
+    bundles: 'B贸',
+    extensions: 'Ph岷 m峄� r峄檔g',
+    tools: 'C么ng c峄�',
+    agents: 'Chi岷縩 l瓢峄 膽岷 l媒',
+    models: 'M么 h矛nh',
+  },
+  categorySingle: {
+    agent: 'Chi岷縩 l瓢峄 膽岷 l媒',
+    tool: 'C么ng c峄�',
+    extension: 'Ph岷 m峄� r峄檔g',
+    model: 'M岷玼',
+    bundle: 'B贸',
+  },
+  list: {
+    source: {
+      marketplace: 'C脿i 膽岷穞 t峄� Marketplace',
+      local: 'C脿i 膽岷穞 t峄� t峄噋 g贸i c峄 b峄�',
+      github: 'C脿i 膽岷穞 t峄� GitHub',
+    },
+    noInstalled: 'Kh么ng c贸 plugin n脿o 膽瓢峄 c脿i 膽岷穞',
+    notFound: 'Kh么ng t矛m th岷 plugin',
+  },
+  source: {
+    marketplace: 'Ch峄�',
+    local: 'T峄噋 g贸i c峄 b峄�',
+    github: 'GitHub',
+  },
+  detailPanel: {
+    categoryTip: {
+      local: 'Plugin c峄 b峄�',
+      debugging: 'Plugin g峄� l峄梚',
+      marketplace: '膼瓢峄 c脿i 膽岷穞 t峄� Marketplace',
+      github: 'C脿i 膽岷穞 t峄� Github',
+    },
+    operation: {
+      detail: 'Chi ti岷縯',
+      update: 'C岷璸 nh岷璽',
+      viewDetail: 'xem chi ti岷縯',
+      info: 'Th么ng tin plugin',
+      remove: 'Tri峄噒',
+      install: 'C脿i 膽岷穞',
+      checkUpdate: 'Ki峄僲 tra c岷璸 nh岷璽',
+    },
+    toolSelector: {
+      descriptionPlaceholder: 'M么 t岷� ng岷痭 g峄峮 v峄� m峄 膽铆ch c峄 c么ng c峄�, v铆 d峄�: l岷 nhi峄噒 膽峄� cho m峄檛 v峄� tr铆 c峄� th峄�.',
+      params: 'C岷 H脤NH L脻 LU岷琋',
+      toolLabel: 'C么ng c峄�',
+      descriptionLabel: 'M么 t岷� c么ng c峄�',
+      unsupportedContent2: 'Nh岷 膽峄� chuy峄僴 膽峄昳 phi锚n b岷.',
+      auto: 'T峄� 膽峄檔g',
+      placeholder: 'Ch峄峮 m峄檛 c么ng c峄�...',
+      paramsTip1: 'Ki峄僲 so谩t c谩c tham s峄� suy lu岷璶 LLM.',
+      uninstalledTitle: 'C么ng c峄� ch瓢a 膽瓢峄 c脿i 膽岷穞',
+      unsupportedContent: 'Phi锚n b岷 plugin 膽茫 c脿i 膽岷穞 kh么ng cung c岷 h脿nh 膽峄檔g n脿y.',
+      uninstalledContent: 'Plugin n脿y 膽瓢峄 c脿i 膽岷穞 t峄� kho l瓢u tr峄� c峄 b峄� / GitHub. Vui l貌ng s峄� d峄g sau khi c脿i 膽岷穞.',
+      paramsTip2: 'Khi t岷痶 \'T峄� 膽峄檔g\', gi谩 tr峄� m岷穋 膽峄媙h s岷� 膽瓢峄 s峄� d峄g.',
+      uninstalledLink: 'Qu岷 l媒 trong Plugins',
+      title: 'Th锚m c么ng c峄�',
+      settings: 'C脌I 膼岷禩 NG漂峄淚 D脵NG',
+      empty: 'Nh岷 v脿o n煤t \'+\' 膽峄� th锚m c么ng c峄�. B岷 c贸 th峄� th锚m nhi峄乽 c么ng c峄�.',
+      unsupportedTitle: 'H脿nh 膽峄檔g kh么ng 膽瓢峄 h峄� tr峄�',
+    },
+    switchVersion: 'Chuy峄僴 膽峄昳 phi锚n b岷',
+    endpointDisableTip: 'T岷痶 膽i峄僲 cu峄慽',
+    endpointDeleteTip: 'X贸a 膽i峄僲 cu峄慽',
+    configureApp: '膼峄媙h c岷 h矛nh 峄﹏g d峄g',
+    configureModel: '膼峄媙h c岷 h矛nh m么 h矛nh',
+    endpointsTip: 'Plugin n脿y cung c岷 c谩c ch峄ヽ n膬ng c峄� th峄� th么ng qua c谩c 膽i峄僲 cu峄慽 v脿 b岷 c贸 th峄� 膽峄媙h c岷 h矛nh nhi峄乽 b峄� 膽i峄僲 cu峄慽 cho kh么ng gian l脿m vi峄嘽 hi峄噉 t岷.',
+    endpointDisableContent: 'B岷 c贸 mu峄憂 v么 hi峄噓 h贸a {{name}} kh么ng?',
+    strategyNum: '{{s峄憓} {{chi岷縩 l瓢峄}} BAO G峄扢',
+    endpoints: '膼i峄僲 cu峄慽',
+    actionNum: '{{s峄憓} {{h脿nh 膽峄檔g}} BAO G峄扢',
+    configureTool: 'C么ng c峄� 膽峄媙h c岷 h矛nh',
+    modelNum: '{{s峄憓} C脕C M脭 H脤NH BAO G峄扢',
+    serviceOk: 'D峄媍h v峄� OK',
+    endpointsDocLink: 'Xem t脿i li峄噓',
+    endpointsEmpty: 'Nh岷 v脿o n煤t \'+\' 膽峄� th锚m 膽i峄僲 cu峄慽',
+    endpointModalDesc: 'Sau khi 膽峄媙h c岷 h矛nh, c谩c t铆nh n膬ng do plugin cung c岷 th么ng qua 膽i峄僲 cu峄慽 API c贸 th峄� 膽瓢峄 s峄� d峄g.',
+    endpointDeleteContent: 'B岷 c贸 mu峄憂 x贸a {{name}} kh么ng?',
+    endpointModalTitle: '膼i峄僲 cu峄慽 thi岷縯 l岷璸',
+    disabled: 'T脿n t岷璽',
+  },
+  debugInfo: {
+    title: 'G峄� l峄梚',
+    viewDocs: 'Xem t脿i li峄噓',
+  },
+  privilege: {
+    whoCanInstall: 'Ai c贸 th峄� c脿i 膽岷穞 v脿 qu岷 l媒 plugin?',
+    everyone: 'Ai ai',
+    whoCanDebug: 'Ai c贸 th峄� g峄� l峄梚 plugin?',
+    title: 'T霉y ch峄峮 plugin',
+    admins: 'Qu岷 tr峄� vi锚n',
+    noone: 'Kh么ng ai',
+  },
+  pluginInfoModal: {
+    release: 'Ph谩t h脿nh',
+    repository: 'Kho',
+    title: 'Th么ng tin plugin',
+    packageName: 'G贸i',
+  },
+  action: {
+    delete: 'X贸a plugin',
+    deleteContentRight: 'plugin?',
+    usedInApps: 'Plugin n脿y 膽ang 膽瓢峄 s峄� d峄g trong c谩c 峄﹏g d峄g {{num}}.',
+    pluginInfo: 'Th么ng tin plugin',
+    checkForUpdates: 'Ki峄僲 tra th么ng tin c岷璸 nh岷璽',
+    deleteContentLeft: 'B岷 c贸 mu峄憂 x贸a',
+  },
+  installModal: {
+    labels: {
+      package: 'G贸i',
+      repository: 'Kho',
+      version: 'Phi锚n b岷',
+    },
+    close: '膼贸ng',
+    installFailedDesc: 'Plugin 膽茫 膽瓢峄 c脿i 膽岷穞 kh么ng th脿nh c么ng.',
+    cancel: 'H峄',
+    install: 'C脿i 膽岷穞',
+    dropPluginToInstall: 'Th岷� g贸i plugin v脿o 膽芒y 膽峄� c脿i 膽岷穞',
+    readyToInstallPackage: 'Gi峄沬 thi峄噓 c脿i 膽岷穞 plugin sau',
+    uploadingPackage: 'T岷 l锚n {{packageName}}...',
+    installing: 'C脿i 膽岷穞...',
+    installedSuccessfully: 'C脿i 膽岷穞 th脿nh c么ng',
+    readyToInstall: 'Gi峄沬 thi峄噓 c脿i 膽岷穞 plugin sau',
+    next: 'Sau',
+    readyToInstallPackages: 'Chu岷﹏ b峄� c脿i 膽岷穞 c谩c plugin {{num}} sau',
+    pluginLoadErrorDesc: 'Plugin n脿y s岷� kh么ng 膽瓢峄 c脿i 膽岷穞',
+    fromTrustSource: 'H茫y 膽岷 b岷 r岷眓g b岷 ch峄� c脿i 膽岷穞 c谩c plugin t峄� <trustSource>m峄檛 ngu峄搉 膽谩ng tin c岷瓂</trustSource>.',
+    installedSuccessfullyDesc: 'Plugin 膽茫 膽瓢峄 c脿i 膽岷穞 th脿nh c么ng.',
+    uploadFailed: 'T岷 l锚n kh么ng th脿nh c么ng',
+    installPlugin: 'C脿i 膽岷穞 Plugin',
+    installFailed: 'C脿i 膽岷穞 kh么ng th脿nh c么ng',
+    installComplete: 'C脿i 膽岷穞 ho脿n t岷',
+    back: 'L瓢ng',
+    pluginLoadError: 'L峄梚 t岷 plugin',
+  },
+  installFromGitHub: {
+    installFailed: 'C脿i 膽岷穞 kh么ng th脿nh c么ng',
+    updatePlugin: 'C岷璸 nh岷璽 plugin t峄� GitHub',
+    gitHubRepo: 'Kho l瓢u tr峄� GitHub',
+    selectPackage: 'Ch峄峮 g贸i',
+    selectVersionPlaceholder: 'Vui l貌ng ch峄峮 m峄檛 phi锚n b岷',
+    installedSuccessfully: 'C脿i 膽岷穞 th脿nh c么ng',
+    installPlugin: 'C脿i 膽岷穞 plugin t峄� GitHub',
+    uploadFailed: 'T岷 l锚n kh么ng th脿nh c么ng',
+    selectPackagePlaceholder: 'Vui l貌ng ch峄峮 m峄檛 g贸i',
+    selectVersion: 'Ch峄峮 phi锚n b岷',
+    installNote: 'H茫y 膽岷 b岷 r岷眓g b岷 ch峄� c脿i 膽岷穞 c谩c plugin t峄� m峄檛 ngu峄搉 膽谩ng tin c岷瓂.',
+  },
+  upgrade: {
+    upgrade: 'C脿i 膽岷穞',
+    upgrading: 'C脿i 膽岷穞...',
+    successfulTitle: 'C脿i 膽岷穞 th脿nh c么ng',
+    title: 'C脿i 膽岷穞 Plugin',
+    usedInApps: '膼瓢峄 s峄� d峄g trong c谩c 峄﹏g d峄g {{num}}',
+    description: 'Gi峄沬 thi峄噓 c脿i 膽岷穞 plugin sau',
+    close: '膼贸ng',
+  },
+  error: {
+    noReleasesFound: 'Kh么ng t矛m th岷 b岷 ph谩t h脿nh. Vui l貌ng ki峄僲 tra kho l瓢u tr峄� GitHub ho岷穋 URL 膽岷 v脿o.',
+    fetchReleasesError: 'Kh么ng th峄� truy xu岷 b岷 ph谩t h脿nh. Vui l貌ng th峄� l岷 sau.',
+    inValidGitHubUrl: 'URL GitHub kh么ng h峄 l峄�. Vui l貌ng nh岷璸 URL h峄 l峄� theo 膽峄媙h d岷g: https://github.com/owner/repo',
+  },
+  marketplace: {
+    sortOption: {
+      newlyReleased: 'M峄沬 ph谩t h脿nh',
+      mostPopular: 'Ph峄� bi岷縩 nh岷',
+      firstReleased: 'Ph谩t h脿nh l岷 膽岷 ti锚n',
+      recentlyUpdated: 'C岷璸 nh岷璽 g岷 膽芒y',
+    },
+    empower: 'H峄� tr峄� ph谩t tri峄僴 AI c峄 b岷',
+    viewMore: 'Xem th锚m',
+    difyMarketplace: 'Th峄� tr瓢峄漬g Dify',
+    discover: 'Kh谩m ph谩',
+    pluginsResult: '{{num}} k岷縯 qu岷�',
+    moreFrom: 'C谩c 峄﹏g d峄g kh谩c t峄� Marketplace',
+    sortBy: 'Th脿nh ph峄� 膽en',
+    noPluginFound: 'Kh么ng t矛m th岷 plugin n脿o',
+    and: 'v脿',
+    verifiedTip: '膼瓢峄 x谩c nh岷璶 b峄焛 Dify',
+    partnerTip: '膼瓢峄 x谩c nh岷璶 b峄焛 m峄檛 膽峄慽 t谩c c峄 Dify',
+  },
+  task: {
+    installingWithError: 'C脿i 膽岷穞 {{installingLength}} plugins, {{successLength}} th脿nh c么ng, {{errorLength}} kh么ng th脿nh c么ng',
+    installing: 'C脿i 膽岷穞 {{installingLength}} plugins, 0 xong.',
+    installingWithSuccess: 'C脿i 膽岷穞 {{installingLength}} plugins, {{successLength}} th脿nh c么ng.',
+    installError: '{{errorLength}} plugin kh么ng c脿i 膽岷穞 膽瓢峄, nh岷 膽峄� xem',
+    installedError: '{{errorLength}} plugin kh么ng c脿i 膽岷穞 膽瓢峄',
+    clearAll: 'X贸a t岷 c岷�',
+  },
+  from: 'T峄�',
+  installAction: 'C脿i 膽岷穞',
+  searchInMarketplace: 'T矛m ki岷縨 tr锚n Marketplace',
+  endpointsEnabled: '{{num}} b峄� 膽i峄僲 cu峄慽 膽瓢峄 k铆ch ho岷',
+  install: '{{num}} l瓢峄 c脿i 膽岷穞',
+  findMoreInMarketplace: 'T矛m th锚m trong Marketplace',
+  submitPlugin: 'G峄璱 plugin',
+  search: 'T矛m ki岷縨',
+  searchCategories: 'Danh m峄 t矛m ki岷縨',
+  installPlugin: 'C脿i 膽岷穞 plugin',
+  searchPlugins: 'T矛m ki岷縨 plugin',
+  fromMarketplace: 'T峄� Marketplace',
+  allCategories: 'T岷 c岷� c谩c danh m峄',
+  searchTools: 'C么ng c峄� t矛m ki岷縨...',
+  installFrom: 'C脌I 膼岷禩 T峄�',
+  metadata: {
+    title: 'Plugin',
+  },
+  difyVersionNotCompatible: 'Phi锚n b岷 Dify hi峄噉 t岷 kh么ng t瓢啤ng th铆ch v峄沬 plugin n脿y, vui l貌ng n芒ng c岷 l锚n phi锚n b岷 t峄慽 thi峄僽 c岷 thi岷縯: {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/vi-VN/register.ts b/i18n/vi-VN/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/vi-VN/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/vi-VN/run-log.ts b/i18n/vi-VN/run-log.ts
new file mode 100644
index 0000000..ef6d77e
--- /dev/null
+++ b/i18n/vi-VN/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: 'NH岷琍',
+  result: 'K岷綯 QU岷�',
+  detail: 'CHI TI岷綯',
+  tracing: 'THEO D脮I',
+  resultPanel: {
+    status: 'TR岷燦G TH脕I',
+    time: 'TH峄淚 GIAN',
+    tokens: 'T峄擭G S峄� TOKEN',
+  },
+  meta: {
+    title: 'D峄� LI峄哢 META',
+    status: 'Tr岷g th谩i',
+    version: 'Phi锚n b岷',
+    executor: 'Ng瓢峄漣 th峄眂 thi',
+    startTime: 'Th峄漣 gian b岷痶 膽岷',
+    time: 'Th峄漣 gian 膽茫 tr么i qua',
+    tokens: 'T峄昻g s峄� token',
+    steps: 'C谩c b瓢峄沜 ch岷',
+  },
+  resultEmpty: {
+    title: 'Ch岷 n脿y ch峄� xu岷 ra 膽峄媙h d岷g JSON,',
+    tipLeft: 'vui l貌ng truy c岷璸 ',
+    link: 'b岷g chi ti岷縯',
+    tipRight: ' xem n贸.',
+  },
+  circularInvocationTip: 'C贸 l峄噉h g峄峣 v貌ng tr貌n c谩c c么ng c峄�/n煤t trong quy tr矛nh l脿m vi峄嘽 hi峄噉 t岷.',
+  actionLogs: 'Nh岷璽 k媒 h脿nh 膽峄檔g',
+}
+
+export default translation
diff --git a/i18n/vi-VN/share-app.ts b/i18n/vi-VN/share-app.ts
new file mode 100644
index 0000000..a55f9b8
--- /dev/null
+++ b/i18n/vi-VN/share-app.ts
@@ -0,0 +1,78 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: '峄╪g d峄g kh么ng kh岷� d峄g',
+    appUnknownError: '峄╪g d峄g g岷穚 l峄梚 kh么ng x谩c 膽峄媙h',
+  },
+  chat: {
+    newChat: 'Cu峄檆 tr貌 chuy峄噉 m峄沬',
+    pinnedTitle: '膼茫 ghim',
+    unpinnedTitle: 'Tr貌 chuy峄噉',
+    newChatDefaultName: 'Cu峄檆 tr貌 chuy峄噉 m峄沬',
+    resetChat: '膼岷穞 l岷 cu峄檆 tr貌 chuy峄噉',
+    poweredBy: '膼瓢峄 cung c岷 b峄焛',
+    prompt: 'L峄漣 nh岷痗',
+    privatePromptConfigTitle: 'C脿i 膽岷穞 cu峄檆 tr貌 chuy峄噉',
+    publicPromptConfigTitle: 'L峄漣 nh岷痗 ban 膽岷',
+    configStatusDes: 'Tr瓢峄沜 khi b岷痶 膽岷, b岷 c贸 th峄� ch峄塶h s峄璦 c脿i 膽岷穞 cu峄檆 tr貌 chuy峄噉',
+    configDisabled: 'C脿i 膽岷穞 c峄 phi锚n tr瓢峄沜 膽茫 膽瓢峄 s峄� d峄g cho phi锚n n脿y.',
+    startChat: 'B岷痶 膽岷 tr貌 chuy峄噉',
+    privacyPolicyLeft: 'Vui l貌ng 膽峄峜 ',
+    privacyPolicyMiddle: 'ch铆nh s谩ch b岷 m岷璽',
+    privacyPolicyRight: ' 膽瓢峄 cung c岷 b峄焛 nh脿 ph谩t tri峄僴 峄﹏g d峄g.',
+    deleteConversation: {
+      title: 'X贸a cu峄檆 tr貌 chuy峄噉',
+      content: 'B岷 c贸 ch岷痗 mu峄憂 x贸a cu峄檆 tr貌 chuy峄噉 n脿y kh么ng?',
+    },
+    tryToSolve: 'Th峄� gi岷 quy岷縯',
+    temporarySystemIssue: 'Xin l峄梚, h峄� th峄憂g 膽ang g岷穚 s峄� c峄� t岷 th峄漣.',
+    expand: 'M峄� r峄檔g',
+    collapse: 'Thu g峄峮',
+    chatFormTip: 'C脿i 膽岷穞 tr貌 chuy峄噉 kh么ng th峄� 膽瓢峄 thay 膽峄昳 sau khi cu峄檆 tr貌 chuy峄噉 膽茫 b岷痶 膽岷.',
+    newChatTip: '膼茫 峄� trong m峄檛 cu峄檆 tr貌 chuy峄噉 m峄沬',
+    viewChatSettings: 'Xem c脿i 膽岷穞 tr貌 chuy峄噉',
+    chatSettingsTitle: 'C脿i 膽岷穞 tr貌 chuy峄噉 m峄沬',
+  },
+  generation: {
+    tabs: {
+      create: 'T岷 膽啤n l岷�',
+      batch: 'T岷 h脿ng lo岷',
+      saved: '膼茫 l瓢u',
+    },
+    savedNoData: {
+      title: 'B岷 ch瓢a l瓢u k岷縯 qu岷� n脿o!',
+      description: 'B岷痶 膽岷 t岷 n峄檌 dung v脿 t矛m k岷縯 qu岷� 膽茫 l瓢u c峄 b岷 峄� 膽芒y.',
+      startCreateContent: 'B岷痶 膽岷 t岷 n峄檌 dung',
+    },
+    title: 'Ho脿n thi峄噉 AI',
+    queryTitle: 'N峄檌 dung truy v岷',
+    completionResult: 'K岷縯 qu岷� ho脿n thi峄噉',
+    queryPlaceholder: 'Nh岷璸 n峄檌 dung truy v岷 c峄 b岷...',
+    run: 'Th峄眂 thi',
+    copy: 'Sao ch茅p',
+    resultTitle: 'K岷縯 qu岷� AI',
+    noData: 'AI s岷� hi峄僴 th峄� k岷縯 qu岷� 峄� 膽芒y.',
+    csvUploadTitle: 'K茅o v脿 th岷� t峄噋 CSV c峄 b岷 v脿o 膽芒y, ho岷穋 ',
+    browse: 'ch峄峮 t峄噋',
+    csvStructureTitle: 'T峄噋 CSV ph岷 tu芒n th峄� c岷 tr煤c sau:',
+    downloadTemplate: 'T岷 xu峄憂g m岷玼 t岷 膽芒y',
+    field: 'Tr瓢峄漬g',
+    batchFailed: {
+      info: '{{num}} l岷 th峄眂 thi th岷 b岷',
+      retry: 'Th峄� l岷',
+      outputPlaceholder: 'Kh么ng c贸 n峄檌 dung 膽岷 ra',
+    },
+    errorMsg: {
+      empty: 'Vui l貌ng nh岷璸 n峄檌 dung v脿o t峄噋 膽茫 t岷 l锚n.',
+      fileStructNotMatch: 'C岷 tr煤c t峄噋 CSV t岷 l锚n kh么ng kh峄沺.',
+      emptyLine: 'D貌ng {{rowIndex}} tr峄憂g',
+      invalidLine: 'D貌ng {{rowIndex}}: {{varName}} kh么ng th峄� 膽峄� tr峄憂g',
+      moreThanMaxLengthLine: 'D貌ng {{rowIndex}}: {{varName}} kh么ng th峄� ch峄゛ qu谩 {{maxLength}} k媒 t峄�',
+      atLeastOne: 'Vui l貌ng nh岷璸 铆t nh岷 m峄檛 d貌ng v脿o t峄噋 膽茫 t岷 l锚n.',
+    },
+    executions: '{{num}} 脕N T峄� H脤NH',
+    execution: 'THI H脌NH',
+  },
+}
+
+export default translation
diff --git a/i18n/vi-VN/time.ts b/i18n/vi-VN/time.ts
new file mode 100644
index 0000000..9c07ece
--- /dev/null
+++ b/i18n/vi-VN/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Mon: 'M么n',
+    Sat: 'Ng峄搃',
+    Wed: 'Th峄� T瓢',
+    Sun: 'M岷穞 tr峄漣',
+    Tue: 'Th峄� Ba',
+    Fri: 'Th峄� S谩u',
+    Thu: 'Thu',
+  },
+  months: {
+    April: 'Th谩ng T瓢',
+    June: 'Th谩ng S谩u',
+    September: 'Th谩ng Ch铆n',
+    March: 'Th谩ng Ba',
+    February: 'Th谩ng Hai',
+    August: 'Th谩ng T谩m',
+    May: 'Th谩ng N膬m',
+    October: 'Th谩ng M瓢峄漣',
+    December: 'Th谩ng M瓢峄漣 Hai',
+    January: 'Th谩ng M峄檛',
+    July: 'Th谩ng B岷',
+    November: 'Th谩ng M瓢峄漣 M峄檛',
+  },
+  operation: {
+    ok: '膼瓢峄 r峄搃',
+    pickDate: 'Ch峄峮 Ng脿y',
+    now: 'B芒y gi峄�',
+    cancel: 'H峄 b峄�',
+  },
+  title: {
+    pickTime: 'Ch峄峮 Th峄漣 Gian',
+  },
+  defaultPlaceholder: 'Ch峄峮 m峄檛 th峄漣 gian...',
+}
+
+export default translation
diff --git a/i18n/vi-VN/tools.ts b/i18n/vi-VN/tools.ts
new file mode 100644
index 0000000..75331b5
--- /dev/null
+++ b/i18n/vi-VN/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: 'C么ng c峄�',
+  createCustomTool: 'T岷 c么ng c峄� t霉y ch峄塶h',
+  type: {
+    all: 'T岷 c岷�',
+    builtIn: 'T铆ch h峄 s岷祅',
+    custom: 'T霉y ch峄塶h',
+    workflow: 'Quy tr矛nh l脿m vi峄嘽',
+  },
+  contribute: {
+    line1: 'T么i quan t芒m 膽岷縩 vi峄嘽 ',
+    line2: '膽贸ng g贸p c么ng c峄� cho Dify.',
+    viewGuide: 'Xem h瓢峄沶g d岷玭',
+  },
+  author: 'T谩c gi岷�',
+  auth: {
+    unauthorized: 'Ch瓢a x谩c th峄眂',
+    authorized: '膼茫 x谩c th峄眂',
+    setup: 'Thi岷縯 l岷璸 x谩c th峄眂 膽峄� s峄� d峄g',
+    setupModalTitle: 'Thi岷縯 l岷璸 x谩c th峄眂',
+    setupModalTitleDescription: 'Sau khi c岷 h矛nh th么ng tin 膽膬ng nh岷璸, t岷 c岷� th脿nh vi锚n trong kh么ng gian l脿m vi峄嘽 c贸 th峄� s峄� d峄g c么ng c峄� n脿y khi tri峄僴 khai 峄﹏g d峄g.',
+  },
+  includeToolNum: 'Bao g峄搈 {{num}} c么ng c峄�',
+  addTool: 'Th锚m c么ng c峄�',
+  createTool: {
+    title: 'T岷 c么ng c峄� t霉y ch峄塶h',
+    editAction: 'C岷 h矛nh',
+    editTitle: 'Ch峄塶h s峄璦 c么ng c峄� t霉y ch峄塶h',
+    name: 'T锚n',
+    toolNamePlaceHolder: 'Nh岷璸 t锚n c么ng c峄�',
+    schema: 'Schema',
+    schemaPlaceHolder: 'Nh岷璸 schema OpenAPI c峄 b岷 v脿o 膽芒y',
+    viewSchemaSpec: 'Xem chi ti岷縯 OpenAPI-Swagger',
+    importFromUrl: 'Nh岷璸 t峄� URL',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: 'Vui l貌ng nh岷璸 URL h峄 l峄�',
+    examples: 'V铆 d峄�',
+    exampleOptions: {
+      json: 'Th峄漣 ti岷縯 (JSON)',
+      yaml: 'C峄璦 h脿ng th煤 c瓢ng (YAML)',
+      blankTemplate: 'M岷玼 tr峄憂g',
+    },
+    availableTools: {
+      title: 'C么ng c峄� hi峄噉 c贸',
+      name: 'T锚n',
+      description: 'M么 t岷�',
+      method: 'Ph瓢啤ng th峄ヽ',
+      path: '膼瓢峄漬g d岷玭',
+      action: 'H脿nh 膽峄檔g',
+      test: 'Ki峄僲 tra',
+    },
+    authMethod: {
+      title: 'Ph瓢啤ng th峄ヽ x谩c th峄眂',
+      type: 'Lo岷 x谩c th峄眂',
+      keyTooltip: 'Kh贸a ti锚u 膽峄� HTTP, b岷 c贸 th峄� 膽峄� tr峄憂g n岷縰 kh么ng bi岷縯 ho岷穋 膽岷穞 m峄檛 gi谩 tr峄� t霉y ch峄塶h',
+      types: {
+        none: 'Kh么ng',
+        api_key: 'Kh贸a API',
+        apiKeyPlaceholder: 'T锚n ti锚u 膽峄� HTTP cho Kh贸a API',
+        apiValuePlaceholder: 'Nh岷璸 Kh贸a API',
+      },
+      key: 'Kh贸a',
+      value: 'Gi谩 tr峄�',
+    },
+    authHeaderPrefix: {
+      title: 'Lo岷 x谩c th峄眂',
+      types: {
+        basic: 'C啤 b岷',
+        bearer: 'Bearer',
+        custom: 'T霉y ch峄塶h',
+      },
+    },
+    privacyPolicy: 'Ch铆nh s谩ch b岷 m岷璽',
+    privacyPolicyPlaceholder: 'Vui l貌ng nh岷璸 ch铆nh s谩ch b岷 m岷璽',
+    customDisclaimer: 'Tuy锚n b峄� t峄� ch峄慽 tr谩ch nhi峄噈 t霉y ch峄塶h',
+    customDisclaimerPlaceholder: 'Vui l貌ng nh岷璸 tuy锚n b峄� t峄� ch峄慽 tr谩ch nhi峄噈 t霉y ch峄塶h',
+    deleteToolConfirmTitle: 'X贸a c么ng c峄� n脿y?',
+    deleteToolConfirmContent: 'X贸a c么ng c峄� l脿 kh么ng th峄� ho脿n t谩c. Ng瓢峄漣 d霉ng s岷� kh么ng th峄� truy c岷璸 l岷 c么ng c峄� c峄 b岷.',
+    toolInput: {
+      label: 'Tags',
+      methodParameter: 'Th么ng s峄�',
+      name: 'T锚n',
+      descriptionPlaceholder: 'M么 t岷� 媒 ngh末a c峄 tham s峄�',
+      methodSetting: 'Khung c岷h',
+      title: 'C么ng c峄� nh岷璸 li峄噓',
+      methodSettingTip: 'Ng瓢峄漣 d霉ng 膽i峄乶 v脿o c岷 h矛nh c么ng c峄�',
+      required: 'B岷痶 bu峄檆',
+      method: 'Ph瓢啤ng ph谩p',
+      methodParameterTip: 'LLM l岷 膽岷 trong qu谩 tr矛nh suy lu岷璶',
+      description: 'S峄� mi锚u t岷�',
+      labelPlaceholder: 'Ch峄峮 th岷� (t霉y ch峄峮)',
+    },
+    nameForToolCallTip: 'Ch峄� h峄� tr峄� s峄�, ch峄� c谩i v脿 d岷 g岷h d瓢峄沬.',
+    nameForToolCall: 'C么ng c峄� g峄峣 t锚n',
+    nameForToolCallPlaceHolder: '膼瓢峄 s峄� d峄g 膽峄� nh岷璶 d岷g m谩y, ch岷硁g h岷 nh瓢 getCurrentWeather, list_pets',
+    descriptionPlaceholder: 'M么 t岷� ng岷痭 g峄峮 v峄� m峄 膽铆ch c峄 c么ng c峄�, v铆 d峄�: l岷 nhi峄噒 膽峄� cho m峄檛 v峄� tr铆 c峄� th峄�.',
+    description: 'S峄� mi锚u t岷�',
+    confirmTitle: 'X谩c nh岷璶 膽峄� l瓢u ?',
+    confirmTip: 'C谩c 峄﹏g d峄g s峄� d峄g c么ng c峄� n脿y s岷� b峄� 岷h h瓢峄焠g',
+  },
+  test: {
+    title: 'Ki峄僲 tra',
+    parametersValue: 'Tham s峄� & Gi谩 tr峄�',
+    parameters: 'Tham s峄�',
+    value: 'Gi谩 tr峄�',
+    testResult: 'K岷縯 qu岷� ki峄僲 tra',
+    testResultPlaceholder: 'K岷縯 qu岷� ki峄僲 tra s岷� hi峄僴 th峄� 峄� 膽芒y',
+  },
+  thought: {
+    using: '膼ang s峄� d峄g',
+    used: '膼茫 s峄� d峄g',
+    requestTitle: 'Y锚u c岷 膽岷縩',
+    responseTitle: 'Ph岷 h峄搃 t峄�',
+  },
+  setBuiltInTools: {
+    info: 'Th么ng tin',
+    setting: 'C脿i 膽岷穞',
+    toolDescription: 'M么 t岷� c么ng c峄�',
+    parameters: 'Tham s峄�',
+    string: 'chu峄梚',
+    number: 's峄�',
+    required: 'B岷痶 bu峄檆',
+    infoAndSetting: 'Th么ng tin & C脿i 膽岷穞',
+    file: 't峄噋',
+  },
+  noCustomTool: {
+    title: 'Ch瓢a c贸 c么ng c峄� t霉y ch峄塶h!',
+    content: 'Th锚m v脿 qu岷 l媒 c谩c c么ng c峄� t霉y ch峄塶h c峄 b岷 峄� 膽芒y 膽峄� x芒y d峄眓g 峄﹏g d峄g AI.',
+    createTool: 'T岷 c么ng c峄�',
+  },
+  noSearchRes: {
+    title: 'Xin l峄梚, kh么ng c贸 k岷縯 qu岷�!',
+    content: 'Ch煤ng t么i kh么ng t矛m th岷 c么ng c峄� n脿o ph霉 h峄 v峄沬 t矛m ki岷縨 c峄 b岷.',
+    reset: '膼岷穞 l岷 t矛m ki岷縨',
+  },
+  builtInPromptTitle: 'L峄漣 nh岷痗',
+  toolRemoved: 'C么ng c峄� 膽茫 b峄� x贸a',
+  notAuthorized: 'C么ng c峄� ch瓢a 膽瓢峄 x谩c th峄眂',
+  howToGet: 'C谩ch nh岷璶',
+  addToolModal: {
+    category: 'lo岷',
+    manageInTools: 'Qu岷 l媒 trong C么ng c峄�',
+    type: 'ki峄僽',
+    add: 'th锚m',
+    added: 'Th锚m',
+    emptyTip: '膼i t峄沬 "Quy tr矛nh l脿m vi峄嘽 -> Xu岷 b岷 d瓢峄沬 d岷g c么ng c峄�"',
+    emptyTitle: 'Kh么ng c贸 s岷祅 c么ng c峄� quy tr矛nh l脿m vi峄嘽',
+    emptyTitleCustom: 'Kh么ng c贸 c么ng c峄� t霉y ch峄塶h n脿o c贸 s岷祅',
+    emptyTipCustom: 'T岷 c么ng c峄� t霉y ch峄塶h',
+  },
+  toolNameUsageTip: 'T锚n cu峄檆 g峄峣 c么ng c峄� 膽峄� l媒 lu岷璶 v脿 nh岷痗 nh峄� t峄昻g 膽脿i vi锚n',
+  customToolTip: 'T矛m hi峄僽 th锚m v峄� c谩c c么ng c峄� t霉y ch峄塶h Dify',
+  openInStudio: 'M峄� trong Studio',
+  noTools: 'Kh么ng t矛m th岷 c么ng c峄�',
+  copyToolName: 'Sao ch茅p t锚n',
+}
+
+export default translation
diff --git a/i18n/vi-VN/workflow.ts b/i18n/vi-VN/workflow.ts
new file mode 100644
index 0000000..18ae720
--- /dev/null
+++ b/i18n/vi-VN/workflow.ts
@@ -0,0 +1,921 @@
+const translation = {
+  common: {
+    undo: 'Ho脿n t谩c',
+    redo: 'L脿m l岷',
+    editing: '膼ang ch峄塶h s峄璦',
+    autoSaved: '膼茫 t峄� 膽峄檔g l瓢u',
+    unpublished: 'Ch瓢a xu岷 b岷',
+    published: '膼茫 xu岷 b岷',
+    publish: 'Xu岷 b岷',
+    update: 'C岷璸 nh岷璽',
+    run: 'Ch岷',
+    running: '膼ang ch岷',
+    inRunMode: 'Ch岷� 膽峄� ch岷',
+    inPreview: 'Trong ch岷� 膽峄� xem tr瓢峄沜',
+    inPreviewMode: 'Ch岷� 膽峄� xem tr瓢峄沜',
+    preview: 'Xem tr瓢峄沜',
+    viewRunHistory: 'Xem l峄媍h s峄� ch岷',
+    runHistory: 'L峄媍h s峄� ch岷',
+    goBackToEdit: 'Quay l岷 tr矛nh ch峄塶h s峄璦',
+    conversationLog: 'Nh岷璽 k媒 cu峄檆 tr貌 chuy峄噉',
+    features: 'T铆nh n膬ng',
+    debugAndPreview: 'Xem tr瓢峄沜',
+    restart: 'Kh峄焛 膽峄檔g l岷',
+    currentDraft: 'B岷 nh谩p hi峄噉 t岷',
+    currentDraftUnpublished: 'B岷 nh谩p hi峄噉 t岷 ch瓢a xu岷 b岷',
+    latestPublished: 'Xu岷 b岷 m峄沬 nh岷',
+    publishedAt: '膼茫 xu岷 b岷 l煤c',
+    restore: 'Kh么i ph峄',
+    runApp: 'Ch岷 峄﹏g d峄g',
+    batchRunApp: 'Ch岷 峄﹏g d峄g h脿ng lo岷',
+    accessAPIReference: 'Truy c岷璸 t脿i li峄噓 API',
+    embedIntoSite: 'Nh煤ng v脿o trang web',
+    addTitle: 'Th锚m ti锚u 膽峄�...',
+    addDescription: 'Th锚m m么 t岷�...',
+    noVar: 'Kh么ng c贸 bi岷縩',
+    searchVar: 'T矛m ki岷縨 bi岷縩',
+    variableNamePlaceholder: 'T锚n bi岷縩',
+    setVarValuePlaceholder: '膼岷穞 gi谩 tr峄� bi岷縩',
+    needConnectTip: 'B瓢峄沜 n脿y kh么ng 膽瓢峄 k岷縯 n峄慽 v峄沬 b岷 k峄� 膽i峄乽 g矛',
+    maxTreeDepth: 'Gi峄沬 h岷 t峄慽 膽a {{depth}} n煤t tr锚n m峄梚 nh谩nh',
+    needEndNode: 'Ph岷 th锚m kh峄慽 K岷縯 th煤c',
+    needAnswerNode: 'Ph岷 th锚m kh峄慽 Tr岷� l峄漣',
+    workflowProcess: 'Quy tr矛nh l脿m vi峄嘽',
+    notRunning: 'Ch瓢a ch岷',
+    previewPlaceholder: 'Nh岷璸 n峄檌 dung v脿o h峄檖 b锚n d瓢峄沬 膽峄� b岷痶 膽岷 g峄� l峄梚 Chatbot',
+    effectVarConfirm: {
+      title: 'X贸a bi岷縩',
+      content: 'Bi岷縩 膽瓢峄 s峄� d峄g trong c谩c n煤t kh谩c. B岷 c贸 ch岷痗 ch岷痭 mu峄憂 x贸a n贸 kh么ng?',
+    },
+    insertVarTip: 'Nh岷 ph铆m \'/\' 膽峄� ch猫n nhanh',
+    processData: 'X峄� l媒 d峄� li峄噓',
+    input: '膼岷 v脿o',
+    output: '膼岷 ra',
+    jinjaEditorPlaceholder: 'G玫 \'/\' ho岷穋 \'{\' 膽峄� ch猫n bi岷縩',
+    viewOnly: 'Ch峄� xem',
+    showRunHistory: 'Hi峄僴 th峄� l峄媍h s峄� ch岷',
+    enableJinja: 'B岷璽 h峄� tr峄� m岷玼 Jinja',
+    learnMore: 'T矛m hi峄僽 th锚m',
+    copy: 'Sao ch茅p',
+    duplicate: 'Nh芒n b岷',
+    addBlock: 'Th锚m kh峄慽',
+    pasteHere: 'D谩n v脿o 膽芒y',
+    pointerMode: 'Ch岷� 膽峄� con tr峄�',
+    handMode: 'Ch岷� 膽峄� tay',
+    model: 'M么 h矛nh',
+    workflowAsTool: 'Quy tr矛nh l脿m vi峄嘽 nh瓢 c么ng c峄�',
+    configureRequired: 'Y锚u c岷 c岷 h矛nh',
+    configure: 'C岷 h矛nh',
+    manageInTools: 'Qu岷 l媒 trong c么ng c峄�',
+    workflowAsToolTip: 'C岷 c岷 h矛nh l岷 c么ng c峄� sau khi c岷璸 nh岷璽 quy tr矛nh l脿m vi峄嘽.',
+    viewDetailInTracingPanel: 'Xem chi ti岷縯',
+    importSuccess: 'Nh岷璸 th脿nh c么ng',
+    backupCurrentDraft: 'Sao l瓢u d峄� th岷 hi峄噉 t岷',
+    chooseDSL: 'Ch峄峮 t峄噋 DSL(yml)',
+    importDSLTip: 'D峄� th岷 hi峄噉 t岷 s岷� b峄� ghi 膽猫. Xu岷 quy tr矛nh l脿m vi峄嘽 d瓢峄沬 d岷g b岷 sao l瓢u tr瓢峄沜 khi nh岷璸.',
+    importFailure: 'Nh岷璸 kh么ng th脿nh c么ng',
+    overwriteAndImport: 'Ghi 膽猫 v脿 nh岷璸',
+    importDSL: 'Nh岷璸 DSL',
+    syncingData: '膼峄搉g b峄� h贸a d峄� li峄噓, ch峄� v脿i gi芒y.',
+    parallelTip: {
+      click: {
+        title: 'B岷',
+        desc: '膽峄� th锚m',
+      },
+      drag: {
+        title: 'K茅o',
+        desc: '膼峄� k岷縯 n峄慽',
+      },
+      limit: 'Song song 膽瓢峄 gi峄沬 h岷 trong c谩c nh谩nh {{num}}.',
+      depthLimit: 'Gi峄沬 h岷 l峄沺 l峄搉g song song c峄 {{num}} layer',
+    },
+    parallelRun: 'Ch岷 song song',
+    disconnect: 'Ng岷痶 k岷縯 n峄慽',
+    jumpToNode: 'Chuy峄僴 膽岷縩 n煤t n脿y',
+    addParallelNode: 'Th锚m n煤t song song',
+    parallel: 'SONG SONG',
+    branch: 'NH脕NH',
+    featuresDocLink: 'T矛m hi峄僽 th锚m',
+    fileUploadTip: 'C谩c t铆nh n膬ng t岷 l锚n h矛nh 岷h 膽茫 膽瓢峄 n芒ng c岷 膽峄� t岷 t峄噋 l锚n.',
+    featuresDescription: 'N芒ng cao tr岷 nghi峄噈 ng瓢峄漣 d霉ng 峄﹏g d峄g web',
+    ImageUploadLegacyTip: 'B芒y gi峄� b岷 c贸 th峄� t岷 c谩c bi岷縩 lo岷 t峄噋 trong bi峄僽 m岷玼 b岷痶 膽岷. Ch煤ng t么i s岷� kh么ng c貌n h峄� tr峄� t铆nh n膬ng t岷 l锚n h矛nh 岷h trong t瓢啤ng lai.',
+    importWarning: 'Th岷璶 tr峄峮g',
+    importWarningDetails: 'S峄� kh谩c bi峄噒 v峄� phi锚n b岷 DSL c贸 th峄� 岷h h瓢峄焠g 膽岷縩 m峄檛 s峄� t铆nh n膬ng nh岷 膽峄媙h',
+    openInExplore: 'M峄� trong Kh谩m ph谩',
+    onFailure: 'Khi th岷 b岷',
+    addFailureBranch: 'Th锚m nh谩nh Fail',
+    loadMore: 'T岷 th锚m quy tr矛nh l脿m vi峄嘽',
+    noHistory: 'Kh么ng c贸 l峄媍h s峄�',
+    versionHistory: 'L峄媍h s峄� phi锚n b岷',
+    publishUpdate: 'C岷璸 nh岷璽 xu岷 b岷',
+    exportSVG: 'Xu岷 d瓢峄沬 d岷g SVG',
+    exitVersions: 'Phi锚n b岷 tho谩t',
+    exportImage: 'Xu岷 h矛nh 岷h',
+    exportPNG: 'Xu岷 d瓢峄沬 d岷g PNG',
+    noExist: 'Kh么ng c贸 bi岷縩 nh瓢 v岷瓂',
+    exportJPEG: 'Xu岷 d瓢峄沬 d岷g JPEG',
+    referenceVar: 'Bi岷縩 tham chi岷縰',
+  },
+  env: {
+    envPanelTitle: 'Bi岷縩 M么i Tr瓢峄漬g',
+    envDescription: 'Bi岷縩 m么i tr瓢峄漬g c贸 th峄� 膽瓢峄 s峄� d峄g 膽峄� l瓢u tr峄� th么ng tin c谩 nh芒n v脿 th么ng tin x谩c th峄眂. Ch煤ng ch峄� 膽瓢峄 膽峄峜 v脿 c贸 th峄� 膽瓢峄 t谩ch kh峄廼 t峄噋 DSL trong qu谩 tr矛nh xu岷.',
+    envPanelButton: 'Th锚m Bi岷縩',
+    modal: {
+      title: 'Th锚m Bi岷縩 M么i Tr瓢峄漬g',
+      editTitle: 'S峄璦 Bi岷縩 M么i Tr瓢峄漬g',
+      type: 'Lo岷',
+      name: 'T锚n',
+      namePlaceholder: 't锚n m么i tr瓢峄漬g',
+      value: 'Gi谩 tr峄�',
+      valuePlaceholder: 'gi谩 tr峄� m么i tr瓢峄漬g',
+      secretTip: '膼瓢峄 s峄� d峄g 膽峄� x谩c 膽峄媙h th么ng tin ho岷穋 d峄� li峄噓 nh岷 c岷, v峄沬 c脿i 膽岷穞 DSL 膽瓢峄 c岷 h矛nh 膽峄� ng膬n ch岷穘 r貌 r峄�.',
+    },
+    export: {
+      title: 'Xu岷 bi岷縩 m么i tr瓢峄漬g b铆 m岷璽?',
+      checkbox: 'Xu岷 gi谩 tr峄� b铆 m岷璽',
+      ignore: 'Xu岷 DSL',
+      export: 'Xu岷 DSL v峄沬 gi谩 tr峄� b铆 m岷璽',
+    },
+  },
+  chatVariable: {
+    panelTitle: 'Bi岷縩 H峄檌 Tho岷',
+    panelDescription: 'Bi岷縩 H峄檌 Tho岷 膽瓢峄 s峄� d峄g 膽峄� l瓢u tr峄� th么ng tin t瓢啤ng t谩c m脿 LLM c岷 ghi nh峄�, bao g峄搈 l峄媍h s峄� h峄檌 tho岷, t峄噋 膽茫 t岷 l锚n, t霉y ch峄峮 ng瓢峄漣 d霉ng. Ch煤ng c贸 th峄� 膽峄峜 v脿 ghi 膽瓢峄.',
+    docLink: 'Truy c岷璸 t脿i li峄噓 c峄 ch煤ng t么i 膽峄� t矛m hi峄僽 th锚m.',
+    button: 'Th锚m Bi岷縩',
+    modal: {
+      title: 'Th锚m Bi岷縩 H峄檌 Tho岷',
+      editTitle: 'Ch峄塶h S峄璦 Bi岷縩 H峄檌 Tho岷',
+      name: 'T锚n',
+      namePlaceholder: 'T锚n bi岷縩',
+      type: 'Lo岷',
+      value: 'Gi谩 Tr峄� M岷穋 膼峄媙h',
+      valuePlaceholder: 'Gi谩 tr峄� m岷穋 膽峄媙h, 膽峄� tr峄憂g n岷縰 kh么ng 膽岷穞',
+      description: 'M么 t岷�',
+      descriptionPlaceholder: 'M么 t岷� bi岷縩',
+      editInJSON: 'Ch峄塶h s峄璦 d瓢峄沬 d岷g JSON',
+      oneByOne: 'Th锚m t峄玭g c谩i m峄檛',
+      editInForm: 'Ch峄塶h s峄璦 trong Bi峄僽 m岷玼',
+      arrayValue: 'Gi谩 tr峄�',
+      addArrayValue: 'Th锚m Gi谩 tr峄�',
+      objectKey: 'Kh贸a',
+      objectType: 'Lo岷',
+      objectValue: 'Gi谩 Tr峄� M岷穋 膼峄媙h',
+    },
+    storedContent: 'N峄檌 dung 膽茫 l瓢u',
+    updatedAt: 'C岷璸 nh岷璽 l煤c ',
+  },
+  changeHistory: {
+    title: 'L峄媍h s峄� thay 膽峄昳',
+    placeholder: 'B岷 ch瓢a thay 膽峄昳 g矛 c岷�',
+    clearHistory: 'X贸a l峄媍h s峄�',
+    hint: 'G峄 媒',
+    hintText: 'C谩c h脿nh 膽峄檔g ch峄塶h s峄璦 c峄 b岷 膽瓢峄 theo d玫i trong l峄媍h s峄� thay 膽峄昳, 膽瓢峄 l瓢u tr锚n thi岷縯 b峄� c峄 b岷 trong su峄憈 phi锚n l脿m vi峄嘽 n脿y. L峄媍h s峄� n脿y s岷� b峄� x贸a khi b岷 tho谩t kh峄廼 tr矛nh so岷 th岷.',
+    stepBackward_one: '{{count}} b瓢峄沜 l霉i',
+    stepBackward_other: '{{count}} b瓢峄沜 l霉i',
+    stepForward_one: '{{count}} b瓢峄沜 ti岷縩',
+    stepForward_other: '{{count}} b瓢峄沜 ti岷縩',
+    sessionStart: 'B岷痶 膽岷 phi锚n',
+    currentState: 'Tr岷g th谩i hi峄噉 t岷',
+    nodeTitleChange: 'Ti锚u 膽峄� kh峄慽 膽茫 thay 膽峄昳',
+    nodeDescriptionChange: 'M么 t岷� kh峄慽 膽茫 thay 膽峄昳',
+    nodeDragStop: 'Kh峄慽 膽茫 di chuy峄僴',
+    nodeChange: 'Kh峄慽 膽茫 thay 膽峄昳',
+    nodeConnect: 'Kh峄慽 膽茫 k岷縯 n峄慽',
+    nodePaste: 'Kh峄慽 膽茫 d谩n',
+    nodeDelete: 'Kh峄慽 膽茫 x贸a',
+    nodeAdd: 'Kh峄慽 膽茫 th锚m',
+    nodeResize: 'Kh峄慽 膽茫 thay 膽峄昳 k铆ch th瓢峄沜',
+    noteAdd: 'Ghi ch煤 膽茫 th锚m',
+    noteChange: 'Ghi ch煤 膽茫 thay 膽峄昳',
+    noteDelete: 'Ghi ch煤 膽茫 x贸a',
+    edgeDelete: 'Kh峄慽 膽茫 ng岷痶 k岷縯 n峄慽',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} l脿 b岷痶 bu峄檆',
+    authRequired: 'Y锚u c岷 x谩c th峄眂',
+    invalidJson: '{{field}} l脿 JSON kh么ng h峄 l峄�',
+    fields: {
+      variable: 'T锚n bi岷縩',
+      variableValue: 'Gi谩 tr峄� bi岷縩',
+      code: 'M茫',
+      model: 'M么 h矛nh',
+      rerankModel: 'M么 h矛nh x岷縫 h岷g l岷',
+      visionVariable: 'Bi岷縩 t岷 nh矛n',
+    },
+    invalidVariable: 'Bi岷縩 kh么ng h峄 l峄�',
+    rerankModelRequired: 'Tr瓢峄沜 khi b岷璽 M么 h矛nh x岷縫 h岷g l岷, vui l貌ng x谩c nh岷璶 r岷眓g m么 h矛nh 膽茫 膽瓢峄 膽峄媙h c岷 h矛nh th脿nh c么ng trong c脿i 膽岷穞.',
+    noValidTool: '{{field}} kh么ng ch峄峮 c么ng c峄� h峄 l峄� n脿o',
+    toolParameterRequired: '{{field}}: tham s峄� [{{param}}] l脿 b岷痶 bu峄檆',
+  },
+  singleRun: {
+    testRun: 'Ch岷 th峄� nghi峄噈 ',
+    startRun: 'B岷痶 膽岷 ch岷',
+    running: '膼ang ch岷',
+    testRunIteration: 'L岷穚 ch岷 th峄� nghi峄噈',
+    back: 'Quay l岷',
+    iteration: 'L岷穚',
+    loop: 'V貌ng',
+  },
+  tabs: {
+    'searchBlock': 'T矛m ki岷縨 kh峄慽',
+    'blocks': 'Kh峄慽',
+    'tools': 'C么ng c峄�',
+    'allTool': 'T岷 c岷�',
+    'builtInTool': 'T铆ch h峄 s岷祅',
+    'customTool': 'T霉y ch峄塶h',
+    'workflowTool': 'Quy tr矛nh l脿m vi峄嘽',
+    'question-understand': 'Hi峄僽 c芒u h峄廼',
+    'logic': 'Logic',
+    'transform': 'Chuy峄僴 膽峄昳',
+    'utilities': 'Ti峄噉 铆ch',
+    'noResult': 'Kh么ng t矛m th岷 k岷匡紱t qu岷� ph霉 h峄',
+    'searchTool': 'C么ng c峄� t矛m ki岷縨',
+    'agent': 'Chi岷縩 l瓢峄 膽岷 l媒',
+    'plugin': 'Plugin',
+  },
+  blocks: {
+    'start': 'B岷痶 膽岷',
+    'end': 'K岷縯 th煤c',
+    'answer': 'Tr岷� l峄漣',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'Truy xu岷 ki岷縩 th峄ヽ',
+    'question-classifier': 'Ph芒n lo岷 c芒u h峄廼',
+    'if-else': 'N岷綰/NG漂峄 L岷營',
+    'code': 'M茫',
+    'template-transform': 'M岷玼',
+    'http-request': 'Y锚u c岷 HTTP',
+    'variable-assigner': 'Tr矛nh g谩n bi岷縩',
+    'variable-aggregator': 'Tr矛nh t峄昻g h峄 bi岷縩',
+    'assigner': 'Tr矛nh g谩n bi岷縩',
+    'iteration-start': 'B岷痶 膽岷 l岷穚',
+    'iteration': 'L岷穚',
+    'parameter-extractor': 'Tr矛nh tr铆ch xu岷 tham s峄�',
+    'list-operator': 'To谩n t峄� danh s谩ch',
+    'document-extractor': 'Tr矛nh tr铆ch xu岷 t脿i li峄噓',
+    'agent': 'Ng瓢峄漣 膽岷 l媒',
+    'loop': 'V貌ng',
+    'loop-end': 'Tho谩t v貌ng l岷穚',
+    'loop-start': 'B岷痶 膽岷 v貌ng l岷穚',
+  },
+  blocksAbout: {
+    'start': '膼峄媙h ngh末a c谩c tham s峄� ban 膽岷 膽峄� kh峄焛 ch岷 quy tr矛nh l脿m vi峄嘽',
+    'end': '膼峄媙h ngh末a k岷縯 th煤c v脿 lo岷 k岷縯 qu岷� c峄 quy tr矛nh l脿m vi峄嘽',
+    'answer': '膼峄媙h ngh末a n峄檌 dung tr岷� l峄漣 c峄 cu峄檆 tr貌 chuy峄噉',
+    'llm': 'G峄峣 c谩c m么 h矛nh ng么n ng峄� l峄沶 膽峄� tr岷� l峄漣 c芒u h峄廼 ho岷穋 x峄� l媒 ng么n ng峄� t峄� nhi锚n',
+    'knowledge-retrieval': 'Cho ph茅p truy v岷 n峄檌 dung v膬n b岷 li锚n quan 膽岷縩 c芒u h峄廼 c峄 ng瓢峄漣 d霉ng t峄� c啤 s峄� ki岷縩 th峄ヽ',
+    'question-classifier': '膼峄媙h ngh末a c谩c 膽i峄乽 ki峄噉 ph芒n lo岷 c芒u h峄廼 c峄 ng瓢峄漣 d霉ng, LLM c贸 th峄� 膽峄媙h ngh末a c谩ch cu峄檆 tr貌 chuy峄噉 ti岷縩 tri峄僴 d峄盿 tr锚n m么 t岷� ph芒n lo岷',
+    'if-else': 'Cho ph茅p ph芒n chia quy tr矛nh l脿m vi峄嘽 th脿nh hai nh谩nh d峄盿 tr锚n 膽i峄乽 ki峄噉 if/else',
+    'code': 'Th峄眂 thi m峄檛 膽o岷 m茫 Python ho岷穋 NodeJS 膽峄� th峄眂 hi峄噉 logic t霉y ch峄塶h',
+    'template-transform': 'Chuy峄僴 膽峄昳 d峄� li峄噓 th脿nh chu峄梚 b岷眓g c煤 ph谩p m岷玼 Jinja',
+    'http-request': 'Cho ph茅p g峄璱 c谩c y锚u c岷 m谩y ch峄� qua giao th峄ヽ HTTP',
+    'variable-assigner': 'T峄昻g h峄 c谩c bi岷縩 t峄� nhi峄乽 nh谩nh th脿nh m峄檛 bi岷縩 duy nh岷 膽峄� c岷 h矛nh 膽峄搉g nh岷 c谩c n煤t cu峄慽.',
+    'assigner': 'N煤t g谩n bi岷縩 膽瓢峄 s峄� d峄g 膽峄� g谩n gi谩 tr峄� cho c谩c bi岷縩 c贸 th峄� ghi (nh瓢 c谩c bi岷縩 h峄檌 tho岷).',
+    'variable-aggregator': 'T峄昻g h峄 c谩c bi岷縩 t峄� nhi峄乽 nh谩nh th脿nh m峄檛 bi岷縩 duy nh岷 膽峄� c岷 h矛nh 膽峄搉g nh岷 c谩c n煤t cu峄慽.',
+    'iteration': 'Th峄眂 hi峄噉 nhi峄乽 b瓢峄沜 tr锚n m峄檛 膽峄慽 t瓢峄g danh s谩ch cho 膽岷縩 khi t岷 c岷� c谩c k岷縯 qu岷� 膽瓢峄 xu岷 ra.',
+    'parameter-extractor': 'S峄� d峄g LLM 膽峄� tr铆ch xu岷 c谩c tham s峄� c贸 c岷 tr煤c t峄� ng么n ng峄� t峄� nhi锚n 膽峄� g峄峣 c么ng c峄� ho岷穋 y锚u c岷 HTTP.',
+    'document-extractor': '膼瓢峄 s峄� d峄g 膽峄� ph芒n t铆ch c煤 ph谩p c谩c t脿i li峄噓 膽茫 t岷 l锚n th脿nh n峄檌 dung v膬n b岷 d峄� hi峄僽 b峄焛 LLM.',
+    'list-operator': '膼瓢峄 s峄� d峄g 膽峄� l峄峜 ho岷穋 s岷痯 x岷縫 n峄檌 dung m岷g.',
+    'agent': 'G峄峣 c谩c m么 h矛nh ng么n ng峄� l峄沶 膽峄� tr岷� l峄漣 c芒u h峄廼 ho岷穋 x峄� l媒 ng么n ng峄� t峄� nhi锚n',
+    'loop': 'Th峄眂 hi峄噉 m峄檛 v貌ng l岷穚 logic cho 膽岷縩 khi 膽i峄乽 ki峄噉 d峄玭g 膽瓢峄 膽谩p 峄﹏g ho岷穋 s峄� l岷 l岷穚 t峄慽 膽a 膽瓢峄 膽岷.',
+    'loop-end': 'T瓢啤ng 膽瓢啤ng v峄沬 "d峄玭g l岷". N煤t n脿y kh么ng c贸 c谩c m峄 c岷 h矛nh. Khi th芒n v貌ng l岷穚 膽岷縩 n煤t n脿y, v貌ng l岷穚 s岷� k岷縯 th煤c.',
+  },
+  operator: {
+    zoomIn: 'Ph贸ng to',
+    zoomOut: 'Thu nh峄�',
+    zoomTo50: 'Ph贸ng to 50%',
+    zoomTo100: 'Ph贸ng to 100%',
+    zoomToFit: 'Ph贸ng to v峄玜 m脿n h矛nh',
+  },
+  panel: {
+    userInputField: 'Tr瓢峄漬g 膽岷 v脿o c峄 ng瓢峄漣 d霉ng',
+    changeBlock: 'Thay 膽峄昳 kh峄慽',
+    helpLink: 'Li锚n k岷縯 tr峄� gi煤p',
+    about: 'Gi峄沬 thi峄噓',
+    createdBy: 'T岷 b峄焛 ',
+    nextStep: 'B瓢峄沜 ti岷縫 theo',
+    addNextStep: 'Th锚m kh峄慽 ti岷縫 theo trong quy tr矛nh l脿m vi峄嘽 n脿y',
+    selectNextStep: 'Ch峄峮 kh峄慽 ti岷縫 theo',
+    runThisStep: 'Ch岷 b瓢峄沜 n脿y',
+    checklist: 'Danh s谩ch ki峄僲 tra',
+    checklistTip: '膼岷 b岷 r岷眓g t岷 c岷� c谩c v岷 膽峄� 膽茫 膽瓢峄 gi岷 quy岷縯 tr瓢峄沜 khi xu岷 b岷',
+    checklistResolved: 'T岷 c岷� c谩c v岷 膽峄� 膽茫 膽瓢峄 gi岷 quy岷縯',
+    organizeBlocks: 'T峄� ch峄ヽ c谩c kh峄慽',
+    change: 'Thay 膽峄昳',
+    optional: '(t霉y ch峄峮)',
+  },
+  nodes: {
+    common: {
+      outputVars: 'Bi岷縩 膽岷 ra',
+      insertVarTip: 'Ch猫n bi岷縩',
+      memory: {
+        memory: 'B峄� nh峄�',
+        memoryTip: 'C脿i 膽岷穞 b峄� nh峄� cu峄檆 tr貌 chuy峄噉',
+        windowSize: 'K铆ch th瓢峄沜 c峄璦 s峄�',
+        conversationRoleName: 'T锚n vai tr貌 cu峄檆 tr貌 chuy峄噉',
+        user: 'Ti峄乶 t峄� ng瓢峄漣 d霉ng',
+        assistant: 'Ti峄乶 t峄� tr峄� l媒',
+      },
+      memories: {
+        title: 'B峄� nh峄�',
+        tip: 'B峄� nh峄� cu峄檆 tr貌 chuy峄噉',
+        builtIn: 'T铆ch h峄 s岷祅',
+      },
+      errorHandle: {
+        none: {
+          title: 'Kh么ng ai',
+          desc: 'N煤t s岷� ng峄玭g ch岷 n岷縰 x岷 ra ngo岷 l峄� v脿 kh么ng 膽瓢峄 x峄� l媒',
+        },
+        defaultValue: {
+          title: 'Gi谩 tr峄� m岷穋 膽峄媙h',
+          desc: 'Khi x岷 ra l峄梚, h茫y ch峄� 膽峄媙h n峄檌 dung 膽岷 ra t末nh.',
+          tip: 'N岷縰 l峄梚, s岷� tr岷� v峄� gi谩 tr峄� d瓢峄沬 膽贸.',
+          inLog: 'Ngo岷 l峄� n煤t, xu岷 theo gi谩 tr峄� m岷穋 膽峄媙h.',
+          output: 'Gi谩 tr峄� m岷穋 膽峄媙h 膽岷 ra',
+        },
+        failBranch: {
+          title: 'Chi nh谩nh th岷 b岷',
+          desc: 'Khi x岷 ra l峄梚, n贸 s岷� th峄眂 thi nh谩nh ngo岷 l峄�',
+          customize: 'Chuy峄僴 膽岷縩 canvas 膽峄� t霉y ch峄塶h logic nh谩nh th岷 b岷.',
+          customizeTip: 'Khi nh谩nh fail 膽瓢峄 k铆ch ho岷, c谩c ngo岷 l峄� do c谩c n煤t n茅m s岷� kh么ng ch岷 d峄﹖ qu谩 tr矛nh. Thay v脿o 膽贸, n贸 s岷� t峄� 膽峄檔g th峄眂 thi nh谩nh l峄梚 膽瓢峄 x谩c 膽峄媙h tr瓢峄沜, cho ph茅p b岷 linh ho岷 cung c岷 th么ng b谩o l峄梚, b谩o c谩o, b岷 s峄璦 l峄梚 ho岷穋 b峄� qua c谩c h脿nh 膽峄檔g.',
+          inLog: 'Node exception, s岷� t峄� 膽峄檔g th峄眂 thi nh谩nh fail. 膼岷 ra n煤t s岷� tr岷� v峄� lo岷 l峄梚 v脿 th么ng b谩o l峄梚 v脿 chuy峄僴 ch煤ng 膽岷縩 h岷� l瓢u.',
+        },
+        partialSucceeded: {
+          tip: 'C贸 {{num}} node trong qu谩 tr矛nh ch岷 b岷 th瓢峄漬g, vui l貌ng truy t矛m 膽峄� ki峄僲 tra nh岷璽 k媒.',
+        },
+        tip: 'Chi岷縩 l瓢峄 x峄� l媒 ngo岷 l峄�, 膽瓢峄 k铆ch ho岷 khi m峄檛 n煤t g岷穚 ph岷 ngo岷 l峄�.',
+        title: 'X峄� l媒 l峄梚',
+      },
+      retry: {
+        retry: 'Th峄� l岷',
+        maxRetries: 'S峄� l岷 th峄� l岷 t峄慽 膽a',
+        retryInterval: 'Kho岷g th峄漣 gian th峄� l岷',
+        retryTimes: 'Th峄� l岷 {{l岷}} l岷 khi kh么ng th脿nh c么ng',
+        retrying: 'Th峄� l岷...',
+        retrySuccessful: 'Th峄� l岷 th脿nh c么ng',
+        retryFailed: 'Th峄� l岷 kh么ng th脿nh c么ng',
+        retryFailedTimes: '{{l岷}} l岷 th峄� l岷 kh么ng th脿nh c么ng',
+        retries: '{{s峄憓} Th峄� l岷',
+        retryOnFailure: 'Th峄� l岷 khi kh么ng th脿nh c么ng',
+        times: 'l岷',
+        ms: 'Ms',
+      },
+    },
+    start: {
+      required: 'b岷痶 bu峄檆',
+      inputField: 'Tr瓢峄漬g 膽岷 v脿o',
+      builtInVar: 'Bi岷縩 t铆ch h峄 s岷祅',
+      outputVars: {
+        query: '膼岷 v脿o c峄 ng瓢峄漣 d霉ng',
+        memories: {
+          des: 'L峄媍h s峄� cu峄檆 tr貌 chuy峄噉',
+          type: 'lo岷 tin nh岷痭',
+          content: 'n峄檌 dung tin nh岷痭',
+        },
+        files: 'Danh s谩ch t峄噋',
+      },
+      noVarTip: '膼岷穞 c谩c 膽岷 v脿o c贸 th峄� s峄� d峄g trong Quy tr矛nh l脿m vi峄嘽',
+    },
+    end: {
+      outputs: '膼岷 ra',
+      output: {
+        type: 'lo岷 膽岷 ra',
+        variable: 'bi岷縩 膽岷 ra',
+      },
+      type: {
+        'none': 'Kh么ng c贸',
+        'plain-text': 'V膬n b岷 thu岷',
+        'structured': 'C岷 tr煤c',
+      },
+    },
+    answer: {
+      answer: 'Tr岷� l峄漣',
+      outputVars: 'Bi岷縩 膽岷 ra',
+    },
+    llm: {
+      model: 'm么 h矛nh',
+      variables: 'bi岷縩',
+      context: 'ng峄� c岷h',
+      contextTooltip: 'B岷 c贸 th峄� nh岷璸 Ki岷縩 th峄ヽ l脿m ng峄� c岷h',
+      notSetContextInPromptTip: '膼峄� k铆ch ho岷 t铆nh n膬ng ng峄� c岷h, vui l貌ng 膽i峄乶 bi岷縩 ng峄� c岷h v脿o PROMPT.',
+      prompt: 'prompt',
+      roleDescription: {
+        system: 'Cung c岷 h瓢峄沶g d岷玭 c岷 cao cho cu峄檆 tr貌 chuy峄噉',
+        user: 'Cung c岷 h瓢峄沶g d岷玭, c芒u h峄廼 ho岷穋 b岷 k峄� 膽岷 v脿o v膬n b岷 n脿o cho m么 h矛nh',
+        assistant: 'C谩c ph岷 h峄搃 c峄 m么 h矛nh d峄盿 tr锚n tin nh岷痭 c峄 ng瓢峄漣 d霉ng',
+      },
+      addMessage: 'Th锚m tin nh岷痭',
+      vision: 't岷 nh矛n',
+      files: 'T峄噋',
+      resolution: {
+        name: '膼峄� ph芒n gi岷',
+        high: 'Cao',
+        low: 'Th岷',
+      },
+      outputVars: {
+        output: 'N峄檌 dung 膽瓢峄 t岷',
+        usage: 'Th么ng tin s峄� d峄g m么 h矛nh',
+      },
+      singleRun: {
+        variable: 'Bi岷縩',
+      },
+      sysQueryInUser: 'sys.query trong tin nh岷痭 c峄 ng瓢峄漣 d霉ng l脿 b岷痶 bu峄檆',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: 'Vui l貌ng ho脿n th脿nh vi峄嘽 ch峄塶h s峄璦 tr瓢峄漬g hi峄噉 t岷 tr瓢峄沜 khi l瓢u s啤 膽峄�.',
+        },
+        promptTooltip: 'Chuy峄僴 m么 t岷� v膬n b岷 th脿nh c岷 tr煤c JSON Schema chu岷﹏.',
+        stringValidations: 'X谩c th峄眂 chu峄梚',
+        instruction: 'H瓢峄沶g d岷玭',
+        regenerate: 'T谩i t岷',
+        fieldNamePlaceholder: 'T锚n tr瓢峄漬g',
+        generateJsonSchema: 'T岷 Schema JSON',
+        back: 'Quay l岷',
+        import: 'Nh岷璸 kh岷﹗ t峄� JSON',
+        generationTip: 'B岷 c贸 th峄� s峄� d峄g ng么n ng峄� t峄� nhi锚n 膽峄� t岷 nhanh m峄檛 JSON Schema.',
+        doc: 'T矛m hi峄僽 th锚m v峄� 膽岷 ra c贸 c岷 tr煤c',
+        required: 'c岷 thi岷縯',
+        generate: 'T岷 ra',
+        addField: 'Th锚m tr瓢峄漬g',
+        resultTip: '膼芒y l脿 k岷縯 qu岷� 膽茫 膽瓢峄 t岷 ra. N岷縰 b岷 kh么ng h脿i l貌ng, b岷 c贸 th峄� quay l岷 v脿 ch峄塶h s峄璦 y锚u c岷 c峄 m矛nh.',
+        generating: 'T岷 s啤 膽峄� JSON...',
+        descriptionPlaceholder: 'Th锚m m么 t岷�',
+        resetDefaults: '膼岷穞 l岷',
+        promptPlaceholder: 'M么 t岷� S啤 膽峄� JSON c峄 b岷...',
+        showAdvancedOptions: 'Hi峄僴 th峄� t霉y ch峄峮 n芒ng cao',
+        generatedResult: 'K岷縯 qu岷� 膽瓢峄 t岷 ra',
+        apply: '脕p d峄g',
+        addChildField: 'Th锚m tr瓢峄漬g tr岷� em',
+        title: 'S啤 膽峄� 膽岷 ra c贸 c岷 tr煤c',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'Bi岷縩 truy v岷',
+      knowledge: 'Ki岷縩 th峄ヽ',
+      outputVars: {
+        output: 'D峄� li峄噓 ph芒n 膽o岷 膽瓢峄 truy xu岷',
+        content: 'N峄檌 dung ph芒n 膽o岷',
+        title: 'Ti锚u 膽峄� ph芒n 膽o岷',
+        icon: 'Bi峄僽 t瓢峄g ph芒n 膽o岷',
+        url: 'URL ph芒n 膽o岷',
+        metadata: 'Si锚u d峄� li峄噓 kh谩c',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            subTitle: 'Kh么ng b岷璽 l峄峜 si锚u d峄� li峄噓',
+            title: 'T岷痶',
+          },
+          automatic: {
+            desc: 'T峄� 膽峄檔g t岷 膽i峄乽 ki峄噉 l峄峜 si锚u d峄� li峄噓 d峄盿 tr锚n bi岷縩 truy v岷',
+            title: 'T峄� 膽峄檔g',
+            subTitle: 'T峄� 膽峄檔g t岷 膽i峄乽 ki峄噉 l峄峜 si锚u d峄� li峄噓 d峄盿 tr锚n truy v岷 c峄 ng瓢峄漣 d霉ng',
+          },
+          manual: {
+            title: 'H瓢峄沶g d岷玭',
+            subTitle: 'Th锚m th峄� c么ng c谩c 膽i峄乽 ki峄噉 l峄峜 si锚u d峄� li峄噓',
+          },
+        },
+        panel: {
+          add: 'Th锚m 膽i峄乽 ki峄噉',
+          conditions: '膼i峄乽 ki峄噉',
+          title: '膼i峄乽 ki峄噉 l峄峜 si锚u d峄� li峄噓',
+          select: 'Ch峄峮 bi岷縩...',
+          datePlaceholder: 'Ch峄峮 m峄檛 th峄漣 gian...',
+          placeholder: 'Nh岷璸 gi谩 tr峄�',
+          search: 'T矛m ki岷縨 si锚u d峄� li峄噓',
+        },
+        title: 'L峄峜 si锚u d峄� li峄噓',
+      },
+    },
+    http: {
+      inputVars: 'Bi岷縩 膽岷 v脿o',
+      api: 'API',
+      apiPlaceholder: 'Nh岷璸 URL, g玫 鈥�/鈥� 膽峄� ch猫n bi岷縩',
+      notStartWithHttp: 'API ph岷 b岷痶 膽岷 b岷眓g http:// ho岷穋 https://',
+      key: 'Kh贸a',
+      value: 'Gi谩 tr峄�',
+      bulkEdit: 'Ch峄塶h s峄璦 h脿ng lo岷',
+      keyValueEdit: 'Ch峄塶h s峄璦 kh贸a-gi谩 tr峄�',
+      headers: 'Ti锚u 膽峄�',
+      params: 'Tham s峄�',
+      body: 'N峄檌 dung',
+      outputVars: {
+        body: 'N峄檌 dung ph岷 h峄搃',
+        statusCode: 'M茫 tr岷g th谩i ph岷 h峄搃',
+        headers: 'Danh s谩ch ti锚u 膽峄� ph岷 h峄搃 JSON',
+        files: 'Danh s谩ch t峄噋',
+      },
+      authorization: {
+        'authorization': '峄 quy峄乶',
+        'authorizationType': 'Lo岷 峄 quy峄乶',
+        'no-auth': 'Kh么ng c贸',
+        'api-key': 'Kh贸a API',
+        'auth-type': 'Lo岷 x谩c th峄眂',
+        'basic': 'C啤 b岷',
+        'bearer': 'Bearer',
+        'custom': 'T霉y ch峄塶h',
+        'api-key-title': 'Kh贸a API',
+        'header': 'Ti锚u 膽峄�',
+      },
+      insertVarPlaceholder: 'g玫 \'/\' 膽峄� ch猫n bi岷縩',
+      timeout: {
+        title: 'Th峄漣 gian ch峄�',
+        connectLabel: 'Th峄漣 gian ch峄� k岷縯 n峄慽',
+        connectPlaceholder: 'Nh岷璸 th峄漣 gian ch峄� k岷縯 n峄慽 t铆nh b岷眓g gi芒y',
+        readLabel: 'Th峄漣 gian ch峄� 膽峄峜',
+        readPlaceholder: 'Nh岷璸 th峄漣 gian ch峄� 膽峄峜 t铆nh b岷眓g gi芒y',
+        writeLabel: 'Th峄漣 gian ch峄� ghi',
+        writePlaceholder: 'Nh岷璸 th峄漣 gian ch峄� ghi t铆nh b岷眓g gi芒y',
+      },
+      binaryFileVariable: 'Bi岷縩 t峄噋 nh峄� ph芒n',
+      type: 'Ki峄僽',
+      extractListPlaceholder: 'Nh岷璸 ch峄� m峄 m峄 danh s谩ch, nh岷璸 \'/\' ch猫n bi岷縩',
+      curl: {
+        title: 'Nh岷璸 t峄� cURL',
+        placeholder: 'D谩n chu峄梚 cURL v脿o 膽芒y',
+      },
+    },
+    code: {
+      inputVars: 'Bi岷縩 膽岷 v脿o',
+      outputVars: 'Bi岷縩 膽岷 ra',
+      advancedDependencies: 'Ph峄� thu峄檆 n芒ng cao',
+      advancedDependenciesTip: 'Th锚m m峄檛 s峄� ph峄� thu峄檆 膽瓢峄 t岷 tr瓢峄沜 m脿 t峄憂 nhi峄乽 th峄漣 gian ho岷穋 kh么ng ph岷 l脿 m岷穋 膽峄媙h t岷 膽芒y',
+      searchDependencies: 'T矛m ki岷縨 ph峄� thu峄檆',
+    },
+    templateTransform: {
+      inputVars: 'Bi岷縩 膽岷 v脿o',
+      code: 'M茫',
+      codeSupportTip: 'Ch峄� h峄� tr峄� Jinja2',
+      outputVars: {
+        output: 'N峄檌 dung chuy峄僴 膽峄昳',
+      },
+    },
+    ifElse: {
+      if: 'N岷縰',
+      else: 'Ng瓢峄 l岷',
+      elseDescription: 'S峄� d峄g 膽峄� x谩c 膽峄媙h logic s岷� th峄眂 hi峄噉 khi 膽i峄乽 ki峄噉 if kh么ng 膽瓢峄 th峄廰 m茫n.',
+      and: 'v脿',
+      or: 'ho岷穋',
+      operator: 'To谩n t峄�',
+      notSetVariable: 'Vui l貌ng 膽岷穞 bi岷縩 tr瓢峄沜',
+      comparisonOperator: {
+        'contains': 'ch峄゛',
+        'not contains': 'kh么ng ch峄゛',
+        'start with': 'b岷痶 膽岷 b岷眓g',
+        'end with': 'k岷縯 th煤c b岷眓g',
+        'is': 'l脿',
+        'is not': 'kh么ng l脿',
+        'empty': 'tr峄憂g',
+        'not empty': 'kh么ng tr峄憂g',
+        'null': 'l脿 null',
+        'not null': 'kh么ng l脿 null',
+        'regex match': 'Tr岷璶 膽岷 Regex',
+        'exists': 'T峄搉 t岷',
+        'not exists': 'kh么ng t峄搉 t岷',
+        'not in': 'kh么ng c贸 trong',
+        'in': 'trong',
+        'all of': 't岷 c岷�',
+        'before': 'tr瓢峄沜',
+        'after': 'sau',
+      },
+      enterValue: 'Nh岷璸 gi谩 tr峄�',
+      addCondition: 'Th锚m 膽i峄乽 ki峄噉',
+      conditionNotSetup: '膼i峄乽 ki峄噉 ch瓢a 膽瓢峄 thi岷縯 l岷璸',
+      selectVariable: 'Ch峄峮 bi岷縩...',
+      optionName: {
+        video: 'Video',
+        image: '岷h',
+        url: '膼峄媋 ch峄�',
+        audio: '脗m thanh',
+        doc: 'Doc',
+        localUpload: 'T岷 l锚n c峄 b峄�',
+      },
+      addSubVariable: 'Bi岷縩 ph峄�',
+      select: 'L峄盿',
+      condition: '膼i峄乽 ki峄噉',
+    },
+    variableAssigner: {
+      title: 'G谩n bi岷縩',
+      outputType: 'Lo岷 膽岷 ra',
+      varNotSet: 'Bi岷縩 ch瓢a 膽瓢峄 膽岷穞',
+      noVarTip: 'Th锚m c谩c bi岷縩 c岷 g谩n',
+      type: {
+        string: 'Chu峄梚',
+        number: 'S峄�',
+        object: '膼峄慽 t瓢峄g',
+        array: 'M岷g',
+      },
+      aggregationGroup: 'Nh贸m t峄昻g h峄',
+      aggregationGroupTip: 'B岷璽 t铆nh n膬ng n脿y cho ph茅p tr矛nh t峄昻g h峄 bi岷縩 t峄昻g h峄 nhi峄乽 b峄� bi岷縩.',
+      addGroup: 'Th锚m nh贸m',
+      outputVars: {
+        varDescribe: '膼岷 ra {{groupName}}',
+      },
+      setAssignVariable: '膼岷穞 bi岷縩 g谩n',
+    },
+    assigner: {
+      'assignedVariable': 'Bi岷縩 膼瓢峄 G谩n',
+      'writeMode': 'Ch岷� 膼峄� Ghi',
+      'writeModeTip': 'Khi BI岷綨 膼漂峄 G脕N l脿 m峄檛 m岷g, ch岷� 膽峄� th锚m s岷� th锚m v脿o cu峄慽.',
+      'over-write': 'Ghi 膽猫',
+      'append': 'Th锚m v脿o',
+      'plus': 'C峄檔g',
+      'clear': 'X贸a',
+      'setVariable': '膼岷穞 Bi岷縩',
+      'variable': 'Bi岷縩',
+      'operations': {
+        '-=': '-=',
+        'over-write': 'Ghi 膽猫 l锚n',
+        'clear': 'Trong',
+        'append': 'Th锚m',
+        'title': 'Ho岷 膽峄檔g',
+        '*=': '*=',
+        '/=': '/=',
+        'extend': 'M峄� r峄檔g',
+        '+=': '+=',
+        'set': 'C脿i',
+        'overwrite': 'Ghi 膽猫 l锚n',
+        'remove-last': 'X贸a L岷 Cu峄慽',
+        'remove-first': 'X贸a 膽岷 ti锚n',
+      },
+      'setParameter': '膼岷穞 tham s峄�...',
+      'selectAssignedVariable': 'Ch峄峮 bi岷縩 膽瓢峄 g谩n...',
+      'noVarTip': 'Nh岷 v脿o n煤t "+" 膽峄� th锚m bi岷縩',
+      'assignedVarsDescription': 'C谩c bi岷縩 膽瓢峄 g谩n ph岷 l脿 c谩c bi岷縩 c贸 th峄� ghi, ch岷硁g h岷 nh瓢 c谩c bi岷縩 h峄檌 tho岷.',
+      'varNotSet': 'Bi岷縩 KH脭NG 膽瓢峄 膽岷穞',
+      'noAssignedVars': 'Kh么ng c贸 bi岷縩 膽瓢峄 g谩n s岷祅 c贸',
+      'variables': 'Bi岷縩',
+    },
+    tool: {
+      toAuthorize: '峄 quy峄乶',
+      inputVars: 'Bi岷縩 膽岷 v脿o',
+      outputVars: {
+        text: 'n峄檌 dung do c么ng c峄� t岷 ra',
+        files: {
+          title: 't峄噋 do c么ng c峄� t岷 ra',
+          type: 'Lo岷 h峄� tr峄�. Hi峄噉 t岷 ch峄� h峄� tr峄� h矛nh 岷h',
+          transfer_method: 'Ph瓢啤ng ph谩p truy峄乶. Gi谩 tr峄� l脿 remote_url ho岷穋 local_file',
+          url: 'URL h矛nh 岷h',
+          upload_file_id: 'ID t峄噋 膽茫 t岷 l锚n',
+        },
+        json: 'JSON 膽瓢峄 t岷 b峄焛 c么ng c峄�',
+      },
+    },
+    questionClassifiers: {
+      model: 'm么 h矛nh',
+      inputVars: 'Bi岷縩 膽岷 v脿o',
+      outputVars: {
+        className: 'T锚n l峄沺',
+      },
+      class: 'L峄沺',
+      classNamePlaceholder: 'Vi岷縯 t锚n l峄沺 c峄 b岷',
+      advancedSetting: 'C脿i 膽岷穞 n芒ng cao',
+      topicName: 'T锚n ch峄� 膽峄�',
+      topicPlaceholder: 'Vi岷縯 t锚n ch峄� 膽峄� c峄 b岷',
+      addClass: 'Th锚m l峄沺',
+      instruction: 'H瓢峄沶g d岷玭',
+      instructionTip: 'Nh岷璸 h瓢峄沶g d岷玭 b峄� sung 膽峄� gi煤p tr矛nh ph芒n lo岷 c芒u h峄廼 hi峄僽 r玫 h啤n v峄� c谩ch ph芒n lo岷 c芒u h峄廼.',
+      instructionPlaceholder: 'Vi岷縯 h瓢峄沶g d岷玭 c峄 b岷',
+    },
+    parameterExtractor: {
+      inputVar: 'Bi岷縩 膽岷 v脿o',
+      extractParameters: 'Tr铆ch xu岷 tham s峄�',
+      importFromTool: 'Nh岷璸 t峄� c么ng c峄�',
+      addExtractParameter: 'Th锚m tham s峄� tr铆ch xu岷',
+      addExtractParameterContent: {
+        name: 'T锚n',
+        namePlaceholder: 'T锚n tham s峄� tr铆ch xu岷',
+        type: 'Lo岷',
+        typePlaceholder: 'Lo岷 tham s峄� tr铆ch xu岷',
+        description: 'M么 t岷�',
+        descriptionPlaceholder: 'M么 t岷� tham s峄� tr铆ch xu岷',
+        required: 'B岷痶 bu峄檆',
+        requiredContent: 'B岷痶 bu峄檆 ch峄� 膽瓢峄 s峄� d峄g l脿m t脿i li峄噓 tham kh岷 cho suy lu岷璶 m么 h矛nh v脿 kh么ng ph岷 膽峄� x谩c th峄眂 b岷痶 bu峄檆 c峄 膽岷 ra tham s峄�.',
+      },
+      extractParametersNotSet: 'Tham s峄� tr铆ch xu岷 ch瓢a 膽瓢峄 thi岷縯 l岷璸',
+      instruction: 'H瓢峄沶g d岷玭',
+      instructionTip: 'Nh岷璸 h瓢峄沶g d岷玭 b峄� sung 膽峄� gi煤p tr矛nh tr铆ch xu岷 tham s峄� hi峄僽 r玫 h啤n v峄� c谩ch tr铆ch xu岷 tham s峄�.',
+      advancedSetting: 'C脿i 膽岷穞 n芒ng cao',
+      reasoningMode: 'Ch岷� 膽峄� suy lu岷璶',
+      reasoningModeTip: 'B岷 c贸 th峄� ch峄峮 ch岷� 膽峄� suy lu岷璶 ph霉 h峄 d峄盿 tr锚n kh岷� n膬ng c峄 m么 h矛nh 膽峄� ph岷 h峄搃 c谩c h瓢峄沶g d岷玭 v峄� vi峄嘽 g峄峣 h脿m ho岷穋 prompt.',
+      isSuccess: 'Th脿nh c么ng. Khi th脿nh c么ng gi谩 tr峄� l脿 1, khi th岷 b岷 gi谩 tr峄� l脿 0.',
+      errorReason: 'L媒 do l峄梚',
+    },
+    iteration: {
+      deleteTitle: 'X贸a n煤t l岷穚?',
+      deleteDesc: 'X贸a n煤t l岷穚 s岷� x贸a t岷 c岷� c谩c n煤t con',
+      input: '膼岷 v脿o',
+      output: 'Bi岷縩 膽岷 ra',
+      iteration_one: '{{count}} L岷穚',
+      iteration_other: '{{count}} L岷穚',
+      currentIteration: 'L岷穚 hi峄噉 t岷',
+      ErrorMethod: {
+        operationTerminated: 'Ch岷 d峄﹖',
+        removeAbnormalOutput: 'lo岷 b峄�-b岷 th瓢峄漬g-膽岷 ra',
+        continueOnError: 'Ti岷縫 t峄 l峄梚',
+      },
+      comma: ',',
+      error_other: '{{膽岷縨}} L峄梚',
+      error_one: '{{膽岷縨}} L峄梚',
+      MaxParallelismTitle: 'Song song t峄慽 膽a',
+      parallelPanelDesc: '峄� ch岷� 膽峄� song song, c谩c t谩c v峄� trong qu谩 tr矛nh l岷穚 h峄� tr峄� th峄眂 thi song song.',
+      parallelMode: 'Ch岷� 膽峄� song song',
+      parallelModeEnableTitle: '膼茫 b岷璽 Ch岷� 膽峄� song song',
+      errorResponseMethod: 'Ph瓢啤ng ph谩p ph岷 h峄搃 l峄梚',
+      MaxParallelismDesc: 'T铆nh song song t峄慽 膽a 膽瓢峄 s峄� d峄g 膽峄� ki峄僲 so谩t s峄� l瓢峄g t谩c v峄� 膽瓢峄 th峄眂 hi峄噉 膽峄搉g th峄漣 trong m峄檛 l岷 l岷穚.',
+      answerNodeWarningDesc: 'C岷h b谩o ch岷� 膽峄� song song: C谩c n煤t tr岷� l峄漣, b脿i t岷璸 bi岷縩 h峄檌 tho岷 v脿 c谩c thao t谩c 膽峄峜/ghi li锚n t峄 trong c谩c l岷 l岷穚 c贸 th峄� g芒y ra ngo岷 l峄�.',
+      parallelModeEnableDesc: 'Trong ch岷� 膽峄� song song, c谩c t谩c v峄� trong c谩c l岷 l岷穚 h峄� tr峄� th峄眂 thi song song. B岷 c贸 th峄� 膽峄媙h c岷 h矛nh 膽i峄乽 n脿y trong b岷g thu峄檆 t铆nh 峄� b锚n ph岷.',
+      parallelModeUpper: 'CH岷� 膼峄� SONG SONG',
+    },
+    note: {
+      editor: {
+        openLink: 'M峄�',
+        italic: 'Nghi锚ng',
+        link: 'Li锚n k岷縯',
+        medium: '膼au v峄玜',
+        small: 'Nh峄�',
+        placeholder: 'Vi岷縯 ghi ch煤 c峄 b岷...',
+        large: 'L峄沶',
+        showAuthor: 'Hi峄僴 th峄� t谩c gi岷�',
+        bulletList: 'Danh s谩ch d岷 膽岷 d貌ng',
+        bold: 'D农ng c岷',
+        unlink: 'H峄 li锚n k岷縯',
+        invalidUrl: 'URL kh么ng h峄 l峄�',
+        strikethrough: 'G岷h ngang',
+        enterUrl: 'Nh岷璸 URL...',
+      },
+      addNote: 'Th锚m ghi ch煤',
+    },
+    docExtractor: {
+      outputVars: {
+        text: 'V膬n b岷 tr铆ch xu岷',
+      },
+      learnMore: 'T矛m hi峄僽 th锚m',
+      inputVar: 'Bi岷縩 膽岷 v脿o',
+      supportFileTypes: 'C谩c lo岷 t峄噋 h峄� tr峄�: {{types}}.',
+    },
+    listFilter: {
+      outputVars: {
+        last_record: 'K峄� l峄 cu峄慽 c霉ng',
+        first_record: 'K峄� l峄 膽岷 ti锚n',
+        result: 'L峄峜 k岷縯 qu岷�',
+      },
+      orderBy: '膼岷穞 h脿ng theo',
+      selectVariableKeyPlaceholder: 'Ch峄峮 kh贸a bi岷縩 ph峄�',
+      inputVar: 'Bi岷縩 膽岷 v脿o',
+      desc: 'DESC',
+      filterConditionKey: 'Kh贸a 膽i峄乽 ki峄噉 b峄� l峄峜',
+      filterConditionComparisonValue: 'Gi谩 tr峄� 膼i峄乽 ki峄噉 l峄峜',
+      limit: 'Top N',
+      filterCondition: '膼i峄乽 ki峄噉 l峄峜',
+      asc: 'ASC',
+      filterConditionComparisonOperator: 'To谩n t峄� so s谩nh 膽i峄乽 ki峄噉 b峄� l峄峜',
+      extractsCondition: 'Gi岷 n茅n m峄 N',
+    },
+    agent: {
+      strategy: {
+        selectTip: 'Ch峄峮 chi岷縩 l瓢峄 t谩c nh芒n',
+        searchPlaceholder: 'Chi岷縩 l瓢峄 t谩c nh芒n t矛m ki岷縨',
+        shortLabel: 'Chi岷縩 l瓢峄',
+        configureTipDesc: 'Sau khi c岷 h矛nh chi岷縩 l瓢峄 t谩c nh芒n, n煤t n脿y s岷� t峄� 膽峄檔g t岷 c谩c c岷 h矛nh c貌n l岷. Chi岷縩 l瓢峄 s岷� 岷h h瓢峄焠g 膽岷縩 c啤 ch岷� suy lu岷璶 c么ng c峄� nhi峄乽 b瓢峄沜.',
+        tooltip: 'C谩c chi岷縩 l瓢峄 Agentic kh谩c nhau x谩c 膽峄媙h c谩ch h峄� th峄憂g l岷璸 k岷� ho岷h v脿 th峄眂 hi峄噉 c谩c cu峄檆 g峄峣 c么ng c峄� nhi峄乽 b瓢峄沜',
+        label: 'Chi岷縩 l瓢峄 膽岷 l媒',
+        configureTip: 'Vui l貌ng 膽峄媙h c岷 h矛nh chi岷縩 l瓢峄 t谩c nh芒n.',
+      },
+      pluginInstaller: {
+        install: 'C脿i 膽岷穞',
+        installing: 'C脿i 膽岷穞',
+      },
+      modelNotInMarketplace: {
+        title: 'M么 h矛nh ch瓢a 膽瓢峄 c脿i 膽岷穞',
+        manageInPlugins: 'Qu岷 l媒 trong Plugins',
+        desc: 'M么 h矛nh n脿y 膽瓢峄 c脿i 膽岷穞 t峄� kho l瓢u tr峄� c峄 b峄� ho岷穋 GitHub. Vui l貌ng s峄� d峄g sau khi c脿i 膽岷穞.',
+      },
+      modelNotSupport: {
+        desc: 'Phi锚n b岷 plugin 膽茫 c脿i 膽岷穞 kh么ng cung c岷 m么 h矛nh n脿y.',
+        title: 'M么 h矛nh kh么ng 膽瓢峄 h峄� tr峄�',
+        descForVersionSwitch: 'Phi锚n b岷 plugin 膽茫 c脿i 膽岷穞 kh么ng cung c岷 m么 h矛nh n脿y. Nh岷 膽峄� chuy峄僴 膽峄昳 phi锚n b岷.',
+      },
+      modelSelectorTooltips: {
+        deprecated: 'M么 h矛nh n脿y kh么ng c貌n 膽瓢峄 d霉ng n峄痑',
+      },
+      outputVars: {
+        files: {
+          title: 'T峄噋 do t谩c nh芒n t岷',
+          transfer_method: 'Ph瓢啤ng th峄ヽ chuy峄僴 kho岷. Gi谩 tr峄� l脿 remote_url ho岷穋 local_file',
+          upload_file_id: 'T岷 l锚n id t峄噋',
+          type: 'Lo岷 h峄� tr峄�. B芒y gi峄� ch峄� h峄� tr峄� h矛nh 岷h',
+          url: 'URL h矛nh 岷h',
+        },
+        json: 'JSON do t谩c nh芒n t岷',
+        text: 'N峄檌 dung do t谩c nh芒n t岷',
+      },
+      checkList: {
+        strategyNotSelected: 'Chi岷縩 l瓢峄 kh么ng 膽瓢峄 ch峄峮',
+      },
+      installPlugin: {
+        install: 'C脿i 膽岷穞',
+        cancel: 'H峄',
+        title: 'C脿i 膽岷穞 Plugin',
+        desc: 'Gi峄沬 thi峄噓 c脿i 膽岷穞 plugin sau',
+        changelog: 'Nh岷璽 k媒 thay 膽峄昳',
+      },
+      toolNotAuthorizedTooltip: '{{c么ng c峄} Kh么ng 膽瓢峄 峄 quy峄乶',
+      unsupportedStrategy: 'Chi岷縩 l瓢峄 kh么ng 膽瓢峄 h峄� tr峄�',
+      toolNotInstallTooltip: '{{tool}} kh么ng 膽瓢峄 c脿i 膽岷穞',
+      strategyNotFoundDescAndSwitchVersion: 'Phi锚n b岷 plugin 膽茫 c脿i 膽岷穞 kh么ng cung c岷 chi岷縩 l瓢峄 n脿y. Nh岷 膽峄� chuy峄僴 膽峄昳 phi锚n b岷.',
+      strategyNotInstallTooltip: '{{strategy}} kh么ng 膽瓢峄 c脿i 膽岷穞',
+      modelNotInstallTooltip: 'M么 h矛nh n脿y kh么ng 膽瓢峄 c脿i 膽岷穞',
+      strategyNotSet: 'Chi岷縩 l瓢峄 t谩c nh芒n kh么ng 膽瓢峄 thi岷縯 l岷璸',
+      linkToPlugin: 'Li锚n k岷縯 膽岷縩 Plugins',
+      configureModel: '膼峄媙h c岷 h矛nh m么 h矛nh',
+      pluginNotInstalledDesc: 'Plugin n脿y 膽瓢峄 c脿i 膽岷穞 t峄� GitHub. Vui l貌ng v脿o Plugins 膽峄� c脿i 膽岷穞 l岷',
+      modelNotSelected: 'M么 h矛nh kh么ng 膽瓢峄 ch峄峮',
+      learnMore: 'T矛m hi峄僽 th锚m',
+      pluginNotInstalled: 'Plugin n脿y ch瓢a 膽瓢峄 c脿i 膽岷穞',
+      model: 'm岷玼',
+      pluginNotFoundDesc: 'Plugin n脿y 膽瓢峄 c脿i 膽岷穞 t峄� GitHub. Vui l貌ng v脿o Plugins 膽峄� c脿i 膽岷穞 l岷',
+      maxIterations: 'S峄� l岷 l岷穚 l岷 t峄慽 膽a',
+      tools: 'C么ng c峄�',
+      notAuthorized: 'Kh么ng 膽瓢峄 峄 quy峄乶',
+      strategyNotFoundDesc: 'Phi锚n b岷 plugin 膽茫 c脿i 膽岷穞 kh么ng cung c岷 chi岷縩 l瓢峄 n脿y.',
+      toolbox: 'h峄檖 c么ng c峄�',
+    },
+    loop: {
+      ErrorMethod: {
+        continueOnError: 'Ti岷縫 t峄 khi c贸 l峄梚',
+        removeAbnormalOutput: 'X贸a 膽岷 ra b岷 th瓢峄漬g',
+        operationTerminated: 'Ch岷 d峄﹖',
+      },
+      breakConditionTip: 'Ch峄� c贸 th峄� tham chi岷縰 膽岷縩 c谩c bi岷縩 trong v貌ng l岷穚 c贸 膽i峄乽 ki峄噉 k岷縯 th煤c v脿 c谩c bi岷縩 h峄檌 tho岷.',
+      deleteTitle: 'X贸a n煤t v貌ng l岷穚?',
+      variableName: 'T锚n Bi岷縩',
+      input: 'Nh岷璸',
+      exitConditionTip: 'M峄檛 n煤t v貌ng l岷穚 c岷 铆t nh岷 m峄檛 膽i峄乽 ki峄噉 tho谩t.',
+      breakCondition: '膼i峄乽 ki峄噉 d峄玭g v貌ng l岷穚',
+      totalLoopCount: 'T峄昻g s峄� l岷 l岷穚: {{count}}',
+      setLoopVariables: '膼岷穞 bi岷縩 trong ph岷 vi v貌ng l岷穚',
+      currentLoopCount: 'S峄� v貌ng l岷穚 hi峄噉 t岷: {{count}}',
+      deleteDesc: 'X贸a n煤t v貌ng s岷� x贸a t岷 c岷� c谩c n煤t con',
+      inputMode: 'Ch岷� 膽峄� 膽岷 v脿o',
+      currentLoop: 'V貌ng l岷穚 hi峄噉 t岷',
+      loopMaxCountError: 'Vui l貌ng nh岷璸 s峄� v貌ng l岷穚 t峄慽 膽a h峄 l峄�, trong kho岷g t峄� 1 膽岷縩 {{maxCount}}',
+      loop_other: '{{count}} V貌ng l岷穚',
+      finalLoopVariables: 'Bi岷縩 V貌ng L岷穚 Cu峄慽',
+      initialLoopVariables: 'Bi岷縩 V貌ng L岷穚 膼岷 Ti锚n',
+      loop_one: '{{count}} V貌ng l岷穚',
+      error_other: '{{count}} L峄梚',
+      output: 'Bi岷縩 膽岷 ra',
+      errorResponseMethod: 'Ph瓢啤ng ph谩p ph岷 h峄搃 l峄梚',
+      loopMaxCount: 'S峄� l岷 l岷穚 t峄慽 膽a',
+      comma: ',',
+      loopVariables: 'Bi岷縩 L岷穚',
+      error_one: '{{count}} L峄梚',
+      loopNode: 'N煤t L岷穚',
+    },
+  },
+  tracing: {
+    stopBy: 'D峄玭g b峄焛 {{user}}',
+  },
+  variableReference: {
+    noAssignedVars: 'Kh么ng c贸 bi岷縩 膽瓢峄 g谩n s岷祅 c贸',
+    noAvailableVars: 'Kh么ng c贸 bi岷縩 kh岷� d峄g',
+    assignedVarsDescription: 'C谩c bi岷縩 膽瓢峄 g谩n ph岷 l脿 c谩c bi岷縩 c贸 th峄� ghi, ch岷硁g h岷 nh瓢',
+    conversationVars: 'Bi岷縩 cu峄檆 tr貌 chuy峄噉',
+    noVarsForOperation: 'Kh么ng c贸 bi岷縩 n脿o c贸 s岷祅 膽峄� g谩n v峄沬 ho岷 膽峄檔g 膽茫 ch峄峮.',
+  },
+  versionHistory: {
+    filter: {
+      onlyYours: 'Ch峄� c峄 b岷',
+      empty: 'Kh么ng t矛m th岷 l峄媍h s峄� phi锚n b岷 ph霉 h峄',
+      onlyShowNamedVersions: 'Ch峄� hi峄僴 th峄� c谩c phi锚n b岷 c贸 t锚n',
+      reset: '膼岷穞 l岷 b峄� l峄峜',
+      all: 'T岷 c岷�',
+    },
+    editField: {
+      releaseNotesLengthLimit: 'Ghi ch煤 ph谩t h脿nh kh么ng 膽瓢峄 v瓢峄 qu谩 {{limit}} k媒 t峄�.',
+      title: 'Ti锚u 膽峄�',
+      releaseNotes: 'Ghi ch煤 ph谩t h脿nh',
+      titleLengthLimit: 'Ti锚u 膽峄� kh么ng 膽瓢峄 v瓢峄 qu谩 {{limit}} k媒 t峄�',
+    },
+    action: {
+      deleteFailure: 'X贸a phi锚n b岷 th岷 b岷',
+      updateFailure: 'C岷璸 nh岷璽 phi锚n b岷 kh么ng th脿nh c么ng',
+      deleteSuccess: 'Phi锚n b岷 膽茫 b峄� x贸a',
+      updateSuccess: 'Phi锚n b岷 膽茫 膽瓢峄 c岷璸 nh岷璽',
+      restoreSuccess: 'Phi锚n b岷 膽茫 膽瓢峄 kh么i ph峄',
+      restoreFailure: 'Kh么ng th峄� kh么i ph峄 phi锚n b岷',
+    },
+    defaultName: 'Phi锚n b岷 kh么ng 膽瓢峄 膽岷穞 t锚n',
+    releaseNotesPlaceholder: 'M么 t岷� nh峄痭g g矛 膽茫 thay 膽峄昳',
+    deletionTip: 'Vi峄嘽 x贸a l脿 kh么ng th峄� ph峄 h峄搃, vui l貌ng x谩c nh岷璶.',
+    currentDraft: 'D峄� th岷 hi峄噉 t岷',
+    editVersionInfo: 'Ch峄塶h s峄璦 th么ng tin phi锚n b岷',
+    latest: 'M峄沬 nh岷',
+    nameThisVersion: '膼岷穞 t锚n cho phi锚n b岷 n脿y',
+    restorationTip: 'Sau khi ph峄 h峄搃 phi锚n b岷, b岷 nh谩p hi峄噉 t岷 s岷� b峄� ghi 膽猫.',
+    title: 'C谩c phi锚n b岷',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/app-annotation.ts b/i18n/zh-Hans/app-annotation.ts
new file mode 100644
index 0000000..3a6cacf
--- /dev/null
+++ b/i18n/zh-Hans/app-annotation.ts
@@ -0,0 +1,90 @@
+const translation = {
+  title: '鏍囨敞',
+  name: '鏍囨敞鍥炲',
+  editBy: '{{author}}缂栬緫鐨勭瓟妗�',
+  noData: {
+    title: '娌℃湁鏍囨敞',
+    description: '浣犲彲浠ュ湪搴旂敤浼氳瘽璋冭瘯涓紪杈戞爣娉紝涔熷彲浠ュ湪姝ゆ壒閲忓鍏ユ爣娉ㄧ敤浜庨珮璐ㄩ噺鍥炲銆�',
+  },
+  table: {
+    header: {
+      question: '鎻愰棶',
+      match: '鍖归厤',
+      response: '鍥炲',
+      answer: '绛旀',
+      createdAt: '鍒涘缓鏃堕棿',
+      hits: '鍛戒腑娆℃暟',
+      actions: '鎿嶄綔',
+      addAnnotation: '娣诲姞鏍囨敞',
+      bulkImport: '鎵归噺瀵煎叆',
+      bulkExport: '鎵归噺瀵煎嚭',
+      clearAll: '鍒犻櫎鎵�鏈夋爣娉�',
+    },
+  },
+  editModal: {
+    title: '缂栬緫鏍囨敞鍥炲',
+    queryName: '鐢ㄦ埛鎻愰棶',
+    answerName: '鏈哄櫒鍥炲',
+    yourAnswer: '鎮ㄧ殑鍥炲',
+    answerPlaceholder: '鍦ㄨ繖閲岃緭鍏ユ偍鐨勫洖澶�',
+    yourQuery: '鎮ㄧ殑鎻愰棶',
+    queryPlaceholder: '鍦ㄨ繖閲岃緭鍏ユ偍鐨勬彁闂�',
+    removeThisCache: '鍒犻櫎姝ゆ爣娉�',
+    createdAt: '鍒涘缓浜�',
+  },
+  addModal: {
+    title: '娣诲姞鏍囨敞鍥炲',
+    queryName: '鎻愰棶',
+    answerName: '鍥炲',
+    answerPlaceholder: '杈撳叆鍥炲',
+    queryPlaceholder: '杈撳叆鎻愰棶',
+    createNext: '娣诲姞涓嬩竴涓爣娉ㄥ洖澶�',
+  },
+  batchModal: {
+    title: '鎵归噺瀵煎叆',
+    csvUploadTitle: '灏嗘偍鐨� CSV 鏂囦欢鎷栨斁鍒版澶勶紝鎴�',
+    browse: '閫夋嫨鏂囦欢',
+    tip: 'CSV 鏂囦欢蹇呴』绗﹀悎浠ヤ笅缁撴瀯锛�',
+    question: '闂',
+    answer: '鍥炵瓟',
+    contentTitle: '鍒嗘鍐呭',
+    content: '鍐呭',
+    template: '涓嬭浇妯℃澘',
+    cancel: '鍙栨秷',
+    run: '瀵煎叆',
+    runError: '鎵归噺瀵煎叆澶辫触',
+    processing: '鎵归噺澶勭悊涓�',
+    completed: '瀵煎叆瀹屾垚',
+    error: '瀵煎叆鍑洪敊',
+    ok: '纭畾',
+  },
+  errorMessage: {
+    answerRequired: '鍥炲涓嶈兘涓虹┖',
+    queryRequired: '鎻愰棶涓嶈兘涓虹┖',
+  },
+  viewModal: {
+    annotatedResponse: '鏍囨敞鍥炲',
+    hitHistory: '鍛戒腑鍘嗗彶',
+    hit: '娆″懡涓�',
+    hits: '娆″懡涓�',
+    noHitHistory: '娌℃湁鍛戒腑鍘嗗彶',
+  },
+  hitHistoryTable: {
+    question: '闂',
+    query: '鎻愰棶',
+    match: '鍖归厤',
+    response: '鍥炲',
+    source: '鏉ユ簮',
+    score: '鍒嗘暟',
+    time: '鏃堕棿',
+  },
+  initSetup: {
+    title: '鏍囨敞鍥炲鍒濆璁剧疆',
+    configTitle: '鏍囨敞鍥炲璁剧疆',
+    confirmBtn: '淇濆瓨骞跺惎鐢�',
+    configConfirmBtn: '淇濆瓨',
+  },
+  embeddingModelSwitchTip: '鏍囨敞鏂囨湰鍚戦噺鍖栨ā鍨嬶紝鍒囨崲妯″瀷浼氶噸鏂板祵鍏ワ紝浜х敓棰濆璐圭敤娑堣��',
+}
+
+export default translation
diff --git a/i18n/zh-Hans/app-api.ts b/i18n/zh-Hans/app-api.ts
new file mode 100644
index 0000000..f59d906
--- /dev/null
+++ b/i18n/zh-Hans/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'API 鏈嶅姟鍣�',
+  apiKey: 'API 瀵嗛挜',
+  status: '鐘舵��',
+  disabled: '宸插仠鐢�',
+  ok: '杩愯涓�',
+  copy: '澶嶅埗',
+  copied: '宸插鍒�',
+  regenerate: '閲嶆柊鐢熸垚',
+  play: '鎾斁',
+  pause: '鏆傚仠',
+  playing: '鎾斁涓�',
+  loading: '鍔犺浇涓�',
+  merMaid: {
+    rerender: '閲嶆柊娓叉煋',
+  },
+  never: '浠庢湭',
+  apiKeyModal: {
+    apiSecretKey: 'API 瀵嗛挜',
+    apiSecretKeyTips: '濡傛灉涓嶆兂浣犵殑 API 琚互鐢紝璇蜂繚鎶ゅソ浣犵殑 API Key :) 鏈�浣冲疄璺垫槸閬垮厤鍦ㄥ墠绔唬鐮佷腑鏄庢枃寮曠敤銆�',
+    createNewSecretKey: '鍒涘缓瀵嗛挜',
+    secretKey: '瀵嗛挜',
+    created: '鍒涘缓鏃堕棿',
+    lastUsed: '鏈�鍚庝娇鐢�',
+    generateTips: '璇峰皢姝ゅ瘑閽ヤ繚瀛樺湪瀹夊叏涓斿彲璁块棶鐨勫湴鏂广��',
+  },
+  actionMsg: {
+    deleteConfirmTitle: '鍒犻櫎姝ゅ瘑閽ワ紵',
+    deleteConfirmTips: '鍒犻櫎瀵嗛挜鏃犳硶鎾ら攢锛屾鍦ㄤ娇鐢ㄤ腑鐨勫簲鐢ㄤ細鍙楀奖鍝嶃��',
+    ok: '濂界殑',
+  },
+  completionMode: {
+    title: '鏂囨湰鐢熸垚鍨嬪簲鐢� API',
+    info: '鍙敤浜庣敓鎴愰珮璐ㄩ噺鏂囨湰鐨勫簲鐢紝渚嬪鐢熸垚鏂囩珷銆佹憳瑕併�佺炕璇戠瓑锛岄�氳繃璋冪敤 completion-messages 鎺ュ彛锛屽彂閫佺敤鎴疯緭鍏ュ緱鍒扮敓鎴愭枃鏈粨鏋溿�傜敤浜庣敓鎴愭枃鏈殑妯″瀷鍙傛暟鍜屾彁绀鸿瘝妯$増鍙栧喅浜庡紑鍙戣�呭湪 Dify 鎻愮ず璇嶇紪鎺掗〉鐨勮缃��',
+    createCompletionApi: '鍒涘缓鏂囨湰琛ュ叏娑堟伅',
+    createCompletionApiTip: '鍒涘缓鏂囨湰琛ュ叏娑堟伅锛屾敮鎸佷竴闂竴绛旀ā寮忋��',
+    inputsTips: '锛堥�夊~锛変互閿�煎鏂瑰紡鎻愪緵鐢ㄦ埛杈撳叆瀛楁锛屼笌鎻愮ず璇嶇紪鎺掍腑鐨勫彉閲忓搴斻�侹ey 涓哄彉閲忓悕绉帮紝Value 鏄弬鏁板�笺�傚鏋滃瓧娈电被鍨嬩负 Select锛屼紶鍏ョ殑 Value 闇�涓洪璁鹃�夐」涔嬩竴銆�',
+    queryTips: '鐢ㄦ埛杈撳叆鐨勬枃鏈鏂囥��',
+    blocking: 'blocking 闃诲鍨嬶紝绛夊緟鎵ц瀹屾瘯鍚庤繑鍥炵粨鏋溿�傦紙璇锋眰鑻ユ祦绋嬭緝闀垮彲鑳戒細琚腑鏂級',
+    streaming: 'streaming 娴佸紡杩斿洖銆傚熀浜� SSE锛�**[Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)**锛夊疄鐜版祦寮忚繑鍥炪��',
+    messageFeedbackApi: '娑堟伅鍙嶉锛堢偣璧烇級',
+    messageFeedbackApiTip: '浠h〃鏈�缁堢敤鎴峰杩斿洖娑堟伅杩涜璇勪环锛屽彲浠ョ偣璧炰笌鐐硅俯锛岃鏁版嵁灏嗗湪鈥滄棩蹇椾笌鏍囨敞鈥濋〉涓彲瑙侊紝骞剁敤浜庡悗缁殑妯″瀷寰皟銆�',
+    messageIDTip: '娑堟伅 ID',
+    ratingTip: 'like 鎴� dislike锛� 绌哄�间负鎾ら攢',
+    parametersApi: '鑾峰彇搴旂敤閰嶇疆淇℃伅',
+    parametersApiTip: '鑾峰彇宸查厤缃殑 Input 鍙傛暟锛屽寘鎷彉閲忓悕銆佸瓧娈靛悕绉般�佺被鍨嬩笌榛樿鍊笺�傞�氬父鐢ㄤ簬瀹㈡埛绔姞杞藉悗鏄剧ず杩欎簺瀛楁鐨勮〃鍗曟垨濉叆榛樿鍊笺��',
+  },
+  chatMode: {
+    title: '瀵硅瘽鍨嬪簲鐢� API',
+    info: '鍙敤浜庡ぇ閮ㄥ垎鍦烘櫙鐨勫璇濆瀷搴旂敤锛岄噰鐢ㄤ竴闂竴绛旀ā寮忎笌鐢ㄦ埛鎸佺画瀵硅瘽銆傝寮�濮嬩竴涓璇濊璋冪敤 chat-messages 鎺ュ彛锛岄�氳繃缁х画浼犲叆杩斿洖鐨� conversation_id 鍙寔缁繚鎸佽浼氳瘽銆�',
+    createChatApi: '鍙戦�佸璇濇秷鎭�',
+    createChatApiTip: '鍒涘缓浼氳瘽娑堟伅锛屾垨鍩轰簬姝ゅ墠鐨勫璇濈户缁彂閫佹秷鎭��',
+    inputsTips: '锛堥�夊~锛変互閿�煎鏂瑰紡鎻愪緵鐢ㄦ埛杈撳叆瀛楁锛屼笌鎻愮ず璇嶇紪鎺掍腑鐨勫彉閲忓搴斻�侹ey 涓哄彉閲忓悕绉帮紝Value 鏄弬鏁板�笺�傚鏋滃瓧娈电被鍨嬩负 Select锛屼紶鍏ョ殑 Value 闇�涓洪璁鹃�夐」涔嬩竴銆�',
+    queryTips: ' 鐢ㄦ埛杈撳叆/鎻愰棶鍐呭',
+    blocking: 'blocking 闃诲鍨嬶紝绛夊緟鎵ц瀹屾瘯鍚庤繑鍥炵粨鏋溿�傦紙璇锋眰鑻ユ祦绋嬭緝闀垮彲鑳戒細琚腑鏂級',
+    streaming: 'streaming 娴佸紡杩斿洖銆傚熀浜� SSE锛�**[Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)**锛夊疄鐜版祦寮忚繑鍥炪��',
+    conversationIdTip: '锛堥�夊~锛変細璇濇爣璇嗙锛岄娆″璇濆彲涓虹┖锛屽鏋滆缁х画瀵硅瘽璇蜂紶鍏ヤ笂涓嬫枃杩斿洖鐨� conversation_id',
+    messageFeedbackApi: '娑堟伅鍙嶉锛堢偣璧烇級',
+    messageFeedbackApiTip: '浠h〃鏈�缁堢敤鎴峰杩斿洖娑堟伅杩涜璇勪环锛屽彲浠ョ偣璧炰笌鐐硅俯锛岃鏁版嵁灏嗗湪鈥滄棩蹇椾笌鏍囨敞鈥濋〉涓彲瑙侊紝骞剁敤浜庡悗缁殑妯″瀷寰皟銆�',
+    messageIDTip: '娑堟伅 ID',
+    ratingTip: 'like 鎴� dislike锛� 绌哄�间负鎾ら攢',
+    chatMsgHistoryApi: '鑾峰彇浼氳瘽鍘嗗彶娑堟伅',
+    chatMsgHistoryApiTip: '婊氬姩鍔犺浇褰㈠紡杩斿洖鍘嗗彶鑱婂ぉ璁板綍锛岀涓�椤佃繑鍥炴渶鏂� `limit` 鏉★紝鍗筹細鍊掑簭杩斿洖銆�',
+    chatMsgHistoryConversationIdTip: '浼氳瘽 ID',
+    chatMsgHistoryFirstId: '褰撳墠椤电涓�鏉¤亰澶╄褰曠殑 ID锛岄粯璁� none',
+    chatMsgHistoryLimit: '涓�娆¤姹傝繑鍥炲灏戞潯鑱婂ぉ璁板綍',
+    conversationsListApi: '鑾峰彇浼氳瘽鍒楄〃',
+    conversationsListApiTip: '鑾峰彇褰撳墠鐢ㄦ埛鐨勪細璇濆垪琛紝榛樿杩斿洖鏈�杩戠殑 20 鏉°��',
+    conversationsListFirstIdTip: ' 褰撳墠椤垫渶鍓嶉潰涓�鏉¤褰曠殑 ID锛岄粯璁� none',
+    conversationsListLimitTip: '涓�娆¤姹傝繑鍥炲灏戞潯璁板綍',
+    conversationRenamingApi: '浼氳瘽閲嶅懡鍚�',
+    conversationRenamingApiTip: '瀵逛細璇濊繘琛岄噸鍛藉悕锛屼細璇濆悕绉扮敤浜庢樉绀哄湪鏀寔澶氫細璇濈殑瀹㈡埛绔笂銆�',
+    conversationRenamingNameTip: '鏂扮殑鍚嶇О',
+    parametersApi: '鑾峰彇搴旂敤閰嶇疆淇℃伅',
+    parametersApiTip: '鑾峰彇宸查厤缃殑 Input 鍙傛暟锛屽寘鎷彉閲忓悕銆佸瓧娈靛悕绉般�佺被鍨嬩笌榛樿鍊笺�傞�氬父鐢ㄤ簬瀹㈡埛绔姞杞藉悗鏄剧ず杩欎簺瀛楁鐨勮〃鍗曟垨濉叆榛樿鍊笺��',
+  },
+  develop: {
+    requestBody: 'Request Body',
+    pathParams: 'Path Params',
+    query: 'Query',
+    toc: '鐩綍',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/app-debug.ts b/i18n/zh-Hans/app-debug.ts
new file mode 100644
index 0000000..c2c659b
--- /dev/null
+++ b/i18n/zh-Hans/app-debug.ts
@@ -0,0 +1,529 @@
+const translation = {
+  pageTitle: {
+    line1: '鎻愮ず璇�',
+    line2: '缂栨帓',
+  },
+  orchestrate: '缂栨帓',
+  promptMode: {
+    simple: '鍒囨崲鍒颁笓瀹舵ā寮忎互缂栬緫瀹屾暣鐨勬彁绀鸿瘝',
+    advanced: '涓撳妯″紡',
+    switchBack: '杩斿洖绠�鏄撴ā寮�',
+    advancedWarning: {
+      title: '鎮ㄥ凡鍒囨崲鍒颁笓瀹舵ā寮忥紝涓�鏃︿慨鏀规彁绀鸿瘝锛屽皢鏃犳硶杩斿洖绠�鏄撴ā寮忋��',
+      description: '鍦ㄤ笓瀹舵ā寮忎笅锛屾偍鍙互缂栬緫瀹屾暣鐨勬彁绀鸿瘝銆�',
+      learnMore: '浜嗚В鏇村',
+      ok: '纭畾',
+    },
+    operation: {
+      addMessage: '娣诲姞娑堟伅',
+    },
+    contextMissing: '涓婁笅鏂囧唴瀹瑰潡缂哄け锛屾彁绀鸿瘝鐨勬湁鏁堟�у彲鑳戒笉濂姐��',
+  },
+  operation: {
+    applyConfig: '鍙戝竷',
+    resetConfig: '閲嶇疆',
+    debugConfig: '璋冭瘯',
+    addFeature: '娣诲姞鍔熻兘',
+    automatic: '鐢熸垚',
+    stopResponding: '鍋滄鍝嶅簲',
+    agree: '璧炲悓',
+    disagree: '鍙嶅',
+    cancelAgree: '鍙栨秷璧炲悓',
+    cancelDisagree: '鍙栨秷鍙嶅',
+    userAction: '鐢ㄦ埛琛ㄧず',
+  },
+  notSetAPIKey: {
+    title: 'LLM 鎻愪緵鑰呯殑瀵嗛挜鏈缃�',
+    trailFinished: '璇曠敤宸茬粨鏉�',
+    description: '鍦ㄨ皟璇曚箣鍓嶉渶瑕佽缃� LLM 鎻愪緵鑰呯殑瀵嗛挜銆�',
+    settingBtn: '鍘昏缃�',
+  },
+  trailUseGPT4Info: {
+    title: '褰撳墠涓嶆敮鎸佷娇鐢� gpt-4',
+    description: '浣跨敤 gpt-4锛岃璁剧疆 API Key',
+  },
+  feature: {
+    groupChat: {
+      title: '鑱婂ぉ澧炲己',
+      description: '涓鸿亰澶╁瀷搴旂敤娣诲姞棰勫璇濊缃紝鍙互鎻愬崌鐢ㄦ埛浣撻獙銆�',
+    },
+    groupExperience: {
+      title: '浣撻獙澧炲己',
+    },
+    conversationOpener: {
+      title: '瀵硅瘽寮�鍦虹櫧',
+      description: '鍦ㄥ璇濆瀷搴旂敤涓紝璁� AI 涓诲姩璇寸涓�娈佃瘽鍙互鎷夎繎涓庣敤鎴烽棿鐨勮窛绂汇��',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: '涓嬩竴姝ラ棶棰樺缓璁�',
+      description: '璁剧疆涓嬩竴姝ラ棶棰樺缓璁彲浠ヨ鐢ㄦ埛鏇村ソ鐨勫璇濄��',
+      resDes: '鍥炵瓟缁撴潫鍚庣郴缁熶細缁欏嚭 3 涓缓璁�',
+      tryToAsk: '璇曠潃闂棶',
+    },
+    moreLikeThis: {
+      title: '鏇村绫讳技鐨�',
+      description: '涓�娆$敓鎴愬鏉℃枃鏈紝鍙湪姝ゅ熀纭�涓婄紪杈戝苟缁х画鐢熸垚',
+      generateNumTip: '姣忔鐢熸垚鏁�',
+      tip: '浣跨敤姝ゅ姛鑳藉皢浼氶澶栨秷鑰� tokens',
+    },
+    speechToText: {
+      title: '璇煶杞枃瀛�',
+      description: '鎮ㄥ彲浠ヤ娇鐢ㄨ闊宠緭鍏ャ��',
+      resDes: '璇煶杈撳叆宸插惎鐢�',
+    },
+    textToSpeech: {
+      title: '鏂囧瓧杞闊�',
+      description: '鏂囨湰鍙互杞崲鎴愯闊炽��',
+      resDes: '鏂囨湰杞煶棰戝凡鍚敤',
+    },
+    citation: {
+      title: '寮曠敤鍜屽綊灞�',
+      description: '鏄剧ず婧愭枃妗e拰鐢熸垚鍐呭鐨勫綊灞為儴鍒嗐��',
+      resDes: '寮曠敤鍜屽綊灞炲凡鍚敤',
+    },
+    annotation: {
+      title: '鏍囨敞鍥炲',
+      description: '鍚敤鍚庯紝灏嗘爣娉ㄧ敤鎴风殑鍥炲锛屼互渚垮湪鐢ㄦ埛閲嶅鎻愰棶鏃跺揩閫熷搷搴斻��',
+      resDes: '鏍囨敞鍥炲宸插惎鐢�',
+      scoreThreshold: {
+        title: '鍒嗘暟闃堝��',
+        description: '鐢ㄤ簬璁剧疆鏍囨敞鍥炲鐨勫尮閰嶇浉浼煎害闃堝�笺��',
+        easyMatch: '瀹规槗鍖归厤',
+        accurateMatch: '绮惧噯鍖归厤',
+      },
+      matchVariable: {
+        title: '鍖归厤鍙橀噺',
+        choosePlaceholder: '璇烽�夋嫨鍙橀噺',
+      },
+      cacheManagement: '鏍囨敞绠$悊',
+      cached: '宸叉爣娉�',
+      remove: '绉婚櫎',
+      removeConfirm: '鍒犻櫎杩欎釜鏍囨敞锛�',
+      add: '娣诲姞鏍囨敞',
+      edit: '缂栬緫鏍囨敞',
+    },
+    dataSet: {
+      title: '鐭ヨ瘑搴�',
+      noData: '鎮ㄥ彲浠ュ鍏ョ煡璇嗗簱浣滀负涓婁笅鏂�',
+      words: '璇�',
+      textBlocks: '鏂囨湰鍧�',
+      selectTitle: '閫夋嫨寮曠敤鐭ヨ瘑搴�',
+      selected: '涓煡璇嗗簱琚�変腑',
+      noDataSet: '鏈壘鍒扮煡璇嗗簱',
+      toCreate: '鍘诲垱寤�',
+      notSupportSelectMulti: '鐩墠鍙敮鎸佸紩鐢ㄤ竴涓煡璇嗗簱',
+      queryVariable: {
+        title: '鏌ヨ鍙橀噺',
+        tip: '璇ュ彉閲忓皢鐢ㄤ綔涓婁笅鏂囨绱㈢殑鏌ヨ杈撳叆锛岃幏鍙栦笌璇ュ彉閲忕殑杈撳叆鐩稿叧鐨勪笂涓嬫枃淇℃伅銆�',
+        choosePlaceholder: '璇烽�夋嫨鍙橀噺',
+        noVar: '娌℃湁鍙橀噺',
+        noVarTip: '璇峰垱寤哄彉閲�',
+        unableToQueryDataSet: '鏃犳硶鏌ヨ鐭ヨ瘑搴�',
+        unableToQueryDataSetTip: '鏃犳硶鎴愬姛鏌ヨ鐭ヨ瘑搴擄紝璇峰湪涓婁笅鏂囬儴鍒嗛�夋嫨涓�涓笂涓嬫枃鏌ヨ鍙橀噺銆�',
+        ok: '濂界殑',
+        contextVarNotEmpty: '涓婁笅鏂囨煡璇㈠彉閲忎笉鑳戒负绌�',
+        deleteContextVarTitle: '鍒犻櫎鍙橀噺鈥渰{varName}}鈥濓紵',
+        deleteContextVarTip: '璇ュ彉閲忓凡琚缃负涓婁笅鏂囨煡璇㈠彉閲忥紝鍒犻櫎璇ュ彉閲忓皢褰卞搷鐭ヨ瘑搴撶殑姝e父浣跨敤銆� 濡傛灉鎮ㄤ粛闇�瑕佸垹闄ゅ畠锛岃鍦ㄤ笂涓嬫枃閮ㄥ垎涓噸鏂伴�夋嫨瀹冦��',
+      },
+    },
+    tools: {
+      title: '宸ュ叿',
+      tips: '宸ュ叿鎻愪緵浜嗕竴涓爣鍑嗙殑 API 璋冪敤鏂瑰紡锛屽皢鐢ㄦ埛杈撳叆鎴栧彉閲忎綔涓� API 鐨勮姹傚弬鏁帮紝鐢ㄤ簬鏌ヨ澶栭儴鏁版嵁浣滀负涓婁笅鏂囥��',
+      toolsInUse: '{{count}} 宸ュ叿浣跨敤涓�',
+      modal: {
+        title: '宸ュ叿',
+        toolType: {
+          title: '宸ュ叿绫诲瀷',
+          placeholder: '璇烽�夋嫨宸ュ叿绫诲瀷',
+        },
+        name: {
+          title: '鍚嶇О',
+          placeholder: '璇峰~鍐欏悕绉�',
+        },
+        variableName: {
+          title: '鍙橀噺鍚嶇О',
+          placeholder: '璇峰~鍐欏彉閲忓悕绉�',
+        },
+      },
+    },
+    conversationHistory: {
+      title: '瀵硅瘽鍘嗗彶',
+      description: '璁剧疆瀵硅瘽瑙掕壊鐨勫墠缂�鍚嶇О',
+      tip: '瀵硅瘽鍘嗗彶鏈惎鐢紝璇峰湪涓婇潰鐨勬彁绀轰腑娣诲姞<histories>銆�',
+      learnMore: '浜嗚В鏇村',
+      editModal: {
+        title: '缂栬緫瀵硅瘽瑙掕壊鍚嶇О',
+        userPrefix: '鐢ㄦ埛鍓嶇紑',
+        assistantPrefix: '鍔╂墜鍓嶇紑',
+      },
+    },
+    toolbox: {
+      title: '宸ュ叿绠�',
+    },
+    moderation: {
+      title: '鍐呭瀹℃煡',
+      description: '鎮ㄥ彲浠ヨ皟鐢ㄥ鏌� API 鎴栬�呯淮鎶ゆ晱鎰熻瘝搴撴潵浣挎ā鍨嬫洿瀹夊叏鍦拌緭鍑恒��',
+      contentEnableLabel: '鍚敤瀹℃煡鍐呭',
+      allEnabled: '杈撳叆鍐呭鍜岃緭鍑哄唴瀹�',
+      inputEnabled: '杈撳叆鍐呭',
+      outputEnabled: '杈撳嚭鍐呭',
+      modal: {
+        title: '鍐呭瀹℃煡璁剧疆',
+        provider: {
+          title: '绫诲埆',
+          openai: 'OpenAI Moderation',
+          openaiTip: {
+            prefix: 'OpenAI Moderation 闇�瑕佸湪',
+            suffix: '涓厤缃� OpenAI API 瀵嗛挜銆�',
+          },
+          keywords: '鍏抽敭璇�',
+        },
+        keywords: {
+          tip: '姣忚涓�涓紝鐢ㄦ崲琛岀鍒嗛殧銆傛瘡琛屾渶澶� 100 涓瓧绗︺��',
+          placeholder: '姣忚涓�涓紝鐢ㄦ崲琛岀鍒嗛殧',
+          line: '琛�',
+        },
+        content: {
+          input: '瀹℃煡杈撳叆鍐呭',
+          output: '瀹℃煡杈撳嚭鍐呭',
+          preset: '棰勮鍥炲',
+          placeholder: '杩欓噷棰勮鍥炲鍐呭',
+          condition: '瀹℃煡杈撳叆鍐呭鍜屽鏌ヨ緭鍑哄唴瀹硅嚦灏戝惎鐢ㄤ竴椤�',
+          fromApi: '棰勮鍥炲閫氳繃 API 杩斿洖',
+          errorMessage: '棰勮鍥炲涓嶈兘涓虹┖',
+          supportMarkdown: '鏀寔 Markdown',
+        },
+        openaiNotConfig: {
+          before: 'OpenAI 鍐呭瀹℃煡闇�瑕佸湪',
+          after: '涓厤缃� OpenAI API 瀵嗛挜銆�',
+        },
+      },
+    },
+    fileUpload: {
+      title: '鏂囦欢涓婁紶',
+      description: '鑱婂ぉ杈撳叆妗嗘敮鎸佷笂浼犳枃浠躲�傜被鍨嬪寘鎷浘鐗囥�佹枃妗d互鍙婂叾瀹冪被鍨�',
+      supportedTypes: '鏀寔鐨勬枃浠剁被鍨�',
+      numberLimit: '鏈�澶т笂浼犳暟',
+      modalTitle: '鏂囦欢涓婁紶璁剧疆',
+    },
+    imageUpload: {
+      title: '鍥剧墖涓婁紶',
+      description: '鏀寔涓婁紶鍥剧墖',
+      supportedTypes: '鏀寔鐨勬枃浠剁被鍨�',
+      numberLimit: '鏈�澶т笂浼犳暟',
+      modalTitle: '鍥剧墖涓婁紶璁剧疆',
+    },
+    bar: {
+      empty: '寮�鍚姛鑳藉寮� webapp 鐢ㄦ埛浣撻獙',
+      enableText: '鍔熻兘宸插紑鍚�',
+      manage: '绠$悊',
+    },
+    documentUpload: {
+      title: '鏂囨。',
+      description: '鍚敤鏂囨。鍚庯紝妯″瀷鍙互鎺ユ敹鏂囨。骞跺洖绛斿叧浜庡畠浠殑闂銆�',
+    },
+  },
+  codegen: {
+    title: '浠g爜鐢熸垚鍣�',
+    description: '浠g爜鐢熸垚鍣ㄤ娇鐢ㄩ厤缃殑妯″瀷鏍规嵁鎮ㄧ殑鎸囦护鐢熸垚楂樿川閲忕殑浠g爜銆傝鎻愪緵娓呮櫚璇︾粏鐨勮鏄庛��',
+    instruction: '鎸囦护',
+    instructionPlaceholder: '璇疯緭鍏ユ偍鎯宠鐢熸垚鐨勪唬鐮佺殑璇︾粏鎻忚堪銆�',
+    noDataLine1: '鍦ㄥ乏渚ф弿杩版偍鐨勭敤渚嬶紝',
+    noDataLine2: '浠g爜棰勮灏嗗湪姝ゅ鏄剧ず銆�',
+    generate: '鐢熸垚',
+    generatedCodeTitle: '鐢熸垚鐨勪唬鐮�',
+    loading: '姝e湪鐢熸垚浠g爜...',
+    apply: '搴旂敤',
+    applyChanges: '搴旂敤鏇存敼',
+    resTitle: '鐢熸垚鐨勪唬鐮�',
+    overwriteConfirmTitle: '鏄惁瑕嗙洊鐜版湁浠g爜锛�',
+    overwriteConfirmMessage: '姝ゆ搷浣滃皢瑕嗙洊鐜版湁浠g爜銆傛偍纭畾瑕佺户缁悧锛�',
+  },
+  generate: {
+    title: '鎻愮ず璇嶇敓鎴愬櫒',
+    description: '鎻愮ず璇嶇敓鎴愬櫒浣跨敤閰嶇疆鐨勬ā鍨嬫潵浼樺寲鎻愮ず璇嶏紝浠ヨ幏寰楁洿楂樼殑璐ㄩ噺鍜屾洿濂界殑缁撴瀯銆傝鍐欏嚭娓呮櫚璇︾粏鐨勮鏄庛��',
+    tryIt: '璇曚竴璇�',
+    instruction: '鎸囦护',
+    instructionPlaceHolder: '鍐欎笅娓呮櫚銆佸叿浣撶殑璇存槑銆�',
+    generate: '鐢熸垚',
+    resTitle: '鐢熸垚鐨勬彁绀鸿瘝',
+    noDataLine1: '鍦ㄥ乏渚ф弿杩版偍鐨勭敤渚嬶紝',
+    noDataLine2: '缂栨帓棰勮灏嗗湪姝ゅ鏄剧ず銆�',
+    apply: '搴旂敤',
+    noData: '鍦ㄥ乏渚ф弿杩版偍鐨勭敤渚嬶紝缂栨帓棰勮灏嗗湪姝ゅ鏄剧ず銆�',
+    loading: '涓烘偍缂栨帓搴旂敤绋嬪簭涓��',
+    overwriteTitle: '瑕嗙洊鐜版湁閰嶇疆锛�',
+    overwriteMessage: '搴旂敤姝ゆ彁绀哄皢瑕嗙洊鐜版湁閰嶇疆銆�',
+    template: {
+      pythonDebugger: {
+        name: 'Python 浠g爜鍔╂墜',
+        instruction: '涓�涓府浣犲啓鍜岀籂閿欑▼搴忕殑鏈哄櫒浜�',
+      },
+      translation: {
+        name: '缈昏瘧鏈哄櫒浜�',
+        instruction: '涓�涓彲浠ョ炕璇戝绉嶈瑷�鐨勭炕璇戝櫒',
+      },
+      professionalAnalyst: {
+        name: '鑱屼笟鍒嗘瀽甯�',
+        instruction: ' 浠庨暱绡囨姤鍛婁腑鎻愬彇娲炲療銆佽瘑鍒闄╁苟鎻愮偧鍏抽敭淇℃伅',
+      },
+      excelFormulaExpert: {
+        name: 'Excel 鍏紡涓撳',
+        instruction: '涓�涓彲浠ヨ灏忕櫧鐢ㄦ埛鐞嗚В銆佷娇鐢ㄥ拰鍒涘缓 Excel 鍏紡鐨勫璇濇満鍣ㄤ汉',
+      },
+      travelPlanning: {
+        name: '鏃呰瑙勫垝鍔╂墜',
+        instruction: '鏃呰瑙勫垝鍔╂墜鏄竴涓櫤鑳藉伐鍏凤紝鏃ㄥ湪甯姪鐢ㄦ埛杞绘澗瑙勫垝浠栦滑鐨勬梾琛�',
+      },
+      SQLSorcerer: {
+        name: 'SQL 鐢熸垚',
+        instruction: '鎶婅嚜鐒惰瑷�杞崲鎴� SQL 鏌ヨ璇彞',
+      },
+      GitGud: {
+        name: 'Git 澶у笀',
+        instruction: '浠庣敤鎴锋彁鍑虹殑鐗堟湰绠$悊闇�姹傜敓鎴愬悎閫傜殑 Git 鍛戒护',
+      },
+      meetingTakeaways: {
+        name: '鎬荤粨浼氳绾',
+        instruction: '灏嗕細璁唴瀹规彁鐐兼�荤粨锛屽寘鎷璁轰富棰樸�佸叧閿鐐瑰拰寰呭姙浜嬮」',
+      },
+      writingsPolisher: {
+        name: '娑﹁壊鏂囩珷',
+        instruction: '鐢ㄥ湴閬撶殑缂栬緫鎶�宸ф敼杩涙垜鐨勬枃绔�',
+      },
+    },
+  },
+  resetConfig: {
+    title: '纭閲嶇疆锛�',
+    message: '閲嶇疆灏嗕涪澶卞綋鍓嶉〉闈㈡墍鏈変慨鏀癸紝鎭㈠鑷充笂娆″彂甯冩椂鐨勯厤缃�',
+  },
+  errorMessage: {
+    nameOfKeyRequired: '鍙橀噺 {{key}} 瀵瑰簲鐨勫悕绉板繀濉�',
+    valueOfVarRequired: '{{key}}蹇呭~',
+    queryRequired: '涓昏鏂囨湰蹇呭~',
+    waitForResponse: '璇风瓑寰呬笂鏉′俊鎭搷搴斿畬鎴�',
+    waitForBatchResponse: '璇风瓑寰呮壒閲忎换鍔″畬鎴�',
+    notSelectModel: '璇烽�夋嫨妯″瀷',
+    waitForImgUpload: '璇风瓑寰呭浘鐗囦笂浼犲畬鎴�',
+    waitForFileUpload: '璇风瓑寰呮枃浠朵笂浼犲畬鎴�',
+  },
+  chatSubTitle: '鎻愮ず璇�',
+  completionSubTitle: '鍓嶇紑鎻愮ず璇�',
+  promptTip:
+    '鎻愮ず璇嶇敤浜庡 AI 鐨勫洖澶嶅仛鍑轰竴绯诲垪鎸囦护鍜岀害鏉熴�傚彲鎻掑叆琛ㄥ崟鍙橀噺锛屼緥濡� {{input}}銆傝繖娈垫彁绀鸿瘝涓嶄細琚渶缁堢敤鎴锋墍鐪嬪埌銆�',
+  formattingChangedTitle: '缂栨帓宸叉敼鍙�',
+  formattingChangedText: '淇敼缂栨帓灏嗛噸缃皟璇曞尯鍩燂紝纭畾鍚楋紵',
+  variableTitle: '鍙橀噺',
+  notSetVar: '鍙橀噺鑳戒娇鐢ㄦ埛杈撳叆琛ㄥ崟寮曞叆鎻愮ず璇嶆垨寮�鍦虹櫧锛屼綘鍙互璇曡瘯鍦ㄦ彁绀鸿瘝涓緭鍏� {{input}}',
+  variableTip:
+    '鍙橀噺灏嗕互琛ㄥ崟褰㈠紡璁╃敤鎴峰湪瀵硅瘽鍓嶅~鍐欙紝鐢ㄦ埛濉啓鐨勮〃鍗曞唴瀹瑰皢鑷姩鏇挎崲鎻愮ず璇嶄腑鐨勫彉閲忋��',
+  autoAddVar: '鎻愮ず璇嶄腑寮曠敤浜嗘湭瀹氫箟鐨勫彉閲忥紝鏄惁鑷姩娣诲姞鍒扮敤鎴疯緭鍏ヨ〃鍗曚腑锛�',
+  variableTable: {
+    key: '鍙橀噺 Key',
+    name: '瀛楁鍚嶇О',
+    optional: '鍙��',
+    type: '绫诲瀷',
+    action: '鎿嶄綔',
+    typeString: '鏂囨湰',
+    typeSelect: '涓嬫媺閫夐」',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{key}}蹇呭~',
+    tooLong: '{{key}} 闀垮害澶暱銆備笉鑳借秴杩� 30 涓瓧绗�',
+    notValid: '{{key}} 闈炴硶銆傚彧鑳藉寘鍚嫳鏂囧瓧绗︼紝鏁板瓧鍜屼笅鍒掔嚎',
+    notStartWithNumber: '{{key}} 涓嶈兘浠ユ暟瀛楀紑澶�',
+    keyAlreadyExists: '{{key}} 宸插瓨鍦�',
+  },
+  otherError: {
+    promptNoBeEmpty: '鎻愮ず璇嶄笉鑳戒负绌�',
+    historyNoBeEmpty: '鎻愮ず璇嶄腑蹇呴』璁剧疆瀵硅瘽鍘嗗彶',
+    queryNoBeEmpty: '鎻愮ず璇嶄腑蹇呴』璁剧疆鏌ヨ鍐呭',
+  },
+  variableConfig: {
+    'addModalTitle': '娣诲姞鍙橀噺',
+    'editModalTitle': '缂栬緫鍙橀噺',
+    'description': '璁剧疆鍙橀噺 {{varName}}',
+    'fieldType': '瀛楁绫诲瀷',
+    'string': '鏂囨湰',
+    'text-input': '鏂囨湰',
+    'paragraph': '娈佃惤',
+    'select': '涓嬫媺閫夐」',
+    'number': '鏁板瓧',
+    'single-file': '鍗曟枃浠�',
+    'multi-files': '鏂囦欢鍒楄〃',
+    'notSet': '鏈缃紝鍦� Prompt 涓緭鍏� {{input}} 璇曡瘯',
+    'stringTitle': '鏂囨湰妗嗚缃�',
+    'maxLength': '鏈�澶ч暱搴�',
+    'options': '閫夐」',
+    'addOption': '娣诲姞閫夐」',
+    'apiBasedVar': '鍩轰簬 API 鐨勫彉閲�',
+    'varName': '鍙橀噺鍚嶇О',
+    'inputPlaceholder': '璇疯緭鍏�',
+    'labelName': '鏄剧ず鍚嶇О',
+    'required': '蹇呭~',
+    'file': {
+      supportFileTypes: '鏀寔鐨勬枃浠剁被鍨�',
+      image: {
+        name: '鍥剧墖',
+      },
+      audio: {
+        name: '闊抽',
+      },
+      document: {
+        name: '鏂囨。',
+      },
+      video: {
+        name: '瑙嗛',
+      },
+      custom: {
+        name: '鍏朵粬鏂囦欢绫诲瀷',
+        description: '鎸囧畾鍏朵粬鏂囦欢绫诲瀷',
+        createPlaceholder: '+ 鏂囦欢鎵╁睍鍚嶏紝渚嬪 .doc',
+      },
+    },
+    'uploadFileTypes': '涓婁紶鏂囦欢绫诲瀷',
+    'localUpload': '鏈湴涓婁紶',
+    'both': '涓よ��',
+    'maxNumberOfUploads': '鏈�澶т笂浼犳暟',
+    'maxNumberTip': '鏂囨。 < {{docLimit}}, 鍥剧墖 < {{imgLimit}}, 闊抽 < {{audioLimit}}, 瑙嗛 < {{videoLimit}}',
+    'content': '鍐呭',
+    'errorMsg': {
+      labelNameRequired: '鏄剧ず鍚嶇О蹇呭~',
+      varNameCanBeRepeat: '鍙橀噺鍚嶇О涓嶈兘閲嶅',
+      atLeastOneOption: '鑷冲皯闇�瑕佷竴涓�夐」',
+      optionRepeat: '閫夐」涓嶈兘閲嶅',
+    },
+  },
+  vision: {
+    name: '瑙嗚',
+    description: '寮�鍚瑙夊姛鑳藉皢鍏佽妯″瀷杈撳叆鍥剧墖锛屽苟鏍规嵁鍥惧儚鍐呭鐨勭悊瑙e洖绛旂敤鎴烽棶棰�',
+    onlySupportVisionModelTip: '鍙湁瑙嗚妯″瀷閰嶇疆瑙嗚鍔熻兘',
+    settings: '璁剧疆',
+    visionSettings: {
+      title: '瑙嗚璁剧疆',
+      resolution: '鍒嗚鲸鐜�',
+      resolutionTooltip: `浣庡垎杈ㄧ巼妯″紡灏嗕娇妯″瀷鎺ユ敹鍥惧儚鐨勪綆鍒嗚鲸鐜囩増鏈紝灏哄涓�512 x 512锛屽苟浣跨敤65 Tokens 鏉ヨ〃绀哄浘鍍忋�傝繖鏍峰彲浠ヤ娇API鏇村揩鍦拌繑鍥炲搷搴旓紝骞跺湪涓嶉渶瑕侀珮缁嗚妭鐨勭敤渚嬩腑娑堣�楁洿灏戠殑杈撳叆銆�
+      \n
+      楂樺垎杈ㄧ巼妯″紡灏嗛鍏堝厑璁告ā鍨嬫煡鐪嬩綆鍒嗚鲸鐜囧浘鍍忥紝鐒跺悗鏍规嵁杈撳叆鍥惧儚鐨勫ぇ灏忓垱寤�512鍍忕礌鐨勮缁嗚鍓浘鍍忋�傛瘡涓缁嗚鍓浘鍍忎娇鐢ㄤ袱鍊嶇殑棰勭畻鎬诲叡涓�129 Tokens銆俙,
+      high: '楂�',
+      low: '浣�',
+      uploadMethod: '涓婁紶鏂瑰紡',
+      both: '涓よ��',
+      localUpload: '鏈湴涓婁紶',
+      url: 'URL',
+      uploadLimit: '涓婁紶鏁伴噺闄愬埗',
+    },
+  },
+  voice: {
+    name: '闊宠壊',
+    defaultDisplay: '缂虹渷闊宠壊',
+    description: '鏂囨湰杞闊抽煶鑹茶缃�',
+    settings: '璁剧疆',
+    voiceSettings: {
+      title: '闊宠壊璁剧疆',
+      language: '璇█',
+      resolutionTooltip: '鏂囨湰杞闊抽煶鑹叉敮鎸佽瑷�銆�',
+      voice: '闊宠壊',
+      autoPlay: '鑷姩鎾斁',
+      autoPlayEnabled: '寮�鍚�',
+      autoPlayDisabled: '鍏抽棴',
+    },
+  },
+  openingStatement: {
+    title: '瀵硅瘽寮�鍦虹櫧',
+    add: '娣诲姞寮�鍦虹櫧',
+    writeOpener: '缂栧啓寮�鍦虹櫧',
+    placeholder: '鍦ㄨ繖閲屽啓涓嬩綘鐨勫紑鍦虹櫧锛屼綘鍙互浣跨敤鍙橀噺锛屽皾璇曡緭鍏� {{variable}}銆�',
+    openingQuestion: '寮�鍦洪棶棰�',
+    noDataPlaceHolder:
+      '鍦ㄥ璇濆瀷搴旂敤涓紝璁� AI 涓诲姩璇寸涓�娈佃瘽鍙互鎷夎繎涓庣敤鎴烽棿鐨勮窛绂汇��',
+    varTip: '浣犲彲浠ヤ娇鐢ㄥ彉閲忥紝 璇曡瘯杈撳叆 {{variable}}',
+    tooShort: '瀵硅瘽鍓嶆彁绀鸿瘝鑷冲皯 20 瀛楁墠鑳界敓鎴愬紑鍦虹櫧',
+    notIncludeKey: '鍓嶇紑鎻愮ず璇嶄腑涓嶅寘鍚彉閲� {{key}}銆傝鍦ㄥ墠缂�鎻愮ず璇嶄腑娣诲姞璇ュ彉閲�',
+  },
+  modelConfig: {
+    model: '璇█妯″瀷',
+    setTone: '妯″瀷璁剧疆',
+    title: '妯″瀷鍙婂弬鏁�',
+    modeType: {
+      chat: '瀵硅瘽鍨�',
+      completion: '琛ュ叏鍨�',
+    },
+  },
+  inputs: {
+    title: '璋冭瘯涓庨瑙�',
+    noPrompt: '灏濊瘯鍦ㄥ璇濆墠鎻愮ず妗嗕腑缂栧啓涓�浜涙彁绀鸿瘝',
+    userInputField: '鐢ㄦ埛杈撳叆',
+    noVar: '濉叆鍙橀噺鐨勫�硷紝姣忔鍚姩鏂颁細璇濇椂璇ュ彉閲忓皢鑷姩鏇挎崲鎻愮ず璇嶄腑鐨勫彉閲忋��',
+    chatVarTip: '濉叆鍙橀噺鐨勫�硷紝璇ュ�煎皢鍦ㄦ瘡娆″紑鍚竴涓柊浼氳瘽鏃惰嚜鍔ㄦ浛鎹㈠埌鎻愮ず璇嶄腑',
+    completionVarTip: '濉叆鍙橀噺鐨勫�硷紝璇ュ�煎皢鍦ㄦ瘡娆℃彁浜ら棶棰樻椂鑷姩鏇挎崲鍒版彁绀鸿瘝涓�',
+    previewTitle: '鎻愮ず璇嶉瑙�',
+    queryTitle: '鏌ヨ鍐呭',
+    queryPlaceholder: '璇疯緭鍏ユ枃鏈唴瀹�',
+    run: '杩愯',
+  },
+  result: '缁撴灉',
+  noResult: '杈撳嚭缁撴灉灞曠ず鍦ㄨ繖',
+  datasetConfig: {
+    settingTitle: '鍙洖璁剧疆',
+    knowledgeTip: '鐐瑰嚮 鈥�+鈥� 鎸夐挳娣诲姞鐭ヨ瘑搴�',
+    retrieveOneWay: {
+      title: 'N閫�1鍙洖',
+      description: '鏍规嵁鐢ㄦ埛鎰忓浘鍜岀煡璇嗗簱鎻忚堪锛岀敱 Agent 鑷富鍒ゆ柇閫夋嫨鏈�鍖归厤鐨勫崟涓煡璇嗗簱鏉ユ煡璇㈢浉鍏虫枃鏈紝閫傚悎鐭ヨ瘑搴撳尯鍒嗗害澶т笖鐭ヨ瘑搴撴暟閲忓亸灏戠殑搴旂敤銆�',
+    },
+    retrieveMultiWay: {
+      title: '澶氳矾鍙洖',
+      description: '鏍规嵁鐢ㄦ埛鎰忓浘鍚屾椂鍖归厤鎵�鏈夌煡璇嗗簱锛屼粠澶氳矾鐭ヨ瘑搴撴煡璇㈢浉鍏虫枃鏈墖娈碉紝缁忚繃閲嶆帓搴忔楠わ紝浠庡璺煡璇㈢粨鏋滀腑閫夋嫨鍖归厤鐢ㄦ埛闂鐨勬渶浣崇粨鏋溿��',
+    },
+    embeddingModelRequired: '鏈厤缃� Embedding 妯″瀷',
+    rerankModelRequired: '鏈厤缃� Rerank 妯″瀷',
+    params: '鍙傛暟璁剧疆',
+    top_k: 'Top K',
+    top_kTip: '鐢ㄤ簬绛涢�変笌鐢ㄦ埛闂鐩镐技搴︽渶楂樼殑鏂囨湰鐗囨銆傜郴缁熷悓鏃朵細鏍规嵁閫夌敤妯″瀷涓婁笅鏂囩獥鍙eぇ灏忓姩鎬佽皟鏁村垎娈垫暟閲忋��',
+    score_threshold: 'Score 闃堝��',
+    score_thresholdTip: '鐢ㄤ簬璁剧疆鏂囨湰鐗囨绛涢�夌殑鐩镐技搴﹂槇鍊笺��',
+    retrieveChangeTip: '淇敼绱㈠紩妯″紡鍜屾绱㈡ā寮忓彲鑳戒細褰卞搷涓庤鐭ヨ瘑搴撳叧鑱旂殑搴旂敤绋嬪簭銆�',
+  },
+  debugAsSingleModel: '鍗曚竴妯″瀷杩涜璋冭瘯',
+  debugAsMultipleModel: '澶氫釜妯″瀷杩涜璋冭瘯',
+  duplicateModel: '澶嶅埗妯″瀷',
+  publishAs: '鍙戝竷涓�',
+  assistantType: {
+    name: '鍔╂墜绫诲瀷',
+    chatAssistant: {
+      name: '鍩虹鍔╂墜',
+      description: '鍩轰簬 LLM 鏋勫缓涓�涓亰澶╁瀷鍔╂墜',
+    },
+    agentAssistant: {
+      name: '鏅鸿兘鍔╂墜',
+      description: '鏋勫缓涓�涓櫤鑳藉姪鎵嬶紝浠栧彲浠ヨ嚜涓婚�夋嫨宸ュ叿瀹屾垚浣犺缃殑浠诲姟',
+    },
+  },
+  agent: {
+    agentMode: 'Agent Mode',
+    agentModeDes: '璁剧疆浠g悊鐨勬帹鐞嗘ā寮忕被鍨�',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: 'Function Calling',
+    },
+    setting: {
+      name: 'Agent 璁剧疆',
+      description: '鏅鸿兘鍔╂墜璁剧疆鍏佽璁剧疆浠g悊妯″紡鍜屽唴缃彁绀虹瓑楂樼骇鍔熻兘锛屼粎鍦ㄤ唬鐞嗙被鍨嬩腑鍙敤銆�',
+      maximumIterations: {
+        name: '鏈�澶ц凯浠f鏁�',
+        description: '闄愬埗浠g悊鍨嬪姪鎵嬫墽琛岃凯浠g殑娆℃暟',
+      },
+    },
+    buildInPrompt: '鍐呯疆鎻愮ず璇�',
+    firstPrompt: '绗竴娆℃彁绀鸿瘝',
+    nextIteration: '涓嬩竴娆¤凯浠�',
+    promptPlaceholder: '鍦ㄨ繖閲屽啓涓嬫偍鐨勬彁绀鸿瘝',
+    tools: {
+      name: '宸ュ叿',
+      description: '浣跨敤宸ュ叿鍙互鎵╁睍浠g悊鐨勮兘鍔涳紝姣斿鎼滅储浜掕仈缃戞垨绉戝璁$畻',
+      enabled: '鍚敤',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/app-log.ts b/i18n/zh-Hans/app-log.ts
new file mode 100644
index 0000000..8c7ad62
--- /dev/null
+++ b/i18n/zh-Hans/app-log.ts
@@ -0,0 +1,98 @@
+const translation = {
+  title: '鏃ュ織',
+  description: '鏃ュ織璁板綍浜嗗簲鐢ㄧ殑杩愯鎯呭喌锛屽寘鎷敤鎴风殑杈撳叆鍜� AI 鐨勫洖澶嶃��',
+  dateTimeFormat: 'YYYY-MM-DD HH:mm',
+  table: {
+    header: {
+      updatedTime: '鏇存柊鏃堕棿',
+      time: '鍒涘缓鏃堕棿',
+      endUser: '鐢ㄦ埛鎴栬处鎴�',
+      input: '杈撳叆',
+      output: '杈撳嚭',
+      summary: '鏍囬',
+      messageCount: '娑堟伅鏁�',
+      userRate: '鐢ㄦ埛鍙嶉',
+      adminRate: '绠$悊鍛樺弽棣�',
+      startTime: '寮�濮嬫椂闂�',
+      status: '鐘舵��',
+      runtime: '杩愯鏃堕棿',
+      tokens: 'TOKENS',
+      user: '鐢ㄦ埛鎴栬处鎴�',
+      version: '鐗堟湰',
+    },
+    pagination: {
+      previous: '涓婁竴椤�',
+      next: '涓嬩竴椤�',
+    },
+    empty: {
+      noChat: '鏈紑濮嬬殑瀵硅瘽',
+      noOutput: '鏃犺緭鍑�',
+      element: {
+        title: '杩欓噷鏈変汉鍚�',
+        content: '鍦ㄨ繖閲岃娴嬪拰鏍囨敞鏈�缁堢敤鎴峰拰 AI 搴旂敤绋嬪簭涔嬮棿鐨勪氦浜掞紝浠ヤ笉鏂彁楂� AI 鐨勫噯纭�с�傛偍鍙互<testLink>璇曡瘯</testLink> WebApp 鎴�<shareLink>鍒嗕韩</shareLink>鍑哄幓锛岀劧鍚庤繑鍥炴椤甸潰銆�',
+      },
+    },
+  },
+  detail: {
+    time: '鏃堕棿',
+    conversationId: '瀵硅瘽 ID',
+    promptTemplate: '鍓嶇紑鎻愮ず璇�',
+    promptTemplateBeforeChat: '瀵硅瘽鍓嶆彁绀鸿瘝 路 浠ョ郴缁熸秷鎭彁浜�',
+    annotationTip: '{{user}} 鏍囪鐨勬敼杩涘洖澶�',
+    timeConsuming: '鑰楁椂',
+    second: ' 绉�',
+    tokenCost: '鑺辫垂 Token',
+    loading: '鍔犺浇涓�',
+    operation: {
+      like: '璧炲悓',
+      dislike: '鍙嶅',
+      addAnnotation: '鏍囪鏀硅繘鍥炲',
+      editAnnotation: '缂栬緫鏀硅繘鍥炲',
+      annotationPlaceholder: '杈撳叆浣犲笇鏈� AI 鍥炲鐨勯鏈熺瓟妗堬紝杩欏湪浠婂悗鍙敤浜庢ā鍨嬪井璋冿紝鎸佺画鏀硅繘鏂囨湰鐢熸垚璐ㄩ噺銆�',
+    },
+    variables: '鍙橀噺',
+    uploadImages: '涓婁紶鐨勫浘鐗�',
+    modelParams: '妯″瀷鍙傛暟',
+  },
+  filter: {
+    period: {
+      today: '浠婂ぉ',
+      last7days: '杩囧幓 7 澶�',
+      last4weeks: '杩囧幓 4 鍛�',
+      last3months: '杩囧幓 3 鏈�',
+      last12months: '杩囧幓 12 鏈�',
+      monthToDate: '鏈湀鑷充粖',
+      quarterToDate: '鏈搴﹁嚦浠�',
+      yearToDate: '鏈勾鑷充粖',
+      allTime: '鎵�鏈夋椂闂�',
+    },
+    annotation: {
+      all: '鍏ㄩ儴',
+      annotated: '宸叉爣娉ㄦ敼杩涳紙{{count}} 椤癸級',
+      not_annotated: '鏈爣娉�',
+    },
+    sortBy: '鎺掑簭锛�',
+    descending: '闄嶅簭',
+    ascending: '鍗囧簭',
+  },
+  workflowTitle: '鏃ュ織',
+  workflowSubtitle: '鏃ュ織璁板綍浜嗗簲鐢ㄧ殑鎵ц鎯呭喌',
+  runDetail: {
+    title: '瀵硅瘽鏃ュ織',
+    workflowTitle: '鏃ュ織璇︽儏',
+    fileListLabel: '鏂囦欢璇︽儏',
+    fileListDetail: '璇︽儏',
+  },
+  promptLog: 'Prompt 鏃ュ織',
+  agentLog: 'Agent 鏃ュ織',
+  viewLog: '鏌ョ湅鏃ュ織',
+  agentLogDetail: {
+    agentMode: 'Agent 妯″紡',
+    toolUsed: '浣跨敤宸ュ叿',
+    iterations: '杩唬娆℃暟',
+    iteration: '杩唬',
+    finalProcessing: '鏈�缁堝鐞�',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/app-overview.ts b/i18n/zh-Hans/app-overview.ts
new file mode 100644
index 0000000..aebee63
--- /dev/null
+++ b/i18n/zh-Hans/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: '寮�濮嬩箣鍓�,',
+    enterKeyTip: '璇峰厛鍦ㄤ笅鏂硅緭鍏ヤ綘鐨� OpenAI API Key',
+    getKeyTip: '浠� OpenAI 鑾峰彇浣犵殑 API Key',
+    placeholder: '浣犵殑 OpenAI API Key锛堜緥濡� sk-xxxx锛�',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: '鎮ㄦ鍦ㄤ娇鐢� {{providerName}} 鐨勮瘯鐢ㄩ厤棰濄��',
+        description: '璇曠敤閰嶉浠呬緵鎮ㄦ祴璇曚娇鐢ㄣ�� 鍦ㄨ瘯鐢ㄩ厤棰濈敤瀹屼箣鍓嶏紝璇疯嚜琛岃缃ā鍨嬫彁渚涘晢鎴栬喘涔伴澶栭厤棰濄��',
+      },
+      exhausted: {
+        title: '鎮ㄧ殑璇曠敤棰濆害宸茬敤瀹岋紝璇疯缃偍鐨凙PIKey銆�',
+        description: '鎮ㄧ殑璇曠敤閰嶉宸茬敤瀹屻�� 璇疯缃偍鑷繁鐨勬ā鍨嬫彁渚涘晢鎴栬喘涔伴澶栭厤棰濄��',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: '棣栧厛锛�',
+        row2: '璁剧疆鎮ㄧ殑妯″瀷鎻愪緵鍟嗐��',
+      },
+    },
+    callTimes: '璋冪敤娆℃暟',
+    usedToken: '浣跨敤 Tokens',
+    setAPIBtn: '璁剧疆妯″瀷鎻愪緵鍟�',
+    tryCloud: '鎴栬�呭皾璇曚娇鐢� Dify 鐨勪簯鐗堟湰骞朵娇鐢ㄨ瘯鐢ㄩ厤棰�',
+  },
+  overview: {
+    title: '姒傝',
+    appInfo: {
+      explanation: '寮�绠卞嵆鐢ㄧ殑 AI WebApp',
+      accessibleAddress: '鍏紑璁块棶 URL',
+      preview: '棰勮',
+      launch: '鍚姩',
+      regenerate: '閲嶆柊鐢熸垚',
+      regenerateNotice: '鎮ㄦ槸鍚﹁閲嶆柊鐢熸垚鍏紑璁块棶 URL锛�',
+      preUseReminder: '浣跨敤鍓嶈鍏堟墦寮�寮�鍏�',
+      settings: {
+        entry: '璁剧疆',
+        title: 'WebApp 璁剧疆',
+        modalTip: '瀹㈡埛绔� WebApp 璁剧疆銆�',
+        webName: 'WebApp 鍚嶇О',
+        webDesc: 'WebApp 鎻忚堪',
+        webDescTip: '浠ヤ笅鏂囧瓧灏嗗睍绀哄湪瀹㈡埛绔腑锛屽搴旂敤杩涜璇存槑鍜屼娇鐢ㄤ笂鐨勫熀鏈紩瀵�',
+        webDescPlaceholder: '璇疯緭鍏� WebApp 鐨勬弿杩�',
+        language: '璇█',
+        workflow: {
+          title: '宸ヤ綔娴�',
+          subTitle: '宸ヤ綔娴佽鎯�',
+          show: '鏄剧ず',
+          hide: '闅愯棌',
+          showDesc: '鍦� WebApp 涓睍绀烘垨鑰呴殣钘忓伐浣滄祦璇︽儏',
+        },
+        chatColorTheme: '鑱婂ぉ棰滆壊涓婚',
+        chatColorThemeDesc: '璁剧疆鑱婂ぉ鏈哄櫒浜虹殑棰滆壊涓婚',
+        chatColorThemeInverted: '鍙嶈浆',
+        invalidHexMessage: '鏃犳晥鐨勫崄鍏繘鍒跺��',
+        invalidPrivacyPolicy: '鏃犳晥鐨勯殣绉佹斂绛栭摼鎺ワ紝璇蜂娇鐢ㄤ互 http 鎴� https 寮�澶寸殑鏈夋晥閾炬帴',
+        sso: {
+          label: '鍗曠偣鐧诲綍璁よ瘉',
+          title: 'WebApp SSO 璁よ瘉',
+          description: '鍚敤鍚庯紝鎵�鏈夌敤鎴烽兘闇�瑕佸厛杩涜 SSO 璁よ瘉鎵嶈兘璁块棶',
+          tooltip: '鑱旂郴绠$悊鍛樹互寮�鍚� WebApp SSO 璁よ瘉',
+        },
+        more: {
+          entry: '灞曠ず鏇村璁剧疆',
+          copyright: '鐗堟潈',
+          copyrightTip: '鍦� WebApp 涓睍绀虹増鏉冧俊鎭�',
+          copyrightTooltip: '璇峰崌绾у埌涓撲笟鐗堟垨鑰呮洿楂�',
+          copyRightPlaceholder: '璇疯緭鍏ヤ綔鑰呮垨缁勭粐鍚嶇О',
+          privacyPolicy: '闅愮鏀跨瓥',
+          privacyPolicyPlaceholder: '璇疯緭鍏ラ殣绉佹斂绛栭摼鎺�',
+          privacyPolicyTip: '甯姪璁块棶鑰呬簡瑙h搴旂敤鏀堕泦鐨勬暟鎹紝鍙弬鑰� Dify 鐨�<privacyPolicyLink>闅愮鏀跨瓥</privacyPolicyLink>銆�',
+          customDisclaimer: '鑷畾涔夊厤璐e0鏄�',
+          customDisclaimerPlaceholder: '璇疯緭鍏ュ厤璐e0鏄�',
+          customDisclaimerTip: '鍦ㄥ簲鐢ㄤ腑灞曠ず鍏嶈矗澹版槑锛屽彲鐢ㄤ簬鍛婄煡鐢ㄦ埛 AI 鐨勫眬闄愭�с��',
+        },
+      },
+      embedded: {
+        entry: '宓屽叆',
+        title: '宓屽叆鍒扮綉绔欎腑',
+        explanation: '閫夋嫨涓�绉嶆柟寮忓皢鑱婂ぉ搴旂敤宓屽叆鍒颁綘鐨勭綉绔欎腑',
+        iframe: '灏嗕互涓� iframe 宓屽叆鍒颁綘鐨勭綉绔欎腑鐨勭洰鏍囦綅缃�',
+        scripts: '灏嗕互涓嬩唬鐮佸祵鍏ュ埌浣犵殑缃戠珯涓�',
+        chromePlugin: '瀹夎 Dify Chrome 娴忚鍣ㄦ墿灞�',
+        copied: '宸插鍒�',
+        copy: '澶嶅埗',
+      },
+      qrcode: {
+        title: '浜岀淮鐮佸垎浜�',
+        scan: '鎵爜鍒嗕韩搴旂敤',
+        download: '涓嬭浇浜岀淮鐮�',
+      },
+      customize: {
+        way: '鏂规硶',
+        entry: '瀹氬埗鍖�',
+        title: '瀹氬埗鍖� AI WebApp',
+        explanation: '浣犲彲浠ュ畾鍒跺寲 Web App 鍓嶇浠ョ鍚堜綘鐨勬儏鏅笌椋庢牸闇�姹�',
+        way1: {
+          name: 'Fork 瀹㈡埛绔唬鐮佷慨鏀瑰悗閮ㄧ讲鍒� Vercel锛堟帹鑽愶級',
+          step1: 'Fork 瀹㈡埛绔唬鐮佸苟淇敼',
+          step1Tip: '鐐瑰嚮姝ゅ Fork 婧愮爜鍒颁綘鐨� GitHub 涓紝鐒跺悗淇敼浠g爜',
+          step1Operation: 'Dify-WebClient',
+          step2: '閮ㄧ讲鍒� Vercel 涓�',
+          step2Tip: '鐐瑰嚮姝ゅ灏嗕粨搴撳鍏ュ埌 Vercel 涓儴缃�',
+          step2Operation: '瀵煎叆浠撳簱',
+          step3: '閰嶇疆鐜鍙橀噺',
+          step3Tip: '鍦� Vercel 鐜鍙橀噺涓坊鍔犱互涓嬬幆澧冨彉閲�',
+        },
+        way2: {
+          name: '缂栧啓瀹㈡埛绔皟鐢� API 骞堕儴缃插埌鏈嶅姟鍣ㄤ腑',
+          operation: '鏌ョ湅鏂囨。',
+        },
+      },
+    },
+    apiInfo: {
+      title: '鍚庣鏈嶅姟 API',
+      explanation: '鍙泦鎴愯嚦浣犵殑搴旂敤鐨勫悗绔嵆鏈嶅姟',
+      accessibleAddress: 'API 璁块棶鍑嵁',
+      doc: '鏌ラ槄 API 鏂囨。',
+    },
+    status: {
+      running: '杩愯涓�',
+      disable: '宸插仠鐢�',
+    },
+  },
+  analysis: {
+    title: '鍒嗘瀽',
+    ms: '姣',
+    tokenPS: 'Token/绉�',
+    totalMessages: {
+      title: '鍏ㄩ儴娑堟伅鏁�',
+      explanation: '鍙嶆槧 AI 姣忓ぉ鐨勪簰鍔ㄦ�绘鏁帮紝姣忓洖绛旂敤鎴蜂竴涓棶棰樼畻涓�鏉� Message銆�',
+    },
+    totalConversations: {
+      title: '鍏ㄩ儴浼氳瘽鏁�',
+      explanation: '鍙嶆槧 AI 姣忓ぉ鐨勪細璇濇�绘鏁帮紝鎻愮ず璇嶇紪鎺掑拰璋冭瘯鐨勬秷鎭笉璁″叆銆�',
+    },
+    activeUsers: {
+      title: '娲昏穬鐢ㄦ埛鏁�',
+      explanation: '涓� AI 鏈夋晥浜掑姩锛屽嵆鏈変竴闂竴绛斾互涓婄殑鍞竴鐢ㄦ埛鏁般�傛彁绀鸿瘝缂栨帓鍜岃皟璇曠殑浼氳瘽涓嶈鍏ャ��',
+    },
+    tokenUsage: {
+      title: '璐圭敤娑堣��',
+      explanation: '鍙嶆槧姣忔棩璇ュ簲鐢ㄨ姹傝瑷�妯″瀷鐨� Tokens 鑺辫垂锛岀敤浜庢垚鏈帶鍒躲��',
+      consumed: '鑰楄垂',
+    },
+    avgSessionInteractions: {
+      title: '骞冲潎浼氳瘽浜掑姩鏁�',
+      explanation: '鍙嶆槧姣忎釜浼氳瘽鐢ㄦ埛鐨勬寔缁矡閫氭鏁帮紝濡傛灉鐢ㄦ埛涓� AI 闂瓟浜� 10 杞紝鍗充负 10銆傝鎸囨爣鍙嶆槧浜嗙敤鎴风矘鎬с�備粎鍦ㄥ璇濆瀷搴旂敤鎻愪緵銆�',
+    },
+    avgUserInteractions: {
+      title: '骞冲潎鐢ㄦ埛璋冪敤娆℃暟',
+      explanation: '鍙嶆槧姣忓ぉ鐢ㄦ埛鐨勪娇鐢ㄦ鏁般�傝鎸囨爣鍙嶆槧浜嗙敤鎴风矘鎬с��',
+    },
+    userSatisfactionRate: {
+      title: '鐢ㄦ埛婊℃剰搴�',
+      explanation: '姣� 1000 鏉℃秷鎭殑鐐硅禐鏁般�傚弽鏄犱簡鐢ㄦ埛瀵瑰洖绛斿崄鍒嗘弧鎰忕殑姣斾緥銆�',
+    },
+    avgResponseTime: {
+      title: '骞冲潎鍝嶅簲鏃堕棿',
+      explanation: '琛¢噺 AI 搴旂敤澶勭悊鍜屽洖澶嶇敤鎴疯姹傛墍鑺辫垂鐨勫钩鍧囨椂闂达紝鍗曚綅涓烘绉掞紝鍙嶆槧鎬ц兘鍜岀敤鎴蜂綋楠屻�備粎鍦ㄦ枃鏈瀷搴旂敤鎻愪緵銆�',
+    },
+    tps: {
+      title: 'Token 杈撳嚭閫熷害',
+      explanation: '琛¢噺 LLM 鐨勬�ц兘銆傜粺璁� LLM 浠庤姹傚紑濮嬪埌杈撳嚭瀹屾瘯杩欐鏈熼棿鐨� Tokens 杈撳嚭閫熷害銆�',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/app.ts b/i18n/zh-Hans/app.ts
new file mode 100644
index 0000000..c1723fc
--- /dev/null
+++ b/i18n/zh-Hans/app.ts
@@ -0,0 +1,201 @@
+const translation = {
+  createApp: '鍒涘缓搴旂敤',
+  types: {
+    all: '鍏ㄩ儴',
+    chatbot: '鑱婂ぉ鍔╂墜',
+    agent: 'Agent',
+    workflow: '宸ヤ綔娴�',
+    completion: '鏂囨湰鐢熸垚',
+    advanced: 'Chatflow',
+    basic: '鍩虹缂栨帓',
+  },
+  duplicate: '澶嶅埗',
+  mermaid: {
+    handDrawn: '鎵嬬粯',
+    classic: '缁忓吀',
+  },
+  duplicateTitle: '澶嶅埗搴旂敤',
+  export: '瀵煎嚭 DSL',
+  exportFailed: '瀵煎嚭 DSL 澶辫触',
+  importDSL: '瀵煎叆 DSL 鏂囦欢',
+  createFromConfigFile: '閫氳繃 DSL 鏂囦欢鍒涘缓',
+  importFromDSL: '瀵煎叆 DSL',
+  importFromDSLFile: '鏂囦欢',
+  importFromDSLUrl: 'URL',
+  importFromDSLUrlPlaceholder: '杈撳叆 DSL 鏂囦欢鐨� URL',
+  deleteAppConfirmTitle: '纭鍒犻櫎搴旂敤?',
+  deleteAppConfirmContent:
+    '鍒犻櫎搴旂敤灏嗘棤娉曟挙閿�銆傜敤鎴峰皢涓嶈兘璁块棶浣犵殑搴旂敤锛屾墍鏈� Prompt 缂栨帓閰嶇疆鍜屾棩蹇楀潎灏嗕竴骞惰鍒犻櫎銆�',
+  appDeleted: '搴旂敤宸插垹闄�',
+  appDeleteFailed: '搴旂敤鍒犻櫎澶辫触',
+  join: '鍙備笌绀惧尯',
+  communityIntro: '涓庡洟闃熸垚鍛樸�佽础鐚�呭拰寮�鍙戣�呭湪涓嶅悓棰戦亾涓氦娴�',
+  roadmap: '浜у搧璺嚎鍥�',
+  newApp: {
+    learnMore: '浜嗚В鏇村',
+    startFromBlank: '鍒涘缓绌虹櫧搴旂敤',
+    startFromTemplate: '浠庡簲鐢ㄦā鐗堝垱寤�',
+    captionAppType: '鎯宠鍝搴旂敤绫诲瀷锛�',
+    foundResult: '{{count}} 涓粨鏋�',
+    foundResults: '{{count}} 涓粨鏋�',
+    noAppsFound: '鏈壘鍒板簲鐢�',
+    noTemplateFound: '鏈壘鍒版ā鏉�',
+    noTemplateFoundTip: '璇峰皾璇曚娇鐢ㄤ笉鍚岀殑鍏抽敭瀛楄繘琛屾悳绱€��',
+    chatbotShortDescription: '绠�鍗曢厤缃嵆鍙瀯寤哄熀浜� LLM 鐨勫璇濇満鍣ㄤ汉',
+    chatbotUserDescription: '閫氳繃绠�鍗曠殑閰嶇疆蹇�熸惌寤轰竴涓熀浜� LLM 鐨勫璇濇満鍣ㄤ汉銆傛敮鎸佸垏鎹负 Chatflow 缂栨帓銆�',
+    completionShortDescription: '鐢ㄤ簬鏂囨湰鐢熸垚浠诲姟鐨� AI 鍔╂墜',
+    completionUserDescription: '閫氳繃绠�鍗曠殑閰嶇疆蹇�熸惌寤轰竴涓潰鍚戞枃鏈敓鎴愮被浠诲姟鐨� AI 鍔╂墜銆�',
+    completionWarning: '璇ョ被鍨嬩笉涔呭悗灏嗕笉鍐嶆敮鎸佸垱寤�',
+    agentShortDescription: '鍏峰鎺ㄧ悊涓庤嚜涓诲伐鍏疯皟鐢ㄧ殑鏅鸿兘鍔╂墜',
+    agentUserDescription: '鑳藉杩唬寮忕殑瑙勫垝鎺ㄧ悊銆佽嚜涓诲伐鍏疯皟鐢紝鐩磋嚦瀹屾垚浠诲姟鐩爣鐨勬櫤鑳藉姪鎵嬨��',
+    workflowShortDescription: '闈㈠悜鍗曡疆鑷姩鍖栦换鍔$殑缂栨帓宸ヤ綔娴�',
+    workflowUserDescription: '鍩轰簬宸ヤ綔娴佺紪鎺掞紝閫傜敤浜庤嚜鍔ㄥ寲銆佹壒澶勭悊绛夊崟杞敓鎴愮被浠诲姟鐨勫満鏅��',
+    workflowWarning: '姝e湪杩涜 Beta 娴嬭瘯',
+    advancedShortDescription: '鏀寔璁板繂鐨勫鏉傚杞璇濆伐浣滄祦',
+    advancedUserDescription: '鍩轰簬宸ヤ綔娴佺紪鎺掞紝閫傜敤浜庡畾涔夌瓑澶嶆潅娴佺▼鐨勫杞璇濆満鏅紝鍏锋湁璁板繂鍔熻兘銆�',
+    chooseAppType: '閫夋嫨搴旂敤绫诲瀷',
+    forBeginners: '鏂版墜閫傜敤',
+    forAdvanced: '杩涢樁鐢ㄦ埛閫傜敤',
+    noIdeaTip: '娌℃湁鎯虫硶锛熻瘯璇曟垜浠殑妯℃澘',
+    captionName: '搴旂敤鍚嶇О & 鍥炬爣',
+    appNamePlaceholder: '缁欎綘鐨勫簲鐢ㄨ捣涓悕瀛�',
+    optional: '鍙��',
+    captionDescription: '鎻忚堪',
+    appDescriptionPlaceholder: '杈撳叆搴旂敤鐨勬弿杩�',
+    useTemplate: '浣跨敤璇ユā鏉�',
+    previewDemo: '棰勮 Demo',
+    chatApp: '鍔╂墜',
+    chatAppIntro:
+      '鎴戣鏋勫缓涓�涓亰澶╁満鏅殑搴旂敤銆傝搴旂敤閲囩敤涓�闂竴绛旀ā寮忎笌鐢ㄦ埛鎸佺画瀵硅瘽銆�',
+    agentAssistant: '鏂扮殑鏅鸿兘鍔╂墜',
+    completeApp: '鏂囨湰鐢熸垚搴旂敤',
+    completeAppIntro:
+      '鎴戣鏋勫缓涓�涓牴鎹彁绀虹敓鎴愰珮璐ㄩ噺鏂囨湰鐨勫簲鐢紝渚嬪鐢熸垚鏂囩珷銆佹憳瑕併�佺炕璇戠瓑',
+    showTemplates: '鎴戞兂浠庤寖渚嬫ā鏉夸腑閫夋嫨',
+    hideTemplates: '杩斿洖搴旂敤绫诲瀷閫夋嫨',
+    Create: '鍒涘缓',
+    Cancel: '鍙栨秷',
+    nameNotEmpty: '鍚嶇О涓嶈兘涓虹┖',
+    appTemplateNotSelected: '璇烽�夋嫨搴旂敤妯$増',
+    appTypeRequired: '璇烽�夋嫨搴旂敤绫诲瀷',
+    appCreated: '搴旂敤宸插垱寤�',
+    caution: '娉ㄦ剰',
+    appCreateDSLWarning: '娉ㄦ剰锛欴SL 鐗堟湰宸紓鍙兘褰卞搷閮ㄥ垎鍔熻兘琛ㄧ幇',
+    appCreateDSLErrorTitle: '鐗堟湰涓嶅吋瀹�',
+    appCreateDSLErrorPart1: '妫�娴嬪埌 DSL 鐗堟湰宸紓杈冨ぇ锛屽己鍒跺鍏ュ簲鐢ㄥ彲鑳芥棤娉曟甯歌繍琛屻��',
+    appCreateDSLErrorPart2: '鏄惁缁х画锛�',
+    appCreateDSLErrorPart3: '褰撳墠搴旂敤 DSL 鐗堟湰锛�',
+    appCreateDSLErrorPart4: '绯荤粺鏀寔 DSL 鐗堟湰锛�',
+    appCreateFailed: '搴旂敤鍒涘缓澶辫触',
+    Confirm: '纭',
+  },
+  newAppFromTemplate: {
+    byCategories: '鍒嗙被',
+    searchAllTemplate: '鎼滅储鎵�鏈夋ā鐗�...',
+    sidebar: {
+      Recommended: '鎺ㄨ崘',
+      Agent: 'Agent',
+      Assistant: '鍔╂墜',
+      HR: '浜哄姏璧勬簮',
+      Workflow: '宸ヤ綔娴�',
+      Writing: '鍐欎綔',
+      Programming: '缂栫▼',
+    },
+  },
+  editApp: '缂栬緫淇℃伅',
+  editAppTitle: '缂栬緫搴旂敤淇℃伅',
+  editDone: '搴旂敤淇℃伅宸叉洿鏂�',
+  editFailed: '鏇存柊搴旂敤淇℃伅澶辫触',
+  iconPicker: {
+    ok: '纭',
+    cancel: '鍙栨秷',
+    emoji: '琛ㄦ儏绗﹀彿',
+    image: '鍥剧墖',
+  },
+  answerIcon: {
+    title: '浣跨敤 WebApp 鍥炬爣鏇挎崲 馃',
+    description: '鏄惁浣跨敤 WebApp 鍥炬爣鏇挎崲鍒嗕韩鐨勫簲鐢ㄧ晫闈腑鐨� 馃',
+    descriptionInExplore: '鏄惁浣跨敤 WebApp 鍥炬爣鏇挎崲 Explore 鐣岄潰涓殑 馃',
+  },
+  switch: '杩佺Щ涓哄伐浣滄祦缂栨帓',
+  switchTipStart: '灏嗕负鎮ㄥ垱寤轰竴涓娇鐢ㄥ伐浣滄祦缂栨帓鐨勬柊搴旂敤銆傛柊搴旂敤灏�',
+  switchTip: '涓嶈兘澶�',
+  switchTipEnd: '杩佺Щ鍥炲熀纭�缂栨帓',
+  switchLabel: '鏂板簲鐢ㄥ垱寤轰负',
+  removeOriginal: '鍒犻櫎鍘熷簲鐢�',
+  switchStart: '寮�濮嬭縼绉�',
+  typeSelector: {
+    all: '鎵�鏈夌被鍨�',
+    chatbot: '鑱婂ぉ鍔╂墜',
+    agent: 'Agent',
+    workflow: '宸ヤ綔娴�',
+    completion: '鏂囨湰鐢熸垚',
+    advanced: 'Chatflow',
+  },
+  tracing: {
+    title: '杩借釜搴旂敤鎬ц兘',
+    description: '閰嶇疆绗笁鏂� LLMOps 鎻愪緵鍟嗗苟璺熻釜搴旂敤绋嬪簭鎬ц兘銆�',
+    config: '閰嶇疆',
+    view: '鏌ョ湅',
+    collapse: '鎶樺彔',
+    expand: '灞曞紑',
+    tracing: '杩借釜',
+    disabled: '宸茬鐢�',
+    disabledTip: '璇峰厛閰嶇疆鎻愪緵鍟�',
+    enabled: '宸插惎鐢�',
+    tracingDescription: '鎹曡幏搴旂敤绋嬪簭鎵ц鐨勫畬鏁翠笂涓嬫枃锛屽寘鎷� LLM 璋冪敤銆佷笂涓嬫枃銆佹彁绀恒�丠TTP 璇锋眰绛夛紝鍙戦�佸埌绗笁鏂硅窡韪钩鍙般��',
+    configProviderTitle: {
+      configured: '宸查厤缃�',
+      notConfigured: '閰嶇疆鎻愪緵鍟嗕互鍚敤杩借釜',
+      moreProvider: '鏇村鎻愪緵鍟�',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: '涓�涓叏鏂逛綅鐨勫紑鍙戣�呭钩鍙帮紝閫傜敤浜� LLM 椹卞姩搴旂敤绋嬪簭鐢熷懡鍛ㄦ湡鐨勬瘡涓楠ゃ��',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: '璺熻釜銆佽瘎浼般�佹彁绀虹鐞嗗拰鎸囨爣锛屼互璋冭瘯鍜屾敼杩涙偍鐨� LLM 搴旂敤绋嬪簭銆�',
+    },
+    opik: {
+      title: 'Opik',
+      description: '涓�涓叏鏂逛綅鐨勫紑鍙戣�呭钩鍙帮紝閫傜敤浜� LLM 椹卞姩搴旂敤绋嬪簭鐢熷懡鍛ㄦ湡鐨勬瘡涓楠ゃ��',
+    },
+    inUse: '浣跨敤涓�',
+    configProvider: {
+      title: '閰嶇疆 ',
+      placeholder: '杈撳叆浣犵殑{{key}}',
+      project: '椤圭洰',
+      publicKey: '鍏挜',
+      secretKey: '瀵嗛挜',
+      viewDocsLink: '鏌ョ湅 {{key}} 鐨勬枃妗�',
+      removeConfirmTitle: '鍒犻櫎 {{key}} 閰嶇疆?',
+      removeConfirmContent: '褰撳墠閰嶇疆姝e湪浣跨敤涓紝鍒犻櫎瀹冨皢鍏抽棴杩借釜鍔熻兘銆�',
+    },
+    weave: {
+      title: '缂栫粐',
+      description: 'Weave鏄竴涓紑婧愬钩鍙帮紝鐢ㄤ簬璇勪及銆佹祴璇曞拰鐩戞帶澶у瀷璇█妯″瀷搴旂敤绋嬪簭銆�',
+    },
+  },
+  appSelector: {
+    label: '搴旂敤',
+    placeholder: '閫夋嫨涓�涓簲鐢�',
+    params: '搴旂敤鍙傛暟',
+    noParams: '鏃犻渶鍙傛暟',
+  },
+  openInExplore: '鍦ㄢ�滄帰绱⑩�濅腑鎵撳紑',
+  showMyCreatedAppsOnly: '鎴戝垱寤虹殑',
+  structOutput: {
+    moreFillTip: '鏈�澶氭樉绀� 10 绾у祵濂�',
+    required: '蹇呭~',
+    LLMResponse: 'LLM 鐨勫搷搴�',
+    configure: '閰嶇疆',
+    notConfiguredTip: '缁撴瀯鍖栬緭鍑哄皻鏈厤缃�',
+    structured: '缁撴瀯鍖栬緭鍑�',
+    structuredTip: '缁撴瀯鍖栬緭鍑烘槸涓�椤瑰姛鑳斤紝鍙‘淇濇ā鍨嬪缁堢敓鎴愮鍚堟偍鎻愪緵鐨� JSON 妯″紡鐨勫搷搴�',
+    modelNotSupported: '妯″瀷涓嶆敮鎸�',
+    modelNotSupportedTip: '褰撳墠妯″瀷涓嶆敮鎸佹鍔熻兘锛屽皢鑷姩闄嶇骇涓烘彁绀烘敞鍏ャ��',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/billing.ts b/i18n/zh-Hans/billing.ts
new file mode 100644
index 0000000..c00d137
--- /dev/null
+++ b/i18n/zh-Hans/billing.ts
@@ -0,0 +1,190 @@
+const translation = {
+  currentPlan: '褰撳墠濂楅',
+  usagePage: {
+    teamMembers: '鍥㈤槦鎴愬憳',
+    buildApps: '鏋勫缓搴旂敤绋嬪簭鏁�',
+    annotationQuota: '鏍囨敞鍥炲鏁�',
+    documentsUploadQuota: '鏂囨。涓婁紶閰嶉',
+    vectorSpace: '鐭ヨ瘑搴撴暟鎹瓨鍌ㄧ┖闂�',
+    vectorSpaceTooltip: '閲囩敤楂樿川閲忕储寮曟ā寮忕殑鏂囨。浼氭秷鑰楃煡璇嗘暟鎹瓨鍌ㄨ祫婧愩�傚綋鐭ヨ瘑鏁版嵁瀛樺偍杈惧埌闄愬埗鏃讹紝灏嗕笉浼氫笂浼犳柊鏂囨。銆�',
+  },
+  upgradeBtn: {
+    plain: '鏌ョ湅濂楅',
+    encourage: '绔嬪嵆鍗囩骇',
+    encourageShort: '鍗囩骇',
+  },
+  viewBilling: '绠$悊璐﹀崟鍙婅闃�',
+  buyPermissionDeniedTip: '璇疯仈绯讳紒涓氱鐞嗗憳璁㈤槄',
+  plansCommon: {
+    title: '涓烘偍鐨� AI 涔嬫梾鎻愪緵鍔ㄥ姏鐨勫畾浠峰椁�',
+    freeTrialTipPrefix: '娉ㄥ唽鍗冲彲',
+    freeTrialTip: '鍏嶈垂璇曠敤 200 涓� OpenAI 娑堟伅棰濆害',
+    freeTrialTipSuffix: '銆傛棤闇�淇$敤鍗�',
+    yearlyTip: '鏀粯 10 涓湀锛屼韩鍙� 1 骞达紒',
+    mostPopular: '鏈�鍙楁杩�',
+    cloud: '浜戞湇鍔�',
+    self: '鑷儴缃�',
+    planRange: {
+      monthly: '鎸夋湀',
+      yearly: '鎸夊勾',
+    },
+    month: '鏈�',
+    year: '骞�',
+    save: '鑺傜渷',
+    free: '鍏嶈垂',
+    annualBilling: '鎸夊勾璁¤垂',
+    comparePlanAndFeatures: '瀵规瘮濂楅 & 鍔熻兘鐗规��',
+    priceTip: '姣忎釜鍥㈤槦绌洪棿/',
+    currentPlan: '褰撳墠璁″垝',
+    contractSales: '鑱旂郴閿�鍞�',
+    contractOwner: '鑱旂郴鍥㈤槦绠$悊鍛�',
+    startForFree: '鍏嶈垂寮�濮�',
+    getStarted: '绔嬪嵆寮�濮�',
+    contactSales: '鑱旂郴閿�鍞�',
+    talkToSales: '鑱旂郴閿�鍞�',
+    modelProviders: '鏀寔 OpenAI/Anthropic/Llama2/Azure OpenAI/Hugging Face/Replicate',
+    teamWorkspace: '{{count,number}} 涓洟闃熺┖闂�',
+    teamMember_one: '{{count,number}} 鍚嶅洟闃熸垚鍛�',
+    teamMember_other: '{{count,number}} 鍚嶅洟闃熸垚鍛�',
+    annotationQuota: '鏍囨敞鍥炲鏁�',
+    buildApps: '{{count, number}} 涓簲鐢ㄧ▼搴�',
+    documents: '{{count, number}} 涓煡璇嗗簱鏂囨。涓婁紶閰嶉',
+    documentsTooltip: '浠庣煡璇嗗簱鐨勬暟鎹簮瀵煎叆鐨勬枃妗f暟閲忛厤棰濄��',
+    vectorSpace: '{{size}} 鐭ヨ瘑搴撴暟鎹瓨鍌ㄧ┖闂�',
+    vectorSpaceTooltip: '閲囩敤楂樿川閲忕储寮曟ā寮忕殑鏂囨。浼氭秷鑰楃煡璇嗘暟鎹瓨鍌ㄨ祫婧愩�傚綋鐭ヨ瘑鏁版嵁瀛樺偍杈惧埌闄愬埗鏃讹紝灏嗕笉浼氫笂浼犳柊鏂囨。銆�',
+    documentsRequestQuota: '{{count,number}}/鍒嗛挓 鐭ヨ瘑搴撹姹傞鐜囬檺鍒�',
+    documentsRequestQuotaTooltip: '鎸囨瘡鍒嗛挓鍐咃紝涓�涓┖闂村湪鐭ヨ瘑搴撲腑鍙墽琛岀殑鎿嶄綔鎬绘暟锛屽寘鎷暟鎹泦鐨勫垱寤恒�佸垹闄ゃ�佹洿鏂帮紝鏂囨。鐨勪笂浼犮�佷慨鏀广�佸綊妗o紝浠ュ強鐭ヨ瘑搴撴煡璇㈢瓑锛岀敤浜庤瘎浼扮煡璇嗗簱璇锋眰鐨勬�ц兘銆備緥濡傦紝Sandbox 鐢ㄦ埛鍦� 1 鍒嗛挓鍐呰繛缁墽琛� 10 娆″懡涓祴璇曪紝鍏跺伐浣滃尯灏嗗湪鎺ヤ笅鏉ョ殑 1 鍒嗛挓鍐呮棤娉曠户缁墽琛屼互涓嬫搷浣滐細鏁版嵁闆嗙殑鍒涘缓銆佸垹闄ゃ�佹洿鏂帮紝鏂囨。鐨勪笂浼犮�佷慨鏀圭瓑鎿嶄綔銆�',
+    apiRateLimit: 'API 璇锋眰棰戠巼闄愬埗',
+    apiRateLimitUnit: '{{count,number}} 娆�/澶�',
+    unlimitedApiRate: 'API 璇锋眰棰戠巼鏃犻檺鍒�',
+    apiRateLimitTooltip: 'API 璇锋眰棰戠巼闄愬埗娑电洊鎵�鏈夐�氳繃 Dify API 鍙戣捣鐨勮皟鐢紝渚嬪鏂囨湰鐢熸垚銆佽亰澶╁璇濄�佸伐浣滄祦鎵ц鍜屾枃妗e鐞嗙瓑銆�',
+    documentProcessingPriority: '鏂囨。澶勭悊',
+    documentProcessingPriorityUpgrade: '浠ユ洿蹇殑閫熷害銆佹洿楂樼殑绮惧害澶勭悊鏇村鐨勬暟鎹��',
+    priority: {
+      'standard': '鏍囧噯',
+      'priority': '浼樺厛',
+      'top-priority': '鏈�楂樹紭鍏堢骇',
+    },
+    logsHistory: '{{days}}鏃ュ織鍘嗗彶',
+    customTools: '鑷畾涔夊伐鍏�',
+    unavailable: '涓嶅彲鐢�',
+    days: '澶�',
+    unlimited: '鏃犻檺鍒�',
+    support: '鏀寔',
+    supportItems: {
+      communityForums: '绀惧尯璁哄潧',
+      emailSupport: '鐢靛瓙閭欢鏀寔',
+      priorityEmail: '浼樺厛鐢靛瓙閭欢鍜岃亰澶╂敮鎸�',
+      logoChange: 'Logo 鏇存敼',
+      SSOAuthentication: 'SSO 璁よ瘉',
+      personalizedSupport: '涓�у寲鏀寔',
+      dedicatedAPISupport: '涓撶敤 API 鏀寔',
+      customIntegration: '鑷畾涔夐泦鎴愬拰鏀寔',
+      ragAPIRequest: 'RAG API 璇锋眰',
+      bulkUpload: '鎵归噺涓婁紶鏂囨。',
+      agentMode: '浠g悊妯″紡',
+      workflow: '宸ヤ綔娴�',
+      llmLoadingBalancing: 'LLM 璐熻浇鍧囪 ',
+      llmLoadingBalancingTooltip: '鍚戞ā鍨嬫坊鍔犲涓� API 瀵嗛挜锛屾湁鏁堢粫杩� API 閫熺巼闄愬埗銆�',
+    },
+    comingSoon: '鍗冲皢鎺ㄥ嚭',
+    member: '鎴愬憳',
+    memberAfter: '涓垚鍛�',
+    messageRequest: {
+      title: '{{count,number}} 鏉℃秷鎭搴�',
+      titlePerMonth: '{{count,number}} 鏉℃秷鎭搴�/鏈�',
+      tooltip: '涓轰笉鍚屾柟妗堟彁渚涘熀浜嶰penAl妯″瀷鐨勬秷鎭搷搴旈搴︺��',
+    },
+    annotatedResponse: {
+      title: '{{count,number}} 涓爣娉ㄥ洖澶嶆暟',
+      tooltip: '鏍囨敞鍥炲鍔熻兘閫氳繃浜哄伐缂栬緫鏍囨敞涓哄簲鐢ㄦ彁渚涗簡鍙畾鍒剁殑楂樿川閲忛棶绛斿洖澶嶈兘鍔涖��',
+    },
+    ragAPIRequestTooltip: '鎸囧崟鐙皟鐢� Dify 鐭ヨ瘑搴撴暟鎹鐞嗚兘鍔涚殑 API銆�',
+    receiptInfo: '鍙湁鍥㈤槦鎵�鏈夎�呭拰鍥㈤槦绠$悊鍛樻墠鑳借闃呭拰鏌ョ湅璐﹀崟淇℃伅',
+  },
+  plans: {
+    sandbox: {
+      name: 'Sandbox',
+      for: '鏍稿績鑳藉姏鐨勫厤璐硅瘯鐢�',
+      description: '鏍稿績鍔熻兘鍏嶈垂璇曠敤',
+    },
+    professional: {
+      name: 'Professional',
+      for: '閫傚悎鐙珛寮�鍙戣�呮垨灏忓洟闃�',
+      description: '瀵逛簬鐙珛寮�鍙戣��/灏忓洟闃�',
+    },
+    team: {
+      name: 'Team',
+      for: '閫傚悎涓瓑瑙勬ā鐨勫洟闃�',
+      description: '瀵逛簬涓瀷鍥㈤槦',
+    },
+    community: {
+      name: 'Community',
+      for: '閫傜敤浜庝釜浜虹敤鎴枫�佸皬鍨嬪洟闃熸垨闈炲晢涓氶」鐩�',
+      description: '閫傜敤浜庝釜浜虹敤鎴枫�佸皬鍨嬪洟闃熸垨闈炲晢涓氶」鐩�',
+      price: '鍏嶈垂',
+      btnText: '寮�濮嬩娇鐢�',
+      includesTitle: '鍏嶈垂鍔熻兘锛�',
+      features: [
+        '鎵�鏈夋牳蹇冨姛鑳藉潎鍦ㄥ叕鍏卞瓨鍌ㄥ簱涓嬪彂甯�',
+        '鍗曚竴宸ヤ綔绌洪棿',
+        '绗﹀悎 Dify 寮�婧愯鍙瘉',
+      ],
+    },
+    premium: {
+      name: 'Premium',
+      for: '瀵逛簬涓瀷缁勭粐鍜屽洟闃�',
+      description: '瀵逛簬涓瀷缁勭粐鍜屽洟闃�',
+      price: '鍙墿灞�',
+      priceTip: '鍩轰簬浜戝競鍦�',
+      btnText: '鑾峰緱 Premium 鐗�',
+      includesTitle: 'Community 鐗堢殑鎵�鏈夊姛鑳斤紝鍔犱笂锛�',
+      comingSoon: '鍗冲皢鏀寔 Microsoft Azure & Google Cloud',
+      features: [
+        '鍚勪釜浜戞彁渚涘晢鑷绠$悊鐨勫彲闈犳��',
+        '鍗曚竴宸ヤ綔绌洪棿',
+        '鑷畾涔� WebApp & 鍝佺墝',
+        '浼樺厛鐢靛瓙閭欢 & 鑱婂ぉ鏀寔',
+      ],
+    },
+    enterprise: {
+      name: 'Enterprise',
+      for: '閫傚悎澶т汉鍛樿妯$殑鍥㈤槦',
+      description: '瀵逛簬闇�瑕佺粍缁囪寖鍥村唴鐨勫畨鍏ㄦ�с�佸悎瑙勬�с�佸彲鎵╁睍鎬с�佹帶鍒跺拰鏇撮珮绾у姛鑳界殑浼佷笟',
+      price: '瀹氬埗',
+      priceTip: '浠呮寜骞磋璐�',
+      btnText: '鑱旂郴閿�鍞�',
+      includesTitle: 'Premium 鐗堢殑鎵�鏈夊姛鑳斤紝鍔犱笂锛�',
+      features: [
+        '浼佷笟绾у彲鎵╁睍閮ㄧ讲瑙e喅鏂规',
+        '鍟嗕笟璁稿彲鎺堟潈',
+        '涓撳睘浼佷笟绾у姛鑳�',
+        '澶氫釜宸ヤ綔绌洪棿 & 浼佷笟绾х鐞�',
+        'SSO',
+        '鐢� Dify 鍚堜綔浼欎即鏀寔鐨勫彲鍗忓晢鐨� SLAs',
+        '楂樼骇鐨勫畨鍏� & 鎺у埗',
+        '鐢� Dify 瀹樻柟鎻愪緵鐨勬洿鏂� & 缁存姢',
+        '涓撲笟鎶�鏈敮鎸�',
+      ],
+    },
+  },
+  vectorSpace: {
+    fullTip: '鐭ヨ瘑搴撴暟鎹瓨鍌ㄧ┖闂村凡婊°��',
+    fullSolution: '鍗囩骇鎮ㄧ殑濂楅浠ヨ幏寰楁洿澶氱┖闂淬��',
+  },
+  apps: {
+    fullTip1: '鍗囩骇浠ュ垱寤烘洿澶氬簲鐢�',
+    fullTip1des: '鎮ㄥ凡杈惧埌姝よ鍒掍笂鏋勫缓搴旂敤鐨勯檺鍒�',
+    fullTip2: '璁″垝闄愬埗宸茶揪鍒�',
+    fullTip2des: '鎺ㄨ崘鎮ㄦ竻鐞嗕笉娲昏穬鐨勫簲鐢ㄦ垨鑰呰仈绯绘垜浠�',
+    contactUs: '鑱旂郴鎴戜滑',
+  },
+  annotatedResponse: {
+    fullTipLine1: '鍗囩骇鎮ㄧ殑濂楅浠�',
+    fullTipLine2: '鏍囨敞鏇村瀵硅瘽銆�',
+    quotaTitle: '鏍囨敞鐨勯厤棰�',
+  },
+  teamMembers: '鍥㈤槦鎴愬憳',
+}
+
+export default translation
diff --git a/i18n/zh-Hans/common.ts b/i18n/zh-Hans/common.ts
new file mode 100644
index 0000000..9ed961f
--- /dev/null
+++ b/i18n/zh-Hans/common.ts
@@ -0,0 +1,671 @@
+const translation = {
+  theme: {
+    theme: '涓婚',
+    light: '娴呰壊',
+    dark: '娣辫壊',
+    auto: '鑷姩',
+  },
+  api: {
+    success: '鎴愬姛',
+    actionSuccess: '鎿嶄綔鎴愬姛',
+    saved: '宸蹭繚瀛�',
+    create: '宸插垱寤�',
+    remove: '宸茬Щ闄�',
+  },
+  operation: {
+    create: '鍒涘缓',
+    confirm: '纭',
+    cancel: '鍙栨秷',
+    clear: '娓呯┖',
+    save: '淇濆瓨',
+    saveAndEnable: '淇濆瓨骞跺惎鐢�',
+    edit: '缂栬緫',
+    add: '娣诲姞',
+    added: '宸叉坊鍔�',
+    refresh: '閲嶆柊寮�濮�',
+    reset: '閲嶇疆',
+    search: '鎼滅储',
+    change: '鏇存敼',
+    remove: '绉婚櫎',
+    send: '鍙戦��',
+    copy: '澶嶅埗',
+    copied: ' 宸插鍒�',
+    lineBreak: '鎹㈣',
+    sure: '鎴戠‘瀹�',
+    download: '涓嬭浇',
+    downloadSuccess: '涓嬭浇瀹屾瘯',
+    downloadFailed: '涓嬭浇澶辫触锛岃绋嶅悗閲嶈瘯銆�',
+    viewDetails: '鏌ョ湅璇︽儏',
+    delete: '鍒犻櫎',
+    deleteApp: '鍒犻櫎搴旂敤',
+    settings: '璁剧疆',
+    setup: '璁剧疆',
+    getForFree: '鍏嶈垂鑾峰彇',
+    reload: '鍒锋柊',
+    ok: '濂界殑',
+    log: '鏃ュ織',
+    learnMore: '浜嗚В鏇村',
+    params: '鍙傛暟璁剧疆',
+    duplicate: '澶嶅埗',
+    rename: '閲嶅懡鍚�',
+    audioSourceUnavailable: '闊虫簮涓嶅彲鐢�',
+    copyImage: '澶嶅埗鍥剧墖',
+    imageCopied: '鍥剧墖宸插鍒�',
+    zoomOut: '缂╁皬',
+    zoomIn: '鏀惧ぇ',
+    openInNewTab: '鍦ㄦ柊鏍囩椤垫墦寮�',
+    in: '鍦�',
+    saveAndRegenerate: '淇濆瓨骞堕噸鏂扮敓鎴愬瓙鍒嗘',
+    close: '鍏抽棴',
+    view: '鏌ョ湅',
+    viewMore: '鏌ョ湅鏇村',
+    regenerate: '閲嶆柊鐢熸垚',
+    submit: '鎻愪氦',
+    skip: '璺宠繃',
+    format: '鏍煎紡鍖�',
+    more: '鏇村',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 涓哄繀濉」',
+    urlError: 'url 搴旇浠� http:// 鎴� https:// 寮�澶�',
+  },
+  placeholder: {
+    input: '璇疯緭鍏�',
+    select: '璇烽�夋嫨',
+  },
+  voice: {
+    language: {
+      zhHans: '涓枃',
+      zhHant: '绻佷綋涓枃',
+      enUS: '鑻辫',
+      deDE: '寰疯',
+      frFR: '娉曡',
+      esES: '瑗跨彮鐗欒',
+      itIT: '鎰忓ぇ鍒╄',
+      thTH: '娉拌',
+      idID: '鍗板凹璇�',
+      jaJP: '鏃ヨ',
+      koKR: '闊╄',
+      ptBR: '钁¤悇鐗欒',
+      ruRU: '淇勮',
+      ukUA: '涔屽厠鍏拌',
+      viVN: '瓒婂崡璇�',
+      plPL: '娉㈠叞璇�',
+      roRO: '缃楅┈灏间簹璇�',
+      hiIN: '鍗板湴璇�',
+      trTR: '鍦熻�冲叾璇�',
+      faIR: '娉㈡柉璇�',
+    },
+  },
+  unit: {
+    char: '涓瓧绗�',
+  },
+  actionMsg: {
+    noModification: '鏆傛棤淇敼',
+    modifiedSuccessfully: '淇敼鎴愬姛',
+    modifiedUnsuccessfully: '淇敼澶辫触',
+    copySuccessfully: '澶嶅埗鎴愬姛',
+    generatedSuccessfully: '宸查噸鏂扮敓鎴�',
+    generatedUnsuccessfully: '鐢熸垚澶辫触',
+    paySucceeded: '宸叉敮浠樻垚鍔�',
+    payCancelled: '宸插彇娑堟敮浠�',
+  },
+  model: {
+    params: {
+      temperature: '闅忔満鎬� temperature',
+      temperatureTip:
+        '鎺у埗鍥炲鐨勯殢鏈烘�с�俓n鍊艰秺澶э紝鍥炲瓒婇殢鏈恒�俓n鍊艰秺灏忥紝鍥炲瓒婄‘瀹氭垨涓�鑷淬��',
+      top_p: '鏍搁噰鏍� top_p',
+      top_pTip:
+        '鎺у埗鐢熸垚澶氭牱鎬с�俓n鍊艰秺澶э紝杈撳嚭浼氬寘鎷洿澶氱殑鍗曡瘝閫夐」銆俓n鍊艰秺灏忥紝妯″瀷浼氭洿闆嗕腑鍦ㄩ珮姒傜巼鐨勫崟璇嶄笂锛岃緭鍑烘洿纭畾浣嗗彲鑳界己涔忓鏍锋�с�俓n鏍搁噰鏍峰拰闅忔満鎬т笉寤鸿鍚屾椂淇敼銆�',
+      presence_penalty: '璇濋鏂伴矞搴� presence_penalty',
+      presence_penaltyTip:
+        '鎺у埗鐢熸垚鏃跺涓婃枃宸插瓨鍦ㄧ殑璇濋鐨勫亸濂界▼搴︺�俓n鍊艰秺澶э紝瓒婂彲鑳戒娇鐢ㄥ埌鏂扮殑璇濋銆�',
+      frequency_penalty: '棰戠巼鎯╃綒搴� frequency_penalty',
+      frequency_penaltyTip:
+        '褰卞搷甯歌涓庣綍瑙佽瘝姹囦娇鐢ㄣ�俓n鍊艰緝澶ф椂锛屽�惧悜浜庣敓鎴愪笉甯歌鐨勮瘝姹囧拰琛ㄨ揪鏂瑰紡銆俓n鍊艰秺灏忥紝鏇村�惧悜浜庝娇鐢ㄥ父瑙佸拰鏅亶鎺ュ彈鐨勮瘝姹囨垨鐭銆�',
+      max_tokens: '鍗曟鍥炲闄愬埗 max_tokens',
+      max_tokensTip:
+        '鐢ㄤ簬闄愬埗鍥炲鐨勬渶澶ч暱搴︼紝浠� token 涓哄崟浣嶃�俓n杈冨ぇ鐨勫�煎彲鑳戒細闄愬埗缁欐彁绀鸿瘝銆佽亰澶╄褰曞拰鐭ヨ瘑搴撶暀鍑虹殑绌洪棿銆俓n寤鸿灏嗗叾璁剧疆鍦ㄤ笁鍒嗕箣浜屼互涓嬨�俓ngpt-4-1106-preview銆乬pt-4-vision-preview 鏈�澶ч暱搴� (杈撳叆128k锛岃緭鍑�4k)',
+      maxTokenSettingTip: '鎮ㄨ缃殑鏈�澶� tokens 鏁拌緝澶э紝鍙兘浼氬鑷� prompt銆佺敤鎴烽棶棰樸�佺煡璇嗗簱鍐呭娌℃湁 token 绌洪棿杩涜澶勭悊锛屽缓璁缃埌 2/3 浠ヤ笅銆�',
+      setToCurrentModelMaxTokenTip: '鏈�澶т护鐗屾暟鏇存柊涓哄綋鍓嶆ā鍨嬫渶澶х殑浠ょ墝鏁� {{maxToken}} 鐨� 80%銆�',
+      stop_sequences: '鍋滄搴忓垪 stop_sequences',
+      stop_sequencesTip: '鏈�澶氬洓涓簭鍒楋紝API 灏嗗仠姝㈢敓鎴愭洿澶氱殑 token銆傝繑鍥炵殑鏂囨湰灏嗕笉鍖呭惈鍋滄搴忓垪銆�',
+      stop_sequencesPlaceholder: '杈撳叆搴忓垪骞舵寜 Tab 閿�',
+    },
+    tone: {
+      Creative: '鍒涙剰',
+      Balanced: '骞宠 ',
+      Precise: '绮剧‘',
+      Custom: '鑷畾涔�',
+    },
+    addMoreModel: '娣诲姞鏇村妯″瀷',
+    settingsLink: '妯″瀷璁剧疆',
+    capabilities: '澶氭ā鎬佽兘鍔�',
+  },
+  menus: {
+    status: 'beta',
+    explore: '鎺㈢储',
+    apps: '宸ヤ綔瀹�',
+    plugins: '鎻掍欢',
+    exploreMarketplace: '鎺㈢储 Marketplace',
+    pluginsTips: '闆嗘垚绗笁鏂规彃浠舵垨鍒涘缓涓� ChatGPT 鍏煎鐨� AI 鎻掍欢銆�',
+    datasets: '鐭ヨ瘑搴�',
+    datasetsTips: '鍗冲皢鍒版潵: 涓婁紶鑷繁鐨勯暱鏂囨湰鏁版嵁锛屾垨閫氳繃 Webhook 闆嗘垚鑷繁鐨勬暟鎹簮',
+    newApp: '鍒涘缓搴旂敤',
+    newDataset: '鍒涘缓鐭ヨ瘑搴�',
+    tools: '宸ュ叿',
+  },
+  userProfile: {
+    settings: '璁剧疆',
+    emailSupport: '閭欢鏀寔',
+    workspace: '宸ヤ綔绌洪棿',
+    createWorkspace: '鍒涘缓宸ヤ綔绌洪棿',
+    helpCenter: '甯姪鏂囨。',
+    support: '鏀寔',
+    compliance: '鍚堣',
+    communityFeedback: '鐢ㄦ埛鍙嶉',
+    roadmap: '璺嚎鍥�',
+    github: 'GitHub',
+    community: '绀惧尯',
+    about: '鍏充簬',
+    logout: '鐧诲嚭',
+  },
+  compliance: {
+    soc2Type1: 'SOC 2 Type I Report',
+    soc2Type2: 'SOC 2 Type II Report',
+    iso27001: 'ISO 27001:2022 Certification',
+    gdpr: 'GDPR DPA',
+    sandboxUpgradeTooltip: '浠呴�傜敤浜� Professional 鎴� Team 鐗堣鍒掋��',
+    professionalUpgradeTooltip: '浠呴�傜敤浜� Team 鐗堣鍒掓垨浠ヤ笂銆�',
+  },
+  settings: {
+    accountGroup: '閫氱敤',
+    workplaceGroup: '宸ヤ綔绌洪棿',
+    generalGroup: '閫氱敤',
+    account: '鎴戠殑璐︽埛',
+    members: '鎴愬憳',
+    billing: '璐﹀崟',
+    integrations: '闆嗘垚',
+    language: '璇█',
+    provider: '妯″瀷渚涘簲鍟�',
+    dataSource: '鏁版嵁鏉ユ簮',
+    plugin: '鎻掍欢',
+    apiBasedExtension: 'API 鎵╁睍',
+  },
+  account: {
+    account: '璐︽埛',
+    myAccount: '鎴戠殑璐︽埛',
+    studio: 'Dify 宸ヤ綔瀹�',
+    avatar: '澶村儚',
+    name: '鐢ㄦ埛鍚�',
+    email: '閭',
+    password: '瀵嗙爜',
+    passwordTip: '濡傛灉鎮ㄤ笉鎯充娇鐢ㄩ獙璇佺爜鐧诲綍锛屽彲浠ヨ缃案涔呭瘑鐮�',
+    setPassword: '璁剧疆瀵嗙爜',
+    resetPassword: '閲嶇疆瀵嗙爜',
+    currentPassword: '鍘熷瘑鐮�',
+    newPassword: '鏂板瘑鐮�',
+    notEqual: '涓や釜瀵嗙爜涓嶇浉鍚�',
+    confirmPassword: '纭瀵嗙爜',
+    langGeniusAccount: 'Dify 璐﹀彿',
+    langGeniusAccountTip: '鎮ㄧ殑 Dify 璐﹀彿鍜岀浉鍏崇殑鐢ㄦ埛鏁版嵁銆�',
+    editName: '缂栬緫鍚嶅瓧',
+    showAppLength: '鏄剧ず {{length}} 涓簲鐢�',
+    delete: '鍒犻櫎璐︽埛',
+    deleteTip: '璇锋敞鎰忥紝涓�鏃︾‘璁わ紝浣滀负浠讳綍绌洪棿鐨勬墍鏈夎�咃紝鎮ㄧ殑绌洪棿灏嗚瀹夋帓杩涘叆姘镐箙鍒犻櫎闃熷垪锛屾偍鐨勬墍鏈夌敤鎴锋暟鎹篃灏嗚鎺掑叆姘镐箙鍒犻櫎闃熷垪銆�',
+    deletePrivacyLinkTip: '鏈夊叧鎴戜滑濡備綍澶勭悊鎮ㄧ殑鏁版嵁鐨勬洿澶氫俊鎭紝璇峰弬闃呮垜浠殑',
+    deletePrivacyLink: '闅愮鏀跨瓥',
+    deleteSuccessTip: '鍒犻櫎璐︽埛闇�瑕佷竴浜涙椂闂淬�傚畬鎴愬悗锛屾垜浠細閫氳繃閭欢閫氱煡鎮ㄣ��',
+    deleteLabel: '璇疯緭鍏ユ偍鐨勯偖绠变互纭',
+    deletePlaceholder: '杈撳叆鎮ㄧ殑閭...',
+    sendVerificationButton: '鍙戦�侀獙璇佺爜',
+    verificationLabel: '楠岃瘉鐮�',
+    verificationPlaceholder: '杈撳叆 6 浣嶆暟瀛楅獙璇佺爜',
+    permanentlyDeleteButton: '姘镐箙鍒犻櫎',
+    feedbackTitle: '鍙嶉',
+    feedbackLabel: '璇峰憡璇夋垜浠偍涓轰粈涔堝垹闄よ处鎴凤紵',
+    feedbackPlaceholder: '閫夊~',
+    editWorkspaceInfo: '缂栬緫宸ヤ綔绌洪棿淇℃伅',
+    workspaceName: '宸ヤ綔绌洪棿鍚嶇О',
+    workspaceIcon: '宸ヤ綔绌洪棿鍥炬爣',
+  },
+  members: {
+    team: '鍥㈤槦',
+    invite: '娣诲姞',
+    name: '濮撳悕',
+    lastActive: '涓婃娲诲姩鏃堕棿',
+    role: '瑙掕壊',
+    pending: '寰呭畾...',
+    owner: '鎵�鏈夎��',
+    admin: '绠$悊鍛�',
+    adminTip: '鑳藉寤虹珛搴旂敤绋嬪簭鍜岀鐞嗗洟闃熻缃�',
+    normal: '鎴愬憳',
+    normalTip: '鍙兘浣跨敤搴旂敤绋嬪簭锛屼笉鑳藉缓绔嬪簲鐢ㄧ▼搴�',
+    editor: '缂栬緫',
+    editorTip: '鑳藉寤虹珛骞剁紪杈戝簲鐢ㄧ▼搴忥紝涓嶈兘绠$悊鍥㈤槦璁剧疆',
+    datasetOperator: '鐭ヨ瘑搴撶鐞嗗憳',
+    datasetOperatorTip: '鍙兘绠$悊鐭ヨ瘑搴�',
+    inviteTeamMember: '娣诲姞鍥㈤槦鎴愬憳',
+    inviteTeamMemberTip: '瀵规柟鍦ㄧ櫥褰曞悗鍙互璁块棶浣犵殑鍥㈤槦鏁版嵁銆�',
+    emailNotSetup: '鐢变簬閭欢鏈嶅姟鍣ㄦ湭璁剧疆锛屾棤娉曞彂閫侀個璇烽偖浠躲�傝灏嗛個璇峰悗鐢熸垚鐨勯個璇烽摼鎺ラ�氱煡鐢ㄦ埛銆�',
+    email: '閭',
+    emailInvalid: '閭鏍煎紡鏃犳晥',
+    emailPlaceholder: '杈撳叆閭',
+    sendInvite: '鍙戦�侀個璇�',
+    invitedAsRole: '閭�璇蜂负{{role}}鐢ㄦ埛',
+    invitationSent: '閭�璇峰凡鍙戦��',
+    invitationSentTip: '閭�璇峰凡鍙戦�侊紝瀵规柟鐧诲綍 Dify 鍚庡嵆鍙闂綘鐨勫洟闃熸暟鎹��',
+    invitationLink: '閭�璇烽摼鎺�',
+    failedInvitationEmails: '閭�璇蜂互涓嬮偖绠卞け璐�',
+    ok: '濂界殑',
+    removeFromTeam: '绉诲嚭鍥㈤槦',
+    removeFromTeamTip: '灏嗗彇娑堝洟闃熻闂�',
+    setAdmin: '璁句负绠$悊鍛�',
+    setMember: '璁句负鏅�氭垚鍛�',
+    setEditor: '璁句负缂栬緫',
+    disInvite: '鍙栨秷閭�璇�',
+    deleteMember: '鍒犻櫎鎴愬憳',
+    you: '锛堜綘锛�',
+    builderTip: '鍙互鏋勫缓鍜岀紪杈戣嚜宸辩殑搴旂敤绋嬪簭',
+    setBuilder: 'Set as builder 锛堣缃负鏋勫缓鍣級',
+    builder: '鏋勫缓鍣�',
+  },
+  integrations: {
+    connected: '鐧诲綍鏂瑰紡',
+    google: 'Google',
+    googleAccount: 'Google 璐﹀彿鐧诲綍',
+    github: 'GitHub',
+    githubAccount: 'GitHub 璐﹀彿鐧诲綍',
+    connect: '缁戝畾',
+  },
+  language: {
+    displayLanguage: '鐣岄潰璇█',
+    timezone: '鏃跺尯',
+  },
+  provider: {
+    apiKey: 'API 瀵嗛挜',
+    enterYourKey: '杈撳叆浣犵殑 API 瀵嗛挜',
+    invalidKey: '鏃犳晥鐨� OpenAI API 瀵嗛挜',
+    validatedError: '鏍¢獙澶辫触锛�',
+    validating: '楠岃瘉瀵嗛挜涓�...',
+    saveFailed: 'API 瀵嗛挜淇濆瓨澶辫触',
+    apiKeyExceedBill: '姝� API KEY 宸叉病鏈夊彲鐢ㄩ厤棰濓紝璇烽槄璇�',
+    addKey: '娣诲姞 瀵嗛挜',
+    comingSoon: '鍗冲皢鎺ㄥ嚭',
+    editKey: '缂栬緫',
+    invalidApiKey: '鏃犳晥鐨� API 瀵嗛挜',
+    azure: {
+      apiBase: 'API Base',
+      apiBasePlaceholder: '杈撳叆鎮ㄧ殑 Azure OpenAI API Base 鍦板潃',
+      apiKey: 'API Key',
+      apiKeyPlaceholder: '杈撳叆浣犵殑 API 瀵嗛挜',
+      helpTip: '浜嗚В Azure OpenAI Service',
+    },
+    openaiHosted: {
+      openaiHosted: '鎵樼 OpenAI',
+      onTrial: '浣撻獙',
+      exhausted: '瓒呭嚭闄愰',
+      desc: '鎵樼 OpenAI 鐢� Dify 鎻愪緵鐨勬墭绠� OpenAI 鏈嶅姟锛屼綘鍙互浣跨敤 GPT-3.5 绛夋ā鍨嬶紝鍦ㄤ綋楠岄搴︽秷鑰楀畬姣曞墠浣犻渶瑕佽缃叾瀹冩ā鍨嬩緵搴斿晢銆�',
+      callTimes: '璋冪敤娆℃暟',
+      usedUp: '璇曠敤棰濆害宸茬敤瀹岋紝璇峰湪涓嬫柟娣诲姞鑷繁鐨勬ā鍨嬩緵搴斿晢',
+      useYourModel: '褰撳墠姝e湪浣跨敤浣犺嚜宸辩殑妯″瀷渚涘簲鍟嗐��',
+      close: '鍏抽棴',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: '浣撻獙',
+      exhausted: '瓒呭嚭闄愰',
+      desc: '鍔熻兘寮哄ぇ鐨勬ā鍨嬶紝鎿呴暱鎵ц浠庡鏉傚璇濆拰鍒涙剰鍐呭鐢熸垚鍒拌缁嗘寚瀵肩殑鍚勭浠诲姟銆�',
+      callTimes: '璋冪敤娆℃暟',
+      usedUp: '璇曠敤棰濆害宸茬敤瀹岋紝璇峰湪涓嬫柟娣诲姞鑷繁鐨勬ā鍨嬩緵搴斿晢',
+      useYourModel: '褰撳墠姝e湪浣跨敤浣犺嚜宸辩殑妯″瀷渚涘簲鍟嗐��',
+      close: '鍏抽棴',
+      trialQuotaTip: '鎮ㄧ殑 Anthropic 浣撻獙棰濆害灏嗕簬 2025/03/17 杩囨湡锛岃繃鏈熷悗灏嗘棤娉曚娇鐢紝璇峰敖蹇綋楠屻��',
+    },
+    anthropic: {
+      using: '宓屽叆鑳藉姏姝e湪浣跨敤',
+      enableTip: '瑕佸惎鐢� Anthropic 妯″瀷锛屾偍闇�瑕佸厛缁戝畾 OpenAI 鎴� Azure OpenAI 鏈嶅姟銆�',
+      notEnabled: '鏈惎鐢�',
+      keyFrom: '浠� Anthropic 鑾峰彇鎮ㄧ殑 API 瀵嗛挜',
+    },
+    encrypted: {
+      front: '瀵嗛挜灏嗕娇鐢� ',
+      back: ' 鎶�鏈繘琛屽姞瀵嗗拰瀛樺偍銆�',
+    },
+  },
+  modelProvider: {
+    notConfigured: '绯荤粺妯″瀷灏氭湭瀹屽叏閰嶇疆',
+    systemModelSettings: '绯荤粺妯″瀷璁剧疆',
+    systemModelSettingsLink: '涓轰粈涔堥渶瑕佽缃郴缁熸ā鍨嬶紵',
+    selectModel: '閫夋嫨鎮ㄧ殑妯″瀷',
+    setupModelFirst: '璇峰厛璁剧疆鎮ㄧ殑妯″瀷',
+    systemReasoningModel: {
+      key: '绯荤粺鎺ㄧ悊妯″瀷',
+      tip: '璁剧疆鍒涘缓搴旂敤浣跨敤鐨勯粯璁ゆ帹鐞嗘ā鍨嬶紝浠ュ強瀵硅瘽鍚嶇О鐢熸垚銆佷笅涓�姝ラ棶棰樺缓璁瓑鍔熻兘涔熶細浣跨敤璇ラ粯璁ゆ帹鐞嗘ā鍨嬨��',
+    },
+    embeddingModel: {
+      key: 'Embedding 妯″瀷',
+      tip: '璁剧疆鐭ヨ瘑搴撴枃妗e祵鍏ュ鐞嗙殑榛樿妯″瀷锛屾绱㈠拰瀵煎叆鐭ヨ瘑搴撳潎浣跨敤璇mbedding妯″瀷杩涜鍚戦噺鍖栧鐞嗭紝鍒囨崲鍚庡皢瀵艰嚧宸插鍏ョ殑鐭ヨ瘑搴撲笌闂涔嬮棿鐨勫悜閲忕淮搴︿笉涓�鑷达紝浠庤�屽鑷存绱㈠け璐ャ�備负閬垮厤妫�绱㈠け璐ワ紝璇峰嬁闅忔剰鍒囨崲璇ユā鍨嬨��',
+      required: '璇烽�夋嫨 Embedding 妯″瀷',
+    },
+    speechToTextModel: {
+      key: '璇煶杞枃鏈ā鍨�',
+      tip: '璁剧疆瀵硅瘽涓闊宠浆鏂囧瓧杈撳叆鐨勯粯璁や娇鐢ㄦā鍨嬨��',
+    },
+    ttsModel: {
+      key: '鏂囨湰杞闊虫ā鍨�',
+      tip: '璁剧疆瀵硅瘽涓枃瀛楄浆璇煶杈撳嚭鐨勯粯璁や娇鐢ㄦā鍨嬨��',
+    },
+    rerankModel: {
+      key: 'Rerank 妯″瀷',
+      tip: '閲嶆帓搴忔ā鍨嬪皢鏍规嵁鍊欓�夋枃妗e垪琛ㄤ笌鐢ㄦ埛闂璇箟鍖归厤搴﹁繘琛岄噸鏂版帓搴忥紝浠庤�屾敼杩涜涔夋帓搴忕殑缁撴灉',
+    },
+    quota: '棰濆害',
+    searchModel: '鎼滅储妯″瀷',
+    noModelFound: '鎵句笉鍒版ā鍨� {{model}}',
+    models: '妯″瀷鍒楄〃',
+    showMoreModelProvider: '鏄剧ず鏇村妯″瀷鎻愪緵鍟�',
+    selector: {
+      tip: '璇ユā鍨嬪凡琚垹闄ゃ�傝娣绘ā鍨嬫垨閫夋嫨鍏朵粬妯″瀷銆�',
+      emptyTip: '鏃犲彲鐢ㄦā鍨�',
+      emptySetting: '璇峰墠寰�璁剧疆杩涜閰嶇疆',
+      rerankTip: '璇疯缃� Rerank 妯″瀷',
+    },
+    card: {
+      quota: '棰濆害',
+      onTrial: '璇曠敤涓�',
+      paid: '宸茶喘涔�',
+      quotaExhausted: '閰嶉宸茬敤瀹�',
+      callTimes: '璋冪敤娆℃暟',
+      tokens: 'Tokens',
+      buyQuota: '璐拱棰濆害',
+      priorityUse: '浼樺厛浣跨敤',
+      removeKey: '鍒犻櫎 API 瀵嗛挜',
+      tip: '宸蹭粯璐归搴﹀皢浼樺厛鑰冭檻銆� 璇曠敤棰濆害灏嗗湪浠樿垂棰濆害鐢ㄥ畬鍚庝娇鐢ㄣ��',
+    },
+    item: {
+      deleteDesc: '{{modelName}} 琚敤浣滅郴缁熸帹鐞嗘ā鍨嬨�傚垹闄ゅ悗閮ㄥ垎鍔熻兘灏嗘棤娉曚娇鐢ㄣ�傝纭銆�',
+      freeQuota: '鍏嶈垂棰濆害',
+    },
+    addApiKey: '娣诲姞鎮ㄧ殑 API 瀵嗛挜',
+    invalidApiKey: 'Invalid API key',
+    encrypted: {
+      front: '鎮ㄧ殑瀵嗛挜灏嗕娇鐢�',
+      back: '鎶�鏈繘琛屽姞瀵嗗拰瀛樺偍銆�',
+    },
+    freeQuota: {
+      howToEarn: '濡備綍鑾峰彇',
+    },
+    addMoreModelProvider: '娣诲姞鏇村妯″瀷鎻愪緵鍟�',
+    addModel: '娣诲姞妯″瀷',
+    modelsNum: '{{num}} 涓ā鍨�',
+    showModels: '鏄剧ず妯″瀷',
+    showModelsNum: '鏄剧ず {{num}} 涓ā鍨�',
+    collapse: '鏀惰捣',
+    config: '閰嶇疆',
+    modelAndParameters: '妯″瀷鍙婂弬鏁�',
+    model: '妯″瀷',
+    featureSupported: '鏀寔 {{feature}} 鍔熻兘',
+    callTimes: '璋冪敤娆℃暟',
+    credits: '娑堟伅棰濆害',
+    buyQuota: '璐拱棰濆害',
+    getFreeTokens: '鑾峰緱鍏嶈垂 Tokens',
+    priorityUsing: '浼樺厛浣跨敤',
+    deprecated: '宸插純鐢�',
+    confirmDelete: '纭鍒犻櫎?',
+    quotaTip: '鍓╀綑鍏嶈垂棰濆害',
+    loadPresets: '鍔犺浇棰勮',
+    parameters: '鍙傛暟',
+    loadBalancing: '璐熻浇鍧囪 ',
+    loadBalancingDescription: '涓轰簡鍑忚交鍗曠粍鍑嵁鐨勫帇鍔涳紝鎮ㄥ彲浠ヤ负妯″瀷璋冪敤閰嶇疆澶氱粍鍑嵁銆�',
+    loadBalancingHeadline: '璐熻浇鍧囪 ',
+    configLoadBalancing: '璁剧疆璐熻浇鍧囪 ',
+    modelHasBeenDeprecated: '璇ユā鍨嬪凡搴熷純',
+    providerManaged: '鐢辨ā鍨嬩緵搴斿晢绠$悊',
+    providerManagedDescription: '浣跨敤妯″瀷渚涘簲鍟嗘彁渚涚殑鍗曠粍鍑嵁',
+    defaultConfig: '榛樿閰嶇疆',
+    apiKeyStatusNormal: 'API Key 姝e父',
+    apiKeyRateLimit: '宸茶揪棰戠巼涓婇檺锛寋{seconds}}绉掑悗鎭㈠',
+    addConfig: '澧炲姞閰嶇疆',
+    editConfig: '淇敼閰嶇疆',
+    loadBalancingLeastKeyWarning: '鑷冲皯鍚敤 2 涓� Key 浠ヤ娇鐢ㄨ礋杞藉潎琛�',
+    loadBalancingInfo: '榛樿鎯呭喌涓嬶紝璐熻浇鍧囪 浣跨敤 Round-robin 绛栫暐銆傚鏋滆Е鍙戦�熺巼闄愬埗锛屽皢搴旂敤 1 鍒嗛挓鐨勫喎鍗存椂闂�',
+    upgradeForLoadBalancing: '鍗囩骇浠ヨВ閿佽礋杞藉潎琛″姛鑳�',
+    apiKey: 'API 瀵嗛挜',
+    toBeConfigured: '寰呴厤缃�',
+    configureTip: '璇烽厤缃� API 瀵嗛挜锛屾坊鍔犳ā鍨嬨��',
+    installProvider: '瀹夎妯″瀷渚涘簲鍟�',
+    discoverMore: '鍙戠幇鏇村灏卞湪',
+    emptyProviderTitle: '灏氭湭瀹夎妯″瀷渚涘簲鍟�',
+    emptyProviderTip: '璇峰畨瑁呮ā鍨嬩緵搴斿晢銆�',
+  },
+  dataSource: {
+    add: '娣诲姞鏁版嵁婧�',
+    connect: '缁戝畾',
+    configure: '閰嶇疆',
+    notion: {
+      title: 'Notion',
+      description: '浣跨敤 Notion 浣滀负鐭ヨ瘑搴撶殑鏁版嵁婧愩��',
+      connectedWorkspace: '宸茬粦瀹氬伐浣滅┖闂�',
+      addWorkspace: '娣诲姞宸ヤ綔绌洪棿',
+      connected: '宸茬粦瀹�',
+      disconnected: '鏈粦瀹�',
+      changeAuthorizedPages: '鏇存敼鎺堟潈椤甸潰',
+      pagesAuthorized: '宸叉巿鏉冮〉闈�',
+      sync: '鍚屾',
+      remove: '鍒犻櫎',
+      selector: {
+        pageSelected: '宸查�夐〉闈�',
+        searchPages: '鎼滅储椤甸潰...',
+        noSearchResult: '鏃犳悳绱㈢粨鏋�',
+        addPages: '娣诲姞椤甸潰',
+        preview: '棰勮',
+      },
+    },
+    website: {
+      title: '缃戠珯',
+      description: '浣跨敤缃戠粶鐖櫕浠庣綉绔欏鍏ュ唴瀹广��',
+      with: '浣跨敤',
+      configuredCrawlers: '宸查厤缃殑鐖櫕',
+      active: '鍙敤',
+      inactive: '涓嶅彲鐢�',
+    },
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'API Key',
+      apiKeyPlaceholder: '杈撳叆浣犵殑 API 瀵嗛挜',
+      keyFrom: '浠� SerpAPI 甯愭埛椤甸潰鑾峰彇鎮ㄧ殑 SerpAPI 瀵嗛挜',
+    },
+  },
+  apiBasedExtension: {
+    title: 'API 鎵╁睍鎻愪緵浜嗕竴涓泦涓紡鐨� API 绠$悊锛屽湪姝ょ粺涓�娣诲姞 API 閰嶇疆鍚庯紝鏂逛究鍦� Dify 涓婄殑鍚勭被搴旂敤涓洿鎺ヤ娇鐢ㄣ��',
+    link: '浜嗚В濡備綍寮�鍙戞偍鑷繁鐨� API 鎵╁睍銆�',
+    linkUrl: 'https://docs.dify.ai/zh-hans/guides/extension/api-based-extension',
+    add: '鏂板 API 鎵╁睍',
+    selector: {
+      title: 'API 鎵╁睍',
+      placeholder: '璇烽�夋嫨 API 鎵╁睍',
+      manage: '绠$悊 API 鎵╁睍',
+    },
+    modal: {
+      title: '鏂板 API 鎵╁睍',
+      editTitle: '缂栬緫 API 鎵╁睍',
+      name: {
+        title: '鍚嶇О',
+        placeholder: '璇疯緭鍏ュ悕绉�',
+      },
+      apiEndpoint: {
+        title: 'API Endpoint',
+        placeholder: '璇疯緭鍏� API endpoint',
+      },
+      apiKey: {
+        title: 'API-key',
+        placeholder: '璇疯緭鍏� API-key',
+        lengthError: 'API-key 涓嶈兘灏戜簬 5 浣�',
+      },
+    },
+    type: '绫诲瀷',
+  },
+  about: {
+    changeLog: '鏇存柊鏃ュ織',
+    updateNow: '鐜板湪鏇存柊',
+    nowAvailable: 'Dify {{version}} 鐜板凡鍙敤銆�',
+    latestAvailable: 'Dify {{version}} 宸叉槸鏈�鏂扮増鏈��',
+  },
+  appMenus: {
+    overview: '鐩戞祴',
+    promptEng: '缂栨帓',
+    apiAccess: '璁块棶 API',
+    logAndAnn: '鏃ュ織涓庢爣娉�',
+    logs: '鏃ュ織',
+  },
+  environment: {
+    testing: '娴嬭瘯鐜',
+    development: '寮�鍙戠幆澧�',
+  },
+  appModes: {
+    completionApp: '鏂囨湰鐢熸垚鍨嬪簲鐢�',
+    chatApp: '瀵硅瘽鍨嬪簲鐢�',
+  },
+  datasetMenus: {
+    documents: '鏂囨。',
+    hitTesting: '鍙洖娴嬭瘯',
+    settings: '璁剧疆',
+    emptyTip: '姝ょ煡璇嗗皻鏈泦鎴愬埌浠讳綍搴旂敤绋嬪簭涓�傝鍙傞槄鏂囨。浠ヨ幏鍙栨寚瀵笺��',
+    viewDoc: '鏌ョ湅鏂囨。',
+    relatedApp: '涓叧鑱斿簲鐢�',
+    noRelatedApp: '鏃犲叧鑱斿簲鐢�',
+  },
+  voiceInput: {
+    speaking: '鐜板湪璁�...',
+    converting: '姝e湪杞崲涓烘枃鏈�...',
+    notAllow: '楹﹀厠椋庢湭鎺堟潈',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: '閲嶅懡鍚嶄細璇�',
+    conversationName: '浼氳瘽鍚嶇О',
+    conversationNamePlaceholder: '璇疯緭鍏ヤ細璇濆悕绉�',
+    conversationNameCanNotEmpty: '浼氳瘽鍚嶇О蹇呭~',
+    citation: {
+      title: '寮曠敤',
+      linkToDataset: '璺宠浆鑷崇煡璇嗗簱',
+      characters: '瀛楃锛�',
+      hitCount: '鍙洖娆℃暟锛�',
+      vectorHash: '鍚戦噺鍝堝笇锛�',
+      hitScore: '鍙洖寰楀垎锛�',
+    },
+    inputPlaceholder: '鍜屾満鍣ㄤ汉鑱婂ぉ',
+    thinking: '娣卞害鎬濊�冧腑...',
+    thought: '宸叉繁搴︽�濊��',
+    resend: '閲嶆柊鍙戦��',
+  },
+  promptEditor: {
+    placeholder: '鍦ㄨ繖閲屽啓浣犵殑鎻愮ず璇嶏紝杈撳叆\'{\' 鎻掑叆鍙橀噺銆佽緭鍏'/\' 鎻掑叆鎻愮ず鍐呭鍧�',
+    context: {
+      item: {
+        title: '涓婁笅鏂�',
+        desc: '鎻掑叆涓婁笅鏂囨ā鏉�',
+      },
+      modal: {
+        title: '鏈� {{num}} 涓煡璇嗗簱鍦ㄤ笂涓嬫枃涓�',
+        add: '娣诲姞涓婁笅鏂�',
+        footer: '鎮ㄥ彲浠ュ湪涓嬮潰鐨勨�滀笂涓嬫枃鈥濋儴鍒嗕腑绠$悊涓婁笅鏂囥��',
+      },
+    },
+    history: {
+      item: {
+        title: '浼氳瘽鍘嗗彶',
+        desc: '鎻掑叆鍘嗗彶娑堟伅妯℃澘',
+      },
+      modal: {
+        title: '绀轰緥',
+        user: '浣犲ソ',
+        assistant: '浣犲ソ锛佷粖澶╂垜鑳戒负鎮ㄦ彁渚涗粈涔堝府鍔╋紵',
+        edit: '缂栬緫瀵硅瘽瑙掕壊鍚嶇О',
+      },
+    },
+    variable: {
+      item: {
+        title: '鍙橀噺 & 澶栭儴宸ュ叿',
+        desc: '鎻掑叆鍙橀噺鍜屽閮ㄥ伐鍏�',
+      },
+      outputToolDisabledItem: {
+        title: '鍙橀噺',
+        desc: '鎻掑叆鍙橀噺',
+      },
+      modal: {
+        add: '娣诲姞鏂板彉閲�',
+        addTool: '娣诲姞宸ュ叿',
+      },
+    },
+    query: {
+      item: {
+        title: '鏌ヨ鍐呭',
+        desc: '鎻掑叆鐢ㄦ埛鏌ヨ妯℃澘',
+      },
+    },
+    existed: 'Prompt 涓凡瀛樺湪',
+  },
+  imageUploader: {
+    uploadFromComputer: '浠庢湰鍦颁笂浼�',
+    uploadFromComputerReadError: '鍥剧墖璇诲彇澶辫触锛岃閲嶆柊閫夋嫨銆�',
+    uploadFromComputerUploadError: '鍥剧墖涓婁紶澶辫触锛岃閲嶆柊涓婁紶銆�',
+    uploadFromComputerLimit: '涓婁紶鍥剧墖涓嶈兘瓒呰繃 {{size}} MB',
+    pasteImageLink: '绮樿创鍥剧墖閾炬帴',
+    pasteImageLinkInputPlaceholder: '灏嗗浘鍍忛摼鎺ョ矘璐村埌姝ゅ',
+    pasteImageLinkInvalid: '鍥剧墖閾炬帴鏃犳晥',
+    imageUpload: '鍥剧墖涓婁紶',
+  },
+  fileUploader: {
+    uploadFromComputer: '浠庢湰鍦颁笂浼�',
+    pasteFileLink: '绮樿创鏂囦欢閾炬帴',
+    pasteFileLinkInputPlaceholder: '杈撳叆鏂囦欢閾炬帴',
+    uploadFromComputerReadError: '鏂囦欢璇诲彇澶辫触锛岃閲嶆柊閫夋嫨銆�',
+    uploadFromComputerUploadError: '鏂囦欢涓婁紶澶辫触锛岃閲嶆柊涓婁紶銆�',
+    uploadFromComputerLimit: '涓婁紶 {{type}} 涓嶈兘瓒呰繃 {{size}}',
+    pasteFileLinkInvalid: '鏂囦欢閾炬帴鏃犳晥',
+    fileExtensionNotSupport: '鏂囦欢绫诲瀷涓嶆敮鎸�',
+  },
+  tag: {
+    placeholder: '鍏ㄩ儴鏍囩',
+    addNew: '鍒涘缓鏂版爣绛�',
+    noTag: '娌℃湁鏍囩',
+    noTagYet: '杩樻病鏈夋爣绛�',
+    addTag: '娣诲姞鏍囩',
+    editTag: '淇敼鏍囩',
+    manageTags: '绠$悊鏍囩',
+    selectorPlaceholder: '鎼滅储鎴栬�呭垱寤�',
+    create: '鍒涘缓',
+    delete: '鍒犻櫎鏍囩',
+    deleteTip: '鏍囩姝e湪浣跨敤涓紝鏄惁鍒犻櫎锛�',
+    created: '鏍囩鍒涘缓鎴愬姛',
+    failed: '鏍囩鍒涘缓澶辫触',
+  },
+  license: {
+    expiring: '璁稿彲璇佽繕鏈� 1 澶╁埌鏈�',
+    expiring_plural: '璁稿彲璇佽繕鏈� {{count}} 澶╁埌鏈�',
+  },
+  pagination: {
+    perPage: '姣忛〉鏄剧ず',
+  },
+  imageInput: {
+    dropImageHere: '灏嗗浘鐗囨嫋鏀惧埌姝ゅ锛屾垨',
+    browse: '娴忚',
+    supportedFormats: '鏀寔PNG銆丣PG銆丣PEG銆乄EBP鍜孏IF鏍煎紡',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/custom.ts b/i18n/zh-Hans/custom.ts
new file mode 100644
index 0000000..4bec191
--- /dev/null
+++ b/i18n/zh-Hans/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: '瀹氬埗',
+  upgradeTip: {
+    title: '鍗囩骇鎮ㄧ殑璁″垝',
+    des: '鍗囩骇鎮ㄧ殑璁″垝鏉ュ畾鍒舵偍鐨勫搧鐗屻��',
+    prefix: '鍗囩骇鎮ㄧ殑璁″垝浠�',
+    suffix: '瀹氬埗鎮ㄧ殑鍝佺墝銆�',
+  },
+  webapp: {
+    title: '瀹氬埗 WebApp 鍝佺墝',
+    removeBrand: '绉婚櫎 Powered by Dify',
+    changeLogo: '鏇存敼 Powered by Brand 鍥剧墖',
+    changeLogoTip: 'SVG 鎴� PNG 鏍煎紡锛屾渶灏忓昂瀵镐负 40x40px',
+  },
+  app: {
+    title: '瀹氬埗搴旂敤鍝佺墝',
+    changeLogoTip: 'SVG 鎴� PNG 鏍煎紡锛屾渶灏忓昂瀵镐负 80x80px',
+  },
+  upload: '涓婁紶',
+  uploading: '涓婁紶涓�',
+  uploadedFail: '鍥剧墖涓婁紶澶辫触锛岃閲嶆柊涓婁紶銆�',
+  change: '鏇存敼',
+  apply: '搴旂敤',
+  restore: '鎭㈠榛樿',
+  customize: {
+    contactUs: '鑱旂郴鎴戜滑',
+    prefix: '濡傞渶鍦� Dify 鍐呰嚜瀹氫箟鍝佺墝鍥炬爣锛岃',
+    suffix: '鍗囩骇鑷充紒涓氱増銆�',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/dataset-creation.ts b/i18n/zh-Hans/dataset-creation.ts
new file mode 100644
index 0000000..72e2511
--- /dev/null
+++ b/i18n/zh-Hans/dataset-creation.ts
@@ -0,0 +1,216 @@
+const translation = {
+  steps: {
+    header: {
+      fallbackRoute: '鐭ヨ瘑搴�',
+    },
+    one: '閫夋嫨鏁版嵁婧�',
+    two: '鏂囨湰鍒嗘涓庢竻娲�',
+    three: '澶勭悊骞跺畬鎴�',
+  },
+  error: {
+    unavailable: '璇ョ煡璇嗗簱涓嶅彲鐢�',
+  },
+  firecrawl: {
+    configFirecrawl: '閰嶇疆 馃敟Firecrawl',
+    apiKeyPlaceholder: '浠� firecrawl.dev 鑾峰彇 API Key',
+    getApiKeyLinkText: '浠� firecrawl.dev 鑾峰彇鎮ㄧ殑 API Key',
+  },
+  watercrawl: {
+    configWatercrawl: '閰嶇疆 Watercrawl',
+    apiKeyPlaceholder: '浠� watercrawl.dev 鑾峰彇 API Key',
+    getApiKeyLinkText: '浠� watercrawl.dev 鑾峰彇鎮ㄧ殑 API Key',
+  },
+  jinaReader: {
+    configJinaReader: '閰嶇疆 Jina Reader',
+    apiKeyPlaceholder: '浠� jina.ai 鑾峰彇 API Key',
+    getApiKeyLinkText: '浠� jina.ai 鑾峰彇鎮ㄧ殑鍏嶈垂 API Key',
+  },
+  stepOne: {
+    filePreview: '鏂囦欢棰勮',
+    pagePreview: '椤甸潰棰勮',
+    dataSourceType: {
+      file: '瀵煎叆宸叉湁鏂囨湰',
+      notion: '鍚屾鑷� Notion 鍐呭',
+      web: '鍚屾鑷� Web 绔欑偣',
+    },
+    uploader: {
+      title: '涓婁紶鏂囨湰鏂囦欢',
+      button: '鎷栨嫿鏂囦欢鎴栨枃浠跺す鑷虫锛屾垨鑰�',
+      browse: '閫夋嫨鏂囦欢',
+      tip: '宸叉敮鎸� {{supportTypes}}锛屾瘡涓枃浠朵笉瓒呰繃 {{size}}MB銆�',
+      validation: {
+        typeError: '鏂囦欢绫诲瀷涓嶆敮鎸�',
+        size: '鏂囦欢澶ぇ浜嗭紝涓嶈兘瓒呰繃 {{size}}MB',
+        count: '鏆備笉鏀寔澶氫釜鏂囦欢',
+        filesNumber: '鎵归噺涓婁紶闄愬埗 {{filesNumber}}銆�',
+      },
+      cancel: '鍙栨秷',
+      change: '鏇存敼鏂囦欢',
+      failed: '涓婁紶澶辫触',
+    },
+    notionSyncTitle: 'Notion 鏈粦瀹�',
+    notionSyncTip: '鍚屾 Notion 鍐呭鍓嶏紝椤诲厛缁戝畾 Notion 绌洪棿',
+    connect: '鍘荤粦瀹�',
+    cancel: '鍙栨秷',
+    button: '涓嬩竴姝�',
+    emptyDatasetCreation: '鍒涘缓涓�涓┖鐭ヨ瘑搴�',
+    modal: {
+      title: '鍒涘缓绌虹煡璇嗗簱',
+      tip: '绌虹煡璇嗗簱涓繕娌℃湁鏂囨。锛屼綘鍙互鍦ㄤ粖鍚庝换浣曟椂鍊欎笂浼犳枃妗h嚦璇ョ煡璇嗗簱銆�',
+      input: '鐭ヨ瘑搴撳悕绉�',
+      placeholder: '璇疯緭鍏ョ煡璇嗗簱鍚嶇О',
+      nameNotEmpty: '鍚嶇О涓嶈兘涓虹┖',
+      nameLengthInvalid: '鍚嶇О闀垮害涓嶈兘瓒呰繃 40 涓瓧绗�',
+      cancelButton: '鍙栨秷',
+      confirmButton: '鍒涘缓',
+      failed: '鍒涘缓澶辫触',
+    },
+    website: {
+      chooseProvider: '閫夋嫨宸ュ叿',
+      fireCrawlNotConfigured: 'Firecrawl 鏈厤缃�',
+      fireCrawlNotConfiguredDescription: '璇烽厤缃� Firecrawl 鐨� API 瀵嗛挜浠ヤ娇鐢ㄥ畠銆�',
+      jinaReaderNotConfigured: 'Jina Reader 鏈厤缃�',
+      jinaReaderNotConfiguredDescription: '璇烽厤缃� Jina Reader 鐨勫厤璐� API 瀵嗛挜浠ヨ闂畠銆�',
+      waterCrawlNotConfigured: 'Watercrawl 鏈厤缃�',
+      waterCrawlNotConfiguredDescription: '璇烽厤缃� Watercrawl 鐨� API 瀵嗛挜浠ヤ娇鐢ㄥ畠銆�',
+      configure: '閰嶇疆',
+      configureFirecrawl: '閰嶇疆 Firecrawl',
+      configureJinaReader: '閰嶇疆 Jina Reader',
+      run: '杩愯',
+      firecrawlTitle: '浣跨敤 馃敟Firecrawl 鎻愬彇缃戦〉鍐呭',
+      firecrawlDoc: 'Firecrawl 鏂囨。',
+      firecrawlDocLink: 'https://docs.dify.ai/zh-hans/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      jinaReaderTitle: '灏嗘暣涓珯鐐瑰唴瀹硅浆鎹负 Markdown 鏍煎紡',
+      jinaReaderDoc: '浜嗚В鏇村鍏充簬 Jina Reader',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      useSitemap: '浣跨敤 sitemap',
+      useSitemapTooltip: '鏍规嵁 sitemap 鐖彇绔欑偣銆傚惁鍒欙紝Jina Reader 灏嗗熀浜庨〉闈㈢浉鍏虫�ц凯浠g埇鍙栵紝鎶撳彇杈冨皯鐨勯〉闈紝浣嗚川閲忔洿楂樸��',
+      options: '閫夐」',
+      crawlSubPage: '鐖彇瀛愰〉闈�',
+      limit: '闄愬埗鏁伴噺',
+      maxDepth: '鏈�澶ф繁搴�',
+      excludePaths: '鎺掗櫎璺緞',
+      includeOnlyPaths: '浠呭寘鍚矾寰�',
+      extractOnlyMainContent: '浠呮彁鍙栦富瑕佸唴瀹癸紙鏃犳爣棰樸�佸鑸�侀〉鑴氱瓑锛�',
+      exceptionErrorTitle: '杩愯鏃跺彂鐢熷紓甯�:',
+      unknownError: '鏈煡閿欒',
+      totalPageScraped: '鎶撳彇椤甸潰鎬绘暟:',
+      selectAll: '鍏ㄩ��',
+      resetAll: '閲嶇疆鍏ㄩ儴',
+      scrapTimeInfo: '鎬诲叡鍦� {{time}}绉� 鍐呮姄鍙栦簡 {{total}} 涓〉闈�',
+      preview: '棰勮',
+      maxDepthTooltip: '鐩稿浜庤緭鍏� URL 鐨勬渶澶ф姄鍙栨繁搴︺�傛繁搴�0浠呮姄鍙栬緭鍏� URL 鏈韩鐨勯〉闈紝娣卞害1鎶撳彇杈撳叆 URL 鍙婂叾鍚庣殑涓�灞傜洰褰曪紙涓�涓� /锛夛紝渚濇绫绘帹銆�',
+      watercrawlDocLink: '浠庣綉绔欏悓姝�',
+      watercrawlDoc: 'Watercrawl 鏂囨。',
+      configureWatercrawl: '閰嶇疆姘寸埇琛�',
+      watercrawlTitle: '浣跨敤Watercrawl鎻愬彇缃戦〉鍐呭',
+    },
+  },
+  stepTwo: {
+    segmentation: '鍒嗘璁剧疆',
+    auto: '鑷姩鍒嗘涓庢竻娲�',
+    autoDescription: '鑷姩璁剧疆鍒嗘瑙勫垯涓庨澶勭悊瑙勫垯锛屽鏋滀笉浜嗚В杩欎簺鍙傛暟寤鸿閫夋嫨姝ら」',
+    custom: '鑷畾涔�',
+    customDescription: '鑷畾涔夊垎娈佃鍒欍�佸垎娈甸暱搴︿互鍙婇澶勭悊瑙勫垯绛夊弬鏁�',
+    general: '閫氱敤',
+    generalTip: '閫氱敤鏂囨湰鍒嗗潡妯″紡锛屾绱㈠拰鍙洖鐨勫潡鏄浉鍚岀殑',
+    parentChild: '鐖跺瓙鍒嗘',
+    parentChildTip: '浣跨敤鐖跺瓙妯″紡鏃讹紝瀛愬潡鐢ㄤ簬妫�绱紝鐖跺潡鐢ㄤ綔涓婁笅鏂�',
+    parentChunkForContext: '鐖跺潡鐢ㄤ綔涓婁笅鏂�',
+    childChunkForRetrieval: '瀛愬潡鐢ㄤ簬妫�绱�',
+    paragraph: '娈佃惤',
+    paragraphTip: '姝ゆā寮忔牴鎹垎闅旂鍜屾渶澶у潡闀垮害灏嗘枃鏈媶鍒嗕负娈佃惤锛屼娇鐢ㄦ媶鍒嗘枃鏈綔涓烘绱㈢殑鐖跺潡',
+    fullDoc: '鍏ㄦ枃',
+    fullDocTip: '鏁翠釜鏂囨。鐢ㄤ綔鐖跺潡骞剁洿鎺ユ绱€�傝娉ㄦ剰锛屽嚭浜庢�ц兘鍘熷洜锛岃秴杩�10000涓爣璁扮殑鏂囨湰灏嗚鑷姩鎴柇銆�',
+    separator: '鍒嗘鏍囪瘑绗�',
+    separatorTip: '鍒嗛殧绗︽槸鐢ㄤ簬鍒嗛殧鏂囨湰鐨勫瓧绗︺�俓\n\\n 鍜� \\n 鏄父鐢ㄤ簬鍒嗛殧娈佃惤鍜岃鐨勫垎闅旂銆傜敤閫楀彿杩炴帴鍒嗛殧绗︼紙\\n\\n,\\n锛夛紝褰撴钀借秴杩囨渶澶у潡闀垮害鏃讹紝浼氭寜琛岃繘琛屽垎鍓层�備綘涔熷彲浠ヤ娇鐢ㄨ嚜瀹氫箟鐨勭壒娈婂垎闅旂锛堜緥濡� ***锛夈��',
+    separatorPlaceholder: '\\n\\n 鐢ㄤ簬鍒嗘锛沑\n 鐢ㄤ簬鍒嗚',
+    maxLength: '鍒嗘鏈�澶ч暱搴�',
+    maxLengthCheck: '鍒嗘鏈�澶ч暱搴︿笉鑳藉ぇ浜� {{limit}}',
+    overlap: '鍒嗘閲嶅彔闀垮害',
+    overlapTip: '璁剧疆鍒嗘涔嬮棿鐨勯噸鍙犻暱搴﹀彲浠ヤ繚鐣欏垎娈典箣闂寸殑璇箟鍏崇郴锛屾彁鍗囧彫鍥炴晥鏋溿�傚缓璁缃负鏈�澶у垎娈甸暱搴︾殑10%-25%',
+    overlapCheck: '鍒嗘閲嶅彔闀垮害涓嶈兘澶т簬鍒嗘鏈�澶ч暱搴�',
+    rules: '鏂囨湰棰勫鐞嗚鍒�',
+    removeExtraSpaces: '鏇挎崲鎺夎繛缁殑绌烘牸銆佹崲琛岀鍜屽埗琛ㄧ',
+    removeUrlEmails: '鍒犻櫎鎵�鏈� URL 鍜岀數瀛愰偖浠跺湴鍧�',
+    removeStopwords: '鍘婚櫎鍋滅敤璇嶏紝渚嬪 鈥渁鈥濓紝鈥渁n鈥濓紝鈥渢he鈥� 绛�',
+    preview: '棰勮',
+    previewChunk: '棰勮鍧�',
+    reset: '閲嶇疆',
+    indexMode: '绱㈠紩鏂瑰紡',
+    qualified: '楂樿川閲�',
+    highQualityTip: '浣跨敤楂樿川閲忔ā寮忚繘琛屽祵鍏ュ悗锛屾棤娉曞垏鎹㈠洖缁忔祹妯″紡銆�',
+    recommend: '鎺ㄨ崘',
+    qualifiedTip: '璋冪敤宓屽叆妯″瀷澶勭悊鏂囨。浠ュ疄鐜版洿绮剧‘鐨勬绱紝鍙互甯姪LLM鐢熸垚楂樿川閲忕殑绛旀銆�',
+    warning: '璇峰厛瀹屾垚妯″瀷渚涘簲鍟嗙殑 API KEY 璁剧疆銆�.',
+    click: '鍓嶅線璁剧疆',
+    economical: '缁忔祹',
+    economicalTip: '姣忎釜鏁版嵁鍧椾娇鐢�10涓叧閿瘝杩涜妫�绱紝涓嶄細娑堣�椾换浣晅okens锛屼絾浼氫互闄嶄綆妫�绱㈠噯纭�т负浠d环銆�',
+    QATitle: '閲囩敤 Q&A 鍒嗘妯″紡',
+    QATip: '寮�鍚悗灏嗕細娑堣�楅澶栫殑 token',
+    QALanguage: '鍒嗘浣跨敤',
+    useQALanguage: '浣跨敤 Q&A 鍒嗘锛岃瑷�',
+    estimateCost: '鎵ц宓屽叆棰勪及娑堣��',
+    estimateSegment: '棰勪及鍒嗘鏁�',
+    segmentCount: '娈�',
+    calculating: '璁$畻涓�...',
+    fileSource: '棰勫鐞嗘枃妗�',
+    notionSource: '棰勫鐞嗛〉闈�',
+    websiteSource: '棰勫鐞嗛〉闈�',
+    other: '鍜屽叾浠� ',
+    fileUnit: ' 涓枃浠�',
+    notionUnit: ' 涓〉闈�',
+    webpageUnit: ' 涓〉闈�',
+    previousStep: '涓婁竴姝�',
+    nextStep: '淇濆瓨骞跺鐞�',
+    save: '淇濆瓨骞跺鐞�',
+    cancel: '鍙栨秷',
+    sideTipTitle: '涓轰粈涔堣鍒嗘鍜岄澶勭悊锛�',
+    sideTipP1: '鍦ㄥ鐞嗘枃鏈暟鎹椂锛屽垎娈靛拰娓呮礂鏄袱涓噸瑕佺殑棰勫鐞嗘楠ゃ��',
+    sideTipP2: '鍒嗘鐨勭洰鐨勬槸灏嗛暱鏂囨湰鎷嗗垎鎴愯緝灏忕殑娈佃惤锛屼互渚挎ā鍨嬫洿鏈夋晥鍦板鐞嗗拰鐞嗚В銆傝繖鏈夊姪浜庢彁楂樻ā鍨嬬敓鎴愮殑缁撴灉鐨勮川閲忓拰鐩稿叧鎬с��',
+    sideTipP3: '娓呮礂鍒欐槸瀵规枃鏈繘琛岄澶勭悊锛屽垹闄や笉蹇呰鐨勫瓧绗︺�佺鍙锋垨鏍煎紡锛屼娇鐭ヨ瘑搴撴洿鍔犲共鍑�銆佹暣娲侊紝渚夸簬妯″瀷瑙f瀽銆�',
+    sideTipP4: '閫氳繃瀵圭煡璇嗗簱杩涜閫傚綋鐨勫垎娈靛拰娓呮礂锛屽彲浠ユ彁楂樻ā鍨嬪湪瀹為檯搴旂敤涓殑琛ㄧ幇锛屼粠鑰屼负鐢ㄦ埛鎻愪緵鏇村噯纭�佹洿鏈変环鍊肩殑缁撴灉銆�',
+    previewTitle: '鍒嗘棰勮',
+    previewTitleButton: '棰勮',
+    previewButton: '鍒囨崲鑷� Q&A 褰㈠紡',
+    previewSwitchTipStart: '褰撳墠鍒嗘棰勮鏄枃鏈ā寮忥紝鍒囨崲鍒� Q&A 妯″紡灏嗕細',
+    previewSwitchTipEnd: '娑堣�楅澶栫殑 token',
+    characters: '瀛楃',
+    indexSettingTip: '瑕佹洿鏀圭储寮曟柟娉曞拰 embedding 妯″瀷锛岃杞埌',
+    retrievalSettingTip: '瑕佹洿鏀规绱㈡柟娉曪紝璇疯浆鍒�',
+    datasetSettingLink: '鐭ヨ瘑搴撹缃��',
+    previewChunkTip: '鐐瑰嚮宸︿晶鐨勨�滈瑙堝潡鈥濇寜閽潵鍔犺浇棰勮',
+    previewChunkCount: '{{count}} 棰勪及鍧�',
+    switch: '鍒囨崲',
+    qaSwitchHighQualityTipTitle: 'Q&A 鏍煎紡闇�瑕侀珮璐ㄩ噺鐨勭储寮曟柟娉�',
+    qaSwitchHighQualityTipContent: '鐩墠锛屽彧鏈夐珮璐ㄩ噺鐨勭储寮曟柟娉曟敮鎸� Q&A 鏍煎紡鍒嗗潡銆傛偍瑕佸垏鎹㈠埌楂樿川閲忔ā寮忓悧锛�',
+    notAvailableForParentChild: '涓嶆敮鎸佺埗瀛愮储寮�',
+    notAvailableForQA: '涓嶆敮鎸� Q&A 绱㈠紩',
+    parentChildDelimiterTip: '鏂囨湰鍒嗛殧绗︽槸鐢ㄤ簬鍒嗛殧鏂囨湰鐨勫瓧绗︺�傚缓璁敤 \n\n 灏嗗師濮嬫枃妗e垝鍒嗕负杈冨ぇ鐨勭埗绾х墖娈点�傛偍涔熷彲浠ヨ嚜瀹氫箟鐗规畩鍒嗛殧绗︺��',
+    parentChildChunkDelimiterTip: '鏂囨湰鍒嗛殧绗︽槸鐢ㄤ簬鍒嗛殧鏂囨湰鐨勫瓧绗︺�傚缓璁娇鐢� \n 灏嗙埗绾х墖娈垫媶鍒嗕负杈冨皬鐨勫瓙绾х墖娈点�傛偍涔熷彲浠ヨ嚜瀹氫箟鐗规畩鍒嗛殧绗︺��',
+  },
+  stepThree: {
+    creationTitle: '馃帀 鐭ヨ瘑搴撳凡鍒涘缓',
+    creationContent: '鎴戜滑鑷姩涓鸿鐭ヨ瘑搴撹捣浜嗕釜鍚嶇О锛屾偍涔熷彲浠ラ殢鏃朵慨鏀�',
+    label: '鐭ヨ瘑搴撳悕绉�',
+    additionTitle: '馃帀 鏂囨。宸蹭笂浼�',
+    additionP1: '鏂囨。宸蹭笂浼犺嚦鐭ヨ瘑搴擄細',
+    additionP2: '锛屼綘鍙互鍦ㄧ煡璇嗗簱鐨勬枃妗e垪琛ㄤ腑鎵惧埌瀹冦��',
+    stop: '鍋滄澶勭悊',
+    resume: '鎭㈠澶勭悊',
+    navTo: '鍓嶅線鏂囨。',
+    sideTipTitle: '鎺ヤ笅鏉ュ仛浠�涔�',
+    sideTipContent: '褰撴枃妗e畬鎴愮储寮曞鐞嗗悗锛岀煡璇嗗簱鍗冲彲闆嗘垚鑷冲簲鐢ㄥ唴浣滀负涓婁笅鏂囦娇鐢紝浣犲彲浠ュ湪鎻愮ず璇嶇紪鎺掗〉鎵惧埌涓婁笅鏂囪缃�備綘涔熷彲浠ュ垱寤烘垚鍙嫭绔嬩娇鐢ㄧ殑 ChatGPT 绱㈠紩鎻掍欢鍙戝竷銆�',
+    modelTitle: '纭鍋滄绱㈠紩杩囩▼鍚楋紵',
+    modelContent: '濡傛灉鎮ㄩ渶瑕佺◢鍚庢仮澶嶅鐞嗭紝鍒欎粠鍋滄澶勭户缁��',
+    modelButtonConfirm: '纭鍋滄',
+    modelButtonCancel: '鍙栨秷',
+  },
+  otherDataSource: {
+    title: '杩炴帴鍒板叾浠栨暟鎹簮锛�',
+    description: '鐩墠锛孌ify 鐨勭煡璇嗗簱鍙湁鏈夐檺鐨勬暟鎹簮銆傚悜 Dify 鐭ヨ瘑搴撹础鐚暟鎹簮鏄府鍔╂墍鏈夌敤鎴峰寮哄钩鍙扮伒娲绘�у拰寮哄ぇ鍔熻兘鐨勭粷浣虫柟寮忋�傛垜浠殑璐$尞鎸囧崡浣垮叆闂ㄥ彉寰楀鏄撱�傝鐐瑰嚮涓嬮潰鐨勯摼鎺ヤ簡瑙f洿澶氫俊鎭��',
+    learnMore: '浜嗚В鏇村淇℃伅',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/dataset-documents.ts b/i18n/zh-Hans/dataset-documents.ts
new file mode 100644
index 0000000..5ff1b50
--- /dev/null
+++ b/i18n/zh-Hans/dataset-documents.ts
@@ -0,0 +1,393 @@
+const translation = {
+  list: {
+    title: '鏂囨。',
+    desc: '鐭ヨ瘑搴撶殑鎵�鏈夋枃浠堕兘鍦ㄨ繖閲屾樉绀猴紝鏁翠釜鐭ヨ瘑搴撻兘鍙互閾炬帴鍒� Dify 寮曠敤鎴栭�氳繃 Chat 鎻掍欢杩涜绱㈠紩銆�',
+    learnMore: '浜嗚В鏇村',
+    addFile: '娣诲姞鏂囦欢',
+    addPages: '娣诲姞椤甸潰',
+    addUrl: '娣诲姞 URL',
+    table: {
+      header: {
+        fileName: '鍚嶇О',
+        chunkingMode: '鍒嗘妯″紡',
+        words: '瀛楃鏁�',
+        hitCount: '鍙洖娆℃暟',
+        uploadTime: '涓婁紶鏃堕棿',
+        status: '鐘舵��',
+        action: '鎿嶄綔',
+      },
+      rename: '閲嶅懡鍚�',
+      name: '鍚嶇О',
+    },
+    action: {
+      uploadFile: '涓婁紶鏂版枃浠�',
+      settings: '鍒嗘璁剧疆',
+      addButton: '娣诲姞鍒嗘',
+      add: '娣诲姞鏂板垎娈�',
+      batchAdd: '鎵归噺娣诲姞',
+      archive: '褰掓。',
+      unarchive: '鎾ら攢褰掓。',
+      delete: '鍒犻櫎',
+      enableWarning: '褰掓。鐨勬枃浠舵棤娉曞惎鐢�',
+      sync: '鍚屾',
+    },
+    index: {
+      enable: '鍚敤涓�',
+      disable: '绂佺敤涓�',
+      all: '鍏ㄩ儴',
+      enableTip: '璇ユ枃浠跺彲浠ヨ绱㈠紩',
+      disableTip: '璇ユ枃浠舵棤娉曡绱㈠紩',
+    },
+    status: {
+      queuing: '鎺掗槦涓�',
+      indexing: '绱㈠紩涓�',
+      paused: '宸叉殏鍋�',
+      error: '閿欒',
+      available: '鍙敤',
+      enabled: '宸插惎鐢�',
+      disabled: '宸茬鐢�',
+      archived: '宸插綊妗�',
+    },
+    empty: {
+      title: '杩樻病鏈夋枃妗�',
+      upload: {
+        tip: '鎮ㄥ彲浠ヤ笂浼犳枃浠讹紝浠庣綉绔欏悓姝ワ紝鎴栬�呬粠缃戠粶搴旂敤绋嬪簭锛堝姒傚康銆丟itHub 绛夛級鍚屾銆�',
+      },
+      sync: {
+        tip: 'Dify 浼氬畾鏈熶粠鎮ㄧ殑 Notion 涓笅杞芥枃浠跺苟瀹屾垚澶勭悊銆�',
+      },
+    },
+    delete: {
+      title: '纭畾鍒犻櫎鍚楋紵',
+      content: '濡傛灉鎮ㄩ渶瑕佺◢鍚庢仮澶嶅鐞嗭紝鎮ㄥ皢浠庢偍绂诲紑鐨勫湴鏂圭户缁�',
+    },
+    batchModal: {
+      title: '鎵归噺娣诲姞鍒嗘',
+      csvUploadTitle: '灏嗘偍鐨� CSV 鏂囦欢鎷栨斁鍒版澶勶紝鎴�',
+      browse: '閫夋嫨鏂囦欢',
+      tip: 'CSV 鏂囦欢蹇呴』绗﹀悎浠ヤ笅缁撴瀯锛�',
+      question: '闂',
+      answer: '鍥炵瓟',
+      contentTitle: '鍒嗘鍐呭',
+      content: '鍐呭',
+      template: '涓嬭浇妯℃澘',
+      cancel: '鍙栨秷',
+      run: '瀵煎叆',
+      runError: '鎵归噺瀵煎叆澶辫触',
+      processing: '鎵归噺澶勭悊涓�',
+      completed: '瀵煎叆瀹屾垚',
+      error: '瀵煎叆鍑洪敊',
+      ok: '纭畾',
+    },
+  },
+  metadata: {
+    title: '鍏冩暟鎹�',
+    desc: '鏍囪鏂囨。鐨勫厓鏁版嵁鍏佽 AI 鍙婃椂璁块棶瀹冧滑骞朵负鐢ㄦ埛鍏紑鍙傝�冩潵婧愩��',
+    dateTimeFormat: 'YYYY-MM-DD HH:mm',
+    docTypeSelectTitle: '璇烽�夋嫨涓�绉嶆枃妗g被鍨�',
+    docTypeChangeTitle: '鏇存崲鏂囨。绫诲瀷',
+    docTypeSelectWarning: '濡傛灉鏇存敼鏂囨。绫诲瀷锛屽皢涓嶅啀淇濈暀鐜板湪濉厖鐨勫厓鏁版嵁',
+    firstMetaAction: '寮�濮�',
+    placeholder: {
+      add: '杈撳叆',
+      select: '閫夋嫨',
+    },
+    source: {
+      upload_file: '鏂囦欢涓婁紶',
+      notion: '浠� Notion 鍚屾鐨勬枃妗�',
+      github: '浠� Github 鍚屾鐨勪唬鐮�',
+    },
+    type: {
+      book: '涔︾睄',
+      webPage: '缃戦〉',
+      paper: '璁烘枃',
+      socialMediaPost: '绀句氦濯掍綋甯栧瓙',
+      personalDocument: '涓汉鏂囨。',
+      businessDocument: '鍟嗗姟鏂囨。',
+      IMChat: 'IM 鑱婂ぉ璁板綍',
+      wikipediaEntry: '缁村熀鐧剧鏉$洰',
+      notion: '浠� Notion 鍚屾鐨勬枃妗�',
+      github: '浠� Github 鍚屾鐨勪唬鐮�',
+      technicalParameters: '鎶�鏈弬鏁�',
+    },
+    field: {
+      processRule: {
+        processDoc: '棰勫鐞嗘枃妗�',
+        segmentRule: '鍒嗘瑙勫垯',
+        segmentLength: '鍒嗘闀垮害',
+        processClean: '鏂囨湰棰勫鐞嗕笌娓呮礂',
+      },
+      book: {
+        title: '鏍囬',
+        language: '璇█',
+        author: '浣滆��',
+        publisher: '鍑虹増鍟�',
+        publicationDate: '鍑虹増鏃ユ湡',
+        ISBN: 'ISBN',
+        category: '绫诲埆',
+      },
+      webPage: {
+        title: '鏍囬',
+        url: '缃戝潃',
+        language: '璇█',
+        authorPublisher: '浣滆��/鍑虹増鍟�',
+        publishDate: '鍙戝竷鏃ユ湡',
+        topicKeywords: '涓婚/鍏抽敭璇�',
+        description: '鎻忚堪',
+      },
+      paper: {
+        title: '鏍囬',
+        language: '璇█',
+        author: '浣滆��',
+        publishDate: '鍙戝竷鏃ユ湡',
+        journalConferenceName: '鏈熷垔/浼氳鍚嶇О',
+        volumeIssuePage: '鍗�/鏈�/椤电爜',
+        DOI: 'DOI',
+        topicsKeywords: '涓婚/鍏抽敭璇�',
+        abstract: '鎽樿',
+      },
+      socialMediaPost: {
+        platform: '骞冲彴',
+        authorUsername: '浣滆��/鐢ㄦ埛鍚�',
+        publishDate: '鍙戝竷鏃ユ湡',
+        postURL: '甯栧瓙缃戝潃',
+        topicsTags: '涓婚/鏍囩',
+      },
+      personalDocument: {
+        title: '鏍囬',
+        author: '浣滆��',
+        creationDate: '鍒涘缓鏃ユ湡',
+        lastModifiedDate: '鏈�鍚庝慨鏀规棩鏈�',
+        documentType: '鏂囨。绫诲瀷',
+        tagsCategory: '鏍囩/绫诲埆',
+      },
+      businessDocument: {
+        title: '鏍囬',
+        author: '浣滆��',
+        creationDate: '鍒涘缓鏃ユ湡',
+        lastModifiedDate: '鏈�鍚庝慨鏀规棩鏈�',
+        documentType: '鏂囨。绫诲瀷',
+        departmentTeam: '閮ㄩ棬/鍥㈤槦',
+      },
+      IMChat: {
+        chatPlatform: '鑱婂ぉ骞冲彴',
+        chatPartiesGroupName: '鑱婂ぉ鍙備笌鏂�/缇ょ粍鍚嶇О',
+        participants: '鍙備笌鑰�',
+        startDate: '寮�濮嬫棩鏈�',
+        endDate: '缁撴潫鏃ユ湡',
+        topicsKeywords: '涓婚/鍏抽敭璇�',
+        fileType: '鏂囦欢绫诲瀷',
+      },
+      wikipediaEntry: {
+        title: '鏍囬',
+        language: '璇█',
+        webpageURL: '缃戦〉缃戝潃',
+        editorContributor: '缂栬緫/璐$尞鑰�',
+        lastEditDate: '鏈�鍚庣紪杈戞棩鏈�',
+        summaryIntroduction: '鎽樿/浠嬬粛',
+      },
+      notion: {
+        title: '鏍囬',
+        language: '璇█',
+        author: '浣滆��',
+        createdTime: '鍒涘缓鏃堕棿',
+        lastModifiedTime: '鏈�鍚庝慨鏀规椂闂�',
+        url: '缃戝潃',
+        tag: '鏍囩',
+        description: '鎻忚堪',
+      },
+      github: {
+        repoName: '浠撳簱鍚�',
+        repoDesc: '浠撳簱鎻忚堪',
+        repoOwner: '浠撳簱鎵�鏈夎��',
+        fileName: '鏂囦欢鍚�',
+        filePath: '鏂囦欢璺緞',
+        programmingLang: '缂栫▼璇█',
+        url: '缃戝潃',
+        license: '璁稿彲璇�',
+        lastCommitTime: '鏈�鍚庢彁浜ゆ椂闂�',
+        lastCommitAuthor: '鏈�鍚庢彁浜よ��',
+      },
+      originInfo: {
+        originalFilename: '鍘熷鏂囦欢鍚嶇О',
+        originalFileSize: '鍘熷鏂囦欢澶у皬',
+        uploadDate: '涓婁紶鏃ユ湡',
+        lastUpdateDate: '鏈�鍚庢洿鏂版棩鏈�',
+        source: '鏉ユ簮',
+      },
+      technicalParameters: {
+        segmentSpecification: '鍒嗘瑙勫垯',
+        segmentLength: '娈佃惤闀垮害',
+        avgParagraphLength: '骞冲潎娈佃惤闀垮害',
+        paragraphs: '娈佃惤鏁伴噺',
+        hitCount: '鍙洖娆℃暟',
+        embeddingTime: '宓屽叆鏃堕棿',
+        embeddedSpend: '宓屽叆鑺辫垂',
+      },
+    },
+    languageMap: {
+      zh: '涓枃',
+      en: '鑻辨枃',
+      es: '瑗跨彮鐗欒',
+      fr: '娉曡',
+      de: '寰疯',
+      ja: '鏃ヨ',
+      ko: '闊╄',
+      ru: '淇勮',
+      ar: '闃挎媺浼',
+      pt: '钁¤悇鐗欒',
+      it: '鎰忓ぇ鍒╄',
+      nl: '鑽峰叞璇�',
+      pl: '娉㈠叞璇�',
+      sv: '鐟炲吀璇�',
+      tr: '鍦熻�冲叾璇�',
+      he: '甯屼集鏉ヨ',
+      hi: '鍗板湴璇�',
+      da: '涓归害璇�',
+      fi: '鑺叞璇�',
+      no: '鎸▉璇�',
+      hu: '鍖堢墮鍒╄',
+      el: '甯岃厞璇�',
+      cs: '鎹峰厠璇�',
+      th: '娉拌',
+      id: '鍗板害灏艰タ浜氳',
+    },
+    categoryMap: {
+      book: {
+        fiction: '灏忚',
+        biography: '浼犺',
+        history: '鍘嗗彶',
+        science: '绉戝',
+        technology: '鎶�鏈�',
+        education: '鏁欒偛',
+        philosophy: '鍝插',
+        religion: '瀹楁暀',
+        socialSciences: '绀句細绉戝',
+        art: '鑹烘湳',
+        travel: '鏃呰',
+        health: '鍋ュ悍',
+        selfHelp: '鑷姪',
+        businessEconomics: '鍟嗕笟/缁忔祹',
+        cooking: '鐑归オ',
+        childrenYoungAdults: '鍎跨/闈掑皯骞�',
+        comicsGraphicNovels: '婕敾/鍥惧舰灏忚',
+        poetry: '璇楁瓕',
+        drama: '鎴忓墽',
+        other: '鍏朵粬',
+      },
+      personalDoc: {
+        notes: '绗旇',
+        blogDraft: '鍗氬鑽夌',
+        diary: '鏃ヨ',
+        researchReport: '鐮旂┒鎶ュ憡',
+        bookExcerpt: '涔︾睄鎽樺綍',
+        schedule: '鏃ョ▼瀹夋帓',
+        list: '鍒楄〃',
+        projectOverview: '椤圭洰姒傝堪',
+        photoCollection: '鐓х墖闆�',
+        creativeWriting: '鍒涙剰鍐欎綔',
+        codeSnippet: '浠g爜鐗囨',
+        designDraft: '璁捐鑽夌',
+        personalResume: '涓汉绠�鍘�',
+        other: '鍏朵粬',
+      },
+      businessDoc: {
+        meetingMinutes: '浼氳绾',
+        researchReport: '鐮旂┒鎶ュ憡',
+        proposal: '鎻愭',
+        employeeHandbook: '鍛樺伐鎵嬪唽',
+        trainingMaterials: '鍩硅鏉愭枡',
+        requirementsDocument: '闇�姹傛枃妗�',
+        designDocument: '璁捐鏂囨。',
+        productSpecification: '浜у搧瑙勬牸',
+        financialReport: '璐㈠姟鎶ュ憡',
+        marketAnalysis: '甯傚満鍒嗘瀽',
+        projectPlan: '椤圭洰璁″垝',
+        teamStructure: '鍥㈤槦缁撴瀯',
+        policiesProcedures: '鏀跨瓥鍜屾祦绋�',
+        contractsAgreements: '鍚堝悓鍜屽崗璁�',
+        emailCorrespondence: '閭欢寰�鏉�',
+        other: '鍏朵粬',
+      },
+    },
+  },
+  embedding: {
+    processing: '宓屽叆澶勭悊涓�...',
+    paused: '宓屽叆宸插仠姝�',
+    completed: '宓屽叆宸插畬鎴�',
+    error: '宓屽叆鍙戠敓閿欒',
+    docName: '棰勫鐞嗘枃妗�',
+    mode: '鍒嗘妯″紡',
+    segmentLength: '鏈�澶у垎娈甸暱搴�',
+    textCleaning: '鏂囨湰棰勫鐞嗚鍒�',
+    segments: '娈佃惤',
+    highQuality: '楂樿川閲忔ā寮�',
+    economy: '缁忔祹妯″紡',
+    estimate: '棰勪及娑堣��',
+    stop: '鍋滄澶勭悊',
+    pause: '鏆傚仠',
+    resume: '鎭㈠',
+    automatic: '鑷姩',
+    custom: '鑷畾涔�',
+    hierarchical: '鐖跺瓙鍒嗘',
+    previewTip: '娈佃惤棰勮灏嗗湪宓屽叆瀹屾垚鍚庡彲鐢�',
+    parentMaxTokens: '鐖�',
+    childMaxTokens: '瀛�',
+  },
+  segment: {
+    paragraphs: '娈佃惤',
+    chunks_one: '鍒嗘',
+    chunks_other: '鍒嗘',
+    parentChunks_one: '鐖跺垎娈�',
+    parentChunks_other: '鐖跺垎娈�',
+    childChunks_one: '瀛愬垎娈�',
+    childChunks_other: '瀛愬垎娈�',
+    searchResults_zero: '鎼滅储缁撴灉',
+    searchResults_one: '鎼滅储缁撴灉',
+    searchResults_other: '鎼滅储缁撴灉',
+    empty: '鏈壘鍒板垎娈�',
+    clearFilter: '娓呯┖鎼滅储鏉′欢',
+    chunk: '鍒嗘',
+    parentChunk: '鐖跺垎娈�',
+    newChunk: '鏂板垎娈�',
+    childChunk: '瀛愬垎娈�',
+    newChildChunk: '鏂板瓙鍒嗘',
+    keywords: '鍏抽敭璇�',
+    addKeyWord: '娣诲姞鍏抽敭璇�',
+    keywordError: '鍏抽敭璇嶆渶澶ч暱搴︿负 20',
+    characters_one: '瀛楃',
+    characters_other: '瀛楃',
+    hitCount: '鍙洖娆℃暟',
+    vectorHash: '鍚戦噺鍝堝笇锛�',
+    questionPlaceholder: '鍦ㄨ繖閲屾坊鍔犻棶棰�',
+    questionEmpty: '闂涓嶈兘涓虹┖',
+    answerPlaceholder: '鍦ㄨ繖閲屾坊鍔犵瓟妗�',
+    answerEmpty: '绛旀涓嶈兘涓虹┖',
+    contentPlaceholder: '鍦ㄨ繖閲屾坊鍔犲唴瀹�',
+    contentEmpty: '鍐呭涓嶈兘涓虹┖',
+    newTextSegment: '鏂版枃鏈垎娈�',
+    newQaSegment: '鏂伴棶绛斿垎娈�',
+    addChunk: '鏂板鍒嗘',
+    addChildChunk: '鏂板瀛愬垎娈�',
+    addAnother: '杩炵画鏂板',
+    delete: '鍒犻櫎杩欎釜鍒嗘锛�',
+    chunkAdded: '鏂板涓�涓垎娈�',
+    childChunkAdded: '鏂板涓�涓瓙鍒嗘',
+    editChunk: '缂栬緫鍒嗘',
+    editParentChunk: '缂栬緫鐖跺垎娈�',
+    editChildChunk: '缂栬緫瀛愬垎娈�',
+    chunkDetail: '鍒嗘璇︽儏',
+    regenerationConfirmTitle: '鏄惁闇�瑕侀噸鏂扮敓鎴愬瓙鍒嗘锛�',
+    regenerationConfirmMessage: '閲嶆柊鐢熸垚鐨勫瓙鍒嗘灏嗕細瑕嗙洊褰撳墠鐨勫瓙鍒嗘锛屽寘鎷紪杈戣繃鐨勫垎娈靛拰鏂版坊鍔犵殑鍒嗘銆傞噸鏂扮敓鎴愭搷浣滄棤娉曟挙閿�銆�',
+    regeneratingTitle: '姝e湪鐢熸垚瀛愬垎娈�',
+    regeneratingMessage: '鐢熸垚瀛愬垎娈甸渶瑕佷竴浜涙椂闂达紝璇疯�愬績绛夊緟...',
+    regenerationSuccessTitle: '瀛愬垎娈靛凡閲嶆柊鐢熸垚',
+    regenerationSuccessMessage: '鍙互鍏抽棴绐楀彛',
+    edited: '宸茬紪杈�',
+    editedAt: '缂栬緫浜�',
+    expandChunks: '灞曞紑鍒嗘',
+    collapseChunks: '鎶樺彔鍒嗘',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/dataset-hit-testing.ts b/i18n/zh-Hans/dataset-hit-testing.ts
new file mode 100644
index 0000000..88924ed
--- /dev/null
+++ b/i18n/zh-Hans/dataset-hit-testing.ts
@@ -0,0 +1,34 @@
+const translation = {
+  title: '鍙洖娴嬭瘯',
+  settingTitle: '鍙洖璁剧疆',
+  desc: '鏍规嵁缁欏畾鐨勬煡璇㈡枃鏈祴璇曠煡璇嗙殑鍙洖鏁堟灉銆�',
+  dateTimeFormat: 'YYYY-MM-DD HH:mm',
+  records: '璁板綍',
+  table: {
+    header: {
+      source: '鏁版嵁婧�',
+      text: '鏂囨湰',
+      time: '鏃堕棿',
+    },
+  },
+  input: {
+    title: '婧愭枃鏈�',
+    placeholder: '璇疯緭鍏ユ枃鏈紝寤鸿浣跨敤绠�鐭殑闄堣堪鍙ャ��',
+    countWarning: '涓嶈秴杩� 200 涓瓧绗�',
+    indexWarning: '浠呮敮鎸侀珮璐ㄩ噺妯″紡鐭ヨ瘑搴�',
+    testing: '娴嬭瘯',
+  },
+  hit: {
+    title: '{{num}} 涓彫鍥炴钀�',
+    emptyTip: '鍙洖娴嬭瘯缁撴灉灏嗗睍绀哄湪杩欓噷',
+  },
+  noRecentTip: '鏈�杩戞棤鏌ヨ缁撴灉',
+  viewChart: '鏌ョ湅鍚戦噺鍥捐〃',
+  viewDetail: '鏌ョ湅璇︽儏',
+  chunkDetail: '娈佃惤璇︽儏',
+  hitChunks: '鍛戒腑 {{num}} 涓瓙娈佃惤',
+  open: '鎵撳紑',
+  keyword: '鍏抽敭璇�',
+}
+
+export default translation
diff --git a/i18n/zh-Hans/dataset-settings.ts b/i18n/zh-Hans/dataset-settings.ts
new file mode 100644
index 0000000..f23355d
--- /dev/null
+++ b/i18n/zh-Hans/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: '鐭ヨ瘑搴撹缃�',
+  desc: '鍦ㄨ繖閲岋紝鎮ㄥ彲浠ヤ慨鏀规鐭ヨ瘑搴撶殑灞炴�у拰妫�绱㈣缃�',
+  form: {
+    name: '鐭ヨ瘑搴撳悕绉�',
+    namePlaceholder: '璇疯緭鍏ョ煡璇嗗簱鍚嶇О',
+    nameError: '鍚嶇О涓嶈兘涓虹┖',
+    desc: '鐭ヨ瘑搴撴弿杩�',
+    descInfo: '璇峰啓鍑烘竻妤氱殑鏂囧瓧鎻忚堪鏉ユ杩扮煡璇嗗簱鐨勫唴瀹广�傚綋浠庡涓煡璇嗗簱涓繘琛岄�夋嫨鍖归厤鏃讹紝璇ユ弿杩板皢鐢ㄤ綔鍖归厤鐨勫熀纭�銆�',
+    descPlaceholder: '鎻忚堪璇ユ暟鎹泦鐨勫唴瀹广�傝缁嗘弿杩板彲浠ヨ AI 鏇村揩鍦拌闂暟鎹泦鐨勫唴瀹广�傚鏋滀负绌猴紝LangGenius 灏嗕娇鐢ㄩ粯璁ょ殑鍛戒腑绛栫暐銆�',
+    helpText: '瀛︿範濡備綍缂栧啓涓�浠戒紭绉�鐨勬暟鎹泦鎻忚堪銆�',
+    descWrite: '浜嗚В濡備綍缂栧啓鏇村ソ鐨勭煡璇嗗簱鎻忚堪銆�',
+    permissions: '鍙鏉冮檺',
+    permissionsOnlyMe: '鍙湁鎴�',
+    permissionsAllMember: '鎵�鏈夊洟闃熸垚鍛�',
+    permissionsInvitedMembers: '閮ㄥ垎鍥㈤槦鎴愬憳',
+    me: '锛堜綘锛�',
+    indexMethod: '绱㈠紩妯″紡',
+    indexMethodHighQuality: '楂樿川閲�',
+    indexMethodHighQualityTip: '璋冪敤宓屽叆妯″瀷鏉ュ鐞嗘枃妗d互瀹炵幇鏇寸簿纭殑妫�绱紝鍙互甯姪澶ц瑷�妯″瀷鐢熸垚楂樿川閲忕殑鍥炵瓟銆�',
+    upgradeHighQualityTip: '涓�鏃﹀崌绾т负楂樿川閲忔ā寮忥紝灏嗘棤娉曞垏鎹㈠洖缁忔祹妯″紡銆�',
+    indexMethodEconomy: '缁忔祹',
+    indexMethodEconomyTip: '姣忎釜鍧椾娇鐢� 10 涓叧閿瘝杩涜妫�绱紝涓嶆秷鑰� tokens锛屼絾浼氶檷浣庢绱㈠噯纭�с��',
+    embeddingModel: 'Embedding 妯″瀷',
+    embeddingModelTip: '淇敼 Embedding 妯″瀷锛岃鍘�',
+    embeddingModelTipLink: '璁剧疆',
+    retrievalSetting: {
+      title: '妫�绱㈣缃�',
+      method: '妫�绱㈡柟娉�',
+      learnMore: '浜嗚В鏇村',
+      description: '鍏充簬妫�绱㈡柟娉曘��',
+      longDescription: '鍏充簬妫�绱㈡柟娉曪紝鎮ㄥ彲浠ラ殢鏃跺湪鐭ヨ瘑搴撹缃腑鏇存敼姝よ缃��',
+    },
+    externalKnowledgeAPI: '澶栭儴鐭ヨ瘑 API',
+    externalKnowledgeID: '澶栭儴鐭ヨ瘑搴� ID',
+    save: '淇濆瓨',
+    retrievalSettings: '妫�绱㈣缃�',
+    indexMethodChangeToEconomyDisabledTip: '鏃犳硶浠庨珮璐ㄩ噺闄嶇骇涓虹粡娴�',
+    searchModel: '鎼滅储妯″瀷',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/dataset.ts b/i18n/zh-Hans/dataset.ts
new file mode 100644
index 0000000..064ceb3
--- /dev/null
+++ b/i18n/zh-Hans/dataset.ts
@@ -0,0 +1,221 @@
+const translation = {
+  knowledge: '鐭ヨ瘑搴�',
+  chunkingMode: {
+    general: '閫氱敤',
+    parentChild: '鐖跺瓙',
+  },
+  parentMode: {
+    paragraph: '娈佃惤',
+    fullDoc: '鍏ㄦ枃',
+  },
+  externalTag: '澶栭儴',
+  externalAPI: '澶栭儴 API',
+  externalAPIPanelTitle: '澶栭儴鐭ヨ瘑搴� API',
+  externalKnowledgeId: '澶栭儴鐭ヨ瘑搴� ID',
+  externalKnowledgeName: '澶栭儴鐭ヨ瘑搴撳悕绉�',
+  externalKnowledgeDescription: '鐭ヨ瘑搴撴弿杩�',
+  externalKnowledgeIdPlaceholder: '璇疯緭鍏ュ閮ㄧ煡璇嗗簱 ID',
+  externalKnowledgeNamePlaceholder: '璇疯緭鍏ュ閮ㄧ煡璇嗗簱鍚嶇О',
+  externalKnowledgeDescriptionPlaceholder: '鎻忚堪鐭ヨ瘑搴撳唴瀹癸紙鍙�夛級',
+  learnHowToWriteGoodKnowledgeDescription: '浜嗚В濡備綍缂栧啓鑹ソ鐨勭煡璇嗗簱鎻忚堪',
+  externalAPIPanelDescription: '澶栭儴鐭ヨ瘑搴� API 鐢ㄤ簬杩炴帴鍒� Dify 涔嬪鐨勭煡璇嗗簱骞朵粠涓绱㈢煡璇嗐��',
+  externalAPIPanelDocumentation: '浜嗚В濡備綍鍒涘缓澶栭儴鐭ヨ瘑搴� API',
+  localDocs: '鏈湴鏂囨。',
+  documentCount: ' 鏂囨。',
+  wordCount: ' 鍗冨瓧绗�',
+  appCount: ' 鍏宠仈搴旂敤',
+  createDataset: '鍒涘缓鐭ヨ瘑搴�',
+  noExternalKnowledge: '杩樻病鏈夊閮ㄧ煡璇嗗簱 API锛岀偣鍑绘澶勫垱寤�',
+  createExternalAPI: '娣诲姞澶栭儴鐭ヨ瘑搴� API',
+  createNewExternalAPI: '鍒涘缓鏂扮殑澶栭儴鐭ヨ瘑搴揂PI',
+  editExternalAPIFormTitle: '缂栬緫澶栭儴鐭ヨ瘑搴� API',
+  editExternalAPITooltipTitle: '涓叧鑱旂煡璇嗗簱',
+  editExternalAPIConfirmWarningContent: {
+    front: '姝ゅ閮ㄧ煡璇嗗簱 API 宸查摼鎺ュ埌',
+    end: '涓閮ㄧ煡璇嗗簱锛屾淇敼灏嗗簲鐢ㄤ簬鎵�鏈夎繖浜涚煡璇嗗簱銆傛偍纭畾瑕佷繚瀛樻鏇存敼鍚楋紵',
+  },
+  editExternalAPIFormWarning: {
+    front: '姝ゅ閮� API 宸查摼鎺ュ埌',
+    end: '澶栭儴鐭ヨ瘑搴�',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: '鍒犻櫎',
+      end: '锛�',
+    },
+    content: {
+      front: '姝ゅ閮ㄧ煡璇嗗簱 API 宸查摼鎺ュ埌',
+      end: '涓閮ㄧ煡璇嗗簱銆傚垹闄ゆ API 灏嗕娇鎵�鏈夎繖浜涚煡璇嗗簱澶辨晥銆傛偍纭畾瑕佸垹闄ゆ API 鍚楋紵',
+    },
+    noConnectionContent: '鎮ㄧ‘瀹氳鍒犻櫎姝� API 鍚楋紵',
+  },
+  connectDatasetIntro: {
+    title: '濡備綍杩炴帴鍒板閮ㄧ煡璇嗗簱',
+    content: {
+      front: '瑕佽繛鎺ュ埌澶栭儴鐭ヨ瘑搴擄紝鎮ㄩ渶瑕佸厛鍒涘缓涓�涓閮� API銆傝浠旂粏闃呰骞跺弬鑰�',
+      link: '浜嗚В濡備綍鍒涘缓澶栭儴 API',
+      end: '銆傜劧鍚庢壘鍒扮浉搴旂殑鐭ヨ瘑搴� ID 骞跺~鍐欏湪宸︿晶琛ㄥ崟涓�傚鏋滄墍鏈変俊鎭纭紝鐐瑰嚮杩炴帴鎸夐挳鍚庡皢鑷姩璺宠浆鍒扮煡璇嗗簱涓殑妫�绱㈡祴璇曘��',
+    },
+    learnMore: '浜嗚В鏇村',
+  },
+  connectHelper: {
+    helper1: '閫氳繃 API 鍜岀煡璇嗗簱 ID 杩炴帴鍒板閮ㄧ煡璇嗗簱銆傜洰鍓嶏紝',
+    helper2: '浠呮敮鎸佹绱㈠姛鑳�',
+    helper3: '銆傛垜浠己鐑堝缓璁偍鍦ㄤ娇鐢ㄦ鍔熻兘涔嬪墠',
+    helper4: '浠旂粏闃呰甯姪鏂囨。',
+    helper5: '銆�',
+  },
+  connectDataset: '杩炴帴澶栭儴鐭ヨ瘑搴�',
+  createDatasetIntro: '瀵煎叆鎮ㄨ嚜宸辩殑鏂囨湰鏁版嵁鎴栭�氳繃 Webhook 瀹炴椂鍐欏叆鏁版嵁浠ュ寮� LLM 鐨勪笂涓嬫枃銆�',
+  deleteDatasetConfirmTitle: '瑕佸垹闄ょ煡璇嗗簱鍚楋紵',
+  deleteDatasetConfirmContent:
+    '鍒犻櫎鐭ヨ瘑搴撴槸涓嶅彲閫嗙殑銆傜敤鎴峰皢鏃犳硶鍐嶈闂偍鐨勭煡璇嗗簱,鎵�鏈夌殑鎻愮ず閰嶇疆鍜屾棩蹇楀皢琚案涔呭垹闄ゃ��',
+  datasetUsedByApp: '鏌愪簺搴旂敤姝e湪浣跨敤璇ョ煡璇嗗簱銆傚簲鐢ㄥ皢鏃犳硶鍐嶄娇鐢ㄨ鐭ヨ瘑搴�,鎵�鏈夌殑鎻愮ず閰嶇疆鍜屾棩蹇楀皢琚案涔呭垹闄ゃ��',
+  datasetDeleted: '鐭ヨ瘑搴撳凡鍒犻櫎',
+  datasetDeleteFailed: '鍒犻櫎鐭ヨ瘑搴撳け璐�',
+  selectExternalKnowledgeAPI: {
+    placeholder: '閫夋嫨涓�涓閮ㄧ煡璇� API',
+  },
+  didYouKnow: '浣犵煡閬撳悧锛�',
+  intro1: '鐭ヨ瘑搴撳彲浠ヨ闆嗘垚鍒� Dify 搴旂敤涓�',
+  intro2: '浣滀负涓婁笅鏂�',
+  intro3: ',',
+  intro4: '鎴栧彲浠�',
+  intro5: '鍒涘缓',
+  intro6: '涓虹嫭绔嬬殑 ChatGPT 鎻掍欢鍙戝竷浣跨敤',
+  unavailable: '涓嶅彲鐢�',
+  unavailableTip: '鐢变簬 embedding 妯″瀷涓嶅彲鐢紝闇�瑕侀厤缃粯璁� embedding 妯″瀷',
+  datasets: '鐭ヨ瘑搴�',
+  datasetsApi: 'API',
+  externalKnowledgeForm: {
+    connect: '杩炴帴',
+    cancel: '鍙栨秷',
+  },
+  externalAPIForm: {
+    name: '鍚嶇О',
+    endpoint: 'API 绔偣',
+    apiKey: 'API 瀵嗛挜',
+    save: '淇濆瓨',
+    cancel: '鍙栨秷',
+    edit: '缂栬緫',
+    encrypted: {
+      front: '鎮ㄧ殑 API Token 灏嗕娇鐢�',
+      end: '鍔犲瘑骞跺瓨鍌ㄣ��',
+    },
+  },
+  retrieval: {
+    semantic_search: {
+      title: '鍚戦噺妫�绱�',
+      description: '閫氳繃鐢熸垚鏌ヨ宓屽叆骞舵煡璇笌鍏跺悜閲忚〃绀烘渶鐩镐技鐨勬枃鏈垎娈�',
+    },
+    full_text_search: {
+      title: '鍏ㄦ枃妫�绱�',
+      description: '绱㈠紩鏂囨。涓殑鎵�鏈夎瘝姹囷紝浠庤�屽厑璁哥敤鎴锋煡璇换鎰忚瘝姹囷紝骞惰繑鍥炲寘鍚繖浜涜瘝姹囩殑鏂囨湰鐗囨',
+    },
+    hybrid_search: {
+      title: '娣峰悎妫�绱�',
+      description: '鍚屾椂鎵ц鍏ㄦ枃妫�绱㈠拰鍚戦噺妫�绱紝骞跺簲鐢ㄩ噸鎺掑簭姝ラ锛屼粠涓ょ被鏌ヨ缁撴灉涓�夋嫨鍖归厤鐢ㄦ埛闂鐨勬渶浣崇粨鏋滐紝鐢ㄦ埛鍙互閫夋嫨璁剧疆鏉冮噸鎴栭厤缃噸鏂版帓搴忔ā鍨嬨��',
+      recommend: '鎺ㄨ崘',
+    },
+    invertedIndex: {
+      title: '鍊掓帓绱㈠紩',
+      description: '鍊掓帓绱㈠紩鏄竴绉嶇敤浜庨珮鏁堟绱㈢殑缁撴瀯銆傛寜鏈缁勭粐锛屾瘡涓湳璇寚鍚戝寘鍚畠鐨勬枃妗f垨缃戦〉',
+    },
+    change: '鏇存敼',
+    changeRetrievalMethod: '鏇存敼妫�绱㈡柟娉�',
+  },
+  docsFailedNotice: '鏂囨。绱㈠紩澶辫触',
+  retry: '閲嶈瘯',
+  documentsDisabled: '{{num}} 涓枃妗e凡绂佺敤 - 鏈椿鍔ㄨ秴杩� 30 澶�',
+  enable: '鍚敤',
+  indexingTechnique: {
+    high_quality: '楂樿川閲�',
+    economy: '缁忔祹',
+  },
+  indexingMethod: {
+    semantic_search: '鍚戦噺妫�绱�',
+    full_text_search: '鍏ㄦ枃妫�绱�',
+    hybrid_search: '娣峰悎妫�绱�',
+    invertedIndex: '鍊掓帓绱㈠紩',
+  },
+  defaultRetrievalTip: '榛樿鎯呭喌涓嬩娇鐢ㄥ璺彫鍥炪�備粠澶氫釜鐭ヨ瘑搴撲腑妫�绱㈢煡璇嗭紝鐒跺悗閲嶆柊鎺掑簭銆�',
+  mixtureHighQualityAndEconomicTip: '娣峰悎浣跨敤楂樿川閲忓拰缁忔祹鍨嬬煡璇嗗簱闇�瑕侀厤缃� Rerank 妯″瀷銆�',
+  inconsistentEmbeddingModelTip: '褰撴墍閫夌煡璇嗗簱閰嶇疆鐨� Embedding 妯″瀷涓嶄竴鑷存椂锛岄渶瑕侀厤缃� Rerank 妯″瀷銆�',
+  mixtureInternalAndExternalTip: '娣峰悎浣跨敤鍐呴儴鍜屽閮ㄧ煡璇嗘椂闇�瑕侀厤缃� Rerank 妯″瀷銆�',
+  allExternalTip: '浠呬娇鐢ㄥ閮ㄧ煡璇嗘椂锛岀敤鎴峰彲浠ラ�夋嫨鏄惁鍚敤 Rerank 妯″瀷銆傚鏋滀笉鍚敤锛屾绱㈠埌鐨勬枃鏈潡灏嗘牴鎹垎鏁版帓搴忋�傚綋涓嶅悓鐭ヨ瘑搴撶殑妫�绱㈢瓥鐣ヤ笉涓�鑷存椂锛岀粨鏋滃彲鑳戒笉鍑嗙‘銆�',
+  retrievalSettings: '鍙洖璁剧疆',
+  rerankSettings: 'Rerank 璁剧疆',
+  weightedScore: {
+    title: '鏉冮噸璁剧疆',
+    description: '閫氳繃璋冩暣鍒嗛厤鐨勬潈閲嶏紝閲嶆柊鎺掑簭绛栫暐纭畾鏄紭鍏堣繘琛岃涔夊尮閰嶈繕鏄叧閿瓧鍖归厤銆�',
+    semanticFirst: '璇箟浼樺厛',
+    keywordFirst: '鍏抽敭璇嶄紭鍏�',
+    customized: '鑷畾涔�',
+    semantic: '璇箟',
+    keyword: '鍏抽敭璇�',
+  },
+  nTo1RetrievalLegacy: '9 鏈� 1 鏃ヨ捣鎴戜滑灏嗕笉鍐嶆彁渚涙鑳藉姏锛屾帹鑽愪娇鐢ㄦ渶鏂扮殑澶氳矾鍙洖鑾峰緱鏇村ソ鐨勬绱㈡晥鏋溿��',
+  nTo1RetrievalLegacyLink: '浜嗚В鏇村',
+  nTo1RetrievalLegacyLinkText: '9 鏈� 1 鏃ヨ捣鎴戜滑灏嗕笉鍐嶆彁渚涙鑳藉姏銆�',
+  batchAction: {
+    selected: '宸查�夋嫨',
+    enable: '鍚敤',
+    disable: '绂佺敤',
+    archive: '褰掓。',
+    delete: '鍒犻櫎',
+    cancel: '鍙栨秷',
+  },
+  preprocessDocument: '{{num}} 涓澶勭悊鏂囨。',
+  allKnowledge: '鎵�鏈夌煡璇嗗簱',
+  allKnowledgeDescription: '閫夋嫨浠ユ樉绀鸿宸ヤ綔鍖哄唴鎵�鏈夌煡璇嗗簱銆傚彧鏈夊伐浣滃尯鎵�鏈夎�呮墠鑳界鐞嗘墍鏈夌煡璇嗗簱銆�',
+  embeddingModelNotAvailable: 'Embedding 妯″瀷涓嶅彲鐢ㄣ��',
+  metadata: {
+    metadata: '鍏冩暟鎹�',
+    addMetadata: '娣诲姞鍏冩暟鎹�',
+    chooseTime: '閫夋嫨鏃堕棿',
+    createMetadata: {
+      title: '鏂板缓鍏冩暟鎹�',
+      back: '杩斿洖',
+      type: '绫诲瀷',
+      name: '鍚嶇О',
+      namePlaceholder: '娣诲姞鍏冩暟鎹悕绉�',
+    },
+    checkName: {
+      empty: '鍏冩暟鎹悕绉颁笉鑳戒负绌�',
+      invalid: '鍏冩暟鎹悕绉板彧鑳藉寘鍚皬鍐欏瓧姣嶃�佹暟瀛楀拰涓嬪垝绾匡紝骞朵笖蹇呴』浠ュ皬鍐欏瓧姣嶅紑澶�',
+    },
+    batchEditMetadata: {
+      editMetadata: '缂栬緫鍏冩暟鎹�',
+      editDocumentsNum: '缂栬緫 {{num}} 涓枃妗�',
+      applyToAllSelectDocument: '搴旂敤浜庢墍鏈夐�夊畾鏂囨。',
+      applyToAllSelectDocumentTip: '鑷姩涓烘墍鏈夐�夊畾鏂囨。鍒涘缓涓婅堪缂栬緫鍜屾柊鍏冩暟鎹紝鍚﹀垯浠呭鍏锋湁鍏冩暟鎹殑鏂囨。搴旂敤缂栬緫銆�',
+      multipleValue: '澶氫釜鍊�',
+    },
+    selectMetadata: {
+      search: '鎼滅储鍏冩暟鎹�',
+      newAction: '鏂板缓鍏冩暟鎹�',
+      manageAction: '绠$悊',
+    },
+    datasetMetadata: {
+      description: '鍏冩暟鎹槸鍏充簬鏂囨。鐨勬暟鎹紝鐢ㄤ簬鎻忚堪鏂囨。鐨勫睘鎬с�傚厓鏁版嵁鍙互甯姪鎮ㄦ洿濂藉湴缁勭粐鍜岀鐞嗘枃妗c��',
+      addMetaData: '娣诲姞鍏冩暟鎹�',
+      values: '{{num}} 涓��',
+      disabled: '宸茬鐢�',
+      rename: '閲嶅懡鍚�',
+      name: '鍚嶇О',
+      namePlaceholder: '鍏冩暟鎹悕绉�',
+      builtIn: '鍐呯疆',
+      builtInDescription: '鍐呯疆鍏冩暟鎹槸绯荤粺棰勫畾涔夌殑鍏冩暟鎹紝鎮ㄥ彲浠ュ湪姝ゅ鏌ョ湅鍜岀鐞嗗唴缃厓鏁版嵁銆�',
+      deleteTitle: '纭畾鍒犻櫎',
+      deleteContent: '浣犵‘瀹氳鍒犻櫎鍏冩暟鎹� "{{name}}" 鍚�?',
+    },
+    documentMetadata: {
+      metadataToolTip: '鍏冩暟鎹槸鍏充簬鏂囨。鐨勬暟鎹紝鐢ㄤ簬鎻忚堪鏂囨。鐨勫睘鎬с�傚厓鏁版嵁鍙互甯姪鎮ㄦ洿濂藉湴缁勭粐鍜岀鐞嗘枃妗c��',
+      startLabeling: '寮�濮嬫爣娉�',
+      documentInformation: '鏂囨。淇℃伅',
+      technicalParameters: '鎶�鏈弬鏁�',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/education.ts b/i18n/zh-Hans/education.ts
new file mode 100644
index 0000000..9d27698
--- /dev/null
+++ b/i18n/zh-Hans/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerified: '鑾峰彇鏁欒偛鐗堣璇�',
+  toVerifiedTip: {
+    front: '鎮ㄧ幇鍦ㄧ鍚堟暀鑲茬増璁よ瘉鐨勮祫鏍笺�傝鍦ㄤ笅鏂硅緭鍏ユ偍鐨勬暀鑲蹭俊鎭紝浠ュ畬鎴愯璇佹祦绋嬶紝骞堕鍙� Dify  Professional 鐗堢殑',
+    coupon: '100% 鐙浼樻儬鍒�',
+    end: '銆�',
+  },
+  currentSigned: '鎮ㄥ綋鍓嶇櫥褰曠殑璐︽埛鏄�',
+  form: {
+    schoolName: {
+      title: '鎮ㄧ殑瀛︽牎鍚嶇О',
+      placeholder: '璇疯緭鍏ユ偍鐨勫鏍$殑瀹樻柟鍏ㄧО锛堜笉寰楃缉鍐欙級',
+    },
+    schoolRole: {
+      title: '鎮ㄥ湪瀛︽牎鐨勮韩浠�',
+      option: {
+        student: '瀛︾敓',
+        teacher: '鏁欏笀',
+        administrator: '瀛︽牎绠$悊鍛�',
+      },
+    },
+    terms: {
+      title: '鏉℃涓庡崗璁�',
+      desc: {
+        front: '鎮ㄧ殑淇℃伅鍜屾暀鑲茬増璁よ瘉璧勬牸鐨勪娇鐢ㄩ渶閬靛畧鎴戜滑鐨�',
+        and: '鍜�',
+        end: '銆傛彁浜ゅ嵆琛ㄧず锛�',
+        termsOfService: '鏈嶅姟鏉℃',
+        privacyPolicy: '闅愮鏀跨瓥',
+      },
+      option: {
+        age: '鎴戠‘璁ゆ垜宸插勾婊� 18 鍛ㄥ瞾銆�',
+        inSchool: '鎴戠‘璁ゆ垜鐩墠宸插湪鎻愪緵鐨勫鏍″叆瀛︽垨鍙楅泧銆侱ify 鍙兘浼氳姹傛彁渚涘叆瀛�/闆囦剑璇佹槑銆傚鎴戣櫄鎶ヨ祫鏍硷紝鎴戝悓鎰忔敮浠樺洜鏁欒偛鐗堣璇佽�岃鍑忓厤鐨勮垂鐢ㄣ��',
+      },
+    },
+  },
+  submit: '鎻愪氦',
+  submitError: '鎻愪氦琛ㄥ崟澶辫触锛岃绋嶅悗閲嶆柊鎻愪氦闂嵎銆�',
+  learn: '浜嗚В濡備綍鑾峰彇鏁欒偛鐗堣璇�',
+  successTitle: '鎮ㄥ凡鎴愬姛鑾峰緱 Dify 鏁欒偛鐗堣璇侊紒',
+  successContent: '鎴戜滑宸插悜鎮ㄧ殑璐︽埛鍙戞斁 Dify Professional 鐗� 100% 鎶樻墸浼樻儬鍒搞�傝浼樻儬鍒告湁鏁堟湡涓轰竴骞达紝璇峰湪鏈夋晥鏈熷唴浣跨敤銆�',
+  rejectTitle: '鎮ㄧ殑 Dify 鏁欒偛鐗堣璇佸凡琚嫆缁�',
+  rejectContent: '闈炲父閬楁喚锛屾偍鏃犳硶浣跨敤姝ょ數瀛愰偖浠朵互鑾峰緱鏁欒偛鐗堣璇佽祫鏍硷紝涔熸棤娉曢鍙� Dify Professional 鐗堢殑 100% 鐙浼樻儬鍒搞��',
+  emailLabel: '鎮ㄥ綋鍓嶇殑閭',
+}
+
+export default translation
diff --git a/i18n/zh-Hans/explore.ts b/i18n/zh-Hans/explore.ts
new file mode 100644
index 0000000..896a80a
--- /dev/null
+++ b/i18n/zh-Hans/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: '鎺㈢储',
+  sidebar: {
+    discovery: '鍙戠幇',
+    chat: '鏅鸿亰',
+    workspace: '宸ヤ綔鍖�',
+    action: {
+      pin: '缃《',
+      unpin: '鍙栨秷缃《',
+      rename: '閲嶅懡鍚�',
+      delete: '鍒犻櫎',
+    },
+    delete: {
+      title: '鍒犻櫎绋嬪簭',
+      content: '鎮ㄧ‘瀹氳鍒犻櫎姝ょ▼搴忓悧锛�',
+    },
+  },
+  apps: {
+    title: '鎺㈢储 Dify 鐨勫簲鐢�',
+    description: '浣跨敤杩欎簺妯℃澘搴旂敤绋嬪簭锛屾垨鏍规嵁妯℃澘鑷畾涔夋偍鑷繁鐨勫簲鐢ㄧ▼搴忋��',
+    allCategories: '鎺ㄨ崘',
+  },
+  appCard: {
+    addToWorkspace: '娣诲姞鍒板伐浣滃尯',
+    customize: '鑷畾涔�',
+  },
+  appCustomize: {
+    title: '浠� {{name}} 鍒涘缓搴旂敤绋嬪簭',
+    subTitle: '搴旂敤绋嬪簭鍥炬爣鍜屽悕绉�',
+    nameRequired: '搴旂敤绋嬪簭鍚嶇О涓嶈兘涓虹┖',
+  },
+  category: {
+    Agent: 'Agent',
+    Assistant: '鍔╂墜',
+    Writing: '鍐欎綔',
+    Translate: '缈昏瘧',
+    Programming: '缂栫▼',
+    HR: '浜哄姏璧勬簮',
+    Workflow: '宸ヤ綔娴�',
+    Entertainment: '濞变箰',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/layout.ts b/i18n/zh-Hans/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/zh-Hans/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/zh-Hans/login.ts b/i18n/zh-Hans/login.ts
new file mode 100644
index 0000000..7f64c95
--- /dev/null
+++ b/i18n/zh-Hans/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: '鍡紝杩戞潵鍙ソ',
+  welcome: '馃憢 娆㈣繋鏉ュ埌 Dify, 鐧诲綍浠ョ户缁�',
+  email: '閭',
+  emailPlaceholder: '杈撳叆閭鍦板潃',
+  password: '瀵嗙爜',
+  passwordPlaceholder: '杈撳叆瀵嗙爜',
+  name: '鐢ㄦ埛鍚�',
+  namePlaceholder: '杈撳叆鐢ㄦ埛鍚�',
+  forget: '蹇樿瀵嗙爜锛�',
+  signBtn: '鐧诲綍',
+  continueWithCode: '鍙戦�侀獙璇佺爜',
+  sendVerificationCode: '鍙戦�侀獙璇佺爜',
+  usePassword: '浣跨敤瀵嗙爜鐧诲綍',
+  useVerificationCode: '浣跨敤楠岃瘉鐮佺櫥褰�',
+  or: '鎴�',
+  installBtn: '璁剧疆',
+  setAdminAccount: '璁剧疆绠$悊鍛樿处鎴�',
+  setAdminAccountDesc: '绠$悊鍛樻嫢鏈夌殑鏈�澶ф潈闄愶紝鍙敤浜庡垱寤哄簲鐢ㄥ拰绠$悊 LLM 渚涘簲鍟嗙瓑銆�',
+  createAndSignIn: '鍒涘缓璐︽埛',
+  oneMoreStep: '杩樺樊涓�姝�',
+  createSample: '鍩轰簬杩欎簺淇℃伅锛屾垜浠皢涓烘偍鍒涘缓涓�涓ず渚嬪簲鐢�',
+  invitationCode: '閭�璇风爜',
+  invitationCodePlaceholder: '杈撳叆閭�璇风爜',
+  interfaceLanguage: '鐣岄潰璇█',
+  timezone: '鏃跺尯',
+  go: '璺宠浆鑷� Dify',
+  sendUsMail: '鍙戝皝閭欢浠嬬粛浣犺嚜宸憋紝鎴戜滑浼氬敖蹇鐞嗐��',
+  acceptPP: '鎴戝凡闃呰骞舵帴鍙楅殣绉佹斂绛�',
+  reset: '璇疯繍琛屼互涓嬪懡浠ら噸缃瘑鐮�',
+  withGitHub: '浣跨敤 GitHub 鐧诲綍',
+  withGoogle: '浣跨敤 Google 鐧诲綍',
+  withSSO: '浣跨敤 SSO 鐧诲綍',
+  rightTitle: '閲婃斁澶у瀷璇█妯″瀷鐨勫叏閮ㄦ綔鑳�',
+  rightDesc: '绠�鍗曟瀯寤哄彲瑙嗗寲銆佸彲杩愯惀銆佸彲鏀硅繘鐨� AI 搴旂敤',
+  tos: '浣跨敤鍗忚',
+  pp: '闅愮鏀跨瓥',
+  tosDesc: '浣跨敤鍗充唬琛ㄦ偍鍚屾剰鎴戜滑鐨�',
+  goToInit: '濡傛灉鎮ㄨ繕娌℃湁鍒濆鍖栬处鎴凤紝璇峰墠寰�鍒濆鍖栭〉闈�',
+  dontHave: '杩樻病鏈夐個璇风爜锛�',
+  invalidInvitationCode: '鏃犳晥鐨勯個璇风爜',
+  accountAlreadyInited: '璐︽埛宸茬粡鍒濆鍖�',
+  forgotPassword: '蹇樿瀵嗙爜锛�',
+  resetLinkSent: '閲嶇疆閾炬帴宸插彂閫�',
+  sendResetLink: '鍙戦�侀噸缃摼鎺�',
+  backToSignIn: '杩斿洖鐧诲綍',
+  forgotPasswordDesc: '璇疯緭鍏ユ偍鐨勭數瀛愰偖浠跺湴鍧�浠ラ噸缃瘑鐮併�傛垜浠皢鍚戞偍鍙戦�佷竴灏佺數瀛愰偖浠讹紝鍖呭惈濡備綍閲嶇疆瀵嗙爜鐨勮鏄庛��',
+  checkEmailForResetLink: '璇锋鏌ユ偍鐨勭數瀛愰偖浠朵互鑾峰彇閲嶇疆瀵嗙爜鐨勯摼鎺ャ�傚鏋滃嚑鍒嗛挓鍐呮病鏈夋敹鍒帮紝璇锋鏌ユ偍鐨勫瀮鍦鹃偖浠舵枃浠跺す銆�',
+  passwordChanged: '绔嬪嵆鐧诲綍',
+  changePassword: '璁剧疆瀵嗙爜',
+  changePasswordTip: '璇疯緭鍏ユ偍鐨勬柊瀵嗙爜',
+  changePasswordBtn: '璁剧疆瀵嗙爜',
+  invalidToken: '鏃犳晥鎴栧凡杩囨湡鐨勪护鐗�',
+  confirmPassword: '纭瀵嗙爜',
+  confirmPasswordPlaceholder: '纭鎮ㄧ殑鏂板瘑鐮�',
+  passwordChangedTip: '鎮ㄧ殑瀵嗙爜宸叉垚鍔熸洿鏀�',
+  error: {
+    emailEmpty: '閭涓嶈兘涓虹┖',
+    emailInValid: '璇疯緭鍏ユ湁鏁堢殑閭鍦板潃',
+    nameEmpty: '鐢ㄦ埛鍚嶄笉鑳戒负绌�',
+    passwordEmpty: '瀵嗙爜涓嶈兘涓虹┖',
+    passwordInvalid: '瀵嗙爜蹇呴』鍖呭惈瀛楁瘝鍜屾暟瀛楋紝涓旈暱搴︿笉灏忎簬8浣�',
+    passwordLengthInValid: '瀵嗙爜蹇呴』鑷冲皯涓� 8 涓瓧绗�',
+    registrationNotAllowed: '璐︽埛涓嶅瓨鍦紝璇疯仈绯荤郴缁熺鐞嗗憳娉ㄥ唽璐︽埛',
+  },
+  license: {
+    tip: '鍚姩 Dify 绀惧尯鐗堜箣鍓�, 璇烽槄璇� GitHub 涓婄殑',
+    link: '寮�婧愬崗璁�',
+  },
+  join: '鍔犲叆 ',
+  joinTipStart: '閭�璇蜂綘鍔犲叆 ',
+  joinTipEnd: ' 鍥㈤槦',
+  invalid: '閾炬帴宸插け鏁�',
+  explore: '鎺㈢储 Dify',
+  activatedTipStart: '鎮ㄥ凡鍔犲叆',
+  activatedTipEnd: '鍥㈤槦',
+  activated: '鐜板湪鐧诲綍',
+  adminInitPassword: '绠$悊鍛樺垵濮嬪寲瀵嗙爜',
+  validate: '楠岃瘉',
+  sso: '浣跨敤 SSO 缁х画',
+  checkCode: {
+    checkYourEmail: '楠岃瘉鎮ㄧ殑鐢靛瓙閭欢',
+    tips: '楠岃瘉鐮佸凡缁忓彂閫佸埌鎮ㄧ殑閭 <strong>{{email}}</strong>',
+    validTime: '璇锋敞鎰忛獙璇佺爜 5 鍒嗛挓鍐呮湁鏁�',
+    verificationCode: '楠岃瘉鐮�',
+    verificationCodePlaceholder: '杈撳叆 6 浣嶉獙璇佺爜',
+    verify: '楠岃瘉',
+    didNotReceiveCode: '娌℃湁鏀跺埌楠岃瘉鐮侊紵',
+    resend: '閲嶆柊鍙戦��',
+    useAnotherMethod: '浣跨敤鍏朵粬鏂瑰紡鐧诲綍',
+    emptyCode: '楠岃瘉鐮佷笉鑳戒负绌�',
+    invalidCode: '楠岃瘉鐮佹棤鏁�',
+  },
+  resetPassword: '閲嶇疆瀵嗙爜',
+  resetPasswordDesc: '璇疯緭鍏ユ偍鐨勭數瀛愰偖浠跺湴鍧�浠ラ噸缃瘑鐮併�傛垜浠皢鍚戞偍鍙戦�佷竴灏佺數瀛愰偖浠躲��',
+  backToLogin: '杩斿洖鐧诲綍',
+  setYourAccount: '璁剧疆鎮ㄧ殑璐︽埛',
+  enterYourName: '璇疯緭鍏ョ敤鎴峰悕',
+  back: '杩斿洖',
+  noLoginMethod: '鏈厤缃韩浠借璇佹柟寮�',
+  noLoginMethodTip: '璇疯仈绯荤郴缁熺鐞嗗憳娣诲姞韬唤璁よ瘉鏂瑰紡',
+  licenseExpired: '璁稿彲璇佸凡杩囨湡',
+  licenseExpiredTip: '鎮ㄦ墍鍦ㄧ┖闂寸殑 Dify Enterprise 璁稿彲璇佸凡杩囨湡锛岃鑱旂郴绠$悊鍛樹互缁х画浣跨敤 Dify銆�',
+  licenseLost: '璁稿彲璇佷涪澶�',
+  licenseLostTip: '鏃犳硶杩炴帴 Dify 璁稿彲璇佹湇鍔″櫒锛岃鑱旂郴绠$悊鍛樹互缁х画浣跨敤 Dify銆�',
+  licenseInactive: '璁稿彲璇佹湭婵�娲�',
+  licenseInactiveTip: '鎮ㄦ墍鍦ㄧ┖闂寸殑 Dify Enterprise 璁稿彲璇佸皻鏈縺娲伙紝璇疯仈绯荤鐞嗗憳浠ョ户缁娇鐢� Dify銆�',
+}
+
+export default translation
diff --git a/i18n/zh-Hans/plugin-tags.ts b/i18n/zh-Hans/plugin-tags.ts
new file mode 100644
index 0000000..c133992
--- /dev/null
+++ b/i18n/zh-Hans/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  allTags: '鎵�鏈夋爣绛�',
+  searchTags: '鎼滅储鏍囩',
+  tags: {
+    agent: 'Agent',
+    search: '鎼滅储',
+    image: '鍥剧墖',
+    videos: '瑙嗛',
+    weather: '澶╂皵',
+    finance: '閲戣瀺',
+    design: '璁捐',
+    travel: '鏃呰',
+    social: '绀句氦',
+    news: '鏂伴椈',
+    medical: '鍖荤枟',
+    productivity: '鐢熶骇鍔�',
+    education: '鏁欒偛',
+    business: '鍟嗕笟',
+    entertainment: '濞变箰',
+    utilities: '宸ュ叿',
+    other: '鍏朵粬',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/plugin.ts b/i18n/zh-Hans/plugin.ts
new file mode 100644
index 0000000..e088557
--- /dev/null
+++ b/i18n/zh-Hans/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  metadata: {
+    title: '鎻掍欢',
+  },
+  category: {
+    all: '鍏ㄩ儴',
+    models: '妯″瀷',
+    tools: '宸ュ叿',
+    agents: 'Agent 绛栫暐',
+    extensions: '鎵╁睍',
+    bundles: '鎻掍欢闆�',
+  },
+  categorySingle: {
+    model: '妯″瀷',
+    tool: '宸ュ叿',
+    agent: 'Agent 绛栫暐',
+    extension: '鎵╁睍',
+    bundle: '鎻掍欢闆�',
+  },
+  search: '鎼滅储',
+  allCategories: '鎵�鏈夌被鍒�',
+  searchCategories: '鎼滅储绫诲埆',
+  searchPlugins: '鎼滅储鎻掍欢',
+  from: '鏉ヨ嚜',
+  findMoreInMarketplace: '鍦� Marketplace 涓煡鎵炬洿澶�',
+  searchInMarketplace: '鍦� Marketplace 涓悳绱�',
+  fromMarketplace: '鏉ヨ嚜甯傚満',
+  endpointsEnabled: '{{num}} 缁勭鐐瑰凡鍚敤',
+  searchTools: '鎼滅储宸ュ叿...',
+  installPlugin: '瀹夎鎻掍欢',
+  installFrom: '瀹夎婧�',
+  list: {
+    noInstalled: '鏃犲凡瀹夎鐨勬彃浠�',
+    notFound: '鏈壘鍒版彃浠�',
+    source: {
+      marketplace: '浠� Marketplace 瀹夎',
+      github: '浠� GitHub 瀹夎',
+      local: '鏈湴鎻掍欢',
+    },
+  },
+  source: {
+    marketplace: 'Marketplace',
+    github: 'GitHub',
+    local: '鏈湴鎻掍欢',
+  },
+  detailPanel: {
+    switchVersion: '鍒囨崲鐗堟湰',
+    categoryTip: {
+      marketplace: '浠� Marketplace 瀹夎',
+      github: '浠� Github 瀹夎',
+      local: '鏈湴鎻掍欢',
+      debugging: '璋冭瘯鎻掍欢',
+    },
+    operation: {
+      install: '瀹夎',
+      detail: '璇︽儏',
+      update: '鏇存柊',
+      info: '鎻掍欢淇℃伅',
+      checkUpdate: '妫�鏌ユ洿鏂�',
+      viewDetail: '鏌ョ湅璇︽儏',
+      remove: '绉婚櫎',
+    },
+    actionNum: '鍖呭惈 {{num}} 涓� {{action}}',
+    strategyNum: '鍖呭惈 {{num}} 涓� {{strategy}}',
+    endpoints: 'API 绔偣',
+    endpointsTip: '姝ゆ彃浠堕�氳繃 API 绔偣鎻愪緵鐗瑰畾鍔熻兘锛屾偍鍙互涓哄綋鍓嶅伐浣滃尯閰嶇疆澶氫釜 API 绔偣闆嗐��',
+    endpointsDocLink: '鏌ョ湅鏂囨。',
+    endpointsEmpty: '鐐瑰嚮 \'+\' 鎸夐挳娣诲姞 API 绔偣',
+    endpointDisableTip: '鍋滅敤 API 绔偣',
+    endpointDisableContent: '鏄惁瑕佸仠鐢� {{name}} 鐨� API 绔偣 锛�',
+    endpointDeleteTip: '绉婚櫎 API 绔偣',
+    endpointDeleteContent: '鏄惁瑕佺Щ闄� {{name}} 锛�',
+    endpointModalTitle: '璁剧疆 API 绔偣',
+    endpointModalDesc: '瀹屾垚閰嶇疆鍚庡彲浣跨敤鎻掍欢 API 绔偣鎻愪緵鐨勫姛鑳�',
+    serviceOk: '鏈嶅姟姝e父',
+    disabled: '鍋滅敤',
+    modelNum: '{{num}} 妯″瀷宸插寘鍚�',
+    toolSelector: {
+      title: '娣诲姞宸ュ叿',
+      toolLabel: '宸ュ叿',
+      descriptionLabel: '宸ュ叿鎻忚堪',
+      descriptionPlaceholder: '绠�瑕佹弿杩板伐鍏风洰鐨勶紝渚嬪锛岃幏鍙栫壒瀹氫綅缃殑娓╁害銆�',
+      placeholder: '閫夋嫨宸ュ叿',
+      settings: '鐢ㄦ埛璁剧疆',
+      params: '鎺ㄧ悊閰嶇疆',
+      paramsTip1: '鎺у埗 LLM 鎺ㄧ悊鍙傛暟銆�',
+      paramsTip2: '褰撯�滆嚜鍔ㄢ�濆叧闂椂锛屼娇鐢ㄩ粯璁ゅ�笺��',
+      auto: '鑷姩',
+      empty: '鐐瑰嚮 "+" 鎸夐挳娣诲姞宸ュ叿銆傛偍鍙互娣诲姞澶氫釜宸ュ叿銆�',
+      uninstalledTitle: '宸ュ叿鏈畨瑁�',
+      uninstalledContent: '姝ゆ彃浠跺畨瑁呰嚜 鏈湴 / GitHub 浠撳簱锛岃瀹夎鍚庝娇鐢ㄣ��',
+      uninstalledLink: '鍦ㄦ彃浠朵腑绠$悊',
+      unsupportedTitle: '涓嶆敮鎸佺殑 Action',
+      unsupportedContent: '宸插畨瑁呯殑鎻掍欢鐗堟湰涓嶆彁渚涜繖涓� action銆�',
+      unsupportedContent2: '鐐瑰嚮鍒囨崲鐗堟湰',
+    },
+    configureApp: '搴旂敤璁剧疆',
+    configureModel: '妯″瀷璁剧疆',
+    configureTool: '宸ュ叿璁剧疆',
+  },
+  install: '{{num}} 娆″畨瑁�',
+  installAction: '瀹夎',
+  debugInfo: {
+    title: '璋冭瘯',
+    viewDocs: '鏌ョ湅鏂囨。',
+  },
+  privilege: {
+    title: '鎻掍欢鍋忓ソ',
+    whoCanInstall: '璋佸彲浠ュ畨瑁呭拰绠$悊鎻掍欢锛�',
+    whoCanDebug: '璋佸彲浠ヨ皟璇曟彃浠讹紵',
+    everyone: '鎵�鏈変汉',
+    admins: '绠$悊鍛�',
+    noone: '鏃犱汉',
+  },
+  pluginInfoModal: {
+    title: '鎻掍欢淇℃伅',
+    repository: '浠撳簱',
+    release: '鍙戝竷鐗堟湰',
+    packageName: '鍖�',
+  },
+  action: {
+    checkForUpdates: '妫�鏌ユ洿鏂�',
+    pluginInfo: '鎻掍欢淇℃伅',
+    delete: '绉婚櫎鎻掍欢',
+    deleteContentLeft: '鏄惁瑕佺Щ闄� ',
+    deleteContentRight: ' 鎻掍欢?',
+    usedInApps: '姝ゆ彃浠舵鍦� {{num}} 涓簲鐢ㄤ腑浣跨敤銆�',
+  },
+  installModal: {
+    installPlugin: '瀹夎鎻掍欢',
+    installComplete: '瀹夎瀹屾垚',
+    installedSuccessfully: '瀹夎鎴愬姛',
+    installedSuccessfullyDesc: '鎻掍欢宸叉垚鍔熷畨瑁呫��',
+    uploadFailed: '涓婁紶澶辫触',
+    installFailed: '瀹夎澶辫触',
+    installFailedDesc: '鎻掍欢瀹夎澶辫触銆�',
+    install: '瀹夎',
+    installing: '瀹夎涓�...',
+    uploadingPackage: '涓婁紶 {{packageName}} 涓�...',
+    readyToInstall: '鍗冲皢瀹夎浠ヤ笅鎻掍欢',
+    readyToInstallPackage: '鍗冲皢瀹夎浠ヤ笅鎻掍欢',
+    readyToInstallPackages: '鍗冲皢瀹夎浠ヤ笅 {{num}} 涓彃浠�',
+    fromTrustSource: '璇蜂繚璇佷粎浠�<trustSource>鍙俊婧�</trustSource>瀹夎鎻掍欢銆�',
+    dropPluginToInstall: '鎷栨斁鎻掍欢鍖呭埌姝ゅ瀹夎',
+    labels: {
+      repository: '浠撳簱',
+      version: '鐗堟湰',
+      package: '鍖�',
+    },
+    close: '鍏抽棴',
+    cancel: '鍙栨秷',
+    back: '杩斿洖',
+    next: '涓嬩竴姝�',
+    pluginLoadError: '鎻掍欢鍔犺浇閿欒',
+    pluginLoadErrorDesc: '姝ゆ彃浠跺皢涓嶄細琚畨瑁�',
+  },
+  installFromGitHub: {
+    installPlugin: '浠� GitHub 瀹夎鎻掍欢',
+    updatePlugin: '鏇存柊鏉ヨ嚜 GitHub 鐨勬彃浠�',
+    installedSuccessfully: '瀹夎鎴愬姛',
+    installFailed: '瀹夎澶辫触',
+    uploadFailed: '涓婁紶澶辫触',
+    gitHubRepo: 'GitHub 浠撳簱',
+    selectVersion: '閫夋嫨鐗堟湰',
+    selectVersionPlaceholder: '璇烽�夋嫨涓�涓増鏈�',
+    installNote: '璇风‘淇濆彧浠庡彲淇℃簮瀹夎鎻掍欢銆�',
+    selectPackage: '閫夋嫨鍖�',
+    selectPackagePlaceholder: '璇烽�夋嫨涓�涓寘',
+  },
+  upgrade: {
+    title: '瀹夎鎻掍欢',
+    successfulTitle: '瀹夎鎴愬姛',
+    description: '鍗冲皢瀹夎浠ヤ笅鎻掍欢',
+    usedInApps: '鍦� {{num}} 涓簲鐢ㄤ腑浣跨敤',
+    upgrade: '瀹夎',
+    upgrading: '瀹夎涓�...',
+    close: '鍏抽棴',
+  },
+  error: {
+    inValidGitHubUrl: '鏃犳晥鐨� GitHub URL銆傝杈撳叆鏍煎紡涓� https://github.com/owner/repo 鐨勬湁鏁� URL',
+    fetchReleasesError: '鏃犳硶鑾峰彇鍙戝竷鐗堟湰銆傝绋嶅悗鍐嶈瘯銆�',
+    noReleasesFound: '鏈壘鍒板彂甯冪増鏈�傝妫�鏌� GitHub 浠撳簱鎴栬緭鍏ョ殑 URL銆�',
+  },
+  marketplace: {
+    empower: '鍔╁姏鎮ㄧ殑 AI 寮�鍙�',
+    discover: '鎺㈢储',
+    and: '鍜�',
+    difyMarketplace: 'Dify 甯傚満',
+    moreFrom: '鏇村鏉ヨ嚜甯傚満',
+    noPluginFound: '鏈壘鍒版彃浠�',
+    pluginsResult: '{{num}} 涓彃浠剁粨鏋�',
+    sortBy: '鎺掑簭鏂瑰紡',
+    sortOption: {
+      mostPopular: '鏈�鍙楁杩�',
+      recentlyUpdated: '鏈�杩戞洿鏂�',
+      newlyReleased: '鏈�鏂板彂甯�',
+      firstReleased: '棣栨鍙戝竷',
+    },
+    viewMore: '鏌ョ湅鏇村',
+    verifiedTip: '姝ゆ彃浠剁敱 Dify 璁よ瘉',
+    partnerTip: '姝ゆ彃浠剁敱 Dify 鍚堜綔浼欎即璁よ瘉',
+  },
+  task: {
+    installing: '{{installingLength}} 涓彃浠跺畨瑁呬腑锛�0 宸插畬鎴�',
+    installingWithSuccess: '{{installingLength}} 涓彃浠跺畨瑁呬腑锛寋{successLength}} 瀹夎鎴愬姛',
+    installingWithError: '{{installingLength}} 涓彃浠跺畨瑁呬腑锛寋{successLength}} 瀹夎鎴愬姛锛寋{errorLength}} 瀹夎澶辫触',
+    installError: '{{errorLength}} 涓彃浠跺畨瑁呭け璐ワ紝鐐瑰嚮鏌ョ湅',
+    installedError: '{{errorLength}} 涓彃浠跺畨瑁呭け璐�',
+    clearAll: '娓呴櫎鎵�鏈�',
+  },
+  submitPlugin: '涓婁紶鎻掍欢',
+  difyVersionNotCompatible: '褰撳墠 Dify 鐗堟湰涓嶅吋瀹硅鎻掍欢锛屽叾鏈�浣庣増鏈姹備负 {{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/zh-Hans/register.ts b/i18n/zh-Hans/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/zh-Hans/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/zh-Hans/run-log.ts b/i18n/zh-Hans/run-log.ts
new file mode 100644
index 0000000..0cf49b0
--- /dev/null
+++ b/i18n/zh-Hans/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: '杈撳叆',
+  result: '缁撴灉',
+  detail: '璇︽儏',
+  tracing: '杩借釜',
+  resultPanel: {
+    status: '鐘舵��',
+    time: '杩愯鏃堕棿',
+    tokens: '鎬� token 鏁�',
+  },
+  meta: {
+    title: '鍏冩暟鎹�',
+    status: '鐘舵��',
+    version: '鐗堟湰',
+    executor: '鎵ц浜�',
+    startTime: '寮�濮嬫椂闂�',
+    time: '杩愯鏃堕棿',
+    tokens: '鎬� token 鏁�',
+    steps: '杩愯姝ユ暟',
+  },
+  resultEmpty: {
+    title: '鏈杩愯浠呰緭鍑� JSON 鏍煎紡锛�',
+    tipLeft: '璇疯浆鍒�',
+    link: '璇︾粏淇℃伅闈㈡澘',
+    tipRight: '鏌ョ湅瀹冦��',
+  },
+  actionLogs: 'Action 鏃ュ織',
+  circularInvocationTip: '褰撳墠宸ヤ綔娴佷腑瀛樺湪宸ュ叿/鑺傜偣鐨勫惊鐜皟鐢ㄣ��',
+}
+
+export default translation
diff --git a/i18n/zh-Hans/share-app.ts b/i18n/zh-Hans/share-app.ts
new file mode 100644
index 0000000..3e89aec
--- /dev/null
+++ b/i18n/zh-Hans/share-app.ts
@@ -0,0 +1,78 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: '搴旂敤涓嶅彲鐢�',
+    appUnknownError: '搴旂敤涓嶅彲鐢�',
+  },
+  chat: {
+    newChat: '寮�鍚柊瀵硅瘽',
+    newChatTip: '宸插湪鏂板璇濅腑',
+    chatSettingsTitle: '鏂板璇濊缃�',
+    chatFormTip: '瀵硅瘽寮�濮嬪悗锛屽璇濊缃皢鏃犳硶淇敼銆�',
+    pinnedTitle: '宸茬疆椤�',
+    unpinnedTitle: '瀵硅瘽鍒楄〃',
+    newChatDefaultName: '鏂扮殑瀵硅瘽',
+    resetChat: '閲嶇疆瀵硅瘽',
+    viewChatSettings: '鏌ョ湅瀵硅瘽璁剧疆',
+    poweredBy: 'Powered by',
+    prompt: '鎻愮ず璇�',
+    privatePromptConfigTitle: '瀵硅瘽璁剧疆',
+    publicPromptConfigTitle: '瀵硅瘽鍓嶆彁绀鸿瘝',
+    configStatusDes: '寮�濮嬪墠锛屾偍鍙互淇敼瀵硅瘽璁剧疆',
+    configDisabled: '姝ゆ浼氳瘽宸蹭娇鐢ㄤ笂娆′細璇濊〃鍗�',
+    startChat: '寮�濮嬪璇�',
+    privacyPolicyLeft: '璇烽槄璇荤敱璇ュ簲鐢ㄥ紑鍙戣�呮彁渚涚殑',
+    privacyPolicyMiddle: '闅愮鏀跨瓥',
+    privacyPolicyRight: '銆�',
+    deleteConversation: {
+      title: '鍒犻櫎瀵硅瘽',
+      content: '鎮ㄧ‘瀹氳鍒犻櫎姝ゅ璇濆悧锛�',
+    },
+    tryToSolve: '灏濊瘯瑙e喅',
+    temporarySystemIssue: '鎶辨瓑锛屼复鏃剁郴缁熼棶棰樸��',
+    expand: '灞曞紑',
+    collapse: '鎶樺彔',
+  },
+  generation: {
+    tabs: {
+      create: '杩愯涓�娆�',
+      batch: '鎵归噺杩愯',
+      saved: '宸蹭繚瀛�',
+    },
+    savedNoData: {
+      title: '鎮ㄨ繕娌℃湁淇濆瓨缁撴灉锛�',
+      description: '寮�濮嬬敓鎴愬唴瀹癸紝鎮ㄥ彲浠ュ湪杩欓噷鎵惧埌淇濆瓨鐨勭粨鏋溿��',
+      startCreateContent: '寮�濮嬬敓鎴愬唴瀹�',
+    },
+    title: 'AI 鏅鸿兘涔﹀啓',
+    queryTitle: '鏌ヨ鍐呭',
+    completionResult: '鐢熸垚缁撴灉',
+    queryPlaceholder: '璇疯緭鍏ユ枃鏈唴瀹�',
+    run: '杩愯',
+    execution: '杩愯',
+    executions: '{{num}} 娆¤繍琛�',
+    copy: '鎷疯礉',
+    resultTitle: 'AI 涔﹀啓',
+    noData: 'AI 浼氬湪杩欓噷缁欎綘鎯婂枩銆�',
+    csvUploadTitle: '灏嗘偍鐨� CSV 鏂囦欢鎷栨斁鍒版澶勶紝鎴�',
+    browse: '娴忚',
+    csvStructureTitle: 'CSV 鏂囦欢蹇呴』绗﹀悎浠ヤ笅缁撴瀯锛�',
+    downloadTemplate: '涓嬭浇妯℃澘',
+    field: '',
+    batchFailed: {
+      info: '{{num}} 娆¤繍琛屽け璐�',
+      retry: '閲嶈瘯',
+      outputPlaceholder: '鏃犺緭鍑哄唴瀹�',
+    },
+    errorMsg: {
+      empty: '涓婁紶鏂囦欢鐨勫唴瀹逛笉鑳戒负绌�',
+      fileStructNotMatch: '涓婁紶鏂囦欢鐨勫唴瀹逛笌缁撴瀯涓嶅尮閰�',
+      emptyLine: '绗� {{rowIndex}} 琛岀殑鍐呭涓虹┖',
+      invalidLine: '绗� {{rowIndex}} 琛�: {{varName}}鍊煎繀濉�',
+      moreThanMaxLengthLine: '绗� {{rowIndex}} 琛�: {{varName}}鍊艰秴杩囨渶澶ч暱搴� {{maxLength}}',
+      atLeastOne: '涓婁紶鏂囦欢鐨勫唴瀹逛笉鑳藉皯浜庝竴鏉�',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hans/time.ts b/i18n/zh-Hans/time.ts
new file mode 100644
index 0000000..5158a71
--- /dev/null
+++ b/i18n/zh-Hans/time.ts
@@ -0,0 +1,38 @@
+const translation = {
+  daysInWeek: {
+    Sun: '鏃�',
+    Mon: '涓�',
+    Tue: '浜�',
+    Wed: '涓�',
+    Thu: '鍥�',
+    Fri: '浜�',
+    Sat: '鍏�',
+  },
+  months: {
+    January: '涓�鏈�',
+    February: '浜屾湀',
+    March: '涓夋湀',
+    April: '鍥涙湀',
+    May: '浜旀湀',
+    June: '鍏湀',
+    July: '涓冩湀',
+    August: '鍏湀',
+    September: '涔濇湀',
+    October: '鍗佹湀',
+    November: '鍗佷竴鏈�',
+    December: '鍗佷簩鏈�',
+  },
+  operation: {
+    now: '姝ゅ埢',
+    ok: '纭畾',
+    cancel: '鍙栨秷',
+    pickDate: '閫夋嫨鏃ユ湡',
+  },
+  title: {
+    pickTime: '閫夋嫨鏃堕棿',
+  },
+  pickDate: '閫夋嫨鏃ユ湡',
+  defaultPlaceholder: '璇烽�夋嫨鏃堕棿...',
+}
+
+export default translation
diff --git a/i18n/zh-Hans/tools.ts b/i18n/zh-Hans/tools.ts
new file mode 100644
index 0000000..98e7b6e
--- /dev/null
+++ b/i18n/zh-Hans/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: '宸ュ叿',
+  createCustomTool: '鍒涘缓鑷畾涔夊伐鍏�',
+  customToolTip: '浜嗚В鏇村鍏充簬 Dify 鑷畾涔夊伐鍏风殑淇℃伅',
+  type: {
+    all: '鍏ㄩ儴',
+    builtIn: '宸ュ叿',
+    custom: '鑷畾涔�',
+    workflow: '宸ヤ綔娴�',
+  },
+  contribute: {
+    line1: '鎴戞湁鍏磋叮涓� ',
+    line2: 'Dify 璐$尞宸ュ叿銆�',
+    viewGuide: '鏌ョ湅鎸囧崡',
+  },
+  author: '浣滆��',
+  auth: {
+    unauthorized: '鍘绘巿鏉�',
+    authorized: '宸叉巿鏉�',
+    setup: '瑕佷娇鐢ㄨ鍏堟巿鏉�',
+    setupModalTitle: '璁剧疆鎺堟潈',
+    setupModalTitleDescription: '閰嶇疆鍑嵁鍚庯紝宸ヤ綔鍖轰腑鐨勬墍鏈夋垚鍛橀兘鍙互鍦ㄧ紪鎺掑簲鐢ㄧ▼搴忔椂浣跨敤姝ゅ伐鍏枫��',
+  },
+  includeToolNum: '鍖呭惈 {{num}} 涓� {{action}}',
+  addTool: '娣诲姞宸ュ叿',
+  addToolModal: {
+    type: '绫诲瀷',
+    category: '绫诲埆',
+    add: '娣诲姞',
+    added: '宸叉坊鍔�',
+    manageInTools: '鍘诲伐鍏峰垪琛ㄧ鐞�',
+    emptyTitle: '娌℃湁鍙敤鐨勫伐浣滄祦宸ュ叿',
+    emptyTip: '鍘� 鈥滃伐浣滄祦 -> 鍙戝竷涓哄伐鍏封�� 娣诲姞',
+    emptyTitleCustom: '娌℃湁鍙敤鐨勮嚜瀹氫箟宸ュ叿',
+    emptyTipCustom: '鍒涘缓鑷畾涔夊伐鍏�',
+  },
+  createTool: {
+    title: '鍒涘缓鑷畾涔夊伐鍏�',
+    editAction: '缂栬緫',
+    editTitle: '缂栬緫鑷畾涔夊伐鍏�',
+    name: '鍚嶇О',
+    toolNamePlaceHolder: '杈撳叆宸ュ叿鍚嶇О',
+    nameForToolCall: '宸ュ叿璋冪敤鍚嶇О',
+    nameForToolCallPlaceHolder: '鐢ㄤ簬鏈哄櫒璇嗗埆锛屽 getCurrentWeather, list_pets',
+    nameForToolCallTip: '浠呮敮鎸佹暟瀛椼�佸瓧姣嶃�佷笅鍒掔嚎銆�',
+    description: '宸ュ叿鎻忚堪',
+    descriptionPlaceholder: '宸ュ叿鐢ㄩ�旂殑绠�瑕佹弿杩帮紝渚嬪鑾峰彇鐗瑰畾浣嶇疆鐨勬俯搴︺��',
+    schema: 'Schema',
+    schemaPlaceHolder: '鍦ㄦ澶勮緭鍏ユ偍鐨� OpenAPI schema',
+    viewSchemaSpec: '鏌ョ湅 OpenAPI-Swagger 瑙勮寖',
+    importFromUrl: '浠� URL 涓鍏�',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: '璇疯緭鍏ユ湁鏁堢殑 URL',
+    examples: '渚嬪瓙',
+    exampleOptions: {
+      json: '澶╂皵(JSON)',
+      yaml: '瀹犵墿鍟嗗簵(YAML)',
+      blankTemplate: '绌虹櫧妯$増',
+    },
+    availableTools: {
+      title: '鍙敤宸ュ叿',
+      name: '鍚嶇О',
+      description: '鎻忚堪',
+      method: '鏂规硶',
+      path: '璺緞',
+      action: '鎿嶄綔',
+      test: '娴嬭瘯',
+    },
+    authMethod: {
+      title: '閴存潈鏂规硶',
+      type: '閴存潈绫诲瀷',
+      keyTooltip: 'HTTP 澶撮儴鍚嶇О锛屽鏋滀綘涓嶇煡閬撴槸浠�涔堬紝鍙互灏嗗叾淇濈暀涓� Authorization 鎴栬缃负鑷畾涔夊��',
+      types: {
+        none: '鏃�',
+        api_key: 'API Key',
+        apiKeyPlaceholder: 'HTTP 澶撮儴鍚嶇О锛岀敤浜庝紶閫� API Key',
+        apiValuePlaceholder: '杈撳叆 API Key',
+      },
+      key: '閿�',
+      value: '鍊�',
+    },
+    authHeaderPrefix: {
+      title: '閴存潈澶撮儴鍓嶇紑',
+      types: {
+        basic: 'Basic',
+        bearer: 'Bearer',
+        custom: 'Custom',
+      },
+    },
+    privacyPolicy: '闅愮鍗忚',
+    privacyPolicyPlaceholder: '璇疯緭鍏ラ殣绉佸崗璁�',
+    toolInput: {
+      title: '宸ュ叿鍏ュ弬',
+      name: '鍚嶇О',
+      required: '蹇呴』',
+      method: '鏂瑰紡',
+      methodSetting: '鐢ㄦ埛杈撳叆',
+      methodSettingTip: '鐢ㄦ埛鍦ㄥ伐鍏烽厤缃腑濉啓',
+      methodParameter: 'LLM 濉叆',
+      methodParameterTip: 'LLM 鍦ㄦ帹鐞嗚繃绋嬩腑濉啓',
+      label: '鏍囩',
+      labelPlaceholder: '閫夋嫨鏍囩(鍙��)',
+      description: '鎻忚堪',
+      descriptionPlaceholder: '鍙傛暟鎰忎箟鐨勬弿杩�',
+    },
+    customDisclaimer: '鑷畾涔夊厤璐e0鏄�',
+    customDisclaimerPlaceholder: '璇疯緭鍏ヨ嚜瀹氫箟鍏嶈矗澹版槑',
+    confirmTitle: '纭淇濆瓨锛�',
+    confirmTip: '鍙戝竷鏂扮殑宸ュ叿鐗堟湰鍙兘浼氬奖鍝嶈宸ュ叿宸插叧鑱旂殑搴旂敤',
+    deleteToolConfirmTitle: '鍒犻櫎杩欎釜宸ュ叿锛�',
+    deleteToolConfirmContent: '鍒犻櫎宸ュ叿鏄笉鍙�嗙殑銆傜敤鎴峰皢鏃犳硶鍐嶈闂偍鐨勫伐鍏枫��',
+  },
+  test: {
+    title: '娴嬭瘯',
+    parametersValue: '鍙傛暟鍜屽��',
+    parameters: '鍙傛暟',
+    value: '鍊�',
+    testResult: '娴嬭瘯缁撴灉',
+    testResultPlaceholder: '娴嬭瘯缁撴灉灏嗘樉绀哄湪杩欓噷',
+  },
+  thought: {
+    using: '姝e湪浣跨敤',
+    used: '宸蹭娇鐢�',
+    requestTitle: '璇锋眰',
+    responseTitle: '鍝嶅簲',
+  },
+  setBuiltInTools: {
+    info: '淇℃伅',
+    setting: '璁剧疆',
+    toolDescription: '宸ュ叿鎻忚堪',
+    parameters: '鍙傛暟',
+    string: '瀛楃涓�',
+    number: '鏁板瓧',
+    file: '鏂囦欢',
+    required: '蹇呭~',
+    infoAndSetting: '淇℃伅鍜岃缃�',
+  },
+  noCustomTool: {
+    title: '娌℃湁鑷畾涔夊伐鍏�!',
+    content: '鍦ㄦ缁熶竴娣诲姞鍜岀鐞嗕綘鐨勮嚜瀹氫箟宸ュ叿锛屾柟渚挎瀯寤哄簲鐢ㄦ椂浣跨敤銆�',
+    createTool: '鍒涘缓宸ュ叿',
+  },
+  noSearchRes: {
+    title: '鎶辨瓑锛屾病鏈夌粨鏋滐紒',
+    content: '鎴戜滑鎵句笉鍒颁换浣曚笌鎮ㄧ殑鎼滅储鐩稿尮閰嶇殑宸ュ叿銆�',
+    reset: '閲嶇疆鎼滅储',
+  },
+  builtInPromptTitle: '鎻愮ず璇�',
+  toolRemoved: '宸ュ叿宸茶绉婚櫎',
+  notAuthorized: '宸ュ叿鏈巿鏉�',
+  howToGet: '濡備綍鑾峰彇',
+  openInStudio: '鍦ㄥ伐浣滃涓墦寮�',
+  toolNameUsageTip: '宸ュ叿璋冪敤鍚嶇О锛岀敤浜� Agent 鎺ㄧ悊鍜屾彁绀鸿瘝',
+  copyToolName: '澶嶅埗鍚嶇О',
+  noTools: '娌℃湁宸ュ叿',
+}
+
+export default translation
diff --git a/i18n/zh-Hans/workflow.ts b/i18n/zh-Hans/workflow.ts
new file mode 100644
index 0000000..ab77e0e
--- /dev/null
+++ b/i18n/zh-Hans/workflow.ts
@@ -0,0 +1,918 @@
+const translation = {
+  common: {
+    undo: '鎾ら攢',
+    redo: '閲嶅仛',
+    editing: '缂栬緫涓�',
+    autoSaved: '鑷姩淇濆瓨',
+    unpublished: '鏈彂甯�',
+    published: '宸插彂甯�',
+    publish: '鍙戝竷',
+    update: '鏇存柊',
+    publishUpdate: '鍙戝竷鏇存柊',
+    run: '杩愯',
+    running: '杩愯涓�',
+    inRunMode: '鍦ㄨ繍琛屾ā寮忎腑',
+    inPreview: '棰勮涓�',
+    inPreviewMode: '棰勮涓�',
+    preview: '棰勮',
+    viewRunHistory: '鏌ョ湅杩愯鍘嗗彶',
+    runHistory: '杩愯鍘嗗彶',
+    goBackToEdit: '杩斿洖缂栬緫妯″紡',
+    conversationLog: '瀵硅瘽璁板綍',
+    features: '鍔熻兘',
+    featuresDescription: '澧炲己 web app 鐢ㄦ埛浣撻獙',
+    ImageUploadLegacyTip: '鐜板湪鍙互鍦� start 琛ㄥ崟涓垱寤烘枃浠剁被鍨嬪彉閲忋�傛湭鏉ユ垜浠皢涓嶇户缁敮鎸佸浘鐗囦笂浼犲姛鑳姐��',
+    fileUploadTip: '鍥剧墖涓婁紶鍔熻兘宸叉墿灞曚负鏂囦欢涓婁紶銆�',
+    featuresDocLink: '浜嗚В鏇村',
+    debugAndPreview: '棰勮',
+    restart: '閲嶆柊寮�濮�',
+    currentDraft: '褰撳墠鑽夌',
+    currentDraftUnpublished: '褰撳墠鑽夌鏈彂甯�',
+    latestPublished: '鏈�鏂板彂甯�',
+    publishedAt: '鍙戝竷浜�',
+    restore: '鎭㈠',
+    versionHistory: '鐗堟湰鍘嗗彶',
+    exitVersions: '閫�鍑虹増鏈巻鍙�',
+    runApp: '杩愯',
+    batchRunApp: '鎵归噺杩愯',
+    accessAPIReference: '璁块棶 API',
+    embedIntoSite: '宓屽叆缃戠珯',
+    addTitle: '娣诲姞鏍囬...',
+    addDescription: '娣诲姞鎻忚堪...',
+    noVar: '娌℃湁鍙橀噺',
+    variableNamePlaceholder: '鍙橀噺鍚�',
+    searchVar: '鎼滅储鍙橀噺',
+    setVarValuePlaceholder: '璁剧疆鍙橀噺鍊�',
+    needConnectTip: '姝よ妭鐐瑰皻鏈繛鎺ュ埌鍏朵粬鑺傜偣',
+    maxTreeDepth: '姣忎釜鍒嗘敮鏈�澶ч檺鍒� {{depth}} 涓妭鐐�',
+    needEndNode: '蹇呴』娣诲姞缁撴潫鑺傜偣',
+    needAnswerNode: '蹇呴』娣诲姞鐩存帴鍥炲鑺傜偣',
+    workflowProcess: '宸ヤ綔娴�',
+    notRunning: '灏氭湭杩愯',
+    previewPlaceholder: '鍦ㄤ笅闈㈢殑妗嗕腑杈撳叆鍐呭寮�濮嬭皟璇曡亰澶╂満鍣ㄤ汉',
+    effectVarConfirm: {
+      title: '绉婚櫎鍙橀噺',
+      content: '璇ュ彉閲忓湪鍏朵粬鑺傜偣涓娇鐢ㄣ�傛偍鏄惁浠嶈鍒犻櫎瀹冿紵',
+    },
+    insertVarTip: '鎸� \'/\' 閿揩閫熸彃鍏�',
+    processData: '鏁版嵁澶勭悊',
+    input: '杈撳叆',
+    output: '杈撳嚭',
+    jinjaEditorPlaceholder: '杈撳叆 鈥�/鈥� 鎴� 鈥渰鈥� 鎻掑叆鍙橀噺',
+    viewOnly: '鍙',
+    showRunHistory: '鏄剧ず杩愯鍘嗗彶',
+    enableJinja: '寮�鍚敮鎸� Jinja 妯℃澘',
+    learnMore: '浜嗚В鏇村',
+    copy: '鎷疯礉',
+    duplicate: '澶嶅埗',
+    addBlock: '娣诲姞鑺傜偣',
+    pasteHere: '绮樿创鍒拌繖閲�',
+    pointerMode: '鎸囬拡妯″紡',
+    handMode: '鎵嬫ā寮�',
+    exportImage: '瀵煎嚭鍥剧墖',
+    exportPNG: '瀵煎嚭涓� PNG',
+    exportJPEG: '瀵煎嚭涓� JPEG',
+    exportSVG: '瀵煎嚭涓� SVG',
+    model: '妯″瀷',
+    workflowAsTool: '鍙戝竷涓哄伐鍏�',
+    configureRequired: '闇�瑕佽繘琛岄厤缃�',
+    configure: '閰嶇疆',
+    manageInTools: '璁块棶宸ュ叿椤�',
+    workflowAsToolTip: '宸ヤ綔娴佹洿鏂板悗闇�瑕侀噸鏂伴厤缃伐鍏峰弬鏁�',
+    viewDetailInTracingPanel: '鏌ョ湅璇︾粏淇℃伅',
+    syncingData: '鍚屾鏁版嵁涓紝鍙渶鍑犵閽熴��',
+    importDSL: '瀵煎叆 DSL',
+    importDSLTip: '褰撳墠鑽夌灏嗚瑕嗙洊銆傚湪瀵煎叆涔嬪墠璇峰鍑哄伐浣滄祦浣滀负澶囦唤銆�',
+    backupCurrentDraft: '澶囦唤褰撳墠鑽夌',
+    chooseDSL: '閫夋嫨 DSL(yml) 鏂囦欢',
+    overwriteAndImport: '瑕嗙洊骞跺鍏�',
+    importFailure: '瀵煎叆澶辫触',
+    importWarning: '娉ㄦ剰',
+    importWarningDetails: 'DSL 鐗堟湰宸紓鍙兘褰卞搷閮ㄥ垎鍔熻兘琛ㄧ幇',
+    importSuccess: '瀵煎叆鎴愬姛',
+    parallelRun: '骞惰杩愯',
+    parallelTip: {
+      click: {
+        title: '鐐瑰嚮',
+        desc: '娣诲姞鑺傜偣',
+      },
+      drag: {
+        title: '鎷栨嫿',
+        desc: '杩炴帴鑺傜偣',
+      },
+      limit: '骞惰鍒嗘敮闄愬埗涓� {{num}} 涓�',
+      depthLimit: '骞惰宓屽灞傛暟闄愬埗 {{num}} 灞�',
+    },
+    disconnect: '鏂紑杩炴帴',
+    jumpToNode: '璺宠浆鍒拌妭鐐�',
+    addParallelNode: '娣诲姞骞惰鑺傜偣',
+    parallel: '骞惰',
+    branch: '鍒嗘敮',
+    onFailure: '寮傚父鏃�',
+    addFailureBranch: '娣诲姞寮傚父鍒嗘敮',
+    openInExplore: '鍦ㄢ�滄帰绱⑩�濅腑鎵撳紑',
+    loadMore: '鍔犺浇鏇村',
+    noHistory: '娌℃湁鍘嗗彶鐗堟湰',
+  },
+  env: {
+    envPanelTitle: '鐜鍙橀噺',
+    envDescription: '鐜鍙橀噺鏄竴绉嶅瓨鍌ㄦ晱鎰熶俊鎭殑鏂规硶锛屽 API 瀵嗛挜銆佹暟鎹簱瀵嗙爜绛夈�傚畠浠瀛樺偍鍦ㄥ伐浣滄祦绋嬩腑锛岃�屼笉鏄唬鐮佷腑锛屼互渚垮湪涓嶅悓鐜涓叡浜��',
+    envPanelButton: '娣诲姞鐜鍙橀噺',
+    modal: {
+      title: '娣诲姞鐜鍙橀噺',
+      editTitle: '缂栬緫鐜鍙橀噺',
+      type: '绫诲瀷',
+      name: '鍚嶇О',
+      namePlaceholder: '鍙橀噺鍚�',
+      value: '鍊�',
+      valuePlaceholder: '鍙橀噺鍊�',
+      secretTip: '鐢ㄤ簬瀹氫箟鏁忔劅淇℃伅鎴栨暟鎹紝瀵煎嚭 DSL 鏃惰缃簡闃叉硠闇叉満鍒躲��',
+    },
+    export: {
+      title: '瀵煎嚭 Secret 绫诲瀷鐜鍙橀噺锛�',
+      checkbox: '瀵煎嚭 secret 鍊�',
+      ignore: '瀵煎嚭 DSL',
+      export: '瀵煎嚭鍖呭惈 Secret 鍊肩殑 DSL',
+    },
+  },
+  chatVariable: {
+    panelTitle: '浼氳瘽鍙橀噺',
+    panelDescription: '浼氳瘽鍙橀噺鐢ㄤ簬瀛樺偍 LLM 闇�瑕佺殑涓婁笅鏂囦俊鎭紝濡傜敤鎴峰亸濂姐�佸璇濆巻鍙茬瓑銆傚畠鏄彲璇诲啓鐨勩��',
+    docLink: '鏌ョ湅鏂囨。浜嗚В鏇村銆�',
+    button: '娣诲姞鍙橀噺',
+    modal: {
+      title: '娣诲姞浼氳瘽鍙橀噺',
+      editTitle: '缂栬緫浼氳瘽鍙橀噺',
+      name: '鍚嶇О',
+      namePlaceholder: '鍙橀噺鍚�',
+      type: '绫诲瀷',
+      value: '榛樿鍊�',
+      valuePlaceholder: '榛樿鍊硷紝鍙互涓虹┖',
+      description: '鎻忚堪',
+      descriptionPlaceholder: '鍙橀噺鐨勬弿杩�',
+      editInJSON: '鍦� JSON 涓紪杈�',
+      oneByOne: '閫愪釜娣诲姞',
+      editInForm: '鍦ㄨ〃鍗曚腑缂栬緫',
+      arrayValue: '鍊�',
+      addArrayValue: '娣诲姞鍊�',
+      objectKey: '灞炴��',
+      objectType: '绫诲瀷',
+      objectValue: '榛樿鍊�',
+    },
+    storedContent: '瀛樺偍鍐呭',
+    updatedAt: '鏇存柊鏃堕棿 ',
+  },
+  changeHistory: {
+    title: '鍙樻洿鍘嗗彶',
+    placeholder: '灏氭湭鏇存敼浠讳綍鍐呭',
+    clearHistory: '娓呴櫎鍘嗗彶璁板綍',
+    hint: '鎻愮ず',
+    hintText: '鎮ㄧ殑缂栬緫鎿嶄綔灏嗚璺熻釜骞跺瓨鍌ㄥ湪鎮ㄧ殑璁惧涓婏紝鐩村埌鎮ㄧ寮�缂栬緫鍣ㄣ�傛鍘嗗彶璁板綍灏嗗湪鎮ㄧ寮�缂栬緫鍣ㄦ椂琚竻闄ゃ��',
+    stepBackward_one: '{{count}} 姝ュ悗閫�',
+    stepBackward_other: '{{count}} 姝ュ悗閫�',
+    stepForward_one: '{{count}} 姝ュ墠杩�',
+    stepForward_other: '{{count}} 姝ュ墠杩�',
+    sessionStart: '浼氳瘽寮�濮�',
+    currentState: '褰撳墠鐘舵��',
+    nodeTitleChange: '鍧楁爣棰樺凡鏇存敼',
+    nodeDescriptionChange: '鍧楁弿杩板凡鏇存敼',
+    nodeDragStop: '鍧楀凡绉诲姩',
+    nodeChange: '鍧楀凡鏇存敼',
+    nodeConnect: '鍧楀凡杩炴帴',
+    nodePaste: '鍧楀凡绮樿创',
+    nodeDelete: '鍧楀凡鍒犻櫎',
+    nodeAdd: '鍧楀凡娣诲姞',
+    nodeResize: '鍧楀凡璋冩暣澶у皬',
+    noteAdd: '娉ㄩ噴宸叉坊鍔�',
+    noteChange: '娉ㄩ噴宸叉洿鏀�',
+    noteDelete: '娉ㄩ噴宸插垹闄�',
+    edgeDelete: '鍧楀凡鏂紑杩炴帴',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 涓嶈兘涓虹┖',
+    rerankModelRequired: '鏈厤缃� Rerank 妯″瀷',
+    authRequired: '璇峰厛鎺堟潈',
+    invalidJson: '{{field}} 鏄潪娉曠殑 JSON',
+    fields: {
+      variable: '鍙橀噺鍚�',
+      variableValue: '鍙橀噺鍊�',
+      code: '浠g爜',
+      model: '妯″瀷',
+      rerankModel: 'Rerank 妯″瀷',
+      visionVariable: '瑙嗚鍙橀噺',
+    },
+    invalidVariable: '鏃犳晥鐨勫彉閲�',
+    noValidTool: '{{field}} 鏃犲彲鐢ㄥ伐鍏�',
+    toolParameterRequired: '{{field}}: 鍙傛暟 [{{param}}] 涓嶈兘涓虹┖',
+  },
+  singleRun: {
+    testRun: '娴嬭瘯杩愯 ',
+    startRun: '寮�濮嬭繍琛�',
+    running: '杩愯涓�',
+    testRunIteration: '娴嬭瘯杩愯杩唬',
+    testRunLoop: '娴嬭瘯杩愯寰幆',
+    back: '杩斿洖',
+    iteration: '杩唬',
+    loop: '寰幆',
+  },
+  tabs: {
+    'searchBlock': '鎼滅储鑺傜偣',
+    'blocks': '鑺傜偣',
+    'searchTool': '鎼滅储宸ュ叿',
+    'tools': '宸ュ叿',
+    'allTool': '鍏ㄩ儴',
+    'plugin': '鎻掍欢',
+    'customTool': '鑷畾涔�',
+    'workflowTool': '宸ヤ綔娴�',
+    'question-understand': '闂鐞嗚В',
+    'logic': '閫昏緫',
+    'transform': '杞崲',
+    'utilities': '宸ュ叿',
+    'noResult': '鏈壘鍒板尮閰嶉」',
+    'agent': 'Agent 绛栫暐',
+  },
+  blocks: {
+    'start': '寮�濮�',
+    'end': '缁撴潫',
+    'answer': '鐩存帴鍥炲',
+    'llm': 'LLM',
+    'knowledge-retrieval': '鐭ヨ瘑妫�绱�',
+    'question-classifier': '闂鍒嗙被鍣�',
+    'if-else': '鏉′欢鍒嗘敮',
+    'code': '浠g爜鎵ц',
+    'template-transform': '妯℃澘杞崲',
+    'http-request': 'HTTP 璇锋眰',
+    'variable-assigner': '鍙橀噺璧嬪�煎櫒',
+    'variable-aggregator': '鍙橀噺鑱氬悎鍣�',
+    'assigner': '鍙橀噺璧嬪��',
+    'iteration-start': '杩唬寮�濮�',
+    'iteration': '杩唬',
+    'parameter-extractor': '鍙傛暟鎻愬彇鍣�',
+    'document-extractor': '鏂囨。鎻愬彇鍣�',
+    'list-operator': '鍒楄〃鎿嶄綔',
+    'agent': 'Agent',
+    'loop-start': '寰幆寮�濮�',
+    'loop': '寰幆',
+    'loop-end': '閫�鍑哄惊鐜�',
+  },
+  blocksAbout: {
+    'start': '瀹氫箟涓�涓� workflow 娴佺▼鍚姩鐨勫垵濮嬪弬鏁�',
+    'end': '瀹氫箟涓�涓� workflow 娴佺▼鐨勭粨鏉熷拰缁撴灉绫诲瀷',
+    'answer': '瀹氫箟涓�涓亰澶╁璇濈殑鍥炲鍐呭',
+    'llm': '璋冪敤澶ц瑷�妯″瀷鍥炵瓟闂鎴栬�呭鑷劧璇█杩涜澶勭悊',
+    'knowledge-retrieval': '鍏佽浣犱粠鐭ヨ瘑搴撲腑鏌ヨ涓庣敤鎴烽棶棰樼浉鍏崇殑鏂囨湰鍐呭',
+    'question-classifier': '瀹氫箟鐢ㄦ埛闂鐨勫垎绫绘潯浠讹紝LLM 鑳藉鏍规嵁鍒嗙被鎻忚堪瀹氫箟瀵硅瘽鐨勮繘灞曟柟寮�',
+    'if-else': '鍏佽浣犳牴鎹� if/else 鏉′欢灏� workflow 鎷嗗垎鎴愪袱涓垎鏀�',
+    'code': '鎵ц涓�娈� Python 鎴� NodeJS 浠g爜瀹炵幇鑷畾涔夐�昏緫',
+    'template-transform': '浣跨敤 Jinja 妯℃澘璇硶灏嗘暟鎹浆鎹负瀛楃涓�',
+    'http-request': '鍏佽閫氳繃 HTTP 鍗忚鍙戦�佹湇鍔″櫒璇锋眰',
+    'variable-assigner': '灏嗗璺垎鏀殑鍙橀噺鑱氬悎涓轰竴涓彉閲忥紝浠ュ疄鐜颁笅娓歌妭鐐圭粺涓�閰嶇疆銆�',
+    'assigner': '鍙橀噺璧嬪�艰妭鐐圭敤浜庡悜鍙啓鍏ュ彉閲忥紙渚嬪浼氳瘽鍙橀噺锛夎繘琛屽彉閲忚祴鍊笺��',
+    'variable-aggregator': '灏嗗璺垎鏀殑鍙橀噺鑱氬悎涓轰竴涓彉閲忥紝浠ュ疄鐜颁笅娓歌妭鐐圭粺涓�閰嶇疆銆�',
+    'iteration': '瀵瑰垪琛ㄥ璞℃墽琛屽娆℃楠ょ洿鑷宠緭鍑烘墍鏈夌粨鏋溿��',
+    'loop': '寰幆鎵ц涓�娈甸�昏緫鐩村埌婊¤冻缁撴潫鏉′欢鎴栬�呭埌杈惧惊鐜鏁颁笂闄愩��',
+    'loop-end': '鐩稿綋浜庘�渂reak鈥� 姝よ妭鐐规病鏈夐厤缃」锛屽綋寰幆浣撳唴杩愯鍒版鑺傜偣鍚庡惊鐜粓姝€��',
+    'parameter-extractor': '鍒╃敤 LLM 浠庤嚜鐒惰瑷�鍐呮帹鐞嗘彁鍙栧嚭缁撴瀯鍖栧弬鏁帮紝鐢ㄤ簬鍚庣疆鐨勫伐鍏疯皟鐢ㄦ垨 HTTP 璇锋眰銆�',
+    'document-extractor': '鐢ㄤ簬灏嗙敤鎴蜂笂浼犵殑鏂囨。瑙f瀽涓� LLM 渚夸簬鐞嗚В鐨勬枃鏈唴瀹广��',
+    'list-operator': '鐢ㄤ簬杩囨护鎴栨帓搴忔暟缁勫唴瀹广��',
+    'agent': '璋冪敤澶у瀷璇█妯″瀷鍥炵瓟闂鎴栧鐞嗚嚜鐒惰瑷�',
+  },
+  operator: {
+    zoomIn: '鏀惧ぇ',
+    zoomOut: '缂╁皬',
+    zoomTo50: '缂╂斁鍒� 50%',
+    zoomTo100: '鏀惧ぇ鍒� 100%',
+    zoomToFit: '鑷�傚簲瑙嗗浘',
+  },
+  variableReference: {
+    noAvailableVars: '娌℃湁鍙敤鍙橀噺',
+    noVarsForOperation: '褰撳墠閫夋嫨鐨勬搷浣滄病鏈夊彲鐢ㄧ殑鍙橀噺杩涜璧嬪�笺��',
+    noAssignedVars: '娌℃湁鍙敤鐨勮祴鍊煎彉閲�',
+    assignedVarsDescription: '璧嬪�煎彉閲忓繀椤绘槸鍙啓鍏ョ殑鍙橀噺锛屼緥濡傦細',
+    conversationVars: '浼氳瘽鍙橀噺',
+  },
+  panel: {
+    userInputField: '鐢ㄦ埛杈撳叆瀛楁',
+    changeBlock: '鏇存敼鑺傜偣',
+    helpLink: '甯姪閾炬帴',
+    about: '鍏充簬',
+    createdBy: '浣滆��',
+    nextStep: '涓嬩竴姝�',
+    addNextStep: '娣诲姞姝ゅ伐浣滄祦绋嬩腑鐨勪笅涓�涓妭鐐�',
+    selectNextStep: '閫夋嫨涓嬩竴涓妭鐐�',
+    runThisStep: '杩愯姝ゆ楠�',
+    checklist: '妫�鏌ユ竻鍗�',
+    checklistTip: '鍙戝竷鍓嶇‘淇濇墍鏈夐棶棰樺潎宸茶В鍐�',
+    checklistResolved: '鎵�鏈夐棶棰樺潎宸茶В鍐�',
+    organizeBlocks: '鏁寸悊鑺傜偣',
+    change: '鏇存敼',
+    optional: '锛堥�夊~锛�',
+  },
+  nodes: {
+    common: {
+      outputVars: '杈撳嚭鍙橀噺',
+      insertVarTip: '鎻掑叆鍙橀噺',
+      memory: {
+        memory: '璁板繂',
+        memoryTip: '鑱婂ぉ璁板繂璁剧疆',
+        windowSize: '璁板繂绐楀彛',
+        conversationRoleName: '瀵硅瘽瑙掕壊鍚�',
+        user: '鐢ㄦ埛鍓嶇紑',
+        assistant: '鍔╂墜鍓嶇紑',
+      },
+      memories: {
+        title: '璁板繂',
+        tip: '鑱婂ぉ璁板繂',
+        builtIn: '鍐呯疆',
+      },
+      errorHandle: {
+        title: '寮傚父澶勭悊',
+        tip: '閰嶇疆寮傚父澶勭悊绛栫暐锛屽綋鑺傜偣鍙戠敓寮傚父鏃惰Е鍙戙��',
+        none: {
+          title: '鏃�',
+          desc: '褰撳彂鐢熷紓甯镐笖鏈鐞嗘椂锛岃妭鐐瑰皢鍋滄杩愯',
+        },
+        defaultValue: {
+          title: '榛樿鍊�',
+          desc: '褰撳彂鐢熷紓甯告椂锛屾寚瀹氶粯璁よ緭鍑哄唴瀹广��',
+          tip: '褰撳彂鐢熷紓甯告椂锛屽皢杩斿洖浠ヤ笅鍊笺��',
+          inLog: '鑺傜偣寮傚父锛屾牴鎹粯璁ゅ�艰緭鍑恒��',
+          output: '杈撳嚭榛樿鍊�',
+        },
+        failBranch: {
+          title: '寮傚父鍒嗘敮',
+          desc: '褰撳彂鐢熷紓甯告椂锛屽皢鎵ц寮傚父鍒嗘敮',
+          customize: '鍦ㄧ敾甯冭嚜瀹氫箟澶辫触鍒嗘敮閫昏緫銆�',
+          customizeTip: '褰撹妭鐐瑰彂鐢熷紓甯告椂锛屽皢鑷姩鎵ц澶辫触鍒嗘敮銆傚け璐ュ垎鏀厑璁告偍鐏垫椿鍦版彁渚涢敊璇秷鎭�佹姤鍛娿�佷慨澶嶆垨璺宠繃鎿嶄綔銆�',
+          inLog: '鑺傜偣寮傚父锛屽皢鑷姩鎵ц澶辫触鍒嗘敮銆傝妭鐐硅緭鍑哄皢杩斿洖閿欒绫诲瀷鍜岄敊璇俊鎭紝骞朵紶閫掔粰涓嬫父銆�',
+        },
+        partialSucceeded: {
+          tip: '娴佺▼涓湁 {{num}} 涓妭鐐硅繍琛屽紓甯革紝璇峰墠寰�杩借釜鏌ョ湅鏃ュ織銆�',
+        },
+      },
+      retry: {
+        retry: '閲嶈瘯',
+        retryOnFailure: '澶辫触鏃堕噸璇�',
+        maxRetries: '鏈�澶ч噸璇曟鏁�',
+        retryInterval: '閲嶈瘯闂撮殧',
+        retryTimes: '澶辫触鏃堕噸璇� {{times}} 娆�',
+        retrying: '閲嶈瘯涓�...',
+        retrySuccessful: '閲嶈瘯鎴愬姛',
+        retryFailed: '閲嶈瘯澶辫触',
+        retryFailedTimes: '{{times}} 娆¢噸璇曞け璐�',
+        times: '娆�',
+        ms: '姣',
+        retries: '{{num}} 閲嶈瘯娆℃暟',
+      },
+    },
+    start: {
+      required: '蹇呭~',
+      inputField: '杈撳叆瀛楁',
+      builtInVar: '鍐呯疆鍙橀噺',
+      outputVars: {
+        query: '鐢ㄦ埛杈撳叆',
+        memories: {
+          des: '浼氳瘽鍘嗗彶',
+          type: '娑堟伅绫诲瀷',
+          content: '娑堟伅鍐呭',
+        },
+        files: '鏂囦欢鍒楄〃',
+      },
+      noVarTip: '璁剧疆鐨勮緭鍏ュ彲鍦ㄥ伐浣滄祦绋嬩腑浣跨敤',
+    },
+    end: {
+      outputs: '杈撳嚭',
+      output: {
+        type: '杈撳嚭绫诲瀷',
+        variable: '杈撳嚭鍙橀噺',
+      },
+      type: {
+        'none': '鏃�',
+        'plain-text': '绾枃鏈�',
+        'structured': '缁撴瀯鍖�',
+      },
+    },
+    answer: {
+      answer: '鍥炲',
+      outputVars: '杈撳嚭鍙橀噺',
+    },
+    llm: {
+      model: '妯″瀷',
+      variables: '鍙橀噺',
+      context: '涓婁笅鏂�',
+      contextTooltip: '鎮ㄥ彲浠ュ鍏ョ煡璇嗗簱浣滀负涓婁笅鏂�',
+      notSetContextInPromptTip: '瑕佸惎鐢ㄤ笂涓嬫枃鍔熻兘锛岃鍦ㄦ彁绀轰腑濉啓涓婁笅鏂囧彉閲忋��',
+      prompt: '鎻愮ず璇�',
+      addMessage: '娣诲姞娑堟伅',
+      roleDescription: {
+        system: '涓哄璇濇彁渚涢珮灞傛寚瀵�',
+        user: '鍚戞ā鍨嬫彁渚涙寚浠ゃ�佹煡璇㈡垨浠讳綍鍩轰簬鏂囨湰鐨勮緭鍏�',
+        assistant: '鍩轰簬鐢ㄦ埛娑堟伅鐨勬ā鍨嬪洖澶�',
+      },
+      vision: '瑙嗚',
+      files: '鏂囦欢',
+      resolution: {
+        name: '鍒嗚鲸鐜�',
+        high: '楂�',
+        low: '浣�',
+      },
+      outputVars: {
+        output: '鐢熸垚鍐呭',
+        usage: '妯″瀷鐢ㄩ噺淇℃伅',
+      },
+      singleRun: {
+        variable: '鍙橀噺',
+      },
+      sysQueryInUser: 'user message 涓繀椤诲寘鍚� sys.query',
+      jsonSchema: {
+        title: '缁撴瀯鍖栬緭鍑� Schema',
+        instruction: '鎸囦护',
+        promptTooltip: '灏嗘枃鏈弿杩拌浆鎹负鏍囧噯鍖栫殑 JSON Schema 缁撴瀯',
+        promptPlaceholder: '鎻忚堪浣犵殑 JSON Schema...',
+        generate: '鐢熸垚',
+        import: '浠� JSON 瀵煎叆',
+        generateJsonSchema: '鐢熸垚 JSON Schema',
+        generationTip: '鍙互浣跨敤鑷劧璇█蹇�熷垱寤� JSON Schema銆�',
+        generating: '姝e湪涓烘偍鐢熸垚 JSON Schema...',
+        generatedResult: '鐢熸垚缁撴灉',
+        resultTip: '浠ヤ笅鏄敓鎴愮殑缁撴灉銆傚鏋滀綘瀵硅繖涓粨鏋滀笉婊℃剰锛屽彲浠ヨ繑鍥炲苟淇敼浣犵殑鎻愮ず璇嶃��',
+        back: '杩斿洖',
+        regenerate: '閲嶆柊鐢熸垚',
+        apply: '搴旂敤',
+        doc: '浜嗚В鏈夊叧缁撴瀯鍖栬緭鍑虹殑鏇村淇℃伅',
+        resetDefaults: '娓呯┖閰嶇疆',
+        required: '蹇呭~',
+        addField: '娣诲姞瀛楁',
+        addChildField: '娣诲姞瀛愬瓧娈�',
+        showAdvancedOptions: '鏄剧ず楂樼骇閫夐」',
+        stringValidations: '瀛楃涓查獙璇�',
+        fieldNamePlaceholder: '瀛楁鍚�',
+        descriptionPlaceholder: '娣诲姞鎻忚堪',
+        warningTips: {
+          saveSchema: '璇峰厛瀹屾垚褰撳墠瀛楁鐨勭紪杈�',
+        },
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: '鏌ヨ鍙橀噺',
+      knowledge: '鐭ヨ瘑搴�',
+      outputVars: {
+        output: '鍙洖鐨勫垎娈�',
+        content: '鍒嗘鍐呭',
+        title: '鍒嗘鏍囬',
+        icon: '鍒嗘鍥炬爣',
+        url: '鍒嗘閾炬帴',
+        metadata: '鍏朵粬鍏冩暟鎹�',
+      },
+      metadata: {
+        title: '鍏冩暟鎹繃婊�',
+        tip: '鍏冩暟鎹繃婊ゆ槸浣跨敤鍏冩暟鎹睘鎬э紙渚嬪鏍囩銆佺被鍒垨璁块棶鏉冮檺锛夋潵缁嗗寲鍜屾帶鍒剁郴缁熷唴鐩稿叧淇℃伅鐨勬绱㈣繃绋嬨��',
+        options: {
+          disabled: {
+            title: '绂佺敤',
+            subTitle: '绂佺敤鍏冩暟鎹繃婊�',
+          },
+          automatic: {
+            title: '鑷姩',
+            subTitle: '鏍规嵁鐢ㄦ埛鏌ヨ鑷姩鐢熸垚鍏冩暟鎹繃婊ゆ潯浠�',
+            desc: '鏍规嵁 Query Variable 鑷姩鐢熸垚鍏冩暟鎹繃婊ゆ潯浠�',
+          },
+          manual: {
+            title: '鎵嬪姩',
+            subTitle: '鎵嬪姩娣诲姞鍏冩暟鎹繃婊ゆ潯浠�',
+          },
+        },
+        panel: {
+          title: '鍏冩暟鎹繃婊ゆ潯浠�',
+          conditions: '鏉′欢',
+          add: '娣诲姞鏉′欢',
+          search: '鎼滅储鍏冩暟鎹�',
+          placeholder: '杈撳叆鍊�',
+          datePlaceholder: '閫夋嫨鏃ユ湡...',
+          select: '閫夋嫨鍙橀噺...',
+        },
+      },
+    },
+    http: {
+      inputVars: '杈撳叆鍙橀噺',
+      api: 'API',
+      apiPlaceholder: '杈撳叆 URL锛岃緭鍏ュ彉閲忔椂璇烽敭鍏モ��/鈥�',
+      extractListPlaceholder: '杈撳叆鎻愬彇鍒楄〃缂栧彿锛岃緭鍏ュ彉閲忔椂璇烽敭鍏モ��/鈥�',
+      notStartWithHttp: 'API 搴旇浠� http:// 鎴� https:// 寮�澶�',
+      key: '閿�',
+      type: '绫诲瀷',
+      value: '鍊�',
+      bulkEdit: '鎵归噺缂栬緫',
+      keyValueEdit: '閿�肩紪杈�',
+      headers: 'Headers',
+      params: 'Params',
+      body: 'Body',
+      binaryFileVariable: 'Binary 鏂囦欢鍙橀噺',
+      outputVars: {
+        body: '鍝嶅簲鍐呭',
+        statusCode: '鍝嶅簲鐘舵�佺爜',
+        headers: '鍝嶅簲澶村垪琛� JSON',
+        files: '鏂囦欢鍒楄〃',
+      },
+      authorization: {
+        'authorization': '閴存潈',
+        'authorizationType': '閴存潈绫诲瀷',
+        'no-auth': '鏃�',
+        'api-key': 'API-Key',
+        'auth-type': 'API 閴存潈绫诲瀷',
+        'basic': '鍩虹',
+        'bearer': 'Bearer',
+        'custom': '鑷畾涔�',
+        'api-key-title': 'API Key',
+        'header': 'Header',
+      },
+      insertVarPlaceholder: '閿叆 \'/\' 閿揩閫熸彃鍏ュ彉閲�',
+      timeout: {
+        title: '瓒呮椂璁剧疆',
+        connectLabel: '杩炴帴瓒呮椂',
+        connectPlaceholder: '杈撳叆杩炴帴瓒呮椂锛堜互绉掍负鍗曚綅锛�',
+        readLabel: '璇诲彇瓒呮椂',
+        readPlaceholder: '杈撳叆璇诲彇瓒呮椂锛堜互绉掍负鍗曚綅锛�',
+        writeLabel: '鍐欏叆瓒呮椂',
+        writePlaceholder: '杈撳叆鍐欏叆瓒呮椂锛堜互绉掍负鍗曚綅锛�',
+      },
+      curl: {
+        title: '瀵煎叆cURL',
+        placeholder: '绮樿创 cURL 瀛楃涓�',
+      },
+    },
+    code: {
+      inputVars: '杈撳叆鍙橀噺',
+      outputVars: '杈撳嚭鍙橀噺',
+      advancedDependencies: '楂樼骇渚濊禆',
+      advancedDependenciesTip: '鍦ㄨ繖閲屾坊鍔犱竴浜涢鍔犺浇闇�瑕佹秷鑰楄緝澶氭椂闂存垨闈為粯璁ゅ唴缃殑渚濊禆鍖�',
+      searchDependencies: '鎼滅储渚濊禆',
+    },
+    templateTransform: {
+      inputVars: '杈撳叆鍙橀噺',
+      code: '浠g爜',
+      codeSupportTip: '鍙敮鎸� Jinja2',
+      outputVars: {
+        output: '杞崲鍚庡唴瀹�',
+      },
+    },
+    ifElse: {
+      if: 'If',
+      else: 'Else',
+      elseDescription: '鐢ㄤ簬瀹氫箟褰� if 鏉′欢涓嶆弧瓒虫椂搴旀墽琛岀殑閫昏緫銆�',
+      and: 'and',
+      or: 'or',
+      operator: '鎿嶄綔绗�',
+      notSetVariable: '璇峰厛璁剧疆鍙橀噺',
+      comparisonOperator: {
+        'contains': '鍖呭惈',
+        'not contains': '涓嶅寘鍚�',
+        'start with': '寮�濮嬫槸',
+        'end with': '缁撴潫鏄�',
+        'is': '鏄�',
+        'is not': '涓嶆槸',
+        'empty': '涓虹┖',
+        'not empty': '涓嶄负绌�',
+        'null': '绌�',
+        'not null': '涓嶄负绌�',
+        'in': '鏄�',
+        'not in': '涓嶆槸',
+        'all of': '鍏ㄩ儴鏄�',
+        'exists': '瀛樺湪',
+        'not exists': '涓嶅瓨鍦�',
+        'before': '鏃╀簬',
+        'after': '鏅氫簬',
+      },
+      optionName: {
+        image: '鍥剧墖',
+        doc: '鏂囨。',
+        audio: '闊抽',
+        video: '瑙嗛',
+        localUpload: '鏈湴涓婁紶',
+        url: 'URL',
+      },
+      enterValue: '杈撳叆鍊�',
+      addCondition: '娣诲姞鏉′欢',
+      conditionNotSetup: '鏉′欢鏈缃�',
+      selectVariable: '閫夋嫨鍙橀噺',
+      addSubVariable: '娣诲姞瀛愬彉閲�',
+      select: '閫夋嫨',
+    },
+    variableAssigner: {
+      title: '鍙橀噺璧嬪��',
+      outputType: '杈撳嚭绫诲瀷',
+      varNotSet: '鏈缃彉閲�',
+      noVarTip: '娣诲姞闇�瑕佽祴鍊肩殑鍙橀噺',
+      type: {
+        string: 'String',
+        number: 'Number',
+        object: 'Object',
+        array: 'Array',
+      },
+      aggregationGroup: '鑱氬悎鍒嗙粍',
+      aggregationGroupTip: '寮�鍚鍔熻兘鍚庯紝鍙橀噺鑱氬悎鍣ㄥ唴鍙互鍚屾椂鑱氬悎澶氱粍鍙橀噺',
+      addGroup: '娣诲姞鍒嗙粍',
+      outputVars: {
+        varDescribe: '{{groupName}}鐨勮緭鍑哄彉閲�',
+      },
+      setAssignVariable: '璁剧疆璧嬪�煎彉閲�',
+    },
+    assigner: {
+      'assignedVariable': '璧嬪�肩殑鍙橀噺',
+      'varNotSet': '鏈缃彉閲�',
+      'noVarTip': '鐐瑰嚮 "+" 鎸夐挳娣诲姞鍙橀噺',
+      'writeMode': '鍐欏叆妯″紡',
+      'writeModeTip': '浣跨敤杩藉姞妯″紡鏃讹紝璧嬪�肩殑鍙橀噺蹇呴』鏄暟缁勭被鍨嬨��',
+      'over-write': '瑕嗙洊',
+      'append': '杩藉姞',
+      'plus': '鍔�',
+      'clear': '娓呯┖',
+      'setVariable': '璁剧疆鍙橀噺',
+      'selectAssignedVariable': '閫夋嫨瑕佽祴鍊肩殑鍙橀噺...',
+      'setParameter': '璁剧疆鍙傛暟...',
+      'operations': {
+        'title': '鎿嶄綔',
+        'over-write': '瑕嗙洊',
+        'overwrite': '瑕嗙洊',
+        'set': '璁剧疆',
+        'clear': '娓呯┖',
+        'extend': '鎵╁睍',
+        'append': '杩藉姞',
+        'remove-first': '绉婚櫎棣栭」',
+        'remove-last': '绉婚櫎鏈」',
+        '+=': '+=',
+        '-=': '-=',
+        '*=': '*=',
+        '/=': '/=',
+      },
+      'variable': '鍙橀噺',
+      'variables': '鍙橀噺',
+      'noAssignedVars': '娌℃湁鍙敤鐨勮祴鍊煎彉閲�',
+      'assignedVarsDescription': '璧嬪�煎彉閲忓繀椤绘槸鍙啓鍏ョ殑鍙橀噺锛屼緥濡備細璇濆彉閲忋��',
+    },
+    tool: {
+      toAuthorize: '鎺堟潈',
+      inputVars: '杈撳叆鍙橀噺',
+      outputVars: {
+        text: '宸ュ叿鐢熸垚鐨勫唴瀹�',
+        files: {
+          title: '宸ュ叿鐢熸垚鐨勬枃浠�',
+          type: '鏀寔绫诲瀷銆傜幇鍦ㄥ彧鏀寔鍥剧墖',
+          transfer_method: '浼犺緭鏂瑰紡銆傚�间负 remote_url 鎴� local_file',
+          url: '鍥剧墖閾炬帴',
+          upload_file_id: '涓婁紶鏂囦欢ID',
+        },
+        json: '宸ュ叿鐢熸垚鐨刯son',
+      },
+    },
+    questionClassifiers: {
+      model: '妯″瀷',
+      inputVars: '杈撳叆鍙橀噺',
+      outputVars: {
+        className: '鍒嗙被鍚嶇О',
+      },
+      class: '鍒嗙被',
+      classNamePlaceholder: '杈撳叆浣犵殑鍒嗙被鍚嶇О',
+      advancedSetting: '楂樼骇璁剧疆',
+      topicName: '涓婚鍐呭',
+      topicPlaceholder: '鍦ㄨ繖閲岃緭鍏ヤ綘鐨勪富棰樺唴瀹�',
+      addClass: '娣诲姞鍒嗙被',
+      instruction: '鎸囦护',
+      instructionTip: '浣犲彲浠ヨ緭鍏ラ澶栫殑闄勫姞鎸囦护锛屽府鍔╅棶棰樺垎绫诲櫒鏇村ソ鐨勭悊瑙e浣曞垎绫�',
+      instructionPlaceholder: '鍦ㄨ繖閲岃緭鍏ヤ綘鐨勬寚浠�',
+    },
+    parameterExtractor: {
+      inputVar: '杈撳叆鍙橀噺',
+      extractParameters: '鎻愬彇鍙傛暟',
+      importFromTool: '浠庡伐鍏峰鍏�',
+      addExtractParameter: '娣诲姞鎻愬彇鍙傛暟',
+      addExtractParameterContent: {
+        name: '鍚嶇О',
+        namePlaceholder: '鎻愬彇鍙傛暟鍚嶇О',
+        type: '绫诲瀷',
+        typePlaceholder: '鎻愬彇鍙傛暟绫诲瀷',
+        description: '鎻忚堪',
+        descriptionPlaceholder: '鎻愬彇鍙傛暟鎻忚堪',
+        required: '蹇呭~',
+        requiredContent: '蹇呭~浠呬綔涓烘ā鍨嬫帹鐞嗙殑鍙傝�冿紝涓嶇敤浜庡弬鏁拌緭鍑虹殑寮哄埗楠岃瘉銆�',
+      },
+      extractParametersNotSet: '鎻愬彇鍙傛暟鏈缃�',
+      instruction: '鎸囦护',
+      instructionTip: '浣犲彲浠ヨ緭鍏ラ澶栫殑闄勫姞鎸囦护锛屽府鍔╁弬鏁版彁鍙栧櫒鐞嗚В濡備綍鎻愬彇鍙傛暟',
+      advancedSetting: '楂樼骇璁剧疆',
+      reasoningMode: '鎺ㄧ悊妯″紡',
+      reasoningModeTip: '浣犲彲浠ユ牴鎹ā鍨嬪浜� Function calling 鎴� Prompt 鐨勬寚浠ゅ搷搴旇兘鍔涢�夋嫨鍚堥�傜殑鎺ㄧ悊妯″紡',
+      isSuccess: '鏄惁鎴愬姛銆傛垚鍔熸椂鍊间负 1锛屽け璐ユ椂鍊间负 0銆�',
+      errorReason: '閿欒鍘熷洜',
+    },
+    iteration: {
+      deleteTitle: '鍒犻櫎杩唬鑺傜偣锛�',
+      deleteDesc: '鍒犻櫎杩唬鑺傜偣灏嗗垹闄ゆ墍鏈夊瓙鑺傜偣',
+      input: '杈撳叆',
+      output: '杈撳嚭鍙橀噺',
+      iteration_one: '{{count}}涓凯浠�',
+      iteration_other: '{{count}}涓凯浠�',
+      currentIteration: '褰撳墠杩唬',
+      comma: '锛�',
+      error_one: '{{count}}涓け璐�',
+      error_other: '{{count}}涓け璐�',
+      parallelMode: '骞惰妯″紡',
+      parallelModeUpper: '骞惰妯″紡',
+      parallelModeEnableTitle: '骞惰妯″紡鍚敤',
+      parallelModeEnableDesc: '鍚敤骞惰妯″紡鏃惰凯浠e唴鐨勪换鍔℃敮鎸佸苟琛屾墽琛屻�備綘鍙互鍦ㄥ彸渚х殑灞炴�ч潰鏉夸腑杩涜閰嶇疆銆�',
+      parallelPanelDesc: '鍦ㄥ苟琛屾ā寮忎笅锛岃凯浠d腑鐨勪换鍔℃敮鎸佸苟琛屾墽琛屻��',
+      MaxParallelismTitle: '鏈�澶у苟琛屽害',
+      MaxParallelismDesc: '鏈�澶у苟琛屽害鐢ㄤ簬鎺у埗鍗曟杩唬涓悓鏃舵墽琛岀殑浠诲姟鏁伴噺銆�',
+      errorResponseMethod: '閿欒鍝嶅簲鏂规硶',
+      ErrorMethod: {
+        operationTerminated: '閿欒鏃剁粓姝�',
+        continueOnError: '蹇界暐閿欒骞剁户缁�',
+        removeAbnormalOutput: '绉婚櫎閿欒杈撳嚭',
+      },
+      answerNodeWarningDesc: '骞惰妯″紡璀﹀憡锛氬湪杩唬涓紝鍥炵瓟鑺傜偣銆佷細璇濆彉閲忚祴鍊煎拰宸ュ叿鎸佷箙璇�/鍐欐搷浣滃彲鑳戒細瀵艰嚧寮傚父銆�',
+    },
+    loop: {
+      deleteTitle: '鍒犻櫎寰幆鑺傜偣锛�',
+      deleteDesc: '鍒犻櫎寰幆鑺傜偣灏嗗垹闄ゆ墍鏈夊瓙鑺傜偣',
+      input: '杈撳叆',
+      output: '杈撳嚭鍙橀噺',
+      loop_one: '{{count}} 涓惊鐜�',
+      loop_other: '{{count}} 涓惊鐜�',
+      currentLoop: '褰撳墠寰幆',
+      comma: '锛�',
+      error_one: '{{count}}涓け璐�',
+      error_other: '{{count}}涓け璐�',
+      breakCondition: '寰幆缁堟鏉′欢',
+      breakConditionTip: '鏀寔寮曠敤缁堟鏉′欢寰幆鍐呯殑鍙橀噺鍜屼細璇濆彉閲忋��',
+      loopMaxCount: '鏈�澶у惊鐜鏁�',
+      loopMaxCountError: '璇疯緭鍏ユ纭殑 鏈�澶у惊鐜鏁帮紝鑼冨洿涓� 1 鍒� {{maxCount}}',
+      errorResponseMethod: '閿欒鍝嶅簲鏂规硶',
+      ErrorMethod: {
+        operationTerminated: '閿欒鏃剁粓姝�',
+        continueOnError: '蹇界暐閿欒骞剁户缁�',
+        removeAbnormalOutput: '绉婚櫎閿欒杈撳嚭',
+      },
+      loopVariables: '寰幆鍙橀噺',
+      initialLoopVariables: '鍒濆寰幆鍙橀噺',
+      finalLoopVariables: '鏈�缁堝惊鐜彉閲�',
+      setLoopVariables: '鍦ㄥ惊鐜寖鍥村唴璁剧疆鍙橀噺',
+      variableName: '鍙橀噺鍚�',
+      inputMode: '杈撳叆妯″紡',
+      exitConditionTip: '寰幆鑺傜偣鑷冲皯闇�瑕佷竴涓��鍑烘潯浠�',
+      loopNode: '寰幆鑺傜偣',
+      currentLoopCount: '褰撳墠寰幆娆℃暟锛歿{count}}',
+      totalLoopCount: '鎬诲惊鐜鏁帮細{{count}}',
+    },
+    note: {
+      addNote: '娣诲姞娉ㄩ噴',
+      editor: {
+        placeholder: '杈撳叆娉ㄩ噴...',
+        small: '灏�',
+        medium: '涓�',
+        large: '澶�',
+        bold: '鍔犵矖',
+        italic: '鏂滀綋',
+        strikethrough: '鍒犻櫎绾�',
+        link: '閾炬帴',
+        openLink: '鎵撳紑',
+        unlink: '鍙栨秷閾炬帴',
+        enterUrl: '杈撳叆閾炬帴...',
+        invalidUrl: '鏃犳晥鐨勯摼鎺�',
+        bulletList: '鍒楄〃',
+        showAuthor: '鏄剧ず浣滆��',
+      },
+    },
+    docExtractor: {
+      inputVar: '杈撳叆鍙橀噺',
+      outputVars: {
+        text: '鎻愬彇鐨勬枃鏈�',
+      },
+      supportFileTypes: '鏀寔鐨勬枃浠剁被鍨�: {{types}}銆�',
+      learnMore: '浜嗚В鏇村',
+    },
+    listFilter: {
+      inputVar: '杈撳叆鍙橀噺',
+      filterCondition: '杩囨护鏉′欢',
+      filterConditionKey: '杩囨护鏉′欢鐨� Key',
+      filterConditionComparisonOperator: '杩囨护鏉′欢姣旇緝鎿嶄綔绗�',
+      filterConditionComparisonValue: '杩囨护鏉′欢姣旇緝鍊�',
+      selectVariableKeyPlaceholder: '閫夋嫨瀛愬彉閲忕殑 Key',
+      extractsCondition: '鍙栫 N 椤�',
+      limit: '鍙栧墠 N 椤�',
+      orderBy: '鎺掑簭',
+      asc: '鍗囧簭',
+      desc: '闄嶅簭',
+      outputVars: {
+        result: '杩囨护缁撴灉',
+        first_record: '绗竴鏉¤褰�',
+        last_record: '鏈�鍚庝竴鏉¤褰�',
+      },
+    },
+    agent: {
+      strategy: {
+        label: 'Agent 绛栫暐',
+        tooltip: '涓嶅悓鐨� Agent 绛栫暐鍐冲畾浜嗙郴缁熷浣曡鍒掑拰鎵ц澶氭宸ュ叿璋冪敤',
+        shortLabel: '绛栫暐',
+        configureTip: '璇烽厤缃� Agent 绛栫暐銆�',
+        configureTipDesc: '閰嶇疆瀹屾垚鍚庯紝姝よ妭鐐瑰皢鑷姩鍔犺浇鍓╀綑閰嶇疆銆傜瓥鐣ュ皢褰卞搷澶氭宸ュ叿鎺ㄧ悊鐨勬満鍒躲��',
+        selectTip: '閫夋嫨 Agent 绛栫暐',
+        searchPlaceholder: '鎼滅储 Agent 绛栫暐',
+      },
+      learnMore: '浜嗚В鏇村',
+      pluginNotInstalled: '鎻掍欢鏈畨瑁�',
+      pluginNotInstalledDesc: '姝ゆ彃浠舵槸浠� GitHub 瀹夎鐨勩�傝杞埌鎻掍欢閲嶆柊瀹夎',
+      linkToPlugin: '杞埌鎻掍欢',
+      pluginInstaller: {
+        install: '瀹夎',
+        installing: '瀹夎涓�',
+      },
+      modelNotInMarketplace: {
+        title: '妯″瀷鏈畨瑁�',
+        desc: '姝ゆā鍨嬪畨瑁呰嚜鏈湴鎴� GitHub 浠撳簱銆傝瀹夎鍚庝娇鐢ㄣ��',
+        manageInPlugins: '鍦ㄦ彃浠朵腑绠$悊',
+      },
+      modelNotSupport: {
+        title: '涓嶆敮鎸佺殑妯″瀷',
+        desc: '宸插畨瑁呯殑鎻掍欢鐗堟湰涓嶆彁渚涙妯″瀷銆�',
+        descForVersionSwitch: '宸插畨瑁呯殑鎻掍欢鐗堟湰涓嶆彁渚涙妯″瀷銆傜偣鍑诲垏鎹㈢増鏈��',
+      },
+      model: '妯″瀷',
+      toolbox: '宸ュ叿绠�',
+      strategyNotSet: '浠g悊绛栫暐鏈缃�',
+      configureModel: '閰嶇疆妯″瀷',
+      notAuthorized: '鏈巿鏉�',
+      tools: '宸ュ叿',
+      maxIterations: '鏈�澶ц凯浠f鏁�',
+      modelNotInstallTooltip: '姝ゆā鍨嬫湭瀹夎',
+      modelNotSelected: '鏈�夋嫨妯″瀷',
+      toolNotInstallTooltip: '{{tool}} 鏈畨瑁�',
+      toolNotAuthorizedTooltip: '{{tool}} 鏈巿鏉�',
+      strategyNotInstallTooltip: '{{strategy}} 鏈畨瑁�',
+      unsupportedStrategy: '涓嶆敮鎸佺殑绛栫暐',
+      strategyNotFoundDesc: '瀹夎鐨勬彃浠剁増鏈笉鎻愪緵姝ょ瓥鐣ャ��',
+      pluginNotFoundDesc: '姝ゆ彃浠跺畨瑁呰嚜 GitHub銆傝杞埌鎻掍欢閲嶆柊瀹夎銆�',
+      strategyNotFoundDescAndSwitchVersion: '瀹夎鐨勬彃浠剁増鏈笉鎻愪緵姝ょ瓥鐣ャ�傜偣鍑诲垏鎹㈢増鏈��',
+      modelSelectorTooltips: {
+        deprecated: '姝ゆā鍨嬪凡寮冪敤',
+      },
+      outputVars: {
+        text: 'agent 鐢熸垚鐨勫唴瀹�',
+        files: {
+          title: 'agent 鐢熸垚鐨勬枃浠�',
+          type: '鏀寔绫诲瀷銆傜幇鍦ㄥ彧鏀寔鍥剧墖',
+          transfer_method: '浼犺緭鏂瑰紡銆傚�间负 remote_url 鎴� local_file',
+          url: '鍥剧墖閾炬帴',
+          upload_file_id: '涓婁紶鏂囦欢ID',
+        },
+        json: 'agent 鐢熸垚鐨刯son',
+      },
+      checkList: {
+        strategyNotSelected: '鏈�夋嫨绛栫暐',
+      },
+      installPlugin: {
+        title: '瀹夎鎻掍欢',
+        desc: '鍗冲皢瀹夎浠ヤ笅鎻掍欢',
+        changelog: '鏇存柊鏃ュ織',
+        install: '瀹夎',
+        cancel: '鍙栨秷',
+      },
+    },
+  },
+  tracing: {
+    stopBy: '鐢眥{user}}缁堟',
+  },
+  versionHistory: {
+    title: '鐗堟湰',
+    currentDraft: '褰撳墠鑽夌',
+    latest: '鏈�鏂�',
+    filter: {
+      all: '鍏ㄩ儴',
+      onlyYours: '浠呬綘鐨�',
+      onlyShowNamedVersions: '鍙樉绀哄凡鍛藉悕鐗堟湰',
+      reset: '閲嶇疆',
+      empty: '娌℃湁鍖归厤鐨勭増鏈�',
+    },
+    defaultName: '鏈懡鍚�',
+    nameThisVersion: '鍛藉悕',
+    editVersionInfo: '缂栬緫淇℃伅',
+    editField: {
+      title: '鏍囬',
+      releaseNotes: '鍙戝竷璇存槑',
+      titleLengthLimit: '鏍囬涓嶈兘瓒呰繃{{limit}}涓瓧绗�',
+      releaseNotesLengthLimit: '鍙戝竷璇存槑涓嶈兘瓒呰繃{{limit}}涓瓧绗�',
+    },
+    releaseNotesPlaceholder: '璇锋弿杩板彉鏇�',
+    restorationTip: '鐗堟湰鍥炴粴鍚庯紝褰撳墠鑽夌灏嗚瑕嗙洊銆�',
+    deletionTip: '鍒犻櫎涓嶅彲閫嗭紝璇风‘璁ゃ��',
+    action: {
+      restoreSuccess: '鍥炴粴鎴愬姛',
+      restoreFailure: '鍥炴粴澶辫触',
+      deleteSuccess: '鐗堟湰宸插垹闄�',
+      deleteFailure: '鍒犻櫎澶辫触',
+      updateSuccess: '鐗堟湰淇℃伅宸叉洿鏂�',
+      updateFailure: '鏇存柊澶辫触',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hant/app-annotation.ts b/i18n/zh-Hant/app-annotation.ts
new file mode 100644
index 0000000..e1fee46
--- /dev/null
+++ b/i18n/zh-Hant/app-annotation.ts
@@ -0,0 +1,90 @@
+const translation = {
+  title: '妯欒ɑ',
+  name: '妯欒ɑ鍥炶',
+  editBy: '{{author}}绶ㄨ集鐨勭瓟妗�',
+  noData: {
+    title: '娌掓湁妯欒ɑ',
+    description: '浣犲彲浠ュ湪鎳夌敤鏈冭┍闄ら尟涓法杓瑷伙紝涔熷彲浠ュ湪姝ゆ壒娆″尟鍏ユ瑷荤敤鏂奸珮璩噺鍥炲京銆�',
+  },
+  table: {
+    header: {
+      question: '鎻愬晱',
+      match: '鍖归厤',
+      response: '鍥炶',
+      answer: '绛旀',
+      createdAt: '寤虹珛鏅傞枔',
+      hits: '鍛戒腑娆℃暩',
+      actions: '鎿嶄綔',
+      addAnnotation: '鏂板妯欒ɑ',
+      bulkImport: '鎵规鍖叆',
+      bulkExport: '鎵规鍖嚭',
+      clearAll: '鍒櫎鎵�鏈夋瑷�',
+    },
+  },
+  editModal: {
+    title: '绶ㄨ集妯欒ɑ鍥炶',
+    queryName: '浣跨敤鑰呮彁鍟�',
+    answerName: '姗熷櫒鍥炶',
+    yourAnswer: '鎮ㄧ殑鍥炶',
+    answerPlaceholder: '鍦ㄩ�欒!杓稿叆鎮ㄧ殑鍥炶',
+    yourQuery: '鎮ㄧ殑鎻愬晱',
+    queryPlaceholder: '鍦ㄩ�欒!杓稿叆鎮ㄧ殑鎻愬晱',
+    removeThisCache: '鍒櫎姝ゆ瑷�',
+    createdAt: '鍓靛缓鏂�',
+  },
+  addModal: {
+    title: '鏂板妯欒ɑ鍥炶',
+    queryName: '鎻愬晱',
+    answerName: '鍥炶',
+    answerPlaceholder: '杓稿叆鍥炶',
+    queryPlaceholder: '杓稿叆鎻愬晱',
+    createNext: '鏂板涓嬩竴鍊嬫瑷诲洖瑕�',
+  },
+  batchModal: {
+    title: '鎵规鍖叆',
+    csvUploadTitle: '灏囨偍鐨� CSV 妾旀鎷栨斁鍒版铏曪紝鎴�',
+    browse: '閬告搰妾旀',
+    tip: 'CSV 妾旀蹇呴爤绗﹀悎浠ヤ笅绲愭锛�',
+    question: '鍟忛',
+    answer: '鍥炵瓟',
+    contentTitle: '鍒嗘鍏у',
+    content: '鍏у',
+    template: '涓嬭級妯℃澘',
+    cancel: '鍙栨秷',
+    run: '鍖叆',
+    runError: '鎵规鍖叆澶辨晽',
+    processing: '鎵规铏曠悊涓�',
+    completed: '鍖叆瀹屾垚',
+    error: '鍖叆鍑洪尟',
+    ok: '纰哄畾',
+  },
+  errorMessage: {
+    answerRequired: '鍥炶涓嶈兘鐐虹┖',
+    queryRequired: '鎻愬晱涓嶈兘鐐虹┖',
+  },
+  viewModal: {
+    annotatedResponse: '妯欒ɑ鍥炶',
+    hitHistory: '鍛戒腑姝峰彶',
+    hit: '娆″懡涓�',
+    hits: '娆″懡涓�',
+    noHitHistory: '娌掓湁鍛戒腑姝峰彶',
+  },
+  hitHistoryTable: {
+    question: '鍟忛',
+    query: '鎻愬晱',
+    match: '鍖归厤',
+    response: '鍥炶',
+    source: '渚嗘簮',
+    score: '鍒嗘暩',
+    time: '鏅傞枔',
+  },
+  initSetup: {
+    title: '妯欒ɑ鍥炶鍒濆瑷畾',
+    configTitle: '妯欒ɑ鍥炶瑷畾',
+    confirmBtn: '鍎插瓨涓﹀暉鐢�',
+    configConfirmBtn: '鍎插瓨',
+  },
+  embeddingModelSwitchTip: '妯欒ɑ鏂囧瓧鍚戦噺鍖栨ā鍨嬶紝鍒囨彌妯″瀷鏈冮噸鏂板祵鍏ワ紝鐢㈢敓椤嶅璨荤敤娑堣��',
+}
+
+export default translation
diff --git a/i18n/zh-Hant/app-api.ts b/i18n/zh-Hant/app-api.ts
new file mode 100644
index 0000000..1a2cff7
--- /dev/null
+++ b/i18n/zh-Hant/app-api.ts
@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'API 浼烘湇鍣�',
+  apiKey: 'API 閲戦懓',
+  status: '鐙�鎱�',
+  disabled: '宸插仠鐢�',
+  ok: '鍩疯涓�',
+  copy: '瑜囪=',
+  copied: '宸茶瑁�',
+  play: '鎾斁',
+  pause: '鏆仠',
+  playing: '鎾斁涓�',
+  loading: '杓夊叆涓�',
+  merMaid: {
+    rerender: '閲嶆柊娓叉煋',
+  },
+  never: '寰炴湭',
+  apiKeyModal: {
+    apiSecretKey: 'API 閲戦懓',
+    apiSecretKeyTips: '濡傛灉涓嶆兂浣犵殑 API 琚揩鐢紝璜嬩繚璀峰ソ浣犵殑 API Key :) 鏈�浣冲韪愭槸閬垮厤鍦ㄥ墠绔▼寮忕⒓涓槑鏂囧紩鐢ㄣ��',
+    createNewSecretKey: '寤虹珛閲戦懓',
+    secretKey: '閲戦懓',
+    created: '寤虹珛鏅傞枔',
+    lastUsed: '鏈�寰屼娇鐢�',
+    generateTips: '璜嬪皣姝ら噾閼板劜瀛樺湪瀹夊叏涓斿彲瑷晱鐨勫湴鏂广��',
+  },
+  actionMsg: {
+    deleteConfirmTitle: '鍒櫎姝ら噾閼帮紵',
+    deleteConfirmTips: '鍒櫎閲戦懓鐒℃硶鎾ら姺锛屾鍦ㄤ娇鐢ㄤ腑鐨勬噳鐢ㄦ渻鍙楀奖闊裤��',
+    ok: '濂界殑',
+  },
+  completionMode: {
+    title: '鏂囧瓧鐢熸垚鍨嬫噳鐢� API',
+    info: '鍙敤鏂肩敓鎴愰珮璩噺鏂囧瓧鐨勬噳鐢紝渚嬪鐢熸垚鏂囩珷銆佹憳瑕併�佺炕璀瓑锛岄�忛亷鍛煎彨 completion-messages 浠嬮潰锛屽偝閫佷娇鐢ㄨ�呰几鍏ュ緱鍒扮敓鎴愭枃瀛楃祼鏋溿�傜敤鏂肩敓鎴愭枃瀛楃殑妯″瀷寮曟暩鍜屾彁绀鸿妯$増鍙栨焙鏂奸枊鐧艰�呭湪 Dify 鎻愮ず瑭炵法鎺掗爜鐨勮ō瀹氥��',
+    createCompletionApi: '寤虹珛鏂囧瓧瑁滃叏瑷婃伅',
+    createCompletionApiTip: '寤虹珛鏂囧瓧瑁滃叏瑷婃伅锛屾敮鎻翠竴鍟忎竴绛旀ā寮忋��',
+    inputsTips: '锛堥伕濉級浠ラ嵉鍊煎皪鏂瑰紡鎻愪緵浣跨敤鑰呰几鍏ユ瑒浣嶏紝鑸囨彁绀鸿绶ㄦ帓涓殑璁婃暩灏嶆噳銆侹ey 鐐鸿畩鏁稿悕绋憋紝Value 鏄紩鏁稿�笺�傚鏋滄瑒浣嶅瀷鍒ョ偤 Select锛屽偝鍏ョ殑 Value 闇�鐐洪爯瑷伕闋呬箣涓�銆�',
+    queryTips: '浣跨敤鑰呰几鍏ョ殑鏂囧瓧姝f枃銆�',
+    blocking: 'blocking 闃诲鍨嬶紝绛夊緟鍩疯瀹岀暍寰岃繑鍥炵祼鏋溿�傦紙璜嬫眰鑻ユ祦绋嬭純闀峰彲鑳芥渻琚腑鏂凤級',
+    streaming: 'streaming 娴佸紡杩斿洖銆傚熀鏂� SSE锛�**[Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)**锛夊鐝炬祦寮忚繑鍥炪��',
+    messageFeedbackApi: '瑷婃伅鍙嶉锛堥粸璐婏級',
+    messageFeedbackApiTip: '浠h〃绲傜浣跨敤鑰呭皪杩斿洖瑷婃伅閫茶瑭曞児锛屽彲浠ラ粸璐婅垏榛炶俯锛岃┎璩囨枡灏囧湪鈥滄棩瑾岃垏妯欒ɑ鈥濋爜涓彲瑕嬶紝涓︾敤鏂煎緦绾岀殑妯″瀷寰銆�',
+    messageIDTip: '瑷婃伅 ID',
+    ratingTip: 'like 鎴� dislike锛� 绌哄�肩偤鎾ら姺',
+    parametersApi: '鐛插彇鎳夌敤閰嶇疆璩囪▕',
+    parametersApiTip: '鐛插彇宸查厤缃殑 Input 寮曟暩锛屽寘鎷畩鏁稿悕銆佹瑒浣嶅悕绋便�佸瀷鍒ヨ垏闋愯ō鍊笺�傞�氬父鐢ㄦ柤瀹㈡埗绔級鍏ュ緦椤ず閫欎簺娆勪綅鐨勮〃鍠垨濉叆闋愯ō鍊笺��',
+  },
+  chatMode: {
+    title: '灏嶈┍鍨嬫噳鐢� API',
+    info: '鍙敤鏂煎ぇ閮ㄥ垎鍫存櫙鐨勫皪瑭卞瀷鎳夌敤锛屾帯鐢ㄤ竴鍟忎竴绛旀ā寮忚垏浣跨敤鑰呮寔绾屽皪瑭便�傝闁嬪涓�鍊嬪皪瑭辫珛鍛煎彨 chat-messages 浠嬮潰锛岄�忛亷绻肩簩鍌冲叆杩斿洖鐨� conversation_id 鍙寔绾屼繚鎸佽┎鏈冭┍銆�',
+    createChatApi: '鍌抽�佸皪瑭辫▕鎭�',
+    createChatApiTip: '寤虹珛鏈冭┍瑷婃伅锛屾垨鍩烘柤姝ゅ墠鐨勫皪瑭辩辜绾屽偝閫佽▕鎭��',
+    inputsTips: '锛堥伕濉級浠ラ嵉鍊煎皪鏂瑰紡鎻愪緵浣跨敤鑰呰几鍏ユ瑒浣嶏紝鑸囨彁绀鸿绶ㄦ帓涓殑璁婃暩灏嶆噳銆侹ey 鐐鸿畩鏁稿悕绋憋紝Value 鏄紩鏁稿�笺�傚鏋滄瑒浣嶅瀷鍒ョ偤 Select锛屽偝鍏ョ殑 Value 闇�鐐洪爯瑷伕闋呬箣涓�銆�',
+    queryTips: ' 浣跨敤鑰呰几鍏�/鎻愬晱鍏у',
+    blocking: 'blocking 闃诲鍨嬶紝绛夊緟鍩疯瀹岀暍寰岃繑鍥炵祼鏋溿�傦紙璜嬫眰鑻ユ祦绋嬭純闀峰彲鑳芥渻琚腑鏂凤級',
+    streaming: 'streaming 娴佸紡杩斿洖銆傚熀鏂� SSE锛�**[Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)**锛夊鐝炬祦寮忚繑鍥炪��',
+    conversationIdTip: '锛堥伕濉級鏈冭┍璀樺垾绗﹁櫉锛岄娆″皪瑭卞彲鐐虹┖锛屽鏋滆绻肩簩灏嶈┍璜嬪偝鍏ヤ笂涓嬫枃杩斿洖鐨� conversation_id',
+    messageFeedbackApi: '瑷婃伅鍙嶉锛堥粸璐婏級',
+    messageFeedbackApiTip: '浠h〃绲傜浣跨敤鑰呭皪杩斿洖瑷婃伅閫茶瑭曞児锛屽彲浠ラ粸璐婅垏榛炶俯锛岃┎璩囨枡灏囧湪鈥滄棩瑾岃垏妯欒ɑ鈥濋爜涓彲瑕嬶紝涓︾敤鏂煎緦绾岀殑妯″瀷寰銆�',
+    messageIDTip: '瑷婃伅 ID',
+    ratingTip: 'like 鎴� dislike锛� 绌哄�肩偤鎾ら姺',
+    chatMsgHistoryApi: '鐛插彇鏈冭┍姝峰彶瑷婃伅',
+    chatMsgHistoryApiTip: '婊惧嫊杓夊叆褰㈠紡杩斿洖姝峰彶鑱婂ぉ瑷橀寗锛岀涓�闋佽繑鍥炴渶鏂� `limit` 姊濓紝鍗筹細鍊掑簭杩斿洖銆�',
+    chatMsgHistoryConversationIdTip: '鏈冭┍ ID',
+    chatMsgHistoryFirstId: '鐣跺墠闋佺涓�姊濊亰澶╄閷勭殑 ID锛岄爯瑷� none',
+    chatMsgHistoryLimit: '涓�娆¤珛姹傝繑鍥炲灏戞鑱婂ぉ瑷橀寗',
+    conversationsListApi: '鐛插彇鏈冭┍鍒楄〃',
+    conversationsListApiTip: '鐛插彇鐣跺墠浣跨敤鑰呯殑鏈冭┍鍒楄〃锛岄爯瑷繑鍥炴渶杩戠殑 20 姊濄��',
+    conversationsListFirstIdTip: ' 鐣跺墠闋佹渶鍓嶉潰涓�姊濊閷勭殑 ID锛岄爯瑷� none',
+    conversationsListLimitTip: '涓�娆¤珛姹傝繑鍥炲灏戞瑷橀寗',
+    conversationRenamingApi: '鏈冭┍閲嶆柊鍛藉悕',
+    conversationRenamingApiTip: '灏嶆渻瑭遍�茶閲嶆柊鍛藉悕锛屾渻瑭卞悕绋辩敤鏂奸’绀哄湪鏀彺澶氭渻瑭辩殑瀹㈡埗绔笂銆�',
+    conversationRenamingNameTip: '鏂扮殑鍚嶇ū',
+    parametersApi: '鐛插彇鎳夌敤閰嶇疆璩囪▕',
+    parametersApiTip: '鐛插彇宸查厤缃殑 Input 寮曟暩锛屽寘鎷畩鏁稿悕銆佹瑒浣嶅悕绋便�佸瀷鍒ヨ垏闋愯ō鍊笺�傞�氬父鐢ㄦ柤瀹㈡埗绔級鍏ュ緦椤ず閫欎簺娆勪綅鐨勮〃鍠垨濉叆闋愯ō鍊笺��',
+  },
+  develop: {
+    requestBody: 'Request Body',
+    pathParams: 'Path Params',
+    query: 'Query',
+    toc: '鐩綍',
+  },
+  regenerate: '閲嶆柊鐢熸垚',
+}
+
+export default translation
diff --git a/i18n/zh-Hant/app-debug.ts b/i18n/zh-Hant/app-debug.ts
new file mode 100644
index 0000000..ad29195
--- /dev/null
+++ b/i18n/zh-Hant/app-debug.ts
@@ -0,0 +1,404 @@
+const translation = {
+  pageTitle: {
+    line1: '鎻愮ず瑭�',
+    line2: '绶ㄦ帓',
+  },
+  orchestrate: '绶ㄦ帓',
+  promptMode: {
+    simple: '鍒囨彌鍒板皥瀹舵ā寮忎互绶ㄨ集瀹屾暣鐨勬彁绀鸿',
+    advanced: '灏堝妯″紡',
+    switchBack: '杩斿洖绨℃槗妯″紡',
+    advancedWarning: {
+      title: '鎮ㄥ凡鍒囨彌鍒板皥瀹舵ā寮忥紝涓�鏃︿慨鏀规彁绀鸿锛屽皣鐒℃硶杩斿洖绨℃槗妯″紡銆�',
+      description: '鍦ㄥ皥瀹舵ā寮忎笅锛屾偍鍙互绶ㄨ集瀹屾暣鐨勬彁绀鸿銆�',
+      learnMore: '鐬В鏇村',
+      ok: '纰哄畾',
+    },
+    operation: {
+      addMessage: '鏂板瑷婃伅',
+    },
+    contextMissing: '涓婁笅鏂囧収瀹瑰缂哄け锛屾彁绀鸿鐨勬湁鏁堟�у彲鑳戒笉濂姐��',
+  },
+  operation: {
+    applyConfig: '閲嬪嚭',
+    resetConfig: '閲嶇疆',
+    debugConfig: '闄ら尟',
+    addFeature: '鏂板鍔熻兘',
+    automatic: '鐢㈢敓',
+    stopResponding: '鍋滄闊挎噳',
+    agree: '璐婂悓',
+    disagree: '鍙嶅皪',
+    cancelAgree: '鍙栨秷璐婂悓',
+    cancelDisagree: '鍙栨秷鍙嶅皪',
+    userAction: '浣跨敤鑰呰〃绀�',
+  },
+  notSetAPIKey: {
+    title: 'LLM 鎻愪緵鑰呯殑閲戦懓鏈ō瀹�',
+    trailFinished: '瑭︾敤宸茬祼鏉�',
+    description: '鍦ㄩ櫎閷箣鍓嶉渶瑕佽ō瀹� LLM 鎻愪緵鑰呯殑閲戦懓銆�',
+    settingBtn: '鍘昏ō瀹�',
+  },
+  trailUseGPT4Info: {
+    title: '鐣跺墠涓嶆敮鎻翠娇鐢� gpt-4',
+    description: '浣跨敤 gpt-4锛岃珛瑷畾 API Key',
+  },
+  feature: {
+    groupChat: {
+      title: '鑱婂ぉ澧炲挤',
+      description: '鐐鸿亰澶╁瀷鎳夌敤鏂板闋愬皪瑭辫ō瀹氾紝鍙互鎻愬崌浣跨敤鑰呴珨椹椼��',
+    },
+    groupExperience: {
+      title: '楂旈澧炲挤',
+    },
+    conversationOpener: {
+      title: '灏嶈┍闁嬪牬鐧�',
+      description: '鍦ㄥ皪瑭卞瀷鎳夌敤涓紝璁� AI 涓诲嫊瑾涓�娈佃┍鍙互鎷夎繎鑸囦娇鐢ㄨ�呴枔鐨勮窛闆€��',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: '涓嬩竴姝ュ晱椤屽缓璀�',
+      description: '瑷畾涓嬩竴姝ュ晱椤屽缓璀板彲浠ヨ畵浣跨敤鑰呮洿濂界殑灏嶈┍銆�',
+      resDes: '鍥炵瓟绲愭潫寰岀郴绲辨渻绲﹀嚭 3 鍊嬪缓璀�',
+      tryToAsk: '瑭﹁憲鍟忓晱',
+    },
+    moreLikeThis: {
+      title: '鏇村椤炰技鐨�',
+      description: '涓�娆$敓鎴愬姊濇枃瀛楋紝鍙湪姝ゅ熀绀庝笂绶ㄨ集涓︾辜绾岀敓鎴�',
+      generateNumTip: '姣忔鐢熸垚鏁�',
+      tip: '浣跨敤姝ゅ姛鑳藉皣鏈冮澶栨秷鑰� tokens',
+    },
+    speechToText: {
+      title: '瑾為煶杞夋枃瀛�',
+      description: '鍟熺敤寰岋紝鎮ㄥ彲浠ヤ娇鐢ㄨ獮闊宠几鍏ャ��',
+      resDes: '瑾為煶杓稿叆宸插暉鐢�',
+    },
+    textToSpeech: {
+      title: '鏂囧瓧杞夎獮闊�',
+      description: '鍟熺敤寰岋紝鏂囧瓧鍙互杞夋彌鎴愯獮闊炽��',
+      resDes: '鏂囧瓧杞夐煶瑷婂凡鍟熺敤',
+    },
+    citation: {
+      title: '寮曠敤鍜屾灞�',
+      description: '鍟熺敤寰岋紝椤ず婧愭枃浠跺拰鐢熸垚鍏у鐨勬灞儴鍒嗐��',
+      resDes: '寮曠敤鍜屾灞凡鍟熺敤',
+    },
+    annotation: {
+      title: '妯欒ɑ鍥炶',
+      description: '鍟熺敤寰岋紝灏囨瑷讳娇鐢ㄨ�呯殑鍥炶锛屼互渚垮湪浣跨敤鑰呴噸瑜囨彁鍟忔檪蹇�熼熆鎳夈��',
+      resDes: '妯欒ɑ鍥炶宸插暉鐢�',
+      scoreThreshold: {
+        title: '鍒嗘暩闁惧��',
+        description: '鐢ㄦ柤瑷畾妯欒ɑ鍥炶鐨勫尮閰嶇浉浼煎害闁惧�笺��',
+        easyMatch: '瀹规槗鍖归厤',
+        accurateMatch: '绮炬簴鍖归厤',
+      },
+      matchVariable: {
+        title: '鍖归厤璁婃暩',
+        choosePlaceholder: '璜嬮伕鎿囪畩鏁�',
+      },
+      cacheManagement: '妯欒ɑ绠$悊',
+      cached: '宸叉瑷�',
+      remove: '绉婚櫎',
+      removeConfirm: '鍒櫎閫欏�嬫瑷伙紵',
+      add: '鏂板妯欒ɑ',
+      edit: '绶ㄨ集妯欒ɑ',
+    },
+    dataSet: {
+      title: '涓婁笅鏂�',
+      noData: '鎮ㄥ彲浠ュ尟鍏ョ煡璀樺韩浣滅偤涓婁笅鏂�',
+      words: '瑭�',
+      textBlocks: '鏂囧瓧濉�',
+      selectTitle: '閬告搰寮曠敤鐭ヨ瓨搴�',
+      selected: '鍊嬬煡璀樺韩琚伕涓�',
+      noDataSet: '鏈壘鍒扮煡璀樺韩',
+      toCreate: '鍘诲缓绔�',
+      notSupportSelectMulti: '鐩墠鍙敮鎻村紩鐢ㄤ竴鍊嬬煡璀樺韩',
+      queryVariable: {
+        title: '鏌ヨ璁婃暩',
+        tip: '瑭茶畩鏁稿皣鐢ㄤ綔涓婁笅鏂囨绱㈢殑鏌ヨ杓稿叆锛岀嵅鍙栬垏瑭茶畩鏁哥殑杓稿叆鐩搁棞鐨勪笂涓嬫枃璩囪▕銆�',
+        choosePlaceholder: '璜嬮伕鎿囪畩鏁�',
+        noVar: '娌掓湁璁婃暩',
+        noVarTip: '璜嬪缓绔嬭畩鏁�',
+        unableToQueryDataSet: '鐒℃硶鏌ヨ鐭ヨ瓨搴�',
+        unableToQueryDataSetTip: '鐒℃硶鎴愬姛鏌ヨ鐭ヨ瓨搴紝璜嬪湪涓婁笅鏂囬儴鍒嗛伕鎿囦竴鍊嬩笂涓嬫枃鏌ヨ璁婃暩銆�',
+        ok: '濂界殑',
+        contextVarNotEmpty: '涓婁笅鏂囨煡瑭㈣畩鏁镐笉鑳界偤绌�',
+        deleteContextVarTitle: '鍒櫎璁婃暩鈥渰{varName}}鈥濓紵',
+        deleteContextVarTip: '瑭茶畩鏁稿凡琚ō瀹氱偤涓婁笅鏂囨煡瑭㈣畩鏁革紝鍒櫎瑭茶畩鏁稿皣褰遍熆鐭ヨ瓨搴殑姝e父浣跨敤銆� 濡傛灉鎮ㄤ粛闇�瑕佸埅闄ゅ畠锛岃珛鍦ㄤ笂涓嬫枃閮ㄥ垎涓噸鏂伴伕鎿囧畠銆�',
+      },
+    },
+    tools: {
+      title: '宸ュ叿',
+      tips: '宸ュ叿鎻愪緵浜嗕竴鍊嬫婧栫殑 API 鍛煎彨鏂瑰紡锛屽皣浣跨敤鑰呰几鍏ユ垨璁婃暩浣滅偤 API 鐨勮珛姹傚紩鏁革紝鐢ㄦ柤鏌ヨ澶栭儴璩囨枡浣滅偤涓婁笅鏂囥��',
+      toolsInUse: '{{count}} 宸ュ叿浣跨敤涓�',
+      modal: {
+        title: '宸ュ叿',
+        toolType: {
+          title: '宸ュ叿鍨嬪垾',
+          placeholder: '璜嬮伕鎿囧伐鍏峰瀷鍒�',
+        },
+        name: {
+          title: '鍚嶇ū',
+          placeholder: '璜嬪~瀵悕绋�',
+        },
+        variableName: {
+          title: '璁婃暩鍚嶇ū',
+          placeholder: '璜嬪~瀵畩鏁稿悕绋�',
+        },
+      },
+    },
+    conversationHistory: {
+      title: '灏嶈┍姝峰彶',
+      description: '瑷畾灏嶈┍瑙掕壊鐨勫瓧棣栧悕绋�',
+      tip: '灏嶈┍姝峰彶鏈暉鐢紝璜嬪湪涓婇潰鐨勬彁绀轰腑鏂板<histories>銆�',
+      learnMore: '鐬В鏇村',
+      editModal: {
+        title: '绶ㄨ集灏嶈┍瑙掕壊鍚嶇ū',
+        userPrefix: '浣跨敤鑰呭瓧棣�',
+        assistantPrefix: '鍔╂墜瀛楅',
+      },
+    },
+    toolbox: {
+      title: '宸ュ叿绠�',
+    },
+    moderation: {
+      title: '鍏у瀵╂煡',
+      description: '鎮ㄥ彲浠ュ懠鍙鏌� API 鎴栬�呯董璀锋晱鎰熻搴締浣挎ā鍨嬫洿瀹夊叏鍦拌几鍑恒��',
+      allEnabled: '瀵╂煡杓稿叆/瀵╂煡杓稿嚭 鍏у宸插暉鐢�',
+      inputEnabled: '瀵╂煡杓稿叆鍏у宸插暉鐢�',
+      outputEnabled: '瀵╂煡杓稿嚭鍏у宸插暉鐢�',
+      modal: {
+        title: '鍏у瀵╂煡瑷畾',
+        provider: {
+          title: '椤炲垾',
+          openai: 'OpenAI Moderation',
+          openaiTip: {
+            prefix: 'OpenAI Moderation 闇�瑕佸湪',
+            suffix: '涓厤缃� OpenAI API 閲戦懓銆�',
+          },
+          keywords: '闂滈嵉瑭�',
+        },
+        keywords: {
+          tip: '姣忚涓�鍊嬶紝鐢ㄦ彌琛岀鍒嗛殧銆傛瘡琛屾渶澶� 100 鍊嬪瓧鍏冦��',
+          placeholder: '姣忚涓�鍊嬶紝鐢ㄦ彌琛岀鍒嗛殧',
+          line: '琛�',
+        },
+        content: {
+          input: '瀵╂煡杓稿叆鍏у',
+          output: '瀵╂煡杓稿嚭鍏у',
+          preset: '闋愯ō鍥炶',
+          placeholder: '閫欒!闋愯ō鍥炶鍏у',
+          condition: '瀵╂煡杓稿叆鍏у鍜屽鏌ヨ几鍑哄収瀹硅嚦灏戝暉鐢ㄤ竴闋�',
+          fromApi: '闋愯ō鍥炶閫忛亷 API 杩斿洖',
+          errorMessage: '闋愯ō鍥炶涓嶈兘鐐虹┖',
+          supportMarkdown: '鏀彺 Markdown',
+        },
+        openaiNotConfig: {
+          before: 'OpenAI 鍏у瀵╂煡闇�瑕佸湪',
+          after: '涓厤缃� OpenAI API 閲戦懓銆�',
+        },
+      },
+    },
+  },
+  resetConfig: {
+    title: '纰鸿獚閲嶇疆锛�',
+    message: '閲嶇疆灏囦笩澶辩暥鍓嶉爜闈㈡墍鏈変慨鏀癸紝鎭㈠京鑷充笂娆¢噵鍑烘檪鐨勯厤缃�',
+  },
+  errorMessage: {
+    nameOfKeyRequired: '璁婃暩 {{key}} 灏嶆噳鐨勫悕绋卞繀濉�',
+    valueOfVarRequired: '{{key}}蹇呭~',
+    queryRequired: '涓昏鏂囧瓧蹇呭~',
+    waitForResponse: '璜嬬瓑寰呬笂姊濊硣瑷婇熆鎳夊畬鎴�',
+    waitForBatchResponse: '璜嬬瓑寰呮壒娆′换鍕欏畬鎴�',
+    notSelectModel: '璜嬮伕鎿囨ā鍨�',
+    waitForImgUpload: '璜嬬瓑寰呭湒鐗囦笂鍌冲畬鎴�',
+  },
+  chatSubTitle: '鎻愮ず瑭�',
+  completionSubTitle: '瀛楅鎻愮ず瑭�',
+  promptTip:
+    '鎻愮ず瑭炵敤鏂煎皪 AI 鐨勫洖瑕嗗仛鍑轰竴绯诲垪鎸囦护鍜岀磩鏉熴�傚彲鎻掑叆琛ㄥ柈璁婃暩锛屼緥濡� {{input}}銆傞�欐鎻愮ず瑭炰笉鏈冭绲傜浣跨敤鑰呮墍鐪嬪埌銆�',
+  formattingChangedTitle: '绶ㄦ帓宸叉敼璁�',
+  formattingChangedText: '淇敼绶ㄦ帓灏囬噸缃櫎閷崁鍩燂紝纰哄畾鍡庯紵',
+  variableTitle: '璁婃暩',
+  notSetVar: '璁婃暩鑳戒娇浣跨敤鑰呰几鍏ヨ〃鍠紩鍏ユ彁绀鸿鎴栭枊鍫寸櫧锛屼綘鍙互瑭﹁│鍦ㄦ彁绀鸿涓几鍏� {{input}}',
+  variableTip:
+    '璁婃暩灏囦互琛ㄥ柈褰㈠紡璁撲娇鐢ㄨ�呭湪灏嶈┍鍓嶅~瀵紝浣跨敤鑰呭~瀵殑琛ㄥ柈鍏у灏囪嚜鍕曟浛鎻涙彁绀鸿涓殑璁婃暩銆�',
+  autoAddVar: '鎻愮ず瑭炰腑寮曠敤浜嗘湭瀹氱京鐨勮畩鏁革紝鏄惁鑷嫊鏂板鍒颁娇鐢ㄨ�呰几鍏ヨ〃鍠腑锛�',
+  variableTable: {
+    key: '璁婃暩 Key',
+    name: '娆勪綅鍚嶇ū',
+    optional: '鍙伕',
+    type: '鍨嬪垾',
+    action: '鎿嶄綔',
+    typeString: '鏂囧瓧',
+    typeSelect: '涓嬫媺閬搁爡',
+  },
+  varKeyError: {
+    canNoBeEmpty: '{{key}} 鏄繀瑕佺殑',
+    tooLong: '{{key}} 闀峰害澶暦銆備笉鑳借秴閬� 30 鍊嬪瓧鍏�',
+    notValid: '{{key}} 闈炴硶銆傚彧鑳藉寘鍚嫳鏂囧瓧鍏冿紝鏁稿瓧鍜屼笅鍔冪窔',
+    notStartWithNumber: '{{key}} 涓嶈兘浠ユ暩瀛楅枊闋�',
+    keyAlreadyExists: '{{key}} 宸插瓨鍦�',
+  },
+  otherError: {
+    promptNoBeEmpty: '鎻愮ず瑭炰笉鑳界偤绌�',
+    historyNoBeEmpty: '鎻愮ず瑭炰腑蹇呴爤瑷畾灏嶈┍姝峰彶',
+    queryNoBeEmpty: '鎻愮ず瑭炰腑蹇呴爤瑷畾鏌ヨ鍏у',
+  },
+  variableConfig: {
+    'addModalTitle': '鏂板璁婃暩',
+    'editModalTitle': '绶ㄨ集璁婃暩',
+    'description': '瑷畾璁婃暩 {{varName}}',
+    'fieldType': '娆勪綅鍨嬪垾',
+    'string': '鏂囧瓧',
+    'text-input': '鏂囧瓧',
+    'paragraph': '娈佃惤',
+    'select': '涓嬫媺閬搁爡',
+    'number': '鏁稿瓧',
+    'notSet': '鏈ō瀹氾紝鍦� Prompt 涓几鍏� {{input}} 瑭﹁│',
+    'stringTitle': '鏂囧瓧妗嗚ō瀹�',
+    'maxLength': '鏈�澶ч暦搴�',
+    'options': '閬搁爡',
+    'addOption': '鏂板閬搁爡',
+    'apiBasedVar': '鍩烘柤 API 鐨勮畩鏁�',
+    'varName': '璁婃暩鍚嶇ū',
+    'inputPlaceholder': '璜嬭几鍏�',
+    'labelName': '椤ず鍚嶇ū',
+    'required': '蹇呭~',
+    'errorMsg': {
+      varNameRequired: '璁婃暩鍚嶇ū蹇呭~',
+      labelNameRequired: '椤ず鍚嶇ū蹇呭~',
+      varNameCanBeRepeat: '璁婃暩鍚嶇ū涓嶈兘閲嶈',
+      atLeastOneOption: '鑷冲皯闇�瑕佷竴鍊嬮伕闋�',
+      optionRepeat: '閬搁爡涓嶈兘閲嶈',
+    },
+  },
+  vision: {
+    name: '瑕栬',
+    description: '闁嬪暉瑕栬鍔熻兘灏囧厑瑷辨ā鍨嬭几鍏ュ湒鐗囷紝涓︽牴鎿氬奖璞″収瀹圭殑鐞嗚В鍥炵瓟浣跨敤鑰呭晱椤�',
+    settings: '瑷畾',
+    visionSettings: {
+      title: '瑕栬瑷畾',
+      resolution: '瑙f瀽搴�',
+      resolutionTooltip: `浣庤В鏋愬害妯″紡灏囦娇妯″瀷鎺ユ敹褰辫薄鐨勪綆瑙f瀽搴︾増鏈紝灏哄鐐�512 x 512锛屼甫浣跨敤65 Tokens 渚嗚〃绀哄奖璞°�傞�欐ǎ鍙互浣緼PI鏇村揩鍦拌繑鍥為熆鎳夛紝涓﹀湪涓嶉渶瑕侀珮绱扮瘈鐨勭敤渚嬩腑娑堣�楁洿灏戠殑杓稿叆銆�
+      \n
+      楂樿В鏋愬害妯″紡灏囬鍏堝厑瑷辨ā鍨嬫瑕栦綆瑙f瀽搴﹀奖璞★紝鐒跺緦鏍规摎杓稿叆褰辫薄鐨勫ぇ灏忓缓绔�512鐣礌鐨勮┏绱拌鍓奖璞°�傛瘡鍊嬭┏绱拌鍓奖璞′娇鐢ㄥ叐鍊嶇殑闋愮畻绺藉叡鐐�129 Tokens銆俙,
+      high: '楂�',
+      low: '浣�',
+      uploadMethod: '涓婂偝鏂瑰紡',
+      both: '鍏╄��',
+      localUpload: '鏈湴涓婂偝',
+      url: 'URL',
+      uploadLimit: '涓婂偝鏁搁噺闄愬埗',
+    },
+  },
+  voice: {
+    name: '闊宠壊',
+    defaultDisplay: '闋愯ō闊宠壊',
+    description: '鏂囧瓧杞夎獮闊抽煶鑹茶ō瀹�',
+    settings: '瑷畾',
+    voiceSettings: {
+      title: '闊宠壊瑷畾',
+      language: '瑾炶█',
+      resolutionTooltip: '鏂囧瓧杞夎獮闊抽煶鑹叉敮鎻磋獮瑷�銆�',
+      voice: '闊宠壊',
+      autoPlay: '鑷嫊鎾斁',
+      autoPlayEnabled: '闁嬪暉',
+      autoPlayDisabled: '闂滈枆',
+    },
+  },
+  openingStatement: {
+    title: '灏嶈┍闁嬪牬鐧�',
+    add: '鏂板闁嬪牬鐧�',
+    writeOpener: '绶ㄥ闁嬪牬鐧�',
+    placeholder: '鍦ㄩ�欒!瀵笅浣犵殑闁嬪牬鐧斤紝浣犲彲浠ヤ娇鐢ㄨ畩鏁革紝鍢楄│杓稿叆 {{variable}}銆�',
+    openingQuestion: '闁嬪牬鍟忛',
+    noDataPlaceHolder:
+      '鍦ㄥ皪瑭卞瀷鎳夌敤涓紝璁� AI 涓诲嫊瑾涓�娈佃┍鍙互鎷夎繎鑸囦娇鐢ㄨ�呴枔鐨勮窛闆€��',
+    varTip: '浣犲彲浠ヤ娇鐢ㄨ畩鏁革紝 瑭﹁│杓稿叆 {{variable}}',
+    tooShort: '灏嶈┍鍓嶆彁绀鸿鑷冲皯 20 瀛楁墠鑳界敓鎴愰枊鍫寸櫧',
+    notIncludeKey: '瀛楅鎻愮ず瑭炰腑涓嶅寘鍚畩鏁� {{key}}銆傝珛鍦ㄥ瓧棣栨彁绀鸿涓柊澧炶┎璁婃暩',
+  },
+  modelConfig: {
+    model: '瑾炶█妯″瀷',
+    setTone: '妯″瀷瑷畾',
+    title: '妯″瀷鍙婂紩鏁�',
+    modeType: {
+      chat: '灏嶈┍鍨�',
+      completion: '瑁滃叏鍨�',
+    },
+  },
+  inputs: {
+    title: '闄ら尟鑸囬爯瑕�',
+    noPrompt: '鍢楄│鍦ㄥ皪瑭卞墠鎻愮ず妗嗕腑绶ㄥ涓�浜涙彁绀鸿',
+    userInputField: '浣跨敤鑰呰几鍏�',
+    noVar: '濉叆璁婃暩鐨勫�硷紝姣忔鍟熷嫊鏂版渻瑭辨檪瑭茶畩鏁稿皣鑷嫊鏇挎彌鎻愮ず瑭炰腑鐨勮畩鏁搞��',
+    chatVarTip: '濉叆璁婃暩鐨勫�硷紝瑭插�煎皣鍦ㄦ瘡娆¢枊鍟熶竴鍊嬫柊鏈冭┍鏅傝嚜鍕曟浛鎻涘埌鎻愮ず瑭炰腑',
+    completionVarTip: '濉叆璁婃暩鐨勫�硷紝瑭插�煎皣鍦ㄦ瘡娆℃彁浜ゅ晱椤屾檪鑷嫊鏇挎彌鍒版彁绀鸿涓�',
+    previewTitle: '鎻愮ず瑭為爯瑕�',
+    queryTitle: '鏌ヨ鍏у',
+    queryPlaceholder: '璜嬭几鍏ユ枃瀛楀収瀹�',
+    run: '鍩疯',
+  },
+  result: '绲愭灉',
+  datasetConfig: {
+    settingTitle: '鍙洖瑷畾',
+    knowledgeTip: '榛為伕 鈥�+鈥� 鎸夐垥鏂板鐭ヨ瓨搴�',
+    retrieveOneWay: {
+      title: 'N閬�1鍙洖',
+      description: '鏍规摎浣跨敤鑰呮剰鍦栧拰鐭ヨ瓨搴弿杩帮紝鐢� Agent 鑷富鍒ゆ柗閬告搰鏈�鍖归厤鐨勫柈鍊嬬煡璀樺韩渚嗘煡瑭㈢浉闂滄枃瀛楋紝閬╁悎鐭ヨ瓨搴崁鍒嗗害澶т笖鐭ヨ瓨搴暩閲忓亸灏戠殑鎳夌敤銆�',
+    },
+    retrieveMultiWay: {
+      title: '澶氳矾鍙洖',
+      description: '鏍规摎浣跨敤鑰呮剰鍦栧悓鏅傚尮閰嶆墍鏈夌煡璀樺韩锛屽緸澶氳矾鐭ヨ瓨搴煡瑭㈢浉闂滄枃瀛楃墖娈碉紝缍撻亷閲嶆帓搴忔椹燂紝寰炲璺煡瑭㈢祼鏋滀腑閬告搰鍖归厤浣跨敤鑰呭晱椤岀殑鏈�浣崇祼鏋滐紝闇�閰嶇疆 Rerank 妯″瀷 API銆�',
+    },
+    rerankModelRequired: '璜嬮伕鎿� Rerank 妯″瀷',
+    params: '寮曟暩瑷畾',
+    top_k: 'Top K',
+    top_kTip: '鐢ㄦ柤绡╅伕鑸囦娇鐢ㄨ�呭晱椤岀浉浼煎害鏈�楂樼殑鏂囧瓧鐗囨銆傜郴绲卞悓鏅傛渻鏍规摎閬哥敤妯″瀷涓婁笅鏂囪绐楀ぇ灏忓嫊鎱嬭鏁村垎娈垫暩閲忋��',
+    score_threshold: 'Score 闁惧��',
+    score_thresholdTip: '鐢ㄦ柤瑷畾鏂囧瓧鐗囨绡╅伕鐨勭浉浼煎害闁惧�笺��',
+    retrieveChangeTip: '淇敼绱㈠紩妯″紡鍜屾绱㈡ā寮忓彲鑳芥渻褰遍熆鑸囪┎鐭ヨ瓨搴棞鑱殑鎳夌敤绋嬪紡銆�',
+  },
+  debugAsSingleModel: '鍠竴妯″瀷閫茶闄ら尟',
+  debugAsMultipleModel: '澶氬�嬫ā鍨嬮�茶闄ら尟',
+  duplicateModel: '瑜囪=妯″瀷',
+  publishAs: '閲嬪嚭鐐�',
+  assistantType: {
+    name: '鍔╂墜鍨嬪垾',
+    chatAssistant: {
+      name: '鍩虹鍔╂墜',
+      description: '鍩烘柤 LLM 妲嬪缓涓�鍊嬭亰澶╁瀷鍔╂墜',
+    },
+    agentAssistant: {
+      name: '鏅烘収鍔╂墜',
+      description: '妲嬪缓涓�鍊嬫櫤鎱у姪鎵嬶紝浠栧彲浠ヨ嚜涓婚伕鎿囧伐鍏峰畬鎴愪綘瑷畾鐨勪换鍕�',
+    },
+  },
+  agent: {
+    agentMode: 'Agent Mode',
+    agentModeDes: '瑷畾浠g悊鐨勬帹鐞嗘ā寮忓瀷鍒�',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: 'Function Calling',
+    },
+    setting: {
+      name: 'Agent 瑷畾',
+      description: '鏅烘収鍔╂墜瑷畾鍏佽ū瑷畾浠g悊妯″紡鍜屽収寤烘彁绀虹瓑楂橀殠鍔熻兘锛屽儏鍦ㄤ唬鐞嗗瀷鍒ヤ腑鍙敤銆�',
+      maximumIterations: {
+        name: '鏈�澶ц凯浠f鏁�',
+        description: '闄愬埗浠g悊鍨嬪姪鎵嬪煼琛岃凯浠g殑娆℃暩',
+      },
+    },
+    buildInPrompt: '鍏у缓鎻愮ず瑭�',
+    firstPrompt: '绗竴娆℃彁绀鸿',
+    nextIteration: '涓嬩竴娆¤凯浠�',
+    promptPlaceholder: '鍦ㄩ�欒!瀵笅鎮ㄧ殑鎻愮ず瑭�',
+    tools: {
+      name: '宸ュ叿',
+      description: '浣跨敤宸ュ叿鍙互鎿村厖濂椾欢浠g悊鐨勮兘鍔涳紝姣斿鎼滃皨缍查殯缍茶矾鎴栫瀛歌▓绠�',
+      enabled: '鍟熺敤',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hant/app-log.ts b/i18n/zh-Hant/app-log.ts
new file mode 100644
index 0000000..3813c8b
--- /dev/null
+++ b/i18n/zh-Hant/app-log.ts
@@ -0,0 +1,98 @@
+const translation = {
+  title: '鏃ヨ獙',
+  description: '鏃ヨ獙瑷橀寗浜嗘噳鐢ㄧ殑鍩疯鎯呮硜锛屽寘鎷娇鐢ㄨ�呯殑杓稿叆鍜� AI 鐨勫洖瑕嗐��',
+  dateTimeFormat: 'YYYY-MM-DD HH:mm',
+  table: {
+    header: {
+      updatedTime: '鏇存柊鏅傞枔',
+      time: '鍓靛缓鏅傞枔',
+      endUser: '浣跨敤鑰呮垨璩埗',
+      input: '杓稿叆',
+      output: '杓稿嚭',
+      summary: '妯欓',
+      messageCount: '瑷婃伅鏁�',
+      userRate: '浣跨敤鑰呭弽楗�',
+      adminRate: '绠$悊鍝″弽楗�',
+      startTime: '闁嬪鏅傞枔',
+      status: '鐙�鎱�',
+      runtime: '鍩疯鏅傞枔',
+      tokens: 'TOKENS',
+      user: '浣跨敤鑰呮垨璩埗',
+      version: '鐗堟湰',
+    },
+    pagination: {
+      previous: '涓婁竴闋�',
+      next: '涓嬩竴闋�',
+    },
+    empty: {
+      noChat: '鏈枊濮嬬殑灏嶈┍',
+      noOutput: '鐒¤几鍑�',
+      element: {
+        title: '閫欒!鏈変汉鍡�',
+        content: '鍦ㄩ�欒!瑙�娓拰妯欒ɑ绲傜浣跨敤鑰呭拰 AI 鎳夌敤绋嬪紡涔嬮枔鐨勪簰鍕曪紝浠ヤ笉鏂锋彁楂� AI 鐨勬簴纰烘�с�傛偍鍙互<testLink>瑭﹁│</testLink> WebApp 鎴�<shareLink>鍒嗕韩</shareLink>鍑哄幓锛岀劧寰岃繑鍥炴闋侀潰銆�',
+      },
+    },
+  },
+  detail: {
+    time: '鏅傞枔',
+    conversationId: '灏嶈┍ ID',
+    promptTemplate: '瀛楅鎻愮ず瑭�',
+    promptTemplateBeforeChat: '灏嶈┍鍓嶆彁绀鸿 路 浠ョ郴绲辫▕鎭彁浜�',
+    annotationTip: '{{user}} 妯欒鐨勬敼閫插洖瑕�',
+    timeConsuming: '鑰楁檪',
+    second: ' 绉�',
+    tokenCost: '鑺辫不 Token',
+    loading: '杓夊叆涓�',
+    operation: {
+      like: '璐婂悓',
+      dislike: '鍙嶅皪',
+      addAnnotation: '妯欒鏀归�插洖瑕�',
+      editAnnotation: '绶ㄨ集鏀归�插洖瑕�',
+      annotationPlaceholder: '杓稿叆浣犲笇鏈� AI 鍥炶鐨勯爯鏈熺瓟妗堬紝閫欏湪浠婂緦鍙敤鏂兼ā鍨嬪井瑾匡紝鎸佺簩鏀归�叉枃瀛楃敓鎴愯唱閲忋��',
+    },
+    variables: '璁婃暩',
+    uploadImages: '涓婂偝鐨勫湒鐗�',
+    modelParams: '妯″瀷鍙冩暩',
+  },
+  filter: {
+    period: {
+      today: '浠婂ぉ',
+      last7days: '閬庡幓 7 澶�',
+      last4weeks: '閬庡幓 4 鍛�',
+      last3months: '閬庡幓 3 鏈�',
+      last12months: '閬庡幓 12 鏈�',
+      monthToDate: '鏈湀鑷充粖',
+      quarterToDate: '鏈搴﹁嚦浠�',
+      yearToDate: '鏈勾鑷充粖',
+      allTime: '鎵�鏈夋檪闁�',
+    },
+    annotation: {
+      all: '鍏ㄩ儴',
+      annotated: '宸叉瑷绘敼閫诧紙{{count}} 闋咃級',
+      not_annotated: '鏈瑷�',
+    },
+    sortBy: '鎺掑簭鏂瑰紡锛�',
+    descending: '闄嶅簭',
+    ascending: '鍗囧簭',
+  },
+  workflowTitle: '鏃ヨ獙',
+  workflowSubtitle: '鏃ヨ獙瑷橀寗浜嗘噳鐢ㄧ殑鍩疯鎯呮硜',
+  runDetail: {
+    title: '灏嶈┍鏃ヨ獙',
+    workflowTitle: '鏃ヨ獙瑭虫儏',
+    fileListDetail: '绱扮瘈',
+    fileListLabel: '妾旇┏绱拌硣瑷�',
+  },
+  promptLog: 'Prompt 鏃ヨ獙',
+  agentLog: 'Agent 鏃ヨ獙',
+  viewLog: '妾㈣鏃ヨ獙',
+  agentLogDetail: {
+    agentMode: 'Agent 妯″紡',
+    toolUsed: '浣跨敤宸ュ叿',
+    iterations: '杩唬娆℃暩',
+    iteration: '杩唬',
+    finalProcessing: '鏈�绲傝檿鐞�',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hant/app-overview.ts b/i18n/zh-Hant/app-overview.ts
new file mode 100644
index 0000000..609c3a5
--- /dev/null
+++ b/i18n/zh-Hant/app-overview.ts
@@ -0,0 +1,173 @@
+const translation = {
+  welcome: {
+    firstStepTip: '闁嬪涔嬪墠,',
+    enterKeyTip: '璜嬪厛鍦ㄤ笅鏂硅几鍏ヤ綘鐨� OpenAI API Key',
+    getKeyTip: '寰� OpenAI 鐛插彇浣犵殑 API Key',
+    placeholder: '浣犵殑 OpenAI API Key锛堜緥濡� sk-xxxx锛�',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: '鎮ㄦ鍦ㄤ娇鐢� {{providerName}} 鐨勮│鐢ㄩ厤椤嶃��',
+        description: '瑭︾敤閰嶉鍍呬緵鎮ㄦ脯瑭︿娇鐢ㄣ�� 鍦ㄨ│鐢ㄩ厤椤嶇敤瀹屼箣鍓嶏紝璜嬭嚜琛岃ō瀹氭ā鍨嬫彁渚涘晢鎴栬臣璨烽澶栭厤椤嶃��',
+      },
+      exhausted: {
+        title: '鎮ㄧ殑瑭︾敤椤嶅害宸茬敤瀹岋紝璜嬭ō瀹氭偍鐨凙PIKey銆�',
+        description: '鎮ㄧ殑瑭︾敤閰嶉宸茬敤瀹屻�� 璜嬭ō瀹氭偍鑷繁鐨勬ā鍨嬫彁渚涘晢鎴栬臣璨烽澶栭厤椤嶃��',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: '棣栧厛锛�',
+        row2: '瑷畾鎮ㄧ殑妯″瀷鎻愪緵鍟嗐��',
+      },
+    },
+    callTimes: '鍛煎彨娆℃暩',
+    usedToken: '浣跨敤 Tokens',
+    setAPIBtn: '瑷畾妯″瀷鎻愪緵鍟�',
+    tryCloud: '鎴栬�呭槜瑭︿娇鐢� Dify 鐨勯洸鐗堟湰涓︿娇鐢ㄨ│鐢ㄩ厤椤�',
+  },
+  overview: {
+    title: '姒傝',
+    appInfo: {
+      explanation: '闁嬬鍗崇敤鐨� AI WebApp',
+      accessibleAddress: '鍏枊瑷晱 URL',
+      preview: '闋愯',
+      regenerate: '閲嶆柊鐢熸垚',
+      regenerateNotice: '鎮ㄦ槸鍚﹁閲嶆柊鐢熸垚鍏枊瑷晱 URL锛�',
+      preUseReminder: '浣跨敤鍓嶈珛鍏堥枊鍟熼枊闂�',
+      settings: {
+        entry: '瑷畾',
+        title: 'WebApp 瑷畾',
+        webName: 'WebApp 鍚嶇ū',
+        webDesc: 'WebApp 鎻忚堪',
+        webDescTip: '浠ヤ笅鏂囧瓧灏囧睍绀哄湪瀹㈡埗绔腑锛屽皪鎳夌敤閫茶瑾槑鍜屼娇鐢ㄤ笂鐨勫熀鏈紩灏�',
+        webDescPlaceholder: '璜嬭几鍏� WebApp 鐨勬弿杩�',
+        language: '瑾炶█',
+        workflow: {
+          title: '宸ヤ綔娴佺▼姝ラ',
+          show: '灞曠ず',
+          hide: '闅辫棌',
+          subTitle: '宸ヤ綔娴佽┏绱拌硣瑷�',
+          showDesc: '鍦� WebApp 涓’绀烘垨闅辫棌宸ヤ綔娴佽┏绱拌硣瑷�',
+        },
+        chatColorTheme: '鑱婂ぉ椤忚壊涓婚',
+        chatColorThemeDesc: '瑷畾鑱婂ぉ姗熷櫒浜虹殑椤忚壊涓婚',
+        chatColorThemeInverted: '鍙嶈綁',
+        invalidHexMessage: '鐒℃晥鐨勫崄鍏�插埗鍊�',
+        invalidPrivacyPolicy: '鐒℃晥鐨勯毐绉佹斂绛栭�g祼锛岃珛浣跨敤浠� http 鎴� https 闁嬮牠鐨勬湁鏁堥�g祼',
+        more: {
+          entry: '灞曠ず鏇村瑷畾',
+          copyright: '鐗堟瑠',
+          copyRightPlaceholder: '璜嬭几鍏ヤ綔鑰呮垨绲勭箶鍚嶇ū',
+          privacyPolicy: '闅辩鏀跨瓥',
+          privacyPolicyPlaceholder: '璜嬭几鍏ラ毐绉佹斂绛栭�g祼',
+          privacyPolicyTip: '骞姪瑷晱鑰呯灜瑙h┎鎳夌敤鏀堕泦鐨勮硣鏂欙紝鍙弮鑰� Dify 鐨�<privacyPolicyLink>闅辩鏀跨瓥</privacyPolicyLink>銆�',
+          customDisclaimer: '鑷畾缇╁厤璨伈鏄�',
+          customDisclaimerPlaceholder: '璜嬭几鍏ュ厤璨伈鏄�',
+          customDisclaimerTip: '瀹㈣=鍖栫殑鍏嶈铂鑱叉槑鏂囧瓧灏囧湪瀹㈡埗绔’绀猴紝鎻愪緵鏈夐棞鎳夌敤绋嬪紡鐨勯澶栬硣瑷娿��',
+          copyrightTip: '鍦� Web 鎳夌敤绋嬪紡涓’绀虹増娆婅硣瑷�',
+          copyrightTooltip: '璜嬪崌绱氳嚦灏堟キ瑷堝妰鎴栦互涓�',
+        },
+        sso: {
+          description: '鎵�鏈変娇鐢ㄨ�呭湪浣跨敤 WebApp 涔嬪墠閮介渶瑕佷娇鐢� SSO 鐧婚寗',
+          title: 'WebApp SSO',
+          tooltip: '鑱公绠$悊鍝′互鍟熺敤 WebApp SSO',
+          label: 'SSO 韬唤椹楄瓑',
+        },
+        modalTip: '鐢ㄦ埗绔� Web 鎳夌敤绋嬪紡瑷疆銆�',
+      },
+      embedded: {
+        entry: '宓屽叆',
+        title: '宓屽叆鍒扮恫绔欎腑',
+        explanation: '閬告搰涓�绋柟寮忓皣鑱婂ぉ鎳夌敤宓屽叆鍒颁綘鐨勭恫绔欎腑',
+        iframe: '灏囦互涓� iframe 宓屽叆鍒颁綘鐨勭恫绔欎腑鐨勭洰妯欎綅缃�',
+        scripts: '灏囦互涓嬬▼寮忕⒓宓屽叆鍒颁綘鐨勭恫绔欎腑',
+        chromePlugin: '瀹夎 Dify Chrome 鐎忚鍣ㄦ摯鍏呭浠�',
+        copied: '宸茶瑁�',
+        copy: '瑜囪=',
+      },
+      qrcode: {
+        title: '浜岀董纰煎垎浜�',
+        scan: '鎺冪⒓鍒嗕韩鎳夌敤',
+        download: '涓嬭級浜岀董纰�',
+      },
+      customize: {
+        way: '鏂规硶',
+        entry: '瀹氳=鍖�',
+        title: '瀹氳=鍖� AI WebApp',
+        explanation: '浣犲彲浠ュ畾瑁藉寲 Web App 鍓嶇浠ョ鍚堜綘鐨勬儏鏅垏棰ㄦ牸闇�姹�',
+        way1: {
+          name: 'Fork 瀹㈡埗绔▼寮忕⒓淇敼寰岄儴缃插埌 Vercel锛堟帹钖︼級',
+          step1: 'Fork 瀹㈡埗绔▼寮忕⒓涓︿慨鏀�',
+          step1Tip: '榛為伕姝よ檿 Fork 鍘熷纰煎埌浣犵殑 GitHub 涓紝鐒跺緦淇敼绋嬪紡纰�',
+          step1Operation: 'Dify-WebClient',
+          step2: '閮ㄧ讲鍒� Vercel 涓�',
+          step2Tip: '榛為伕姝よ檿灏囧�夊韩鍖叆鍒� Vercel 涓儴缃�',
+          step2Operation: '鍖叆鍊夊韩',
+          step3: '閰嶇疆鐠板璁婃暩',
+          step3Tip: '鍦� Vercel 鐠板璁婃暩涓柊澧炰互涓嬬挵澧冭畩鏁�',
+        },
+        way2: {
+          name: '绶ㄥ瀹㈡埗绔懠鍙� API 涓﹂儴缃插埌浼烘湇鍣ㄤ腑',
+          operation: '妾㈣鏂囦欢',
+        },
+      },
+      launch: '鐧煎皠',
+    },
+    apiInfo: {
+      title: '寰岀鏈嶅嫏 API',
+      explanation: '鍙暣鍚堣嚦浣犵殑鎳夌敤鐨勫緦绔嵆鏈嶅嫏',
+      accessibleAddress: 'API 瑷晱鎲戞摎',
+      doc: '鏌ラ柋 API 鏂囦欢',
+    },
+    status: {
+      running: '鍩疯涓�',
+      disable: '宸插仠鐢�',
+    },
+  },
+  analysis: {
+    title: '鍒嗘瀽',
+    ms: '姣',
+    tokenPS: 'Token/绉�',
+    totalMessages: {
+      title: '鍏ㄩ儴瑷婃伅鏁�',
+      explanation: '鍙嶆槧 AI 姣忓ぉ鐨勪簰鍕曠附娆℃暩锛屾瘡鍥炵瓟浣跨敤鑰呬竴鍊嬪晱椤岀畻涓�姊� Message銆傛彁绀鸿绶ㄦ帓鍜岄櫎閷殑瑷婃伅涓嶈▓鍏ャ��',
+    },
+    activeUsers: {
+      title: '娲昏簫浣跨敤鑰呮暩',
+      explanation: '姣忔棩AI浜掑嫊娆℃暩銆�',
+    },
+    totalConversations: {
+      title: '绺藉皪瑭辨暩',
+      explanation: '姣忔棩AI灏嶈┍娆℃暩锛涗笉鍖呮嫭鎻愮ず宸ョ▼/瑾胯│銆�',
+    },
+    tokenUsage: {
+      title: '璨荤敤娑堣��',
+      explanation: '鍙嶆槧姣忔棩瑭叉噳鐢ㄨ珛姹傝獮瑷�妯″瀷鐨� Tokens 鑺辫不锛岀敤鏂兼垚鏈帶鍒躲��',
+      consumed: '鑰楄不',
+    },
+    avgSessionInteractions: {
+      title: '骞冲潎鏈冭┍浜掑嫊鏁�',
+      explanation: '鍙嶆槧姣忓�嬫渻瑭变娇鐢ㄨ�呯殑鎸佺簩婧濋�氭鏁革紝濡傛灉浣跨敤鑰呰垏 AI 鍟忕瓟浜� 10 杓紝鍗崇偤 10銆傝┎鎸囨鍙嶆槧浜嗕娇鐢ㄨ�呯矘鎬с�傚儏鍦ㄥ皪瑭卞瀷鎳夌敤鎻愪緵銆�',
+    },
+    avgUserInteractions: {
+      title: '骞冲潎浣跨敤鑰呭懠鍙鏁�',
+      explanation: '鍙嶆槧姣忓ぉ浣跨敤鑰呯殑浣跨敤娆℃暩銆傝┎鎸囨鍙嶆槧浜嗕娇鐢ㄨ�呯矘鎬с��',
+    },
+    userSatisfactionRate: {
+      title: '浣跨敤鑰呮豢鎰忓害',
+      explanation: '姣� 1000 姊濊▕鎭殑榛炶磰鏁搞�傚弽鏄犱簡浣跨敤鑰呭皪鍥炵瓟鍗佸垎婊挎剰鐨勬瘮渚嬨��',
+    },
+    avgResponseTime: {
+      title: '骞冲潎闊挎噳鏅傞枔',
+      explanation: '琛¢噺 AI 鎳夌敤铏曠悊鍜屽洖瑕嗕娇鐢ㄨ�呰珛姹傛墍鑺辫不鐨勫钩鍧囨檪闁擄紝鍠綅鐐烘绉掞紝鍙嶆槧鏁堣兘鍜屼娇鐢ㄨ�呴珨椹椼�傚儏鍦ㄦ枃瀛楀瀷鎳夌敤鎻愪緵銆�',
+    },
+    tps: {
+      title: 'Token 杓稿嚭閫熷害',
+      explanation: '琛¢噺 LLM 鐨勬晥鑳姐�傜当瑷� LLM 寰炶珛姹傞枊濮嬪埌杓稿嚭瀹岀暍閫欐鏈熼枔鐨� Tokens 杓稿嚭閫熷害銆�',
+    },
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hant/app.ts b/i18n/zh-Hant/app.ts
new file mode 100644
index 0000000..f49adc8
--- /dev/null
+++ b/i18n/zh-Hant/app.ts
@@ -0,0 +1,213 @@
+const translation = {
+  createApp: '寤虹珛鎳夌敤',
+  types: {
+    all: '鍏ㄩ儴',
+    chatbot: '鑱婂ぉ鍔╂墜',
+    agent: 'Agent',
+    workflow: '宸ヤ綔娴�',
+    completion: '鏂囧瓧鐢熸垚',
+    advanced: '鑱婂ぉ娴�',
+    basic: '鍩烘湰',
+  },
+  duplicate: '瑜囪=',
+  duplicateTitle: '瑜囪=鎳夌敤',
+  export: '鍖嚭 DSL',
+  exportFailed: '鍖嚭 DSL 澶辨晽',
+  importDSL: '鍖叆 DSL 妾旀',
+  createFromConfigFile: '閫忛亷 DSL 妾旀寤虹珛',
+  deleteAppConfirmTitle: '纰鸿獚鍒櫎鎳夌敤?',
+  deleteAppConfirmContent:
+    '鍒櫎鎳夌敤灏囩劇娉曞京鍘熴�備娇鐢ㄨ�呭皣鐒℃硶瀛樺彇浣犵殑鎳夌敤锛屾墍鏈� Prompt 瑷畾鍜屾棩瑾岄兘灏囦竴浣佃鍒櫎銆�',
+  appDeleted: '鎳夌敤宸插埅闄�',
+  appDeleteFailed: '鎳夌敤鍒櫎澶辨晽',
+  join: '鍙冭垏绀剧兢',
+  communityIntro: '鑸囧湗闅婃垚鍝°�佽并鐛昏�呭拰闁嬬櫦鑰呭湪涓嶅悓闋婚亾涓氦娴�',
+  roadmap: '鐢㈠搧璺窔鍦�',
+  newApp: {
+    startFromBlank: '寤虹珛绌虹櫧鎳夌敤',
+    startFromTemplate: '寰炴噳鐢ㄦā鐗堝缓绔�',
+    captionAppType: '鎯宠鍝ó鎳夌敤椤炲瀷锛�',
+    chatbotDescription: '浣跨敤澶у瀷瑾炶█妯″瀷妲嬪缓鑱婂ぉ鍔╂墜',
+    completionDescription: '妲嬪缓涓�鍊嬫牴鎿氭彁绀虹敓鎴愰珮鍝佽唱鏂囧瓧鐨勬噳鐢ㄧ▼寮忥紝渚嬪鐢熸垚鏂囩珷銆佹憳瑕併�佺炕璀瓑銆�',
+    completionWarning: '瑭查鍨嬩笉涔呭緦灏囦笉鍐嶆敮鎻村缓绔�',
+    agentDescription: '妲嬪缓涓�鍊嬫櫤鎱gent锛屽彲浠ヨ嚜涓婚伕鎿囧伐鍏蜂締瀹屾垚浠诲嫏',
+    workflowDescription: '浠ュ伐浣滄祦鐨勫舰寮忕法鎺掔敓鎴愬瀷鎳夌敤锛屾彁渚涙洿澶氱殑鑷▊瑷畾銆� 瀹冮仼鍚堟湁缍撻鐨勪娇鐢ㄨ�呫��',
+    workflowWarning: '姝e湪閫茶 Beta 娓│',
+    chatbotType: '鑱婂ぉ鍔╂墜绶ㄦ帓鏂规硶',
+    basic: '鍩虹绶ㄦ帓',
+    basicTip: '鏂版墜閬╃敤锛屽彲浠ュ垏鎻涙垚宸ヤ綔娴佺法鎺�',
+    basicFor: '鏂版墜閬╃敤',
+    basicDescription: '鍩烘湰绶ㄦ帓鍏佽ū浣跨敤绨″柈鐨勮ō瀹氱法鎺掕亰澶╂鍣ㄤ汉鎳夌敤绋嬪紡锛岃�岀劇闇�淇敼鍏у缓鎻愮ず銆� 瀹冮仼鍚堝垵瀛歌�呫��',
+    advanced: '宸ヤ綔娴佺法鎺�',
+    advancedFor: '閫查殠浣跨敤鑰呴仼鐢�',
+    advancedDescription: '宸ヤ綔娴佺法鎺掍互宸ヤ綔娴佺殑褰㈠紡绶ㄦ帓鑱婂ぉ姗熷櫒浜猴紝鎻愪緵鑷▊瑷畾锛屽寘鎷法杓収寤烘彁绀虹殑鑳藉姏銆� 瀹冮仼鍚堟湁缍撻鐨勪娇鐢ㄨ�呫��',
+    captionName: '鎳夌敤鍚嶇ū & 鍦栫ず',
+    appNamePlaceholder: '绲︿綘鐨勬噳鐢ㄨ捣鍊嬪悕瀛�',
+    captionDescription: '鎻忚堪',
+    appDescriptionPlaceholder: '杓稿叆鎳夌敤鐨勬弿杩�',
+    useTemplate: '浣跨敤瑭叉ā鏉�',
+    previewDemo: '闋愯 Demo',
+    chatApp: '鍔╂墜',
+    chatAppIntro:
+      '鎴戣妲嬪缓涓�鍊嬭亰澶╁牬鏅殑鎳夌敤銆傝┎鎳夌敤鎺$敤涓�鍟忎竴绛旀ā寮忚垏浣跨敤鑰呮寔绾屽皪瑭便��',
+    agentAssistant: '鏂扮殑鏅烘収鍔╂墜',
+    completeApp: '鏂囧瓧鐢熸垚鎳夌敤',
+    completeAppIntro:
+      '鎴戣妲嬪缓涓�鍊嬫牴鎿氭彁绀虹敓鎴愰珮鍝佽唱鏂囧瓧鐨勬噳鐢紝渚嬪鐢熸垚鏂囩珷銆佹憳瑕併�佺炕璀瓑',
+    showTemplates: '鎴戞兂寰炵瘎渚嬫ā鏉夸腑閬告搰',
+    hideTemplates: '杩斿洖鎳夌敤椤炲瀷閬告搰',
+    Create: '寤虹珛',
+    Cancel: '鍙栨秷',
+    nameNotEmpty: '鍚嶇ū涓嶈兘鐐虹┖',
+    appTemplateNotSelected: '璜嬮伕鎿囨噳鐢ㄦā鐗�',
+    appTypeRequired: '璜嬮伕鎿囨噳鐢ㄩ鍨�',
+    appCreated: '鎳夌敤宸插缓绔�',
+    appCreateFailed: '鎳夌敤寤虹珛澶辨晽',
+    caution: '璎规厧',
+    appCreateDSLErrorPart2: '鏄惁瑕佺辜绾岋紵',
+    appCreateDSLErrorPart3: '鐩墠鐨勬噳鐢ㄧ▼寮� DSL 鐗堟湰锛�',
+    Confirm: '纰鸿獚',
+    appCreateDSLErrorTitle: '鐗堟湰涓嶇浉瀹�',
+    appCreateDSLErrorPart1: '宸叉娓埌 DSL 鐗堟湰瀛樺湪椤憲宸暟銆傚挤鍒跺皫鍏ュ彲鑳芥渻灏庤嚧鎳夌敤绋嬪紡鍑虹従鏁呴殰銆�',
+    appCreateDSLErrorPart4: '绯荤当鏀彺鐨� DSL 鐗堟湰锛�',
+    appCreateDSLWarning: '娉ㄦ剰锛欴SL 鐗堟湰宸暟鍙兘鏈冨奖闊挎煇浜涘姛鑳�',
+    learnMore: '鐬В鏇村璩囪▕',
+    optional: '鑷伕',
+    foundResults: '{{count}}绲愭灉',
+    noAppsFound: '鏈壘鍒版噳鐢ㄧ▼寮�',
+    forBeginners: '灏嶆柤鍒濆鑰�',
+    noTemplateFound: '鏈壘鍒扮瘎鏈�',
+    noIdeaTip: '娌掓湁鎯虫硶锛熸煡鐪嬫垜鍊戠殑绡勬湰',
+    forAdvanced: '灏嶆柤楂樼礆浣跨敤鑰�',
+    workflowUserDescription: '鐢ㄦ柤鑷嫊鍖栧拰鎵硅檿鐞嗙瓑鍠吉浠诲嫏鐨勫伐浣滄祦绶ㄦ帓銆�',
+    chatbotUserDescription: '閫氶亷绨″柈鐨勯厤缃揩閫熸寤哄熀鏂� LLM 鐨勮亰澶╂鍣ㄤ汉銆傛偍鍙互绋嶅緦鍒囨彌鍒� Chatflow銆�',
+    completionUserDescription: '閫氶亷绨″柈鐨勯厤缃揩閫熸寤虹敤鏂兼枃鏈敓鎴愪换鍕欑殑 AI 鍔╂墜銆�',
+    foundResult: '{{count}}绲愭灉',
+    advancedShortDescription: '鍏锋湁瑷樻喍鐨勮闆滃鍥炲悎灏嶈┍鐨勫伐浣滄祦绋�',
+    workflowShortDescription: '鐢ㄦ柤鍠吉鑷嫊鍖栦换鍕欑殑绶ㄦ帓',
+    chatbotShortDescription: '鍩烘柤 LLM 鐨勮亰澶╂鍣ㄤ汉锛岃ō缃啊鍠�',
+    agentShortDescription: '鍏锋湁鎺ㄧ悊鍜岃嚜涓诲伐鍏蜂娇鐢ㄧ殑鏅烘収浠g悊',
+    noTemplateFoundTip: '鍢楄│浣跨敤涓嶅悓鐨勯棞閸靛瓧閫茶鎼滅储銆�',
+    agentUserDescription: '涓�鍊嬭兘澶犻�茶鍙嶈閬嬬畻鎺ㄧ悊鍜岃嚜涓诲伐鍏蜂娇鐢ㄤ締瀵︾従浠诲嫏鐩鐨勬櫤鎱т唬鐞嗐��',
+    advancedUserDescription: '鍏锋湁瑷樻喍楂斿姛鑳界殑澶氳吉瑜囬洔灏嶈┍浠诲嫏鐨勫伐浣滄祦绋嬬法鎺掋��',
+    chooseAppType: '閬告搰 App Type',
+    completionShortDescription: '鐢ㄦ柤鏂囨湰鐢熸垚浠诲嫏鐨� AI 鍔╂墜',
+  },
+  editApp: '绶ㄨ集璩囪▕',
+  editAppTitle: '绶ㄨ集鎳夌敤璩囪▕',
+  editDone: '鎳夌敤璩囪▕宸叉洿鏂�',
+  editFailed: '鏇存柊鎳夌敤璩囪▕澶辨晽',
+  iconPicker: {
+    ok: '纰鸿獚',
+    cancel: '鍙栨秷',
+    emoji: '琛ㄦ儏绗﹁櫉',
+    image: '鍦栫墖',
+  },
+  switch: '閬风Щ鐐哄伐浣滄祦绶ㄦ帓',
+  switchTipStart: '灏囩偤鎮ㄥ缓绔嬩竴鍊嬩娇鐢ㄥ伐浣滄祦绶ㄦ帓鐨勬柊鎳夌敤銆傛柊鎳夌敤灏�',
+  switchTip: '涓嶈兘澶�',
+  switchTipEnd: '閬风Щ鍥炲熀绀庣法鎺�',
+  switchLabel: '鏂版噳鐢ㄥ缓绔嬬偤',
+  removeOriginal: '鍒櫎鍘熸噳鐢�',
+  switchStart: '闁嬪閬风Щ',
+  typeSelector: {
+    all: '鎵�鏈夐鍨�',
+    chatbot: '鑱婂ぉ鍔╂墜',
+    agent: 'Agent',
+    workflow: '宸ヤ綔娴�',
+    completion: '鏂囧瓧鐢熸垚',
+    advanced: '鑱婂ぉ娴�',
+  },
+  tracing: {
+    title: '杩借工鎳夌敤绋嬪紡鏁堣兘',
+    description: '閰嶇疆绗笁鏂筁LMOps鎻愪緵鍟嗕甫杩借工鎳夌敤绋嬪紡鏁堣兘銆�',
+    config: '閰嶇疆',
+    view: '鏌ョ湅',
+    collapse: '鏀惰捣',
+    expand: '灞曢枊',
+    tracing: '杩借工',
+    disabled: '宸茬鐢�',
+    disabledTip: '璜嬪厛閰嶇疆鎻愪緵鍟�',
+    enabled: '鏈嶅嫏涓�',
+    tracingDescription: '鎹曠嵅鎳夌敤绋嬪紡鍩疯鐨勫畬鏁翠笂涓嬫枃锛屽寘鎷琇LM瑾跨敤銆佷笂涓嬫枃銆佹彁绀恒�丠TTP璜嬫眰绛夛紝鍒扮涓夋柟杩借工骞冲彴銆�',
+    configProviderTitle: {
+      configured: '宸查厤缃�',
+      notConfigured: '閰嶇疆鎻愪緵鍟嗕互鍟熺敤杩借工',
+      moreProvider: '鏇村鎻愪緵鍟�',
+    },
+    langsmith: {
+      title: 'LangSmith',
+      description: '涓�鍊嬪叏鏂逛綅鐨勯枊鐧艰�呭钩鍙帮紝鐢ㄦ柤LLM椹呭嫊鐨勬噳鐢ㄧ▼寮忕敓鍛介�辨湡鐨勬瘡鍊嬫椹熴��',
+    },
+    langfuse: {
+      title: 'Langfuse',
+      description: '杩借工銆佽浼般�佹彁绀虹鐞嗗拰鎸囨锛岀敤鏂艰瑭﹀拰鏀归�叉偍鐨凩LM鎳夌敤绋嬪紡銆�',
+    },
+    inUse: '浣跨敤涓�',
+    configProvider: {
+      title: '閰嶇疆 ',
+      placeholder: '杓稿叆鎮ㄧ殑{{key}}',
+      project: '灏堟',
+      publicKey: '鍏懓',
+      secretKey: '瀵嗛懓',
+      viewDocsLink: '鏌ョ湅{{key}}鏂囦欢',
+      removeConfirmTitle: '绉婚櫎{{key}}閰嶇疆锛�',
+      removeConfirmContent: '鐣跺墠閰嶇疆姝e湪浣跨敤涓紝绉婚櫎瀹冨皣闂滈枆杩借工鍔熻兘銆�',
+    },
+    opik: {
+      title: '濂х毊鍏�',
+      description: 'Opik 鏄竴鍊嬬敤鏂艰浼般�佹脯瑭﹀拰鐩f帶 LLM 鎳夌敤绋嬪紡鐨勯枊婧愬钩鑷恒��',
+    },
+    weave: {
+      title: '绶ㄧ箶',
+      description: 'Weave 鏄竴鍊嬮枊婧愬钩鍙帮紝鐢ㄦ柤瑭曚及銆佹脯瑭﹀拰鐩f帶澶у瀷瑾炶█妯″瀷鎳夌敤绋嬪簭銆�',
+    },
+  },
+  answerIcon: {
+    descriptionInExplore: '鏄惁浣跨敤 WebApp 鍦栫ず鍦� Explore 涓彇浠� 馃',
+    title: '浣跨敤 WebApp 鍦栫ず鍙栦唬 馃',
+    description: '鏄惁鍦ㄥ叡浜噳鐢ㄧ▼寮忎腑浣跨敤 WebApp 鍦栫ず閫茶鍙栦唬 馃',
+  },
+  importFromDSLUrl: '瀵勪欢鑰� URL',
+  importFromDSL: '寰� DSL 灏庡叆',
+  importFromDSLFile: '寰� DSL 妾�',
+  importFromDSLUrlPlaceholder: '鍦ㄦ铏曡布涓� DSL 閫g祼',
+  mermaid: {
+    handDrawn: '鎵嬬躬',
+    classic: '缍撳吀',
+  },
+  openInExplore: '鍦ㄢ�滄帰绱⑩�濅腑鎵撻枊',
+  newAppFromTemplate: {
+    sidebar: {
+      Workflow: '宸ヤ綔娴�',
+      Recommended: '鎺ㄨ枽',
+      Agent: '浠g悊',
+      HR: '浜哄姏璩囨簮',
+      Writing: '瀵綔',
+      Programming: '绋嬪紡瑷▓',
+      Assistant: '鍔╃悊',
+    },
+    searchAllTemplate: '鎼滃皨鎵�鏈夋ǎ鏈�...',
+    byCategories: '鎸夐鍒�',
+  },
+  showMyCreatedAppsOnly: '鎴戝缓绔嬬殑',
+  appSelector: {
+    placeholder: '閬告搰鎳夌敤绋嬪紡...',
+    noParams: '鐒¢渶鍙冩暩',
+    params: '鎳夌敤绋嬪紡鍙冩暩',
+    label: '鎳夌敤绋嬪紡',
+  },
+  structOutput: {
+    moreFillTip: '椤ず鏈�澶�10灞ょ殑宓屽',
+    required: '蹇呴渶鐨�',
+    LLMResponse: 'LLM 鍥炴噳',
+    structured: '绲愭鍖栫殑',
+    configure: '閰嶇疆',
+    modelNotSupported: '妯″瀷涓嶆敮鎸�',
+    modelNotSupportedTip: '鐣跺墠妯″瀷涓嶆敮鎸佹鍔熻兘锛屼甫鑷嫊闄嶇礆鐐烘彁绀烘敞鍏ャ��',
+    structuredTip: '绲愭鍖栬几鍑烘槸涓�闋呭姛鑳斤紝纰轰繚妯″瀷濮嬬祩鐢熸垚绗﹀悎鎮ㄦ彁渚涚殑 JSON 鏋舵鐨勯熆鎳夈��',
+    notConfiguredTip: '绲愭鍖栬几鍑哄皻鏈厤缃�',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hant/billing.ts b/i18n/zh-Hant/billing.ts
new file mode 100644
index 0000000..f3ce5ec
--- /dev/null
+++ b/i18n/zh-Hant/billing.ts
@@ -0,0 +1,200 @@
+const translation = {
+  currentPlan: '鐣跺墠濂楅',
+  upgradeBtn: {
+    plain: '鍗囩礆濂楅',
+    encourage: '绔嬪嵆鍗囩礆',
+    encourageShort: '鍗囩礆',
+  },
+  viewBilling: '绠$悊璩柈鍙婅▊闁�',
+  buyPermissionDeniedTip: '璜嬭伅绲′紒妤鐞嗗摗瑷傞柋',
+  plansCommon: {
+    title: '閬告搰閬╁悎鎮ㄧ殑濂楅',
+    yearlyTip: '瑷傞柋骞村害瑷堝妰鍙厤璨荤嵅寰� 2鍊嬫湀锛�',
+    mostPopular: '鏈�鍙楁杩�',
+    planRange: {
+      monthly: '鎸夋湀',
+      yearly: '鎸夊勾',
+    },
+    month: '鏈�',
+    year: '骞�',
+    save: '绡�鐪�',
+    currentPlan: '鐣跺墠瑷堝妰',
+    contractSales: '鑱怠閵峰敭',
+    contractOwner: '鑱怠鍦橀殜绠$悊鍝�',
+    free: '鍏嶈不',
+    startForFree: '鍏嶈不闁嬪',
+    getStartedWith: '闁嬪浣跨敤',
+    contactSales: '鑱怠閵峰敭',
+    talkToSales: '鑱怠閵峰敭',
+    modelProviders: '鏀彺鐨勬ā鍨嬫彁渚涘晢',
+    teamMembers: '鍦橀殜鎴愬摗',
+    buildApps: '妲嬪缓鎳夌敤绋嬪紡鏁�',
+    vectorSpace: '鍚戦噺绌洪枔',
+    vectorSpaceTooltip: '鍚戦噺绌洪枔鏄� LLMs 鐞嗚В鎮ㄧ殑璩囨枡鎵�闇�鐨勯暦鏈熻鎲剁郴绲便��',
+    vectorSpaceBillingTooltip: '鍚戦噺鍎插瓨鏄皣鐭ヨ瓨搴悜閲忓寲铏曠悊寰岀偤璁� LLMs 鐞嗚В璩囨枡鑰屼娇鐢ㄧ殑闀锋湡瑷樻喍鍎插瓨锛�1MB 澶х磩鑳芥豢瓒�1.2 million character 鐨勫悜閲忓寲寰岃硣鏂欏劜瀛橈紙浠� OpenAI Embedding 妯″瀷浼扮畻锛屼笉鍚屾ā鍨嬭▓绠楁柟寮忔湁宸暟锛夈�傚湪鍚戦噺鍖栭亷绋嬩腑锛屽闅涚殑澹撶府鎴栧昂瀵告笡灏忓彇姹烘柤鍏у鐨勮闆滄�у拰鍐楅鎬с��',
+    documentsUploadQuota: '鏂囦欢涓婂偝閰嶉',
+    documentProcessingPriority: '鏂囦欢铏曠悊鍎厛闋嗗簭',
+    documentProcessingPriorityTip: '濡傞渶鏇撮珮鐨勬枃浠惰檿鐞嗗劒鍏堥爢搴忥紝璜嬪崌绱氭偍鐨勫椁�',
+    documentProcessingPriorityUpgrade: '浠ユ洿蹇殑閫熷害銆佹洿楂樼殑绮惧害铏曠悊鏇村鐨勮硣鏂欍��',
+    priority: {
+      'standard': '妯欐簴',
+      'priority': '鍎厛',
+      'top-priority': '鏈�楂樺劒鍏堥爢搴�',
+    },
+    logsHistory: '鏃ヨ獙姝峰彶',
+    customTools: '鑷畾缇╁伐鍏�',
+    unavailable: '涓嶅彲鐢�',
+    days: '澶�',
+    unlimited: '鐒¢檺鍒�',
+    support: '鏀彺',
+    supportItems: {
+      communityForums: '绀剧兢璜栧',
+      emailSupport: '闆诲瓙閮典欢鏀彺',
+      priorityEmail: '鍎厛闆诲瓙閮典欢鍜岃亰澶╂敮鎻�',
+      logoChange: 'Logo 鏇存敼',
+      SSOAuthentication: 'SSO 瑾嶈瓑',
+      personalizedSupport: '鍊嬫�у寲鏀彺',
+      dedicatedAPISupport: '灏堢敤 API 鏀彺',
+      customIntegration: '鑷畾缇╂暣鍚堝拰鏀彺',
+      ragAPIRequest: 'RAG API 璜嬫眰',
+      bulkUpload: '鎵规涓婂偝鏂囦欢',
+      agentMode: '浠g悊妯″紡',
+      workflow: '宸ヤ綔娴�',
+      llmLoadingBalancing: 'LLM 璨犺級鍧囪 ',
+      llmLoadingBalancingTooltip: '鍚戞ā鍨嬫坊鍔犲鍊� API 閲戦懓锛屽緸鑰屾湁鏁堝湴绻為亷 API 閫熺巼闄愬埗銆�',
+    },
+    comingSoon: '鍗冲皣鎺ㄥ嚭',
+    member: '鎴愬摗',
+    memberAfter: '鍊嬫垚鍝�',
+    messageRequest: {
+      title: '瑷婃伅椤嶅害',
+      tooltip: '鐐轰笉鍚屾柟妗堟彁渚涘熀鏂� OpenAI 妯″瀷鐨勮▕鎭熆鎳夐搴︺��',
+      titlePerMonth: '{{count,number}} 娑堟伅/鏈�',
+    },
+    annotatedResponse: {
+      title: '妯欒ɑ鍥炶鏁�',
+      tooltip: '妯欒ɑ鍥炶鍔熻兘閫忛亷浜哄伐绶ㄨ集妯欒ɑ鐐烘噳鐢ㄦ彁渚涗簡鍙畾瑁界殑楂樿唱閲忓晱绛斿洖瑕嗚兘鍔�',
+    },
+    ragAPIRequestTooltip: '鎸囧柈鐛ㄥ懠鍙� Dify 鐭ヨ瓨搴硣鏂欒檿鐞嗚兘鍔涚殑 API銆�',
+    receiptInfo: '鍙湁鍦橀殜鎵�鏈夎�呭拰鍦橀殜绠$悊鍝℃墠鑳借▊闁卞拰妾㈣璩柈璩囪▕',
+    annotationQuota: '瑷婚噵閰嶉',
+    self: '鑷垜涓绘寔',
+    apiRateLimitUnit: '{{count,number}}/澶�',
+    freeTrialTipPrefix: '瑷诲唺涓︾嵅寰椾竴鍊�',
+    annualBilling: '骞村害瑷堣不',
+    freeTrialTipSuffix: '鐒¢渶淇$敤鍗�',
+    comparePlanAndFeatures: '姣旇純瑷堝妰鍜屽姛鑳�',
+    teamMember_one: '{{count,number}} 鍦橀殜鎴愬摗',
+    priceTip: '姣忓�嬪伐浣滃崁/',
+    cloud: '闆叉湇鍕�',
+    documentsRequestQuota: '{{count,number}}/鍒嗛悩 鐭ヨ瓨璜嬫眰閫熺巼闄愬埗',
+    unlimitedApiRate: '娌掓湁API閫熺巼闄愬埗',
+    apiRateLimitTooltip: 'API 浣跨敤娆℃暩闄愬埗閬╃敤鏂奸�氶亷 Dify API 鎵�鍋氱殑鎵�鏈夎珛姹傦紝鍖呮嫭鏂囨湰鐢熸垚銆佽亰澶╁皪瑭便�佸伐浣滄祦鍩疯鍜屾枃妾旇檿鐞嗐��',
+    getStarted: '闁嬪浣跨敤',
+    freeTrialTip: '200 娆� OpenAI 閫氳┍鐨勫厤璨昏│鐢ㄣ��',
+    teamWorkspace: '{{count,number}} 鍦橀殜宸ヤ綔绌洪枔',
+    documents: '{{count,number}} 鐭ヨ瓨鏂囦欢',
+    apiRateLimit: 'API 闄愰��',
+    teamMember_other: '{{count,number}} 鍦橀殜鎴愬摗',
+    documentsTooltip: '寰炵煡璀樻暩鎿氫締婧愬皫鍏ョ殑鏂囦欢鏁搁噺閰嶉銆�',
+    documentsRequestQuotaTooltip: '鎸囧畾宸ヤ綔鍗�鍦ㄧ煡璀樺熀绀庝腑姣忓垎閻樺彲浠ュ煼琛岀殑绺芥搷浣滄鏁革紝鍖呮嫭鏁告摎闆嗙殑鍓靛缓銆佸埅闄ゃ�佹洿鏂般�佹枃妾斾笂鍌炽�佷慨鏀广�佹妾斿拰鐭ヨ瓨鍩虹鏌ヨ銆傞�欏�嬫寚妯欑敤鏂艰浼扮煡璀樺熀绀庤珛姹傜殑鎬ц兘銆備緥濡傦紝濡傛灉涓�鍊嬫矙绠辩敤鎴跺湪涓�鍒嗛悩鍏ч�g簩鍩疯10娆″懡涓脯瑭︼紝浠栧�戠殑宸ヤ綔鍗�灏囧湪鎺ヤ笅渚嗙殑涓�鍒嗛悩鍏ф毇鏅傜姝㈠煼琛屼互涓嬫搷浣滐細鏁告摎闆嗙殑鍓靛缓銆佸埅闄ゃ�佹洿鏂颁互鍙婃枃妾斾笂鍌虫垨淇敼銆�',
+  },
+  plans: {
+    sandbox: {
+      name: 'Sandbox',
+      description: '200娆� GPT 鍏嶈不瑭︾敤',
+      includesTitle: '鍖呮嫭锛�',
+      for: '鏍稿績鍔熻兘鍏嶈不瑭︾敤',
+    },
+    professional: {
+      name: 'Professional',
+      description: '璁撳�嬩汉鍜屽皬鍦橀殜鑳藉浠ョ稉婵熷鎯犵殑鏂瑰紡閲嬫斁鏇村鑳藉姏銆�',
+      includesTitle: 'Sandbox 瑷堝妰涓殑涓�鍒囷紝鍔犱笂锛�',
+      for: '閬╁悎鐛ㄧ珛闁嬬櫦鑰�/灏忓瀷鍦橀殜',
+    },
+    team: {
+      name: 'Team',
+      description: '鍗斾綔鐒¢檺鍒朵甫浜彈闋傜礆鏁堣兘銆�',
+      includesTitle: 'Professional 瑷堝妰涓殑涓�鍒囷紝鍔犱笂锛�',
+      for: '閬╃敤鏂间腑鍨嬪湗闅�',
+    },
+    enterprise: {
+      name: 'Enterprise',
+      description: '鐛插緱澶ц妯¢棞閸典换鍕欑郴绲辩殑瀹屾暣鍔熻兘鍜屾敮鎻淬��',
+      includesTitle: 'Team 瑷堝妰涓殑涓�鍒囷紝鍔犱笂锛�',
+      features: {
+        1: '鍟嗘キ瑷卞彲璀夋巿娆�',
+        6: '鍏堥�插畨鍏ㄨ垏鎺у埗',
+        3: '澶氬�嬪伐浣滃崁鍙婁紒妤鐞�',
+        2: '灏堝爆浼佹キ鍔熻兘',
+        4: '鍠竴鐧诲叆',
+        8: '灏堟キ鎶�琛撴敮鎻�',
+        0: '浼佹キ绱氬彲鎿村睍閮ㄧ讲瑙f焙鏂规',
+        7: 'Dify 瀹樻柟鐨勬洿鏂板拰缍',
+        5: '鐢� Dify 鍚堜綔澶ヤ即鍗斿晢鐨勬湇鍕欐按骞冲崝璀�',
+      },
+      price: '鑷▊',
+      btnText: '鑱公閵峰敭',
+      priceTip: '骞村害瑷堣不銇伩',
+      for: '閬╃敤鏂煎ぇ瑕忔ā鍦橀殜',
+    },
+    community: {
+      features: {
+        0: '鎵�鏈夋牳蹇冨姛鑳藉潎鍦ㄥ叕鍏卞瓨鍎插韩涓嬮噵鍑�',
+        2: '閬靛惊 Dify 闁嬫簮瑷卞彲璀�',
+        1: '鍠竴宸ヤ綔鍗�鍩�',
+      },
+      includesTitle: '鍏嶈不鍔熻兘锛�',
+      btnText: '闁嬪浣跨敤绀惧崁',
+      name: '绀惧崁',
+      for: '閬╃敤鏂煎�嬪垾鐢ㄦ埗銆佸皬鍨嬪湗闅婃垨闈炲晢妤爡鐩�',
+      description: '閬╃敤鏂煎�嬪垾鐢ㄦ埗銆佸皬鍨嬪湗闅婃垨闈炲晢妤爡鐩�',
+      price: '鍏嶈不',
+    },
+    premium: {
+      features: {
+        2: '缍查爜鎳夌敤绋嬪簭妯欒獙鍙婂搧鐗岃嚜瀹氱京',
+        0: '鍚勭ó闆茬鏈嶅嫏鎻愪緵鍟嗙殑鑷垜绠$悊鍙潬鎬�',
+        1: '鍠竴宸ヤ綔鍗�鍩�',
+        3: '鍎厛闆诲瓙閮典欢鍙婅亰澶╂敮鎸�',
+      },
+      for: '閬╃敤鏂间腑鍨嬬祫绻斿拰鍦橀殜',
+      comingSoon: '寰粺Azure鑸嘒oogle Cloud鏀寔鍗冲皣鎺ㄥ嚭',
+      priceTip: '鏍规摎闆茬甯傚牬',
+      btnText: '鐛插彇楂樼礆鐗堝湪',
+      name: '楂樼礆',
+      description: '閬╃敤鏂间腑鍨嬬祫绻斿拰鍦橀殜',
+      price: '鍙摯灞曠殑',
+      includesTitle: '渚嗚嚜绀剧兢鐨勪竴鍒囷紝鍔犱笂锛�',
+    },
+  },
+  vectorSpace: {
+    fullTip: '鍚戦噺绌洪枔宸叉豢銆�',
+    fullSolution: '鍗囩礆鎮ㄧ殑濂楅浠ョ嵅寰楁洿澶氱┖闁撱��',
+  },
+  apps: {
+    fullTipLine1: '鍗囩礆鎮ㄧ殑濂楅浠�',
+    fullTipLine2: '妲嬪缓鏇村鐨勭▼寮忋��',
+    fullTip1: '鍗囩礆浠ュ壍寤烘洿澶氭噳鐢ㄧ▼搴�',
+    fullTip2des: '寤鸿娓呴櫎涓嶆椿韬嶇殑鎳夌敤绋嬪紡浠ラ噵鏀句娇鐢ㄧ┖闁擄紝鎴栬伅绻垜鍊戙��',
+    contactUs: '鑱公鎴戝��',
+    fullTip1des: '鎮ㄥ凡閬斿埌姝よ▓鍔冨缓妲嬫噳鐢ㄧ▼搴忕殑闄愬埗',
+    fullTip2: '瑷堝妰闄愬埗宸查仈',
+  },
+  annotatedResponse: {
+    fullTipLine1: '鍗囩礆鎮ㄧ殑濂楅浠�',
+    fullTipLine2: '妯欒ɑ鏇村灏嶈┍銆�',
+    quotaTitle: '妯欒ɑ鐨勯厤椤�',
+  },
+  usagePage: {
+    documentsUploadQuota: '鏂囦欢涓婂偝閰嶉',
+    vectorSpaceTooltip: '浣跨敤楂樺搧璩储寮曟ā寮忕殑鏂囦欢灏囨秷鑰楃煡璀樻暩鎿氬瓨鍎茶硣婧愩�傜暥鐭ヨ瓨鏁告摎瀛樺劜閬斿埌闄愬埗寰岋紝灏囦笉鏈冧笂鍌虫柊鏂囦欢銆�',
+    annotationQuota: '瑷昏В閰嶉',
+    vectorSpace: '鐭ヨ瓨鏁告摎鍎插瓨',
+    buildApps: '寤烘鎳夌敤绋嬪紡',
+    teamMembers: '鍦橀殜鎴愬摗',
+  },
+  teamMembers: '鍦橀殜鎴愬摗',
+}
+
+export default translation
diff --git a/i18n/zh-Hant/common.ts b/i18n/zh-Hant/common.ts
new file mode 100644
index 0000000..84b7bc5
--- /dev/null
+++ b/i18n/zh-Hant/common.ts
@@ -0,0 +1,672 @@
+const translation = {
+  api: {
+    success: '鎴愬姛',
+    actionSuccess: '鎿嶄綔鎴愬姛',
+    saved: '宸插劜瀛�',
+    create: '宸插缓绔�',
+    remove: '宸茬Щ闄�',
+  },
+  operation: {
+    create: '寤虹珛',
+    confirm: '纰鸿獚',
+    cancel: '鍙栨秷',
+    clear: '娓呯┖',
+    save: '鍎插瓨',
+    saveAndEnable: '鍎插瓨涓﹀暉鐢�',
+    edit: '绶ㄨ集',
+    add: '鏂板',
+    added: '宸叉柊澧�',
+    refresh: '閲嶆柊闁嬪',
+    reset: '閲嶇疆',
+    search: '鎼滃皨',
+    change: '鏇存敼',
+    remove: '绉婚櫎',
+    send: '鍌抽��',
+    copy: '瑜囪=',
+    lineBreak: '鎻涜',
+    sure: '鎴戠⒑瀹�',
+    download: '涓嬭級',
+    delete: '鍒櫎',
+    settings: '瑷畾',
+    setup: '瑷畾',
+    getForFree: '鍏嶈不鐛插彇',
+    reload: '閲嶆柊鏁寸悊',
+    ok: '濂界殑',
+    log: '鏃ヨ獙',
+    learnMore: '鐬В鏇村',
+    params: '寮曟暩瑷畾',
+    duplicate: '瑜囪=',
+    rename: '閲嶆柊鍛藉悕',
+    audioSourceUnavailable: '闊宠▕渚嗘簮涓嶅彲鐢�',
+    copyImage: '瑜囪=鍦栧儚',
+    openInNewTab: '鍦ㄦ柊閬搁爡鍗′腑鎵撻枊',
+    zoomIn: '鏀惧ぇ',
+    zoomOut: '绺皬',
+    saveAndRegenerate: '淇濆瓨涓﹂噸鏂扮敓鎴愬瓙濉�',
+    view: '瑕栧湒',
+    close: '闂滈枆',
+    viewMore: '鏌ョ湅鏇村',
+    regenerate: '鍐嶇敓',
+    submit: '鎻愪氦',
+    skip: '鑸�',
+    imageCopied: '瑜囪=鐨勫湒鐗�',
+    deleteApp: '鍒櫎鎳夌敤绋嬪紡',
+    viewDetails: '鏌ョ湅瑭虫儏',
+    in: '鍦�',
+    copied: '瑜囪=',
+    more: '鏇村',
+    downloadSuccess: '涓嬭級瀹屾垚銆�',
+    downloadFailed: '涓嬭級澶辨晽銆傝珛绋嶅緦鍐嶈│銆�',
+    format: '鏍煎紡',
+  },
+  placeholder: {
+    input: '璜嬭几鍏�',
+    select: '璜嬮伕鎿�',
+  },
+  voice: {
+    language: {
+      zhHans: '涓枃',
+      zhHant: '绻侀珨涓枃',
+      enUS: '鑻辫獮',
+      deDE: '寰疯獮',
+      frFR: '娉曡獮',
+      esES: '瑗跨彮鐗欒獮',
+      itIT: '缇╁ぇ鍒╄獮',
+      thTH: '娉拌獮',
+      idID: '鍗板凹瑾�',
+      jaJP: '鏃ヨ獮',
+      koKR: '闊撹獮',
+      ptBR: '钁¤悇鐗欒獮',
+      ruRU: '淇勮獮',
+      ukUA: '鐑忓厠铇獮',
+      viVN: '瓒婂崡瑾�',
+      plPL: '娉㈣槶瑾�',
+      roRO: '缇呴Μ灏间簽瑾�',
+      hiIN: '鍗板湴瑾�',
+      trTR: '鍦熻�冲叾瑾�',
+      faIR: '娉㈡柉瑾�',
+    },
+  },
+  unit: {
+    char: '鍊嬪瓧鍏�',
+  },
+  actionMsg: {
+    noModification: '鏆劇淇敼',
+    modifiedSuccessfully: '淇敼鎴愬姛',
+    modifiedUnsuccessfully: '淇敼澶辨晽',
+    copySuccessfully: '瑜囪=鎴愬姛',
+    generatedSuccessfully: '宸查噸鏂扮敓鎴�',
+    generatedUnsuccessfully: '鐢熸垚澶辨晽',
+    paySucceeded: '宸叉敮浠樻垚鍔�',
+    payCancelled: '宸插彇娑堟敮浠�',
+  },
+  model: {
+    params: {
+      temperature: '闅ㄦ鎬� temperature',
+      temperatureTip:
+        '鎺у埗鍥炶鐨勯毃姗熸�с�俓n鍊艰秺澶э紝鍥炶瓒婇毃姗熴�俓n鍊艰秺灏忥紝鍥炶瓒婄⒑瀹氭垨涓�鑷淬��',
+      top_p: '鏍稿彇妯� top_p',
+      top_pTip:
+        '鎺у埗鐢熸垚澶氭ǎ鎬с�俓n鍊艰秺澶э紝杓稿嚭鏈冨寘鎷洿澶氱殑鍠閬搁爡銆俓n鍊艰秺灏忥紝妯″瀷鏈冩洿闆嗕腑鍦ㄩ珮姗熺巼鐨勫柈瑭炰笂锛岃几鍑烘洿纰哄畾浣嗗彲鑳界己涔忓妯f�с�俓n鏍稿彇妯e拰闅ㄦ鎬т笉寤鸿鍚屾檪淇敼銆�',
+      presence_penalty: '瑭遍鏂伴搴� presence_penalty',
+      presence_penaltyTip:
+        '鎺у埗鐢熸垚鏅傚皪涓婃枃宸插瓨鍦ㄧ殑瑭遍鐨勫亸濂界▼搴︺�俓n鍊艰秺澶э紝瓒婂彲鑳戒娇鐢ㄥ埌鏂扮殑瑭遍銆�',
+      frequency_penalty: '闋荤巼鎳茬桨搴� frequency_penalty',
+      frequency_penaltyTip:
+        '褰遍熆甯歌鑸囩綍瑕嬭褰欎娇鐢ㄣ�俓n鍊艰純澶ф檪锛屽偩鍚戞柤鐢熸垚涓嶅父瑕嬬殑瑭炲綑鍜岃〃閬旀柟寮忋�俓n鍊艰秺灏忥紝鏇村偩鍚戞柤浣跨敤甯歌鍜屾櫘閬嶆帴鍙楃殑瑭炲綑鎴栫煭瑾炪��',
+      max_tokens: '鍠鍥炶闄愬埗 max_tokens',
+      max_tokensTip:
+        '鐢ㄦ柤闄愬埗鍥炶鐨勬渶澶ч暦搴︼紝浠� token 鐐哄柈浣嶃�俓n杓冨ぇ鐨勫�煎彲鑳芥渻闄愬埗绲︽彁绀鸿銆佽亰澶╄閷勫拰鐭ヨ瓨搴暀鍑虹殑绌洪枔銆俓n寤鸿灏囧叾瑷畾鍦ㄤ笁鍒嗕箣浜屼互涓嬨�俓ngpt-4-1106-preview銆乬pt-4-vision-preview 鏈�澶ч暦搴� (杓稿叆128k锛岃几鍑�4k)',
+      maxTokenSettingTip: '鎮ㄨō瀹氱殑鏈�澶� tokens 鏁歌純澶э紝鍙兘鏈冨皫鑷� prompt銆佷娇鐢ㄨ�呭晱椤屻�佺煡璀樺韩鍏у娌掓湁 token 绌洪枔閫茶铏曠悊锛屽缓璀拌ō瀹氬埌 2/3 浠ヤ笅銆�',
+      setToCurrentModelMaxTokenTip: '鏈�澶т护鐗屾暩鏇存柊鐐虹暥鍓嶆ā鍨嬫渶澶х殑浠ょ墝鏁� {{maxToken}} 鐨� 80%銆�',
+      stop_sequences: '鍋滄搴忓垪 stop_sequences',
+      stop_sequencesTip: '鏈�澶氬洓鍊嬪簭鍒楋紝API 灏囧仠姝㈢敓鎴愭洿澶氱殑 token銆傝繑鍥炵殑鏂囧瓧灏囦笉鍖呭惈鍋滄搴忓垪銆�',
+      stop_sequencesPlaceholder: '杓稿叆搴忓垪涓︽寜 Tab 閸�',
+    },
+    tone: {
+      Creative: '鍓垫剰',
+      Balanced: '骞宠 ',
+      Precise: '绮剧⒑',
+      Custom: '鑷畾缇�',
+    },
+    addMoreModel: '鏂板鏇村妯″瀷',
+    settingsLink: 'Model Provider 瑷疆',
+    capabilities: '澶氭ā寮忓姛鑳�',
+  },
+  menus: {
+    status: 'beta',
+    explore: '鎺㈢储',
+    apps: '宸ヤ綔瀹�',
+    plugins: '澶栨帥',
+    pluginsTips: '鏁村悎绗笁鏂瑰鎺涙垨寤虹珛鑸� ChatGPT 鐩稿鐨� AI 澶栨帥銆�',
+    datasets: '鐭ヨ瓨搴�',
+    datasetsTips: '鍗冲皣鍒颁締: 涓婂偝鑷繁鐨勯暦鏂囧瓧璩囨枡锛屾垨閫忛亷 Webhook 鏁村悎鑷繁鐨勮硣鏂欎締婧�',
+    newApp: '寤虹珛鎳夌敤',
+    newDataset: '寤虹珛鐭ヨ瓨搴�',
+    tools: '宸ュ叿',
+    exploreMarketplace: '鎺㈢储 Marketplace',
+  },
+  userProfile: {
+    settings: '瑷畾',
+    emailSupport: '闆诲瓙閮典欢鏀彺',
+    workspace: '宸ヤ綔绌洪枔',
+    createWorkspace: '寤虹珛宸ヤ綔绌洪枔',
+    helpCenter: '骞姪鏂囦欢',
+    communityFeedback: '浣跨敤鑰呭弽楗�',
+    roadmap: '璺窔鍦�',
+    community: '绀剧兢',
+    about: '闂滄柤',
+    logout: '鐧诲嚭',
+    support: '鏀寔',
+    github: 'GitHub',
+    compliance: '鍚堣',
+  },
+  settings: {
+    accountGroup: '璩埗',
+    workplaceGroup: '宸ヤ綔绌洪枔',
+    account: '鎴戠殑璩埗',
+    members: '鎴愬摗',
+    billing: '璩柈',
+    integrations: '鏁村悎',
+    language: '瑾炶█',
+    provider: '妯″瀷渚涙噳鍟�',
+    dataSource: '璩囨枡渚嗘簮',
+    plugin: '澶栨帥',
+    apiBasedExtension: 'API 鎿村厖濂椾欢',
+    generalGroup: '甯歌',
+  },
+  account: {
+    avatar: '闋儚',
+    name: '浣跨敤鑰呭悕绋�',
+    email: '閮电',
+    password: '瀵嗙⒓',
+    passwordTip: '濡傛灉鎮ㄤ笉鎯充娇鐢ㄩ璀夌⒓鐧诲叆锛屽彲浠ヨō瀹氭案涔呭瘑纰�',
+    setPassword: '瑷畾瀵嗙⒓',
+    resetPassword: '閲嶇疆瀵嗙⒓',
+    currentPassword: '鍘熷瘑纰�',
+    newPassword: '鏂板瘑纰�',
+    notEqual: '鍏╁�嬪瘑纰间笉鐩稿悓',
+    confirmPassword: '纰鸿獚瀵嗙⒓',
+    langGeniusAccount: 'Dify 璩櫉',
+    langGeniusAccountTip: '鎮ㄧ殑 Dify 璩櫉鍜岀浉闂滅殑浣跨敤鑰呰硣鏂欍��',
+    editName: '绶ㄨ集鍚嶅瓧',
+    showAppLength: '椤ず {{length}} 鍊嬫噳鐢�',
+    delete: '鍒櫎甯虫埗',
+    deleteTip: '鍒櫎鎮ㄧ殑甯虫埗灏囨案涔呭埅闄ゆ偍鐨勬墍鏈夎硣鏂欎甫涓旂劇娉曟仮寰┿��',
+    deleteConfirmTip: '璜嬪皣浠ヤ笅鍏у寰炴偍鐨勮ɑ鍐婇浕瀛愰兊浠剁櫦閫佽嚦 ',
+    account: '甯虫埗',
+    myAccount: '鎴戠殑甯虫埗',
+    studio: 'Dify 宸ヤ綔瀹�',
+    deletePrivacyLinkTip: '鏈夐棞鎴戝�戝浣曡檿鐞嗘偍鐨勬暩鎿氱殑鏇村璩囪▕锛岃珛鍙冮柋鎴戝�戠殑',
+    deletePrivacyLink: '闅辩绛栫暐銆�',
+    deleteSuccessTip: '鎮ㄧ殑甯虫埗闇�瑕佹檪闁撴墠鑳藉畬鎴愬埅闄ゃ�傚畬鎴愬緦锛屾垜鍊戞渻绲︽偍鐧奸�侀浕瀛愰兊浠躲��',
+    deleteLabel: '瑕佺⒑瑾嶏紝璜嬪湪涓嬫柟杓稿叆鎮ㄧ殑闆诲瓙閮典欢',
+    deletePlaceholder: '璜嬭几鍏ユ偍鐨勯浕瀛愰兊浠�',
+    verificationLabel: '椹楄瓑纰�',
+    verificationPlaceholder: '绮樿布6浣嶄唬纰�',
+    permanentlyDeleteButton: '姘镐箙鍒櫎甯虫埗',
+    feedbackTitle: '鍙嶉',
+    feedbackLabel: '鍛婅ù鎴戝�戞偍鍒櫎甯虫埗鐨勫師鍥狅紵',
+    feedbackPlaceholder: '鑷伕',
+    sendVerificationButton: '鐧奸�侀璀夌⒓',
+    workspaceName: '宸ヤ綔鍗�鍚嶇ū',
+    workspaceIcon: '宸ヤ綔鍗�鍩熷湒绀�',
+    editWorkspaceInfo: '绶ㄨ集宸ヤ綔鍗�璩囪▕',
+  },
+  members: {
+    team: '鍦橀殜',
+    invite: '鏂板',
+    name: '濮撳悕',
+    lastActive: '涓婃娲诲嫊鏅傞枔',
+    role: '瑙掕壊',
+    pending: '寰呭畾...',
+    owner: '鎵�鏈夎��',
+    admin: '绠$悊鍝�',
+    adminTip: '鑳藉寤虹珛鎳夌敤绋嬪紡鍜岀鐞嗗湗闅婅ō瀹�',
+    normal: '鎴愬摗',
+    normalTip: '鍙兘浣跨敤鎳夌敤绋嬪紡锛屼笉鑳藉缓绔嬫噳鐢ㄧ▼寮�',
+    editor: '绶ㄨ集',
+    editorTip: '鑳藉寤虹珛涓︾法杓噳鐢ㄧ▼寮忥紝涓嶈兘绠$悊鍦橀殜瑷畾',
+    inviteTeamMember: '鏂板鍦橀殜鎴愬摗',
+    inviteTeamMemberTip: '灏嶆柟鍦ㄧ櫥鍏ュ緦鍙互瑷晱浣犵殑鍦橀殜璩囨枡銆�',
+    emailNotSetup: '鐢辨柤閮典欢浼烘湇鍣ㄦ湭瑷疆锛岀劇娉曠櫦閫侀個璜嬮兊浠躲�傝珛灏囬個璜嬪緦鐢熸垚鐨勯個璜嬮�g祼閫氱煡鐢ㄦ埗銆�',
+    email: '閮电',
+    emailInvalid: '閮电鏍煎紡鐒℃晥',
+    emailPlaceholder: '杓稿叆閮电',
+    sendInvite: '鍌抽�侀個璜�',
+    invitedAsRole: '閭�璜嬬偤{{role}}浣跨敤鑰�',
+    invitationSent: '閭�璜嬪凡鍌抽��',
+    invitationSentTip: '閭�璜嬪凡鍌抽�侊紝灏嶆柟鐧诲叆 Dify 寰屽嵆鍙í鍟忎綘鐨勫湗闅婅硣鏂欍��',
+    invitationLink: '閭�璜嬮�g祼',
+    failedInvitationEmails: '閭�璜嬩互涓嬮兊绠卞け鏁�',
+    ok: '濂界殑',
+    removeFromTeam: '绉诲嚭鍦橀殜',
+    removeFromTeamTip: '灏囧彇娑堝湗闅婅í鍟�',
+    setAdmin: '瑷偤绠$悊鍝�',
+    setMember: '瑷偤鏅�氭垚鍝�',
+    setEditor: '瑷偤绶ㄨ集',
+    disInvite: '鍙栨秷閭�璜�',
+    deleteMember: '鍒櫎鎴愬摗',
+    you: '锛堜綘锛�',
+    setBuilder: 'Set as builder 锛堣ō缃偤寤烘鍣級',
+    datasetOperator: '鐭ヨ瓨绠$悊鍝�',
+    builder: '寤虹瘔宸ヤ汉',
+    builderTip: '鍙互妲嬪缓鍜岀法杓嚜宸辩殑鎳夌敤绋嬪紡',
+    datasetOperatorTip: '鍙兘绠$悊鐭ヨ瓨搴�',
+  },
+  integrations: {
+    connected: '鐧诲叆鏂瑰紡',
+    google: 'Google',
+    googleAccount: 'Google 璩櫉鐧诲叆',
+    github: 'GitHub',
+    githubAccount: 'GitHub 璩櫉鐧诲叆',
+    connect: '绻祼',
+  },
+  language: {
+    displayLanguage: '浠嬮潰瑾炶█',
+    timezone: '鏅傚崁',
+  },
+  provider: {
+    apiKey: 'API 閲戦懓',
+    enterYourKey: '杓稿叆浣犵殑 API 閲戦懓',
+    invalidKey: '鐒℃晥鐨� OpenAI API 閲戦懓',
+    validatedError: '鏍¢澶辨晽锛�',
+    validating: '椹楄瓑閲戦懓涓�...',
+    saveFailed: 'API 閲戦懓鍎插瓨澶辨晽',
+    apiKeyExceedBill: '姝� API KEY 宸叉矑鏈夊彲鐢ㄩ厤椤嶏紝璜嬮柋璁�',
+    addKey: '鏂板 閲戦懓',
+    comingSoon: '鍗冲皣鎺ㄥ嚭',
+    editKey: '绶ㄨ集',
+    invalidApiKey: '鐒℃晥鐨� API 閲戦懓',
+    azure: {
+      apiBase: 'API Base',
+      apiBasePlaceholder: '杓稿叆鎮ㄧ殑 Azure OpenAI API Base 鍦板潃',
+      apiKey: 'API Key',
+      apiKeyPlaceholder: '杓稿叆浣犵殑 API 閲戦懓',
+      helpTip: '鐬В Azure OpenAI Service',
+    },
+    openaiHosted: {
+      openaiHosted: '瑷楃 OpenAI',
+      onTrial: '楂旈',
+      exhausted: '瓒呭嚭闄愰',
+      desc: '瑷楃 OpenAI 鐢� Dify 鎻愪緵鐨勮绠� OpenAI 鏈嶅嫏锛屼綘鍙互浣跨敤 GPT-3.5 绛夋ā鍨嬶紝鍦ㄩ珨椹楅搴︽秷鑰楀畬鐣㈠墠浣犻渶瑕佽ō瀹氬叾瀹冩ā鍨嬩緵鎳夊晢銆�',
+      callTimes: '鍛煎彨娆℃暩',
+      usedUp: '瑭︾敤椤嶅害宸茬敤瀹岋紝璜嬪湪涓嬫柟鏂板鑷繁鐨勬ā鍨嬩緵鎳夊晢',
+      useYourModel: '鐣跺墠姝e湪浣跨敤浣犺嚜宸辩殑妯″瀷渚涙噳鍟嗐��',
+      close: '闂滈枆',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: '楂旈',
+      exhausted: '瓒呭嚭闄愰',
+      desc: '鍔熻兘寮峰ぇ鐨勬ā鍨嬶紝鎿呴暦鍩疯寰炶闆滃皪瑭卞拰鍓垫剰鍏у鐢熸垚鍒拌┏绱版寚灏庣殑鍚勭ó浠诲嫏銆�',
+      callTimes: '鍛煎彨娆℃暩',
+      usedUp: '瑭︾敤椤嶅害宸茬敤瀹岋紝璜嬪湪涓嬫柟鏂板鑷繁鐨勬ā鍨嬩緵鎳夊晢',
+      useYourModel: '鐣跺墠姝e湪浣跨敤浣犺嚜宸辩殑妯″瀷渚涙噳鍟嗐��',
+      close: '闂滈枆',
+      trialQuotaTip: '鎮ㄧ殑 Anthropic 瑭︾敤閰嶉灏囨柤 2025 骞� 3 鏈� 11 鏃ュ埌鏈燂紝姝ゅ緦灏囦笉鍐嶅彲鐢ㄣ�傝珛鍙婃檪鍒╃敤銆�',
+    },
+    anthropic: {
+      using: '宓屽叆鑳藉姏姝e湪浣跨敤',
+      enableTip: '瑕佸暉鐢� Anthropic 妯″瀷锛屾偍闇�瑕佸厛绻祼 OpenAI 鎴� Azure OpenAI 鏈嶅嫏銆�',
+      notEnabled: '鏈暉鐢�',
+      keyFrom: '寰� Anthropic 鐛插彇鎮ㄧ殑 API 閲戦懓',
+    },
+    encrypted: {
+      front: '閲戦懓灏囦娇鐢� ',
+      back: ' 鎶�琛撻�茶鍔犲瘑鍜屽劜瀛樸��',
+    },
+  },
+  modelProvider: {
+    notConfigured: '绯荤当妯″瀷灏氭湭瀹屽叏閰嶇疆锛岄儴鍒嗗姛鑳藉彲鑳界劇娉曚娇鐢ㄣ��',
+    systemModelSettings: '绯荤当妯″瀷瑷畾',
+    systemModelSettingsLink: '鐐轰粈楹奸渶瑕佽ō瀹氱郴绲辨ā鍨嬶紵',
+    selectModel: '閬告搰鎮ㄧ殑妯″瀷',
+    setupModelFirst: '璜嬪厛瑷畾鎮ㄧ殑妯″瀷',
+    systemReasoningModel: {
+      key: '绯荤当鎺ㄧ悊妯″瀷',
+      tip: '瑷畾寤虹珛鎳夌敤浣跨敤鐨勯爯瑷帹鐞嗘ā鍨嬶紝浠ュ強灏嶈┍鍚嶇ū鐢熸垚銆佷笅涓�姝ュ晱椤屽缓璀扮瓑鍔熻兘涔熸渻浣跨敤瑭查爯瑷帹鐞嗘ā鍨嬨��',
+    },
+    embeddingModel: {
+      key: 'Embedding 妯″瀷',
+      tip: '瑷畾鐭ヨ瓨搴枃浠跺祵鍏ヨ檿鐞嗙殑闋愯ō妯″瀷锛屾绱㈠拰鍖叆鐭ヨ瓨搴潎浣跨敤瑭睧mbedding妯″瀷閫茶鍚戦噺鍖栬檿鐞嗭紝鍒囨彌寰屽皣灏庤嚧宸插尟鍏ョ殑鐭ヨ瓨搴垏鍟忛涔嬮枔鐨勫悜閲忕董搴︿笉涓�鑷达紝寰炶�屽皫鑷存绱㈠け鏁椼�傜偤閬垮厤妾㈢储澶辨晽锛岃珛鍕块毃鎰忓垏鎻涜┎妯″瀷銆�',
+      required: '璜嬮伕鎿� Embedding 妯″瀷',
+    },
+    speechToTextModel: {
+      key: '瑾為煶杞夋枃瀛楁ā鍨�',
+      tip: '瑷畾灏嶈┍涓獮闊宠綁鏂囧瓧杓稿叆鐨勯爯瑷娇鐢ㄦā鍨嬨��',
+    },
+    ttsModel: {
+      key: '鏂囧瓧杞夎獮闊虫ā鍨�',
+      tip: '瑷畾灏嶈┍涓枃瀛楄綁瑾為煶杓稿嚭鐨勯爯瑷娇鐢ㄦā鍨嬨��',
+    },
+    rerankModel: {
+      key: 'Rerank 妯″瀷',
+      tip: '閲嶆帓搴忔ā鍨嬪皣鏍规摎鍊欓伕鏂囦欢鍒楄〃鑸囦娇鐢ㄨ�呭晱椤岃獮缇╁尮閰嶅害閫茶閲嶆柊鎺掑簭锛屽緸鑰屾敼閫茶獮缇╂帓搴忕殑绲愭灉',
+    },
+    quota: '椤嶅害',
+    searchModel: '鎼滃皨妯″瀷',
+    noModelFound: '鎵句笉鍒版ā鍨� {{model}}',
+    models: '妯″瀷鍒楄〃',
+    showMoreModelProvider: '椤ず鏇村妯″瀷鎻愪緵鍟�',
+    selector: {
+      tip: '瑭叉ā鍨嬪凡琚埅闄ゃ�傝珛娣绘ā鍨嬫垨閬告搰鍏朵粬妯″瀷銆�',
+      emptyTip: '鐒″彲鐢ㄦā鍨�',
+      emptySetting: '璜嬪墠寰�瑷畾閫茶閰嶇疆',
+      rerankTip: '璜嬭ō瀹� Rerank 妯″瀷',
+    },
+    card: {
+      quota: '椤嶅害',
+      onTrial: '瑭︾敤涓�',
+      paid: '宸茶臣璨�',
+      quotaExhausted: '閰嶉宸茬敤瀹�',
+      callTimes: '鍛煎彨娆℃暩',
+      tokens: 'Tokens',
+      buyQuota: '璩艰卜椤嶅害',
+      priorityUse: '鍎厛浣跨敤',
+      removeKey: '鍒櫎 API 閲戦懓',
+      tip: '宸蹭粯璨婚搴﹀皣鍎厛鑰冩叜銆� 瑭︾敤椤嶅害灏囧湪浠樿不椤嶅害鐢ㄥ畬寰屼娇鐢ㄣ��',
+    },
+    item: {
+      deleteDesc: '{{modelName}} 琚敤浣滅郴绲辨帹鐞嗘ā鍨嬨�傚埅闄ゅ緦閮ㄥ垎鍔熻兘灏囩劇娉曚娇鐢ㄣ�傝珛纰鸿獚銆�',
+      freeQuota: '鍏嶈不椤嶅害',
+    },
+    addApiKey: '鏂板鎮ㄧ殑 API 閲戦懓',
+    invalidApiKey: 'Invalid API key',
+    encrypted: {
+      front: '鎮ㄧ殑閲戦懓灏囦娇鐢�',
+      back: '鎶�琛撻�茶鍔犲瘑鍜屽劜瀛樸��',
+    },
+    freeQuota: {
+      howToEarn: '濡備綍鐛插彇',
+    },
+    addMoreModelProvider: '鏂板鏇村妯″瀷鎻愪緵鍟�',
+    addModel: '鏂板妯″瀷',
+    modelsNum: '{{num}} 鍊嬫ā鍨�',
+    showModels: '椤ず妯″瀷',
+    showModelsNum: '椤ず {{num}} 鍊嬫ā鍨�',
+    collapse: '鏀惰捣',
+    config: '閰嶇疆',
+    modelAndParameters: '妯″瀷鍙婂紩鏁�',
+    model: '妯″瀷',
+    featureSupported: '鏀彺 {{feature}} 鍔熻兘',
+    callTimes: '鍛煎彨娆℃暩',
+    credits: '瑷婃伅椤嶅害',
+    buyQuota: '璩艰卜椤嶅害',
+    getFreeTokens: '鐛插緱鍏嶈不 Tokens',
+    priorityUsing: '鍎厛浣跨敤',
+    deprecated: '宸叉鐢�',
+    confirmDelete: '纰鸿獚鍒櫎?',
+    quotaTip: '鍓╅鍏嶈不椤嶅害',
+    loadPresets: '杓夊叆闋愯ō',
+    parameters: '寮曟暩',
+    loadBalancingHeadline: '璨犺級鍧囪 ',
+    apiKeyStatusNormal: 'APIKey 鐙�鎱嬫甯�',
+    defaultConfig: '榛樿獚閰嶇疆',
+    configLoadBalancing: '閰嶇疆璨犺級鍧囪 ',
+    loadBalancingDescription: '浣跨敤澶氱祫鎲戣瓑娓涜紩澹撳姏銆�',
+    addConfig: '娣诲姞閰嶇疆',
+    upgradeForLoadBalancing: '鍗囩礆鎮ㄧ殑瑷堝妰浠ュ暉鐢↙oad Balancing銆�',
+    apiKey: 'API 閲戦懓',
+    loadBalancing: '璨犺級鍧囪 ',
+    providerManagedDescription: '浣跨敤妯″瀷鎻愪緵绋嬪紡鎻愪緵鐨勫柈绲勬啈璀夈��',
+    modelHasBeenDeprecated: '姝ゆā鍨嬪凡妫勭敤',
+    apiKeyRateLimit: '宸查仈鍒伴�熺巼闄愬埗锛屽湪 {{seconds}} 绉掑緦鍙敤',
+    providerManaged: '鎻愪緵鑰呯鐞�',
+    editConfig: '绶ㄨ集閰嶇疆',
+    loadBalancingInfo: '榛樿獚鎯呮硜涓嬶紝璨犺級鍧囪 浣跨敤 Round-robin 绛栫暐銆傚鏋滆Ц鐧间簡閫熺巼闄愬埗锛屽皣鎳夌敤 1 鍒嗛悩鐨勫喎鍗绘檪闁撱��',
+    loadBalancingLeastKeyWarning: '瑕佸暉鐢ㄨ矤杓夊潎琛★紝蹇呴爤鑷冲皯鍟熺敤 2 鍊嬮噾閼般��',
+    discoverMore: '鐧肩従鏇村',
+    installProvider: '瀹夎妯″瀷鎻愪緵绋嬪紡',
+    toBeConfigured: '寰呴厤缃�',
+    emptyProviderTitle: '鏈ō缃ā鍨嬫彁渚涜��',
+    configureTip: '瑷疆 api-key 鎴栨坊鍔犺浣跨敤鐨勬ā鍨�',
+    emptyProviderTip: '璜嬪厛瀹夎妯″瀷鎻愪緵鑰呫��',
+  },
+  dataSource: {
+    add: '鏂板璩囨枡渚嗘簮',
+    connect: '绻祼',
+    notion: {
+      title: 'Notion',
+      description: '浣跨敤 Notion 浣滅偤鐭ヨ瓨搴殑璩囨枡渚嗘簮銆�',
+      connectedWorkspace: '宸茬公绲愬伐浣滅┖闁�',
+      addWorkspace: '鏂板宸ヤ綔绌洪枔',
+      connected: '宸茬公绲�',
+      disconnected: '鏈公绲�',
+      changeAuthorizedPages: '鏇存敼鎺堟瑠闋侀潰',
+      pagesAuthorized: '宸叉巿娆婇爜闈�',
+      sync: '鍚屾',
+      remove: '鍒櫎',
+      selector: {
+        pageSelected: '宸查伕闋侀潰',
+        searchPages: '鎼滃皨闋侀潰...',
+        noSearchResult: '鐒℃悳灏嬬祼鏋�',
+        addPages: '鏂板闋侀潰',
+        preview: '闋愯',
+      },
+    },
+    website: {
+      active: '绌嶆サ',
+      title: '缍茬珯',
+      with: '璺�',
+      inactive: '鐒℃晥',
+      configuredCrawlers: '閰嶇疆鐨勭埇缍茬▼寮�',
+      description: '浣跨敤 Web 鐖煵寰炵恫绔欏皫鍏ュ収瀹广��',
+    },
+    configure: '閰嶇疆',
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'API Key',
+      apiKeyPlaceholder: '杓稿叆浣犵殑 API 閲戦懓',
+      keyFrom: '寰� SerpAPI 甯虫埗闋侀潰鐛插彇鎮ㄧ殑 SerpAPI 閲戦懓',
+    },
+  },
+  apiBasedExtension: {
+    title: 'API 鎿村厖濂椾欢鎻愪緵浜嗕竴鍊嬮泦涓紡鐨� API 绠$悊锛屽湪姝ょ当涓�鏂板 API 閰嶇疆寰岋紝鏂逛究鍦� Dify 涓婄殑鍚勯鎳夌敤涓洿鎺ヤ娇鐢ㄣ��',
+    link: '鐬В濡備綍闁嬬櫦鎮ㄨ嚜宸辩殑 API 鎿村厖濂椾欢銆�',
+    linkUrl: 'https://docs.dify.ai/zh-hans/guides/tools/extensions/api-based/api-based-extension',
+    add: '鏂板 API 鎿村厖濂椾欢',
+    selector: {
+      title: 'API 鎿村厖濂椾欢',
+      placeholder: '璜嬮伕鎿� API 鎿村厖濂椾欢',
+      manage: '绠$悊 API 鎿村厖濂椾欢',
+    },
+    modal: {
+      title: '鏂板 API 鎿村厖濂椾欢',
+      editTitle: '绶ㄨ集 API 鎿村厖濂椾欢',
+      name: {
+        title: '鍚嶇ū',
+        placeholder: '璜嬭几鍏ュ悕绋�',
+      },
+      apiEndpoint: {
+        title: 'API Endpoint',
+        placeholder: '璜嬭几鍏� API endpoint',
+      },
+      apiKey: {
+        title: 'API-key',
+        placeholder: '璜嬭几鍏� API-key',
+        lengthError: 'API-key 涓嶈兘灏戞柤 5 浣�',
+      },
+    },
+    type: '鍨嬪垾',
+  },
+  about: {
+    changeLog: '鏇存柊鏃ヨ獙',
+    updateNow: '鐝惧湪鏇存柊',
+    nowAvailable: 'Dify {{version}} 鐝惧凡鍙敤銆�',
+    latestAvailable: 'Dify {{version}} 宸叉槸鏈�鏂扮増鏈��',
+  },
+  appMenus: {
+    overview: '鐩f帶',
+    promptEng: '绶ㄦ帓',
+    apiAccess: '瑷晱 API',
+    logAndAnn: '鏃ヨ獙鑸囨瑷�',
+    logs: '鏃ヨ獙',
+  },
+  environment: {
+    testing: '娓│鐠板',
+    development: '闁嬬櫦鐠板',
+  },
+  appModes: {
+    completionApp: '鏂囧瓧鐢熸垚鍨嬫噳鐢�',
+    chatApp: '灏嶈┍鍨嬫噳鐢�',
+  },
+  datasetMenus: {
+    documents: '鏂囦欢',
+    hitTesting: '鍙洖娓│',
+    settings: '瑷畾',
+    emptyTip: ' 鐭ヨ瓨搴皻鏈棞鑱紝璜嬪墠寰�鎳夌敤绋嬪紡鎴栧鎺涘畬鎴愰棞鑱��',
+    viewDoc: '妾㈣鏂囦欢',
+    relatedApp: '鍊嬮棞鑱噳鐢�',
+    noRelatedApp: '娌掓湁閫g祼鐨勬噳鐢ㄧ▼寮�',
+  },
+  voiceInput: {
+    speaking: '鐝惧湪璎�...',
+    converting: '姝e湪杞夋彌鐐烘枃瀛�...',
+    notAllow: '楹ュ厠棰ㄦ湭鎺堟瑠',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: '閲嶆柊鍛藉悕鏈冭┍',
+    conversationName: '鏈冭┍鍚嶇ū',
+    conversationNamePlaceholder: '璜嬭几鍏ユ渻瑭卞悕绋�',
+    conversationNameCanNotEmpty: '鏈冭┍鍚嶇ū蹇呭~',
+    citation: {
+      title: '寮曠敤',
+      linkToDataset: '璺宠綁鑷崇煡璀樺韩',
+      characters: '瀛楀厓锛�',
+      hitCount: '鍙洖娆℃暩锛�',
+      vectorHash: '鍚戦噺闆滄箠锛�',
+      hitScore: '鍙洖寰楀垎锛�',
+    },
+    inputPlaceholder: '鑸� Bot 灏嶈┍',
+    thinking: '鎬濈董銆傘�傘��',
+    thought: '鎬濇兂',
+    resend: '閲嶆柊鐧奸��',
+  },
+  promptEditor: {
+    placeholder: '鍦ㄩ�欒!瀵綘鐨勬彁绀鸿锛岃几鍏'{\' 鎻掑叆璁婃暩銆佽几鍏'/\' 鎻掑叆鎻愮ず鍏у濉�',
+    context: {
+      item: {
+        title: '涓婁笅鏂�',
+        desc: '鎻掑叆涓婁笅鏂囨ā鏉�',
+      },
+      modal: {
+        title: '鏈� {{num}} 鍊嬬煡璀樺韩鍦ㄤ笂涓嬫枃涓�',
+        add: '鏂板涓婁笅鏂�',
+        footer: '鎮ㄥ彲浠ュ湪涓嬮潰鐨勨�滀笂涓嬫枃鈥濋儴鍒嗕腑绠$悊涓婁笅鏂囥��',
+      },
+    },
+    history: {
+      item: {
+        title: '鏈冭┍姝峰彶',
+        desc: '鎻掑叆姝峰彶瑷婃伅妯℃澘',
+      },
+      modal: {
+        title: '绀轰緥',
+        user: '浣犲ソ',
+        assistant: '浣犲ソ锛佷粖澶╂垜鑳界偤鎮ㄦ彁渚涗粈楹煎公鍔╋紵',
+        edit: '绶ㄨ集灏嶈┍瑙掕壊鍚嶇ū',
+      },
+    },
+    variable: {
+      item: {
+        title: '璁婃暩 & 澶栭儴宸ュ叿',
+        desc: '鎻掑叆璁婃暩鍜屽閮ㄥ伐鍏�',
+      },
+      outputToolDisabledItem: {
+        title: '璁婃暩',
+        desc: '鎻掑叆璁婃暩',
+      },
+      modal: {
+        add: '鏂板鏂拌畩鏁�',
+        addTool: '鏂板宸ュ叿',
+      },
+    },
+    query: {
+      item: {
+        title: '鏌ヨ鍏у',
+        desc: '鎻掑叆浣跨敤鑰呮煡瑭㈡ā鏉�',
+      },
+    },
+    existed: 'Prompt 涓凡瀛樺湪',
+  },
+  imageUploader: {
+    uploadFromComputer: '寰炴湰鍦颁笂鍌�',
+    uploadFromComputerReadError: '鍦栫墖璁�鍙栧け鏁楋紝璜嬮噸鏂伴伕鎿囥��',
+    uploadFromComputerUploadError: '鍦栫墖涓婂偝澶辨晽锛岃珛閲嶆柊涓婂偝銆�',
+    uploadFromComputerLimit: '涓婂偝鍦栫墖涓嶈兘瓒呴亷 {{size}} MB',
+    pasteImageLink: '璨间笂鍦栫墖閫g祼',
+    pasteImageLinkInputPlaceholder: '灏囧奖璞¢�g祼璨间笂鍒版铏�',
+    pasteImageLinkInvalid: '鍦栫墖閫g祼鐒℃晥',
+    imageUpload: '鍦栫墖涓婂偝',
+  },
+  tag: {
+    placeholder: '鍏ㄩ儴妯欑堡',
+    addNew: '寤虹珛鏂版绫�',
+    noTag: '娌掓湁妯欑堡',
+    noTagYet: '閭勬矑鏈夋绫�',
+    addTag: '鏂板妯欑堡',
+    editTag: '淇敼妯欑堡',
+    manageTags: '绠$悊妯欑堡',
+    selectorPlaceholder: '鎼滃皨鎴栬�呭缓绔�',
+    create: '寤虹珛',
+    delete: '鍒櫎妯欑堡',
+    deleteTip: '妯欑堡姝e湪浣跨敤涓紝鏄惁鍒櫎锛�',
+    created: '妯欑堡寤虹珛鎴愬姛',
+    failed: '妯欑堡寤虹珛澶辨晽',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 鐐哄繀濉爡',
+    urlError: 'URL鎳変互 http:// 鎴� https:// 闁嬮牠',
+  },
+  fileUploader: {
+    pasteFileLink: '绮樿布鏂囦欢閫g祼',
+    pasteFileLinkInputPlaceholder: '杓稿叆缍插潃...',
+    uploadFromComputerReadError: '妾旀璁�鍙栧け鏁楋紝璜嬮噸瑭︺��',
+    uploadFromComputerUploadError: '妾旀涓婂偝澶辨晽锛岃珛閲嶆柊涓婂偝銆�',
+    pasteFileLinkInvalid: '鐒℃晥鐨勬枃浠堕�g祼',
+    uploadFromComputer: '鏈湴涓婂偝',
+    fileExtensionNotSupport: '涓嶆敮鎻存獢鎿村睍鍚�',
+    uploadFromComputerLimit: '涓婂偝鏂囦欢涓嶈兘瓒呴亷 {{size}}',
+  },
+  license: {
+    expiring: '灏囧湪1澶╁収閬庢湡',
+    expiring_plural: '灏囧湪 {{count}} 澶╁悗閬庢湡',
+  },
+  pagination: {
+    perPage: '姣忛爜闋呯洰鏁�',
+  },
+  theme: {
+    light: '鍏�',
+    auto: '绯荤当',
+    dark: '榛戞殫',
+    theme: '涓婚',
+  },
+  compliance: {
+    sandboxUpgradeTooltip: '鍍呭彲鐢ㄦ柤灏堟キ鎴栧湗闅婅▓鍔冦��',
+    soc2Type1: 'SOC 2 椤炲瀷 I 鍫卞憡',
+    professionalUpgradeTooltip: '鍍呭彲鐢ㄦ柤鍦橀殜瑷堝妰鎴栨洿楂樼増鏈��',
+    gdpr: 'GDPR DPA',
+    soc2Type2: 'SOC 2 椤炲瀷 II 鍫卞憡',
+    iso27001: 'ISO 27001:2022 瑾嶈瓑',
+  },
+  imageInput: {
+    supportedFormats: '鏀彺PNG銆丣PG銆丣PEG銆乄EBP鍜孏IF',
+    browse: '鐎忚',
+    dropImageHere: '灏囨偍鐨勫湒鐗囨斁鍦ㄩ�欒!锛屾垨',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hant/custom.ts b/i18n/zh-Hant/custom.ts
new file mode 100644
index 0000000..bda5665
--- /dev/null
+++ b/i18n/zh-Hant/custom.ts
@@ -0,0 +1,32 @@
+const translation = {
+  custom: '瀹氳=',
+  upgradeTip: {
+    prefix: '鍗囩礆鎮ㄧ殑瑷堝妰浠�',
+    suffix: '瀹氳=鎮ㄧ殑鍝佺墝銆�',
+    des: '鍗囩礆鎮ㄧ殑瑷堝妰浠ヨ嚜瑷傛偍鐨勫搧鐗�',
+    title: '鍗囩礆鎮ㄧ殑瑷堝妰',
+  },
+  webapp: {
+    title: '瀹氳= WebApp 鍝佺墝',
+    removeBrand: '绉婚櫎 Powered by Dify',
+    changeLogo: '鏇存敼 Powered by Brand 鍦栫墖',
+    changeLogoTip: 'SVG 鎴� PNG 鏍煎紡锛屾渶灏忓昂瀵哥偤 40x40px',
+  },
+  app: {
+    title: '瀹氳=鎳夌敤鍝佺墝',
+    changeLogoTip: 'SVG 鎴� PNG 鏍煎紡锛屾渶灏忓昂瀵哥偤 80x80px',
+  },
+  upload: '涓婂偝',
+  uploading: '涓婂偝涓�',
+  uploadedFail: '鍦栫墖涓婂偝澶辨晽锛岃珛閲嶆柊涓婂偝銆�',
+  change: '鏇存敼',
+  apply: '鎳夌敤',
+  restore: '鎭㈠京闋愯ō',
+  customize: {
+    contactUs: '鑱怠鎴戝��',
+    prefix: '濡傞渶鍦� Dify 鍏ц嚜瀹氱京鍝佺墝鍦栫ず锛岃珛',
+    suffix: '鍗囩礆鑷充紒妤増銆�',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hant/dataset-creation.ts b/i18n/zh-Hant/dataset-creation.ts
new file mode 100644
index 0000000..ca2c410
--- /dev/null
+++ b/i18n/zh-Hant/dataset-creation.ts
@@ -0,0 +1,218 @@
+const translation = {
+  steps: {
+    header: {
+      creation: '寤虹珛鐭ヨ瓨搴�',
+      update: '涓婂偝妾旀',
+      fallbackRoute: '鐭ヨ瓨',
+    },
+    one: '閬告搰璩囨枡渚嗘簮',
+    two: '鏂囧瓧鍒嗘鑸囨竻娲�',
+    three: '铏曠悊涓﹀畬鎴�',
+  },
+  error: {
+    unavailable: '瑭茬煡璀樺韩涓嶅彲鐢�',
+  },
+  stepOne: {
+    filePreview: '妾旀闋愯',
+    pagePreview: '闋侀潰闋愯',
+    dataSourceType: {
+      file: '鍖叆宸叉湁鏂囧瓧',
+      notion: '鍚屾鑷� Notion 鍏у',
+      web: '鍚屾鑷� Web 绔欓粸',
+    },
+    uploader: {
+      title: '涓婂偝鏂囧瓧妾旀',
+      button: '鎷栨嫿妾旀鎴栨獢妗堝ぞ鑷虫锛屾垨鑰�',
+      browse: '閬告搰妾旀',
+      tip: '宸叉敮鎻� {{supportTypes}}锛屾瘡鍊嬫獢妗堜笉瓒呴亷 {{size}}MB銆�',
+      validation: {
+        typeError: '妾旀鍨嬪垾涓嶆敮鎻�',
+        size: '妾旀澶ぇ浜嗭紝涓嶈兘瓒呴亷 {{size}}MB',
+        count: '鏆笉鏀彺澶氬�嬫獢妗�',
+        filesNumber: '鎵规涓婂偝闄愬埗 {{filesNumber}}銆�',
+      },
+      cancel: '鍙栨秷',
+      change: '鏇存敼妾旀',
+      failed: '涓婂偝澶辨晽',
+    },
+    notionSyncTitle: 'Notion 鏈公绲�',
+    notionSyncTip: '鍚屾 Notion 鍏у鍓嶏紝闋堝厛绻祼 Notion 绌洪枔',
+    connect: '鍘荤公绲�',
+    cancel: '鍙栨秷',
+    button: '涓嬩竴姝�',
+    emptyDatasetCreation: '寤虹珛涓�鍊嬬┖鐭ヨ瓨搴�',
+    modal: {
+      title: '寤虹珛绌虹煡璀樺韩',
+      tip: '绌虹煡璀樺韩涓倓娌掓湁鏂囦欢锛屼綘鍙互鍦ㄤ粖寰屼换浣曟檪鍊欎笂鍌虫枃浠惰嚦瑭茬煡璀樺韩銆�',
+      input: '鐭ヨ瓨搴悕绋�',
+      placeholder: '璜嬭几鍏ョ煡璀樺韩鍚嶇ū',
+      nameNotEmpty: '鍚嶇ū涓嶈兘鐐虹┖',
+      nameLengthInvalid: '鍚嶇ū闀峰害涓嶈兘瓒呴亷 40 鍊嬪瓧鍏�',
+      cancelButton: '鍙栨秷',
+      confirmButton: '寤虹珛',
+      failed: '寤虹珛澶辨晽',
+    },
+    website: {
+      maxDepth: '鏈�澶ф繁搴�',
+      selectAll: '鍏ㄩ伕',
+      exceptionErrorTitle: '閬嬭 Firecrawl 浣滄キ鏅傜櫦鐢熺暟甯革細',
+      run: '璺�',
+      extractOnlyMainContent: '鍍呮彁鍙栦富瑕佸収瀹癸紙鐒¢爜鐪夈�佸皫鑸�侀爜鑵崇瓑锛�',
+      fireCrawlNotConfiguredDescription: '浣跨敤 API 閲戦懓閰嶇疆 Firecrawl 浠ヤ娇鐢ㄥ畠銆�',
+      limit: '闄愬埗',
+      crawlSubPage: '鎶撳彇瀛愰爜闈�',
+      firecrawlDocLink: 'https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      preview: '闋愯',
+      configure: '閰嶇疆',
+      excludePaths: '鎺掗櫎璺緫',
+      options: '閬搁爡',
+      firecrawlDoc: 'Firecrawl 鏂囦欢',
+      totalPageScraped: '鎶撳彇鐨勭附闋佹暩锛�',
+      firecrawlTitle: '浣跨敤 馃敟Firecrawl 鎻愬彇 Web 鍏у',
+      includeOnlyPaths: '鍍呭寘鍚矾寰�',
+      resetAll: '鍏ㄩ儴閲嶇疆',
+      scrapTimeInfo: '鍦� {{time}} 绉掑収绺藉叡鎶撳彇浜� {{total}} 鍊嬮爜闈�',
+      unknownError: '鏈煡閷',
+      fireCrawlNotConfigured: '鏈厤缃� Firecrawl',
+      maxDepthTooltip: '鐩稿皪鏂艰几鍏ョ殑 URL 鐨勬渶澶х埇缍叉繁搴︺�傛繁搴� 0 鍙槸鎶撳彇杓稿叆鐨� url 鐨勯爜闈紝娣卞害 1 鎶撳彇 url 浠ュ強 enteredURL + 1 / 涔嬪緦鐨勬墍鏈夊収瀹癸紝渚濇椤炴帹銆�',
+      jinaReaderNotConfigured: '鏈厤缃� Jina Reader',
+      jinaReaderNotConfiguredDescription: '閫氶亷杓稿叆鎮ㄧ殑鍏嶈不 API 閲戦懓閫茶瑷晱渚嗚ō缃� Jina Reader銆�',
+      chooseProvider: '閬告搰渚涙噳鍟�',
+      jinaReaderDoc: '浜嗚В鏈夐棞 Jina Reader 鐨勬洿澶氳硣瑷�',
+      jinaReaderTitle: '灏囨暣鍊嬬恫绔欒綁鎻涚偤 Markdown',
+      useSitemap: '浣跨敤缍茬珯鍦板湒',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      useSitemapTooltip: '鎸夌収缍茬珯鍦板湒灏嶇恫绔欓�茶鐖恫銆傚惁鍓囷紝Jina Reader 灏囨牴鎿氶爜闈㈢浉闂滄�у弽瑕嗛亱绠楁姄鍙栵紝寰炶�岀敓鎴愭洿灏戜絾鍝佽唱鏇撮珮鐨勯爜闈€��',
+      watercrawlDoc: 'Watercrawl 鏂囨獢',
+      configureFirecrawl: '閰嶇疆 Firecrawl',
+      configureWatercrawl: '閰嶇疆姘寸埇琛�',
+      watercrawlTitle: '浣跨敤 Watercrawl 鎻愬彇缍查爜鍏у',
+      watercrawlDocLink: 'https://docs.dify.ai/zh-TW/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website',
+      waterCrawlNotConfiguredDescription: '閰嶇疆 Watercrawl 涓︿娇鐢� API 閲戦懓渚嗕娇鐢ㄥ畠銆�',
+      configureJinaReader: '閰嶇疆 Jina Reader',
+      waterCrawlNotConfigured: 'Watercrawl 灏氭湭閰嶇疆',
+    },
+  },
+  stepTwo: {
+    segmentation: '鍒嗘瑷畾',
+    auto: '鑷嫊鍒嗘鑸囨竻娲�',
+    autoDescription: '鑷嫊瑷畾鍒嗘瑕忓墖鑸囬爯铏曠悊瑕忓墖锛屽鏋滀笉鐬В閫欎簺寮曟暩寤鸿閬告搰姝ら爡',
+    custom: '鑷畾缇�',
+    customDescription: '鑷畾缇╁垎娈佃鍓囥�佸垎娈甸暦搴︿互鍙婇爯铏曠悊瑕忓墖绛夊紩鏁�',
+    separator: '鍒嗘璀樺垾绗﹁櫉',
+    separatorPlaceholder: '渚嬪鎻涜绗︼紙\n锛夋垨鐗瑰畾鐨勫垎闅旂锛堝 "***"锛�',
+    maxLength: '鍒嗘鏈�澶ч暦搴�',
+    overlap: '鍒嗘閲嶇枈闀峰害',
+    overlapTip: '瑷畾鍒嗘涔嬮枔鐨勯噸鐤婇暦搴﹀彲浠ヤ繚鐣欏垎娈典箣闁撶殑瑾炵京闂滀總锛屾彁鍗囧彫鍥炴晥鏋溿�傚缓璀拌ō瀹氱偤鏈�澶у垎娈甸暦搴︾殑10%-25%',
+    overlapCheck: '鍒嗘閲嶇枈闀峰害涓嶈兘澶ф柤鍒嗘鏈�澶ч暦搴�',
+    rules: '鏂囧瓧闋愯檿鐞嗚鍓�',
+    removeExtraSpaces: '鏇挎彌鎺夐�g簩鐨勭┖鏍笺�佹彌琛岀鍜岃=琛ㄧ',
+    removeUrlEmails: '鍒櫎鎵�鏈� URL 鍜岄浕瀛愰兊浠跺湴鍧�',
+    removeStopwords: '鍘婚櫎鍋滅敤瑭烇紝渚嬪 鈥渁鈥濓紝鈥渁n鈥濓紝鈥渢he鈥� 绛�',
+    preview: '闋愯',
+    reset: '閲嶇疆',
+    indexMode: '绱㈠紩鏂瑰紡',
+    qualified: '楂樿唱閲�',
+    recommend: '鎺ㄨ枽',
+    qualifiedTip: '鍛煎彨绯荤当闋愯ō鐨勫祵鍏ヤ粙闈㈤�茶铏曠悊锛屼互鍦ㄤ娇鐢ㄨ�呮煡瑭㈡檪鎻愪緵鏇撮珮鐨勬簴纰哄害',
+    warning: '璜嬪厛瀹屾垚妯″瀷渚涙噳鍟嗙殑 API KEY 瑷畾銆�.',
+    click: '鍓嶅線瑷畾',
+    economical: '缍撴繜',
+    economicalTip: '浣跨敤闆㈢窔鐨勫悜閲忓紩鎿庛�侀棞閸佃绱㈠紩绛夋柟寮忥紝闄嶄綆浜嗘簴纰哄害浣嗙劇闇�鑺辫不 Token',
+    QATitle: '鎺$敤 Q&A 鍒嗘妯″紡',
+    QATip: '闁嬪暉寰屽皣鏈冩秷鑰楅澶栫殑 token',
+    QALanguage: '鍒嗘浣跨敤',
+    estimateCost: '鍩疯宓屽叆闋愪及娑堣��',
+    estimateSegment: '闋愪及鍒嗘鏁�',
+    segmentCount: '娈�',
+    calculating: '瑷堢畻涓�...',
+    fileSource: '闋愯檿鐞嗘枃浠�',
+    notionSource: '闋愯檿鐞嗛爜闈�',
+    other: '鍜屽叾浠� ',
+    fileUnit: ' 鍊嬫獢妗�',
+    notionUnit: ' 鍊嬮爜闈�',
+    previousStep: '涓婁竴姝�',
+    nextStep: '鍎插瓨涓﹁檿鐞�',
+    save: '鍎插瓨涓﹁檿鐞�',
+    cancel: '鍙栨秷',
+    sideTipTitle: '鐐轰粈楹艰鍒嗘鍜岄爯铏曠悊锛�',
+    sideTipP1: '鍦ㄨ檿鐞嗘枃瀛楄硣鏂欐檪锛屽垎娈靛拰娓呮礂鏄叐鍊嬮噸瑕佺殑闋愯檿鐞嗘椹熴��',
+    sideTipP2: '鍒嗘鐨勭洰鐨勬槸灏囬暦鏂囧瓧鎷嗗垎鎴愯純灏忕殑娈佃惤锛屼互渚挎ā鍨嬫洿鏈夋晥鍦拌檿鐞嗗拰鐞嗚В銆傞�欐湁鍔╂柤鎻愰珮妯″瀷鐢熸垚鐨勭祼鏋滅殑璩噺鍜岀浉闂滄�с��',
+    sideTipP3: '娓呮礂鍓囨槸灏嶆枃瀛楅�茶闋愯檿鐞嗭紝鍒櫎涓嶅繀瑕佺殑瀛楀厓銆佺铏熸垨鏍煎紡锛屼娇鐭ヨ瓨搴洿鍔犱咕娣ㄣ�佹暣娼旓紝渚挎柤妯″瀷瑙f瀽銆�',
+    sideTipP4: '閫忛亷灏嶇煡璀樺韩閫茶閬╃暥鐨勫垎娈靛拰娓呮礂锛屽彲浠ユ彁楂樻ā鍨嬪湪瀵﹂殯鎳夌敤涓殑琛ㄧ従锛屽緸鑰岀偤浣跨敤鑰呮彁渚涙洿婧栫⒑銆佹洿鏈夊児鍊肩殑绲愭灉銆�',
+    previewTitle: '鍒嗘闋愯',
+    previewTitleButton: '闋愯',
+    previewButton: '鍒囨彌鑷� Q&A 褰㈠紡',
+    previewSwitchTipStart: '鐣跺墠鍒嗘闋愯鏄枃瀛楁ā寮忥紝鍒囨彌鍒� Q&A 妯″紡灏囨渻',
+    previewSwitchTipEnd: '娑堣�楅澶栫殑 token',
+    characters: '瀛楀厓',
+    indexSettingTip: '瑕佹洿鏀圭储寮曟柟娉曪紝璜嬭綁鍒�',
+    retrievalSettingTip: '瑕佹洿鏀规绱㈡柟娉曪紝璜嬭綁鍒�',
+    datasetSettingLink: '鐭ヨ瓨搴ō瀹氥��',
+    websiteSource: '闋愯檿鐞嗙恫绔�',
+    webpageUnit: '闋侀潰',
+    separatorTip: '鍒嗛殧绗︽槸鐢ㄦ柤鍒嗛殧鏂囧瓧鐨勫瓧鍏冦�俓\n\\n 鍜� \\n 鏄垎闅旀钀藉拰琛岀殑甯哥敤鍒嗛殧绗︺�傝垏閫楄櫉 锛圽\n\\n锛孿\n锛� 绲勫悎浣跨敤鏅傦紝鐣惰秴閬庢渶澶у崁濉婇暦搴︽檪锛屾钀藉皣鎸夎鍒嗘銆傛偍涔熷彲浠ヤ娇鐢ㄨ嚜瀹氱京鐨勭壒娈婂垎闅旂锛堜緥濡� ***锛夈��',
+    maxLengthCheck: '濉婃渶澶ч暦搴︽噳灏忔柤 {{limit}}',
+    general: '甯歌',
+    previewChunkCount: '{{count}}浼拌▓濉婃暩',
+    useQALanguage: '浣跨敤Q&A鏍煎紡鐨勫',
+    qaSwitchHighQualityTipContent: '鐩墠锛屽彧鏈夐珮鍝佽唱绱㈠紩鏂规硶鏀彺Q&A鏍煎紡鍒嗗銆傛槸鍚﹁鍒囨彌鍒伴珮鍝佽唱妯″紡锛�',
+    previewChunk: '闋愯璩囨枡濉婏紙Preview Chunk锛�',
+    fullDocTip: '鏁村�嬫枃浠剁敤浣滅埗濉婁甫鐩存帴妾㈢储銆傝珛娉ㄦ剰锛屽嚭鏂兼�ц兘鍘熷洜锛岃秴閬�10000鍊嬩护鐗岀殑鏂囨湰灏囪鑷嫊鎴柗銆�',
+    parentChunkForContext: '鐖舵瘝鐨勮儗鏅�',
+    previewChunkTip: '榛炴搳宸﹀伌鐨� 銆嶱review Chunk銆� 鎸夐垥杓夊叆闋愯',
+    parentChild: '鐖跺瓙',
+    notAvailableForQA: '涓嶉仼鐢ㄦ柤 Q&A 绱㈠紩',
+    parentChildChunkDelimiterTip: '鍒嗛殧绗︽槸鐢ㄦ柤鍒嗛殧鏂囧瓧鐨勫瓧鍏冦�傚缓璀颁娇鐢� \\n 灏囩埗濉婃媶鍒嗙偤灏忕殑瀛愬銆傛偍閭勫彲浠ヤ娇鐢ㄨ嚜宸卞畾缇╃殑鐗规畩鍒嗛殧绗︺��',
+    parentChildDelimiterTip: '鍒嗛殧绗︽槸鐢ㄦ柤鍒嗛殧鏂囧瓧鐨勫瓧鍏冦�傚缓璀板皣鍘熷鏂囨獢鎷嗗垎鐐哄鍊嬪ぇ鍨嬬埗濉娿�傛偍閭勫彲浠ヤ娇鐢ㄨ嚜宸卞畾缇╃殑鐗规畩鍒嗛殧绗︺��',
+    generalTip: '甯歌鏂囨湰鍒嗗妯″紡锛屾绱㈠拰瑾跨敤鐨勫鏄浉鍚岀殑銆�',
+    highQualityTip: '鍦� High Quality 妯″紡涓嬪畬鎴愬祵鍏ュ緦锛屽皣鐒℃硶鎭㈠京鍒� Economical 锛堢稉婵燂級 妯″紡銆�',
+    childChunkForRetrieval: '鐢ㄦ柤妾㈢储鐨� Child-chunk',
+    paragraphTip: '姝ゆā寮忔牴鎿氬垎闅旂鍜屾渶澶у崁濉婇暦搴﹀皣鏂囨湰鎷嗗垎鐐烘钀斤紝浣跨敤鎷嗗垎鏂囨湰浣滅偤鐖跺崁濉婇�茶妾㈢储銆�',
+    paragraph: '娈�',
+    qaSwitchHighQualityTipTitle: 'Q&A 鏍煎紡闇�瑕侀珮鍝佽唱鐨勭储寮曟柟娉�',
+    notAvailableForParentChild: '涓嶉仼鐢ㄦ柤鐖跺瓙绱㈠紩',
+    fullDoc: '瀹屾暣鏂囦欢',
+    parentChildTip: '鐣朵娇鐢� parent-child 妯″紡鏅傦紝child-chunk 鐢ㄦ柤妾㈢储锛宲arent-chunk 鐢ㄦ柤浣滅偤涓婁笅鏂囪鐢� call銆�',
+    switch: '闁嬮棞',
+  },
+  stepThree: {
+    creationTitle: '馃帀 鐭ヨ瓨搴凡寤虹珛',
+    creationContent: '鎴戝�戣嚜鍕曠偤瑭茬煡璀樺韩璧蜂簡鍊嬪悕绋憋紝鎮ㄤ篃鍙互闅ㄦ檪淇敼',
+    label: '鐭ヨ瓨搴悕绋�',
+    additionTitle: '馃帀 鏂囦欢宸蹭笂鍌�',
+    additionP1: '鏂囦欢宸蹭笂鍌宠嚦鐭ヨ瓨搴細',
+    additionP2: '锛屼綘鍙互鍦ㄧ煡璀樺韩鐨勬枃浠跺垪琛ㄤ腑鎵惧埌瀹冦��',
+    stop: '鍋滄铏曠悊',
+    resume: '鎭㈠京铏曠悊',
+    navTo: '鍓嶅線鏂囦欢',
+    sideTipTitle: '鎺ヤ笅渚嗗仛浠�楹�',
+    sideTipContent: '鐣舵枃浠跺畬鎴愮储寮曡檿鐞嗗緦锛岀煡璀樺韩鍗冲彲鏁村悎鑷虫噳鐢ㄥ収浣滅偤涓婁笅鏂囦娇鐢紝浣犲彲浠ュ湪鎻愮ず瑭炵法鎺掗爜鎵惧埌涓婁笅鏂囪ō瀹氥�備綘涔熷彲浠ュ缓绔嬫垚鍙崹绔嬩娇鐢ㄧ殑 ChatGPT 绱㈠紩澶栨帥閲嬪嚭銆�',
+    modelTitle: '纰鸿獚鍋滄绱㈠紩閬庣▼鍡庯紵',
+    modelContent: '濡傛灉鎮ㄩ渶瑕佺◢寰屾仮寰╄檿鐞嗭紝鍓囧緸鍋滄铏曠辜绾屻��',
+    modelButtonConfirm: '纰鸿獚鍋滄',
+    modelButtonCancel: '鍙栨秷',
+  },
+  firecrawl: {
+    configFirecrawl: '閰嶇疆 馃敟Firecrawl',
+    apiKeyPlaceholder: '渚嗚嚜 firecrawl.dev 鐨� API 閲戦懓',
+    getApiKeyLinkText: '寰� firecrawl.dev 鐛插彇 API 閲戦懓',
+  },
+  jinaReader: {
+    configJinaReader: '閰嶇疆 Jina Reader',
+    getApiKeyLinkText: '鍦� jina.ai 鐛插彇鎮ㄧ殑鍏嶈不 API 閲戦懓',
+    apiKeyPlaceholder: '渚嗚嚜 jina.ai 鐨� API 閲戦懓',
+  },
+  otherDataSource: {
+    learnMore: '鐬В鏇村璩囪▕',
+    description: '鐩墠锛孌ify 鐨勭煡璀樺韩鍙湁鏈夐檺鐨勬暩鎿氭簮銆傚悜 Dify 鐭ヨ瓨搴并鐛绘暩鎿氭簮鏄鏄庢墍鏈変娇鐢ㄨ�呭寮峰钩鍙伴潏娲绘�у拰寮峰ぇ鍔熻兘鐨勭禃浣虫柟寮忋�傛垜鍊戠殑璨㈢嵒鎸囧崡浣垮叆闁�璁婂緱瀹规槗銆傝珛榛炴搳涓嬮潰鐨勯�g祼鐬В鏇村璩囪▕銆�',
+    title: '閫f帴鍒板叾浠栨暩鎿氭簮锛�',
+  },
+  watercrawl: {
+    apiKeyPlaceholder: '渚嗚嚜 watercrawl.dev 鐨� API 閲戦懓',
+    configWatercrawl: '閰嶇疆姘寸埇琛�',
+    getApiKeyLinkText: '寰� watercrawl.dev 鐛插彇鎮ㄧ殑 API 閲戦懓',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hant/dataset-documents.ts b/i18n/zh-Hant/dataset-documents.ts
new file mode 100644
index 0000000..5ad2c8f
--- /dev/null
+++ b/i18n/zh-Hant/dataset-documents.ts
@@ -0,0 +1,394 @@
+const translation = {
+  list: {
+    title: '鏂囦欢',
+    desc: '鐭ヨ瓨搴殑鎵�鏈夋獢妗堥兘鍦ㄩ�欒!椤ず锛屾暣鍊嬬煡璀樺韩閮藉彲浠ラ�g祼鍒� Dify 寮曠敤鎴栭�忛亷 Chat 澶栨帥閫茶绱㈠紩銆�',
+    addFile: '鏂板妾旀',
+    addPages: '鏂板闋侀潰',
+    table: {
+      header: {
+        fileName: '妾斿悕',
+        words: '瀛楀厓鏁�',
+        hitCount: '鍙洖娆℃暩',
+        uploadTime: '涓婂偝鏅傞枔',
+        status: '鐙�鎱�',
+        action: '鎿嶄綔',
+        chunkingMode: '鍒嗗妯″紡',
+      },
+      name: '鍚嶅瓧',
+      rename: '閲嶆柊鍛藉悕',
+    },
+    action: {
+      uploadFile: '涓婂偝鏂版獢妗�',
+      settings: '鍒嗘瑷畾',
+      addButton: '鏂板鍒嗘',
+      add: '鏂板鏂板垎娈�',
+      batchAdd: '鎵规鏂板',
+      archive: '姝告獢',
+      unarchive: '鎾ら姺姝告獢',
+      delete: '鍒櫎',
+      enableWarning: '姝告獢鐨勬獢妗堢劇娉曞暉鐢�',
+      sync: '鍚屾',
+    },
+    index: {
+      enable: '鍟熺敤涓�',
+      disable: '绂佺敤涓�',
+      all: '鍏ㄩ儴',
+      enableTip: '瑭叉獢妗堝彲浠ヨ绱㈠紩',
+      disableTip: '瑭叉獢妗堢劇娉曡绱㈠紩',
+    },
+    status: {
+      queuing: '鎺掗殜涓�',
+      indexing: '绱㈠紩涓�',
+      paused: '宸叉毇鍋�',
+      error: '閷',
+      available: '鍙敤',
+      enabled: '宸插暉鐢�',
+      disabled: '宸茬鐢�',
+      archived: '宸叉妾�',
+    },
+    empty: {
+      title: '閭勬矑鏈夋枃浠�',
+      upload: {
+        tip: '鎮ㄥ彲浠ヤ笂鍌虫獢妗堬紝寰炵恫绔欏悓姝ワ紝鎴栬�呭緸缍茶矾鎳夌敤绋嬪紡锛堝姒傚康銆丟itHub 绛夛級鍚屾銆�',
+      },
+      sync: {
+        tip: 'Dify 鏈冨畾鏈熷緸鎮ㄧ殑 Notion 涓笅杓夋獢妗堜甫瀹屾垚铏曠悊銆�',
+      },
+    },
+    delete: {
+      title: '纰哄畾鍒櫎鍡庯紵',
+      content: '濡傛灉鎮ㄩ渶瑕佺◢寰屾仮寰╄檿鐞嗭紝鎮ㄥ皣寰炴偍闆㈤枊鐨勫湴鏂圭辜绾�',
+    },
+    batchModal: {
+      title: '鎵规鏂板鍒嗘',
+      csvUploadTitle: '灏囨偍鐨� CSV 妾旀鎷栨斁鍒版铏曪紝鎴�',
+      browse: '閬告搰妾旀',
+      tip: 'CSV 妾旀蹇呴爤绗﹀悎浠ヤ笅绲愭锛�',
+      question: '鍟忛',
+      answer: '鍥炵瓟',
+      contentTitle: '鍒嗘鍏у',
+      content: '鍏у',
+      template: '涓嬭級妯℃澘',
+      cancel: '鍙栨秷',
+      run: '鍖叆',
+      runError: '鎵规鍖叆澶辨晽',
+      processing: '鎵规铏曠悊涓�',
+      completed: '鍖叆瀹屾垚',
+      error: '鍖叆鍑洪尟',
+      ok: '纰哄畾',
+    },
+    addUrl: '娣诲姞 URL',
+    learnMore: '鐬В鏇村璩囪▕',
+  },
+  metadata: {
+    title: '鍏冭硣鏂�',
+    desc: '妯欒鏂囦欢鐨勫厓璩囨枡鍏佽ū AI 鍙婃檪瑷晱瀹冨�戜降鐐轰娇鐢ㄨ�呭叕闁嬪弮鑰冧締婧愩��',
+    dateTimeFormat: 'YYYY-MM-DD HH:mm',
+    docTypeSelectTitle: '璜嬮伕鎿囦竴绋枃浠跺瀷鍒�',
+    docTypeChangeTitle: '鏇存彌鏂囦欢鍨嬪垾',
+    docTypeSelectWarning: '濡傛灉鏇存敼鏂囦欢鍨嬪垾锛屽皣涓嶅啀淇濈暀鐝惧湪濉厖鐨勫厓璩囨枡',
+    firstMetaAction: '闁嬪',
+    placeholder: {
+      add: '杓稿叆',
+      select: '閬告搰',
+    },
+    source: {
+      upload_file: '妾旀涓婂偝',
+      notion: '寰� Notion 鍚屾鐨勬枃浠�',
+      github: '寰� Github 鍚屾鐨勭▼寮忕⒓',
+    },
+    type: {
+      book: '鏇哥睄',
+      webPage: '缍查爜',
+      paper: '璜栨枃',
+      socialMediaPost: '绀句氦濯掗珨甯栧瓙',
+      personalDocument: '鍊嬩汉鏂囦欢',
+      businessDocument: '鍟嗗嫏鏂囦欢',
+      IMChat: 'IM 鑱婂ぉ瑷橀寗',
+      wikipediaEntry: '缍熀鐧剧姊濈洰',
+      notion: '寰� Notion 鍚屾鐨勬枃浠�',
+      github: '寰� Github 鍚屾鐨勭▼寮忕⒓',
+      technicalParameters: '鎶�琛撳紩鏁�',
+    },
+    field: {
+      processRule: {
+        processDoc: '闋愯檿鐞嗘枃浠�',
+        segmentRule: '鍒嗘瑕忓墖',
+        segmentLength: '鍒嗘闀峰害',
+        processClean: '鏂囧瓧闋愯檿鐞嗚垏娓呮礂',
+      },
+      book: {
+        title: '妯欓',
+        language: '瑾炶█',
+        author: '浣滆��',
+        publisher: '鍑虹増鍟�',
+        publicationDate: '鍑虹増鏃ユ湡',
+        ISBN: 'ISBN',
+        category: '椤炲垾',
+      },
+      webPage: {
+        title: '妯欓',
+        url: '缍插潃',
+        language: '瑾炶█',
+        authorPublisher: '浣滆��/鍑虹増鍟�',
+        publishDate: '閲嬪嚭鏃ユ湡',
+        topicKeywords: '涓婚/闂滈嵉瑭�',
+        description: '鎻忚堪',
+      },
+      paper: {
+        title: '妯欓',
+        language: '瑾炶█',
+        author: '浣滆��',
+        publishDate: '閲嬪嚭鏃ユ湡',
+        journalConferenceName: '鏈熷垔/鏈冭鍚嶇ū',
+        volumeIssuePage: '鍗�/鏈�/闋佺⒓',
+        DOI: 'DOI',
+        topicsKeywords: '涓婚/闂滈嵉瑭�',
+        abstract: '鎽樿',
+      },
+      socialMediaPost: {
+        platform: '骞宠嚭',
+        authorUsername: '浣滆��/浣跨敤鑰呭悕绋�',
+        publishDate: '閲嬪嚭鏃ユ湡',
+        postURL: '甯栧瓙缍插潃',
+        topicsTags: '涓婚/妯欑堡',
+      },
+      personalDocument: {
+        title: '妯欓',
+        author: '浣滆��',
+        creationDate: '寤虹珛鏃ユ湡',
+        lastModifiedDate: '鏈�寰屼慨鏀规棩鏈�',
+        documentType: '鏂囦欢鍨嬪垾',
+        tagsCategory: '妯欑堡/椤炲垾',
+      },
+      businessDocument: {
+        title: '妯欓',
+        author: '浣滆��',
+        creationDate: '寤虹珛鏃ユ湡',
+        lastModifiedDate: '鏈�寰屼慨鏀规棩鏈�',
+        documentType: '鏂囦欢鍨嬪垾',
+        departmentTeam: '閮ㄩ杸/鍦橀殜',
+      },
+      IMChat: {
+        chatPlatform: '鑱婂ぉ骞宠嚭',
+        chatPartiesGroupName: '鑱婂ぉ鍙冭垏鏂�/缇ょ祫鍚嶇ū',
+        participants: '鍙冭垏鑰�',
+        startDate: '闁嬪鏃ユ湡',
+        endDate: '绲愭潫鏃ユ湡',
+        topicsKeywords: '涓婚/闂滈嵉瑭�',
+        fileType: '妾旀鍨嬪垾',
+      },
+      wikipediaEntry: {
+        title: '妯欓',
+        language: '瑾炶█',
+        webpageURL: '缍查爜缍插潃',
+        editorContributor: '绶ㄨ集/璨㈢嵒鑰�',
+        lastEditDate: '鏈�寰岀法杓棩鏈�',
+        summaryIntroduction: '鎽樿/浠嬬垂',
+      },
+      notion: {
+        title: '妯欓',
+        language: '瑾炶█',
+        author: '浣滆��',
+        createdTime: '寤虹珛鏅傞枔',
+        lastModifiedTime: '鏈�寰屼慨鏀规檪闁�',
+        url: '缍插潃',
+        tag: '妯欑堡',
+        description: '鎻忚堪',
+      },
+      github: {
+        repoName: '鍊夊韩鍚�',
+        repoDesc: '鍊夊韩鎻忚堪',
+        repoOwner: '鍊夊韩鎵�鏈夎��',
+        fileName: '妾斿悕',
+        filePath: '妾旀璺緫',
+        programmingLang: '绋嬪紡瑾炶█',
+        url: '缍插潃',
+        license: '瑷卞彲璀�',
+        lastCommitTime: '鏈�寰屾彁浜ゆ檪闁�',
+        lastCommitAuthor: '鏈�寰屾彁浜よ��',
+      },
+      originInfo: {
+        originalFilename: '鍘熷妾斿悕绋�',
+        originalFileSize: '鍘熷妾旀澶у皬',
+        uploadDate: '涓婂偝鏃ユ湡',
+        lastUpdateDate: '鏈�寰屾洿鏂版棩鏈�',
+        source: '渚嗘簮',
+      },
+      technicalParameters: {
+        segmentSpecification: '鍒嗘瑕忓墖',
+        segmentLength: '娈佃惤闀峰害',
+        avgParagraphLength: '骞冲潎娈佃惤闀峰害',
+        paragraphs: '娈佃惤鏁搁噺',
+        hitCount: '鍙洖娆℃暩',
+        embeddingTime: '宓屽叆鏅傞枔',
+        embeddedSpend: '宓屽叆鑺辫不',
+      },
+    },
+    languageMap: {
+      zh: '涓枃',
+      en: '鑻辨枃',
+      es: '瑗跨彮鐗欒獮',
+      fr: '娉曡獮',
+      de: '寰疯獮',
+      ja: '鏃ヨ獮',
+      ko: '闊撹獮',
+      ru: '淇勮獮',
+      ar: '闃挎媺浼獮',
+      pt: '钁¤悇鐗欒獮',
+      it: '缇╁ぇ鍒╄獮',
+      nl: '鑽疯槶瑾�',
+      pl: '娉㈣槶瑾�',
+      sv: '鐟炲吀瑾�',
+      tr: '鍦熻�冲叾瑾�',
+      he: '甯屼集渚嗚獮',
+      hi: '鍗板湴瑾�',
+      da: '涓归亥瑾�',
+      fi: '鑺槶瑾�',
+      no: '鎸▉瑾�',
+      hu: '鍖堢墮鍒╄獮',
+      el: '甯岃嚇瑾�',
+      cs: '鎹峰厠瑾�',
+      th: '娉拌獮',
+      id: '鍗板害灏艰タ浜炶獮',
+    },
+    categoryMap: {
+      book: {
+        fiction: '灏忚',
+        biography: '鍌宠',
+        history: '姝峰彶',
+        science: '绉戝',
+        technology: '鎶�琛�',
+        education: '鏁欒偛',
+        philosophy: '鍝插',
+        religion: '瀹楁暀',
+        socialSciences: '绀炬渻绉戝',
+        art: '钘濊',
+        travel: '鏃呰',
+        health: '鍋ュ悍',
+        selfHelp: '鑷姪',
+        businessEconomics: '鍟嗘キ/缍撴繜',
+        cooking: '鐑归*',
+        childrenYoungAdults: '鍏掔/闈掑皯骞�',
+        comicsGraphicNovels: '婕暙/鍦栧舰灏忚',
+        poetry: '瑭╂瓕',
+        drama: '鎴插妵',
+        other: '鍏朵粬',
+      },
+      personalDoc: {
+        notes: '绛嗚',
+        blogDraft: '閮ㄨ惤鏍艰崏绋�',
+        diary: '鏃ヨ',
+        researchReport: '鐮旂┒鍫卞憡',
+        bookExcerpt: '鏇哥睄鎽橀寗',
+        schedule: '鏃ョ▼瀹夋帓',
+        list: '鍒楄〃',
+        projectOverview: '灏堟姒傝堪',
+        photoCollection: '鐓х墖闆�',
+        creativeWriting: '鍓垫剰瀵綔',
+        codeSnippet: '绋嬪紡纰肩墖娈�',
+        designDraft: '瑷▓鑽夌',
+        personalResume: '鍊嬩汉绨℃',
+        other: '鍏朵粬',
+      },
+      businessDoc: {
+        meetingMinutes: '鏈冭绱�瑕�',
+        researchReport: '鐮旂┒鍫卞憡',
+        proposal: '鎻愭',
+        employeeHandbook: '鍝″伐鎵嬪唺',
+        trainingMaterials: '鍩硅〒鏉愭枡',
+        requirementsDocument: '闇�姹傛枃浠�',
+        designDocument: '瑷▓鏂囦欢',
+        productSpecification: '鐢㈠搧瑕忔牸',
+        financialReport: '璨″嫏鍫卞憡',
+        marketAnalysis: '甯傚牬鍒嗘瀽',
+        projectPlan: '灏堟瑷堝妰',
+        teamStructure: '鍦橀殜绲愭',
+        policiesProcedures: '鏀跨瓥鍜屾祦绋�',
+        contractsAgreements: '鍚堝悓鍜屽崝璀�',
+        emailCorrespondence: '閮典欢寰�渚�',
+        other: '鍏朵粬',
+      },
+    },
+  },
+  embedding: {
+    processing: '宓屽叆铏曠悊涓�...',
+    paused: '宓屽叆宸插仠姝�',
+    completed: '宓屽叆宸插畬鎴�',
+    error: '宓屽叆鐧肩敓閷',
+    docName: '闋愯檿鐞嗘枃浠�',
+    mode: '鍒嗘瑕忓墖',
+    segmentLength: '鍒嗘闀峰害',
+    textCleaning: '鏂囧瓧闋愬畾缇╄垏娓呮礂',
+    segments: '娈佃惤',
+    highQuality: '楂樿唱閲忔ā寮�',
+    economy: '缍撴繜妯″紡',
+    estimate: '闋愪及娑堣��',
+    stop: '鍋滄铏曠悊',
+    resume: '鎭㈠京铏曠悊',
+    automatic: '鑷嫊',
+    custom: '鑷畾缇�',
+    previewTip: '娈佃惤闋愯灏囧湪宓屽叆瀹屾垚寰屽彲鐢�',
+    hierarchical: '鐖跺瓙',
+    parentMaxTokens: '鐖舵瘝',
+    childMaxTokens: '瀛╁瓙',
+    pause: '鏆仠',
+  },
+  segment: {
+    paragraphs: '娈佃惤',
+    keywords: '闂滈嵉瑭�',
+    addKeyWord: '鏂板闂滈嵉瑭�',
+    keywordError: '闂滈嵉瑭炴渶澶ч暦搴︾偤 20',
+    characters: '瀛楀厓',
+    hitCount: '鍙洖娆℃暩',
+    vectorHash: '鍚戦噺闆滄箠锛�',
+    questionPlaceholder: '鍦ㄩ�欒!鏂板鍟忛',
+    questionEmpty: '鍟忛涓嶈兘鐐虹┖',
+    answerPlaceholder: '鍦ㄩ�欒!鏂板绛旀',
+    answerEmpty: '绛旀涓嶈兘鐐虹┖',
+    contentPlaceholder: '鍦ㄩ�欒!鏂板鍏у',
+    contentEmpty: '鍏у涓嶈兘鐐虹┖',
+    newTextSegment: '鏂版枃瀛楀垎娈�',
+    newQaSegment: '鏂板晱绛斿垎娈�',
+    delete: '鍒櫎閫欏�嬪垎娈碉紵',
+    characters_other: '瀛楀厓',
+    addChunk: '娣诲姞鏁告摎濉�',
+    addChildChunk: '娣诲姞瀛愬',
+    addAnother: '娣诲姞鍙︿竴鍊�',
+    childChunkAdded: '娣诲姞浜�1鍊嬪瓙濉�',
+    editParentChunk: '绶ㄨ集鐖跺锛圗dit Parent Chunk锛�',
+    editChildChunk: '绶ㄨ集瀛愬',
+    chunkDetail: '鏁告摎濉婅┏绱拌硣瑷�',
+    regenerationConfirmTitle: '鏄惁瑕侀噸鏂扮敓鎴愬瓙濉婏紵',
+    regenerationConfirmMessage: '閲嶆柊鐢熸垚瀛愭暩鎿氬灏囪钃嬬暥鍓嶅瓙鏁告摎濉婏紝鍖呮嫭宸茬法杓殑鏁告摎濉婂拰鏂版坊鍔犵殑鏁告摎濉娿�傞噸鏂扮敓鎴愮劇娉曞京鍘熴��',
+    regeneratingTitle: '閲嶆柊鐢熸垚瀛愬',
+    regenerationSuccessTitle: '鍐嶇敓瀹屾垚',
+    collapseChunks: '鎽虹枈濉�',
+    expandChunks: '鎿村睍濉�',
+    chunkAdded: '娣诲姞浜� 1 鍊嬫暩鎿氬',
+    editedAt: '绶ㄨ集鏂�',
+    regeneratingMessage: '閫欏彲鑳介渶瑕佷竴浜涙檪闁擄紝璜嬬◢鍊�...',
+    editChunk: '绶ㄨ集鏁告摎濉�',
+    regenerationSuccessMessage: '鎮ㄥ彲浠ラ棞闁夋瑕栫獥銆�',
+    chunks_other: '濉�',
+    childChunks_one: '瀛愬',
+    edited: '绶ㄨ集',
+    characters_one: '瀛楀厓',
+    childChunks_other: '瀛愬',
+    newChunk: '鏂板崁濉�',
+    chunk: '濉�',
+    childChunk: '瀛愬',
+    parentChunks_one: '鐖舵暩鎿氬',
+    searchResults_one: '绲愭灉',
+    searchResults_other: '绲愭灉',
+    chunks_one: '濉�',
+    clearFilter: '娓呴櫎閬庢烤鍣�',
+    parentChunk: '鐖跺',
+    empty: '鏈壘鍒� Chunk',
+    searchResults_zero: '绲愭灉',
+    parentChunks_other: '鐖跺',
+    newChildChunk: '鏂板厭绔ュ',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hant/dataset-hit-testing.ts b/i18n/zh-Hant/dataset-hit-testing.ts
new file mode 100644
index 0000000..0dbe149
--- /dev/null
+++ b/i18n/zh-Hant/dataset-hit-testing.ts
@@ -0,0 +1,35 @@
+const translation = {
+  title: '鍙洖娓│',
+  desc: '鍩烘柤绲﹀畾鐨勬煡瑭㈡枃瀛楁脯瑭︾煡璀樺韩鐨勫彫鍥炴晥鏋溿��',
+  dateTimeFormat: 'YYYY-MM-DD HH:mm',
+  recents: '鏈�杩戞煡瑭�',
+  table: {
+    header: {
+      source: '璩囨枡渚嗘簮',
+      text: '鏂囧瓧',
+      time: '鏅傞枔',
+    },
+  },
+  input: {
+    title: '婧愭枃瀛�',
+    placeholder: '璜嬭几鍏ユ枃瀛楋紝寤鸿浣跨敤绨$煭鐨勯櫝杩板彞銆�',
+    countWarning: '涓嶈秴閬� 200 鍊嬪瓧鍏�',
+    indexWarning: '鍍呮敮鎻撮珮璩噺妯″紡鐭ヨ瓨搴�',
+    testing: '娓│',
+  },
+  hit: {
+    title: '鍙洖娈佃惤',
+    emptyTip: '鍙洖娓│绲愭灉灏囧睍绀哄湪閫欒!',
+  },
+  noRecentTip: '鏈�杩戠劇鏌ヨ绲愭灉',
+  viewChart: '鏌ョ湅鍚戦噺鍦栬〃',
+  viewDetail: '鏌ョ湅瑭虫儏',
+  settingTitle: '妾㈢储瑷疆',
+  open: '鎵撻枊',
+  records: '瑷橀寗',
+  chunkDetail: '鏁告摎濉婅┏绱拌硣瑷�',
+  hitChunks: '鍛戒腑 {{num}} 鍊嬪瓙濉�',
+  keyword: '闂滈嵉瀛�',
+}
+
+export default translation
diff --git a/i18n/zh-Hant/dataset-settings.ts b/i18n/zh-Hant/dataset-settings.ts
new file mode 100644
index 0000000..3dce646
--- /dev/null
+++ b/i18n/zh-Hant/dataset-settings.ts
@@ -0,0 +1,43 @@
+const translation = {
+  title: '鐭ヨ瓨搴ō瀹�',
+  desc: '鍦ㄩ�欒!鎮ㄥ彲浠ヤ慨鏀圭煡璀樺韩鐨勫伐浣滄柟寮忎互鍙婂叾瀹冭ō瀹氥��',
+  form: {
+    name: '鐭ヨ瓨搴悕绋�',
+    namePlaceholder: '璜嬭几鍏ョ煡璀樺韩鍚嶇ū',
+    nameError: '鍚嶇ū涓嶈兘鐐虹┖',
+    desc: '鐭ヨ瓨搴弿杩�',
+    descInfo: '璜嬪鍑烘竻妤氱殑鏂囧瓧鎻忚堪渚嗘杩扮煡璀樺韩鐨勫収瀹广�傜暥寰炲鍊嬬煡璀樺韩涓�茶閬告搰鍖归厤鏅傦紝瑭叉弿杩板皣鐢ㄤ綔鍖归厤鐨勫熀绀庛��',
+    descPlaceholder: '鎻忚堪閫欏�嬬煡璀樺韩涓殑鍏у銆傝┏绱扮殑鎻忚堪鍙互璁� AI 鍙婃檪瑷晱鐭ヨ瓨搴殑鍏у銆傚鏋滅偤绌猴紝Dify 灏囦娇鐢ㄩ爯瑷殑鍛戒腑绛栫暐銆�',
+    descWrite: '鐬В濡備綍绶ㄥ鏇村ソ鐨勭煡璀樺韩鎻忚堪銆�',
+    permissions: '鍙瑷卞彲娆�',
+    permissionsOnlyMe: '鍙湁鎴�',
+    permissionsAllMember: '鎵�鏈夊湗闅婃垚鍝�',
+    indexMethod: '绱㈠紩妯″紡',
+    indexMethodHighQuality: '楂樿唱閲�',
+    indexMethodHighQualityTip: '浣跨敤 Embedding 妯″瀷閫茶铏曠悊锛屼互鍦ㄤ娇鐢ㄨ�呮煡瑭㈡檪鎻愪緵鏇撮珮鐨勬簴纰哄害銆�',
+    indexMethodEconomy: '缍撴繜',
+    indexMethodEconomyTip: '浣跨敤闆㈢窔鐨勫悜閲忓紩鎿庛�侀棞閸佃绱㈠紩绛夋柟寮忥紝闄嶄綆浜嗘簴纰哄害浣嗙劇闇�鑺辫不 Token',
+    embeddingModel: 'Embedding 妯″瀷',
+    embeddingModelTip: '淇敼 Embedding 妯″瀷锛岃珛鍘�',
+    embeddingModelTipLink: '瑷畾',
+    retrievalSetting: {
+      title: '妾㈢储瑷畾',
+      learnMore: '鐬В鏇村',
+      description: '闂滄柤妾㈢储鏂规硶銆�',
+      longDescription: '闂滄柤妾㈢储鏂规硶锛屾偍鍙互闅ㄦ檪鍦ㄧ煡璀樺韩瑷畾涓洿鏀规瑷畾銆�',
+      method: '妾㈢储鏂规硶',
+    },
+    save: '鍎插瓨',
+    permissionsInvitedMembers: '閮ㄥ垎鍦橀殜鎴愬摗',
+    me: '锛堟偍锛�',
+    externalKnowledgeID: '澶栭儴鐭ヨ瓨ID',
+    externalKnowledgeAPI: '澶栭儴鐭ヨ瓨 API',
+    retrievalSettings: '妾㈢储瑷疆',
+    indexMethodChangeToEconomyDisabledTip: '涓嶉仼鐢ㄦ柤寰� HQ 闄嶇礆鍒� ECO',
+    upgradeHighQualityTip: '鍗囩礆鍒伴珮鍝佽唱妯″紡鍚庯紝鐒℃硶鎭㈠京鍒扮稉婵熸ā寮�',
+    helpText: '鐬В濡備綍绶ㄥ鑹ソ鐨勬暩鎿氶泦鎻忚堪銆�',
+    searchModel: '鎼滅储妯″瀷',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hant/dataset.ts b/i18n/zh-Hant/dataset.ts
new file mode 100644
index 0000000..ce4d63a
--- /dev/null
+++ b/i18n/zh-Hant/dataset.ts
@@ -0,0 +1,221 @@
+const translation = {
+  knowledge: '鐭ヨ瓨搴�',
+  documentCount: ' 鏂囦欢',
+  wordCount: ' 鍗冨瓧鍏�',
+  appCount: ' 闂滆伅鎳夌敤',
+  createDataset: '寤虹珛鐭ヨ瓨搴�',
+  createDatasetIntro: '鍖叆鎮ㄨ嚜宸辩殑鏂囧瓧璩囨枡鎴栭�忛亷 Webhook 瀵︽檪瀵叆璩囨枡浠ュ寮� LLM 鐨勪笂涓嬫枃銆�',
+  deleteDatasetConfirmTitle: '瑕佸埅闄ょ煡璀樺韩鍡庯紵',
+  deleteDatasetConfirmContent:
+    '鍒櫎鐭ヨ瓨搴槸涓嶅彲閫嗙殑銆備娇鐢ㄨ�呭皣鐒℃硶鍐嶈í鍟忔偍鐨勭煡璀樺韩,鎵�鏈夌殑鎻愮ず閰嶇疆鍜屾棩瑾屽皣琚案涔呭埅闄ゃ��',
+  datasetUsedByApp: '閫欎簺鐭ヨ瓨姝h涓�浜涙噳鐢ㄧ▼搴忎娇鐢ㄣ�傛噳鐢ㄧ▼搴忓皣鐒℃硶鍐嶄娇鐢ㄩ�欎簺鐭ヨ瓨锛屾墍鏈夋彁绀洪厤缃拰鏃ヨ獙灏囪姘镐箙鍒櫎銆�',
+  datasetDeleted: '鐭ヨ瓨搴凡鍒櫎',
+  datasetDeleteFailed: '鍒櫎鐭ヨ瓨搴け鏁�',
+  didYouKnow: '浣犵煡閬撳棊锛�',
+  intro1: '鐭ヨ瓨搴彲浠ヨ鏁村悎鍒� Dify 鎳夌敤涓�',
+  intro2: '浣滅偤涓婁笅鏂�',
+  intro3: ',',
+  intro4: '鎴栧彲浠�',
+  intro5: '寤虹珛',
+  intro6: '鐐虹崹绔嬬殑 ChatGPT 澶栨帥閲嬪嚭浣跨敤',
+  unavailable: '涓嶅彲鐢�',
+  unavailableTip: '鐢辨柤 embedding 妯″瀷涓嶅彲鐢紝闇�瑕侀厤缃爯瑷� embedding 妯″瀷',
+  datasets: '鐭ヨ瓨搴�',
+  datasetsApi: 'API',
+  retrieval: {
+    semantic_search: {
+      title: '鍚戦噺妾㈢储',
+      description: '閫忛亷鐢熸垚鏌ヨ宓屽叆涓︽煡瑭㈣垏鍏跺悜閲忚〃绀烘渶鐩镐技鐨勬枃瀛楀垎娈�',
+    },
+    full_text_search: {
+      title: '鍏ㄦ枃妾㈢储',
+      description: '绱㈠紩鏂囦欢涓殑鎵�鏈夎褰欙紝寰炶�屽厑瑷变娇鐢ㄨ�呮煡瑭换鎰忚褰欙紝涓﹁繑鍥炲寘鍚�欎簺瑭炲綑鐨勬枃瀛楃墖娈�',
+    },
+    hybrid_search: {
+      title: '娣峰悎妾㈢储',
+      description: '鍚屾檪鍩疯鍏ㄦ枃妾㈢储鍜屽悜閲忔绱紝涓︽噳鐢ㄩ噸鎺掑簭姝ラ锛屽緸鍏╅鏌ヨ绲愭灉涓伕鎿囧尮閰嶄娇鐢ㄨ�呭晱椤岀殑鏈�浣崇祼鏋滐紝闇�閰嶇疆 Rerank 妯″瀷 API',
+      recommend: '鎺ㄨ枽',
+    },
+    invertedIndex: {
+      title: '鍊掓帓绱㈠紩',
+      description: '鍊掓帓绱㈠紩鏄竴绋敤鏂奸珮鏁堟绱㈢殑绲愭銆傛寜琛撹獮绲勭箶锛屾瘡鍊嬭瑾炴寚鍚戝寘鍚畠鐨勬枃浠舵垨缍查爜',
+    },
+    change: '鏇存敼',
+    changeRetrievalMethod: '鏇存敼妾㈢储鏂规硶',
+  },
+  docsFailedNotice: '鏂囦欢鐒℃硶琚储寮�',
+  retry: '閲嶈│',
+  indexingTechnique: {
+    high_quality: '楂樿唱閲�',
+    economy: '缍撴繜',
+  },
+  indexingMethod: {
+    semantic_search: '鍚戦噺',
+    full_text_search: '鍏ㄦ枃',
+    hybrid_search: '娣峰悎',
+    invertedIndex: '鍊掓帓绱㈠紩',
+  },
+  mixtureHighQualityAndEconomicTip: '娣峰悎楂樿唱閲忓拰缍撴繜鐭ヨ瓨搴渶瑕侀噸鏂版帓搴忔ā鍨嬨��',
+  inconsistentEmbeddingModelTip: '濡傛灉閬稿畾鐭ヨ瓨搴殑宓屽叆妯″瀷涓嶄竴鑷达紝鍓囬渶瑕侀噸鏂版帓搴忔ā鍨嬨��',
+  retrievalSettings: '妾㈢储瑷疆',
+  rerankSettings: '閲嶆柊鎺掑簭瑷疆',
+  weightedScore: {
+    title: '鍔犳瑠鍒嗘暩',
+    description: '閫氶亷瑾挎暣鍒嗛厤鐨勬瑠閲嶏紝姝ら噸鏂版帓搴忕瓥鐣ユ焙瀹氭槸鍎厛鑰冩叜瑾炵京鍖归厤閭勬槸闂滈嵉瑭炲尮閰嶃��',
+    semanticFirst: '瑾炵京鍎厛',
+    keywordFirst: '闂滈嵉瑭炲劒鍏�',
+    customized: '鑷畾缇�',
+    semantic: '瑾炵京',
+    keyword: '闂滈嵉瑭�',
+  },
+  nTo1RetrievalLegacy: 'N灏�1妾㈢储灏囧緸9鏈堣捣姝e紡妫勭敤銆傚缓璀颁娇鐢ㄦ渶鏂扮殑澶氳矾寰戞绱互鐛插緱鏇村ソ鐨勭祼鏋溿��',
+  nTo1RetrievalLegacyLink: '浜嗚В鏇村',
+  nTo1RetrievalLegacyLinkText: 'N灏�1妾㈢储灏囨柤9鏈堟寮忔鐢ㄣ��',
+  defaultRetrievalTip: '榛樿獚鎯呮硜涓嬶紝浣跨敤澶氳矾寰戞绱€�傚緸澶氬�嬬煡璀樺韩涓绱㈢煡璀橈紝鐒跺緦閲嶆柊鎺掑悕銆�',
+  editExternalAPIConfirmWarningContent: {
+    end: 'external knowledge锛屼甫涓旀淇敼灏囨噳鐢ㄦ柤鎵�鏈夐�欎簺 Knowledge銆傛槸鍚︾⒑瀵﹁淇濆瓨姝ゆ洿鏀癸紵',
+    front: '姝ゅ閮ㄧ煡璀� API 閫g祼鍒�',
+  },
+  editExternalAPIFormWarning: {
+    end: '澶栭儴鐭ヨ瓨',
+    front: '姝ゅ閮� API 閫g祼鍒�',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      end: '?',
+      front: '鍒櫎',
+    },
+    content: {
+      front: '姝ゅ閮ㄧ煡璀� API 閫g祼鍒�',
+      end: '澶栭儴鐭ヨ瓨銆傚埅闄ゆ API 灏囦娇鎵�鏈夐�欎簺 API 澶辨晥銆傛槸鍚︾⒑瀵﹁鍒櫎姝� API锛�',
+    },
+    noConnectionContent: '鎮ㄧ⒑瀹氳鍒櫎姝� API 鍡庯紵',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: '閬告搰澶栭儴鐭ヨ瓨 API',
+  },
+  connectDatasetIntro: {
+    content: {
+      link: '鐬В濡備綍鍓靛缓澶栭儴 API',
+      front: '瑕侀�f帴鍒板閮ㄧ煡璀樺韩锛屾偍闇�瑕佸厛鍓靛缓澶栭儴 API銆傝珛浠旂窗闁辫畝涓﹀弮鑰�',
+      end: '.鐒跺緦鎵惧埌灏嶆噳鐨勭煡璀業D涓﹀湪宸﹀伌鐨勮〃鍠腑濉銆傚鏋滆硣瑷婂叏閮ㄦ纰猴紝榛炴搳閫f帴鎸夐垥鍚庯紝鏈冭嚜鍕曡烦杞夊埌鐭ヨ瓨搴腑鐨勬绱㈡脯瑭︺��',
+    },
+    title: '濡備綍閫f帴鍒板閮ㄧ煡璀樺韩',
+    learnMore: '鐬В鏇村璩囪▕',
+  },
+  connectHelper: {
+    helper5: '浣跨敤姝ゅ姛鑳藉墠璜嬪皬蹇冦��',
+    helper3: '.鎴戝�戝挤鐑堝缓璀版偍',
+    helper2: '鍍呮敮鎻存绱㈠姛鑳�',
+    helper4: '闁辫畝骞姪鏂囦欢',
+    helper1: '閫氶亷 API 鍜岀煡璀樺韩 ID 閫f帴鍒板閮ㄧ煡璀樺韩銆傜洰鍓嶏紝',
+  },
+  externalKnowledgeForm: {
+    connect: '閫f帴',
+    cancel: '鍙栨秷',
+  },
+  externalAPIForm: {
+    encrypted: {
+      end: '绉戞妧銆�',
+      front: '鎮ㄧ殑 API 浠ょ墝灏囦娇鐢�',
+    },
+    save: '鏁�',
+    cancel: '鍙栨秷',
+    name: '鍚嶅瓧',
+    apiKey: 'API 閲戦懓',
+    edit: '绶ㄨ集',
+    endpoint: 'API 绲傜绡�榛�',
+  },
+  externalTag: '澶栭儴',
+  externalKnowledgeDescription: '鐭ヨ瓨鎻忚堪',
+  mixtureInternalAndExternalTip: 'Rerank 妯″瀷鏄収閮ㄥ拰澶栭儴鐭ヨ瓨鐨勬贩鍚堟墍蹇呴渶鐨勩��',
+  connectDataset: '閫f帴鍒板閮ㄧ煡璀樺韩',
+  learnHowToWriteGoodKnowledgeDescription: '鐬В濡備綍绶ㄥ鑹ソ鐨勭煡璀樻弿杩�',
+  createExternalAPI: '娣诲姞澶栭儴鐭ヨ瓨 API',
+  externalAPIPanelTitle: '澶栭儴鐭ヨ瓨 API',
+  createNewExternalAPI: '鍓靛缓鏂扮殑澶栭儴鐭ヨ瓨 API',
+  externalKnowledgeDescriptionPlaceholder: '鎻忚堪姝ょ煡璀樺韩涓殑鍏у锛堥伕鎿囷級',
+  allExternalTip: '鍍呬娇鐢ㄥ閮ㄧ煡璀樻檪锛岀敤鎴跺彲浠ラ伕鎿囨槸鍚﹀暉鐢� Rerank 妯″瀷銆傚鏋滄湭鍟熺敤锛屽墖妾㈢储鍒扮殑鏁告摎濉婂皣鏍规摎鍒嗘暩閫茶鎺掑簭銆傜暥涓嶅悓鐭ヨ瓨搴殑妾㈢储绛栫暐涓嶄竴鑷存檪锛屽氨鏈冧笉婧栫⒑銆�',
+  externalKnowledgeIdPlaceholder: '璜嬭几鍏� Knowledge ID',
+  editExternalAPIFormTitle: '绶ㄨ集澶栭儴鐭ヨ瓨 API',
+  externalKnowledgeId: '澶栭儴鐭ヨ瓨ID',
+  externalAPIPanelDescription: '澶栭儴鐭ヨ瓨 API 鐢ㄦ柤閫f帴鍒� Dify 澶栭儴鐨勭煡璀樺韩锛屼甫寰炶┎鐭ヨ瓨搴腑妾㈢储鐭ヨ瓨銆�',
+  externalAPI: '澶栭儴 API',
+  editExternalAPITooltipTitle: '闂滆伅鐭ヨ瓨',
+  externalKnowledgeName: '澶栭儴鐭ヨ瓨鍚嶇ū',
+  externalAPIPanelDocumentation: '鐬В濡備綍鍓靛缓澶栭儴鐭ヨ瓨 API',
+  externalKnowledgeNamePlaceholder: '璜嬭几鍏ョ煡璀樺韩鐨勫悕绋�',
+  noExternalKnowledge: '鐩墠閭勬矑鏈夊閮ㄧ煡璀� API锛屾寜鍏╀笅姝よ檿鍓靛缓',
+  chunkingMode: {
+    parentChild: '鐖跺瓙',
+    general: '甯歌',
+  },
+  parentMode: {
+    paragraph: '娈�',
+    fullDoc: '瀹屾暣鏂囦欢',
+  },
+  batchAction: {
+    delete: '鍒櫎',
+    enable: '浣�',
+    disable: '绂佺敤',
+    cancel: '鍙栨秷',
+    archive: '妾旀',
+    selected: '閬告搰',
+  },
+  enable: '浣�',
+  documentsDisabled: '宸茬鐢� {{num}} 鍊嬫枃妾� - 铏曟柤闈炴椿鍕曠媭鎱嬭秴閬� 30 澶�',
+  localDocs: '鏈湴鏂囦欢',
+  preprocessDocument: '{{num}}闋愯檿鐞嗘枃浠�',
+  allKnowledge: '鎵�鏈夌煡璀�',
+  allKnowledgeDescription: '閬告搰浠ラ’绀烘宸ヤ綔鍗�涓殑鎵�鏈夌煡璀樸�傚彧鏈� Workspace 鎿佹湁鑰呭彲浠ョ鐞嗘墍鏈夌煡璀樸��',
+  metadata: {
+    createMetadata: {
+      type: '椤炲瀷',
+      title: '鏂板厓鏁告摎',
+      back: '杩斿洖',
+      namePlaceholder: '娣诲姞鍏冩暩鎿氬悕绋�',
+      name: '鍚嶅瓧',
+    },
+    checkName: {
+      empty: '鍏冩暩鎿氬悕绋变笉鑳界偤绌�',
+      invalid: '鍏冩暩鎿氬悕绋卞彧鑳藉寘鍚皬瀵瓧姣嶃�佹暩瀛楀拰搴曠窔锛屼甫涓斿繀闋堜互灏忓瀛楁瘝闁嬮牠',
+    },
+    batchEditMetadata: {
+      applyToAllSelectDocumentTip: '鑷嫊鐐烘墍鏈夐伕瀹氭枃妾斿壍寤轰笂杩版墍鏈夌法杓拰鏂板厓鏁告摎锛屽惁鍓囩法杓厓鏁告摎灏囧儏閬╃敤鏂煎叿鏈夎┎鍏冩暩鎿氱殑鏂囨獢銆�',
+      editDocumentsNum: '绶ㄨ集 {{num}} 浠芥枃浠�',
+      multipleValue: '澶氶噸鍍瑰��',
+      applyToAllSelectDocument: '鎳夌敤鏂兼墍鏈夐伕瀹氱殑鏂囦欢',
+      editMetadata: '绶ㄨ集鍏冭硣鏂�',
+    },
+    selectMetadata: {
+      search: '鎼滃皨鍏冩暩鎿�',
+      newAction: '鏂板厓鏁告摎',
+      manageAction: '绠$悊',
+    },
+    datasetMetadata: {
+      rename: '閲嶆柊鍛藉悕',
+      addMetaData: '娣诲姞鍏冩暩鎿�',
+      builtInDescription: '鍏у缓鐨勫厓鏁告摎鏈冭嚜鍕曟彁鍙栧拰鐢熸垚銆傚湪浣跨敤涔嬪墠蹇呴爤鍟熺敤锛屼笖鐒℃硶绶ㄨ集銆�',
+      name: '鍚嶅瓧',
+      disabled: '绂佺敤',
+      deleteTitle: '纰鸿獚鍒櫎',
+      values: '{{num}} 鍊�',
+      deleteContent: '鎮ㄧ⒑瀹氳鍒櫎鍏冩暩鎿� "{{name}}" 鍡庯紵',
+      builtIn: '鍏у缓鐨�',
+      description: '鎮ㄥ彲浠ュ湪閫欒!绠$悊鎵�鏈夌殑鍏冩暩鎿氥�傚皪鎵�鏈夋枃浠剁殑淇敼灏囨渻鍚屾銆�',
+      namePlaceholder: '鍏冩暩鎿氬悕绋�',
+    },
+    documentMetadata: {
+      startLabeling: '闁嬪妯欒',
+      documentInformation: '鏂囦欢璩囪▕',
+      technicalParameters: '鎶�琛撳弮鏁�',
+      metadataToolTip: '鍏冩暩鎿氫綔鐐轰竴鍊嬮棞閸电殑閬庢烤鍣紝鎻愰珮浜嗕俊鎭绱㈢殑婧栫⒑鎬у拰鐩搁棞鎬с�傛偍鍙互鍦ㄦ铏曚慨鏀瑰拰娣诲姞姝ゆ枃妾旂殑鍏冩暩鎿氥��',
+    },
+    metadata: '鍏冩暩鎿�',
+    chooseTime: '閬告搰涓�鍊嬫檪闁�...',
+    addMetadata: '娣诲姞鍏冩暩鎿�',
+  },
+  embeddingModelNotAvailable: '宓屽叆妯″瀷鐒℃硶浣跨敤銆�',
+}
+
+export default translation
diff --git a/i18n/zh-Hant/education.ts b/i18n/zh-Hant/education.ts
new file mode 100644
index 0000000..9637324
--- /dev/null
+++ b/i18n/zh-Hant/education.ts
@@ -0,0 +1,47 @@
+const translation = {
+  toVerifiedTip: {
+    end: '鐢ㄦ柤 Dify 灏堟キ瑷堝妰銆�',
+    coupon: '鐛ㄥ 100% 鍎儬鍒�',
+    front: '鎮ㄧ従鍦ㄧ鍚堟暀鑲查璀夌媭鎱嬬殑璩囨牸銆傝珛鍦ㄤ笅闈㈣几鍏ユ偍鐨勬暀鑲茶硣瑷婁互瀹屾垚姝ゆ祦绋嬩甫鐛插緱涓�鍊�',
+  },
+  form: {
+    schoolName: {
+      title: '浣犵殑瀛告牎鍚嶇ū',
+      placeholder: '璜嬭几鍏ユ偍瀛告牎鐨勬寮忓叏鍚�',
+    },
+    schoolRole: {
+      option: {
+        teacher: '鑰佸斧',
+        student: '瀛哥敓',
+        administrator: '鏍″湌琛屾斂浜哄摗',
+      },
+      title: '浣犵殑瀛告牎瑙掕壊',
+    },
+    terms: {
+      desc: {
+        and: '鍜�',
+        privacyPolicy: '闅辩鏀跨瓥',
+        termsOfService: '鏈嶅嫏姊濇',
+        front: '鎮ㄧ殑璩囪▕鍙婁娇鐢ㄦ暀鑲查璀夌媭鎱嬮渶閬靛惊鎴戝�戠殑',
+        end: '閫忛亷鎻愪氦锛�',
+      },
+      option: {
+        age: '鎴戠⒑瑾嶆垜鑷冲皯18姝�',
+        inSchool: '鎴戠⒑瑾嶆垜宸插湪鎵�鎻愪緵鐨勬妲嬭ɑ鍐婃垨鍙楀儽銆侱ify 鍙兘鏈冭姹傛彁渚涜ɑ鍐�/灏辨キ鐨勮瓑鏄庛�傚鏋滄垜閷琛ㄨ堪鎴戠殑璩囨牸锛屾垜鍚屾剰鏀粯鏍规摎鎴戠殑鏁欒偛鐙�娉佹渶鍒濆厤闄ょ殑浠讳綍璨荤敤銆�',
+      },
+      title: '姊濇鑸囧崝璀�',
+    },
+  },
+  rejectContent: '涓嶅垢鐨勬槸锛屾偍涓嶇鍚堟暀鑲查璀夌媭鎱嬶紝鍥犳濡傛灉鎮ㄤ娇鐢ㄦ闆诲瓙閮典欢鍦板潃锛屽皣鐒℃硶鐛插緱Dify灏堟キ瑷堝妰鐨�100%鐛ㄥ鍎儬鍒搞��',
+  successContent: '鎴戝�戝凡缍撳悜鎮ㄧ殑甯虫埗鐧兼斁浜咲ify灏堟キ瑷堝妰鐨�100%鎶樻墸鍎儬鍒搞�傝┎鍎儬鍒告湁鏁堟湡鐐轰竴骞达紝璜嬪湪鏈夋晥鏈熷収浣跨敤瀹冦��',
+  learn: '浜嗚В濡備綍閫茶鏁欒偛椹楄瓑',
+  rejectTitle: '鎮ㄧ殑 Dify 鏁欒偛椹楄瓑宸茶鎷掔禃',
+  submitError: '琛ㄥ柈鎻愪氦澶辨晽銆傝珛绋嶅緦鍐嶈│銆�',
+  currentSigned: '鐣跺墠浠ヤ互涓嬭韩浠界櫥鍏�',
+  emailLabel: '鎮ㄧ暥鍓嶇殑闆诲瓙閮典欢',
+  submit: '鎻愪氦',
+  successTitle: '鎮ㄥ凡鐛插緱 Dify 鏁欒偛瑾嶈瓑',
+  toVerified: '鐛插彇鏁欒偛璀夋槑',
+}
+
+export default translation
diff --git a/i18n/zh-Hant/explore.ts b/i18n/zh-Hant/explore.ts
new file mode 100644
index 0000000..c0f4a51
--- /dev/null
+++ b/i18n/zh-Hant/explore.ts
@@ -0,0 +1,44 @@
+const translation = {
+  title: '鎺㈢储',
+  sidebar: {
+    discovery: '鐧肩従',
+    chat: '鏅鸿亰',
+    workspace: '宸ヤ綔鍗�',
+    action: {
+      pin: '缃爞',
+      unpin: '鍙栨秷缃爞',
+      rename: '閲嶆柊鍛藉悕',
+      delete: '鍒櫎',
+    },
+    delete: {
+      title: '鍒櫎绋嬪紡',
+      content: '鎮ㄧ⒑瀹氳鍒櫎姝ょ▼寮忓棊锛�',
+    },
+  },
+  apps: {
+    title: '鎺㈢储 Dify 鐨勬噳鐢�',
+    description: '浣跨敤閫欎簺妯℃澘鎳夌敤绋嬪紡锛屾垨鏍规摎妯℃澘鑷畾缇╂偍鑷繁鐨勬噳鐢ㄧ▼寮忋��',
+    allCategories: '鎺ㄨ枽',
+  },
+  appCard: {
+    addToWorkspace: '鏂板鍒板伐浣滃崁',
+    customize: '鑷畾缇�',
+  },
+  appCustomize: {
+    title: '寰� {{name}} 寤虹珛鎳夌敤绋嬪紡',
+    subTitle: '鎳夌敤绋嬪紡鍦栫ず鍜屽悕绋�',
+    nameRequired: '鎳夌敤绋嬪紡鍚嶇ū涓嶈兘鐐虹┖',
+  },
+  category: {
+    Assistant: '鍔╂墜',
+    Writing: '瀵綔',
+    Translate: '缈昏',
+    Programming: '绋嬪紡瑷▓',
+    HR: '浜哄姏璩囨簮',
+    Agent: '浠g悊',
+    Workflow: '宸ヤ綔娴�',
+    Entertainment: '濞涙▊',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hant/layout.ts b/i18n/zh-Hant/layout.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/zh-Hant/layout.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/zh-Hant/login.ts b/i18n/zh-Hant/login.ts
new file mode 100644
index 0000000..6f2b834
--- /dev/null
+++ b/i18n/zh-Hant/login.ts
@@ -0,0 +1,110 @@
+const translation = {
+  pageTitle: '鍡紝杩戜締鍙ソ',
+  welcome: '馃憢 姝¤繋渚嗗埌 Dify, 鐧诲叆浠ョ辜绾�',
+  email: '閮电',
+  emailPlaceholder: '杓稿叆閮电鍦板潃',
+  password: '瀵嗙⒓',
+  passwordPlaceholder: '杓稿叆瀵嗙⒓',
+  name: '浣跨敤鑰呭悕绋�',
+  namePlaceholder: '杓稿叆浣跨敤鑰呭悕绋�',
+  forget: '蹇樿瀵嗙⒓锛�',
+  signBtn: '鐧诲叆',
+  installBtn: '瑷畾',
+  setAdminAccount: '瑷畾绠$悊鍝¤超鎴�',
+  setAdminAccountDesc: '绠$悊鍝℃搧鏈夌殑鏈�澶цū鍙瑠锛屽彲鐢ㄦ柤寤虹珛鎳夌敤鍜岀鐞� LLM 渚涙噳鍟嗙瓑銆�',
+  createAndSignIn: '寤虹珛璩埗',
+  oneMoreStep: '閭勫樊涓�姝�',
+  createSample: '鍩烘柤閫欎簺璩囪▕锛屾垜鍊戝皣鐐烘偍寤虹珛涓�鍊嬬ず渚嬫噳鐢�',
+  invitationCode: '閭�璜嬬⒓',
+  invitationCodePlaceholder: '杓稿叆閭�璜嬬⒓',
+  interfaceLanguage: '浠嬮潰瑾炶█',
+  timezone: '鏅傚崁',
+  go: '璺宠綁鑷� Dify',
+  sendUsMail: '鐧煎皝閮典欢浠嬬垂浣犺嚜宸憋紝鎴戝�戞渻鐩″揩铏曠悊銆�',
+  acceptPP: '鎴戝凡闁辫畝涓︽帴鍙楅毐绉佹斂绛�',
+  reset: '璜嬪煼琛屼互涓嬪懡浠ら噸缃瘑纰�',
+  withGitHub: '浣跨敤 GitHub 鐧诲叆',
+  withGoogle: '浣跨敤 Google 鐧诲叆',
+  rightTitle: '閲嬫斁澶у瀷瑾炶█妯″瀷鐨勫叏閮ㄦ經鑳�',
+  rightDesc: '绨″柈妲嬪缓瑕栬鍖栥�佸彲閬嬬嚐銆佸彲鏀归�茬殑 AI 鎳夌敤',
+  tos: '浣跨敤鍗旇',
+  pp: '闅辩鏀跨瓥',
+  tosDesc: '浣跨敤鍗充唬琛ㄤ綘涓﹀悓鎰忔垜鍊戠殑',
+  goToInit: '濡傛灉鎮ㄩ倓娌掓湁鍒濆鍖栬超鎴讹紝璜嬪墠寰�鍒濆鍖栭爜闈�',
+  dontHave: '閭勬矑鏈夐個璜嬬⒓锛�',
+  invalidInvitationCode: '鐒℃晥鐨勯個璜嬬⒓',
+  accountAlreadyInited: '璩埗宸茬稉鍒濆鍖�',
+  forgotPassword: '蹇樿瀵嗙⒓锛�',
+  resetLinkSent: '閲嶈ō閫g祼宸茬櫦閫�',
+  sendResetLink: '鐧奸�侀噸瑷�g祼',
+  backToSignIn: '杩斿洖鐧婚寗',
+  forgotPasswordDesc: '璜嬭几鍏ユ偍鐨勯浕瀛愰兊浠跺湴鍧�浠ラ噸瑷瘑纰笺�傛垜鍊戝皣鍚戞偍鐧奸�佷竴灏侀浕瀛愰兊浠讹紝瑾槑濡備綍閲嶈ō瀵嗙⒓銆�',
+  checkEmailForResetLink: '璜嬫鏌ユ偍鐨勯浕瀛愰兊浠朵互鐛插彇閲嶈ō瀵嗙⒓鐨勯�g祼銆傚鏋滃咕鍒嗛悩鍏ф矑鏈夋敹鍒帮紝璜嬫鏌ユ偍鐨勫瀮鍦鹃兊浠舵枃浠跺ぞ銆�',
+  passwordChanged: '绔嬪嵆鐧诲叆',
+  changePassword: '鏇存敼瀵嗙⒓',
+  changePasswordTip: '璜嬭几鍏ユ偍鐨勬柊瀵嗙⒓',
+  invalidToken: '鐒℃晥鎴栧凡閬庢湡鐨勪护鐗�',
+  confirmPassword: '纰鸿獚瀵嗙⒓',
+  confirmPasswordPlaceholder: '纰鸿獚鎮ㄧ殑鏂板瘑纰�',
+  passwordChangedTip: '鎮ㄧ殑瀵嗙⒓宸叉垚鍔熸洿鏀�',
+  error: {
+    emailEmpty: '閮电涓嶈兘鐐虹┖',
+    emailInValid: '璜嬭几鍏ユ湁鏁堢殑閮电鍦板潃',
+    nameEmpty: '浣跨敤鑰呭悕绋变笉鑳界偤绌�',
+    passwordEmpty: '瀵嗙⒓涓嶈兘鐐虹┖',
+    passwordInvalid: '瀵嗙⒓蹇呴爤鍖呭惈瀛楁瘝鍜屾暩瀛楋紝涓旈暦搴︿笉灏忔柤8浣�',
+    passwordLengthInValid: '瀵嗙⒓蹇呴爤鑷冲皯鐐�8鍊嬪瓧鍏�',
+    registrationNotAllowed: '鎵句笉鍒板赋鎴躲�傝珛鑱公绯荤当绠$悊鍝¢�茶瑷诲唺銆�',
+  },
+  license: {
+    tip: '鍟熷嫊 Dify 绀剧兢鐗堜箣鍓�, 璜嬮柋璁� GitHub 涓婄殑',
+    link: '闁嬫簮鍗旇',
+  },
+  join: '鍔犲叆',
+  joinTipStart: '閭�璜嬩綘鍔犲叆',
+  joinTipEnd: '鍦橀殜',
+  invalid: '閫g祼宸插け鏁�',
+  explore: '鎺㈢储 Dify',
+  activatedTipStart: '鎮ㄥ凡鍔犲叆',
+  activatedTipEnd: '鍦橀殜',
+  activated: '鐝惧湪鐧诲叆',
+  adminInitPassword: '绠$悊鍝″垵濮嬪寲瀵嗙⒓',
+  validate: '椹楄瓑',
+  sso: '绻肩簩浣跨敤 SSO',
+  checkCode: {
+    verify: '椹楄瓑',
+    resend: '鐧奸��',
+    didNotReceiveCode: '娌掓湁鏀跺埌椹楄瓑纰硷紵',
+    emptyCode: '椹楄瓑纰兼槸蹇呴渶鐨�',
+    checkYourEmail: '妾㈡煡鎮ㄧ殑闆诲瓙閮典欢',
+    tips: '鎴戝�戝皣椹楄瓑纰肩櫦閫佸埌 <strong>{{email}}</strong>',
+    verificationCodePlaceholder: '杓稿叆6浣嶄唬纰�',
+    useAnotherMethod: '浣跨敤鍏朵粬鏂规硶',
+    validTime: '璜嬭浣忥紝瑭蹭唬纰肩殑鏈夋晥鏈熺偤 5 鍒嗛悩',
+    verificationCode: '椹楄瓑纰�',
+    invalidCode: '鐒℃晥浠g⒓',
+  },
+  continueWithCode: 'Continue With Code',
+  or: '鎴�',
+  sendVerificationCode: '鐧奸�侀璀夌⒓',
+  resetPassword: '閲嶇疆瀵嗙⒓',
+  noLoginMethod: '鏈厤缃韩浠介璀夋柟娉�',
+  setYourAccount: '瑷疆鎮ㄧ殑甯虫埗',
+  useVerificationCode: '浣跨敤椹楄瓑纰�',
+  changePasswordBtn: '瑷疆瀵嗙⒓',
+  enterYourName: '璜嬭几鍏ユ偍鐨勪娇鐢ㄨ�呭悕',
+  backToLogin: '杩斿洖鐧婚寗',
+  noLoginMethodTip: '璜嬭伅绻郴绲辩鐞嗗摗浠ユ坊鍔犺韩浠介璀夋柟娉曘��',
+  withSSO: '绻肩簩浣跨敤 SSO',
+  back: '杩斿洖',
+  resetPasswordDesc: '杓稿叆鎮ㄧ敤鏂艰ɑ鍐� Dify 鐨勯浕瀛愰兊浠讹紝鎴戝�戝皣鍚戞偍鐧奸�佷竴灏佸瘑纰奸噸缃浕瀛愰兊浠躲��',
+  usePassword: '浣跨敤瀵嗙⒓',
+  licenseExpiredTip: '鎮ㄧ殑宸ヤ綔鍗�鐨� Dify Enterprise 瑷卞彲璀夊凡閬庢湡銆傝珛鑱公鎮ㄧ殑绠$悊鍝′互绻肩簩浣跨敤 Dify銆�',
+  licenseExpired: '瑷卞彲璀夊凡閬庢湡',
+  licenseLost: '瑷卞彲璀変笩澶�',
+  licenseInactive: '瑷卞彲璀夎檿鏂奸潪娲诲嫊鐙�鎱�',
+  licenseInactiveTip: '鎮ㄧ殑宸ヤ綔鍗�鐨� Dify Enterprise 瑷卞彲璀夎檿鏂奸潪娲诲嫊鐙�鎱嬨�傝珛鑱公鎮ㄧ殑绠$悊鍝′互绻肩簩浣跨敤 Dify銆�',
+  licenseLostTip: '鐒℃硶閫f帴 Dify 瑷卞彲璀変己鏈嶅櫒銆傝珛鑱公鎮ㄧ殑绠$悊鍝′互绻肩簩浣跨敤 Dify銆�',
+}
+
+export default translation
diff --git a/i18n/zh-Hant/plugin-tags.ts b/i18n/zh-Hant/plugin-tags.ts
new file mode 100644
index 0000000..fe6a1ad
--- /dev/null
+++ b/i18n/zh-Hant/plugin-tags.ts
@@ -0,0 +1,25 @@
+const translation = {
+  tags: {
+    productivity: '鐢熺敘鍔�',
+    business: '鍟�',
+    finance: '閲戣瀺',
+    weather: '澶╂埃',
+    news: '鏂拌仦',
+    design: '瑷▓',
+    utilities: '鍏敤浜嬫キ',
+    education: '鏁欒偛',
+    travel: '鏃呰',
+    other: '鍏朵粬',
+    social: '绀炬渻鐨�',
+    medical: '閱檪',
+    agent: '浠g悊',
+    videos: '瑕栭牷',
+    entertainment: '濞涙▊',
+    search: '鎼滅储',
+    image: '鍦栧儚',
+  },
+  searchTags: '鎼滅储妯欑堡',
+  allTags: '鎵�鏈夋绫�',
+}
+
+export default translation
diff --git a/i18n/zh-Hant/plugin.ts b/i18n/zh-Hant/plugin.ts
new file mode 100644
index 0000000..03f6ece
--- /dev/null
+++ b/i18n/zh-Hant/plugin.ts
@@ -0,0 +1,215 @@
+const translation = {
+  category: {
+    tools: '宸ュ叿',
+    models: '妯″瀷',
+    extensions: '鎿村睍',
+    agents: '浠g悊绛栫暐',
+    all: '閮�',
+    bundles: '鏉�',
+  },
+  categorySingle: {
+    model: '鍨�',
+    extension: '澶栧欢',
+    agent: '浠g悊绛栫暐',
+    tool: '宸ュ叿',
+    bundle: '鎹�',
+  },
+  list: {
+    source: {
+      local: '寰炴湰鍦板寘妾斿畨瑁�',
+      github: '寰� GitHub 瀹夎',
+      marketplace: '寰� Marketplace 瀹夎',
+    },
+    noInstalled: '鏈畨瑁濆鎺涚▼寮�',
+    notFound: '鏈壘鍒板鎺涚▼寮�',
+  },
+  source: {
+    marketplace: '甯傚牬',
+    local: '鏈湴鍖呮獢',
+    github: 'GitHub鐨�',
+  },
+  detailPanel: {
+    categoryTip: {
+      marketplace: '寰� Marketplace 瀹夎',
+      debugging: '瑾胯│澶栨帥绋嬪紡',
+      github: '寰� Github 瀹夎',
+      local: '鏈湴澶栨帥绋嬪紡',
+    },
+    operation: {
+      info: '澶栨帥绋嬪紡璩囪▕',
+      detail: '瑭�',
+      remove: '鍒櫎',
+      install: '瀹夎',
+      viewDetail: '鏌ョ湅瑭虫儏',
+      update: '鏇存柊',
+      checkUpdate: '妾㈡煡鏇存柊',
+    },
+    toolSelector: {
+      uninstalledContent: '姝ゅ鎺涚▼寮忔槸寰瀕ocal/GitHub鍎插瓨搴畨瑁濈殑銆傝珛鍦ㄥ畨瑁濆緦浣跨敤銆�',
+      descriptionLabel: '宸ュ叿鎻忚堪',
+      params: '鎺ㄧ悊閰嶇疆',
+      paramsTip2: '鐣� \'Automatic\' 闂滈枆鏅傦紝浣跨敤闋愯ō鍊笺��',
+      descriptionPlaceholder: '宸ュ叿鐢ㄩ�旂殑绨¤鎻忚堪锛屼緥濡傦紝鐛插彇鐗瑰畾浣嶇疆鐨勬韩搴︺��',
+      toolLabel: '宸ュ叿',
+      unsupportedTitle: '涓嶆敮鎻寸殑浣�',
+      placeholder: '閬告搰宸ュ叿...',
+      uninstalledTitle: '鏈畨瑁濆伐鍏�',
+      auto: '鑷嫊',
+      title: '娣诲姞宸ュ叿',
+      unsupportedContent: '宸插畨瑁濈殑澶栨帥绋嬪紡鐗堟湰涓嶆彁渚涙浣溿��',
+      settings: '鐢ㄦ埗瑷疆',
+      uninstalledLink: '鍦ㄥ鎺涚▼寮忎腑绠$悊',
+      empty: '榛炴搳 銆�+銆� 鎸夐垥娣诲姞宸ュ叿銆傛偍鍙互鏂板澶氬�嬪伐鍏枫��',
+      unsupportedContent2: '鎸夊叐涓嬩互鍒囨彌鐗堟湰銆�',
+      paramsTip1: '鎺у埗 LLM 鎺ㄧ悊鍙冩暩銆�',
+    },
+    actionNum: '{{num}}{{浣渳}鍖呮嫭',
+    switchVersion: 'Switch 鐗堟湰',
+    strategyNum: '{{num}}{{绛栫暐}}鍖呮嫭',
+    endpoints: '绔粸',
+    endpointDisableTip: '绂佺敤绔粸',
+    endpointsTip: '姝ゅ鎺涚▼寮忛�氶亷绲傜绡�榛炴彁渚涚壒瀹氬姛鑳斤紝鎮ㄥ彲浠ョ偤鐣跺墠宸ヤ綔鍗�閰嶇疆澶氬�嬬祩绔瘈榛為泦銆�',
+    modelNum: '{{num}}鍖呭惈鐨勫瀷铏�',
+    endpointsEmpty: '鎸夊叐涓嬨��+銆嶆寜閳曟坊鍔犵榛�',
+    endpointDisableContent: '鎮ㄦ兂绂佺敤 {{name}} 鍡庯紵',
+    configureApp: '閰嶇疆 App',
+    endpointDeleteContent: '鎮ㄦ兂鍒櫎 {{name}} 鍡庯紵',
+    configureTool: '閰嶇疆宸ュ叿',
+    endpointModalDesc: '閰嶇疆鍚庯紝鍗冲彲浣跨敤澶栨帥绋嬪紡閫氶亷 API 绔粸鎻愪緵鐨勫姛鑳姐��',
+    disabled: '绂佺敤',
+    serviceOk: '鏈嶅嫏姝e父',
+    endpointDeleteTip: '鍒櫎绔粸',
+    configureModel: '閰嶇疆妯″瀷',
+    endpointModalTitle: '瑷疆绲傜绡�榛�',
+    endpointsDocLink: '鏌ョ湅鏂囦欢',
+  },
+  debugInfo: {
+    viewDocs: '鏌ョ湅鏂囦欢',
+    title: '瑾胯│',
+  },
+  privilege: {
+    whoCanDebug: '瑾板彲浠ヨ瑭﹀鎺涚▼寮忥紵',
+    whoCanInstall: '瑾板彲浠ュ畨瑁濆拰绠$悊澶栨帥绋嬪紡锛�',
+    noone: '娌掍汉',
+    title: '澶栨帥绋嬪紡棣栭伕闋�',
+    everyone: '姣忓�嬩汉 閮�',
+    admins: '绠$悊鍝�',
+  },
+  pluginInfoModal: {
+    repository: '瀛樺劜搴�',
+    release: '閲嬫斁',
+    title: '澶栨帥绋嬪紡璩囪▕',
+    packageName: '鍖�',
+  },
+  action: {
+    deleteContentRight: '澶栨帥绋嬪紡锛�',
+    deleteContentLeft: '鏄惁瑕佸埅闄�',
+    usedInApps: '姝ゅ鎺涚▼寮忔鍦� {{num}} 鍊嬫噳鐢ㄧ▼寮忎腑浣跨敤銆�',
+    pluginInfo: '澶栨帥绋嬪紡璩囪▕',
+    checkForUpdates: '妾㈡煡鏇存柊',
+    delete: '鍒櫎澶栨帥绋嬪紡',
+  },
+  installModal: {
+    labels: {
+      repository: '瀛樺劜搴�',
+      version: '鐗堟湰',
+      package: '鍖�',
+    },
+    readyToInstallPackage: '鍗冲皣瀹夎浠ヤ笅澶栨帥绋嬪紡',
+    back: '杩斿洖',
+    installFailed: '瀹夎澶辨晽',
+    readyToInstallPackages: '鍗冲皣瀹夎浠ヤ笅 {{num}} 鍊嬪鎺涚▼寮�',
+    next: '涓嬩竴鍊�',
+    dropPluginToInstall: '灏囧鎺涚▼寮忓寘鎷栨斁鍒版铏曢�茶瀹夎',
+    pluginLoadError: '澶栨帥绋嬪紡杓夊叆閷',
+    installedSuccessfully: '瀹夎鎴愬姛',
+    uploadFailed: '涓婂偝澶辨晽',
+    installFailedDesc: '澶栨帥绋嬪紡瀹夎澶辨晽銆�',
+    fromTrustSource: '璜嬬⒑淇濇偍鍙緸<trustSource>鍙椾俊浠荤殑渚嗘簮</trustSource>瀹夎澶栨帥绋嬪紡銆�',
+    pluginLoadErrorDesc: '姝ゅ鎺涚▼寮忓皣涓嶆渻琚畨瑁�',
+    installComplete: '瀹夎瀹屾垚',
+    install: '瀹夎',
+    installedSuccessfullyDesc: '澶栨帥绋嬪紡宸叉垚鍔熷畨瑁濄��',
+    close: '闂滈枆',
+    uploadingPackage: '姝e湪涓婂偝 {{packageName}}...',
+    readyToInstall: '鍗冲皣瀹夎浠ヤ笅澶栨帥绋嬪紡',
+    cancel: '鍙栨秷',
+    installPlugin: '瀹夎澶栨帥绋嬪紡',
+    installing: '瀹夎銆傘�傘��',
+  },
+  installFromGitHub: {
+    gitHubRepo: 'GitHub 鍎插瓨搴�',
+    selectPackagePlaceholder: '璜嬮伕鎿囦竴鍊嬪椁�',
+    installFailed: '瀹夎澶辨晽',
+    uploadFailed: '涓婂偝澶辨晽',
+    selectVersion: '閬告搰鐗堟湰',
+    selectVersionPlaceholder: '璜嬮伕鎿囦竴鍊嬬増鏈�',
+    updatePlugin: '寰� GitHub 鏇存柊澶栨帥绋嬪紡',
+    installPlugin: '寰� GitHub 瀹夎澶栨帥绋嬪紡',
+    installedSuccessfully: '瀹夎鎴愬姛',
+    selectPackage: '閬告搰濂楅',
+    installNote: '璜嬬⒑淇濇偍鍙緸鍙椾俊浠荤殑渚嗘簮瀹夎澶栨帥绋嬪紡銆�',
+  },
+  upgrade: {
+    close: '闂滈枆',
+    title: '瀹夎澶栨帥绋嬪紡',
+    upgrade: '瀹夎',
+    upgrading: '瀹夎銆傘�傘��',
+    description: '鍗冲皣瀹夎浠ヤ笅澶栨帥绋嬪紡',
+    usedInApps: '鐢ㄦ柤 {{num}} 鍊嬫噳鐢�',
+    successfulTitle: '瀹夎鎴愬姛',
+  },
+  error: {
+    noReleasesFound: '鏈壘鍒扮増鏈�傝珛妾㈡煡 GitHub 鍎插瓨搴垨杓稿叆 URL銆�',
+    fetchReleasesError: '鐒℃硶妾㈢储鐧艰鐗堛�傝珛绋嶅緦閲嶈│銆�',
+    inValidGitHubUrl: 'GitHub URL 鐒℃晥銆傝珛杓稿叆鏈夋晥鐨� URL锛屾牸寮忕偤锛歨ttps://github.com/owner/repo',
+  },
+  marketplace: {
+    sortOption: {
+      recentlyUpdated: '鏈�杩戞洿鏂�',
+      newlyReleased: '鏂扮櫦浣�',
+      firstReleased: '棣栨鐧间綀',
+      mostPopular: '鏈�鍙楁杩�',
+    },
+    discover: '鐧肩従',
+    noPluginFound: '鏈壘鍒板鎺涚▼寮�',
+    empower: '鐐烘偍鐨� AI 闁嬬櫦鎻愪緵鏀彺',
+    moreFrom: '渚嗚嚜 Marketplace 鐨勬洿澶氬収瀹�',
+    and: '鍜�',
+    sortBy: '榛戝煄',
+    viewMore: '鏌ョ湅鏇村',
+    difyMarketplace: 'Dify 甯傚牬',
+    pluginsResult: '{{num}} 鍊嬬祼鏋�',
+    verifiedTip: '鐢盌ify椹楄瓑',
+    partnerTip: '鐢� Dify 鍚堜綔澶ヤ即椹楄瓑',
+  },
+  task: {
+    installingWithError: '瀹夎 {{installingLength}} 鍊嬫彃浠讹紝{{successLength}} 鎴愬姛锛寋{errorLength}} 澶辨晽',
+    installedError: '{{errorLength}} 鍊嬪鎺涚▼寮忓畨瑁濆け鏁�',
+    installError: '{{errorLength}} 鍊嬪鎺涚▼寮忓畨瑁濆け鏁楋紝榛炴搳鏌ョ湅',
+    installingWithSuccess: '瀹夎 {{installingLength}} 鍊嬫彃浠讹紝{{successLength}} 鎴愬姛銆�',
+    clearAll: '鍏ㄩ儴娓呴櫎',
+    installing: '瀹夎 {{installingLength}} 鍊嬪鎺涚▼寮忥紝0 鍊嬪畬鎴愩��',
+  },
+  submitPlugin: '鎻愪氦澶栨帥绋嬪紡',
+  findMoreInMarketplace: '鍦� Marketplace 涓煡鎵炬洿澶氬収瀹�',
+  installPlugin: '瀹夎澶栨帥绋嬪紡',
+  search: '鎼滅储',
+  allCategories: '鍏ㄩ儴鍒嗛',
+  from: '寰�',
+  searchPlugins: '鎼滅储澶栨帥绋嬪紡',
+  searchTools: '鎼滃皨宸ュ叿...',
+  installAction: '瀹夎',
+  installFrom: '瀹夎璧峰浣嶇疆',
+  searchInMarketplace: '鍦� Marketplace 涓悳绱�',
+  install: '{{num}} 娆″畨瑁�',
+  endpointsEnabled: '{{num}} 绲勫凡鍟熺敤绔粸',
+  fromMarketplace: '寰� Marketplace',
+  searchCategories: '鎼滅储椤炲垾',
+  metadata: {
+    title: '鎻掍欢',
+  },
+  difyVersionNotCompatible: '鐣跺墠鐨� Dify 鐗堟湰鑸囨鎻掍欢涓嶅吋瀹癸紝璜嬪崌绱氳嚦鎵�闇�鐨勬渶浣庣増鏈細{{minimalDifyVersion}}',
+}
+
+export default translation
diff --git a/i18n/zh-Hant/register.ts b/i18n/zh-Hant/register.ts
new file mode 100644
index 0000000..9286494
--- /dev/null
+++ b/i18n/zh-Hant/register.ts
@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation
diff --git a/i18n/zh-Hant/run-log.ts b/i18n/zh-Hant/run-log.ts
new file mode 100644
index 0000000..c3bfb54
--- /dev/null
+++ b/i18n/zh-Hant/run-log.ts
@@ -0,0 +1,31 @@
+const translation = {
+  input: '杓稿叆',
+  result: '绲愭灉',
+  detail: '瑭虫儏',
+  tracing: '杩借工',
+  resultPanel: {
+    status: '鐙�鎱�',
+    time: '鍩疯鏅傞枔',
+    tokens: '绺� token 鏁�',
+  },
+  meta: {
+    title: '鍏冭硣鏂�',
+    status: '鐙�鎱�',
+    version: '鐗堟湰',
+    executor: '鍩疯浜�',
+    startTime: '闁嬪鏅傞枔',
+    time: '鍩疯鏅傞枔',
+    tokens: '绺� token 鏁�',
+    steps: '鍩疯姝ユ暩',
+  },
+  resultEmpty: {
+    title: '鏈亱琛屽儏杓稿嚭 JSON 鏍煎紡锛�',
+    tipLeft: '璜嬪埌',
+    link: '瑭崇窗璩囪▕闈㈡澘',
+    tipRight: '鏌ョ湅瀹冦��',
+  },
+  circularInvocationTip: '鐣跺墠宸ヤ綔娴佷腑瀛樺湪宸ュ叿/绡�榛炵殑杩村湀瑾跨敤銆�',
+  actionLogs: '浣滄棩瑾�',
+}
+
+export default translation
diff --git a/i18n/zh-Hant/share-app.ts b/i18n/zh-Hant/share-app.ts
new file mode 100644
index 0000000..bf81582
--- /dev/null
+++ b/i18n/zh-Hant/share-app.ts
@@ -0,0 +1,78 @@
+const translation = {
+  common: {
+    welcome: '',
+    appUnavailable: '鎳夌敤涓嶅彲鐢�',
+    appUnknownError: '鎳夌敤涓嶅彲鐢�',
+  },
+  chat: {
+    newChat: '鏂板皪瑭�',
+    pinnedTitle: '宸茬疆闋�',
+    unpinnedTitle: '灏嶈┍鍒楄〃',
+    newChatDefaultName: '鏂扮殑灏嶈┍',
+    resetChat: '閲嶇疆灏嶈┍',
+    poweredBy: 'Powered by',
+    prompt: '鎻愮ず瑭�',
+    privatePromptConfigTitle: '灏嶈┍瑷畾',
+    publicPromptConfigTitle: '灏嶈┍鍓嶆彁绀鸿',
+    configStatusDes: '闁嬪鍓嶏紝鎮ㄥ彲浠ヤ慨鏀瑰皪瑭辫ō瀹�',
+    configDisabled: '姝ゆ鏈冭┍宸蹭娇鐢ㄤ笂娆℃渻瑭辫〃鍠�',
+    startChat: '闁嬪灏嶈┍',
+    privacyPolicyLeft: '璜嬮柋璁�鐢辫┎鎳夌敤闁嬬櫦鑰呮彁渚涚殑',
+    privacyPolicyMiddle: '闅辩鏀跨瓥',
+    privacyPolicyRight: '銆�',
+    deleteConversation: {
+      title: '鍒櫎灏嶈┍',
+      content: '鎮ㄧ⒑瀹氳鍒櫎姝ゅ皪瑭卞棊锛�',
+    },
+    tryToSolve: '鍢楄│瑙f焙',
+    temporarySystemIssue: '鎶辨瓑锛岃嚚鏅傜郴绲卞晱椤屻��',
+    expand: '灞曢枊',
+    collapse: '鎽虹枈',
+    newChatTip: '宸茬稉鍦ㄤ竴鍊嬫柊鑱婂ぉ涓�',
+    chatSettingsTitle: '鏂扮殑鑱婂ぉ瑷疆',
+    chatFormTip: '鑱婂ぉ瑷畾鍦ㄨ亰澶╅枊濮嬪緦鐒℃硶淇敼銆�',
+    viewChatSettings: '鏌ョ湅鑱婂ぉ瑷畾',
+  },
+  generation: {
+    tabs: {
+      create: '鍩疯涓�娆�',
+      batch: '鎵规鍩疯',
+      saved: '宸插劜瀛�',
+    },
+    savedNoData: {
+      title: '鎮ㄩ倓娌掓湁鍎插瓨绲愭灉锛�',
+      description: '闁嬪鐢熸垚鍏у锛屾偍鍙互鍦ㄩ�欒!鎵惧埌鍎插瓨鐨勭祼鏋溿��',
+      startCreateContent: '闁嬪鐢熸垚鍏у',
+    },
+    title: 'AI 鏅烘収鏇稿',
+    queryTitle: '鏌ヨ鍏у',
+    completionResult: '鐢熸垚绲愭灉',
+    queryPlaceholder: '璜嬭几鍏ユ枃瀛楀収瀹�',
+    run: '鍩疯',
+    copy: '瑜囪=',
+    resultTitle: 'AI 鏇稿',
+    noData: 'AI 鏈冨湪閫欒!绲︿綘椹氬枩銆�',
+    csvUploadTitle: '灏囨偍鐨� CSV 妾旀鎷栨斁鍒版铏曪紝鎴�',
+    browse: '鐎忚',
+    csvStructureTitle: 'CSV 妾旀蹇呴爤绗﹀悎浠ヤ笅绲愭锛�',
+    downloadTemplate: '涓嬭級妯℃澘',
+    field: '',
+    batchFailed: {
+      info: '{{num}} 娆″煼琛屽け鏁�',
+      retry: '閲嶈│',
+      outputPlaceholder: '鐒¤几鍑哄収瀹�',
+    },
+    errorMsg: {
+      empty: '涓婂偝妾旀鐨勫収瀹逛笉鑳界偤绌�',
+      fileStructNotMatch: '涓婂偝妾旀鐨勫収瀹硅垏绲愭涓嶅尮閰�',
+      emptyLine: '绗� {{rowIndex}} 琛岀殑鍏у鐐虹┖',
+      invalidLine: '绗� {{rowIndex}} 琛�: {{varName}}鍊煎繀濉�',
+      moreThanMaxLengthLine: '绗� {{rowIndex}} 琛�: {{varName}}鍊艰秴閬庢渶澶ч暦搴� {{maxLength}}',
+      atLeastOne: '涓婂偝妾旀鐨勫収瀹逛笉鑳藉皯鏂间竴姊�',
+    },
+    execution: '鍩疯',
+    executions: '{{num}} 鍩疯',
+  },
+}
+
+export default translation
diff --git a/i18n/zh-Hant/time.ts b/i18n/zh-Hant/time.ts
new file mode 100644
index 0000000..3be2511
--- /dev/null
+++ b/i18n/zh-Hant/time.ts
@@ -0,0 +1,37 @@
+const translation = {
+  daysInWeek: {
+    Tue: '鏄熸湡浜�',
+    Wed: '鏄熸湡涓�',
+    Fri: '鑷敱',
+    Mon: '鎳峰康',
+    Sun: '澶櫧',
+    Sat: '鏄熸湡鍏�',
+    Thu: '鏄熸湡鍥�',
+  },
+  months: {
+    January: '涓�鏈�',
+    June: '鍏湀',
+    March: '涓夋湀',
+    February: '浜屾湀',
+    August: '鍏湀',
+    April: '鍥涙湀',
+    May: '浜旀湀',
+    July: '涓冩湀',
+    November: '鍗佷竴鏈�',
+    December: '鍗佷簩鏈�',
+    September: '涔濇湀',
+    October: '鍗佹湀',
+  },
+  operation: {
+    cancel: '鍙栨秷',
+    now: '鐝惧湪',
+    ok: '濂�',
+    pickDate: '閬告搰鏃ユ湡',
+  },
+  title: {
+    pickTime: '閬告搰鏅傞枔',
+  },
+  defaultPlaceholder: '閬告搰涓�鍊嬫檪闁�...',
+}
+
+export default translation
diff --git a/i18n/zh-Hant/tools.ts b/i18n/zh-Hant/tools.ts
new file mode 100644
index 0000000..c4ffb4f
--- /dev/null
+++ b/i18n/zh-Hant/tools.ts
@@ -0,0 +1,158 @@
+const translation = {
+  title: '宸ュ叿',
+  createCustomTool: '寤虹珛鑷畾缇╁伐鍏�',
+  type: {
+    all: '鍏ㄩ儴',
+    builtIn: '鍏у缓',
+    custom: '鑷畾缇�',
+    workflow: '宸ヤ綔娴�',
+  },
+  contribute: {
+    line1: '鎴戞湁鑸堣叮鐐� ',
+    line2: 'Dify 璨㈢嵒宸ュ叿銆�',
+    viewGuide: '妾㈣鎸囧崡',
+  },
+  author: '浣滆��',
+  auth: {
+    unauthorized: '鍘绘巿娆�',
+    authorized: '宸叉巿娆�',
+    setup: '瑕佷娇鐢ㄨ珛鍏堟巿娆�',
+    setupModalTitle: '瑷畾鎺堟瑠',
+    setupModalTitleDescription: '閰嶇疆鎲戞摎寰岋紝宸ヤ綔鍗�涓殑鎵�鏈夋垚鍝¢兘鍙互鍦ㄧ法鎺掓噳鐢ㄧ▼寮忔檪浣跨敤姝ゅ伐鍏枫��',
+  },
+  includeToolNum: '鍖呭惈 {{num}} 鍊嬪伐鍏�',
+  addTool: '鏂板宸ュ叿',
+  createTool: {
+    title: '寤虹珛鑷畾缇╁伐鍏�',
+    editAction: '绶ㄨ集',
+    editTitle: '绶ㄨ集鑷畾缇╁伐鍏�',
+    name: '鍚嶇ū',
+    toolNamePlaceHolder: '杓稿叆宸ュ叿鍚嶇ū',
+    schema: 'Schema',
+    schemaPlaceHolder: '鍦ㄦ铏曡几鍏ユ偍鐨� OpenAPI schema',
+    viewSchemaSpec: '妾㈣ OpenAPI-Swagger 瑕忕瘎',
+    importFromUrl: '寰� URL 涓尟鍏�',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: '璜嬭几鍏ユ湁鏁堢殑 URL',
+    examples: '渚嬪瓙',
+    exampleOptions: {
+      json: '澶╂埃(JSON)',
+      yaml: '瀵电墿鍟嗗簵(YAML)',
+      blankTemplate: '绌虹櫧妯$増',
+    },
+    availableTools: {
+      title: '鍙敤宸ュ叿',
+      name: '鍚嶇ū',
+      description: '鎻忚堪',
+      method: '鏂规硶',
+      path: '璺緫',
+      action: '鎿嶄綔',
+      test: '娓│',
+    },
+    authMethod: {
+      title: '閼戞瑠鏂规硶',
+      type: '閼戞瑠鍨嬪垾',
+      keyTooltip: 'HTTP 闋儴鍚嶇ū锛屽鏋滀綘涓嶇煡閬撴槸浠�楹硷紝鍙互灏囧叾淇濈暀鐐� Authorization 鎴栬ō瀹氱偤鑷畾缇╁��',
+      types: {
+        none: '鐒�',
+        api_key: 'API Key',
+        apiKeyPlaceholder: 'HTTP 闋儴鍚嶇ū锛岀敤鏂煎偝閬� API Key',
+        apiValuePlaceholder: '杓稿叆 API Key',
+      },
+      key: '閸�',
+      value: '鍊�',
+    },
+    authHeaderPrefix: {
+      title: '閼戞瑠闋儴瀛楅',
+      types: {
+        basic: 'Basic',
+        bearer: 'Bearer',
+        custom: 'Custom',
+      },
+    },
+    privacyPolicy: '闅辩鍗旇',
+    privacyPolicyPlaceholder: '璜嬭几鍏ラ毐绉佸崝璀�',
+    customDisclaimer: '鑷畾缇╁厤璨伈鏄�',
+    customDisclaimerPlaceholder: '璜嬭几鍏ヨ嚜瀹氱京鍏嶈铂鑱叉槑',
+    deleteToolConfirmTitle: '鍒櫎閫欏�嬪伐鍏凤紵',
+    deleteToolConfirmContent: '鍒櫎宸ュ叿鏄笉鍙�嗙殑銆傜敤鎴跺皣鐒℃硶鍐嶈í鍟忔偍鐨勫伐鍏枫��',
+    toolInput: {
+      labelPlaceholder: '閬告搰妯欑堡锛堥伕鎿囨绫わ級',
+      label: '妯欑堡',
+      required: '蹇呭~',
+      methodSettingTip: '鐢ㄦ埗濉宸ュ叿閰嶇疆',
+      name: '鍚嶅瓧',
+      description: '鎻忚堪',
+      methodParameterTip: '鎺ㄧ悊鏈熼枔 LLM 濉厖',
+      method: '鏂规硶',
+      title: '宸ュ叿杓稿叆',
+      methodSetting: '瑷疆',
+      methodParameter: '鍙冩暩',
+      descriptionPlaceholder: '鍙冩暩鍚京鐨勬弿杩�',
+    },
+    description: '鎻忚堪',
+    nameForToolCall: '宸ュ叿瑾跨敤鍚嶇ū',
+    confirmTitle: '纰鸿獚鍎插瓨 锛�',
+    descriptionPlaceholder: '宸ュ叿鐢ㄩ�旂殑绨¤鎻忚堪锛屼緥濡傦紝鐛插彇鐗瑰畾浣嶇疆鐨勬韩搴︺��',
+    nameForToolCallTip: '鍍呮敮鎻存暩浣嶃�佸瓧姣嶅拰涓嬪妰绶氥��',
+    confirmTip: '浣跨敤姝ゅ伐鍏风殑鎳夌敤绋嬪紡灏囧彈鍒板奖闊�',
+    nameForToolCallPlaceHolder: '鐢ㄦ柤姗熷櫒璀樺垾锛屼緥濡� getCurrentWeather銆乴ist_pets',
+  },
+  test: {
+    title: '娓│',
+    parametersValue: '寮曟暩鍜屽��',
+    parameters: '寮曟暩',
+    value: '鍊�',
+    testResult: '娓│绲愭灉',
+    testResultPlaceholder: '娓│绲愭灉灏囬’绀哄湪閫欒!',
+  },
+  thought: {
+    using: '姝e湪浣跨敤',
+    used: '宸蹭娇鐢�',
+    requestTitle: '璜嬫眰渚嗚嚜',
+    responseTitle: '闊挎噳渚嗚嚜',
+  },
+  setBuiltInTools: {
+    info: '璩囪▕',
+    setting: '瑷畾',
+    toolDescription: '宸ュ叿鎻忚堪',
+    parameters: '寮曟暩',
+    string: '瀛椾覆',
+    number: '鏁稿瓧',
+    required: '蹇呭~',
+    infoAndSetting: '璩囪▕鍜岃ō瀹�',
+    file: '妾�',
+  },
+  noCustomTool: {
+    title: '娌掓湁鑷畾缇╁伐鍏�!',
+    content: '鍦ㄦ绲变竴鏂板鍜岀鐞嗕綘鐨勮嚜瀹氱京宸ュ叿锛屾柟渚挎寤烘噳鐢ㄦ檪浣跨敤銆�',
+    createTool: '寤虹珛宸ュ叿',
+  },
+  noSearchRes: {
+    title: '鎶辨瓑锛屾矑鏈夌祼鏋滐紒',
+    content: '鎴戝�戞壘涓嶅埌浠讳綍鑸囨偍鐨勬悳灏嬬浉鍖归厤鐨勫伐鍏枫��',
+    reset: '閲嶇疆鎼滃皨',
+  },
+  builtInPromptTitle: '鎻愮ず瑭�',
+  toolRemoved: '宸ュ叿宸茶绉婚櫎',
+  notAuthorized: '宸ュ叿鏈巿娆�',
+  howToGet: '濡備綍鐛插彇',
+  addToolModal: {
+    add: '鍔�',
+    type: '椤炲瀷',
+    added: '娣诲姞',
+    manageInTools: '鍦ㄥ伐鍏蜂腑绠$悊',
+    category: '椤炲垾',
+    emptyTitle: '娌掓湁鍙敤鐨勫伐浣滄祦绋嬪伐鍏�',
+    emptyTip: '杞夊埌鈥滃伐浣滄祦 - >鐧间綀鐐哄伐鍏封��',
+    emptyTipCustom: '鍓靛缓鑷▊宸ュ叿',
+    emptyTitleCustom: '娌掓湁鍙敤鐨勮嚜瑷傚伐鍏�',
+  },
+  customToolTip: '鐬В鏈夐棞 Dify 鑷▊宸ュ叿鐨勬洿澶氳硣瑷�',
+  toolNameUsageTip: '鐢ㄦ柤浠g悊鎺ㄧ悊鍜屾彁绀虹殑宸ュ叿瑾跨敤鍚嶇ū',
+  openInStudio: '鍦� Studio 涓墦闁�',
+  noTools: '鏈壘鍒板伐鍏�',
+  copyToolName: '瑜囪=鍚嶇ū',
+}
+
+export default translation
diff --git a/i18n/zh-Hant/workflow.ts b/i18n/zh-Hant/workflow.ts
new file mode 100644
index 0000000..9a4d7f2
--- /dev/null
+++ b/i18n/zh-Hant/workflow.ts
@@ -0,0 +1,921 @@
+const translation = {
+  common: {
+    undo: '寰╁師',
+    redo: '閲嶅仛',
+    editing: '绶ㄨ集涓�',
+    autoSaved: '鑷嫊淇濆瓨',
+    unpublished: '鏈櫦浣�',
+    published: '宸茬櫦浣�',
+    publish: '鐧间綀',
+    update: '鏇存柊',
+    run: '閬嬭',
+    running: '閬嬭涓�',
+    inRunMode: '鍦ㄩ亱琛屾ā寮忎腑',
+    inPreview: '闋愯涓�',
+    inPreviewMode: '闋愯涓�',
+    preview: '闋愯',
+    viewRunHistory: '鏌ョ湅閬嬭姝峰彶',
+    runHistory: '閬嬭姝峰彶',
+    goBackToEdit: '杩斿洖绶ㄨ集妯″紡',
+    conversationLog: '灏嶈┍瑷橀寗',
+    features: '鍔熻兘',
+    debugAndPreview: '闋愯',
+    restart: '閲嶆柊闁嬪',
+    currentDraft: '鐣跺墠鑽夌',
+    currentDraftUnpublished: '鐣跺墠鑽夌鏈櫦浣�',
+    latestPublished: '鏈�鏂扮櫦浣�',
+    publishedAt: '鐧间綀鏂�',
+    restore: '鎭㈠京',
+    runApp: '閬嬭',
+    batchRunApp: '鎵归噺閬嬭',
+    accessAPIReference: '瑷晱 API',
+    embedIntoSite: '宓屽叆缍茬珯',
+    addTitle: '娣诲姞妯欓...',
+    addDescription: '娣诲姞鎻忚堪...',
+    noVar: '娌掓湁璁婇噺',
+    variableNamePlaceholder: '璁婇噺鍚�',
+    searchVar: '鎼滅储璁婇噺',
+    setVarValuePlaceholder: '瑷疆璁婇噺鍊�',
+    needConnectTip: '姝ょ瘈榛炲皻鏈�f帴鍒板叾浠栫瘈榛�',
+    maxTreeDepth: '姣忓�嬪垎鏀渶澶ч檺鍒� {{depth}} 鍊嬬瘈榛�',
+    needEndNode: '蹇呴爤娣诲姞绲愭潫绡�榛�',
+    needAnswerNode: '蹇呴爤娣诲姞鐩存帴鍥炶绡�榛�',
+    workflowProcess: '宸ヤ綔娴�',
+    notRunning: '灏氭湭閬嬭',
+    previewPlaceholder: '鍦ㄤ笅闈㈢殑妗嗕腑杓稿叆鍏у闁嬪瑾胯│鑱婂ぉ姗熷櫒浜�',
+    effectVarConfirm: {
+      title: '绉婚櫎璁婇噺',
+      content: '瑭茶畩閲忓湪鍏朵粬绡�榛炰腑浣跨敤銆傛偍鏄惁浠嶈鍒櫎瀹冿紵',
+    },
+    insertVarTip: '鎸� \'/\' 閸靛揩閫熸彃鍏�',
+    processData: '鏁告摎铏曠悊',
+    input: '杓稿叆',
+    output: '杓稿嚭',
+    jinjaEditorPlaceholder: '杓稿叆 鈥�/鈥� 鎴� 鈥渰鈥� 鎻掑叆璁婇噺',
+    viewOnly: '鍙畝',
+    showRunHistory: '椤ず閬嬭姝峰彶',
+    enableJinja: '闁嬪暉鏀寔 Jinja 妯℃澘',
+    learnMore: '浜嗚В鏇村',
+    copy: '鎷疯矟',
+    duplicate: '瑜囪=',
+    addBlock: '娣诲姞绡�榛�',
+    pasteHere: '绮樿布鍒伴�欒!',
+    pointerMode: '鎸囬嚌妯″紡',
+    handMode: '鎵嬫ā寮�',
+    model: '妯″瀷',
+    workflowAsTool: '鐧间綀鐐哄伐鍏�',
+    configureRequired: '闇�瑕侀�茶閰嶇疆',
+    configure: '閰嶇疆',
+    manageInTools: '瑷晱宸ュ叿闋�',
+    workflowAsToolTip: '宸ヤ綔娴佹洿鏂板緦闇�瑕侀噸鏂伴厤缃伐鍏峰弮鏁�',
+    viewDetailInTracingPanel: '鏌ョ湅瑭崇窗淇℃伅',
+    importDSL: '灏庡叆 DSL',
+    backupCurrentDraft: 'Backup Current Draft',
+    overwriteAndImport: '瑕嗚搵鍜屽皫鍏�',
+    importSuccess: '灏庡叆鎴愬姛',
+    chooseDSL: '閬告搰 DSL锛坹ml锛� 妾�',
+    syncingData: '鍚屾鏁告摎锛屽彧闇�骞剧閻樸��',
+    importDSLTip: '鐣跺墠鑽夌灏囪瑕嗚搵銆傚湪灏庡叆涔嬪墠灏囧伐浣滄祦鍖嚭鐐哄倷浠姐��',
+    importFailure: '鍖叆澶辨晽',
+    parallelTip: {
+      click: {
+        title: '榛炴搳',
+        desc: '娣诲姞',
+      },
+      drag: {
+        title: '鎷栧姩',
+        desc: '閫f帴',
+      },
+      limit: '涓﹁搴﹀儏闄愭柤 {{num}} 鍊嬪垎鏀��',
+      depthLimit: '涓﹁宓屽灞ら檺鍒剁偤 {{num}} 鍊嬪堡',
+    },
+    parallelRun: '涓﹁閬嬭',
+    disconnect: '鏂烽枊',
+    jumpToNode: '璺宠綁鍒版绡�榛�',
+    addParallelNode: '娣诲姞涓﹁绡�榛�',
+    parallel: '涓﹁',
+    branch: '鍒嗘敮',
+    featuresDocLink: '鐬В鏇村璩囪▕',
+    fileUploadTip: '鍦栫墖涓婂偝鍔熻兘宸插崌绱氱偤妾斾笂鍌炽��',
+    ImageUploadLegacyTip: '鐝惧湪锛屾偍鍙互鍦ㄨ捣濮嬭〃鍠腑鍓靛缓妾旀椤炲瀷璁婃暩銆傛垜鍊戝皣渚嗕笉鍐嶆敮鎸佸湒鐗囦笂鍌冲姛鑳姐��',
+    featuresDescription: '澧炲挤 Web 鎳夌敤绋嬪紡鐢ㄦ埗楂旈',
+    importWarning: '璎规厧',
+    importWarningDetails: 'DSL 鐗堟湰宸暟鍙兘鏈冨奖闊挎煇浜涘姛鑳�',
+    openInExplore: '鍦ㄢ�滄帰绱⑩�濅腑鎵撻枊',
+    onFailure: '澶辨晽鏅�',
+    addFailureBranch: '娣诲姞 Fail Branch',
+    loadMore: '杓夊叆鏇村宸ヤ綔娴�',
+    noHistory: '鐒℃鍙茶閷�',
+    publishUpdate: '鐧煎竷鏇存柊',
+    referenceVar: '鍙冭�冭畩閲�',
+    exportSVG: '鍖嚭鐐篠VG',
+    exportPNG: '鍖嚭鐐� PNG',
+    noExist: '娌掓湁閫欏�嬭畩鏁�',
+    versionHistory: '鐗堟湰姝峰彶',
+    exitVersions: '閫�鍑虹増鏈�',
+    exportImage: '鍖嚭鍦栧儚',
+    exportJPEG: '鍖嚭鐐篔PEG',
+  },
+  env: {
+    envPanelTitle: '鐠板璁婃暩',
+    envDescription: '鐠板璁婃暩鍙敤鏂煎瓨鍎茬浜轰俊鎭拰鎲戣瓑銆傚畠鍊戞槸鍞畝鐨勶紝涓︿笖鍙互鍦ㄥ皫鍑烘檪鑸嘍SL鏂囦欢鍒嗛枊銆�',
+    envPanelButton: '娣诲姞璁婃暩',
+    modal: {
+      title: '娣诲姞鐠板璁婃暩',
+      editTitle: '绶ㄨ集鐠板璁婃暩',
+      type: '椤炲瀷',
+      name: '鍚嶇ū',
+      namePlaceholder: '鐠板鍚嶇ū',
+      value: '鍊�',
+      valuePlaceholder: '鐠板鍊�',
+      secretTip: '鐢ㄦ柤瀹氱京鏁忔劅淇℃伅鎴栨暩鎿氾紝DSL瑷疆閰嶇疆鐐洪槻姝㈡穿闇层��',
+    },
+    export: {
+      title: '灏庡嚭姗熷瘑鐠板璁婃暩锛�',
+      checkbox: '灏庡嚭姗熷瘑鍊�',
+      ignore: '灏庡嚭DSL',
+      export: '灏庡嚭甯舵湁姗熷瘑鍊肩殑DSL',
+    },
+  },
+  chatVariable: {
+    panelTitle: '灏嶈┍璁婃暩',
+    panelDescription: '灏嶈┍璁婃暩鐢ㄦ柤鍎插瓨 LLM 闇�瑕佽浣忕殑浜掑嫊璩囪▕锛屽寘鎷皪瑭辨鍙层�佷笂鍌崇殑妾旀銆佷娇鐢ㄨ�呭亸濂界瓑銆傞�欎簺璁婃暩鍙畝瀵��',
+    docLink: '鏌ョ湅鎴戝�戠殑鏂囦欢浠ヤ簡瑙f洿澶氥��',
+    button: '鏂板璁婃暩',
+    modal: {
+      title: '鏂板灏嶈┍璁婃暩',
+      editTitle: '绶ㄨ集灏嶈┍璁婃暩',
+      name: '鍚嶇ū',
+      namePlaceholder: '璁婃暩鍚嶇ū',
+      type: '椤炲瀷',
+      value: '闋愯ō鍊�',
+      valuePlaceholder: '闋愯ō鍊硷紝鐣欑┖鍓囦笉瑷畾',
+      description: '鎻忚堪',
+      descriptionPlaceholder: '鎻忚堪姝よ畩鏁�',
+      editInJSON: '浠� JSON 绶ㄨ集',
+      oneByOne: '閫愪竴鏂板',
+      editInForm: '鍦ㄨ〃鍠腑绶ㄨ集',
+      arrayValue: '鍊�',
+      addArrayValue: '鏂板鍊�',
+      objectKey: '閸�',
+      objectType: '椤炲瀷',
+      objectValue: '闋愯ō鍊�',
+    },
+    storedContent: '宸插劜瀛樺収瀹�',
+    updatedAt: '鏇存柊鏂� ',
+  },
+  changeHistory: {
+    title: '璁婃洿灞ユ',
+    placeholder: '灏氭湭鏇存敼浠讳綍鍏у',
+    clearHistory: '娓呴櫎姝峰彶瑷橀寗',
+    hint: '鎻愮ず',
+    hintText: '鎮ㄧ殑绶ㄨ集鎿嶄綔灏囪璺熻釜涓﹀瓨鍎插湪鎮ㄧ殑瑷倷涓婏紝鐩村埌鎮ㄩ洟闁嬬法杓櫒銆傛姝峰彶瑷橀寗灏囧湪鎮ㄩ洟闁嬬法杓櫒鏅傝娓呴櫎銆�',
+    stepBackward_one: '{{count}} 姝ュ緦閫�',
+    stepBackward_other: '{{count}} 姝ュ緦閫�',
+    stepForward_one: '{{count}} 姝ュ墠閫�',
+    stepForward_other: '{{count}} 姝ュ墠閫�',
+    sessionStart: '鏈冭┍闁嬪',
+    currentState: '鐣跺墠鐙�鎱�',
+    nodeTitleChange: '鍗�濉婃椤屽凡鏇存敼',
+    nodeDescriptionChange: '鍗�濉婃弿杩板凡鏇存敼',
+    nodeDragStop: '鍗�濉婂凡绉诲嫊',
+    nodeChange: '鍗�濉婂凡鏇存敼',
+    nodeConnect: '鍗�濉婂凡閫f帴',
+    nodePaste: '鍗�濉婂凡绮樿布',
+    nodeDelete: '鍗�濉婂凡鍒櫎',
+    nodeAdd: '鍗�濉婂凡娣诲姞',
+    nodeResize: '鍗�濉婂凡瑾挎暣澶у皬',
+    noteAdd: '瑷婚噵宸叉坊鍔�',
+    noteChange: '瑷婚噵宸叉洿鏀�',
+    edgeDelete: '鍗�濉婂凡鏂烽枊閫f帴',
+    noteDelete: '瑷婚噵宸插埅闄�',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 涓嶈兘鐐虹┖',
+    authRequired: '璜嬪厛鎺堟瑠',
+    invalidJson: '{{field}} 鏄潪娉曠殑 JSON',
+    fields: {
+      variable: '璁婇噺鍚�',
+      variableValue: '璁婇噺鍊�',
+      code: '浠g⒓',
+      model: '妯″瀷',
+      rerankModel: 'Rerank 妯″瀷',
+      visionVariable: 'Vision Variable',
+    },
+    invalidVariable: '鐒℃晥鐨勮畩閲�',
+    rerankModelRequired: '鍦ㄩ枊鍟� Rerank 妯″瀷涔嬪墠锛岃珛鍦ㄨō缃腑纰鸿獚妯″瀷閰嶇疆鎴愬姛銆�',
+    toolParameterRequired: '{{field}}锛� 鍙傛暩 [{{param}}] 鐐哄繀濉爡',
+    noValidTool: '{{field}} 鏈伕鎿囨湁鏁堝伐鍏�',
+  },
+  singleRun: {
+    testRun: '娓│閬嬭',
+    startRun: '闁嬪閬嬭',
+    running: '閬嬭涓�',
+    testRunIteration: '娓│閬嬭杩唬',
+    back: '杩斿洖',
+    iteration: '杩唬',
+    loop: '寰挵',
+  },
+  tabs: {
+    'searchBlock': '鎼滅储绡�榛�',
+    'blocks': '绡�榛�',
+    'tools': '宸ュ叿',
+    'allTool': '鍏ㄩ儴',
+    'builtInTool': '鍏х疆',
+    'customTool': '鑷畾缇�',
+    'workflowTool': '宸ヤ綔娴�',
+    'question-understand': '鍟忛鐞嗚В',
+    'logic': '閭忚集',
+    'transform': '杞夋彌',
+    'utilities': '宸ュ叿',
+    'noResult': '鏈壘鍒板尮閰嶉爡',
+    'searchTool': '鎼滅储宸ュ叿',
+    'agent': '浠g悊绛栫暐',
+    'plugin': '澶栨帥绋嬪紡',
+  },
+  blocks: {
+    'start': '闁嬪',
+    'end': '绲愭潫',
+    'answer': '鐩存帴鍥炶',
+    'llm': 'LLM',
+    'knowledge-retrieval': '鐭ヨ瓨妾㈢储',
+    'question-classifier': '鍟忛鍒嗛鍣�',
+    'if-else': '姊濅欢鍒嗘敮',
+    'code': '浠g⒓鍩疯',
+    'template-transform': '妯℃澘杞夋彌',
+    'http-request': 'HTTP 璜嬫眰',
+    'variable-assigner': '璁婇噺鑱氬悎鍣�',
+    'variable-aggregator': '璁婇噺鑱氬悎鍣�',
+    'assigner': '璁婃暩鍒嗛厤鍣�',
+    'iteration-start': '杩唬闁嬪',
+    'iteration': '杩唬',
+    'parameter-extractor': '鍙冩暩鎻愬彇鍣�',
+    'list-operator': '娓呭柈閬嬬畻瀛�',
+    'document-extractor': '鏂囦欢鎻愬彇鍣�',
+    'agent': '浠g悊',
+    'loop-start': '寰挵闁嬪',
+    'loop': '寰挵',
+    'loop-end': '閫�鍑哄惊鐠�',
+  },
+  blocksAbout: {
+    'start': '瀹氱京涓�鍊� workflow 娴佺▼鍟熷嫊鐨勫弮鏁�',
+    'end': '瀹氱京涓�鍊� workflow 娴佺▼鐨勭祼鏉熷拰绲愭灉椤炲瀷',
+    'answer': '瀹氱京涓�鍊嬭亰澶╁皪瑭辩殑鍥炶鍏у',
+    'llm': '瑾跨敤澶ц獮瑷�妯″瀷鍥炵瓟鍟忛鎴栬�呭皪鑷劧瑾炶█閫茶铏曠悊',
+    'knowledge-retrieval': '鍏佽ū浣犲緸鐭ヨ瓨搴腑鏌ヨ鑸囩敤鎴跺晱椤岀浉闂滅殑鏂囨湰鍏у',
+    'question-classifier': '瀹氱京鐢ㄦ埗鍟忛鐨勫垎椤炴浠讹紝LLM 鑳藉鏍规摎鍒嗛鎻忚堪瀹氱京灏嶈┍鐨勯�插睍鏂瑰紡',
+    'if-else': '鍏佽ū浣犳牴鎿� if/else 姊濅欢灏� workflow 鎷嗗垎鎴愬叐鍊嬪垎鏀�',
+    'code': '鍩疯涓�娈� Python 鎴� NodeJS 浠g⒓瀵︾従鑷畾缇╅倧杓�',
+    'template-transform': '浣跨敤 Jinja 妯℃澘瑾炴硶灏囨暩鎿氳綁鎻涚偤瀛楃涓�',
+    'http-request': '鍏佽ū閫氶亷 HTTP 鍗旇鐧奸�佹湇鍕欏櫒璜嬫眰',
+    'variable-assigner': '灏囧璺垎鏀殑璁婇噺鑱氬悎鐐轰竴鍊嬭畩閲忥紝浠ュ鐝句笅娓哥瘈榛炵当涓�閰嶇疆銆�',
+    'assigner': '璁婃暩鍒嗛厤绡�榛炵敤鏂肩偤鍙鍏ョ殑璁婃暩锛堝灏嶈┍璁婃暩锛夊垎閰嶅�笺��',
+    'variable-aggregator': '灏囧璺垎鏀殑璁婇噺鑱氬悎鐐轰竴鍊嬭畩閲忥紝浠ュ鐝句笅娓哥瘈榛炵当涓�閰嶇疆銆�',
+    'iteration': '灏嶅垪琛ㄥ皪璞″煼琛屽娆℃椹熺洿鑷宠几鍑烘墍鏈夌祼鏋溿��',
+    'parameter-extractor': '鍒╃敤 LLM 寰炶嚜鐒惰獮瑷�鍏ф帹鐞嗘彁鍙栧嚭绲愭鍖栧弮鏁革紝鐢ㄦ柤寰岀疆鐨勫伐鍏疯鐢ㄦ垨 HTTP 璜嬫眰銆�',
+    'document-extractor': '鐢ㄦ柤灏囦笂鍌崇殑鏂囦欢瑙f瀽鐐� LLM 鏄撴柤鐞嗚В鐨勬枃瀛楀収瀹广��',
+    'list-operator': '鐢ㄦ柤绡╅伕鎴栨帓搴忛櫍鍒楀収瀹广��',
+    'agent': '瑾跨敤澶у瀷瑾炶█妯″瀷渚嗗洖绛斿晱椤屾垨铏曠悊鑷劧瑾炶█',
+    'loop-end': '绛夊悓鏂笺�屼腑鏂枫�嶃�傞�欏�嬬瘈榛炴矑鏈夐厤缃爡鐩�傜暥寰挵楂旈仈鍒伴�欏�嬬瘈榛炴檪锛屽惊鐠扮祩姝€��',
+    'loop': '鍩疯閭忚集杩村湀锛岀洿鍒版豢瓒崇祩姝㈡浠舵垨閬斿埌鏈�澶ц看鍦堟鏁搞��',
+  },
+  operator: {
+    zoomIn: '鏀惧ぇ',
+    zoomOut: '绺皬',
+    zoomTo50: '绺斁鍒� 50%',
+    zoomTo100: '鏀惧ぇ鍒� 100%',
+    zoomToFit: '鑷仼鎳夎鍦�',
+  },
+  panel: {
+    userInputField: '鐢ㄦ埗杓稿叆瀛楁',
+    changeBlock: '鏇存敼绡�榛�',
+    helpLink: '骞姪閺堟帴',
+    about: '闂滄柤',
+    createdBy: '浣滆��',
+    nextStep: '涓嬩竴姝�',
+    addNextStep: '娣诲姞姝ゅ伐浣滄祦绋嬩腑鐨勪笅涓�鍊嬬瘈榛�',
+    selectNextStep: '閬告搰涓嬩竴鍊嬬瘈榛�',
+    runThisStep: '閬嬭姝ゆ椹�',
+    checklist: '妾㈡煡娓呭柈',
+    checklistTip: '鐧间綀鍓嶇⒑淇濇墍鏈夊晱椤屽潎宸茶В姹�',
+    checklistResolved: '鎵�鏈夊晱椤屽潎宸茶В姹�',
+    organizeBlocks: '鏁寸悊绡�榛�',
+    change: '鏇存敼',
+    optional: '(閬告搰鎬�)',
+  },
+  nodes: {
+    common: {
+      outputVars: '杓稿嚭璁婇噺',
+      insertVarTip: '鎻掑叆璁婇噺',
+      memory: {
+        memory: '瑷樻喍',
+        memoryTip: '鑱婂ぉ瑷樻喍瑷疆',
+        windowSize: '瑷樻喍绐楀彛',
+        conversationRoleName: '灏嶈┍瑙掕壊鍚�',
+        user: '鐢ㄦ埗鍓嶇洞',
+        assistant: '鍔╂墜鍓嶇洞',
+      },
+      memories: {
+        title: '瑷樻喍',
+        tip: '鑱婂ぉ瑷樻喍',
+        builtIn: '鍏х疆',
+      },
+      errorHandle: {
+        none: {
+          title: '娌掓湁',
+          desc: '濡傛灉鐧肩敓鐣板父涓旀湭寰楀埌铏曠悊锛岀瘈榛炲皣鍋滄閬嬭',
+        },
+        defaultValue: {
+          title: '闋愯ō鍊�',
+          desc: '鐧肩敓閷鏅傦紝璜嬫寚瀹氶潨鎱嬭几鍑哄収瀹广��',
+          tip: '鍑洪尟鏅傦紝灏囪繑鍥炰互涓嬪�笺��',
+          inLog: 'Node 鐣板父锛屾寜鐓ч爯瑷�艰几鍑恒��',
+          output: '杓稿嚭闋愯ō鍊�',
+        },
+        failBranch: {
+          title: '澶辨晽鍒嗘敮',
+          desc: '鐣剁櫦鐢熼尟瑾ゆ檪锛屽畠鏈冨煼琛� exception 鍒嗘敮',
+          customize: '杞夊埌鐣竷浠ヨ嚜瀹氱京fail鍒嗘敮閭忚集銆�',
+          inLog: 'Node 鐣板父锛屽皣鑷嫊鍩疯fail鍒嗘敮銆傜瘈榛炶几鍑哄皣杩斿洖閷椤炲瀷鍜岄尟瑾ゆ秷鎭紝涓﹀皣鍏跺偝閬炵郸涓嬫父銆�',
+          customizeTip: '鍟熷嫊fail鍒嗘敮寰岋紝绡�榛炲紩鐧肩殑鐣板父涓嶆渻绲傛閫茬▼銆傜浉鍙嶏紝瀹冨皣鑷嫊鍩疯闋愬畾缇╃殑fail鍒嗘敮锛屽厑瑷辨偍闈堟椿鍦版彁渚涢尟瑾ゆ秷鎭�佸牨鍛娿�佷慨寰╂垨璺抽亷鎿嶄綔銆�',
+        },
+        partialSucceeded: {
+          tip: '閫茬▼涓湁 {{num}} 鍊嬬瘈榛為亱琛岀暟甯革紝璜嬪墠寰� tracing 鏌ョ湅鏃ヨ獙銆�',
+        },
+        title: '閷铏曠悊',
+        tip: '鐣板父铏曠悊绛栫暐锛岀暥绡�榛為亣鍒扮暟甯告檪瑙哥櫦銆�',
+      },
+      retry: {
+        retry: '閲嶈│',
+        retryOnFailure: '澶辨晽鏅傞噸瑭�',
+        maxRetries: '鏈�澶ч噸瑭︽鏁�',
+        retryInterval: '閲嶈│闁撻殧',
+        retryTimes: '澶辨晽鏅傞噸瑭� {{times}} 娆�',
+        retrying: '閲嶈│銆傘�傘��',
+        retrySuccessful: '閲嶈│鎴愬姛',
+        retryFailed: '閲嶈│澶辨晽',
+        retryFailedTimes: '{{times}} 娆¢噸瑭﹀け鏁�',
+        times: '娆�',
+        ms: '姣',
+        retries: '{{num}}閲嶈│',
+      },
+    },
+    start: {
+      required: '蹇呭~',
+      inputField: '杓稿叆瀛楁',
+      builtInVar: '鍏х疆璁婇噺',
+      outputVars: {
+        query: '鐢ㄦ埗杓稿叆',
+        memories: {
+          des: '鏈冭┍姝峰彶',
+          type: '娑堟伅椤炲瀷',
+          content: '娑堟伅鍏у',
+        },
+        files: '鏂囦欢鍒楄〃',
+      },
+      noVarTip: '瑷疆鐨勮几鍏ュ彲鍦ㄥ伐浣滄祦绋嬩腑浣跨敤',
+    },
+    end: {
+      outputs: '杓稿嚭',
+      output: {
+        type: '杓稿嚭椤炲瀷',
+        variable: '杓稿嚭璁婇噺',
+      },
+      type: {
+        'none': '鐒�',
+        'plain-text': '绱旀枃鏈�',
+        'structured': '绲愭鍖�',
+      },
+    },
+    answer: {
+      answer: '鍥炶',
+      outputVars: '杓稿嚭璁婇噺',
+    },
+    llm: {
+      model: '妯″瀷',
+      variables: '璁婇噺',
+      context: '涓婁笅鏂�',
+      contextTooltip: '鎮ㄥ彲浠ュ皫鍏ョ煡璀樺韩浣滅偤涓婁笅鏂�',
+      notSetContextInPromptTip: '瑕佸暉鐢ㄤ笂涓嬫枃鍔熻兘锛岃珛鍦ㄦ彁绀轰腑濉涓婁笅鏂囪畩閲忋��',
+      prompt: '鎻愮ず瑭�',
+      addMessage: '娣诲姞娑堟伅',
+      roleDescription: {
+        system: '鐐哄皪瑭辨彁渚涢珮灞ゆ寚灏�',
+        user: '鍚戞ā鍨嬫彁渚涙寚浠ゃ�佹煡瑭㈡垨浠讳綍鍩烘柤鏂囨湰鐨勮几鍏�',
+        assistant: '鍩烘柤鐢ㄦ埗娑堟伅鐨勬ā鍨嬪洖瑕�',
+      },
+      vision: '瑕栬',
+      files: '鏂囦欢',
+      resolution: {
+        name: '鍒嗚鲸鐜�',
+        high: '楂�',
+        low: '浣�',
+      },
+      outputVars: {
+        output: '鐢熸垚鍏у',
+        usage: '妯″瀷鐢ㄩ噺淇℃伅',
+      },
+      singleRun: {
+        variable: '璁婇噺',
+      },
+      sysQueryInUser: 'user message 涓繀闋堝寘鍚� sys.query',
+      jsonSchema: {
+        warningTips: {
+          saveSchema: '璜嬪湪淇濆瓨绲愭涔嬪墠瀹屾垚鐣跺墠娆勪綅鐨勭法杓�',
+        },
+        resetDefaults: '閲嶇疆',
+        instruction: '鎸囩ず',
+        apply: '鐢宠珛',
+        promptPlaceholder: '鎻忚堪浣犵殑 JSON 鏋舵...',
+        addField: '鏂板瀛楁',
+        generate: '鐢熸垚',
+        descriptionPlaceholder: '娣诲姞鎻忚堪',
+        fieldNamePlaceholder: '娆勪綅鍚嶇ū',
+        showAdvancedOptions: '椤ず閫查殠閬搁爡',
+        import: '寰� JSON 鍖叆',
+        generatedResult: '鐢熸垚鐨勭祼鏋�',
+        generateJsonSchema: '鐢熸垚 JSON 鏋舵',
+        promptTooltip: '灏囨枃鏈弿杩拌綁鎻涙垚妯欐簴鍖栫殑 JSON Schema绲愭銆�',
+        doc: '浜嗚В鏇村鏈夐棞绲愭鍖栬几鍑虹殑璩囪▕',
+        addChildField: '鏂板瀛愭瑒浣�',
+        title: '绲愭鍖栬几鍑烘ā寮�',
+        regenerate: '閲嶆柊鐢熸垚',
+        stringValidations: '瀛椾覆椹楄瓑',
+        generationTip: '鎮ㄥ彲浠ヤ娇鐢ㄨ嚜鐒惰獮瑷�蹇�熷壍寤� JSON Schema銆�',
+        generating: '鐢熸垚 JSON 鏋舵...',
+        back: '杩斿洖',
+        required: '蹇呴渶鐨�',
+        resultTip: '閫欐槸鐢熸垚鐨勭祼鏋溿�傚鏋滄偍涓嶆豢鎰忥紝鍙互鍥炲幓淇敼鎮ㄧ殑鎻愮ず銆�',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: '鏌ヨ璁婇噺',
+      knowledge: '鐭ヨ瓨搴�',
+      outputVars: {
+        output: '鍙洖鐨勫垎娈�',
+        content: '鍒嗘鍏у',
+        title: '鍒嗘妯欓',
+        icon: '鍒嗘鍦栨',
+        url: '鍒嗘閺堟帴',
+        metadata: '鍏朵粬鍏冩暩鎿�',
+      },
+      metadata: {
+        options: {
+          disabled: {
+            subTitle: '涓嶅暉鐢ㄥ厓鏁告摎閬庢烤',
+            title: '绂佺敤',
+          },
+          automatic: {
+            title: '鑷嫊鐨�',
+            subTitle: '鏍规摎鐢ㄦ埗鏌ヨ鑷嫊鐢熸垚鍏冩暩鎿氶亷婵炬浠�',
+            desc: '鏍规摎鏌ヨ璁婃暩鑷嫊鐢熸垚鍏冩暩鎿氶亷婵炬浠�',
+          },
+          manual: {
+            title: '鎵嬪嫊',
+            subTitle: '鎵嬪嫊娣诲姞鍏冩暩鎿氶亷婵炬浠�',
+          },
+        },
+        panel: {
+          add: '娣诲姞姊濅欢',
+          datePlaceholder: '閬告搰涓�鍊嬫檪闁�...',
+          search: '鎼滃皨鍏冩暩鎿�',
+          conditions: '姊濅欢',
+          title: '鍏冩暩鎿氶亷婵炬浠�',
+          select: '閬告搰璁婃暩...',
+          placeholder: '杓稿叆鏁稿��',
+        },
+        title: '鍏冩暩鎿氶亷婵�',
+      },
+    },
+    http: {
+      inputVars: '杓稿叆璁婇噺',
+      api: 'API',
+      apiPlaceholder: '杓稿叆 URL锛岃几鍏ヨ畩閲忔檪璜嬮嵉鍏モ��/鈥�',
+      notStartWithHttp: 'API 鎳夎┎浠� http:// 鎴� https:// 闁嬮牠',
+      key: '閸�',
+      value: '鍊�',
+      bulkEdit: '鎵归噺绶ㄨ集',
+      keyValueEdit: '閸靛�肩法杓�',
+      headers: 'Headers',
+      params: 'Params',
+      body: 'Body',
+      outputVars: {
+        body: '闊挎噳鍏у',
+        statusCode: '闊挎噳鐙�鎱嬬⒓',
+        headers: '闊挎噳闋垪琛� JSON',
+        files: '鏂囦欢鍒楄〃',
+      },
+      authorization: {
+        'authorization': '閼戞瑠',
+        'authorizationType': '閼戞瑠椤炲瀷',
+        'no-auth': '鐒�',
+        'api-key': 'API-Key',
+        'auth-type': 'API 閼戞瑠椤炲瀷',
+        'basic': '鍩虹',
+        'bearer': 'Bearer',
+        'custom': '鑷畾缇�',
+        'api-key-title': 'API Key',
+        'header': 'Header',
+      },
+      insertVarPlaceholder: '閸靛叆 \'/\' 閸靛揩閫熸彃鍏ヨ畩閲�',
+      timeout: {
+        title: '瓒呮檪瑷疆',
+        connectLabel: '閫f帴瓒呮檪',
+        connectPlaceholder: '杓稿叆閫f帴瓒呮檪锛堜互绉掔偤鍠綅锛�',
+        readLabel: '璁�鍙栬秴鏅�',
+        readPlaceholder: '杓稿叆璁�鍙栬秴鏅傦紙浠ョ鐐哄柈浣嶏級',
+        writeLabel: '瀵叆瓒呮檪',
+        writePlaceholder: '杓稿叆瀵叆瓒呮檪锛堜互绉掔偤鍠綅锛�',
+      },
+      type: '椤炲瀷',
+      binaryFileVariable: '浜岄�蹭綅妾旇畩鏁�',
+      extractListPlaceholder: '杓稿叆娓呭柈闋呯储寮曪紝閸靛叆 銆�/銆� 鎻掑叆璁婃暩',
+      curl: {
+        placeholder: '鍦ㄦ铏曠矘璨� cURL 瀛椾覆',
+        title: '寰� cURL 灏庡叆',
+      },
+    },
+    code: {
+      inputVars: '杓稿叆璁婇噺',
+      outputVars: '杓稿嚭璁婇噺',
+      advancedDependencies: '楂樼礆渚濊炒',
+      advancedDependenciesTip: '鍦ㄩ�欒!娣诲姞涓�浜涢爯鍔犺級闇�瑕佹秷鑰楄純澶氭檪闁撴垨闈為粯瑾嶅収缃殑渚濊炒鍖�',
+      searchDependencies: '鎼滅储渚濊炒',
+    },
+    templateTransform: {
+      inputVars: '杓稿叆璁婇噺',
+      code: '浠g⒓',
+      codeSupportTip: '鍙敮鎸� Jinja2',
+      outputVars: {
+        output: '杞夋彌寰屽収瀹�',
+      },
+    },
+    ifElse: {
+      if: 'If',
+      else: 'Else',
+      elseDescription: '鐢ㄦ柤瀹氱京鐣� if 姊濅欢涓嶆豢瓒虫檪鎳夊煼琛岀殑閭忚集銆�',
+      and: 'and',
+      or: 'or',
+      operator: '鎿嶄綔绗�',
+      notSetVariable: '璜嬪厛瑷疆璁婇噺',
+      comparisonOperator: {
+        'contains': '鍖呭惈',
+        'not contains': '涓嶅寘鍚�',
+        'start with': '闁嬪鏄�',
+        'end with': '绲愭潫鏄�',
+        'is': '鏄�',
+        'is not': '涓嶆槸',
+        'empty': '鐐虹┖',
+        'not empty': '涓嶇偤绌�',
+        'null': '绌�',
+        'not null': '涓嶇偤绌�',
+        'regex match': '姝e墖琛ㄩ仈寮忓尮閰�',
+        'all of': '鍏ㄩ儴',
+        'exists': '瀛樺湪',
+        'in': '鍦�',
+        'not in': '涓嶅湪',
+        'not exists': '涓嶅瓨鍦�',
+        'after': '涔嬪緦',
+        'before': '涔嬪墠',
+      },
+      enterValue: '杓稿叆鍊�',
+      addCondition: '娣诲姞姊濅欢',
+      conditionNotSetup: '姊濅欢鏈ō缃�',
+      selectVariable: '閬告搰璁婃暩...',
+      optionName: {
+        image: '鍦栧儚',
+        url: '缍插潃',
+        doc: '鏂囨獢',
+        localUpload: '鏈湴涓婂偝',
+        video: '瑕栭牷',
+        audio: '闊宠▕',
+      },
+      select: '閬告搰',
+      addSubVariable: '瀛愯畩鏁�',
+      condition: '姊濅欢',
+    },
+    variableAssigner: {
+      title: '璁婇噺璩﹀��',
+      outputType: '杓稿嚭椤炲瀷',
+      varNotSet: '鏈ō缃畩閲�',
+      noVarTip: '娣诲姞闇�瑕佽肠鍊肩殑璁婇噺',
+      type: {
+        string: 'String',
+        number: 'Number',
+        object: 'Object',
+        array: 'Array',
+      },
+      aggregationGroup: '鑱氬悎鍒嗙祫',
+      aggregationGroupTip: '闁嬪暉瑭插姛鑳藉緦锛岃畩閲忚仛鍚堝櫒鍏у彲浠ュ悓鏅傝仛鍚堝绲勮畩閲�',
+      addGroup: '娣诲姞鍒嗙祫',
+      outputVars: {
+        varDescribe: '{{groupName}}鐨勮几鍑鸿畩閲�',
+      },
+      setAssignVariable: '瑷疆璩﹀�艰畩閲�',
+    },
+    assigner: {
+      'assignedVariable': '宸插垎閰嶈畩鏁�',
+      'writeMode': '瀵叆妯″紡',
+      'writeModeTip': '鐣跺凡鍒嗛厤璁婃暩鏄櫍鍒楁檪锛岄檮鍔犳ā寮忔渻鏂板鍒版湯灏俱��',
+      'over-write': '瑕嗗',
+      'append': '闄勫姞',
+      'plus': '鍔�',
+      'clear': '娓呴櫎',
+      'setVariable': '瑷畾璁婃暩',
+      'variable': '璁婃暩',
+      'operations': {
+        'overwrite': '瑕嗗',
+        '/=': '/=',
+        'title': '鎿嶄綔',
+        '*=': '*=',
+        'extend': '鎿村睍',
+        '+=': '+=',
+        'set': '瑷疆',
+        'over-write': '瑕嗗',
+        '-=': '-=',
+        'append': '闄勫姞',
+        'clear': '娓呴櫎',
+        'remove-first': '绉婚櫎棣栭爡',
+        'remove-last': '绉婚櫎鏈爡',
+      },
+      'noAssignedVars': '娌掓湁鍙敤鐨勫凡鍒嗛厤璁婃暩',
+      'variables': '璁婃暩',
+      'selectAssignedVariable': '閬告搰閰嶇疆鐨勮畩鏁�...',
+      'setParameter': '瑷畾鍙冩暩...',
+      'noVarTip': '榛炴搳 銆�+銆� 鎸夐垥娣诲姞璁婃暩',
+      'assignedVarsDescription': '鍒嗛厤鐨勮畩鏁稿繀闋堟槸鍙璁婃暩锛屼緥濡傚皪瑭辫畩鏁搞��',
+      'varNotSet': '鏈ō缃畩鏁�',
+    },
+    tool: {
+      toAuthorize: '鎺堟瑠',
+      inputVars: '杓稿叆璁婇噺',
+      outputVars: {
+        text: '宸ュ叿鐢熸垚鐨勫収瀹�',
+        files: {
+          title: '宸ュ叿鐢熸垚鐨勬枃浠�',
+          type: '鏀寔椤炲瀷銆傜従鍦ㄥ彧鏀寔鍦栫墖',
+          transfer_method: '鍌宠几鏂瑰紡銆傚�肩偤 remote_url 鎴� local_file',
+          url: '鍦栫墖閺堟帴',
+          upload_file_id: '涓婂偝鏂囦欢ID',
+        },
+        json: '宸ュ叿鐢熸垚鐨凧SON',
+      },
+    },
+    questionClassifiers: {
+      model: '妯″瀷',
+      inputVars: '杓稿叆璁婇噺',
+      outputVars: {
+        className: '鍒嗛鍚嶇ū',
+      },
+      class: '鍒嗛',
+      classNamePlaceholder: '杓稿叆浣犵殑鍒嗛鍚嶇ū',
+      advancedSetting: '楂樼礆瑷疆',
+      topicName: '涓婚鍏у',
+      topicPlaceholder: '鍦ㄩ�欒!杓稿叆浣犵殑涓婚鍏у',
+      addClass: '娣诲姞鍒嗛',
+      instruction: '鎸囦护',
+      instructionTip: '浣犲彲浠ヨ几鍏ラ澶栫殑闄勫姞鎸囦护锛屽公鍔╁晱椤屽垎椤炲櫒鏇村ソ鐨勭悊瑙e浣曞垎椤�',
+      instructionPlaceholder: '鍦ㄩ�欒!杓稿叆浣犵殑鎸囦护',
+    },
+    parameterExtractor: {
+      inputVar: '杓稿叆璁婇噺',
+      extractParameters: '鎻愬彇鍙冩暩',
+      importFromTool: '寰炲伐鍏峰皫鍏�',
+      addExtractParameter: '娣诲姞鎻愬彇鍙冩暩',
+      addExtractParameterContent: {
+        name: '鍚嶇ū',
+        namePlaceholder: '鎻愬彇鍙冩暩鍚嶇ū',
+        type: '椤炲瀷',
+        typePlaceholder: '鎻愬彇鍙冩暩椤炲瀷',
+        description: '鎻忚堪',
+        descriptionPlaceholder: '鎻愬彇鍙冩暩鎻忚堪',
+        required: '蹇呭~',
+        requiredContent: '蹇呭~鍍呬綔鐐烘ā鍨嬫帹鐞嗙殑鍙冭�冿紝涓嶇敤鏂煎弮鏁歌几鍑虹殑寮峰埗椹楄瓑銆�',
+      },
+      extractParametersNotSet: '鎻愬彇鍙冩暩鏈ō缃�',
+      instruction: '鎸囦护',
+      instructionTip: '浣犲彲浠ヨ几鍏ラ澶栫殑闄勫姞鎸囦护锛屽公鍔╁弮鏁告彁鍙栧櫒鐞嗚В濡備綍鎻愬彇鍙冩暩',
+      advancedSetting: '楂樼礆瑷疆',
+      reasoningMode: '鎺ㄧ悊妯″紡',
+      reasoningModeTip: '浣犲彲浠ユ牴鎿氭ā鍨嬪皪鏂� Function calling 鎴� Prompt 鐨勬寚浠ら熆鎳夎兘鍔涢伕鎿囧悎閬╃殑鎺ㄧ悊妯″紡',
+      isSuccess: '鏄惁鎴愬姛銆傛垚鍔熸檪鍊肩偤 1锛屽け鏁楁檪鍊肩偤 0銆�',
+      errorReason: '閷鍘熷洜',
+    },
+    iteration: {
+      deleteTitle: '鍒櫎杩唬绡�榛烇紵',
+      deleteDesc: '鍒櫎杩唬绡�榛炲皣鍒櫎鎵�鏈夊瓙绡�榛�',
+      input: '杓稿叆',
+      output: '杓稿嚭璁婇噺',
+      iteration_one: '{{count}}鍊嬭凯浠�',
+      iteration_other: '{{count}}鍊嬭凯浠�',
+      currentIteration: '鐣跺墠杩唬',
+      ErrorMethod: {
+        operationTerminated: '绲傛',
+        removeAbnormalOutput: 'remove-abnormal-output',
+        continueOnError: '鍑洪尟鏅傜辜绾�',
+      },
+      comma: ',',
+      parallelMode: '涓﹁妯″紡',
+      parallelModeEnableTitle: 'Parallel Mode 宸插暉鐢�',
+      MaxParallelismTitle: '鏈�澶т甫琛屽害',
+      parallelModeUpper: '涓﹁妯″紡',
+      parallelPanelDesc: '鍦ㄤ甫琛屾ā寮忎笅锛屽弽瑕嗛亱绠椾腑鐨勪换鍕欐敮鎻翠甫琛屽煼琛屻��',
+      error_one: '{{count}}閷',
+      errorResponseMethod: '閷鍥炴噳鏂规硶',
+      parallelModeEnableDesc: '鍦ㄤ甫琛屾ā寮忎笅锛屽弽瑕嗛亱绠椾腑鐨勪换鍕欐敮鎻翠甫琛屽煼琛屻�傛偍鍙互鍦ㄥ彸鍋寸殑 properties 闈㈡澘涓�茶閰嶇疆銆�',
+      answerNodeWarningDesc: '涓﹁妯″紡璀﹀憡锛氬弽瑕嗛亱绠椾腑鐨勬噳绛旂瘈榛炪�佸皪瑭辫畩鏁歌肠鍊煎拰鎸佷箙璁�/瀵搷浣滃彲鑳芥渻灏庤嚧鐣板父銆�',
+      error_other: '{{count}}閷',
+      MaxParallelismDesc: '鏈�澶т甫琛屽害鐢ㄦ柤鎺у埗鍦ㄥ柈鍊嬪弽瑕嗛亱绠椾腑鍚屾檪鍩疯鐨勪换鍕欐暩銆�',
+    },
+    note: {
+      editor: {
+        link: '閫g祼',
+        openLink: '鎵撻枊',
+        medium: '涓瓑',
+        small: '灏�',
+        invalidUrl: 'URL 鐒℃晥',
+        italic: '鏂滈珨鐨�',
+        bulletList: '闋呯洰绗﹁櫉娓呭柈',
+        large: '澶�',
+        unlink: '鍙栨秷閫g祼',
+        enterUrl: '杓稿叆缍插潃...',
+        bold: '澶ц喗',
+        showAuthor: '椤ず浣滆��',
+        strikethrough: '鍒櫎绶�',
+        placeholder: '瀵笅鎮ㄧ殑绛嗚...',
+      },
+      addNote: '娣诲姞瑷婚噵',
+    },
+    docExtractor: {
+      outputVars: {
+        text: '鎻愬彇鐨勬枃瀛�',
+      },
+      learnMore: '鐬В鏇村璩囪▕',
+      inputVar: '杓稿叆璁婃暩',
+      supportFileTypes: '鏀彺鏂囦欢椤炲瀷锛歿{types}}銆�',
+    },
+    listFilter: {
+      outputVars: {
+        last_record: '鏈�寰屼竴姊濊閷�',
+        first_record: '绗竴姊濊閷�',
+        result: '绡╅伕绲愭灉',
+      },
+      desc: '鎻忚堪',
+      asc: 'ASC鐨�',
+      orderBy: '鎺掑簭渚濇摎',
+      inputVar: '杓稿叆璁婃暩',
+      filterConditionComparisonValue: 'Filter Condition 鍊�',
+      filterCondition: '绡╅伕姊濅欢',
+      limit: '鍓� N 鍚�',
+      selectVariableKeyPlaceholder: 'Select sub variable key 锛堥伕鎿囧瓙璁婃暩閸碉級',
+      filterConditionComparisonOperator: 'Filter Condition Comparison 閬嬬畻绗�',
+      filterConditionKey: '绡╅伕姊濅欢閸�',
+      extractsCondition: '鎻愬彇绗� N 闋�',
+    },
+    agent: {
+      strategy: {
+        label: '浠g悊绛栫暐',
+        shortLabel: '绛栫暐',
+        tooltip: '涓嶅悓鐨� Agentic 绛栫暐姹哄畾浜嗙郴绲卞浣曡鍔冨拰鍩疯澶氭椹熷伐鍏疯鐢�',
+        configureTip: '璜嬮厤缃� agentic 绛栫暐銆�',
+        searchPlaceholder: '鎼滅储浠g悊绛栫暐',
+        selectTip: '閬告搰浠g悊绛栫暐',
+        configureTipDesc: '閰嶇疆浠g悊绛栫暐鍚庯紝瑭茬瘈榛炲皣鑷嫊杓夊叆鍓╅鐨勯厤缃�傝┎绛栫暐灏囧奖闊垮姝ラ宸ュ叿鎺ㄧ悊鐨勬鍒躲��',
+      },
+      pluginInstaller: {
+        installing: '瀹夎',
+        install: '瀹夎',
+      },
+      modelNotInMarketplace: {
+        title: '鏈畨瑁濇ā鍨�',
+        manageInPlugins: '鍦ㄥ鎺涚▼寮忎腑绠$悊',
+        desc: '姝ゆā鍨嬫槸寰� Local 鎴� GitHub 鍎插瓨搴畨瑁濈殑銆傝珛鍦ㄥ畨瑁濆緦浣跨敤銆�',
+      },
+      modelNotSupport: {
+        title: '涓嶆敮鎻寸殑鍨嬭櫉',
+        desc: '宸插畨瑁濈殑澶栨帥绋嬪紡鐗堟湰涓嶆彁渚涙妯″瀷銆�',
+        descForVersionSwitch: '宸插畨瑁濈殑澶栨帥绋嬪紡鐗堟湰涓嶆彁渚涙妯″瀷銆傛寜鍏╀笅浠ュ垏鎻涚増鏈��',
+      },
+      modelSelectorTooltips: {
+        deprecated: '姝ゆā鍨嬪凡妫勭敤',
+      },
+      outputVars: {
+        files: {
+          type: '鏀拹椤炲瀷銆傜従鍦ㄥ儏鏀彺閺″儚',
+          transfer_method: '杞夌Щ鏂规硶銆傚�肩偤 remote_url 鎴� local_file',
+          title: '浠g悊鐢熸垚鐨勬獢',
+          url: '鍦栫墖缍插潃',
+          upload_file_id: '涓婂偝妾擨D',
+        },
+        text: '浠g悊鐢熸垚鐨勫収瀹�',
+        json: '浠g悊鐢熸垚鐨� JSON',
+      },
+      checkList: {
+        strategyNotSelected: '鏈伕鎿囩瓥鐣�',
+      },
+      installPlugin: {
+        title: '瀹夎澶栨帥绋嬪紡',
+        changelog: '鏇存柊鏃ヨ獙',
+        cancel: '鍙栨秷',
+        desc: '鍗冲皣瀹夎浠ヤ笅澶栨帥绋嬪紡',
+        install: '瀹夎',
+      },
+      pluginNotFoundDesc: '姝ゅ鎺涚▼寮忔槸寰� GitHub 瀹夎鐨勩�傝珛鍓嶅線澶栨帥绋嬪紡 閲嶆柊瀹夎',
+      modelNotSelected: '鏈伕鎿囨ā鍨�',
+      tools: '宸ュ叿',
+      strategyNotFoundDesc: '宸插畨瑁濈殑澶栨帥绋嬪紡鐗堟湰涓嶆彁渚涙绛栫暐銆�',
+      pluginNotInstalledDesc: '姝ゅ鎺涚▼寮忔槸寰� GitHub 瀹夎鐨勩�傝珛鍓嶅線澶栨帥绋嬪紡 閲嶆柊瀹夎',
+      strategyNotFoundDescAndSwitchVersion: '宸插畨瑁濈殑澶栨帥绋嬪紡鐗堟湰涓嶆彁渚涙绛栫暐銆傛寜鍏╀笅浠ュ垏鎻涚増鏈��',
+      strategyNotInstallTooltip: '{{strategy}} 鏈畨瑁�',
+      toolNotAuthorizedTooltip: '{{宸ュ叿}}鏈巿娆�',
+      unsupportedStrategy: '涓嶆敮鎻寸殑绛栫暐',
+      model: '鍨�',
+      modelNotInstallTooltip: '姝ゆā鍨嬫湭瀹夎',
+      strategyNotSet: '浠g悊绛栫暐鏈ō缃�',
+      toolNotInstallTooltip: '{{tool}} 鏈畨瑁�',
+      maxIterations: '鏈�澶у弽瑕嗛亱绠楁鏁�',
+      toolbox: '宸ュ叿绠�',
+      configureModel: '閰嶇疆妯″瀷',
+      learnMore: '鐬В鏇村璩囪▕',
+      linkToPlugin: '閫g祼鍒板鎺涚▼寮�',
+      pluginNotInstalled: '姝ゅ鎺涚▼寮忔湭瀹夎',
+      notAuthorized: '鏈巿娆�',
+    },
+    loop: {
+      ErrorMethod: {
+        operationTerminated: '绲傛',
+        continueOnError: '绻肩簩鍑洪尟',
+        removeAbnormalOutput: '绉婚櫎鐣板父杓稿嚭',
+      },
+      loop_other: '{{count}} 寰挵',
+      variableName: '璁婃暩鍚嶇ū',
+      error_one: '{{count}} 閷',
+      loopMaxCount: '鏈�澶ц看鍦堟鏁�',
+      input: '杓稿叆',
+      loopVariables: '寰挵璁婇噺',
+      output: '杓稿嚭璁婇噺',
+      comma: '锛�',
+      errorResponseMethod: '閷鍥炴噳鏂规硶',
+      breakCondition: '杩村湀绲傛姊濅欢',
+      loopMaxCountError: '璜嬭几鍏ヤ竴鍊嬫湁鏁堢殑鏈�澶ц看鍦堟鏁革紝绡勫湇鐐� 1 鍒� {{maxCount}}',
+      loop_one: '{{count}} 娆″惊鐠�',
+      exitConditionTip: '寰挵绡�榛炶嚦灏戦渶瑕佷竴鍊嬮��鍑烘浠�',
+      breakConditionTip: '鍙湁鍦ㄥ叿鏈夌祩姝㈡浠剁殑寰挵鍏у拰灏嶈┍璁婃暩涓紝鎵嶈兘寮曠敤璁婃暩銆�',
+      totalLoopCount: '绺借看鍦堟鏁革細{{count}}',
+      error_other: '{{count}} 閷',
+      currentLoop: '闆绘祦杩磋矾',
+      finalLoopVariables: '鏈�寰岃看鍦堣畩鏁�',
+      currentLoopCount: '鐣跺墠寰挵娆℃暩锛歿{count}}',
+      inputMode: '杓稿叆妯″紡',
+      loopNode: '寰挵绡�榛�',
+      initialLoopVariables: '鍒濆杩村湀璁婃暩',
+      deleteDesc: '鍒櫎寰挵绡�榛炲皣绉婚櫎鎵�鏈夊瓙绡�榛�',
+      setLoopVariables: '鍦ㄨ看鍦堢瘎鍦嶅収瑷疆璁婃暩',
+      deleteTitle: '鍒櫎寰挵绡�榛炲棊锛�',
+    },
+  },
+  tracing: {
+    stopBy: '鐢眥{user}}绲傛',
+  },
+  variableReference: {
+    noAvailableVars: '鐒″彲鐢ㄨ畩鏁�',
+    noAssignedVars: '娌掓湁鍙敤鐨勫凡鍒嗛厤璁婃暩',
+    noVarsForOperation: '鎵�閬告搷浣滄矑鏈夊彲鐢ㄦ柤璩﹀�肩殑璁婃暩銆�',
+    assignedVarsDescription: '鍒嗛厤鐨勮畩鏁稿繀闋堟槸鍙璁婃暩锛屼緥濡�',
+    conversationVars: '灏嶈┍璁婃暩',
+  },
+  versionHistory: {
+    filter: {
+      onlyShowNamedVersions: '鍍呴’绀哄懡鍚嶇増鏈�',
+      onlyYours: '鍙湁濡崇殑',
+      empty: '鏈壘鍒板尮閰嶇殑鐗堟湰姝峰彶',
+      all: '鎵�鏈�',
+      reset: '閲嶇疆閬庢烤鍣�',
+    },
+    editField: {
+      releaseNotes: '鐧间綀瑾槑',
+      titleLengthLimit: '妯欓涓嶈兘瓒呴亷 {{limit}} 鍊嬪瓧绗�',
+      releaseNotesLengthLimit: '鐧间綀瑾槑涓嶈兘瓒呴亷 {{limit}} 鍊嬪瓧绗�',
+      title: '妯欓',
+    },
+    action: {
+      updateFailure: '鏇存柊鐗堟湰澶辨晽',
+      restoreFailure: '鐒℃硶鎭㈠京鐗堟湰',
+      restoreSuccess: '鎭㈠京鐗堟湰',
+      updateSuccess: '鐗堟湰宸叉洿鏂�',
+      deleteSuccess: '鐗堟湰宸插埅闄�',
+      deleteFailure: '鐒℃硶鍒櫎鐗堟湰',
+    },
+    nameThisVersion: '绲﹂�欏�嬬増鏈懡鍚�',
+    latest: '鏈�鏂�',
+    currentDraft: '鐣跺墠鑽夌',
+    title: '鐗堟湰',
+    editVersionInfo: '绶ㄨ集鐗堟湰淇℃伅',
+    restorationTip: '鐗堟湰鎭㈠京寰岋紝鐣跺墠鑽夌灏囪瑕嗚搵銆�',
+    deletionTip: '鍒櫎鏄笉鍙�嗙殑锛岃珛纰鸿獚銆�',
+    releaseNotesPlaceholder: '鎻忚堪鐧肩敓浜嗕粈楹艰畩鍖�',
+    defaultName: '鏈懡鍚嶇増鏈�',
+  },
+}
+
+export default translation
diff --git a/jest.config.ts b/jest.config.ts
new file mode 100644
index 0000000..ebeb2f7
--- /dev/null
+++ b/jest.config.ts
@@ -0,0 +1,210 @@
+/**
+ * For a detailed explanation regarding each configuration property, visit:
+ * https://jestjs.io/docs/configuration
+ */
+
+import type { Config } from 'jest'
+import nextJest from 'next/jest.js'
+
+// https://nextjs.org/docs/app/building-your-application/testing/jest
+const createJestConfig = nextJest({
+  // Provide the path to your Next.js app to load next.config.js and .env files in your test environment
+  dir: './',
+})
+
+const config: Config = {
+  // All imported modules in your tests should be mocked automatically
+  // automock: false,
+
+  // Stop running tests after `n` failures
+  // bail: 0,
+
+  // The directory where Jest should store its cached dependency information
+  // cacheDirectory: "/private/var/folders/9c/7gly5yl90qxdjljqsvkk758h0000gn/T/jest_dx",
+
+  // Automatically clear mock calls, instances, contexts and results before every test
+  clearMocks: true,
+
+  // Indicates whether the coverage information should be collected while executing the test
+  collectCoverage: true,
+
+  // An array of glob patterns indicating a set of files for which coverage information should be collected
+  // collectCoverageFrom: undefined,
+
+  // The directory where Jest should output its coverage files
+  // coverageDirectory: "coverage",
+
+  // An array of regexp pattern strings used to skip coverage collection
+  // coveragePathIgnorePatterns: [
+  //   "/node_modules/"
+  // ],
+
+  // Indicates which provider should be used to instrument code for coverage
+  coverageProvider: 'v8',
+
+  // A list of reporter names that Jest uses when writing coverage reports
+  coverageReporters: [
+    'json',
+    'text',
+    'text-summary',
+    'lcov',
+    'clover',
+  ],
+
+  // An object that configures minimum threshold enforcement for coverage results
+  // coverageThreshold: undefined,
+
+  // A path to a custom dependency extractor
+  // dependencyExtractor: undefined,
+
+  // Make calling deprecated APIs throw helpful error messages
+  // errorOnDeprecated: false,
+
+  // The default configuration for fake timers
+  // fakeTimers: {
+  //   "enableGlobally": false
+  // },
+
+  // Force coverage collection from ignored files using an array of glob patterns
+  // forceCoverageMatch: [],
+
+  // A path to a module which exports an async function that is triggered once before all test suites
+  // globalSetup: undefined,
+
+  // A path to a module which exports an async function that is triggered once after all test suites
+  // globalTeardown: undefined,
+
+  // A set of global variables that need to be available in all test environments
+  // globals: {},
+
+  // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers.
+  // maxWorkers: "50%",
+
+  // An array of directory names to be searched recursively up from the requiring module's location
+  // moduleDirectories: [
+  //   "node_modules"
+  // ],
+
+  // An array of file extensions your modules use
+  // moduleFileExtensions: [
+  //   "js",
+  //   "mjs",
+  //   "cjs",
+  //   "jsx",
+  //   "ts",
+  //   "tsx",
+  //   "json",
+  //   "node"
+  // ],
+
+  // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module
+  moduleNameMapper: {
+    '^@/(.*)$': '<rootDir>/$1',
+    '^lodash-es$': 'lodash',
+  },
+
+  // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
+  // modulePathIgnorePatterns: [],
+
+  // Activates notifications for test results
+  // notify: false,
+
+  // An enum that specifies notification mode. Requires { notify: true }
+  // notifyMode: "failure-change",
+
+  // A preset that is used as a base for Jest's configuration
+  // preset: undefined,
+
+  // Run tests from one or more projects
+  // projects: undefined,
+
+  // Use this configuration option to add custom reporters to Jest
+  // reporters: undefined,
+
+  // Automatically reset mock state before every test
+  // resetMocks: false,
+
+  // Reset the module registry before running each individual test
+  // resetModules: false,
+
+  // A path to a custom resolver
+  // resolver: undefined,
+
+  // Automatically restore mock state and implementation before every test
+  // restoreMocks: false,
+
+  // The root directory that Jest should scan for tests and modules within
+  rootDir: './',
+
+  // A list of paths to directories that Jest should use to search for files in
+  // roots: [
+  //   "<rootDir>"
+  // ],
+
+  // Allows you to use a custom runner instead of Jest's default test runner
+  // runner: "jest-runner",
+
+  // The paths to modules that run some code to configure or set up the testing environment before each test
+  // setupFiles: [],
+
+  // A list of paths to modules that run some code to configure or set up the testing framework before each test
+  setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
+
+  // The number of seconds after which a test is considered as slow and reported as such in the results.
+  // slowTestThreshold: 5,
+
+  // A list of paths to snapshot serializer modules Jest should use for snapshot testing
+  // snapshotSerializers: [],
+
+  // The test environment that will be used for testing
+  testEnvironment: '@happy-dom/jest-environment',
+
+  // Options that will be passed to the testEnvironment
+  // testEnvironmentOptions: {},
+
+  // Adds a location field to test results
+  // testLocationInResults: false,
+
+  // The glob patterns Jest uses to detect test files
+  // testMatch: [
+  //   "**/__tests__/**/*.[jt]s?(x)",
+  //   "**/?(*.)+(spec|test).[tj]s?(x)"
+  // ],
+
+  // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
+  // testPathIgnorePatterns: [
+  //   "/node_modules/"
+  // ],
+
+  // The regexp pattern or array of patterns that Jest uses to detect test files
+  // testRegex: [],
+
+  // This option allows the use of a custom results processor
+  // testResultsProcessor: undefined,
+
+  // This option allows use of a custom test runner
+  // testRunner: "jest-circus/runner",
+
+  // A map from regular expressions to paths to transformers
+  // transform: undefined,
+
+  // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
+  // transformIgnorePatterns: [
+  //   "/node_modules/",
+  //   "\\.pnp\\.[^\\/]+$"
+  // ],
+
+  // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
+  // unmockedModulePathPatterns: undefined,
+
+  // Indicates whether each individual test should be reported during the run
+  // verbose: undefined,
+
+  // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode
+  // watchPathIgnorePatterns: [],
+
+  // Whether to use watchman for file crawling
+  // watchman: true,
+}
+
+export default createJestConfig(config)
diff --git a/jest.setup.ts b/jest.setup.ts
new file mode 100644
index 0000000..ef9ede0
--- /dev/null
+++ b/jest.setup.ts
@@ -0,0 +1,6 @@
+import '@testing-library/jest-dom'
+import { cleanup } from '@testing-library/react'
+
+afterEach(() => {
+  cleanup()
+})
diff --git a/middleware.ts b/middleware.ts
new file mode 100644
index 0000000..ac01694
--- /dev/null
+++ b/middleware.ts
@@ -0,0 +1,86 @@
+import type { NextRequest } from 'next/server'
+import { NextResponse } from 'next/server'
+
+const NECESSARY_DOMAIN = '*.sentry.io http://localhost:* http://127.0.0.1:* https://analytics.google.com googletagmanager.com *.googletagmanager.com https://www.google-analytics.com https://api.github.com'
+
+const wrapResponseWithXFrameOptions = (response: NextResponse, pathname: string) => {
+  // prevent clickjacking: https://owasp.org/www-community/attacks/Clickjacking
+  // Chatbot page should be allowed to be embedded in iframe. It's a feature
+  if (process.env.NEXT_PUBLIC_ALLOW_EMBED !== 'true' && !pathname.startsWith('/chat') && !pathname.startsWith('/workflow') && !pathname.startsWith('/completion'))
+    response.headers.set('X-Frame-Options', 'DENY')
+
+  return response
+}
+export function middleware(request: NextRequest) {
+  const { pathname } = request.nextUrl
+  const requestHeaders = new Headers(request.headers)
+  const response = NextResponse.next({
+    request: {
+      headers: requestHeaders,
+    },
+  })
+
+  const isWhiteListEnabled = !!process.env.NEXT_PUBLIC_CSP_WHITELIST && process.env.NODE_ENV === 'production'
+  if (!isWhiteListEnabled)
+    return wrapResponseWithXFrameOptions(response, pathname)
+
+  const whiteList = `${process.env.NEXT_PUBLIC_CSP_WHITELIST} ${NECESSARY_DOMAIN}`
+  const nonce = Buffer.from(crypto.randomUUID()).toString('base64')
+  const csp = `'nonce-${nonce}'`
+
+  const scheme_source = 'data: mediastream: blob: filesystem:'
+
+  const cspHeader = `
+    default-src 'self' ${scheme_source} ${csp} ${whiteList};
+    connect-src 'self' ${scheme_source} ${csp} ${whiteList};
+    script-src 'self' ${scheme_source} ${csp} ${whiteList};
+    style-src 'self' 'unsafe-inline' ${scheme_source} ${whiteList};
+    worker-src 'self' ${scheme_source} ${csp} ${whiteList};
+    media-src 'self' ${scheme_source} ${csp} ${whiteList};
+    img-src * data:;
+    font-src 'self';
+    object-src 'none';
+    base-uri 'self';
+    form-action 'self';
+    upgrade-insecure-requests;
+`
+  // Replace newline characters and spaces
+  const contentSecurityPolicyHeaderValue = cspHeader
+    .replace(/\s{2,}/g, ' ')
+    .trim()
+
+  requestHeaders.set('x-nonce', nonce)
+
+  requestHeaders.set(
+    'Content-Security-Policy',
+    contentSecurityPolicyHeaderValue,
+  )
+
+  response.headers.set(
+    'Content-Security-Policy',
+    contentSecurityPolicyHeaderValue,
+  )
+
+  return wrapResponseWithXFrameOptions(response, pathname)
+}
+
+export const config = {
+  matcher: [
+    /*
+     * Match all request paths except for the ones starting with:
+     * - api (API routes)
+     * - _next/static (static files)
+     * - _next/image (image optimization files)
+     * - favicon.ico (favicon file)
+     */
+    {
+      // source: '/((?!api|_next/static|_next/image|favicon.ico).*)',
+      source: '/((?!_next/static|_next/image|favicon.ico).*)',
+      // source: '/(.*)',
+      // missing: [
+      //   { type: 'header', key: 'next-router-prefetch' },
+      //   { type: 'header', key: 'purpose', value: 'prefetch' },
+      // ],
+    },
+  ],
+}
diff --git a/models/app.ts b/models/app.ts
new file mode 100644
index 0000000..d830455
--- /dev/null
+++ b/models/app.ts
@@ -0,0 +1,115 @@
+import type { LangFuseConfig, LangSmithConfig, OpikConfig, TracingProvider, WeaveConfig } from '@/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/type'
+import type { App, AppSSO, AppTemplate, SiteConfig } from '@/types/app'
+import type { Dependency } from '@/app/components/plugins/types'
+
+export enum DSLImportMode {
+  YAML_CONTENT = 'yaml-content',
+  YAML_URL = 'yaml-url',
+}
+
+export enum DSLImportStatus {
+  COMPLETED = 'completed',
+  COMPLETED_WITH_WARNINGS = 'completed-with-warnings',
+  PENDING = 'pending',
+  FAILED = 'failed',
+}
+
+export type AppListResponse = {
+  data: App[]
+  has_more: boolean
+  limit: number
+  page: number
+  total: number
+}
+
+export type AppDetailResponse = App
+
+export type DSLImportResponse = {
+  id: string
+  status: DSLImportStatus
+  app_mode: AppMode
+  app_id?: string
+  current_dsl_version?: string
+  imported_dsl_version?: string
+  error: string
+  leaked_dependencies: Dependency[]
+}
+
+export type AppSSOResponse = { enabled: AppSSO['enable_sso'] }
+
+export type AppTemplatesResponse = {
+  data: AppTemplate[]
+}
+
+export type CreateAppResponse = App
+
+export type UpdateAppSiteCodeResponse = { app_id: string } & SiteConfig
+
+export type AppDailyMessagesResponse = {
+  data: Array<{ date: string; message_count: number }>
+}
+
+export type AppDailyConversationsResponse = {
+  data: Array<{ date: string; conversation_count: number }>
+}
+
+export type WorkflowDailyConversationsResponse = {
+  data: Array<{ date: string; runs: number }>
+}
+
+export type AppStatisticsResponse = {
+  data: Array<{ date: string }>
+}
+
+export type AppDailyEndUsersResponse = {
+  data: Array<{ date: string; terminal_count: number }>
+}
+
+export type AppTokenCostsResponse = {
+  data: Array<{ date: string; token_count: number; total_price: number; currency: number }>
+}
+
+export type UpdateAppModelConfigResponse = { result: string }
+
+export type ApiKeyItemResponse = {
+  id: string
+  token: string
+  last_used_at: string
+  created_at: string
+}
+
+export type ApiKeysListResponse = {
+  data: ApiKeyItemResponse[]
+}
+
+export type CreateApiKeyResponse = {
+  id: string
+  token: string
+  created_at: string
+}
+
+export type ValidateOpenAIKeyResponse = {
+  result: string
+  error?: string
+}
+
+export type UpdateOpenAIKeyResponse = ValidateOpenAIKeyResponse
+
+export type GenerationIntroductionResponse = {
+  introduction: string
+}
+
+export type AppVoicesListResponse = [{
+  name: string
+  value: string
+}]
+
+export type TracingStatus = {
+  enabled: boolean
+  tracing_provider: TracingProvider | null
+}
+
+export type TracingConfig = {
+  tracing_provider: TracingProvider
+  tracing_config: LangSmithConfig | LangFuseConfig | OpikConfig | WeaveConfig
+}
diff --git a/models/common.ts b/models/common.ts
new file mode 100644
index 0000000..cb8fb7f
--- /dev/null
+++ b/models/common.ts
@@ -0,0 +1,304 @@
+import type { I18nText } from '@/i18n/language'
+import type { Model } from '@/types/app'
+
+export type CommonResponse = {
+  result: 'success' | 'fail'
+}
+
+export type OauthResponse = {
+  redirect_url: string
+}
+
+export type SetupStatusResponse = {
+  step: 'finished' | 'not_started'
+  setup_at?: Date
+}
+
+export type InitValidateStatusResponse = {
+  status: 'finished' | 'not_started'
+}
+
+export type UserProfileResponse = {
+  id: string
+  name: string
+  email: string
+  avatar: string
+  avatar_url: string | null
+  is_password_set: boolean
+  interface_language?: string
+  interface_theme?: string
+  timezone?: string
+  last_login_at?: string
+  last_active_at?: string
+  last_login_ip?: string
+  created_at?: string
+}
+
+export type UserProfileOriginResponse = {
+  json: () => Promise<UserProfileResponse>
+  bodyUsed: boolean
+  headers: any
+}
+
+export type LangGeniusVersionResponse = {
+  current_version: string
+  latest_version: string
+  version: string
+  release_date: string
+  release_notes: string
+  can_auto_update: boolean
+  current_env: string
+}
+
+export type TenantInfoResponse = {
+  name: string
+  created_at: string
+  providers: Array<{
+    provider: string
+    provider_name: string
+    token_is_set: boolean
+    is_valid: boolean
+    token_is_valid: boolean
+  }>
+  in_trail: boolean
+  trial_end_reason: null | 'trial_exceeded' | 'using_custom'
+}
+
+export type Member = Pick<UserProfileResponse, 'id' | 'name' | 'email' | 'last_login_at' | 'last_active_at' | 'created_at' | 'avatar_url'> & {
+  avatar: string
+  status: 'pending' | 'active' | 'banned' | 'closed'
+  role: 'owner' | 'admin' | 'editor' | 'normal' | 'dataset_operator'
+}
+
+export enum ProviderName {
+  OPENAI = 'openai',
+  AZURE_OPENAI = 'azure_openai',
+  ANTHROPIC = 'anthropic',
+  Replicate = 'replicate',
+  HuggingfaceHub = 'huggingface_hub',
+  MiniMax = 'minimax',
+  Spark = 'spark',
+  Tongyi = 'tongyi',
+  ChatGLM = 'chatglm',
+}
+export type ProviderAzureToken = {
+  openai_api_base?: string
+  openai_api_key?: string
+}
+export type ProviderAnthropicToken = {
+  anthropic_api_key?: string
+}
+export type ProviderTokenType = {
+  [ProviderName.OPENAI]: string
+  [ProviderName.AZURE_OPENAI]: ProviderAzureToken
+  [ProviderName.ANTHROPIC]: ProviderAnthropicToken
+}
+export type Provider = {
+  [Name in ProviderName]: {
+    provider_name: Name
+  } & {
+    provider_type: 'custom' | 'system'
+    is_valid: boolean
+    is_enabled: boolean
+    last_used: string
+    token?: string | ProviderAzureToken | ProviderAnthropicToken
+  }
+}[ProviderName]
+
+export type ProviderHosted = Provider & {
+  quota_type: string
+  quota_limit: number
+  quota_used: number
+}
+
+export type AccountIntegrate = {
+  provider: 'google' | 'github'
+  created_at: number
+  is_bound: boolean
+  link: string
+}
+
+export type IWorkspace = {
+  id: string
+  name: string
+  plan: string
+  status: string
+  created_at: number
+  current: boolean
+}
+
+export type ICurrentWorkspace = Omit<IWorkspace, 'current'> & {
+  role: 'owner' | 'admin' | 'editor' | 'dataset_operator' | 'normal'
+  providers: Provider[]
+  trial_end_reason?: string
+  custom_config?: {
+    remove_webapp_brand?: boolean
+    replace_webapp_logo?: string
+  }
+}
+
+export type DataSourceNotionPage = {
+  page_icon: null | {
+    type: string | null
+    url: string | null
+    emoji: string | null
+  }
+  page_id: string
+  page_name: string
+  parent_id: string
+  type: string
+  is_bound: boolean
+}
+
+export type NotionPage = DataSourceNotionPage & {
+  workspace_id: string
+}
+
+export type DataSourceNotionPageMap = Record<string, DataSourceNotionPage & { workspace_id: string }>
+
+export type DataSourceNotionWorkspace = {
+  workspace_name: string
+  workspace_id: string
+  workspace_icon: string | null
+  total?: number
+  pages: DataSourceNotionPage[]
+}
+
+export type DataSourceNotionWorkspaceMap = Record<string, DataSourceNotionWorkspace>
+
+export type DataSourceNotion = {
+  id: string
+  provider: string
+  is_bound: boolean
+  source_info: DataSourceNotionWorkspace
+}
+
+export enum DataSourceCategory {
+  website = 'website',
+}
+export enum DataSourceProvider {
+  fireCrawl = 'firecrawl',
+  jinaReader = 'jinareader',
+  waterCrawl = 'watercrawl',
+}
+
+export type FirecrawlConfig = {
+  api_key: string
+  base_url: string
+}
+
+export type WatercrawlConfig = {
+  api_key: string
+  base_url: string
+}
+
+export type DataSourceItem = {
+  id: string
+  category: DataSourceCategory
+  provider: DataSourceProvider
+  disabled: boolean
+  created_at: number
+  updated_at: number
+}
+
+export type DataSources = {
+  sources: DataSourceItem[]
+}
+
+export type GithubRepo = {
+  stargazers_count: number
+}
+
+export type PluginProvider = {
+  tool_name: string
+  is_enabled: boolean
+  credentials: {
+    api_key: string
+  } | null
+}
+
+export type FileUploadConfigResponse = {
+  batch_count_limit: number
+  image_file_size_limit?: number | string // default is 10MB
+  file_size_limit: number // default is 15MB
+  audio_file_size_limit?: number // default is 50MB
+  video_file_size_limit?: number // default is 100MB
+  workflow_file_upload_limit?: number // default is 10
+}
+
+export type InvitationResult = {
+  status: 'success'
+  email: string
+  url: string
+} | {
+  status: 'failed'
+  email: string
+  message: string
+}
+
+export type InvitationResponse = CommonResponse & {
+  invitation_results: InvitationResult[]
+}
+
+export type ApiBasedExtension = {
+  id?: string
+  name?: string
+  api_endpoint?: string
+  api_key?: string
+}
+
+export type CodeBasedExtensionForm = {
+  type: string
+  label: I18nText
+  variable: string
+  required: boolean
+  options: { label: I18nText; value: string }[]
+  default: string
+  placeholder: string
+  max_length?: number
+}
+
+export type CodeBasedExtensionItem = {
+  name: string
+  label: any
+  form_schema: CodeBasedExtensionForm[]
+}
+export type CodeBasedExtension = {
+  module: string
+  data: CodeBasedExtensionItem[]
+}
+
+export type ExternalDataTool = {
+  type?: string
+  label?: string
+  icon?: string
+  icon_background?: string
+  variable?: string
+  enabled?: boolean
+  config?: {
+    api_based_extension_id?: string
+  } & Partial<Record<string, any>>
+}
+
+export type ModerateResponse = {
+  flagged: boolean
+  text: string
+}
+
+export type ModerationService = (
+  url: string,
+  body: {
+    app_id: string
+    text: string
+  }
+) => Promise<ModerateResponse>
+
+export type StructuredOutputRulesRequestBody = {
+  instruction: string
+  model_config: Model
+}
+
+export type StructuredOutputRulesResponse = {
+  output: string
+  error?: string
+}
diff --git a/models/datasets.ts b/models/datasets.ts
new file mode 100644
index 0000000..12ea497
--- /dev/null
+++ b/models/datasets.ts
@@ -0,0 +1,694 @@
+import type { DataSourceNotionPage, DataSourceProvider } from './common'
+import type { AppIconType, AppMode, RetrievalConfig } from '@/types/app'
+import type { Tag } from '@/app/components/base/tag-management/constant'
+import type { IndexingType } from '@/app/components/datasets/create/step-two'
+import type { MetadataFilteringVariableType } from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+import type { MetadataItemWithValue } from '@/app/components/datasets/metadata/types'
+
+export enum DataSourceType {
+  FILE = 'upload_file',
+  NOTION = 'notion_import',
+  WEB = 'website_crawl',
+}
+
+export enum DatasetPermission {
+  onlyMe = 'only_me',
+  allTeamMembers = 'all_team_members',
+  partialMembers = 'partial_members',
+}
+
+export enum ChunkingMode {
+  text = 'text_model', // General text
+  qa = 'qa_model', // General QA
+  parentChild = 'hierarchical_model', // Parent-Child
+}
+
+export type MetadataInDoc = {
+  value: string
+  id: string
+  type: MetadataFilteringVariableType
+  name: string
+}
+
+export type DataSet = {
+  id: string
+  name: string
+  icon: string
+  icon_background: string
+  description: string
+  permission: DatasetPermission
+  data_source_type: DataSourceType
+  indexing_technique: IndexingType
+  created_by: string
+  updated_by: string
+  updated_at: number
+  app_count: number
+  doc_form: ChunkingMode
+  document_count: number
+  word_count: number
+  provider: string
+  embedding_model: string
+  embedding_model_provider: string
+  embedding_available: boolean
+  retrieval_model_dict: RetrievalConfig
+  retrieval_model: RetrievalConfig
+  tags: Tag[]
+  partial_member_list?: string[]
+  external_knowledge_info: {
+    external_knowledge_id: string
+    external_knowledge_api_id: string
+    external_knowledge_api_name: string
+    external_knowledge_api_endpoint: string
+  }
+  external_retrieval_model: {
+    top_k: number
+    score_threshold: number
+    score_threshold_enabled: boolean
+  }
+  built_in_field_enabled: boolean
+  doc_metadata?: MetadataInDoc[]
+}
+
+export type ExternalAPIItem = {
+  id: string
+  tenant_id: string
+  name: string
+  description: string
+  settings: {
+    endpoint: string
+    api_key: string
+  }
+  dataset_bindings: { id: string; name: string }[]
+  created_by: string
+  created_at: string
+}
+
+export type ExternalKnowledgeItem = {
+  id: string
+  name: string
+  description: string | null
+  provider: 'external'
+  permission: DatasetPermission
+  data_source_type: null
+  indexing_technique: null
+  app_count: number
+  document_count: number
+  word_count: number
+  created_by: string
+  created_at: string
+  updated_by: string
+  updated_at: string
+  tags: Tag[]
+}
+
+export type ExternalAPIDeleteResponse = {
+  result: 'success' | 'error'
+}
+
+export type ExternalAPIUsage = {
+  is_using: boolean
+  count: number
+}
+
+export type CustomFile = File & {
+  id?: string
+  extension?: string
+  mime_type?: string
+  created_by?: string
+  created_at?: number
+}
+
+export type DocumentItem = {
+  id: string
+  name: string
+  extension: string
+}
+
+export type CrawlOptions = {
+  crawl_sub_pages: boolean
+  only_main_content: boolean
+  includes: string
+  excludes: string
+  limit: number | string
+  max_depth: number | string
+  use_sitemap: boolean
+}
+
+export type CrawlResultItem = {
+  title: string
+  markdown: string
+  description: string
+  source_url: string
+}
+
+export type FileItem = {
+  fileID: string
+  file: CustomFile
+  progress: number
+}
+
+export type FetchDatasetsParams = {
+  url: string
+  params: {
+    page: number
+    ids?: string[]
+    tag_ids?: string[]
+    limit?: number
+    include_all?: boolean
+    keyword?: string
+  }
+}
+
+export type DataSetListResponse = {
+  data: DataSet[]
+  has_more: boolean
+  limit: number
+  page: number
+  total: number
+}
+
+export type ExternalAPIListResponse = {
+  data: ExternalAPIItem[]
+  has_more: boolean
+  limit: number
+  page: number
+  total: number
+}
+
+export type QA = {
+  question: string
+  answer: string
+}
+
+export type IndexingEstimateResponse = {
+  tokens: number
+  total_price: number
+  currency: string
+  total_segments: number
+  preview: Array<{ content: string; child_chunks: string[] }>
+  qa_preview?: QA[]
+}
+
+export type FileIndexingEstimateResponse = {
+  total_nodes: number
+} & IndexingEstimateResponse
+
+export type IndexingStatusResponse = {
+  id: string
+  indexing_status: DocumentIndexingStatus
+  processing_started_at: number
+  parsing_completed_at: number
+  cleaning_completed_at: number
+  splitting_completed_at: number
+  completed_at: any
+  paused_at: any
+  error: any
+  stopped_at: any
+  completed_segments: number
+  total_segments: number
+}
+export type IndexingStatusBatchResponse = {
+  data: IndexingStatusResponse[]
+}
+
+export enum ProcessMode {
+  general = 'custom',
+  parentChild = 'hierarchical',
+}
+
+export type ParentMode = 'full-doc' | 'paragraph'
+
+export type ProcessRuleResponse = {
+  mode: ProcessMode
+  rules: Rules
+  limits: Limits
+}
+
+export type Rules = {
+  pre_processing_rules: PreProcessingRule[]
+  segmentation: Segmentation
+  parent_mode: ParentMode
+  subchunk_segmentation: Segmentation
+}
+
+export type Limits = {
+  indexing_max_segmentation_tokens_length: number
+}
+
+export type PreProcessingRule = {
+  id: string
+  enabled: boolean
+}
+
+export type Segmentation = {
+  separator: string
+  max_tokens: number
+  chunk_overlap?: number
+}
+
+export const DocumentIndexingStatusList = [
+  'waiting',
+  'parsing',
+  'cleaning',
+  'splitting',
+  'indexing',
+  'paused',
+  'error',
+  'completed',
+] as const
+
+export type DocumentIndexingStatus = typeof DocumentIndexingStatusList[number]
+
+export const DisplayStatusList = [
+  'queuing',
+  'indexing',
+  'paused',
+  'error',
+  'available',
+  'enabled',
+  'disabled',
+  'archived',
+] as const
+
+export type DocumentDisplayStatus = typeof DisplayStatusList[number]
+
+export type DataSourceInfo = {
+  upload_file: {
+    id: string
+    name: string
+    size: number
+    mime_type: string
+    created_at: number
+    created_by: string
+    extension: string
+  }
+  notion_page_icon?: string
+  notion_workspace_id?: string
+  notion_page_id?: string
+  provider?: DataSourceProvider
+  job_id: string
+  url: string
+}
+
+export type InitialDocumentDetail = {
+  id: string
+  batch: string
+  position: number
+  dataset_id: string
+  data_source_type: DataSourceType
+  data_source_info: DataSourceInfo
+  dataset_process_rule_id: string
+  name: string
+  created_from: 'api' | 'web'
+  created_by: string
+  created_at: number
+  indexing_status: DocumentIndexingStatus
+  display_status: DocumentDisplayStatus
+  completed_segments?: number
+  total_segments?: number
+  doc_form: ChunkingMode
+  doc_language: string
+}
+
+export type SimpleDocumentDetail = InitialDocumentDetail & {
+  enabled: boolean
+  word_count: number
+  is_qa: boolean // TODO waiting for backend to add this field
+  error?: string | null
+  archived: boolean
+  updated_at: number
+  hit_count: number
+  dataset_process_rule_id?: string
+  data_source_detail_dict?: {
+    upload_file: {
+      name: string
+      extension: string
+    }
+  }
+  doc_metadata?: MetadataItemWithValue[]
+}
+
+export type DocumentListResponse = {
+  data: SimpleDocumentDetail[]
+  has_more: boolean
+  total: number
+  page: number
+  limit: number
+}
+
+export type DocumentReq = {
+  original_document_id?: string
+  indexing_technique?: string
+  doc_form: ChunkingMode
+  doc_language: string
+  process_rule: ProcessRule
+}
+
+export type CreateDocumentReq = DocumentReq & {
+  data_source: DataSource
+  retrieval_model: RetrievalConfig
+  embedding_model: string
+  embedding_model_provider: string
+}
+
+export type IndexingEstimateParams = DocumentReq & Partial<DataSource> & {
+  dataset_id: string
+}
+
+export type DataSource = {
+  type: DataSourceType
+  info_list: {
+    data_source_type: DataSourceType
+    notion_info_list?: NotionInfo[]
+    file_info_list?: {
+      file_ids: string[]
+    }
+    website_info_list?: {
+      provider: string
+      job_id: string
+      urls: string[]
+    }
+  }
+}
+
+export type NotionInfo = {
+  workspace_id: string
+  pages: DataSourceNotionPage[]
+}
+export type NotionPage = {
+  page_id: string
+  type: string
+}
+
+export type ProcessRule = {
+  mode: ProcessMode
+  rules: Rules
+}
+
+export type createDocumentResponse = {
+  dataset?: DataSet
+  batch: string
+  documents: InitialDocumentDetail[]
+}
+
+export type PrecessRule = {
+  mode: ProcessMode
+  rules: Rules
+}
+
+export type FullDocumentDetail = SimpleDocumentDetail & {
+  batch: string
+  created_api_request_id: string
+  processing_started_at: number
+  parsing_completed_at: number
+  cleaning_completed_at: number
+  splitting_completed_at: number
+  tokens: number
+  indexing_latency: number
+  completed_at: number
+  paused_by: string
+  paused_at: number
+  stopped_at: number
+  indexing_status: string
+  disabled_at: number
+  disabled_by: string
+  archived_reason: 'rule_modified' | 're_upload'
+  archived_by: string
+  archived_at: number
+  doc_type?: DocType | null | 'others'
+  doc_metadata?: DocMetadata | null
+  segment_count: number
+  dataset_process_rule: PrecessRule
+  document_process_rule: ProcessRule
+  [key: string]: any
+}
+
+export type DocMetadata = {
+  title: string
+  language: string
+  author: string
+  publisher: string
+  publicationDate: string
+  ISBN: string
+  category: string
+  [key: string]: string
+}
+
+export const CUSTOMIZABLE_DOC_TYPES = [
+  'book',
+  'web_page',
+  'paper',
+  'social_media_post',
+  'personal_document',
+  'business_document',
+  'im_chat_log',
+] as const
+
+export const FIXED_DOC_TYPES = ['synced_from_github', 'synced_from_notion', 'wikipedia_entry'] as const
+
+export type CustomizableDocType = typeof CUSTOMIZABLE_DOC_TYPES[number]
+export type FixedDocType = typeof FIXED_DOC_TYPES[number]
+export type DocType = CustomizableDocType | FixedDocType
+
+export type DocumentDetailResponse = FullDocumentDetail
+
+export const SEGMENT_STATUS_LIST = ['waiting', 'completed', 'error', 'indexing']
+export type SegmentStatus = typeof SEGMENT_STATUS_LIST[number]
+
+export type SegmentsQuery = {
+  page?: string
+  limit: number
+  // status?: SegmentStatus
+  hit_count_gte?: number
+  keyword?: string
+  enabled?: boolean | 'all'
+}
+
+export type SegmentDetailModel = {
+  id: string
+  position: number
+  document_id: string
+  content: string
+  sign_content: string
+  word_count: number
+  tokens: number
+  keywords: string[]
+  index_node_id: string
+  index_node_hash: string
+  hit_count: number
+  enabled: boolean
+  disabled_at: number
+  disabled_by: string
+  status: SegmentStatus
+  created_by: string
+  created_at: number
+  indexing_at: number
+  completed_at: number
+  error: string | null
+  stopped_at: number
+  answer?: string
+  child_chunks?: ChildChunkDetail[]
+  updated_at: number
+}
+
+export type SegmentsResponse = {
+  data: SegmentDetailModel[]
+  has_more: boolean
+  limit: number
+  total: number
+  total_pages: number
+  page: number
+}
+
+export type HitTestingRecord = {
+  id: string
+  content: string
+  source: 'app' | 'hit_testing' | 'plugin'
+  source_app_id: string
+  created_by_role: 'account' | 'end_user'
+  created_by: string
+  created_at: number
+}
+
+export type HitTestingChildChunk = {
+  id: string
+  content: string
+  position: number
+  score: number
+}
+export type HitTesting = {
+  segment: Segment
+  content: Segment
+  score: number
+  tsne_position: TsnePosition
+  child_chunks?: HitTestingChildChunk[] | null
+}
+
+export type ExternalKnowledgeBaseHitTesting = {
+  content: string
+  title: string
+  score: number
+  metadata: {
+    'x-amz-bedrock-kb-source-uri': string
+    'x-amz-bedrock-kb-data-source-id': string
+  }
+}
+
+export type Segment = {
+  id: string
+  document: Document
+  content: string
+  sign_content: string
+  position: number
+  word_count: number
+  tokens: number
+  keywords: string[]
+  hit_count: number
+  index_node_hash: string
+}
+
+export type Document = {
+  id: string
+  data_source_type: string
+  name: string
+  doc_type: DocType
+}
+
+export type HitTestingRecordsResponse = {
+  data: HitTestingRecord[]
+  has_more: boolean
+  limit: number
+  total: number
+  page: number
+}
+
+export type TsnePosition = {
+  x: number
+  y: number
+}
+
+export type HitTestingResponse = {
+  query: {
+    content: string
+    tsne_position: TsnePosition
+  }
+  records: Array<HitTesting>
+}
+
+export type ExternalKnowledgeBaseHitTestingResponse = {
+  query: {
+    content: string
+  }
+  records: Array<ExternalKnowledgeBaseHitTesting>
+}
+
+export type RelatedApp = {
+  id: string
+  name: string
+  mode: AppMode
+  icon_type: AppIconType | null
+  icon: string
+  icon_background: string
+  icon_url: string
+}
+
+export type RelatedAppResponse = {
+  data: Array<RelatedApp>
+  total: number
+}
+
+export type SegmentUpdater = {
+  content: string
+  answer?: string
+  keywords?: string[]
+  regenerate_child_chunks?: boolean
+}
+
+export type ErrorDocsResponse = {
+  data: IndexingStatusResponse[]
+  total: number
+}
+
+export type SelectedDatasetsMode = {
+  allHighQuality: boolean
+  allHighQualityVectorSearch: boolean
+  allHighQualityFullTextSearch: boolean
+  allEconomic: boolean
+  mixtureHighQualityAndEconomic: boolean
+  allInternal: boolean
+  allExternal: boolean
+  mixtureInternalAndExternal: boolean
+  inconsistentEmbeddingModel: boolean
+}
+
+export enum WeightedScoreEnum {
+  SemanticFirst = 'semantic_first',
+  KeywordFirst = 'keyword_first',
+  Customized = 'customized',
+}
+
+export enum RerankingModeEnum {
+  RerankingModel = 'reranking_model',
+  WeightedScore = 'weighted_score',
+}
+
+export const DEFAULT_WEIGHTED_SCORE = {
+  allHighQualityVectorSearch: {
+    semantic: 1.0,
+    keyword: 0,
+  },
+  allHighQualityFullTextSearch: {
+    semantic: 0,
+    keyword: 1.0,
+  },
+  other: {
+    semantic: 0.7,
+    keyword: 0.3,
+  },
+}
+
+export type ChildChunkType = 'automatic' | 'customized'
+
+export type ChildChunkDetail = {
+  id: string
+  position: number
+  segment_id: string
+  content: string
+  word_count: number
+  created_at: number
+  updated_at: number
+  type: ChildChunkType
+}
+
+export type ChildSegmentsResponse = {
+  data: ChildChunkDetail[]
+  total: number
+  total_pages: number
+  page: number
+  limit: number
+}
+
+export type UpdateDocumentParams = {
+  datasetId: string
+  documentId: string
+}
+
+// Used in api url
+export enum DocumentActionType {
+  enable = 'enable',
+  disable = 'disable',
+  archive = 'archive',
+  unArchive = 'un_archive',
+  delete = 'delete',
+}
+
+export type UpdateDocumentBatchParams = {
+  datasetId: string
+  documentId?: string
+  documentIds?: string[] | string
+}
+
+export type BatchImportResponse = {
+  job_id: string
+  job_status: string
+}
diff --git a/models/debug.ts b/models/debug.ts
new file mode 100644
index 0000000..18c2c02
--- /dev/null
+++ b/models/debug.ts
@@ -0,0 +1,256 @@
+import type { AgentStrategy, ModelModeType, RETRIEVE_TYPE, ToolItem, TtsAutoPlay } from '@/types/app'
+import type {
+  RerankingModeEnum,
+  WeightedScoreEnum,
+} from '@/models/datasets'
+import type { FileUpload } from '@/app/components/base/features/types'
+import type {
+  MetadataFilteringConditions,
+  MetadataFilteringModeEnum,
+} from '@/app/components/workflow/nodes/knowledge-retrieval/types'
+import type { ModelConfig as NodeModelConfig } from '@/app/components/workflow/types'
+export type Inputs = Record<string, string | number | object>
+
+export enum PromptMode {
+  simple = 'simple',
+  advanced = 'advanced',
+}
+
+export type PromptItem = {
+  role?: PromptRole
+  text: string
+}
+
+export type ChatPromptConfig = {
+  prompt: PromptItem[]
+}
+
+export type ConversationHistoriesRole = {
+  user_prefix: string
+  assistant_prefix: string
+}
+export type CompletionPromptConfig = {
+  prompt: PromptItem
+  conversation_histories_role: ConversationHistoriesRole
+}
+
+export type BlockStatus = {
+  context: boolean
+  history: boolean
+  query: boolean
+}
+
+export enum PromptRole {
+  system = 'system',
+  user = 'user',
+  assistant = 'assistant',
+}
+
+export type PromptVariable = {
+  key: string
+  name: string
+  type: string // "string" | "number" | "select",
+  default?: string | number
+  required?: boolean
+  options?: string[]
+  max_length?: number
+  is_context_var?: boolean
+  enabled?: boolean
+  config?: Record<string, any>
+  icon?: string
+  icon_background?: string
+}
+
+export type CompletionParams = {
+  max_tokens: number
+  temperature: number
+  top_p: number
+  presence_penalty: number
+  frequency_penalty: number
+  stop?: string[]
+}
+
+export type ModelId = 'gpt-3.5-turbo' | 'text-davinci-003'
+
+export type PromptConfig = {
+  prompt_template: string
+  prompt_variables: PromptVariable[]
+}
+
+export type MoreLikeThisConfig = {
+  enabled: boolean
+}
+
+export type SuggestedQuestionsAfterAnswerConfig = MoreLikeThisConfig
+
+export type SpeechToTextConfig = MoreLikeThisConfig
+
+export type TextToSpeechConfig = {
+  enabled: boolean
+  voice?: string
+  language?: string
+  autoPlay?: TtsAutoPlay
+}
+
+export type CitationConfig = MoreLikeThisConfig
+
+export type AnnotationReplyConfig = {
+  id: string
+  enabled: boolean
+  score_threshold: number
+  embedding_model: {
+    embedding_provider_name: string
+    embedding_model_name: string
+  }
+}
+
+export type ModerationContentConfig = {
+  enabled: boolean
+  preset_response?: string
+}
+export type ModerationConfig = MoreLikeThisConfig & {
+  type?: string
+  config?: {
+    keywords?: string
+    api_based_extension_id?: string
+    inputs_config?: ModerationContentConfig
+    outputs_config?: ModerationContentConfig
+  } & Partial<Record<string, any>>
+}
+
+export type RetrieverResourceConfig = MoreLikeThisConfig
+export type AgentConfig = {
+  enabled: boolean
+  strategy: AgentStrategy
+  max_iteration: number
+  tools: ToolItem[]
+}
+// frontend use. Not the same as backend
+export type ModelConfig = {
+  provider: string // LLM Provider: for example "OPENAI"
+  model_id: string
+  mode: ModelModeType
+  configs: PromptConfig
+  opening_statement: string | null
+  more_like_this: MoreLikeThisConfig | null
+  suggested_questions: string[] | null
+  suggested_questions_after_answer: SuggestedQuestionsAfterAnswerConfig | null
+  speech_to_text: SpeechToTextConfig | null
+  text_to_speech: TextToSpeechConfig | null
+  file_upload: FileUpload | null
+  retriever_resource: RetrieverResourceConfig | null
+  sensitive_word_avoidance: ModerationConfig | null
+  annotation_reply: AnnotationReplyConfig | null
+  dataSets: any[]
+  agentConfig: AgentConfig
+}
+export type DatasetConfigItem = {
+  enable: boolean
+  value: number
+}
+
+export type DatasetConfigs = {
+  retrieval_model: RETRIEVE_TYPE
+  reranking_model: {
+    reranking_provider_name: string
+    reranking_model_name: string
+  }
+  top_k: number
+  score_threshold_enabled: boolean
+  score_threshold: number | null | undefined
+  datasets: {
+    datasets: {
+      enabled: boolean
+      id: string
+    }[]
+  }
+  reranking_mode?: RerankingModeEnum
+  weights?: {
+    weight_type: WeightedScoreEnum
+    vector_setting: {
+      vector_weight: number
+      embedding_provider_name: string
+      embedding_model_name: string
+    }
+    keyword_setting: {
+      keyword_weight: number
+    }
+  }
+  reranking_enable?: boolean
+  metadata_filtering_mode?: MetadataFilteringModeEnum
+  metadata_filtering_conditions?: MetadataFilteringConditions
+  metadata_model_config?: NodeModelConfig
+}
+
+export type DebugRequestBody = {
+  inputs: Inputs
+  query: string
+  completion_params: CompletionParams
+  model_config: ModelConfig
+}
+
+export type DebugResponse = {
+  id: string
+  answer: string
+  created_at: string
+}
+
+export type DebugResponseStream = {
+  id: string
+  data: string
+  created_at: string
+}
+
+export type FeedBackRequestBody = {
+  message_id: string
+  rating: 'like' | 'dislike'
+  content?: string
+  from_source: 'api' | 'log'
+}
+
+export type FeedBackResponse = {
+  message_id: string
+  rating: 'like' | 'dislike'
+}
+
+// Log session list
+export type LogSessionListQuery = {
+  keyword?: string
+  start?: string // format datetime(YYYY-mm-dd HH:ii)
+  end?: string // format datetime(YYYY-mm-dd HH:ii)
+  page: number
+  limit: number // default 20. 1-100
+}
+
+export type LogSessionListResponse = {
+  data: {
+    id: string
+    conversation_id: string
+    query: string // user's query question
+    message: string // prompt send to LLM
+    answer: string
+    created_at: string
+  }[]
+  total: number
+  page: number
+}
+
+// log session detail and debug
+export type LogSessionDetailResponse = {
+  id: string
+  conversation_id: string
+  model_provider: string
+  query: string
+  inputs: Record<string, string | number | object>[]
+  message: string
+  message_tokens: number // number of tokens in message
+  answer: string
+  answer_tokens: number // number of tokens in answer
+  provider_response_latency: number // used time in ms
+  from_source: 'api' | 'log'
+}
+
+export type SavedMessage = {
+  id: string
+  answer: string
+}
diff --git a/models/explore.ts b/models/explore.ts
new file mode 100644
index 0000000..ad243e9
--- /dev/null
+++ b/models/explore.ts
@@ -0,0 +1,37 @@
+import type { AppIconType, AppMode } from '@/types/app'
+export type AppBasicInfo = {
+  id: string
+  mode: AppMode
+  icon_type: AppIconType | null
+  icon: string
+  icon_background: string
+  icon_url: string
+  name: string
+  description: string
+  use_icon_as_answer_icon: boolean
+}
+
+export type AppCategory = 'Writing' | 'Translate' | 'HR' | 'Programming' | 'Assistant' | 'Agent' | 'Recommended' | 'Workflow'
+
+export type App = {
+  app: AppBasicInfo
+  app_id: string
+  description: string
+  copyright: string
+  privacy_policy: string | null
+  custom_disclaimer: string | null
+  category: AppCategory
+  position: number
+  is_listed: boolean
+  install_count: number
+  installed: boolean
+  editable: boolean
+  is_agent: boolean
+}
+
+export type InstalledApp = {
+  app: AppBasicInfo
+  id: string
+  uninstallable: boolean
+  is_pinned: boolean
+}
diff --git a/models/log.ts b/models/log.ts
new file mode 100644
index 0000000..9886fe2
--- /dev/null
+++ b/models/log.ts
@@ -0,0 +1,355 @@
+import type { Viewport } from 'reactflow'
+import type { VisionFile } from '@/types/app'
+import type {
+  Edge,
+  Node,
+} from '@/app/components/workflow/types'
+import type { Metadata } from '@/app/components/base/chat/chat/type'
+
+// Log type contains key:string conversation_id:string created_at:string question:string answer:string
+export type Conversation = {
+  id: string
+  key: string
+  conversationId: string
+  question: string
+  answer: string
+  userRate: number
+  adminRate: number
+}
+
+export type ConversationListResponse = {
+  logs: Conversation[]
+}
+
+export const fetchLogs = (url: string) =>
+  fetch(url).then<ConversationListResponse>(r => r.json())
+
+export const CompletionParams = ['temperature', 'top_p', 'presence_penalty', 'max_token', 'stop', 'frequency_penalty'] as const
+
+export type CompletionParamType = typeof CompletionParams[number]
+
+export type CompletionParamsType = {
+  max_tokens: number
+  temperature: number
+  top_p: number
+  stop: string[]
+  presence_penalty: number
+  frequency_penalty: number
+}
+
+export type LogModelConfig = {
+  name: string
+  provider: string
+  completion_params: CompletionParamsType
+}
+
+export type ModelConfigDetail = {
+  introduction: string
+  prompt_template: string
+  prompt_variables: Array<{
+    key: string
+    name: string
+    description: string
+    type: string | number
+    default: string
+    options: string[]
+  }>
+  completion_params: CompletionParamsType
+}
+
+export type LogAnnotation = {
+  id: string
+  content: string
+  account: {
+    id: string
+    name: string
+    email: string
+  }
+  created_at: number
+}
+
+export type Annotation = {
+  id: string
+  authorName: string
+  logAnnotation?: LogAnnotation
+  created_at?: number
+}
+
+export type MessageContent = {
+  id: string
+  conversation_id: string
+  query: string
+  inputs: Record<string, any>
+  message: { role: string; text: string; files?: VisionFile[] }[]
+  message_tokens: number
+  answer_tokens: number
+  answer: string
+  provider_response_latency: number
+  created_at: number
+  annotation: LogAnnotation
+  annotation_hit_history: {
+    annotation_id: string
+    annotation_create_account: {
+      id: string
+      name: string
+      email: string
+    }
+    created_at: number
+  }
+  feedbacks: Array<{
+    rating: 'like' | 'dislike' | null
+    content: string | null
+    from_source?: 'admin' | 'user'
+    from_end_user_id?: string
+  }>
+  message_files: VisionFile[]
+  metadata: Metadata
+  agent_thoughts: any[] // TODO
+  workflow_run_id: string
+  parent_message_id: string | null
+}
+
+export type CompletionConversationGeneralDetail = {
+  id: string
+  status: 'normal' | 'finished'
+  from_source: 'api' | 'console'
+  from_end_user_id: string
+  from_end_user_session_id: string
+  from_account_id: string
+  read_at: Date
+  created_at: number
+  updated_at: number
+  annotation: Annotation
+  user_feedback_stats: {
+    like: number
+    dislike: number
+  }
+  admin_feedback_stats: {
+    like: number
+    dislike: number
+  }
+  model_config: {
+    provider: string
+    model_id: string
+    configs: Pick<ModelConfigDetail, 'prompt_template'>
+  }
+  message: Pick<MessageContent, 'inputs' | 'query' | 'answer' | 'message'>
+}
+
+export type CompletionConversationFullDetailResponse = {
+  id: string
+  status: 'normal' | 'finished'
+  from_source: 'api' | 'console'
+  from_end_user_id: string
+  from_account_id: string
+  // read_at: Date
+  created_at: number
+  model_config: {
+    provider: string
+    model_id: string
+    configs: ModelConfigDetail
+  }
+  message: MessageContent
+}
+
+export type CompletionConversationsResponse = {
+  data: Array<CompletionConversationGeneralDetail>
+  has_more: boolean
+  limit: number
+  total: number
+  page: number
+}
+
+export type CompletionConversationsRequest = {
+  keyword: string
+  start: string
+  end: string
+  annotation_status: string
+  page: number
+  limit: number // The default value is 20 and the range is 1-100
+}
+
+export type ChatConversationGeneralDetail = Omit<CompletionConversationGeneralDetail, 'message' | 'annotation'> & {
+  summary: string
+  message_count: number
+  annotated: boolean
+}
+
+export type ChatConversationsResponse = {
+  data: Array<ChatConversationGeneralDetail>
+  has_more: boolean
+  limit: number
+  total: number
+  page: number
+}
+
+export type ChatConversationsRequest = CompletionConversationsRequest & { message_count: number }
+
+export type ChatConversationFullDetailResponse = Omit<CompletionConversationGeneralDetail, 'message' | 'model_config'> & {
+  message_count: number
+  model_config: {
+    provider: string
+    model_id: string
+    configs: ModelConfigDetail
+    model: LogModelConfig
+  }
+}
+
+export type ChatMessagesRequest = {
+  conversation_id: string
+  first_id?: string
+  limit: number
+}
+export type ChatMessage = MessageContent
+
+export type ChatMessagesResponse = {
+  data: Array<ChatMessage>
+  has_more: boolean
+  limit: number
+}
+
+export const MessageRatings = ['like', 'dislike', null] as const
+export type MessageRating = typeof MessageRatings[number]
+
+export type LogMessageFeedbacksRequest = {
+  message_id: string
+  rating: MessageRating
+  content?: string
+}
+
+export type LogMessageFeedbacksResponse = {
+  result: 'success' | 'error'
+}
+
+export type LogMessageAnnotationsRequest = Omit<LogMessageFeedbacksRequest, 'rating'>
+
+export type LogMessageAnnotationsResponse = LogMessageFeedbacksResponse
+
+export type AnnotationsCountResponse = {
+  count: number
+}
+
+export type WorkflowRunDetail = {
+  id: string
+  version: string
+  status: 'running' | 'succeeded' | 'failed' | 'stopped'
+  error?: string
+  elapsed_time: number
+  total_tokens: number
+  total_price: number
+  currency: string
+  total_steps: number
+  finished_at: number
+}
+export type AccountInfo = {
+  id: string
+  name: string
+  email: string
+}
+export type EndUserInfo = {
+  id: string
+  type: 'browser' | 'service_api'
+  is_anonymous: boolean
+  session_id: string
+}
+export type WorkflowAppLogDetail = {
+  id: string
+  workflow_run: WorkflowRunDetail
+  created_from: 'service-api' | 'web-app' | 'explore'
+  created_by_role: 'account' | 'end_user'
+  created_by_account?: AccountInfo
+  created_by_end_user?: EndUserInfo
+  created_at: number
+  read_at?: number
+}
+export type WorkflowLogsResponse = {
+  data: Array<WorkflowAppLogDetail>
+  has_more: boolean
+  limit: number
+  total: number
+  page: number
+}
+export type WorkflowLogsRequest = {
+  keyword: string
+  status: string
+  page: number
+  limit: number // The default value is 20 and the range is 1-100
+}
+
+export type WorkflowRunDetailResponse = {
+  id: string
+  sequence_number: number
+  version: string
+  graph: {
+    nodes: Node[]
+    edges: Edge[]
+    viewport?: Viewport
+  }
+  inputs: string
+  status: 'running' | 'succeeded' | 'failed' | 'stopped'
+  outputs?: string
+  error?: string
+  elapsed_time?: number
+  total_tokens?: number
+  total_steps: number
+  created_by_role: 'account' | 'end_user'
+  created_by_account?: AccountInfo
+  created_by_end_user?: EndUserInfo
+  created_at: number
+  finished_at: number
+  exceptions_count?: number
+}
+
+export type AgentLogMeta = {
+  status: string
+  executor: string
+  start_time: string
+  elapsed_time: number
+  total_tokens: number
+  agent_mode: string
+  iterations: number
+  error?: string
+}
+
+export type ToolCall = {
+  status: string
+  error?: string | null
+  time_cost?: number
+  tool_icon: any
+  tool_input?: any
+  tool_output?: any
+  tool_name?: string
+  tool_label?: any
+  tool_parameters?: any
+}
+
+export type AgentIteration = {
+  created_at: string
+  files: string[]
+  thought: string
+  tokens: number
+  tool_calls: ToolCall[]
+  tool_raw: {
+    inputs: string
+    outputs: string
+  }
+}
+
+export type AgentLogFile = {
+  id: string
+  type: string
+  url: string
+  name: string
+  belongs_to: string
+}
+
+export type AgentLogDetailRequest = {
+  conversation_id: string
+  message_id: string
+}
+
+export type AgentLogDetailResponse = {
+  meta: AgentLogMeta
+  iterations: AgentIteration[]
+  files: AgentLogFile[]
+}
diff --git a/models/share.ts b/models/share.ts
new file mode 100644
index 0000000..3521365
--- /dev/null
+++ b/models/share.ts
@@ -0,0 +1,48 @@
+import type { Locale } from '@/i18n'
+import type { AppIconType } from '@/types/app'
+
+export type ResponseHolder = {}
+
+export type ConversationItem = {
+  id: string
+  name: string
+  inputs: Record<string, any> | null
+  introduction: string
+}
+
+export type SiteInfo = {
+  title: string
+  chat_color_theme?: string
+  chat_color_theme_inverted?: boolean
+  icon_type?: AppIconType | null
+  icon?: string
+  icon_background?: string | null
+  icon_url?: string | null
+  description?: string
+  default_language?: Locale
+  prompt_public?: boolean
+  copyright?: string
+  privacy_policy?: string
+  custom_disclaimer?: string
+  show_workflow_steps?: boolean
+  use_icon_as_answer_icon?: boolean
+}
+
+export type AppMeta = {
+  tool_icons: Record<string, string>
+}
+
+export type AppData = {
+  app_id: string
+  can_replace_logo?: boolean
+  custom_config?: Record<string, any>
+  enable_site?: boolean
+  end_user_id?: string
+  site: SiteInfo
+}
+
+export type AppConversationData = {
+  data: ConversationItem[]
+  has_more: boolean
+  limit: number
+}
diff --git a/models/user.ts b/models/user.ts
new file mode 100644
index 0000000..5451980
--- /dev/null
+++ b/models/user.ts
@@ -0,0 +1,17 @@
+export type User = {
+  id: string
+  firstName: string
+  lastName: string
+  name: string
+  phone: string
+  username: string
+  email: string
+  avatar: string
+}
+
+export type UserResponse = {
+  users: User[]
+}
+
+export const fetchUsers = (url: string) =>
+  fetch(url).then<UserResponse>(r => r.json())
diff --git a/next.config.js b/next.config.js
new file mode 100644
index 0000000..9ce1b35
--- /dev/null
+++ b/next.config.js
@@ -0,0 +1,69 @@
+const { basePath, assetPrefix } = require('./utils/var-basePath')
+const { codeInspectorPlugin } = require('code-inspector-plugin')
+const withMDX = require('@next/mdx')({
+  extension: /\.mdx?$/,
+  options: {
+    // If you use remark-gfm, you'll need to use next.config.mjs
+    // as the package is ESM only
+    // https://github.com/remarkjs/remark-gfm#install
+    remarkPlugins: [],
+    rehypePlugins: [],
+    // If you use `MDXProvider`, uncomment the following line.
+    // providerImportSource: "@mdx-js/react",
+  },
+})
+
+// the default url to prevent parse url error when running jest
+const hasSetWebPrefix = process.env.NEXT_PUBLIC_WEB_PREFIX
+const port = process.env.PORT || 3000
+const locImageURLs = !hasSetWebPrefix ? [new URL(`http://localhost:${port}/**`), new URL(`http://127.0.0.1:${port}/**`)] : []
+const remoteImageURLs = [hasSetWebPrefix ? new URL(`${process.env.NEXT_PUBLIC_WEB_PREFIX}/**`) : '', ...locImageURLs].filter(item => !!item)
+
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+  basePath,
+  assetPrefix,
+  webpack: (config, { dev, isServer }) => {
+    config.plugins.push(codeInspectorPlugin({ bundler: 'webpack' }))
+    return config
+  },
+  productionBrowserSourceMaps: false, // enable browser source map generation during the production build
+  // Configure pageExtensions to include md and mdx
+  pageExtensions: ['ts', 'tsx', 'js', 'jsx', 'md', 'mdx'],
+  // https://nextjs.org/docs/messages/next-image-unconfigured-host
+  images: {
+    remotePatterns: remoteImageURLs.map(remoteImageURL => ({
+      protocol: remoteImageURL.protocol.replace(':', ''),
+      hostname: remoteImageURL.hostname,
+      port: remoteImageURL.port,
+      pathname: remoteImageURL.pathname,
+      search: '',
+    })),
+  },
+  experimental: {
+  },
+  // fix all before production. Now it slow the develop speed.
+  eslint: {
+    // Warning: This allows production builds to successfully complete even if
+    // your project has ESLint errors.
+    ignoreDuringBuilds: true,
+    dirs: ['app', 'bin', 'config', 'context', 'hooks', 'i18n', 'models', 'service', 'test', 'types', 'utils'],
+  },
+  typescript: {
+    // https://nextjs.org/docs/api-reference/next.config.js/ignoring-typescript-errors
+    ignoreBuildErrors: true,
+  },
+  reactStrictMode: true,
+  async redirects() {
+    return [
+      {
+        source: '/',
+        destination: '/apps',
+        permanent: false,
+      },
+    ]
+  },
+  output: 'standalone',
+}
+
+module.exports = withMDX(nextConfig)
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..3da5b54
--- /dev/null
+++ b/package.json
@@ -0,0 +1,229 @@
+{
+  "name": "dify-web",
+  "version": "1.4.0",
+  "private": true,
+  "engines": {
+    "node": ">=v22.11.0"
+  },
+  "scripts": {
+    "dev": "cross-env NODE_OPTIONS='--inspect' next dev",
+    "build": "next build",
+    "start": "cp -r .next/static .next/standalone/.next/static && cp -r public .next/standalone/public && cross-env PORT=$npm_config_port HOSTNAME=$npm_config_host node .next/standalone/server.js",
+    "lint": "pnpm eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache",
+    "lint-only-show-error": "pnpm eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache --quiet",
+    "fix": "next lint --fix",
+    "eslint-fix": "eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache --fix",
+    "eslint-fix-only-show-error": "eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache --fix --quiet",
+    "eslint-complexity": "eslint --rule 'complexity: [error, {max: 15}]' --quiet",
+    "prepare": "cd ../ && node -e \"if (process.env.NODE_ENV !== 'production'){process.exit(1)} \" || husky ./web/.husky",
+    "gen-icons": "node ./app/components/base/icons/script.mjs",
+    "uglify-embed": "node ./bin/uglify-embed",
+    "check-i18n": "node ./i18n/check-i18n.js",
+    "auto-gen-i18n": "node ./i18n/auto-gen-i18n.js",
+    "test": "jest",
+    "test:watch": "jest --watch",
+    "storybook": "storybook dev -p 6006",
+    "build-storybook": "storybook build",
+    "preinstall": "npx only-allow pnpm"
+  },
+  "dependencies": {
+    "@babel/runtime": "^7.22.3",
+    "@dagrejs/dagre": "^1.1.4",
+    "@emoji-mart/data": "^1.2.1",
+    "@eslint/compat": "^1.2.4",
+    "@floating-ui/react": "^0.26.25",
+    "@formatjs/intl-localematcher": "^0.5.6",
+    "@headlessui/react": "^2.2.0",
+    "@heroicons/react": "^2.0.16",
+    "@hookform/resolvers": "^3.9.0",
+    "@lexical/code": "^0.30.0",
+    "@lexical/link": "^0.30.0",
+    "@lexical/list": "^0.30.0",
+    "@lexical/react": "^0.30.0",
+    "@lexical/selection": "^0.30.0",
+    "@lexical/text": "^0.30.0",
+    "@lexical/utils": "^0.30.0",
+    "@mdx-js/loader": "^3.1.0",
+    "@mdx-js/react": "^3.1.0",
+    "@monaco-editor/react": "^4.6.0",
+    "@next/mdx": "15.2.3",
+    "@octokit/core": "^6.1.2",
+    "@octokit/request-error": "^6.1.5",
+    "@remixicon/react": "^4.5.0",
+    "@sentry/react": "^8.54.0",
+    "@sentry/utils": "^8.54.0",
+    "@svgdotjs/svg.js": "^3.2.4",
+    "@tailwindcss/typography": "^0.5.15",
+    "@tanstack/react-form": "^1.3.3",
+    "@tanstack/react-query": "^5.60.5",
+    "@tanstack/react-query-devtools": "^5.60.5",
+    "abcjs": "^6.4.4",
+    "ahooks": "^3.8.4",
+    "class-variance-authority": "^0.7.0",
+    "classnames": "^2.5.1",
+    "clsx": "^2.1.1",
+    "copy-to-clipboard": "^3.3.3",
+    "crypto-js": "^4.2.0",
+    "dayjs": "^1.11.13",
+    "decimal.js": "^10.4.3",
+    "dompurify": "^3.2.4",
+    "echarts": "^5.5.1",
+    "echarts-for-react": "^3.0.2",
+    "elkjs": "^0.9.3",
+    "emoji-mart": "^5.5.2",
+    "fast-deep-equal": "^3.1.3",
+    "globals": "^15.11.0",
+    "html-to-image": "1.11.11",
+    "i18next": "^23.16.4",
+    "i18next-resources-to-backend": "^1.2.1",
+    "immer": "^9.0.19",
+    "js-audio-recorder": "^1.0.7",
+    "js-cookie": "^3.0.5",
+    "jsonschema": "^1.5.0",
+    "jwt-decode": "^4.0.0",
+    "katex": "^0.16.21",
+    "ky": "^1.7.2",
+    "lamejs": "^1.2.1",
+    "lexical": "^0.30.0",
+    "line-clamp": "^1.0.0",
+    "lodash-es": "^4.17.21",
+    "mermaid": "11.4.1",
+    "mime": "^4.0.4",
+    "mitt": "^3.0.1",
+    "negotiator": "^0.6.3",
+    "next": "15.2.3",
+    "next-themes": "^0.4.3",
+    "pinyin-pro": "^3.25.0",
+    "qrcode.react": "^4.2.0",
+    "qs": "^6.13.0",
+    "react": "19.0.0",
+    "react-18-input-autosize": "^3.0.0",
+    "react-dom": "19.0.0",
+    "react-easy-crop": "^5.1.0",
+    "react-error-boundary": "^4.1.2",
+    "react-headless-pagination": "^1.1.6",
+    "react-hook-form": "^7.53.1",
+    "react-hotkeys-hook": "^4.6.1",
+    "react-i18next": "^15.1.0",
+    "react-infinite-scroll-component": "^6.1.0",
+    "react-markdown": "^9.0.1",
+    "react-multi-email": "^1.0.25",
+    "react-papaparse": "^4.4.0",
+    "react-pdf-highlighter": "^8.0.0-rc.0",
+    "react-slider": "^2.0.6",
+    "react-sortablejs": "^6.1.4",
+    "react-syntax-highlighter": "^15.6.1",
+    "react-textarea-autosize": "^8.5.8",
+    "react-tooltip": "5.8.3",
+    "react-window": "^1.8.10",
+    "react-window-infinite-loader": "^1.0.9",
+    "reactflow": "^11.11.3",
+    "recordrtc": "^5.6.2",
+    "rehype-katex": "^7.0.1",
+    "rehype-raw": "^7.0.0",
+    "remark-breaks": "^4.0.0",
+    "remark-gfm": "^4.0.0",
+    "remark-math": "^6.0.0",
+    "scheduler": "^0.23.0",
+    "semver": "^7.6.3",
+    "server-only": "^0.0.1",
+    "sharp": "^0.33.2",
+    "shave": "^5.0.4",
+    "sortablejs": "^1.15.0",
+    "swr": "^2.3.0",
+    "tailwind-merge": "^2.5.4",
+    "use-context-selector": "^2.0.0",
+    "uuid": "^10.0.0",
+    "zod": "^3.23.8",
+    "zundo": "^2.1.0",
+    "zustand": "^4.5.2"
+  },
+  "devDependencies": {
+    "@antfu/eslint-config": "^4.1.1",
+    "@chromatic-com/storybook": "^3.1.0",
+    "@eslint-react/eslint-plugin": "^1.15.0",
+    "@eslint/eslintrc": "^3.1.0",
+    "@eslint/js": "^9.20.0",
+    "@faker-js/faker": "^9.0.3",
+    "@happy-dom/jest-environment": "^17.4.4",
+    "@next/eslint-plugin-next": "^15.2.3",
+    "@rgrove/parse-xml": "^4.1.0",
+    "@storybook/addon-essentials": "8.5.0",
+    "@storybook/addon-interactions": "8.5.0",
+    "@storybook/addon-links": "8.5.0",
+    "@storybook/addon-onboarding": "8.5.0",
+    "@storybook/addon-themes": "8.5.0",
+    "@storybook/blocks": "8.5.0",
+    "@storybook/nextjs": "8.5.0",
+    "@storybook/react": "8.5.0",
+    "@storybook/test": "8.5.0",
+    "@testing-library/dom": "^10.4.0",
+    "@testing-library/jest-dom": "^6.6.2",
+    "@testing-library/react": "^16.0.1",
+    "@types/crypto-js": "^4.2.2",
+    "@types/dagre": "^0.7.52",
+    "@types/jest": "^29.5.13",
+    "@types/js-cookie": "^3.0.6",
+    "@types/lodash-es": "^4.17.12",
+    "@types/negotiator": "^0.6.3",
+    "@types/node": "18.15.0",
+    "@types/qs": "^6.9.16",
+    "@types/react": "19.0.11",
+    "@types/react-dom": "19.0.4",
+    "@types/react-slider": "^1.3.6",
+    "@types/react-syntax-highlighter": "^15.5.13",
+    "@types/react-window": "^1.8.8",
+    "@types/react-window-infinite-loader": "^1.0.9",
+    "@types/recordrtc": "^5.6.14",
+    "@types/semver": "^7.5.8",
+    "@types/sortablejs": "^1.15.1",
+    "@types/uuid": "^10.0.0",
+    "autoprefixer": "^10.4.20",
+    "bing-translate-api": "^4.0.2",
+    "code-inspector-plugin": "^0.18.1",
+    "cross-env": "^7.0.3",
+    "eslint": "^9.20.1",
+    "eslint-config-next": "^15.0.0",
+    "eslint-plugin-react-hooks": "^5.1.0",
+    "eslint-plugin-react-refresh": "^0.4.19",
+    "eslint-plugin-sonarjs": "^3.0.2",
+    "eslint-plugin-storybook": "^0.11.2",
+    "eslint-plugin-tailwindcss": "^3.18.0",
+    "husky": "^9.1.6",
+    "jest": "^29.7.0",
+    "lint-staged": "^15.2.10",
+    "lodash": "^4.17.21",
+    "magicast": "^0.3.4",
+    "postcss": "^8.4.47",
+    "sass": "^1.80.3",
+    "storybook": "8.5.0",
+    "tailwindcss": "^3.4.14",
+    "ts-node": "^10.9.2",
+    "typescript": "4.9.5",
+    "typescript-eslint": "^8.23.0",
+    "uglify-js": "^3.19.3"
+  },
+  "resolutions": {
+    "@types/react": "~18.2.0",
+    "@types/react-dom": "~18.2.0",
+    "string-width": "4.2.3"
+  },
+  "lint-staged": {
+    "**/*.js?(x)": [
+      "eslint --fix"
+    ],
+    "**/*.ts?(x)": [
+      "eslint --fix"
+    ]
+  },
+  "overrides": {
+    "@types/react": "19.0.11",
+    "@types/react-dom": "19.0.4",
+    "@storybook/test": "8.5.0"
+  },
+  "pnpm": {
+    "overrides": {
+      "esbuild@<0.25.0": "0.25.0"
+    }
+  }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..fce3b65
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,18718 @@
+lockfileVersion: '9.0'
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
+overrides:
+  '@types/react': ~18.2.0
+  '@types/react-dom': ~18.2.0
+  string-width: 4.2.3
+  esbuild@<0.25.0: 0.25.0
+
+importers:
+
+  .:
+    dependencies:
+      '@babel/runtime':
+        specifier: ^7.22.3
+        version: 7.27.0
+      '@dagrejs/dagre':
+        specifier: ^1.1.4
+        version: 1.1.4
+      '@emoji-mart/data':
+        specifier: ^1.2.1
+        version: 1.2.1
+      '@eslint/compat':
+        specifier: ^1.2.4
+        version: 1.2.8(eslint@9.24.0(jiti@1.21.7))
+      '@floating-ui/react':
+        specifier: ^0.26.25
+        version: 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@formatjs/intl-localematcher':
+        specifier: ^0.5.6
+        version: 0.5.10
+      '@headlessui/react':
+        specifier: ^2.2.0
+        version: 2.2.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@heroicons/react':
+        specifier: ^2.0.16
+        version: 2.2.0(react@19.0.0)
+      '@hookform/resolvers':
+        specifier: ^3.9.0
+        version: 3.10.0(react-hook-form@7.55.0(react@19.0.0))
+      '@lexical/code':
+        specifier: ^0.30.0
+        version: 0.30.0
+      '@lexical/link':
+        specifier: ^0.30.0
+        version: 0.30.0
+      '@lexical/list':
+        specifier: ^0.30.0
+        version: 0.30.0
+      '@lexical/react':
+        specifier: ^0.30.0
+        version: 0.30.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.24)
+      '@lexical/selection':
+        specifier: ^0.30.0
+        version: 0.30.0
+      '@lexical/text':
+        specifier: ^0.30.0
+        version: 0.30.0
+      '@lexical/utils':
+        specifier: ^0.30.0
+        version: 0.30.0
+      '@mdx-js/loader':
+        specifier: ^3.1.0
+        version: 3.1.0(acorn@8.14.1)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      '@mdx-js/react':
+        specifier: ^3.1.0
+        version: 3.1.0(@types/react@18.2.79)(react@19.0.0)
+      '@monaco-editor/react':
+        specifier: ^4.6.0
+        version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@next/mdx':
+        specifier: 15.2.3
+        version: 15.2.3(@mdx-js/loader@3.1.0(acorn@8.14.1)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)))(@mdx-js/react@3.1.0(@types/react@18.2.79)(react@19.0.0))
+      '@octokit/core':
+        specifier: ^6.1.2
+        version: 6.1.5
+      '@octokit/request-error':
+        specifier: ^6.1.5
+        version: 6.1.8
+      '@remixicon/react':
+        specifier: ^4.5.0
+        version: 4.6.0(react@19.0.0)
+      '@sentry/react':
+        specifier: ^8.54.0
+        version: 8.55.0(react@19.0.0)
+      '@sentry/utils':
+        specifier: ^8.54.0
+        version: 8.55.0
+      '@svgdotjs/svg.js':
+        specifier: ^3.2.4
+        version: 3.2.4
+      '@tailwindcss/typography':
+        specifier: ^0.5.15
+        version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5)))
+      '@tanstack/react-form':
+        specifier: ^1.3.3
+        version: 1.3.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@tanstack/react-query':
+        specifier: ^5.60.5
+        version: 5.72.2(react@19.0.0)
+      '@tanstack/react-query-devtools':
+        specifier: ^5.60.5
+        version: 5.72.2(@tanstack/react-query@5.72.2(react@19.0.0))(react@19.0.0)
+      abcjs:
+        specifier: ^6.4.4
+        version: 6.4.4
+      ahooks:
+        specifier: ^3.8.4
+        version: 3.8.4(react@19.0.0)
+      class-variance-authority:
+        specifier: ^0.7.0
+        version: 0.7.1
+      classnames:
+        specifier: ^2.5.1
+        version: 2.5.1
+      clsx:
+        specifier: ^2.1.1
+        version: 2.1.1
+      copy-to-clipboard:
+        specifier: ^3.3.3
+        version: 3.3.3
+      crypto-js:
+        specifier: ^4.2.0
+        version: 4.2.0
+      dayjs:
+        specifier: ^1.11.13
+        version: 1.11.13
+      decimal.js:
+        specifier: ^10.4.3
+        version: 10.5.0
+      dompurify:
+        specifier: ^3.2.4
+        version: 3.2.5
+      echarts:
+        specifier: ^5.5.1
+        version: 5.6.0
+      echarts-for-react:
+        specifier: ^3.0.2
+        version: 3.0.2(echarts@5.6.0)(react@19.0.0)
+      elkjs:
+        specifier: ^0.9.3
+        version: 0.9.3
+      emoji-mart:
+        specifier: ^5.5.2
+        version: 5.6.0
+      fast-deep-equal:
+        specifier: ^3.1.3
+        version: 3.1.3
+      globals:
+        specifier: ^15.11.0
+        version: 15.15.0
+      html-to-image:
+        specifier: 1.11.11
+        version: 1.11.11
+      i18next:
+        specifier: ^23.16.4
+        version: 23.16.8
+      i18next-resources-to-backend:
+        specifier: ^1.2.1
+        version: 1.2.1
+      immer:
+        specifier: ^9.0.19
+        version: 9.0.21
+      js-audio-recorder:
+        specifier: ^1.0.7
+        version: 1.0.7
+      js-cookie:
+        specifier: ^3.0.5
+        version: 3.0.5
+      jsonschema:
+        specifier: ^1.5.0
+        version: 1.5.0
+      jwt-decode:
+        specifier: ^4.0.0
+        version: 4.0.0
+      katex:
+        specifier: ^0.16.21
+        version: 0.16.22
+      ky:
+        specifier: ^1.7.2
+        version: 1.8.0
+      lamejs:
+        specifier: ^1.2.1
+        version: 1.2.1
+      lexical:
+        specifier: ^0.30.0
+        version: 0.30.0
+      line-clamp:
+        specifier: ^1.0.0
+        version: 1.0.0
+      lodash-es:
+        specifier: ^4.17.21
+        version: 4.17.21
+      mermaid:
+        specifier: 11.4.1
+        version: 11.4.1
+      mime:
+        specifier: ^4.0.4
+        version: 4.0.7
+      mitt:
+        specifier: ^3.0.1
+        version: 3.0.1
+      negotiator:
+        specifier: ^0.6.3
+        version: 0.6.4
+      next:
+        specifier: 15.2.3
+        version: 15.2.3(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.86.3)
+      next-themes:
+        specifier: ^0.4.3
+        version: 0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      pinyin-pro:
+        specifier: ^3.25.0
+        version: 3.26.0
+      qrcode.react:
+        specifier: ^4.2.0
+        version: 4.2.0(react@19.0.0)
+      qs:
+        specifier: ^6.13.0
+        version: 6.14.0
+      react:
+        specifier: 19.0.0
+        version: 19.0.0
+      react-18-input-autosize:
+        specifier: ^3.0.0
+        version: 3.0.0(react@19.0.0)
+      react-dom:
+        specifier: 19.0.0
+        version: 19.0.0(react@19.0.0)
+      react-easy-crop:
+        specifier: ^5.1.0
+        version: 5.4.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      react-error-boundary:
+        specifier: ^4.1.2
+        version: 4.1.2(react@19.0.0)
+      react-headless-pagination:
+        specifier: ^1.1.6
+        version: 1.1.6(react@19.0.0)
+      react-hook-form:
+        specifier: ^7.53.1
+        version: 7.55.0(react@19.0.0)
+      react-hotkeys-hook:
+        specifier: ^4.6.1
+        version: 4.6.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      react-i18next:
+        specifier: ^15.1.0
+        version: 15.4.1(i18next@23.16.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      react-infinite-scroll-component:
+        specifier: ^6.1.0
+        version: 6.1.0(react@19.0.0)
+      react-markdown:
+        specifier: ^9.0.1
+        version: 9.1.0(@types/react@18.2.79)(react@19.0.0)
+      react-multi-email:
+        specifier: ^1.0.25
+        version: 1.0.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      react-papaparse:
+        specifier: ^4.4.0
+        version: 4.4.0
+      react-pdf-highlighter:
+        specifier: ^8.0.0-rc.0
+        version: 8.0.0-rc.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      react-slider:
+        specifier: ^2.0.6
+        version: 2.0.6(react@19.0.0)
+      react-sortablejs:
+        specifier: ^6.1.4
+        version: 6.1.4(@types/sortablejs@1.15.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sortablejs@1.15.6)
+      react-syntax-highlighter:
+        specifier: ^15.6.1
+        version: 15.6.1(react@19.0.0)
+      react-textarea-autosize:
+        specifier: ^8.5.8
+        version: 8.5.9(@types/react@18.2.79)(react@19.0.0)
+      react-tooltip:
+        specifier: 5.8.3
+        version: 5.8.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      react-window:
+        specifier: ^1.8.10
+        version: 1.8.11(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      react-window-infinite-loader:
+        specifier: ^1.0.9
+        version: 1.0.10(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      reactflow:
+        specifier: ^11.11.3
+        version: 11.11.4(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      recordrtc:
+        specifier: ^5.6.2
+        version: 5.6.2
+      rehype-katex:
+        specifier: ^7.0.1
+        version: 7.0.1
+      rehype-raw:
+        specifier: ^7.0.0
+        version: 7.0.0
+      remark-breaks:
+        specifier: ^4.0.0
+        version: 4.0.0
+      remark-gfm:
+        specifier: ^4.0.0
+        version: 4.0.1
+      remark-math:
+        specifier: ^6.0.0
+        version: 6.0.0
+      scheduler:
+        specifier: ^0.23.0
+        version: 0.23.2
+      semver:
+        specifier: ^7.6.3
+        version: 7.7.1
+      server-only:
+        specifier: ^0.0.1
+        version: 0.0.1
+      sharp:
+        specifier: ^0.33.2
+        version: 0.33.5
+      shave:
+        specifier: ^5.0.4
+        version: 5.0.4
+      sortablejs:
+        specifier: ^1.15.0
+        version: 1.15.6
+      swr:
+        specifier: ^2.3.0
+        version: 2.3.3(react@19.0.0)
+      tailwind-merge:
+        specifier: ^2.5.4
+        version: 2.6.0
+      use-context-selector:
+        specifier: ^2.0.0
+        version: 2.0.0(react@19.0.0)(scheduler@0.23.2)
+      uuid:
+        specifier: ^10.0.0
+        version: 10.0.0
+      zod:
+        specifier: ^3.23.8
+        version: 3.24.2
+      zundo:
+        specifier: ^2.1.0
+        version: 2.3.0(zustand@4.5.6(@types/react@18.2.79)(immer@9.0.21)(react@19.0.0))
+      zustand:
+        specifier: ^4.5.2
+        version: 4.5.6(@types/react@18.2.79)(immer@9.0.21)(react@19.0.0)
+    devDependencies:
+      '@antfu/eslint-config':
+        specifier: ^4.1.1
+        version: 4.12.0(@eslint-react/eslint-plugin@1.45.0(eslint@9.24.0(jiti@1.21.7))(ts-api-utils@2.1.0(typescript@4.9.5))(typescript@4.9.5))(@typescript-eslint/utils@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(@vue/compiler-sfc@3.5.13)(eslint-plugin-react-hooks@5.2.0(eslint@9.24.0(jiti@1.21.7)))(eslint-plugin-react-refresh@0.4.19(eslint@9.24.0(jiti@1.21.7)))(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)(vitest@3.1.1(@types/debug@4.1.12)(@types/node@18.15.0)(happy-dom@17.4.4)(jiti@1.21.7)(sass@1.86.3)(terser@5.39.0)(yaml@2.7.1))
+      '@chromatic-com/storybook':
+        specifier: ^3.1.0
+        version: 3.2.6(react@19.0.0)(storybook@8.5.0)
+      '@eslint-react/eslint-plugin':
+        specifier: ^1.15.0
+        version: 1.45.0(eslint@9.24.0(jiti@1.21.7))(ts-api-utils@2.1.0(typescript@4.9.5))(typescript@4.9.5)
+      '@eslint/eslintrc':
+        specifier: ^3.1.0
+        version: 3.3.1
+      '@eslint/js':
+        specifier: ^9.20.0
+        version: 9.24.0
+      '@faker-js/faker':
+        specifier: ^9.0.3
+        version: 9.6.0
+      '@happy-dom/jest-environment':
+        specifier: ^17.4.4
+        version: 17.4.4
+      '@next/eslint-plugin-next':
+        specifier: ^15.2.3
+        version: 15.3.0
+      '@rgrove/parse-xml':
+        specifier: ^4.1.0
+        version: 4.2.0
+      '@storybook/addon-essentials':
+        specifier: 8.5.0
+        version: 8.5.0(@types/react@18.2.79)(storybook@8.5.0)
+      '@storybook/addon-interactions':
+        specifier: 8.5.0
+        version: 8.5.0(storybook@8.5.0)
+      '@storybook/addon-links':
+        specifier: 8.5.0
+        version: 8.5.0(react@19.0.0)(storybook@8.5.0)
+      '@storybook/addon-onboarding':
+        specifier: 8.5.0
+        version: 8.5.0(storybook@8.5.0)
+      '@storybook/addon-themes':
+        specifier: 8.5.0
+        version: 8.5.0(storybook@8.5.0)
+      '@storybook/blocks':
+        specifier: 8.5.0
+        version: 8.5.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.0)
+      '@storybook/nextjs':
+        specifier: 8.5.0
+        version: 8.5.0(esbuild@0.25.0)(next@15.2.3(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.86.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.86.3)(storybook@8.5.0)(type-fest@4.39.1)(typescript@4.9.5)(uglify-js@3.19.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      '@storybook/react':
+        specifier: 8.5.0
+        version: 8.5.0(@storybook/test@8.5.0(storybook@8.5.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.0)(typescript@4.9.5)
+      '@storybook/test':
+        specifier: 8.5.0
+        version: 8.5.0(storybook@8.5.0)
+      '@testing-library/dom':
+        specifier: ^10.4.0
+        version: 10.4.0
+      '@testing-library/jest-dom':
+        specifier: ^6.6.2
+        version: 6.6.3
+      '@testing-library/react':
+        specifier: ^16.0.1
+        version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@types/crypto-js':
+        specifier: ^4.2.2
+        version: 4.2.2
+      '@types/dagre':
+        specifier: ^0.7.52
+        version: 0.7.52
+      '@types/jest':
+        specifier: ^29.5.13
+        version: 29.5.14
+      '@types/js-cookie':
+        specifier: ^3.0.6
+        version: 3.0.6
+      '@types/lodash-es':
+        specifier: ^4.17.12
+        version: 4.17.12
+      '@types/negotiator':
+        specifier: ^0.6.3
+        version: 0.6.3
+      '@types/node':
+        specifier: 18.15.0
+        version: 18.15.0
+      '@types/qs':
+        specifier: ^6.9.16
+        version: 6.9.18
+      '@types/react':
+        specifier: ~18.2.0
+        version: 18.2.79
+      '@types/react-dom':
+        specifier: ~18.2.0
+        version: 18.2.25
+      '@types/react-slider':
+        specifier: ^1.3.6
+        version: 1.3.6
+      '@types/react-syntax-highlighter':
+        specifier: ^15.5.13
+        version: 15.5.13
+      '@types/react-window':
+        specifier: ^1.8.8
+        version: 1.8.8
+      '@types/react-window-infinite-loader':
+        specifier: ^1.0.9
+        version: 1.0.9
+      '@types/recordrtc':
+        specifier: ^5.6.14
+        version: 5.6.14
+      '@types/semver':
+        specifier: ^7.5.8
+        version: 7.7.0
+      '@types/sortablejs':
+        specifier: ^1.15.1
+        version: 1.15.8
+      '@types/uuid':
+        specifier: ^10.0.0
+        version: 10.0.0
+      autoprefixer:
+        specifier: ^10.4.20
+        version: 10.4.21(postcss@8.5.3)
+      bing-translate-api:
+        specifier: ^4.0.2
+        version: 4.0.2
+      code-inspector-plugin:
+        specifier: ^0.18.1
+        version: 0.18.3
+      cross-env:
+        specifier: ^7.0.3
+        version: 7.0.3
+      eslint:
+        specifier: ^9.20.1
+        version: 9.24.0(jiti@1.21.7)
+      eslint-config-next:
+        specifier: ^15.0.0
+        version: 15.3.0(eslint-plugin-import-x@4.10.2(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint-plugin-react-hooks:
+        specifier: ^5.1.0
+        version: 5.2.0(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-react-refresh:
+        specifier: ^0.4.19
+        version: 0.4.19(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-sonarjs:
+        specifier: ^3.0.2
+        version: 3.0.2(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-storybook:
+        specifier: ^0.11.2
+        version: 0.11.6(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint-plugin-tailwindcss:
+        specifier: ^3.18.0
+        version: 3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5)))
+      husky:
+        specifier: ^9.1.6
+        version: 9.1.7
+      jest:
+        specifier: ^29.7.0
+        version: 29.7.0(@types/node@18.15.0)(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5))
+      lint-staged:
+        specifier: ^15.2.10
+        version: 15.5.0
+      lodash:
+        specifier: ^4.17.21
+        version: 4.17.21
+      magicast:
+        specifier: ^0.3.4
+        version: 0.3.5
+      postcss:
+        specifier: ^8.4.47
+        version: 8.5.3
+      sass:
+        specifier: ^1.80.3
+        version: 1.86.3
+      storybook:
+        specifier: 8.5.0
+        version: 8.5.0
+      tailwindcss:
+        specifier: ^3.4.14
+        version: 3.4.17(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5))
+      ts-node:
+        specifier: ^10.9.2
+        version: 10.9.2(@types/node@18.15.0)(typescript@4.9.5)
+      typescript:
+        specifier: 4.9.5
+        version: 4.9.5
+      typescript-eslint:
+        specifier: ^8.23.0
+        version: 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      uglify-js:
+        specifier: ^3.19.3
+        version: 3.19.3
+
+packages:
+
+  '@adobe/css-tools@4.4.2':
+    resolution: {integrity: sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==}
+
+  '@alloc/quick-lru@5.2.0':
+    resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+    engines: {node: '>=10'}
+
+  '@ampproject/remapping@2.3.0':
+    resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+    engines: {node: '>=6.0.0'}
+
+  '@antfu/eslint-config@4.12.0':
+    resolution: {integrity: sha512-8NszLFXu9/cwOP/qliYS3heD+9ZCouGgOWQmsXgDHLNkjC9IjI1yXBOp6Xs4EvwTKsSAZp3SVw382M8naqMQUg==}
+    hasBin: true
+    peerDependencies:
+      '@eslint-react/eslint-plugin': ^1.38.4
+      '@prettier/plugin-xml': ^3.4.1
+      '@unocss/eslint-plugin': '>=0.50.0'
+      astro-eslint-parser: ^1.0.2
+      eslint: ^9.10.0
+      eslint-plugin-astro: ^1.2.0
+      eslint-plugin-format: '>=0.1.0'
+      eslint-plugin-react-hooks: ^5.2.0
+      eslint-plugin-react-refresh: ^0.4.19
+      eslint-plugin-solid: ^0.14.3
+      eslint-plugin-svelte: '>=2.35.1'
+      eslint-plugin-vuejs-accessibility: ^2.4.1
+      prettier-plugin-astro: ^0.14.0
+      prettier-plugin-slidev: ^1.0.5
+      svelte-eslint-parser: '>=0.37.0'
+    peerDependenciesMeta:
+      '@eslint-react/eslint-plugin':
+        optional: true
+      '@prettier/plugin-xml':
+        optional: true
+      '@unocss/eslint-plugin':
+        optional: true
+      astro-eslint-parser:
+        optional: true
+      eslint-plugin-astro:
+        optional: true
+      eslint-plugin-format:
+        optional: true
+      eslint-plugin-react-hooks:
+        optional: true
+      eslint-plugin-react-refresh:
+        optional: true
+      eslint-plugin-solid:
+        optional: true
+      eslint-plugin-svelte:
+        optional: true
+      eslint-plugin-vuejs-accessibility:
+        optional: true
+      prettier-plugin-astro:
+        optional: true
+      prettier-plugin-slidev:
+        optional: true
+      svelte-eslint-parser:
+        optional: true
+
+  '@antfu/install-pkg@1.0.0':
+    resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==}
+
+  '@antfu/utils@8.1.1':
+    resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==}
+
+  '@babel/code-frame@7.26.2':
+    resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/compat-data@7.26.8':
+    resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/core@7.26.10':
+    resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/generator@7.27.0':
+    resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-annotate-as-pure@7.25.9':
+    resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-compilation-targets@7.27.0':
+    resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-create-class-features-plugin@7.27.0':
+    resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-create-regexp-features-plugin@7.27.0':
+    resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-define-polyfill-provider@0.6.4':
+    resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==}
+    peerDependencies:
+      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+  '@babel/helper-member-expression-to-functions@7.25.9':
+    resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-module-imports@7.25.9':
+    resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-module-transforms@7.26.0':
+    resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-optimise-call-expression@7.25.9':
+    resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-plugin-utils@7.26.5':
+    resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-remap-async-to-generator@7.25.9':
+    resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-replace-supers@7.26.5':
+    resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
+    resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-string-parser@7.25.9':
+    resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-validator-identifier@7.25.9':
+    resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-validator-option@7.25.9':
+    resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-wrap-function@7.25.9':
+    resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helpers@7.27.0':
+    resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/parser@7.27.0':
+    resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+
+  '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9':
+    resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9':
+    resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9':
+    resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9':
+    resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.13.0
+
+  '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9':
+    resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2':
+    resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-async-generators@7.8.4':
+    resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-bigint@7.8.3':
+    resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-class-properties@7.12.13':
+    resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-class-static-block@7.14.5':
+    resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-dynamic-import@7.8.3':
+    resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-import-assertions@7.26.0':
+    resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-import-attributes@7.26.0':
+    resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-import-meta@7.10.4':
+    resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-json-strings@7.8.3':
+    resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-jsx@7.25.9':
+    resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-logical-assignment-operators@7.10.4':
+    resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3':
+    resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-numeric-separator@7.10.4':
+    resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-object-rest-spread@7.8.3':
+    resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-optional-catch-binding@7.8.3':
+    resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-optional-chaining@7.8.3':
+    resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-private-property-in-object@7.14.5':
+    resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-top-level-await@7.14.5':
+    resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-typescript@7.25.9':
+    resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-unicode-sets-regex@7.18.6':
+    resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-transform-arrow-functions@7.25.9':
+    resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-async-generator-functions@7.26.8':
+    resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-async-to-generator@7.25.9':
+    resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-block-scoped-functions@7.26.5':
+    resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-block-scoping@7.27.0':
+    resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-class-properties@7.25.9':
+    resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-class-static-block@7.26.0':
+    resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.12.0
+
+  '@babel/plugin-transform-classes@7.25.9':
+    resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-computed-properties@7.25.9':
+    resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-destructuring@7.25.9':
+    resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-dotall-regex@7.25.9':
+    resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-duplicate-keys@7.25.9':
+    resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9':
+    resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-transform-dynamic-import@7.25.9':
+    resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-exponentiation-operator@7.26.3':
+    resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-export-namespace-from@7.25.9':
+    resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-for-of@7.26.9':
+    resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-function-name@7.25.9':
+    resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-json-strings@7.25.9':
+    resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-literals@7.25.9':
+    resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-logical-assignment-operators@7.25.9':
+    resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-member-expression-literals@7.25.9':
+    resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-modules-amd@7.25.9':
+    resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-modules-commonjs@7.26.3':
+    resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-modules-systemjs@7.25.9':
+    resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-modules-umd@7.25.9':
+    resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-named-capturing-groups-regex@7.25.9':
+    resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-transform-new-target@7.25.9':
+    resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-nullish-coalescing-operator@7.26.6':
+    resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-numeric-separator@7.25.9':
+    resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-object-rest-spread@7.25.9':
+    resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-object-super@7.25.9':
+    resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-optional-catch-binding@7.25.9':
+    resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-optional-chaining@7.25.9':
+    resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-parameters@7.25.9':
+    resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-private-methods@7.25.9':
+    resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-private-property-in-object@7.25.9':
+    resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-property-literals@7.25.9':
+    resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-react-display-name@7.25.9':
+    resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-react-jsx-development@7.25.9':
+    resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-react-jsx@7.25.9':
+    resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-react-pure-annotations@7.25.9':
+    resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-regenerator@7.27.0':
+    resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-regexp-modifiers@7.26.0':
+    resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/plugin-transform-reserved-words@7.25.9':
+    resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-runtime@7.26.10':
+    resolution: {integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-shorthand-properties@7.25.9':
+    resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-spread@7.25.9':
+    resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-sticky-regex@7.25.9':
+    resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-template-literals@7.26.8':
+    resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-typeof-symbol@7.27.0':
+    resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-typescript@7.27.0':
+    resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-unicode-escapes@7.25.9':
+    resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-unicode-property-regex@7.25.9':
+    resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-unicode-regex@7.25.9':
+    resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-unicode-sets-regex@7.25.9':
+    resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/preset-env@7.26.9':
+    resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/preset-modules@0.1.6-no-external-plugins':
+    resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
+
+  '@babel/preset-react@7.26.3':
+    resolution: {integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/preset-typescript@7.27.0':
+    resolution: {integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/runtime@7.27.0':
+    resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/template@7.27.0':
+    resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/traverse@7.27.0':
+    resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/types@7.27.0':
+    resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==}
+    engines: {node: '>=6.9.0'}
+
+  '@bcoe/v8-coverage@0.2.3':
+    resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+
+  '@braintree/sanitize-url@7.1.1':
+    resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==}
+
+  '@chevrotain/cst-dts-gen@11.0.3':
+    resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==}
+
+  '@chevrotain/gast@11.0.3':
+    resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==}
+
+  '@chevrotain/regexp-to-ast@11.0.3':
+    resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==}
+
+  '@chevrotain/types@11.0.3':
+    resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==}
+
+  '@chevrotain/utils@11.0.3':
+    resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==}
+
+  '@chromatic-com/storybook@3.2.6':
+    resolution: {integrity: sha512-FDmn5Ry2DzQdik+eq2sp/kJMMT36Ewe7ONXUXM2Izd97c7r6R/QyGli8eyh/F0iyqVvbLveNYFyF0dBOJNwLqw==}
+    engines: {node: '>=16.0.0', yarn: '>=1.22.18'}
+    peerDependencies:
+      storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+
+  '@clack/core@0.4.2':
+    resolution: {integrity: sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg==}
+
+  '@clack/prompts@0.10.1':
+    resolution: {integrity: sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw==}
+
+  '@cspotcode/source-map-support@0.8.1':
+    resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+    engines: {node: '>=12'}
+
+  '@dagrejs/dagre@1.1.4':
+    resolution: {integrity: sha512-QUTc54Cg/wvmlEUxB+uvoPVKFazM1H18kVHBQNmK2NbrDR5ihOCR6CXLnDSZzMcSQKJtabPUWridBOlJM3WkDg==}
+
+  '@dagrejs/graphlib@2.2.4':
+    resolution: {integrity: sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw==}
+    engines: {node: '>17.0.0'}
+
+  '@emnapi/core@1.4.0':
+    resolution: {integrity: sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==}
+
+  '@emnapi/runtime@1.4.0':
+    resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==}
+
+  '@emnapi/wasi-threads@1.0.1':
+    resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==}
+
+  '@emoji-mart/data@1.2.1':
+    resolution: {integrity: sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw==}
+
+  '@es-joy/jsdoccomment@0.49.0':
+    resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==}
+    engines: {node: '>=16'}
+
+  '@es-joy/jsdoccomment@0.50.0':
+    resolution: {integrity: sha512-+zZymuVLH6zVwXPtCAtC+bDymxmEwEqDftdAK+f407IF1bnX49anIxvBhCA1AqUIfD6egj1jM1vUnSuijjNyYg==}
+    engines: {node: '>=18'}
+
+  '@esbuild/aix-ppc64@0.25.0':
+    resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [aix]
+
+  '@esbuild/aix-ppc64@0.25.2':
+    resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [aix]
+
+  '@esbuild/android-arm64@0.25.0':
+    resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [android]
+
+  '@esbuild/android-arm64@0.25.2':
+    resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [android]
+
+  '@esbuild/android-arm@0.25.0':
+    resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [android]
+
+  '@esbuild/android-arm@0.25.2':
+    resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [android]
+
+  '@esbuild/android-x64@0.25.0':
+    resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [android]
+
+  '@esbuild/android-x64@0.25.2':
+    resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [android]
+
+  '@esbuild/darwin-arm64@0.25.0':
+    resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@esbuild/darwin-arm64@0.25.2':
+    resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@esbuild/darwin-x64@0.25.0':
+    resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@esbuild/darwin-x64@0.25.2':
+    resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@esbuild/freebsd-arm64@0.25.0':
+    resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@esbuild/freebsd-arm64@0.25.2':
+    resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@esbuild/freebsd-x64@0.25.0':
+    resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@esbuild/freebsd-x64@0.25.2':
+    resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@esbuild/linux-arm64@0.25.0':
+    resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@esbuild/linux-arm64@0.25.2':
+    resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@esbuild/linux-arm@0.25.0':
+    resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [linux]
+
+  '@esbuild/linux-arm@0.25.2':
+    resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [linux]
+
+  '@esbuild/linux-ia32@0.25.0':
+    resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [linux]
+
+  '@esbuild/linux-ia32@0.25.2':
+    resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [linux]
+
+  '@esbuild/linux-loong64@0.25.0':
+    resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==}
+    engines: {node: '>=18'}
+    cpu: [loong64]
+    os: [linux]
+
+  '@esbuild/linux-loong64@0.25.2':
+    resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==}
+    engines: {node: '>=18'}
+    cpu: [loong64]
+    os: [linux]
+
+  '@esbuild/linux-mips64el@0.25.0':
+    resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==}
+    engines: {node: '>=18'}
+    cpu: [mips64el]
+    os: [linux]
+
+  '@esbuild/linux-mips64el@0.25.2':
+    resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==}
+    engines: {node: '>=18'}
+    cpu: [mips64el]
+    os: [linux]
+
+  '@esbuild/linux-ppc64@0.25.0':
+    resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@esbuild/linux-ppc64@0.25.2':
+    resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@esbuild/linux-riscv64@0.25.0':
+    resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==}
+    engines: {node: '>=18'}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@esbuild/linux-riscv64@0.25.2':
+    resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==}
+    engines: {node: '>=18'}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@esbuild/linux-s390x@0.25.0':
+    resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==}
+    engines: {node: '>=18'}
+    cpu: [s390x]
+    os: [linux]
+
+  '@esbuild/linux-s390x@0.25.2':
+    resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==}
+    engines: {node: '>=18'}
+    cpu: [s390x]
+    os: [linux]
+
+  '@esbuild/linux-x64@0.25.0':
+    resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [linux]
+
+  '@esbuild/linux-x64@0.25.2':
+    resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [linux]
+
+  '@esbuild/netbsd-arm64@0.25.0':
+    resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [netbsd]
+
+  '@esbuild/netbsd-arm64@0.25.2':
+    resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [netbsd]
+
+  '@esbuild/netbsd-x64@0.25.0':
+    resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [netbsd]
+
+  '@esbuild/netbsd-x64@0.25.2':
+    resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [netbsd]
+
+  '@esbuild/openbsd-arm64@0.25.0':
+    resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [openbsd]
+
+  '@esbuild/openbsd-arm64@0.25.2':
+    resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [openbsd]
+
+  '@esbuild/openbsd-x64@0.25.0':
+    resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [openbsd]
+
+  '@esbuild/openbsd-x64@0.25.2':
+    resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [openbsd]
+
+  '@esbuild/sunos-x64@0.25.0':
+    resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [sunos]
+
+  '@esbuild/sunos-x64@0.25.2':
+    resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [sunos]
+
+  '@esbuild/win32-arm64@0.25.0':
+    resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@esbuild/win32-arm64@0.25.2':
+    resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@esbuild/win32-ia32@0.25.0':
+    resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@esbuild/win32-ia32@0.25.2':
+    resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@esbuild/win32-x64@0.25.0':
+    resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [win32]
+
+  '@esbuild/win32-x64@0.25.2':
+    resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [win32]
+
+  '@eslint-community/eslint-plugin-eslint-comments@4.4.1':
+    resolution: {integrity: sha512-lb/Z/MzbTf7CaVYM9WCFNQZ4L1yi3ev2fsFPF99h31ljhSEyUoyEsKsNWiU+qD1glbYTDJdqgyaLKtyTkkqtuQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
+
+  '@eslint-community/eslint-utils@4.5.1':
+    resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+  '@eslint-community/regexpp@4.12.1':
+    resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+  '@eslint-react/ast@1.45.0':
+    resolution: {integrity: sha512-yqHzFu1IIbGGdzizWZ9J7mBorPjrs3abYMlwfc3CuD/XWpJ3dEtoDdtcHnyQ1ObpoZokPvzsCMJk3WWawIE45A==}
+    engines: {bun: '>=1.0.15', node: '>=18.18.0'}
+
+  '@eslint-react/core@1.45.0':
+    resolution: {integrity: sha512-pFLFMeJgXOxds8I5Ff5z8U+IRk+Um4f0OQUfFVCQhHiw2FoNqOqerFkQpdUy6r8nJCIrZNMGIsJkZ3AZFA5ajg==}
+    engines: {bun: '>=1.0.15', node: '>=18.18.0'}
+
+  '@eslint-react/eff@1.45.0':
+    resolution: {integrity: sha512-SB7kciR9JQTK6qQitD68ACUsQbfKDy+J5OLF2riYQa8qTQ7gfqBXdUU83jTgx3KTJwD7O/TgeIMeSrdvx08rJg==}
+    engines: {bun: '>=1.0.15', node: '>=18.18.0'}
+
+  '@eslint-react/eslint-plugin@1.45.0':
+    resolution: {integrity: sha512-HWtEbrmdxZrgasy01GuJ4TMsX35ytaHAD0/VS32ZhwypH7OG1R9OH/WRFx40DGKxSfWV5RNfRsj9fD8tq/BclQ==}
+    engines: {bun: '>=1.0.15', node: '>=18.18.0'}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: ^4.9.5 || ^5.3.3
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@eslint-react/jsx@1.45.0':
+    resolution: {integrity: sha512-uMOfy0uc71LLYw1RVmPrVIlS1FzbSY1zE0ybdnZS8qefqkVamIfPwwGQCniFhYApROTxZ5BrYceEWoT5O0Dy+g==}
+    engines: {bun: '>=1.0.15', node: '>=18.18.0'}
+
+  '@eslint-react/kit@1.45.0':
+    resolution: {integrity: sha512-F13yvQ19hnepNAUXFve9cQfKXNFzegOPjBwP0Iv9uZzCuF5bm+dROxdxRGOAyh2h2AGpj2s6SctTikG1Cm+mpQ==}
+    engines: {bun: '>=1.0.15', node: '>=18.18.0'}
+
+  '@eslint-react/shared@1.45.0':
+    resolution: {integrity: sha512-5G8zjmiKhTbBf2WKNpv6JYPbsRQcQ4XjNGR92X1JDCqrSBDEiNLCuBDEF015MX1JZ61LfD3xmS3TU7kXmGYkAw==}
+    engines: {bun: '>=1.0.15', node: '>=18.18.0'}
+
+  '@eslint-react/var@1.45.0':
+    resolution: {integrity: sha512-sTf7IuQjmQ1/jBeYU5VepX9wqdsmXFg1C8pVcxx0Xlxl3ykV2jfrIYoV4KJYURvVmhqmqWFaRJxKmNB24PuCOQ==}
+    engines: {bun: '>=1.0.15', node: '>=18.18.0'}
+
+  '@eslint/compat@1.2.8':
+    resolution: {integrity: sha512-LqCYHdWL/QqKIJuZ/ucMAv8d4luKGs4oCPgpt8mWztQAtPrHfXKQ/XAUc8ljCHAfJCn6SvkpTcGt5Tsh8saowA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^9.10.0
+    peerDependenciesMeta:
+      eslint:
+        optional: true
+
+  '@eslint/config-array@0.20.0':
+    resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/config-helpers@0.2.1':
+    resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/core@0.10.0':
+    resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/core@0.12.0':
+    resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/core@0.13.0':
+    resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/eslintrc@3.3.1':
+    resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/js@9.24.0':
+    resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/markdown@6.3.0':
+    resolution: {integrity: sha512-8rj7wmuP5hwXZ0HWoad+WL9nftpN373bCCQz9QL6sA+clZiz7et8Pk0yDAKeo//xLlPONKQ6wCpjkOHCLkbYUw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/object-schema@2.1.6':
+    resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/plugin-kit@0.2.8':
+    resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@faker-js/faker@9.6.0':
+    resolution: {integrity: sha512-3vm4by+B5lvsFPSyep3ELWmZfE3kicDtmemVpuwl1yH7tqtnHdsA6hG8fbXedMVdkzgtvzWoRgjSB4Q+FHnZiw==}
+    engines: {node: '>=18.0.0', npm: '>=9.0.0'}
+
+  '@floating-ui/core@1.6.9':
+    resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
+
+  '@floating-ui/dom@1.1.1':
+    resolution: {integrity: sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==}
+
+  '@floating-ui/dom@1.6.13':
+    resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==}
+
+  '@floating-ui/react-dom@2.1.2':
+    resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==}
+    peerDependencies:
+      react: '>=16.8.0'
+      react-dom: '>=16.8.0'
+
+  '@floating-ui/react@0.26.28':
+    resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==}
+    peerDependencies:
+      react: '>=16.8.0'
+      react-dom: '>=16.8.0'
+
+  '@floating-ui/utils@0.2.9':
+    resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
+
+  '@formatjs/intl-localematcher@0.5.10':
+    resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==}
+
+  '@happy-dom/jest-environment@17.4.4':
+    resolution: {integrity: sha512-5imA+SpP7ZcIwE1u2swWZq6UJhyZIWNtlE/gnqhVz+y91G6hgF+t9hVSsWH29Tfib+wg/zC9ryJPDDyAuqXfEg==}
+    engines: {node: '>=18.0.0'}
+
+  '@headlessui/react@2.2.1':
+    resolution: {integrity: sha512-daiUqVLae8CKVjEVT19P/izW0aGK0GNhMSAeMlrDebKmoVZHcRRwbxzgtnEadUVDXyBsWo9/UH4KHeniO+0tMg==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      react: ^18 || ^19 || ^19.0.0-rc
+      react-dom: ^18 || ^19 || ^19.0.0-rc
+
+  '@heroicons/react@2.2.0':
+    resolution: {integrity: sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==}
+    peerDependencies:
+      react: '>= 16 || ^19.0.0-rc'
+
+  '@hookform/resolvers@3.10.0':
+    resolution: {integrity: sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==}
+    peerDependencies:
+      react-hook-form: ^7.0.0
+
+  '@humanfs/core@0.19.1':
+    resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+    engines: {node: '>=18.18.0'}
+
+  '@humanfs/node@0.16.6':
+    resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
+    engines: {node: '>=18.18.0'}
+
+  '@humanwhocodes/module-importer@1.0.1':
+    resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+    engines: {node: '>=12.22'}
+
+  '@humanwhocodes/retry@0.3.1':
+    resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
+    engines: {node: '>=18.18'}
+
+  '@humanwhocodes/retry@0.4.2':
+    resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==}
+    engines: {node: '>=18.18'}
+
+  '@iconify/types@2.0.0':
+    resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+  '@iconify/utils@2.3.0':
+    resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==}
+
+  '@img/sharp-darwin-arm64@0.33.5':
+    resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
+    engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@img/sharp-darwin-x64@0.33.5':
+    resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==}
+    engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+    cpu: [x64]
+    os: [darwin]
+
+  '@img/sharp-libvips-darwin-arm64@1.0.4':
+    resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@img/sharp-libvips-darwin-x64@1.0.4':
+    resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@img/sharp-libvips-linux-arm64@1.0.4':
+    resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@img/sharp-libvips-linux-arm@1.0.5':
+    resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==}
+    cpu: [arm]
+    os: [linux]
+
+  '@img/sharp-libvips-linux-s390x@1.0.4':
+    resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==}
+    cpu: [s390x]
+    os: [linux]
+
+  '@img/sharp-libvips-linux-x64@1.0.4':
+    resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==}
+    cpu: [x64]
+    os: [linux]
+
+  '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
+    resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@img/sharp-libvips-linuxmusl-x64@1.0.4':
+    resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==}
+    cpu: [x64]
+    os: [linux]
+
+  '@img/sharp-linux-arm64@0.33.5':
+    resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==}
+    engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+    cpu: [arm64]
+    os: [linux]
+
+  '@img/sharp-linux-arm@0.33.5':
+    resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==}
+    engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+    cpu: [arm]
+    os: [linux]
+
+  '@img/sharp-linux-s390x@0.33.5':
+    resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==}
+    engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+    cpu: [s390x]
+    os: [linux]
+
+  '@img/sharp-linux-x64@0.33.5':
+    resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==}
+    engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+    cpu: [x64]
+    os: [linux]
+
+  '@img/sharp-linuxmusl-arm64@0.33.5':
+    resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==}
+    engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+    cpu: [arm64]
+    os: [linux]
+
+  '@img/sharp-linuxmusl-x64@0.33.5':
+    resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==}
+    engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+    cpu: [x64]
+    os: [linux]
+
+  '@img/sharp-wasm32@0.33.5':
+    resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==}
+    engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+    cpu: [wasm32]
+
+  '@img/sharp-win32-ia32@0.33.5':
+    resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==}
+    engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+    cpu: [ia32]
+    os: [win32]
+
+  '@img/sharp-win32-x64@0.33.5':
+    resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==}
+    engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+    cpu: [x64]
+    os: [win32]
+
+  '@isaacs/cliui@8.0.2':
+    resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+    engines: {node: '>=12'}
+
+  '@istanbuljs/load-nyc-config@1.1.0':
+    resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
+    engines: {node: '>=8'}
+
+  '@istanbuljs/schema@0.1.3':
+    resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+    engines: {node: '>=8'}
+
+  '@jest/console@29.7.0':
+    resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  '@jest/core@29.7.0':
+    resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+
+  '@jest/environment@29.7.0':
+    resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  '@jest/expect-utils@29.7.0':
+    resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  '@jest/expect@29.7.0':
+    resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  '@jest/fake-timers@29.7.0':
+    resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  '@jest/globals@29.7.0':
+    resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  '@jest/reporters@29.7.0':
+    resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+
+  '@jest/schemas@29.6.3':
+    resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  '@jest/source-map@29.6.3':
+    resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  '@jest/test-result@29.7.0':
+    resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  '@jest/test-sequencer@29.7.0':
+    resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  '@jest/transform@29.7.0':
+    resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  '@jest/types@29.6.3':
+    resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  '@jridgewell/gen-mapping@0.3.8':
+    resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/resolve-uri@3.1.2':
+    resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/set-array@1.2.1':
+    resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/source-map@0.3.6':
+    resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
+
+  '@jridgewell/sourcemap-codec@1.5.0':
+    resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+  '@jridgewell/trace-mapping@0.3.25':
+    resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+  '@jridgewell/trace-mapping@0.3.9':
+    resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+
+  '@lexical/clipboard@0.30.0':
+    resolution: {integrity: sha512-taWQURtE6xF4Jy4I8teQw3+nVBVNO1r+9N9voXeivgwxSrAM40rjqQ/aZEKxWbwZtfkABDkCEArbVrqP0SkWcQ==}
+
+  '@lexical/code@0.30.0':
+    resolution: {integrity: sha512-OmA6Bmp3w9SMV25Hae1dLXtPNOdCgnzo1xy84K19U+dPP5iqXagwFq5oY/9PVOOI2wgaQHrz3C+7B4phDb9xaA==}
+
+  '@lexical/devtools-core@0.30.0':
+    resolution: {integrity: sha512-6vKEEIUym8pQ+tWt4VfRMOGE/dtfyPr9e1zPrAAV7Y/EdzK0AJYPPlw2Dt5Uqq9rposcIriqF4MkuFvy4UcZiQ==}
+    peerDependencies:
+      react: '>=17.x'
+      react-dom: '>=17.x'
+
+  '@lexical/dragon@0.30.0':
+    resolution: {integrity: sha512-eikVYw1pIcFIOojn2mGlps59YcyT9ATd6UMIx/ivuscakrZeU7SZM/F6c75QPJXNOu1b2koOo+4Bb1GT6jixGQ==}
+
+  '@lexical/hashtag@0.30.0':
+    resolution: {integrity: sha512-gB3DobSdAc0YZUhlTT7ZAUr+6RRREQ3UWVC1twdtFvXXw1vyTUXH2gWTDp/ParwBZ16Lnrg8mxET8Nu/qD1PSw==}
+
+  '@lexical/history@0.30.0':
+    resolution: {integrity: sha512-dxudthi94vSLQKXVq3LSwcOVkOmb2lvxoy7sCma513yJbrsn3fPLppR2Ynhl6aB9oPw675wSDrfsE6BG3U3+CA==}
+
+  '@lexical/html@0.30.0':
+    resolution: {integrity: sha512-GdegWO6RjJ7eE+yD3Z0X/OpT88SZjOs3DyQ0rgrZy3z7RPaFCbEEcq0M/NssJbKAB1XOFUsUFrnS7kZs1vJzGg==}
+
+  '@lexical/link@0.30.0':
+    resolution: {integrity: sha512-isD3PC0ywQIwbtekHYEvh7hDxcPz/cEr/AspYntYs08u5J0czhw3rpqnXWGauWaav5V9ExIkf1ZkGUFUI6bw5w==}
+
+  '@lexical/list@0.30.0':
+    resolution: {integrity: sha512-WKnwH+Cg+j2I0EbaEyPHo8MPNyrqQV3W1NmH5Mf/iRxCq42z7NJxemhmRUxbqv8vsugACwBkh2RlkhekRXmUQQ==}
+
+  '@lexical/mark@0.30.0':
+    resolution: {integrity: sha512-dLFH6tJ2WQUSdo1Y2Jp81vRT8j48FjF75K5YLRsKD/UFxWEy+RFgRXsd0H/BuFkx/jPTXt6xe8CaIrZvek8mLg==}
+
+  '@lexical/markdown@0.30.0':
+    resolution: {integrity: sha512-GGddZs63k0wb3/fdL7JyBjiy8L1AIHuRKT68riWbKAcNL7rfMl3Uy5VnMkgV/5bN/2eUQijkGjxG+VxsR8RWbw==}
+
+  '@lexical/offset@0.30.0':
+    resolution: {integrity: sha512-sZFbZt5dVdtrdoYk79i13xBDs8/MHXw6CqmZNht85L7UdwiuzVqA3KTyaMe60Vrg6mfsKIVjghbpMOhspcuCrw==}
+
+  '@lexical/overflow@0.30.0':
+    resolution: {integrity: sha512-fvjWnhtPZLMS3qJ6HC6tZTOMmcfNmeRUkgXTas9bvWT8Yul+WLJ/fWjzwvBcqpKlvPQjRFOcDcrW8T/Rp7KPrg==}
+
+  '@lexical/plain-text@0.30.0':
+    resolution: {integrity: sha512-jvxMMxFO3Yuj7evWsc33IGWfigU5A1KrJaIf6zv6GmYj0a7ZRkR1x6vJyc7AlgUM70sld+dozLdoynguQIlmrQ==}
+
+  '@lexical/react@0.30.0':
+    resolution: {integrity: sha512-fsb6voXzxHyP55lXdmnGhHMfxe6g/f+0NpmfPCkutOXYnY8UqKa86LLYl4Nrsi8HX8BRZfh1H0IjkzDG6EzVPw==}
+    peerDependencies:
+      react: '>=17.x'
+      react-dom: '>=17.x'
+
+  '@lexical/rich-text@0.30.0':
+    resolution: {integrity: sha512-oitOh5u68E5DBZt5VBZIaIeM/iNdt3mIDkGp2C259x81V/9KlSNB9c3rqdTKcs/A+Msw4j60FRhdmZcKQ9uYUA==}
+
+  '@lexical/selection@0.30.0':
+    resolution: {integrity: sha512-Ys2XfSmIV/Irg6Xo663YtR4jozIv/7sDemArkEGHT0fxZn2py5qftowPF5IBqFYxKTigAdv5vVPwusBvAnLIEg==}
+
+  '@lexical/table@0.30.0':
+    resolution: {integrity: sha512-XPCIMIGnZLKTa5/4cP16bXbmzvMndPR273HNl7ZaF35ky7UjZxdj42HBbE7q9zw2zbRPDiO77EyhYA0p20cbdw==}
+
+  '@lexical/text@0.30.0':
+    resolution: {integrity: sha512-P0ptriFwwP/hoDpz/MoBbzHxrFHqh0kCGzASWUdRZ1zrU0yPvJ9vV/UNMhyolH7xx+eAGI1Yl+m74NlpGmXqTg==}
+
+  '@lexical/utils@0.30.0':
+    resolution: {integrity: sha512-VJlAUhupCZmnbYYX3zMWovd4viu2guR01sAqKGbbOMbP+4rlaymixFbinvNPaRKDBloOARi+fpiveQFxnyr/Ew==}
+
+  '@lexical/yjs@0.30.0':
+    resolution: {integrity: sha512-mWGFAGpUPz4JoSV+Y0cZOzOZJoMLbVb/enldxEbV0xX71BBVzD0c0vjPxuaIJ9MtNkRZdK3eOubj+B45iOECtw==}
+    peerDependencies:
+      yjs: '>=13.5.22'
+
+  '@mapbox/node-pre-gyp@1.0.11':
+    resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==}
+    hasBin: true
+
+  '@mdx-js/loader@3.1.0':
+    resolution: {integrity: sha512-xU/lwKdOyfXtQGqn3VnJjlDrmKXEvMi1mgYxVmukEUtVycIz1nh7oQ40bKTd4cA7rLStqu0740pnhGYxGoqsCg==}
+    peerDependencies:
+      webpack: '>=5'
+    peerDependenciesMeta:
+      webpack:
+        optional: true
+
+  '@mdx-js/mdx@3.1.0':
+    resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==}
+
+  '@mdx-js/react@3.1.0':
+    resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==}
+    peerDependencies:
+      '@types/react': ~18.2.0
+      react: '>=16'
+
+  '@mermaid-js/parser@0.3.0':
+    resolution: {integrity: sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA==}
+
+  '@monaco-editor/loader@1.5.0':
+    resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==}
+
+  '@monaco-editor/react@4.7.0':
+    resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==}
+    peerDependencies:
+      monaco-editor: '>= 0.25.0 < 1'
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+  '@napi-rs/wasm-runtime@0.2.8':
+    resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==}
+
+  '@next/env@15.2.3':
+    resolution: {integrity: sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==}
+
+  '@next/eslint-plugin-next@15.3.0':
+    resolution: {integrity: sha512-511UUcpWw5GWTyKfzW58U2F/bYJyjLE9e3SlnGK/zSXq7RqLlqFO8B9bitJjumLpj317fycC96KZ2RZsjGNfBw==}
+
+  '@next/mdx@15.2.3':
+    resolution: {integrity: sha512-rJAe5GvpTTA/i+9lQk/p321g0kXPLIuWJzUtRccW7w4l9vmOTGPPnXFjooEyYgyFcdbZxvJpSdjNq65VeQGKRQ==}
+    peerDependencies:
+      '@mdx-js/loader': '>=0.15.0'
+      '@mdx-js/react': '>=0.15.0'
+    peerDependenciesMeta:
+      '@mdx-js/loader':
+        optional: true
+      '@mdx-js/react':
+        optional: true
+
+  '@next/swc-darwin-arm64@15.2.3':
+    resolution: {integrity: sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@next/swc-darwin-x64@15.2.3':
+    resolution: {integrity: sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@next/swc-linux-arm64-gnu@15.2.3':
+    resolution: {integrity: sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@next/swc-linux-arm64-musl@15.2.3':
+    resolution: {integrity: sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@next/swc-linux-x64-gnu@15.2.3':
+    resolution: {integrity: sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [linux]
+
+  '@next/swc-linux-x64-musl@15.2.3':
+    resolution: {integrity: sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [linux]
+
+  '@next/swc-win32-arm64-msvc@15.2.3':
+    resolution: {integrity: sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@next/swc-win32-x64-msvc@15.2.3':
+    resolution: {integrity: sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [win32]
+
+  '@nodelib/fs.scandir@2.1.5':
+    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.stat@2.0.5':
+    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.walk@1.2.8':
+    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+    engines: {node: '>= 8'}
+
+  '@nolyfill/is-core-module@1.0.39':
+    resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
+    engines: {node: '>=12.4.0'}
+
+  '@octokit/auth-token@5.1.2':
+    resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==}
+    engines: {node: '>= 18'}
+
+  '@octokit/core@6.1.5':
+    resolution: {integrity: sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==}
+    engines: {node: '>= 18'}
+
+  '@octokit/endpoint@10.1.4':
+    resolution: {integrity: sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==}
+    engines: {node: '>= 18'}
+
+  '@octokit/graphql@8.2.2':
+    resolution: {integrity: sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==}
+    engines: {node: '>= 18'}
+
+  '@octokit/openapi-types@25.0.0':
+    resolution: {integrity: sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==}
+
+  '@octokit/request-error@6.1.8':
+    resolution: {integrity: sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==}
+    engines: {node: '>= 18'}
+
+  '@octokit/request@9.2.3':
+    resolution: {integrity: sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==}
+    engines: {node: '>= 18'}
+
+  '@octokit/types@14.0.0':
+    resolution: {integrity: sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==}
+
+  '@parcel/watcher-android-arm64@2.5.1':
+    resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [android]
+
+  '@parcel/watcher-darwin-arm64@2.5.1':
+    resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@parcel/watcher-darwin-x64@2.5.1':
+    resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@parcel/watcher-freebsd-x64@2.5.1':
+    resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@parcel/watcher-linux-arm-glibc@2.5.1':
+    resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm]
+    os: [linux]
+
+  '@parcel/watcher-linux-arm-musl@2.5.1':
+    resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm]
+    os: [linux]
+
+  '@parcel/watcher-linux-arm64-glibc@2.5.1':
+    resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@parcel/watcher-linux-arm64-musl@2.5.1':
+    resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@parcel/watcher-linux-x64-glibc@2.5.1':
+    resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [linux]
+
+  '@parcel/watcher-linux-x64-musl@2.5.1':
+    resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [linux]
+
+  '@parcel/watcher-win32-arm64@2.5.1':
+    resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@parcel/watcher-win32-ia32@2.5.1':
+    resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@parcel/watcher-win32-x64@2.5.1':
+    resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [win32]
+
+  '@parcel/watcher@2.5.1':
+    resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
+    engines: {node: '>= 10.0.0'}
+
+  '@pkgjs/parseargs@0.11.0':
+    resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+    engines: {node: '>=14'}
+
+  '@pkgr/core@0.1.2':
+    resolution: {integrity: sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==}
+    engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+
+  '@pkgr/core@0.2.2':
+    resolution: {integrity: sha512-25L86MyPvnlQoX2MTIV2OiUcb6vJ6aRbFa9pbwByn95INKD5mFH2smgjDhq+fwJoqAgvgbdJLj6Tz7V9X5CFAQ==}
+    engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+
+  '@pmmmwh/react-refresh-webpack-plugin@0.5.16':
+    resolution: {integrity: sha512-kLQc9xz6QIqd2oIYyXRUiAp79kGpFBm3fEM9ahfG1HI0WI5gdZ2OVHWdmZYnwODt7ISck+QuQ6sBPrtvUBML7Q==}
+    engines: {node: '>= 10.13'}
+    peerDependencies:
+      '@types/webpack': 4.x || 5.x
+      react-refresh: '>=0.10.0 <1.0.0'
+      sockjs-client: ^1.4.0
+      type-fest: '>=0.17.0 <5.0.0'
+      webpack: '>=4.43.0 <6.0.0'
+      webpack-dev-server: 3.x || 4.x || 5.x
+      webpack-hot-middleware: 2.x
+      webpack-plugin-serve: 0.x || 1.x
+    peerDependenciesMeta:
+      '@types/webpack':
+        optional: true
+      sockjs-client:
+        optional: true
+      type-fest:
+        optional: true
+      webpack-dev-server:
+        optional: true
+      webpack-hot-middleware:
+        optional: true
+      webpack-plugin-serve:
+        optional: true
+
+  '@react-aria/focus@3.20.1':
+    resolution: {integrity: sha512-lgYs+sQ1TtBrAXnAdRBQrBo0/7o5H6IrfDxec1j+VRpcXL0xyk0xPq+m3lZp8typzIghqDgpnKkJ5Jf4OrzPIw==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+      react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+  '@react-aria/interactions@3.24.1':
+    resolution: {integrity: sha512-OWEcIC6UQfWq4Td5Ptuh4PZQ4LHLJr/JL2jGYvuNL6EgL3bWvzPrRYIF/R64YbfVxIC7FeZpPSkS07sZ93/NoA==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+      react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+  '@react-aria/ssr@3.9.7':
+    resolution: {integrity: sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==}
+    engines: {node: '>= 12'}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+  '@react-aria/utils@3.28.1':
+    resolution: {integrity: sha512-mnHFF4YOVu9BRFQ1SZSKfPhg3z+lBRYoW5mLcYTQihbKhz48+I1sqRkP7ahMITr8ANH3nb34YaMME4XWmK2Mgg==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+      react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+  '@react-stately/flags@3.1.0':
+    resolution: {integrity: sha512-KSHOCxTFpBtxhIRcKwsD1YDTaNxFtCYuAUb0KEihc16QwqZViq4hasgPBs2gYm7fHRbw7WYzWKf6ZSo/+YsFlg==}
+
+  '@react-stately/utils@3.10.5':
+    resolution: {integrity: sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+  '@react-types/shared@3.28.0':
+    resolution: {integrity: sha512-9oMEYIDc3sk0G5rysnYvdNrkSg7B04yTKl50HHSZVbokeHpnU0yRmsDaWb9B/5RprcKj8XszEk5guBO8Sa/Q+Q==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+  '@reactflow/background@11.3.14':
+    resolution: {integrity: sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA==}
+    peerDependencies:
+      react: '>=17'
+      react-dom: '>=17'
+
+  '@reactflow/controls@11.2.14':
+    resolution: {integrity: sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw==}
+    peerDependencies:
+      react: '>=17'
+      react-dom: '>=17'
+
+  '@reactflow/core@11.11.4':
+    resolution: {integrity: sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==}
+    peerDependencies:
+      react: '>=17'
+      react-dom: '>=17'
+
+  '@reactflow/minimap@11.7.14':
+    resolution: {integrity: sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ==}
+    peerDependencies:
+      react: '>=17'
+      react-dom: '>=17'
+
+  '@reactflow/node-resizer@2.2.14':
+    resolution: {integrity: sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA==}
+    peerDependencies:
+      react: '>=17'
+      react-dom: '>=17'
+
+  '@reactflow/node-toolbar@1.3.14':
+    resolution: {integrity: sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ==}
+    peerDependencies:
+      react: '>=17'
+      react-dom: '>=17'
+
+  '@remixicon/react@4.6.0':
+    resolution: {integrity: sha512-bY56maEgT5IYUSRotqy9h03IAKJC85vlKtWFg2FKzfs8JPrkdBAYSa9dxoUSKFwGzup8Ux6vjShs9Aec3jvr2w==}
+    peerDependencies:
+      react: '>=18.2.0'
+
+  '@rgrove/parse-xml@4.2.0':
+    resolution: {integrity: sha512-UuBOt7BOsKVOkFXRe4Ypd/lADuNIfqJXv8GvHqtXaTYXPPKkj2nS2zPllVsrtRjcomDhIJVBnZwfmlI222WH8g==}
+    engines: {node: '>=14.0.0'}
+
+  '@rollup/rollup-android-arm-eabi@4.39.0':
+    resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==}
+    cpu: [arm]
+    os: [android]
+
+  '@rollup/rollup-android-arm64@4.39.0':
+    resolution: {integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==}
+    cpu: [arm64]
+    os: [android]
+
+  '@rollup/rollup-darwin-arm64@4.39.0':
+    resolution: {integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@rollup/rollup-darwin-x64@4.39.0':
+    resolution: {integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@rollup/rollup-freebsd-arm64@4.39.0':
+    resolution: {integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@rollup/rollup-freebsd-x64@4.39.0':
+    resolution: {integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@rollup/rollup-linux-arm-gnueabihf@4.39.0':
+    resolution: {integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==}
+    cpu: [arm]
+    os: [linux]
+
+  '@rollup/rollup-linux-arm-musleabihf@4.39.0':
+    resolution: {integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==}
+    cpu: [arm]
+    os: [linux]
+
+  '@rollup/rollup-linux-arm64-gnu@4.39.0':
+    resolution: {integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@rollup/rollup-linux-arm64-musl@4.39.0':
+    resolution: {integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@rollup/rollup-linux-loongarch64-gnu@4.39.0':
+    resolution: {integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==}
+    cpu: [loong64]
+    os: [linux]
+
+  '@rollup/rollup-linux-powerpc64le-gnu@4.39.0':
+    resolution: {integrity: sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@rollup/rollup-linux-riscv64-gnu@4.39.0':
+    resolution: {integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@rollup/rollup-linux-riscv64-musl@4.39.0':
+    resolution: {integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@rollup/rollup-linux-s390x-gnu@4.39.0':
+    resolution: {integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==}
+    cpu: [s390x]
+    os: [linux]
+
+  '@rollup/rollup-linux-x64-gnu@4.39.0':
+    resolution: {integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==}
+    cpu: [x64]
+    os: [linux]
+
+  '@rollup/rollup-linux-x64-musl@4.39.0':
+    resolution: {integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==}
+    cpu: [x64]
+    os: [linux]
+
+  '@rollup/rollup-win32-arm64-msvc@4.39.0':
+    resolution: {integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@rollup/rollup-win32-ia32-msvc@4.39.0':
+    resolution: {integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==}
+    cpu: [ia32]
+    os: [win32]
+
+  '@rollup/rollup-win32-x64-msvc@4.39.0':
+    resolution: {integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==}
+    cpu: [x64]
+    os: [win32]
+
+  '@rtsao/scc@1.1.0':
+    resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
+
+  '@rushstack/eslint-patch@1.11.0':
+    resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==}
+
+  '@sentry-internal/browser-utils@8.55.0':
+    resolution: {integrity: sha512-ROgqtQfpH/82AQIpESPqPQe0UyWywKJsmVIqi3c5Fh+zkds5LUxnssTj3yNd1x+kxaPDVB023jAP+3ibNgeNDw==}
+    engines: {node: '>=14.18'}
+
+  '@sentry-internal/feedback@8.55.0':
+    resolution: {integrity: sha512-cP3BD/Q6pquVQ+YL+rwCnorKuTXiS9KXW8HNKu4nmmBAyf7urjs+F6Hr1k9MXP5yQ8W3yK7jRWd09Yu6DHWOiw==}
+    engines: {node: '>=14.18'}
+
+  '@sentry-internal/replay-canvas@8.55.0':
+    resolution: {integrity: sha512-nIkfgRWk1091zHdu4NbocQsxZF1rv1f7bbp3tTIlZYbrH62XVZosx5iHAuZG0Zc48AETLE7K4AX9VGjvQj8i9w==}
+    engines: {node: '>=14.18'}
+
+  '@sentry-internal/replay@8.55.0':
+    resolution: {integrity: sha512-roCDEGkORwolxBn8xAKedybY+Jlefq3xYmgN2fr3BTnsXjSYOPC7D1/mYqINBat99nDtvgFvNfRcZPiwwZ1hSw==}
+    engines: {node: '>=14.18'}
+
+  '@sentry/browser@8.55.0':
+    resolution: {integrity: sha512-1A31mCEWCjaMxJt6qGUK+aDnLDcK6AwLAZnqpSchNysGni1pSn1RWSmk9TBF8qyTds5FH8B31H480uxMPUJ7Cw==}
+    engines: {node: '>=14.18'}
+
+  '@sentry/core@8.55.0':
+    resolution: {integrity: sha512-6g7jpbefjHYs821Z+EBJ8r4Z7LT5h80YSWRJaylGS4nW5W5Z2KXzpdnyFarv37O7QjauzVC2E+PABmpkw5/JGA==}
+    engines: {node: '>=14.18'}
+
+  '@sentry/react@8.55.0':
+    resolution: {integrity: sha512-/qNBvFLpvSa/Rmia0jpKfJdy16d4YZaAnH/TuKLAtm0BWlsPQzbXCU4h8C5Hsst0Do0zG613MEtEmWpWrVOqWA==}
+    engines: {node: '>=14.18'}
+    peerDependencies:
+      react: ^16.14.0 || 17.x || 18.x || 19.x
+
+  '@sentry/utils@8.55.0':
+    resolution: {integrity: sha512-cYcl39+xcOivBpN9d8ZKbALl+DxZKo/8H0nueJZ0PO4JA+MJGhSm6oHakXxLPaiMoNLTX7yor8ndnQIuFg+vmQ==}
+    engines: {node: '>=14.18'}
+
+  '@sinclair/typebox@0.27.8':
+    resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+
+  '@sindresorhus/is@4.6.0':
+    resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
+    engines: {node: '>=10'}
+
+  '@sinonjs/commons@3.0.1':
+    resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
+
+  '@sinonjs/fake-timers@10.3.0':
+    resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
+
+  '@storybook/addon-actions@8.5.0':
+    resolution: {integrity: sha512-6CW9+17rk5eNx6I8EKqCxRKtsJFTR/lHL+xiJ6/iBWApIm8sg63vhXvUTJ58UixmIkT5oLh0+ESNPh+x10D8fw==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/addon-backgrounds@8.5.0':
+    resolution: {integrity: sha512-lzyFLs7niNsqlhH5kdUrp7htLiMIcjY50VLWe0PaeJ6T6GZ7X9qhQzROAUV6cGqzyd8A6y/LzIUntDPMVEm/6g==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/addon-controls@8.5.0':
+    resolution: {integrity: sha512-1fivx77A/ahObrPl0L66o9i9MUNfqXxsrpekne5gjMNXw9XJFIRNUe/ddL4CMmwu7SgVbj2QV+q5E5mlnZNTJw==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/addon-docs@8.5.0':
+    resolution: {integrity: sha512-REwLSr1VgOVNJZwP3y3mldhOjBHlM5fqTvq/tC8NaYpAzx9O4rZdoUSZxW3tYtoNoYrHpB8kzRTeZl8WSdKllw==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/addon-essentials@8.5.0':
+    resolution: {integrity: sha512-RrHRdaw2j3ugZiYQ6OHt3Ff08ID4hwAvipqULEsbEnEw3VlXOaW/MT5e2M7kW3MHskQ3iJ6XAD1Y1rNm432Pzw==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/addon-highlight@8.5.0':
+    resolution: {integrity: sha512-/JxYzMK5aJSYs0K/0eAEFyER2dMoxqwM891MdnkNwLFdyrM58lzHee00F9oEX6zeQoRUNQPRepq0ui2PvbTMGw==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/addon-interactions@8.5.0':
+    resolution: {integrity: sha512-vX1a8qS7o/W3kEzfL/CqOj/Rr6UlGLT/n0KXMpfIhx63tzxe1a1qGpFLL0h0zqAVPHZIOu9humWMKri5Iny6oA==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/addon-links@8.5.0':
+    resolution: {integrity: sha512-Y11GIByAYqn0TibI/xsy0vCe+ZxJS9PVAAoHngLxkf9J4WodAXcJABr8ZPlWDNdaEhSS/FF7UQUmNag0UC2/pw==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      storybook: ^8.5.0
+    peerDependenciesMeta:
+      react:
+        optional: true
+
+  '@storybook/addon-measure@8.5.0':
+    resolution: {integrity: sha512-e8pJy2sICyj0Ff0W1PFc6HPE6PqcjnnHtfuDaO3M9uSKJLYkpTWJ8i1VSP178f8seq44r5/PdQCHqs5q5l3zgw==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/addon-onboarding@8.5.0':
+    resolution: {integrity: sha512-77ebcHkKR744ciPbT4ZgqW4W7KrLv1uAdSb3mX3gWukSl4oxP9D/HjmNiX5fBDYWUC4wsf6q5barOs4Hqn8ivw==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/addon-outline@8.5.0':
+    resolution: {integrity: sha512-r12sk1b38Ph6NroWAOTfjbJ/V+gDobm7tKQQlbSDf6fgX7cqyPHmKjfNDCOCQpXouZm/Jm+41zd758PW+Yt4ng==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/addon-themes@8.5.0':
+    resolution: {integrity: sha512-pBNut4sLfcOeLBvWdNAJ3cxv/BfMSTmJcUtSzE4G+1pVNsBbGF+T2f/GM0IjaM0K8Ft03VDzeEAB64nluDS4RA==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/addon-toolbars@8.5.0':
+    resolution: {integrity: sha512-q3yYYO2WX8K2DYNM++FzixGDjzYaeREincgsl2WXYXrcuGb5hkOoOgRiAQL8Nz9NQ1Eo+B/yZxrhG/5VoVhUUQ==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/addon-viewport@8.5.0':
+    resolution: {integrity: sha512-MlhVELImk9YzjEgGR2ciLC8d5tUSGcO7my4kWIClN0VyTRcvG4ZfwrsEC+jN3/l52nrgjLmKrDX5UAGZm6w5mQ==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/blocks@8.5.0':
+    resolution: {integrity: sha512-2sTOgjH/JFOgWnpqkKjpKVvKAgUaC9ZBjH1gnCoA5dne/SDafYaCAYfv6yZn7g2Xm1sTxWCAmMIUkYSALeWr+w==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      storybook: ^8.5.0
+    peerDependenciesMeta:
+      react:
+        optional: true
+      react-dom:
+        optional: true
+
+  '@storybook/builder-webpack5@8.5.0':
+    resolution: {integrity: sha512-MyCj11cktyN2HeK8NsLv+L0Km36qAz2UGqu6j1VKJUgPelgpCCi4StCW/KaSBeOFAwGD52xjAdNu+c1h/vfiMg==}
+    peerDependencies:
+      storybook: ^8.5.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@storybook/components@8.5.0':
+    resolution: {integrity: sha512-DhaHtwfEcfWYj3ih/5RBSDHe3Idxyf+oHw2/DmaLKJX6MluhdK3ZqigjRcTmA9Gj/SbR4CkHEEtDzAvBlW0BYw==}
+    peerDependencies:
+      storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+
+  '@storybook/core-webpack@8.5.0':
+    resolution: {integrity: sha512-bJAcF9TwNO2qNa7Jef4h5U9ka4399HDiHiQec1AxdqUIy/2zfbetgV6+2Fr5mtejPqJgbs7kXNGErI+fFByLGg==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/core@8.5.0':
+    resolution: {integrity: sha512-apborO6ynns7SeydBSqE9o0zT6JSU+VY4gLFPJROGcconvSW4bS5xtJCsgjlulceyWVxepFHGXl4jEZw+SktXA==}
+    peerDependencies:
+      prettier: ^2 || ^3
+    peerDependenciesMeta:
+      prettier:
+        optional: true
+
+  '@storybook/csf-plugin@8.5.0':
+    resolution: {integrity: sha512-cs6ogviNyLG1h9J8Sb47U3DqIrQmn2EHm4ta3fpCeV3ABbrMgbzYyxtmybz4g/AwlDgjAZAt6PPcXkfCJ6p2CQ==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/csf@0.1.12':
+    resolution: {integrity: sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw==}
+
+  '@storybook/csf@0.1.13':
+    resolution: {integrity: sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q==}
+
+  '@storybook/global@5.0.0':
+    resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==}
+
+  '@storybook/icons@1.4.0':
+    resolution: {integrity: sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+
+  '@storybook/instrumenter@8.5.0':
+    resolution: {integrity: sha512-eZ/UY6w4U2vay+wX7QVwKiRoyMzZscuv6v4k4r8BlmHPFWbhiZDO9S2GsG16UkyKnrQrYk432he70n7hn1Xvmg==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/manager-api@8.5.0':
+    resolution: {integrity: sha512-Ildriueo3eif4M+gMlMxu/mrBIbAnz8+oesmQJKdzZfe/U9eQTI9OUqJsxx/IVBmdzQ3ySsgNmzj5VweRkse4A==}
+    peerDependencies:
+      storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+
+  '@storybook/nextjs@8.5.0':
+    resolution: {integrity: sha512-zUU0wQd4F2p006gZX0XC3+Zsj0tB4DOz+7FjSlnyGbzf5cDE6cD74l0Azj6aZluR4Q2say7gWDIpHu05YvIJsg==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      next: ^13.5.0 || ^14.0.0 || ^15.0.0
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      storybook: ^8.5.0
+      typescript: '*'
+      webpack: ^5.0.0
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+      webpack:
+        optional: true
+
+  '@storybook/preset-react-webpack@8.5.0':
+    resolution: {integrity: sha512-KJwVcQVYQWuMT5QUF06be60UuBfazBIO+90erfoYoIx0UwOxKMVnQz0HfG2JMc4EIoNLIl0/cm5mb2k4BWyhbA==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      storybook: ^8.5.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@storybook/preview-api@8.5.0':
+    resolution: {integrity: sha512-g0XbD54zMUkl6bpuA7qEBCE9rW1QV6KKmwkO4bkxMOJcMke3x9l00JTaYn7Un8wItjXiS3BIG15B6mnfBG7fng==}
+    peerDependencies:
+      storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+
+  '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0':
+    resolution: {integrity: sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==}
+    peerDependencies:
+      typescript: '>= 4.x'
+      webpack: '>= 4'
+
+  '@storybook/react-dom-shim@8.5.0':
+    resolution: {integrity: sha512-7P8xg4FiuFpM6kQOzZynno+0zyLVs8NgsmRK58t3JRZXbda1tzlxTXzvqx4hUevvbPJGjmrB0F3xTFH+8Otnvw==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      storybook: ^8.5.0
+
+  '@storybook/react@8.5.0':
+    resolution: {integrity: sha512-/jbkmGGc95N7KduIennL/k8grNTP5ye/YBnkcS4TbF7uDWBtKy3/Wqvx5BIlFXq3qeUnZJ8YtZc0lPIYeCY8XQ==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      '@storybook/test': 8.5.0
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
+      storybook: ^8.5.0
+      typescript: '>= 4.2.x'
+    peerDependenciesMeta:
+      '@storybook/test':
+        optional: true
+      typescript:
+        optional: true
+
+  '@storybook/test@8.5.0':
+    resolution: {integrity: sha512-M/DdPlI6gwL7NGkK5o7GYjdEBp95AsFEUtW29zQfnVIAngYugzi3nIuM/XkQHunidVdAZCYjw2s2Yhhsx/m9sw==}
+    peerDependencies:
+      storybook: ^8.5.0
+
+  '@storybook/theming@8.5.0':
+    resolution: {integrity: sha512-591LbOj/HMmHYUfLgrMerxhF1A9mY61HWKxcRpB6xxalc1Xw1kRtQ49DcwuTXnUu9ktBB3nuOzPNPQPFSh/7PQ==}
+    peerDependencies:
+      storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
+
+  '@stylistic/eslint-plugin@4.2.0':
+    resolution: {integrity: sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: '>=9.0.0'
+
+  '@svgdotjs/svg.js@3.2.4':
+    resolution: {integrity: sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==}
+
+  '@swc/counter@0.1.3':
+    resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
+
+  '@swc/helpers@0.5.15':
+    resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
+
+  '@swc/helpers@0.5.17':
+    resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==}
+
+  '@szmarczak/http-timer@4.0.6':
+    resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
+    engines: {node: '>=10'}
+
+  '@tailwindcss/typography@0.5.16':
+    resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==}
+    peerDependencies:
+      tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1'
+
+  '@tanstack/form-core@1.3.2':
+    resolution: {integrity: sha512-hqRLw9EJ8bLJ5zvorGgTI4INcKh1hAtjPRTslwdB529soP8LpguzqWhn7yVV5/c2GcMSlqmpy5NZarkF5Mf54A==}
+
+  '@tanstack/query-core@5.72.2':
+    resolution: {integrity: sha512-fxl9/0yk3mD/FwTmVEf1/H6N5B975H0luT+icKyX566w6uJG0x6o+Yl+I38wJRCaogiMkstByt+seXfDbWDAcA==}
+
+  '@tanstack/query-devtools@5.72.2':
+    resolution: {integrity: sha512-mMKnGb+iOhVBcj6jaerCFRpg8pACStdG8hmUBHPtToeZzs4ctjBUL1FajqpVn2WaMxnq8Wya+P3Q5tPFNM9jQw==}
+
+  '@tanstack/react-form@1.3.3':
+    resolution: {integrity: sha512-rjZU6ufaQYbZU9I0uIXUJ1CPQ9M/LFyfpbsgA4oqpX/lLoiCFYsV7tZYVlWMMHkpSr1hhmAywp/8rmCFt14lnw==}
+    peerDependencies:
+      '@tanstack/react-start': ^1.112.0
+      react: ^17.0.0 || ^18.0.0 || ^19.0.0
+      vinxi: ^0.5.0
+    peerDependenciesMeta:
+      '@tanstack/react-start':
+        optional: true
+      vinxi:
+        optional: true
+
+  '@tanstack/react-query-devtools@5.72.2':
+    resolution: {integrity: sha512-n53qr9JdHCJTCUba6OvMhwiV2CcsckngOswKEE7nM5pQBa/fW9c43qw8omw1RPT2s+aC7MuwS8fHsWT8g+j6IQ==}
+    peerDependencies:
+      '@tanstack/react-query': ^5.72.2
+      react: ^18 || ^19
+
+  '@tanstack/react-query@5.72.2':
+    resolution: {integrity: sha512-SVNHzyBUYiis+XiCl+8yiPZmMYei2AKYY94wM/zpvB5l1jxqOo82FQTziSJ4pBi96jtYqvYrTMxWynmbQh3XKw==}
+    peerDependencies:
+      react: ^18 || ^19
+
+  '@tanstack/react-store@0.7.0':
+    resolution: {integrity: sha512-S/Rq17HaGOk+tQHV/yrePMnG1xbsKZIl/VsNWnNXt4XW+tTY8dTlvpJH2ZQ3GRALsusG5K6Q3unAGJ2pd9W/Ng==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+  '@tanstack/react-virtual@3.13.6':
+    resolution: {integrity: sha512-WT7nWs8ximoQ0CDx/ngoFP7HbQF9Q2wQe4nh2NB+u2486eX3nZRE40P9g6ccCVq7ZfTSH5gFOuCoVH5DLNS/aA==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+  '@tanstack/store@0.7.0':
+    resolution: {integrity: sha512-CNIhdoUsmD2NolYuaIs8VfWM467RK6oIBAW4nPEKZhg1smZ+/CwtCdpURgp7nxSqOaV9oKkzdWD80+bC66F/Jg==}
+
+  '@tanstack/virtual-core@3.13.6':
+    resolution: {integrity: sha512-cnQUeWnhNP8tJ4WsGcYiX24Gjkc9ALstLbHcBj1t3E7EimN6n6kHH+DPV4PpDnuw00NApQp+ViojMj1GRdwYQg==}
+
+  '@testing-library/dom@10.4.0':
+    resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==}
+    engines: {node: '>=18'}
+
+  '@testing-library/jest-dom@6.5.0':
+    resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==}
+    engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
+
+  '@testing-library/jest-dom@6.6.3':
+    resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==}
+    engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
+
+  '@testing-library/react@16.3.0':
+    resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@testing-library/dom': ^10.0.0
+      '@types/react': ~18.2.0
+      '@types/react-dom': ~18.2.0
+      react: ^18.0.0 || ^19.0.0
+      react-dom: ^18.0.0 || ^19.0.0
+    peerDependenciesMeta:
+      '@types/react':
+        optional: true
+      '@types/react-dom':
+        optional: true
+
+  '@testing-library/user-event@14.5.2':
+    resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==}
+    engines: {node: '>=12', npm: '>=6'}
+    peerDependencies:
+      '@testing-library/dom': '>=7.21.4'
+
+  '@tsconfig/node10@1.0.11':
+    resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
+
+  '@tsconfig/node12@1.0.11':
+    resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+
+  '@tsconfig/node14@1.0.3':
+    resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+
+  '@tsconfig/node16@1.0.4':
+    resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+
+  '@tybys/wasm-util@0.9.0':
+    resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==}
+
+  '@types/aria-query@5.0.4':
+    resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
+
+  '@types/babel__core@7.20.5':
+    resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+  '@types/babel__generator@7.27.0':
+    resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
+
+  '@types/babel__template@7.4.4':
+    resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+  '@types/babel__traverse@7.20.7':
+    resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==}
+
+  '@types/cacheable-request@6.0.3':
+    resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==}
+
+  '@types/crypto-js@4.2.2':
+    resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==}
+
+  '@types/d3-array@3.2.1':
+    resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==}
+
+  '@types/d3-axis@3.0.6':
+    resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==}
+
+  '@types/d3-brush@3.0.6':
+    resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==}
+
+  '@types/d3-chord@3.0.6':
+    resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==}
+
+  '@types/d3-color@3.1.3':
+    resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
+
+  '@types/d3-contour@3.0.6':
+    resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==}
+
+  '@types/d3-delaunay@6.0.4':
+    resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==}
+
+  '@types/d3-dispatch@3.0.6':
+    resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==}
+
+  '@types/d3-drag@3.0.7':
+    resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==}
+
+  '@types/d3-dsv@3.0.7':
+    resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==}
+
+  '@types/d3-ease@3.0.2':
+    resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
+
+  '@types/d3-fetch@3.0.7':
+    resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==}
+
+  '@types/d3-force@3.0.10':
+    resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==}
+
+  '@types/d3-format@3.0.4':
+    resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==}
+
+  '@types/d3-geo@3.1.0':
+    resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==}
+
+  '@types/d3-hierarchy@3.1.7':
+    resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==}
+
+  '@types/d3-interpolate@3.0.4':
+    resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
+
+  '@types/d3-path@3.1.1':
+    resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==}
+
+  '@types/d3-polygon@3.0.2':
+    resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==}
+
+  '@types/d3-quadtree@3.0.6':
+    resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==}
+
+  '@types/d3-random@3.0.3':
+    resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==}
+
+  '@types/d3-scale-chromatic@3.1.0':
+    resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==}
+
+  '@types/d3-scale@4.0.9':
+    resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==}
+
+  '@types/d3-selection@3.0.11':
+    resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==}
+
+  '@types/d3-shape@3.1.7':
+    resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==}
+
+  '@types/d3-time-format@4.0.3':
+    resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==}
+
+  '@types/d3-time@3.0.4':
+    resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
+
+  '@types/d3-timer@3.0.2':
+    resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
+
+  '@types/d3-transition@3.0.9':
+    resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==}
+
+  '@types/d3-zoom@3.0.8':
+    resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==}
+
+  '@types/d3@7.4.3':
+    resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==}
+
+  '@types/dagre@0.7.52':
+    resolution: {integrity: sha512-XKJdy+OClLk3hketHi9Qg6gTfe1F3y+UFnHxKA2rn9Dw+oXa4Gb378Ztz9HlMgZKSxpPmn4BNVh9wgkpvrK1uw==}
+
+  '@types/debug@4.1.12':
+    resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
+  '@types/doctrine@0.0.9':
+    resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==}
+
+  '@types/eslint-scope@3.7.7':
+    resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
+
+  '@types/eslint@9.6.1':
+    resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
+
+  '@types/estree-jsx@1.0.5':
+    resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
+
+  '@types/estree@1.0.7':
+    resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
+
+  '@types/geojson@7946.0.16':
+    resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
+
+  '@types/graceful-fs@4.1.9':
+    resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
+
+  '@types/hast@2.3.10':
+    resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
+
+  '@types/hast@3.0.4':
+    resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+
+  '@types/html-minifier-terser@6.1.0':
+    resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==}
+
+  '@types/http-cache-semantics@4.0.4':
+    resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==}
+
+  '@types/istanbul-lib-coverage@2.0.6':
+    resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
+
+  '@types/istanbul-lib-report@3.0.3':
+    resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==}
+
+  '@types/istanbul-reports@3.0.4':
+    resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
+
+  '@types/jest@29.5.14':
+    resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==}
+
+  '@types/js-cookie@3.0.6':
+    resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==}
+
+  '@types/json-schema@7.0.15':
+    resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+  '@types/json5@0.0.29':
+    resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
+  '@types/katex@0.16.7':
+    resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==}
+
+  '@types/keyv@3.1.4':
+    resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
+
+  '@types/lodash-es@4.17.12':
+    resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+
+  '@types/lodash@4.17.16':
+    resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==}
+
+  '@types/mdast@4.0.4':
+    resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+  '@types/mdx@2.0.13':
+    resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
+
+  '@types/ms@2.1.0':
+    resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
+
+  '@types/negotiator@0.6.3':
+    resolution: {integrity: sha512-JkXTOdKs5MF086b/pt8C3+yVp3iDUwG635L7oCH6HvJvvr6lSUU5oe/gLXnPEfYRROHjJIPgCV6cuAg8gGkntQ==}
+
+  '@types/node@18.15.0':
+    resolution: {integrity: sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==}
+
+  '@types/normalize-package-data@2.4.4':
+    resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
+
+  '@types/papaparse@5.3.15':
+    resolution: {integrity: sha512-JHe6vF6x/8Z85nCX4yFdDslN11d+1pr12E526X8WAfhadOeaOTx5AuIkvDKIBopfvlzpzkdMx4YyvSKCM9oqtw==}
+
+  '@types/parse-json@4.0.2':
+    resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
+
+  '@types/prop-types@15.7.14':
+    resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==}
+
+  '@types/qs@6.9.18':
+    resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==}
+
+  '@types/react-dom@18.2.25':
+    resolution: {integrity: sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==}
+
+  '@types/react-slider@1.3.6':
+    resolution: {integrity: sha512-RS8XN5O159YQ6tu3tGZIQz1/9StMLTg/FCIPxwqh2gwVixJnlfIodtVx+fpXVMZHe7A58lAX1Q4XTgAGOQaCQg==}
+
+  '@types/react-syntax-highlighter@15.5.13':
+    resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==}
+
+  '@types/react-window-infinite-loader@1.0.9':
+    resolution: {integrity: sha512-gEInTjQwURCnDOFyIEK2+fWB5gTjqwx30O62QfxA9stE5aiB6EWkGj4UMhc0axq7/FV++Gs/TGW8FtgEx0S6Tw==}
+
+  '@types/react-window@1.8.8':
+    resolution: {integrity: sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==}
+
+  '@types/react@18.2.79':
+    resolution: {integrity: sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==}
+
+  '@types/recordrtc@5.6.14':
+    resolution: {integrity: sha512-Reiy1sl11xP0r6w8DW3iQjc1BgXFyNC7aDuutysIjpFoqyftbQps9xPA2FoBkfVXpJM61betgYPNt+v65zvMhA==}
+
+  '@types/resolve@1.20.6':
+    resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==}
+
+  '@types/responselike@1.0.3':
+    resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
+
+  '@types/semver@7.7.0':
+    resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==}
+
+  '@types/sortablejs@1.15.8':
+    resolution: {integrity: sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==}
+
+  '@types/stack-utils@2.0.3':
+    resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
+
+  '@types/trusted-types@2.0.7':
+    resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
+
+  '@types/unist@2.0.11':
+    resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
+
+  '@types/unist@3.0.3':
+    resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
+  '@types/uuid@10.0.0':
+    resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==}
+
+  '@types/uuid@9.0.8':
+    resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==}
+
+  '@types/yargs-parser@21.0.3':
+    resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
+
+  '@types/yargs@17.0.33':
+    resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
+
+  '@typescript-eslint/eslint-plugin@8.29.1':
+    resolution: {integrity: sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: '>=4.8.4 <5.9.0'
+
+  '@typescript-eslint/parser@8.29.1':
+    resolution: {integrity: sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: '>=4.8.4 <5.9.0'
+
+  '@typescript-eslint/scope-manager@8.29.1':
+    resolution: {integrity: sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@typescript-eslint/type-utils@8.29.1':
+    resolution: {integrity: sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: '>=4.8.4 <5.9.0'
+
+  '@typescript-eslint/types@8.29.1':
+    resolution: {integrity: sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@typescript-eslint/typescript-estree@8.29.1':
+    resolution: {integrity: sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      typescript: '>=4.8.4 <5.9.0'
+
+  '@typescript-eslint/utils@8.29.1':
+    resolution: {integrity: sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: '>=4.8.4 <5.9.0'
+
+  '@typescript-eslint/visitor-keys@8.29.1':
+    resolution: {integrity: sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@ungap/structured-clone@1.3.0':
+    resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
+
+  '@unrs/resolver-binding-darwin-arm64@1.4.1':
+    resolution: {integrity: sha512-8Tv+Bsd0BjGwfEedIyor4inw8atppRxM5BdUnIt+3mAm/QXUm7Dw74CHnXpfZKXkp07EXJGiA8hStqCINAWhdw==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@unrs/resolver-binding-darwin-x64@1.4.1':
+    resolution: {integrity: sha512-X8c3PhWziEMKAzZz+YAYWfwawi5AEgzy/hmfizAB4C70gMHLKmInJcp1270yYAOs7z07YVFI220pp50z24Jk3A==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@unrs/resolver-binding-freebsd-x64@1.4.1':
+    resolution: {integrity: sha512-UUr/nREy1UdtxXQnmLaaTXFGOcGxPwNIzeJdb3KXai3TKtC1UgNOB9s8KOA4TaxOUBR/qVgL5BvBwmUjD5yuVA==}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@unrs/resolver-binding-linux-arm-gnueabihf@1.4.1':
+    resolution: {integrity: sha512-e3pII53dEeS8inkX6A1ad2UXE0nuoWCqik4kOxaDnls0uJUq0ntdj5d9IYd+bv5TDwf9DSge/xPOvCmRYH+Tsw==}
+    cpu: [arm]
+    os: [linux]
+
+  '@unrs/resolver-binding-linux-arm-musleabihf@1.4.1':
+    resolution: {integrity: sha512-e/AKKd9gR+HNmVyDEPI/PIz2t0DrA3cyonHNhHVjrkxe8pMCiYiqhtn1+h+yIpHUtUlM6Y1FNIdivFa+r7wrEQ==}
+    cpu: [arm]
+    os: [linux]
+
+  '@unrs/resolver-binding-linux-arm64-gnu@1.4.1':
+    resolution: {integrity: sha512-vtIu34luF1jRktlHtiwm2mjuE8oJCsFiFr8hT5+tFQdqFKjPhbJXn83LswKsOhy0GxAEevpXDI4xxEwkjuXIPA==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@unrs/resolver-binding-linux-arm64-musl@1.4.1':
+    resolution: {integrity: sha512-H3PaOuGyhFXiyJd+09uPhGl4gocmhyi1BRzvsP8Lv5AQO3p3/ZY7WjV4t2NkBksm9tMjf3YbOVHyPWi2eWsNYw==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@unrs/resolver-binding-linux-ppc64-gnu@1.4.1':
+    resolution: {integrity: sha512-4+GmJcaaFntCi1S01YByqp8wLMjV/FyQyHVGm0vedIhL1Vfx7uHkz/sZmKsidRwokBGuxi92GFmSzqT2O8KcNA==}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@unrs/resolver-binding-linux-s390x-gnu@1.4.1':
+    resolution: {integrity: sha512-6RDQVCmtFYTlhy89D5ixTqo9bTQqFhvNN0Ey1wJs5r+01Dq15gPHRXv2jF2bQATtMrOfYwv+R2ZR9ew1N1N3YQ==}
+    cpu: [s390x]
+    os: [linux]
+
+  '@unrs/resolver-binding-linux-x64-gnu@1.4.1':
+    resolution: {integrity: sha512-XpU9uzIkD86+19NjCXxlVPISMUrVXsXo5htxtuG+uJ59p5JauSRZsIxQxzzfKzkxEjdvANPM/lS1HFoX6A6QeA==}
+    cpu: [x64]
+    os: [linux]
+
+  '@unrs/resolver-binding-linux-x64-musl@1.4.1':
+    resolution: {integrity: sha512-3CDjG/spbTKCSHl66QP2ekHSD+H34i7utuDIM5gzoNBcZ1gTO0Op09Wx5cikXnhORRf9+HyDWzm37vU1PLSM1A==}
+    cpu: [x64]
+    os: [linux]
+
+  '@unrs/resolver-binding-wasm32-wasi@1.4.1':
+    resolution: {integrity: sha512-50tYhvbCTnuzMn7vmP8IV2UKF7ITo1oihygEYq9wW2DUb/Y+QMqBHJUSCABRngATjZ4shOK6f2+s0gQX6ElENQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [wasm32]
+
+  '@unrs/resolver-binding-win32-arm64-msvc@1.4.1':
+    resolution: {integrity: sha512-KyJiIne/AqV4IW0wyQO34wSMuJwy3VxVQOfIXIPyQ/Up6y/zi2P/WwXb78gHsLiGRUqCA9LOoCX+6dQZde0g1g==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@unrs/resolver-binding-win32-ia32-msvc@1.4.1':
+    resolution: {integrity: sha512-y2NUD7pygrBolN2NoXUrwVqBpKPhF8DiSNE5oB5/iFO49r2DpoYqdj5HPb3F42fPBH5qNqj6Zg63+xCEzAD2hw==}
+    cpu: [ia32]
+    os: [win32]
+
+  '@unrs/resolver-binding-win32-x64-msvc@1.4.1':
+    resolution: {integrity: sha512-hVXaObGI2lGFmrtT77KSbPQ3I+zk9IU500wobjk0+oX59vg/0VqAzABNtt3YSQYgXTC2a/LYxekLfND/wlt0yQ==}
+    cpu: [x64]
+    os: [win32]
+
+  '@vitest/eslint-plugin@1.1.42':
+    resolution: {integrity: sha512-dTGNbh/angh+hoqp5L5A8YO/29mOXDXmDQ/1fzt/jiYzLvU6FvrMqJpGqMqh5g+Fz6MDoZi0AlxefnFUg93Q5A==}
+    peerDependencies:
+      '@typescript-eslint/utils': '>= 8.24.0'
+      eslint: '>= 8.57.0'
+      typescript: '>= 5.0.0'
+      vitest: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@vitest/expect@2.0.5':
+    resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==}
+
+  '@vitest/expect@3.1.1':
+    resolution: {integrity: sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==}
+
+  '@vitest/mocker@3.1.1':
+    resolution: {integrity: sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==}
+    peerDependencies:
+      msw: ^2.4.9
+      vite: ^5.0.0 || ^6.0.0
+    peerDependenciesMeta:
+      msw:
+        optional: true
+      vite:
+        optional: true
+
+  '@vitest/pretty-format@2.0.5':
+    resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==}
+
+  '@vitest/pretty-format@2.1.9':
+    resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==}
+
+  '@vitest/pretty-format@3.1.1':
+    resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==}
+
+  '@vitest/runner@3.1.1':
+    resolution: {integrity: sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==}
+
+  '@vitest/snapshot@3.1.1':
+    resolution: {integrity: sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==}
+
+  '@vitest/spy@2.0.5':
+    resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==}
+
+  '@vitest/spy@3.1.1':
+    resolution: {integrity: sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==}
+
+  '@vitest/utils@2.0.5':
+    resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==}
+
+  '@vitest/utils@2.1.9':
+    resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==}
+
+  '@vitest/utils@3.1.1':
+    resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==}
+
+  '@vue/compiler-core@3.5.13':
+    resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
+
+  '@vue/compiler-dom@3.5.13':
+    resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==}
+
+  '@vue/compiler-sfc@3.5.13':
+    resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==}
+
+  '@vue/compiler-ssr@3.5.13':
+    resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==}
+
+  '@vue/shared@3.5.13':
+    resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
+
+  '@webassemblyjs/ast@1.14.1':
+    resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
+
+  '@webassemblyjs/floating-point-hex-parser@1.13.2':
+    resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==}
+
+  '@webassemblyjs/helper-api-error@1.13.2':
+    resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==}
+
+  '@webassemblyjs/helper-buffer@1.14.1':
+    resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==}
+
+  '@webassemblyjs/helper-numbers@1.13.2':
+    resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==}
+
+  '@webassemblyjs/helper-wasm-bytecode@1.13.2':
+    resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==}
+
+  '@webassemblyjs/helper-wasm-section@1.14.1':
+    resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==}
+
+  '@webassemblyjs/ieee754@1.13.2':
+    resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==}
+
+  '@webassemblyjs/leb128@1.13.2':
+    resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==}
+
+  '@webassemblyjs/utf8@1.13.2':
+    resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==}
+
+  '@webassemblyjs/wasm-edit@1.14.1':
+    resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==}
+
+  '@webassemblyjs/wasm-gen@1.14.1':
+    resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==}
+
+  '@webassemblyjs/wasm-opt@1.14.1':
+    resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==}
+
+  '@webassemblyjs/wasm-parser@1.14.1':
+    resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==}
+
+  '@webassemblyjs/wast-printer@1.14.1':
+    resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==}
+
+  '@xtuc/ieee754@1.2.0':
+    resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+
+  '@xtuc/long@4.2.2':
+    resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+
+  '@zod/core@0.1.0':
+    resolution: {integrity: sha512-hSXsufqjH7u8DiJPT0KY1rFWIhjkdXGM8MhMLwzaeOMhxMA4bzjWLQwSoAToJunUTVrpmfdo4dUFzNaU219+VQ==}
+
+  '@zod/mini@4.0.0-beta.0':
+    resolution: {integrity: sha512-ux1pJYQJO0S/uAldc0KGKiBFvqPpQqfC8vXbBJ3tDrcWCCa6/QBQPexZFn/cHscTxA/SnEJEAxa7qGTwPQC5Tg==}
+
+  abbrev@1.1.1:
+    resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
+
+  abcjs@6.4.4:
+    resolution: {integrity: sha512-dT3Z2vb8yihbiPMzSoup0JOcvO2je4qpFNlTD+kS5VBelE3AASAs18dS5qeMWkZeqCz7kI/hz62B2lpMDugWLA==}
+
+  abort-controller@3.0.0:
+    resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
+    engines: {node: '>=6.5'}
+
+  acorn-jsx@5.3.2:
+    resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+    peerDependencies:
+      acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+  acorn-walk@8.3.4:
+    resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
+    engines: {node: '>=0.4.0'}
+
+  acorn@8.14.1:
+    resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
+  adjust-sourcemap-loader@4.0.0:
+    resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==}
+    engines: {node: '>=8.9'}
+
+  agent-base@6.0.2:
+    resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
+    engines: {node: '>= 6.0.0'}
+
+  ahooks@3.8.4:
+    resolution: {integrity: sha512-39wDEw2ZHvypaT14EpMMk4AzosHWt0z9bulY0BeDsvc9PqJEV+Kjh/4TZfftSsotBMq52iYIOFPd3PR56e0ZJg==}
+    engines: {node: '>=8.0.0'}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+
+  ajv-formats@2.1.1:
+    resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+    peerDependencies:
+      ajv: ^8.0.0
+    peerDependenciesMeta:
+      ajv:
+        optional: true
+
+  ajv-keywords@3.5.2:
+    resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
+    peerDependencies:
+      ajv: ^6.9.1
+
+  ajv-keywords@5.1.0:
+    resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
+    peerDependencies:
+      ajv: ^8.8.2
+
+  ajv@6.12.6:
+    resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+  ajv@8.17.1:
+    resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
+  ansi-escapes@4.3.2:
+    resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+    engines: {node: '>=8'}
+
+  ansi-escapes@7.0.0:
+    resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==}
+    engines: {node: '>=18'}
+
+  ansi-html-community@0.0.8:
+    resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==}
+    engines: {'0': node >= 0.8.0}
+    hasBin: true
+
+  ansi-html@0.0.9:
+    resolution: {integrity: sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==}
+    engines: {'0': node >= 0.8.0}
+    hasBin: true
+
+  ansi-regex@5.0.1:
+    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+    engines: {node: '>=8'}
+
+  ansi-regex@6.1.0:
+    resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+    engines: {node: '>=12'}
+
+  ansi-styles@4.3.0:
+    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+    engines: {node: '>=8'}
+
+  ansi-styles@5.2.0:
+    resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+    engines: {node: '>=10'}
+
+  ansi-styles@6.2.1:
+    resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+    engines: {node: '>=12'}
+
+  ansis@3.17.0:
+    resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==}
+    engines: {node: '>=14'}
+
+  any-promise@1.3.0:
+    resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+
+  anymatch@3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+
+  aproba@2.0.0:
+    resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
+
+  are-docs-informative@0.0.2:
+    resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==}
+    engines: {node: '>=14'}
+
+  are-we-there-yet@2.0.0:
+    resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==}
+    engines: {node: '>=10'}
+    deprecated: This package is no longer supported.
+
+  arg@4.1.3:
+    resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+
+  arg@5.0.2:
+    resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+
+  argparse@1.0.10:
+    resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
+  argparse@2.0.1:
+    resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+  aria-query@5.3.0:
+    resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+
+  aria-query@5.3.2:
+    resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+    engines: {node: '>= 0.4'}
+
+  array-buffer-byte-length@1.0.2:
+    resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+    engines: {node: '>= 0.4'}
+
+  array-includes@3.1.8:
+    resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
+    engines: {node: '>= 0.4'}
+
+  array.prototype.findlast@1.2.5:
+    resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
+    engines: {node: '>= 0.4'}
+
+  array.prototype.findlastindex@1.2.6:
+    resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==}
+    engines: {node: '>= 0.4'}
+
+  array.prototype.flat@1.3.3:
+    resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
+    engines: {node: '>= 0.4'}
+
+  array.prototype.flatmap@1.3.3:
+    resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
+    engines: {node: '>= 0.4'}
+
+  array.prototype.tosorted@1.1.4:
+    resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
+    engines: {node: '>= 0.4'}
+
+  arraybuffer.prototype.slice@1.0.4:
+    resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+    engines: {node: '>= 0.4'}
+
+  asn1.js@4.10.1:
+    resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==}
+
+  assert@2.1.0:
+    resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==}
+
+  assertion-error@2.0.1:
+    resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+    engines: {node: '>=12'}
+
+  ast-types-flow@0.0.8:
+    resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
+
+  ast-types@0.16.1:
+    resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==}
+    engines: {node: '>=4'}
+
+  astring@1.9.0:
+    resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
+    hasBin: true
+
+  async-function@1.0.0:
+    resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
+    engines: {node: '>= 0.4'}
+
+  async@3.2.6:
+    resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+
+  autoprefixer@10.4.21:
+    resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==}
+    engines: {node: ^10 || ^12 || >=14}
+    hasBin: true
+    peerDependencies:
+      postcss: ^8.1.0
+
+  available-typed-arrays@1.0.7:
+    resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+    engines: {node: '>= 0.4'}
+
+  axe-core@4.10.3:
+    resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==}
+    engines: {node: '>=4'}
+
+  axobject-query@4.1.0:
+    resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+    engines: {node: '>= 0.4'}
+
+  babel-jest@29.7.0:
+    resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      '@babel/core': ^7.8.0
+
+  babel-loader@9.2.1:
+    resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==}
+    engines: {node: '>= 14.15.0'}
+    peerDependencies:
+      '@babel/core': ^7.12.0
+      webpack: '>=5'
+
+  babel-plugin-istanbul@6.1.1:
+    resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
+    engines: {node: '>=8'}
+
+  babel-plugin-jest-hoist@29.6.3:
+    resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  babel-plugin-polyfill-corejs2@0.4.13:
+    resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==}
+    peerDependencies:
+      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+  babel-plugin-polyfill-corejs3@0.11.1:
+    resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==}
+    peerDependencies:
+      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+  babel-plugin-polyfill-regenerator@0.6.4:
+    resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==}
+    peerDependencies:
+      '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+  babel-preset-current-node-syntax@1.1.0:
+    resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  babel-preset-jest@29.6.3:
+    resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  bail@2.0.2:
+    resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
+  balanced-match@1.0.2:
+    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+  base64-js@1.5.1:
+    resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+  before-after-hook@3.0.2:
+    resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==}
+
+  better-opn@3.0.2:
+    resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==}
+    engines: {node: '>=12.0.0'}
+
+  big.js@5.2.2:
+    resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+
+  binary-extensions@2.3.0:
+    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+    engines: {node: '>=8'}
+
+  bing-translate-api@4.0.2:
+    resolution: {integrity: sha512-JJ8XUehnxzOhHU91oy86xEtp8OOMjVEjCZJX042fKxoO19NNvxJ5omeCcxQNFoPbDqVpBJwqiGVquL0oPdQm1Q==}
+
+  birecord@0.1.1:
+    resolution: {integrity: sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==}
+
+  bn.js@4.12.1:
+    resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==}
+
+  bn.js@5.2.1:
+    resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==}
+
+  boolbase@1.0.0:
+    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+  brace-expansion@1.1.11:
+    resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+  brace-expansion@2.0.1:
+    resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+  braces@3.0.3:
+    resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+    engines: {node: '>=8'}
+
+  brorand@1.1.0:
+    resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==}
+
+  browser-assert@1.2.1:
+    resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==}
+
+  browserify-aes@1.2.0:
+    resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==}
+
+  browserify-cipher@1.0.1:
+    resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==}
+
+  browserify-des@1.0.2:
+    resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==}
+
+  browserify-rsa@4.1.1:
+    resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==}
+    engines: {node: '>= 0.10'}
+
+  browserify-sign@4.2.3:
+    resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==}
+    engines: {node: '>= 0.12'}
+
+  browserify-zlib@0.2.0:
+    resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==}
+
+  browserslist@4.24.4:
+    resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
+    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+    hasBin: true
+
+  bser@2.1.1:
+    resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+
+  buffer-from@1.1.2:
+    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+  buffer-xor@1.0.3:
+    resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==}
+
+  buffer@6.0.3:
+    resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
+  builtin-modules@3.3.0:
+    resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
+    engines: {node: '>=6'}
+
+  builtin-modules@5.0.0:
+    resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==}
+    engines: {node: '>=18.20'}
+
+  builtin-status-codes@3.0.0:
+    resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==}
+
+  busboy@1.6.0:
+    resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
+    engines: {node: '>=10.16.0'}
+
+  bytes@3.1.2:
+    resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+    engines: {node: '>= 0.8'}
+
+  cac@6.7.14:
+    resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+    engines: {node: '>=8'}
+
+  cacheable-lookup@5.0.4:
+    resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==}
+    engines: {node: '>=10.6.0'}
+
+  cacheable-request@7.0.4:
+    resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==}
+    engines: {node: '>=8'}
+
+  call-bind-apply-helpers@1.0.2:
+    resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+    engines: {node: '>= 0.4'}
+
+  call-bind@1.0.8:
+    resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+    engines: {node: '>= 0.4'}
+
+  call-bound@1.0.4:
+    resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+    engines: {node: '>= 0.4'}
+
+  callsites@3.1.0:
+    resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+    engines: {node: '>=6'}
+
+  camel-case@4.1.2:
+    resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
+
+  camelcase-css@2.0.1:
+    resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
+    engines: {node: '>= 6'}
+
+  camelcase@5.3.1:
+    resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+    engines: {node: '>=6'}
+
+  camelcase@6.3.0:
+    resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+    engines: {node: '>=10'}
+
+  caniuse-lite@1.0.30001713:
+    resolution: {integrity: sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==}
+
+  canvas@2.11.2:
+    resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==}
+    engines: {node: '>=6'}
+
+  case-sensitive-paths-webpack-plugin@2.4.0:
+    resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==}
+    engines: {node: '>=4'}
+
+  ccount@2.0.1:
+    resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
+  chai@5.2.0:
+    resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==}
+    engines: {node: '>=12'}
+
+  chalk@3.0.0:
+    resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
+    engines: {node: '>=8'}
+
+  chalk@4.1.1:
+    resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==}
+    engines: {node: '>=10'}
+
+  chalk@4.1.2:
+    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+    engines: {node: '>=10'}
+
+  chalk@5.4.1:
+    resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
+    engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+  char-regex@1.0.2:
+    resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
+    engines: {node: '>=10'}
+
+  character-entities-html4@2.1.0:
+    resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+
+  character-entities-legacy@1.1.4:
+    resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==}
+
+  character-entities-legacy@3.0.0:
+    resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+
+  character-entities@1.2.4:
+    resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==}
+
+  character-entities@2.0.2:
+    resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
+  character-reference-invalid@1.1.4:
+    resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==}
+
+  character-reference-invalid@2.0.1:
+    resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
+
+  check-error@2.1.1:
+    resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
+    engines: {node: '>= 16'}
+
+  chevrotain-allstar@0.3.1:
+    resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==}
+    peerDependencies:
+      chevrotain: ^11.0.0
+
+  chevrotain@11.0.3:
+    resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==}
+
+  chokidar@3.6.0:
+    resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+    engines: {node: '>= 8.10.0'}
+
+  chokidar@4.0.3:
+    resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+    engines: {node: '>= 14.16.0'}
+
+  chownr@2.0.0:
+    resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
+    engines: {node: '>=10'}
+
+  chromatic@11.28.0:
+    resolution: {integrity: sha512-Xy3907MXY5UP7LoMksmsT02xCUsoLZpcC6sRITjd+KiXBteOxPF7J+QsFqy/VzQCEN6fpt/R2bOIpE+PwPfcZA==}
+    hasBin: true
+    peerDependencies:
+      '@chromatic-com/cypress': ^0.*.* || ^1.0.0
+      '@chromatic-com/playwright': ^0.*.* || ^1.0.0
+    peerDependenciesMeta:
+      '@chromatic-com/cypress':
+        optional: true
+      '@chromatic-com/playwright':
+        optional: true
+
+  chrome-trace-event@1.0.4:
+    resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
+    engines: {node: '>=6.0'}
+
+  ci-info@3.9.0:
+    resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+    engines: {node: '>=8'}
+
+  ci-info@4.2.0:
+    resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==}
+    engines: {node: '>=8'}
+
+  cipher-base@1.0.6:
+    resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==}
+    engines: {node: '>= 0.10'}
+
+  cjs-module-lexer@1.4.3:
+    resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==}
+
+  class-variance-authority@0.7.1:
+    resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
+
+  classcat@5.0.5:
+    resolution: {integrity: sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==}
+
+  classnames@2.3.1:
+    resolution: {integrity: sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==}
+
+  classnames@2.5.1:
+    resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
+
+  clean-css@5.3.3:
+    resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==}
+    engines: {node: '>= 10.0'}
+
+  clean-regexp@1.0.0:
+    resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
+    engines: {node: '>=4'}
+
+  cli-cursor@5.0.0:
+    resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
+    engines: {node: '>=18'}
+
+  cli-truncate@4.0.0:
+    resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
+    engines: {node: '>=18'}
+
+  client-only@0.0.1:
+    resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+
+  cliui@8.0.1:
+    resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+    engines: {node: '>=12'}
+
+  clone-response@1.0.3:
+    resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
+
+  clsx@1.2.1:
+    resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==}
+    engines: {node: '>=6'}
+
+  clsx@2.1.1:
+    resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+    engines: {node: '>=6'}
+
+  co@4.6.0:
+    resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
+    engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+
+  code-inspector-core@0.18.3:
+    resolution: {integrity: sha512-60pT2cPoguMTUYdN1MMpjoPUnuF0ud/u7M2y+Vqit/bniLEit9dySEWAVxLU/Ukc5ILrDeLKEttc6fCMl9RUrA==}
+
+  code-inspector-plugin@0.18.3:
+    resolution: {integrity: sha512-d9oJXZUsnvfTaQDwFmDNA2F+AR/TXIxWg1rr8KGcEskltR2prbZsfuu1z70EAn4khpx0smfi/PvIIwNJQ7FAMw==}
+
+  collapse-white-space@2.1.0:
+    resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
+
+  collect-v8-coverage@1.0.2:
+    resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==}
+
+  color-convert@2.0.1:
+    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+    engines: {node: '>=7.0.0'}
+
+  color-name@1.1.4:
+    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+  color-string@1.9.1:
+    resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+
+  color-support@1.1.3:
+    resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==}
+    hasBin: true
+
+  color@4.2.3:
+    resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
+    engines: {node: '>=12.5.0'}
+
+  colorette@2.0.20:
+    resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+
+  comma-separated-tokens@1.0.8:
+    resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==}
+
+  comma-separated-tokens@2.0.3:
+    resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
+  commander@13.1.0:
+    resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==}
+    engines: {node: '>=18'}
+
+  commander@2.20.3:
+    resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+  commander@4.1.1:
+    resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+    engines: {node: '>= 6'}
+
+  commander@7.2.0:
+    resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+    engines: {node: '>= 10'}
+
+  commander@8.3.0:
+    resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
+    engines: {node: '>= 12'}
+
+  comment-parser@1.4.1:
+    resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==}
+    engines: {node: '>= 12.0.0'}
+
+  common-path-prefix@3.0.0:
+    resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==}
+
+  commondir@1.0.1:
+    resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
+
+  compare-versions@6.1.1:
+    resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==}
+
+  concat-map@0.0.1:
+    resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+  confbox@0.1.8:
+    resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+  confbox@0.2.2:
+    resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
+
+  console-browserify@1.2.0:
+    resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==}
+
+  console-control-strings@1.1.0:
+    resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
+
+  constants-browserify@1.0.0:
+    resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==}
+
+  convert-source-map@1.9.0:
+    resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+
+  convert-source-map@2.0.0:
+    resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+  copy-to-clipboard@3.3.3:
+    resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
+
+  core-js-compat@3.41.0:
+    resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==}
+
+  core-js-pure@3.41.0:
+    resolution: {integrity: sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==}
+
+  core-util-is@1.0.3:
+    resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+  cose-base@1.0.3:
+    resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==}
+
+  cose-base@2.2.0:
+    resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==}
+
+  cosmiconfig@7.1.0:
+    resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
+    engines: {node: '>=10'}
+
+  cosmiconfig@9.0.0:
+    resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      typescript: '>=4.9.5'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  create-ecdh@4.0.4:
+    resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==}
+
+  create-hash@1.2.0:
+    resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
+
+  create-hmac@1.1.7:
+    resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==}
+
+  create-jest@29.7.0:
+    resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    hasBin: true
+
+  create-require@1.1.1:
+    resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+
+  cross-env@7.0.3:
+    resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
+    engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
+    hasBin: true
+
+  cross-spawn@7.0.6:
+    resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+    engines: {node: '>= 8'}
+
+  crypto-browserify@3.12.1:
+    resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==}
+    engines: {node: '>= 0.10'}
+
+  crypto-js@4.2.0:
+    resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
+
+  css-loader@6.11.0:
+    resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==}
+    engines: {node: '>= 12.13.0'}
+    peerDependencies:
+      '@rspack/core': 0.x || 1.x
+      webpack: ^5.0.0
+    peerDependenciesMeta:
+      '@rspack/core':
+        optional: true
+      webpack:
+        optional: true
+
+  css-select@4.3.0:
+    resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
+
+  css-what@6.1.0:
+    resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+    engines: {node: '>= 6'}
+
+  css.escape@1.5.1:
+    resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
+
+  cssesc@3.0.0:
+    resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  csstype@3.1.3:
+    resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+  cytoscape-cose-bilkent@4.1.0:
+    resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==}
+    peerDependencies:
+      cytoscape: ^3.2.0
+
+  cytoscape-fcose@2.2.0:
+    resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==}
+    peerDependencies:
+      cytoscape: ^3.2.0
+
+  cytoscape@3.31.2:
+    resolution: {integrity: sha512-/eOXg2uGdMdpGlEes5Sf6zE+jUG+05f3htFNQIxLxduOH/SsaUZiPBfAwP1btVIVzsnhiNOdi+hvDRLYfMZjGw==}
+    engines: {node: '>=0.10'}
+
+  d3-array@2.12.1:
+    resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==}
+
+  d3-array@3.2.4:
+    resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
+    engines: {node: '>=12'}
+
+  d3-axis@3.0.0:
+    resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==}
+    engines: {node: '>=12'}
+
+  d3-brush@3.0.0:
+    resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==}
+    engines: {node: '>=12'}
+
+  d3-chord@3.0.1:
+    resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==}
+    engines: {node: '>=12'}
+
+  d3-color@3.1.0:
+    resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
+    engines: {node: '>=12'}
+
+  d3-contour@4.0.2:
+    resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==}
+    engines: {node: '>=12'}
+
+  d3-delaunay@6.0.4:
+    resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==}
+    engines: {node: '>=12'}
+
+  d3-dispatch@3.0.1:
+    resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
+    engines: {node: '>=12'}
+
+  d3-drag@3.0.0:
+    resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==}
+    engines: {node: '>=12'}
+
+  d3-dsv@3.0.1:
+    resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==}
+    engines: {node: '>=12'}
+    hasBin: true
+
+  d3-ease@3.0.1:
+    resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
+    engines: {node: '>=12'}
+
+  d3-fetch@3.0.1:
+    resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==}
+    engines: {node: '>=12'}
+
+  d3-force@3.0.0:
+    resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==}
+    engines: {node: '>=12'}
+
+  d3-format@3.1.0:
+    resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
+    engines: {node: '>=12'}
+
+  d3-geo@3.1.1:
+    resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==}
+    engines: {node: '>=12'}
+
+  d3-hierarchy@3.1.2:
+    resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
+    engines: {node: '>=12'}
+
+  d3-interpolate@3.0.1:
+    resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
+    engines: {node: '>=12'}
+
+  d3-path@1.0.9:
+    resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==}
+
+  d3-path@3.1.0:
+    resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
+    engines: {node: '>=12'}
+
+  d3-polygon@3.0.1:
+    resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==}
+    engines: {node: '>=12'}
+
+  d3-quadtree@3.0.1:
+    resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==}
+    engines: {node: '>=12'}
+
+  d3-random@3.0.1:
+    resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==}
+    engines: {node: '>=12'}
+
+  d3-sankey@0.12.3:
+    resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==}
+
+  d3-scale-chromatic@3.1.0:
+    resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==}
+    engines: {node: '>=12'}
+
+  d3-scale@4.0.2:
+    resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
+    engines: {node: '>=12'}
+
+  d3-selection@3.0.0:
+    resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==}
+    engines: {node: '>=12'}
+
+  d3-shape@1.3.7:
+    resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==}
+
+  d3-shape@3.2.0:
+    resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
+    engines: {node: '>=12'}
+
+  d3-time-format@4.1.0:
+    resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
+    engines: {node: '>=12'}
+
+  d3-time@3.1.0:
+    resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
+    engines: {node: '>=12'}
+
+  d3-timer@3.0.1:
+    resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
+    engines: {node: '>=12'}
+
+  d3-transition@3.0.1:
+    resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      d3-selection: 2 - 3
+
+  d3-zoom@3.0.0:
+    resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
+    engines: {node: '>=12'}
+
+  d3@7.9.0:
+    resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==}
+    engines: {node: '>=12'}
+
+  dagre-d3-es@7.0.11:
+    resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==}
+
+  damerau-levenshtein@1.0.8:
+    resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+
+  data-view-buffer@1.0.2:
+    resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+    engines: {node: '>= 0.4'}
+
+  data-view-byte-length@1.0.2:
+    resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+    engines: {node: '>= 0.4'}
+
+  data-view-byte-offset@1.0.1:
+    resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+    engines: {node: '>= 0.4'}
+
+  dayjs@1.11.13:
+    resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
+  debug@3.2.7:
+    resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  debug@4.4.0:
+    resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  decimal.js@10.5.0:
+    resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==}
+
+  decode-formdata@0.9.0:
+    resolution: {integrity: sha512-q5uwOjR3Um5YD+ZWPOF/1sGHVW9A5rCrRwITQChRXlmPkxDFBqCm4jNTIVdGHNH9OnR+V9MoZVgRhsFb+ARbUw==}
+
+  decode-named-character-reference@1.1.0:
+    resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==}
+
+  decompress-response@4.2.1:
+    resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==}
+    engines: {node: '>=8'}
+
+  decompress-response@6.0.0:
+    resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
+    engines: {node: '>=10'}
+
+  dedent@0.7.0:
+    resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
+
+  dedent@1.5.3:
+    resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==}
+    peerDependencies:
+      babel-plugin-macros: ^3.1.0
+    peerDependenciesMeta:
+      babel-plugin-macros:
+        optional: true
+
+  deep-eql@5.0.2:
+    resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
+    engines: {node: '>=6'}
+
+  deep-is@0.1.4:
+    resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+  deepmerge@4.3.1:
+    resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+    engines: {node: '>=0.10.0'}
+
+  defer-to-connect@2.0.1:
+    resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
+    engines: {node: '>=10'}
+
+  define-data-property@1.1.4:
+    resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+    engines: {node: '>= 0.4'}
+
+  define-lazy-prop@2.0.0:
+    resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+    engines: {node: '>=8'}
+
+  define-properties@1.2.1:
+    resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+    engines: {node: '>= 0.4'}
+
+  delaunator@5.0.1:
+    resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==}
+
+  delegates@1.0.0:
+    resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
+
+  dequal@2.0.3:
+    resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+    engines: {node: '>=6'}
+
+  des.js@1.1.0:
+    resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==}
+
+  detect-libc@1.0.3:
+    resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
+    engines: {node: '>=0.10'}
+    hasBin: true
+
+  detect-libc@2.0.3:
+    resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
+    engines: {node: '>=8'}
+
+  detect-newline@3.1.0:
+    resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
+    engines: {node: '>=8'}
+
+  devalue@5.1.1:
+    resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==}
+
+  devlop@1.1.0:
+    resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
+  didyoumean@1.2.2:
+    resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+
+  diff-sequences@29.6.3:
+    resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  diff@4.0.2:
+    resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+    engines: {node: '>=0.3.1'}
+
+  diffie-hellman@5.0.3:
+    resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==}
+
+  dlv@1.1.3:
+    resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+
+  doctrine@2.1.0:
+    resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+    engines: {node: '>=0.10.0'}
+
+  doctrine@3.0.0:
+    resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+    engines: {node: '>=6.0.0'}
+
+  dom-accessibility-api@0.5.16:
+    resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
+
+  dom-accessibility-api@0.6.3:
+    resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
+
+  dom-converter@0.2.0:
+    resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==}
+
+  dom-serializer@1.4.1:
+    resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
+
+  domain-browser@4.23.0:
+    resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==}
+    engines: {node: '>=10'}
+
+  domelementtype@2.3.0:
+    resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+  domhandler@4.3.1:
+    resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
+    engines: {node: '>= 4'}
+
+  dompurify@3.2.5:
+    resolution: {integrity: sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ==}
+
+  domutils@2.8.0:
+    resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
+
+  dot-case@3.0.4:
+    resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
+  dotenv@16.5.0:
+    resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==}
+    engines: {node: '>=12'}
+
+  dunder-proto@1.0.1:
+    resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+    engines: {node: '>= 0.4'}
+
+  echarts-for-react@3.0.2:
+    resolution: {integrity: sha512-DRwIiTzx8JfwPOVgGttDytBqdp5VzCSyMRIxubgU/g2n9y3VLUmF2FK7Icmg/sNVkv4+rktmrLN9w22U2yy3fA==}
+    peerDependencies:
+      echarts: ^3.0.0 || ^4.0.0 || ^5.0.0
+      react: ^15.0.0 || >=16.0.0
+
+  echarts@5.6.0:
+    resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==}
+
+  electron-to-chromium@1.5.136:
+    resolution: {integrity: sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ==}
+
+  elkjs@0.9.3:
+    resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==}
+
+  elliptic@6.6.1:
+    resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==}
+
+  emittery@0.13.1:
+    resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
+    engines: {node: '>=12'}
+
+  emoji-mart@5.6.0:
+    resolution: {integrity: sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==}
+
+  emoji-regex@8.0.0:
+    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+  emoji-regex@9.2.2:
+    resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+  emojis-list@3.0.0:
+    resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
+    engines: {node: '>= 4'}
+
+  end-of-stream@1.4.4:
+    resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+
+  endent@2.1.0:
+    resolution: {integrity: sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==}
+
+  enhanced-resolve@5.18.1:
+    resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
+    engines: {node: '>=10.13.0'}
+
+  entities@2.2.0:
+    resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
+
+  entities@4.5.0:
+    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+    engines: {node: '>=0.12'}
+
+  env-paths@2.2.1:
+    resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+    engines: {node: '>=6'}
+
+  environment@1.1.0:
+    resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
+    engines: {node: '>=18'}
+
+  error-ex@1.3.2:
+    resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+
+  error-stack-parser@2.1.4:
+    resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==}
+
+  es-abstract@1.23.9:
+    resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==}
+    engines: {node: '>= 0.4'}
+
+  es-define-property@1.0.1:
+    resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+    engines: {node: '>= 0.4'}
+
+  es-errors@1.3.0:
+    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+    engines: {node: '>= 0.4'}
+
+  es-iterator-helpers@1.2.1:
+    resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==}
+    engines: {node: '>= 0.4'}
+
+  es-module-lexer@1.6.0:
+    resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
+
+  es-object-atoms@1.1.1:
+    resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+    engines: {node: '>= 0.4'}
+
+  es-set-tostringtag@2.1.0:
+    resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+    engines: {node: '>= 0.4'}
+
+  es-shim-unscopables@1.1.0:
+    resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==}
+    engines: {node: '>= 0.4'}
+
+  es-to-primitive@1.3.0:
+    resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+    engines: {node: '>= 0.4'}
+
+  esast-util-from-estree@2.0.0:
+    resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
+
+  esast-util-from-js@2.0.1:
+    resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==}
+
+  esbuild-code-inspector-plugin@0.18.3:
+    resolution: {integrity: sha512-FaPt5eFMtW1oXMWqAcqfAJByNagP1V/R9dwDDLQO29JmryMF35+frskTqy+G53whmTaVi19+TCrFqhNbMZH5ZQ==}
+
+  esbuild-register@3.6.0:
+    resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==}
+    peerDependencies:
+      esbuild: 0.25.0
+
+  esbuild@0.25.0:
+    resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==}
+    engines: {node: '>=18'}
+    hasBin: true
+
+  esbuild@0.25.2:
+    resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==}
+    engines: {node: '>=18'}
+    hasBin: true
+
+  escalade@3.2.0:
+    resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+    engines: {node: '>=6'}
+
+  escape-string-regexp@1.0.5:
+    resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+    engines: {node: '>=0.8.0'}
+
+  escape-string-regexp@2.0.0:
+    resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
+    engines: {node: '>=8'}
+
+  escape-string-regexp@4.0.0:
+    resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+    engines: {node: '>=10'}
+
+  escape-string-regexp@5.0.0:
+    resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+    engines: {node: '>=12'}
+
+  eslint-compat-utils@0.5.1:
+    resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      eslint: '>=6.0.0'
+
+  eslint-compat-utils@0.6.5:
+    resolution: {integrity: sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      eslint: '>=6.0.0'
+
+  eslint-config-flat-gitignore@2.1.0:
+    resolution: {integrity: sha512-cJzNJ7L+psWp5mXM7jBX+fjHtBvvh06RBlcweMhKD8jWqQw0G78hOW5tpVALGHGFPsBV+ot2H+pdDGJy6CV8pA==}
+    peerDependencies:
+      eslint: ^9.5.0
+
+  eslint-config-next@15.3.0:
+    resolution: {integrity: sha512-+Z3M1W9MnJjX3W4vI9CHfKlEyhTWOUHvc5dB89FyRnzPsUkJlLWZOi8+1pInuVcSztSM4MwBFB0hIHf4Rbwu4g==}
+    peerDependencies:
+      eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
+      typescript: '>=3.3.1'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  eslint-flat-config-utils@2.0.1:
+    resolution: {integrity: sha512-brf0eAgQ6JlKj3bKfOTuuI7VcCZvi8ZCD1MMTVoEvS/d38j8cByZViLFALH/36+eqB17ukmfmKq3bWzGvizejA==}
+
+  eslint-import-resolver-node@0.3.9:
+    resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+
+  eslint-import-resolver-typescript@3.10.0:
+    resolution: {integrity: sha512-aV3/dVsT0/H9BtpNwbaqvl+0xGMRGzncLyhm793NFGvbwGGvzyAykqWZ8oZlZuGwuHkwJjhWJkG1cM3ynvd2pQ==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '*'
+      eslint-plugin-import: '*'
+      eslint-plugin-import-x: '*'
+    peerDependenciesMeta:
+      eslint-plugin-import:
+        optional: true
+      eslint-plugin-import-x:
+        optional: true
+
+  eslint-json-compat-utils@0.2.1:
+    resolution: {integrity: sha512-YzEodbDyW8DX8bImKhAcCeu/L31Dd/70Bidx2Qex9OFUtgzXLqtfWL4Hr5fM/aCCB8QUZLuJur0S9k6UfgFkfg==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      '@eslint/json': '*'
+      eslint: '*'
+      jsonc-eslint-parser: ^2.4.0
+    peerDependenciesMeta:
+      '@eslint/json':
+        optional: true
+
+  eslint-merge-processors@2.0.0:
+    resolution: {integrity: sha512-sUuhSf3IrJdGooquEUB5TNpGNpBoQccbnaLHsb1XkBLUPPqCNivCpY05ZcpCOiV9uHwO2yxXEWVczVclzMxYlA==}
+    peerDependencies:
+      eslint: '*'
+
+  eslint-module-utils@2.12.0:
+    resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      '@typescript-eslint/parser': '*'
+      eslint: '*'
+      eslint-import-resolver-node: '*'
+      eslint-import-resolver-typescript: '*'
+      eslint-import-resolver-webpack: '*'
+    peerDependenciesMeta:
+      '@typescript-eslint/parser':
+        optional: true
+      eslint:
+        optional: true
+      eslint-import-resolver-node:
+        optional: true
+      eslint-import-resolver-typescript:
+        optional: true
+      eslint-import-resolver-webpack:
+        optional: true
+
+  eslint-plugin-antfu@3.1.1:
+    resolution: {integrity: sha512-7Q+NhwLfHJFvopI2HBZbSxWXngTwBLKxW1AGXLr2lEGxcEIK/AsDs8pn8fvIizl5aZjBbVbVK5ujmMpBe4Tvdg==}
+    peerDependencies:
+      eslint: '*'
+
+  eslint-plugin-command@3.2.0:
+    resolution: {integrity: sha512-PSDOB9k7Wd57pp4HD/l3C1D93pKX8/wQo0kWDI4q6/UpgrfMTyNsavklipgiZqbXl1+VBABY1buCcQE5LDpg5g==}
+    peerDependencies:
+      eslint: '*'
+
+  eslint-plugin-es-x@7.8.0:
+    resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '>=8'
+
+  eslint-plugin-import-x@4.10.2:
+    resolution: {integrity: sha512-jO3Y6+zBUyTX5MVbbLSzoz6fe65t+WEBaXStRLM4EBhZWbuSwAH3cLwARtM0Yp4zRtZGp9sL2zzK7G9JkHR8LA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+
+  eslint-plugin-import@2.31.0:
+    resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      '@typescript-eslint/parser': '*'
+      eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
+    peerDependenciesMeta:
+      '@typescript-eslint/parser':
+        optional: true
+
+  eslint-plugin-jsdoc@50.6.9:
+    resolution: {integrity: sha512-7/nHu3FWD4QRG8tCVqcv+BfFtctUtEDWc29oeDXB4bwmDM2/r1ndl14AG/2DUntdqH7qmpvdemJKwb3R97/QEw==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
+
+  eslint-plugin-jsonc@2.20.0:
+    resolution: {integrity: sha512-FRgCn9Hzk5eKboCbVMrr9QrhM0eO4G+WKH8IFXoaeqhM/2kuWzbStJn4kkr0VWL8J5H8RYZF+Aoam1vlBaZVkw==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '>=6.0.0'
+
+  eslint-plugin-jsx-a11y@6.10.2:
+    resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
+
+  eslint-plugin-n@17.17.0:
+    resolution: {integrity: sha512-2VvPK7Mo73z1rDFb6pTvkH6kFibAmnTubFq5l83vePxu0WiY1s0LOtj2WHb6Sa40R3w4mnh8GFYbHBQyMlotKw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: '>=8.23.0'
+
+  eslint-plugin-no-only-tests@3.3.0:
+    resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==}
+    engines: {node: '>=5.0.0'}
+
+  eslint-plugin-perfectionist@4.11.0:
+    resolution: {integrity: sha512-5s+ehXydnLPQpLDj5mJ0CnYj2fQe6v6gKA3tS+FZVBLzwMOh8skH+l+1Gni08rG0SdEcNhJyjQp/mEkDYK8czw==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    peerDependencies:
+      eslint: '>=8.45.0'
+
+  eslint-plugin-pnpm@0.3.1:
+    resolution: {integrity: sha512-vi5iHoELIAlBbX4AW8ZGzU3tUnfxuXhC/NKo3qRcI5o9igbz6zJUqSlQ03bPeMqWIGTPatZnbWsNR1RnlNERNQ==}
+    peerDependencies:
+      eslint: ^9.0.0
+
+  eslint-plugin-react-debug@1.45.0:
+    resolution: {integrity: sha512-mHDc3lPjHmqsD5WhUD5hAbGiNaJ1WqjB8+1zkJzLLBUWoG7t1+qhJnyWX6e9g5kwjGnRzxevywf5jN+/OPpSNg==}
+    engines: {bun: '>=1.0.15', node: '>=18.18.0'}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: ^4.9.5 || ^5.3.3
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  eslint-plugin-react-dom@1.45.0:
+    resolution: {integrity: sha512-4EHuXVymURWLNEKbGc79iJb5lI3lUOlPt1R0E7VlJdi7WLNXHYwUoTHt3+3v6Ejo2K5PYUNy3QHQyQ5c3TeixA==}
+    engines: {bun: '>=1.0.15', node: '>=18.18.0'}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: ^4.9.5 || ^5.3.3
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  eslint-plugin-react-hooks-extra@1.45.0:
+    resolution: {integrity: sha512-2vnd1O+OMQJlLyOhHQhC6joj6qCmv4qsdWJ2KDluH13nhYpU5qdTrgELQB2LdJPAmxvjRmttyLwNtXyttvvFZA==}
+    engines: {bun: '>=1.0.15', node: '>=18.18.0'}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: ^4.9.5 || ^5.3.3
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  eslint-plugin-react-hooks@5.2.0:
+    resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==}
+    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
+
+  eslint-plugin-react-naming-convention@1.45.0:
+    resolution: {integrity: sha512-HXpBRWUZzUdWBAV1Zs2C5536GO2iT8vVrqlFw5YuHxdzhbeCmJ5/r/toCcVcyIBVA3m6V/NW7qOfMa2OzKW8HA==}
+    engines: {bun: '>=1.0.15', node: '>=18.18.0'}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: ^4.9.5 || ^5.3.3
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  eslint-plugin-react-refresh@0.4.19:
+    resolution: {integrity: sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==}
+    peerDependencies:
+      eslint: '>=8.40'
+
+  eslint-plugin-react-web-api@1.45.0:
+    resolution: {integrity: sha512-DJExa0sjB7WfNC6t2xph3mQi3pFt05YoCD4J0/XkZHuNaUscLEXRo9fq3RbP/99h98PS21Q5xSEw3qtFs/BBFw==}
+    engines: {bun: '>=1.0.15', node: '>=18.18.0'}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: ^4.9.5 || ^5.3.3
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  eslint-plugin-react-x@1.45.0:
+    resolution: {integrity: sha512-pzt3zoNk5+y5ZKH0BaE1ntISu/S1ir4PJAEwSbqvkd6BJNy+4lbVMynhlMvsX5gllrhi0kt/FBl/zvtZrVBXaw==}
+    engines: {bun: '>=1.0.15', node: '>=18.18.0'}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      ts-api-utils: ^2.1.0
+      typescript: ^4.9.5 || ^5.3.3
+    peerDependenciesMeta:
+      ts-api-utils:
+        optional: true
+      typescript:
+        optional: true
+
+  eslint-plugin-react@7.37.5:
+    resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
+
+  eslint-plugin-regexp@2.7.0:
+    resolution: {integrity: sha512-U8oZI77SBtH8U3ulZ05iu0qEzIizyEDXd+BWHvyVxTOjGwcDcvy/kEpgFG4DYca2ByRLiVPFZ2GeH7j1pdvZTA==}
+    engines: {node: ^18 || >=20}
+    peerDependencies:
+      eslint: '>=8.44.0'
+
+  eslint-plugin-sonarjs@3.0.2:
+    resolution: {integrity: sha512-LxjbfwI7ypENeTmGyKmDyNux3COSkMi7H/6Cal5StSLQ6edf0naP45SZR43OclaNR7WfhVTZdhOn63q3/Y6puQ==}
+    peerDependencies:
+      eslint: ^8.0.0 || ^9.0.0
+
+  eslint-plugin-storybook@0.11.6:
+    resolution: {integrity: sha512-3WodYD6Bs9ACqnB+TP2TuLh774c/nacAjxSKOP9bHJ2c8rf+nrhocxjjeAWNmO9IPkFIzTKlcl0vNXI2yYpVOw==}
+    engines: {node: '>= 18'}
+    peerDependencies:
+      eslint: '>=8'
+
+  eslint-plugin-tailwindcss@3.18.0:
+    resolution: {integrity: sha512-PQDU4ZMzFH0eb2DrfHPpbgo87Zgg2EXSMOj1NSfzdZm+aJzpuwGerfowMIaVehSREEa0idbf/eoNYAOHSJoDAQ==}
+    engines: {node: '>=18.12.0'}
+    peerDependencies:
+      tailwindcss: ^3.4.0
+
+  eslint-plugin-toml@0.12.0:
+    resolution: {integrity: sha512-+/wVObA9DVhwZB1nG83D2OAQRrcQZXy+drqUnFJKymqnmbnbfg/UPmEMCKrJNcEboUGxUjYrJlgy+/Y930mURQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '>=6.0.0'
+
+  eslint-plugin-unicorn@58.0.0:
+    resolution: {integrity: sha512-fc3iaxCm9chBWOHPVjn+Czb/wHS0D2Mko7wkOdobqo9R2bbFObc4LyZaLTNy0mhZOP84nKkLhTUQxlLOZ7EjKw==}
+    engines: {node: ^18.20.0 || ^20.10.0 || >=21.0.0}
+    peerDependencies:
+      eslint: '>=9.22.0'
+
+  eslint-plugin-unused-imports@4.1.4:
+    resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==}
+    peerDependencies:
+      '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0
+      eslint: ^9.0.0 || ^8.0.0
+    peerDependenciesMeta:
+      '@typescript-eslint/eslint-plugin':
+        optional: true
+
+  eslint-plugin-vue@10.0.0:
+    resolution: {integrity: sha512-XKckedtajqwmaX6u1VnECmZ6xJt+YvlmMzBPZd+/sI3ub2lpYZyFnsyWo7c3nMOQKJQudeyk1lw/JxdgeKT64w==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      vue-eslint-parser: ^10.0.0
+
+  eslint-plugin-yml@1.17.0:
+    resolution: {integrity: sha512-Q3LXFRnNpGYAK/PM0BY1Xs0IY1xTLfM0kC986nNQkx1l8tOGz+YS50N6wXkAJkrBpeUN9OxEMB7QJ+9MTDAqIQ==}
+    engines: {node: ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '>=6.0.0'
+
+  eslint-processor-vue-blocks@2.0.0:
+    resolution: {integrity: sha512-u4W0CJwGoWY3bjXAuFpc/b6eK3NQEI8MoeW7ritKj3G3z/WtHrKjkqf+wk8mPEy5rlMGS+k6AZYOw2XBoN/02Q==}
+    peerDependencies:
+      '@vue/compiler-sfc': ^3.3.0
+      eslint: '>=9.0.0'
+
+  eslint-scope@5.1.1:
+    resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+    engines: {node: '>=8.0.0'}
+
+  eslint-scope@8.3.0:
+    resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  eslint-visitor-keys@3.4.3:
+    resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  eslint-visitor-keys@4.2.0:
+    resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  eslint@9.24.0:
+    resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    hasBin: true
+    peerDependencies:
+      jiti: '*'
+    peerDependenciesMeta:
+      jiti:
+        optional: true
+
+  espree@10.3.0:
+    resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  espree@9.6.1:
+    resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  esprima@4.0.1:
+    resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  esquery@1.6.0:
+    resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+    engines: {node: '>=0.10'}
+
+  esrecurse@4.3.0:
+    resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+    engines: {node: '>=4.0'}
+
+  estraverse@4.3.0:
+    resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+    engines: {node: '>=4.0'}
+
+  estraverse@5.3.0:
+    resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+    engines: {node: '>=4.0'}
+
+  estree-util-attach-comments@3.0.0:
+    resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==}
+
+  estree-util-build-jsx@3.0.1:
+    resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==}
+
+  estree-util-is-identifier-name@3.0.0:
+    resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
+
+  estree-util-scope@1.0.0:
+    resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==}
+
+  estree-util-to-js@2.0.0:
+    resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==}
+
+  estree-util-visit@2.0.0:
+    resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==}
+
+  estree-walker@2.0.2:
+    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+  estree-walker@3.0.3:
+    resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+  esutils@2.0.3:
+    resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+    engines: {node: '>=0.10.0'}
+
+  event-target-shim@5.0.1:
+    resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+    engines: {node: '>=6'}
+
+  eventemitter3@5.0.1:
+    resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
+  events@3.3.0:
+    resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+    engines: {node: '>=0.8.x'}
+
+  evp_bytestokey@1.0.3:
+    resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
+
+  execa@5.1.1:
+    resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+    engines: {node: '>=10'}
+
+  execa@8.0.1:
+    resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+    engines: {node: '>=16.17'}
+
+  exit@0.1.2:
+    resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
+    engines: {node: '>= 0.8.0'}
+
+  expect-type@1.2.1:
+    resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==}
+    engines: {node: '>=12.0.0'}
+
+  expect@29.7.0:
+    resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  exsolve@1.0.4:
+    resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==}
+
+  extend@3.0.2:
+    resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+  fast-content-type-parse@2.0.1:
+    resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==}
+
+  fast-deep-equal@3.1.3:
+    resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+  fast-glob@3.3.1:
+    resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
+    engines: {node: '>=8.6.0'}
+
+  fast-glob@3.3.3:
+    resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+    engines: {node: '>=8.6.0'}
+
+  fast-json-parse@1.0.3:
+    resolution: {integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==}
+
+  fast-json-stable-stringify@2.1.0:
+    resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+  fast-levenshtein@2.0.6:
+    resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+  fast-uri@3.0.6:
+    resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==}
+
+  fastq@1.19.1:
+    resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+
+  fault@1.0.4:
+    resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==}
+
+  fb-watchman@2.0.2:
+    resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+
+  fdir@6.4.3:
+    resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==}
+    peerDependencies:
+      picomatch: ^3 || ^4
+    peerDependenciesMeta:
+      picomatch:
+        optional: true
+
+  file-entry-cache@8.0.0:
+    resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+    engines: {node: '>=16.0.0'}
+
+  filesize@10.1.6:
+    resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==}
+    engines: {node: '>= 10.4.0'}
+
+  fill-range@7.1.1:
+    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+    engines: {node: '>=8'}
+
+  filter-obj@2.0.2:
+    resolution: {integrity: sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==}
+    engines: {node: '>=8'}
+
+  find-cache-dir@3.3.2:
+    resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
+    engines: {node: '>=8'}
+
+  find-cache-dir@4.0.0:
+    resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==}
+    engines: {node: '>=14.16'}
+
+  find-up-simple@1.0.1:
+    resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==}
+    engines: {node: '>=18'}
+
+  find-up@4.1.0:
+    resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+    engines: {node: '>=8'}
+
+  find-up@5.0.0:
+    resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+    engines: {node: '>=10'}
+
+  find-up@6.3.0:
+    resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  flat-cache@3.2.0:
+    resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+
+  flat-cache@4.0.1:
+    resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+    engines: {node: '>=16'}
+
+  flatted@3.3.3:
+    resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+
+  for-each@0.3.5:
+    resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+    engines: {node: '>= 0.4'}
+
+  foreground-child@3.3.1:
+    resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
+    engines: {node: '>=14'}
+
+  fork-ts-checker-webpack-plugin@8.0.0:
+    resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==}
+    engines: {node: '>=12.13.0', yarn: '>=1.0.0'}
+    peerDependencies:
+      typescript: '>3.6.0'
+      webpack: ^5.11.0
+
+  format@0.2.2:
+    resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==}
+    engines: {node: '>=0.4.x'}
+
+  fraction.js@4.3.7:
+    resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+
+  fs-extra@10.1.0:
+    resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+    engines: {node: '>=12'}
+
+  fs-minipass@2.1.0:
+    resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
+    engines: {node: '>= 8'}
+
+  fs-monkey@1.0.6:
+    resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==}
+
+  fs.realpath@1.0.0:
+    resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+  fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+
+  function-bind@1.1.2:
+    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+  function.prototype.name@1.1.8:
+    resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+    engines: {node: '>= 0.4'}
+
+  functional-red-black-tree@1.0.1:
+    resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
+
+  functions-have-names@1.2.3:
+    resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+  gauge@3.0.2:
+    resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
+    engines: {node: '>=10'}
+    deprecated: This package is no longer supported.
+
+  gensync@1.0.0-beta.2:
+    resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+    engines: {node: '>=6.9.0'}
+
+  get-caller-file@2.0.5:
+    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+    engines: {node: 6.* || 8.* || >= 10.*}
+
+  get-east-asian-width@1.3.0:
+    resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
+    engines: {node: '>=18'}
+
+  get-intrinsic@1.3.0:
+    resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+    engines: {node: '>= 0.4'}
+
+  get-package-type@0.1.0:
+    resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
+    engines: {node: '>=8.0.0'}
+
+  get-proto@1.0.1:
+    resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+    engines: {node: '>= 0.4'}
+
+  get-stream@5.2.0:
+    resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+    engines: {node: '>=8'}
+
+  get-stream@6.0.1:
+    resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+    engines: {node: '>=10'}
+
+  get-stream@8.0.1:
+    resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+    engines: {node: '>=16'}
+
+  get-symbol-description@1.1.0:
+    resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+    engines: {node: '>= 0.4'}
+
+  get-tsconfig@4.10.0:
+    resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==}
+
+  glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
+
+  glob-parent@6.0.2:
+    resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+    engines: {node: '>=10.13.0'}
+
+  glob-to-regexp@0.4.1:
+    resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+
+  glob@10.4.5:
+    resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+    hasBin: true
+
+  glob@7.2.3:
+    resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+    deprecated: Glob versions prior to v9 are no longer supported
+
+  globals@11.12.0:
+    resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+    engines: {node: '>=4'}
+
+  globals@14.0.0:
+    resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+    engines: {node: '>=18'}
+
+  globals@15.15.0:
+    resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
+    engines: {node: '>=18'}
+
+  globals@16.0.0:
+    resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==}
+    engines: {node: '>=18'}
+
+  globalthis@1.0.4:
+    resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+    engines: {node: '>= 0.4'}
+
+  gopd@1.2.0:
+    resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+    engines: {node: '>= 0.4'}
+
+  got@11.8.6:
+    resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==}
+    engines: {node: '>=10.19.0'}
+
+  graceful-fs@4.2.11:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+  graphemer@1.4.0:
+    resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+  hachure-fill@0.5.2:
+    resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==}
+
+  happy-dom@17.4.4:
+    resolution: {integrity: sha512-/Pb0ctk3HTZ5xEL3BZ0hK1AqDSAUuRQitOmROPHhfUYEWpmTImwfD8vFDGADmMAX0JYgbcgxWoLFKtsWhcpuVA==}
+    engines: {node: '>=18.0.0'}
+
+  has-bigints@1.1.0:
+    resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+    engines: {node: '>= 0.4'}
+
+  has-flag@4.0.0:
+    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+    engines: {node: '>=8'}
+
+  has-property-descriptors@1.0.2:
+    resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+  has-proto@1.2.0:
+    resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+    engines: {node: '>= 0.4'}
+
+  has-symbols@1.1.0:
+    resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+    engines: {node: '>= 0.4'}
+
+  has-tostringtag@1.0.2:
+    resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+    engines: {node: '>= 0.4'}
+
+  has-unicode@2.0.1:
+    resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
+
+  hash-base@3.0.5:
+    resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==}
+    engines: {node: '>= 0.10'}
+
+  hash.js@1.1.7:
+    resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
+
+  hasown@2.0.2:
+    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+    engines: {node: '>= 0.4'}
+
+  hast-util-from-dom@5.0.1:
+    resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==}
+
+  hast-util-from-html-isomorphic@2.0.0:
+    resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==}
+
+  hast-util-from-html@2.0.3:
+    resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==}
+
+  hast-util-from-parse5@8.0.3:
+    resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==}
+
+  hast-util-is-element@3.0.0:
+    resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
+
+  hast-util-parse-selector@2.2.5:
+    resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==}
+
+  hast-util-parse-selector@4.0.0:
+    resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
+
+  hast-util-raw@9.1.0:
+    resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==}
+
+  hast-util-to-estree@3.1.3:
+    resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==}
+
+  hast-util-to-jsx-runtime@2.3.6:
+    resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==}
+
+  hast-util-to-parse5@8.0.0:
+    resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
+
+  hast-util-to-text@4.0.2:
+    resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==}
+
+  hast-util-whitespace@3.0.0:
+    resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+
+  hastscript@6.0.0:
+    resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==}
+
+  hastscript@9.0.1:
+    resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==}
+
+  he@1.2.0:
+    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+    hasBin: true
+
+  highlight.js@10.7.3:
+    resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
+
+  highlightjs-vue@1.0.0:
+    resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==}
+
+  hmac-drbg@1.0.1:
+    resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==}
+
+  hoist-non-react-statics@3.3.2:
+    resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+
+  hosted-git-info@7.0.2:
+    resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==}
+    engines: {node: ^16.14.0 || >=18.0.0}
+
+  html-entities@2.6.0:
+    resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==}
+
+  html-escaper@2.0.2:
+    resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+
+  html-minifier-terser@6.1.0:
+    resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==}
+    engines: {node: '>=12'}
+    hasBin: true
+
+  html-parse-stringify@3.0.1:
+    resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==}
+
+  html-to-image@1.11.11:
+    resolution: {integrity: sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==}
+
+  html-url-attributes@3.0.1:
+    resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==}
+
+  html-void-elements@3.0.0:
+    resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+
+  html-webpack-plugin@5.6.3:
+    resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==}
+    engines: {node: '>=10.13.0'}
+    peerDependencies:
+      '@rspack/core': 0.x || 1.x
+      webpack: ^5.20.0
+    peerDependenciesMeta:
+      '@rspack/core':
+        optional: true
+      webpack:
+        optional: true
+
+  htmlparser2@6.1.0:
+    resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==}
+
+  http-cache-semantics@4.1.1:
+    resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
+
+  http2-wrapper@1.0.3:
+    resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==}
+    engines: {node: '>=10.19.0'}
+
+  https-browserify@1.0.0:
+    resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==}
+
+  https-proxy-agent@5.0.1:
+    resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
+    engines: {node: '>= 6'}
+
+  human-signals@2.1.0:
+    resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+    engines: {node: '>=10.17.0'}
+
+  human-signals@5.0.0:
+    resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+    engines: {node: '>=16.17.0'}
+
+  husky@9.1.7:
+    resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==}
+    engines: {node: '>=18'}
+    hasBin: true
+
+  i18next-resources-to-backend@1.2.1:
+    resolution: {integrity: sha512-okHbVA+HZ7n1/76MsfhPqDou0fptl2dAlhRDu2ideXloRRduzHsqDOznJBef+R3DFZnbvWoBW+KxJ7fnFjd6Yw==}
+
+  i18next@23.16.8:
+    resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==}
+
+  iconv-lite@0.6.3:
+    resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+    engines: {node: '>=0.10.0'}
+
+  icss-utils@5.1.0:
+    resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+
+  ieee754@1.2.1:
+    resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+  ignore@5.3.2:
+    resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+    engines: {node: '>= 4'}
+
+  image-size@1.2.1:
+    resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==}
+    engines: {node: '>=16.x'}
+    hasBin: true
+
+  immer@9.0.21:
+    resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==}
+
+  immutable@5.1.1:
+    resolution: {integrity: sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==}
+
+  import-fresh@3.3.1:
+    resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+    engines: {node: '>=6'}
+
+  import-local@3.2.0:
+    resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==}
+    engines: {node: '>=8'}
+    hasBin: true
+
+  imurmurhash@0.1.4:
+    resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+    engines: {node: '>=0.8.19'}
+
+  indent-string@4.0.0:
+    resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+    engines: {node: '>=8'}
+
+  indent-string@5.0.0:
+    resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==}
+    engines: {node: '>=12'}
+
+  index-to-position@1.1.0:
+    resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==}
+    engines: {node: '>=18'}
+
+  inflight@1.0.6:
+    resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+    deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+  inherits@2.0.4:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+  inline-style-parser@0.2.4:
+    resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==}
+
+  internal-slot@1.1.0:
+    resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+    engines: {node: '>= 0.4'}
+
+  internmap@1.0.1:
+    resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==}
+
+  internmap@2.0.3:
+    resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
+    engines: {node: '>=12'}
+
+  intersection-observer@0.12.2:
+    resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==}
+
+  is-alphabetical@1.0.4:
+    resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==}
+
+  is-alphabetical@2.0.1:
+    resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
+
+  is-alphanumerical@1.0.4:
+    resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==}
+
+  is-alphanumerical@2.0.1:
+    resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
+
+  is-arguments@1.2.0:
+    resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
+    engines: {node: '>= 0.4'}
+
+  is-array-buffer@3.0.5:
+    resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+    engines: {node: '>= 0.4'}
+
+  is-arrayish@0.2.1:
+    resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+  is-arrayish@0.3.2:
+    resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
+
+  is-async-function@2.1.1:
+    resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
+    engines: {node: '>= 0.4'}
+
+  is-bigint@1.1.0:
+    resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+    engines: {node: '>= 0.4'}
+
+  is-binary-path@2.1.0:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+
+  is-boolean-object@1.2.2:
+    resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
+    engines: {node: '>= 0.4'}
+
+  is-builtin-module@5.0.0:
+    resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==}
+    engines: {node: '>=18.20'}
+
+  is-bun-module@2.0.0:
+    resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==}
+
+  is-callable@1.2.7:
+    resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+    engines: {node: '>= 0.4'}
+
+  is-core-module@2.16.1:
+    resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+    engines: {node: '>= 0.4'}
+
+  is-data-view@1.0.2:
+    resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+    engines: {node: '>= 0.4'}
+
+  is-date-object@1.1.0:
+    resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+    engines: {node: '>= 0.4'}
+
+  is-decimal@1.0.4:
+    resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==}
+
+  is-decimal@2.0.1:
+    resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
+
+  is-docker@2.2.1:
+    resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+    engines: {node: '>=8'}
+    hasBin: true
+
+  is-extglob@2.1.1:
+    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+    engines: {node: '>=0.10.0'}
+
+  is-finalizationregistry@1.1.1:
+    resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+    engines: {node: '>= 0.4'}
+
+  is-fullwidth-code-point@3.0.0:
+    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+    engines: {node: '>=8'}
+
+  is-fullwidth-code-point@4.0.0:
+    resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
+    engines: {node: '>=12'}
+
+  is-fullwidth-code-point@5.0.0:
+    resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==}
+    engines: {node: '>=18'}
+
+  is-generator-fn@2.1.0:
+    resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
+    engines: {node: '>=6'}
+
+  is-generator-function@1.1.0:
+    resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
+    engines: {node: '>= 0.4'}
+
+  is-glob@4.0.3:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
+
+  is-hexadecimal@1.0.4:
+    resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==}
+
+  is-hexadecimal@2.0.1:
+    resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
+
+  is-immutable-type@5.0.1:
+    resolution: {integrity: sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg==}
+    peerDependencies:
+      eslint: '*'
+      typescript: '>=4.7.4'
+
+  is-map@2.0.3:
+    resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+    engines: {node: '>= 0.4'}
+
+  is-nan@1.3.2:
+    resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==}
+    engines: {node: '>= 0.4'}
+
+  is-number-object@1.1.1:
+    resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+    engines: {node: '>= 0.4'}
+
+  is-number@7.0.0:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+
+  is-plain-obj@4.1.0:
+    resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+    engines: {node: '>=12'}
+
+  is-regex@1.2.1:
+    resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+    engines: {node: '>= 0.4'}
+
+  is-set@2.0.3:
+    resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+    engines: {node: '>= 0.4'}
+
+  is-shared-array-buffer@1.0.4:
+    resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+    engines: {node: '>= 0.4'}
+
+  is-stream@2.0.1:
+    resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+    engines: {node: '>=8'}
+
+  is-stream@3.0.0:
+    resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  is-string@1.1.1:
+    resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+    engines: {node: '>= 0.4'}
+
+  is-symbol@1.1.1:
+    resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+    engines: {node: '>= 0.4'}
+
+  is-typed-array@1.1.15:
+    resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+    engines: {node: '>= 0.4'}
+
+  is-weakmap@2.0.2:
+    resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+    engines: {node: '>= 0.4'}
+
+  is-weakref@1.1.1:
+    resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
+    engines: {node: '>= 0.4'}
+
+  is-weakset@2.0.4:
+    resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+    engines: {node: '>= 0.4'}
+
+  is-wsl@2.2.0:
+    resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+    engines: {node: '>=8'}
+
+  isarray@1.0.0:
+    resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+  isarray@2.0.5:
+    resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+  isexe@2.0.0:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+  isomorphic.js@0.2.5:
+    resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==}
+
+  istanbul-lib-coverage@3.2.2:
+    resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
+    engines: {node: '>=8'}
+
+  istanbul-lib-instrument@5.2.1:
+    resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
+    engines: {node: '>=8'}
+
+  istanbul-lib-instrument@6.0.3:
+    resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==}
+    engines: {node: '>=10'}
+
+  istanbul-lib-report@3.0.1:
+    resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
+    engines: {node: '>=10'}
+
+  istanbul-lib-source-maps@4.0.1:
+    resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
+    engines: {node: '>=10'}
+
+  istanbul-reports@3.1.7:
+    resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
+    engines: {node: '>=8'}
+
+  iterator.prototype@1.1.5:
+    resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==}
+    engines: {node: '>= 0.4'}
+
+  jackspeak@3.4.3:
+    resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+  jest-changed-files@29.7.0:
+    resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-circus@29.7.0:
+    resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-cli@29.7.0:
+    resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    hasBin: true
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+
+  jest-config@29.7.0:
+    resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      '@types/node': '*'
+      ts-node: '>=9.0.0'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      ts-node:
+        optional: true
+
+  jest-diff@29.7.0:
+    resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-docblock@29.7.0:
+    resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-each@29.7.0:
+    resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-environment-node@29.7.0:
+    resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-get-type@29.6.3:
+    resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-haste-map@29.7.0:
+    resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-leak-detector@29.7.0:
+    resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-matcher-utils@29.7.0:
+    resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-message-util@29.7.0:
+    resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-mock@29.7.0:
+    resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-pnp-resolver@1.2.3:
+    resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
+    engines: {node: '>=6'}
+    peerDependencies:
+      jest-resolve: '*'
+    peerDependenciesMeta:
+      jest-resolve:
+        optional: true
+
+  jest-regex-util@29.6.3:
+    resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-resolve-dependencies@29.7.0:
+    resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-resolve@29.7.0:
+    resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-runner@29.7.0:
+    resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-runtime@29.7.0:
+    resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-snapshot@29.7.0:
+    resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-util@29.7.0:
+    resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-validate@29.7.0:
+    resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-watcher@29.7.0:
+    resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest-worker@27.5.1:
+    resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
+    engines: {node: '>= 10.13.0'}
+
+  jest-worker@29.7.0:
+    resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  jest@29.7.0:
+    resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    hasBin: true
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+
+  jiti@1.21.7:
+    resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
+    hasBin: true
+
+  js-audio-recorder@1.0.7:
+    resolution: {integrity: sha512-JiDODCElVHGrFyjGYwYyNi7zCbKk9va9C77w+zCPMmi4C6ix7zsX2h3ddHugmo4dOTOTCym9++b/wVW9nC0IaA==}
+
+  js-cookie@3.0.5:
+    resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
+    engines: {node: '>=14'}
+
+  js-tokens@4.0.0:
+    resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+  js-yaml@3.14.1:
+    resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+    hasBin: true
+
+  js-yaml@4.1.0:
+    resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+    hasBin: true
+
+  jsdoc-type-pratt-parser@4.1.0:
+    resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==}
+    engines: {node: '>=12.0.0'}
+
+  jsesc@3.0.2:
+    resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  jsesc@3.1.0:
+    resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  json-buffer@3.0.1:
+    resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+  json-parse-even-better-errors@2.3.1:
+    resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+  json-schema-traverse@0.4.1:
+    resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+  json-schema-traverse@1.0.0:
+    resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+  json-stable-stringify-without-jsonify@1.0.1:
+    resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+  json5@1.0.2:
+    resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+    hasBin: true
+
+  json5@2.2.3:
+    resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  jsonc-eslint-parser@2.4.0:
+    resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  jsonfile@6.1.0:
+    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+
+  jsonschema@1.5.0:
+    resolution: {integrity: sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==}
+
+  jsx-ast-utils@3.3.5:
+    resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
+    engines: {node: '>=4.0'}
+
+  jwt-decode@4.0.0:
+    resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==}
+    engines: {node: '>=18'}
+
+  katex@0.16.22:
+    resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==}
+    hasBin: true
+
+  keyv@4.5.4:
+    resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+  khroma@2.1.0:
+    resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==}
+
+  kleur@3.0.3:
+    resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+    engines: {node: '>=6'}
+
+  kolorist@1.8.0:
+    resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
+  ky@1.8.0:
+    resolution: {integrity: sha512-DoKGmG27nT8t/1F9gV8vNzggJ3mLAyD49J8tTMWHeZvS8qLc7GlyTieicYtFzvDznMe/q2u38peOjkWc5/pjvw==}
+    engines: {node: '>=18'}
+
+  lamejs@1.2.1:
+    resolution: {integrity: sha512-s7bxvjvYthw6oPLCm5pFxvA84wUROODB8jEO2+CE1adhKgrIvVOlmMgY8zyugxGrvRaDHNJanOiS21/emty6dQ==}
+
+  langium@3.0.0:
+    resolution: {integrity: sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==}
+    engines: {node: '>=16.0.0'}
+
+  language-subtag-registry@0.3.23:
+    resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
+
+  language-tags@1.0.9:
+    resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
+    engines: {node: '>=0.10'}
+
+  launch-ide@1.0.1:
+    resolution: {integrity: sha512-U7qBxSNk774PxWq4XbmRe0ThiIstPoa4sMH/OGSYxrFVvg8x3biXcF1fsH6wasDpEmEXMdINUrQhBdwsSgKyMg==}
+
+  layout-base@1.0.2:
+    resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==}
+
+  layout-base@2.0.1:
+    resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==}
+
+  leven@3.1.0:
+    resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
+    engines: {node: '>=6'}
+
+  levn@0.4.1:
+    resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+    engines: {node: '>= 0.8.0'}
+
+  lexical@0.30.0:
+    resolution: {integrity: sha512-6gxYeXaJiAcreJD0whCofvO0MuJmnWoIgIl1w7L5FTigfhnEohuCx2SoI/oywzfzXE9gzZnyr3rVvZrMItPL8A==}
+
+  lib0@0.2.102:
+    resolution: {integrity: sha512-g70kydI0I1sZU0ChO8mBbhw0oUW/8U0GHzygpvEIx8k+jgOpqnTSb/E+70toYVqHxBhrERD21TwD5QcZJQ40ZQ==}
+    engines: {node: '>=16'}
+    hasBin: true
+
+  lilconfig@3.1.3:
+    resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
+    engines: {node: '>=14'}
+
+  line-clamp@1.0.0:
+    resolution: {integrity: sha512-dCDlvMj572RIRBQ3x9aIX0DTdt2St1bMdpi64jVTAi5vqBck7wf+J97//+J7+pS80rFJaYa8HiyXCTp0flpnBA==}
+
+  lines-and-columns@1.2.4:
+    resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+  lint-staged@15.5.0:
+    resolution: {integrity: sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==}
+    engines: {node: '>=18.12.0'}
+    hasBin: true
+
+  listr2@8.3.2:
+    resolution: {integrity: sha512-vsBzcU4oE+v0lj4FhVLzr9dBTv4/fHIa57l+GCwovP8MoFNZJTOhGU8PXd4v2VJCbECAaijBiHntiekFMLvo0g==}
+    engines: {node: '>=18.0.0'}
+
+  loader-runner@4.3.0:
+    resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
+    engines: {node: '>=6.11.5'}
+
+  loader-utils@2.0.4:
+    resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==}
+    engines: {node: '>=8.9.0'}
+
+  loader-utils@3.3.1:
+    resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==}
+    engines: {node: '>= 12.13.0'}
+
+  local-pkg@1.1.1:
+    resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==}
+    engines: {node: '>=14'}
+
+  locate-path@5.0.0:
+    resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+    engines: {node: '>=8'}
+
+  locate-path@6.0.0:
+    resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+    engines: {node: '>=10'}
+
+  locate-path@7.2.0:
+    resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  lodash-es@4.17.21:
+    resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
+  lodash.castarray@4.4.0:
+    resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
+
+  lodash.debounce@4.0.8:
+    resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+
+  lodash.isplainobject@4.0.6:
+    resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+
+  lodash.merge@4.6.2:
+    resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+  lodash@4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+  log-update@6.1.0:
+    resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
+    engines: {node: '>=18'}
+
+  longest-streak@3.1.0:
+    resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
+  loose-envify@1.4.0:
+    resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+    hasBin: true
+
+  loupe@3.1.3:
+    resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==}
+
+  lower-case@2.0.2:
+    resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+
+  lowercase-keys@2.0.0:
+    resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
+    engines: {node: '>=8'}
+
+  lowlight@1.20.0:
+    resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==}
+
+  lru-cache@10.4.3:
+    resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+  lru-cache@5.1.1:
+    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+  lz-string@1.5.0:
+    resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
+    hasBin: true
+
+  magic-string@0.30.17:
+    resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
+
+  magicast@0.3.5:
+    resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
+
+  make-dir@3.1.0:
+    resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
+    engines: {node: '>=8'}
+
+  make-dir@4.0.0:
+    resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
+    engines: {node: '>=10'}
+
+  make-error@1.3.6:
+    resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+
+  makeerror@1.0.12:
+    resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+
+  map-or-similar@1.5.0:
+    resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==}
+
+  markdown-extensions@2.0.0:
+    resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==}
+    engines: {node: '>=16'}
+
+  markdown-table@3.0.4:
+    resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+
+  marked@13.0.3:
+    resolution: {integrity: sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==}
+    engines: {node: '>= 18'}
+    hasBin: true
+
+  math-intrinsics@1.1.0:
+    resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+    engines: {node: '>= 0.4'}
+
+  md5.js@1.3.5:
+    resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
+
+  mdast-util-find-and-replace@3.0.2:
+    resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==}
+
+  mdast-util-from-markdown@2.0.2:
+    resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==}
+
+  mdast-util-gfm-autolink-literal@2.0.1:
+    resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
+
+  mdast-util-gfm-footnote@2.1.0:
+    resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==}
+
+  mdast-util-gfm-strikethrough@2.0.0:
+    resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+
+  mdast-util-gfm-table@2.0.0:
+    resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
+
+  mdast-util-gfm-task-list-item@2.0.0:
+    resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
+
+  mdast-util-gfm@3.1.0:
+    resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==}
+
+  mdast-util-math@3.0.0:
+    resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==}
+
+  mdast-util-mdx-expression@2.0.1:
+    resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
+
+  mdast-util-mdx-jsx@3.2.0:
+    resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==}
+
+  mdast-util-mdx@3.0.0:
+    resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==}
+
+  mdast-util-mdxjs-esm@2.0.1:
+    resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
+
+  mdast-util-newline-to-break@2.0.0:
+    resolution: {integrity: sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==}
+
+  mdast-util-phrasing@4.1.0:
+    resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+
+  mdast-util-to-hast@13.2.0:
+    resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
+
+  mdast-util-to-markdown@2.1.2:
+    resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==}
+
+  mdast-util-to-string@4.0.0:
+    resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+
+  memfs@3.5.3:
+    resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==}
+    engines: {node: '>= 4.0.0'}
+
+  memoize-one@5.2.1:
+    resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==}
+
+  memoizerific@1.11.3:
+    resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==}
+
+  merge-stream@2.0.0:
+    resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+  merge2@1.4.1:
+    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+    engines: {node: '>= 8'}
+
+  mermaid@11.4.1:
+    resolution: {integrity: sha512-Mb01JT/x6CKDWaxigwfZYuYmDZ6xtrNwNlidKZwkSrDaY9n90tdrJTV5Umk+wP1fZscGptmKFXHsXMDEVZ+Q6A==}
+
+  micromark-core-commonmark@2.0.3:
+    resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
+
+  micromark-extension-gfm-autolink-literal@2.1.0:
+    resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
+
+  micromark-extension-gfm-footnote@2.1.0:
+    resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
+
+  micromark-extension-gfm-strikethrough@2.1.0:
+    resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
+
+  micromark-extension-gfm-table@2.1.1:
+    resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==}
+
+  micromark-extension-gfm-tagfilter@2.0.0:
+    resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
+
+  micromark-extension-gfm-task-list-item@2.1.0:
+    resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
+
+  micromark-extension-gfm@3.0.0:
+    resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+
+  micromark-extension-math@3.1.0:
+    resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==}
+
+  micromark-extension-mdx-expression@3.0.1:
+    resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==}
+
+  micromark-extension-mdx-jsx@3.0.2:
+    resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==}
+
+  micromark-extension-mdx-md@2.0.0:
+    resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==}
+
+  micromark-extension-mdxjs-esm@3.0.0:
+    resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==}
+
+  micromark-extension-mdxjs@3.0.0:
+    resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==}
+
+  micromark-factory-destination@2.0.1:
+    resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
+
+  micromark-factory-label@2.0.1:
+    resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
+
+  micromark-factory-mdx-expression@2.0.3:
+    resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==}
+
+  micromark-factory-space@2.0.1:
+    resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
+
+  micromark-factory-title@2.0.1:
+    resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
+
+  micromark-factory-whitespace@2.0.1:
+    resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==}
+
+  micromark-util-character@2.1.1:
+    resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
+
+  micromark-util-chunked@2.0.1:
+    resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==}
+
+  micromark-util-classify-character@2.0.1:
+    resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==}
+
+  micromark-util-combine-extensions@2.0.1:
+    resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==}
+
+  micromark-util-decode-numeric-character-reference@2.0.2:
+    resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==}
+
+  micromark-util-decode-string@2.0.1:
+    resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==}
+
+  micromark-util-encode@2.0.1:
+    resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
+
+  micromark-util-events-to-acorn@2.0.3:
+    resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==}
+
+  micromark-util-html-tag-name@2.0.1:
+    resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
+
+  micromark-util-normalize-identifier@2.0.1:
+    resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==}
+
+  micromark-util-resolve-all@2.0.1:
+    resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==}
+
+  micromark-util-sanitize-uri@2.0.1:
+    resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
+
+  micromark-util-subtokenize@2.1.0:
+    resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==}
+
+  micromark-util-symbol@2.0.1:
+    resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
+
+  micromark-util-types@2.0.2:
+    resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
+
+  micromark@4.0.2:
+    resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
+
+  micromatch@4.0.8:
+    resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+    engines: {node: '>=8.6'}
+
+  miller-rabin@4.0.1:
+    resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==}
+    hasBin: true
+
+  mime-db@1.52.0:
+    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+    engines: {node: '>= 0.6'}
+
+  mime-types@2.1.35:
+    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+    engines: {node: '>= 0.6'}
+
+  mime@4.0.7:
+    resolution: {integrity: sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==}
+    engines: {node: '>=16'}
+    hasBin: true
+
+  mimic-fn@2.1.0:
+    resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+    engines: {node: '>=6'}
+
+  mimic-fn@4.0.0:
+    resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+    engines: {node: '>=12'}
+
+  mimic-function@5.0.1:
+    resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
+    engines: {node: '>=18'}
+
+  mimic-response@1.0.1:
+    resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
+    engines: {node: '>=4'}
+
+  mimic-response@2.1.0:
+    resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==}
+    engines: {node: '>=8'}
+
+  mimic-response@3.1.0:
+    resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
+    engines: {node: '>=10'}
+
+  min-indent@1.0.1:
+    resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+    engines: {node: '>=4'}
+
+  minimalistic-assert@1.0.1:
+    resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
+
+  minimalistic-crypto-utils@1.0.1:
+    resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==}
+
+  minimatch@10.0.1:
+    resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==}
+    engines: {node: 20 || >=22}
+
+  minimatch@3.1.2:
+    resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+  minimatch@9.0.5:
+    resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  minimist@1.2.8:
+    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+  minipass@3.3.6:
+    resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
+    engines: {node: '>=8'}
+
+  minipass@5.0.0:
+    resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
+    engines: {node: '>=8'}
+
+  minipass@7.1.2:
+    resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  minizlib@2.1.2:
+    resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
+    engines: {node: '>= 8'}
+
+  mitt@3.0.1:
+    resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
+
+  mkdirp@1.0.4:
+    resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  mlly@1.7.4:
+    resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
+
+  monaco-editor@0.52.2:
+    resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==}
+
+  ms@2.1.3:
+    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+  mz@2.7.0:
+    resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+
+  nan@2.22.2:
+    resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==}
+
+  nanoid@3.3.11:
+    resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+
+  natural-compare@1.4.0:
+    resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+  natural-orderby@5.0.0:
+    resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==}
+    engines: {node: '>=18'}
+
+  negotiator@0.6.4:
+    resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==}
+    engines: {node: '>= 0.6'}
+
+  neo-async@2.6.2:
+    resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+  next-themes@0.4.6:
+    resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==}
+    peerDependencies:
+      react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
+      react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
+
+  next@15.2.3:
+    resolution: {integrity: sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==}
+    engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
+    hasBin: true
+    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
+
+  no-case@3.0.4:
+    resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+
+  node-abort-controller@3.1.1:
+    resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==}
+
+  node-addon-api@7.1.1:
+    resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
+
+  node-fetch@2.7.0:
+    resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+    engines: {node: 4.x || >=6.0.0}
+    peerDependencies:
+      encoding: ^0.1.0
+    peerDependenciesMeta:
+      encoding:
+        optional: true
+
+  node-int64@0.4.0:
+    resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+
+  node-polyfill-webpack-plugin@2.0.1:
+    resolution: {integrity: sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      webpack: '>=5'
+
+  node-releases@2.0.19:
+    resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
+
+  nopt@5.0.0:
+    resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  normalize-package-data@6.0.2:
+    resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==}
+    engines: {node: ^16.14.0 || >=18.0.0}
+
+  normalize-path@3.0.0:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+
+  normalize-range@0.1.2:
+    resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+    engines: {node: '>=0.10.0'}
+
+  normalize-url@6.1.0:
+    resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
+    engines: {node: '>=10'}
+
+  normalize-wheel@1.0.1:
+    resolution: {integrity: sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==}
+
+  npm-run-path@4.0.1:
+    resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+    engines: {node: '>=8'}
+
+  npm-run-path@5.3.0:
+    resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  npmlog@5.0.1:
+    resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==}
+    deprecated: This package is no longer supported.
+
+  nth-check@2.1.1:
+    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+  object-assign@4.1.1:
+    resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+    engines: {node: '>=0.10.0'}
+
+  object-hash@3.0.0:
+    resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+    engines: {node: '>= 6'}
+
+  object-inspect@1.13.4:
+    resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+    engines: {node: '>= 0.4'}
+
+  object-is@1.1.6:
+    resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+    engines: {node: '>= 0.4'}
+
+  object-keys@1.1.1:
+    resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+    engines: {node: '>= 0.4'}
+
+  object.assign@4.1.7:
+    resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+    engines: {node: '>= 0.4'}
+
+  object.entries@1.1.9:
+    resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==}
+    engines: {node: '>= 0.4'}
+
+  object.fromentries@2.0.8:
+    resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+    engines: {node: '>= 0.4'}
+
+  object.groupby@1.0.3:
+    resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+    engines: {node: '>= 0.4'}
+
+  object.values@1.2.1:
+    resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
+    engines: {node: '>= 0.4'}
+
+  objectorarray@1.0.5:
+    resolution: {integrity: sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==}
+
+  once@1.4.0:
+    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+  onetime@5.1.2:
+    resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+    engines: {node: '>=6'}
+
+  onetime@6.0.0:
+    resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+    engines: {node: '>=12'}
+
+  onetime@7.0.0:
+    resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
+    engines: {node: '>=18'}
+
+  open@8.4.2:
+    resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+    engines: {node: '>=12'}
+
+  optionator@0.9.4:
+    resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+    engines: {node: '>= 0.8.0'}
+
+  os-browserify@0.3.0:
+    resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==}
+
+  own-keys@1.0.1:
+    resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+    engines: {node: '>= 0.4'}
+
+  p-cancelable@2.1.1:
+    resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
+    engines: {node: '>=8'}
+
+  p-limit@2.3.0:
+    resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+    engines: {node: '>=6'}
+
+  p-limit@3.1.0:
+    resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+    engines: {node: '>=10'}
+
+  p-limit@4.0.0:
+    resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  p-locate@4.1.0:
+    resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+    engines: {node: '>=8'}
+
+  p-locate@5.0.0:
+    resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+    engines: {node: '>=10'}
+
+  p-locate@6.0.0:
+    resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  p-try@2.2.0:
+    resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+    engines: {node: '>=6'}
+
+  package-json-from-dist@1.0.1:
+    resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+  package-manager-detector@0.2.11:
+    resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==}
+
+  pako@1.0.11:
+    resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
+
+  papaparse@5.5.2:
+    resolution: {integrity: sha512-PZXg8UuAc4PcVwLosEEDYjPyfWnTEhOrUfdv+3Bx+NuAb+5NhDmXzg5fHWmdCh1mP5p7JAZfFr3IMQfcntNAdA==}
+
+  param-case@3.0.4:
+    resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
+
+  parent-module@1.0.1:
+    resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+    engines: {node: '>=6'}
+
+  parse-asn1@5.1.7:
+    resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==}
+    engines: {node: '>= 0.10'}
+
+  parse-entities@2.0.0:
+    resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==}
+
+  parse-entities@4.0.2:
+    resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
+
+  parse-gitignore@2.0.0:
+    resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==}
+    engines: {node: '>=14'}
+
+  parse-imports@2.2.1:
+    resolution: {integrity: sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==}
+    engines: {node: '>= 18'}
+
+  parse-json@5.2.0:
+    resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+    engines: {node: '>=8'}
+
+  parse-json@8.3.0:
+    resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==}
+    engines: {node: '>=18'}
+
+  parse5@7.2.1:
+    resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==}
+
+  pascal-case@3.1.2:
+    resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+
+  path-browserify@1.0.1:
+    resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
+  path-data-parser@0.1.0:
+    resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==}
+
+  path-exists@4.0.0:
+    resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+    engines: {node: '>=8'}
+
+  path-exists@5.0.0:
+    resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  path-is-absolute@1.0.1:
+    resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+    engines: {node: '>=0.10.0'}
+
+  path-key@3.1.1:
+    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+    engines: {node: '>=8'}
+
+  path-key@4.0.0:
+    resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+    engines: {node: '>=12'}
+
+  path-parse@1.0.7:
+    resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+  path-scurry@1.11.1:
+    resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+    engines: {node: '>=16 || 14 >=14.18'}
+
+  path-type@4.0.0:
+    resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+    engines: {node: '>=8'}
+
+  path2d@0.2.2:
+    resolution: {integrity: sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ==}
+    engines: {node: '>=6'}
+
+  pathe@2.0.3:
+    resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+  pathval@2.0.0:
+    resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
+    engines: {node: '>= 14.16'}
+
+  pbkdf2@3.1.2:
+    resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==}
+    engines: {node: '>=0.12'}
+
+  pdfjs-dist@4.4.168:
+    resolution: {integrity: sha512-MbkAjpwka/dMHaCfQ75RY1FXX3IewBVu6NGZOcxerRFlaBiIkZmUoR0jotX5VUzYZEXAGzSFtknWs5xRKliXPA==}
+    engines: {node: '>=18'}
+
+  picocolors@1.1.1:
+    resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+  picomatch@2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+
+  picomatch@4.0.2:
+    resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+    engines: {node: '>=12'}
+
+  pidtree@0.6.0:
+    resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
+    engines: {node: '>=0.10'}
+    hasBin: true
+
+  pify@2.3.0:
+    resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+    engines: {node: '>=0.10.0'}
+
+  pinyin-pro@3.26.0:
+    resolution: {integrity: sha512-HcBZZb0pvm0/JkPhZHWA5Hqp2cWHXrrW/WrV+OtaYYM+kf35ffvZppIUuGmyuQ7gDr1JDJKMkbEE+GN0wfMoGg==}
+
+  pirates@4.0.7:
+    resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
+    engines: {node: '>= 6'}
+
+  pkg-dir@4.2.0:
+    resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
+    engines: {node: '>=8'}
+
+  pkg-dir@7.0.0:
+    resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==}
+    engines: {node: '>=14.16'}
+
+  pkg-types@1.3.1:
+    resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+  pkg-types@2.1.0:
+    resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==}
+
+  pluralize@8.0.0:
+    resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+    engines: {node: '>=4'}
+
+  pnp-webpack-plugin@1.7.0:
+    resolution: {integrity: sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==}
+    engines: {node: '>=6'}
+
+  pnpm-workspace-yaml@0.3.1:
+    resolution: {integrity: sha512-3nW5RLmREmZ8Pm8MbPsO2RM+99RRjYd25ynj3NV0cFsN7CcEl4sDFzgoFmSyduFwxFQ2Qbu3y2UdCh6HlyUOeA==}
+
+  points-on-curve@0.2.0:
+    resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==}
+
+  points-on-path@0.2.1:
+    resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==}
+
+  polished@4.3.1:
+    resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==}
+    engines: {node: '>=10'}
+
+  portfinder@1.0.35:
+    resolution: {integrity: sha512-73JaFg4NwYNAufDtS5FsFu/PdM49ahJrO1i44aCRsDWju1z5wuGDaqyFUQWR6aJoK2JPDWlaYYAGFNIGTSUHSw==}
+    engines: {node: '>= 10.12'}
+
+  possible-typed-array-names@1.1.0:
+    resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+    engines: {node: '>= 0.4'}
+
+  postcss-import@15.1.0:
+    resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      postcss: ^8.0.0
+
+  postcss-js@4.0.1:
+    resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
+    engines: {node: ^12 || ^14 || >= 16}
+    peerDependencies:
+      postcss: ^8.4.21
+
+  postcss-load-config@4.0.2:
+    resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
+    engines: {node: '>= 14'}
+    peerDependencies:
+      postcss: '>=8.0.9'
+      ts-node: '>=9.0.0'
+    peerDependenciesMeta:
+      postcss:
+        optional: true
+      ts-node:
+        optional: true
+
+  postcss-loader@8.1.1:
+    resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==}
+    engines: {node: '>= 18.12.0'}
+    peerDependencies:
+      '@rspack/core': 0.x || 1.x
+      postcss: ^7.0.0 || ^8.0.1
+      webpack: ^5.0.0
+    peerDependenciesMeta:
+      '@rspack/core':
+        optional: true
+      webpack:
+        optional: true
+
+  postcss-modules-extract-imports@3.1.0:
+    resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+
+  postcss-modules-local-by-default@4.2.0:
+    resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+
+  postcss-modules-scope@3.2.1:
+    resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+
+  postcss-modules-values@4.0.0:
+    resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+
+  postcss-nested@6.2.0:
+    resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
+    engines: {node: '>=12.0'}
+    peerDependencies:
+      postcss: ^8.2.14
+
+  postcss-selector-parser@6.0.10:
+    resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+    engines: {node: '>=4'}
+
+  postcss-selector-parser@6.1.2:
+    resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+    engines: {node: '>=4'}
+
+  postcss-selector-parser@7.1.0:
+    resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==}
+    engines: {node: '>=4'}
+
+  postcss-value-parser@4.2.0:
+    resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+  postcss@8.4.31:
+    resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+    engines: {node: ^10 || ^12 || >=14}
+
+  postcss@8.5.3:
+    resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
+    engines: {node: ^10 || ^12 || >=14}
+
+  prelude-ls@1.2.1:
+    resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+    engines: {node: '>= 0.8.0'}
+
+  pretty-error@4.0.0:
+    resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==}
+
+  pretty-format@27.5.1:
+    resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+  pretty-format@29.7.0:
+    resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+  prismjs@1.27.0:
+    resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==}
+    engines: {node: '>=6'}
+
+  prismjs@1.30.0:
+    resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
+    engines: {node: '>=6'}
+
+  process-nextick-args@2.0.1:
+    resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
+  process@0.11.10:
+    resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+    engines: {node: '>= 0.6.0'}
+
+  prompts@2.4.2:
+    resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+    engines: {node: '>= 6'}
+
+  prop-types@15.8.1:
+    resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+
+  property-information@5.6.0:
+    resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==}
+
+  property-information@6.5.0:
+    resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
+
+  property-information@7.0.0:
+    resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==}
+
+  public-encrypt@4.0.3:
+    resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==}
+
+  pump@3.0.2:
+    resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==}
+
+  punycode@1.4.1:
+    resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
+
+  punycode@2.3.1:
+    resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+    engines: {node: '>=6'}
+
+  pure-rand@6.1.0:
+    resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
+
+  qrcode.react@4.2.0:
+    resolution: {integrity: sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+  qs@6.14.0:
+    resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
+    engines: {node: '>=0.6'}
+
+  quansync@0.2.10:
+    resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==}
+
+  querystring-es3@0.2.1:
+    resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==}
+    engines: {node: '>=0.4.x'}
+
+  queue-microtask@1.2.3:
+    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+  queue@6.0.2:
+    resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==}
+
+  quick-lru@5.1.1:
+    resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
+    engines: {node: '>=10'}
+
+  randombytes@2.1.0:
+    resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+
+  randomfill@1.0.4:
+    resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==}
+
+  range-parser@1.2.1:
+    resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+    engines: {node: '>= 0.6'}
+
+  re-resizable@6.11.2:
+    resolution: {integrity: sha512-2xI2P3OHs5qw7K0Ud1aLILK6MQxW50TcO+DetD9eIV58j84TqYeHoZcL9H4GXFXXIh7afhH8mv5iUCXII7OW7A==}
+    peerDependencies:
+      react: ^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+      react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+  react-18-input-autosize@3.0.0:
+    resolution: {integrity: sha512-7tsUc9PJWg6Vsp8qYuzlKKBf7hbCoTBdNfjYZSprEPbxf3meuhjklg9QPBe9rIyoR3uDAzmG7NpoJ1+kP5ns+w==}
+    peerDependencies:
+      react: ^16.3.0 || ^17.0.0 || ^18.0.0
+
+  react-confetti@6.4.0:
+    resolution: {integrity: sha512-5MdGUcqxrTU26I2EU7ltkWPwxvucQTuqMm8dUz72z2YMqTD6s9vMcDUysk7n9jnC+lXuCPeJJ7Knf98VEYE9Rg==}
+    engines: {node: '>=16'}
+    peerDependencies:
+      react: ^16.3.0 || ^17.0.1 || ^18.0.0 || ^19.0.0
+
+  react-docgen-typescript@2.2.2:
+    resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==}
+    peerDependencies:
+      typescript: '>= 4.3.x'
+
+  react-docgen@7.1.1:
+    resolution: {integrity: sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==}
+    engines: {node: '>=16.14.0'}
+
+  react-dom@18.3.1:
+    resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
+    peerDependencies:
+      react: ^18.3.1
+
+  react-dom@19.0.0:
+    resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==}
+    peerDependencies:
+      react: ^19.0.0
+
+  react-draggable@4.4.6:
+    resolution: {integrity: sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==}
+    peerDependencies:
+      react: '>= 16.3.0'
+      react-dom: '>= 16.3.0'
+
+  react-easy-crop@5.4.1:
+    resolution: {integrity: sha512-Djtsi7bWO75vkKYkVxNRrJWY69pXLahIAkUN0mmt9cXNnaq2tpG59ctSY6P7ipJgBc7COJDRMRuwb2lYwtACNQ==}
+    peerDependencies:
+      react: '>=16.4.0'
+      react-dom: '>=16.4.0'
+
+  react-error-boundary@3.1.4:
+    resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==}
+    engines: {node: '>=10', npm: '>=6'}
+    peerDependencies:
+      react: '>=16.13.1'
+
+  react-error-boundary@4.1.2:
+    resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==}
+    peerDependencies:
+      react: '>=16.13.1'
+
+  react-fast-compare@3.2.2:
+    resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==}
+
+  react-headless-pagination@1.1.6:
+    resolution: {integrity: sha512-t7L/Q4xpyZszw8iC8ALERs/G2644JESmssahUkRp65WFWvw2k9HXVmfI6VbXvTXrqy+a8fbKT6BQ6SgS2ULNOA==}
+    engines: {node: '>=18.13'}
+    peerDependencies:
+      react: '>=16'
+
+  react-hook-form@7.55.0:
+    resolution: {integrity: sha512-XRnjsH3GVMQz1moZTW53MxfoWN7aDpUg/GpVNc4A3eXRVNdGXfbzJ4vM4aLQ8g6XCUh1nIbx70aaNCl7kxnjog==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      react: ^16.8.0 || ^17 || ^18 || ^19
+
+  react-hotkeys-hook@4.6.2:
+    resolution: {integrity: sha512-FmP+ZriY3EG59Ug/lxNfrObCnW9xQShgk7Nb83+CkpfkcCpfS95ydv+E9JuXA5cp8KtskU7LGlIARpkc92X22Q==}
+    peerDependencies:
+      react: '>=16.8.1'
+      react-dom: '>=16.8.1'
+
+  react-i18next@15.4.1:
+    resolution: {integrity: sha512-ahGab+IaSgZmNPYXdV1n+OYky95TGpFwnKRflX/16dY04DsYYKHtVLjeny7sBSCREEcoMbAgSkFiGLF5g5Oofw==}
+    peerDependencies:
+      i18next: '>= 23.2.3'
+      react: '>= 16.8.0'
+      react-dom: '*'
+      react-native: '*'
+    peerDependenciesMeta:
+      react-dom:
+        optional: true
+      react-native:
+        optional: true
+
+  react-infinite-scroll-component@6.1.0:
+    resolution: {integrity: sha512-SQu5nCqy8DxQWpnUVLx7V7b7LcA37aM7tvoWjTLZp1dk6EJibM5/4EJKzOnl07/BsM1Y40sKLuqjCwwH/xV0TQ==}
+    peerDependencies:
+      react: '>=16.0.0'
+
+  react-is@16.13.1:
+    resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+  react-is@17.0.2:
+    resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+
+  react-is@18.3.1:
+    resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+
+  react-markdown@9.1.0:
+    resolution: {integrity: sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==}
+    peerDependencies:
+      '@types/react': ~18.2.0
+      react: '>=18'
+
+  react-multi-email@1.0.25:
+    resolution: {integrity: sha512-Wmv28FvIk4nWgdpHzlIPonY4iSs7bPV35+fAiWYzSBhTo+vhXfglEhjY1WnjHQINW/Pibu2xlb/q1heVuytQHQ==}
+    peerDependencies:
+      react: ^18.2.0
+      react-dom: ^18.2.0
+
+  react-papaparse@4.4.0:
+    resolution: {integrity: sha512-xTEwHZYJ+1dh9mQDQjjwJXmWyX20DdZ52u+ddw75V+Xm5qsjXSvWmC7c8K82vRwMjKAOH2S9uFyGpHEyEztkUQ==}
+    engines: {node: '>=8', npm: '>=5'}
+
+  react-pdf-highlighter@8.0.0-rc.0:
+    resolution: {integrity: sha512-zYHDq5XxsXA02UbFUoMdo7Cex1l42vHJxszywXmct2kUMZm6TmU3b/a5zOS6ssXWqdjEx5Vpq6/gW+Mek9rDTQ==}
+    peerDependencies:
+      react: '>=18.0.0'
+      react-dom: '>=18.0.0'
+
+  react-refresh@0.14.2:
+    resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
+    engines: {node: '>=0.10.0'}
+
+  react-rnd@10.5.2:
+    resolution: {integrity: sha512-0Tm4x7k7pfHf2snewJA8x7Nwgt3LV+58MVEWOVsFjk51eYruFEa6Wy7BNdxt4/lH0wIRsu7Gm3KjSXY2w7YaNw==}
+    peerDependencies:
+      react: '>=16.3.0'
+      react-dom: '>=16.3.0'
+
+  react-slider@2.0.6:
+    resolution: {integrity: sha512-gJxG1HwmuMTJ+oWIRCmVWvgwotNCbByTwRkFZC6U4MBsHqJBmxwbYRJUmxy4Tke1ef8r9jfXjgkmY/uHOCEvbA==}
+    peerDependencies:
+      react: ^16 || ^17 || ^18
+
+  react-sortablejs@6.1.4:
+    resolution: {integrity: sha512-fc7cBosfhnbh53Mbm6a45W+F735jwZ1UFIYSrIqcO/gRIFoDyZeMtgKlpV4DdyQfbCzdh5LoALLTDRxhMpTyXQ==}
+    peerDependencies:
+      '@types/sortablejs': '1'
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+      sortablejs: '1'
+
+  react-syntax-highlighter@15.6.1:
+    resolution: {integrity: sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==}
+    peerDependencies:
+      react: '>= 0.14.0'
+
+  react-textarea-autosize@8.5.9:
+    resolution: {integrity: sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+  react-tooltip@5.8.3:
+    resolution: {integrity: sha512-h7maAlm2Xeymc14gWKhhrzsENeB83N65EzZ+AcQIGrOpNE0yefVRJIHhNcWHEJ0FEtf7VZXxtsj5glVXKxEtvA==}
+    peerDependencies:
+      react: '>=16.14.0'
+      react-dom: '>=16.14.0'
+
+  react-window-infinite-loader@1.0.10:
+    resolution: {integrity: sha512-NO/csdHlxjWqA2RJZfzQgagAjGHspbO2ik9GtWZb0BY1Nnapq0auG8ErI+OhGCzpjYJsCYerqUlK6hkq9dfAAA==}
+    engines: {node: '>8.0.0'}
+    peerDependencies:
+      react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0
+      react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+  react-window@1.8.11:
+    resolution: {integrity: sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==}
+    engines: {node: '>8.0.0'}
+    peerDependencies:
+      react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+      react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+  react@18.3.1:
+    resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+    engines: {node: '>=0.10.0'}
+
+  react@19.0.0:
+    resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==}
+    engines: {node: '>=0.10.0'}
+
+  reactflow@11.11.4:
+    resolution: {integrity: sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==}
+    peerDependencies:
+      react: '>=17'
+      react-dom: '>=17'
+
+  read-cache@1.0.0:
+    resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+
+  read-package-up@11.0.0:
+    resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==}
+    engines: {node: '>=18'}
+
+  read-pkg@9.0.1:
+    resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==}
+    engines: {node: '>=18'}
+
+  readable-stream@2.3.8:
+    resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+
+  readable-stream@3.6.2:
+    resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+    engines: {node: '>= 6'}
+
+  readable-stream@4.7.0:
+    resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  readdirp@3.6.0:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+
+  readdirp@4.1.2:
+    resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+    engines: {node: '>= 14.18.0'}
+
+  recast@0.23.11:
+    resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==}
+    engines: {node: '>= 4'}
+
+  recma-build-jsx@1.0.0:
+    resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==}
+
+  recma-jsx@1.0.0:
+    resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==}
+
+  recma-parse@1.0.0:
+    resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==}
+
+  recma-stringify@1.0.0:
+    resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==}
+
+  recordrtc@5.6.2:
+    resolution: {integrity: sha512-1QNKKNtl7+KcwD1lyOgP3ZlbiJ1d0HtXnypUy7yq49xEERxk31PHvE9RCciDrulPCY7WJ+oz0R9hpNxgsIurGQ==}
+
+  redent@3.0.0:
+    resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
+    engines: {node: '>=8'}
+
+  refa@0.12.1:
+    resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==}
+    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+  reflect.getprototypeof@1.0.10:
+    resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+    engines: {node: '>= 0.4'}
+
+  refractor@3.6.0:
+    resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==}
+
+  regenerate-unicode-properties@10.2.0:
+    resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==}
+    engines: {node: '>=4'}
+
+  regenerate@1.4.2:
+    resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
+
+  regenerator-runtime@0.14.1:
+    resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+  regenerator-transform@0.15.2:
+    resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
+
+  regex-parser@2.3.1:
+    resolution: {integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==}
+
+  regexp-ast-analysis@0.7.1:
+    resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==}
+    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+  regexp-tree@0.1.27:
+    resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==}
+    hasBin: true
+
+  regexp.prototype.flags@1.5.4:
+    resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+    engines: {node: '>= 0.4'}
+
+  regexpu-core@6.2.0:
+    resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==}
+    engines: {node: '>=4'}
+
+  regjsgen@0.8.0:
+    resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==}
+
+  regjsparser@0.12.0:
+    resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==}
+    hasBin: true
+
+  rehype-katex@7.0.1:
+    resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==}
+
+  rehype-raw@7.0.0:
+    resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
+
+  rehype-recma@1.0.0:
+    resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==}
+
+  relateurl@0.2.7:
+    resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
+    engines: {node: '>= 0.10'}
+
+  remark-breaks@4.0.0:
+    resolution: {integrity: sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==}
+
+  remark-gfm@4.0.1:
+    resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==}
+
+  remark-math@6.0.0:
+    resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==}
+
+  remark-mdx@3.1.0:
+    resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==}
+
+  remark-parse@11.0.0:
+    resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
+
+  remark-rehype@11.1.2:
+    resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==}
+
+  remark-stringify@11.0.0:
+    resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+
+  renderkid@3.0.0:
+    resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==}
+
+  require-directory@2.1.1:
+    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+    engines: {node: '>=0.10.0'}
+
+  require-from-string@2.0.2:
+    resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+    engines: {node: '>=0.10.0'}
+
+  resize-observer-polyfill@1.5.1:
+    resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
+
+  resolve-alpn@1.2.1:
+    resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
+
+  resolve-cwd@3.0.0:
+    resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
+    engines: {node: '>=8'}
+
+  resolve-from@4.0.0:
+    resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+    engines: {node: '>=4'}
+
+  resolve-from@5.0.0:
+    resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+    engines: {node: '>=8'}
+
+  resolve-pkg-maps@1.0.0:
+    resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+  resolve-url-loader@5.0.0:
+    resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==}
+    engines: {node: '>=12'}
+
+  resolve.exports@2.0.3:
+    resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==}
+    engines: {node: '>=10'}
+
+  resolve@1.22.10:
+    resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+    engines: {node: '>= 0.4'}
+    hasBin: true
+
+  resolve@2.0.0-next.5:
+    resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
+    hasBin: true
+
+  responselike@2.0.1:
+    resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==}
+
+  restore-cursor@5.1.0:
+    resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
+    engines: {node: '>=18'}
+
+  reusify@1.1.0:
+    resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+  rfdc@1.4.1:
+    resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+  rimraf@3.0.2:
+    resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+    deprecated: Rimraf versions prior to v4 are no longer supported
+    hasBin: true
+
+  ripemd160@2.0.2:
+    resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
+
+  robust-predicates@3.0.2:
+    resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
+
+  rollup@4.39.0:
+    resolution: {integrity: sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==}
+    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+    hasBin: true
+
+  roughjs@4.6.6:
+    resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==}
+
+  run-parallel@1.2.0:
+    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+  rw@1.3.3:
+    resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==}
+
+  safe-array-concat@1.1.3:
+    resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+    engines: {node: '>=0.4'}
+
+  safe-buffer@5.1.2:
+    resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
+  safe-buffer@5.2.1:
+    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+  safe-push-apply@1.0.0:
+    resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+    engines: {node: '>= 0.4'}
+
+  safe-regex-test@1.1.0:
+    resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+    engines: {node: '>= 0.4'}
+
+  safer-buffer@2.1.2:
+    resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+  sass-loader@14.2.1:
+    resolution: {integrity: sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==}
+    engines: {node: '>= 18.12.0'}
+    peerDependencies:
+      '@rspack/core': 0.x || 1.x
+      node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
+      sass: ^1.3.0
+      sass-embedded: '*'
+      webpack: ^5.0.0
+    peerDependenciesMeta:
+      '@rspack/core':
+        optional: true
+      node-sass:
+        optional: true
+      sass:
+        optional: true
+      sass-embedded:
+        optional: true
+      webpack:
+        optional: true
+
+  sass@1.86.3:
+    resolution: {integrity: sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw==}
+    engines: {node: '>=14.0.0'}
+    hasBin: true
+
+  scheduler@0.23.2:
+    resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+
+  scheduler@0.25.0:
+    resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==}
+
+  schema-utils@3.3.0:
+    resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
+    engines: {node: '>= 10.13.0'}
+
+  schema-utils@4.3.0:
+    resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==}
+    engines: {node: '>= 10.13.0'}
+
+  screenfull@5.2.0:
+    resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==}
+    engines: {node: '>=0.10.0'}
+
+  scslre@0.3.0:
+    resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==}
+    engines: {node: ^14.0.0 || >=16.0.0}
+
+  semver@6.3.1:
+    resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+    hasBin: true
+
+  semver@7.7.1:
+    resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  serialize-javascript@6.0.2:
+    resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+
+  server-only@0.0.1:
+    resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==}
+
+  set-blocking@2.0.0:
+    resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+
+  set-function-length@1.2.2:
+    resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+    engines: {node: '>= 0.4'}
+
+  set-function-name@2.0.2:
+    resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+    engines: {node: '>= 0.4'}
+
+  set-proto@1.0.0:
+    resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+    engines: {node: '>= 0.4'}
+
+  setimmediate@1.0.5:
+    resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
+
+  sha.js@2.4.11:
+    resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
+    hasBin: true
+
+  sharp@0.33.5:
+    resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==}
+    engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
+  shave@5.0.4:
+    resolution: {integrity: sha512-AnvEI1wM2rQmrwCl364LVLLhzCzSHJ7DQmdd+fHJTnNzbD2mjsUAOcxWLLYKam7Q63skwyQf2CB2TCdJ2O5c8w==}
+
+  shebang-command@2.0.0:
+    resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+    engines: {node: '>=8'}
+
+  shebang-regex@3.0.0:
+    resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+    engines: {node: '>=8'}
+
+  side-channel-list@1.0.0:
+    resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+    engines: {node: '>= 0.4'}
+
+  side-channel-map@1.0.1:
+    resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+    engines: {node: '>= 0.4'}
+
+  side-channel-weakmap@1.0.2:
+    resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+    engines: {node: '>= 0.4'}
+
+  side-channel@1.1.0:
+    resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+    engines: {node: '>= 0.4'}
+
+  siginfo@2.0.0:
+    resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+
+  signal-exit@3.0.7:
+    resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+  signal-exit@4.1.0:
+    resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+    engines: {node: '>=14'}
+
+  simple-concat@1.0.1:
+    resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
+
+  simple-get@3.1.1:
+    resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==}
+
+  simple-swizzle@0.2.2:
+    resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+
+  sisteransi@1.0.5:
+    resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+  size-sensor@1.0.2:
+    resolution: {integrity: sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw==}
+
+  slash@3.0.0:
+    resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+    engines: {node: '>=8'}
+
+  slashes@3.0.12:
+    resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==}
+
+  slice-ansi@5.0.0:
+    resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
+    engines: {node: '>=12'}
+
+  slice-ansi@7.1.0:
+    resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==}
+    engines: {node: '>=18'}
+
+  sortablejs@1.15.6:
+    resolution: {integrity: sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==}
+
+  source-map-js@1.2.1:
+    resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+    engines: {node: '>=0.10.0'}
+
+  source-map-support@0.5.13:
+    resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
+
+  source-map-support@0.5.21:
+    resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+  source-map@0.6.1:
+    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+    engines: {node: '>=0.10.0'}
+
+  source-map@0.7.4:
+    resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+    engines: {node: '>= 8'}
+
+  space-separated-tokens@1.1.5:
+    resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==}
+
+  space-separated-tokens@2.0.2:
+    resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
+  spdx-correct@3.2.0:
+    resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+
+  spdx-exceptions@2.5.0:
+    resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
+
+  spdx-expression-parse@3.0.1:
+    resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+
+  spdx-expression-parse@4.0.0:
+    resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==}
+
+  spdx-license-ids@3.0.21:
+    resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==}
+
+  sprintf-js@1.0.3:
+    resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+  stable-hash@0.0.5:
+    resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==}
+
+  stack-utils@2.0.6:
+    resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
+    engines: {node: '>=10'}
+
+  stackback@0.0.2:
+    resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+
+  stackframe@1.3.4:
+    resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==}
+
+  state-local@1.0.7:
+    resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==}
+
+  std-env@3.9.0:
+    resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==}
+
+  storybook@8.5.0:
+    resolution: {integrity: sha512-cEx42OlCetManF+cONVJVYP7SYsnI2K922DfWKmZhebP0it0n6TUof4y5/XzJ8YUruwPgyclGLdX8TvdRuNSfw==}
+    hasBin: true
+    peerDependencies:
+      prettier: ^2 || ^3
+    peerDependenciesMeta:
+      prettier:
+        optional: true
+
+  stream-browserify@3.0.0:
+    resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==}
+
+  stream-http@3.2.0:
+    resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==}
+
+  streamsearch@1.1.0:
+    resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
+    engines: {node: '>=10.0.0'}
+
+  string-argv@0.3.2:
+    resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
+    engines: {node: '>=0.6.19'}
+
+  string-length@4.0.2:
+    resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
+    engines: {node: '>=10'}
+
+  string-ts@2.2.1:
+    resolution: {integrity: sha512-Q2u0gko67PLLhbte5HmPfdOjNvUKbKQM+mCNQae6jE91DmoFHY6HH9GcdqCeNx87DZ2KKjiFxmA0R/42OneGWw==}
+
+  string-width@4.2.3:
+    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+    engines: {node: '>=8'}
+
+  string.prototype.includes@2.0.1:
+    resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==}
+    engines: {node: '>= 0.4'}
+
+  string.prototype.matchall@4.0.12:
+    resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
+    engines: {node: '>= 0.4'}
+
+  string.prototype.repeat@1.0.0:
+    resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
+
+  string.prototype.trim@1.2.10:
+    resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
+    engines: {node: '>= 0.4'}
+
+  string.prototype.trimend@1.0.9:
+    resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+    engines: {node: '>= 0.4'}
+
+  string.prototype.trimstart@1.0.8:
+    resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+    engines: {node: '>= 0.4'}
+
+  string_decoder@1.1.1:
+    resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+
+  string_decoder@1.3.0:
+    resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+  stringify-entities@4.0.4:
+    resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+
+  strip-ansi@6.0.1:
+    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+    engines: {node: '>=8'}
+
+  strip-ansi@7.1.0:
+    resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+    engines: {node: '>=12'}
+
+  strip-bom@3.0.0:
+    resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+    engines: {node: '>=4'}
+
+  strip-bom@4.0.0:
+    resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
+    engines: {node: '>=8'}
+
+  strip-final-newline@2.0.0:
+    resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+    engines: {node: '>=6'}
+
+  strip-final-newline@3.0.0:
+    resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+    engines: {node: '>=12'}
+
+  strip-indent@3.0.0:
+    resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+    engines: {node: '>=8'}
+
+  strip-indent@4.0.0:
+    resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==}
+    engines: {node: '>=12'}
+
+  strip-json-comments@3.1.1:
+    resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+    engines: {node: '>=8'}
+
+  style-loader@3.3.4:
+    resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==}
+    engines: {node: '>= 12.13.0'}
+    peerDependencies:
+      webpack: ^5.0.0
+
+  style-to-js@1.1.16:
+    resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==}
+
+  style-to-object@1.0.8:
+    resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==}
+
+  styled-jsx@5.1.6:
+    resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
+    engines: {node: '>= 12.0.0'}
+    peerDependencies:
+      '@babel/core': '*'
+      babel-plugin-macros: '*'
+      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
+
+  stylis@4.3.6:
+    resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==}
+
+  sucrase@3.35.0:
+    resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
+    engines: {node: '>=16 || 14 >=14.17'}
+    hasBin: true
+
+  supports-color@7.2.0:
+    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+    engines: {node: '>=8'}
+
+  supports-color@8.1.1:
+    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+    engines: {node: '>=10'}
+
+  supports-preserve-symlinks-flag@1.0.0:
+    resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+    engines: {node: '>= 0.4'}
+
+  swr@2.3.3:
+    resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==}
+    peerDependencies:
+      react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+  synckit@0.10.3:
+    resolution: {integrity: sha512-R1urvuyiTaWfeCggqEvpDJwAlDVdsT9NM+IP//Tk2x7qHCkSvBk/fwFgw/TLAHzZlrAnnazMcRw0ZD8HlYFTEQ==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+
+  synckit@0.9.2:
+    resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+
+  tabbable@6.2.0:
+    resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
+
+  tailwind-merge@2.6.0:
+    resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==}
+
+  tailwindcss@3.4.17:
+    resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==}
+    engines: {node: '>=14.0.0'}
+    hasBin: true
+
+  tapable@2.2.1:
+    resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+    engines: {node: '>=6'}
+
+  tar@6.2.1:
+    resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
+    engines: {node: '>=10'}
+
+  terser-webpack-plugin@5.3.14:
+    resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==}
+    engines: {node: '>= 10.13.0'}
+    peerDependencies:
+      '@swc/core': '*'
+      esbuild: '*'
+      uglify-js: '*'
+      webpack: ^5.1.0
+    peerDependenciesMeta:
+      '@swc/core':
+        optional: true
+      esbuild:
+        optional: true
+      uglify-js:
+        optional: true
+
+  terser@5.39.0:
+    resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  test-exclude@6.0.0:
+    resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+    engines: {node: '>=8'}
+
+  thenify-all@1.6.0:
+    resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+    engines: {node: '>=0.8'}
+
+  thenify@3.3.1:
+    resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+
+  throttle-debounce@2.3.0:
+    resolution: {integrity: sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==}
+    engines: {node: '>=8'}
+
+  timers-browserify@2.0.12:
+    resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==}
+    engines: {node: '>=0.6.0'}
+
+  tiny-invariant@1.2.0:
+    resolution: {integrity: sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==}
+
+  tiny-invariant@1.3.3:
+    resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
+
+  tinybench@2.9.0:
+    resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+
+  tinyexec@0.3.2:
+    resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+
+  tinyglobby@0.2.12:
+    resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==}
+    engines: {node: '>=12.0.0'}
+
+  tinypool@1.0.2:
+    resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+
+  tinyrainbow@1.2.0:
+    resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==}
+    engines: {node: '>=14.0.0'}
+
+  tinyrainbow@2.0.0:
+    resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==}
+    engines: {node: '>=14.0.0'}
+
+  tinyspy@3.0.2:
+    resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
+    engines: {node: '>=14.0.0'}
+
+  tmpl@1.0.5:
+    resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+
+  to-regex-range@5.0.1:
+    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+    engines: {node: '>=8.0'}
+
+  toggle-selection@1.0.6:
+    resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
+
+  toml-eslint-parser@0.10.0:
+    resolution: {integrity: sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  tr46@0.0.3:
+    resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+  trim-lines@3.0.1:
+    resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+  trough@2.2.0:
+    resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
+  ts-api-utils@2.1.0:
+    resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
+    engines: {node: '>=18.12'}
+    peerDependencies:
+      typescript: '>=4.8.4'
+
+  ts-debounce@4.0.0:
+    resolution: {integrity: sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==}
+
+  ts-declaration-location@1.0.7:
+    resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==}
+    peerDependencies:
+      typescript: '>=4.0.0'
+
+  ts-dedent@2.2.0:
+    resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==}
+    engines: {node: '>=6.10'}
+
+  ts-interface-checker@0.1.13:
+    resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+
+  ts-node@10.9.2:
+    resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+    hasBin: true
+    peerDependencies:
+      '@swc/core': '>=1.2.50'
+      '@swc/wasm': '>=1.2.50'
+      '@types/node': '*'
+      typescript: '>=2.7'
+    peerDependenciesMeta:
+      '@swc/core':
+        optional: true
+      '@swc/wasm':
+        optional: true
+
+  ts-pattern@5.7.0:
+    resolution: {integrity: sha512-0/FvIG4g3kNkYgbNwBBW5pZBkfpeYQnH+2AA3xmjkCAit/DSDPKmgwC3fKof4oYUq6gupClVOJlFl+939VRBMg==}
+
+  ts-pnp@1.2.0:
+    resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==}
+    engines: {node: '>=6'}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  tsconfig-paths-webpack-plugin@4.2.0:
+    resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==}
+    engines: {node: '>=10.13.0'}
+
+  tsconfig-paths@3.15.0:
+    resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+  tsconfig-paths@4.2.0:
+    resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
+    engines: {node: '>=6'}
+
+  tslib@2.3.0:
+    resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
+
+  tslib@2.6.2:
+    resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+
+  tslib@2.8.1:
+    resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+  tty-browserify@0.0.1:
+    resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==}
+
+  tween-functions@1.2.0:
+    resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==}
+
+  type-check@0.4.0:
+    resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+    engines: {node: '>= 0.8.0'}
+
+  type-detect@4.0.8:
+    resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+    engines: {node: '>=4'}
+
+  type-fest@0.21.3:
+    resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+    engines: {node: '>=10'}
+
+  type-fest@2.19.0:
+    resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+    engines: {node: '>=12.20'}
+
+  type-fest@4.39.1:
+    resolution: {integrity: sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==}
+    engines: {node: '>=16'}
+
+  typed-array-buffer@1.0.3:
+    resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-byte-length@1.0.3:
+    resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-byte-offset@1.0.4:
+    resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-length@1.0.7:
+    resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+    engines: {node: '>= 0.4'}
+
+  typescript-eslint@8.29.1:
+    resolution: {integrity: sha512-f8cDkvndhbQMPcysk6CUSGBWV+g1utqdn71P5YKwMumVMOG/5k7cHq0KyG4O52nB0oKS4aN2Tp5+wB4APJGC+w==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: '>=4.8.4 <5.9.0'
+
+  typescript@4.9.5:
+    resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
+    engines: {node: '>=4.2.0'}
+    hasBin: true
+
+  typescript@5.8.3:
+    resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
+    engines: {node: '>=14.17'}
+    hasBin: true
+
+  ufo@1.6.1:
+    resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
+
+  uglify-js@3.19.3:
+    resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==}
+    engines: {node: '>=0.8.0'}
+    hasBin: true
+
+  unbox-primitive@1.1.0:
+    resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+    engines: {node: '>= 0.4'}
+
+  unicode-canonical-property-names-ecmascript@2.0.1:
+    resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
+    engines: {node: '>=4'}
+
+  unicode-match-property-ecmascript@2.0.0:
+    resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
+    engines: {node: '>=4'}
+
+  unicode-match-property-value-ecmascript@2.2.0:
+    resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==}
+    engines: {node: '>=4'}
+
+  unicode-property-aliases-ecmascript@2.1.0:
+    resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==}
+    engines: {node: '>=4'}
+
+  unicorn-magic@0.1.0:
+    resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
+    engines: {node: '>=18'}
+
+  unified@11.0.5:
+    resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+
+  unist-util-find-after@5.0.0:
+    resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
+
+  unist-util-is@6.0.0:
+    resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
+
+  unist-util-position-from-estree@2.0.0:
+    resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==}
+
+  unist-util-position@5.0.0:
+    resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
+  unist-util-remove-position@5.0.0:
+    resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
+
+  unist-util-stringify-position@4.0.0:
+    resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+  unist-util-visit-parents@6.0.1:
+    resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
+
+  unist-util-visit@5.0.0:
+    resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+
+  universal-user-agent@7.0.2:
+    resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==}
+
+  universalify@2.0.1:
+    resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+    engines: {node: '>= 10.0.0'}
+
+  unplugin@1.16.1:
+    resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==}
+    engines: {node: '>=14.0.0'}
+
+  unrs-resolver@1.4.1:
+    resolution: {integrity: sha512-MhPB3wBI5BR8TGieTb08XuYlE8oFVEXdSAgat3psdlRyejl8ojQ8iqPcjh094qCZ1r+TnkxzP6BeCd/umfHckQ==}
+
+  update-browserslist-db@1.1.3:
+    resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
+    hasBin: true
+    peerDependencies:
+      browserslist: '>= 4.21.0'
+
+  uri-js@4.4.1:
+    resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+  url@0.11.4:
+    resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==}
+    engines: {node: '>= 0.4'}
+
+  use-composed-ref@1.4.0:
+    resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==}
+    peerDependencies:
+      '@types/react': '*'
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+    peerDependenciesMeta:
+      '@types/react':
+        optional: true
+
+  use-context-selector@2.0.0:
+    resolution: {integrity: sha512-owfuSmUNd3eNp3J9CdDl0kMgfidV+MkDvHPpvthN5ThqM+ibMccNE0k+Iq7TWC6JPFvGZqanqiGCuQx6DyV24g==}
+    peerDependencies:
+      react: '>=18.0.0'
+      scheduler: '>=0.19.0'
+
+  use-isomorphic-layout-effect@1.2.0:
+    resolution: {integrity: sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==}
+    peerDependencies:
+      '@types/react': '*'
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+    peerDependenciesMeta:
+      '@types/react':
+        optional: true
+
+  use-latest@1.3.0:
+    resolution: {integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==}
+    peerDependencies:
+      '@types/react': '*'
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+    peerDependenciesMeta:
+      '@types/react':
+        optional: true
+
+  use-strict@1.0.1:
+    resolution: {integrity: sha512-IeiWvvEXfW5ltKVMkxq6FvNf2LojMKvB2OCeja6+ct24S1XOmQw2dGr2JyndwACWAGJva9B7yPHwAmeA9QCqAQ==}
+
+  use-sync-external-store@1.5.0:
+    resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+  util-deprecate@1.0.2:
+    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+  util@0.12.5:
+    resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
+
+  utila@0.4.0:
+    resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==}
+
+  uuid@10.0.0:
+    resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
+    hasBin: true
+
+  uuid@9.0.1:
+    resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
+    hasBin: true
+
+  v8-compile-cache-lib@3.0.1:
+    resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+
+  v8-to-istanbul@9.3.0:
+    resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==}
+    engines: {node: '>=10.12.0'}
+
+  valibot@1.0.0:
+    resolution: {integrity: sha512-1Hc0ihzWxBar6NGeZv7fPLY0QuxFMyxwYR2sF1Blu7Wq7EnremwY2W02tit2ij2VJT8HcSkHAQqmFfl77f73Yw==}
+    peerDependencies:
+      typescript: '>=5'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  validate-npm-package-license@3.0.4:
+    resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+
+  vfile-location@5.0.3:
+    resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
+
+  vfile-message@4.0.2:
+    resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
+
+  vfile@6.0.3:
+    resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+
+  vite-code-inspector-plugin@0.18.3:
+    resolution: {integrity: sha512-178H73vbDUHE+JpvfAfioUHlUr7qXCYIEa2YNXtzenFQGOjtae59P1jjcxGfa6pPHEnOoaitb13K+0qxwhi/WA==}
+
+  vite-node@3.1.1:
+    resolution: {integrity: sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==}
+    engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+    hasBin: true
+
+  vite@6.2.6:
+    resolution: {integrity: sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==}
+    engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+    hasBin: true
+    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
+
+  vitest@3.1.1:
+    resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==}
+    engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+    hasBin: true
+    peerDependencies:
+      '@edge-runtime/vm': '*'
+      '@types/debug': ^4.1.12
+      '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+      '@vitest/browser': 3.1.1
+      '@vitest/ui': 3.1.1
+      happy-dom: '*'
+      jsdom: '*'
+    peerDependenciesMeta:
+      '@edge-runtime/vm':
+        optional: true
+      '@types/debug':
+        optional: true
+      '@types/node':
+        optional: true
+      '@vitest/browser':
+        optional: true
+      '@vitest/ui':
+        optional: true
+      happy-dom:
+        optional: true
+      jsdom:
+        optional: true
+
+  vm-browserify@1.1.2:
+    resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==}
+
+  void-elements@3.1.0:
+    resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==}
+    engines: {node: '>=0.10.0'}
+
+  vscode-jsonrpc@8.2.0:
+    resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==}
+    engines: {node: '>=14.0.0'}
+
+  vscode-languageserver-protocol@3.17.5:
+    resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==}
+
+  vscode-languageserver-textdocument@1.0.12:
+    resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==}
+
+  vscode-languageserver-types@3.17.5:
+    resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==}
+
+  vscode-languageserver@9.0.1:
+    resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==}
+    hasBin: true
+
+  vscode-uri@3.0.8:
+    resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
+
+  vue-eslint-parser@10.1.3:
+    resolution: {integrity: sha512-dbCBnd2e02dYWsXoqX5yKUZlOt+ExIpq7hmHKPb5ZqKcjf++Eo0hMseFTZMLKThrUk61m+Uv6A2YSBve6ZvuDQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+
+  walker@1.0.8:
+    resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+
+  watchpack@2.4.2:
+    resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==}
+    engines: {node: '>=10.13.0'}
+
+  web-namespaces@2.0.1:
+    resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+
+  webidl-conversions@3.0.1:
+    resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+  webidl-conversions@7.0.0:
+    resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+    engines: {node: '>=12'}
+
+  webpack-code-inspector-plugin@0.18.3:
+    resolution: {integrity: sha512-3782rsJhBnRiw0IpR6EqnyGDQoiSq0CcGeLJ52rZXlszYCe8igXtcujq7OhI0byaivWQ1LW7sXKyMEoVpBhq0w==}
+
+  webpack-dev-middleware@6.1.3:
+    resolution: {integrity: sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==}
+    engines: {node: '>= 14.15.0'}
+    peerDependencies:
+      webpack: ^5.0.0
+    peerDependenciesMeta:
+      webpack:
+        optional: true
+
+  webpack-hot-middleware@2.26.1:
+    resolution: {integrity: sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==}
+
+  webpack-sources@3.2.3:
+    resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
+    engines: {node: '>=10.13.0'}
+
+  webpack-virtual-modules@0.6.2:
+    resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+  webpack@5.99.5:
+    resolution: {integrity: sha512-q+vHBa6H9qwBLUlHL4Y7L0L1/LlyBKZtS9FHNCQmtayxjI5RKC9yD8gpvLeqGv5lCQp1Re04yi0MF40pf30Pvg==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+    peerDependencies:
+      webpack-cli: '*'
+    peerDependenciesMeta:
+      webpack-cli:
+        optional: true
+
+  whatwg-mimetype@3.0.0:
+    resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
+    engines: {node: '>=12'}
+
+  whatwg-url@5.0.0:
+    resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
+  which-boxed-primitive@1.1.1:
+    resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+    engines: {node: '>= 0.4'}
+
+  which-builtin-type@1.2.1:
+    resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+    engines: {node: '>= 0.4'}
+
+  which-collection@1.0.2:
+    resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+    engines: {node: '>= 0.4'}
+
+  which-typed-array@1.1.19:
+    resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
+    engines: {node: '>= 0.4'}
+
+  which@2.0.2:
+    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+    engines: {node: '>= 8'}
+    hasBin: true
+
+  why-is-node-running@2.3.0:
+    resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+    engines: {node: '>=8'}
+    hasBin: true
+
+  wide-align@1.1.5:
+    resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
+
+  word-wrap@1.2.5:
+    resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+    engines: {node: '>=0.10.0'}
+
+  wrap-ansi@7.0.0:
+    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+    engines: {node: '>=10'}
+
+  wrap-ansi@8.1.0:
+    resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+    engines: {node: '>=12'}
+
+  wrap-ansi@9.0.0:
+    resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==}
+    engines: {node: '>=18'}
+
+  wrappy@1.0.2:
+    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+  write-file-atomic@4.0.2:
+    resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
+    engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+  ws@8.18.1:
+    resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==}
+    engines: {node: '>=10.0.0'}
+    peerDependencies:
+      bufferutil: ^4.0.1
+      utf-8-validate: '>=5.0.2'
+    peerDependenciesMeta:
+      bufferutil:
+        optional: true
+      utf-8-validate:
+        optional: true
+
+  xml-name-validator@4.0.0:
+    resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
+    engines: {node: '>=12'}
+
+  xtend@4.0.2:
+    resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+    engines: {node: '>=0.4'}
+
+  y18n@5.0.8:
+    resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+    engines: {node: '>=10'}
+
+  yallist@3.1.1:
+    resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+  yallist@4.0.0:
+    resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+  yaml-eslint-parser@1.3.0:
+    resolution: {integrity: sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==}
+    engines: {node: ^14.17.0 || >=16.0.0}
+
+  yaml@1.10.2:
+    resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+    engines: {node: '>= 6'}
+
+  yaml@2.7.1:
+    resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==}
+    engines: {node: '>= 14'}
+    hasBin: true
+
+  yargs-parser@21.1.1:
+    resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+    engines: {node: '>=12'}
+
+  yargs@17.7.2:
+    resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+    engines: {node: '>=12'}
+
+  yjs@13.6.24:
+    resolution: {integrity: sha512-xn/pYLTZa3uD1uDG8lpxfLRo5SR/rp0frdASOl2a71aYNvUXdWcLtVL91s2y7j+Q8ppmjZ9H3jsGVgoFMbT2VA==}
+    engines: {node: '>=16.0.0', npm: '>=8.0.0'}
+
+  yn@3.1.1:
+    resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+    engines: {node: '>=6'}
+
+  yocto-queue@0.1.0:
+    resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+    engines: {node: '>=10'}
+
+  yocto-queue@1.2.1:
+    resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==}
+    engines: {node: '>=12.20'}
+
+  zod@3.24.2:
+    resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==}
+
+  zrender@5.6.1:
+    resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==}
+
+  zundo@2.3.0:
+    resolution: {integrity: sha512-4GXYxXA17SIKYhVbWHdSEU04P697IMyVGXrC2TnzoyohEAWytFNOKqOp5gTGvaW93F/PM5Y0evbGtOPF0PWQwQ==}
+    peerDependencies:
+      zustand: ^4.3.0 || ^5.0.0
+
+  zustand@4.5.6:
+    resolution: {integrity: sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==}
+    engines: {node: '>=12.7.0'}
+    peerDependencies:
+      '@types/react': ~18.2.0
+      immer: '>=9.0.6'
+      react: '>=16.8'
+    peerDependenciesMeta:
+      '@types/react':
+        optional: true
+      immer:
+        optional: true
+      react:
+        optional: true
+
+  zwitch@2.0.4:
+    resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
+snapshots:
+
+  '@adobe/css-tools@4.4.2': {}
+
+  '@alloc/quick-lru@5.2.0': {}
+
+  '@ampproject/remapping@2.3.0':
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.8
+      '@jridgewell/trace-mapping': 0.3.25
+
+  '@antfu/eslint-config@4.12.0(@eslint-react/eslint-plugin@1.45.0(eslint@9.24.0(jiti@1.21.7))(ts-api-utils@2.1.0(typescript@4.9.5))(typescript@4.9.5))(@typescript-eslint/utils@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(@vue/compiler-sfc@3.5.13)(eslint-plugin-react-hooks@5.2.0(eslint@9.24.0(jiti@1.21.7)))(eslint-plugin-react-refresh@0.4.19(eslint@9.24.0(jiti@1.21.7)))(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)(vitest@3.1.1(@types/debug@4.1.12)(@types/node@18.15.0)(happy-dom@17.4.4)(jiti@1.21.7)(sass@1.86.3)(terser@5.39.0)(yaml@2.7.1))':
+    dependencies:
+      '@antfu/install-pkg': 1.0.0
+      '@clack/prompts': 0.10.1
+      '@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.24.0(jiti@1.21.7))
+      '@eslint/markdown': 6.3.0
+      '@stylistic/eslint-plugin': 4.2.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/eslint-plugin': 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/parser': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@vitest/eslint-plugin': 1.1.42(@typescript-eslint/utils@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)(vitest@3.1.1(@types/debug@4.1.12)(@types/node@18.15.0)(happy-dom@17.4.4)(jiti@1.21.7)(sass@1.86.3)(terser@5.39.0)(yaml@2.7.1))
+      ansis: 3.17.0
+      cac: 6.7.14
+      eslint: 9.24.0(jiti@1.21.7)
+      eslint-config-flat-gitignore: 2.1.0(eslint@9.24.0(jiti@1.21.7))
+      eslint-flat-config-utils: 2.0.1
+      eslint-merge-processors: 2.0.0(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-antfu: 3.1.1(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-command: 3.2.0(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-import-x: 4.10.2(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint-plugin-jsdoc: 50.6.9(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-jsonc: 2.20.0(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-n: 17.17.0(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-no-only-tests: 3.3.0
+      eslint-plugin-perfectionist: 4.11.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint-plugin-pnpm: 0.3.1(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-regexp: 2.7.0(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-toml: 0.12.0(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-unicorn: 58.0.0(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-vue: 10.0.0(eslint@9.24.0(jiti@1.21.7))(vue-eslint-parser@10.1.3(eslint@9.24.0(jiti@1.21.7)))
+      eslint-plugin-yml: 1.17.0(eslint@9.24.0(jiti@1.21.7))
+      eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.24.0(jiti@1.21.7))
+      globals: 16.0.0
+      jsonc-eslint-parser: 2.4.0
+      local-pkg: 1.1.1
+      parse-gitignore: 2.0.0
+      toml-eslint-parser: 0.10.0
+      vue-eslint-parser: 10.1.3(eslint@9.24.0(jiti@1.21.7))
+      yaml-eslint-parser: 1.3.0
+    optionalDependencies:
+      '@eslint-react/eslint-plugin': 1.45.0(eslint@9.24.0(jiti@1.21.7))(ts-api-utils@2.1.0(typescript@4.9.5))(typescript@4.9.5)
+      eslint-plugin-react-hooks: 5.2.0(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-react-refresh: 0.4.19(eslint@9.24.0(jiti@1.21.7))
+    transitivePeerDependencies:
+      - '@eslint/json'
+      - '@typescript-eslint/utils'
+      - '@vue/compiler-sfc'
+      - supports-color
+      - typescript
+      - vitest
+
+  '@antfu/install-pkg@1.0.0':
+    dependencies:
+      package-manager-detector: 0.2.11
+      tinyexec: 0.3.2
+
+  '@antfu/utils@8.1.1': {}
+
+  '@babel/code-frame@7.26.2':
+    dependencies:
+      '@babel/helper-validator-identifier': 7.25.9
+      js-tokens: 4.0.0
+      picocolors: 1.1.1
+
+  '@babel/compat-data@7.26.8': {}
+
+  '@babel/core@7.26.10':
+    dependencies:
+      '@ampproject/remapping': 2.3.0
+      '@babel/code-frame': 7.26.2
+      '@babel/generator': 7.27.0
+      '@babel/helper-compilation-targets': 7.27.0
+      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10)
+      '@babel/helpers': 7.27.0
+      '@babel/parser': 7.27.0
+      '@babel/template': 7.27.0
+      '@babel/traverse': 7.27.0
+      '@babel/types': 7.27.0
+      convert-source-map: 2.0.0
+      debug: 4.4.0
+      gensync: 1.0.0-beta.2
+      json5: 2.2.3
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/generator@7.27.0':
+    dependencies:
+      '@babel/parser': 7.27.0
+      '@babel/types': 7.27.0
+      '@jridgewell/gen-mapping': 0.3.8
+      '@jridgewell/trace-mapping': 0.3.25
+      jsesc: 3.1.0
+
+  '@babel/helper-annotate-as-pure@7.25.9':
+    dependencies:
+      '@babel/types': 7.27.0
+
+  '@babel/helper-compilation-targets@7.27.0':
+    dependencies:
+      '@babel/compat-data': 7.26.8
+      '@babel/helper-validator-option': 7.25.9
+      browserslist: 4.24.4
+      lru-cache: 5.1.1
+      semver: 6.3.1
+
+  '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-annotate-as-pure': 7.25.9
+      '@babel/helper-member-expression-to-functions': 7.25.9
+      '@babel/helper-optimise-call-expression': 7.25.9
+      '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10)
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+      '@babel/traverse': 7.27.0
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-annotate-as-pure': 7.25.9
+      regexpu-core: 6.2.0
+      semver: 6.3.1
+
+  '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-compilation-targets': 7.27.0
+      '@babel/helper-plugin-utils': 7.26.5
+      debug: 4.4.0
+      lodash.debounce: 4.0.8
+      resolve: 1.22.10
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-member-expression-to-functions@7.25.9':
+    dependencies:
+      '@babel/traverse': 7.27.0
+      '@babel/types': 7.27.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-module-imports@7.25.9':
+    dependencies:
+      '@babel/traverse': 7.27.0
+      '@babel/types': 7.27.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-module-imports': 7.25.9
+      '@babel/helper-validator-identifier': 7.25.9
+      '@babel/traverse': 7.27.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-optimise-call-expression@7.25.9':
+    dependencies:
+      '@babel/types': 7.27.0
+
+  '@babel/helper-plugin-utils@7.26.5': {}
+
+  '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-annotate-as-pure': 7.25.9
+      '@babel/helper-wrap-function': 7.25.9
+      '@babel/traverse': 7.27.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-member-expression-to-functions': 7.25.9
+      '@babel/helper-optimise-call-expression': 7.25.9
+      '@babel/traverse': 7.27.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
+    dependencies:
+      '@babel/traverse': 7.27.0
+      '@babel/types': 7.27.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-string-parser@7.25.9': {}
+
+  '@babel/helper-validator-identifier@7.25.9': {}
+
+  '@babel/helper-validator-option@7.25.9': {}
+
+  '@babel/helper-wrap-function@7.25.9':
+    dependencies:
+      '@babel/template': 7.27.0
+      '@babel/traverse': 7.27.0
+      '@babel/types': 7.27.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helpers@7.27.0':
+    dependencies:
+      '@babel/template': 7.27.0
+      '@babel/types': 7.27.0
+
+  '@babel/parser@7.27.0':
+    dependencies:
+      '@babel/types': 7.27.0
+
+  '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/traverse': 7.27.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+      '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/traverse': 7.27.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+
+  '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10)
+      '@babel/traverse': 7.27.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-module-imports': 7.25.9
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-annotate-as-pure': 7.25.9
+      '@babel/helper-compilation-targets': 7.27.0
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10)
+      '@babel/traverse': 7.27.0
+      globals: 11.12.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/template': 7.27.0
+
+  '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-compilation-targets': 7.27.0
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/traverse': 7.27.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-validator-identifier': 7.25.9
+      '@babel/traverse': 7.27.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-compilation-targets': 7.27.0
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10)
+
+  '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-annotate-as-pure': 7.25.9
+      '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-annotate-as-pure': 7.25.9
+      '@babel/helper-module-imports': 7.25.9
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10)
+      '@babel/types': 7.27.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-annotate-as-pure': 7.25.9
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+      regenerator-transform: 0.15.2
+
+  '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-runtime@7.26.10(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-module-imports': 7.25.9
+      '@babel/helper-plugin-utils': 7.26.5
+      babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10)
+      babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10)
+      babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10)
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-annotate-as-pure': 7.25.9
+      '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+      '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10)
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/preset-env@7.26.9(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/compat-data': 7.26.8
+      '@babel/core': 7.26.10
+      '@babel/helper-compilation-targets': 7.27.0
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-validator-option': 7.25.9
+      '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)
+      '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.10)
+      '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10)
+      '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10)
+      '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10)
+      '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.10)
+      '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.26.10)
+      '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.10)
+      '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.10)
+      '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10)
+      '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.10)
+      '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.26.10)
+      '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.10)
+      '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.10)
+      '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.26.10)
+      '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.10)
+      '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10)
+      babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10)
+      babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10)
+      babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10)
+      core-js-compat: 3.41.0
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/types': 7.27.0
+      esutils: 2.0.3
+
+  '@babel/preset-react@7.26.3(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-validator-option': 7.25.9
+      '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.10)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/preset-typescript@7.27.0(@babel/core@7.26.10)':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+      '@babel/helper-validator-option': 7.25.9
+      '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10)
+      '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/runtime@7.27.0':
+    dependencies:
+      regenerator-runtime: 0.14.1
+
+  '@babel/template@7.27.0':
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      '@babel/parser': 7.27.0
+      '@babel/types': 7.27.0
+
+  '@babel/traverse@7.27.0':
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      '@babel/generator': 7.27.0
+      '@babel/parser': 7.27.0
+      '@babel/template': 7.27.0
+      '@babel/types': 7.27.0
+      debug: 4.4.0
+      globals: 11.12.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/types@7.27.0':
+    dependencies:
+      '@babel/helper-string-parser': 7.25.9
+      '@babel/helper-validator-identifier': 7.25.9
+
+  '@bcoe/v8-coverage@0.2.3': {}
+
+  '@braintree/sanitize-url@7.1.1': {}
+
+  '@chevrotain/cst-dts-gen@11.0.3':
+    dependencies:
+      '@chevrotain/gast': 11.0.3
+      '@chevrotain/types': 11.0.3
+      lodash-es: 4.17.21
+
+  '@chevrotain/gast@11.0.3':
+    dependencies:
+      '@chevrotain/types': 11.0.3
+      lodash-es: 4.17.21
+
+  '@chevrotain/regexp-to-ast@11.0.3': {}
+
+  '@chevrotain/types@11.0.3': {}
+
+  '@chevrotain/utils@11.0.3': {}
+
+  '@chromatic-com/storybook@3.2.6(react@19.0.0)(storybook@8.5.0)':
+    dependencies:
+      chromatic: 11.28.0
+      filesize: 10.1.6
+      jsonfile: 6.1.0
+      react-confetti: 6.4.0(react@19.0.0)
+      storybook: 8.5.0
+      strip-ansi: 7.1.0
+    transitivePeerDependencies:
+      - '@chromatic-com/cypress'
+      - '@chromatic-com/playwright'
+      - react
+
+  '@clack/core@0.4.2':
+    dependencies:
+      picocolors: 1.1.1
+      sisteransi: 1.0.5
+
+  '@clack/prompts@0.10.1':
+    dependencies:
+      '@clack/core': 0.4.2
+      picocolors: 1.1.1
+      sisteransi: 1.0.5
+
+  '@cspotcode/source-map-support@0.8.1':
+    dependencies:
+      '@jridgewell/trace-mapping': 0.3.9
+
+  '@dagrejs/dagre@1.1.4':
+    dependencies:
+      '@dagrejs/graphlib': 2.2.4
+
+  '@dagrejs/graphlib@2.2.4': {}
+
+  '@emnapi/core@1.4.0':
+    dependencies:
+      '@emnapi/wasi-threads': 1.0.1
+      tslib: 2.8.1
+    optional: true
+
+  '@emnapi/runtime@1.4.0':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@emnapi/wasi-threads@1.0.1':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@emoji-mart/data@1.2.1': {}
+
+  '@es-joy/jsdoccomment@0.49.0':
+    dependencies:
+      comment-parser: 1.4.1
+      esquery: 1.6.0
+      jsdoc-type-pratt-parser: 4.1.0
+
+  '@es-joy/jsdoccomment@0.50.0':
+    dependencies:
+      '@types/eslint': 9.6.1
+      '@types/estree': 1.0.7
+      '@typescript-eslint/types': 8.29.1
+      comment-parser: 1.4.1
+      esquery: 1.6.0
+      jsdoc-type-pratt-parser: 4.1.0
+
+  '@esbuild/aix-ppc64@0.25.0':
+    optional: true
+
+  '@esbuild/aix-ppc64@0.25.2':
+    optional: true
+
+  '@esbuild/android-arm64@0.25.0':
+    optional: true
+
+  '@esbuild/android-arm64@0.25.2':
+    optional: true
+
+  '@esbuild/android-arm@0.25.0':
+    optional: true
+
+  '@esbuild/android-arm@0.25.2':
+    optional: true
+
+  '@esbuild/android-x64@0.25.0':
+    optional: true
+
+  '@esbuild/android-x64@0.25.2':
+    optional: true
+
+  '@esbuild/darwin-arm64@0.25.0':
+    optional: true
+
+  '@esbuild/darwin-arm64@0.25.2':
+    optional: true
+
+  '@esbuild/darwin-x64@0.25.0':
+    optional: true
+
+  '@esbuild/darwin-x64@0.25.2':
+    optional: true
+
+  '@esbuild/freebsd-arm64@0.25.0':
+    optional: true
+
+  '@esbuild/freebsd-arm64@0.25.2':
+    optional: true
+
+  '@esbuild/freebsd-x64@0.25.0':
+    optional: true
+
+  '@esbuild/freebsd-x64@0.25.2':
+    optional: true
+
+  '@esbuild/linux-arm64@0.25.0':
+    optional: true
+
+  '@esbuild/linux-arm64@0.25.2':
+    optional: true
+
+  '@esbuild/linux-arm@0.25.0':
+    optional: true
+
+  '@esbuild/linux-arm@0.25.2':
+    optional: true
+
+  '@esbuild/linux-ia32@0.25.0':
+    optional: true
+
+  '@esbuild/linux-ia32@0.25.2':
+    optional: true
+
+  '@esbuild/linux-loong64@0.25.0':
+    optional: true
+
+  '@esbuild/linux-loong64@0.25.2':
+    optional: true
+
+  '@esbuild/linux-mips64el@0.25.0':
+    optional: true
+
+  '@esbuild/linux-mips64el@0.25.2':
+    optional: true
+
+  '@esbuild/linux-ppc64@0.25.0':
+    optional: true
+
+  '@esbuild/linux-ppc64@0.25.2':
+    optional: true
+
+  '@esbuild/linux-riscv64@0.25.0':
+    optional: true
+
+  '@esbuild/linux-riscv64@0.25.2':
+    optional: true
+
+  '@esbuild/linux-s390x@0.25.0':
+    optional: true
+
+  '@esbuild/linux-s390x@0.25.2':
+    optional: true
+
+  '@esbuild/linux-x64@0.25.0':
+    optional: true
+
+  '@esbuild/linux-x64@0.25.2':
+    optional: true
+
+  '@esbuild/netbsd-arm64@0.25.0':
+    optional: true
+
+  '@esbuild/netbsd-arm64@0.25.2':
+    optional: true
+
+  '@esbuild/netbsd-x64@0.25.0':
+    optional: true
+
+  '@esbuild/netbsd-x64@0.25.2':
+    optional: true
+
+  '@esbuild/openbsd-arm64@0.25.0':
+    optional: true
+
+  '@esbuild/openbsd-arm64@0.25.2':
+    optional: true
+
+  '@esbuild/openbsd-x64@0.25.0':
+    optional: true
+
+  '@esbuild/openbsd-x64@0.25.2':
+    optional: true
+
+  '@esbuild/sunos-x64@0.25.0':
+    optional: true
+
+  '@esbuild/sunos-x64@0.25.2':
+    optional: true
+
+  '@esbuild/win32-arm64@0.25.0':
+    optional: true
+
+  '@esbuild/win32-arm64@0.25.2':
+    optional: true
+
+  '@esbuild/win32-ia32@0.25.0':
+    optional: true
+
+  '@esbuild/win32-ia32@0.25.2':
+    optional: true
+
+  '@esbuild/win32-x64@0.25.0':
+    optional: true
+
+  '@esbuild/win32-x64@0.25.2':
+    optional: true
+
+  '@eslint-community/eslint-plugin-eslint-comments@4.4.1(eslint@9.24.0(jiti@1.21.7))':
+    dependencies:
+      escape-string-regexp: 4.0.0
+      eslint: 9.24.0(jiti@1.21.7)
+      ignore: 5.3.2
+
+  '@eslint-community/eslint-utils@4.5.1(eslint@9.24.0(jiti@1.21.7))':
+    dependencies:
+      eslint: 9.24.0(jiti@1.21.7)
+      eslint-visitor-keys: 3.4.3
+
+  '@eslint-community/regexpp@4.12.1': {}
+
+  '@eslint-react/ast@1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)':
+    dependencies:
+      '@eslint-react/eff': 1.45.0
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/typescript-estree': 8.29.1(typescript@4.9.5)
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      string-ts: 2.2.1
+      ts-pattern: 5.7.0
+    transitivePeerDependencies:
+      - eslint
+      - supports-color
+      - typescript
+
+  '@eslint-react/core@1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)':
+    dependencies:
+      '@eslint-react/ast': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/eff': 1.45.0
+      '@eslint-react/jsx': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/kit': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/shared': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/var': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/scope-manager': 8.29.1
+      '@typescript-eslint/type-utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      birecord: 0.1.1
+      ts-pattern: 5.7.0
+    transitivePeerDependencies:
+      - eslint
+      - supports-color
+      - typescript
+
+  '@eslint-react/eff@1.45.0': {}
+
+  '@eslint-react/eslint-plugin@1.45.0(eslint@9.24.0(jiti@1.21.7))(ts-api-utils@2.1.0(typescript@4.9.5))(typescript@4.9.5)':
+    dependencies:
+      '@eslint-react/eff': 1.45.0
+      '@eslint-react/kit': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/shared': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/scope-manager': 8.29.1
+      '@typescript-eslint/type-utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint: 9.24.0(jiti@1.21.7)
+      eslint-plugin-react-debug: 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint-plugin-react-dom: 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint-plugin-react-hooks-extra: 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint-plugin-react-naming-convention: 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint-plugin-react-web-api: 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint-plugin-react-x: 1.45.0(eslint@9.24.0(jiti@1.21.7))(ts-api-utils@2.1.0(typescript@4.9.5))(typescript@4.9.5)
+    optionalDependencies:
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+      - ts-api-utils
+
+  '@eslint-react/jsx@1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)':
+    dependencies:
+      '@eslint-react/ast': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/eff': 1.45.0
+      '@eslint-react/var': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/scope-manager': 8.29.1
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      ts-pattern: 5.7.0
+    transitivePeerDependencies:
+      - eslint
+      - supports-color
+      - typescript
+
+  '@eslint-react/kit@1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)':
+    dependencies:
+      '@eslint-react/eff': 1.45.0
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      ts-pattern: 5.7.0
+      valibot: 1.0.0(typescript@4.9.5)
+    transitivePeerDependencies:
+      - eslint
+      - supports-color
+      - typescript
+
+  '@eslint-react/shared@1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)':
+    dependencies:
+      '@eslint-react/eff': 1.45.0
+      '@eslint-react/kit': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@zod/mini': 4.0.0-beta.0
+      picomatch: 4.0.2
+      ts-pattern: 5.7.0
+    transitivePeerDependencies:
+      - eslint
+      - supports-color
+      - typescript
+
+  '@eslint-react/var@1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)':
+    dependencies:
+      '@eslint-react/ast': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/eff': 1.45.0
+      '@typescript-eslint/scope-manager': 8.29.1
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      string-ts: 2.2.1
+      ts-pattern: 5.7.0
+    transitivePeerDependencies:
+      - eslint
+      - supports-color
+      - typescript
+
+  '@eslint/compat@1.2.8(eslint@9.24.0(jiti@1.21.7))':
+    optionalDependencies:
+      eslint: 9.24.0(jiti@1.21.7)
+
+  '@eslint/config-array@0.20.0':
+    dependencies:
+      '@eslint/object-schema': 2.1.6
+      debug: 4.4.0
+      minimatch: 3.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@eslint/config-helpers@0.2.1': {}
+
+  '@eslint/core@0.10.0':
+    dependencies:
+      '@types/json-schema': 7.0.15
+
+  '@eslint/core@0.12.0':
+    dependencies:
+      '@types/json-schema': 7.0.15
+
+  '@eslint/core@0.13.0':
+    dependencies:
+      '@types/json-schema': 7.0.15
+
+  '@eslint/eslintrc@3.3.1':
+    dependencies:
+      ajv: 6.12.6
+      debug: 4.4.0
+      espree: 10.3.0
+      globals: 14.0.0
+      ignore: 5.3.2
+      import-fresh: 3.3.1
+      js-yaml: 4.1.0
+      minimatch: 3.1.2
+      strip-json-comments: 3.1.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@eslint/js@9.24.0': {}
+
+  '@eslint/markdown@6.3.0':
+    dependencies:
+      '@eslint/core': 0.10.0
+      '@eslint/plugin-kit': 0.2.8
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-gfm: 3.1.0
+      micromark-extension-gfm: 3.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@eslint/object-schema@2.1.6': {}
+
+  '@eslint/plugin-kit@0.2.8':
+    dependencies:
+      '@eslint/core': 0.13.0
+      levn: 0.4.1
+
+  '@faker-js/faker@9.6.0': {}
+
+  '@floating-ui/core@1.6.9':
+    dependencies:
+      '@floating-ui/utils': 0.2.9
+
+  '@floating-ui/dom@1.1.1':
+    dependencies:
+      '@floating-ui/core': 1.6.9
+
+  '@floating-ui/dom@1.6.13':
+    dependencies:
+      '@floating-ui/core': 1.6.9
+      '@floating-ui/utils': 0.2.9
+
+  '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@floating-ui/dom': 1.6.13
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  '@floating-ui/react@0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@floating-ui/utils': 0.2.9
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      tabbable: 6.2.0
+
+  '@floating-ui/utils@0.2.9': {}
+
+  '@formatjs/intl-localematcher@0.5.10':
+    dependencies:
+      tslib: 2.8.1
+
+  '@happy-dom/jest-environment@17.4.4':
+    dependencies:
+      '@jest/environment': 29.7.0
+      '@jest/fake-timers': 29.7.0
+      '@jest/types': 29.6.3
+      happy-dom: 17.4.4
+      jest-mock: 29.7.0
+      jest-util: 29.7.0
+
+  '@headlessui/react@2.2.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@react-aria/focus': 3.20.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@react-aria/interactions': 3.24.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@tanstack/react-virtual': 3.13.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  '@heroicons/react@2.2.0(react@19.0.0)':
+    dependencies:
+      react: 19.0.0
+
+  '@hookform/resolvers@3.10.0(react-hook-form@7.55.0(react@19.0.0))':
+    dependencies:
+      react-hook-form: 7.55.0(react@19.0.0)
+
+  '@humanfs/core@0.19.1': {}
+
+  '@humanfs/node@0.16.6':
+    dependencies:
+      '@humanfs/core': 0.19.1
+      '@humanwhocodes/retry': 0.3.1
+
+  '@humanwhocodes/module-importer@1.0.1': {}
+
+  '@humanwhocodes/retry@0.3.1': {}
+
+  '@humanwhocodes/retry@0.4.2': {}
+
+  '@iconify/types@2.0.0': {}
+
+  '@iconify/utils@2.3.0':
+    dependencies:
+      '@antfu/install-pkg': 1.0.0
+      '@antfu/utils': 8.1.1
+      '@iconify/types': 2.0.0
+      debug: 4.4.0
+      globals: 15.15.0
+      kolorist: 1.8.0
+      local-pkg: 1.1.1
+      mlly: 1.7.4
+    transitivePeerDependencies:
+      - supports-color
+
+  '@img/sharp-darwin-arm64@0.33.5':
+    optionalDependencies:
+      '@img/sharp-libvips-darwin-arm64': 1.0.4
+    optional: true
+
+  '@img/sharp-darwin-x64@0.33.5':
+    optionalDependencies:
+      '@img/sharp-libvips-darwin-x64': 1.0.4
+    optional: true
+
+  '@img/sharp-libvips-darwin-arm64@1.0.4':
+    optional: true
+
+  '@img/sharp-libvips-darwin-x64@1.0.4':
+    optional: true
+
+  '@img/sharp-libvips-linux-arm64@1.0.4':
+    optional: true
+
+  '@img/sharp-libvips-linux-arm@1.0.5':
+    optional: true
+
+  '@img/sharp-libvips-linux-s390x@1.0.4':
+    optional: true
+
+  '@img/sharp-libvips-linux-x64@1.0.4':
+    optional: true
+
+  '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
+    optional: true
+
+  '@img/sharp-libvips-linuxmusl-x64@1.0.4':
+    optional: true
+
+  '@img/sharp-linux-arm64@0.33.5':
+    optionalDependencies:
+      '@img/sharp-libvips-linux-arm64': 1.0.4
+    optional: true
+
+  '@img/sharp-linux-arm@0.33.5':
+    optionalDependencies:
+      '@img/sharp-libvips-linux-arm': 1.0.5
+    optional: true
+
+  '@img/sharp-linux-s390x@0.33.5':
+    optionalDependencies:
+      '@img/sharp-libvips-linux-s390x': 1.0.4
+    optional: true
+
+  '@img/sharp-linux-x64@0.33.5':
+    optionalDependencies:
+      '@img/sharp-libvips-linux-x64': 1.0.4
+    optional: true
+
+  '@img/sharp-linuxmusl-arm64@0.33.5':
+    optionalDependencies:
+      '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
+    optional: true
+
+  '@img/sharp-linuxmusl-x64@0.33.5':
+    optionalDependencies:
+      '@img/sharp-libvips-linuxmusl-x64': 1.0.4
+    optional: true
+
+  '@img/sharp-wasm32@0.33.5':
+    dependencies:
+      '@emnapi/runtime': 1.4.0
+    optional: true
+
+  '@img/sharp-win32-ia32@0.33.5':
+    optional: true
+
+  '@img/sharp-win32-x64@0.33.5':
+    optional: true
+
+  '@isaacs/cliui@8.0.2':
+    dependencies:
+      string-width: 4.2.3
+      string-width-cjs: string-width@4.2.3
+      strip-ansi: 7.1.0
+      strip-ansi-cjs: strip-ansi@6.0.1
+      wrap-ansi: 8.1.0
+      wrap-ansi-cjs: wrap-ansi@7.0.0
+
+  '@istanbuljs/load-nyc-config@1.1.0':
+    dependencies:
+      camelcase: 5.3.1
+      find-up: 4.1.0
+      get-package-type: 0.1.0
+      js-yaml: 3.14.1
+      resolve-from: 5.0.0
+
+  '@istanbuljs/schema@0.1.3': {}
+
+  '@jest/console@29.7.0':
+    dependencies:
+      '@jest/types': 29.6.3
+      '@types/node': 18.15.0
+      chalk: 4.1.2
+      jest-message-util: 29.7.0
+      jest-util: 29.7.0
+      slash: 3.0.0
+
+  '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5))':
+    dependencies:
+      '@jest/console': 29.7.0
+      '@jest/reporters': 29.7.0
+      '@jest/test-result': 29.7.0
+      '@jest/transform': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 18.15.0
+      ansi-escapes: 4.3.2
+      chalk: 4.1.2
+      ci-info: 3.9.0
+      exit: 0.1.2
+      graceful-fs: 4.2.11
+      jest-changed-files: 29.7.0
+      jest-config: 29.7.0(@types/node@18.15.0)(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5))
+      jest-haste-map: 29.7.0
+      jest-message-util: 29.7.0
+      jest-regex-util: 29.6.3
+      jest-resolve: 29.7.0
+      jest-resolve-dependencies: 29.7.0
+      jest-runner: 29.7.0
+      jest-runtime: 29.7.0
+      jest-snapshot: 29.7.0
+      jest-util: 29.7.0
+      jest-validate: 29.7.0
+      jest-watcher: 29.7.0
+      micromatch: 4.0.8
+      pretty-format: 29.7.0
+      slash: 3.0.0
+      strip-ansi: 6.0.1
+    transitivePeerDependencies:
+      - babel-plugin-macros
+      - supports-color
+      - ts-node
+
+  '@jest/environment@29.7.0':
+    dependencies:
+      '@jest/fake-timers': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 18.15.0
+      jest-mock: 29.7.0
+
+  '@jest/expect-utils@29.7.0':
+    dependencies:
+      jest-get-type: 29.6.3
+
+  '@jest/expect@29.7.0':
+    dependencies:
+      expect: 29.7.0
+      jest-snapshot: 29.7.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@jest/fake-timers@29.7.0':
+    dependencies:
+      '@jest/types': 29.6.3
+      '@sinonjs/fake-timers': 10.3.0
+      '@types/node': 18.15.0
+      jest-message-util: 29.7.0
+      jest-mock: 29.7.0
+      jest-util: 29.7.0
+
+  '@jest/globals@29.7.0':
+    dependencies:
+      '@jest/environment': 29.7.0
+      '@jest/expect': 29.7.0
+      '@jest/types': 29.6.3
+      jest-mock: 29.7.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@jest/reporters@29.7.0':
+    dependencies:
+      '@bcoe/v8-coverage': 0.2.3
+      '@jest/console': 29.7.0
+      '@jest/test-result': 29.7.0
+      '@jest/transform': 29.7.0
+      '@jest/types': 29.6.3
+      '@jridgewell/trace-mapping': 0.3.25
+      '@types/node': 18.15.0
+      chalk: 4.1.2
+      collect-v8-coverage: 1.0.2
+      exit: 0.1.2
+      glob: 7.2.3
+      graceful-fs: 4.2.11
+      istanbul-lib-coverage: 3.2.2
+      istanbul-lib-instrument: 6.0.3
+      istanbul-lib-report: 3.0.1
+      istanbul-lib-source-maps: 4.0.1
+      istanbul-reports: 3.1.7
+      jest-message-util: 29.7.0
+      jest-util: 29.7.0
+      jest-worker: 29.7.0
+      slash: 3.0.0
+      string-length: 4.0.2
+      strip-ansi: 6.0.1
+      v8-to-istanbul: 9.3.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@jest/schemas@29.6.3':
+    dependencies:
+      '@sinclair/typebox': 0.27.8
+
+  '@jest/source-map@29.6.3':
+    dependencies:
+      '@jridgewell/trace-mapping': 0.3.25
+      callsites: 3.1.0
+      graceful-fs: 4.2.11
+
+  '@jest/test-result@29.7.0':
+    dependencies:
+      '@jest/console': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/istanbul-lib-coverage': 2.0.6
+      collect-v8-coverage: 1.0.2
+
+  '@jest/test-sequencer@29.7.0':
+    dependencies:
+      '@jest/test-result': 29.7.0
+      graceful-fs: 4.2.11
+      jest-haste-map: 29.7.0
+      slash: 3.0.0
+
+  '@jest/transform@29.7.0':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@jest/types': 29.6.3
+      '@jridgewell/trace-mapping': 0.3.25
+      babel-plugin-istanbul: 6.1.1
+      chalk: 4.1.2
+      convert-source-map: 2.0.0
+      fast-json-stable-stringify: 2.1.0
+      graceful-fs: 4.2.11
+      jest-haste-map: 29.7.0
+      jest-regex-util: 29.6.3
+      jest-util: 29.7.0
+      micromatch: 4.0.8
+      pirates: 4.0.7
+      slash: 3.0.0
+      write-file-atomic: 4.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@jest/types@29.6.3':
+    dependencies:
+      '@jest/schemas': 29.6.3
+      '@types/istanbul-lib-coverage': 2.0.6
+      '@types/istanbul-reports': 3.0.4
+      '@types/node': 18.15.0
+      '@types/yargs': 17.0.33
+      chalk: 4.1.2
+
+  '@jridgewell/gen-mapping@0.3.8':
+    dependencies:
+      '@jridgewell/set-array': 1.2.1
+      '@jridgewell/sourcemap-codec': 1.5.0
+      '@jridgewell/trace-mapping': 0.3.25
+
+  '@jridgewell/resolve-uri@3.1.2': {}
+
+  '@jridgewell/set-array@1.2.1': {}
+
+  '@jridgewell/source-map@0.3.6':
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.8
+      '@jridgewell/trace-mapping': 0.3.25
+
+  '@jridgewell/sourcemap-codec@1.5.0': {}
+
+  '@jridgewell/trace-mapping@0.3.25':
+    dependencies:
+      '@jridgewell/resolve-uri': 3.1.2
+      '@jridgewell/sourcemap-codec': 1.5.0
+
+  '@jridgewell/trace-mapping@0.3.9':
+    dependencies:
+      '@jridgewell/resolve-uri': 3.1.2
+      '@jridgewell/sourcemap-codec': 1.5.0
+
+  '@lexical/clipboard@0.30.0':
+    dependencies:
+      '@lexical/html': 0.30.0
+      '@lexical/list': 0.30.0
+      '@lexical/selection': 0.30.0
+      '@lexical/utils': 0.30.0
+      lexical: 0.30.0
+
+  '@lexical/code@0.30.0':
+    dependencies:
+      '@lexical/utils': 0.30.0
+      lexical: 0.30.0
+      prismjs: 1.30.0
+
+  '@lexical/devtools-core@0.30.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@lexical/html': 0.30.0
+      '@lexical/link': 0.30.0
+      '@lexical/mark': 0.30.0
+      '@lexical/table': 0.30.0
+      '@lexical/utils': 0.30.0
+      lexical: 0.30.0
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  '@lexical/dragon@0.30.0':
+    dependencies:
+      lexical: 0.30.0
+
+  '@lexical/hashtag@0.30.0':
+    dependencies:
+      '@lexical/utils': 0.30.0
+      lexical: 0.30.0
+
+  '@lexical/history@0.30.0':
+    dependencies:
+      '@lexical/utils': 0.30.0
+      lexical: 0.30.0
+
+  '@lexical/html@0.30.0':
+    dependencies:
+      '@lexical/selection': 0.30.0
+      '@lexical/utils': 0.30.0
+      lexical: 0.30.0
+
+  '@lexical/link@0.30.0':
+    dependencies:
+      '@lexical/utils': 0.30.0
+      lexical: 0.30.0
+
+  '@lexical/list@0.30.0':
+    dependencies:
+      '@lexical/selection': 0.30.0
+      '@lexical/utils': 0.30.0
+      lexical: 0.30.0
+
+  '@lexical/mark@0.30.0':
+    dependencies:
+      '@lexical/utils': 0.30.0
+      lexical: 0.30.0
+
+  '@lexical/markdown@0.30.0':
+    dependencies:
+      '@lexical/code': 0.30.0
+      '@lexical/link': 0.30.0
+      '@lexical/list': 0.30.0
+      '@lexical/rich-text': 0.30.0
+      '@lexical/text': 0.30.0
+      '@lexical/utils': 0.30.0
+      lexical: 0.30.0
+
+  '@lexical/offset@0.30.0':
+    dependencies:
+      lexical: 0.30.0
+
+  '@lexical/overflow@0.30.0':
+    dependencies:
+      lexical: 0.30.0
+
+  '@lexical/plain-text@0.30.0':
+    dependencies:
+      '@lexical/clipboard': 0.30.0
+      '@lexical/selection': 0.30.0
+      '@lexical/utils': 0.30.0
+      lexical: 0.30.0
+
+  '@lexical/react@0.30.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.24)':
+    dependencies:
+      '@lexical/devtools-core': 0.30.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@lexical/dragon': 0.30.0
+      '@lexical/hashtag': 0.30.0
+      '@lexical/history': 0.30.0
+      '@lexical/link': 0.30.0
+      '@lexical/list': 0.30.0
+      '@lexical/mark': 0.30.0
+      '@lexical/markdown': 0.30.0
+      '@lexical/overflow': 0.30.0
+      '@lexical/plain-text': 0.30.0
+      '@lexical/rich-text': 0.30.0
+      '@lexical/table': 0.30.0
+      '@lexical/text': 0.30.0
+      '@lexical/utils': 0.30.0
+      '@lexical/yjs': 0.30.0(yjs@13.6.24)
+      lexical: 0.30.0
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      react-error-boundary: 3.1.4(react@19.0.0)
+    transitivePeerDependencies:
+      - yjs
+
+  '@lexical/rich-text@0.30.0':
+    dependencies:
+      '@lexical/clipboard': 0.30.0
+      '@lexical/selection': 0.30.0
+      '@lexical/utils': 0.30.0
+      lexical: 0.30.0
+
+  '@lexical/selection@0.30.0':
+    dependencies:
+      lexical: 0.30.0
+
+  '@lexical/table@0.30.0':
+    dependencies:
+      '@lexical/clipboard': 0.30.0
+      '@lexical/utils': 0.30.0
+      lexical: 0.30.0
+
+  '@lexical/text@0.30.0':
+    dependencies:
+      lexical: 0.30.0
+
+  '@lexical/utils@0.30.0':
+    dependencies:
+      '@lexical/list': 0.30.0
+      '@lexical/selection': 0.30.0
+      '@lexical/table': 0.30.0
+      lexical: 0.30.0
+
+  '@lexical/yjs@0.30.0(yjs@13.6.24)':
+    dependencies:
+      '@lexical/offset': 0.30.0
+      '@lexical/selection': 0.30.0
+      lexical: 0.30.0
+      yjs: 13.6.24
+
+  '@mapbox/node-pre-gyp@1.0.11':
+    dependencies:
+      detect-libc: 2.0.3
+      https-proxy-agent: 5.0.1
+      make-dir: 3.1.0
+      node-fetch: 2.7.0
+      nopt: 5.0.0
+      npmlog: 5.0.1
+      rimraf: 3.0.2
+      semver: 7.7.1
+      tar: 6.2.1
+    transitivePeerDependencies:
+      - encoding
+      - supports-color
+    optional: true
+
+  '@mdx-js/loader@3.1.0(acorn@8.14.1)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))':
+    dependencies:
+      '@mdx-js/mdx': 3.1.0(acorn@8.14.1)
+      source-map: 0.7.4
+    optionalDependencies:
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+    transitivePeerDependencies:
+      - acorn
+      - supports-color
+
+  '@mdx-js/mdx@3.1.0(acorn@8.14.1)':
+    dependencies:
+      '@types/estree': 1.0.7
+      '@types/estree-jsx': 1.0.5
+      '@types/hast': 3.0.4
+      '@types/mdx': 2.0.13
+      collapse-white-space: 2.1.0
+      devlop: 1.1.0
+      estree-util-is-identifier-name: 3.0.0
+      estree-util-scope: 1.0.0
+      estree-walker: 3.0.3
+      hast-util-to-jsx-runtime: 2.3.6
+      markdown-extensions: 2.0.0
+      recma-build-jsx: 1.0.0
+      recma-jsx: 1.0.0(acorn@8.14.1)
+      recma-stringify: 1.0.0
+      rehype-recma: 1.0.0
+      remark-mdx: 3.1.0
+      remark-parse: 11.0.0
+      remark-rehype: 11.1.2
+      source-map: 0.7.4
+      unified: 11.0.5
+      unist-util-position-from-estree: 2.0.0
+      unist-util-stringify-position: 4.0.0
+      unist-util-visit: 5.0.0
+      vfile: 6.0.3
+    transitivePeerDependencies:
+      - acorn
+      - supports-color
+
+  '@mdx-js/react@3.1.0(@types/react@18.2.79)(react@18.3.1)':
+    dependencies:
+      '@types/mdx': 2.0.13
+      '@types/react': 18.2.79
+      react: 18.3.1
+
+  '@mdx-js/react@3.1.0(@types/react@18.2.79)(react@19.0.0)':
+    dependencies:
+      '@types/mdx': 2.0.13
+      '@types/react': 18.2.79
+      react: 19.0.0
+
+  '@mermaid-js/parser@0.3.0':
+    dependencies:
+      langium: 3.0.0
+
+  '@monaco-editor/loader@1.5.0':
+    dependencies:
+      state-local: 1.0.7
+
+  '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@monaco-editor/loader': 1.5.0
+      monaco-editor: 0.52.2
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  '@napi-rs/wasm-runtime@0.2.8':
+    dependencies:
+      '@emnapi/core': 1.4.0
+      '@emnapi/runtime': 1.4.0
+      '@tybys/wasm-util': 0.9.0
+    optional: true
+
+  '@next/env@15.2.3': {}
+
+  '@next/eslint-plugin-next@15.3.0':
+    dependencies:
+      fast-glob: 3.3.1
+
+  '@next/mdx@15.2.3(@mdx-js/loader@3.1.0(acorn@8.14.1)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)))(@mdx-js/react@3.1.0(@types/react@18.2.79)(react@19.0.0))':
+    dependencies:
+      source-map: 0.7.4
+    optionalDependencies:
+      '@mdx-js/loader': 3.1.0(acorn@8.14.1)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      '@mdx-js/react': 3.1.0(@types/react@18.2.79)(react@19.0.0)
+
+  '@next/swc-darwin-arm64@15.2.3':
+    optional: true
+
+  '@next/swc-darwin-x64@15.2.3':
+    optional: true
+
+  '@next/swc-linux-arm64-gnu@15.2.3':
+    optional: true
+
+  '@next/swc-linux-arm64-musl@15.2.3':
+    optional: true
+
+  '@next/swc-linux-x64-gnu@15.2.3':
+    optional: true
+
+  '@next/swc-linux-x64-musl@15.2.3':
+    optional: true
+
+  '@next/swc-win32-arm64-msvc@15.2.3':
+    optional: true
+
+  '@next/swc-win32-x64-msvc@15.2.3':
+    optional: true
+
+  '@nodelib/fs.scandir@2.1.5':
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      run-parallel: 1.2.0
+
+  '@nodelib/fs.stat@2.0.5': {}
+
+  '@nodelib/fs.walk@1.2.8':
+    dependencies:
+      '@nodelib/fs.scandir': 2.1.5
+      fastq: 1.19.1
+
+  '@nolyfill/is-core-module@1.0.39': {}
+
+  '@octokit/auth-token@5.1.2': {}
+
+  '@octokit/core@6.1.5':
+    dependencies:
+      '@octokit/auth-token': 5.1.2
+      '@octokit/graphql': 8.2.2
+      '@octokit/request': 9.2.3
+      '@octokit/request-error': 6.1.8
+      '@octokit/types': 14.0.0
+      before-after-hook: 3.0.2
+      universal-user-agent: 7.0.2
+
+  '@octokit/endpoint@10.1.4':
+    dependencies:
+      '@octokit/types': 14.0.0
+      universal-user-agent: 7.0.2
+
+  '@octokit/graphql@8.2.2':
+    dependencies:
+      '@octokit/request': 9.2.3
+      '@octokit/types': 14.0.0
+      universal-user-agent: 7.0.2
+
+  '@octokit/openapi-types@25.0.0': {}
+
+  '@octokit/request-error@6.1.8':
+    dependencies:
+      '@octokit/types': 14.0.0
+
+  '@octokit/request@9.2.3':
+    dependencies:
+      '@octokit/endpoint': 10.1.4
+      '@octokit/request-error': 6.1.8
+      '@octokit/types': 14.0.0
+      fast-content-type-parse: 2.0.1
+      universal-user-agent: 7.0.2
+
+  '@octokit/types@14.0.0':
+    dependencies:
+      '@octokit/openapi-types': 25.0.0
+
+  '@parcel/watcher-android-arm64@2.5.1':
+    optional: true
+
+  '@parcel/watcher-darwin-arm64@2.5.1':
+    optional: true
+
+  '@parcel/watcher-darwin-x64@2.5.1':
+    optional: true
+
+  '@parcel/watcher-freebsd-x64@2.5.1':
+    optional: true
+
+  '@parcel/watcher-linux-arm-glibc@2.5.1':
+    optional: true
+
+  '@parcel/watcher-linux-arm-musl@2.5.1':
+    optional: true
+
+  '@parcel/watcher-linux-arm64-glibc@2.5.1':
+    optional: true
+
+  '@parcel/watcher-linux-arm64-musl@2.5.1':
+    optional: true
+
+  '@parcel/watcher-linux-x64-glibc@2.5.1':
+    optional: true
+
+  '@parcel/watcher-linux-x64-musl@2.5.1':
+    optional: true
+
+  '@parcel/watcher-win32-arm64@2.5.1':
+    optional: true
+
+  '@parcel/watcher-win32-ia32@2.5.1':
+    optional: true
+
+  '@parcel/watcher-win32-x64@2.5.1':
+    optional: true
+
+  '@parcel/watcher@2.5.1':
+    dependencies:
+      detect-libc: 1.0.3
+      is-glob: 4.0.3
+      micromatch: 4.0.8
+      node-addon-api: 7.1.1
+    optionalDependencies:
+      '@parcel/watcher-android-arm64': 2.5.1
+      '@parcel/watcher-darwin-arm64': 2.5.1
+      '@parcel/watcher-darwin-x64': 2.5.1
+      '@parcel/watcher-freebsd-x64': 2.5.1
+      '@parcel/watcher-linux-arm-glibc': 2.5.1
+      '@parcel/watcher-linux-arm-musl': 2.5.1
+      '@parcel/watcher-linux-arm64-glibc': 2.5.1
+      '@parcel/watcher-linux-arm64-musl': 2.5.1
+      '@parcel/watcher-linux-x64-glibc': 2.5.1
+      '@parcel/watcher-linux-x64-musl': 2.5.1
+      '@parcel/watcher-win32-arm64': 2.5.1
+      '@parcel/watcher-win32-ia32': 2.5.1
+      '@parcel/watcher-win32-x64': 2.5.1
+    optional: true
+
+  '@pkgjs/parseargs@0.11.0':
+    optional: true
+
+  '@pkgr/core@0.1.2': {}
+
+  '@pkgr/core@0.2.2': {}
+
+  '@pmmmwh/react-refresh-webpack-plugin@0.5.16(react-refresh@0.14.2)(type-fest@4.39.1)(webpack-hot-middleware@2.26.1)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))':
+    dependencies:
+      ansi-html: 0.0.9
+      core-js-pure: 3.41.0
+      error-stack-parser: 2.1.4
+      html-entities: 2.6.0
+      loader-utils: 2.0.4
+      react-refresh: 0.14.2
+      schema-utils: 4.3.0
+      source-map: 0.7.4
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+    optionalDependencies:
+      type-fest: 4.39.1
+      webpack-hot-middleware: 2.26.1
+
+  '@react-aria/focus@3.20.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@react-aria/interactions': 3.24.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@react-aria/utils': 3.28.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@react-types/shared': 3.28.0(react@19.0.0)
+      '@swc/helpers': 0.5.17
+      clsx: 2.1.1
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  '@react-aria/interactions@3.24.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@react-aria/ssr': 3.9.7(react@19.0.0)
+      '@react-aria/utils': 3.28.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@react-stately/flags': 3.1.0
+      '@react-types/shared': 3.28.0(react@19.0.0)
+      '@swc/helpers': 0.5.17
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  '@react-aria/ssr@3.9.7(react@19.0.0)':
+    dependencies:
+      '@swc/helpers': 0.5.17
+      react: 19.0.0
+
+  '@react-aria/utils@3.28.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@react-aria/ssr': 3.9.7(react@19.0.0)
+      '@react-stately/flags': 3.1.0
+      '@react-stately/utils': 3.10.5(react@19.0.0)
+      '@react-types/shared': 3.28.0(react@19.0.0)
+      '@swc/helpers': 0.5.17
+      clsx: 2.1.1
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  '@react-stately/flags@3.1.0':
+    dependencies:
+      '@swc/helpers': 0.5.17
+
+  '@react-stately/utils@3.10.5(react@19.0.0)':
+    dependencies:
+      '@swc/helpers': 0.5.17
+      react: 19.0.0
+
+  '@react-types/shared@3.28.0(react@19.0.0)':
+    dependencies:
+      react: 19.0.0
+
+  '@reactflow/background@11.3.14(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@reactflow/core': 11.11.4(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      classcat: 5.0.5
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      zustand: 4.5.6(@types/react@18.2.79)(immer@9.0.21)(react@19.0.0)
+    transitivePeerDependencies:
+      - '@types/react'
+      - immer
+
+  '@reactflow/controls@11.2.14(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@reactflow/core': 11.11.4(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      classcat: 5.0.5
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      zustand: 4.5.6(@types/react@18.2.79)(immer@9.0.21)(react@19.0.0)
+    transitivePeerDependencies:
+      - '@types/react'
+      - immer
+
+  '@reactflow/core@11.11.4(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@types/d3': 7.4.3
+      '@types/d3-drag': 3.0.7
+      '@types/d3-selection': 3.0.11
+      '@types/d3-zoom': 3.0.8
+      classcat: 5.0.5
+      d3-drag: 3.0.0
+      d3-selection: 3.0.0
+      d3-zoom: 3.0.0
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      zustand: 4.5.6(@types/react@18.2.79)(immer@9.0.21)(react@19.0.0)
+    transitivePeerDependencies:
+      - '@types/react'
+      - immer
+
+  '@reactflow/minimap@11.7.14(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@reactflow/core': 11.11.4(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@types/d3-selection': 3.0.11
+      '@types/d3-zoom': 3.0.8
+      classcat: 5.0.5
+      d3-selection: 3.0.0
+      d3-zoom: 3.0.0
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      zustand: 4.5.6(@types/react@18.2.79)(immer@9.0.21)(react@19.0.0)
+    transitivePeerDependencies:
+      - '@types/react'
+      - immer
+
+  '@reactflow/node-resizer@2.2.14(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@reactflow/core': 11.11.4(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      classcat: 5.0.5
+      d3-drag: 3.0.0
+      d3-selection: 3.0.0
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      zustand: 4.5.6(@types/react@18.2.79)(immer@9.0.21)(react@19.0.0)
+    transitivePeerDependencies:
+      - '@types/react'
+      - immer
+
+  '@reactflow/node-toolbar@1.3.14(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@reactflow/core': 11.11.4(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      classcat: 5.0.5
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      zustand: 4.5.6(@types/react@18.2.79)(immer@9.0.21)(react@19.0.0)
+    transitivePeerDependencies:
+      - '@types/react'
+      - immer
+
+  '@remixicon/react@4.6.0(react@19.0.0)':
+    dependencies:
+      react: 19.0.0
+
+  '@rgrove/parse-xml@4.2.0': {}
+
+  '@rollup/rollup-android-arm-eabi@4.39.0':
+    optional: true
+
+  '@rollup/rollup-android-arm64@4.39.0':
+    optional: true
+
+  '@rollup/rollup-darwin-arm64@4.39.0':
+    optional: true
+
+  '@rollup/rollup-darwin-x64@4.39.0':
+    optional: true
+
+  '@rollup/rollup-freebsd-arm64@4.39.0':
+    optional: true
+
+  '@rollup/rollup-freebsd-x64@4.39.0':
+    optional: true
+
+  '@rollup/rollup-linux-arm-gnueabihf@4.39.0':
+    optional: true
+
+  '@rollup/rollup-linux-arm-musleabihf@4.39.0':
+    optional: true
+
+  '@rollup/rollup-linux-arm64-gnu@4.39.0':
+    optional: true
+
+  '@rollup/rollup-linux-arm64-musl@4.39.0':
+    optional: true
+
+  '@rollup/rollup-linux-loongarch64-gnu@4.39.0':
+    optional: true
+
+  '@rollup/rollup-linux-powerpc64le-gnu@4.39.0':
+    optional: true
+
+  '@rollup/rollup-linux-riscv64-gnu@4.39.0':
+    optional: true
+
+  '@rollup/rollup-linux-riscv64-musl@4.39.0':
+    optional: true
+
+  '@rollup/rollup-linux-s390x-gnu@4.39.0':
+    optional: true
+
+  '@rollup/rollup-linux-x64-gnu@4.39.0':
+    optional: true
+
+  '@rollup/rollup-linux-x64-musl@4.39.0':
+    optional: true
+
+  '@rollup/rollup-win32-arm64-msvc@4.39.0':
+    optional: true
+
+  '@rollup/rollup-win32-ia32-msvc@4.39.0':
+    optional: true
+
+  '@rollup/rollup-win32-x64-msvc@4.39.0':
+    optional: true
+
+  '@rtsao/scc@1.1.0': {}
+
+  '@rushstack/eslint-patch@1.11.0': {}
+
+  '@sentry-internal/browser-utils@8.55.0':
+    dependencies:
+      '@sentry/core': 8.55.0
+
+  '@sentry-internal/feedback@8.55.0':
+    dependencies:
+      '@sentry/core': 8.55.0
+
+  '@sentry-internal/replay-canvas@8.55.0':
+    dependencies:
+      '@sentry-internal/replay': 8.55.0
+      '@sentry/core': 8.55.0
+
+  '@sentry-internal/replay@8.55.0':
+    dependencies:
+      '@sentry-internal/browser-utils': 8.55.0
+      '@sentry/core': 8.55.0
+
+  '@sentry/browser@8.55.0':
+    dependencies:
+      '@sentry-internal/browser-utils': 8.55.0
+      '@sentry-internal/feedback': 8.55.0
+      '@sentry-internal/replay': 8.55.0
+      '@sentry-internal/replay-canvas': 8.55.0
+      '@sentry/core': 8.55.0
+
+  '@sentry/core@8.55.0': {}
+
+  '@sentry/react@8.55.0(react@19.0.0)':
+    dependencies:
+      '@sentry/browser': 8.55.0
+      '@sentry/core': 8.55.0
+      hoist-non-react-statics: 3.3.2
+      react: 19.0.0
+
+  '@sentry/utils@8.55.0':
+    dependencies:
+      '@sentry/core': 8.55.0
+
+  '@sinclair/typebox@0.27.8': {}
+
+  '@sindresorhus/is@4.6.0': {}
+
+  '@sinonjs/commons@3.0.1':
+    dependencies:
+      type-detect: 4.0.8
+
+  '@sinonjs/fake-timers@10.3.0':
+    dependencies:
+      '@sinonjs/commons': 3.0.1
+
+  '@storybook/addon-actions@8.5.0(storybook@8.5.0)':
+    dependencies:
+      '@storybook/global': 5.0.0
+      '@types/uuid': 9.0.8
+      dequal: 2.0.3
+      polished: 4.3.1
+      storybook: 8.5.0
+      uuid: 9.0.1
+
+  '@storybook/addon-backgrounds@8.5.0(storybook@8.5.0)':
+    dependencies:
+      '@storybook/global': 5.0.0
+      memoizerific: 1.11.3
+      storybook: 8.5.0
+      ts-dedent: 2.2.0
+
+  '@storybook/addon-controls@8.5.0(storybook@8.5.0)':
+    dependencies:
+      '@storybook/global': 5.0.0
+      dequal: 2.0.3
+      storybook: 8.5.0
+      ts-dedent: 2.2.0
+
+  '@storybook/addon-docs@8.5.0(@types/react@18.2.79)(storybook@8.5.0)':
+    dependencies:
+      '@mdx-js/react': 3.1.0(@types/react@18.2.79)(react@18.3.1)
+      '@storybook/blocks': 8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0)
+      '@storybook/csf-plugin': 8.5.0(storybook@8.5.0)
+      '@storybook/react-dom-shim': 8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0)
+      react: 18.3.1
+      react-dom: 18.3.1(react@18.3.1)
+      storybook: 8.5.0
+      ts-dedent: 2.2.0
+    transitivePeerDependencies:
+      - '@types/react'
+
+  '@storybook/addon-essentials@8.5.0(@types/react@18.2.79)(storybook@8.5.0)':
+    dependencies:
+      '@storybook/addon-actions': 8.5.0(storybook@8.5.0)
+      '@storybook/addon-backgrounds': 8.5.0(storybook@8.5.0)
+      '@storybook/addon-controls': 8.5.0(storybook@8.5.0)
+      '@storybook/addon-docs': 8.5.0(@types/react@18.2.79)(storybook@8.5.0)
+      '@storybook/addon-highlight': 8.5.0(storybook@8.5.0)
+      '@storybook/addon-measure': 8.5.0(storybook@8.5.0)
+      '@storybook/addon-outline': 8.5.0(storybook@8.5.0)
+      '@storybook/addon-toolbars': 8.5.0(storybook@8.5.0)
+      '@storybook/addon-viewport': 8.5.0(storybook@8.5.0)
+      storybook: 8.5.0
+      ts-dedent: 2.2.0
+    transitivePeerDependencies:
+      - '@types/react'
+
+  '@storybook/addon-highlight@8.5.0(storybook@8.5.0)':
+    dependencies:
+      '@storybook/global': 5.0.0
+      storybook: 8.5.0
+
+  '@storybook/addon-interactions@8.5.0(storybook@8.5.0)':
+    dependencies:
+      '@storybook/global': 5.0.0
+      '@storybook/instrumenter': 8.5.0(storybook@8.5.0)
+      '@storybook/test': 8.5.0(storybook@8.5.0)
+      polished: 4.3.1
+      storybook: 8.5.0
+      ts-dedent: 2.2.0
+
+  '@storybook/addon-links@8.5.0(react@19.0.0)(storybook@8.5.0)':
+    dependencies:
+      '@storybook/csf': 0.1.12
+      '@storybook/global': 5.0.0
+      storybook: 8.5.0
+      ts-dedent: 2.2.0
+    optionalDependencies:
+      react: 19.0.0
+
+  '@storybook/addon-measure@8.5.0(storybook@8.5.0)':
+    dependencies:
+      '@storybook/global': 5.0.0
+      storybook: 8.5.0
+      tiny-invariant: 1.3.3
+
+  '@storybook/addon-onboarding@8.5.0(storybook@8.5.0)':
+    dependencies:
+      storybook: 8.5.0
+
+  '@storybook/addon-outline@8.5.0(storybook@8.5.0)':
+    dependencies:
+      '@storybook/global': 5.0.0
+      storybook: 8.5.0
+      ts-dedent: 2.2.0
+
+  '@storybook/addon-themes@8.5.0(storybook@8.5.0)':
+    dependencies:
+      storybook: 8.5.0
+      ts-dedent: 2.2.0
+
+  '@storybook/addon-toolbars@8.5.0(storybook@8.5.0)':
+    dependencies:
+      storybook: 8.5.0
+
+  '@storybook/addon-viewport@8.5.0(storybook@8.5.0)':
+    dependencies:
+      memoizerific: 1.11.3
+      storybook: 8.5.0
+
+  '@storybook/blocks@8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0)':
+    dependencies:
+      '@storybook/csf': 0.1.12
+      '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      storybook: 8.5.0
+      ts-dedent: 2.2.0
+    optionalDependencies:
+      react: 18.3.1
+      react-dom: 18.3.1(react@18.3.1)
+
+  '@storybook/blocks@8.5.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.0)':
+    dependencies:
+      '@storybook/csf': 0.1.12
+      '@storybook/icons': 1.4.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      storybook: 8.5.0
+      ts-dedent: 2.2.0
+    optionalDependencies:
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  '@storybook/builder-webpack5@8.5.0(esbuild@0.25.0)(storybook@8.5.0)(typescript@4.9.5)(uglify-js@3.19.3)':
+    dependencies:
+      '@storybook/core-webpack': 8.5.0(storybook@8.5.0)
+      '@types/semver': 7.7.0
+      browser-assert: 1.2.1
+      case-sensitive-paths-webpack-plugin: 2.4.0
+      cjs-module-lexer: 1.4.3
+      constants-browserify: 1.0.0
+      css-loader: 6.11.0(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      es-module-lexer: 1.6.0
+      fork-ts-checker-webpack-plugin: 8.0.0(typescript@4.9.5)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      html-webpack-plugin: 5.6.3(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      magic-string: 0.30.17
+      path-browserify: 1.0.1
+      process: 0.11.10
+      semver: 7.7.1
+      storybook: 8.5.0
+      style-loader: 3.3.4(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      terser-webpack-plugin: 5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      ts-dedent: 2.2.0
+      url: 0.11.4
+      util: 0.12.5
+      util-deprecate: 1.0.2
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+      webpack-dev-middleware: 6.1.3(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      webpack-hot-middleware: 2.26.1
+      webpack-virtual-modules: 0.6.2
+    optionalDependencies:
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - '@rspack/core'
+      - '@swc/core'
+      - esbuild
+      - uglify-js
+      - webpack-cli
+
+  '@storybook/components@8.5.0(storybook@8.5.0)':
+    dependencies:
+      storybook: 8.5.0
+
+  '@storybook/core-webpack@8.5.0(storybook@8.5.0)':
+    dependencies:
+      storybook: 8.5.0
+      ts-dedent: 2.2.0
+
+  '@storybook/core@8.5.0':
+    dependencies:
+      '@storybook/csf': 0.1.12
+      better-opn: 3.0.2
+      browser-assert: 1.2.1
+      esbuild: 0.25.0
+      esbuild-register: 3.6.0(esbuild@0.25.0)
+      jsdoc-type-pratt-parser: 4.1.0
+      process: 0.11.10
+      recast: 0.23.11
+      semver: 7.7.1
+      util: 0.12.5
+      ws: 8.18.1
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+
+  '@storybook/csf-plugin@8.5.0(storybook@8.5.0)':
+    dependencies:
+      storybook: 8.5.0
+      unplugin: 1.16.1
+
+  '@storybook/csf@0.1.12':
+    dependencies:
+      type-fest: 2.19.0
+
+  '@storybook/csf@0.1.13':
+    dependencies:
+      type-fest: 2.19.0
+
+  '@storybook/global@5.0.0': {}
+
+  '@storybook/icons@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+    dependencies:
+      react: 18.3.1
+      react-dom: 18.3.1(react@18.3.1)
+
+  '@storybook/icons@1.4.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  '@storybook/instrumenter@8.5.0(storybook@8.5.0)':
+    dependencies:
+      '@storybook/global': 5.0.0
+      '@vitest/utils': 2.1.9
+      storybook: 8.5.0
+
+  '@storybook/manager-api@8.5.0(storybook@8.5.0)':
+    dependencies:
+      storybook: 8.5.0
+
+  '@storybook/nextjs@8.5.0(esbuild@0.25.0)(next@15.2.3(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.86.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.86.3)(storybook@8.5.0)(type-fest@4.39.1)(typescript@4.9.5)(uglify-js@3.19.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.10)
+      '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.10)
+      '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.10)
+      '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-transform-runtime': 7.26.10(@babel/core@7.26.10)
+      '@babel/preset-env': 7.26.9(@babel/core@7.26.10)
+      '@babel/preset-react': 7.26.3(@babel/core@7.26.10)
+      '@babel/preset-typescript': 7.27.0(@babel/core@7.26.10)
+      '@babel/runtime': 7.27.0
+      '@pmmmwh/react-refresh-webpack-plugin': 0.5.16(react-refresh@0.14.2)(type-fest@4.39.1)(webpack-hot-middleware@2.26.1)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      '@storybook/builder-webpack5': 8.5.0(esbuild@0.25.0)(storybook@8.5.0)(typescript@4.9.5)(uglify-js@3.19.3)
+      '@storybook/preset-react-webpack': 8.5.0(@storybook/test@8.5.0(storybook@8.5.0))(esbuild@0.25.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.0)(typescript@4.9.5)(uglify-js@3.19.3)
+      '@storybook/react': 8.5.0(@storybook/test@8.5.0(storybook@8.5.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.0)(typescript@4.9.5)
+      '@storybook/test': 8.5.0(storybook@8.5.0)
+      '@types/semver': 7.7.0
+      babel-loader: 9.2.1(@babel/core@7.26.10)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      css-loader: 6.11.0(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      find-up: 5.0.0
+      image-size: 1.2.1
+      loader-utils: 3.3.1
+      next: 15.2.3(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.86.3)
+      node-polyfill-webpack-plugin: 2.0.1(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      pnp-webpack-plugin: 1.7.0(typescript@4.9.5)
+      postcss: 8.5.3
+      postcss-loader: 8.1.1(postcss@8.5.3)(typescript@4.9.5)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      react-refresh: 0.14.2
+      resolve-url-loader: 5.0.0
+      sass-loader: 14.2.1(sass@1.86.3)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      semver: 7.7.1
+      storybook: 8.5.0
+      style-loader: 3.3.4(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      styled-jsx: 5.1.6(@babel/core@7.26.10)(react@19.0.0)
+      ts-dedent: 2.2.0
+      tsconfig-paths: 4.2.0
+      tsconfig-paths-webpack-plugin: 4.2.0
+    optionalDependencies:
+      sharp: 0.33.5
+      typescript: 4.9.5
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+    transitivePeerDependencies:
+      - '@rspack/core'
+      - '@swc/core'
+      - '@types/webpack'
+      - babel-plugin-macros
+      - esbuild
+      - node-sass
+      - sass
+      - sass-embedded
+      - sockjs-client
+      - supports-color
+      - type-fest
+      - uglify-js
+      - webpack-cli
+      - webpack-dev-server
+      - webpack-hot-middleware
+      - webpack-plugin-serve
+
+  '@storybook/preset-react-webpack@8.5.0(@storybook/test@8.5.0(storybook@8.5.0))(esbuild@0.25.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.0)(typescript@4.9.5)(uglify-js@3.19.3)':
+    dependencies:
+      '@storybook/core-webpack': 8.5.0(storybook@8.5.0)
+      '@storybook/react': 8.5.0(@storybook/test@8.5.0(storybook@8.5.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.0)(typescript@4.9.5)
+      '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@4.9.5)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      '@types/semver': 7.7.0
+      find-up: 5.0.0
+      magic-string: 0.30.17
+      react: 19.0.0
+      react-docgen: 7.1.1
+      react-dom: 19.0.0(react@19.0.0)
+      resolve: 1.22.10
+      semver: 7.7.1
+      storybook: 8.5.0
+      tsconfig-paths: 4.2.0
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+    optionalDependencies:
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - '@storybook/test'
+      - '@swc/core'
+      - esbuild
+      - supports-color
+      - uglify-js
+      - webpack-cli
+
+  '@storybook/preview-api@8.5.0(storybook@8.5.0)':
+    dependencies:
+      storybook: 8.5.0
+
+  '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@4.9.5)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))':
+    dependencies:
+      debug: 4.4.0
+      endent: 2.1.0
+      find-cache-dir: 3.3.2
+      flat-cache: 3.2.0
+      micromatch: 4.0.8
+      react-docgen-typescript: 2.2.2(typescript@4.9.5)
+      tslib: 2.8.1
+      typescript: 4.9.5
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@storybook/react-dom-shim@8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0)':
+    dependencies:
+      react: 18.3.1
+      react-dom: 18.3.1(react@18.3.1)
+      storybook: 8.5.0
+
+  '@storybook/react-dom-shim@8.5.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.0)':
+    dependencies:
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      storybook: 8.5.0
+
+  '@storybook/react@8.5.0(@storybook/test@8.5.0(storybook@8.5.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.0)(typescript@4.9.5)':
+    dependencies:
+      '@storybook/components': 8.5.0(storybook@8.5.0)
+      '@storybook/global': 5.0.0
+      '@storybook/manager-api': 8.5.0(storybook@8.5.0)
+      '@storybook/preview-api': 8.5.0(storybook@8.5.0)
+      '@storybook/react-dom-shim': 8.5.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.0)
+      '@storybook/theming': 8.5.0(storybook@8.5.0)
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      storybook: 8.5.0
+    optionalDependencies:
+      '@storybook/test': 8.5.0(storybook@8.5.0)
+      typescript: 4.9.5
+
+  '@storybook/test@8.5.0(storybook@8.5.0)':
+    dependencies:
+      '@storybook/csf': 0.1.12
+      '@storybook/global': 5.0.0
+      '@storybook/instrumenter': 8.5.0(storybook@8.5.0)
+      '@testing-library/dom': 10.4.0
+      '@testing-library/jest-dom': 6.5.0
+      '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0)
+      '@vitest/expect': 2.0.5
+      '@vitest/spy': 2.0.5
+      storybook: 8.5.0
+
+  '@storybook/theming@8.5.0(storybook@8.5.0)':
+    dependencies:
+      storybook: 8.5.0
+
+  '@stylistic/eslint-plugin@4.2.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)':
+    dependencies:
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint: 9.24.0(jiti@1.21.7)
+      eslint-visitor-keys: 4.2.0
+      espree: 10.3.0
+      estraverse: 5.3.0
+      picomatch: 4.0.2
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
+  '@svgdotjs/svg.js@3.2.4': {}
+
+  '@swc/counter@0.1.3': {}
+
+  '@swc/helpers@0.5.15':
+    dependencies:
+      tslib: 2.8.1
+
+  '@swc/helpers@0.5.17':
+    dependencies:
+      tslib: 2.8.1
+
+  '@szmarczak/http-timer@4.0.6':
+    dependencies:
+      defer-to-connect: 2.0.1
+
+  '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5)))':
+    dependencies:
+      lodash.castarray: 4.4.0
+      lodash.isplainobject: 4.0.6
+      lodash.merge: 4.6.2
+      postcss-selector-parser: 6.0.10
+      tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5))
+
+  '@tanstack/form-core@1.3.2':
+    dependencies:
+      '@tanstack/store': 0.7.0
+
+  '@tanstack/query-core@5.72.2': {}
+
+  '@tanstack/query-devtools@5.72.2': {}
+
+  '@tanstack/react-form@1.3.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@tanstack/form-core': 1.3.2
+      '@tanstack/react-store': 0.7.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      decode-formdata: 0.9.0
+      devalue: 5.1.1
+      react: 19.0.0
+    transitivePeerDependencies:
+      - react-dom
+
+  '@tanstack/react-query-devtools@5.72.2(@tanstack/react-query@5.72.2(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@tanstack/query-devtools': 5.72.2
+      '@tanstack/react-query': 5.72.2(react@19.0.0)
+      react: 19.0.0
+
+  '@tanstack/react-query@5.72.2(react@19.0.0)':
+    dependencies:
+      '@tanstack/query-core': 5.72.2
+      react: 19.0.0
+
+  '@tanstack/react-store@0.7.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@tanstack/store': 0.7.0
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      use-sync-external-store: 1.5.0(react@19.0.0)
+
+  '@tanstack/react-virtual@3.13.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@tanstack/virtual-core': 3.13.6
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  '@tanstack/store@0.7.0': {}
+
+  '@tanstack/virtual-core@3.13.6': {}
+
+  '@testing-library/dom@10.4.0':
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      '@babel/runtime': 7.27.0
+      '@types/aria-query': 5.0.4
+      aria-query: 5.3.0
+      chalk: 4.1.2
+      dom-accessibility-api: 0.5.16
+      lz-string: 1.5.0
+      pretty-format: 27.5.1
+
+  '@testing-library/jest-dom@6.5.0':
+    dependencies:
+      '@adobe/css-tools': 4.4.2
+      aria-query: 5.3.2
+      chalk: 3.0.0
+      css.escape: 1.5.1
+      dom-accessibility-api: 0.6.3
+      lodash: 4.17.21
+      redent: 3.0.0
+
+  '@testing-library/jest-dom@6.6.3':
+    dependencies:
+      '@adobe/css-tools': 4.4.2
+      aria-query: 5.3.2
+      chalk: 3.0.0
+      css.escape: 1.5.1
+      dom-accessibility-api: 0.6.3
+      lodash: 4.17.21
+      redent: 3.0.0
+
+  '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+    dependencies:
+      '@babel/runtime': 7.27.0
+      '@testing-library/dom': 10.4.0
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+    optionalDependencies:
+      '@types/react': 18.2.79
+      '@types/react-dom': 18.2.25
+
+  '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)':
+    dependencies:
+      '@testing-library/dom': 10.4.0
+
+  '@tsconfig/node10@1.0.11': {}
+
+  '@tsconfig/node12@1.0.11': {}
+
+  '@tsconfig/node14@1.0.3': {}
+
+  '@tsconfig/node16@1.0.4': {}
+
+  '@tybys/wasm-util@0.9.0':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@types/aria-query@5.0.4': {}
+
+  '@types/babel__core@7.20.5':
+    dependencies:
+      '@babel/parser': 7.27.0
+      '@babel/types': 7.27.0
+      '@types/babel__generator': 7.27.0
+      '@types/babel__template': 7.4.4
+      '@types/babel__traverse': 7.20.7
+
+  '@types/babel__generator@7.27.0':
+    dependencies:
+      '@babel/types': 7.27.0
+
+  '@types/babel__template@7.4.4':
+    dependencies:
+      '@babel/parser': 7.27.0
+      '@babel/types': 7.27.0
+
+  '@types/babel__traverse@7.20.7':
+    dependencies:
+      '@babel/types': 7.27.0
+
+  '@types/cacheable-request@6.0.3':
+    dependencies:
+      '@types/http-cache-semantics': 4.0.4
+      '@types/keyv': 3.1.4
+      '@types/node': 18.15.0
+      '@types/responselike': 1.0.3
+
+  '@types/crypto-js@4.2.2': {}
+
+  '@types/d3-array@3.2.1': {}
+
+  '@types/d3-axis@3.0.6':
+    dependencies:
+      '@types/d3-selection': 3.0.11
+
+  '@types/d3-brush@3.0.6':
+    dependencies:
+      '@types/d3-selection': 3.0.11
+
+  '@types/d3-chord@3.0.6': {}
+
+  '@types/d3-color@3.1.3': {}
+
+  '@types/d3-contour@3.0.6':
+    dependencies:
+      '@types/d3-array': 3.2.1
+      '@types/geojson': 7946.0.16
+
+  '@types/d3-delaunay@6.0.4': {}
+
+  '@types/d3-dispatch@3.0.6': {}
+
+  '@types/d3-drag@3.0.7':
+    dependencies:
+      '@types/d3-selection': 3.0.11
+
+  '@types/d3-dsv@3.0.7': {}
+
+  '@types/d3-ease@3.0.2': {}
+
+  '@types/d3-fetch@3.0.7':
+    dependencies:
+      '@types/d3-dsv': 3.0.7
+
+  '@types/d3-force@3.0.10': {}
+
+  '@types/d3-format@3.0.4': {}
+
+  '@types/d3-geo@3.1.0':
+    dependencies:
+      '@types/geojson': 7946.0.16
+
+  '@types/d3-hierarchy@3.1.7': {}
+
+  '@types/d3-interpolate@3.0.4':
+    dependencies:
+      '@types/d3-color': 3.1.3
+
+  '@types/d3-path@3.1.1': {}
+
+  '@types/d3-polygon@3.0.2': {}
+
+  '@types/d3-quadtree@3.0.6': {}
+
+  '@types/d3-random@3.0.3': {}
+
+  '@types/d3-scale-chromatic@3.1.0': {}
+
+  '@types/d3-scale@4.0.9':
+    dependencies:
+      '@types/d3-time': 3.0.4
+
+  '@types/d3-selection@3.0.11': {}
+
+  '@types/d3-shape@3.1.7':
+    dependencies:
+      '@types/d3-path': 3.1.1
+
+  '@types/d3-time-format@4.0.3': {}
+
+  '@types/d3-time@3.0.4': {}
+
+  '@types/d3-timer@3.0.2': {}
+
+  '@types/d3-transition@3.0.9':
+    dependencies:
+      '@types/d3-selection': 3.0.11
+
+  '@types/d3-zoom@3.0.8':
+    dependencies:
+      '@types/d3-interpolate': 3.0.4
+      '@types/d3-selection': 3.0.11
+
+  '@types/d3@7.4.3':
+    dependencies:
+      '@types/d3-array': 3.2.1
+      '@types/d3-axis': 3.0.6
+      '@types/d3-brush': 3.0.6
+      '@types/d3-chord': 3.0.6
+      '@types/d3-color': 3.1.3
+      '@types/d3-contour': 3.0.6
+      '@types/d3-delaunay': 6.0.4
+      '@types/d3-dispatch': 3.0.6
+      '@types/d3-drag': 3.0.7
+      '@types/d3-dsv': 3.0.7
+      '@types/d3-ease': 3.0.2
+      '@types/d3-fetch': 3.0.7
+      '@types/d3-force': 3.0.10
+      '@types/d3-format': 3.0.4
+      '@types/d3-geo': 3.1.0
+      '@types/d3-hierarchy': 3.1.7
+      '@types/d3-interpolate': 3.0.4
+      '@types/d3-path': 3.1.1
+      '@types/d3-polygon': 3.0.2
+      '@types/d3-quadtree': 3.0.6
+      '@types/d3-random': 3.0.3
+      '@types/d3-scale': 4.0.9
+      '@types/d3-scale-chromatic': 3.1.0
+      '@types/d3-selection': 3.0.11
+      '@types/d3-shape': 3.1.7
+      '@types/d3-time': 3.0.4
+      '@types/d3-time-format': 4.0.3
+      '@types/d3-timer': 3.0.2
+      '@types/d3-transition': 3.0.9
+      '@types/d3-zoom': 3.0.8
+
+  '@types/dagre@0.7.52': {}
+
+  '@types/debug@4.1.12':
+    dependencies:
+      '@types/ms': 2.1.0
+
+  '@types/doctrine@0.0.9': {}
+
+  '@types/eslint-scope@3.7.7':
+    dependencies:
+      '@types/eslint': 9.6.1
+      '@types/estree': 1.0.7
+
+  '@types/eslint@9.6.1':
+    dependencies:
+      '@types/estree': 1.0.7
+      '@types/json-schema': 7.0.15
+
+  '@types/estree-jsx@1.0.5':
+    dependencies:
+      '@types/estree': 1.0.7
+
+  '@types/estree@1.0.7': {}
+
+  '@types/geojson@7946.0.16': {}
+
+  '@types/graceful-fs@4.1.9':
+    dependencies:
+      '@types/node': 18.15.0
+
+  '@types/hast@2.3.10':
+    dependencies:
+      '@types/unist': 2.0.11
+
+  '@types/hast@3.0.4':
+    dependencies:
+      '@types/unist': 3.0.3
+
+  '@types/html-minifier-terser@6.1.0': {}
+
+  '@types/http-cache-semantics@4.0.4': {}
+
+  '@types/istanbul-lib-coverage@2.0.6': {}
+
+  '@types/istanbul-lib-report@3.0.3':
+    dependencies:
+      '@types/istanbul-lib-coverage': 2.0.6
+
+  '@types/istanbul-reports@3.0.4':
+    dependencies:
+      '@types/istanbul-lib-report': 3.0.3
+
+  '@types/jest@29.5.14':
+    dependencies:
+      expect: 29.7.0
+      pretty-format: 29.7.0
+
+  '@types/js-cookie@3.0.6': {}
+
+  '@types/json-schema@7.0.15': {}
+
+  '@types/json5@0.0.29': {}
+
+  '@types/katex@0.16.7': {}
+
+  '@types/keyv@3.1.4':
+    dependencies:
+      '@types/node': 18.15.0
+
+  '@types/lodash-es@4.17.12':
+    dependencies:
+      '@types/lodash': 4.17.16
+
+  '@types/lodash@4.17.16': {}
+
+  '@types/mdast@4.0.4':
+    dependencies:
+      '@types/unist': 3.0.3
+
+  '@types/mdx@2.0.13': {}
+
+  '@types/ms@2.1.0': {}
+
+  '@types/negotiator@0.6.3': {}
+
+  '@types/node@18.15.0': {}
+
+  '@types/normalize-package-data@2.4.4': {}
+
+  '@types/papaparse@5.3.15':
+    dependencies:
+      '@types/node': 18.15.0
+
+  '@types/parse-json@4.0.2': {}
+
+  '@types/prop-types@15.7.14': {}
+
+  '@types/qs@6.9.18': {}
+
+  '@types/react-dom@18.2.25':
+    dependencies:
+      '@types/react': 18.2.79
+
+  '@types/react-slider@1.3.6':
+    dependencies:
+      '@types/react': 18.2.79
+
+  '@types/react-syntax-highlighter@15.5.13':
+    dependencies:
+      '@types/react': 18.2.79
+
+  '@types/react-window-infinite-loader@1.0.9':
+    dependencies:
+      '@types/react': 18.2.79
+      '@types/react-window': 1.8.8
+
+  '@types/react-window@1.8.8':
+    dependencies:
+      '@types/react': 18.2.79
+
+  '@types/react@18.2.79':
+    dependencies:
+      '@types/prop-types': 15.7.14
+      csstype: 3.1.3
+
+  '@types/recordrtc@5.6.14': {}
+
+  '@types/resolve@1.20.6': {}
+
+  '@types/responselike@1.0.3':
+    dependencies:
+      '@types/node': 18.15.0
+
+  '@types/semver@7.7.0': {}
+
+  '@types/sortablejs@1.15.8': {}
+
+  '@types/stack-utils@2.0.3': {}
+
+  '@types/trusted-types@2.0.7':
+    optional: true
+
+  '@types/unist@2.0.11': {}
+
+  '@types/unist@3.0.3': {}
+
+  '@types/uuid@10.0.0': {}
+
+  '@types/uuid@9.0.8': {}
+
+  '@types/yargs-parser@21.0.3': {}
+
+  '@types/yargs@17.0.33':
+    dependencies:
+      '@types/yargs-parser': 21.0.3
+
+  '@typescript-eslint/eslint-plugin@8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)':
+    dependencies:
+      '@eslint-community/regexpp': 4.12.1
+      '@typescript-eslint/parser': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/scope-manager': 8.29.1
+      '@typescript-eslint/type-utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/visitor-keys': 8.29.1
+      eslint: 9.24.0(jiti@1.21.7)
+      graphemer: 1.4.0
+      ignore: 5.3.2
+      natural-compare: 1.4.0
+      ts-api-utils: 2.1.0(typescript@4.9.5)
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)':
+    dependencies:
+      '@typescript-eslint/scope-manager': 8.29.1
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/typescript-estree': 8.29.1(typescript@4.9.5)
+      '@typescript-eslint/visitor-keys': 8.29.1
+      debug: 4.4.0
+      eslint: 9.24.0(jiti@1.21.7)
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/scope-manager@8.29.1':
+    dependencies:
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/visitor-keys': 8.29.1
+
+  '@typescript-eslint/type-utils@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)':
+    dependencies:
+      '@typescript-eslint/typescript-estree': 8.29.1(typescript@4.9.5)
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      debug: 4.4.0
+      eslint: 9.24.0(jiti@1.21.7)
+      ts-api-utils: 2.1.0(typescript@4.9.5)
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/types@8.29.1': {}
+
+  '@typescript-eslint/typescript-estree@8.29.1(typescript@4.9.5)':
+    dependencies:
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/visitor-keys': 8.29.1
+      debug: 4.4.0
+      fast-glob: 3.3.3
+      is-glob: 4.0.3
+      minimatch: 9.0.5
+      semver: 7.7.1
+      ts-api-utils: 2.1.0(typescript@4.9.5)
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/utils@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)':
+    dependencies:
+      '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@1.21.7))
+      '@typescript-eslint/scope-manager': 8.29.1
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/typescript-estree': 8.29.1(typescript@4.9.5)
+      eslint: 9.24.0(jiti@1.21.7)
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/visitor-keys@8.29.1':
+    dependencies:
+      '@typescript-eslint/types': 8.29.1
+      eslint-visitor-keys: 4.2.0
+
+  '@ungap/structured-clone@1.3.0': {}
+
+  '@unrs/resolver-binding-darwin-arm64@1.4.1':
+    optional: true
+
+  '@unrs/resolver-binding-darwin-x64@1.4.1':
+    optional: true
+
+  '@unrs/resolver-binding-freebsd-x64@1.4.1':
+    optional: true
+
+  '@unrs/resolver-binding-linux-arm-gnueabihf@1.4.1':
+    optional: true
+
+  '@unrs/resolver-binding-linux-arm-musleabihf@1.4.1':
+    optional: true
+
+  '@unrs/resolver-binding-linux-arm64-gnu@1.4.1':
+    optional: true
+
+  '@unrs/resolver-binding-linux-arm64-musl@1.4.1':
+    optional: true
+
+  '@unrs/resolver-binding-linux-ppc64-gnu@1.4.1':
+    optional: true
+
+  '@unrs/resolver-binding-linux-s390x-gnu@1.4.1':
+    optional: true
+
+  '@unrs/resolver-binding-linux-x64-gnu@1.4.1':
+    optional: true
+
+  '@unrs/resolver-binding-linux-x64-musl@1.4.1':
+    optional: true
+
+  '@unrs/resolver-binding-wasm32-wasi@1.4.1':
+    dependencies:
+      '@napi-rs/wasm-runtime': 0.2.8
+    optional: true
+
+  '@unrs/resolver-binding-win32-arm64-msvc@1.4.1':
+    optional: true
+
+  '@unrs/resolver-binding-win32-ia32-msvc@1.4.1':
+    optional: true
+
+  '@unrs/resolver-binding-win32-x64-msvc@1.4.1':
+    optional: true
+
+  '@vitest/eslint-plugin@1.1.42(@typescript-eslint/utils@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)(vitest@3.1.1(@types/debug@4.1.12)(@types/node@18.15.0)(happy-dom@17.4.4)(jiti@1.21.7)(sass@1.86.3)(terser@5.39.0)(yaml@2.7.1))':
+    dependencies:
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint: 9.24.0(jiti@1.21.7)
+      vitest: 3.1.1(@types/debug@4.1.12)(@types/node@18.15.0)(happy-dom@17.4.4)(jiti@1.21.7)(sass@1.86.3)(terser@5.39.0)(yaml@2.7.1)
+    optionalDependencies:
+      typescript: 4.9.5
+
+  '@vitest/expect@2.0.5':
+    dependencies:
+      '@vitest/spy': 2.0.5
+      '@vitest/utils': 2.0.5
+      chai: 5.2.0
+      tinyrainbow: 1.2.0
+
+  '@vitest/expect@3.1.1':
+    dependencies:
+      '@vitest/spy': 3.1.1
+      '@vitest/utils': 3.1.1
+      chai: 5.2.0
+      tinyrainbow: 2.0.0
+
+  '@vitest/mocker@3.1.1(vite@6.2.6(@types/node@18.15.0)(jiti@1.21.7)(sass@1.86.3)(terser@5.39.0)(yaml@2.7.1))':
+    dependencies:
+      '@vitest/spy': 3.1.1
+      estree-walker: 3.0.3
+      magic-string: 0.30.17
+    optionalDependencies:
+      vite: 6.2.6(@types/node@18.15.0)(jiti@1.21.7)(sass@1.86.3)(terser@5.39.0)(yaml@2.7.1)
+
+  '@vitest/pretty-format@2.0.5':
+    dependencies:
+      tinyrainbow: 1.2.0
+
+  '@vitest/pretty-format@2.1.9':
+    dependencies:
+      tinyrainbow: 1.2.0
+
+  '@vitest/pretty-format@3.1.1':
+    dependencies:
+      tinyrainbow: 2.0.0
+
+  '@vitest/runner@3.1.1':
+    dependencies:
+      '@vitest/utils': 3.1.1
+      pathe: 2.0.3
+
+  '@vitest/snapshot@3.1.1':
+    dependencies:
+      '@vitest/pretty-format': 3.1.1
+      magic-string: 0.30.17
+      pathe: 2.0.3
+
+  '@vitest/spy@2.0.5':
+    dependencies:
+      tinyspy: 3.0.2
+
+  '@vitest/spy@3.1.1':
+    dependencies:
+      tinyspy: 3.0.2
+
+  '@vitest/utils@2.0.5':
+    dependencies:
+      '@vitest/pretty-format': 2.0.5
+      estree-walker: 3.0.3
+      loupe: 3.1.3
+      tinyrainbow: 1.2.0
+
+  '@vitest/utils@2.1.9':
+    dependencies:
+      '@vitest/pretty-format': 2.1.9
+      loupe: 3.1.3
+      tinyrainbow: 1.2.0
+
+  '@vitest/utils@3.1.1':
+    dependencies:
+      '@vitest/pretty-format': 3.1.1
+      loupe: 3.1.3
+      tinyrainbow: 2.0.0
+
+  '@vue/compiler-core@3.5.13':
+    dependencies:
+      '@babel/parser': 7.27.0
+      '@vue/shared': 3.5.13
+      entities: 4.5.0
+      estree-walker: 2.0.2
+      source-map-js: 1.2.1
+
+  '@vue/compiler-dom@3.5.13':
+    dependencies:
+      '@vue/compiler-core': 3.5.13
+      '@vue/shared': 3.5.13
+
+  '@vue/compiler-sfc@3.5.13':
+    dependencies:
+      '@babel/parser': 7.27.0
+      '@vue/compiler-core': 3.5.13
+      '@vue/compiler-dom': 3.5.13
+      '@vue/compiler-ssr': 3.5.13
+      '@vue/shared': 3.5.13
+      estree-walker: 2.0.2
+      magic-string: 0.30.17
+      postcss: 8.5.3
+      source-map-js: 1.2.1
+
+  '@vue/compiler-ssr@3.5.13':
+    dependencies:
+      '@vue/compiler-dom': 3.5.13
+      '@vue/shared': 3.5.13
+
+  '@vue/shared@3.5.13': {}
+
+  '@webassemblyjs/ast@1.14.1':
+    dependencies:
+      '@webassemblyjs/helper-numbers': 1.13.2
+      '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+
+  '@webassemblyjs/floating-point-hex-parser@1.13.2': {}
+
+  '@webassemblyjs/helper-api-error@1.13.2': {}
+
+  '@webassemblyjs/helper-buffer@1.14.1': {}
+
+  '@webassemblyjs/helper-numbers@1.13.2':
+    dependencies:
+      '@webassemblyjs/floating-point-hex-parser': 1.13.2
+      '@webassemblyjs/helper-api-error': 1.13.2
+      '@xtuc/long': 4.2.2
+
+  '@webassemblyjs/helper-wasm-bytecode@1.13.2': {}
+
+  '@webassemblyjs/helper-wasm-section@1.14.1':
+    dependencies:
+      '@webassemblyjs/ast': 1.14.1
+      '@webassemblyjs/helper-buffer': 1.14.1
+      '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+      '@webassemblyjs/wasm-gen': 1.14.1
+
+  '@webassemblyjs/ieee754@1.13.2':
+    dependencies:
+      '@xtuc/ieee754': 1.2.0
+
+  '@webassemblyjs/leb128@1.13.2':
+    dependencies:
+      '@xtuc/long': 4.2.2
+
+  '@webassemblyjs/utf8@1.13.2': {}
+
+  '@webassemblyjs/wasm-edit@1.14.1':
+    dependencies:
+      '@webassemblyjs/ast': 1.14.1
+      '@webassemblyjs/helper-buffer': 1.14.1
+      '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+      '@webassemblyjs/helper-wasm-section': 1.14.1
+      '@webassemblyjs/wasm-gen': 1.14.1
+      '@webassemblyjs/wasm-opt': 1.14.1
+      '@webassemblyjs/wasm-parser': 1.14.1
+      '@webassemblyjs/wast-printer': 1.14.1
+
+  '@webassemblyjs/wasm-gen@1.14.1':
+    dependencies:
+      '@webassemblyjs/ast': 1.14.1
+      '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+      '@webassemblyjs/ieee754': 1.13.2
+      '@webassemblyjs/leb128': 1.13.2
+      '@webassemblyjs/utf8': 1.13.2
+
+  '@webassemblyjs/wasm-opt@1.14.1':
+    dependencies:
+      '@webassemblyjs/ast': 1.14.1
+      '@webassemblyjs/helper-buffer': 1.14.1
+      '@webassemblyjs/wasm-gen': 1.14.1
+      '@webassemblyjs/wasm-parser': 1.14.1
+
+  '@webassemblyjs/wasm-parser@1.14.1':
+    dependencies:
+      '@webassemblyjs/ast': 1.14.1
+      '@webassemblyjs/helper-api-error': 1.13.2
+      '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+      '@webassemblyjs/ieee754': 1.13.2
+      '@webassemblyjs/leb128': 1.13.2
+      '@webassemblyjs/utf8': 1.13.2
+
+  '@webassemblyjs/wast-printer@1.14.1':
+    dependencies:
+      '@webassemblyjs/ast': 1.14.1
+      '@xtuc/long': 4.2.2
+
+  '@xtuc/ieee754@1.2.0': {}
+
+  '@xtuc/long@4.2.2': {}
+
+  '@zod/core@0.1.0': {}
+
+  '@zod/mini@4.0.0-beta.0':
+    dependencies:
+      '@zod/core': 0.1.0
+
+  abbrev@1.1.1:
+    optional: true
+
+  abcjs@6.4.4: {}
+
+  abort-controller@3.0.0:
+    dependencies:
+      event-target-shim: 5.0.1
+
+  acorn-jsx@5.3.2(acorn@8.14.1):
+    dependencies:
+      acorn: 8.14.1
+
+  acorn-walk@8.3.4:
+    dependencies:
+      acorn: 8.14.1
+
+  acorn@8.14.1: {}
+
+  adjust-sourcemap-loader@4.0.0:
+    dependencies:
+      loader-utils: 2.0.4
+      regex-parser: 2.3.1
+
+  agent-base@6.0.2:
+    dependencies:
+      debug: 4.4.0
+    transitivePeerDependencies:
+      - supports-color
+    optional: true
+
+  ahooks@3.8.4(react@19.0.0):
+    dependencies:
+      '@babel/runtime': 7.27.0
+      dayjs: 1.11.13
+      intersection-observer: 0.12.2
+      js-cookie: 3.0.5
+      lodash: 4.17.21
+      react: 19.0.0
+      react-fast-compare: 3.2.2
+      resize-observer-polyfill: 1.5.1
+      screenfull: 5.2.0
+      tslib: 2.8.1
+
+  ajv-formats@2.1.1(ajv@8.17.1):
+    optionalDependencies:
+      ajv: 8.17.1
+
+  ajv-keywords@3.5.2(ajv@6.12.6):
+    dependencies:
+      ajv: 6.12.6
+
+  ajv-keywords@5.1.0(ajv@8.17.1):
+    dependencies:
+      ajv: 8.17.1
+      fast-deep-equal: 3.1.3
+
+  ajv@6.12.6:
+    dependencies:
+      fast-deep-equal: 3.1.3
+      fast-json-stable-stringify: 2.1.0
+      json-schema-traverse: 0.4.1
+      uri-js: 4.4.1
+
+  ajv@8.17.1:
+    dependencies:
+      fast-deep-equal: 3.1.3
+      fast-uri: 3.0.6
+      json-schema-traverse: 1.0.0
+      require-from-string: 2.0.2
+
+  ansi-escapes@4.3.2:
+    dependencies:
+      type-fest: 0.21.3
+
+  ansi-escapes@7.0.0:
+    dependencies:
+      environment: 1.1.0
+
+  ansi-html-community@0.0.8: {}
+
+  ansi-html@0.0.9: {}
+
+  ansi-regex@5.0.1: {}
+
+  ansi-regex@6.1.0: {}
+
+  ansi-styles@4.3.0:
+    dependencies:
+      color-convert: 2.0.1
+
+  ansi-styles@5.2.0: {}
+
+  ansi-styles@6.2.1: {}
+
+  ansis@3.17.0: {}
+
+  any-promise@1.3.0: {}
+
+  anymatch@3.1.3:
+    dependencies:
+      normalize-path: 3.0.0
+      picomatch: 2.3.1
+
+  aproba@2.0.0:
+    optional: true
+
+  are-docs-informative@0.0.2: {}
+
+  are-we-there-yet@2.0.0:
+    dependencies:
+      delegates: 1.0.0
+      readable-stream: 3.6.2
+    optional: true
+
+  arg@4.1.3: {}
+
+  arg@5.0.2: {}
+
+  argparse@1.0.10:
+    dependencies:
+      sprintf-js: 1.0.3
+
+  argparse@2.0.1: {}
+
+  aria-query@5.3.0:
+    dependencies:
+      dequal: 2.0.3
+
+  aria-query@5.3.2: {}
+
+  array-buffer-byte-length@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      is-array-buffer: 3.0.5
+
+  array-includes@3.1.8:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-object-atoms: 1.1.1
+      get-intrinsic: 1.3.0
+      is-string: 1.1.1
+
+  array.prototype.findlast@1.2.5:
+    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.1.1
+      es-shim-unscopables: 1.1.0
+
+  array.prototype.findlastindex@1.2.6:
+    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
+
+  array.prototype.flat@1.3.3:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-shim-unscopables: 1.1.0
+
+  array.prototype.flatmap@1.3.3:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-shim-unscopables: 1.1.0
+
+  array.prototype.tosorted@1.1.4:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      es-shim-unscopables: 1.1.0
+
+  arraybuffer.prototype.slice@1.0.4:
+    dependencies:
+      array-buffer-byte-length: 1.0.2
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      is-array-buffer: 3.0.5
+
+  asn1.js@4.10.1:
+    dependencies:
+      bn.js: 4.12.1
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+
+  assert@2.1.0:
+    dependencies:
+      call-bind: 1.0.8
+      is-nan: 1.3.2
+      object-is: 1.1.6
+      object.assign: 4.1.7
+      util: 0.12.5
+
+  assertion-error@2.0.1: {}
+
+  ast-types-flow@0.0.8: {}
+
+  ast-types@0.16.1:
+    dependencies:
+      tslib: 2.8.1
+
+  astring@1.9.0: {}
+
+  async-function@1.0.0: {}
+
+  async@3.2.6: {}
+
+  autoprefixer@10.4.21(postcss@8.5.3):
+    dependencies:
+      browserslist: 4.24.4
+      caniuse-lite: 1.0.30001713
+      fraction.js: 4.3.7
+      normalize-range: 0.1.2
+      picocolors: 1.1.1
+      postcss: 8.5.3
+      postcss-value-parser: 4.2.0
+
+  available-typed-arrays@1.0.7:
+    dependencies:
+      possible-typed-array-names: 1.1.0
+
+  axe-core@4.10.3: {}
+
+  axobject-query@4.1.0: {}
+
+  babel-jest@29.7.0(@babel/core@7.26.10):
+    dependencies:
+      '@babel/core': 7.26.10
+      '@jest/transform': 29.7.0
+      '@types/babel__core': 7.20.5
+      babel-plugin-istanbul: 6.1.1
+      babel-preset-jest: 29.6.3(@babel/core@7.26.10)
+      chalk: 4.1.2
+      graceful-fs: 4.2.11
+      slash: 3.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  babel-loader@9.2.1(@babel/core@7.26.10)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)):
+    dependencies:
+      '@babel/core': 7.26.10
+      find-cache-dir: 4.0.0
+      schema-utils: 4.3.0
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+
+  babel-plugin-istanbul@6.1.1:
+    dependencies:
+      '@babel/helper-plugin-utils': 7.26.5
+      '@istanbuljs/load-nyc-config': 1.1.0
+      '@istanbuljs/schema': 0.1.3
+      istanbul-lib-instrument: 5.2.1
+      test-exclude: 6.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  babel-plugin-jest-hoist@29.6.3:
+    dependencies:
+      '@babel/template': 7.27.0
+      '@babel/types': 7.27.0
+      '@types/babel__core': 7.20.5
+      '@types/babel__traverse': 7.20.7
+
+  babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.26.10):
+    dependencies:
+      '@babel/compat-data': 7.26.8
+      '@babel/core': 7.26.10
+      '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10)
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10):
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10)
+      core-js-compat: 3.41.0
+    transitivePeerDependencies:
+      - supports-color
+
+  babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.26.10):
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10)
+    transitivePeerDependencies:
+      - supports-color
+
+  babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.10):
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.10)
+      '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.10)
+      '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.10)
+      '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.10)
+      '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10)
+      '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.10)
+      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.10)
+      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.10)
+      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.10)
+      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.10)
+      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.10)
+      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.10)
+      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.10)
+      '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.10)
+      '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.10)
+
+  babel-preset-jest@29.6.3(@babel/core@7.26.10):
+    dependencies:
+      '@babel/core': 7.26.10
+      babel-plugin-jest-hoist: 29.6.3
+      babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10)
+
+  bail@2.0.2: {}
+
+  balanced-match@1.0.2: {}
+
+  base64-js@1.5.1: {}
+
+  before-after-hook@3.0.2: {}
+
+  better-opn@3.0.2:
+    dependencies:
+      open: 8.4.2
+
+  big.js@5.2.2: {}
+
+  binary-extensions@2.3.0: {}
+
+  bing-translate-api@4.0.2:
+    dependencies:
+      got: 11.8.6
+
+  birecord@0.1.1: {}
+
+  bn.js@4.12.1: {}
+
+  bn.js@5.2.1: {}
+
+  boolbase@1.0.0: {}
+
+  brace-expansion@1.1.11:
+    dependencies:
+      balanced-match: 1.0.2
+      concat-map: 0.0.1
+
+  brace-expansion@2.0.1:
+    dependencies:
+      balanced-match: 1.0.2
+
+  braces@3.0.3:
+    dependencies:
+      fill-range: 7.1.1
+
+  brorand@1.1.0: {}
+
+  browser-assert@1.2.1: {}
+
+  browserify-aes@1.2.0:
+    dependencies:
+      buffer-xor: 1.0.3
+      cipher-base: 1.0.6
+      create-hash: 1.2.0
+      evp_bytestokey: 1.0.3
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+
+  browserify-cipher@1.0.1:
+    dependencies:
+      browserify-aes: 1.2.0
+      browserify-des: 1.0.2
+      evp_bytestokey: 1.0.3
+
+  browserify-des@1.0.2:
+    dependencies:
+      cipher-base: 1.0.6
+      des.js: 1.1.0
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+
+  browserify-rsa@4.1.1:
+    dependencies:
+      bn.js: 5.2.1
+      randombytes: 2.1.0
+      safe-buffer: 5.2.1
+
+  browserify-sign@4.2.3:
+    dependencies:
+      bn.js: 5.2.1
+      browserify-rsa: 4.1.1
+      create-hash: 1.2.0
+      create-hmac: 1.1.7
+      elliptic: 6.6.1
+      hash-base: 3.0.5
+      inherits: 2.0.4
+      parse-asn1: 5.1.7
+      readable-stream: 2.3.8
+      safe-buffer: 5.2.1
+
+  browserify-zlib@0.2.0:
+    dependencies:
+      pako: 1.0.11
+
+  browserslist@4.24.4:
+    dependencies:
+      caniuse-lite: 1.0.30001713
+      electron-to-chromium: 1.5.136
+      node-releases: 2.0.19
+      update-browserslist-db: 1.1.3(browserslist@4.24.4)
+
+  bser@2.1.1:
+    dependencies:
+      node-int64: 0.4.0
+
+  buffer-from@1.1.2: {}
+
+  buffer-xor@1.0.3: {}
+
+  buffer@6.0.3:
+    dependencies:
+      base64-js: 1.5.1
+      ieee754: 1.2.1
+
+  builtin-modules@3.3.0: {}
+
+  builtin-modules@5.0.0: {}
+
+  builtin-status-codes@3.0.0: {}
+
+  busboy@1.6.0:
+    dependencies:
+      streamsearch: 1.1.0
+
+  bytes@3.1.2: {}
+
+  cac@6.7.14: {}
+
+  cacheable-lookup@5.0.4: {}
+
+  cacheable-request@7.0.4:
+    dependencies:
+      clone-response: 1.0.3
+      get-stream: 5.2.0
+      http-cache-semantics: 4.1.1
+      keyv: 4.5.4
+      lowercase-keys: 2.0.0
+      normalize-url: 6.1.0
+      responselike: 2.0.1
+
+  call-bind-apply-helpers@1.0.2:
+    dependencies:
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+
+  call-bind@1.0.8:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      es-define-property: 1.0.1
+      get-intrinsic: 1.3.0
+      set-function-length: 1.2.2
+
+  call-bound@1.0.4:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      get-intrinsic: 1.3.0
+
+  callsites@3.1.0: {}
+
+  camel-case@4.1.2:
+    dependencies:
+      pascal-case: 3.1.2
+      tslib: 2.8.1
+
+  camelcase-css@2.0.1: {}
+
+  camelcase@5.3.1: {}
+
+  camelcase@6.3.0: {}
+
+  caniuse-lite@1.0.30001713: {}
+
+  canvas@2.11.2:
+    dependencies:
+      '@mapbox/node-pre-gyp': 1.0.11
+      nan: 2.22.2
+      simple-get: 3.1.1
+    transitivePeerDependencies:
+      - encoding
+      - supports-color
+    optional: true
+
+  case-sensitive-paths-webpack-plugin@2.4.0: {}
+
+  ccount@2.0.1: {}
+
+  chai@5.2.0:
+    dependencies:
+      assertion-error: 2.0.1
+      check-error: 2.1.1
+      deep-eql: 5.0.2
+      loupe: 3.1.3
+      pathval: 2.0.0
+
+  chalk@3.0.0:
+    dependencies:
+      ansi-styles: 4.3.0
+      supports-color: 7.2.0
+
+  chalk@4.1.1:
+    dependencies:
+      ansi-styles: 4.3.0
+      supports-color: 7.2.0
+
+  chalk@4.1.2:
+    dependencies:
+      ansi-styles: 4.3.0
+      supports-color: 7.2.0
+
+  chalk@5.4.1: {}
+
+  char-regex@1.0.2: {}
+
+  character-entities-html4@2.1.0: {}
+
+  character-entities-legacy@1.1.4: {}
+
+  character-entities-legacy@3.0.0: {}
+
+  character-entities@1.2.4: {}
+
+  character-entities@2.0.2: {}
+
+  character-reference-invalid@1.1.4: {}
+
+  character-reference-invalid@2.0.1: {}
+
+  check-error@2.1.1: {}
+
+  chevrotain-allstar@0.3.1(chevrotain@11.0.3):
+    dependencies:
+      chevrotain: 11.0.3
+      lodash-es: 4.17.21
+
+  chevrotain@11.0.3:
+    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
+
+  chokidar@3.6.0:
+    dependencies:
+      anymatch: 3.1.3
+      braces: 3.0.3
+      glob-parent: 5.1.2
+      is-binary-path: 2.1.0
+      is-glob: 4.0.3
+      normalize-path: 3.0.0
+      readdirp: 3.6.0
+    optionalDependencies:
+      fsevents: 2.3.3
+
+  chokidar@4.0.3:
+    dependencies:
+      readdirp: 4.1.2
+
+  chownr@2.0.0:
+    optional: true
+
+  chromatic@11.28.0: {}
+
+  chrome-trace-event@1.0.4: {}
+
+  ci-info@3.9.0: {}
+
+  ci-info@4.2.0: {}
+
+  cipher-base@1.0.6:
+    dependencies:
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+
+  cjs-module-lexer@1.4.3: {}
+
+  class-variance-authority@0.7.1:
+    dependencies:
+      clsx: 2.1.1
+
+  classcat@5.0.5: {}
+
+  classnames@2.3.1: {}
+
+  classnames@2.5.1: {}
+
+  clean-css@5.3.3:
+    dependencies:
+      source-map: 0.6.1
+
+  clean-regexp@1.0.0:
+    dependencies:
+      escape-string-regexp: 1.0.5
+
+  cli-cursor@5.0.0:
+    dependencies:
+      restore-cursor: 5.1.0
+
+  cli-truncate@4.0.0:
+    dependencies:
+      slice-ansi: 5.0.0
+      string-width: 4.2.3
+
+  client-only@0.0.1: {}
+
+  cliui@8.0.1:
+    dependencies:
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      wrap-ansi: 7.0.0
+
+  clone-response@1.0.3:
+    dependencies:
+      mimic-response: 1.0.1
+
+  clsx@1.2.1: {}
+
+  clsx@2.1.1: {}
+
+  co@4.6.0: {}
+
+  code-inspector-core@0.18.3:
+    dependencies:
+      '@vue/compiler-dom': 3.5.13
+      chalk: 4.1.1
+      dotenv: 16.5.0
+      launch-ide: 1.0.1
+      portfinder: 1.0.35
+    transitivePeerDependencies:
+      - supports-color
+
+  code-inspector-plugin@0.18.3:
+    dependencies:
+      chalk: 4.1.1
+      code-inspector-core: 0.18.3
+      dotenv: 16.5.0
+      esbuild-code-inspector-plugin: 0.18.3
+      vite-code-inspector-plugin: 0.18.3
+      webpack-code-inspector-plugin: 0.18.3
+    transitivePeerDependencies:
+      - supports-color
+
+  collapse-white-space@2.1.0: {}
+
+  collect-v8-coverage@1.0.2: {}
+
+  color-convert@2.0.1:
+    dependencies:
+      color-name: 1.1.4
+
+  color-name@1.1.4: {}
+
+  color-string@1.9.1:
+    dependencies:
+      color-name: 1.1.4
+      simple-swizzle: 0.2.2
+
+  color-support@1.1.3:
+    optional: true
+
+  color@4.2.3:
+    dependencies:
+      color-convert: 2.0.1
+      color-string: 1.9.1
+
+  colorette@2.0.20: {}
+
+  comma-separated-tokens@1.0.8: {}
+
+  comma-separated-tokens@2.0.3: {}
+
+  commander@13.1.0: {}
+
+  commander@2.20.3: {}
+
+  commander@4.1.1: {}
+
+  commander@7.2.0: {}
+
+  commander@8.3.0: {}
+
+  comment-parser@1.4.1: {}
+
+  common-path-prefix@3.0.0: {}
+
+  commondir@1.0.1: {}
+
+  compare-versions@6.1.1: {}
+
+  concat-map@0.0.1: {}
+
+  confbox@0.1.8: {}
+
+  confbox@0.2.2: {}
+
+  console-browserify@1.2.0: {}
+
+  console-control-strings@1.1.0:
+    optional: true
+
+  constants-browserify@1.0.0: {}
+
+  convert-source-map@1.9.0: {}
+
+  convert-source-map@2.0.0: {}
+
+  copy-to-clipboard@3.3.3:
+    dependencies:
+      toggle-selection: 1.0.6
+
+  core-js-compat@3.41.0:
+    dependencies:
+      browserslist: 4.24.4
+
+  core-js-pure@3.41.0: {}
+
+  core-util-is@1.0.3: {}
+
+  cose-base@1.0.3:
+    dependencies:
+      layout-base: 1.0.2
+
+  cose-base@2.2.0:
+    dependencies:
+      layout-base: 2.0.1
+
+  cosmiconfig@7.1.0:
+    dependencies:
+      '@types/parse-json': 4.0.2
+      import-fresh: 3.3.1
+      parse-json: 5.2.0
+      path-type: 4.0.0
+      yaml: 1.10.2
+
+  cosmiconfig@9.0.0(typescript@4.9.5):
+    dependencies:
+      env-paths: 2.2.1
+      import-fresh: 3.3.1
+      js-yaml: 4.1.0
+      parse-json: 5.2.0
+    optionalDependencies:
+      typescript: 4.9.5
+
+  create-ecdh@4.0.4:
+    dependencies:
+      bn.js: 4.12.1
+      elliptic: 6.6.1
+
+  create-hash@1.2.0:
+    dependencies:
+      cipher-base: 1.0.6
+      inherits: 2.0.4
+      md5.js: 1.3.5
+      ripemd160: 2.0.2
+      sha.js: 2.4.11
+
+  create-hmac@1.1.7:
+    dependencies:
+      cipher-base: 1.0.6
+      create-hash: 1.2.0
+      inherits: 2.0.4
+      ripemd160: 2.0.2
+      safe-buffer: 5.2.1
+      sha.js: 2.4.11
+
+  create-jest@29.7.0(@types/node@18.15.0)(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5)):
+    dependencies:
+      '@jest/types': 29.6.3
+      chalk: 4.1.2
+      exit: 0.1.2
+      graceful-fs: 4.2.11
+      jest-config: 29.7.0(@types/node@18.15.0)(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5))
+      jest-util: 29.7.0
+      prompts: 2.4.2
+    transitivePeerDependencies:
+      - '@types/node'
+      - babel-plugin-macros
+      - supports-color
+      - ts-node
+
+  create-require@1.1.1: {}
+
+  cross-env@7.0.3:
+    dependencies:
+      cross-spawn: 7.0.6
+
+  cross-spawn@7.0.6:
+    dependencies:
+      path-key: 3.1.1
+      shebang-command: 2.0.0
+      which: 2.0.2
+
+  crypto-browserify@3.12.1:
+    dependencies:
+      browserify-cipher: 1.0.1
+      browserify-sign: 4.2.3
+      create-ecdh: 4.0.4
+      create-hash: 1.2.0
+      create-hmac: 1.1.7
+      diffie-hellman: 5.0.3
+      hash-base: 3.0.5
+      inherits: 2.0.4
+      pbkdf2: 3.1.2
+      public-encrypt: 4.0.3
+      randombytes: 2.1.0
+      randomfill: 1.0.4
+
+  crypto-js@4.2.0: {}
+
+  css-loader@6.11.0(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)):
+    dependencies:
+      icss-utils: 5.1.0(postcss@8.5.3)
+      postcss: 8.5.3
+      postcss-modules-extract-imports: 3.1.0(postcss@8.5.3)
+      postcss-modules-local-by-default: 4.2.0(postcss@8.5.3)
+      postcss-modules-scope: 3.2.1(postcss@8.5.3)
+      postcss-modules-values: 4.0.0(postcss@8.5.3)
+      postcss-value-parser: 4.2.0
+      semver: 7.7.1
+    optionalDependencies:
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+
+  css-select@4.3.0:
+    dependencies:
+      boolbase: 1.0.0
+      css-what: 6.1.0
+      domhandler: 4.3.1
+      domutils: 2.8.0
+      nth-check: 2.1.1
+
+  css-what@6.1.0: {}
+
+  css.escape@1.5.1: {}
+
+  cssesc@3.0.0: {}
+
+  csstype@3.1.3: {}
+
+  cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.2):
+    dependencies:
+      cose-base: 1.0.3
+      cytoscape: 3.31.2
+
+  cytoscape-fcose@2.2.0(cytoscape@3.31.2):
+    dependencies:
+      cose-base: 2.2.0
+      cytoscape: 3.31.2
+
+  cytoscape@3.31.2: {}
+
+  d3-array@2.12.1:
+    dependencies:
+      internmap: 1.0.1
+
+  d3-array@3.2.4:
+    dependencies:
+      internmap: 2.0.3
+
+  d3-axis@3.0.0: {}
+
+  d3-brush@3.0.0:
+    dependencies:
+      d3-dispatch: 3.0.1
+      d3-drag: 3.0.0
+      d3-interpolate: 3.0.1
+      d3-selection: 3.0.0
+      d3-transition: 3.0.1(d3-selection@3.0.0)
+
+  d3-chord@3.0.1:
+    dependencies:
+      d3-path: 3.1.0
+
+  d3-color@3.1.0: {}
+
+  d3-contour@4.0.2:
+    dependencies:
+      d3-array: 3.2.4
+
+  d3-delaunay@6.0.4:
+    dependencies:
+      delaunator: 5.0.1
+
+  d3-dispatch@3.0.1: {}
+
+  d3-drag@3.0.0:
+    dependencies:
+      d3-dispatch: 3.0.1
+      d3-selection: 3.0.0
+
+  d3-dsv@3.0.1:
+    dependencies:
+      commander: 7.2.0
+      iconv-lite: 0.6.3
+      rw: 1.3.3
+
+  d3-ease@3.0.1: {}
+
+  d3-fetch@3.0.1:
+    dependencies:
+      d3-dsv: 3.0.1
+
+  d3-force@3.0.0:
+    dependencies:
+      d3-dispatch: 3.0.1
+      d3-quadtree: 3.0.1
+      d3-timer: 3.0.1
+
+  d3-format@3.1.0: {}
+
+  d3-geo@3.1.1:
+    dependencies:
+      d3-array: 3.2.4
+
+  d3-hierarchy@3.1.2: {}
+
+  d3-interpolate@3.0.1:
+    dependencies:
+      d3-color: 3.1.0
+
+  d3-path@1.0.9: {}
+
+  d3-path@3.1.0: {}
+
+  d3-polygon@3.0.1: {}
+
+  d3-quadtree@3.0.1: {}
+
+  d3-random@3.0.1: {}
+
+  d3-sankey@0.12.3:
+    dependencies:
+      d3-array: 2.12.1
+      d3-shape: 1.3.7
+
+  d3-scale-chromatic@3.1.0:
+    dependencies:
+      d3-color: 3.1.0
+      d3-interpolate: 3.0.1
+
+  d3-scale@4.0.2:
+    dependencies:
+      d3-array: 3.2.4
+      d3-format: 3.1.0
+      d3-interpolate: 3.0.1
+      d3-time: 3.1.0
+      d3-time-format: 4.1.0
+
+  d3-selection@3.0.0: {}
+
+  d3-shape@1.3.7:
+    dependencies:
+      d3-path: 1.0.9
+
+  d3-shape@3.2.0:
+    dependencies:
+      d3-path: 3.1.0
+
+  d3-time-format@4.1.0:
+    dependencies:
+      d3-time: 3.1.0
+
+  d3-time@3.1.0:
+    dependencies:
+      d3-array: 3.2.4
+
+  d3-timer@3.0.1: {}
+
+  d3-transition@3.0.1(d3-selection@3.0.0):
+    dependencies:
+      d3-color: 3.1.0
+      d3-dispatch: 3.0.1
+      d3-ease: 3.0.1
+      d3-interpolate: 3.0.1
+      d3-selection: 3.0.0
+      d3-timer: 3.0.1
+
+  d3-zoom@3.0.0:
+    dependencies:
+      d3-dispatch: 3.0.1
+      d3-drag: 3.0.0
+      d3-interpolate: 3.0.1
+      d3-selection: 3.0.0
+      d3-transition: 3.0.1(d3-selection@3.0.0)
+
+  d3@7.9.0:
+    dependencies:
+      d3-array: 3.2.4
+      d3-axis: 3.0.0
+      d3-brush: 3.0.0
+      d3-chord: 3.0.1
+      d3-color: 3.1.0
+      d3-contour: 4.0.2
+      d3-delaunay: 6.0.4
+      d3-dispatch: 3.0.1
+      d3-drag: 3.0.0
+      d3-dsv: 3.0.1
+      d3-ease: 3.0.1
+      d3-fetch: 3.0.1
+      d3-force: 3.0.0
+      d3-format: 3.1.0
+      d3-geo: 3.1.1
+      d3-hierarchy: 3.1.2
+      d3-interpolate: 3.0.1
+      d3-path: 3.1.0
+      d3-polygon: 3.0.1
+      d3-quadtree: 3.0.1
+      d3-random: 3.0.1
+      d3-scale: 4.0.2
+      d3-scale-chromatic: 3.1.0
+      d3-selection: 3.0.0
+      d3-shape: 3.2.0
+      d3-time: 3.1.0
+      d3-time-format: 4.1.0
+      d3-timer: 3.0.1
+      d3-transition: 3.0.1(d3-selection@3.0.0)
+      d3-zoom: 3.0.0
+
+  dagre-d3-es@7.0.11:
+    dependencies:
+      d3: 7.9.0
+      lodash-es: 4.17.21
+
+  damerau-levenshtein@1.0.8: {}
+
+  data-view-buffer@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  data-view-byte-length@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  data-view-byte-offset@1.0.1:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  dayjs@1.11.13: {}
+
+  debug@3.2.7:
+    dependencies:
+      ms: 2.1.3
+
+  debug@4.4.0:
+    dependencies:
+      ms: 2.1.3
+
+  decimal.js@10.5.0: {}
+
+  decode-formdata@0.9.0: {}
+
+  decode-named-character-reference@1.1.0:
+    dependencies:
+      character-entities: 2.0.2
+
+  decompress-response@4.2.1:
+    dependencies:
+      mimic-response: 2.1.0
+    optional: true
+
+  decompress-response@6.0.0:
+    dependencies:
+      mimic-response: 3.1.0
+
+  dedent@0.7.0: {}
+
+  dedent@1.5.3: {}
+
+  deep-eql@5.0.2: {}
+
+  deep-is@0.1.4: {}
+
+  deepmerge@4.3.1: {}
+
+  defer-to-connect@2.0.1: {}
+
+  define-data-property@1.1.4:
+    dependencies:
+      es-define-property: 1.0.1
+      es-errors: 1.3.0
+      gopd: 1.2.0
+
+  define-lazy-prop@2.0.0: {}
+
+  define-properties@1.2.1:
+    dependencies:
+      define-data-property: 1.1.4
+      has-property-descriptors: 1.0.2
+      object-keys: 1.1.1
+
+  delaunator@5.0.1:
+    dependencies:
+      robust-predicates: 3.0.2
+
+  delegates@1.0.0:
+    optional: true
+
+  dequal@2.0.3: {}
+
+  des.js@1.1.0:
+    dependencies:
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+
+  detect-libc@1.0.3:
+    optional: true
+
+  detect-libc@2.0.3: {}
+
+  detect-newline@3.1.0: {}
+
+  devalue@5.1.1: {}
+
+  devlop@1.1.0:
+    dependencies:
+      dequal: 2.0.3
+
+  didyoumean@1.2.2: {}
+
+  diff-sequences@29.6.3: {}
+
+  diff@4.0.2: {}
+
+  diffie-hellman@5.0.3:
+    dependencies:
+      bn.js: 4.12.1
+      miller-rabin: 4.0.1
+      randombytes: 2.1.0
+
+  dlv@1.1.3: {}
+
+  doctrine@2.1.0:
+    dependencies:
+      esutils: 2.0.3
+
+  doctrine@3.0.0:
+    dependencies:
+      esutils: 2.0.3
+
+  dom-accessibility-api@0.5.16: {}
+
+  dom-accessibility-api@0.6.3: {}
+
+  dom-converter@0.2.0:
+    dependencies:
+      utila: 0.4.0
+
+  dom-serializer@1.4.1:
+    dependencies:
+      domelementtype: 2.3.0
+      domhandler: 4.3.1
+      entities: 2.2.0
+
+  domain-browser@4.23.0: {}
+
+  domelementtype@2.3.0: {}
+
+  domhandler@4.3.1:
+    dependencies:
+      domelementtype: 2.3.0
+
+  dompurify@3.2.5:
+    optionalDependencies:
+      '@types/trusted-types': 2.0.7
+
+  domutils@2.8.0:
+    dependencies:
+      dom-serializer: 1.4.1
+      domelementtype: 2.3.0
+      domhandler: 4.3.1
+
+  dot-case@3.0.4:
+    dependencies:
+      no-case: 3.0.4
+      tslib: 2.8.1
+
+  dotenv@16.5.0: {}
+
+  dunder-proto@1.0.1:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      es-errors: 1.3.0
+      gopd: 1.2.0
+
+  echarts-for-react@3.0.2(echarts@5.6.0)(react@19.0.0):
+    dependencies:
+      echarts: 5.6.0
+      fast-deep-equal: 3.1.3
+      react: 19.0.0
+      size-sensor: 1.0.2
+
+  echarts@5.6.0:
+    dependencies:
+      tslib: 2.3.0
+      zrender: 5.6.1
+
+  electron-to-chromium@1.5.136: {}
+
+  elkjs@0.9.3: {}
+
+  elliptic@6.6.1:
+    dependencies:
+      bn.js: 4.12.1
+      brorand: 1.1.0
+      hash.js: 1.1.7
+      hmac-drbg: 1.0.1
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+      minimalistic-crypto-utils: 1.0.1
+
+  emittery@0.13.1: {}
+
+  emoji-mart@5.6.0: {}
+
+  emoji-regex@8.0.0: {}
+
+  emoji-regex@9.2.2: {}
+
+  emojis-list@3.0.0: {}
+
+  end-of-stream@1.4.4:
+    dependencies:
+      once: 1.4.0
+
+  endent@2.1.0:
+    dependencies:
+      dedent: 0.7.0
+      fast-json-parse: 1.0.3
+      objectorarray: 1.0.5
+
+  enhanced-resolve@5.18.1:
+    dependencies:
+      graceful-fs: 4.2.11
+      tapable: 2.2.1
+
+  entities@2.2.0: {}
+
+  entities@4.5.0: {}
+
+  env-paths@2.2.1: {}
+
+  environment@1.1.0: {}
+
+  error-ex@1.3.2:
+    dependencies:
+      is-arrayish: 0.2.1
+
+  error-stack-parser@2.1.4:
+    dependencies:
+      stackframe: 1.3.4
+
+  es-abstract@1.23.9:
+    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-regex: 1.2.1
+      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
+      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
+
+  es-define-property@1.0.1: {}
+
+  es-errors@1.3.0: {}
+
+  es-iterator-helpers@1.2.1:
+    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-set-tostringtag: 2.1.0
+      function-bind: 1.1.2
+      get-intrinsic: 1.3.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
+      internal-slot: 1.1.0
+      iterator.prototype: 1.1.5
+      safe-array-concat: 1.1.3
+
+  es-module-lexer@1.6.0: {}
+
+  es-object-atoms@1.1.1:
+    dependencies:
+      es-errors: 1.3.0
+
+  es-set-tostringtag@2.1.0:
+    dependencies:
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      has-tostringtag: 1.0.2
+      hasown: 2.0.2
+
+  es-shim-unscopables@1.1.0:
+    dependencies:
+      hasown: 2.0.2
+
+  es-to-primitive@1.3.0:
+    dependencies:
+      is-callable: 1.2.7
+      is-date-object: 1.1.0
+      is-symbol: 1.1.1
+
+  esast-util-from-estree@2.0.0:
+    dependencies:
+      '@types/estree-jsx': 1.0.5
+      devlop: 1.1.0
+      estree-util-visit: 2.0.0
+      unist-util-position-from-estree: 2.0.0
+
+  esast-util-from-js@2.0.1:
+    dependencies:
+      '@types/estree-jsx': 1.0.5
+      acorn: 8.14.1
+      esast-util-from-estree: 2.0.0
+      vfile-message: 4.0.2
+
+  esbuild-code-inspector-plugin@0.18.3:
+    dependencies:
+      code-inspector-core: 0.18.3
+    transitivePeerDependencies:
+      - supports-color
+
+  esbuild-register@3.6.0(esbuild@0.25.0):
+    dependencies:
+      debug: 4.4.0
+      esbuild: 0.25.0
+    transitivePeerDependencies:
+      - supports-color
+
+  esbuild@0.25.0:
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.25.0
+      '@esbuild/android-arm': 0.25.0
+      '@esbuild/android-arm64': 0.25.0
+      '@esbuild/android-x64': 0.25.0
+      '@esbuild/darwin-arm64': 0.25.0
+      '@esbuild/darwin-x64': 0.25.0
+      '@esbuild/freebsd-arm64': 0.25.0
+      '@esbuild/freebsd-x64': 0.25.0
+      '@esbuild/linux-arm': 0.25.0
+      '@esbuild/linux-arm64': 0.25.0
+      '@esbuild/linux-ia32': 0.25.0
+      '@esbuild/linux-loong64': 0.25.0
+      '@esbuild/linux-mips64el': 0.25.0
+      '@esbuild/linux-ppc64': 0.25.0
+      '@esbuild/linux-riscv64': 0.25.0
+      '@esbuild/linux-s390x': 0.25.0
+      '@esbuild/linux-x64': 0.25.0
+      '@esbuild/netbsd-arm64': 0.25.0
+      '@esbuild/netbsd-x64': 0.25.0
+      '@esbuild/openbsd-arm64': 0.25.0
+      '@esbuild/openbsd-x64': 0.25.0
+      '@esbuild/sunos-x64': 0.25.0
+      '@esbuild/win32-arm64': 0.25.0
+      '@esbuild/win32-ia32': 0.25.0
+      '@esbuild/win32-x64': 0.25.0
+
+  esbuild@0.25.2:
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.25.2
+      '@esbuild/android-arm': 0.25.2
+      '@esbuild/android-arm64': 0.25.2
+      '@esbuild/android-x64': 0.25.2
+      '@esbuild/darwin-arm64': 0.25.2
+      '@esbuild/darwin-x64': 0.25.2
+      '@esbuild/freebsd-arm64': 0.25.2
+      '@esbuild/freebsd-x64': 0.25.2
+      '@esbuild/linux-arm': 0.25.2
+      '@esbuild/linux-arm64': 0.25.2
+      '@esbuild/linux-ia32': 0.25.2
+      '@esbuild/linux-loong64': 0.25.2
+      '@esbuild/linux-mips64el': 0.25.2
+      '@esbuild/linux-ppc64': 0.25.2
+      '@esbuild/linux-riscv64': 0.25.2
+      '@esbuild/linux-s390x': 0.25.2
+      '@esbuild/linux-x64': 0.25.2
+      '@esbuild/netbsd-arm64': 0.25.2
+      '@esbuild/netbsd-x64': 0.25.2
+      '@esbuild/openbsd-arm64': 0.25.2
+      '@esbuild/openbsd-x64': 0.25.2
+      '@esbuild/sunos-x64': 0.25.2
+      '@esbuild/win32-arm64': 0.25.2
+      '@esbuild/win32-ia32': 0.25.2
+      '@esbuild/win32-x64': 0.25.2
+
+  escalade@3.2.0: {}
+
+  escape-string-regexp@1.0.5: {}
+
+  escape-string-regexp@2.0.0: {}
+
+  escape-string-regexp@4.0.0: {}
+
+  escape-string-regexp@5.0.0: {}
+
+  eslint-compat-utils@0.5.1(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      eslint: 9.24.0(jiti@1.21.7)
+      semver: 7.7.1
+
+  eslint-compat-utils@0.6.5(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      eslint: 9.24.0(jiti@1.21.7)
+      semver: 7.7.1
+
+  eslint-config-flat-gitignore@2.1.0(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      '@eslint/compat': 1.2.8(eslint@9.24.0(jiti@1.21.7))
+      eslint: 9.24.0(jiti@1.21.7)
+
+  eslint-config-next@15.3.0(eslint-plugin-import-x@4.10.2(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5):
+    dependencies:
+      '@next/eslint-plugin-next': 15.3.0
+      '@rushstack/eslint-patch': 1.11.0
+      '@typescript-eslint/eslint-plugin': 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/parser': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint: 9.24.0(jiti@1.21.7)
+      eslint-import-resolver-node: 0.3.9
+      eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import-x@4.10.2(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.0)(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-jsx-a11y: 6.10.2(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-react: 7.37.5(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-react-hooks: 5.2.0(eslint@9.24.0(jiti@1.21.7))
+    optionalDependencies:
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - eslint-import-resolver-webpack
+      - eslint-plugin-import-x
+      - supports-color
+
+  eslint-flat-config-utils@2.0.1:
+    dependencies:
+      pathe: 2.0.3
+
+  eslint-import-resolver-node@0.3.9:
+    dependencies:
+      debug: 3.2.7
+      is-core-module: 2.16.1
+      resolve: 1.22.10
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-import-resolver-typescript@3.10.0(eslint-plugin-import-x@4.10.2(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      '@nolyfill/is-core-module': 1.0.39
+      debug: 4.4.0
+      eslint: 9.24.0(jiti@1.21.7)
+      get-tsconfig: 4.10.0
+      is-bun-module: 2.0.0
+      stable-hash: 0.0.5
+      tinyglobby: 0.2.12
+      unrs-resolver: 1.4.1
+    optionalDependencies:
+      eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.0)(eslint@9.24.0(jiti@1.21.7))
+      eslint-plugin-import-x: 4.10.2(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-json-compat-utils@0.2.1(eslint@9.24.0(jiti@1.21.7))(jsonc-eslint-parser@2.4.0):
+    dependencies:
+      eslint: 9.24.0(jiti@1.21.7)
+      esquery: 1.6.0
+      jsonc-eslint-parser: 2.4.0
+
+  eslint-merge-processors@2.0.0(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      eslint: 9.24.0(jiti@1.21.7)
+
+  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      debug: 3.2.7
+    optionalDependencies:
+      '@typescript-eslint/parser': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint: 9.24.0(jiti@1.21.7)
+      eslint-import-resolver-node: 0.3.9
+      eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import-x@4.10.2(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@1.21.7))
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-plugin-antfu@3.1.1(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      eslint: 9.24.0(jiti@1.21.7)
+
+  eslint-plugin-command@3.2.0(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      '@es-joy/jsdoccomment': 0.50.0
+      eslint: 9.24.0(jiti@1.21.7)
+
+  eslint-plugin-es-x@7.8.0(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@1.21.7))
+      '@eslint-community/regexpp': 4.12.1
+      eslint: 9.24.0(jiti@1.21.7)
+      eslint-compat-utils: 0.5.1(eslint@9.24.0(jiti@1.21.7))
+
+  eslint-plugin-import-x@4.10.2(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5):
+    dependencies:
+      '@pkgr/core': 0.2.2
+      '@types/doctrine': 0.0.9
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      debug: 4.4.0
+      doctrine: 3.0.0
+      eslint: 9.24.0(jiti@1.21.7)
+      eslint-import-resolver-node: 0.3.9
+      get-tsconfig: 4.10.0
+      is-glob: 4.0.3
+      minimatch: 10.0.1
+      semver: 7.7.1
+      stable-hash: 0.0.5
+      tslib: 2.8.1
+      unrs-resolver: 1.4.1
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
+  eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.0)(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      '@rtsao/scc': 1.1.0
+      array-includes: 3.1.8
+      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: 9.24.0(jiti@1.21.7)
+      eslint-import-resolver-node: 0.3.9
+      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@9.24.0(jiti@1.21.7))
+      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
+    optionalDependencies:
+      '@typescript-eslint/parser': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+    transitivePeerDependencies:
+      - eslint-import-resolver-typescript
+      - eslint-import-resolver-webpack
+      - supports-color
+
+  eslint-plugin-jsdoc@50.6.9(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      '@es-joy/jsdoccomment': 0.49.0
+      are-docs-informative: 0.0.2
+      comment-parser: 1.4.1
+      debug: 4.4.0
+      escape-string-regexp: 4.0.0
+      eslint: 9.24.0(jiti@1.21.7)
+      espree: 10.3.0
+      esquery: 1.6.0
+      parse-imports: 2.2.1
+      semver: 7.7.1
+      spdx-expression-parse: 4.0.0
+      synckit: 0.9.2
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-plugin-jsonc@2.20.0(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@1.21.7))
+      eslint: 9.24.0(jiti@1.21.7)
+      eslint-compat-utils: 0.6.5(eslint@9.24.0(jiti@1.21.7))
+      eslint-json-compat-utils: 0.2.1(eslint@9.24.0(jiti@1.21.7))(jsonc-eslint-parser@2.4.0)
+      espree: 10.3.0
+      graphemer: 1.4.0
+      jsonc-eslint-parser: 2.4.0
+      natural-compare: 1.4.0
+      synckit: 0.10.3
+    transitivePeerDependencies:
+      - '@eslint/json'
+
+  eslint-plugin-jsx-a11y@6.10.2(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      aria-query: 5.3.2
+      array-includes: 3.1.8
+      array.prototype.flatmap: 1.3.3
+      ast-types-flow: 0.0.8
+      axe-core: 4.10.3
+      axobject-query: 4.1.0
+      damerau-levenshtein: 1.0.8
+      emoji-regex: 9.2.2
+      eslint: 9.24.0(jiti@1.21.7)
+      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.1.0
+      string.prototype.includes: 2.0.1
+
+  eslint-plugin-n@17.17.0(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@1.21.7))
+      enhanced-resolve: 5.18.1
+      eslint: 9.24.0(jiti@1.21.7)
+      eslint-plugin-es-x: 7.8.0(eslint@9.24.0(jiti@1.21.7))
+      get-tsconfig: 4.10.0
+      globals: 15.15.0
+      ignore: 5.3.2
+      minimatch: 9.0.5
+      semver: 7.7.1
+
+  eslint-plugin-no-only-tests@3.3.0: {}
+
+  eslint-plugin-perfectionist@4.11.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5):
+    dependencies:
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint: 9.24.0(jiti@1.21.7)
+      natural-orderby: 5.0.0
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
+  eslint-plugin-pnpm@0.3.1(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      eslint: 9.24.0(jiti@1.21.7)
+      find-up-simple: 1.0.1
+      jsonc-eslint-parser: 2.4.0
+      pathe: 2.0.3
+      pnpm-workspace-yaml: 0.3.1
+      tinyglobby: 0.2.12
+      yaml-eslint-parser: 1.3.0
+
+  eslint-plugin-react-debug@1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5):
+    dependencies:
+      '@eslint-react/ast': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/core': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/eff': 1.45.0
+      '@eslint-react/jsx': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/kit': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/shared': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/var': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/scope-manager': 8.29.1
+      '@typescript-eslint/type-utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint: 9.24.0(jiti@1.21.7)
+      string-ts: 2.2.1
+      ts-pattern: 5.7.0
+    optionalDependencies:
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-plugin-react-dom@1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5):
+    dependencies:
+      '@eslint-react/ast': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/core': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/eff': 1.45.0
+      '@eslint-react/jsx': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/kit': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/shared': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/var': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/scope-manager': 8.29.1
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      compare-versions: 6.1.1
+      eslint: 9.24.0(jiti@1.21.7)
+      string-ts: 2.2.1
+      ts-pattern: 5.7.0
+    optionalDependencies:
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-plugin-react-hooks-extra@1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5):
+    dependencies:
+      '@eslint-react/ast': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/core': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/eff': 1.45.0
+      '@eslint-react/jsx': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/kit': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/shared': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/var': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/scope-manager': 8.29.1
+      '@typescript-eslint/type-utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint: 9.24.0(jiti@1.21.7)
+      string-ts: 2.2.1
+      ts-pattern: 5.7.0
+    optionalDependencies:
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-plugin-react-hooks@5.2.0(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      eslint: 9.24.0(jiti@1.21.7)
+
+  eslint-plugin-react-naming-convention@1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5):
+    dependencies:
+      '@eslint-react/ast': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/core': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/eff': 1.45.0
+      '@eslint-react/jsx': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/kit': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/shared': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/var': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/scope-manager': 8.29.1
+      '@typescript-eslint/type-utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint: 9.24.0(jiti@1.21.7)
+      string-ts: 2.2.1
+      ts-pattern: 5.7.0
+    optionalDependencies:
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-plugin-react-refresh@0.4.19(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      eslint: 9.24.0(jiti@1.21.7)
+
+  eslint-plugin-react-web-api@1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5):
+    dependencies:
+      '@eslint-react/ast': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/core': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/eff': 1.45.0
+      '@eslint-react/jsx': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/kit': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/shared': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/var': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/scope-manager': 8.29.1
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint: 9.24.0(jiti@1.21.7)
+      string-ts: 2.2.1
+      ts-pattern: 5.7.0
+    optionalDependencies:
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-plugin-react-x@1.45.0(eslint@9.24.0(jiti@1.21.7))(ts-api-utils@2.1.0(typescript@4.9.5))(typescript@4.9.5):
+    dependencies:
+      '@eslint-react/ast': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/core': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/eff': 1.45.0
+      '@eslint-react/jsx': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/kit': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/shared': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@eslint-react/var': 1.45.0(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/scope-manager': 8.29.1
+      '@typescript-eslint/type-utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/types': 8.29.1
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      compare-versions: 6.1.1
+      eslint: 9.24.0(jiti@1.21.7)
+      is-immutable-type: 5.0.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      string-ts: 2.2.1
+      ts-pattern: 5.7.0
+    optionalDependencies:
+      ts-api-utils: 2.1.0(typescript@4.9.5)
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-plugin-react@7.37.5(eslint@9.24.0(jiti@1.21.7)):
+    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
+      eslint: 9.24.0(jiti@1.21.7)
+      estraverse: 5.3.0
+      hasown: 2.0.2
+      jsx-ast-utils: 3.3.5
+      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
+
+  eslint-plugin-regexp@2.7.0(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@1.21.7))
+      '@eslint-community/regexpp': 4.12.1
+      comment-parser: 1.4.1
+      eslint: 9.24.0(jiti@1.21.7)
+      jsdoc-type-pratt-parser: 4.1.0
+      refa: 0.12.1
+      regexp-ast-analysis: 0.7.1
+      scslre: 0.3.0
+
+  eslint-plugin-sonarjs@3.0.2(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      '@eslint-community/regexpp': 4.12.1
+      builtin-modules: 3.3.0
+      bytes: 3.1.2
+      eslint: 9.24.0(jiti@1.21.7)
+      functional-red-black-tree: 1.0.1
+      jsx-ast-utils: 3.3.5
+      minimatch: 9.0.5
+      scslre: 0.3.0
+      semver: 7.7.1
+      typescript: 5.8.3
+
+  eslint-plugin-storybook@0.11.6(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5):
+    dependencies:
+      '@storybook/csf': 0.1.13
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint: 9.24.0(jiti@1.21.7)
+      ts-dedent: 2.2.0
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
+  eslint-plugin-tailwindcss@3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5))):
+    dependencies:
+      fast-glob: 3.3.3
+      postcss: 8.5.3
+      tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5))
+
+  eslint-plugin-toml@0.12.0(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      debug: 4.4.0
+      eslint: 9.24.0(jiti@1.21.7)
+      eslint-compat-utils: 0.6.5(eslint@9.24.0(jiti@1.21.7))
+      lodash: 4.17.21
+      toml-eslint-parser: 0.10.0
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-plugin-unicorn@58.0.0(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      '@babel/helper-validator-identifier': 7.25.9
+      '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@1.21.7))
+      '@eslint/plugin-kit': 0.2.8
+      ci-info: 4.2.0
+      clean-regexp: 1.0.0
+      core-js-compat: 3.41.0
+      eslint: 9.24.0(jiti@1.21.7)
+      esquery: 1.6.0
+      globals: 16.0.0
+      indent-string: 5.0.0
+      is-builtin-module: 5.0.0
+      jsesc: 3.1.0
+      pluralize: 8.0.0
+      read-package-up: 11.0.0
+      regexp-tree: 0.1.27
+      regjsparser: 0.12.0
+      semver: 7.7.1
+      strip-indent: 4.0.0
+
+  eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      eslint: 9.24.0(jiti@1.21.7)
+    optionalDependencies:
+      '@typescript-eslint/eslint-plugin': 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+
+  eslint-plugin-vue@10.0.0(eslint@9.24.0(jiti@1.21.7))(vue-eslint-parser@10.1.3(eslint@9.24.0(jiti@1.21.7))):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@1.21.7))
+      eslint: 9.24.0(jiti@1.21.7)
+      natural-compare: 1.4.0
+      nth-check: 2.1.1
+      postcss-selector-parser: 6.1.2
+      semver: 7.7.1
+      vue-eslint-parser: 10.1.3(eslint@9.24.0(jiti@1.21.7))
+      xml-name-validator: 4.0.0
+
+  eslint-plugin-yml@1.17.0(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      debug: 4.4.0
+      escape-string-regexp: 4.0.0
+      eslint: 9.24.0(jiti@1.21.7)
+      eslint-compat-utils: 0.6.5(eslint@9.24.0(jiti@1.21.7))
+      natural-compare: 1.4.0
+      yaml-eslint-parser: 1.3.0
+    transitivePeerDependencies:
+      - supports-color
+
+  eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      '@vue/compiler-sfc': 3.5.13
+      eslint: 9.24.0(jiti@1.21.7)
+
+  eslint-scope@5.1.1:
+    dependencies:
+      esrecurse: 4.3.0
+      estraverse: 4.3.0
+
+  eslint-scope@8.3.0:
+    dependencies:
+      esrecurse: 4.3.0
+      estraverse: 5.3.0
+
+  eslint-visitor-keys@3.4.3: {}
+
+  eslint-visitor-keys@4.2.0: {}
+
+  eslint@9.24.0(jiti@1.21.7):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@1.21.7))
+      '@eslint-community/regexpp': 4.12.1
+      '@eslint/config-array': 0.20.0
+      '@eslint/config-helpers': 0.2.1
+      '@eslint/core': 0.12.0
+      '@eslint/eslintrc': 3.3.1
+      '@eslint/js': 9.24.0
+      '@eslint/plugin-kit': 0.2.8
+      '@humanfs/node': 0.16.6
+      '@humanwhocodes/module-importer': 1.0.1
+      '@humanwhocodes/retry': 0.4.2
+      '@types/estree': 1.0.7
+      '@types/json-schema': 7.0.15
+      ajv: 6.12.6
+      chalk: 4.1.2
+      cross-spawn: 7.0.6
+      debug: 4.4.0
+      escape-string-regexp: 4.0.0
+      eslint-scope: 8.3.0
+      eslint-visitor-keys: 4.2.0
+      espree: 10.3.0
+      esquery: 1.6.0
+      esutils: 2.0.3
+      fast-deep-equal: 3.1.3
+      file-entry-cache: 8.0.0
+      find-up: 5.0.0
+      glob-parent: 6.0.2
+      ignore: 5.3.2
+      imurmurhash: 0.1.4
+      is-glob: 4.0.3
+      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.4
+    optionalDependencies:
+      jiti: 1.21.7
+    transitivePeerDependencies:
+      - supports-color
+
+  espree@10.3.0:
+    dependencies:
+      acorn: 8.14.1
+      acorn-jsx: 5.3.2(acorn@8.14.1)
+      eslint-visitor-keys: 4.2.0
+
+  espree@9.6.1:
+    dependencies:
+      acorn: 8.14.1
+      acorn-jsx: 5.3.2(acorn@8.14.1)
+      eslint-visitor-keys: 3.4.3
+
+  esprima@4.0.1: {}
+
+  esquery@1.6.0:
+    dependencies:
+      estraverse: 5.3.0
+
+  esrecurse@4.3.0:
+    dependencies:
+      estraverse: 5.3.0
+
+  estraverse@4.3.0: {}
+
+  estraverse@5.3.0: {}
+
+  estree-util-attach-comments@3.0.0:
+    dependencies:
+      '@types/estree': 1.0.7
+
+  estree-util-build-jsx@3.0.1:
+    dependencies:
+      '@types/estree-jsx': 1.0.5
+      devlop: 1.1.0
+      estree-util-is-identifier-name: 3.0.0
+      estree-walker: 3.0.3
+
+  estree-util-is-identifier-name@3.0.0: {}
+
+  estree-util-scope@1.0.0:
+    dependencies:
+      '@types/estree': 1.0.7
+      devlop: 1.1.0
+
+  estree-util-to-js@2.0.0:
+    dependencies:
+      '@types/estree-jsx': 1.0.5
+      astring: 1.9.0
+      source-map: 0.7.4
+
+  estree-util-visit@2.0.0:
+    dependencies:
+      '@types/estree-jsx': 1.0.5
+      '@types/unist': 3.0.3
+
+  estree-walker@2.0.2: {}
+
+  estree-walker@3.0.3:
+    dependencies:
+      '@types/estree': 1.0.7
+
+  esutils@2.0.3: {}
+
+  event-target-shim@5.0.1: {}
+
+  eventemitter3@5.0.1: {}
+
+  events@3.3.0: {}
+
+  evp_bytestokey@1.0.3:
+    dependencies:
+      md5.js: 1.3.5
+      safe-buffer: 5.2.1
+
+  execa@5.1.1:
+    dependencies:
+      cross-spawn: 7.0.6
+      get-stream: 6.0.1
+      human-signals: 2.1.0
+      is-stream: 2.0.1
+      merge-stream: 2.0.0
+      npm-run-path: 4.0.1
+      onetime: 5.1.2
+      signal-exit: 3.0.7
+      strip-final-newline: 2.0.0
+
+  execa@8.0.1:
+    dependencies:
+      cross-spawn: 7.0.6
+      get-stream: 8.0.1
+      human-signals: 5.0.0
+      is-stream: 3.0.0
+      merge-stream: 2.0.0
+      npm-run-path: 5.3.0
+      onetime: 6.0.0
+      signal-exit: 4.1.0
+      strip-final-newline: 3.0.0
+
+  exit@0.1.2: {}
+
+  expect-type@1.2.1: {}
+
+  expect@29.7.0:
+    dependencies:
+      '@jest/expect-utils': 29.7.0
+      jest-get-type: 29.6.3
+      jest-matcher-utils: 29.7.0
+      jest-message-util: 29.7.0
+      jest-util: 29.7.0
+
+  exsolve@1.0.4: {}
+
+  extend@3.0.2: {}
+
+  fast-content-type-parse@2.0.1: {}
+
+  fast-deep-equal@3.1.3: {}
+
+  fast-glob@3.3.1:
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      '@nodelib/fs.walk': 1.2.8
+      glob-parent: 5.1.2
+      merge2: 1.4.1
+      micromatch: 4.0.8
+
+  fast-glob@3.3.3:
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      '@nodelib/fs.walk': 1.2.8
+      glob-parent: 5.1.2
+      merge2: 1.4.1
+      micromatch: 4.0.8
+
+  fast-json-parse@1.0.3: {}
+
+  fast-json-stable-stringify@2.1.0: {}
+
+  fast-levenshtein@2.0.6: {}
+
+  fast-uri@3.0.6: {}
+
+  fastq@1.19.1:
+    dependencies:
+      reusify: 1.1.0
+
+  fault@1.0.4:
+    dependencies:
+      format: 0.2.2
+
+  fb-watchman@2.0.2:
+    dependencies:
+      bser: 2.1.1
+
+  fdir@6.4.3(picomatch@4.0.2):
+    optionalDependencies:
+      picomatch: 4.0.2
+
+  file-entry-cache@8.0.0:
+    dependencies:
+      flat-cache: 4.0.1
+
+  filesize@10.1.6: {}
+
+  fill-range@7.1.1:
+    dependencies:
+      to-regex-range: 5.0.1
+
+  filter-obj@2.0.2: {}
+
+  find-cache-dir@3.3.2:
+    dependencies:
+      commondir: 1.0.1
+      make-dir: 3.1.0
+      pkg-dir: 4.2.0
+
+  find-cache-dir@4.0.0:
+    dependencies:
+      common-path-prefix: 3.0.0
+      pkg-dir: 7.0.0
+
+  find-up-simple@1.0.1: {}
+
+  find-up@4.1.0:
+    dependencies:
+      locate-path: 5.0.0
+      path-exists: 4.0.0
+
+  find-up@5.0.0:
+    dependencies:
+      locate-path: 6.0.0
+      path-exists: 4.0.0
+
+  find-up@6.3.0:
+    dependencies:
+      locate-path: 7.2.0
+      path-exists: 5.0.0
+
+  flat-cache@3.2.0:
+    dependencies:
+      flatted: 3.3.3
+      keyv: 4.5.4
+      rimraf: 3.0.2
+
+  flat-cache@4.0.1:
+    dependencies:
+      flatted: 3.3.3
+      keyv: 4.5.4
+
+  flatted@3.3.3: {}
+
+  for-each@0.3.5:
+    dependencies:
+      is-callable: 1.2.7
+
+  foreground-child@3.3.1:
+    dependencies:
+      cross-spawn: 7.0.6
+      signal-exit: 4.1.0
+
+  fork-ts-checker-webpack-plugin@8.0.0(typescript@4.9.5)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)):
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      chalk: 4.1.2
+      chokidar: 3.6.0
+      cosmiconfig: 7.1.0
+      deepmerge: 4.3.1
+      fs-extra: 10.1.0
+      memfs: 3.5.3
+      minimatch: 3.1.2
+      node-abort-controller: 3.1.1
+      schema-utils: 3.3.0
+      semver: 7.7.1
+      tapable: 2.2.1
+      typescript: 4.9.5
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+
+  format@0.2.2: {}
+
+  fraction.js@4.3.7: {}
+
+  fs-extra@10.1.0:
+    dependencies:
+      graceful-fs: 4.2.11
+      jsonfile: 6.1.0
+      universalify: 2.0.1
+
+  fs-minipass@2.1.0:
+    dependencies:
+      minipass: 3.3.6
+    optional: true
+
+  fs-monkey@1.0.6: {}
+
+  fs.realpath@1.0.0: {}
+
+  fsevents@2.3.3:
+    optional: true
+
+  function-bind@1.1.2: {}
+
+  function.prototype.name@1.1.8:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      functions-have-names: 1.2.3
+      hasown: 2.0.2
+      is-callable: 1.2.7
+
+  functional-red-black-tree@1.0.1: {}
+
+  functions-have-names@1.2.3: {}
+
+  gauge@3.0.2:
+    dependencies:
+      aproba: 2.0.0
+      color-support: 1.1.3
+      console-control-strings: 1.1.0
+      has-unicode: 2.0.1
+      object-assign: 4.1.1
+      signal-exit: 3.0.7
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      wide-align: 1.1.5
+    optional: true
+
+  gensync@1.0.0-beta.2: {}
+
+  get-caller-file@2.0.5: {}
+
+  get-east-asian-width@1.3.0: {}
+
+  get-intrinsic@1.3.0:
+    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
+
+  get-package-type@0.1.0: {}
+
+  get-proto@1.0.1:
+    dependencies:
+      dunder-proto: 1.0.1
+      es-object-atoms: 1.1.1
+
+  get-stream@5.2.0:
+    dependencies:
+      pump: 3.0.2
+
+  get-stream@6.0.1: {}
+
+  get-stream@8.0.1: {}
+
+  get-symbol-description@1.1.0:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+
+  get-tsconfig@4.10.0:
+    dependencies:
+      resolve-pkg-maps: 1.0.0
+
+  glob-parent@5.1.2:
+    dependencies:
+      is-glob: 4.0.3
+
+  glob-parent@6.0.2:
+    dependencies:
+      is-glob: 4.0.3
+
+  glob-to-regexp@0.4.1: {}
+
+  glob@10.4.5:
+    dependencies:
+      foreground-child: 3.3.1
+      jackspeak: 3.4.3
+      minimatch: 9.0.5
+      minipass: 7.1.2
+      package-json-from-dist: 1.0.1
+      path-scurry: 1.11.1
+
+  glob@7.2.3:
+    dependencies:
+      fs.realpath: 1.0.0
+      inflight: 1.0.6
+      inherits: 2.0.4
+      minimatch: 3.1.2
+      once: 1.4.0
+      path-is-absolute: 1.0.1
+
+  globals@11.12.0: {}
+
+  globals@14.0.0: {}
+
+  globals@15.15.0: {}
+
+  globals@16.0.0: {}
+
+  globalthis@1.0.4:
+    dependencies:
+      define-properties: 1.2.1
+      gopd: 1.2.0
+
+  gopd@1.2.0: {}
+
+  got@11.8.6:
+    dependencies:
+      '@sindresorhus/is': 4.6.0
+      '@szmarczak/http-timer': 4.0.6
+      '@types/cacheable-request': 6.0.3
+      '@types/responselike': 1.0.3
+      cacheable-lookup: 5.0.4
+      cacheable-request: 7.0.4
+      decompress-response: 6.0.0
+      http2-wrapper: 1.0.3
+      lowercase-keys: 2.0.0
+      p-cancelable: 2.1.1
+      responselike: 2.0.1
+
+  graceful-fs@4.2.11: {}
+
+  graphemer@1.4.0: {}
+
+  hachure-fill@0.5.2: {}
+
+  happy-dom@17.4.4:
+    dependencies:
+      webidl-conversions: 7.0.0
+      whatwg-mimetype: 3.0.0
+
+  has-bigints@1.1.0: {}
+
+  has-flag@4.0.0: {}
+
+  has-property-descriptors@1.0.2:
+    dependencies:
+      es-define-property: 1.0.1
+
+  has-proto@1.2.0:
+    dependencies:
+      dunder-proto: 1.0.1
+
+  has-symbols@1.1.0: {}
+
+  has-tostringtag@1.0.2:
+    dependencies:
+      has-symbols: 1.1.0
+
+  has-unicode@2.0.1:
+    optional: true
+
+  hash-base@3.0.5:
+    dependencies:
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+
+  hash.js@1.1.7:
+    dependencies:
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+
+  hasown@2.0.2:
+    dependencies:
+      function-bind: 1.1.2
+
+  hast-util-from-dom@5.0.1:
+    dependencies:
+      '@types/hast': 3.0.4
+      hastscript: 9.0.1
+      web-namespaces: 2.0.1
+
+  hast-util-from-html-isomorphic@2.0.0:
+    dependencies:
+      '@types/hast': 3.0.4
+      hast-util-from-dom: 5.0.1
+      hast-util-from-html: 2.0.3
+      unist-util-remove-position: 5.0.0
+
+  hast-util-from-html@2.0.3:
+    dependencies:
+      '@types/hast': 3.0.4
+      devlop: 1.1.0
+      hast-util-from-parse5: 8.0.3
+      parse5: 7.2.1
+      vfile: 6.0.3
+      vfile-message: 4.0.2
+
+  hast-util-from-parse5@8.0.3:
+    dependencies:
+      '@types/hast': 3.0.4
+      '@types/unist': 3.0.3
+      devlop: 1.1.0
+      hastscript: 9.0.1
+      property-information: 7.0.0
+      vfile: 6.0.3
+      vfile-location: 5.0.3
+      web-namespaces: 2.0.1
+
+  hast-util-is-element@3.0.0:
+    dependencies:
+      '@types/hast': 3.0.4
+
+  hast-util-parse-selector@2.2.5: {}
+
+  hast-util-parse-selector@4.0.0:
+    dependencies:
+      '@types/hast': 3.0.4
+
+  hast-util-raw@9.1.0:
+    dependencies:
+      '@types/hast': 3.0.4
+      '@types/unist': 3.0.3
+      '@ungap/structured-clone': 1.3.0
+      hast-util-from-parse5: 8.0.3
+      hast-util-to-parse5: 8.0.0
+      html-void-elements: 3.0.0
+      mdast-util-to-hast: 13.2.0
+      parse5: 7.2.1
+      unist-util-position: 5.0.0
+      unist-util-visit: 5.0.0
+      vfile: 6.0.3
+      web-namespaces: 2.0.1
+      zwitch: 2.0.4
+
+  hast-util-to-estree@3.1.3:
+    dependencies:
+      '@types/estree': 1.0.7
+      '@types/estree-jsx': 1.0.5
+      '@types/hast': 3.0.4
+      comma-separated-tokens: 2.0.3
+      devlop: 1.1.0
+      estree-util-attach-comments: 3.0.0
+      estree-util-is-identifier-name: 3.0.0
+      hast-util-whitespace: 3.0.0
+      mdast-util-mdx-expression: 2.0.1
+      mdast-util-mdx-jsx: 3.2.0
+      mdast-util-mdxjs-esm: 2.0.1
+      property-information: 7.0.0
+      space-separated-tokens: 2.0.2
+      style-to-js: 1.1.16
+      unist-util-position: 5.0.0
+      zwitch: 2.0.4
+    transitivePeerDependencies:
+      - supports-color
+
+  hast-util-to-jsx-runtime@2.3.6:
+    dependencies:
+      '@types/estree': 1.0.7
+      '@types/hast': 3.0.4
+      '@types/unist': 3.0.3
+      comma-separated-tokens: 2.0.3
+      devlop: 1.1.0
+      estree-util-is-identifier-name: 3.0.0
+      hast-util-whitespace: 3.0.0
+      mdast-util-mdx-expression: 2.0.1
+      mdast-util-mdx-jsx: 3.2.0
+      mdast-util-mdxjs-esm: 2.0.1
+      property-information: 7.0.0
+      space-separated-tokens: 2.0.2
+      style-to-js: 1.1.16
+      unist-util-position: 5.0.0
+      vfile-message: 4.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  hast-util-to-parse5@8.0.0:
+    dependencies:
+      '@types/hast': 3.0.4
+      comma-separated-tokens: 2.0.3
+      devlop: 1.1.0
+      property-information: 6.5.0
+      space-separated-tokens: 2.0.2
+      web-namespaces: 2.0.1
+      zwitch: 2.0.4
+
+  hast-util-to-text@4.0.2:
+    dependencies:
+      '@types/hast': 3.0.4
+      '@types/unist': 3.0.3
+      hast-util-is-element: 3.0.0
+      unist-util-find-after: 5.0.0
+
+  hast-util-whitespace@3.0.0:
+    dependencies:
+      '@types/hast': 3.0.4
+
+  hastscript@6.0.0:
+    dependencies:
+      '@types/hast': 2.3.10
+      comma-separated-tokens: 1.0.8
+      hast-util-parse-selector: 2.2.5
+      property-information: 5.6.0
+      space-separated-tokens: 1.1.5
+
+  hastscript@9.0.1:
+    dependencies:
+      '@types/hast': 3.0.4
+      comma-separated-tokens: 2.0.3
+      hast-util-parse-selector: 4.0.0
+      property-information: 7.0.0
+      space-separated-tokens: 2.0.2
+
+  he@1.2.0: {}
+
+  highlight.js@10.7.3: {}
+
+  highlightjs-vue@1.0.0: {}
+
+  hmac-drbg@1.0.1:
+    dependencies:
+      hash.js: 1.1.7
+      minimalistic-assert: 1.0.1
+      minimalistic-crypto-utils: 1.0.1
+
+  hoist-non-react-statics@3.3.2:
+    dependencies:
+      react-is: 16.13.1
+
+  hosted-git-info@7.0.2:
+    dependencies:
+      lru-cache: 10.4.3
+
+  html-entities@2.6.0: {}
+
+  html-escaper@2.0.2: {}
+
+  html-minifier-terser@6.1.0:
+    dependencies:
+      camel-case: 4.1.2
+      clean-css: 5.3.3
+      commander: 8.3.0
+      he: 1.2.0
+      param-case: 3.0.4
+      relateurl: 0.2.7
+      terser: 5.39.0
+
+  html-parse-stringify@3.0.1:
+    dependencies:
+      void-elements: 3.1.0
+
+  html-to-image@1.11.11: {}
+
+  html-url-attributes@3.0.1: {}
+
+  html-void-elements@3.0.0: {}
+
+  html-webpack-plugin@5.6.3(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)):
+    dependencies:
+      '@types/html-minifier-terser': 6.1.0
+      html-minifier-terser: 6.1.0
+      lodash: 4.17.21
+      pretty-error: 4.0.0
+      tapable: 2.2.1
+    optionalDependencies:
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+
+  htmlparser2@6.1.0:
+    dependencies:
+      domelementtype: 2.3.0
+      domhandler: 4.3.1
+      domutils: 2.8.0
+      entities: 2.2.0
+
+  http-cache-semantics@4.1.1: {}
+
+  http2-wrapper@1.0.3:
+    dependencies:
+      quick-lru: 5.1.1
+      resolve-alpn: 1.2.1
+
+  https-browserify@1.0.0: {}
+
+  https-proxy-agent@5.0.1:
+    dependencies:
+      agent-base: 6.0.2
+      debug: 4.4.0
+    transitivePeerDependencies:
+      - supports-color
+    optional: true
+
+  human-signals@2.1.0: {}
+
+  human-signals@5.0.0: {}
+
+  husky@9.1.7: {}
+
+  i18next-resources-to-backend@1.2.1:
+    dependencies:
+      '@babel/runtime': 7.27.0
+
+  i18next@23.16.8:
+    dependencies:
+      '@babel/runtime': 7.27.0
+
+  iconv-lite@0.6.3:
+    dependencies:
+      safer-buffer: 2.1.2
+
+  icss-utils@5.1.0(postcss@8.5.3):
+    dependencies:
+      postcss: 8.5.3
+
+  ieee754@1.2.1: {}
+
+  ignore@5.3.2: {}
+
+  image-size@1.2.1:
+    dependencies:
+      queue: 6.0.2
+
+  immer@9.0.21: {}
+
+  immutable@5.1.1: {}
+
+  import-fresh@3.3.1:
+    dependencies:
+      parent-module: 1.0.1
+      resolve-from: 4.0.0
+
+  import-local@3.2.0:
+    dependencies:
+      pkg-dir: 4.2.0
+      resolve-cwd: 3.0.0
+
+  imurmurhash@0.1.4: {}
+
+  indent-string@4.0.0: {}
+
+  indent-string@5.0.0: {}
+
+  index-to-position@1.1.0: {}
+
+  inflight@1.0.6:
+    dependencies:
+      once: 1.4.0
+      wrappy: 1.0.2
+
+  inherits@2.0.4: {}
+
+  inline-style-parser@0.2.4: {}
+
+  internal-slot@1.1.0:
+    dependencies:
+      es-errors: 1.3.0
+      hasown: 2.0.2
+      side-channel: 1.1.0
+
+  internmap@1.0.1: {}
+
+  internmap@2.0.3: {}
+
+  intersection-observer@0.12.2: {}
+
+  is-alphabetical@1.0.4: {}
+
+  is-alphabetical@2.0.1: {}
+
+  is-alphanumerical@1.0.4:
+    dependencies:
+      is-alphabetical: 1.0.4
+      is-decimal: 1.0.4
+
+  is-alphanumerical@2.0.1:
+    dependencies:
+      is-alphabetical: 2.0.1
+      is-decimal: 2.0.1
+
+  is-arguments@1.2.0:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-array-buffer@3.0.5:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+
+  is-arrayish@0.2.1: {}
+
+  is-arrayish@0.3.2: {}
+
+  is-async-function@2.1.1:
+    dependencies:
+      async-function: 1.0.0
+      call-bound: 1.0.4
+      get-proto: 1.0.1
+      has-tostringtag: 1.0.2
+      safe-regex-test: 1.1.0
+
+  is-bigint@1.1.0:
+    dependencies:
+      has-bigints: 1.1.0
+
+  is-binary-path@2.1.0:
+    dependencies:
+      binary-extensions: 2.3.0
+
+  is-boolean-object@1.2.2:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-builtin-module@5.0.0:
+    dependencies:
+      builtin-modules: 5.0.0
+
+  is-bun-module@2.0.0:
+    dependencies:
+      semver: 7.7.1
+
+  is-callable@1.2.7: {}
+
+  is-core-module@2.16.1:
+    dependencies:
+      hasown: 2.0.2
+
+  is-data-view@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+      is-typed-array: 1.1.15
+
+  is-date-object@1.1.0:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-decimal@1.0.4: {}
+
+  is-decimal@2.0.1: {}
+
+  is-docker@2.2.1: {}
+
+  is-extglob@2.1.1: {}
+
+  is-finalizationregistry@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+
+  is-fullwidth-code-point@3.0.0: {}
+
+  is-fullwidth-code-point@4.0.0: {}
+
+  is-fullwidth-code-point@5.0.0:
+    dependencies:
+      get-east-asian-width: 1.3.0
+
+  is-generator-fn@2.1.0: {}
+
+  is-generator-function@1.1.0:
+    dependencies:
+      call-bound: 1.0.4
+      get-proto: 1.0.1
+      has-tostringtag: 1.0.2
+      safe-regex-test: 1.1.0
+
+  is-glob@4.0.3:
+    dependencies:
+      is-extglob: 2.1.1
+
+  is-hexadecimal@1.0.4: {}
+
+  is-hexadecimal@2.0.1: {}
+
+  is-immutable-type@5.0.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5):
+    dependencies:
+      '@typescript-eslint/type-utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint: 9.24.0(jiti@1.21.7)
+      ts-api-utils: 2.1.0(typescript@4.9.5)
+      ts-declaration-location: 1.0.7(typescript@4.9.5)
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+
+  is-map@2.0.3: {}
+
+  is-nan@1.3.2:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+
+  is-number-object@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-number@7.0.0: {}
+
+  is-plain-obj@4.1.0: {}
+
+  is-regex@1.2.1:
+    dependencies:
+      call-bound: 1.0.4
+      gopd: 1.2.0
+      has-tostringtag: 1.0.2
+      hasown: 2.0.2
+
+  is-set@2.0.3: {}
+
+  is-shared-array-buffer@1.0.4:
+    dependencies:
+      call-bound: 1.0.4
+
+  is-stream@2.0.1: {}
+
+  is-stream@3.0.0: {}
+
+  is-string@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-symbol@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+      has-symbols: 1.1.0
+      safe-regex-test: 1.1.0
+
+  is-typed-array@1.1.15:
+    dependencies:
+      which-typed-array: 1.1.19
+
+  is-weakmap@2.0.2: {}
+
+  is-weakref@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+
+  is-weakset@2.0.4:
+    dependencies:
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+
+  is-wsl@2.2.0:
+    dependencies:
+      is-docker: 2.2.1
+
+  isarray@1.0.0: {}
+
+  isarray@2.0.5: {}
+
+  isexe@2.0.0: {}
+
+  isomorphic.js@0.2.5: {}
+
+  istanbul-lib-coverage@3.2.2: {}
+
+  istanbul-lib-instrument@5.2.1:
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/parser': 7.27.0
+      '@istanbuljs/schema': 0.1.3
+      istanbul-lib-coverage: 3.2.2
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  istanbul-lib-instrument@6.0.3:
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/parser': 7.27.0
+      '@istanbuljs/schema': 0.1.3
+      istanbul-lib-coverage: 3.2.2
+      semver: 7.7.1
+    transitivePeerDependencies:
+      - supports-color
+
+  istanbul-lib-report@3.0.1:
+    dependencies:
+      istanbul-lib-coverage: 3.2.2
+      make-dir: 4.0.0
+      supports-color: 7.2.0
+
+  istanbul-lib-source-maps@4.0.1:
+    dependencies:
+      debug: 4.4.0
+      istanbul-lib-coverage: 3.2.2
+      source-map: 0.6.1
+    transitivePeerDependencies:
+      - supports-color
+
+  istanbul-reports@3.1.7:
+    dependencies:
+      html-escaper: 2.0.2
+      istanbul-lib-report: 3.0.1
+
+  iterator.prototype@1.1.5:
+    dependencies:
+      define-data-property: 1.1.4
+      es-object-atoms: 1.1.1
+      get-intrinsic: 1.3.0
+      get-proto: 1.0.1
+      has-symbols: 1.1.0
+      set-function-name: 2.0.2
+
+  jackspeak@3.4.3:
+    dependencies:
+      '@isaacs/cliui': 8.0.2
+    optionalDependencies:
+      '@pkgjs/parseargs': 0.11.0
+
+  jest-changed-files@29.7.0:
+    dependencies:
+      execa: 5.1.1
+      jest-util: 29.7.0
+      p-limit: 3.1.0
+
+  jest-circus@29.7.0:
+    dependencies:
+      '@jest/environment': 29.7.0
+      '@jest/expect': 29.7.0
+      '@jest/test-result': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 18.15.0
+      chalk: 4.1.2
+      co: 4.6.0
+      dedent: 1.5.3
+      is-generator-fn: 2.1.0
+      jest-each: 29.7.0
+      jest-matcher-utils: 29.7.0
+      jest-message-util: 29.7.0
+      jest-runtime: 29.7.0
+      jest-snapshot: 29.7.0
+      jest-util: 29.7.0
+      p-limit: 3.1.0
+      pretty-format: 29.7.0
+      pure-rand: 6.1.0
+      slash: 3.0.0
+      stack-utils: 2.0.6
+    transitivePeerDependencies:
+      - babel-plugin-macros
+      - supports-color
+
+  jest-cli@29.7.0(@types/node@18.15.0)(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5)):
+    dependencies:
+      '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5))
+      '@jest/test-result': 29.7.0
+      '@jest/types': 29.6.3
+      chalk: 4.1.2
+      create-jest: 29.7.0(@types/node@18.15.0)(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5))
+      exit: 0.1.2
+      import-local: 3.2.0
+      jest-config: 29.7.0(@types/node@18.15.0)(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5))
+      jest-util: 29.7.0
+      jest-validate: 29.7.0
+      yargs: 17.7.2
+    transitivePeerDependencies:
+      - '@types/node'
+      - babel-plugin-macros
+      - supports-color
+      - ts-node
+
+  jest-config@29.7.0(@types/node@18.15.0)(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5)):
+    dependencies:
+      '@babel/core': 7.26.10
+      '@jest/test-sequencer': 29.7.0
+      '@jest/types': 29.6.3
+      babel-jest: 29.7.0(@babel/core@7.26.10)
+      chalk: 4.1.2
+      ci-info: 3.9.0
+      deepmerge: 4.3.1
+      glob: 7.2.3
+      graceful-fs: 4.2.11
+      jest-circus: 29.7.0
+      jest-environment-node: 29.7.0
+      jest-get-type: 29.6.3
+      jest-regex-util: 29.6.3
+      jest-resolve: 29.7.0
+      jest-runner: 29.7.0
+      jest-util: 29.7.0
+      jest-validate: 29.7.0
+      micromatch: 4.0.8
+      parse-json: 5.2.0
+      pretty-format: 29.7.0
+      slash: 3.0.0
+      strip-json-comments: 3.1.1
+    optionalDependencies:
+      '@types/node': 18.15.0
+      ts-node: 10.9.2(@types/node@18.15.0)(typescript@4.9.5)
+    transitivePeerDependencies:
+      - babel-plugin-macros
+      - supports-color
+
+  jest-diff@29.7.0:
+    dependencies:
+      chalk: 4.1.2
+      diff-sequences: 29.6.3
+      jest-get-type: 29.6.3
+      pretty-format: 29.7.0
+
+  jest-docblock@29.7.0:
+    dependencies:
+      detect-newline: 3.1.0
+
+  jest-each@29.7.0:
+    dependencies:
+      '@jest/types': 29.6.3
+      chalk: 4.1.2
+      jest-get-type: 29.6.3
+      jest-util: 29.7.0
+      pretty-format: 29.7.0
+
+  jest-environment-node@29.7.0:
+    dependencies:
+      '@jest/environment': 29.7.0
+      '@jest/fake-timers': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 18.15.0
+      jest-mock: 29.7.0
+      jest-util: 29.7.0
+
+  jest-get-type@29.6.3: {}
+
+  jest-haste-map@29.7.0:
+    dependencies:
+      '@jest/types': 29.6.3
+      '@types/graceful-fs': 4.1.9
+      '@types/node': 18.15.0
+      anymatch: 3.1.3
+      fb-watchman: 2.0.2
+      graceful-fs: 4.2.11
+      jest-regex-util: 29.6.3
+      jest-util: 29.7.0
+      jest-worker: 29.7.0
+      micromatch: 4.0.8
+      walker: 1.0.8
+    optionalDependencies:
+      fsevents: 2.3.3
+
+  jest-leak-detector@29.7.0:
+    dependencies:
+      jest-get-type: 29.6.3
+      pretty-format: 29.7.0
+
+  jest-matcher-utils@29.7.0:
+    dependencies:
+      chalk: 4.1.2
+      jest-diff: 29.7.0
+      jest-get-type: 29.6.3
+      pretty-format: 29.7.0
+
+  jest-message-util@29.7.0:
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      '@jest/types': 29.6.3
+      '@types/stack-utils': 2.0.3
+      chalk: 4.1.2
+      graceful-fs: 4.2.11
+      micromatch: 4.0.8
+      pretty-format: 29.7.0
+      slash: 3.0.0
+      stack-utils: 2.0.6
+
+  jest-mock@29.7.0:
+    dependencies:
+      '@jest/types': 29.6.3
+      '@types/node': 18.15.0
+      jest-util: 29.7.0
+
+  jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
+    optionalDependencies:
+      jest-resolve: 29.7.0
+
+  jest-regex-util@29.6.3: {}
+
+  jest-resolve-dependencies@29.7.0:
+    dependencies:
+      jest-regex-util: 29.6.3
+      jest-snapshot: 29.7.0
+    transitivePeerDependencies:
+      - supports-color
+
+  jest-resolve@29.7.0:
+    dependencies:
+      chalk: 4.1.2
+      graceful-fs: 4.2.11
+      jest-haste-map: 29.7.0
+      jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0)
+      jest-util: 29.7.0
+      jest-validate: 29.7.0
+      resolve: 1.22.10
+      resolve.exports: 2.0.3
+      slash: 3.0.0
+
+  jest-runner@29.7.0:
+    dependencies:
+      '@jest/console': 29.7.0
+      '@jest/environment': 29.7.0
+      '@jest/test-result': 29.7.0
+      '@jest/transform': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 18.15.0
+      chalk: 4.1.2
+      emittery: 0.13.1
+      graceful-fs: 4.2.11
+      jest-docblock: 29.7.0
+      jest-environment-node: 29.7.0
+      jest-haste-map: 29.7.0
+      jest-leak-detector: 29.7.0
+      jest-message-util: 29.7.0
+      jest-resolve: 29.7.0
+      jest-runtime: 29.7.0
+      jest-util: 29.7.0
+      jest-watcher: 29.7.0
+      jest-worker: 29.7.0
+      p-limit: 3.1.0
+      source-map-support: 0.5.13
+    transitivePeerDependencies:
+      - supports-color
+
+  jest-runtime@29.7.0:
+    dependencies:
+      '@jest/environment': 29.7.0
+      '@jest/fake-timers': 29.7.0
+      '@jest/globals': 29.7.0
+      '@jest/source-map': 29.6.3
+      '@jest/test-result': 29.7.0
+      '@jest/transform': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 18.15.0
+      chalk: 4.1.2
+      cjs-module-lexer: 1.4.3
+      collect-v8-coverage: 1.0.2
+      glob: 7.2.3
+      graceful-fs: 4.2.11
+      jest-haste-map: 29.7.0
+      jest-message-util: 29.7.0
+      jest-mock: 29.7.0
+      jest-regex-util: 29.6.3
+      jest-resolve: 29.7.0
+      jest-snapshot: 29.7.0
+      jest-util: 29.7.0
+      slash: 3.0.0
+      strip-bom: 4.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  jest-snapshot@29.7.0:
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/generator': 7.27.0
+      '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10)
+      '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10)
+      '@babel/types': 7.27.0
+      '@jest/expect-utils': 29.7.0
+      '@jest/transform': 29.7.0
+      '@jest/types': 29.6.3
+      babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10)
+      chalk: 4.1.2
+      expect: 29.7.0
+      graceful-fs: 4.2.11
+      jest-diff: 29.7.0
+      jest-get-type: 29.6.3
+      jest-matcher-utils: 29.7.0
+      jest-message-util: 29.7.0
+      jest-util: 29.7.0
+      natural-compare: 1.4.0
+      pretty-format: 29.7.0
+      semver: 7.7.1
+    transitivePeerDependencies:
+      - supports-color
+
+  jest-util@29.7.0:
+    dependencies:
+      '@jest/types': 29.6.3
+      '@types/node': 18.15.0
+      chalk: 4.1.2
+      ci-info: 3.9.0
+      graceful-fs: 4.2.11
+      picomatch: 2.3.1
+
+  jest-validate@29.7.0:
+    dependencies:
+      '@jest/types': 29.6.3
+      camelcase: 6.3.0
+      chalk: 4.1.2
+      jest-get-type: 29.6.3
+      leven: 3.1.0
+      pretty-format: 29.7.0
+
+  jest-watcher@29.7.0:
+    dependencies:
+      '@jest/test-result': 29.7.0
+      '@jest/types': 29.6.3
+      '@types/node': 18.15.0
+      ansi-escapes: 4.3.2
+      chalk: 4.1.2
+      emittery: 0.13.1
+      jest-util: 29.7.0
+      string-length: 4.0.2
+
+  jest-worker@27.5.1:
+    dependencies:
+      '@types/node': 18.15.0
+      merge-stream: 2.0.0
+      supports-color: 8.1.1
+
+  jest-worker@29.7.0:
+    dependencies:
+      '@types/node': 18.15.0
+      jest-util: 29.7.0
+      merge-stream: 2.0.0
+      supports-color: 8.1.1
+
+  jest@29.7.0(@types/node@18.15.0)(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5)):
+    dependencies:
+      '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5))
+      '@jest/types': 29.6.3
+      import-local: 3.2.0
+      jest-cli: 29.7.0(@types/node@18.15.0)(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5))
+    transitivePeerDependencies:
+      - '@types/node'
+      - babel-plugin-macros
+      - supports-color
+      - ts-node
+
+  jiti@1.21.7: {}
+
+  js-audio-recorder@1.0.7: {}
+
+  js-cookie@3.0.5: {}
+
+  js-tokens@4.0.0: {}
+
+  js-yaml@3.14.1:
+    dependencies:
+      argparse: 1.0.10
+      esprima: 4.0.1
+
+  js-yaml@4.1.0:
+    dependencies:
+      argparse: 2.0.1
+
+  jsdoc-type-pratt-parser@4.1.0: {}
+
+  jsesc@3.0.2: {}
+
+  jsesc@3.1.0: {}
+
+  json-buffer@3.0.1: {}
+
+  json-parse-even-better-errors@2.3.1: {}
+
+  json-schema-traverse@0.4.1: {}
+
+  json-schema-traverse@1.0.0: {}
+
+  json-stable-stringify-without-jsonify@1.0.1: {}
+
+  json5@1.0.2:
+    dependencies:
+      minimist: 1.2.8
+
+  json5@2.2.3: {}
+
+  jsonc-eslint-parser@2.4.0:
+    dependencies:
+      acorn: 8.14.1
+      eslint-visitor-keys: 3.4.3
+      espree: 9.6.1
+      semver: 7.7.1
+
+  jsonfile@6.1.0:
+    dependencies:
+      universalify: 2.0.1
+    optionalDependencies:
+      graceful-fs: 4.2.11
+
+  jsonschema@1.5.0: {}
+
+  jsx-ast-utils@3.3.5:
+    dependencies:
+      array-includes: 3.1.8
+      array.prototype.flat: 1.3.3
+      object.assign: 4.1.7
+      object.values: 1.2.1
+
+  jwt-decode@4.0.0: {}
+
+  katex@0.16.22:
+    dependencies:
+      commander: 8.3.0
+
+  keyv@4.5.4:
+    dependencies:
+      json-buffer: 3.0.1
+
+  khroma@2.1.0: {}
+
+  kleur@3.0.3: {}
+
+  kolorist@1.8.0: {}
+
+  ky@1.8.0: {}
+
+  lamejs@1.2.1:
+    dependencies:
+      use-strict: 1.0.1
+
+  langium@3.0.0:
+    dependencies:
+      chevrotain: 11.0.3
+      chevrotain-allstar: 0.3.1(chevrotain@11.0.3)
+      vscode-languageserver: 9.0.1
+      vscode-languageserver-textdocument: 1.0.12
+      vscode-uri: 3.0.8
+
+  language-subtag-registry@0.3.23: {}
+
+  language-tags@1.0.9:
+    dependencies:
+      language-subtag-registry: 0.3.23
+
+  launch-ide@1.0.1:
+    dependencies:
+      chalk: 4.1.1
+      dotenv: 16.5.0
+
+  layout-base@1.0.2: {}
+
+  layout-base@2.0.1: {}
+
+  leven@3.1.0: {}
+
+  levn@0.4.1:
+    dependencies:
+      prelude-ls: 1.2.1
+      type-check: 0.4.0
+
+  lexical@0.30.0: {}
+
+  lib0@0.2.102:
+    dependencies:
+      isomorphic.js: 0.2.5
+
+  lilconfig@3.1.3: {}
+
+  line-clamp@1.0.0: {}
+
+  lines-and-columns@1.2.4: {}
+
+  lint-staged@15.5.0:
+    dependencies:
+      chalk: 5.4.1
+      commander: 13.1.0
+      debug: 4.4.0
+      execa: 8.0.1
+      lilconfig: 3.1.3
+      listr2: 8.3.2
+      micromatch: 4.0.8
+      pidtree: 0.6.0
+      string-argv: 0.3.2
+      yaml: 2.7.1
+    transitivePeerDependencies:
+      - supports-color
+
+  listr2@8.3.2:
+    dependencies:
+      cli-truncate: 4.0.0
+      colorette: 2.0.20
+      eventemitter3: 5.0.1
+      log-update: 6.1.0
+      rfdc: 1.4.1
+      wrap-ansi: 9.0.0
+
+  loader-runner@4.3.0: {}
+
+  loader-utils@2.0.4:
+    dependencies:
+      big.js: 5.2.2
+      emojis-list: 3.0.0
+      json5: 2.2.3
+
+  loader-utils@3.3.1: {}
+
+  local-pkg@1.1.1:
+    dependencies:
+      mlly: 1.7.4
+      pkg-types: 2.1.0
+      quansync: 0.2.10
+
+  locate-path@5.0.0:
+    dependencies:
+      p-locate: 4.1.0
+
+  locate-path@6.0.0:
+    dependencies:
+      p-locate: 5.0.0
+
+  locate-path@7.2.0:
+    dependencies:
+      p-locate: 6.0.0
+
+  lodash-es@4.17.21: {}
+
+  lodash.castarray@4.4.0: {}
+
+  lodash.debounce@4.0.8: {}
+
+  lodash.isplainobject@4.0.6: {}
+
+  lodash.merge@4.6.2: {}
+
+  lodash@4.17.21: {}
+
+  log-update@6.1.0:
+    dependencies:
+      ansi-escapes: 7.0.0
+      cli-cursor: 5.0.0
+      slice-ansi: 7.1.0
+      strip-ansi: 7.1.0
+      wrap-ansi: 9.0.0
+
+  longest-streak@3.1.0: {}
+
+  loose-envify@1.4.0:
+    dependencies:
+      js-tokens: 4.0.0
+
+  loupe@3.1.3: {}
+
+  lower-case@2.0.2:
+    dependencies:
+      tslib: 2.8.1
+
+  lowercase-keys@2.0.0: {}
+
+  lowlight@1.20.0:
+    dependencies:
+      fault: 1.0.4
+      highlight.js: 10.7.3
+
+  lru-cache@10.4.3: {}
+
+  lru-cache@5.1.1:
+    dependencies:
+      yallist: 3.1.1
+
+  lz-string@1.5.0: {}
+
+  magic-string@0.30.17:
+    dependencies:
+      '@jridgewell/sourcemap-codec': 1.5.0
+
+  magicast@0.3.5:
+    dependencies:
+      '@babel/parser': 7.27.0
+      '@babel/types': 7.27.0
+      source-map-js: 1.2.1
+
+  make-dir@3.1.0:
+    dependencies:
+      semver: 6.3.1
+
+  make-dir@4.0.0:
+    dependencies:
+      semver: 7.7.1
+
+  make-error@1.3.6: {}
+
+  makeerror@1.0.12:
+    dependencies:
+      tmpl: 1.0.5
+
+  map-or-similar@1.5.0: {}
+
+  markdown-extensions@2.0.0: {}
+
+  markdown-table@3.0.4: {}
+
+  marked@13.0.3: {}
+
+  math-intrinsics@1.1.0: {}
+
+  md5.js@1.3.5:
+    dependencies:
+      hash-base: 3.0.5
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+
+  mdast-util-find-and-replace@3.0.2:
+    dependencies:
+      '@types/mdast': 4.0.4
+      escape-string-regexp: 5.0.0
+      unist-util-is: 6.0.0
+      unist-util-visit-parents: 6.0.1
+
+  mdast-util-from-markdown@2.0.2:
+    dependencies:
+      '@types/mdast': 4.0.4
+      '@types/unist': 3.0.3
+      decode-named-character-reference: 1.1.0
+      devlop: 1.1.0
+      mdast-util-to-string: 4.0.0
+      micromark: 4.0.2
+      micromark-util-decode-numeric-character-reference: 2.0.2
+      micromark-util-decode-string: 2.0.1
+      micromark-util-normalize-identifier: 2.0.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+      unist-util-stringify-position: 4.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-gfm-autolink-literal@2.0.1:
+    dependencies:
+      '@types/mdast': 4.0.4
+      ccount: 2.0.1
+      devlop: 1.1.0
+      mdast-util-find-and-replace: 3.0.2
+      micromark-util-character: 2.1.1
+
+  mdast-util-gfm-footnote@2.1.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      devlop: 1.1.0
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
+      micromark-util-normalize-identifier: 2.0.1
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-gfm-strikethrough@2.0.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-gfm-table@2.0.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      devlop: 1.1.0
+      markdown-table: 3.0.4
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-gfm-task-list-item@2.0.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      devlop: 1.1.0
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-gfm@3.1.0:
+    dependencies:
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-gfm-autolink-literal: 2.0.1
+      mdast-util-gfm-footnote: 2.1.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.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-math@3.0.0:
+    dependencies:
+      '@types/hast': 3.0.4
+      '@types/mdast': 4.0.4
+      devlop: 1.1.0
+      longest-streak: 3.1.0
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
+      unist-util-remove-position: 5.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-mdx-expression@2.0.1:
+    dependencies:
+      '@types/estree-jsx': 1.0.5
+      '@types/hast': 3.0.4
+      '@types/mdast': 4.0.4
+      devlop: 1.1.0
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-mdx-jsx@3.2.0:
+    dependencies:
+      '@types/estree-jsx': 1.0.5
+      '@types/hast': 3.0.4
+      '@types/mdast': 4.0.4
+      '@types/unist': 3.0.3
+      ccount: 2.0.1
+      devlop: 1.1.0
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
+      parse-entities: 4.0.2
+      stringify-entities: 4.0.4
+      unist-util-stringify-position: 4.0.0
+      vfile-message: 4.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-mdx@3.0.0:
+    dependencies:
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-mdx-expression: 2.0.1
+      mdast-util-mdx-jsx: 3.2.0
+      mdast-util-mdxjs-esm: 2.0.1
+      mdast-util-to-markdown: 2.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-mdxjs-esm@2.0.1:
+    dependencies:
+      '@types/estree-jsx': 1.0.5
+      '@types/hast': 3.0.4
+      '@types/mdast': 4.0.4
+      devlop: 1.1.0
+      mdast-util-from-markdown: 2.0.2
+      mdast-util-to-markdown: 2.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  mdast-util-newline-to-break@2.0.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      mdast-util-find-and-replace: 3.0.2
+
+  mdast-util-phrasing@4.1.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      unist-util-is: 6.0.0
+
+  mdast-util-to-hast@13.2.0:
+    dependencies:
+      '@types/hast': 3.0.4
+      '@types/mdast': 4.0.4
+      '@ungap/structured-clone': 1.3.0
+      devlop: 1.1.0
+      micromark-util-sanitize-uri: 2.0.1
+      trim-lines: 3.0.1
+      unist-util-position: 5.0.0
+      unist-util-visit: 5.0.0
+      vfile: 6.0.3
+
+  mdast-util-to-markdown@2.1.2:
+    dependencies:
+      '@types/mdast': 4.0.4
+      '@types/unist': 3.0.3
+      longest-streak: 3.1.0
+      mdast-util-phrasing: 4.1.0
+      mdast-util-to-string: 4.0.0
+      micromark-util-classify-character: 2.0.1
+      micromark-util-decode-string: 2.0.1
+      unist-util-visit: 5.0.0
+      zwitch: 2.0.4
+
+  mdast-util-to-string@4.0.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+
+  memfs@3.5.3:
+    dependencies:
+      fs-monkey: 1.0.6
+
+  memoize-one@5.2.1: {}
+
+  memoizerific@1.11.3:
+    dependencies:
+      map-or-similar: 1.5.0
+
+  merge-stream@2.0.0: {}
+
+  merge2@1.4.1: {}
+
+  mermaid@11.4.1:
+    dependencies:
+      '@braintree/sanitize-url': 7.1.1
+      '@iconify/utils': 2.3.0
+      '@mermaid-js/parser': 0.3.0
+      '@types/d3': 7.4.3
+      cytoscape: 3.31.2
+      cytoscape-cose-bilkent: 4.1.0(cytoscape@3.31.2)
+      cytoscape-fcose: 2.2.0(cytoscape@3.31.2)
+      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: 13.0.3
+      roughjs: 4.6.6
+      stylis: 4.3.6
+      ts-dedent: 2.2.0
+      uuid: 9.0.1
+    transitivePeerDependencies:
+      - supports-color
+
+  micromark-core-commonmark@2.0.3:
+    dependencies:
+      decode-named-character-reference: 1.1.0
+      devlop: 1.1.0
+      micromark-factory-destination: 2.0.1
+      micromark-factory-label: 2.0.1
+      micromark-factory-space: 2.0.1
+      micromark-factory-title: 2.0.1
+      micromark-factory-whitespace: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-chunked: 2.0.1
+      micromark-util-classify-character: 2.0.1
+      micromark-util-html-tag-name: 2.0.1
+      micromark-util-normalize-identifier: 2.0.1
+      micromark-util-resolve-all: 2.0.1
+      micromark-util-subtokenize: 2.1.0
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-extension-gfm-autolink-literal@2.1.0:
+    dependencies:
+      micromark-util-character: 2.1.1
+      micromark-util-sanitize-uri: 2.0.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-extension-gfm-footnote@2.1.0:
+    dependencies:
+      devlop: 1.1.0
+      micromark-core-commonmark: 2.0.3
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-normalize-identifier: 2.0.1
+      micromark-util-sanitize-uri: 2.0.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-extension-gfm-strikethrough@2.1.0:
+    dependencies:
+      devlop: 1.1.0
+      micromark-util-chunked: 2.0.1
+      micromark-util-classify-character: 2.0.1
+      micromark-util-resolve-all: 2.0.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-extension-gfm-table@2.1.1:
+    dependencies:
+      devlop: 1.1.0
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-extension-gfm-tagfilter@2.0.0:
+    dependencies:
+      micromark-util-types: 2.0.2
+
+  micromark-extension-gfm-task-list-item@2.1.0:
+    dependencies:
+      devlop: 1.1.0
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-extension-gfm@3.0.0:
+    dependencies:
+      micromark-extension-gfm-autolink-literal: 2.1.0
+      micromark-extension-gfm-footnote: 2.1.0
+      micromark-extension-gfm-strikethrough: 2.1.0
+      micromark-extension-gfm-table: 2.1.1
+      micromark-extension-gfm-tagfilter: 2.0.0
+      micromark-extension-gfm-task-list-item: 2.1.0
+      micromark-util-combine-extensions: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-extension-math@3.1.0:
+    dependencies:
+      '@types/katex': 0.16.7
+      devlop: 1.1.0
+      katex: 0.16.22
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-extension-mdx-expression@3.0.1:
+    dependencies:
+      '@types/estree': 1.0.7
+      devlop: 1.1.0
+      micromark-factory-mdx-expression: 2.0.3
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-events-to-acorn: 2.0.3
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-extension-mdx-jsx@3.0.2:
+    dependencies:
+      '@types/estree': 1.0.7
+      devlop: 1.1.0
+      estree-util-is-identifier-name: 3.0.0
+      micromark-factory-mdx-expression: 2.0.3
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-events-to-acorn: 2.0.3
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+      vfile-message: 4.0.2
+
+  micromark-extension-mdx-md@2.0.0:
+    dependencies:
+      micromark-util-types: 2.0.2
+
+  micromark-extension-mdxjs-esm@3.0.0:
+    dependencies:
+      '@types/estree': 1.0.7
+      devlop: 1.1.0
+      micromark-core-commonmark: 2.0.3
+      micromark-util-character: 2.1.1
+      micromark-util-events-to-acorn: 2.0.3
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+      unist-util-position-from-estree: 2.0.0
+      vfile-message: 4.0.2
+
+  micromark-extension-mdxjs@3.0.0:
+    dependencies:
+      acorn: 8.14.1
+      acorn-jsx: 5.3.2(acorn@8.14.1)
+      micromark-extension-mdx-expression: 3.0.1
+      micromark-extension-mdx-jsx: 3.0.2
+      micromark-extension-mdx-md: 2.0.0
+      micromark-extension-mdxjs-esm: 3.0.0
+      micromark-util-combine-extensions: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-factory-destination@2.0.1:
+    dependencies:
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-factory-label@2.0.1:
+    dependencies:
+      devlop: 1.1.0
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-factory-mdx-expression@2.0.3:
+    dependencies:
+      '@types/estree': 1.0.7
+      devlop: 1.1.0
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-events-to-acorn: 2.0.3
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+      unist-util-position-from-estree: 2.0.0
+      vfile-message: 4.0.2
+
+  micromark-factory-space@2.0.1:
+    dependencies:
+      micromark-util-character: 2.1.1
+      micromark-util-types: 2.0.2
+
+  micromark-factory-title@2.0.1:
+    dependencies:
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-factory-whitespace@2.0.1:
+    dependencies:
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-util-character@2.1.1:
+    dependencies:
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-util-chunked@2.0.1:
+    dependencies:
+      micromark-util-symbol: 2.0.1
+
+  micromark-util-classify-character@2.0.1:
+    dependencies:
+      micromark-util-character: 2.1.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-util-combine-extensions@2.0.1:
+    dependencies:
+      micromark-util-chunked: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-util-decode-numeric-character-reference@2.0.2:
+    dependencies:
+      micromark-util-symbol: 2.0.1
+
+  micromark-util-decode-string@2.0.1:
+    dependencies:
+      decode-named-character-reference: 1.1.0
+      micromark-util-character: 2.1.1
+      micromark-util-decode-numeric-character-reference: 2.0.2
+      micromark-util-symbol: 2.0.1
+
+  micromark-util-encode@2.0.1: {}
+
+  micromark-util-events-to-acorn@2.0.3:
+    dependencies:
+      '@types/estree': 1.0.7
+      '@types/unist': 3.0.3
+      devlop: 1.1.0
+      estree-util-visit: 2.0.0
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+      vfile-message: 4.0.2
+
+  micromark-util-html-tag-name@2.0.1: {}
+
+  micromark-util-normalize-identifier@2.0.1:
+    dependencies:
+      micromark-util-symbol: 2.0.1
+
+  micromark-util-resolve-all@2.0.1:
+    dependencies:
+      micromark-util-types: 2.0.2
+
+  micromark-util-sanitize-uri@2.0.1:
+    dependencies:
+      micromark-util-character: 2.1.1
+      micromark-util-encode: 2.0.1
+      micromark-util-symbol: 2.0.1
+
+  micromark-util-subtokenize@2.1.0:
+    dependencies:
+      devlop: 1.1.0
+      micromark-util-chunked: 2.0.1
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+
+  micromark-util-symbol@2.0.1: {}
+
+  micromark-util-types@2.0.2: {}
+
+  micromark@4.0.2:
+    dependencies:
+      '@types/debug': 4.1.12
+      debug: 4.4.0
+      decode-named-character-reference: 1.1.0
+      devlop: 1.1.0
+      micromark-core-commonmark: 2.0.3
+      micromark-factory-space: 2.0.1
+      micromark-util-character: 2.1.1
+      micromark-util-chunked: 2.0.1
+      micromark-util-combine-extensions: 2.0.1
+      micromark-util-decode-numeric-character-reference: 2.0.2
+      micromark-util-encode: 2.0.1
+      micromark-util-normalize-identifier: 2.0.1
+      micromark-util-resolve-all: 2.0.1
+      micromark-util-sanitize-uri: 2.0.1
+      micromark-util-subtokenize: 2.1.0
+      micromark-util-symbol: 2.0.1
+      micromark-util-types: 2.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  micromatch@4.0.8:
+    dependencies:
+      braces: 3.0.3
+      picomatch: 2.3.1
+
+  miller-rabin@4.0.1:
+    dependencies:
+      bn.js: 4.12.1
+      brorand: 1.1.0
+
+  mime-db@1.52.0: {}
+
+  mime-types@2.1.35:
+    dependencies:
+      mime-db: 1.52.0
+
+  mime@4.0.7: {}
+
+  mimic-fn@2.1.0: {}
+
+  mimic-fn@4.0.0: {}
+
+  mimic-function@5.0.1: {}
+
+  mimic-response@1.0.1: {}
+
+  mimic-response@2.1.0:
+    optional: true
+
+  mimic-response@3.1.0: {}
+
+  min-indent@1.0.1: {}
+
+  minimalistic-assert@1.0.1: {}
+
+  minimalistic-crypto-utils@1.0.1: {}
+
+  minimatch@10.0.1:
+    dependencies:
+      brace-expansion: 2.0.1
+
+  minimatch@3.1.2:
+    dependencies:
+      brace-expansion: 1.1.11
+
+  minimatch@9.0.5:
+    dependencies:
+      brace-expansion: 2.0.1
+
+  minimist@1.2.8: {}
+
+  minipass@3.3.6:
+    dependencies:
+      yallist: 4.0.0
+    optional: true
+
+  minipass@5.0.0:
+    optional: true
+
+  minipass@7.1.2: {}
+
+  minizlib@2.1.2:
+    dependencies:
+      minipass: 3.3.6
+      yallist: 4.0.0
+    optional: true
+
+  mitt@3.0.1: {}
+
+  mkdirp@1.0.4:
+    optional: true
+
+  mlly@1.7.4:
+    dependencies:
+      acorn: 8.14.1
+      pathe: 2.0.3
+      pkg-types: 1.3.1
+      ufo: 1.6.1
+
+  monaco-editor@0.52.2: {}
+
+  ms@2.1.3: {}
+
+  mz@2.7.0:
+    dependencies:
+      any-promise: 1.3.0
+      object-assign: 4.1.1
+      thenify-all: 1.6.0
+
+  nan@2.22.2:
+    optional: true
+
+  nanoid@3.3.11: {}
+
+  natural-compare@1.4.0: {}
+
+  natural-orderby@5.0.0: {}
+
+  negotiator@0.6.4: {}
+
+  neo-async@2.6.2: {}
+
+  next-themes@0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+    dependencies:
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  next@15.2.3(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.86.3):
+    dependencies:
+      '@next/env': 15.2.3
+      '@swc/counter': 0.1.3
+      '@swc/helpers': 0.5.15
+      busboy: 1.6.0
+      caniuse-lite: 1.0.30001713
+      postcss: 8.4.31
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      styled-jsx: 5.1.6(@babel/core@7.26.10)(react@19.0.0)
+    optionalDependencies:
+      '@next/swc-darwin-arm64': 15.2.3
+      '@next/swc-darwin-x64': 15.2.3
+      '@next/swc-linux-arm64-gnu': 15.2.3
+      '@next/swc-linux-arm64-musl': 15.2.3
+      '@next/swc-linux-x64-gnu': 15.2.3
+      '@next/swc-linux-x64-musl': 15.2.3
+      '@next/swc-win32-arm64-msvc': 15.2.3
+      '@next/swc-win32-x64-msvc': 15.2.3
+      sass: 1.86.3
+      sharp: 0.33.5
+    transitivePeerDependencies:
+      - '@babel/core'
+      - babel-plugin-macros
+
+  no-case@3.0.4:
+    dependencies:
+      lower-case: 2.0.2
+      tslib: 2.8.1
+
+  node-abort-controller@3.1.1: {}
+
+  node-addon-api@7.1.1:
+    optional: true
+
+  node-fetch@2.7.0:
+    dependencies:
+      whatwg-url: 5.0.0
+    optional: true
+
+  node-int64@0.4.0: {}
+
+  node-polyfill-webpack-plugin@2.0.1(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)):
+    dependencies:
+      assert: 2.1.0
+      browserify-zlib: 0.2.0
+      buffer: 6.0.3
+      console-browserify: 1.2.0
+      constants-browserify: 1.0.0
+      crypto-browserify: 3.12.1
+      domain-browser: 4.23.0
+      events: 3.3.0
+      filter-obj: 2.0.2
+      https-browserify: 1.0.0
+      os-browserify: 0.3.0
+      path-browserify: 1.0.1
+      process: 0.11.10
+      punycode: 2.3.1
+      querystring-es3: 0.2.1
+      readable-stream: 4.7.0
+      stream-browserify: 3.0.0
+      stream-http: 3.2.0
+      string_decoder: 1.3.0
+      timers-browserify: 2.0.12
+      tty-browserify: 0.0.1
+      type-fest: 2.19.0
+      url: 0.11.4
+      util: 0.12.5
+      vm-browserify: 1.1.2
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+
+  node-releases@2.0.19: {}
+
+  nopt@5.0.0:
+    dependencies:
+      abbrev: 1.1.1
+    optional: true
+
+  normalize-package-data@6.0.2:
+    dependencies:
+      hosted-git-info: 7.0.2
+      semver: 7.7.1
+      validate-npm-package-license: 3.0.4
+
+  normalize-path@3.0.0: {}
+
+  normalize-range@0.1.2: {}
+
+  normalize-url@6.1.0: {}
+
+  normalize-wheel@1.0.1: {}
+
+  npm-run-path@4.0.1:
+    dependencies:
+      path-key: 3.1.1
+
+  npm-run-path@5.3.0:
+    dependencies:
+      path-key: 4.0.0
+
+  npmlog@5.0.1:
+    dependencies:
+      are-we-there-yet: 2.0.0
+      console-control-strings: 1.1.0
+      gauge: 3.0.2
+      set-blocking: 2.0.0
+    optional: true
+
+  nth-check@2.1.1:
+    dependencies:
+      boolbase: 1.0.0
+
+  object-assign@4.1.1: {}
+
+  object-hash@3.0.0: {}
+
+  object-inspect@1.13.4: {}
+
+  object-is@1.1.6:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+
+  object-keys@1.1.1: {}
+
+  object.assign@4.1.7:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+      has-symbols: 1.1.0
+      object-keys: 1.1.1
+
+  object.entries@1.1.9:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  object.fromentries@2.0.8:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-object-atoms: 1.1.1
+
+  object.groupby@1.0.3:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+
+  object.values@1.2.1:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  objectorarray@1.0.5: {}
+
+  once@1.4.0:
+    dependencies:
+      wrappy: 1.0.2
+
+  onetime@5.1.2:
+    dependencies:
+      mimic-fn: 2.1.0
+
+  onetime@6.0.0:
+    dependencies:
+      mimic-fn: 4.0.0
+
+  onetime@7.0.0:
+    dependencies:
+      mimic-function: 5.0.1
+
+  open@8.4.2:
+    dependencies:
+      define-lazy-prop: 2.0.0
+      is-docker: 2.2.1
+      is-wsl: 2.2.0
+
+  optionator@0.9.4:
+    dependencies:
+      deep-is: 0.1.4
+      fast-levenshtein: 2.0.6
+      levn: 0.4.1
+      prelude-ls: 1.2.1
+      type-check: 0.4.0
+      word-wrap: 1.2.5
+
+  os-browserify@0.3.0: {}
+
+  own-keys@1.0.1:
+    dependencies:
+      get-intrinsic: 1.3.0
+      object-keys: 1.1.1
+      safe-push-apply: 1.0.0
+
+  p-cancelable@2.1.1: {}
+
+  p-limit@2.3.0:
+    dependencies:
+      p-try: 2.2.0
+
+  p-limit@3.1.0:
+    dependencies:
+      yocto-queue: 0.1.0
+
+  p-limit@4.0.0:
+    dependencies:
+      yocto-queue: 1.2.1
+
+  p-locate@4.1.0:
+    dependencies:
+      p-limit: 2.3.0
+
+  p-locate@5.0.0:
+    dependencies:
+      p-limit: 3.1.0
+
+  p-locate@6.0.0:
+    dependencies:
+      p-limit: 4.0.0
+
+  p-try@2.2.0: {}
+
+  package-json-from-dist@1.0.1: {}
+
+  package-manager-detector@0.2.11:
+    dependencies:
+      quansync: 0.2.10
+
+  pako@1.0.11: {}
+
+  papaparse@5.5.2: {}
+
+  param-case@3.0.4:
+    dependencies:
+      dot-case: 3.0.4
+      tslib: 2.8.1
+
+  parent-module@1.0.1:
+    dependencies:
+      callsites: 3.1.0
+
+  parse-asn1@5.1.7:
+    dependencies:
+      asn1.js: 4.10.1
+      browserify-aes: 1.2.0
+      evp_bytestokey: 1.0.3
+      hash-base: 3.0.5
+      pbkdf2: 3.1.2
+      safe-buffer: 5.2.1
+
+  parse-entities@2.0.0:
+    dependencies:
+      character-entities: 1.2.4
+      character-entities-legacy: 1.1.4
+      character-reference-invalid: 1.1.4
+      is-alphanumerical: 1.0.4
+      is-decimal: 1.0.4
+      is-hexadecimal: 1.0.4
+
+  parse-entities@4.0.2:
+    dependencies:
+      '@types/unist': 2.0.11
+      character-entities-legacy: 3.0.0
+      character-reference-invalid: 2.0.1
+      decode-named-character-reference: 1.1.0
+      is-alphanumerical: 2.0.1
+      is-decimal: 2.0.1
+      is-hexadecimal: 2.0.1
+
+  parse-gitignore@2.0.0: {}
+
+  parse-imports@2.2.1:
+    dependencies:
+      es-module-lexer: 1.6.0
+      slashes: 3.0.12
+
+  parse-json@5.2.0:
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      error-ex: 1.3.2
+      json-parse-even-better-errors: 2.3.1
+      lines-and-columns: 1.2.4
+
+  parse-json@8.3.0:
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      index-to-position: 1.1.0
+      type-fest: 4.39.1
+
+  parse5@7.2.1:
+    dependencies:
+      entities: 4.5.0
+
+  pascal-case@3.1.2:
+    dependencies:
+      no-case: 3.0.4
+      tslib: 2.8.1
+
+  path-browserify@1.0.1: {}
+
+  path-data-parser@0.1.0: {}
+
+  path-exists@4.0.0: {}
+
+  path-exists@5.0.0: {}
+
+  path-is-absolute@1.0.1: {}
+
+  path-key@3.1.1: {}
+
+  path-key@4.0.0: {}
+
+  path-parse@1.0.7: {}
+
+  path-scurry@1.11.1:
+    dependencies:
+      lru-cache: 10.4.3
+      minipass: 7.1.2
+
+  path-type@4.0.0: {}
+
+  path2d@0.2.2:
+    optional: true
+
+  pathe@2.0.3: {}
+
+  pathval@2.0.0: {}
+
+  pbkdf2@3.1.2:
+    dependencies:
+      create-hash: 1.2.0
+      create-hmac: 1.1.7
+      ripemd160: 2.0.2
+      safe-buffer: 5.2.1
+      sha.js: 2.4.11
+
+  pdfjs-dist@4.4.168:
+    optionalDependencies:
+      canvas: 2.11.2
+      path2d: 0.2.2
+    transitivePeerDependencies:
+      - encoding
+      - supports-color
+
+  picocolors@1.1.1: {}
+
+  picomatch@2.3.1: {}
+
+  picomatch@4.0.2: {}
+
+  pidtree@0.6.0: {}
+
+  pify@2.3.0: {}
+
+  pinyin-pro@3.26.0: {}
+
+  pirates@4.0.7: {}
+
+  pkg-dir@4.2.0:
+    dependencies:
+      find-up: 4.1.0
+
+  pkg-dir@7.0.0:
+    dependencies:
+      find-up: 6.3.0
+
+  pkg-types@1.3.1:
+    dependencies:
+      confbox: 0.1.8
+      mlly: 1.7.4
+      pathe: 2.0.3
+
+  pkg-types@2.1.0:
+    dependencies:
+      confbox: 0.2.2
+      exsolve: 1.0.4
+      pathe: 2.0.3
+
+  pluralize@8.0.0: {}
+
+  pnp-webpack-plugin@1.7.0(typescript@4.9.5):
+    dependencies:
+      ts-pnp: 1.2.0(typescript@4.9.5)
+    transitivePeerDependencies:
+      - typescript
+
+  pnpm-workspace-yaml@0.3.1:
+    dependencies:
+      yaml: 2.7.1
+
+  points-on-curve@0.2.0: {}
+
+  points-on-path@0.2.1:
+    dependencies:
+      path-data-parser: 0.1.0
+      points-on-curve: 0.2.0
+
+  polished@4.3.1:
+    dependencies:
+      '@babel/runtime': 7.27.0
+
+  portfinder@1.0.35:
+    dependencies:
+      async: 3.2.6
+      debug: 4.4.0
+    transitivePeerDependencies:
+      - supports-color
+
+  possible-typed-array-names@1.1.0: {}
+
+  postcss-import@15.1.0(postcss@8.5.3):
+    dependencies:
+      postcss: 8.5.3
+      postcss-value-parser: 4.2.0
+      read-cache: 1.0.0
+      resolve: 1.22.10
+
+  postcss-js@4.0.1(postcss@8.5.3):
+    dependencies:
+      camelcase-css: 2.0.1
+      postcss: 8.5.3
+
+  postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5)):
+    dependencies:
+      lilconfig: 3.1.3
+      yaml: 2.7.1
+    optionalDependencies:
+      postcss: 8.5.3
+      ts-node: 10.9.2(@types/node@18.15.0)(typescript@4.9.5)
+
+  postcss-loader@8.1.1(postcss@8.5.3)(typescript@4.9.5)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)):
+    dependencies:
+      cosmiconfig: 9.0.0(typescript@4.9.5)
+      jiti: 1.21.7
+      postcss: 8.5.3
+      semver: 7.7.1
+    optionalDependencies:
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+    transitivePeerDependencies:
+      - typescript
+
+  postcss-modules-extract-imports@3.1.0(postcss@8.5.3):
+    dependencies:
+      postcss: 8.5.3
+
+  postcss-modules-local-by-default@4.2.0(postcss@8.5.3):
+    dependencies:
+      icss-utils: 5.1.0(postcss@8.5.3)
+      postcss: 8.5.3
+      postcss-selector-parser: 7.1.0
+      postcss-value-parser: 4.2.0
+
+  postcss-modules-scope@3.2.1(postcss@8.5.3):
+    dependencies:
+      postcss: 8.5.3
+      postcss-selector-parser: 7.1.0
+
+  postcss-modules-values@4.0.0(postcss@8.5.3):
+    dependencies:
+      icss-utils: 5.1.0(postcss@8.5.3)
+      postcss: 8.5.3
+
+  postcss-nested@6.2.0(postcss@8.5.3):
+    dependencies:
+      postcss: 8.5.3
+      postcss-selector-parser: 6.1.2
+
+  postcss-selector-parser@6.0.10:
+    dependencies:
+      cssesc: 3.0.0
+      util-deprecate: 1.0.2
+
+  postcss-selector-parser@6.1.2:
+    dependencies:
+      cssesc: 3.0.0
+      util-deprecate: 1.0.2
+
+  postcss-selector-parser@7.1.0:
+    dependencies:
+      cssesc: 3.0.0
+      util-deprecate: 1.0.2
+
+  postcss-value-parser@4.2.0: {}
+
+  postcss@8.4.31:
+    dependencies:
+      nanoid: 3.3.11
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
+
+  postcss@8.5.3:
+    dependencies:
+      nanoid: 3.3.11
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
+
+  prelude-ls@1.2.1: {}
+
+  pretty-error@4.0.0:
+    dependencies:
+      lodash: 4.17.21
+      renderkid: 3.0.0
+
+  pretty-format@27.5.1:
+    dependencies:
+      ansi-regex: 5.0.1
+      ansi-styles: 5.2.0
+      react-is: 17.0.2
+
+  pretty-format@29.7.0:
+    dependencies:
+      '@jest/schemas': 29.6.3
+      ansi-styles: 5.2.0
+      react-is: 18.3.1
+
+  prismjs@1.27.0: {}
+
+  prismjs@1.30.0: {}
+
+  process-nextick-args@2.0.1: {}
+
+  process@0.11.10: {}
+
+  prompts@2.4.2:
+    dependencies:
+      kleur: 3.0.3
+      sisteransi: 1.0.5
+
+  prop-types@15.8.1:
+    dependencies:
+      loose-envify: 1.4.0
+      object-assign: 4.1.1
+      react-is: 16.13.1
+
+  property-information@5.6.0:
+    dependencies:
+      xtend: 4.0.2
+
+  property-information@6.5.0: {}
+
+  property-information@7.0.0: {}
+
+  public-encrypt@4.0.3:
+    dependencies:
+      bn.js: 4.12.1
+      browserify-rsa: 4.1.1
+      create-hash: 1.2.0
+      parse-asn1: 5.1.7
+      randombytes: 2.1.0
+      safe-buffer: 5.2.1
+
+  pump@3.0.2:
+    dependencies:
+      end-of-stream: 1.4.4
+      once: 1.4.0
+
+  punycode@1.4.1: {}
+
+  punycode@2.3.1: {}
+
+  pure-rand@6.1.0: {}
+
+  qrcode.react@4.2.0(react@19.0.0):
+    dependencies:
+      react: 19.0.0
+
+  qs@6.14.0:
+    dependencies:
+      side-channel: 1.1.0
+
+  quansync@0.2.10: {}
+
+  querystring-es3@0.2.1: {}
+
+  queue-microtask@1.2.3: {}
+
+  queue@6.0.2:
+    dependencies:
+      inherits: 2.0.4
+
+  quick-lru@5.1.1: {}
+
+  randombytes@2.1.0:
+    dependencies:
+      safe-buffer: 5.2.1
+
+  randomfill@1.0.4:
+    dependencies:
+      randombytes: 2.1.0
+      safe-buffer: 5.2.1
+
+  range-parser@1.2.1: {}
+
+  re-resizable@6.11.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+    dependencies:
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  react-18-input-autosize@3.0.0(react@19.0.0):
+    dependencies:
+      prop-types: 15.8.1
+      react: 19.0.0
+
+  react-confetti@6.4.0(react@19.0.0):
+    dependencies:
+      react: 19.0.0
+      tween-functions: 1.2.0
+
+  react-docgen-typescript@2.2.2(typescript@4.9.5):
+    dependencies:
+      typescript: 4.9.5
+
+  react-docgen@7.1.1:
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/traverse': 7.27.0
+      '@babel/types': 7.27.0
+      '@types/babel__core': 7.20.5
+      '@types/babel__traverse': 7.20.7
+      '@types/doctrine': 0.0.9
+      '@types/resolve': 1.20.6
+      doctrine: 3.0.0
+      resolve: 1.22.10
+      strip-indent: 4.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  react-dom@18.3.1(react@18.3.1):
+    dependencies:
+      loose-envify: 1.4.0
+      react: 18.3.1
+      scheduler: 0.23.2
+
+  react-dom@19.0.0(react@19.0.0):
+    dependencies:
+      react: 19.0.0
+      scheduler: 0.25.0
+
+  react-draggable@4.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+    dependencies:
+      clsx: 1.2.1
+      prop-types: 15.8.1
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  react-easy-crop@5.4.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+    dependencies:
+      normalize-wheel: 1.0.1
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      tslib: 2.8.1
+
+  react-error-boundary@3.1.4(react@19.0.0):
+    dependencies:
+      '@babel/runtime': 7.27.0
+      react: 19.0.0
+
+  react-error-boundary@4.1.2(react@19.0.0):
+    dependencies:
+      '@babel/runtime': 7.27.0
+      react: 19.0.0
+
+  react-fast-compare@3.2.2: {}
+
+  react-headless-pagination@1.1.6(react@19.0.0):
+    dependencies:
+      clsx: 2.1.1
+      react: 19.0.0
+
+  react-hook-form@7.55.0(react@19.0.0):
+    dependencies:
+      react: 19.0.0
+
+  react-hotkeys-hook@4.6.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+    dependencies:
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  react-i18next@15.4.1(i18next@23.16.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+    dependencies:
+      '@babel/runtime': 7.27.0
+      html-parse-stringify: 3.0.1
+      i18next: 23.16.8
+      react: 19.0.0
+    optionalDependencies:
+      react-dom: 19.0.0(react@19.0.0)
+
+  react-infinite-scroll-component@6.1.0(react@19.0.0):
+    dependencies:
+      react: 19.0.0
+      throttle-debounce: 2.3.0
+
+  react-is@16.13.1: {}
+
+  react-is@17.0.2: {}
+
+  react-is@18.3.1: {}
+
+  react-markdown@9.1.0(@types/react@18.2.79)(react@19.0.0):
+    dependencies:
+      '@types/hast': 3.0.4
+      '@types/mdast': 4.0.4
+      '@types/react': 18.2.79
+      devlop: 1.1.0
+      hast-util-to-jsx-runtime: 2.3.6
+      html-url-attributes: 3.0.1
+      mdast-util-to-hast: 13.2.0
+      react: 19.0.0
+      remark-parse: 11.0.0
+      remark-rehype: 11.1.2
+      unified: 11.0.5
+      unist-util-visit: 5.0.0
+      vfile: 6.0.3
+    transitivePeerDependencies:
+      - supports-color
+
+  react-multi-email@1.0.25(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+    dependencies:
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  react-papaparse@4.4.0:
+    dependencies:
+      '@types/papaparse': 5.3.15
+      papaparse: 5.5.2
+
+  react-pdf-highlighter@8.0.0-rc.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+    dependencies:
+      pdfjs-dist: 4.4.168
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      react-rnd: 10.5.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      ts-debounce: 4.0.0
+    transitivePeerDependencies:
+      - encoding
+      - supports-color
+
+  react-refresh@0.14.2: {}
+
+  react-rnd@10.5.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+    dependencies:
+      re-resizable: 6.11.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      react-draggable: 4.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      tslib: 2.6.2
+
+  react-slider@2.0.6(react@19.0.0):
+    dependencies:
+      prop-types: 15.8.1
+      react: 19.0.0
+
+  react-sortablejs@6.1.4(@types/sortablejs@1.15.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sortablejs@1.15.6):
+    dependencies:
+      '@types/sortablejs': 1.15.8
+      classnames: 2.3.1
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+      sortablejs: 1.15.6
+      tiny-invariant: 1.2.0
+
+  react-syntax-highlighter@15.6.1(react@19.0.0):
+    dependencies:
+      '@babel/runtime': 7.27.0
+      highlight.js: 10.7.3
+      highlightjs-vue: 1.0.0
+      lowlight: 1.20.0
+      prismjs: 1.30.0
+      react: 19.0.0
+      refractor: 3.6.0
+
+  react-textarea-autosize@8.5.9(@types/react@18.2.79)(react@19.0.0):
+    dependencies:
+      '@babel/runtime': 7.27.0
+      react: 19.0.0
+      use-composed-ref: 1.4.0(@types/react@18.2.79)(react@19.0.0)
+      use-latest: 1.3.0(@types/react@18.2.79)(react@19.0.0)
+    transitivePeerDependencies:
+      - '@types/react'
+
+  react-tooltip@5.8.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+    dependencies:
+      '@floating-ui/dom': 1.1.1
+      classnames: 2.5.1
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  react-window-infinite-loader@1.0.10(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+    dependencies:
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  react-window@1.8.11(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+    dependencies:
+      '@babel/runtime': 7.27.0
+      memoize-one: 5.2.1
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+
+  react@18.3.1:
+    dependencies:
+      loose-envify: 1.4.0
+
+  react@19.0.0: {}
+
+  reactflow@11.11.4(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+    dependencies:
+      '@reactflow/background': 11.3.14(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@reactflow/controls': 11.2.14(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@reactflow/core': 11.11.4(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@reactflow/minimap': 11.7.14(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@reactflow/node-resizer': 2.2.14(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      '@reactflow/node-toolbar': 1.3.14(@types/react@18.2.79)(immer@9.0.21)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+      react: 19.0.0
+      react-dom: 19.0.0(react@19.0.0)
+    transitivePeerDependencies:
+      - '@types/react'
+      - immer
+
+  read-cache@1.0.0:
+    dependencies:
+      pify: 2.3.0
+
+  read-package-up@11.0.0:
+    dependencies:
+      find-up-simple: 1.0.1
+      read-pkg: 9.0.1
+      type-fest: 4.39.1
+
+  read-pkg@9.0.1:
+    dependencies:
+      '@types/normalize-package-data': 2.4.4
+      normalize-package-data: 6.0.2
+      parse-json: 8.3.0
+      type-fest: 4.39.1
+      unicorn-magic: 0.1.0
+
+  readable-stream@2.3.8:
+    dependencies:
+      core-util-is: 1.0.3
+      inherits: 2.0.4
+      isarray: 1.0.0
+      process-nextick-args: 2.0.1
+      safe-buffer: 5.1.2
+      string_decoder: 1.1.1
+      util-deprecate: 1.0.2
+
+  readable-stream@3.6.2:
+    dependencies:
+      inherits: 2.0.4
+      string_decoder: 1.3.0
+      util-deprecate: 1.0.2
+
+  readable-stream@4.7.0:
+    dependencies:
+      abort-controller: 3.0.0
+      buffer: 6.0.3
+      events: 3.3.0
+      process: 0.11.10
+      string_decoder: 1.3.0
+
+  readdirp@3.6.0:
+    dependencies:
+      picomatch: 2.3.1
+
+  readdirp@4.1.2: {}
+
+  recast@0.23.11:
+    dependencies:
+      ast-types: 0.16.1
+      esprima: 4.0.1
+      source-map: 0.6.1
+      tiny-invariant: 1.3.3
+      tslib: 2.8.1
+
+  recma-build-jsx@1.0.0:
+    dependencies:
+      '@types/estree': 1.0.7
+      estree-util-build-jsx: 3.0.1
+      vfile: 6.0.3
+
+  recma-jsx@1.0.0(acorn@8.14.1):
+    dependencies:
+      acorn-jsx: 5.3.2(acorn@8.14.1)
+      estree-util-to-js: 2.0.0
+      recma-parse: 1.0.0
+      recma-stringify: 1.0.0
+      unified: 11.0.5
+    transitivePeerDependencies:
+      - acorn
+
+  recma-parse@1.0.0:
+    dependencies:
+      '@types/estree': 1.0.7
+      esast-util-from-js: 2.0.1
+      unified: 11.0.5
+      vfile: 6.0.3
+
+  recma-stringify@1.0.0:
+    dependencies:
+      '@types/estree': 1.0.7
+      estree-util-to-js: 2.0.0
+      unified: 11.0.5
+      vfile: 6.0.3
+
+  recordrtc@5.6.2: {}
+
+  redent@3.0.0:
+    dependencies:
+      indent-string: 4.0.0
+      strip-indent: 3.0.0
+
+  refa@0.12.1:
+    dependencies:
+      '@eslint-community/regexpp': 4.12.1
+
+  reflect.getprototypeof@1.0.10:
+    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.1.1
+      get-intrinsic: 1.3.0
+      get-proto: 1.0.1
+      which-builtin-type: 1.2.1
+
+  refractor@3.6.0:
+    dependencies:
+      hastscript: 6.0.0
+      parse-entities: 2.0.0
+      prismjs: 1.27.0
+
+  regenerate-unicode-properties@10.2.0:
+    dependencies:
+      regenerate: 1.4.2
+
+  regenerate@1.4.2: {}
+
+  regenerator-runtime@0.14.1: {}
+
+  regenerator-transform@0.15.2:
+    dependencies:
+      '@babel/runtime': 7.27.0
+
+  regex-parser@2.3.1: {}
+
+  regexp-ast-analysis@0.7.1:
+    dependencies:
+      '@eslint-community/regexpp': 4.12.1
+      refa: 0.12.1
+
+  regexp-tree@0.1.27: {}
+
+  regexp.prototype.flags@1.5.4:
+    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
+
+  regexpu-core@6.2.0:
+    dependencies:
+      regenerate: 1.4.2
+      regenerate-unicode-properties: 10.2.0
+      regjsgen: 0.8.0
+      regjsparser: 0.12.0
+      unicode-match-property-ecmascript: 2.0.0
+      unicode-match-property-value-ecmascript: 2.2.0
+
+  regjsgen@0.8.0: {}
+
+  regjsparser@0.12.0:
+    dependencies:
+      jsesc: 3.0.2
+
+  rehype-katex@7.0.1:
+    dependencies:
+      '@types/hast': 3.0.4
+      '@types/katex': 0.16.7
+      hast-util-from-html-isomorphic: 2.0.0
+      hast-util-to-text: 4.0.2
+      katex: 0.16.22
+      unist-util-visit-parents: 6.0.1
+      vfile: 6.0.3
+
+  rehype-raw@7.0.0:
+    dependencies:
+      '@types/hast': 3.0.4
+      hast-util-raw: 9.1.0
+      vfile: 6.0.3
+
+  rehype-recma@1.0.0:
+    dependencies:
+      '@types/estree': 1.0.7
+      '@types/hast': 3.0.4
+      hast-util-to-estree: 3.1.3
+    transitivePeerDependencies:
+      - supports-color
+
+  relateurl@0.2.7: {}
+
+  remark-breaks@4.0.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      mdast-util-newline-to-break: 2.0.0
+      unified: 11.0.5
+
+  remark-gfm@4.0.1:
+    dependencies:
+      '@types/mdast': 4.0.4
+      mdast-util-gfm: 3.1.0
+      micromark-extension-gfm: 3.0.0
+      remark-parse: 11.0.0
+      remark-stringify: 11.0.0
+      unified: 11.0.5
+    transitivePeerDependencies:
+      - supports-color
+
+  remark-math@6.0.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      mdast-util-math: 3.0.0
+      micromark-extension-math: 3.1.0
+      unified: 11.0.5
+    transitivePeerDependencies:
+      - supports-color
+
+  remark-mdx@3.1.0:
+    dependencies:
+      mdast-util-mdx: 3.0.0
+      micromark-extension-mdxjs: 3.0.0
+    transitivePeerDependencies:
+      - supports-color
+
+  remark-parse@11.0.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      mdast-util-from-markdown: 2.0.2
+      micromark-util-types: 2.0.2
+      unified: 11.0.5
+    transitivePeerDependencies:
+      - supports-color
+
+  remark-rehype@11.1.2:
+    dependencies:
+      '@types/hast': 3.0.4
+      '@types/mdast': 4.0.4
+      mdast-util-to-hast: 13.2.0
+      unified: 11.0.5
+      vfile: 6.0.3
+
+  remark-stringify@11.0.0:
+    dependencies:
+      '@types/mdast': 4.0.4
+      mdast-util-to-markdown: 2.1.2
+      unified: 11.0.5
+
+  renderkid@3.0.0:
+    dependencies:
+      css-select: 4.3.0
+      dom-converter: 0.2.0
+      htmlparser2: 6.1.0
+      lodash: 4.17.21
+      strip-ansi: 6.0.1
+
+  require-directory@2.1.1: {}
+
+  require-from-string@2.0.2: {}
+
+  resize-observer-polyfill@1.5.1: {}
+
+  resolve-alpn@1.2.1: {}
+
+  resolve-cwd@3.0.0:
+    dependencies:
+      resolve-from: 5.0.0
+
+  resolve-from@4.0.0: {}
+
+  resolve-from@5.0.0: {}
+
+  resolve-pkg-maps@1.0.0: {}
+
+  resolve-url-loader@5.0.0:
+    dependencies:
+      adjust-sourcemap-loader: 4.0.0
+      convert-source-map: 1.9.0
+      loader-utils: 2.0.4
+      postcss: 8.5.3
+      source-map: 0.6.1
+
+  resolve.exports@2.0.3: {}
+
+  resolve@1.22.10:
+    dependencies:
+      is-core-module: 2.16.1
+      path-parse: 1.0.7
+      supports-preserve-symlinks-flag: 1.0.0
+
+  resolve@2.0.0-next.5:
+    dependencies:
+      is-core-module: 2.16.1
+      path-parse: 1.0.7
+      supports-preserve-symlinks-flag: 1.0.0
+
+  responselike@2.0.1:
+    dependencies:
+      lowercase-keys: 2.0.0
+
+  restore-cursor@5.1.0:
+    dependencies:
+      onetime: 7.0.0
+      signal-exit: 4.1.0
+
+  reusify@1.1.0: {}
+
+  rfdc@1.4.1: {}
+
+  rimraf@3.0.2:
+    dependencies:
+      glob: 7.2.3
+
+  ripemd160@2.0.2:
+    dependencies:
+      hash-base: 3.0.5
+      inherits: 2.0.4
+
+  robust-predicates@3.0.2: {}
+
+  rollup@4.39.0:
+    dependencies:
+      '@types/estree': 1.0.7
+    optionalDependencies:
+      '@rollup/rollup-android-arm-eabi': 4.39.0
+      '@rollup/rollup-android-arm64': 4.39.0
+      '@rollup/rollup-darwin-arm64': 4.39.0
+      '@rollup/rollup-darwin-x64': 4.39.0
+      '@rollup/rollup-freebsd-arm64': 4.39.0
+      '@rollup/rollup-freebsd-x64': 4.39.0
+      '@rollup/rollup-linux-arm-gnueabihf': 4.39.0
+      '@rollup/rollup-linux-arm-musleabihf': 4.39.0
+      '@rollup/rollup-linux-arm64-gnu': 4.39.0
+      '@rollup/rollup-linux-arm64-musl': 4.39.0
+      '@rollup/rollup-linux-loongarch64-gnu': 4.39.0
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.39.0
+      '@rollup/rollup-linux-riscv64-gnu': 4.39.0
+      '@rollup/rollup-linux-riscv64-musl': 4.39.0
+      '@rollup/rollup-linux-s390x-gnu': 4.39.0
+      '@rollup/rollup-linux-x64-gnu': 4.39.0
+      '@rollup/rollup-linux-x64-musl': 4.39.0
+      '@rollup/rollup-win32-arm64-msvc': 4.39.0
+      '@rollup/rollup-win32-ia32-msvc': 4.39.0
+      '@rollup/rollup-win32-x64-msvc': 4.39.0
+      fsevents: 2.3.3
+
+  roughjs@4.6.6:
+    dependencies:
+      hachure-fill: 0.5.2
+      path-data-parser: 0.1.0
+      points-on-curve: 0.2.0
+      points-on-path: 0.2.1
+
+  run-parallel@1.2.0:
+    dependencies:
+      queue-microtask: 1.2.3
+
+  rw@1.3.3: {}
+
+  safe-array-concat@1.1.3:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+      has-symbols: 1.1.0
+      isarray: 2.0.5
+
+  safe-buffer@5.1.2: {}
+
+  safe-buffer@5.2.1: {}
+
+  safe-push-apply@1.0.0:
+    dependencies:
+      es-errors: 1.3.0
+      isarray: 2.0.5
+
+  safe-regex-test@1.1.0:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-regex: 1.2.1
+
+  safer-buffer@2.1.2: {}
+
+  sass-loader@14.2.1(sass@1.86.3)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)):
+    dependencies:
+      neo-async: 2.6.2
+    optionalDependencies:
+      sass: 1.86.3
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+
+  sass@1.86.3:
+    dependencies:
+      chokidar: 4.0.3
+      immutable: 5.1.1
+      source-map-js: 1.2.1
+    optionalDependencies:
+      '@parcel/watcher': 2.5.1
+
+  scheduler@0.23.2:
+    dependencies:
+      loose-envify: 1.4.0
+
+  scheduler@0.25.0: {}
+
+  schema-utils@3.3.0:
+    dependencies:
+      '@types/json-schema': 7.0.15
+      ajv: 6.12.6
+      ajv-keywords: 3.5.2(ajv@6.12.6)
+
+  schema-utils@4.3.0:
+    dependencies:
+      '@types/json-schema': 7.0.15
+      ajv: 8.17.1
+      ajv-formats: 2.1.1(ajv@8.17.1)
+      ajv-keywords: 5.1.0(ajv@8.17.1)
+
+  screenfull@5.2.0: {}
+
+  scslre@0.3.0:
+    dependencies:
+      '@eslint-community/regexpp': 4.12.1
+      refa: 0.12.1
+      regexp-ast-analysis: 0.7.1
+
+  semver@6.3.1: {}
+
+  semver@7.7.1: {}
+
+  serialize-javascript@6.0.2:
+    dependencies:
+      randombytes: 2.1.0
+
+  server-only@0.0.1: {}
+
+  set-blocking@2.0.0:
+    optional: true
+
+  set-function-length@1.2.2:
+    dependencies:
+      define-data-property: 1.1.4
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+      get-intrinsic: 1.3.0
+      gopd: 1.2.0
+      has-property-descriptors: 1.0.2
+
+  set-function-name@2.0.2:
+    dependencies:
+      define-data-property: 1.1.4
+      es-errors: 1.3.0
+      functions-have-names: 1.2.3
+      has-property-descriptors: 1.0.2
+
+  set-proto@1.0.0:
+    dependencies:
+      dunder-proto: 1.0.1
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+
+  setimmediate@1.0.5: {}
+
+  sha.js@2.4.11:
+    dependencies:
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+
+  sharp@0.33.5:
+    dependencies:
+      color: 4.2.3
+      detect-libc: 2.0.3
+      semver: 7.7.1
+    optionalDependencies:
+      '@img/sharp-darwin-arm64': 0.33.5
+      '@img/sharp-darwin-x64': 0.33.5
+      '@img/sharp-libvips-darwin-arm64': 1.0.4
+      '@img/sharp-libvips-darwin-x64': 1.0.4
+      '@img/sharp-libvips-linux-arm': 1.0.5
+      '@img/sharp-libvips-linux-arm64': 1.0.4
+      '@img/sharp-libvips-linux-s390x': 1.0.4
+      '@img/sharp-libvips-linux-x64': 1.0.4
+      '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
+      '@img/sharp-libvips-linuxmusl-x64': 1.0.4
+      '@img/sharp-linux-arm': 0.33.5
+      '@img/sharp-linux-arm64': 0.33.5
+      '@img/sharp-linux-s390x': 0.33.5
+      '@img/sharp-linux-x64': 0.33.5
+      '@img/sharp-linuxmusl-arm64': 0.33.5
+      '@img/sharp-linuxmusl-x64': 0.33.5
+      '@img/sharp-wasm32': 0.33.5
+      '@img/sharp-win32-ia32': 0.33.5
+      '@img/sharp-win32-x64': 0.33.5
+
+  shave@5.0.4: {}
+
+  shebang-command@2.0.0:
+    dependencies:
+      shebang-regex: 3.0.0
+
+  shebang-regex@3.0.0: {}
+
+  side-channel-list@1.0.0:
+    dependencies:
+      es-errors: 1.3.0
+      object-inspect: 1.13.4
+
+  side-channel-map@1.0.1:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      object-inspect: 1.13.4
+
+  side-channel-weakmap@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      object-inspect: 1.13.4
+      side-channel-map: 1.0.1
+
+  side-channel@1.1.0:
+    dependencies:
+      es-errors: 1.3.0
+      object-inspect: 1.13.4
+      side-channel-list: 1.0.0
+      side-channel-map: 1.0.1
+      side-channel-weakmap: 1.0.2
+
+  siginfo@2.0.0: {}
+
+  signal-exit@3.0.7: {}
+
+  signal-exit@4.1.0: {}
+
+  simple-concat@1.0.1:
+    optional: true
+
+  simple-get@3.1.1:
+    dependencies:
+      decompress-response: 4.2.1
+      once: 1.4.0
+      simple-concat: 1.0.1
+    optional: true
+
+  simple-swizzle@0.2.2:
+    dependencies:
+      is-arrayish: 0.3.2
+
+  sisteransi@1.0.5: {}
+
+  size-sensor@1.0.2: {}
+
+  slash@3.0.0: {}
+
+  slashes@3.0.12: {}
+
+  slice-ansi@5.0.0:
+    dependencies:
+      ansi-styles: 6.2.1
+      is-fullwidth-code-point: 4.0.0
+
+  slice-ansi@7.1.0:
+    dependencies:
+      ansi-styles: 6.2.1
+      is-fullwidth-code-point: 5.0.0
+
+  sortablejs@1.15.6: {}
+
+  source-map-js@1.2.1: {}
+
+  source-map-support@0.5.13:
+    dependencies:
+      buffer-from: 1.1.2
+      source-map: 0.6.1
+
+  source-map-support@0.5.21:
+    dependencies:
+      buffer-from: 1.1.2
+      source-map: 0.6.1
+
+  source-map@0.6.1: {}
+
+  source-map@0.7.4: {}
+
+  space-separated-tokens@1.1.5: {}
+
+  space-separated-tokens@2.0.2: {}
+
+  spdx-correct@3.2.0:
+    dependencies:
+      spdx-expression-parse: 3.0.1
+      spdx-license-ids: 3.0.21
+
+  spdx-exceptions@2.5.0: {}
+
+  spdx-expression-parse@3.0.1:
+    dependencies:
+      spdx-exceptions: 2.5.0
+      spdx-license-ids: 3.0.21
+
+  spdx-expression-parse@4.0.0:
+    dependencies:
+      spdx-exceptions: 2.5.0
+      spdx-license-ids: 3.0.21
+
+  spdx-license-ids@3.0.21: {}
+
+  sprintf-js@1.0.3: {}
+
+  stable-hash@0.0.5: {}
+
+  stack-utils@2.0.6:
+    dependencies:
+      escape-string-regexp: 2.0.0
+
+  stackback@0.0.2: {}
+
+  stackframe@1.3.4: {}
+
+  state-local@1.0.7: {}
+
+  std-env@3.9.0: {}
+
+  storybook@8.5.0:
+    dependencies:
+      '@storybook/core': 8.5.0
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+
+  stream-browserify@3.0.0:
+    dependencies:
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+
+  stream-http@3.2.0:
+    dependencies:
+      builtin-status-codes: 3.0.0
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+      xtend: 4.0.2
+
+  streamsearch@1.1.0: {}
+
+  string-argv@0.3.2: {}
+
+  string-length@4.0.2:
+    dependencies:
+      char-regex: 1.0.2
+      strip-ansi: 6.0.1
+
+  string-ts@2.2.1: {}
+
+  string-width@4.2.3:
+    dependencies:
+      emoji-regex: 8.0.0
+      is-fullwidth-code-point: 3.0.0
+      strip-ansi: 6.0.1
+
+  string.prototype.includes@2.0.1:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+
+  string.prototype.matchall@4.0.12:
+    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
+      get-intrinsic: 1.3.0
+      gopd: 1.2.0
+      has-symbols: 1.1.0
+      internal-slot: 1.1.0
+      regexp.prototype.flags: 1.5.4
+      set-function-name: 2.0.2
+      side-channel: 1.1.0
+
+  string.prototype.repeat@1.0.0:
+    dependencies:
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+
+  string.prototype.trim@1.2.10:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-data-property: 1.1.4
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-object-atoms: 1.1.1
+      has-property-descriptors: 1.0.2
+
+  string.prototype.trimend@1.0.9:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  string.prototype.trimstart@1.0.8:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  string_decoder@1.1.1:
+    dependencies:
+      safe-buffer: 5.1.2
+
+  string_decoder@1.3.0:
+    dependencies:
+      safe-buffer: 5.2.1
+
+  stringify-entities@4.0.4:
+    dependencies:
+      character-entities-html4: 2.1.0
+      character-entities-legacy: 3.0.0
+
+  strip-ansi@6.0.1:
+    dependencies:
+      ansi-regex: 5.0.1
+
+  strip-ansi@7.1.0:
+    dependencies:
+      ansi-regex: 6.1.0
+
+  strip-bom@3.0.0: {}
+
+  strip-bom@4.0.0: {}
+
+  strip-final-newline@2.0.0: {}
+
+  strip-final-newline@3.0.0: {}
+
+  strip-indent@3.0.0:
+    dependencies:
+      min-indent: 1.0.1
+
+  strip-indent@4.0.0:
+    dependencies:
+      min-indent: 1.0.1
+
+  strip-json-comments@3.1.1: {}
+
+  style-loader@3.3.4(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)):
+    dependencies:
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+
+  style-to-js@1.1.16:
+    dependencies:
+      style-to-object: 1.0.8
+
+  style-to-object@1.0.8:
+    dependencies:
+      inline-style-parser: 0.2.4
+
+  styled-jsx@5.1.6(@babel/core@7.26.10)(react@19.0.0):
+    dependencies:
+      client-only: 0.0.1
+      react: 19.0.0
+    optionalDependencies:
+      '@babel/core': 7.26.10
+
+  stylis@4.3.6: {}
+
+  sucrase@3.35.0:
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.8
+      commander: 4.1.1
+      glob: 10.4.5
+      lines-and-columns: 1.2.4
+      mz: 2.7.0
+      pirates: 4.0.7
+      ts-interface-checker: 0.1.13
+
+  supports-color@7.2.0:
+    dependencies:
+      has-flag: 4.0.0
+
+  supports-color@8.1.1:
+    dependencies:
+      has-flag: 4.0.0
+
+  supports-preserve-symlinks-flag@1.0.0: {}
+
+  swr@2.3.3(react@19.0.0):
+    dependencies:
+      dequal: 2.0.3
+      react: 19.0.0
+      use-sync-external-store: 1.5.0(react@19.0.0)
+
+  synckit@0.10.3:
+    dependencies:
+      '@pkgr/core': 0.2.2
+      tslib: 2.8.1
+
+  synckit@0.9.2:
+    dependencies:
+      '@pkgr/core': 0.1.2
+      tslib: 2.8.1
+
+  tabbable@6.2.0: {}
+
+  tailwind-merge@2.6.0: {}
+
+  tailwindcss@3.4.17(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5)):
+    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.3
+      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.5.3
+      postcss-import: 15.1.0(postcss@8.5.3)
+      postcss-js: 4.0.1(postcss@8.5.3)
+      postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5))
+      postcss-nested: 6.2.0(postcss@8.5.3)
+      postcss-selector-parser: 6.1.2
+      resolve: 1.22.10
+      sucrase: 3.35.0
+    transitivePeerDependencies:
+      - ts-node
+
+  tapable@2.2.1: {}
+
+  tar@6.2.1:
+    dependencies:
+      chownr: 2.0.0
+      fs-minipass: 2.1.0
+      minipass: 5.0.0
+      minizlib: 2.1.2
+      mkdirp: 1.0.4
+      yallist: 4.0.0
+    optional: true
+
+  terser-webpack-plugin@5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)):
+    dependencies:
+      '@jridgewell/trace-mapping': 0.3.25
+      jest-worker: 27.5.1
+      schema-utils: 4.3.0
+      serialize-javascript: 6.0.2
+      terser: 5.39.0
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+    optionalDependencies:
+      esbuild: 0.25.0
+      uglify-js: 3.19.3
+
+  terser@5.39.0:
+    dependencies:
+      '@jridgewell/source-map': 0.3.6
+      acorn: 8.14.1
+      commander: 2.20.3
+      source-map-support: 0.5.21
+
+  test-exclude@6.0.0:
+    dependencies:
+      '@istanbuljs/schema': 0.1.3
+      glob: 7.2.3
+      minimatch: 3.1.2
+
+  thenify-all@1.6.0:
+    dependencies:
+      thenify: 3.3.1
+
+  thenify@3.3.1:
+    dependencies:
+      any-promise: 1.3.0
+
+  throttle-debounce@2.3.0: {}
+
+  timers-browserify@2.0.12:
+    dependencies:
+      setimmediate: 1.0.5
+
+  tiny-invariant@1.2.0: {}
+
+  tiny-invariant@1.3.3: {}
+
+  tinybench@2.9.0: {}
+
+  tinyexec@0.3.2: {}
+
+  tinyglobby@0.2.12:
+    dependencies:
+      fdir: 6.4.3(picomatch@4.0.2)
+      picomatch: 4.0.2
+
+  tinypool@1.0.2: {}
+
+  tinyrainbow@1.2.0: {}
+
+  tinyrainbow@2.0.0: {}
+
+  tinyspy@3.0.2: {}
+
+  tmpl@1.0.5: {}
+
+  to-regex-range@5.0.1:
+    dependencies:
+      is-number: 7.0.0
+
+  toggle-selection@1.0.6: {}
+
+  toml-eslint-parser@0.10.0:
+    dependencies:
+      eslint-visitor-keys: 3.4.3
+
+  tr46@0.0.3:
+    optional: true
+
+  trim-lines@3.0.1: {}
+
+  trough@2.2.0: {}
+
+  ts-api-utils@2.1.0(typescript@4.9.5):
+    dependencies:
+      typescript: 4.9.5
+
+  ts-debounce@4.0.0: {}
+
+  ts-declaration-location@1.0.7(typescript@4.9.5):
+    dependencies:
+      picomatch: 4.0.2
+      typescript: 4.9.5
+
+  ts-dedent@2.2.0: {}
+
+  ts-interface-checker@0.1.13: {}
+
+  ts-node@10.9.2(@types/node@18.15.0)(typescript@4.9.5):
+    dependencies:
+      '@cspotcode/source-map-support': 0.8.1
+      '@tsconfig/node10': 1.0.11
+      '@tsconfig/node12': 1.0.11
+      '@tsconfig/node14': 1.0.3
+      '@tsconfig/node16': 1.0.4
+      '@types/node': 18.15.0
+      acorn: 8.14.1
+      acorn-walk: 8.3.4
+      arg: 4.1.3
+      create-require: 1.1.1
+      diff: 4.0.2
+      make-error: 1.3.6
+      typescript: 4.9.5
+      v8-compile-cache-lib: 3.0.1
+      yn: 3.1.1
+
+  ts-pattern@5.7.0: {}
+
+  ts-pnp@1.2.0(typescript@4.9.5):
+    optionalDependencies:
+      typescript: 4.9.5
+
+  tsconfig-paths-webpack-plugin@4.2.0:
+    dependencies:
+      chalk: 4.1.2
+      enhanced-resolve: 5.18.1
+      tapable: 2.2.1
+      tsconfig-paths: 4.2.0
+
+  tsconfig-paths@3.15.0:
+    dependencies:
+      '@types/json5': 0.0.29
+      json5: 1.0.2
+      minimist: 1.2.8
+      strip-bom: 3.0.0
+
+  tsconfig-paths@4.2.0:
+    dependencies:
+      json5: 2.2.3
+      minimist: 1.2.8
+      strip-bom: 3.0.0
+
+  tslib@2.3.0: {}
+
+  tslib@2.6.2: {}
+
+  tslib@2.8.1: {}
+
+  tty-browserify@0.0.1: {}
+
+  tween-functions@1.2.0: {}
+
+  type-check@0.4.0:
+    dependencies:
+      prelude-ls: 1.2.1
+
+  type-detect@4.0.8: {}
+
+  type-fest@0.21.3: {}
+
+  type-fest@2.19.0: {}
+
+  type-fest@4.39.1: {}
+
+  typed-array-buffer@1.0.3:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-typed-array: 1.1.15
+
+  typed-array-byte-length@1.0.3:
+    dependencies:
+      call-bind: 1.0.8
+      for-each: 0.3.5
+      gopd: 1.2.0
+      has-proto: 1.2.0
+      is-typed-array: 1.1.15
+
+  typed-array-byte-offset@1.0.4:
+    dependencies:
+      available-typed-arrays: 1.0.7
+      call-bind: 1.0.8
+      for-each: 0.3.5
+      gopd: 1.2.0
+      has-proto: 1.2.0
+      is-typed-array: 1.1.15
+      reflect.getprototypeof: 1.0.10
+
+  typed-array-length@1.0.7:
+    dependencies:
+      call-bind: 1.0.8
+      for-each: 0.3.5
+      gopd: 1.2.0
+      is-typed-array: 1.1.15
+      possible-typed-array-names: 1.1.0
+      reflect.getprototypeof: 1.0.10
+
+  typescript-eslint@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5):
+    dependencies:
+      '@typescript-eslint/eslint-plugin': 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/parser': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@1.21.7))(typescript@4.9.5)
+      eslint: 9.24.0(jiti@1.21.7)
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+
+  typescript@4.9.5: {}
+
+  typescript@5.8.3: {}
+
+  ufo@1.6.1: {}
+
+  uglify-js@3.19.3: {}
+
+  unbox-primitive@1.1.0:
+    dependencies:
+      call-bound: 1.0.4
+      has-bigints: 1.1.0
+      has-symbols: 1.1.0
+      which-boxed-primitive: 1.1.1
+
+  unicode-canonical-property-names-ecmascript@2.0.1: {}
+
+  unicode-match-property-ecmascript@2.0.0:
+    dependencies:
+      unicode-canonical-property-names-ecmascript: 2.0.1
+      unicode-property-aliases-ecmascript: 2.1.0
+
+  unicode-match-property-value-ecmascript@2.2.0: {}
+
+  unicode-property-aliases-ecmascript@2.1.0: {}
+
+  unicorn-magic@0.1.0: {}
+
+  unified@11.0.5:
+    dependencies:
+      '@types/unist': 3.0.3
+      bail: 2.0.2
+      devlop: 1.1.0
+      extend: 3.0.2
+      is-plain-obj: 4.1.0
+      trough: 2.2.0
+      vfile: 6.0.3
+
+  unist-util-find-after@5.0.0:
+    dependencies:
+      '@types/unist': 3.0.3
+      unist-util-is: 6.0.0
+
+  unist-util-is@6.0.0:
+    dependencies:
+      '@types/unist': 3.0.3
+
+  unist-util-position-from-estree@2.0.0:
+    dependencies:
+      '@types/unist': 3.0.3
+
+  unist-util-position@5.0.0:
+    dependencies:
+      '@types/unist': 3.0.3
+
+  unist-util-remove-position@5.0.0:
+    dependencies:
+      '@types/unist': 3.0.3
+      unist-util-visit: 5.0.0
+
+  unist-util-stringify-position@4.0.0:
+    dependencies:
+      '@types/unist': 3.0.3
+
+  unist-util-visit-parents@6.0.1:
+    dependencies:
+      '@types/unist': 3.0.3
+      unist-util-is: 6.0.0
+
+  unist-util-visit@5.0.0:
+    dependencies:
+      '@types/unist': 3.0.3
+      unist-util-is: 6.0.0
+      unist-util-visit-parents: 6.0.1
+
+  universal-user-agent@7.0.2: {}
+
+  universalify@2.0.1: {}
+
+  unplugin@1.16.1:
+    dependencies:
+      acorn: 8.14.1
+      webpack-virtual-modules: 0.6.2
+
+  unrs-resolver@1.4.1:
+    optionalDependencies:
+      '@unrs/resolver-binding-darwin-arm64': 1.4.1
+      '@unrs/resolver-binding-darwin-x64': 1.4.1
+      '@unrs/resolver-binding-freebsd-x64': 1.4.1
+      '@unrs/resolver-binding-linux-arm-gnueabihf': 1.4.1
+      '@unrs/resolver-binding-linux-arm-musleabihf': 1.4.1
+      '@unrs/resolver-binding-linux-arm64-gnu': 1.4.1
+      '@unrs/resolver-binding-linux-arm64-musl': 1.4.1
+      '@unrs/resolver-binding-linux-ppc64-gnu': 1.4.1
+      '@unrs/resolver-binding-linux-s390x-gnu': 1.4.1
+      '@unrs/resolver-binding-linux-x64-gnu': 1.4.1
+      '@unrs/resolver-binding-linux-x64-musl': 1.4.1
+      '@unrs/resolver-binding-wasm32-wasi': 1.4.1
+      '@unrs/resolver-binding-win32-arm64-msvc': 1.4.1
+      '@unrs/resolver-binding-win32-ia32-msvc': 1.4.1
+      '@unrs/resolver-binding-win32-x64-msvc': 1.4.1
+
+  update-browserslist-db@1.1.3(browserslist@4.24.4):
+    dependencies:
+      browserslist: 4.24.4
+      escalade: 3.2.0
+      picocolors: 1.1.1
+
+  uri-js@4.4.1:
+    dependencies:
+      punycode: 2.3.1
+
+  url@0.11.4:
+    dependencies:
+      punycode: 1.4.1
+      qs: 6.14.0
+
+  use-composed-ref@1.4.0(@types/react@18.2.79)(react@19.0.0):
+    dependencies:
+      react: 19.0.0
+    optionalDependencies:
+      '@types/react': 18.2.79
+
+  use-context-selector@2.0.0(react@19.0.0)(scheduler@0.23.2):
+    dependencies:
+      react: 19.0.0
+      scheduler: 0.23.2
+
+  use-isomorphic-layout-effect@1.2.0(@types/react@18.2.79)(react@19.0.0):
+    dependencies:
+      react: 19.0.0
+    optionalDependencies:
+      '@types/react': 18.2.79
+
+  use-latest@1.3.0(@types/react@18.2.79)(react@19.0.0):
+    dependencies:
+      react: 19.0.0
+      use-isomorphic-layout-effect: 1.2.0(@types/react@18.2.79)(react@19.0.0)
+    optionalDependencies:
+      '@types/react': 18.2.79
+
+  use-strict@1.0.1: {}
+
+  use-sync-external-store@1.5.0(react@19.0.0):
+    dependencies:
+      react: 19.0.0
+
+  util-deprecate@1.0.2: {}
+
+  util@0.12.5:
+    dependencies:
+      inherits: 2.0.4
+      is-arguments: 1.2.0
+      is-generator-function: 1.1.0
+      is-typed-array: 1.1.15
+      which-typed-array: 1.1.19
+
+  utila@0.4.0: {}
+
+  uuid@10.0.0: {}
+
+  uuid@9.0.1: {}
+
+  v8-compile-cache-lib@3.0.1: {}
+
+  v8-to-istanbul@9.3.0:
+    dependencies:
+      '@jridgewell/trace-mapping': 0.3.25
+      '@types/istanbul-lib-coverage': 2.0.6
+      convert-source-map: 2.0.0
+
+  valibot@1.0.0(typescript@4.9.5):
+    optionalDependencies:
+      typescript: 4.9.5
+
+  validate-npm-package-license@3.0.4:
+    dependencies:
+      spdx-correct: 3.2.0
+      spdx-expression-parse: 3.0.1
+
+  vfile-location@5.0.3:
+    dependencies:
+      '@types/unist': 3.0.3
+      vfile: 6.0.3
+
+  vfile-message@4.0.2:
+    dependencies:
+      '@types/unist': 3.0.3
+      unist-util-stringify-position: 4.0.0
+
+  vfile@6.0.3:
+    dependencies:
+      '@types/unist': 3.0.3
+      vfile-message: 4.0.2
+
+  vite-code-inspector-plugin@0.18.3:
+    dependencies:
+      code-inspector-core: 0.18.3
+    transitivePeerDependencies:
+      - supports-color
+
+  vite-node@3.1.1(@types/node@18.15.0)(jiti@1.21.7)(sass@1.86.3)(terser@5.39.0)(yaml@2.7.1):
+    dependencies:
+      cac: 6.7.14
+      debug: 4.4.0
+      es-module-lexer: 1.6.0
+      pathe: 2.0.3
+      vite: 6.2.6(@types/node@18.15.0)(jiti@1.21.7)(sass@1.86.3)(terser@5.39.0)(yaml@2.7.1)
+    transitivePeerDependencies:
+      - '@types/node'
+      - jiti
+      - less
+      - lightningcss
+      - sass
+      - sass-embedded
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+      - tsx
+      - yaml
+
+  vite@6.2.6(@types/node@18.15.0)(jiti@1.21.7)(sass@1.86.3)(terser@5.39.0)(yaml@2.7.1):
+    dependencies:
+      esbuild: 0.25.2
+      postcss: 8.5.3
+      rollup: 4.39.0
+    optionalDependencies:
+      '@types/node': 18.15.0
+      fsevents: 2.3.3
+      jiti: 1.21.7
+      sass: 1.86.3
+      terser: 5.39.0
+      yaml: 2.7.1
+
+  vitest@3.1.1(@types/debug@4.1.12)(@types/node@18.15.0)(happy-dom@17.4.4)(jiti@1.21.7)(sass@1.86.3)(terser@5.39.0)(yaml@2.7.1):
+    dependencies:
+      '@vitest/expect': 3.1.1
+      '@vitest/mocker': 3.1.1(vite@6.2.6(@types/node@18.15.0)(jiti@1.21.7)(sass@1.86.3)(terser@5.39.0)(yaml@2.7.1))
+      '@vitest/pretty-format': 3.1.1
+      '@vitest/runner': 3.1.1
+      '@vitest/snapshot': 3.1.1
+      '@vitest/spy': 3.1.1
+      '@vitest/utils': 3.1.1
+      chai: 5.2.0
+      debug: 4.4.0
+      expect-type: 1.2.1
+      magic-string: 0.30.17
+      pathe: 2.0.3
+      std-env: 3.9.0
+      tinybench: 2.9.0
+      tinyexec: 0.3.2
+      tinypool: 1.0.2
+      tinyrainbow: 2.0.0
+      vite: 6.2.6(@types/node@18.15.0)(jiti@1.21.7)(sass@1.86.3)(terser@5.39.0)(yaml@2.7.1)
+      vite-node: 3.1.1(@types/node@18.15.0)(jiti@1.21.7)(sass@1.86.3)(terser@5.39.0)(yaml@2.7.1)
+      why-is-node-running: 2.3.0
+    optionalDependencies:
+      '@types/debug': 4.1.12
+      '@types/node': 18.15.0
+      happy-dom: 17.4.4
+    transitivePeerDependencies:
+      - jiti
+      - less
+      - lightningcss
+      - msw
+      - sass
+      - sass-embedded
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+      - tsx
+      - yaml
+
+  vm-browserify@1.1.2: {}
+
+  void-elements@3.1.0: {}
+
+  vscode-jsonrpc@8.2.0: {}
+
+  vscode-languageserver-protocol@3.17.5:
+    dependencies:
+      vscode-jsonrpc: 8.2.0
+      vscode-languageserver-types: 3.17.5
+
+  vscode-languageserver-textdocument@1.0.12: {}
+
+  vscode-languageserver-types@3.17.5: {}
+
+  vscode-languageserver@9.0.1:
+    dependencies:
+      vscode-languageserver-protocol: 3.17.5
+
+  vscode-uri@3.0.8: {}
+
+  vue-eslint-parser@10.1.3(eslint@9.24.0(jiti@1.21.7)):
+    dependencies:
+      debug: 4.4.0
+      eslint: 9.24.0(jiti@1.21.7)
+      eslint-scope: 8.3.0
+      eslint-visitor-keys: 4.2.0
+      espree: 10.3.0
+      esquery: 1.6.0
+      lodash: 4.17.21
+      semver: 7.7.1
+    transitivePeerDependencies:
+      - supports-color
+
+  walker@1.0.8:
+    dependencies:
+      makeerror: 1.0.12
+
+  watchpack@2.4.2:
+    dependencies:
+      glob-to-regexp: 0.4.1
+      graceful-fs: 4.2.11
+
+  web-namespaces@2.0.1: {}
+
+  webidl-conversions@3.0.1:
+    optional: true
+
+  webidl-conversions@7.0.0: {}
+
+  webpack-code-inspector-plugin@0.18.3:
+    dependencies:
+      code-inspector-core: 0.18.3
+    transitivePeerDependencies:
+      - supports-color
+
+  webpack-dev-middleware@6.1.3(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)):
+    dependencies:
+      colorette: 2.0.20
+      memfs: 3.5.3
+      mime-types: 2.1.35
+      range-parser: 1.2.1
+      schema-utils: 4.3.0
+    optionalDependencies:
+      webpack: 5.99.5(esbuild@0.25.0)(uglify-js@3.19.3)
+
+  webpack-hot-middleware@2.26.1:
+    dependencies:
+      ansi-html-community: 0.0.8
+      html-entities: 2.6.0
+      strip-ansi: 6.0.1
+
+  webpack-sources@3.2.3: {}
+
+  webpack-virtual-modules@0.6.2: {}
+
+  webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3):
+    dependencies:
+      '@types/eslint-scope': 3.7.7
+      '@types/estree': 1.0.7
+      '@webassemblyjs/ast': 1.14.1
+      '@webassemblyjs/wasm-edit': 1.14.1
+      '@webassemblyjs/wasm-parser': 1.14.1
+      acorn: 8.14.1
+      browserslist: 4.24.4
+      chrome-trace-event: 1.0.4
+      enhanced-resolve: 5.18.1
+      es-module-lexer: 1.6.0
+      eslint-scope: 5.1.1
+      events: 3.3.0
+      glob-to-regexp: 0.4.1
+      graceful-fs: 4.2.11
+      json-parse-even-better-errors: 2.3.1
+      loader-runner: 4.3.0
+      mime-types: 2.1.35
+      neo-async: 2.6.2
+      schema-utils: 4.3.0
+      tapable: 2.2.1
+      terser-webpack-plugin: 5.3.14(esbuild@0.25.0)(uglify-js@3.19.3)(webpack@5.99.5(esbuild@0.25.0)(uglify-js@3.19.3))
+      watchpack: 2.4.2
+      webpack-sources: 3.2.3
+    transitivePeerDependencies:
+      - '@swc/core'
+      - esbuild
+      - uglify-js
+
+  whatwg-mimetype@3.0.0: {}
+
+  whatwg-url@5.0.0:
+    dependencies:
+      tr46: 0.0.3
+      webidl-conversions: 3.0.1
+    optional: true
+
+  which-boxed-primitive@1.1.1:
+    dependencies:
+      is-bigint: 1.1.0
+      is-boolean-object: 1.2.2
+      is-number-object: 1.1.1
+      is-string: 1.1.1
+      is-symbol: 1.1.1
+
+  which-builtin-type@1.2.1:
+    dependencies:
+      call-bound: 1.0.4
+      function.prototype.name: 1.1.8
+      has-tostringtag: 1.0.2
+      is-async-function: 2.1.1
+      is-date-object: 1.1.0
+      is-finalizationregistry: 1.1.1
+      is-generator-function: 1.1.0
+      is-regex: 1.2.1
+      is-weakref: 1.1.1
+      isarray: 2.0.5
+      which-boxed-primitive: 1.1.1
+      which-collection: 1.0.2
+      which-typed-array: 1.1.19
+
+  which-collection@1.0.2:
+    dependencies:
+      is-map: 2.0.3
+      is-set: 2.0.3
+      is-weakmap: 2.0.2
+      is-weakset: 2.0.4
+
+  which-typed-array@1.1.19:
+    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
+
+  which@2.0.2:
+    dependencies:
+      isexe: 2.0.0
+
+  why-is-node-running@2.3.0:
+    dependencies:
+      siginfo: 2.0.0
+      stackback: 0.0.2
+
+  wide-align@1.1.5:
+    dependencies:
+      string-width: 4.2.3
+    optional: true
+
+  word-wrap@1.2.5: {}
+
+  wrap-ansi@7.0.0:
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+
+  wrap-ansi@8.1.0:
+    dependencies:
+      ansi-styles: 6.2.1
+      string-width: 4.2.3
+      strip-ansi: 7.1.0
+
+  wrap-ansi@9.0.0:
+    dependencies:
+      ansi-styles: 6.2.1
+      string-width: 4.2.3
+      strip-ansi: 7.1.0
+
+  wrappy@1.0.2: {}
+
+  write-file-atomic@4.0.2:
+    dependencies:
+      imurmurhash: 0.1.4
+      signal-exit: 3.0.7
+
+  ws@8.18.1: {}
+
+  xml-name-validator@4.0.0: {}
+
+  xtend@4.0.2: {}
+
+  y18n@5.0.8: {}
+
+  yallist@3.1.1: {}
+
+  yallist@4.0.0:
+    optional: true
+
+  yaml-eslint-parser@1.3.0:
+    dependencies:
+      eslint-visitor-keys: 3.4.3
+      yaml: 2.7.1
+
+  yaml@1.10.2: {}
+
+  yaml@2.7.1: {}
+
+  yargs-parser@21.1.1: {}
+
+  yargs@17.7.2:
+    dependencies:
+      cliui: 8.0.1
+      escalade: 3.2.0
+      get-caller-file: 2.0.5
+      require-directory: 2.1.1
+      string-width: 4.2.3
+      y18n: 5.0.8
+      yargs-parser: 21.1.1
+
+  yjs@13.6.24:
+    dependencies:
+      lib0: 0.2.102
+
+  yn@3.1.1: {}
+
+  yocto-queue@0.1.0: {}
+
+  yocto-queue@1.2.1: {}
+
+  zod@3.24.2: {}
+
+  zrender@5.6.1:
+    dependencies:
+      tslib: 2.3.0
+
+  zundo@2.3.0(zustand@4.5.6(@types/react@18.2.79)(immer@9.0.21)(react@19.0.0)):
+    dependencies:
+      zustand: 4.5.6(@types/react@18.2.79)(immer@9.0.21)(react@19.0.0)
+
+  zustand@4.5.6(@types/react@18.2.79)(immer@9.0.21)(react@19.0.0):
+    dependencies:
+      use-sync-external-store: 1.5.0(react@19.0.0)
+    optionalDependencies:
+      '@types/react': 18.2.79
+      immer: 9.0.21
+      react: 19.0.0
+
+  zwitch@2.0.4: {}
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..33ad091
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+  plugins: {
+    tailwindcss: {},
+    autoprefixer: {},
+  },
+}
diff --git a/public/education/bg.png b/public/education/bg.png
new file mode 100644
index 0000000..0c2e503
--- /dev/null
+++ b/public/education/bg.png
Binary files differ
diff --git a/public/embed.js b/public/embed.js
new file mode 100644
index 0000000..1efa541
--- /dev/null
+++ b/public/embed.js
@@ -0,0 +1,441 @@
+/** this file is used to embed the chatbot in a website
+ * the difyChatbotConfig should be defined in the html file before this script is included
+ * the difyChatbotConfig should contain the token of the chatbot
+ * the token can be found in the chatbot settings page
+ */
+
+// attention: This JavaScript script must be placed after the <body> element. Otherwise, the script will not work.
+
+(function () {
+  // Constants for DOM element IDs and configuration key
+  const configKey = "difyChatbotConfig";
+  const buttonId = "dify-chatbot-bubble-button";
+  const iframeId = "dify-chatbot-bubble-window";
+  const config = window[configKey];
+  let isExpanded = false;
+
+  // SVG icons for open and close states
+  const svgIcons = `<svg id="openIcon" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+      <path fill-rule="evenodd" clip-rule="evenodd" d="M7.7586 2L16.2412 2C17.0462 1.99999 17.7105 1.99998 18.2517 2.04419C18.8138 2.09012 19.3305 2.18868 19.8159 2.43598C20.5685 2.81947 21.1804 3.43139 21.5639 4.18404C21.8112 4.66937 21.9098 5.18608 21.9557 5.74818C21.9999 6.28937 21.9999 6.95373 21.9999 7.7587L22 14.1376C22.0004 14.933 22.0007 15.5236 21.8636 16.0353C21.4937 17.4156 20.4155 18.4938 19.0352 18.8637C18.7277 18.9461 18.3917 18.9789 17.9999 18.9918L17.9999 20.371C18 20.6062 18 20.846 17.9822 21.0425C17.9651 21.2305 17.9199 21.5852 17.6722 21.8955C17.3872 22.2525 16.9551 22.4602 16.4983 22.4597C16.1013 22.4593 15.7961 22.273 15.6386 22.1689C15.474 22.06 15.2868 21.9102 15.1031 21.7632L12.69 19.8327C12.1714 19.4178 12.0174 19.3007 11.8575 19.219C11.697 19.137 11.5262 19.0771 11.3496 19.0408C11.1737 19.0047 10.9803 19 10.3162 19H7.75858C6.95362 19 6.28927 19 5.74808 18.9558C5.18598 18.9099 4.66928 18.8113 4.18394 18.564C3.43129 18.1805 2.81937 17.5686 2.43588 16.816C2.18859 16.3306 2.09002 15.8139 2.0441 15.2518C1.99988 14.7106 1.99989 14.0463 1.9999 13.2413V7.75868C1.99989 6.95372 1.99988 6.28936 2.0441 5.74818C2.09002 5.18608 2.18859 4.66937 2.43588 4.18404C2.81937 3.43139 3.43129 2.81947 4.18394 2.43598C4.66928 2.18868 5.18598 2.09012 5.74808 2.04419C6.28927 1.99998 6.95364 1.99999 7.7586 2ZM10.5073 7.5C10.5073 6.67157 9.83575 6 9.00732 6C8.1789 6 7.50732 6.67157 7.50732 7.5C7.50732 8.32843 8.1789 9 9.00732 9C9.83575 9 10.5073 8.32843 10.5073 7.5ZM16.6073 11.7001C16.1669 11.3697 15.5426 11.4577 15.2105 11.8959C15.1488 11.9746 15.081 12.0486 15.0119 12.1207C14.8646 12.2744 14.6432 12.4829 14.3566 12.6913C13.7796 13.111 12.9818 13.5001 12.0073 13.5001C11.0328 13.5001 10.235 13.111 9.65799 12.6913C9.37138 12.4829 9.15004 12.2744 9.00274 12.1207C8.93366 12.0486 8.86581 11.9745 8.80418 11.8959C8.472 11.4577 7.84775 11.3697 7.40732 11.7001C6.96549 12.0314 6.87595 12.6582 7.20732 13.1001C7.20479 13.0968 7.21072 13.1043 7.22094 13.1171C7.24532 13.1478 7.29407 13.2091 7.31068 13.2289C7.36932 13.2987 7.45232 13.3934 7.55877 13.5045C7.77084 13.7258 8.08075 14.0172 8.48165 14.3088C9.27958 14.8891 10.4818 15.5001 12.0073 15.5001C13.5328 15.5001 14.735 14.8891 15.533 14.3088C15.9339 14.0172 16.2438 13.7258 16.4559 13.5045C16.5623 13.3934 16.6453 13.2987 16.704 13.2289C16.7333 13.1939 16.7567 13.165 16.7739 13.1432C17.1193 12.6969 17.0729 12.0493 16.6073 11.7001ZM15.0073 6C15.8358 6 16.5073 6.67157 16.5073 7.5C16.5073 8.32843 15.8358 9 15.0073 9C14.1789 9 13.5073 8.32843 13.5073 7.5C13.5073 6.67157 14.1789 6 15.0073 6Z" fill="white"/>
+    </svg>
+    <svg id="closeIcon" style="display:none" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+      <path d="M18 18L6 6M6 18L18 6" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+    </svg>
+    `;
+
+
+  const originalIframeStyleText = `
+    position: absolute;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+    top: unset;
+    right: var(--${buttonId}-right, 1rem); /* Align with dify-chatbot-bubble-button. */
+    bottom: var(--${buttonId}-bottom, 1rem); /* Align with dify-chatbot-bubble-button. */
+    left: unset;
+    width: 24rem;
+    max-width: calc(100vw - 2rem);
+    height: 43.75rem;
+    max-height: calc(100vh - 6rem);
+    border: none;
+    z-index: 2147483640;
+    overflow: hidden;
+    user-select: none;
+    transition-property: width, height;
+    transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+    transition-duration: 150ms;
+  `
+
+  const expandedIframeStyleText = `
+    position: absolute;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+    top: unset;
+    right: var(--${buttonId}-right, 1rem); /* Align with dify-chatbot-bubble-button. */
+    bottom: var(--${buttonId}-bottom, 1rem); /* Align with dify-chatbot-bubble-button. */
+    left: unset;
+    min-width: 24rem;
+    width: 48%;
+    max-width: 40rem; /* Match mobile breakpoint*/
+    min-height: 43.75rem;
+    height: 88%;
+    max-height: calc(100vh - 6rem);
+    border: none;
+    z-index: 2147483640;
+    overflow: hidden;
+    user-select: none;
+    transition-property: width, height;
+    transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+    transition-duration: 150ms;
+  `
+
+  // Main function to embed the chatbot
+  async function embedChatbot() {
+    let isDragging = false
+
+    if (!config || !config.token) {
+      console.error(`${configKey} is empty or token is not provided`);
+      return;
+    }
+
+    async function compressAndEncodeBase64(input) {
+      const uint8Array = new TextEncoder().encode(input);
+      const compressedStream = new Response(
+        new Blob([uint8Array])
+          .stream()
+          .pipeThrough(new CompressionStream("gzip"))
+      ).arrayBuffer();
+      const compressedUint8Array = new Uint8Array(await compressedStream);
+      return btoa(String.fromCharCode(...compressedUint8Array));
+    }
+
+    async function getCompressedInputsFromConfig() {
+      const inputs = config?.inputs || {};
+      const compressedInputs = {};
+      await Promise.all(
+        Object.entries(inputs).map(async ([key, value]) => {
+          compressedInputs[key] = await compressAndEncodeBase64(value);
+        })
+      );
+      return compressedInputs;
+    }
+
+    async function getCompressedSystemVariablesFromConfig() {
+      const systemVariables = config?.systemVariables || {};
+      const compressedSystemVariables = {};
+      await Promise.all(
+        Object.entries(systemVariables).map(async ([key, value]) => {
+          compressedSystemVariables[`sys.${key}`] = await compressAndEncodeBase64(value);
+        })
+      );
+      return compressedSystemVariables;
+    }
+
+    const params = new URLSearchParams({
+      ...await getCompressedInputsFromConfig(),
+      ...await getCompressedSystemVariablesFromConfig()
+    });
+
+    const baseUrl =
+      config.baseUrl || `https://${config.isDev ? "dev." : ""}udify.app`;
+    const targetOrigin = new URL(baseUrl).origin;
+
+    // pre-check the length of the URL
+    const iframeUrl = `${baseUrl}/chatbot/${config.token}?${params}`;
+    // 1) CREATE the iframe immediately, so it can load in the background:
+    const preloadedIframe = createIframe();
+    // 2) HIDE it by default:
+    preloadedIframe.style.display = "none";
+    // 3) APPEND it to the document body right away:
+    document.body.appendChild(preloadedIframe);
+    // 鈹�鈹�鈹� End Fix Snippet
+    if (iframeUrl.length > 2048) {
+      console.error("The URL is too long, please reduce the number of inputs to prevent the bot from failing to load");
+    }
+
+    // Function to create the iframe for the chatbot
+    function createIframe() {
+      const iframe = document.createElement("iframe");
+      iframe.allow = "fullscreen;microphone";
+      iframe.title = "dify chatbot bubble window";
+      iframe.id = iframeId;
+      iframe.src = iframeUrl;
+      iframe.style.cssText = originalIframeStyleText;
+
+      return iframe;
+    }
+
+    // Function to reset the iframe position
+    function resetIframePosition() {
+      if (window.innerWidth <= 640) return;
+
+      const targetIframe = document.getElementById(iframeId);
+      const targetButton = document.getElementById(buttonId);
+      if (targetIframe && targetButton) {
+        const buttonRect = targetButton.getBoundingClientRect();
+        // We don't necessarily need iframeRect anymore with the center logic
+
+        const viewportCenterY = window.innerHeight / 2;
+        const buttonCenterY = buttonRect.top + buttonRect.height / 2;
+
+        if (buttonCenterY < viewportCenterY) {
+          targetIframe.style.top = `var(--${buttonId}-bottom, 1rem)`;
+          targetIframe.style.bottom = 'unset';
+        } else {
+          targetIframe.style.bottom = `var(--${buttonId}-bottom, 1rem)`;
+          targetIframe.style.top = 'unset';
+        }
+
+        const viewportCenterX = window.innerWidth / 2;
+        const buttonCenterX = buttonRect.left + buttonRect.width / 2;
+
+        if (buttonCenterX < viewportCenterX) {
+          targetIframe.style.left = `var(--${buttonId}-right, 1rem)`;
+          targetIframe.style.right = 'unset';
+        } else {
+          targetIframe.style.right = `var(--${buttonId}-right, 1rem)`;
+          targetIframe.style.left = 'unset';
+        }
+      }
+    }
+
+    function toggleExpand() {
+      isExpanded = !isExpanded;
+
+      const targetIframe = document.getElementById(iframeId);
+      if (!targetIframe) return;
+
+      if (isExpanded) {
+        targetIframe.style.cssText = expandedIframeStyleText;
+      } else {
+        targetIframe.style.cssText = originalIframeStyleText;
+      }
+      resetIframePosition();
+    }
+
+    window.addEventListener('message', (event) => {
+      if (event.origin !== targetOrigin) return;
+
+      const targetIframe = document.getElementById(iframeId);
+      if (!targetIframe || event.source !== targetIframe.contentWindow) return;
+
+      if (event.data.type === 'dify-chatbot-iframe-ready') {
+        targetIframe.contentWindow?.postMessage(
+          {
+            type: 'dify-chatbot-config',
+            payload: {
+              isToggledByButton: true,
+              isDraggable: !!config.draggable,
+            },
+          },
+          targetOrigin
+        );
+      }
+
+      if (event.data.type === 'dify-chatbot-expand-change') {
+        toggleExpand();
+      }
+    });
+
+    // Function to create the chat button
+    function createButton() {
+      const containerDiv = document.createElement("div");
+      // Apply custom properties from config
+      Object.entries(config.containerProps || {}).forEach(([key, value]) => {
+        if (key === "className") {
+          containerDiv.classList.add(...value.split(" "));
+        } else if (key === "style") {
+          if (typeof value === "object") {
+            Object.assign(containerDiv.style, value);
+          } else {
+            containerDiv.style.cssText = value;
+          }
+        } else if (typeof value === "function") {
+          containerDiv.addEventListener(
+            key.replace(/^on/, "").toLowerCase(),
+            value
+          );
+        } else {
+          containerDiv[key] = value;
+        }
+      });
+
+      containerDiv.id = buttonId;
+
+      // Add styles for the button
+      const styleSheet = document.createElement("style");
+      document.head.appendChild(styleSheet);
+      styleSheet.sheet.insertRule(`
+        #${containerDiv.id} {
+          position: fixed;
+          bottom: var(--${containerDiv.id}-bottom, 1rem);
+          right: var(--${containerDiv.id}-right, 1rem);
+          left: var(--${containerDiv.id}-left, unset);
+          top: var(--${containerDiv.id}-top, unset);
+          width: var(--${containerDiv.id}-width, 48px);
+          height: var(--${containerDiv.id}-height, 48px);
+          border-radius: var(--${containerDiv.id}-border-radius, 25px);
+          background-color: var(--${containerDiv.id}-bg-color, #155EEF);
+          box-shadow: var(--${containerDiv.id}-box-shadow, rgba(0, 0, 0, 0.2) 0px 4px 8px 0px);
+          cursor: pointer;
+          z-index: 2147483647;
+        }
+      `);
+
+      // Create display div for the button icon
+      const displayDiv = document.createElement("div");
+      displayDiv.style.cssText =
+        "position: relative; display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; z-index: 2147483647;";
+      displayDiv.innerHTML = svgIcons;
+      containerDiv.appendChild(displayDiv);
+      document.body.appendChild(containerDiv);
+
+      // Add click event listener to toggle chatbot
+      containerDiv.addEventListener("click", handleClick);
+      // Add touch event listener
+      containerDiv.addEventListener("touchend", (event) => {
+        event.preventDefault();
+        handleClick();
+      }, { passive: false });
+
+      function handleClick() {
+        if (isDragging) return;
+
+        const targetIframe = document.getElementById(iframeId);
+        if (!targetIframe) {
+          containerDiv.appendChild(createIframe());
+          resetIframePosition();
+          this.title = "Exit (ESC)";
+          setSvgIcon("close");
+          document.addEventListener("keydown", handleEscKey);
+          return;
+        }
+        targetIframe.style.display =
+          targetIframe.style.display === "none" ? "block" : "none";
+        targetIframe.style.display === "none"
+          ? setSvgIcon("open")
+          : setSvgIcon("close");
+
+        if (targetIframe.style.display === "none") {
+          document.removeEventListener("keydown", handleEscKey);
+        } else {
+          document.addEventListener("keydown", handleEscKey);
+        }
+
+        resetIframePosition();
+      }
+
+      // Enable dragging if specified in config
+      if (config.draggable) {
+        enableDragging(containerDiv, config.dragAxis || "both");
+      }
+    }
+
+    // Function to enable dragging of the chat button
+    function enableDragging(element, axis) {
+      let startX, startY, startClientX, startClientY;
+
+      element.addEventListener("mousedown", startDragging);
+      element.addEventListener("touchstart", startDragging);
+
+      function startDragging(e) {
+        isDragging = false;
+        if (e.type === "touchstart") {
+          startX = e.touches[0].clientX - element.offsetLeft;
+          startY = e.touches[0].clientY - element.offsetTop;
+          startClientX = e.touches[0].clientX;
+          startClientY = e.touches[0].clientY;
+        } else {
+          startX = e.clientX - element.offsetLeft;
+          startY = e.clientY - element.offsetTop;
+          startClientX = e.clientX;
+          startClientY = e.clientY;
+        }
+        document.addEventListener("mousemove", drag);
+        document.addEventListener("touchmove", drag, { passive: false });
+        document.addEventListener("mouseup", stopDragging);
+        document.addEventListener("touchend", stopDragging);
+        e.preventDefault();
+      }
+
+      function drag(e) {
+        const touch = e.type === "touchmove" ? e.touches[0] : e;
+        const deltaX = touch.clientX - startClientX;
+        const deltaY = touch.clientY - startClientY;
+
+        // Determine whether it is a drag operation
+        if (Math.abs(deltaX) > 8 || Math.abs(deltaY) > 8) {
+          isDragging = true;
+        }
+
+        if (!isDragging) return;
+
+        element.style.transition = "none";
+        element.style.cursor = "grabbing";
+
+        // Hide iframe while dragging
+        const targetIframe = document.getElementById(iframeId);
+        if (targetIframe) {
+          targetIframe.style.display = "none";
+          setSvgIcon("open");
+        }
+
+        let newLeft, newBottom;
+        if (e.type === "touchmove") {
+          newLeft = e.touches[0].clientX - startX;
+          newBottom = window.innerHeight - e.touches[0].clientY - startY;
+        } else {
+          newLeft = e.clientX - startX;
+          newBottom = window.innerHeight - e.clientY - startY;
+        }
+
+        const elementRect = element.getBoundingClientRect();
+        const maxX = window.innerWidth - elementRect.width;
+        const maxY = window.innerHeight - elementRect.height;
+
+        // Update position based on drag axis
+        if (axis === "x" || axis === "both") {
+          element.style.setProperty(
+            `--${buttonId}-left`,
+            `${Math.max(0, Math.min(newLeft, maxX))}px`
+          );
+        }
+
+        if (axis === "y" || axis === "both") {
+          element.style.setProperty(
+            `--${buttonId}-bottom`,
+            `${Math.max(0, Math.min(newBottom, maxY))}px`
+          );
+        }
+      }
+
+      function stopDragging() {
+        setTimeout(() => {
+          isDragging = false;
+        }, 0);
+        element.style.transition = "";
+        element.style.cursor = "pointer";
+
+        document.removeEventListener("mousemove", drag);
+        document.removeEventListener("touchmove", drag);
+        document.removeEventListener("mouseup", stopDragging);
+        document.removeEventListener("touchend", stopDragging);
+      }
+    }
+
+    // Create the chat button if it doesn't exist
+    if (!document.getElementById(buttonId)) {
+      createButton();
+    }
+  }
+
+  function setSvgIcon(type = "open") {
+    if (type === "open") {
+      document.getElementById("openIcon").style.display = "block";
+      document.getElementById("closeIcon").style.display = "none";
+    } else {
+      document.getElementById("openIcon").style.display = "none";
+      document.getElementById("closeIcon").style.display = "block";
+    }
+  }
+
+  // Add esc Exit keyboard event triggered
+  function handleEscKey(event) {
+    if (event.key === "Escape") {
+      const targetIframe = document.getElementById(iframeId);
+      if (targetIframe && targetIframe.style.display !== "none") {
+        targetIframe.style.display = "none";
+        setSvgIcon("open");
+      }
+    }
+  }
+  document.addEventListener("keydown", handleEscKey);
+
+  // Set the embedChatbot function to run when the body is loaded,Avoid infinite nesting
+  if (config?.dynamicScript) {
+    embedChatbot();
+  } else {
+    document.body.onload = embedChatbot;
+  }
+})();
diff --git a/public/embed.min.js b/public/embed.min.js
new file mode 100644
index 0000000..b2781ee
--- /dev/null
+++ b/public/embed.min.js
@@ -0,0 +1,42 @@
+(()=>{let t="difyChatbotConfig",h="dify-chatbot-bubble-button",m="dify-chatbot-bubble-window",y=window[t],a=!1,l=`
+    position: absolute;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+    top: unset;
+    right: var(--${h}-right, 1rem); /* Align with dify-chatbot-bubble-button. */
+    bottom: var(--${h}-bottom, 1rem); /* Align with dify-chatbot-bubble-button. */
+    left: unset;
+    width: 24rem;
+    max-width: calc(100vw - 2rem);
+    height: 43.75rem;
+    max-height: calc(100vh - 6rem);
+    border: none;
+    z-index: 2147483640;
+    overflow: hidden;
+    user-select: none;
+    transition-property: width, height;
+    transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+    transition-duration: 150ms;
+  `;async function e(){let u=!1;if(y&&y.token){var e=new URLSearchParams({...await(async()=>{var e=y?.inputs||{};let n={};return await Promise.all(Object.entries(e).map(async([e,t])=>{n[e]=await i(t)})),n})(),...await(async()=>{var e=y?.systemVariables||{};let n={};return await Promise.all(Object.entries(e).map(async([e,t])=>{n["sys."+e]=await i(t)})),n})()}),n=y.baseUrl||`https://${y.isDev?"dev.":""}udify.app`;let o=new URL(n).origin,t=`${n}/chatbot/${y.token}?`+e;n=s();async function i(e){e=(new TextEncoder).encode(e),e=new Response(new Blob([e]).stream().pipeThrough(new CompressionStream("gzip"))).arrayBuffer(),e=new Uint8Array(await e);return btoa(String.fromCharCode(...e))}function s(){var e=document.createElement("iframe");return e.allow="fullscreen;microphone",e.title="dify chatbot bubble window",e.id=m,e.src=t,e.style.cssText=l,e}function d(){var e,t,n;window.innerWidth<=640||(e=document.getElementById(m),t=document.getElementById(h),e&&t&&(t=t.getBoundingClientRect(),n=window.innerHeight/2,t.top+t.height/2<n?(e.style.top=`var(--${h}-bottom, 1rem)`,e.style.bottom="unset"):(e.style.bottom=`var(--${h}-bottom, 1rem)`,e.style.top="unset"),t.left+t.width/2<window.innerWidth/2?(e.style.left=`var(--${h}-right, 1rem)`,e.style.right="unset"):(e.style.right=`var(--${h}-right, 1rem)`,e.style.left="unset")))}function r(){let n=document.createElement("div");Object.entries(y.containerProps||{}).forEach(([e,t])=>{"className"===e?n.classList.add(...t.split(" ")):"style"===e?"object"==typeof t?Object.assign(n.style,t):n.style.cssText=t:"function"==typeof t?n.addEventListener(e.replace(/^on/,"").toLowerCase(),t):n[e]=t}),n.id=h;var e=document.createElement("style"),e=(document.head.appendChild(e),e.sheet.insertRule(`
+        #${n.id} {
+          position: fixed;
+          bottom: var(--${n.id}-bottom, 1rem);
+          right: var(--${n.id}-right, 1rem);
+          left: var(--${n.id}-left, unset);
+          top: var(--${n.id}-top, unset);
+          width: var(--${n.id}-width, 48px);
+          height: var(--${n.id}-height, 48px);
+          border-radius: var(--${n.id}-border-radius, 25px);
+          background-color: var(--${n.id}-bg-color, #155EEF);
+          box-shadow: var(--${n.id}-box-shadow, rgba(0, 0, 0, 0.2) 0px 4px 8px 0px);
+          cursor: pointer;
+          z-index: 2147483647;
+        }
+      `),document.createElement("div"));function t(){var e;u||((e=document.getElementById(m))?(e.style.display="none"===e.style.display?"block":"none","none"===e.style.display?p("open"):p("close"),"none"===e.style.display?document.removeEventListener("keydown",b):document.addEventListener("keydown",b),d()):(n.appendChild(s()),d(),this.title="Exit (ESC)",p("close"),document.addEventListener("keydown",b)))}if(e.style.cssText="position: relative; display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; z-index: 2147483647;",e.innerHTML=`<svg id="openIcon" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+      <path fill-rule="evenodd" clip-rule="evenodd" d="M7.7586 2L16.2412 2C17.0462 1.99999 17.7105 1.99998 18.2517 2.04419C18.8138 2.09012 19.3305 2.18868 19.8159 2.43598C20.5685 2.81947 21.1804 3.43139 21.5639 4.18404C21.8112 4.66937 21.9098 5.18608 21.9557 5.74818C21.9999 6.28937 21.9999 6.95373 21.9999 7.7587L22 14.1376C22.0004 14.933 22.0007 15.5236 21.8636 16.0353C21.4937 17.4156 20.4155 18.4938 19.0352 18.8637C18.7277 18.9461 18.3917 18.9789 17.9999 18.9918L17.9999 20.371C18 20.6062 18 20.846 17.9822 21.0425C17.9651 21.2305 17.9199 21.5852 17.6722 21.8955C17.3872 22.2525 16.9551 22.4602 16.4983 22.4597C16.1013 22.4593 15.7961 22.273 15.6386 22.1689C15.474 22.06 15.2868 21.9102 15.1031 21.7632L12.69 19.8327C12.1714 19.4178 12.0174 19.3007 11.8575 19.219C11.697 19.137 11.5262 19.0771 11.3496 19.0408C11.1737 19.0047 10.9803 19 10.3162 19H7.75858C6.95362 19 6.28927 19 5.74808 18.9558C5.18598 18.9099 4.66928 18.8113 4.18394 18.564C3.43129 18.1805 2.81937 17.5686 2.43588 16.816C2.18859 16.3306 2.09002 15.8139 2.0441 15.2518C1.99988 14.7106 1.99989 14.0463 1.9999 13.2413V7.75868C1.99989 6.95372 1.99988 6.28936 2.0441 5.74818C2.09002 5.18608 2.18859 4.66937 2.43588 4.18404C2.81937 3.43139 3.43129 2.81947 4.18394 2.43598C4.66928 2.18868 5.18598 2.09012 5.74808 2.04419C6.28927 1.99998 6.95364 1.99999 7.7586 2ZM10.5073 7.5C10.5073 6.67157 9.83575 6 9.00732 6C8.1789 6 7.50732 6.67157 7.50732 7.5C7.50732 8.32843 8.1789 9 9.00732 9C9.83575 9 10.5073 8.32843 10.5073 7.5ZM16.6073 11.7001C16.1669 11.3697 15.5426 11.4577 15.2105 11.8959C15.1488 11.9746 15.081 12.0486 15.0119 12.1207C14.8646 12.2744 14.6432 12.4829 14.3566 12.6913C13.7796 13.111 12.9818 13.5001 12.0073 13.5001C11.0328 13.5001 10.235 13.111 9.65799 12.6913C9.37138 12.4829 9.15004 12.2744 9.00274 12.1207C8.93366 12.0486 8.86581 11.9745 8.80418 11.8959C8.472 11.4577 7.84775 11.3697 7.40732 11.7001C6.96549 12.0314 6.87595 12.6582 7.20732 13.1001C7.20479 13.0968 7.21072 13.1043 7.22094 13.1171C7.24532 13.1478 7.29407 13.2091 7.31068 13.2289C7.36932 13.2987 7.45232 13.3934 7.55877 13.5045C7.77084 13.7258 8.08075 14.0172 8.48165 14.3088C9.27958 14.8891 10.4818 15.5001 12.0073 15.5001C13.5328 15.5001 14.735 14.8891 15.533 14.3088C15.9339 14.0172 16.2438 13.7258 16.4559 13.5045C16.5623 13.3934 16.6453 13.2987 16.704 13.2289C16.7333 13.1939 16.7567 13.165 16.7739 13.1432C17.1193 12.6969 17.0729 12.0493 16.6073 11.7001ZM15.0073 6C15.8358 6 16.5073 6.67157 16.5073 7.5C16.5073 8.32843 15.8358 9 15.0073 9C14.1789 9 13.5073 8.32843 13.5073 7.5C13.5073 6.67157 14.1789 6 15.0073 6Z" fill="white"/>
+    </svg>
+    <svg id="closeIcon" style="display:none" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+      <path d="M18 18L6 6M6 18L18 6" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+    </svg>
+    `,n.appendChild(e),document.body.appendChild(n),n.addEventListener("click",t),n.addEventListener("touchend",e=>{e.preventDefault(),t()},{passive:!1}),y.draggable){var a=n;var l=y.dragAxis||"both";let s,d,t,r;function o(e){u=!1,r=("touchstart"===e.type?(s=e.touches[0].clientX-a.offsetLeft,d=e.touches[0].clientY-a.offsetTop,t=e.touches[0].clientX,e.touches[0]):(s=e.clientX-a.offsetLeft,d=e.clientY-a.offsetTop,t=e.clientX,e)).clientY,document.addEventListener("mousemove",i),document.addEventListener("touchmove",i,{passive:!1}),document.addEventListener("mouseup",c),document.addEventListener("touchend",c),e.preventDefault()}function i(n){var o="touchmove"===n.type?n.touches[0]:n,i=o.clientX-t,o=o.clientY-r;if(u=8<Math.abs(i)||8<Math.abs(o)?!0:u){a.style.transition="none",a.style.cursor="grabbing";i=document.getElementById(m);i&&(i.style.display="none",p("open"));let e,t;t="touchmove"===n.type?(e=n.touches[0].clientX-s,window.innerHeight-n.touches[0].clientY-d):(e=n.clientX-s,window.innerHeight-n.clientY-d);o=a.getBoundingClientRect(),i=window.innerWidth-o.width,n=window.innerHeight-o.height;"x"!==l&&"both"!==l||a.style.setProperty(`--${h}-left`,Math.max(0,Math.min(e,i))+"px"),"y"!==l&&"both"!==l||a.style.setProperty(`--${h}-bottom`,Math.max(0,Math.min(t,n))+"px")}}function c(){setTimeout(()=>{u=!1},0),a.style.transition="",a.style.cursor="pointer",document.removeEventListener("mousemove",i),document.removeEventListener("touchmove",i),document.removeEventListener("mouseup",c),document.removeEventListener("touchend",c)}a.addEventListener("mousedown",o),a.addEventListener("touchstart",o)}}n.style.display="none",document.body.appendChild(n),2048<t.length&&console.error("The URL is too long, please reduce the number of inputs to prevent the bot from failing to load"),window.addEventListener("message",e=>{var t,n;e.origin===o&&(t=document.getElementById(m))&&e.source===t.contentWindow&&("dify-chatbot-iframe-ready"===e.data.type&&t.contentWindow?.postMessage({type:"dify-chatbot-config",payload:{isToggledByButton:!0,isDraggable:!!y.draggable}},o),"dify-chatbot-expand-change"===e.data.type)&&(a=!a,n=document.getElementById(m))&&(a?n.style.cssText="\n    position: absolute;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n    top: unset;\n    right: var(--dify-chatbot-bubble-button-right, 1rem); /* Align with dify-chatbot-bubble-button. */\n    bottom: var(--dify-chatbot-bubble-button-bottom, 1rem); /* Align with dify-chatbot-bubble-button. */\n    left: unset;\n    min-width: 24rem;\n    width: 48%;\n    max-width: 40rem; /* Match mobile breakpoint*/\n    min-height: 43.75rem;\n    height: 88%;\n    max-height: calc(100vh - 6rem);\n    border: none;\n    z-index: 2147483640;\n    overflow: hidden;\n    user-select: none;\n    transition-property: width, height;\n    transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n    transition-duration: 150ms;\n  ":n.style.cssText=l,d())}),document.getElementById(h)||r()}else console.error(t+" is empty or token is not provided")}function p(e="open"){"open"===e?(document.getElementById("openIcon").style.display="block",document.getElementById("closeIcon").style.display="none"):(document.getElementById("openIcon").style.display="none",document.getElementById("closeIcon").style.display="block")}function b(e){"Escape"===e.key&&(e=document.getElementById(m))&&"none"!==e.style.display&&(e.style.display="none",p("open"))}h,h,document.addEventListener("keydown",b),y?.dynamicScript?e():document.body.onload=e})();
\ No newline at end of file
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..3087c73
--- /dev/null
+++ b/public/favicon.ico
Binary files differ
diff --git a/public/logo/logo-embedded-chat-avatar.png b/public/logo/logo-embedded-chat-avatar.png
new file mode 100644
index 0000000..3efb68e
--- /dev/null
+++ b/public/logo/logo-embedded-chat-avatar.png
Binary files differ
diff --git a/public/logo/logo-embedded-chat-header.png b/public/logo/logo-embedded-chat-header.png
new file mode 100644
index 0000000..058f7d2
--- /dev/null
+++ b/public/logo/logo-embedded-chat-header.png
Binary files differ
diff --git a/public/logo/logo-embedded-chat-header@2x.png b/public/logo/logo-embedded-chat-header@2x.png
new file mode 100644
index 0000000..9e11947
--- /dev/null
+++ b/public/logo/logo-embedded-chat-header@2x.png
Binary files differ
diff --git a/public/logo/logo-embedded-chat-header@3x.png b/public/logo/logo-embedded-chat-header@3x.png
new file mode 100644
index 0000000..5285ed6
--- /dev/null
+++ b/public/logo/logo-embedded-chat-header@3x.png
Binary files differ
diff --git a/public/logo/logo-monochrome-white.svg b/public/logo/logo-monochrome-white.svg
new file mode 100644
index 0000000..9a166ba
--- /dev/null
+++ b/public/logo/logo-monochrome-white.svg
@@ -0,0 +1,12 @@
+<svg width="48" height="22" viewBox="0 0 48 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="White=True">
+<g id="if">
+<path d="M21.2002 4.0695C22.5633 4.0695 23.0666 3.23413 23.0666 2.20309C23.0666 1.17204 22.5623 0.33667 21.2002 0.33667C19.838 0.33667 19.3337 1.17204 19.3337 2.20309C19.3337 3.23413 19.838 4.0695 21.2002 4.0695Z" fill="white"/>
+<path d="M27.7336 4.46931V5.66969H24.6668V8.33667H27.7336V15.0037H22.6668V5.67063H15.9998V8.33761H19.7336V15.0046H15.3337V17.6716H35.3337V15.0046H30.6668V8.33761H35.3337V5.67063H30.6668V3.00365H35.3337V0.33667H31.8671C29.5877 0.33667 27.7336 2.19086 27.7336 4.47025V4.46931Z" fill="white"/>
+</g>
+<g id="Dy">
+<path d="M5.66698 0.335902H0V17.6689H5.66698C12.667 17.6689 14.667 13.6689 14.667 9.00194C14.667 4.33496 12.667 0.334961 5.66698 0.334961V0.335902ZM5.73377 15.0029H3.20038V3.00288H5.73377C9.75823 3.00288 11.4666 4.97842 11.4666 9.00288C11.4666 13.0273 9.75823 15.0029 5.73377 15.0029Z" fill="white"/>
+<path d="M44.8335 5.66986L42.1665 14.3368L39.4995 5.66986H36.333L40.2013 16.8815C40.604 18.049 39.9229 19.0029 38.6886 19.0029H37.333V21.6699H39.3255C41.063 21.6699 42.6265 20.5711 43.2145 18.9361L48 5.66986H44.8335Z" fill="white"/>
+</g>
+</g>
+</svg>
diff --git a/public/logo/logo-site-dark.png b/public/logo/logo-site-dark.png
new file mode 100644
index 0000000..3222d40
--- /dev/null
+++ b/public/logo/logo-site-dark.png
Binary files differ
diff --git a/public/logo/logo-site.png b/public/logo/logo-site.png
new file mode 100644
index 0000000..8c2bb46
--- /dev/null
+++ b/public/logo/logo-site.png
Binary files differ
diff --git a/public/logo/logo.svg b/public/logo/logo.svg
new file mode 100644
index 0000000..52ed710
--- /dev/null
+++ b/public/logo/logo.svg
@@ -0,0 +1,12 @@
+<svg width="48" height="22" viewBox="0 0 48 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="White=False">
+<g id="if">
+<path d="M21.2002 3.73454C22.5633 3.73454 23.0666 2.89917 23.0666 1.86812C23.0666 0.837081 22.5623 0.00170898 21.2002 0.00170898C19.838 0.00170898 19.3337 0.837081 19.3337 1.86812C19.3337 2.89917 19.838 3.73454 21.2002 3.73454Z" fill="#0033FF"/>
+<path d="M27.7336 4.13435V5.33473H24.6668V8.00171H27.7336V14.6687H22.6668V5.33567H15.9998V8.00265H19.7336V14.6696H15.3337V17.3366H35.3337V14.6696H30.6668V8.00265H35.3337V5.33567H30.6668V2.66869H35.3337V0.00170898H31.8671C29.5877 0.00170898 27.7336 1.8559 27.7336 4.13529V4.13435Z" fill="#0033FF"/>
+</g>
+<g id="Dy">
+<path d="M5.66698 0.000940576H0V17.334H5.66698C12.667 17.334 14.667 13.334 14.667 8.66698C14.667 4 12.667 0 5.66698 0V0.000940576ZM5.73377 14.6679H3.20038V2.66792H5.73377C9.75823 2.66792 11.4666 4.64346 11.4666 8.66792C11.4666 12.6924 9.75823 14.6679 5.73377 14.6679Z" fill="black"/>
+<path d="M44.8335 5.3349L42.1665 14.0019L39.4995 5.3349H36.333L40.2013 16.5466C40.604 17.714 39.9229 18.6679 38.6886 18.6679H37.333V21.3349H39.3255C41.063 21.3349 42.6265 20.2361 43.2145 18.6011L48 5.3349H44.8335Z" fill="black"/>
+</g>
+</g>
+</svg>
diff --git a/public/pdf.worker.min.mjs b/public/pdf.worker.min.mjs
new file mode 100644
index 0000000..0c8accb
--- /dev/null
+++ b/public/pdf.worker.min.mjs
@@ -0,0 +1,21 @@
+/**
+ * @licstart The following is the entire license notice for the
+ * JavaScript code in this page
+ *
+ * Copyright 2023 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @licend The above is the entire license notice for the
+ * JavaScript code in this page
+*/var e={d:(t,i)=>{for(var a in i)e.o(i,a)&&!e.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:i[a]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},__webpack_exports__ = globalThis.pdfjsWorker = {};e.d(__webpack_exports__,{WorkerMessageHandler:()=>WorkerMessageHandler});const t=!("object"!=typeof process||process+""!="[object process]"||process.versions.nw||process.versions.electron&&process.type&&"browser"!==process.type),i=[1,0,0,1,0,0],a=[.001,0,0,.001,0,0],s=1.35,r=.35,n=.25925925925925924,g=1,o=2,c=4,C=8,h=16,l=64,Q=256,E="pdfjs_internal_editor_",u=3,d=9,f=13,p=15,m={PRINT:4,MODIFY_CONTENTS:8,COPY:16,MODIFY_ANNOTATIONS:32,FILL_INTERACTIVE_FORMS:256,COPY_FOR_ACCESSIBILITY:512,ASSEMBLE:1024,PRINT_HIGH_QUALITY:2048},y=0,w=4,D=1,b=2,F=3,S=1,k=2,R=3,N=4,G=5,x=6,U=7,M=8,L=9,H=10,J=11,Y=12,v=13,K=14,T=15,q=16,O=17,W=20,j="Group",X="R",Z=1,V=2,z=4,_=16,$=32,AA=128,eA=512,tA=1,iA=2,aA=4096,sA=8192,rA=32768,nA=65536,gA=131072,oA=1048576,IA=2097152,cA=8388608,CA=16777216,hA=1,BA=2,lA=3,QA=4,EA=5,uA={E:"Mouse Enter",X:"Mouse Exit",D:"Mouse Down",U:"Mouse Up",Fo:"Focus",Bl:"Blur",PO:"PageOpen",PC:"PageClose",PV:"PageVisible",PI:"PageInvisible",K:"Keystroke",F:"Format",V:"Validate",C:"Calculate"},dA={WC:"WillClose",WS:"WillSave",DS:"DidSave",WP:"WillPrint",DP:"DidPrint"},fA={O:"PageOpen",C:"PageClose"},pA={ERRORS:0,WARNINGS:1,INFOS:5},mA={NONE:0,BINARY:1},yA=1,wA=2,DA=3,bA=4,FA=5,SA=6,kA=7,RA=8,NA=9,GA=10,xA=11,UA=12,MA=13,LA=14,HA=15,JA=16,YA=17,vA=18,KA=19,TA=20,qA=21,OA=22,PA=23,WA=24,jA=25,XA=26,ZA=27,VA=28,zA=29,_A=30,$A=31,Ae=32,ee=33,te=34,ie=35,ae=36,se=37,re=38,ne=39,ge=40,oe=41,Ie=42,ce=43,Ce=44,he=45,Be=46,le=47,Qe=48,Ee=49,ue=50,de=51,fe=52,pe=53,me=54,ye=55,we=56,De=57,be=58,Fe=59,Se=60,ke=61,Re=62,Ne=63,Ge=64,xe=65,Ue=66,Me=67,Le=68,He=69,Je=70,Ye=71,ve=72,Ke=73,Te=74,qe=75,Oe=76,Pe=77,We=80,je=81,Xe=83,Ze=84,Ve=85,ze=86,_e=87,$e=88,At=89,et=90,tt=91,it=1,at=2;let st=pA.WARNINGS;function getVerbosityLevel(){return st}function info(e){st>=pA.INFOS&&console.log(`Info: ${e}`)}function warn(e){st>=pA.WARNINGS&&console.log(`Warning: ${e}`)}function unreachable(e){throw new Error(e)}function assert(e,t){e||unreachable(t)}function createValidAbsoluteUrl(e,t=null,i=null){if(!e)return null;try{if(i&&"string"==typeof e){if(i.addDefaultProtocol&&e.startsWith("www.")){const t=e.match(/\./g);t?.length>=2&&(e=`http://${e}`)}if(i.tryConvertEncoding)try{e=stringToUTF8String(e)}catch{}}const a=t?new URL(e,t):new URL(e);if(function _isValidProtocol(e){switch(e?.protocol){case"http:":case"https:":case"ftp:":case"mailto:":case"tel:":return!0;default:return!1}}(a))return a}catch{}return null}function shadow(e,t,i,a=!1){Object.defineProperty(e,t,{value:i,enumerable:!a,configurable:!0,writable:!1});return i}const rt=function BaseExceptionClosure(){function BaseException(e,t){this.constructor===BaseException&&unreachable("Cannot initialize BaseException.");this.message=e;this.name=t}BaseException.prototype=new Error;BaseException.constructor=BaseException;return BaseException}();class PasswordException extends rt{constructor(e,t){super(e,"PasswordException");this.code=t}}class UnknownErrorException extends rt{constructor(e,t){super(e,"UnknownErrorException");this.details=t}}class InvalidPDFException extends rt{constructor(e){super(e,"InvalidPDFException")}}class MissingPDFException extends rt{constructor(e){super(e,"MissingPDFException")}}class UnexpectedResponseException extends rt{constructor(e,t){super(e,"UnexpectedResponseException");this.status=t}}class FormatError extends rt{constructor(e){super(e,"FormatError")}}class AbortException extends rt{constructor(e){super(e,"AbortException")}}function bytesToString(e){"object"==typeof e&&void 0!==e?.length||unreachable("Invalid argument for bytesToString");const t=e.length,i=8192;if(t<i)return String.fromCharCode.apply(null,e);const a=[];for(let s=0;s<t;s+=i){const r=Math.min(s+i,t),n=e.subarray(s,r);a.push(String.fromCharCode.apply(null,n))}return a.join("")}function stringToBytes(e){"string"!=typeof e&&unreachable("Invalid argument for stringToBytes");const t=e.length,i=new Uint8Array(t);for(let a=0;a<t;++a)i[a]=255&e.charCodeAt(a);return i}function string32(e){return String.fromCharCode(e>>24&255,e>>16&255,e>>8&255,255&e)}function objectSize(e){return Object.keys(e).length}class FeatureTest{static get isLittleEndian(){return shadow(this,"isLittleEndian",function isLittleEndian(){const e=new Uint8Array(4);e[0]=1;return 1===new Uint32Array(e.buffer,0,1)[0]}())}static get isEvalSupported(){return shadow(this,"isEvalSupported",function isEvalSupported(){try{new Function("");return!0}catch{return!1}}())}static get isOffscreenCanvasSupported(){return shadow(this,"isOffscreenCanvasSupported","undefined"!=typeof OffscreenCanvas)}static get platform(){return"undefined"!=typeof navigator&&"string"==typeof navigator?.platform?shadow(this,"platform",{isMac:navigator.platform.includes("Mac")}):shadow(this,"platform",{isMac:!1})}static get isCSSRoundSupported(){return shadow(this,"isCSSRoundSupported",globalThis.CSS?.supports?.("width: round(1.5px, 1px)"))}}const nt=Array.from(Array(256).keys(),(e=>e.toString(16).padStart(2,"0")));class Util{static makeHexColor(e,t,i){return`#${nt[e]}${nt[t]}${nt[i]}`}static scaleMinMax(e,t){let i;if(e[0]){if(e[0]<0){i=t[0];t[0]=t[2];t[2]=i}t[0]*=e[0];t[2]*=e[0];if(e[3]<0){i=t[1];t[1]=t[3];t[3]=i}t[1]*=e[3];t[3]*=e[3]}else{i=t[0];t[0]=t[1];t[1]=i;i=t[2];t[2]=t[3];t[3]=i;if(e[1]<0){i=t[1];t[1]=t[3];t[3]=i}t[1]*=e[1];t[3]*=e[1];if(e[2]<0){i=t[0];t[0]=t[2];t[2]=i}t[0]*=e[2];t[2]*=e[2]}t[0]+=e[4];t[1]+=e[5];t[2]+=e[4];t[3]+=e[5]}static transform(e,t){return[e[0]*t[0]+e[2]*t[1],e[1]*t[0]+e[3]*t[1],e[0]*t[2]+e[2]*t[3],e[1]*t[2]+e[3]*t[3],e[0]*t[4]+e[2]*t[5]+e[4],e[1]*t[4]+e[3]*t[5]+e[5]]}static applyTransform(e,t){return[e[0]*t[0]+e[1]*t[2]+t[4],e[0]*t[1]+e[1]*t[3]+t[5]]}static applyInverseTransform(e,t){const i=t[0]*t[3]-t[1]*t[2];return[(e[0]*t[3]-e[1]*t[2]+t[2]*t[5]-t[4]*t[3])/i,(-e[0]*t[1]+e[1]*t[0]+t[4]*t[1]-t[5]*t[0])/i]}static getAxialAlignedBoundingBox(e,t){const i=this.applyTransform(e,t),a=this.applyTransform(e.slice(2,4),t),s=this.applyTransform([e[0],e[3]],t),r=this.applyTransform([e[2],e[1]],t);return[Math.min(i[0],a[0],s[0],r[0]),Math.min(i[1],a[1],s[1],r[1]),Math.max(i[0],a[0],s[0],r[0]),Math.max(i[1],a[1],s[1],r[1])]}static inverseTransform(e){const t=e[0]*e[3]-e[1]*e[2];return[e[3]/t,-e[1]/t,-e[2]/t,e[0]/t,(e[2]*e[5]-e[4]*e[3])/t,(e[4]*e[1]-e[5]*e[0])/t]}static singularValueDecompose2dScale(e){const t=[e[0],e[2],e[1],e[3]],i=e[0]*t[0]+e[1]*t[2],a=e[0]*t[1]+e[1]*t[3],s=e[2]*t[0]+e[3]*t[2],r=e[2]*t[1]+e[3]*t[3],n=(i+r)/2,g=Math.sqrt((i+r)**2-4*(i*r-s*a))/2,o=n+g||1,c=n-g||1;return[Math.sqrt(o),Math.sqrt(c)]}static normalizeRect(e){const t=e.slice(0);if(e[0]>e[2]){t[0]=e[2];t[2]=e[0]}if(e[1]>e[3]){t[1]=e[3];t[3]=e[1]}return t}static intersect(e,t){const i=Math.max(Math.min(e[0],e[2]),Math.min(t[0],t[2])),a=Math.min(Math.max(e[0],e[2]),Math.max(t[0],t[2]));if(i>a)return null;const s=Math.max(Math.min(e[1],e[3]),Math.min(t[1],t[3])),r=Math.min(Math.max(e[1],e[3]),Math.max(t[1],t[3]));return s>r?null:[i,s,a,r]}static#A(e,t,i,a,s,r,n,g,o,c){if(o<=0||o>=1)return;const C=1-o,h=o*o,l=h*o,Q=C*(C*(C*e+3*o*t)+3*h*i)+l*a,E=C*(C*(C*s+3*o*r)+3*h*n)+l*g;c[0]=Math.min(c[0],Q);c[1]=Math.min(c[1],E);c[2]=Math.max(c[2],Q);c[3]=Math.max(c[3],E)}static#e(e,t,i,a,s,r,n,g,o,c,C,h){if(Math.abs(o)<1e-12){Math.abs(c)>=1e-12&&this.#A(e,t,i,a,s,r,n,g,-C/c,h);return}const l=c**2-4*C*o;if(l<0)return;const Q=Math.sqrt(l),E=2*o;this.#A(e,t,i,a,s,r,n,g,(-c+Q)/E,h);this.#A(e,t,i,a,s,r,n,g,(-c-Q)/E,h)}static bezierBoundingBox(e,t,i,a,s,r,n,g,o){if(o){o[0]=Math.min(o[0],e,n);o[1]=Math.min(o[1],t,g);o[2]=Math.max(o[2],e,n);o[3]=Math.max(o[3],t,g)}else o=[Math.min(e,n),Math.min(t,g),Math.max(e,n),Math.max(t,g)];this.#e(e,i,s,n,t,a,r,g,3*(3*(i-s)-e+n),6*(e-2*i+s),3*(i-e),o);this.#e(e,i,s,n,t,a,r,g,3*(3*(a-r)-t+g),6*(t-2*a+r),3*(a-t),o);return o}}const gt=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,728,711,710,729,733,731,730,732,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8226,8224,8225,8230,8212,8211,402,8260,8249,8250,8722,8240,8222,8220,8221,8216,8217,8218,8482,64257,64258,321,338,352,376,381,305,322,339,353,382,0,8364];function stringToPDFString(e){if(e[0]>="茂"){let t;if("镁"===e[0]&&"每"===e[1]){t="utf-16be";e.length%2==1&&(e=e.slice(0,-1))}else if("每"===e[0]&&"镁"===e[1]){t="utf-16le";e.length%2==1&&(e=e.slice(0,-1))}else"茂"===e[0]&&"禄"===e[1]&&"驴"===e[2]&&(t="utf-8");if(t)try{const i=new TextDecoder(t,{fatal:!0}),a=stringToBytes(e),s=i.decode(a);return s.includes("")?s.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g,""):s}catch(e){warn(`stringToPDFString: "${e}".`)}}const t=[];for(let i=0,a=e.length;i<a;i++){const s=e.charCodeAt(i);if(27===s){for(;++i<a&&27!==e.charCodeAt(i););continue}const r=gt[s];t.push(r?String.fromCharCode(r):e.charAt(i))}return t.join("")}function stringToUTF8String(e){return decodeURIComponent(escape(e))}function utf8StringToString(e){return unescape(encodeURIComponent(e))}function isArrayEqual(e,t){if(e.length!==t.length)return!1;for(let i=0,a=e.length;i<a;i++)if(e[i]!==t[i])return!1;return!0}function getModificationDate(e=new Date){return[e.getUTCFullYear().toString(),(e.getUTCMonth()+1).toString().padStart(2,"0"),e.getUTCDate().toString().padStart(2,"0"),e.getUTCHours().toString().padStart(2,"0"),e.getUTCMinutes().toString().padStart(2,"0"),e.getUTCSeconds().toString().padStart(2,"0")].join("")}let ot=null,It=null;const ct=0,Ct=1,ht=2,Bt=3,lt=4,Qt=5,Et=6,ut=7,dt=8,ft=Symbol("CIRCULAR_REF"),pt=Symbol("EOF");let mt=Object.create(null),yt=Object.create(null),wt=Object.create(null);class Name{constructor(e){this.name=e}static get(e){return yt[e]||=new Name(e)}}class Cmd{constructor(e){this.cmd=e}static get(e){return mt[e]||=new Cmd(e)}}const Dt=function nonSerializableClosure(){return Dt};class Dict{constructor(e=null){this._map=Object.create(null);this.xref=e;this.objId=null;this.suppressEncryption=!1;this.__nonSerializable__=Dt}assignXref(e){this.xref=e}get size(){return Object.keys(this._map).length}get(e,t,i){let a=this._map[e];if(void 0===a&&void 0!==t){a=this._map[t];void 0===a&&void 0!==i&&(a=this._map[i])}return a instanceof Ref&&this.xref?this.xref.fetch(a,this.suppressEncryption):a}async getAsync(e,t,i){let a=this._map[e];if(void 0===a&&void 0!==t){a=this._map[t];void 0===a&&void 0!==i&&(a=this._map[i])}return a instanceof Ref&&this.xref?this.xref.fetchAsync(a,this.suppressEncryption):a}getArray(e,t,i){let a=this._map[e];if(void 0===a&&void 0!==t){a=this._map[t];void 0===a&&void 0!==i&&(a=this._map[i])}a instanceof Ref&&this.xref&&(a=this.xref.fetch(a,this.suppressEncryption));if(Array.isArray(a)){a=a.slice();for(let e=0,t=a.length;e<t;e++)a[e]instanceof Ref&&this.xref&&(a[e]=this.xref.fetch(a[e],this.suppressEncryption))}return a}getRaw(e){return this._map[e]}getKeys(){return Object.keys(this._map)}getRawValues(){return Object.values(this._map)}set(e,t){this._map[e]=t}has(e){return void 0!==this._map[e]}forEach(e){for(const t in this._map)e(t,this.get(t))}static get empty(){const e=new Dict(null);e.set=(e,t)=>{unreachable("Should not call `set` on the empty dictionary.")};return shadow(this,"empty",e)}static merge({xref:e,dictArray:t,mergeSubDicts:i=!1}){const a=new Dict(e),s=new Map;for(const e of t)if(e instanceof Dict)for(const[t,a]of Object.entries(e._map)){let e=s.get(t);if(void 0===e){e=[];s.set(t,e)}else if(!(i&&a instanceof Dict))continue;e.push(a)}for(const[t,i]of s){if(1===i.length||!(i[0]instanceof Dict)){a._map[t]=i[0];continue}const s=new Dict(e);for(const e of i)for(const[t,i]of Object.entries(e._map))void 0===s._map[t]&&(s._map[t]=i);s.size>0&&(a._map[t]=s)}s.clear();return a.size>0?a:Dict.empty}clone(){const e=new Dict(this.xref);for(const t of this.getKeys())e.set(t,this.getRaw(t));return e}}class Ref{constructor(e,t){this.num=e;this.gen=t}toString(){return 0===this.gen?`${this.num}R`:`${this.num}R${this.gen}`}static fromString(e){const t=wt[e];if(t)return t;const i=/^(\d+)R(\d*)$/.exec(e);return i&&"0"!==i[1]?wt[e]=new Ref(parseInt(i[1]),i[2]?parseInt(i[2]):0):null}static get(e,t){const i=0===t?`${e}R`:`${e}R${t}`;return wt[i]||=new Ref(e,t)}}class RefSet{constructor(e=null){this._set=new Set(e?._set)}has(e){return this._set.has(e.toString())}put(e){this._set.add(e.toString())}remove(e){this._set.delete(e.toString())}[Symbol.iterator](){return this._set.values()}clear(){this._set.clear()}}class RefSetCache{constructor(){this._map=new Map}get size(){return this._map.size}get(e){return this._map.get(e.toString())}has(e){return this._map.has(e.toString())}put(e,t){this._map.set(e.toString(),t)}putAlias(e,t){this._map.set(e.toString(),this.get(t))}[Symbol.iterator](){return this._map.values()}clear(){this._map.clear()}*items(){for(const[e,t]of this._map)yield[Ref.fromString(e),t]}}function isName(e,t){return e instanceof Name&&(void 0===t||e.name===t)}function isCmd(e,t){return e instanceof Cmd&&(void 0===t||e.cmd===t)}function isDict(e,t){return e instanceof Dict&&(void 0===t||isName(e.get("Type"),t))}function isRefsEqual(e,t){return e.num===t.num&&e.gen===t.gen}class BaseStream{constructor(){this.constructor===BaseStream&&unreachable("Cannot initialize BaseStream.")}get length(){unreachable("Abstract getter `length` accessed")}get isEmpty(){unreachable("Abstract getter `isEmpty` accessed")}get isDataLoaded(){return shadow(this,"isDataLoaded",!0)}getByte(){unreachable("Abstract method `getByte` called")}getBytes(e){unreachable("Abstract method `getBytes` called")}async getImageData(e,t){return this.getBytes(e,t)}async asyncGetBytes(){unreachable("Abstract method `asyncGetBytes` called")}get isAsync(){return!1}get canAsyncDecodeImageFromBuffer(){return!1}peekByte(){const e=this.getByte();-1!==e&&this.pos--;return e}peekBytes(e){const t=this.getBytes(e);this.pos-=t.length;return t}getUint16(){const e=this.getByte(),t=this.getByte();return-1===e||-1===t?-1:(e<<8)+t}getInt32(){return(this.getByte()<<24)+(this.getByte()<<16)+(this.getByte()<<8)+this.getByte()}getByteRange(e,t){unreachable("Abstract method `getByteRange` called")}getString(e){return bytesToString(this.getBytes(e))}skip(e){this.pos+=e||1}reset(){unreachable("Abstract method `reset` called")}moveStart(){unreachable("Abstract method `moveStart` called")}makeSubStream(e,t,i=null){unreachable("Abstract method `makeSubStream` called")}getBaseStreams(){return null}}const bt=/^[1-9]\.\d$/;function getLookupTableFactory(e){let t;return function(){if(e){t=Object.create(null);e(t);e=null}return t}}class MissingDataException extends rt{constructor(e,t){super(`Missing data [${e}, ${t})`,"MissingDataException");this.begin=e;this.end=t}}class ParserEOFException extends rt{constructor(e){super(e,"ParserEOFException")}}class XRefEntryException extends rt{constructor(e){super(e,"XRefEntryException")}}class XRefParseException extends rt{constructor(e){super(e,"XRefParseException")}}function arrayBuffersToBytes(e){const t=e.length;if(0===t)return new Uint8Array(0);if(1===t)return new Uint8Array(e[0]);let i=0;for(let a=0;a<t;a++)i+=e[a].byteLength;const a=new Uint8Array(i);let s=0;for(let i=0;i<t;i++){const t=new Uint8Array(e[i]);a.set(t,s);s+=t.byteLength}return a}function getInheritableProperty({dict:e,key:t,getArray:i=!1,stopWhenFound:a=!0}){let s;const r=new RefSet;for(;e instanceof Dict&&(!e.objId||!r.has(e.objId));){e.objId&&r.put(e.objId);const n=i?e.getArray(t):e.get(t);if(void 0!==n){if(a)return n;(s||=[]).push(n)}e=e.get("Parent")}return s}const Ft=["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM","","X","XX","XXX","XL","L","LX","LXX","LXXX","XC","","I","II","III","IV","V","VI","VII","VIII","IX"];function toRomanNumerals(e,t=!1){assert(Number.isInteger(e)&&e>0,"The number should be a positive integer.");const i=[];let a;for(;e>=1e3;){e-=1e3;i.push("M")}a=e/100|0;e%=100;i.push(Ft[a]);a=e/10|0;e%=10;i.push(Ft[10+a]);i.push(Ft[20+e]);const s=i.join("");return t?s.toLowerCase():s}function log2(e){return e<=0?0:Math.ceil(Math.log2(e))}function readInt8(e,t){return e[t]<<24>>24}function readUint16(e,t){return e[t]<<8|e[t+1]}function readUint32(e,t){return(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0}function isWhiteSpace(e){return 32===e||9===e||13===e||10===e}function isNumberArray(e,t){return Array.isArray(e)&&(null===t||e.length===t)&&e.every((e=>"number"==typeof e))}function lookupMatrix(e,t){return isNumberArray(e,6)?e:t}function lookupRect(e,t){return isNumberArray(e,4)?e:t}function lookupNormalRect(e,t){return isNumberArray(e,4)?Util.normalizeRect(e):t}function parseXFAPath(e){const t=/(.+)\[(\d+)\]$/;return e.split(".").map((e=>{const i=e.match(t);return i?{name:i[1],pos:parseInt(i[2],10)}:{name:e,pos:0}}))}function escapePDFName(e){const t=[];let i=0;for(let a=0,s=e.length;a<s;a++){const s=e.charCodeAt(a);if(s<33||s>126||35===s||40===s||41===s||60===s||62===s||91===s||93===s||123===s||125===s||47===s||37===s){i<a&&t.push(e.substring(i,a));t.push(`#${s.toString(16)}`);i=a+1}}if(0===t.length)return e;i<e.length&&t.push(e.substring(i,e.length));return t.join("")}function escapeString(e){return e.replaceAll(/([()\\\n\r])/g,(e=>"\n"===e?"\\n":"\r"===e?"\\r":`\\${e}`))}function _collectJS(e,t,i,a){if(!e)return;let s=null;if(e instanceof Ref){if(a.has(e))return;s=e;a.put(s);e=t.fetch(e)}if(Array.isArray(e))for(const s of e)_collectJS(s,t,i,a);else if(e instanceof Dict){if(isName(e.get("S"),"JavaScript")){const t=e.get("JS");let a;t instanceof BaseStream?a=t.getString():"string"==typeof t&&(a=t);a&&=stringToPDFString(a).replaceAll("\0","");a&&i.push(a)}_collectJS(e.getRaw("Next"),t,i,a)}s&&a.remove(s)}function collectActions(e,t,i){const a=Object.create(null),s=getInheritableProperty({dict:t,key:"AA",stopWhenFound:!1});if(s)for(let t=s.length-1;t>=0;t--){const r=s[t];if(r instanceof Dict)for(const t of r.getKeys()){const s=i[t];if(!s)continue;const n=[];_collectJS(r.getRaw(t),e,n,new RefSet);n.length>0&&(a[s]=n)}}if(t.has("A")){const i=[];_collectJS(t.get("A"),e,i,new RefSet);i.length>0&&(a.Action=i)}return objectSize(a)>0?a:null}const St={60:"&lt;",62:"&gt;",38:"&amp;",34:"&quot;",39:"&apos;"};function*codePointIter(e){for(let t=0,i=e.length;t<i;t++){const i=e.codePointAt(t);i>55295&&(i<57344||i>65533)&&t++;yield i}}function encodeToXmlString(e){const t=[];let i=0;for(let a=0,s=e.length;a<s;a++){const s=e.codePointAt(a);if(32<=s&&s<=126){const r=St[s];if(r){i<a&&t.push(e.substring(i,a));t.push(r);i=a+1}}else{i<a&&t.push(e.substring(i,a));t.push(`&#x${s.toString(16).toUpperCase()};`);s>55295&&(s<57344||s>65533)&&a++;i=a+1}}if(0===t.length)return e;i<e.length&&t.push(e.substring(i,e.length));return t.join("")}function validateFontName(e,t=!1){const i=/^("|').*("|')$/.exec(e);if(i&&i[1]===i[2]){if(new RegExp(`[^\\\\]${i[1]}`).test(e.slice(1,-1))){t&&warn(`FontFamily contains unescaped ${i[1]}: ${e}.`);return!1}}else for(const i of e.split(/[ \t]+/))if(/^(\d|(-(\d|-)))/.test(i)||!/^[\w-\\]+$/.test(i)){t&&warn(`FontFamily contains invalid <custom-ident>: ${e}.`);return!1}return!0}function validateCSSFont(e){const t=new Set(["100","200","300","400","500","600","700","800","900","1000","normal","bold","bolder","lighter"]),{fontFamily:i,fontWeight:a,italicAngle:s}=e;if(!validateFontName(i,!0))return!1;const r=a?a.toString():"";e.fontWeight=t.has(r)?r:"400";const n=parseFloat(s);e.italicAngle=isNaN(n)||n<-90||n>90?"14":s.toString();return!0}function recoverJsURL(e){const t=new RegExp("^\\s*("+["app.launchURL","window.open","xfa.host.gotoURL"].join("|").replaceAll(".","\\.")+")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))","i").exec(e);if(t?.[2]){const e=t[2];let i=!1;"true"===t[3]&&"app.launchURL"===t[1]&&(i=!0);return{url:e,newWindow:i}}return null}function numberToString(e){if(Number.isInteger(e))return e.toString();const t=Math.round(100*e);return t%100==0?(t/100).toString():t%10==0?e.toFixed(1):e.toFixed(2)}function getNewAnnotationsMap(e){if(!e)return null;const t=new Map;for(const[i,a]of e){if(!i.startsWith(E))continue;let e=t.get(a.pageIndex);if(!e){e=[];t.set(a.pageIndex,e)}e.push(a)}return t.size>0?t:null}function isAscii(e){return/^[\x00-\x7F]*$/.test(e)}function stringToUTF16HexString(e){const t=[];for(let i=0,a=e.length;i<a;i++){const a=e.charCodeAt(i);t.push((a>>8&255).toString(16).padStart(2,"0"),(255&a).toString(16).padStart(2,"0"))}return t.join("")}function stringToUTF16String(e,t=!1){const i=[];t&&i.push("镁每");for(let t=0,a=e.length;t<a;t++){const a=e.charCodeAt(t);i.push(String.fromCharCode(a>>8&255),String.fromCharCode(255&a))}return i.join("")}function getRotationMatrix(e,t,i){switch(e){case 90:return[0,1,-1,0,t,0];case 180:return[-1,0,0,-1,t,i];case 270:return[0,-1,1,0,0,i];default:throw new Error("Invalid rotation")}}function getSizeInBytes(e){return Math.ceil(Math.ceil(Math.log2(1+e))/8)}class Stream extends BaseStream{constructor(e,t,i,a){super();this.bytes=e instanceof Uint8Array?e:new Uint8Array(e);this.start=t||0;this.pos=this.start;this.end=t+i||this.bytes.length;this.dict=a}get length(){return this.end-this.start}get isEmpty(){return 0===this.length}getByte(){return this.pos>=this.end?-1:this.bytes[this.pos++]}getBytes(e){const t=this.bytes,i=this.pos,a=this.end;if(!e)return t.subarray(i,a);let s=i+e;s>a&&(s=a);this.pos=s;return t.subarray(i,s)}getByteRange(e,t){e<0&&(e=0);t>this.end&&(t=this.end);return this.bytes.subarray(e,t)}reset(){this.pos=this.start}moveStart(){this.start=this.pos}makeSubStream(e,t,i=null){return new Stream(this.bytes.buffer,e,t,i)}}class StringStream extends Stream{constructor(e){super(stringToBytes(e))}}class NullStream extends Stream{constructor(){super(new Uint8Array(0))}}class ChunkedStream extends Stream{constructor(e,t,i){super(new Uint8Array(e),0,e,null);this.chunkSize=t;this._loadedChunks=new Set;this.numChunks=Math.ceil(e/t);this.manager=i;this.progressiveDataLength=0;this.lastSuccessfulEnsureByteChunk=-1}getMissingChunks(){const e=[];for(let t=0,i=this.numChunks;t<i;++t)this._loadedChunks.has(t)||e.push(t);return e}get numChunksLoaded(){return this._loadedChunks.size}get isDataLoaded(){return this.numChunksLoaded===this.numChunks}onReceiveData(e,t){const i=this.chunkSize;if(e%i!=0)throw new Error(`Bad begin offset: ${e}`);const a=e+t.byteLength;if(a%i!=0&&a!==this.bytes.length)throw new Error(`Bad end offset: ${a}`);this.bytes.set(new Uint8Array(t),e);const s=Math.floor(e/i),r=Math.floor((a-1)/i)+1;for(let e=s;e<r;++e)this._loadedChunks.add(e)}onReceiveProgressiveData(e){let t=this.progressiveDataLength;const i=Math.floor(t/this.chunkSize);this.bytes.set(new Uint8Array(e),t);t+=e.byteLength;this.progressiveDataLength=t;const a=t>=this.end?this.numChunks:Math.floor(t/this.chunkSize);for(let e=i;e<a;++e)this._loadedChunks.add(e)}ensureByte(e){if(e<this.progressiveDataLength)return;const t=Math.floor(e/this.chunkSize);if(!(t>this.numChunks)&&t!==this.lastSuccessfulEnsureByteChunk){if(!this._loadedChunks.has(t))throw new MissingDataException(e,e+1);this.lastSuccessfulEnsureByteChunk=t}}ensureRange(e,t){if(e>=t)return;if(t<=this.progressiveDataLength)return;const i=Math.floor(e/this.chunkSize);if(i>this.numChunks)return;const a=Math.min(Math.floor((t-1)/this.chunkSize)+1,this.numChunks);for(let s=i;s<a;++s)if(!this._loadedChunks.has(s))throw new MissingDataException(e,t)}nextEmptyChunk(e){const t=this.numChunks;for(let i=0;i<t;++i){const a=(e+i)%t;if(!this._loadedChunks.has(a))return a}return null}hasChunk(e){return this._loadedChunks.has(e)}getByte(){const e=this.pos;if(e>=this.end)return-1;e>=this.progressiveDataLength&&this.ensureByte(e);return this.bytes[this.pos++]}getBytes(e){const t=this.bytes,i=this.pos,a=this.end;if(!e){a>this.progressiveDataLength&&this.ensureRange(i,a);return t.subarray(i,a)}let s=i+e;s>a&&(s=a);s>this.progressiveDataLength&&this.ensureRange(i,s);this.pos=s;return t.subarray(i,s)}getByteRange(e,t){e<0&&(e=0);t>this.end&&(t=this.end);t>this.progressiveDataLength&&this.ensureRange(e,t);return this.bytes.subarray(e,t)}makeSubStream(e,t,i=null){t?e+t>this.progressiveDataLength&&this.ensureRange(e,e+t):e>=this.progressiveDataLength&&this.ensureByte(e);function ChunkedStreamSubstream(){}ChunkedStreamSubstream.prototype=Object.create(this);ChunkedStreamSubstream.prototype.getMissingChunks=function(){const e=this.chunkSize,t=Math.floor(this.start/e),i=Math.floor((this.end-1)/e)+1,a=[];for(let e=t;e<i;++e)this._loadedChunks.has(e)||a.push(e);return a};Object.defineProperty(ChunkedStreamSubstream.prototype,"isDataLoaded",{get(){return this.numChunksLoaded===this.numChunks||0===this.getMissingChunks().length},configurable:!0});const a=new ChunkedStreamSubstream;a.pos=a.start=e;a.end=e+t||this.end;a.dict=i;return a}getBaseStreams(){return[this]}}class ChunkedStreamManager{constructor(e,t){this.length=t.length;this.chunkSize=t.rangeChunkSize;this.stream=new ChunkedStream(this.length,this.chunkSize,this);this.pdfNetworkStream=e;this.disableAutoFetch=t.disableAutoFetch;this.msgHandler=t.msgHandler;this.currRequestId=0;this._chunksNeededByRequest=new Map;this._requestsByChunk=new Map;this._promisesByRequest=new Map;this.progressiveDataLength=0;this.aborted=!1;this._loadedStreamCapability=Promise.withResolvers()}sendRequest(e,t){const i=this.pdfNetworkStream.getRangeReader(e,t);i.isStreamingSupported||(i.onProgress=this.onProgress.bind(this));let a=[],s=0;return new Promise(((e,t)=>{const readChunk=({value:r,done:n})=>{try{if(n){const t=arrayBuffersToBytes(a);a=null;e(t);return}s+=r.byteLength;i.isStreamingSupported&&this.onProgress({loaded:s});a.push(r);i.read().then(readChunk,t)}catch(e){t(e)}};i.read().then(readChunk,t)})).then((t=>{this.aborted||this.onReceiveData({chunk:t,begin:e})}))}requestAllChunks(e=!1){if(!e){const e=this.stream.getMissingChunks();this._requestChunks(e)}return this._loadedStreamCapability.promise}_requestChunks(e){const t=this.currRequestId++,i=new Set;this._chunksNeededByRequest.set(t,i);for(const t of e)this.stream.hasChunk(t)||i.add(t);if(0===i.size)return Promise.resolve();const a=Promise.withResolvers();this._promisesByRequest.set(t,a);const s=[];for(const e of i){let i=this._requestsByChunk.get(e);if(!i){i=[];this._requestsByChunk.set(e,i);s.push(e)}i.push(t)}if(s.length>0){const e=this.groupChunks(s);for(const t of e){const e=t.beginChunk*this.chunkSize,i=Math.min(t.endChunk*this.chunkSize,this.length);this.sendRequest(e,i).catch(a.reject)}}return a.promise.catch((e=>{if(!this.aborted)throw e}))}getStream(){return this.stream}requestRange(e,t){t=Math.min(t,this.length);const i=this.getBeginChunk(e),a=this.getEndChunk(t),s=[];for(let e=i;e<a;++e)s.push(e);return this._requestChunks(s)}requestRanges(e=[]){const t=[];for(const i of e){const e=this.getBeginChunk(i.begin),a=this.getEndChunk(i.end);for(let i=e;i<a;++i)t.includes(i)||t.push(i)}t.sort((function(e,t){return e-t}));return this._requestChunks(t)}groupChunks(e){const t=[];let i=-1,a=-1;for(let s=0,r=e.length;s<r;++s){const r=e[s];i<0&&(i=r);if(a>=0&&a+1!==r){t.push({beginChunk:i,endChunk:a+1});i=r}s+1===e.length&&t.push({beginChunk:i,endChunk:r+1});a=r}return t}onProgress(e){this.msgHandler.send("DocProgress",{loaded:this.stream.numChunksLoaded*this.chunkSize+e.loaded,total:this.length})}onReceiveData(e){const t=e.chunk,i=void 0===e.begin,a=i?this.progressiveDataLength:e.begin,s=a+t.byteLength,r=Math.floor(a/this.chunkSize),n=s<this.length?Math.floor(s/this.chunkSize):Math.ceil(s/this.chunkSize);if(i){this.stream.onReceiveProgressiveData(t);this.progressiveDataLength=s}else this.stream.onReceiveData(a,t);this.stream.isDataLoaded&&this._loadedStreamCapability.resolve(this.stream);const g=[];for(let e=r;e<n;++e){const t=this._requestsByChunk.get(e);if(t){this._requestsByChunk.delete(e);for(const i of t){const t=this._chunksNeededByRequest.get(i);t.has(e)&&t.delete(e);t.size>0||g.push(i)}}}if(!this.disableAutoFetch&&0===this._requestsByChunk.size){let e;if(1===this.stream.numChunksLoaded){const t=this.stream.numChunks-1;this.stream.hasChunk(t)||(e=t)}else e=this.stream.nextEmptyChunk(n);Number.isInteger(e)&&this._requestChunks([e])}for(const e of g){const t=this._promisesByRequest.get(e);this._promisesByRequest.delete(e);t.resolve()}this.msgHandler.send("DocProgress",{loaded:this.stream.numChunksLoaded*this.chunkSize,total:this.length})}onError(e){this._loadedStreamCapability.reject(e)}getBeginChunk(e){return Math.floor(e/this.chunkSize)}getEndChunk(e){return Math.floor((e-1)/this.chunkSize)+1}abort(e){this.aborted=!0;this.pdfNetworkStream?.cancelAllRequests(e);for(const t of this._promisesByRequest.values())t.reject(e)}}class ColorSpace{constructor(e,t){this.constructor===ColorSpace&&unreachable("Cannot initialize ColorSpace.");this.name=e;this.numComps=t}getRgb(e,t){const i=new Uint8ClampedArray(3);this.getRgbItem(e,t,i,0);return i}getRgbItem(e,t,i,a){unreachable("Should not call ColorSpace.getRgbItem")}getRgbBuffer(e,t,i,a,s,r,n){unreachable("Should not call ColorSpace.getRgbBuffer")}getOutputLength(e,t){unreachable("Should not call ColorSpace.getOutputLength")}isPassthrough(e){return!1}isDefaultDecode(e,t){return ColorSpace.isDefaultDecode(e,this.numComps)}fillRgb(e,t,i,a,s,r,n,g,o){const c=t*i;let C=null;const h=1<<n,l=i!==s||t!==a;if(this.isPassthrough(n))C=g;else if(1===this.numComps&&c>h&&"DeviceGray"!==this.name&&"DeviceRGB"!==this.name){const t=n<=8?new Uint8Array(h):new Uint16Array(h);for(let e=0;e<h;e++)t[e]=e;const i=new Uint8ClampedArray(3*h);this.getRgbBuffer(t,0,h,i,0,n,0);if(l){C=new Uint8Array(3*c);let e=0;for(let t=0;t<c;++t){const a=3*g[t];C[e++]=i[a];C[e++]=i[a+1];C[e++]=i[a+2]}}else{let t=0;for(let a=0;a<c;++a){const s=3*g[a];e[t++]=i[s];e[t++]=i[s+1];e[t++]=i[s+2];t+=o}}}else if(l){C=new Uint8ClampedArray(3*c);this.getRgbBuffer(g,0,c,C,0,n,0)}else this.getRgbBuffer(g,0,a*r,e,0,n,o);if(C)if(l)!function resizeRgbImage(e,t,i,a,s,r,n){n=1!==n?0:n;const g=i/s,o=a/r;let c,C=0;const h=new Uint16Array(s),l=3*i;for(let e=0;e<s;e++)h[e]=3*Math.floor(e*g);for(let i=0;i<r;i++){const a=Math.floor(i*o)*l;for(let i=0;i<s;i++){c=a+h[i];t[C++]=e[c++];t[C++]=e[c++];t[C++]=e[c++];C+=n}}}(C,e,t,i,a,s,o);else{let t=0,i=0;for(let s=0,n=a*r;s<n;s++){e[t++]=C[i++];e[t++]=C[i++];e[t++]=C[i++];t+=o}}}get usesZeroToOneRange(){return shadow(this,"usesZeroToOneRange",!0)}static _cache(e,t,i,a){if(!i)throw new Error('ColorSpace._cache - expected "localColorSpaceCache" argument.');if(!a)throw new Error('ColorSpace._cache - expected "parsedColorSpace" argument.');let s,r;if(e instanceof Ref){r=e;e=t.fetch(e)}e instanceof Name&&(s=e.name);(s||r)&&i.set(s,r,a)}static getCached(e,t,i){if(!i)throw new Error('ColorSpace.getCached - expected "localColorSpaceCache" argument.');if(e instanceof Ref){const a=i.getByRef(e);if(a)return a;try{e=t.fetch(e)}catch(e){if(e instanceof MissingDataException)throw e}}if(e instanceof Name){const t=i.getByName(e.name);if(t)return t}return null}static async parseAsync({cs:e,xref:t,resources:i=null,pdfFunctionFactory:a,localColorSpaceCache:s}){const r=this._parse(e,t,i,a);this._cache(e,t,s,r);return r}static parse({cs:e,xref:t,resources:i=null,pdfFunctionFactory:a,localColorSpaceCache:s}){const r=this.getCached(e,t,s);if(r)return r;const n=this._parse(e,t,i,a);this._cache(e,t,s,n);return n}static _parse(e,t,i=null,a){if((e=t.fetchIfRef(e))instanceof Name)switch(e.name){case"G":case"DeviceGray":return this.singletons.gray;case"RGB":case"DeviceRGB":return this.singletons.rgb;case"DeviceRGBA":return this.singletons.rgba;case"CMYK":case"DeviceCMYK":return this.singletons.cmyk;case"Pattern":return new PatternCS(null);default:if(i instanceof Dict){const s=i.get("ColorSpace");if(s instanceof Dict){const r=s.get(e.name);if(r){if(r instanceof Name)return this._parse(r,t,i,a);e=r;break}}}throw new FormatError(`Unrecognized ColorSpace: ${e.name}`)}if(Array.isArray(e)){const s=t.fetchIfRef(e[0]).name;let r,n,g,o,c,C;switch(s){case"G":case"DeviceGray":return this.singletons.gray;case"RGB":case"DeviceRGB":return this.singletons.rgb;case"CMYK":case"DeviceCMYK":return this.singletons.cmyk;case"CalGray":r=t.fetchIfRef(e[1]);o=r.getArray("WhitePoint");c=r.getArray("BlackPoint");C=r.get("Gamma");return new CalGrayCS(o,c,C);case"CalRGB":r=t.fetchIfRef(e[1]);o=r.getArray("WhitePoint");c=r.getArray("BlackPoint");C=r.getArray("Gamma");const h=r.getArray("Matrix");return new CalRGBCS(o,c,C,h);case"ICCBased":const l=t.fetchIfRef(e[1]).dict;n=l.get("N");const Q=l.get("Alternate");if(Q){const e=this._parse(Q,t,i,a);if(e.numComps===n)return e;warn("ICCBased color space: Ignoring incorrect /Alternate entry.")}if(1===n)return this.singletons.gray;if(3===n)return this.singletons.rgb;if(4===n)return this.singletons.cmyk;break;case"Pattern":g=e[1]||null;g&&(g=this._parse(g,t,i,a));return new PatternCS(g);case"I":case"Indexed":g=this._parse(e[1],t,i,a);const E=t.fetchIfRef(e[2])+1,u=t.fetchIfRef(e[3]);return new IndexedCS(g,E,u);case"Separation":case"DeviceN":const d=t.fetchIfRef(e[1]);n=Array.isArray(d)?d.length:1;g=this._parse(e[2],t,i,a);const f=a.create(e[3]);return new AlternateCS(n,g,f);case"Lab":r=t.fetchIfRef(e[1]);o=r.getArray("WhitePoint");c=r.getArray("BlackPoint");const p=r.getArray("Range");return new LabCS(o,c,p);default:throw new FormatError(`Unimplemented ColorSpace object: ${s}`)}}throw new FormatError(`Unrecognized ColorSpace object: ${e}`)}static isDefaultDecode(e,t){if(!Array.isArray(e))return!0;if(2*t!==e.length){warn("The decode map is not the correct length");return!0}for(let t=0,i=e.length;t<i;t+=2)if(0!==e[t]||1!==e[t+1])return!1;return!0}static get singletons(){return shadow(this,"singletons",{get gray(){return shadow(this,"gray",new DeviceGrayCS)},get rgb(){return shadow(this,"rgb",new DeviceRgbCS)},get rgba(){return shadow(this,"rgba",new DeviceRgbaCS)},get cmyk(){return shadow(this,"cmyk",new DeviceCmykCS)}})}}class AlternateCS extends ColorSpace{constructor(e,t,i){super("Alternate",e);this.base=t;this.tintFn=i;this.tmpBuf=new Float32Array(t.numComps)}getRgbItem(e,t,i,a){const s=this.tmpBuf;this.tintFn(e,t,s,0);this.base.getRgbItem(s,0,i,a)}getRgbBuffer(e,t,i,a,s,r,n){const g=this.tintFn,o=this.base,c=1/((1<<r)-1),C=o.numComps,h=o.usesZeroToOneRange,l=(o.isPassthrough(8)||!h)&&0===n;let Q=l?s:0;const E=l?a:new Uint8ClampedArray(C*i),u=this.numComps,d=new Float32Array(u),f=new Float32Array(C);let p,m;for(p=0;p<i;p++){for(m=0;m<u;m++)d[m]=e[t++]*c;g(d,0,f,0);if(h)for(m=0;m<C;m++)E[Q++]=255*f[m];else{o.getRgbItem(f,0,E,Q);Q+=C}}l||o.getRgbBuffer(E,0,i,a,s,8,n)}getOutputLength(e,t){return this.base.getOutputLength(e*this.base.numComps/this.numComps,t)}}class PatternCS extends ColorSpace{constructor(e){super("Pattern",null);this.base=e}isDefaultDecode(e,t){unreachable("Should not call PatternCS.isDefaultDecode")}}class IndexedCS extends ColorSpace{constructor(e,t,i){super("Indexed",1);this.base=e;this.highVal=t;const a=e.numComps*t;this.lookup=new Uint8Array(a);if(i instanceof BaseStream){const e=i.getBytes(a);this.lookup.set(e)}else{if("string"!=typeof i)throw new FormatError(`IndexedCS - unrecognized lookup table: ${i}`);for(let e=0;e<a;++e)this.lookup[e]=255&i.charCodeAt(e)}}getRgbItem(e,t,i,a){const s=this.base.numComps,r=e[t]*s;this.base.getRgbBuffer(this.lookup,r,1,i,a,8,0)}getRgbBuffer(e,t,i,a,s,r,n){const g=this.base,o=g.numComps,c=g.getOutputLength(o,n),C=this.lookup;for(let r=0;r<i;++r){const i=e[t++]*o;g.getRgbBuffer(C,i,1,a,s,8,n);s+=c}}getOutputLength(e,t){return this.base.getOutputLength(e*this.base.numComps,t)}isDefaultDecode(e,t){if(!Array.isArray(e))return!0;if(2!==e.length){warn("Decode map length is not correct");return!0}if(!Number.isInteger(t)||t<1){warn("Bits per component is not correct");return!0}return 0===e[0]&&e[1]===(1<<t)-1}}class DeviceGrayCS extends ColorSpace{constructor(){super("DeviceGray",1)}getRgbItem(e,t,i,a){const s=255*e[t];i[a]=i[a+1]=i[a+2]=s}getRgbBuffer(e,t,i,a,s,r,n){const g=255/((1<<r)-1);let o=t,c=s;for(let t=0;t<i;++t){const t=g*e[o++];a[c++]=t;a[c++]=t;a[c++]=t;c+=n}}getOutputLength(e,t){return e*(3+t)}}class DeviceRgbCS extends ColorSpace{constructor(){super("DeviceRGB",3)}getRgbItem(e,t,i,a){i[a]=255*e[t];i[a+1]=255*e[t+1];i[a+2]=255*e[t+2]}getRgbBuffer(e,t,i,a,s,r,n){if(8===r&&0===n){a.set(e.subarray(t,t+3*i),s);return}const g=255/((1<<r)-1);let o=t,c=s;for(let t=0;t<i;++t){a[c++]=g*e[o++];a[c++]=g*e[o++];a[c++]=g*e[o++];c+=n}}getOutputLength(e,t){return e*(3+t)/3|0}isPassthrough(e){return 8===e}}class DeviceRgbaCS extends ColorSpace{constructor(){super("DeviceRGBA",4)}getOutputLength(e,t){return 4*e}isPassthrough(e){return 8===e}}class DeviceCmykCS extends ColorSpace{constructor(){super("DeviceCMYK",4)}#t(e,t,i,a,s){const r=e[t]*i,n=e[t+1]*i,g=e[t+2]*i,o=e[t+3]*i;a[s]=255+r*(-4.387332384609988*r+54.48615194189176*n+18.82290502165302*g+212.25662451639585*o-285.2331026137004)+n*(1.7149763477362134*n-5.6096736904047315*g+-17.873870861415444*o-5.497006427196366)+g*(-2.5217340131683033*g-21.248923337353073*o+17.5119270841813)+o*(-21.86122147463605*o-189.48180835922747);a[s+1]=255+r*(8.841041422036149*r+60.118027045597366*n+6.871425592049007*g+31.159100130055922*o-79.2970844816548)+n*(-15.310361306967817*n+17.575251261109482*g+131.35250912493976*o-190.9453302588951)+g*(4.444339102852739*g+9.8632861493405*o-24.86741582555878)+o*(-20.737325471181034*o-187.80453709719578);a[s+2]=255+r*(.8842522430003296*r+8.078677503112928*n+30.89978309703729*g-.23883238689178934*o-14.183576799673286)+n*(10.49593273432072*n+63.02378494754052*g+50.606957656360734*o-112.23884253719248)+g*(.03296041114873217*g+115.60384449646641*o-193.58209356861505)+o*(-22.33816807309886*o-180.12613974708367)}getRgbItem(e,t,i,a){this.#t(e,t,1,i,a)}getRgbBuffer(e,t,i,a,s,r,n){const g=1/((1<<r)-1);for(let r=0;r<i;r++){this.#t(e,t,g,a,s);t+=4;s+=3+n}}getOutputLength(e,t){return e/4*(3+t)|0}}class CalGrayCS extends ColorSpace{constructor(e,t,i){super("CalGray",1);if(!e)throw new FormatError("WhitePoint missing - required for color space CalGray");[this.XW,this.YW,this.ZW]=e;[this.XB,this.YB,this.ZB]=t||[0,0,0];this.G=i||1;if(this.XW<0||this.ZW<0||1!==this.YW)throw new FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`);if(this.XB<0||this.YB<0||this.ZB<0){info(`Invalid BlackPoint for ${this.name}, falling back to default.`);this.XB=this.YB=this.ZB=0}0===this.XB&&0===this.YB&&0===this.ZB||warn(`${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ZB: ${this.ZB}, only default values are supported.`);if(this.G<1){info(`Invalid Gamma: ${this.G} for ${this.name}, falling back to default.`);this.G=1}}#t(e,t,i,a,s){const r=(e[t]*s)**this.G,n=this.YW*r,g=Math.max(295.8*n**.3333333333333333-40.8,0);i[a]=g;i[a+1]=g;i[a+2]=g}getRgbItem(e,t,i,a){this.#t(e,t,i,a,1)}getRgbBuffer(e,t,i,a,s,r,n){const g=1/((1<<r)-1);for(let r=0;r<i;++r){this.#t(e,t,a,s,g);t+=1;s+=3+n}}getOutputLength(e,t){return e*(3+t)}}class CalRGBCS extends ColorSpace{static#i=new Float32Array([.8951,.2664,-.1614,-.7502,1.7135,.0367,.0389,-.0685,1.0296]);static#a=new Float32Array([.9869929,-.1470543,.1599627,.4323053,.5183603,.0492912,-.0085287,.0400428,.9684867]);static#s=new Float32Array([3.2404542,-1.5371385,-.4985314,-.969266,1.8760108,.041556,.0556434,-.2040259,1.0572252]);static#r=new Float32Array([1,1,1]);static#n=new Float32Array(3);static#g=new Float32Array(3);static#o=new Float32Array(3);static#I=(24/116)**3/8;constructor(e,t,i,a){super("CalRGB",3);if(!e)throw new FormatError("WhitePoint missing - required for color space CalRGB");const[s,r,n]=this.whitePoint=e,[g,o,c]=this.blackPoint=t||new Float32Array(3);[this.GR,this.GG,this.GB]=i||new Float32Array([1,1,1]);[this.MXA,this.MYA,this.MZA,this.MXB,this.MYB,this.MZB,this.MXC,this.MYC,this.MZC]=a||new Float32Array([1,0,0,0,1,0,0,0,1]);if(s<0||n<0||1!==r)throw new FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`);if(g<0||o<0||c<0){info(`Invalid BlackPoint for ${this.name} [${g}, ${o}, ${c}], falling back to default.`);this.blackPoint=new Float32Array(3)}if(this.GR<0||this.GG<0||this.GB<0){info(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ${this.name}, falling back to default.`);this.GR=this.GG=this.GB=1}}#c(e,t,i){i[0]=e[0]*t[0]+e[1]*t[1]+e[2]*t[2];i[1]=e[3]*t[0]+e[4]*t[1]+e[5]*t[2];i[2]=e[6]*t[0]+e[7]*t[1]+e[8]*t[2]}#C(e,t,i){i[0]=1*t[0]/e[0];i[1]=1*t[1]/e[1];i[2]=1*t[2]/e[2]}#h(e,t,i){i[0]=.95047*t[0]/e[0];i[1]=1*t[1]/e[1];i[2]=1.08883*t[2]/e[2]}#B(e){return e<=.0031308?this.#l(0,1,12.92*e):e>=.99554525?1:this.#l(0,1,1.055*e**(1/2.4)-.055)}#l(e,t,i){return Math.max(e,Math.min(t,i))}#Q(e){return e<0?-this.#Q(-e):e>8?((e+16)/116)**3:e*CalRGBCS.#I}#E(e,t,i){if(0===e[0]&&0===e[1]&&0===e[2]){i[0]=t[0];i[1]=t[1];i[2]=t[2];return}const a=this.#Q(0),s=(1-a)/(1-this.#Q(e[0])),r=1-s,n=(1-a)/(1-this.#Q(e[1])),g=1-n,o=(1-a)/(1-this.#Q(e[2])),c=1-o;i[0]=t[0]*s+r;i[1]=t[1]*n+g;i[2]=t[2]*o+c}#u(e,t,i){if(1===e[0]&&1===e[2]){i[0]=t[0];i[1]=t[1];i[2]=t[2];return}const a=i;this.#c(CalRGBCS.#i,t,a);const s=CalRGBCS.#n;this.#C(e,a,s);this.#c(CalRGBCS.#a,s,i)}#d(e,t,i){const a=i;this.#c(CalRGBCS.#i,t,a);const s=CalRGBCS.#n;this.#h(e,a,s);this.#c(CalRGBCS.#a,s,i)}#t(e,t,i,a,s){const r=this.#l(0,1,e[t]*s),n=this.#l(0,1,e[t+1]*s),g=this.#l(0,1,e[t+2]*s),o=1===r?1:r**this.GR,c=1===n?1:n**this.GG,C=1===g?1:g**this.GB,h=this.MXA*o+this.MXB*c+this.MXC*C,l=this.MYA*o+this.MYB*c+this.MYC*C,Q=this.MZA*o+this.MZB*c+this.MZC*C,E=CalRGBCS.#g;E[0]=h;E[1]=l;E[2]=Q;const u=CalRGBCS.#o;this.#u(this.whitePoint,E,u);const d=CalRGBCS.#g;this.#E(this.blackPoint,u,d);const f=CalRGBCS.#o;this.#d(CalRGBCS.#r,d,f);const p=CalRGBCS.#g;this.#c(CalRGBCS.#s,f,p);i[a]=255*this.#B(p[0]);i[a+1]=255*this.#B(p[1]);i[a+2]=255*this.#B(p[2])}getRgbItem(e,t,i,a){this.#t(e,t,i,a,1)}getRgbBuffer(e,t,i,a,s,r,n){const g=1/((1<<r)-1);for(let r=0;r<i;++r){this.#t(e,t,a,s,g);t+=3;s+=3+n}}getOutputLength(e,t){return e*(3+t)/3|0}}class LabCS extends ColorSpace{constructor(e,t,i){super("Lab",3);if(!e)throw new FormatError("WhitePoint missing - required for color space Lab");[this.XW,this.YW,this.ZW]=e;[this.amin,this.amax,this.bmin,this.bmax]=i||[-100,100,-100,100];[this.XB,this.YB,this.ZB]=t||[0,0,0];if(this.XW<0||this.ZW<0||1!==this.YW)throw new FormatError("Invalid WhitePoint components, no fallback available");if(this.XB<0||this.YB<0||this.ZB<0){info("Invalid BlackPoint, falling back to default");this.XB=this.YB=this.ZB=0}if(this.amin>this.amax||this.bmin>this.bmax){info("Invalid Range, falling back to defaults");this.amin=-100;this.amax=100;this.bmin=-100;this.bmax=100}}#f(e){return e>=6/29?e**3:108/841*(e-4/29)}#p(e,t,i,a){return i+e*(a-i)/t}#t(e,t,i,a,s){let r=e[t],n=e[t+1],g=e[t+2];if(!1!==i){r=this.#p(r,i,0,100);n=this.#p(n,i,this.amin,this.amax);g=this.#p(g,i,this.bmin,this.bmax)}n>this.amax?n=this.amax:n<this.amin&&(n=this.amin);g>this.bmax?g=this.bmax:g<this.bmin&&(g=this.bmin);const o=(r+16)/116,c=o+n/500,C=o-g/200,h=this.XW*this.#f(c),l=this.YW*this.#f(o),Q=this.ZW*this.#f(C);let E,u,d;if(this.ZW<1){E=3.1339*h+-1.617*l+-.4906*Q;u=-.9785*h+1.916*l+.0333*Q;d=.072*h+-.229*l+1.4057*Q}else{E=3.2406*h+-1.5372*l+-.4986*Q;u=-.9689*h+1.8758*l+.0415*Q;d=.0557*h+-.204*l+1.057*Q}a[s]=255*Math.sqrt(E);a[s+1]=255*Math.sqrt(u);a[s+2]=255*Math.sqrt(d)}getRgbItem(e,t,i,a){this.#t(e,t,!1,i,a)}getRgbBuffer(e,t,i,a,s,r,n){const g=(1<<r)-1;for(let r=0;r<i;r++){this.#t(e,t,g,a,s);t+=3;s+=3+n}}getOutputLength(e,t){return e*(3+t)/3|0}isDefaultDecode(e,t){return!0}get usesZeroToOneRange(){return shadow(this,"usesZeroToOneRange",!1)}}function hexToInt(e,t){let i=0;for(let a=0;a<=t;a++)i=i<<8|e[a];return i>>>0}function hexToStr(e,t){return 1===t?String.fromCharCode(e[0],e[1]):3===t?String.fromCharCode(e[0],e[1],e[2],e[3]):String.fromCharCode(...e.subarray(0,t+1))}function addHex(e,t,i){let a=0;for(let s=i;s>=0;s--){a+=e[s]+t[s];e[s]=255&a;a>>=8}}function incHex(e,t){let i=1;for(let a=t;a>=0&&i>0;a--){i+=e[a];e[a]=255&i;i>>=8}}const kt=16;class BinaryCMapStream{constructor(e){this.buffer=e;this.pos=0;this.end=e.length;this.tmpBuf=new Uint8Array(19)}readByte(){return this.pos>=this.end?-1:this.buffer[this.pos++]}readNumber(){let e,t=0;do{const i=this.readByte();if(i<0)throw new FormatError("unexpected EOF in bcmap");e=!(128&i);t=t<<7|127&i}while(!e);return t}readSigned(){const e=this.readNumber();return 1&e?~(e>>>1):e>>>1}readHex(e,t){e.set(this.buffer.subarray(this.pos,this.pos+t+1));this.pos+=t+1}readHexNumber(e,t){let i;const a=this.tmpBuf;let s=0;do{const e=this.readByte();if(e<0)throw new FormatError("unexpected EOF in bcmap");i=!(128&e);a[s++]=127&e}while(!i);let r=t,n=0,g=0;for(;r>=0;){for(;g<8&&a.length>0;){n|=a[--s]<<g;g+=7}e[r]=255&n;r--;n>>=8;g-=8}}readHexSigned(e,t){this.readHexNumber(e,t);const i=1&e[t]?255:0;let a=0;for(let s=0;s<=t;s++){a=(1&a)<<8|e[s];e[s]=a>>1^i}}readString(){const e=this.readNumber(),t=new Array(e);for(let i=0;i<e;i++)t[i]=this.readNumber();return String.fromCharCode(...t)}}class BinaryCMapReader{async process(e,t,i){const a=new BinaryCMapStream(e),s=a.readByte();t.vertical=!!(1&s);let r=null;const n=new Uint8Array(kt),g=new Uint8Array(kt),o=new Uint8Array(kt),c=new Uint8Array(kt),C=new Uint8Array(kt);let h,l;for(;(l=a.readByte())>=0;){const e=l>>5;if(7===e){switch(31&l){case 0:a.readString();break;case 1:r=a.readString()}continue}const i=!!(16&l),s=15&l;if(s+1>kt)throw new Error("BinaryCMapReader.process: Invalid dataSize.");const Q=1,E=a.readNumber();switch(e){case 0:a.readHex(n,s);a.readHexNumber(g,s);addHex(g,n,s);t.addCodespaceRange(s+1,hexToInt(n,s),hexToInt(g,s));for(let e=1;e<E;e++){incHex(g,s);a.readHexNumber(n,s);addHex(n,g,s);a.readHexNumber(g,s);addHex(g,n,s);t.addCodespaceRange(s+1,hexToInt(n,s),hexToInt(g,s))}break;case 1:a.readHex(n,s);a.readHexNumber(g,s);addHex(g,n,s);a.readNumber();for(let e=1;e<E;e++){incHex(g,s);a.readHexNumber(n,s);addHex(n,g,s);a.readHexNumber(g,s);addHex(g,n,s);a.readNumber()}break;case 2:a.readHex(o,s);h=a.readNumber();t.mapOne(hexToInt(o,s),h);for(let e=1;e<E;e++){incHex(o,s);if(!i){a.readHexNumber(C,s);addHex(o,C,s)}h=a.readSigned()+(h+1);t.mapOne(hexToInt(o,s),h)}break;case 3:a.readHex(n,s);a.readHexNumber(g,s);addHex(g,n,s);h=a.readNumber();t.mapCidRange(hexToInt(n,s),hexToInt(g,s),h);for(let e=1;e<E;e++){incHex(g,s);if(i)n.set(g);else{a.readHexNumber(n,s);addHex(n,g,s)}a.readHexNumber(g,s);addHex(g,n,s);h=a.readNumber();t.mapCidRange(hexToInt(n,s),hexToInt(g,s),h)}break;case 4:a.readHex(o,Q);a.readHex(c,s);t.mapOne(hexToInt(o,Q),hexToStr(c,s));for(let e=1;e<E;e++){incHex(o,Q);if(!i){a.readHexNumber(C,Q);addHex(o,C,Q)}incHex(c,s);a.readHexSigned(C,s);addHex(c,C,s);t.mapOne(hexToInt(o,Q),hexToStr(c,s))}break;case 5:a.readHex(n,Q);a.readHexNumber(g,Q);addHex(g,n,Q);a.readHex(c,s);t.mapBfRange(hexToInt(n,Q),hexToInt(g,Q),hexToStr(c,s));for(let e=1;e<E;e++){incHex(g,Q);if(i)n.set(g);else{a.readHexNumber(n,Q);addHex(n,g,Q)}a.readHexNumber(g,Q);addHex(g,n,Q);a.readHex(c,s);t.mapBfRange(hexToInt(n,Q),hexToInt(g,Q),hexToStr(c,s))}break;default:throw new Error(`BinaryCMapReader.process - unknown type: ${e}`)}}return r?i(r):t}}const Rt=new Uint8Array(0);class DecodeStream extends BaseStream{constructor(e){super();this._rawMinBufferLength=e||0;this.pos=0;this.bufferLength=0;this.eof=!1;this.buffer=Rt;this.minBufferLength=512;if(e)for(;this.minBufferLength<e;)this.minBufferLength*=2}get isEmpty(){for(;!this.eof&&0===this.bufferLength;)this.readBlock();return 0===this.bufferLength}ensureBuffer(e){const t=this.buffer;if(e<=t.byteLength)return t;let i=this.minBufferLength;for(;i<e;)i*=2;const a=new Uint8Array(i);a.set(t);return this.buffer=a}getByte(){const e=this.pos;for(;this.bufferLength<=e;){if(this.eof)return-1;this.readBlock()}return this.buffer[this.pos++]}getBytes(e,t=null){const i=this.pos;let a;if(e){this.ensureBuffer(i+e);a=i+e;for(;!this.eof&&this.bufferLength<a;)this.readBlock(t);const s=this.bufferLength;a>s&&(a=s)}else{for(;!this.eof;)this.readBlock(t);a=this.bufferLength}this.pos=a;return this.buffer.subarray(i,a)}async getImageData(e,t=null){if(!this.canAsyncDecodeImageFromBuffer)return this.getBytes(e,t);const i=await this.stream.asyncGetBytes();return this.decodeImage(i,t)}reset(){this.pos=0}makeSubStream(e,t,i=null){if(void 0===t)for(;!this.eof;)this.readBlock();else{const i=e+t;for(;this.bufferLength<=i&&!this.eof;)this.readBlock()}return new Stream(this.buffer,e,t,i)}getBaseStreams(){return this.str?this.str.getBaseStreams():null}}class StreamsSequenceStream extends DecodeStream{constructor(e,t=null){let i=0;for(const t of e)i+=t instanceof DecodeStream?t._rawMinBufferLength:t.length;super(i);this.streams=e;this._onError=t}readBlock(){const e=this.streams;if(0===e.length){this.eof=!0;return}const t=e.shift();let i;try{i=t.getBytes()}catch(e){if(this._onError){this._onError(e,t.dict?.objId);return}throw e}const a=this.bufferLength,s=a+i.length;this.ensureBuffer(s).set(i,a);this.bufferLength=s}getBaseStreams(){const e=[];for(const t of this.streams){const i=t.getBaseStreams();i&&e.push(...i)}return e.length>0?e:null}}class Ascii85Stream extends DecodeStream{constructor(e,t){t&&(t*=.8);super(t);this.str=e;this.dict=e.dict;this.input=new Uint8Array(5)}readBlock(){const e=this.str;let t=e.getByte();for(;isWhiteSpace(t);)t=e.getByte();if(-1===t||126===t){this.eof=!0;return}const i=this.bufferLength;let a,s;if(122===t){a=this.ensureBuffer(i+4);for(s=0;s<4;++s)a[i+s]=0;this.bufferLength+=4}else{const r=this.input;r[0]=t;for(s=1;s<5;++s){t=e.getByte();for(;isWhiteSpace(t);)t=e.getByte();r[s]=t;if(-1===t||126===t)break}a=this.ensureBuffer(i+s-1);this.bufferLength+=s-1;if(s<5){for(;s<5;++s)r[s]=117;this.eof=!0}let n=0;for(s=0;s<5;++s)n=85*n+(r[s]-33);for(s=3;s>=0;--s){a[i+s]=255&n;n>>=8}}}}class AsciiHexStream extends DecodeStream{constructor(e,t){t&&(t*=.5);super(t);this.str=e;this.dict=e.dict;this.firstDigit=-1}readBlock(){const e=this.str.getBytes(8e3);if(!e.length){this.eof=!0;return}const t=e.length+1>>1,i=this.ensureBuffer(this.bufferLength+t);let a=this.bufferLength,s=this.firstDigit;for(const t of e){let e;if(t>=48&&t<=57)e=15&t;else{if(!(t>=65&&t<=70||t>=97&&t<=102)){if(62===t){this.eof=!0;break}continue}e=9+(15&t)}if(s<0)s=e;else{i[a++]=s<<4|e;s=-1}}if(s>=0&&this.eof){i[a++]=s<<4;s=-1}this.firstDigit=s;this.bufferLength=a}}const Nt=-1,Gt=[[-1,-1],[-1,-1],[7,8],[7,7],[6,6],[6,6],[6,5],[6,5],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2]],xt=[[-1,-1],[12,-2],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[11,1792],[11,1792],[12,1984],[12,2048],[12,2112],[12,2176],[12,2240],[12,2304],[11,1856],[11,1856],[11,1920],[11,1920],[12,2368],[12,2432],[12,2496],[12,2560]],Ut=[[-1,-1],[-1,-1],[-1,-1],[-1,-1],[8,29],[8,29],[8,30],[8,30],[8,45],[8,45],[8,46],[8,46],[7,22],[7,22],[7,22],[7,22],[7,23],[7,23],[7,23],[7,23],[8,47],[8,47],[8,48],[8,48],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[7,20],[7,20],[7,20],[7,20],[8,33],[8,33],[8,34],[8,34],[8,35],[8,35],[8,36],[8,36],[8,37],[8,37],[8,38],[8,38],[7,19],[7,19],[7,19],[7,19],[8,31],[8,31],[8,32],[8,32],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[8,53],[8,53],[8,54],[8,54],[7,26],[7,26],[7,26],[7,26],[8,39],[8,39],[8,40],[8,40],[8,41],[8,41],[8,42],[8,42],[8,43],[8,43],[8,44],[8,44],[7,21],[7,21],[7,21],[7,21],[7,28],[7,28],[7,28],[7,28],[8,61],[8,61],[8,62],[8,62],[8,63],[8,63],[8,0],[8,0],[8,320],[8,320],[8,384],[8,384],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[7,27],[7,27],[7,27],[7,27],[8,59],[8,59],[8,60],[8,60],[9,1472],[9,1536],[9,1600],[9,1728],[7,18],[7,18],[7,18],[7,18],[7,24],[7,24],[7,24],[7,24],[8,49],[8,49],[8,50],[8,50],[8,51],[8,51],[8,52],[8,52],[7,25],[7,25],[7,25],[7,25],[8,55],[8,55],[8,56],[8,56],[8,57],[8,57],[8,58],[8,58],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[8,448],[8,448],[8,512],[8,512],[9,704],[9,768],[8,640],[8,640],[8,576],[8,576],[9,832],[9,896],[9,960],[9,1024],[9,1088],[9,1152],[9,1216],[9,1280],[9,1344],[9,1408],[7,256],[7,256],[7,256],[7,256],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[6,16],[6,16],[6,16],[6,16],[6,16],[6,16],[6,16],[6,16],[6,17],[6,17],[6,17],[6,17],[6,17],[6,17],[6,17],[6,17],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[6,14],[6,14],[6,14],[6,14],[6,14],[6,14],[6,14],[6,14],[6,15],[6,15],[6,15],[6,15],[6,15],[6,15],[6,15],[6,15],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7]],Mt=[[-1,-1],[-1,-1],[12,-2],[12,-2],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[11,1792],[11,1792],[11,1792],[11,1792],[12,1984],[12,1984],[12,2048],[12,2048],[12,2112],[12,2112],[12,2176],[12,2176],[12,2240],[12,2240],[12,2304],[12,2304],[11,1856],[11,1856],[11,1856],[11,1856],[11,1920],[11,1920],[11,1920],[11,1920],[12,2368],[12,2368],[12,2432],[12,2432],[12,2496],[12,2496],[12,2560],[12,2560],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[12,52],[12,52],[13,640],[13,704],[13,768],[13,832],[12,55],[12,55],[12,56],[12,56],[13,1280],[13,1344],[13,1408],[13,1472],[12,59],[12,59],[12,60],[12,60],[13,1536],[13,1600],[11,24],[11,24],[11,24],[11,24],[11,25],[11,25],[11,25],[11,25],[13,1664],[13,1728],[12,320],[12,320],[12,384],[12,384],[12,448],[12,448],[13,512],[13,576],[12,53],[12,53],[12,54],[12,54],[13,896],[13,960],[13,1024],[13,1088],[13,1152],[13,1216],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64]],Lt=[[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[11,23],[11,23],[12,50],[12,51],[12,44],[12,45],[12,46],[12,47],[12,57],[12,58],[12,61],[12,256],[10,16],[10,16],[10,16],[10,16],[10,17],[10,17],[10,17],[10,17],[12,48],[12,49],[12,62],[12,63],[12,30],[12,31],[12,32],[12,33],[12,40],[12,41],[11,22],[11,22],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[12,128],[12,192],[12,26],[12,27],[12,28],[12,29],[11,19],[11,19],[11,20],[11,20],[12,34],[12,35],[12,36],[12,37],[12,38],[12,39],[11,21],[11,21],[12,42],[12,43],[10,0],[10,0],[10,0],[10,0],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12]],Ht=[[-1,-1],[-1,-1],[-1,-1],[-1,-1],[6,9],[6,8],[5,7],[5,7],[4,6],[4,6],[4,6],[4,6],[4,5],[4,5],[4,5],[4,5],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2]];class CCITTFaxDecoder{constructor(e,t={}){if(!e||"function"!=typeof e.next)throw new Error('CCITTFaxDecoder - invalid "source" parameter.');this.source=e;this.eof=!1;this.encoding=t.K||0;this.eoline=t.EndOfLine||!1;this.byteAlign=t.EncodedByteAlign||!1;this.columns=t.Columns||1728;this.rows=t.Rows||0;this.eoblock=t.EndOfBlock??!0;this.black=t.BlackIs1||!1;this.codingLine=new Uint32Array(this.columns+1);this.refLine=new Uint32Array(this.columns+2);this.codingLine[0]=this.columns;this.codingPos=0;this.row=0;this.nextLine2D=this.encoding<0;this.inputBits=0;this.inputBuf=0;this.outputBits=0;this.rowsDone=!1;let i;for(;0===(i=this._lookBits(12));)this._eatBits(1);1===i&&this._eatBits(12);if(this.encoding>0){this.nextLine2D=!this._lookBits(1);this._eatBits(1)}}readNextChar(){if(this.eof)return-1;const e=this.refLine,t=this.codingLine,i=this.columns;let a,s,r,n,g;if(0===this.outputBits){this.rowsDone&&(this.eof=!0);if(this.eof)return-1;this.err=!1;let r,g,o;if(this.nextLine2D){for(n=0;t[n]<i;++n)e[n]=t[n];e[n++]=i;e[n]=i;t[0]=0;this.codingPos=0;a=0;s=0;for(;t[this.codingPos]<i;){r=this._getTwoDimCode();switch(r){case 0:this._addPixels(e[a+1],s);e[a+1]<i&&(a+=2);break;case 1:r=g=0;if(s){do{r+=o=this._getBlackCode()}while(o>=64);do{g+=o=this._getWhiteCode()}while(o>=64)}else{do{r+=o=this._getWhiteCode()}while(o>=64);do{g+=o=this._getBlackCode()}while(o>=64)}this._addPixels(t[this.codingPos]+r,s);t[this.codingPos]<i&&this._addPixels(t[this.codingPos]+g,1^s);for(;e[a]<=t[this.codingPos]&&e[a]<i;)a+=2;break;case 7:this._addPixels(e[a]+3,s);s^=1;if(t[this.codingPos]<i){++a;for(;e[a]<=t[this.codingPos]&&e[a]<i;)a+=2}break;case 5:this._addPixels(e[a]+2,s);s^=1;if(t[this.codingPos]<i){++a;for(;e[a]<=t[this.codingPos]&&e[a]<i;)a+=2}break;case 3:this._addPixels(e[a]+1,s);s^=1;if(t[this.codingPos]<i){++a;for(;e[a]<=t[this.codingPos]&&e[a]<i;)a+=2}break;case 2:this._addPixels(e[a],s);s^=1;if(t[this.codingPos]<i){++a;for(;e[a]<=t[this.codingPos]&&e[a]<i;)a+=2}break;case 8:this._addPixelsNeg(e[a]-3,s);s^=1;if(t[this.codingPos]<i){a>0?--a:++a;for(;e[a]<=t[this.codingPos]&&e[a]<i;)a+=2}break;case 6:this._addPixelsNeg(e[a]-2,s);s^=1;if(t[this.codingPos]<i){a>0?--a:++a;for(;e[a]<=t[this.codingPos]&&e[a]<i;)a+=2}break;case 4:this._addPixelsNeg(e[a]-1,s);s^=1;if(t[this.codingPos]<i){a>0?--a:++a;for(;e[a]<=t[this.codingPos]&&e[a]<i;)a+=2}break;case Nt:this._addPixels(i,0);this.eof=!0;break;default:info("bad 2d code");this._addPixels(i,0);this.err=!0}}}else{t[0]=0;this.codingPos=0;s=0;for(;t[this.codingPos]<i;){r=0;if(s)do{r+=o=this._getBlackCode()}while(o>=64);else do{r+=o=this._getWhiteCode()}while(o>=64);this._addPixels(t[this.codingPos]+r,s);s^=1}}let c=!1;this.byteAlign&&(this.inputBits&=-8);if(this.eoblock||this.row!==this.rows-1){r=this._lookBits(12);if(this.eoline)for(;r!==Nt&&1!==r;){this._eatBits(1);r=this._lookBits(12)}else for(;0===r;){this._eatBits(1);r=this._lookBits(12)}if(1===r){this._eatBits(12);c=!0}else r===Nt&&(this.eof=!0)}else this.rowsDone=!0;if(!this.eof&&this.encoding>0&&!this.rowsDone){this.nextLine2D=!this._lookBits(1);this._eatBits(1)}if(this.eoblock&&c&&this.byteAlign){r=this._lookBits(12);if(1===r){this._eatBits(12);if(this.encoding>0){this._lookBits(1);this._eatBits(1)}if(this.encoding>=0)for(n=0;n<4;++n){r=this._lookBits(12);1!==r&&info("bad rtc code: "+r);this._eatBits(12);if(this.encoding>0){this._lookBits(1);this._eatBits(1)}}this.eof=!0}}else if(this.err&&this.eoline){for(;;){r=this._lookBits(13);if(r===Nt){this.eof=!0;return-1}if(r>>1==1)break;this._eatBits(1)}this._eatBits(12);if(this.encoding>0){this._eatBits(1);this.nextLine2D=!(1&r)}}this.outputBits=t[0]>0?t[this.codingPos=0]:t[this.codingPos=1];this.row++}if(this.outputBits>=8){g=1&this.codingPos?0:255;this.outputBits-=8;if(0===this.outputBits&&t[this.codingPos]<i){this.codingPos++;this.outputBits=t[this.codingPos]-t[this.codingPos-1]}}else{r=8;g=0;do{if("number"!=typeof this.outputBits)throw new FormatError('Invalid /CCITTFaxDecode data, "outputBits" must be a number.');if(this.outputBits>r){g<<=r;1&this.codingPos||(g|=255>>8-r);this.outputBits-=r;r=0}else{g<<=this.outputBits;1&this.codingPos||(g|=255>>8-this.outputBits);r-=this.outputBits;this.outputBits=0;if(t[this.codingPos]<i){this.codingPos++;this.outputBits=t[this.codingPos]-t[this.codingPos-1]}else if(r>0){g<<=r;r=0}}}while(r)}this.black&&(g^=255);return g}_addPixels(e,t){const i=this.codingLine;let a=this.codingPos;if(e>i[a]){if(e>this.columns){info("row is wrong length");this.err=!0;e=this.columns}1&a^t&&++a;i[a]=e}this.codingPos=a}_addPixelsNeg(e,t){const i=this.codingLine;let a=this.codingPos;if(e>i[a]){if(e>this.columns){info("row is wrong length");this.err=!0;e=this.columns}1&a^t&&++a;i[a]=e}else if(e<i[a]){if(e<0){info("invalid code");this.err=!0;e=0}for(;a>0&&e<i[a-1];)--a;i[a]=e}this.codingPos=a}_findTableCode(e,t,i,a){const s=a||0;for(let a=e;a<=t;++a){let e=this._lookBits(a);if(e===Nt)return[!0,1,!1];a<t&&(e<<=t-a);if(!s||e>=s){const t=i[e-s];if(t[0]===a){this._eatBits(a);return[!0,t[1],!0]}}}return[!1,0,!1]}_getTwoDimCode(){let e,t=0;if(this.eoblock){t=this._lookBits(7);e=Gt[t];if(e?.[0]>0){this._eatBits(e[0]);return e[1]}}else{const e=this._findTableCode(1,7,Gt);if(e[0]&&e[2])return e[1]}info("Bad two dim code");return Nt}_getWhiteCode(){let e,t=0;if(this.eoblock){t=this._lookBits(12);if(t===Nt)return 1;e=t>>5==0?xt[t]:Ut[t>>3];if(e[0]>0){this._eatBits(e[0]);return e[1]}}else{let e=this._findTableCode(1,9,Ut);if(e[0])return e[1];e=this._findTableCode(11,12,xt);if(e[0])return e[1]}info("bad white code");this._eatBits(1);return 1}_getBlackCode(){let e,t;if(this.eoblock){e=this._lookBits(13);if(e===Nt)return 1;t=e>>7==0?Mt[e]:e>>9==0&&e>>7!=0?Lt[(e>>1)-64]:Ht[e>>7];if(t[0]>0){this._eatBits(t[0]);return t[1]}}else{let e=this._findTableCode(2,6,Ht);if(e[0])return e[1];e=this._findTableCode(7,12,Lt,64);if(e[0])return e[1];e=this._findTableCode(10,13,Mt);if(e[0])return e[1]}info("bad black code");this._eatBits(1);return 1}_lookBits(e){let t;for(;this.inputBits<e;){if(-1===(t=this.source.next()))return 0===this.inputBits?Nt:this.inputBuf<<e-this.inputBits&65535>>16-e;this.inputBuf=this.inputBuf<<8|t;this.inputBits+=8}return this.inputBuf>>this.inputBits-e&65535>>16-e}_eatBits(e){(this.inputBits-=e)<0&&(this.inputBits=0)}}class CCITTFaxStream extends DecodeStream{constructor(e,t,i){super(t);this.str=e;this.dict=e.dict;i instanceof Dict||(i=Dict.empty);const a={next:()=>e.getByte()};this.ccittFaxDecoder=new CCITTFaxDecoder(a,{K:i.get("K"),EndOfLine:i.get("EndOfLine"),EncodedByteAlign:i.get("EncodedByteAlign"),Columns:i.get("Columns"),Rows:i.get("Rows"),EndOfBlock:i.get("EndOfBlock"),BlackIs1:i.get("BlackIs1")})}readBlock(){for(;!this.eof;){const e=this.ccittFaxDecoder.readNextChar();if(-1===e){this.eof=!0;return}this.ensureBuffer(this.bufferLength+1);this.buffer[this.bufferLength++]=e}}}const Jt=new Int32Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Yt=new Int32Array([3,4,5,6,7,8,9,10,65547,65549,65551,65553,131091,131095,131099,131103,196643,196651,196659,196667,262211,262227,262243,262259,327811,327843,327875,327907,258,258,258]),vt=new Int32Array([1,2,3,4,65541,65543,131081,131085,196625,196633,262177,262193,327745,327777,393345,393409,459009,459137,524801,525057,590849,591361,657409,658433,724993,727041,794625,798721,868353,876545]),Kt=[new Int32Array([459008,524368,524304,524568,459024,524400,524336,590016,459016,524384,524320,589984,524288,524416,524352,590048,459012,524376,524312,589968,459028,524408,524344,590032,459020,524392,524328,59e4,524296,524424,524360,590064,459010,524372,524308,524572,459026,524404,524340,590024,459018,524388,524324,589992,524292,524420,524356,590056,459014,524380,524316,589976,459030,524412,524348,590040,459022,524396,524332,590008,524300,524428,524364,590072,459009,524370,524306,524570,459025,524402,524338,590020,459017,524386,524322,589988,524290,524418,524354,590052,459013,524378,524314,589972,459029,524410,524346,590036,459021,524394,524330,590004,524298,524426,524362,590068,459011,524374,524310,524574,459027,524406,524342,590028,459019,524390,524326,589996,524294,524422,524358,590060,459015,524382,524318,589980,459031,524414,524350,590044,459023,524398,524334,590012,524302,524430,524366,590076,459008,524369,524305,524569,459024,524401,524337,590018,459016,524385,524321,589986,524289,524417,524353,590050,459012,524377,524313,589970,459028,524409,524345,590034,459020,524393,524329,590002,524297,524425,524361,590066,459010,524373,524309,524573,459026,524405,524341,590026,459018,524389,524325,589994,524293,524421,524357,590058,459014,524381,524317,589978,459030,524413,524349,590042,459022,524397,524333,590010,524301,524429,524365,590074,459009,524371,524307,524571,459025,524403,524339,590022,459017,524387,524323,589990,524291,524419,524355,590054,459013,524379,524315,589974,459029,524411,524347,590038,459021,524395,524331,590006,524299,524427,524363,590070,459011,524375,524311,524575,459027,524407,524343,590030,459019,524391,524327,589998,524295,524423,524359,590062,459015,524383,524319,589982,459031,524415,524351,590046,459023,524399,524335,590014,524303,524431,524367,590078,459008,524368,524304,524568,459024,524400,524336,590017,459016,524384,524320,589985,524288,524416,524352,590049,459012,524376,524312,589969,459028,524408,524344,590033,459020,524392,524328,590001,524296,524424,524360,590065,459010,524372,524308,524572,459026,524404,524340,590025,459018,524388,524324,589993,524292,524420,524356,590057,459014,524380,524316,589977,459030,524412,524348,590041,459022,524396,524332,590009,524300,524428,524364,590073,459009,524370,524306,524570,459025,524402,524338,590021,459017,524386,524322,589989,524290,524418,524354,590053,459013,524378,524314,589973,459029,524410,524346,590037,459021,524394,524330,590005,524298,524426,524362,590069,459011,524374,524310,524574,459027,524406,524342,590029,459019,524390,524326,589997,524294,524422,524358,590061,459015,524382,524318,589981,459031,524414,524350,590045,459023,524398,524334,590013,524302,524430,524366,590077,459008,524369,524305,524569,459024,524401,524337,590019,459016,524385,524321,589987,524289,524417,524353,590051,459012,524377,524313,589971,459028,524409,524345,590035,459020,524393,524329,590003,524297,524425,524361,590067,459010,524373,524309,524573,459026,524405,524341,590027,459018,524389,524325,589995,524293,524421,524357,590059,459014,524381,524317,589979,459030,524413,524349,590043,459022,524397,524333,590011,524301,524429,524365,590075,459009,524371,524307,524571,459025,524403,524339,590023,459017,524387,524323,589991,524291,524419,524355,590055,459013,524379,524315,589975,459029,524411,524347,590039,459021,524395,524331,590007,524299,524427,524363,590071,459011,524375,524311,524575,459027,524407,524343,590031,459019,524391,524327,589999,524295,524423,524359,590063,459015,524383,524319,589983,459031,524415,524351,590047,459023,524399,524335,590015,524303,524431,524367,590079]),9],Tt=[new Int32Array([327680,327696,327688,327704,327684,327700,327692,327708,327682,327698,327690,327706,327686,327702,327694,0,327681,327697,327689,327705,327685,327701,327693,327709,327683,327699,327691,327707,327687,327703,327695,0]),5];class FlateStream extends DecodeStream{constructor(e,t){super(t);this.str=e;this.dict=e.dict;const i=e.getByte(),a=e.getByte();if(-1===i||-1===a)throw new FormatError(`Invalid header in flate stream: ${i}, ${a}`);if(8!=(15&i))throw new FormatError(`Unknown compression method in flate stream: ${i}, ${a}`);if(((i<<8)+a)%31!=0)throw new FormatError(`Bad FCHECK in flate stream: ${i}, ${a}`);if(32&a)throw new FormatError(`FDICT bit set in flate stream: ${i}, ${a}`);this.codeSize=0;this.codeBuf=0}async getImageData(e,t){const i=await this.asyncGetBytes();return i?.subarray(0,e)||this.getBytes(e)}async asyncGetBytes(){this.str.reset();const e=this.str.getBytes();try{const{readable:t,writable:i}=new DecompressionStream("deflate"),a=i.getWriter();a.write(e);a.close();const s=[];let r=0;for await(const e of t){s.push(e);r+=e.byteLength}const n=new Uint8Array(r);let g=0;for(const e of s){n.set(e,g);g+=e.byteLength}return n}catch{this.str=new Stream(e,2,e.length,this.str.dict);this.reset();return null}}get isAsync(){return!0}getBits(e){const t=this.str;let i,a=this.codeSize,s=this.codeBuf;for(;a<e;){if(-1===(i=t.getByte()))throw new FormatError("Bad encoding in flate stream");s|=i<<a;a+=8}i=s&(1<<e)-1;this.codeBuf=s>>e;this.codeSize=a-=e;return i}getCode(e){const t=this.str,i=e[0],a=e[1];let s,r=this.codeSize,n=this.codeBuf;for(;r<a&&-1!==(s=t.getByte());){n|=s<<r;r+=8}const g=i[n&(1<<a)-1],o=g>>16,c=65535&g;if(o<1||r<o)throw new FormatError("Bad encoding in flate stream");this.codeBuf=n>>o;this.codeSize=r-o;return c}generateHuffmanTable(e){const t=e.length;let i,a=0;for(i=0;i<t;++i)e[i]>a&&(a=e[i]);const s=1<<a,r=new Int32Array(s);for(let n=1,g=0,o=2;n<=a;++n,g<<=1,o<<=1)for(let a=0;a<t;++a)if(e[a]===n){let e=0,t=g;for(i=0;i<n;++i){e=e<<1|1&t;t>>=1}for(i=e;i<s;i+=o)r[i]=n<<16|a;++g}return[r,a]}#m(e){info(e);this.eof=!0}readBlock(){let e,t,i;const a=this.str;try{t=this.getBits(3)}catch(e){this.#m(e.message);return}1&t&&(this.eof=!0);t>>=1;if(0===t){let t;if(-1===(t=a.getByte())){this.#m("Bad block header in flate stream");return}let i=t;if(-1===(t=a.getByte())){this.#m("Bad block header in flate stream");return}i|=t<<8;if(-1===(t=a.getByte())){this.#m("Bad block header in flate stream");return}let s=t;if(-1===(t=a.getByte())){this.#m("Bad block header in flate stream");return}s|=t<<8;if(s!==(65535&~i)&&(0!==i||0!==s))throw new FormatError("Bad uncompressed block length in flate stream");this.codeBuf=0;this.codeSize=0;const r=this.bufferLength,n=r+i;e=this.ensureBuffer(n);this.bufferLength=n;if(0===i)-1===a.peekByte()&&(this.eof=!0);else{const t=a.getBytes(i);e.set(t,r);t.length<i&&(this.eof=!0)}return}let s,r;if(1===t){s=Kt;r=Tt}else{if(2!==t)throw new FormatError("Unknown block type in flate stream");{const e=this.getBits(5)+257,t=this.getBits(5)+1,a=this.getBits(4)+4,n=new Uint8Array(Jt.length);let g;for(g=0;g<a;++g)n[Jt[g]]=this.getBits(3);const o=this.generateHuffmanTable(n);i=0;g=0;const c=e+t,C=new Uint8Array(c);let h,l,Q;for(;g<c;){const e=this.getCode(o);if(16===e){h=2;l=3;Q=i}else if(17===e){h=3;l=3;Q=i=0}else{if(18!==e){C[g++]=i=e;continue}h=7;l=11;Q=i=0}let t=this.getBits(h)+l;for(;t-- >0;)C[g++]=Q}s=this.generateHuffmanTable(C.subarray(0,e));r=this.generateHuffmanTable(C.subarray(e,c))}}e=this.buffer;let n=e?e.length:0,g=this.bufferLength;for(;;){let t=this.getCode(s);if(t<256){if(g+1>=n){e=this.ensureBuffer(g+1);n=e.length}e[g++]=t;continue}if(256===t){this.bufferLength=g;return}t-=257;t=Yt[t];let a=t>>16;a>0&&(a=this.getBits(a));i=(65535&t)+a;t=this.getCode(r);t=vt[t];a=t>>16;a>0&&(a=this.getBits(a));const o=(65535&t)+a;if(g+i>=n){e=this.ensureBuffer(g+i);n=e.length}for(let t=0;t<i;++t,++g)e[g]=e[g-o]}}}const qt=[{qe:22017,nmps:1,nlps:1,switchFlag:1},{qe:13313,nmps:2,nlps:6,switchFlag:0},{qe:6145,nmps:3,nlps:9,switchFlag:0},{qe:2753,nmps:4,nlps:12,switchFlag:0},{qe:1313,nmps:5,nlps:29,switchFlag:0},{qe:545,nmps:38,nlps:33,switchFlag:0},{qe:22017,nmps:7,nlps:6,switchFlag:1},{qe:21505,nmps:8,nlps:14,switchFlag:0},{qe:18433,nmps:9,nlps:14,switchFlag:0},{qe:14337,nmps:10,nlps:14,switchFlag:0},{qe:12289,nmps:11,nlps:17,switchFlag:0},{qe:9217,nmps:12,nlps:18,switchFlag:0},{qe:7169,nmps:13,nlps:20,switchFlag:0},{qe:5633,nmps:29,nlps:21,switchFlag:0},{qe:22017,nmps:15,nlps:14,switchFlag:1},{qe:21505,nmps:16,nlps:14,switchFlag:0},{qe:20737,nmps:17,nlps:15,switchFlag:0},{qe:18433,nmps:18,nlps:16,switchFlag:0},{qe:14337,nmps:19,nlps:17,switchFlag:0},{qe:13313,nmps:20,nlps:18,switchFlag:0},{qe:12289,nmps:21,nlps:19,switchFlag:0},{qe:10241,nmps:22,nlps:19,switchFlag:0},{qe:9217,nmps:23,nlps:20,switchFlag:0},{qe:8705,nmps:24,nlps:21,switchFlag:0},{qe:7169,nmps:25,nlps:22,switchFlag:0},{qe:6145,nmps:26,nlps:23,switchFlag:0},{qe:5633,nmps:27,nlps:24,switchFlag:0},{qe:5121,nmps:28,nlps:25,switchFlag:0},{qe:4609,nmps:29,nlps:26,switchFlag:0},{qe:4353,nmps:30,nlps:27,switchFlag:0},{qe:2753,nmps:31,nlps:28,switchFlag:0},{qe:2497,nmps:32,nlps:29,switchFlag:0},{qe:2209,nmps:33,nlps:30,switchFlag:0},{qe:1313,nmps:34,nlps:31,switchFlag:0},{qe:1089,nmps:35,nlps:32,switchFlag:0},{qe:673,nmps:36,nlps:33,switchFlag:0},{qe:545,nmps:37,nlps:34,switchFlag:0},{qe:321,nmps:38,nlps:35,switchFlag:0},{qe:273,nmps:39,nlps:36,switchFlag:0},{qe:133,nmps:40,nlps:37,switchFlag:0},{qe:73,nmps:41,nlps:38,switchFlag:0},{qe:37,nmps:42,nlps:39,switchFlag:0},{qe:21,nmps:43,nlps:40,switchFlag:0},{qe:9,nmps:44,nlps:41,switchFlag:0},{qe:5,nmps:45,nlps:42,switchFlag:0},{qe:1,nmps:45,nlps:43,switchFlag:0},{qe:22017,nmps:46,nlps:46,switchFlag:0}];class ArithmeticDecoder{constructor(e,t,i){this.data=e;this.bp=t;this.dataEnd=i;this.chigh=e[t];this.clow=0;this.byteIn();this.chigh=this.chigh<<7&65535|this.clow>>9&127;this.clow=this.clow<<7&65535;this.ct-=7;this.a=32768}byteIn(){const e=this.data;let t=this.bp;if(255===e[t])if(e[t+1]>143){this.clow+=65280;this.ct=8}else{t++;this.clow+=e[t]<<9;this.ct=7;this.bp=t}else{t++;this.clow+=t<this.dataEnd?e[t]<<8:65280;this.ct=8;this.bp=t}if(this.clow>65535){this.chigh+=this.clow>>16;this.clow&=65535}}readBit(e,t){let i=e[t]>>1,a=1&e[t];const s=qt[i],r=s.qe;let n,g=this.a-r;if(this.chigh<r)if(g<r){g=r;n=a;i=s.nmps}else{g=r;n=1^a;1===s.switchFlag&&(a=n);i=s.nlps}else{this.chigh-=r;if(0!=(32768&g)){this.a=g;return a}if(g<r){n=1^a;1===s.switchFlag&&(a=n);i=s.nlps}else{n=a;i=s.nmps}}do{0===this.ct&&this.byteIn();g<<=1;this.chigh=this.chigh<<1&65535|this.clow>>15&1;this.clow=this.clow<<1&65535;this.ct--}while(0==(32768&g));this.a=g;e[t]=i<<1|a;return n}}class Jbig2Error extends rt{constructor(e){super(e,"Jbig2Error")}}class ContextCache{getContexts(e){return e in this?this[e]:this[e]=new Int8Array(65536)}}class DecodingContext{constructor(e,t,i){this.data=e;this.start=t;this.end=i}get decoder(){return shadow(this,"decoder",new ArithmeticDecoder(this.data,this.start,this.end))}get contextCache(){return shadow(this,"contextCache",new ContextCache)}}const Ot=2**31-1,Pt=-(2**31);function decodeInteger(e,t,i){const a=e.getContexts(t);let s=1;function readBits(e){let t=0;for(let r=0;r<e;r++){const e=i.readBit(a,s);s=s<256?s<<1|e:511&(s<<1|e)|256;t=t<<1|e}return t>>>0}const r=readBits(1),n=readBits(1)?readBits(1)?readBits(1)?readBits(1)?readBits(1)?readBits(32)+4436:readBits(12)+340:readBits(8)+84:readBits(6)+20:readBits(4)+4:readBits(2);let g;0===r?g=n:n>0&&(g=-n);return g>=Pt&&g<=Ot?g:null}function decodeIAID(e,t,i){const a=e.getContexts("IAID");let s=1;for(let e=0;e<i;e++){s=s<<1|t.readBit(a,s)}return i<31?s&(1<<i)-1:2147483647&s}const Wt=["SymbolDictionary",null,null,null,"IntermediateTextRegion",null,"ImmediateTextRegion","ImmediateLosslessTextRegion",null,null,null,null,null,null,null,null,"PatternDictionary",null,null,null,"IntermediateHalftoneRegion",null,"ImmediateHalftoneRegion","ImmediateLosslessHalftoneRegion",null,null,null,null,null,null,null,null,null,null,null,null,"IntermediateGenericRegion",null,"ImmediateGenericRegion","ImmediateLosslessGenericRegion","IntermediateGenericRefinementRegion",null,"ImmediateGenericRefinementRegion","ImmediateLosslessGenericRefinementRegion",null,null,null,null,"PageInformation","EndOfPage","EndOfStripe","EndOfFile","Profiles","Tables",null,null,null,null,null,null,null,null,"Extension"],jt=[[{x:-1,y:-2},{x:0,y:-2},{x:1,y:-2},{x:-2,y:-1},{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:2,y:-1},{x:-4,y:0},{x:-3,y:0},{x:-2,y:0},{x:-1,y:0}],[{x:-1,y:-2},{x:0,y:-2},{x:1,y:-2},{x:2,y:-2},{x:-2,y:-1},{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:2,y:-1},{x:-3,y:0},{x:-2,y:0},{x:-1,y:0}],[{x:-1,y:-2},{x:0,y:-2},{x:1,y:-2},{x:-2,y:-1},{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-2,y:0},{x:-1,y:0}],[{x:-3,y:-1},{x:-2,y:-1},{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-4,y:0},{x:-3,y:0},{x:-2,y:0},{x:-1,y:0}]],Xt=[{coding:[{x:0,y:-1},{x:1,y:-1},{x:-1,y:0}],reference:[{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:0,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}]},{coding:[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0}],reference:[{x:0,y:-1},{x:-1,y:0},{x:0,y:0},{x:1,y:0},{x:0,y:1},{x:1,y:1}]}],Zt=[39717,1941,229,405],Vt=[32,8];function decodeBitmap(e,t,i,a,s,r,n,g){if(e){return decodeMMRBitmap(new Reader(g.data,g.start,g.end),t,i,!1)}if(0===a&&!r&&!s&&4===n.length&&3===n[0].x&&-1===n[0].y&&-3===n[1].x&&-1===n[1].y&&2===n[2].x&&-2===n[2].y&&-2===n[3].x&&-2===n[3].y)return function decodeBitmapTemplate0(e,t,i){const a=i.decoder,s=i.contextCache.getContexts("GB"),r=[];let n,g,o,c,C,h,l;for(g=0;g<t;g++){C=r[g]=new Uint8Array(e);h=g<1?C:r[g-1];l=g<2?C:r[g-2];n=l[0]<<13|l[1]<<12|l[2]<<11|h[0]<<7|h[1]<<6|h[2]<<5|h[3]<<4;for(o=0;o<e;o++){C[o]=c=a.readBit(s,n);n=(31735&n)<<1|(o+3<e?l[o+3]<<11:0)|(o+4<e?h[o+4]<<4:0)|c}}return r}(t,i,g);const o=!!r,c=jt[a].concat(n);c.sort((function(e,t){return e.y-t.y||e.x-t.x}));const C=c.length,h=new Int8Array(C),l=new Int8Array(C),Q=[];let E,u,d=0,f=0,p=0,m=0;for(u=0;u<C;u++){h[u]=c[u].x;l[u]=c[u].y;f=Math.min(f,c[u].x);p=Math.max(p,c[u].x);m=Math.min(m,c[u].y);u<C-1&&c[u].y===c[u+1].y&&c[u].x===c[u+1].x-1?d|=1<<C-1-u:Q.push(u)}const y=Q.length,w=new Int8Array(y),D=new Int8Array(y),b=new Uint16Array(y);for(E=0;E<y;E++){u=Q[E];w[E]=c[u].x;D[E]=c[u].y;b[E]=1<<C-1-u}const F=-f,S=-m,k=t-p,R=Zt[a];let N=new Uint8Array(t);const G=[],x=g.decoder,U=g.contextCache.getContexts("GB");let M,L,H,J,Y,v=0,K=0;for(let e=0;e<i;e++){if(s){v^=x.readBit(U,R);if(v){G.push(N);continue}}N=new Uint8Array(N);G.push(N);for(M=0;M<t;M++){if(o&&r[e][M]){N[M]=0;continue}if(M>=F&&M<k&&e>=S){K=K<<1&d;for(u=0;u<y;u++){L=e+D[u];H=M+w[u];J=G[L][H];if(J){J=b[u];K|=J}}}else{K=0;Y=C-1;for(u=0;u<C;u++,Y--){H=M+h[u];if(H>=0&&H<t){L=e+l[u];if(L>=0){J=G[L][H];J&&(K|=J<<Y)}}}}const i=x.readBit(U,K);N[M]=i}}return G}function decodeRefinement(e,t,i,a,s,r,n,g,o){let c=Xt[i].coding;0===i&&(c=c.concat([g[0]]));const C=c.length,h=new Int32Array(C),l=new Int32Array(C);let Q;for(Q=0;Q<C;Q++){h[Q]=c[Q].x;l[Q]=c[Q].y}let E=Xt[i].reference;0===i&&(E=E.concat([g[1]]));const u=E.length,d=new Int32Array(u),f=new Int32Array(u);for(Q=0;Q<u;Q++){d[Q]=E[Q].x;f[Q]=E[Q].y}const p=a[0].length,m=a.length,y=Vt[i],w=[],D=o.decoder,b=o.contextCache.getContexts("GR");let F=0;for(let i=0;i<t;i++){if(n){F^=D.readBit(b,y);if(F)throw new Jbig2Error("prediction is not supported")}const t=new Uint8Array(e);w.push(t);for(let n=0;n<e;n++){let g,o,c=0;for(Q=0;Q<C;Q++){g=i+l[Q];o=n+h[Q];g<0||o<0||o>=e?c<<=1:c=c<<1|w[g][o]}for(Q=0;Q<u;Q++){g=i+f[Q]-r;o=n+d[Q]-s;g<0||g>=m||o<0||o>=p?c<<=1:c=c<<1|a[g][o]}const E=D.readBit(b,c);t[n]=E}}return w}function decodeTextRegion(e,t,i,a,s,r,n,g,o,c,C,h,l,Q,E,u,d,f,p){if(e&&t)throw new Jbig2Error("refinement with Huffman is not supported");const m=[];let y,w;for(y=0;y<a;y++){w=new Uint8Array(i);if(s)for(let e=0;e<i;e++)w[e]=s;m.push(w)}const D=d.decoder,b=d.contextCache;let F=e?-Q.tableDeltaT.decode(p):-decodeInteger(b,"IADT",D),S=0;y=0;for(;y<r;){F+=e?Q.tableDeltaT.decode(p):decodeInteger(b,"IADT",D);S+=e?Q.tableFirstS.decode(p):decodeInteger(b,"IAFS",D);let a=S;for(;;){let s=0;n>1&&(s=e?p.readBits(f):decodeInteger(b,"IAIT",D));const r=n*F+s,S=e?Q.symbolIDTable.decode(p):decodeIAID(b,D,o),k=t&&(e?p.readBit():decodeInteger(b,"IARI",D));let R=g[S],N=R[0].length,G=R.length;if(k){const e=decodeInteger(b,"IARDW",D),t=decodeInteger(b,"IARDH",D);N+=e;G+=t;R=decodeRefinement(N,G,E,R,(e>>1)+decodeInteger(b,"IARDX",D),(t>>1)+decodeInteger(b,"IARDY",D),!1,u,d)}let x=0;c?1&h?x=G-1:a+=G-1:h>1?a+=N-1:x=N-1;const U=r-(1&h?0:G-1),M=a-(2&h?N-1:0);let L,H,J;if(c)for(L=0;L<G;L++){w=m[M+L];if(!w)continue;J=R[L];const e=Math.min(i-U,N);switch(l){case 0:for(H=0;H<e;H++)w[U+H]|=J[H];break;case 2:for(H=0;H<e;H++)w[U+H]^=J[H];break;default:throw new Jbig2Error(`operator ${l} is not supported`)}}else for(H=0;H<G;H++){w=m[U+H];if(w){J=R[H];switch(l){case 0:for(L=0;L<N;L++)w[M+L]|=J[L];break;case 2:for(L=0;L<N;L++)w[M+L]^=J[L];break;default:throw new Jbig2Error(`operator ${l} is not supported`)}}}y++;const Y=e?Q.tableDeltaS.decode(p):decodeInteger(b,"IADS",D);if(null===Y)break;a+=x+Y+C}}return m}function readSegmentHeader(e,t){const i={};i.number=readUint32(e,t);const a=e[t+4],s=63&a;if(!Wt[s])throw new Jbig2Error("invalid segment type: "+s);i.type=s;i.typeName=Wt[s];i.deferredNonRetain=!!(128&a);const r=!!(64&a),n=e[t+5];let g=n>>5&7;const o=[31&n];let c=t+6;if(7===n){g=536870911&readUint32(e,c-1);c+=3;let t=g+7>>3;o[0]=e[c++];for(;--t>0;)o.push(e[c++])}else if(5===n||6===n)throw new Jbig2Error("invalid referred-to flags");i.retainBits=o;let C=4;i.number<=256?C=1:i.number<=65536&&(C=2);const h=[];let l,Q;for(l=0;l<g;l++){let t;t=1===C?e[c]:2===C?readUint16(e,c):readUint32(e,c);h.push(t);c+=C}i.referredTo=h;if(r){i.pageAssociation=readUint32(e,c);c+=4}else i.pageAssociation=e[c++];i.length=readUint32(e,c);c+=4;if(4294967295===i.length){if(38!==s)throw new Jbig2Error("invalid unknown segment length");{const t=readRegionSegmentInformation(e,c),a=!!(1&e[c+zt]),s=6,r=new Uint8Array(s);if(!a){r[0]=255;r[1]=172}r[2]=t.height>>>24&255;r[3]=t.height>>16&255;r[4]=t.height>>8&255;r[5]=255&t.height;for(l=c,Q=e.length;l<Q;l++){let t=0;for(;t<s&&r[t]===e[l+t];)t++;if(t===s){i.length=l+s;break}}if(4294967295===i.length)throw new Jbig2Error("segment end was not found")}}i.headerEnd=c;return i}function readSegments(e,t,i,a){const s=[];let r=i;for(;r<a;){const i=readSegmentHeader(t,r);r=i.headerEnd;const a={header:i,data:t};if(!e.randomAccess){a.start=r;r+=i.length;a.end=r}s.push(a);if(51===i.type)break}if(e.randomAccess)for(let e=0,t=s.length;e<t;e++){s[e].start=r;r+=s[e].header.length;s[e].end=r}return s}function readRegionSegmentInformation(e,t){return{width:readUint32(e,t),height:readUint32(e,t+4),x:readUint32(e,t+8),y:readUint32(e,t+12),combinationOperator:7&e[t+16]}}const zt=17;function processSegment(e,t){const i=e.header,a=e.data,s=e.end;let r,n,g,o,c=e.start;switch(i.type){case 0:const e={},t=readUint16(a,c);e.huffman=!!(1&t);e.refinement=!!(2&t);e.huffmanDHSelector=t>>2&3;e.huffmanDWSelector=t>>4&3;e.bitmapSizeSelector=t>>6&1;e.aggregationInstancesSelector=t>>7&1;e.bitmapCodingContextUsed=!!(256&t);e.bitmapCodingContextRetained=!!(512&t);e.template=t>>10&3;e.refinementTemplate=t>>12&1;c+=2;if(!e.huffman){o=0===e.template?4:1;n=[];for(g=0;g<o;g++){n.push({x:readInt8(a,c),y:readInt8(a,c+1)});c+=2}e.at=n}if(e.refinement&&!e.refinementTemplate){n=[];for(g=0;g<2;g++){n.push({x:readInt8(a,c),y:readInt8(a,c+1)});c+=2}e.refinementAt=n}e.numberOfExportedSymbols=readUint32(a,c);c+=4;e.numberOfNewSymbols=readUint32(a,c);c+=4;r=[e,i.number,i.referredTo,a,c,s];break;case 6:case 7:const C={};C.info=readRegionSegmentInformation(a,c);c+=zt;const h=readUint16(a,c);c+=2;C.huffman=!!(1&h);C.refinement=!!(2&h);C.logStripSize=h>>2&3;C.stripSize=1<<C.logStripSize;C.referenceCorner=h>>4&3;C.transposed=!!(64&h);C.combinationOperator=h>>7&3;C.defaultPixelValue=h>>9&1;C.dsOffset=h<<17>>27;C.refinementTemplate=h>>15&1;if(C.huffman){const e=readUint16(a,c);c+=2;C.huffmanFS=3&e;C.huffmanDS=e>>2&3;C.huffmanDT=e>>4&3;C.huffmanRefinementDW=e>>6&3;C.huffmanRefinementDH=e>>8&3;C.huffmanRefinementDX=e>>10&3;C.huffmanRefinementDY=e>>12&3;C.huffmanRefinementSizeSelector=!!(16384&e)}if(C.refinement&&!C.refinementTemplate){n=[];for(g=0;g<2;g++){n.push({x:readInt8(a,c),y:readInt8(a,c+1)});c+=2}C.refinementAt=n}C.numberOfSymbolInstances=readUint32(a,c);c+=4;r=[C,i.referredTo,a,c,s];break;case 16:const l={},Q=a[c++];l.mmr=!!(1&Q);l.template=Q>>1&3;l.patternWidth=a[c++];l.patternHeight=a[c++];l.maxPatternIndex=readUint32(a,c);c+=4;r=[l,i.number,a,c,s];break;case 22:case 23:const E={};E.info=readRegionSegmentInformation(a,c);c+=zt;const u=a[c++];E.mmr=!!(1&u);E.template=u>>1&3;E.enableSkip=!!(8&u);E.combinationOperator=u>>4&7;E.defaultPixelValue=u>>7&1;E.gridWidth=readUint32(a,c);c+=4;E.gridHeight=readUint32(a,c);c+=4;E.gridOffsetX=4294967295&readUint32(a,c);c+=4;E.gridOffsetY=4294967295&readUint32(a,c);c+=4;E.gridVectorX=readUint16(a,c);c+=2;E.gridVectorY=readUint16(a,c);c+=2;r=[E,i.referredTo,a,c,s];break;case 38:case 39:const d={};d.info=readRegionSegmentInformation(a,c);c+=zt;const f=a[c++];d.mmr=!!(1&f);d.template=f>>1&3;d.prediction=!!(8&f);if(!d.mmr){o=0===d.template?4:1;n=[];for(g=0;g<o;g++){n.push({x:readInt8(a,c),y:readInt8(a,c+1)});c+=2}d.at=n}r=[d,a,c,s];break;case 48:const p={width:readUint32(a,c),height:readUint32(a,c+4),resolutionX:readUint32(a,c+8),resolutionY:readUint32(a,c+12)};4294967295===p.height&&delete p.height;const m=a[c+16];readUint16(a,c+17);p.lossless=!!(1&m);p.refinement=!!(2&m);p.defaultPixelValue=m>>2&1;p.combinationOperator=m>>3&3;p.requiresBuffer=!!(32&m);p.combinationOperatorOverride=!!(64&m);r=[p];break;case 49:case 50:case 51:case 62:break;case 53:r=[i.number,a,c,s];break;default:throw new Jbig2Error(`segment type ${i.typeName}(${i.type}) is not implemented`)}const C="on"+i.typeName;C in t&&t[C].apply(t,r)}function processSegments(e,t){for(let i=0,a=e.length;i<a;i++)processSegment(e[i],t)}class SimpleSegmentVisitor{onPageInformation(e){this.currentPageInfo=e;const t=e.width+7>>3,i=new Uint8ClampedArray(t*e.height);e.defaultPixelValue&&i.fill(255);this.buffer=i}drawBitmap(e,t){const i=this.currentPageInfo,a=e.width,s=e.height,r=i.width+7>>3,n=i.combinationOperatorOverride?e.combinationOperator:i.combinationOperator,g=this.buffer,o=128>>(7&e.x);let c,C,h,l,Q=e.y*r+(e.x>>3);switch(n){case 0:for(c=0;c<s;c++){h=o;l=Q;for(C=0;C<a;C++){t[c][C]&&(g[l]|=h);h>>=1;if(!h){h=128;l++}}Q+=r}break;case 2:for(c=0;c<s;c++){h=o;l=Q;for(C=0;C<a;C++){t[c][C]&&(g[l]^=h);h>>=1;if(!h){h=128;l++}}Q+=r}break;default:throw new Jbig2Error(`operator ${n} is not supported`)}}onImmediateGenericRegion(e,t,i,a){const s=e.info,r=new DecodingContext(t,i,a),n=decodeBitmap(e.mmr,s.width,s.height,e.template,e.prediction,null,e.at,r);this.drawBitmap(s,n)}onImmediateLosslessGenericRegion(){this.onImmediateGenericRegion(...arguments)}onSymbolDictionary(e,t,i,a,s,r){let n,g;if(e.huffman){n=function getSymbolDictionaryHuffmanTables(e,t,i){let a,s,r,n,g=0;switch(e.huffmanDHSelector){case 0:case 1:a=getStandardTable(e.huffmanDHSelector+4);break;case 3:a=getCustomHuffmanTable(g,t,i);g++;break;default:throw new Jbig2Error("invalid Huffman DH selector")}switch(e.huffmanDWSelector){case 0:case 1:s=getStandardTable(e.huffmanDWSelector+2);break;case 3:s=getCustomHuffmanTable(g,t,i);g++;break;default:throw new Jbig2Error("invalid Huffman DW selector")}if(e.bitmapSizeSelector){r=getCustomHuffmanTable(g,t,i);g++}else r=getStandardTable(1);n=e.aggregationInstancesSelector?getCustomHuffmanTable(g,t,i):getStandardTable(1);return{tableDeltaHeight:a,tableDeltaWidth:s,tableBitmapSize:r,tableAggregateInstances:n}}(e,i,this.customTables);g=new Reader(a,s,r)}let o=this.symbols;o||(this.symbols=o={});const c=[];for(const e of i){const t=o[e];t&&c.push(...t)}const C=new DecodingContext(a,s,r);o[t]=function decodeSymbolDictionary(e,t,i,a,s,r,n,g,o,c,C,h){if(e&&t)throw new Jbig2Error("symbol refinement with Huffman is not supported");const l=[];let Q=0,E=log2(i.length+a);const u=C.decoder,d=C.contextCache;let f,p;if(e){f=getStandardTable(1);p=[];E=Math.max(E,1)}for(;l.length<a;){Q+=e?r.tableDeltaHeight.decode(h):decodeInteger(d,"IADH",u);let a=0,s=0;const f=e?p.length:0;for(;;){const f=e?r.tableDeltaWidth.decode(h):decodeInteger(d,"IADW",u);if(null===f)break;a+=f;s+=a;let m;if(t){const s=decodeInteger(d,"IAAI",u);if(s>1)m=decodeTextRegion(e,t,a,Q,0,s,1,i.concat(l),E,0,0,1,0,r,o,c,C,0,h);else{const e=decodeIAID(d,u,E),t=decodeInteger(d,"IARDX",u),s=decodeInteger(d,"IARDY",u);m=decodeRefinement(a,Q,o,e<i.length?i[e]:l[e-i.length],t,s,!1,c,C)}l.push(m)}else if(e)p.push(a);else{m=decodeBitmap(!1,a,Q,n,!1,null,g,C);l.push(m)}}if(e&&!t){const e=r.tableBitmapSize.decode(h);h.byteAlign();let t;if(0===e)t=readUncompressedBitmap(h,s,Q);else{const i=h.end,a=h.position+e;h.end=a;t=decodeMMRBitmap(h,s,Q,!1);h.end=i;h.position=a}const i=p.length;if(f===i-1)l.push(t);else{let e,a,s,r,n,g=0;for(e=f;e<i;e++){r=p[e];s=g+r;n=[];for(a=0;a<Q;a++)n.push(t[a].subarray(g,s));l.push(n);g=s}}}}const m=[],y=[];let w,D,b=!1;const F=i.length+a;for(;y.length<F;){let t=e?f.decode(h):decodeInteger(d,"IAEX",u);for(;t--;)y.push(b);b=!b}for(w=0,D=i.length;w<D;w++)y[w]&&m.push(i[w]);for(let e=0;e<a;w++,e++)y[w]&&m.push(l[e]);return m}(e.huffman,e.refinement,c,e.numberOfNewSymbols,e.numberOfExportedSymbols,n,e.template,e.at,e.refinementTemplate,e.refinementAt,C,g)}onImmediateTextRegion(e,t,i,a,s){const r=e.info;let n,g;const o=this.symbols,c=[];for(const e of t){const t=o[e];t&&c.push(...t)}const C=log2(c.length);if(e.huffman){g=new Reader(i,a,s);n=function getTextRegionHuffmanTables(e,t,i,a,s){const r=[];for(let e=0;e<=34;e++){const t=s.readBits(4);r.push(new HuffmanLine([e,t,0,0]))}const n=new HuffmanTable(r,!1);r.length=0;for(let e=0;e<a;){const t=n.decode(s);if(t>=32){let i,a,n;switch(t){case 32:if(0===e)throw new Jbig2Error("no previous value in symbol ID table");a=s.readBits(2)+3;i=r[e-1].prefixLength;break;case 33:a=s.readBits(3)+3;i=0;break;case 34:a=s.readBits(7)+11;i=0;break;default:throw new Jbig2Error("invalid code length in symbol ID table")}for(n=0;n<a;n++){r.push(new HuffmanLine([e,i,0,0]));e++}}else{r.push(new HuffmanLine([e,t,0,0]));e++}}s.byteAlign();const g=new HuffmanTable(r,!1);let o,c,C,h=0;switch(e.huffmanFS){case 0:case 1:o=getStandardTable(e.huffmanFS+6);break;case 3:o=getCustomHuffmanTable(h,t,i);h++;break;default:throw new Jbig2Error("invalid Huffman FS selector")}switch(e.huffmanDS){case 0:case 1:case 2:c=getStandardTable(e.huffmanDS+8);break;case 3:c=getCustomHuffmanTable(h,t,i);h++;break;default:throw new Jbig2Error("invalid Huffman DS selector")}switch(e.huffmanDT){case 0:case 1:case 2:C=getStandardTable(e.huffmanDT+11);break;case 3:C=getCustomHuffmanTable(h,t,i);h++;break;default:throw new Jbig2Error("invalid Huffman DT selector")}if(e.refinement)throw new Jbig2Error("refinement with Huffman is not supported");return{symbolIDTable:g,tableFirstS:o,tableDeltaS:c,tableDeltaT:C}}(e,t,this.customTables,c.length,g)}const h=new DecodingContext(i,a,s),l=decodeTextRegion(e.huffman,e.refinement,r.width,r.height,e.defaultPixelValue,e.numberOfSymbolInstances,e.stripSize,c,C,e.transposed,e.dsOffset,e.referenceCorner,e.combinationOperator,n,e.refinementTemplate,e.refinementAt,h,e.logStripSize,g);this.drawBitmap(r,l)}onImmediateLosslessTextRegion(){this.onImmediateTextRegion(...arguments)}onPatternDictionary(e,t,i,a,s){let r=this.patterns;r||(this.patterns=r={});const n=new DecodingContext(i,a,s);r[t]=function decodePatternDictionary(e,t,i,a,s,r){const n=[];if(!e){n.push({x:-t,y:0});0===s&&n.push({x:-3,y:-1},{x:2,y:-2},{x:-2,y:-2})}const g=decodeBitmap(e,(a+1)*t,i,s,!1,null,n,r),o=[];for(let e=0;e<=a;e++){const a=[],s=t*e,r=s+t;for(let e=0;e<i;e++)a.push(g[e].subarray(s,r));o.push(a)}return o}(e.mmr,e.patternWidth,e.patternHeight,e.maxPatternIndex,e.template,n)}onImmediateHalftoneRegion(e,t,i,a,s){const r=this.patterns[t[0]],n=e.info,g=new DecodingContext(i,a,s),o=function decodeHalftoneRegion(e,t,i,a,s,r,n,g,o,c,C,h,l,Q,E){if(n)throw new Jbig2Error("skip is not supported");if(0!==g)throw new Jbig2Error(`operator "${g}" is not supported in halftone region`);const u=[];let d,f,p;for(d=0;d<s;d++){p=new Uint8Array(a);if(r)for(f=0;f<a;f++)p[f]=r;u.push(p)}const m=t.length,y=t[0],w=y[0].length,D=y.length,b=log2(m),F=[];if(!e){F.push({x:i<=1?3:2,y:-1});0===i&&F.push({x:-3,y:-1},{x:2,y:-2},{x:-2,y:-2})}const S=[];let k,R,N,G,x,U,M,L,H,J,Y;e&&(k=new Reader(E.data,E.start,E.end));for(d=b-1;d>=0;d--){R=e?decodeMMRBitmap(k,o,c,!0):decodeBitmap(!1,o,c,i,!1,null,F,E);S[d]=R}for(N=0;N<c;N++)for(G=0;G<o;G++){x=0;U=0;for(f=b-1;f>=0;f--){x^=S[f][N][G];U|=x<<f}M=t[U];L=C+N*Q+G*l>>8;H=h+N*l-G*Q>>8;if(L>=0&&L+w<=a&&H>=0&&H+D<=s)for(d=0;d<D;d++){Y=u[H+d];J=M[d];for(f=0;f<w;f++)Y[L+f]|=J[f]}else{let e,t;for(d=0;d<D;d++){t=H+d;if(!(t<0||t>=s)){Y=u[t];J=M[d];for(f=0;f<w;f++){e=L+f;e>=0&&e<a&&(Y[e]|=J[f])}}}}}return u}(e.mmr,r,e.template,n.width,n.height,e.defaultPixelValue,e.enableSkip,e.combinationOperator,e.gridWidth,e.gridHeight,e.gridOffsetX,e.gridOffsetY,e.gridVectorX,e.gridVectorY,g);this.drawBitmap(n,o)}onImmediateLosslessHalftoneRegion(){this.onImmediateHalftoneRegion(...arguments)}onTables(e,t,i,a){let s=this.customTables;s||(this.customTables=s={});s[e]=function decodeTablesSegment(e,t,i){const a=e[t],s=4294967295&readUint32(e,t+1),r=4294967295&readUint32(e,t+5),n=new Reader(e,t+9,i),g=1+(a>>1&7),o=1+(a>>4&7),c=[];let C,h,l=s;do{C=n.readBits(g);h=n.readBits(o);c.push(new HuffmanLine([l,C,h,0]));l+=1<<h}while(l<r);C=n.readBits(g);c.push(new HuffmanLine([s-1,C,32,0,"lower"]));C=n.readBits(g);c.push(new HuffmanLine([r,C,32,0]));if(1&a){C=n.readBits(g);c.push(new HuffmanLine([C,0]))}return new HuffmanTable(c,!1)}(t,i,a)}}class HuffmanLine{constructor(e){if(2===e.length){this.isOOB=!0;this.rangeLow=0;this.prefixLength=e[0];this.rangeLength=0;this.prefixCode=e[1];this.isLowerRange=!1}else{this.isOOB=!1;this.rangeLow=e[0];this.prefixLength=e[1];this.rangeLength=e[2];this.prefixCode=e[3];this.isLowerRange="lower"===e[4]}}}class HuffmanTreeNode{constructor(e){this.children=[];if(e){this.isLeaf=!0;this.rangeLength=e.rangeLength;this.rangeLow=e.rangeLow;this.isLowerRange=e.isLowerRange;this.isOOB=e.isOOB}else this.isLeaf=!1}buildTree(e,t){const i=e.prefixCode>>t&1;if(t<=0)this.children[i]=new HuffmanTreeNode(e);else{let a=this.children[i];a||(this.children[i]=a=new HuffmanTreeNode(null));a.buildTree(e,t-1)}}decodeNode(e){if(this.isLeaf){if(this.isOOB)return null;const t=e.readBits(this.rangeLength);return this.rangeLow+(this.isLowerRange?-t:t)}const t=this.children[e.readBit()];if(!t)throw new Jbig2Error("invalid Huffman data");return t.decodeNode(e)}}class HuffmanTable{constructor(e,t){t||this.assignPrefixCodes(e);this.rootNode=new HuffmanTreeNode(null);for(let t=0,i=e.length;t<i;t++){const i=e[t];i.prefixLength>0&&this.rootNode.buildTree(i,i.prefixLength-1)}}decode(e){return this.rootNode.decodeNode(e)}assignPrefixCodes(e){const t=e.length;let i=0;for(let a=0;a<t;a++)i=Math.max(i,e[a].prefixLength);const a=new Uint32Array(i+1);for(let i=0;i<t;i++)a[e[i].prefixLength]++;let s,r,n,g=1,o=0;a[0]=0;for(;g<=i;){o=o+a[g-1]<<1;s=o;r=0;for(;r<t;){n=e[r];if(n.prefixLength===g){n.prefixCode=s;s++}r++}g++}}}const _t={};function getStandardTable(e){let t,i=_t[e];if(i)return i;switch(e){case 1:t=[[0,1,4,0],[16,2,8,2],[272,3,16,6],[65808,3,32,7]];break;case 2:t=[[0,1,0,0],[1,2,0,2],[2,3,0,6],[3,4,3,14],[11,5,6,30],[75,6,32,62],[6,63]];break;case 3:t=[[-256,8,8,254],[0,1,0,0],[1,2,0,2],[2,3,0,6],[3,4,3,14],[11,5,6,30],[-257,8,32,255,"lower"],[75,7,32,126],[6,62]];break;case 4:t=[[1,1,0,0],[2,2,0,2],[3,3,0,6],[4,4,3,14],[12,5,6,30],[76,5,32,31]];break;case 5:t=[[-255,7,8,126],[1,1,0,0],[2,2,0,2],[3,3,0,6],[4,4,3,14],[12,5,6,30],[-256,7,32,127,"lower"],[76,6,32,62]];break;case 6:t=[[-2048,5,10,28],[-1024,4,9,8],[-512,4,8,9],[-256,4,7,10],[-128,5,6,29],[-64,5,5,30],[-32,4,5,11],[0,2,7,0],[128,3,7,2],[256,3,8,3],[512,4,9,12],[1024,4,10,13],[-2049,6,32,62,"lower"],[2048,6,32,63]];break;case 7:t=[[-1024,4,9,8],[-512,3,8,0],[-256,4,7,9],[-128,5,6,26],[-64,5,5,27],[-32,4,5,10],[0,4,5,11],[32,5,5,28],[64,5,6,29],[128,4,7,12],[256,3,8,1],[512,3,9,2],[1024,3,10,3],[-1025,5,32,30,"lower"],[2048,5,32,31]];break;case 8:t=[[-15,8,3,252],[-7,9,1,508],[-5,8,1,253],[-3,9,0,509],[-2,7,0,124],[-1,4,0,10],[0,2,1,0],[2,5,0,26],[3,6,0,58],[4,3,4,4],[20,6,1,59],[22,4,4,11],[38,4,5,12],[70,5,6,27],[134,5,7,28],[262,6,7,60],[390,7,8,125],[646,6,10,61],[-16,9,32,510,"lower"],[1670,9,32,511],[2,1]];break;case 9:t=[[-31,8,4,252],[-15,9,2,508],[-11,8,2,253],[-7,9,1,509],[-5,7,1,124],[-3,4,1,10],[-1,3,1,2],[1,3,1,3],[3,5,1,26],[5,6,1,58],[7,3,5,4],[39,6,2,59],[43,4,5,11],[75,4,6,12],[139,5,7,27],[267,5,8,28],[523,6,8,60],[779,7,9,125],[1291,6,11,61],[-32,9,32,510,"lower"],[3339,9,32,511],[2,0]];break;case 10:t=[[-21,7,4,122],[-5,8,0,252],[-4,7,0,123],[-3,5,0,24],[-2,2,2,0],[2,5,0,25],[3,6,0,54],[4,7,0,124],[5,8,0,253],[6,2,6,1],[70,5,5,26],[102,6,5,55],[134,6,6,56],[198,6,7,57],[326,6,8,58],[582,6,9,59],[1094,6,10,60],[2118,7,11,125],[-22,8,32,254,"lower"],[4166,8,32,255],[2,2]];break;case 11:t=[[1,1,0,0],[2,2,1,2],[4,4,0,12],[5,4,1,13],[7,5,1,28],[9,5,2,29],[13,6,2,60],[17,7,2,122],[21,7,3,123],[29,7,4,124],[45,7,5,125],[77,7,6,126],[141,7,32,127]];break;case 12:t=[[1,1,0,0],[2,2,0,2],[3,3,1,6],[5,5,0,28],[6,5,1,29],[8,6,1,60],[10,7,0,122],[11,7,1,123],[13,7,2,124],[17,7,3,125],[25,7,4,126],[41,8,5,254],[73,8,32,255]];break;case 13:t=[[1,1,0,0],[2,3,0,4],[3,4,0,12],[4,5,0,28],[5,4,1,13],[7,3,3,5],[15,6,1,58],[17,6,2,59],[21,6,3,60],[29,6,4,61],[45,6,5,62],[77,7,6,126],[141,7,32,127]];break;case 14:t=[[-2,3,0,4],[-1,3,0,5],[0,1,0,0],[1,3,0,6],[2,3,0,7]];break;case 15:t=[[-24,7,4,124],[-8,6,2,60],[-4,5,1,28],[-2,4,0,12],[-1,3,0,4],[0,1,0,0],[1,3,0,5],[2,4,0,13],[3,5,1,29],[5,6,2,61],[9,7,4,125],[-25,7,32,126,"lower"],[25,7,32,127]];break;default:throw new Jbig2Error(`standard table B.${e} does not exist`)}for(let e=0,i=t.length;e<i;e++)t[e]=new HuffmanLine(t[e]);i=new HuffmanTable(t,!0);_t[e]=i;return i}class Reader{constructor(e,t,i){this.data=e;this.start=t;this.end=i;this.position=t;this.shift=-1;this.currentByte=0}readBit(){if(this.shift<0){if(this.position>=this.end)throw new Jbig2Error("end of data while reading bit");this.currentByte=this.data[this.position++];this.shift=7}const e=this.currentByte>>this.shift&1;this.shift--;return e}readBits(e){let t,i=0;for(t=e-1;t>=0;t--)i|=this.readBit()<<t;return i}byteAlign(){this.shift=-1}next(){return this.position>=this.end?-1:this.data[this.position++]}}function getCustomHuffmanTable(e,t,i){let a=0;for(let s=0,r=t.length;s<r;s++){const r=i[t[s]];if(r){if(e===a)return r;a++}}throw new Jbig2Error("can't find custom Huffman table")}function readUncompressedBitmap(e,t,i){const a=[];for(let s=0;s<i;s++){const i=new Uint8Array(t);a.push(i);for(let a=0;a<t;a++)i[a]=e.readBit();e.byteAlign()}return a}function decodeMMRBitmap(e,t,i,a){const s=new CCITTFaxDecoder(e,{K:-1,Columns:t,Rows:i,BlackIs1:!0,EndOfBlock:a}),r=[];let n,g=!1;for(let e=0;e<i;e++){const e=new Uint8Array(t);r.push(e);let i=-1;for(let a=0;a<t;a++){if(i<0){n=s.readNextChar();if(-1===n){n=0;g=!0}i=7}e[a]=n>>i&1;i--}}if(a&&!g){const e=5;for(let t=0;t<e&&-1!==s.readNextChar();t++);}return r}class Jbig2Image{parseChunks(e){return function parseJbig2Chunks(e){const t=new SimpleSegmentVisitor;for(let i=0,a=e.length;i<a;i++){const a=e[i];processSegments(readSegments({},a.data,a.start,a.end),t)}return t.buffer}(e)}parse(e){throw new Error("Not implemented: Jbig2Image.parse")}}class Jbig2Stream extends DecodeStream{constructor(e,t,i){super(t);this.stream=e;this.dict=e.dict;this.maybeLength=t;this.params=i}get bytes(){return shadow(this,"bytes",this.stream.getBytes(this.maybeLength))}ensureBuffer(e){}readBlock(){this.decodeImage()}decodeImage(e){if(this.eof)return this.buffer;e||=this.bytes;const t=new Jbig2Image,i=[];if(this.params instanceof Dict){const e=this.params.get("JBIG2Globals");if(e instanceof BaseStream){const t=e.getBytes();i.push({data:t,start:0,end:t.length})}}i.push({data:e,start:0,end:e.length});const a=t.parseChunks(i),s=a.length;for(let e=0;e<s;e++)a[e]^=255;this.buffer=a;this.bufferLength=s;this.eof=!0;return this.buffer}get canAsyncDecodeImageFromBuffer(){return this.stream.isAsync}}function convertToRGBA(e){switch(e.kind){case D:return convertBlackAndWhiteToRGBA(e);case b:return function convertRGBToRGBA({src:e,srcPos:t=0,dest:i,destPos:a=0,width:s,height:r}){let n=0;const g=e.length>>2,o=new Uint32Array(e.buffer,t,g);if(FeatureTest.isLittleEndian){for(;n<g-2;n+=3,a+=4){const e=o[n],t=o[n+1],s=o[n+2];i[a]=4278190080|e;i[a+1]=e>>>24|t<<8|4278190080;i[a+2]=t>>>16|s<<16|4278190080;i[a+3]=s>>>8|4278190080}for(let t=4*n,s=e.length;t<s;t+=3)i[a++]=e[t]|e[t+1]<<8|e[t+2]<<16|4278190080}else{for(;n<g-2;n+=3,a+=4){const e=o[n],t=o[n+1],s=o[n+2];i[a]=255|e;i[a+1]=e<<24|t>>>8|255;i[a+2]=t<<16|s>>>16|255;i[a+3]=s<<8|255}for(let t=4*n,s=e.length;t<s;t+=3)i[a++]=e[t]<<24|e[t+1]<<16|e[t+2]<<8|255}return{srcPos:t,destPos:a}}(e)}return null}function convertBlackAndWhiteToRGBA({src:e,srcPos:t=0,dest:i,width:a,height:s,nonBlackColor:r=4294967295,inverseDecode:n=!1}){const g=FeatureTest.isLittleEndian?4278190080:255,[o,c]=n?[r,g]:[g,r],C=a>>3,h=7&a,l=e.length;i=new Uint32Array(i.buffer);let Q=0;for(let a=0;a<s;a++){for(const a=t+C;t<a;t++){const a=t<l?e[t]:255;i[Q++]=128&a?c:o;i[Q++]=64&a?c:o;i[Q++]=32&a?c:o;i[Q++]=16&a?c:o;i[Q++]=8&a?c:o;i[Q++]=4&a?c:o;i[Q++]=2&a?c:o;i[Q++]=1&a?c:o}if(0===h)continue;const a=t<l?e[t++]:255;for(let e=0;e<h;e++)i[Q++]=a&1<<7-e?c:o}return{srcPos:t,destPos:Q}}class JpegError extends rt{constructor(e){super(e,"JpegError")}}class DNLMarkerError extends rt{constructor(e,t){super(e,"DNLMarkerError");this.scanLines=t}}class EOIMarkerError extends rt{constructor(e){super(e,"EOIMarkerError")}}const $t=new Uint8Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]),Ai=4017,ei=799,ti=3406,ii=2276,ai=1567,si=3784,ri=5793,ni=2896;function buildHuffmanTable(e,t){let i,a,s=0,r=16;for(;r>0&&!e[r-1];)r--;const n=[{children:[],index:0}];let g,o=n[0];for(i=0;i<r;i++){for(a=0;a<e[i];a++){o=n.pop();o.children[o.index]=t[s];for(;o.index>0;)o=n.pop();o.index++;n.push(o);for(;n.length<=i;){n.push(g={children:[],index:0});o.children[o.index]=g.children;o=g}s++}if(i+1<r){n.push(g={children:[],index:0});o.children[o.index]=g.children;o=g}}return n[0].children}function getBlockBufferOffset(e,t,i){return 64*((e.blocksPerLine+1)*t+i)}function decodeScan(e,t,i,a,s,r,n,g,o,c=!1){const C=i.mcusPerLine,h=i.progressive,l=t;let Q=0,E=0;function readBit(){if(E>0){E--;return Q>>E&1}Q=e[t++];if(255===Q){const a=e[t++];if(a){if(220===a&&c){const a=readUint16(e,t+=2);t+=2;if(a>0&&a!==i.scanLines)throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data",a)}else if(217===a){if(c){const e=p*(8===i.precision?8:0);if(e>0&&Math.round(i.scanLines/e)>=5)throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, possibly caused by incorrect `scanLines` parameter",e)}throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data")}throw new JpegError(`unexpected marker ${(Q<<8|a).toString(16)}`)}}E=7;return Q>>>7}function decodeHuffman(e){let t=e;for(;;){t=t[readBit()];switch(typeof t){case"number":return t;case"object":continue}throw new JpegError("invalid huffman sequence")}}function receive(e){let t=0;for(;e>0;){t=t<<1|readBit();e--}return t}function receiveAndExtend(e){if(1===e)return 1===readBit()?1:-1;const t=receive(e);return t>=1<<e-1?t:t+(-1<<e)+1}let u=0;let d,f=0;let p=0;function decodeMcu(e,t,i,a,s){const r=i%C;p=(i/C|0)*e.v+a;const n=r*e.h+s;t(e,getBlockBufferOffset(e,p,n))}function decodeBlock(e,t,i){p=i/e.blocksPerLine|0;const a=i%e.blocksPerLine;t(e,getBlockBufferOffset(e,p,a))}const m=a.length;let y,w,D,b,F,S;S=h?0===r?0===g?function decodeDCFirst(e,t){const i=decodeHuffman(e.huffmanTableDC),a=0===i?0:receiveAndExtend(i)<<o;e.blockData[t]=e.pred+=a}:function decodeDCSuccessive(e,t){e.blockData[t]|=readBit()<<o}:0===g?function decodeACFirst(e,t){if(u>0){u--;return}let i=r;const a=n;for(;i<=a;){const a=decodeHuffman(e.huffmanTableAC),s=15&a,r=a>>4;if(0===s){if(r<15){u=receive(r)+(1<<r)-1;break}i+=16;continue}i+=r;const n=$t[i];e.blockData[t+n]=receiveAndExtend(s)*(1<<o);i++}}:function decodeACSuccessive(e,t){let i=r;const a=n;let s,g,c=0;for(;i<=a;){const a=t+$t[i],r=e.blockData[a]<0?-1:1;switch(f){case 0:g=decodeHuffman(e.huffmanTableAC);s=15&g;c=g>>4;if(0===s)if(c<15){u=receive(c)+(1<<c);f=4}else{c=16;f=1}else{if(1!==s)throw new JpegError("invalid ACn encoding");d=receiveAndExtend(s);f=c?2:3}continue;case 1:case 2:if(e.blockData[a])e.blockData[a]+=r*(readBit()<<o);else{c--;0===c&&(f=2===f?3:0)}break;case 3:if(e.blockData[a])e.blockData[a]+=r*(readBit()<<o);else{e.blockData[a]=d<<o;f=0}break;case 4:e.blockData[a]&&(e.blockData[a]+=r*(readBit()<<o))}i++}if(4===f){u--;0===u&&(f=0)}}:function decodeBaseline(e,t){const i=decodeHuffman(e.huffmanTableDC),a=0===i?0:receiveAndExtend(i);e.blockData[t]=e.pred+=a;let s=1;for(;s<64;){const i=decodeHuffman(e.huffmanTableAC),a=15&i,r=i>>4;if(0===a){if(r<15)break;s+=16;continue}s+=r;const n=$t[s];e.blockData[t+n]=receiveAndExtend(a);s++}};let k,R=0;const N=1===m?a[0].blocksPerLine*a[0].blocksPerColumn:C*i.mcusPerColumn;let G,x;for(;R<=N;){const i=s?Math.min(N-R,s):N;if(i>0){for(w=0;w<m;w++)a[w].pred=0;u=0;if(1===m){y=a[0];for(F=0;F<i;F++){decodeBlock(y,S,R);R++}}else for(F=0;F<i;F++){for(w=0;w<m;w++){y=a[w];G=y.h;x=y.v;for(D=0;D<x;D++)for(b=0;b<G;b++)decodeMcu(y,S,R,D,b)}R++}}E=0;k=findNextFileMarker(e,t);if(!k)break;if(k.invalid){warn(`decodeScan - ${i>0?"unexpected":"excessive"} MCU data, current marker is: ${k.invalid}`);t=k.offset}if(!(k.marker>=65488&&k.marker<=65495))break;t+=2}return t-l}function quantizeAndInverse(e,t,i){const a=e.quantizationTable,s=e.blockData;let r,n,g,o,c,C,h,l,Q,E,u,d,f,p,m,y,w;if(!a)throw new JpegError("missing required Quantization Table.");for(let e=0;e<64;e+=8){Q=s[t+e];E=s[t+e+1];u=s[t+e+2];d=s[t+e+3];f=s[t+e+4];p=s[t+e+5];m=s[t+e+6];y=s[t+e+7];Q*=a[e];if(0!=(E|u|d|f|p|m|y)){E*=a[e+1];u*=a[e+2];d*=a[e+3];f*=a[e+4];p*=a[e+5];m*=a[e+6];y*=a[e+7];r=ri*Q+128>>8;n=ri*f+128>>8;g=u;o=m;c=ni*(E-y)+128>>8;l=ni*(E+y)+128>>8;C=d<<4;h=p<<4;r=r+n+1>>1;n=r-n;w=g*si+o*ai+128>>8;g=g*ai-o*si+128>>8;o=w;c=c+h+1>>1;h=c-h;l=l+C+1>>1;C=l-C;r=r+o+1>>1;o=r-o;n=n+g+1>>1;g=n-g;w=c*ii+l*ti+2048>>12;c=c*ti-l*ii+2048>>12;l=w;w=C*ei+h*Ai+2048>>12;C=C*Ai-h*ei+2048>>12;h=w;i[e]=r+l;i[e+7]=r-l;i[e+1]=n+h;i[e+6]=n-h;i[e+2]=g+C;i[e+5]=g-C;i[e+3]=o+c;i[e+4]=o-c}else{w=ri*Q+512>>10;i[e]=w;i[e+1]=w;i[e+2]=w;i[e+3]=w;i[e+4]=w;i[e+5]=w;i[e+6]=w;i[e+7]=w}}for(let e=0;e<8;++e){Q=i[e];E=i[e+8];u=i[e+16];d=i[e+24];f=i[e+32];p=i[e+40];m=i[e+48];y=i[e+56];if(0!=(E|u|d|f|p|m|y)){r=ri*Q+2048>>12;n=ri*f+2048>>12;g=u;o=m;c=ni*(E-y)+2048>>12;l=ni*(E+y)+2048>>12;C=d;h=p;r=4112+(r+n+1>>1);n=r-n;w=g*si+o*ai+2048>>12;g=g*ai-o*si+2048>>12;o=w;c=c+h+1>>1;h=c-h;l=l+C+1>>1;C=l-C;r=r+o+1>>1;o=r-o;n=n+g+1>>1;g=n-g;w=c*ii+l*ti+2048>>12;c=c*ti-l*ii+2048>>12;l=w;w=C*ei+h*Ai+2048>>12;C=C*Ai-h*ei+2048>>12;h=w;Q=r+l;y=r-l;E=n+h;m=n-h;u=g+C;p=g-C;d=o+c;f=o-c;Q<16?Q=0:Q>=4080?Q=255:Q>>=4;E<16?E=0:E>=4080?E=255:E>>=4;u<16?u=0:u>=4080?u=255:u>>=4;d<16?d=0:d>=4080?d=255:d>>=4;f<16?f=0:f>=4080?f=255:f>>=4;p<16?p=0:p>=4080?p=255:p>>=4;m<16?m=0:m>=4080?m=255:m>>=4;y<16?y=0:y>=4080?y=255:y>>=4;s[t+e]=Q;s[t+e+8]=E;s[t+e+16]=u;s[t+e+24]=d;s[t+e+32]=f;s[t+e+40]=p;s[t+e+48]=m;s[t+e+56]=y}else{w=ri*Q+8192>>14;w=w<-2040?0:w>=2024?255:w+2056>>4;s[t+e]=w;s[t+e+8]=w;s[t+e+16]=w;s[t+e+24]=w;s[t+e+32]=w;s[t+e+40]=w;s[t+e+48]=w;s[t+e+56]=w}}}function buildComponentData(e,t){const i=t.blocksPerLine,a=t.blocksPerColumn,s=new Int16Array(64);for(let e=0;e<a;e++)for(let a=0;a<i;a++){quantizeAndInverse(t,getBlockBufferOffset(t,e,a),s)}return t.blockData}function findNextFileMarker(e,t,i=t){const a=e.length-1;let s=i<t?i:t;if(t>=a)return null;const r=readUint16(e,t);if(r>=65472&&r<=65534)return{invalid:null,marker:r,offset:t};let n=readUint16(e,s);for(;!(n>=65472&&n<=65534);){if(++s>=a)return null;n=readUint16(e,s)}return{invalid:r.toString(16),marker:n,offset:s}}class JpegImage{constructor({decodeTransform:e=null,colorTransform:t=-1}={}){this._decodeTransform=e;this._colorTransform=t}parse(e,{dnlScanLines:t=null}={}){function readDataBlock(){const t=readUint16(e,s);s+=2;let i=s+t-2;const a=findNextFileMarker(e,i,s);if(a?.invalid){warn("readDataBlock - incorrect length, current marker is: "+a.invalid);i=a.offset}const r=e.subarray(s,i);s+=r.length;return r}function prepareComponents(e){const t=Math.ceil(e.samplesPerLine/8/e.maxH),i=Math.ceil(e.scanLines/8/e.maxV);for(const a of e.components){const s=Math.ceil(Math.ceil(e.samplesPerLine/8)*a.h/e.maxH),r=Math.ceil(Math.ceil(e.scanLines/8)*a.v/e.maxV),n=t*a.h,g=64*(i*a.v)*(n+1);a.blockData=new Int16Array(g);a.blocksPerLine=s;a.blocksPerColumn=r}e.mcusPerLine=t;e.mcusPerColumn=i}let i,a,s=0,r=null,n=null,g=0;const o=[],c=[],C=[];let h=readUint16(e,s);s+=2;if(65496!==h)throw new JpegError("SOI not found");h=readUint16(e,s);s+=2;A:for(;65497!==h;){let l,Q,E;switch(h){case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:case 65534:const u=readDataBlock();65504===h&&74===u[0]&&70===u[1]&&73===u[2]&&70===u[3]&&0===u[4]&&(r={version:{major:u[5],minor:u[6]},densityUnits:u[7],xDensity:u[8]<<8|u[9],yDensity:u[10]<<8|u[11],thumbWidth:u[12],thumbHeight:u[13],thumbData:u.subarray(14,14+3*u[12]*u[13])});65518===h&&65===u[0]&&100===u[1]&&111===u[2]&&98===u[3]&&101===u[4]&&(n={version:u[5]<<8|u[6],flags0:u[7]<<8|u[8],flags1:u[9]<<8|u[10],transformCode:u[11]});break;case 65499:const d=readUint16(e,s);s+=2;const f=d+s-2;let p;for(;s<f;){const t=e[s++],i=new Uint16Array(64);if(t>>4==0)for(Q=0;Q<64;Q++){p=$t[Q];i[p]=e[s++]}else{if(t>>4!=1)throw new JpegError("DQT - invalid table spec");for(Q=0;Q<64;Q++){p=$t[Q];i[p]=readUint16(e,s);s+=2}}o[15&t]=i}break;case 65472:case 65473:case 65474:if(i)throw new JpegError("Only single frame JPEGs supported");s+=2;i={};i.extended=65473===h;i.progressive=65474===h;i.precision=e[s++];const m=readUint16(e,s);s+=2;i.scanLines=t||m;i.samplesPerLine=readUint16(e,s);s+=2;i.components=[];i.componentIds={};const y=e[s++];let w=0,D=0;for(l=0;l<y;l++){const t=e[s],a=e[s+1]>>4,r=15&e[s+1];w<a&&(w=a);D<r&&(D=r);const n=e[s+2];E=i.components.push({h:a,v:r,quantizationId:n,quantizationTable:null});i.componentIds[t]=E-1;s+=3}i.maxH=w;i.maxV=D;prepareComponents(i);break;case 65476:const b=readUint16(e,s);s+=2;for(l=2;l<b;){const t=e[s++],i=new Uint8Array(16);let a=0;for(Q=0;Q<16;Q++,s++)a+=i[Q]=e[s];const r=new Uint8Array(a);for(Q=0;Q<a;Q++,s++)r[Q]=e[s];l+=17+a;(t>>4==0?C:c)[15&t]=buildHuffmanTable(i,r)}break;case 65501:s+=2;a=readUint16(e,s);s+=2;break;case 65498:const F=1==++g&&!t;s+=2;const S=e[s++],k=[];for(l=0;l<S;l++){const t=e[s++],a=i.componentIds[t],r=i.components[a];r.index=t;const n=e[s++];r.huffmanTableDC=C[n>>4];r.huffmanTableAC=c[15&n];k.push(r)}const R=e[s++],N=e[s++],G=e[s++];try{const t=decodeScan(e,s,i,k,a,R,N,G>>4,15&G,F);s+=t}catch(t){if(t instanceof DNLMarkerError){warn(`${t.message} -- attempting to re-parse the JPEG image.`);return this.parse(e,{dnlScanLines:t.scanLines})}if(t instanceof EOIMarkerError){warn(`${t.message} -- ignoring the rest of the image data.`);break A}throw t}break;case 65500:s+=4;break;case 65535:255!==e[s]&&s--;break;default:const x=findNextFileMarker(e,s-2,s-3);if(x?.invalid){warn("JpegImage.parse - unexpected data, current marker is: "+x.invalid);s=x.offset;break}if(!x||s>=e.length-1){warn("JpegImage.parse - reached the end of the image data without finding an EOI marker (0xFFD9).");break A}throw new JpegError("JpegImage.parse - unknown marker: "+h.toString(16))}h=readUint16(e,s);s+=2}if(!i)throw new JpegError("JpegImage.parse - no frame data found.");this.width=i.samplesPerLine;this.height=i.scanLines;this.jfif=r;this.adobe=n;this.components=[];for(const e of i.components){const t=o[e.quantizationId];t&&(e.quantizationTable=t);this.components.push({index:e.index,output:buildComponentData(0,e),scaleX:e.h/i.maxH,scaleY:e.v/i.maxV,blocksPerLine:e.blocksPerLine,blocksPerColumn:e.blocksPerColumn})}this.numComponents=this.components.length}_getLinearizedBlockData(e,t,i=!1){const a=this.width/e,s=this.height/t;let r,n,g,o,c,C,h,l,Q,E,u,d=0;const f=this.components.length,p=e*t*f,m=new Uint8ClampedArray(p),y=new Uint32Array(e),w=4294967288;let D;for(h=0;h<f;h++){r=this.components[h];n=r.scaleX*a;g=r.scaleY*s;d=h;u=r.output;o=r.blocksPerLine+1<<3;if(n!==D){for(c=0;c<e;c++){l=0|c*n;y[c]=(l&w)<<3|7&l}D=n}for(C=0;C<t;C++){l=0|C*g;E=o*(l&w)|(7&l)<<3;for(c=0;c<e;c++){m[d]=u[E+y[c]];d+=f}}}let b=this._decodeTransform;i||4!==f||b||(b=new Int32Array([-256,255,-256,255,-256,255,-256,255]));if(b)for(h=0;h<p;)for(l=0,Q=0;l<f;l++,h++,Q+=2)m[h]=(m[h]*b[Q]>>8)+b[Q+1];return m}get _isColorConversionNeeded(){return this.adobe?!!this.adobe.transformCode:3===this.numComponents?0!==this._colorTransform&&(82!==this.components[0].index||71!==this.components[1].index||66!==this.components[2].index):1===this._colorTransform}_convertYccToRgb(e){let t,i,a;for(let s=0,r=e.length;s<r;s+=3){t=e[s];i=e[s+1];a=e[s+2];e[s]=t-179.456+1.402*a;e[s+1]=t+135.459-.344*i-.714*a;e[s+2]=t-226.816+1.772*i}return e}_convertYccToRgba(e,t){for(let i=0,a=0,s=e.length;i<s;i+=3,a+=4){const s=e[i],r=e[i+1],n=e[i+2];t[a]=s-179.456+1.402*n;t[a+1]=s+135.459-.344*r-.714*n;t[a+2]=s-226.816+1.772*r;t[a+3]=255}return t}_convertYcckToRgb(e){let t,i,a,s,r=0;for(let n=0,g=e.length;n<g;n+=4){t=e[n];i=e[n+1];a=e[n+2];s=e[n+3];e[r++]=i*(-660635669420364e-19*i+.000437130475926232*a-54080610064599e-18*t+.00048449797120281*s-.154362151871126)-122.67195406894+a*(-.000957964378445773*a+.000817076911346625*t-.00477271405408747*s+1.53380253221734)+t*(.000961250184130688*t-.00266257332283933*s+.48357088451265)+s*(-.000336197177618394*s+.484791561490776);e[r++]=107.268039397724+i*(219927104525741e-19*i-.000640992018297945*a+.000659397001245577*t+.000426105652938837*s-.176491792462875)+a*(-.000778269941513683*a+.00130872261408275*t+.000770482631801132*s-.151051492775562)+t*(.00126935368114843*t-.00265090189010898*s+.25802910206845)+s*(-.000318913117588328*s-.213742400323665);e[r++]=i*(-.000570115196973677*i-263409051004589e-19*a+.0020741088115012*t-.00288260236853442*s+.814272968359295)-20.810012546947+a*(-153496057440975e-19*a-.000132689043961446*t+.000560833691242812*s-.195152027534049)+t*(.00174418132927582*t-.00255243321439347*s+.116935020465145)+s*(-.000343531996510555*s+.24165260232407)}return e.subarray(0,r)}_convertYcckToRgba(e){for(let t=0,i=e.length;t<i;t+=4){const i=e[t],a=e[t+1],s=e[t+2],r=e[t+3];e[t]=a*(-660635669420364e-19*a+.000437130475926232*s-54080610064599e-18*i+.00048449797120281*r-.154362151871126)-122.67195406894+s*(-.000957964378445773*s+.000817076911346625*i-.00477271405408747*r+1.53380253221734)+i*(.000961250184130688*i-.00266257332283933*r+.48357088451265)+r*(-.000336197177618394*r+.484791561490776);e[t+1]=107.268039397724+a*(219927104525741e-19*a-.000640992018297945*s+.000659397001245577*i+.000426105652938837*r-.176491792462875)+s*(-.000778269941513683*s+.00130872261408275*i+.000770482631801132*r-.151051492775562)+i*(.00126935368114843*i-.00265090189010898*r+.25802910206845)+r*(-.000318913117588328*r-.213742400323665);e[t+2]=a*(-.000570115196973677*a-263409051004589e-19*s+.0020741088115012*i-.00288260236853442*r+.814272968359295)-20.810012546947+s*(-153496057440975e-19*s-.000132689043961446*i+.000560833691242812*r-.195152027534049)+i*(.00174418132927582*i-.00255243321439347*r+.116935020465145)+r*(-.000343531996510555*r+.24165260232407);e[t+3]=255}return e}_convertYcckToCmyk(e){let t,i,a;for(let s=0,r=e.length;s<r;s+=4){t=e[s];i=e[s+1];a=e[s+2];e[s]=434.456-t-1.402*a;e[s+1]=119.541-t+.344*i+.714*a;e[s+2]=481.816-t-1.772*i}return e}_convertCmykToRgb(e){let t,i,a,s,r=0;for(let n=0,g=e.length;n<g;n+=4){t=e[n];i=e[n+1];a=e[n+2];s=e[n+3];e[r++]=255+t*(-6747147073602441e-20*t+.0008379262121013727*i+.0002894718188643294*a+.003264231057537806*s-1.1185611867203937)+i*(26374107616089405e-21*i-8626949158638572e-20*a-.0002748769067499491*s-.02155688794978967)+a*(-3878099212869363e-20*a-.0003267808279485286*s+.0686742238595345)-s*(.0003361971776183937*s+.7430659151342254);e[r++]=255+t*(.00013596372813588848*t+.000924537132573585*i+.00010567359618683593*a+.0004791864687436512*s-.3109689587515875)+i*(-.00023545346108370344*i+.0002702845253534714*a+.0020200308977307156*s-.7488052167015494)+a*(6834815998235662e-20*a+.00015168452363460973*s-.09751927774728933)-s*(.0003189131175883281*s+.7364883807733168);e[r++]=255+t*(13598650411385307e-21*t+.00012423956175490851*i+.0004751985097583589*a-36729317476630422e-22*s-.05562186980264034)+i*(.00016141380598724676*i+.0009692239130725186*a+.0007782692450036253*s-.44015232367526463)+a*(5.068882914068769e-7*a+.0017778369011375071*s-.7591454649749609)-s*(.0003435319965105553*s+.7063770186160144)}return e.subarray(0,r)}_convertCmykToRgba(e){for(let t=0,i=e.length;t<i;t+=4){const i=e[t],a=e[t+1],s=e[t+2],r=e[t+3];e[t]=255+i*(-6747147073602441e-20*i+.0008379262121013727*a+.0002894718188643294*s+.003264231057537806*r-1.1185611867203937)+a*(26374107616089405e-21*a-8626949158638572e-20*s-.0002748769067499491*r-.02155688794978967)+s*(-3878099212869363e-20*s-.0003267808279485286*r+.0686742238595345)-r*(.0003361971776183937*r+.7430659151342254);e[t+1]=255+i*(.00013596372813588848*i+.000924537132573585*a+.00010567359618683593*s+.0004791864687436512*r-.3109689587515875)+a*(-.00023545346108370344*a+.0002702845253534714*s+.0020200308977307156*r-.7488052167015494)+s*(6834815998235662e-20*s+.00015168452363460973*r-.09751927774728933)-r*(.0003189131175883281*r+.7364883807733168);e[t+2]=255+i*(13598650411385307e-21*i+.00012423956175490851*a+.0004751985097583589*s-36729317476630422e-22*r-.05562186980264034)+a*(.00016141380598724676*a+.0009692239130725186*s+.0007782692450036253*r-.44015232367526463)+s*(5.068882914068769e-7*s+.0017778369011375071*r-.7591454649749609)-r*(.0003435319965105553*r+.7063770186160144);e[t+3]=255}return e}getData({width:e,height:t,forceRGBA:i=!1,forceRGB:a=!1,isSourcePDF:s=!1}){if(this.numComponents>4)throw new JpegError("Unsupported color mode");const r=this._getLinearizedBlockData(e,t,s);if(1===this.numComponents&&(i||a)){const e=r.length*(i?4:3),t=new Uint8ClampedArray(e);let a=0;if(i)!function grayToRGBA(e,t){if(FeatureTest.isLittleEndian)for(let i=0,a=e.length;i<a;i++)t[i]=65793*e[i]|4278190080;else for(let i=0,a=e.length;i<a;i++)t[i]=16843008*e[i]|255}(r,new Uint32Array(t.buffer));else for(const e of r){t[a++]=e;t[a++]=e;t[a++]=e}return t}if(3===this.numComponents&&this._isColorConversionNeeded){if(i){const e=new Uint8ClampedArray(r.length/3*4);return this._convertYccToRgba(r,e)}return this._convertYccToRgb(r)}if(4===this.numComponents){if(this._isColorConversionNeeded)return i?this._convertYcckToRgba(r):a?this._convertYcckToRgb(r):this._convertYcckToCmyk(r);if(i)return this._convertCmykToRgba(r);if(a)return this._convertCmykToRgb(r)}return r}}class JpegStream extends DecodeStream{constructor(e,t,i){super(t);this.stream=e;this.dict=e.dict;this.maybeLength=t;this.params=i}get bytes(){return shadow(this,"bytes",this.stream.getBytes(this.maybeLength))}ensureBuffer(e){}readBlock(){this.decodeImage()}decodeImage(e){if(this.eof)return this.buffer;e||=this.bytes;for(let t=0,i=e.length-1;t<i;t++)if(255===e[t]&&216===e[t+1]){t>0&&(e=e.subarray(t));break}const t={decodeTransform:void 0,colorTransform:void 0},i=this.dict.getArray("D","Decode");if((this.forceRGBA||this.forceRGB)&&Array.isArray(i)){const e=this.dict.get("BPC","BitsPerComponent")||8,a=i.length,s=new Int32Array(a);let r=!1;const n=(1<<e)-1;for(let e=0;e<a;e+=2){s[e]=256*(i[e+1]-i[e])|0;s[e+1]=i[e]*n|0;256===s[e]&&0===s[e+1]||(r=!0)}r&&(t.decodeTransform=s)}if(this.params instanceof Dict){const e=this.params.get("ColorTransform");Number.isInteger(e)&&(t.colorTransform=e)}const a=new JpegImage(t);a.parse(e);const s=a.getData({width:this.drawWidth,height:this.drawHeight,forceRGBA:this.forceRGBA,forceRGB:this.forceRGB,isSourcePDF:!0});this.buffer=s;this.bufferLength=s.length;this.eof=!0;return this.buffer}get canAsyncDecodeImageFromBuffer(){return this.stream.isAsync}}var gi,oi=(gi="undefined"!=typeof document?document.currentScript?.src:void 0,function(e={}){var t,i,a=e;new Promise(((e,a)=>{t=e;i=a}));a.decode=function(e,{numComponents:t=4,isIndexedColormap:i=!1,smaskInData:s=!1}){const r=e.length,n=a._malloc(r);a.HEAPU8.set(e,n);const g=a._jp2_decode(n,r,t>0?t:0,!!i,!!s);a._free(n);if(g){const{errorMessages:e}=a;if(e){delete a.errorMessages;return e}return"Unknown error"}const{imageData:o}=a;a.imageData=null;return o};var s,r=Object.assign({},a),n="./this.program",g="";"undefined"!=typeof document&&document.currentScript&&(g=document.currentScript.src);gi&&(g=gi);g=g.startsWith("blob:")?"":g.substr(0,g.replace(/[?#].*/,"").lastIndexOf("/")+1);var o,c,C,h,l,Q=a.print||console.log.bind(console),E=a.printErr||console.error.bind(console);Object.assign(a,r);r=null;a.arguments&&a.arguments;a.thisProgram&&(n=a.thisProgram);a.quit&&a.quit;a.wasmBinary&&(o=a.wasmBinary);function tryParseAsDataURI(e){if(isDataURI(e))return function intArrayFromBase64(e){for(var t=atob(e),i=new Uint8Array(t.length),a=0;a<t.length;++a)i[a]=t.charCodeAt(a);return i}(e.slice(D.length))}function updateMemoryViews(){var e=c.buffer;a.HEAP8=C=new Int8Array(e);a.HEAP16=new Int16Array(e);a.HEAPU8=h=new Uint8Array(e);a.HEAPU16=new Uint16Array(e);a.HEAP32=new Int32Array(e);a.HEAPU32=l=new Uint32Array(e);a.HEAPF32=new Float32Array(e);a.HEAPF64=new Float64Array(e)}var u,d=[],f=[],p=[],m=0,y=null,w=null,D="data:application/octet-stream;base64,",isDataURI=e=>e.startsWith(D);function instantiateSync(e,t){var i,a=function getBinarySync(e){if(e==u&&o)return new Uint8Array(o);var t=tryParseAsDataURI(e);if(t)return t;if(s)return s(e);throw'sync fetching of the wasm failed: you can preload it to Module["wasmBinary"] manually, or emcc.py will do that for you when generating HTML (but not JS)'}(e);i=new WebAssembly.Module(a);return[new WebAssembly.Instance(i,t),i]}var callRuntimeCallbacks=e=>{for(;e.length>0;)e.shift()(a)};a.noExitRuntime;var b,growMemory=e=>{var t=(e-c.buffer.byteLength+65535)/65536;try{c.grow(t);updateMemoryViews();return 1}catch(e){}},F={},getEnvStrings=()=>{if(!getEnvStrings.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:n||"./this.program"};for(var t in F)void 0===F[t]?delete e[t]:e[t]=F[t];var i=[];for(var t in e)i.push(`${t}=${e[t]}`);getEnvStrings.strings=i}return getEnvStrings.strings},S=[null,[],[]],k="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0,UTF8ArrayToString=(e,t,i)=>{for(var a=t+i,s=t;e[s]&&!(s>=a);)++s;if(s-t>16&&e.buffer&&k)return k.decode(e.subarray(t,s));for(var r="";t<s;){var n=e[t++];if(128&n){var g=63&e[t++];if(192!=(224&n)){var o=63&e[t++];if((n=224==(240&n)?(15&n)<<12|g<<6|o:(7&n)<<18|g<<12|o<<6|63&e[t++])<65536)r+=String.fromCharCode(n);else{var c=n-65536;r+=String.fromCharCode(55296|c>>10,56320|1023&c)}}else r+=String.fromCharCode((31&n)<<6|g)}else r+=String.fromCharCode(n)}return r},printChar=(e,t)=>{var i=S[e];if(0===t||10===t){(1===e?Q:E)(UTF8ArrayToString(i,0));i.length=0}else i.push(t)},UTF8ToString=(e,t)=>e?UTF8ArrayToString(h,e,t):"",R={c:(e,t,i)=>h.copyWithin(e,t,t+i),g:function _copy_pixels_1(e,t){e>>=2;const i=a.imageData=new Uint8ClampedArray(t),s=a.HEAP32.subarray(e,e+t);i.set(s)},f:function _copy_pixels_3(e,t,i,s){e>>=2;t>>=2;i>>=2;const r=a.imageData=new Uint8ClampedArray(3*s),n=a.HEAP32.subarray(e,e+s),g=a.HEAP32.subarray(t,t+s),o=a.HEAP32.subarray(i,i+s);for(let e=0;e<s;e++){r[3*e]=n[e];r[3*e+1]=g[e];r[3*e+2]=o[e]}},e:function _copy_pixels_4(e,t,i,s,r){e>>=2;t>>=2;i>>=2;s>>=2;const n=a.imageData=new Uint8ClampedArray(4*r),g=a.HEAP32.subarray(e,e+r),o=a.HEAP32.subarray(t,t+r),c=a.HEAP32.subarray(i,i+r),C=a.HEAP32.subarray(s,s+r);for(let e=0;e<r;e++){n[4*e]=g[e];n[4*e+1]=o[e];n[4*e+2]=c[e];n[4*e+3]=C[e]}},k:e=>{var t=h.length,i=2147483648;if((e>>>=0)>i)return!1;for(var a,s,r=1;r<=4;r*=2){var n=t*(1+.2/r);n=Math.min(n,e+100663296);var g=Math.min(i,(a=Math.max(e,n))+((s=65536)-a%s)%s);if(growMemory(g))return!0}return!1},l:(e,t)=>{var i=0;getEnvStrings().forEach(((a,s)=>{var r=t+i;l[e+4*s>>2]=r;((e,t)=>{for(var i=0;i<e.length;++i)C[t++]=e.charCodeAt(i);C[t]=0})(a,r);i+=a.length+1}));return 0},m:(e,t)=>{var i=getEnvStrings();l[e>>2]=i.length;var a=0;i.forEach((e=>a+=e.length+1));l[t>>2]=a;return 0},n:e=>52,j:function _fd_seek(e,t,i,a,s){return 70},b:(e,t,i,a)=>{for(var s=0,r=0;r<i;r++){var n=l[t>>2],g=l[t+4>>2];t+=8;for(var o=0;o<g;o++)printChar(e,h[n+o]);s+=g}l[a>>2]=s;return 0},o:function _gray_to_rgba(e,t){e>>=2;const i=a.imageData=new Uint8ClampedArray(4*t),s=a.HEAP32.subarray(e,e+t);for(let e=0;e<t;e++){i[4*e]=i[4*e+1]=i[4*e+2]=s[e];i[4*e+3]=255}},i:function _graya_to_rgba(e,t,i){e>>=2;t>>=2;const s=a.imageData=new Uint8ClampedArray(4*i),r=a.HEAP32.subarray(e,e+i),n=a.HEAP32.subarray(t,t+i);for(let e=0;e<i;e++){s[4*e]=s[4*e+1]=s[4*e+2]=r[e];s[4*e+3]=n[e]}},d:function _jsPrintWarning(e){const t=UTF8ToString(e);(a.warn||console.warn)(`OpenJPEG: ${t}`)},h:function _rgb_to_rgba(e,t,i,s){e>>=2;t>>=2;i>>=2;const r=a.imageData=new Uint8ClampedArray(4*s),n=a.HEAP32.subarray(e,e+s),g=a.HEAP32.subarray(t,t+s),o=a.HEAP32.subarray(i,i+s);for(let e=0;e<s;e++){r[4*e]=n[e];r[4*e+1]=g[e];r[4*e+2]=o[e];r[4*e+3]=255}},a:function _storeErrorMessage(e){const t=UTF8ToString(e);a.errorMessages?a.errorMessages+="\n"+t:a.errorMessages=t}},N=function createWasm(){var e=function getWasmImports(){return{a:R}}();function receiveInstance(e,t){N=e.exports;c=N.p;updateMemoryViews();!function addOnInit(e){f.unshift(e)}(N.q);!function removeRunDependency(e){m--;a.monitorRunDependencies?.(m);if(0==m){if(null!==y){clearInterval(y);y=null}if(w){var t=w;w=null;t()}}}();return N}!function addRunDependency(e){m++;a.monitorRunDependencies?.(m)}();if(a.instantiateWasm)try{return a.instantiateWasm(e,receiveInstance)}catch(e){E(`Module.instantiateWasm callback failed with error: ${e}`);i(e)}u||(u="data:application/octet-stream;base64,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A0kNAAsLAkAgA0F8cSIEQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgACADQQRrIgRLBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAswAQF/AkAgAEUNACABRQ0AQQggACABbCIBECUiAARAIABBACABEBUaCyAAIQILIAILEQAgAEUEQEEADwtBCCAAECUL8gICAn8BfgJAIAJFDQAgACABOgAAIAAgAmoiA0EBayABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBA2sgAToAACADQQJrIAE6AAAgAkEHSQ0AIAAgAToAAyADQQRrIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBBGsgATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQQhrIAE2AgAgAkEMayABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkEQayABNgIAIAJBFGsgATYCACACQRhrIAE2AgAgAkEcayABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa1CgYCAgBB+IQUgAyAEaiEBA0AgASAFNwMYIAEgBTcDECABIAU3AwggASAFNwMAIAFBIGohASACQSBrIgJBH0sNAAsLIAALJwEBfyMAQRBrIgMkACADIAI2AgwgACABIAJBAEEAEGsgA0EQaiQAC+gFAQl/IAFFBEBBAA8LAn8gAEUE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ACAEIE5BCmpBAiAFEBpBAkcEQCAFQQFBAiAAKAK4ARtBlhJBABAPIAAoArgBRSFnDAELIE5BCmogTkEMakECEBEgTigCDCIBQZD/A0YNACABQdn/A0YEQCAAQYACNgIIIABBADYCzAEMAQsgBCkDCCKGAVAEfkIABSCGASAEKQM4fQtQBEAgAEHAADYCCCAFQQJBrD9BABAPDAELQQAhZyAFQQFB7D5BABAPCyBOQRBqJAAgZwsLACAABEAgABAQCwu0AQEBfyAAKAIMRQRAIAIgACgCJCABEQMADwsCQEEIEBQiA0UNACADIAI2AgQgAyABNgIAQQgQFCIBRQRAIAMQEA8LIAEgAzYCACAAIAAoAgRB5ABsIgI2AigDQCAAKAIYIAJKDQALIAEgACgCFDYCBCAAIAE2AhQgACAAKAIYQQFqNgIYIAAoAhwiAUUNACABKAIAQQA2AgggACABKAIENgIcIAAgACgCIEEBazYCICABEBALC/oCAQR/AkAgAEUNACAAKAKsKCIBBEAgACgCqCgiAgRAQQAhAQNAIAAoAqwoIAFBA3RqKAIAIgMEQCADEBAgACgCqCghAgsgAUEBaiIBIAJJDQALIAAoAqwoIQELIABBADYCqCggARAQIABBADYCrCgLIAAoArQoIgEEQCABEBAgAEEANgK0KAsgACgC0CsiAQRAIAEQECAAQQA2AtArCyAAKALsKyIBBEAgARAQIABBADYC7CsLIAAoAugrIgEEQCABEBAgAEEANgLoKwsgACgC/CsiAQRAIAEQECAAQQA2AoQsIABCADcC/CsLIAAoAvArIgEEQCAAKAL0KyIDBH9BACECA0AgASgCDCIEBEAgBBAQIAFBADYCDCAAKAL0KyEDCyABQRRqIQEgAkEBaiICIANJDQALIAAoAvArBSABCxAQIABBADYC8CsLIAAoAuQrIgEEQCABEBAgAEEANgLkKwsgACgC3CsiAUUNACABEBAgAEIANwLcKwsLyAcCEX8BfiAAKAIQIghBIE8EQCAAKQMIpw8LAkAgACgCFCIDQQROBEAgACgCACICQQNrKAIAIQEgACADQQRrIgM2AhQgACACQQRrNgIADAELIANBAEwEQAwBCyADQQFxIQ0gACgCACECAkAgA0EBRgRAQRghBAwBCyADQf7///8HcSEJQRghBANAIAAgAkEBayIGNgIAIAItAAAhDCAAIAJBAmsiAjYCACAAIANBAWs2AhQgBi0AACEGIAAgA0ECayIDNgIUIAwgBHQgAXIgBiAEQQhrdHIhASAEQRBrIQQgBUECaiIFIAlHDQALCyANBEAgACACQQFrNgIAIAItAAAhDiAAIANBAWs2AhQgDiAEdCABciEBC0EAIQMLIAAoAhghAiAAIAFB/wFxIglBjwFLNgIYIABBB0EIIAFBgICA+AdxQYCAgPgHRhtBCCACGyICQQhBB0EIIAFBgID8A3FBgID8A0YbIAFB/////3hNG2oiBEEIQQdBCCABQYD+AXFBgP4BRhsgAUEQdkH/AXEiBUGPAU0baiIGQQhBB0EIIAFB/wBxQf8ARhsgAUEIdkH/AXEiB0GPAU0bIAhqaiIKNgIQIAAgACkDCCAFIAJ0IAFBGHZyIAcgBHRyIAkgBnRyrSAIrYaEIhI3AwggCkEfTQRAAkAgA0EETgRAIAAoAgAiAkEDaygCACEBIAAgA0EEazYCFCAAIAJBBGs2AgAMAQsgA0EATARAQQAhAQwBCyADQQFxIRAgACgCACECAkAgA0EBRgRAQRghBEEAIQEMAQsgA0H+////B3EhBkEYIQRBACEBQQAhBQNAIAAgAkEBayIHNgIAIAItAAAhDyAAIAJBAmsiAjYCACAAIANBAWs2AhQgBy0AACEHIAAgA0ECayIDNgIUIA8gBHQgAXIgByAEQQhrdHIhASAEQRBrIQQgBUECaiIFIAZHDQALCyAQRQ0AIAAgAkEBazYCACACLQAAIREgACADQQFrNgIUIBEgBHQgAXIhAQsgACABQf8BcSICQY8BSzYCGCAAQQhBB0EIIAFBgICA+AdxQYCAgPgHRhsgCUGPAU0bIgNBCEEHQQggAUGAgPwDcUGAgPwDRhsgAUH/////eE0baiIEQQhBB0EIIAFBgP4BcUGA/gFGGyABQRB2Qf8BcSIFQY8BTRtqIghBCEEHQQggAUH/AHFB/wBGGyABQQh2Qf8BcSIJQY8BTRsgCmpqNgIQIAAgBSADdCABQRh2ciAJIAR0ciACIAh0cq0gCq2GIBKEIhI3AwgLIBKnC8kUAh1/BnsgACgCCCIKIAAoAgRqIQgCQCAAKAIMRQRAIAhBAkgNASADQQBMDQEgACgCACIFIAhBBGsiBkEBdiIMQQJ0IgkgASAKQQJ0aiIHIANBAnQiBGpqQQRqSSAFIAxBA3RqQQhqIgAgB0EEaktxIAUgASAEaiAJakEEakkgAUEEaiAASXFyIRIgCEEESSIUIAJBAUdyIRUgAkEBRiAGQQVLcSEWIAhB/P///wdxIRMgCEEBcSEXIApBAWohDyAIQQNxIREgASAFayEYIAUgCEECdGohGSAFIAhBAWsiAEECdGohGiAMQQFqIhtBfHEiEEEBdCELIAIgCmxBAnQhHCAAQQF2IAJsQQJ0IR0DQCABKAIAIAEgHGooAgAiCUEBakEBdWshBwJAIBQEQCAJIQRBACEGDAELQQAhBgJAAn9BACAWRQ0AGkEAIBINABogCf0RISIgB/0RISH9DAAAAAACAAAABAAAAAYAAAAhJUEAIQADQCABIABBAnRq/QACBCEkIAEgACAPakECdGr9AAIAISMgBSAAQQN0aiIEICH9WgIAAyAEQQhqICQgIyAiICP9DQwNDg8QERITFBUWFxgZGhsiJP2uAf0MAgAAAAIAAAACAAAAAgAAAP2uAUEC/awB/bEBIiL9WgIAACAEQRBqICL9WgIAASAEQRhqICL9WgIAAiAFICX9DAEAAAABAAAAAQAAAAEAAAD9UCIm/RsAQQJ0aiAiICEgIv0NDA0ODxAREhMUFRYXGBkaG/2uAUEB/awBICT9rgEiIf1aAgAAIAUgJv0bAUECdGogIf1aAgABIAUgJv0bAkECdGogIf1aAgACIAUgJv0bA0ECdGogIf1aAgADICX9DAgAAAAIAAAACAAAAAgAAAD9rgEhJSAiISEgIyEiIABBBGoiACAQRw0ACyAi/RsDIQQgIf0bAyEHIBAgG0YNASALIQYgBCEJIBALIQADQCABIABBAWoiCiACbEECdGooAgAhHiABIAAgD2ogAmxBAnRqKAIAIQQgBSAGQQJ0aiIOIAc2AgAgDiAHIB4gBCAJakECakECdWsiB2pBAXUgCWo2AgQgBkECaiEGIAAgDEchHyAEIQkgCiEAIB8NAAsMAQsgCyEGCyAFIAZBAnRqIAc2AgBBfCEAIBcEfyAaIAEgHWooAgAgBEEBakEBdWsiADYCACAAIAdqQQF1IQdBeAVBfAsgGWogBCAHajYCAEEAIQZBACEAQQAhBAJAIBUgGCANQQJ0akEQSXJFBEADQCABIABBAnQiBGogBCAFav0AAgD9CwIAIABBBGoiACATRw0ACyATIgQgCEYNAQsgBCEAIBEEQANAIAEgACACbEECdGogBSAAQQJ0aigCADYCACAAQQFqIQAgBkEBaiIGIBFHDQALCyAEIAhrQXxLDQADQCABIAAgAmxBAnRqIAUgAEECdGooAgA2AgAgASAAQQFqIgQgAmxBAnRqIAUgBEECdGooAgA2AgAgASAAQQJqIgQgAmxBAnRqIAUgBEECdGooAgA2AgAgASAAQQNqIgQgAmxBAnRqIAUgBEECdGooAgA2AgAgAEEEaiIAIAhHDQALCyABQQRqIQEgDUEBaiINIANHDQALDAELAkACQAJAIAhBAWsOAgABAgsgA0EATA0CQQAhAgJAIANBBEkEQCABIQAMAQsgASADQfz///8HcSICQQJ0aiEAA0AgASAGQQJ0aiIEIAT9AAIAIiH9GwBBAm39ESAh/RsBQQJt/RwBICH9GwJBAm39HAIgIf0bA0ECbf0cA/0LAgAgBkEEaiIGIAJHDQALIAIgA0YNAwsDQCAAIAAoAgBBAm02AgAgAEEEaiEAIAJBAWoiAiADRw0ACwwCCyADQQBMDQEgACgCACEJIAIgCmxBAnQhBwNAIAkgASgCACABIAdqIgQoAgBBAWpBAXVrIgA2AgQgCSAAIAQoAgBqIgA2AgAgASAANgIAIAEgAkECdGogCSgCBDYCACABQQRqIQEgBkEBaiIGIANHDQALDAELIAhBA0gNACADQQBMDQAgACgCACIFIAggCEEBcSIURSIGa0EEayIJQQF2IgtBAnQiByABIANBAnQiAGpqSSAFIAtBA3RqQQxqIgQgAUEEaktxIAVBBGogACABIApBAnRqIgBqIAdqQQhqSSAAQQhqIARJcXIhFSACQQFHIAhBBElyIRYgAkEBRiAJQQVLcSEXIAhB/P///wdxIRAgCEEDcSERIAEgBWshGCAFIAhBAnRqQQRrIRkgBSAIQQJrIgBBAnRqIRogC0EBaiISQXxxIgxBAXIhEyAMQQF0QQFyIQsgAiAKbEECdCEbIAAgBmtBAkkhHCAIQQF2QQFrIAJsQQJ0IR0DQCAFIAEoAgAgASAbaiIPIAJBAnRqKAIAIgkgDygCACIAakECakECdWsiByAAajYCAEEBIQQCQCAcBEAgCSEGDAELAkACf0EBIBdFDQAaQQEgFQ0AGiAJ/REhISAH/REhIkEAIQADQCAFIABBA3RqIgcgASAAQQJ0IgRq/QACBCAhIAQgD2r9AAIIIiH9DQwNDg8QERITFBUWFxgZGhsiJCAh/a4B/QwCAAAAAgAAAAIAAAACAAAA/a4BQQL9rAH9sQEiIyAjICIgI/0NDA0ODxAREhMUFRYXGBkaG/2uAUEB/awBICT9rgEiJP0NBAUGBxgZGhsICQoLHB0eH/0LAhQgByAiICT9DQwNDg8QERITAAECAxQVFhcgI/0NAAECAwQFBgcQERITDA0OD/0LAgQgIyEiIABBBGoiACAMRw0ACyAh/RsDIQYgIv0bAyEHIAwgEkYNASALIQQgBiEJIBMLIQADQCABIAAgAmxBAnRqKAIAIR4gDyAAQQFqIgogAmxBAnRqKAIAIQYgBSAEQQJ0aiIOIAc2AgAgDiAHIB4gBiAJakECakECdWsiB2pBAXUgCWo2AgQgBEECaiEEIAAgEkchICAKIQAgBiEJICANAAsMAQsgCyEECyAYIA1BAnRqIQkgBSAEQQJ0aiAHNgIAAkAgFEUEQCAaIAEgHWooAgAgBkEBakEBdWsiACAHakEBdSAGajYCAAwBCyAGIAdqIQALIBkgADYCAEEAIQZBACEAQQAhBAJAIBYgCUEQSXJFBEADQCABIABBAnQiBGogBCAFav0AAgD9CwIAIABBBGoiACAQRw0ACyAQIgQgCEYNAQsgBCEAIBEEQANAIAEgACACbEECdGogBSAAQQJ0aigCADYCACAAQQFqIQAgBkEBaiIGIBFHDQALCyAEIAhrQXxLDQADQCABIAAgAmxBAnRqIAUgAEECdGooAgA2AgAgASAAQQFqIgQgAmxBAnRqIAUgBEECdGooAgA2AgAgASAAQQJqIgQgAmxBAnRqIAUgBEECdGooAgA2AgAgASAAQQNqIgQgAmxBAnRqIAUgBEECdGooAgA2AgAgAEEEaiIAIAhHDQALCyABQQRqIQEgDUEBaiINIANHDQALCws3AQJ/IwBBEGsiASQAIAAEfyABQQxqQSAgABBsIQBBACABKAIMIAAbBUEACyECIAFBEGokACACCxsBAX8gAARAIAAoAggiAQRAIAEQEAsgABAQCwsxAQJ/QQFBDBATIgAEQCAAQQo2AgQgAEEKQQQQEyIBNgIIIAEEQCAADwsgABAQC0EACy8BAX8gAARAIAAoAgQiAQRAIAAoAgAgARECAAsgACgCIBAQIABBADYCICAAEBALCyoAIAAEQCAAKAIwIABBFEEQIAAoAkwbaigCABECACAAQQA2AjAgABAQCwtTAQJ/IABBADYCMCAAIAAoAiA2AiQgASAAKAIAIAAoAhwRCgAhBCAAKAJEIQIgBEUEQCAAIAJBBHI2AkRBAA8LIAAgATcDOCAAIAJBe3E2AkRBAQuGAwIFfwp+IwBBIGsiAyQAAkAgACgCECIFRQRAQQEhAgwBCwJAIAA0AgAiB0IAUw0AIAA0AgQiCEIAUw0AIAA0AggiCUIAUw0AIAA0AgwiCkIAUw0AIAAoAhghACAHQgF9IQwgCEIBfSENIAlCAX0hCSAKQgF9IQoDQCAAIAwgACgCACICrSIHfCAHgCILPgIQIAAgDSAAKAIEIgatIgd8IAeAIg4+AhRCASAANQIoIgeGIg9CAX0iCCAJIAKsIhB8IBB/xHwgB4enIAggC8R8IAeHp2siAkEASARAIAMgAjYCBCADIAQ2AgAgAUEBQdPkACADEA9BACECDAMLIAAgAjYCCCAIIAogBqwiC3wgC3/EfCAHh6cgDsQgD3xCAX0gB4enayICQQBIBEAgAyACNgIUIAMgBDYCECABQQFBmOUAIANBEGoQD0EAIQIMAwsgACACNgIMIABBNGohAEEBIQIgBEEBaiIEIAVHDQALDAELIAFBAUGnM0EAEA8LIANBIGokACACC9cGAQZ/IAAEQAJAIAAoAgAEQCAAKAIMIgEEQCABEC4gACgCDBAQIABBADYCDAsgACgCECIBBEAgARAQIABCADcDEAsgACgCQBAQIABCADcCPAwBCyAAKAIsIgEEQCABEBAgAEEANgIsCyAAKAIgIgEEQCABEBAgAEIANwMgCyAAKAI0IgFFDQAgARAQIABCADcCNAsgACgC0AEQVSAAKAKcASIBBEAgACgCaCAAKAJsbCIDBH8DQCABEC4gAUGMLGohASACQQFqIgIgA0cNAAsgACgCnAEFIAELEBAgAEEANgKcAQsgACgCdCIBBEAgACgCcCICBEBBACEBA0AgACgCdCABQQN0aigCACIDBEAgAxAQIAAoAnAhAgsgAUEBaiIBIAJJDQALIAAoAnQhAQsgAEEANgJwIAEQECAAQQA2AnQLIAAoAogBEBAgAEEANgJ4IABBADYCiAEgACgCZBAQIABBADYCZCAALQC8AUECcUUEQCAAKAKoARAQCyAAQdAAakEAQfAAEBUaIAAoAsABEDIgAEEANgLAASAAKALEARAyIABBADYCwAEgACgCyAEiAQRAIAEoAhwiAgRAIAIQECABQQA2AhwLIAEoAigiAgRAIAEoAiQEQANAIAIgBUEobCIDaigCJCIEBEAgBBAQIAEoAigiAiADakEANgIkCyACIANqKAIQIgQEQCAEEBAgASgCKCICIANqQQA2AhALIAIgA2ooAhgiBARAIAQQECABKAIoIgIgA2pBADYCGAsgBUEBaiIFIAEoAiRJDQALCyACEBAgAUEANgIoCyABEBALIABBADYCyAEgACgCSBAhIABBADYCSCAAKAJMECEgAEEANgJMIAAoAtQBIgMEQAJAIAMoAghFDQAgAygCDARAIANBADYCKANAIAMoAhhBAEoNAAsLIANBATYCECADKAIAEBAgAygCHCICRQ0AA0AgAigCBCEBIAIQECADIAE2AhwgASICDQALCyADKAIkIgIEQCACKAIEIgVBAEoEQEEAIQEDQCACKAIAIAFBDGxqIgQoAggiBgRAIAQoAgQgBhECACACKAIEIQULIAFBAWoiASAFSA0ACwsgAigCABAQIAIQEAsgAxAQCyAAQQA2AtQBIAAQEAsL5gMCCH8EfiAAKAIUKAIAKAIUIAFBzABsaiIJKAIMIgggACgCGCgCGCABQTRsaiIKNQIEIhBCAX0iEiAANQI8fCAQgKciCyAIIAtJGyEMIAkoAggiCCAKNQIAIhFCAX0iEyAANQI4fCARgKciCiAIIApJGyEKIAkoAgQiCCASIAA1AjR8IBCApyILIAggC0sbIQsgCSgCACIIIBMgADUCMHwgEYCnIg0gCCANSxshDUEAIQggACgCICgC0CsgAUG4CGxqKAIUIQ4CQCAJKAIUQQAgAmtBfyACG2oiAkUEQCAKIQAgDSEIIAshAQwBCyADQQFxIAJBAWsiD3QiCSANSQRAIA0gCWutQn8gAq0iEIZCf4V8IBCIpyEIC0EAIQBBACEBIANBAXYgD3QiAyALSQRAIAsgA2utQn8gAq0iEIZCf4V8IBCIpyEBCyAJIApJBEAgCiAJa61CfyACrSIQhkJ/hXwgEIinIQALIAMgDE8EQEEAIQwMAQsgDCAD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IABBADYCPCAAQucHNwI0IABBADYCLCAAQucHNwIkIABBADYCHCAAQucHNwIUIABBADYCDCAAQucHNwIEIABBQGshACACQQRqIgIgA0cNAAsLIAFBA3EiAUUNAEEAIQIDQCAAQQA2AgwgAELnBzcCBCAAQRBqIQAgAkEBaiICIAFHDQALCwv7BQEQfyMAQYACayIIJAACf0EBQRQQEyIGRQRAIAJBAUH0MEEAEA9BAAwBCyAGIAE2AgQgBiAANgIAIAggATYCACAIIAA2AoABA0AgCCAFIg1BAWoiBUECdCIHaiABQQFqQQJtIgM2AgAgCEGAAWogB2ogAEEBakECbSIHNgIAIAQgACABbCIJaiEEIAMhASAHIQAgCUEBSw0ACyAGIAQ2AgggBEUEQCAGEBBBAAwBCyAGIARBEBATIgM2AgwgA0UEQCACQQFB2hpBABAPIAYQEEEADAELIAYgBigCCCILQQR0NgIQIAMhACANBEAgAyAGKAIEIAYoAgBsQQR0aiIEIQEDQAJAIAggDkECdCICaigCACIJQQBMDQAgCUEBayEMQQAhBwJAIAhBgAFqIAJqKAIAIgJBAEwEQEEAIQUgCUEBRwRAIAlB/v///wdxIQoDQCAFIAxGIQ8gBUECaiEFIAEgBCAPGyIEIQEgB0ECaiIHIApHDQALCyAJQQFxDQEgBCEBDAILA0AgBCEFIAIhBANAAkAgACABNgIAIARBAUYEQCAAQRBqIQAgAUEQaiEBDAELIAAgATYCECABQRBqIQEgAEEgaiEAIARBAkohECAEQQJrIQQgEA0BCwsgASAFIAJBBHRqIAcgByAMRnJBAXEiChshBCABIAUgChshASAHQQFqIgcgCUcNAAsMAQsgASAEIAJBBHRqIAUgBSAMRnJBAXEiBRshESABIAQgBRshASARIQQLIA5BAWoiDiANRw0ACwsgAEEANgIAAkAgC0UNACALQQRPBEAgC0F8cSEAQQAhAQNAIANBADYCPCADQucHNwI0IANBADYCLCADQucHNwIkIANBADYCHCADQucHNwIUIANBADYCDCADQucHNwIEIANBQGshAyABQQRqIgEgAEcNAAsLIAtBA3EiAEUNAEEAIQEDQCADQQA2AgwgA0LnBzcCBCADQRBqIQMgAUEBaiIBIABHDQALCyAGCyESIAhBgAJqJAAgEgtTAQF/An8gAC0ADEH/AUYEQCAAQoD+g4DwADcCDEEAIAAoAggiASAAKAIETw0BGiAAIAFBAWo2AgggACABLQAAQYD+A3I2AgwLIABBADYCEEEBCwt+AgF/AX4gAL0iA0I0iKdB/w9xIgJB/w9HBHwgAkUEQCABIABEAAAAAAAAAABhBH9BAAUgAEQAAAAAAADwQ6IgARBlIQAgASgCAEFAags2AgAgAA8LIAEgAkH+B2s2AgAgA0L/////////h4B/g0KAgICAgICA8D+EvwUgAAsLSQEBfwJAQQFBLBATIgEEQCABQQA2AhACQCAAQQBMBEAgAUEBQQgQEyIANgIkIABFDQEMAwsgAUEANgIMCyABEBALQQAhAQsgAQuRAgAgAEUEQEEADwsCfwJAIAFB/wBNDQACQEGU0AEoAgAoAgBFBEAgAUGAf3FBgL8DRg0CDAELIAFB/w9NBEAgACABQT9xQYABcjoAASAAIAFBBnZBwAFyOgAAQQIMAwsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMMAwsgAUGAgARrQf//P00EQCAAIAFBP3FBgAFyOgADIAAgAUESdkHwAXI6AAAgACABQQZ2QT9xQYABcjoAAiAAIAFBDHZBP3FBgAFyOgABQQQMAwsLQZTHAUEZNgIAQX8MAQsgACABOgAAQQELC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAwALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC3MBBn8gACgCACIDLAAAQTBrIgFBCUsE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AyAAQRh2NgIUIAMgBDYCECADIABBCHZB/wFxNgIcIAMgAEEQdkH/AXE2AhggAkEBQc31ACADQRBqEA8MBwsgBSAITQRAIAYhBAwECyAFIQggBiAFEBciBA0DIAYQECACQQFB/w9BABAPQQAMBwsgBEECcUUEQCACQQFBwg9BABAPIAYQEEEADAcLIAAgBEH/////B3I2AmQgASAHIAVrrSINIAIgASgCKBEIACANUQ0DIAAtAGRBCHFFDQEgAkECQZIcQQAQDwsgBhAQQQEMBQsgAkEBQZIcQQAQDyAGEBBBAAwECyABIAQgBSACEBogBUcEQCACQQFBxBxBABAPIAQQEEEADAQLIAAgBCIGIAUgAiAKKAIEEQEADQALIAQQEEEADAILIAJBAUGiJUEAEA9BAAwBCyAGEBBBAAshDCADQfAAaiQAIAwL5gEBBn8gACgCCEE1IAIQJARAAkAgACgCCCIGKAIAIQMgBigCCCEFAkACQAJ/AkAgAwRAQQEhBCADQQFxIQcgA0EBRw0BQQAMAgsgBkEANgIADAILIANBfnEhAwNAAn9BACAERQ0AGkEAIAAgASACIAUoAgARAABFDQAaIAAgASACIAUoAgQRAABBAEcLIQQgBUEIaiEFIAhBAmoiCCADRw0ACyAERQshAyAHBEAgAw0CIAAgASACIAUoAgARAABBAEchBAsgBkEANgIAIARFDQILIAAoAgAaQQEPCyAGQQA2AgALC0EACwoAIAAoAgAaQQALFAAgACgCACIABEAgACABNgK4AQsLIQAgACgCACABEFMgAEEAOgB8IAAgASgCuEBBAXE2AoABCzIAIAJFBEBBAA8LIAAoAgAgASACIAMQSEUEQCADQQFBqS9BABAPQQAPCyAAIAIgAxBxC2kCAn8BfCMAQRBrIgMkACACBEADQCAAIANBCGoQRCABAn8gAysDCCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAs2AgAgAUEEaiEBIABBCGohACAEQQFqIgQgAkcNAAsLIANBEGokAAuEAQICfwF9IwBBEGsiAyQAIAIEQANAIAMgAC0AADoADyADIAAtAAE6AA4gAyAALQACOgANIAMgAC0AAzoADCABAn8gAyoCDCIFi0MAAABPXQRAIAWoDAELQYCAgIB4CzYCACABQQRqIQEgAEEEaiEAIARBAWoiBCACRw0ACwsgA0EQaiQAC0sBAn8jAEEQayIDJAAgAgRAA0AgACADQQxqQQQQESABIAMoAgw2AgAgAUEEaiEBIABBBGohACAEQQFqIgQgAkcNAAsLIANBEGokAAtLAQJ/IwBBEGsiAyQAIAIEQANAIAAgA0EMakECEBEgASADKAIMNgIAIAFBBGohASAAQQJqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALSgECfyMAQRBrIgMkACACBEADQCAAIANBCGoQRCABIAMrAwi2OAIAIAFBBGohASAAQQhqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALaAECfyMAQRBrIgMkACACBEADQCADIAAtAAA6AA8gAyAALQABOgAOIAMgAC0AAjoADSADIAAtAAM6AAwgASADKgIMOAIAIAFBBGohASAAQQRqIQAgBEEBaiIEIAJHDQALCyADQRBqJAALTAECfyMAQRBrIgMkACACBEADQCAAIANBDGpBBBARIAEgAygCDLM4AgAgAUEEaiEBIABBBGohACAEQQFqIgQgAkcNAAsLIANBEGokAAtMAQJ/IwBBEGsiAyQAIAIEQANAIAAgA0EMakECEBEgASADKAIMszgCACABQQRqIQEgAEECaiEAIARBAWoiBCACRw0ACwsgA0EQaiQAC6oIAg1/AXsjAEEQayIIJAACfyAAKAIIQRBGBEAgACgCnAEgACgCzAFBjCxsagwBCyAAKAIMCyEJAkAgAkUEQCADQQFB8B9BABAPDAELIAAoAkghBkEBIQQgASAIQQhqQQEQESAIKAIIIgVBAk8EQCADQQJBxsgAQQAQDwwBCyACIAVBAWpHBEBBACEEIANBAkHwH0EAEA8MAQsCQCAGKAIQIgNFDQAgCSgC0CshBCADQQhPBEAgA0F4cSEGQQAhAgNAIARBADYCvEMgBEEANgKEOyAEQQA2AswyIARBADYClCogBEEANgLcISAEQQA2AqQZIARBADYC7BAgBEEANgK0CCAEQcDDAGohBCACQQhqIgIgBkcNAAsLIANBB3EiA0UNAEEAIQIDQCAEQQA2ArQIIARBuAhqIQQgAkEBaiICIANHDQALCyAJKALoKyICBH8gAhAQIAlBADYC6CsgCCgCCAUgBQtFBEBBASEEDAELA0AgAUEBaiIBIAhBDGpBARARAkAgCSgCgCxF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KT0ALgAobnVsbCkAKCVkLCVkKSAAJXN9CgAJCSB9CgBbREVWXSBEdW1wIGFuIGltYWdlX2NvbXBfaGVhZGVyIHN0cnVjdCB7CgBbREVWXSBEdW1wIGFuIGltYWdlX2hlYWRlciBzdHJ1Y3QgewoASW1hZ2UgaW5mbyB7CgAJIGRlZmF1bHQgdGlsZSB7CgAlcwkgY29tcG9uZW50ICVkIHsKAAkJIGNvbXAgJWQgewoACSBUaWxlIGluZGV4OiB7CgAJIE1hcmtlciBsaXN0OiB7CgBDb2Rlc3RyZWFtIGluZGV4IGZyb20gbWFpbiBoZWFkZXI6IHsKAENvZGVzdHJlYW0gaW5mbyBmcm9tIG1haW4gaGVhZGVyOiB7CgBTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveAoARm91bmQgYSBtaXNwbGFjZWQgJyVjJWMlYyVjJyBib3ggb3V0c2lkZSBqcDJoIGJveAoATWFsZm9ybWVkIEpQMiBmaWxlIGZvcm1hdDogZmlyc3QgYm94IG11c3QgYmUgSlBFRyAyMDAwIHNpZ25hdHVyZSBib3gKAE1hbGZvcm1lZCBKUDIgZmlsZSBmb3JtYXQ6IHNlY29uZCBib3ggbXVzdCBiZSBmaWxlIHR5cGUgYm94CgBOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUganBlZzIwMDAgYm94CgBOb3QgZW5vdWdoIG1lbW9yeSB3aXRoIEZUWVAgQm94CgBBIG1hcmtlciBJRCB3YXMgZXhwZWN0ZWQgKDB4ZmYtLSkgaW5zdGVhZCBvZiAlLjh4CgAJCSBtY3Q9JXgKAAkJCSBjYmxrc3R5PSUjeAoACQkJIGNzdHk9JSN4CgAJCSBwcmc9JSN4CgBJbnRlZ2VyIG92ZXJmbG93CgAJIHRkeD0ldSwgdGR5PSV1CgAJIHR3PSV1LCB0aD0ldQoACSB0eDA9JXUsIHR5MD0ldQoASW52YWxpZCBjb21wb25lbnQgaW5kZXg6ICV1CgBTdHJlYW0gdG9vIHNob3J0CgBNYXJrZXIgaGFuZGxlciBmdW5jdGlvbiBmYWlsZWQgdG8gcmVhZCB0aGUgbWFya2VyIHNlZ21lbnQKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciBjdXJyZW50IHByZWNpbmN0IGNvZGVibG9jayBlbGVtZW50CgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQKAEVycm9yIHJlYWRpbmcgU1FjZCBvciBTUWNjIGVsZW1lbnQKAEEgQlBDQyBoZWFkZXIgYm94IGlzIGF2YWlsYWJsZSBhbHRob3VnaCBCUEMgZ2l2ZW4gYnkgdGhlIElIRFIgYm94ICglZCkgaW5kaWNhdGUgY29tcG9uZW50cyBiaXQgZGVwdGggaXMgY29uc3RhbnQKAEVycm9yIHdpdGggU0laIG1hcmtlcjogaWxsZWdhbCB0aWxlIG9mZnNldAoASW52YWxpZCBwcmVjaW5jdAoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGJhbmQgcHJlY2ludHMKAEZhaWxlZCB0byBkZWNvZGUgYWxsIHVzZWQgY29tcG9uZW50cwoAU2l6ZSBvZiBjb2RlIGJsb2NrIGRhdGEgZXhjZWVkcyBzeXN0ZW0gbGltaXRzCgBTaXplIG9mIHRpbGUgZGF0YSBleGNlZWRzIHN5c3RlbSBsaW1pdHMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSBNQ1QgbWFya2VycwoAQ29ycnVwdGVkIFBQTSBtYXJrZXJzCgBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdGlsZSByZXNvbHV0aW9ucwoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGNvbGxlY3Rpb25zCgBJbnZhbGlkIFBDTFIgYm94LiBSZXBvcnRzIDAgcGFsZXR0ZSBjb2x1bW5zCgBXZSBkbyBub3Qgc3VwcG9ydCBST0kgaW4gZGVjb2RpbmcgSFQgY29kZWJsb2NrcwoAQ2Fubm90IGhhbmRsZSBib3ggb2YgdW5kZWZpbmVkIHNpemVzCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgd2l0aG91dCBzYW1lIG51bWJlciBvZiBpbmRpeGVzCgBJbnZhbGlkIHRpbGVjLT53aW5feHh4IHZhbHVlcwoAQ2Fubm90IGhhbmRsZSBib3ggb2YgbGVzcyB0aGFuIDggYnl0ZXMKAENhbm5vdCBoYW5kbGUgWEwgYm94IG9mIGxlc3MgdGhhbiAxNiBieXRlcwoAQ29tcG9uZW50IGluZGV4ICV1IHVzZWQgc2V2ZXJhbCB0aW1lcwoASW52YWxpZCBQQ0xSIGJveC4gUmVwb3J0cyAlZCBlbnRyaWVzCgBOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGFnLXRyZWUgbm9kZXMKAENhbm5vdCB0YWtlIGluIGNoYXJnZSBtY3QgZGF0YSB3aXRoaW4gbXVsdGlwbGUgTUNUIHJlY29yZHMKAENhbm5vdCBkZWNvZGUgdGlsZSwgbWVtb3J5IGVycm9yCgBvcGpfajJrX2FwcGx5X25iX3RpbGVfcGFydHNfY29ycmVjdGlvbiBlcnJvcgoAUHJvYmxlbSB3aXRoIHNraXBwaW5nIEpQRUcyMDAwIGJveCwgc3RyZWFtIGVycm9yCgBQcm9ibGVtIHdpdGggcmVhZGluZyBKUEVHMjAwMCBib3gsIHN0cmVhbSBlcnJvcgoAVW5rbm93biBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCB0bCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBtaCBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHRha2UgaW4gY2hhcmdlIFNJWiBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUFBUIG1hcmtlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBQUFQgbWFya2VyCgBFcnJvciByZWFkaW5nIFNPVCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUExUIG1hcmtlcgoARXJyb3IgcmVhZGluZyBNQ1QgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIE1DVCBtYXJrZXIKAE5vdCBlbm91Z2ggc3BhY2UgZm9yIGV4cGVjdGVkIFNPUCBtYXJrZXIKAEV4cGVjdGVkIFNPUCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgTUNPIG1hcmtlcgoARXJyb3IgcmVhZGluZyBSR04gbWFya2VyCgBFcnJvciByZWFkaW5nIFBQTSBtYXJrZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBNIG1hcmtlcgoARXJyb3IgcmVhZGluZyBUTE0gbWFya2VyCgBFcnJvciByZWFkaW5nIFBMTSBtYXJrZXIKAE5vdCBlbm91Z2ggc3BhY2UgZm9yIGV4cGVjdGVkIEVQSCBtYXJrZXIKAEV4cGVjdGVkIEVQSCBtYXJrZXIKAEVycm9yIHJlYWRpbmcgQ1JHIG1hcmtlcgoAVW5rbm93biBwcm9ncmVzc2lvbiBvcmRlciBpbiBDT0QgbWFya2VyCgBVbmtub3duIFNjb2QgdmFsdWUgaW4gQ09EIG1hcmtlcgoARXJyb3IgcmVhZGluZyBDT0QgbWFya2VyCgBFcnJvciByZWFkaW5nIFFDRCBtYXJrZXIKAENycm9yIHJlYWRpbmcgQ0JEIG1hcmtlcgoARXJyb3IgcmVhZGluZyBQT0MgbWFya2VyCgBFcnJvciByZWFkaW5nIENPQyBtYXJrZXIKAEVycm9yIHJlYWRpbmcgUUNDIG1hcmtlcgoARXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIE1DQyBtYXJrZXIKAHJlcXVpcmVkIFNJWiBtYXJrZXIgbm90IGZvdW5kIGluIG1haW4gaGVhZGVyCgByZXF1aXJlZCBDT0QgbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlcgoAcmVxdWlyZWQgUUNEIG1hcmtlciBub3QgZm91bmQgaW4gbWFpbiBoZWFkZXIKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSBqcGVnMjAwMCBmaWxlIGhlYWRlcgoATm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBoZWFkZXIKAEVycm9yIHdpdGggSlAgU2lnbmF0dXJlIDogYmFkIG1hZ2ljIG51bWJlcgoASW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgY3VycmVudCBudW1iZXIgb2YgdGlsZS1wYXJ0ICglZCksIGdpdmluZyB1cAoASW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgcHJldmlvdXMgbnVtYmVyIG9mIHRpbGUtcGFydCAoJWQpLCBnaXZpbmcgdXAKAEluIFNPVCBtYXJrZXIsIFRQU290ICglZCkgaXMgbm90IHZhbGlkIHJlZ2FyZHMgdG8gdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHRpbGUtcGFydCAoaGVhZGVyKSAoJWQpLCBnaXZpbmcgdXAKAHRpbGVzIHJlcXVpcmUgYXQgbGVhc3Qgb25lIHJlc29sdXRpb24KAE1hcmtlciBpcyBub3QgY29tcGxpYW50IHdpdGggaXRzIHBvc2l0aW9uCgBQcm9ibGVtIHdpdGggc2VlayBmdW5jdGlvbgoARXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50LCBJbnZhbGlkIGNibGt3L2NibGtoIGNvbWJpbmF0aW9uCgBJbnZhbGlkIG11bHRpcGxlIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbgoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIG90aGVyIHRoYW4gYXJyYXkgZGVjb3JyZWxhdGlvbgoAVG9vIGxhcmdlIHZhbHVlIGZvciBOcHBtCgBOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgTnBwbQoAYmFkIHBsYWNlZCBqcGVnIGNvZGVzdHJlYW0KAAkgTWFpbiBoZWFkZXIgc3RhcnQgcG9zaXRpb249JWxsaQoJIE1haW4gaGVhZGVyIGVuZCBwb3NpdGlvbj0lbGxpCgBNYXJrZXIgc2l6ZSBpbmNvbnNpc3RlbnQgd2l0aCBzdHJlYW0gbGVuZ3RoCgBUaWxlIHBhcnQgbGVuZ3RoIHNpemUgaW5jb25zaXN0ZW50IHdpdGggc3RyZWFtIGxlbmd0aAoAQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGRhdGEgc3Bhbm5pbmcKAFdyb25nIGZsYWcKAEVycm9yIHdpdGggRlRZUCBzaWduYXR1cmUgQm94IHNpemUKAEVycm9yIHdpdGggSlAgc2lnbmF0dXJlIEJveCBzaXplCgBJbnZhbGlkIHByZWNpbmN0IHNpemUKAEluY29uc2lzdGVudCBtYXJrZXIgc2l6ZQoASW52YWxpZCBtYXJrZXIgc2l6ZQoARXJyb3Igd2l0aCBTSVogbWFya2VyIHNpemUKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBhIG5ldyB2YWxpZGF0aW9uIHByb2NlZHVyZQoATm90IGVub3VnaCBtZW1vcnkgdG8gZGVjb2RlIHRpbGUKAEZhaWxlZCB0byBkZWNvZGUgdGhlIGNvZGVzdHJlYW0gaW4gdGhlIEpQMiBmaWxlCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgd2l0aCBpbmRpeCBzaHVmZmxlCgBDYW5ub3QgYWxsb2NhdGUgVGllciAxIGhhbmRsZQoATm8gZGVjb2RlZCBhcmVhIHBhcmFtZXRlcnMsIHNldCB0aGUgZGVjb2RlZCBhcmVhIHRvIHRoZSB3aG9sZSBpbWFnZQoATm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIFRhZy10cmVlCgBOb3QgZW5vdWdoIG1lbW9yeSB0byByZWluaXRpYWxpemUgdGhlIHRhZyB0cmVlCgBFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQsIEludmFsaWQgdHJhbnNmb3JtYXRpb24gZm91bmQKAEVycm9yIHJlYWRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudC4gVW5zdXBwb3J0ZWQgTWl4ZWQgSFQgY29kZS1ibG9jayBzdHlsZSBmb3VuZAoAVGlsZSBZIGNvb3JkaW5hdGVzIGFyZSBub3Qgc3VwcG9ydGVkCgBUaWxlIFggY29vcmRpbmF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQKAEltYWdlIGNvb3JkaW5hdGVzIGFib3ZlIElOVF9NQVggYXJlIG5vdCBzdXBwb3J0ZWQKAEpQRUcyMDAwIEhlYWRlciBib3ggbm90IHJlYWQgeWV0LCAnJWMlYyVjJWMnIGJveCB3aWxsIGJlIGlnbm9yZWQKAG9wal9qMmtfbWVyZ2VfcHB0KCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQKAE5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgU09UIG1hcmtlci4gVGlsZSBpbmRleCBhbGxvY2F0aW9uIGZhaWxlZAoASWdub3JpbmcgaWhkciBib3guIEZpcnN0IGloZHIgYm94IGFscmVhZHkgcmVhZAoAWnBwdCAldSBhbHJlYWR5IHJlYWQKAFpwcG0gJXUgYWxyZWFkeSByZWFkCgBQVEVSTSBjaGVjayBmYWlsdXJlOiAlZCBzeW50aGV0aXplZCAweEZGIG1hcmtlcnMgcmVhZAoACQkJIGNibGt3PTJeJWQKAAkJCSBjYmxraD0yXiVkCgAJCQkgcW50c3R5PSVkCgAlcyBkeD0lZCwgZHk9JWQKAAkJCSByb2lzaGlmdD0lZAoACQkJIG51bWdiaXRzPSVkCgAJCSBudW1sYXllcnM9JWQKACVzIG51bWNvbXBzPSVkCgBvcGpfanAyX2FwcGx5X2NkZWY6IGFjbj0lZCwgbnVtY29tcHM9JWQKAG9wal9qcDJfYXBwbHlfY2RlZjogY249JWQsIG51bWNvbXBzPSVkCgAJCQkgbnVtcmVzb2x1dGlvbnM9JWQKAAkJIHR5cGU9JSN4LCBwb3M9JWxsaSwgbGVuPSVkCgAlcyBzZ25kPSVkCgAJCQkgcW1mYmlkPSVkCgAlcyBwcmVjPSVkCgAJCSBuYiBvZiB0aWxlLXBhcnQgaW4gdGlsZSBbJWRdPSVkCgAlcyB4MT0lZCwgeTE9JWQKACVzIHgwPSVkLCB5MD0lZAoARmFpbGVkIHRvIGRlY29kZSB0aWxlICVkLyVkCgBTZXR0aW5nIGRlY29kaW5nIGFyZWEgdG8gJWQsJWQsJWQsJWQKAEZhaWxlZCB0byBkZWNvZGUgY29tcG9uZW50ICVkCgBJbnZhbGlkIHZhbHVlIGZvciBudW1yZXNvbHV0aW9ucyA6ICVkLCBtYXggdmFsdWUgaXMgc2V0IGluIG9wZW5qcGVnLmggYXQgJWQKAEludmFsaWQgY29tcG9uZW50IG51bWJlcjogJWQsIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgJWQKAFRvbyBtYW55IFBPQ3MgJWQKAEludmFsaWQgdGlsZSBudW1iZXIgJWQKAEludmFsaWQgdGlsZSBwYXJ0IGluZGV4IGZvciB0aWxlIG51bWJlciAlZC4gR290ICVkLCBleHBlY3RlZCAlZAoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBudW1iZXIgb2YgY29tcG9uZW50IGlzIGlsbGVnYWwgLT4gJWQKAE5vdCBlbm91Z2ggbWVtb3J5IGZvciBjaWVsYWIKAENhbm5vdCBhbGxvY2F0ZSBjYmxrLT5kZWNvZGVkX2RhdGEKAEZhaWxlZCB0byBtZXJnZSBQUFQgZGF0YQoARmFpbGVkIHRvIG1lcmdlIFBQTSBkYXRhCgBJbnZhbGlkIG51bWJlciBvZiBsYXllcnMgaW4gQ09EIG1hcmtlciA6ICVkIG5vdCBpbiByYW5nZSBbMS02NTUzNV0KACVzOiVkOmNvbG9yX2NteWtfdG9fcmdiCglDQU4gTk9UIENPTlZFUlQKACVzOiVkOmNvbG9yX2VzeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgAlczolZDpjb2xvcl9zeWNjX3RvX3JnYgoJQ0FOIE5PVCBDT05WRVJUCgBTdHJlYW0gdG9vIHNob3J0LCBleHBlY3RlZCBTT1QKAFVuYWJsZSB0byBzZXQgdDEgaGFuZGxlIGFzIFRMUwoAU3RyZWFtIGRvZXMgbm90IGVuZCB3aXRoIEVPQwoAQ2Fubm90IGhhbmRsZSBib3ggc2l6ZXMgaGlnaGVyIHRoYW4gMl4zMgoAb3BqX3BpX25leHRfbHJjcCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcmxjcCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfY3BybCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcGNybCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3BpX25leHRfcnBjbCgpOiBpbnZhbGlkIGNvbXBubzAvY29tcG5vMQoAb3BqX3QxX2RlY29kZV9jYmxrKCk6IHVuc3VwcG9ydGVkIGJwbm9fcGx1c19vbmUgPSAlZCA+PSAzMQoARmFpbGVkIHRvIGRlY29kZSB0aWxlIDEvMQoASW5zdWZmaWNpZW50IGRhdGEgZm9yIENNQVAgYm94LgoATmVlZCB0byByZWFkIGEgUENMUiBib3ggYmVmb3JlIHRoZSBDTUFQIGJveC4KAEluc3VmZmljaWVudCBkYXRhIGZvciBDREVGIGJveC4KAE51bWJlciBvZiBjaGFubmVsIGRlc2NyaXB0aW9uIGlzIGVxdWFsIHRvIHplcm8gaW4gQ0RFRiBib3guCgBTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveDogbm8gJ2loZHInIGJveC4KAE5vbiBjb25mb3JtYW50IGNvZGVzdHJlYW0gVFBzb3Q9PVROc290LgoAU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3g6IGJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LgoAQm94IGxlbmd0aCBpcyBpbmNvbnNpc3RlbnQuCgBSZXNvbHV0aW9uIGZhY3RvciBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gcmVzb2x1dGlvbiBpbiB0aGUgY29tcG9uZW50LgoAQ29tcG9uZW50IG1hcHBpbmcgc2VlbXMgd3JvbmcuIFRyeWluZyB0byBjb3JyZWN0LgoASW5jb21wbGV0ZSBjaGFubmVsIGRlZmluaXRpb25zLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gSW52YWxpZCBjb2RlYmxvY2sgbGVuZ3RoIHZhbHVlcy4KAFdlIGRvIG5vdCBzdXBwb3J0IG1vcmUgdGhhbiAzIGNvZGluZyBwYXNzZXMgaW4gYW4gSFQgY29kZWJsb2NrOyBUaGlzIGNvZGVibG9ja3MgaGFzICVkIHBhc3Nlcy4KAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFRoZXJlIGFyZSAlZCB6ZXJvIGJpdHBsYW5lcyBpbiAlZCBiaXRwbGFuZXMuCgBDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgdHJhbnNmb3JtYXRpb24gc3RhZ2VzLgoAVW5rbm93biBtYXJrZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgYW5kIGdlbmVyYXRlZCBlcnJvci4KAENvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfc2V0dXBfZGVjb2RlciBmdW5jdGlvbiBpcyBub3QgYSBkZWNvbXByZXNzb3IgaGFuZGxlci4KAENvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfcmVhZF9oZWFkZXIgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuCgBUaWxlcyBkb24ndCBhbGwgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24uIFNraXAgdGhlIE1DVCBzdGVwLgoATnVtYmVyIG9mIGNvbXBvbmVudHMgKCVkKSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBhIE1DVC4gU2tpcCB0aGUgTUNUIHN0ZXAuCgBKUDIgYm94IHdoaWNoIGFyZSBhZnRlciB0aGUgY29kZXN0cmVhbSB3aWxsIG5vdCBiZSByZWFkIGJ5IHRoaXMgZnVuY3Rpb24uCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBXaGVuIHRoZSBudW1iZXIgb2YgemVybyBwbGFuZXMgYml0cGxhbmVzIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgYml0cGxhbmVzLCBvbmx5IHRoZSBjbGVhbnVwIHBhc3MgbWFrZXMgc2Vuc2UsIGJ1dCB3ZSBoYXZlICVkIHBhc3NlcyBpbiB0aGlzIGNvZGVibG9jay4gVGhlcmVmb3JlLCBvbmx5IHRoZSBjbGVhbnVwIHBhc3Mgd2lsbCBiZSBkZWNvZGVkLiBUaGlzIG1lc3NhZ2Ugd2lsbCBub3QgYmUgZGlzcGxheWVkIGFnYWluLgoASW1hZ2UgaGFzIGxlc3MgY29tcG9uZW50cyB0aGFuIGNvZGVzdHJlYW0uCgBOZWVkIHRvIGRlY29kZSB0aGUgbWFpbiBoZWFkZXIgYmVmb3JlIGJlZ2luIHRvIGRlY29kZSB0aGUgcmVtYWluaW5nIGNvZGVzdHJlYW0uCgBQc290IHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbGUtcGFydCBpcyBlcXVhbCB0byB6ZXJvLCB3ZSBhc3N1bWluZyBpdCBpcyB0aGUgbGFzdCB0aWxlLXBhcnQgb2YgdGhlIGNvZGVzdHJlYW0uCgBBIG1hbGZvcm1lZCBjb2RlYmxvY2sgdGhhdCBoYXMgbW9yZSB0aGFuIG9uZSBjb2RpbmcgcGFzcywgYnV0IHplcm8gbGVuZ3RoIGZvciAybmQgYW5kIHBvdGVudGlhbGx5IHRoZSAzcmQgcGFzcyBpbiBhbiBIVCBjb2RlYmxvY2suCgAJCQkgdGlsZS1wYXJ0WyVkXTogc3Rhcl9wb3M9JWxsaSwgZW5kX2hlYWRlcj0lbGxpLCBlbmRfcG9zPSVsbGkuCgBUaWxlICV1IGhhcyBUUHNvdCA9PSAwIGFuZCBUTnNvdCA9PSAwLCBidXQgbm8gb3RoZXIgdGlsZS1wYXJ0cyB3ZXJlIGZvdW5kLiBFT0MgaXMgYWxzbyBtaXNzaW5nLgoAQ29tcG9uZW50ICVkIGRvZXNuJ3QgaGF2ZSBhIG1hcHBpbmcuCgBBIGNvbmZvcm1pbmcgSlAyIHJlYWRlciBzaGFsbCBpZ25vcmUgYWxsIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveGVzIGFmdGVyIHRoZSBmaXJzdCwgc28gd2UgaWdub3JlIHRoaXMgb25lLgoAVGhlIHNpZ25hdHVyZSBib3ggbXVzdCBiZSB0aGUgZmlyc3QgYm94IGluIHRoZSBmaWxlLgoAVGhlICBib3ggbXVzdCBiZSB0aGUgZmlyc3QgYm94IGluIHRoZSBmaWxlLgoAVGhlIGZ0eXAgYm94IG11c3QgYmUgdGhlIHNlY29uZCBib3ggaW4gdGhlIGZpbGUuCgBGYWlsZWQgdG8gZGVjb2RlLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gSW5jb3JyZWN0IE1FTCBzZWdtZW50IHNlcXVlbmNlLgoAQ29tcG9uZW50ICVkIGlzIG1hcHBlZCB0d2ljZS4KAE9ubHkgb25lIENNQVAgYm94IGlzIGFsbG93ZWQuCgBXZSBuZWVkIGFuIGltYWdlIHByZXZpb3VzbHkgY3JlYXRlZC4KAElIRFIgYm94X21pc3NpbmcuIFJlcXVpcmVkLgoASlAySCBib3ggbWlzc2luZy4gUmVxdWlyZWQuCgBOb3Qgc3VyZSBob3cgdGhhdCBoYXBwZW5lZC4KAE1haW4gaGVhZGVyIGhhcyBiZWVuIGNvcnJlY3RseSBkZWNvZGVkLgoAVGlsZSAlZC8lZCBoYXMgYmVlbiBkZWNvZGVkLgoASGVhZGVyIG9mIHRpbGUgJWQgLyAlZCBoYXMgYmVlbiByZWFkLgoARW1wdHkgU09UIG1hcmtlciBkZXRlY3RlZDogUHNvdD0lZC4KAERpcmVjdCB1c2UgYXQgIyVkIGhvd2V2ZXIgcGNvbD0lZC4KAEltcGxlbWVudGF0aW9uIGxpbWl0YXRpb246IGZvciBwYWxldHRlIG1hcHBpbmcsIHBjb2xbJWRdIHNob3VsZCBiZSBlcXVhbCB0byAlZCwgYnV0IGlzIGVxdWFsIHRvICVkLgoASW52YWxpZCBjb21wb25lbnQvcGFsZXR0ZSBpbmRleCBmb3IgZGlyZWN0IG1hcHBpbmcgJWQuCgBJbnZhbGlkIHZhbHVlIGZvciBjbWFwWyVkXS5tdHlwID0gJWQuCgBQc290IHZhbHVlIGlzIG5vdCBjb3JyZWN0IHJlZ2FyZHMgdG8gdGhlIEpQRUcyMDAwIG5vcm06ICVkLgoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gVkxDIGNvZGUgcHJvZHVjZXMgc2lnbmlmaWNhbnQgc2FtcGxlcyBvdXRzaWRlIHRoZSBjb2RlYmxvY2sgYXJlYS4KAFVuZXhwZWN0ZWQgT09NLgoAMzIgYml0cyBhcmUgbm90IGVub3VnaCB0byBkZWNvZGUgdGhpcyBjb2RlYmxvY2ssIHNpbmNlIHRoZSBudW1iZXIgb2YgYml0cGxhbmUsICVkLCBpcyBsYXJnZXIgdGhhbiAzMC4KAEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTE9JWQpIHNob3VsZCBiZSA+IDAuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIHNob3VsZCBiZSA+IDAuCgBVcCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTA9JWQpIHNob3VsZCBiZSA+PSAwLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIHNob3VsZCBiZSA+PSAwLgoARXJyb3IgcmVhZGluZyBQUFQgbWFya2VyOiBwYWNrZXQgaGVhZGVyIGhhdmUgYmVlbiBwcmV2aW91c2x5IGZvdW5kIGluIHRoZSBtYWluIGhlYWRlciAoUFBNIG1hcmtlcikuCgBTdGFydCB0byByZWFkIGoyayBtYWluIGhlYWRlciAoJWxsZCkuCgBCb3R0b20gcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZc2l6PSVkKS4KAFVwIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWXNpej0lZCkuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLgoATGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLgoAQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWU9zaXo9JWQpLgoAVXAgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZT3Npej0lZCkuCgBSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhPc2l6PSVkKS4KAExlZnQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChYT3Npej0lZCkuCgBTaXplIHggb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0udz0lZCkuCgBTaXplIHkgb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0uaD0lZCkuCgBUaWxlIHJlYWQsIGRlY29kZWQgYW5kIHVwZGF0ZWQgaXMgbm90IHRoZSBkZXNpcmVkIG9uZSAoJWQgdnMgJWQpLgoASW52YWxpZCBjb21wb25lbnQgaW5kZXggJWQgKD49ICVkKS4KAG9wal9yZWFkX2hlYWRlcigpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIG9wal9zZXRfZGVjb2RlZF9jb21wb25lbnRzKCkuCgBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIGluIG9wal9qcDJfYXBwbHlfcGNscigpLgoAaW1hZ2UtPmNvbXBzWyVkXS5kYXRhID09IE5VTEwgaW4gb3BqX2pwMl9hcHBseV9wY2xyKCkuCgBpbnZhbGlkIGJveCBzaXplICVkICgleCkKAEZhaWwgdG8gcmVhZCB0aGUgY3VycmVudCBtYXJrZXIgc2VnbWVudCAoJSN4KQoARXJyb3Igd2l0aCBTSVogbWFya2VyOiBJSERSIHcoJXUpIGgoJXUpIHZzLiBTSVogdygldSkgaCgldSkKAEVycm9yIHJlYWRpbmcgQ09DIG1hcmtlciAoYmFkIG51bWJlciBvZiBjb21wb25lbnRzKQoASW52YWxpZCBudW1iZXIgb2YgdGlsZXMgOiAldSB4ICV1IChtYXhpbXVtIGZpeGVkIGJ5IGpwZWcyMDAwIG5vcm0gaXMgNjU1MzUgdGlsZXMpCgBJbnZhbGlkIG51bWJlciBvZiBjb21wb25lbnRzIChpaGRyKQoATm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGltYWdlIGhlYWRlciAoaWhkcikKAFdyb25nIHZhbHVlcyBmb3I6IHcoJWQpIGgoJWQpIG51bWNvbXBzKCVkKSAoaWhkcikKAEludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBkeD0ldSBkeT0ldSAoc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMjU1IGFjY29yZGluZyB0byB0aGUgSlBFRzIwMDAgbm9ybSkKAEJhZCBpbWFnZSBoZWFkZXIgYm94IChiYWQgc2l6ZSkKAEJhZCBDT0xSIGhlYWRlciBib3ggKGJhZCBzaXplKQoAQmFkIEJQQ0MgaGVhZGVyIGJveCAoYmFkIHNpemUpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG5lZ2F0aXZlIG9yIHplcm8gaW1hZ2Ugc2l6ZSAoJWxsZCB4ICVsbGQpCgBza2lwOiBzZWdtZW50IHRvbyBsb25nICglZCkgd2l0aCBtYXggKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKQoAcmVhZDogc2VnbWVudCB0b28gbG9uZyAoJWQpIHdpdGggbWF4ICglZCkgZm9yIGNvZGVibG9jayAlZCAocD0lZCwgYj0lZCwgcj0lZCwgYz0lZCkKAERlc3BpdGUgSlAyIEJQQyE9MjU1LCBwcmVjaXNpb24gYW5kL29yIHNnbmQgdmFsdWVzIGZvciBjb21wWyVkXSBpcyBkaWZmZXJlbnQgdGhhbiBjb21wWzBdOgogICAgICAgIFswXSBwcmVjKCVkKSBzZ25kKCVkKSBbJWRdIHByZWMoJWQpIHNnbmQoJWQpCgBiYWQgY29tcG9uZW50IG51bWJlciBpbiBSR04gKCVkIHdoZW4gdGhlcmUgYXJlIG9ubHkgJWQpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG51bWJlciBvZiBjb21wb25lbnQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBwYXJhbWV0ZXJzICggJWQgdnMgJWQpCgBFcnJvciB3aXRoIFNJWiBtYXJrZXI6IGludmFsaWQgdGlsZSBzaXplICh0ZHg6ICVkLCB0ZHk6ICVkKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemU6ICVkKQoAQmFkIENPTFIgaGVhZGVyIGJveCAoQ0lFTGFiLCBiYWQgc2l6ZTogJWQpCgBQVEVSTSBjaGVjayBmYWlsdXJlOiAlZCByZW1haW5pbmcgYnl0ZXMgaW4gY29kZSBibG9jayAoJWQgdXNlZCAvICVkKQoATWFsZm9ybWVkIEhUIGNvZGVibG9jay4gT25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQ6IDIgPD0gU2N1cCA8PSBtaW4oTGN1cCwgNDA3OSkKAEludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBwcmVjPSV1IChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAzOCBhY2NvcmRpbmcgdG8gdGhlIEpQRUcyMDAwIG5vcm0uIE9wZW5KcGVnIG9ubHkgc3VwcG9ydHMgdXAgdG8gMzEpCgBJbnZhbGlkIGJpdCBudW1iZXIgJWQgaW4gb3BqX3QyX3JlYWRfcGFja2V0X2hlYWRlcigpCgBTdHJlYW0gZXJyb3IhCgBFcnJvciBvbiB3cml0aW5nIHN0cmVhbSEKAFN0cmVhbSByZWFjaGVkIGl0cyBlbmQgIQoARXhwZWN0ZWQgYSBTT0MgbWFya2VyIAoASW52YWxpZCBib3ggc2l6ZSAlZCBmb3IgYm94ICclYyVjJWMlYycuIE5lZWQgJWQgYnl0ZXMsICVkIGJ5dGVzIHJlbWFpbmluZyAKAE1hbGZvcm1lZCBIVCBjb2RlYmxvY2suIERlY29kaW5nIHRoaXMgY29kZWJsb2NrIGlzIHN0b3BwZWQuIFVfcSBpcyBsYXJnZXIgdGhhbiB6ZXJvIGJpdHBsYW5lcyArIDEgCgBNYWxmb3JtZWQgSFQgY29kZWJsb2NrLiBEZWNvZGluZyB0aGlzIGNvZGVibG9jayBpcyBzdG9wcGVkLiBVX3EgaXNsYXJnZXIgdGhhbiBiaXRwbGFuZXMgKyAxIAoAQ09MUiBCT1ggbWV0aCB2YWx1ZSBpcyBub3QgYSByZWd1bGFyIHZhbHVlICglZCksIHNvIHdlIHdpbGwgaWdub3JlIHRoZSBlbnRpcmUgQ29sb3VyIFNwZWNpZmljYXRpb24gYm94LiAKAFdoaWxlIHJlYWRpbmcgQ0NQX1FOVFNUWSBlbGVtZW50IGluc2lkZSBRQ0Qgb3IgUUNDIG1hcmtlciBzZWdtZW50LCBudW1iZXIgb2Ygc3ViYmFuZHMgKCVkKSBpcyBncmVhdGVyIHRvIE9QSl9KMktfTUFYQkFORFMgKCVkKS4gU28gd2UgbGltaXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBzdG9yZWQgdG8gT1BKX0oyS19NQVhCQU5EUyAoJWQpIGFuZCBza2lwIHRoZSByZXN0LiAKAEpQMiBJSERSIGJveDogY29tcHJlc3Npb24gdHlwZSBpbmRpY2F0ZSB0aGF0IHRoZSBmaWxlIGlzIG5vdCBhIGNvbmZvcm1pbmcgSlAyIGZpbGUgKCVkKSAKAFRpbGUgaW5kZXggcHJvdmlkZWQgYnkgdGhlIHVzZXIgaXMgaW5jb3JyZWN0ICVkIChtYXggPSAlZCkgCgBFcnJvciBkZWNvZGluZyBjb21wb25lbnQgJWQuClRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgdG8gcmVtb3ZlICglZCkgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIHRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgb2YgdGhpcyBjb21wb25lbnQg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AAABVAAAAQAAAABQAADAUAAAAUgAAAAAAAAQUAAAsFAAAAFIAAABAAAAIFAAAMBQAAABOAAAAAAAADBQAACwUAAAATgAAAEAAABAUAAAwFAAAAEwAAAAAAAAUFAAABBRAAABMAAAAQAAAGBQAAAgUQAAASQAAAAAAABwUAAAMFEAAAEkAAABAAAAgFAAAEBRAAABHAAAAAAAAJBQAABwUQAAARwAAAEAAACgUAAAgFEAAAEWAAAAAAAAkFIAAJBRAAABFgAAAQAAAKBSAACgUQAAAVYAAAAAAADQUAAAwFAAAAFWAAABAAAA4FAAALBQAAABVAAAAAAAAPBQAACwUAAAAVQAAAEAAAAAUQAAwFAAAAFRAAAAAAAAEFEAANBQAAABUQAAAQAAACBRAADgUAAAAUgAAAAAAAAwUQAA8FAAAAFIAAABAAAAQFEAAABRAAABOAAAAAAAAFBRAAAQUQAAATgAAAEAAABgUQAAIFEAAAE0AAAAAAAAcFEAADBRAAABNAAAAQAAAIBRAABAUQAAATAAAAAAAACQUQAAUFEAAAEwAAABAAAAoFEAAGBRAAABKAAAAAAAALBRAABQUQAAASgAAAEAAADAUQAAYFEAAAEkAAAAAAAA0FEAAHBRAAABJAAAAQAAAOBRAACAUQAAASIAAAAAAADwUQAAkFEAAAEiAAABAAAAAFIAAKBRAAABHAAAAAAAABBSAACwUQAAARwAAAEAAAAgUgAAwFEAAAEYAAAAAAAAMFIAANBRAAABGAAAAQAAAEBSAADgUQAAARYAAAAAAABQUgAA8FEAAAEWAAABAAAAYFIAAABSAAABFAAAAAAAAHBSAAAQUgAAARQAAAEAAACAUgAAIFIAAAESAAAAAAAAkFIAADBSAAABEgAAAQAAAKBSAABAUgAAAREAAAAAAACwUgAAUFIAAAERAAABAAAAwFIAAGBSAADBCgAAAAAAANBSAABwUgAAwQoAAAEAAADgUgAAgFIAAMEJAAAAAAAA8FIAAJBSAADBCQAAAQAAAABTAACgUgAAoQgAAAAAAAAQUwAAsFIAAKEIAAABAAAAIFMAAMBSAAAhBQAAAAAAADBTAADQUgAAIQUAAAEAAABAUwAA4FIAAEEEAAAAAAAAUFMAAPBSAABBBAAAAQAAAGBTAAAAUwAAoQIAAAAAAABwUwAAEFMAAKECAAABAAAAgFMAACBTAAAhAgAAAAAAAJBTAAAwUwAAIQIAAAEAAACgUwAAQFMAAEEBAAAAAAAAsFMAAFBTAABBAQAAAQAAAMBTAABgUwAAEQEAAAAAAADQUwAAcFMAABEBAAABAAAA4FMAAIBTAACFAAAAAAAAAPBTAACQUwAAhQAAAAEAAAAAVAAAoFMAAEkAAAAAAAAAEFQAALBTAABJAAAAAQAAACBUAADAUwAAJQAAAAAAAAAwVAAA0FMAACUAAAABAAAAQFQAAOBTAAAVAAAAAAAAAFBUAADwUwAAFQAAAAEAAABgVAAAAFQAAAkAAAAAAAAAcFQAABBUAAAJAAAAAQAAAIBUAAAgVAAABQAAAAAAAACQVAAAMFQAAAUAAAABAAAAoFQAAEBUAAABAAAAAAAAAJBUAABQVAAAAQAAAAEAAACgVAAAYFQAAAFWAAAAAAAAsFQAALBUAAABVgAAAQAAAMBUAADAVAAAAAEDAwECAwMFBgcHBgYHBwABAwMBAgMDBQYHBwYGBwcFBgcHBgYHBwgICAgICAgIBQYHBwYGBwcICAgICAgICAECAwMCAgMDBgYHBwYGBwcBAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAECAwMCAgMDBgYHBwYGBwcBAgMDAgIDAwYGBwcGBgcHBgYHBwYGBwcICAgICAgICAYGBwcGBgcHCAgICAgICAgCAgMDAgIDAwYGBwcGBgcHAgIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgAAQUGAQIGBgMDBwcDAwcHAAEFBgECBgYDAwcHAwMHBwMDBwcDAwcHBAQHBwQEBwcDAwcHAwMHBwQEBwcEBAcHAQIGBgICBgYDAwcHAwMHBwECBgYCAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwUGCAgGBggIBwcICAcHCAgFBggIBgYICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgGBggIBgYICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIAQIGBgICBgYDAwcHAwMHBwECBgYCAgYGAwMHBwMDBwcDAwcHAwMHBwQEBwcEBAcHAwMHBwMDBwcEBAcHBAQHBwICBgYCAgYGAwMHBwMDBwcCAgYGAgIGBgMDBwcDAwcHAwMHBwMDBwcEBAcHBAQHBwMDBwcDAwcHBAQHBwQEBwcGBggIBgYICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBgYICAYGCAgHBwgIBwcICAYGCAgGBggIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAcHCAgHBwgIBwcICAABAwMBAgMDBQYHBwYGBwcAAQMDAQIDAwUGBwcGBgcHBQYHBwYGBwcICAgICAgICAUGBwcGBgcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAwMEBAMDBAQHBwcHBwcHBwMDBAQDAwQEBwcHBwcHBwcHBwcHBwcHBwgICAgICAgIBwcHBwcHBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgBAgMDAgIDAwYGBwcGBgcHAQIDAwICAwMGBgcHBgYHBwYGBwcGBgcHCAgICAgICAgGBgcHBgYHBwgICAgICAgIAgIDAwICAwMGBgcHBgYHBwICAwMCAgMDBgYHBwYGBwcGBgcHBgYHBwgICAgICAgIBgYHBwYGBwcICAgICAgICAMDBAQDAwQEBwcHBwcHBwcDAwQEAwMEBAcHBwcHBwcHBwcHBwcHBwcICAgICAgICAcHBwcHBwcHCAgICAgICAgDAwQEAwMEBAcHBwcHBwcHAwMEBAMDBAQHBwcHBwcHBwcHBwcHBwcHCAgICAgICAgHBwcHBwcHBwgICAgICAgIAAMBBAMGBAcBBAIFBAcFBwADAQQDBgQHAQQCBQQHBQcBBAIFBAcFBwIFAgUFBwUHAQQCBQQHBQcCBQIFBQcFBwMGBAcGCAcIBAcFBwcIBwgDBgQHBggHCAQHBQcHCAcIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgBBAIFBAcFBwIFAgUFBwUHAQQCBQQHBQcCBQIFBQcFBwIFAgUFBwUHAgUCBQUHBQcCBQIFBQcFBwIFAgUFBwUHBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAMGBAcGCAcIBAcFBwcIBwgDBgQHBggHCAQHBQcHCAcIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgGCAcICAgICAcIBwgICAgIBggHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBAcFBwcIBwgFBwUHBwgHCAQHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAUHBQcHCAcIBQcFBwcIBwgFBwUHBwgHCAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgHCAcICAgICAcIBwgICAgIBwgHCAgICAgJCQoKCQkKCgwMDQsMDA0LCQkKCgkJCgoMDAsNDAwLDQwMDQ0MDAsLDAkNCgkMCgsMDAsLDAwNDQwJCwoJDAoNCQkKCgkJCgoMDA0LDAwNCwkJCgoJCQoKDAwLDQwMCw0MDA0NDAwLCwwJDQoJDAoLDAwLCwwMDQ0MCQsKCQwKDQoKCgoKCgoKDQsNCw0LDQsKCgkJCgoJCQ0LDAwNCwwMDQ0NDQsLCwsNCg0KCgsKCw0NDAwLCwwMDQoMCQoLCQwKCgkJCgoJCQsNDAwLDQwMCgoKCgoKCgoLDQsNCw0LDQsLDAwNDQwMCwoMCQoNCQwLCwsLDQ0NDQsKCwoKDQoNAEHZuwELNwEAAQABAAEAAAEBAAABAQABAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAQABAQEAQZm8AQs3AQABAAEAAQAAAQEAAAEBAAEAAQABAAEAAAAAAQEBAQAAAAAAAQABAAAAAAEBAQEAAAABAAEBAQBB2bwBCwcBAAEAAQABAEHpvAELlQIBAAEAAQABAAAAAAEBAQEAAAAAAAEAAQAAAAABAQEBAAAAAAABAAEBAQAAAQEAAAABAAEAAQABAQEBAQEBAQEAAQABAAEAAQAAAAABAQEBAAEAAAEBAAEAAAAAAQEBAQABAAEBAQEBAgAAAAQAAAAEAAAACAAAAJD/AAAMAAAAGAAAAFL/AAAUAAAAGQAAAFP/AAAUAAAAGgAAAF7/AAAUAAAAGwAAAFz/AAAUAAAAHAAAAF3/AAAUAAAAHQAAAF//AAAUAAAAHgAAAFH/AAACAAAAHwAAAFX/AAAEAAAAIAAAAFf/AAAEAAAAIQAAAFj/AAAQAAAAIgAAAGD/AAAEAAAAIwAAAGH/AAAQAAAAJAAAAJH/AEGIvwELZWP/AAAEAAAAJQAAAGT/AAAUAAAAJgAAAHT/AAAUAAAAJwAAAHj/AAAEAAAAKAAAAFD/AAAEAAAAKQAAAFn/AAAEAAAAKgAAAHX/AAAUAAAAKwAAAHf/AAAUAAAALAAAAAAAAAAUAEGAwAELNS0AAAAuAAAALwAAADAAAAAxAAAAMgAAADMAAAA0AAAAICBQajYAAABweXRmNwAAAGgycGo4AEHAwAELMnJkaGk5AAAAcmxvYzoAAABjY3BiOwAAAHJsY3A8AAAAcGFtYz0AAABmZWRjPgAAAPhiAEGAwQELQRkACwAZGRkAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAGQAKChkZGQMKBwABAAkLGAAACQYLAAALAAYZAAAAGRkZAEHRwQELIQ4AAAAAAAAAABkACw0ZGRkADQAAAgAJDgAAAAkADgAADgBBi8IBCwEMAEGXwgELFRMAAAAAEwAAAAAJDAAAAAAADAAADABBxcIBCwEQAEHRwgELFQ8AAAAEDwAAAAAJEAAAAAAAEAAAEABB/8IBCwESAEGLwwELHhEAAAAAEQAAAAAJEgAAAAAAEgAAEgAAGgAAABoaGgBBwsMBCw4aAAAAGhoaAAAAAAAACQBB88MBCwEUAEH/wwELFRcAAAAAFwAAAAAJFAAAAAAAFAAAFABBrcQBCwEWAEG5xAELJxUAAAAAFQAAAAAJFgAAAAAAFgAAFgAAMDEyMzQ1Njc4OUFCQ0RFRgBB4MQBCwmQbAEAAAAAAAUAQfTEAQsBaQBBjMUBCwpqAAAAawAAAHhoAEGkxQELAQIAQbTFAQsI//////////8AQfjFAQsBBQBBhMYBCwFsAEGcxgELDmoAAABtAAAAiGgAAAAEAEG0xgELAQEAQcTGAQsF/////wo=");return receiveInstance(instantiateSync(u,e)[0])}();N.q,a._malloc=N.r,a._free=N.s,a._jp2_decode=N.u;w=function runCaller(){b||run();b||(w=runCaller)};function run(){if(!(m>0)){!function preRun(){if(a.preRun){"function"==typeof a.preRun&&(a.preRun=[a.preRun]);for(;a.preRun.length;)e=a.preRun.shift(),d.unshift(e)}var e;callRuntimeCallbacks(d)}();if(!(m>0))if(a.setStatus){a.setStatus("Running...");setTimeout((function(){setTimeout((function(){a.setStatus("")}),1);doRun()}),1)}else doRun()}function doRun(){if(!b){b=!0;a.calledRun=!0;!function initRuntime(){callRuntimeCallbacks(f)}();t(a);a.onRuntimeInitialized&&a.onRuntimeInitialized();!function postRun(){if(a.postRun){"function"==typeof a.postRun&&(a.postRun=[a.postRun]);for(;a.postRun.length;)e=a.postRun.shift(),p.unshift(e)}var e;callRuntimeCallbacks(p)}()}}}if(a.preInit){"function"==typeof a.preInit&&(a.preInit=[a.preInit]);for(;a.preInit.length>0;)a.preInit.pop()()}run();return a});const Ii=oi;class JpxError extends rt{constructor(e){super(e,"JpxError")}}class JpxImage{static#y=null;static decode(e,t){t||={};this.#y||=Ii({warn});const i=this.#y.decode(e,t);if("string"==typeof i)throw new JpxError(i);return i}static cleanup(){this.#y=null}static parseImageProperties(e){let t=e.getByte();for(;t>=0;){const i=t;t=e.getByte();if(65361===(i<<8|t)){e.skip(4);const t=e.getInt32()>>>0,i=e.getInt32()>>>0,a=e.getInt32()>>>0,s=e.getInt32()>>>0;e.skip(16);return{width:t-a,height:i-s,bitsPerComponent:8,componentsCount:e.getUint16()}}}throw new JpxError("No size marker found in JPX stream")}}class JpxStream extends DecodeStream{constructor(e,t,i){super(t);this.stream=e;this.dict=e.dict;this.maybeLength=t;this.params=i}get bytes(){return shadow(this,"bytes",this.stream.getBytes(this.maybeLength))}ensureBuffer(e){}readBlock(e){this.decodeImage(null,e)}decodeImage(e,t){if(this.eof)return this.buffer;e||=this.bytes;this.buffer=JpxImage.decode(e,t);this.bufferLength=this.buffer.length;this.eof=!0;return this.buffer}get canAsyncDecodeImageFromBuffer(){return this.stream.isAsync}}class LZWStream extends DecodeStream{constructor(e,t,i){super(t);this.str=e;this.dict=e.dict;this.cachedData=0;this.bitsCached=0;const a=4096,s={earlyChange:i,codeLength:9,nextCode:258,dictionaryValues:new Uint8Array(a),dictionaryLengths:new Uint16Array(a),dictionaryPrevCodes:new Uint16Array(a),currentSequence:new Uint8Array(a),currentSequenceLength:0};for(let e=0;e<256;++e){s.dictionaryValues[e]=e;s.dictionaryLengths[e]=1}this.lzwState=s}readBits(e){let t=this.bitsCached,i=this.cachedData;for(;t<e;){const e=this.str.getByte();if(-1===e){this.eof=!0;return null}i=i<<8|e;t+=8}this.bitsCached=t-=e;this.cachedData=i;this.lastCode=null;return i>>>t&(1<<e)-1}readBlock(){let e,t,i,a=1024;const s=this.lzwState;if(!s)return;const r=s.earlyChange;let n=s.nextCode;const g=s.dictionaryValues,o=s.dictionaryLengths,c=s.dictionaryPrevCodes;let C=s.codeLength,h=s.prevCode;const l=s.currentSequence;let Q=s.currentSequenceLength,E=0,u=this.bufferLength,d=this.ensureBuffer(this.bufferLength+a);for(e=0;e<512;e++){const e=this.readBits(C),s=Q>0;if(e<256){l[0]=e;Q=1}else{if(!(e>=258)){if(256===e){C=9;n=258;Q=0;continue}this.eof=!0;delete this.lzwState;break}if(e<n){Q=o[e];for(t=Q-1,i=e;t>=0;t--){l[t]=g[i];i=c[i]}}else l[Q++]=l[0]}if(s){c[n]=h;o[n]=o[h]+1;g[n]=l[0];n++;C=n+r&n+r-1?C:0|Math.min(Math.log(n+r)/.6931471805599453+1,12)}h=e;E+=Q;if(a<E){do{a+=512}while(a<E);d=this.ensureBuffer(this.bufferLength+a)}for(t=0;t<Q;t++)d[u++]=l[t]}s.nextCode=n;s.codeLength=C;s.prevCode=h;s.currentSequenceLength=Q;this.bufferLength=u}}class PredictorStream extends DecodeStream{constructor(e,t,i){super(t);if(!(i instanceof Dict))return e;const a=this.predictor=i.get("Predictor")||1;if(a<=1)return e;if(2!==a&&(a<10||a>15))throw new FormatError(`Unsupported predictor: ${a}`);this.readBlock=2===a?this.readBlockTiff:this.readBlockPng;this.str=e;this.dict=e.dict;const s=this.colors=i.get("Colors")||1,r=this.bits=i.get("BPC","BitsPerComponent")||8,n=this.columns=i.get("Columns")||1;this.pixBytes=s*r+7>>3;this.rowBytes=n*s*r+7>>3;return this}readBlockTiff(){const e=this.rowBytes,t=this.bufferLength,i=this.ensureBuffer(t+e),a=this.bits,s=this.colors,r=this.str.getBytes(e);this.eof=!r.length;if(this.eof)return;let n,g=0,o=0,c=0,C=0,h=t;if(1===a&&1===s)for(n=0;n<e;++n){let e=r[n]^g;e^=e>>1;e^=e>>2;e^=e>>4;g=(1&e)<<7;i[h++]=e}else if(8===a){for(n=0;n<s;++n)i[h++]=r[n];for(;n<e;++n){i[h]=i[h-s]+r[n];h++}}else if(16===a){const t=2*s;for(n=0;n<t;++n)i[h++]=r[n];for(;n<e;n+=2){const e=((255&r[n])<<8)+(255&r[n+1])+((255&i[h-t])<<8)+(255&i[h-t+1]);i[h++]=e>>8&255;i[h++]=255&e}}else{const e=new Uint8Array(s+1),h=(1<<a)-1;let l=0,Q=t;const E=this.columns;for(n=0;n<E;++n)for(let t=0;t<s;++t){if(c<a){g=g<<8|255&r[l++];c+=8}e[t]=e[t]+(g>>c-a)&h;c-=a;o=o<<a|e[t];C+=a;if(C>=8){i[Q++]=o>>C-8&255;C-=8}}C>0&&(i[Q++]=(o<<8-C)+(g&(1<<8-C)-1))}this.bufferLength+=e}readBlockPng(){const e=this.rowBytes,t=this.pixBytes,i=this.str.getByte(),a=this.str.getBytes(e);this.eof=!a.length;if(this.eof)return;const s=this.bufferLength,r=this.ensureBuffer(s+e);let n=r.subarray(s-e,s);0===n.length&&(n=new Uint8Array(e));let g,o,c,C=s;switch(i){case 0:for(g=0;g<e;++g)r[C++]=a[g];break;case 1:for(g=0;g<t;++g)r[C++]=a[g];for(;g<e;++g){r[C]=r[C-t]+a[g]&255;C++}break;case 2:for(g=0;g<e;++g)r[C++]=n[g]+a[g]&255;break;case 3:for(g=0;g<t;++g)r[C++]=(n[g]>>1)+a[g];for(;g<e;++g){r[C]=(n[g]+r[C-t]>>1)+a[g]&255;C++}break;case 4:for(g=0;g<t;++g){o=n[g];c=a[g];r[C++]=o+c}for(;g<e;++g){o=n[g];const e=n[g-t],i=r[C-t],s=i+o-e;let h=s-i;h<0&&(h=-h);let l=s-o;l<0&&(l=-l);let Q=s-e;Q<0&&(Q=-Q);c=a[g];r[C++]=h<=l&&h<=Q?i+c:l<=Q?o+c:e+c}break;default:throw new FormatError(`Unsupported predictor: ${i}`)}this.bufferLength+=e}}class RunLengthStream extends DecodeStream{constructor(e,t){super(t);this.str=e;this.dict=e.dict}readBlock(){const e=this.str.getBytes(2);if(!e||e.length<2||128===e[0]){this.eof=!0;return}let t,i=this.bufferLength,a=e[0];if(a<128){t=this.ensureBuffer(i+a+1);t[i++]=e[1];if(a>0){const e=this.str.getBytes(a);t.set(e,i);i+=a}}else{a=257-a;const s=e[1];t=this.ensureBuffer(i+a+1);for(let e=0;e<a;e++)t[i++]=s}this.bufferLength=i}}class Parser{constructor({lexer:e,xref:t,allowStreams:i=!1,recoveryMode:a=!1}){this.lexer=e;this.xref=t;this.allowStreams=i;this.recoveryMode=a;this.imageCache=Object.create(null);this._imageId=0;this.refill()}refill(){this.buf1=this.lexer.getObj();this.buf2=this.lexer.getObj()}shift(){if(this.buf2 instanceof Cmd&&"ID"===this.buf2.cmd){this.buf1=this.buf2;this.buf2=null}else{this.buf1=this.buf2;this.buf2=this.lexer.getObj()}}tryShift(){try{this.shift();return!0}catch(e){if(e instanceof MissingDataException)throw e;return!1}}getObj(e=null){const t=this.buf1;this.shift();if(t instanceof Cmd)switch(t.cmd){case"BI":return this.makeInlineImage(e);case"[":const i=[];for(;!isCmd(this.buf1,"]")&&this.buf1!==pt;)i.push(this.getObj(e));if(this.buf1===pt){if(this.recoveryMode)return i;throw new ParserEOFException("End of file inside array.")}this.shift();return i;case"<<":const a=new Dict(this.xref);for(;!isCmd(this.buf1,">>")&&this.buf1!==pt;){if(!(this.buf1 instanceof Name)){info("Malformed dictionary: key must be a name object");this.shift();continue}const t=this.buf1.name;this.shift();if(this.buf1===pt)break;a.set(t,this.getObj(e))}if(this.buf1===pt){if(this.recoveryMode)return a;throw new ParserEOFException("End of file inside dictionary.")}if(isCmd(this.buf2,"stream"))return this.allowStreams?this.makeStream(a,e):a;this.shift();return a;default:return t}if(Number.isInteger(t)){if(Number.isInteger(this.buf1)&&isCmd(this.buf2,"R")){const e=Ref.get(t,this.buf1);this.shift();this.shift();return e}return t}return"string"==typeof t&&e?e.decryptString(t):t}findDefaultInlineStreamEnd(e){const{knownCommands:t}=this.lexer,i=e.pos;let a,s,r=0;for(;-1!==(a=e.getByte());)if(0===r)r=69===a?1:0;else if(1===r)r=73===a?2:0;else if(32===a||10===a||13===a){s=e.pos;const i=e.peekBytes(15),n=i.length;if(0===n)break;for(let e=0;e<n;e++){a=i[e];if((0!==a||0===i[e+1])&&(10!==a&&13!==a&&(a<32||a>127))){r=0;break}}if(2!==r)continue;if(!t){warn("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined.");continue}const g=new Lexer(new Stream(i.slice()),t);g._hexStringWarn=()=>{};let o=0;for(;;){const e=g.getObj();if(e===pt){r=0;break}if(e instanceof Cmd){const i=t[e.cmd];if(!i){r=0;break}if(i.variableArgs?o<=i.numArgs:o===i.numArgs)break;o=0}else o++}if(2===r)break}else r=0;if(-1===a){warn("findDefaultInlineStreamEnd: Reached the end of the stream without finding a valid EI marker");if(s){warn('... trying to recover by using the last "EI" occurrence.');e.skip(-(e.pos-s))}}let n=4;e.skip(-n);a=e.peekByte();e.skip(n);isWhiteSpace(a)||n--;return e.pos-n-i}findDCTDecodeInlineStreamEnd(e){const t=e.pos;let i,a,s=!1;for(;-1!==(i=e.getByte());)if(255===i){switch(e.getByte()){case 0:break;case 255:e.skip(-1);break;case 217:s=!0;break;case 192:case 193:case 194:case 195:case 197:case 198:case 199:case 201:case 202:case 203:case 205:case 206:case 207:case 196:case 204:case 218:case 219:case 220:case 221:case 222:case 223:case 224:case 225:case 226:case 227:case 228:case 229:case 230:case 231:case 232:case 233:case 234:case 235:case 236:case 237:case 238:case 239:case 254:a=e.getUint16();a>2?e.skip(a-2):e.skip(-2)}if(s)break}const r=e.pos-t;if(-1===i){warn("Inline DCTDecode image stream: EOI marker not found, searching for /EI/ instead.");e.skip(-r);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return r}findASCII85DecodeInlineStreamEnd(e){const t=e.pos;let i;for(;-1!==(i=e.getByte());)if(126===i){const t=e.pos;i=e.peekByte();for(;isWhiteSpace(i);){e.skip();i=e.peekByte()}if(62===i){e.skip();break}if(e.pos>t){const t=e.peekBytes(2);if(69===t[0]&&73===t[1])break}}const a=e.pos-t;if(-1===i){warn("Inline ASCII85Decode image stream: EOD marker not found, searching for /EI/ instead.");e.skip(-a);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return a}findASCIIHexDecodeInlineStreamEnd(e){const t=e.pos;let i;for(;-1!==(i=e.getByte())&&62!==i;);const a=e.pos-t;if(-1===i){warn("Inline ASCIIHexDecode image stream: EOD marker not found, searching for /EI/ instead.");e.skip(-a);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return a}inlineStreamSkipEI(e){let t,i=0;for(;-1!==(t=e.getByte());)if(0===i)i=69===t?1:0;else if(1===i)i=73===t?2:0;else if(2===i)break}makeInlineImage(e){const t=this.lexer,i=t.stream,a=Object.create(null);let s;for(;!isCmd(this.buf1,"ID")&&this.buf1!==pt;){if(!(this.buf1 instanceof Name))throw new FormatError("Dictionary key must be a name object");const t=this.buf1.name;this.shift();if(this.buf1===pt)break;a[t]=this.getObj(e)}-1!==t.beginInlineImagePos&&(s=i.pos-t.beginInlineImagePos);const r=this.xref.fetchIfRef(a.F||a.Filter);let n;if(r instanceof Name)n=r.name;else if(Array.isArray(r)){const e=this.xref.fetchIfRef(r[0]);e instanceof Name&&(n=e.name)}const g=i.pos;let o,c;switch(n){case"DCT":case"DCTDecode":o=this.findDCTDecodeInlineStreamEnd(i);break;case"A85":case"ASCII85Decode":o=this.findASCII85DecodeInlineStreamEnd(i);break;case"AHx":case"ASCIIHexDecode":o=this.findASCIIHexDecodeInlineStreamEnd(i);break;default:o=this.findDefaultInlineStreamEnd(i)}if(o<1e3&&s>0){const e=i.pos;i.pos=t.beginInlineImagePos;c=function getInlineImageCacheKey(e){const t=[],i=e.length;let a=0;for(;a<i-1;)t.push(e[a++]<<8|e[a++]);a<i&&t.push(e[a]);return i+"_"+String.fromCharCode.apply(null,t)}(i.getBytes(s+o));i.pos=e;const a=this.imageCache[c];if(void 0!==a){this.buf2=Cmd.get("EI");this.shift();a.reset();return a}}const C=new Dict(this.xref);for(const e in a)C.set(e,a[e]);let h=i.makeSubStream(g,o,C);e&&(h=e.createStream(h,o));h=this.filter(h,C,o);h.dict=C;if(void 0!==c){h.cacheKey="inline_img_"+ ++this._imageId;this.imageCache[c]=h}this.buf2=Cmd.get("EI");this.shift();return h}#w(e){const{stream:t}=this.lexer;t.pos=e;const i=new Uint8Array([101,110,100]),a=i.length,s=[new Uint8Array([115,116,114,101,97,109]),new Uint8Array([115,116,101,97,109]),new Uint8Array([115,116,114,101,97])],r=9-a;for(;t.pos<t.end;){const n=t.peekBytes(2048),g=n.length-9;if(g<=0)break;let o=0;for(;o<g;){let g=0;for(;g<a&&n[o+g]===i[g];)g++;if(g>=a){let a=!1;for(const e of s){const t=e.length;let s=0;for(;s<t&&n[o+g+s]===e[s];)s++;if(s>=r){a=!0;break}if(s>=t){if(isWhiteSpace(n[o+g+s])){info(`Found "${bytesToString([...i,...e])}" when searching for endstream command.`);a=!0}break}}if(a){t.pos+=o;return t.pos-e}}o++}t.pos+=g}return-1}makeStream(e,t){const i=this.lexer;let a=i.stream;i.skipToNextLine();const s=a.pos-1;let r=e.get("Length");if(!Number.isInteger(r)){info(`Bad length "${r&&r.toString()}" in stream.`);r=0}a.pos=s+r;i.nextChar();if(this.tryShift()&&isCmd(this.buf2,"endstream"))this.shift();else{r=this.#w(s);if(r<0)throw new FormatError("Missing endstream command.");i.nextChar();this.shift();this.shift()}this.shift();a=a.makeSubStream(s,r,e);t&&(a=t.createStream(a,r));a=this.filter(a,e,r);a.dict=e;return a}filter(e,t,i){let a=t.get("F","Filter"),s=t.get("DP","DecodeParms");if(a instanceof Name){Array.isArray(s)&&warn("/DecodeParms should not be an Array, when /Filter is a Name.");return this.makeFilter(e,a.name,i,s)}let r=i;if(Array.isArray(a)){const t=a,i=s;for(let n=0,g=t.length;n<g;++n){a=this.xref.fetchIfRef(t[n]);if(!(a instanceof Name))throw new FormatError(`Bad filter name "${a}"`);s=null;Array.isArray(i)&&n in i&&(s=this.xref.fetchIfRef(i[n]));e=this.makeFilter(e,a.name,r,s);r=null}}return e}makeFilter(e,t,i,a){if(0===i){warn(`Empty "${t}" stream.`);return new NullStream}try{switch(t){case"Fl":case"FlateDecode":return a?new PredictorStream(new FlateStream(e,i),i,a):new FlateStream(e,i);case"LZW":case"LZWDecode":let t=1;if(a){a.has("EarlyChange")&&(t=a.get("EarlyChange"));return new PredictorStream(new LZWStream(e,i,t),i,a)}return new LZWStream(e,i,t);case"DCT":case"DCTDecode":return new JpegStream(e,i,a);case"JPX":case"JPXDecode":return new JpxStream(e,i,a);case"A85":case"ASCII85Decode":return new Ascii85Stream(e,i);case"AHx":case"ASCIIHexDecode":return new AsciiHexStream(e,i);case"CCF":case"CCITTFaxDecode":return new CCITTFaxStream(e,i,a);case"RL":case"RunLengthDecode":return new RunLengthStream(e,i);case"JBIG2Decode":return new Jbig2Stream(e,i,a)}warn(`Filter "${t}" is not supported.`);return e}catch(e){if(e instanceof MissingDataException)throw e;warn(`Invalid stream: "${e}"`);return new NullStream}}}const ci=[1,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];function toHexDigit(e){return e>=48&&e<=57?15&e:e>=65&&e<=70||e>=97&&e<=102?9+(15&e):-1}class Lexer{constructor(e,t=null){this.stream=e;this.nextChar();this.strBuf=[];this.knownCommands=t;this._hexStringNumWarn=0;this.beginInlineImagePos=-1}nextChar(){return this.currentChar=this.stream.getByte()}peekChar(){return this.stream.peekByte()}getNumber(){let e=this.currentChar,t=!1,i=0,a=1;if(45===e){a=-1;e=this.nextChar();45===e&&(e=this.nextChar())}else 43===e&&(e=this.nextChar());if(10===e||13===e)do{e=this.nextChar()}while(10===e||13===e);if(46===e){i=10;e=this.nextChar()}if(e<48||e>57){const t=`Invalid number: ${String.fromCharCode(e)} (charCode ${e})`;if(isWhiteSpace(e)||-1===e){info(`Lexer.getNumber - "${t}".`);return 0}throw new FormatError(t)}let s=e-48,r=0,n=1;for(;(e=this.nextChar())>=0;)if(e>=48&&e<=57){const a=e-48;if(t)r=10*r+a;else{0!==i&&(i*=10);s=10*s+a}}else if(46===e){if(0!==i)break;i=1}else if(45===e)warn("Badly formatted number: minus sign in the middle");else{if(69!==e&&101!==e)break;e=this.peekChar();if(43===e||45===e){n=45===e?-1:1;this.nextChar()}else if(e<48||e>57)break;t=!0}0!==i&&(s/=i);t&&(s*=10**(n*r));return a*s}getString(){let e=1,t=!1;const i=this.strBuf;i.length=0;let a=this.nextChar();for(;;){let s=!1;switch(0|a){case-1:warn("Unterminated string");t=!0;break;case 40:++e;i.push("(");break;case 41:if(0==--e){this.nextChar();t=!0}else i.push(")");break;case 92:a=this.nextChar();switch(a){case-1:warn("Unterminated string");t=!0;break;case 110:i.push("\n");break;case 114:i.push("\r");break;case 116:i.push("\t");break;case 98:i.push("\b");break;case 102:i.push("\f");break;case 92:case 40:case 41:i.push(String.fromCharCode(a));break;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:let e=15&a;a=this.nextChar();s=!0;if(a>=48&&a<=55){e=(e<<3)+(15&a);a=this.nextChar();if(a>=48&&a<=55){s=!1;e=(e<<3)+(15&a)}}i.push(String.fromCharCode(e));break;case 13:10===this.peekChar()&&this.nextChar();break;case 10:break;default:i.push(String.fromCharCode(a))}break;default:i.push(String.fromCharCode(a))}if(t)break;s||(a=this.nextChar())}return i.join("")}getName(){let e,t;const i=this.strBuf;i.length=0;for(;(e=this.nextChar())>=0&&!ci[e];)if(35===e){e=this.nextChar();if(ci[e]){warn("Lexer_getName: NUMBER SIGN (#) should be followed by a hexadecimal number.");i.push("#");break}const a=toHexDigit(e);if(-1!==a){t=e;e=this.nextChar();const s=toHexDigit(e);if(-1===s){warn(`Lexer_getName: Illegal digit (${String.fromCharCode(e)}) in hexadecimal number.`);i.push("#",String.fromCharCode(t));if(ci[e])break;i.push(String.fromCharCode(e));continue}i.push(String.fromCharCode(a<<4|s))}else i.push("#",String.fromCharCode(e))}else i.push(String.fromCharCode(e));i.length>127&&warn(`Name token is longer than allowed by the spec: ${i.length}`);return Name.get(i.join(""))}_hexStringWarn(e){5!=this._hexStringNumWarn++?this._hexStringNumWarn>5||warn(`getHexString - ignoring invalid character: ${e}`):warn("getHexString - ignoring additional invalid characters.")}getHexString(){const e=this.strBuf;e.length=0;let t,i,a=this.currentChar,s=!0;this._hexStringNumWarn=0;for(;;){if(a<0){warn("Unterminated hex string");break}if(62===a){this.nextChar();break}if(1!==ci[a]){if(s){t=toHexDigit(a);if(-1===t){this._hexStringWarn(a);a=this.nextChar();continue}}else{i=toHexDigit(a);if(-1===i){this._hexStringWarn(a);a=this.nextChar();continue}e.push(String.fromCharCode(t<<4|i))}s=!s;a=this.nextChar()}else a=this.nextChar()}return e.join("")}getObj(){let e=!1,t=this.currentChar;for(;;){if(t<0)return pt;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(1!==ci[t])break;t=this.nextChar()}switch(0|t){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return this.getNumber();case 40:return this.getString();case 47:return this.getName();case 91:this.nextChar();return Cmd.get("[");case 93:this.nextChar();return Cmd.get("]");case 60:t=this.nextChar();if(60===t){this.nextChar();return Cmd.get("<<")}return this.getHexString();case 62:t=this.nextChar();if(62===t){this.nextChar();return Cmd.get(">>")}return Cmd.get(">");case 123:this.nextChar();return Cmd.get("{");case 125:this.nextChar();return Cmd.get("}");case 41:this.nextChar();throw new FormatError(`Illegal character: ${t}`)}let i=String.fromCharCode(t);if(t<32||t>127){const e=this.peekChar();if(e>=32&&e<=127){this.nextChar();return Cmd.get(i)}}const a=this.knownCommands;let s=void 0!==a?.[i];for(;(t=this.nextChar())>=0&&!ci[t];){const e=i+String.fromCharCode(t);if(s&&void 0===a[e])break;if(128===i.length)throw new FormatError(`Command token too long: ${i.length}`);i=e;s=void 0!==a?.[i]}if("true"===i)return!0;if("false"===i)return!1;if("null"===i)return null;"BI"===i&&(this.beginInlineImagePos=this.stream.pos);return Cmd.get(i)}skipToNextLine(){let e=this.currentChar;for(;e>=0;){if(13===e){e=this.nextChar();10===e&&this.nextChar();break}if(10===e){this.nextChar();break}e=this.nextChar()}}}class Linearization{static create(e){function getInt(e,t,i=!1){const a=e.get(t);if(Number.isInteger(a)&&(i?a>=0:a>0))return a;throw new Error(`The "${t}" parameter in the linearization dictionary is invalid.`)}const t=new Parser({lexer:new Lexer(e),xref:null}),i=t.getObj(),a=t.getObj(),s=t.getObj(),r=t.getObj();let n,g;if(!(Number.isInteger(i)&&Number.isInteger(a)&&isCmd(s,"obj")&&r instanceof Dict&&"number"==typeof(n=r.get("Linearized"))&&n>0))return null;if((g=getInt(r,"L"))!==e.length)throw new Error('The "L" parameter in the linearization dictionary does not equal the stream length.');return{length:g,hints:function getHints(e){const t=e.get("H");let i;if(Array.isArray(t)&&(2===(i=t.length)||4===i)){for(let e=0;e<i;e++){const i=t[e];if(!(Number.isInteger(i)&&i>0))throw new Error(`Hint (${e}) in the linearization dictionary is invalid.`)}return t}throw new Error("Hint array in the linearization dictionary is invalid.")}(r),objectNumberFirst:getInt(r,"O"),endFirst:getInt(r,"E"),numPages:getInt(r,"N"),mainXRefEntriesOffset:getInt(r,"T"),pageFirst:r.has("P")?getInt(r,"P",!0):0}}}const Ci=["Adobe-GB1-UCS2","Adobe-CNS1-UCS2","Adobe-Japan1-UCS2","Adobe-Korea1-UCS2","78-EUC-H","78-EUC-V","78-H","78-RKSJ-H","78-RKSJ-V","78-V","78ms-RKSJ-H","78ms-RKSJ-V","83pv-RKSJ-H","90ms-RKSJ-H","90ms-RKSJ-V","90msp-RKSJ-H","90msp-RKSJ-V","90pv-RKSJ-H","90pv-RKSJ-V","Add-H","Add-RKSJ-H","Add-RKSJ-V","Add-V","Adobe-CNS1-0","Adobe-CNS1-1","Adobe-CNS1-2","Adobe-CNS1-3","Adobe-CNS1-4","Adobe-CNS1-5","Adobe-CNS1-6","Adobe-GB1-0","Adobe-GB1-1","Adobe-GB1-2","Adobe-GB1-3","Adobe-GB1-4","Adobe-GB1-5","Adobe-Japan1-0","Adobe-Japan1-1","Adobe-Japan1-2","Adobe-Japan1-3","Adobe-Japan1-4","Adobe-Japan1-5","Adobe-Japan1-6","Adobe-Korea1-0","Adobe-Korea1-1","Adobe-Korea1-2","B5-H","B5-V","B5pc-H","B5pc-V","CNS-EUC-H","CNS-EUC-V","CNS1-H","CNS1-V","CNS2-H","CNS2-V","ETHK-B5-H","ETHK-B5-V","ETen-B5-H","ETen-B5-V","ETenms-B5-H","ETenms-B5-V","EUC-H","EUC-V","Ext-H","Ext-RKSJ-H","Ext-RKSJ-V","Ext-V","GB-EUC-H","GB-EUC-V","GB-H","GB-V","GBK-EUC-H","GBK-EUC-V","GBK2K-H","GBK2K-V","GBKp-EUC-H","GBKp-EUC-V","GBT-EUC-H","GBT-EUC-V","GBT-H","GBT-V","GBTpc-EUC-H","GBTpc-EUC-V","GBpc-EUC-H","GBpc-EUC-V","H","HKdla-B5-H","HKdla-B5-V","HKdlb-B5-H","HKdlb-B5-V","HKgccs-B5-H","HKgccs-B5-V","HKm314-B5-H","HKm314-B5-V","HKm471-B5-H","HKm471-B5-V","HKscs-B5-H","HKscs-B5-V","Hankaku","Hiragana","KSC-EUC-H","KSC-EUC-V","KSC-H","KSC-Johab-H","KSC-Johab-V","KSC-V","KSCms-UHC-H","KSCms-UHC-HW-H","KSCms-UHC-HW-V","KSCms-UHC-V","KSCpc-EUC-H","KSCpc-EUC-V","Katakana","NWP-H","NWP-V","RKSJ-H","RKSJ-V","Roman","UniCNS-UCS2-H","UniCNS-UCS2-V","UniCNS-UTF16-H","UniCNS-UTF16-V","UniCNS-UTF32-H","UniCNS-UTF32-V","UniCNS-UTF8-H","UniCNS-UTF8-V","UniGB-UCS2-H","UniGB-UCS2-V","UniGB-UTF16-H","UniGB-UTF16-V","UniGB-UTF32-H","UniGB-UTF32-V","UniGB-UTF8-H","UniGB-UTF8-V","UniJIS-UCS2-H","UniJIS-UCS2-HW-H","UniJIS-UCS2-HW-V","UniJIS-UCS2-V","UniJIS-UTF16-H","UniJIS-UTF16-V","UniJIS-UTF32-H","UniJIS-UTF32-V","UniJIS-UTF8-H","UniJIS-UTF8-V","UniJIS2004-UTF16-H","UniJIS2004-UTF16-V","UniJIS2004-UTF32-H","UniJIS2004-UTF32-V","UniJIS2004-UTF8-H","UniJIS2004-UTF8-V","UniJISPro-UCS2-HW-V","UniJISPro-UCS2-V","UniJISPro-UTF8-V","UniJISX0213-UTF32-H","UniJISX0213-UTF32-V","UniJISX02132004-UTF32-H","UniJISX02132004-UTF32-V","UniKS-UCS2-H","UniKS-UCS2-V","UniKS-UTF16-H","UniKS-UTF16-V","UniKS-UTF32-H","UniKS-UTF32-V","UniKS-UTF8-H","UniKS-UTF8-V","V","WP-Symbol"],hi=2**24-1;class CMap{constructor(e=!1){this.codespaceRanges=[[],[],[],[]];this.numCodespaceRanges=0;this._map=[];this.name="";this.vertical=!1;this.useCMap=null;this.builtInCMap=e}addCodespaceRange(e,t,i){this.codespaceRanges[e-1].push(t,i);this.numCodespaceRanges++}mapCidRange(e,t,i){if(t-e>hi)throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE.");for(;e<=t;)this._map[e++]=i++}mapBfRange(e,t,i){if(t-e>hi)throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE.");const a=i.length-1;for(;e<=t;){this._map[e++]=i;const t=i.charCodeAt(a)+1;t>255?i=i.substring(0,a-1)+String.fromCharCode(i.charCodeAt(a-1)+1)+"\0":i=i.substring(0,a)+String.fromCharCode(t)}}mapBfRangeToArray(e,t,i){if(t-e>hi)throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE.");const a=i.length;let s=0;for(;e<=t&&s<a;){this._map[e]=i[s++];++e}}mapOne(e,t){this._map[e]=t}lookup(e){return this._map[e]}contains(e){return void 0!==this._map[e]}forEach(e){const t=this._map,i=t.length;if(i<=65536)for(let a=0;a<i;a++)void 0!==t[a]&&e(a,t[a]);else for(const i in t)e(i,t[i])}charCodeOf(e){const t=this._map;if(t.length<=65536)return t.indexOf(e);for(const i in t)if(t[i]===e)return 0|i;return-1}getMap(){return this._map}readCharCode(e,t,i){let a=0;const s=this.codespaceRanges;for(let r=0,n=s.length;r<n;r++){a=(a<<8|e.charCodeAt(t+r))>>>0;const n=s[r];for(let e=0,t=n.length;e<t;){const t=n[e++],s=n[e++];if(a>=t&&a<=s){i.charcode=a;i.length=r+1;return}}}i.charcode=0;i.length=1}getCharCodeLength(e){const t=this.codespaceRanges;for(let i=0,a=t.length;i<a;i++){const a=t[i];for(let t=0,s=a.length;t<s;){const s=a[t++],r=a[t++];if(e>=s&&e<=r)return i+1}}return 1}get length(){return this._map.length}get isIdentityCMap(){if("Identity-H"!==this.name&&"Identity-V"!==this.name)return!1;if(65536!==this._map.length)return!1;for(let e=0;e<65536;e++)if(this._map[e]!==e)return!1;return!0}}class IdentityCMap extends CMap{constructor(e,t){super();this.vertical=e;this.addCodespaceRange(t,0,65535)}mapCidRange(e,t,i){unreachable("should not call mapCidRange")}mapBfRange(e,t,i){unreachable("should not call mapBfRange")}mapBfRangeToArray(e,t,i){unreachable("should not call mapBfRangeToArray")}mapOne(e,t){unreachable("should not call mapCidOne")}lookup(e){return Number.isInteger(e)&&e<=65535?e:void 0}contains(e){return Number.isInteger(e)&&e<=65535}forEach(e){for(let t=0;t<=65535;t++)e(t,t)}charCodeOf(e){return Number.isInteger(e)&&e<=65535?e:-1}getMap(){const e=new Array(65536);for(let t=0;t<=65535;t++)e[t]=t;return e}get length(){return 65536}get isIdentityCMap(){unreachable("should not access .isIdentityCMap")}}function strToInt(e){let t=0;for(let i=0;i<e.length;i++)t=t<<8|e.charCodeAt(i);return t>>>0}function expectString(e){if("string"!=typeof e)throw new FormatError("Malformed CMap: expected string.")}function expectInt(e){if(!Number.isInteger(e))throw new FormatError("Malformed CMap: expected int.")}function parseBfChar(e,t){for(;;){let i=t.getObj();if(i===pt)break;if(isCmd(i,"endbfchar"))return;expectString(i);const a=strToInt(i);i=t.getObj();expectString(i);const s=i;e.mapOne(a,s)}}function parseBfRange(e,t){for(;;){let i=t.getObj();if(i===pt)break;if(isCmd(i,"endbfrange"))return;expectString(i);const a=strToInt(i);i=t.getObj();expectString(i);const s=strToInt(i);i=t.getObj();if(Number.isInteger(i)||"string"==typeof i){const t=Number.isInteger(i)?String.fromCharCode(i):i;e.mapBfRange(a,s,t)}else{if(!isCmd(i,"["))break;{i=t.getObj();const r=[];for(;!isCmd(i,"]")&&i!==pt;){r.push(i);i=t.getObj()}e.mapBfRangeToArray(a,s,r)}}}throw new FormatError("Invalid bf range.")}function parseCidChar(e,t){for(;;){let i=t.getObj();if(i===pt)break;if(isCmd(i,"endcidchar"))return;expectString(i);const a=strToInt(i);i=t.getObj();expectInt(i);const s=i;e.mapOne(a,s)}}function parseCidRange(e,t){for(;;){let i=t.getObj();if(i===pt)break;if(isCmd(i,"endcidrange"))return;expectString(i);const a=strToInt(i);i=t.getObj();expectString(i);const s=strToInt(i);i=t.getObj();expectInt(i);const r=i;e.mapCidRange(a,s,r)}}function parseCodespaceRange(e,t){for(;;){let i=t.getObj();if(i===pt)break;if(isCmd(i,"endcodespacerange"))return;if("string"!=typeof i)break;const a=strToInt(i);i=t.getObj();if("string"!=typeof i)break;const s=strToInt(i);e.addCodespaceRange(i.length,a,s)}throw new FormatError("Invalid codespace range.")}function parseWMode(e,t){const i=t.getObj();Number.isInteger(i)&&(e.vertical=!!i)}function parseCMapName(e,t){const i=t.getObj();i instanceof Name&&(e.name=i.name)}async function parseCMap(e,t,i,a){let s,r;A:for(;;)try{const i=t.getObj();if(i===pt)break;if(i instanceof Name){"WMode"===i.name?parseWMode(e,t):"CMapName"===i.name&&parseCMapName(e,t);s=i}else if(i instanceof Cmd)switch(i.cmd){case"endcmap":break A;case"usecmap":s instanceof Name&&(r=s.name);break;case"begincodespacerange":parseCodespaceRange(e,t);break;case"beginbfchar":parseBfChar(e,t);break;case"begincidchar":parseCidChar(e,t);break;case"beginbfrange":parseBfRange(e,t);break;case"begincidrange":parseCidRange(e,t)}}catch(e){if(e instanceof MissingDataException)throw e;warn("Invalid cMap data: "+e);continue}!a&&r&&(a=r);return a?extendCMap(e,i,a):e}async function extendCMap(e,t,i){e.useCMap=await createBuiltInCMap(i,t);if(0===e.numCodespaceRanges){const t=e.useCMap.codespaceRanges;for(let i=0;i<t.length;i++)e.codespaceRanges[i]=t[i].slice();e.numCodespaceRanges=e.useCMap.numCodespaceRanges}e.useCMap.forEach((function(t,i){e.contains(t)||e.mapOne(t,e.useCMap.lookup(t))}));return e}async function createBuiltInCMap(e,t){if("Identity-H"===e)return new IdentityCMap(!1,2);if("Identity-V"===e)return new IdentityCMap(!0,2);if(!Ci.includes(e))throw new Error("Unknown CMap name: "+e);if(!t)throw new Error("Built-in CMap parameters are not provided.");const{cMapData:i,compressionType:a}=await t(e),s=new CMap(!0);if(a===mA.BINARY)return(new BinaryCMapReader).process(i,s,(e=>extendCMap(s,t,e)));if(a===mA.NONE){const e=new Lexer(new Stream(i));return parseCMap(s,e,t,null)}throw new Error(`Invalid CMap "compressionType" value: ${a}`)}class CMapFactory{static async create({encoding:e,fetchBuiltInCMap:t,useCMap:i}){if(e instanceof Name)return createBuiltInCMap(e.name,t);if(e instanceof BaseStream){const a=await parseCMap(new CMap,new Lexer(e),t,i);return a.isIdentityCMap?createBuiltInCMap(a.name,t):a}throw new Error("Encoding required.")}}const Bi=[".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","questiondown","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi","lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree","thorn","threequarters","twosuperior","registered","minus","eth","multiply","threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring","Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde","ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve","otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute","ydieresis","zcaron"],li=[".notdef","space","exclamsmall","Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","fi","fl","ffi","ffl","parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash","hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","onequarter","onehalf","threequarters","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall"],Qi=[".notdef","space","dollaroldstyle","dollarsuperior","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","fi","fl","ffi","ffl","parenleftinferior","parenrightinferior","hyphensuperior","colonmonetary","onefitted","rupiah","centoldstyle","figuredash","hypheninferior","onequarter","onehalf","threequarters","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior"],Ei=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclamsmall","Hungarumlautsmall","","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","questionsmall","","asuperior","bsuperior","centsuperior","dsuperior","esuperior","","","","isuperior","","","lsuperior","msuperior","nsuperior","osuperior","","","rsuperior","ssuperior","tsuperior","","ff","fi","fl","ffi","ffl","parenleftinferior","","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","exclamdownsmall","centoldstyle","Lslashsmall","","","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","","Dotaccentsmall","","","Macronsmall","","","figuredash","hypheninferior","","","Ogoneksmall","Ringsmall","Cedillasmall","","","","onequarter","onehalf","threequarters","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","","","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall"],ui=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclamsmall","Hungarumlautsmall","centoldstyle","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","","threequartersemdash","","questionsmall","","","","","Ethsmall","","","onequarter","onehalf","threequarters","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","","","","","","","ff","fi","fl","ffi","ffl","parenleftinferior","","parenrightinferior","Circumflexsmall","hypheninferior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","","","asuperior","centsuperior","","","","","Aacutesmall","Agravesmall","Acircumflexsmall","Adieresissmall","Atildesmall","Aringsmall","Ccedillasmall","Eacutesmall","Egravesmall","Ecircumflexsmall","Edieresissmall","Iacutesmall","Igravesmall","Icircumflexsmall","Idieresissmall","Ntildesmall","Oacutesmall","Ogravesmall","Ocircumflexsmall","Odieresissmall","Otildesmall","Uacutesmall","Ugravesmall","Ucircumflexsmall","Udieresissmall","","eightsuperior","fourinferior","threeinferior","sixinferior","eightinferior","seveninferior","Scaronsmall","","centinferior","twoinferior","","Dieresissmall","","Caronsmall","osuperior","fiveinferior","","commainferior","periodinferior","Yacutesmall","","dollarinferior","","","Thornsmall","","nineinferior","zeroinferior","Zcaronsmall","AEsmall","Oslashsmall","questiondownsmall","oneinferior","Lslashsmall","","","","","","","Cedillasmall","","","","","","OEsmall","figuredash","hyphensuperior","","","","","exclamdownsmall","","Ydieresissmall","","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","ninesuperior","zerosuperior","","esuperior","rsuperior","tsuperior","","","isuperior","ssuperior","dsuperior","","","","","","lsuperior","Ogoneksmall","Brevesmall","Macronsmall","bsuperior","nsuperior","msuperior","commasuperior","periodsuperior","Dotaccentsmall","Ringsmall","","","",""],di=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","","Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis","aacute","agrave","acircumflex","adieresis","atilde","aring","ccedilla","eacute","egrave","ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis","ntilde","oacute","ograve","ocircumflex","odieresis","otilde","uacute","ugrave","ucircumflex","udieresis","dagger","degree","cent","sterling","section","bullet","paragraph","germandbls","registered","copyright","trademark","acute","dieresis","notequal","AE","Oslash","infinity","plusminus","lessequal","greaterequal","yen","mu","partialdiff","summation","product","pi","integral","ordfeminine","ordmasculine","Omega","ae","oslash","questiondown","exclamdown","logicalnot","radical","florin","approxequal","Delta","guillemotleft","guillemotright","ellipsis","space","Agrave","Atilde","Otilde","OE","oe","endash","emdash","quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge","ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright","fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase","perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple","Ograve","Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde","macron","breve","dotaccent","ring","cedilla","hungarumlaut","ogonek","caron"],fi=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","","endash","dagger","daggerdbl","periodcentered","","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","","questiondown","","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","","ring","cedilla","","hungarumlaut","ogonek","caron","emdash","","","","","","","","","","","","","","","","","AE","","ordfeminine","","","","","Lslash","Oslash","OE","ordmasculine","","","","","","ae","","","","dotlessi","","","lslash","oslash","oe","germandbls","","","",""],pi=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","bullet","Euro","bullet","quotesinglbase","florin","quotedblbase","ellipsis","dagger","daggerdbl","circumflex","perthousand","Scaron","guilsinglleft","OE","bullet","Zcaron","bullet","bullet","quoteleft","quoteright","quotedblleft","quotedblright","bullet","endash","emdash","tilde","trademark","scaron","guilsinglright","oe","bullet","zcaron","Ydieresis","space","exclamdown","cent","sterling","currency","yen","brokenbar","section","dieresis","copyright","ordfeminine","guillemotleft","logicalnot","hyphen","registered","macron","degree","plusminus","twosuperior","threesuperior","acute","mu","paragraph","periodcentered","cedilla","onesuperior","ordmasculine","guillemotright","onequarter","onehalf","threequarters","questiondown","Agrave","Aacute","Acircumflex","Atilde","Adieresis","Aring","AE","Ccedilla","Egrave","Eacute","Ecircumflex","Edieresis","Igrave","Iacute","Icircumflex","Idieresis","Eth","Ntilde","Ograve","Oacute","Ocircumflex","Otilde","Odieresis","multiply","Oslash","Ugrave","Uacute","Ucircumflex","Udieresis","Yacute","Thorn","germandbls","agrave","aacute","acircumflex","atilde","adieresis","aring","ae","ccedilla","egrave","eacute","ecircumflex","edieresis","igrave","iacute","icircumflex","idieresis","eth","ntilde","ograve","oacute","ocircumflex","otilde","odieresis","divide","oslash","ugrave","uacute","ucircumflex","udieresis","yacute","thorn","ydieresis"],mi=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","universal","numbersign","existential","percent","ampersand","suchthat","parenleft","parenright","asteriskmath","plus","comma","minus","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","congruent","Alpha","Beta","Chi","Delta","Epsilon","Phi","Gamma","Eta","Iota","theta1","Kappa","Lambda","Mu","Nu","Omicron","Pi","Theta","Rho","Sigma","Tau","Upsilon","sigma1","Omega","Xi","Psi","Zeta","bracketleft","therefore","bracketright","perpendicular","underscore","radicalex","alpha","beta","chi","delta","epsilon","phi","gamma","eta","iota","phi1","kappa","lambda","mu","nu","omicron","pi","theta","rho","sigma","tau","upsilon","omega1","omega","xi","psi","zeta","braceleft","bar","braceright","similar","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Euro","Upsilon1","minute","lessequal","fraction","infinity","florin","club","diamond","heart","spade","arrowboth","arrowleft","arrowup","arrowright","arrowdown","degree","plusminus","second","greaterequal","multiply","proportional","partialdiff","bullet","divide","notequal","equivalence","approxequal","ellipsis","arrowvertex","arrowhorizex","carriagereturn","aleph","Ifraktur","Rfraktur","weierstrass","circlemultiply","circleplus","emptyset","intersection","union","propersuperset","reflexsuperset","notsubset","propersubset","reflexsubset","element","notelement","angle","gradient","registerserif","copyrightserif","trademarkserif","product","radical","dotmath","logicalnot","logicaland","logicalor","arrowdblboth","arrowdblleft","arrowdblup","arrowdblright","arrowdbldown","lozenge","angleleft","registersans","copyrightsans","trademarksans","summation","parenlefttp","parenleftex","parenleftbt","bracketlefttp","bracketleftex","bracketleftbt","bracelefttp","braceleftmid","braceleftbt","braceex","","angleright","integral","integraltp","integralex","integralbt","parenrighttp","parenrightex","parenrightbt","bracketrighttp","bracketrightex","bracketrightbt","bracerighttp","bracerightmid","bracerightbt",""],yi=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","a1","a2","a202","a3","a4","a5","a119","a118","a117","a11","a12","a13","a14","a15","a16","a105","a17","a18","a19","a20","a21","a22","a23","a24","a25","a26","a27","a28","a6","a7","a8","a9","a10","a29","a30","a31","a32","a33","a34","a35","a36","a37","a38","a39","a40","a41","a42","a43","a44","a45","a46","a47","a48","a49","a50","a51","a52","a53","a54","a55","a56","a57","a58","a59","a60","a61","a62","a63","a64","a65","a66","a67","a68","a69","a70","a71","a72","a73","a74","a203","a75","a204","a76","a77","a78","a79","a81","a82","a83","a84","a97","a98","a99","a100","","a89","a90","a93","a94","a91","a92","a205","a85","a206","a86","a87","a88","a95","a96","","","","","","","","","","","","","","","","","","","","a101","a102","a103","a104","a106","a107","a108","a112","a111","a110","a109","a120","a121","a122","a123","a124","a125","a126","a127","a128","a129","a130","a131","a132","a133","a134","a135","a136","a137","a138","a139","a140","a141","a142","a143","a144","a145","a146","a147","a148","a149","a150","a151","a152","a153","a154","a155","a156","a157","a158","a159","a160","a161","a163","a164","a196","a165","a192","a166","a167","a168","a169","a170","a171","a172","a173","a162","a174","a175","a176","a177","a178","a179","a193","a180","a199","a181","a200","a182","","a201","a183","a184","a197","a185","a194","a198","a186","a195","a187","a188","a189","a190","a191",""];function getEncoding(e){switch(e){case"WinAnsiEncoding":return pi;case"StandardEncoding":return fi;case"MacRomanEncoding":return di;case"SymbolSetEncoding":return mi;case"ZapfDingbatsEncoding":return yi;case"ExpertEncoding":return Ei;case"MacExpertEncoding":return ui;default:return null}}const wi=[".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","questiondown","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi","lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree","thorn","threequarters","twosuperior","registered","minus","eth","multiply","threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring","Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde","ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve","otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute","ydieresis","zcaron","exclamsmall","Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","commasuperior","threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","ffi","ffl","parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash","hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall","001.000","001.001","001.002","001.003","Black","Bold","Book","Light","Medium","Regular","Roman","Semibold"],Di=391,bi=[null,{id:"hstem",min:2,stackClearing:!0,stem:!0},null,{id:"vstem",min:2,stackClearing:!0,stem:!0},{id:"vmoveto",min:1,stackClearing:!0},{id:"rlineto",min:2,resetStack:!0},{id:"hlineto",min:1,resetStack:!0},{id:"vlineto",min:1,resetStack:!0},{id:"rrcurveto",min:6,resetStack:!0},null,{id:"callsubr",min:1,undefStack:!0},{id:"return",min:0,undefStack:!0},null,null,{id:"endchar",min:0,stackClearing:!0},null,null,null,{id:"hstemhm",min:2,stackClearing:!0,stem:!0},{id:"hintmask",min:0,stackClearing:!0},{id:"cntrmask",min:0,stackClearing:!0},{id:"rmoveto",min:2,stackClearing:!0},{id:"hmoveto",min:1,stackClearing:!0},{id:"vstemhm",min:2,stackClearing:!0,stem:!0},{id:"rcurveline",min:8,resetStack:!0},{id:"rlinecurve",min:8,resetStack:!0},{id:"vvcurveto",min:4,resetStack:!0},{id:"hhcurveto",min:4,resetStack:!0},null,{id:"callgsubr",min:1,undefStack:!0},{id:"vhcurveto",min:4,resetStack:!0},{id:"hvcurveto",min:4,resetStack:!0}],Fi=[null,null,null,{id:"and",min:2,stackDelta:-1},{id:"or",min:2,stackDelta:-1},{id:"not",min:1,stackDelta:0},null,null,null,{id:"abs",min:1,stackDelta:0},{id:"add",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]+e[t-1]}},{id:"sub",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]-e[t-1]}},{id:"div",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]/e[t-1]}},null,{id:"neg",min:1,stackDelta:0,stackFn(e,t){e[t-1]=-e[t-1]}},{id:"eq",min:2,stackDelta:-1},null,null,{id:"drop",min:1,stackDelta:-1},null,{id:"put",min:2,stackDelta:-2},{id:"get",min:1,stackDelta:0},{id:"ifelse",min:4,stackDelta:-3},{id:"random",min:0,stackDelta:1},{id:"mul",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]*e[t-1]}},null,{id:"sqrt",min:1,stackDelta:0},{id:"dup",min:1,stackDelta:1},{id:"exch",min:2,stackDelta:0},{id:"index",min:2,stackDelta:0},{id:"roll",min:3,stackDelta:-2},null,null,null,{id:"hflex",min:7,resetStack:!0},{id:"flex",min:13,resetStack:!0},{id:"hflex1",min:9,resetStack:!0},{id:"flex1",min:11,resetStack:!0}];class CFFParser{constructor(e,t,i){this.bytes=e.getBytes();this.properties=t;this.seacAnalysisEnabled=!!i}parse(){const e=this.properties,t=new CFF;this.cff=t;const i=this.parseHeader(),a=this.parseIndex(i.endPos),s=this.parseIndex(a.endPos),r=this.parseIndex(s.endPos),n=this.parseIndex(r.endPos),g=this.parseDict(s.obj.get(0)),o=this.createDict(CFFTopDict,g,t.strings);t.header=i.obj;t.names=this.parseNameIndex(a.obj);t.strings=this.parseStringIndex(r.obj);t.topDict=o;t.globalSubrIndex=n.obj;this.parsePrivateDict(t.topDict);t.isCIDFont=o.hasName("ROS");const c=o.getByName("CharStrings"),C=this.parseIndex(c).obj,h=o.getByName("FontMatrix");h&&(e.fontMatrix=h);const l=o.getByName("FontBBox");if(l){e.ascent=Math.max(l[3],l[1]);e.descent=Math.min(l[1],l[3]);e.ascentScaled=!0}let Q,E;if(t.isCIDFont){const e=this.parseIndex(o.getByName("FDArray")).obj;for(let i=0,a=e.count;i<a;++i){const a=e.get(i),s=this.createDict(CFFTopDict,this.parseDict(a),t.strings);this.parsePrivateDict(s);t.fdArray.push(s)}E=null;Q=this.parseCharsets(o.getByName("charset"),C.count,t.strings,!0);t.fdSelect=this.parseFDSelect(o.getByName("FDSelect"),C.count)}else{Q=this.parseCharsets(o.getByName("charset"),C.count,t.strings,!1);E=this.parseEncoding(o.getByName("Encoding"),e,t.strings,Q.charset)}t.charset=Q;t.encoding=E;const u=this.parseCharStrings({charStrings:C,localSubrIndex:o.privateDict.subrsIndex,globalSubrIndex:n.obj,fdSelect:t.fdSelect,fdArray:t.fdArray,privateDict:o.privateDict});t.charStrings=u.charStrings;t.seacs=u.seacs;t.widths=u.widths;return t}parseHeader(){let e=this.bytes;const t=e.length;let i=0;for(;i<t&&1!==e[i];)++i;if(i>=t)throw new FormatError("Invalid CFF header");if(0!==i){info("cff data is shifted");e=e.subarray(i);this.bytes=e}const a=e[0],s=e[1],r=e[2],n=e[3];return{obj:new CFFHeader(a,s,r,n),endPos:r}}parseDict(e){let t=0;function parseOperand(){let i=e[t++];if(30===i)return function parseFloatOperand(){let i="";const a=15,s=["0","1","2","3","4","5","6","7","8","9",".","E","E-",null,"-"],r=e.length;for(;t<r;){const r=e[t++],n=r>>4,g=15&r;if(n===a)break;i+=s[n];if(g===a)break;i+=s[g]}return parseFloat(i)}();if(28===i){i=e[t++];i=(i<<24|e[t++]<<16)>>16;return i}if(29===i){i=e[t++];i=i<<8|e[t++];i=i<<8|e[t++];i=i<<8|e[t++];return i}if(i>=32&&i<=246)return i-139;if(i>=247&&i<=250)return 256*(i-247)+e[t++]+108;if(i>=251&&i<=254)return-256*(i-251)-e[t++]-108;warn('CFFParser_parseDict: "'+i+'" is a reserved command.');return NaN}let i=[];const a=[];t=0;const s=e.length;for(;t<s;){let s=e[t];if(s<=21){12===s&&(s=s<<8|e[++t]);a.push([s,i]);i=[];++t}else i.push(parseOperand())}return a}parseIndex(e){const t=new CFFIndex,i=this.bytes,a=i[e++]<<8|i[e++],s=[];let r,n,g=e;if(0!==a){const t=i[e++],o=e+(a+1)*t-1;for(r=0,n=a+1;r<n;++r){let a=0;for(let s=0;s<t;++s){a<<=8;a+=i[e++]}s.push(o+a)}g=s[a]}for(r=0,n=s.length-1;r<n;++r){const e=s[r],a=s[r+1];t.add(i.subarray(e,a))}return{obj:t,endPos:g}}parseNameIndex(e){const t=[];for(let i=0,a=e.count;i<a;++i){const a=e.get(i);t.push(bytesToString(a))}return t}parseStringIndex(e){const t=new CFFStrings;for(let i=0,a=e.count;i<a;++i){const a=e.get(i);t.add(bytesToString(a))}return t}createDict(e,t,i){const a=new e(i);for(const[e,i]of t)a.setByKey(e,i);return a}parseCharString(e,t,i,a){if(!t||e.callDepth>10)return!1;let s=e.stackSize;const r=e.stack;let n=t.length;for(let g=0;g<n;){const o=t[g++];let c=null;if(12===o){const e=t[g++];if(0===e){t[g-2]=139;t[g-1]=22;s=0}else c=Fi[e]}else if(28===o){r[s]=(t[g]<<24|t[g+1]<<16)>>16;g+=2;s++}else if(14===o){if(s>=4){s-=4;if(this.seacAnalysisEnabled){e.seac=r.slice(s,s+4);return!1}}c=bi[o]}else if(o>=32&&o<=246){r[s]=o-139;s++}else if(o>=247&&o<=254){r[s]=o<251?(o-247<<8)+t[g]+108:-(o-251<<8)-t[g]-108;g++;s++}else if(255===o){r[s]=(t[g]<<24|t[g+1]<<16|t[g+2]<<8|t[g+3])/65536;g+=4;s++}else if(19===o||20===o){e.hints+=s>>1;if(0===e.hints){t.copyWithin(g-1,g,-1);g-=1;n-=1;continue}g+=e.hints+7>>3;s%=2;c=bi[o]}else{if(10===o||29===o){const t=10===o?i:a;if(!t){c=bi[o];warn("Missing subrsIndex for "+c.id);return!1}let n=32768;t.count<1240?n=107:t.count<33900&&(n=1131);const g=r[--s]+n;if(g<0||g>=t.count||isNaN(g)){c=bi[o];warn("Out of bounds subrIndex for "+c.id);return!1}e.stackSize=s;e.callDepth++;if(!this.parseCharString(e,t.get(g),i,a))return!1;e.callDepth--;s=e.stackSize;continue}if(11===o){e.stackSize=s;return!0}if(0===o&&g===t.length){t[g-1]=14;c=bi[14]}else{if(9===o){t.copyWithin(g-1,g,-1);g-=1;n-=1;continue}c=bi[o]}}if(c){if(c.stem){e.hints+=s>>1;if(3===o||23===o)e.hasVStems=!0;else if(e.hasVStems&&(1===o||18===o)){warn("CFF stem hints are in wrong order");t[g-1]=1===o?3:23}}if("min"in c&&!e.undefStack&&s<c.min){warn("Not enough parameters for "+c.id+"; actual: "+s+", expected: "+c.min);if(0===s){t[g-1]=14;return!0}return!1}if(e.firstStackClearing&&c.stackClearing){e.firstStackClearing=!1;s-=c.min;s>=2&&c.stem?s%=2:s>1&&warn("Found too many parameters for stack-clearing command");s>0&&(e.width=r[s-1])}if("stackDelta"in c){"stackFn"in c&&c.stackFn(r,s);s+=c.stackDelta}else if(c.stackClearing)s=0;else if(c.resetStack){s=0;e.undefStack=!1}else if(c.undefStack){s=0;e.undefStack=!0;e.firstStackClearing=!1}}}n<t.length&&t.fill(14,n);e.stackSize=s;return!0}parseCharStrings({charStrings:e,localSubrIndex:t,globalSubrIndex:i,fdSelect:a,fdArray:s,privateDict:r}){const n=[],g=[],o=e.count;for(let c=0;c<o;c++){const o=e.get(c),C={callDepth:0,stackSize:0,stack:[],undefStack:!0,hints:0,firstStackClearing:!0,seac:null,width:null,hasVStems:!1};let h=!0,l=null,Q=r;if(a&&s.length){const e=a.getFDIndex(c);if(-1===e){warn("Glyph index is not in fd select.");h=!1}if(e>=s.length){warn("Invalid fd index for glyph index.");h=!1}if(h){Q=s[e].privateDict;l=Q.subrsIndex}}else t&&(l=t);h&&(h=this.parseCharString(C,o,l,i));if(null!==C.width){const e=Q.getByName("nominalWidthX");g[c]=e+C.width}else{const e=Q.getByName("defaultWidthX");g[c]=e}null!==C.seac&&(n[c]=C.seac);h||e.set(c,new Uint8Array([14]))}return{charStrings:e,seacs:n,widths:g}}emptyPrivateDictionary(e){const t=this.createDict(CFFPrivateDict,[],e.strings);e.setByKey(18,[0,0]);e.privateDict=t}parsePrivateDict(e){if(!e.hasName("Private")){this.emptyPrivateDictionary(e);return}const t=e.getByName("Private");if(!Array.isArray(t)||2!==t.length){e.removeByName("Private");return}const i=t[0],a=t[1];if(0===i||a>=this.bytes.length){this.emptyPrivateDictionary(e);return}const s=a+i,r=this.bytes.subarray(a,s),n=this.parseDict(r),g=this.createDict(CFFPrivateDict,n,e.strings);e.privateDict=g;0===g.getByName("ExpansionFactor")&&g.setByName("ExpansionFactor",.06);if(!g.getByName("Subrs"))return;const o=g.getByName("Subrs"),c=a+o;if(0===o||c>=this.bytes.length){this.emptyPrivateDictionary(e);return}const C=this.parseIndex(c);g.subrsIndex=C.obj}parseCharsets(e,t,i,a){if(0===e)return new CFFCharset(!0,Ri.ISO_ADOBE,Bi);if(1===e)return new CFFCharset(!0,Ri.EXPERT,li);if(2===e)return new CFFCharset(!0,Ri.EXPERT_SUBSET,Qi);const s=this.bytes,r=e,n=s[e++],g=[a?0:".notdef"];let o,c,C;t-=1;switch(n){case 0:for(C=0;C<t;C++){o=s[e++]<<8|s[e++];g.push(a?o:i.get(o))}break;case 1:for(;g.length<=t;){o=s[e++]<<8|s[e++];c=s[e++];for(C=0;C<=c;C++)g.push(a?o++:i.get(o++))}break;case 2:for(;g.length<=t;){o=s[e++]<<8|s[e++];c=s[e++]<<8|s[e++];for(C=0;C<=c;C++)g.push(a?o++:i.get(o++))}break;default:throw new FormatError("Unknown charset format")}const h=e,l=s.subarray(r,h);return new CFFCharset(!1,n,g,l)}parseEncoding(e,t,i,a){const s=Object.create(null),r=this.bytes;let n,g,o,c=!1,C=null;if(0===e||1===e){c=!0;n=e;const t=e?Ei:fi;for(g=0,o=a.length;g<o;g++){const e=t.indexOf(a[g]);-1!==e&&(s[e]=g)}}else{const t=e;n=r[e++];switch(127&n){case 0:const t=r[e++];for(g=1;g<=t;g++)s[r[e++]]=g;break;case 1:const i=r[e++];let a=1;for(g=0;g<i;g++){const t=r[e++],i=r[e++];for(let e=t;e<=t+i;e++)s[e]=a++}break;default:throw new FormatError(`Unknown encoding format: ${n} in CFF`)}const o=e;if(128&n){r[t]&=127;!function readSupplement(){const t=r[e++];for(g=0;g<t;g++){const t=r[e++],n=(r[e++]<<8)+(255&r[e++]);s[t]=a.indexOf(i.get(n))}}()}C=r.subarray(t,o)}n&=127;return new CFFEncoding(c,n,s,C)}parseFDSelect(e,t){const i=this.bytes,a=i[e++],s=[];let r;switch(a){case 0:for(r=0;r<t;++r){const t=i[e++];s.push(t)}break;case 3:const n=i[e++]<<8|i[e++];for(r=0;r<n;++r){let t=i[e++]<<8|i[e++];if(0===r&&0!==t){warn("parseFDSelect: The first range must have a first GID of 0 -- trying to recover.");t=0}const a=i[e++],n=i[e]<<8|i[e+1];for(let e=t;e<n;++e)s.push(a)}e+=2;break;default:throw new FormatError(`parseFDSelect: Unknown format "${a}".`)}if(s.length!==t)throw new FormatError("parseFDSelect: Invalid font data.");return new CFFFDSelect(a,s)}}class CFF{constructor(){this.header=null;this.names=[];this.topDict=null;this.strings=new CFFStrings;this.globalSubrIndex=null;this.encoding=null;this.charset=null;this.charStrings=null;this.fdArray=[];this.fdSelect=null;this.isCIDFont=!1}duplicateFirstGlyph(){if(this.charStrings.count>=65535){warn("Not enough space in charstrings to duplicate first glyph.");return}const e=this.charStrings.get(0);this.charStrings.add(e);this.isCIDFont&&this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0])}hasGlyphId(e){if(e<0||e>=this.charStrings.count)return!1;return this.charStrings.get(e).length>0}}class CFFHeader{constructor(e,t,i,a){this.major=e;this.minor=t;this.hdrSize=i;this.offSize=a}}class CFFStrings{constructor(){this.strings=[]}get(e){return e>=0&&e<=390?wi[e]:e-Di<=this.strings.length?this.strings[e-Di]:wi[0]}getSID(e){let t=wi.indexOf(e);if(-1!==t)return t;t=this.strings.indexOf(e);return-1!==t?t+Di:-1}add(e){this.strings.push(e)}get count(){return this.strings.length}}class CFFIndex{constructor(){this.objects=[];this.length=0}add(e){this.length+=e.length;this.objects.push(e)}set(e,t){this.length+=t.length-this.objects[e].length;this.objects[e]=t}get(e){return this.objects[e]}get count(){return this.objects.length}}class CFFDict{constructor(e,t){this.keyToNameMap=e.keyToNameMap;this.nameToKeyMap=e.nameToKeyMap;this.defaults=e.defaults;this.types=e.types;this.opcodes=e.opcodes;this.order=e.order;this.strings=t;this.values=Object.create(null)}setByKey(e,t){if(!(e in this.keyToNameMap))return!1;if(0===t.length)return!0;for(const i of t)if(isNaN(i)){warn(`Invalid CFFDict value: "${t}" for key "${e}".`);return!0}const i=this.types[e];"num"!==i&&"sid"!==i&&"offset"!==i||(t=t[0]);this.values[e]=t;return!0}setByName(e,t){if(!(e in this.nameToKeyMap))throw new FormatError(`Invalid dictionary name "${e}"`);this.values[this.nameToKeyMap[e]]=t}hasName(e){return this.nameToKeyMap[e]in this.values}getByName(e){if(!(e in this.nameToKeyMap))throw new FormatError(`Invalid dictionary name ${e}"`);const t=this.nameToKeyMap[e];return t in this.values?this.values[t]:this.defaults[t]}removeByName(e){delete this.values[this.nameToKeyMap[e]]}static createTables(e){const t={keyToNameMap:{},nameToKeyMap:{},defaults:{},types:{},opcodes:{},order:[]};for(const i of e){const e=Array.isArray(i[0])?(i[0][0]<<8)+i[0][1]:i[0];t.keyToNameMap[e]=i[1];t.nameToKeyMap[i[1]]=e;t.types[e]=i[2];t.defaults[e]=i[3];t.opcodes[e]=Array.isArray(i[0])?i[0]:[i[0]];t.order.push(e)}return t}}const Si=[[[12,30],"ROS",["sid","sid","num"],null],[[12,20],"SyntheticBase","num",null],[0,"version","sid",null],[1,"Notice","sid",null],[[12,0],"Copyright","sid",null],[2,"FullName","sid",null],[3,"FamilyName","sid",null],[4,"Weight","sid",null],[[12,1],"isFixedPitch","num",0],[[12,2],"ItalicAngle","num",0],[[12,3],"UnderlinePosition","num",-100],[[12,4],"UnderlineThickness","num",50],[[12,5],"PaintType","num",0],[[12,6],"CharstringType","num",2],[[12,7],"FontMatrix",["num","num","num","num","num","num"],[.001,0,0,.001,0,0]],[13,"UniqueID","num",null],[5,"FontBBox",["num","num","num","num"],[0,0,0,0]],[[12,8],"StrokeWidth","num",0],[14,"XUID","array",null],[15,"charset","offset",0],[16,"Encoding","offset",0],[17,"CharStrings","offset",0],[18,"Private",["offset","offset"],null],[[12,21],"PostScript","sid",null],[[12,22],"BaseFontName","sid",null],[[12,23],"BaseFontBlend","delta",null],[[12,31],"CIDFontVersion","num",0],[[12,32],"CIDFontRevision","num",0],[[12,33],"CIDFontType","num",0],[[12,34],"CIDCount","num",8720],[[12,35],"UIDBase","num",null],[[12,37],"FDSelect","offset",null],[[12,36],"FDArray","offset",null],[[12,38],"FontName","sid",null]];class CFFTopDict extends CFFDict{static get tables(){return shadow(this,"tables",this.createTables(Si))}constructor(e){super(CFFTopDict.tables,e);this.privateDict=null}}const ki=[[6,"BlueValues","delta",null],[7,"OtherBlues","delta",null],[8,"FamilyBlues","delta",null],[9,"FamilyOtherBlues","delta",null],[[12,9],"BlueScale","num",.039625],[[12,10],"BlueShift","num",7],[[12,11],"BlueFuzz","num",1],[10,"StdHW","num",null],[11,"StdVW","num",null],[[12,12],"StemSnapH","delta",null],[[12,13],"StemSnapV","delta",null],[[12,14],"ForceBold","num",0],[[12,17],"LanguageGroup","num",0],[[12,18],"ExpansionFactor","num",.06],[[12,19],"initialRandomSeed","num",0],[20,"defaultWidthX","num",0],[21,"nominalWidthX","num",0],[19,"Subrs","offset",null]];class CFFPrivateDict extends CFFDict{static get tables(){return shadow(this,"tables",this.createTables(ki))}constructor(e){super(CFFPrivateDict.tables,e);this.subrsIndex=null}}const Ri={ISO_ADOBE:0,EXPERT:1,EXPERT_SUBSET:2};class CFFCharset{constructor(e,t,i,a){this.predefined=e;this.format=t;this.charset=i;this.raw=a}}class CFFEncoding{constructor(e,t,i,a){this.predefined=e;this.format=t;this.encoding=i;this.raw=a}}class CFFFDSelect{constructor(e,t){this.format=e;this.fdSelect=t}getFDIndex(e){return e<0||e>=this.fdSelect.length?-1:this.fdSelect[e]}}class CFFOffsetTracker{constructor(){this.offsets=Object.create(null)}isTracking(e){return e in this.offsets}track(e,t){if(e in this.offsets)throw new FormatError(`Already tracking location of ${e}`);this.offsets[e]=t}offset(e){for(const t in this.offsets)this.offsets[t]+=e}setEntryLocation(e,t,i){if(!(e in this.offsets))throw new FormatError(`Not tracking location of ${e}`);const a=i.data,s=this.offsets[e];for(let e=0,i=t.length;e<i;++e){const i=5*e+s,r=i+1,n=i+2,g=i+3,o=i+4;if(29!==a[i]||0!==a[r]||0!==a[n]||0!==a[g]||0!==a[o])throw new FormatError("writing to an offset that is not empty");const c=t[e];a[i]=29;a[r]=c>>24&255;a[n]=c>>16&255;a[g]=c>>8&255;a[o]=255&c}}}class CFFCompiler{constructor(e){this.cff=e}compile(){const e=this.cff,t={data:[],length:0,add(e){try{this.data.push(...e)}catch{this.data=this.data.concat(e)}this.length=this.data.length}},i=this.compileHeader(e.header);t.add(i);const a=this.compileNameIndex(e.names);t.add(a);if(e.isCIDFont&&e.topDict.hasName("FontMatrix")){const t=e.topDict.getByName("FontMatrix");e.topDict.removeByName("FontMatrix");for(const i of e.fdArray){let e=t.slice(0);i.hasName("FontMatrix")&&(e=Util.transform(e,i.getByName("FontMatrix")));i.setByName("FontMatrix",e)}}const s=e.topDict.getByName("XUID");s?.length>16&&e.topDict.removeByName("XUID");e.topDict.setByName("charset",0);let r=this.compileTopDicts([e.topDict],t.length,e.isCIDFont);t.add(r.output);const n=r.trackers[0],g=this.compileStringIndex(e.strings.strings);t.add(g);const o=this.compileIndex(e.globalSubrIndex);t.add(o);if(e.encoding&&e.topDict.hasName("Encoding"))if(e.encoding.predefined)n.setEntryLocation("Encoding",[e.encoding.format],t);else{const i=this.compileEncoding(e.encoding);n.setEntryLocation("Encoding",[t.length],t);t.add(i)}const c=this.compileCharset(e.charset,e.charStrings.count,e.strings,e.isCIDFont);n.setEntryLocation("charset",[t.length],t);t.add(c);const C=this.compileCharStrings(e.charStrings);n.setEntryLocation("CharStrings",[t.length],t);t.add(C);if(e.isCIDFont){n.setEntryLocation("FDSelect",[t.length],t);const i=this.compileFDSelect(e.fdSelect);t.add(i);r=this.compileTopDicts(e.fdArray,t.length,!0);n.setEntryLocation("FDArray",[t.length],t);t.add(r.output);const a=r.trackers;this.compilePrivateDicts(e.fdArray,a,t)}this.compilePrivateDicts([e.topDict],[n],t);t.add([0]);return t.data}encodeNumber(e){return Number.isInteger(e)?this.encodeInteger(e):this.encodeFloat(e)}static get EncodeFloatRegExp(){return shadow(this,"EncodeFloatRegExp",/\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/)}encodeFloat(e){let t=e.toString();const i=CFFCompiler.EncodeFloatRegExp.exec(t);if(i){const a=parseFloat("1e"+((i[2]?+i[2]:0)+i[1].length));t=(Math.round(e*a)/a).toString()}let a,s,r="";for(a=0,s=t.length;a<s;++a){const e=t[a];r+="e"===e?"-"===t[++a]?"c":"b":"."===e?"a":"-"===e?"e":e}r+=1&r.length?"f":"ff";const n=[30];for(a=0,s=r.length;a<s;a+=2)n.push(parseInt(r.substring(a,a+2),16));return n}encodeInteger(e){let t;t=e>=-107&&e<=107?[e+139]:e>=108&&e<=1131?[247+((e-=108)>>8),255&e]:e>=-1131&&e<=-108?[251+((e=-e-108)>>8),255&e]:e>=-32768&&e<=32767?[28,e>>8&255,255&e]:[29,e>>24&255,e>>16&255,e>>8&255,255&e];return t}compileHeader(e){return[e.major,e.minor,4,e.offSize]}compileNameIndex(e){const t=new CFFIndex;for(const i of e){const e=Math.min(i.length,127);let a=new Array(e);for(let t=0;t<e;t++){let e=i[t];(e<"!"||e>"~"||"["===e||"]"===e||"("===e||")"===e||"{"===e||"}"===e||"<"===e||">"===e||"/"===e||"%"===e)&&(e="_");a[t]=e}a=a.join("");""===a&&(a="Bad_Font_Name");t.add(stringToBytes(a))}return this.compileIndex(t)}compileTopDicts(e,t,i){const a=[];let s=new CFFIndex;for(const r of e){if(i){r.removeByName("CIDFontVersion");r.removeByName("CIDFontRevision");r.removeByName("CIDFontType");r.removeByName("CIDCount");r.removeByName("UIDBase")}const e=new CFFOffsetTracker,n=this.compileDict(r,e);a.push(e);s.add(n);e.offset(t)}s=this.compileIndex(s,a);return{trackers:a,output:s}}compilePrivateDicts(e,t,i){for(let a=0,s=e.length;a<s;++a){const s=e[a],r=s.privateDict;if(!r||!s.hasName("Private"))throw new FormatError("There must be a private dictionary.");const n=new CFFOffsetTracker,g=this.compileDict(r,n);let o=i.length;n.offset(o);g.length||(o=0);t[a].setEntryLocation("Private",[g.length,o],i);i.add(g);if(r.subrsIndex&&r.hasName("Subrs")){const e=this.compileIndex(r.subrsIndex);n.setEntryLocation("Subrs",[g.length],i);i.add(e)}}}compileDict(e,t){const i=[];for(const a of e.order){if(!(a in e.values))continue;let s=e.values[a],r=e.types[a];Array.isArray(r)||(r=[r]);Array.isArray(s)||(s=[s]);if(0!==s.length){for(let n=0,g=r.length;n<g;++n){const g=r[n],o=s[n];switch(g){case"num":case"sid":i.push(...this.encodeNumber(o));break;case"offset":const r=e.keyToNameMap[a];t.isTracking(r)||t.track(r,i.length);i.push(29,0,0,0,0);break;case"array":case"delta":i.push(...this.encodeNumber(o));for(let e=1,t=s.length;e<t;++e)i.push(...this.encodeNumber(s[e]));break;default:throw new FormatError(`Unknown data type of ${g}`)}}i.push(...e.opcodes[a])}}return i}compileStringIndex(e){const t=new CFFIndex;for(const i of e)t.add(stringToBytes(i));return this.compileIndex(t)}compileCharStrings(e){const t=new CFFIndex;for(let i=0;i<e.count;i++){const a=e.get(i);0!==a.length?t.add(a):t.add(new Uint8Array([139,14]))}return this.compileIndex(t)}compileCharset(e,t,i,a){let s;const r=t-1;if(a)s=new Uint8Array([2,0,0,r>>8&255,255&r]);else{s=new Uint8Array(1+2*r);s[0]=0;let t=0;const a=e.charset.length;let n=!1;for(let r=1;r<s.length;r+=2){let g=0;if(t<a){const a=e.charset[t++];g=i.getSID(a);if(-1===g){g=0;if(!n){n=!0;warn(`Couldn't find ${a} in CFF strings`)}}}s[r]=g>>8&255;s[r+1]=255&g}}return this.compileTypedArray(s)}compileEncoding(e){return this.compileTypedArray(e.raw)}compileFDSelect(e){const t=e.format;let i,a;switch(t){case 0:i=new Uint8Array(1+e.fdSelect.length);i[0]=t;for(a=0;a<e.fdSelect.length;a++)i[a+1]=e.fdSelect[a];break;case 3:const s=0;let r=e.fdSelect[0];const n=[t,0,0,s>>8&255,255&s,r];for(a=1;a<e.fdSelect.length;a++){const t=e.fdSelect[a];if(t!==r){n.push(a>>8&255,255&a,t);r=t}}const g=(n.length-3)/3;n[1]=g>>8&255;n[2]=255&g;n.push(a>>8&255,255&a);i=new Uint8Array(n)}return this.compileTypedArray(i)}compileTypedArray(e){return Array.from(e)}compileIndex(e,t=[]){const i=e.objects,a=i.length;if(0===a)return[0,0];const s=[a>>8&255,255&a];let r,n,g=1;for(r=0;r<a;++r)g+=i[r].length;n=g<256?1:g<65536?2:g<16777216?3:4;s.push(n);let o=1;for(r=0;r<a+1;r++){1===n?s.push(255&o):2===n?s.push(o>>8&255,255&o):3===n?s.push(o>>16&255,o>>8&255,255&o):s.push(o>>>24&255,o>>16&255,o>>8&255,255&o);i[r]&&(o+=i[r].length)}for(r=0;r<a;r++){t[r]&&t[r].offset(s.length);s.push(...i[r])}return s}}const Ni=getLookupTableFactory((function(e){e.A=65;e.AE=198;e.AEacute=508;e.AEmacron=482;e.AEsmall=63462;e.Aacute=193;e.Aacutesmall=63457;e.Abreve=258;e.Abreveacute=7854;e.Abrevecyrillic=1232;e.Abrevedotbelow=7862;e.Abrevegrave=7856;e.Abrevehookabove=7858;e.Abrevetilde=7860;e.Acaron=461;e.Acircle=9398;e.Acircumflex=194;e.Acircumflexacute=7844;e.Acircumflexdotbelow=7852;e.Acircumflexgrave=7846;e.Acircumflexhookabove=7848;e.Acircumflexsmall=63458;e.Acircumflextilde=7850;e.Acute=63177;e.Acutesmall=63412;e.Acyrillic=1040;e.Adblgrave=512;e.Adieresis=196;e.Adieresiscyrillic=1234;e.Adieresismacron=478;e.Adieresissmall=63460;e.Adotbelow=7840;e.Adotmacron=480;e.Agrave=192;e.Agravesmall=63456;e.Ahookabove=7842;e.Aiecyrillic=1236;e.Ainvertedbreve=514;e.Alpha=913;e.Alphatonos=902;e.Amacron=256;e.Amonospace=65313;e.Aogonek=260;e.Aring=197;e.Aringacute=506;e.Aringbelow=7680;e.Aringsmall=63461;e.Asmall=63329;e.Atilde=195;e.Atildesmall=63459;e.Aybarmenian=1329;e.B=66;e.Bcircle=9399;e.Bdotaccent=7682;e.Bdotbelow=7684;e.Becyrillic=1041;e.Benarmenian=1330;e.Beta=914;e.Bhook=385;e.Blinebelow=7686;e.Bmonospace=65314;e.Brevesmall=63220;e.Bsmall=63330;e.Btopbar=386;e.C=67;e.Caarmenian=1342;e.Cacute=262;e.Caron=63178;e.Caronsmall=63221;e.Ccaron=268;e.Ccedilla=199;e.Ccedillaacute=7688;e.Ccedillasmall=63463;e.Ccircle=9400;e.Ccircumflex=264;e.Cdot=266;e.Cdotaccent=266;e.Cedillasmall=63416;e.Chaarmenian=1353;e.Cheabkhasiancyrillic=1212;e.Checyrillic=1063;e.Chedescenderabkhasiancyrillic=1214;e.Chedescendercyrillic=1206;e.Chedieresiscyrillic=1268;e.Cheharmenian=1347;e.Chekhakassiancyrillic=1227;e.Cheverticalstrokecyrillic=1208;e.Chi=935;e.Chook=391;e.Circumflexsmall=63222;e.Cmonospace=65315;e.Coarmenian=1361;e.Csmall=63331;e.D=68;e.DZ=497;e.DZcaron=452;e.Daarmenian=1332;e.Dafrican=393;e.Dcaron=270;e.Dcedilla=7696;e.Dcircle=9401;e.Dcircumflexbelow=7698;e.Dcroat=272;e.Ddotaccent=7690;e.Ddotbelow=7692;e.Decyrillic=1044;e.Deicoptic=1006;e.Delta=8710;e.Deltagreek=916;e.Dhook=394;e.Dieresis=63179;e.DieresisAcute=63180;e.DieresisGrave=63181;e.Dieresissmall=63400;e.Digammagreek=988;e.Djecyrillic=1026;e.Dlinebelow=7694;e.Dmonospace=65316;e.Dotaccentsmall=63223;e.Dslash=272;e.Dsmall=63332;e.Dtopbar=395;e.Dz=498;e.Dzcaron=453;e.Dzeabkhasiancyrillic=1248;e.Dzecyrillic=1029;e.Dzhecyrillic=1039;e.E=69;e.Eacute=201;e.Eacutesmall=63465;e.Ebreve=276;e.Ecaron=282;e.Ecedillabreve=7708;e.Echarmenian=1333;e.Ecircle=9402;e.Ecircumflex=202;e.Ecircumflexacute=7870;e.Ecircumflexbelow=7704;e.Ecircumflexdotbelow=7878;e.Ecircumflexgrave=7872;e.Ecircumflexhookabove=7874;e.Ecircumflexsmall=63466;e.Ecircumflextilde=7876;e.Ecyrillic=1028;e.Edblgrave=516;e.Edieresis=203;e.Edieresissmall=63467;e.Edot=278;e.Edotaccent=278;e.Edotbelow=7864;e.Efcyrillic=1060;e.Egrave=200;e.Egravesmall=63464;e.Eharmenian=1335;e.Ehookabove=7866;e.Eightroman=8551;e.Einvertedbreve=518;e.Eiotifiedcyrillic=1124;e.Elcyrillic=1051;e.Elevenroman=8554;e.Emacron=274;e.Emacronacute=7702;e.Emacrongrave=7700;e.Emcyrillic=1052;e.Emonospace=65317;e.Encyrillic=1053;e.Endescendercyrillic=1186;e.Eng=330;e.Enghecyrillic=1188;e.Enhookcyrillic=1223;e.Eogonek=280;e.Eopen=400;e.Epsilon=917;e.Epsilontonos=904;e.Ercyrillic=1056;e.Ereversed=398;e.Ereversedcyrillic=1069;e.Escyrillic=1057;e.Esdescendercyrillic=1194;e.Esh=425;e.Esmall=63333;e.Eta=919;e.Etarmenian=1336;e.Etatonos=905;e.Eth=208;e.Ethsmall=63472;e.Etilde=7868;e.Etildebelow=7706;e.Euro=8364;e.Ezh=439;e.Ezhcaron=494;e.Ezhreversed=440;e.F=70;e.Fcircle=9403;e.Fdotaccent=7710;e.Feharmenian=1366;e.Feicoptic=996;e.Fhook=401;e.Fitacyrillic=1138;e.Fiveroman=8548;e.Fmonospace=65318;e.Fourroman=8547;e.Fsmall=63334;e.G=71;e.GBsquare=13191;e.Gacute=500;e.Gamma=915;e.Gammaafrican=404;e.Gangiacoptic=1002;e.Gbreve=286;e.Gcaron=486;e.Gcedilla=290;e.Gcircle=9404;e.Gcircumflex=284;e.Gcommaaccent=290;e.Gdot=288;e.Gdotaccent=288;e.Gecyrillic=1043;e.Ghadarmenian=1346;e.Ghemiddlehookcyrillic=1172;e.Ghestrokecyrillic=1170;e.Gheupturncyrillic=1168;e.Ghook=403;e.Gimarmenian=1331;e.Gjecyrillic=1027;e.Gmacron=7712;e.Gmonospace=65319;e.Grave=63182;e.Gravesmall=63328;e.Gsmall=63335;e.Gsmallhook=667;e.Gstroke=484;e.H=72;e.H18533=9679;e.H18543=9642;e.H18551=9643;e.H22073=9633;e.HPsquare=13259;e.Haabkhasiancyrillic=1192;e.Hadescendercyrillic=1202;e.Hardsigncyrillic=1066;e.Hbar=294;e.Hbrevebelow=7722;e.Hcedilla=7720;e.Hcircle=9405;e.Hcircumflex=292;e.Hdieresis=7718;e.Hdotaccent=7714;e.Hdotbelow=7716;e.Hmonospace=65320;e.Hoarmenian=1344;e.Horicoptic=1e3;e.Hsmall=63336;e.Hungarumlaut=63183;e.Hungarumlautsmall=63224;e.Hzsquare=13200;e.I=73;e.IAcyrillic=1071;e.IJ=306;e.IUcyrillic=1070;e.Iacute=205;e.Iacutesmall=63469;e.Ibreve=300;e.Icaron=463;e.Icircle=9406;e.Icircumflex=206;e.Icircumflexsmall=63470;e.Icyrillic=1030;e.Idblgrave=520;e.Idieresis=207;e.Idieresisacute=7726;e.Idieresiscyrillic=1252;e.Idieresissmall=63471;e.Idot=304;e.Idotaccent=304;e.Idotbelow=7882;e.Iebrevecyrillic=1238;e.Iecyrillic=1045;e.Ifraktur=8465;e.Igrave=204;e.Igravesmall=63468;e.Ihookabove=7880;e.Iicyrillic=1048;e.Iinvertedbreve=522;e.Iishortcyrillic=1049;e.Imacron=298;e.Imacroncyrillic=1250;e.Imonospace=65321;e.Iniarmenian=1339;e.Iocyrillic=1025;e.Iogonek=302;e.Iota=921;e.Iotaafrican=406;e.Iotadieresis=938;e.Iotatonos=906;e.Ismall=63337;e.Istroke=407;e.Itilde=296;e.Itildebelow=7724;e.Izhitsacyrillic=1140;e.Izhitsadblgravecyrillic=1142;e.J=74;e.Jaarmenian=1345;e.Jcircle=9407;e.Jcircumflex=308;e.Jecyrillic=1032;e.Jheharmenian=1355;e.Jmonospace=65322;e.Jsmall=63338;e.K=75;e.KBsquare=13189;e.KKsquare=13261;e.Kabashkircyrillic=1184;e.Kacute=7728;e.Kacyrillic=1050;e.Kadescendercyrillic=1178;e.Kahookcyrillic=1219;e.Kappa=922;e.Kastrokecyrillic=1182;e.Kaverticalstrokecyrillic=1180;e.Kcaron=488;e.Kcedilla=310;e.Kcircle=9408;e.Kcommaaccent=310;e.Kdotbelow=7730;e.Keharmenian=1364;e.Kenarmenian=1343;e.Khacyrillic=1061;e.Kheicoptic=998;e.Khook=408;e.Kjecyrillic=1036;e.Klinebelow=7732;e.Kmonospace=65323;e.Koppacyrillic=1152;e.Koppagreek=990;e.Ksicyrillic=1134;e.Ksmall=63339;e.L=76;e.LJ=455;e.LL=63167;e.Lacute=313;e.Lambda=923;e.Lcaron=317;e.Lcedilla=315;e.Lcircle=9409;e.Lcircumflexbelow=7740;e.Lcommaaccent=315;e.Ldot=319;e.Ldotaccent=319;e.Ldotbelow=7734;e.Ldotbelowmacron=7736;e.Liwnarmenian=1340;e.Lj=456;e.Ljecyrillic=1033;e.Llinebelow=7738;e.Lmonospace=65324;e.Lslash=321;e.Lslashsmall=63225;e.Lsmall=63340;e.M=77;e.MBsquare=13190;e.Macron=63184;e.Macronsmall=63407;e.Macute=7742;e.Mcircle=9410;e.Mdotaccent=7744;e.Mdotbelow=7746;e.Menarmenian=1348;e.Mmonospace=65325;e.Msmall=63341;e.Mturned=412;e.Mu=924;e.N=78;e.NJ=458;e.Nacute=323;e.Ncaron=327;e.Ncedilla=325;e.Ncircle=9411;e.Ncircumflexbelow=7754;e.Ncommaaccent=325;e.Ndotaccent=7748;e.Ndotbelow=7750;e.Nhookleft=413;e.Nineroman=8552;e.Nj=459;e.Njecyrillic=1034;e.Nlinebelow=7752;e.Nmonospace=65326;e.Nowarmenian=1350;e.Nsmall=63342;e.Ntilde=209;e.Ntildesmall=63473;e.Nu=925;e.O=79;e.OE=338;e.OEsmall=63226;e.Oacute=211;e.Oacutesmall=63475;e.Obarredcyrillic=1256;e.Obarreddieresiscyrillic=1258;e.Obreve=334;e.Ocaron=465;e.Ocenteredtilde=415;e.Ocircle=9412;e.Ocircumflex=212;e.Ocircumflexacute=7888;e.Ocircumflexdotbelow=7896;e.Ocircumflexgrave=7890;e.Ocircumflexhookabove=7892;e.Ocircumflexsmall=63476;e.Ocircumflextilde=7894;e.Ocyrillic=1054;e.Odblacute=336;e.Odblgrave=524;e.Odieresis=214;e.Odieresiscyrillic=1254;e.Odieresissmall=63478;e.Odotbelow=7884;e.Ogoneksmall=63227;e.Ograve=210;e.Ogravesmall=63474;e.Oharmenian=1365;e.Ohm=8486;e.Ohookabove=7886;e.Ohorn=416;e.Ohornacute=7898;e.Ohorndotbelow=7906;e.Ohorngrave=7900;e.Ohornhookabove=7902;e.Ohorntilde=7904;e.Ohungarumlaut=336;e.Oi=418;e.Oinvertedbreve=526;e.Omacron=332;e.Omacronacute=7762;e.Omacrongrave=7760;e.Omega=8486;e.Omegacyrillic=1120;e.Omegagreek=937;e.Omegaroundcyrillic=1146;e.Omegatitlocyrillic=1148;e.Omegatonos=911;e.Omicron=927;e.Omicrontonos=908;e.Omonospace=65327;e.Oneroman=8544;e.Oogonek=490;e.Oogonekmacron=492;e.Oopen=390;e.Oslash=216;e.Oslashacute=510;e.Oslashsmall=63480;e.Osmall=63343;e.Ostrokeacute=510;e.Otcyrillic=1150;e.Otilde=213;e.Otildeacute=7756;e.Otildedieresis=7758;e.Otildesmall=63477;e.P=80;e.Pacute=7764;e.Pcircle=9413;e.Pdotaccent=7766;e.Pecyrillic=1055;e.Peharmenian=1354;e.Pemiddlehookcyrillic=1190;e.Phi=934;e.Phook=420;e.Pi=928;e.Piwrarmenian=1363;e.Pmonospace=65328;e.Psi=936;e.Psicyrillic=1136;e.Psmall=63344;e.Q=81;e.Qcircle=9414;e.Qmonospace=65329;e.Qsmall=63345;e.R=82;e.Raarmenian=1356;e.Racute=340;e.Rcaron=344;e.Rcedilla=342;e.Rcircle=9415;e.Rcommaaccent=342;e.Rdblgrave=528;e.Rdotaccent=7768;e.Rdotbelow=7770;e.Rdotbelowmacron=7772;e.Reharmenian=1360;e.Rfraktur=8476;e.Rho=929;e.Ringsmall=63228;e.Rinvertedbreve=530;e.Rlinebelow=7774;e.Rmonospace=65330;e.Rsmall=63346;e.Rsmallinverted=641;e.Rsmallinvertedsuperior=694;e.S=83;e.SF010000=9484;e.SF020000=9492;e.SF030000=9488;e.SF040000=9496;e.SF050000=9532;e.SF060000=9516;e.SF070000=9524;e.SF080000=9500;e.SF090000=9508;e.SF100000=9472;e.SF110000=9474;e.SF190000=9569;e.SF200000=9570;e.SF210000=9558;e.SF220000=9557;e.SF230000=9571;e.SF240000=9553;e.SF250000=9559;e.SF260000=9565;e.SF270000=9564;e.SF280000=9563;e.SF360000=9566;e.SF370000=9567;e.SF380000=9562;e.SF390000=9556;e.SF400000=9577;e.SF410000=9574;e.SF420000=9568;e.SF430000=9552;e.SF440000=9580;e.SF450000=9575;e.SF460000=9576;e.SF470000=9572;e.SF480000=9573;e.SF490000=9561;e.SF500000=9560;e.SF510000=9554;e.SF520000=9555;e.SF530000=9579;e.SF540000=9578;e.Sacute=346;e.Sacutedotaccent=7780;e.Sampigreek=992;e.Scaron=352;e.Scarondotaccent=7782;e.Scaronsmall=63229;e.Scedilla=350;e.Schwa=399;e.Schwacyrillic=1240;e.Schwadieresiscyrillic=1242;e.Scircle=9416;e.Scircumflex=348;e.Scommaaccent=536;e.Sdotaccent=7776;e.Sdotbelow=7778;e.Sdotbelowdotaccent=7784;e.Seharmenian=1357;e.Sevenroman=8550;e.Shaarmenian=1351;e.Shacyrillic=1064;e.Shchacyrillic=1065;e.Sheicoptic=994;e.Shhacyrillic=1210;e.Shimacoptic=1004;e.Sigma=931;e.Sixroman=8549;e.Smonospace=65331;e.Softsigncyrillic=1068;e.Ssmall=63347;e.Stigmagreek=986;e.T=84;e.Tau=932;e.Tbar=358;e.Tcaron=356;e.Tcedilla=354;e.Tcircle=9417;e.Tcircumflexbelow=7792;e.Tcommaaccent=354;e.Tdotaccent=7786;e.Tdotbelow=7788;e.Tecyrillic=1058;e.Tedescendercyrillic=1196;e.Tenroman=8553;e.Tetsecyrillic=1204;e.Theta=920;e.Thook=428;e.Thorn=222;e.Thornsmall=63486;e.Threeroman=8546;e.Tildesmall=63230;e.Tiwnarmenian=1359;e.Tlinebelow=7790;e.Tmonospace=65332;e.Toarmenian=1337;e.Tonefive=444;e.Tonesix=388;e.Tonetwo=423;e.Tretroflexhook=430;e.Tsecyrillic=1062;e.Tshecyrillic=1035;e.Tsmall=63348;e.Twelveroman=8555;e.Tworoman=8545;e.U=85;e.Uacute=218;e.Uacutesmall=63482;e.Ubreve=364;e.Ucaron=467;e.Ucircle=9418;e.Ucircumflex=219;e.Ucircumflexbelow=7798;e.Ucircumflexsmall=63483;e.Ucyrillic=1059;e.Udblacute=368;e.Udblgrave=532;e.Udieresis=220;e.Udieresisacute=471;e.Udieresisbelow=7794;e.Udieresiscaron=473;e.Udieresiscyrillic=1264;e.Udieresisgrave=475;e.Udieresismacron=469;e.Udieresissmall=63484;e.Udotbelow=7908;e.Ugrave=217;e.Ugravesmall=63481;e.Uhookabove=7910;e.Uhorn=431;e.Uhornacute=7912;e.Uhorndotbelow=7920;e.Uhorngrave=7914;e.Uhornhookabove=7916;e.Uhorntilde=7918;e.Uhungarumlaut=368;e.Uhungarumlautcyrillic=1266;e.Uinvertedbreve=534;e.Ukcyrillic=1144;e.Umacron=362;e.Umacroncyrillic=1262;e.Umacrondieresis=7802;e.Umonospace=65333;e.Uogonek=370;e.Upsilon=933;e.Upsilon1=978;e.Upsilonacutehooksymbolgreek=979;e.Upsilonafrican=433;e.Upsilondieresis=939;e.Upsilondieresishooksymbolgreek=980;e.Upsilonhooksymbol=978;e.Upsilontonos=910;e.Uring=366;e.Ushortcyrillic=1038;e.Usmall=63349;e.Ustraightcyrillic=1198;e.Ustraightstrokecyrillic=1200;e.Utilde=360;e.Utildeacute=7800;e.Utildebelow=7796;e.V=86;e.Vcircle=9419;e.Vdotbelow=7806;e.Vecyrillic=1042;e.Vewarmenian=1358;e.Vhook=434;e.Vmonospace=65334;e.Voarmenian=1352;e.Vsmall=63350;e.Vtilde=7804;e.W=87;e.Wacute=7810;e.Wcircle=9420;e.Wcircumflex=372;e.Wdieresis=7812;e.Wdotaccent=7814;e.Wdotbelow=7816;e.Wgrave=7808;e.Wmonospace=65335;e.Wsmall=63351;e.X=88;e.Xcircle=9421;e.Xdieresis=7820;e.Xdotaccent=7818;e.Xeharmenian=1341;e.Xi=926;e.Xmonospace=65336;e.Xsmall=63352;e.Y=89;e.Yacute=221;e.Yacutesmall=63485;e.Yatcyrillic=1122;e.Ycircle=9422;e.Ycircumflex=374;e.Ydieresis=376;e.Ydieresissmall=63487;e.Ydotaccent=7822;e.Ydotbelow=7924;e.Yericyrillic=1067;e.Yerudieresiscyrillic=1272;e.Ygrave=7922;e.Yhook=435;e.Yhookabove=7926;e.Yiarmenian=1349;e.Yicyrillic=1031;e.Yiwnarmenian=1362;e.Ymonospace=65337;e.Ysmall=63353;e.Ytilde=7928;e.Yusbigcyrillic=1130;e.Yusbigiotifiedcyrillic=1132;e.Yuslittlecyrillic=1126;e.Yuslittleiotifiedcyrillic=1128;e.Z=90;e.Zaarmenian=1334;e.Zacute=377;e.Zcaron=381;e.Zcaronsmall=63231;e.Zcircle=9423;e.Zcircumflex=7824;e.Zdot=379;e.Zdotaccent=379;e.Zdotbelow=7826;e.Zecyrillic=1047;e.Zedescendercyrillic=1176;e.Zedieresiscyrillic=1246;e.Zeta=918;e.Zhearmenian=1338;e.Zhebrevecyrillic=1217;e.Zhecyrillic=1046;e.Zhedescendercyrillic=1174;e.Zhedieresiscyrillic=1244;e.Zlinebelow=7828;e.Zmonospace=65338;e.Zsmall=63354;e.Zstroke=437;e.a=97;e.aabengali=2438;e.aacute=225;e.aadeva=2310;e.aagujarati=2694;e.aagurmukhi=2566;e.aamatragurmukhi=2622;e.aarusquare=13059;e.aavowelsignbengali=2494;e.aavowelsigndeva=2366;e.aavowelsigngujarati=2750;e.abbreviationmarkarmenian=1375;e.abbreviationsigndeva=2416;e.abengali=2437;e.abopomofo=12570;e.abreve=259;e.abreveacute=7855;e.abrevecyrillic=1233;e.abrevedotbelow=7863;e.abrevegrave=7857;e.abrevehookabove=7859;e.abrevetilde=7861;e.acaron=462;e.acircle=9424;e.acircumflex=226;e.acircumflexacute=7845;e.acircumflexdotbelow=7853;e.acircumflexgrave=7847;e.acircumflexhookabove=7849;e.acircumflextilde=7851;e.acute=180;e.acutebelowcmb=791;e.acutecmb=769;e.acutecomb=769;e.acutedeva=2388;e.acutelowmod=719;e.acutetonecmb=833;e.acyrillic=1072;e.adblgrave=513;e.addakgurmukhi=2673;e.adeva=2309;e.adieresis=228;e.adieresiscyrillic=1235;e.adieresismacron=479;e.adotbelow=7841;e.adotmacron=481;e.ae=230;e.aeacute=509;e.aekorean=12624;e.aemacron=483;e.afii00208=8213;e.afii08941=8356;e.afii10017=1040;e.afii10018=1041;e.afii10019=1042;e.afii10020=1043;e.afii10021=1044;e.afii10022=1045;e.afii10023=1025;e.afii10024=1046;e.afii10025=1047;e.afii10026=1048;e.afii10027=1049;e.afii10028=1050;e.afii10029=1051;e.afii10030=1052;e.afii10031=1053;e.afii10032=1054;e.afii10033=1055;e.afii10034=1056;e.afii10035=1057;e.afii10036=1058;e.afii10037=1059;e.afii10038=1060;e.afii10039=1061;e.afii10040=1062;e.afii10041=1063;e.afii10042=1064;e.afii10043=1065;e.afii10044=1066;e.afii10045=1067;e.afii10046=1068;e.afii10047=1069;e.afii10048=1070;e.afii10049=1071;e.afii10050=1168;e.afii10051=1026;e.afii10052=1027;e.afii10053=1028;e.afii10054=1029;e.afii10055=1030;e.afii10056=1031;e.afii10057=1032;e.afii10058=1033;e.afii10059=1034;e.afii10060=1035;e.afii10061=1036;e.afii10062=1038;e.afii10063=63172;e.afii10064=63173;e.afii10065=1072;e.afii10066=1073;e.afii10067=1074;e.afii10068=1075;e.afii10069=1076;e.afii10070=1077;e.afii10071=1105;e.afii10072=1078;e.afii10073=1079;e.afii10074=1080;e.afii10075=1081;e.afii10076=1082;e.afii10077=1083;e.afii10078=1084;e.afii10079=1085;e.afii10080=1086;e.afii10081=1087;e.afii10082=1088;e.afii10083=1089;e.afii10084=1090;e.afii10085=1091;e.afii10086=1092;e.afii10087=1093;e.afii10088=1094;e.afii10089=1095;e.afii10090=1096;e.afii10091=1097;e.afii10092=1098;e.afii10093=1099;e.afii10094=1100;e.afii10095=1101;e.afii10096=1102;e.afii10097=1103;e.afii10098=1169;e.afii10099=1106;e.afii10100=1107;e.afii10101=1108;e.afii10102=1109;e.afii10103=1110;e.afii10104=1111;e.afii10105=1112;e.afii10106=1113;e.afii10107=1114;e.afii10108=1115;e.afii10109=1116;e.afii10110=1118;e.afii10145=1039;e.afii10146=1122;e.afii10147=1138;e.afii10148=1140;e.afii10192=63174;e.afii10193=1119;e.afii10194=1123;e.afii10195=1139;e.afii10196=1141;e.afii10831=63175;e.afii10832=63176;e.afii10846=1241;e.afii299=8206;e.afii300=8207;e.afii301=8205;e.afii57381=1642;e.afii57388=1548;e.afii57392=1632;e.afii57393=1633;e.afii57394=1634;e.afii57395=1635;e.afii57396=1636;e.afii57397=1637;e.afii57398=1638;e.afii57399=1639;e.afii57400=1640;e.afii57401=1641;e.afii57403=1563;e.afii57407=1567;e.afii57409=1569;e.afii57410=1570;e.afii57411=1571;e.afii57412=1572;e.afii57413=1573;e.afii57414=1574;e.afii57415=1575;e.afii57416=1576;e.afii57417=1577;e.afii57418=1578;e.afii57419=1579;e.afii57420=1580;e.afii57421=1581;e.afii57422=1582;e.afii57423=1583;e.afii57424=1584;e.afii57425=1585;e.afii57426=1586;e.afii57427=1587;e.afii57428=1588;e.afii57429=1589;e.afii57430=1590;e.afii57431=1591;e.afii57432=1592;e.afii57433=1593;e.afii57434=1594;e.afii57440=1600;e.afii57441=1601;e.afii57442=1602;e.afii57443=1603;e.afii57444=1604;e.afii57445=1605;e.afii57446=1606;e.afii57448=1608;e.afii57449=1609;e.afii57450=1610;e.afii57451=1611;e.afii57452=1612;e.afii57453=1613;e.afii57454=1614;e.afii57455=1615;e.afii57456=1616;e.afii57457=1617;e.afii57458=1618;e.afii57470=1607;e.afii57505=1700;e.afii57506=1662;e.afii57507=1670;e.afii57508=1688;e.afii57509=1711;e.afii57511=1657;e.afii57512=1672;e.afii57513=1681;e.afii57514=1722;e.afii57519=1746;e.afii57534=1749;e.afii57636=8362;e.afii57645=1470;e.afii57658=1475;e.afii57664=1488;e.afii57665=1489;e.afii57666=1490;e.afii57667=1491;e.afii57668=1492;e.afii57669=1493;e.afii57670=1494;e.afii57671=1495;e.afii57672=1496;e.afii57673=1497;e.afii57674=1498;e.afii57675=1499;e.afii57676=1500;e.afii57677=1501;e.afii57678=1502;e.afii57679=1503;e.afii57680=1504;e.afii57681=1505;e.afii57682=1506;e.afii57683=1507;e.afii57684=1508;e.afii57685=1509;e.afii57686=1510;e.afii57687=1511;e.afii57688=1512;e.afii57689=1513;e.afii57690=1514;e.afii57694=64298;e.afii57695=64299;e.afii57700=64331;e.afii57705=64287;e.afii57716=1520;e.afii57717=1521;e.afii57718=1522;e.afii57723=64309;e.afii57793=1460;e.afii57794=1461;e.afii57795=1462;e.afii57796=1467;e.afii57797=1464;e.afii57798=1463;e.afii57799=1456;e.afii57800=1458;e.afii57801=1457;e.afii57802=1459;e.afii57803=1474;e.afii57804=1473;e.afii57806=1465;e.afii57807=1468;e.afii57839=1469;e.afii57841=1471;e.afii57842=1472;e.afii57929=700;e.afii61248=8453;e.afii61289=8467;e.afii61352=8470;e.afii61573=8236;e.afii61574=8237;e.afii61575=8238;e.afii61664=8204;e.afii63167=1645;e.afii64937=701;e.agrave=224;e.agujarati=2693;e.agurmukhi=2565;e.ahiragana=12354;e.ahookabove=7843;e.aibengali=2448;e.aibopomofo=12574;e.aideva=2320;e.aiecyrillic=1237;e.aigujarati=2704;e.aigurmukhi=2576;e.aimatragurmukhi=2632;e.ainarabic=1593;e.ainfinalarabic=65226;e.aininitialarabic=65227;e.ainmedialarabic=65228;e.ainvertedbreve=515;e.aivowelsignbengali=2504;e.aivowelsigndeva=2376;e.aivowelsigngujarati=2760;e.akatakana=12450;e.akatakanahalfwidth=65393;e.akorean=12623;e.alef=1488;e.alefarabic=1575;e.alefdageshhebrew=64304;e.aleffinalarabic=65166;e.alefhamzaabovearabic=1571;e.alefhamzaabovefinalarabic=65156;e.alefhamzabelowarabic=1573;e.alefhamzabelowfinalarabic=65160;e.alefhebrew=1488;e.aleflamedhebrew=64335;e.alefmaddaabovearabic=1570;e.alefmaddaabovefinalarabic=65154;e.alefmaksuraarabic=1609;e.alefmaksurafinalarabic=65264;e.alefmaksurainitialarabic=65267;e.alefmaksuramedialarabic=65268;e.alefpatahhebrew=64302;e.alefqamatshebrew=64303;e.aleph=8501;e.allequal=8780;e.alpha=945;e.alphatonos=940;e.amacron=257;e.amonospace=65345;e.ampersand=38;e.ampersandmonospace=65286;e.ampersandsmall=63270;e.amsquare=13250;e.anbopomofo=12578;e.angbopomofo=12580;e.angbracketleft=12296;e.angbracketright=12297;e.angkhankhuthai=3674;e.angle=8736;e.anglebracketleft=12296;e.anglebracketleftvertical=65087;e.anglebracketright=12297;e.anglebracketrightvertical=65088;e.angleleft=9001;e.angleright=9002;e.angstrom=8491;e.anoteleia=903;e.anudattadeva=2386;e.anusvarabengali=2434;e.anusvaradeva=2306;e.anusvaragujarati=2690;e.aogonek=261;e.apaatosquare=13056;e.aparen=9372;e.apostrophearmenian=1370;e.apostrophemod=700;e.apple=63743;e.approaches=8784;e.approxequal=8776;e.approxequalorimage=8786;e.approximatelyequal=8773;e.araeaekorean=12686;e.araeakorean=12685;e.arc=8978;e.arighthalfring=7834;e.aring=229;e.aringacute=507;e.aringbelow=7681;e.arrowboth=8596;e.arrowdashdown=8675;e.arrowdashleft=8672;e.arrowdashright=8674;e.arrowdashup=8673;e.arrowdblboth=8660;e.arrowdbldown=8659;e.arrowdblleft=8656;e.arrowdblright=8658;e.arrowdblup=8657;e.arrowdown=8595;e.arrowdownleft=8601;e.arrowdownright=8600;e.arrowdownwhite=8681;e.arrowheaddownmod=709;e.arrowheadleftmod=706;e.arrowheadrightmod=707;e.arrowheadupmod=708;e.arrowhorizex=63719;e.arrowleft=8592;e.arrowleftdbl=8656;e.arrowleftdblstroke=8653;e.arrowleftoverright=8646;e.arrowleftwhite=8678;e.arrowright=8594;e.arrowrightdblstroke=8655;e.arrowrightheavy=10142;e.arrowrightoverleft=8644;e.arrowrightwhite=8680;e.arrowtableft=8676;e.arrowtabright=8677;e.arrowup=8593;e.arrowupdn=8597;e.arrowupdnbse=8616;e.arrowupdownbase=8616;e.arrowupleft=8598;e.arrowupleftofdown=8645;e.arrowupright=8599;e.arrowupwhite=8679;e.arrowvertex=63718;e.asciicircum=94;e.asciicircummonospace=65342;e.asciitilde=126;e.asciitildemonospace=65374;e.ascript=593;e.ascriptturned=594;e.asmallhiragana=12353;e.asmallkatakana=12449;e.asmallkatakanahalfwidth=65383;e.asterisk=42;e.asteriskaltonearabic=1645;e.asteriskarabic=1645;e.asteriskmath=8727;e.asteriskmonospace=65290;e.asterisksmall=65121;e.asterism=8258;e.asuperior=63209;e.asymptoticallyequal=8771;e.at=64;e.atilde=227;e.atmonospace=65312;e.atsmall=65131;e.aturned=592;e.aubengali=2452;e.aubopomofo=12576;e.audeva=2324;e.augujarati=2708;e.augurmukhi=2580;e.aulengthmarkbengali=2519;e.aumatragurmukhi=2636;e.auvowelsignbengali=2508;e.auvowelsigndeva=2380;e.auvowelsigngujarati=2764;e.avagrahadeva=2365;e.aybarmenian=1377;e.ayin=1506;e.ayinaltonehebrew=64288;e.ayinhebrew=1506;e.b=98;e.babengali=2476;e.backslash=92;e.backslashmonospace=65340;e.badeva=2348;e.bagujarati=2732;e.bagurmukhi=2604;e.bahiragana=12400;e.bahtthai=3647;e.bakatakana=12496;e.bar=124;e.barmonospace=65372;e.bbopomofo=12549;e.bcircle=9425;e.bdotaccent=7683;e.bdotbelow=7685;e.beamedsixteenthnotes=9836;e.because=8757;e.becyrillic=1073;e.beharabic=1576;e.behfinalarabic=65168;e.behinitialarabic=65169;e.behiragana=12409;e.behmedialarabic=65170;e.behmeeminitialarabic=64671;e.behmeemisolatedarabic=64520;e.behnoonfinalarabic=64621;e.bekatakana=12505;e.benarmenian=1378;e.bet=1489;e.beta=946;e.betasymbolgreek=976;e.betdagesh=64305;e.betdageshhebrew=64305;e.bethebrew=1489;e.betrafehebrew=64332;e.bhabengali=2477;e.bhadeva=2349;e.bhagujarati=2733;e.bhagurmukhi=2605;e.bhook=595;e.bihiragana=12403;e.bikatakana=12499;e.bilabialclick=664;e.bindigurmukhi=2562;e.birusquare=13105;e.blackcircle=9679;e.blackdiamond=9670;e.blackdownpointingtriangle=9660;e.blackleftpointingpointer=9668;e.blackleftpointingtriangle=9664;e.blacklenticularbracketleft=12304;e.blacklenticularbracketleftvertical=65083;e.blacklenticularbracketright=12305;e.blacklenticularbracketrightvertical=65084;e.blacklowerlefttriangle=9699;e.blacklowerrighttriangle=9698;e.blackrectangle=9644;e.blackrightpointingpointer=9658;e.blackrightpointingtriangle=9654;e.blacksmallsquare=9642;e.blacksmilingface=9787;e.blacksquare=9632;e.blackstar=9733;e.blackupperlefttriangle=9700;e.blackupperrighttriangle=9701;e.blackuppointingsmalltriangle=9652;e.blackuppointingtriangle=9650;e.blank=9251;e.blinebelow=7687;e.block=9608;e.bmonospace=65346;e.bobaimaithai=3610;e.bohiragana=12412;e.bokatakana=12508;e.bparen=9373;e.bqsquare=13251;e.braceex=63732;e.braceleft=123;e.braceleftbt=63731;e.braceleftmid=63730;e.braceleftmonospace=65371;e.braceleftsmall=65115;e.bracelefttp=63729;e.braceleftvertical=65079;e.braceright=125;e.bracerightbt=63742;e.bracerightmid=63741;e.bracerightmonospace=65373;e.bracerightsmall=65116;e.bracerighttp=63740;e.bracerightvertical=65080;e.bracketleft=91;e.bracketleftbt=63728;e.bracketleftex=63727;e.bracketleftmonospace=65339;e.bracketlefttp=63726;e.bracketright=93;e.bracketrightbt=63739;e.bracketrightex=63738;e.bracketrightmonospace=65341;e.bracketrighttp=63737;e.breve=728;e.brevebelowcmb=814;e.brevecmb=774;e.breveinvertedbelowcmb=815;e.breveinvertedcmb=785;e.breveinverteddoublecmb=865;e.bridgebelowcmb=810;e.bridgeinvertedbelowcmb=826;e.brokenbar=166;e.bstroke=384;e.bsuperior=63210;e.btopbar=387;e.buhiragana=12406;e.bukatakana=12502;e.bullet=8226;e.bulletinverse=9688;e.bulletoperator=8729;e.bullseye=9678;e.c=99;e.caarmenian=1390;e.cabengali=2458;e.cacute=263;e.cadeva=2330;e.cagujarati=2714;e.cagurmukhi=2586;e.calsquare=13192;e.candrabindubengali=2433;e.candrabinducmb=784;e.candrabindudeva=2305;e.candrabindugujarati=2689;e.capslock=8682;e.careof=8453;e.caron=711;e.caronbelowcmb=812;e.caroncmb=780;e.carriagereturn=8629;e.cbopomofo=12568;e.ccaron=269;e.ccedilla=231;e.ccedillaacute=7689;e.ccircle=9426;e.ccircumflex=265;e.ccurl=597;e.cdot=267;e.cdotaccent=267;e.cdsquare=13253;e.cedilla=184;e.cedillacmb=807;e.cent=162;e.centigrade=8451;e.centinferior=63199;e.centmonospace=65504;e.centoldstyle=63394;e.centsuperior=63200;e.chaarmenian=1401;e.chabengali=2459;e.chadeva=2331;e.chagujarati=2715;e.chagurmukhi=2587;e.chbopomofo=12564;e.cheabkhasiancyrillic=1213;e.checkmark=10003;e.checyrillic=1095;e.chedescenderabkhasiancyrillic=1215;e.chedescendercyrillic=1207;e.chedieresiscyrillic=1269;e.cheharmenian=1395;e.chekhakassiancyrillic=1228;e.cheverticalstrokecyrillic=1209;e.chi=967;e.chieuchacirclekorean=12919;e.chieuchaparenkorean=12823;e.chieuchcirclekorean=12905;e.chieuchkorean=12618;e.chieuchparenkorean=12809;e.chochangthai=3594;e.chochanthai=3592;e.chochingthai=3593;e.chochoethai=3596;e.chook=392;e.cieucacirclekorean=12918;e.cieucaparenkorean=12822;e.cieuccirclekorean=12904;e.cieuckorean=12616;e.cieucparenkorean=12808;e.cieucuparenkorean=12828;e.circle=9675;e.circlecopyrt=169;e.circlemultiply=8855;e.circleot=8857;e.circleplus=8853;e.circlepostalmark=12342;e.circlewithlefthalfblack=9680;e.circlewithrighthalfblack=9681;e.circumflex=710;e.circumflexbelowcmb=813;e.circumflexcmb=770;e.clear=8999;e.clickalveolar=450;e.clickdental=448;e.clicklateral=449;e.clickretroflex=451;e.club=9827;e.clubsuitblack=9827;e.clubsuitwhite=9831;e.cmcubedsquare=13220;e.cmonospace=65347;e.cmsquaredsquare=13216;e.coarmenian=1409;e.colon=58;e.colonmonetary=8353;e.colonmonospace=65306;e.colonsign=8353;e.colonsmall=65109;e.colontriangularhalfmod=721;e.colontriangularmod=720;e.comma=44;e.commaabovecmb=787;e.commaaboverightcmb=789;e.commaaccent=63171;e.commaarabic=1548;e.commaarmenian=1373;e.commainferior=63201;e.commamonospace=65292;e.commareversedabovecmb=788;e.commareversedmod=701;e.commasmall=65104;e.commasuperior=63202;e.commaturnedabovecmb=786;e.commaturnedmod=699;e.compass=9788;e.congruent=8773;e.contourintegral=8750;e.control=8963;e.controlACK=6;e.controlBEL=7;e.controlBS=8;e.controlCAN=24;e.controlCR=13;e.controlDC1=17;e.controlDC2=18;e.controlDC3=19;e.controlDC4=20;e.controlDEL=127;e.controlDLE=16;e.controlEM=25;e.controlENQ=5;e.controlEOT=4;e.controlESC=27;e.controlETB=23;e.controlETX=3;e.controlFF=12;e.controlFS=28;e.controlGS=29;e.controlHT=9;e.controlLF=10;e.controlNAK=21;e.controlNULL=0;e.controlRS=30;e.controlSI=15;e.controlSO=14;e.controlSOT=2;e.controlSTX=1;e.controlSUB=26;e.controlSYN=22;e.controlUS=31;e.controlVT=11;e.copyright=169;e.copyrightsans=63721;e.copyrightserif=63193;e.cornerbracketleft=12300;e.cornerbracketlefthalfwidth=65378;e.cornerbracketleftvertical=65089;e.cornerbracketright=12301;e.cornerbracketrighthalfwidth=65379;e.cornerbracketrightvertical=65090;e.corporationsquare=13183;e.cosquare=13255;e.coverkgsquare=13254;e.cparen=9374;e.cruzeiro=8354;e.cstretched=663;e.curlyand=8911;e.curlyor=8910;e.currency=164;e.cyrBreve=63185;e.cyrFlex=63186;e.cyrbreve=63188;e.cyrflex=63189;e.d=100;e.daarmenian=1380;e.dabengali=2470;e.dadarabic=1590;e.dadeva=2342;e.dadfinalarabic=65214;e.dadinitialarabic=65215;e.dadmedialarabic=65216;e.dagesh=1468;e.dageshhebrew=1468;e.dagger=8224;e.daggerdbl=8225;e.dagujarati=2726;e.dagurmukhi=2598;e.dahiragana=12384;e.dakatakana=12480;e.dalarabic=1583;e.dalet=1491;e.daletdagesh=64307;e.daletdageshhebrew=64307;e.dalethebrew=1491;e.dalfinalarabic=65194;e.dammaarabic=1615;e.dammalowarabic=1615;e.dammatanaltonearabic=1612;e.dammatanarabic=1612;e.danda=2404;e.dargahebrew=1447;e.dargalefthebrew=1447;e.dasiapneumatacyrilliccmb=1157;e.dblGrave=63187;e.dblanglebracketleft=12298;e.dblanglebracketleftvertical=65085;e.dblanglebracketright=12299;e.dblanglebracketrightvertical=65086;e.dblarchinvertedbelowcmb=811;e.dblarrowleft=8660;e.dblarrowright=8658;e.dbldanda=2405;e.dblgrave=63190;e.dblgravecmb=783;e.dblintegral=8748;e.dbllowline=8215;e.dbllowlinecmb=819;e.dbloverlinecmb=831;e.dblprimemod=698;e.dblverticalbar=8214;e.dblverticallineabovecmb=782;e.dbopomofo=12553;e.dbsquare=13256;e.dcaron=271;e.dcedilla=7697;e.dcircle=9427;e.dcircumflexbelow=7699;e.dcroat=273;e.ddabengali=2465;e.ddadeva=2337;e.ddagujarati=2721;e.ddagurmukhi=2593;e.ddalarabic=1672;e.ddalfinalarabic=64393;e.dddhadeva=2396;e.ddhabengali=2466;e.ddhadeva=2338;e.ddhagujarati=2722;e.ddhagurmukhi=2594;e.ddotaccent=7691;e.ddotbelow=7693;e.decimalseparatorarabic=1643;e.decimalseparatorpersian=1643;e.decyrillic=1076;e.degree=176;e.dehihebrew=1453;e.dehiragana=12391;e.deicoptic=1007;e.dekatakana=12487;e.deleteleft=9003;e.deleteright=8998;e.delta=948;e.deltaturned=397;e.denominatorminusonenumeratorbengali=2552;e.dezh=676;e.dhabengali=2471;e.dhadeva=2343;e.dhagujarati=2727;e.dhagurmukhi=2599;e.dhook=599;e.dialytikatonos=901;e.dialytikatonoscmb=836;e.diamond=9830;e.diamondsuitwhite=9826;e.dieresis=168;e.dieresisacute=63191;e.dieresisbelowcmb=804;e.dieresiscmb=776;e.dieresisgrave=63192;e.dieresistonos=901;e.dihiragana=12386;e.dikatakana=12482;e.dittomark=12291;e.divide=247;e.divides=8739;e.divisionslash=8725;e.djecyrillic=1106;e.dkshade=9619;e.dlinebelow=7695;e.dlsquare=13207;e.dmacron=273;e.dmonospace=65348;e.dnblock=9604;e.dochadathai=3598;e.dodekthai=3604;e.dohiragana=12393;e.dokatakana=12489;e.dollar=36;e.dollarinferior=63203;e.dollarmonospace=65284;e.dollaroldstyle=63268;e.dollarsmall=65129;e.dollarsuperior=63204;e.dong=8363;e.dorusquare=13094;e.dotaccent=729;e.dotaccentcmb=775;e.dotbelowcmb=803;e.dotbelowcomb=803;e.dotkatakana=12539;e.dotlessi=305;e.dotlessj=63166;e.dotlessjstrokehook=644;e.dotmath=8901;e.dottedcircle=9676;e.doubleyodpatah=64287;e.doubleyodpatahhebrew=64287;e.downtackbelowcmb=798;e.downtackmod=725;e.dparen=9375;e.dsuperior=63211;e.dtail=598;e.dtopbar=396;e.duhiragana=12389;e.dukatakana=12485;e.dz=499;e.dzaltone=675;e.dzcaron=454;e.dzcurl=677;e.dzeabkhasiancyrillic=1249;e.dzecyrillic=1109;e.dzhecyrillic=1119;e.e=101;e.eacute=233;e.earth=9793;e.ebengali=2447;e.ebopomofo=12572;e.ebreve=277;e.ecandradeva=2317;e.ecandragujarati=2701;e.ecandravowelsigndeva=2373;e.ecandravowelsigngujarati=2757;e.ecaron=283;e.ecedillabreve=7709;e.echarmenian=1381;e.echyiwnarmenian=1415;e.ecircle=9428;e.ecircumflex=234;e.ecircumflexacute=7871;e.ecircumflexbelow=7705;e.ecircumflexdotbelow=7879;e.ecircumflexgrave=7873;e.ecircumflexhookabove=7875;e.ecircumflextilde=7877;e.ecyrillic=1108;e.edblgrave=517;e.edeva=2319;e.edieresis=235;e.edot=279;e.edotaccent=279;e.edotbelow=7865;e.eegurmukhi=2575;e.eematragurmukhi=2631;e.efcyrillic=1092;e.egrave=232;e.egujarati=2703;e.eharmenian=1383;e.ehbopomofo=12573;e.ehiragana=12360;e.ehookabove=7867;e.eibopomofo=12575;e.eight=56;e.eightarabic=1640;e.eightbengali=2542;e.eightcircle=9319;e.eightcircleinversesansserif=10129;e.eightdeva=2414;e.eighteencircle=9329;e.eighteenparen=9349;e.eighteenperiod=9369;e.eightgujarati=2798;e.eightgurmukhi=2670;e.eighthackarabic=1640;e.eighthangzhou=12328;e.eighthnotebeamed=9835;e.eightideographicparen=12839;e.eightinferior=8328;e.eightmonospace=65304;e.eightoldstyle=63288;e.eightparen=9339;e.eightperiod=9359;e.eightpersian=1784;e.eightroman=8567;e.eightsuperior=8312;e.eightthai=3672;e.einvertedbreve=519;e.eiotifiedcyrillic=1125;e.ekatakana=12456;e.ekatakanahalfwidth=65396;e.ekonkargurmukhi=2676;e.ekorean=12628;e.elcyrillic=1083;e.element=8712;e.elevencircle=9322;e.elevenparen=9342;e.elevenperiod=9362;e.elevenroman=8570;e.ellipsis=8230;e.ellipsisvertical=8942;e.emacron=275;e.emacronacute=7703;e.emacrongrave=7701;e.emcyrillic=1084;e.emdash=8212;e.emdashvertical=65073;e.emonospace=65349;e.emphasismarkarmenian=1371;e.emptyset=8709;e.enbopomofo=12579;e.encyrillic=1085;e.endash=8211;e.endashvertical=65074;e.endescendercyrillic=1187;e.eng=331;e.engbopomofo=12581;e.enghecyrillic=1189;e.enhookcyrillic=1224;e.enspace=8194;e.eogonek=281;e.eokorean=12627;e.eopen=603;e.eopenclosed=666;e.eopenreversed=604;e.eopenreversedclosed=606;e.eopenreversedhook=605;e.eparen=9376;e.epsilon=949;e.epsilontonos=941;e.equal=61;e.equalmonospace=65309;e.equalsmall=65126;e.equalsuperior=8316;e.equivalence=8801;e.erbopomofo=12582;e.ercyrillic=1088;e.ereversed=600;e.ereversedcyrillic=1101;e.escyrillic=1089;e.esdescendercyrillic=1195;e.esh=643;e.eshcurl=646;e.eshortdeva=2318;e.eshortvowelsigndeva=2374;e.eshreversedloop=426;e.eshsquatreversed=645;e.esmallhiragana=12359;e.esmallkatakana=12455;e.esmallkatakanahalfwidth=65386;e.estimated=8494;e.esuperior=63212;e.eta=951;e.etarmenian=1384;e.etatonos=942;e.eth=240;e.etilde=7869;e.etildebelow=7707;e.etnahtafoukhhebrew=1425;e.etnahtafoukhlefthebrew=1425;e.etnahtahebrew=1425;e.etnahtalefthebrew=1425;e.eturned=477;e.eukorean=12641;e.euro=8364;e.evowelsignbengali=2503;e.evowelsigndeva=2375;e.evowelsigngujarati=2759;e.exclam=33;e.exclamarmenian=1372;e.exclamdbl=8252;e.exclamdown=161;e.exclamdownsmall=63393;e.exclammonospace=65281;e.exclamsmall=63265;e.existential=8707;e.ezh=658;e.ezhcaron=495;e.ezhcurl=659;e.ezhreversed=441;e.ezhtail=442;e.f=102;e.fadeva=2398;e.fagurmukhi=2654;e.fahrenheit=8457;e.fathaarabic=1614;e.fathalowarabic=1614;e.fathatanarabic=1611;e.fbopomofo=12552;e.fcircle=9429;e.fdotaccent=7711;e.feharabic=1601;e.feharmenian=1414;e.fehfinalarabic=65234;e.fehinitialarabic=65235;e.fehmedialarabic=65236;e.feicoptic=997;e.female=9792;e.ff=64256;e.f_f=64256;e.ffi=64259;e.f_f_i=64259;e.ffl=64260;e.f_f_l=64260;e.fi=64257;e.f_i=64257;e.fifteencircle=9326;e.fifteenparen=9346;e.fifteenperiod=9366;e.figuredash=8210;e.filledbox=9632;e.filledrect=9644;e.finalkaf=1498;e.finalkafdagesh=64314;e.finalkafdageshhebrew=64314;e.finalkafhebrew=1498;e.finalmem=1501;e.finalmemhebrew=1501;e.finalnun=1503;e.finalnunhebrew=1503;e.finalpe=1507;e.finalpehebrew=1507;e.finaltsadi=1509;e.finaltsadihebrew=1509;e.firsttonechinese=713;e.fisheye=9673;e.fitacyrillic=1139;e.five=53;e.fivearabic=1637;e.fivebengali=2539;e.fivecircle=9316;e.fivecircleinversesansserif=10126;e.fivedeva=2411;e.fiveeighths=8541;e.fivegujarati=2795;e.fivegurmukhi=2667;e.fivehackarabic=1637;e.fivehangzhou=12325;e.fiveideographicparen=12836;e.fiveinferior=8325;e.fivemonospace=65301;e.fiveoldstyle=63285;e.fiveparen=9336;e.fiveperiod=9356;e.fivepersian=1781;e.fiveroman=8564;e.fivesuperior=8309;e.fivethai=3669;e.fl=64258;e.f_l=64258;e.florin=402;e.fmonospace=65350;e.fmsquare=13209;e.fofanthai=3615;e.fofathai=3613;e.fongmanthai=3663;e.forall=8704;e.four=52;e.fourarabic=1636;e.fourbengali=2538;e.fourcircle=9315;e.fourcircleinversesansserif=10125;e.fourdeva=2410;e.fourgujarati=2794;e.fourgurmukhi=2666;e.fourhackarabic=1636;e.fourhangzhou=12324;e.fourideographicparen=12835;e.fourinferior=8324;e.fourmonospace=65300;e.fournumeratorbengali=2551;e.fouroldstyle=63284;e.fourparen=9335;e.fourperiod=9355;e.fourpersian=1780;e.fourroman=8563;e.foursuperior=8308;e.fourteencircle=9325;e.fourteenparen=9345;e.fourteenperiod=9365;e.fourthai=3668;e.fourthtonechinese=715;e.fparen=9377;e.fraction=8260;e.franc=8355;e.g=103;e.gabengali=2455;e.gacute=501;e.gadeva=2327;e.gafarabic=1711;e.gaffinalarabic=64403;e.gafinitialarabic=64404;e.gafmedialarabic=64405;e.gagujarati=2711;e.gagurmukhi=2583;e.gahiragana=12364;e.gakatakana=12460;e.gamma=947;e.gammalatinsmall=611;e.gammasuperior=736;e.gangiacoptic=1003;e.gbopomofo=12557;e.gbreve=287;e.gcaron=487;e.gcedilla=291;e.gcircle=9430;e.gcircumflex=285;e.gcommaaccent=291;e.gdot=289;e.gdotaccent=289;e.gecyrillic=1075;e.gehiragana=12370;e.gekatakana=12466;e.geometricallyequal=8785;e.gereshaccenthebrew=1436;e.gereshhebrew=1523;e.gereshmuqdamhebrew=1437;e.germandbls=223;e.gershayimaccenthebrew=1438;e.gershayimhebrew=1524;e.getamark=12307;e.ghabengali=2456;e.ghadarmenian=1394;e.ghadeva=2328;e.ghagujarati=2712;e.ghagurmukhi=2584;e.ghainarabic=1594;e.ghainfinalarabic=65230;e.ghaininitialarabic=65231;e.ghainmedialarabic=65232;e.ghemiddlehookcyrillic=1173;e.ghestrokecyrillic=1171;e.gheupturncyrillic=1169;e.ghhadeva=2394;e.ghhagurmukhi=2650;e.ghook=608;e.ghzsquare=13203;e.gihiragana=12366;e.gikatakana=12462;e.gimarmenian=1379;e.gimel=1490;e.gimeldagesh=64306;e.gimeldageshhebrew=64306;e.gimelhebrew=1490;e.gjecyrillic=1107;e.glottalinvertedstroke=446;e.glottalstop=660;e.glottalstopinverted=662;e.glottalstopmod=704;e.glottalstopreversed=661;e.glottalstopreversedmod=705;e.glottalstopreversedsuperior=740;e.glottalstopstroke=673;e.glottalstopstrokereversed=674;e.gmacron=7713;e.gmonospace=65351;e.gohiragana=12372;e.gokatakana=12468;e.gparen=9378;e.gpasquare=13228;e.gradient=8711;e.grave=96;e.gravebelowcmb=790;e.gravecmb=768;e.gravecomb=768;e.gravedeva=2387;e.gravelowmod=718;e.gravemonospace=65344;e.gravetonecmb=832;e.greater=62;e.greaterequal=8805;e.greaterequalorless=8923;e.greatermonospace=65310;e.greaterorequivalent=8819;e.greaterorless=8823;e.greateroverequal=8807;e.greatersmall=65125;e.gscript=609;e.gstroke=485;e.guhiragana=12368;e.guillemotleft=171;e.guillemotright=187;e.guilsinglleft=8249;e.guilsinglright=8250;e.gukatakana=12464;e.guramusquare=13080;e.gysquare=13257;e.h=104;e.haabkhasiancyrillic=1193;e.haaltonearabic=1729;e.habengali=2489;e.hadescendercyrillic=1203;e.hadeva=2361;e.hagujarati=2745;e.hagurmukhi=2617;e.haharabic=1581;e.hahfinalarabic=65186;e.hahinitialarabic=65187;e.hahiragana=12399;e.hahmedialarabic=65188;e.haitusquare=13098;e.hakatakana=12495;e.hakatakanahalfwidth=65418;e.halantgurmukhi=2637;e.hamzaarabic=1569;e.hamzalowarabic=1569;e.hangulfiller=12644;e.hardsigncyrillic=1098;e.harpoonleftbarbup=8636;e.harpoonrightbarbup=8640;e.hasquare=13258;e.hatafpatah=1458;e.hatafpatah16=1458;e.hatafpatah23=1458;e.hatafpatah2f=1458;e.hatafpatahhebrew=1458;e.hatafpatahnarrowhebrew=1458;e.hatafpatahquarterhebrew=1458;e.hatafpatahwidehebrew=1458;e.hatafqamats=1459;e.hatafqamats1b=1459;e.hatafqamats28=1459;e.hatafqamats34=1459;e.hatafqamatshebrew=1459;e.hatafqamatsnarrowhebrew=1459;e.hatafqamatsquarterhebrew=1459;e.hatafqamatswidehebrew=1459;e.hatafsegol=1457;e.hatafsegol17=1457;e.hatafsegol24=1457;e.hatafsegol30=1457;e.hatafsegolhebrew=1457;e.hatafsegolnarrowhebrew=1457;e.hatafsegolquarterhebrew=1457;e.hatafsegolwidehebrew=1457;e.hbar=295;e.hbopomofo=12559;e.hbrevebelow=7723;e.hcedilla=7721;e.hcircle=9431;e.hcircumflex=293;e.hdieresis=7719;e.hdotaccent=7715;e.hdotbelow=7717;e.he=1492;e.heart=9829;e.heartsuitblack=9829;e.heartsuitwhite=9825;e.hedagesh=64308;e.hedageshhebrew=64308;e.hehaltonearabic=1729;e.heharabic=1607;e.hehebrew=1492;e.hehfinalaltonearabic=64423;e.hehfinalalttwoarabic=65258;e.hehfinalarabic=65258;e.hehhamzaabovefinalarabic=64421;e.hehhamzaaboveisolatedarabic=64420;e.hehinitialaltonearabic=64424;e.hehinitialarabic=65259;e.hehiragana=12408;e.hehmedialaltonearabic=64425;e.hehmedialarabic=65260;e.heiseierasquare=13179;e.hekatakana=12504;e.hekatakanahalfwidth=65421;e.hekutaarusquare=13110;e.henghook=615;e.herutusquare=13113;e.het=1495;e.hethebrew=1495;e.hhook=614;e.hhooksuperior=689;e.hieuhacirclekorean=12923;e.hieuhaparenkorean=12827;e.hieuhcirclekorean=12909;e.hieuhkorean=12622;e.hieuhparenkorean=12813;e.hihiragana=12402;e.hikatakana=12498;e.hikatakanahalfwidth=65419;e.hiriq=1460;e.hiriq14=1460;e.hiriq21=1460;e.hiriq2d=1460;e.hiriqhebrew=1460;e.hiriqnarrowhebrew=1460;e.hiriqquarterhebrew=1460;e.hiriqwidehebrew=1460;e.hlinebelow=7830;e.hmonospace=65352;e.hoarmenian=1392;e.hohipthai=3627;e.hohiragana=12411;e.hokatakana=12507;e.hokatakanahalfwidth=65422;e.holam=1465;e.holam19=1465;e.holam26=1465;e.holam32=1465;e.holamhebrew=1465;e.holamnarrowhebrew=1465;e.holamquarterhebrew=1465;e.holamwidehebrew=1465;e.honokhukthai=3630;e.hookabovecomb=777;e.hookcmb=777;e.hookpalatalizedbelowcmb=801;e.hookretroflexbelowcmb=802;e.hoonsquare=13122;e.horicoptic=1001;e.horizontalbar=8213;e.horncmb=795;e.hotsprings=9832;e.house=8962;e.hparen=9379;e.hsuperior=688;e.hturned=613;e.huhiragana=12405;e.huiitosquare=13107;e.hukatakana=12501;e.hukatakanahalfwidth=65420;e.hungarumlaut=733;e.hungarumlautcmb=779;e.hv=405;e.hyphen=45;e.hypheninferior=63205;e.hyphenmonospace=65293;e.hyphensmall=65123;e.hyphensuperior=63206;e.hyphentwo=8208;e.i=105;e.iacute=237;e.iacyrillic=1103;e.ibengali=2439;e.ibopomofo=12583;e.ibreve=301;e.icaron=464;e.icircle=9432;e.icircumflex=238;e.icyrillic=1110;e.idblgrave=521;e.ideographearthcircle=12943;e.ideographfirecircle=12939;e.ideographicallianceparen=12863;e.ideographiccallparen=12858;e.ideographiccentrecircle=12965;e.ideographicclose=12294;e.ideographiccomma=12289;e.ideographiccommaleft=65380;e.ideographiccongratulationparen=12855;e.ideographiccorrectcircle=12963;e.ideographicearthparen=12847;e.ideographicenterpriseparen=12861;e.ideographicexcellentcircle=12957;e.ideographicfestivalparen=12864;e.ideographicfinancialcircle=12950;e.ideographicfinancialparen=12854;e.ideographicfireparen=12843;e.ideographichaveparen=12850;e.ideographichighcircle=12964;e.ideographiciterationmark=12293;e.ideographiclaborcircle=12952;e.ideographiclaborparen=12856;e.ideographicleftcircle=12967;e.ideographiclowcircle=12966;e.ideographicmedicinecircle=12969;e.ideographicmetalparen=12846;e.ideographicmoonparen=12842;e.ideographicnameparen=12852;e.ideographicperiod=12290;e.ideographicprintcircle=12958;e.ideographicreachparen=12867;e.ideographicrepresentparen=12857;e.ideographicresourceparen=12862;e.ideographicrightcircle=12968;e.ideographicsecretcircle=12953;e.ideographicselfparen=12866;e.ideographicsocietyparen=12851;e.ideographicspace=12288;e.ideographicspecialparen=12853;e.ideographicstockparen=12849;e.ideographicstudyparen=12859;e.ideographicsunparen=12848;e.ideographicsuperviseparen=12860;e.ideographicwaterparen=12844;e.ideographicwoodparen=12845;e.ideographiczero=12295;e.ideographmetalcircle=12942;e.ideographmooncircle=12938;e.ideographnamecircle=12948;e.ideographsuncircle=12944;e.ideographwatercircle=12940;e.ideographwoodcircle=12941;e.ideva=2311;e.idieresis=239;e.idieresisacute=7727;e.idieresiscyrillic=1253;e.idotbelow=7883;e.iebrevecyrillic=1239;e.iecyrillic=1077;e.ieungacirclekorean=12917;e.ieungaparenkorean=12821;e.ieungcirclekorean=12903;e.ieungkorean=12615;e.ieungparenkorean=12807;e.igrave=236;e.igujarati=2695;e.igurmukhi=2567;e.ihiragana=12356;e.ihookabove=7881;e.iibengali=2440;e.iicyrillic=1080;e.iideva=2312;e.iigujarati=2696;e.iigurmukhi=2568;e.iimatragurmukhi=2624;e.iinvertedbreve=523;e.iishortcyrillic=1081;e.iivowelsignbengali=2496;e.iivowelsigndeva=2368;e.iivowelsigngujarati=2752;e.ij=307;e.ikatakana=12452;e.ikatakanahalfwidth=65394;e.ikorean=12643;e.ilde=732;e.iluyhebrew=1452;e.imacron=299;e.imacroncyrillic=1251;e.imageorapproximatelyequal=8787;e.imatragurmukhi=2623;e.imonospace=65353;e.increment=8710;e.infinity=8734;e.iniarmenian=1387;e.integral=8747;e.integralbottom=8993;e.integralbt=8993;e.integralex=63733;e.integraltop=8992;e.integraltp=8992;e.intersection=8745;e.intisquare=13061;e.invbullet=9688;e.invcircle=9689;e.invsmileface=9787;e.iocyrillic=1105;e.iogonek=303;e.iota=953;e.iotadieresis=970;e.iotadieresistonos=912;e.iotalatin=617;e.iotatonos=943;e.iparen=9380;e.irigurmukhi=2674;e.ismallhiragana=12355;e.ismallkatakana=12451;e.ismallkatakanahalfwidth=65384;e.issharbengali=2554;e.istroke=616;e.isuperior=63213;e.iterationhiragana=12445;e.iterationkatakana=12541;e.itilde=297;e.itildebelow=7725;e.iubopomofo=12585;e.iucyrillic=1102;e.ivowelsignbengali=2495;e.ivowelsigndeva=2367;e.ivowelsigngujarati=2751;e.izhitsacyrillic=1141;e.izhitsadblgravecyrillic=1143;e.j=106;e.jaarmenian=1393;e.jabengali=2460;e.jadeva=2332;e.jagujarati=2716;e.jagurmukhi=2588;e.jbopomofo=12560;e.jcaron=496;e.jcircle=9433;e.jcircumflex=309;e.jcrossedtail=669;e.jdotlessstroke=607;e.jecyrillic=1112;e.jeemarabic=1580;e.jeemfinalarabic=65182;e.jeeminitialarabic=65183;e.jeemmedialarabic=65184;e.jeharabic=1688;e.jehfinalarabic=64395;e.jhabengali=2461;e.jhadeva=2333;e.jhagujarati=2717;e.jhagurmukhi=2589;e.jheharmenian=1403;e.jis=12292;e.jmonospace=65354;e.jparen=9381;e.jsuperior=690;e.k=107;e.kabashkircyrillic=1185;e.kabengali=2453;e.kacute=7729;e.kacyrillic=1082;e.kadescendercyrillic=1179;e.kadeva=2325;e.kaf=1499;e.kafarabic=1603;e.kafdagesh=64315;e.kafdageshhebrew=64315;e.kaffinalarabic=65242;e.kafhebrew=1499;e.kafinitialarabic=65243;e.kafmedialarabic=65244;e.kafrafehebrew=64333;e.kagujarati=2709;e.kagurmukhi=2581;e.kahiragana=12363;e.kahookcyrillic=1220;e.kakatakana=12459;e.kakatakanahalfwidth=65398;e.kappa=954;e.kappasymbolgreek=1008;e.kapyeounmieumkorean=12657;e.kapyeounphieuphkorean=12676;e.kapyeounpieupkorean=12664;e.kapyeounssangpieupkorean=12665;e.karoriisquare=13069;e.kashidaautoarabic=1600;e.kashidaautonosidebearingarabic=1600;e.kasmallkatakana=12533;e.kasquare=13188;e.kasraarabic=1616;e.kasratanarabic=1613;e.kastrokecyrillic=1183;e.katahiraprolongmarkhalfwidth=65392;e.kaverticalstrokecyrillic=1181;e.kbopomofo=12558;e.kcalsquare=13193;e.kcaron=489;e.kcedilla=311;e.kcircle=9434;e.kcommaaccent=311;e.kdotbelow=7731;e.keharmenian=1412;e.kehiragana=12369;e.kekatakana=12465;e.kekatakanahalfwidth=65401;e.kenarmenian=1391;e.kesmallkatakana=12534;e.kgreenlandic=312;e.khabengali=2454;e.khacyrillic=1093;e.khadeva=2326;e.khagujarati=2710;e.khagurmukhi=2582;e.khaharabic=1582;e.khahfinalarabic=65190;e.khahinitialarabic=65191;e.khahmedialarabic=65192;e.kheicoptic=999;e.khhadeva=2393;e.khhagurmukhi=2649;e.khieukhacirclekorean=12920;e.khieukhaparenkorean=12824;e.khieukhcirclekorean=12906;e.khieukhkorean=12619;e.khieukhparenkorean=12810;e.khokhaithai=3586;e.khokhonthai=3589;e.khokhuatthai=3587;e.khokhwaithai=3588;e.khomutthai=3675;e.khook=409;e.khorakhangthai=3590;e.khzsquare=13201;e.kihiragana=12365;e.kikatakana=12461;e.kikatakanahalfwidth=65399;e.kiroguramusquare=13077;e.kiromeetorusquare=13078;e.kirosquare=13076;e.kiyeokacirclekorean=12910;e.kiyeokaparenkorean=12814;e.kiyeokcirclekorean=12896;e.kiyeokkorean=12593;e.kiyeokparenkorean=12800;e.kiyeoksioskorean=12595;e.kjecyrillic=1116;e.klinebelow=7733;e.klsquare=13208;e.kmcubedsquare=13222;e.kmonospace=65355;e.kmsquaredsquare=13218;e.kohiragana=12371;e.kohmsquare=13248;e.kokaithai=3585;e.kokatakana=12467;e.kokatakanahalfwidth=65402;e.kooposquare=13086;e.koppacyrillic=1153;e.koreanstandardsymbol=12927;e.koroniscmb=835;e.kparen=9382;e.kpasquare=13226;e.ksicyrillic=1135;e.ktsquare=13263;e.kturned=670;e.kuhiragana=12367;e.kukatakana=12463;e.kukatakanahalfwidth=65400;e.kvsquare=13240;e.kwsquare=13246;e.l=108;e.labengali=2482;e.lacute=314;e.ladeva=2354;e.lagujarati=2738;e.lagurmukhi=2610;e.lakkhangyaothai=3653;e.lamaleffinalarabic=65276;e.lamalefhamzaabovefinalarabic=65272;e.lamalefhamzaaboveisolatedarabic=65271;e.lamalefhamzabelowfinalarabic=65274;e.lamalefhamzabelowisolatedarabic=65273;e.lamalefisolatedarabic=65275;e.lamalefmaddaabovefinalarabic=65270;e.lamalefmaddaaboveisolatedarabic=65269;e.lamarabic=1604;e.lambda=955;e.lambdastroke=411;e.lamed=1500;e.lameddagesh=64316;e.lameddageshhebrew=64316;e.lamedhebrew=1500;e.lamfinalarabic=65246;e.lamhahinitialarabic=64714;e.laminitialarabic=65247;e.lamjeeminitialarabic=64713;e.lamkhahinitialarabic=64715;e.lamlamhehisolatedarabic=65010;e.lammedialarabic=65248;e.lammeemhahinitialarabic=64904;e.lammeeminitialarabic=64716;e.largecircle=9711;e.lbar=410;e.lbelt=620;e.lbopomofo=12556;e.lcaron=318;e.lcedilla=316;e.lcircle=9435;e.lcircumflexbelow=7741;e.lcommaaccent=316;e.ldot=320;e.ldotaccent=320;e.ldotbelow=7735;e.ldotbelowmacron=7737;e.leftangleabovecmb=794;e.lefttackbelowcmb=792;e.less=60;e.lessequal=8804;e.lessequalorgreater=8922;e.lessmonospace=65308;e.lessorequivalent=8818;e.lessorgreater=8822;e.lessoverequal=8806;e.lesssmall=65124;e.lezh=622;e.lfblock=9612;e.lhookretroflex=621;e.lira=8356;e.liwnarmenian=1388;e.lj=457;e.ljecyrillic=1113;e.ll=63168;e.lladeva=2355;e.llagujarati=2739;e.llinebelow=7739;e.llladeva=2356;e.llvocalicbengali=2529;e.llvocalicdeva=2401;e.llvocalicvowelsignbengali=2531;e.llvocalicvowelsigndeva=2403;e.lmiddletilde=619;e.lmonospace=65356;e.lmsquare=13264;e.lochulathai=3628;e.logicaland=8743;e.logicalnot=172;e.logicalnotreversed=8976;e.logicalor=8744;e.lolingthai=3621;e.longs=383;e.lowlinecenterline=65102;e.lowlinecmb=818;e.lowlinedashed=65101;e.lozenge=9674;e.lparen=9383;e.lslash=322;e.lsquare=8467;e.lsuperior=63214;e.ltshade=9617;e.luthai=3622;e.lvocalicbengali=2444;e.lvocalicdeva=2316;e.lvocalicvowelsignbengali=2530;e.lvocalicvowelsigndeva=2402;e.lxsquare=13267;e.m=109;e.mabengali=2478;e.macron=175;e.macronbelowcmb=817;e.macroncmb=772;e.macronlowmod=717;e.macronmonospace=65507;e.macute=7743;e.madeva=2350;e.magujarati=2734;e.magurmukhi=2606;e.mahapakhhebrew=1444;e.mahapakhlefthebrew=1444;e.mahiragana=12414;e.maichattawalowleftthai=63637;e.maichattawalowrightthai=63636;e.maichattawathai=3659;e.maichattawaupperleftthai=63635;e.maieklowleftthai=63628;e.maieklowrightthai=63627;e.maiekthai=3656;e.maiekupperleftthai=63626;e.maihanakatleftthai=63620;e.maihanakatthai=3633;e.maitaikhuleftthai=63625;e.maitaikhuthai=3655;e.maitholowleftthai=63631;e.maitholowrightthai=63630;e.maithothai=3657;e.maithoupperleftthai=63629;e.maitrilowleftthai=63634;e.maitrilowrightthai=63633;e.maitrithai=3658;e.maitriupperleftthai=63632;e.maiyamokthai=3654;e.makatakana=12510;e.makatakanahalfwidth=65423;e.male=9794;e.mansyonsquare=13127;e.maqafhebrew=1470;e.mars=9794;e.masoracirclehebrew=1455;e.masquare=13187;e.mbopomofo=12551;e.mbsquare=13268;e.mcircle=9436;e.mcubedsquare=13221;e.mdotaccent=7745;e.mdotbelow=7747;e.meemarabic=1605;e.meemfinalarabic=65250;e.meeminitialarabic=65251;e.meemmedialarabic=65252;e.meemmeeminitialarabic=64721;e.meemmeemisolatedarabic=64584;e.meetorusquare=13133;e.mehiragana=12417;e.meizierasquare=13182;e.mekatakana=12513;e.mekatakanahalfwidth=65426;e.mem=1502;e.memdagesh=64318;e.memdageshhebrew=64318;e.memhebrew=1502;e.menarmenian=1396;e.merkhahebrew=1445;e.merkhakefulahebrew=1446;e.merkhakefulalefthebrew=1446;e.merkhalefthebrew=1445;e.mhook=625;e.mhzsquare=13202;e.middledotkatakanahalfwidth=65381;e.middot=183;e.mieumacirclekorean=12914;e.mieumaparenkorean=12818;e.mieumcirclekorean=12900;e.mieumkorean=12609;e.mieumpansioskorean=12656;e.mieumparenkorean=12804;e.mieumpieupkorean=12654;e.mieumsioskorean=12655;e.mihiragana=12415;e.mikatakana=12511;e.mikatakanahalfwidth=65424;e.minus=8722;e.minusbelowcmb=800;e.minuscircle=8854;e.minusmod=727;e.minusplus=8723;e.minute=8242;e.miribaarusquare=13130;e.mirisquare=13129;e.mlonglegturned=624;e.mlsquare=13206;e.mmcubedsquare=13219;e.mmonospace=65357;e.mmsquaredsquare=13215;e.mohiragana=12418;e.mohmsquare=13249;e.mokatakana=12514;e.mokatakanahalfwidth=65427;e.molsquare=13270;e.momathai=3617;e.moverssquare=13223;e.moverssquaredsquare=13224;e.mparen=9384;e.mpasquare=13227;e.mssquare=13235;e.msuperior=63215;e.mturned=623;e.mu=181;e.mu1=181;e.muasquare=13186;e.muchgreater=8811;e.muchless=8810;e.mufsquare=13196;e.mugreek=956;e.mugsquare=13197;e.muhiragana=12416;e.mukatakana=12512;e.mukatakanahalfwidth=65425;e.mulsquare=13205;e.multiply=215;e.mumsquare=13211;e.munahhebrew=1443;e.munahlefthebrew=1443;e.musicalnote=9834;e.musicalnotedbl=9835;e.musicflatsign=9837;e.musicsharpsign=9839;e.mussquare=13234;e.muvsquare=13238;e.muwsquare=13244;e.mvmegasquare=13241;e.mvsquare=13239;e.mwmegasquare=13247;e.mwsquare=13245;e.n=110;e.nabengali=2472;e.nabla=8711;e.nacute=324;e.nadeva=2344;e.nagujarati=2728;e.nagurmukhi=2600;e.nahiragana=12394;e.nakatakana=12490;e.nakatakanahalfwidth=65413;e.napostrophe=329;e.nasquare=13185;e.nbopomofo=12555;e.nbspace=160;e.ncaron=328;e.ncedilla=326;e.ncircle=9437;e.ncircumflexbelow=7755;e.ncommaaccent=326;e.ndotaccent=7749;e.ndotbelow=7751;e.nehiragana=12397;e.nekatakana=12493;e.nekatakanahalfwidth=65416;e.newsheqelsign=8362;e.nfsquare=13195;e.ngabengali=2457;e.ngadeva=2329;e.ngagujarati=2713;e.ngagurmukhi=2585;e.ngonguthai=3591;e.nhiragana=12435;e.nhookleft=626;e.nhookretroflex=627;e.nieunacirclekorean=12911;e.nieunaparenkorean=12815;e.nieuncieuckorean=12597;e.nieuncirclekorean=12897;e.nieunhieuhkorean=12598;e.nieunkorean=12596;e.nieunpansioskorean=12648;e.nieunparenkorean=12801;e.nieunsioskorean=12647;e.nieuntikeutkorean=12646;e.nihiragana=12395;e.nikatakana=12491;e.nikatakanahalfwidth=65414;e.nikhahitleftthai=63641;e.nikhahitthai=3661;e.nine=57;e.ninearabic=1641;e.ninebengali=2543;e.ninecircle=9320;e.ninecircleinversesansserif=10130;e.ninedeva=2415;e.ninegujarati=2799;e.ninegurmukhi=2671;e.ninehackarabic=1641;e.ninehangzhou=12329;e.nineideographicparen=12840;e.nineinferior=8329;e.ninemonospace=65305;e.nineoldstyle=63289;e.nineparen=9340;e.nineperiod=9360;e.ninepersian=1785;e.nineroman=8568;e.ninesuperior=8313;e.nineteencircle=9330;e.nineteenparen=9350;e.nineteenperiod=9370;e.ninethai=3673;e.nj=460;e.njecyrillic=1114;e.nkatakana=12531;e.nkatakanahalfwidth=65437;e.nlegrightlong=414;e.nlinebelow=7753;e.nmonospace=65358;e.nmsquare=13210;e.nnabengali=2467;e.nnadeva=2339;e.nnagujarati=2723;e.nnagurmukhi=2595;e.nnnadeva=2345;e.nohiragana=12398;e.nokatakana=12494;e.nokatakanahalfwidth=65417;e.nonbreakingspace=160;e.nonenthai=3603;e.nonuthai=3609;e.noonarabic=1606;e.noonfinalarabic=65254;e.noonghunnaarabic=1722;e.noonghunnafinalarabic=64415;e.nooninitialarabic=65255;e.noonjeeminitialarabic=64722;e.noonjeemisolatedarabic=64587;e.noonmedialarabic=65256;e.noonmeeminitialarabic=64725;e.noonmeemisolatedarabic=64590;e.noonnoonfinalarabic=64653;e.notcontains=8716;e.notelement=8713;e.notelementof=8713;e.notequal=8800;e.notgreater=8815;e.notgreaternorequal=8817;e.notgreaternorless=8825;e.notidentical=8802;e.notless=8814;e.notlessnorequal=8816;e.notparallel=8742;e.notprecedes=8832;e.notsubset=8836;e.notsucceeds=8833;e.notsuperset=8837;e.nowarmenian=1398;e.nparen=9385;e.nssquare=13233;e.nsuperior=8319;e.ntilde=241;e.nu=957;e.nuhiragana=12396;e.nukatakana=12492;e.nukatakanahalfwidth=65415;e.nuktabengali=2492;e.nuktadeva=2364;e.nuktagujarati=2748;e.nuktagurmukhi=2620;e.numbersign=35;e.numbersignmonospace=65283;e.numbersignsmall=65119;e.numeralsigngreek=884;e.numeralsignlowergreek=885;e.numero=8470;e.nun=1504;e.nundagesh=64320;e.nundageshhebrew=64320;e.nunhebrew=1504;e.nvsquare=13237;e.nwsquare=13243;e.nyabengali=2462;e.nyadeva=2334;e.nyagujarati=2718;e.nyagurmukhi=2590;e.o=111;e.oacute=243;e.oangthai=3629;e.obarred=629;e.obarredcyrillic=1257;e.obarreddieresiscyrillic=1259;e.obengali=2451;e.obopomofo=12571;e.obreve=335;e.ocandradeva=2321;e.ocandragujarati=2705;e.ocandravowelsigndeva=2377;e.ocandravowelsigngujarati=2761;e.ocaron=466;e.ocircle=9438;e.ocircumflex=244;e.ocircumflexacute=7889;e.ocircumflexdotbelow=7897;e.ocircumflexgrave=7891;e.ocircumflexhookabove=7893;e.ocircumflextilde=7895;e.ocyrillic=1086;e.odblacute=337;e.odblgrave=525;e.odeva=2323;e.odieresis=246;e.odieresiscyrillic=1255;e.odotbelow=7885;e.oe=339;e.oekorean=12634;e.ogonek=731;e.ogonekcmb=808;e.ograve=242;e.ogujarati=2707;e.oharmenian=1413;e.ohiragana=12362;e.ohookabove=7887;e.ohorn=417;e.ohornacute=7899;e.ohorndotbelow=7907;e.ohorngrave=7901;e.ohornhookabove=7903;e.ohorntilde=7905;e.ohungarumlaut=337;e.oi=419;e.oinvertedbreve=527;e.okatakana=12458;e.okatakanahalfwidth=65397;e.okorean=12631;e.olehebrew=1451;e.omacron=333;e.omacronacute=7763;e.omacrongrave=7761;e.omdeva=2384;e.omega=969;e.omega1=982;e.omegacyrillic=1121;e.omegalatinclosed=631;e.omegaroundcyrillic=1147;e.omegatitlocyrillic=1149;e.omegatonos=974;e.omgujarati=2768;e.omicron=959;e.omicrontonos=972;e.omonospace=65359;e.one=49;e.onearabic=1633;e.onebengali=2535;e.onecircle=9312;e.onecircleinversesansserif=10122;e.onedeva=2407;e.onedotenleader=8228;e.oneeighth=8539;e.onefitted=63196;e.onegujarati=2791;e.onegurmukhi=2663;e.onehackarabic=1633;e.onehalf=189;e.onehangzhou=12321;e.oneideographicparen=12832;e.oneinferior=8321;e.onemonospace=65297;e.onenumeratorbengali=2548;e.oneoldstyle=63281;e.oneparen=9332;e.oneperiod=9352;e.onepersian=1777;e.onequarter=188;e.oneroman=8560;e.onesuperior=185;e.onethai=3665;e.onethird=8531;e.oogonek=491;e.oogonekmacron=493;e.oogurmukhi=2579;e.oomatragurmukhi=2635;e.oopen=596;e.oparen=9386;e.openbullet=9702;e.option=8997;e.ordfeminine=170;e.ordmasculine=186;e.orthogonal=8735;e.oshortdeva=2322;e.oshortvowelsigndeva=2378;e.oslash=248;e.oslashacute=511;e.osmallhiragana=12361;e.osmallkatakana=12457;e.osmallkatakanahalfwidth=65387;e.ostrokeacute=511;e.osuperior=63216;e.otcyrillic=1151;e.otilde=245;e.otildeacute=7757;e.otildedieresis=7759;e.oubopomofo=12577;e.overline=8254;e.overlinecenterline=65098;e.overlinecmb=773;e.overlinedashed=65097;e.overlinedblwavy=65100;e.overlinewavy=65099;e.overscore=175;e.ovowelsignbengali=2507;e.ovowelsigndeva=2379;e.ovowelsigngujarati=2763;e.p=112;e.paampssquare=13184;e.paasentosquare=13099;e.pabengali=2474;e.pacute=7765;e.padeva=2346;e.pagedown=8671;e.pageup=8670;e.pagujarati=2730;e.pagurmukhi=2602;e.pahiragana=12401;e.paiyannoithai=3631;e.pakatakana=12497;e.palatalizationcyrilliccmb=1156;e.palochkacyrillic=1216;e.pansioskorean=12671;e.paragraph=182;e.parallel=8741;e.parenleft=40;e.parenleftaltonearabic=64830;e.parenleftbt=63725;e.parenleftex=63724;e.parenleftinferior=8333;e.parenleftmonospace=65288;e.parenleftsmall=65113;e.parenleftsuperior=8317;e.parenlefttp=63723;e.parenleftvertical=65077;e.parenright=41;e.parenrightaltonearabic=64831;e.parenrightbt=63736;e.parenrightex=63735;e.parenrightinferior=8334;e.parenrightmonospace=65289;e.parenrightsmall=65114;e.parenrightsuperior=8318;e.parenrighttp=63734;e.parenrightvertical=65078;e.partialdiff=8706;e.paseqhebrew=1472;e.pashtahebrew=1433;e.pasquare=13225;e.patah=1463;e.patah11=1463;e.patah1d=1463;e.patah2a=1463;e.patahhebrew=1463;e.patahnarrowhebrew=1463;e.patahquarterhebrew=1463;e.patahwidehebrew=1463;e.pazerhebrew=1441;e.pbopomofo=12550;e.pcircle=9439;e.pdotaccent=7767;e.pe=1508;e.pecyrillic=1087;e.pedagesh=64324;e.pedageshhebrew=64324;e.peezisquare=13115;e.pefinaldageshhebrew=64323;e.peharabic=1662;e.peharmenian=1402;e.pehebrew=1508;e.pehfinalarabic=64343;e.pehinitialarabic=64344;e.pehiragana=12410;e.pehmedialarabic=64345;e.pekatakana=12506;e.pemiddlehookcyrillic=1191;e.perafehebrew=64334;e.percent=37;e.percentarabic=1642;e.percentmonospace=65285;e.percentsmall=65130;e.period=46;e.periodarmenian=1417;e.periodcentered=183;e.periodhalfwidth=65377;e.periodinferior=63207;e.periodmonospace=65294;e.periodsmall=65106;e.periodsuperior=63208;e.perispomenigreekcmb=834;e.perpendicular=8869;e.perthousand=8240;e.peseta=8359;e.pfsquare=13194;e.phabengali=2475;e.phadeva=2347;e.phagujarati=2731;e.phagurmukhi=2603;e.phi=966;e.phi1=981;e.phieuphacirclekorean=12922;e.phieuphaparenkorean=12826;e.phieuphcirclekorean=12908;e.phieuphkorean=12621;e.phieuphparenkorean=12812;e.philatin=632;e.phinthuthai=3642;e.phisymbolgreek=981;e.phook=421;e.phophanthai=3614;e.phophungthai=3612;e.phosamphaothai=3616;e.pi=960;e.pieupacirclekorean=12915;e.pieupaparenkorean=12819;e.pieupcieuckorean=12662;e.pieupcirclekorean=12901;e.pieupkiyeokkorean=12658;e.pieupkorean=12610;e.pieupparenkorean=12805;e.pieupsioskiyeokkorean=12660;e.pieupsioskorean=12612;e.pieupsiostikeutkorean=12661;e.pieupthieuthkorean=12663;e.pieuptikeutkorean=12659;e.pihiragana=12404;e.pikatakana=12500;e.pisymbolgreek=982;e.piwrarmenian=1411;e.planckover2pi=8463;e.planckover2pi1=8463;e.plus=43;e.plusbelowcmb=799;e.pluscircle=8853;e.plusminus=177;e.plusmod=726;e.plusmonospace=65291;e.plussmall=65122;e.plussuperior=8314;e.pmonospace=65360;e.pmsquare=13272;e.pohiragana=12413;e.pointingindexdownwhite=9759;e.pointingindexleftwhite=9756;e.pointingindexrightwhite=9758;e.pointingindexupwhite=9757;e.pokatakana=12509;e.poplathai=3611;e.postalmark=12306;e.postalmarkface=12320;e.pparen=9387;e.precedes=8826;e.prescription=8478;e.primemod=697;e.primereversed=8245;e.product=8719;e.projective=8965;e.prolongedkana=12540;e.propellor=8984;e.propersubset=8834;e.propersuperset=8835;e.proportion=8759;e.proportional=8733;e.psi=968;e.psicyrillic=1137;e.psilipneumatacyrilliccmb=1158;e.pssquare=13232;e.puhiragana=12407;e.pukatakana=12503;e.pvsquare=13236;e.pwsquare=13242;e.q=113;e.qadeva=2392;e.qadmahebrew=1448;e.qafarabic=1602;e.qaffinalarabic=65238;e.qafinitialarabic=65239;e.qafmedialarabic=65240;e.qamats=1464;e.qamats10=1464;e.qamats1a=1464;e.qamats1c=1464;e.qamats27=1464;e.qamats29=1464;e.qamats33=1464;e.qamatsde=1464;e.qamatshebrew=1464;e.qamatsnarrowhebrew=1464;e.qamatsqatanhebrew=1464;e.qamatsqatannarrowhebrew=1464;e.qamatsqatanquarterhebrew=1464;e.qamatsqatanwidehebrew=1464;e.qamatsquarterhebrew=1464;e.qamatswidehebrew=1464;e.qarneyparahebrew=1439;e.qbopomofo=12561;e.qcircle=9440;e.qhook=672;e.qmonospace=65361;e.qof=1511;e.qofdagesh=64327;e.qofdageshhebrew=64327;e.qofhebrew=1511;e.qparen=9388;e.quarternote=9833;e.qubuts=1467;e.qubuts18=1467;e.qubuts25=1467;e.qubuts31=1467;e.qubutshebrew=1467;e.qubutsnarrowhebrew=1467;e.qubutsquarterhebrew=1467;e.qubutswidehebrew=1467;e.question=63;e.questionarabic=1567;e.questionarmenian=1374;e.questiondown=191;e.questiondownsmall=63423;e.questiongreek=894;e.questionmonospace=65311;e.questionsmall=63295;e.quotedbl=34;e.quotedblbase=8222;e.quotedblleft=8220;e.quotedblmonospace=65282;e.quotedblprime=12318;e.quotedblprimereversed=12317;e.quotedblright=8221;e.quoteleft=8216;e.quoteleftreversed=8219;e.quotereversed=8219;e.quoteright=8217;e.quoterightn=329;e.quotesinglbase=8218;e.quotesingle=39;e.quotesinglemonospace=65287;e.r=114;e.raarmenian=1404;e.rabengali=2480;e.racute=341;e.radeva=2352;e.radical=8730;e.radicalex=63717;e.radoverssquare=13230;e.radoverssquaredsquare=13231;e.radsquare=13229;e.rafe=1471;e.rafehebrew=1471;e.ragujarati=2736;e.ragurmukhi=2608;e.rahiragana=12425;e.rakatakana=12521;e.rakatakanahalfwidth=65431;e.ralowerdiagonalbengali=2545;e.ramiddlediagonalbengali=2544;e.ramshorn=612;e.ratio=8758;e.rbopomofo=12566;e.rcaron=345;e.rcedilla=343;e.rcircle=9441;e.rcommaaccent=343;e.rdblgrave=529;e.rdotaccent=7769;e.rdotbelow=7771;e.rdotbelowmacron=7773;e.referencemark=8251;e.reflexsubset=8838;e.reflexsuperset=8839;e.registered=174;e.registersans=63720;e.registerserif=63194;e.reharabic=1585;e.reharmenian=1408;e.rehfinalarabic=65198;e.rehiragana=12428;e.rekatakana=12524;e.rekatakanahalfwidth=65434;e.resh=1512;e.reshdageshhebrew=64328;e.reshhebrew=1512;e.reversedtilde=8765;e.reviahebrew=1431;e.reviamugrashhebrew=1431;e.revlogicalnot=8976;e.rfishhook=638;e.rfishhookreversed=639;e.rhabengali=2525;e.rhadeva=2397;e.rho=961;e.rhook=637;e.rhookturned=635;e.rhookturnedsuperior=693;e.rhosymbolgreek=1009;e.rhotichookmod=734;e.rieulacirclekorean=12913;e.rieulaparenkorean=12817;e.rieulcirclekorean=12899;e.rieulhieuhkorean=12608;e.rieulkiyeokkorean=12602;e.rieulkiyeoksioskorean=12649;e.rieulkorean=12601;e.rieulmieumkorean=12603;e.rieulpansioskorean=12652;e.rieulparenkorean=12803;e.rieulphieuphkorean=12607;e.rieulpieupkorean=12604;e.rieulpieupsioskorean=12651;e.rieulsioskorean=12605;e.rieulthieuthkorean=12606;e.rieultikeutkorean=12650;e.rieulyeorinhieuhkorean=12653;e.rightangle=8735;e.righttackbelowcmb=793;e.righttriangle=8895;e.rihiragana=12426;e.rikatakana=12522;e.rikatakanahalfwidth=65432;e.ring=730;e.ringbelowcmb=805;e.ringcmb=778;e.ringhalfleft=703;e.ringhalfleftarmenian=1369;e.ringhalfleftbelowcmb=796;e.ringhalfleftcentered=723;e.ringhalfright=702;e.ringhalfrightbelowcmb=825;e.ringhalfrightcentered=722;e.rinvertedbreve=531;e.rittorusquare=13137;e.rlinebelow=7775;e.rlongleg=636;e.rlonglegturned=634;e.rmonospace=65362;e.rohiragana=12429;e.rokatakana=12525;e.rokatakanahalfwidth=65435;e.roruathai=3619;e.rparen=9389;e.rrabengali=2524;e.rradeva=2353;e.rragurmukhi=2652;e.rreharabic=1681;e.rrehfinalarabic=64397;e.rrvocalicbengali=2528;e.rrvocalicdeva=2400;e.rrvocalicgujarati=2784;e.rrvocalicvowelsignbengali=2500;e.rrvocalicvowelsigndeva=2372;e.rrvocalicvowelsigngujarati=2756;e.rsuperior=63217;e.rtblock=9616;e.rturned=633;e.rturnedsuperior=692;e.ruhiragana=12427;e.rukatakana=12523;e.rukatakanahalfwidth=65433;e.rupeemarkbengali=2546;e.rupeesignbengali=2547;e.rupiah=63197;e.ruthai=3620;e.rvocalicbengali=2443;e.rvocalicdeva=2315;e.rvocalicgujarati=2699;e.rvocalicvowelsignbengali=2499;e.rvocalicvowelsigndeva=2371;e.rvocalicvowelsigngujarati=2755;e.s=115;e.sabengali=2488;e.sacute=347;e.sacutedotaccent=7781;e.sadarabic=1589;e.sadeva=2360;e.sadfinalarabic=65210;e.sadinitialarabic=65211;e.sadmedialarabic=65212;e.sagujarati=2744;e.sagurmukhi=2616;e.sahiragana=12373;e.sakatakana=12469;e.sakatakanahalfwidth=65403;e.sallallahoualayhewasallamarabic=65018;e.samekh=1505;e.samekhdagesh=64321;e.samekhdageshhebrew=64321;e.samekhhebrew=1505;e.saraaathai=3634;e.saraaethai=3649;e.saraaimaimalaithai=3652;e.saraaimaimuanthai=3651;e.saraamthai=3635;e.saraathai=3632;e.saraethai=3648;e.saraiileftthai=63622;e.saraiithai=3637;e.saraileftthai=63621;e.saraithai=3636;e.saraothai=3650;e.saraueeleftthai=63624;e.saraueethai=3639;e.saraueleftthai=63623;e.sarauethai=3638;e.sarauthai=3640;e.sarauuthai=3641;e.sbopomofo=12569;e.scaron=353;e.scarondotaccent=7783;e.scedilla=351;e.schwa=601;e.schwacyrillic=1241;e.schwadieresiscyrillic=1243;e.schwahook=602;e.scircle=9442;e.scircumflex=349;e.scommaaccent=537;e.sdotaccent=7777;e.sdotbelow=7779;e.sdotbelowdotaccent=7785;e.seagullbelowcmb=828;e.second=8243;e.secondtonechinese=714;e.section=167;e.seenarabic=1587;e.seenfinalarabic=65202;e.seeninitialarabic=65203;e.seenmedialarabic=65204;e.segol=1462;e.segol13=1462;e.segol1f=1462;e.segol2c=1462;e.segolhebrew=1462;e.segolnarrowhebrew=1462;e.segolquarterhebrew=1462;e.segoltahebrew=1426;e.segolwidehebrew=1462;e.seharmenian=1405;e.sehiragana=12379;e.sekatakana=12475;e.sekatakanahalfwidth=65406;e.semicolon=59;e.semicolonarabic=1563;e.semicolonmonospace=65307;e.semicolonsmall=65108;e.semivoicedmarkkana=12444;e.semivoicedmarkkanahalfwidth=65439;e.sentisquare=13090;e.sentosquare=13091;e.seven=55;e.sevenarabic=1639;e.sevenbengali=2541;e.sevencircle=9318;e.sevencircleinversesansserif=10128;e.sevendeva=2413;e.seveneighths=8542;e.sevengujarati=2797;e.sevengurmukhi=2669;e.sevenhackarabic=1639;e.sevenhangzhou=12327;e.sevenideographicparen=12838;e.seveninferior=8327;e.sevenmonospace=65303;e.sevenoldstyle=63287;e.sevenparen=9338;e.sevenperiod=9358;e.sevenpersian=1783;e.sevenroman=8566;e.sevensuperior=8311;e.seventeencircle=9328;e.seventeenparen=9348;e.seventeenperiod=9368;e.seventhai=3671;e.sfthyphen=173;e.shaarmenian=1399;e.shabengali=2486;e.shacyrillic=1096;e.shaddaarabic=1617;e.shaddadammaarabic=64609;e.shaddadammatanarabic=64606;e.shaddafathaarabic=64608;e.shaddakasraarabic=64610;e.shaddakasratanarabic=64607;e.shade=9618;e.shadedark=9619;e.shadelight=9617;e.shademedium=9618;e.shadeva=2358;e.shagujarati=2742;e.shagurmukhi=2614;e.shalshelethebrew=1427;e.shbopomofo=12565;e.shchacyrillic=1097;e.sheenarabic=1588;e.sheenfinalarabic=65206;e.sheeninitialarabic=65207;e.sheenmedialarabic=65208;e.sheicoptic=995;e.sheqel=8362;e.sheqelhebrew=8362;e.sheva=1456;e.sheva115=1456;e.sheva15=1456;e.sheva22=1456;e.sheva2e=1456;e.shevahebrew=1456;e.shevanarrowhebrew=1456;e.shevaquarterhebrew=1456;e.shevawidehebrew=1456;e.shhacyrillic=1211;e.shimacoptic=1005;e.shin=1513;e.shindagesh=64329;e.shindageshhebrew=64329;e.shindageshshindot=64300;e.shindageshshindothebrew=64300;e.shindageshsindot=64301;e.shindageshsindothebrew=64301;e.shindothebrew=1473;e.shinhebrew=1513;e.shinshindot=64298;e.shinshindothebrew=64298;e.shinsindot=64299;e.shinsindothebrew=64299;e.shook=642;e.sigma=963;e.sigma1=962;e.sigmafinal=962;e.sigmalunatesymbolgreek=1010;e.sihiragana=12375;e.sikatakana=12471;e.sikatakanahalfwidth=65404;e.siluqhebrew=1469;e.siluqlefthebrew=1469;e.similar=8764;e.sindothebrew=1474;e.siosacirclekorean=12916;e.siosaparenkorean=12820;e.sioscieuckorean=12670;e.sioscirclekorean=12902;e.sioskiyeokkorean=12666;e.sioskorean=12613;e.siosnieunkorean=12667;e.siosparenkorean=12806;e.siospieupkorean=12669;e.siostikeutkorean=12668;e.six=54;e.sixarabic=1638;e.sixbengali=2540;e.sixcircle=9317;e.sixcircleinversesansserif=10127;e.sixdeva=2412;e.sixgujarati=2796;e.sixgurmukhi=2668;e.sixhackarabic=1638;e.sixhangzhou=12326;e.sixideographicparen=12837;e.sixinferior=8326;e.sixmonospace=65302;e.sixoldstyle=63286;e.sixparen=9337;e.sixperiod=9357;e.sixpersian=1782;e.sixroman=8565;e.sixsuperior=8310;e.sixteencircle=9327;e.sixteencurrencydenominatorbengali=2553;e.sixteenparen=9347;e.sixteenperiod=9367;e.sixthai=3670;e.slash=47;e.slashmonospace=65295;e.slong=383;e.slongdotaccent=7835;e.smileface=9786;e.smonospace=65363;e.sofpasuqhebrew=1475;e.softhyphen=173;e.softsigncyrillic=1100;e.sohiragana=12381;e.sokatakana=12477;e.sokatakanahalfwidth=65407;e.soliduslongoverlaycmb=824;e.solidusshortoverlaycmb=823;e.sorusithai=3625;e.sosalathai=3624;e.sosothai=3595;e.sosuathai=3626;e.space=32;e.spacehackarabic=32;e.spade=9824;e.spadesuitblack=9824;e.spadesuitwhite=9828;e.sparen=9390;e.squarebelowcmb=827;e.squarecc=13252;e.squarecm=13213;e.squarediagonalcrosshatchfill=9641;e.squarehorizontalfill=9636;e.squarekg=13199;e.squarekm=13214;e.squarekmcapital=13262;e.squareln=13265;e.squarelog=13266;e.squaremg=13198;e.squaremil=13269;e.squaremm=13212;e.squaremsquared=13217;e.squareorthogonalcrosshatchfill=9638;e.squareupperlefttolowerrightfill=9639;e.squareupperrighttolowerleftfill=9640;e.squareverticalfill=9637;e.squarewhitewithsmallblack=9635;e.srsquare=13275;e.ssabengali=2487;e.ssadeva=2359;e.ssagujarati=2743;e.ssangcieuckorean=12617;e.ssanghieuhkorean=12677;e.ssangieungkorean=12672;e.ssangkiyeokkorean=12594;e.ssangnieunkorean=12645;e.ssangpieupkorean=12611;e.ssangsioskorean=12614;e.ssangtikeutkorean=12600;e.ssuperior=63218;e.sterling=163;e.sterlingmonospace=65505;e.strokelongoverlaycmb=822;e.strokeshortoverlaycmb=821;e.subset=8834;e.subsetnotequal=8842;e.subsetorequal=8838;e.succeeds=8827;e.suchthat=8715;e.suhiragana=12377;e.sukatakana=12473;e.sukatakanahalfwidth=65405;e.sukunarabic=1618;e.summation=8721;e.sun=9788;e.superset=8835;e.supersetnotequal=8843;e.supersetorequal=8839;e.svsquare=13276;e.syouwaerasquare=13180;e.t=116;e.tabengali=2468;e.tackdown=8868;e.tackleft=8867;e.tadeva=2340;e.tagujarati=2724;e.tagurmukhi=2596;e.taharabic=1591;e.tahfinalarabic=65218;e.tahinitialarabic=65219;e.tahiragana=12383;e.tahmedialarabic=65220;e.taisyouerasquare=13181;e.takatakana=12479;e.takatakanahalfwidth=65408;e.tatweelarabic=1600;e.tau=964;e.tav=1514;e.tavdages=64330;e.tavdagesh=64330;e.tavdageshhebrew=64330;e.tavhebrew=1514;e.tbar=359;e.tbopomofo=12554;e.tcaron=357;e.tccurl=680;e.tcedilla=355;e.tcheharabic=1670;e.tchehfinalarabic=64379;e.tchehinitialarabic=64380;e.tchehmedialarabic=64381;e.tcircle=9443;e.tcircumflexbelow=7793;e.tcommaaccent=355;e.tdieresis=7831;e.tdotaccent=7787;e.tdotbelow=7789;e.tecyrillic=1090;e.tedescendercyrillic=1197;e.teharabic=1578;e.tehfinalarabic=65174;e.tehhahinitialarabic=64674;e.tehhahisolatedarabic=64524;e.tehinitialarabic=65175;e.tehiragana=12390;e.tehjeeminitialarabic=64673;e.tehjeemisolatedarabic=64523;e.tehmarbutaarabic=1577;e.tehmarbutafinalarabic=65172;e.tehmedialarabic=65176;e.tehmeeminitialarabic=64676;e.tehmeemisolatedarabic=64526;e.tehnoonfinalarabic=64627;e.tekatakana=12486;e.tekatakanahalfwidth=65411;e.telephone=8481;e.telephoneblack=9742;e.telishagedolahebrew=1440;e.telishaqetanahebrew=1449;e.tencircle=9321;e.tenideographicparen=12841;e.tenparen=9341;e.tenperiod=9361;e.tenroman=8569;e.tesh=679;e.tet=1496;e.tetdagesh=64312;e.tetdageshhebrew=64312;e.tethebrew=1496;e.tetsecyrillic=1205;e.tevirhebrew=1435;e.tevirlefthebrew=1435;e.thabengali=2469;e.thadeva=2341;e.thagujarati=2725;e.thagurmukhi=2597;e.thalarabic=1584;e.thalfinalarabic=65196;e.thanthakhatlowleftthai=63640;e.thanthakhatlowrightthai=63639;e.thanthakhatthai=3660;e.thanthakhatupperleftthai=63638;e.theharabic=1579;e.thehfinalarabic=65178;e.thehinitialarabic=65179;e.thehmedialarabic=65180;e.thereexists=8707;e.therefore=8756;e.theta=952;e.theta1=977;e.thetasymbolgreek=977;e.thieuthacirclekorean=12921;e.thieuthaparenkorean=12825;e.thieuthcirclekorean=12907;e.thieuthkorean=12620;e.thieuthparenkorean=12811;e.thirteencircle=9324;e.thirteenparen=9344;e.thirteenperiod=9364;e.thonangmonthothai=3601;e.thook=429;e.thophuthaothai=3602;e.thorn=254;e.thothahanthai=3607;e.thothanthai=3600;e.thothongthai=3608;e.thothungthai=3606;e.thousandcyrillic=1154;e.thousandsseparatorarabic=1644;e.thousandsseparatorpersian=1644;e.three=51;e.threearabic=1635;e.threebengali=2537;e.threecircle=9314;e.threecircleinversesansserif=10124;e.threedeva=2409;e.threeeighths=8540;e.threegujarati=2793;e.threegurmukhi=2665;e.threehackarabic=1635;e.threehangzhou=12323;e.threeideographicparen=12834;e.threeinferior=8323;e.threemonospace=65299;e.threenumeratorbengali=2550;e.threeoldstyle=63283;e.threeparen=9334;e.threeperiod=9354;e.threepersian=1779;e.threequarters=190;e.threequartersemdash=63198;e.threeroman=8562;e.threesuperior=179;e.threethai=3667;e.thzsquare=13204;e.tihiragana=12385;e.tikatakana=12481;e.tikatakanahalfwidth=65409;e.tikeutacirclekorean=12912;e.tikeutaparenkorean=12816;e.tikeutcirclekorean=12898;e.tikeutkorean=12599;e.tikeutparenkorean=12802;e.tilde=732;e.tildebelowcmb=816;e.tildecmb=771;e.tildecomb=771;e.tildedoublecmb=864;e.tildeoperator=8764;e.tildeoverlaycmb=820;e.tildeverticalcmb=830;e.timescircle=8855;e.tipehahebrew=1430;e.tipehalefthebrew=1430;e.tippigurmukhi=2672;e.titlocyrilliccmb=1155;e.tiwnarmenian=1407;e.tlinebelow=7791;e.tmonospace=65364;e.toarmenian=1385;e.tohiragana=12392;e.tokatakana=12488;e.tokatakanahalfwidth=65412;e.tonebarextrahighmod=741;e.tonebarextralowmod=745;e.tonebarhighmod=742;e.tonebarlowmod=744;e.tonebarmidmod=743;e.tonefive=445;e.tonesix=389;e.tonetwo=424;e.tonos=900;e.tonsquare=13095;e.topatakthai=3599;e.tortoiseshellbracketleft=12308;e.tortoiseshellbracketleftsmall=65117;e.tortoiseshellbracketleftvertical=65081;e.tortoiseshellbracketright=12309;e.tortoiseshellbracketrightsmall=65118;e.tortoiseshellbracketrightvertical=65082;e.totaothai=3605;e.tpalatalhook=427;e.tparen=9391;e.trademark=8482;e.trademarksans=63722;e.trademarkserif=63195;e.tretroflexhook=648;e.triagdn=9660;e.triaglf=9668;e.triagrt=9658;e.triagup=9650;e.ts=678;e.tsadi=1510;e.tsadidagesh=64326;e.tsadidageshhebrew=64326;e.tsadihebrew=1510;e.tsecyrillic=1094;e.tsere=1461;e.tsere12=1461;e.tsere1e=1461;e.tsere2b=1461;e.tserehebrew=1461;e.tserenarrowhebrew=1461;e.tserequarterhebrew=1461;e.tserewidehebrew=1461;e.tshecyrillic=1115;e.tsuperior=63219;e.ttabengali=2463;e.ttadeva=2335;e.ttagujarati=2719;e.ttagurmukhi=2591;e.tteharabic=1657;e.ttehfinalarabic=64359;e.ttehinitialarabic=64360;e.ttehmedialarabic=64361;e.tthabengali=2464;e.tthadeva=2336;e.tthagujarati=2720;e.tthagurmukhi=2592;e.tturned=647;e.tuhiragana=12388;e.tukatakana=12484;e.tukatakanahalfwidth=65410;e.tusmallhiragana=12387;e.tusmallkatakana=12483;e.tusmallkatakanahalfwidth=65391;e.twelvecircle=9323;e.twelveparen=9343;e.twelveperiod=9363;e.twelveroman=8571;e.twentycircle=9331;e.twentyhangzhou=21316;e.twentyparen=9351;e.twentyperiod=9371;e.two=50;e.twoarabic=1634;e.twobengali=2536;e.twocircle=9313;e.twocircleinversesansserif=10123;e.twodeva=2408;e.twodotenleader=8229;e.twodotleader=8229;e.twodotleadervertical=65072;e.twogujarati=2792;e.twogurmukhi=2664;e.twohackarabic=1634;e.twohangzhou=12322;e.twoideographicparen=12833;e.twoinferior=8322;e.twomonospace=65298;e.twonumeratorbengali=2549;e.twooldstyle=63282;e.twoparen=9333;e.twoperiod=9353;e.twopersian=1778;e.tworoman=8561;e.twostroke=443;e.twosuperior=178;e.twothai=3666;e.twothirds=8532;e.u=117;e.uacute=250;e.ubar=649;e.ubengali=2441;e.ubopomofo=12584;e.ubreve=365;e.ucaron=468;e.ucircle=9444;e.ucircumflex=251;e.ucircumflexbelow=7799;e.ucyrillic=1091;e.udattadeva=2385;e.udblacute=369;e.udblgrave=533;e.udeva=2313;e.udieresis=252;e.udieresisacute=472;e.udieresisbelow=7795;e.udieresiscaron=474;e.udieresiscyrillic=1265;e.udieresisgrave=476;e.udieresismacron=470;e.udotbelow=7909;e.ugrave=249;e.ugujarati=2697;e.ugurmukhi=2569;e.uhiragana=12358;e.uhookabove=7911;e.uhorn=432;e.uhornacute=7913;e.uhorndotbelow=7921;e.uhorngrave=7915;e.uhornhookabove=7917;e.uhorntilde=7919;e.uhungarumlaut=369;e.uhungarumlautcyrillic=1267;e.uinvertedbreve=535;e.ukatakana=12454;e.ukatakanahalfwidth=65395;e.ukcyrillic=1145;e.ukorean=12636;e.umacron=363;e.umacroncyrillic=1263;e.umacrondieresis=7803;e.umatragurmukhi=2625;e.umonospace=65365;e.underscore=95;e.underscoredbl=8215;e.underscoremonospace=65343;e.underscorevertical=65075;e.underscorewavy=65103;e.union=8746;e.universal=8704;e.uogonek=371;e.uparen=9392;e.upblock=9600;e.upperdothebrew=1476;e.upsilon=965;e.upsilondieresis=971;e.upsilondieresistonos=944;e.upsilonlatin=650;e.upsilontonos=973;e.uptackbelowcmb=797;e.uptackmod=724;e.uragurmukhi=2675;e.uring=367;e.ushortcyrillic=1118;e.usmallhiragana=12357;e.usmallkatakana=12453;e.usmallkatakanahalfwidth=65385;e.ustraightcyrillic=1199;e.ustraightstrokecyrillic=1201;e.utilde=361;e.utildeacute=7801;e.utildebelow=7797;e.uubengali=2442;e.uudeva=2314;e.uugujarati=2698;e.uugurmukhi=2570;e.uumatragurmukhi=2626;e.uuvowelsignbengali=2498;e.uuvowelsigndeva=2370;e.uuvowelsigngujarati=2754;e.uvowelsignbengali=2497;e.uvowelsigndeva=2369;e.uvowelsigngujarati=2753;e.v=118;e.vadeva=2357;e.vagujarati=2741;e.vagurmukhi=2613;e.vakatakana=12535;e.vav=1493;e.vavdagesh=64309;e.vavdagesh65=64309;e.vavdageshhebrew=64309;e.vavhebrew=1493;e.vavholam=64331;e.vavholamhebrew=64331;e.vavvavhebrew=1520;e.vavyodhebrew=1521;e.vcircle=9445;e.vdotbelow=7807;e.vecyrillic=1074;e.veharabic=1700;e.vehfinalarabic=64363;e.vehinitialarabic=64364;e.vehmedialarabic=64365;e.vekatakana=12537;e.venus=9792;e.verticalbar=124;e.verticallineabovecmb=781;e.verticallinebelowcmb=809;e.verticallinelowmod=716;e.verticallinemod=712;e.vewarmenian=1406;e.vhook=651;e.vikatakana=12536;e.viramabengali=2509;e.viramadeva=2381;e.viramagujarati=2765;e.visargabengali=2435;e.visargadeva=2307;e.visargagujarati=2691;e.vmonospace=65366;e.voarmenian=1400;e.voicediterationhiragana=12446;e.voicediterationkatakana=12542;e.voicedmarkkana=12443;e.voicedmarkkanahalfwidth=65438;e.vokatakana=12538;e.vparen=9393;e.vtilde=7805;e.vturned=652;e.vuhiragana=12436;e.vukatakana=12532;e.w=119;e.wacute=7811;e.waekorean=12633;e.wahiragana=12431;e.wakatakana=12527;e.wakatakanahalfwidth=65436;e.wakorean=12632;e.wasmallhiragana=12430;e.wasmallkatakana=12526;e.wattosquare=13143;e.wavedash=12316;e.wavyunderscorevertical=65076;e.wawarabic=1608;e.wawfinalarabic=65262;e.wawhamzaabovearabic=1572;e.wawhamzaabovefinalarabic=65158;e.wbsquare=13277;e.wcircle=9446;e.wcircumflex=373;e.wdieresis=7813;e.wdotaccent=7815;e.wdotbelow=7817;e.wehiragana=12433;e.weierstrass=8472;e.wekatakana=12529;e.wekorean=12638;e.weokorean=12637;e.wgrave=7809;e.whitebullet=9702;e.whitecircle=9675;e.whitecircleinverse=9689;e.whitecornerbracketleft=12302;e.whitecornerbracketleftvertical=65091;e.whitecornerbracketright=12303;e.whitecornerbracketrightvertical=65092;e.whitediamond=9671;e.whitediamondcontainingblacksmalldiamond=9672;e.whitedownpointingsmalltriangle=9663;e.whitedownpointingtriangle=9661;e.whiteleftpointingsmalltriangle=9667;e.whiteleftpointingtriangle=9665;e.whitelenticularbracketleft=12310;e.whitelenticularbracketright=12311;e.whiterightpointingsmalltriangle=9657;e.whiterightpointingtriangle=9655;e.whitesmallsquare=9643;e.whitesmilingface=9786;e.whitesquare=9633;e.whitestar=9734;e.whitetelephone=9743;e.whitetortoiseshellbracketleft=12312;e.whitetortoiseshellbracketright=12313;e.whiteuppointingsmalltriangle=9653;e.whiteuppointingtriangle=9651;e.wihiragana=12432;e.wikatakana=12528;e.wikorean=12639;e.wmonospace=65367;e.wohiragana=12434;e.wokatakana=12530;e.wokatakanahalfwidth=65382;e.won=8361;e.wonmonospace=65510;e.wowaenthai=3623;e.wparen=9394;e.wring=7832;e.wsuperior=695;e.wturned=653;e.wynn=447;e.x=120;e.xabovecmb=829;e.xbopomofo=12562;e.xcircle=9447;e.xdieresis=7821;e.xdotaccent=7819;e.xeharmenian=1389;e.xi=958;e.xmonospace=65368;e.xparen=9395;e.xsuperior=739;e.y=121;e.yaadosquare=13134;e.yabengali=2479;e.yacute=253;e.yadeva=2351;e.yaekorean=12626;e.yagujarati=2735;e.yagurmukhi=2607;e.yahiragana=12420;e.yakatakana=12516;e.yakatakanahalfwidth=65428;e.yakorean=12625;e.yamakkanthai=3662;e.yasmallhiragana=12419;e.yasmallkatakana=12515;e.yasmallkatakanahalfwidth=65388;e.yatcyrillic=1123;e.ycircle=9448;e.ycircumflex=375;e.ydieresis=255;e.ydotaccent=7823;e.ydotbelow=7925;e.yeharabic=1610;e.yehbarreearabic=1746;e.yehbarreefinalarabic=64431;e.yehfinalarabic=65266;e.yehhamzaabovearabic=1574;e.yehhamzaabovefinalarabic=65162;e.yehhamzaaboveinitialarabic=65163;e.yehhamzaabovemedialarabic=65164;e.yehinitialarabic=65267;e.yehmedialarabic=65268;e.yehmeeminitialarabic=64733;e.yehmeemisolatedarabic=64600;e.yehnoonfinalarabic=64660;e.yehthreedotsbelowarabic=1745;e.yekorean=12630;e.yen=165;e.yenmonospace=65509;e.yeokorean=12629;e.yeorinhieuhkorean=12678;e.yerahbenyomohebrew=1450;e.yerahbenyomolefthebrew=1450;e.yericyrillic=1099;e.yerudieresiscyrillic=1273;e.yesieungkorean=12673;e.yesieungpansioskorean=12675;e.yesieungsioskorean=12674;e.yetivhebrew=1434;e.ygrave=7923;e.yhook=436;e.yhookabove=7927;e.yiarmenian=1397;e.yicyrillic=1111;e.yikorean=12642;e.yinyang=9775;e.yiwnarmenian=1410;e.ymonospace=65369;e.yod=1497;e.yoddagesh=64313;e.yoddageshhebrew=64313;e.yodhebrew=1497;e.yodyodhebrew=1522;e.yodyodpatahhebrew=64287;e.yohiragana=12424;e.yoikorean=12681;e.yokatakana=12520;e.yokatakanahalfwidth=65430;e.yokorean=12635;e.yosmallhiragana=12423;e.yosmallkatakana=12519;e.yosmallkatakanahalfwidth=65390;e.yotgreek=1011;e.yoyaekorean=12680;e.yoyakorean=12679;e.yoyakthai=3618;e.yoyingthai=3597;e.yparen=9396;e.ypogegrammeni=890;e.ypogegrammenigreekcmb=837;e.yr=422;e.yring=7833;e.ysuperior=696;e.ytilde=7929;e.yturned=654;e.yuhiragana=12422;e.yuikorean=12684;e.yukatakana=12518;e.yukatakanahalfwidth=65429;e.yukorean=12640;e.yusbigcyrillic=1131;e.yusbigiotifiedcyrillic=1133;e.yuslittlecyrillic=1127;e.yuslittleiotifiedcyrillic=1129;e.yusmallhiragana=12421;e.yusmallkatakana=12517;e.yusmallkatakanahalfwidth=65389;e.yuyekorean=12683;e.yuyeokorean=12682;e.yyabengali=2527;e.yyadeva=2399;e.z=122;e.zaarmenian=1382;e.zacute=378;e.zadeva=2395;e.zagurmukhi=2651;e.zaharabic=1592;e.zahfinalarabic=65222;e.zahinitialarabic=65223;e.zahiragana=12374;e.zahmedialarabic=65224;e.zainarabic=1586;e.zainfinalarabic=65200;e.zakatakana=12470;e.zaqefgadolhebrew=1429;e.zaqefqatanhebrew=1428;e.zarqahebrew=1432;e.zayin=1494;e.zayindagesh=64310;e.zayindageshhebrew=64310;e.zayinhebrew=1494;e.zbopomofo=12567;e.zcaron=382;e.zcircle=9449;e.zcircumflex=7825;e.zcurl=657;e.zdot=380;e.zdotaccent=380;e.zdotbelow=7827;e.zecyrillic=1079;e.zedescendercyrillic=1177;e.zedieresiscyrillic=1247;e.zehiragana=12380;e.zekatakana=12476;e.zero=48;e.zeroarabic=1632;e.zerobengali=2534;e.zerodeva=2406;e.zerogujarati=2790;e.zerogurmukhi=2662;e.zerohackarabic=1632;e.zeroinferior=8320;e.zeromonospace=65296;e.zerooldstyle=63280;e.zeropersian=1776;e.zerosuperior=8304;e.zerothai=3664;e.zerowidthjoiner=65279;e.zerowidthnonjoiner=8204;e.zerowidthspace=8203;e.zeta=950;e.zhbopomofo=12563;e.zhearmenian=1386;e.zhebrevecyrillic=1218;e.zhecyrillic=1078;e.zhedescendercyrillic=1175;e.zhedieresiscyrillic=1245;e.zihiragana=12376;e.zikatakana=12472;e.zinorhebrew=1454;e.zlinebelow=7829;e.zmonospace=65370;e.zohiragana=12382;e.zokatakana=12478;e.zparen=9397;e.zretroflexhook=656;e.zstroke=438;e.zuhiragana=12378;e.zukatakana=12474;e[".notdef"]=0;e.angbracketleftbig=9001;e.angbracketleftBig=9001;e.angbracketleftbigg=9001;e.angbracketleftBigg=9001;e.angbracketrightBig=9002;e.angbracketrightbig=9002;e.angbracketrightBigg=9002;e.angbracketrightbigg=9002;e.arrowhookleft=8618;e.arrowhookright=8617;e.arrowlefttophalf=8636;e.arrowleftbothalf=8637;e.arrownortheast=8599;e.arrownorthwest=8598;e.arrowrighttophalf=8640;e.arrowrightbothalf=8641;e.arrowsoutheast=8600;e.arrowsouthwest=8601;e.backslashbig=8726;e.backslashBig=8726;e.backslashBigg=8726;e.backslashbigg=8726;e.bardbl=8214;e.bracehtipdownleft=65079;e.bracehtipdownright=65079;e.bracehtipupleft=65080;e.bracehtipupright=65080;e.braceleftBig=123;e.braceleftbig=123;e.braceleftbigg=123;e.braceleftBigg=123;e.bracerightBig=125;e.bracerightbig=125;e.bracerightbigg=125;e.bracerightBigg=125;e.bracketleftbig=91;e.bracketleftBig=91;e.bracketleftbigg=91;e.bracketleftBigg=91;e.bracketrightBig=93;e.bracketrightbig=93;e.bracketrightbigg=93;e.bracketrightBigg=93;e.ceilingleftbig=8968;e.ceilingleftBig=8968;e.ceilingleftBigg=8968;e.ceilingleftbigg=8968;e.ceilingrightbig=8969;e.ceilingrightBig=8969;e.ceilingrightbigg=8969;e.ceilingrightBigg=8969;e.circledotdisplay=8857;e.circledottext=8857;e.circlemultiplydisplay=8855;e.circlemultiplytext=8855;e.circleplusdisplay=8853;e.circleplustext=8853;e.contintegraldisplay=8750;e.contintegraltext=8750;e.coproductdisplay=8720;e.coproducttext=8720;e.floorleftBig=8970;e.floorleftbig=8970;e.floorleftbigg=8970;e.floorleftBigg=8970;e.floorrightbig=8971;e.floorrightBig=8971;e.floorrightBigg=8971;e.floorrightbigg=8971;e.hatwide=770;e.hatwider=770;e.hatwidest=770;e.intercal=7488;e.integraldisplay=8747;e.integraltext=8747;e.intersectiondisplay=8898;e.intersectiontext=8898;e.logicalanddisplay=8743;e.logicalandtext=8743;e.logicalordisplay=8744;e.logicalortext=8744;e.parenleftBig=40;e.parenleftbig=40;e.parenleftBigg=40;e.parenleftbigg=40;e.parenrightBig=41;e.parenrightbig=41;e.parenrightBigg=41;e.parenrightbigg=41;e.prime=8242;e.productdisplay=8719;e.producttext=8719;e.radicalbig=8730;e.radicalBig=8730;e.radicalBigg=8730;e.radicalbigg=8730;e.radicalbt=8730;e.radicaltp=8730;e.radicalvertex=8730;e.slashbig=47;e.slashBig=47;e.slashBigg=47;e.slashbigg=47;e.summationdisplay=8721;e.summationtext=8721;e.tildewide=732;e.tildewider=732;e.tildewidest=732;e.uniondisplay=8899;e.unionmultidisplay=8846;e.unionmultitext=8846;e.unionsqdisplay=8852;e.unionsqtext=8852;e.uniontext=8899;e.vextenddouble=8741;e.vextendsingle=8739})),Gi=getLookupTableFactory((function(e){e.space=32;e.a1=9985;e.a2=9986;e.a202=9987;e.a3=9988;e.a4=9742;e.a5=9990;e.a119=9991;e.a118=9992;e.a117=9993;e.a11=9755;e.a12=9758;e.a13=9996;e.a14=9997;e.a15=9998;e.a16=9999;e.a105=1e4;e.a17=10001;e.a18=10002;e.a19=10003;e.a20=10004;e.a21=10005;e.a22=10006;e.a23=10007;e.a24=10008;e.a25=10009;e.a26=10010;e.a27=10011;e.a28=10012;e.a6=10013;e.a7=10014;e.a8=10015;e.a9=10016;e.a10=10017;e.a29=10018;e.a30=10019;e.a31=10020;e.a32=10021;e.a33=10022;e.a34=10023;e.a35=9733;e.a36=10025;e.a37=10026;e.a38=10027;e.a39=10028;e.a40=10029;e.a41=10030;e.a42=10031;e.a43=10032;e.a44=10033;e.a45=10034;e.a46=10035;e.a47=10036;e.a48=10037;e.a49=10038;e.a50=10039;e.a51=10040;e.a52=10041;e.a53=10042;e.a54=10043;e.a55=10044;e.a56=10045;e.a57=10046;e.a58=10047;e.a59=10048;e.a60=10049;e.a61=10050;e.a62=10051;e.a63=10052;e.a64=10053;e.a65=10054;e.a66=10055;e.a67=10056;e.a68=10057;e.a69=10058;e.a70=10059;e.a71=9679;e.a72=10061;e.a73=9632;e.a74=10063;e.a203=10064;e.a75=10065;e.a204=10066;e.a76=9650;e.a77=9660;e.a78=9670;e.a79=10070;e.a81=9687;e.a82=10072;e.a83=10073;e.a84=10074;e.a97=10075;e.a98=10076;e.a99=10077;e.a100=10078;e.a101=10081;e.a102=10082;e.a103=10083;e.a104=10084;e.a106=10085;e.a107=10086;e.a108=10087;e.a112=9827;e.a111=9830;e.a110=9829;e.a109=9824;e.a120=9312;e.a121=9313;e.a122=9314;e.a123=9315;e.a124=9316;e.a125=9317;e.a126=9318;e.a127=9319;e.a128=9320;e.a129=9321;e.a130=10102;e.a131=10103;e.a132=10104;e.a133=10105;e.a134=10106;e.a135=10107;e.a136=10108;e.a137=10109;e.a138=10110;e.a139=10111;e.a140=10112;e.a141=10113;e.a142=10114;e.a143=10115;e.a144=10116;e.a145=10117;e.a146=10118;e.a147=10119;e.a148=10120;e.a149=10121;e.a150=10122;e.a151=10123;e.a152=10124;e.a153=10125;e.a154=10126;e.a155=10127;e.a156=10128;e.a157=10129;e.a158=10130;e.a159=10131;e.a160=10132;e.a161=8594;e.a163=8596;e.a164=8597;e.a196=10136;e.a165=10137;e.a192=10138;e.a166=10139;e.a167=10140;e.a168=10141;e.a169=10142;e.a170=10143;e.a171=10144;e.a172=10145;e.a173=10146;e.a162=10147;e.a174=10148;e.a175=10149;e.a176=10150;e.a177=10151;e.a178=10152;e.a179=10153;e.a193=10154;e.a180=10155;e.a199=10156;e.a181=10157;e.a200=10158;e.a182=10159;e.a201=10161;e.a183=10162;e.a184=10163;e.a197=10164;e.a185=10165;e.a194=10166;e.a198=10167;e.a186=10168;e.a195=10169;e.a187=10170;e.a188=10171;e.a189=10172;e.a190=10173;e.a191=10174;e.a89=10088;e.a90=10089;e.a93=10090;e.a94=10091;e.a91=10092;e.a92=10093;e.a205=10094;e.a85=10095;e.a206=10096;e.a86=10097;e.a87=10098;e.a88=10099;e.a95=10100;e.a96=10101;e[".notdef"]=0})),xi=getLookupTableFactory((function(e){e[63721]=169;e[63193]=169;e[63720]=174;e[63194]=174;e[63722]=8482;e[63195]=8482;e[63729]=9127;e[63730]=9128;e[63731]=9129;e[63740]=9131;e[63741]=9132;e[63742]=9133;e[63726]=9121;e[63727]=9122;e[63728]=9123;e[63737]=9124;e[63738]=9125;e[63739]=9126;e[63723]=9115;e[63724]=9116;e[63725]=9117;e[63734]=9118;e[63735]=9119;e[63736]=9120}));function getUnicodeForGlyph(e,t){let i=t[e];if(void 0!==i)return i;if(!e)return-1;if("u"===e[0]){const t=e.length;let a;if(7===t&&"n"===e[1]&&"i"===e[2])a=e.substring(3);else{if(!(t>=5&&t<=7))return-1;a=e.substring(1)}if(a===a.toUpperCase()){i=parseInt(a,16);if(i>=0)return i}}return-1}const Mi=[[0,127],[128,255],[256,383],[384,591],[592,687,7424,7551,7552,7615],[688,767,42752,42783],[768,879,7616,7679],[880,1023],[11392,11519],[1024,1279,1280,1327,11744,11775,42560,42655],[1328,1423],[1424,1535],[42240,42559],[1536,1791,1872,1919],[1984,2047],[2304,2431],[2432,2559],[2560,2687],[2688,2815],[2816,2943],[2944,3071],[3072,3199],[3200,3327],[3328,3455],[3584,3711],[3712,3839],[4256,4351,11520,11567],[6912,7039],[4352,4607],[7680,7935,11360,11391,42784,43007],[7936,8191],[8192,8303,11776,11903],[8304,8351],[8352,8399],[8400,8447],[8448,8527],[8528,8591],[8592,8703,10224,10239,10496,10623,11008,11263],[8704,8959,10752,11007,10176,10223,10624,10751],[8960,9215],[9216,9279],[9280,9311],[9312,9471],[9472,9599],[9600,9631],[9632,9727],[9728,9983],[9984,10175],[12288,12351],[12352,12447],[12448,12543,12784,12799],[12544,12591,12704,12735],[12592,12687],[43072,43135],[12800,13055],[13056,13311],[44032,55215],[55296,57343],[67840,67871],[19968,40959,11904,12031,12032,12255,12272,12287,13312,19903,131072,173791,12688,12703],[57344,63743],[12736,12783,63744,64255,194560,195103],[64256,64335],[64336,65023],[65056,65071],[65040,65055],[65104,65135],[65136,65279],[65280,65519],[65520,65535],[3840,4095],[1792,1871],[1920,1983],[3456,3583],[4096,4255],[4608,4991,4992,5023,11648,11743],[5024,5119],[5120,5759],[5760,5791],[5792,5887],[6016,6143],[6144,6319],[10240,10495],[40960,42127],[5888,5919,5920,5951,5952,5983,5984,6015],[66304,66351],[66352,66383],[66560,66639],[118784,119039,119040,119295,119296,119375],[119808,120831],[1044480,1048573],[65024,65039,917760,917999],[917504,917631],[6400,6479],[6480,6527],[6528,6623],[6656,6687],[11264,11359],[11568,11647],[19904,19967],[43008,43055],[65536,65663,65664,65791,65792,65855],[65856,65935],[66432,66463],[66464,66527],[66640,66687],[66688,66735],[67584,67647],[68096,68191],[119552,119647],[73728,74751,74752,74879],[119648,119679],[7040,7103],[7168,7247],[7248,7295],[43136,43231],[43264,43311],[43312,43359],[43520,43615],[65936,65999],[66e3,66047],[66208,66271,66176,66207,67872,67903],[127024,127135,126976,127023]];function getUnicodeRangeFor(e,t=-1){if(-1!==t){const i=Mi[t];for(let a=0,s=i.length;a<s;a+=2)if(e>=i[a]&&e<=i[a+1])return t}for(let t=0,i=Mi.length;t<i;t++){const i=Mi[t];for(let a=0,s=i.length;a<s;a+=2)if(e>=i[a]&&e<=i[a+1])return t}return-1}const Hi=new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$","u"),Ji=new Map;const Yi=!0,vi=1,Ki=2,Ti=4,qi=32,Oi=[".notdef",".null","nonmarkingreturn","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis","aacute","agrave","acircumflex","adieresis","atilde","aring","ccedilla","eacute","egrave","ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis","ntilde","oacute","ograve","ocircumflex","odieresis","otilde","uacute","ugrave","ucircumflex","udieresis","dagger","degree","cent","sterling","section","bullet","paragraph","germandbls","registered","copyright","trademark","acute","dieresis","notequal","AE","Oslash","infinity","plusminus","lessequal","greaterequal","yen","mu","partialdiff","summation","product","pi","integral","ordfeminine","ordmasculine","Omega","ae","oslash","questiondown","exclamdown","logicalnot","radical","florin","approxequal","Delta","guillemotleft","guillemotright","ellipsis","nonbreakingspace","Agrave","Atilde","Otilde","OE","oe","endash","emdash","quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge","ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright","fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase","perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple","Ograve","Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde","macron","breve","dotaccent","ring","cedilla","hungarumlaut","ogonek","caron","Lslash","lslash","Scaron","scaron","Zcaron","zcaron","brokenbar","Eth","eth","Yacute","yacute","Thorn","thorn","minus","multiply","onesuperior","twosuperior","threesuperior","onehalf","onequarter","threequarters","franc","Gbreve","gbreve","Idotaccent","Scedilla","scedilla","Cacute","cacute","Ccaron","ccaron","dcroat"];function recoverGlyphName(e,t){if(void 0!==t[e])return e;const i=getUnicodeForGlyph(e,t);if(-1!==i)for(const e in t)if(t[e]===i)return e;info("Unable to recover a standard glyph name for: "+e);return e}function type1FontGlyphMapping(e,t,i){const a=Object.create(null);let s,r,n;const g=!!(e.flags&Ti);if(e.isInternalFont){n=t;for(r=0;r<n.length;r++){s=i.indexOf(n[r]);a[r]=s>=0?s:0}}else if(e.baseEncodingName){n=getEncoding(e.baseEncodingName);for(r=0;r<n.length;r++){s=i.indexOf(n[r]);a[r]=s>=0?s:0}}else if(g)for(r in t)a[r]=t[r];else{n=fi;for(r=0;r<n.length;r++){s=i.indexOf(n[r]);a[r]=s>=0?s:0}}const o=e.differences;let c;if(o)for(r in o){const e=o[r];s=i.indexOf(e);if(-1===s){c||(c=Ni());const t=recoverGlyphName(e,c);t!==e&&(s=i.indexOf(t))}a[r]=s>=0?s:0}return a}function normalizeFontName(e){return e.replaceAll(/[,_]/g,"-").replaceAll(/\s/g,"")}const Pi=getLookupTableFactory((function(e){e["Times-Roman"]="Times-Roman";e.Helvetica="Helvetica";e.Courier="Courier";e.Symbol="Symbol";e["Times-Bold"]="Times-Bold";e["Helvetica-Bold"]="Helvetica-Bold";e["Courier-Bold"]="Courier-Bold";e.ZapfDingbats="ZapfDingbats";e["Times-Italic"]="Times-Italic";e["Helvetica-Oblique"]="Helvetica-Oblique";e["Courier-Oblique"]="Courier-Oblique";e["Times-BoldItalic"]="Times-BoldItalic";e["Helvetica-BoldOblique"]="Helvetica-BoldOblique";e["Courier-BoldOblique"]="Courier-BoldOblique";e.ArialNarrow="Helvetica";e["ArialNarrow-Bold"]="Helvetica-Bold";e["ArialNarrow-BoldItalic"]="Helvetica-BoldOblique";e["ArialNarrow-Italic"]="Helvetica-Oblique";e.ArialBlack="Helvetica";e["ArialBlack-Bold"]="Helvetica-Bold";e["ArialBlack-BoldItalic"]="Helvetica-BoldOblique";e["ArialBlack-Italic"]="Helvetica-Oblique";e["Arial-Black"]="Helvetica";e["Arial-Black-Bold"]="Helvetica-Bold";e["Arial-Black-BoldItalic"]="Helvetica-BoldOblique";e["Arial-Black-Italic"]="Helvetica-Oblique";e.Arial="Helvetica";e["Arial-Bold"]="Helvetica-Bold";e["Arial-BoldItalic"]="Helvetica-BoldOblique";e["Arial-Italic"]="Helvetica-Oblique";e.ArialMT="Helvetica";e["Arial-BoldItalicMT"]="Helvetica-BoldOblique";e["Arial-BoldMT"]="Helvetica-Bold";e["Arial-ItalicMT"]="Helvetica-Oblique";e["Arial-BoldItalicMT-BoldItalic"]="Helvetica-BoldOblique";e["Arial-BoldMT-Bold"]="Helvetica-Bold";e["Arial-ItalicMT-Italic"]="Helvetica-Oblique";e.ArialUnicodeMS="Helvetica";e["ArialUnicodeMS-Bold"]="Helvetica-Bold";e["ArialUnicodeMS-BoldItalic"]="Helvetica-BoldOblique";e["ArialUnicodeMS-Italic"]="Helvetica-Oblique";e["Courier-BoldItalic"]="Courier-BoldOblique";e["Courier-Italic"]="Courier-Oblique";e.CourierNew="Courier";e["CourierNew-Bold"]="Courier-Bold";e["CourierNew-BoldItalic"]="Courier-BoldOblique";e["CourierNew-Italic"]="Courier-Oblique";e["CourierNewPS-BoldItalicMT"]="Courier-BoldOblique";e["CourierNewPS-BoldMT"]="Courier-Bold";e["CourierNewPS-ItalicMT"]="Courier-Oblique";e.CourierNewPSMT="Courier";e["Helvetica-BoldItalic"]="Helvetica-BoldOblique";e["Helvetica-Italic"]="Helvetica-Oblique";e["Symbol-Bold"]="Symbol";e["Symbol-BoldItalic"]="Symbol";e["Symbol-Italic"]="Symbol";e.TimesNewRoman="Times-Roman";e["TimesNewRoman-Bold"]="Times-Bold";e["TimesNewRoman-BoldItalic"]="Times-BoldItalic";e["TimesNewRoman-Italic"]="Times-Italic";e.TimesNewRomanPS="Times-Roman";e["TimesNewRomanPS-Bold"]="Times-Bold";e["TimesNewRomanPS-BoldItalic"]="Times-BoldItalic";e["TimesNewRomanPS-BoldItalicMT"]="Times-BoldItalic";e["TimesNewRomanPS-BoldMT"]="Times-Bold";e["TimesNewRomanPS-Italic"]="Times-Italic";e["TimesNewRomanPS-ItalicMT"]="Times-Italic";e.TimesNewRomanPSMT="Times-Roman";e["TimesNewRomanPSMT-Bold"]="Times-Bold";e["TimesNewRomanPSMT-BoldItalic"]="Times-BoldItalic";e["TimesNewRomanPSMT-Italic"]="Times-Italic"})),Wi=getLookupTableFactory((function(e){e.Courier="FoxitFixed.pfb";e["Courier-Bold"]="FoxitFixedBold.pfb";e["Courier-BoldOblique"]="FoxitFixedBoldItalic.pfb";e["Courier-Oblique"]="FoxitFixedItalic.pfb";e.Helvetica="LiberationSans-Regular.ttf";e["Helvetica-Bold"]="LiberationSans-Bold.ttf";e["Helvetica-BoldOblique"]="LiberationSans-BoldItalic.ttf";e["Helvetica-Oblique"]="LiberationSans-Italic.ttf";e["Times-Roman"]="FoxitSerif.pfb";e["Times-Bold"]="FoxitSerifBold.pfb";e["Times-BoldItalic"]="FoxitSerifBoldItalic.pfb";e["Times-Italic"]="FoxitSerifItalic.pfb";e.Symbol="FoxitSymbol.pfb";e.ZapfDingbats="FoxitDingbats.pfb";e["LiberationSans-Regular"]="LiberationSans-Regular.ttf";e["LiberationSans-Bold"]="LiberationSans-Bold.ttf";e["LiberationSans-Italic"]="LiberationSans-Italic.ttf";e["LiberationSans-BoldItalic"]="LiberationSans-BoldItalic.ttf"})),ji=getLookupTableFactory((function(e){e.Calibri="Helvetica";e["Calibri-Bold"]="Helvetica-Bold";e["Calibri-BoldItalic"]="Helvetica-BoldOblique";e["Calibri-Italic"]="Helvetica-Oblique";e.CenturyGothic="Helvetica";e["CenturyGothic-Bold"]="Helvetica-Bold";e["CenturyGothic-BoldItalic"]="Helvetica-BoldOblique";e["CenturyGothic-Italic"]="Helvetica-Oblique";e.ComicSansMS="Comic Sans MS";e["ComicSansMS-Bold"]="Comic Sans MS-Bold";e["ComicSansMS-BoldItalic"]="Comic Sans MS-BoldItalic";e["ComicSansMS-Italic"]="Comic Sans MS-Italic";e.Impact="Helvetica";e["ItcSymbol-Bold"]="Helvetica-Bold";e["ItcSymbol-BoldItalic"]="Helvetica-BoldOblique";e["ItcSymbol-Book"]="Helvetica";e["ItcSymbol-BookItalic"]="Helvetica-Oblique";e["ItcSymbol-Medium"]="Helvetica";e["ItcSymbol-MediumItalic"]="Helvetica-Oblique";e.LucidaConsole="Courier";e["LucidaConsole-Bold"]="Courier-Bold";e["LucidaConsole-BoldItalic"]="Courier-BoldOblique";e["LucidaConsole-Italic"]="Courier-Oblique";e["LucidaSans-Demi"]="Helvetica-Bold";e["MS-Gothic"]="MS Gothic";e["MS-Gothic-Bold"]="MS Gothic-Bold";e["MS-Gothic-BoldItalic"]="MS Gothic-BoldItalic";e["MS-Gothic-Italic"]="MS Gothic-Italic";e["MS-Mincho"]="MS Mincho";e["MS-Mincho-Bold"]="MS Mincho-Bold";e["MS-Mincho-BoldItalic"]="MS Mincho-BoldItalic";e["MS-Mincho-Italic"]="MS Mincho-Italic";e["MS-PGothic"]="MS PGothic";e["MS-PGothic-Bold"]="MS PGothic-Bold";e["MS-PGothic-BoldItalic"]="MS PGothic-BoldItalic";e["MS-PGothic-Italic"]="MS PGothic-Italic";e["MS-PMincho"]="MS PMincho";e["MS-PMincho-Bold"]="MS PMincho-Bold";e["MS-PMincho-BoldItalic"]="MS PMincho-BoldItalic";e["MS-PMincho-Italic"]="MS PMincho-Italic";e.NuptialScript="Times-Italic";e.SegoeUISymbol="Helvetica"})),Xi=getLookupTableFactory((function(e){e["Adobe Jenson"]=!0;e["Adobe Text"]=!0;e.Albertus=!0;e.Aldus=!0;e.Alexandria=!0;e.Algerian=!0;e["American Typewriter"]=!0;e.Antiqua=!0;e.Apex=!0;e.Arno=!0;e.Aster=!0;e.Aurora=!0;e.Baskerville=!0;e.Bell=!0;e.Bembo=!0;e["Bembo Schoolbook"]=!0;e.Benguiat=!0;e["Berkeley Old Style"]=!0;e["Bernhard Modern"]=!0;e["Berthold City"]=!0;e.Bodoni=!0;e["Bauer Bodoni"]=!0;e["Book Antiqua"]=!0;e.Bookman=!0;e["Bordeaux Roman"]=!0;e["Californian FB"]=!0;e.Calisto=!0;e.Calvert=!0;e.Capitals=!0;e.Cambria=!0;e.Cartier=!0;e.Caslon=!0;e.Catull=!0;e.Centaur=!0;e["Century Old Style"]=!0;e["Century Schoolbook"]=!0;e.Chaparral=!0;e["Charis SIL"]=!0;e.Cheltenham=!0;e["Cholla Slab"]=!0;e.Clarendon=!0;e.Clearface=!0;e.Cochin=!0;e.Colonna=!0;e["Computer Modern"]=!0;e["Concrete Roman"]=!0;e.Constantia=!0;e["Cooper Black"]=!0;e.Corona=!0;e.Ecotype=!0;e.Egyptienne=!0;e.Elephant=!0;e.Excelsior=!0;e.Fairfield=!0;e["FF Scala"]=!0;e.Folkard=!0;e.Footlight=!0;e.FreeSerif=!0;e["Friz Quadrata"]=!0;e.Garamond=!0;e.Gentium=!0;e.Georgia=!0;e.Gloucester=!0;e["Goudy Old Style"]=!0;e["Goudy Schoolbook"]=!0;e["Goudy Pro Font"]=!0;e.Granjon=!0;e["Guardian Egyptian"]=!0;e.Heather=!0;e.Hercules=!0;e["High Tower Text"]=!0;e.Hiroshige=!0;e["Hoefler Text"]=!0;e["Humana Serif"]=!0;e.Imprint=!0;e["Ionic No. 5"]=!0;e.Janson=!0;e.Joanna=!0;e.Korinna=!0;e.Lexicon=!0;e.LiberationSerif=!0;e["Liberation Serif"]=!0;e["Linux Libertine"]=!0;e.Literaturnaya=!0;e.Lucida=!0;e["Lucida Bright"]=!0;e.Melior=!0;e.Memphis=!0;e.Miller=!0;e.Minion=!0;e.Modern=!0;e["Mona Lisa"]=!0;e["Mrs Eaves"]=!0;e["MS Serif"]=!0;e["Museo Slab"]=!0;e["New York"]=!0;e["Nimbus Roman"]=!0;e["NPS Rawlinson Roadway"]=!0;e.NuptialScript=!0;e.Palatino=!0;e.Perpetua=!0;e.Plantin=!0;e["Plantin Schoolbook"]=!0;e.Playbill=!0;e["Poor Richard"]=!0;e["Rawlinson Roadway"]=!0;e.Renault=!0;e.Requiem=!0;e.Rockwell=!0;e.Roman=!0;e["Rotis Serif"]=!0;e.Sabon=!0;e.Scala=!0;e.Seagull=!0;e.Sistina=!0;e.Souvenir=!0;e.STIX=!0;e["Stone Informal"]=!0;e["Stone Serif"]=!0;e.Sylfaen=!0;e.Times=!0;e.Trajan=!0;e["Trinit茅"]=!0;e["Trump Mediaeval"]=!0;e.Utopia=!0;e["Vale Type"]=!0;e["Bitstream Vera"]=!0;e["Vera Serif"]=!0;e.Versailles=!0;e.Wanted=!0;e.Weiss=!0;e["Wide Latin"]=!0;e.Windsor=!0;e.XITS=!0})),Zi=getLookupTableFactory((function(e){e.Dingbats=!0;e.Symbol=!0;e.ZapfDingbats=!0;e.Wingdings=!0;e["Wingdings-Bold"]=!0;e["Wingdings-Regular"]=!0})),Vi=getLookupTableFactory((function(e){e[2]=10;e[3]=32;e[4]=33;e[5]=34;e[6]=35;e[7]=36;e[8]=37;e[9]=38;e[10]=39;e[11]=40;e[12]=41;e[13]=42;e[14]=43;e[15]=44;e[16]=45;e[17]=46;e[18]=47;e[19]=48;e[20]=49;e[21]=50;e[22]=51;e[23]=52;e[24]=53;e[25]=54;e[26]=55;e[27]=56;e[28]=57;e[29]=58;e[30]=894;e[31]=60;e[32]=61;e[33]=62;e[34]=63;e[35]=64;e[36]=65;e[37]=66;e[38]=67;e[39]=68;e[40]=69;e[41]=70;e[42]=71;e[43]=72;e[44]=73;e[45]=74;e[46]=75;e[47]=76;e[48]=77;e[49]=78;e[50]=79;e[51]=80;e[52]=81;e[53]=82;e[54]=83;e[55]=84;e[56]=85;e[57]=86;e[58]=87;e[59]=88;e[60]=89;e[61]=90;e[62]=91;e[63]=92;e[64]=93;e[65]=94;e[66]=95;e[67]=96;e[68]=97;e[69]=98;e[70]=99;e[71]=100;e[72]=101;e[73]=102;e[74]=103;e[75]=104;e[76]=105;e[77]=106;e[78]=107;e[79]=108;e[80]=109;e[81]=110;e[82]=111;e[83]=112;e[84]=113;e[85]=114;e[86]=115;e[87]=116;e[88]=117;e[89]=118;e[90]=119;e[91]=120;e[92]=121;e[93]=122;e[94]=123;e[95]=124;e[96]=125;e[97]=126;e[98]=196;e[99]=197;e[100]=199;e[101]=201;e[102]=209;e[103]=214;e[104]=220;e[105]=225;e[106]=224;e[107]=226;e[108]=228;e[109]=227;e[110]=229;e[111]=231;e[112]=233;e[113]=232;e[114]=234;e[115]=235;e[116]=237;e[117]=236;e[118]=238;e[119]=239;e[120]=241;e[121]=243;e[122]=242;e[123]=244;e[124]=246;e[125]=245;e[126]=250;e[127]=249;e[128]=251;e[129]=252;e[130]=8224;e[131]=176;e[132]=162;e[133]=163;e[134]=167;e[135]=8226;e[136]=182;e[137]=223;e[138]=174;e[139]=169;e[140]=8482;e[141]=180;e[142]=168;e[143]=8800;e[144]=198;e[145]=216;e[146]=8734;e[147]=177;e[148]=8804;e[149]=8805;e[150]=165;e[151]=181;e[152]=8706;e[153]=8721;e[154]=8719;e[156]=8747;e[157]=170;e[158]=186;e[159]=8486;e[160]=230;e[161]=248;e[162]=191;e[163]=161;e[164]=172;e[165]=8730;e[166]=402;e[167]=8776;e[168]=8710;e[169]=171;e[170]=187;e[171]=8230;e[179]=8220;e[180]=8221;e[181]=8216;e[182]=8217;e[200]=193;e[203]=205;e[207]=211;e[210]=218;e[223]=711;e[224]=321;e[225]=322;e[226]=352;e[227]=353;e[228]=381;e[229]=382;e[233]=221;e[234]=253;e[252]=263;e[253]=268;e[254]=269;e[258]=258;e[260]=260;e[261]=261;e[265]=280;e[266]=281;e[267]=282;e[268]=283;e[269]=313;e[275]=323;e[276]=324;e[278]=328;e[283]=344;e[284]=345;e[285]=346;e[286]=347;e[292]=367;e[295]=377;e[296]=378;e[298]=380;e[305]=963;e[306]=964;e[307]=966;e[308]=8215;e[309]=8252;e[310]=8319;e[311]=8359;e[312]=8592;e[313]=8593;e[337]=9552;e[493]=1039;e[494]=1040;e[672]=1488;e[673]=1489;e[674]=1490;e[675]=1491;e[676]=1492;e[677]=1493;e[678]=1494;e[679]=1495;e[680]=1496;e[681]=1497;e[682]=1498;e[683]=1499;e[684]=1500;e[685]=1501;e[686]=1502;e[687]=1503;e[688]=1504;e[689]=1505;e[690]=1506;e[691]=1507;e[692]=1508;e[693]=1509;e[694]=1510;e[695]=1511;e[696]=1512;e[697]=1513;e[698]=1514;e[705]=1524;e[706]=8362;e[710]=64288;e[711]=64298;e[759]=1617;e[761]=1776;e[763]=1778;e[775]=1652;e[777]=1764;e[778]=1780;e[779]=1781;e[780]=1782;e[782]=771;e[783]=64726;e[786]=8363;e[788]=8532;e[790]=768;e[791]=769;e[792]=768;e[795]=803;e[797]=64336;e[798]=64337;e[799]=64342;e[800]=64343;e[801]=64344;e[802]=64345;e[803]=64362;e[804]=64363;e[805]=64364;e[2424]=7821;e[2425]=7822;e[2426]=7823;e[2427]=7824;e[2428]=7825;e[2429]=7826;e[2430]=7827;e[2433]=7682;e[2678]=8045;e[2679]=8046;e[2830]=1552;e[2838]=686;e[2840]=751;e[2842]=753;e[2843]=754;e[2844]=755;e[2846]=757;e[2856]=767;e[2857]=848;e[2858]=849;e[2862]=853;e[2863]=854;e[2864]=855;e[2865]=861;e[2866]=862;e[2906]=7460;e[2908]=7462;e[2909]=7463;e[2910]=7464;e[2912]=7466;e[2913]=7467;e[2914]=7468;e[2916]=7470;e[2917]=7471;e[2918]=7472;e[2920]=7474;e[2921]=7475;e[2922]=7476;e[2924]=7478;e[2925]=7479;e[2926]=7480;e[2928]=7482;e[2929]=7483;e[2930]=7484;e[2932]=7486;e[2933]=7487;e[2934]=7488;e[2936]=7490;e[2937]=7491;e[2938]=7492;e[2940]=7494;e[2941]=7495;e[2942]=7496;e[2944]=7498;e[2946]=7500;e[2948]=7502;e[2950]=7504;e[2951]=7505;e[2952]=7506;e[2954]=7508;e[2955]=7509;e[2956]=7510;e[2958]=7512;e[2959]=7513;e[2960]=7514;e[2962]=7516;e[2963]=7517;e[2964]=7518;e[2966]=7520;e[2967]=7521;e[2968]=7522;e[2970]=7524;e[2971]=7525;e[2972]=7526;e[2974]=7528;e[2975]=7529;e[2976]=7530;e[2978]=1537;e[2979]=1538;e[2980]=1539;e[2982]=1549;e[2983]=1551;e[2984]=1552;e[2986]=1554;e[2987]=1555;e[2988]=1556;e[2990]=1623;e[2991]=1624;e[2995]=1775;e[2999]=1791;e[3002]=64290;e[3003]=64291;e[3004]=64292;e[3006]=64294;e[3007]=64295;e[3008]=64296;e[3011]=1900;e[3014]=8223;e[3015]=8244;e[3017]=7532;e[3018]=7533;e[3019]=7534;e[3075]=7590;e[3076]=7591;e[3079]=7594;e[3080]=7595;e[3083]=7598;e[3084]=7599;e[3087]=7602;e[3088]=7603;e[3091]=7606;e[3092]=7607;e[3095]=7610;e[3096]=7611;e[3099]=7614;e[3100]=7615;e[3103]=7618;e[3104]=7619;e[3107]=8337;e[3108]=8338;e[3116]=1884;e[3119]=1885;e[3120]=1885;e[3123]=1886;e[3124]=1886;e[3127]=1887;e[3128]=1887;e[3131]=1888;e[3132]=1888;e[3135]=1889;e[3136]=1889;e[3139]=1890;e[3140]=1890;e[3143]=1891;e[3144]=1891;e[3147]=1892;e[3148]=1892;e[3153]=580;e[3154]=581;e[3157]=584;e[3158]=585;e[3161]=588;e[3162]=589;e[3165]=891;e[3166]=892;e[3169]=1274;e[3170]=1275;e[3173]=1278;e[3174]=1279;e[3181]=7622;e[3182]=7623;e[3282]=11799;e[3316]=578;e[3379]=42785;e[3393]=1159;e[3416]=8377})),zi=getLookupTableFactory((function(e){e[227]=322;e[264]=261;e[291]=346})),_i=getLookupTableFactory((function(e){e[1]=32;e[4]=65;e[5]=192;e[6]=193;e[9]=196;e[17]=66;e[18]=67;e[21]=268;e[24]=68;e[28]=69;e[29]=200;e[30]=201;e[32]=282;e[38]=70;e[39]=71;e[44]=72;e[47]=73;e[48]=204;e[49]=205;e[58]=74;e[60]=75;e[62]=76;e[68]=77;e[69]=78;e[75]=79;e[76]=210;e[80]=214;e[87]=80;e[89]=81;e[90]=82;e[92]=344;e[94]=83;e[97]=352;e[100]=84;e[104]=85;e[109]=220;e[115]=86;e[116]=87;e[121]=88;e[122]=89;e[124]=221;e[127]=90;e[129]=381;e[258]=97;e[259]=224;e[260]=225;e[263]=228;e[268]=261;e[271]=98;e[272]=99;e[273]=263;e[275]=269;e[282]=100;e[286]=101;e[287]=232;e[288]=233;e[290]=283;e[295]=281;e[296]=102;e[336]=103;e[346]=104;e[349]=105;e[350]=236;e[351]=237;e[361]=106;e[364]=107;e[367]=108;e[371]=322;e[373]=109;e[374]=110;e[381]=111;e[382]=242;e[383]=243;e[386]=246;e[393]=112;e[395]=113;e[396]=114;e[398]=345;e[400]=115;e[401]=347;e[403]=353;e[410]=116;e[437]=117;e[442]=252;e[448]=118;e[449]=119;e[454]=120;e[455]=121;e[457]=253;e[460]=122;e[462]=382;e[463]=380;e[853]=44;e[855]=58;e[856]=46;e[876]=47;e[878]=45;e[882]=45;e[894]=40;e[895]=41;e[896]=91;e[897]=93;e[923]=64;e[1004]=48;e[1005]=49;e[1006]=50;e[1007]=51;e[1008]=52;e[1009]=53;e[1010]=54;e[1011]=55;e[1012]=56;e[1013]=57;e[1081]=37;e[1085]=43;e[1086]=45}));function getStandardFontName(e){const t=normalizeFontName(e);return Pi()[t]}function isKnownFontName(e){const t=normalizeFontName(e);return!!(Pi()[t]||ji()[t]||Xi()[t]||Zi()[t])}class ToUnicodeMap{constructor(e=[]){this._map=e}get length(){return this._map.length}forEach(e){for(const t in this._map)e(t,this._map[t].charCodeAt(0))}has(e){return void 0!==this._map[e]}get(e){return this._map[e]}charCodeOf(e){const t=this._map;if(t.length<=65536)return t.indexOf(e);for(const i in t)if(t[i]===e)return 0|i;return-1}amend(e){for(const t in e)this._map[t]=e[t]}}class IdentityToUnicodeMap{constructor(e,t){this.firstChar=e;this.lastChar=t}get length(){return this.lastChar+1-this.firstChar}forEach(e){for(let t=this.firstChar,i=this.lastChar;t<=i;t++)e(t,t)}has(e){return this.firstChar<=e&&e<=this.lastChar}get(e){if(this.firstChar<=e&&e<=this.lastChar)return String.fromCharCode(e)}charCodeOf(e){return Number.isInteger(e)&&e>=this.firstChar&&e<=this.lastChar?e:-1}amend(e){unreachable("Should not call amend()")}}class CFFFont{constructor(e,t){this.properties=t;const i=new CFFParser(e,t,Yi);this.cff=i.parse();this.cff.duplicateFirstGlyph();const a=new CFFCompiler(this.cff);this.seacs=this.cff.seacs;try{this.data=a.compile()}catch{warn("Failed to compile font "+t.loadedName);this.data=e}this._createBuiltInEncoding()}get numGlyphs(){return this.cff.charStrings.count}getCharset(){return this.cff.charset.charset}getGlyphMapping(){const e=this.cff,t=this.properties,{cidToGidMap:i,cMap:a}=t,s=e.charset.charset;let r,n;if(t.composite){let t,g;if(i?.length>0){t=Object.create(null);for(let e=0,a=i.length;e<a;e++){const a=i[e];void 0!==a&&(t[a]=e)}}r=Object.create(null);if(e.isCIDFont)for(n=0;n<s.length;n++){const e=s[n];g=a.charCodeOf(e);void 0!==t?.[g]&&(g=t[g]);r[g]=n}else for(n=0;n<e.charStrings.count;n++){g=a.charCodeOf(n);r[g]=n}return r}let g=e.encoding?e.encoding.encoding:null;t.isInternalFont&&(g=t.defaultEncoding);r=type1FontGlyphMapping(t,g,s);return r}hasGlyphId(e){return this.cff.hasGlyphId(e)}_createBuiltInEncoding(){const{charset:e,encoding:t}=this.cff;if(!e||!t)return;const i=e.charset,a=t.encoding,s=[];for(const e in a){const t=a[e];if(t>=0){const a=i[t];a&&(s[e]=a)}}s.length>0&&(this.properties.builtInEncoding=s)}}function getUint32(e,t){return(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0}function getUint16(e,t){return e[t]<<8|e[t+1]}function getInt16(e,t){return(e[t]<<24|e[t+1]<<16)>>16}function getInt8(e,t){return e[t]<<24>>24}function getFloat214(e,t){return getInt16(e,t)/16384}function getSubroutineBias(e){const t=e.length;let i=32768;t<1240?i=107:t<33900&&(i=1131);return i}function parseCmap(e,t,i){const a=1===getUint16(e,t+2)?getUint32(e,t+8):getUint32(e,t+16),s=getUint16(e,t+a);let r,n,g;if(4===s){getUint16(e,t+a+2);const i=getUint16(e,t+a+6)>>1;n=t+a+14;r=[];for(g=0;g<i;g++,n+=2)r[g]={end:getUint16(e,n)};n+=2;for(g=0;g<i;g++,n+=2)r[g].start=getUint16(e,n);for(g=0;g<i;g++,n+=2)r[g].idDelta=getUint16(e,n);for(g=0;g<i;g++,n+=2){let t=getUint16(e,n);if(0!==t){r[g].ids=[];for(let i=0,a=r[g].end-r[g].start+1;i<a;i++){r[g].ids[i]=getUint16(e,n+t);t+=2}}}return r}if(12===s){const i=getUint32(e,t+a+12);n=t+a+16;r=[];for(g=0;g<i;g++){t=getUint32(e,n);r.push({start:t,end:getUint32(e,n+4),idDelta:getUint32(e,n+8)-t});n+=12}return r}throw new FormatError(`unsupported cmap: ${s}`)}function parseCff(e,t,i,a){const s=new CFFParser(new Stream(e,t,i-t),{},a).parse();return{glyphs:s.charStrings.objects,subrs:s.topDict.privateDict?.subrsIndex?.objects,gsubrs:s.globalSubrIndex?.objects,isCFFCIDFont:s.isCIDFont,fdSelect:s.fdSelect,fdArray:s.fdArray}}function lookupCmap(e,t){const i=t.codePointAt(0);let a=0,s=0,r=e.length-1;for(;s<r;){const t=s+r+1>>1;i<e[t].start?r=t-1:s=t}e[s].start<=i&&i<=e[s].end&&(a=e[s].idDelta+(e[s].ids?e[s].ids[i-e[s].start]:i)&65535);return{charCode:i,glyphId:a}}function compileGlyf(e,t,i){function moveTo(e,i){t.add(Ct,[e,i])}function lineTo(e,i){t.add(ht,[e,i])}function quadraticCurveTo(e,i,a,s){t.add(Bt,[e,i,a,s])}let a=0;const s=getInt16(e,a);let r,n=0,g=0;a+=10;if(s<0)do{r=getUint16(e,a);const s=getUint16(e,a+2);a+=4;let o,c;if(1&r){if(2&r){o=getInt16(e,a);c=getInt16(e,a+2)}else{o=getUint16(e,a);c=getUint16(e,a+2)}a+=4}else if(2&r){o=getInt8(e,a++);c=getInt8(e,a++)}else{o=e[a++];c=e[a++]}if(2&r){n=o;g=c}else{n=0;g=0}let C=1,h=1,l=0,Q=0;if(8&r){C=h=getFloat214(e,a);a+=2}else if(64&r){C=getFloat214(e,a);h=getFloat214(e,a+2);a+=4}else if(128&r){C=getFloat214(e,a);l=getFloat214(e,a+2);Q=getFloat214(e,a+4);h=getFloat214(e,a+6);a+=8}const E=i.glyphs[s];if(E){t.add(Qt);t.add(ut,[C,l,Q,h,n,g]);compileGlyf(E,t,i);t.add(lt)}}while(32&r);else{const t=[];let i,o;for(i=0;i<s;i++){t.push(getUint16(e,a));a+=2}a+=2+getUint16(e,a);const c=t.at(-1)+1,C=[];for(;C.length<c;){r=e[a++];let t=1;8&r&&(t+=e[a++]);for(;t-- >0;)C.push({flags:r})}for(i=0;i<c;i++){switch(18&C[i].flags){case 0:n+=getInt16(e,a);a+=2;break;case 2:n-=e[a++];break;case 18:n+=e[a++]}C[i].x=n}for(i=0;i<c;i++){switch(36&C[i].flags){case 0:g+=getInt16(e,a);a+=2;break;case 4:g-=e[a++];break;case 36:g+=e[a++]}C[i].y=g}let h=0;for(a=0;a<s;a++){const e=t[a],s=C.slice(h,e+1);if(1&s[0].flags)s.push(s[0]);else if(1&s.at(-1).flags)s.unshift(s.at(-1));else{const e={flags:1,x:(s[0].x+s.at(-1).x)/2,y:(s[0].y+s.at(-1).y)/2};s.unshift(e);s.push(e)}moveTo(s[0].x,s[0].y);for(i=1,o=s.length;i<o;i++)if(1&s[i].flags)lineTo(s[i].x,s[i].y);else if(1&s[i+1].flags){quadraticCurveTo(s[i].x,s[i].y,s[i+1].x,s[i+1].y);i++}else quadraticCurveTo(s[i].x,s[i].y,(s[i].x+s[i+1].x)/2,(s[i].y+s[i+1].y)/2);h=e+1}}}function compileCharString(e,t,i,a){function moveTo(e,i){t.add(Ct,[e,i])}function lineTo(e,i){t.add(ht,[e,i])}function bezierCurveTo(e,i,a,s,r,n){t.add(ct,[e,i,a,s,r,n])}const s=[];let r=0,n=0,g=0;!function parse(e){let o=0;for(;o<e.length;){let c,C,h,l,Q,E,u,d,f,p=!1,m=e[o++];switch(m){case 1:case 3:case 18:case 23:g+=s.length>>1;p=!0;break;case 4:n+=s.pop();moveTo(r,n);p=!0;break;case 5:for(;s.length>0;){r+=s.shift();n+=s.shift();lineTo(r,n)}break;case 6:for(;s.length>0;){r+=s.shift();lineTo(r,n);if(0===s.length)break;n+=s.shift();lineTo(r,n)}break;case 7:for(;s.length>0;){n+=s.shift();lineTo(r,n);if(0===s.length)break;r+=s.shift();lineTo(r,n)}break;case 8:for(;s.length>0;){c=r+s.shift();h=n+s.shift();C=c+s.shift();l=h+s.shift();r=C+s.shift();n=l+s.shift();bezierCurveTo(c,h,C,l,r,n)}break;case 10:d=s.pop();f=null;if(i.isCFFCIDFont){const e=i.fdSelect.getFDIndex(a);if(e>=0&&e<i.fdArray.length){const t=i.fdArray[e];let a;t.privateDict?.subrsIndex&&(a=t.privateDict.subrsIndex.objects);if(a){d+=getSubroutineBias(a);f=a[d]}}else warn("Invalid fd index for glyph index.")}else f=i.subrs[d+i.subrsBias];f&&parse(f);break;case 11:return;case 12:m=e[o++];switch(m){case 34:c=r+s.shift();C=c+s.shift();Q=n+s.shift();r=C+s.shift();bezierCurveTo(c,n,C,Q,r,Q);c=r+s.shift();C=c+s.shift();r=C+s.shift();bezierCurveTo(c,Q,C,n,r,n);break;case 35:c=r+s.shift();h=n+s.shift();C=c+s.shift();l=h+s.shift();r=C+s.shift();n=l+s.shift();bezierCurveTo(c,h,C,l,r,n);c=r+s.shift();h=n+s.shift();C=c+s.shift();l=h+s.shift();r=C+s.shift();n=l+s.shift();bezierCurveTo(c,h,C,l,r,n);s.pop();break;case 36:c=r+s.shift();Q=n+s.shift();C=c+s.shift();E=Q+s.shift();r=C+s.shift();bezierCurveTo(c,Q,C,E,r,E);c=r+s.shift();C=c+s.shift();u=E+s.shift();r=C+s.shift();bezierCurveTo(c,E,C,u,r,n);break;case 37:const e=r,t=n;c=r+s.shift();h=n+s.shift();C=c+s.shift();l=h+s.shift();r=C+s.shift();n=l+s.shift();bezierCurveTo(c,h,C,l,r,n);c=r+s.shift();h=n+s.shift();C=c+s.shift();l=h+s.shift();r=C;n=l;Math.abs(r-e)>Math.abs(n-t)?r+=s.shift():n+=s.shift();bezierCurveTo(c,h,C,l,r,n);break;default:throw new FormatError(`unknown operator: 12 ${m}`)}break;case 14:if(s.length>=4){const e=s.pop(),a=s.pop();n=s.pop();r=s.pop();t.add(Qt);t.add(dt,[r,n]);let g=lookupCmap(i.cmap,String.fromCharCode(i.glyphNameMap[fi[e]]));compileCharString(i.glyphs[g.glyphId],t,i,g.glyphId);t.add(lt);g=lookupCmap(i.cmap,String.fromCharCode(i.glyphNameMap[fi[a]]));compileCharString(i.glyphs[g.glyphId],t,i,g.glyphId)}return;case 19:case 20:g+=s.length>>1;o+=g+7>>3;p=!0;break;case 21:n+=s.pop();r+=s.pop();moveTo(r,n);p=!0;break;case 22:r+=s.pop();moveTo(r,n);p=!0;break;case 24:for(;s.length>2;){c=r+s.shift();h=n+s.shift();C=c+s.shift();l=h+s.shift();r=C+s.shift();n=l+s.shift();bezierCurveTo(c,h,C,l,r,n)}r+=s.shift();n+=s.shift();lineTo(r,n);break;case 25:for(;s.length>6;){r+=s.shift();n+=s.shift();lineTo(r,n)}c=r+s.shift();h=n+s.shift();C=c+s.shift();l=h+s.shift();r=C+s.shift();n=l+s.shift();bezierCurveTo(c,h,C,l,r,n);break;case 26:s.length%2&&(r+=s.shift());for(;s.length>0;){c=r;h=n+s.shift();C=c+s.shift();l=h+s.shift();r=C;n=l+s.shift();bezierCurveTo(c,h,C,l,r,n)}break;case 27:s.length%2&&(n+=s.shift());for(;s.length>0;){c=r+s.shift();h=n;C=c+s.shift();l=h+s.shift();r=C+s.shift();n=l;bezierCurveTo(c,h,C,l,r,n)}break;case 28:s.push((e[o]<<24|e[o+1]<<16)>>16);o+=2;break;case 29:d=s.pop()+i.gsubrsBias;f=i.gsubrs[d];f&&parse(f);break;case 30:for(;s.length>0;){c=r;h=n+s.shift();C=c+s.shift();l=h+s.shift();r=C+s.shift();n=l+(1===s.length?s.shift():0);bezierCurveTo(c,h,C,l,r,n);if(0===s.length)break;c=r+s.shift();h=n;C=c+s.shift();l=h+s.shift();n=l+s.shift();r=C+(1===s.length?s.shift():0);bezierCurveTo(c,h,C,l,r,n)}break;case 31:for(;s.length>0;){c=r+s.shift();h=n;C=c+s.shift();l=h+s.shift();n=l+s.shift();r=C+(1===s.length?s.shift():0);bezierCurveTo(c,h,C,l,r,n);if(0===s.length)break;c=r;h=n+s.shift();C=c+s.shift();l=h+s.shift();r=C+s.shift();n=l+(1===s.length?s.shift():0);bezierCurveTo(c,h,C,l,r,n)}break;default:if(m<32)throw new FormatError(`unknown operator: ${m}`);if(m<247)s.push(m-139);else if(m<251)s.push(256*(m-247)+e[o++]+108);else if(m<255)s.push(256*-(m-251)-e[o++]-108);else{s.push((e[o]<<24|e[o+1]<<16|e[o+2]<<8|e[o+3])/65536);o+=4}}p&&(s.length=0)}}(e)}const $i=[];class Commands{cmds=[];add(e,t){if(t)if(isNumberArray(t,null))this.cmds.push(e,...t);else{warn(`Commands.add - "${e}" has at least one non-number arg: "${t}".`);const i=t.map((e=>"number"==typeof e?e:0));this.cmds.push(e,...i)}else this.cmds.push(e)}}class CompiledFont{constructor(e){this.constructor===CompiledFont&&unreachable("Cannot initialize CompiledFont.");this.fontMatrix=e;this.compiledGlyphs=Object.create(null);this.compiledCharCodeToGlyphId=Object.create(null)}getPathJs(e){const{charCode:t,glyphId:i}=lookupCmap(this.cmap,e);let a,s=this.compiledGlyphs[i];if(!s){try{s=this.compileGlyph(this.glyphs[i],i)}catch(e){s=$i;a=e}this.compiledGlyphs[i]=s}this.compiledCharCodeToGlyphId[t]??=i;if(a)throw a;return s}compileGlyph(e,t){if(!e||0===e.length||14===e[0])return $i;let i=this.fontMatrix;if(this.isCFFCIDFont){const e=this.fdSelect.getFDIndex(t);if(e>=0&&e<this.fdArray.length){i=this.fdArray[e].getByName("FontMatrix")||a}else warn("Invalid fd index for glyph index.")}const s=new Commands;s.add(Qt);s.add(ut,i.slice());s.add(Et);this.compileGlyphImpl(e,s,t);s.add(lt);return s.cmds}compileGlyphImpl(){unreachable("Children classes should implement this.")}hasBuiltPath(e){const{charCode:t,glyphId:i}=lookupCmap(this.cmap,e);return void 0!==this.compiledGlyphs[i]&&void 0!==this.compiledCharCodeToGlyphId[t]}}class TrueTypeCompiled extends CompiledFont{constructor(e,t,i){super(i||[488e-6,0,0,488e-6,0,0]);this.glyphs=e;this.cmap=t}compileGlyphImpl(e,t){compileGlyf(e,t,this)}}class Type2Compiled extends CompiledFont{constructor(e,t,i,a){super(i||[.001,0,0,.001,0,0]);this.glyphs=e.glyphs;this.gsubrs=e.gsubrs||[];this.subrs=e.subrs||[];this.cmap=t;this.glyphNameMap=a||Ni();this.gsubrsBias=getSubroutineBias(this.gsubrs);this.subrsBias=getSubroutineBias(this.subrs);this.isCFFCIDFont=e.isCFFCIDFont;this.fdSelect=e.fdSelect;this.fdArray=e.fdArray}compileGlyphImpl(e,t,i){compileCharString(e,t,this,i)}}class FontRendererFactory{static create(e,t){const i=new Uint8Array(e.data);let a,s,r,n,g,o;const c=getUint16(i,4);for(let e=0,C=12;e<c;e++,C+=16){const e=bytesToString(i.subarray(C,C+4)),c=getUint32(i,C+8),h=getUint32(i,C+12);switch(e){case"cmap":a=parseCmap(i,c);break;case"glyf":s=i.subarray(c,c+h);break;case"loca":r=i.subarray(c,c+h);break;case"head":o=getUint16(i,c+18);g=getUint16(i,c+50);break;case"CFF ":n=parseCff(i,c,c+h,t)}}if(s){const t=o?[1/o,0,0,1/o,0,0]:e.fontMatrix;return new TrueTypeCompiled(function parseGlyfTable(e,t,i){let a,s;if(i){a=4;s=getUint32}else{a=2;s=(e,t)=>2*getUint16(e,t)}const r=[];let n=s(t,0);for(let i=a;i<t.length;i+=a){const a=s(t,i);r.push(e.subarray(n,a));n=a}return r}(s,r,g),a,t)}return new Type2Compiled(n,a,e.fontMatrix,e.glyphNameMap)}}const Aa=getLookupTableFactory((function(e){e.Courier=600;e["Courier-Bold"]=600;e["Courier-BoldOblique"]=600;e["Courier-Oblique"]=600;e.Helvetica=getLookupTableFactory((function(e){e.space=278;e.exclam=278;e.quotedbl=355;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=667;e.quoteright=222;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=278;e.semicolon=278;e.less=584;e.equal=584;e.greater=584;e.question=556;e.at=1015;e.A=667;e.B=667;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=500;e.K=667;e.L=556;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=278;e.backslash=278;e.bracketright=278;e.asciicircum=469;e.underscore=556;e.quoteleft=222;e.a=556;e.b=556;e.c=500;e.d=556;e.e=556;e.f=278;e.g=556;e.h=556;e.i=222;e.j=222;e.k=500;e.l=222;e.m=833;e.n=556;e.o=556;e.p=556;e.q=556;e.r=333;e.s=500;e.t=278;e.u=556;e.v=500;e.w=722;e.x=500;e.y=500;e.z=500;e.braceleft=334;e.bar=260;e.braceright=334;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=191;e.quotedblleft=333;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=500;e.fl=500;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=537;e.bullet=350;e.quotesinglbase=222;e.quotedblbase=333;e.quotedblright=333;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=556;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=222;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=556;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=667;e.aacute=556;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=500;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=500;e.aring=556;e.Ncommaaccent=722;e.lacute=222;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=500;e.scedilla=500;e.iacute=278;e.lozenge=471;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=556;e.acircumflex=556;e.Amacron=667;e.rcaron=333;e.ccedilla=500;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=643;e.Umacron=722;e.uring=556;e.threesuperior=333;e.Ograve=778;e.Agrave=667;e.Abreve=667;e.multiply=584;e.uacute=556;e.Tcaron=611;e.partialdiff=476;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=500;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=260;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=333;e.omacron=556;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=222;e.tcaron=317;e.eogonek=556;e.Uogonek=722;e.Aacute=667;e.Adieresis=667;e.egrave=556;e.zacute=500;e.iogonek=222;e.Oacute=778;e.oacute=556;e.amacron=556;e.sacute=500;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=556;e.twosuperior=333;e.Odieresis=778;e.mu=556;e.igrave=278;e.ohungarumlaut=556;e.Eogonek=667;e.dcroat=556;e.threequarters=834;e.Scedilla=667;e.lcaron=299;e.Kcommaaccent=667;e.Lacute=556;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=556;e.onehalf=834;e.lessequal=549;e.ocircumflex=556;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=556;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=556;e.Ccaron=722;e.ugrave=556;e.radical=453;e.Dcaron=722;e.rcommaaccent=333;e.Ntilde=722;e.otilde=556;e.Rcommaaccent=722;e.Lcommaaccent=556;e.Atilde=667;e.Aogonek=667;e.Aring=667;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=500;e.minus=584;e.Icircumflex=278;e.ncaron=556;e.tcommaaccent=278;e.logicalnot=584;e.odieresis=556;e.udieresis=556;e.notequal=549;e.gcommaaccent=556;e.eth=556;e.zcaron=500;e.ncommaaccent=556;e.onesuperior=333;e.imacron=278;e.Euro=556}));e["Helvetica-Bold"]=getLookupTableFactory((function(e){e.space=278;e.exclam=333;e.quotedbl=474;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=722;e.quoteright=278;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=333;e.semicolon=333;e.less=584;e.equal=584;e.greater=584;e.question=611;e.at=975;e.A=722;e.B=722;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=556;e.K=722;e.L=611;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=584;e.underscore=556;e.quoteleft=278;e.a=556;e.b=611;e.c=556;e.d=611;e.e=556;e.f=333;e.g=611;e.h=611;e.i=278;e.j=278;e.k=556;e.l=278;e.m=889;e.n=611;e.o=611;e.p=611;e.q=611;e.r=389;e.s=556;e.t=333;e.u=611;e.v=556;e.w=778;e.x=556;e.y=556;e.z=500;e.braceleft=389;e.bar=280;e.braceright=389;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=238;e.quotedblleft=500;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=611;e.fl=611;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=556;e.bullet=350;e.quotesinglbase=278;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=611;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=278;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=611;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=722;e.aacute=556;e.Ucircumflex=722;e.yacute=556;e.scommaaccent=556;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=611;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=556;e.aring=556;e.Ncommaaccent=722;e.lacute=278;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=556;e.scedilla=556;e.iacute=278;e.lozenge=494;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=611;e.acircumflex=556;e.Amacron=722;e.rcaron=389;e.ccedilla=556;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=743;e.Umacron=722;e.uring=611;e.threesuperior=333;e.Ograve=778;e.Agrave=722;e.Abreve=722;e.multiply=584;e.uacute=611;e.Tcaron=611;e.partialdiff=494;e.ydieresis=556;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=556;e.nacute=611;e.umacron=611;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=280;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=389;e.omacron=611;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=278;e.tcaron=389;e.eogonek=556;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=556;e.zacute=500;e.iogonek=278;e.Oacute=778;e.oacute=611;e.amacron=556;e.sacute=556;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=611;e.twosuperior=333;e.Odieresis=778;e.mu=611;e.igrave=278;e.ohungarumlaut=611;e.Eogonek=667;e.dcroat=611;e.threequarters=834;e.Scedilla=667;e.lcaron=400;e.Kcommaaccent=722;e.Lacute=611;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=611;e.onehalf=834;e.lessequal=549;e.ocircumflex=611;e.ntilde=611;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=611;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=611;e.Ccaron=722;e.ugrave=611;e.radical=549;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=722;e.otilde=611;e.Rcommaaccent=722;e.Lcommaaccent=611;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=556;e.minus=584;e.Icircumflex=278;e.ncaron=611;e.tcommaaccent=333;e.logicalnot=584;e.odieresis=611;e.udieresis=611;e.notequal=549;e.gcommaaccent=611;e.eth=611;e.zcaron=500;e.ncommaaccent=611;e.onesuperior=333;e.imacron=278;e.Euro=556}));e["Helvetica-BoldOblique"]=getLookupTableFactory((function(e){e.space=278;e.exclam=333;e.quotedbl=474;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=722;e.quoteright=278;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=333;e.semicolon=333;e.less=584;e.equal=584;e.greater=584;e.question=611;e.at=975;e.A=722;e.B=722;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=556;e.K=722;e.L=611;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=584;e.underscore=556;e.quoteleft=278;e.a=556;e.b=611;e.c=556;e.d=611;e.e=556;e.f=333;e.g=611;e.h=611;e.i=278;e.j=278;e.k=556;e.l=278;e.m=889;e.n=611;e.o=611;e.p=611;e.q=611;e.r=389;e.s=556;e.t=333;e.u=611;e.v=556;e.w=778;e.x=556;e.y=556;e.z=500;e.braceleft=389;e.bar=280;e.braceright=389;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=238;e.quotedblleft=500;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=611;e.fl=611;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=556;e.bullet=350;e.quotesinglbase=278;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=611;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=278;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=611;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=722;e.aacute=556;e.Ucircumflex=722;e.yacute=556;e.scommaaccent=556;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=611;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=556;e.aring=556;e.Ncommaaccent=722;e.lacute=278;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=556;e.scedilla=556;e.iacute=278;e.lozenge=494;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=611;e.acircumflex=556;e.Amacron=722;e.rcaron=389;e.ccedilla=556;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=743;e.Umacron=722;e.uring=611;e.threesuperior=333;e.Ograve=778;e.Agrave=722;e.Abreve=722;e.multiply=584;e.uacute=611;e.Tcaron=611;e.partialdiff=494;e.ydieresis=556;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=556;e.nacute=611;e.umacron=611;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=280;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=389;e.omacron=611;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=278;e.tcaron=389;e.eogonek=556;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=556;e.zacute=500;e.iogonek=278;e.Oacute=778;e.oacute=611;e.amacron=556;e.sacute=556;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=611;e.twosuperior=333;e.Odieresis=778;e.mu=611;e.igrave=278;e.ohungarumlaut=611;e.Eogonek=667;e.dcroat=611;e.threequarters=834;e.Scedilla=667;e.lcaron=400;e.Kcommaaccent=722;e.Lacute=611;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=611;e.onehalf=834;e.lessequal=549;e.ocircumflex=611;e.ntilde=611;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=611;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=611;e.Ccaron=722;e.ugrave=611;e.radical=549;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=722;e.otilde=611;e.Rcommaaccent=722;e.Lcommaaccent=611;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=556;e.minus=584;e.Icircumflex=278;e.ncaron=611;e.tcommaaccent=333;e.logicalnot=584;e.odieresis=611;e.udieresis=611;e.notequal=549;e.gcommaaccent=611;e.eth=611;e.zcaron=500;e.ncommaaccent=611;e.onesuperior=333;e.imacron=278;e.Euro=556}));e["Helvetica-Oblique"]=getLookupTableFactory((function(e){e.space=278;e.exclam=278;e.quotedbl=355;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=667;e.quoteright=222;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=278;e.semicolon=278;e.less=584;e.equal=584;e.greater=584;e.question=556;e.at=1015;e.A=667;e.B=667;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=500;e.K=667;e.L=556;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=278;e.backslash=278;e.bracketright=278;e.asciicircum=469;e.underscore=556;e.quoteleft=222;e.a=556;e.b=556;e.c=500;e.d=556;e.e=556;e.f=278;e.g=556;e.h=556;e.i=222;e.j=222;e.k=500;e.l=222;e.m=833;e.n=556;e.o=556;e.p=556;e.q=556;e.r=333;e.s=500;e.t=278;e.u=556;e.v=500;e.w=722;e.x=500;e.y=500;e.z=500;e.braceleft=334;e.bar=260;e.braceright=334;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=191;e.quotedblleft=333;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=500;e.fl=500;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=537;e.bullet=350;e.quotesinglbase=222;e.quotedblbase=333;e.quotedblright=333;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=556;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=222;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=556;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=667;e.aacute=556;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=500;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=500;e.aring=556;e.Ncommaaccent=722;e.lacute=222;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=500;e.scedilla=500;e.iacute=278;e.lozenge=471;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=556;e.acircumflex=556;e.Amacron=667;e.rcaron=333;e.ccedilla=500;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=643;e.Umacron=722;e.uring=556;e.threesuperior=333;e.Ograve=778;e.Agrave=667;e.Abreve=667;e.multiply=584;e.uacute=556;e.Tcaron=611;e.partialdiff=476;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=500;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=260;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=333;e.omacron=556;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=222;e.tcaron=317;e.eogonek=556;e.Uogonek=722;e.Aacute=667;e.Adieresis=667;e.egrave=556;e.zacute=500;e.iogonek=222;e.Oacute=778;e.oacute=556;e.amacron=556;e.sacute=500;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=556;e.twosuperior=333;e.Odieresis=778;e.mu=556;e.igrave=278;e.ohungarumlaut=556;e.Eogonek=667;e.dcroat=556;e.threequarters=834;e.Scedilla=667;e.lcaron=299;e.Kcommaaccent=667;e.Lacute=556;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=556;e.onehalf=834;e.lessequal=549;e.ocircumflex=556;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=556;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=556;e.Ccaron=722;e.ugrave=556;e.radical=453;e.Dcaron=722;e.rcommaaccent=333;e.Ntilde=722;e.otilde=556;e.Rcommaaccent=722;e.Lcommaaccent=556;e.Atilde=667;e.Aogonek=667;e.Aring=667;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=500;e.minus=584;e.Icircumflex=278;e.ncaron=556;e.tcommaaccent=278;e.logicalnot=584;e.odieresis=556;e.udieresis=556;e.notequal=549;e.gcommaaccent=556;e.eth=556;e.zcaron=500;e.ncommaaccent=556;e.onesuperior=333;e.imacron=278;e.Euro=556}));e.Symbol=getLookupTableFactory((function(e){e.space=250;e.exclam=333;e.universal=713;e.numbersign=500;e.existential=549;e.percent=833;e.ampersand=778;e.suchthat=439;e.parenleft=333;e.parenright=333;e.asteriskmath=500;e.plus=549;e.comma=250;e.minus=549;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=278;e.semicolon=278;e.less=549;e.equal=549;e.greater=549;e.question=444;e.congruent=549;e.Alpha=722;e.Beta=667;e.Chi=722;e.Delta=612;e.Epsilon=611;e.Phi=763;e.Gamma=603;e.Eta=722;e.Iota=333;e.theta1=631;e.Kappa=722;e.Lambda=686;e.Mu=889;e.Nu=722;e.Omicron=722;e.Pi=768;e.Theta=741;e.Rho=556;e.Sigma=592;e.Tau=611;e.Upsilon=690;e.sigma1=439;e.Omega=768;e.Xi=645;e.Psi=795;e.Zeta=611;e.bracketleft=333;e.therefore=863;e.bracketright=333;e.perpendicular=658;e.underscore=500;e.radicalex=500;e.alpha=631;e.beta=549;e.chi=549;e.delta=494;e.epsilon=439;e.phi=521;e.gamma=411;e.eta=603;e.iota=329;e.phi1=603;e.kappa=549;e.lambda=549;e.mu=576;e.nu=521;e.omicron=549;e.pi=549;e.theta=521;e.rho=549;e.sigma=603;e.tau=439;e.upsilon=576;e.omega1=713;e.omega=686;e.xi=493;e.psi=686;e.zeta=494;e.braceleft=480;e.bar=200;e.braceright=480;e.similar=549;e.Euro=750;e.Upsilon1=620;e.minute=247;e.lessequal=549;e.fraction=167;e.infinity=713;e.florin=500;e.club=753;e.diamond=753;e.heart=753;e.spade=753;e.arrowboth=1042;e.arrowleft=987;e.arrowup=603;e.arrowright=987;e.arrowdown=603;e.degree=400;e.plusminus=549;e.second=411;e.greaterequal=549;e.multiply=549;e.proportional=713;e.partialdiff=494;e.bullet=460;e.divide=549;e.notequal=549;e.equivalence=549;e.approxequal=549;e.ellipsis=1e3;e.arrowvertex=603;e.arrowhorizex=1e3;e.carriagereturn=658;e.aleph=823;e.Ifraktur=686;e.Rfraktur=795;e.weierstrass=987;e.circlemultiply=768;e.circleplus=768;e.emptyset=823;e.intersection=768;e.union=768;e.propersuperset=713;e.reflexsuperset=713;e.notsubset=713;e.propersubset=713;e.reflexsubset=713;e.element=713;e.notelement=713;e.angle=768;e.gradient=713;e.registerserif=790;e.copyrightserif=790;e.trademarkserif=890;e.product=823;e.radical=549;e.dotmath=250;e.logicalnot=713;e.logicaland=603;e.logicalor=603;e.arrowdblboth=1042;e.arrowdblleft=987;e.arrowdblup=603;e.arrowdblright=987;e.arrowdbldown=603;e.lozenge=494;e.angleleft=329;e.registersans=790;e.copyrightsans=790;e.trademarksans=786;e.summation=713;e.parenlefttp=384;e.parenleftex=384;e.parenleftbt=384;e.bracketlefttp=384;e.bracketleftex=384;e.bracketleftbt=384;e.bracelefttp=494;e.braceleftmid=494;e.braceleftbt=494;e.braceex=494;e.angleright=329;e.integral=274;e.integraltp=686;e.integralex=686;e.integralbt=686;e.parenrighttp=384;e.parenrightex=384;e.parenrightbt=384;e.bracketrighttp=384;e.bracketrightex=384;e.bracketrightbt=384;e.bracerighttp=494;e.bracerightmid=494;e.bracerightbt=494;e.apple=790}));e["Times-Roman"]=getLookupTableFactory((function(e){e.space=250;e.exclam=333;e.quotedbl=408;e.numbersign=500;e.dollar=500;e.percent=833;e.ampersand=778;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=564;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=278;e.semicolon=278;e.less=564;e.equal=564;e.greater=564;e.question=444;e.at=921;e.A=722;e.B=667;e.C=667;e.D=722;e.E=611;e.F=556;e.G=722;e.H=722;e.I=333;e.J=389;e.K=722;e.L=611;e.M=889;e.N=722;e.O=722;e.P=556;e.Q=722;e.R=667;e.S=556;e.T=611;e.U=722;e.V=722;e.W=944;e.X=722;e.Y=722;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=469;e.underscore=500;e.quoteleft=333;e.a=444;e.b=500;e.c=444;e.d=500;e.e=444;e.f=333;e.g=500;e.h=500;e.i=278;e.j=278;e.k=500;e.l=278;e.m=778;e.n=500;e.o=500;e.p=500;e.q=500;e.r=333;e.s=389;e.t=278;e.u=500;e.v=500;e.w=722;e.x=500;e.y=500;e.z=444;e.braceleft=480;e.bar=200;e.braceright=480;e.asciitilde=541;e.exclamdown=333;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=180;e.quotedblleft=444;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=556;e.fl=556;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=453;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=444;e.quotedblright=444;e.guillemotright=500;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=444;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=889;e.ordfeminine=276;e.Lslash=611;e.Oslash=722;e.OE=889;e.ordmasculine=310;e.ae=667;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=722;e.germandbls=500;e.Idieresis=333;e.eacute=444;e.abreve=444;e.uhungarumlaut=500;e.ecaron=444;e.Ydieresis=722;e.divide=564;e.Yacute=722;e.Acircumflex=722;e.aacute=444;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=444;e.Uacute=722;e.uogonek=500;e.Edieresis=611;e.Dcroat=722;e.commaaccent=250;e.copyright=760;e.Emacron=611;e.ccaron=444;e.aring=444;e.Ncommaaccent=722;e.lacute=278;e.agrave=444;e.Tcommaaccent=611;e.Cacute=667;e.atilde=444;e.Edotaccent=611;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=471;e.Rcaron=667;e.Gcommaaccent=722;e.ucircumflex=500;e.acircumflex=444;e.Amacron=722;e.rcaron=333;e.ccedilla=444;e.Zdotaccent=611;e.Thorn=556;e.Omacron=722;e.Racute=667;e.Sacute=556;e.dcaron=588;e.Umacron=722;e.uring=500;e.threesuperior=300;e.Ograve=722;e.Agrave=722;e.Abreve=722;e.multiply=564;e.uacute=500;e.Tcaron=611;e.partialdiff=476;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=611;e.adieresis=444;e.edieresis=444;e.cacute=444;e.nacute=500;e.umacron=500;e.Ncaron=722;e.Iacute=333;e.plusminus=564;e.brokenbar=200;e.registered=760;e.Gbreve=722;e.Idotaccent=333;e.summation=600;e.Egrave=611;e.racute=333;e.omacron=500;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=667;e.lcommaaccent=278;e.tcaron=326;e.eogonek=444;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=444;e.zacute=444;e.iogonek=278;e.Oacute=722;e.oacute=500;e.amacron=444;e.sacute=389;e.idieresis=278;e.Ocircumflex=722;e.Ugrave=722;e.Delta=612;e.thorn=500;e.twosuperior=300;e.Odieresis=722;e.mu=500;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=611;e.dcroat=500;e.threequarters=750;e.Scedilla=556;e.lcaron=344;e.Kcommaaccent=722;e.Lacute=611;e.trademark=980;e.edotaccent=444;e.Igrave=333;e.Imacron=333;e.Lcaron=611;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=500;e.Uhungarumlaut=722;e.Eacute=611;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=556;e.Scommaaccent=556;e.Ohungarumlaut=722;e.degree=400;e.ograve=500;e.Ccaron=667;e.ugrave=500;e.radical=453;e.Dcaron=722;e.rcommaaccent=333;e.Ntilde=722;e.otilde=500;e.Rcommaaccent=667;e.Lcommaaccent=611;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=722;e.zdotaccent=444;e.Ecaron=611;e.Iogonek=333;e.kcommaaccent=500;e.minus=564;e.Icircumflex=333;e.ncaron=500;e.tcommaaccent=278;e.logicalnot=564;e.odieresis=500;e.udieresis=500;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=444;e.ncommaaccent=500;e.onesuperior=300;e.imacron=278;e.Euro=500}));e["Times-Bold"]=getLookupTableFactory((function(e){e.space=250;e.exclam=333;e.quotedbl=555;e.numbersign=500;e.dollar=500;e.percent=1e3;e.ampersand=833;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=570;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=333;e.semicolon=333;e.less=570;e.equal=570;e.greater=570;e.question=500;e.at=930;e.A=722;e.B=667;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=778;e.I=389;e.J=500;e.K=778;e.L=667;e.M=944;e.N=722;e.O=778;e.P=611;e.Q=778;e.R=722;e.S=556;e.T=667;e.U=722;e.V=722;e.W=1e3;e.X=722;e.Y=722;e.Z=667;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=581;e.underscore=500;e.quoteleft=333;e.a=500;e.b=556;e.c=444;e.d=556;e.e=444;e.f=333;e.g=500;e.h=556;e.i=278;e.j=333;e.k=556;e.l=278;e.m=833;e.n=556;e.o=500;e.p=556;e.q=556;e.r=444;e.s=389;e.t=333;e.u=556;e.v=500;e.w=722;e.x=500;e.y=500;e.z=444;e.braceleft=394;e.bar=220;e.braceright=394;e.asciitilde=520;e.exclamdown=333;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=278;e.quotedblleft=500;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=556;e.fl=556;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=540;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=500;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=500;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=300;e.Lslash=667;e.Oslash=778;e.OE=1e3;e.ordmasculine=330;e.ae=722;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=722;e.germandbls=556;e.Idieresis=389;e.eacute=444;e.abreve=500;e.uhungarumlaut=556;e.ecaron=444;e.Ydieresis=722;e.divide=570;e.Yacute=722;e.Acircumflex=722;e.aacute=500;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=500;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=747;e.Emacron=667;e.ccaron=444;e.aring=500;e.Ncommaaccent=722;e.lacute=278;e.agrave=500;e.Tcommaaccent=667;e.Cacute=722;e.atilde=500;e.Edotaccent=667;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=494;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=556;e.acircumflex=500;e.Amacron=722;e.rcaron=444;e.ccedilla=444;e.Zdotaccent=667;e.Thorn=611;e.Omacron=778;e.Racute=722;e.Sacute=556;e.dcaron=672;e.Umacron=722;e.uring=556;e.threesuperior=300;e.Ograve=778;e.Agrave=722;e.Abreve=722;e.multiply=570;e.uacute=556;e.Tcaron=667;e.partialdiff=494;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=500;e.edieresis=444;e.cacute=444;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=389;e.plusminus=570;e.brokenbar=220;e.registered=747;e.Gbreve=778;e.Idotaccent=389;e.summation=600;e.Egrave=667;e.racute=444;e.omacron=500;e.Zacute=667;e.Zcaron=667;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=278;e.tcaron=416;e.eogonek=444;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=444;e.zacute=444;e.iogonek=278;e.Oacute=778;e.oacute=500;e.amacron=500;e.sacute=389;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=556;e.twosuperior=300;e.Odieresis=778;e.mu=556;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=667;e.dcroat=556;e.threequarters=750;e.Scedilla=556;e.lcaron=394;e.Kcommaaccent=778;e.Lacute=667;e.trademark=1e3;e.edotaccent=444;e.Igrave=389;e.Imacron=389;e.Lcaron=667;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=556;e.Scommaaccent=556;e.Ohungarumlaut=778;e.degree=400;e.ograve=500;e.Ccaron=722;e.ugrave=556;e.radical=549;e.Dcaron=722;e.rcommaaccent=444;e.Ntilde=722;e.otilde=500;e.Rcommaaccent=722;e.Lcommaaccent=667;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=778;e.zdotaccent=444;e.Ecaron=667;e.Iogonek=389;e.kcommaaccent=556;e.minus=570;e.Icircumflex=389;e.ncaron=556;e.tcommaaccent=333;e.logicalnot=570;e.odieresis=500;e.udieresis=556;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=444;e.ncommaaccent=556;e.onesuperior=300;e.imacron=278;e.Euro=500}));e["Times-BoldItalic"]=getLookupTableFactory((function(e){e.space=250;e.exclam=389;e.quotedbl=555;e.numbersign=500;e.dollar=500;e.percent=833;e.ampersand=778;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=570;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=333;e.semicolon=333;e.less=570;e.equal=570;e.greater=570;e.question=500;e.at=832;e.A=667;e.B=667;e.C=667;e.D=722;e.E=667;e.F=667;e.G=722;e.H=778;e.I=389;e.J=500;e.K=667;e.L=611;e.M=889;e.N=722;e.O=722;e.P=611;e.Q=722;e.R=667;e.S=556;e.T=611;e.U=722;e.V=667;e.W=889;e.X=667;e.Y=611;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=570;e.underscore=500;e.quoteleft=333;e.a=500;e.b=500;e.c=444;e.d=500;e.e=444;e.f=333;e.g=500;e.h=556;e.i=278;e.j=278;e.k=500;e.l=278;e.m=778;e.n=556;e.o=500;e.p=500;e.q=500;e.r=389;e.s=389;e.t=278;e.u=556;e.v=444;e.w=667;e.x=500;e.y=444;e.z=389;e.braceleft=348;e.bar=220;e.braceright=348;e.asciitilde=570;e.exclamdown=389;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=278;e.quotedblleft=500;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=556;e.fl=556;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=500;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=500;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=500;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=944;e.ordfeminine=266;e.Lslash=611;e.Oslash=722;e.OE=944;e.ordmasculine=300;e.ae=722;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=722;e.germandbls=500;e.Idieresis=389;e.eacute=444;e.abreve=500;e.uhungarumlaut=556;e.ecaron=444;e.Ydieresis=611;e.divide=570;e.Yacute=611;e.Acircumflex=667;e.aacute=500;e.Ucircumflex=722;e.yacute=444;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=500;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=747;e.Emacron=667;e.ccaron=444;e.aring=500;e.Ncommaaccent=722;e.lacute=278;e.agrave=500;e.Tcommaaccent=611;e.Cacute=667;e.atilde=500;e.Edotaccent=667;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=494;e.Rcaron=667;e.Gcommaaccent=722;e.ucircumflex=556;e.acircumflex=500;e.Amacron=667;e.rcaron=389;e.ccedilla=444;e.Zdotaccent=611;e.Thorn=611;e.Omacron=722;e.Racute=667;e.Sacute=556;e.dcaron=608;e.Umacron=722;e.uring=556;e.threesuperior=300;e.Ograve=722;e.Agrave=667;e.Abreve=667;e.multiply=570;e.uacute=556;e.Tcaron=611;e.partialdiff=494;e.ydieresis=444;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=500;e.edieresis=444;e.cacute=444;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=389;e.plusminus=570;e.brokenbar=220;e.registered=747;e.Gbreve=722;e.Idotaccent=389;e.summation=600;e.Egrave=667;e.racute=389;e.omacron=500;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=667;e.lcommaaccent=278;e.tcaron=366;e.eogonek=444;e.Uogonek=722;e.Aacute=667;e.Adieresis=667;e.egrave=444;e.zacute=389;e.iogonek=278;e.Oacute=722;e.oacute=500;e.amacron=500;e.sacute=389;e.idieresis=278;e.Ocircumflex=722;e.Ugrave=722;e.Delta=612;e.thorn=500;e.twosuperior=300;e.Odieresis=722;e.mu=576;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=667;e.dcroat=500;e.threequarters=750;e.Scedilla=556;e.lcaron=382;e.Kcommaaccent=667;e.Lacute=611;e.trademark=1e3;e.edotaccent=444;e.Igrave=389;e.Imacron=389;e.Lcaron=611;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=556;e.Scommaaccent=556;e.Ohungarumlaut=722;e.degree=400;e.ograve=500;e.Ccaron=667;e.ugrave=556;e.radical=549;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=722;e.otilde=500;e.Rcommaaccent=667;e.Lcommaaccent=611;e.Atilde=667;e.Aogonek=667;e.Aring=667;e.Otilde=722;e.zdotaccent=389;e.Ecaron=667;e.Iogonek=389;e.kcommaaccent=500;e.minus=606;e.Icircumflex=389;e.ncaron=556;e.tcommaaccent=278;e.logicalnot=606;e.odieresis=500;e.udieresis=556;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=389;e.ncommaaccent=556;e.onesuperior=300;e.imacron=278;e.Euro=500}));e["Times-Italic"]=getLookupTableFactory((function(e){e.space=250;e.exclam=333;e.quotedbl=420;e.numbersign=500;e.dollar=500;e.percent=833;e.ampersand=778;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=675;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=333;e.semicolon=333;e.less=675;e.equal=675;e.greater=675;e.question=500;e.at=920;e.A=611;e.B=611;e.C=667;e.D=722;e.E=611;e.F=611;e.G=722;e.H=722;e.I=333;e.J=444;e.K=667;e.L=556;e.M=833;e.N=667;e.O=722;e.P=611;e.Q=722;e.R=611;e.S=500;e.T=556;e.U=722;e.V=611;e.W=833;e.X=611;e.Y=556;e.Z=556;e.bracketleft=389;e.backslash=278;e.bracketright=389;e.asciicircum=422;e.underscore=500;e.quoteleft=333;e.a=500;e.b=500;e.c=444;e.d=500;e.e=444;e.f=278;e.g=500;e.h=500;e.i=278;e.j=278;e.k=444;e.l=278;e.m=722;e.n=500;e.o=500;e.p=500;e.q=500;e.r=389;e.s=389;e.t=278;e.u=500;e.v=444;e.w=667;e.x=444;e.y=444;e.z=389;e.braceleft=400;e.bar=275;e.braceright=400;e.asciitilde=541;e.exclamdown=389;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=214;e.quotedblleft=556;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=500;e.fl=500;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=523;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=556;e.quotedblright=556;e.guillemotright=500;e.ellipsis=889;e.perthousand=1e3;e.questiondown=500;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=889;e.AE=889;e.ordfeminine=276;e.Lslash=556;e.Oslash=722;e.OE=944;e.ordmasculine=310;e.ae=667;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=667;e.germandbls=500;e.Idieresis=333;e.eacute=444;e.abreve=500;e.uhungarumlaut=500;e.ecaron=444;e.Ydieresis=556;e.divide=675;e.Yacute=556;e.Acircumflex=611;e.aacute=500;e.Ucircumflex=722;e.yacute=444;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=500;e.Uacute=722;e.uogonek=500;e.Edieresis=611;e.Dcroat=722;e.commaaccent=250;e.copyright=760;e.Emacron=611;e.ccaron=444;e.aring=500;e.Ncommaaccent=667;e.lacute=278;e.agrave=500;e.Tcommaaccent=556;e.Cacute=667;e.atilde=500;e.Edotaccent=611;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=471;e.Rcaron=611;e.Gcommaaccent=722;e.ucircumflex=500;e.acircumflex=500;e.Amacron=611;e.rcaron=389;e.ccedilla=444;e.Zdotaccent=556;e.Thorn=611;e.Omacron=722;e.Racute=611;e.Sacute=500;e.dcaron=544;e.Umacron=722;e.uring=500;e.threesuperior=300;e.Ograve=722;e.Agrave=611;e.Abreve=611;e.multiply=675;e.uacute=500;e.Tcaron=556;e.partialdiff=476;e.ydieresis=444;e.Nacute=667;e.icircumflex=278;e.Ecircumflex=611;e.adieresis=500;e.edieresis=444;e.cacute=444;e.nacute=500;e.umacron=500;e.Ncaron=667;e.Iacute=333;e.plusminus=675;e.brokenbar=275;e.registered=760;e.Gbreve=722;e.Idotaccent=333;e.summation=600;e.Egrave=611;e.racute=389;e.omacron=500;e.Zacute=556;e.Zcaron=556;e.greaterequal=549;e.Eth=722;e.Ccedilla=667;e.lcommaaccent=278;e.tcaron=300;e.eogonek=444;e.Uogonek=722;e.Aacute=611;e.Adieresis=611;e.egrave=444;e.zacute=389;e.iogonek=278;e.Oacute=722;e.oacute=500;e.amacron=500;e.sacute=389;e.idieresis=278;e.Ocircumflex=722;e.Ugrave=722;e.Delta=612;e.thorn=500;e.twosuperior=300;e.Odieresis=722;e.mu=500;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=611;e.dcroat=500;e.threequarters=750;e.Scedilla=500;e.lcaron=300;e.Kcommaaccent=667;e.Lacute=556;e.trademark=980;e.edotaccent=444;e.Igrave=333;e.Imacron=333;e.Lcaron=611;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=500;e.Uhungarumlaut=722;e.Eacute=611;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=500;e.Scommaaccent=500;e.Ohungarumlaut=722;e.degree=400;e.ograve=500;e.Ccaron=667;e.ugrave=500;e.radical=453;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=667;e.otilde=500;e.Rcommaaccent=611;e.Lcommaaccent=556;e.Atilde=611;e.Aogonek=611;e.Aring=611;e.Otilde=722;e.zdotaccent=389;e.Ecaron=611;e.Iogonek=333;e.kcommaaccent=444;e.minus=675;e.Icircumflex=333;e.ncaron=500;e.tcommaaccent=278;e.logicalnot=675;e.odieresis=500;e.udieresis=500;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=389;e.ncommaaccent=500;e.onesuperior=300;e.imacron=278;e.Euro=500}));e.ZapfDingbats=getLookupTableFactory((function(e){e.space=278;e.a1=974;e.a2=961;e.a202=974;e.a3=980;e.a4=719;e.a5=789;e.a119=790;e.a118=791;e.a117=690;e.a11=960;e.a12=939;e.a13=549;e.a14=855;e.a15=911;e.a16=933;e.a105=911;e.a17=945;e.a18=974;e.a19=755;e.a20=846;e.a21=762;e.a22=761;e.a23=571;e.a24=677;e.a25=763;e.a26=760;e.a27=759;e.a28=754;e.a6=494;e.a7=552;e.a8=537;e.a9=577;e.a10=692;e.a29=786;e.a30=788;e.a31=788;e.a32=790;e.a33=793;e.a34=794;e.a35=816;e.a36=823;e.a37=789;e.a38=841;e.a39=823;e.a40=833;e.a41=816;e.a42=831;e.a43=923;e.a44=744;e.a45=723;e.a46=749;e.a47=790;e.a48=792;e.a49=695;e.a50=776;e.a51=768;e.a52=792;e.a53=759;e.a54=707;e.a55=708;e.a56=682;e.a57=701;e.a58=826;e.a59=815;e.a60=789;e.a61=789;e.a62=707;e.a63=687;e.a64=696;e.a65=689;e.a66=786;e.a67=787;e.a68=713;e.a69=791;e.a70=785;e.a71=791;e.a72=873;e.a73=761;e.a74=762;e.a203=762;e.a75=759;e.a204=759;e.a76=892;e.a77=892;e.a78=788;e.a79=784;e.a81=438;e.a82=138;e.a83=277;e.a84=415;e.a97=392;e.a98=392;e.a99=668;e.a100=668;e.a89=390;e.a90=390;e.a93=317;e.a94=317;e.a91=276;e.a92=276;e.a205=509;e.a85=509;e.a206=410;e.a86=410;e.a87=234;e.a88=234;e.a95=334;e.a96=334;e.a101=732;e.a102=544;e.a103=544;e.a104=910;e.a106=667;e.a107=760;e.a108=760;e.a112=776;e.a111=595;e.a110=694;e.a109=626;e.a120=788;e.a121=788;e.a122=788;e.a123=788;e.a124=788;e.a125=788;e.a126=788;e.a127=788;e.a128=788;e.a129=788;e.a130=788;e.a131=788;e.a132=788;e.a133=788;e.a134=788;e.a135=788;e.a136=788;e.a137=788;e.a138=788;e.a139=788;e.a140=788;e.a141=788;e.a142=788;e.a143=788;e.a144=788;e.a145=788;e.a146=788;e.a147=788;e.a148=788;e.a149=788;e.a150=788;e.a151=788;e.a152=788;e.a153=788;e.a154=788;e.a155=788;e.a156=788;e.a157=788;e.a158=788;e.a159=788;e.a160=894;e.a161=838;e.a163=1016;e.a164=458;e.a196=748;e.a165=924;e.a192=748;e.a166=918;e.a167=927;e.a168=928;e.a169=928;e.a170=834;e.a171=873;e.a172=828;e.a173=924;e.a162=924;e.a174=917;e.a175=930;e.a176=931;e.a177=463;e.a178=883;e.a179=836;e.a193=836;e.a180=867;e.a199=867;e.a181=696;e.a200=696;e.a182=874;e.a201=874;e.a183=760;e.a184=946;e.a197=771;e.a185=865;e.a194=771;e.a198=888;e.a186=967;e.a195=888;e.a187=831;e.a188=873;e.a189=927;e.a190=970;e.a191=918}))})),ea=getLookupTableFactory((function(e){e.Courier={ascent:629,descent:-157,capHeight:562,xHeight:-426};e["Courier-Bold"]={ascent:629,descent:-157,capHeight:562,xHeight:439};e["Courier-Oblique"]={ascent:629,descent:-157,capHeight:562,xHeight:426};e["Courier-BoldOblique"]={ascent:629,descent:-157,capHeight:562,xHeight:426};e.Helvetica={ascent:718,descent:-207,capHeight:718,xHeight:523};e["Helvetica-Bold"]={ascent:718,descent:-207,capHeight:718,xHeight:532};e["Helvetica-Oblique"]={ascent:718,descent:-207,capHeight:718,xHeight:523};e["Helvetica-BoldOblique"]={ascent:718,descent:-207,capHeight:718,xHeight:532};e["Times-Roman"]={ascent:683,descent:-217,capHeight:662,xHeight:450};e["Times-Bold"]={ascent:683,descent:-217,capHeight:676,xHeight:461};e["Times-Italic"]={ascent:683,descent:-217,capHeight:653,xHeight:441};e["Times-BoldItalic"]={ascent:683,descent:-217,capHeight:669,xHeight:462};e.Symbol={ascent:Math.NaN,descent:Math.NaN,capHeight:Math.NaN,xHeight:Math.NaN};e.ZapfDingbats={ascent:Math.NaN,descent:Math.NaN,capHeight:Math.NaN,xHeight:Math.NaN}}));class GlyfTable{constructor({glyfTable:e,isGlyphLocationsLong:t,locaTable:i,numGlyphs:a}){this.glyphs=[];const s=new DataView(i.buffer,i.byteOffset,i.byteLength),r=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t?4:2;let g=t?s.getUint32(0):2*s.getUint16(0),o=0;for(let e=0;e<a;e++){o+=n;const e=t?s.getUint32(o):2*s.getUint16(o);if(e===g){this.glyphs.push(new Glyph({}));continue}const i=Glyph.parse(g,r);this.glyphs.push(i);g=e}}getSize(){return this.glyphs.reduce(((e,t)=>e+(t.getSize()+3&-4)),0)}write(){const e=this.getSize(),t=new DataView(new ArrayBuffer(e)),i=e>131070,a=i?4:2,s=new DataView(new ArrayBuffer((this.glyphs.length+1)*a));i?s.setUint32(0,0):s.setUint16(0,0);let r=0,n=0;for(const e of this.glyphs){r+=e.write(r,t);r=r+3&-4;n+=a;i?s.setUint32(n,r):s.setUint16(n,r>>1)}return{isLocationLong:i,loca:new Uint8Array(s.buffer),glyf:new Uint8Array(t.buffer)}}scale(e){for(let t=0,i=this.glyphs.length;t<i;t++)this.glyphs[t].scale(e[t])}}class Glyph{constructor({header:e=null,simple:t=null,composites:i=null}){this.header=e;this.simple=t;this.composites=i}static parse(e,t){const[i,a]=GlyphHeader.parse(e,t);e+=i;if(a.numberOfContours<0){const i=[];for(;;){const[a,s]=CompositeGlyph.parse(e,t);e+=a;i.push(s);if(!(32&s.flags))break}return new Glyph({header:a,composites:i})}const s=SimpleGlyph.parse(e,t,a.numberOfContours);return new Glyph({header:a,simple:s})}getSize(){if(!this.header)return 0;const e=this.simple?this.simple.getSize():this.composites.reduce(((e,t)=>e+t.getSize()),0);return this.header.getSize()+e}write(e,t){if(!this.header)return 0;const i=e;e+=this.header.write(e,t);if(this.simple)e+=this.simple.write(e,t);else for(const i of this.composites)e+=i.write(e,t);return e-i}scale(e){if(!this.header)return;const t=(this.header.xMin+this.header.xMax)/2;this.header.scale(t,e);if(this.simple)this.simple.scale(t,e);else for(const i of this.composites)i.scale(t,e)}}class GlyphHeader{constructor({numberOfContours:e,xMin:t,yMin:i,xMax:a,yMax:s}){this.numberOfContours=e;this.xMin=t;this.yMin=i;this.xMax=a;this.yMax=s}static parse(e,t){return[10,new GlyphHeader({numberOfContours:t.getInt16(e),xMin:t.getInt16(e+2),yMin:t.getInt16(e+4),xMax:t.getInt16(e+6),yMax:t.getInt16(e+8)})]}getSize(){return 10}write(e,t){t.setInt16(e,this.numberOfContours);t.setInt16(e+2,this.xMin);t.setInt16(e+4,this.yMin);t.setInt16(e+6,this.xMax);t.setInt16(e+8,this.yMax);return 10}scale(e,t){this.xMin=Math.round(e+(this.xMin-e)*t);this.xMax=Math.round(e+(this.xMax-e)*t)}}class Contour{constructor({flags:e,xCoordinates:t,yCoordinates:i}){this.xCoordinates=t;this.yCoordinates=i;this.flags=e}}class SimpleGlyph{constructor({contours:e,instructions:t}){this.contours=e;this.instructions=t}static parse(e,t,i){const a=[];for(let s=0;s<i;s++){const i=t.getUint16(e);e+=2;a.push(i)}const s=a[i-1]+1,r=t.getUint16(e);e+=2;const n=new Uint8Array(t).slice(e,e+r);e+=r;const g=[];for(let i=0;i<s;e++,i++){let a=t.getUint8(e);g.push(a);if(8&a){const s=t.getUint8(++e);a^=8;for(let e=0;e<s;e++)g.push(a);i+=s}}const o=[];let c=[],C=[],h=[];const l=[];let Q=0,E=0;for(let i=0;i<s;i++){const s=g[i];if(2&s){const i=t.getUint8(e++);E+=16&s?i:-i;c.push(E)}else if(16&s)c.push(E);else{E+=t.getInt16(e);e+=2;c.push(E)}if(a[Q]===i){Q++;o.push(c);c=[]}}E=0;Q=0;for(let i=0;i<s;i++){const s=g[i];if(4&s){const i=t.getUint8(e++);E+=32&s?i:-i;C.push(E)}else if(32&s)C.push(E);else{E+=t.getInt16(e);e+=2;C.push(E)}h.push(1&s|64&s);if(a[Q]===i){c=o[Q];Q++;l.push(new Contour({flags:h,xCoordinates:c,yCoordinates:C}));C=[];h=[]}}return new SimpleGlyph({contours:l,instructions:n})}getSize(){let e=2*this.contours.length+2+this.instructions.length,t=0,i=0;for(const a of this.contours){e+=a.flags.length;for(let s=0,r=a.xCoordinates.length;s<r;s++){const r=a.xCoordinates[s],n=a.yCoordinates[s];let g=Math.abs(r-t);g>255?e+=2:g>0&&(e+=1);t=r;g=Math.abs(n-i);g>255?e+=2:g>0&&(e+=1);i=n}}return e}write(e,t){const i=e,a=[],s=[],r=[];let n=0,g=0;for(const i of this.contours){for(let e=0,t=i.xCoordinates.length;e<t;e++){let t=i.flags[e];const o=i.xCoordinates[e];let c=o-n;if(0===c){t|=16;a.push(0)}else{const e=Math.abs(c);if(e<=255){t|=c>=0?18:2;a.push(e)}else a.push(c)}n=o;const C=i.yCoordinates[e];c=C-g;if(0===c){t|=32;s.push(0)}else{const e=Math.abs(c);if(e<=255){t|=c>=0?36:4;s.push(e)}else s.push(c)}g=C;r.push(t)}t.setUint16(e,a.length-1);e+=2}t.setUint16(e,this.instructions.length);e+=2;if(this.instructions.length){new Uint8Array(t.buffer,0,t.buffer.byteLength).set(this.instructions,e);e+=this.instructions.length}for(const i of r)t.setUint8(e++,i);for(let i=0,s=a.length;i<s;i++){const s=a[i],n=r[i];if(2&n)t.setUint8(e++,s);else if(!(16&n)){t.setInt16(e,s);e+=2}}for(let i=0,a=s.length;i<a;i++){const a=s[i],n=r[i];if(4&n)t.setUint8(e++,a);else if(!(32&n)){t.setInt16(e,a);e+=2}}return e-i}scale(e,t){for(const i of this.contours)if(0!==i.xCoordinates.length)for(let a=0,s=i.xCoordinates.length;a<s;a++)i.xCoordinates[a]=Math.round(e+(i.xCoordinates[a]-e)*t)}}class CompositeGlyph{constructor({flags:e,glyphIndex:t,argument1:i,argument2:a,transf:s,instructions:r}){this.flags=e;this.glyphIndex=t;this.argument1=i;this.argument2=a;this.transf=s;this.instructions=r}static parse(e,t){const i=e,a=[];let s=t.getUint16(e);const r=t.getUint16(e+2);e+=4;let n,g;if(1&s){if(2&s){n=t.getInt16(e);g=t.getInt16(e+2)}else{n=t.getUint16(e);g=t.getUint16(e+2)}e+=4;s^=1}else{if(2&s){n=t.getInt8(e);g=t.getInt8(e+1)}else{n=t.getUint8(e);g=t.getUint8(e+1)}e+=2}if(8&s){a.push(t.getUint16(e));e+=2}else if(64&s){a.push(t.getUint16(e),t.getUint16(e+2));e+=4}else if(128&s){a.push(t.getUint16(e),t.getUint16(e+2),t.getUint16(e+4),t.getUint16(e+6));e+=8}let o=null;if(256&s){const i=t.getUint16(e);e+=2;o=new Uint8Array(t).slice(e,e+i);e+=i}return[e-i,new CompositeGlyph({flags:s,glyphIndex:r,argument1:n,argument2:g,transf:a,instructions:o})]}getSize(){let e=4+2*this.transf.length;256&this.flags&&(e+=2+this.instructions.length);e+=2;2&this.flags?this.argument1>=-128&&this.argument1<=127&&this.argument2>=-128&&this.argument2<=127||(e+=2):this.argument1>=0&&this.argument1<=255&&this.argument2>=0&&this.argument2<=255||(e+=2);return e}write(e,t){const i=e;2&this.flags?this.argument1>=-128&&this.argument1<=127&&this.argument2>=-128&&this.argument2<=127||(this.flags|=1):this.argument1>=0&&this.argument1<=255&&this.argument2>=0&&this.argument2<=255||(this.flags|=1);t.setUint16(e,this.flags);t.setUint16(e+2,this.glyphIndex);e+=4;if(1&this.flags){if(2&this.flags){t.setInt16(e,this.argument1);t.setInt16(e+2,this.argument2)}else{t.setUint16(e,this.argument1);t.setUint16(e+2,this.argument2)}e+=4}else{t.setUint8(e,this.argument1);t.setUint8(e+1,this.argument2);e+=2}if(256&this.flags){t.setUint16(e,this.instructions.length);e+=2;if(this.instructions.length){new Uint8Array(t.buffer,0,t.buffer.byteLength).set(this.instructions,e);e+=this.instructions.length}}return e-i}scale(e,t){}}function writeInt16(e,t,i){e[t]=i>>8&255;e[t+1]=255&i}function writeInt32(e,t,i){e[t]=i>>24&255;e[t+1]=i>>16&255;e[t+2]=i>>8&255;e[t+3]=255&i}function writeData(e,t,i){if(i instanceof Uint8Array)e.set(i,t);else if("string"==typeof i)for(let a=0,s=i.length;a<s;a++)e[t++]=255&i.charCodeAt(a);else for(const a of i)e[t++]=255&a}class OpenTypeFileBuilder{constructor(e){this.sfnt=e;this.tables=Object.create(null)}static getSearchParams(e,t){let i=1,a=0;for(;(i^e)>i;){i<<=1;a++}const s=i*t;return{range:s,entry:a,rangeShift:t*e-s}}toArray(){let e=this.sfnt;const t=this.tables,i=Object.keys(t);i.sort();const a=i.length;let s,r,n,g,o,c=12+16*a;const C=[c];for(s=0;s<a;s++){g=t[i[s]];c+=(g.length+3&-4)>>>0;C.push(c)}const h=new Uint8Array(c);for(s=0;s<a;s++){g=t[i[s]];writeData(h,C[s],g)}"true"===e&&(e=string32(65536));h[0]=255&e.charCodeAt(0);h[1]=255&e.charCodeAt(1);h[2]=255&e.charCodeAt(2);h[3]=255&e.charCodeAt(3);writeInt16(h,4,a);const l=OpenTypeFileBuilder.getSearchParams(a,16);writeInt16(h,6,l.range);writeInt16(h,8,l.entry);writeInt16(h,10,l.rangeShift);c=12;for(s=0;s<a;s++){o=i[s];h[c]=255&o.charCodeAt(0);h[c+1]=255&o.charCodeAt(1);h[c+2]=255&o.charCodeAt(2);h[c+3]=255&o.charCodeAt(3);let e=0;for(r=C[s],n=C[s+1];r<n;r+=4){e=e+readUint32(h,r)>>>0}writeInt32(h,c+4,e);writeInt32(h,c+8,C[s]);writeInt32(h,c+12,t[o].length);c+=16}return h}addTable(e,t){if(e in this.tables)throw new Error("Table "+e+" already exists");this.tables[e]=t}}const ta=[4],ia=[5],aa=[6],sa=[7],ra=[8],na=[12,35],ga=[14],oa=[21],Ia=[22],ca=[30],Ca=[31];class Type1CharString{constructor(){this.width=0;this.lsb=0;this.flexing=!1;this.output=[];this.stack=[]}convert(e,t,i){const a=e.length;let s,r,n,g=!1;for(let o=0;o<a;o++){let a=e[o];if(a<32){12===a&&(a=(a<<8)+e[++o]);switch(a){case 1:case 3:case 9:case 3072:case 3073:case 3074:case 3105:this.stack=[];break;case 4:if(this.flexing){if(this.stack.length<1){g=!0;break}const e=this.stack.pop();this.stack.push(0,e);break}g=this.executeCommand(1,ta);break;case 5:g=this.executeCommand(2,ia);break;case 6:g=this.executeCommand(1,aa);break;case 7:g=this.executeCommand(1,sa);break;case 8:g=this.executeCommand(6,ra);break;case 10:if(this.stack.length<1){g=!0;break}n=this.stack.pop();if(!t[n]){g=!0;break}g=this.convert(t[n],t,i);break;case 11:return g;case 13:if(this.stack.length<2){g=!0;break}s=this.stack.pop();r=this.stack.pop();this.lsb=r;this.width=s;this.stack.push(s,r);g=this.executeCommand(2,Ia);break;case 14:this.output.push(ga[0]);break;case 21:if(this.flexing)break;g=this.executeCommand(2,oa);break;case 22:if(this.flexing){this.stack.push(0);break}g=this.executeCommand(1,Ia);break;case 30:g=this.executeCommand(4,ca);break;case 31:g=this.executeCommand(4,Ca);break;case 3078:if(i){const e=this.stack.at(-5);this.seac=this.stack.splice(-4,4);this.seac[0]+=this.lsb-e;g=this.executeCommand(0,ga)}else g=this.executeCommand(4,ga);break;case 3079:if(this.stack.length<4){g=!0;break}this.stack.pop();s=this.stack.pop();const e=this.stack.pop();r=this.stack.pop();this.lsb=r;this.width=s;this.stack.push(s,r,e);g=this.executeCommand(3,oa);break;case 3084:if(this.stack.length<2){g=!0;break}const o=this.stack.pop(),c=this.stack.pop();this.stack.push(c/o);break;case 3088:if(this.stack.length<2){g=!0;break}n=this.stack.pop();const C=this.stack.pop();if(0===n&&3===C){const e=this.stack.splice(-17,17);this.stack.push(e[2]+e[0],e[3]+e[1],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14]);g=this.executeCommand(13,na,!0);this.flexing=!1;this.stack.push(e[15],e[16])}else 1===n&&0===C&&(this.flexing=!0);break;case 3089:break;default:warn('Unknown type 1 charstring command of "'+a+'"')}if(g)break}else{a<=246?a-=139:a=a<=250?256*(a-247)+e[++o]+108:a<=254?-256*(a-251)-e[++o]-108:(255&e[++o])<<24|(255&e[++o])<<16|(255&e[++o])<<8|(255&e[++o])<<0;this.stack.push(a)}}return g}executeCommand(e,t,i){const a=this.stack.length;if(e>a)return!0;const s=a-e;for(let e=s;e<a;e++){let t=this.stack[e];if(Number.isInteger(t))this.output.push(28,t>>8&255,255&t);else{t=65536*t|0;this.output.push(255,t>>24&255,t>>16&255,t>>8&255,255&t)}}this.output.push(...t);i?this.stack.splice(s,e):this.stack.length=0;return!1}}function isHexDigit(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function decrypt(e,t,i){if(i>=e.length)return new Uint8Array(0);let a,s,r=0|t;for(a=0;a<i;a++)r=52845*(e[a]+r)+22719&65535;const n=e.length-i,g=new Uint8Array(n);for(a=i,s=0;s<n;a++,s++){const t=e[a];g[s]=t^r>>8;r=52845*(t+r)+22719&65535}return g}function isSpecial(e){return 47===e||91===e||93===e||123===e||125===e||40===e||41===e}class Type1Parser{constructor(e,t,i){if(t){const t=e.getBytes(),i=!((isHexDigit(t[0])||isWhiteSpace(t[0]))&&isHexDigit(t[1])&&isHexDigit(t[2])&&isHexDigit(t[3])&&isHexDigit(t[4])&&isHexDigit(t[5])&&isHexDigit(t[6])&&isHexDigit(t[7]));e=new Stream(i?decrypt(t,55665,4):function decryptAscii(e,t,i){let a=0|t;const s=e.length,r=new Uint8Array(s>>>1);let n,g;for(n=0,g=0;n<s;n++){const t=e[n];if(!isHexDigit(t))continue;n++;let i;for(;n<s&&!isHexDigit(i=e[n]);)n++;if(n<s){const e=parseInt(String.fromCharCode(t,i),16);r[g++]=e^a>>8;a=52845*(e+a)+22719&65535}}return r.slice(i,g)}(t,55665,4))}this.seacAnalysisEnabled=!!i;this.stream=e;this.nextChar()}readNumberArray(){this.getToken();const e=[];for(;;){const t=this.getToken();if(null===t||"]"===t||"}"===t)break;e.push(parseFloat(t||0))}return e}readNumber(){const e=this.getToken();return parseFloat(e||0)}readInt(){const e=this.getToken();return 0|parseInt(e||0,10)}readBoolean(){return"true"===this.getToken()?1:0}nextChar(){return this.currentChar=this.stream.getByte()}prevChar(){this.stream.skip(-2);return this.currentChar=this.stream.getByte()}getToken(){let e=!1,t=this.currentChar;for(;;){if(-1===t)return null;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(!isWhiteSpace(t))break;t=this.nextChar()}if(isSpecial(t)){this.nextChar();return String.fromCharCode(t)}let i="";do{i+=String.fromCharCode(t);t=this.nextChar()}while(t>=0&&!isWhiteSpace(t)&&!isSpecial(t));return i}readCharStrings(e,t){return-1===t?e:decrypt(e,4330,t)}extractFontProgram(e){const t=this.stream,i=[],a=[],s=Object.create(null);s.lenIV=4;const r={subrs:[],charstrings:[],properties:{privateData:s}};let n,g,o,c;for(;null!==(n=this.getToken());)if("/"===n){n=this.getToken();switch(n){case"CharStrings":this.getToken();this.getToken();this.getToken();this.getToken();for(;;){n=this.getToken();if(null===n||"end"===n)break;if("/"!==n)continue;const e=this.getToken();g=this.readInt();this.getToken();o=g>0?t.getBytes(g):new Uint8Array(0);c=r.properties.privateData.lenIV;const i=this.readCharStrings(o,c);this.nextChar();n=this.getToken();"noaccess"===n?this.getToken():"/"===n&&this.prevChar();a.push({glyph:e,encoded:i})}break;case"Subrs":this.readInt();this.getToken();for(;"dup"===this.getToken();){const e=this.readInt();g=this.readInt();this.getToken();o=g>0?t.getBytes(g):new Uint8Array(0);c=r.properties.privateData.lenIV;const a=this.readCharStrings(o,c);this.nextChar();n=this.getToken();"noaccess"===n&&this.getToken();i[e]=a}break;case"BlueValues":case"OtherBlues":case"FamilyBlues":case"FamilyOtherBlues":const e=this.readNumberArray();e.length>0&&e.length,0;break;case"StemSnapH":case"StemSnapV":r.properties.privateData[n]=this.readNumberArray();break;case"StdHW":case"StdVW":r.properties.privateData[n]=this.readNumberArray()[0];break;case"BlueShift":case"lenIV":case"BlueFuzz":case"BlueScale":case"LanguageGroup":r.properties.privateData[n]=this.readNumber();break;case"ExpansionFactor":r.properties.privateData[n]=this.readNumber()||.06;break;case"ForceBold":r.properties.privateData[n]=this.readBoolean()}}for(const{encoded:t,glyph:s}of a){const a=new Type1CharString,n=a.convert(t,i,this.seacAnalysisEnabled);let g=a.output;n&&(g=[14]);const o={glyphName:s,charstring:g,width:a.width,lsb:a.lsb,seac:a.seac};".notdef"===s?r.charstrings.unshift(o):r.charstrings.push(o);if(e.builtInEncoding){const t=e.builtInEncoding.indexOf(s);t>-1&&void 0===e.widths[t]&&t>=e.firstChar&&t<=e.lastChar&&(e.widths[t]=a.width)}}return r}extractFontHeader(e){let t;for(;null!==(t=this.getToken());)if("/"===t){t=this.getToken();switch(t){case"FontMatrix":const i=this.readNumberArray();e.fontMatrix=i;break;case"Encoding":const a=this.getToken();let s;if(/^\d+$/.test(a)){s=[];const e=0|parseInt(a,10);this.getToken();for(let i=0;i<e;i++){t=this.getToken();for(;"dup"!==t&&"def"!==t;){t=this.getToken();if(null===t)return}if("def"===t)break;const e=this.readInt();this.getToken();const i=this.getToken();s[e]=i;this.getToken()}}else s=getEncoding(a);e.builtInEncoding=s;break;case"FontBBox":const r=this.readNumberArray();e.ascent=Math.max(r[3],r[1]);e.descent=Math.min(r[1],r[3]);e.ascentScaled=!0}}}}function findBlock(e,t,i){const a=e.length,s=t.length,r=a-s;let n=i,g=!1;for(;n<r;){let i=0;for(;i<s&&e[n+i]===t[i];)i++;if(i>=s){n+=i;for(;n<a&&isWhiteSpace(e[n]);)n++;g=!0;break}n++}return{found:g,length:n}}class Type1Font{constructor(e,t,i){let a=i.length1,s=i.length2,r=t.peekBytes(6);const n=128===r[0]&&1===r[1];if(n){t.skip(6);a=r[5]<<24|r[4]<<16|r[3]<<8|r[2]}const g=function getHeaderBlock(e,t){const i=[101,101,120,101,99],a=e.pos;let s,r,n,g;try{s=e.getBytes(t);r=s.length}catch{}if(r===t){n=findBlock(s,i,t-2*i.length);if(n.found&&n.length===t)return{stream:new Stream(s),length:t}}warn('Invalid "Length1" property in Type1 font -- trying to recover.');e.pos=a;for(;;){n=findBlock(e.peekBytes(2048),i,0);if(0===n.length)break;e.pos+=n.length;if(n.found){g=e.pos-a;break}}e.pos=a;if(g)return{stream:new Stream(e.getBytes(g)),length:g};warn('Unable to recover "Length1" property in Type1 font -- using as is.');return{stream:new Stream(e.getBytes(t)),length:t}}(t,a);new Type1Parser(g.stream,!1,Yi).extractFontHeader(i);if(n){r=t.getBytes(6);s=r[5]<<24|r[4]<<16|r[3]<<8|r[2]}const o=function getEexecBlock(e,t){const i=e.getBytes();if(0===i.length)throw new FormatError("getEexecBlock - no font program found.");return{stream:new Stream(i),length:i.length}}(t),c=new Type1Parser(o.stream,!0,Yi).extractFontProgram(i);for(const e in c.properties)i[e]=c.properties[e];const C=c.charstrings,h=this.getType2Charstrings(C),l=this.getType2Subrs(c.subrs);this.charstrings=C;this.data=this.wrap(e,h,this.charstrings,l,i);this.seacs=this.getSeacs(c.charstrings)}get numGlyphs(){return this.charstrings.length+1}getCharset(){const e=[".notdef"];for(const{glyphName:t}of this.charstrings)e.push(t);return e}getGlyphMapping(e){const t=this.charstrings;if(e.composite){const i=Object.create(null);for(let a=0,s=t.length;a<s;a++){i[e.cMap.charCodeOf(a)]=a+1}return i}const i=[".notdef"];let a,s;for(s=0;s<t.length;s++)i.push(t[s].glyphName);const r=e.builtInEncoding;if(r){a=Object.create(null);for(const e in r){s=i.indexOf(r[e]);s>=0&&(a[e]=s)}}return type1FontGlyphMapping(e,a,i)}hasGlyphId(e){if(e<0||e>=this.numGlyphs)return!1;if(0===e)return!0;return this.charstrings[e-1].charstring.length>0}getSeacs(e){const t=[];for(let i=0,a=e.length;i<a;i++){const a=e[i];a.seac&&(t[i+1]=a.seac)}return t}getType2Charstrings(e){const t=[];for(const i of e)t.push(i.charstring);return t}getType2Subrs(e){let t=0;const i=e.length;t=i<1133?107:i<33769?1131:32768;const a=[];let s;for(s=0;s<t;s++)a.push([11]);for(s=0;s<i;s++)a.push(e[s]);return a}wrap(e,t,i,a,s){const r=new CFF;r.header=new CFFHeader(1,0,4,4);r.names=[e];const n=new CFFTopDict;n.setByName("version",391);n.setByName("Notice",392);n.setByName("FullName",393);n.setByName("FamilyName",394);n.setByName("Weight",395);n.setByName("Encoding",null);n.setByName("FontMatrix",s.fontMatrix);n.setByName("FontBBox",s.bbox);n.setByName("charset",null);n.setByName("CharStrings",null);n.setByName("Private",null);r.topDict=n;const g=new CFFStrings;g.add("Version 0.11");g.add("See original notice");g.add(e);g.add(e);g.add("Medium");r.strings=g;r.globalSubrIndex=new CFFIndex;const o=t.length,c=[".notdef"];let C,h;for(C=0;C<o;C++){const e=i[C].glyphName;-1===wi.indexOf(e)&&g.add(e);c.push(e)}r.charset=new CFFCharset(!1,0,c);const l=new CFFIndex;l.add([139,14]);for(C=0;C<o;C++)l.add(t[C]);r.charStrings=l;const Q=new CFFPrivateDict;Q.setByName("Subrs",null);const E=["BlueValues","OtherBlues","FamilyBlues","FamilyOtherBlues","StemSnapH","StemSnapV","BlueShift","BlueFuzz","BlueScale","LanguageGroup","ExpansionFactor","ForceBold","StdHW","StdVW"];for(C=0,h=E.length;C<h;C++){const e=E[C];if(!(e in s.privateData))continue;const t=s.privateData[e];if(Array.isArray(t))for(let e=t.length-1;e>0;e--)t[e]-=t[e-1];Q.setByName(e,t)}r.topDict.privateDict=Q;const u=new CFFIndex;for(C=0,h=a.length;C<h;C++)u.add(a[C]);Q.subrsIndex=u;return new CFFCompiler(r).compile()}}const ha=[[57344,63743],[1048576,1114109]],Ba=1e3,la=["ascent","bbox","black","bold","charProcOperatorList","composite","cssFontInfo","data","defaultVMetrics","defaultWidth","descent","fallbackName","fontMatrix","isInvalidPDFjsFont","isType3Font","italic","loadedName","mimetype","missingFile","name","remeasure","subtype","systemFontInfo","type","vertical"],Qa=["cMap","defaultEncoding","differences","isMonospace","isSerifFont","isSymbolicFont","seacMap","toFontChar","toUnicode","vmetrics","widths"];function adjustWidths(e){if(!e.fontMatrix)return;if(e.fontMatrix[0]===a[0])return;const t=.001/e.fontMatrix[0],i=e.widths;for(const e in i)i[e]*=t;e.defaultWidth*=t}function amendFallbackToUnicode(e){if(!e.fallbackToUnicode)return;if(e.toUnicode instanceof IdentityToUnicodeMap)return;const t=[];for(const i in e.fallbackToUnicode)e.toUnicode.has(i)||(t[i]=e.fallbackToUnicode[i]);t.length>0&&e.toUnicode.amend(t)}class fonts_Glyph{constructor(e,t,i,a,s,r,n,g,o){this.originalCharCode=e;this.fontChar=t;this.unicode=i;this.accent=a;this.width=s;this.vmetric=r;this.operatorListId=n;this.isSpace=g;this.isInFont=o}get category(){return shadow(this,"category",function getCharUnicodeCategory(e){const t=Ji.get(e);if(t)return t;const i=e.match(Hi),a={isWhitespace:!!i?.[1],isZeroWidthDiacritic:!!i?.[2],isInvisibleFormatMark:!!i?.[3]};Ji.set(e,a);return a}(this.unicode),!0)}}function int16(e,t){return(e<<8)+t}function writeSignedInt16(e,t,i){e[t+1]=i;e[t]=i>>>8}function signedInt16(e,t){const i=(e<<8)+t;return 32768&i?i-65536:i}function string16(e){return String.fromCharCode(e>>8&255,255&e)}function safeString16(e){e>32767?e=32767:e<-32768&&(e=-32768);return String.fromCharCode(e>>8&255,255&e)}function isTrueTypeCollectionFile(e){return"ttcf"===bytesToString(e.peekBytes(4))}function getFontFileType(e,{type:t,subtype:i,composite:a}){let s,r;if(function isTrueTypeFile(e){const t=e.peekBytes(4);return 65536===readUint32(t,0)||"true"===bytesToString(t)}(e)||isTrueTypeCollectionFile(e))s=a?"CIDFontType2":"TrueType";else if(function isOpenTypeFile(e){return"OTTO"===bytesToString(e.peekBytes(4))}(e))s=a?"CIDFontType2":"OpenType";else if(function isType1File(e){const t=e.peekBytes(2);return 37===t[0]&&33===t[1]||128===t[0]&&1===t[1]}(e))s=a?"CIDFontType0":"MMType1"===t?"MMType1":"Type1";else if(function isCFFFile(e){const t=e.peekBytes(4);return t[0]>=1&&t[3]>=1&&t[3]<=4}(e))if(a){s="CIDFontType0";r="CIDFontType0C"}else{s="MMType1"===t?"MMType1":"Type1";r="Type1C"}else{warn("getFontFileType: Unable to detect correct font file Type/Subtype.");s=t;r=i}return[s,r]}function applyStandardFontGlyphMap(e,t){for(const i in t)e[+i]=t[i]}function buildToFontChar(e,t,i){const a=[];let s;for(let i=0,r=e.length;i<r;i++){s=getUnicodeForGlyph(e[i],t);-1!==s&&(a[i]=s)}for(const e in i){s=getUnicodeForGlyph(i[e],t);-1!==s&&(a[+e]=s)}return a}function isMacNameRecord(e){return 1===e.platform&&0===e.encoding&&0===e.language}function isWinNameRecord(e){return 3===e.platform&&1===e.encoding&&1033===e.language}function convertCidString(e,t,i=!1){switch(t.length){case 1:return t.charCodeAt(0);case 2:return t.charCodeAt(0)<<8|t.charCodeAt(1)}const a=`Unsupported CID string (charCode ${e}): "${t}".`;if(i)throw new FormatError(a);warn(a);return t}function adjustMapping(e,t,i,a){const s=Object.create(null),r=new Map,n=[],g=new Set;let o=0;let c=ha[o][0],C=ha[o][1];for(const l in e){let Q=e[l];if(!t(Q))continue;if(c>C){o++;if(o>=ha.length){warn("Ran out of space in font private use area.");break}c=ha[o][0];C=ha[o][1]}const E=c++;0===Q&&(Q=i);let u=a.get(l);"string"==typeof u&&(u=u.codePointAt(0));if(u&&!(h=u,ha[0][0]<=h&&h<=ha[0][1]||ha[1][0]<=h&&h<=ha[1][1])&&!g.has(Q)){r.set(u,Q);g.add(Q)}s[E]=Q;n[l]=E}var h;return{toFontChar:n,charCodeToGlyphId:s,toUnicodeExtraMap:r,nextAvailableFontCharCode:c}}function createCmapTable(e,t,i){const a=function getRanges(e,t,i){const a=[];for(const t in e)e[t]>=i||a.push({fontCharCode:0|t,glyphId:e[t]});if(t)for(const[e,s]of t)s>=i||a.push({fontCharCode:e,glyphId:s});0===a.length&&a.push({fontCharCode:0,glyphId:0});a.sort((function fontGetRangesSort(e,t){return e.fontCharCode-t.fontCharCode}));const s=[],r=a.length;for(let e=0;e<r;){const t=a[e].fontCharCode,i=[a[e].glyphId];++e;let n=t;for(;e<r&&n+1===a[e].fontCharCode;){i.push(a[e].glyphId);++n;++e;if(65535===n)break}s.push([t,n,i])}return s}(e,t,i),s=a.at(-1)[1]>65535?2:1;let r,n,g,o,c="\0\0"+string16(s)+"\0\0"+string32(4+8*s);for(r=a.length-1;r>=0&&!(a[r][0]<=65535);--r);const C=r+1;a[r][0]<65535&&65535===a[r][1]&&(a[r][1]=65534);const h=a[r][1]<65535?1:0,l=C+h,Q=OpenTypeFileBuilder.getSearchParams(l,2);let E,u,d,f,p="",m="",y="",w="",D="",b=0;for(r=0,n=C;r<n;r++){E=a[r];u=E[0];d=E[1];p+=string16(u);m+=string16(d);f=E[2];let e=!0;for(g=1,o=f.length;g<o;++g)if(f[g]!==f[g-1]+1){e=!1;break}if(e){y+=string16(f[0]-u&65535);w+=string16(0)}else{const e=2*(l-r)+2*b;b+=d-u+1;y+=string16(0);w+=string16(e);for(g=0,o=f.length;g<o;++g)D+=string16(f[g])}}if(h>0){m+="每每";p+="每每";y+="\0";w+="\0\0"}const F="\0\0"+string16(2*l)+string16(Q.range)+string16(Q.entry)+string16(Q.rangeShift)+m+"\0\0"+p+y+w+D;let S="",k="";if(s>1){c+="\0\0\n"+string32(4+8*s+4+F.length);S="";for(r=0,n=a.length;r<n;r++){E=a[r];u=E[0];f=E[2];let e=f[0];for(g=1,o=f.length;g<o;++g)if(f[g]!==f[g-1]+1){d=E[0]+g-1;S+=string32(u)+string32(d)+string32(e);u=d+1;e=f[g]}S+=string32(u)+string32(E[1])+string32(e)}k="\0\f\0\0"+string32(S.length+16)+"\0\0\0\0"+string32(S.length/12)}return c+"\0"+string16(F.length+4)+F+k+S}function createOS2Table(e,t,i){i||={unitsPerEm:0,yMax:0,yMin:0,ascent:0,descent:0};let a=0,s=0,r=0,n=0,g=null,o=0,c=-1;if(t){for(let e in t){e|=0;(g>e||!g)&&(g=e);o<e&&(o=e);c=getUnicodeRangeFor(e,c);if(c<32)a|=1<<c;else if(c<64)s|=1<<c-32;else if(c<96)r|=1<<c-64;else{if(!(c<123))throw new FormatError("Unicode ranges Bits > 123 are reserved for internal usage");n|=1<<c-96}}o>65535&&(o=65535)}else{g=0;o=255}const C=e.bbox||[0,0,0,0],h=i.unitsPerEm||(e.fontMatrix?1/Math.max(...e.fontMatrix.slice(0,4).map(Math.abs)):1e3),l=e.ascentScaled?1:h/Ba,Q=i.ascent||Math.round(l*(e.ascent||C[3]));let E=i.descent||Math.round(l*(e.descent||C[1]));E>0&&e.descent>0&&C[1]<0&&(E=-E);const u=i.yMax||Q,d=-i.yMin||-E;return"\0$么\0\0\0聤禄\0\0\0聦聤禄\0\0脽\x001\0\0\0\0"+String.fromCharCode(e.fixedPitch?9:0)+"\0\0\0\0\0\0"+string32(a)+string32(s)+string32(r)+string32(n)+"*21*"+string16(e.italicAngle?1:0)+string16(g||e.firstChar)+string16(o||e.lastChar)+string16(Q)+string16(E)+"\0d"+string16(u)+string16(d)+"\0\0\0\0\0\0\0\0"+string16(e.xHeight)+string16(e.capHeight)+string16(0)+string16(g||e.firstChar)+"\0"}function createPostTable(e){return"\0\0\0"+string32(Math.floor(65536*e.italicAngle))+"\0\0\0\0"+string32(e.fixedPitch?1:0)+"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}function createPostscriptName(e){return e.replaceAll(/[^\x21-\x7E]|[[\](){}<>/%]/g,"").slice(0,63)}function createNameTable(e,t){t||(t=[[],[]]);const i=[t[0][0]||"Original licence",t[0][1]||e,t[0][2]||"Unknown",t[0][3]||"uniqueID",t[0][4]||e,t[0][5]||"Version 0.11",t[0][6]||createPostscriptName(e),t[0][7]||"Unknown",t[0][8]||"Unknown",t[0][9]||"Unknown"],a=[];let s,r,n,g,o;for(s=0,r=i.length;s<r;s++){o=t[1][s]||i[s];const e=[];for(n=0,g=o.length;n<g;n++)e.push(string16(o.charCodeAt(n)));a.push(e.join(""))}const c=[i,a],C=["\0","\0"],h=["\0\0","\0"],l=["\0\0","\t"],Q=i.length*C.length;let E="\0\0"+string16(Q)+string16(12*Q+6),u=0;for(s=0,r=C.length;s<r;s++){const e=c[s];for(n=0,g=e.length;n<g;n++){o=e[n];E+=C[s]+h[s]+l[s]+string16(n)+string16(o.length)+string16(u);u+=o.length}}E+=i.join("")+a.join("");return E}class Font{constructor(e,t,i){this.name=e;this.psName=null;this.mimetype=null;this.disableFontFace=!1;this.loadedName=i.loadedName;this.isType3Font=i.isType3Font;this.missingFile=!1;this.cssFontInfo=i.cssFontInfo;this._charsCache=Object.create(null);this._glyphCache=Object.create(null);let a=!!(i.flags&Ki);if(!a&&!i.isSimulatedFlags){const t=e.replaceAll(/[,_]/g,"-").split("-",1)[0],i=Xi();for(const e of t.split("+"))if(i[e]){a=!0;break}}this.isSerifFont=a;this.isSymbolicFont=!!(i.flags&Ti);this.isMonospace=!!(i.flags&vi);let{type:s,subtype:r}=i;this.type=s;this.subtype=r;this.systemFontInfo=i.systemFontInfo;const n=e.match(/^InvalidPDFjsFont_(.*)_\d+$/);this.isInvalidPDFjsFont=!!n;this.isInvalidPDFjsFont?this.fallbackName=n[1]:this.isMonospace?this.fallbackName="monospace":this.isSerifFont?this.fallbackName="serif":this.fallbackName="sans-serif";if(this.systemFontInfo?.guessFallback){this.systemFontInfo.guessFallback=!1;this.systemFontInfo.css+=`,${this.fallbackName}`}this.differences=i.differences;this.widths=i.widths;this.defaultWidth=i.defaultWidth;this.composite=i.composite;this.cMap=i.cMap;this.capHeight=i.capHeight/Ba;this.ascent=i.ascent/Ba;this.descent=i.descent/Ba;this.lineHeight=this.ascent-this.descent;this.fontMatrix=i.fontMatrix;this.bbox=i.bbox;this.defaultEncoding=i.defaultEncoding;this.toUnicode=i.toUnicode;this.toFontChar=[];if("Type3"===i.type){for(let e=0;e<256;e++)this.toFontChar[e]=this.differences[e]||i.defaultEncoding[e];return}this.cidEncoding=i.cidEncoding||"";this.vertical=!!i.vertical;if(this.vertical){this.vmetrics=i.vmetrics;this.defaultVMetrics=i.defaultVMetrics}if(!t||t.isEmpty){t&&warn('Font file is empty in "'+e+'" ('+this.loadedName+")");this.fallbackToSystemFont(i);return}[s,r]=getFontFileType(t,i);s===this.type&&r===this.subtype||info(`Inconsistent font file Type/SubType, expected: ${this.type}/${this.subtype} but found: ${s}/${r}.`);let g;try{switch(s){case"MMType1":info("MMType1 font ("+e+"), falling back to Type1.");case"Type1":case"CIDFontType0":this.mimetype="font/opentype";const a="Type1C"===r||"CIDFontType0C"===r?new CFFFont(t,i):new Type1Font(e,t,i);adjustWidths(i);g=this.convert(e,a,i);break;case"OpenType":case"TrueType":case"CIDFontType2":this.mimetype="font/opentype";g=this.checkAndRepair(e,t,i);if(this.isOpenType){adjustWidths(i);s="OpenType"}break;default:throw new FormatError(`Font ${s} is not supported`)}}catch(e){warn(e);this.fallbackToSystemFont(i);return}amendFallbackToUnicode(i);this.data=g;this.type=s;this.subtype=r;this.fontMatrix=i.fontMatrix;this.widths=i.widths;this.defaultWidth=i.defaultWidth;this.toUnicode=i.toUnicode;this.seacMap=i.seacMap}get renderer(){return shadow(this,"renderer",FontRendererFactory.create(this,Yi))}exportData(e=!1){const t=e?[...la,...Qa]:la,i=Object.create(null);let a,s;for(a of t){s=this[a];void 0!==s&&(i[a]=s)}return i}fallbackToSystemFont(e){this.missingFile=!0;const{name:t,type:i}=this;let a=normalizeFontName(t);const s=Pi(),r=ji(),n=!!s[a],g=!(!r[a]||!s[r[a]]);a=s[a]||r[a]||a;const o=ea()[a];if(o){isNaN(this.ascent)&&(this.ascent=o.ascent/Ba);isNaN(this.descent)&&(this.descent=o.descent/Ba);isNaN(this.capHeight)&&(this.capHeight=o.capHeight/Ba)}this.bold=/bold/gi.test(a);this.italic=/oblique|italic/gi.test(a);this.black=/Black/g.test(t);const c=/Narrow/g.test(t);this.remeasure=(!n||c)&&Object.keys(this.widths).length>0;if((n||g)&&"CIDFontType2"===i&&this.cidEncoding.startsWith("Identity-")){const i=e.cidToGidMap,a=[];applyStandardFontGlyphMap(a,Vi());/Arial-?Black/i.test(t)?applyStandardFontGlyphMap(a,zi()):/Calibri/i.test(t)&&applyStandardFontGlyphMap(a,_i());if(i){for(const e in a){const t=a[e];void 0!==i[t]&&(a[+e]=i[t])}i.length!==this.toUnicode.length&&e.hasIncludedToUnicodeMap&&this.toUnicode instanceof IdentityToUnicodeMap&&this.toUnicode.forEach((function(e,t){const s=a[e];void 0===i[s]&&(a[+e]=t)}))}this.toUnicode instanceof IdentityToUnicodeMap||this.toUnicode.forEach((function(e,t){a[+e]=t}));this.toFontChar=a;this.toUnicode=new ToUnicodeMap(a)}else if(/Symbol/i.test(a))this.toFontChar=buildToFontChar(mi,Ni(),this.differences);else if(/Dingbats/i.test(a))this.toFontChar=buildToFontChar(yi,Gi(),this.differences);else if(n){const e=buildToFontChar(this.defaultEncoding,Ni(),this.differences);"CIDFontType2"!==i||this.cidEncoding.startsWith("Identity-")||this.toUnicode instanceof IdentityToUnicodeMap||this.toUnicode.forEach((function(t,i){e[+t]=i}));this.toFontChar=e}else{const e=Ni(),i=[];this.toUnicode.forEach(((t,a)=>{if(!this.composite){const i=getUnicodeForGlyph(this.differences[t]||this.defaultEncoding[t],e);-1!==i&&(a=i)}i[+t]=a}));this.composite&&this.toUnicode instanceof IdentityToUnicodeMap&&/Tahoma|Verdana/i.test(t)&&applyStandardFontGlyphMap(i,Vi());this.toFontChar=i}amendFallbackToUnicode(e);this.loadedName=a.split("-",1)[0]}checkAndRepair(e,t,i){const a=["OS/2","cmap","head","hhea","hmtx","maxp","name","post","loca","glyf","fpgm","prep","cvt ","CFF "];function readTables(e,t){const i=Object.create(null);i["OS/2"]=null;i.cmap=null;i.head=null;i.hhea=null;i.hmtx=null;i.maxp=null;i.name=null;i.post=null;for(let s=0;s<t;s++){const t=readTableEntry(e);a.includes(t.tag)&&(0!==t.length&&(i[t.tag]=t))}return i}function readTableEntry(e){const t=e.getString(4),i=e.getInt32()>>>0,a=e.getInt32()>>>0,s=e.getInt32()>>>0,r=e.pos;e.pos=e.start||0;e.skip(a);const n=e.getBytes(s);e.pos=r;if("head"===t){n[8]=n[9]=n[10]=n[11]=0;n[17]|=32}return{tag:t,checksum:i,length:s,offset:a,data:n}}function readOpenTypeHeader(e){return{version:e.getString(4),numTables:e.getUint16(),searchRange:e.getUint16(),entrySelector:e.getUint16(),rangeShift:e.getUint16()}}function sanitizeGlyph(e,t,i,a,s,r){const n={length:0,sizeOfInstructions:0};if(t<0||t>=e.length||i>e.length||i-t<=12)return n;const g=e.subarray(t,i),o=signedInt16(g[2],g[3]),c=signedInt16(g[4],g[5]),C=signedInt16(g[6],g[7]),h=signedInt16(g[8],g[9]);if(o>C){writeSignedInt16(g,2,C);writeSignedInt16(g,6,o)}if(c>h){writeSignedInt16(g,4,h);writeSignedInt16(g,8,c)}const l=signedInt16(g[0],g[1]);if(l<0){if(l<-1)return n;a.set(g,s);n.length=g.length;return n}let Q,E=10,u=0;for(Q=0;Q<l;Q++){u=(g[E]<<8|g[E+1])+1;E+=2}const d=E,f=g[E]<<8|g[E+1];n.sizeOfInstructions=f;E+=2+f;const p=E;let m=0;for(Q=0;Q<u;Q++){const e=g[E++];192&e&&(g[E-1]=63&e);let t=2;2&e?t=1:16&e&&(t=0);let i=2;4&e?i=1:32&e&&(i=0);const a=t+i;m+=a;if(8&e){const e=g[E++];0===e&&(g[E-1]^=8);Q+=e;m+=e*a}}if(0===m)return n;let y=E+m;if(y>g.length)return n;if(!r&&f>0){a.set(g.subarray(0,d),s);a.set([0,0],s+d);a.set(g.subarray(p,y),s+d+2);y-=f;g.length-y>3&&(y=y+3&-4);n.length=y;return n}if(g.length-y>3){y=y+3&-4;a.set(g.subarray(0,y),s);n.length=y;return n}a.set(g,s);n.length=g.length;return n}function readNameTable(e){const i=(t.start||0)+e.offset;t.pos=i;const a=[[],[]],s=[],r=e.length,n=i+r;if(0!==t.getUint16()||r<6)return[a,s];const g=t.getUint16(),o=t.getUint16();let c,C;for(c=0;c<g&&t.pos+12<=n;c++){const e={platform:t.getUint16(),encoding:t.getUint16(),language:t.getUint16(),name:t.getUint16(),length:t.getUint16(),offset:t.getUint16()};(isMacNameRecord(e)||isWinNameRecord(e))&&s.push(e)}for(c=0,C=s.length;c<C;c++){const e=s[c];if(e.length<=0)continue;const r=i+o+e.offset;if(r+e.length>n)continue;t.pos=r;const g=e.name;if(e.encoding){let i="";for(let a=0,s=e.length;a<s;a+=2)i+=String.fromCharCode(t.getUint16());a[1][g]=i}else a[0][g]=t.getString(e.length)}return[a,s]}const s=[0,0,0,0,0,0,0,0,-2,-2,-2,-2,0,0,-2,-5,-1,-1,-1,-1,-1,-1,-1,-1,0,0,-1,0,-1,-1,-1,-1,1,-1,-999,0,1,0,-1,-2,0,-1,-2,-1,-1,0,-1,-1,0,0,-999,-999,-1,-1,-1,-1,-2,-999,-2,-2,-999,0,-2,-2,0,0,-2,0,-2,0,0,0,-2,-1,-1,1,1,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,-1,0,-1,-1,0,-999,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,-2,-999,-999,-999,-999,-999,-1,-1,-2,-2,0,0,0,0,-1,-1,-999,-2,-2,0,0,-1,-2,-2,0,0,0,-1,-1,-1,-2];function sanitizeTTProgram(e,t){let i,a,r,n,g,o=e.data,c=0,C=0,h=0;const l=[],Q=[],E=[];let u=t.tooComplexToFollowFunctions,d=!1,f=0,p=0;for(let e=o.length;c<e;){const e=o[c++];if(64===e){a=o[c++];if(d||p)c+=a;else for(i=0;i<a;i++)l.push(o[c++])}else if(65===e){a=o[c++];if(d||p)c+=2*a;else for(i=0;i<a;i++){r=o[c++];l.push(r<<8|o[c++])}}else if(176==(248&e)){a=e-176+1;if(d||p)c+=a;else for(i=0;i<a;i++)l.push(o[c++])}else if(184==(248&e)){a=e-184+1;if(d||p)c+=2*a;else for(i=0;i<a;i++){r=o[c++];l.push(r<<8|o[c++])}}else if(43!==e||u)if(44!==e||u){if(45===e)if(d){d=!1;C=c}else{g=Q.pop();if(!g){warn("TT: ENDF bad stack");t.hintsValid=!1;return}n=E.pop();o=g.data;c=g.i;t.functionsStackDeltas[n]=l.length-g.stackTop}else if(137===e){if(d||p){warn("TT: nested IDEFs not allowed");u=!0}d=!0;h=c}else if(88===e)++f;else if(27===e)p=f;else if(89===e){p===f&&(p=0);--f}else if(28===e&&!d&&!p){const e=l.at(-1);e>0&&(c+=e-1)}}else{if(d||p){warn("TT: nested FDEFs not allowed");u=!0}d=!0;h=c;n=l.pop();t.functionsDefined[n]={data:o,i:c}}else if(!d&&!p){n=l.at(-1);if(isNaN(n))info("TT: CALL empty stack (or invalid entry).");else{t.functionsUsed[n]=!0;if(n in t.functionsStackDeltas){const e=l.length+t.functionsStackDeltas[n];if(e<0){warn("TT: CALL invalid functions stack delta.");t.hintsValid=!1;return}l.length=e}else if(n in t.functionsDefined&&!E.includes(n)){Q.push({data:o,i:c,stackTop:l.length-1});E.push(n);g=t.functionsDefined[n];if(!g){warn("TT: CALL non-existent function");t.hintsValid=!1;return}o=g.data;c=g.i}}}if(!d&&!p){let t=0;e<=142?t=s[e]:e>=192&&e<=223?t=-1:e>=224&&(t=-2);if(e>=113&&e<=117){a=l.pop();isNaN(a)||(t=2*-a)}for(;t<0&&l.length>0;){l.pop();t++}for(;t>0;){l.push(NaN);t--}}}t.tooComplexToFollowFunctions=u;const m=[o];c>o.length&&m.push(new Uint8Array(c-o.length));if(h>C){warn("TT: complementing a missing function tail");m.push(new Uint8Array([34,45]))}!function foldTTTable(e,t){if(t.length>1){let i,a,s=0;for(i=0,a=t.length;i<a;i++)s+=t[i].length;s=s+3&-4;const r=new Uint8Array(s);let n=0;for(i=0,a=t.length;i<a;i++){r.set(t[i],n);n+=t[i].length}e.data=r;e.length=s}}(e,m)}let r,n,g,o;if(isTrueTypeCollectionFile(t=new Stream(new Uint8Array(t.getBytes())))){const e=function readTrueTypeCollectionData(e,t){const{numFonts:i,offsetTable:a}=function readTrueTypeCollectionHeader(e){const t=e.getString(4);assert("ttcf"===t,"Must be a TrueType Collection font.");const i=e.getUint16(),a=e.getUint16(),s=e.getInt32()>>>0,r=[];for(let t=0;t<s;t++)r.push(e.getInt32()>>>0);const n={ttcTag:t,majorVersion:i,minorVersion:a,numFonts:s,offsetTable:r};switch(i){case 1:return n;case 2:n.dsigTag=e.getInt32()>>>0;n.dsigLength=e.getInt32()>>>0;n.dsigOffset=e.getInt32()>>>0;return n}throw new FormatError(`Invalid TrueType Collection majorVersion: ${i}.`)}(e),s=t.split("+");let r;for(let n=0;n<i;n++){e.pos=(e.start||0)+a[n];const i=readOpenTypeHeader(e),g=readTables(e,i.numTables);if(!g.name)throw new FormatError('TrueType Collection font must contain a "name" table.');const[o]=readNameTable(g.name);for(let e=0,a=o.length;e<a;e++)for(let a=0,n=o[e].length;a<n;a++){const n=o[e][a]?.replaceAll(/\s/g,"");if(n){if(n===t)return{header:i,tables:g};if(!(s.length<2))for(const e of s)n===e&&(r={name:e,header:i,tables:g})}}}if(r){warn(`TrueType Collection does not contain "${t}" font, falling back to "${r.name}" font instead.`);return{header:r.header,tables:r.tables}}throw new FormatError(`TrueType Collection does not contain "${t}" font.`)}(t,this.name);r=e.header;n=e.tables}else{r=readOpenTypeHeader(t);n=readTables(t,r.numTables)}const c=!n["CFF "];if(c){if(!n.loca)throw new FormatError('Required "loca" table is not found');if(!n.glyf){warn('Required "glyf" table is not found -- trying to recover.');n.glyf={tag:"glyf",data:new Uint8Array(0)}}this.isOpenType=!1}else{const t=i.composite&&(i.cidToGidMap?.length>0||!(i.cMap instanceof IdentityCMap));if("OTTO"===r.version&&!t||!n.head||!n.hhea||!n.maxp||!n.post){o=new Stream(n["CFF "].data);g=new CFFFont(o,i);adjustWidths(i);return this.convert(e,g,i)}delete n.glyf;delete n.loca;delete n.fpgm;delete n.prep;delete n["cvt "];this.isOpenType=!0}if(!n.maxp)throw new FormatError('Required "maxp" table is not found');t.pos=(t.start||0)+n.maxp.offset;let C=t.getInt32();const h=t.getUint16();if(65536!==C&&20480!==C){if(6===n.maxp.length)C=20480;else{if(!(n.maxp.length>=32))throw new FormatError('"maxp" table has a wrong version number');C=65536}!function writeUint32(e,t,i){e[t+3]=255&i;e[t+2]=i>>>8;e[t+1]=i>>>16;e[t]=i>>>24}(n.maxp.data,0,C)}if(i.scaleFactors?.length===h&&c){const{scaleFactors:e}=i,t=int16(n.head.data[50],n.head.data[51]),a=new GlyfTable({glyfTable:n.glyf.data,isGlyphLocationsLong:t,locaTable:n.loca.data,numGlyphs:h});a.scale(e);const{glyf:s,loca:r,isLocationLong:g}=a.write();n.glyf.data=s;n.loca.data=r;if(g!==!!t){n.head.data[50]=0;n.head.data[51]=g?1:0}const o=n.hmtx.data;for(let t=0;t<h;t++){const i=4*t,a=Math.round(e[t]*int16(o[i],o[i+1]));o[i]=a>>8&255;o[i+1]=255&a;writeSignedInt16(o,i+2,Math.round(e[t]*signedInt16(o[i+2],o[i+3])))}}let l=h+1,Q=!0;if(l>65535){Q=!1;l=h;warn("Not enough space in glyfs to duplicate first glyph.")}let E=0,u=0;if(C>=65536&&n.maxp.length>=32){t.pos+=8;if(t.getUint16()>2){n.maxp.data[14]=0;n.maxp.data[15]=2}t.pos+=4;E=t.getUint16();t.pos+=4;u=t.getUint16()}n.maxp.data[4]=l>>8;n.maxp.data[5]=255&l;const d=function sanitizeTTPrograms(e,t,i,a){const s={functionsDefined:[],functionsUsed:[],functionsStackDeltas:[],tooComplexToFollowFunctions:!1,hintsValid:!0};e&&sanitizeTTProgram(e,s);t&&sanitizeTTProgram(t,s);e&&function checkInvalidFunctions(e,t){if(!e.tooComplexToFollowFunctions)if(e.functionsDefined.length>t){warn("TT: more functions defined than expected");e.hintsValid=!1}else for(let i=0,a=e.functionsUsed.length;i<a;i++){if(i>t){warn("TT: invalid function id: "+i);e.hintsValid=!1;return}if(e.functionsUsed[i]&&!e.functionsDefined[i]){warn("TT: undefined function: "+i);e.hintsValid=!1;return}}}(s,a);if(i&&1&i.length){const e=new Uint8Array(i.length+1);e.set(i.data);i.data=e}return s.hintsValid}(n.fpgm,n.prep,n["cvt "],E);if(!d){delete n.fpgm;delete n.prep;delete n["cvt "]}!function sanitizeMetrics(e,t,i,a,s,r){if(!t){i&&(i.data=null);return}e.pos=(e.start||0)+t.offset;e.pos+=4;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;const n=e.getUint16();e.pos+=8;e.pos+=2;let g=e.getUint16();if(0!==n){if(!(2&int16(a.data[44],a.data[45]))){t.data[22]=0;t.data[23]=0}}if(g>s){info(`The numOfMetrics (${g}) should not be greater than the numGlyphs (${s}).`);g=s;t.data[34]=(65280&g)>>8;t.data[35]=255&g}const o=s-g-(i.length-4*g>>1);if(o>0){const e=new Uint8Array(i.length+2*o);e.set(i.data);if(r){e[i.length]=i.data[2];e[i.length+1]=i.data[3]}i.data=e}}(t,n.hhea,n.hmtx,n.head,l,Q);if(!n.head)throw new FormatError('Required "head" table is not found');!function sanitizeHead(e,t,i){const a=e.data,s=function int32(e,t,i,a){return(e<<24)+(t<<16)+(i<<8)+a}(a[0],a[1],a[2],a[3]);if(s>>16!=1){info("Attempting to fix invalid version in head table: "+s);a[0]=0;a[1]=1;a[2]=0;a[3]=0}const r=int16(a[50],a[51]);if(r<0||r>1){info("Attempting to fix invalid indexToLocFormat in head table: "+r);const e=t+1;if(i===e<<1){a[50]=0;a[51]=0}else{if(i!==e<<2)throw new FormatError("Could not fix indexToLocFormat: "+r);a[50]=0;a[51]=1}}}(n.head,h,c?n.loca.length:0);let f=Object.create(null);if(c){const e=int16(n.head.data[50],n.head.data[51]),t=function sanitizeGlyphLocations(e,t,i,a,s,r,n){let g,o,c;if(a){g=4;o=function fontItemDecodeLong(e,t){return e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3]};c=function fontItemEncodeLong(e,t,i){e[t]=i>>>24&255;e[t+1]=i>>16&255;e[t+2]=i>>8&255;e[t+3]=255&i}}else{g=2;o=function fontItemDecode(e,t){return e[t]<<9|e[t+1]<<1};c=function fontItemEncode(e,t,i){e[t]=i>>9&255;e[t+1]=i>>1&255}}const C=r?i+1:i,h=g*(1+C),l=new Uint8Array(h);l.set(e.data.subarray(0,h));e.data=l;const Q=t.data,E=Q.length,u=new Uint8Array(E);let d,f;const p=[];for(d=0,f=0;d<i+1;d++,f+=g){let e=o(l,f);e>E&&(e=E);p.push({index:d,offset:e,endOffset:0})}p.sort(((e,t)=>e.offset-t.offset));for(d=0;d<i;d++)p[d].endOffset=p[d+1].offset;p.sort(((e,t)=>e.index-t.index));for(d=0;d<i;d++){const{offset:e,endOffset:t}=p[d];if(0!==e||0!==t)break;const i=p[d+1].offset;if(0!==i){p[d].endOffset=i;break}}const m=p.at(-2);0!==m.offset&&0===m.endOffset&&(m.endOffset=E);const y=Object.create(null);let w=0;c(l,0,w);for(d=0,f=g;d<i;d++,f+=g){const e=sanitizeGlyph(Q,p[d].offset,p[d].endOffset,u,w,s),t=e.length;0===t&&(y[d]=!0);e.sizeOfInstructions>n&&(n=e.sizeOfInstructions);w+=t;c(l,f,w)}if(0===w){const e=new Uint8Array([0,1,0,0,0,0,0,0,0,0,0,0,0,0,49,0]);for(d=0,f=g;d<C;d++,f+=g)c(l,f,e.length);t.data=e}else if(r){const i=o(l,g);if(u.length>i+w)t.data=u.subarray(0,i+w);else{t.data=new Uint8Array(i+w);t.data.set(u.subarray(0,w))}t.data.set(u.subarray(0,i),w);c(e.data,l.length-g,w+i)}else t.data=u.subarray(0,w);return{missingGlyphs:y,maxSizeOfInstructions:n}}(n.loca,n.glyf,h,e,d,Q,u);f=t.missingGlyphs;if(C>=65536&&n.maxp.length>=32){n.maxp.data[26]=t.maxSizeOfInstructions>>8;n.maxp.data[27]=255&t.maxSizeOfInstructions}}if(!n.hhea)throw new FormatError('Required "hhea" table is not found');if(0===n.hhea.data[10]&&0===n.hhea.data[11]){n.hhea.data[10]=255;n.hhea.data[11]=255}const p={unitsPerEm:int16(n.head.data[18],n.head.data[19]),yMax:signedInt16(n.head.data[42],n.head.data[43]),yMin:signedInt16(n.head.data[38],n.head.data[39]),ascent:signedInt16(n.hhea.data[4],n.hhea.data[5]),descent:signedInt16(n.hhea.data[6],n.hhea.data[7]),lineGap:signedInt16(n.hhea.data[8],n.hhea.data[9])};this.ascent=p.ascent/p.unitsPerEm;this.descent=p.descent/p.unitsPerEm;this.lineGap=p.lineGap/p.unitsPerEm;if(this.cssFontInfo?.lineHeight){this.lineHeight=this.cssFontInfo.metrics.lineHeight;this.lineGap=this.cssFontInfo.metrics.lineGap}else this.lineHeight=this.ascent-this.descent+this.lineGap;n.post&&function readPostScriptTable(e,i,a){const s=(t.start||0)+e.offset;t.pos=s;const r=s+e.length,n=t.getInt32();t.skip(28);let g,o,c=!0;switch(n){case 65536:g=Oi;break;case 131072:const e=t.getUint16();if(e!==a){c=!1;break}const s=[];for(o=0;o<e;++o){const e=t.getUint16();if(e>=32768){c=!1;break}s.push(e)}if(!c)break;const C=[],h=[];for(;t.pos<r;){const e=t.getByte();h.length=e;for(o=0;o<e;++o)h[o]=String.fromCharCode(t.getByte());C.push(h.join(""))}g=[];for(o=0;o<e;++o){const e=s[o];e<258?g.push(Oi[e]):g.push(C[e-258])}break;case 196608:break;default:warn("Unknown/unsupported post table version "+n);c=!1;i.defaultEncoding&&(g=i.defaultEncoding)}i.glyphNames=g;return c}(n.post,i,h);n.post={tag:"post",data:createPostTable(i)};const m=Object.create(null);function hasGlyph(e){return!f[e]}if(i.composite){const e=i.cidToGidMap||[],t=0===e.length;i.cMap.forEach((function(i,a){"string"==typeof a&&(a=convertCidString(i,a,!0));if(a>65535)throw new FormatError("Max size of CID is 65,535");let s=-1;t?s=a:void 0!==e[a]&&(s=e[a]);s>=0&&s<h&&hasGlyph(s)&&(m[i]=s)}))}else{const e=function readCmapTable(e,t,i,a){if(!e){warn("No cmap table available.");return{platformId:-1,encodingId:-1,mappings:[],hasShortCmap:!1}}let s,r=(t.start||0)+e.offset;t.pos=r;t.skip(2);const n=t.getUint16();let g,o=!1;for(let e=0;e<n;e++){const s=t.getUint16(),r=t.getUint16(),c=t.getInt32()>>>0;let C=!1;if(g?.platformId!==s||g?.encodingId!==r){if(0!==s||0!==r&&1!==r&&3!==r)if(1===s&&0===r)C=!0;else if(3!==s||1!==r||!a&&g){if(i&&3===s&&0===r){C=!0;let i=!0;if(e<n-1){const e=t.peekBytes(2);int16(e[0],e[1])<s&&(i=!1)}i&&(o=!0)}}else{C=!0;i||(o=!0)}else C=!0;C&&(g={platformId:s,encodingId:r,offset:c});if(o)break}}g&&(t.pos=r+g.offset);if(!g||-1===t.peekByte()){warn("Could not find a preferred cmap table.");return{platformId:-1,encodingId:-1,mappings:[],hasShortCmap:!1}}const c=t.getUint16();let C=!1;const h=[];let l,Q;if(0===c){t.skip(4);for(l=0;l<256;l++){const e=t.getByte();e&&h.push({charCode:l,glyphId:e})}C=!0}else if(2===c){t.skip(4);const e=[];let i=0;for(let a=0;a<256;a++){const a=t.getUint16()>>3;e.push(a);i=Math.max(a,i)}const a=[];for(let e=0;e<=i;e++)a.push({firstCode:t.getUint16(),entryCount:t.getUint16(),idDelta:signedInt16(t.getByte(),t.getByte()),idRangePos:t.pos+t.getUint16()});for(let i=0;i<256;i++)if(0===e[i]){t.pos=a[0].idRangePos+2*i;Q=t.getUint16();h.push({charCode:i,glyphId:Q})}else{const s=a[e[i]];for(l=0;l<s.entryCount;l++){const e=(i<<8)+l+s.firstCode;t.pos=s.idRangePos+2*l;Q=t.getUint16();0!==Q&&(Q=(Q+s.idDelta)%65536);h.push({charCode:e,glyphId:Q})}}}else if(4===c){t.skip(4);const e=t.getUint16()>>1;t.skip(6);const i=[];let a;for(a=0;a<e;a++)i.push({end:t.getUint16()});t.skip(2);for(a=0;a<e;a++)i[a].start=t.getUint16();for(a=0;a<e;a++)i[a].delta=t.getUint16();let n,g=0;for(a=0;a<e;a++){s=i[a];const r=t.getUint16();if(r){n=(r>>1)-(e-a);s.offsetIndex=n;g=Math.max(g,n+s.end-s.start+1)}else s.offsetIndex=-1}const o=[];for(l=0;l<g;l++)o.push(t.getUint16());for(a=0;a<e;a++){s=i[a];r=s.start;const e=s.end,t=s.delta;n=s.offsetIndex;for(l=r;l<=e;l++)if(65535!==l){Q=n<0?l:o[n+l-r];Q=Q+t&65535;h.push({charCode:l,glyphId:Q})}}}else if(6===c){t.skip(4);const e=t.getUint16(),i=t.getUint16();for(l=0;l<i;l++){Q=t.getUint16();const i=e+l;h.push({charCode:i,glyphId:Q})}}else{if(12!==c){warn("cmap table has unsupported format: "+c);return{platformId:-1,encodingId:-1,mappings:[],hasShortCmap:!1}}{t.skip(10);const e=t.getInt32()>>>0;for(l=0;l<e;l++){const e=t.getInt32()>>>0,i=t.getInt32()>>>0;let a=t.getInt32()>>>0;for(let t=e;t<=i;t++)h.push({charCode:t,glyphId:a++})}}}h.sort((function(e,t){return e.charCode-t.charCode}));for(let e=1;e<h.length;e++)if(h[e-1].charCode===h[e].charCode){h.splice(e,1);e--}return{platformId:g.platformId,encodingId:g.encodingId,mappings:h,hasShortCmap:C}}(n.cmap,t,this.isSymbolicFont,i.hasEncoding),a=e.platformId,s=e.encodingId,r=e.mappings;let g=[],o=!1;!i.hasEncoding||"MacRomanEncoding"!==i.baseEncodingName&&"WinAnsiEncoding"!==i.baseEncodingName||(g=getEncoding(i.baseEncodingName));if(i.hasEncoding&&!this.isSymbolicFont&&(3===a&&1===s||1===a&&0===s)){const e=Ni();for(let t=0;t<256;t++){let n;n=void 0!==this.differences[t]?this.differences[t]:g.length&&""!==g[t]?g[t]:fi[t];if(!n)continue;const o=recoverGlyphName(n,e);let c;3===a&&1===s?c=e[o]:1===a&&0===s&&(c=di.indexOf(o));if(void 0===c){if(!i.glyphNames&&i.hasIncludedToUnicodeMap&&!(this.toUnicode instanceof IdentityToUnicodeMap)){const e=this.toUnicode.get(t);e&&(c=e.codePointAt(0))}if(void 0===c)continue}for(const e of r)if(e.charCode===c){m[t]=e.glyphId;break}}}else if(0===a){for(const e of r)m[e.charCode]=e.glyphId;o=!0}else if(3===a&&0===s)for(const e of r){let t=e.charCode;t>=61440&&t<=61695&&(t&=255);m[t]=e.glyphId}else for(const e of r)m[e.charCode]=e.glyphId;if(i.glyphNames&&(g.length||this.differences.length))for(let e=0;e<256;++e){if(!o&&void 0!==m[e])continue;const t=this.differences[e]||g[e];if(!t)continue;const a=i.glyphNames.indexOf(t);a>0&&hasGlyph(a)&&(m[e]=a)}}0===m.length&&(m[0]=0);let y=l-1;Q||(y=0);if(!i.cssFontInfo){const e=adjustMapping(m,hasGlyph,y,this.toUnicode);this.toFontChar=e.toFontChar;n.cmap={tag:"cmap",data:createCmapTable(e.charCodeToGlyphId,e.toUnicodeExtraMap,l)};n["OS/2"]&&function validateOS2Table(e,t){t.pos=(t.start||0)+e.offset;const i=t.getUint16();t.skip(60);const a=t.getUint16();if(i<4&&768&a)return!1;if(t.getUint16()>t.getUint16())return!1;t.skip(6);if(0===t.getUint16())return!1;e.data[8]=e.data[9]=0;return!0}(n["OS/2"],t)||(n["OS/2"]={tag:"OS/2",data:createOS2Table(i,e.charCodeToGlyphId,p)})}if(!c)try{o=new Stream(n["CFF "].data);g=new CFFParser(o,i,Yi).parse();g.duplicateFirstGlyph();const e=new CFFCompiler(g);n["CFF "].data=e.compile()}catch{warn("Failed to compile font "+i.loadedName)}if(n.name){const[t,a]=readNameTable(n.name);n.name.data=createNameTable(e,t);this.psName=t[0][6]||null;i.composite||function adjustTrueTypeToUnicode(e,t,i){if(e.isInternalFont)return;if(e.hasIncludedToUnicodeMap)return;if(e.hasEncoding)return;if(e.toUnicode instanceof IdentityToUnicodeMap)return;if(!t)return;if(0===i.length)return;if(e.defaultEncoding===pi)return;for(const e of i)if(!isWinNameRecord(e))return;const a=pi,s=[],r=Ni();for(const e in a){const t=a[e];if(""===t)continue;const i=r[t];void 0!==i&&(s[e]=String.fromCharCode(i))}s.length>0&&e.toUnicode.amend(s)}(i,this.isSymbolicFont,a)}else n.name={tag:"name",data:createNameTable(this.name)};const w=new OpenTypeFileBuilder(r.version);for(const e in n)w.addTable(e,n[e].data);return w.toArray()}convert(e,t,i){i.fixedPitch=!1;i.builtInEncoding&&function adjustType1ToUnicode(e,t){if(e.isInternalFont)return;if(e.hasIncludedToUnicodeMap)return;if(t===e.defaultEncoding)return;if(e.toUnicode instanceof IdentityToUnicodeMap)return;const i=[],a=Ni();for(const s in t){if(e.hasEncoding&&(e.baseEncodingName||void 0!==e.differences[s]))continue;const r=getUnicodeForGlyph(t[s],a);-1!==r&&(i[s]=String.fromCharCode(r))}i.length>0&&e.toUnicode.amend(i)}(i,i.builtInEncoding);let s=1;t instanceof CFFFont&&(s=t.numGlyphs-1);const r=t.getGlyphMapping(i);let n=null,g=r,o=null;if(!i.cssFontInfo){n=adjustMapping(r,t.hasGlyphId.bind(t),s,this.toUnicode);this.toFontChar=n.toFontChar;g=n.charCodeToGlyphId;o=n.toUnicodeExtraMap}const c=t.numGlyphs;function getCharCodes(e,t){let i=null;for(const a in e)t===e[a]&&(i||=[]).push(0|a);return i}function createCharCode(e,t){for(const i in e)if(t===e[i])return 0|i;n.charCodeToGlyphId[n.nextAvailableFontCharCode]=t;return n.nextAvailableFontCharCode++}const C=t.seacs;if(n&&C?.length){const e=i.fontMatrix||a,s=t.getCharset(),g=Object.create(null);for(let t in C){t|=0;const i=C[t],a=fi[i[2]],o=fi[i[3]],c=s.indexOf(a),h=s.indexOf(o);if(c<0||h<0)continue;const l={x:i[0]*e[0]+i[1]*e[2]+e[4],y:i[0]*e[1]+i[1]*e[3]+e[5]},Q=getCharCodes(r,t);if(Q)for(const e of Q){const t=n.charCodeToGlyphId,i=createCharCode(t,c),a=createCharCode(t,h);g[e]={baseFontCharCode:i,accentFontCharCode:a,accentOffset:l}}}i.seacMap=g}const h=i.fontMatrix?1/Math.max(...i.fontMatrix.slice(0,4).map(Math.abs)):1e3,l=new OpenTypeFileBuilder("OTTO");l.addTable("CFF ",t.data);l.addTable("OS/2",createOS2Table(i,g));l.addTable("cmap",createCmapTable(g,o,c));l.addTable("head","\0\0\0\0\0\0\0\0\0\0_<玫\0\0"+safeString16(h)+"\0\0\0\0聻\v~'\0\0\0\0聻\v~'\0\0"+safeString16(i.descent)+"每"+safeString16(i.ascent)+string16(i.italicAngle?2:0)+"\0\0\0\0\0\0\0");l.addTable("hhea","\0\0\0"+safeString16(i.ascent)+safeString16(i.descent)+"\0\0每每\0\0\0\0\0\0"+safeString16(i.capHeight)+safeString16(Math.tan(i.italicAngle)*i.xHeight)+"\0\0\0\0\0\0\0\0\0\0\0\0"+string16(c));l.addTable("hmtx",function fontFieldsHmtx(){const e=t.charstrings,i=t.cff?t.cff.widths:null;let a="\0\0\0\0";for(let t=1,s=c;t<s;t++){let s=0;if(e){const i=e[t-1];s="width"in i?i.width:0}else i&&(s=Math.ceil(i[t]||0));a+=string16(s)+string16(0)}return a}());l.addTable("maxp","\0\0P\0"+string16(c));l.addTable("name",createNameTable(e));l.addTable("post",createPostTable(i));return l.toArray()}_charToGlyph(e,t=!1){let i,a,s,r=this._glyphCache[e];if(r?.isSpace===t)return r;let n=e;if(this.cMap?.contains(e)){n=this.cMap.lookup(e);"string"==typeof n&&(n=convertCidString(e,n))}a=this.widths[n];"number"!=typeof a&&(a=this.defaultWidth);const g=this.vmetrics?.[n];let o=this.toUnicode.get(e)||e;"number"==typeof o&&(o=String.fromCharCode(o));let c=void 0!==this.toFontChar[e];i=this.toFontChar[e]||e;if(this.missingFile){const t=this.differences[e]||this.defaultEncoding[e];".notdef"!==t&&""!==t||"Type1"!==this.type||(i=32);i=function mapSpecialUnicodeValues(e){return e>=65520&&e<=65535?0:e>=62976&&e<=63743?xi()[e]||e:173===e?45:e}(i)}this.isType3Font&&(s=i);let C=null;if(this.seacMap?.[e]){c=!0;const t=this.seacMap[e];i=t.baseFontCharCode;C={fontChar:String.fromCodePoint(t.accentFontCharCode),offset:t.accentOffset}}let h="";"number"==typeof i&&(i<=1114111?h=String.fromCodePoint(i):warn(`charToGlyph - invalid fontCharCode: ${i}`));r=new fonts_Glyph(e,h,o,C,a,g,s,t,c);return this._glyphCache[e]=r}charsToGlyphs(e){let t=this._charsCache[e];if(t)return t;t=[];if(this.cMap){const i=Object.create(null),a=e.length;let s=0;for(;s<a;){this.cMap.readCharCode(e,s,i);const{charcode:a,length:r}=i;s+=r;const n=this._charToGlyph(a,1===r&&32===e.charCodeAt(s-1));t.push(n)}}else for(let i=0,a=e.length;i<a;++i){const a=e.charCodeAt(i),s=this._charToGlyph(a,32===a);t.push(s)}return this._charsCache[e]=t}getCharPositions(e){const t=[];if(this.cMap){const i=Object.create(null);let a=0;for(;a<e.length;){this.cMap.readCharCode(e,a,i);const s=i.length;t.push([a,a+s]);a+=s}}else for(let i=0,a=e.length;i<a;++i)t.push([i,i+1]);return t}get glyphCacheValues(){return Object.values(this._glyphCache)}encodeString(e){const t=[],i=[],hasCurrentBufErrors=()=>t.length%2==1,a=this.toUnicode instanceof IdentityToUnicodeMap?e=>this.toUnicode.charCodeOf(e):e=>this.toUnicode.charCodeOf(String.fromCodePoint(e));for(let s=0,r=e.length;s<r;s++){const r=e.codePointAt(s);r>55295&&(r<57344||r>65533)&&s++;if(this.toUnicode){const e=a(r);if(-1!==e){if(hasCurrentBufErrors()){t.push(i.join(""));i.length=0}for(let t=(this.cMap?this.cMap.getCharCodeLength(e):1)-1;t>=0;t--)i.push(String.fromCharCode(e>>8*t&255));continue}}if(!hasCurrentBufErrors()){t.push(i.join(""));i.length=0}i.push(String.fromCodePoint(r))}t.push(i.join(""));return t}}class ErrorFont{constructor(e){this.error=e;this.loadedName="g_font_error";this.missingFile=!0}charsToGlyphs(){return[]}encodeString(e){return[e]}exportData(e=!1){return{error:this.error}}}const Ea=2,ua=3,da=4,fa=5,pa=6,ma=7;class Pattern{constructor(){unreachable("Cannot initialize Pattern.")}static parseShading(e,t,i,a,s){const r=e instanceof BaseStream?e.dict:e,n=r.get("ShadingType");try{switch(n){case Ea:case ua:return new RadialAxialShading(r,t,i,a,s);case da:case fa:case pa:case ma:return new MeshShading(e,t,i,a,s);default:throw new FormatError("Unsupported ShadingType: "+n)}}catch(e){if(e instanceof MissingDataException)throw e;warn(e);return new DummyShading}}}class BaseShading{static SMALL_NUMBER=1e-6;constructor(){this.constructor===BaseShading&&unreachable("Cannot initialize BaseShading.")}getIR(){unreachable("Abstract method `getIR` called.")}}class RadialAxialShading extends BaseShading{constructor(e,t,i,a,s){super();this.shadingType=e.get("ShadingType");let r=0;this.shadingType===Ea?r=4:this.shadingType===ua&&(r=6);this.coordsArr=e.getArray("Coords");if(!isNumberArray(this.coordsArr,r))throw new FormatError("RadialAxialShading: Invalid /Coords array.");const n=ColorSpace.parse({cs:e.getRaw("CS")||e.getRaw("ColorSpace"),xref:t,resources:i,pdfFunctionFactory:a,localColorSpaceCache:s});this.bbox=lookupNormalRect(e.getArray("BBox"),null);let g=0,o=1;const c=e.getArray("Domain");isNumberArray(c,2)&&([g,o]=c);let C=!1,h=!1;const l=e.getArray("Extend");(function isBooleanArray(e,t){return Array.isArray(e)&&(null===t||e.length===t)&&e.every((e=>"boolean"==typeof e))})(l,2)&&([C,h]=l);if(!(this.shadingType!==ua||C&&h)){const[e,t,i,a,s,r]=this.coordsArr,n=Math.hypot(e-a,t-s);i<=r+n&&r<=i+n&&warn("Unsupported radial gradient.")}this.extendStart=C;this.extendEnd=h;const Q=e.getRaw("Function"),E=a.createFromArray(Q),u=(o-g)/840,d=this.colorStops=[];if(g>=o||u<=0){info("Bad shading domain.");return}const f=new Float32Array(n.numComps),p=new Float32Array(1);let m,y=0;p[0]=g;E(p,0,f,0);let w=n.getRgb(f,0);const D=Util.makeHexColor(w[0],w[1],w[2]);d.push([0,D]);let b=1;p[0]=g+u;E(p,0,f,0);let F=n.getRgb(f,0),S=F[0]-w[0]+1,k=F[1]-w[1]+1,R=F[2]-w[2]+1,N=F[0]-w[0]-1,G=F[1]-w[1]-1,x=F[2]-w[2]-1;for(let e=2;e<840;e++){p[0]=g+e*u;E(p,0,f,0);m=n.getRgb(f,0);const t=e-y;S=Math.min(S,(m[0]-w[0]+1)/t);k=Math.min(k,(m[1]-w[1]+1)/t);R=Math.min(R,(m[2]-w[2]+1)/t);N=Math.max(N,(m[0]-w[0]-1)/t);G=Math.max(G,(m[1]-w[1]-1)/t);x=Math.max(x,(m[2]-w[2]-1)/t);if(!(N<=S&&G<=k&&x<=R)){const e=Util.makeHexColor(F[0],F[1],F[2]);d.push([b/840,e]);S=m[0]-F[0]+1;k=m[1]-F[1]+1;R=m[2]-F[2]+1;N=m[0]-F[0]-1;G=m[1]-F[1]-1;x=m[2]-F[2]-1;y=b;w=F}b=e;F=m}const U=Util.makeHexColor(F[0],F[1],F[2]);d.push([1,U]);let M="transparent";if(e.has("Background")){m=n.getRgb(e.get("Background"),0);M=Util.makeHexColor(m[0],m[1],m[2])}if(!C){d.unshift([0,M]);d[1][0]+=BaseShading.SMALL_NUMBER}if(!h){d.at(-1)[0]-=BaseShading.SMALL_NUMBER;d.push([1,M])}this.colorStops=d}getIR(){const{coordsArr:e,shadingType:t}=this;let i,a,s,r,n;if(t===Ea){a=[e[0],e[1]];s=[e[2],e[3]];r=null;n=null;i="axial"}else if(t===ua){a=[e[0],e[1]];s=[e[3],e[4]];r=e[2];n=e[5];i="radial"}else unreachable(`getPattern type unknown: ${t}`);return["RadialAxial",i,this.bbox,this.colorStops,a,s,r,n]}}class MeshStreamReader{constructor(e,t){this.stream=e;this.context=t;this.buffer=0;this.bufferLength=0;const i=t.numComps;this.tmpCompsBuf=new Float32Array(i);const a=t.colorSpace.numComps;this.tmpCsCompsBuf=t.colorFn?new Float32Array(a):this.tmpCompsBuf}get hasData(){if(this.stream.end)return this.stream.pos<this.stream.end;if(this.bufferLength>0)return!0;const e=this.stream.getByte();if(e<0)return!1;this.buffer=e;this.bufferLength=8;return!0}readBits(e){let t=this.buffer,i=this.bufferLength;if(32===e){if(0===i)return(this.stream.getByte()<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte())>>>0;t=t<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte();const e=this.stream.getByte();this.buffer=e&(1<<i)-1;return(t<<8-i|(255&e)>>i)>>>0}if(8===e&&0===i)return this.stream.getByte();for(;i<e;){t=t<<8|this.stream.getByte();i+=8}i-=e;this.bufferLength=i;this.buffer=t&(1<<i)-1;return t>>i}align(){this.buffer=0;this.bufferLength=0}readFlag(){return this.readBits(this.context.bitsPerFlag)}readCoordinate(){const e=this.context.bitsPerCoordinate,t=this.readBits(e),i=this.readBits(e),a=this.context.decode,s=e<32?1/((1<<e)-1):2.3283064365386963e-10;return[t*s*(a[1]-a[0])+a[0],i*s*(a[3]-a[2])+a[2]]}readComponents(){const e=this.context.numComps,t=this.context.bitsPerComponent,i=t<32?1/((1<<t)-1):2.3283064365386963e-10,a=this.context.decode,s=this.tmpCompsBuf;for(let r=0,n=4;r<e;r++,n+=2){const e=this.readBits(t);s[r]=e*i*(a[n+1]-a[n])+a[n]}const r=this.tmpCsCompsBuf;this.context.colorFn&&this.context.colorFn(s,0,r,0);return this.context.colorSpace.getRgb(r,0)}}let ya=Object.create(null);function getB(e){return ya[e]||=function buildB(e){const t=[];for(let i=0;i<=e;i++){const a=i/e,s=1-a;t.push(new Float32Array([s**3,3*a*s**2,3*a**2*s,a**3]))}return t}(e)}class MeshShading extends BaseShading{static MIN_SPLIT_PATCH_CHUNKS_AMOUNT=3;static MAX_SPLIT_PATCH_CHUNKS_AMOUNT=20;static TRIANGLE_DENSITY=20;constructor(e,t,i,a,s){super();if(!(e instanceof BaseStream))throw new FormatError("Mesh data is not a stream");const r=e.dict;this.shadingType=r.get("ShadingType");this.bbox=lookupNormalRect(r.getArray("BBox"),null);const n=ColorSpace.parse({cs:r.getRaw("CS")||r.getRaw("ColorSpace"),xref:t,resources:i,pdfFunctionFactory:a,localColorSpaceCache:s});this.background=r.has("Background")?n.getRgb(r.get("Background"),0):null;const g=r.getRaw("Function"),o=g?a.createFromArray(g):null;this.coords=[];this.colors=[];this.figures=[];const c={bitsPerCoordinate:r.get("BitsPerCoordinate"),bitsPerComponent:r.get("BitsPerComponent"),bitsPerFlag:r.get("BitsPerFlag"),decode:r.getArray("Decode"),colorFn:o,colorSpace:n,numComps:o?1:n.numComps},C=new MeshStreamReader(e,c);let h=!1;switch(this.shadingType){case da:this._decodeType4Shading(C);break;case fa:const e=0|r.get("VerticesPerRow");if(e<2)throw new FormatError("Invalid VerticesPerRow");this._decodeType5Shading(C,e);break;case pa:this._decodeType6Shading(C);h=!0;break;case ma:this._decodeType7Shading(C);h=!0;break;default:unreachable("Unsupported mesh type.")}if(h){this._updateBounds();for(let e=0,t=this.figures.length;e<t;e++)this._buildFigureFromPatch(e)}this._updateBounds();this._packData()}_decodeType4Shading(e){const t=this.coords,i=this.colors,a=[],s=[];let r=0;for(;e.hasData;){const n=e.readFlag(),g=e.readCoordinate(),o=e.readComponents();if(0===r){if(!(0<=n&&n<=2))throw new FormatError("Unknown type4 flag");switch(n){case 0:r=3;break;case 1:s.push(s.at(-2),s.at(-1));r=1;break;case 2:s.push(s.at(-3),s.at(-1));r=1}a.push(n)}s.push(t.length);t.push(g);i.push(o);r--;e.align()}this.figures.push({type:"triangles",coords:new Int32Array(s),colors:new Int32Array(s)})}_decodeType5Shading(e,t){const i=this.coords,a=this.colors,s=[];for(;e.hasData;){const t=e.readCoordinate(),r=e.readComponents();s.push(i.length);i.push(t);a.push(r)}this.figures.push({type:"lattice",coords:new Int32Array(s),colors:new Int32Array(s),verticesPerRow:t})}_decodeType6Shading(e){const t=this.coords,i=this.colors,a=new Int32Array(16),s=new Int32Array(4);for(;e.hasData;){const r=e.readFlag();if(!(0<=r&&r<=3))throw new FormatError("Unknown type6 flag");const n=t.length;for(let i=0,a=0!==r?8:12;i<a;i++)t.push(e.readCoordinate());const g=i.length;for(let t=0,a=0!==r?2:4;t<a;t++)i.push(e.readComponents());let o,c,C,h;switch(r){case 0:a[12]=n+3;a[13]=n+4;a[14]=n+5;a[15]=n+6;a[8]=n+2;a[11]=n+7;a[4]=n+1;a[7]=n+8;a[0]=n;a[1]=n+11;a[2]=n+10;a[3]=n+9;s[2]=g+1;s[3]=g+2;s[0]=g;s[1]=g+3;break;case 1:o=a[12];c=a[13];C=a[14];h=a[15];a[12]=h;a[13]=n+0;a[14]=n+1;a[15]=n+2;a[8]=C;a[11]=n+3;a[4]=c;a[7]=n+4;a[0]=o;a[1]=n+7;a[2]=n+6;a[3]=n+5;o=s[2];c=s[3];s[2]=c;s[3]=g;s[0]=o;s[1]=g+1;break;case 2:o=a[15];c=a[11];a[12]=a[3];a[13]=n+0;a[14]=n+1;a[15]=n+2;a[8]=a[7];a[11]=n+3;a[4]=c;a[7]=n+4;a[0]=o;a[1]=n+7;a[2]=n+6;a[3]=n+5;o=s[3];s[2]=s[1];s[3]=g;s[0]=o;s[1]=g+1;break;case 3:a[12]=a[0];a[13]=n+0;a[14]=n+1;a[15]=n+2;a[8]=a[1];a[11]=n+3;a[4]=a[2];a[7]=n+4;a[0]=a[3];a[1]=n+7;a[2]=n+6;a[3]=n+5;s[2]=s[0];s[3]=g;s[0]=s[1];s[1]=g+1}a[5]=t.length;t.push([(-4*t[a[0]][0]-t[a[15]][0]+6*(t[a[4]][0]+t[a[1]][0])-2*(t[a[12]][0]+t[a[3]][0])+3*(t[a[13]][0]+t[a[7]][0]))/9,(-4*t[a[0]][1]-t[a[15]][1]+6*(t[a[4]][1]+t[a[1]][1])-2*(t[a[12]][1]+t[a[3]][1])+3*(t[a[13]][1]+t[a[7]][1]))/9]);a[6]=t.length;t.push([(-4*t[a[3]][0]-t[a[12]][0]+6*(t[a[2]][0]+t[a[7]][0])-2*(t[a[0]][0]+t[a[15]][0])+3*(t[a[4]][0]+t[a[14]][0]))/9,(-4*t[a[3]][1]-t[a[12]][1]+6*(t[a[2]][1]+t[a[7]][1])-2*(t[a[0]][1]+t[a[15]][1])+3*(t[a[4]][1]+t[a[14]][1]))/9]);a[9]=t.length;t.push([(-4*t[a[12]][0]-t[a[3]][0]+6*(t[a[8]][0]+t[a[13]][0])-2*(t[a[0]][0]+t[a[15]][0])+3*(t[a[11]][0]+t[a[1]][0]))/9,(-4*t[a[12]][1]-t[a[3]][1]+6*(t[a[8]][1]+t[a[13]][1])-2*(t[a[0]][1]+t[a[15]][1])+3*(t[a[11]][1]+t[a[1]][1]))/9]);a[10]=t.length;t.push([(-4*t[a[15]][0]-t[a[0]][0]+6*(t[a[11]][0]+t[a[14]][0])-2*(t[a[12]][0]+t[a[3]][0])+3*(t[a[2]][0]+t[a[8]][0]))/9,(-4*t[a[15]][1]-t[a[0]][1]+6*(t[a[11]][1]+t[a[14]][1])-2*(t[a[12]][1]+t[a[3]][1])+3*(t[a[2]][1]+t[a[8]][1]))/9]);this.figures.push({type:"patch",coords:new Int32Array(a),colors:new Int32Array(s)})}}_decodeType7Shading(e){const t=this.coords,i=this.colors,a=new Int32Array(16),s=new Int32Array(4);for(;e.hasData;){const r=e.readFlag();if(!(0<=r&&r<=3))throw new FormatError("Unknown type7 flag");const n=t.length;for(let i=0,a=0!==r?12:16;i<a;i++)t.push(e.readCoordinate());const g=i.length;for(let t=0,a=0!==r?2:4;t<a;t++)i.push(e.readComponents());let o,c,C,h;switch(r){case 0:a[12]=n+3;a[13]=n+4;a[14]=n+5;a[15]=n+6;a[8]=n+2;a[9]=n+13;a[10]=n+14;a[11]=n+7;a[4]=n+1;a[5]=n+12;a[6]=n+15;a[7]=n+8;a[0]=n;a[1]=n+11;a[2]=n+10;a[3]=n+9;s[2]=g+1;s[3]=g+2;s[0]=g;s[1]=g+3;break;case 1:o=a[12];c=a[13];C=a[14];h=a[15];a[12]=h;a[13]=n+0;a[14]=n+1;a[15]=n+2;a[8]=C;a[9]=n+9;a[10]=n+10;a[11]=n+3;a[4]=c;a[5]=n+8;a[6]=n+11;a[7]=n+4;a[0]=o;a[1]=n+7;a[2]=n+6;a[3]=n+5;o=s[2];c=s[3];s[2]=c;s[3]=g;s[0]=o;s[1]=g+1;break;case 2:o=a[15];c=a[11];a[12]=a[3];a[13]=n+0;a[14]=n+1;a[15]=n+2;a[8]=a[7];a[9]=n+9;a[10]=n+10;a[11]=n+3;a[4]=c;a[5]=n+8;a[6]=n+11;a[7]=n+4;a[0]=o;a[1]=n+7;a[2]=n+6;a[3]=n+5;o=s[3];s[2]=s[1];s[3]=g;s[0]=o;s[1]=g+1;break;case 3:a[12]=a[0];a[13]=n+0;a[14]=n+1;a[15]=n+2;a[8]=a[1];a[9]=n+9;a[10]=n+10;a[11]=n+3;a[4]=a[2];a[5]=n+8;a[6]=n+11;a[7]=n+4;a[0]=a[3];a[1]=n+7;a[2]=n+6;a[3]=n+5;s[2]=s[0];s[3]=g;s[0]=s[1];s[1]=g+1}this.figures.push({type:"patch",coords:new Int32Array(a),colors:new Int32Array(s)})}}_buildFigureFromPatch(e){const t=this.figures[e];assert("patch"===t.type,"Unexpected patch mesh figure");const i=this.coords,a=this.colors,s=t.coords,r=t.colors,n=Math.min(i[s[0]][0],i[s[3]][0],i[s[12]][0],i[s[15]][0]),g=Math.min(i[s[0]][1],i[s[3]][1],i[s[12]][1],i[s[15]][1]),o=Math.max(i[s[0]][0],i[s[3]][0],i[s[12]][0],i[s[15]][0]),c=Math.max(i[s[0]][1],i[s[3]][1],i[s[12]][1],i[s[15]][1]);let C=Math.ceil((o-n)*MeshShading.TRIANGLE_DENSITY/(this.bounds[2]-this.bounds[0]));C=Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT,Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT,C));let h=Math.ceil((c-g)*MeshShading.TRIANGLE_DENSITY/(this.bounds[3]-this.bounds[1]));h=Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT,Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT,h));const l=C+1,Q=new Int32Array((h+1)*l),E=new Int32Array((h+1)*l);let u=0;const d=new Uint8Array(3),f=new Uint8Array(3),p=a[r[0]],m=a[r[1]],y=a[r[2]],w=a[r[3]],D=getB(h),b=getB(C);for(let e=0;e<=h;e++){d[0]=(p[0]*(h-e)+y[0]*e)/h|0;d[1]=(p[1]*(h-e)+y[1]*e)/h|0;d[2]=(p[2]*(h-e)+y[2]*e)/h|0;f[0]=(m[0]*(h-e)+w[0]*e)/h|0;f[1]=(m[1]*(h-e)+w[1]*e)/h|0;f[2]=(m[2]*(h-e)+w[2]*e)/h|0;for(let t=0;t<=C;t++,u++){if(!(0!==e&&e!==h||0!==t&&t!==C))continue;let r=0,n=0,g=0;for(let a=0;a<=3;a++)for(let o=0;o<=3;o++,g++){const c=D[e][a]*b[t][o];r+=i[s[g]][0]*c;n+=i[s[g]][1]*c}Q[u]=i.length;i.push([r,n]);E[u]=a.length;const o=new Uint8Array(3);o[0]=(d[0]*(C-t)+f[0]*t)/C|0;o[1]=(d[1]*(C-t)+f[1]*t)/C|0;o[2]=(d[2]*(C-t)+f[2]*t)/C|0;a.push(o)}}Q[0]=s[0];E[0]=r[0];Q[C]=s[3];E[C]=r[1];Q[l*h]=s[12];E[l*h]=r[2];Q[l*h+C]=s[15];E[l*h+C]=r[3];this.figures[e]={type:"lattice",coords:Q,colors:E,verticesPerRow:l}}_updateBounds(){let e=this.coords[0][0],t=this.coords[0][1],i=e,a=t;for(let s=1,r=this.coords.length;s<r;s++){const r=this.coords[s][0],n=this.coords[s][1];e=e>r?r:e;t=t>n?n:t;i=i<r?r:i;a=a<n?n:a}this.bounds=[e,t,i,a]}_packData(){let e,t,i,a;const s=this.coords,r=new Float32Array(2*s.length);for(e=0,i=0,t=s.length;e<t;e++){const t=s[e];r[i++]=t[0];r[i++]=t[1]}this.coords=r;const n=this.colors,g=new Uint8Array(3*n.length);for(e=0,i=0,t=n.length;e<t;e++){const t=n[e];g[i++]=t[0];g[i++]=t[1];g[i++]=t[2]}this.colors=g;const o=this.figures;for(e=0,t=o.length;e<t;e++){const t=o[e],s=t.coords,r=t.colors;for(i=0,a=s.length;i<a;i++){s[i]*=2;r[i]*=3}}}getIR(){const{bounds:e}=this;if(e[2]-e[0]==0||e[3]-e[1]==0)throw new FormatError(`Invalid MeshShading bounds: [${e}].`);return["Mesh",this.shadingType,this.coords,this.colors,this.figures,e,this.bbox,this.background]}}class DummyShading extends BaseShading{getIR(){return["Dummy"]}}function getTilingPatternIR(e,t,a){const s=lookupMatrix(t.getArray("Matrix"),i),r=lookupNormalRect(t.getArray("BBox"),null);if(!r||r[2]-r[0]==0||r[3]-r[1]==0)throw new FormatError("Invalid getTilingPatternIR /BBox array.");const n=t.get("XStep");if("number"!=typeof n)throw new FormatError("Invalid getTilingPatternIR /XStep value.");const g=t.get("YStep");if("number"!=typeof g)throw new FormatError("Invalid getTilingPatternIR /YStep value.");const o=t.get("PaintType");if(!Number.isInteger(o))throw new FormatError("Invalid getTilingPatternIR /PaintType value.");const c=t.get("TilingType");if(!Number.isInteger(c))throw new FormatError("Invalid getTilingPatternIR /TilingType value.");return["TilingPattern",a,e,s,r,n,g,o,c]}const wa=[1.3877,1,1,1,.97801,.92482,.89552,.91133,.81988,.97566,.98152,.93548,.93548,1.2798,.85284,.92794,1,.96134,1.54657,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.82845,.82845,.85284,.85284,.85284,.75859,.92138,.83908,.7762,.73293,.87289,.73133,.7514,.81921,.87356,.95958,.59526,.75727,.69225,1.04924,.9121,.86943,.79795,.88198,.77958,.70864,.81055,.90399,.88653,.96017,.82577,.77892,.78257,.97507,1.54657,.97507,.85284,.89552,.90176,.88762,.8785,.75241,.8785,.90518,.95015,.77618,.8785,.88401,.91916,.86304,.88401,.91488,.8785,.8801,.8785,.8785,.91343,.7173,1.04106,.8785,.85075,.95794,.82616,.85162,.79492,.88331,1.69808,.88331,.85284,.97801,.89552,.91133,.89552,.91133,1.7801,.89552,1.24487,1.13254,1.12401,.96839,.85284,.68787,.70645,.85592,.90747,1.01466,1.0088,.90323,1,1.07463,1,.91056,.75806,1.19118,.96839,.78864,.82845,.84133,.75859,.83908,.83908,.83908,.83908,.83908,.83908,.77539,.73293,.73133,.73133,.73133,.73133,.95958,.95958,.95958,.95958,.88506,.9121,.86943,.86943,.86943,.86943,.86943,.85284,.87508,.90399,.90399,.90399,.90399,.77892,.79795,.90807,.88762,.88762,.88762,.88762,.88762,.88762,.8715,.75241,.90518,.90518,.90518,.90518,.88401,.88401,.88401,.88401,.8785,.8785,.8801,.8801,.8801,.8801,.8801,.90747,.89049,.8785,.8785,.8785,.8785,.85162,.8785,.85162,.83908,.88762,.83908,.88762,.83908,.88762,.73293,.75241,.73293,.75241,.73293,.75241,.73293,.75241,.87289,.83016,.88506,.93125,.73133,.90518,.73133,.90518,.73133,.90518,.73133,.90518,.73133,.90518,.81921,.77618,.81921,.77618,.81921,.77618,1,1,.87356,.8785,.91075,.89608,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.76229,.90167,.59526,.91916,1,1,.86304,.69225,.88401,1,1,.70424,.79468,.91926,.88175,.70823,.94903,.9121,.8785,1,1,.9121,.8785,.87802,.88656,.8785,.86943,.8801,.86943,.8801,.86943,.8801,.87402,.89291,.77958,.91343,1,1,.77958,.91343,.70864,.7173,.70864,.7173,.70864,.7173,.70864,.7173,1,1,.81055,.75841,.81055,1.06452,.90399,.8785,.90399,.8785,.90399,.8785,.90399,.8785,.90399,.8785,.90399,.8785,.96017,.95794,.77892,.85162,.77892,.78257,.79492,.78257,.79492,.78257,.79492,.9297,.56892,.83908,.88762,.77539,.8715,.87508,.89049,1,1,.81055,1.04106,1.20528,1.20528,1,1.15543,.70674,.98387,.94721,1.33431,1.45894,.95161,1.06303,.83908,.80352,.57184,.6965,.56289,.82001,.56029,.81235,1.02988,.83908,.7762,.68156,.80367,.73133,.78257,.87356,.86943,.95958,.75727,.89019,1.04924,.9121,.7648,.86943,.87356,.79795,.78275,.81055,.77892,.9762,.82577,.99819,.84896,.95958,.77892,.96108,1.01407,.89049,1.02988,.94211,.96108,.8936,.84021,.87842,.96399,.79109,.89049,1.00813,1.02988,.86077,.87445,.92099,.84723,.86513,.8801,.75638,.85714,.78216,.79586,.87965,.94211,.97747,.78287,.97926,.84971,1.02988,.94211,.8801,.94211,.84971,.73133,1,1,1,1,1,1,1,1,1,1,1,1,.90264,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.90518,1,1,1,1,1,1,1,1,1,1,1,1,.90548,1,1,1,1,1,1,.96017,.95794,.96017,.95794,.96017,.95794,.77892,.85162,1,1,.89552,.90527,1,.90363,.92794,.92794,.92794,.92794,.87012,.87012,.87012,.89552,.89552,1.42259,.71143,1.06152,1,1,1.03372,1.03372,.97171,1.4956,2.2807,.93835,.83406,.91133,.84107,.91133,1,1,1,.72021,1,1.23108,.83489,.88525,.88525,.81499,.90527,1.81055,.90527,1.81055,1.31006,1.53711,.94434,1.08696,1,.95018,.77192,.85284,.90747,1.17534,.69825,.9716,1.37077,.90747,.90747,.85356,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.08004,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,.90727,.90727,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],Da={lineHeight:1.2207,lineGap:.2207},ba=[1.3877,1,1,1,.97801,.92482,.89552,.91133,.81988,.97566,.98152,.93548,.93548,1.2798,.85284,.92794,1,.96134,1.56239,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.82845,.82845,.85284,.85284,.85284,.75859,.92138,.83908,.7762,.71805,.87289,.73133,.7514,.81921,.87356,.95958,.59526,.75727,.69225,1.04924,.90872,.85938,.79795,.87068,.77958,.69766,.81055,.90399,.88653,.96068,.82577,.77892,.78257,.97507,1.529,.97507,.85284,.89552,.90176,.94908,.86411,.74012,.86411,.88323,.95015,.86411,.86331,.88401,.91916,.86304,.88401,.9039,.86331,.86331,.86411,.86411,.90464,.70852,1.04106,.86331,.84372,.95794,.82616,.84548,.79492,.88331,1.69808,.88331,.85284,.97801,.89552,.91133,.89552,.91133,1.7801,.89552,1.24487,1.13254,1.19129,.96839,.85284,.68787,.70645,.85592,.90747,1.01466,1.0088,.90323,1,1.07463,1,.91056,.75806,1.19118,.96839,.78864,.82845,.84133,.75859,.83908,.83908,.83908,.83908,.83908,.83908,.77539,.71805,.73133,.73133,.73133,.73133,.95958,.95958,.95958,.95958,.88506,.90872,.85938,.85938,.85938,.85938,.85938,.85284,.87068,.90399,.90399,.90399,.90399,.77892,.79795,.90807,.94908,.94908,.94908,.94908,.94908,.94908,.85887,.74012,.88323,.88323,.88323,.88323,.88401,.88401,.88401,.88401,.8785,.86331,.86331,.86331,.86331,.86331,.86331,.90747,.89049,.86331,.86331,.86331,.86331,.84548,.86411,.84548,.83908,.94908,.83908,.94908,.83908,.94908,.71805,.74012,.71805,.74012,.71805,.74012,.71805,.74012,.87289,.79538,.88506,.92726,.73133,.88323,.73133,.88323,.73133,.88323,.73133,.88323,.73133,.88323,.81921,.86411,.81921,.86411,.81921,.86411,1,1,.87356,.86331,.91075,.8777,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.76467,.90167,.59526,.91916,1,1,.86304,.69225,.88401,1,1,.70424,.77312,.91926,.88175,.70823,.94903,.90872,.86331,1,1,.90872,.86331,.86906,.88116,.86331,.85938,.86331,.85938,.86331,.85938,.86331,.87402,.86549,.77958,.90464,1,1,.77958,.90464,.69766,.70852,.69766,.70852,.69766,.70852,.69766,.70852,1,1,.81055,.75841,.81055,1.06452,.90399,.86331,.90399,.86331,.90399,.86331,.90399,.86331,.90399,.86331,.90399,.86331,.96068,.95794,.77892,.84548,.77892,.78257,.79492,.78257,.79492,.78257,.79492,.9297,.56892,.83908,.94908,.77539,.85887,.87068,.89049,1,1,.81055,1.04106,1.20528,1.20528,1,1.15543,.70088,.98387,.94721,1.33431,1.45894,.95161,1.48387,.83908,.80352,.57118,.6965,.56347,.79179,.55853,.80346,1.02988,.83908,.7762,.67174,.86036,.73133,.78257,.87356,.86441,.95958,.75727,.89019,1.04924,.90872,.74889,.85938,.87891,.79795,.7957,.81055,.77892,.97447,.82577,.97466,.87179,.95958,.77892,.94252,.95612,.8753,1.02988,.92733,.94252,.87411,.84021,.8728,.95612,.74081,.8753,1.02189,1.02988,.84814,.87445,.91822,.84723,.85668,.86331,.81344,.87581,.76422,.82046,.96057,.92733,.99375,.78022,.95452,.86015,1.02988,.92733,.86331,.92733,.86015,.73133,1,1,1,1,1,1,1,1,1,1,1,1,.90631,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.88323,1,1,1,1,1,1,1,1,1,1,1,1,.85174,1,1,1,1,1,1,.96068,.95794,.96068,.95794,.96068,.95794,.77892,.84548,1,1,.89552,.90527,1,.90363,.92794,.92794,.92794,.89807,.87012,.87012,.87012,.89552,.89552,1.42259,.71094,1.06152,1,1,1.03372,1.03372,.97171,1.4956,2.2807,.92972,.83406,.91133,.83326,.91133,1,1,1,.72021,1,1.23108,.83489,.88525,.88525,.81499,.90616,1.81055,.90527,1.81055,1.3107,1.53711,.94434,1.08696,1,.95018,.77192,.85284,.90747,1.17534,.69825,.9716,1.37077,.90747,.90747,.85356,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.08004,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,.90727,.90727,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],Fa={lineHeight:1.2207,lineGap:.2207},Sa=[1.3877,1,1,1,1.17223,1.1293,.89552,.91133,.80395,1.02269,1.15601,.91056,.91056,1.2798,.85284,.89807,1,.90861,1.39543,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.96309,.96309,.85284,.85284,.85284,.83319,.88071,.8675,.81552,.72346,.85193,.73206,.7522,.81105,.86275,.90685,.6377,.77892,.75593,1.02638,.89249,.84118,.77452,.85374,.75186,.67789,.79776,.88844,.85066,.94309,.77818,.7306,.76659,1.10369,1.38313,1.10369,1.06139,.89552,.8739,.9245,.9245,.83203,.9245,.85865,1.09842,.9245,.9245,1.03297,1.07692,.90918,1.03297,.94959,.9245,.92274,.9245,.9245,1.02933,.77832,1.20562,.9245,.8916,.98986,.86621,.89453,.79004,.94152,1.77256,.94152,.85284,.97801,.89552,.91133,.89552,.91133,1.91729,.89552,1.17889,1.13254,1.16359,.92098,.85284,.68787,.71353,.84737,.90747,1.0088,1.0044,.87683,1,1.09091,1,.92229,.739,1.15642,.92098,.76288,.80504,.80972,.75859,.8675,.8675,.8675,.8675,.8675,.8675,.76318,.72346,.73206,.73206,.73206,.73206,.90685,.90685,.90685,.90685,.86477,.89249,.84118,.84118,.84118,.84118,.84118,.85284,.84557,.88844,.88844,.88844,.88844,.7306,.77452,.86331,.9245,.9245,.9245,.9245,.9245,.9245,.84843,.83203,.85865,.85865,.85865,.85865,.82601,.82601,.82601,.82601,.94469,.9245,.92274,.92274,.92274,.92274,.92274,.90747,.86651,.9245,.9245,.9245,.9245,.89453,.9245,.89453,.8675,.9245,.8675,.9245,.8675,.9245,.72346,.83203,.72346,.83203,.72346,.83203,.72346,.83203,.85193,.8875,.86477,.99034,.73206,.85865,.73206,.85865,.73206,.85865,.73206,.85865,.73206,.85865,.81105,.9245,.81105,.9245,.81105,.9245,1,1,.86275,.9245,.90872,.93591,.90685,.82601,.90685,.82601,.90685,.82601,.90685,1.03297,.90685,.82601,.77896,1.05611,.6377,1.07692,1,1,.90918,.75593,1.03297,1,1,.76032,.9375,.98156,.93407,.77261,1.11429,.89249,.9245,1,1,.89249,.9245,.92534,.86698,.9245,.84118,.92274,.84118,.92274,.84118,.92274,.8667,.86291,.75186,1.02933,1,1,.75186,1.02933,.67789,.77832,.67789,.77832,.67789,.77832,.67789,.77832,1,1,.79776,.97655,.79776,1.23023,.88844,.9245,.88844,.9245,.88844,.9245,.88844,.9245,.88844,.9245,.88844,.9245,.94309,.98986,.7306,.89453,.7306,.76659,.79004,.76659,.79004,.76659,.79004,1.09231,.54873,.8675,.9245,.76318,.84843,.84557,.86651,1,1,.79776,1.20562,1.18622,1.18622,1,1.1437,.67009,.96334,.93695,1.35191,1.40909,.95161,1.48387,.8675,.90861,.6192,.7363,.64824,.82411,.56321,.85696,1.23516,.8675,.81552,.7286,.84134,.73206,.76659,.86275,.84369,.90685,.77892,.85871,1.02638,.89249,.75828,.84118,.85984,.77452,.76466,.79776,.7306,.90782,.77818,.903,.87291,.90685,.7306,.99058,1.03667,.94635,1.23516,.9849,.99058,.92393,.8916,.942,1.03667,.75026,.94635,1.0297,1.23516,.90918,.94048,.98217,.89746,.84153,.92274,.82507,.88832,.84438,.88178,1.03525,.9849,1.00225,.78086,.97248,.89404,1.23516,.9849,.92274,.9849,.89404,.73206,1,1,1,1,1,1,1,1,1,1,1,1,.89693,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.85865,1,1,1,1,1,1,1,1,1,1,1,1,.90933,1,1,1,1,1,1,.94309,.98986,.94309,.98986,.94309,.98986,.7306,.89453,1,1,.89552,.90527,1,.90186,1.12308,1.12308,1.12308,1.12308,1.2566,1.2566,1.2566,.89552,.89552,1.42259,.68994,1.03809,1,1,1.0176,1.0176,1.11523,1.4956,2.01462,.97858,.82616,.91133,.83437,.91133,1,1,1,.70508,1,1.23108,.79801,.84426,.84426,.774,.90572,1.81055,.90749,1.81055,1.28809,1.55469,.94434,1.07806,1,.97094,.7589,.85284,.90747,1.19658,.69825,.97622,1.33512,.90747,.90747,.85284,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.0336,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,1.05859,1.05859,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],ka={lineHeight:1.2207,lineGap:.2207},Ra=[1.3877,1,1,1,1.17223,1.1293,.89552,.91133,.80395,1.02269,1.15601,.91056,.91056,1.2798,.85284,.89807,1,.90861,1.39016,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.96309,.96309,.85284,.85284,.85284,.83319,.88071,.8675,.81552,.73834,.85193,.73206,.7522,.81105,.86275,.90685,.6377,.77892,.75593,1.02638,.89385,.85122,.77452,.86503,.75186,.68887,.79776,.88844,.85066,.94258,.77818,.7306,.76659,1.10369,1.39016,1.10369,1.06139,.89552,.8739,.86128,.94469,.8457,.94469,.89464,1.09842,.84636,.94469,1.03297,1.07692,.90918,1.03297,.95897,.94469,.9482,.94469,.94469,1.04692,.78223,1.20562,.94469,.90332,.98986,.86621,.90527,.79004,.94152,1.77256,.94152,.85284,.97801,.89552,.91133,.89552,.91133,1.91729,.89552,1.17889,1.13254,1.08707,.92098,.85284,.68787,.71353,.84737,.90747,1.0088,1.0044,.87683,1,1.09091,1,.92229,.739,1.15642,.92098,.76288,.80504,.80972,.75859,.8675,.8675,.8675,.8675,.8675,.8675,.76318,.73834,.73206,.73206,.73206,.73206,.90685,.90685,.90685,.90685,.86477,.89385,.85122,.85122,.85122,.85122,.85122,.85284,.85311,.88844,.88844,.88844,.88844,.7306,.77452,.86331,.86128,.86128,.86128,.86128,.86128,.86128,.8693,.8457,.89464,.89464,.89464,.89464,.82601,.82601,.82601,.82601,.94469,.94469,.9482,.9482,.9482,.9482,.9482,.90747,.86651,.94469,.94469,.94469,.94469,.90527,.94469,.90527,.8675,.86128,.8675,.86128,.8675,.86128,.73834,.8457,.73834,.8457,.73834,.8457,.73834,.8457,.85193,.92454,.86477,.9921,.73206,.89464,.73206,.89464,.73206,.89464,.73206,.89464,.73206,.89464,.81105,.84636,.81105,.84636,.81105,.84636,1,1,.86275,.94469,.90872,.95786,.90685,.82601,.90685,.82601,.90685,.82601,.90685,1.03297,.90685,.82601,.77741,1.05611,.6377,1.07692,1,1,.90918,.75593,1.03297,1,1,.76032,.90452,.98156,1.11842,.77261,1.11429,.89385,.94469,1,1,.89385,.94469,.95877,.86901,.94469,.85122,.9482,.85122,.9482,.85122,.9482,.8667,.90016,.75186,1.04692,1,1,.75186,1.04692,.68887,.78223,.68887,.78223,.68887,.78223,.68887,.78223,1,1,.79776,.92188,.79776,1.23023,.88844,.94469,.88844,.94469,.88844,.94469,.88844,.94469,.88844,.94469,.88844,.94469,.94258,.98986,.7306,.90527,.7306,.76659,.79004,.76659,.79004,.76659,.79004,1.09231,.54873,.8675,.86128,.76318,.8693,.85311,.86651,1,1,.79776,1.20562,1.18622,1.18622,1,1.1437,.67742,.96334,.93695,1.35191,1.40909,.95161,1.48387,.86686,.90861,.62267,.74359,.65649,.85498,.56963,.88254,1.23516,.8675,.81552,.75443,.84503,.73206,.76659,.86275,.85122,.90685,.77892,.85746,1.02638,.89385,.75657,.85122,.86275,.77452,.74171,.79776,.7306,.95165,.77818,.89772,.88831,.90685,.7306,.98142,1.02191,.96576,1.23516,.99018,.98142,.9236,.89258,.94035,1.02191,.78848,.96576,.9561,1.23516,.90918,.92578,.95424,.89746,.83969,.9482,.80113,.89442,.85208,.86155,.98022,.99018,1.00452,.81209,.99247,.89181,1.23516,.99018,.9482,.99018,.89181,.73206,1,1,1,1,1,1,1,1,1,1,1,1,.88844,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.89464,1,1,1,1,1,1,1,1,1,1,1,1,.96766,1,1,1,1,1,1,.94258,.98986,.94258,.98986,.94258,.98986,.7306,.90527,1,1,.89552,.90527,1,.90186,1.12308,1.12308,1.12308,1.12308,1.2566,1.2566,1.2566,.89552,.89552,1.42259,.69043,1.03809,1,1,1.0176,1.0176,1.11523,1.4956,2.01462,.99331,.82616,.91133,.84286,.91133,1,1,1,.70508,1,1.23108,.79801,.84426,.84426,.774,.90527,1.81055,.90527,1.81055,1.28809,1.55469,.94434,1.07806,1,.97094,.7589,.85284,.90747,1.19658,.69825,.97622,1.33512,.90747,.90747,.85356,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.0336,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,1.05859,1.05859,1,1,1,1.07185,.99413,.96334,1.08065,1,1,1,1,1,1,1,1,1,1,1],Na={lineHeight:1.2207,lineGap:.2207},Ga=[.76116,1,1,1.0006,.99998,.99974,.99973,.99973,.99982,.99977,1.00087,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99998,1,1.00003,1.00003,1.00003,1.00026,.9999,.99977,.99977,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,.99973,.99977,1.00026,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,.99998,1.0006,.99998,1.00003,.99973,.99998,.99973,1.00026,.99973,1.00026,.99973,.99998,1.00026,1.00026,1.0006,1.0006,.99973,1.0006,.99982,1.00026,1.00026,1.00026,1.00026,.99959,.99973,.99998,1.00026,.99973,1.00022,.99973,.99973,1,.99959,1.00077,.99959,1.00003,.99998,.99973,.99973,.99973,.99973,1.00077,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.99973,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,.99977,.99977,.99977,.99977,.99977,.99977,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,.99973,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.06409,1.00026,1.00026,1.00026,1.00026,1.00026,.99973,1.00026,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,1.03374,.99977,1.00026,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,.99977,1.00026,.99977,1.00026,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.00042,.99973,.99973,1.0006,.99977,.99973,.99973,1.00026,1.0006,1.00026,1.0006,1.00026,1.03828,1.00026,.99999,1.00026,1.0006,.99977,1.00026,.99977,1.00026,.99977,1.00026,.9993,.9998,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1,1.00016,.99977,.99959,.99977,.99959,.99977,.99959,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00026,.99998,1.00026,.8121,1.00026,.99998,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,1.00016,1.00022,1.00001,.99973,1.00001,1.00026,1,1.00026,1,1.00026,1,1.0006,.99973,.99977,.99973,1,.99982,1.00022,1.00026,1.00001,.99973,1.00026,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,1.00034,.99977,1,.99997,1.00026,1.00078,1.00036,.99973,1.00013,1.0006,.99977,.99977,.99988,.85148,1.00001,1.00026,.99977,1.00022,1.0006,.99977,1.00001,.99999,.99977,1.00069,1.00022,.99977,1.00001,.99984,1.00026,1.00001,1.00024,1.00001,.9999,1,1.0006,1.00001,1.00041,.99962,1.00026,1.0006,.99995,1.00041,.99942,.99973,.99927,1.00082,.99902,1.00026,1.00087,1.0006,1.00069,.99973,.99867,.99973,.9993,1.00026,1.00049,1.00056,1,.99988,.99935,.99995,.99954,1.00055,.99945,1.00032,1.0006,.99995,1.00026,.99995,1.00032,1.00001,1.00008,.99971,1.00019,.9994,1.00001,1.0006,1.00044,.99973,1.00023,1.00047,1,.99942,.99561,.99989,1.00035,.99977,1.00035,.99977,1.00019,.99944,1.00001,1.00021,.99926,1.00035,1.00035,.99942,1.00048,.99999,.99977,1.00022,1.00035,1.00001,.99977,1.00026,.99989,1.00057,1.00001,.99936,1.00052,1.00012,.99996,1.00043,1,1.00035,.9994,.99976,1.00035,.99973,1.00052,1.00041,1.00119,1.00037,.99973,1.00002,.99986,1.00041,1.00041,.99902,.9996,1.00034,.99999,1.00026,.99999,1.00026,.99973,1.00052,.99973,1,.99973,1.00041,1.00075,.9994,1.0003,.99999,1,1.00041,.99955,1,.99915,.99973,.99973,1.00026,1.00119,.99955,.99973,1.0006,.99911,1.0006,1.00026,.99972,1.00026,.99902,1.00041,.99973,.99999,1,1,1.00038,1.0005,1.00016,1.00022,1.00016,1.00022,1.00016,1.00022,1.00001,.99973,1,1,.99973,1,1,.99955,1.0006,1.0006,1.0006,1.0006,1,1,1,.99973,.99973,.99972,1,1,1.00106,.99999,.99998,.99998,.99999,.99998,1.66475,1,.99973,.99973,1.00023,.99973,.99971,1.00047,1.00023,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1,1,1,1,1,1,1,.99972,1,1.20985,1.39713,1.00003,1.00031,1.00015,1,.99561,1.00027,1.00031,1.00031,.99915,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.99972,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,.99998,.99998,.99998,.99998,1,1,1,1,1,1,1,1,1,1,1],xa={lineHeight:1.2,lineGap:.2},Ua=[.76116,1,1,1.0006,.99998,.99974,.99973,.99973,.99982,.99977,1.00087,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99998,1,1.00003,1.00003,1.00003,1.00026,.9999,.99977,.99977,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,.99973,.99977,1.00026,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,.99998,1.0006,.99998,1.00003,.99973,.99998,.99973,1.00026,.99973,1.00026,.99973,.99998,1.00026,1.00026,1.0006,1.0006,.99973,1.0006,.99982,1.00026,1.00026,1.00026,1.00026,.99959,.99973,.99998,1.00026,.99973,1.00022,.99973,.99973,1,.99959,1.00077,.99959,1.00003,.99998,.99973,.99973,.99973,.99973,1.00077,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.99973,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,.99977,.99977,.99977,.99977,.99977,.99977,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,.99973,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.06409,1.00026,1.00026,1.00026,1.00026,1.00026,.99973,1.00026,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,1.0044,.99977,1.00026,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,.99977,1.00026,.99977,1.00026,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,.99971,.99973,.99973,1.0006,.99977,.99973,.99973,1.00026,1.0006,1.00026,1.0006,1.00026,1.01011,1.00026,.99999,1.00026,1.0006,.99977,1.00026,.99977,1.00026,.99977,1.00026,.9993,.9998,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1,1.00016,.99977,.99959,.99977,.99959,.99977,.99959,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00026,.99998,1.00026,.8121,1.00026,.99998,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,1.00016,1.00022,1.00001,.99973,1.00001,1.00026,1,1.00026,1,1.00026,1,1.0006,.99973,.99977,.99973,1,.99982,1.00022,1.00026,1.00001,.99973,1.00026,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99977,1,1,1.00026,.99969,.99972,.99981,.9998,1.0006,.99977,.99977,1.00022,.91155,1.00001,1.00026,.99977,1.00022,1.0006,.99977,1.00001,.99999,.99977,.99966,1.00022,1.00032,1.00001,.99944,1.00026,1.00001,.99968,1.00001,1.00047,1,1.0006,1.00001,.99981,1.00101,1.00026,1.0006,.99948,.99981,1.00064,.99973,.99942,1.00101,1.00061,1.00026,1.00069,1.0006,1.00014,.99973,1.01322,.99973,1.00065,1.00026,1.00012,.99923,1,1.00064,1.00076,.99948,1.00055,1.00063,1.00007,.99943,1.0006,.99948,1.00026,.99948,.99943,1.00001,1.00001,1.00029,1.00038,1.00035,1.00001,1.0006,1.0006,.99973,.99978,1.00001,1.00057,.99989,.99967,.99964,.99967,.99977,.99999,.99977,1.00038,.99977,1.00001,.99973,1.00066,.99967,.99967,1.00041,.99998,.99999,.99977,1.00022,.99967,1.00001,.99977,1.00026,.99964,1.00031,1.00001,.99999,.99999,1,1.00023,1,1,.99999,1.00035,1.00001,.99999,.99973,.99977,.99999,1.00058,.99973,.99973,.99955,.9995,1.00026,1.00026,1.00032,.99989,1.00034,.99999,1.00026,1.00026,1.00026,.99973,.45998,.99973,1.00026,.99973,1.00001,.99999,.99982,.99994,.99996,1,1.00042,1.00044,1.00029,1.00023,.99973,.99973,1.00026,.99949,1.00002,.99973,1.0006,1.0006,1.0006,.99975,1.00026,1.00026,1.00032,.98685,.99973,1.00026,1,1,.99966,1.00044,1.00016,1.00022,1.00016,1.00022,1.00016,1.00022,1.00001,.99973,1,1,.99973,1,1,.99955,1.0006,1.0006,1.0006,1.0006,1,1,1,.99973,.99973,.99972,1,1,1.00106,.99999,.99998,.99998,.99999,.99998,1.66475,1,.99973,.99973,1,.99973,.99971,.99978,1,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1.00098,1,1,1,1.00049,1,1,.99972,1,1.20985,1.39713,1.00003,1.00031,1.00015,1,.99561,1.00027,1.00031,1.00031,.99915,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.99972,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,.99998,.99998,.99998,.99998,1,1,1,1,1,1,1,1,1,1,1],Ma={lineHeight:1.35,lineGap:.2},La=[.76116,1,1,1.0006,1.0006,1.00006,.99973,.99973,.99982,1.00001,1.00043,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.0006,1,1.00003,1.00003,1.00003,.99973,.99987,1.00001,1.00001,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,1,1.00001,.99973,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,1.0006,1.0006,1.0006,.99949,.99973,.99998,.99973,.99973,1,.99973,.99973,1.0006,.99973,.99973,.99924,.99924,1,.99924,.99999,.99973,.99973,.99973,.99973,.99998,1,1.0006,.99973,1,.99977,1,1,1,1.00005,1.0009,1.00005,1.00003,.99998,.99973,.99973,.99973,.99973,1.0009,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.9998,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,1.00001,1.00001,1.00001,1.00001,1.00001,1.00001,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,1,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.06409,1.00026,.99973,.99973,.99973,.99973,1,.99973,1,1.00001,.99973,1.00001,.99973,1.00001,.99973,.99977,1,.99977,1,.99977,1,.99977,1,.99977,1.0288,.99977,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,.99977,.99973,.99977,.99973,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,.99924,1.0006,1.0006,.99946,1.00034,1,.99924,1.00001,1,1,.99973,.99924,.99973,.99924,.99973,1.06311,.99973,1.00024,.99973,.99924,.99977,.99973,.99977,.99973,.99977,.99973,1.00041,.9998,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1,1.00016,.99977,.99998,.99977,.99998,.99977,.99998,1.00001,1,1.00001,1,1.00001,1,1.00001,1,1.00026,1.0006,1.00026,.89547,1.00026,1.0006,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,1.00016,.99977,1.00001,1,1.00001,1.00026,1,1.00026,1,1.00026,1,.99924,.99973,1.00001,.99973,1,.99982,1.00022,1.00026,1.00001,1,1.00026,1.0006,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,1.00001,1,1.00054,.99977,1.00084,1.00007,.99973,1.00013,.99924,1.00001,1.00001,.99945,.91221,1.00001,1.00026,.99977,1.00022,1.0006,1.00001,1.00001,.99999,.99977,.99933,1.00022,1.00054,1.00001,1.00065,1.00026,1.00001,1.0001,1.00001,1.00052,1,1.0006,1.00001,.99945,.99897,.99968,.99924,1.00036,.99945,.99949,1,1.0006,.99897,.99918,.99968,.99911,.99924,1,.99962,1.01487,1,1.0005,.99973,1.00012,1.00043,1,.99995,.99994,1.00036,.99947,1.00019,1.00063,1.00025,.99924,1.00036,.99973,1.00036,1.00025,1.00001,1.00001,1.00027,1.0001,1.00068,1.00001,1.0006,1.0006,1,1.00008,.99957,.99972,.9994,.99954,.99975,1.00051,1.00001,1.00019,1.00001,1.0001,.99986,1.00001,1.00001,1.00038,.99954,.99954,.9994,1.00066,.99999,.99977,1.00022,1.00054,1.00001,.99977,1.00026,.99975,1.0001,1.00001,.99993,.9995,.99955,1.00016,.99978,.99974,1.00019,1.00022,.99955,1.00053,.99973,1.00089,1.00005,.99967,1.00048,.99973,1.00002,1.00034,.99973,.99973,.99964,1.00006,1.00066,.99947,.99973,.98894,.99973,1,.44898,1,.99946,1,1.00039,1.00082,.99991,.99991,.99985,1.00022,1.00023,1.00061,1.00006,.99966,.99973,.99973,.99973,1.00019,1.0008,1,.99924,.99924,.99924,.99983,1.00044,.99973,.99964,.98332,1,.99973,1,1,.99962,.99895,1.00016,.99977,1.00016,.99977,1.00016,.99977,1.00001,1,1,1,.99973,1,1,.99955,.99924,.99924,.99924,.99924,.99998,.99998,.99998,.99973,.99973,.99972,1,1,1.00267,.99999,.99998,.99998,1,.99998,1.66475,1,.99973,.99973,1.00023,.99973,1.00423,.99925,.99999,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1.00049,1,1.00245,1,1,1,1,.96329,1,1.20985,1.39713,1.00003,.8254,1.00015,1,1.00035,1.00027,1.00031,1.00031,1.00003,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.95317,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,.99998,.99998,.99998,.99998,1,1,1,1,1,1,1,1,1,1,1],Ha={lineHeight:1.35,lineGap:.2},Ja=[.76116,1,1,1.0006,1.0006,1.00006,.99973,.99973,.99982,1.00001,1.00043,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.0006,1,1.00003,1.00003,1.00003,.99973,.99987,1.00001,1.00001,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,1,1.00001,.99973,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,1.0006,1.0006,1.0006,.99949,.99973,.99998,.99973,.99973,1,.99973,.99973,1.0006,.99973,.99973,.99924,.99924,1,.99924,.99999,.99973,.99973,.99973,.99973,.99998,1,1.0006,.99973,1,.99977,1,1,1,1.00005,1.0009,1.00005,1.00003,.99998,.99973,.99973,.99973,.99973,1.0009,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.9998,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,1.00001,1.00001,1.00001,1.00001,1.00001,1.00001,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,1,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.06409,1.00026,.99973,.99973,.99973,.99973,1,.99973,1,1.00001,.99973,1.00001,.99973,1.00001,.99973,.99977,1,.99977,1,.99977,1,.99977,1,.99977,1.04596,.99977,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,.99977,.99973,.99977,.99973,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,.99924,1.0006,1.0006,1.00019,1.00034,1,.99924,1.00001,1,1,.99973,.99924,.99973,.99924,.99973,1.02572,.99973,1.00005,.99973,.99924,.99977,.99973,.99977,.99973,.99977,.99973,.99999,.9998,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1,1.00016,.99977,.99998,.99977,.99998,.99977,.99998,1.00001,1,1.00001,1,1.00001,1,1.00001,1,1.00026,1.0006,1.00026,.84533,1.00026,1.0006,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,1.00016,.99977,1.00001,1,1.00001,1.00026,1,1.00026,1,1.00026,1,.99924,.99973,1.00001,.99973,1,.99982,1.00022,1.00026,1.00001,1,1.00026,1.0006,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99928,1,.99977,1.00013,1.00055,.99947,.99945,.99941,.99924,1.00001,1.00001,1.0004,.91621,1.00001,1.00026,.99977,1.00022,1.0006,1.00001,1.00005,.99999,.99977,1.00015,1.00022,.99977,1.00001,.99973,1.00026,1.00001,1.00019,1.00001,.99946,1,1.0006,1.00001,.99978,1.00045,.99973,.99924,1.00023,.99978,.99966,1,1.00065,1.00045,1.00019,.99973,.99973,.99924,1,1,.96499,1,1.00055,.99973,1.00008,1.00027,1,.9997,.99995,1.00023,.99933,1.00019,1.00015,1.00031,.99924,1.00023,.99973,1.00023,1.00031,1.00001,.99928,1.00029,1.00092,1.00035,1.00001,1.0006,1.0006,1,.99988,.99975,1,1.00082,.99561,.9996,1.00035,1.00001,.99962,1.00001,1.00092,.99964,1.00001,.99963,.99999,1.00035,1.00035,1.00082,.99962,.99999,.99977,1.00022,1.00035,1.00001,.99977,1.00026,.9996,.99967,1.00001,1.00034,1.00074,1.00054,1.00053,1.00063,.99971,.99962,1.00035,.99975,.99977,.99973,1.00043,.99953,1.0007,.99915,.99973,1.00008,.99892,1.00073,1.00073,1.00114,.99915,1.00073,.99955,.99973,1.00092,.99973,1,.99998,1,1.0003,1,1.00043,1.00001,.99969,1.0003,1,1.00035,1.00001,.9995,1,1.00092,.99973,.99973,.99973,1.0007,.9995,1,.99924,1.0006,.99924,.99972,1.00062,.99973,1.00114,1.00073,1,.99955,1,1,1.00047,.99968,1.00016,.99977,1.00016,.99977,1.00016,.99977,1.00001,1,1,1,.99973,1,1,.99955,.99924,.99924,.99924,.99924,.99998,.99998,.99998,.99973,.99973,.99972,1,1,1.00267,.99999,.99998,.99998,1,.99998,1.66475,1,.99973,.99973,1.00023,.99973,.99971,.99925,1.00023,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1,1,1,1,1,1,1,.96329,1,1.20985,1.39713,1.00003,.8254,1.00015,1,1.00035,1.00027,1.00031,1.00031,.99915,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.95317,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],Ya={lineHeight:1.2,lineGap:.2},va=[365,0,333,278,333,474,556,556,889,722,238,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584,584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833,722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333,584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889,611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389,584,333,556,556,556,556,280,556,333,737,370,556,584,737,552,400,549,333,333,333,576,556,278,333,333,365,556,834,834,834,611,722,722,722,722,722,722,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278,278,278,611,611,611,611,611,611,611,549,611,611,611,611,611,556,611,556,722,556,722,556,722,556,722,556,722,556,722,556,722,556,722,719,722,611,667,556,667,556,667,556,667,556,667,556,778,611,778,611,778,611,778,611,722,611,722,611,278,278,278,278,278,278,278,278,278,278,785,556,556,278,722,556,556,611,278,611,278,611,385,611,479,611,278,722,611,722,611,722,611,708,723,611,778,611,778,611,778,611,1e3,944,722,389,722,389,722,389,667,556,667,556,667,556,667,556,611,333,611,479,611,333,722,611,722,611,722,611,722,611,722,611,722,611,944,778,667,556,667,611,500,611,500,611,500,278,556,722,556,1e3,889,778,611,667,556,611,333,333,333,333,333,333,333,333,333,333,333,465,722,333,853,906,474,825,927,838,278,722,722,601,719,667,611,722,778,278,722,667,833,722,644,778,722,667,600,611,667,821,667,809,802,278,667,615,451,611,278,582,615,610,556,606,475,460,611,541,278,558,556,612,556,445,611,766,619,520,684,446,582,715,576,753,845,278,582,611,582,845,667,669,885,567,711,667,278,276,556,1094,1062,875,610,722,622,719,722,719,722,567,712,667,904,626,719,719,610,702,833,722,778,719,667,722,611,622,854,667,730,703,1005,1019,870,979,719,711,1031,719,556,618,615,417,635,556,709,497,615,615,500,635,740,604,611,604,611,556,490,556,875,556,615,581,833,844,729,854,615,552,854,583,556,556,611,417,552,556,278,281,278,969,906,611,500,615,556,604,778,611,487,447,944,778,944,778,944,778,667,556,333,333,556,1e3,1e3,552,278,278,278,278,500,500,500,556,556,350,1e3,1e3,240,479,333,333,604,333,167,396,556,556,1094,556,885,489,1115,1e3,768,600,834,834,834,834,1e3,500,1e3,500,1e3,500,500,494,612,823,713,584,549,713,979,722,274,549,549,583,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,611,611,333,333,333,333,333,333,333,333,222,222,333,333,333,333,333,333,333,333],Ka=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],Ta=[365,0,333,278,333,474,556,556,889,722,238,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584,584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833,722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333,584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889,611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389,584,333,556,556,556,556,280,556,333,737,370,556,584,737,552,400,549,333,333,333,576,556,278,333,333,365,556,834,834,834,611,722,722,722,722,722,722,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278,278,278,611,611,611,611,611,611,611,549,611,611,611,611,611,556,611,556,722,556,722,556,722,556,722,556,722,556,722,556,722,556,722,740,722,611,667,556,667,556,667,556,667,556,667,556,778,611,778,611,778,611,778,611,722,611,722,611,278,278,278,278,278,278,278,278,278,278,782,556,556,278,722,556,556,611,278,611,278,611,396,611,479,611,278,722,611,722,611,722,611,708,723,611,778,611,778,611,778,611,1e3,944,722,389,722,389,722,389,667,556,667,556,667,556,667,556,611,333,611,479,611,333,722,611,722,611,722,611,722,611,722,611,722,611,944,778,667,556,667,611,500,611,500,611,500,278,556,722,556,1e3,889,778,611,667,556,611,333,333,333,333,333,333,333,333,333,333,333,333,722,333,854,906,473,844,930,847,278,722,722,610,671,667,611,722,778,278,722,667,833,722,657,778,718,667,590,611,667,822,667,829,781,278,667,620,479,611,278,591,620,621,556,610,479,492,611,558,278,566,556,603,556,450,611,712,605,532,664,409,591,704,578,773,834,278,591,611,591,834,667,667,886,614,719,667,278,278,556,1094,1042,854,622,719,677,719,722,708,722,614,722,667,927,643,719,719,615,687,833,722,778,719,667,722,611,677,781,667,729,708,979,989,854,1e3,708,719,1042,729,556,619,604,534,618,556,736,510,611,611,507,622,740,604,611,611,611,556,889,556,885,556,646,583,889,935,707,854,594,552,865,589,556,556,611,469,563,556,278,278,278,969,906,611,507,619,556,611,778,611,575,467,944,778,944,778,944,778,667,556,333,333,556,1e3,1e3,552,278,278,278,278,500,500,500,556,556,350,1e3,1e3,240,479,333,333,604,333,167,396,556,556,1104,556,885,516,1146,1e3,768,600,834,834,834,834,999,500,1e3,500,1e3,500,500,494,612,823,713,584,549,713,979,722,274,549,549,583,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,611,611,333,333,333,333,333,333,333,333,222,222,333,333,333,333,333,333,333,333],qa=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],Oa=[365,0,333,278,278,355,556,556,889,667,191,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584,584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833,722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278,469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833,556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334,584,333,556,556,556,556,260,556,333,737,370,556,584,737,552,400,549,333,333,333,576,537,278,333,333,365,556,834,834,834,611,667,667,667,667,667,667,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278,278,278,556,556,556,556,556,556,556,549,611,556,556,556,556,500,556,500,667,556,667,556,667,556,722,500,722,500,722,500,722,500,722,625,722,556,667,556,667,556,667,556,667,556,667,556,778,556,778,556,778,556,778,556,722,556,722,556,278,278,278,278,278,278,278,222,278,278,733,444,500,222,667,500,500,556,222,556,222,556,281,556,400,556,222,722,556,722,556,722,556,615,723,556,778,556,778,556,778,556,1e3,944,722,333,722,333,722,333,667,500,667,500,667,500,667,500,611,278,611,354,611,278,722,556,722,556,722,556,722,556,722,556,722,556,944,722,667,500,667,611,500,611,500,611,500,222,556,667,556,1e3,889,778,611,667,500,611,278,333,333,333,333,333,333,333,333,333,333,333,667,278,789,846,389,794,865,775,222,667,667,570,671,667,611,722,778,278,667,667,833,722,648,778,725,667,600,611,667,837,667,831,761,278,667,570,439,555,222,550,570,571,500,556,439,463,555,542,222,500,492,548,500,447,556,670,573,486,603,374,550,652,546,728,779,222,550,556,550,779,667,667,843,544,708,667,278,278,500,1066,982,844,589,715,639,724,667,651,667,544,704,667,917,614,715,715,589,686,833,722,778,725,667,722,611,639,795,667,727,673,920,923,805,886,651,694,1022,682,556,562,522,493,553,556,688,465,556,556,472,564,686,550,556,556,556,500,833,500,835,500,572,518,830,851,621,736,526,492,752,534,556,556,556,378,496,500,222,222,222,910,828,556,472,565,500,556,778,556,492,339,944,722,944,722,944,722,667,500,333,333,556,1e3,1e3,552,222,222,222,222,333,333,333,556,556,350,1e3,1e3,188,354,333,333,500,333,167,365,556,556,1094,556,885,323,1083,1e3,768,600,834,834,834,834,1e3,500,998,500,1e3,500,500,494,612,823,713,584,549,713,979,719,274,549,549,584,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,500,500,333,333,333,333,333,333,333,333,222,222,294,294,324,324,316,328,398,285],Pa=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],Wa=[365,0,333,278,278,355,556,556,889,667,191,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584,584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833,722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278,469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833,556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334,584,333,556,556,556,556,260,556,333,737,370,556,584,737,552,400,549,333,333,333,576,537,278,333,333,365,556,834,834,834,611,667,667,667,667,667,667,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278,278,278,556,556,556,556,556,556,556,549,611,556,556,556,556,500,556,500,667,556,667,556,667,556,722,500,722,500,722,500,722,500,722,615,722,556,667,556,667,556,667,556,667,556,667,556,778,556,778,556,778,556,778,556,722,556,722,556,278,278,278,278,278,278,278,222,278,278,735,444,500,222,667,500,500,556,222,556,222,556,292,556,334,556,222,722,556,722,556,722,556,604,723,556,778,556,778,556,778,556,1e3,944,722,333,722,333,722,333,667,500,667,500,667,500,667,500,611,278,611,375,611,278,722,556,722,556,722,556,722,556,722,556,722,556,944,722,667,500,667,611,500,611,500,611,500,222,556,667,556,1e3,889,778,611,667,500,611,278,333,333,333,333,333,333,333,333,333,333,333,667,278,784,838,384,774,855,752,222,667,667,551,668,667,611,722,778,278,667,668,833,722,650,778,722,667,618,611,667,798,667,835,748,278,667,578,446,556,222,547,578,575,500,557,446,441,556,556,222,500,500,576,500,448,556,690,569,482,617,395,547,648,525,713,781,222,547,556,547,781,667,667,865,542,719,667,278,278,500,1057,1010,854,583,722,635,719,667,656,667,542,677,667,923,604,719,719,583,656,833,722,778,719,667,722,611,635,760,667,740,667,917,938,792,885,656,719,1010,722,556,573,531,365,583,556,669,458,559,559,438,583,688,552,556,542,556,500,458,500,823,500,573,521,802,823,625,719,521,510,750,542,556,556,556,365,510,500,222,278,222,906,812,556,438,559,500,552,778,556,489,411,944,722,944,722,944,722,667,500,333,333,556,1e3,1e3,552,222,222,222,222,333,333,333,556,556,350,1e3,1e3,188,354,333,333,500,333,167,365,556,556,1094,556,885,323,1073,1e3,768,600,834,834,834,834,1e3,500,1e3,500,1e3,500,500,494,612,823,713,584,549,713,979,719,274,549,549,583,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,500,500,333,333,333,333,333,333,333,333,222,222,294,294,324,324,316,328,398,285],ja=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],Xa=[1.36898,1,1,.72706,.80479,.83734,.98894,.99793,.9897,.93884,.86209,.94292,.94292,1.16661,1.02058,.93582,.96694,.93582,1.19137,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.78076,.78076,1.02058,1.02058,1.02058,.72851,.78966,.90838,.83637,.82391,.96376,.80061,.86275,.8768,.95407,1.0258,.73901,.85022,.83655,1.0156,.95546,.92179,.87107,.92179,.82114,.8096,.89713,.94438,.95353,.94083,.91905,.90406,.9446,.94292,1.18777,.94292,1.02058,.89903,.90088,.94938,.97898,.81093,.97571,.94938,1.024,.9577,.95933,.98621,1.0474,.97455,.98981,.9672,.95933,.9446,.97898,.97407,.97646,.78036,1.10208,.95442,.95298,.97579,.9332,.94039,.938,.80687,1.01149,.80687,1.02058,.80479,.99793,.99793,.99793,.99793,1.01149,1.00872,.90088,.91882,1.0213,.8361,1.02058,.62295,.54324,.89022,1.08595,1,1,.90088,1,.97455,.93582,.90088,1,1.05686,.8361,.99642,.99642,.99642,.72851,.90838,.90838,.90838,.90838,.90838,.90838,.868,.82391,.80061,.80061,.80061,.80061,1.0258,1.0258,1.0258,1.0258,.97484,.95546,.92179,.92179,.92179,.92179,.92179,1.02058,.92179,.94438,.94438,.94438,.94438,.90406,.86958,.98225,.94938,.94938,.94938,.94938,.94938,.94938,.9031,.81093,.94938,.94938,.94938,.94938,.98621,.98621,.98621,.98621,.93969,.95933,.9446,.9446,.9446,.9446,.9446,1.08595,.9446,.95442,.95442,.95442,.95442,.94039,.97898,.94039,.90838,.94938,.90838,.94938,.90838,.94938,.82391,.81093,.82391,.81093,.82391,.81093,.82391,.81093,.96376,.84313,.97484,.97571,.80061,.94938,.80061,.94938,.80061,.94938,.80061,.94938,.80061,.94938,.8768,.9577,.8768,.9577,.8768,.9577,1,1,.95407,.95933,.97069,.95933,1.0258,.98621,1.0258,.98621,1.0258,.98621,1.0258,.98621,1.0258,.98621,.887,1.01591,.73901,1.0474,1,1,.97455,.83655,.98981,1,1,.83655,.73977,.83655,.73903,.84638,1.033,.95546,.95933,1,1,.95546,.95933,.8271,.95417,.95933,.92179,.9446,.92179,.9446,.92179,.9446,.936,.91964,.82114,.97646,1,1,.82114,.97646,.8096,.78036,.8096,.78036,1,1,.8096,.78036,1,1,.89713,.77452,.89713,1.10208,.94438,.95442,.94438,.95442,.94438,.95442,.94438,.95442,.94438,.95442,.94438,.95442,.94083,.97579,.90406,.94039,.90406,.9446,.938,.9446,.938,.9446,.938,1,.99793,.90838,.94938,.868,.9031,.92179,.9446,1,1,.89713,1.10208,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90989,.9358,.91945,.83181,.75261,.87992,.82976,.96034,.83689,.97268,1.0078,.90838,.83637,.8019,.90157,.80061,.9446,.95407,.92436,1.0258,.85022,.97153,1.0156,.95546,.89192,.92179,.92361,.87107,.96318,.89713,.93704,.95638,.91905,.91709,.92796,1.0258,.93704,.94836,1.0373,.95933,1.0078,.95871,.94836,.96174,.92601,.9498,.98607,.95776,.95933,1.05453,1.0078,.98275,.9314,.95617,.91701,1.05993,.9446,.78367,.9553,1,.86832,1.0128,.95871,.99394,.87548,.96361,.86774,1.0078,.95871,.9446,.95871,.86774,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.94083,.97579,.94083,.97579,.94083,.97579,.90406,.94039,.96694,1,.89903,1,1,1,.93582,.93582,.93582,1,.908,.908,.918,.94219,.94219,.96544,1,1.285,1,1,.81079,.81079,1,1,.74854,1,1,1,1,.99793,1,1,1,.65,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.17173,1,.80535,.76169,1.02058,1.0732,1.05486,1,1,1.30692,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.16161,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],Za={lineHeight:1.2,lineGap:.2},Va=[1.36898,1,1,.66227,.80779,.81625,.97276,.97276,.97733,.92222,.83266,.94292,.94292,1.16148,1.02058,.93582,.96694,.93582,1.17337,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.78076,.78076,1.02058,1.02058,1.02058,.71541,.76813,.85576,.80591,.80729,.94299,.77512,.83655,.86523,.92222,.98621,.71743,.81698,.79726,.98558,.92222,.90637,.83809,.90637,.80729,.76463,.86275,.90699,.91605,.9154,.85308,.85458,.90531,.94292,1.21296,.94292,1.02058,.89903,1.18616,.99613,.91677,.78216,.91677,.90083,.98796,.9135,.92168,.95381,.98981,.95298,.95381,.93459,.92168,.91513,.92004,.91677,.95077,.748,1.04502,.91677,.92061,.94236,.89544,.89364,.9,.80687,.8578,.80687,1.02058,.80779,.97276,.97276,.97276,.97276,.8578,.99973,1.18616,.91339,1.08074,.82891,1.02058,.55509,.71526,.89022,1.08595,1,1,1.18616,1,.96736,.93582,1.18616,1,1.04864,.82711,.99043,.99043,.99043,.71541,.85576,.85576,.85576,.85576,.85576,.85576,.845,.80729,.77512,.77512,.77512,.77512,.98621,.98621,.98621,.98621,.95961,.92222,.90637,.90637,.90637,.90637,.90637,1.02058,.90251,.90699,.90699,.90699,.90699,.85458,.83659,.94951,.99613,.99613,.99613,.99613,.99613,.99613,.85811,.78216,.90083,.90083,.90083,.90083,.95381,.95381,.95381,.95381,.9135,.92168,.91513,.91513,.91513,.91513,.91513,1.08595,.91677,.91677,.91677,.91677,.91677,.89364,.92332,.89364,.85576,.99613,.85576,.99613,.85576,.99613,.80729,.78216,.80729,.78216,.80729,.78216,.80729,.78216,.94299,.76783,.95961,.91677,.77512,.90083,.77512,.90083,.77512,.90083,.77512,.90083,.77512,.90083,.86523,.9135,.86523,.9135,.86523,.9135,1,1,.92222,.92168,.92222,.92168,.98621,.95381,.98621,.95381,.98621,.95381,.98621,.95381,.98621,.95381,.86036,.97096,.71743,.98981,1,1,.95298,.79726,.95381,1,1,.79726,.6894,.79726,.74321,.81691,1.0006,.92222,.92168,1,1,.92222,.92168,.79464,.92098,.92168,.90637,.91513,.90637,.91513,.90637,.91513,.909,.87514,.80729,.95077,1,1,.80729,.95077,.76463,.748,.76463,.748,1,1,.76463,.748,1,1,.86275,.72651,.86275,1.04502,.90699,.91677,.90699,.91677,.90699,.91677,.90699,.91677,.90699,.91677,.90699,.91677,.9154,.94236,.85458,.89364,.85458,.90531,.9,.90531,.9,.90531,.9,1,.97276,.85576,.99613,.845,.85811,.90251,.91677,1,1,.86275,1.04502,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.00899,1.30628,.85576,.80178,.66862,.7927,.69323,.88127,.72459,.89711,.95381,.85576,.80591,.7805,.94729,.77512,.90531,.92222,.90637,.98621,.81698,.92655,.98558,.92222,.85359,.90637,.90976,.83809,.94523,.86275,.83509,.93157,.85308,.83392,.92346,.98621,.83509,.92886,.91324,.92168,.95381,.90646,.92886,.90557,.86847,.90276,.91324,.86842,.92168,.99531,.95381,.9224,.85408,.92699,.86847,1.0051,.91513,.80487,.93481,1,.88159,1.05214,.90646,.97355,.81539,.89398,.85923,.95381,.90646,.91513,.90646,.85923,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.9154,.94236,.9154,.94236,.9154,.94236,.85458,.89364,.96694,1,.89903,1,1,1,.91782,.91782,.91782,1,.896,.896,.896,.9332,.9332,.95973,1,1.26,1,1,.80479,.80178,1,1,.85633,1,1,1,1,.97276,1,1,1,.698,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.14542,1,.79199,.78694,1.02058,1.03493,1.05486,1,1,1.23026,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.20006,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],za={lineHeight:1.2,lineGap:.2},_a=[1.36898,1,1,.65507,.84943,.85639,.88465,.88465,.86936,.88307,.86948,.85283,.85283,1.06383,1.02058,.75945,.9219,.75945,1.17337,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.75945,.75945,1.02058,1.02058,1.02058,.69046,.70926,.85158,.77812,.76852,.89591,.70466,.76125,.80094,.86822,.83864,.728,.77212,.79475,.93637,.87514,.8588,.76013,.8588,.72421,.69866,.77598,.85991,.80811,.87832,.78112,.77512,.8562,1.0222,1.18417,1.0222,1.27014,.89903,1.15012,.93859,.94399,.846,.94399,.81453,1.0186,.94219,.96017,1.03075,1.02175,.912,1.03075,.96998,.96017,.93859,.94399,.94399,.95493,.746,1.12658,.94578,.91,.979,.882,.882,.83,.85034,.83537,.85034,1.02058,.70869,.88465,.88465,.88465,.88465,.83537,.90083,1.15012,.9161,.94565,.73541,1.02058,.53609,.69353,.79519,1.08595,1,1,1.15012,1,.91974,.75945,1.15012,1,.9446,.73361,.9005,.9005,.9005,.62864,.85158,.85158,.85158,.85158,.85158,.85158,.773,.76852,.70466,.70466,.70466,.70466,.83864,.83864,.83864,.83864,.90561,.87514,.8588,.8588,.8588,.8588,.8588,1.02058,.85751,.85991,.85991,.85991,.85991,.77512,.76013,.88075,.93859,.93859,.93859,.93859,.93859,.93859,.8075,.846,.81453,.81453,.81453,.81453,.82424,.82424,.82424,.82424,.9278,.96017,.93859,.93859,.93859,.93859,.93859,1.08595,.8562,.94578,.94578,.94578,.94578,.882,.94578,.882,.85158,.93859,.85158,.93859,.85158,.93859,.76852,.846,.76852,.846,.76852,.846,.76852,.846,.89591,.8544,.90561,.94399,.70466,.81453,.70466,.81453,.70466,.81453,.70466,.81453,.70466,.81453,.80094,.94219,.80094,.94219,.80094,.94219,1,1,.86822,.96017,.86822,.96017,.83864,.82424,.83864,.82424,.83864,.82424,.83864,1.03075,.83864,.82424,.81402,1.02738,.728,1.02175,1,1,.912,.79475,1.03075,1,1,.79475,.83911,.79475,.66266,.80553,1.06676,.87514,.96017,1,1,.87514,.96017,.86865,.87396,.96017,.8588,.93859,.8588,.93859,.8588,.93859,.867,.84759,.72421,.95493,1,1,.72421,.95493,.69866,.746,.69866,.746,1,1,.69866,.746,1,1,.77598,.88417,.77598,1.12658,.85991,.94578,.85991,.94578,.85991,.94578,.85991,.94578,.85991,.94578,.85991,.94578,.87832,.979,.77512,.882,.77512,.8562,.83,.8562,.83,.8562,.83,1,.88465,.85158,.93859,.773,.8075,.85751,.8562,1,1,.77598,1.12658,1.15012,1.15012,1.15012,1.15012,1.15012,1.15313,1.15012,1.15012,1.15012,1.08106,1.03901,.85158,.77025,.62264,.7646,.65351,.86026,.69461,.89947,1.03075,.85158,.77812,.76449,.88836,.70466,.8562,.86822,.8588,.83864,.77212,.85308,.93637,.87514,.82352,.8588,.85701,.76013,.89058,.77598,.8156,.82565,.78112,.77899,.89386,.83864,.8156,.9486,.92388,.96186,1.03075,.91123,.9486,.93298,.878,.93942,.92388,.84596,.96186,.95119,1.03075,.922,.88787,.95829,.88,.93559,.93859,.78815,.93758,1,.89217,1.03737,.91123,.93969,.77487,.85769,.86799,1.03075,.91123,.93859,.91123,.86799,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.87832,.979,.87832,.979,.87832,.979,.77512,.882,.9219,1,.89903,1,1,1,.87321,.87321,.87321,1,1.027,1.027,1.027,.86847,.86847,.79121,1,1.124,1,1,.73572,.73572,1,1,.85034,1,1,1,1,.88465,1,1,1,.669,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.04828,1,.74948,.75187,1.02058,.98391,1.02119,1,1,1.06233,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.05233,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],$a={lineHeight:1.2,lineGap:.2},As=[1.36898,1,1,.76305,.82784,.94935,.89364,.92241,.89073,.90706,.98472,.85283,.85283,1.0664,1.02058,.74505,.9219,.74505,1.23456,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.74505,.74505,1.02058,1.02058,1.02058,.73002,.72601,.91755,.8126,.80314,.92222,.73764,.79726,.83051,.90284,.86023,.74,.8126,.84869,.96518,.91115,.8858,.79761,.8858,.74498,.73914,.81363,.89591,.83659,.89633,.85608,.8111,.90531,1.0222,1.22736,1.0222,1.27014,.89903,.90088,.86667,1.0231,.896,1.01411,.90083,1.05099,1.00512,.99793,1.05326,1.09377,.938,1.06226,1.00119,.99793,.98714,1.0231,1.01231,.98196,.792,1.19137,.99074,.962,1.01915,.926,.942,.856,.85034,.92006,.85034,1.02058,.69067,.92241,.92241,.92241,.92241,.92006,.9332,.90088,.91882,.93484,.75339,1.02058,.56866,.54324,.79519,1.08595,1,1,.90088,1,.95325,.74505,.90088,1,.97198,.75339,.91009,.91009,.91009,.66466,.91755,.91755,.91755,.91755,.91755,.91755,.788,.80314,.73764,.73764,.73764,.73764,.86023,.86023,.86023,.86023,.92915,.91115,.8858,.8858,.8858,.8858,.8858,1.02058,.8858,.89591,.89591,.89591,.89591,.8111,.79611,.89713,.86667,.86667,.86667,.86667,.86667,.86667,.86936,.896,.90083,.90083,.90083,.90083,.84224,.84224,.84224,.84224,.97276,.99793,.98714,.98714,.98714,.98714,.98714,1.08595,.89876,.99074,.99074,.99074,.99074,.942,1.0231,.942,.91755,.86667,.91755,.86667,.91755,.86667,.80314,.896,.80314,.896,.80314,.896,.80314,.896,.92222,.93372,.92915,1.01411,.73764,.90083,.73764,.90083,.73764,.90083,.73764,.90083,.73764,.90083,.83051,1.00512,.83051,1.00512,.83051,1.00512,1,1,.90284,.99793,.90976,.99793,.86023,.84224,.86023,.84224,.86023,.84224,.86023,1.05326,.86023,.84224,.82873,1.07469,.74,1.09377,1,1,.938,.84869,1.06226,1,1,.84869,.83704,.84869,.81441,.85588,1.08927,.91115,.99793,1,1,.91115,.99793,.91887,.90991,.99793,.8858,.98714,.8858,.98714,.8858,.98714,.894,.91434,.74498,.98196,1,1,.74498,.98196,.73914,.792,.73914,.792,1,1,.73914,.792,1,1,.81363,.904,.81363,1.19137,.89591,.99074,.89591,.99074,.89591,.99074,.89591,.99074,.89591,.99074,.89591,.99074,.89633,1.01915,.8111,.942,.8111,.90531,.856,.90531,.856,.90531,.856,1,.92241,.91755,.86667,.788,.86936,.8858,.89876,1,1,.81363,1.19137,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90388,1.03901,.92138,.78105,.7154,.86169,.80513,.94007,.82528,.98612,1.06226,.91755,.8126,.81884,.92819,.73764,.90531,.90284,.8858,.86023,.8126,.91172,.96518,.91115,.83089,.8858,.87791,.79761,.89297,.81363,.88157,.89992,.85608,.81992,.94307,.86023,.88157,.95308,.98699,.99793,1.06226,.95817,.95308,.97358,.928,.98088,.98699,.92761,.99793,.96017,1.06226,.986,.944,.95978,.938,.96705,.98714,.80442,.98972,1,.89762,1.04552,.95817,.99007,.87064,.91879,.88888,1.06226,.95817,.98714,.95817,.88888,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.89633,1.01915,.89633,1.01915,.89633,1.01915,.8111,.942,.9219,1,.89903,1,1,1,.93173,.93173,.93173,1,1.06304,1.06304,1.06904,.89903,.89903,.80549,1,1.156,1,1,.76575,.76575,1,1,.72458,1,1,1,1,.92241,1,1,1,.619,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.07257,1,.74705,.71119,1.02058,1.024,1.02119,1,1,1.1536,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.05638,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],es={lineHeight:1.2,lineGap:.2},ts=[1.76738,1,1,.99297,.9824,1.04016,1.06497,1.03424,.97529,1.17647,1.23203,1.1085,1.1085,1.16939,1.2107,.9754,1.21408,.9754,1.59578,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,.81378,.81378,1.2107,1.2107,1.2107,.71703,.97847,.97363,.88776,.8641,1.02096,.79795,.85132,.914,1.06085,1.1406,.8007,.89858,.83693,1.14889,1.09398,.97489,.92094,.97489,.90399,.84041,.95923,1.00135,1,1.06467,.98243,.90996,.99361,1.1085,1.56942,1.1085,1.2107,.74627,.94282,.96752,1.01519,.86304,1.01359,.97278,1.15103,1.01359,.98561,1.02285,1.02285,1.00527,1.02285,1.0302,.99041,1.0008,1.01519,1.01359,1.02258,.79104,1.16862,.99041,.97454,1.02511,.99298,.96752,.95801,.94856,1.16579,.94856,1.2107,.9824,1.03424,1.03424,1,1.03424,1.16579,.8727,1.3871,1.18622,1.10818,1.04478,1.2107,1.18622,.75155,.94994,1.28826,1.21408,1.21408,.91056,1,.91572,.9754,.64663,1.18328,1.24866,1.04478,1.14169,1.15749,1.17389,.71703,.97363,.97363,.97363,.97363,.97363,.97363,.93506,.8641,.79795,.79795,.79795,.79795,1.1406,1.1406,1.1406,1.1406,1.02096,1.09398,.97426,.97426,.97426,.97426,.97426,1.2107,.97489,1.00135,1.00135,1.00135,1.00135,.90996,.92094,1.02798,.96752,.96752,.96752,.96752,.96752,.96752,.93136,.86304,.97278,.97278,.97278,.97278,1.02285,1.02285,1.02285,1.02285,.97122,.99041,1,1,1,1,1,1.28826,1.0008,.99041,.99041,.99041,.99041,.96752,1.01519,.96752,.97363,.96752,.97363,.96752,.97363,.96752,.8641,.86304,.8641,.86304,.8641,.86304,.8641,.86304,1.02096,1.03057,1.02096,1.03517,.79795,.97278,.79795,.97278,.79795,.97278,.79795,.97278,.79795,.97278,.914,1.01359,.914,1.01359,.914,1.01359,1,1,1.06085,.98561,1.06085,1.00879,1.1406,1.02285,1.1406,1.02285,1.1406,1.02285,1.1406,1.02285,1.1406,1.02285,.97138,1.08692,.8007,1.02285,1,1,1.00527,.83693,1.02285,1,1,.83693,.9455,.83693,.90418,.83693,1.13005,1.09398,.99041,1,1,1.09398,.99041,.96692,1.09251,.99041,.97489,1.0008,.97489,1.0008,.97489,1.0008,.93994,.97931,.90399,1.02258,1,1,.90399,1.02258,.84041,.79104,.84041,.79104,.84041,.79104,.84041,.79104,1,1,.95923,1.07034,.95923,1.16862,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.06467,1.02511,.90996,.96752,.90996,.99361,.95801,.99361,.95801,.99361,.95801,1.07733,1.03424,.97363,.96752,.93506,.93136,.97489,1.0008,1,1,.95923,1.16862,1.15103,1.15103,1.01173,1.03959,.75953,.81378,.79912,1.15103,1.21994,.95161,.87815,1.01149,.81525,.7676,.98167,1.01134,1.02546,.84097,1.03089,1.18102,.97363,.88776,.85134,.97826,.79795,.99361,1.06085,.97489,1.1406,.89858,1.0388,1.14889,1.09398,.86039,.97489,1.0595,.92094,.94793,.95923,.90996,.99346,.98243,1.02112,.95493,1.1406,.90996,1.03574,1.02597,1.0008,1.18102,1.06628,1.03574,1.0192,1.01932,1.00886,.97531,1.0106,1.0008,1.13189,1.18102,1.02277,.98683,1.0016,.99561,1.07237,1.0008,.90434,.99921,.93803,.8965,1.23085,1.06628,1.04983,.96268,1.0499,.98439,1.18102,1.06628,1.0008,1.06628,.98439,.79795,1,1,1,1,1,1,1,1,1,1,1,1,1.09466,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.97278,1,1,1,1,1,1,1,1,1,1,1,1,1.02065,1,1,1,1,1,1,1.06467,1.02511,1.06467,1.02511,1.06467,1.02511,.90996,.96752,1,1.21408,.89903,1,1,.75155,1.04394,1.04394,1.04394,1.04394,.98633,.98633,.98633,.73047,.73047,1.20642,.91211,1.25635,1.222,1.02956,1.03372,1.03372,.96039,1.24633,1,1.12454,.93503,1.03424,1.19687,1.03424,1,1,1,.771,1,1,1.15749,1.15749,1.15749,1.10948,.86279,.94434,.86279,.94434,.86182,1,1,1.16897,1,.96085,.90137,1.2107,1.18416,1.13973,.69825,.9716,2.10339,1.29004,1.29004,1.21172,1.29004,1.29004,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.18874,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.09193,1.09193,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],is={lineHeight:1.33008,lineGap:0},as=[1.76738,1,1,.98946,1.03959,1.04016,1.02809,1.036,.97639,1.10953,1.23203,1.11144,1.11144,1.16939,1.21237,.9754,1.21261,.9754,1.59754,1.036,1.036,1.036,1.036,1.036,1.036,1.036,1.036,1.036,1.036,.81378,.81378,1.21237,1.21237,1.21237,.73541,.97847,.97363,.89723,.87897,1.0426,.79429,.85292,.91149,1.05815,1.1406,.79631,.90128,.83853,1.04396,1.10615,.97552,.94436,.97552,.88641,.80527,.96083,1.00135,1,1.06777,.9817,.91142,.99361,1.11144,1.57293,1.11144,1.21237,.74627,1.31818,1.06585,.97042,.83055,.97042,.93503,1.1261,.97042,.97922,1.14236,.94552,1.01054,1.14236,1.02471,.97922,.94165,.97042,.97042,1.0276,.78929,1.1261,.97922,.95874,1.02197,.98507,.96752,.97168,.95107,1.16579,.95107,1.21237,1.03959,1.036,1.036,1,1.036,1.16579,.87357,1.31818,1.18754,1.26781,1.05356,1.21237,1.18622,.79487,.94994,1.29004,1.24047,1.24047,1.31818,1,.91484,.9754,1.31818,1.1349,1.24866,1.05356,1.13934,1.15574,1.17389,.73541,.97363,.97363,.97363,.97363,.97363,.97363,.94385,.87897,.79429,.79429,.79429,.79429,1.1406,1.1406,1.1406,1.1406,1.0426,1.10615,.97552,.97552,.97552,.97552,.97552,1.21237,.97552,1.00135,1.00135,1.00135,1.00135,.91142,.94436,.98721,1.06585,1.06585,1.06585,1.06585,1.06585,1.06585,.96705,.83055,.93503,.93503,.93503,.93503,1.14236,1.14236,1.14236,1.14236,.93125,.97922,.94165,.94165,.94165,.94165,.94165,1.29004,.94165,.97922,.97922,.97922,.97922,.96752,.97042,.96752,.97363,1.06585,.97363,1.06585,.97363,1.06585,.87897,.83055,.87897,.83055,.87897,.83055,.87897,.83055,1.0426,1.0033,1.0426,.97042,.79429,.93503,.79429,.93503,.79429,.93503,.79429,.93503,.79429,.93503,.91149,.97042,.91149,.97042,.91149,.97042,1,1,1.05815,.97922,1.05815,.97922,1.1406,1.14236,1.1406,1.14236,1.1406,1.14236,1.1406,1.14236,1.1406,1.14236,.97441,1.04302,.79631,1.01582,1,1,1.01054,.83853,1.14236,1,1,.83853,1.09125,.83853,.90418,.83853,1.19508,1.10615,.97922,1,1,1.10615,.97922,1.01034,1.10466,.97922,.97552,.94165,.97552,.94165,.97552,.94165,.91602,.91981,.88641,1.0276,1,1,.88641,1.0276,.80527,.78929,.80527,.78929,.80527,.78929,.80527,.78929,1,1,.96083,1.05403,.95923,1.16862,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.06777,1.02197,.91142,.96752,.91142,.99361,.97168,.99361,.97168,.99361,.97168,1.23199,1.036,.97363,1.06585,.94385,.96705,.97552,.94165,1,1,.96083,1.1261,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,.95161,1.27126,1.00811,.83284,.77702,.99137,.95253,1.0347,.86142,1.07205,1.14236,.97363,.89723,.86869,1.09818,.79429,.99361,1.05815,.97552,1.1406,.90128,1.06662,1.04396,1.10615,.84918,.97552,1.04694,.94436,.98015,.96083,.91142,1.00356,.9817,1.01945,.98999,1.1406,.91142,1.04961,.9898,1.00639,1.14236,1.07514,1.04961,.99607,1.02897,1.008,.9898,.95134,1.00639,1.11121,1.14236,1.00518,.97981,1.02186,1,1.08578,.94165,.99314,.98387,.93028,.93377,1.35125,1.07514,1.10687,.93491,1.04232,1.00351,1.14236,1.07514,.94165,1.07514,1.00351,.79429,1,1,1,1,1,1,1,1,1,1,1,1,1.09097,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.93503,1,1,1,1,1,1,1,1,1,1,1,1,.96609,1,1,1,1,1,1,1.06777,1.02197,1.06777,1.02197,1.06777,1.02197,.91142,.96752,1,1.21261,.89903,1,1,.75155,1.04745,1.04745,1.04745,1.04394,.98633,.98633,.98633,.72959,.72959,1.20502,.91406,1.26514,1.222,1.02956,1.03372,1.03372,.96039,1.24633,1,1.09125,.93327,1.03336,1.16541,1.036,1,1,1,.771,1,1,1.15574,1.15574,1.15574,1.15574,.86364,.94434,.86279,.94434,.86224,1,1,1.16798,1,.96085,.90068,1.21237,1.18416,1.13904,.69825,.9716,2.10339,1.29004,1.29004,1.21339,1.29004,1.29004,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.18775,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.13269,1.13269,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],ss={lineHeight:1.33008,lineGap:0},rs=[1.76738,1,1,.98946,1.14763,1.05365,1.06234,.96927,.92586,1.15373,1.18414,.91349,.91349,1.07403,1.17308,.78383,1.20088,.78383,1.42531,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.78383,.78383,1.17308,1.17308,1.17308,.77349,.94565,.94729,.85944,.88506,.9858,.74817,.80016,.88449,.98039,.95782,.69238,.89898,.83231,.98183,1.03989,.96924,.86237,.96924,.80595,.74524,.86091,.95402,.94143,.98448,.8858,.83089,.93285,1.0949,1.39016,1.0949,1.45994,.74627,1.04839,.97454,.97454,.87207,.97454,.87533,1.06151,.97454,1.00176,1.16484,1.08132,.98047,1.16484,1.02989,1.01054,.96225,.97454,.97454,1.06598,.79004,1.16344,1.00351,.94629,.9973,.91016,.96777,.9043,.91082,.92481,.91082,1.17308,.95748,.96927,.96927,1,.96927,.92481,.80597,1.04839,1.23393,1.1781,.9245,1.17308,1.20808,.63218,.94261,1.24822,1.09971,1.09971,1.04839,1,.85273,.78032,1.04839,1.09971,1.22326,.9245,1.09836,1.13525,1.15222,.70424,.94729,.94729,.94729,.94729,.94729,.94729,.85498,.88506,.74817,.74817,.74817,.74817,.95782,.95782,.95782,.95782,.9858,1.03989,.96924,.96924,.96924,.96924,.96924,1.17308,.96924,.95402,.95402,.95402,.95402,.83089,.86237,.88409,.97454,.97454,.97454,.97454,.97454,.97454,.92916,.87207,.87533,.87533,.87533,.87533,.93146,.93146,.93146,.93146,.93854,1.01054,.96225,.96225,.96225,.96225,.96225,1.24822,.8761,1.00351,1.00351,1.00351,1.00351,.96777,.97454,.96777,.94729,.97454,.94729,.97454,.94729,.97454,.88506,.87207,.88506,.87207,.88506,.87207,.88506,.87207,.9858,.95391,.9858,.97454,.74817,.87533,.74817,.87533,.74817,.87533,.74817,.87533,.74817,.87533,.88449,.97454,.88449,.97454,.88449,.97454,1,1,.98039,1.00176,.98039,1.00176,.95782,.93146,.95782,.93146,.95782,.93146,.95782,1.16484,.95782,.93146,.84421,1.12761,.69238,1.08132,1,1,.98047,.83231,1.16484,1,1,.84723,1.04861,.84723,.78755,.83231,1.23736,1.03989,1.01054,1,1,1.03989,1.01054,.9857,1.03849,1.01054,.96924,.96225,.96924,.96225,.96924,.96225,.92383,.90171,.80595,1.06598,1,1,.80595,1.06598,.74524,.79004,.74524,.79004,.74524,.79004,.74524,.79004,1,1,.86091,1.02759,.85771,1.16344,.95402,1.00351,.95402,1.00351,.95402,1.00351,.95402,1.00351,.95402,1.00351,.95402,1.00351,.98448,.9973,.83089,.96777,.83089,.93285,.9043,.93285,.9043,.93285,.9043,1.31868,.96927,.94729,.97454,.85498,.92916,.96924,.8761,1,1,.86091,1.16344,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,.81965,.81965,.94729,.78032,.71022,.90883,.84171,.99877,.77596,1.05734,1.2,.94729,.85944,.82791,.9607,.74817,.93285,.98039,.96924,.95782,.89898,.98316,.98183,1.03989,.78614,.96924,.97642,.86237,.86075,.86091,.83089,.90082,.8858,.97296,1.01284,.95782,.83089,1.0976,1.04,1.03342,1.2,1.0675,1.0976,.98205,1.03809,1.05097,1.04,.95364,1.03342,1.05401,1.2,1.02148,1.0119,1.04724,1.0127,1.02732,.96225,.8965,.97783,.93574,.94818,1.30679,1.0675,1.11826,.99821,1.0557,1.0326,1.2,1.0675,.96225,1.0675,1.0326,.74817,1,1,1,1,1,1,1,1,1,1,1,1,1.03754,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.87533,1,1,1,1,1,1,1,1,1,1,1,1,.98705,1,1,1,1,1,1,.98448,.9973,.98448,.9973,.98448,.9973,.83089,.96777,1,1.20088,.89903,1,1,.75155,.94945,.94945,.94945,.94945,1.12317,1.12317,1.12317,.67603,.67603,1.15621,.73584,1.21191,1.22135,1.06483,.94868,.94868,.95996,1.24633,1,1.07497,.87709,.96927,1.01473,.96927,1,1,1,.77295,1,1,1.09836,1.09836,1.09836,1.01522,.86321,.94434,.8649,.94434,.86182,1,1,1.083,1,.91578,.86438,1.17308,1.18416,1.14589,.69825,.97622,1.96791,1.24822,1.24822,1.17308,1.24822,1.24822,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.17984,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.10742,1.10742,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],ns={lineHeight:1.33008,lineGap:0},gs=[1.76738,1,1,.98594,1.02285,1.10454,1.06234,.96927,.92037,1.19985,1.2046,.90616,.90616,1.07152,1.1714,.78032,1.20088,.78032,1.40246,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.78032,.78032,1.1714,1.1714,1.1714,.80597,.94084,.96706,.85944,.85734,.97093,.75842,.79936,.88198,.9831,.95782,.71387,.86969,.84636,1.07796,1.03584,.96924,.83968,.96924,.82826,.79649,.85771,.95132,.93119,.98965,.88433,.8287,.93365,1.08612,1.3638,1.08612,1.45786,.74627,.80499,.91484,1.05707,.92383,1.05882,.9403,1.12654,1.05882,1.01756,1.09011,1.09011,.99414,1.09011,1.034,1.01756,1.05356,1.05707,1.05882,1.04399,.84863,1.21968,1.01756,.95801,1.00068,.91797,.96777,.9043,.90351,.92105,.90351,1.1714,.85337,.96927,.96927,.99912,.96927,.92105,.80597,1.2434,1.20808,1.05937,.90957,1.1714,1.20808,.75155,.94261,1.24644,1.09971,1.09971,.84751,1,.85273,.78032,.61584,1.05425,1.17914,.90957,1.08665,1.11593,1.14169,.73381,.96706,.96706,.96706,.96706,.96706,.96706,.86035,.85734,.75842,.75842,.75842,.75842,.95782,.95782,.95782,.95782,.97093,1.03584,.96924,.96924,.96924,.96924,.96924,1.1714,.96924,.95132,.95132,.95132,.95132,.8287,.83968,.89049,.91484,.91484,.91484,.91484,.91484,.91484,.93575,.92383,.9403,.9403,.9403,.9403,.8717,.8717,.8717,.8717,1.00527,1.01756,1.05356,1.05356,1.05356,1.05356,1.05356,1.24644,.95923,1.01756,1.01756,1.01756,1.01756,.96777,1.05707,.96777,.96706,.91484,.96706,.91484,.96706,.91484,.85734,.92383,.85734,.92383,.85734,.92383,.85734,.92383,.97093,1.0969,.97093,1.05882,.75842,.9403,.75842,.9403,.75842,.9403,.75842,.9403,.75842,.9403,.88198,1.05882,.88198,1.05882,.88198,1.05882,1,1,.9831,1.01756,.9831,1.01756,.95782,.8717,.95782,.8717,.95782,.8717,.95782,1.09011,.95782,.8717,.84784,1.11551,.71387,1.09011,1,1,.99414,.84636,1.09011,1,1,.84636,1.0536,.84636,.94298,.84636,1.23297,1.03584,1.01756,1,1,1.03584,1.01756,1.00323,1.03444,1.01756,.96924,1.05356,.96924,1.05356,.96924,1.05356,.93066,.98293,.82826,1.04399,1,1,.82826,1.04399,.79649,.84863,.79649,.84863,.79649,.84863,.79649,.84863,1,1,.85771,1.17318,.85771,1.21968,.95132,1.01756,.95132,1.01756,.95132,1.01756,.95132,1.01756,.95132,1.01756,.95132,1.01756,.98965,1.00068,.8287,.96777,.8287,.93365,.9043,.93365,.9043,.93365,.9043,1.08571,.96927,.96706,.91484,.86035,.93575,.96924,.95923,1,1,.85771,1.21968,1.11437,1.11437,.93109,.91202,.60411,.84164,.55572,1.01173,.97361,.81818,.81818,.96635,.78032,.72727,.92366,.98601,1.03405,.77968,1.09799,1.2,.96706,.85944,.85638,.96491,.75842,.93365,.9831,.96924,.95782,.86969,.94152,1.07796,1.03584,.78437,.96924,.98715,.83968,.83491,.85771,.8287,.94492,.88433,.9287,1.0098,.95782,.8287,1.0625,.98248,1.03424,1.2,1.01071,1.0625,.95246,1.03809,1.04912,.98248,1.00221,1.03424,1.05443,1.2,1.04785,.99609,1.00169,1.05176,.99346,1.05356,.9087,1.03004,.95542,.93117,1.23362,1.01071,1.07831,1.02512,1.05205,1.03502,1.2,1.01071,1.05356,1.01071,1.03502,.75842,1,1,1,1,1,1,1,1,1,1,1,1,1.03719,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.9403,1,1,1,1,1,1,1,1,1,1,1,1,1.04021,1,1,1,1,1,1,.98965,1.00068,.98965,1.00068,.98965,1.00068,.8287,.96777,1,1.20088,.89903,1,1,.75155,1.03077,1.03077,1.03077,1.03077,1.13196,1.13196,1.13196,.67428,.67428,1.16039,.73291,1.20996,1.22135,1.06483,.94868,.94868,.95996,1.24633,1,1.07497,.87796,.96927,1.01518,.96927,1,1,1,.77295,1,1,1.10539,1.10539,1.11358,1.06967,.86279,.94434,.86279,.94434,.86182,1,1,1.083,1,.91578,.86507,1.1714,1.18416,1.14589,.69825,.97622,1.9697,1.24822,1.24822,1.17238,1.24822,1.24822,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.18083,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.10938,1.10938,1,1,1,1.05425,1.09971,1.09971,1.09971,1,1,1,1,1,1,1,1,1,1,1],os={lineHeight:1.33008,lineGap:0},Is=getLookupTableFactory((function(e){e["MyriadPro-Regular"]=e["PdfJS-Fallback-Regular"]={name:"LiberationSans-Regular",factors:As,baseWidths:Wa,baseMapping:ja,metrics:es};e["MyriadPro-Bold"]=e["PdfJS-Fallback-Bold"]={name:"LiberationSans-Bold",factors:Xa,baseWidths:va,baseMapping:Ka,metrics:Za};e["MyriadPro-It"]=e["MyriadPro-Italic"]=e["PdfJS-Fallback-Italic"]={name:"LiberationSans-Italic",factors:_a,baseWidths:Oa,baseMapping:Pa,metrics:$a};e["MyriadPro-BoldIt"]=e["MyriadPro-BoldItalic"]=e["PdfJS-Fallback-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:Va,baseWidths:Ta,baseMapping:qa,metrics:za};e.ArialMT=e.Arial=e["Arial-Regular"]={name:"LiberationSans-Regular",baseWidths:Wa,baseMapping:ja};e["Arial-BoldMT"]=e["Arial-Bold"]={name:"LiberationSans-Bold",baseWidths:va,baseMapping:Ka};e["Arial-ItalicMT"]=e["Arial-Italic"]={name:"LiberationSans-Italic",baseWidths:Oa,baseMapping:Pa};e["Arial-BoldItalicMT"]=e["Arial-BoldItalic"]={name:"LiberationSans-BoldItalic",baseWidths:Ta,baseMapping:qa};e["Calibri-Regular"]={name:"LiberationSans-Regular",factors:Ra,baseWidths:Wa,baseMapping:ja,metrics:Na};e["Calibri-Bold"]={name:"LiberationSans-Bold",factors:wa,baseWidths:va,baseMapping:Ka,metrics:Da};e["Calibri-Italic"]={name:"LiberationSans-Italic",factors:Sa,baseWidths:Oa,baseMapping:Pa,metrics:ka};e["Calibri-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:ba,baseWidths:Ta,baseMapping:qa,metrics:Fa};e["Segoeui-Regular"]={name:"LiberationSans-Regular",factors:gs,baseWidths:Wa,baseMapping:ja,metrics:os};e["Segoeui-Bold"]={name:"LiberationSans-Bold",factors:ts,baseWidths:va,baseMapping:Ka,metrics:is};e["Segoeui-Italic"]={name:"LiberationSans-Italic",factors:rs,baseWidths:Oa,baseMapping:Pa,metrics:ns};e["Segoeui-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:as,baseWidths:Ta,baseMapping:qa,metrics:ss};e["Helvetica-Regular"]=e.Helvetica={name:"LiberationSans-Regular",factors:Ja,baseWidths:Wa,baseMapping:ja,metrics:Ya};e["Helvetica-Bold"]={name:"LiberationSans-Bold",factors:Ga,baseWidths:va,baseMapping:Ka,metrics:xa};e["Helvetica-Italic"]={name:"LiberationSans-Italic",factors:La,baseWidths:Oa,baseMapping:Pa,metrics:Ha};e["Helvetica-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:Ua,baseWidths:Ta,baseMapping:qa,metrics:Ma}}));function getXfaFontName(e){const t=normalizeFontName(e);return Is()[t]}function getXfaFontDict(e){const t=function getXfaFontWidths(e){const t=getXfaFontName(e);if(!t)return null;const{baseWidths:i,baseMapping:a,factors:s}=t,r=s?i.map(((e,t)=>e*s[t])):i;let n,g=-2;const o=[];for(const[e,t]of a.map(((e,t)=>[e,t])).sort((([e],[t])=>e-t)))if(-1!==e)if(e===g+1){n.push(r[t]);g+=1}else{g=e;n=[r[t]];o.push(e,n)}return o}(e),i=new Dict(null);i.set("BaseFont",Name.get(e));i.set("Type",Name.get("Font"));i.set("Subtype",Name.get("CIDFontType2"));i.set("Encoding",Name.get("Identity-H"));i.set("CIDToGIDMap",Name.get("Identity"));i.set("W",t);i.set("FirstChar",t[0]);i.set("LastChar",t.at(-2)+t.at(-1).length-1);const a=new Dict(null);i.set("FontDescriptor",a);const s=new Dict(null);s.set("Ordering","Identity");s.set("Registry","Adobe");s.set("Supplement",0);i.set("CIDSystemInfo",s);return i}class PostScriptParser{constructor(e){this.lexer=e;this.operators=[];this.token=null;this.prev=null}nextToken(){this.prev=this.token;this.token=this.lexer.getToken()}accept(e){if(this.token.type===e){this.nextToken();return!0}return!1}expect(e){if(this.accept(e))return!0;throw new FormatError(`Unexpected symbol: found ${this.token.type} expected ${e}.`)}parse(){this.nextToken();this.expect(cs.LBRACE);this.parseBlock();this.expect(cs.RBRACE);return this.operators}parseBlock(){for(;;)if(this.accept(cs.NUMBER))this.operators.push(this.prev.value);else if(this.accept(cs.OPERATOR))this.operators.push(this.prev.value);else{if(!this.accept(cs.LBRACE))return;this.parseCondition()}}parseCondition(){const e=this.operators.length;this.operators.push(null,null);this.parseBlock();this.expect(cs.RBRACE);if(this.accept(cs.IF)){this.operators[e]=this.operators.length;this.operators[e+1]="jz"}else{if(!this.accept(cs.LBRACE))throw new FormatError("PS Function: error parsing conditional.");{const t=this.operators.length;this.operators.push(null,null);const i=this.operators.length;this.parseBlock();this.expect(cs.RBRACE);this.expect(cs.IFELSE);this.operators[t]=this.operators.length;this.operators[t+1]="j";this.operators[e]=i;this.operators[e+1]="jz"}}}}const cs={LBRACE:0,RBRACE:1,NUMBER:2,OPERATOR:3,IF:4,IFELSE:5};class PostScriptToken{static get opCache(){return shadow(this,"opCache",Object.create(null))}constructor(e,t){this.type=e;this.value=t}static getOperator(e){return PostScriptToken.opCache[e]||=new PostScriptToken(cs.OPERATOR,e)}static get LBRACE(){return shadow(this,"LBRACE",new PostScriptToken(cs.LBRACE,"{"))}static get RBRACE(){return shadow(this,"RBRACE",new PostScriptToken(cs.RBRACE,"}"))}static get IF(){return shadow(this,"IF",new PostScriptToken(cs.IF,"IF"))}static get IFELSE(){return shadow(this,"IFELSE",new PostScriptToken(cs.IFELSE,"IFELSE"))}}class PostScriptLexer{constructor(e){this.stream=e;this.nextChar();this.strBuf=[]}nextChar(){return this.currentChar=this.stream.getByte()}getToken(){let e=!1,t=this.currentChar;for(;;){if(t<0)return pt;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(!isWhiteSpace(t))break;t=this.nextChar()}switch(0|t){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return new PostScriptToken(cs.NUMBER,this.getNumber());case 123:this.nextChar();return PostScriptToken.LBRACE;case 125:this.nextChar();return PostScriptToken.RBRACE}const i=this.strBuf;i.length=0;i[0]=String.fromCharCode(t);for(;(t=this.nextChar())>=0&&(t>=65&&t<=90||t>=97&&t<=122);)i.push(String.fromCharCode(t));const a=i.join("");switch(a.toLowerCase()){case"if":return PostScriptToken.IF;case"ifelse":return PostScriptToken.IFELSE;default:return PostScriptToken.getOperator(a)}}getNumber(){let e=this.currentChar;const t=this.strBuf;t.length=0;t[0]=String.fromCharCode(e);for(;(e=this.nextChar())>=0&&(e>=48&&e<=57||45===e||46===e);)t.push(String.fromCharCode(e));const i=parseFloat(t.join(""));if(isNaN(i))throw new FormatError(`Invalid floating point number: ${i}`);return i}}class BaseLocalCache{constructor(e){this.constructor===BaseLocalCache&&unreachable("Cannot initialize BaseLocalCache.");this._onlyRefs=!0===e?.onlyRefs;if(!this._onlyRefs){this._nameRefMap=new Map;this._imageMap=new Map}this._imageCache=new RefSetCache}getByName(e){this._onlyRefs&&unreachable("Should not call `getByName` method.");const t=this._nameRefMap.get(e);return t?this.getByRef(t):this._imageMap.get(e)||null}getByRef(e){return this._imageCache.get(e)||null}set(e,t,i){unreachable("Abstract method `set` called.")}}class LocalImageCache extends BaseLocalCache{set(e,t=null,i){if("string"!=typeof e)throw new Error('LocalImageCache.set - expected "name" argument.');if(t){if(this._imageCache.has(t))return;this._nameRefMap.set(e,t);this._imageCache.put(t,i)}else this._imageMap.has(e)||this._imageMap.set(e,i)}}class LocalColorSpaceCache extends BaseLocalCache{set(e=null,t=null,i){if("string"!=typeof e&&!t)throw new Error('LocalColorSpaceCache.set - expected "name" and/or "ref" argument.');if(t){if(this._imageCache.has(t))return;null!==e&&this._nameRefMap.set(e,t);this._imageCache.put(t,i)}else this._imageMap.has(e)||this._imageMap.set(e,i)}}class LocalFunctionCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,i){if(!t)throw new Error('LocalFunctionCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,i)}}class LocalGStateCache extends BaseLocalCache{set(e,t=null,i){if("string"!=typeof e)throw new Error('LocalGStateCache.set - expected "name" argument.');if(t){if(this._imageCache.has(t))return;this._nameRefMap.set(e,t);this._imageCache.put(t,i)}else this._imageMap.has(e)||this._imageMap.set(e,i)}}class LocalTilingPatternCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,i){if(!t)throw new Error('LocalTilingPatternCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,i)}}class RegionalImageCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,i){if(!t)throw new Error('RegionalImageCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,i)}}class GlobalImageCache{static NUM_PAGES_THRESHOLD=2;static MIN_IMAGES_TO_CACHE=10;static MAX_BYTE_SIZE=5e7;#D=new RefSet;constructor(){this._refCache=new RefSetCache;this._imageCache=new RefSetCache}get#b(){let e=0;for(const t of this._imageCache)e+=t.byteSize;return e}get#F(){return!(this._imageCache.size<GlobalImageCache.MIN_IMAGES_TO_CACHE)&&!(this.#b<GlobalImageCache.MAX_BYTE_SIZE)}shouldCache(e,t){let i=this._refCache.get(e);if(!i){i=new Set;this._refCache.put(e,i)}i.add(t);return!(i.size<GlobalImageCache.NUM_PAGES_THRESHOLD)&&!(!this._imageCache.has(e)&&this.#F)}addDecodeFailed(e){this.#D.put(e)}hasDecodeFailed(e){return this.#D.has(e)}addByteSize(e,t){const i=this._imageCache.get(e);i&&(i.byteSize||(i.byteSize=t))}getData(e,t){const i=this._refCache.get(e);if(!i)return null;if(i.size<GlobalImageCache.NUM_PAGES_THRESHOLD)return null;const a=this._imageCache.get(e);if(!a)return null;i.add(t);return a}setData(e,t){if(!this._refCache.has(e))throw new Error('GlobalImageCache.setData - expected "shouldCache" to have been called.');this._imageCache.has(e)||(this.#F?warn("GlobalImageCache.setData - cache limit reached."):this._imageCache.put(e,t))}clear(e=!1){if(!e){this.#D.clear();this._refCache.clear()}this._imageCache.clear()}}class PDFFunctionFactory{constructor({xref:e,isEvalSupported:t=!0}){this.xref=e;this.isEvalSupported=!1!==t}create(e){const t=this.getCached(e);if(t)return t;const i=PDFFunction.parse({xref:this.xref,isEvalSupported:this.isEvalSupported,fn:e instanceof Ref?this.xref.fetch(e):e});this._cache(e,i);return i}createFromArray(e){const t=this.getCached(e);if(t)return t;const i=PDFFunction.parseArray({xref:this.xref,isEvalSupported:this.isEvalSupported,fnObj:e instanceof Ref?this.xref.fetch(e):e});this._cache(e,i);return i}getCached(e){let t;e instanceof Ref?t=e:e instanceof Dict?t=e.objId:e instanceof BaseStream&&(t=e.dict?.objId);if(t){const e=this._localFunctionCache.getByRef(t);if(e)return e}return null}_cache(e,t){if(!t)throw new Error('PDFFunctionFactory._cache - expected "parsedFunction" argument.');let i;e instanceof Ref?i=e:e instanceof Dict?i=e.objId:e instanceof BaseStream&&(i=e.dict?.objId);i&&this._localFunctionCache.set(null,i,t)}get _localFunctionCache(){return shadow(this,"_localFunctionCache",new LocalFunctionCache)}}function toNumberArray(e){return Array.isArray(e)?isNumberArray(e,null)?e:e.map((e=>+e)):null}class PDFFunction{static getSampleArray(e,t,i,a){let s,r,n=1;for(s=0,r=e.length;s<r;s++)n*=e[s];n*=t;const g=new Array(n);let o=0,c=0;const C=1/(2**i-1),h=a.getBytes((n*i+7)/8);let l=0;for(s=0;s<n;s++){for(;o<i;){c<<=8;c|=h[l++];o+=8}o-=i;g[s]=(c>>o)*C;c&=(1<<o)-1}return g}static parse({xref:e,isEvalSupported:t,fn:i}){const a=i.dict||i;switch(a.get("FunctionType")){case 0:return this.constructSampled({xref:e,isEvalSupported:t,fn:i,dict:a});case 1:break;case 2:return this.constructInterpolated({xref:e,isEvalSupported:t,dict:a});case 3:return this.constructStiched({xref:e,isEvalSupported:t,dict:a});case 4:return this.constructPostScript({xref:e,isEvalSupported:t,fn:i,dict:a})}throw new FormatError("Unknown type of function")}static parseArray({xref:e,isEvalSupported:t,fnObj:i}){if(!Array.isArray(i))return this.parse({xref:e,isEvalSupported:t,fn:i});const a=[];for(const s of i)a.push(this.parse({xref:e,isEvalSupported:t,fn:e.fetchIfRef(s)}));return function(e,t,i,s){for(let r=0,n=a.length;r<n;r++)a[r](e,t,i,s+r)}}static constructSampled({xref:e,isEvalSupported:t,fn:i,dict:a}){function toMultiArray(e){const t=e.length,i=[];let a=0;for(let s=0;s<t;s+=2)i[a++]=[e[s],e[s+1]];return i}function interpolate(e,t,i,a,s){return a+(s-a)/(i-t)*(e-t)}let s=toNumberArray(a.getArray("Domain")),r=toNumberArray(a.getArray("Range"));if(!s||!r)throw new FormatError("No domain or range");const n=s.length/2,g=r.length/2;s=toMultiArray(s);r=toMultiArray(r);const o=toNumberArray(a.getArray("Size")),c=a.get("BitsPerSample"),C=a.get("Order")||1;1!==C&&info("No support for cubic spline interpolation: "+C);let h=toNumberArray(a.getArray("Encode"));if(h)h=toMultiArray(h);else{h=[];for(let e=0;e<n;++e)h.push([0,o[e]-1])}let l=toNumberArray(a.getArray("Decode"));l=l?toMultiArray(l):r;const Q=this.getSampleArray(o,g,c,i);return function constructSampledFn(e,t,i,a){const c=1<<n,C=new Float64Array(c),E=new Uint32Array(c);let u,d;for(d=0;d<c;d++)C[d]=1;let f=g,p=1;for(u=0;u<n;++u){const i=s[u][0],a=s[u][1];let r=interpolate(Math.min(Math.max(e[t+u],i),a),i,a,h[u][0],h[u][1]);const n=o[u];r=Math.min(Math.max(r,0),n-1);const g=r<n-1?Math.floor(r):r-1,l=g+1-r,Q=r-g,m=g*f,y=m+f;for(d=0;d<c;d++)if(d&p){C[d]*=Q;E[d]+=y}else{C[d]*=l;E[d]+=m}f*=n;p<<=1}for(d=0;d<g;++d){let e=0;for(u=0;u<c;u++)e+=Q[E[u]+d]*C[u];e=interpolate(e,0,1,l[d][0],l[d][1]);i[a+d]=Math.min(Math.max(e,r[d][0]),r[d][1])}}}static constructInterpolated({xref:e,isEvalSupported:t,dict:i}){const a=toNumberArray(i.getArray("C0"))||[0],s=toNumberArray(i.getArray("C1"))||[1],r=i.get("N"),n=[];for(let e=0,t=a.length;e<t;++e)n.push(s[e]-a[e]);const g=n.length;return function constructInterpolatedFn(e,t,i,s){const o=1===r?e[t]:e[t]**r;for(let e=0;e<g;++e)i[s+e]=a[e]+o*n[e]}}static constructStiched({xref:e,isEvalSupported:t,dict:i}){const a=toNumberArray(i.getArray("Domain"));if(!a)throw new FormatError("No domain");if(1!==a.length/2)throw new FormatError("Bad domain for stiched function");const s=[];for(const a of i.get("Functions"))s.push(this.parse({xref:e,isEvalSupported:t,fn:e.fetchIfRef(a)}));const r=toNumberArray(i.getArray("Bounds")),n=toNumberArray(i.getArray("Encode")),g=new Float32Array(1);return function constructStichedFn(e,t,i,o){const c=function constructStichedFromIRClip(e,t,i){e>i?e=i:e<t&&(e=t);return e}(e[t],a[0],a[1]),C=r.length;let h;for(h=0;h<C&&!(c<r[h]);++h);let l=a[0];h>0&&(l=r[h-1]);let Q=a[1];h<r.length&&(Q=r[h]);const E=n[2*h],u=n[2*h+1];g[0]=l===Q?E:E+(c-l)*(u-E)/(Q-l);s[h](g,0,i,o)}}static constructPostScript({xref:e,isEvalSupported:t,fn:i,dict:a}){const s=toNumberArray(a.getArray("Domain")),r=toNumberArray(a.getArray("Range"));if(!s)throw new FormatError("No domain.");if(!r)throw new FormatError("No range.");const n=new PostScriptLexer(i),g=new PostScriptParser(n).parse();if(t&&FeatureTest.isEvalSupported){const e=(new PostScriptCompiler).compile(g,s,r);if(e)return new Function("src","srcOffset","dest","destOffset",e)}info("Unable to compile PS function");const o=r.length>>1,c=s.length>>1,C=new PostScriptEvaluator(g),h=Object.create(null);let l=8192;const Q=new Float32Array(c);return function constructPostScriptFn(e,t,i,a){let s,n,g="";const E=Q;for(s=0;s<c;s++){n=e[t+s];E[s]=n;g+=n+"_"}const u=h[g];if(void 0!==u){i.set(u,a);return}const d=new Float32Array(o),f=C.execute(E),p=f.length-o;for(s=0;s<o;s++){n=f[p+s];let e=r[2*s];if(n<e)n=e;else{e=r[2*s+1];n>e&&(n=e)}d[s]=n}if(l>0){l--;h[g]=d}i.set(d,a)}}}function isPDFFunction(e){let t;if(e instanceof Dict)t=e;else{if(!(e instanceof BaseStream))return!1;t=e.dict}return t.has("FunctionType")}class PostScriptStack{static MAX_STACK_SIZE=100;constructor(e){this.stack=e?Array.from(e):[]}push(e){if(this.stack.length>=PostScriptStack.MAX_STACK_SIZE)throw new Error("PostScript function stack overflow.");this.stack.push(e)}pop(){if(this.stack.length<=0)throw new Error("PostScript function stack underflow.");return this.stack.pop()}copy(e){if(this.stack.length+e>=PostScriptStack.MAX_STACK_SIZE)throw new Error("PostScript function stack overflow.");const t=this.stack;for(let i=t.length-e,a=e-1;a>=0;a--,i++)t.push(t[i])}index(e){this.push(this.stack[this.stack.length-e-1])}roll(e,t){const i=this.stack,a=i.length-e,s=i.length-1,r=a+(t-Math.floor(t/e)*e);for(let e=a,t=s;e<t;e++,t--){const a=i[e];i[e]=i[t];i[t]=a}for(let e=a,t=r-1;e<t;e++,t--){const a=i[e];i[e]=i[t];i[t]=a}for(let e=r,t=s;e<t;e++,t--){const a=i[e];i[e]=i[t];i[t]=a}}}class PostScriptEvaluator{constructor(e){this.operators=e}execute(e){const t=new PostScriptStack(e);let i=0;const a=this.operators,s=a.length;let r,n,g;for(;i<s;){r=a[i++];if("number"!=typeof r)switch(r){case"jz":g=t.pop();n=t.pop();n||(i=g);break;case"j":n=t.pop();i=n;break;case"abs":n=t.pop();t.push(Math.abs(n));break;case"add":g=t.pop();n=t.pop();t.push(n+g);break;case"and":g=t.pop();n=t.pop();"boolean"==typeof n&&"boolean"==typeof g?t.push(n&&g):t.push(n&g);break;case"atan":g=t.pop();n=t.pop();n=Math.atan2(n,g)/Math.PI*180;n<0&&(n+=360);t.push(n);break;case"bitshift":g=t.pop();n=t.pop();n>0?t.push(n<<g):t.push(n>>g);break;case"ceiling":n=t.pop();t.push(Math.ceil(n));break;case"copy":n=t.pop();t.copy(n);break;case"cos":n=t.pop();t.push(Math.cos(n%360/180*Math.PI));break;case"cvi":n=0|t.pop();t.push(n);break;case"cvr":break;case"div":g=t.pop();n=t.pop();t.push(n/g);break;case"dup":t.copy(1);break;case"eq":g=t.pop();n=t.pop();t.push(n===g);break;case"exch":t.roll(2,1);break;case"exp":g=t.pop();n=t.pop();t.push(n**g);break;case"false":t.push(!1);break;case"floor":n=t.pop();t.push(Math.floor(n));break;case"ge":g=t.pop();n=t.pop();t.push(n>=g);break;case"gt":g=t.pop();n=t.pop();t.push(n>g);break;case"idiv":g=t.pop();n=t.pop();t.push(n/g|0);break;case"index":n=t.pop();t.index(n);break;case"le":g=t.pop();n=t.pop();t.push(n<=g);break;case"ln":n=t.pop();t.push(Math.log(n));break;case"log":n=t.pop();t.push(Math.log10(n));break;case"lt":g=t.pop();n=t.pop();t.push(n<g);break;case"mod":g=t.pop();n=t.pop();t.push(n%g);break;case"mul":g=t.pop();n=t.pop();t.push(n*g);break;case"ne":g=t.pop();n=t.pop();t.push(n!==g);break;case"neg":n=t.pop();t.push(-n);break;case"not":n=t.pop();"boolean"==typeof n?t.push(!n):t.push(~n);break;case"or":g=t.pop();n=t.pop();"boolean"==typeof n&&"boolean"==typeof g?t.push(n||g):t.push(n|g);break;case"pop":t.pop();break;case"roll":g=t.pop();n=t.pop();t.roll(n,g);break;case"round":n=t.pop();t.push(Math.round(n));break;case"sin":n=t.pop();t.push(Math.sin(n%360/180*Math.PI));break;case"sqrt":n=t.pop();t.push(Math.sqrt(n));break;case"sub":g=t.pop();n=t.pop();t.push(n-g);break;case"true":t.push(!0);break;case"truncate":n=t.pop();n=n<0?Math.ceil(n):Math.floor(n);t.push(n);break;case"xor":g=t.pop();n=t.pop();"boolean"==typeof n&&"boolean"==typeof g?t.push(n!==g):t.push(n^g);break;default:throw new FormatError(`Unknown operator ${r}`)}else t.push(r)}return t.stack}}class AstNode{constructor(e){this.type=e}visit(e){unreachable("abstract method")}}class AstArgument extends AstNode{constructor(e,t,i){super("args");this.index=e;this.min=t;this.max=i}visit(e){e.visitArgument(this)}}class AstLiteral extends AstNode{constructor(e){super("literal");this.number=e;this.min=e;this.max=e}visit(e){e.visitLiteral(this)}}class AstBinaryOperation extends AstNode{constructor(e,t,i,a,s){super("binary");this.op=e;this.arg1=t;this.arg2=i;this.min=a;this.max=s}visit(e){e.visitBinaryOperation(this)}}class AstMin extends AstNode{constructor(e,t){super("max");this.arg=e;this.min=e.min;this.max=t}visit(e){e.visitMin(this)}}class AstVariable extends AstNode{constructor(e,t,i){super("var");this.index=e;this.min=t;this.max=i}visit(e){e.visitVariable(this)}}class AstVariableDefinition extends AstNode{constructor(e,t){super("definition");this.variable=e;this.arg=t}visit(e){e.visitVariableDefinition(this)}}class ExpressionBuilderVisitor{constructor(){this.parts=[]}visitArgument(e){this.parts.push("Math.max(",e.min,", Math.min(",e.max,", src[srcOffset + ",e.index,"]))")}visitVariable(e){this.parts.push("v",e.index)}visitLiteral(e){this.parts.push(e.number)}visitBinaryOperation(e){this.parts.push("(");e.arg1.visit(this);this.parts.push(" ",e.op," ");e.arg2.visit(this);this.parts.push(")")}visitVariableDefinition(e){this.parts.push("var ");e.variable.visit(this);this.parts.push(" = ");e.arg.visit(this);this.parts.push(";")}visitMin(e){this.parts.push("Math.min(");e.arg.visit(this);this.parts.push(", ",e.max,")")}toString(){return this.parts.join("")}}function buildAddOperation(e,t){return"literal"===t.type&&0===t.number?e:"literal"===e.type&&0===e.number?t:"literal"===t.type&&"literal"===e.type?new AstLiteral(e.number+t.number):new AstBinaryOperation("+",e,t,e.min+t.min,e.max+t.max)}function buildMulOperation(e,t){if("literal"===t.type){if(0===t.number)return new AstLiteral(0);if(1===t.number)return e;if("literal"===e.type)return new AstLiteral(e.number*t.number)}if("literal"===e.type){if(0===e.number)return new AstLiteral(0);if(1===e.number)return t}const i=Math.min(e.min*t.min,e.min*t.max,e.max*t.min,e.max*t.max),a=Math.max(e.min*t.min,e.min*t.max,e.max*t.min,e.max*t.max);return new AstBinaryOperation("*",e,t,i,a)}function buildSubOperation(e,t){if("literal"===t.type){if(0===t.number)return e;if("literal"===e.type)return new AstLiteral(e.number-t.number)}return"binary"===t.type&&"-"===t.op&&"literal"===e.type&&1===e.number&&"literal"===t.arg1.type&&1===t.arg1.number?t.arg2:new AstBinaryOperation("-",e,t,e.min-t.max,e.max-t.min)}function buildMinOperation(e,t){return e.min>=t?new AstLiteral(t):e.max<=t?e:new AstMin(e,t)}class PostScriptCompiler{compile(e,t,i){const a=[],s=[],r=t.length>>1,n=i.length>>1;let g,o,c,C,h,l,Q,E,u=0;for(let e=0;e<r;e++)a.push(new AstArgument(e,t[2*e],t[2*e+1]));for(let t=0,i=e.length;t<i;t++){E=e[t];if("number"!=typeof E)switch(E){case"add":if(a.length<2)return null;C=a.pop();c=a.pop();a.push(buildAddOperation(c,C));break;case"cvr":if(a.length<1)return null;break;case"mul":if(a.length<2)return null;C=a.pop();c=a.pop();a.push(buildMulOperation(c,C));break;case"sub":if(a.length<2)return null;C=a.pop();c=a.pop();a.push(buildSubOperation(c,C));break;case"exch":if(a.length<2)return null;h=a.pop();l=a.pop();a.push(h,l);break;case"pop":if(a.length<1)return null;a.pop();break;case"index":if(a.length<1)return null;c=a.pop();if("literal"!==c.type)return null;g=c.number;if(g<0||!Number.isInteger(g)||a.length<g)return null;h=a[a.length-g-1];if("literal"===h.type||"var"===h.type){a.push(h);break}Q=new AstVariable(u++,h.min,h.max);a[a.length-g-1]=Q;a.push(Q);s.push(new AstVariableDefinition(Q,h));break;case"dup":if(a.length<1)return null;if("number"==typeof e[t+1]&&"gt"===e[t+2]&&e[t+3]===t+7&&"jz"===e[t+4]&&"pop"===e[t+5]&&e[t+6]===e[t+1]){c=a.pop();a.push(buildMinOperation(c,e[t+1]));t+=6;break}h=a.at(-1);if("literal"===h.type||"var"===h.type){a.push(h);break}Q=new AstVariable(u++,h.min,h.max);a[a.length-1]=Q;a.push(Q);s.push(new AstVariableDefinition(Q,h));break;case"roll":if(a.length<2)return null;C=a.pop();c=a.pop();if("literal"!==C.type||"literal"!==c.type)return null;o=C.number;g=c.number;if(g<=0||!Number.isInteger(g)||!Number.isInteger(o)||a.length<g)return null;o=(o%g+g)%g;if(0===o)break;a.push(...a.splice(a.length-g,g-o));break;default:return null}else a.push(new AstLiteral(E))}if(a.length!==n)return null;const d=[];for(const e of s){const t=new ExpressionBuilderVisitor;e.visit(t);d.push(t.toString())}for(let e=0,t=a.length;e<t;e++){const t=a[e],s=new ExpressionBuilderVisitor;t.visit(s);const r=i[2*e],n=i[2*e+1],g=[s.toString()];if(r>t.min){g.unshift("Math.max(",r,", ");g.push(")")}if(n<t.max){g.unshift("Math.min(",n,", ");g.push(")")}g.unshift("dest[destOffset + ",e,"] = ");g.push(";");d.push(g.join(""))}return d.join("\n")}}const Cs=["BN","BN","BN","BN","BN","BN","BN","BN","BN","S","B","S","WS","B","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","B","B","B","S","WS","ON","ON","ET","ET","ET","ON","ON","ON","ON","ON","ES","CS","ES","CS","CS","EN","EN","EN","EN","EN","EN","EN","EN","EN","EN","CS","ON","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","ON","ON","ON","BN","BN","BN","BN","BN","BN","B","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","CS","ON","ET","ET","ET","ET","ON","ON","ON","ON","L","ON","ON","BN","ON","ON","ET","ET","EN","EN","ON","L","ON","ON","ON","EN","L","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","L","L","L","L","L","L","L","L"],hs=["AN","AN","AN","AN","AN","AN","ON","ON","AL","ET","ET","AL","CS","AL","ON","ON","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AL","AL","","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AN","AN","AN","AN","AN","AN","AN","AN","AN","AN","ET","AN","AN","AL","AL","AL","NSM","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AN","ON","NSM","NSM","NSM","NSM","NSM","NSM","AL","AL","NSM","NSM","ON","NSM","NSM","NSM","NSM","AL","AL","EN","EN","EN","EN","EN","EN","EN","EN","EN","EN","AL","AL","AL","AL","AL","AL"];function isOdd(e){return 0!=(1&e)}function isEven(e){return 0==(1&e)}function findUnequal(e,t,i){let a,s;for(a=t,s=e.length;a<s;++a)if(e[a]!==i)return a;return a}function setValues(e,t,i,a){for(let s=t;s<i;++s)e[s]=a}function reverseValues(e,t,i){for(let a=t,s=i-1;a<s;++a,--s){const t=e[a];e[a]=e[s];e[s]=t}}function createBidiText(e,t,i=!1){let a="ltr";i?a="ttb":t||(a="rtl");return{str:e,dir:a}}const Bs=[],ls=[];function bidi(e,t=-1,i=!1){let a=!0;const s=e.length;if(0===s||i)return createBidiText(e,a,i);Bs.length=s;ls.length=s;let r,n,g=0;for(r=0;r<s;++r){Bs[r]=e.charAt(r);const t=e.charCodeAt(r);let i="L";if(t<=255)i=Cs[t];else if(1424<=t&&t<=1524)i="R";else if(1536<=t&&t<=1791){i=hs[255&t];i||warn("Bidi: invalid Unicode character "+t.toString(16))}else(1792<=t&&t<=2220||64336<=t&&t<=65023||65136<=t&&t<=65279)&&(i="AL");"R"!==i&&"AL"!==i&&"AN"!==i||g++;ls[r]=i}if(0===g){a=!0;return createBidiText(e,a)}if(-1===t)if(g/s<.3&&s>4){a=!0;t=0}else{a=!1;t=1}const o=[];for(r=0;r<s;++r)o[r]=t;const c=isOdd(t)?"R":"L",C=c,h=C;let l,Q=C;for(r=0;r<s;++r)"NSM"===ls[r]?ls[r]=Q:Q=ls[r];Q=C;for(r=0;r<s;++r){l=ls[r];"EN"===l?ls[r]="AL"===Q?"AN":"EN":"R"!==l&&"L"!==l&&"AL"!==l||(Q=l)}for(r=0;r<s;++r){l=ls[r];"AL"===l&&(ls[r]="R")}for(r=1;r<s-1;++r){"ES"===ls[r]&&"EN"===ls[r-1]&&"EN"===ls[r+1]&&(ls[r]="EN");"CS"!==ls[r]||"EN"!==ls[r-1]&&"AN"!==ls[r-1]||ls[r+1]!==ls[r-1]||(ls[r]=ls[r-1])}for(r=0;r<s;++r)if("EN"===ls[r]){for(let e=r-1;e>=0&&"ET"===ls[e];--e)ls[e]="EN";for(let e=r+1;e<s&&"ET"===ls[e];++e)ls[e]="EN"}for(r=0;r<s;++r){l=ls[r];"WS"!==l&&"ES"!==l&&"ET"!==l&&"CS"!==l||(ls[r]="ON")}Q=C;for(r=0;r<s;++r){l=ls[r];"EN"===l?ls[r]="L"===Q?"L":"EN":"R"!==l&&"L"!==l||(Q=l)}for(r=0;r<s;++r)if("ON"===ls[r]){const e=findUnequal(ls,r+1,"ON");let t=C;r>0&&(t=ls[r-1]);let i=h;e+1<s&&(i=ls[e+1]);"L"!==t&&(t="R");"L"!==i&&(i="R");t===i&&setValues(ls,r,e,t);r=e-1}for(r=0;r<s;++r)"ON"===ls[r]&&(ls[r]=c);for(r=0;r<s;++r){l=ls[r];isEven(o[r])?"R"===l?o[r]+=1:"AN"!==l&&"EN"!==l||(o[r]+=2):"L"!==l&&"AN"!==l&&"EN"!==l||(o[r]+=1)}let E,u=-1,d=99;for(r=0,n=o.length;r<n;++r){E=o[r];u<E&&(u=E);d>E&&isOdd(E)&&(d=E)}for(E=u;E>=d;--E){let e=-1;for(r=0,n=o.length;r<n;++r)if(o[r]<E){if(e>=0){reverseValues(Bs,e,r);e=-1}}else e<0&&(e=r);e>=0&&reverseValues(Bs,e,o.length)}for(r=0,n=Bs.length;r<n;++r){const e=Bs[r];"<"!==e&&">"!==e||(Bs[r]="")}return createBidiText(Bs.join(""),a)}const Qs={style:"normal",weight:"normal"},Es={style:"normal",weight:"bold"},us={style:"italic",weight:"normal"},ds={style:"italic",weight:"bold"},fs=new Map([["Times-Roman",{local:["Times New Roman","Times-Roman","Times","Liberation Serif","Nimbus Roman","Nimbus Roman L","Tinos","Thorndale","TeX Gyre Termes","FreeSerif","Linux Libertine O","Libertinus Serif","DejaVu Serif","Bitstream Vera Serif","Ubuntu"],style:Qs,ultimate:"serif"}],["Times-Bold",{alias:"Times-Roman",style:Es,ultimate:"serif"}],["Times-Italic",{alias:"Times-Roman",style:us,ultimate:"serif"}],["Times-BoldItalic",{alias:"Times-Roman",style:ds,ultimate:"serif"}],["Helvetica",{local:["Helvetica","Helvetica Neue","Arial","Arial Nova","Liberation Sans","Arimo","Nimbus Sans","Nimbus Sans L","A030","TeX Gyre Heros","FreeSans","DejaVu Sans","Albany","Bitstream Vera Sans","Arial Unicode MS","Microsoft Sans Serif","Apple Symbols","Cantarell"],path:"LiberationSans-Regular.ttf",style:Qs,ultimate:"sans-serif"}],["Helvetica-Bold",{alias:"Helvetica",path:"LiberationSans-Bold.ttf",style:Es,ultimate:"sans-serif"}],["Helvetica-Oblique",{alias:"Helvetica",path:"LiberationSans-Italic.ttf",style:us,ultimate:"sans-serif"}],["Helvetica-BoldOblique",{alias:"Helvetica",path:"LiberationSans-BoldItalic.ttf",style:ds,ultimate:"sans-serif"}],["Courier",{local:["Courier","Courier New","Liberation Mono","Nimbus Mono","Nimbus Mono L","Cousine","Cumberland","TeX Gyre Cursor","FreeMono","Linux Libertine Mono O","Libertinus Mono"],style:Qs,ultimate:"monospace"}],["Courier-Bold",{alias:"Courier",style:Es,ultimate:"monospace"}],["Courier-Oblique",{alias:"Courier",style:us,ultimate:"monospace"}],["Courier-BoldOblique",{alias:"Courier",style:ds,ultimate:"monospace"}],["ArialBlack",{local:["Arial Black"],style:{style:"normal",weight:"900"},fallback:"Helvetica-Bold"}],["ArialBlack-Bold",{alias:"ArialBlack"}],["ArialBlack-Italic",{alias:"ArialBlack",style:{style:"italic",weight:"900"},fallback:"Helvetica-BoldOblique"}],["ArialBlack-BoldItalic",{alias:"ArialBlack-Italic"}],["ArialNarrow",{local:["Arial Narrow","Liberation Sans Narrow","Helvetica Condensed","Nimbus Sans Narrow","TeX Gyre Heros Cn"],style:Qs,fallback:"Helvetica"}],["ArialNarrow-Bold",{alias:"ArialNarrow",style:Es,fallback:"Helvetica-Bold"}],["ArialNarrow-Italic",{alias:"ArialNarrow",style:us,fallback:"Helvetica-Oblique"}],["ArialNarrow-BoldItalic",{alias:"ArialNarrow",style:ds,fallback:"Helvetica-BoldOblique"}],["Calibri",{local:["Calibri","Carlito"],style:Qs,fallback:"Helvetica"}],["Calibri-Bold",{alias:"Calibri",style:Es,fallback:"Helvetica-Bold"}],["Calibri-Italic",{alias:"Calibri",style:us,fallback:"Helvetica-Oblique"}],["Calibri-BoldItalic",{alias:"Calibri",style:ds,fallback:"Helvetica-BoldOblique"}],["Wingdings",{local:["Wingdings","URW Dingbats"],style:Qs}],["Wingdings-Regular",{alias:"Wingdings"}],["Wingdings-Bold",{alias:"Wingdings"}]]),ps=new Map([["Arial-Black","ArialBlack"]]);function getFamilyName(e){const t=new Set(["thin","extralight","ultralight","demilight","semilight","light","book","regular","normal","medium","demibold","semibold","bold","extrabold","ultrabold","black","heavy","extrablack","ultrablack","roman","italic","oblique","ultracondensed","extracondensed","condensed","semicondensed","normal","semiexpanded","expanded","extraexpanded","ultraexpanded","bolditalic"]);return e.split(/[- ,+]+/g).filter((e=>!t.has(e.toLowerCase()))).join(" ")}function generateFont({alias:e,local:t,path:i,fallback:a,style:s,ultimate:r},n,g,o=!0,c=!0,C=""){const h={style:null,ultimate:null};if(t){const e=C?` ${C}`:"";for(const i of t)n.push(`local(${i}${e})`)}if(e){const t=fs.get(e),r=C||function getStyleToAppend(e){switch(e){case Es:return"Bold";case us:return"Italic";case ds:return"Bold Italic";default:if("bold"===e?.weight)return"Bold";if("italic"===e?.style)return"Italic"}return""}(s);Object.assign(h,generateFont(t,n,g,o&&!a,c&&!i,r))}s&&(h.style=s);r&&(h.ultimate=r);if(o&&a){const e=fs.get(a),{ultimate:t}=generateFont(e,n,g,o,c&&!i,C);h.ultimate||=t}c&&i&&g&&n.push(`url(${g}${i})`);return h}function getFontSubstitution(e,t,i,a,s,r){if(a.startsWith("InvalidPDFjsFont_"))return null;"TrueType"!==r&&"Type1"!==r||!/^[A-Z]{6}\+/.test(a)||(a=a.slice(7));const n=a=normalizeFontName(a);let g=e.get(n);if(g)return g;let o=fs.get(a);if(!o)for(const[e,t]of ps)if(a.startsWith(e)){a=`${t}${a.substring(e.length)}`;o=fs.get(a);break}let c=!1;if(!o){o=fs.get(s);c=!0}const C=`${t.getDocId()}_s${t.createFontId()}`;if(!o){if(!validateFontName(a)){warn(`Cannot substitute the font because of its name: ${a}`);e.set(n,null);return null}const t=/bold/gi.test(a),i=/oblique|italic/gi.test(a),s=t&&i&&ds||t&&Es||i&&us||Qs;g={css:`"${getFamilyName(a)}",${C}`,guessFallback:!0,loadedName:C,baseFontName:a,src:`local(${a})`,style:s};e.set(n,g);return g}const h=[];c&&validateFontName(a)&&h.push(`local(${a})`);const{style:l,ultimate:Q}=generateFont(o,h,i),E=null===Q,u=E?"":`,${Q}`;g={css:`"${getFamilyName(a)}",${C}${u}`,guessFallback:E,loadedName:C,baseFontName:a,src:h.join(","),style:l};e.set(n,g);return g}class ImageResizer{constructor(e,t){this._imgData=e;this._isMask=t}static needsToBeResized(e,t){if(e<=this._goodSquareLength&&t<=this._goodSquareLength)return!1;const{MAX_DIM:i}=this;if(e>i||t>i)return!0;const a=e*t;if(this._hasMaxArea)return a>this.MAX_AREA;if(a<this._goodSquareLength**2)return!1;if(this._areGoodDims(e,t)){this._goodSquareLength=Math.max(this._goodSquareLength,Math.floor(Math.sqrt(e*t)));return!1}this._goodSquareLength=this._guessMax(this._goodSquareLength,i,128,0);return a>(this.MAX_AREA=this._goodSquareLength**2)}static get MAX_DIM(){return shadow(this,"MAX_DIM",this._guessMax(2048,65537,0,1))}static get MAX_AREA(){this._hasMaxArea=!0;return shadow(this,"MAX_AREA",this._guessMax(ImageResizer._goodSquareLength,this.MAX_DIM,128,0)**2)}static set MAX_AREA(e){if(e>=0){this._hasMaxArea=!0;shadow(this,"MAX_AREA",e)}}static setMaxArea(e){this._hasMaxArea||(this.MAX_AREA=e>>2)}static _areGoodDims(e,t){try{const i=new OffscreenCanvas(e,t),a=i.getContext("2d");a.fillRect(0,0,1,1);const s=a.getImageData(0,0,1,1).data[3];i.width=i.height=1;return 0!==s}catch{return!1}}static _guessMax(e,t,i,a){for(;e+i+1<t;){const i=Math.floor((e+t)/2),s=a||i;this._areGoodDims(i,s)?e=i:t=i}return e}static async createImage(e,t=!1){return new ImageResizer(e,t)._createImage()}async _createImage(){const e=this._encodeBMP(),t=new Blob([e.buffer],{type:"image/bmp"}),i=createImageBitmap(t),{MAX_AREA:a,MAX_DIM:s}=ImageResizer,{_imgData:r}=this,{width:n,height:g}=r,o=Math.max(n/s,g/s,Math.sqrt(n*g/a)),c=Math.max(o,2),C=Math.round(10*(o+1.25))/10/c,h=Math.floor(Math.log2(C)),l=new Array(h+2).fill(2);l[0]=c;l.splice(-1,1,C/(1<<h));let Q=n,E=g,u=await i;for(const e of l){const t=Q,i=E;Q=Math.floor(Q/e)-1;E=Math.floor(E/e)-1;const a=new OffscreenCanvas(Q,E);a.getContext("2d").drawImage(u,0,0,t,i,0,0,Q,E);u=a.transferToImageBitmap()}r.data=null;r.bitmap=u;r.width=Q;r.height=E;return r}_encodeBMP(){const{width:e,height:t,kind:i}=this._imgData;let a,s=this._imgData.data,r=new Uint8Array(0),n=r,g=0;switch(i){case D:{a=1;r=new Uint8Array(this._isMask?[255,255,255,255,0,0,0,0]:[0,0,0,0,255,255,255,255]);const i=e+7>>3,n=i+3&-4;if(i!==n){const e=new Uint8Array(n*t);let a=0;for(let r=0,g=t*i;r<g;r+=i,a+=n)e.set(s.subarray(r,r+i),a);s=e}break}case b:a=24;if(3&e){const i=3*e,a=i+3&-4,r=a-i,n=new Uint8Array(a*t);let g=0;for(let e=0,a=t*i;e<a;e+=i){const t=s.subarray(e,e+i);for(let e=0;e<i;e+=3){n[g++]=t[e+2];n[g++]=t[e+1];n[g++]=t[e]}g+=r}s=n}else for(let e=0,t=s.length;e<t;e+=3){const t=s[e];s[e]=s[e+2];s[e+2]=t}break;case F:a=32;g=3;n=new Uint8Array(68);const i=new DataView(n.buffer);if(FeatureTest.isLittleEndian){i.setUint32(0,255,!0);i.setUint32(4,65280,!0);i.setUint32(8,16711680,!0);i.setUint32(12,4278190080,!0)}else{i.setUint32(0,4278190080,!0);i.setUint32(4,16711680,!0);i.setUint32(8,65280,!0);i.setUint32(12,255,!0)}break;default:throw new Error("invalid format")}let o=0;const c=40+n.length,C=14+c+r.length+s.length,h=new Uint8Array(C),l=new DataView(h.buffer);l.setUint16(o,19778,!0);o+=2;l.setUint32(o,C,!0);o+=4;l.setUint32(o,0,!0);o+=4;l.setUint32(o,14+c+r.length,!0);o+=4;l.setUint32(o,c,!0);o+=4;l.setInt32(o,e,!0);o+=4;l.setInt32(o,-t,!0);o+=4;l.setUint16(o,1,!0);o+=2;l.setUint16(o,a,!0);o+=2;l.setUint32(o,g,!0);o+=4;l.setUint32(o,0,!0);o+=4;l.setInt32(o,0,!0);o+=4;l.setInt32(o,0,!0);o+=4;l.setUint32(o,r.length/4,!0);o+=4;l.setUint32(o,0,!0);o+=4;h.set(n,o);o+=n.length;h.set(r,o);o+=r.length;h.set(s,o);return h}}ImageResizer._goodSquareLength=2048;const ms=3285377520,ys=4294901760,ws=65535;class MurmurHash3_64{constructor(e){this.h1=e?4294967295&e:ms;this.h2=e?4294967295&e:ms}update(e){let t,i;if("string"==typeof e){t=new Uint8Array(2*e.length);i=0;for(let a=0,s=e.length;a<s;a++){const s=e.charCodeAt(a);if(s<=255)t[i++]=s;else{t[i++]=s>>>8;t[i++]=255&s}}}else{if(!ArrayBuffer.isView(e))throw new Error("Invalid data format, must be a string or TypedArray.");t=e.slice();i=t.byteLength}const a=i>>2,s=i-4*a,r=new Uint32Array(t.buffer,0,a);let n=0,g=0,o=this.h1,c=this.h2;const C=3432918353,h=461845907,l=11601,Q=13715;for(let e=0;e<a;e++)if(1&e){n=r[e];n=n*C&ys|n*l&ws;n=n<<15|n>>>17;n=n*h&ys|n*Q&ws;o^=n;o=o<<13|o>>>19;o=5*o+3864292196}else{g=r[e];g=g*C&ys|g*l&ws;g=g<<15|g>>>17;g=g*h&ys|g*Q&ws;c^=g;c=c<<13|c>>>19;c=5*c+3864292196}n=0;switch(s){case 3:n^=t[4*a+2]<<16;case 2:n^=t[4*a+1]<<8;case 1:n^=t[4*a];n=n*C&ys|n*l&ws;n=n<<15|n>>>17;n=n*h&ys|n*Q&ws;1&a?o^=n:c^=n}this.h1=o;this.h2=c}hexdigest(){let e=this.h1,t=this.h2;e^=t>>>1;e=3981806797*e&ys|36045*e&ws;t=4283543511*t&ys|(2950163797*(t<<16|e>>>16)&ys)>>>16;e^=t>>>1;e=444984403*e&ys|60499*e&ws;t=3301882366*t&ys|(3120437893*(t<<16|e>>>16)&ys)>>>16;e^=t>>>1;return(e>>>0).toString(16).padStart(8,"0")+(t>>>0).toString(16).padStart(8,"0")}}function addState(e,t,i,a,s){let r=e;for(let e=0,i=t.length-1;e<i;e++){const i=t[e];r=r[i]||=[]}r[t.at(-1)]={checkFn:i,iterateFn:a,processFn:s}}const Ds=[];addState(Ds,[GA,UA,ze,xA],null,(function iterateInlineImageGroup(e,t){const i=e.fnArray,a=(t-(e.iCurr-3))%4;switch(a){case 0:return i[t]===GA;case 1:return i[t]===UA;case 2:return i[t]===ze;case 3:return i[t]===xA}throw new Error(`iterateInlineImageGroup - invalid pos: ${a}`)}),(function foundInlineImageGroup(e,t){const i=e.fnArray,a=e.argsArray,s=e.iCurr,r=s-3,n=s-2,g=s-1,o=Math.min(Math.floor((t-r)/4),200);if(o<10)return t-(t-r)%4;let c=0;const C=[];let h=0,l=1,Q=1;for(let e=0;e<o;e++){const t=a[n+(e<<2)],i=a[g+(e<<2)][0];if(l+i.width>1e3){c=Math.max(c,l);Q+=h+2;l=0;h=0}C.push({transform:t,x:l,y:Q,w:i.width,h:i.height});l+=i.width+2;h=Math.max(h,i.height)}const E=Math.max(c,l)+1,u=Q+h+1,d=new Uint8Array(E*u*4),f=E<<2;for(let e=0;e<o;e++){const t=a[g+(e<<2)][0].data,i=C[e].w<<2;let s=0,r=C[e].x+C[e].y*E<<2;d.set(t.subarray(0,i),r-f);for(let a=0,n=C[e].h;a<n;a++){d.set(t.subarray(s,s+i),r);s+=i;r+=f}d.set(t.subarray(s-i,s),r);for(;r>=0;){t[r-4]=t[r];t[r-3]=t[r+1];t[r-2]=t[r+2];t[r-1]=t[r+3];t[r+i]=t[r+i-4];t[r+i+1]=t[r+i-3];t[r+i+2]=t[r+i-2];t[r+i+3]=t[r+i-1];r-=f}}const p={width:E,height:u};if(e.isOffscreenCanvasSupported){const e=new OffscreenCanvas(E,u);e.getContext("2d").putImageData(new ImageData(new Uint8ClampedArray(d.buffer),E,u),0,0);p.bitmap=e.transferToImageBitmap();p.data=null}else{p.kind=F;p.data=d}i.splice(r,4*o,_e);a.splice(r,4*o,[p,C]);return r+1}));addState(Ds,[GA,UA,Xe,xA],null,(function iterateImageMaskGroup(e,t){const i=e.fnArray,a=(t-(e.iCurr-3))%4;switch(a){case 0:return i[t]===GA;case 1:return i[t]===UA;case 2:return i[t]===Xe;case 3:return i[t]===xA}throw new Error(`iterateImageMaskGroup - invalid pos: ${a}`)}),(function foundImageMaskGroup(e,t){const i=e.fnArray,a=e.argsArray,s=e.iCurr,r=s-3,n=s-2,g=s-1;let o=Math.floor((t-r)/4);if(o<10)return t-(t-r)%4;let c,C,h=!1;const l=a[g][0],Q=a[n][0],E=a[n][1],u=a[n][2],d=a[n][3];if(E===u){h=!0;c=n+4;let e=g+4;for(let t=1;t<o;t++,c+=4,e+=4){C=a[c];if(a[e][0]!==l||C[0]!==Q||C[1]!==E||C[2]!==u||C[3]!==d){t<10?h=!1:o=t;break}}}if(h){o=Math.min(o,1e3);const e=new Float32Array(2*o);c=n;for(let t=0;t<o;t++,c+=4){C=a[c];e[t<<1]=C[4];e[1+(t<<1)]=C[5]}i.splice(r,4*o,At);a.splice(r,4*o,[l,Q,E,u,d,e])}else{o=Math.min(o,100);const e=[];for(let t=0;t<o;t++){C=a[n+(t<<2)];const i=a[g+(t<<2)][0];e.push({data:i.data,width:i.width,height:i.height,interpolate:i.interpolate,count:i.count,transform:C})}i.splice(r,4*o,Ze);a.splice(r,4*o,[e])}return r+1}));addState(Ds,[GA,UA,Ve,xA],(function(e){const t=e.argsArray,i=e.iCurr-2;return 0===t[i][1]&&0===t[i][2]}),(function iterateImageGroup(e,t){const i=e.fnArray,a=e.argsArray,s=(t-(e.iCurr-3))%4;switch(s){case 0:return i[t]===GA;case 1:if(i[t]!==UA)return!1;const s=e.iCurr-2,r=a[s][0],n=a[s][3];return a[t][0]===r&&0===a[t][1]&&0===a[t][2]&&a[t][3]===n;case 2:if(i[t]!==Ve)return!1;const g=a[e.iCurr-1][0];return a[t][0]===g;case 3:return i[t]===xA}throw new Error(`iterateImageGroup - invalid pos: ${s}`)}),(function(e,t){const i=e.fnArray,a=e.argsArray,s=e.iCurr,r=s-3,n=s-2,g=a[s-1][0],o=a[n][0],c=a[n][3],C=Math.min(Math.floor((t-r)/4),1e3);if(C<3)return t-(t-r)%4;const h=new Float32Array(2*C);let l=n;for(let e=0;e<C;e++,l+=4){const t=a[l];h[e<<1]=t[4];h[1+(e<<1)]=t[5]}const Q=[g,o,c,h];i.splice(r,4*C,$e);a.splice(r,4*C,Q);return r+1}));addState(Ds,[$A,se,Ie,Ce,Ae],null,(function iterateShowTextGroup(e,t){const i=e.fnArray,a=e.argsArray,s=(t-(e.iCurr-4))%5;switch(s){case 0:return i[t]===$A;case 1:return i[t]===se;case 2:return i[t]===Ie;case 3:if(i[t]!==Ce)return!1;const s=e.iCurr-3,r=a[s][0],n=a[s][1];return a[t][0]===r&&a[t][1]===n;case 4:return i[t]===Ae}throw new Error(`iterateShowTextGroup - invalid pos: ${s}`)}),(function(e,t){const i=e.fnArray,a=e.argsArray,s=e.iCurr,r=s-4,n=s-3,g=s-2,o=s-1,c=s,C=a[n][0],h=a[n][1];let l=Math.min(Math.floor((t-r)/5),1e3);if(l<3)return t-(t-r)%5;let Q=r;if(r>=4&&i[r-4]===i[n]&&i[r-3]===i[g]&&i[r-2]===i[o]&&i[r-1]===i[c]&&a[r-4][0]===C&&a[r-4][1]===h){l++;Q-=5}let E=Q+4;for(let e=1;e<l;e++){i.splice(E,3);a.splice(E,3);E+=2}return E+1}));class NullOptimizer{constructor(e){this.queue=e}_optimize(){}push(e,t){this.queue.fnArray.push(e);this.queue.argsArray.push(t);this._optimize()}flush(){}reset(){}}class QueueOptimizer extends NullOptimizer{constructor(e){super(e);this.state=null;this.context={iCurr:0,fnArray:e.fnArray,argsArray:e.argsArray,isOffscreenCanvasSupported:!1};this.match=null;this.lastProcessed=0}set isOffscreenCanvasSupported(e){this.context.isOffscreenCanvasSupported=e}_optimize(){const e=this.queue.fnArray;let t=this.lastProcessed,i=e.length,a=this.state,s=this.match;if(!a&&!s&&t+1===i&&!Ds[e[t]]){this.lastProcessed=i;return}const r=this.context;for(;t<i;){if(s){if((0,s.iterateFn)(r,t)){t++;continue}t=(0,s.processFn)(r,t+1);i=e.length;s=null;a=null;if(t>=i)break}a=(a||Ds)[e[t]];if(a&&!Array.isArray(a)){r.iCurr=t;t++;if(!a.checkFn||(0,a.checkFn)(r)){s=a;a=null}else a=null}else t++}this.state=a;this.match=s;this.lastProcessed=t}flush(){for(;this.match;){const e=this.queue.fnArray.length;this.lastProcessed=(0,this.match.processFn)(this.context,e);this.match=null;this.state=null;this._optimize()}}reset(){this.state=null;this.match=null;this.lastProcessed=0}}class OperatorList{static CHUNK_SIZE=1e3;static CHUNK_SIZE_ABOUT=this.CHUNK_SIZE-5;constructor(e=0,t){this._streamSink=t;this.fnArray=[];this.argsArray=[];this.optimizer=!t||e&Q?new NullOptimizer(this):new QueueOptimizer(this);this.dependencies=new Set;this._totalLength=0;this.weight=0;this._resolved=t?null:Promise.resolve()}set isOffscreenCanvasSupported(e){this.optimizer.isOffscreenCanvasSupported=e}get length(){return this.argsArray.length}get ready(){return this._resolved||this._streamSink.ready}get totalLength(){return this._totalLength+this.length}addOp(e,t){this.optimizer.push(e,t);this.weight++;this._streamSink&&(this.weight>=OperatorList.CHUNK_SIZE||this.weight>=OperatorList.CHUNK_SIZE_ABOUT&&(e===xA||e===Ae))&&this.flush()}addImageOps(e,t,i){void 0!==i&&this.addOp(Je,["OC",i]);this.addOp(e,t);void 0!==i&&this.addOp(Ye,[])}addDependency(e){if(!this.dependencies.has(e)){this.dependencies.add(e);this.addOp(yA,[e])}}addDependencies(e){for(const t of e)this.addDependency(t)}addOpList(e){if(e instanceof OperatorList){for(const t of e.dependencies)this.dependencies.add(t);for(let t=0,i=e.length;t<i;t++)this.addOp(e.fnArray[t],e.argsArray[t])}else warn('addOpList - ignoring invalid "opList" parameter.')}getIR(){return{fnArray:this.fnArray,argsArray:this.argsArray,length:this.length}}get _transfers(){const e=[],{fnArray:t,argsArray:i,length:a}=this;for(let s=0;s<a;s++)switch(t[s]){case ze:case _e:case Xe:const t=i[s][0];!t.cached&&t.data?.buffer instanceof ArrayBuffer&&e.push(t.data.buffer)}return e}flush(e=!1,t=null){this.optimizer.flush();const i=this.length;this._totalLength+=i;this._streamSink.enqueue({fnArray:this.fnArray,argsArray:this.argsArray,lastChunk:e,separateAnnots:t,length:i},1,this._transfers);this.dependencies.clear();this.fnArray.length=0;this.argsArray.length=0;this.weight=0;this.optimizer.reset()}}function decodeAndClamp(e,t,i,a){(e=t+e*i)<0?e=0:e>a&&(e=a);return e}function resizeImageMask(e,t,i,a,s,r){const n=s*r;let g;g=t<=8?new Uint8Array(n):t<=16?new Uint16Array(n):new Uint32Array(n);const o=i/s,c=a/r;let C,h,l,Q,E=0;const u=new Uint16Array(s),d=i;for(C=0;C<s;C++)u[C]=Math.floor(C*o);for(C=0;C<r;C++){l=Math.floor(C*c)*d;for(h=0;h<s;h++){Q=l+u[h];g[E++]=e[Q]}}return g}class PDFImage{constructor({xref:e,res:t,image:i,isInline:a=!1,smask:s=null,mask:r=null,isMask:n=!1,pdfFunctionFactory:g,localColorSpaceCache:o}){this.image=i;const c=i.dict,C=c.get("F","Filter");let h;if(C instanceof Name)h=C.name;else if(Array.isArray(C)){const t=e.fetchIfRef(C[0]);t instanceof Name&&(h=t.name)}switch(h){case"JPXDecode":({width:i.width,height:i.height,componentsCount:i.numComps,bitsPerComponent:i.bitsPerComponent}=JpxImage.parseImageProperties(i.stream));i.stream.reset();this.jpxDecoderOptions={numComponents:0,isIndexedColormap:!1,smaskInData:c.has("SMaskInData")};break;case"JBIG2Decode":i.bitsPerComponent=1;i.numComps=1}let l=c.get("W","Width"),Q=c.get("H","Height");if(Number.isInteger(i.width)&&i.width>0&&Number.isInteger(i.height)&&i.height>0&&(i.width!==l||i.height!==Q)){warn("PDFImage - using the Width/Height of the image data, rather than the image dictionary.");l=i.width;Q=i.height}if(l<1||Q<1)throw new FormatError(`Invalid image width: ${l} or height: ${Q}`);this.width=l;this.height=Q;this.interpolate=c.get("I","Interpolate");this.imageMask=c.get("IM","ImageMask")||!1;this.matte=c.get("Matte")||!1;let E=i.bitsPerComponent;if(!E){E=c.get("BPC","BitsPerComponent");if(!E){if(!this.imageMask)throw new FormatError(`Bits per component missing in image: ${this.imageMask}`);E=1}}this.bpc=E;if(!this.imageMask){let s=c.getRaw("CS")||c.getRaw("ColorSpace");const r=!!s;if(r)this.jpxDecoderOptions?.smaskInData&&(s=Name.get("DeviceRGBA"));else if(this.jpxDecoderOptions)s=Name.get("DeviceRGBA");else switch(i.numComps){case 1:s=Name.get("DeviceGray");break;case 3:s=Name.get("DeviceRGB");break;case 4:s=Name.get("DeviceCMYK");break;default:throw new Error(`Images with ${i.numComps} color components not supported.`)}this.colorSpace=ColorSpace.parse({cs:s,xref:e,resources:a?t:null,pdfFunctionFactory:g,localColorSpaceCache:o});this.numComps=this.colorSpace.numComps;if(this.jpxDecoderOptions){this.jpxDecoderOptions.numComponents=r?this.numComp:0;this.jpxDecoderOptions.isIndexedColormap="Indexed"===this.colorSpace.name}}this.decode=c.getArray("D","Decode");this.needsDecode=!1;if(this.decode&&(this.colorSpace&&!this.colorSpace.isDefaultDecode(this.decode,E)||n&&!ColorSpace.isDefaultDecode(this.decode,1))){this.needsDecode=!0;const e=(1<<E)-1;this.decodeCoefficients=[];this.decodeAddends=[];const t="Indexed"===this.colorSpace?.name;for(let i=0,a=0;i<this.decode.length;i+=2,++a){const s=this.decode[i],r=this.decode[i+1];this.decodeCoefficients[a]=t?(r-s)/e:r-s;this.decodeAddends[a]=t?s:e*s}}if(s)this.smask=new PDFImage({xref:e,res:t,image:s,isInline:a,pdfFunctionFactory:g,localColorSpaceCache:o});else if(r)if(r instanceof BaseStream){r.dict.get("IM","ImageMask")?this.mask=new PDFImage({xref:e,res:t,image:r,isInline:a,isMask:!0,pdfFunctionFactory:g,localColorSpaceCache:o}):warn("Ignoring /Mask in image without /ImageMask.")}else this.mask=r}static async buildImage({xref:e,res:t,image:i,isInline:a=!1,pdfFunctionFactory:s,localColorSpaceCache:r}){const n=i;let g=null,o=null;const c=i.dict.get("SMask"),C=i.dict.get("Mask");c?c instanceof BaseStream?g=c:warn("Unsupported /SMask format."):C&&(C instanceof BaseStream||Array.isArray(C)?o=C:warn("Unsupported /Mask format."));return new PDFImage({xref:e,res:t,image:n,isInline:a,smask:g,mask:o,pdfFunctionFactory:s,localColorSpaceCache:r})}static createRawMask({imgArray:e,width:t,height:i,imageIsFromDecodeStream:a,inverseDecode:s,interpolate:r}){const n=(t+7>>3)*i,g=e.byteLength;let o,c;if(!a||s&&!(n===g))if(s){o=new Uint8Array(n);o.set(e);o.fill(255,g)}else o=new Uint8Array(e);else o=e;if(s)for(c=0;c<g;c++)o[c]^=255;return{data:o,width:t,height:i,interpolate:r}}static async createMask({imgArray:e,width:t,height:i,imageIsFromDecodeStream:a,inverseDecode:s,interpolate:r,isOffscreenCanvasSupported:n=!1}){const g=1===t&&1===i&&s===(0===e.length||!!(128&e[0]));if(g)return{isSingleOpaquePixel:g};if(n){if(ImageResizer.needsToBeResized(t,i)){const a=new Uint8ClampedArray(t*i*4);convertBlackAndWhiteToRGBA({src:e,dest:a,width:t,height:i,nonBlackColor:0,inverseDecode:s});return ImageResizer.createImage({kind:F,data:a,width:t,height:i,interpolate:r})}const a=new OffscreenCanvas(t,i),n=a.getContext("2d"),g=n.createImageData(t,i);convertBlackAndWhiteToRGBA({src:e,dest:g.data,width:t,height:i,nonBlackColor:0,inverseDecode:s});n.putImageData(g,0,0);return{data:null,width:t,height:i,interpolate:r,bitmap:a.transferToImageBitmap()}}return this.createRawMask({imgArray:e,width:t,height:i,inverseDecode:s,imageIsFromDecodeStream:a,interpolate:r})}get drawWidth(){return Math.max(this.width,this.smask?.width||0,this.mask?.width||0)}get drawHeight(){return Math.max(this.height,this.smask?.height||0,this.mask?.height||0)}decodeBuffer(e){const t=this.bpc,i=this.numComps,a=this.decodeAddends,s=this.decodeCoefficients,r=(1<<t)-1;let n,g;if(1===t){for(n=0,g=e.length;n<g;n++)e[n]=+!e[n];return}let o=0;for(n=0,g=this.width*this.height;n<g;n++)for(let t=0;t<i;t++){e[o]=decodeAndClamp(e[o],a[t],s[t],r);o++}}getComponents(e){const t=this.bpc;if(8===t)return e;const i=this.width,a=this.height,s=this.numComps,r=i*a*s;let n,g=0;n=t<=8?new Uint8Array(r):t<=16?new Uint16Array(r):new Uint32Array(r);const o=i*s,c=(1<<t)-1;let C,h,l=0;if(1===t){let t,i,s;for(let r=0;r<a;r++){i=l+(-8&o);s=l+o;for(;l<i;){h=e[g++];n[l]=h>>7&1;n[l+1]=h>>6&1;n[l+2]=h>>5&1;n[l+3]=h>>4&1;n[l+4]=h>>3&1;n[l+5]=h>>2&1;n[l+6]=h>>1&1;n[l+7]=1&h;l+=8}if(l<s){h=e[g++];t=128;for(;l<s;){n[l++]=+!!(h&t);t>>=1}}}}else{let i=0;h=0;for(l=0,C=r;l<C;++l){if(l%o==0){h=0;i=0}for(;i<t;){h=h<<8|e[g++];i+=8}const a=i-t;let s=h>>a;s<0?s=0:s>c&&(s=c);n[l]=s;h&=(1<<a)-1;i=a}}return n}async fillOpacity(e,t,i,a,s){const r=this.smask,n=this.mask;let g,o,c,C,h,l;if(r){o=r.width;c=r.height;g=new Uint8ClampedArray(o*c);await r.fillGrayBuffer(g);o===t&&c===i||(g=resizeImageMask(g,r.bpc,o,c,t,i))}else if(n)if(n instanceof PDFImage){o=n.width;c=n.height;g=new Uint8ClampedArray(o*c);n.numComps=1;await n.fillGrayBuffer(g);for(C=0,h=o*c;C<h;++C)g[C]=255-g[C];o===t&&c===i||(g=resizeImageMask(g,n.bpc,o,c,t,i))}else{if(!Array.isArray(n))throw new FormatError("Unknown mask format.");{g=new Uint8ClampedArray(t*i);const e=this.numComps;for(C=0,h=t*i;C<h;++C){let t=0;const i=C*e;for(l=0;l<e;++l){const e=s[i+l],a=2*l;if(e<n[a]||e>n[a+1]){t=255;break}}g[C]=t}}}if(g)for(C=0,l=3,h=t*a;C<h;++C,l+=4)e[l]=g[C];else for(C=0,l=3,h=t*a;C<h;++C,l+=4)e[l]=255}undoPreblend(e,t,i){const a=this.smask?.matte;if(!a)return;const s=this.colorSpace.getRgb(a,0),r=s[0],n=s[1],g=s[2],o=t*i*4;for(let t=0;t<o;t+=4){const i=e[t+3];if(0===i){e[t]=255;e[t+1]=255;e[t+2]=255;continue}const a=255/i;e[t]=(e[t]-r)*a+r;e[t+1]=(e[t+1]-n)*a+n;e[t+2]=(e[t+2]-g)*a+g}}async createImageData(e=!1,t=!1){const i=this.drawWidth,a=this.drawHeight,s={width:i,height:a,interpolate:this.interpolate,kind:0,data:null},r=this.numComps,n=this.width,g=this.height,o=this.bpc,c=n*r*o+7>>3,C=t&&ImageResizer.needsToBeResized(i,a);if("DeviceRGBA"===this.colorSpace.name){s.kind=F;const e=s.data=await this.getImageBytes(g*n*4,{});return t?C?ImageResizer.createImage(s,!1):this.createBitmap(F,i,a,e):s}if(!e){let e;"DeviceGray"===this.colorSpace.name&&1===o?e=D:"DeviceRGB"!==this.colorSpace.name||8!==o||this.needsDecode||(e=b);if(e&&!this.smask&&!this.mask&&i===n&&a===g){const r=await this.getImageBytes(g*c,{});if(t)return C?ImageResizer.createImage({data:r,kind:e,width:i,height:a,interpolate:this.interpolate},this.needsDecode):this.createBitmap(e,n,g,r);s.kind=e;s.data=r;if(this.needsDecode){assert(e===D,"PDFImage.createImageData: The image must be grayscale.");const t=s.data;for(let e=0,i=t.length;e<i;e++)t[e]^=255}return s}if(this.image instanceof JpegStream&&!this.smask&&!this.mask&&!this.needsDecode){let e=g*c;if(t&&!C){let t=!1;switch(this.colorSpace.name){case"DeviceGray":e*=4;t=!0;break;case"DeviceRGB":e=e/3*4;t=!0;break;case"DeviceCMYK":t=!0}if(t){const t=await this.getImageBytes(e,{drawWidth:i,drawHeight:a,forceRGBA:!0});return this.createBitmap(F,i,a,t)}}else switch(this.colorSpace.name){case"DeviceGray":e*=3;case"DeviceRGB":case"DeviceCMYK":s.kind=b;s.data=await this.getImageBytes(e,{drawWidth:i,drawHeight:a,forceRGB:!0});return C?ImageResizer.createImage(s):s}}}const h=await this.getImageBytes(g*c,{internal:!0}),l=0|h.length/c*a/g,Q=this.getComponents(h);let E,u,d,f,p,m;if(t&&!C){d=new OffscreenCanvas(i,a);f=d.getContext("2d");p=f.createImageData(i,a);m=p.data}s.kind=F;if(e||this.smask||this.mask){t&&!C||(m=new Uint8ClampedArray(i*a*4));E=1;u=!0;await this.fillOpacity(m,i,a,l,Q)}else{if(!t||C){s.kind=b;m=new Uint8ClampedArray(i*a*3);E=0}else{new Uint32Array(m.buffer).fill(FeatureTest.isLittleEndian?4278190080:255);E=1}u=!1}this.needsDecode&&this.decodeBuffer(Q);this.colorSpace.fillRgb(m,n,g,i,a,l,o,Q,E);u&&this.undoPreblend(m,i,l);if(t&&!C){f.putImageData(p,0,0);return{data:null,width:i,height:a,bitmap:d.transferToImageBitmap(),interpolate:this.interpolate}}s.data=m;return C?ImageResizer.createImage(s):s}async fillGrayBuffer(e){const t=this.numComps;if(1!==t)throw new FormatError(`Reading gray scale from a color image: ${t}`);const i=this.width,a=this.height,s=this.bpc,r=i*t*s+7>>3,n=await this.getImageBytes(a*r,{internal:!0}),g=this.getComponents(n);let o,c;if(1===s){c=i*a;if(this.needsDecode)for(o=0;o<c;++o)e[o]=g[o]-1&255;else for(o=0;o<c;++o)e[o]=255&-g[o];return}this.needsDecode&&this.decodeBuffer(g);c=i*a;const C=255/((1<<s)-1);for(o=0;o<c;++o)e[o]=C*g[o]}createBitmap(e,t,i,a){const s=new OffscreenCanvas(t,i),r=s.getContext("2d");let n;if(e===F)n=new ImageData(a,t,i);else{n=r.createImageData(t,i);convertToRGBA({kind:e,src:a,dest:new Uint32Array(n.data.buffer),width:t,height:i,inverseDecode:this.needsDecode})}r.putImageData(n,0,0);return{data:null,width:t,height:i,bitmap:s.transferToImageBitmap(),interpolate:this.interpolate}}async getImageBytes(e,{drawWidth:t,drawHeight:i,forceRGBA:a=!1,forceRGB:s=!1,internal:r=!1}){this.image.reset();this.image.drawWidth=t||this.width;this.image.drawHeight=i||this.height;this.image.forceRGBA=!!a;this.image.forceRGB=!!s;const n=await this.image.getImageData(e,this.jpxDecoderOptions);if(r||this.image instanceof DecodeStream)return n;assert(n instanceof Uint8Array,'PDFImage.getImageBytes: Unsupported "imageBytes" type.');return new Uint8Array(n)}}const bs=Object.freeze({maxImageSize:-1,disableFontFace:!1,ignoreErrors:!1,isEvalSupported:!0,isOffscreenCanvasSupported:!1,canvasMaxAreaInBytes:-1,fontExtraProperties:!1,useSystemFonts:!0,cMapUrl:null,standardFontDataUrl:null}),Fs=1,Ss=2,ks=Promise.resolve();function normalizeBlendMode(e,t=!1){if(Array.isArray(e)){for(const t of e){const e=normalizeBlendMode(t,!0);if(e)return e}warn(`Unsupported blend mode Array: ${e}`);return"source-over"}if(!(e instanceof Name))return t?null:"source-over";switch(e.name){case"Normal":case"Compatible":return"source-over";case"Multiply":return"multiply";case"Screen":return"screen";case"Overlay":return"overlay";case"Darken":return"darken";case"Lighten":return"lighten";case"ColorDodge":return"color-dodge";case"ColorBurn":return"color-burn";case"HardLight":return"hard-light";case"SoftLight":return"soft-light";case"Difference":return"difference";case"Exclusion":return"exclusion";case"Hue":return"hue";case"Saturation":return"saturation";case"Color":return"color";case"Luminosity":return"luminosity"}if(t)return null;warn(`Unsupported blend mode: ${e.name}`);return"source-over"}function addLocallyCachedImageOps(e,t){t.objId&&e.addDependency(t.objId);e.addImageOps(t.fn,t.args,t.optionalContent);t.fn===Xe&&t.args[0]?.count>0&&t.args[0].count++}class TimeSlotManager{static TIME_SLOT_DURATION_MS=20;static CHECK_TIME_EVERY=100;constructor(){this.reset()}check(){if(++this.checked<TimeSlotManager.CHECK_TIME_EVERY)return!1;this.checked=0;return this.endTime<=Date.now()}reset(){this.endTime=Date.now()+TimeSlotManager.TIME_SLOT_DURATION_MS;this.checked=0}}class PartialEvaluator{constructor({xref:e,handler:t,pageIndex:i,idFactory:a,fontCache:s,builtInCMapCache:r,standardFontDataCache:n,globalImageCache:g,systemFontCache:o,options:c=null}){this.xref=e;this.handler=t;this.pageIndex=i;this.idFactory=a;this.fontCache=s;this.builtInCMapCache=r;this.standardFontDataCache=n;this.globalImageCache=g;this.systemFontCache=o;this.options=c||bs;this.type3FontRefs=null;this._regionalImageCache=new RegionalImageCache;this._fetchBuiltInCMapBound=this.fetchBuiltInCMap.bind(this);ImageResizer.setMaxArea(this.options.canvasMaxAreaInBytes)}get _pdfFunctionFactory(){return shadow(this,"_pdfFunctionFactory",new PDFFunctionFactory({xref:this.xref,isEvalSupported:this.options.isEvalSupported}))}get parsingType3Font(){return!!this.type3FontRefs}clone(e=null){const t=Object.create(this);t.options=Object.assign(Object.create(null),this.options,e);return t}hasBlendModes(e,t){if(!(e instanceof Dict))return!1;if(e.objId&&t.has(e.objId))return!1;const i=new RefSet(t);e.objId&&i.put(e.objId);const a=[e],s=this.xref;for(;a.length;){const e=a.shift(),t=e.get("ExtGState");if(t instanceof Dict)for(let e of t.getRawValues()){if(e instanceof Ref){if(i.has(e))continue;try{e=s.fetch(e)}catch(t){i.put(e);info(`hasBlendModes - ignoring ExtGState: "${t}".`);continue}}if(!(e instanceof Dict))continue;e.objId&&i.put(e.objId);const t=e.get("BM");if(t instanceof Name){if("Normal"!==t.name)return!0}else if(void 0!==t&&Array.isArray(t))for(const e of t)if(e instanceof Name&&"Normal"!==e.name)return!0}const r=e.get("XObject");if(r instanceof Dict)for(let e of r.getRawValues()){if(e instanceof Ref){if(i.has(e))continue;try{e=s.fetch(e)}catch(t){i.put(e);info(`hasBlendModes - ignoring XObject: "${t}".`);continue}}if(!(e instanceof BaseStream))continue;e.dict.objId&&i.put(e.dict.objId);const t=e.dict.get("Resources");if(t instanceof Dict&&(!t.objId||!i.has(t.objId))){a.push(t);t.objId&&i.put(t.objId)}}}for(const e of i)t.put(e);return!1}async fetchBuiltInCMap(e){const t=this.builtInCMapCache.get(e);if(t)return t;let i;if(null!==this.options.cMapUrl){const t=`${this.options.cMapUrl}${e}.bcmap`,a=await fetch(t);if(!a.ok)throw new Error(`fetchBuiltInCMap: failed to fetch file "${t}" with "${a.statusText}".`);i={cMapData:new Uint8Array(await a.arrayBuffer()),compressionType:mA.BINARY}}else i=await this.handler.sendWithPromise("FetchBuiltInCMap",{name:e});i.compressionType!==mA.NONE&&this.builtInCMapCache.set(e,i);return i}async fetchStandardFontData(e){const t=this.standardFontDataCache.get(e);if(t)return new Stream(t);if(this.options.useSystemFonts&&"Symbol"!==e&&"ZapfDingbats"!==e)return null;const i=Wi()[e];let a;if(null!==this.options.standardFontDataUrl){const e=`${this.options.standardFontDataUrl}${i}`,t=await fetch(e);t.ok?a=new Uint8Array(await t.arrayBuffer()):warn(`fetchStandardFontData: failed to fetch file "${e}" with "${t.statusText}".`)}else try{a=await this.handler.sendWithPromise("FetchStandardFontData",{filename:i})}catch(e){warn(`fetchStandardFontData: failed to fetch file "${i}" with "${e}".`)}if(!a)return null;this.standardFontDataCache.set(e,a);return new Stream(a)}async buildFormXObject(e,t,i,a,s,r,n){const g=t.dict,o=lookupMatrix(g.getArray("Matrix"),null),c=lookupNormalRect(g.getArray("BBox"),null);let C,h;g.has("OC")&&(C=await this.parseMarkedContentProps(g.get("OC"),e));void 0!==C&&a.addOp(Je,["OC",C]);const l=g.get("Group");if(l){h={matrix:o,bbox:c,smask:i,isolated:!1,knockout:!1};let t=null;if(isName(l.get("S"),"Transparency")){h.isolated=l.get("I")||!1;h.knockout=l.get("K")||!1;if(l.has("CS")){const i=l.getRaw("CS"),a=ColorSpace.getCached(i,this.xref,n);t=a||await this.parseColorSpace({cs:i,resources:e,localColorSpaceCache:n})}}if(i?.backdrop){t||=ColorSpace.singletons.rgb;i.backdrop=t.getRgb(i.backdrop,0)}a.addOp(Oe,[h])}const Q=l?[o,null]:[o,c];a.addOp(Te,Q);await this.getOperatorList({stream:t,task:s,resources:g.get("Resources")||e,operatorList:a,initialState:r});a.addOp(qe,[]);l&&a.addOp(Pe,[h]);void 0!==C&&a.addOp(Ye,[])}_sendImgData(e,t,i=!1){const a=t?[t.bitmap||t.data.buffer]:null;return this.parsingType3Font||i?this.handler.send("commonobj",[e,"Image",t],a):this.handler.send("obj",[e,this.pageIndex,"Image",t],a)}async buildPaintImageXObject({resources:e,image:t,isInline:i=!1,operatorList:a,cacheKey:s,localImageCache:r,localColorSpaceCache:n}){const g=t.dict,o=g.objId,c=g.get("W","Width"),C=g.get("H","Height");if(!c||"number"!=typeof c||!C||"number"!=typeof C){warn("Image dimensions are missing, or not numbers.");return}const h=this.options.maxImageSize;if(-1!==h&&c*C>h){const e="Image exceeded maximum allowed size and was removed.";if(this.options.ignoreErrors){warn(e);return}throw new Error(e)}let l;g.has("OC")&&(l=await this.parseMarkedContentProps(g.get("OC"),e));let Q,E;if(g.get("IM","ImageMask")||!1){const e=g.get("I","Interpolate"),i=c+7>>3,n=t.getBytes(i*C),h=g.getArray("D","Decode");if(this.parsingType3Font){Q=PDFImage.createRawMask({imgArray:n,width:c,height:C,imageIsFromDecodeStream:t instanceof DecodeStream,inverseDecode:h?.[0]>0,interpolate:e});Q.cached=!!s;E=[Q];a.addImageOps(Xe,E,l);if(s){const e={fn:Xe,args:E,optionalContent:l};r.set(s,o,e);o&&this._regionalImageCache.set(null,o,e)}return}Q=await PDFImage.createMask({imgArray:n,width:c,height:C,imageIsFromDecodeStream:t instanceof DecodeStream,inverseDecode:h?.[0]>0,interpolate:e,isOffscreenCanvasSupported:this.options.isOffscreenCanvasSupported});if(Q.isSingleOpaquePixel){a.addImageOps(et,[],l);if(s){const e={fn:et,args:[],optionalContent:l};r.set(s,o,e);o&&this._regionalImageCache.set(null,o,e)}return}const u=`mask_${this.idFactory.createObjId()}`;a.addDependency(u);Q.dataLen=Q.bitmap?Q.width*Q.height*4:Q.data.length;this._sendImgData(u,Q);E=[{data:u,width:Q.width,height:Q.height,interpolate:Q.interpolate,count:1}];a.addImageOps(Xe,E,l);if(s){const e={objId:u,fn:Xe,args:E,optionalContent:l};r.set(s,o,e);o&&this._regionalImageCache.set(null,o,e)}return}if(i&&c+C<200&&!g.has("SMask")&&!g.has("Mask")){try{const s=new PDFImage({xref:this.xref,res:e,image:t,isInline:i,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:n});Q=await s.createImageData(!0,!1);a.isOffscreenCanvasSupported=this.options.isOffscreenCanvasSupported;a.addImageOps(ze,[Q],l)}catch(e){const t=`Unable to decode inline image: "${e}".`;if(!this.options.ignoreErrors)throw new Error(t);warn(t)}return}let u=`img_${this.idFactory.createObjId()}`,d=!1;if(this.parsingType3Font)u=`${this.idFactory.getDocId()}_type3_${u}`;else if(s&&o){d=this.globalImageCache.shouldCache(o,this.pageIndex);if(d){assert(!i,"Cannot cache an inline image globally.");u=`${this.idFactory.getDocId()}_${u}`}}a.addDependency(u);E=[u,c,C];a.addImageOps(Ve,E,l);if(d){if(this.globalImageCache.hasDecodeFailed(o)){this.globalImageCache.setData(o,{objId:u,fn:Ve,args:E,optionalContent:l,byteSize:0});this._sendImgData(u,null,d);return}if(c*C>25e4||g.has("SMask")||g.has("Mask")){const e=await this.handler.sendWithPromise("commonobj",[u,"CopyLocalImage",{imageRef:o}]);if(e){this.globalImageCache.setData(o,{objId:u,fn:Ve,args:E,optionalContent:l,byteSize:0});this.globalImageCache.addByteSize(o,e);return}}}PDFImage.buildImage({xref:this.xref,res:e,image:t,isInline:i,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:n}).then((async e=>{Q=await e.createImageData(!1,this.options.isOffscreenCanvasSupported);Q.dataLen=Q.bitmap?Q.width*Q.height*4:Q.data.length;Q.ref=o;d&&this.globalImageCache.addByteSize(o,Q.dataLen);return this._sendImgData(u,Q,d)})).catch((e=>{warn(`Unable to decode image "${u}": "${e}".`);o&&this.globalImageCache.addDecodeFailed(o);return this._sendImgData(u,null,d)}));if(s){const e={objId:u,fn:Ve,args:E,optionalContent:l};r.set(s,o,e);if(o){this._regionalImageCache.set(null,o,e);d&&this.globalImageCache.setData(o,{objId:u,fn:Ve,args:E,optionalContent:l,byteSize:0})}}}handleSMask(e,t,i,a,s,r){const n=e.get("G"),g={subtype:e.get("S").name,backdrop:e.get("BC")},o=e.get("TR");if(isPDFFunction(o)){const e=this._pdfFunctionFactory.create(o),t=new Uint8Array(256),i=new Float32Array(1);for(let a=0;a<256;a++){i[0]=a/255;e(i,0,i,0);t[a]=255*i[0]|0}g.transferMap=t}return this.buildFormXObject(t,n,g,i,a,s.state.clone(),r)}handleTransferFunction(e){let t;if(Array.isArray(e))t=e;else{if(!isPDFFunction(e))return null;t=[e]}const i=[];let a=0,s=0;for(const e of t){const t=this.xref.fetchIfRef(e);a++;if(isName(t,"Identity")){i.push(null);continue}if(!isPDFFunction(t))return null;const r=this._pdfFunctionFactory.create(t),n=new Uint8Array(256),g=new Float32Array(1);for(let e=0;e<256;e++){g[0]=e/255;r(g,0,g,0);n[e]=255*g[0]|0}i.push(n);s++}return 1!==a&&4!==a||0===s?null:i}handleTilingType(e,t,i,a,s,r,n,g){const o=new OperatorList,c=Dict.merge({xref:this.xref,dictArray:[s.get("Resources"),i]});return this.getOperatorList({stream:a,task:n,resources:c,operatorList:o}).then((function(){const i=o.getIR(),a=getTilingPatternIR(i,s,t);r.addDependencies(o.dependencies);r.addOp(e,a);s.objId&&g.set(null,s.objId,{operatorListIR:i,dict:s})})).catch((e=>{if(!(e instanceof AbortException)){if(!this.options.ignoreErrors)throw e;warn(`handleTilingType - ignoring pattern: "${e}".`)}}))}async handleSetFont(e,t,i,a,s,r,n=null,g=null){const o=t?.[0]instanceof Name?t[0].name:null;let c=await this.loadFont(o,i,e,n,g);if(c.font.isType3Font)try{await c.loadType3Data(this,e,s);a.addDependencies(c.type3Dependencies)}catch(e){c=new TranslatedFont({loadedName:"g_font_error",font:new ErrorFont(`Type3 font load error: ${e}`),dict:c.font,evaluatorOptions:this.options})}r.font=c.font;c.send(this.handler);return c.loadedName}handleText(e,t){const i=t.font,a=i.charsToGlyphs(e);if(i.data){(!!(t.textRenderingMode&w)||"Pattern"===t.fillColorSpace.name||i.disableFontFace||this.options.disableFontFace)&&PartialEvaluator.buildFontPaths(i,a,this.handler,this.options)}return a}ensureStateFont(e){if(e.font)return;const t=new FormatError("Missing setFont (Tf) operator before text rendering operator.");if(!this.options.ignoreErrors)throw t;warn(`ensureStateFont: "${t}".`)}async setGState({resources:e,gState:t,operatorList:i,cacheKey:a,task:s,stateManager:r,localGStateCache:n,localColorSpaceCache:g}){const o=t.objId;let c=!0;const C=[];let h=Promise.resolve();for(const a of t.getKeys()){const n=t.get(a);switch(a){case"Type":break;case"LW":case"LC":case"LJ":case"ML":case"D":case"RI":case"FL":case"CA":case"ca":C.push([a,n]);break;case"Font":c=!1;h=h.then((()=>this.handleSetFont(e,null,n[0],i,s,r.state).then((function(e){i.addDependency(e);C.push([a,[e,n[1]]])}))));break;case"BM":C.push([a,normalizeBlendMode(n)]);break;case"SMask":if(isName(n,"None")){C.push([a,!1]);break}if(n instanceof Dict){c=!1;h=h.then((()=>this.handleSMask(n,e,i,s,r,g)));C.push([a,!0])}else warn("Unsupported SMask type");break;case"TR":const t=this.handleTransferFunction(n);C.push([a,t]);break;case"OP":case"op":case"OPM":case"BG":case"BG2":case"UCR":case"UCR2":case"TR2":case"HT":case"SM":case"SA":case"AIS":case"TK":info("graphic state operator "+a);break;default:info("Unknown graphic state operator "+a)}}await h;C.length>0&&i.addOp(NA,[C]);c&&n.set(a,o,C)}loadFont(e,t,i,a=null,s=null){const errorFont=async()=>new TranslatedFont({loadedName:"g_font_error",font:new ErrorFont(`Font "${e}" is not available.`),dict:t,evaluatorOptions:this.options});let r;if(t)t instanceof Ref&&(r=t);else{const t=i.get("Font");t&&(r=t.getRaw(e))}if(r){if(this.type3FontRefs?.has(r))return errorFont();if(this.fontCache.has(r))return this.fontCache.get(r);try{t=this.xref.fetchIfRef(r)}catch(e){warn(`loadFont - lookup failed: "${e}".`)}}if(!(t instanceof Dict)){if(!this.options.ignoreErrors&&!this.parsingType3Font){warn(`Font "${e}" is not available.`);return errorFont()}warn(`Font "${e}" is not available -- attempting to fallback to a default font.`);t=a||PartialEvaluator.fallbackFontDict}if(t.cacheKey&&this.fontCache.has(t.cacheKey))return this.fontCache.get(t.cacheKey);const{promise:n,resolve:g}=Promise.withResolvers();let o;try{o=this.preEvaluateFont(t);o.cssFontInfo=s}catch(e){warn(`loadFont - preEvaluateFont failed: "${e}".`);return errorFont()}const{descriptor:c,hash:C}=o,h=r instanceof Ref;let l;if(C&&c instanceof Dict){const e=c.fontAliases||=Object.create(null);if(e[C]){const t=e[C].aliasRef;if(h&&t&&this.fontCache.has(t)){this.fontCache.putAlias(r,t);return this.fontCache.get(r)}}else e[C]={fontID:this.idFactory.createFontId()};h&&(e[C].aliasRef=r);l=e[C].fontID}else l=this.idFactory.createFontId();assert(l?.startsWith("f"),'The "fontID" must be (correctly) defined.');if(h)this.fontCache.put(r,n);else{t.cacheKey=`cacheKey_${l}`;this.fontCache.put(t.cacheKey,n)}t.loadedName=`${this.idFactory.getDocId()}_${l}`;this.translateFont(o).then((e=>{g(new TranslatedFont({loadedName:t.loadedName,font:e,dict:t,evaluatorOptions:this.options}))})).catch((e=>{warn(`loadFont - translateFont failed: "${e}".`);g(new TranslatedFont({loadedName:t.loadedName,font:new ErrorFont(e instanceof Error?e.message:e),dict:t,evaluatorOptions:this.options}))}));return n}buildPath(e,t,i,a=!1){const s=e.length-1;i||(i=[]);if(s<0||e.fnArray[s]!==tt){if(a){warn(`Encountered path operator "${t}" inside of a text object.`);e.addOp(GA,null)}let s;switch(t){case KA:const e=i[0]+i[2],t=i[1]+i[3];s=[Math.min(i[0],e),Math.min(i[1],t),Math.max(i[0],e),Math.max(i[1],t)];break;case MA:case LA:s=[i[0],i[1],i[0],i[1]];break;default:s=[1/0,1/0,-1/0,-1/0]}e.addOp(tt,[[t],i,s]);a&&e.addOp(xA,null)}else{const a=e.argsArray[s];a[0].push(t);a[1].push(...i);const r=a[2];switch(t){case KA:const e=i[0]+i[2],t=i[1]+i[3];r[0]=Math.min(r[0],i[0],e);r[1]=Math.min(r[1],i[1],t);r[2]=Math.max(r[2],i[0],e);r[3]=Math.max(r[3],i[1],t);break;case MA:case LA:r[0]=Math.min(r[0],i[0]);r[1]=Math.min(r[1],i[1]);r[2]=Math.max(r[2],i[0]);r[3]=Math.max(r[3],i[1])}}}parseColorSpace({cs:e,resources:t,localColorSpaceCache:i}){return ColorSpace.parseAsync({cs:e,xref:this.xref,resources:t,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:i}).catch((e=>{if(e instanceof AbortException)return null;if(this.options.ignoreErrors){warn(`parseColorSpace - ignoring ColorSpace: "${e}".`);return null}throw e}))}parseShading({shading:e,resources:t,localColorSpaceCache:i,localShadingPatternCache:a}){let s,r=a.get(e);if(r)return r;try{s=Pattern.parseShading(e,this.xref,t,this._pdfFunctionFactory,i).getIR()}catch(t){if(t instanceof AbortException)return null;if(this.options.ignoreErrors){warn(`parseShading - ignoring shading: "${t}".`);a.set(e,null);return null}throw t}r=`pattern_${this.idFactory.createObjId()}`;this.parsingType3Font&&(r=`${this.idFactory.getDocId()}_type3_${r}`);a.set(e,r);this.parsingType3Font?this.handler.send("commonobj",[r,"Pattern",s]):this.handler.send("obj",[r,this.pageIndex,"Pattern",s]);return r}handleColorN(e,t,i,a,s,r,n,g,o,c){const C=i.pop();if(C instanceof Name){const h=s.getRaw(C.name),l=h instanceof Ref&&o.getByRef(h);if(l)try{const s=a.base?a.base.getRgb(i,0):null,r=getTilingPatternIR(l.operatorListIR,l.dict,s);e.addOp(t,r);return}catch{}const Q=this.xref.fetchIfRef(h);if(Q){const s=Q instanceof BaseStream?Q.dict:Q,C=s.get("PatternType");if(C===Fs){const g=a.base?a.base.getRgb(i,0):null;return this.handleTilingType(t,g,r,Q,s,e,n,o)}if(C===Ss){const i=s.get("Shading"),a=this.parseShading({shading:i,resources:r,localColorSpaceCache:g,localShadingPatternCache:c});if(a){const i=lookupMatrix(s.getArray("Matrix"),null);e.addOp(t,["Shading",a,i])}return}throw new FormatError(`Unknown PatternType: ${C}`)}}throw new FormatError(`Unknown PatternName: ${C}`)}_parseVisibilityExpression(e,t,i){if(++t>10){warn("Visibility expression is too deeply nested");return}const a=e.length,s=this.xref.fetchIfRef(e[0]);if(!(a<2)&&s instanceof Name){switch(s.name){case"And":case"Or":case"Not":i.push(s.name);break;default:warn(`Invalid operator ${s.name} in visibility expression`);return}for(let s=1;s<a;s++){const a=e[s],r=this.xref.fetchIfRef(a);if(Array.isArray(r)){const e=[];i.push(e);this._parseVisibilityExpression(r,t,e)}else a instanceof Ref&&i.push(a.toString())}}else warn("Invalid visibility expression")}async parseMarkedContentProps(e,t){let i;if(e instanceof Name){i=t.get("Properties").get(e.name)}else{if(!(e instanceof Dict))throw new FormatError("Optional content properties malformed.");i=e}const a=i.get("Type")?.name;if("OCG"===a)return{type:a,id:i.objId};if("OCMD"===a){const e=i.get("VE");if(Array.isArray(e)){const t=[];this._parseVisibilityExpression(e,0,t);if(t.length>0)return{type:"OCMD",expression:t}}const t=i.get("OCGs");if(Array.isArray(t)||t instanceof Dict){const e=[];if(Array.isArray(t))for(const i of t)e.push(i.toString());else e.push(t.objId);return{type:a,ids:e,policy:i.get("P")instanceof Name?i.get("P").name:null,expression:null}}if(t instanceof Ref)return{type:a,id:t.toString()}}return null}getOperatorList({stream:e,task:t,resources:i,operatorList:a,initialState:s=null,fallbackFontDict:r=null}){i||=Dict.empty;s||=new EvalState;if(!a)throw new Error('getOperatorList: missing "operatorList" parameter');const n=this,g=this.xref;let o=!1;const c=new LocalImageCache,C=new LocalColorSpaceCache,h=new LocalGStateCache,l=new LocalTilingPatternCache,Q=new Map,E=i.get("XObject")||Dict.empty,u=i.get("Pattern")||Dict.empty,d=new StateManager(s),f=new EvaluatorPreprocessor(e,g,d),p=new TimeSlotManager;function closePendingRestoreOPS(e){for(let e=0,t=f.savedStatesDepth;e<t;e++)a.addOp(xA,[])}return new Promise((function promiseBody(e,s){const next=function(t){Promise.all([t,a.ready]).then((function(){try{promiseBody(e,s)}catch(e){s(e)}}),s)};t.ensureNotTerminated();p.reset();const m={};let y,w,D,b,F,S;for(;!(y=p.check());){m.args=null;if(!f.read(m))break;let e=m.args,s=m.fn;switch(0|s){case Ue:S=e[0]instanceof Name;F=e[0].name;if(S){const t=c.getByName(F);if(t){addLocallyCachedImageOps(a,t);e=null;continue}}next(new Promise((function(e,s){if(!S)throw new FormatError("XObject must be referred to by name.");let r=E.getRaw(F);if(r instanceof Ref){const t=c.getByRef(r)||n._regionalImageCache.getByRef(r);if(t){addLocallyCachedImageOps(a,t);e();return}const i=n.globalImageCache.getData(r,n.pageIndex);if(i){a.addDependency(i.objId);a.addImageOps(i.fn,i.args,i.optionalContent);e();return}r=g.fetch(r)}if(!(r instanceof BaseStream))throw new FormatError("XObject should be a stream");const o=r.dict.get("Subtype");if(!(o instanceof Name))throw new FormatError("XObject should have a Name subtype");if("Form"!==o.name)if("Image"!==o.name){if("PS"!==o.name)throw new FormatError(`Unhandled XObject subtype ${o.name}`);info("Ignored XObject subtype PS");e()}else n.buildPaintImageXObject({resources:i,image:r,operatorList:a,cacheKey:F,localImageCache:c,localColorSpaceCache:C}).then(e,s);else{d.save();n.buildFormXObject(i,r,null,a,t,d.state.clone(),C).then((function(){d.restore();e()}),s)}})).catch((function(e){if(!(e instanceof AbortException)){if(!n.options.ignoreErrors)throw e;warn(`getOperatorList - ignoring XObject: "${e}".`)}})));return;case se:var k=e[1];next(n.handleSetFont(i,e,null,a,t,d.state,r).then((function(e){a.addDependency(e);a.addOp(se,[e,k])})));return;case $A:o=!0;break;case Ae:o=!1;break;case xe:var R=e[0].cacheKey;if(R){const t=c.getByName(R);if(t){addLocallyCachedImageOps(a,t);e=null;continue}}next(n.buildPaintImageXObject({resources:i,image:e[0],isInline:!0,operatorList:a,cacheKey:R,localImageCache:c,localColorSpaceCache:C}));return;case Ce:if(!d.state.font){n.ensureStateFont(d.state);continue}e[0]=n.handleText(e[0],d.state);break;case he:if(!d.state.font){n.ensureStateFont(d.state);continue}var N=[],G=d.state;for(const t of e[0])"string"==typeof t?N.push(...n.handleText(t,G)):"number"==typeof t&&N.push(t);e[0]=N;s=Ce;break;case Be:if(!d.state.font){n.ensureStateFont(d.state);continue}a.addOp(ce);e[0]=n.handleText(e[0],d.state);s=Ce;break;case le:if(!d.state.font){n.ensureStateFont(d.state);continue}a.addOp(ce);a.addOp(te,[e.shift()]);a.addOp(ee,[e.shift()]);e[0]=n.handleText(e[0],d.state);s=Ce;break;case re:d.state.textRenderingMode=e[0];break;case de:{const t=ColorSpace.getCached(e[0],g,C);if(t){d.state.fillColorSpace=t;continue}next(n.parseColorSpace({cs:e[0],resources:i,localColorSpaceCache:C}).then((function(e){e&&(d.state.fillColorSpace=e)})));return}case ue:{const t=ColorSpace.getCached(e[0],g,C);if(t){d.state.strokeColorSpace=t;continue}next(n.parseColorSpace({cs:e[0],resources:i,localColorSpaceCache:C}).then((function(e){e&&(d.state.strokeColorSpace=e)})));return}case me:b=d.state.fillColorSpace;e=b.getRgb(e,0);s=Fe;break;case fe:b=d.state.strokeColorSpace;e=b.getRgb(e,0);s=be;break;case De:d.state.fillColorSpace=ColorSpace.singletons.gray;e=ColorSpace.singletons.gray.getRgb(e,0);s=Fe;break;case we:d.state.strokeColorSpace=ColorSpace.singletons.gray;e=ColorSpace.singletons.gray.getRgb(e,0);s=be;break;case ke:d.state.fillColorSpace=ColorSpace.singletons.cmyk;e=ColorSpace.singletons.cmyk.getRgb(e,0);s=Fe;break;case Se:d.state.strokeColorSpace=ColorSpace.singletons.cmyk;e=ColorSpace.singletons.cmyk.getRgb(e,0);s=be;break;case Fe:d.state.fillColorSpace=ColorSpace.singletons.rgb;e=ColorSpace.singletons.rgb.getRgb(e,0);break;case be:d.state.strokeColorSpace=ColorSpace.singletons.rgb;e=ColorSpace.singletons.rgb.getRgb(e,0);break;case ye:b=d.state.fillColorSpace;if("Pattern"===b.name){next(n.handleColorN(a,ye,e,b,u,i,t,C,l,Q));return}e=b.getRgb(e,0);s=Fe;break;case pe:b=d.state.strokeColorSpace;if("Pattern"===b.name){next(n.handleColorN(a,pe,e,b,u,i,t,C,l,Q));return}e=b.getRgb(e,0);s=be;break;case Re:var x=i.get("Shading");if(!x)throw new FormatError("No shading resource found");var U=x.get(e[0].name);if(!U)throw new FormatError("No shading object found");const f=n.parseShading({shading:U,resources:i,localColorSpaceCache:C,localShadingPatternCache:Q});if(!f)continue;e=[f];s=Re;break;case NA:S=e[0]instanceof Name;F=e[0].name;if(S){const t=h.getByName(F);if(t){t.length>0&&a.addOp(NA,[t]);e=null;continue}}next(new Promise((function(e,s){if(!S)throw new FormatError("GState must be referred to by name.");const r=i.get("ExtGState");if(!(r instanceof Dict))throw new FormatError("ExtGState should be a dictionary.");const g=r.get(F);if(!(g instanceof Dict))throw new FormatError("GState should be a dictionary.");n.setGState({resources:i,gState:g,operatorList:a,cacheKey:F,task:t,stateManager:d,localGStateCache:h,localColorSpaceCache:C}).then(e,s)})).catch((function(e){if(!(e instanceof AbortException)){if(!n.options.ignoreErrors)throw e;warn(`getOperatorList - ignoring ExtGState: "${e}".`)}})));return;case MA:case LA:case HA:case JA:case YA:case vA:case KA:n.buildPath(a,s,e,o);continue;case Me:case Le:case ve:case Ke:continue;case Je:if(!(e[0]instanceof Name)){warn(`Expected name for beginMarkedContentProps arg0=${e[0]}`);a.addOp(Je,["OC",null]);continue}if("OC"===e[0].name){next(n.parseMarkedContentProps(e[1],i).then((e=>{a.addOp(Je,["OC",e])})).catch((e=>{if(!(e instanceof AbortException)){if(!n.options.ignoreErrors)throw e;warn(`getOperatorList - ignoring beginMarkedContentProps: "${e}".`);a.addOp(Je,["OC",null])}})));return}e=[e[0].name,e[1]instanceof Dict?e[1].get("MCID"):null];break;default:if(null!==e){for(w=0,D=e.length;w<D&&!(e[w]instanceof Dict);w++);if(w<D){warn("getOperatorList - ignoring operator: "+s);continue}}}a.addOp(s,e)}if(y)next(ks);else{closePendingRestoreOPS();e()}})).catch((e=>{if(!(e instanceof AbortException)){if(!this.options.ignoreErrors)throw e;warn(`getOperatorList - ignoring errors during "${t.name}" task: "${e}".`);closePendingRestoreOPS()}}))}getTextContent({stream:e,task:t,resources:s,stateManager:r=null,includeMarkedContent:n=!1,sink:g,seenStyles:o=new Set,viewBox:c,lang:C=null,markedContentData:h=null,disableNormalization:l=!1,keepWhiteSpace:Q=!1}){s||=Dict.empty;r||=new StateManager(new TextState);n&&(h||={level:0});const E={items:[],styles:Object.create(null),lang:C},u={initialized:!1,str:[],totalWidth:0,totalHeight:0,width:0,height:0,vertical:!1,prevTransform:null,textAdvanceScale:0,spaceInFlowMin:0,spaceInFlowMax:0,trackingSpaceMin:1/0,negativeSpaceMax:-1/0,notASpace:-1/0,transform:null,fontName:null,hasEOL:!1},d=[" "," "];let f=0;function saveLastChar(e){const t=(f+1)%2,i=" "!==d[f]&&" "===d[t];d[f]=e;f=t;return!Q&&i}function shouldAddWhitepsace(){return!Q&&" "!==d[f]&&" "===d[(f+1)%2]}function resetLastChars(){d[0]=d[1]=" ";f=0}const p=this,m=this.xref,y=[];let w=null;const D=new LocalImageCache,b=new LocalGStateCache,F=new EvaluatorPreprocessor(e,m,r);let S;function pushWhitespace({width:e=0,height:t=0,transform:i=u.prevTransform,fontName:a=u.fontName}){E.items.push({str:" ",dir:"ltr",width:e,height:t,transform:i,fontName:a,hasEOL:!1})}function getCurrentTextTransform(){const e=S.font,t=[S.fontSize*S.textHScale,0,0,S.fontSize,0,S.textRise];if(e.isType3Font&&(S.fontSize<=1||e.isCharBBox)&&!isArrayEqual(S.fontMatrix,a)){const i=e.bbox[3]-e.bbox[1];i>0&&(t[3]*=i*S.fontMatrix[3])}return Util.transform(S.ctm,Util.transform(S.textMatrix,t))}function ensureTextContentItem(){if(u.initialized)return u;const{font:e,loadedName:t}=S;if(!o.has(t)){o.add(t);E.styles[t]={fontFamily:e.fallbackName,ascent:e.ascent,descent:e.descent,vertical:e.vertical};if(p.options.fontExtraProperties&&e.systemFontInfo){const i=E.styles[t];i.fontSubstitution=e.systemFontInfo.css;i.fontSubstitutionLoadedName=e.systemFontInfo.loadedName}}u.fontName=t;const i=u.transform=getCurrentTextTransform();if(e.vertical){u.width=u.totalWidth=Math.hypot(i[0],i[1]);u.height=u.totalHeight=0;u.vertical=!0}else{u.width=u.totalWidth=0;u.height=u.totalHeight=Math.hypot(i[2],i[3]);u.vertical=!1}const a=Math.hypot(S.textLineMatrix[0],S.textLineMatrix[1]),s=Math.hypot(S.ctm[0],S.ctm[1]);u.textAdvanceScale=s*a;const{fontSize:r}=S;u.trackingSpaceMin=.102*r;u.notASpace=.03*r;u.negativeSpaceMax=-.2*r;u.spaceInFlowMin=.102*r;u.spaceInFlowMax=.6*r;u.hasEOL=!1;u.initialized=!0;return u}function updateAdvanceScale(){if(!u.initialized)return;const e=Math.hypot(S.textLineMatrix[0],S.textLineMatrix[1]),t=Math.hypot(S.ctm[0],S.ctm[1])*e;if(t!==u.textAdvanceScale){if(u.vertical){u.totalHeight+=u.height*u.textAdvanceScale;u.height=0}else{u.totalWidth+=u.width*u.textAdvanceScale;u.width=0}u.textAdvanceScale=t}}function runBidiTransform(e){let t=e.str.join("");l||(t=function normalizeUnicode(e){if(!ot){ot=/([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu;It=new Map([["铿�","趴t"]])}return e.replaceAll(ot,((e,t,i)=>t?t.normalize("NFKC"):It.get(i)))}(t));const i=bidi(t,-1,e.vertical);return{str:i.str,dir:i.dir,width:Math.abs(e.totalWidth),height:Math.abs(e.totalHeight),transform:e.transform,fontName:e.fontName,hasEOL:e.hasEOL}}async function handleSetFont(e,i){const r=await p.loadFont(e,i,s);if(r.font.isType3Font)try{await r.loadType3Data(p,s,t)}catch{}S.loadedName=r.loadedName;S.font=r.font;S.fontMatrix=r.font.fontMatrix||a}function applyInverseRotation(e,t,i){const a=Math.hypot(i[0],i[1]);return[(i[0]*e+i[1]*t)/a,(i[2]*e+i[3]*t)/a]}function compareWithLastPosition(e){const t=getCurrentTextTransform();let i=t[4],a=t[5];if(S.font?.vertical){if(i<c[0]||i>c[2]||a+e<c[1]||a>c[3])return!1}else if(i+e<c[0]||i>c[2]||a<c[1]||a>c[3])return!1;if(!S.font||!u.prevTransform)return!0;let s=u.prevTransform[4],r=u.prevTransform[5];if(s===i&&r===a)return!0;let n=-1;t[0]&&0===t[1]&&0===t[2]?n=t[0]>0?0:180:t[1]&&0===t[0]&&0===t[3]&&(n=t[1]>0?90:270);switch(n){case 0:break;case 90:[i,a]=[a,i];[s,r]=[r,s];break;case 180:[i,a,s,r]=[-i,-a,-s,-r];break;case 270:[i,a]=[-a,-i];[s,r]=[-r,-s];break;default:[i,a]=applyInverseRotation(i,a,t);[s,r]=applyInverseRotation(s,r,u.prevTransform)}if(S.font.vertical){const e=(r-a)/u.textAdvanceScale,t=i-s,n=Math.sign(u.height);if(e<n*u.negativeSpaceMax){if(Math.abs(t)>.5*u.width){appendEOL();return!0}resetLastChars();flushTextContentItem();return!0}if(Math.abs(t)>u.width){appendEOL();return!0}e<=n*u.notASpace&&resetLastChars();if(e<=n*u.trackingSpaceMin)if(shouldAddWhitepsace()){resetLastChars();flushTextContentItem();pushWhitespace({height:Math.abs(e)})}else u.height+=e;else if(!addFakeSpaces(e,u.prevTransform,n))if(0===u.str.length){resetLastChars();pushWhitespace({height:Math.abs(e)})}else u.height+=e;Math.abs(t)>.25*u.width&&flushTextContentItem();return!0}const g=(i-s)/u.textAdvanceScale,o=a-r,C=Math.sign(u.width);if(g<C*u.negativeSpaceMax){if(Math.abs(o)>.5*u.height){appendEOL();return!0}resetLastChars();flushTextContentItem();return!0}if(Math.abs(o)>u.height){appendEOL();return!0}g<=C*u.notASpace&&resetLastChars();if(g<=C*u.trackingSpaceMin)if(shouldAddWhitepsace()){resetLastChars();flushTextContentItem();pushWhitespace({width:Math.abs(g)})}else u.width+=g;else if(!addFakeSpaces(g,u.prevTransform,C))if(0===u.str.length){resetLastChars();pushWhitespace({width:Math.abs(g)})}else u.width+=g;Math.abs(o)>.25*u.height&&flushTextContentItem();return!0}function buildTextContentItem({chars:e,extraSpacing:t}){const i=S.font;if(!e){const e=S.charSpacing+t;e&&(i.vertical?S.translateTextMatrix(0,-e):S.translateTextMatrix(e*S.textHScale,0));Q&&compareWithLastPosition(0);return}const a=i.charsToGlyphs(e),s=S.fontMatrix[0]*S.fontSize;for(let e=0,r=a.length;e<r;e++){const n=a[e],{category:g}=n;if(g.isInvisibleFormatMark)continue;let o=S.charSpacing+(e+1===r?t:0),c=n.width;i.vertical&&(c=n.vmetric?n.vmetric[0]:-c);let C=c*s;if(!Q&&g.isWhitespace){if(i.vertical){o+=-C+S.wordSpacing;S.translateTextMatrix(0,-o)}else{o+=C+S.wordSpacing;S.translateTextMatrix(o*S.textHScale,0)}saveLastChar(" ");continue}if(!g.isZeroWidthDiacritic&&!compareWithLastPosition(C)){i.vertical?S.translateTextMatrix(0,C):S.translateTextMatrix(C*S.textHScale,0);continue}const h=ensureTextContentItem();g.isZeroWidthDiacritic&&(C=0);if(i.vertical){S.translateTextMatrix(0,C);C=Math.abs(C);h.height+=C}else{C*=S.textHScale;S.translateTextMatrix(C,0);h.width+=C}C&&(h.prevTransform=getCurrentTextTransform());const l=n.unicode;saveLastChar(l)&&h.str.push(" ");h.str.push(l);o&&(i.vertical?S.translateTextMatrix(0,-o):S.translateTextMatrix(o*S.textHScale,0))}}function appendEOL(){resetLastChars();if(u.initialized){u.hasEOL=!0;flushTextContentItem()}else E.items.push({str:"",dir:"ltr",width:0,height:0,transform:getCurrentTextTransform(),fontName:S.loadedName,hasEOL:!0})}function addFakeSpaces(e,t,i){if(i*u.spaceInFlowMin<=e&&e<=i*u.spaceInFlowMax){if(u.initialized){resetLastChars();u.str.push(" ")}return!1}const a=u.fontName;let s=0;if(u.vertical){s=e;e=0}flushTextContentItem();resetLastChars();pushWhitespace({width:Math.abs(e),height:Math.abs(s),transform:t||getCurrentTextTransform(),fontName:a});return!0}function flushTextContentItem(){if(u.initialized&&u.str){u.vertical?u.totalHeight+=u.height*u.textAdvanceScale:u.totalWidth+=u.width*u.textAdvanceScale;E.items.push(runBidiTransform(u));u.initialized=!1;u.str.length=0}}function enqueueChunk(e=!1){const t=E.items.length;if(0!==t&&!(e&&t<10)){g.enqueue(E,t);E.items=[];E.styles=Object.create(null)}}const k=new TimeSlotManager;return new Promise((function promiseBody(e,a){const next=function(t){enqueueChunk(!0);Promise.all([t,g.ready]).then((function(){try{promiseBody(e,a)}catch(e){a(e)}}),a)};t.ensureNotTerminated();k.reset();const u={};let d,f=[];for(;!(d=k.check());){f.length=0;u.args=f;if(!F.read(u))break;const e=S;S=r.state;const a=u.fn;f=u.args;switch(0|a){case se:var R=f[0].name,N=f[1];if(S.font&&R===S.fontName&&N===S.fontSize)break;flushTextContentItem();S.fontName=R;S.fontSize=N;next(handleSetFont(R,null));return;case ne:S.textRise=f[0];break;case ie:S.textHScale=f[0]/100;break;case ae:S.leading=f[0];break;case ge:S.translateTextLineMatrix(f[0],f[1]);S.textMatrix=S.textLineMatrix.slice();break;case oe:S.leading=-f[1];S.translateTextLineMatrix(f[0],f[1]);S.textMatrix=S.textLineMatrix.slice();break;case ce:S.carriageReturn();break;case Ie:S.setTextMatrix(f[0],f[1],f[2],f[3],f[4],f[5]);S.setTextLineMatrix(f[0],f[1],f[2],f[3],f[4],f[5]);updateAdvanceScale();break;case ee:S.charSpacing=f[0];break;case te:S.wordSpacing=f[0];break;case $A:S.textMatrix=i.slice();S.textLineMatrix=i.slice();break;case he:if(!r.state.font){p.ensureStateFont(r.state);continue}const a=(S.font.vertical?1:-1)*S.fontSize/1e3,u=f[0];for(let e=0,t=u.length;e<t;e++){const t=u[e];if("string"==typeof t)y.push(t);else if("number"==typeof t&&0!==t){const e=y.join("");y.length=0;buildTextContentItem({chars:e,extraSpacing:t*a})}}if(y.length>0){const e=y.join("");y.length=0;buildTextContentItem({chars:e,extraSpacing:0})}break;case Ce:if(!r.state.font){p.ensureStateFont(r.state);continue}buildTextContentItem({chars:f[0],extraSpacing:0});break;case Be:if(!r.state.font){p.ensureStateFont(r.state);continue}S.carriageReturn();buildTextContentItem({chars:f[0],extraSpacing:0});break;case le:if(!r.state.font){p.ensureStateFont(r.state);continue}S.wordSpacing=f[0];S.charSpacing=f[1];S.carriageReturn();buildTextContentItem({chars:f[2],extraSpacing:0});break;case Ue:flushTextContentItem();w||(w=s.get("XObject")||Dict.empty);var G=f[0]instanceof Name,x=f[0].name;if(G&&D.getByName(x))break;next(new Promise((function(e,i){if(!G)throw new FormatError("XObject must be referred to by name.");let a=w.getRaw(x);if(a instanceof Ref){if(D.getByRef(a)){e();return}if(p.globalImageCache.getData(a,p.pageIndex)){e();return}a=m.fetch(a)}if(!(a instanceof BaseStream))throw new FormatError("XObject should be a stream");const E=a.dict.get("Subtype");if(!(E instanceof Name))throw new FormatError("XObject should have a Name subtype");if("Form"!==E.name){D.set(x,a.dict.objId,!0);e();return}const u=r.state.clone(),d=new StateManager(u),f=lookupMatrix(a.dict.getArray("Matrix"),null);f&&d.transform(f);enqueueChunk();const y={enqueueInvoked:!1,enqueue(e,t){this.enqueueInvoked=!0;g.enqueue(e,t)},get desiredSize(){return g.desiredSize},get ready(){return g.ready}};p.getTextContent({stream:a,task:t,resources:a.dict.get("Resources")||s,stateManager:d,includeMarkedContent:n,sink:y,seenStyles:o,viewBox:c,lang:C,markedContentData:h,disableNormalization:l,keepWhiteSpace:Q}).then((function(){y.enqueueInvoked||D.set(x,a.dict.objId,!0);e()}),i)})).catch((function(e){if(!(e instanceof AbortException)){if(!p.options.ignoreErrors)throw e;warn(`getTextContent - ignoring XObject: "${e}".`)}})));return;case NA:G=f[0]instanceof Name;x=f[0].name;if(G&&b.getByName(x))break;next(new Promise((function(e,t){if(!G)throw new FormatError("GState must be referred to by name.");const i=s.get("ExtGState");if(!(i instanceof Dict))throw new FormatError("ExtGState should be a dictionary.");const a=i.get(x);if(!(a instanceof Dict))throw new FormatError("GState should be a dictionary.");const r=a.get("Font");if(r){flushTextContentItem();S.fontName=null;S.fontSize=r[1];handleSetFont(null,r[0]).then(e,t)}else{b.set(x,a.objId,!0);e()}})).catch((function(e){if(!(e instanceof AbortException)){if(!p.options.ignoreErrors)throw e;warn(`getTextContent - ignoring ExtGState: "${e}".`)}})));return;case He:flushTextContentItem();if(n){h.level++;E.items.push({type:"beginMarkedContent",tag:f[0]instanceof Name?f[0].name:null})}break;case Je:flushTextContentItem();if(n){h.level++;let e=null;f[1]instanceof Dict&&(e=f[1].get("MCID"));E.items.push({type:"beginMarkedContentProps",id:Number.isInteger(e)?`${p.idFactory.getPageObjId()}_mc${e}`:null,tag:f[0]instanceof Name?f[0].name:null})}break;case Ye:flushTextContentItem();if(n){if(0===h.level)break;h.level--;E.items.push({type:"endMarkedContent"})}break;case xA:!e||e.font===S.font&&e.fontSize===S.fontSize&&e.fontName===S.fontName||flushTextContentItem()}if(E.items.length>=g.desiredSize){d=!0;break}}if(d)next(ks);else{flushTextContentItem();enqueueChunk();e()}})).catch((e=>{if(!(e instanceof AbortException)){if(!this.options.ignoreErrors)throw e;warn(`getTextContent - ignoring errors during "${t.name}" task: "${e}".`);flushTextContentItem();enqueueChunk()}}))}async extractDataStructures(e,t){const i=this.xref;let a;const s=this.readToUnicode(t.toUnicode);if(t.composite){const i=e.get("CIDSystemInfo");i instanceof Dict&&(t.cidSystemInfo={registry:stringToPDFString(i.get("Registry")),ordering:stringToPDFString(i.get("Ordering")),supplement:i.get("Supplement")});try{const t=e.get("CIDToGIDMap");t instanceof BaseStream&&(a=t.getBytes())}catch(e){if(!this.options.ignoreErrors)throw e;warn(`extractDataStructures - ignoring CIDToGIDMap data: "${e}".`)}}const r=[];let n,g=null;if(e.has("Encoding")){n=e.get("Encoding");if(n instanceof Dict){g=n.get("BaseEncoding");g=g instanceof Name?g.name:null;if(n.has("Differences")){const e=n.get("Differences");let t=0;for(const a of e){const e=i.fetchIfRef(a);if("number"==typeof e)t=e;else{if(!(e instanceof Name))throw new FormatError(`Invalid entry in 'Differences' array: ${e}`);r[t++]=e.name}}}}else if(n instanceof Name)g=n.name;else{const e="Encoding is not a Name nor a Dict";if(!this.options.ignoreErrors)throw new FormatError(e);warn(e)}"MacRomanEncoding"!==g&&"MacExpertEncoding"!==g&&"WinAnsiEncoding"!==g&&(g=null)}const o=!t.file||t.isInternalFont,c=Zi()[t.name];g&&o&&c&&(g=null);if(g)t.defaultEncoding=getEncoding(g);else{const e=!!(t.flags&Ti),i=!!(t.flags&qi);n=fi;"TrueType"!==t.type||i||(n=pi);if(e||c){n=di;o&&(/Symbol/i.test(t.name)?n=mi:/Dingbats/i.test(t.name)?n=yi:/Wingdings/i.test(t.name)&&(n=pi))}t.defaultEncoding=n}t.differences=r;t.baseEncodingName=g;t.hasEncoding=!!g||r.length>0;t.dict=e;t.toUnicode=await s;const C=await this.buildToUnicode(t);t.toUnicode=C;a&&(t.cidToGidMap=this.readCidToGidMap(a,C));return t}_simpleFontToUnicode(e,t=!1){assert(!e.composite,"Must be a simple font.");const i=[],a=e.defaultEncoding.slice(),s=e.baseEncodingName,r=e.differences;for(const e in r){const t=r[e];".notdef"!==t&&(a[e]=t)}const n=Ni();for(const r in a){let g=a[r];if(""===g)continue;let o=n[g];if(void 0!==o){i[r]=String.fromCharCode(o);continue}let c=0;switch(g[0]){case"G":3===g.length&&(c=parseInt(g.substring(1),16));break;case"g":5===g.length&&(c=parseInt(g.substring(1),16));break;case"C":case"c":if(g.length>=3&&g.length<=4){const i=g.substring(1);if(t){c=parseInt(i,16);break}c=+i;if(Number.isNaN(c)&&Number.isInteger(parseInt(i,16)))return this._simpleFontToUnicode(e,!0)}break;case"u":o=getUnicodeForGlyph(g,n);-1!==o&&(c=o);break;default:switch(g){case"f_h":case"f_t":case"T_h":i[r]=g.replaceAll("_","");continue}}if(c>0&&c<=1114111&&Number.isInteger(c)){if(s&&c===+r){const e=getEncoding(s);if(e&&(g=e[r])){i[r]=String.fromCharCode(n[g]);continue}}i[r]=String.fromCodePoint(c)}}return i}async buildToUnicode(e){e.hasIncludedToUnicodeMap=e.toUnicode?.length>0;if(e.hasIncludedToUnicodeMap){!e.composite&&e.hasEncoding&&(e.fallbackToUnicode=this._simpleFontToUnicode(e));return e.toUnicode}if(!e.composite)return new ToUnicodeMap(this._simpleFontToUnicode(e));if(e.composite&&(e.cMap.builtInCMap&&!(e.cMap instanceof IdentityCMap)||"Adobe"===e.cidSystemInfo?.registry&&("GB1"===e.cidSystemInfo.ordering||"CNS1"===e.cidSystemInfo.ordering||"Japan1"===e.cidSystemInfo.ordering||"Korea1"===e.cidSystemInfo.ordering))){const{registry:t,ordering:i}=e.cidSystemInfo,a=Name.get(`${t}-${i}-UCS2`),s=await CMapFactory.create({encoding:a,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null}),r=[],n=[];e.cMap.forEach((function(e,t){if(t>65535)throw new FormatError("Max size of CID is 65,535");const i=s.lookup(t);if(i){n.length=0;for(let e=0,t=i.length;e<t;e+=2)n.push((i.charCodeAt(e)<<8)+i.charCodeAt(e+1));r[e]=String.fromCharCode(...n)}}));return new ToUnicodeMap(r)}return new IdentityToUnicodeMap(e.firstChar,e.lastChar)}async readToUnicode(e){if(!e)return null;if(e instanceof Name){const t=await CMapFactory.create({encoding:e,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null});return t instanceof IdentityCMap?new IdentityToUnicodeMap(0,65535):new ToUnicodeMap(t.getMap())}if(e instanceof BaseStream)try{const t=await CMapFactory.create({encoding:e,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null});if(t instanceof IdentityCMap)return new IdentityToUnicodeMap(0,65535);const i=new Array(t.length);t.forEach((function(e,t){if("number"==typeof t){i[e]=String.fromCodePoint(t);return}const a=[];for(let e=0;e<t.length;e+=2){const i=t.charCodeAt(e)<<8|t.charCodeAt(e+1);if(55296!=(63488&i)){a.push(i);continue}e+=2;const s=t.charCodeAt(e)<<8|t.charCodeAt(e+1);a.push(((1023&i)<<10)+(1023&s)+65536)}i[e]=String.fromCodePoint(...a)}));return new ToUnicodeMap(i)}catch(e){if(e instanceof AbortException)return null;if(this.options.ignoreErrors){warn(`readToUnicode - ignoring ToUnicode data: "${e}".`);return null}throw e}return null}readCidToGidMap(e,t){const i=[];for(let a=0,s=e.length;a<s;a++){const s=e[a++]<<8|e[a],r=a>>1;(0!==s||t.has(r))&&(i[r]=s)}return i}extractWidths(e,t,i){const a=this.xref;let s=[],r=0;const n=[];let g;if(i.composite){const t=e.get("DW");r="number"==typeof t?Math.ceil(t):1e3;const o=e.get("W");if(Array.isArray(o))for(let e=0,t=o.length;e<t;e++){let t=a.fetchIfRef(o[e++]);if(!Number.isInteger(t))break;const i=a.fetchIfRef(o[e]);if(Array.isArray(i))for(const e of i){const i=a.fetchIfRef(e);"number"==typeof i&&(s[t]=i);t++}else{if(!Number.isInteger(i))break;{const r=a.fetchIfRef(o[++e]);if("number"!=typeof r)continue;for(let e=t;e<=i;e++)s[e]=r}}}if(i.vertical){const t=e.getArray("DW2");let i=isNumberArray(t,2)?t:[880,-1e3];g=[i[1],.5*r,i[0]];i=e.get("W2");if(Array.isArray(i))for(let e=0,t=i.length;e<t;e++){let t=a.fetchIfRef(i[e++]);if(!Number.isInteger(t))break;const s=a.fetchIfRef(i[e]);if(Array.isArray(s))for(let e=0,i=s.length;e<i;e++){const i=[a.fetchIfRef(s[e++]),a.fetchIfRef(s[e++]),a.fetchIfRef(s[e])];isNumberArray(i,null)&&(n[t]=i);t++}else{if(!Number.isInteger(s))break;{const r=[a.fetchIfRef(i[++e]),a.fetchIfRef(i[++e]),a.fetchIfRef(i[++e])];if(!isNumberArray(r,null))continue;for(let e=t;e<=s;e++)n[e]=r}}}}}else{const n=e.get("Widths");if(Array.isArray(n)){let e=i.firstChar;for(const t of n){const i=a.fetchIfRef(t);"number"==typeof i&&(s[e]=i);e++}const g=t.get("MissingWidth");r="number"==typeof g?g:0}else{const t=e.get("BaseFont");if(t instanceof Name){const e=this.getBaseFontMetrics(t.name);s=this.buildCharCodeToWidth(e.widths,i);r=e.defaultWidth}}}let o=!0,c=r;for(const e in s){const t=s[e];if(t)if(c){if(c!==t){o=!1;break}}else c=t}o?i.flags|=vi:i.flags&=~vi;i.defaultWidth=r;i.widths=s;i.defaultVMetrics=g;i.vmetrics=n}isSerifFont(e){const t=e.split("-",1)[0];return t in Xi()||/serif/gi.test(t)}getBaseFontMetrics(e){let t=0,i=Object.create(null),a=!1;let s=Pi()[e]||e;const r=Aa();s in r||(s=this.isSerifFont(e)?"Times-Roman":"Helvetica");const n=r[s];if("number"==typeof n){t=n;a=!0}else i=n();return{defaultWidth:t,monospace:a,widths:i}}buildCharCodeToWidth(e,t){const i=Object.create(null),a=t.differences,s=t.defaultEncoding;for(let t=0;t<256;t++)t in a&&e[a[t]]?i[t]=e[a[t]]:t in s&&e[s[t]]&&(i[t]=e[s[t]]);return i}preEvaluateFont(e){const t=e;let i=e.get("Subtype");if(!(i instanceof Name))throw new FormatError("invalid font Subtype");let a,s=!1;if("Type0"===i.name){const t=e.get("DescendantFonts");if(!t)throw new FormatError("Descendant fonts are not specified");if(!((e=Array.isArray(t)?this.xref.fetchIfRef(t[0]):t)instanceof Dict))throw new FormatError("Descendant font is not a dictionary.");i=e.get("Subtype");if(!(i instanceof Name))throw new FormatError("invalid font Subtype");s=!0}let r=e.get("FirstChar");Number.isInteger(r)||(r=0);let n=e.get("LastChar");Number.isInteger(n)||(n=s?65535:255);const g=e.get("FontDescriptor"),o=e.get("ToUnicode")||t.get("ToUnicode");if(g){a=new MurmurHash3_64;const i=t.getRaw("Encoding");if(i instanceof Name)a.update(i.name);else if(i instanceof Ref)a.update(i.toString());else if(i instanceof Dict)for(const e of i.getRawValues())if(e instanceof Name)a.update(e.name);else if(e instanceof Ref)a.update(e.toString());else if(Array.isArray(e)){const t=e.length,i=new Array(t);for(let a=0;a<t;a++){const t=e[a];t instanceof Name?i[a]=t.name:("number"==typeof t||t instanceof Ref)&&(i[a]=t.toString())}a.update(i.join())}a.update(`${r}-${n}`);if(o instanceof BaseStream){const e=o.str||o,t=e.buffer?new Uint8Array(e.buffer.buffer,0,e.bufferLength):new Uint8Array(e.bytes.buffer,e.start,e.end-e.start);a.update(t)}else o instanceof Name&&a.update(o.name);const g=e.get("Widths")||t.get("Widths");if(Array.isArray(g)){const e=[];for(const t of g)("number"==typeof t||t instanceof Ref)&&e.push(t.toString());a.update(e.join())}if(s){a.update("compositeFont");const i=e.get("W")||t.get("W");if(Array.isArray(i)){const e=[];for(const t of i)if("number"==typeof t||t instanceof Ref)e.push(t.toString());else if(Array.isArray(t)){const i=[];for(const e of t)("number"==typeof e||e instanceof Ref)&&i.push(e.toString());e.push(`[${i.join()}]`)}a.update(e.join())}const s=e.getRaw("CIDToGIDMap")||t.getRaw("CIDToGIDMap");s instanceof Name?a.update(s.name):s instanceof Ref?a.update(s.toString()):s instanceof BaseStream&&a.update(s.peekBytes())}}return{descriptor:g,dict:e,baseDict:t,composite:s,type:i.name,firstChar:r,lastChar:n,toUnicode:o,hash:a?a.hexdigest():""}}async translateFont({descriptor:e,dict:t,baseDict:i,composite:s,type:r,firstChar:n,lastChar:g,toUnicode:o,cssFontInfo:c}){const C="Type3"===r;if(!e){if(!C){let e=t.get("BaseFont");if(!(e instanceof Name))throw new FormatError("Base font is not specified");e=e.name.replaceAll(/[,_]/g,"-");const a=this.getBaseFontMetrics(e),s=e.split("-",1)[0],c=(this.isSerifFont(s)?Ki:0)|(a.monospace?vi:0)|(Zi()[s]?Ti:qi),h={type:r,name:e,loadedName:i.loadedName,systemFontInfo:null,widths:a.widths,defaultWidth:a.defaultWidth,isSimulatedFlags:!0,flags:c,firstChar:n,lastChar:g,toUnicode:o,xHeight:0,capHeight:0,italicAngle:0,isType3Font:C},l=t.get("Widths"),Q=getStandardFontName(e);let E=null;if(Q){E=await this.fetchStandardFontData(Q);h.isInternalFont=!!E}!h.isInternalFont&&this.options.useSystemFonts&&(h.systemFontInfo=getFontSubstitution(this.systemFontCache,this.idFactory,this.options.standardFontDataUrl,e,Q,r));const u=await this.extractDataStructures(t,h);if(Array.isArray(l)){const e=[];let t=n;for(const i of l){const a=this.xref.fetchIfRef(i);"number"==typeof a&&(e[t]=a);t++}u.widths=e}else u.widths=this.buildCharCodeToWidth(a.widths,u);return new Font(e,E,u)}{const i=lookupNormalRect(t.getArray("FontBBox"),[0,0,0,0]);(e=new Dict(null)).set("FontName",Name.get(r));e.set("FontBBox",i)}}let h=e.get("FontName"),l=t.get("BaseFont");"string"==typeof h&&(h=Name.get(h));"string"==typeof l&&(l=Name.get(l));const Q=h?.name,E=l?.name;if(!C&&Q!==E){info(`The FontDescriptor's FontName is "${Q}" but should be the same as the Font's BaseFont "${E}".`);Q&&E&&(E.startsWith(Q)||!isKnownFontName(Q)&&isKnownFontName(E))&&(h=null)}h||=l;if(!(h instanceof Name))throw new FormatError("invalid font name");let u,d,f,p,m;try{u=e.get("FontFile","FontFile2","FontFile3")}catch(e){if(!this.options.ignoreErrors)throw e;warn(`translateFont - fetching "${h.name}" font file: "${e}".`);u=new NullStream}let y=!1,w=null,D=null;if(u){if(u.dict){const e=u.dict.get("Subtype");e instanceof Name&&(d=e.name);f=u.dict.get("Length1");p=u.dict.get("Length2");m=u.dict.get("Length3")}}else if(c){const e=getXfaFontName(h.name);if(e){c.fontFamily=`${c.fontFamily}-PdfJS-XFA`;c.metrics=e.metrics||null;w=e.factors||null;u=await this.fetchStandardFontData(e.name);y=!!u;i=t=getXfaFontDict(h.name);s=!0}}else if(!C){const e=getStandardFontName(h.name);if(e){u=await this.fetchStandardFontData(e);y=!!u}!y&&this.options.useSystemFonts&&(D=getFontSubstitution(this.systemFontCache,this.idFactory,this.options.standardFontDataUrl,h.name,e,r))}const b=lookupMatrix(t.getArray("FontMatrix"),a),F=lookupNormalRect(e.getArray("FontBBox")||t.getArray("FontBBox"),void 0);let S=e.get("Ascent");"number"!=typeof S&&(S=void 0);let k=e.get("Descent");"number"!=typeof k&&(k=void 0);let R=e.get("XHeight");"number"!=typeof R&&(R=0);let N=e.get("CapHeight");"number"!=typeof N&&(N=0);let G=e.get("Flags");Number.isInteger(G)||(G=0);let x=e.get("ItalicAngle");"number"!=typeof x&&(x=0);const U={type:r,name:h.name,subtype:d,file:u,length1:f,length2:p,length3:m,isInternalFont:y,loadedName:i.loadedName,composite:s,fixedPitch:!1,fontMatrix:b,firstChar:n,lastChar:g,toUnicode:o,bbox:F,ascent:S,descent:k,xHeight:R,capHeight:N,flags:G,italicAngle:x,isType3Font:C,cssFontInfo:c,scaleFactors:w,systemFontInfo:D};if(s){const e=i.get("Encoding");e instanceof Name&&(U.cidEncoding=e.name);const t=await CMapFactory.create({encoding:e,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null});U.cMap=t;U.vertical=U.cMap.vertical}const M=await this.extractDataStructures(t,U);this.extractWidths(t,e,M);return new Font(h.name,u,M)}static buildFontPaths(e,t,i,a){function buildPath(t){const s=`${e.loadedName}_path_${t}`;try{if(e.renderer.hasBuiltPath(t))return;i.send("commonobj",[s,"FontPath",e.renderer.getPathJs(t)])}catch(e){if(a.ignoreErrors){warn(`buildFontPaths - ignoring ${s} glyph: "${e}".`);return}throw e}}for(const e of t){buildPath(e.fontChar);const t=e.accent;t?.fontChar&&buildPath(t.fontChar)}}static get fallbackFontDict(){const e=new Dict;e.set("BaseFont",Name.get("Helvetica"));e.set("Type",Name.get("FallbackType"));e.set("Subtype",Name.get("FallbackType"));e.set("Encoding",Name.get("WinAnsiEncoding"));return shadow(this,"fallbackFontDict",e)}}class TranslatedFont{constructor({loadedName:e,font:t,dict:i,evaluatorOptions:a}){this.loadedName=e;this.font=t;this.dict=i;this._evaluatorOptions=a||bs;this.type3Loaded=null;this.type3Dependencies=t.isType3Font?new Set:null;this.sent=!1}send(e){if(!this.sent){this.sent=!0;e.send("commonobj",[this.loadedName,"Font",this.font.exportData(this._evaluatorOptions.fontExtraProperties)])}}fallback(e){if(this.font.data){this.font.disableFontFace=!0;PartialEvaluator.buildFontPaths(this.font,this.font.glyphCacheValues,e,this._evaluatorOptions)}}loadType3Data(e,t,i){if(this.type3Loaded)return this.type3Loaded;if(!this.font.isType3Font)throw new Error("Must be a Type3 font.");const a=e.clone({ignoreErrors:!1}),s=new RefSet(e.type3FontRefs);this.dict.objId&&!s.has(this.dict.objId)&&s.put(this.dict.objId);a.type3FontRefs=s;const r=this.font,n=this.type3Dependencies;let g=Promise.resolve();const o=this.dict.get("CharProcs"),c=this.dict.get("Resources")||t,C=Object.create(null),h=Util.normalizeRect(r.bbox||[0,0,0,0]),l=h[2]-h[0],Q=h[3]-h[1],E=Math.hypot(l,Q);for(const e of o.getKeys())g=g.then((()=>{const t=o.get(e),s=new OperatorList;return a.getOperatorList({stream:t,task:i,resources:c,operatorList:s}).then((()=>{s.fnArray[0]===Ee&&this._removeType3ColorOperators(s,E);C[e]=s.getIR();for(const e of s.dependencies)n.add(e)})).catch((function(t){warn(`Type3 font resource "${e}" is not available.`);const i=new OperatorList;C[e]=i.getIR()}))}));this.type3Loaded=g.then((()=>{r.charProcOperatorList=C;if(this._bbox){r.isCharBBox=!0;r.bbox=this._bbox}}));return this.type3Loaded}_removeType3ColorOperators(e,t=NaN){const i=Util.normalizeRect(e.argsArray[0].slice(2)),a=i[2]-i[0],s=i[3]-i[1],r=Math.hypot(a,s);if(0===a||0===s){e.fnArray.splice(0,1);e.argsArray.splice(0,1)}else if(0===t||Math.round(r/t)>=10){this._bbox||(this._bbox=[1/0,1/0,-1/0,-1/0]);this._bbox[0]=Math.min(this._bbox[0],i[0]);this._bbox[1]=Math.min(this._bbox[1],i[1]);this._bbox[2]=Math.max(this._bbox[2],i[2]);this._bbox[3]=Math.max(this._bbox[3],i[3])}let n=0,g=e.length;for(;n<g;){switch(e.fnArray[n]){case Ee:break;case ue:case de:case fe:case pe:case me:case ye:case we:case De:case be:case Fe:case Se:case ke:case Re:case kA:e.fnArray.splice(n,1);e.argsArray.splice(n,1);g--;continue;case NA:const[t]=e.argsArray[n];let i=0,a=t.length;for(;i<a;){const[e]=t[i];switch(e){case"TR":case"TR2":case"HT":case"BG":case"BG2":case"UCR":case"UCR2":t.splice(i,1);a--;continue}i++}}n++}}}class StateManager{constructor(e=new EvalState){this.state=e;this.stateStack=[]}save(){const e=this.state;this.stateStack.push(this.state);this.state=e.clone()}restore(){const e=this.stateStack.pop();e&&(this.state=e)}transform(e){this.state.ctm=Util.transform(this.state.ctm,e)}}class TextState{constructor(){this.ctm=new Float32Array(i);this.fontName=null;this.fontSize=0;this.loadedName=null;this.font=null;this.fontMatrix=a;this.textMatrix=i.slice();this.textLineMatrix=i.slice();this.charSpacing=0;this.wordSpacing=0;this.leading=0;this.textHScale=1;this.textRise=0}setTextMatrix(e,t,i,a,s,r){const n=this.textMatrix;n[0]=e;n[1]=t;n[2]=i;n[3]=a;n[4]=s;n[5]=r}setTextLineMatrix(e,t,i,a,s,r){const n=this.textLineMatrix;n[0]=e;n[1]=t;n[2]=i;n[3]=a;n[4]=s;n[5]=r}translateTextMatrix(e,t){const i=this.textMatrix;i[4]=i[0]*e+i[2]*t+i[4];i[5]=i[1]*e+i[3]*t+i[5]}translateTextLineMatrix(e,t){const i=this.textLineMatrix;i[4]=i[0]*e+i[2]*t+i[4];i[5]=i[1]*e+i[3]*t+i[5]}carriageReturn(){this.translateTextLineMatrix(0,-this.leading);this.textMatrix=this.textLineMatrix.slice()}clone(){const e=Object.create(this);e.textMatrix=this.textMatrix.slice();e.textLineMatrix=this.textLineMatrix.slice();e.fontMatrix=this.fontMatrix.slice();return e}}class EvalState{constructor(){this.ctm=new Float32Array(i);this.font=null;this.textRenderingMode=y;this.fillColorSpace=ColorSpace.singletons.gray;this.strokeColorSpace=ColorSpace.singletons.gray}clone(){return Object.create(this)}}class EvaluatorPreprocessor{static get opMap(){return shadow(this,"opMap",Object.assign(Object.create(null),{w:{id:wA,numArgs:1,variableArgs:!1},J:{id:DA,numArgs:1,variableArgs:!1},j:{id:bA,numArgs:1,variableArgs:!1},M:{id:FA,numArgs:1,variableArgs:!1},d:{id:SA,numArgs:2,variableArgs:!1},ri:{id:kA,numArgs:1,variableArgs:!1},i:{id:RA,numArgs:1,variableArgs:!1},gs:{id:NA,numArgs:1,variableArgs:!1},q:{id:GA,numArgs:0,variableArgs:!1},Q:{id:xA,numArgs:0,variableArgs:!1},cm:{id:UA,numArgs:6,variableArgs:!1},m:{id:MA,numArgs:2,variableArgs:!1},l:{id:LA,numArgs:2,variableArgs:!1},c:{id:HA,numArgs:6,variableArgs:!1},v:{id:JA,numArgs:4,variableArgs:!1},y:{id:YA,numArgs:4,variableArgs:!1},h:{id:vA,numArgs:0,variableArgs:!1},re:{id:KA,numArgs:4,variableArgs:!1},S:{id:TA,numArgs:0,variableArgs:!1},s:{id:qA,numArgs:0,variableArgs:!1},f:{id:OA,numArgs:0,variableArgs:!1},F:{id:OA,numArgs:0,variableArgs:!1},"f*":{id:PA,numArgs:0,variableArgs:!1},B:{id:WA,numArgs:0,variableArgs:!1},"B*":{id:jA,numArgs:0,variableArgs:!1},b:{id:XA,numArgs:0,variableArgs:!1},"b*":{id:ZA,numArgs:0,variableArgs:!1},n:{id:VA,numArgs:0,variableArgs:!1},W:{id:zA,numArgs:0,variableArgs:!1},"W*":{id:_A,numArgs:0,variableArgs:!1},BT:{id:$A,numArgs:0,variableArgs:!1},ET:{id:Ae,numArgs:0,variableArgs:!1},Tc:{id:ee,numArgs:1,variableArgs:!1},Tw:{id:te,numArgs:1,variableArgs:!1},Tz:{id:ie,numArgs:1,variableArgs:!1},TL:{id:ae,numArgs:1,variableArgs:!1},Tf:{id:se,numArgs:2,variableArgs:!1},Tr:{id:re,numArgs:1,variableArgs:!1},Ts:{id:ne,numArgs:1,variableArgs:!1},Td:{id:ge,numArgs:2,variableArgs:!1},TD:{id:oe,numArgs:2,variableArgs:!1},Tm:{id:Ie,numArgs:6,variableArgs:!1},"T*":{id:ce,numArgs:0,variableArgs:!1},Tj:{id:Ce,numArgs:1,variableArgs:!1},TJ:{id:he,numArgs:1,variableArgs:!1},"'":{id:Be,numArgs:1,variableArgs:!1},'"':{id:le,numArgs:3,variableArgs:!1},d0:{id:Qe,numArgs:2,variableArgs:!1},d1:{id:Ee,numArgs:6,variableArgs:!1},CS:{id:ue,numArgs:1,variableArgs:!1},cs:{id:de,numArgs:1,variableArgs:!1},SC:{id:fe,numArgs:4,variableArgs:!0},SCN:{id:pe,numArgs:33,variableArgs:!0},sc:{id:me,numArgs:4,variableArgs:!0},scn:{id:ye,numArgs:33,variableArgs:!0},G:{id:we,numArgs:1,variableArgs:!1},g:{id:De,numArgs:1,variableArgs:!1},RG:{id:be,numArgs:3,variableArgs:!1},rg:{id:Fe,numArgs:3,variableArgs:!1},K:{id:Se,numArgs:4,variableArgs:!1},k:{id:ke,numArgs:4,variableArgs:!1},sh:{id:Re,numArgs:1,variableArgs:!1},BI:{id:Ne,numArgs:0,variableArgs:!1},ID:{id:Ge,numArgs:0,variableArgs:!1},EI:{id:xe,numArgs:1,variableArgs:!1},Do:{id:Ue,numArgs:1,variableArgs:!1},MP:{id:Me,numArgs:1,variableArgs:!1},DP:{id:Le,numArgs:2,variableArgs:!1},BMC:{id:He,numArgs:1,variableArgs:!1},BDC:{id:Je,numArgs:2,variableArgs:!1},EMC:{id:Ye,numArgs:0,variableArgs:!1},BX:{id:ve,numArgs:0,variableArgs:!1},EX:{id:Ke,numArgs:0,variableArgs:!1},BM:null,BD:null,true:null,fa:null,fal:null,fals:null,false:null,nu:null,nul:null,null:null}))}static MAX_INVALID_PATH_OPS=10;constructor(e,t,i=new StateManager){this.parser=new Parser({lexer:new Lexer(e,EvaluatorPreprocessor.opMap),xref:t});this.stateManager=i;this.nonProcessedArgs=[];this._isPathOp=!1;this._numInvalidPathOPS=0}get savedStatesDepth(){return this.stateManager.stateStack.length}read(e){let t=e.args;for(;;){const i=this.parser.getObj();if(i instanceof Cmd){const a=i.cmd,s=EvaluatorPreprocessor.opMap[a];if(!s){warn(`Unknown command "${a}".`);continue}const r=s.id,n=s.numArgs;let g=null!==t?t.length:0;this._isPathOp||(this._numInvalidPathOPS=0);this._isPathOp=r>=MA&&r<=VA;if(s.variableArgs)g>n&&info(`Command ${a}: expected [0, ${n}] args, but received ${g} args.`);else{if(g!==n){const e=this.nonProcessedArgs;for(;g>n;){e.push(t.shift());g--}for(;g<n&&0!==e.length;){null===t&&(t=[]);t.unshift(e.pop());g++}}if(g<n){const e=`command ${a}: expected ${n} args, but received ${g} args.`;if(this._isPathOp&&++this._numInvalidPathOPS>EvaluatorPreprocessor.MAX_INVALID_PATH_OPS)throw new FormatError(`Invalid ${e}`);warn(`Skipping ${e}`);null!==t&&(t.length=0);continue}}this.preprocessCommand(r,t);e.fn=r;e.args=t;return!0}if(i===pt)return!1;if(null!==i){null===t&&(t=[]);t.push(i);if(t.length>33)throw new FormatError("Too many arguments")}}}preprocessCommand(e,t){switch(0|e){case GA:this.stateManager.save();break;case xA:this.stateManager.restore();break;case UA:this.stateManager.transform(t)}}}class DefaultAppearanceEvaluator extends EvaluatorPreprocessor{constructor(e){super(new StringStream(e))}parse(){const e={fn:0,args:[]},t={fontSize:0,fontName:"",fontColor:new Uint8ClampedArray(3)};try{for(;;){e.args.length=0;if(!this.read(e))break;if(0!==this.savedStatesDepth)continue;const{fn:i,args:a}=e;switch(0|i){case se:const[e,i]=a;e instanceof Name&&(t.fontName=e.name);"number"==typeof i&&i>0&&(t.fontSize=i);break;case Fe:ColorSpace.singletons.rgb.getRgbItem(a,0,t.fontColor,0);break;case De:ColorSpace.singletons.gray.getRgbItem(a,0,t.fontColor,0);break;case ke:ColorSpace.singletons.cmyk.getRgbItem(a,0,t.fontColor,0)}}}catch(e){warn(`parseDefaultAppearance - ignoring errors: "${e}".`)}return t}}function parseDefaultAppearance(e){return new DefaultAppearanceEvaluator(e).parse()}class AppearanceStreamEvaluator extends EvaluatorPreprocessor{constructor(e,t,i){super(e);this.stream=e;this.evaluatorOptions=t;this.xref=i;this.resources=e.dict?.get("Resources")}parse(){const e={fn:0,args:[]};let t={scaleFactor:1,fontSize:0,fontName:"",fontColor:new Uint8ClampedArray(3),fillColorSpace:ColorSpace.singletons.gray},i=!1;const a=[];try{for(;;){e.args.length=0;if(i||!this.read(e))break;const{fn:s,args:r}=e;switch(0|s){case GA:a.push({scaleFactor:t.scaleFactor,fontSize:t.fontSize,fontName:t.fontName,fontColor:t.fontColor.slice(),fillColorSpace:t.fillColorSpace});break;case xA:t=a.pop()||t;break;case Ie:t.scaleFactor*=Math.hypot(r[0],r[1]);break;case se:const[e,s]=r;e instanceof Name&&(t.fontName=e.name);"number"==typeof s&&s>0&&(t.fontSize=s*t.scaleFactor);break;case de:t.fillColorSpace=ColorSpace.parse({cs:r[0],xref:this.xref,resources:this.resources,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:this._localColorSpaceCache});break;case me:t.fillColorSpace.getRgbItem(r,0,t.fontColor,0);break;case Fe:ColorSpace.singletons.rgb.getRgbItem(r,0,t.fontColor,0);break;case De:ColorSpace.singletons.gray.getRgbItem(r,0,t.fontColor,0);break;case ke:ColorSpace.singletons.cmyk.getRgbItem(r,0,t.fontColor,0);break;case Ce:case he:case Be:case le:i=!0}}}catch(e){warn(`parseAppearanceStream - ignoring errors: "${e}".`)}this.stream.reset();delete t.scaleFactor;delete t.fillColorSpace;return t}get _localColorSpaceCache(){return shadow(this,"_localColorSpaceCache",new LocalColorSpaceCache)}get _pdfFunctionFactory(){return shadow(this,"_pdfFunctionFactory",new PDFFunctionFactory({xref:this.xref,isEvalSupported:this.evaluatorOptions.isEvalSupported}))}}function getPdfColor(e,t){if(e[0]===e[1]&&e[1]===e[2]){return`${numberToString(e[0]/255)} ${t?"g":"G"}`}return Array.from(e,(e=>numberToString(e/255))).join(" ")+" "+(t?"rg":"RG")}class FakeUnicodeFont{constructor(e,t){this.xref=e;this.widths=null;this.firstChar=1/0;this.lastChar=-1/0;this.fontFamily=t;const i=new OffscreenCanvas(1,1);this.ctxMeasure=i.getContext("2d",{willReadFrequently:!0});FakeUnicodeFont._fontNameId||(FakeUnicodeFont._fontNameId=1);this.fontName=Name.get(`InvalidPDFjsFont_${t}_${FakeUnicodeFont._fontNameId++}`)}get fontDescriptorRef(){if(!FakeUnicodeFont._fontDescriptorRef){const e=new Dict(this.xref);e.set("Type",Name.get("FontDescriptor"));e.set("FontName",this.fontName);e.set("FontFamily","MyriadPro Regular");e.set("FontBBox",[0,0,0,0]);e.set("FontStretch",Name.get("Normal"));e.set("FontWeight",400);e.set("ItalicAngle",0);FakeUnicodeFont._fontDescriptorRef=this.xref.getNewPersistentRef(e)}return FakeUnicodeFont._fontDescriptorRef}get descendantFontRef(){const e=new Dict(this.xref);e.set("BaseFont",this.fontName);e.set("Type",Name.get("Font"));e.set("Subtype",Name.get("CIDFontType0"));e.set("CIDToGIDMap",Name.get("Identity"));e.set("FirstChar",this.firstChar);e.set("LastChar",this.lastChar);e.set("FontDescriptor",this.fontDescriptorRef);e.set("DW",1e3);const t=[],i=[...this.widths.entries()].sort();let a=null,s=null;for(const[e,r]of i)if(a)if(e===a+s.length)s.push(r);else{t.push(a,s);a=e;s=[r]}else{a=e;s=[r]}a&&t.push(a,s);e.set("W",t);const r=new Dict(this.xref);r.set("Ordering","Identity");r.set("Registry","Adobe");r.set("Supplement",0);e.set("CIDSystemInfo",r);return this.xref.getNewPersistentRef(e)}get baseFontRef(){const e=new Dict(this.xref);e.set("BaseFont",this.fontName);e.set("Type",Name.get("Font"));e.set("Subtype",Name.get("Type0"));e.set("Encoding",Name.get("Identity-H"));e.set("DescendantFonts",[this.descendantFontRef]);e.set("ToUnicode",Name.get("Identity-H"));return this.xref.getNewPersistentRef(e)}get resources(){const e=new Dict(this.xref),t=new Dict(this.xref);t.set(this.fontName.name,this.baseFontRef);e.set("Font",t);return e}_createContext(){this.widths=new Map;this.ctxMeasure.font=`1000px ${this.fontFamily}`;return this.ctxMeasure}createFontResources(e){const t=this._createContext();for(const i of e.split(/\r\n?|\n/))for(const e of i.split("")){const i=e.charCodeAt(0);if(this.widths.has(i))continue;const a=t.measureText(e),s=Math.ceil(a.width);this.widths.set(i,s);this.firstChar=Math.min(i,this.firstChar);this.lastChar=Math.max(i,this.lastChar)}return this.resources}static getFirstPositionInfo(e,t,i){const[a,n,g,o]=e;let c=g-a,C=o-n;t%180!=0&&([c,C]=[C,c]);const h=s*i;return{coords:[0,C+r*i-h],bbox:[0,0,c,C],matrix:0!==t?getRotationMatrix(t,C,h):void 0}}createAppearance(e,t,i,a,n,g){const o=this._createContext(),c=[];let C=-1/0;for(const t of e.split(/\r\n?|\n/)){c.push(t);const e=o.measureText(t).width;C=Math.max(C,e);for(const e of codePointIter(t)){const t=String.fromCodePoint(e);let i=this.widths.get(e);if(void 0===i){const a=o.measureText(t);i=Math.ceil(a.width);this.widths.set(e,i);this.firstChar=Math.min(e,this.firstChar);this.lastChar=Math.max(e,this.lastChar)}}}C*=a/1e3;const[h,l,Q,E]=t;let u=Q-h,d=E-l;i%180!=0&&([u,d]=[d,u]);let f=1;C>u&&(f=u/C);let p=1;const m=s*a,y=r*a,w=m*c.length;w>d&&(p=d/w);const D=a*Math.min(f,p),b=["q",`0 0 ${numberToString(u)} ${numberToString(d)} re W n`,"BT",`1 0 0 1 0 ${numberToString(d+y)} Tm 0 Tc ${getPdfColor(n,!0)}`,`/${this.fontName.name} ${numberToString(D)} Tf`],{resources:F}=this;if(1!==(g="number"==typeof g&&g>=0&&g<=1?g:1)){b.push("/R0 gs");const e=new Dict(this.xref),t=new Dict(this.xref);t.set("ca",g);t.set("CA",g);t.set("Type",Name.get("ExtGState"));e.set("R0",t);F.set("ExtGState",e)}const S=numberToString(m);for(const e of c)b.push(`0 -${S} Td <${stringToUTF16HexString(e)}> Tj`);b.push("ET","Q");const k=b.join("\n"),R=new Dict(this.xref);R.set("Subtype",Name.get("Form"));R.set("Type",Name.get("XObject"));R.set("BBox",[0,0,u,d]);R.set("Length",k.length);R.set("Resources",F);if(i){const e=getRotationMatrix(i,u,d);R.set("Matrix",e)}const N=new StringStream(k);N.dict=R;return N}}class NameOrNumberTree{constructor(e,t,i){this.constructor===NameOrNumberTree&&unreachable("Cannot initialize NameOrNumberTree.");this.root=e;this.xref=t;this._type=i}getAll(){const e=new Map;if(!this.root)return e;const t=this.xref,i=new RefSet;i.put(this.root);const a=[this.root];for(;a.length>0;){const s=t.fetchIfRef(a.shift());if(!(s instanceof Dict))continue;if(s.has("Kids")){const e=s.get("Kids");if(!Array.isArray(e))continue;for(const t of e){if(i.has(t))throw new FormatError(`Duplicate entry in "${this._type}" tree.`);a.push(t);i.put(t)}continue}const r=s.get(this._type);if(Array.isArray(r))for(let i=0,a=r.length;i<a;i+=2)e.set(t.fetchIfRef(r[i]),t.fetchIfRef(r[i+1]))}return e}get(e){if(!this.root)return null;const t=this.xref;let i=t.fetchIfRef(this.root),a=0;for(;i.has("Kids");){if(++a>10){warn(`Search depth limit reached for "${this._type}" tree.`);return null}const s=i.get("Kids");if(!Array.isArray(s))return null;let r=0,n=s.length-1;for(;r<=n;){const a=r+n>>1,g=t.fetchIfRef(s[a]),o=g.get("Limits");if(e<t.fetchIfRef(o[0]))n=a-1;else{if(!(e>t.fetchIfRef(o[1]))){i=g;break}r=a+1}}if(r>n)return null}const s=i.get(this._type);if(Array.isArray(s)){let i=0,a=s.length-2;for(;i<=a;){const r=i+a>>1,n=r+(1&r),g=t.fetchIfRef(s[n]);if(e<g)a=n-2;else{if(!(e>g))return t.fetchIfRef(s[n+1]);i=n+2}}}return null}}class NameTree extends NameOrNumberTree{constructor(e,t){super(e,t,"Names")}}class NumberTree extends NameOrNumberTree{constructor(e,t){super(e,t,"Nums")}}function clearGlobalCaches(){!function clearPatternCaches(){ya=Object.create(null)}();!function clearPrimitiveCaches(){mt=Object.create(null);yt=Object.create(null);wt=Object.create(null)}();!function clearUnicodeCaches(){Ji.clear()}();JpxImage.cleanup()}function pickPlatformItem(e){return e instanceof Dict?e.has("UF")?e.get("UF"):e.has("F")?e.get("F"):e.has("Unix")?e.get("Unix"):e.has("Mac")?e.get("Mac"):e.has("DOS")?e.get("DOS"):null:null}class FileSpec{#S=!1;constructor(e,t,i=!1){if(e instanceof Dict){this.xref=t;this.root=e;e.has("FS")&&(this.fs=e.get("FS"));e.has("RF")&&warn("Related file specifications are not supported");i||(e.has("EF")?this.#S=!0:warn("Non-embedded file specifications are not supported"))}}get filename(){let e="";const t=pickPlatformItem(this.root);t&&"string"==typeof t&&(e=stringToPDFString(t).replaceAll("\\\\","\\").replaceAll("\\/","/").replaceAll("\\","/"));return shadow(this,"filename",e||"unnamed")}get content(){if(!this.#S)return null;this._contentRef||=pickPlatformItem(this.root?.get("EF"));let e=null;if(this._contentRef){const t=this.xref.fetchIfRef(this._contentRef);t instanceof BaseStream?e=t.getBytes():warn("Embedded file specification points to non-existing/invalid content")}else warn("Embedded file specification does not have any content");return e}get description(){let e="";const t=this.root?.get("Desc");t&&"string"==typeof t&&(e=stringToPDFString(t));return shadow(this,"description",e)}get serializable(){return{rawFilename:this.filename,filename:(e=this.filename,e.substring(e.lastIndexOf("/")+1)),content:this.content,description:this.description};var e}}const Rs=0,Ns=-2,Gs=-3,xs=-4,Us=-5,Ms=-6,Ls=-9;function isWhitespace(e,t){const i=e[t];return" "===i||"\n"===i||"\r"===i||"\t"===i}class XMLParserBase{_resolveEntities(e){return e.replaceAll(/&([^;]+);/g,((e,t)=>{if("#x"===t.substring(0,2))return String.fromCodePoint(parseInt(t.substring(2),16));if("#"===t.substring(0,1))return String.fromCodePoint(parseInt(t.substring(1),10));switch(t){case"lt":return"<";case"gt":return">";case"amp":return"&";case"quot":return'"';case"apos":return"'"}return this.onResolveEntity(t)}))}_parseContent(e,t){const i=[];let a=t;function skipWs(){for(;a<e.length&&isWhitespace(e,a);)++a}for(;a<e.length&&!isWhitespace(e,a)&&">"!==e[a]&&"/"!==e[a];)++a;const s=e.substring(t,a);skipWs();for(;a<e.length&&">"!==e[a]&&"/"!==e[a]&&"?"!==e[a];){skipWs();let t="",s="";for(;a<e.length&&!isWhitespace(e,a)&&"="!==e[a];){t+=e[a];++a}skipWs();if("="!==e[a])return null;++a;skipWs();const r=e[a];if('"'!==r&&"'"!==r)return null;const n=e.indexOf(r,++a);if(n<0)return null;s=e.substring(a,n);i.push({name:t,value:this._resolveEntities(s)});a=n+1;skipWs()}return{name:s,attributes:i,parsed:a-t}}_parseProcessingInstruction(e,t){let i=t;for(;i<e.length&&!isWhitespace(e,i)&&">"!==e[i]&&"?"!==e[i]&&"/"!==e[i];)++i;const a=e.substring(t,i);!function skipWs(){for(;i<e.length&&isWhitespace(e,i);)++i}();const s=i;for(;i<e.length&&("?"!==e[i]||">"!==e[i+1]);)++i;return{name:a,value:e.substring(s,i),parsed:i-t}}parseXml(e){let t=0;for(;t<e.length;){let i=t;if("<"===e[t]){++i;let t;switch(e[i]){case"/":++i;t=e.indexOf(">",i);if(t<0){this.onError(Ls);return}this.onEndElement(e.substring(i,t));i=t+1;break;case"?":++i;const a=this._parseProcessingInstruction(e,i);if("?>"!==e.substring(i+a.parsed,i+a.parsed+2)){this.onError(Gs);return}this.onPi(a.name,a.value);i+=a.parsed+2;break;case"!":if("--"===e.substring(i+1,i+3)){t=e.indexOf("--\x3e",i+3);if(t<0){this.onError(Us);return}this.onComment(e.substring(i+3,t));i=t+3}else if("[CDATA["===e.substring(i+1,i+8)){t=e.indexOf("]]>",i+8);if(t<0){this.onError(Ns);return}this.onCdata(e.substring(i+8,t));i=t+3}else{if("DOCTYPE"!==e.substring(i+1,i+8)){this.onError(Ms);return}{const a=e.indexOf("[",i+8);let s=!1;t=e.indexOf(">",i+8);if(t<0){this.onError(xs);return}if(a>0&&t>a){t=e.indexOf("]>",i+8);if(t<0){this.onError(xs);return}s=!0}const r=e.substring(i+8,t+(s?1:0));this.onDoctype(r);i=t+(s?2:1)}}break;default:const s=this._parseContent(e,i);if(null===s){this.onError(Ms);return}let r=!1;if("/>"===e.substring(i+s.parsed,i+s.parsed+2))r=!0;else if(">"!==e.substring(i+s.parsed,i+s.parsed+1)){this.onError(Ls);return}this.onBeginElement(s.name,s.attributes,r);i+=s.parsed+(r?2:1)}}else{for(;i<e.length&&"<"!==e[i];)i++;const a=e.substring(t,i);this.onText(this._resolveEntities(a))}t=i}}onResolveEntity(e){return`&${e};`}onPi(e,t){}onComment(e){}onCdata(e){}onDoctype(e){}onText(e){}onBeginElement(e,t,i){}onEndElement(e){}onError(e){}}class SimpleDOMNode{constructor(e,t){this.nodeName=e;this.nodeValue=t;Object.defineProperty(this,"parentNode",{value:null,writable:!0})}get firstChild(){return this.childNodes?.[0]}get nextSibling(){const e=this.parentNode.childNodes;if(!e)return;const t=e.indexOf(this);return-1!==t?e[t+1]:void 0}get textContent(){return this.childNodes?this.childNodes.map((function(e){return e.textContent})).join(""):this.nodeValue||""}get children(){return this.childNodes||[]}hasChildNodes(){return this.childNodes?.length>0}searchNode(e,t){if(t>=e.length)return this;const i=e[t];if(i.name.startsWith("#")&&t<e.length-1)return this.searchNode(e,t+1);const a=[];let s=this;for(;;){if(i.name===s.nodeName){if(0!==i.pos){if(0===a.length)return null;{const[r]=a.pop();let n=0;for(const a of r.childNodes)if(i.name===a.nodeName){if(n===i.pos)return a.searchNode(e,t+1);n++}return s.searchNode(e,t+1)}}{const i=s.searchNode(e,t+1);if(null!==i)return i}}if(s.childNodes?.length>0){a.push([s,0]);s=s.childNodes[0]}else{if(0===a.length)return null;for(;0!==a.length;){const[e,t]=a.pop(),i=t+1;if(i<e.childNodes.length){a.push([e,i]);s=e.childNodes[i];break}}if(0===a.length)return null}}}dump(e){if("#text"!==this.nodeName){e.push(`<${this.nodeName}`);if(this.attributes)for(const t of this.attributes)e.push(` ${t.name}="${encodeToXmlString(t.value)}"`);if(this.hasChildNodes()){e.push(">");for(const t of this.childNodes)t.dump(e);e.push(`</${this.nodeName}>`)}else this.nodeValue?e.push(`>${encodeToXmlString(this.nodeValue)}</${this.nodeName}>`):e.push("/>")}else e.push(encodeToXmlString(this.nodeValue))}}class SimpleXMLParser extends XMLParserBase{constructor({hasAttributes:e=!1,lowerCaseName:t=!1}){super();this._currentFragment=null;this._stack=null;this._errorCode=Rs;this._hasAttributes=e;this._lowerCaseName=t}parseFromString(e){this._currentFragment=[];this._stack=[];this._errorCode=Rs;this.parseXml(e);if(this._errorCode!==Rs)return;const[t]=this._currentFragment;return t?{documentElement:t}:void 0}onText(e){if(function isWhitespaceString(e){for(let t=0,i=e.length;t<i;t++)if(!isWhitespace(e,t))return!1;return!0}(e))return;const t=new SimpleDOMNode("#text",e);this._currentFragment.push(t)}onCdata(e){const t=new SimpleDOMNode("#text",e);this._currentFragment.push(t)}onBeginElement(e,t,i){this._lowerCaseName&&(e=e.toLowerCase());const a=new SimpleDOMNode(e);a.childNodes=[];this._hasAttributes&&(a.attributes=t);this._currentFragment.push(a);if(!i){this._stack.push(this._currentFragment);this._currentFragment=a.childNodes}}onEndElement(e){this._currentFragment=this._stack.pop()||[];const t=this._currentFragment.at(-1);if(!t)return null;for(const e of t.childNodes)e.parentNode=t;return t}onError(e){this._errorCode=e}}class MetadataParser{constructor(e){e=this._repair(e);const t=new SimpleXMLParser({lowerCaseName:!0}).parseFromString(e);this._metadataMap=new Map;this._data=e;t&&this._parse(t)}_repair(e){return e.replace(/^[^<]+/,"").replaceAll(/>\\376\\377([^<]+)/g,(function(e,t){const i=t.replaceAll(/\\([0-3])([0-7])([0-7])/g,(function(e,t,i,a){return String.fromCharCode(64*t+8*i+1*a)})).replaceAll(/&(amp|apos|gt|lt|quot);/g,(function(e,t){switch(t){case"amp":return"&";case"apos":return"'";case"gt":return">";case"lt":return"<";case"quot":return'"'}throw new Error(`_repair: ${t} isn't defined.`)})),a=[">"];for(let e=0,t=i.length;e<t;e+=2){const t=256*i.charCodeAt(e)+i.charCodeAt(e+1);t>=32&&t<127&&60!==t&&62!==t&&38!==t?a.push(String.fromCharCode(t)):a.push("&#x"+(65536+t).toString(16).substring(1)+";")}return a.join("")}))}_getSequence(e){const t=e.nodeName;return"rdf:bag"!==t&&"rdf:seq"!==t&&"rdf:alt"!==t?null:e.childNodes.filter((e=>"rdf:li"===e.nodeName))}_parseArray(e){if(!e.hasChildNodes())return;const[t]=e.childNodes,i=this._getSequence(t)||[];this._metadataMap.set(e.nodeName,i.map((e=>e.textContent.trim())))}_parse(e){let t=e.documentElement;if("rdf:rdf"!==t.nodeName){t=t.firstChild;for(;t&&"rdf:rdf"!==t.nodeName;)t=t.nextSibling}if(t&&"rdf:rdf"===t.nodeName&&t.hasChildNodes())for(const e of t.childNodes)if("rdf:description"===e.nodeName)for(const t of e.childNodes){const e=t.nodeName;switch(e){case"#text":continue;case"dc:creator":case"dc:subject":this._parseArray(t);continue}this._metadataMap.set(e,t.textContent.trim())}}get serializable(){return{parsedData:this._metadataMap,rawData:this._data}}}class DecryptStream extends DecodeStream{constructor(e,t,i){super(t);this.str=e;this.dict=e.dict;this.decrypt=i;this.nextChunk=null;this.initialized=!1}readBlock(){let e;if(this.initialized)e=this.nextChunk;else{e=this.str.getBytes(512);this.initialized=!0}if(!e||0===e.length){this.eof=!0;return}this.nextChunk=this.str.getBytes(512);const t=this.nextChunk?.length>0;e=(0,this.decrypt)(e,!t);const i=this.bufferLength,a=i+e.length;this.ensureBuffer(a).set(e,i);this.bufferLength=a}}class ARCFourCipher{constructor(e){this.a=0;this.b=0;const t=new Uint8Array(256),i=e.length;for(let e=0;e<256;++e)t[e]=e;for(let a=0,s=0;a<256;++a){const r=t[a];s=s+r+e[a%i]&255;t[a]=t[s];t[s]=r}this.s=t}encryptBlock(e){let t=this.a,i=this.b;const a=this.s,s=e.length,r=new Uint8Array(s);for(let n=0;n<s;++n){t=t+1&255;const s=a[t];i=i+s&255;const g=a[i];a[t]=g;a[i]=s;r[n]=e[n]^a[s+g&255]}this.a=t;this.b=i;return r}decryptBlock(e){return this.encryptBlock(e)}encrypt(e){return this.encryptBlock(e)}}const Hs=function calculateMD5Closure(){const e=new Uint8Array([7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21]),t=new Int32Array([-680876936,-389564586,606105819,-1044525330,-176418897,1200080426,-1473231341,-45705983,1770035416,-1958414417,-42063,-1990404162,1804603682,-40341101,-1502002290,1236535329,-165796510,-1069501632,643717713,-373897302,-701558691,38016083,-660478335,-405537848,568446438,-1019803690,-187363961,1163531501,-1444681467,-51403784,1735328473,-1926607734,-378558,-2022574463,1839030562,-35309556,-1530992060,1272893353,-155497632,-1094730640,681279174,-358537222,-722521979,76029189,-640364487,-421815835,530742520,-995338651,-198630844,1126891415,-1416354905,-57434055,1700485571,-1894986606,-1051523,-2054922799,1873313359,-30611744,-1560198380,1309151649,-145523070,-1120210379,718787259,-343485551]);return function hash(i,a,s){let r=1732584193,n=-271733879,g=-1732584194,o=271733878;const c=s+72&-64,C=new Uint8Array(c);let h,l;for(h=0;h<s;++h)C[h]=i[a++];C[h++]=128;const Q=c-8;for(;h<Q;)C[h++]=0;C[h++]=s<<3&255;C[h++]=s>>5&255;C[h++]=s>>13&255;C[h++]=s>>21&255;C[h++]=s>>>29&255;C[h++]=0;C[h++]=0;C[h++]=0;const E=new Int32Array(16);for(h=0;h<c;){for(l=0;l<16;++l,h+=4)E[l]=C[h]|C[h+1]<<8|C[h+2]<<16|C[h+3]<<24;let i,a,s=r,c=n,Q=g,u=o;for(l=0;l<64;++l){if(l<16){i=c&Q|~c&u;a=l}else if(l<32){i=u&c|~u&Q;a=5*l+1&15}else if(l<48){i=c^Q^u;a=3*l+5&15}else{i=Q^(c|~u);a=7*l&15}const r=u,n=s+i+t[l]+E[a]|0,g=e[l];u=Q;Q=c;c=c+(n<<g|n>>>32-g)|0;s=r}r=r+s|0;n=n+c|0;g=g+Q|0;o=o+u|0}return new Uint8Array([255&r,r>>8&255,r>>16&255,r>>>24&255,255&n,n>>8&255,n>>16&255,n>>>24&255,255&g,g>>8&255,g>>16&255,g>>>24&255,255&o,o>>8&255,o>>16&255,o>>>24&255])}}();class Word64{constructor(e,t){this.high=0|e;this.low=0|t}and(e){this.high&=e.high;this.low&=e.low}xor(e){this.high^=e.high;this.low^=e.low}or(e){this.high|=e.high;this.low|=e.low}shiftRight(e){if(e>=32){this.low=this.high>>>e-32|0;this.high=0}else{this.low=this.low>>>e|this.high<<32-e;this.high=this.high>>>e|0}}shiftLeft(e){if(e>=32){this.high=this.low<<e-32;this.low=0}else{this.high=this.high<<e|this.low>>>32-e;this.low<<=e}}rotateRight(e){let t,i;if(32&e){i=this.low;t=this.high}else{t=this.low;i=this.high}e&=31;this.low=t>>>e|i<<32-e;this.high=i>>>e|t<<32-e}not(){this.high=~this.high;this.low=~this.low}add(e){const t=(this.low>>>0)+(e.low>>>0);let i=(this.high>>>0)+(e.high>>>0);t>4294967295&&(i+=1);this.low=0|t;this.high=0|i}copyTo(e,t){e[t]=this.high>>>24&255;e[t+1]=this.high>>16&255;e[t+2]=this.high>>8&255;e[t+3]=255&this.high;e[t+4]=this.low>>>24&255;e[t+5]=this.low>>16&255;e[t+6]=this.low>>8&255;e[t+7]=255&this.low}assign(e){this.high=e.high;this.low=e.low}}const Js=function calculateSHA256Closure(){function rotr(e,t){return e>>>t|e<<32-t}function ch(e,t,i){return e&t^~e&i}function maj(e,t,i){return e&t^e&i^t&i}function sigma(e){return rotr(e,2)^rotr(e,13)^rotr(e,22)}function sigmaPrime(e){return rotr(e,6)^rotr(e,11)^rotr(e,25)}function littleSigma(e){return rotr(e,7)^rotr(e,18)^e>>>3}const e=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];return function hash(t,i,a){let s=1779033703,r=3144134277,n=1013904242,g=2773480762,o=1359893119,c=2600822924,C=528734635,h=1541459225;const l=64*Math.ceil((a+9)/64),Q=new Uint8Array(l);let E,u;for(E=0;E<a;++E)Q[E]=t[i++];Q[E++]=128;const d=l-8;for(;E<d;)Q[E++]=0;Q[E++]=0;Q[E++]=0;Q[E++]=0;Q[E++]=a>>>29&255;Q[E++]=a>>21&255;Q[E++]=a>>13&255;Q[E++]=a>>5&255;Q[E++]=a<<3&255;const f=new Uint32Array(64);for(E=0;E<l;){for(u=0;u<16;++u){f[u]=Q[E]<<24|Q[E+1]<<16|Q[E+2]<<8|Q[E+3];E+=4}for(u=16;u<64;++u)f[u]=(rotr(p=f[u-2],17)^rotr(p,19)^p>>>10)+f[u-7]+littleSigma(f[u-15])+f[u-16]|0;let t,i,a=s,l=r,d=n,m=g,y=o,w=c,D=C,b=h;for(u=0;u<64;++u){t=b+sigmaPrime(y)+ch(y,w,D)+e[u]+f[u];i=sigma(a)+maj(a,l,d);b=D;D=w;w=y;y=m+t|0;m=d;d=l;l=a;a=t+i|0}s=s+a|0;r=r+l|0;n=n+d|0;g=g+m|0;o=o+y|0;c=c+w|0;C=C+D|0;h=h+b|0}var p;return new Uint8Array([s>>24&255,s>>16&255,s>>8&255,255&s,r>>24&255,r>>16&255,r>>8&255,255&r,n>>24&255,n>>16&255,n>>8&255,255&n,g>>24&255,g>>16&255,g>>8&255,255&g,o>>24&255,o>>16&255,o>>8&255,255&o,c>>24&255,c>>16&255,c>>8&255,255&c,C>>24&255,C>>16&255,C>>8&255,255&C,h>>24&255,h>>16&255,h>>8&255,255&h])}}(),Ys=function calculateSHA512Closure(){function ch(e,t,i,a,s){e.assign(t);e.and(i);s.assign(t);s.not();s.and(a);e.xor(s)}function maj(e,t,i,a,s){e.assign(t);e.and(i);s.assign(t);s.and(a);e.xor(s);s.assign(i);s.and(a);e.xor(s)}function sigma(e,t,i){e.assign(t);e.rotateRight(28);i.assign(t);i.rotateRight(34);e.xor(i);i.assign(t);i.rotateRight(39);e.xor(i)}function sigmaPrime(e,t,i){e.assign(t);e.rotateRight(14);i.assign(t);i.rotateRight(18);e.xor(i);i.assign(t);i.rotateRight(41);e.xor(i)}function littleSigma(e,t,i){e.assign(t);e.rotateRight(1);i.assign(t);i.rotateRight(8);e.xor(i);i.assign(t);i.shiftRight(7);e.xor(i)}function littleSigmaPrime(e,t,i){e.assign(t);e.rotateRight(19);i.assign(t);i.rotateRight(61);e.xor(i);i.assign(t);i.shiftRight(6);e.xor(i)}const e=[new Word64(1116352408,3609767458),new Word64(1899447441,602891725),new Word64(3049323471,3964484399),new Word64(3921009573,2173295548),new Word64(961987163,4081628472),new Word64(1508970993,3053834265),new Word64(2453635748,2937671579),new Word64(2870763221,3664609560),new Word64(3624381080,2734883394),new Word64(310598401,1164996542),new Word64(607225278,1323610764),new Word64(1426881987,3590304994),new Word64(1925078388,4068182383),new Word64(2162078206,991336113),new Word64(2614888103,633803317),new Word64(3248222580,3479774868),new Word64(3835390401,2666613458),new Word64(4022224774,944711139),new Word64(264347078,2341262773),new Word64(604807628,2007800933),new Word64(770255983,1495990901),new Word64(1249150122,1856431235),new Word64(1555081692,3175218132),new Word64(1996064986,2198950837),new Word64(2554220882,3999719339),new Word64(2821834349,766784016),new Word64(2952996808,2566594879),new Word64(3210313671,3203337956),new Word64(3336571891,1034457026),new Word64(3584528711,2466948901),new Word64(113926993,3758326383),new Word64(338241895,168717936),new Word64(666307205,1188179964),new Word64(773529912,1546045734),new Word64(1294757372,1522805485),new Word64(1396182291,2643833823),new Word64(1695183700,2343527390),new Word64(1986661051,1014477480),new Word64(2177026350,1206759142),new Word64(2456956037,344077627),new Word64(2730485921,1290863460),new Word64(2820302411,3158454273),new Word64(3259730800,3505952657),new Word64(3345764771,106217008),new Word64(3516065817,3606008344),new Word64(3600352804,1432725776),new Word64(4094571909,1467031594),new Word64(275423344,851169720),new Word64(430227734,3100823752),new Word64(506948616,1363258195),new Word64(659060556,3750685593),new Word64(883997877,3785050280),new Word64(958139571,3318307427),new Word64(1322822218,3812723403),new Word64(1537002063,2003034995),new Word64(1747873779,3602036899),new Word64(1955562222,1575990012),new Word64(2024104815,1125592928),new Word64(2227730452,2716904306),new Word64(2361852424,442776044),new Word64(2428436474,593698344),new Word64(2756734187,3733110249),new Word64(3204031479,2999351573),new Word64(3329325298,3815920427),new Word64(3391569614,3928383900),new Word64(3515267271,566280711),new Word64(3940187606,3454069534),new Word64(4118630271,4000239992),new Word64(116418474,1914138554),new Word64(174292421,2731055270),new Word64(289380356,3203993006),new Word64(460393269,320620315),new Word64(685471733,587496836),new Word64(852142971,1086792851),new Word64(1017036298,365543100),new Word64(1126000580,2618297676),new Word64(1288033470,3409855158),new Word64(1501505948,4234509866),new Word64(1607167915,987167468),new Word64(1816402316,1246189591)];return function hash(t,i,a,s=!1){let r,n,g,o,c,C,h,l;if(s){r=new Word64(3418070365,3238371032);n=new Word64(1654270250,914150663);g=new Word64(2438529370,812702999);o=new Word64(355462360,4144912697);c=new Word64(1731405415,4290775857);C=new Word64(2394180231,1750603025);h=new Word64(3675008525,1694076839);l=new Word64(1203062813,3204075428)}else{r=new Word64(1779033703,4089235720);n=new Word64(3144134277,2227873595);g=new Word64(1013904242,4271175723);o=new Word64(2773480762,1595750129);c=new Word64(1359893119,2917565137);C=new Word64(2600822924,725511199);h=new Word64(528734635,4215389547);l=new Word64(1541459225,327033209)}const Q=128*Math.ceil((a+17)/128),E=new Uint8Array(Q);let u,d;for(u=0;u<a;++u)E[u]=t[i++];E[u++]=128;const f=Q-16;for(;u<f;)E[u++]=0;E[u++]=0;E[u++]=0;E[u++]=0;E[u++]=0;E[u++]=0;E[u++]=0;E[u++]=0;E[u++]=0;E[u++]=0;E[u++]=0;E[u++]=0;E[u++]=a>>>29&255;E[u++]=a>>21&255;E[u++]=a>>13&255;E[u++]=a>>5&255;E[u++]=a<<3&255;const p=new Array(80);for(u=0;u<80;u++)p[u]=new Word64(0,0);let m=new Word64(0,0),y=new Word64(0,0),w=new Word64(0,0),D=new Word64(0,0),b=new Word64(0,0),F=new Word64(0,0),S=new Word64(0,0),k=new Word64(0,0);const R=new Word64(0,0),N=new Word64(0,0),G=new Word64(0,0),x=new Word64(0,0);let U,M;for(u=0;u<Q;){for(d=0;d<16;++d){p[d].high=E[u]<<24|E[u+1]<<16|E[u+2]<<8|E[u+3];p[d].low=E[u+4]<<24|E[u+5]<<16|E[u+6]<<8|E[u+7];u+=8}for(d=16;d<80;++d){U=p[d];littleSigmaPrime(U,p[d-2],x);U.add(p[d-7]);littleSigma(G,p[d-15],x);U.add(G);U.add(p[d-16])}m.assign(r);y.assign(n);w.assign(g);D.assign(o);b.assign(c);F.assign(C);S.assign(h);k.assign(l);for(d=0;d<80;++d){R.assign(k);sigmaPrime(G,b,x);R.add(G);ch(G,b,F,S,x);R.add(G);R.add(e[d]);R.add(p[d]);sigma(N,m,x);maj(G,m,y,w,x);N.add(G);U=k;k=S;S=F;F=b;D.add(R);b=D;D=w;w=y;y=m;U.assign(R);U.add(N);m=U}r.add(m);n.add(y);g.add(w);o.add(D);c.add(b);C.add(F);h.add(S);l.add(k)}if(s){M=new Uint8Array(48);r.copyTo(M,0);n.copyTo(M,8);g.copyTo(M,16);o.copyTo(M,24);c.copyTo(M,32);C.copyTo(M,40)}else{M=new Uint8Array(64);r.copyTo(M,0);n.copyTo(M,8);g.copyTo(M,16);o.copyTo(M,24);c.copyTo(M,32);C.copyTo(M,40);h.copyTo(M,48);l.copyTo(M,56)}return M}}();class NullCipher{decryptBlock(e){return e}encrypt(e){return e}}class AESBaseCipher{constructor(){this.constructor===AESBaseCipher&&unreachable("Cannot initialize AESBaseCipher.");this._s=new Uint8Array([99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22]);this._inv_s=new Uint8Array([82,9,106,213,48,54,165,56,191,64,163,158,129,243,215,251,124,227,57,130,155,47,255,135,52,142,67,68,196,222,233,203,84,123,148,50,166,194,35,61,238,76,149,11,66,250,195,78,8,46,161,102,40,217,36,178,118,91,162,73,109,139,209,37,114,248,246,100,134,104,152,22,212,164,92,204,93,101,182,146,108,112,72,80,253,237,185,218,94,21,70,87,167,141,157,132,144,216,171,0,140,188,211,10,247,228,88,5,184,179,69,6,208,44,30,143,202,63,15,2,193,175,189,3,1,19,138,107,58,145,17,65,79,103,220,234,151,242,207,206,240,180,230,115,150,172,116,34,231,173,53,133,226,249,55,232,28,117,223,110,71,241,26,113,29,41,197,137,111,183,98,14,170,24,190,27,252,86,62,75,198,210,121,32,154,219,192,254,120,205,90,244,31,221,168,51,136,7,199,49,177,18,16,89,39,128,236,95,96,81,127,169,25,181,74,13,45,229,122,159,147,201,156,239,160,224,59,77,174,42,245,176,200,235,187,60,131,83,153,97,23,43,4,126,186,119,214,38,225,105,20,99,85,33,12,125]);this._mix=new Uint32Array([0,235474187,470948374,303765277,941896748,908933415,607530554,708780849,1883793496,2118214995,1817866830,1649639237,1215061108,1181045119,1417561698,1517767529,3767586992,4003061179,4236429990,4069246893,3635733660,3602770327,3299278474,3400528769,2430122216,2664543715,2362090238,2193862645,2835123396,2801107407,3035535058,3135740889,3678124923,3576870512,3341394285,3374361702,3810496343,3977675356,4279080257,4043610186,2876494627,2776292904,3076639029,3110650942,2472011535,2640243204,2403728665,2169303058,1001089995,899835584,666464733,699432150,59727847,226906860,530400753,294930682,1273168787,1172967064,1475418501,1509430414,1942435775,2110667444,1876241833,1641816226,2910219766,2743034109,2976151520,3211623147,2505202138,2606453969,2302690252,2269728455,3711829422,3543599269,3240894392,3475313331,3843699074,3943906441,4178062228,4144047775,1306967366,1139781709,1374988112,1610459739,1975683434,2076935265,1775276924,1742315127,1034867998,866637845,566021896,800440835,92987698,193195065,429456164,395441711,1984812685,2017778566,1784663195,1683407248,1315562145,1080094634,1383856311,1551037884,101039829,135050206,437757123,337553864,1042385657,807962610,573804783,742039012,2531067453,2564033334,2328828971,2227573024,2935566865,2700099354,3001755655,3168937228,3868552805,3902563182,4203181171,4102977912,3736164937,3501741890,3265478751,3433712980,1106041591,1340463100,1576976609,1408749034,2043211483,2009195472,1708848333,1809054150,832877231,1068351396,766945465,599762354,159417987,126454664,361929877,463180190,2709260871,2943682380,3178106961,3009879386,2572697195,2538681184,2236228733,2336434550,3509871135,3745345300,3441850377,3274667266,3910161971,3877198648,4110568485,4211818798,2597806476,2497604743,2261089178,2295101073,2733856160,2902087851,3202437046,2968011453,3936291284,3835036895,4136440770,4169408201,3535486456,3702665459,3467192302,3231722213,2051518780,1951317047,1716890410,1750902305,1113818384,1282050075,1584504582,1350078989,168810852,67556463,371049330,404016761,841739592,1008918595,775550814,540080725,3969562369,3801332234,4035489047,4269907996,3569255213,3669462566,3366754619,3332740144,2631065433,2463879762,2160117071,2395588676,2767645557,2868897406,3102011747,3069049960,202008497,33778362,270040487,504459436,875451293,975658646,675039627,641025152,2084704233,1917518562,1615861247,1851332852,1147550661,1248802510,1484005843,1451044056,933301370,967311729,733156972,632953703,260388950,25965917,328671808,496906059,1206477858,1239443753,1543208500,1441952575,2144161806,1908694277,1675577880,1842759443,3610369226,3644379585,3408119516,3307916247,4011190502,3776767469,4077384432,4245618683,2809771154,2842737049,3144396420,3043140495,2673705150,2438237621,2203032232,2370213795]);this._mixCol=new Uint8Array(256);for(let e=0;e<256;e++)this._mixCol[e]=e<128?e<<1:e<<1^27;this.buffer=new Uint8Array(16);this.bufferPosition=0}_expandKey(e){unreachable("Cannot call `_expandKey` on the base class")}_decrypt(e,t){let i,a,s;const r=new Uint8Array(16);r.set(e);for(let e=0,i=this._keySize;e<16;++e,++i)r[e]^=t[i];for(let e=this._cyclesOfRepetition-1;e>=1;--e){i=r[13];r[13]=r[9];r[9]=r[5];r[5]=r[1];r[1]=i;i=r[14];a=r[10];r[14]=r[6];r[10]=r[2];r[6]=i;r[2]=a;i=r[15];a=r[11];s=r[7];r[15]=r[3];r[11]=i;r[7]=a;r[3]=s;for(let e=0;e<16;++e)r[e]=this._inv_s[r[e]];for(let i=0,a=16*e;i<16;++i,++a)r[i]^=t[a];for(let e=0;e<16;e+=4){const t=this._mix[r[e]],a=this._mix[r[e+1]],s=this._mix[r[e+2]],n=this._mix[r[e+3]];i=t^a>>>8^a<<24^s>>>16^s<<16^n>>>24^n<<8;r[e]=i>>>24&255;r[e+1]=i>>16&255;r[e+2]=i>>8&255;r[e+3]=255&i}}i=r[13];r[13]=r[9];r[9]=r[5];r[5]=r[1];r[1]=i;i=r[14];a=r[10];r[14]=r[6];r[10]=r[2];r[6]=i;r[2]=a;i=r[15];a=r[11];s=r[7];r[15]=r[3];r[11]=i;r[7]=a;r[3]=s;for(let e=0;e<16;++e){r[e]=this._inv_s[r[e]];r[e]^=t[e]}return r}_encrypt(e,t){const i=this._s;let a,s,r;const n=new Uint8Array(16);n.set(e);for(let e=0;e<16;++e)n[e]^=t[e];for(let e=1;e<this._cyclesOfRepetition;e++){for(let e=0;e<16;++e)n[e]=i[n[e]];r=n[1];n[1]=n[5];n[5]=n[9];n[9]=n[13];n[13]=r;r=n[2];s=n[6];n[2]=n[10];n[6]=n[14];n[10]=r;n[14]=s;r=n[3];s=n[7];a=n[11];n[3]=n[15];n[7]=r;n[11]=s;n[15]=a;for(let e=0;e<16;e+=4){const t=n[e+0],i=n[e+1],s=n[e+2],r=n[e+3];a=t^i^s^r;n[e+0]^=a^this._mixCol[t^i];n[e+1]^=a^this._mixCol[i^s];n[e+2]^=a^this._mixCol[s^r];n[e+3]^=a^this._mixCol[r^t]}for(let i=0,a=16*e;i<16;++i,++a)n[i]^=t[a]}for(let e=0;e<16;++e)n[e]=i[n[e]];r=n[1];n[1]=n[5];n[5]=n[9];n[9]=n[13];n[13]=r;r=n[2];s=n[6];n[2]=n[10];n[6]=n[14];n[10]=r;n[14]=s;r=n[3];s=n[7];a=n[11];n[3]=n[15];n[7]=r;n[11]=s;n[15]=a;for(let e=0,i=this._keySize;e<16;++e,++i)n[e]^=t[i];return n}_decryptBlock2(e,t){const i=e.length;let a=this.buffer,s=this.bufferPosition;const r=[];let n=this.iv;for(let t=0;t<i;++t){a[s]=e[t];++s;if(s<16)continue;const i=this._decrypt(a,this._key);for(let e=0;e<16;++e)i[e]^=n[e];n=a;r.push(i);a=new Uint8Array(16);s=0}this.buffer=a;this.bufferLength=s;this.iv=n;if(0===r.length)return new Uint8Array(0);let g=16*r.length;if(t){const e=r.at(-1);let t=e[15];if(t<=16){for(let i=15,a=16-t;i>=a;--i)if(e[i]!==t){t=0;break}g-=t;r[r.length-1]=e.subarray(0,16-t)}}const o=new Uint8Array(g);for(let e=0,t=0,i=r.length;e<i;++e,t+=16)o.set(r[e],t);return o}decryptBlock(e,t,i=null){const a=e.length,s=this.buffer;let r=this.bufferPosition;if(i)this.iv=i;else{for(let t=0;r<16&&t<a;++t,++r)s[r]=e[t];if(r<16){this.bufferLength=r;return new Uint8Array(0)}this.iv=s;e=e.subarray(16)}this.buffer=new Uint8Array(16);this.bufferLength=0;this.decryptBlock=this._decryptBlock2;return this.decryptBlock(e,t)}encrypt(e,t){const i=e.length;let a=this.buffer,s=this.bufferPosition;const r=[];t||(t=new Uint8Array(16));for(let n=0;n<i;++n){a[s]=e[n];++s;if(s<16)continue;for(let e=0;e<16;++e)a[e]^=t[e];const i=this._encrypt(a,this._key);t=i;r.push(i);a=new Uint8Array(16);s=0}this.buffer=a;this.bufferLength=s;this.iv=t;if(0===r.length)return new Uint8Array(0);const n=16*r.length,g=new Uint8Array(n);for(let e=0,t=0,i=r.length;e<i;++e,t+=16)g.set(r[e],t);return g}}class AES128Cipher extends AESBaseCipher{constructor(e){super();this._cyclesOfRepetition=10;this._keySize=160;this._rcon=new Uint8Array([141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141]);this._key=this._expandKey(e)}_expandKey(e){const t=this._s,i=this._rcon,a=new Uint8Array(176);a.set(e);for(let e=16,s=1;e<176;++s){let r=a[e-3],n=a[e-2],g=a[e-1],o=a[e-4];r=t[r];n=t[n];g=t[g];o=t[o];r^=i[s];for(let t=0;t<4;++t){a[e]=r^=a[e-16];e++;a[e]=n^=a[e-16];e++;a[e]=g^=a[e-16];e++;a[e]=o^=a[e-16];e++}}return a}}class AES256Cipher extends AESBaseCipher{constructor(e){super();this._cyclesOfRepetition=14;this._keySize=224;this._key=this._expandKey(e)}_expandKey(e){const t=this._s,i=new Uint8Array(240);i.set(e);let a,s,r,n,g=1;for(let e=32,o=1;e<240;++o){if(e%32==16){a=t[a];s=t[s];r=t[r];n=t[n]}else if(e%32==0){a=i[e-3];s=i[e-2];r=i[e-1];n=i[e-4];a=t[a];s=t[s];r=t[r];n=t[n];a^=g;(g<<=1)>=256&&(g=255&(27^g))}for(let t=0;t<4;++t){i[e]=a^=i[e-32];e++;i[e]=s^=i[e-32];e++;i[e]=r^=i[e-32];e++;i[e]=n^=i[e-32];e++}}return i}}class PDF17{checkOwnerPassword(e,t,i,a){const s=new Uint8Array(e.length+56);s.set(e,0);s.set(t,e.length);s.set(i,e.length+t.length);return isArrayEqual(Js(s,0,s.length),a)}checkUserPassword(e,t,i){const a=new Uint8Array(e.length+8);a.set(e,0);a.set(t,e.length);return isArrayEqual(Js(a,0,a.length),i)}getOwnerKey(e,t,i,a){const s=new Uint8Array(e.length+56);s.set(e,0);s.set(t,e.length);s.set(i,e.length+t.length);const r=Js(s,0,s.length);return new AES256Cipher(r).decryptBlock(a,!1,new Uint8Array(16))}getUserKey(e,t,i){const a=new Uint8Array(e.length+8);a.set(e,0);a.set(t,e.length);const s=Js(a,0,a.length);return new AES256Cipher(s).decryptBlock(i,!1,new Uint8Array(16))}}class PDF20{_hash(e,t,i){let a=Js(t,0,t.length).subarray(0,32),s=[0],r=0;for(;r<64||s.at(-1)>r-32;){const t=e.length+a.length+i.length,c=new Uint8Array(t);let C=0;c.set(e,C);C+=e.length;c.set(a,C);C+=a.length;c.set(i,C);const h=new Uint8Array(64*t);for(let e=0,i=0;e<64;e++,i+=t)h.set(c,i);s=new AES128Cipher(a.subarray(0,16)).encrypt(h,a.subarray(16,32));const l=s.slice(0,16).reduce(((e,t)=>e+t),0)%3;0===l?a=Js(s,0,s.length):1===l?a=(n=s,g=0,o=s.length,Ys(n,g,o,!0)):2===l&&(a=Ys(s,0,s.length));r++}var n,g,o;return a.subarray(0,32)}checkOwnerPassword(e,t,i,a){const s=new Uint8Array(e.length+56);s.set(e,0);s.set(t,e.length);s.set(i,e.length+t.length);return isArrayEqual(this._hash(e,s,i),a)}checkUserPassword(e,t,i){const a=new Uint8Array(e.length+8);a.set(e,0);a.set(t,e.length);return isArrayEqual(this._hash(e,a,[]),i)}getOwnerKey(e,t,i,a){const s=new Uint8Array(e.length+56);s.set(e,0);s.set(t,e.length);s.set(i,e.length+t.length);const r=this._hash(e,s,i);return new AES256Cipher(r).decryptBlock(a,!1,new Uint8Array(16))}getUserKey(e,t,i){const a=new Uint8Array(e.length+8);a.set(e,0);a.set(t,e.length);const s=this._hash(e,a,[]);return new AES256Cipher(s).decryptBlock(i,!1,new Uint8Array(16))}}class CipherTransform{constructor(e,t){this.StringCipherConstructor=e;this.StreamCipherConstructor=t}createStream(e,t){const i=new this.StreamCipherConstructor;return new DecryptStream(e,t,(function cipherTransformDecryptStream(e,t){return i.decryptBlock(e,t)}))}decryptString(e){const t=new this.StringCipherConstructor;let i=stringToBytes(e);i=t.decryptBlock(i,!0);return bytesToString(i)}encryptString(e){const t=new this.StringCipherConstructor;if(t instanceof AESBaseCipher){const i=16-e.length%16;e+=String.fromCharCode(i).repeat(i);const a=new Uint8Array(16);if("undefined"!=typeof crypto)crypto.getRandomValues(a);else for(let e=0;e<16;e++)a[e]=Math.floor(256*Math.random());let s=stringToBytes(e);s=t.encrypt(s,a);const r=new Uint8Array(16+s.length);r.set(a);r.set(s,16);return bytesToString(r)}let i=stringToBytes(e);i=t.encrypt(i);return bytesToString(i)}}class CipherTransformFactory{static#k=new Uint8Array([40,191,78,94,78,117,138,65,100,0,78,86,255,250,1,8,46,46,0,182,208,104,62,128,47,12,169,254,100,83,105,122]);#R(e,t,i,a,s,r,n,g,o,c,C,h){if(t){const e=Math.min(127,t.length);t=t.subarray(0,e)}else t=[];const l=6===e?new PDF20:new PDF17;return l.checkUserPassword(t,g,n)?l.getUserKey(t,o,C):t.length&&l.checkOwnerPassword(t,a,r,i)?l.getOwnerKey(t,s,r,c):null}#N(e,t,i,a,s,r,n,g){const o=40+i.length+e.length,c=new Uint8Array(o);let C,h,l=0;if(t){h=Math.min(32,t.length);for(;l<h;++l)c[l]=t[l]}C=0;for(;l<32;)c[l++]=CipherTransformFactory.#k[C++];for(C=0,h=i.length;C<h;++C)c[l++]=i[C];c[l++]=255&s;c[l++]=s>>8&255;c[l++]=s>>16&255;c[l++]=s>>>24&255;for(C=0,h=e.length;C<h;++C)c[l++]=e[C];if(r>=4&&!g){c[l++]=255;c[l++]=255;c[l++]=255;c[l++]=255}let Q=Hs(c,0,l);const E=n>>3;if(r>=3)for(C=0;C<50;++C)Q=Hs(Q,0,E);const u=Q.subarray(0,E);let d,f;if(r>=3){for(l=0;l<32;++l)c[l]=CipherTransformFactory.#k[l];for(C=0,h=e.length;C<h;++C)c[l++]=e[C];d=new ARCFourCipher(u);f=d.encryptBlock(Hs(c,0,l));h=u.length;const t=new Uint8Array(h);for(C=1;C<=19;++C){for(let e=0;e<h;++e)t[e]=u[e]^C;d=new ARCFourCipher(t);f=d.encryptBlock(f)}for(C=0,h=f.length;C<h;++C)if(a[C]!==f[C])return null}else{d=new ARCFourCipher(u);f=d.encryptBlock(CipherTransformFactory.#k);for(C=0,h=f.length;C<h;++C)if(a[C]!==f[C])return null}return u}#G(e,t,i,a){const s=new Uint8Array(32);let r=0;const n=Math.min(32,e.length);for(;r<n;++r)s[r]=e[r];let g=0;for(;r<32;)s[r++]=CipherTransformFactory.#k[g++];let o=Hs(s,0,r);const c=a>>3;if(i>=3)for(g=0;g<50;++g)o=Hs(o,0,o.length);let C,h;if(i>=3){h=t;const e=new Uint8Array(c);for(g=19;g>=0;g--){for(let t=0;t<c;++t)e[t]=o[t]^g;C=new ARCFourCipher(e);h=C.encryptBlock(h)}}else{C=new ARCFourCipher(o.subarray(0,c));h=C.encryptBlock(t)}return h}#x(e,t,i,a=!1){const s=new Uint8Array(i.length+9),r=i.length;let n;for(n=0;n<r;++n)s[n]=i[n];s[n++]=255&e;s[n++]=e>>8&255;s[n++]=e>>16&255;s[n++]=255&t;s[n++]=t>>8&255;if(a){s[n++]=115;s[n++]=65;s[n++]=108;s[n++]=84}return Hs(s,0,n).subarray(0,Math.min(i.length+5,16))}#U(e,t,i,a,s){if(!(t instanceof Name))throw new FormatError("Invalid crypt filter name.");const r=this,n=e.get(t.name),g=n?.get("CFM");if(!g||"None"===g.name)return function(){return new NullCipher};if("V2"===g.name)return function(){return new ARCFourCipher(r.#x(i,a,s,!1))};if("AESV2"===g.name)return function(){return new AES128Cipher(r.#x(i,a,s,!0))};if("AESV3"===g.name)return function(){return new AES256Cipher(s)};throw new FormatError("Unknown crypto method")}constructor(e,t,i){const a=e.get("Filter");if(!isName(a,"Standard"))throw new FormatError("unknown encryption method");this.filterName=a.name;this.dict=e;const s=e.get("V");if(!Number.isInteger(s)||1!==s&&2!==s&&4!==s&&5!==s)throw new FormatError("unsupported encryption algorithm");this.algorithm=s;let r=e.get("Length");if(!r)if(s<=3)r=40;else{const t=e.get("CF"),i=e.get("StmF");if(t instanceof Dict&&i instanceof Name){t.suppressEncryption=!0;const e=t.get(i.name);r=e?.get("Length")||128;r<40&&(r<<=3)}}if(!Number.isInteger(r)||r<40||r%8!=0)throw new FormatError("invalid key length");const n=stringToBytes(e.get("O")),g=stringToBytes(e.get("U")),o=n.subarray(0,32),c=g.subarray(0,32),C=e.get("P"),h=e.get("R"),l=(4===s||5===s)&&!1!==e.get("EncryptMetadata");this.encryptMetadata=l;const Q=stringToBytes(t);let E,u;if(i){if(6===h)try{i=utf8StringToString(i)}catch{warn("CipherTransformFactory: Unable to convert UTF8 encoded password.")}E=stringToBytes(i)}if(5!==s)u=this.#N(Q,E,o,c,C,h,r,l);else{const t=n.subarray(32,40),i=n.subarray(40,48),a=g.subarray(0,48),s=g.subarray(32,40),r=g.subarray(40,48),C=stringToBytes(e.get("OE")),l=stringToBytes(e.get("UE")),Q=stringToBytes(e.get("Perms"));u=this.#R(h,E,o,t,i,a,c,s,r,C,l,Q)}if(!u&&!i)throw new PasswordException("No password given",it);if(!u&&i){const e=this.#G(E,o,h,r);u=this.#N(Q,e,o,c,C,h,r,l)}if(!u)throw new PasswordException("Incorrect Password",at);this.encryptionKey=u;if(s>=4){const t=e.get("CF");t instanceof Dict&&(t.suppressEncryption=!0);this.cf=t;this.stmf=e.get("StmF")||Name.get("Identity");this.strf=e.get("StrF")||Name.get("Identity");this.eff=e.get("EFF")||this.stmf}}createCipherTransform(e,t){if(4===this.algorithm||5===this.algorithm)return new CipherTransform(this.#U(this.cf,this.strf,e,t,this.encryptionKey),this.#U(this.cf,this.stmf,e,t,this.encryptionKey));const i=this.#x(e,t,this.encryptionKey,!1),cipherConstructor=function(){return new ARCFourCipher(i)};return new CipherTransform(cipherConstructor,cipherConstructor)}}async function writeObject(e,t,i,{encrypt:a=null}){const s=a?.createCipherTransform(e.num,e.gen);i.push(`${e.num} ${e.gen} obj\n`);t instanceof Dict?await writeDict(t,i,s):t instanceof BaseStream?await writeStream(t,i,s):(Array.isArray(t)||ArrayBuffer.isView(t))&&await writeArray(t,i,s);i.push("\nendobj\n")}async function writeDict(e,t,i){t.push("<<");for(const a of e.getKeys()){t.push(` /${escapePDFName(a)} `);await writeValue(e.getRaw(a),t,i)}t.push(">>")}async function writeStream(e,t,i){let a=e.getBytes();const{dict:s}=e,[r,n]=await Promise.all([s.getAsync("Filter"),s.getAsync("DecodeParms")]),g=isName(Array.isArray(r)?await s.xref.fetchIfRefAsync(r[0]):r,"FlateDecode");if(a.length>=256||g)try{const e=new CompressionStream("deflate"),t=e.writable.getWriter();t.write(a);t.close();const i=await new Response(e.readable).arrayBuffer();a=new Uint8Array(i);let o,c;if(r){if(!g){o=Array.isArray(r)?[Name.get("FlateDecode"),...r]:[Name.get("FlateDecode"),r];n&&(c=Array.isArray(n)?[null,...n]:[null,n])}}else o=Name.get("FlateDecode");o&&s.set("Filter",o);c&&s.set("DecodeParms",c)}catch(e){info(`writeStream - cannot compress data: "${e}".`)}let o=bytesToString(a);i&&(o=i.encryptString(o));s.set("Length",o.length);await writeDict(s,t,i);t.push(" stream\n",o,"\nendstream")}async function writeArray(e,t,i){t.push("[");let a=!0;for(const s of e){a?a=!1:t.push(" ");await writeValue(s,t,i)}t.push("]")}async function writeValue(e,t,i){if(e instanceof Name)t.push(`/${escapePDFName(e.name)}`);else if(e instanceof Ref)t.push(`${e.num} ${e.gen} R`);else if(Array.isArray(e)||ArrayBuffer.isView(e))await writeArray(e,t,i);else if("string"==typeof e){i&&(e=i.encryptString(e));t.push(`(${escapeString(e)})`)}else"number"==typeof e?t.push(numberToString(e)):"boolean"==typeof e?t.push(e.toString()):e instanceof Dict?await writeDict(e,t,i):e instanceof BaseStream?await writeStream(e,t,i):null===e?t.push("null"):warn(`Unhandled value in writer: ${typeof e}, please file a bug.`)}function writeInt(e,t,i,a){for(let s=t+i-1;s>i-1;s--){a[s]=255&e;e>>=8}return i+t}function writeString(e,t,i){for(let a=0,s=e.length;a<s;a++)i[t+a]=255&e.charCodeAt(a)}function updateXFA({xfaData:e,xfaDatasetsRef:t,newRefs:i,xref:a}){if(null===e){e=function writeXFADataForAcroform(e,t){const i=new SimpleXMLParser({hasAttributes:!0}).parseFromString(e);for(const{xfa:e}of t){if(!e)continue;const{path:t,value:a}=e;if(!t)continue;const s=parseXFAPath(t);let r=i.documentElement.searchNode(s,0);!r&&s.length>1&&(r=i.documentElement.searchNode([s.at(-1)],0));r?r.childNodes=Array.isArray(a)?a.map((e=>new SimpleDOMNode("value",e))):[new SimpleDOMNode("#text",a)]:warn(`Node not found for path: ${t}`)}const a=[];i.documentElement.dump(a);return a.join("")}(a.fetchIfRef(t).getString(),i)}const s=a.encrypt;if(s){e=s.createCipherTransform(t.num,t.gen).encryptString(e)}const r=`${t.num} ${t.gen} obj\n<< /Type /EmbeddedFile /Length ${e.length}>>\nstream\n`+e+"\nendstream\nendobj\n";i.push({ref:t,data:r})}function getIndexes(e){const t=[];for(const{ref:i}of e)i.num===t.at(-2)+t.at(-1)?t[t.length-1]+=1:t.push(i.num,1);return t}function computeIDs(e,t,i){if(Array.isArray(t.fileIds)&&t.fileIds.length>0){const a=function computeMD5(e,t){const i=Math.floor(Date.now()/1e3),a=t.filename||"",s=[i.toString(),a,e.toString()];let r=s.reduce(((e,t)=>e+t.length),0);for(const e of Object.values(t.info)){s.push(e);r+=e.length}const n=new Uint8Array(r);let g=0;for(const e of s){writeString(e,g,n);g+=e.length}return bytesToString(Hs(n))}(e,t);i.set("ID",[t.fileIds[0],a])}}async function incrementalUpdate({originalData:e,xrefInfo:t,newRefs:i,xref:a=null,hasXfa:s=!1,xfaDatasetsRef:r=null,hasXfaDatasetsEntry:n=!1,needAppearances:g,acroFormRef:o=null,acroForm:c=null,xfaData:C=null,useXrefStream:h=!1}){await async function updateAcroform({xref:e,acroForm:t,acroFormRef:i,hasXfa:a,hasXfaDatasetsEntry:s,xfaDatasetsRef:r,needAppearances:n,newRefs:g}){!a||s||r||warn("XFA - Cannot save it");if(!n&&(!a||!r||s))return;const o=t.clone();if(a&&!s){const e=t.get("XFA").slice();e.splice(2,0,"datasets");e.splice(3,0,r);o.set("XFA",e)}n&&o.set("NeedAppearances",!0);const c=[];await writeObject(i,o,c,e);g.push({ref:i,data:c.join("")})}({xref:a,acroForm:c,acroFormRef:o,hasXfa:s,hasXfaDatasetsEntry:n,xfaDatasetsRef:r,needAppearances:g,newRefs:i});s&&updateXFA({xfaData:C,xfaDatasetsRef:r,newRefs:i,xref:a});const l=[];let Q=e.length;const E=e.at(-1);if(10!==E&&13!==E){l.push("\n");Q+=1}const u=function getTrailerDict(e,t,i){const a=new Dict(null);a.set("Prev",e.startXRef);const s=e.newRef;if(i){t.push({ref:s,data:""});a.set("Size",s.num+1);a.set("Type",Name.get("XRef"))}else a.set("Size",s.num);null!==e.rootRef&&a.set("Root",e.rootRef);null!==e.infoRef&&a.set("Info",e.infoRef);null!==e.encryptRef&&a.set("Encrypt",e.encryptRef);return a}(t,i,h);i=i.sort(((e,t)=>e.ref.num-t.ref.num));for(const{data:e}of i)null!==e&&l.push(e);await(h?async function getXRefStreamTable(e,t,i,a,s){const r=[];let n=0,g=0;for(const{ref:e,data:a}of i){let i;n=Math.max(n,t);if(null!==a){i=Math.min(e.gen,65535);r.push([1,t,i]);t+=a.length}else{i=Math.min(e.gen+1,65535);r.push([0,0,i])}g=Math.max(g,i)}a.set("Index",getIndexes(i));const o=[1,getSizeInBytes(n),getSizeInBytes(g)];a.set("W",o);computeIDs(t,e,a);const c=o.reduce(((e,t)=>e+t),0),C=new Uint8Array(c*r.length),h=new Stream(C);h.dict=a;let l=0;for(const[e,t,i]of r){l=writeInt(e,o[0],l,C);l=writeInt(t,o[1],l,C);l=writeInt(i,o[2],l,C)}await writeObject(e.newRef,h,s,{});s.push("startxref\n",t.toString(),"\n%%EOF\n")}(t,Q,i,u,l):async function getXRefTable(e,t,i,a,s){s.push("xref\n");const r=getIndexes(i);let n=0;for(const{ref:e,data:a}of i){if(e.num===r[n]){s.push(`${r[n]} ${r[n+1]}\n`);n+=2}if(null!==a){s.push(`${t.toString().padStart(10,"0")} ${Math.min(e.gen,65535).toString().padStart(5,"0")} n\r\n`);t+=a.length}else s.push(`0000000000 ${Math.min(e.gen+1,65535).toString().padStart(5,"0")} f\r\n`)}computeIDs(t,e,a);s.push("trailer\n");await writeDict(a,s);s.push("\nstartxref\n",t.toString(),"\n%%EOF\n")}(t,Q,i,u,l));const d=l.reduce(((e,t)=>e+t.length),e.length),f=new Uint8Array(d);f.set(e);let p=e.length;for(const e of l){writeString(e,p,f);p+=e.length}return f}const vs=1,Ks=2,Ts=3,qs=4,Os=5;class StructTreeRoot{constructor(e,t){this.dict=e;this.ref=t instanceof Ref?t:null;this.roleMap=new Map;this.structParentIds=null}init(){this.readRoleMap()}#M(e,t,i){if(!(e instanceof Ref)||t<0)return;this.structParentIds||=new RefSetCache;let a=this.structParentIds.get(e);if(!a){a=[];this.structParentIds.put(e,a)}a.push([t,i])}addAnnotationIdToPage(e,t){this.#M(e,t,qs)}readRoleMap(){const e=this.dict.get("RoleMap");e instanceof Dict&&e.forEach(((e,t)=>{t instanceof Name&&this.roleMap.set(e,t.name)}))}static async canCreateStructureTree({catalogRef:e,pdfManager:t,newAnnotationsByPage:i}){if(!(e instanceof Ref)){warn("Cannot save the struct tree: no catalog reference.");return!1}let a=0,s=!0;for(const[e,r]of i){const{ref:i}=await t.getPage(e);if(!(i instanceof Ref)){warn(`Cannot save the struct tree: page ${e} has no ref.`);s=!0;break}for(const e of r)if(e.accessibilityData?.type){e.parentTreeId=a++;s=!1}}if(s){for(const e of i.values())for(const t of e)delete t.parentTreeId;return!1}return!0}static async createStructureTree({newAnnotationsByPage:e,xref:t,catalogRef:i,pdfManager:a,newRefs:s}){const r=a.catalog.cloneDict(),n=new RefSetCache;n.put(i,r);const g=t.getNewTemporaryRef();r.set("StructTreeRoot",g);const o=new Dict(t);o.set("Type",Name.get("StructTreeRoot"));const c=t.getNewTemporaryRef();o.set("ParentTree",c);const C=[];o.set("K",C);n.put(g,o);const h=new Dict(t),l=[];h.set("Nums",l);const Q=await this.#L({newAnnotationsByPage:e,structTreeRootRef:g,kids:C,nums:l,xref:t,pdfManager:a,cache:n});o.set("ParentTreeNextKey",Q);n.put(c,h);const E=[];for(const[e,i]of n.items()){E.length=0;await writeObject(e,i,E,t);s.push({ref:e,data:E.join("")})}}async canUpdateStructTree({pdfManager:e,xref:t,newAnnotationsByPage:i}){if(!this.ref){warn("Cannot update the struct tree: no root reference.");return!1}let a=this.dict.get("ParentTreeNextKey");if(!Number.isInteger(a)||a<0){warn("Cannot update the struct tree: invalid next key.");return!1}const s=this.dict.get("ParentTree");if(!(s instanceof Dict)){warn("Cannot update the struct tree: ParentTree isn't a dict.");return!1}const r=s.get("Nums");if(!Array.isArray(r)){warn("Cannot update the struct tree: nums isn't an array.");return!1}const n=new NumberTree(s,t);for(const t of i.keys()){const{pageDict:i}=await e.getPage(t);if(!i.has("StructParents"))continue;const a=i.get("StructParents");if(!Number.isInteger(a)||!Array.isArray(n.get(a))){warn(`Cannot save the struct tree: page ${t} has a wrong id.`);return!1}}let g=!0;for(const[t,s]of i){const{pageDict:i}=await e.getPage(t);StructTreeRoot.#H({elements:s,xref:this.dict.xref,pageDict:i,numberTree:n});for(const e of s)if(e.accessibilityData?.type){e.parentTreeId=a++;g=!1}}if(g){for(const e of i.values())for(const t of e){delete t.parentTreeId;delete t.structTreeParent}return!1}return!0}async updateStructureTree({newAnnotationsByPage:e,pdfManager:t,newRefs:i}){const a=this.dict.xref,s=this.dict.clone(),r=this.ref,n=new RefSetCache;n.put(r,s);let g,o=s.getRaw("ParentTree");if(o instanceof Ref)g=a.fetch(o);else{g=o;o=a.getNewTemporaryRef();s.set("ParentTree",o)}g=g.clone();n.put(o,g);let c=g.getRaw("Nums"),C=null;if(c instanceof Ref){C=c;c=a.fetch(C)}c=c.slice();C||g.set("Nums",c);const h=await StructTreeRoot.#L({newAnnotationsByPage:e,structTreeRootRef:r,kids:null,nums:c,xref:a,pdfManager:t,cache:n});s.set("ParentTreeNextKey",h);C&&n.put(C,c);const l=[];for(const[e,t]of n.items()){l.length=0;await writeObject(e,t,l,a);i.push({ref:e,data:l.join("")})}}static async#L({newAnnotationsByPage:e,structTreeRootRef:t,kids:i,nums:a,xref:s,pdfManager:r,cache:n}){const g=Name.get("OBJR");let o=-1/0;for(const[c,C]of e){const{ref:e}=await r.getPage(c),h=e instanceof Ref;for(const{accessibilityData:r,ref:c,parentTreeId:l,structTreeParent:Q}of C){if(!r?.type)continue;const{type:C,title:E,lang:u,alt:d,expanded:f,actualText:p}=r;o=Math.max(o,l);const m=s.getNewTemporaryRef(),y=new Dict(s);y.set("S",Name.get(C));E&&y.set("T",E);u&&y.set("Lang",u);d&&y.set("Alt",d);f&&y.set("E",f);p&&y.set("ActualText",p);await this.#J({structTreeParent:Q,tagDict:y,newTagRef:m,structTreeRootRef:t,fallbackKids:i,xref:s,cache:n});const w=new Dict(s);y.set("K",w);w.set("Type",g);h&&w.set("Pg",e);w.set("Obj",c);n.put(m,y);a.push(l,m)}}return o+1}static#H({elements:e,xref:t,pageDict:i,numberTree:a}){const s=new Map;for(const t of e)if(t.structTreeParentId){const e=parseInt(t.structTreeParentId.split("_mc")[1],10);let i=s.get(e);if(!i){i=[];s.set(e,i)}i.push(t)}const r=i.get("StructParents");if(!Number.isInteger(r))return;const n=a.get(r),updateElement=(e,i,a)=>{const r=s.get(e);if(r){const e=i.getRaw("P"),s=t.fetchIfRef(e);if(e instanceof Ref&&s instanceof Dict){const e={ref:a,dict:i};for(const t of r)t.structTreeParent=e}return!0}return!1};for(const e of n){if(!(e instanceof Ref))continue;const i=t.fetch(e),a=i.get("K");if(Number.isInteger(a))updateElement(a,i,e);else if(Array.isArray(a))for(let s of a){s=t.fetchIfRef(s);if(Number.isInteger(s)&&updateElement(s,i,e))break;if(!(s instanceof Dict))continue;if(!isName(s.get("Type"),"MCR"))break;const a=s.get("MCID");if(Number.isInteger(a)&&updateElement(a,i,e))break}}}static async#J({structTreeParent:e,tagDict:t,newTagRef:i,structTreeRootRef:a,fallbackKids:s,xref:r,cache:n}){let g,o=null;if(e){({ref:o}=e);g=e.dict.getRaw("P")||a}else g=a;t.set("P",g);const c=r.fetchIfRef(g);if(!c){s.push(i);return}let C=n.get(g);if(!C){C=c.clone();n.put(g,C)}const h=C.getRaw("K");let l=h instanceof Ref?n.get(h):null;if(!l){l=r.fetchIfRef(h);l=Array.isArray(l)?l.slice():[h];const e=r.getNewTemporaryRef();C.set("K",e);n.put(e,l)}const Q=l.indexOf(o);l.splice(Q>=0?Q+1:l.length,0,i)}}class StructElementNode{constructor(e,t){this.tree=e;this.dict=t;this.kids=[];this.parseKids()}get role(){const e=this.dict.get("S"),t=e instanceof Name?e.name:"",{root:i}=this.tree;return i.roleMap.has(t)?i.roleMap.get(t):t}parseKids(){let e=null;const t=this.dict.getRaw("Pg");t instanceof Ref&&(e=t.toString());const i=this.dict.get("K");if(Array.isArray(i))for(const t of i){const i=this.parseKid(e,t);i&&this.kids.push(i)}else{const t=this.parseKid(e,i);t&&this.kids.push(t)}}parseKid(e,t){if(Number.isInteger(t))return this.tree.pageDict.objId!==e?null:new StructElement({type:vs,mcid:t,pageObjId:e});let i=null;t instanceof Ref?i=this.dict.xref.fetch(t):t instanceof Dict&&(i=t);if(!i)return null;const a=i.getRaw("Pg");a instanceof Ref&&(e=a.toString());const s=i.get("Type")instanceof Name?i.get("Type").name:null;if("MCR"===s){if(this.tree.pageDict.objId!==e)return null;const t=i.getRaw("Stm");return new StructElement({type:Ks,refObjId:t instanceof Ref?t.toString():null,pageObjId:e,mcid:i.get("MCID")})}if("OBJR"===s){if(this.tree.pageDict.objId!==e)return null;const t=i.getRaw("Obj");return new StructElement({type:Ts,refObjId:t instanceof Ref?t.toString():null,pageObjId:e})}return new StructElement({type:Os,dict:i})}}class StructElement{constructor({type:e,dict:t=null,mcid:i=null,pageObjId:a=null,refObjId:s=null}){this.type=e;this.dict=t;this.mcid=i;this.pageObjId=a;this.refObjId=s;this.parentNode=null}}class StructTreePage{constructor(e,t){this.root=e;this.rootDict=e?e.dict:null;this.pageDict=t;this.nodes=[]}parse(e){if(!this.root||!this.rootDict)return;const t=this.rootDict.get("ParentTree");if(!t)return;const i=this.pageDict.get("StructParents"),a=e instanceof Ref&&this.root.structParentIds?.get(e);if(!Number.isInteger(i)&&!a)return;const s=new Map,r=new NumberTree(t,this.rootDict.xref);if(Number.isInteger(i)){const e=r.get(i);if(Array.isArray(e))for(const t of e)t instanceof Ref&&this.addNode(this.rootDict.xref.fetch(t),s)}if(a)for(const[e,t]of a){const i=r.get(e);if(i){const e=this.addNode(this.rootDict.xref.fetchIfRef(i),s);1===e?.kids?.length&&e.kids[0].type===Ts&&(e.kids[0].type=t)}}}addNode(e,t,i=0){if(i>40){warn("StructTree MAX_DEPTH reached.");return null}if(t.has(e))return t.get(e);const a=new StructElementNode(this,e);t.set(e,a);const s=e.get("P");if(!s||isName(s.get("Type"),"StructTreeRoot")){this.addTopLevelNode(e,a)||t.delete(e);return a}const r=this.addNode(s,t,i+1);if(!r)return a;let n=!1;for(const t of r.kids)if(t.type===Os&&t.dict===e){t.parentNode=a;n=!0}n||t.delete(e);return a}addTopLevelNode(e,t){const i=this.rootDict.get("K");if(!i)return!1;if(i instanceof Dict){if(i.objId!==e.objId)return!1;this.nodes[0]=t;return!0}if(!Array.isArray(i))return!0;let a=!1;for(let s=0;s<i.length;s++){const r=i[s];if(r?.toString()===e.objId){this.nodes[s]=t;a=!0}}return a}get serializable(){function nodeToSerializable(e,t,i=0){if(i>40){warn("StructTree too deep to be fully serialized.");return}const a=Object.create(null);a.role=e.role;a.children=[];t.children.push(a);const s=e.dict.get("Alt");"string"==typeof s&&(a.alt=stringToPDFString(s));const r=e.dict.get("Lang");"string"==typeof r&&(a.lang=stringToPDFString(r));for(const t of e.kids){const e=t.type===Os?t.parentNode:null;e?nodeToSerializable(e,a,i+1):t.type===vs||t.type===Ks?a.children.push({type:"content",id:`p${t.pageObjId}_mc${t.mcid}`}):t.type===Ts?a.children.push({type:"object",id:t.refObjId}):t.type===qs&&a.children.push({type:"annotation",id:`pdfjs_internal_id_${t.refObjId}`})}}const e=Object.create(null);e.children=[];e.role="Root";for(const t of this.nodes)t&&nodeToSerializable(t,e);return e}}function isValidExplicitDest(e){if(!Array.isArray(e)||e.length<2)return!1;const[t,i,...a]=e;if(!(t instanceof Ref||Number.isInteger(t)))return!1;if(!(i instanceof Name))return!1;let s=!0;switch(i.name){case"XYZ":if(3!==a.length)return!1;break;case"Fit":case"FitB":return 0===a.length;case"FitH":case"FitBH":case"FitV":case"FitBV":if(1!==a.length)return!1;break;case"FitR":if(4!==a.length)return!1;s=!1;break;default:return!1}for(const e of a)if(!("number"==typeof e||s&&null===e))return!1;return!0}function fetchDest(e){e instanceof Dict&&(e=e.get("D"));return isValidExplicitDest(e)?e:null}function fetchRemoteDest(e){let t=e.get("D");if(t){t instanceof Name&&(t=t.name);if("string"==typeof t)return stringToPDFString(t);if(isValidExplicitDest(t))return JSON.stringify(t)}return null}class Catalog{constructor(e,t){this.pdfManager=e;this.xref=t;this._catDict=t.getCatalogObj();if(!(this._catDict instanceof Dict))throw new FormatError("Catalog object is not a dictionary.");this.toplevelPagesDict;this._actualNumPages=null;this.fontCache=new RefSetCache;this.builtInCMapCache=new Map;this.standardFontDataCache=new Map;this.globalImageCache=new GlobalImageCache;this.pageKidsCountCache=new RefSetCache;this.pageIndexCache=new RefSetCache;this.nonBlendModesSet=new RefSet;this.systemFontCache=new Map}cloneDict(){return this._catDict.clone()}get version(){const e=this._catDict.get("Version");if(e instanceof Name){if(bt.test(e.name))return shadow(this,"version",e.name);warn(`Invalid PDF catalog version: ${e.name}`)}return shadow(this,"version",null)}get lang(){const e=this._catDict.get("Lang");return shadow(this,"lang",e&&"string"==typeof e?stringToPDFString(e):null)}get needsRendering(){const e=this._catDict.get("NeedsRendering");return shadow(this,"needsRendering","boolean"==typeof e&&e)}get collection(){let e=null;try{const t=this._catDict.get("Collection");t instanceof Dict&&t.size>0&&(e=t)}catch(e){if(e instanceof MissingDataException)throw e;info("Cannot fetch Collection entry; assuming no collection is present.")}return shadow(this,"collection",e)}get acroForm(){let e=null;try{const t=this._catDict.get("AcroForm");t instanceof Dict&&t.size>0&&(e=t)}catch(e){if(e instanceof MissingDataException)throw e;info("Cannot fetch AcroForm entry; assuming no forms are present.")}return shadow(this,"acroForm",e)}get acroFormRef(){const e=this._catDict.getRaw("AcroForm");return shadow(this,"acroFormRef",e instanceof Ref?e:null)}get metadata(){const e=this._catDict.getRaw("Metadata");if(!(e instanceof Ref))return shadow(this,"metadata",null);let t=null;try{const i=this.xref.fetch(e,!this.xref.encrypt?.encryptMetadata);if(i instanceof BaseStream&&i.dict instanceof Dict){const e=i.dict.get("Type"),a=i.dict.get("Subtype");if(isName(e,"Metadata")&&isName(a,"XML")){const e=stringToUTF8String(i.getString());e&&(t=new MetadataParser(e).serializable)}}}catch(e){if(e instanceof MissingDataException)throw e;info(`Skipping invalid Metadata: "${e}".`)}return shadow(this,"metadata",t)}get markInfo(){let e=null;try{e=this._readMarkInfo()}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable to read mark info.")}return shadow(this,"markInfo",e)}_readMarkInfo(){const e=this._catDict.get("MarkInfo");if(!(e instanceof Dict))return null;const t={Marked:!1,UserProperties:!1,Suspects:!1};for(const i in t){const a=e.get(i);"boolean"==typeof a&&(t[i]=a)}return t}get structTreeRoot(){let e=null;try{e=this._readStructTreeRoot()}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable read to structTreeRoot info.")}return shadow(this,"structTreeRoot",e)}_readStructTreeRoot(){const e=this._catDict.getRaw("StructTreeRoot"),t=this.xref.fetchIfRef(e);if(!(t instanceof Dict))return null;const i=new StructTreeRoot(t,e);i.init();return i}get toplevelPagesDict(){const e=this._catDict.get("Pages");if(!(e instanceof Dict))throw new FormatError("Invalid top-level pages dictionary.");return shadow(this,"toplevelPagesDict",e)}get documentOutline(){let e=null;try{e=this._readDocumentOutline()}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable to read document outline.")}return shadow(this,"documentOutline",e)}_readDocumentOutline(){let e=this._catDict.get("Outlines");if(!(e instanceof Dict))return null;e=e.getRaw("First");if(!(e instanceof Ref))return null;const t={items:[]},i=[{obj:e,parent:t}],a=new RefSet;a.put(e);const s=this.xref,r=new Uint8ClampedArray(3);for(;i.length>0;){const t=i.shift(),n=s.fetchIfRef(t.obj);if(null===n)continue;n.has("Title")||warn("Invalid outline item encountered.");const g={url:null,dest:null,action:null};Catalog.parseDestDictionary({destDict:n,resultObj:g,docBaseUrl:this.baseUrl,docAttachments:this.attachments});const o=n.get("Title"),c=n.get("F")||0,C=n.getArray("C"),h=n.get("Count");let l=r;!isNumberArray(C,3)||0===C[0]&&0===C[1]&&0===C[2]||(l=ColorSpace.singletons.rgb.getRgb(C,0));const Q={action:g.action,attachment:g.attachment,dest:g.dest,url:g.url,unsafeUrl:g.unsafeUrl,newWindow:g.newWindow,setOCGState:g.setOCGState,title:"string"==typeof o?stringToPDFString(o):"",color:l,count:Number.isInteger(h)?h:void 0,bold:!!(2&c),italic:!!(1&c),items:[]};t.parent.items.push(Q);e=n.getRaw("First");if(e instanceof Ref&&!a.has(e)){i.push({obj:e,parent:Q});a.put(e)}e=n.getRaw("Next");if(e instanceof Ref&&!a.has(e)){i.push({obj:e,parent:t.parent});a.put(e)}}return t.items.length>0?t.items:null}get permissions(){let e=null;try{e=this._readPermissions()}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable to read permissions.")}return shadow(this,"permissions",e)}_readPermissions(){const e=this.xref.trailer.get("Encrypt");if(!(e instanceof Dict))return null;let t=e.get("P");if("number"!=typeof t)return null;t+=2**32;const i=[];for(const e in m){const a=m[e];t&a&&i.push(a)}return i}get optionalContentConfig(){let e=null;try{const t=this._catDict.get("OCProperties");if(!t)return shadow(this,"optionalContentConfig",null);const i=t.get("D");if(!i)return shadow(this,"optionalContentConfig",null);const a=t.get("OCGs");if(!Array.isArray(a))return shadow(this,"optionalContentConfig",null);const s=[],r=new RefSet;for(const e of a)if(e instanceof Ref&&!r.has(e)){r.put(e);s.push(this.#Y(e))}e=this.#v(i,r);e.groups=s}catch(e){if(e instanceof MissingDataException)throw e;warn(`Unable to read optional content config: ${e}`)}return shadow(this,"optionalContentConfig",e)}#Y(e){const t=this.xref.fetch(e),i={id:e.toString(),name:null,intent:null,usage:{print:null,view:null}},a=t.get("Name");"string"==typeof a&&(i.name=stringToPDFString(a));let s=t.getArray("Intent");Array.isArray(s)||(s=[s]);s.every((e=>e instanceof Name))&&(i.intent=s.map((e=>e.name)));const r=t.get("Usage");if(!(r instanceof Dict))return i;const n=i.usage,g=r.get("Print");if(g instanceof Dict){const e=g.get("PrintState");if(e instanceof Name)switch(e.name){case"ON":case"OFF":n.print={printState:e.name}}}const o=r.get("View");if(o instanceof Dict){const e=o.get("ViewState");if(e instanceof Name)switch(e.name){case"ON":case"OFF":n.view={viewState:e.name}}}return i}#v(e,t){function parseOnOff(e){const i=[];if(Array.isArray(e))for(const a of e)a instanceof Ref&&t.has(a)&&i.push(a.toString());return i}function parseOrder(e,i=0){if(!Array.isArray(e))return null;const s=[];for(const r of e){if(r instanceof Ref&&t.has(r)){a.put(r);s.push(r.toString());continue}const e=parseNestedOrder(r,i);e&&s.push(e)}if(i>0)return s;const r=[];for(const e of t)a.has(e)||r.push(e.toString());r.length&&s.push({name:null,order:r});return s}function parseNestedOrder(e,t){if(++t>s){warn("parseNestedOrder - reached MAX_NESTED_LEVELS.");return null}const a=i.fetchIfRef(e);if(!Array.isArray(a))return null;const r=i.fetchIfRef(a[0]);if("string"!=typeof r)return null;const n=parseOrder(a.slice(1),t);return n&&n.length?{name:stringToPDFString(r),order:n}:null}const i=this.xref,a=new RefSet,s=10;return{name:"string"==typeof e.get("Name")?stringToPDFString(e.get("Name")):null,creator:"string"==typeof e.get("Creator")?stringToPDFString(e.get("Creator")):null,baseState:e.get("BaseState")instanceof Name?e.get("BaseState").name:null,on:parseOnOff(e.get("ON")),off:parseOnOff(e.get("OFF")),order:parseOrder(e.get("Order")),groups:null}}setActualNumPages(e=null){this._actualNumPages=e}get hasActualNumPages(){return null!==this._actualNumPages}get _pagesCount(){const e=this.toplevelPagesDict.get("Count");if(!Number.isInteger(e))throw new FormatError("Page count in top-level pages dictionary is not an integer.");return shadow(this,"_pagesCount",e)}get numPages(){return this.hasActualNumPages?this._actualNumPages:this._pagesCount}get destinations(){const e=this._readDests(),t=Object.create(null);if(e instanceof NameTree)for(const[i,a]of e.getAll()){const e=fetchDest(a);e&&(t[stringToPDFString(i)]=e)}else e instanceof Dict&&e.forEach((function(e,i){const a=fetchDest(i);a&&(t[e]=a)}));return shadow(this,"destinations",t)}getDestination(e){const t=this._readDests();if(t instanceof NameTree){const i=fetchDest(t.get(e));if(i)return i;const a=this.destinations[e];if(a){warn(`Found "${e}" at an incorrect position in the NameTree.`);return a}}else if(t instanceof Dict){const i=fetchDest(t.get(e));if(i)return i}return null}_readDests(){const e=this._catDict.get("Names");return e?.has("Dests")?new NameTree(e.getRaw("Dests"),this.xref):this._catDict.has("Dests")?this._catDict.get("Dests"):void 0}get pageLabels(){let e=null;try{e=this._readPageLabels()}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable to read page labels.")}return shadow(this,"pageLabels",e)}_readPageLabels(){const e=this._catDict.getRaw("PageLabels");if(!e)return null;const t=new Array(this.numPages);let i=null,a="";const s=new NumberTree(e,this.xref).getAll();let r="",n=1;for(let e=0,g=this.numPages;e<g;e++){const g=s.get(e);if(void 0!==g){if(!(g instanceof Dict))throw new FormatError("PageLabel is not a dictionary.");if(g.has("Type")&&!isName(g.get("Type"),"PageLabel"))throw new FormatError("Invalid type in PageLabel dictionary.");if(g.has("S")){const e=g.get("S");if(!(e instanceof Name))throw new FormatError("Invalid style in PageLabel dictionary.");i=e.name}else i=null;if(g.has("P")){const e=g.get("P");if("string"!=typeof e)throw new FormatError("Invalid prefix in PageLabel dictionary.");a=stringToPDFString(e)}else a="";if(g.has("St")){const e=g.get("St");if(!(Number.isInteger(e)&&e>=1))throw new FormatError("Invalid start in PageLabel dictionary.");n=e}else n=1}switch(i){case"D":r=n;break;case"R":case"r":r=toRomanNumerals(n,"r"===i);break;case"A":case"a":const e=26,t="a"===i?97:65,a=n-1;r=String.fromCharCode(t+a%e).repeat(Math.floor(a/e)+1);break;default:if(i)throw new FormatError(`Invalid style "${i}" in PageLabel dictionary.`);r=""}t[e]=a+r;n++}return t}get pageLayout(){const e=this._catDict.get("PageLayout");let t="";if(e instanceof Name)switch(e.name){case"SinglePage":case"OneColumn":case"TwoColumnLeft":case"TwoColumnRight":case"TwoPageLeft":case"TwoPageRight":t=e.name}return shadow(this,"pageLayout",t)}get pageMode(){const e=this._catDict.get("PageMode");let t="UseNone";if(e instanceof Name)switch(e.name){case"UseNone":case"UseOutlines":case"UseThumbs":case"FullScreen":case"UseOC":case"UseAttachments":t=e.name}return shadow(this,"pageMode",t)}get viewerPreferences(){const e=this._catDict.get("ViewerPreferences");if(!(e instanceof Dict))return shadow(this,"viewerPreferences",null);let t=null;for(const i of e.getKeys()){const a=e.get(i);let s;switch(i){case"HideToolbar":case"HideMenubar":case"HideWindowUI":case"FitWindow":case"CenterWindow":case"DisplayDocTitle":case"PickTrayByPDFSize":"boolean"==typeof a&&(s=a);break;case"NonFullScreenPageMode":if(a instanceof Name)switch(a.name){case"UseNone":case"UseOutlines":case"UseThumbs":case"UseOC":s=a.name;break;default:s="UseNone"}break;case"Direction":if(a instanceof Name)switch(a.name){case"L2R":case"R2L":s=a.name;break;default:s="L2R"}break;case"ViewArea":case"ViewClip":case"PrintArea":case"PrintClip":if(a instanceof Name)switch(a.name){case"MediaBox":case"CropBox":case"BleedBox":case"TrimBox":case"ArtBox":s=a.name;break;default:s="CropBox"}break;case"PrintScaling":if(a instanceof Name)switch(a.name){case"None":case"AppDefault":s=a.name;break;default:s="AppDefault"}break;case"Duplex":if(a instanceof Name)switch(a.name){case"Simplex":case"DuplexFlipShortEdge":case"DuplexFlipLongEdge":s=a.name;break;default:s="None"}break;case"PrintPageRange":if(Array.isArray(a)&&a.length%2==0){a.every(((e,t,i)=>Number.isInteger(e)&&e>0&&(0===t||e>=i[t-1])&&e<=this.numPages))&&(s=a)}break;case"NumCopies":Number.isInteger(a)&&a>0&&(s=a);break;default:warn(`Ignoring non-standard key in ViewerPreferences: ${i}.`);continue}if(void 0!==s){t||(t=Object.create(null));t[i]=s}else warn(`Bad value, for key "${i}", in ViewerPreferences: ${a}.`)}return shadow(this,"viewerPreferences",t)}get openAction(){const e=this._catDict.get("OpenAction"),t=Object.create(null);if(e instanceof Dict){const i=new Dict(this.xref);i.set("A",e);const a={url:null,dest:null,action:null};Catalog.parseDestDictionary({destDict:i,resultObj:a});Array.isArray(a.dest)?t.dest=a.dest:a.action&&(t.action=a.action)}else Array.isArray(e)&&(t.dest=e);return shadow(this,"openAction",objectSize(t)>0?t:null)}get attachments(){const e=this._catDict.get("Names");let t=null;if(e instanceof Dict&&e.has("EmbeddedFiles")){const i=new NameTree(e.getRaw("EmbeddedFiles"),this.xref);for(const[e,a]of i.getAll()){const i=new FileSpec(a,this.xref);t||(t=Object.create(null));t[stringToPDFString(e)]=i.serializable}}return shadow(this,"attachments",t)}get xfaImages(){const e=this._catDict.get("Names");let t=null;if(e instanceof Dict&&e.has("XFAImages")){const i=new NameTree(e.getRaw("XFAImages"),this.xref);for(const[e,a]of i.getAll()){t||(t=new Dict(this.xref));t.set(stringToPDFString(e),a)}}return shadow(this,"xfaImages",t)}_collectJavaScript(){const e=this._catDict.get("Names");let t=null;function appendIfJavaScriptDict(e,i){if(!(i instanceof Dict))return;if(!isName(i.get("S"),"JavaScript"))return;let a=i.get("JS");if(a instanceof BaseStream)a=a.getString();else if("string"!=typeof a)return;a=stringToPDFString(a).replaceAll("\0","");a&&(t||=new Map).set(e,a)}if(e instanceof Dict&&e.has("JavaScript")){const t=new NameTree(e.getRaw("JavaScript"),this.xref);for(const[e,i]of t.getAll())appendIfJavaScriptDict(stringToPDFString(e),i)}const i=this._catDict.get("OpenAction");i&&appendIfJavaScriptDict("OpenAction",i);return t}get jsActions(){const e=this._collectJavaScript();let t=collectActions(this.xref,this._catDict,dA);if(e){t||=Object.create(null);for(const[i,a]of e)i in t?t[i].push(a):t[i]=[a]}return shadow(this,"jsActions",t)}async fontFallback(e,t){const i=await Promise.all(this.fontCache);for(const a of i)if(a.loadedName===e){a.fallback(t);return}}async cleanup(e=!1){clearGlobalCaches();this.globalImageCache.clear(e);this.pageKidsCountCache.clear();this.pageIndexCache.clear();this.nonBlendModesSet.clear();const t=await Promise.all(this.fontCache);for(const{dict:e}of t)delete e.cacheKey;this.fontCache.clear();this.builtInCMapCache.clear();this.standardFontDataCache.clear();this.systemFontCache.clear()}async getPageDict(e){const t=[this.toplevelPagesDict],i=new RefSet,a=this._catDict.getRaw("Pages");a instanceof Ref&&i.put(a);const s=this.xref,r=this.pageKidsCountCache,n=this.pageIndexCache;let g=0;for(;t.length;){const a=t.pop();if(a instanceof Ref){const o=r.get(a);if(o>=0&&g+o<=e){g+=o;continue}if(i.has(a))throw new FormatError("Pages tree contains circular reference.");i.put(a);const c=await s.fetchAsync(a);if(c instanceof Dict){let t=c.getRaw("Type");t instanceof Ref&&(t=await s.fetchAsync(t));if(isName(t,"Page")||!c.has("Kids")){r.has(a)||r.put(a,1);n.has(a)||n.put(a,g);if(g===e)return[c,a];g++;continue}}t.push(c);continue}if(!(a instanceof Dict))throw new FormatError("Page dictionary kid reference points to wrong type of object.");const{objId:o}=a;let c=a.getRaw("Count");c instanceof Ref&&(c=await s.fetchAsync(c));if(Number.isInteger(c)&&c>=0){o&&!r.has(o)&&r.put(o,c);if(g+c<=e){g+=c;continue}}let C=a.getRaw("Kids");C instanceof Ref&&(C=await s.fetchAsync(C));if(!Array.isArray(C)){let t=a.getRaw("Type");t instanceof Ref&&(t=await s.fetchAsync(t));if(isName(t,"Page")||!a.has("Kids")){if(g===e)return[a,null];g++;continue}throw new FormatError("Page dictionary kids object is not an array.")}for(let e=C.length-1;e>=0;e--)t.push(C[e])}throw new Error(`Page index ${e} not found.`)}async getAllPageDicts(e=!1){const{ignoreErrors:t}=this.pdfManager.evaluatorOptions,i=[{currentNode:this.toplevelPagesDict,posInKids:0}],a=new RefSet,s=this._catDict.getRaw("Pages");s instanceof Ref&&a.put(s);const r=new Map,n=this.xref,g=this.pageIndexCache;let o=0;function addPageDict(e,t){t&&!g.has(t)&&g.put(t,o);r.set(o++,[e,t])}function addPageError(i){if(i instanceof XRefEntryException&&!e)throw i;if(e&&t&&0===o){warn(`getAllPageDicts - Skipping invalid first page: "${i}".`);i=Dict.empty}r.set(o++,[i,null])}for(;i.length>0;){const e=i.at(-1),{currentNode:t,posInKids:s}=e;let r=t.getRaw("Kids");if(r instanceof Ref)try{r=await n.fetchAsync(r)}catch(e){addPageError(e);break}if(!Array.isArray(r)){addPageError(new FormatError("Page dictionary kids object is not an array."));break}if(s>=r.length){i.pop();continue}const g=r[s];let o;if(g instanceof Ref){if(a.has(g)){addPageError(new FormatError("Pages tree contains circular reference."));break}a.put(g);try{o=await n.fetchAsync(g)}catch(e){addPageError(e);break}}else o=g;if(!(o instanceof Dict)){addPageError(new FormatError("Page dictionary kid reference points to wrong type of object."));break}let c=o.getRaw("Type");if(c instanceof Ref)try{c=await n.fetchAsync(c)}catch(e){addPageError(e);break}isName(c,"Page")||!o.has("Kids")?addPageDict(o,g instanceof Ref?g:null):i.push({currentNode:o,posInKids:0});e.posInKids++}return r}getPageIndex(e){const t=this.pageIndexCache.get(e);if(void 0!==t)return Promise.resolve(t);const i=this.xref;let a=0;const next=t=>function pagesBeforeRef(t){let a,s=0;return i.fetchAsync(t).then((function(i){if(isRefsEqual(t,e)&&!isDict(i,"Page")&&!(i instanceof Dict&&!i.has("Type")&&i.has("Contents")))throw new FormatError("The reference does not point to a /Page dictionary.");if(!i)return null;if(!(i instanceof Dict))throw new FormatError("Node must be a dictionary.");a=i.getRaw("Parent");return i.getAsync("Parent")})).then((function(e){if(!e)return null;if(!(e instanceof Dict))throw new FormatError("Parent must be a dictionary.");return e.getAsync("Kids")})).then((function(e){if(!e)return null;const r=[];let n=!1;for(const a of e){if(!(a instanceof Ref))throw new FormatError("Kid must be a reference.");if(isRefsEqual(a,t)){n=!0;break}r.push(i.fetchAsync(a).then((function(e){if(!(e instanceof Dict))throw new FormatError("Kid node must be a dictionary.");e.has("Count")?s+=e.get("Count"):s++})))}if(!n)throw new FormatError("Kid reference not found in parent's kids.");return Promise.all(r).then((function(){return[s,a]}))}))}(t).then((t=>{if(!t){this.pageIndexCache.put(e,a);return a}const[i,s]=t;a+=i;return next(s)}));return next(e)}get baseUrl(){const e=this._catDict.get("URI");if(e instanceof Dict){const t=e.get("Base");if("string"==typeof t){const e=createValidAbsoluteUrl(t,null,{tryConvertEncoding:!0});if(e)return shadow(this,"baseUrl",e.href)}}return shadow(this,"baseUrl",this.pdfManager.docBaseUrl)}static parseDestDictionary({destDict:e,resultObj:t,docBaseUrl:i=null,docAttachments:a=null}){if(!(e instanceof Dict)){warn("parseDestDictionary: `destDict` must be a dictionary.");return}let s,r,n=e.get("A");if(!(n instanceof Dict))if(e.has("Dest"))n=e.get("Dest");else{n=e.get("AA");n instanceof Dict&&(n.has("D")?n=n.get("D"):n.has("U")&&(n=n.get("U")))}if(n instanceof Dict){const e=n.get("S");if(!(e instanceof Name)){warn("parseDestDictionary: Invalid type in Action dictionary.");return}const i=e.name;switch(i){case"ResetForm":const e=n.get("Flags"),g=0==(1&("number"==typeof e?e:0)),o=[],c=[];for(const e of n.get("Fields")||[])e instanceof Ref?c.push(e.toString()):"string"==typeof e&&o.push(stringToPDFString(e));t.resetForm={fields:o,refs:c,include:g};break;case"URI":s=n.get("URI");s instanceof Name&&(s="/"+s.name);break;case"GoTo":r=n.get("D");break;case"Launch":case"GoToR":const C=n.get("F");if(C instanceof Dict){const e=new FileSpec(C,null,!0),{rawFilename:t}=e.serializable;s=t}else"string"==typeof C&&(s=C);const h=fetchRemoteDest(n);h&&"string"==typeof s&&(s=s.split("#",1)[0]+"#"+h);const l=n.get("NewWindow");"boolean"==typeof l&&(t.newWindow=l);break;case"GoToE":const Q=n.get("T");let E;if(a&&Q instanceof Dict){const e=Q.get("R"),t=Q.get("N");isName(e,"C")&&"string"==typeof t&&(E=a[stringToPDFString(t)])}if(E){t.attachment=E;const e=fetchRemoteDest(n);e&&(t.attachmentDest=e)}else warn('parseDestDictionary - unimplemented "GoToE" action.');break;case"Named":const u=n.get("N");u instanceof Name&&(t.action=u.name);break;case"SetOCGState":const d=n.get("State"),f=n.get("PreserveRB");if(!Array.isArray(d)||0===d.length)break;const p=[];for(const e of d)if(e instanceof Name)switch(e.name){case"ON":case"OFF":case"Toggle":p.push(e.name)}else e instanceof Ref&&p.push(e.toString());if(p.length!==d.length)break;t.setOCGState={state:p,preserveRB:"boolean"!=typeof f||f};break;case"JavaScript":const m=n.get("JS");let y;m instanceof BaseStream?y=m.getString():"string"==typeof m&&(y=m);const w=y&&recoverJsURL(stringToPDFString(y));if(w){s=w.url;t.newWindow=w.newWindow;break}default:if("JavaScript"===i||"SubmitForm"===i)break;warn(`parseDestDictionary - unsupported action: "${i}".`)}}else e.has("Dest")&&(r=e.get("Dest"));if("string"==typeof s){const e=createValidAbsoluteUrl(s,i,{addDefaultProtocol:!0,tryConvertEncoding:!0});e&&(t.url=e.href);t.unsafeUrl=s}if(r){r instanceof Name&&(r=r.name);"string"==typeof r?t.dest=stringToPDFString(r):isValidExplicitDest(r)&&(t.dest=r)}}}function addChildren(e,t){if(e instanceof Dict)e=e.getRawValues();else if(e instanceof BaseStream)e=e.dict.getRawValues();else if(!Array.isArray(e))return;for(const a of e)((i=a)instanceof Ref||i instanceof Dict||i instanceof BaseStream||Array.isArray(i))&&t.push(a);var i}class ObjectLoader{constructor(e,t,i){this.dict=e;this.keys=t;this.xref=i;this.refSet=null}async load(){if(this.xref.stream.isDataLoaded)return;const{keys:e,dict:t}=this;this.refSet=new RefSet;const i=[];for(const a of e){const e=t.getRaw(a);void 0!==e&&i.push(e)}return this._walk(i)}async _walk(e){const t=[],i=[];for(;e.length;){let a=e.pop();if(a instanceof Ref){if(this.refSet.has(a))continue;try{this.refSet.put(a);a=this.xref.fetch(a)}catch(e){if(!(e instanceof MissingDataException)){warn(`ObjectLoader._walk - requesting all data: "${e}".`);this.refSet=null;const{manager:t}=this.xref.stream;return t.requestAllChunks()}t.push(a);i.push({begin:e.begin,end:e.end})}}if(a instanceof BaseStream){const e=a.getBaseStreams();if(e){let s=!1;for(const t of e)if(!t.isDataLoaded){s=!0;i.push({begin:t.start,end:t.end})}s&&t.push(a)}}addChildren(a,e)}if(i.length){await this.xref.stream.manager.requestRanges(i);for(const e of t)e instanceof Ref&&this.refSet.remove(e);return this._walk(t)}this.refSet=null}}const Ws=Symbol(),js=Symbol(),Xs=Symbol(),Zs=Symbol(),Vs=Symbol(),zs=Symbol(),_s=Symbol(),$s=Symbol(),Ar=Symbol(),er=Symbol("content"),tr=Symbol("data"),ir=Symbol(),ar=Symbol("extra"),sr=Symbol(),rr=Symbol(),nr=Symbol(),gr=Symbol(),or=Symbol(),Ir=Symbol(),cr=Symbol(),Cr=Symbol(),hr=Symbol(),lr=Symbol(),Qr=Symbol(),Er=Symbol(),ur=Symbol(),dr=Symbol(),fr=Symbol(),pr=Symbol(),mr=Symbol(),yr=Symbol(),wr=Symbol(),Dr=Symbol(),br=Symbol(),Fr=Symbol(),Sr=Symbol(),kr=Symbol(),Rr=Symbol(),Nr=Symbol(),Gr=Symbol(),xr=Symbol(),Ur=Symbol(),Mr=Symbol(),Lr=Symbol(),Hr=Symbol(),Jr=Symbol("namespaceId"),Yr=Symbol("nodeName"),vr=Symbol(),Kr=Symbol(),Tr=Symbol(),qr=Symbol(),Or=Symbol(),Pr=Symbol(),Wr=Symbol(),jr=Symbol(),Xr=Symbol("root"),Zr=Symbol(),Vr=Symbol(),zr=Symbol(),_r=Symbol(),$r=Symbol(),An=Symbol(),en=Symbol(),tn=Symbol(),an=Symbol(),sn=Symbol(),rn=Symbol(),nn=Symbol("uid"),gn=Symbol(),on={config:{id:0,check:e=>e.startsWith("http://www.xfa.org/schema/xci/")},connectionSet:{id:1,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-connection-set/")},datasets:{id:2,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-data/")},form:{id:3,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-form/")},localeSet:{id:4,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-locale-set/")},pdf:{id:5,check:e=>"http://ns.adobe.com/xdp/pdf/"===e},signature:{id:6,check:e=>"http://www.w3.org/2000/09/xmldsig#"===e},sourceSet:{id:7,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-source-set/")},stylesheet:{id:8,check:e=>"http://www.w3.org/1999/XSL/Transform"===e},template:{id:9,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-template/")},xdc:{id:10,check:e=>e.startsWith("http://www.xfa.org/schema/xdc/")},xdp:{id:11,check:e=>"http://ns.adobe.com/xdp/"===e},xfdf:{id:12,check:e=>"http://ns.adobe.com/xfdf/"===e},xhtml:{id:13,check:e=>"http://www.w3.org/1999/xhtml"===e},xmpmeta:{id:14,check:e=>"http://ns.adobe.com/xmpmeta/"===e}},In={pt:e=>e,cm:e=>e/2.54*72,mm:e=>e/25.4*72,in:e=>72*e,px:e=>e},cn=/([+-]?\d+\.?\d*)(.*)/;function stripQuotes(e){return e.startsWith("'")||e.startsWith('"')?e.slice(1,-1):e}function getInteger({data:e,defaultValue:t,validate:i}){if(!e)return t;e=e.trim();const a=parseInt(e,10);return!isNaN(a)&&i(a)?a:t}function getFloat({data:e,defaultValue:t,validate:i}){if(!e)return t;e=e.trim();const a=parseFloat(e);return!isNaN(a)&&i(a)?a:t}function getKeyword({data:e,defaultValue:t,validate:i}){return e&&i(e=e.trim())?e:t}function getStringOption(e,t){return getKeyword({data:e,defaultValue:t[0],validate:e=>t.includes(e)})}function getMeasurement(e,t="0"){t||="0";if(!e)return getMeasurement(t);const i=e.trim().match(cn);if(!i)return getMeasurement(t);const[,a,s]=i,r=parseFloat(a);if(isNaN(r))return getMeasurement(t);if(0===r)return 0;const n=In[s];return n?n(r):r}function getRatio(e){if(!e)return{num:1,den:1};const t=e.trim().split(/\s*:\s*/).map((e=>parseFloat(e))).filter((e=>!isNaN(e)));1===t.length&&t.push(1);if(0===t.length)return{num:1,den:1};const[i,a]=t;return{num:i,den:a}}function getRelevant(e){return e?e.trim().split(/\s+/).map((e=>({excluded:"-"===e[0],viewname:e.substring(1)}))):[]}class HTMLResult{static get FAILURE(){return shadow(this,"FAILURE",new HTMLResult(!1,null,null,null))}static get EMPTY(){return shadow(this,"EMPTY",new HTMLResult(!0,null,null,null))}constructor(e,t,i,a){this.success=e;this.html=t;this.bbox=i;this.breakNode=a}isBreak(){return!!this.breakNode}static breakNode(e){return new HTMLResult(!1,null,null,e)}static success(e,t=null){return new HTMLResult(!0,e,t,null)}}class FontFinder{constructor(e){this.fonts=new Map;this.cache=new Map;this.warned=new Set;this.defaultFont=null;this.add(e)}add(e,t=null){for(const t of e)this.addPdfFont(t);for(const e of this.fonts.values())e.regular||(e.regular=e.italic||e.bold||e.bolditalic);if(!t||0===t.size)return;const i=this.fonts.get("PdfJS-Fallback-PdfJS-XFA");for(const e of t)this.fonts.set(e,i)}addPdfFont(e){const t=e.cssFontInfo,i=t.fontFamily;let a=this.fonts.get(i);if(!a){a=Object.create(null);this.fonts.set(i,a);this.defaultFont||(this.defaultFont=a)}let s="";const r=parseFloat(t.fontWeight);0!==parseFloat(t.italicAngle)?s=r>=700?"bolditalic":"italic":r>=700&&(s="bold");if(!s){(e.name.includes("Bold")||e.psName?.includes("Bold"))&&(s="bold");(e.name.includes("Italic")||e.name.endsWith("It")||e.psName?.includes("Italic")||e.psName?.endsWith("It"))&&(s+="italic")}s||(s="regular");a[s]=e}getDefault(){return this.defaultFont}find(e,t=!0){let i=this.fonts.get(e)||this.cache.get(e);if(i)return i;const a=/,|-|_| |bolditalic|bold|italic|regular|it/gi;let s=e.replaceAll(a,"");i=this.fonts.get(s);if(i){this.cache.set(e,i);return i}s=s.toLowerCase();const r=[];for(const[e,t]of this.fonts.entries())e.replaceAll(a,"").toLowerCase().startsWith(s)&&r.push(t);if(0===r.length)for(const[,e]of this.fonts.entries())e.regular.name?.replaceAll(a,"").toLowerCase().startsWith(s)&&r.push(e);if(0===r.length){s=s.replaceAll(/psmt|mt/gi,"");for(const[e,t]of this.fonts.entries())e.replaceAll(a,"").toLowerCase().startsWith(s)&&r.push(t)}if(0===r.length)for(const e of this.fonts.values())e.regular.name?.replaceAll(a,"").toLowerCase().startsWith(s)&&r.push(e);if(r.length>=1){1!==r.length&&t&&warn(`XFA - Too many choices to guess the correct font: ${e}`);this.cache.set(e,r[0]);return r[0]}if(t&&!this.warned.has(e)){this.warned.add(e);warn(`XFA - Cannot find the font: ${e}`)}return null}}function selectFont(e,t){return"italic"===e.posture?"bold"===e.weight?t.bolditalic:t.italic:"bold"===e.weight?t.bold:t.regular}class FontInfo{constructor(e,t,i,a){this.lineHeight=i;this.paraMargin=t||{top:0,bottom:0,left:0,right:0};if(!e){[this.pdfFont,this.xfaFont]=this.defaultFont(a);return}this.xfaFont={typeface:e.typeface,posture:e.posture,weight:e.weight,size:e.size,letterSpacing:e.letterSpacing};const s=a.find(e.typeface);if(s){this.pdfFont=selectFont(e,s);this.pdfFont||([this.pdfFont,this.xfaFont]=this.defaultFont(a))}else[this.pdfFont,this.xfaFont]=this.defaultFont(a)}defaultFont(e){const t=e.find("Helvetica",!1)||e.find("Myriad Pro",!1)||e.find("Arial",!1)||e.getDefault();if(t?.regular){const e=t.regular;return[e,{typeface:e.cssFontInfo.fontFamily,posture:"normal",weight:"normal",size:10,letterSpacing:0}]}return[null,{typeface:"Courier",posture:"normal",weight:"normal",size:10,letterSpacing:0}]}}class FontSelector{constructor(e,t,i,a){this.fontFinder=a;this.stack=[new FontInfo(e,t,i,a)]}pushData(e,t,i){const a=this.stack.at(-1);for(const t of["typeface","posture","weight","size","letterSpacing"])e[t]||(e[t]=a.xfaFont[t]);for(const e of["top","bottom","left","right"])isNaN(t[e])&&(t[e]=a.paraMargin[e]);const s=new FontInfo(e,t,i||a.lineHeight,this.fontFinder);s.pdfFont||(s.pdfFont=a.pdfFont);this.stack.push(s)}popFont(){this.stack.pop()}topFont(){return this.stack.at(-1)}}class TextMeasure{constructor(e,t,i,a){this.glyphs=[];this.fontSelector=new FontSelector(e,t,i,a);this.extraHeight=0}pushData(e,t,i){this.fontSelector.pushData(e,t,i)}popFont(e){return this.fontSelector.popFont()}addPara(){const e=this.fontSelector.topFont();this.extraHeight+=e.paraMargin.top+e.paraMargin.bottom}addString(e){if(!e)return;const t=this.fontSelector.topFont(),i=t.xfaFont.size;if(t.pdfFont){const a=t.xfaFont.letterSpacing,s=t.pdfFont,r=s.lineHeight||1.2,n=t.lineHeight||Math.max(1.2,r)*i,g=r-(void 0===s.lineGap?.2:s.lineGap),o=Math.max(1,g)*i,c=i/1e3,C=s.defaultWidth||s.charsToGlyphs(" ")[0].width;for(const t of e.split(/[\u2029\n]/)){const e=s.encodeString(t).join(""),i=s.charsToGlyphs(e);for(const e of i){const t=e.width||C;this.glyphs.push([t*c+a,n,o,e.unicode,!1])}this.glyphs.push([0,0,0,"\n",!0])}this.glyphs.pop()}else{for(const t of e.split(/[\u2029\n]/)){for(const e of t.split(""))this.glyphs.push([i,1.2*i,i,e,!1]);this.glyphs.push([0,0,0,"\n",!0])}this.glyphs.pop()}}compute(e){let t=-1,i=0,a=0,s=0,r=0,n=0,g=!1,o=!0;for(let c=0,C=this.glyphs.length;c<C;c++){const[C,h,l,Q,E]=this.glyphs[c],u=" "===Q,d=o?l:h;if(E){a=Math.max(a,r);r=0;s+=n;n=d;t=-1;i=0;o=!1}else if(u)if(r+C>e){a=Math.max(a,r);r=0;s+=n;n=d;t=-1;i=0;g=!0;o=!1}else{n=Math.max(d,n);i=r;r+=C;t=c}else if(r+C>e){s+=n;n=d;if(-1!==t){c=t;a=Math.max(a,i);r=0;t=-1;i=0}else{a=Math.max(a,r);r=C}g=!0;o=!1}else{r+=C;n=Math.max(d,n)}}a=Math.max(a,r);s+=n+this.extraHeight;return{width:1.02*a,height:s,isBroken:g}}}const Cn=/^[^.[]+/,hn=/^[^\]]+/,Bn={dot:0,dotDot:1,dotHash:2,dotBracket:3,dotParen:4},ln=new Map([["$data",(e,t)=>e.datasets?e.datasets.data:e],["$record",(e,t)=>(e.datasets?e.datasets.data:e)[Er]()[0]],["$template",(e,t)=>e.template],["$connectionSet",(e,t)=>e.connectionSet],["$form",(e,t)=>e.form],["$layout",(e,t)=>e.layout],["$host",(e,t)=>e.host],["$dataWindow",(e,t)=>e.dataWindow],["$event",(e,t)=>e.event],["!",(e,t)=>e.datasets],["$xfa",(e,t)=>e],["xfa",(e,t)=>e],["$",(e,t)=>t]]),Qn=new WeakMap;function parseExpression(e,t,i=!0){let a=e.match(Cn);if(!a)return null;let[s]=a;const r=[{name:s,cacheName:"."+s,index:0,js:null,formCalc:null,operator:Bn.dot}];let n=s.length;for(;n<e.length;){const o=n;if("["===e.charAt(n++)){a=e.slice(n).match(hn);if(!a){warn("XFA - Invalid index in SOM expression");return null}r.at(-1).index="*"===(g=(g=a[0]).trim())?1/0:parseInt(g,10)||0;n+=a[0].length+1;continue}let c;switch(e.charAt(n)){case".":if(!t)return null;n++;c=Bn.dotDot;break;case"#":n++;c=Bn.dotHash;break;case"[":if(i){warn("XFA - SOM expression contains a FormCalc subexpression which is not supported for now.");return null}c=Bn.dotBracket;break;case"(":if(i){warn("XFA - SOM expression contains a JavaScript subexpression which is not supported for now.");return null}c=Bn.dotParen;break;default:c=Bn.dot}a=e.slice(n).match(Cn);if(!a)break;[s]=a;n+=s.length;r.push({name:s,cacheName:e.slice(o,n),operator:c,index:0,js:null,formCalc:null})}var g;return r}function searchNode(e,t,i,a=!0,s=!0){const r=parseExpression(i,a);if(!r)return null;const n=ln.get(r[0].name);let g,o=0;if(n){g=!0;e=[n(e,t)];o=1}else{g=null===t;e=[t||e]}for(let i=r.length;o<i;o++){const{name:i,cacheName:a,operator:n,index:c}=r[o],C=[];for(const t of e){if(!t.isXFAObject)continue;let e,r;if(s){r=Qn.get(t);if(!r){r=new Map;Qn.set(t,r)}e=r.get(a)}if(!e){switch(n){case Bn.dot:e=t[cr](i,!1);break;case Bn.dotDot:e=t[cr](i,!0);break;case Bn.dotHash:e=t[Ir](i);e=e.isXFAObjectArray?e.children:[e]}s&&r.set(a,e)}e.length>0&&C.push(e)}if(0!==C.length||g||0!==o)e=isFinite(c)?C.filter((e=>c<e.length)).map((e=>e[c])):C.flat();else{const i=t[pr]();if(!(t=i))return null;o=-1;e=[t]}}return 0===e.length?null:e}function createDataNode(e,t,i){const a=parseExpression(i);if(!a)return null;if(a.some((e=>e.operator===Bn.dotDot)))return null;const s=ln.get(a[0].name);let r=0;if(s){e=s(e,t);r=1}else e=t||e;for(let t=a.length;r<t;r++){const{name:t,operator:i,index:s}=a[r];if(!isFinite(s)){a[r].index=0;return e.createNodes(a.slice(r))}let n;switch(i){case Bn.dot:n=e[cr](t,!1);break;case Bn.dotDot:n=e[cr](t,!0);break;case Bn.dotHash:n=e[Ir](t);n=n.isXFAObjectArray?n.children:[n]}if(0===n.length)return e.createNodes(a.slice(r));if(!(s<n.length)){a[r].index=s-n.length;return e.createNodes(a.slice(r))}{const t=n[s];if(!t.isXFAObject){warn("XFA - Cannot create a node.");return null}e=t}}return null}const En=Symbol(),un=Symbol(),dn=Symbol(),fn=Symbol("_children"),pn=Symbol(),mn=Symbol(),yn=Symbol(),wn=Symbol(),Dn=Symbol(),bn=Symbol(),Fn=Symbol(),Sn=Symbol(),kn=Symbol(),Rn=Symbol("parent"),Nn=Symbol(),Gn=Symbol(),xn=Symbol();let Un=0;const Mn=on.datasets.id;class XFAObject{constructor(e,t,i=!1){this[Jr]=e;this[Yr]=t;this[Fn]=i;this[Rn]=null;this[fn]=[];this[nn]=`${t}${Un++}`;this[yr]=null}get isXFAObject(){return!0}get isXFAObjectArray(){return!1}createNodes(e){let t=this,i=null;for(const{name:a,index:s}of e){for(let e=0,r=isFinite(s)?s:0;e<=r;e++){const e=t[Jr]===Mn?-1:t[Jr];i=new XmlObject(e,a);t[Xs](i)}t=i}return i}[Kr](e){if(!this[Fn]||!this[Tr](e))return!1;const t=e[Yr],i=this[t];if(!(i instanceof XFAObjectArray)){null!==i&&this[jr](i);this[t]=e;this[Xs](e);return!0}if(i.push(e)){this[Xs](e);return!0}let a="";this.id?a=` (id: ${this.id})`:this.name&&(a=` (name: ${this.name} ${this.h.value})`);warn(`XFA - node "${this[Yr]}"${a} has already enough "${t}"!`);return!1}[Tr](e){return this.hasOwnProperty(e[Yr])&&e[Jr]===this[Jr]}[Gr](){return!1}[Ws](){return!1}[Sr](){return!1}[kr](){return!1}[Pr](){this.para&&this[mr]()[ar].paraStack.pop()}[Wr](){this[mr]()[ar].paraStack.push(this.para)}[zr](e){this.id&&this[Jr]===on.template.id&&e.set(this.id,this)}[mr](){return this[yr].template}[xr](){return!1}[Ur](){return!1}[Xs](e){e[Rn]=this;this[fn].push(e);!e[yr]&&this[yr]&&(e[yr]=this[yr])}[jr](e){const t=this[fn].indexOf(e);this[fn].splice(t,1)}[wr](){return this.hasOwnProperty("value")}[$r](e){}[qr](e){}[sr](){}[Vs](e){delete this[Fn];if(this[_s]){e.clean(this[_s]);delete this[_s]}}[br](e){return this[fn].indexOf(e)}[Fr](e,t){t[Rn]=this;this[fn].splice(e,0,t);!t[yr]&&this[yr]&&(t[yr]=this[yr])}[Mr](){return!this.name}[Hr](){return""}[en](){return 0===this[fn].length?this[er]:this[fn].map((e=>e[en]())).join("")}get[dn](){const e=Object.getPrototypeOf(this);if(!e._attributes){const t=e._attributes=new Set;for(const e of Object.getOwnPropertyNames(this)){if(null===this[e]||this[e]instanceof XFAObject||this[e]instanceof XFAObjectArray)break;t.add(e)}}return shadow(this,dn,e._attributes)}[Nr](e){let t=this;for(;t;){if(t===e)return!0;t=t[pr]()}return!1}[pr](){return this[Rn]}[fr](){return this[pr]()}[Er](e=null){return e?this[e]:this[fn]}[ir](){const e=Object.create(null);this[er]&&(e.$content=this[er]);for(const t of Object.getOwnPropertyNames(this)){const i=this[t];null!==i&&(i instanceof XFAObject?e[t]=i[ir]():i instanceof XFAObjectArray?i.isEmpty()||(e[t]=i.dump()):e[t]=i)}return e}[rn](){return null}[an](){return HTMLResult.EMPTY}*[ur](){for(const e of this[Er]())yield e}*[wn](e,t){for(const i of this[ur]())if(!e||t===e.has(i[Yr])){const e=this[or](),t=i[an](e);t.success||(this[ar].failingNode=i);yield t}}[rr](){return null}[js](e,t){this[ar].children.push(e)}[or](){}[Zs]({filter:e=null,include:t=!0}){if(this[ar].generator){const e=this[or](),t=this[ar].failingNode[an](e);if(!t.success)return t;t.html&&this[js](t.html,t.bbox);delete this[ar].failingNode}else this[ar].generator=this[wn](e,t);for(;;){const e=this[ar].generator.next();if(e.done)break;const t=e.value;if(!t.success)return t;t.html&&this[js](t.html,t.bbox)}this[ar].generator=null;return HTMLResult.EMPTY}[_r](e){this[Gn]=new Set(Object.keys(e))}[bn](e){const t=this[dn],i=this[Gn];return[...e].filter((e=>t.has(e)&&!i.has(e)))}[Zr](e,t=new Set){for(const i of this[fn])i[Nn](e,t)}[Nn](e,t){const i=this[Dn](e,t);i?this[En](i,e,t):this[Zr](e,t)}[Dn](e,t){const{use:i,usehref:a}=this;if(!i&&!a)return null;let s=null,r=null,n=null,g=i;if(a){g=a;a.startsWith("#som(")&&a.endsWith(")")?r=a.slice(5,-1):a.startsWith(".#som(")&&a.endsWith(")")?r=a.slice(6,-1):a.startsWith("#")?n=a.slice(1):a.startsWith(".#")&&(n=a.slice(2))}else i.startsWith("#")?n=i.slice(1):r=i;this.use=this.usehref="";if(n)s=e.get(n);else{s=searchNode(e.get(Xr),this,r,!0,!1);s&&(s=s[0])}if(!s){warn(`XFA - Invalid prototype reference: ${g}.`);return null}if(s[Yr]!==this[Yr]){warn(`XFA - Incompatible prototype: ${s[Yr]} !== ${this[Yr]}.`);return null}if(t.has(s)){warn("XFA - Cycle detected in prototypes use.");return null}t.add(s);const o=s[Dn](e,t);o&&s[En](o,e,t);s[Zr](e,t);t.delete(s);return s}[En](e,t,i){if(i.has(e)){warn("XFA - Cycle detected in prototypes use.");return}!this[er]&&e[er]&&(this[er]=e[er]);new Set(i).add(e);for(const t of this[bn](e[Gn])){this[t]=e[t];this[Gn]&&this[Gn].add(t)}for(const a of Object.getOwnPropertyNames(this)){if(this[dn].has(a))continue;const s=this[a],r=e[a];if(s instanceof XFAObjectArray){for(const e of s[fn])e[Nn](t,i);for(let a=s[fn].length,n=r[fn].length;a<n;a++){const r=e[fn][a][$s]();if(!s.push(r))break;r[Rn]=this;this[fn].push(r);r[Nn](t,i)}}else if(null===s){if(null!==r){const e=r[$s]();e[Rn]=this;this[a]=e;this[fn].push(e);e[Nn](t,i)}}else{s[Zr](t,i);r&&s[En](r,t,i)}}}static[pn](e){return Array.isArray(e)?e.map((e=>XFAObject[pn](e))):"object"==typeof e&&null!==e?Object.assign({},e):e}[$s](){const e=Object.create(Object.getPrototypeOf(this));for(const t of Object.getOwnPropertySymbols(this))try{e[t]=this[t]}catch{shadow(e,t,this[t])}e[nn]=`${e[Yr]}${Un++}`;e[fn]=[];for(const t of Object.getOwnPropertyNames(this)){if(this[dn].has(t)){e[t]=XFAObject[pn](this[t]);continue}const i=this[t];e[t]=i instanceof XFAObjectArray?new XFAObjectArray(i[Sn]):null}for(const t of this[fn]){const i=t[Yr],a=t[$s]();e[fn].push(a);a[Rn]=e;null===e[i]?e[i]=a:e[i][fn].push(a)}return e}[Er](e=null){return e?this[fn].filter((t=>t[Yr]===e)):this[fn]}[Ir](e){return this[e]}[cr](e,t,i=!0){return Array.from(this[Cr](e,t,i))}*[Cr](e,t,i=!0){if("parent"!==e){for(const i of this[fn]){i[Yr]===e&&(yield i);i.name===e&&(yield i);(t||i[Mr]())&&(yield*i[Cr](e,t,!1))}i&&this[dn].has(e)&&(yield new XFAAttribute(this,e,this[e]))}else yield this[Rn]}}class XFAObjectArray{constructor(e=1/0){this[Sn]=e;this[fn]=[]}get isXFAObject(){return!1}get isXFAObjectArray(){return!0}push(e){if(this[fn].length<=this[Sn]){this[fn].push(e);return!0}warn(`XFA - node "${e[Yr]}" accepts no more than ${this[Sn]} children`);return!1}isEmpty(){return 0===this[fn].length}dump(){return 1===this[fn].length?this[fn][0][ir]():this[fn].map((e=>e[ir]()))}[$s](){const e=new XFAObjectArray(this[Sn]);e[fn]=this[fn].map((e=>e[$s]()));return e}get children(){return this[fn]}clear(){this[fn].length=0}}class XFAAttribute{constructor(e,t,i){this[Rn]=e;this[Yr]=t;this[er]=i;this[Ar]=!1;this[nn]="attribute"+Un++}[pr](){return this[Rn]}[Rr](){return!0}[hr](){return this[er].trim()}[$r](e){e=e.value||"";this[er]=e.toString()}[en](){return this[er]}[Nr](e){return this[Rn]===e||this[Rn][Nr](e)}}class XmlObject extends XFAObject{constructor(e,t,i={}){super(e,t);this[er]="";this[mn]=null;if("#text"!==t){const e=new Map;this[un]=e;for(const[t,a]of Object.entries(i))e.set(t,new XFAAttribute(this,t,a));if(i.hasOwnProperty(vr)){const e=i[vr].xfa.dataNode;void 0!==e&&("dataGroup"===e?this[mn]=!1:"dataValue"===e&&(this[mn]=!0))}}this[Ar]=!1}[sn](e){const t=this[Yr];if("#text"===t){e.push(encodeToXmlString(this[er]));return}const i=utf8StringToString(t),a=this[Jr]===Mn?"xfa:":"";e.push(`<${a}${i}`);for(const[t,i]of this[un].entries()){const a=utf8StringToString(t);e.push(` ${a}="${encodeToXmlString(i[er])}"`)}null!==this[mn]&&(this[mn]?e.push(' xfa:dataNode="dataValue"'):e.push(' xfa:dataNode="dataGroup"'));if(this[er]||0!==this[fn].length){e.push(">");if(this[er])"string"==typeof this[er]?e.push(encodeToXmlString(this[er])):this[er][sn](e);else for(const t of this[fn])t[sn](e);e.push(`</${a}${i}>`)}else e.push("/>")}[Kr](e){if(this[er]){const e=new XmlObject(this[Jr],"#text");this[Xs](e);e[er]=this[er];this[er]=""}this[Xs](e);return!0}[qr](e){this[er]+=e}[sr](){if(this[er]&&this[fn].length>0){const e=new XmlObject(this[Jr],"#text");this[Xs](e);e[er]=this[er];delete this[er]}}[an](){return"#text"===this[Yr]?HTMLResult.success({name:"#text",value:this[er]}):HTMLResult.EMPTY}[Er](e=null){return e?this[fn].filter((t=>t[Yr]===e)):this[fn]}[gr](){return this[un]}[Ir](e){const t=this[un].get(e);return void 0!==t?t:this[Er](e)}*[Cr](e,t){const i=this[un].get(e);i&&(yield i);for(const i of this[fn]){i[Yr]===e&&(yield i);t&&(yield*i[Cr](e,t))}}*[nr](e,t){const i=this[un].get(e);!i||t&&i[Ar]||(yield i);for(const i of this[fn])yield*i[nr](e,t)}*[Qr](e,t,i){for(const a of this[fn]){a[Yr]!==e||i&&a[Ar]||(yield a);t&&(yield*a[Qr](e,t,i))}}[Rr](){return null===this[mn]?0===this[fn].length||this[fn][0][Jr]===on.xhtml.id:this[mn]}[hr](){return null===this[mn]?0===this[fn].length?this[er].trim():this[fn][0][Jr]===on.xhtml.id?this[fn][0][en]().trim():null:this[er].trim()}[$r](e){e=e.value||"";this[er]=e.toString()}[ir](e=!1){const t=Object.create(null);e&&(t.$ns=this[Jr]);this[er]&&(t.$content=this[er]);t.$name=this[Yr];t.children=[];for(const i of this[fn])t.children.push(i[ir](e));t.attributes=Object.create(null);for(const[e,i]of this[un])t.attributes[e]=i[er];return t}}class ContentObject extends XFAObject{constructor(e,t){super(e,t);this[er]=""}[qr](e){this[er]+=e}[sr](){}}class OptionObject extends ContentObject{constructor(e,t,i){super(e,t);this[kn]=i}[sr](){this[er]=getKeyword({data:this[er],defaultValue:this[kn][0],validate:e=>this[kn].includes(e)})}[Vs](e){super[Vs](e);delete this[kn]}}class StringObject extends ContentObject{[sr](){this[er]=this[er].trim()}}class IntegerObject extends ContentObject{constructor(e,t,i,a){super(e,t);this[yn]=i;this[xn]=a}[sr](){this[er]=getInteger({data:this[er],defaultValue:this[yn],validate:this[xn]})}[Vs](e){super[Vs](e);delete this[yn];delete this[xn]}}class Option01 extends IntegerObject{constructor(e,t){super(e,t,0,(e=>1===e))}}class Option10 extends IntegerObject{constructor(e,t){super(e,t,1,(e=>0===e))}}function measureToString(e){return"string"==typeof e?"0px":Number.isInteger(e)?`${e}px`:`${e.toFixed(2)}px`}const Ln={anchorType(e,t){const i=e[fr]();if(i&&(!i.layout||"position"===i.layout)){"transform"in t||(t.transform="");switch(e.anchorType){case"bottomCenter":t.transform+="translate(-50%, -100%)";break;case"bottomLeft":t.transform+="translate(0,-100%)";break;case"bottomRight":t.transform+="translate(-100%,-100%)";break;case"middleCenter":t.transform+="translate(-50%,-50%)";break;case"middleLeft":t.transform+="translate(0,-50%)";break;case"middleRight":t.transform+="translate(-100%,-50%)";break;case"topCenter":t.transform+="translate(-50%,0)";break;case"topRight":t.transform+="translate(-100%,0)"}}},dimensions(e,t){const i=e[fr]();let a=e.w;const s=e.h;if(i.layout?.includes("row")){const t=i[ar],s=e.colSpan;let r;if(-1===s){r=t.columnWidths.slice(t.currentColumn).reduce(((e,t)=>e+t),0);t.currentColumn=0}else{r=t.columnWidths.slice(t.currentColumn,t.currentColumn+s).reduce(((e,t)=>e+t),0);t.currentColumn=(t.currentColumn+e.colSpan)%t.columnWidths.length}isNaN(r)||(a=e.w=r)}t.width=""!==a?measureToString(a):"auto";t.height=""!==s?measureToString(s):"auto"},position(e,t){const i=e[fr]();if(!i?.layout||"position"===i.layout){t.position="absolute";t.left=measureToString(e.x);t.top=measureToString(e.y)}},rotate(e,t){if(e.rotate){"transform"in t||(t.transform="");t.transform+=`rotate(-${e.rotate}deg)`;t.transformOrigin="top left"}},presence(e,t){switch(e.presence){case"invisible":t.visibility="hidden";break;case"hidden":case"inactive":t.display="none"}},hAlign(e,t){if("para"===e[Yr])switch(e.hAlign){case"justifyAll":t.textAlign="justify-all";break;case"radix":t.textAlign="left";break;default:t.textAlign=e.hAlign}else switch(e.hAlign){case"left":t.alignSelf="start";break;case"center":t.alignSelf="center";break;case"right":t.alignSelf="end"}},margin(e,t){e.margin&&(t.margin=e.margin[rn]().margin)}};function setMinMaxDimensions(e,t){if("position"===e[fr]().layout){e.minW>0&&(t.minWidth=measureToString(e.minW));e.maxW>0&&(t.maxWidth=measureToString(e.maxW));e.minH>0&&(t.minHeight=measureToString(e.minH));e.maxH>0&&(t.maxHeight=measureToString(e.maxH))}}function layoutText(e,t,i,a,s,r){const n=new TextMeasure(t,i,a,s);"string"==typeof e?n.addString(e):e[Or](n);return n.compute(r)}function layoutNode(e,t){let i=null,a=null,s=!1;if((!e.w||!e.h)&&e.value){let r=0,n=0;if(e.margin){r=e.margin.leftInset+e.margin.rightInset;n=e.margin.topInset+e.margin.bottomInset}let g=null,o=null;if(e.para){o=Object.create(null);g=""===e.para.lineHeight?null:e.para.lineHeight;o.top=""===e.para.spaceAbove?0:e.para.spaceAbove;o.bottom=""===e.para.spaceBelow?0:e.para.spaceBelow;o.left=""===e.para.marginLeft?0:e.para.marginLeft;o.right=""===e.para.marginRight?0:e.para.marginRight}let c=e.font;if(!c){const t=e[mr]();let i=e[pr]();for(;i&&i!==t;){if(i.font){c=i.font;break}i=i[pr]()}}const C=(e.w||t.width)-r,h=e[yr].fontFinder;if(e.value.exData&&e.value.exData[er]&&"text/html"===e.value.exData.contentType){const t=layoutText(e.value.exData[er],c,o,g,h,C);a=t.width;i=t.height;s=t.isBroken}else{const t=e.value[en]();if(t){const e=layoutText(t,c,o,g,h,C);a=e.width;i=e.height;s=e.isBroken}}null===a||e.w||(a+=r);null===i||e.h||(i+=n)}return{w:a,h:i,isBroken:s}}function computeBbox(e,t,i){let a;if(""!==e.w&&""!==e.h)a=[e.x,e.y,e.w,e.h];else{if(!i)return null;let s=e.w;if(""===s){if(0===e.maxW){const t=e[fr]();s="position"===t.layout&&""!==t.w?0:e.minW}else s=Math.min(e.maxW,i.width);t.attributes.style.width=measureToString(s)}let r=e.h;if(""===r){if(0===e.maxH){const t=e[fr]();r="position"===t.layout&&""!==t.h?0:e.minH}else r=Math.min(e.maxH,i.height);t.attributes.style.height=measureToString(r)}a=[e.x,e.y,s,r]}return a}function fixDimensions(e){const t=e[fr]();if(t.layout?.includes("row")){const i=t[ar],a=e.colSpan;let s;s=-1===a?i.columnWidths.slice(i.currentColumn).reduce(((e,t)=>e+t),0):i.columnWidths.slice(i.currentColumn,i.currentColumn+a).reduce(((e,t)=>e+t),0);isNaN(s)||(e.w=s)}t.layout&&"position"!==t.layout&&(e.x=e.y=0);"table"===e.layout&&""===e.w&&Array.isArray(e.columnWidths)&&(e.w=e.columnWidths.reduce(((e,t)=>e+t),0))}function layoutClass(e){switch(e.layout){case"position":default:return"xfaPosition";case"lr-tb":return"xfaLrTb";case"rl-row":return"xfaRlRow";case"rl-tb":return"xfaRlTb";case"row":return"xfaRow";case"table":return"xfaTable";case"tb":return"xfaTb"}}function toStyle(e,...t){const i=Object.create(null);for(const a of t){const t=e[a];if(null!==t)if(Ln.hasOwnProperty(a))Ln[a](e,i);else if(t instanceof XFAObject){const e=t[rn]();e?Object.assign(i,e):warn(`(DEBUG) - XFA - style for ${a} not implemented yet`)}}return i}function createWrapper(e,t){const{attributes:i}=t,{style:a}=i,s={name:"div",attributes:{class:["xfaWrapper"],style:Object.create(null)},children:[]};i.class.push("xfaWrapped");if(e.border){const{widths:i,insets:r}=e.border[ar];let n,g,o=r[0],c=r[3];const C=r[0]+r[2],h=r[1]+r[3];switch(e.border.hand){case"even":o-=i[0]/2;c-=i[3]/2;n=`calc(100% + ${(i[1]+i[3])/2-h}px)`;g=`calc(100% + ${(i[0]+i[2])/2-C}px)`;break;case"left":o-=i[0];c-=i[3];n=`calc(100% + ${i[1]+i[3]-h}px)`;g=`calc(100% + ${i[0]+i[2]-C}px)`;break;case"right":n=h?`calc(100% - ${h}px)`:"100%";g=C?`calc(100% - ${C}px)`:"100%"}const l=["xfaBorder"];isPrintOnly(e.border)&&l.push("xfaPrintOnly");const Q={name:"div",attributes:{class:l,style:{top:`${o}px`,left:`${c}px`,width:n,height:g}},children:[]};for(const e of["border","borderWidth","borderColor","borderRadius","borderStyle"])if(void 0!==a[e]){Q.attributes.style[e]=a[e];delete a[e]}s.children.push(Q,t)}else s.children.push(t);for(const e of["background","backgroundClip","top","left","width","height","minWidth","minHeight","maxWidth","maxHeight","transform","transformOrigin","visibility"])if(void 0!==a[e]){s.attributes.style[e]=a[e];delete a[e]}s.attributes.style.position="absolute"===a.position?"absolute":"relative";delete a.position;if(a.alignSelf){s.attributes.style.alignSelf=a.alignSelf;delete a.alignSelf}return s}function fixTextIndent(e){const t=getMeasurement(e.textIndent,"0px");if(t>=0)return;const i="padding"+("left"===("right"===e.textAlign?"right":"left")?"Left":"Right"),a=getMeasurement(e[i],"0px");e[i]=a-t+"px"}function setAccess(e,t){switch(e.access){case"nonInteractive":t.push("xfaNonInteractive");break;case"readOnly":t.push("xfaReadOnly");break;case"protected":t.push("xfaDisabled")}}function isPrintOnly(e){return e.relevant.length>0&&!e.relevant[0].excluded&&"print"===e.relevant[0].viewname}function getCurrentPara(e){const t=e[mr]()[ar].paraStack;return t.length?t.at(-1):null}function setPara(e,t,i){if(i.attributes.class?.includes("xfaRich")){if(t){""===e.h&&(t.height="auto");""===e.w&&(t.width="auto")}const a=getCurrentPara(e);if(a){const e=i.attributes.style;e.display="flex";e.flexDirection="column";switch(a.vAlign){case"top":e.justifyContent="start";break;case"bottom":e.justifyContent="end";break;case"middle":e.justifyContent="center"}const t=a[rn]();for(const[i,a]of Object.entries(t))i in e||(e[i]=a)}}}function setFontFamily(e,t,i,a){if(!i){delete a.fontFamily;return}const s=stripQuotes(e.typeface);a.fontFamily=`"${s}"`;const r=i.find(s);if(r){const{fontFamily:i}=r.regular.cssFontInfo;i!==s&&(a.fontFamily=`"${i}"`);const n=getCurrentPara(t);if(n&&""!==n.lineHeight)return;if(a.lineHeight)return;const g=selectFont(e,r);g&&(a.lineHeight=Math.max(1.2,g.lineHeight))}}function fixURL(e){const t=createValidAbsoluteUrl(e,null,{addDefaultProtocol:!0,tryConvertEncoding:!0});return t?t.href:null}function createLine(e,t){return{name:"div",attributes:{class:["lr-tb"===e.layout?"xfaLr":"xfaRl"]},children:t}}function flushHTML(e){if(!e[ar])return null;const t={name:"div",attributes:e[ar].attributes,children:e[ar].children};if(e[ar].failingNode){const i=e[ar].failingNode[rr]();i&&(e.layout.endsWith("-tb")?t.children.push(createLine(e,[i])):t.children.push(i))}return 0===t.children.length?null:t}function addHTML(e,t,i){const a=e[ar],s=a.availableSpace,[r,n,g,o]=i;switch(e.layout){case"position":a.width=Math.max(a.width,r+g);a.height=Math.max(a.height,n+o);a.children.push(t);break;case"lr-tb":case"rl-tb":if(!a.line||1===a.attempt){a.line=createLine(e,[]);a.children.push(a.line);a.numberInLine=0}a.numberInLine+=1;a.line.children.push(t);if(0===a.attempt){a.currentWidth+=g;a.height=Math.max(a.height,a.prevHeight+o)}else{a.currentWidth=g;a.prevHeight=a.height;a.height+=o;a.attempt=0}a.width=Math.max(a.width,a.currentWidth);break;case"rl-row":case"row":{a.children.push(t);a.width+=g;a.height=Math.max(a.height,o);const e=measureToString(a.height);for(const t of a.children)t.attributes.style.height=e;break}case"table":case"tb":a.width=Math.min(s.width,Math.max(a.width,g));a.height+=o;a.children.push(t)}}function getAvailableSpace(e){const t=e[ar].availableSpace,i=e.margin?e.margin.topInset+e.margin.bottomInset:0,a=e.margin?e.margin.leftInset+e.margin.rightInset:0;switch(e.layout){case"lr-tb":case"rl-tb":return 0===e[ar].attempt?{width:t.width-a-e[ar].currentWidth,height:t.height-i-e[ar].prevHeight}:{width:t.width-a,height:t.height-i-e[ar].height};case"rl-row":case"row":return{width:e[ar].columnWidths.slice(e[ar].currentColumn).reduce(((e,t)=>e+t)),height:t.height-a};case"table":case"tb":return{width:t.width-a,height:t.height-i-e[ar].height};default:return t}}function checkDimensions(e,t){if(null===e[mr]()[ar].firstUnsplittable)return!0;if(0===e.w||0===e.h)return!0;const i=e[fr](),a=i[ar]?.attempt||0,[,s,r,n]=function getTransformedBBox(e){let t,i,a=""===e.w?NaN:e.w,s=""===e.h?NaN:e.h,[r,n]=[0,0];switch(e.anchorType||""){case"bottomCenter":[r,n]=[a/2,s];break;case"bottomLeft":[r,n]=[0,s];break;case"bottomRight":[r,n]=[a,s];break;case"middleCenter":[r,n]=[a/2,s/2];break;case"middleLeft":[r,n]=[0,s/2];break;case"middleRight":[r,n]=[a,s/2];break;case"topCenter":[r,n]=[a/2,0];break;case"topRight":[r,n]=[a,0]}switch(e.rotate||0){case 0:[t,i]=[-r,-n];break;case 90:[t,i]=[-n,r];[a,s]=[s,-a];break;case 180:[t,i]=[r,n];[a,s]=[-a,-s];break;case 270:[t,i]=[n,-r];[a,s]=[-s,a]}return[e.x+t+Math.min(0,a),e.y+i+Math.min(0,s),Math.abs(a),Math.abs(s)]}(e);switch(i.layout){case"lr-tb":case"rl-tb":return 0===a?e[mr]()[ar].noLayoutFailure?""!==e.w?Math.round(r-t.width)<=2:t.width>2:!(""!==e.h&&Math.round(n-t.height)>2)&&(""!==e.w?Math.round(r-t.width)<=2||0===i[ar].numberInLine&&t.height>2:t.width>2):!!e[mr]()[ar].noLayoutFailure||!(""!==e.h&&Math.round(n-t.height)>2)&&((""===e.w||Math.round(r-t.width)<=2||!i[Ur]())&&t.height>2);case"table":case"tb":return!!e[mr]()[ar].noLayoutFailure||(""===e.h||e[xr]()?(""===e.w||Math.round(r-t.width)<=2||!i[Ur]())&&t.height>2:Math.round(n-t.height)<=2);case"position":if(e[mr]()[ar].noLayoutFailure)return!0;if(""===e.h||Math.round(n+s-t.height)<=2)return!0;return n+s>e[mr]()[ar].currentContentArea.h;case"rl-row":case"row":return!!e[mr]()[ar].noLayoutFailure||(""===e.h||Math.round(n-t.height)<=2);default:return!0}}const Hn=on.template.id,Jn="http://www.w3.org/2000/svg",Yn=/^H(\d+)$/,vn=new Set(["image/gif","image/jpeg","image/jpg","image/pjpeg","image/png","image/apng","image/x-png","image/bmp","image/x-ms-bmp","image/tiff","image/tif","application/octet-stream"]),Kn=[[[66,77],"image/bmp"],[[255,216,255],"image/jpeg"],[[73,73,42,0],"image/tiff"],[[77,77,0,42],"image/tiff"],[[71,73,70,56,57,97],"image/gif"],[[137,80,78,71,13,10,26,10],"image/png"]];function getBorderDims(e){if(!e||!e.border)return{w:0,h:0};const t=e.border[lr]();return t?{w:t.widths[0]+t.widths[2]+t.insets[0]+t.insets[2],h:t.widths[1]+t.widths[3]+t.insets[1]+t.insets[3]}:{w:0,h:0}}function hasMargin(e){return e.margin&&(e.margin.topInset||e.margin.rightInset||e.margin.bottomInset||e.margin.leftInset)}function _setValue(e,t){if(!e.value){const t=new Value({});e[Xs](t);e.value=t}e.value[$r](t)}function*getContainedChildren(e){for(const t of e[Er]())t instanceof SubformSet?yield*t[ur]():yield t}function isRequired(e){return"error"===e.validate?.nullTest}function setTabIndex(e){for(;e;){if(!e.traversal){e[An]=e[pr]()[An];return}if(e[An])return;let t=null;for(const i of e.traversal[Er]())if("next"===i.operation){t=i;break}if(!t||!t.ref){e[An]=e[pr]()[An];return}const i=e[mr]();e[An]=++i[An];const a=i[Vr](t.ref,e);if(!a)return;e=a[0]}}function applyAssist(e,t){const i=e.assist;if(i){const e=i[an]();e&&(t.title=e);const a=i.role.match(Yn);if(a){const e="heading",i=a[1];t.role=e;t["aria-level"]=i}}if("table"===e.layout)t.role="table";else if("row"===e.layout)t.role="row";else{const i=e[pr]();"row"===i.layout&&(t.role="TH"===i.assist?.role?"columnheader":"cell")}}function ariaLabel(e){if(!e.assist)return null;const t=e.assist;return t.speak&&""!==t.speak[er]?t.speak[er]:t.toolTip?t.toolTip[er]:null}function valueToHtml(e){return HTMLResult.success({name:"div",attributes:{class:["xfaRich"],style:Object.create(null)},children:[{name:"span",attributes:{style:Object.create(null)},value:e}]})}function setFirstUnsplittable(e){const t=e[mr]();if(null===t[ar].firstUnsplittable){t[ar].firstUnsplittable=e;t[ar].noLayoutFailure=!0}}function unsetFirstUnsplittable(e){const t=e[mr]();t[ar].firstUnsplittable===e&&(t[ar].noLayoutFailure=!1)}function handleBreak(e){if(e[ar])return!1;e[ar]=Object.create(null);if("auto"===e.targetType)return!1;const t=e[mr]();let i=null;if(e.target){i=t[Vr](e.target,e[pr]());if(!i)return!1;i=i[0]}const{currentPageArea:a,currentContentArea:s}=t[ar];if("pageArea"===e.targetType){i instanceof PageArea||(i=null);if(e.startNew){e[ar].target=i||a;return!0}if(i&&i!==a){e[ar].target=i;return!0}return!1}i instanceof ContentArea||(i=null);const r=i&&i[pr]();let n,g=r;if(e.startNew)if(i){const e=r.contentArea.children,t=e.indexOf(s),a=e.indexOf(i);-1!==t&&t<a&&(g=null);n=a-1}else n=a.contentArea.children.indexOf(s);else{if(!i||i===s)return!1;n=r.contentArea.children.indexOf(i)-1;g=r===a?null:r}e[ar].target=g;e[ar].index=n;return!0}function handleOverflow(e,t,i){const a=e[mr](),s=a[ar].noLayoutFailure,r=t[fr];t[fr]=()=>e;a[ar].noLayoutFailure=!0;const n=t[an](i);e[js](n.html,n.bbox);a[ar].noLayoutFailure=s;t[fr]=r}class AppearanceFilter extends StringObject{constructor(e){super(Hn,"appearanceFilter");this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Arc extends XFAObject{constructor(e){super(Hn,"arc",!0);this.circular=getInteger({data:e.circular,defaultValue:0,validate:e=>1===e});this.hand=getStringOption(e.hand,["even","left","right"]);this.id=e.id||"";this.startAngle=getFloat({data:e.startAngle,defaultValue:0,validate:e=>!0});this.sweepAngle=getFloat({data:e.sweepAngle,defaultValue:360,validate:e=>!0});this.use=e.use||"";this.usehref=e.usehref||"";this.edge=null;this.fill=null}[an](){const e=this.edge||new Edge({}),t=e[rn](),i=Object.create(null);"visible"===this.fill?.presence?Object.assign(i,this.fill[rn]()):i.fill="transparent";i.strokeWidth=measureToString("visible"===e.presence?e.thickness:0);i.stroke=t.color;let a;const s={xmlns:Jn,style:{width:"100%",height:"100%",overflow:"visible"}};if(360===this.sweepAngle)a={name:"ellipse",attributes:{xmlns:Jn,cx:"50%",cy:"50%",rx:"50%",ry:"50%",style:i}};else{const e=this.startAngle*Math.PI/180,t=this.sweepAngle*Math.PI/180,r=this.sweepAngle>180?1:0,[n,g,o,c]=[50*(1+Math.cos(e)),50*(1-Math.sin(e)),50*(1+Math.cos(e+t)),50*(1-Math.sin(e+t))];a={name:"path",attributes:{xmlns:Jn,d:`M ${n} ${g} A 50 50 0 ${r} 0 ${o} ${c}`,vectorEffect:"non-scaling-stroke",style:i}};Object.assign(s,{viewBox:"0 0 100 100",preserveAspectRatio:"none"})}const r={name:"svg",children:[a],attributes:s};if(hasMargin(this[pr]()[pr]()))return HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[r]});r.attributes.style.position="absolute";return HTMLResult.success(r)}}class Area extends XFAObject{constructor(e){super(Hn,"area",!0);this.colSpan=getInteger({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.id=e.id||"";this.name=e.name||"";this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.x=getMeasurement(e.x,"0pt");this.y=getMeasurement(e.y,"0pt");this.desc=null;this.extras=null;this.area=new XFAObjectArray;this.draw=new XFAObjectArray;this.exObject=new XFAObjectArray;this.exclGroup=new XFAObjectArray;this.field=new XFAObjectArray;this.subform=new XFAObjectArray;this.subformSet=new XFAObjectArray}*[ur](){yield*getContainedChildren(this)}[Mr](){return!0}[kr](){return!0}[js](e,t){const[i,a,s,r]=t;this[ar].width=Math.max(this[ar].width,i+s);this[ar].height=Math.max(this[ar].height,a+r);this[ar].children.push(e)}[or](){return this[ar].availableSpace}[an](e){const t=toStyle(this,"position"),i={style:t,id:this[nn],class:["xfaArea"]};isPrintOnly(this)&&i.class.push("xfaPrintOnly");this.name&&(i.xfaName=this.name);const a=[];this[ar]={children:a,width:0,height:0,availableSpace:e};const s=this[Zs]({filter:new Set(["area","draw","field","exclGroup","subform","subformSet"]),include:!0});if(!s.success){if(s.isBreak())return s;delete this[ar];return HTMLResult.FAILURE}t.width=measureToString(this[ar].width);t.height=measureToString(this[ar].height);const r={name:"div",attributes:i,children:a},n=[this.x,this.y,this[ar].width,this[ar].height];delete this[ar];return HTMLResult.success(r,n)}}class Assist extends XFAObject{constructor(e){super(Hn,"assist",!0);this.id=e.id||"";this.role=e.role||"";this.use=e.use||"";this.usehref=e.usehref||"";this.speak=null;this.toolTip=null}[an](){return this.toolTip?.[er]||null}}class Barcode extends XFAObject{constructor(e){super(Hn,"barcode",!0);this.charEncoding=getKeyword({data:e.charEncoding?e.charEncoding.toLowerCase():"",defaultValue:"",validate:e=>["utf-8","big-five","fontspecific","gbk","gb-18030","gb-2312","ksc-5601","none","shift-jis","ucs-2","utf-16"].includes(e)||e.match(/iso-8859-\d{2}/)});this.checksum=getStringOption(e.checksum,["none","1mod10","1mod10_1mod11","2mod10","auto"]);this.dataColumnCount=getInteger({data:e.dataColumnCount,defaultValue:-1,validate:e=>e>=0});this.dataLength=getInteger({data:e.dataLength,defaultValue:-1,validate:e=>e>=0});this.dataPrep=getStringOption(e.dataPrep,["none","flateCompress"]);this.dataRowCount=getInteger({data:e.dataRowCount,defaultValue:-1,validate:e=>e>=0});this.endChar=e.endChar||"";this.errorCorrectionLevel=getInteger({data:e.errorCorrectionLevel,defaultValue:-1,validate:e=>e>=0&&e<=8});this.id=e.id||"";this.moduleHeight=getMeasurement(e.moduleHeight,"5mm");this.moduleWidth=getMeasurement(e.moduleWidth,"0.25mm");this.printCheckDigit=getInteger({data:e.printCheckDigit,defaultValue:0,validate:e=>1===e});this.rowColumnRatio=getRatio(e.rowColumnRatio);this.startChar=e.startChar||"";this.textLocation=getStringOption(e.textLocation,["below","above","aboveEmbedded","belowEmbedded","none"]);this.truncate=getInteger({data:e.truncate,defaultValue:0,validate:e=>1===e});this.type=getStringOption(e.type?e.type.toLowerCase():"",["aztec","codabar","code2of5industrial","code2of5interleaved","code2of5matrix","code2of5standard","code3of9","code3of9extended","code11","code49","code93","code128","code128a","code128b","code128c","code128sscc","datamatrix","ean8","ean8add2","ean8add5","ean13","ean13add2","ean13add5","ean13pwcd","fim","logmars","maxicode","msi","pdf417","pdf417macro","plessey","postauscust2","postauscust3","postausreplypaid","postausstandard","postukrm4scc","postusdpbc","postusimb","postusstandard","postus5zip","qrcode","rfid","rss14","rss14expanded","rss14limited","rss14stacked","rss14stackedomni","rss14truncated","telepen","ucc128","ucc128random","ucc128sscc","upca","upcaadd2","upcaadd5","upcapwcd","upce","upceadd2","upceadd5","upcean2","upcean5","upsmaxicode"]);this.upsMode=getStringOption(e.upsMode,["usCarrier","internationalCarrier","secureSymbol","standardSymbol"]);this.use=e.use||"";this.usehref=e.usehref||"";this.wideNarrowRatio=getRatio(e.wideNarrowRatio);this.encrypt=null;this.extras=null}}class Bind extends XFAObject{constructor(e){super(Hn,"bind",!0);this.match=getStringOption(e.match,["once","dataRef","global","none"]);this.ref=e.ref||"";this.picture=null}}class BindItems extends XFAObject{constructor(e){super(Hn,"bindItems");this.connection=e.connection||"";this.labelRef=e.labelRef||"";this.ref=e.ref||"";this.valueRef=e.valueRef||""}}class Bookend extends XFAObject{constructor(e){super(Hn,"bookend");this.id=e.id||"";this.leader=e.leader||"";this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||""}}class BooleanElement extends Option01{constructor(e){super(Hn,"boolean");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[an](e){return valueToHtml(1===this[er]?"1":"0")}}class Border extends XFAObject{constructor(e){super(Hn,"border",!0);this.break=getStringOption(e.break,["close","open"]);this.hand=getStringOption(e.hand,["even","left","right"]);this.id=e.id||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.corner=new XFAObjectArray(4);this.edge=new XFAObjectArray(4);this.extras=null;this.fill=null;this.margin=null}[lr](){if(!this[ar]){const e=this.edge.children.slice();if(e.length<4){const t=e.at(-1)||new Edge({});for(let i=e.length;i<4;i++)e.push(t)}const t=e.map((e=>e.thickness)),i=[0,0,0,0];if(this.margin){i[0]=this.margin.topInset;i[1]=this.margin.rightInset;i[2]=this.margin.bottomInset;i[3]=this.margin.leftInset}this[ar]={widths:t,insets:i,edges:e}}return this[ar]}[rn](){const{edges:e}=this[lr](),t=e.map((e=>{const t=e[rn]();t.color||="#000000";return t})),i=Object.create(null);this.margin&&Object.assign(i,this.margin[rn]());"visible"===this.fill?.presence&&Object.assign(i,this.fill[rn]());if(this.corner.children.some((e=>0!==e.radius))){const e=this.corner.children.map((e=>e[rn]()));if(2===e.length||3===e.length){const t=e.at(-1);for(let i=e.length;i<4;i++)e.push(t)}i.borderRadius=e.map((e=>e.radius)).join(" ")}switch(this.presence){case"invisible":case"hidden":i.borderStyle="";break;case"inactive":i.borderStyle="none";break;default:i.borderStyle=t.map((e=>e.style)).join(" ")}i.borderWidth=t.map((e=>e.width)).join(" ");i.borderColor=t.map((e=>e.color)).join(" ");return i}}class Break extends XFAObject{constructor(e){super(Hn,"break",!0);this.after=getStringOption(e.after,["auto","contentArea","pageArea","pageEven","pageOdd"]);this.afterTarget=e.afterTarget||"";this.before=getStringOption(e.before,["auto","contentArea","pageArea","pageEven","pageOdd"]);this.beforeTarget=e.beforeTarget||"";this.bookendLeader=e.bookendLeader||"";this.bookendTrailer=e.bookendTrailer||"";this.id=e.id||"";this.overflowLeader=e.overflowLeader||"";this.overflowTarget=e.overflowTarget||"";this.overflowTrailer=e.overflowTrailer||"";this.startNew=getInteger({data:e.startNew,defaultValue:0,validate:e=>1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class BreakAfter extends XFAObject{constructor(e){super(Hn,"breakAfter",!0);this.id=e.id||"";this.leader=e.leader||"";this.startNew=getInteger({data:e.startNew,defaultValue:0,validate:e=>1===e});this.target=e.target||"";this.targetType=getStringOption(e.targetType,["auto","contentArea","pageArea"]);this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||"";this.script=null}}class BreakBefore extends XFAObject{constructor(e){super(Hn,"breakBefore",!0);this.id=e.id||"";this.leader=e.leader||"";this.startNew=getInteger({data:e.startNew,defaultValue:0,validate:e=>1===e});this.target=e.target||"";this.targetType=getStringOption(e.targetType,["auto","contentArea","pageArea"]);this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||"";this.script=null}[an](e){this[ar]={};return HTMLResult.FAILURE}}class Button extends XFAObject{constructor(e){super(Hn,"button",!0);this.highlight=getStringOption(e.highlight,["inverted","none","outline","push"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[an](e){const t=this[pr]()[pr](),i={name:"button",attributes:{id:this[nn],class:["xfaButton"],style:{}},children:[]};for(const e of t.event.children){if("click"!==e.activity||!e.script)continue;const t=recoverJsURL(e.script[er]);if(!t)continue;const a=fixURL(t.url);a&&i.children.push({name:"a",attributes:{id:"link"+this[nn],href:a,newWindow:t.newWindow,class:["xfaLink"],style:{}},children:[]})}return HTMLResult.success(i)}}class Calculate extends XFAObject{constructor(e){super(Hn,"calculate",!0);this.id=e.id||"";this.override=getStringOption(e.override,["disabled","error","ignore","warning"]);this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.message=null;this.script=null}}class Caption extends XFAObject{constructor(e){super(Hn,"caption",!0);this.id=e.id||"";this.placement=getStringOption(e.placement,["left","bottom","inline","right","top"]);this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.reserve=Math.ceil(getMeasurement(e.reserve));this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.font=null;this.margin=null;this.para=null;this.value=null}[$r](e){_setValue(this,e)}[lr](e){if(!this[ar]){let{width:t,height:i}=e;switch(this.placement){case"left":case"right":case"inline":t=this.reserve<=0?t:this.reserve;break;case"top":case"bottom":i=this.reserve<=0?i:this.reserve}this[ar]=layoutNode(this,{width:t,height:i})}return this[ar]}[an](e){if(!this.value)return HTMLResult.EMPTY;this[Wr]();const t=this.value[an](e).html;if(!t){this[Pr]();return HTMLResult.EMPTY}const i=this.reserve;if(this.reserve<=0){const{w:t,h:i}=this[lr](e);switch(this.placement){case"left":case"right":case"inline":this.reserve=t;break;case"top":case"bottom":this.reserve=i}}const a=[];"string"==typeof t?a.push({name:"#text",value:t}):a.push(t);const s=toStyle(this,"font","margin","visibility");switch(this.placement){case"left":case"right":this.reserve>0&&(s.width=measureToString(this.reserve));break;case"top":case"bottom":this.reserve>0&&(s.height=measureToString(this.reserve))}setPara(this,null,t);this[Pr]();this.reserve=i;return HTMLResult.success({name:"div",attributes:{style:s,class:["xfaCaption"]},children:a})}}class Certificate extends StringObject{constructor(e){super(Hn,"certificate");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Certificates extends XFAObject{constructor(e){super(Hn,"certificates",!0);this.credentialServerPolicy=getStringOption(e.credentialServerPolicy,["optional","required"]);this.id=e.id||"";this.url=e.url||"";this.urlPolicy=e.urlPolicy||"";this.use=e.use||"";this.usehref=e.usehref||"";this.encryption=null;this.issuers=null;this.keyUsage=null;this.oids=null;this.signing=null;this.subjectDNs=null}}class CheckButton extends XFAObject{constructor(e){super(Hn,"checkButton",!0);this.id=e.id||"";this.mark=getStringOption(e.mark,["default","check","circle","cross","diamond","square","star"]);this.shape=getStringOption(e.shape,["square","round"]);this.size=getMeasurement(e.size,"10pt");this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}[an](e){const t=toStyle("margin"),i=measureToString(this.size);t.width=t.height=i;let a,s,r;const n=this[pr]()[pr](),g=n.items.children.length&&n.items.children[0][an]().html||[],o={on:(void 0!==g[0]?g[0]:"on").toString(),off:(void 0!==g[1]?g[1]:"off").toString()},c=(n.value?.[en]()||"off")===o.on||void 0,C=n[fr](),h=n[nn];let l;if(C instanceof ExclGroup){r=C[nn];a="radio";s="xfaRadio";l=C[tr]?.[nn]||C[nn]}else{a="checkbox";s="xfaCheckbox";l=n[tr]?.[nn]||n[nn]}const Q={name:"input",attributes:{class:[s],style:t,fieldId:h,dataId:l,type:a,checked:c,xfaOn:o.on,xfaOff:o.off,"aria-label":ariaLabel(n),"aria-required":!1}};r&&(Q.attributes.name=r);if(isRequired(n)){Q.attributes["aria-required"]=!0;Q.attributes.required=!0}return HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[Q]})}}class ChoiceList extends XFAObject{constructor(e){super(Hn,"choiceList",!0);this.commitOn=getStringOption(e.commitOn,["select","exit"]);this.id=e.id||"";this.open=getStringOption(e.open,["userControl","always","multiSelect","onEntry"]);this.textEntry=getInteger({data:e.textEntry,defaultValue:0,validate:e=>1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}[an](e){const t=toStyle(this,"border","margin"),i=this[pr]()[pr](),a={fontSize:`calc(${i.font?.size||10}px * var(--scale-factor))`},s=[];if(i.items.children.length>0){const e=i.items;let t=0,r=0;if(2===e.children.length){t=e.children[0].save;r=1-t}const n=e.children[t][an]().html,g=e.children[r][an]().html;let o=!1;const c=i.value?.[en]()||"";for(let e=0,t=n.length;e<t;e++){const t={name:"option",attributes:{value:g[e]||n[e],style:a},value:n[e]};g[e]===c&&(t.attributes.selected=o=!0);s.push(t)}o||s.splice(0,0,{name:"option",attributes:{hidden:!0,selected:!0},value:" "})}const r={class:["xfaSelect"],fieldId:i[nn],dataId:i[tr]?.[nn]||i[nn],style:t,"aria-label":ariaLabel(i),"aria-required":!1};if(isRequired(i)){r["aria-required"]=!0;r.required=!0}"multiSelect"===this.open&&(r.multiple=!0);return HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[{name:"select",children:s,attributes:r}]})}}class Color extends XFAObject{constructor(e){super(Hn,"color",!0);this.cSpace=getStringOption(e.cSpace,["SRGB"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.value=e.value?function getColor(e,t=[0,0,0]){let[i,a,s]=t;if(!e)return{r:i,g:a,b:s};const r=e.trim().split(/\s*,\s*/).map((e=>Math.min(Math.max(0,parseInt(e.trim(),10)),255))).map((e=>isNaN(e)?0:e));if(r.length<3)return{r:i,g:a,b:s};[i,a,s]=r;return{r:i,g:a,b:s}}(e.value):"";this.extras=null}[wr](){return!1}[rn](){return this.value?Util.makeHexColor(this.value.r,this.value.g,this.value.b):null}}class Comb extends XFAObject{constructor(e){super(Hn,"comb");this.id=e.id||"";this.numberOfCells=getInteger({data:e.numberOfCells,defaultValue:0,validate:e=>e>=0});this.use=e.use||"";this.usehref=e.usehref||""}}class Connect extends XFAObject{constructor(e){super(Hn,"connect",!0);this.connection=e.connection||"";this.id=e.id||"";this.ref=e.ref||"";this.usage=getStringOption(e.usage,["exportAndImport","exportOnly","importOnly"]);this.use=e.use||"";this.usehref=e.usehref||"";this.picture=null}}class ContentArea extends XFAObject{constructor(e){super(Hn,"contentArea",!0);this.h=getMeasurement(e.h);this.id=e.id||"";this.name=e.name||"";this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.w=getMeasurement(e.w);this.x=getMeasurement(e.x,"0pt");this.y=getMeasurement(e.y,"0pt");this.desc=null;this.extras=null}[an](e){const t={left:measureToString(this.x),top:measureToString(this.y),width:measureToString(this.w),height:measureToString(this.h)},i=["xfaContentarea"];isPrintOnly(this)&&i.push("xfaPrintOnly");return HTMLResult.success({name:"div",children:[],attributes:{style:t,class:i,id:this[nn]}})}}class Corner extends XFAObject{constructor(e){super(Hn,"corner",!0);this.id=e.id||"";this.inverted=getInteger({data:e.inverted,defaultValue:0,validate:e=>1===e});this.join=getStringOption(e.join,["square","round"]);this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.radius=getMeasurement(e.radius);this.stroke=getStringOption(e.stroke,["solid","dashDot","dashDotDot","dashed","dotted","embossed","etched","lowered","raised"]);this.thickness=getMeasurement(e.thickness,"0.5pt");this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[rn](){const e=toStyle(this,"visibility");e.radius=measureToString("square"===this.join?0:this.radius);return e}}class DateElement extends ContentObject{constructor(e){super(Hn,"date");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[sr](){const e=this[er].trim();this[er]=e?new Date(e):null}[an](e){return valueToHtml(this[er]?this[er].toString():"")}}class DateTime extends ContentObject{constructor(e){super(Hn,"dateTime");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[sr](){const e=this[er].trim();this[er]=e?new Date(e):null}[an](e){return valueToHtml(this[er]?this[er].toString():"")}}class DateTimeEdit extends XFAObject{constructor(e){super(Hn,"dateTimeEdit",!0);this.hScrollPolicy=getStringOption(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.picker=getStringOption(e.picker,["host","none"]);this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.comb=null;this.extras=null;this.margin=null}[an](e){const t=toStyle(this,"border","font","margin"),i=this[pr]()[pr](),a={name:"input",attributes:{type:"text",fieldId:i[nn],dataId:i[tr]?.[nn]||i[nn],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(i),"aria-required":!1}};if(isRequired(i)){a.attributes["aria-required"]=!0;a.attributes.required=!0}return HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[a]})}}class Decimal extends ContentObject{constructor(e){super(Hn,"decimal");this.fracDigits=getInteger({data:e.fracDigits,defaultValue:2,validate:e=>!0});this.id=e.id||"";this.leadDigits=getInteger({data:e.leadDigits,defaultValue:-1,validate:e=>!0});this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[sr](){const e=parseFloat(this[er].trim());this[er]=isNaN(e)?null:e}[an](e){return valueToHtml(null!==this[er]?this[er].toString():"")}}class DefaultUi extends XFAObject{constructor(e){super(Hn,"defaultUi",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class Desc extends XFAObject{constructor(e){super(Hn,"desc",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.decimal=new XFAObjectArray;this.exData=new XFAObjectArray;this.float=new XFAObjectArray;this.image=new XFAObjectArray;this.integer=new XFAObjectArray;this.text=new XFAObjectArray;this.time=new XFAObjectArray}}class DigestMethod extends OptionObject{constructor(e){super(Hn,"digestMethod",["","SHA1","SHA256","SHA512","RIPEMD160"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class DigestMethods extends XFAObject{constructor(e){super(Hn,"digestMethods",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.digestMethod=new XFAObjectArray}}class Draw extends XFAObject{constructor(e){super(Hn,"draw",!0);this.anchorType=getStringOption(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=getInteger({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.h=e.h?getMeasurement(e.h):"";this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.locale=e.locale||"";this.maxH=getMeasurement(e.maxH,"0pt");this.maxW=getMeasurement(e.maxW,"0pt");this.minH=getMeasurement(e.minH,"0pt");this.minW=getMeasurement(e.minW,"0pt");this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.rotate=getInteger({data:e.rotate,defaultValue:0,validate:e=>e%90==0});this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?getMeasurement(e.w):"";this.x=getMeasurement(e.x,"0pt");this.y=getMeasurement(e.y,"0pt");this.assist=null;this.border=null;this.caption=null;this.desc=null;this.extras=null;this.font=null;this.keep=null;this.margin=null;this.para=null;this.traversal=null;this.ui=null;this.value=null;this.setProperty=new XFAObjectArray}[$r](e){_setValue(this,e)}[an](e){setTabIndex(this);if("hidden"===this.presence||"inactive"===this.presence)return HTMLResult.EMPTY;fixDimensions(this);this[Wr]();const t=this.w,i=this.h,{w:a,h:s,isBroken:r}=layoutNode(this,e);if(a&&""===this.w){if(r&&this[fr]()[Ur]()){this[Pr]();return HTMLResult.FAILURE}this.w=a}s&&""===this.h&&(this.h=s);setFirstUnsplittable(this);if(!checkDimensions(this,e)){this.w=t;this.h=i;this[Pr]();return HTMLResult.FAILURE}unsetFirstUnsplittable(this);const n=toStyle(this,"font","hAlign","dimensions","position","presence","rotate","anchorType","border","margin");setMinMaxDimensions(this,n);if(n.margin){n.padding=n.margin;delete n.margin}const g=["xfaDraw"];this.font&&g.push("xfaFont");isPrintOnly(this)&&g.push("xfaPrintOnly");const o={style:n,id:this[nn],class:g};this.name&&(o.xfaName=this.name);const c={name:"div",attributes:o,children:[]};applyAssist(this,o);const C=computeBbox(this,c,e),h=this.value?this.value[an](e).html:null;if(null===h){this.w=t;this.h=i;this[Pr]();return HTMLResult.success(createWrapper(this,c),C)}c.children.push(h);setPara(this,n,h);this.w=t;this.h=i;this[Pr]();return HTMLResult.success(createWrapper(this,c),C)}}class Edge extends XFAObject{constructor(e){super(Hn,"edge",!0);this.cap=getStringOption(e.cap,["square","butt","round"]);this.id=e.id||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.stroke=getStringOption(e.stroke,["solid","dashDot","dashDotDot","dashed","dotted","embossed","etched","lowered","raised"]);this.thickness=getMeasurement(e.thickness,"0.5pt");this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[rn](){const e=toStyle(this,"visibility");Object.assign(e,{linecap:this.cap,width:measureToString(this.thickness),color:this.color?this.color[rn]():"#000000",style:""});if("visible"!==this.presence)e.style="none";else switch(this.stroke){case"solid":e.style="solid";break;case"dashDot":case"dashDotDot":case"dashed":e.style="dashed";break;case"dotted":e.style="dotted";break;case"embossed":e.style="ridge";break;case"etched":e.style="groove";break;case"lowered":e.style="inset";break;case"raised":e.style="outset"}return e}}class Encoding extends OptionObject{constructor(e){super(Hn,"encoding",["adbe.x509.rsa_sha1","adbe.pkcs7.detached","adbe.pkcs7.sha1"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Encodings extends XFAObject{constructor(e){super(Hn,"encodings",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.encoding=new XFAObjectArray}}class Encrypt extends XFAObject{constructor(e){super(Hn,"encrypt",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=null}}class EncryptData extends XFAObject{constructor(e){super(Hn,"encryptData",!0);this.id=e.id||"";this.operation=getStringOption(e.operation,["encrypt","decrypt"]);this.target=e.target||"";this.use=e.use||"";this.usehref=e.usehref||"";this.filter=null;this.manifest=null}}class Encryption extends XFAObject{constructor(e){super(Hn,"encryption",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new XFAObjectArray}}class EncryptionMethod extends OptionObject{constructor(e){super(Hn,"encryptionMethod",["","AES256-CBC","TRIPLEDES-CBC","AES128-CBC","AES192-CBC"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class EncryptionMethods extends XFAObject{constructor(e){super(Hn,"encryptionMethods",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.encryptionMethod=new XFAObjectArray}}class Event extends XFAObject{constructor(e){super(Hn,"event",!0);this.activity=getStringOption(e.activity,["click","change","docClose","docReady","enter","exit","full","indexChange","initialize","mouseDown","mouseEnter","mouseExit","mouseUp","postExecute","postOpen","postPrint","postSave","postSign","postSubmit","preExecute","preOpen","prePrint","preSave","preSign","preSubmit","ready","validationState"]);this.id=e.id||"";this.listen=getStringOption(e.listen,["refOnly","refAndDescendents"]);this.name=e.name||"";this.ref=e.ref||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.encryptData=null;this.execute=null;this.script=null;this.signData=null;this.submit=null}}class ExData extends ContentObject{constructor(e){super(Hn,"exData");this.contentType=e.contentType||"";this.href=e.href||"";this.id=e.id||"";this.maxLength=getInteger({data:e.maxLength,defaultValue:-1,validate:e=>e>=-1});this.name=e.name||"";this.rid=e.rid||"";this.transferEncoding=getStringOption(e.transferEncoding,["none","base64","package"]);this.use=e.use||"";this.usehref=e.usehref||""}[Sr](){return"text/html"===this.contentType}[Kr](e){if("text/html"===this.contentType&&e[Jr]===on.xhtml.id){this[er]=e;return!0}if("text/xml"===this.contentType){this[er]=e;return!0}return!1}[an](e){return"text/html"===this.contentType&&this[er]?this[er][an](e):HTMLResult.EMPTY}}class ExObject extends XFAObject{constructor(e){super(Hn,"exObject",!0);this.archive=e.archive||"";this.classId=e.classId||"";this.codeBase=e.codeBase||"";this.codeType=e.codeType||"";this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.boolean=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.decimal=new XFAObjectArray;this.exData=new XFAObjectArray;this.exObject=new XFAObjectArray;this.float=new XFAObjectArray;this.image=new XFAObjectArray;this.integer=new XFAObjectArray;this.text=new XFAObjectArray;this.time=new XFAObjectArray}}class ExclGroup extends XFAObject{constructor(e){super(Hn,"exclGroup",!0);this.access=getStringOption(e.access,["open","nonInteractive","protected","readOnly"]);this.accessKey=e.accessKey||"";this.anchorType=getStringOption(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=getInteger({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.h=e.h?getMeasurement(e.h):"";this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.layout=getStringOption(e.layout,["position","lr-tb","rl-row","rl-tb","row","table","tb"]);this.maxH=getMeasurement(e.maxH,"0pt");this.maxW=getMeasurement(e.maxW,"0pt");this.minH=getMeasurement(e.minH,"0pt");this.minW=getMeasurement(e.minW,"0pt");this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?getMeasurement(e.w):"";this.x=getMeasurement(e.x,"0pt");this.y=getMeasurement(e.y,"0pt");this.assist=null;this.bind=null;this.border=null;this.calculate=null;this.caption=null;this.desc=null;this.extras=null;this.margin=null;this.para=null;this.traversal=null;this.validate=null;this.connect=new XFAObjectArray;this.event=new XFAObjectArray;this.field=new XFAObjectArray;this.setProperty=new XFAObjectArray}[kr](){return!0}[wr](){return!0}[$r](e){for(const t of this.field.children){if(!t.value){const e=new Value({});t[Xs](e);t.value=e}t.value[$r](e)}}[Ur](){return this.layout.endsWith("-tb")&&0===this[ar].attempt&&this[ar].numberInLine>0||this[pr]()[Ur]()}[xr](){const e=this[fr]();if(!e[xr]())return!1;if(void 0!==this[ar]._isSplittable)return this[ar]._isSplittable;if("position"===this.layout||this.layout.includes("row")){this[ar]._isSplittable=!1;return!1}if(e.layout?.endsWith("-tb")&&0!==e[ar].numberInLine)return!1;this[ar]._isSplittable=!0;return!0}[rr](){return flushHTML(this)}[js](e,t){addHTML(this,e,t)}[or](){return getAvailableSpace(this)}[an](e){setTabIndex(this);if("hidden"===this.presence||"inactive"===this.presence||0===this.h||0===this.w)return HTMLResult.EMPTY;fixDimensions(this);const t=[],i={id:this[nn],class:[]};setAccess(this,i.class);this[ar]||(this[ar]=Object.create(null));Object.assign(this[ar],{children:t,attributes:i,attempt:0,line:null,numberInLine:0,availableSpace:{width:Math.min(this.w||1/0,e.width),height:Math.min(this.h||1/0,e.height)},width:0,height:0,prevHeight:0,currentWidth:0});const a=this[xr]();a||setFirstUnsplittable(this);if(!checkDimensions(this,e))return HTMLResult.FAILURE;const s=new Set(["field"]);if(this.layout.includes("row")){const e=this[fr]().columnWidths;if(Array.isArray(e)&&e.length>0){this[ar].columnWidths=e;this[ar].currentColumn=0}}const r=toStyle(this,"anchorType","dimensions","position","presence","border","margin","hAlign"),n=["xfaExclgroup"],g=layoutClass(this);g&&n.push(g);isPrintOnly(this)&&n.push("xfaPrintOnly");i.style=r;i.class=n;this.name&&(i.xfaName=this.name);this[Wr]();const o="lr-tb"===this.layout||"rl-tb"===this.layout,c=o?2:1;for(;this[ar].attempt<c;this[ar].attempt++){o&&1===this[ar].attempt&&(this[ar].numberInLine=0);const e=this[Zs]({filter:s,include:!0});if(e.success)break;if(e.isBreak()){this[Pr]();return e}if(o&&0===this[ar].attempt&&0===this[ar].numberInLine&&!this[mr]()[ar].noLayoutFailure){this[ar].attempt=c;break}}this[Pr]();a||unsetFirstUnsplittable(this);if(this[ar].attempt===c){a||delete this[ar];return HTMLResult.FAILURE}let C=0,h=0;if(this.margin){C=this.margin.leftInset+this.margin.rightInset;h=this.margin.topInset+this.margin.bottomInset}const l=Math.max(this[ar].width+C,this.w||0),Q=Math.max(this[ar].height+h,this.h||0),E=[this.x,this.y,l,Q];""===this.w&&(r.width=measureToString(l));""===this.h&&(r.height=measureToString(Q));const u={name:"div",attributes:i,children:t};applyAssist(this,i);delete this[ar];return HTMLResult.success(createWrapper(this,u),E)}}class Execute extends XFAObject{constructor(e){super(Hn,"execute");this.connection=e.connection||"";this.executeType=getStringOption(e.executeType,["import","remerge"]);this.id=e.id||"";this.runAt=getStringOption(e.runAt,["client","both","server"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Extras extends XFAObject{constructor(e){super(Hn,"extras",!0);this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.decimal=new XFAObjectArray;this.exData=new XFAObjectArray;this.extras=new XFAObjectArray;this.float=new XFAObjectArray;this.image=new XFAObjectArray;this.integer=new XFAObjectArray;this.text=new XFAObjectArray;this.time=new XFAObjectArray}}class Field extends XFAObject{constructor(e){super(Hn,"field",!0);this.access=getStringOption(e.access,["open","nonInteractive","protected","readOnly"]);this.accessKey=e.accessKey||"";this.anchorType=getStringOption(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=getInteger({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.h=e.h?getMeasurement(e.h):"";this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.locale=e.locale||"";this.maxH=getMeasurement(e.maxH,"0pt");this.maxW=getMeasurement(e.maxW,"0pt");this.minH=getMeasurement(e.minH,"0pt");this.minW=getMeasurement(e.minW,"0pt");this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.rotate=getInteger({data:e.rotate,defaultValue:0,validate:e=>e%90==0});this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?getMeasurement(e.w):"";this.x=getMeasurement(e.x,"0pt");this.y=getMeasurement(e.y,"0pt");this.assist=null;this.bind=null;this.border=null;this.calculate=null;this.caption=null;this.desc=null;this.extras=null;this.font=null;this.format=null;this.items=new XFAObjectArray(2);this.keep=null;this.margin=null;this.para=null;this.traversal=null;this.ui=null;this.validate=null;this.value=null;this.bindItems=new XFAObjectArray;this.connect=new XFAObjectArray;this.event=new XFAObjectArray;this.setProperty=new XFAObjectArray}[kr](){return!0}[$r](e){_setValue(this,e)}[an](e){setTabIndex(this);if(!this.ui){this.ui=new Ui({});this.ui[yr]=this[yr];this[Xs](this.ui);let e;switch(this.items.children.length){case 0:e=new TextEdit({});this.ui.textEdit=e;break;case 1:e=new CheckButton({});this.ui.checkButton=e;break;case 2:e=new ChoiceList({});this.ui.choiceList=e}this.ui[Xs](e)}if(!this.ui||"hidden"===this.presence||"inactive"===this.presence||0===this.h||0===this.w)return HTMLResult.EMPTY;this.caption&&delete this.caption[ar];this[Wr]();const t=this.caption?this.caption[an](e).html:null,i=this.w,a=this.h;let s=0,r=0;if(this.margin){s=this.margin.leftInset+this.margin.rightInset;r=this.margin.topInset+this.margin.bottomInset}let n=null;if(""===this.w||""===this.h){let t=null,i=null,a=0,g=0;if(this.ui.checkButton)a=g=this.ui.checkButton.size;else{const{w:t,h:i}=layoutNode(this,e);if(null!==t){a=t;g=i}else g=function fonts_getMetrics(e,t=!1){let i=null;if(e){const t=stripQuotes(e.typeface),a=e[yr].fontFinder.find(t);i=selectFont(e,a)}if(!i)return{lineHeight:12,lineGap:2,lineNoGap:10};const a=e.size||10,s=i.lineHeight?Math.max(t?0:1.2,i.lineHeight):1.2,r=void 0===i.lineGap?.2:i.lineGap;return{lineHeight:s*a,lineGap:r*a,lineNoGap:Math.max(1,s-r)*a}}(this.font,!0).lineNoGap}n=getBorderDims(this.ui[lr]());a+=n.w;g+=n.h;if(this.caption){const{w:s,h:r,isBroken:n}=this.caption[lr](e);if(n&&this[fr]()[Ur]()){this[Pr]();return HTMLResult.FAILURE}t=s;i=r;switch(this.caption.placement){case"left":case"right":case"inline":t+=a;break;case"top":case"bottom":i+=g}}else{t=a;i=g}if(t&&""===this.w){t+=s;this.w=Math.min(this.maxW<=0?1/0:this.maxW,this.minW+1<t?t:this.minW)}if(i&&""===this.h){i+=r;this.h=Math.min(this.maxH<=0?1/0:this.maxH,this.minH+1<i?i:this.minH)}}this[Pr]();fixDimensions(this);setFirstUnsplittable(this);if(!checkDimensions(this,e)){this.w=i;this.h=a;this[Pr]();return HTMLResult.FAILURE}unsetFirstUnsplittable(this);const g=toStyle(this,"font","dimensions","position","rotate","anchorType","presence","margin","hAlign");setMinMaxDimensions(this,g);const o=["xfaField"];this.font&&o.push("xfaFont");isPrintOnly(this)&&o.push("xfaPrintOnly");const c={style:g,id:this[nn],class:o};if(g.margin){g.padding=g.margin;delete g.margin}setAccess(this,o);this.name&&(c.xfaName=this.name);const C=[],h={name:"div",attributes:c,children:C};applyAssist(this,c);const l=this.border?this.border[rn]():null,Q=computeBbox(this,h,e),E=this.ui[an]().html;if(!E){Object.assign(g,l);return HTMLResult.success(createWrapper(this,h),Q)}this[An]&&(E.children?.[0]?E.children[0].attributes.tabindex=this[An]:E.attributes.tabindex=this[An]);E.attributes.style||(E.attributes.style=Object.create(null));let u=null;if(this.ui.button){1===E.children.length&&([u]=E.children.splice(0,1));Object.assign(E.attributes.style,l)}else Object.assign(g,l);C.push(E);if(this.value)if(this.ui.imageEdit)E.children.push(this.value[an]().html);else if(!this.ui.button){let e="";if(this.value.exData)e=this.value.exData[en]();else if(this.value.text)e=this.value.text[lr]();else{const t=this.value[an]().html;null!==t&&(e=t.children[0].value)}this.ui.textEdit&&this.value.text?.maxChars&&(E.children[0].attributes.maxLength=this.value.text.maxChars);if(e){if(this.ui.numericEdit){e=parseFloat(e);e=isNaN(e)?"":e.toString()}"textarea"===E.children[0].name?E.children[0].attributes.textContent=e:E.children[0].attributes.value=e}}if(!this.ui.imageEdit&&E.children?.[0]&&this.h){n=n||getBorderDims(this.ui[lr]());let t=0;if(this.caption&&["top","bottom"].includes(this.caption.placement)){t=this.caption.reserve;t<=0&&(t=this.caption[lr](e).h);const i=this.h-t-r-n.h;E.children[0].attributes.style.height=measureToString(i)}else E.children[0].attributes.style.height="100%"}u&&E.children.push(u);if(!t){E.attributes.class&&E.attributes.class.push("xfaLeft");this.w=i;this.h=a;return HTMLResult.success(createWrapper(this,h),Q)}if(this.ui.button){g.padding&&delete g.padding;"div"===t.name&&(t.name="span");E.children.push(t);return HTMLResult.success(h,Q)}this.ui.checkButton&&(t.attributes.class[0]="xfaCaptionForCheckButton");E.attributes.class||(E.attributes.class=[]);E.children.splice(0,0,t);switch(this.caption.placement){case"left":case"inline":E.attributes.class.push("xfaLeft");break;case"right":E.attributes.class.push("xfaRight");break;case"top":E.attributes.class.push("xfaTop");break;case"bottom":E.attributes.class.push("xfaBottom")}this.w=i;this.h=a;return HTMLResult.success(createWrapper(this,h),Q)}}class Fill extends XFAObject{constructor(e){super(Hn,"fill",!0);this.id=e.id||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null;this.linear=null;this.pattern=null;this.radial=null;this.solid=null;this.stipple=null}[rn](){const e=this[pr](),t=e[pr]()[pr](),i=Object.create(null);let a="color",s=a;if(e instanceof Border){a="background-color";s="background";t instanceof Ui&&(i.backgroundColor="white")}if(e instanceof Rectangle||e instanceof Arc){a=s="fill";i.fill="white"}for(const e of Object.getOwnPropertyNames(this)){if("extras"===e||"color"===e)continue;const t=this[e];if(!(t instanceof XFAObject))continue;const r=t[rn](this.color);r&&(i[r.startsWith("#")?a:s]=r);return i}if(this.color?.value){const e=this.color[rn]();i[e.startsWith("#")?a:s]=e}return i}}class Filter extends XFAObject{constructor(e){super(Hn,"filter",!0);this.addRevocationInfo=getStringOption(e.addRevocationInfo,["","required","optional","none"]);this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||"";this.version=getInteger({data:this.version,defaultValue:5,validate:e=>e>=1&&e<=5});this.appearanceFilter=null;this.certificates=null;this.digestMethods=null;this.encodings=null;this.encryptionMethods=null;this.handler=null;this.lockDocument=null;this.mdp=null;this.reasons=null;this.timeStamp=null}}class Float extends ContentObject{constructor(e){super(Hn,"float");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[sr](){const e=parseFloat(this[er].trim());this[er]=isNaN(e)?null:e}[an](e){return valueToHtml(null!==this[er]?this[er].toString():"")}}class template_Font extends XFAObject{constructor(e){super(Hn,"font",!0);this.baselineShift=getMeasurement(e.baselineShift);this.fontHorizontalScale=getFloat({data:e.fontHorizontalScale,defaultValue:100,validate:e=>e>=0});this.fontVerticalScale=getFloat({data:e.fontVerticalScale,defaultValue:100,validate:e=>e>=0});this.id=e.id||"";this.kerningMode=getStringOption(e.kerningMode,["none","pair"]);this.letterSpacing=getMeasurement(e.letterSpacing,"0");this.lineThrough=getInteger({data:e.lineThrough,defaultValue:0,validate:e=>1===e||2===e});this.lineThroughPeriod=getStringOption(e.lineThroughPeriod,["all","word"]);this.overline=getInteger({data:e.overline,defaultValue:0,validate:e=>1===e||2===e});this.overlinePeriod=getStringOption(e.overlinePeriod,["all","word"]);this.posture=getStringOption(e.posture,["normal","italic"]);this.size=getMeasurement(e.size,"10pt");this.typeface=e.typeface||"Courier";this.underline=getInteger({data:e.underline,defaultValue:0,validate:e=>1===e||2===e});this.underlinePeriod=getStringOption(e.underlinePeriod,["all","word"]);this.use=e.use||"";this.usehref=e.usehref||"";this.weight=getStringOption(e.weight,["normal","bold"]);this.extras=null;this.fill=null}[Vs](e){super[Vs](e);this[yr].usedTypefaces.add(this.typeface)}[rn](){const e=toStyle(this,"fill"),t=e.color;if(t)if("#000000"===t)delete e.color;else if(!t.startsWith("#")){e.background=t;e.backgroundClip="text";e.color="transparent"}this.baselineShift&&(e.verticalAlign=measureToString(this.baselineShift));e.fontKerning="none"===this.kerningMode?"none":"normal";e.letterSpacing=measureToString(this.letterSpacing);if(0!==this.lineThrough){e.textDecoration="line-through";2===this.lineThrough&&(e.textDecorationStyle="double")}if(0!==this.overline){e.textDecoration="overline";2===this.overline&&(e.textDecorationStyle="double")}e.fontStyle=this.posture;e.fontSize=measureToString(.99*this.size);setFontFamily(this,this,this[yr].fontFinder,e);if(0!==this.underline){e.textDecoration="underline";2===this.underline&&(e.textDecorationStyle="double")}e.fontWeight=this.weight;return e}}class Format extends XFAObject{constructor(e){super(Hn,"format",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.picture=null}}class Handler extends StringObject{constructor(e){super(Hn,"handler");this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Hyphenation extends XFAObject{constructor(e){super(Hn,"hyphenation");this.excludeAllCaps=getInteger({data:e.excludeAllCaps,defaultValue:0,validate:e=>1===e});this.excludeInitialCap=getInteger({data:e.excludeInitialCap,defaultValue:0,validate:e=>1===e});this.hyphenate=getInteger({data:e.hyphenate,defaultValue:0,validate:e=>1===e});this.id=e.id||"";this.pushCharacterCount=getInteger({data:e.pushCharacterCount,defaultValue:3,validate:e=>e>=0});this.remainCharacterCount=getInteger({data:e.remainCharacterCount,defaultValue:3,validate:e=>e>=0});this.use=e.use||"";this.usehref=e.usehref||"";this.wordCharacterCount=getInteger({data:e.wordCharacterCount,defaultValue:7,validate:e=>e>=0})}}class Image extends StringObject{constructor(e){super(Hn,"image");this.aspect=getStringOption(e.aspect,["fit","actual","height","none","width"]);this.contentType=e.contentType||"";this.href=e.href||"";this.id=e.id||"";this.name=e.name||"";this.transferEncoding=getStringOption(e.transferEncoding,["base64","none","package"]);this.use=e.use||"";this.usehref=e.usehref||""}[an](){if(this.contentType&&!vn.has(this.contentType.toLowerCase()))return HTMLResult.EMPTY;let e=this[yr].images&&this[yr].images.get(this.href);if(!e&&(this.href||!this[er]))return HTMLResult.EMPTY;e||"base64"!==this.transferEncoding||(e=stringToBytes(atob(this[er])));if(!e)return HTMLResult.EMPTY;if(!this.contentType){for(const[t,i]of Kn)if(e.length>t.length&&t.every(((t,i)=>t===e[i]))){this.contentType=i;break}if(!this.contentType)return HTMLResult.EMPTY}const t=new Blob([e],{type:this.contentType});let i;switch(this.aspect){case"fit":case"actual":break;case"height":i={height:"100%",objectFit:"fill"};break;case"none":i={width:"100%",height:"100%",objectFit:"fill"};break;case"width":i={width:"100%",objectFit:"fill"}}const a=this[pr]();return HTMLResult.success({name:"img",attributes:{class:["xfaImage"],style:i,src:URL.createObjectURL(t),alt:a?ariaLabel(a[pr]()):null}})}}class ImageEdit extends XFAObject{constructor(e){super(Hn,"imageEdit",!0);this.data=getStringOption(e.data,["link","embed"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}[an](e){return"embed"===this.data?HTMLResult.success({name:"div",children:[],attributes:{}}):HTMLResult.EMPTY}}class Integer extends ContentObject{constructor(e){super(Hn,"integer");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[sr](){const e=parseInt(this[er].trim(),10);this[er]=isNaN(e)?null:e}[an](e){return valueToHtml(null!==this[er]?this[er].toString():"")}}class Issuers extends XFAObject{constructor(e){super(Hn,"issuers",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new XFAObjectArray}}class Items extends XFAObject{constructor(e){super(Hn,"items",!0);this.id=e.id||"";this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.ref=e.ref||"";this.save=getInteger({data:e.save,defaultValue:0,validate:e=>1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.decimal=new XFAObjectArray;this.exData=new XFAObjectArray;this.float=new XFAObjectArray;this.image=new XFAObjectArray;this.integer=new XFAObjectArray;this.text=new XFAObjectArray;this.time=new XFAObjectArray}[an](){const e=[];for(const t of this[Er]())e.push(t[en]());return HTMLResult.success(e)}}class Keep extends XFAObject{constructor(e){super(Hn,"keep",!0);this.id=e.id||"";const t=["none","contentArea","pageArea"];this.intact=getStringOption(e.intact,t);this.next=getStringOption(e.next,t);this.previous=getStringOption(e.previous,t);this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class KeyUsage extends XFAObject{constructor(e){super(Hn,"keyUsage");const t=["","yes","no"];this.crlSign=getStringOption(e.crlSign,t);this.dataEncipherment=getStringOption(e.dataEncipherment,t);this.decipherOnly=getStringOption(e.decipherOnly,t);this.digitalSignature=getStringOption(e.digitalSignature,t);this.encipherOnly=getStringOption(e.encipherOnly,t);this.id=e.id||"";this.keyAgreement=getStringOption(e.keyAgreement,t);this.keyCertSign=getStringOption(e.keyCertSign,t);this.keyEncipherment=getStringOption(e.keyEncipherment,t);this.nonRepudiation=getStringOption(e.nonRepudiation,t);this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Line extends XFAObject{constructor(e){super(Hn,"line",!0);this.hand=getStringOption(e.hand,["even","left","right"]);this.id=e.id||"";this.slope=getStringOption(e.slope,["\\","/"]);this.use=e.use||"";this.usehref=e.usehref||"";this.edge=null}[an](){const e=this[pr]()[pr](),t=this.edge||new Edge({}),i=t[rn](),a=Object.create(null),s="visible"===t.presence?t.thickness:0;a.strokeWidth=measureToString(s);a.stroke=i.color;let r,n,g,o,c="100%",C="100%";if(e.w<=s){[r,n,g,o]=["50%",0,"50%","100%"];c=a.strokeWidth}else if(e.h<=s){[r,n,g,o]=[0,"50%","100%","50%"];C=a.strokeWidth}else"\\"===this.slope?[r,n,g,o]=[0,0,"100%","100%"]:[r,n,g,o]=[0,"100%","100%",0];const h={name:"svg",children:[{name:"line",attributes:{xmlns:Jn,x1:r,y1:n,x2:g,y2:o,style:a}}],attributes:{xmlns:Jn,width:c,height:C,style:{overflow:"visible"}}};if(hasMargin(e))return HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[h]});h.attributes.style.position="absolute";return HTMLResult.success(h)}}class Linear extends XFAObject{constructor(e){super(Hn,"linear",!0);this.id=e.id||"";this.type=getStringOption(e.type,["toRight","toBottom","toLeft","toTop"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[rn](e){e=e?e[rn]():"#FFFFFF";return`linear-gradient(${this.type.replace(/([RBLT])/," $1").toLowerCase()}, ${e}, ${this.color?this.color[rn]():"#000000"})`}}class LockDocument extends ContentObject{constructor(e){super(Hn,"lockDocument");this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}[sr](){this[er]=getStringOption(this[er],["auto","0","1"])}}class Manifest extends XFAObject{constructor(e){super(Hn,"manifest",!0);this.action=getStringOption(e.action,["include","all","exclude"]);this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.ref=new XFAObjectArray}}class Margin extends XFAObject{constructor(e){super(Hn,"margin",!0);this.bottomInset=getMeasurement(e.bottomInset,"0");this.id=e.id||"";this.leftInset=getMeasurement(e.leftInset,"0");this.rightInset=getMeasurement(e.rightInset,"0");this.topInset=getMeasurement(e.topInset,"0");this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[rn](){return{margin:measureToString(this.topInset)+" "+measureToString(this.rightInset)+" "+measureToString(this.bottomInset)+" "+measureToString(this.leftInset)}}}class Mdp extends XFAObject{constructor(e){super(Hn,"mdp");this.id=e.id||"";this.permissions=getInteger({data:e.permissions,defaultValue:2,validate:e=>1===e||3===e});this.signatureType=getStringOption(e.signatureType,["filler","author"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Medium extends XFAObject{constructor(e){super(Hn,"medium");this.id=e.id||"";this.imagingBBox=function getBBox(e){const t=-1;if(!e)return{x:t,y:t,width:t,height:t};const i=e.trim().split(/\s*,\s*/).map((e=>getMeasurement(e,"-1")));if(i.length<4||i[2]<0||i[3]<0)return{x:t,y:t,width:t,height:t};const[a,s,r,n]=i;return{x:a,y:s,width:r,height:n}}(e.imagingBBox);this.long=getMeasurement(e.long);this.orientation=getStringOption(e.orientation,["portrait","landscape"]);this.short=getMeasurement(e.short);this.stock=e.stock||"";this.trayIn=getStringOption(e.trayIn,["auto","delegate","pageFront"]);this.trayOut=getStringOption(e.trayOut,["auto","delegate"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Message extends XFAObject{constructor(e){super(Hn,"message",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.text=new XFAObjectArray}}class NumericEdit extends XFAObject{constructor(e){super(Hn,"numericEdit",!0);this.hScrollPolicy=getStringOption(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.comb=null;this.extras=null;this.margin=null}[an](e){const t=toStyle(this,"border","font","margin"),i=this[pr]()[pr](),a={name:"input",attributes:{type:"text",fieldId:i[nn],dataId:i[tr]?.[nn]||i[nn],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(i),"aria-required":!1}};if(isRequired(i)){a.attributes["aria-required"]=!0;a.attributes.required=!0}return HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[a]})}}class Occur extends XFAObject{constructor(e){super(Hn,"occur",!0);this.id=e.id||"";this.initial=""!==e.initial?getInteger({data:e.initial,defaultValue:"",validate:e=>!0}):"";this.max=""!==e.max?getInteger({data:e.max,defaultValue:1,validate:e=>!0}):"";this.min=""!==e.min?getInteger({data:e.min,defaultValue:1,validate:e=>!0}):"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[Vs](){const e=this[pr](),t=this.min;""===this.min&&(this.min=e instanceof PageArea||e instanceof PageSet?0:1);""===this.max&&(this.max=""===t?e instanceof PageArea||e instanceof PageSet?-1:1:this.min);-1!==this.max&&this.max<this.min&&(this.max=this.min);""===this.initial&&(this.initial=e instanceof Template?1:this.min)}}class Oid extends StringObject{constructor(e){super(Hn,"oid");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Oids extends XFAObject{constructor(e){super(Hn,"oids",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.oid=new XFAObjectArray}}class Overflow extends XFAObject{constructor(e){super(Hn,"overflow");this.id=e.id||"";this.leader=e.leader||"";this.target=e.target||"";this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||""}[lr](){if(!this[ar]){const e=this[pr](),t=this[mr](),i=t[Vr](this.target,e),a=t[Vr](this.leader,e),s=t[Vr](this.trailer,e);this[ar]={target:i?.[0]||null,leader:a?.[0]||null,trailer:s?.[0]||null,addLeader:!1,addTrailer:!1}}return this[ar]}}class PageArea extends XFAObject{constructor(e){super(Hn,"pageArea",!0);this.blankOrNotBlank=getStringOption(e.blankOrNotBlank,["any","blank","notBlank"]);this.id=e.id||"";this.initialNumber=getInteger({data:e.initialNumber,defaultValue:1,validate:e=>!0});this.name=e.name||"";this.numbered=getInteger({data:e.numbered,defaultValue:1,validate:e=>!0});this.oddOrEven=getStringOption(e.oddOrEven,["any","even","odd"]);this.pagePosition=getStringOption(e.pagePosition,["any","first","last","only","rest"]);this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.desc=null;this.extras=null;this.medium=null;this.occur=null;this.area=new XFAObjectArray;this.contentArea=new XFAObjectArray;this.draw=new XFAObjectArray;this.exclGroup=new XFAObjectArray;this.field=new XFAObjectArray;this.subform=new XFAObjectArray}[Lr](){if(!this[ar]){this[ar]={numberOfUse:0};return!0}return!this.occur||-1===this.occur.max||this[ar].numberOfUse<this.occur.max}[zs](){delete this[ar]}[dr](){this[ar]||(this[ar]={numberOfUse:0});const e=this[pr]();if("orderedOccurrence"===e.relation&&this[Lr]()){this[ar].numberOfUse+=1;return this}return e[dr]()}[or](){return this[ar].space||{width:0,height:0}}[an](){this[ar]||(this[ar]={numberOfUse:1});const e=[];this[ar].children=e;const t=Object.create(null);if(this.medium&&this.medium.short&&this.medium.long){t.width=measureToString(this.medium.short);t.height=measureToString(this.medium.long);this[ar].space={width:this.medium.short,height:this.medium.long};if("landscape"===this.medium.orientation){const e=t.width;t.width=t.height;t.height=e;this[ar].space={width:this.medium.long,height:this.medium.short}}}else warn("XFA - No medium specified in pageArea: please file a bug.");this[Zs]({filter:new Set(["area","draw","field","subform"]),include:!0});this[Zs]({filter:new Set(["contentArea"]),include:!0});return HTMLResult.success({name:"div",children:e,attributes:{class:["xfaPage"],id:this[nn],style:t,xfaName:this.name}})}}class PageSet extends XFAObject{constructor(e){super(Hn,"pageSet",!0);this.duplexImposition=getStringOption(e.duplexImposition,["longEdge","shortEdge"]);this.id=e.id||"";this.name=e.name||"";this.relation=getStringOption(e.relation,["orderedOccurrence","duplexPaginated","simplexPaginated"]);this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.occur=null;this.pageArea=new XFAObjectArray;this.pageSet=new XFAObjectArray}[zs](){for(const e of this.pageArea.children)e[zs]();for(const e of this.pageSet.children)e[zs]()}[Lr](){return!this.occur||-1===this.occur.max||this[ar].numberOfUse<this.occur.max}[dr](){this[ar]||(this[ar]={numberOfUse:1,pageIndex:-1,pageSetIndex:-1});if("orderedOccurrence"===this.relation){if(this[ar].pageIndex+1<this.pageArea.children.length){this[ar].pageIndex+=1;return this.pageArea.children[this[ar].pageIndex][dr]()}if(this[ar].pageSetIndex+1<this.pageSet.children.length){this[ar].pageSetIndex+=1;return this.pageSet.children[this[ar].pageSetIndex][dr]()}if(this[Lr]()){this[ar].numberOfUse+=1;this[ar].pageIndex=-1;this[ar].pageSetIndex=-1;return this[dr]()}const e=this[pr]();if(e instanceof PageSet)return e[dr]();this[zs]();return this[dr]()}const e=this[mr]()[ar].pageNumber,t=e%2==0?"even":"odd",i=0===e?"first":"rest";let a=this.pageArea.children.find((e=>e.oddOrEven===t&&e.pagePosition===i));if(a)return a;a=this.pageArea.children.find((e=>"any"===e.oddOrEven&&e.pagePosition===i));if(a)return a;a=this.pageArea.children.find((e=>"any"===e.oddOrEven&&"any"===e.pagePosition));return a||this.pageArea.children[0]}}class Para extends XFAObject{constructor(e){super(Hn,"para",!0);this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.lineHeight=e.lineHeight?getMeasurement(e.lineHeight,"0pt"):"";this.marginLeft=e.marginLeft?getMeasurement(e.marginLeft,"0pt"):"";this.marginRight=e.marginRight?getMeasurement(e.marginRight,"0pt"):"";this.orphans=getInteger({data:e.orphans,defaultValue:0,validate:e=>e>=0});this.preserve=e.preserve||"";this.radixOffset=e.radixOffset?getMeasurement(e.radixOffset,"0pt"):"";this.spaceAbove=e.spaceAbove?getMeasurement(e.spaceAbove,"0pt"):"";this.spaceBelow=e.spaceBelow?getMeasurement(e.spaceBelow,"0pt"):"";this.tabDefault=e.tabDefault?getMeasurement(this.tabDefault):"";this.tabStops=(e.tabStops||"").trim().split(/\s+/).map(((e,t)=>t%2==1?getMeasurement(e):e));this.textIndent=e.textIndent?getMeasurement(e.textIndent,"0pt"):"";this.use=e.use||"";this.usehref=e.usehref||"";this.vAlign=getStringOption(e.vAlign,["top","bottom","middle"]);this.widows=getInteger({data:e.widows,defaultValue:0,validate:e=>e>=0});this.hyphenation=null}[rn](){const e=toStyle(this,"hAlign");""!==this.marginLeft&&(e.paddingLeft=measureToString(this.marginLeft));""!==this.marginRight&&(e.paddingight=measureToString(this.marginRight));""!==this.spaceAbove&&(e.paddingTop=measureToString(this.spaceAbove));""!==this.spaceBelow&&(e.paddingBottom=measureToString(this.spaceBelow));if(""!==this.textIndent){e.textIndent=measureToString(this.textIndent);fixTextIndent(e)}this.lineHeight>0&&(e.lineHeight=measureToString(this.lineHeight));""!==this.tabDefault&&(e.tabSize=measureToString(this.tabDefault));this.tabStops.length;this.hyphenatation&&Object.assign(e,this.hyphenatation[rn]());return e}}class PasswordEdit extends XFAObject{constructor(e){super(Hn,"passwordEdit",!0);this.hScrollPolicy=getStringOption(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.passwordChar=e.passwordChar||"*";this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}}class template_Pattern extends XFAObject{constructor(e){super(Hn,"pattern",!0);this.id=e.id||"";this.type=getStringOption(e.type,["crossHatch","crossDiagonal","diagonalLeft","diagonalRight","horizontal","vertical"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[rn](e){e=e?e[rn]():"#FFFFFF";const t=this.color?this.color[rn]():"#000000",i="repeating-linear-gradient",a=`${e},${e} 5px,${t} 5px,${t} 10px`;switch(this.type){case"crossHatch":return`${i}(to top,${a}) ${i}(to right,${a})`;case"crossDiagonal":return`${i}(45deg,${a}) ${i}(-45deg,${a})`;case"diagonalLeft":return`${i}(45deg,${a})`;case"diagonalRight":return`${i}(-45deg,${a})`;case"horizontal":return`${i}(to top,${a})`;case"vertical":return`${i}(to right,${a})`}return""}}class Picture extends StringObject{constructor(e){super(Hn,"picture");this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Proto extends XFAObject{constructor(e){super(Hn,"proto",!0);this.appearanceFilter=new XFAObjectArray;this.arc=new XFAObjectArray;this.area=new XFAObjectArray;this.assist=new XFAObjectArray;this.barcode=new XFAObjectArray;this.bindItems=new XFAObjectArray;this.bookend=new XFAObjectArray;this.boolean=new XFAObjectArray;this.border=new XFAObjectArray;this.break=new XFAObjectArray;this.breakAfter=new XFAObjectArray;this.breakBefore=new XFAObjectArray;this.button=new XFAObjectArray;this.calculate=new XFAObjectArray;this.caption=new XFAObjectArray;this.certificate=new XFAObjectArray;this.certificates=new XFAObjectArray;this.checkButton=new XFAObjectArray;this.choiceList=new XFAObjectArray;this.color=new XFAObjectArray;this.comb=new XFAObjectArray;this.connect=new XFAObjectArray;this.contentArea=new XFAObjectArray;this.corner=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.dateTimeEdit=new XFAObjectArray;this.decimal=new XFAObjectArray;this.defaultUi=new XFAObjectArray;this.desc=new XFAObjectArray;this.digestMethod=new XFAObjectArray;this.digestMethods=new XFAObjectArray;this.draw=new XFAObjectArray;this.edge=new XFAObjectArray;this.encoding=new XFAObjectArray;this.encodings=new XFAObjectArray;this.encrypt=new XFAObjectArray;this.encryptData=new XFAObjectArray;this.encryption=new XFAObjectArray;this.encryptionMethod=new XFAObjectArray;this.encryptionMethods=new XFAObjectArray;this.event=new XFAObjectArray;this.exData=new XFAObjectArray;this.exObject=new XFAObjectArray;this.exclGroup=new XFAObjectArray;this.execute=new XFAObjectArray;this.extras=new XFAObjectArray;this.field=new XFAObjectArray;this.fill=new XFAObjectArray;this.filter=new XFAObjectArray;this.float=new XFAObjectArray;this.font=new XFAObjectArray;this.format=new XFAObjectArray;this.handler=new XFAObjectArray;this.hyphenation=new XFAObjectArray;this.image=new XFAObjectArray;this.imageEdit=new XFAObjectArray;this.integer=new XFAObjectArray;this.issuers=new XFAObjectArray;this.items=new XFAObjectArray;this.keep=new XFAObjectArray;this.keyUsage=new XFAObjectArray;this.line=new XFAObjectArray;this.linear=new XFAObjectArray;this.lockDocument=new XFAObjectArray;this.manifest=new XFAObjectArray;this.margin=new XFAObjectArray;this.mdp=new XFAObjectArray;this.medium=new XFAObjectArray;this.message=new XFAObjectArray;this.numericEdit=new XFAObjectArray;this.occur=new XFAObjectArray;this.oid=new XFAObjectArray;this.oids=new XFAObjectArray;this.overflow=new XFAObjectArray;this.pageArea=new XFAObjectArray;this.pageSet=new XFAObjectArray;this.para=new XFAObjectArray;this.passwordEdit=new XFAObjectArray;this.pattern=new XFAObjectArray;this.picture=new XFAObjectArray;this.radial=new XFAObjectArray;this.reason=new XFAObjectArray;this.reasons=new XFAObjectArray;this.rectangle=new XFAObjectArray;this.ref=new XFAObjectArray;this.script=new XFAObjectArray;this.setProperty=new XFAObjectArray;this.signData=new XFAObjectArray;this.signature=new XFAObjectArray;this.signing=new XFAObjectArray;this.solid=new XFAObjectArray;this.speak=new XFAObjectArray;this.stipple=new XFAObjectArray;this.subform=new XFAObjectArray;this.subformSet=new XFAObjectArray;this.subjectDN=new XFAObjectArray;this.subjectDNs=new XFAObjectArray;this.submit=new XFAObjectArray;this.text=new XFAObjectArray;this.textEdit=new XFAObjectArray;this.time=new XFAObjectArray;this.timeStamp=new XFAObjectArray;this.toolTip=new XFAObjectArray;this.traversal=new XFAObjectArray;this.traverse=new XFAObjectArray;this.ui=new XFAObjectArray;this.validate=new XFAObjectArray;this.value=new XFAObjectArray;this.variables=new XFAObjectArray}}class Radial extends XFAObject{constructor(e){super(Hn,"radial",!0);this.id=e.id||"";this.type=getStringOption(e.type,["toEdge","toCenter"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[rn](e){e=e?e[rn]():"#FFFFFF";const t=this.color?this.color[rn]():"#000000";return`radial-gradient(circle at center, ${"toEdge"===this.type?`${e},${t}`:`${t},${e}`})`}}class Reason extends StringObject{constructor(e){super(Hn,"reason");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Reasons extends XFAObject{constructor(e){super(Hn,"reasons",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.reason=new XFAObjectArray}}class Rectangle extends XFAObject{constructor(e){super(Hn,"rectangle",!0);this.hand=getStringOption(e.hand,["even","left","right"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.corner=new XFAObjectArray(4);this.edge=new XFAObjectArray(4);this.fill=null}[an](){const e=this.edge.children.length?this.edge.children[0]:new Edge({}),t=e[rn](),i=Object.create(null);"visible"===this.fill?.presence?Object.assign(i,this.fill[rn]()):i.fill="transparent";i.strokeWidth=measureToString("visible"===e.presence?e.thickness:0);i.stroke=t.color;const a=(this.corner.children.length?this.corner.children[0]:new Corner({}))[rn](),s={name:"svg",children:[{name:"rect",attributes:{xmlns:Jn,width:"100%",height:"100%",x:0,y:0,rx:a.radius,ry:a.radius,style:i}}],attributes:{xmlns:Jn,style:{overflow:"visible"},width:"100%",height:"100%"}};if(hasMargin(this[pr]()[pr]()))return HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[s]});s.attributes.style.position="absolute";return HTMLResult.success(s)}}class RefElement extends StringObject{constructor(e){super(Hn,"ref");this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Script extends StringObject{constructor(e){super(Hn,"script");this.binding=e.binding||"";this.contentType=e.contentType||"";this.id=e.id||"";this.name=e.name||"";this.runAt=getStringOption(e.runAt,["client","both","server"]);this.use=e.use||"";this.usehref=e.usehref||""}}class SetProperty extends XFAObject{constructor(e){super(Hn,"setProperty");this.connection=e.connection||"";this.ref=e.ref||"";this.target=e.target||""}}class SignData extends XFAObject{constructor(e){super(Hn,"signData",!0);this.id=e.id||"";this.operation=getStringOption(e.operation,["sign","clear","verify"]);this.ref=e.ref||"";this.target=e.target||"";this.use=e.use||"";this.usehref=e.usehref||"";this.filter=null;this.manifest=null}}class Signature extends XFAObject{constructor(e){super(Hn,"signature",!0);this.id=e.id||"";this.type=getStringOption(e.type,["PDF1.3","PDF1.6"]);this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.filter=null;this.manifest=null;this.margin=null}}class Signing extends XFAObject{constructor(e){super(Hn,"signing",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new XFAObjectArray}}class Solid extends XFAObject{constructor(e){super(Hn,"solid",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[rn](e){return e?e[rn]():"#FFFFFF"}}class Speak extends StringObject{constructor(e){super(Hn,"speak");this.disable=getInteger({data:e.disable,defaultValue:0,validate:e=>1===e});this.id=e.id||"";this.priority=getStringOption(e.priority,["custom","caption","name","toolTip"]);this.rid=e.rid||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Stipple extends XFAObject{constructor(e){super(Hn,"stipple",!0);this.id=e.id||"";this.rate=getInteger({data:e.rate,defaultValue:50,validate:e=>e>=0&&e<=100});this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[rn](e){const t=this.rate/100;return Util.makeHexColor(Math.round(e.value.r*(1-t)+this.value.r*t),Math.round(e.value.g*(1-t)+this.value.g*t),Math.round(e.value.b*(1-t)+this.value.b*t))}}class Subform extends XFAObject{constructor(e){super(Hn,"subform",!0);this.access=getStringOption(e.access,["open","nonInteractive","protected","readOnly"]);this.allowMacro=getInteger({data:e.allowMacro,defaultValue:0,validate:e=>1===e});this.anchorType=getStringOption(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=getInteger({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.columnWidths=(e.columnWidths||"").trim().split(/\s+/).map((e=>"-1"===e?-1:getMeasurement(e)));this.h=e.h?getMeasurement(e.h):"";this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.layout=getStringOption(e.layout,["position","lr-tb","rl-row","rl-tb","row","table","tb"]);this.locale=e.locale||"";this.maxH=getMeasurement(e.maxH,"0pt");this.maxW=getMeasurement(e.maxW,"0pt");this.mergeMode=getStringOption(e.mergeMode,["consumeData","matchTemplate"]);this.minH=getMeasurement(e.minH,"0pt");this.minW=getMeasurement(e.minW,"0pt");this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.restoreState=getStringOption(e.restoreState,["manual","auto"]);this.scope=getStringOption(e.scope,["name","none"]);this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?getMeasurement(e.w):"";this.x=getMeasurement(e.x,"0pt");this.y=getMeasurement(e.y,"0pt");this.assist=null;this.bind=null;this.bookend=null;this.border=null;this.break=null;this.calculate=null;this.desc=null;this.extras=null;this.keep=null;this.margin=null;this.occur=null;this.overflow=null;this.pageSet=null;this.para=null;this.traversal=null;this.validate=null;this.variables=null;this.area=new XFAObjectArray;this.breakAfter=new XFAObjectArray;this.breakBefore=new XFAObjectArray;this.connect=new XFAObjectArray;this.draw=new XFAObjectArray;this.event=new XFAObjectArray;this.exObject=new XFAObjectArray;this.exclGroup=new XFAObjectArray;this.field=new XFAObjectArray;this.proto=new XFAObjectArray;this.setProperty=new XFAObjectArray;this.subform=new XFAObjectArray;this.subformSet=new XFAObjectArray}[fr](){const e=this[pr]();return e instanceof SubformSet?e[fr]():e}[kr](){return!0}[Ur](){return this.layout.endsWith("-tb")&&0===this[ar].attempt&&this[ar].numberInLine>0||this[pr]()[Ur]()}*[ur](){yield*getContainedChildren(this)}[rr](){return flushHTML(this)}[js](e,t){addHTML(this,e,t)}[or](){return getAvailableSpace(this)}[xr](){const e=this[fr]();if(!e[xr]())return!1;if(void 0!==this[ar]._isSplittable)return this[ar]._isSplittable;if("position"===this.layout||this.layout.includes("row")){this[ar]._isSplittable=!1;return!1}if(this.keep&&"none"!==this.keep.intact){this[ar]._isSplittable=!1;return!1}if(e.layout?.endsWith("-tb")&&0!==e[ar].numberInLine)return!1;this[ar]._isSplittable=!0;return!0}[an](e){setTabIndex(this);if(this.break){if("auto"!==this.break.after||""!==this.break.afterTarget){const e=new BreakAfter({targetType:this.break.after,target:this.break.afterTarget,startNew:this.break.startNew.toString()});e[yr]=this[yr];this[Xs](e);this.breakAfter.push(e)}if("auto"!==this.break.before||""!==this.break.beforeTarget){const e=new BreakBefore({targetType:this.break.before,target:this.break.beforeTarget,startNew:this.break.startNew.toString()});e[yr]=this[yr];this[Xs](e);this.breakBefore.push(e)}if(""!==this.break.overflowTarget){const e=new Overflow({target:this.break.overflowTarget,leader:this.break.overflowLeader,trailer:this.break.overflowTrailer});e[yr]=this[yr];this[Xs](e);this.overflow.push(e)}this[jr](this.break);this.break=null}if("hidden"===this.presence||"inactive"===this.presence)return HTMLResult.EMPTY;(this.breakBefore.children.length>1||this.breakAfter.children.length>1)&&warn("XFA - Several breakBefore or breakAfter in subforms: please file a bug.");if(this.breakBefore.children.length>=1){const e=this.breakBefore.children[0];if(handleBreak(e))return HTMLResult.breakNode(e)}if(this[ar]?.afterBreakAfter)return HTMLResult.EMPTY;fixDimensions(this);const t=[],i={id:this[nn],class:[]};setAccess(this,i.class);this[ar]||(this[ar]=Object.create(null));Object.assign(this[ar],{children:t,line:null,attributes:i,attempt:0,numberInLine:0,availableSpace:{width:Math.min(this.w||1/0,e.width),height:Math.min(this.h||1/0,e.height)},width:0,height:0,prevHeight:0,currentWidth:0});const a=this[mr](),s=a[ar].noLayoutFailure,r=this[xr]();r||setFirstUnsplittable(this);if(!checkDimensions(this,e))return HTMLResult.FAILURE;const n=new Set(["area","draw","exclGroup","field","subform","subformSet"]);if(this.layout.includes("row")){const e=this[fr]().columnWidths;if(Array.isArray(e)&&e.length>0){this[ar].columnWidths=e;this[ar].currentColumn=0}}const g=toStyle(this,"anchorType","dimensions","position","presence","border","margin","hAlign"),o=["xfaSubform"],c=layoutClass(this);c&&o.push(c);i.style=g;i.class=o;this.name&&(i.xfaName=this.name);if(this.overflow){const t=this.overflow[lr]();if(t.addLeader){t.addLeader=!1;handleOverflow(this,t.leader,e)}}this[Wr]();const C="lr-tb"===this.layout||"rl-tb"===this.layout,h=C?2:1;for(;this[ar].attempt<h;this[ar].attempt++){C&&1===this[ar].attempt&&(this[ar].numberInLine=0);const e=this[Zs]({filter:n,include:!0});if(e.success)break;if(e.isBreak()){this[Pr]();return e}if(C&&0===this[ar].attempt&&0===this[ar].numberInLine&&!a[ar].noLayoutFailure){this[ar].attempt=h;break}}this[Pr]();r||unsetFirstUnsplittable(this);a[ar].noLayoutFailure=s;if(this[ar].attempt===h){this.overflow&&(this[mr]()[ar].overflowNode=this.overflow);r||delete this[ar];return HTMLResult.FAILURE}if(this.overflow){const t=this.overflow[lr]();if(t.addTrailer){t.addTrailer=!1;handleOverflow(this,t.trailer,e)}}let l=0,Q=0;if(this.margin){l=this.margin.leftInset+this.margin.rightInset;Q=this.margin.topInset+this.margin.bottomInset}const E=Math.max(this[ar].width+l,this.w||0),u=Math.max(this[ar].height+Q,this.h||0),d=[this.x,this.y,E,u];""===this.w&&(g.width=measureToString(E));""===this.h&&(g.height=measureToString(u));if(("0px"===g.width||"0px"===g.height)&&0===t.length)return HTMLResult.EMPTY;const f={name:"div",attributes:i,children:t};applyAssist(this,i);const p=HTMLResult.success(createWrapper(this,f),d);if(this.breakAfter.children.length>=1){const e=this.breakAfter.children[0];if(handleBreak(e)){this[ar].afterBreakAfter=p;return HTMLResult.breakNode(e)}}delete this[ar];return p}}class SubformSet extends XFAObject{constructor(e){super(Hn,"subformSet",!0);this.id=e.id||"";this.name=e.name||"";this.relation=getStringOption(e.relation,["ordered","choice","unordered"]);this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.bookend=null;this.break=null;this.desc=null;this.extras=null;this.occur=null;this.overflow=null;this.breakAfter=new XFAObjectArray;this.breakBefore=new XFAObjectArray;this.subform=new XFAObjectArray;this.subformSet=new XFAObjectArray}*[ur](){yield*getContainedChildren(this)}[fr](){let e=this[pr]();for(;!(e instanceof Subform);)e=e[pr]();return e}[kr](){return!0}}class SubjectDN extends ContentObject{constructor(e){super(Hn,"subjectDN");this.delimiter=e.delimiter||",";this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[sr](){this[er]=new Map(this[er].split(this.delimiter).map((e=>{(e=e.split("=",2))[0]=e[0].trim();return e})))}}class SubjectDNs extends XFAObject{constructor(e){super(Hn,"subjectDNs",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.subjectDN=new XFAObjectArray}}class Submit extends XFAObject{constructor(e){super(Hn,"submit",!0);this.embedPDF=getInteger({data:e.embedPDF,defaultValue:0,validate:e=>1===e});this.format=getStringOption(e.format,["xdp","formdata","pdf","urlencoded","xfd","xml"]);this.id=e.id||"";this.target=e.target||"";this.textEncoding=getKeyword({data:e.textEncoding?e.textEncoding.toLowerCase():"",defaultValue:"",validate:e=>["utf-8","big-five","fontspecific","gbk","gb-18030","gb-2312","ksc-5601","none","shift-jis","ucs-2","utf-16"].includes(e)||e.match(/iso-8859-\d{2}/)});this.use=e.use||"";this.usehref=e.usehref||"";this.xdpContent=e.xdpContent||"";this.encrypt=null;this.encryptData=new XFAObjectArray;this.signData=new XFAObjectArray}}class Template extends XFAObject{constructor(e){super(Hn,"template",!0);this.baseProfile=getStringOption(e.baseProfile,["full","interactiveForms"]);this.extras=null;this.subform=new XFAObjectArray}[sr](){0===this.subform.children.length&&warn("XFA - No subforms in template node.");this.subform.children.length>=2&&warn("XFA - Several subforms in template node: please file a bug.");this[An]=5e3}[xr](){return!0}[Vr](e,t){return e.startsWith("#")?[this[Dr].get(e.slice(1))]:searchNode(this,t,e,!0,!0)}*[tn](){if(!this.subform.children.length)return HTMLResult.success({name:"div",children:[]});this[ar]={overflowNode:null,firstUnsplittable:null,currentContentArea:null,currentPageArea:null,noLayoutFailure:!1,pageNumber:1,pagePosition:"first",oddOrEven:"odd",blankOrNotBlank:"nonBlank",paraStack:[]};const e=this.subform.children[0];e.pageSet[zs]();const t=e.pageSet.pageArea.children,i={name:"div",children:[]};let a=null,s=null,r=null;if(e.breakBefore.children.length>=1){s=e.breakBefore.children[0];r=s.target}else if(e.subform.children.length>=1&&e.subform.children[0].breakBefore.children.length>=1){s=e.subform.children[0].breakBefore.children[0];r=s.target}else if(e.break?.beforeTarget){s=e.break;r=s.beforeTarget}else if(e.subform.children.length>=1&&e.subform.children[0].break?.beforeTarget){s=e.subform.children[0].break;r=s.beforeTarget}if(s){const e=this[Vr](r,s[pr]());if(e instanceof PageArea){a=e;s[ar]={}}}a||(a=t[0]);a[ar]={numberOfUse:1};const n=a[pr]();n[ar]={numberOfUse:1,pageIndex:n.pageArea.children.indexOf(a),pageSetIndex:0};let g,o=null,c=null,C=!0,h=0,l=0;for(;;){if(C)h=0;else{i.children.pop();if(3==++h){warn("XFA - Something goes wrong: please file a bug.");return i}}g=null;this[ar].currentPageArea=a;const t=a[an]().html;i.children.push(t);if(o){this[ar].noLayoutFailure=!0;t.children.push(o[an](a[ar].space).html);o=null}if(c){this[ar].noLayoutFailure=!0;t.children.push(c[an](a[ar].space).html);c=null}const s=a.contentArea.children,r=t.children.filter((e=>e.attributes.class.includes("xfaContentarea")));C=!1;this[ar].firstUnsplittable=null;this[ar].noLayoutFailure=!1;const flush=t=>{const i=e[rr]();if(i){C||=i.children?.length>0;r[t].children.push(i)}};for(let t=l,a=s.length;t<a;t++){const a=this[ar].currentContentArea=s[t],n={width:a.w,height:a.h};l=0;if(o){r[t].children.push(o[an](n).html);o=null}if(c){r[t].children.push(c[an](n).html);c=null}const h=e[an](n);if(h.success){if(h.html){C||=h.html.children?.length>0;r[t].children.push(h.html)}else!C&&i.children.length>1&&i.children.pop();return i}if(h.isBreak()){const e=h.breakNode;flush(t);if("auto"===e.targetType)continue;if(e.leader){o=this[Vr](e.leader,e[pr]());o=o?o[0]:null}if(e.trailer){c=this[Vr](e.trailer,e[pr]());c=c?c[0]:null}if("pageArea"===e.targetType){g=e[ar].target;t=1/0}else if(e[ar].target){g=e[ar].target;l=e[ar].index+1;t=1/0}else t=e[ar].index}else if(this[ar].overflowNode){const e=this[ar].overflowNode;this[ar].overflowNode=null;const i=e[lr](),a=i.target;i.addLeader=null!==i.leader;i.addTrailer=null!==i.trailer;flush(t);const r=t;t=1/0;if(a instanceof PageArea)g=a;else if(a instanceof ContentArea){const e=s.indexOf(a);if(-1!==e)e>r?t=e-1:l=e;else{g=a[pr]();l=g.contentArea.children.indexOf(a)}}}else flush(t)}this[ar].pageNumber+=1;g&&(g[Lr]()?g[ar].numberOfUse+=1:g=null);a=g||a[dr]();yield null}}}class Text extends ContentObject{constructor(e){super(Hn,"text");this.id=e.id||"";this.maxChars=getInteger({data:e.maxChars,defaultValue:0,validate:e=>e>=0});this.name=e.name||"";this.rid=e.rid||"";this.use=e.use||"";this.usehref=e.usehref||""}[Ws](){return!0}[Kr](e){if(e[Jr]===on.xhtml.id){this[er]=e;return!0}warn(`XFA - Invalid content in Text: ${e[Yr]}.`);return!1}[qr](e){this[er]instanceof XFAObject||super[qr](e)}[sr](){"string"==typeof this[er]&&(this[er]=this[er].replaceAll("\r\n","\n"))}[lr](){return"string"==typeof this[er]?this[er].split(/[\u2029\u2028\n]/).reduce(((e,t)=>{t&&e.push(t);return e}),[]).join("\n"):this[er][en]()}[an](e){if("string"==typeof this[er]){const e=valueToHtml(this[er]).html;if(this[er].includes("\u2029")){e.name="div";e.children=[];this[er].split("\u2029").map((e=>e.split(/[\u2028\n]/).reduce(((e,t)=>{e.push({name:"span",value:t},{name:"br"});return e}),[]))).forEach((t=>{e.children.push({name:"p",children:t})}))}else if(/[\u2028\n]/.test(this[er])){e.name="div";e.children=[];this[er].split(/[\u2028\n]/).forEach((t=>{e.children.push({name:"span",value:t},{name:"br"})}))}return HTMLResult.success(e)}return this[er][an](e)}}class TextEdit extends XFAObject{constructor(e){super(Hn,"textEdit",!0);this.allowRichText=getInteger({data:e.allowRichText,defaultValue:0,validate:e=>1===e});this.hScrollPolicy=getStringOption(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.multiLine=getInteger({data:e.multiLine,defaultValue:"",validate:e=>0===e||1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.vScrollPolicy=getStringOption(e.vScrollPolicy,["auto","off","on"]);this.border=null;this.comb=null;this.extras=null;this.margin=null}[an](e){const t=toStyle(this,"border","font","margin");let i;const a=this[pr]()[pr]();""===this.multiLine&&(this.multiLine=a instanceof Draw?1:0);i=1===this.multiLine?{name:"textarea",attributes:{dataId:a[tr]?.[nn]||a[nn],fieldId:a[nn],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(a),"aria-required":!1}}:{name:"input",attributes:{type:"text",dataId:a[tr]?.[nn]||a[nn],fieldId:a[nn],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(a),"aria-required":!1}};if(isRequired(a)){i.attributes["aria-required"]=!0;i.attributes.required=!0}return HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[i]})}}class Time extends StringObject{constructor(e){super(Hn,"time");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[sr](){const e=this[er].trim();this[er]=e?new Date(e):null}[an](e){return valueToHtml(this[er]?this[er].toString():"")}}class TimeStamp extends XFAObject{constructor(e){super(Hn,"timeStamp");this.id=e.id||"";this.server=e.server||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class ToolTip extends StringObject{constructor(e){super(Hn,"toolTip");this.id=e.id||"";this.rid=e.rid||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Traversal extends XFAObject{constructor(e){super(Hn,"traversal",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.traverse=new XFAObjectArray}}class Traverse extends XFAObject{constructor(e){super(Hn,"traverse",!0);this.id=e.id||"";this.operation=getStringOption(e.operation,["next","back","down","first","left","right","up"]);this.ref=e.ref||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.script=null}get name(){return this.operation}[Mr](){return!1}}class Ui extends XFAObject{constructor(e){super(Hn,"ui",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.picture=null;this.barcode=null;this.button=null;this.checkButton=null;this.choiceList=null;this.dateTimeEdit=null;this.defaultUi=null;this.imageEdit=null;this.numericEdit=null;this.passwordEdit=null;this.signature=null;this.textEdit=null}[lr](){if(void 0===this[ar]){for(const e of Object.getOwnPropertyNames(this)){if("extras"===e||"picture"===e)continue;const t=this[e];if(t instanceof XFAObject){this[ar]=t;return t}}this[ar]=null}return this[ar]}[an](e){const t=this[lr]();return t?t[an](e):HTMLResult.EMPTY}}class Validate extends XFAObject{constructor(e){super(Hn,"validate",!0);this.formatTest=getStringOption(e.formatTest,["warning","disabled","error"]);this.id=e.id||"";this.nullTest=getStringOption(e.nullTest,["disabled","error","warning"]);this.scriptTest=getStringOption(e.scriptTest,["error","disabled","warning"]);this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.message=null;this.picture=null;this.script=null}}class Value extends XFAObject{constructor(e){super(Hn,"value",!0);this.id=e.id||"";this.override=getInteger({data:e.override,defaultValue:0,validate:e=>1===e});this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.arc=null;this.boolean=null;this.date=null;this.dateTime=null;this.decimal=null;this.exData=null;this.float=null;this.image=null;this.integer=null;this.line=null;this.rectangle=null;this.text=null;this.time=null}[$r](e){const t=this[pr]();if(t instanceof Field&&t.ui?.imageEdit){if(!this.image){this.image=new Image({});this[Xs](this.image)}this.image[er]=e[er];return}const i=e[Yr];if(null===this[i]){for(const e of Object.getOwnPropertyNames(this)){const t=this[e];if(t instanceof XFAObject){this[e]=null;this[jr](t)}}this[e[Yr]]=e;this[Xs](e)}else this[i][er]=e[er]}[en](){if(this.exData)return"string"==typeof this.exData[er]?this.exData[er].trim():this.exData[er][en]().trim();for(const e of Object.getOwnPropertyNames(this)){if("image"===e)continue;const t=this[e];if(t instanceof XFAObject)return(t[er]||"").toString().trim()}return null}[an](e){for(const t of Object.getOwnPropertyNames(this)){const i=this[t];if(i instanceof XFAObject)return i[an](e)}return HTMLResult.EMPTY}}class Variables extends XFAObject{constructor(e){super(Hn,"variables",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.decimal=new XFAObjectArray;this.exData=new XFAObjectArray;this.float=new XFAObjectArray;this.image=new XFAObjectArray;this.integer=new XFAObjectArray;this.manifest=new XFAObjectArray;this.script=new XFAObjectArray;this.text=new XFAObjectArray;this.time=new XFAObjectArray}[Mr](){return!0}}class TemplateNamespace{static[gn](e,t){if(TemplateNamespace.hasOwnProperty(e)){const i=TemplateNamespace[e](t);i[_r](t);return i}}static appearanceFilter(e){return new AppearanceFilter(e)}static arc(e){return new Arc(e)}static area(e){return new Area(e)}static assist(e){return new Assist(e)}static barcode(e){return new Barcode(e)}static bind(e){return new Bind(e)}static bindItems(e){return new BindItems(e)}static bookend(e){return new Bookend(e)}static boolean(e){return new BooleanElement(e)}static border(e){return new Border(e)}static break(e){return new Break(e)}static breakAfter(e){return new BreakAfter(e)}static breakBefore(e){return new BreakBefore(e)}static button(e){return new Button(e)}static calculate(e){return new Calculate(e)}static caption(e){return new Caption(e)}static certificate(e){return new Certificate(e)}static certificates(e){return new Certificates(e)}static checkButton(e){return new CheckButton(e)}static choiceList(e){return new ChoiceList(e)}static color(e){return new Color(e)}static comb(e){return new Comb(e)}static connect(e){return new Connect(e)}static contentArea(e){return new ContentArea(e)}static corner(e){return new Corner(e)}static date(e){return new DateElement(e)}static dateTime(e){return new DateTime(e)}static dateTimeEdit(e){return new DateTimeEdit(e)}static decimal(e){return new Decimal(e)}static defaultUi(e){return new DefaultUi(e)}static desc(e){return new Desc(e)}static digestMethod(e){return new DigestMethod(e)}static digestMethods(e){return new DigestMethods(e)}static draw(e){return new Draw(e)}static edge(e){return new Edge(e)}static encoding(e){return new Encoding(e)}static encodings(e){return new Encodings(e)}static encrypt(e){return new Encrypt(e)}static encryptData(e){return new EncryptData(e)}static encryption(e){return new Encryption(e)}static encryptionMethod(e){return new EncryptionMethod(e)}static encryptionMethods(e){return new EncryptionMethods(e)}static event(e){return new Event(e)}static exData(e){return new ExData(e)}static exObject(e){return new ExObject(e)}static exclGroup(e){return new ExclGroup(e)}static execute(e){return new Execute(e)}static extras(e){return new Extras(e)}static field(e){return new Field(e)}static fill(e){return new Fill(e)}static filter(e){return new Filter(e)}static float(e){return new Float(e)}static font(e){return new template_Font(e)}static format(e){return new Format(e)}static handler(e){return new Handler(e)}static hyphenation(e){return new Hyphenation(e)}static image(e){return new Image(e)}static imageEdit(e){return new ImageEdit(e)}static integer(e){return new Integer(e)}static issuers(e){return new Issuers(e)}static items(e){return new Items(e)}static keep(e){return new Keep(e)}static keyUsage(e){return new KeyUsage(e)}static line(e){return new Line(e)}static linear(e){return new Linear(e)}static lockDocument(e){return new LockDocument(e)}static manifest(e){return new Manifest(e)}static margin(e){return new Margin(e)}static mdp(e){return new Mdp(e)}static medium(e){return new Medium(e)}static message(e){return new Message(e)}static numericEdit(e){return new NumericEdit(e)}static occur(e){return new Occur(e)}static oid(e){return new Oid(e)}static oids(e){return new Oids(e)}static overflow(e){return new Overflow(e)}static pageArea(e){return new PageArea(e)}static pageSet(e){return new PageSet(e)}static para(e){return new Para(e)}static passwordEdit(e){return new PasswordEdit(e)}static pattern(e){return new template_Pattern(e)}static picture(e){return new Picture(e)}static proto(e){return new Proto(e)}static radial(e){return new Radial(e)}static reason(e){return new Reason(e)}static reasons(e){return new Reasons(e)}static rectangle(e){return new Rectangle(e)}static ref(e){return new RefElement(e)}static script(e){return new Script(e)}static setProperty(e){return new SetProperty(e)}static signData(e){return new SignData(e)}static signature(e){return new Signature(e)}static signing(e){return new Signing(e)}static solid(e){return new Solid(e)}static speak(e){return new Speak(e)}static stipple(e){return new Stipple(e)}static subform(e){return new Subform(e)}static subformSet(e){return new SubformSet(e)}static subjectDN(e){return new SubjectDN(e)}static subjectDNs(e){return new SubjectDNs(e)}static submit(e){return new Submit(e)}static template(e){return new Template(e)}static text(e){return new Text(e)}static textEdit(e){return new TextEdit(e)}static time(e){return new Time(e)}static timeStamp(e){return new TimeStamp(e)}static toolTip(e){return new ToolTip(e)}static traversal(e){return new Traversal(e)}static traverse(e){return new Traverse(e)}static ui(e){return new Ui(e)}static validate(e){return new Validate(e)}static value(e){return new Value(e)}static variables(e){return new Variables(e)}}const Tn=on.datasets.id;function createText(e){const t=new Text({});t[er]=e;return t}class Binder{constructor(e){this.root=e;this.datasets=e.datasets;this.data=e.datasets?.data||new XmlObject(on.datasets.id,"data");this.emptyMerge=0===this.data[Er]().length;this.root.form=this.form=e.template[$s]()}_isConsumeData(){return!this.emptyMerge&&this._mergeMode}_isMatchTemplate(){return!this._isConsumeData()}bind(){this._bindElement(this.form,this.data);return this.form}getData(){return this.data}_bindValue(e,t,i){e[tr]=t;if(e[wr]())if(t[Rr]()){const i=t[hr]();e[$r](createText(i))}else if(e instanceof Field&&"multiSelect"===e.ui?.choiceList?.open){const i=t[Er]().map((e=>e[er].trim())).join("\n");e[$r](createText(i))}else this._isConsumeData()&&warn("XFA - Nodes haven't the same type.");else!t[Rr]()||this._isMatchTemplate()?this._bindElement(e,t):warn("XFA - Nodes haven't the same type.")}_findDataByNameToConsume(e,t,i,a){if(!e)return null;let s,r;for(let a=0;a<3;a++){s=i[Qr](e,!1,!0);for(;;){r=s.next().value;if(!r)break;if(t===r[Rr]())return r}if(i[Jr]===on.datasets.id&&"data"===i[Yr])break;i=i[pr]()}if(!a)return null;s=this.data[Qr](e,!0,!1);r=s.next().value;if(r)return r;s=this.data[nr](e,!0);r=s.next().value;return r?.[Rr]()?r:null}_setProperties(e,t){if(e.hasOwnProperty("setProperty"))for(const{ref:i,target:a,connection:s}of e.setProperty.children){if(s)continue;if(!i)continue;const r=searchNode(this.root,t,i,!1,!1);if(!r){warn(`XFA - Invalid reference: ${i}.`);continue}const[n]=r;if(!n[Nr](this.data)){warn("XFA - Invalid node: must be a data node.");continue}const g=searchNode(this.root,e,a,!1,!1);if(!g){warn(`XFA - Invalid target: ${a}.`);continue}const[o]=g;if(!o[Nr](e)){warn("XFA - Invalid target: must be a property or subproperty.");continue}const c=o[pr]();if(o instanceof SetProperty||c instanceof SetProperty){warn("XFA - Invalid target: cannot be a setProperty or one of its properties.");continue}if(o instanceof BindItems||c instanceof BindItems){warn("XFA - Invalid target: cannot be a bindItems or one of its properties.");continue}const C=n[en](),h=o[Yr];if(o instanceof XFAAttribute){const e=Object.create(null);e[h]=C;const t=Reflect.construct(Object.getPrototypeOf(c).constructor,[e]);c[h]=t[h]}else if(o.hasOwnProperty(er)){o[tr]=n;o[er]=C;o[sr]()}else warn("XFA - Invalid node to use in setProperty")}}_bindItems(e,t){if(!e.hasOwnProperty("items")||!e.hasOwnProperty("bindItems")||e.bindItems.isEmpty())return;for(const t of e.items.children)e[jr](t);e.items.clear();const i=new Items({}),a=new Items({});e[Xs](i);e.items.push(i);e[Xs](a);e.items.push(a);for(const{ref:s,labelRef:r,valueRef:n,connection:g}of e.bindItems.children){if(g)continue;if(!s)continue;const e=searchNode(this.root,t,s,!1,!1);if(e)for(const t of e){if(!t[Nr](this.datasets)){warn(`XFA - Invalid ref (${s}): must be a datasets child.`);continue}const e=searchNode(this.root,t,r,!0,!1);if(!e){warn(`XFA - Invalid label: ${r}.`);continue}const[g]=e;if(!g[Nr](this.datasets)){warn("XFA - Invalid label: must be a datasets child.");continue}const o=searchNode(this.root,t,n,!0,!1);if(!o){warn(`XFA - Invalid value: ${n}.`);continue}const[c]=o;if(!c[Nr](this.datasets)){warn("XFA - Invalid value: must be a datasets child.");continue}const C=createText(g[en]()),h=createText(c[en]());i[Xs](C);i.text.push(C);a[Xs](h);a.text.push(h)}else warn(`XFA - Invalid reference: ${s}.`)}}_bindOccurrences(e,t,i){let a;if(t.length>1){a=e[$s]();a[jr](a.occur);a.occur=null}this._bindValue(e,t[0],i);this._setProperties(e,t[0]);this._bindItems(e,t[0]);if(1===t.length)return;const s=e[pr](),r=e[Yr],n=s[br](e);for(let e=1,g=t.length;e<g;e++){const g=t[e],o=a[$s]();s[r].push(o);s[Fr](n+e,o);this._bindValue(o,g,i);this._setProperties(o,g);this._bindItems(o,g)}}_createOccurrences(e){if(!this.emptyMerge)return;const{occur:t}=e;if(!t||t.initial<=1)return;const i=e[pr](),a=e[Yr];if(!(i[a]instanceof XFAObjectArray))return;let s;s=e.name?i[a].children.filter((t=>t.name===e.name)).length:i[a].children.length;const r=i[br](e)+1,n=t.initial-s;if(n){const t=e[$s]();t[jr](t.occur);t.occur=null;i[a].push(t);i[Fr](r,t);for(let e=1;e<n;e++){const s=t[$s]();i[a].push(s);i[Fr](r+e,s)}}}_getOccurInfo(e){const{name:t,occur:i}=e;if(!i||!t)return[1,1];const a=-1===i.max?1/0:i.max;return[i.min,a]}_setAndBind(e,t){this._setProperties(e,t);this._bindItems(e,t);this._bindElement(e,t)}_bindElement(e,t){const i=[];this._createOccurrences(e);for(const a of e[Er]()){if(a[tr])continue;if(void 0===this._mergeMode&&"subform"===a[Yr]){this._mergeMode="consumeData"===a.mergeMode;const e=t[Er]();if(e.length>0)this._bindOccurrences(a,[e[0]],null);else if(this.emptyMerge){const e=t[Jr]===Tn?-1:t[Jr],i=a[tr]=new XmlObject(e,a.name||"root");t[Xs](i);this._bindElement(a,i)}continue}if(!a[kr]())continue;let e=!1,s=null,r=null,n=null;if(a.bind){switch(a.bind.match){case"none":this._setAndBind(a,t);continue;case"global":e=!0;break;case"dataRef":if(!a.bind.ref){warn(`XFA - ref is empty in node ${a[Yr]}.`);this._setAndBind(a,t);continue}r=a.bind.ref}a.bind.picture&&(s=a.bind.picture[er])}const[g,o]=this._getOccurInfo(a);if(r){n=searchNode(this.root,t,r,!0,!1);if(null===n){n=createDataNode(this.data,t,r);if(!n)continue;this._isConsumeData()&&(n[Ar]=!0);this._setAndBind(a,n);continue}this._isConsumeData()&&(n=n.filter((e=>!e[Ar])));n.length>o?n=n.slice(0,o):0===n.length&&(n=null);n&&this._isConsumeData()&&n.forEach((e=>{e[Ar]=!0}))}else{if(!a.name){this._setAndBind(a,t);continue}if(this._isConsumeData()){const i=[];for(;i.length<o;){const s=this._findDataByNameToConsume(a.name,a[wr](),t,e);if(!s)break;s[Ar]=!0;i.push(s)}n=i.length>0?i:null}else{n=t[Qr](a.name,!1,this.emptyMerge).next().value;if(!n){if(0===g){i.push(a);continue}const e=t[Jr]===Tn?-1:t[Jr];n=a[tr]=new XmlObject(e,a.name);this.emptyMerge&&(n[Ar]=!0);t[Xs](n);this._setAndBind(a,n);continue}this.emptyMerge&&(n[Ar]=!0);n=[n]}}n?this._bindOccurrences(a,n,s):g>0?this._setAndBind(a,t):i.push(a)}i.forEach((e=>e[pr]()[jr](e)))}}class DataHandler{constructor(e,t){this.data=t;this.dataset=e.datasets||null}serialize(e){const t=[[-1,this.data[Er]()]];for(;t.length>0;){const i=t.at(-1),[a,s]=i;if(a+1===s.length){t.pop();continue}const r=s[++i[0]],n=e.get(r[nn]);if(n)r[$r](n);else{const t=r[gr]();for(const i of t.values()){const t=e.get(i[nn]);if(t){i[$r](t);break}}}const g=r[Er]();g.length>0&&t.push([-1,g])}const i=['<xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">'];if(this.dataset)for(const e of this.dataset[Er]())"data"!==e[Yr]&&e[sn](i);this.data[sn](i);i.push("</xfa:datasets>");return i.join("")}}const qn=on.config.id;class Acrobat extends XFAObject{constructor(e){super(qn,"acrobat",!0);this.acrobat7=null;this.autoSave=null;this.common=null;this.validate=null;this.validateApprovalSignatures=null;this.submitUrl=new XFAObjectArray}}class Acrobat7 extends XFAObject{constructor(e){super(qn,"acrobat7",!0);this.dynamicRender=null}}class ADBE_JSConsole extends OptionObject{constructor(e){super(qn,"ADBE_JSConsole",["delegate","Enable","Disable"])}}class ADBE_JSDebugger extends OptionObject{constructor(e){super(qn,"ADBE_JSDebugger",["delegate","Enable","Disable"])}}class AddSilentPrint extends Option01{constructor(e){super(qn,"addSilentPrint")}}class AddViewerPreferences extends Option01{constructor(e){super(qn,"addViewerPreferences")}}class AdjustData extends Option10{constructor(e){super(qn,"adjustData")}}class AdobeExtensionLevel extends IntegerObject{constructor(e){super(qn,"adobeExtensionLevel",0,(e=>e>=1&&e<=8))}}class Agent extends XFAObject{constructor(e){super(qn,"agent",!0);this.name=e.name?e.name.trim():"";this.common=new XFAObjectArray}}class AlwaysEmbed extends ContentObject{constructor(e){super(qn,"alwaysEmbed")}}class Amd extends StringObject{constructor(e){super(qn,"amd")}}class config_Area extends XFAObject{constructor(e){super(qn,"area");this.level=getInteger({data:e.level,defaultValue:0,validate:e=>e>=1&&e<=3});this.name=getStringOption(e.name,["","barcode","coreinit","deviceDriver","font","general","layout","merge","script","signature","sourceSet","templateCache"])}}class Attributes extends OptionObject{constructor(e){super(qn,"attributes",["preserve","delegate","ignore"])}}class AutoSave extends OptionObject{constructor(e){super(qn,"autoSave",["disabled","enabled"])}}class Base extends StringObject{constructor(e){super(qn,"base")}}class BatchOutput extends XFAObject{constructor(e){super(qn,"batchOutput");this.format=getStringOption(e.format,["none","concat","zip","zipCompress"])}}class BehaviorOverride extends ContentObject{constructor(e){super(qn,"behaviorOverride")}[sr](){this[er]=new Map(this[er].trim().split(/\s+/).filter((e=>e.includes(":"))).map((e=>e.split(":",2))))}}class Cache extends XFAObject{constructor(e){super(qn,"cache",!0);this.templateCache=null}}class Change extends Option01{constructor(e){super(qn,"change")}}class Common extends XFAObject{constructor(e){super(qn,"common",!0);this.data=null;this.locale=null;this.localeSet=null;this.messaging=null;this.suppressBanner=null;this.template=null;this.validationMessaging=null;this.versionControl=null;this.log=new XFAObjectArray}}class Compress extends XFAObject{constructor(e){super(qn,"compress");this.scope=getStringOption(e.scope,["imageOnly","document"])}}class CompressLogicalStructure extends Option01{constructor(e){super(qn,"compressLogicalStructure")}}class CompressObjectStream extends Option10{constructor(e){super(qn,"compressObjectStream")}}class Compression extends XFAObject{constructor(e){super(qn,"compression",!0);this.compressLogicalStructure=null;this.compressObjectStream=null;this.level=null;this.type=null}}class Config extends XFAObject{constructor(e){super(qn,"config",!0);this.acrobat=null;this.present=null;this.trace=null;this.agent=new XFAObjectArray}}class Conformance extends OptionObject{constructor(e){super(qn,"conformance",["A","B"])}}class ContentCopy extends Option01{constructor(e){super(qn,"contentCopy")}}class Copies extends IntegerObject{constructor(e){super(qn,"copies",1,(e=>e>=1))}}class Creator extends StringObject{constructor(e){super(qn,"creator")}}class CurrentPage extends IntegerObject{constructor(e){super(qn,"currentPage",0,(e=>e>=0))}}class Data extends XFAObject{constructor(e){super(qn,"data",!0);this.adjustData=null;this.attributes=null;this.incrementalLoad=null;this.outputXSL=null;this.range=null;this.record=null;this.startNode=null;this.uri=null;this.window=null;this.xsl=null;this.excludeNS=new XFAObjectArray;this.transform=new XFAObjectArray}}class Debug extends XFAObject{constructor(e){super(qn,"debug",!0);this.uri=null}}class DefaultTypeface extends ContentObject{constructor(e){super(qn,"defaultTypeface");this.writingScript=getStringOption(e.writingScript,["*","Arabic","Cyrillic","EastEuropeanRoman","Greek","Hebrew","Japanese","Korean","Roman","SimplifiedChinese","Thai","TraditionalChinese","Vietnamese"])}}class Destination extends OptionObject{constructor(e){super(qn,"destination",["pdf","pcl","ps","webClient","zpl"])}}class DocumentAssembly extends Option01{constructor(e){super(qn,"documentAssembly")}}class Driver extends XFAObject{constructor(e){super(qn,"driver",!0);this.name=e.name?e.name.trim():"";this.fontInfo=null;this.xdc=null}}class DuplexOption extends OptionObject{constructor(e){super(qn,"duplexOption",["simplex","duplexFlipLongEdge","duplexFlipShortEdge"])}}class DynamicRender extends OptionObject{constructor(e){super(qn,"dynamicRender",["forbidden","required"])}}class Embed extends Option01{constructor(e){super(qn,"embed")}}class config_Encrypt extends Option01{constructor(e){super(qn,"encrypt")}}class config_Encryption extends XFAObject{constructor(e){super(qn,"encryption",!0);this.encrypt=null;this.encryptionLevel=null;this.permissions=null}}class EncryptionLevel extends OptionObject{constructor(e){super(qn,"encryptionLevel",["40bit","128bit"])}}class Enforce extends StringObject{constructor(e){super(qn,"enforce")}}class Equate extends XFAObject{constructor(e){super(qn,"equate");this.force=getInteger({data:e.force,defaultValue:1,validate:e=>0===e});this.from=e.from||"";this.to=e.to||""}}class EquateRange extends XFAObject{constructor(e){super(qn,"equateRange");this.from=e.from||"";this.to=e.to||"";this._unicodeRange=e.unicodeRange||""}get unicodeRange(){const e=[],t=/U\+([0-9a-fA-F]+)/,i=this._unicodeRange;for(let a of i.split(",").map((e=>e.trim())).filter((e=>!!e))){a=a.split("-",2).map((e=>{const i=e.match(t);return i?parseInt(i[1],16):0}));1===a.length&&a.push(a[0]);e.push(a)}return shadow(this,"unicodeRange",e)}}class Exclude extends ContentObject{constructor(e){super(qn,"exclude")}[sr](){this[er]=this[er].trim().split(/\s+/).filter((e=>e&&["calculate","close","enter","exit","initialize","ready","validate"].includes(e)))}}class ExcludeNS extends StringObject{constructor(e){super(qn,"excludeNS")}}class FlipLabel extends OptionObject{constructor(e){super(qn,"flipLabel",["usePrinterSetting","on","off"])}}class config_FontInfo extends XFAObject{constructor(e){super(qn,"fontInfo",!0);this.embed=null;this.map=null;this.subsetBelow=null;this.alwaysEmbed=new XFAObjectArray;this.defaultTypeface=new XFAObjectArray;this.neverEmbed=new XFAObjectArray}}class FormFieldFilling extends Option01{constructor(e){super(qn,"formFieldFilling")}}class GroupParent extends StringObject{constructor(e){super(qn,"groupParent")}}class IfEmpty extends OptionObject{constructor(e){super(qn,"ifEmpty",["dataValue","dataGroup","ignore","remove"])}}class IncludeXDPContent extends StringObject{constructor(e){super(qn,"includeXDPContent")}}class IncrementalLoad extends OptionObject{constructor(e){super(qn,"incrementalLoad",["none","forwardOnly"])}}class IncrementalMerge extends Option01{constructor(e){super(qn,"incrementalMerge")}}class Interactive extends Option01{constructor(e){super(qn,"interactive")}}class Jog extends OptionObject{constructor(e){super(qn,"jog",["usePrinterSetting","none","pageSet"])}}class LabelPrinter extends XFAObject{constructor(e){super(qn,"labelPrinter",!0);this.name=getStringOption(e.name,["zpl","dpl","ipl","tcpl"]);this.batchOutput=null;this.flipLabel=null;this.fontInfo=null;this.xdc=null}}class Layout extends OptionObject{constructor(e){super(qn,"layout",["paginate","panel"])}}class Level extends IntegerObject{constructor(e){super(qn,"level",0,(e=>e>0))}}class Linearized extends Option01{constructor(e){super(qn,"linearized")}}class Locale extends StringObject{constructor(e){super(qn,"locale")}}class LocaleSet extends StringObject{constructor(e){super(qn,"localeSet")}}class Log extends XFAObject{constructor(e){super(qn,"log",!0);this.mode=null;this.threshold=null;this.to=null;this.uri=null}}class MapElement extends XFAObject{constructor(e){super(qn,"map",!0);this.equate=new XFAObjectArray;this.equateRange=new XFAObjectArray}}class MediumInfo extends XFAObject{constructor(e){super(qn,"mediumInfo",!0);this.map=null}}class config_Message extends XFAObject{constructor(e){super(qn,"message",!0);this.msgId=null;this.severity=null}}class Messaging extends XFAObject{constructor(e){super(qn,"messaging",!0);this.message=new XFAObjectArray}}class Mode extends OptionObject{constructor(e){super(qn,"mode",["append","overwrite"])}}class ModifyAnnots extends Option01{constructor(e){super(qn,"modifyAnnots")}}class MsgId extends IntegerObject{constructor(e){super(qn,"msgId",1,(e=>e>=1))}}class NameAttr extends StringObject{constructor(e){super(qn,"nameAttr")}}class NeverEmbed extends ContentObject{constructor(e){super(qn,"neverEmbed")}}class NumberOfCopies extends IntegerObject{constructor(e){super(qn,"numberOfCopies",null,(e=>e>=2&&e<=5))}}class OpenAction extends XFAObject{constructor(e){super(qn,"openAction",!0);this.destination=null}}class Output extends XFAObject{constructor(e){super(qn,"output",!0);this.to=null;this.type=null;this.uri=null}}class OutputBin extends StringObject{constructor(e){super(qn,"outputBin")}}class OutputXSL extends XFAObject{constructor(e){super(qn,"outputXSL",!0);this.uri=null}}class Overprint extends OptionObject{constructor(e){super(qn,"overprint",["none","both","draw","field"])}}class Packets extends StringObject{constructor(e){super(qn,"packets")}[sr](){"*"!==this[er]&&(this[er]=this[er].trim().split(/\s+/).filter((e=>["config","datasets","template","xfdf","xslt"].includes(e))))}}class PageOffset extends XFAObject{constructor(e){super(qn,"pageOffset");this.x=getInteger({data:e.x,defaultValue:"useXDCSetting",validate:e=>!0});this.y=getInteger({data:e.y,defaultValue:"useXDCSetting",validate:e=>!0})}}class PageRange extends StringObject{constructor(e){super(qn,"pageRange")}[sr](){const e=this[er].trim().split(/\s+/).map((e=>parseInt(e,10))),t=[];for(let i=0,a=e.length;i<a;i+=2)t.push(e.slice(i,i+2));this[er]=t}}class Pagination extends OptionObject{constructor(e){super(qn,"pagination",["simplex","duplexShortEdge","duplexLongEdge"])}}class PaginationOverride extends OptionObject{constructor(e){super(qn,"paginationOverride",["none","forceDuplex","forceDuplexLongEdge","forceDuplexShortEdge","forceSimplex"])}}class Part extends IntegerObject{constructor(e){super(qn,"part",1,(e=>!1))}}class Pcl extends XFAObject{constructor(e){super(qn,"pcl",!0);this.name=e.name||"";this.batchOutput=null;this.fontInfo=null;this.jog=null;this.mediumInfo=null;this.outputBin=null;this.pageOffset=null;this.staple=null;this.xdc=null}}class Pdf extends XFAObject{constructor(e){super(qn,"pdf",!0);this.name=e.name||"";this.adobeExtensionLevel=null;this.batchOutput=null;this.compression=null;this.creator=null;this.encryption=null;this.fontInfo=null;this.interactive=null;this.linearized=null;this.openAction=null;this.pdfa=null;this.producer=null;this.renderPolicy=null;this.scriptModel=null;this.silentPrint=null;this.submitFormat=null;this.tagged=null;this.version=null;this.viewerPreferences=null;this.xdc=null}}class Pdfa extends XFAObject{constructor(e){super(qn,"pdfa",!0);this.amd=null;this.conformance=null;this.includeXDPContent=null;this.part=null}}class Permissions extends XFAObject{constructor(e){super(qn,"permissions",!0);this.accessibleContent=null;this.change=null;this.contentCopy=null;this.documentAssembly=null;this.formFieldFilling=null;this.modifyAnnots=null;this.plaintextMetadata=null;this.print=null;this.printHighQuality=null}}class PickTrayByPDFSize extends Option01{constructor(e){super(qn,"pickTrayByPDFSize")}}class config_Picture extends StringObject{constructor(e){super(qn,"picture")}}class PlaintextMetadata extends Option01{constructor(e){super(qn,"plaintextMetadata")}}class Presence extends OptionObject{constructor(e){super(qn,"presence",["preserve","dissolve","dissolveStructure","ignore","remove"])}}class Present extends XFAObject{constructor(e){super(qn,"present",!0);this.behaviorOverride=null;this.cache=null;this.common=null;this.copies=null;this.destination=null;this.incrementalMerge=null;this.layout=null;this.output=null;this.overprint=null;this.pagination=null;this.paginationOverride=null;this.script=null;this.validate=null;this.xdp=null;this.driver=new XFAObjectArray;this.labelPrinter=new XFAObjectArray;this.pcl=new XFAObjectArray;this.pdf=new XFAObjectArray;this.ps=new XFAObjectArray;this.submitUrl=new XFAObjectArray;this.webClient=new XFAObjectArray;this.zpl=new XFAObjectArray}}class Print extends Option01{constructor(e){super(qn,"print")}}class PrintHighQuality extends Option01{constructor(e){super(qn,"printHighQuality")}}class PrintScaling extends OptionObject{constructor(e){super(qn,"printScaling",["appdefault","noScaling"])}}class PrinterName extends StringObject{constructor(e){super(qn,"printerName")}}class Producer extends StringObject{constructor(e){super(qn,"producer")}}class Ps extends XFAObject{constructor(e){super(qn,"ps",!0);this.name=e.name||"";this.batchOutput=null;this.fontInfo=null;this.jog=null;this.mediumInfo=null;this.outputBin=null;this.staple=null;this.xdc=null}}class Range extends ContentObject{constructor(e){super(qn,"range")}[sr](){this[er]=this[er].trim().split(/\s*,\s*/,2).map((e=>e.split("-").map((e=>parseInt(e.trim(),10))))).filter((e=>e.every((e=>!isNaN(e))))).map((e=>{1===e.length&&e.push(e[0]);return e}))}}class Record extends ContentObject{constructor(e){super(qn,"record")}[sr](){this[er]=this[er].trim();const e=parseInt(this[er],10);!isNaN(e)&&e>=0&&(this[er]=e)}}class Relevant extends ContentObject{constructor(e){super(qn,"relevant")}[sr](){this[er]=this[er].trim().split(/\s+/)}}class Rename extends ContentObject{constructor(e){super(qn,"rename")}[sr](){this[er]=this[er].trim();(this[er].toLowerCase().startsWith("xml")||new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*","u").test(this[er]))&&warn("XFA - Rename: invalid XFA name")}}class RenderPolicy extends OptionObject{constructor(e){super(qn,"renderPolicy",["server","client"])}}class RunScripts extends OptionObject{constructor(e){super(qn,"runScripts",["both","client","none","server"])}}class config_Script extends XFAObject{constructor(e){super(qn,"script",!0);this.currentPage=null;this.exclude=null;this.runScripts=null}}class ScriptModel extends OptionObject{constructor(e){super(qn,"scriptModel",["XFA","none"])}}class Severity extends OptionObject{constructor(e){super(qn,"severity",["ignore","error","information","trace","warning"])}}class SilentPrint extends XFAObject{constructor(e){super(qn,"silentPrint",!0);this.addSilentPrint=null;this.printerName=null}}class Staple extends XFAObject{constructor(e){super(qn,"staple");this.mode=getStringOption(e.mode,["usePrinterSetting","on","off"])}}class StartNode extends StringObject{constructor(e){super(qn,"startNode")}}class StartPage extends IntegerObject{constructor(e){super(qn,"startPage",0,(e=>!0))}}class SubmitFormat extends OptionObject{constructor(e){super(qn,"submitFormat",["html","delegate","fdf","xml","pdf"])}}class SubmitUrl extends StringObject{constructor(e){super(qn,"submitUrl")}}class SubsetBelow extends IntegerObject{constructor(e){super(qn,"subsetBelow",100,(e=>e>=0&&e<=100))}}class SuppressBanner extends Option01{constructor(e){super(qn,"suppressBanner")}}class Tagged extends Option01{constructor(e){super(qn,"tagged")}}class config_Template extends XFAObject{constructor(e){super(qn,"template",!0);this.base=null;this.relevant=null;this.startPage=null;this.uri=null;this.xsl=null}}class Threshold extends OptionObject{constructor(e){super(qn,"threshold",["trace","error","information","warning"])}}class To extends OptionObject{constructor(e){super(qn,"to",["null","memory","stderr","stdout","system","uri"])}}class TemplateCache extends XFAObject{constructor(e){super(qn,"templateCache");this.maxEntries=getInteger({data:e.maxEntries,defaultValue:5,validate:e=>e>=0})}}class Trace extends XFAObject{constructor(e){super(qn,"trace",!0);this.area=new XFAObjectArray}}class Transform extends XFAObject{constructor(e){super(qn,"transform",!0);this.groupParent=null;this.ifEmpty=null;this.nameAttr=null;this.picture=null;this.presence=null;this.rename=null;this.whitespace=null}}class Type extends OptionObject{constructor(e){super(qn,"type",["none","ascii85","asciiHex","ccittfax","flate","lzw","runLength","native","xdp","mergedXDP"])}}class Uri extends StringObject{constructor(e){super(qn,"uri")}}class config_Validate extends OptionObject{constructor(e){super(qn,"validate",["preSubmit","prePrint","preExecute","preSave"])}}class ValidateApprovalSignatures extends ContentObject{constructor(e){super(qn,"validateApprovalSignatures")}[sr](){this[er]=this[er].trim().split(/\s+/).filter((e=>["docReady","postSign"].includes(e)))}}class ValidationMessaging extends OptionObject{constructor(e){super(qn,"validationMessaging",["allMessagesIndividually","allMessagesTogether","firstMessageOnly","noMessages"])}}class Version extends OptionObject{constructor(e){super(qn,"version",["1.7","1.6","1.5","1.4","1.3","1.2"])}}class VersionControl extends XFAObject{constructor(e){super(qn,"VersionControl");this.outputBelow=getStringOption(e.outputBelow,["warn","error","update"]);this.sourceAbove=getStringOption(e.sourceAbove,["warn","error"]);this.sourceBelow=getStringOption(e.sourceBelow,["update","maintain"])}}class ViewerPreferences extends XFAObject{constructor(e){super(qn,"viewerPreferences",!0);this.ADBE_JSConsole=null;this.ADBE_JSDebugger=null;this.addViewerPreferences=null;this.duplexOption=null;this.enforce=null;this.numberOfCopies=null;this.pageRange=null;this.pickTrayByPDFSize=null;this.printScaling=null}}class WebClient extends XFAObject{constructor(e){super(qn,"webClient",!0);this.name=e.name?e.name.trim():"";this.fontInfo=null;this.xdc=null}}class Whitespace extends OptionObject{constructor(e){super(qn,"whitespace",["preserve","ltrim","normalize","rtrim","trim"])}}class Window extends ContentObject{constructor(e){super(qn,"window")}[sr](){const e=this[er].trim().split(/\s*,\s*/,2).map((e=>parseInt(e,10)));if(e.some((e=>isNaN(e))))this[er]=[0,0];else{1===e.length&&e.push(e[0]);this[er]=e}}}class Xdc extends XFAObject{constructor(e){super(qn,"xdc",!0);this.uri=new XFAObjectArray;this.xsl=new XFAObjectArray}}class Xdp extends XFAObject{constructor(e){super(qn,"xdp",!0);this.packets=null}}class Xsl extends XFAObject{constructor(e){super(qn,"xsl",!0);this.debug=null;this.uri=null}}class Zpl extends XFAObject{constructor(e){super(qn,"zpl",!0);this.name=e.name?e.name.trim():"";this.batchOutput=null;this.flipLabel=null;this.fontInfo=null;this.xdc=null}}class ConfigNamespace{static[gn](e,t){if(ConfigNamespace.hasOwnProperty(e))return ConfigNamespace[e](t)}static acrobat(e){return new Acrobat(e)}static acrobat7(e){return new Acrobat7(e)}static ADBE_JSConsole(e){return new ADBE_JSConsole(e)}static ADBE_JSDebugger(e){return new ADBE_JSDebugger(e)}static addSilentPrint(e){return new AddSilentPrint(e)}static addViewerPreferences(e){return new AddViewerPreferences(e)}static adjustData(e){return new AdjustData(e)}static adobeExtensionLevel(e){return new AdobeExtensionLevel(e)}static agent(e){return new Agent(e)}static alwaysEmbed(e){return new AlwaysEmbed(e)}static amd(e){return new Amd(e)}static area(e){return new config_Area(e)}static attributes(e){return new Attributes(e)}static autoSave(e){return new AutoSave(e)}static base(e){return new Base(e)}static batchOutput(e){return new BatchOutput(e)}static behaviorOverride(e){return new BehaviorOverride(e)}static cache(e){return new Cache(e)}static change(e){return new Change(e)}static common(e){return new Common(e)}static compress(e){return new Compress(e)}static compressLogicalStructure(e){return new CompressLogicalStructure(e)}static compressObjectStream(e){return new CompressObjectStream(e)}static compression(e){return new Compression(e)}static config(e){return new Config(e)}static conformance(e){return new Conformance(e)}static contentCopy(e){return new ContentCopy(e)}static copies(e){return new Copies(e)}static creator(e){return new Creator(e)}static currentPage(e){return new CurrentPage(e)}static data(e){return new Data(e)}static debug(e){return new Debug(e)}static defaultTypeface(e){return new DefaultTypeface(e)}static destination(e){return new Destination(e)}static documentAssembly(e){return new DocumentAssembly(e)}static driver(e){return new Driver(e)}static duplexOption(e){return new DuplexOption(e)}static dynamicRender(e){return new DynamicRender(e)}static embed(e){return new Embed(e)}static encrypt(e){return new config_Encrypt(e)}static encryption(e){return new config_Encryption(e)}static encryptionLevel(e){return new EncryptionLevel(e)}static enforce(e){return new Enforce(e)}static equate(e){return new Equate(e)}static equateRange(e){return new EquateRange(e)}static exclude(e){return new Exclude(e)}static excludeNS(e){return new ExcludeNS(e)}static flipLabel(e){return new FlipLabel(e)}static fontInfo(e){return new config_FontInfo(e)}static formFieldFilling(e){return new FormFieldFilling(e)}static groupParent(e){return new GroupParent(e)}static ifEmpty(e){return new IfEmpty(e)}static includeXDPContent(e){return new IncludeXDPContent(e)}static incrementalLoad(e){return new IncrementalLoad(e)}static incrementalMerge(e){return new IncrementalMerge(e)}static interactive(e){return new Interactive(e)}static jog(e){return new Jog(e)}static labelPrinter(e){return new LabelPrinter(e)}static layout(e){return new Layout(e)}static level(e){return new Level(e)}static linearized(e){return new Linearized(e)}static locale(e){return new Locale(e)}static localeSet(e){return new LocaleSet(e)}static log(e){return new Log(e)}static map(e){return new MapElement(e)}static mediumInfo(e){return new MediumInfo(e)}static message(e){return new config_Message(e)}static messaging(e){return new Messaging(e)}static mode(e){return new Mode(e)}static modifyAnnots(e){return new ModifyAnnots(e)}static msgId(e){return new MsgId(e)}static nameAttr(e){return new NameAttr(e)}static neverEmbed(e){return new NeverEmbed(e)}static numberOfCopies(e){return new NumberOfCopies(e)}static openAction(e){return new OpenAction(e)}static output(e){return new Output(e)}static outputBin(e){return new OutputBin(e)}static outputXSL(e){return new OutputXSL(e)}static overprint(e){return new Overprint(e)}static packets(e){return new Packets(e)}static pageOffset(e){return new PageOffset(e)}static pageRange(e){return new PageRange(e)}static pagination(e){return new Pagination(e)}static paginationOverride(e){return new PaginationOverride(e)}static part(e){return new Part(e)}static pcl(e){return new Pcl(e)}static pdf(e){return new Pdf(e)}static pdfa(e){return new Pdfa(e)}static permissions(e){return new Permissions(e)}static pickTrayByPDFSize(e){return new PickTrayByPDFSize(e)}static picture(e){return new config_Picture(e)}static plaintextMetadata(e){return new PlaintextMetadata(e)}static presence(e){return new Presence(e)}static present(e){return new Present(e)}static print(e){return new Print(e)}static printHighQuality(e){return new PrintHighQuality(e)}static printScaling(e){return new PrintScaling(e)}static printerName(e){return new PrinterName(e)}static producer(e){return new Producer(e)}static ps(e){return new Ps(e)}static range(e){return new Range(e)}static record(e){return new Record(e)}static relevant(e){return new Relevant(e)}static rename(e){return new Rename(e)}static renderPolicy(e){return new RenderPolicy(e)}static runScripts(e){return new RunScripts(e)}static script(e){return new config_Script(e)}static scriptModel(e){return new ScriptModel(e)}static severity(e){return new Severity(e)}static silentPrint(e){return new SilentPrint(e)}static staple(e){return new Staple(e)}static startNode(e){return new StartNode(e)}static startPage(e){return new StartPage(e)}static submitFormat(e){return new SubmitFormat(e)}static submitUrl(e){return new SubmitUrl(e)}static subsetBelow(e){return new SubsetBelow(e)}static suppressBanner(e){return new SuppressBanner(e)}static tagged(e){return new Tagged(e)}static template(e){return new config_Template(e)}static templateCache(e){return new TemplateCache(e)}static threshold(e){return new Threshold(e)}static to(e){return new To(e)}static trace(e){return new Trace(e)}static transform(e){return new Transform(e)}static type(e){return new Type(e)}static uri(e){return new Uri(e)}static validate(e){return new config_Validate(e)}static validateApprovalSignatures(e){return new ValidateApprovalSignatures(e)}static validationMessaging(e){return new ValidationMessaging(e)}static version(e){return new Version(e)}static versionControl(e){return new VersionControl(e)}static viewerPreferences(e){return new ViewerPreferences(e)}static webClient(e){return new WebClient(e)}static whitespace(e){return new Whitespace(e)}static window(e){return new Window(e)}static xdc(e){return new Xdc(e)}static xdp(e){return new Xdp(e)}static xsl(e){return new Xsl(e)}static zpl(e){return new Zpl(e)}}const On=on.connectionSet.id;class ConnectionSet extends XFAObject{constructor(e){super(On,"connectionSet",!0);this.wsdlConnection=new XFAObjectArray;this.xmlConnection=new XFAObjectArray;this.xsdConnection=new XFAObjectArray}}class EffectiveInputPolicy extends XFAObject{constructor(e){super(On,"effectiveInputPolicy");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class EffectiveOutputPolicy extends XFAObject{constructor(e){super(On,"effectiveOutputPolicy");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Operation extends StringObject{constructor(e){super(On,"operation");this.id=e.id||"";this.input=e.input||"";this.name=e.name||"";this.output=e.output||"";this.use=e.use||"";this.usehref=e.usehref||""}}class RootElement extends StringObject{constructor(e){super(On,"rootElement");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class SoapAction extends StringObject{constructor(e){super(On,"soapAction");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class SoapAddress extends StringObject{constructor(e){super(On,"soapAddress");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class connection_set_Uri extends StringObject{constructor(e){super(On,"uri");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class WsdlAddress extends StringObject{constructor(e){super(On,"wsdlAddress");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class WsdlConnection extends XFAObject{constructor(e){super(On,"wsdlConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.effectiveInputPolicy=null;this.effectiveOutputPolicy=null;this.operation=null;this.soapAction=null;this.soapAddress=null;this.wsdlAddress=null}}class XmlConnection extends XFAObject{constructor(e){super(On,"xmlConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.uri=null}}class XsdConnection extends XFAObject{constructor(e){super(On,"xsdConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.rootElement=null;this.uri=null}}class ConnectionSetNamespace{static[gn](e,t){if(ConnectionSetNamespace.hasOwnProperty(e))return ConnectionSetNamespace[e](t)}static connectionSet(e){return new ConnectionSet(e)}static effectiveInputPolicy(e){return new EffectiveInputPolicy(e)}static effectiveOutputPolicy(e){return new EffectiveOutputPolicy(e)}static operation(e){return new Operation(e)}static rootElement(e){return new RootElement(e)}static soapAction(e){return new SoapAction(e)}static soapAddress(e){return new SoapAddress(e)}static uri(e){return new connection_set_Uri(e)}static wsdlAddress(e){return new WsdlAddress(e)}static wsdlConnection(e){return new WsdlConnection(e)}static xmlConnection(e){return new XmlConnection(e)}static xsdConnection(e){return new XsdConnection(e)}}const Pn=on.datasets.id;class datasets_Data extends XmlObject{constructor(e){super(Pn,"data",e)}[Gr](){return!0}}class Datasets extends XFAObject{constructor(e){super(Pn,"datasets",!0);this.data=null;this.Signature=null}[Kr](e){const t=e[Yr];("data"===t&&e[Jr]===Pn||"Signature"===t&&e[Jr]===on.signature.id)&&(this[t]=e);this[Xs](e)}}class DatasetsNamespace{static[gn](e,t){if(DatasetsNamespace.hasOwnProperty(e))return DatasetsNamespace[e](t)}static datasets(e){return new Datasets(e)}static data(e){return new datasets_Data(e)}}const Wn=on.localeSet.id;class CalendarSymbols extends XFAObject{constructor(e){super(Wn,"calendarSymbols",!0);this.name="gregorian";this.dayNames=new XFAObjectArray(2);this.eraNames=null;this.meridiemNames=null;this.monthNames=new XFAObjectArray(2)}}class CurrencySymbol extends StringObject{constructor(e){super(Wn,"currencySymbol");this.name=getStringOption(e.name,["symbol","isoname","decimal"])}}class CurrencySymbols extends XFAObject{constructor(e){super(Wn,"currencySymbols",!0);this.currencySymbol=new XFAObjectArray(3)}}class DatePattern extends StringObject{constructor(e){super(Wn,"datePattern");this.name=getStringOption(e.name,["full","long","med","short"])}}class DatePatterns extends XFAObject{constructor(e){super(Wn,"datePatterns",!0);this.datePattern=new XFAObjectArray(4)}}class DateTimeSymbols extends ContentObject{constructor(e){super(Wn,"dateTimeSymbols")}}class Day extends StringObject{constructor(e){super(Wn,"day")}}class DayNames extends XFAObject{constructor(e){super(Wn,"dayNames",!0);this.abbr=getInteger({data:e.abbr,defaultValue:0,validate:e=>1===e});this.day=new XFAObjectArray(7)}}class Era extends StringObject{constructor(e){super(Wn,"era")}}class EraNames extends XFAObject{constructor(e){super(Wn,"eraNames",!0);this.era=new XFAObjectArray(2)}}class locale_set_Locale extends XFAObject{constructor(e){super(Wn,"locale",!0);this.desc=e.desc||"";this.name="isoname";this.calendarSymbols=null;this.currencySymbols=null;this.datePatterns=null;this.dateTimeSymbols=null;this.numberPatterns=null;this.numberSymbols=null;this.timePatterns=null;this.typeFaces=null}}class locale_set_LocaleSet extends XFAObject{constructor(e){super(Wn,"localeSet",!0);this.locale=new XFAObjectArray}}class Meridiem extends StringObject{constructor(e){super(Wn,"meridiem")}}class MeridiemNames extends XFAObject{constructor(e){super(Wn,"meridiemNames",!0);this.meridiem=new XFAObjectArray(2)}}class Month extends StringObject{constructor(e){super(Wn,"month")}}class MonthNames extends XFAObject{constructor(e){super(Wn,"monthNames",!0);this.abbr=getInteger({data:e.abbr,defaultValue:0,validate:e=>1===e});this.month=new XFAObjectArray(12)}}class NumberPattern extends StringObject{constructor(e){super(Wn,"numberPattern");this.name=getStringOption(e.name,["full","long","med","short"])}}class NumberPatterns extends XFAObject{constructor(e){super(Wn,"numberPatterns",!0);this.numberPattern=new XFAObjectArray(4)}}class NumberSymbol extends StringObject{constructor(e){super(Wn,"numberSymbol");this.name=getStringOption(e.name,["decimal","grouping","percent","minus","zero"])}}class NumberSymbols extends XFAObject{constructor(e){super(Wn,"numberSymbols",!0);this.numberSymbol=new XFAObjectArray(5)}}class TimePattern extends StringObject{constructor(e){super(Wn,"timePattern");this.name=getStringOption(e.name,["full","long","med","short"])}}class TimePatterns extends XFAObject{constructor(e){super(Wn,"timePatterns",!0);this.timePattern=new XFAObjectArray(4)}}class TypeFace extends XFAObject{constructor(e){super(Wn,"typeFace",!0);this.name=""|e.name}}class TypeFaces extends XFAObject{constructor(e){super(Wn,"typeFaces",!0);this.typeFace=new XFAObjectArray}}class LocaleSetNamespace{static[gn](e,t){if(LocaleSetNamespace.hasOwnProperty(e))return LocaleSetNamespace[e](t)}static calendarSymbols(e){return new CalendarSymbols(e)}static currencySymbol(e){return new CurrencySymbol(e)}static currencySymbols(e){return new CurrencySymbols(e)}static datePattern(e){return new DatePattern(e)}static datePatterns(e){return new DatePatterns(e)}static dateTimeSymbols(e){return new DateTimeSymbols(e)}static day(e){return new Day(e)}static dayNames(e){return new DayNames(e)}static era(e){return new Era(e)}static eraNames(e){return new EraNames(e)}static locale(e){return new locale_set_Locale(e)}static localeSet(e){return new locale_set_LocaleSet(e)}static meridiem(e){return new Meridiem(e)}static meridiemNames(e){return new MeridiemNames(e)}static month(e){return new Month(e)}static monthNames(e){return new MonthNames(e)}static numberPattern(e){return new NumberPattern(e)}static numberPatterns(e){return new NumberPatterns(e)}static numberSymbol(e){return new NumberSymbol(e)}static numberSymbols(e){return new NumberSymbols(e)}static timePattern(e){return new TimePattern(e)}static timePatterns(e){return new TimePatterns(e)}static typeFace(e){return new TypeFace(e)}static typeFaces(e){return new TypeFaces(e)}}const jn=on.signature.id;class signature_Signature extends XFAObject{constructor(e){super(jn,"signature",!0)}}class SignatureNamespace{static[gn](e,t){if(SignatureNamespace.hasOwnProperty(e))return SignatureNamespace[e](t)}static signature(e){return new signature_Signature(e)}}const Xn=on.stylesheet.id;class Stylesheet extends XFAObject{constructor(e){super(Xn,"stylesheet",!0)}}class StylesheetNamespace{static[gn](e,t){if(StylesheetNamespace.hasOwnProperty(e))return StylesheetNamespace[e](t)}static stylesheet(e){return new Stylesheet(e)}}const Zn=on.xdp.id;class xdp_Xdp extends XFAObject{constructor(e){super(Zn,"xdp",!0);this.uuid=e.uuid||"";this.timeStamp=e.timeStamp||"";this.config=null;this.connectionSet=null;this.datasets=null;this.localeSet=null;this.stylesheet=new XFAObjectArray;this.template=null}[Tr](e){const t=on[e[Yr]];return t&&e[Jr]===t.id}}class XdpNamespace{static[gn](e,t){if(XdpNamespace.hasOwnProperty(e))return XdpNamespace[e](t)}static xdp(e){return new xdp_Xdp(e)}}const Vn=on.xhtml.id,zn=Symbol(),_n=new Set(["color","font","font-family","font-size","font-stretch","font-style","font-weight","margin","margin-bottom","margin-left","margin-right","margin-top","letter-spacing","line-height","orphans","page-break-after","page-break-before","page-break-inside","tab-interval","tab-stop","text-align","text-decoration","text-indent","vertical-align","widows","kerning-mode","xfa-font-horizontal-scale","xfa-font-vertical-scale","xfa-spacerun","xfa-tab-stops"]),$n=new Map([["page-break-after","breakAfter"],["page-break-before","breakBefore"],["page-break-inside","breakInside"],["kerning-mode",e=>"none"===e?"none":"normal"],["xfa-font-horizontal-scale",e=>`scaleX(${Math.max(0,Math.min(parseInt(e)/100)).toFixed(2)})`],["xfa-font-vertical-scale",e=>`scaleY(${Math.max(0,Math.min(parseInt(e)/100)).toFixed(2)})`],["xfa-spacerun",""],["xfa-tab-stops",""],["font-size",(e,t)=>measureToString(.99*(e=t.fontSize=getMeasurement(e)))],["letter-spacing",e=>measureToString(getMeasurement(e))],["line-height",e=>measureToString(getMeasurement(e))],["margin",e=>measureToString(getMeasurement(e))],["margin-bottom",e=>measureToString(getMeasurement(e))],["margin-left",e=>measureToString(getMeasurement(e))],["margin-right",e=>measureToString(getMeasurement(e))],["margin-top",e=>measureToString(getMeasurement(e))],["text-indent",e=>measureToString(getMeasurement(e))],["font-family",e=>e],["vertical-align",e=>measureToString(getMeasurement(e))]]),Ag=/\s+/g,eg=/[\r\n]+/g,tg=/\r\n?/g;function mapStyle(e,t,i){const a=Object.create(null);if(!e)return a;const s=Object.create(null);for(const[t,i]of e.split(";").map((e=>e.split(":",2)))){const e=$n.get(t);if(""===e)continue;let r=i;e&&(r="string"==typeof e?e:e(i,s));t.endsWith("scale")?a.transform=a.transform?`${a[t]} ${r}`:r:a[t.replaceAll(/-([a-zA-Z])/g,((e,t)=>t.toUpperCase()))]=r}a.fontFamily&&setFontFamily({typeface:a.fontFamily,weight:a.fontWeight||"normal",posture:a.fontStyle||"normal",size:s.fontSize||0},t,t[yr].fontFinder,a);if(i&&a.verticalAlign&&"0px"!==a.verticalAlign&&a.fontSize){const e=.583,t=.333,i=getMeasurement(a.fontSize);a.fontSize=measureToString(i*e);a.verticalAlign=measureToString(Math.sign(getMeasurement(a.verticalAlign))*i*t)}i&&a.fontSize&&(a.fontSize=`calc(${a.fontSize} * var(--scale-factor))`);fixTextIndent(a);return a}const ig=new Set(["body","html"]);class XhtmlObject extends XmlObject{constructor(e,t){super(Vn,t);this[zn]=!1;this.style=e.style||""}[Vs](e){super[Vs](e);this.style=function checkStyle(e){return e.style?e.style.trim().split(/\s*;\s*/).filter((e=>!!e)).map((e=>e.split(/\s*:\s*/,2))).filter((([t,i])=>{"font-family"===t&&e[yr].usedTypefaces.add(i);return _n.has(t)})).map((e=>e.join(":"))).join(";"):""}(this)}[Ws](){return!ig.has(this[Yr])}[qr](e,t=!1){if(t)this[zn]=!0;else{e=e.replaceAll(eg,"");this.style.includes("xfa-spacerun:yes")||(e=e.replaceAll(Ag," "))}e&&(this[er]+=e)}[Or](e,t=!0){const i=Object.create(null),a={top:NaN,bottom:NaN,left:NaN,right:NaN};let s=null;for(const[e,t]of this.style.split(";").map((e=>e.split(":",2))))switch(e){case"font-family":i.typeface=stripQuotes(t);break;case"font-size":i.size=getMeasurement(t);break;case"font-weight":i.weight=t;break;case"font-style":i.posture=t;break;case"letter-spacing":i.letterSpacing=getMeasurement(t);break;case"margin":const e=t.split(/ \t/).map((e=>getMeasurement(e)));switch(e.length){case 1:a.top=a.bottom=a.left=a.right=e[0];break;case 2:a.top=a.bottom=e[0];a.left=a.right=e[1];break;case 3:a.top=e[0];a.bottom=e[2];a.left=a.right=e[1];break;case 4:a.top=e[0];a.left=e[1];a.bottom=e[2];a.right=e[3]}break;case"margin-top":a.top=getMeasurement(t);break;case"margin-bottom":a.bottom=getMeasurement(t);break;case"margin-left":a.left=getMeasurement(t);break;case"margin-right":a.right=getMeasurement(t);break;case"line-height":s=getMeasurement(t)}e.pushData(i,a,s);if(this[er])e.addString(this[er]);else for(const t of this[Er]())"#text"!==t[Yr]?t[Or](e):e.addString(t[er]);t&&e.popFont()}[an](e){const t=[];this[ar]={children:t};this[Zs]({});if(0===t.length&&!this[er])return HTMLResult.EMPTY;let i;i=this[zn]?this[er]?this[er].replaceAll(tg,"\n"):void 0:this[er]||void 0;return HTMLResult.success({name:this[Yr],attributes:{href:this.href,style:mapStyle(this.style,this,this[zn])},children:t,value:i})}}class A extends XhtmlObject{constructor(e){super(e,"a");this.href=fixURL(e.href)||""}}class B extends XhtmlObject{constructor(e){super(e,"b")}[Or](e){e.pushFont({weight:"bold"});super[Or](e);e.popFont()}}class Body extends XhtmlObject{constructor(e){super(e,"body")}[an](e){const t=super[an](e),{html:i}=t;if(!i)return HTMLResult.EMPTY;i.name="div";i.attributes.class=["xfaRich"];return t}}class Br extends XhtmlObject{constructor(e){super(e,"br")}[en](){return"\n"}[Or](e){e.addString("\n")}[an](e){return HTMLResult.success({name:"br"})}}class Html extends XhtmlObject{constructor(e){super(e,"html")}[an](e){const t=[];this[ar]={children:t};this[Zs]({});if(0===t.length)return HTMLResult.success({name:"div",attributes:{class:["xfaRich"],style:{}},value:this[er]||""});if(1===t.length){const e=t[0];if(e.attributes?.class.includes("xfaRich"))return HTMLResult.success(e)}return HTMLResult.success({name:"div",attributes:{class:["xfaRich"],style:{}},children:t})}}class I extends XhtmlObject{constructor(e){super(e,"i")}[Or](e){e.pushFont({posture:"italic"});super[Or](e);e.popFont()}}class Li extends XhtmlObject{constructor(e){super(e,"li")}}class Ol extends XhtmlObject{constructor(e){super(e,"ol")}}class P extends XhtmlObject{constructor(e){super(e,"p")}[Or](e){super[Or](e,!1);e.addString("\n");e.addPara();e.popFont()}[en](){return this[pr]()[Er]().at(-1)===this?super[en]():super[en]()+"\n"}}class Span extends XhtmlObject{constructor(e){super(e,"span")}}class Sub extends XhtmlObject{constructor(e){super(e,"sub")}}class Sup extends XhtmlObject{constructor(e){super(e,"sup")}}class Ul extends XhtmlObject{constructor(e){super(e,"ul")}}class XhtmlNamespace{static[gn](e,t){if(XhtmlNamespace.hasOwnProperty(e))return XhtmlNamespace[e](t)}static a(e){return new A(e)}static b(e){return new B(e)}static body(e){return new Body(e)}static br(e){return new Br(e)}static html(e){return new Html(e)}static i(e){return new I(e)}static li(e){return new Li(e)}static ol(e){return new Ol(e)}static p(e){return new P(e)}static span(e){return new Span(e)}static sub(e){return new Sub(e)}static sup(e){return new Sup(e)}static ul(e){return new Ul(e)}}const ag={config:ConfigNamespace,connection:ConnectionSetNamespace,datasets:DatasetsNamespace,localeSet:LocaleSetNamespace,signature:SignatureNamespace,stylesheet:StylesheetNamespace,template:TemplateNamespace,xdp:XdpNamespace,xhtml:XhtmlNamespace};class UnknownNamespace{constructor(e){this.namespaceId=e}[gn](e,t){return new XmlObject(this.namespaceId,e,t)}}class Root extends XFAObject{constructor(e){super(-1,"root",Object.create(null));this.element=null;this[Dr]=e}[Kr](e){this.element=e;return!0}[sr](){super[sr]();if(this.element.template instanceof Template){this[Dr].set(Xr,this.element);this.element.template[Zr](this[Dr]);this.element.template[Dr]=this[Dr]}}}class Empty extends XFAObject{constructor(){super(-1,"",Object.create(null))}[Kr](e){return!1}}class Builder{constructor(e=null){this._namespaceStack=[];this._nsAgnosticLevel=0;this._namespacePrefixes=new Map;this._namespaces=new Map;this._nextNsId=Math.max(...Object.values(on).map((({id:e})=>e)));this._currentNamespace=e||new UnknownNamespace(++this._nextNsId)}buildRoot(e){return new Root(e)}build({nsPrefix:e,name:t,attributes:i,namespace:a,prefixes:s}){const r=null!==a;if(r){this._namespaceStack.push(this._currentNamespace);this._currentNamespace=this._searchNamespace(a)}s&&this._addNamespacePrefix(s);if(i.hasOwnProperty(vr)){const e=ag.datasets,t=i[vr];let a=null;for(const[i,s]of Object.entries(t)){if(this._getNamespaceToUse(i)===e){a={xfa:s};break}}a?i[vr]=a:delete i[vr]}const n=this._getNamespaceToUse(e),g=n?.[gn](t,i)||new Empty;g[Gr]()&&this._nsAgnosticLevel++;(r||s||g[Gr]())&&(g[_s]={hasNamespace:r,prefixes:s,nsAgnostic:g[Gr]()});return g}isNsAgnostic(){return this._nsAgnosticLevel>0}_searchNamespace(e){let t=this._namespaces.get(e);if(t)return t;for(const[i,{check:a}]of Object.entries(on))if(a(e)){t=ag[i];if(t){this._namespaces.set(e,t);return t}break}t=new UnknownNamespace(++this._nextNsId);this._namespaces.set(e,t);return t}_addNamespacePrefix(e){for(const{prefix:t,value:i}of e){const e=this._searchNamespace(i);let a=this._namespacePrefixes.get(t);if(!a){a=[];this._namespacePrefixes.set(t,a)}a.push(e)}}_getNamespaceToUse(e){if(!e)return this._currentNamespace;const t=this._namespacePrefixes.get(e);if(t?.length>0)return t.at(-1);warn(`Unknown namespace prefix: ${e}.`);return null}clean(e){const{hasNamespace:t,prefixes:i,nsAgnostic:a}=e;t&&(this._currentNamespace=this._namespaceStack.pop());i&&i.forEach((({prefix:e})=>{this._namespacePrefixes.get(e).pop()}));a&&this._nsAgnosticLevel--}}class XFAParser extends XMLParserBase{constructor(e=null,t=!1){super();this._builder=new Builder(e);this._stack=[];this._globalData={usedTypefaces:new Set};this._ids=new Map;this._current=this._builder.buildRoot(this._ids);this._errorCode=Rs;this._whiteRegex=/^\s+$/;this._nbsps=/\xa0+/g;this._richText=t}parse(e){this.parseXml(e);if(this._errorCode===Rs){this._current[sr]();return this._current.element}}onText(e){e=e.replace(this._nbsps,(e=>e.slice(1)+" "));this._richText||this._current[Ws]()?this._current[qr](e,this._richText):this._whiteRegex.test(e)||this._current[qr](e.trim())}onCdata(e){this._current[qr](e)}_mkAttributes(e,t){let i=null,a=null;const s=Object.create({});for(const{name:r,value:n}of e)if("xmlns"===r)i?warn(`XFA - multiple namespace definition in <${t}>`):i=n;else if(r.startsWith("xmlns:")){const e=r.substring(6);a||(a=[]);a.push({prefix:e,value:n})}else{const e=r.indexOf(":");if(-1===e)s[r]=n;else{let t=s[vr];t||(t=s[vr]=Object.create(null));const[i,a]=[r.slice(0,e),r.slice(e+1)];(t[i]||=Object.create(null))[a]=n}}return[i,a,s]}_getNameAndPrefix(e,t){const i=e.indexOf(":");return-1===i?[e,null]:[e.substring(i+1),t?"":e.substring(0,i)]}onBeginElement(e,t,i){const[a,s,r]=this._mkAttributes(t,e),[n,g]=this._getNameAndPrefix(e,this._builder.isNsAgnostic()),o=this._builder.build({nsPrefix:g,name:n,attributes:r,namespace:a,prefixes:s});o[yr]=this._globalData;if(i){o[sr]();this._current[Kr](o)&&o[zr](this._ids);o[Vs](this._builder)}else{this._stack.push(this._current);this._current=o}}onEndElement(e){const t=this._current;if(t[Sr]()&&"string"==typeof t[er]){const e=new XFAParser;e._globalData=this._globalData;const i=e.parse(t[er]);t[er]=null;t[Kr](i)}t[sr]();this._current=this._stack.pop();this._current[Kr](t)&&t[zr](this._ids);t[Vs](this._builder)}onError(e){this._errorCode=e}}class XFAFactory{constructor(e){try{this.root=(new XFAParser).parse(XFAFactory._createDocument(e));const t=new Binder(this.root);this.form=t.bind();this.dataHandler=new DataHandler(this.root,t.getData());this.form[yr].template=this.form}catch(e){warn(`XFA - an error occurred during parsing and binding: ${e}`)}}isValid(){return this.root&&this.form}_createPagesHelper(){const e=this.form[tn]();return new Promise(((t,i)=>{const nextIteration=()=>{try{const i=e.next();i.done?t(i.value):setTimeout(nextIteration,0)}catch(e){i(e)}};setTimeout(nextIteration,0)}))}async _createPages(){try{this.pages=await this._createPagesHelper();this.dims=this.pages.children.map((e=>{const{width:t,height:i}=e.attributes.style;return[0,0,parseInt(t),parseInt(i)]}))}catch(e){warn(`XFA - an error occurred during layout: ${e}`)}}getBoundingBox(e){return this.dims[e]}async getNumPages(){this.pages||await this._createPages();return this.dims.length}setImages(e){this.form[yr].images=e}setFonts(e){this.form[yr].fontFinder=new FontFinder(e);const t=[];for(let e of this.form[yr].usedTypefaces){e=stripQuotes(e);this.form[yr].fontFinder.find(e)||t.push(e)}return t.length>0?t:null}appendFonts(e,t){this.form[yr].fontFinder.add(e,t)}async getPages(){this.pages||await this._createPages();const e=this.pages;this.pages=null;return e}serializeData(e){return this.dataHandler.serialize(e)}static _createDocument(e){return e["/xdp:xdp"]?Object.values(e).join(""):e["xdp:xdp"]}static getRichTextAsHtml(e){if(!e||"string"!=typeof e)return null;try{let t=new XFAParser(XhtmlNamespace,!0).parse(e);if(!["body","xhtml"].includes(t[Yr])){const e=XhtmlNamespace.body({});e[Xs](t);t=e}const i=t[an]();if(!i.success)return null;const{html:a}=i,{attributes:s}=a;if(s){s.class&&(s.class=s.class.filter((e=>!e.startsWith("xfa"))));s.dir="auto"}return{html:a,str:t[en]()}}catch(e){warn(`XFA - an error occurred during parsing of rich text: ${e}`)}return null}}class AnnotationFactory{static createGlobals(e){return Promise.all([e.ensureCatalog("acroForm"),e.ensureDoc("xfaDatasets"),e.ensureCatalog("structTreeRoot"),e.ensureCatalog("baseUrl"),e.ensureCatalog("attachments")]).then((([t,i,a,s,r])=>({pdfManager:e,acroForm:t instanceof Dict?t:Dict.empty,xfaDatasets:i,structTreeRoot:a,baseUrl:s,attachments:r})),(e=>{warn(`createGlobals: "${e}".`);return null}))}static async create(e,t,i,a,s,r){const n=s?await this._getPageIndex(e,t,i.pdfManager):null;return i.pdfManager.ensure(this,"_create",[e,t,i,a,s,n,r])}static _create(e,t,i,a,s=!1,r=null,n=null){const g=e.fetchIfRef(t);if(!(g instanceof Dict))return;const{acroForm:o,pdfManager:c}=i,C=t instanceof Ref?t.toString():`annot_${a.createObjId()}`;let h=g.get("Subtype");h=h instanceof Name?h.name:null;const l={xref:e,ref:t,dict:g,subtype:h,id:C,annotationGlobals:i,collectFields:s,needAppearances:!s&&!0===o.get("NeedAppearances"),pageIndex:r,evaluatorOptions:c.evaluatorOptions,pageRef:n};switch(h){case"Link":return new LinkAnnotation(l);case"Text":return new TextAnnotation(l);case"Widget":let e=getInheritableProperty({dict:g,key:"FT"});e=e instanceof Name?e.name:null;switch(e){case"Tx":return new TextWidgetAnnotation(l);case"Btn":return new ButtonWidgetAnnotation(l);case"Ch":return new ChoiceWidgetAnnotation(l);case"Sig":return new SignatureWidgetAnnotation(l)}warn(`Unimplemented widget field type "${e}", falling back to base field type.`);return new WidgetAnnotation(l);case"Popup":return new PopupAnnotation(l);case"FreeText":return new FreeTextAnnotation(l);case"Line":return new LineAnnotation(l);case"Square":return new SquareAnnotation(l);case"Circle":return new CircleAnnotation(l);case"PolyLine":return new PolylineAnnotation(l);case"Polygon":return new PolygonAnnotation(l);case"Caret":return new CaretAnnotation(l);case"Ink":return new InkAnnotation(l);case"Highlight":return new HighlightAnnotation(l);case"Underline":return new UnderlineAnnotation(l);case"Squiggly":return new SquigglyAnnotation(l);case"StrikeOut":return new StrikeOutAnnotation(l);case"Stamp":return new StampAnnotation(l);case"FileAttachment":return new FileAttachmentAnnotation(l);default:s||warn(h?`Unimplemented annotation type "${h}", falling back to base annotation.`:"Annotation is missing the required /Subtype.");return new Annotation(l)}}static async _getPageIndex(e,t,i){try{const a=await e.fetchIfRefAsync(t);if(!(a instanceof Dict))return-1;const s=a.getRaw("P");if(s instanceof Ref)try{return await i.ensureCatalog("getPageIndex",[s])}catch(e){info(`_getPageIndex -- not a valid page reference: "${e}".`)}if(a.has("Kids"))return-1;const r=await i.ensureDoc("numPages");for(let e=0;e<r;e++){const a=await i.getPage(e),s=await i.ensure(a,"annotations");for(const i of s)if(i instanceof Ref&&isRefsEqual(i,t))return e}}catch(e){warn(`_getPageIndex: "${e}".`)}return-1}static generateImages(e,t,i){if(!i){warn("generateImages: OffscreenCanvas is not supported, cannot save or print some annotations with images.");return null}let a;for(const{bitmapId:i,bitmap:s}of e)if(s){a||=new Map;a.set(i,StampAnnotation.createImage(s,t))}return a}static async saveNewAnnotations(e,t,i,a){const s=e.xref;let r;const n=[],g=[],{isOffscreenCanvasSupported:o}=e.options;for(const c of i)if(!c.deleted)switch(c.annotationType){case u:if(!r){const e=new Dict(s);e.set("BaseFont",Name.get("Helvetica"));e.set("Type",Name.get("Font"));e.set("Subtype",Name.get("Type1"));e.set("Encoding",Name.get("WinAnsiEncoding"));const t=[];r=s.getNewTemporaryRef();await writeObject(r,e,t,s);n.push({ref:r,data:t.join("")})}g.push(FreeTextAnnotation.createNewAnnotation(s,c,n,{evaluator:e,task:t,baseFontRef:r}));break;case d:c.quadPoints?g.push(HighlightAnnotation.createNewAnnotation(s,c,n)):g.push(InkAnnotation.createNewAnnotation(s,c,n));break;case p:g.push(InkAnnotation.createNewAnnotation(s,c,n));break;case f:if(!o)break;const i=await a.get(c.bitmapId);if(i.imageStream){const{imageStream:e,smaskStream:t}=i,a=[];if(t){const i=s.getNewTemporaryRef();await writeObject(i,t,a,s);n.push({ref:i,data:a.join("")});e.dict.set("SMask",i);a.length=0}const r=i.imageRef=s.getNewTemporaryRef();await writeObject(r,e,a,s);n.push({ref:r,data:a.join("")});i.imageStream=i.smaskStream=null}g.push(StampAnnotation.createNewAnnotation(s,c,n,{image:i}))}return{annotations:await Promise.all(g),dependencies:n}}static async printNewAnnotations(e,t,i,a,s){if(!a)return null;const{options:r,xref:n}=t,g=[];for(const o of a)if(!o.deleted)switch(o.annotationType){case u:g.push(FreeTextAnnotation.createNewPrintAnnotation(e,n,o,{evaluator:t,task:i,evaluatorOptions:r}));break;case d:o.quadPoints?g.push(HighlightAnnotation.createNewPrintAnnotation(e,n,o,{evaluatorOptions:r})):g.push(InkAnnotation.createNewPrintAnnotation(e,n,o,{evaluatorOptions:r}));break;case p:g.push(InkAnnotation.createNewPrintAnnotation(e,n,o,{evaluatorOptions:r}));break;case f:if(!r.isOffscreenCanvasSupported)break;const a=await s.get(o.bitmapId);if(a.imageStream){const{imageStream:e,smaskStream:t}=a;t&&e.dict.set("SMask",t);a.imageRef=new JpegStream(e,e.length);a.imageStream=a.smaskStream=null}g.push(StampAnnotation.createNewPrintAnnotation(e,n,o,{image:a,evaluatorOptions:r}))}return Promise.all(g)}}function getRgbColor(e,t=new Uint8ClampedArray(3)){if(!Array.isArray(e))return t;const i=t||new Uint8ClampedArray(3);switch(e.length){case 0:return null;case 1:ColorSpace.singletons.gray.getRgbItem(e,0,i,0);return i;case 3:ColorSpace.singletons.rgb.getRgbItem(e,0,i,0);return i;case 4:ColorSpace.singletons.cmyk.getRgbItem(e,0,i,0);return i;default:return t}}function getPdfColorArray(e){return Array.from(e,(e=>e/255))}function getQuadPoints(e,t){const i=e.getArray("QuadPoints");if(!isNumberArray(i,null)||0===i.length||i.length%8>0)return null;const a=new Float32Array(i.length);for(let e=0,s=i.length;e<s;e+=8){const[s,r,n,g,o,c,C,h]=i.slice(e,e+8),l=Math.min(s,n,o,C),Q=Math.max(s,n,o,C),E=Math.min(r,g,c,h),u=Math.max(r,g,c,h);if(null!==t&&(l<t[0]||Q>t[2]||E<t[1]||u>t[3]))return null;a.set([l,u,Q,u,l,E,Q,E],e)}return a}function getTransformMatrix(e,t,i){const[a,s,r,n]=Util.getAxialAlignedBoundingBox(t,i);if(a===r||s===n)return[1,0,0,1,e[0],e[1]];const g=(e[2]-e[0])/(r-a),o=(e[3]-e[1])/(n-s);return[g,0,0,o,e[0]-a*g,e[1]-s*o]}class Annotation{constructor(e){const{dict:t,xref:i,annotationGlobals:a}=e;this.setTitle(t.get("T"));this.setContents(t.get("Contents"));this.setModificationDate(t.get("M"));this.setFlags(t.get("F"));this.setRectangle(t.getArray("Rect"));this.setColor(t.getArray("C"));this.setBorderStyle(t);this.setAppearance(t);this.setOptionalContent(t);const s=t.get("MK");this.setBorderAndBackgroundColors(s);this.setRotation(s,t);this.ref=e.ref instanceof Ref?e.ref:null;this._streams=[];this.appearance&&this._streams.push(this.appearance);const r=!!(this.flags&AA),n=!!(this.flags&eA);if(a.structTreeRoot){let i=t.get("StructParent");i=Number.isInteger(i)&&i>=0?i:-1;a.structTreeRoot.addAnnotationIdToPage(e.pageRef,i)}this.data={annotationFlags:this.flags,borderStyle:this.borderStyle,color:this.color,backgroundColor:this.backgroundColor,borderColor:this.borderColor,rotation:this.rotation,contentsObj:this._contents,hasAppearance:!!this.appearance,id:e.id,modificationDate:this.modificationDate,rect:this.rectangle,subtype:e.subtype,hasOwnCanvas:!1,noRotate:!!(this.flags&_),noHTML:r&&n};if(e.collectFields){const a=t.get("Kids");if(Array.isArray(a)){const e=[];for(const t of a)t instanceof Ref&&e.push(t.toString());0!==e.length&&(this.data.kidIds=e)}this.data.actions=collectActions(i,t,uA);this.data.fieldName=this._constructFieldName(t);this.data.pageIndex=e.pageIndex}this._isOffscreenCanvasSupported=e.evaluatorOptions.isOffscreenCanvasSupported;this._fallbackFontDict=null;this._needAppearances=!1}_hasFlag(e,t){return!!(e&t)}_isViewable(e){return!this._hasFlag(e,Z)&&!this._hasFlag(e,$)}_isPrintable(e){return this._hasFlag(e,z)&&!this._hasFlag(e,V)&&!this._hasFlag(e,Z)}mustBeViewed(e,t){const i=e?.get(this.data.id)?.noView;return void 0!==i?!i:this.viewable&&!this._hasFlag(this.flags,V)}mustBePrinted(e){const t=e?.get(this.data.id)?.noPrint;return void 0!==t?!t:this.printable}get viewable(){return null!==this.data.quadPoints&&(0===this.flags||this._isViewable(this.flags))}get printable(){return null!==this.data.quadPoints&&(0!==this.flags&&this._isPrintable(this.flags))}_parseStringHelper(e){const t="string"==typeof e?stringToPDFString(e):"";return{str:t,dir:t&&"rtl"===bidi(t).dir?"rtl":"ltr"}}setDefaultAppearance(e){const{dict:t,annotationGlobals:i}=e,a=getInheritableProperty({dict:t,key:"DA"})||i.acroForm.get("DA");this._defaultAppearance="string"==typeof a?a:"";this.data.defaultAppearanceData=parseDefaultAppearance(this._defaultAppearance)}setTitle(e){this._title=this._parseStringHelper(e)}setContents(e){this._contents=this._parseStringHelper(e)}setModificationDate(e){this.modificationDate="string"==typeof e?e:null}setFlags(e){this.flags=Number.isInteger(e)&&e>0?e:0;this.flags&Z&&"Annotation"!==this.constructor.name&&(this.flags^=Z)}hasFlag(e){return this._hasFlag(this.flags,e)}setRectangle(e){this.rectangle=lookupNormalRect(e,[0,0,0,0])}setColor(e){this.color=getRgbColor(e)}setLineEndings(e){this.lineEndings=["None","None"];if(Array.isArray(e)&&2===e.length)for(let t=0;t<2;t++){const i=e[t];if(i instanceof Name)switch(i.name){case"None":continue;case"Square":case"Circle":case"Diamond":case"OpenArrow":case"ClosedArrow":case"Butt":case"ROpenArrow":case"RClosedArrow":case"Slash":this.lineEndings[t]=i.name;continue}warn(`Ignoring invalid lineEnding: ${i}`)}}setRotation(e,t){this.rotation=0;let i=e instanceof Dict?e.get("R")||0:t.get("Rotate")||0;if(Number.isInteger(i)&&0!==i){i%=360;i<0&&(i+=360);i%90==0&&(this.rotation=i)}}setBorderAndBackgroundColors(e){if(e instanceof Dict){this.borderColor=getRgbColor(e.getArray("BC"),null);this.backgroundColor=getRgbColor(e.getArray("BG"),null)}else this.borderColor=this.backgroundColor=null}setBorderStyle(e){this.borderStyle=new AnnotationBorderStyle;if(e instanceof Dict)if(e.has("BS")){const t=e.get("BS");if(t instanceof Dict){const e=t.get("Type");if(!e||isName(e,"Border")){this.borderStyle.setWidth(t.get("W"),this.rectangle);this.borderStyle.setStyle(t.get("S"));this.borderStyle.setDashArray(t.getArray("D"))}}}else if(e.has("Border")){const t=e.getArray("Border");if(Array.isArray(t)&&t.length>=3){this.borderStyle.setHorizontalCornerRadius(t[0]);this.borderStyle.setVerticalCornerRadius(t[1]);this.borderStyle.setWidth(t[2],this.rectangle);4===t.length&&this.borderStyle.setDashArray(t[3],!0)}}else this.borderStyle.setWidth(0)}setAppearance(e){this.appearance=null;const t=e.get("AP");if(!(t instanceof Dict))return;const i=t.get("N");if(i instanceof BaseStream){this.appearance=i;return}if(!(i instanceof Dict))return;const a=e.get("AS");if(!(a instanceof Name&&i.has(a.name)))return;const s=i.get(a.name);s instanceof BaseStream&&(this.appearance=s)}setOptionalContent(e){this.oc=null;const t=e.get("OC");t instanceof Name?warn("setOptionalContent: Support for /Name-entry is not implemented."):t instanceof Dict&&(this.oc=t)}loadResources(e,t){return t.dict.getAsync("Resources").then((t=>{if(!t)return;return new ObjectLoader(t,e,t.xref).load().then((function(){return t}))}))}async getOperatorList(e,t,a,s,r){const{hasOwnCanvas:n,id:g,rect:c}=this.data;let C=this.appearance;const h=!!(n&&a&o);if(h&&(c[0]===c[2]||c[1]===c[3])){this.data.hasOwnCanvas=!1;return{opList:new OperatorList,separateForm:!1,separateCanvas:!1}}if(!C){if(!h)return{opList:new OperatorList,separateForm:!1,separateCanvas:!1};C=new StringStream("");C.dict=new Dict}const l=C.dict,Q=await this.loadResources(["ExtGState","ColorSpace","Pattern","Shading","XObject","Font"],C),E=lookupRect(l.getArray("BBox"),[0,0,1,1]),u=lookupMatrix(l.getArray("Matrix"),i),d=getTransformMatrix(c,E,u),f=new OperatorList;let p;this.oc&&(p=await e.parseMarkedContentProps(this.oc,null));void 0!==p&&f.addOp(Je,["OC",p]);f.addOp(We,[g,c,d,u,h]);await e.getOperatorList({stream:C,task:t,resources:Q,operatorList:f,fallbackFontDict:this._fallbackFontDict});f.addOp(je,[]);void 0!==p&&f.addOp(Ye,[]);this.reset();return{opList:f,separateForm:!1,separateCanvas:h}}async save(e,t,i){return null}get hasTextContent(){return!1}async extractTextContent(e,t,i){if(!this.appearance)return;const a=await this.loadResources(["ExtGState","Font","Properties","XObject"],this.appearance),s=[],r=[];let n=null;const g={desiredSize:Math.Infinity,ready:!0,enqueue(e,t){for(const t of e.items)if(void 0!==t.str){n||=t.transform.slice(-2);r.push(t.str);if(t.hasEOL){s.push(r.join("").trimEnd());r.length=0}}}};await e.getTextContent({stream:this.appearance,task:t,resources:a,includeMarkedContent:!0,keepWhiteSpace:!0,sink:g,viewBox:i});this.reset();r.length&&s.push(r.join("").trimEnd());if(s.length>1||s[0]){const e=this.appearance.dict,t=lookupRect(e.getArray("BBox"),null),i=lookupMatrix(e.getArray("Matrix"),null);this.data.textPosition=this._transformPoint(n,t,i);this.data.textContent=s}}_transformPoint(e,t,i){const{rect:a}=this.data;t||=[0,0,1,1];i||=[1,0,0,1,0,0];const s=getTransformMatrix(a,t,i);s[4]-=a[0];s[5]-=a[1];e=Util.applyTransform(e,s);return Util.applyTransform(e,i)}getFieldObject(){return this.data.kidIds?{id:this.data.id,actions:this.data.actions,name:this.data.fieldName,strokeColor:this.data.borderColor,fillColor:this.data.backgroundColor,type:"",kidIds:this.data.kidIds,page:this.data.pageIndex,rotation:this.rotation}:null}reset(){for(const e of this._streams)e.reset()}_constructFieldName(e){if(!e.has("T")&&!e.has("Parent")){warn("Unknown field name, falling back to empty field name.");return""}if(!e.has("Parent"))return stringToPDFString(e.get("T"));const t=[];e.has("T")&&t.unshift(stringToPDFString(e.get("T")));let i=e;const a=new RefSet;e.objId&&a.put(e.objId);for(;i.has("Parent");){i=i.get("Parent");if(!(i instanceof Dict)||i.objId&&a.has(i.objId))break;i.objId&&a.put(i.objId);i.has("T")&&t.unshift(stringToPDFString(i.get("T")))}return t.join(".")}}class AnnotationBorderStyle{constructor(){this.width=1;this.style=hA;this.dashArray=[3];this.horizontalCornerRadius=0;this.verticalCornerRadius=0}setWidth(e,t=[0,0,0,0]){if(e instanceof Name)this.width=0;else if("number"==typeof e){if(e>0){const i=(t[2]-t[0])/2,a=(t[3]-t[1])/2;if(i>0&&a>0&&(e>i||e>a)){warn(`AnnotationBorderStyle.setWidth - ignoring width: ${e}`);e=1}}this.width=e}}setStyle(e){if(e instanceof Name)switch(e.name){case"S":this.style=hA;break;case"D":this.style=BA;break;case"B":this.style=lA;break;case"I":this.style=QA;break;case"U":this.style=EA}}setDashArray(e,t=!1){if(Array.isArray(e)){let i=!0,a=!0;for(const t of e){if(!(+t>=0)){i=!1;break}t>0&&(a=!1)}if(0===e.length||i&&!a){this.dashArray=e;t&&this.setStyle(Name.get("D"))}else this.width=0}else e&&(this.width=0)}setHorizontalCornerRadius(e){Number.isInteger(e)&&(this.horizontalCornerRadius=e)}setVerticalCornerRadius(e){Number.isInteger(e)&&(this.verticalCornerRadius=e)}}class MarkupAnnotation extends Annotation{constructor(e){super(e);const{dict:t}=e;if(t.has("IRT")){const e=t.getRaw("IRT");this.data.inReplyTo=e instanceof Ref?e.toString():null;const i=t.get("RT");this.data.replyType=i instanceof Name?i.name:X}let i=null;if(this.data.replyType===j){const e=t.get("IRT");this.setTitle(e.get("T"));this.data.titleObj=this._title;this.setContents(e.get("Contents"));this.data.contentsObj=this._contents;if(e.has("CreationDate")){this.setCreationDate(e.get("CreationDate"));this.data.creationDate=this.creationDate}else this.data.creationDate=null;if(e.has("M")){this.setModificationDate(e.get("M"));this.data.modificationDate=this.modificationDate}else this.data.modificationDate=null;i=e.getRaw("Popup");if(e.has("C")){this.setColor(e.getArray("C"));this.data.color=this.color}else this.data.color=null}else{this.data.titleObj=this._title;this.setCreationDate(t.get("CreationDate"));this.data.creationDate=this.creationDate;i=t.getRaw("Popup");t.has("C")||(this.data.color=null)}this.data.popupRef=i instanceof Ref?i.toString():null;t.has("RC")&&(this.data.richText=XFAFactory.getRichTextAsHtml(t.get("RC")))}setCreationDate(e){this.creationDate="string"==typeof e?e:null}_setDefaultAppearance({xref:e,extra:t,strokeColor:i,fillColor:a,blendMode:s,strokeAlpha:r,fillAlpha:n,pointsCallback:g}){let o=Number.MAX_VALUE,c=Number.MAX_VALUE,C=Number.MIN_VALUE,h=Number.MIN_VALUE;const l=["q"];t&&l.push(t);i&&l.push(`${i[0]} ${i[1]} ${i[2]} RG`);a&&l.push(`${a[0]} ${a[1]} ${a[2]} rg`);let Q=this.data.quadPoints;Q||(Q=Float32Array.from([this.rectangle[0],this.rectangle[3],this.rectangle[2],this.rectangle[3],this.rectangle[0],this.rectangle[1],this.rectangle[2],this.rectangle[1]]));for(let e=0,t=Q.length;e<t;e+=8){const[t,i,a,s]=g(l,Q.subarray(e,e+8));o=Math.min(o,t);C=Math.max(C,i);c=Math.min(c,a);h=Math.max(h,s)}l.push("Q");const E=new Dict(e),u=new Dict(e);u.set("Subtype",Name.get("Form"));const d=new StringStream(l.join(" "));d.dict=u;E.set("Fm0",d);const f=new Dict(e);s&&f.set("BM",Name.get(s));"number"==typeof r&&f.set("CA",r);"number"==typeof n&&f.set("ca",n);const p=new Dict(e);p.set("GS0",f);const m=new Dict(e);m.set("ExtGState",p);m.set("XObject",E);const y=new Dict(e);y.set("Resources",m);const w=this.data.rect=[o,c,C,h];y.set("BBox",w);this.appearance=new StringStream("/GS0 gs /Fm0 Do");this.appearance.dict=y;this._streams.push(this.appearance,d)}static async createNewAnnotation(e,t,i,a){const s=t.ref||=e.getNewTemporaryRef(),r=await this.createNewAppearanceStream(t,e,a),n=[];let g;if(r){const a=e.getNewTemporaryRef();g=this.createNewDict(t,e,{apRef:a});await writeObject(a,r,n,e);i.push({ref:a,data:n.join("")})}else g=this.createNewDict(t,e,{});Number.isInteger(t.parentTreeId)&&g.set("StructParent",t.parentTreeId);n.length=0;await writeObject(s,g,n,e);return{ref:s,data:n.join("")}}static async createNewPrintAnnotation(e,t,i,a){const s=await this.createNewAppearanceStream(i,t,a),r=this.createNewDict(i,t,{ap:s}),n=new this.prototype.constructor({dict:r,xref:t,annotationGlobals:e,evaluatorOptions:a.evaluatorOptions});i.ref&&(n.ref=n.refToReplace=i.ref);return n}}class WidgetAnnotation extends Annotation{constructor(e){super(e);const{dict:t,xref:i,annotationGlobals:a}=e,s=this.data;this._needAppearances=e.needAppearances;s.annotationType=W;void 0===s.fieldName&&(s.fieldName=this._constructFieldName(t));void 0===s.actions&&(s.actions=collectActions(i,t,uA));let r=getInheritableProperty({dict:t,key:"V",getArray:!0});s.fieldValue=this._decodeFormValue(r);const n=getInheritableProperty({dict:t,key:"DV",getArray:!0});s.defaultFieldValue=this._decodeFormValue(n);if(void 0===r&&a.xfaDatasets){const e=this._title.str;if(e){this._hasValueFromXFA=!0;s.fieldValue=r=a.xfaDatasets.getValue(e)}}void 0===r&&null!==s.defaultFieldValue&&(s.fieldValue=s.defaultFieldValue);s.alternativeText=stringToPDFString(t.get("TU")||"");this.setDefaultAppearance(e);s.hasAppearance||=this._needAppearances&&void 0!==s.fieldValue&&null!==s.fieldValue;const g=getInheritableProperty({dict:t,key:"FT"});s.fieldType=g instanceof Name?g.name:null;const o=getInheritableProperty({dict:t,key:"DR"}),c=a.acroForm.get("DR"),C=this.appearance?.dict.get("Resources");this._fieldResources={localResources:o,acroFormResources:c,appearanceResources:C,mergedResources:Dict.merge({xref:i,dictArray:[o,C,c],mergeSubDicts:!0})};s.fieldFlags=getInheritableProperty({dict:t,key:"Ff"});(!Number.isInteger(s.fieldFlags)||s.fieldFlags<0)&&(s.fieldFlags=0);s.readOnly=this.hasFieldFlag(tA);s.required=this.hasFieldFlag(iA);s.hidden=this._hasFlag(s.annotationFlags,V)||this._hasFlag(s.annotationFlags,$)}_decodeFormValue(e){return Array.isArray(e)?e.filter((e=>"string"==typeof e)).map((e=>stringToPDFString(e))):e instanceof Name?stringToPDFString(e.name):"string"==typeof e?stringToPDFString(e):null}hasFieldFlag(e){return!!(this.data.fieldFlags&e)}_isViewable(e){return!0}mustBeViewed(e,t){return t?this.viewable:super.mustBeViewed(e,t)&&!this._hasFlag(this.flags,$)}getRotationMatrix(e){let t=e?.get(this.data.id)?.rotation;void 0===t&&(t=this.rotation);if(0===t)return i;return getRotationMatrix(t,this.data.rect[2]-this.data.rect[0],this.data.rect[3]-this.data.rect[1])}getBorderAndBackgroundAppearances(e){let t=e?.get(this.data.id)?.rotation;void 0===t&&(t=this.rotation);if(!this.backgroundColor&&!this.borderColor)return"";const i=this.data.rect[2]-this.data.rect[0],a=this.data.rect[3]-this.data.rect[1],s=0===t||180===t?`0 0 ${i} ${a} re`:`0 0 ${a} ${i} re`;let r="";this.backgroundColor&&(r=`${getPdfColor(this.backgroundColor,!0)} ${s} f `);if(this.borderColor){r+=`${this.borderStyle.width||1} w ${getPdfColor(this.borderColor,!1)} ${s} S `}return r}async getOperatorList(e,t,i,a,s){if(a&&!(this instanceof SignatureWidgetAnnotation)&&!this.data.noHTML&&!this.data.hasOwnCanvas)return{opList:new OperatorList,separateForm:!0,separateCanvas:!1};if(!this._hasText)return super.getOperatorList(e,t,i,a,s);const r=await this._getAppearance(e,t,i,s);if(this.appearance&&null===r)return super.getOperatorList(e,t,i,a,s);const n=new OperatorList;if(!this._defaultAppearance||null===r)return{opList:n,separateForm:!1,separateCanvas:!1};const g=!!(this.data.hasOwnCanvas&&i&o),c=[0,0,this.data.rect[2]-this.data.rect[0],this.data.rect[3]-this.data.rect[1]],C=getTransformMatrix(this.data.rect,c,[1,0,0,1,0,0]);let h;this.oc&&(h=await e.parseMarkedContentProps(this.oc,null));void 0!==h&&n.addOp(Je,["OC",h]);n.addOp(We,[this.data.id,this.data.rect,C,this.getRotationMatrix(s),g]);const l=new StringStream(r);await e.getOperatorList({stream:l,task:t,resources:this._fieldResources.mergedResources,operatorList:n});n.addOp(je,[]);void 0!==h&&n.addOp(Ye,[]);return{opList:n,separateForm:!1,separateCanvas:g}}_getMKDict(e){const t=new Dict(null);e&&t.set("R",e);this.borderColor&&t.set("BC",getPdfColorArray(this.borderColor));this.backgroundColor&&t.set("BG",getPdfColorArray(this.backgroundColor));return t.size>0?t:null}amendSavedDict(e,t){}async save(e,t,a){const s=a?.get(this.data.id);let r=s?.value,n=s?.rotation;if(r===this.data.fieldValue||void 0===r){if(!this._hasValueFromXFA&&void 0===n)return null;r||=this.data.fieldValue}if(void 0===n&&!this._hasValueFromXFA&&Array.isArray(r)&&Array.isArray(this.data.fieldValue)&&r.length===this.data.fieldValue.length&&r.every(((e,t)=>e===this.data.fieldValue[t])))return null;void 0===n&&(n=this.rotation);let g=null;if(!this._needAppearances){g=await this._getAppearance(e,t,C,a);if(null===g)return null}let o=!1;if(g?.needAppearances){o=!0;g=null}const{xref:c}=e,h=c.fetchIfRef(this.ref);if(!(h instanceof Dict))return null;const l=new Dict(c);for(const e of h.getKeys())"AP"!==e&&l.set(e,h.getRaw(e));const Q={path:this.data.fieldName,value:r},encoder=e=>isAscii(e)?e:stringToUTF16String(e,!0);l.set("V",Array.isArray(r)?r.map(encoder):encoder(r));this.amendSavedDict(a,l);const E=this._getMKDict(n);E&&l.set("MK",E);const u=[],d=[{ref:this.ref,data:"",xfa:Q,needAppearances:o}];if(null!==g){const e=c.getNewTemporaryRef(),t=new Dict(c);l.set("AP",t);t.set("N",e);const s=this._getSaveFieldResources(c),r=new StringStream(g),n=r.dict=new Dict(c);n.set("Subtype",Name.get("Form"));n.set("Resources",s);n.set("BBox",[0,0,this.data.rect[2]-this.data.rect[0],this.data.rect[3]-this.data.rect[1]]);const o=this.getRotationMatrix(a);o!==i&&n.set("Matrix",o);await writeObject(e,r,u,c);d.push({ref:e,data:u.join(""),xfa:null,needAppearances:!1});u.length=0}l.set("M",`D:${getModificationDate()}`);await writeObject(this.ref,l,u,c);d[0].data=u.join("");return d}async _getAppearance(e,t,i,a){if(this.hasFieldFlag(sA))return null;const s=a?.get(this.data.id);let r,g;if(s){r=s.formattedValue||s.value;g=s.rotation}if(void 0===g&&void 0===r&&!this._needAppearances&&(!this._hasValueFromXFA||this.appearance))return null;const o=this.getBorderAndBackgroundAppearances(a);if(void 0===r){r=this.data.fieldValue;if(!r)return`/Tx BMC q ${o}Q EMC`}Array.isArray(r)&&1===r.length&&(r=r[0]);assert("string"==typeof r,"Expected `value` to be a string.");r=r.trim();if(this.data.combo){const e=this.data.options.find((({exportValue:e})=>r===e));r=e?.displayValue||r}if(""===r)return`/Tx BMC q ${o}Q EMC`;void 0===g&&(g=this.rotation);let c,h=-1;if(this.data.multiLine){c=r.split(/\r\n?|\n/).map((e=>e.normalize("NFC")));h=c.length}else c=[r.replace(/\r\n?|\n/,"").normalize("NFC")];let l=this.data.rect[3]-this.data.rect[1],Q=this.data.rect[2]-this.data.rect[0];90!==g&&270!==g||([Q,l]=[l,Q]);this._defaultAppearance||(this.data.defaultAppearanceData=parseDefaultAppearance(this._defaultAppearance="/Helvetica 0 Tf 0 g"));let E,u,d,f=await WidgetAnnotation._getFontData(e,t,this.data.defaultAppearanceData,this._fieldResources.mergedResources);const p=[];let m=!1;for(const e of c){const t=f.encodeString(e);t.length>1&&(m=!0);p.push(t.join(""))}if(m&&i&C)return{needAppearances:!0};if(m&&this._isOffscreenCanvasSupported){const i=this.data.comb?"monospace":"sans-serif",a=new FakeUnicodeFont(e.xref,i),s=a.createFontResources(c.join("")),n=s.getRaw("Font");if(this._fieldResources.mergedResources.has("Font")){const e=this._fieldResources.mergedResources.get("Font");for(const t of n.getKeys())e.set(t,n.getRaw(t))}else this._fieldResources.mergedResources.set("Font",n);const g=a.fontName.name;f=await WidgetAnnotation._getFontData(e,t,{fontName:g,fontSize:0},s);for(let e=0,t=p.length;e<t;e++)p[e]=stringToUTF16String(c[e]);const o=Object.assign(Object.create(null),this.data.defaultAppearanceData);this.data.defaultAppearanceData.fontSize=0;this.data.defaultAppearanceData.fontName=g;[E,u,d]=this._computeFontSize(l-2,Q-4,r,f,h);this.data.defaultAppearanceData=o}else{this._isOffscreenCanvasSupported||warn("_getAppearance: OffscreenCanvas is not supported, annotation may not render correctly.");[E,u,d]=this._computeFontSize(l-2,Q-4,r,f,h)}let y=f.descent;y=isNaN(y)?n*d:Math.max(n*d,Math.abs(y)*u);const w=Math.min(Math.floor((l-u)/2),1),D=this.data.textAlignment;if(this.data.multiLine)return this._getMultilineAppearance(E,p,f,u,Q,l,D,2,w,y,d,a);if(this.data.comb)return this._getCombAppearance(E,f,p[0],u,Q,l,2,w,y,d,a);const b=w+y;if(0===D||D>2)return`/Tx BMC q ${o}BT `+E+` 1 0 0 1 ${numberToString(2)} ${numberToString(b)} Tm (${escapeString(p[0])}) Tj ET Q EMC`;return`/Tx BMC q ${o}BT `+E+` 1 0 0 1 0 0 Tm ${this._renderText(p[0],f,u,Q,D,{shift:0},2,b)} ET Q EMC`}static async _getFontData(e,t,i,a){const s=new OperatorList,r={font:null,clone(){return this}},{fontName:n,fontSize:g}=i;await e.handleSetFont(a,[n&&Name.get(n),g],null,s,t,r,null);return r.font}_getTextWidth(e,t){return t.charsToGlyphs(e).reduce(((e,t)=>e+t.width),0)/1e3}_computeFontSize(e,t,i,a,r){let{fontSize:n}=this.data.defaultAppearanceData,g=(n||12)*s,o=Math.round(e/g);if(!n){const roundWithTwoDigits=e=>Math.floor(100*e)/100;if(-1===r){const r=this._getTextWidth(i,a);n=roundWithTwoDigits(Math.min(e/s,r>t?t/r:1/0));o=1}else{const c=i.split(/\r\n?|\n/),C=[];for(const e of c){const t=a.encodeString(e).join(""),i=a.charsToGlyphs(t),s=a.getCharPositions(t);C.push({line:t,glyphs:i,positions:s})}const isTooBig=i=>{let s=0;for(const r of C){s+=this._splitLine(null,a,i,t,r).length*i;if(s>e)return!0}return!1};o=Math.max(o,r);for(;;){g=e/o;n=roundWithTwoDigits(g/s);if(!isTooBig(n))break;o++}}const{fontName:c,fontColor:C}=this.data.defaultAppearanceData;this._defaultAppearance=function createDefaultAppearance({fontSize:e,fontName:t,fontColor:i}){return`/${escapePDFName(t)} ${e} Tf ${getPdfColor(i,!0)}`}({fontSize:n,fontName:c,fontColor:C})}return[this._defaultAppearance,n,e/o]}_renderText(e,t,i,a,s,r,n,g){let o;if(1===s){o=(a-this._getTextWidth(e,t)*i)/2}else if(2===s){o=a-this._getTextWidth(e,t)*i-n}else o=n;const c=numberToString(o-r.shift);r.shift=o;return`${c} ${g=numberToString(g)} Td (${escapeString(e)}) Tj`}_getSaveFieldResources(e){const{localResources:t,appearanceResources:i,acroFormResources:a}=this._fieldResources,s=this.data.defaultAppearanceData?.fontName;if(!s)return t||Dict.empty;for(const e of[t,i])if(e instanceof Dict){const t=e.get("Font");if(t instanceof Dict&&t.has(s))return e}if(a instanceof Dict){const i=a.get("Font");if(i instanceof Dict&&i.has(s)){const a=new Dict(e);a.set(s,i.getRaw(s));const r=new Dict(e);r.set("Font",a);return Dict.merge({xref:e,dictArray:[r,t],mergeSubDicts:!0})}}return t||Dict.empty}getFieldObject(){return null}}class TextWidgetAnnotation extends WidgetAnnotation{constructor(e){super(e);const{dict:t}=e;if(t.has("PMD")){this.flags|=V;this.data.hidden=!0;warn("Barcodes are not supported")}this.data.hasOwnCanvas=this.data.readOnly&&!this.data.noHTML;this._hasText=!0;"string"!=typeof this.data.fieldValue&&(this.data.fieldValue="");let i=getInheritableProperty({dict:t,key:"Q"});(!Number.isInteger(i)||i<0||i>2)&&(i=null);this.data.textAlignment=i;let a=getInheritableProperty({dict:t,key:"MaxLen"});(!Number.isInteger(a)||a<0)&&(a=0);this.data.maxLen=a;this.data.multiLine=this.hasFieldFlag(aA);this.data.comb=this.hasFieldFlag(CA)&&!this.hasFieldFlag(aA)&&!this.hasFieldFlag(sA)&&!this.hasFieldFlag(oA)&&0!==this.data.maxLen;this.data.doNotScroll=this.hasFieldFlag(cA)}get hasTextContent(){return!!this.appearance&&!this._needAppearances}_getCombAppearance(e,t,i,a,s,r,n,g,o,c,C){const h=s/this.data.maxLen,l=this.getBorderAndBackgroundAppearances(C),Q=[],E=t.getCharPositions(i);for(const[e,t]of E)Q.push(`(${escapeString(i.substring(e,t))}) Tj`);const u=Q.join(` ${numberToString(h)} 0 Td `);return`/Tx BMC q ${l}BT `+e+` 1 0 0 1 ${numberToString(n)} ${numberToString(g+o)} Tm ${u} ET Q EMC`}_getMultilineAppearance(e,t,i,a,s,r,n,g,o,c,C,h){const l=[],Q=s-2*g,E={shift:0};for(let e=0,r=t.length;e<r;e++){const r=t[e],h=this._splitLine(r,i,a,Q);for(let t=0,r=h.length;t<r;t++){const r=h[t],Q=0===e&&0===t?-o-(C-c):-C;l.push(this._renderText(r,i,a,s,n,E,g,Q))}}const u=this.getBorderAndBackgroundAppearances(h),d=l.join("\n");return`/Tx BMC q ${u}BT `+e+` 1 0 0 1 0 ${numberToString(r)} Tm ${d} ET Q EMC`}_splitLine(e,t,i,a,s={}){e=s.line||e;const r=s.glyphs||t.charsToGlyphs(e);if(r.length<=1)return[e];const n=s.positions||t.getCharPositions(e),g=i/1e3,o=[];let c=-1,C=-1,h=-1,l=0,Q=0;for(let t=0,i=r.length;t<i;t++){const[i,s]=n[t],E=r[t],u=E.width*g;if(" "===E.unicode)if(Q+u>a){o.push(e.substring(l,i));l=i;Q=u;c=-1;h=-1}else{Q+=u;c=i;C=s;h=t}else if(Q+u>a)if(-1!==c){o.push(e.substring(l,C));l=C;t=h+1;c=-1;Q=0}else{o.push(e.substring(l,i));l=i;Q=u}else Q+=u}l<e.length&&o.push(e.substring(l,e.length));return o}getFieldObject(){return{id:this.data.id,value:this.data.fieldValue,defaultValue:this.data.defaultFieldValue||"",multiline:this.data.multiLine,password:this.hasFieldFlag(sA),charLimit:this.data.maxLen,comb:this.data.comb,editable:!this.data.readOnly,hidden:this.data.hidden,name:this.data.fieldName,rect:this.data.rect,actions:this.data.actions,page:this.data.pageIndex,strokeColor:this.data.borderColor,fillColor:this.data.backgroundColor,rotation:this.rotation,type:"text"}}}class ButtonWidgetAnnotation extends WidgetAnnotation{constructor(e){super(e);this.checkedAppearance=null;this.uncheckedAppearance=null;this.data.checkBox=!this.hasFieldFlag(rA)&&!this.hasFieldFlag(nA);this.data.radioButton=this.hasFieldFlag(rA)&&!this.hasFieldFlag(nA);this.data.pushButton=this.hasFieldFlag(nA);this.data.isTooltipOnly=!1;if(this.data.checkBox)this._processCheckBox(e);else if(this.data.radioButton)this._processRadioButton(e);else if(this.data.pushButton){this.data.hasOwnCanvas=!0;this.data.noHTML=!1;this._processPushButton(e)}else warn("Invalid field flags for button widget annotation")}async getOperatorList(e,t,a,s,r){if(this.data.pushButton)return super.getOperatorList(e,t,a,!1,r);let n=null,g=null;if(r){const e=r.get(this.data.id);n=e?e.value:null;g=e?e.rotation:null}if(null===n&&this.appearance)return super.getOperatorList(e,t,a,s,r);null==n&&(n=this.data.checkBox?this.data.fieldValue===this.data.exportValue:this.data.fieldValue===this.data.buttonValue);const o=n?this.checkedAppearance:this.uncheckedAppearance;if(o){const n=this.appearance,c=lookupMatrix(o.dict.getArray("Matrix"),i);g&&o.dict.set("Matrix",this.getRotationMatrix(r));this.appearance=o;const C=super.getOperatorList(e,t,a,s,r);this.appearance=n;o.dict.set("Matrix",c);return C}return{opList:new OperatorList,separateForm:!1,separateCanvas:!1}}async save(e,t,i){return this.data.checkBox?this._saveCheckbox(e,t,i):this.data.radioButton?this._saveRadioButton(e,t,i):null}async _saveCheckbox(e,t,i){if(!i)return null;const a=i.get(this.data.id);let s=a?.rotation,r=a?.value;if(void 0===s){if(void 0===r)return null;if(this.data.fieldValue===this.data.exportValue===r)return null}const n=e.xref.fetchIfRef(this.ref);if(!(n instanceof Dict))return null;void 0===s&&(s=this.rotation);void 0===r&&(r=this.data.fieldValue===this.data.exportValue);const g={path:this.data.fieldName,value:r?this.data.exportValue:""},o=Name.get(r?this.data.exportValue:"Off");n.set("V",o);n.set("AS",o);n.set("M",`D:${getModificationDate()}`);const c=this._getMKDict(s);c&&n.set("MK",c);const C=[];await writeObject(this.ref,n,C,e.xref);return[{ref:this.ref,data:C.join(""),xfa:g}]}async _saveRadioButton(e,t,i){if(!i)return null;const a=i.get(this.data.id);let s=a?.rotation,r=a?.value;if(void 0===s){if(void 0===r)return null;if(this.data.fieldValue===this.data.buttonValue===r)return null}const n=e.xref.fetchIfRef(this.ref);if(!(n instanceof Dict))return null;void 0===r&&(r=this.data.fieldValue===this.data.buttonValue);void 0===s&&(s=this.rotation);const g={path:this.data.fieldName,value:r?this.data.buttonValue:""},o=Name.get(r?this.data.buttonValue:"Off"),c=[];let C=null;if(r)if(this.parent instanceof Ref){const t=e.xref.fetch(this.parent);t.set("V",o);await writeObject(this.parent,t,c,e.xref);C=c.join("");c.length=0}else this.parent instanceof Dict&&this.parent.set("V",o);n.set("AS",o);n.set("M",`D:${getModificationDate()}`);const h=this._getMKDict(s);h&&n.set("MK",h);await writeObject(this.ref,n,c,e.xref);const l=[{ref:this.ref,data:c.join(""),xfa:g}];C&&l.push({ref:this.parent,data:C,xfa:null});return l}_getDefaultCheckedAppearance(e,t){const i=this.data.rect[2]-this.data.rect[0],a=this.data.rect[3]-this.data.rect[1],s=[0,0,i,a],r=.8*Math.min(i,a);let n,g;if("check"===t){n={width:.755*r,height:.705*r};g="3"}else if("disc"===t){n={width:.791*r,height:.705*r};g="l"}else unreachable(`_getDefaultCheckedAppearance - unsupported type: ${t}`);const o=`q BT /PdfJsZaDb ${r} Tf 0 g ${numberToString((i-n.width)/2)} ${numberToString((a-n.height)/2)} Td (${g}) Tj ET Q`,c=new Dict(e.xref);c.set("FormType",1);c.set("Subtype",Name.get("Form"));c.set("Type",Name.get("XObject"));c.set("BBox",s);c.set("Matrix",[1,0,0,1,0,0]);c.set("Length",o.length);const C=new Dict(e.xref),h=new Dict(e.xref);h.set("PdfJsZaDb",this.fallbackFontDict);C.set("Font",h);c.set("Resources",C);this.checkedAppearance=new StringStream(o);this.checkedAppearance.dict=c;this._streams.push(this.checkedAppearance)}_processCheckBox(e){const t=e.dict.get("AP");if(!(t instanceof Dict))return;const i=t.get("N");if(!(i instanceof Dict))return;const a=this._decodeFormValue(e.dict.get("AS"));"string"==typeof a&&(this.data.fieldValue=a);const s=null!==this.data.fieldValue&&"Off"!==this.data.fieldValue?this.data.fieldValue:"Yes",r=i.getKeys();if(0===r.length)r.push("Off",s);else if(1===r.length)"Off"===r[0]?r.push(s):r.unshift("Off");else if(r.includes(s)){r.length=0;r.push("Off",s)}else{const e=r.find((e=>"Off"!==e));r.length=0;r.push("Off",e)}r.includes(this.data.fieldValue)||(this.data.fieldValue="Off");this.data.exportValue=r[1];const n=i.get(this.data.exportValue);this.checkedAppearance=n instanceof BaseStream?n:null;const g=i.get("Off");this.uncheckedAppearance=g instanceof BaseStream?g:null;this.checkedAppearance?this._streams.push(this.checkedAppearance):this._getDefaultCheckedAppearance(e,"check");this.uncheckedAppearance&&this._streams.push(this.uncheckedAppearance);this._fallbackFontDict=this.fallbackFontDict;null===this.data.defaultFieldValue&&(this.data.defaultFieldValue="Off")}_processRadioButton(e){this.data.buttonValue=null;const t=e.dict.get("Parent");if(t instanceof Dict){this.parent=e.dict.getRaw("Parent");const i=t.get("V");i instanceof Name&&(this.data.fieldValue=this._decodeFormValue(i))}const i=e.dict.get("AP");if(!(i instanceof Dict))return;const a=i.get("N");if(!(a instanceof Dict))return;for(const e of a.getKeys())if("Off"!==e){this.data.buttonValue=this._decodeFormValue(e);break}const s=a.get(this.data.buttonValue);this.checkedAppearance=s instanceof BaseStream?s:null;const r=a.get("Off");this.uncheckedAppearance=r instanceof BaseStream?r:null;this.checkedAppearance?this._streams.push(this.checkedAppearance):this._getDefaultCheckedAppearance(e,"disc");this.uncheckedAppearance&&this._streams.push(this.uncheckedAppearance);this._fallbackFontDict=this.fallbackFontDict;null===this.data.defaultFieldValue&&(this.data.defaultFieldValue="Off")}_processPushButton(e){const{dict:t,annotationGlobals:i}=e;if(t.has("A")||t.has("AA")||this.data.alternativeText){this.data.isTooltipOnly=!t.has("A")&&!t.has("AA");Catalog.parseDestDictionary({destDict:t,resultObj:this.data,docBaseUrl:i.baseUrl,docAttachments:i.attachments})}else warn("Push buttons without action dictionaries are not supported")}getFieldObject(){let e,t="button";if(this.data.checkBox){t="checkbox";e=this.data.exportValue}else if(this.data.radioButton){t="radiobutton";e=this.data.buttonValue}return{id:this.data.id,value:this.data.fieldValue||"Off",defaultValue:this.data.defaultFieldValue,exportValues:e,editable:!this.data.readOnly,name:this.data.fieldName,rect:this.data.rect,hidden:this.data.hidden,actions:this.data.actions,page:this.data.pageIndex,strokeColor:this.data.borderColor,fillColor:this.data.backgroundColor,rotation:this.rotation,type:t}}get fallbackFontDict(){const e=new Dict;e.set("BaseFont",Name.get("ZapfDingbats"));e.set("Type",Name.get("FallbackType"));e.set("Subtype",Name.get("FallbackType"));e.set("Encoding",Name.get("ZapfDingbatsEncoding"));return shadow(this,"fallbackFontDict",e)}}class ChoiceWidgetAnnotation extends WidgetAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e;this.indices=t.getArray("I");this.hasIndices=Array.isArray(this.indices)&&this.indices.length>0;this.data.options=[];const a=getInheritableProperty({dict:t,key:"Opt"});if(Array.isArray(a))for(let e=0,t=a.length;e<t;e++){const t=i.fetchIfRef(a[e]),s=Array.isArray(t);this.data.options[e]={exportValue:this._decodeFormValue(s?i.fetchIfRef(t[0]):t),displayValue:this._decodeFormValue(s?i.fetchIfRef(t[1]):t)}}if(this.hasIndices){this.data.fieldValue=[];const e=this.data.options.length;for(const t of this.indices)Number.isInteger(t)&&t>=0&&t<e&&this.data.fieldValue.push(this.data.options[t].exportValue)}else"string"==typeof this.data.fieldValue?this.data.fieldValue=[this.data.fieldValue]:this.data.fieldValue||(this.data.fieldValue=[]);this.data.combo=this.hasFieldFlag(gA);this.data.multiSelect=this.hasFieldFlag(IA);this._hasText=!0}getFieldObject(){const e=this.data.combo?"combobox":"listbox",t=this.data.fieldValue.length>0?this.data.fieldValue[0]:null;return{id:this.data.id,value:t,defaultValue:this.data.defaultFieldValue,editable:!this.data.readOnly,name:this.data.fieldName,rect:this.data.rect,numItems:this.data.fieldValue.length,multipleSelection:this.data.multiSelect,hidden:this.data.hidden,actions:this.data.actions,items:this.data.options,page:this.data.pageIndex,strokeColor:this.data.borderColor,fillColor:this.data.backgroundColor,rotation:this.rotation,type:e}}amendSavedDict(e,t){if(!this.hasIndices)return;let i=e?.get(this.data.id)?.value;Array.isArray(i)||(i=[i]);const a=[],{options:s}=this.data;for(let e=0,t=0,r=s.length;e<r;e++)if(s[e].exportValue===i[t]){a.push(e);t+=1}t.set("I",a)}async _getAppearance(e,t,i,a){if(this.data.combo)return super._getAppearance(e,t,i,a);let r,n;const g=a?.get(this.data.id);if(g){n=g.rotation;r=g.value}if(void 0===n&&void 0===r&&!this._needAppearances)return null;void 0===r?r=this.data.fieldValue:Array.isArray(r)||(r=[r]);let o=this.data.rect[3]-this.data.rect[1],c=this.data.rect[2]-this.data.rect[0];90!==n&&270!==n||([c,o]=[o,c]);const C=this.data.options.length,h=[];for(let e=0;e<C;e++){const{exportValue:t}=this.data.options[e];r.includes(t)&&h.push(e)}this._defaultAppearance||(this.data.defaultAppearanceData=parseDefaultAppearance(this._defaultAppearance="/Helvetica 0 Tf 0 g"));const l=await WidgetAnnotation._getFontData(e,t,this.data.defaultAppearanceData,this._fieldResources.mergedResources);let Q,{fontSize:E}=this.data.defaultAppearanceData;if(E)Q=this._defaultAppearance;else{const e=(o-1)/C;let t,i=-1;for(const{displayValue:e}of this.data.options){const a=this._getTextWidth(e,l);if(a>i){i=a;t=e}}[Q,E]=this._computeFontSize(e,c-4,t,l,-1)}const u=E*s,d=(u-E)/2,f=Math.floor(o/u);let p=0;if(h.length>0){const e=Math.min(...h),t=Math.max(...h);p=Math.max(0,t-f+1);p>e&&(p=e)}const m=Math.min(p+f+1,C),y=["/Tx BMC q",`1 1 ${c} ${o} re W n`];if(h.length){y.push("0.600006 0.756866 0.854904 rg");for(const e of h)p<=e&&e<m&&y.push(`1 ${o-(e-p+1)*u} ${c} ${u} re f`)}y.push("BT",Q,`1 0 0 1 0 ${o} Tm`);const w={shift:0};for(let e=p;e<m;e++){const{displayValue:t}=this.data.options[e],i=e===p?d:0;y.push(this._renderText(t,l,E,c,0,w,2,-u+i))}y.push("ET Q EMC");return y.join("\n")}}class SignatureWidgetAnnotation extends WidgetAnnotation{constructor(e){super(e);this.data.fieldValue=null;this.data.hasOwnCanvas=this.data.noRotate;this.data.noHTML=!this.data.hasOwnCanvas}getFieldObject(){return{id:this.data.id,value:null,page:this.data.pageIndex,type:"signature"}}}class TextAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.noRotate=!0;this.data.hasOwnCanvas=this.data.noRotate;this.data.noHTML=!1;const{dict:t}=e;this.data.annotationType=S;if(this.data.hasAppearance)this.data.name="NoIcon";else{this.data.rect[1]=this.data.rect[3]-22;this.data.rect[2]=this.data.rect[0]+22;this.data.name=t.has("Name")?t.get("Name").name:"Note"}if(t.has("State")){this.data.state=t.get("State")||null;this.data.stateModel=t.get("StateModel")||null}else{this.data.state=null;this.data.stateModel=null}}}class LinkAnnotation extends Annotation{constructor(e){super(e);const{dict:t,annotationGlobals:i}=e;this.data.annotationType=k;this.data.noHTML=!1;const a=getQuadPoints(t,this.rectangle);a&&(this.data.quadPoints=a);this.data.borderColor||=this.data.color;Catalog.parseDestDictionary({destDict:t,resultObj:this.data,docBaseUrl:i.baseUrl,docAttachments:i.attachments})}}class PopupAnnotation extends Annotation{constructor(e){super(e);const{dict:t}=e;this.data.annotationType=q;this.data.noHTML=!1;this.data.rect[0]!==this.data.rect[2]&&this.data.rect[1]!==this.data.rect[3]||(this.data.rect=null);let i=t.get("Parent");if(!i){warn("Popup annotation has a missing or invalid parent annotation.");return}this.data.parentRect=lookupNormalRect(i.getArray("Rect"),null);isName(i.get("RT"),j)&&(i=i.get("IRT"));if(i.has("M")){this.setModificationDate(i.get("M"));this.data.modificationDate=this.modificationDate}else this.data.modificationDate=null;if(i.has("C")){this.setColor(i.getArray("C"));this.data.color=this.color}else this.data.color=null;if(!this.viewable){const e=i.get("F");this._isViewable(e)&&this.setFlags(e)}this.setTitle(i.get("T"));this.data.titleObj=this._title;this.setContents(i.get("Contents"));this.data.contentsObj=this._contents;i.has("RC")&&(this.data.richText=XFAFactory.getRichTextAsHtml(i.get("RC")));this.data.open=!!t.get("Open")}}class FreeTextAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.hasOwnCanvas=!this.data.noHTML;this.data.noHTML=!1;const{evaluatorOptions:t,xref:i}=e;this.data.annotationType=R;this.setDefaultAppearance(e);this._hasAppearance=!!this.appearance;if(this._hasAppearance){const{fontColor:e,fontSize:a}=function parseAppearanceStream(e,t,i){return new AppearanceStreamEvaluator(e,t,i).parse()}(this.appearance,t,i);this.data.defaultAppearanceData.fontColor=e;this.data.defaultAppearanceData.fontSize=a||10}else{this.data.defaultAppearanceData.fontSize||=10;const{fontColor:t,fontSize:a}=this.data.defaultAppearanceData;if(this._contents.str){this.data.textContent=this._contents.str.split(/\r\n?|\n/).map((e=>e.trimEnd()));const{coords:e,bbox:t,matrix:i}=FakeUnicodeFont.getFirstPositionInfo(this.rectangle,this.rotation,a);this.data.textPosition=this._transformPoint(e,t,i)}if(this._isOffscreenCanvasSupported){const s=e.dict.get("CA"),r=new FakeUnicodeFont(i,"sans-serif");this.appearance=r.createAppearance(this._contents.str,this.rectangle,this.rotation,a,t,s);this._streams.push(this.appearance)}else warn("FreeTextAnnotation: OffscreenCanvas is not supported, annotation may not render correctly.")}}get hasTextContent(){return this._hasAppearance}static createNewDict(e,t,{apRef:i,ap:a}){const{color:s,fontSize:r,rect:n,rotation:g,user:o,value:c}=e,C=new Dict(t);C.set("Type",Name.get("Annot"));C.set("Subtype",Name.get("FreeText"));C.set("CreationDate",`D:${getModificationDate()}`);C.set("Rect",n);const h=`/Helv ${r} Tf ${getPdfColor(s,!0)}`;C.set("DA",h);C.set("Contents",isAscii(c)?c:stringToUTF16String(c,!0));C.set("F",4);C.set("Border",[0,0,0]);C.set("Rotate",g);o&&C.set("T",isAscii(o)?o:stringToUTF16String(o,!0));if(i||a){const e=new Dict(t);C.set("AP",e);i?e.set("N",i):e.set("N",a)}return C}static async createNewAppearanceStream(e,t,i){const{baseFontRef:a,evaluator:r,task:n}=i,{color:g,fontSize:o,rect:c,rotation:C,value:h}=e,l=new Dict(t),Q=new Dict(t);if(a)Q.set("Helv",a);else{const e=new Dict(t);e.set("BaseFont",Name.get("Helvetica"));e.set("Type",Name.get("Font"));e.set("Subtype",Name.get("Type1"));e.set("Encoding",Name.get("WinAnsiEncoding"));Q.set("Helv",e)}l.set("Font",Q);const E=await WidgetAnnotation._getFontData(r,n,{fontName:"Helv",fontSize:o},l),[u,d,f,p]=c;let m=f-u,y=p-d;C%180!=0&&([m,y]=[y,m]);const w=h.split("\n"),D=o/1e3;let b=-1/0;const F=[];for(let e of w){const t=E.encodeString(e);if(t.length>1)return null;e=t.join("");F.push(e);let i=0;const a=E.charsToGlyphs(e);for(const e of a)i+=e.width*D;b=Math.max(b,i)}let S=1;b>m&&(S=m/b);let k=1;const R=s*o,N=1*o,G=R*w.length;G>y&&(k=y/G);const x=o*Math.min(S,k);let U,M,L;switch(C){case 0:L=[1,0,0,1];M=[c[0],c[1],m,y];U=[c[0],c[3]-N];break;case 90:L=[0,1,-1,0];M=[c[1],-c[2],m,y];U=[c[1],-c[0]-N];break;case 180:L=[-1,0,0,-1];M=[-c[2],-c[3],m,y];U=[-c[2],-c[1]-N];break;case 270:L=[0,-1,1,0];M=[-c[3],c[0],m,y];U=[-c[3],c[2]-N]}const H=["q",`${L.join(" ")} 0 0 cm`,`${M.join(" ")} re W n`,"BT",`${getPdfColor(g,!0)}`,`0 Tc /Helv ${numberToString(x)} Tf`];H.push(`${U.join(" ")} Td (${escapeString(F[0])}) Tj`);const J=numberToString(R);for(let e=1,t=F.length;e<t;e++){const t=F[e];H.push(`0 -${J} Td (${escapeString(t)}) Tj`)}H.push("ET","Q");const Y=H.join("\n"),v=new Dict(t);v.set("FormType",1);v.set("Subtype",Name.get("Form"));v.set("Type",Name.get("XObject"));v.set("BBox",c);v.set("Resources",l);v.set("Matrix",[1,0,0,1,-c[0],-c[1]]);const K=new StringStream(Y);K.dict=v;return K}}class LineAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e;this.data.annotationType=N;this.data.hasOwnCanvas=this.data.noRotate;this.data.noHTML=!1;const a=lookupRect(t.getArray("L"),[0,0,0,0]);this.data.lineCoordinates=Util.normalizeRect(a);this.setLineEndings(t.getArray("LE"));this.data.lineEndings=this.lineEndings;if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],s=t.get("CA"),r=getRgbColor(t.getArray("IC"),null),n=r?getPdfColorArray(r):null,g=n?s:null,o=this.borderStyle.width||1,c=2*o,C=[this.data.lineCoordinates[0]-c,this.data.lineCoordinates[1]-c,this.data.lineCoordinates[2]+c,this.data.lineCoordinates[3]+c];Util.intersect(this.rectangle,C)||(this.rectangle=C);this._setDefaultAppearance({xref:i,extra:`${o} w`,strokeColor:e,fillColor:n,strokeAlpha:s,fillAlpha:g,pointsCallback:(e,t)=>{e.push(`${a[0]} ${a[1]} m`,`${a[2]} ${a[3]} l`,"S");return[t[0]-o,t[2]+o,t[7]-o,t[3]+o]}})}}}class SquareAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e;this.data.annotationType=G;this.data.hasOwnCanvas=this.data.noRotate;this.data.noHTML=!1;if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],a=t.get("CA"),s=getRgbColor(t.getArray("IC"),null),r=s?getPdfColorArray(s):null,n=r?a:null;if(0===this.borderStyle.width&&!r)return;this._setDefaultAppearance({xref:i,extra:`${this.borderStyle.width} w`,strokeColor:e,fillColor:r,strokeAlpha:a,fillAlpha:n,pointsCallback:(e,t)=>{const i=t[4]+this.borderStyle.width/2,a=t[5]+this.borderStyle.width/2,s=t[6]-t[4]-this.borderStyle.width,n=t[3]-t[7]-this.borderStyle.width;e.push(`${i} ${a} ${s} ${n} re`);r?e.push("B"):e.push("S");return[t[0],t[2],t[7],t[3]]}})}}}class CircleAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e;this.data.annotationType=x;if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],a=t.get("CA"),s=getRgbColor(t.getArray("IC"),null),r=s?getPdfColorArray(s):null,n=r?a:null;if(0===this.borderStyle.width&&!r)return;const g=4/3*Math.tan(Math.PI/8);this._setDefaultAppearance({xref:i,extra:`${this.borderStyle.width} w`,strokeColor:e,fillColor:r,strokeAlpha:a,fillAlpha:n,pointsCallback:(e,t)=>{const i=t[0]+this.borderStyle.width/2,a=t[1]-this.borderStyle.width/2,s=t[6]-this.borderStyle.width/2,n=t[7]+this.borderStyle.width/2,o=i+(s-i)/2,c=a+(n-a)/2,C=(s-i)/2*g,h=(n-a)/2*g;e.push(`${o} ${n} m`,`${o+C} ${n} ${s} ${c+h} ${s} ${c} c`,`${s} ${c-h} ${o+C} ${a} ${o} ${a} c`,`${o-C} ${a} ${i} ${c-h} ${i} ${c} c`,`${i} ${c+h} ${o-C} ${n} ${o} ${n} c`,"h");r?e.push("B"):e.push("S");return[t[0],t[2],t[7],t[3]]}})}}}class PolylineAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e;this.data.annotationType=M;this.data.hasOwnCanvas=this.data.noRotate;this.data.noHTML=!1;this.data.vertices=null;if(!(this instanceof PolygonAnnotation)){this.setLineEndings(t.getArray("LE"));this.data.lineEndings=this.lineEndings}const a=t.getArray("Vertices");if(!isNumberArray(a,null))return;const s=this.data.vertices=Float32Array.from(a);if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],a=t.get("CA"),r=this.borderStyle.width||1,n=2*r,g=[1/0,1/0,-1/0,-1/0];for(let e=0,t=s.length;e<t;e+=2){g[0]=Math.min(g[0],s[e]-n);g[1]=Math.min(g[1],s[e+1]-n);g[2]=Math.max(g[2],s[e]+n);g[3]=Math.max(g[3],s[e+1]+n)}Util.intersect(this.rectangle,g)||(this.rectangle=g);this._setDefaultAppearance({xref:i,extra:`${r} w`,strokeColor:e,strokeAlpha:a,pointsCallback:(e,t)=>{for(let t=0,i=s.length;t<i;t+=2)e.push(`${s[t]} ${s[t+1]} ${0===t?"m":"l"}`);e.push("S");return[t[0],t[2],t[7],t[3]]}})}}}class PolygonAnnotation extends PolylineAnnotation{constructor(e){super(e);this.data.annotationType=U}}class CaretAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.annotationType=K}}class InkAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.hasOwnCanvas=this.data.noRotate;this.data.noHTML=!1;const{dict:t,xref:i}=e;this.data.annotationType=T;this.data.inkLists=[];const a=t.getArray("InkList");if(Array.isArray(a)){for(let e=0,t=a.length;e<t;++e){if(!Array.isArray(a[e]))continue;const t=new Float32Array(a[e].length);this.data.inkLists.push(t);for(let s=0,r=a[e].length;s<r;s+=2){const r=i.fetchIfRef(a[e][s]),n=i.fetchIfRef(a[e][s+1]);if("number"==typeof r&&"number"==typeof n){t[s]=r;t[s+1]=n}}}if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],a=t.get("CA"),s=this.borderStyle.width||1,r=2*s,n=[1/0,1/0,-1/0,-1/0];for(const e of this.data.inkLists)for(let t=0,i=e.length;t<i;t+=2){n[0]=Math.min(n[0],e[t]-r);n[1]=Math.min(n[1],e[t+1]-r);n[2]=Math.max(n[2],e[t]+r);n[3]=Math.max(n[3],e[t+1]+r)}Util.intersect(this.rectangle,n)||(this.rectangle=n);this._setDefaultAppearance({xref:i,extra:`${s} w`,strokeColor:e,strokeAlpha:a,pointsCallback:(e,t)=>{for(const t of this.data.inkLists){for(let i=0,a=t.length;i<a;i+=2)e.push(`${t[i]} ${t[i+1]} ${0===i?"m":"l"}`);e.push("S")}return[t[0],t[2],t[7],t[3]]}})}}}static createNewDict(e,t,{apRef:i,ap:a}){const{color:s,opacity:r,paths:n,outlines:g,rect:o,rotation:c,thickness:C}=e,h=new Dict(t);h.set("Type",Name.get("Annot"));h.set("Subtype",Name.get("Ink"));h.set("CreationDate",`D:${getModificationDate()}`);h.set("Rect",o);h.set("InkList",g?.points||n.map((e=>e.points)));h.set("F",4);h.set("Rotate",c);g&&h.set("IT",Name.get("InkHighlight"));const l=new Dict(t);h.set("BS",l);l.set("W",C);h.set("C",Array.from(s,(e=>e/255)));h.set("CA",r);const Q=new Dict(t);h.set("AP",Q);i?Q.set("N",i):Q.set("N",a);return h}static async createNewAppearanceStream(e,t,i){if(e.outlines)return this.createNewAppearanceStreamForHighlight(e,t,i);const{color:a,rect:s,paths:r,thickness:n,opacity:g}=e,o=[`${n} w 1 J 1 j`,`${getPdfColor(a,!1)}`];1!==g&&o.push("/R0 gs");const c=[];for(const{bezier:e}of r){c.length=0;c.push(`${numberToString(e[0])} ${numberToString(e[1])} m`);if(2===e.length)c.push(`${numberToString(e[0])} ${numberToString(e[1])} l S`);else{for(let t=2,i=e.length;t<i;t+=6){const i=e.slice(t,t+6).map(numberToString).join(" ");c.push(`${i} c`)}c.push("S")}o.push(c.join("\n"))}const C=o.join("\n"),h=new Dict(t);h.set("FormType",1);h.set("Subtype",Name.get("Form"));h.set("Type",Name.get("XObject"));h.set("BBox",s);h.set("Length",C.length);if(1!==g){const e=new Dict(t),i=new Dict(t),a=new Dict(t);a.set("CA",g);a.set("Type",Name.get("ExtGState"));i.set("R0",a);e.set("ExtGState",i);h.set("Resources",e)}const l=new StringStream(C);l.dict=h;return l}static async createNewAppearanceStreamForHighlight(e,t,i){const{color:a,rect:s,outlines:{outline:r},opacity:n}=e,g=[`${getPdfColor(a,!0)}`,"/R0 gs"];g.push(`${numberToString(r[4])} ${numberToString(r[5])} m`);for(let e=6,t=r.length;e<t;e+=6)if(isNaN(r[e])||null===r[e])g.push(`${numberToString(r[e+4])} ${numberToString(r[e+5])} l`);else{const t=r.slice(e,e+6).map(numberToString).join(" ");g.push(`${t} c`)}g.push("h f");const o=g.join("\n"),c=new Dict(t);c.set("FormType",1);c.set("Subtype",Name.get("Form"));c.set("Type",Name.get("XObject"));c.set("BBox",s);c.set("Length",o.length);const C=new Dict(t),h=new Dict(t);C.set("ExtGState",h);c.set("Resources",C);const l=new Dict(t);h.set("R0",l);l.set("BM",Name.get("Multiply"));if(1!==n){l.set("ca",n);l.set("Type",Name.get("ExtGState"))}const Q=new StringStream(o);Q.dict=c;return Q}}class HighlightAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e;this.data.annotationType=L;if(this.data.quadPoints=getQuadPoints(t,null)){const e=this.appearance?.dict.get("Resources");if(!this.appearance||!e?.has("ExtGState")){this.appearance&&warn("HighlightAnnotation - ignoring built-in appearance stream.");const e=this.color?getPdfColorArray(this.color):[1,1,0],a=t.get("CA");this._setDefaultAppearance({xref:i,fillColor:e,blendMode:"Multiply",fillAlpha:a,pointsCallback:(e,t)=>{e.push(`${t[0]} ${t[1]} m`,`${t[2]} ${t[3]} l`,`${t[6]} ${t[7]} l`,`${t[4]} ${t[5]} l`,"f");return[t[0],t[2],t[7],t[3]]}})}}else this.data.popupRef=null}static createNewDict(e,t,{apRef:i,ap:a}){const{color:s,opacity:r,rect:n,rotation:g,user:o,quadPoints:c}=e,C=new Dict(t);C.set("Type",Name.get("Annot"));C.set("Subtype",Name.get("Highlight"));C.set("CreationDate",`D:${getModificationDate()}`);C.set("Rect",n);C.set("F",4);C.set("Border",[0,0,0]);C.set("Rotate",g);C.set("QuadPoints",c);C.set("C",Array.from(s,(e=>e/255)));C.set("CA",r);o&&C.set("T",isAscii(o)?o:stringToUTF16String(o,!0));if(i||a){const e=new Dict(t);C.set("AP",e);e.set("N",i||a)}return C}static async createNewAppearanceStream(e,t,i){const{color:a,rect:s,outlines:r,opacity:n}=e,g=[`${getPdfColor(a,!0)}`,"/R0 gs"],o=[];for(const e of r){o.length=0;o.push(`${numberToString(e[0])} ${numberToString(e[1])} m`);for(let t=2,i=e.length;t<i;t+=2)o.push(`${numberToString(e[t])} ${numberToString(e[t+1])} l`);o.push("h");g.push(o.join("\n"))}g.push("f*");const c=g.join("\n"),C=new Dict(t);C.set("FormType",1);C.set("Subtype",Name.get("Form"));C.set("Type",Name.get("XObject"));C.set("BBox",s);C.set("Length",c.length);const h=new Dict(t),l=new Dict(t);h.set("ExtGState",l);C.set("Resources",h);const Q=new Dict(t);l.set("R0",Q);Q.set("BM",Name.get("Multiply"));if(1!==n){Q.set("ca",n);Q.set("Type",Name.get("ExtGState"))}const E=new StringStream(c);E.dict=C;return E}}class UnderlineAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e;this.data.annotationType=H;if(this.data.quadPoints=getQuadPoints(t,null)){if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],a=t.get("CA");this._setDefaultAppearance({xref:i,extra:"[] 0 d 0.571 w",strokeColor:e,strokeAlpha:a,pointsCallback:(e,t)=>{e.push(`${t[4]} ${t[5]+1.3} m`,`${t[6]} ${t[7]+1.3} l`,"S");return[t[0],t[2],t[7],t[3]]}})}}else this.data.popupRef=null}}class SquigglyAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e;this.data.annotationType=J;if(this.data.quadPoints=getQuadPoints(t,null)){if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],a=t.get("CA");this._setDefaultAppearance({xref:i,extra:"[] 0 d 1 w",strokeColor:e,strokeAlpha:a,pointsCallback:(e,t)=>{const i=(t[1]-t[5])/6;let a=i,s=t[4];const r=t[5],n=t[6];e.push(`${s} ${r+a} m`);do{s+=2;a=0===a?i:0;e.push(`${s} ${r+a} l`)}while(s<n);e.push("S");return[t[4],n,r-2*i,r+2*i]}})}}else this.data.popupRef=null}}class StrikeOutAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e;this.data.annotationType=Y;if(this.data.quadPoints=getQuadPoints(t,null)){if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],a=t.get("CA");this._setDefaultAppearance({xref:i,extra:"[] 0 d 1 w",strokeColor:e,strokeAlpha:a,pointsCallback:(e,t)=>{e.push((t[0]+t[4])/2+" "+(t[1]+t[5])/2+" m",(t[2]+t[6])/2+" "+(t[3]+t[7])/2+" l","S");return[t[0],t[2],t[7],t[3]]}})}}else this.data.popupRef=null}}class StampAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.annotationType=v;this.data.hasOwnCanvas=this.data.noRotate;this.data.noHTML=!1}static async createImage(e,t){const{width:i,height:a}=e,s=new OffscreenCanvas(i,a),r=s.getContext("2d",{alpha:!0});r.drawImage(e,0,0);const n=r.getImageData(0,0,i,a).data,g=new Uint32Array(n.buffer),o=g.some(FeatureTest.isLittleEndian?e=>e>>>24!=255:e=>255!=(255&e));if(o){r.fillStyle="white";r.fillRect(0,0,i,a);r.drawImage(e,0,0)}const c=s.convertToBlob({type:"image/jpeg",quality:1}).then((e=>e.arrayBuffer())),C=Name.get("XObject"),h=Name.get("Image"),l=new Dict(t);l.set("Type",C);l.set("Subtype",h);l.set("BitsPerComponent",8);l.set("ColorSpace",Name.get("DeviceRGB"));l.set("Filter",Name.get("DCTDecode"));l.set("BBox",[0,0,i,a]);l.set("Width",i);l.set("Height",a);let Q=null;if(o){const e=new Uint8Array(g.length);if(FeatureTest.isLittleEndian)for(let t=0,i=g.length;t<i;t++)e[t]=g[t]>>>24;else for(let t=0,i=g.length;t<i;t++)e[t]=255&g[t];const s=new Dict(t);s.set("Type",C);s.set("Subtype",h);s.set("BitsPerComponent",8);s.set("ColorSpace",Name.get("DeviceGray"));s.set("Width",i);s.set("Height",a);Q=new Stream(e,0,0,s)}return{imageStream:new Stream(await c,0,0,l),smaskStream:Q,width:i,height:a}}static createNewDict(e,t,{apRef:i,ap:a}){const{rect:s,rotation:r,user:n}=e,g=new Dict(t);g.set("Type",Name.get("Annot"));g.set("Subtype",Name.get("Stamp"));g.set("CreationDate",`D:${getModificationDate()}`);g.set("Rect",s);g.set("F",4);g.set("Border",[0,0,0]);g.set("Rotate",r);n&&g.set("T",isAscii(n)?n:stringToUTF16String(n,!0));if(i||a){const e=new Dict(t);g.set("AP",e);i?e.set("N",i):e.set("N",a)}return g}static async createNewAppearanceStream(e,t,i){const{rotation:a}=e,{imageRef:s,width:r,height:n}=i.image,g=new Dict(t),o=new Dict(t);g.set("XObject",o);o.set("Im0",s);const c=`q ${r} 0 0 ${n} 0 0 cm /Im0 Do Q`,C=new Dict(t);C.set("FormType",1);C.set("Subtype",Name.get("Form"));C.set("Type",Name.get("XObject"));C.set("BBox",[0,0,r,n]);C.set("Resources",g);if(a){const e=getRotationMatrix(a,r,n);C.set("Matrix",e)}const h=new StringStream(c);h.dict=C;return h}}class FileAttachmentAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e,a=new FileSpec(t.get("FS"),i);this.data.annotationType=O;this.data.hasOwnCanvas=this.data.noRotate;this.data.noHTML=!1;this.data.file=a.serializable;const s=t.get("Name");this.data.name=s instanceof Name?stringToPDFString(s.name):"PushPin";const r=t.get("ca");this.data.fillAlpha="number"==typeof r&&r>=0&&r<=1?r:null}}function decodeString(e){try{return stringToUTF8String(e)}catch(t){warn(`UTF-8 decoding failed: "${t}".`);return e}}class DatasetXMLParser extends SimpleXMLParser{constructor(e){super(e);this.node=null}onEndElement(e){const t=super.onEndElement(e);if(t&&"xfa:datasets"===e){this.node=t;throw new Error("Aborting DatasetXMLParser.")}}}class DatasetReader{constructor(e){if(e.datasets)this.node=new SimpleXMLParser({hasAttributes:!0}).parseFromString(e.datasets).documentElement;else{const t=new DatasetXMLParser({hasAttributes:!0});try{t.parseFromString(e["xdp:xdp"])}catch{}this.node=t.node}}getValue(e){if(!this.node||!e)return"";const t=this.node.searchNode(parseXFAPath(e),0);if(!t)return"";const i=t.firstChild;return"value"===i?.nodeName?t.children.map((e=>decodeString(e.textContent))):decodeString(t.textContent)}}class XRef{#K=null;constructor(e,t){this.stream=e;this.pdfManager=t;this.entries=[];this._xrefStms=new Set;this._cacheMap=new Map;this._pendingRefs=new RefSet;this._newPersistentRefNum=null;this._newTemporaryRefNum=null;this._persistentRefsCache=null}getNewPersistentRef(e){null===this._newPersistentRefNum&&(this._newPersistentRefNum=this.entries.length||1);const t=this._newPersistentRefNum++;this._cacheMap.set(t,e);return Ref.get(t,0)}getNewTemporaryRef(){if(null===this._newTemporaryRefNum){this._newTemporaryRefNum=this.entries.length||1;if(this._newPersistentRefNum){this._persistentRefsCache=new Map;for(let e=this._newTemporaryRefNum;e<this._newPersistentRefNum;e++){this._persistentRefsCache.set(e,this._cacheMap.get(e));this._cacheMap.delete(e)}}}return Ref.get(this._newTemporaryRefNum++,0)}resetNewTemporaryRef(){this._newTemporaryRefNum=null;if(this._persistentRefsCache)for(const[e,t]of this._persistentRefsCache)this._cacheMap.set(e,t);this._persistentRefsCache=null}setStartXRef(e){this.startXRefQueue=[e]}parse(e=!1){let t,i,a;if(e){warn("Indexing all PDF objects");t=this.indexObjects()}else t=this.readXRef();t.assignXref(this);this.trailer=t;try{i=t.get("Encrypt")}catch(e){if(e instanceof MissingDataException)throw e;warn(`XRef.parse - Invalid "Encrypt" reference: "${e}".`)}if(i instanceof Dict){const e=t.get("ID"),a=e?.length?e[0]:"";i.suppressEncryption=!0;this.encrypt=new CipherTransformFactory(i,a,this.pdfManager.password)}try{a=t.get("Root")}catch(e){if(e instanceof MissingDataException)throw e;warn(`XRef.parse - Invalid "Root" reference: "${e}".`)}if(a instanceof Dict)try{if(a.get("Pages")instanceof Dict){this.root=a;return}}catch(e){if(e instanceof MissingDataException)throw e;warn(`XRef.parse - Invalid "Pages" reference: "${e}".`)}if(!e)throw new XRefParseException;throw new InvalidPDFException("Invalid Root reference.")}processXRefTable(e){"tableState"in this||(this.tableState={entryNum:0,streamPos:e.lexer.stream.pos,parserBuf1:e.buf1,parserBuf2:e.buf2});if(!isCmd(this.readXRefTable(e),"trailer"))throw new FormatError("Invalid XRef table: could not find trailer dictionary");let t=e.getObj();t instanceof Dict||!t.dict||(t=t.dict);if(!(t instanceof Dict))throw new FormatError("Invalid XRef table: could not parse trailer dictionary");delete this.tableState;return t}readXRefTable(e){const t=e.lexer.stream,i=this.tableState;t.pos=i.streamPos;e.buf1=i.parserBuf1;e.buf2=i.parserBuf2;let a;for(;;){if(!("firstEntryNum"in i)||!("entryCount"in i)){if(isCmd(a=e.getObj(),"trailer"))break;i.firstEntryNum=a;i.entryCount=e.getObj()}let s=i.firstEntryNum;const r=i.entryCount;if(!Number.isInteger(s)||!Number.isInteger(r))throw new FormatError("Invalid XRef table: wrong types in subsection header");for(let a=i.entryNum;a<r;a++){i.streamPos=t.pos;i.entryNum=a;i.parserBuf1=e.buf1;i.parserBuf2=e.buf2;const n={};n.offset=e.getObj();n.gen=e.getObj();const g=e.getObj();if(g instanceof Cmd)switch(g.cmd){case"f":n.free=!0;break;case"n":n.uncompressed=!0}if(!Number.isInteger(n.offset)||!Number.isInteger(n.gen)||!n.free&&!n.uncompressed)throw new FormatError(`Invalid entry in XRef subsection: ${s}, ${r}`);0===a&&n.free&&1===s&&(s=0);this.entries[a+s]||(this.entries[a+s]=n)}i.entryNum=0;i.streamPos=t.pos;i.parserBuf1=e.buf1;i.parserBuf2=e.buf2;delete i.firstEntryNum;delete i.entryCount}if(this.entries[0]&&!this.entries[0].free)throw new FormatError("Invalid XRef table: unexpected first object");return a}processXRefStream(e){if(!("streamState"in this)){const t=e.dict,i=t.get("W");let a=t.get("Index");a||(a=[0,t.get("Size")]);this.streamState={entryRanges:a,byteWidths:i,entryNum:0,streamPos:e.pos}}this.readXRefStream(e);delete this.streamState;return e.dict}readXRefStream(e){const t=this.streamState;e.pos=t.streamPos;const[i,a,s]=t.byteWidths,r=t.entryRanges;for(;r.length>0;){const[n,g]=r;if(!Number.isInteger(n)||!Number.isInteger(g))throw new FormatError(`Invalid XRef range fields: ${n}, ${g}`);if(!Number.isInteger(i)||!Number.isInteger(a)||!Number.isInteger(s))throw new FormatError(`Invalid XRef entry fields length: ${n}, ${g}`);for(let r=t.entryNum;r<g;++r){t.entryNum=r;t.streamPos=e.pos;let g=0,o=0,c=0;for(let t=0;t<i;++t){const t=e.getByte();if(-1===t)throw new FormatError("Invalid XRef byteWidths 'type'.");g=g<<8|t}0===i&&(g=1);for(let t=0;t<a;++t){const t=e.getByte();if(-1===t)throw new FormatError("Invalid XRef byteWidths 'offset'.");o=o<<8|t}for(let t=0;t<s;++t){const t=e.getByte();if(-1===t)throw new FormatError("Invalid XRef byteWidths 'generation'.");c=c<<8|t}const C={};C.offset=o;C.gen=c;switch(g){case 0:C.free=!0;break;case 1:C.uncompressed=!0;break;case 2:break;default:throw new FormatError(`Invalid XRef entry type: ${g}`)}this.entries[n+r]||(this.entries[n+r]=C)}t.entryNum=0;t.streamPos=e.pos;r.splice(0,2)}}indexObjects(){function readToken(e,t){let i="",a=e[t];for(;10!==a&&13!==a&&60!==a&&!(++t>=e.length);){i+=String.fromCharCode(a);a=e[t]}return i}function skipUntil(e,t,i){const a=i.length,s=e.length;let r=0;for(;t<s;){let s=0;for(;s<a&&e[t+s]===i[s];)++s;if(s>=a)break;t++;r++}return r}const e=/\b(endobj|\d+\s+\d+\s+obj|xref|trailer\s*<<)\b/g,t=/\b(startxref|\d+\s+\d+\s+obj)\b/g,i=/^(\d+)\s+(\d+)\s+obj\b/,a=new Uint8Array([116,114,97,105,108,101,114]),s=new Uint8Array([115,116,97,114,116,120,114,101,102]),r=new Uint8Array([47,88,82,101,102]);this.entries.length=0;this._cacheMap.clear();const n=this.stream;n.pos=0;const g=n.getBytes(),o=bytesToString(g),c=g.length;let C=n.start;const h=[],l=[];for(;C<c;){let Q=g[C];if(9===Q||10===Q||13===Q||32===Q){++C;continue}if(37===Q){do{++C;if(C>=c)break;Q=g[C]}while(10!==Q&&13!==Q);continue}const E=readToken(g,C);let u;if(E.startsWith("xref")&&(4===E.length||/\s/.test(E[4]))){C+=skipUntil(g,C,a);h.push(C);C+=skipUntil(g,C,s)}else if(u=i.exec(E)){const t=0|u[1],i=0|u[2],a=C+E.length;let s,h=!1;if(this.entries[t]){if(this.entries[t].gen===i)try{new Parser({lexer:new Lexer(n.makeSubStream(a))}).getObj();h=!0}catch(e){e instanceof ParserEOFException?warn(`indexObjects -- checking object (${E}): "${e}".`):h=!0}}else h=!0;h&&(this.entries[t]={offset:C-n.start,gen:i,uncompressed:!0});e.lastIndex=a;const Q=e.exec(o);if(Q){s=e.lastIndex+1-C;if("endobj"!==Q[1]){warn(`indexObjects: Found "${Q[1]}" inside of another "obj", caused by missing "endobj" -- trying to recover.`);s-=Q[1].length+1}}else s=c-C;const d=g.subarray(C,C+s),f=skipUntil(d,0,r);if(f<s&&d[f+5]<64){l.push(C-n.start);this._xrefStms.add(C-n.start)}C+=s}else if(E.startsWith("trailer")&&(7===E.length||/\s/.test(E[7]))){h.push(C);const e=C+E.length;let i;t.lastIndex=e;const a=t.exec(o);if(a){i=t.lastIndex+1-C;if("startxref"!==a[1]){warn(`indexObjects: Found "${a[1]}" after "trailer", caused by missing "startxref" -- trying to recover.`);i-=a[1].length+1}}else i=c-C;C+=i}else C+=E.length+1}for(const e of l){this.startXRefQueue.push(e);this.readXRef(!0)}const Q=[];let E,u,d=!1;for(const e of h){n.pos=e;const t=new Parser({lexer:new Lexer(n),xref:this,allowStreams:!0,recoveryMode:!0});if(!isCmd(t.getObj(),"trailer"))continue;const i=t.getObj();if(i instanceof Dict){Q.push(i);i.has("Encrypt")&&(d=!0)}}for(const e of[...Q,"genFallback",...Q]){if("genFallback"===e){if(!u)break;this._generationFallback=!0;continue}let t=!1;try{const i=e.get("Root");if(!(i instanceof Dict))continue;const a=i.get("Pages");if(!(a instanceof Dict))continue;const s=a.get("Count");Number.isInteger(s)&&(t=!0)}catch(e){u=e;continue}if(t&&(!d||e.has("Encrypt"))&&e.has("ID"))return e;E=e}if(E)return E;if(this.topDict)return this.topDict;throw new InvalidPDFException("Invalid PDF structure.")}readXRef(e=!1){const t=this.stream,i=new Set;for(;this.startXRefQueue.length;){try{const e=this.startXRefQueue[0];if(i.has(e)){warn("readXRef - skipping XRef table since it was already parsed.");this.startXRefQueue.shift();continue}i.add(e);t.pos=e+t.start;const a=new Parser({lexer:new Lexer(t),xref:this,allowStreams:!0});let s,r=a.getObj();if(isCmd(r,"xref")){s=this.processXRefTable(a);this.topDict||(this.topDict=s);r=s.get("XRefStm");if(Number.isInteger(r)&&!this._xrefStms.has(r)){this._xrefStms.add(r);this.startXRefQueue.push(r);this.#K??=r}}else{if(!Number.isInteger(r))throw new FormatError("Invalid XRef stream header");if(!(Number.isInteger(a.getObj())&&isCmd(a.getObj(),"obj")&&(r=a.getObj())instanceof BaseStream))throw new FormatError("Invalid XRef stream");s=this.processXRefStream(r);this.topDict||(this.topDict=s);if(!s)throw new FormatError("Failed to read XRef stream")}r=s.get("Prev");Number.isInteger(r)?this.startXRefQueue.push(r):r instanceof Ref&&this.startXRefQueue.push(r.num)}catch(e){if(e instanceof MissingDataException)throw e;info("(while reading XRef): "+e)}this.startXRefQueue.shift()}if(this.topDict)return this.topDict;if(!e)throw new XRefParseException}get lastXRefStreamPos(){return this.#K??(this._xrefStms.size>0?Math.max(...this._xrefStms):null)}getEntry(e){const t=this.entries[e];return t&&!t.free&&t.offset?t:null}fetchIfRef(e,t=!1){return e instanceof Ref?this.fetch(e,t):e}fetch(e,t=!1){if(!(e instanceof Ref))throw new Error("ref object is not a reference");const i=e.num,a=this._cacheMap.get(i);if(void 0!==a){a instanceof Dict&&!a.objId&&(a.objId=e.toString());return a}let s=this.getEntry(i);if(null===s){this._cacheMap.set(i,s);return s}if(this._pendingRefs.has(e)){this._pendingRefs.remove(e);warn(`Ignoring circular reference: ${e}.`);return ft}this._pendingRefs.put(e);try{s=s.uncompressed?this.fetchUncompressed(e,s,t):this.fetchCompressed(e,s,t);this._pendingRefs.remove(e)}catch(t){this._pendingRefs.remove(e);throw t}s instanceof Dict?s.objId=e.toString():s instanceof BaseStream&&(s.dict.objId=e.toString());return s}fetchUncompressed(e,t,i=!1){const a=e.gen;let s=e.num;if(t.gen!==a){const r=`Inconsistent generation in XRef: ${e}`;if(this._generationFallback&&t.gen<a){warn(r);return this.fetchUncompressed(Ref.get(s,t.gen),t,i)}throw new XRefEntryException(r)}const r=this.stream.makeSubStream(t.offset+this.stream.start),n=new Parser({lexer:new Lexer(r),xref:this,allowStreams:!0}),g=n.getObj(),o=n.getObj(),c=n.getObj();if(g!==s||o!==a||!(c instanceof Cmd))throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${e}`);if("obj"!==c.cmd){if(c.cmd.startsWith("obj")){s=parseInt(c.cmd.substring(3),10);if(!Number.isNaN(s))return s}throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${e}`)}(t=this.encrypt&&!i?n.getObj(this.encrypt.createCipherTransform(s,a)):n.getObj())instanceof BaseStream||this._cacheMap.set(s,t);return t}fetchCompressed(e,t,i=!1){const a=t.offset,s=this.fetch(Ref.get(a,0));if(!(s instanceof BaseStream))throw new FormatError("bad ObjStm stream");const r=s.dict.get("First"),n=s.dict.get("N");if(!Number.isInteger(r)||!Number.isInteger(n))throw new FormatError("invalid first and n parameters for ObjStm stream");let g=new Parser({lexer:new Lexer(s),xref:this,allowStreams:!0});const o=new Array(n),c=new Array(n);for(let e=0;e<n;++e){const t=g.getObj();if(!Number.isInteger(t))throw new FormatError(`invalid object number in the ObjStm stream: ${t}`);const i=g.getObj();if(!Number.isInteger(i))throw new FormatError(`invalid object offset in the ObjStm stream: ${i}`);o[e]=t;c[e]=i}const C=(s.start||0)+r,h=new Array(n);for(let e=0;e<n;++e){const t=e<n-1?c[e+1]-c[e]:void 0;if(t<0)throw new FormatError("Invalid offset in the ObjStm stream.");g=new Parser({lexer:new Lexer(s.makeSubStream(C+c[e],t,s.dict)),xref:this,allowStreams:!0});const i=g.getObj();h[e]=i;if(i instanceof BaseStream)continue;const r=o[e],l=this.entries[r];l&&l.offset===a&&l.gen===e&&this._cacheMap.set(r,i)}if(void 0===(t=h[t.gen]))throw new XRefEntryException(`Bad (compressed) XRef entry: ${e}`);return t}async fetchIfRefAsync(e,t){return e instanceof Ref?this.fetchAsync(e,t):e}async fetchAsync(e,t){try{return this.fetch(e,t)}catch(i){if(!(i instanceof MissingDataException))throw i;await this.pdfManager.requestRange(i.begin,i.end);return this.fetchAsync(e,t)}}getCatalogObj(){return this.root}}const sg=[0,0,612,792];class Page{constructor({pdfManager:e,xref:t,pageIndex:i,pageDict:a,ref:s,globalIdFactory:r,fontCache:n,builtInCMapCache:g,standardFontDataCache:o,globalImageCache:c,systemFontCache:C,nonBlendModesSet:h,xfaFactory:l}){this.pdfManager=e;this.pageIndex=i;this.pageDict=a;this.xref=t;this.ref=s;this.fontCache=n;this.builtInCMapCache=g;this.standardFontDataCache=o;this.globalImageCache=c;this.systemFontCache=C;this.nonBlendModesSet=h;this.evaluatorOptions=e.evaluatorOptions;this.resourcesPromise=null;this.xfaFactory=l;const Q={obj:0};this._localIdFactory=class extends r{static createObjId(){return`p${i}_${++Q.obj}`}static getPageObjId(){return`p${s.toString()}`}}}_getInheritableProperty(e,t=!1){const i=getInheritableProperty({dict:this.pageDict,key:e,getArray:t,stopWhenFound:!1});return Array.isArray(i)?1!==i.length&&i[0]instanceof Dict?Dict.merge({xref:this.xref,dictArray:i}):i[0]:i}get content(){return this.pageDict.getArray("Contents")}get resources(){const e=this._getInheritableProperty("Resources");return shadow(this,"resources",e instanceof Dict?e:Dict.empty)}_getBoundingBox(e){if(this.xfaData)return this.xfaData.bbox;const t=lookupNormalRect(this._getInheritableProperty(e,!0),null);if(t){if(t[2]-t[0]>0&&t[3]-t[1]>0)return t;warn(`Empty, or invalid, /${e} entry.`)}return null}get mediaBox(){return shadow(this,"mediaBox",this._getBoundingBox("MediaBox")||sg)}get cropBox(){return shadow(this,"cropBox",this._getBoundingBox("CropBox")||this.mediaBox)}get userUnit(){let e=this.pageDict.get("UserUnit");("number"!=typeof e||e<=0)&&(e=1);return shadow(this,"userUnit",e)}get view(){const{cropBox:e,mediaBox:t}=this;if(e!==t&&!isArrayEqual(e,t)){const i=Util.intersect(e,t);if(i&&i[2]-i[0]>0&&i[3]-i[1]>0)return shadow(this,"view",i);warn("Empty /CropBox and /MediaBox intersection.")}return shadow(this,"view",t)}get rotate(){let e=this._getInheritableProperty("Rotate")||0;e%90!=0?e=0:e>=360?e%=360:e<0&&(e=(e%360+360)%360);return shadow(this,"rotate",e)}_onSubStreamError(e,t){if(!this.evaluatorOptions.ignoreErrors)throw e;warn(`getContentStream - ignoring sub-stream (${t}): "${e}".`)}getContentStream(){return this.pdfManager.ensure(this,"content").then((e=>e instanceof BaseStream?e:Array.isArray(e)?new StreamsSequenceStream(e,this._onSubStreamError.bind(this)):new NullStream))}get xfaData(){return shadow(this,"xfaData",this.xfaFactory?{bbox:this.xfaFactory.getBoundingBox(this.pageIndex)}:null)}#T(e,t,i){for(const a of e)if(a.id){const e=Ref.fromString(a.id);if(!e){warn(`A non-linked annotation cannot be modified: ${a.id}`);continue}if(a.deleted){t.put(e,e);continue}i?.put(e);a.ref=e;delete a.id}}async saveNewAnnotations(e,t,i,a){if(this.xfaFactory)throw new Error("XFA: Cannot save new annotations.");const s=new PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,systemFontCache:this.systemFontCache,options:this.evaluatorOptions}),r=new RefSetCache,n=new RefSet;this.#T(i,r,n);const g=this.pageDict,o=this.annotations.filter((e=>!(e instanceof Ref&&r.has(e)))),c=await AnnotationFactory.saveNewAnnotations(s,t,i,a);for(const{ref:e}of c.annotations)e instanceof Ref&&!n.has(e)&&o.push(e);const C=g.get("Annots");g.set("Annots",o);const h=[];await writeObject(this.ref,g,h,this.xref);C&&g.set("Annots",C);const l=c.dependencies;l.push({ref:this.ref,data:h.join("")},...c.annotations);for(const e of r)l.push({ref:e,data:null});return l}save(e,t,i){const a=new PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,systemFontCache:this.systemFontCache,options:this.evaluatorOptions});return this._parsedAnnotations.then((function(e){const s=[];for(const r of e)r.mustBePrinted(i)&&s.push(r.save(a,t,i).catch((function(e){warn(`save - ignoring annotation data during "${t.name}" task: "${e}".`);return null})));return Promise.all(s).then((function(e){return e.filter((e=>!!e))}))}))}loadResources(e){this.resourcesPromise||=this.pdfManager.ensure(this,"resources");return this.resourcesPromise.then((()=>new ObjectLoader(this.resources,e,this.xref).load()))}getOperatorList({handler:e,sink:t,task:i,intent:a,cacheKey:s,annotationStorage:r=null}){const n=this.getContentStream(),C=this.loadResources(["ColorSpace","ExtGState","Font","Pattern","Properties","Shading","XObject"]),Q=new PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,systemFontCache:this.systemFontCache,options:this.evaluatorOptions}),u=this.xfaFactory?null:getNewAnnotationsMap(r),d=u?.get(this.pageIndex);let f=Promise.resolve(null),p=null;if(d){const e=this.pdfManager.ensureDoc("annotationGlobals");let t;const a=new Set;for(const{bitmapId:e,bitmap:t}of d)!e||t||a.has(e)||a.add(e);const{isOffscreenCanvasSupported:s}=this.evaluatorOptions;if(a.size>0){const e=d.slice();for(const[t,i]of r)t.startsWith(E)&&i.bitmap&&a.has(i.bitmapId)&&e.push(i);t=AnnotationFactory.generateImages(e,this.xref,s)}else t=AnnotationFactory.generateImages(d,this.xref,s);p=new RefSet;this.#T(d,p,null);f=e.then((e=>e?AnnotationFactory.printNewAnnotations(e,Q,i,d,t):null))}const m=Promise.all([n,C]).then((([r])=>{const n=new OperatorList(a,t);e.send("StartRenderPage",{transparency:Q.hasBlendModes(this.resources,this.nonBlendModesSet),pageIndex:this.pageIndex,cacheKey:s});return Q.getOperatorList({stream:r,task:i,resources:this.resources,operatorList:n}).then((function(){return n}))}));return Promise.all([m,this._parsedAnnotations,f]).then((function([e,t,s]){if(s){t=t.filter((e=>!(e.ref&&p.has(e.ref))));for(let e=0,i=s.length;e<i;e++){const a=s[e];if(a.refToReplace){const r=t.findIndex((e=>e.ref&&isRefsEqual(e.ref,a.refToReplace)));if(r>=0){t.splice(r,1,a);s.splice(e--,1);i--}}}t=t.concat(s)}if(0===t.length||a&l){e.flush(!0);return{length:e.totalLength}}const n=!!(a&h),C=!!(a&g),E=!!(a&o),u=!!(a&c),d=[];for(const e of t)(C||E&&e.mustBeViewed(r,n)||u&&e.mustBePrinted(r))&&d.push(e.getOperatorList(Q,i,a,n,r).catch((function(e){warn(`getOperatorList - ignoring annotation data during "${i.name}" task: "${e}".`);return{opList:null,separateForm:!1,separateCanvas:!1}})));return Promise.all(d).then((function(t){let i=!1,a=!1;for(const{opList:s,separateForm:r,separateCanvas:n}of t){e.addOpList(s);i||=r;a||=n}e.flush(!0,{form:i,canvas:a});return{length:e.totalLength}}))}))}async extractTextContent({handler:e,task:t,includeMarkedContent:i,disableNormalization:a,sink:s}){const r=this.getContentStream(),n=this.loadResources(["ExtGState","Font","Properties","XObject"]),g=this.pdfManager.ensureCatalog("lang"),[o,,c]=await Promise.all([r,n,g]);return new PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,systemFontCache:this.systemFontCache,options:this.evaluatorOptions}).getTextContent({stream:o,task:t,resources:this.resources,includeMarkedContent:i,disableNormalization:a,sink:s,viewBox:this.view,lang:c})}async getStructTree(){const e=await this.pdfManager.ensureCatalog("structTreeRoot");if(!e)return null;await this._parsedAnnotations;return(await this.pdfManager.ensure(this,"_parseStructTree",[e])).serializable}_parseStructTree(e){const t=new StructTreePage(e,this.pageDict);t.parse(this.ref);return t}async getAnnotationsData(e,t,i){const a=await this._parsedAnnotations;if(0===a.length)return a;const s=[],r=[];let n;const C=!!(i&g),h=!!(i&o),l=!!(i&c);for(const i of a){const a=C||h&&i.viewable;(a||l&&i.printable)&&s.push(i.data);if(i.hasTextContent&&a){n||=new PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,systemFontCache:this.systemFontCache,options:this.evaluatorOptions});r.push(i.extractTextContent(n,t,[-1/0,-1/0,1/0,1/0]).catch((function(e){warn(`getAnnotationsData - ignoring textContent during "${t.name}" task: "${e}".`)})))}}await Promise.all(r);return s}get annotations(){const e=this._getInheritableProperty("Annots");return shadow(this,"annotations",Array.isArray(e)?e:[])}get _parsedAnnotations(){return shadow(this,"_parsedAnnotations",this.pdfManager.ensure(this,"annotations").then((async e=>{if(0===e.length)return e;const t=await this.pdfManager.ensureDoc("annotationGlobals");if(!t)return[];const i=[];for(const a of e)i.push(AnnotationFactory.create(this.xref,a,t,this._localIdFactory,!1,this.ref).catch((function(e){warn(`_parsedAnnotations: "${e}".`);return null})));const a=[];let s,r;for(const e of await Promise.all(i))e&&(e instanceof WidgetAnnotation?(r||=[]).push(e):e instanceof PopupAnnotation?(s||=[]).push(e):a.push(e));r&&a.push(...r);s&&a.push(...s);return a})))}get jsActions(){return shadow(this,"jsActions",collectActions(this.xref,this.pageDict,fA))}}const rg=new Uint8Array([37,80,68,70,45]),ng=new Uint8Array([115,116,97,114,116,120,114,101,102]),gg=new Uint8Array([101,110,100,111,98,106]);function find(e,t,i=1024,a=!1){const s=t.length,r=e.peekBytes(i),n=r.length-s;if(n<=0)return!1;if(a){const i=s-1;let a=r.length-1;for(;a>=i;){let n=0;for(;n<s&&r[a-n]===t[i-n];)n++;if(n>=s){e.pos+=a-i;return!0}a--}}else{let i=0;for(;i<=n;){let a=0;for(;a<s&&r[i+a]===t[a];)a++;if(a>=s){e.pos+=i;return!0}i++}}return!1}class PDFDocument{constructor(e,t){if(t.length<=0)throw new InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes.");this.pdfManager=e;this.stream=t;this.xref=new XRef(t,e);this._pagePromises=new Map;this._version=null;const i={font:0};this._globalIdFactory=class{static getDocId(){return`g_${e.docId}`}static createFontId(){return"f"+ ++i.font}static createObjId(){unreachable("Abstract method `createObjId` called.")}static getPageObjId(){unreachable("Abstract method `getPageObjId` called.")}}}parse(e){this.xref.parse(e);this.catalog=new Catalog(this.pdfManager,this.xref)}get linearization(){let e=null;try{e=Linearization.create(this.stream)}catch(e){if(e instanceof MissingDataException)throw e;info(e)}return shadow(this,"linearization",e)}get startXRef(){const e=this.stream;let t=0;if(this.linearization){e.reset();if(find(e,gg)){e.skip(6);let i=e.peekByte();for(;isWhiteSpace(i);){e.pos++;i=e.peekByte()}t=e.pos-e.start}}else{const i=1024,a=ng.length;let s=!1,r=e.end;for(;!s&&r>0;){r-=i-a;r<0&&(r=0);e.pos=r;s=find(e,ng,i,!0)}if(s){e.skip(9);let i;do{i=e.getByte()}while(isWhiteSpace(i));let a="";for(;i>=32&&i<=57;){a+=String.fromCharCode(i);i=e.getByte()}t=parseInt(a,10);isNaN(t)&&(t=0)}}return shadow(this,"startXRef",t)}checkHeader(){const e=this.stream;e.reset();if(!find(e,rg))return;e.moveStart();e.skip(rg.length);let t,i="";for(;(t=e.getByte())>32&&i.length<7;)i+=String.fromCharCode(t);bt.test(i)?this._version=i:warn(`Invalid PDF header version: ${i}`)}parseStartXRef(){this.xref.setStartXRef(this.startXRef)}get numPages(){let e=0;e=this.catalog.hasActualNumPages?this.catalog.numPages:this.xfaFactory?this.xfaFactory.getNumPages():this.linearization?this.linearization.numPages:this.catalog.numPages;return shadow(this,"numPages",e)}_hasOnlyDocumentSignatures(e,t=0){return!!Array.isArray(e)&&e.every((e=>{if(!((e=this.xref.fetchIfRef(e))instanceof Dict))return!1;if(e.has("Kids")){if(++t>10){warn("_hasOnlyDocumentSignatures: maximum recursion depth reached");return!1}return this._hasOnlyDocumentSignatures(e.get("Kids"),t)}const i=isName(e.get("FT"),"Sig"),a=e.get("Rect"),s=Array.isArray(a)&&a.every((e=>0===e));return i&&s}))}get _xfaStreams(){const e=this.catalog.acroForm;if(!e)return null;const t=e.get("XFA"),i={"xdp:xdp":"",template:"",datasets:"",config:"",connectionSet:"",localeSet:"",stylesheet:"","/xdp:xdp":""};if(t instanceof BaseStream&&!t.isEmpty){i["xdp:xdp"]=t;return i}if(!Array.isArray(t)||0===t.length)return null;for(let e=0,a=t.length;e<a;e+=2){let s;s=0===e?"xdp:xdp":e===a-2?"/xdp:xdp":t[e];if(!i.hasOwnProperty(s))continue;const r=this.xref.fetchIfRef(t[e+1]);r instanceof BaseStream&&!r.isEmpty&&(i[s]=r)}return i}get xfaDatasets(){const e=this._xfaStreams;if(!e)return shadow(this,"xfaDatasets",null);for(const t of["datasets","xdp:xdp"]){const i=e[t];if(i)try{const e=stringToUTF8String(i.getString());return shadow(this,"xfaDatasets",new DatasetReader({[t]:e}))}catch{warn("XFA - Invalid utf-8 string.");break}}return shadow(this,"xfaDatasets",null)}get xfaData(){const e=this._xfaStreams;if(!e)return null;const t=Object.create(null);for(const[i,a]of Object.entries(e))if(a)try{t[i]=stringToUTF8String(a.getString())}catch{warn("XFA - Invalid utf-8 string.");return null}return t}get xfaFactory(){let e;this.pdfManager.enableXfa&&this.catalog.needsRendering&&this.formInfo.hasXfa&&!this.formInfo.hasAcroForm&&(e=this.xfaData);return shadow(this,"xfaFactory",e?new XFAFactory(e):null)}get isPureXfa(){return!!this.xfaFactory&&this.xfaFactory.isValid()}get htmlForXfa(){return this.xfaFactory?this.xfaFactory.getPages():null}async loadXfaImages(){const e=await this.pdfManager.ensureCatalog("xfaImages");if(!e)return;const t=e.getKeys(),i=new ObjectLoader(e,t,this.xref);await i.load();const a=new Map;for(const i of t){const t=e.get(i);t instanceof BaseStream&&a.set(i,t.getBytes())}this.xfaFactory.setImages(a)}async loadXfaFonts(e,t){const i=await this.pdfManager.ensureCatalog("acroForm");if(!i)return;const a=await i.getAsync("DR");if(!(a instanceof Dict))return;const s=new ObjectLoader(a,["Font"],this.xref);await s.load();const r=a.get("Font");if(!(r instanceof Dict))return;const n=Object.assign(Object.create(null),this.pdfManager.evaluatorOptions);n.useSystemFonts=!1;const g=new PartialEvaluator({xref:this.xref,handler:e,pageIndex:-1,idFactory:this._globalIdFactory,fontCache:this.catalog.fontCache,builtInCMapCache:this.catalog.builtInCMapCache,standardFontDataCache:this.catalog.standardFontDataCache,options:n}),o=new OperatorList,c=[],C={get font(){return c.at(-1)},set font(e){c.push(e)},clone(){return this}},h=new Map;r.forEach(((e,t)=>{h.set(e,t)}));const l=[];for(const[e,i]of h){const s=i.get("FontDescriptor");if(!(s instanceof Dict))continue;let r=s.get("FontFamily");r=r.replaceAll(/[ ]+(\d)/g,"$1");const n={fontFamily:r,fontWeight:s.get("FontWeight"),italicAngle:-s.get("ItalicAngle")};validateCSSFont(n)&&l.push(g.handleSetFont(a,[Name.get(e),1],null,o,t,C,null,n).catch((function(e){warn(`loadXfaFonts: "${e}".`);return null})))}await Promise.all(l);const Q=this.xfaFactory.setFonts(c);if(!Q)return;n.ignoreErrors=!0;l.length=0;c.length=0;const E=new Set;for(const e of Q)getXfaFontName(`${e}-Regular`)||E.add(e);E.size&&Q.push("PdfJS-Fallback");for(const e of Q)if(!E.has(e))for(const i of[{name:"Regular",fontWeight:400,italicAngle:0},{name:"Bold",fontWeight:700,italicAngle:0},{name:"Italic",fontWeight:400,italicAngle:12},{name:"BoldItalic",fontWeight:700,italicAngle:12}]){const s=`${e}-${i.name}`,r=getXfaFontDict(s);l.push(g.handleSetFont(a,[Name.get(s),1],null,o,t,C,r,{fontFamily:e,fontWeight:i.fontWeight,italicAngle:i.italicAngle}).catch((function(e){warn(`loadXfaFonts: "${e}".`);return null})))}await Promise.all(l);this.xfaFactory.appendFonts(c,E)}async serializeXfaData(e){return this.xfaFactory?this.xfaFactory.serializeData(e):null}get version(){return this.catalog.version||this._version}get formInfo(){const e={hasFields:!1,hasAcroForm:!1,hasXfa:!1,hasSignatures:!1},t=this.catalog.acroForm;if(!t)return shadow(this,"formInfo",e);try{const i=t.get("Fields"),a=Array.isArray(i)&&i.length>0;e.hasFields=a;const s=t.get("XFA");e.hasXfa=Array.isArray(s)&&s.length>0||s instanceof BaseStream&&!s.isEmpty;const r=!!(1&t.get("SigFlags")),n=r&&this._hasOnlyDocumentSignatures(i);e.hasAcroForm=a&&!n;e.hasSignatures=r}catch(e){if(e instanceof MissingDataException)throw e;warn(`Cannot fetch form information: "${e}".`)}return shadow(this,"formInfo",e)}get documentInfo(){const e={PDFFormatVersion:this.version,Language:this.catalog.lang,EncryptFilterName:this.xref.encrypt?this.xref.encrypt.filterName:null,IsLinearized:!!this.linearization,IsAcroFormPresent:this.formInfo.hasAcroForm,IsXFAPresent:this.formInfo.hasXfa,IsCollectionPresent:!!this.catalog.collection,IsSignaturesPresent:this.formInfo.hasSignatures};let t;try{t=this.xref.trailer.get("Info")}catch(e){if(e instanceof MissingDataException)throw e;info("The document information dictionary is invalid.")}if(!(t instanceof Dict))return shadow(this,"documentInfo",e);for(const i of t.getKeys()){const a=t.get(i);switch(i){case"Title":case"Author":case"Subject":case"Keywords":case"Creator":case"Producer":case"CreationDate":case"ModDate":if("string"==typeof a){e[i]=stringToPDFString(a);continue}break;case"Trapped":if(a instanceof Name){e[i]=a;continue}break;default:let t;switch(typeof a){case"string":t=stringToPDFString(a);break;case"number":case"boolean":t=a;break;default:a instanceof Name&&(t=a)}if(void 0===t){warn(`Bad value, for custom key "${i}", in Info: ${a}.`);continue}e.Custom||(e.Custom=Object.create(null));e.Custom[i]=t;continue}warn(`Bad value, for key "${i}", in Info: ${a}.`)}return shadow(this,"documentInfo",e)}get fingerprints(){function validate(e){return"string"==typeof e&&e.length>0&&"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"!==e}function hexString(e){const t=[];for(const i of e){const e=i.toString(16);t.push(e.padStart(2,"0"))}return t.join("")}const e=this.xref.trailer.get("ID");let t,i;if(Array.isArray(e)&&validate(e[0])){t=stringToBytes(e[0]);e[1]!==e[0]&&validate(e[1])&&(i=stringToBytes(e[1]))}else t=Hs(this.stream.getByteRange(0,1024),0,1024);return shadow(this,"fingerprints",[hexString(t),i?hexString(i):null])}async _getLinearizationPage(e){const{catalog:t,linearization:i,xref:a}=this,s=Ref.get(i.objectNumberFirst,0);try{const e=await a.fetchAsync(s);if(e instanceof Dict){let i=e.getRaw("Type");i instanceof Ref&&(i=await a.fetchAsync(i));if(isName(i,"Page")||!e.has("Type")&&!e.has("Kids")&&e.has("Contents")){t.pageKidsCountCache.has(s)||t.pageKidsCountCache.put(s,1);t.pageIndexCache.has(s)||t.pageIndexCache.put(s,0);return[e,s]}}throw new FormatError("The Linearization dictionary doesn't point to a valid Page dictionary.")}catch(i){warn(`_getLinearizationPage: "${i.message}".`);return t.getPageDict(e)}}getPage(e){const t=this._pagePromises.get(e);if(t)return t;const{catalog:i,linearization:a,xfaFactory:s}=this;let r;r=s?Promise.resolve([Dict.empty,null]):a?.pageFirst===e?this._getLinearizationPage(e):i.getPageDict(e);r=r.then((([t,a])=>new Page({pdfManager:this.pdfManager,xref:this.xref,pageIndex:e,pageDict:t,ref:a,globalIdFactory:this._globalIdFactory,fontCache:i.fontCache,builtInCMapCache:i.builtInCMapCache,standardFontDataCache:i.standardFontDataCache,globalImageCache:i.globalImageCache,systemFontCache:i.systemFontCache,nonBlendModesSet:i.nonBlendModesSet,xfaFactory:s})));this._pagePromises.set(e,r);return r}async checkFirstPage(e=!1){if(!e)try{await this.getPage(0)}catch(e){if(e instanceof XRefEntryException){this._pagePromises.delete(0);await this.cleanup();throw new XRefParseException}}}async checkLastPage(e=!1){const{catalog:t,pdfManager:i}=this;t.setActualNumPages();let a;try{await Promise.all([i.ensureDoc("xfaFactory"),i.ensureDoc("linearization"),i.ensureCatalog("numPages")]);if(this.xfaFactory)return;a=this.linearization?this.linearization.numPages:t.numPages;if(!Number.isInteger(a))throw new FormatError("Page count is not an integer.");if(a<=1)return;await this.getPage(a-1)}catch(s){this._pagePromises.delete(a-1);await this.cleanup();if(s instanceof XRefEntryException&&!e)throw new XRefParseException;warn(`checkLastPage - invalid /Pages tree /Count: ${a}.`);let r;try{r=await t.getAllPageDicts(e)}catch(i){if(i instanceof XRefEntryException&&!e)throw new XRefParseException;t.setActualNumPages(1);return}for(const[e,[a,s]]of r){let r;if(a instanceof Error){r=Promise.reject(a);r.catch((()=>{}))}else r=Promise.resolve(new Page({pdfManager:i,xref:this.xref,pageIndex:e,pageDict:a,ref:s,globalIdFactory:this._globalIdFactory,fontCache:t.fontCache,builtInCMapCache:t.builtInCMapCache,standardFontDataCache:t.standardFontDataCache,globalImageCache:t.globalImageCache,systemFontCache:t.systemFontCache,nonBlendModesSet:t.nonBlendModesSet,xfaFactory:null}));this._pagePromises.set(e,r)}t.setActualNumPages(r.size)}}fontFallback(e,t){return this.catalog.fontFallback(e,t)}async cleanup(e=!1){return this.catalog?this.catalog.cleanup(e):clearGlobalCaches()}async#q(e,t,i,a,s){const{xref:r}=this;if(!(t instanceof Ref)||s.has(t))return;s.put(t);const n=await r.fetchAsync(t);if(!(n instanceof Dict))return;if(n.has("T")){const t=stringToPDFString(await n.getAsync("T"));e=""===e?t:`${e}.${t}`}else{let t=n;for(;;){t=t.getRaw("Parent");if(t instanceof Ref){if(s.has(t))break;t=await r.fetchAsync(t)}if(!(t instanceof Dict))break;if(t.has("T")){const i=stringToPDFString(await t.getAsync("T"));e=""===e?i:`${e}.${i}`;break}}}i.has(e)||i.set(e,[]);i.get(e).push(AnnotationFactory.create(r,t,a,null,!0,null).then((e=>e?.getFieldObject())).catch((function(e){warn(`#collectFieldObjects: "${e}".`);return null})));if(!n.has("Kids"))return;const g=await n.getAsync("Kids");if(Array.isArray(g))for(const t of g)await this.#q(e,t,i,a,s)}get fieldObjects(){if(!this.formInfo.hasFields)return shadow(this,"fieldObjects",Promise.resolve(null));return shadow(this,"fieldObjects",Promise.all([this.pdfManager.ensureDoc("annotationGlobals"),this.pdfManager.ensureCatalog("acroForm")]).then((async([e,t])=>{if(!e)return null;const i=new RefSet,a=Object.create(null),s=new Map;for(const a of await t.getAsync("Fields"))await this.#q("",a,s,e,i);const r=[];for(const[e,t]of s)r.push(Promise.all(t).then((t=>{(t=t.filter((e=>!!e))).length>0&&(a[e]=t)})));await Promise.all(r);return a})))}get hasJSActions(){return shadow(this,"hasJSActions",this.pdfManager.ensureDoc("_parseHasJSActions"))}async _parseHasJSActions(){const[e,t]=await Promise.all([this.pdfManager.ensureCatalog("jsActions"),this.pdfManager.ensureDoc("fieldObjects")]);return!!e||!!t&&Object.values(t).some((e=>e.some((e=>null!==e.actions))))}get calculationOrderIds(){const e=this.catalog.acroForm;if(!e?.has("CO"))return shadow(this,"calculationOrderIds",null);const t=e.get("CO");if(!Array.isArray(t)||0===t.length)return shadow(this,"calculationOrderIds",null);const i=[];for(const e of t)e instanceof Ref&&i.push(e.toString());return 0===i.length?shadow(this,"calculationOrderIds",null):shadow(this,"calculationOrderIds",i)}get annotationGlobals(){return shadow(this,"annotationGlobals",AnnotationFactory.createGlobals(this.pdfManager))}}class BasePdfManager{constructor(e){this.constructor===BasePdfManager&&unreachable("Cannot initialize BasePdfManager.");this._docBaseUrl=function parseDocBaseUrl(e){if(e){const t=createValidAbsoluteUrl(e);if(t)return t.href;warn(`Invalid absolute docBaseUrl: "${e}".`)}return null}(e.docBaseUrl);this._docId=e.docId;this._password=e.password;this.enableXfa=e.enableXfa;e.evaluatorOptions.isOffscreenCanvasSupported&&=FeatureTest.isOffscreenCanvasSupported;this.evaluatorOptions=Object.freeze(e.evaluatorOptions)}get docId(){return this._docId}get password(){return this._password}get docBaseUrl(){return this._docBaseUrl}get catalog(){return this.pdfDocument.catalog}ensureDoc(e,t){return this.ensure(this.pdfDocument,e,t)}ensureXRef(e,t){return this.ensure(this.pdfDocument.xref,e,t)}ensureCatalog(e,t){return this.ensure(this.pdfDocument.catalog,e,t)}getPage(e){return this.pdfDocument.getPage(e)}fontFallback(e,t){return this.pdfDocument.fontFallback(e,t)}loadXfaFonts(e,t){return this.pdfDocument.loadXfaFonts(e,t)}loadXfaImages(){return this.pdfDocument.loadXfaImages()}serializeXfaData(e){return this.pdfDocument.serializeXfaData(e)}cleanup(e=!1){return this.pdfDocument.cleanup(e)}async ensure(e,t,i){unreachable("Abstract method `ensure` called")}requestRange(e,t){unreachable("Abstract method `requestRange` called")}requestLoadedStream(e=!1){unreachable("Abstract method `requestLoadedStream` called")}sendProgressiveData(e){unreachable("Abstract method `sendProgressiveData` called")}updatePassword(e){this._password=e}terminate(e){unreachable("Abstract method `terminate` called")}}class LocalPdfManager extends BasePdfManager{constructor(e){super(e);const t=new Stream(e.source);this.pdfDocument=new PDFDocument(this,t);this._loadedStreamPromise=Promise.resolve(t)}async ensure(e,t,i){const a=e[t];return"function"==typeof a?a.apply(e,i):a}requestRange(e,t){return Promise.resolve()}requestLoadedStream(e=!1){return this._loadedStreamPromise}terminate(e){}}class NetworkPdfManager extends BasePdfManager{constructor(e){super(e);this.streamManager=new ChunkedStreamManager(e.source,{msgHandler:e.handler,length:e.length,disableAutoFetch:e.disableAutoFetch,rangeChunkSize:e.rangeChunkSize});this.pdfDocument=new PDFDocument(this,this.streamManager.getStream())}async ensure(e,t,i){try{const a=e[t];return"function"==typeof a?a.apply(e,i):a}catch(a){if(!(a instanceof MissingDataException))throw a;await this.requestRange(a.begin,a.end);return this.ensure(e,t,i)}}requestRange(e,t){return this.streamManager.requestRange(e,t)}requestLoadedStream(e=!1){return this.streamManager.requestAllChunks(e)}sendProgressiveData(e){this.streamManager.onReceiveData({chunk:e})}terminate(e){this.streamManager.abort(e)}}const og=1,Ig=2,cg=1,Cg=2,hg=3,Bg=4,lg=5,Qg=6,Eg=7,ug=8;function wrapReason(e){e instanceof Error||"object"==typeof e&&null!==e||unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.');switch(e.name){case"AbortException":return new AbortException(e.message);case"MissingPDFException":return new MissingPDFException(e.message);case"PasswordException":return new PasswordException(e.message,e.code);case"UnexpectedResponseException":return new UnexpectedResponseException(e.message,e.status);case"UnknownErrorException":return new UnknownErrorException(e.message,e.details);default:return new UnknownErrorException(e.message,e.toString())}}class MessageHandler{constructor(e,t,i){this.sourceName=e;this.targetName=t;this.comObj=i;this.callbackId=1;this.streamId=1;this.streamSinks=Object.create(null);this.streamControllers=Object.create(null);this.callbackCapabilities=Object.create(null);this.actionHandler=Object.create(null);this._onComObjOnMessage=e=>{const t=e.data;if(t.targetName!==this.sourceName)return;if(t.stream){this.#O(t);return}if(t.callback){const e=t.callbackId,i=this.callbackCapabilities[e];if(!i)throw new Error(`Cannot resolve callback ${e}`);delete this.callbackCapabilities[e];if(t.callback===og)i.resolve(t.data);else{if(t.callback!==Ig)throw new Error("Unexpected callback case");i.reject(wrapReason(t.reason))}return}const a=this.actionHandler[t.action];if(!a)throw new Error(`Unknown action from worker: ${t.action}`);if(t.callbackId){const e=this.sourceName,s=t.sourceName;new Promise((function(e){e(a(t.data))})).then((function(a){i.postMessage({sourceName:e,targetName:s,callback:og,callbackId:t.callbackId,data:a})}),(function(a){i.postMessage({sourceName:e,targetName:s,callback:Ig,callbackId:t.callbackId,reason:wrapReason(a)})}))}else t.streamId?this.#P(t):a(t.data)};i.addEventListener("message",this._onComObjOnMessage)}on(e,t){const i=this.actionHandler;if(i[e])throw new Error(`There is already an actionName called "${e}"`);i[e]=t}send(e,t,i){this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,data:t},i)}sendWithPromise(e,t,i){const a=this.callbackId++,s=Promise.withResolvers();this.callbackCapabilities[a]=s;try{this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,callbackId:a,data:t},i)}catch(e){s.reject(e)}return s.promise}sendWithStream(e,t,i,a){const s=this.streamId++,r=this.sourceName,n=this.targetName,g=this.comObj;return new ReadableStream({start:i=>{const o=Promise.withResolvers();this.streamControllers[s]={controller:i,startCall:o,pullCall:null,cancelCall:null,isClosed:!1};g.postMessage({sourceName:r,targetName:n,action:e,streamId:s,data:t,desiredSize:i.desiredSize},a);return o.promise},pull:e=>{const t=Promise.withResolvers();this.streamControllers[s].pullCall=t;g.postMessage({sourceName:r,targetName:n,stream:Qg,streamId:s,desiredSize:e.desiredSize});return t.promise},cancel:e=>{assert(e instanceof Error,"cancel must have a valid reason");const t=Promise.withResolvers();this.streamControllers[s].cancelCall=t;this.streamControllers[s].isClosed=!0;g.postMessage({sourceName:r,targetName:n,stream:cg,streamId:s,reason:wrapReason(e)});return t.promise}},i)}#P(e){const t=e.streamId,i=this.sourceName,a=e.sourceName,s=this.comObj,r=this,n=this.actionHandler[e.action],g={enqueue(e,r=1,n){if(this.isCancelled)return;const g=this.desiredSize;this.desiredSize-=r;if(g>0&&this.desiredSize<=0){this.sinkCapability=Promise.withResolvers();this.ready=this.sinkCapability.promise}s.postMessage({sourceName:i,targetName:a,stream:Bg,streamId:t,chunk:e},n)},close(){if(!this.isCancelled){this.isCancelled=!0;s.postMessage({sourceName:i,targetName:a,stream:hg,streamId:t});delete r.streamSinks[t]}},error(e){assert(e instanceof Error,"error must have a valid reason");if(!this.isCancelled){this.isCancelled=!0;s.postMessage({sourceName:i,targetName:a,stream:lg,streamId:t,reason:wrapReason(e)})}},sinkCapability:Promise.withResolvers(),onPull:null,onCancel:null,isCancelled:!1,desiredSize:e.desiredSize,ready:null};g.sinkCapability.resolve();g.ready=g.sinkCapability.promise;this.streamSinks[t]=g;new Promise((function(t){t(n(e.data,g))})).then((function(){s.postMessage({sourceName:i,targetName:a,stream:ug,streamId:t,success:!0})}),(function(e){s.postMessage({sourceName:i,targetName:a,stream:ug,streamId:t,reason:wrapReason(e)})}))}#O(e){const t=e.streamId,i=this.sourceName,a=e.sourceName,s=this.comObj,r=this.streamControllers[t],n=this.streamSinks[t];switch(e.stream){case ug:e.success?r.startCall.resolve():r.startCall.reject(wrapReason(e.reason));break;case Eg:e.success?r.pullCall.resolve():r.pullCall.reject(wrapReason(e.reason));break;case Qg:if(!n){s.postMessage({sourceName:i,targetName:a,stream:Eg,streamId:t,success:!0});break}n.desiredSize<=0&&e.desiredSize>0&&n.sinkCapability.resolve();n.desiredSize=e.desiredSize;new Promise((function(e){e(n.onPull?.())})).then((function(){s.postMessage({sourceName:i,targetName:a,stream:Eg,streamId:t,success:!0})}),(function(e){s.postMessage({sourceName:i,targetName:a,stream:Eg,streamId:t,reason:wrapReason(e)})}));break;case Bg:assert(r,"enqueue should have stream controller");if(r.isClosed)break;r.controller.enqueue(e.chunk);break;case hg:assert(r,"close should have stream controller");if(r.isClosed)break;r.isClosed=!0;r.controller.close();this.#W(r,t);break;case lg:assert(r,"error should have stream controller");r.controller.error(wrapReason(e.reason));this.#W(r,t);break;case Cg:e.success?r.cancelCall.resolve():r.cancelCall.reject(wrapReason(e.reason));this.#W(r,t);break;case cg:if(!n)break;new Promise((function(t){t(n.onCancel?.(wrapReason(e.reason)))})).then((function(){s.postMessage({sourceName:i,targetName:a,stream:Cg,streamId:t,success:!0})}),(function(e){s.postMessage({sourceName:i,targetName:a,stream:Cg,streamId:t,reason:wrapReason(e)})}));n.sinkCapability.reject(wrapReason(e.reason));n.isCancelled=!0;delete this.streamSinks[t];break;default:throw new Error("Unexpected stream case")}}async#W(e,t){await Promise.allSettled([e.startCall?.promise,e.pullCall?.promise,e.cancelCall?.promise]);delete this.streamControllers[t]}destroy(){this.comObj.removeEventListener("message",this._onComObjOnMessage)}}class PDFWorkerStream{constructor(e){this._msgHandler=e;this._contentLength=null;this._fullRequestReader=null;this._rangeRequestReaders=[]}getFullReader(){assert(!this._fullRequestReader,"PDFWorkerStream.getFullReader can only be called once.");this._fullRequestReader=new PDFWorkerStreamReader(this._msgHandler);return this._fullRequestReader}getRangeReader(e,t){const i=new PDFWorkerStreamRangeReader(e,t,this._msgHandler);this._rangeRequestReaders.push(i);return i}cancelAllRequests(e){this._fullRequestReader?.cancel(e);for(const t of this._rangeRequestReaders.slice(0))t.cancel(e)}}class PDFWorkerStreamReader{constructor(e){this._msgHandler=e;this.onProgress=null;this._contentLength=null;this._isRangeSupported=!1;this._isStreamingSupported=!1;const t=this._msgHandler.sendWithStream("GetReader");this._reader=t.getReader();this._headersReady=this._msgHandler.sendWithPromise("ReaderHeadersReady").then((e=>{this._isStreamingSupported=e.isStreamingSupported;this._isRangeSupported=e.isRangeSupported;this._contentLength=e.contentLength}))}get headersReady(){return this._headersReady}get contentLength(){return this._contentLength}get isStreamingSupported(){return this._isStreamingSupported}get isRangeSupported(){return this._isRangeSupported}async read(){const{value:e,done:t}=await this._reader.read();return t?{value:void 0,done:!0}:{value:e.buffer,done:!1}}cancel(e){this._reader.cancel(e)}}class PDFWorkerStreamRangeReader{constructor(e,t,i){this._msgHandler=i;this.onProgress=null;const a=this._msgHandler.sendWithStream("GetRangeReader",{begin:e,end:t});this._reader=a.getReader()}get isStreamingSupported(){return!1}async read(){const{value:e,done:t}=await this._reader.read();return t?{value:void 0,done:!0}:{value:e.buffer,done:!1}}cancel(e){this._reader.cancel(e)}}class WorkerTask{constructor(e){this.name=e;this.terminated=!1;this._capability=Promise.withResolvers()}get finished(){return this._capability.promise}finish(){this._capability.resolve()}terminate(){this.terminated=!0}ensureNotTerminated(){if(this.terminated)throw new Error("Worker task was terminated")}}class WorkerMessageHandler{static setup(e,t){let i=!1;e.on("test",(function(t){if(!i){i=!0;e.send("test",t instanceof Uint8Array)}}));e.on("configure",(function(e){!function setVerbosityLevel(e){Number.isInteger(e)&&(st=e)}(e.verbosity)}));e.on("GetDocRequest",(function(e){return WorkerMessageHandler.createDocumentHandler(e,t)}))}static createDocumentHandler(e,t){let i,a=!1,s=null;const r=new Set,n=getVerbosityLevel(),{docId:g,apiVersion:o}=e,c="4.4.168";if(o!==c)throw new Error(`The API version "${o}" does not match the Worker version "${c}".`);const C=[];for(const e in[])C.push(e);if(C.length)throw new Error("The `Array.prototype` contains unexpected enumerable properties: "+C.join(", ")+"; thus breaking e.g. `for...in` iteration of `Array`s.");const h=g+"_worker";let l=new MessageHandler(h,g,t);function ensureNotTerminated(){if(a)throw new Error("Worker was terminated")}function startWorkerTask(e){r.add(e)}function finishWorkerTask(e){e.finish();r.delete(e)}async function loadDocument(e){await i.ensureDoc("checkHeader");await i.ensureDoc("parseStartXRef");await i.ensureDoc("parse",[e]);await i.ensureDoc("checkFirstPage",[e]);await i.ensureDoc("checkLastPage",[e]);const t=await i.ensureDoc("isPureXfa");if(t){const e=new WorkerTask("loadXfaFonts");startWorkerTask(e);await Promise.all([i.loadXfaFonts(l,e).catch((e=>{})).then((()=>finishWorkerTask(e))),i.loadXfaImages()])}const[a,s]=await Promise.all([i.ensureDoc("numPages"),i.ensureDoc("fingerprints")]);return{numPages:a,fingerprints:s,htmlForXfa:t?await i.ensureDoc("htmlForXfa"):null}}function getPdfManager({data:e,password:t,disableAutoFetch:i,rangeChunkSize:a,length:r,docBaseUrl:n,enableXfa:o,evaluatorOptions:c}){const C={source:null,disableAutoFetch:i,docBaseUrl:n,docId:g,enableXfa:o,evaluatorOptions:c,handler:l,length:r,password:t,rangeChunkSize:a},h=Promise.withResolvers();let Q;if(e){try{C.source=e;Q=new LocalPdfManager(C);h.resolve(Q)}catch(e){h.reject(e)}return h.promise}let E,u=[];try{E=new PDFWorkerStream(l)}catch(e){h.reject(e);return h.promise}const d=E.getFullReader();d.headersReady.then((function(){if(d.isRangeSupported){C.source=E;C.length=d.contentLength;C.disableAutoFetch||=d.isStreamingSupported;Q=new NetworkPdfManager(C);for(const e of u)Q.sendProgressiveData(e);u=[];h.resolve(Q);s=null}})).catch((function(e){h.reject(e);s=null}));let f=0;new Promise((function(e,t){const readChunk=function({value:e,done:i}){try{ensureNotTerminated();if(i){Q||function(){const e=arrayBuffersToBytes(u);r&&e.length!==r&&warn("reported HTTP length is different from actual");try{C.source=e;Q=new LocalPdfManager(C);h.resolve(Q)}catch(e){h.reject(e)}u=[]}();s=null;return}f+=e.byteLength;d.isStreamingSupported||l.send("DocProgress",{loaded:f,total:Math.max(f,d.contentLength||0)});Q?Q.sendProgressiveData(e):u.push(e);d.read().then(readChunk,t)}catch(e){t(e)}};d.read().then(readChunk,t)})).catch((function(e){h.reject(e);s=null}));s=function(e){E.cancelAllRequests(e)};return h.promise}l.on("GetPage",(function(e){return i.getPage(e.pageIndex).then((function(e){return Promise.all([i.ensure(e,"rotate"),i.ensure(e,"ref"),i.ensure(e,"userUnit"),i.ensure(e,"view")]).then((function([e,t,i,a]){return{rotate:e,ref:t,refStr:t?.toString()??null,userUnit:i,view:a}}))}))}));l.on("GetPageIndex",(function(e){const t=Ref.get(e.num,e.gen);return i.ensureCatalog("getPageIndex",[t])}));l.on("GetDestinations",(function(e){return i.ensureCatalog("destinations")}));l.on("GetDestination",(function(e){return i.ensureCatalog("getDestination",[e.id])}));l.on("GetPageLabels",(function(e){return i.ensureCatalog("pageLabels")}));l.on("GetPageLayout",(function(e){return i.ensureCatalog("pageLayout")}));l.on("GetPageMode",(function(e){return i.ensureCatalog("pageMode")}));l.on("GetViewerPreferences",(function(e){return i.ensureCatalog("viewerPreferences")}));l.on("GetOpenAction",(function(e){return i.ensureCatalog("openAction")}));l.on("GetAttachments",(function(e){return i.ensureCatalog("attachments")}));l.on("GetDocJSActions",(function(e){return i.ensureCatalog("jsActions")}));l.on("GetPageJSActions",(function({pageIndex:e}){return i.getPage(e).then((function(e){return i.ensure(e,"jsActions")}))}));l.on("GetOutline",(function(e){return i.ensureCatalog("documentOutline")}));l.on("GetOptionalContentConfig",(function(e){return i.ensureCatalog("optionalContentConfig")}));l.on("GetPermissions",(function(e){return i.ensureCatalog("permissions")}));l.on("GetMetadata",(function(e){return Promise.all([i.ensureDoc("documentInfo"),i.ensureCatalog("metadata")])}));l.on("GetMarkInfo",(function(e){return i.ensureCatalog("markInfo")}));l.on("GetData",(function(e){return i.requestLoadedStream().then((function(e){return e.bytes}))}));l.on("GetAnnotations",(function({pageIndex:e,intent:t}){return i.getPage(e).then((function(i){const a=new WorkerTask(`GetAnnotations: page ${e}`);startWorkerTask(a);return i.getAnnotationsData(l,a,t).then((e=>{finishWorkerTask(a);return e}),(e=>{finishWorkerTask(a);throw e}))}))}));l.on("GetFieldObjects",(function(e){return i.ensureDoc("fieldObjects")}));l.on("HasJSActions",(function(e){return i.ensureDoc("hasJSActions")}));l.on("GetCalculationOrderIds",(function(e){return i.ensureDoc("calculationOrderIds")}));l.on("SaveDocument",(async function({isPureXfa:e,numPages:t,annotationStorage:a,filename:s}){const r=[i.requestLoadedStream(),i.ensureCatalog("acroForm"),i.ensureCatalog("acroFormRef"),i.ensureDoc("startXRef"),i.ensureDoc("xref"),i.ensureDoc("linearization"),i.ensureCatalog("structTreeRoot")],n=[],g=e?null:getNewAnnotationsMap(a),[o,c,C,h,Q,E,u]=await Promise.all(r),d=Q.trailer.getRaw("Root")||null;let f;if(g){u?await u.canUpdateStructTree({pdfManager:i,xref:Q,newAnnotationsByPage:g})&&(f=u):await StructTreeRoot.canCreateStructureTree({catalogRef:d,pdfManager:i,newAnnotationsByPage:g})&&(f=null);const e=AnnotationFactory.generateImages(a.values(),Q,i.evaluatorOptions.isOffscreenCanvasSupported),t=void 0===f?n:[];for(const[a,s]of g)t.push(i.getPage(a).then((t=>{const i=new WorkerTask(`Save (editor): page ${a}`);return t.saveNewAnnotations(l,i,s,e).finally((function(){finishWorkerTask(i)}))})));null===f?n.push(Promise.all(t).then((async e=>{await StructTreeRoot.createStructureTree({newAnnotationsByPage:g,xref:Q,catalogRef:d,pdfManager:i,newRefs:e});return e}))):f&&n.push(Promise.all(t).then((async e=>{await f.updateStructureTree({newAnnotationsByPage:g,pdfManager:i,newRefs:e});return e})))}if(e)n.push(i.serializeXfaData(a));else for(let e=0;e<t;e++)n.push(i.getPage(e).then((function(t){const i=new WorkerTask(`Save: page ${e}`);return t.save(l,i,a).finally((function(){finishWorkerTask(i)}))})));const p=await Promise.all(n);let m=[],y=null;if(e){y=p[0];if(!y)return o.bytes}else{m=p.flat(2);if(0===m.length)return o.bytes}const w=C&&c instanceof Dict&&m.some((e=>e.needAppearances)),D=c instanceof Dict&&c.get("XFA")||null;let b=null,F=!1;if(Array.isArray(D)){for(let e=0,t=D.length;e<t;e+=2)if("datasets"===D[e]){b=D[e+1];F=!0}null===b&&(b=Q.getNewTemporaryRef())}else D&&warn("Unsupported XFA type.");let S=Object.create(null);if(Q.trailer){const e=Object.create(null),t=Q.trailer.get("Info")||null;t instanceof Dict&&t.forEach(((t,i)=>{"string"==typeof i&&(e[t]=stringToPDFString(i))}));S={rootRef:d,encryptRef:Q.trailer.getRaw("Encrypt")||null,newRef:Q.getNewTemporaryRef(),infoRef:Q.trailer.getRaw("Info")||null,info:e,fileIds:Q.trailer.get("ID")||null,startXRef:E?h:Q.lastXRefStreamPos??h,filename:s}}return incrementalUpdate({originalData:o.bytes,xrefInfo:S,newRefs:m,xref:Q,hasXfa:!!D,xfaDatasetsRef:b,hasXfaDatasetsEntry:F,needAppearances:w,acroFormRef:C,acroForm:c,xfaData:y,useXrefStream:isDict(Q.topDict,"XRef")}).finally((()=>{Q.resetNewTemporaryRef()}))}));l.on("GetOperatorList",(function(e,t){const a=e.pageIndex;i.getPage(a).then((function(i){const s=new WorkerTask(`GetOperatorList: page ${a}`);startWorkerTask(s);const r=n>=pA.INFOS?Date.now():0;i.getOperatorList({handler:l,sink:t,task:s,intent:e.intent,cacheKey:e.cacheKey,annotationStorage:e.annotationStorage}).then((function(e){finishWorkerTask(s);r&&info(`page=${a+1} - getOperatorList: time=${Date.now()-r}ms, len=${e.length}`);t.close()}),(function(e){finishWorkerTask(s);s.terminated||t.error(e)}))}))}));l.on("GetTextContent",(function(e,t){const{pageIndex:a,includeMarkedContent:s,disableNormalization:r}=e;i.getPage(a).then((function(e){const i=new WorkerTask("GetTextContent: page "+a);startWorkerTask(i);const g=n>=pA.INFOS?Date.now():0;e.extractTextContent({handler:l,task:i,sink:t,includeMarkedContent:s,disableNormalization:r}).then((function(){finishWorkerTask(i);g&&info(`page=${a+1} - getTextContent: time=`+(Date.now()-g)+"ms");t.close()}),(function(e){finishWorkerTask(i);i.terminated||t.error(e)}))}))}));l.on("GetStructTree",(function(e){return i.getPage(e.pageIndex).then((function(e){return i.ensure(e,"getStructTree")}))}));l.on("FontFallback",(function(e){return i.fontFallback(e.id,l)}));l.on("Cleanup",(function(e){return i.cleanup(!0)}));l.on("Terminate",(function(e){a=!0;const t=[];if(i){i.terminate(new AbortException("Worker was terminated."));const e=i.cleanup();t.push(e);i=null}else clearGlobalCaches();s&&s(new AbortException("Worker was terminated."));for(const e of r){t.push(e.finished);e.terminate()}return Promise.all(t).then((function(){l.destroy();l=null}))}));l.on("Ready",(function(t){!function setupDoc(e){function onSuccess(e){ensureNotTerminated();l.send("GetDoc",{pdfInfo:e})}function onFailure(e){ensureNotTerminated();if(e instanceof PasswordException){const t=new WorkerTask(`PasswordException: response ${e.code}`);startWorkerTask(t);l.sendWithPromise("PasswordRequest",e).then((function({password:e}){finishWorkerTask(t);i.updatePassword(e);pdfManagerReady()})).catch((function(){finishWorkerTask(t);l.send("DocException",e)}))}else e instanceof InvalidPDFException||e instanceof MissingPDFException||e instanceof UnexpectedResponseException||e instanceof UnknownErrorException?l.send("DocException",e):l.send("DocException",new UnknownErrorException(e.message,e.toString()))}function pdfManagerReady(){ensureNotTerminated();loadDocument(!1).then(onSuccess,(function(e){ensureNotTerminated();e instanceof XRefParseException?i.requestLoadedStream().then((function(){ensureNotTerminated();loadDocument(!0).then(onSuccess,onFailure)})):onFailure(e)}))}ensureNotTerminated();getPdfManager(e).then((function(e){if(a){e.terminate(new AbortException("Worker was terminated."));throw new Error("Worker was terminated")}i=e;i.requestLoadedStream(!0).then((e=>{l.send("DataLoaded",{length:e.bytes.byteLength})}))})).then(pdfManagerReady,onFailure)}(e);e=null}));return h}static initializeFromPort(e){const t=new MessageHandler("worker","main",e);WorkerMessageHandler.setup(t,e);t.send("ready",null)}}"undefined"==typeof window&&!t&&"undefined"!=typeof self&&function isMessagePort(e){return"function"==typeof e.postMessage&&"onmessage"in e}(self)&&WorkerMessageHandler.initializeFromPort(self);var dg=__webpack_exports__.WorkerMessageHandler;export{dg as WorkerMessageHandler};
\ No newline at end of file
diff --git a/public/screenshots/dark/Agent.png b/public/screenshots/dark/Agent.png
new file mode 100644
index 0000000..fc63122
--- /dev/null
+++ b/public/screenshots/dark/Agent.png
Binary files differ
diff --git a/public/screenshots/dark/Agent@2x.png b/public/screenshots/dark/Agent@2x.png
new file mode 100644
index 0000000..23c8b2a
--- /dev/null
+++ b/public/screenshots/dark/Agent@2x.png
Binary files differ
diff --git a/public/screenshots/dark/Agent@3x.png b/public/screenshots/dark/Agent@3x.png
new file mode 100644
index 0000000..fb5b689
--- /dev/null
+++ b/public/screenshots/dark/Agent@3x.png
Binary files differ
diff --git a/public/screenshots/dark/Chatbot.png b/public/screenshots/dark/Chatbot.png
new file mode 100644
index 0000000..1f126ff
--- /dev/null
+++ b/public/screenshots/dark/Chatbot.png
Binary files differ
diff --git a/public/screenshots/dark/Chatbot@2x.png b/public/screenshots/dark/Chatbot@2x.png
new file mode 100644
index 0000000..d45cd2f
--- /dev/null
+++ b/public/screenshots/dark/Chatbot@2x.png
Binary files differ
diff --git a/public/screenshots/dark/Chatbot@3x.png b/public/screenshots/dark/Chatbot@3x.png
new file mode 100644
index 0000000..12651f4
--- /dev/null
+++ b/public/screenshots/dark/Chatbot@3x.png
Binary files differ
diff --git a/public/screenshots/dark/Chatflow.png b/public/screenshots/dark/Chatflow.png
new file mode 100644
index 0000000..27d4282
--- /dev/null
+++ b/public/screenshots/dark/Chatflow.png
Binary files differ
diff --git a/public/screenshots/dark/Chatflow@2x.png b/public/screenshots/dark/Chatflow@2x.png
new file mode 100644
index 0000000..c10848b
--- /dev/null
+++ b/public/screenshots/dark/Chatflow@2x.png
Binary files differ
diff --git a/public/screenshots/dark/Chatflow@3x.png b/public/screenshots/dark/Chatflow@3x.png
new file mode 100644
index 0000000..3385409
--- /dev/null
+++ b/public/screenshots/dark/Chatflow@3x.png
Binary files differ
diff --git a/public/screenshots/dark/TextGenerator.png b/public/screenshots/dark/TextGenerator.png
new file mode 100644
index 0000000..12de1b2
--- /dev/null
+++ b/public/screenshots/dark/TextGenerator.png
Binary files differ
diff --git a/public/screenshots/dark/TextGenerator@2x.png b/public/screenshots/dark/TextGenerator@2x.png
new file mode 100644
index 0000000..66055d3
--- /dev/null
+++ b/public/screenshots/dark/TextGenerator@2x.png
Binary files differ
diff --git a/public/screenshots/dark/TextGenerator@3x.png b/public/screenshots/dark/TextGenerator@3x.png
new file mode 100644
index 0000000..baf4b77
--- /dev/null
+++ b/public/screenshots/dark/TextGenerator@3x.png
Binary files differ
diff --git a/public/screenshots/dark/Workflow.png b/public/screenshots/dark/Workflow.png
new file mode 100644
index 0000000..9d20a68
--- /dev/null
+++ b/public/screenshots/dark/Workflow.png
Binary files differ
diff --git a/public/screenshots/dark/Workflow@2x.png b/public/screenshots/dark/Workflow@2x.png
new file mode 100644
index 0000000..642b931
--- /dev/null
+++ b/public/screenshots/dark/Workflow@2x.png
Binary files differ
diff --git a/public/screenshots/dark/Workflow@3x.png b/public/screenshots/dark/Workflow@3x.png
new file mode 100644
index 0000000..7964093
--- /dev/null
+++ b/public/screenshots/dark/Workflow@3x.png
Binary files differ
diff --git a/public/screenshots/light/Agent.png b/public/screenshots/light/Agent.png
new file mode 100644
index 0000000..fe596a5
--- /dev/null
+++ b/public/screenshots/light/Agent.png
Binary files differ
diff --git a/public/screenshots/light/Agent@2x.png b/public/screenshots/light/Agent@2x.png
new file mode 100644
index 0000000..dda71b2
--- /dev/null
+++ b/public/screenshots/light/Agent@2x.png
Binary files differ
diff --git a/public/screenshots/light/Agent@3x.png b/public/screenshots/light/Agent@3x.png
new file mode 100644
index 0000000..0d05644
--- /dev/null
+++ b/public/screenshots/light/Agent@3x.png
Binary files differ
diff --git a/public/screenshots/light/Chatbot.png b/public/screenshots/light/Chatbot.png
new file mode 100644
index 0000000..b628a93
--- /dev/null
+++ b/public/screenshots/light/Chatbot.png
Binary files differ
diff --git a/public/screenshots/light/Chatbot@2x.png b/public/screenshots/light/Chatbot@2x.png
new file mode 100644
index 0000000..048a9f9
--- /dev/null
+++ b/public/screenshots/light/Chatbot@2x.png
Binary files differ
diff --git a/public/screenshots/light/Chatbot@3x.png b/public/screenshots/light/Chatbot@3x.png
new file mode 100644
index 0000000..9b7c1f5
--- /dev/null
+++ b/public/screenshots/light/Chatbot@3x.png
Binary files differ
diff --git a/public/screenshots/light/Chatflow.png b/public/screenshots/light/Chatflow.png
new file mode 100644
index 0000000..1753de7
--- /dev/null
+++ b/public/screenshots/light/Chatflow.png
Binary files differ
diff --git a/public/screenshots/light/Chatflow@2x.png b/public/screenshots/light/Chatflow@2x.png
new file mode 100644
index 0000000..6b72a8d
--- /dev/null
+++ b/public/screenshots/light/Chatflow@2x.png
Binary files differ
diff --git a/public/screenshots/light/Chatflow@3x.png b/public/screenshots/light/Chatflow@3x.png
new file mode 100644
index 0000000..7a059af
--- /dev/null
+++ b/public/screenshots/light/Chatflow@3x.png
Binary files differ
diff --git a/public/screenshots/light/TextGenerator.png b/public/screenshots/light/TextGenerator.png
new file mode 100644
index 0000000..1497345
--- /dev/null
+++ b/public/screenshots/light/TextGenerator.png
Binary files differ
diff --git a/public/screenshots/light/TextGenerator@2x.png b/public/screenshots/light/TextGenerator@2x.png
new file mode 100644
index 0000000..7e1baae
--- /dev/null
+++ b/public/screenshots/light/TextGenerator@2x.png
Binary files differ
diff --git a/public/screenshots/light/TextGenerator@3x.png b/public/screenshots/light/TextGenerator@3x.png
new file mode 100644
index 0000000..746e9ac
--- /dev/null
+++ b/public/screenshots/light/TextGenerator@3x.png
Binary files differ
diff --git a/public/screenshots/light/Workflow.png b/public/screenshots/light/Workflow.png
new file mode 100644
index 0000000..a82c9a6
--- /dev/null
+++ b/public/screenshots/light/Workflow.png
Binary files differ
diff --git a/public/screenshots/light/Workflow@2x.png b/public/screenshots/light/Workflow@2x.png
new file mode 100644
index 0000000..0a1a194
--- /dev/null
+++ b/public/screenshots/light/Workflow@2x.png
Binary files differ
diff --git a/public/screenshots/light/Workflow@3x.png b/public/screenshots/light/Workflow@3x.png
new file mode 100644
index 0000000..914ce45
--- /dev/null
+++ b/public/screenshots/light/Workflow@3x.png
Binary files differ
diff --git a/public/vs/base/browser/ui/codicons/codicon/codicon.ttf b/public/vs/base/browser/ui/codicons/codicon/codicon.ttf
new file mode 100644
index 0000000..4894dfa
--- /dev/null
+++ b/public/vs/base/browser/ui/codicons/codicon/codicon.ttf
Binary files differ
diff --git a/public/vs/base/common/worker/simpleWorker.nls.de.js b/public/vs/base/common/worker/simpleWorker.nls.de.js
new file mode 100644
index 0000000..59b06a1
--- /dev/null
+++ b/public/vs/base/common/worker/simpleWorker.nls.de.js
@@ -0,0 +1,8 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/base/common/worker/simpleWorker.nls.de",{"vs/base/common/platform":["_"],"vs/editor/common/languages":["Array","Boolescher Wert","Klasse","Konstante","Konstruktor","Enumeration","Enumerationsmember","Ereignis","Feld","Datei","Funktion","Schnittstelle","Schl\xFCssel","Methode","Modul","Namespace","NULL","Zahl","Objekt","Operator","Paket","Eigenschaft","Zeichenfolge","Struktur","Typparameter","Variable","{0} ({1})"]});
+
+//# sourceMappingURL=../../../../../min-maps/vs/base/common/worker/simpleWorker.nls.de.js.map
\ No newline at end of file
diff --git a/public/vs/base/common/worker/simpleWorker.nls.es.js b/public/vs/base/common/worker/simpleWorker.nls.es.js
new file mode 100644
index 0000000..47048d9
--- /dev/null
+++ b/public/vs/base/common/worker/simpleWorker.nls.es.js
@@ -0,0 +1,8 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/base/common/worker/simpleWorker.nls.es",{"vs/base/common/platform":["_"],"vs/editor/common/languages":["matriz","booleano","clase","constante","constructor","enumeraci\xF3n","miembro de la enumeraci\xF3n","evento","campo","archivo","funci\xF3n","interfaz","clave","m\xE9todo","m\xF3dulo","espacio de nombres","NULL","n\xFAmero","objeto","operador","paquete","propiedad","cadena","estructura","par\xE1metro de tipo","variable","{0} ({1})"]});
+
+//# sourceMappingURL=../../../../../min-maps/vs/base/common/worker/simpleWorker.nls.es.js.map
\ No newline at end of file
diff --git a/public/vs/base/common/worker/simpleWorker.nls.fr.js b/public/vs/base/common/worker/simpleWorker.nls.fr.js
new file mode 100644
index 0000000..6dda6eb
--- /dev/null
+++ b/public/vs/base/common/worker/simpleWorker.nls.fr.js
@@ -0,0 +1,8 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/base/common/worker/simpleWorker.nls.fr",{"vs/base/common/platform":["_"],"vs/editor/common/languages":["tableau","bool\xE9en","classe","constante","constructeur","\xE9num\xE9ration","membre d'\xE9num\xE9ration","\xE9v\xE9nement","champ","fichier","fonction","interface","cl\xE9","m\xE9thode","module","espace de noms","NULL","nombre","objet","op\xE9rateur","package","propri\xE9t\xE9","cha\xEEne","struct","param\xE8tre de type","variable","{0} ({1})"]});
+
+//# sourceMappingURL=../../../../../min-maps/vs/base/common/worker/simpleWorker.nls.fr.js.map
\ No newline at end of file
diff --git a/public/vs/base/common/worker/simpleWorker.nls.it.js b/public/vs/base/common/worker/simpleWorker.nls.it.js
new file mode 100644
index 0000000..b78f1e6
--- /dev/null
+++ b/public/vs/base/common/worker/simpleWorker.nls.it.js
@@ -0,0 +1,8 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/base/common/worker/simpleWorker.nls.it",{"vs/base/common/platform":["_"],"vs/editor/common/languages":["matrice","valore booleano","classe","costante","costruttore","enumerazione","membro di enumerazione","evento","campo","file","funzione","interfaccia","chiave","metodo","modulo","spazio dei nomi","Null","numero","oggetto","operatore","pacchetto","propriet\xE0","stringa","struct","parametro di tipo","variabile","{0} ({1})"]});
+
+//# sourceMappingURL=../../../../../min-maps/vs/base/common/worker/simpleWorker.nls.it.js.map
\ No newline at end of file
diff --git a/public/vs/base/common/worker/simpleWorker.nls.ja.js b/public/vs/base/common/worker/simpleWorker.nls.ja.js
new file mode 100644
index 0000000..d158fbf
--- /dev/null
+++ b/public/vs/base/common/worker/simpleWorker.nls.ja.js
@@ -0,0 +1,8 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/base/common/worker/simpleWorker.nls.ja",{"vs/base/common/platform":["_"],"vs/editor/common/languages":["\u914D\u5217","\u30D6\u30FC\u30EB\u5024","\u30AF\u30E9\u30B9","\u5B9A\u6570","\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u30FC","\u5217\u6319\u578B","\u5217\u6319\u578B\u30E1\u30F3\u30D0\u30FC","\u30A4\u30D9\u30F3\u30C8","\u30D5\u30A3\u30FC\u30EB\u30C9","\u30D5\u30A1\u30A4\u30EB","\u95A2\u6570","\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9","\u30AD\u30FC","\u30E1\u30BD\u30C3\u30C9","\u30E2\u30B8\u30E5\u30FC\u30EB","\u540D\u524D\u7A7A\u9593","NULL","\u6570\u5024","\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8","\u6F14\u7B97\u5B50","\u30D1\u30C3\u30B1\u30FC\u30B8","\u30D7\u30ED\u30D1\u30C6\u30A3","\u6587\u5B57\u5217","\u69CB\u9020\u4F53","\u578B\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC","\u5909\u6570","{0} ({1})"]});
+
+//# sourceMappingURL=../../../../../min-maps/vs/base/common/worker/simpleWorker.nls.ja.js.map
\ No newline at end of file
diff --git a/public/vs/base/common/worker/simpleWorker.nls.js b/public/vs/base/common/worker/simpleWorker.nls.js
new file mode 100644
index 0000000..5cc5fc4
--- /dev/null
+++ b/public/vs/base/common/worker/simpleWorker.nls.js
@@ -0,0 +1,8 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/base/common/worker/simpleWorker.nls",{"vs/base/common/platform":["_"],"vs/editor/common/languages":["array","boolean","class","constant","constructor","enumeration","enumeration member","event","field","file","function","interface","key","method","module","namespace","null","number","object","operator","package","property","string","struct","type parameter","variable","{0} ({1})"]});
+
+//# sourceMappingURL=../../../../../min-maps/vs/base/common/worker/simpleWorker.nls.js.map
\ No newline at end of file
diff --git a/public/vs/base/common/worker/simpleWorker.nls.ko.js b/public/vs/base/common/worker/simpleWorker.nls.ko.js
new file mode 100644
index 0000000..fcc068b
--- /dev/null
+++ b/public/vs/base/common/worker/simpleWorker.nls.ko.js
@@ -0,0 +1,8 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/base/common/worker/simpleWorker.nls.ko",{"vs/base/common/platform":["_"],"vs/editor/common/languages":["\uBC30\uC5F4","\uBD80\uC6B8","\uD074\uB798\uC2A4","\uC0C1\uC218","\uC0DD\uC131\uC790","\uC5F4\uAC70\uD615","\uC5F4\uAC70\uD615 \uBA64\uBC84","\uC774\uBCA4\uD2B8","\uD544\uB4DC","\uD30C\uC77C","\uD568\uC218","\uC778\uD130\uD398\uC774\uC2A4","\uD0A4","\uBA54\uC11C\uB4DC","\uBAA8\uB4C8","\uB124\uC784\uC2A4\uD398\uC774\uC2A4","Null","\uC22B\uC790","\uAC1C\uCCB4","\uC5F0\uC0B0\uC790","\uD328\uD0A4\uC9C0","\uC18D\uC131","\uBB38\uC790\uC5F4","\uAD6C\uC870\uCCB4","\uD615\uC2DD \uB9E4\uAC1C \uBCC0\uC218","\uBCC0\uC218","{0}({1})"]});
+
+//# sourceMappingURL=../../../../../min-maps/vs/base/common/worker/simpleWorker.nls.ko.js.map
\ No newline at end of file
diff --git a/public/vs/base/common/worker/simpleWorker.nls.ru.js b/public/vs/base/common/worker/simpleWorker.nls.ru.js
new file mode 100644
index 0000000..ca39651
--- /dev/null
+++ b/public/vs/base/common/worker/simpleWorker.nls.ru.js
@@ -0,0 +1,8 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/base/common/worker/simpleWorker.nls.ru",{"vs/base/common/platform":["_"],"vs/editor/common/languages":["\u043C\u0430\u0441\u0441\u0438\u0432","\u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435","\u043A\u043B\u0430\u0441\u0441","\u043A\u043E\u043D\u0441\u0442\u0430\u043D\u0442\u0430","\u043A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0440","\u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u0435","\u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F","\u0441\u043E\u0431\u044B\u0442\u0438\u0435","\u043F\u043E\u043B\u0435","\u0444\u0430\u0439\u043B","\u0444\u0443\u043D\u043A\u0446\u0438\u044F","\u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441","\u043A\u043B\u044E\u0447","\u043C\u0435\u0442\u043E\u0434","\u043C\u043E\u0434\u0443\u043B\u044C","\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u0438\u043C\u0435\u043D","NULL","\u0447\u0438\u0441\u043B\u043E","\u043E\u0431\u044A\u0435\u043A\u0442","\u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440","\u043F\u0430\u043A\u0435\u0442","\u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E","\u0441\u0442\u0440\u043E\u043A\u0430","\u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0430","\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0442\u0438\u043F\u0430","\u041F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u0430\u044F","{0} ({1})"]});
+
+//# sourceMappingURL=../../../../../min-maps/vs/base/common/worker/simpleWorker.nls.ru.js.map
\ No newline at end of file
diff --git a/public/vs/base/common/worker/simpleWorker.nls.zh-cn.js b/public/vs/base/common/worker/simpleWorker.nls.zh-cn.js
new file mode 100644
index 0000000..96c3257
--- /dev/null
+++ b/public/vs/base/common/worker/simpleWorker.nls.zh-cn.js
@@ -0,0 +1,8 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/base/common/worker/simpleWorker.nls.zh-cn",{"vs/base/common/platform":["_"],"vs/editor/common/languages":["\u6570\u7EC4","\u5E03\u5C14\u503C","\u7C7B","\u5E38\u6570","\u6784\u9020\u51FD\u6570","\u679A\u4E3E","\u679A\u4E3E\u6210\u5458","\u4E8B\u4EF6","\u5B57\u6BB5","\u6587\u4EF6","\u51FD\u6570","\u63A5\u53E3","\u952E","\u65B9\u6CD5","\u6A21\u5757","\u547D\u540D\u7A7A\u95F4","Null","\u6570\u5B57","\u5BF9\u8C61","\u8FD0\u7B97\u7B26","\u5305","\u5C5E\u6027","\u5B57\u7B26\u4E32","\u7ED3\u6784","\u7C7B\u578B\u53C2\u6570","\u53D8\u91CF","{0} ({1})"]});
+
+//# sourceMappingURL=../../../../../min-maps/vs/base/common/worker/simpleWorker.nls.zh-cn.js.map
\ No newline at end of file
diff --git a/public/vs/base/common/worker/simpleWorker.nls.zh-tw.js b/public/vs/base/common/worker/simpleWorker.nls.zh-tw.js
new file mode 100644
index 0000000..4178c34
--- /dev/null
+++ b/public/vs/base/common/worker/simpleWorker.nls.zh-tw.js
@@ -0,0 +1,8 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/base/common/worker/simpleWorker.nls.zh-tw",{"vs/base/common/platform":["_"],"vs/editor/common/languages":["\u9663\u5217","\u5E03\u6797\u503C","\u985E\u5225","\u5E38\u6578","\u5EFA\u69CB\u51FD\u5F0F","\u5217\u8209","\u5217\u8209\u6210\u54E1","\u4E8B\u4EF6","\u6B04\u4F4D","\u6A94\u6848","\u51FD\u5F0F","\u4ECB\u9762","\u7D22\u5F15\u9375","\u65B9\u6CD5","\u6A21\u7D44","\u547D\u540D\u7A7A\u9593","null","\u6578\u5B57","\u7269\u4EF6","\u904B\u7B97\u5B50","\u5957\u4EF6","\u5C6C\u6027","\u5B57\u4E32","\u7D50\u69CB","\u578B\u5225\u53C3\u6578","\u8B8A\u6578","{0} ({1})"]});
+
+//# sourceMappingURL=../../../../../min-maps/vs/base/common/worker/simpleWorker.nls.zh-tw.js.map
\ No newline at end of file
diff --git a/public/vs/base/worker/workerMain.js b/public/vs/base/worker/workerMain.js
new file mode 100644
index 0000000..3cab924
--- /dev/null
+++ b/public/vs/base/worker/workerMain.js
@@ -0,0 +1,27 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/(function(){var X=["require","exports","vs/editor/common/core/range","vs/editor/common/core/offsetRange","vs/editor/common/core/position","vs/base/common/errors","vs/base/common/strings","vs/base/common/arrays","vs/editor/common/diff/defaultLinesDiffComputer/algorithms/diffAlgorithm","vs/base/common/event","vs/editor/common/core/lineRange","vs/base/common/arraysFind","vs/base/common/assert","vs/base/common/lifecycle","vs/base/common/objects","vs/editor/common/diff/defaultLinesDiffComputer/utils","vs/editor/common/diff/rangeMapping","vs/base/common/platform","vs/base/common/uri","vs/nls","vs/base/common/functional","vs/base/common/iterator","vs/base/common/linkedList","vs/base/common/stopwatch","vs/base/common/diff/diff","vs/base/common/types","vs/base/common/uint","vs/editor/common/core/characterClassifier","vs/editor/common/core/wordHelper","vs/editor/common/diff/defaultLinesDiffComputer/algorithms/myersDiffAlgorithm","vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence","vs/editor/common/diff/linesDiffComputer","vs/base/common/cache","vs/base/common/color","vs/base/common/diff/diffChange","vs/base/common/keyCodes","vs/base/common/lazy","vs/base/common/map","vs/base/common/cancellation","vs/base/common/hash","vs/base/common/codicons","vs/editor/common/core/selection","vs/editor/common/core/wordCharacterClassifier","vs/editor/common/diff/defaultLinesDiffComputer/heuristicSequenceOptimizations","vs/editor/common/diff/defaultLinesDiffComputer/lineSequence","vs/editor/common/diff/defaultLinesDiffComputer/algorithms/dynamicProgrammingDiffing","vs/editor/common/diff/defaultLinesDiffComputer/computeMovedLines","vs/editor/common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer","vs/editor/common/diff/legacyLinesDiffComputer","vs/editor/common/diff/linesDiffComputers","vs/editor/common/languages/defaultDocumentColorsComputer","vs/editor/common/languages/linkComputer","vs/editor/common/languages/supports/inplaceReplaceSupport","vs/editor/common/model","vs/editor/common/model/prefixSumComputer","vs/editor/common/model/mirrorTextModel","vs/editor/common/model/textModelSearch","vs/editor/common/services/unicodeTextModelHighlighter","vs/editor/common/standalone/standaloneEnums","vs/editor/common/tokenizationRegistry","vs/nls!vs/base/common/platform","vs/nls!vs/base/common/worker/simpleWorker","vs/base/common/process","vs/base/common/path","vs/nls!vs/editor/common/languages","vs/editor/common/languages","vs/editor/common/services/editorBaseApi","vs/base/common/worker/simpleWorker","vs/editor/common/services/editorSimpleWorker"],J=function(q){for(var n=[],M=0,A=q.length;M<A;M++)n[M]=X[q[M]];return n};const Ne=this,Re=typeof global=="object"?global:{};var le;(function(q){q.global=Ne;class n{get isWindows(){return this._detect(),this._isWindows}get isNode(){return this._detect(),this._isNode}get isElectronRenderer(){return this._detect(),this._isElectronRenderer}get isWebWorker(){return this._detect(),this._isWebWorker}get isElectronNodeIntegrationWebWorker(){return this._detect(),this._isElectronNodeIntegrationWebWorker}constructor(){this._detected=!1,this._isWindows=!1,this._isNode=!1,this._isElectronRenderer=!1,this._isWebWorker=!1,this._isElectronNodeIntegrationWebWorker=!1}_detect(){this._detected||(this._detected=!0,this._isWindows=n._isWindows(),this._isNode=typeof module<"u"&&!!module.exports,this._isElectronRenderer=typeof process<"u"&&typeof process.versions<"u"&&typeof process.versions.electron<"u"&&process.type==="renderer",this._isWebWorker=typeof q.global.importScripts=="function",this._isElectronNodeIntegrationWebWorker=this._isWebWorker&&typeof process<"u"&&typeof process.versions<"u"&&typeof process.versions.electron<"u"&&process.type==="worker")}static _isWindows(){return typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.indexOf("Windows")>=0?!0:typeof process<"u"?process.platform==="win32":!1}}q.Environment=n})(le||(le={}));var le;(function(q){class n{constructor(d,b,p){this.type=d,this.detail=b,this.timestamp=p}}q.LoaderEvent=n;class M{constructor(d){this._events=[new n(1,"",d)]}record(d,b){this._events.push(new n(d,b,q.Utilities.getHighPerformanceTimestamp()))}getEvents(){return this._events}}q.LoaderEventRecorder=M;class A{record(d,b){}getEvents(){return[]}}A.INSTANCE=new A,q.NullLoaderEventRecorder=A})(le||(le={}));var le;(function(q){class n{static fileUriToFilePath(A,i){if(i=decodeURI(i).replace(/%23/g,"#"),A){if(/^file:\/\/\//.test(i))return i.substr(8);if(/^file:\/\//.test(i))return i.substr(5)}else if(/^file:\/\//.test(i))return i.substr(7);return i}static startsWith(A,i){return A.length>=i.length&&A.substr(0,i.length)===i}static endsWith(A,i){return A.length>=i.length&&A.substr(A.length-i.length)===i}static containsQueryString(A){return/^[^\#]*\?/gi.test(A)}static isAbsolutePath(A){return/^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(A)}static forEachProperty(A,i){if(A){let d;for(d in A)A.hasOwnProperty(d)&&i(d,A[d])}}static isEmpty(A){let i=!0;return n.forEachProperty(A,()=>{i=!1}),i}static recursiveClone(A){if(!A||typeof A!="object"||A instanceof RegExp||!Array.isArray(A)&&Object.getPrototypeOf(A)!==Object.prototype)return A;let i=Array.isArray(A)?[]:{};return n.forEachProperty(A,(d,b)=>{b&&typeof b=="object"?i[d]=n.recursiveClone(b):i[d]=b}),i}static generateAnonymousModule(){return"===anonymous"+n.NEXT_ANONYMOUS_ID+++"==="}static isAnonymousModule(A){return n.startsWith(A,"===anonymous")}static getHighPerformanceTimestamp(){return this.PERFORMANCE_NOW_PROBED||(this.PERFORMANCE_NOW_PROBED=!0,this.HAS_PERFORMANCE_NOW=q.global.performance&&typeof q.global.performance.now=="function"),this.HAS_PERFORMANCE_NOW?q.global.performance.now():Date.now()}}n.NEXT_ANONYMOUS_ID=1,n.PERFORMANCE_NOW_PROBED=!1,n.HAS_PERFORMANCE_NOW=!1,q.Utilities=n})(le||(le={}));var le;(function(q){function n(i){if(i instanceof Error)return i;const d=new Error(i.message||String(i)||"Unknown Error");return i.stack&&(d.stack=i.stack),d}q.ensureError=n;class M{static validateConfigurationOptions(d){function b(p){if(p.phase==="loading"){console.error('Loading "'+p.moduleId+'" failed'),console.error(p),console.error("Here are the modules that depend on it:"),console.error(p.neededBy);return}if(p.phase==="factory"){console.error('The factory function of "'+p.moduleId+'" has thrown an exception'),console.error(p),console.error("Here are the modules that depend on it:"),console.error(p.neededBy);return}}if(d=d||{},typeof d.baseUrl!="string"&&(d.baseUrl=""),typeof d.isBuild!="boolean"&&(d.isBuild=!1),typeof d.paths!="object"&&(d.paths={}),typeof d.config!="object"&&(d.config={}),typeof d.catchError>"u"&&(d.catchError=!1),typeof d.recordStats>"u"&&(d.recordStats=!1),typeof d.urlArgs!="string"&&(d.urlArgs=""),typeof d.onError!="function"&&(d.onError=b),Array.isArray(d.ignoreDuplicateModules)||(d.ignoreDuplicateModules=[]),d.baseUrl.length>0&&(q.Utilities.endsWith(d.baseUrl,"/")||(d.baseUrl+="/")),typeof d.cspNonce!="string"&&(d.cspNonce=""),typeof d.preferScriptTags>"u"&&(d.preferScriptTags=!1),d.nodeCachedData&&typeof d.nodeCachedData=="object"&&(typeof d.nodeCachedData.seed!="string"&&(d.nodeCachedData.seed="seed"),(typeof d.nodeCachedData.writeDelay!="number"||d.nodeCachedData.writeDelay<0)&&(d.nodeCachedData.writeDelay=1e3*7),!d.nodeCachedData.path||typeof d.nodeCachedData.path!="string")){const p=n(new Error("INVALID cached data configuration, 'path' MUST be set"));p.phase="configuration",d.onError(p),d.nodeCachedData=void 0}return d}static mergeConfigurationOptions(d=null,b=null){let p=q.Utilities.recursiveClone(b||{});return q.Utilities.forEachProperty(d,(h,o)=>{h==="ignoreDuplicateModules"&&typeof p.ignoreDuplicateModules<"u"?p.ignoreDuplicateModules=p.ignoreDuplicateModules.concat(o):h==="paths"&&typeof p.paths<"u"?q.Utilities.forEachProperty(o,(L,e)=>p.paths[L]=e):h==="config"&&typeof p.config<"u"?q.Utilities.forEachProperty(o,(L,e)=>p.config[L]=e):p[h]=q.Utilities.recursiveClone(o)}),M.validateConfigurationOptions(p)}}q.ConfigurationOptionsUtil=M;class A{constructor(d,b){if(this._env=d,this.options=M.mergeConfigurationOptions(b),this._createIgnoreDuplicateModulesMap(),this._createSortedPathsRules(),this.options.baseUrl===""&&this.options.nodeRequire&&this.options.nodeRequire.main&&this.options.nodeRequire.main.filename&&this._env.isNode){let p=this.options.nodeRequire.main.filename,h=Math.max(p.lastIndexOf("/"),p.lastIndexOf("\\"));this.options.baseUrl=p.substring(0,h+1)}}_createIgnoreDuplicateModulesMap(){this.ignoreDuplicateModulesMap={};for(let d=0;d<this.options.ignoreDuplicateModules.length;d++)this.ignoreDuplicateModulesMap[this.options.ignoreDuplicateModules[d]]=!0}_createSortedPathsRules(){this.sortedPathsRules=[],q.Utilities.forEachProperty(this.options.paths,(d,b)=>{Array.isArray(b)?this.sortedPathsRules.push({from:d,to:b}):this.sortedPathsRules.push({from:d,to:[b]})}),this.sortedPathsRules.sort((d,b)=>b.from.length-d.from.length)}cloneAndMerge(d){return new A(this._env,M.mergeConfigurationOptions(d,this.options))}getOptionsLiteral(){return this.options}_applyPaths(d){let b;for(let p=0,h=this.sortedPathsRules.length;p<h;p++)if(b=this.sortedPathsRules[p],q.Utilities.startsWith(d,b.from)){let o=[];for(let L=0,e=b.to.length;L<e;L++)o.push(b.to[L]+d.substr(b.from.length));return o}return[d]}_addUrlArgsToUrl(d){return q.Utilities.containsQueryString(d)?d+"&"+this.options.urlArgs:d+"?"+this.options.urlArgs}_addUrlArgsIfNecessaryToUrl(d){return this.options.urlArgs?this._addUrlArgsToUrl(d):d}_addUrlArgsIfNecessaryToUrls(d){if(this.options.urlArgs)for(let b=0,p=d.length;b<p;b++)d[b]=this._addUrlArgsToUrl(d[b]);return d}moduleIdToPaths(d){if(this._env.isNode&&this.options.amdModulesPattern instanceof RegExp&&!this.options.amdModulesPattern.test(d))return this.isBuild()?["empty:"]:["node|"+d];let b=d,p;if(!q.Utilities.endsWith(b,".js")&&!q.Utilities.isAbsolutePath(b)){p=this._applyPaths(b);for(let h=0,o=p.length;h<o;h++)this.isBuild()&&p[h]==="empty:"||(q.Utilities.isAbsolutePath(p[h])||(p[h]=this.options.baseUrl+p[h]),!q.Utilities.endsWith(p[h],".js")&&!q.Utilities.containsQueryString(p[h])&&(p[h]=p[h]+".js"))}else!q.Utilities.endsWith(b,".js")&&!q.Utilities.containsQueryString(b)&&(b=b+".js"),p=[b];return this._addUrlArgsIfNecessaryToUrls(p)}requireToUrl(d){let b=d;return q.Utilities.isAbsolutePath(b)||(b=this._applyPaths(b)[0],q.Utilities.isAbsolutePath(b)||(b=this.options.baseUrl+b)),this._addUrlArgsIfNecessaryToUrl(b)}isBuild(){return this.options.isBuild}shouldInvokeFactory(d){return!!(!this.options.isBuild||q.Utilities.isAnonymousModule(d)||this.options.buildForceInvokeFactory&&this.options.buildForceInvokeFactory[d])}isDuplicateMessageIgnoredFor(d){return this.ignoreDuplicateModulesMap.hasOwnProperty(d)}getConfigForModule(d){if(this.options.config)return this.options.config[d]}shouldCatchError(){return this.options.catchError}shouldRecordStats(){return this.options.recordStats}onError(d){this.options.onError(d)}}q.Configuration=A})(le||(le={}));var le;(function(q){class n{constructor(o){this._env=o,this._scriptLoader=null,this._callbackMap={}}load(o,L,e,a){if(!this._scriptLoader)if(this._env.isWebWorker)this._scriptLoader=new i;else if(this._env.isElectronRenderer){const{preferScriptTags:c}=o.getConfig().getOptionsLiteral();c?this._scriptLoader=new M:this._scriptLoader=new d(this._env)}else this._env.isNode?this._scriptLoader=new d(this._env):this._scriptLoader=new M;let u={callback:e,errorback:a};if(this._callbackMap.hasOwnProperty(L)){this._callbackMap[L].push(u);return}this._callbackMap[L]=[u],this._scriptLoader.load(o,L,()=>this.triggerCallback(L),c=>this.triggerErrorback(L,c))}triggerCallback(o){let L=this._callbackMap[o];delete this._callbackMap[o];for(let e=0;e<L.length;e++)L[e].callback()}triggerErrorback(o,L){let e=this._callbackMap[o];delete this._callbackMap[o];for(let a=0;a<e.length;a++)e[a].errorback(L)}}class M{attachListeners(o,L,e){let a=()=>{o.removeEventListener("load",u),o.removeEventListener("error",c)},u=m=>{a(),L()},c=m=>{a(),e(m)};o.addEventListener("load",u),o.addEventListener("error",c)}load(o,L,e,a){if(/^node\|/.test(L)){let u=o.getConfig().getOptionsLiteral(),c=b(o.getRecorder(),u.nodeRequire||q.global.nodeRequire),m=L.split("|"),f=null;try{f=c(m[1])}catch(y){a(y);return}o.enqueueDefineAnonymousModule([],()=>f),e()}else{let u=document.createElement("script");u.setAttribute("async","async"),u.setAttribute("type","text/javascript"),this.attachListeners(u,e,a);const{trustedTypesPolicy:c}=o.getConfig().getOptionsLiteral();c&&(L=c.createScriptURL(L)),u.setAttribute("src",L);const{cspNonce:m}=o.getConfig().getOptionsLiteral();m&&u.setAttribute("nonce",m),document.getElementsByTagName("head")[0].appendChild(u)}}}function A(h){const{trustedTypesPolicy:o}=h.getConfig().getOptionsLiteral();try{return(o?self.eval(o.createScript("","true")):new Function("true")).call(self),!0}catch{return!1}}class i{constructor(){this._cachedCanUseEval=null}_canUseEval(o){return this._cachedCanUseEval===null&&(this._cachedCanUseEval=A(o)),this._cachedCanUseEval}load(o,L,e,a){if(/^node\|/.test(L)){const u=o.getConfig().getOptionsLiteral(),c=b(o.getRecorder(),u.nodeRequire||q.global.nodeRequire),m=L.split("|");let f=null;try{f=c(m[1])}catch(y){a(y);return}o.enqueueDefineAnonymousModule([],function(){return f}),e()}else{const{trustedTypesPolicy:u}=o.getConfig().getOptionsLiteral();if(!(/^((http:)|(https:)|(file:))/.test(L)&&L.substring(0,self.origin.length)!==self.origin)&&this._canUseEval(o)){fetch(L).then(m=>{if(m.status!==200)throw new Error(m.statusText);return m.text()}).then(m=>{m=`${m}
+//# sourceURL=${L}`,(u?self.eval(u.createScript("",m)):new Function(m)).call(self),e()}).then(void 0,a);return}try{u&&(L=u.createScriptURL(L)),importScripts(L),e()}catch(m){a(m)}}}}class d{constructor(o){this._env=o,this._didInitialize=!1,this._didPatchNodeRequire=!1}_init(o){this._didInitialize||(this._didInitialize=!0,this._fs=o("fs"),this._vm=o("vm"),this._path=o("path"),this._crypto=o("crypto"))}_initNodeRequire(o,L){const{nodeCachedData:e}=L.getConfig().getOptionsLiteral();if(!e||this._didPatchNodeRequire)return;this._didPatchNodeRequire=!0;const a=this,u=o("module");function c(m){const f=m.constructor;let y=function(E){try{return m.require(E)}finally{}};return y.resolve=function(E,S){return f._resolveFilename(E,m,!1,S)},y.resolve.paths=function(E){return f._resolveLookupPaths(E,m)},y.main=process.mainModule,y.extensions=f._extensions,y.cache=f._cache,y}u.prototype._compile=function(m,f){const y=u.wrap(m.replace(/^#!.*/,"")),w=L.getRecorder(),E=a._getCachedDataPath(e,f),S={filename:f};let C;try{const R=a._fs.readFileSync(E);C=R.slice(0,16),S.cachedData=R.slice(16),w.record(60,E)}catch{w.record(61,E)}const r=new a._vm.Script(y,S),s=r.runInThisContext(S),l=a._path.dirname(f),_=c(this),g=[this.exports,_,this,f,l,process,Re,Buffer],v=s.apply(this.exports,g);return a._handleCachedData(r,y,E,!S.cachedData,L),a._verifyCachedData(r,y,E,C,L),v}}load(o,L,e,a){const u=o.getConfig().getOptionsLiteral(),c=b(o.getRecorder(),u.nodeRequire||q.global.nodeRequire),m=u.nodeInstrumenter||function(y){return y};this._init(c),this._initNodeRequire(c,o);let f=o.getRecorder();if(/^node\|/.test(L)){let y=L.split("|"),w=null;try{w=c(y[1])}catch(E){a(E);return}o.enqueueDefineAnonymousModule([],()=>w),e()}else{L=q.Utilities.fileUriToFilePath(this._env.isWindows,L);const y=this._path.normalize(L),w=this._getElectronRendererScriptPathOrUri(y),E=!!u.nodeCachedData,S=E?this._getCachedDataPath(u.nodeCachedData,L):void 0;this._readSourceAndCachedData(y,S,f,(C,r,s,l)=>{if(C){a(C);return}let _;r.charCodeAt(0)===d._BOM?_=d._PREFIX+r.substring(1)+d._SUFFIX:_=d._PREFIX+r+d._SUFFIX,_=m(_,y);const g={filename:w,cachedData:s},v=this._createAndEvalScript(o,_,g,e,a);this._handleCachedData(v,_,S,E&&!s,o),this._verifyCachedData(v,_,S,l,o)})}}_createAndEvalScript(o,L,e,a,u){const c=o.getRecorder();c.record(31,e.filename);const m=new this._vm.Script(L,e),f=m.runInThisContext(e),y=o.getGlobalAMDDefineFunc();let w=!1;const E=function(){return w=!0,y.apply(null,arguments)};return E.amd=y.amd,f.call(q.global,o.getGlobalAMDRequireFunc(),E,e.filename,this._path.dirname(e.filename)),c.record(32,e.filename),w?a():u(new Error(`Didn't receive define call in ${e.filename}!`)),m}_getElectronRendererScriptPathOrUri(o){if(!this._env.isElectronRenderer)return o;let L=o.match(/^([a-z])\:(.*)/i);return L?`file:///${(L[1].toUpperCase()+":"+L[2]).replace(/\\/g,"/")}`:`file://${o}`}_getCachedDataPath(o,L){const e=this._crypto.createHash("md5").update(L,"utf8").update(o.seed,"utf8").update(process.arch,"").digest("hex"),a=this._path.basename(L).replace(/\.js$/,"");return this._path.join(o.path,`${a}-${e}.code`)}_handleCachedData(o,L,e,a,u){o.cachedDataRejected?this._fs.unlink(e,c=>{u.getRecorder().record(62,e),this._createAndWriteCachedData(o,L,e,u),c&&u.getConfig().onError(c)}):a&&this._createAndWriteCachedData(o,L,e,u)}_createAndWriteCachedData(o,L,e,a){let u=Math.ceil(a.getConfig().getOptionsLiteral().nodeCachedData.writeDelay*(1+Math.random())),c=-1,m=0,f;const y=()=>{setTimeout(()=>{f||(f=this._crypto.createHash("md5").update(L,"utf8").digest());const w=o.createCachedData();if(!(w.length===0||w.length===c||m>=5)){if(w.length<c){y();return}c=w.length,this._fs.writeFile(e,Buffer.concat([f,w]),E=>{E&&a.getConfig().onError(E),a.getRecorder().record(63,e),y()})}},u*Math.pow(4,m++))};y()}_readSourceAndCachedData(o,L,e,a){if(!L)this._fs.readFile(o,{encoding:"utf8"},a);else{let u,c,m,f=2;const y=w=>{w?a(w):--f===0&&a(void 0,u,c,m)};this._fs.readFile(o,{encoding:"utf8"},(w,E)=>{u=E,y(w)}),this._fs.readFile(L,(w,E)=>{!w&&E&&E.length>0?(m=E.slice(0,16),c=E.slice(16),e.record(60,L)):e.record(61,L),y()})}}_verifyCachedData(o,L,e,a,u){a&&(o.cachedDataRejected||setTimeout(()=>{const c=this._crypto.createHash("md5").update(L,"utf8").digest();a.equals(c)||(u.getConfig().onError(new Error(`FAILED TO VERIFY CACHED DATA, deleting stale '${e}' now, but a RESTART IS REQUIRED`)),this._fs.unlink(e,m=>{m&&u.getConfig().onError(m)}))},Math.ceil(5e3*(1+Math.random()))))}}d._BOM=65279,d._PREFIX="(function (require, define, __filename, __dirname) { ",d._SUFFIX=`
+});`;function b(h,o){if(o.__$__isRecorded)return o;const L=function(a){h.record(33,a);try{return o(a)}finally{h.record(34,a)}};return L.__$__isRecorded=!0,L}q.ensureRecordedNodeRequire=b;function p(h){return new n(h)}q.createScriptLoader=p})(le||(le={}));var le;(function(q){class n{constructor(h){let o=h.lastIndexOf("/");o!==-1?this.fromModulePath=h.substr(0,o+1):this.fromModulePath=""}static _normalizeModuleId(h){let o=h,L;for(L=/\/\.\//;L.test(o);)o=o.replace(L,"/");for(o=o.replace(/^\.\//g,""),L=/\/(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//;L.test(o);)o=o.replace(L,"/");return o=o.replace(/^(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//,""),o}resolveModule(h){let o=h;return q.Utilities.isAbsolutePath(o)||(q.Utilities.startsWith(o,"./")||q.Utilities.startsWith(o,"../"))&&(o=n._normalizeModuleId(this.fromModulePath+o)),o}}n.ROOT=new n(""),q.ModuleIdResolver=n;class M{constructor(h,o,L,e,a,u){this.id=h,this.strId=o,this.dependencies=L,this._callback=e,this._errorback=a,this.moduleIdResolver=u,this.exports={},this.error=null,this.exportsPassedIn=!1,this.unresolvedDependenciesCount=this.dependencies.length,this._isComplete=!1}static _safeInvokeFunction(h,o){try{return{returnedValue:h.apply(q.global,o),producedError:null}}catch(L){return{returnedValue:null,producedError:L}}}static _invokeFactory(h,o,L,e){return h.shouldInvokeFactory(o)?h.shouldCatchError()?this._safeInvokeFunction(L,e):{returnedValue:L.apply(q.global,e),producedError:null}:{returnedValue:null,producedError:null}}complete(h,o,L,e){this._isComplete=!0;let a=null;if(this._callback)if(typeof this._callback=="function"){h.record(21,this.strId);let u=M._invokeFactory(o,this.strId,this._callback,L);a=u.producedError,h.record(22,this.strId),!a&&typeof u.returnedValue<"u"&&(!this.exportsPassedIn||q.Utilities.isEmpty(this.exports))&&(this.exports=u.returnedValue)}else this.exports=this._callback;if(a){let u=q.ensureError(a);u.phase="factory",u.moduleId=this.strId,u.neededBy=e(this.id),this.error=u,o.onError(u)}this.dependencies=null,this._callback=null,this._errorback=null,this.moduleIdResolver=null}onDependencyError(h){return this._isComplete=!0,this.error=h,this._errorback?(this._errorback(h),!0):!1}isComplete(){return this._isComplete}}q.Module=M;class A{constructor(){this._nextId=0,this._strModuleIdToIntModuleId=new Map,this._intModuleIdToStrModuleId=[],this.getModuleId("exports"),this.getModuleId("module"),this.getModuleId("require")}getMaxModuleId(){return this._nextId}getModuleId(h){let o=this._strModuleIdToIntModuleId.get(h);return typeof o>"u"&&(o=this._nextId++,this._strModuleIdToIntModuleId.set(h,o),this._intModuleIdToStrModuleId[o]=h),o}getStrModuleId(h){return this._intModuleIdToStrModuleId[h]}}class i{constructor(h){this.id=h}}i.EXPORTS=new i(0),i.MODULE=new i(1),i.REQUIRE=new i(2),q.RegularDependency=i;class d{constructor(h,o,L){this.id=h,this.pluginId=o,this.pluginParam=L}}q.PluginDependency=d;class b{constructor(h,o,L,e,a=0){this._env=h,this._scriptLoader=o,this._loaderAvailableTimestamp=a,this._defineFunc=L,this._requireFunc=e,this._moduleIdProvider=new A,this._config=new q.Configuration(this._env),this._hasDependencyCycle=!1,this._modules2=[],this._knownModules2=[],this._inverseDependencies2=[],this._inversePluginDependencies2=new Map,this._currentAnonymousDefineCall=null,this._recorder=null,this._buildInfoPath=[],this._buildInfoDefineStack=[],this._buildInfoDependencies=[],this._requireFunc.moduleManager=this}reset(){return new b(this._env,this._scriptLoader,this._defineFunc,this._requireFunc,this._loaderAvailableTimestamp)}getGlobalAMDDefineFunc(){return this._defineFunc}getGlobalAMDRequireFunc(){return this._requireFunc}static _findRelevantLocationInStack(h,o){let L=u=>u.replace(/\\/g,"/"),e=L(h),a=o.split(/\n/);for(let u=0;u<a.length;u++){let c=a[u].match(/(.*):(\d+):(\d+)\)?$/);if(c){let m=c[1],f=c[2],y=c[3],w=Math.max(m.lastIndexOf(" ")+1,m.lastIndexOf("(")+1);if(m=m.substr(w),m=L(m),m===e){let E={line:parseInt(f,10),col:parseInt(y,10)};return E.line===1&&(E.col-=53),E}}}throw new Error("Could not correlate define call site for needle "+h)}getBuildInfo(){if(!this._config.isBuild())return null;let h=[],o=0;for(let L=0,e=this._modules2.length;L<e;L++){let a=this._modules2[L];if(!a)continue;let u=this._buildInfoPath[a.id]||null,c=this._buildInfoDefineStack[a.id]||null,m=this._buildInfoDependencies[a.id];h[o++]={id:a.strId,path:u,defineLocation:u&&c?b._findRelevantLocationInStack(u,c):null,dependencies:m,shim:null,exports:a.exports}}return h}getRecorder(){return this._recorder||(this._config.shouldRecordStats()?this._recorder=new q.LoaderEventRecorder(this._loaderAvailableTimestamp):this._recorder=q.NullLoaderEventRecorder.INSTANCE),this._recorder}getLoaderEvents(){return this.getRecorder().getEvents()}enqueueDefineAnonymousModule(h,o){if(this._currentAnonymousDefineCall!==null)throw new Error("Can only have one anonymous define call per script file");let L=null;this._config.isBuild()&&(L=new Error("StackLocation").stack||null),this._currentAnonymousDefineCall={stack:L,dependencies:h,callback:o}}defineModule(h,o,L,e,a,u=new n(h)){let c=this._moduleIdProvider.getModuleId(h);if(this._modules2[c]){this._config.isDuplicateMessageIgnoredFor(h)||console.warn("Duplicate definition of module '"+h+"'");return}let m=new M(c,h,this._normalizeDependencies(o,u),L,e,u);this._modules2[c]=m,this._config.isBuild()&&(this._buildInfoDefineStack[c]=a,this._buildInfoDependencies[c]=(m.dependencies||[]).map(f=>this._moduleIdProvider.getStrModuleId(f.id))),this._resolve(m)}_normalizeDependency(h,o){if(h==="exports")return i.EXPORTS;if(h==="module")return i.MODULE;if(h==="require")return i.REQUIRE;let L=h.indexOf("!");if(L>=0){let e=o.resolveModule(h.substr(0,L)),a=o.resolveModule(h.substr(L+1)),u=this._moduleIdProvider.getModuleId(e+"!"+a),c=this._moduleIdProvider.getModuleId(e);return new d(u,c,a)}return new i(this._moduleIdProvider.getModuleId(o.resolveModule(h)))}_normalizeDependencies(h,o){let L=[],e=0;for(let a=0,u=h.length;a<u;a++)L[e++]=this._normalizeDependency(h[a],o);return L}_relativeRequire(h,o,L,e){if(typeof o=="string")return this.synchronousRequire(o,h);this.defineModule(q.Utilities.generateAnonymousModule(),o,L,e,null,h)}synchronousRequire(h,o=new n(h)){let L=this._normalizeDependency(h,o),e=this._modules2[L.id];if(!e)throw new Error("Check dependency list! Synchronous require cannot resolve module '"+h+"'. This is the first mention of this module!");if(!e.isComplete())throw new Error("Check dependency list! Synchronous require cannot resolve module '"+h+"'. This module has not been resolved completely yet.");if(e.error)throw e.error;return e.exports}configure(h,o){let L=this._config.shouldRecordStats();o?this._config=new q.Configuration(this._env,h):this._config=this._config.cloneAndMerge(h),this._config.shouldRecordStats()&&!L&&(this._recorder=null)}getConfig(){return this._config}_onLoad(h){if(this._currentAnonymousDefineCall!==null){let o=this._currentAnonymousDefineCall;this._currentAnonymousDefineCall=null,this.defineModule(this._moduleIdProvider.getStrModuleId(h),o.dependencies,o.callback,null,o.stack)}}_createLoadError(h,o){let L=this._moduleIdProvider.getStrModuleId(h),e=(this._inverseDependencies2[h]||[]).map(u=>this._moduleIdProvider.getStrModuleId(u));const a=q.ensureError(o);return a.phase="loading",a.moduleId=L,a.neededBy=e,a}_onLoadError(h,o){const L=this._createLoadError(h,o);this._modules2[h]||(this._modules2[h]=new M(h,this._moduleIdProvider.getStrModuleId(h),[],()=>{},null,null));let e=[];for(let c=0,m=this._moduleIdProvider.getMaxModuleId();c<m;c++)e[c]=!1;let a=!1,u=[];for(u.push(h),e[h]=!0;u.length>0;){let c=u.shift(),m=this._modules2[c];m&&(a=m.onDependencyError(L)||a);let f=this._inverseDependencies2[c];if(f)for(let y=0,w=f.length;y<w;y++){let E=f[y];e[E]||(u.push(E),e[E]=!0)}}a||this._config.onError(L)}_hasDependencyPath(h,o){let L=this._modules2[h];if(!L)return!1;let e=[];for(let u=0,c=this._moduleIdProvider.getMaxModuleId();u<c;u++)e[u]=!1;let a=[];for(a.push(L),e[h]=!0;a.length>0;){let c=a.shift().dependencies;if(c)for(let m=0,f=c.length;m<f;m++){let y=c[m];if(y.id===o)return!0;let w=this._modules2[y.id];w&&!e[y.id]&&(e[y.id]=!0,a.push(w))}}return!1}_findCyclePath(h,o,L){if(h===o||L===50)return[h];let e=this._modules2[h];if(!e)return null;let a=e.dependencies;if(a)for(let u=0,c=a.length;u<c;u++){let m=this._findCyclePath(a[u].id,o,L+1);if(m!==null)return m.push(h),m}return null}_createRequire(h){let o=(L,e,a)=>this._relativeRequire(h,L,e,a);return o.toUrl=L=>this._config.requireToUrl(h.resolveModule(L)),o.getStats=()=>this.getLoaderEvents(),o.hasDependencyCycle=()=>this._hasDependencyCycle,o.config=(L,e=!1)=>{this.configure(L,e)},o.__$__nodeRequire=q.global.nodeRequire,o}_loadModule(h){if(this._modules2[h]||this._knownModules2[h])return;this._knownModules2[h]=!0;let o=this._moduleIdProvider.getStrModuleId(h),L=this._config.moduleIdToPaths(o),e=/^@[^\/]+\/[^\/]+$/;this._env.isNode&&(o.indexOf("/")===-1||e.test(o))&&L.push("node|"+o);let a=-1,u=c=>{if(a++,a>=L.length)this._onLoadError(h,c);else{let m=L[a],f=this.getRecorder();if(this._config.isBuild()&&m==="empty:"){this._buildInfoPath[h]=m,this.defineModule(this._moduleIdProvider.getStrModuleId(h),[],null,null,null),this._onLoad(h);return}f.record(10,m),this._scriptLoader.load(this,m,()=>{this._config.isBuild()&&(this._buildInfoPath[h]=m),f.record(11,m),this._onLoad(h)},y=>{f.record(12,m),u(y)})}};u(null)}_loadPluginDependency(h,o){if(this._modules2[o.id]||this._knownModules2[o.id])return;this._knownModules2[o.id]=!0;let L=e=>{this.defineModule(this._moduleIdProvider.getStrModuleId(o.id),[],e,null,null)};L.error=e=>{this._config.onError(this._createLoadError(o.id,e))},h.load(o.pluginParam,this._createRequire(n.ROOT),L,this._config.getOptionsLiteral())}_resolve(h){let o=h.dependencies;if(o)for(let L=0,e=o.length;L<e;L++){let a=o[L];if(a===i.EXPORTS){h.exportsPassedIn=!0,h.unresolvedDependenciesCount--;continue}if(a===i.MODULE){h.unresolvedDependenciesCount--;continue}if(a===i.REQUIRE){h.unresolvedDependenciesCount--;continue}let u=this._modules2[a.id];if(u&&u.isComplete()){if(u.error){h.onDependencyError(u.error);return}h.unresolvedDependenciesCount--;continue}if(this._hasDependencyPath(a.id,h.id)){this._hasDependencyCycle=!0,console.warn("There is a dependency cycle between '"+this._moduleIdProvider.getStrModuleId(a.id)+"' and '"+this._moduleIdProvider.getStrModuleId(h.id)+"'. The cyclic path follows:");let c=this._findCyclePath(a.id,h.id,0)||[];c.reverse(),c.push(a.id),console.warn(c.map(m=>this._moduleIdProvider.getStrModuleId(m)).join(` => 
+`)),h.unresolvedDependenciesCount--;continue}if(this._inverseDependencies2[a.id]=this._inverseDependencies2[a.id]||[],this._inverseDependencies2[a.id].push(h.id),a instanceof d){let c=this._modules2[a.pluginId];if(c&&c.isComplete()){this._loadPluginDependency(c.exports,a);continue}let m=this._inversePluginDependencies2.get(a.pluginId);m||(m=[],this._inversePluginDependencies2.set(a.pluginId,m)),m.push(a),this._loadModule(a.pluginId);continue}this._loadModule(a.id)}h.unresolvedDependenciesCount===0&&this._onModuleComplete(h)}_onModuleComplete(h){let o=this.getRecorder();if(h.isComplete())return;let L=h.dependencies,e=[];if(L)for(let m=0,f=L.length;m<f;m++){let y=L[m];if(y===i.EXPORTS){e[m]=h.exports;continue}if(y===i.MODULE){e[m]={id:h.strId,config:()=>this._config.getConfigForModule(h.strId)};continue}if(y===i.REQUIRE){e[m]=this._createRequire(h.moduleIdResolver);continue}let w=this._modules2[y.id];if(w){e[m]=w.exports;continue}e[m]=null}const a=m=>(this._inverseDependencies2[m]||[]).map(f=>this._moduleIdProvider.getStrModuleId(f));h.complete(o,this._config,e,a);let u=this._inverseDependencies2[h.id];if(this._inverseDependencies2[h.id]=null,u)for(let m=0,f=u.length;m<f;m++){let y=u[m],w=this._modules2[y];w.unresolvedDependenciesCount--,w.unresolvedDependenciesCount===0&&this._onModuleComplete(w)}let c=this._inversePluginDependencies2.get(h.id);if(c){this._inversePluginDependencies2.delete(h.id);for(let m=0,f=c.length;m<f;m++)this._loadPluginDependency(h.exports,c[m])}}}q.ModuleManager=b})(le||(le={}));var Y,le;(function(q){const n=new q.Environment;let M=null;const A=function(p,h,o){typeof p!="string"&&(o=h,h=p,p=null),(typeof h!="object"||!Array.isArray(h))&&(o=h,h=null),h||(h=["require","exports","module"]),p?M.defineModule(p,h,o,null,null):M.enqueueDefineAnonymousModule(h,o)};A.amd={jQuery:!0};const i=function(p,h=!1){M.configure(p,h)},d=function(){if(arguments.length===1){if(arguments[0]instanceof Object&&!Array.isArray(arguments[0])){i(arguments[0]);return}if(typeof arguments[0]=="string")return M.synchronousRequire(arguments[0])}if((arguments.length===2||arguments.length===3)&&Array.isArray(arguments[0])){M.defineModule(q.Utilities.generateAnonymousModule(),arguments[0],arguments[1],arguments[2],null);return}throw new Error("Unrecognized require call")};d.config=i,d.getConfig=function(){return M.getConfig().getOptionsLiteral()},d.reset=function(){M=M.reset()},d.getBuildInfo=function(){return M.getBuildInfo()},d.getStats=function(){return M.getLoaderEvents()},d.define=A;function b(){if(typeof q.global.require<"u"||typeof require<"u"){const p=q.global.require||require;if(typeof p=="function"&&typeof p.resolve=="function"){const h=q.ensureRecordedNodeRequire(M.getRecorder(),p);q.global.nodeRequire=h,d.nodeRequire=h,d.__$__nodeRequire=h}}n.isNode&&!n.isElectronRenderer&&!n.isElectronNodeIntegrationWebWorker?module.exports=d:(n.isElectronRenderer||(q.global.define=A),q.global.require=d)}q.init=b,(typeof q.global.define!="function"||!q.global.define.amd)&&(M=new q.ModuleManager(n,q.createScriptLoader(n),A,d,q.Utilities.getHighPerformanceTimestamp()),typeof q.global.require<"u"&&typeof q.global.require!="function"&&d.config(q.global.require),Y=function(){return A.apply(null,arguments)},Y.amd=A.amd,typeof doNotInitLoader>"u"&&b())})(le||(le={})),Y(X[19],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.load=n.create=n.setPseudoTranslation=n.getConfiguredDefaultLocale=n.localize2=n.localize=void 0;let M=typeof document<"u"&&document.location&&document.location.hash.indexOf("pseudo=true")>=0;const A="i-default";function i(f,y){let w;return y.length===0?w=f:w=f.replace(/\{(\d+)\}/g,(E,S)=>{const C=S[0],r=y[C];let s=E;return typeof r=="string"?s=r:(typeof r=="number"||typeof r=="boolean"||r===void 0||r===null)&&(s=String(r)),s}),M&&(w="\uFF3B"+w.replace(/[aouei]/g,"$&$&")+"\uFF3D"),w}function d(f,y){let w=f[y];return w||(w=f["*"],w)?w:null}function b(f){return f.charAt(f.length-1)==="/"?f:f+"/"}async function p(f,y,w){const E=b(f)+b(y)+"vscode/"+b(w),S=await fetch(E);if(S.ok)return await S.json();throw new Error(`${S.status} - ${S.statusText}`)}function h(f){return function(y,w){const E=Array.prototype.slice.call(arguments,2);return i(f[y],E)}}function o(f){return(y,w,...E)=>({value:i(f[y],E),original:i(w,E)})}function L(f,y,...w){return i(y,w)}n.localize=L;function e(f,y,...w){const E=i(y,w);return{value:E,original:E}}n.localize2=e;function a(f){}n.getConfiguredDefaultLocale=a;function u(f){M=f}n.setPseudoTranslation=u;function c(f,y){var w;return{localize:h(y[f]),localize2:o(y[f]),getConfiguredDefaultLocale:(w=y.getConfiguredDefaultLocale)!==null&&w!==void 0?w:E=>{}}}n.create=c;function m(f,y,w,E){var S;const C=(S=E["vs/nls"])!==null&&S!==void 0?S:{};if(!f||f.length===0)return w({localize:L,localize2:e,getConfiguredDefaultLocale:()=>{var g;return(g=C.availableLanguages)===null||g===void 0?void 0:g["*"]}});const r=C.availableLanguages?d(C.availableLanguages,f):null,s=r===null||r===A;let l=".nls";s||(l=l+"."+r);const _=g=>{Array.isArray(g)?(g.localize=h(g),g.localize2=o(g)):(g.localize=h(g[f]),g.localize2=o(g[f])),g.getConfiguredDefaultLocale=()=>{var v;return(v=C.availableLanguages)===null||v===void 0?void 0:v["*"]},w(g)};typeof C.loadBundle=="function"?C.loadBundle(f,r,(g,v)=>{g?y([f+".nls"],_):_(v)}):C.translationServiceUrl&&!s?(async()=>{var g;try{const v=await p(C.translationServiceUrl,r,f);return _(v)}catch(v){if(!r.includes("-"))return console.error(v),y([f+".nls"],_);try{const R=r.split("-")[0],N=await p(C.translationServiceUrl,R,f);return(g=C.availableLanguages)!==null&&g!==void 0||(C.availableLanguages={}),C.availableLanguages["*"]=R,_(N)}catch(R){return console.error(R),y([f+".nls"],_)}}})():y([f+l],_,g=>{if(l===".nls"){console.error("Failed trying to load default language strings",g);return}console.error(`Failed to load message bundle for language ${r}. Falling back to the default language:`,g),y([f+".nls"],_)})}n.load=m}),function(){const q=globalThis.MonacoEnvironment,n=q&&q.baseUrl?q.baseUrl:"../../../";function M(L,e){var a;if(q?.createTrustedTypesPolicy)try{return q.createTrustedTypesPolicy(L,e)}catch(u){console.warn(u);return}try{return(a=self.trustedTypes)===null||a===void 0?void 0:a.createPolicy(L,e)}catch(u){console.warn(u);return}}const A=M("amdLoader",{createScriptURL:L=>L,createScript:(L,...e)=>{const a=e.slice(0,-1).join(","),u=e.pop().toString();return`(function anonymous(${a}) { ${u}
+})`}});function i(){try{return(A?globalThis.eval(A.createScript("","true")):new Function("true")).call(globalThis),!0}catch{return!1}}function d(){return new Promise((L,e)=>{if(typeof globalThis.define=="function"&&globalThis.define.amd)return L();const a=n+"vs/loader.js";if(!(/^((http:)|(https:)|(file:))/.test(a)&&a.substring(0,globalThis.origin.length)!==globalThis.origin)&&i()){fetch(a).then(c=>{if(c.status!==200)throw new Error(c.statusText);return c.text()}).then(c=>{c=`${c}
+//# sourceURL=${a}`,(A?globalThis.eval(A.createScript("",c)):new Function(c)).call(globalThis),L()}).then(void 0,e);return}A?importScripts(A.createScriptURL(a)):importScripts(a),L()})}function b(){require.config({baseUrl:n,catchError:!0,trustedTypesPolicy:A,amdModulesPattern:/^vs\//})}function p(L){d().then(()=>{b(),require([L],function(e){setTimeout(function(){const a=e.create((u,c)=>{globalThis.postMessage(u,c)},null);for(globalThis.onmessage=u=>a.onmessage(u.data,u.ports);o.length>0;){const u=o.shift();a.onmessage(u.data,u.ports)}},0)})})}typeof globalThis.define=="function"&&globalThis.define.amd&&b();let h=!0;const o=[];globalThis.onmessage=L=>{if(!h){o.push(L);return}h=!1,p(L.data)}}(),Y(X[7],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.CallbackIterable=n.ArrayQueue=n.reverseOrder=n.booleanComparator=n.numberComparator=n.tieBreakComparators=n.compareBy=n.CompareResult=n.splice=n.insertInto=n.asArray=n.pushMany=n.pushToEnd=n.pushToStart=n.arrayInsert=n.range=n.firstOrDefault=n.distinct=n.isNonEmptyArray=n.isFalsyOrEmpty=n.coalesceInPlace=n.coalesce=n.forEachWithNeighbors=n.forEachAdjacent=n.groupAdjacentBy=n.groupBy=n.quickSelect=n.binarySearch2=n.binarySearch=n.removeFastWithoutKeepingOrder=n.equals=n.tail2=n.tail=void 0;function M(k,O=0){return k[k.length-(1+O)]}n.tail=M;function A(k){if(k.length===0)throw new Error("Invalid tail call");return[k.slice(0,k.length-1),k[k.length-1]]}n.tail2=A;function i(k,O,I=(W,z)=>W===z){if(k===O)return!0;if(!k||!O||k.length!==O.length)return!1;for(let W=0,z=k.length;W<z;W++)if(!I(k[W],O[W]))return!1;return!0}n.equals=i;function d(k,O){const I=k.length-1;O<I&&(k[O]=k[I]),k.pop()}n.removeFastWithoutKeepingOrder=d;function b(k,O,I){return p(k.length,W=>I(k[W],O))}n.binarySearch=b;function p(k,O){let I=0,W=k-1;for(;I<=W;){const z=(I+W)/2|0,G=O(z);if(G<0)I=z+1;else if(G>0)W=z-1;else return z}return-(I+1)}n.binarySearch2=p;function h(k,O,I){if(k=k|0,k>=O.length)throw new TypeError("invalid index");const W=O[Math.floor(O.length*Math.random())],z=[],G=[],t=[];for(const se of O){const ce=I(se,W);ce<0?z.push(se):ce>0?G.push(se):t.push(se)}return k<z.length?h(k,z,I):k<z.length+t.length?t[0]:h(k-(z.length+t.length),G,I)}n.quickSelect=h;function o(k,O){const I=[];let W;for(const z of k.slice(0).sort(O))!W||O(W[0],z)!==0?(W=[z],I.push(W)):W.push(z);return I}n.groupBy=o;function*L(k,O){let I,W;for(const z of k)W!==void 0&&O(W,z)?I.push(z):(I&&(yield I),I=[z]),W=z;I&&(yield I)}n.groupAdjacentBy=L;function e(k,O){for(let I=0;I<=k.length;I++)O(I===0?void 0:k[I-1],I===k.length?void 0:k[I])}n.forEachAdjacent=e;function a(k,O){for(let I=0;I<k.length;I++)O(I===0?void 0:k[I-1],k[I],I+1===k.length?void 0:k[I+1])}n.forEachWithNeighbors=a;function u(k){return k.filter(O=>!!O)}n.coalesce=u;function c(k){let O=0;for(let I=0;I<k.length;I++)k[I]&&(k[O]=k[I],O+=1);k.length=O}n.coalesceInPlace=c;function m(k){return!Array.isArray(k)||k.length===0}n.isFalsyOrEmpty=m;function f(k){return Array.isArray(k)&&k.length>0}n.isNonEmptyArray=f;function y(k,O=I=>I){const I=new Set;return k.filter(W=>{const z=O(W);return I.has(z)?!1:(I.add(z),!0)})}n.distinct=y;function w(k,O){return k.length>0?k[0]:O}n.firstOrDefault=w;function E(k,O){let I=typeof O=="number"?k:0;typeof O=="number"?I=k:(I=0,O=k);const W=[];if(I<=O)for(let z=I;z<O;z++)W.push(z);else for(let z=I;z>O;z--)W.push(z);return W}n.range=E;function S(k,O,I){const W=k.slice(0,O),z=k.slice(O);return W.concat(I,z)}n.arrayInsert=S;function C(k,O){const I=k.indexOf(O);I>-1&&(k.splice(I,1),k.unshift(O))}n.pushToStart=C;function r(k,O){const I=k.indexOf(O);I>-1&&(k.splice(I,1),k.push(O))}n.pushToEnd=r;function s(k,O){for(const I of O)k.push(I)}n.pushMany=s;function l(k){return Array.isArray(k)?k:[k]}n.asArray=l;function _(k,O,I){const W=v(k,O),z=k.length,G=I.length;k.length=z+G;for(let t=z-1;t>=W;t--)k[t+G]=k[t];for(let t=0;t<G;t++)k[t+W]=I[t]}n.insertInto=_;function g(k,O,I,W){const z=v(k,O);let G=k.splice(z,I);return G===void 0&&(G=[]),_(k,z,W),G}n.splice=g;function v(k,O){return O<0?Math.max(O+k.length,0):Math.min(O,k.length)}var R;(function(k){function O(G){return G<0}k.isLessThan=O;function I(G){return G<=0}k.isLessThanOrEqual=I;function W(G){return G>0}k.isGreaterThan=W;function z(G){return G===0}k.isNeitherLessOrGreaterThan=z,k.greaterThan=1,k.lessThan=-1,k.neitherLessOrGreaterThan=0})(R||(n.CompareResult=R={}));function N(k,O){return(I,W)=>O(k(I),k(W))}n.compareBy=N;function D(...k){return(O,I)=>{for(const W of k){const z=W(O,I);if(!R.isNeitherLessOrGreaterThan(z))return z}return R.neitherLessOrGreaterThan}}n.tieBreakComparators=D;const x=(k,O)=>k-O;n.numberComparator=x;const T=(k,O)=>(0,n.numberComparator)(k?1:0,O?1:0);n.booleanComparator=T;function F(k){return(O,I)=>-k(O,I)}n.reverseOrder=F;class B{constructor(O){this.items=O,this.firstIdx=0,this.lastIdx=this.items.length-1}get length(){return this.lastIdx-this.firstIdx+1}takeWhile(O){let I=this.firstIdx;for(;I<this.items.length&&O(this.items[I]);)I++;const W=I===this.firstIdx?null:this.items.slice(this.firstIdx,I);return this.firstIdx=I,W}takeFromEndWhile(O){let I=this.lastIdx;for(;I>=0&&O(this.items[I]);)I--;const W=I===this.lastIdx?null:this.items.slice(I+1,this.lastIdx+1);return this.lastIdx=I,W}peek(){if(this.length!==0)return this.items[this.firstIdx]}dequeue(){const O=this.items[this.firstIdx];return this.firstIdx++,O}takeCount(O){const I=this.items.slice(this.firstIdx,this.firstIdx+O);return this.firstIdx+=O,I}}n.ArrayQueue=B;class V{constructor(O){this.iterate=O}toArray(){const O=[];return this.iterate(I=>(O.push(I),!0)),O}filter(O){return new V(I=>this.iterate(W=>O(W)?I(W):!0))}map(O){return new V(I=>this.iterate(W=>I(O(W))))}findLast(O){let I;return this.iterate(W=>(O(W)&&(I=W),!0)),I}findLastMaxBy(O){let I,W=!0;return this.iterate(z=>((W||R.isGreaterThan(O(z,I)))&&(W=!1,I=z),!0)),I}}n.CallbackIterable=V,V.empty=new V(k=>{})}),Y(X[11],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.mapFindFirst=n.findMaxIdxBy=n.findFirstMinBy=n.findLastMaxBy=n.findFirstMaxBy=n.MonotonousArray=n.findFirstIdxMonotonousOrArrLen=n.findFirstMonotonous=n.findLastIdxMonotonous=n.findLastMonotonous=n.findLastIdx=n.findLast=void 0;function M(c,m,f){const y=A(c,m);if(y!==-1)return c[y]}n.findLast=M;function A(c,m,f=c.length-1){for(let y=f;y>=0;y--){const w=c[y];if(m(w))return y}return-1}n.findLastIdx=A;function i(c,m){const f=d(c,m);return f===-1?void 0:c[f]}n.findLastMonotonous=i;function d(c,m,f=0,y=c.length){let w=f,E=y;for(;w<E;){const S=Math.floor((w+E)/2);m(c[S])?w=S+1:E=S}return w-1}n.findLastIdxMonotonous=d;function b(c,m){const f=p(c,m);return f===c.length?void 0:c[f]}n.findFirstMonotonous=b;function p(c,m,f=0,y=c.length){let w=f,E=y;for(;w<E;){const S=Math.floor((w+E)/2);m(c[S])?E=S:w=S+1}return w}n.findFirstIdxMonotonousOrArrLen=p;class h{constructor(m){this._array=m,this._findLastMonotonousLastIdx=0}findLastMonotonous(m){if(h.assertInvariants){if(this._prevFindLastPredicate){for(const y of this._array)if(this._prevFindLastPredicate(y)&&!m(y))throw new Error("MonotonousArray: current predicate must be weaker than (or equal to) the previous predicate.")}this._prevFindLastPredicate=m}const f=d(this._array,m,this._findLastMonotonousLastIdx);return this._findLastMonotonousLastIdx=f+1,f===-1?void 0:this._array[f]}}n.MonotonousArray=h,h.assertInvariants=!1;function o(c,m){if(c.length===0)return;let f=c[0];for(let y=1;y<c.length;y++){const w=c[y];m(w,f)>0&&(f=w)}return f}n.findFirstMaxBy=o;function L(c,m){if(c.length===0)return;let f=c[0];for(let y=1;y<c.length;y++){const w=c[y];m(w,f)>=0&&(f=w)}return f}n.findLastMaxBy=L;function e(c,m){return o(c,(f,y)=>-m(f,y))}n.findFirstMinBy=e;function a(c,m){if(c.length===0)return-1;let f=0;for(let y=1;y<c.length;y++){const w=c[y];m(w,c[f])>0&&(f=y)}return f}n.findMaxIdxBy=a;function u(c,m){for(const f of c){const y=m(f);if(y!==void 0)return y}}n.mapFindFirst=u}),Y(X[32],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.CachedFunction=n.LRUCachedFunction=void 0;class M{constructor(d){this.fn=d,this.lastCache=void 0,this.lastArgKey=void 0}get(d){const b=JSON.stringify(d);return this.lastArgKey!==b&&(this.lastArgKey=b,this.lastCache=this.fn(d)),this.lastCache}}n.LRUCachedFunction=M;class A{get cachedValues(){return this._map}constructor(d){this.fn=d,this._map=new Map}get(d){if(this._map.has(d))return this._map.get(d);const b=this.fn(d);return this._map.set(d,b),b}}n.CachedFunction=A}),Y(X[33],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Color=n.HSVA=n.HSLA=n.RGBA=void 0;function M(p,h){const o=Math.pow(10,h);return Math.round(p*o)/o}class A{constructor(h,o,L,e=1){this._rgbaBrand=void 0,this.r=Math.min(255,Math.max(0,h))|0,this.g=Math.min(255,Math.max(0,o))|0,this.b=Math.min(255,Math.max(0,L))|0,this.a=M(Math.max(Math.min(1,e),0),3)}static equals(h,o){return h.r===o.r&&h.g===o.g&&h.b===o.b&&h.a===o.a}}n.RGBA=A;class i{constructor(h,o,L,e){this._hslaBrand=void 0,this.h=Math.max(Math.min(360,h),0)|0,this.s=M(Math.max(Math.min(1,o),0),3),this.l=M(Math.max(Math.min(1,L),0),3),this.a=M(Math.max(Math.min(1,e),0),3)}static equals(h,o){return h.h===o.h&&h.s===o.s&&h.l===o.l&&h.a===o.a}static fromRGBA(h){const o=h.r/255,L=h.g/255,e=h.b/255,a=h.a,u=Math.max(o,L,e),c=Math.min(o,L,e);let m=0,f=0;const y=(c+u)/2,w=u-c;if(w>0){switch(f=Math.min(y<=.5?w/(2*y):w/(2-2*y),1),u){case o:m=(L-e)/w+(L<e?6:0);break;case L:m=(e-o)/w+2;break;case e:m=(o-L)/w+4;break}m*=60,m=Math.round(m)}return new i(m,f,y,a)}static _hue2rgb(h,o,L){return L<0&&(L+=1),L>1&&(L-=1),L<1/6?h+(o-h)*6*L:L<1/2?o:L<2/3?h+(o-h)*(2/3-L)*6:h}static toRGBA(h){const o=h.h/360,{s:L,l:e,a}=h;let u,c,m;if(L===0)u=c=m=e;else{const f=e<.5?e*(1+L):e+L-e*L,y=2*e-f;u=i._hue2rgb(y,f,o+1/3),c=i._hue2rgb(y,f,o),m=i._hue2rgb(y,f,o-1/3)}return new A(Math.round(u*255),Math.round(c*255),Math.round(m*255),a)}}n.HSLA=i;class d{constructor(h,o,L,e){this._hsvaBrand=void 0,this.h=Math.max(Math.min(360,h),0)|0,this.s=M(Math.max(Math.min(1,o),0),3),this.v=M(Math.max(Math.min(1,L),0),3),this.a=M(Math.max(Math.min(1,e),0),3)}static equals(h,o){return h.h===o.h&&h.s===o.s&&h.v===o.v&&h.a===o.a}static fromRGBA(h){const o=h.r/255,L=h.g/255,e=h.b/255,a=Math.max(o,L,e),u=Math.min(o,L,e),c=a-u,m=a===0?0:c/a;let f;return c===0?f=0:a===o?f=((L-e)/c%6+6)%6:a===L?f=(e-o)/c+2:f=(o-L)/c+4,new d(Math.round(f*60),m,a,h.a)}static toRGBA(h){const{h:o,s:L,v:e,a}=h,u=e*L,c=u*(1-Math.abs(o/60%2-1)),m=e-u;let[f,y,w]=[0,0,0];return o<60?(f=u,y=c):o<120?(f=c,y=u):o<180?(y=u,w=c):o<240?(y=c,w=u):o<300?(f=c,w=u):o<=360&&(f=u,w=c),f=Math.round((f+m)*255),y=Math.round((y+m)*255),w=Math.round((w+m)*255),new A(f,y,w,a)}}n.HSVA=d;class b{static fromHex(h){return b.Format.CSS.parseHex(h)||b.red}static equals(h,o){return!h&&!o?!0:!h||!o?!1:h.equals(o)}get hsla(){return this._hsla?this._hsla:i.fromRGBA(this.rgba)}get hsva(){return this._hsva?this._hsva:d.fromRGBA(this.rgba)}constructor(h){if(h)if(h instanceof A)this.rgba=h;else if(h instanceof i)this._hsla=h,this.rgba=i.toRGBA(h);else if(h instanceof d)this._hsva=h,this.rgba=d.toRGBA(h);else throw new Error("Invalid color ctor argument");else throw new Error("Color needs a value")}equals(h){return!!h&&A.equals(this.rgba,h.rgba)&&i.equals(this.hsla,h.hsla)&&d.equals(this.hsva,h.hsva)}getRelativeLuminance(){const h=b._relativeLuminanceForComponent(this.rgba.r),o=b._relativeLuminanceForComponent(this.rgba.g),L=b._relativeLuminanceForComponent(this.rgba.b),e=.2126*h+.7152*o+.0722*L;return M(e,4)}static _relativeLuminanceForComponent(h){const o=h/255;return o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4)}isLighter(){return(this.rgba.r*299+this.rgba.g*587+this.rgba.b*114)/1e3>=128}isLighterThan(h){const o=this.getRelativeLuminance(),L=h.getRelativeLuminance();return o>L}isDarkerThan(h){const o=this.getRelativeLuminance(),L=h.getRelativeLuminance();return o<L}lighten(h){return new b(new i(this.hsla.h,this.hsla.s,this.hsla.l+this.hsla.l*h,this.hsla.a))}darken(h){return new b(new i(this.hsla.h,this.hsla.s,this.hsla.l-this.hsla.l*h,this.hsla.a))}transparent(h){const{r:o,g:L,b:e,a}=this.rgba;return new b(new A(o,L,e,a*h))}isTransparent(){return this.rgba.a===0}isOpaque(){return this.rgba.a===1}opposite(){return new b(new A(255-this.rgba.r,255-this.rgba.g,255-this.rgba.b,this.rgba.a))}makeOpaque(h){if(this.isOpaque()||h.rgba.a!==1)return this;const{r:o,g:L,b:e,a}=this.rgba;return new b(new A(h.rgba.r-a*(h.rgba.r-o),h.rgba.g-a*(h.rgba.g-L),h.rgba.b-a*(h.rgba.b-e),1))}toString(){return this._toString||(this._toString=b.Format.CSS.format(this)),this._toString}static getLighterColor(h,o,L){if(h.isLighterThan(o))return h;L=L||.5;const e=h.getRelativeLuminance(),a=o.getRelativeLuminance();return L=L*(a-e)/a,h.lighten(L)}static getDarkerColor(h,o,L){if(h.isDarkerThan(o))return h;L=L||.5;const e=h.getRelativeLuminance(),a=o.getRelativeLuminance();return L=L*(e-a)/e,h.darken(L)}}n.Color=b,b.white=new b(new A(255,255,255,1)),b.black=new b(new A(0,0,0,1)),b.red=new b(new A(255,0,0,1)),b.blue=new b(new A(0,0,255,1)),b.green=new b(new A(0,255,0,1)),b.cyan=new b(new A(0,255,255,1)),b.lightgrey=new b(new A(211,211,211,1)),b.transparent=new b(new A(0,0,0,0)),function(p){let h;(function(o){let L;(function(e){function a(r){return r.rgba.a===1?`rgb(${r.rgba.r}, ${r.rgba.g}, ${r.rgba.b})`:p.Format.CSS.formatRGBA(r)}e.formatRGB=a;function u(r){return`rgba(${r.rgba.r}, ${r.rgba.g}, ${r.rgba.b}, ${+r.rgba.a.toFixed(2)})`}e.formatRGBA=u;function c(r){return r.hsla.a===1?`hsl(${r.hsla.h}, ${(r.hsla.s*100).toFixed(2)}%, ${(r.hsla.l*100).toFixed(2)}%)`:p.Format.CSS.formatHSLA(r)}e.formatHSL=c;function m(r){return`hsla(${r.hsla.h}, ${(r.hsla.s*100).toFixed(2)}%, ${(r.hsla.l*100).toFixed(2)}%, ${r.hsla.a.toFixed(2)})`}e.formatHSLA=m;function f(r){const s=r.toString(16);return s.length!==2?"0"+s:s}function y(r){return`#${f(r.rgba.r)}${f(r.rgba.g)}${f(r.rgba.b)}`}e.formatHex=y;function w(r,s=!1){return s&&r.rgba.a===1?p.Format.CSS.formatHex(r):`#${f(r.rgba.r)}${f(r.rgba.g)}${f(r.rgba.b)}${f(Math.round(r.rgba.a*255))}`}e.formatHexA=w;function E(r){return r.isOpaque()?p.Format.CSS.formatHex(r):p.Format.CSS.formatRGBA(r)}e.format=E;function S(r){const s=r.length;if(s===0||r.charCodeAt(0)!==35)return null;if(s===7){const l=16*C(r.charCodeAt(1))+C(r.charCodeAt(2)),_=16*C(r.charCodeAt(3))+C(r.charCodeAt(4)),g=16*C(r.charCodeAt(5))+C(r.charCodeAt(6));return new p(new A(l,_,g,1))}if(s===9){const l=16*C(r.charCodeAt(1))+C(r.charCodeAt(2)),_=16*C(r.charCodeAt(3))+C(r.charCodeAt(4)),g=16*C(r.charCodeAt(5))+C(r.charCodeAt(6)),v=16*C(r.charCodeAt(7))+C(r.charCodeAt(8));return new p(new A(l,_,g,v/255))}if(s===4){const l=C(r.charCodeAt(1)),_=C(r.charCodeAt(2)),g=C(r.charCodeAt(3));return new p(new A(16*l+l,16*_+_,16*g+g))}if(s===5){const l=C(r.charCodeAt(1)),_=C(r.charCodeAt(2)),g=C(r.charCodeAt(3)),v=C(r.charCodeAt(4));return new p(new A(16*l+l,16*_+_,16*g+g,(16*v+v)/255))}return null}e.parseHex=S;function C(r){switch(r){case 48:return 0;case 49:return 1;case 50:return 2;case 51:return 3;case 52:return 4;case 53:return 5;case 54:return 6;case 55:return 7;case 56:return 8;case 57:return 9;case 97:return 10;case 65:return 10;case 98:return 11;case 66:return 11;case 99:return 12;case 67:return 12;case 100:return 13;case 68:return 13;case 101:return 14;case 69:return 14;case 102:return 15;case 70:return 15}return 0}})(L=o.CSS||(o.CSS={}))})(h=p.Format||(p.Format={}))}(b||(n.Color=b={}))}),Y(X[34],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.DiffChange=void 0;class M{constructor(i,d,b,p){this.originalStart=i,this.originalLength=d,this.modifiedStart=b,this.modifiedLength=p}getOriginalEnd(){return this.originalStart+this.originalLength}getModifiedEnd(){return this.modifiedStart+this.modifiedLength}}n.DiffChange=M}),Y(X[5],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.BugIndicatingError=n.ErrorNoTelemetry=n.NotSupportedError=n.illegalState=n.illegalArgument=n.canceled=n.CancellationError=n.isCancellationError=n.transformErrorForSerialization=n.onUnexpectedExternalError=n.onUnexpectedError=n.errorHandler=n.ErrorHandler=void 0;class M{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(f){setTimeout(()=>{throw f.stack?u.isErrorNoTelemetry(f)?new u(f.message+`
+
+`+f.stack):new Error(f.message+`
+
+`+f.stack):f},0)}}emit(f){this.listeners.forEach(y=>{y(f)})}onUnexpectedError(f){this.unexpectedErrorHandler(f),this.emit(f)}onUnexpectedExternalError(f){this.unexpectedErrorHandler(f)}}n.ErrorHandler=M,n.errorHandler=new M;function A(m){p(m)||n.errorHandler.onUnexpectedError(m)}n.onUnexpectedError=A;function i(m){p(m)||n.errorHandler.onUnexpectedExternalError(m)}n.onUnexpectedExternalError=i;function d(m){if(m instanceof Error){const{name:f,message:y}=m,w=m.stacktrace||m.stack;return{$isError:!0,name:f,message:y,stack:w,noTelemetry:u.isErrorNoTelemetry(m)}}return m}n.transformErrorForSerialization=d;const b="Canceled";function p(m){return m instanceof h?!0:m instanceof Error&&m.name===b&&m.message===b}n.isCancellationError=p;class h extends Error{constructor(){super(b),this.name=this.message}}n.CancellationError=h;function o(){const m=new Error(b);return m.name=m.message,m}n.canceled=o;function L(m){return m?new Error(`Illegal argument: ${m}`):new Error("Illegal argument")}n.illegalArgument=L;function e(m){return m?new Error(`Illegal state: ${m}`):new Error("Illegal state")}n.illegalState=e;class a extends Error{constructor(f){super("NotSupported"),f&&(this.message=f)}}n.NotSupportedError=a;class u extends Error{constructor(f){super(f),this.name="CodeExpectedError"}static fromError(f){if(f instanceof u)return f;const y=new u;return y.message=f.message,y.stack=f.stack,y}static isErrorNoTelemetry(f){return f.name==="CodeExpectedError"}}n.ErrorNoTelemetry=u;class c extends Error{constructor(f){super(f||"An unexpected bug occurred."),Object.setPrototypeOf(this,c.prototype)}}n.BugIndicatingError=c}),Y(X[12],J([0,1,5]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.checkAdjacentItems=n.assertFn=n.softAssert=n.assertNever=n.ok=void 0;function A(h,o){if(!h)throw new Error(o?`Assertion failed (${o})`:"Assertion Failed")}n.ok=A;function i(h,o="Unreachable"){throw new Error(o)}n.assertNever=i;function d(h){h||(0,M.onUnexpectedError)(new M.BugIndicatingError("Assertion Failed"))}n.softAssert=d;function b(h){if(!h()){debugger;h(),(0,M.onUnexpectedError)(new M.BugIndicatingError("Assertion Failed"))}}n.assertFn=b;function p(h,o){let L=0;for(;L<h.length-1;){const e=h[L],a=h[L+1];if(!o(e,a))return!1;L++}return!0}n.checkAdjacentItems=p}),Y(X[20],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.createSingleCallFunction=void 0;function M(A,i){const d=this;let b=!1,p;return function(){if(b)return p;if(b=!0,i)try{p=A.apply(d,arguments)}finally{i()}else p=A.apply(d,arguments);return p}}n.createSingleCallFunction=M}),Y(X[21],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Iterable=void 0;var M;(function(A){function i(r){return r&&typeof r=="object"&&typeof r[Symbol.iterator]=="function"}A.is=i;const d=Object.freeze([]);function b(){return d}A.empty=b;function*p(r){yield r}A.single=p;function h(r){return i(r)?r:p(r)}A.wrap=h;function o(r){return r||d}A.from=o;function*L(r){for(let s=r.length-1;s>=0;s--)yield r[s]}A.reverse=L;function e(r){return!r||r[Symbol.iterator]().next().done===!0}A.isEmpty=e;function a(r){return r[Symbol.iterator]().next().value}A.first=a;function u(r,s){for(const l of r)if(s(l))return!0;return!1}A.some=u;function c(r,s){for(const l of r)if(s(l))return l}A.find=c;function*m(r,s){for(const l of r)s(l)&&(yield l)}A.filter=m;function*f(r,s){let l=0;for(const _ of r)yield s(_,l++)}A.map=f;function*y(...r){for(const s of r)yield*s}A.concat=y;function w(r,s,l){let _=l;for(const g of r)_=s(_,g);return _}A.reduce=w;function*E(r,s,l=r.length){for(s<0&&(s+=r.length),l<0?l+=r.length:l>r.length&&(l=r.length);s<l;s++)yield r[s]}A.slice=E;function S(r,s=Number.POSITIVE_INFINITY){const l=[];if(s===0)return[l,r];const _=r[Symbol.iterator]();for(let g=0;g<s;g++){const v=_.next();if(v.done)return[l,A.empty()];l.push(v.value)}return[l,{[Symbol.iterator](){return _}}]}A.consume=S;async function C(r){const s=[];for await(const l of r)s.push(l);return Promise.resolve(s)}A.asyncToArray=C})(M||(n.Iterable=M={}))}),Y(X[35],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.KeyChord=n.KeyCodeUtils=n.IMMUTABLE_KEY_CODE_TO_CODE=n.IMMUTABLE_CODE_TO_KEY_CODE=n.NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE=n.EVENT_KEY_CODE_MAP=void 0;class M{constructor(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}define(a,u){this._keyCodeToStr[a]=u,this._strToKeyCode[u.toLowerCase()]=a}keyCodeToStr(a){return this._keyCodeToStr[a]}strToKeyCode(a){return this._strToKeyCode[a.toLowerCase()]||0}}const A=new M,i=new M,d=new M;n.EVENT_KEY_CODE_MAP=new Array(230),n.NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE={};const b=[],p=Object.create(null),h=Object.create(null);n.IMMUTABLE_CODE_TO_KEY_CODE=[],n.IMMUTABLE_KEY_CODE_TO_CODE=[];for(let e=0;e<=193;e++)n.IMMUTABLE_CODE_TO_KEY_CODE[e]=-1;for(let e=0;e<=132;e++)n.IMMUTABLE_KEY_CODE_TO_CODE[e]=-1;(function(){const e="",a=[[1,0,"None",0,"unknown",0,"VK_UNKNOWN",e,e],[1,1,"Hyper",0,e,0,e,e,e],[1,2,"Super",0,e,0,e,e,e],[1,3,"Fn",0,e,0,e,e,e],[1,4,"FnLock",0,e,0,e,e,e],[1,5,"Suspend",0,e,0,e,e,e],[1,6,"Resume",0,e,0,e,e,e],[1,7,"Turbo",0,e,0,e,e,e],[1,8,"Sleep",0,e,0,"VK_SLEEP",e,e],[1,9,"WakeUp",0,e,0,e,e,e],[0,10,"KeyA",31,"A",65,"VK_A",e,e],[0,11,"KeyB",32,"B",66,"VK_B",e,e],[0,12,"KeyC",33,"C",67,"VK_C",e,e],[0,13,"KeyD",34,"D",68,"VK_D",e,e],[0,14,"KeyE",35,"E",69,"VK_E",e,e],[0,15,"KeyF",36,"F",70,"VK_F",e,e],[0,16,"KeyG",37,"G",71,"VK_G",e,e],[0,17,"KeyH",38,"H",72,"VK_H",e,e],[0,18,"KeyI",39,"I",73,"VK_I",e,e],[0,19,"KeyJ",40,"J",74,"VK_J",e,e],[0,20,"KeyK",41,"K",75,"VK_K",e,e],[0,21,"KeyL",42,"L",76,"VK_L",e,e],[0,22,"KeyM",43,"M",77,"VK_M",e,e],[0,23,"KeyN",44,"N",78,"VK_N",e,e],[0,24,"KeyO",45,"O",79,"VK_O",e,e],[0,25,"KeyP",46,"P",80,"VK_P",e,e],[0,26,"KeyQ",47,"Q",81,"VK_Q",e,e],[0,27,"KeyR",48,"R",82,"VK_R",e,e],[0,28,"KeyS",49,"S",83,"VK_S",e,e],[0,29,"KeyT",50,"T",84,"VK_T",e,e],[0,30,"KeyU",51,"U",85,"VK_U",e,e],[0,31,"KeyV",52,"V",86,"VK_V",e,e],[0,32,"KeyW",53,"W",87,"VK_W",e,e],[0,33,"KeyX",54,"X",88,"VK_X",e,e],[0,34,"KeyY",55,"Y",89,"VK_Y",e,e],[0,35,"KeyZ",56,"Z",90,"VK_Z",e,e],[0,36,"Digit1",22,"1",49,"VK_1",e,e],[0,37,"Digit2",23,"2",50,"VK_2",e,e],[0,38,"Digit3",24,"3",51,"VK_3",e,e],[0,39,"Digit4",25,"4",52,"VK_4",e,e],[0,40,"Digit5",26,"5",53,"VK_5",e,e],[0,41,"Digit6",27,"6",54,"VK_6",e,e],[0,42,"Digit7",28,"7",55,"VK_7",e,e],[0,43,"Digit8",29,"8",56,"VK_8",e,e],[0,44,"Digit9",30,"9",57,"VK_9",e,e],[0,45,"Digit0",21,"0",48,"VK_0",e,e],[1,46,"Enter",3,"Enter",13,"VK_RETURN",e,e],[1,47,"Escape",9,"Escape",27,"VK_ESCAPE",e,e],[1,48,"Backspace",1,"Backspace",8,"VK_BACK",e,e],[1,49,"Tab",2,"Tab",9,"VK_TAB",e,e],[1,50,"Space",10,"Space",32,"VK_SPACE",e,e],[0,51,"Minus",88,"-",189,"VK_OEM_MINUS","-","OEM_MINUS"],[0,52,"Equal",86,"=",187,"VK_OEM_PLUS","=","OEM_PLUS"],[0,53,"BracketLeft",92,"[",219,"VK_OEM_4","[","OEM_4"],[0,54,"BracketRight",94,"]",221,"VK_OEM_6","]","OEM_6"],[0,55,"Backslash",93,"\\",220,"VK_OEM_5","\\","OEM_5"],[0,56,"IntlHash",0,e,0,e,e,e],[0,57,"Semicolon",85,";",186,"VK_OEM_1",";","OEM_1"],[0,58,"Quote",95,"'",222,"VK_OEM_7","'","OEM_7"],[0,59,"Backquote",91,"`",192,"VK_OEM_3","`","OEM_3"],[0,60,"Comma",87,",",188,"VK_OEM_COMMA",",","OEM_COMMA"],[0,61,"Period",89,".",190,"VK_OEM_PERIOD",".","OEM_PERIOD"],[0,62,"Slash",90,"/",191,"VK_OEM_2","/","OEM_2"],[1,63,"CapsLock",8,"CapsLock",20,"VK_CAPITAL",e,e],[1,64,"F1",59,"F1",112,"VK_F1",e,e],[1,65,"F2",60,"F2",113,"VK_F2",e,e],[1,66,"F3",61,"F3",114,"VK_F3",e,e],[1,67,"F4",62,"F4",115,"VK_F4",e,e],[1,68,"F5",63,"F5",116,"VK_F5",e,e],[1,69,"F6",64,"F6",117,"VK_F6",e,e],[1,70,"F7",65,"F7",118,"VK_F7",e,e],[1,71,"F8",66,"F8",119,"VK_F8",e,e],[1,72,"F9",67,"F9",120,"VK_F9",e,e],[1,73,"F10",68,"F10",121,"VK_F10",e,e],[1,74,"F11",69,"F11",122,"VK_F11",e,e],[1,75,"F12",70,"F12",123,"VK_F12",e,e],[1,76,"PrintScreen",0,e,0,e,e,e],[1,77,"ScrollLock",84,"ScrollLock",145,"VK_SCROLL",e,e],[1,78,"Pause",7,"PauseBreak",19,"VK_PAUSE",e,e],[1,79,"Insert",19,"Insert",45,"VK_INSERT",e,e],[1,80,"Home",14,"Home",36,"VK_HOME",e,e],[1,81,"PageUp",11,"PageUp",33,"VK_PRIOR",e,e],[1,82,"Delete",20,"Delete",46,"VK_DELETE",e,e],[1,83,"End",13,"End",35,"VK_END",e,e],[1,84,"PageDown",12,"PageDown",34,"VK_NEXT",e,e],[1,85,"ArrowRight",17,"RightArrow",39,"VK_RIGHT","Right",e],[1,86,"ArrowLeft",15,"LeftArrow",37,"VK_LEFT","Left",e],[1,87,"ArrowDown",18,"DownArrow",40,"VK_DOWN","Down",e],[1,88,"ArrowUp",16,"UpArrow",38,"VK_UP","Up",e],[1,89,"NumLock",83,"NumLock",144,"VK_NUMLOCK",e,e],[1,90,"NumpadDivide",113,"NumPad_Divide",111,"VK_DIVIDE",e,e],[1,91,"NumpadMultiply",108,"NumPad_Multiply",106,"VK_MULTIPLY",e,e],[1,92,"NumpadSubtract",111,"NumPad_Subtract",109,"VK_SUBTRACT",e,e],[1,93,"NumpadAdd",109,"NumPad_Add",107,"VK_ADD",e,e],[1,94,"NumpadEnter",3,e,0,e,e,e],[1,95,"Numpad1",99,"NumPad1",97,"VK_NUMPAD1",e,e],[1,96,"Numpad2",100,"NumPad2",98,"VK_NUMPAD2",e,e],[1,97,"Numpad3",101,"NumPad3",99,"VK_NUMPAD3",e,e],[1,98,"Numpad4",102,"NumPad4",100,"VK_NUMPAD4",e,e],[1,99,"Numpad5",103,"NumPad5",101,"VK_NUMPAD5",e,e],[1,100,"Numpad6",104,"NumPad6",102,"VK_NUMPAD6",e,e],[1,101,"Numpad7",105,"NumPad7",103,"VK_NUMPAD7",e,e],[1,102,"Numpad8",106,"NumPad8",104,"VK_NUMPAD8",e,e],[1,103,"Numpad9",107,"NumPad9",105,"VK_NUMPAD9",e,e],[1,104,"Numpad0",98,"NumPad0",96,"VK_NUMPAD0",e,e],[1,105,"NumpadDecimal",112,"NumPad_Decimal",110,"VK_DECIMAL",e,e],[0,106,"IntlBackslash",97,"OEM_102",226,"VK_OEM_102",e,e],[1,107,"ContextMenu",58,"ContextMenu",93,e,e,e],[1,108,"Power",0,e,0,e,e,e],[1,109,"NumpadEqual",0,e,0,e,e,e],[1,110,"F13",71,"F13",124,"VK_F13",e,e],[1,111,"F14",72,"F14",125,"VK_F14",e,e],[1,112,"F15",73,"F15",126,"VK_F15",e,e],[1,113,"F16",74,"F16",127,"VK_F16",e,e],[1,114,"F17",75,"F17",128,"VK_F17",e,e],[1,115,"F18",76,"F18",129,"VK_F18",e,e],[1,116,"F19",77,"F19",130,"VK_F19",e,e],[1,117,"F20",78,"F20",131,"VK_F20",e,e],[1,118,"F21",79,"F21",132,"VK_F21",e,e],[1,119,"F22",80,"F22",133,"VK_F22",e,e],[1,120,"F23",81,"F23",134,"VK_F23",e,e],[1,121,"F24",82,"F24",135,"VK_F24",e,e],[1,122,"Open",0,e,0,e,e,e],[1,123,"Help",0,e,0,e,e,e],[1,124,"Select",0,e,0,e,e,e],[1,125,"Again",0,e,0,e,e,e],[1,126,"Undo",0,e,0,e,e,e],[1,127,"Cut",0,e,0,e,e,e],[1,128,"Copy",0,e,0,e,e,e],[1,129,"Paste",0,e,0,e,e,e],[1,130,"Find",0,e,0,e,e,e],[1,131,"AudioVolumeMute",117,"AudioVolumeMute",173,"VK_VOLUME_MUTE",e,e],[1,132,"AudioVolumeUp",118,"AudioVolumeUp",175,"VK_VOLUME_UP",e,e],[1,133,"AudioVolumeDown",119,"AudioVolumeDown",174,"VK_VOLUME_DOWN",e,e],[1,134,"NumpadComma",110,"NumPad_Separator",108,"VK_SEPARATOR",e,e],[0,135,"IntlRo",115,"ABNT_C1",193,"VK_ABNT_C1",e,e],[1,136,"KanaMode",0,e,0,e,e,e],[0,137,"IntlYen",0,e,0,e,e,e],[1,138,"Convert",0,e,0,e,e,e],[1,139,"NonConvert",0,e,0,e,e,e],[1,140,"Lang1",0,e,0,e,e,e],[1,141,"Lang2",0,e,0,e,e,e],[1,142,"Lang3",0,e,0,e,e,e],[1,143,"Lang4",0,e,0,e,e,e],[1,144,"Lang5",0,e,0,e,e,e],[1,145,"Abort",0,e,0,e,e,e],[1,146,"Props",0,e,0,e,e,e],[1,147,"NumpadParenLeft",0,e,0,e,e,e],[1,148,"NumpadParenRight",0,e,0,e,e,e],[1,149,"NumpadBackspace",0,e,0,e,e,e],[1,150,"NumpadMemoryStore",0,e,0,e,e,e],[1,151,"NumpadMemoryRecall",0,e,0,e,e,e],[1,152,"NumpadMemoryClear",0,e,0,e,e,e],[1,153,"NumpadMemoryAdd",0,e,0,e,e,e],[1,154,"NumpadMemorySubtract",0,e,0,e,e,e],[1,155,"NumpadClear",131,"Clear",12,"VK_CLEAR",e,e],[1,156,"NumpadClearEntry",0,e,0,e,e,e],[1,0,e,5,"Ctrl",17,"VK_CONTROL",e,e],[1,0,e,4,"Shift",16,"VK_SHIFT",e,e],[1,0,e,6,"Alt",18,"VK_MENU",e,e],[1,0,e,57,"Meta",91,"VK_COMMAND",e,e],[1,157,"ControlLeft",5,e,0,"VK_LCONTROL",e,e],[1,158,"ShiftLeft",4,e,0,"VK_LSHIFT",e,e],[1,159,"AltLeft",6,e,0,"VK_LMENU",e,e],[1,160,"MetaLeft",57,e,0,"VK_LWIN",e,e],[1,161,"ControlRight",5,e,0,"VK_RCONTROL",e,e],[1,162,"ShiftRight",4,e,0,"VK_RSHIFT",e,e],[1,163,"AltRight",6,e,0,"VK_RMENU",e,e],[1,164,"MetaRight",57,e,0,"VK_RWIN",e,e],[1,165,"BrightnessUp",0,e,0,e,e,e],[1,166,"BrightnessDown",0,e,0,e,e,e],[1,167,"MediaPlay",0,e,0,e,e,e],[1,168,"MediaRecord",0,e,0,e,e,e],[1,169,"MediaFastForward",0,e,0,e,e,e],[1,170,"MediaRewind",0,e,0,e,e,e],[1,171,"MediaTrackNext",124,"MediaTrackNext",176,"VK_MEDIA_NEXT_TRACK",e,e],[1,172,"MediaTrackPrevious",125,"MediaTrackPrevious",177,"VK_MEDIA_PREV_TRACK",e,e],[1,173,"MediaStop",126,"MediaStop",178,"VK_MEDIA_STOP",e,e],[1,174,"Eject",0,e,0,e,e,e],[1,175,"MediaPlayPause",127,"MediaPlayPause",179,"VK_MEDIA_PLAY_PAUSE",e,e],[1,176,"MediaSelect",128,"LaunchMediaPlayer",181,"VK_MEDIA_LAUNCH_MEDIA_SELECT",e,e],[1,177,"LaunchMail",129,"LaunchMail",180,"VK_MEDIA_LAUNCH_MAIL",e,e],[1,178,"LaunchApp2",130,"LaunchApp2",183,"VK_MEDIA_LAUNCH_APP2",e,e],[1,179,"LaunchApp1",0,e,0,"VK_MEDIA_LAUNCH_APP1",e,e],[1,180,"SelectTask",0,e,0,e,e,e],[1,181,"LaunchScreenSaver",0,e,0,e,e,e],[1,182,"BrowserSearch",120,"BrowserSearch",170,"VK_BROWSER_SEARCH",e,e],[1,183,"BrowserHome",121,"BrowserHome",172,"VK_BROWSER_HOME",e,e],[1,184,"BrowserBack",122,"BrowserBack",166,"VK_BROWSER_BACK",e,e],[1,185,"BrowserForward",123,"BrowserForward",167,"VK_BROWSER_FORWARD",e,e],[1,186,"BrowserStop",0,e,0,"VK_BROWSER_STOP",e,e],[1,187,"BrowserRefresh",0,e,0,"VK_BROWSER_REFRESH",e,e],[1,188,"BrowserFavorites",0,e,0,"VK_BROWSER_FAVORITES",e,e],[1,189,"ZoomToggle",0,e,0,e,e,e],[1,190,"MailReply",0,e,0,e,e,e],[1,191,"MailForward",0,e,0,e,e,e],[1,192,"MailSend",0,e,0,e,e,e],[1,0,e,114,"KeyInComposition",229,e,e,e],[1,0,e,116,"ABNT_C2",194,"VK_ABNT_C2",e,e],[1,0,e,96,"OEM_8",223,"VK_OEM_8",e,e],[1,0,e,0,e,0,"VK_KANA",e,e],[1,0,e,0,e,0,"VK_HANGUL",e,e],[1,0,e,0,e,0,"VK_JUNJA",e,e],[1,0,e,0,e,0,"VK_FINAL",e,e],[1,0,e,0,e,0,"VK_HANJA",e,e],[1,0,e,0,e,0,"VK_KANJI",e,e],[1,0,e,0,e,0,"VK_CONVERT",e,e],[1,0,e,0,e,0,"VK_NONCONVERT",e,e],[1,0,e,0,e,0,"VK_ACCEPT",e,e],[1,0,e,0,e,0,"VK_MODECHANGE",e,e],[1,0,e,0,e,0,"VK_SELECT",e,e],[1,0,e,0,e,0,"VK_PRINT",e,e],[1,0,e,0,e,0,"VK_EXECUTE",e,e],[1,0,e,0,e,0,"VK_SNAPSHOT",e,e],[1,0,e,0,e,0,"VK_HELP",e,e],[1,0,e,0,e,0,"VK_APPS",e,e],[1,0,e,0,e,0,"VK_PROCESSKEY",e,e],[1,0,e,0,e,0,"VK_PACKET",e,e],[1,0,e,0,e,0,"VK_DBE_SBCSCHAR",e,e],[1,0,e,0,e,0,"VK_DBE_DBCSCHAR",e,e],[1,0,e,0,e,0,"VK_ATTN",e,e],[1,0,e,0,e,0,"VK_CRSEL",e,e],[1,0,e,0,e,0,"VK_EXSEL",e,e],[1,0,e,0,e,0,"VK_EREOF",e,e],[1,0,e,0,e,0,"VK_PLAY",e,e],[1,0,e,0,e,0,"VK_ZOOM",e,e],[1,0,e,0,e,0,"VK_NONAME",e,e],[1,0,e,0,e,0,"VK_PA1",e,e],[1,0,e,0,e,0,"VK_OEM_CLEAR",e,e]],u=[],c=[];for(const m of a){const[f,y,w,E,S,C,r,s,l]=m;if(c[y]||(c[y]=!0,b[y]=w,p[w]=y,h[w.toLowerCase()]=y,f&&(n.IMMUTABLE_CODE_TO_KEY_CODE[y]=E,E!==0&&E!==3&&E!==5&&E!==4&&E!==6&&E!==57&&(n.IMMUTABLE_KEY_CODE_TO_CODE[E]=y))),!u[E]){if(u[E]=!0,!S)throw new Error(`String representation missing for key code ${E} around scan code ${w}`);A.define(E,S),i.define(E,s||S),d.define(E,l||s||S)}C&&(n.EVENT_KEY_CODE_MAP[C]=E),r&&(n.NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE[r]=E)}n.IMMUTABLE_KEY_CODE_TO_CODE[3]=46})();var o;(function(e){function a(w){return A.keyCodeToStr(w)}e.toString=a;function u(w){return A.strToKeyCode(w)}e.fromString=u;function c(w){return i.keyCodeToStr(w)}e.toUserSettingsUS=c;function m(w){return d.keyCodeToStr(w)}e.toUserSettingsGeneral=m;function f(w){return i.strToKeyCode(w)||d.strToKeyCode(w)}e.fromUserSettings=f;function y(w){if(w>=98&&w<=113)return null;switch(w){case 16:return"Up";case 18:return"Down";case 15:return"Left";case 17:return"Right"}return A.keyCodeToStr(w)}e.toElectronAccelerator=y})(o||(n.KeyCodeUtils=o={}));function L(e,a){const u=(a&65535)<<16>>>0;return(e|u)>>>0}n.KeyChord=L}),Y(X[36],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Lazy=void 0;class M{constructor(i){this.executor=i,this._didRun=!1}get value(){if(!this._didRun)try{this._value=this.executor()}catch(i){this._error=i}finally{this._didRun=!0}if(this._error)throw this._error;return this._value}get rawValue(){return this._value}}n.Lazy=M}),Y(X[13],J([0,1,20,21]),function(q,n,M,A){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.DisposableMap=n.ImmortalReference=n.RefCountedDisposable=n.MutableDisposable=n.Disposable=n.DisposableStore=n.toDisposable=n.combinedDisposable=n.dispose=n.isDisposable=n.markAsSingleton=n.markAsDisposed=n.trackDisposable=n.setDisposableTracker=void 0;const i=!1;let d=null;function b(r){d=r}if(n.setDisposableTracker=b,i){const r="__is_disposable_tracked__";b(new class{trackDisposable(s){const l=new Error("Potentially leaked disposable").stack;setTimeout(()=>{s[r]||console.log(l)},3e3)}setParent(s,l){if(s&&s!==y.None)try{s[r]=!0}catch{}}markAsDisposed(s){if(s&&s!==y.None)try{s[r]=!0}catch{}}markAsSingleton(s){}})}function p(r){return d?.trackDisposable(r),r}n.trackDisposable=p;function h(r){d?.markAsDisposed(r)}n.markAsDisposed=h;function o(r,s){d?.setParent(r,s)}function L(r,s){if(d)for(const l of r)d.setParent(l,s)}function e(r){return d?.markAsSingleton(r),r}n.markAsSingleton=e;function a(r){return typeof r.dispose=="function"&&r.dispose.length===0}n.isDisposable=a;function u(r){if(A.Iterable.is(r)){const s=[];for(const l of r)if(l)try{l.dispose()}catch(_){s.push(_)}if(s.length===1)throw s[0];if(s.length>1)throw new AggregateError(s,"Encountered errors while disposing of store");return Array.isArray(r)?[]:r}else if(r)return r.dispose(),r}n.dispose=u;function c(...r){const s=m(()=>u(r));return L(r,s),s}n.combinedDisposable=c;function m(r){const s=p({dispose:(0,M.createSingleCallFunction)(()=>{h(s),r()})});return s}n.toDisposable=m;class f{constructor(){this._toDispose=new Set,this._isDisposed=!1,p(this)}dispose(){this._isDisposed||(h(this),this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){if(this._toDispose.size!==0)try{u(this._toDispose)}finally{this._toDispose.clear()}}add(s){if(!s)return s;if(s===this)throw new Error("Cannot register a disposable on itself!");return o(s,this),this._isDisposed?f.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(s),s}deleteAndLeak(s){s&&this._toDispose.has(s)&&(this._toDispose.delete(s),o(s,null))}}n.DisposableStore=f,f.DISABLE_DISPOSED_WARNING=!1;class y{constructor(){this._store=new f,p(this),o(this._store,this)}dispose(){h(this),this._store.dispose()}_register(s){if(s===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(s)}}n.Disposable=y,y.None=Object.freeze({dispose(){}});class w{constructor(){this._isDisposed=!1,p(this)}get value(){return this._isDisposed?void 0:this._value}set value(s){var l;this._isDisposed||s===this._value||((l=this._value)===null||l===void 0||l.dispose(),s&&o(s,this),this._value=s)}clear(){this.value=void 0}dispose(){var s;this._isDisposed=!0,h(this),(s=this._value)===null||s===void 0||s.dispose(),this._value=void 0}}n.MutableDisposable=w;class E{constructor(s){this._disposable=s,this._counter=1}acquire(){return this._counter++,this}release(){return--this._counter===0&&this._disposable.dispose(),this}}n.RefCountedDisposable=E;class S{constructor(s){this.object=s}dispose(){}}n.ImmortalReference=S;class C{constructor(){this._store=new Map,this._isDisposed=!1,p(this)}dispose(){h(this),this._isDisposed=!0,this.clearAndDisposeAll()}clearAndDisposeAll(){if(this._store.size)try{u(this._store.values())}finally{this._store.clear()}}get(s){return this._store.get(s)}set(s,l,_=!1){var g;this._isDisposed&&console.warn(new Error("Trying to add a disposable to a DisposableMap that has already been disposed of. The added object will be leaked!").stack),_||(g=this._store.get(s))===null||g===void 0||g.dispose(),this._store.set(s,l)}deleteAndDispose(s){var l;(l=this._store.get(s))===null||l===void 0||l.dispose(),this._store.delete(s)}[Symbol.iterator](){return this._store[Symbol.iterator]()}}n.DisposableMap=C}),Y(X[22],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.LinkedList=void 0;class M{constructor(d){this.element=d,this.next=M.Undefined,this.prev=M.Undefined}}M.Undefined=new M(void 0);class A{constructor(){this._first=M.Undefined,this._last=M.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===M.Undefined}clear(){let d=this._first;for(;d!==M.Undefined;){const b=d.next;d.prev=M.Undefined,d.next=M.Undefined,d=b}this._first=M.Undefined,this._last=M.Undefined,this._size=0}unshift(d){return this._insert(d,!1)}push(d){return this._insert(d,!0)}_insert(d,b){const p=new M(d);if(this._first===M.Undefined)this._first=p,this._last=p;else if(b){const o=this._last;this._last=p,p.prev=o,o.next=p}else{const o=this._first;this._first=p,p.next=o,o.prev=p}this._size+=1;let h=!1;return()=>{h||(h=!0,this._remove(p))}}shift(){if(this._first!==M.Undefined){const d=this._first.element;return this._remove(this._first),d}}pop(){if(this._last!==M.Undefined){const d=this._last.element;return this._remove(this._last),d}}_remove(d){if(d.prev!==M.Undefined&&d.next!==M.Undefined){const b=d.prev;b.next=d.next,d.next.prev=b}else d.prev===M.Undefined&&d.next===M.Undefined?(this._first=M.Undefined,this._last=M.Undefined):d.next===M.Undefined?(this._last=this._last.prev,this._last.next=M.Undefined):d.prev===M.Undefined&&(this._first=this._first.next,this._first.prev=M.Undefined);this._size-=1}*[Symbol.iterator](){let d=this._first;for(;d!==M.Undefined;)yield d.element,d=d.next}}n.LinkedList=A}),Y(X[37],J([0,1]),function(q,n){"use strict";var M,A;Object.defineProperty(n,"__esModule",{value:!0}),n.SetMap=n.BidirectionalMap=n.LRUCache=n.LinkedMap=n.ResourceMap=void 0;class i{constructor(a,u){this.uri=a,this.value=u}}function d(e){return Array.isArray(e)}class b{constructor(a,u){if(this[M]="ResourceMap",a instanceof b)this.map=new Map(a.map),this.toKey=u??b.defaultToKey;else if(d(a)){this.map=new Map,this.toKey=u??b.defaultToKey;for(const[c,m]of a)this.set(c,m)}else this.map=new Map,this.toKey=a??b.defaultToKey}set(a,u){return this.map.set(this.toKey(a),new i(a,u)),this}get(a){var u;return(u=this.map.get(this.toKey(a)))===null||u===void 0?void 0:u.value}has(a){return this.map.has(this.toKey(a))}get size(){return this.map.size}clear(){this.map.clear()}delete(a){return this.map.delete(this.toKey(a))}forEach(a,u){typeof u<"u"&&(a=a.bind(u));for(const[c,m]of this.map)a(m.value,m.uri,this)}*values(){for(const a of this.map.values())yield a.value}*keys(){for(const a of this.map.values())yield a.uri}*entries(){for(const a of this.map.values())yield[a.uri,a.value]}*[(M=Symbol.toStringTag,Symbol.iterator)](){for(const[,a]of this.map)yield[a.uri,a.value]}}n.ResourceMap=b,b.defaultToKey=e=>e.toString();class p{constructor(){this[A]="LinkedMap",this._map=new Map,this._head=void 0,this._tail=void 0,this._size=0,this._state=0}clear(){this._map.clear(),this._head=void 0,this._tail=void 0,this._size=0,this._state++}isEmpty(){return!this._head&&!this._tail}get size(){return this._size}get first(){var a;return(a=this._head)===null||a===void 0?void 0:a.value}get last(){var a;return(a=this._tail)===null||a===void 0?void 0:a.value}has(a){return this._map.has(a)}get(a,u=0){const c=this._map.get(a);if(c)return u!==0&&this.touch(c,u),c.value}set(a,u,c=0){let m=this._map.get(a);if(m)m.value=u,c!==0&&this.touch(m,c);else{switch(m={key:a,value:u,next:void 0,previous:void 0},c){case 0:this.addItemLast(m);break;case 1:this.addItemFirst(m);break;case 2:this.addItemLast(m);break;default:this.addItemLast(m);break}this._map.set(a,m),this._size++}return this}delete(a){return!!this.remove(a)}remove(a){const u=this._map.get(a);if(u)return this._map.delete(a),this.removeItem(u),this._size--,u.value}shift(){if(!this._head&&!this._tail)return;if(!this._head||!this._tail)throw new Error("Invalid list");const a=this._head;return this._map.delete(a.key),this.removeItem(a),this._size--,a.value}forEach(a,u){const c=this._state;let m=this._head;for(;m;){if(u?a.bind(u)(m.value,m.key,this):a(m.value,m.key,this),this._state!==c)throw new Error("LinkedMap got modified during iteration.");m=m.next}}keys(){const a=this,u=this._state;let c=this._head;const m={[Symbol.iterator](){return m},next(){if(a._state!==u)throw new Error("LinkedMap got modified during iteration.");if(c){const f={value:c.key,done:!1};return c=c.next,f}else return{value:void 0,done:!0}}};return m}values(){const a=this,u=this._state;let c=this._head;const m={[Symbol.iterator](){return m},next(){if(a._state!==u)throw new Error("LinkedMap got modified during iteration.");if(c){const f={value:c.value,done:!1};return c=c.next,f}else return{value:void 0,done:!0}}};return m}entries(){const a=this,u=this._state;let c=this._head;const m={[Symbol.iterator](){return m},next(){if(a._state!==u)throw new Error("LinkedMap got modified during iteration.");if(c){const f={value:[c.key,c.value],done:!1};return c=c.next,f}else return{value:void 0,done:!0}}};return m}[(A=Symbol.toStringTag,Symbol.iterator)](){return this.entries()}trimOld(a){if(a>=this.size)return;if(a===0){this.clear();return}let u=this._head,c=this.size;for(;u&&c>a;)this._map.delete(u.key),u=u.next,c--;this._head=u,this._size=c,u&&(u.previous=void 0),this._state++}addItemFirst(a){if(!this._head&&!this._tail)this._tail=a;else if(this._head)a.next=this._head,this._head.previous=a;else throw new Error("Invalid list");this._head=a,this._state++}addItemLast(a){if(!this._head&&!this._tail)this._head=a;else if(this._tail)a.previous=this._tail,this._tail.next=a;else throw new Error("Invalid list");this._tail=a,this._state++}removeItem(a){if(a===this._head&&a===this._tail)this._head=void 0,this._tail=void 0;else if(a===this._head){if(!a.next)throw new Error("Invalid list");a.next.previous=void 0,this._head=a.next}else if(a===this._tail){if(!a.previous)throw new Error("Invalid list");a.previous.next=void 0,this._tail=a.previous}else{const u=a.next,c=a.previous;if(!u||!c)throw new Error("Invalid list");u.previous=c,c.next=u}a.next=void 0,a.previous=void 0,this._state++}touch(a,u){if(!this._head||!this._tail)throw new Error("Invalid list");if(!(u!==1&&u!==2)){if(u===1){if(a===this._head)return;const c=a.next,m=a.previous;a===this._tail?(m.next=void 0,this._tail=m):(c.previous=m,m.next=c),a.previous=void 0,a.next=this._head,this._head.previous=a,this._head=a,this._state++}else if(u===2){if(a===this._tail)return;const c=a.next,m=a.previous;a===this._head?(c.previous=void 0,this._head=c):(c.previous=m,m.next=c),a.next=void 0,a.previous=this._tail,this._tail.next=a,this._tail=a,this._state++}}}toJSON(){const a=[];return this.forEach((u,c)=>{a.push([c,u])}),a}fromJSON(a){this.clear();for(const[u,c]of a)this.set(u,c)}}n.LinkedMap=p;class h extends p{constructor(a,u=1){super(),this._limit=a,this._ratio=Math.min(Math.max(0,u),1)}get limit(){return this._limit}set limit(a){this._limit=a,this.checkTrim()}get(a,u=2){return super.get(a,u)}peek(a){return super.get(a,0)}set(a,u){return super.set(a,u,2),this.checkTrim(),this}checkTrim(){this.size>this._limit&&this.trimOld(Math.round(this._limit*this._ratio))}}n.LRUCache=h;class o{constructor(a){if(this._m1=new Map,this._m2=new Map,a)for(const[u,c]of a)this.set(u,c)}clear(){this._m1.clear(),this._m2.clear()}set(a,u){this._m1.set(a,u),this._m2.set(u,a)}get(a){return this._m1.get(a)}getKey(a){return this._m2.get(a)}delete(a){const u=this._m1.get(a);return u===void 0?!1:(this._m1.delete(a),this._m2.delete(u),!0)}keys(){return this._m1.keys()}values(){return this._m1.values()}}n.BidirectionalMap=o;class L{constructor(){this.map=new Map}add(a,u){let c=this.map.get(a);c||(c=new Set,this.map.set(a,c)),c.add(u)}delete(a,u){const c=this.map.get(a);c&&(c.delete(u),c.size===0&&this.map.delete(a))}forEach(a,u){const c=this.map.get(a);c&&c.forEach(u)}get(a){const u=this.map.get(a);return u||new Set}}n.SetMap=L}),Y(X[23],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.StopWatch=void 0;const M=globalThis.performance&&typeof globalThis.performance.now=="function";class A{static create(d){return new A(d)}constructor(d){this._now=M&&d===!1?Date.now:globalThis.performance.now.bind(globalThis.performance),this._startTime=this._now(),this._stopTime=-1}stop(){this._stopTime=this._now()}elapsed(){return this._stopTime!==-1?this._stopTime-this._startTime:this._now()-this._startTime}}n.StopWatch=A}),Y(X[9],J([0,1,5,20,13,22,23]),function(q,n,M,A,i,d,b){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Relay=n.EventBufferer=n.EventMultiplexer=n.MicrotaskEmitter=n.DebounceEmitter=n.PauseableEmitter=n.createEventDeliveryQueue=n.Emitter=n.EventProfiling=n.Event=void 0;const p=!1,h=!1;var o;(function(g){g.None=()=>i.Disposable.None;function v(K){if(h){const{onDidAddListener:j}=K,Z=u.create();let Q=0;K.onDidAddListener=()=>{++Q===2&&(console.warn("snapshotted emitter LIKELY used public and SHOULD HAVE BEEN created with DisposableStore. snapshotted here"),Z.print()),j?.()}}}function R(K,j){return I(K,()=>{},0,void 0,!0,void 0,j)}g.defer=R;function N(K){return(j,Z=null,Q)=>{let ee=!1,ne;return ne=K(ie=>{if(!ee)return ne?ne.dispose():ee=!0,j.call(Z,ie)},null,Q),ee&&ne.dispose(),ne}}g.once=N;function D(K,j,Z){return k((Q,ee=null,ne)=>K(ie=>Q.call(ee,j(ie)),null,ne),Z)}g.map=D;function x(K,j,Z){return k((Q,ee=null,ne)=>K(ie=>{j(ie),Q.call(ee,ie)},null,ne),Z)}g.forEach=x;function T(K,j,Z){return k((Q,ee=null,ne)=>K(ie=>j(ie)&&Q.call(ee,ie),null,ne),Z)}g.filter=T;function F(K){return K}g.signal=F;function B(...K){return(j,Z=null,Q)=>{const ee=(0,i.combinedDisposable)(...K.map(ne=>ne(ie=>j.call(Z,ie))));return O(ee,Q)}}g.any=B;function V(K,j,Z,Q){let ee=Z;return D(K,ne=>(ee=j(ee,ne),ee),Q)}g.reduce=V;function k(K,j){let Z;const Q={onWillAddFirstListener(){Z=K(ee.fire,ee)},onDidRemoveLastListener(){Z?.dispose()}};j||v(Q);const ee=new y(Q);return j?.add(ee),ee.event}function O(K,j){return j instanceof Array?j.push(K):j&&j.add(K),K}function I(K,j,Z=100,Q=!1,ee=!1,ne,ie){let ae,P,U,H=0,$;const te={leakWarningThreshold:ne,onWillAddFirstListener(){ae=K(ue=>{H++,P=j(P,ue),Q&&!U&&(re.fire(P),P=void 0),$=()=>{const ge=P;P=void 0,U=void 0,(!Q||H>1)&&re.fire(ge),H=0},typeof Z=="number"?(clearTimeout(U),U=setTimeout($,Z)):U===void 0&&(U=0,queueMicrotask($))})},onWillRemoveListener(){ee&&H>0&&$?.()},onDidRemoveLastListener(){$=void 0,ae.dispose()}};ie||v(te);const re=new y(te);return ie?.add(re),re.event}g.debounce=I;function W(K,j=0,Z){return g.debounce(K,(Q,ee)=>Q?(Q.push(ee),Q):[ee],j,void 0,!0,void 0,Z)}g.accumulate=W;function z(K,j=(Q,ee)=>Q===ee,Z){let Q=!0,ee;return T(K,ne=>{const ie=Q||!j(ne,ee);return Q=!1,ee=ne,ie},Z)}g.latch=z;function G(K,j,Z){return[g.filter(K,j,Z),g.filter(K,Q=>!j(Q),Z)]}g.split=G;function t(K,j=!1,Z=[],Q){let ee=Z.slice(),ne=K(P=>{ee?ee.push(P):ae.fire(P)});Q&&Q.add(ne);const ie=()=>{ee?.forEach(P=>ae.fire(P)),ee=null},ae=new y({onWillAddFirstListener(){ne||(ne=K(P=>ae.fire(P)),Q&&Q.add(ne))},onDidAddFirstListener(){ee&&(j?setTimeout(ie):ie())},onDidRemoveLastListener(){ne&&ne.dispose(),ne=null}});return Q&&Q.add(ae),ae.event}g.buffer=t;function se(K,j){return(Q,ee,ne)=>{const ie=j(new me);return K(function(ae){const P=ie.evaluate(ae);P!==ce&&Q.call(ee,P)},void 0,ne)}}g.chain=se;const ce=Symbol("HaltChainable");class me{constructor(){this.steps=[]}map(j){return this.steps.push(j),this}forEach(j){return this.steps.push(Z=>(j(Z),Z)),this}filter(j){return this.steps.push(Z=>j(Z)?Z:ce),this}reduce(j,Z){let Q=Z;return this.steps.push(ee=>(Q=j(Q,ee),Q)),this}latch(j=(Z,Q)=>Z===Q){let Z=!0,Q;return this.steps.push(ee=>{const ne=Z||!j(ee,Q);return Z=!1,Q=ee,ne?ee:ce}),this}evaluate(j){for(const Z of this.steps)if(j=Z(j),j===ce)break;return j}}function ve(K,j,Z=Q=>Q){const Q=(...ae)=>ie.fire(Z(...ae)),ee=()=>K.on(j,Q),ne=()=>K.removeListener(j,Q),ie=new y({onWillAddFirstListener:ee,onDidRemoveLastListener:ne});return ie.event}g.fromNodeEventEmitter=ve;function pe(K,j,Z=Q=>Q){const Q=(...ae)=>ie.fire(Z(...ae)),ee=()=>K.addEventListener(j,Q),ne=()=>K.removeEventListener(j,Q),ie=new y({onWillAddFirstListener:ee,onDidRemoveLastListener:ne});return ie.event}g.fromDOMEventEmitter=pe;function Le(K){return new Promise(j=>N(K)(j))}g.toPromise=Le;function we(K){const j=new y;return K.then(Z=>{j.fire(Z)},()=>{j.fire(void 0)}).finally(()=>{j.dispose()}),j.event}g.fromPromise=we;function be(K,j,Z){return j(Z),K(Q=>j(Q))}g.runAndSubscribe=be;class Ce{constructor(j,Z){this._observable=j,this._counter=0,this._hasChanged=!1;const Q={onWillAddFirstListener:()=>{j.addObserver(this)},onDidRemoveLastListener:()=>{j.removeObserver(this)}};Z||v(Q),this.emitter=new y(Q),Z&&Z.add(this.emitter)}beginUpdate(j){this._counter++}handlePossibleChange(j){}handleChange(j,Z){this._hasChanged=!0}endUpdate(j){this._counter--,this._counter===0&&(this._observable.reportChanges(),this._hasChanged&&(this._hasChanged=!1,this.emitter.fire(this._observable.get())))}}function Se(K,j){return new Ce(K,j).emitter.event}g.fromObservable=Se;function ye(K){return(j,Z,Q)=>{let ee=0,ne=!1;const ie={beginUpdate(){ee++},endUpdate(){ee--,ee===0&&(K.reportChanges(),ne&&(ne=!1,j.call(Z)))},handlePossibleChange(){},handleChange(){ne=!0}};K.addObserver(ie),K.reportChanges();const ae={dispose(){K.removeObserver(ie)}};return Q instanceof i.DisposableStore?Q.add(ae):Array.isArray(Q)&&Q.push(ae),ae}}g.fromObservableLight=ye})(o||(n.Event=o={}));class L{constructor(v){this.listenerCount=0,this.invocationCount=0,this.elapsedOverall=0,this.durations=[],this.name=`${v}_${L._idPool++}`,L.all.add(this)}start(v){this._stopWatch=new b.StopWatch,this.listenerCount=v}stop(){if(this._stopWatch){const v=this._stopWatch.elapsed();this.durations.push(v),this.elapsedOverall+=v,this.invocationCount+=1,this._stopWatch=void 0}}}n.EventProfiling=L,L.all=new Set,L._idPool=0;let e=-1;class a{constructor(v,R=Math.random().toString(18).slice(2,5)){this.threshold=v,this.name=R,this._warnCountdown=0}dispose(){var v;(v=this._stacks)===null||v===void 0||v.clear()}check(v,R){const N=this.threshold;if(N<=0||R<N)return;this._stacks||(this._stacks=new Map);const D=this._stacks.get(v.value)||0;if(this._stacks.set(v.value,D+1),this._warnCountdown-=1,this._warnCountdown<=0){this._warnCountdown=N*.5;let x,T=0;for(const[F,B]of this._stacks)(!x||T<B)&&(x=F,T=B);console.warn(`[${this.name}] potential listener LEAK detected, having ${R} listeners already. MOST frequent listener (${T}):`),console.warn(x)}return()=>{const x=this._stacks.get(v.value)||0;this._stacks.set(v.value,x-1)}}}class u{static create(){var v;return new u((v=new Error().stack)!==null&&v!==void 0?v:"")}constructor(v){this.value=v}print(){console.warn(this.value.split(`
+`).slice(2).join(`
+`))}}class c{constructor(v){this.value=v}}const m=2,f=(g,v)=>{if(g instanceof c)v(g);else for(let R=0;R<g.length;R++){const N=g[R];N&&v(N)}};class y{constructor(v){var R,N,D,x,T;this._size=0,this._options=v,this._leakageMon=e>0||!((R=this._options)===null||R===void 0)&&R.leakWarningThreshold?new a((D=(N=this._options)===null||N===void 0?void 0:N.leakWarningThreshold)!==null&&D!==void 0?D:e):void 0,this._perfMon=!((x=this._options)===null||x===void 0)&&x._profName?new L(this._options._profName):void 0,this._deliveryQueue=(T=this._options)===null||T===void 0?void 0:T.deliveryQueue}dispose(){var v,R,N,D;if(!this._disposed){if(this._disposed=!0,((v=this._deliveryQueue)===null||v===void 0?void 0:v.current)===this&&this._deliveryQueue.reset(),this._listeners){if(p){const x=this._listeners;queueMicrotask(()=>{f(x,T=>{var F;return(F=T.stack)===null||F===void 0?void 0:F.print()})})}this._listeners=void 0,this._size=0}(N=(R=this._options)===null||R===void 0?void 0:R.onDidRemoveLastListener)===null||N===void 0||N.call(R),(D=this._leakageMon)===null||D===void 0||D.dispose()}}get event(){var v;return(v=this._event)!==null&&v!==void 0||(this._event=(R,N,D)=>{var x,T,F,B,V;if(this._leakageMon&&this._size>this._leakageMon.threshold*3)return console.warn(`[${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far`),i.Disposable.None;if(this._disposed)return i.Disposable.None;N&&(R=R.bind(N));const k=new c(R);let O,I;this._leakageMon&&this._size>=Math.ceil(this._leakageMon.threshold*.2)&&(k.stack=u.create(),O=this._leakageMon.check(k.stack,this._size+1)),p&&(k.stack=I??u.create()),this._listeners?this._listeners instanceof c?((V=this._deliveryQueue)!==null&&V!==void 0||(this._deliveryQueue=new E),this._listeners=[this._listeners,k]):this._listeners.push(k):((T=(x=this._options)===null||x===void 0?void 0:x.onWillAddFirstListener)===null||T===void 0||T.call(x,this),this._listeners=k,(B=(F=this._options)===null||F===void 0?void 0:F.onDidAddFirstListener)===null||B===void 0||B.call(F,this)),this._size++;const W=(0,i.toDisposable)(()=>{O?.(),this._removeListener(k)});return D instanceof i.DisposableStore?D.add(W):Array.isArray(D)&&D.push(W),W}),this._event}_removeListener(v){var R,N,D,x;if((N=(R=this._options)===null||R===void 0?void 0:R.onWillRemoveListener)===null||N===void 0||N.call(R,this),!this._listeners)return;if(this._size===1){this._listeners=void 0,(x=(D=this._options)===null||D===void 0?void 0:D.onDidRemoveLastListener)===null||x===void 0||x.call(D,this),this._size=0;return}const T=this._listeners,F=T.indexOf(v);if(F===-1)throw console.log("disposed?",this._disposed),console.log("size?",this._size),console.log("arr?",JSON.stringify(this._listeners)),new Error("Attempted to dispose unknown listener");this._size--,T[F]=void 0;const B=this._deliveryQueue.current===this;if(this._size*m<=T.length){let V=0;for(let k=0;k<T.length;k++)T[k]?T[V++]=T[k]:B&&(this._deliveryQueue.end--,V<this._deliveryQueue.i&&this._deliveryQueue.i--);T.length=V}}_deliver(v,R){var N;if(!v)return;const D=((N=this._options)===null||N===void 0?void 0:N.onListenerError)||M.onUnexpectedError;if(!D){v.value(R);return}try{v.value(R)}catch(x){D(x)}}_deliverQueue(v){const R=v.current._listeners;for(;v.i<v.end;)this._deliver(R[v.i++],v.value);v.reset()}fire(v){var R,N,D,x;if(!((R=this._deliveryQueue)===null||R===void 0)&&R.current&&(this._deliverQueue(this._deliveryQueue),(N=this._perfMon)===null||N===void 0||N.stop()),(D=this._perfMon)===null||D===void 0||D.start(this._size),this._listeners)if(this._listeners instanceof c)this._deliver(this._listeners,v);else{const T=this._deliveryQueue;T.enqueue(this,v,this._listeners.length),this._deliverQueue(T)}(x=this._perfMon)===null||x===void 0||x.stop()}hasListeners(){return this._size>0}}n.Emitter=y;const w=()=>new E;n.createEventDeliveryQueue=w;class E{constructor(){this.i=-1,this.end=0}enqueue(v,R,N){this.i=0,this.end=N,this.current=v,this.value=R}reset(){this.i=this.end,this.current=void 0,this.value=void 0}}class S extends y{constructor(v){super(v),this._isPaused=0,this._eventQueue=new d.LinkedList,this._mergeFn=v?.merge}pause(){this._isPaused++}resume(){if(this._isPaused!==0&&--this._isPaused===0)if(this._mergeFn){if(this._eventQueue.size>0){const v=Array.from(this._eventQueue);this._eventQueue.clear(),super.fire(this._mergeFn(v))}}else for(;!this._isPaused&&this._eventQueue.size!==0;)super.fire(this._eventQueue.shift())}fire(v){this._size&&(this._isPaused!==0?this._eventQueue.push(v):super.fire(v))}}n.PauseableEmitter=S;class C extends S{constructor(v){var R;super(v),this._delay=(R=v.delay)!==null&&R!==void 0?R:100}fire(v){this._handle||(this.pause(),this._handle=setTimeout(()=>{this._handle=void 0,this.resume()},this._delay)),super.fire(v)}}n.DebounceEmitter=C;class r extends y{constructor(v){super(v),this._queuedEvents=[],this._mergeFn=v?.merge}fire(v){this.hasListeners()&&(this._queuedEvents.push(v),this._queuedEvents.length===1&&queueMicrotask(()=>{this._mergeFn?super.fire(this._mergeFn(this._queuedEvents)):this._queuedEvents.forEach(R=>super.fire(R)),this._queuedEvents=[]}))}}n.MicrotaskEmitter=r;class s{constructor(){this.hasListeners=!1,this.events=[],this.emitter=new y({onWillAddFirstListener:()=>this.onFirstListenerAdd(),onDidRemoveLastListener:()=>this.onLastListenerRemove()})}get event(){return this.emitter.event}add(v){const R={event:v,listener:null};this.events.push(R),this.hasListeners&&this.hook(R);const N=()=>{this.hasListeners&&this.unhook(R);const D=this.events.indexOf(R);this.events.splice(D,1)};return(0,i.toDisposable)((0,A.createSingleCallFunction)(N))}onFirstListenerAdd(){this.hasListeners=!0,this.events.forEach(v=>this.hook(v))}onLastListenerRemove(){this.hasListeners=!1,this.events.forEach(v=>this.unhook(v))}hook(v){v.listener=v.event(R=>this.emitter.fire(R))}unhook(v){v.listener&&v.listener.dispose(),v.listener=null}dispose(){this.emitter.dispose()}}n.EventMultiplexer=s;class l{constructor(){this.buffers=[]}wrapEvent(v){return(R,N,D)=>v(x=>{const T=this.buffers[this.buffers.length-1];T?T.push(()=>R.call(N,x)):R.call(N,x)},void 0,D)}bufferEvents(v){const R=[];this.buffers.push(R);const N=v();return this.buffers.pop(),R.forEach(D=>D()),N}}n.EventBufferer=l;class _{constructor(){this.listening=!1,this.inputEvent=o.None,this.inputEventListener=i.Disposable.None,this.emitter=new y({onDidAddFirstListener:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onDidRemoveLastListener:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(v){this.inputEvent=v,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=v(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}n.Relay=_}),Y(X[38],J([0,1,9]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.CancellationTokenSource=n.CancellationToken=void 0;const A=Object.freeze(function(p,h){const o=setTimeout(p.bind(h),0);return{dispose(){clearTimeout(o)}}});var i;(function(p){function h(o){return o===p.None||o===p.Cancelled||o instanceof d?!0:!o||typeof o!="object"?!1:typeof o.isCancellationRequested=="boolean"&&typeof o.onCancellationRequested=="function"}p.isCancellationToken=h,p.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:M.Event.None}),p.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:A})})(i||(n.CancellationToken=i={}));class d{constructor(){this._isCancelled=!1,this._emitter=null}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?A:(this._emitter||(this._emitter=new M.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=null)}}class b{constructor(h){this._token=void 0,this._parentListener=void 0,this._parentListener=h&&h.onCancellationRequested(this.cancel,this)}get token(){return this._token||(this._token=new d),this._token}cancel(){this._token?this._token instanceof d&&this._token.cancel():this._token=i.Cancelled}dispose(h=!1){var o;h&&this.cancel(),(o=this._parentListener)===null||o===void 0||o.dispose(),this._token?this._token instanceof d&&this._token.dispose():this._token=i.None}}n.CancellationTokenSource=b}),Y(X[6],J([0,1,32,36]),function(q,n,M,A){"use strict";var i;Object.defineProperty(n,"__esModule",{value:!0}),n.InvisibleCharacters=n.AmbiguousCharacters=n.noBreakWhitespace=n.getLeftDeleteOffset=n.singleLetterHash=n.containsUppercaseCharacter=n.startsWithUTF8BOM=n.UTF8_BOM_CHARACTER=n.isEmojiImprecise=n.isFullWidthCharacter=n.containsUnusualLineTerminators=n.UNUSUAL_LINE_TERMINATORS=n.isBasicASCII=n.containsRTL=n.getCharContainingOffset=n.prevCharLength=n.nextCharLength=n.GraphemeIterator=n.CodePointIterator=n.getNextCodePoint=n.computeCodePoint=n.isLowSurrogate=n.isHighSurrogate=n.commonSuffixLength=n.commonPrefixLength=n.startsWithIgnoreCase=n.equalsIgnoreCase=n.isUpperAsciiLetter=n.isLowerAsciiLetter=n.isAsciiDigit=n.compareSubstringIgnoreCase=n.compareIgnoreCase=n.compareSubstring=n.compare=n.lastNonWhitespaceIndex=n.getLeadingWhitespace=n.firstNonWhitespaceIndex=n.splitLines=n.regExpLeadsToEndlessLoop=n.createRegExp=n.stripWildcards=n.convertSimple2RegExpPattern=n.rtrim=n.ltrim=n.trim=n.escapeRegExpCharacters=n.escape=n.htmlAttributeEncodeValue=n.format=n.isFalsyOrWhitespace=void 0;function d(P){return!P||typeof P!="string"?!0:P.trim().length===0}n.isFalsyOrWhitespace=d;const b=/{(\d+)}/g;function p(P,...U){return U.length===0?P:P.replace(b,function(H,$){const te=parseInt($,10);return isNaN(te)||te<0||te>=U.length?H:U[te]})}n.format=p;function h(P){return P.replace(/[<>"'&]/g,U=>{switch(U){case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"'":return"&apos;";case"&":return"&amp;"}return U})}n.htmlAttributeEncodeValue=h;function o(P){return P.replace(/[<>&]/g,function(U){switch(U){case"<":return"&lt;";case">":return"&gt;";case"&":return"&amp;";default:return U}})}n.escape=o;function L(P){return P.replace(/[\\\{\}\*\+\?\|\^\$\.\[\]\(\)]/g,"\\$&")}n.escapeRegExpCharacters=L;function e(P,U=" "){const H=a(P,U);return u(H,U)}n.trim=e;function a(P,U){if(!P||!U)return P;const H=U.length;if(H===0||P.length===0)return P;let $=0;for(;P.indexOf(U,$)===$;)$=$+H;return P.substring($)}n.ltrim=a;function u(P,U){if(!P||!U)return P;const H=U.length,$=P.length;if(H===0||$===0)return P;let te=$,re=-1;for(;re=P.lastIndexOf(U,te-1),!(re===-1||re+H!==te);){if(re===0)return"";te=re}return P.substring(0,te)}n.rtrim=u;function c(P){return P.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g,"\\$&").replace(/[\*]/g,".*")}n.convertSimple2RegExpPattern=c;function m(P){return P.replace(/\*/g,"")}n.stripWildcards=m;function f(P,U,H={}){if(!P)throw new Error("Cannot create regex from empty string");U||(P=L(P)),H.wholeWord&&(/\B/.test(P.charAt(0))||(P="\\b"+P),/\B/.test(P.charAt(P.length-1))||(P=P+"\\b"));let $="";return H.global&&($+="g"),H.matchCase||($+="i"),H.multiline&&($+="m"),H.unicode&&($+="u"),new RegExp(P,$)}n.createRegExp=f;function y(P){return P.source==="^"||P.source==="^$"||P.source==="$"||P.source==="^\\s*$"?!1:!!(P.exec("")&&P.lastIndex===0)}n.regExpLeadsToEndlessLoop=y;function w(P){return P.split(/\r\n|\r|\n/)}n.splitLines=w;function E(P){for(let U=0,H=P.length;U<H;U++){const $=P.charCodeAt(U);if($!==32&&$!==9)return U}return-1}n.firstNonWhitespaceIndex=E;function S(P,U=0,H=P.length){for(let $=U;$<H;$++){const te=P.charCodeAt($);if(te!==32&&te!==9)return P.substring(U,$)}return P.substring(U,H)}n.getLeadingWhitespace=S;function C(P,U=P.length-1){for(let H=U;H>=0;H--){const $=P.charCodeAt(H);if($!==32&&$!==9)return H}return-1}n.lastNonWhitespaceIndex=C;function r(P,U){return P<U?-1:P>U?1:0}n.compare=r;function s(P,U,H=0,$=P.length,te=0,re=U.length){for(;H<$&&te<re;H++,te++){const fe=P.charCodeAt(H),oe=U.charCodeAt(te);if(fe<oe)return-1;if(fe>oe)return 1}const ue=$-H,ge=re-te;return ue<ge?-1:ue>ge?1:0}n.compareSubstring=s;function l(P,U){return _(P,U,0,P.length,0,U.length)}n.compareIgnoreCase=l;function _(P,U,H=0,$=P.length,te=0,re=U.length){for(;H<$&&te<re;H++,te++){let fe=P.charCodeAt(H),oe=U.charCodeAt(te);if(fe===oe)continue;if(fe>=128||oe>=128)return s(P.toLowerCase(),U.toLowerCase(),H,$,te,re);v(fe)&&(fe-=32),v(oe)&&(oe-=32);const he=fe-oe;if(he!==0)return he}const ue=$-H,ge=re-te;return ue<ge?-1:ue>ge?1:0}n.compareSubstringIgnoreCase=_;function g(P){return P>=48&&P<=57}n.isAsciiDigit=g;function v(P){return P>=97&&P<=122}n.isLowerAsciiLetter=v;function R(P){return P>=65&&P<=90}n.isUpperAsciiLetter=R;function N(P,U){return P.length===U.length&&_(P,U)===0}n.equalsIgnoreCase=N;function D(P,U){const H=U.length;return U.length>P.length?!1:_(P,U,0,H)===0}n.startsWithIgnoreCase=D;function x(P,U){const H=Math.min(P.length,U.length);let $;for($=0;$<H;$++)if(P.charCodeAt($)!==U.charCodeAt($))return $;return H}n.commonPrefixLength=x;function T(P,U){const H=Math.min(P.length,U.length);let $;const te=P.length-1,re=U.length-1;for($=0;$<H;$++)if(P.charCodeAt(te-$)!==U.charCodeAt(re-$))return $;return H}n.commonSuffixLength=T;function F(P){return 55296<=P&&P<=56319}n.isHighSurrogate=F;function B(P){return 56320<=P&&P<=57343}n.isLowSurrogate=B;function V(P,U){return(P-55296<<10)+(U-56320)+65536}n.computeCodePoint=V;function k(P,U,H){const $=P.charCodeAt(H);if(F($)&&H+1<U){const te=P.charCodeAt(H+1);if(B(te))return V($,te)}return $}n.getNextCodePoint=k;function O(P,U){const H=P.charCodeAt(U-1);if(B(H)&&U>1){const $=P.charCodeAt(U-2);if(F($))return V($,H)}return H}class I{get offset(){return this._offset}constructor(U,H=0){this._str=U,this._len=U.length,this._offset=H}setOffset(U){this._offset=U}prevCodePoint(){const U=O(this._str,this._offset);return this._offset-=U>=65536?2:1,U}nextCodePoint(){const U=k(this._str,this._len,this._offset);return this._offset+=U>=65536?2:1,U}eol(){return this._offset>=this._len}}n.CodePointIterator=I;class W{get offset(){return this._iterator.offset}constructor(U,H=0){this._iterator=new I(U,H)}nextGraphemeLength(){const U=j.getInstance(),H=this._iterator,$=H.offset;let te=U.getGraphemeBreakType(H.nextCodePoint());for(;!H.eol();){const re=H.offset,ue=U.getGraphemeBreakType(H.nextCodePoint());if(K(te,ue)){H.setOffset(re);break}te=ue}return H.offset-$}prevGraphemeLength(){const U=j.getInstance(),H=this._iterator,$=H.offset;let te=U.getGraphemeBreakType(H.prevCodePoint());for(;H.offset>0;){const re=H.offset,ue=U.getGraphemeBreakType(H.prevCodePoint());if(K(ue,te)){H.setOffset(re);break}te=ue}return $-H.offset}eol(){return this._iterator.eol()}}n.GraphemeIterator=W;function z(P,U){return new W(P,U).nextGraphemeLength()}n.nextCharLength=z;function G(P,U){return new W(P,U).prevGraphemeLength()}n.prevCharLength=G;function t(P,U){U>0&&B(P.charCodeAt(U))&&U--;const H=U+z(P,U);return[H-G(P,H),H]}n.getCharContainingOffset=t;let se;function ce(){return/(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA\u07FE-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u088E\u08A0-\u08C9\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDC7\uFDF0-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE35\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDD23\uDE80-\uDEA9\uDEAD-\uDF45\uDF51-\uDF81\uDF86-\uDFF6]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD4B-\uDFFF]|\uD83B[\uDC00-\uDEBB])/}function me(P){return se||(se=ce()),se.test(P)}n.containsRTL=me;const ve=/^[\t\n\r\x20-\x7E]*$/;function pe(P){return ve.test(P)}n.isBasicASCII=pe,n.UNUSUAL_LINE_TERMINATORS=/[\u2028\u2029]/;function Le(P){return n.UNUSUAL_LINE_TERMINATORS.test(P)}n.containsUnusualLineTerminators=Le;function we(P){return P>=11904&&P<=55215||P>=63744&&P<=64255||P>=65281&&P<=65374}n.isFullWidthCharacter=we;function be(P){return P>=127462&&P<=127487||P===8986||P===8987||P===9200||P===9203||P>=9728&&P<=10175||P===11088||P===11093||P>=127744&&P<=128591||P>=128640&&P<=128764||P>=128992&&P<=129008||P>=129280&&P<=129535||P>=129648&&P<=129782}n.isEmojiImprecise=be,n.UTF8_BOM_CHARACTER=String.fromCharCode(65279);function Ce(P){return!!(P&&P.length>0&&P.charCodeAt(0)===65279)}n.startsWithUTF8BOM=Ce;function Se(P,U=!1){return P?(U&&(P=P.replace(/\\./g,"")),P.toLowerCase()!==P):!1}n.containsUppercaseCharacter=Se;function ye(P){return P=P%(2*26),P<26?String.fromCharCode(97+P):String.fromCharCode(65+P-26)}n.singleLetterHash=ye;function K(P,U){return P===0?U!==5&&U!==7:P===2&&U===3?!1:P===4||P===2||P===3||U===4||U===2||U===3?!0:!(P===8&&(U===8||U===9||U===11||U===12)||(P===11||P===9)&&(U===9||U===10)||(P===12||P===10)&&U===10||U===5||U===13||U===7||P===1||P===13&&U===14||P===6&&U===6)}class j{static getInstance(){return j._INSTANCE||(j._INSTANCE=new j),j._INSTANCE}constructor(){this._data=Z()}getGraphemeBreakType(U){if(U<32)return U===10?3:U===13?2:4;if(U<127)return 0;const H=this._data,$=H.length/3;let te=1;for(;te<=$;)if(U<H[3*te])te=2*te;else if(U>H[3*te+1])te=2*te+1;else return H[3*te+2];return 0}}j._INSTANCE=null;function Z(){return JSON.parse("[0,0,0,51229,51255,12,44061,44087,12,127462,127487,6,7083,7085,5,47645,47671,12,54813,54839,12,128678,128678,14,3270,3270,5,9919,9923,14,45853,45879,12,49437,49463,12,53021,53047,12,71216,71218,7,128398,128399,14,129360,129374,14,2519,2519,5,4448,4519,9,9742,9742,14,12336,12336,14,44957,44983,12,46749,46775,12,48541,48567,12,50333,50359,12,52125,52151,12,53917,53943,12,69888,69890,5,73018,73018,5,127990,127990,14,128558,128559,14,128759,128760,14,129653,129655,14,2027,2035,5,2891,2892,7,3761,3761,5,6683,6683,5,8293,8293,4,9825,9826,14,9999,9999,14,43452,43453,5,44509,44535,12,45405,45431,12,46301,46327,12,47197,47223,12,48093,48119,12,48989,49015,12,49885,49911,12,50781,50807,12,51677,51703,12,52573,52599,12,53469,53495,12,54365,54391,12,65279,65279,4,70471,70472,7,72145,72147,7,119173,119179,5,127799,127818,14,128240,128244,14,128512,128512,14,128652,128652,14,128721,128722,14,129292,129292,14,129445,129450,14,129734,129743,14,1476,1477,5,2366,2368,7,2750,2752,7,3076,3076,5,3415,3415,5,4141,4144,5,6109,6109,5,6964,6964,5,7394,7400,5,9197,9198,14,9770,9770,14,9877,9877,14,9968,9969,14,10084,10084,14,43052,43052,5,43713,43713,5,44285,44311,12,44733,44759,12,45181,45207,12,45629,45655,12,46077,46103,12,46525,46551,12,46973,46999,12,47421,47447,12,47869,47895,12,48317,48343,12,48765,48791,12,49213,49239,12,49661,49687,12,50109,50135,12,50557,50583,12,51005,51031,12,51453,51479,12,51901,51927,12,52349,52375,12,52797,52823,12,53245,53271,12,53693,53719,12,54141,54167,12,54589,54615,12,55037,55063,12,69506,69509,5,70191,70193,5,70841,70841,7,71463,71467,5,72330,72342,5,94031,94031,5,123628,123631,5,127763,127765,14,127941,127941,14,128043,128062,14,128302,128317,14,128465,128467,14,128539,128539,14,128640,128640,14,128662,128662,14,128703,128703,14,128745,128745,14,129004,129007,14,129329,129330,14,129402,129402,14,129483,129483,14,129686,129704,14,130048,131069,14,173,173,4,1757,1757,1,2200,2207,5,2434,2435,7,2631,2632,5,2817,2817,5,3008,3008,5,3201,3201,5,3387,3388,5,3542,3542,5,3902,3903,7,4190,4192,5,6002,6003,5,6439,6440,5,6765,6770,7,7019,7027,5,7154,7155,7,8205,8205,13,8505,8505,14,9654,9654,14,9757,9757,14,9792,9792,14,9852,9853,14,9890,9894,14,9937,9937,14,9981,9981,14,10035,10036,14,11035,11036,14,42654,42655,5,43346,43347,7,43587,43587,5,44006,44007,7,44173,44199,12,44397,44423,12,44621,44647,12,44845,44871,12,45069,45095,12,45293,45319,12,45517,45543,12,45741,45767,12,45965,45991,12,46189,46215,12,46413,46439,12,46637,46663,12,46861,46887,12,47085,47111,12,47309,47335,12,47533,47559,12,47757,47783,12,47981,48007,12,48205,48231,12,48429,48455,12,48653,48679,12,48877,48903,12,49101,49127,12,49325,49351,12,49549,49575,12,49773,49799,12,49997,50023,12,50221,50247,12,50445,50471,12,50669,50695,12,50893,50919,12,51117,51143,12,51341,51367,12,51565,51591,12,51789,51815,12,52013,52039,12,52237,52263,12,52461,52487,12,52685,52711,12,52909,52935,12,53133,53159,12,53357,53383,12,53581,53607,12,53805,53831,12,54029,54055,12,54253,54279,12,54477,54503,12,54701,54727,12,54925,54951,12,55149,55175,12,68101,68102,5,69762,69762,7,70067,70069,7,70371,70378,5,70720,70721,7,71087,71087,5,71341,71341,5,71995,71996,5,72249,72249,7,72850,72871,5,73109,73109,5,118576,118598,5,121505,121519,5,127245,127247,14,127568,127569,14,127777,127777,14,127872,127891,14,127956,127967,14,128015,128016,14,128110,128172,14,128259,128259,14,128367,128368,14,128424,128424,14,128488,128488,14,128530,128532,14,128550,128551,14,128566,128566,14,128647,128647,14,128656,128656,14,128667,128673,14,128691,128693,14,128715,128715,14,128728,128732,14,128752,128752,14,128765,128767,14,129096,129103,14,129311,129311,14,129344,129349,14,129394,129394,14,129413,129425,14,129466,129471,14,129511,129535,14,129664,129666,14,129719,129722,14,129760,129767,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2307,2307,7,2382,2383,7,2497,2500,5,2563,2563,7,2677,2677,5,2763,2764,7,2879,2879,5,2914,2915,5,3021,3021,5,3142,3144,5,3263,3263,5,3285,3286,5,3398,3400,7,3530,3530,5,3633,3633,5,3864,3865,5,3974,3975,5,4155,4156,7,4229,4230,5,5909,5909,7,6078,6085,7,6277,6278,5,6451,6456,7,6744,6750,5,6846,6846,5,6972,6972,5,7074,7077,5,7146,7148,7,7222,7223,5,7416,7417,5,8234,8238,4,8417,8417,5,9000,9000,14,9203,9203,14,9730,9731,14,9748,9749,14,9762,9763,14,9776,9783,14,9800,9811,14,9831,9831,14,9872,9873,14,9882,9882,14,9900,9903,14,9929,9933,14,9941,9960,14,9974,9974,14,9989,9989,14,10006,10006,14,10062,10062,14,10160,10160,14,11647,11647,5,12953,12953,14,43019,43019,5,43232,43249,5,43443,43443,5,43567,43568,7,43696,43696,5,43765,43765,7,44013,44013,5,44117,44143,12,44229,44255,12,44341,44367,12,44453,44479,12,44565,44591,12,44677,44703,12,44789,44815,12,44901,44927,12,45013,45039,12,45125,45151,12,45237,45263,12,45349,45375,12,45461,45487,12,45573,45599,12,45685,45711,12,45797,45823,12,45909,45935,12,46021,46047,12,46133,46159,12,46245,46271,12,46357,46383,12,46469,46495,12,46581,46607,12,46693,46719,12,46805,46831,12,46917,46943,12,47029,47055,12,47141,47167,12,47253,47279,12,47365,47391,12,47477,47503,12,47589,47615,12,47701,47727,12,47813,47839,12,47925,47951,12,48037,48063,12,48149,48175,12,48261,48287,12,48373,48399,12,48485,48511,12,48597,48623,12,48709,48735,12,48821,48847,12,48933,48959,12,49045,49071,12,49157,49183,12,49269,49295,12,49381,49407,12,49493,49519,12,49605,49631,12,49717,49743,12,49829,49855,12,49941,49967,12,50053,50079,12,50165,50191,12,50277,50303,12,50389,50415,12,50501,50527,12,50613,50639,12,50725,50751,12,50837,50863,12,50949,50975,12,51061,51087,12,51173,51199,12,51285,51311,12,51397,51423,12,51509,51535,12,51621,51647,12,51733,51759,12,51845,51871,12,51957,51983,12,52069,52095,12,52181,52207,12,52293,52319,12,52405,52431,12,52517,52543,12,52629,52655,12,52741,52767,12,52853,52879,12,52965,52991,12,53077,53103,12,53189,53215,12,53301,53327,12,53413,53439,12,53525,53551,12,53637,53663,12,53749,53775,12,53861,53887,12,53973,53999,12,54085,54111,12,54197,54223,12,54309,54335,12,54421,54447,12,54533,54559,12,54645,54671,12,54757,54783,12,54869,54895,12,54981,55007,12,55093,55119,12,55243,55291,10,66045,66045,5,68325,68326,5,69688,69702,5,69817,69818,5,69957,69958,7,70089,70092,5,70198,70199,5,70462,70462,5,70502,70508,5,70750,70750,5,70846,70846,7,71100,71101,5,71230,71230,7,71351,71351,5,71737,71738,5,72000,72000,7,72160,72160,5,72273,72278,5,72752,72758,5,72882,72883,5,73031,73031,5,73461,73462,7,94192,94193,7,119149,119149,7,121403,121452,5,122915,122916,5,126980,126980,14,127358,127359,14,127535,127535,14,127759,127759,14,127771,127771,14,127792,127793,14,127825,127867,14,127897,127899,14,127945,127945,14,127985,127986,14,128000,128007,14,128021,128021,14,128066,128100,14,128184,128235,14,128249,128252,14,128266,128276,14,128335,128335,14,128379,128390,14,128407,128419,14,128444,128444,14,128481,128481,14,128499,128499,14,128526,128526,14,128536,128536,14,128543,128543,14,128556,128556,14,128564,128564,14,128577,128580,14,128643,128645,14,128649,128649,14,128654,128654,14,128660,128660,14,128664,128664,14,128675,128675,14,128686,128689,14,128695,128696,14,128705,128709,14,128717,128719,14,128725,128725,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129009,129023,14,129160,129167,14,129296,129304,14,129320,129327,14,129340,129342,14,129356,129356,14,129388,129392,14,129399,129400,14,129404,129407,14,129432,129442,14,129454,129455,14,129473,129474,14,129485,129487,14,129648,129651,14,129659,129660,14,129671,129679,14,129709,129711,14,129728,129730,14,129751,129753,14,129776,129782,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2274,2274,1,2363,2363,7,2377,2380,7,2402,2403,5,2494,2494,5,2507,2508,7,2558,2558,5,2622,2624,7,2641,2641,5,2691,2691,7,2759,2760,5,2786,2787,5,2876,2876,5,2881,2884,5,2901,2902,5,3006,3006,5,3014,3016,7,3072,3072,5,3134,3136,5,3157,3158,5,3260,3260,5,3266,3266,5,3274,3275,7,3328,3329,5,3391,3392,7,3405,3405,5,3457,3457,5,3536,3537,7,3551,3551,5,3636,3642,5,3764,3772,5,3895,3895,5,3967,3967,7,3993,4028,5,4146,4151,5,4182,4183,7,4226,4226,5,4253,4253,5,4957,4959,5,5940,5940,7,6070,6070,7,6087,6088,7,6158,6158,4,6432,6434,5,6448,6449,7,6679,6680,5,6742,6742,5,6754,6754,5,6783,6783,5,6912,6915,5,6966,6970,5,6978,6978,5,7042,7042,7,7080,7081,5,7143,7143,7,7150,7150,7,7212,7219,5,7380,7392,5,7412,7412,5,8203,8203,4,8232,8232,4,8265,8265,14,8400,8412,5,8421,8432,5,8617,8618,14,9167,9167,14,9200,9200,14,9410,9410,14,9723,9726,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9774,14,9786,9786,14,9794,9794,14,9823,9823,14,9828,9828,14,9833,9850,14,9855,9855,14,9875,9875,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9935,9935,14,9939,9939,14,9962,9962,14,9972,9972,14,9978,9978,14,9986,9986,14,9997,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10133,10135,14,10548,10549,14,11093,11093,14,12330,12333,5,12441,12442,5,42608,42610,5,43010,43010,5,43045,43046,5,43188,43203,7,43302,43309,5,43392,43394,5,43446,43449,5,43493,43493,5,43571,43572,7,43597,43597,7,43703,43704,5,43756,43757,5,44003,44004,7,44009,44010,7,44033,44059,12,44089,44115,12,44145,44171,12,44201,44227,12,44257,44283,12,44313,44339,12,44369,44395,12,44425,44451,12,44481,44507,12,44537,44563,12,44593,44619,12,44649,44675,12,44705,44731,12,44761,44787,12,44817,44843,12,44873,44899,12,44929,44955,12,44985,45011,12,45041,45067,12,45097,45123,12,45153,45179,12,45209,45235,12,45265,45291,12,45321,45347,12,45377,45403,12,45433,45459,12,45489,45515,12,45545,45571,12,45601,45627,12,45657,45683,12,45713,45739,12,45769,45795,12,45825,45851,12,45881,45907,12,45937,45963,12,45993,46019,12,46049,46075,12,46105,46131,12,46161,46187,12,46217,46243,12,46273,46299,12,46329,46355,12,46385,46411,12,46441,46467,12,46497,46523,12,46553,46579,12,46609,46635,12,46665,46691,12,46721,46747,12,46777,46803,12,46833,46859,12,46889,46915,12,46945,46971,12,47001,47027,12,47057,47083,12,47113,47139,12,47169,47195,12,47225,47251,12,47281,47307,12,47337,47363,12,47393,47419,12,47449,47475,12,47505,47531,12,47561,47587,12,47617,47643,12,47673,47699,12,47729,47755,12,47785,47811,12,47841,47867,12,47897,47923,12,47953,47979,12,48009,48035,12,48065,48091,12,48121,48147,12,48177,48203,12,48233,48259,12,48289,48315,12,48345,48371,12,48401,48427,12,48457,48483,12,48513,48539,12,48569,48595,12,48625,48651,12,48681,48707,12,48737,48763,12,48793,48819,12,48849,48875,12,48905,48931,12,48961,48987,12,49017,49043,12,49073,49099,12,49129,49155,12,49185,49211,12,49241,49267,12,49297,49323,12,49353,49379,12,49409,49435,12,49465,49491,12,49521,49547,12,49577,49603,12,49633,49659,12,49689,49715,12,49745,49771,12,49801,49827,12,49857,49883,12,49913,49939,12,49969,49995,12,50025,50051,12,50081,50107,12,50137,50163,12,50193,50219,12,50249,50275,12,50305,50331,12,50361,50387,12,50417,50443,12,50473,50499,12,50529,50555,12,50585,50611,12,50641,50667,12,50697,50723,12,50753,50779,12,50809,50835,12,50865,50891,12,50921,50947,12,50977,51003,12,51033,51059,12,51089,51115,12,51145,51171,12,51201,51227,12,51257,51283,12,51313,51339,12,51369,51395,12,51425,51451,12,51481,51507,12,51537,51563,12,51593,51619,12,51649,51675,12,51705,51731,12,51761,51787,12,51817,51843,12,51873,51899,12,51929,51955,12,51985,52011,12,52041,52067,12,52097,52123,12,52153,52179,12,52209,52235,12,52265,52291,12,52321,52347,12,52377,52403,12,52433,52459,12,52489,52515,12,52545,52571,12,52601,52627,12,52657,52683,12,52713,52739,12,52769,52795,12,52825,52851,12,52881,52907,12,52937,52963,12,52993,53019,12,53049,53075,12,53105,53131,12,53161,53187,12,53217,53243,12,53273,53299,12,53329,53355,12,53385,53411,12,53441,53467,12,53497,53523,12,53553,53579,12,53609,53635,12,53665,53691,12,53721,53747,12,53777,53803,12,53833,53859,12,53889,53915,12,53945,53971,12,54001,54027,12,54057,54083,12,54113,54139,12,54169,54195,12,54225,54251,12,54281,54307,12,54337,54363,12,54393,54419,12,54449,54475,12,54505,54531,12,54561,54587,12,54617,54643,12,54673,54699,12,54729,54755,12,54785,54811,12,54841,54867,12,54897,54923,12,54953,54979,12,55009,55035,12,55065,55091,12,55121,55147,12,55177,55203,12,65024,65039,5,65520,65528,4,66422,66426,5,68152,68154,5,69291,69292,5,69633,69633,5,69747,69748,5,69811,69814,5,69826,69826,5,69932,69932,7,70016,70017,5,70079,70080,7,70095,70095,5,70196,70196,5,70367,70367,5,70402,70403,7,70464,70464,5,70487,70487,5,70709,70711,7,70725,70725,7,70833,70834,7,70843,70844,7,70849,70849,7,71090,71093,5,71103,71104,5,71227,71228,7,71339,71339,5,71344,71349,5,71458,71461,5,71727,71735,5,71985,71989,7,71998,71998,5,72002,72002,7,72154,72155,5,72193,72202,5,72251,72254,5,72281,72283,5,72344,72345,5,72766,72766,7,72874,72880,5,72885,72886,5,73023,73029,5,73104,73105,5,73111,73111,5,92912,92916,5,94095,94098,5,113824,113827,4,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,125252,125258,5,127183,127183,14,127340,127343,14,127377,127386,14,127491,127503,14,127548,127551,14,127744,127756,14,127761,127761,14,127769,127769,14,127773,127774,14,127780,127788,14,127796,127797,14,127820,127823,14,127869,127869,14,127894,127895,14,127902,127903,14,127943,127943,14,127947,127950,14,127972,127972,14,127988,127988,14,127992,127994,14,128009,128011,14,128019,128019,14,128023,128041,14,128064,128064,14,128102,128107,14,128174,128181,14,128238,128238,14,128246,128247,14,128254,128254,14,128264,128264,14,128278,128299,14,128329,128330,14,128348,128359,14,128371,128377,14,128392,128393,14,128401,128404,14,128421,128421,14,128433,128434,14,128450,128452,14,128476,128478,14,128483,128483,14,128495,128495,14,128506,128506,14,128519,128520,14,128528,128528,14,128534,128534,14,128538,128538,14,128540,128542,14,128544,128549,14,128552,128555,14,128557,128557,14,128560,128563,14,128565,128565,14,128567,128576,14,128581,128591,14,128641,128642,14,128646,128646,14,128648,128648,14,128650,128651,14,128653,128653,14,128655,128655,14,128657,128659,14,128661,128661,14,128663,128663,14,128665,128666,14,128674,128674,14,128676,128677,14,128679,128685,14,128690,128690,14,128694,128694,14,128697,128702,14,128704,128704,14,128710,128714,14,128716,128716,14,128720,128720,14,128723,128724,14,128726,128727,14,128733,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129008,129008,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129661,129663,14,129667,129670,14,129680,129685,14,129705,129708,14,129712,129718,14,129723,129727,14,129731,129733,14,129744,129750,14,129754,129759,14,129768,129775,14,129783,129791,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2192,2193,1,2250,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3132,3132,5,3137,3140,7,3146,3149,5,3170,3171,5,3202,3203,7,3262,3262,7,3264,3265,7,3267,3268,7,3271,3272,7,3276,3277,5,3298,3299,5,3330,3331,7,3390,3390,5,3393,3396,5,3402,3404,7,3406,3406,1,3426,3427,5,3458,3459,7,3535,3535,5,3538,3540,5,3544,3550,7,3570,3571,7,3635,3635,7,3655,3662,5,3763,3763,7,3784,3789,5,3893,3893,5,3897,3897,5,3953,3966,5,3968,3972,5,3981,3991,5,4038,4038,5,4145,4145,7,4153,4154,5,4157,4158,5,4184,4185,5,4209,4212,5,4228,4228,7,4237,4237,5,4352,4447,8,4520,4607,10,5906,5908,5,5938,5939,5,5970,5971,5,6068,6069,5,6071,6077,5,6086,6086,5,6089,6099,5,6155,6157,5,6159,6159,5,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6862,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7679,5,8204,8204,5,8206,8207,4,8233,8233,4,8252,8252,14,8288,8292,4,8294,8303,4,8413,8416,5,8418,8420,5,8482,8482,14,8596,8601,14,8986,8987,14,9096,9096,14,9193,9196,14,9199,9199,14,9201,9202,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9729,14,9732,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9775,9775,14,9784,9785,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9874,14,9876,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9934,14,9936,9936,14,9938,9938,14,9940,9940,14,9961,9961,14,9963,9967,14,9970,9971,14,9973,9973,14,9975,9977,14,9979,9980,14,9982,9985,14,9987,9988,14,9992,9996,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10083,14,10085,10087,14,10145,10145,14,10175,10175,14,11013,11015,14,11088,11088,14,11503,11505,5,11744,11775,5,12334,12335,5,12349,12349,14,12951,12951,14,42607,42607,5,42612,42621,5,42736,42737,5,43014,43014,5,43043,43044,7,43047,43047,7,43136,43137,7,43204,43205,5,43263,43263,5,43335,43345,5,43360,43388,8,43395,43395,7,43444,43445,7,43450,43451,7,43454,43456,7,43561,43566,5,43569,43570,5,43573,43574,5,43596,43596,5,43644,43644,5,43698,43700,5,43710,43711,5,43755,43755,7,43758,43759,7,43766,43766,5,44005,44005,5,44008,44008,5,44012,44012,7,44032,44032,11,44060,44060,11,44088,44088,11,44116,44116,11,44144,44144,11,44172,44172,11,44200,44200,11,44228,44228,11,44256,44256,11,44284,44284,11,44312,44312,11,44340,44340,11,44368,44368,11,44396,44396,11,44424,44424,11,44452,44452,11,44480,44480,11,44508,44508,11,44536,44536,11,44564,44564,11,44592,44592,11,44620,44620,11,44648,44648,11,44676,44676,11,44704,44704,11,44732,44732,11,44760,44760,11,44788,44788,11,44816,44816,11,44844,44844,11,44872,44872,11,44900,44900,11,44928,44928,11,44956,44956,11,44984,44984,11,45012,45012,11,45040,45040,11,45068,45068,11,45096,45096,11,45124,45124,11,45152,45152,11,45180,45180,11,45208,45208,11,45236,45236,11,45264,45264,11,45292,45292,11,45320,45320,11,45348,45348,11,45376,45376,11,45404,45404,11,45432,45432,11,45460,45460,11,45488,45488,11,45516,45516,11,45544,45544,11,45572,45572,11,45600,45600,11,45628,45628,11,45656,45656,11,45684,45684,11,45712,45712,11,45740,45740,11,45768,45768,11,45796,45796,11,45824,45824,11,45852,45852,11,45880,45880,11,45908,45908,11,45936,45936,11,45964,45964,11,45992,45992,11,46020,46020,11,46048,46048,11,46076,46076,11,46104,46104,11,46132,46132,11,46160,46160,11,46188,46188,11,46216,46216,11,46244,46244,11,46272,46272,11,46300,46300,11,46328,46328,11,46356,46356,11,46384,46384,11,46412,46412,11,46440,46440,11,46468,46468,11,46496,46496,11,46524,46524,11,46552,46552,11,46580,46580,11,46608,46608,11,46636,46636,11,46664,46664,11,46692,46692,11,46720,46720,11,46748,46748,11,46776,46776,11,46804,46804,11,46832,46832,11,46860,46860,11,46888,46888,11,46916,46916,11,46944,46944,11,46972,46972,11,47000,47000,11,47028,47028,11,47056,47056,11,47084,47084,11,47112,47112,11,47140,47140,11,47168,47168,11,47196,47196,11,47224,47224,11,47252,47252,11,47280,47280,11,47308,47308,11,47336,47336,11,47364,47364,11,47392,47392,11,47420,47420,11,47448,47448,11,47476,47476,11,47504,47504,11,47532,47532,11,47560,47560,11,47588,47588,11,47616,47616,11,47644,47644,11,47672,47672,11,47700,47700,11,47728,47728,11,47756,47756,11,47784,47784,11,47812,47812,11,47840,47840,11,47868,47868,11,47896,47896,11,47924,47924,11,47952,47952,11,47980,47980,11,48008,48008,11,48036,48036,11,48064,48064,11,48092,48092,11,48120,48120,11,48148,48148,11,48176,48176,11,48204,48204,11,48232,48232,11,48260,48260,11,48288,48288,11,48316,48316,11,48344,48344,11,48372,48372,11,48400,48400,11,48428,48428,11,48456,48456,11,48484,48484,11,48512,48512,11,48540,48540,11,48568,48568,11,48596,48596,11,48624,48624,11,48652,48652,11,48680,48680,11,48708,48708,11,48736,48736,11,48764,48764,11,48792,48792,11,48820,48820,11,48848,48848,11,48876,48876,11,48904,48904,11,48932,48932,11,48960,48960,11,48988,48988,11,49016,49016,11,49044,49044,11,49072,49072,11,49100,49100,11,49128,49128,11,49156,49156,11,49184,49184,11,49212,49212,11,49240,49240,11,49268,49268,11,49296,49296,11,49324,49324,11,49352,49352,11,49380,49380,11,49408,49408,11,49436,49436,11,49464,49464,11,49492,49492,11,49520,49520,11,49548,49548,11,49576,49576,11,49604,49604,11,49632,49632,11,49660,49660,11,49688,49688,11,49716,49716,11,49744,49744,11,49772,49772,11,49800,49800,11,49828,49828,11,49856,49856,11,49884,49884,11,49912,49912,11,49940,49940,11,49968,49968,11,49996,49996,11,50024,50024,11,50052,50052,11,50080,50080,11,50108,50108,11,50136,50136,11,50164,50164,11,50192,50192,11,50220,50220,11,50248,50248,11,50276,50276,11,50304,50304,11,50332,50332,11,50360,50360,11,50388,50388,11,50416,50416,11,50444,50444,11,50472,50472,11,50500,50500,11,50528,50528,11,50556,50556,11,50584,50584,11,50612,50612,11,50640,50640,11,50668,50668,11,50696,50696,11,50724,50724,11,50752,50752,11,50780,50780,11,50808,50808,11,50836,50836,11,50864,50864,11,50892,50892,11,50920,50920,11,50948,50948,11,50976,50976,11,51004,51004,11,51032,51032,11,51060,51060,11,51088,51088,11,51116,51116,11,51144,51144,11,51172,51172,11,51200,51200,11,51228,51228,11,51256,51256,11,51284,51284,11,51312,51312,11,51340,51340,11,51368,51368,11,51396,51396,11,51424,51424,11,51452,51452,11,51480,51480,11,51508,51508,11,51536,51536,11,51564,51564,11,51592,51592,11,51620,51620,11,51648,51648,11,51676,51676,11,51704,51704,11,51732,51732,11,51760,51760,11,51788,51788,11,51816,51816,11,51844,51844,11,51872,51872,11,51900,51900,11,51928,51928,11,51956,51956,11,51984,51984,11,52012,52012,11,52040,52040,11,52068,52068,11,52096,52096,11,52124,52124,11,52152,52152,11,52180,52180,11,52208,52208,11,52236,52236,11,52264,52264,11,52292,52292,11,52320,52320,11,52348,52348,11,52376,52376,11,52404,52404,11,52432,52432,11,52460,52460,11,52488,52488,11,52516,52516,11,52544,52544,11,52572,52572,11,52600,52600,11,52628,52628,11,52656,52656,11,52684,52684,11,52712,52712,11,52740,52740,11,52768,52768,11,52796,52796,11,52824,52824,11,52852,52852,11,52880,52880,11,52908,52908,11,52936,52936,11,52964,52964,11,52992,52992,11,53020,53020,11,53048,53048,11,53076,53076,11,53104,53104,11,53132,53132,11,53160,53160,11,53188,53188,11,53216,53216,11,53244,53244,11,53272,53272,11,53300,53300,11,53328,53328,11,53356,53356,11,53384,53384,11,53412,53412,11,53440,53440,11,53468,53468,11,53496,53496,11,53524,53524,11,53552,53552,11,53580,53580,11,53608,53608,11,53636,53636,11,53664,53664,11,53692,53692,11,53720,53720,11,53748,53748,11,53776,53776,11,53804,53804,11,53832,53832,11,53860,53860,11,53888,53888,11,53916,53916,11,53944,53944,11,53972,53972,11,54000,54000,11,54028,54028,11,54056,54056,11,54084,54084,11,54112,54112,11,54140,54140,11,54168,54168,11,54196,54196,11,54224,54224,11,54252,54252,11,54280,54280,11,54308,54308,11,54336,54336,11,54364,54364,11,54392,54392,11,54420,54420,11,54448,54448,11,54476,54476,11,54504,54504,11,54532,54532,11,54560,54560,11,54588,54588,11,54616,54616,11,54644,54644,11,54672,54672,11,54700,54700,11,54728,54728,11,54756,54756,11,54784,54784,11,54812,54812,11,54840,54840,11,54868,54868,11,54896,54896,11,54924,54924,11,54952,54952,11,54980,54980,11,55008,55008,11,55036,55036,11,55064,55064,11,55092,55092,11,55120,55120,11,55148,55148,11,55176,55176,11,55216,55238,9,64286,64286,5,65056,65071,5,65438,65439,5,65529,65531,4,66272,66272,5,68097,68099,5,68108,68111,5,68159,68159,5,68900,68903,5,69446,69456,5,69632,69632,7,69634,69634,7,69744,69744,5,69759,69761,5,69808,69810,7,69815,69816,7,69821,69821,1,69837,69837,1,69927,69931,5,69933,69940,5,70003,70003,5,70018,70018,7,70070,70078,5,70082,70083,1,70094,70094,7,70188,70190,7,70194,70195,7,70197,70197,7,70206,70206,5,70368,70370,7,70400,70401,5,70459,70460,5,70463,70463,7,70465,70468,7,70475,70477,7,70498,70499,7,70512,70516,5,70712,70719,5,70722,70724,5,70726,70726,5,70832,70832,5,70835,70840,5,70842,70842,5,70845,70845,5,70847,70848,5,70850,70851,5,71088,71089,7,71096,71099,7,71102,71102,7,71132,71133,5,71219,71226,5,71229,71229,5,71231,71232,5,71340,71340,7,71342,71343,7,71350,71350,7,71453,71455,5,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,118528,118573,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123566,123566,5,125136,125142,5,126976,126979,14,126981,127182,14,127184,127231,14,127279,127279,14,127344,127345,14,127374,127374,14,127405,127461,14,127489,127490,14,127514,127514,14,127538,127546,14,127561,127567,14,127570,127743,14,127757,127758,14,127760,127760,14,127762,127762,14,127766,127768,14,127770,127770,14,127772,127772,14,127775,127776,14,127778,127779,14,127789,127791,14,127794,127795,14,127798,127798,14,127819,127819,14,127824,127824,14,127868,127868,14,127870,127871,14,127892,127893,14,127896,127896,14,127900,127901,14,127904,127940,14,127942,127942,14,127944,127944,14,127946,127946,14,127951,127955,14,127968,127971,14,127973,127984,14,127987,127987,14,127989,127989,14,127991,127991,14,127995,127999,5,128008,128008,14,128012,128014,14,128017,128018,14,128020,128020,14,128022,128022,14,128042,128042,14,128063,128063,14,128065,128065,14,128101,128101,14,128108,128109,14,128173,128173,14,128182,128183,14,128236,128237,14,128239,128239,14,128245,128245,14,128248,128248,14,128253,128253,14,128255,128258,14,128260,128263,14,128265,128265,14,128277,128277,14,128300,128301,14,128326,128328,14,128331,128334,14,128336,128347,14,128360,128366,14,128369,128370,14,128378,128378,14,128391,128391,14,128394,128397,14,128400,128400,14,128405,128406,14,128420,128420,14,128422,128423,14,128425,128432,14,128435,128443,14,128445,128449,14,128453,128464,14,128468,128475,14,128479,128480,14,128482,128482,14,128484,128487,14,128489,128494,14,128496,128498,14,128500,128505,14,128507,128511,14,128513,128518,14,128521,128525,14,128527,128527,14,128529,128529,14,128533,128533,14,128535,128535,14,128537,128537,14]")}function Q(P,U){if(P===0)return 0;const H=ee(P,U);if(H!==void 0)return H;const $=new I(U,P);return $.prevCodePoint(),$.offset}n.getLeftDeleteOffset=Q;function ee(P,U){const H=new I(U,P);let $=H.prevCodePoint();for(;ne($)||$===65039||$===8419;){if(H.offset===0)return;$=H.prevCodePoint()}if(!be($))return;let te=H.offset;return te>0&&H.prevCodePoint()===8205&&(te=H.offset),te}function ne(P){return 127995<=P&&P<=127999}n.noBreakWhitespace="\xA0";class ie{static getInstance(U){return i.cache.get(Array.from(U))}static getLocales(){return i._locales.value}constructor(U){this.confusableDictionary=U}isAmbiguous(U){return this.confusableDictionary.has(U)}getPrimaryConfusable(U){return this.confusableDictionary.get(U)}getConfusableCodePoints(){return new Set(this.confusableDictionary.keys())}}n.AmbiguousCharacters=ie,i=ie,ie.ambiguousCharacterData=new A.Lazy(()=>JSON.parse('{"_common":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,8218,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,8242,96,1370,96,1523,96,8175,96,65344,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71922,67,71913,67,65315,67,8557,67,8450,67,8493,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71919,87,71910,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,66293,90,71909,90,65338,90,8484,90,8488,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65297,49,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125,119846,109],"_default":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"cs":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"de":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"es":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"fr":[65374,126,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"it":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ja":[8211,45,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65292,44,65307,59],"ko":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pl":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pt-BR":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"qps-ploc":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ru":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"tr":[160,32,8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"zh-hans":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41],"zh-hant":[8211,45,65374,126,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65307,59]}')),ie.cache=new M.LRUCachedFunction(P=>{function U(oe){const he=new Map;for(let de=0;de<oe.length;de+=2)he.set(oe[de],oe[de+1]);return he}function H(oe,he){const de=new Map(oe);for(const[_e,Ee]of he)de.set(_e,Ee);return de}function $(oe,he){if(!oe)return he;const de=new Map;for(const[_e,Ee]of oe)he.has(_e)&&de.set(_e,Ee);return de}const te=i.ambiguousCharacterData.value;let re=P.filter(oe=>!oe.startsWith("_")&&oe in te);re.length===0&&(re=["_default"]);let ue;for(const oe of re){const he=U(te[oe]);ue=$(ue,he)}const ge=U(te._common),fe=H(ge,ue);return new i(fe)}),ie._locales=new A.Lazy(()=>Object.keys(i.ambiguousCharacterData.value).filter(P=>!P.startsWith("_")));class ae{static getRawData(){return JSON.parse("[9,10,11,12,13,32,127,160,173,847,1564,4447,4448,6068,6069,6155,6156,6157,6158,7355,7356,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8234,8235,8236,8237,8238,8239,8287,8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,10240,12288,12644,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65279,65440,65520,65521,65522,65523,65524,65525,65526,65527,65528,65532,78844,119155,119156,119157,119158,119159,119160,119161,119162,917504,917505,917506,917507,917508,917509,917510,917511,917512,917513,917514,917515,917516,917517,917518,917519,917520,917521,917522,917523,917524,917525,917526,917527,917528,917529,917530,917531,917532,917533,917534,917535,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999]")}static getData(){return this._data||(this._data=new Set(ae.getRawData())),this._data}static isInvisibleCharacter(U){return ae.getData().has(U)}static get codePoints(){return ae.getData()}}n.InvisibleCharacters=ae,ae._data=void 0}),Y(X[39],J([0,1,6]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.StringSHA1=n.toHexString=n.stringHash=n.numberHash=n.doHash=n.hash=void 0;function A(m){return i(m,0)}n.hash=A;function i(m,f){switch(typeof m){case"object":return m===null?d(349,f):Array.isArray(m)?h(m,f):o(m,f);case"string":return p(m,f);case"boolean":return b(m,f);case"number":return d(m,f);case"undefined":return d(937,f);default:return d(617,f)}}n.doHash=i;function d(m,f){return(f<<5)-f+m|0}n.numberHash=d;function b(m,f){return d(m?433:863,f)}function p(m,f){f=d(149417,f);for(let y=0,w=m.length;y<w;y++)f=d(m.charCodeAt(y),f);return f}n.stringHash=p;function h(m,f){return f=d(104579,f),m.reduce((y,w)=>i(w,y),f)}function o(m,f){return f=d(181387,f),Object.keys(m).sort().reduce((y,w)=>(y=p(w,y),i(m[w],y)),f)}function L(m,f,y=32){const w=y-f,E=~((1<<w)-1);return(m<<f|(E&m)>>>w)>>>0}function e(m,f=0,y=m.byteLength,w=0){for(let E=0;E<y;E++)m[f+E]=w}function a(m,f,y="0"){for(;m.length<f;)m=y+m;return m}function u(m,f=32){return m instanceof ArrayBuffer?Array.from(new Uint8Array(m)).map(y=>y.toString(16).padStart(2,"0")).join(""):a((m>>>0).toString(16),f/4)}n.toHexString=u;class c{constructor(){this._h0=1732584193,this._h1=4023233417,this._h2=2562383102,this._h3=271733878,this._h4=3285377520,this._buff=new Uint8Array(64+3),this._buffDV=new DataView(this._buff.buffer),this._buffLen=0,this._totalLen=0,this._leftoverHighSurrogate=0,this._finished=!1}update(f){const y=f.length;if(y===0)return;const w=this._buff;let E=this._buffLen,S=this._leftoverHighSurrogate,C,r;for(S!==0?(C=S,r=-1,S=0):(C=f.charCodeAt(0),r=0);;){let s=C;if(M.isHighSurrogate(C))if(r+1<y){const l=f.charCodeAt(r+1);M.isLowSurrogate(l)?(r++,s=M.computeCodePoint(C,l)):s=65533}else{S=C;break}else M.isLowSurrogate(C)&&(s=65533);if(E=this._push(w,E,s),r++,r<y)C=f.charCodeAt(r);else break}this._buffLen=E,this._leftoverHighSurrogate=S}_push(f,y,w){return w<128?f[y++]=w:w<2048?(f[y++]=192|(w&1984)>>>6,f[y++]=128|(w&63)>>>0):w<65536?(f[y++]=224|(w&61440)>>>12,f[y++]=128|(w&4032)>>>6,f[y++]=128|(w&63)>>>0):(f[y++]=240|(w&1835008)>>>18,f[y++]=128|(w&258048)>>>12,f[y++]=128|(w&4032)>>>6,f[y++]=128|(w&63)>>>0),y>=64&&(this._step(),y-=64,this._totalLen+=64,f[0]=f[64+0],f[1]=f[64+1],f[2]=f[64+2]),y}digest(){return this._finished||(this._finished=!0,this._leftoverHighSurrogate&&(this._leftoverHighSurrogate=0,this._buffLen=this._push(this._buff,this._buffLen,65533)),this._totalLen+=this._buffLen,this._wrapUp()),u(this._h0)+u(this._h1)+u(this._h2)+u(this._h3)+u(this._h4)}_wrapUp(){this._buff[this._buffLen++]=128,e(this._buff,this._buffLen),this._buffLen>56&&(this._step(),e(this._buff));const f=8*this._totalLen;this._buffDV.setUint32(56,Math.floor(f/4294967296),!1),this._buffDV.setUint32(60,f%4294967296,!1),this._step()}_step(){const f=c._bigBlock32,y=this._buffDV;for(let g=0;g<64;g+=4)f.setUint32(g,y.getUint32(g,!1),!1);for(let g=64;g<320;g+=4)f.setUint32(g,L(f.getUint32(g-12,!1)^f.getUint32(g-32,!1)^f.getUint32(g-56,!1)^f.getUint32(g-64,!1),1),!1);let w=this._h0,E=this._h1,S=this._h2,C=this._h3,r=this._h4,s,l,_;for(let g=0;g<80;g++)g<20?(s=E&S|~E&C,l=1518500249):g<40?(s=E^S^C,l=1859775393):g<60?(s=E&S|E&C|S&C,l=2400959708):(s=E^S^C,l=3395469782),_=L(w,5)+s+r+l+f.getUint32(g*4,!1)&4294967295,r=C,C=S,S=L(E,30),E=w,w=_;this._h0=this._h0+w&4294967295,this._h1=this._h1+E&4294967295,this._h2=this._h2+S&4294967295,this._h3=this._h3+C&4294967295,this._h4=this._h4+r&4294967295}}n.StringSHA1=c,c._bigBlock32=new DataView(new ArrayBuffer(320))}),Y(X[24],J([0,1,34,39]),function(q,n,M,A){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.LcsDiff=n.stringDiff=n.StringDiffSequence=void 0;class i{constructor(e){this.source=e}getElements(){const e=this.source,a=new Int32Array(e.length);for(let u=0,c=e.length;u<c;u++)a[u]=e.charCodeAt(u);return a}}n.StringDiffSequence=i;function d(L,e,a){return new o(new i(L),new i(e)).ComputeDiff(a).changes}n.stringDiff=d;class b{static Assert(e,a){if(!e)throw new Error(a)}}class p{static Copy(e,a,u,c,m){for(let f=0;f<m;f++)u[c+f]=e[a+f]}static Copy2(e,a,u,c,m){for(let f=0;f<m;f++)u[c+f]=e[a+f]}}class h{constructor(){this.m_changes=[],this.m_originalStart=1073741824,this.m_modifiedStart=1073741824,this.m_originalCount=0,this.m_modifiedCount=0}MarkNextChange(){(this.m_originalCount>0||this.m_modifiedCount>0)&&this.m_changes.push(new M.DiffChange(this.m_originalStart,this.m_originalCount,this.m_modifiedStart,this.m_modifiedCount)),this.m_originalCount=0,this.m_modifiedCount=0,this.m_originalStart=1073741824,this.m_modifiedStart=1073741824}AddOriginalElement(e,a){this.m_originalStart=Math.min(this.m_originalStart,e),this.m_modifiedStart=Math.min(this.m_modifiedStart,a),this.m_originalCount++}AddModifiedElement(e,a){this.m_originalStart=Math.min(this.m_originalStart,e),this.m_modifiedStart=Math.min(this.m_modifiedStart,a),this.m_modifiedCount++}getChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes}getReverseChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes.reverse(),this.m_changes}}class o{constructor(e,a,u=null){this.ContinueProcessingPredicate=u,this._originalSequence=e,this._modifiedSequence=a;const[c,m,f]=o._getElements(e),[y,w,E]=o._getElements(a);this._hasStrings=f&&E,this._originalStringElements=c,this._originalElementsOrHash=m,this._modifiedStringElements=y,this._modifiedElementsOrHash=w,this.m_forwardHistory=[],this.m_reverseHistory=[]}static _isStringArray(e){return e.length>0&&typeof e[0]=="string"}static _getElements(e){const a=e.getElements();if(o._isStringArray(a)){const u=new Int32Array(a.length);for(let c=0,m=a.length;c<m;c++)u[c]=(0,A.stringHash)(a[c],0);return[a,u,!0]}return a instanceof Int32Array?[[],a,!1]:[[],new Int32Array(a),!1]}ElementsAreEqual(e,a){return this._originalElementsOrHash[e]!==this._modifiedElementsOrHash[a]?!1:this._hasStrings?this._originalStringElements[e]===this._modifiedStringElements[a]:!0}ElementsAreStrictEqual(e,a){if(!this.ElementsAreEqual(e,a))return!1;const u=o._getStrictElement(this._originalSequence,e),c=o._getStrictElement(this._modifiedSequence,a);return u===c}static _getStrictElement(e,a){return typeof e.getStrictElement=="function"?e.getStrictElement(a):null}OriginalElementsAreEqual(e,a){return this._originalElementsOrHash[e]!==this._originalElementsOrHash[a]?!1:this._hasStrings?this._originalStringElements[e]===this._originalStringElements[a]:!0}ModifiedElementsAreEqual(e,a){return this._modifiedElementsOrHash[e]!==this._modifiedElementsOrHash[a]?!1:this._hasStrings?this._modifiedStringElements[e]===this._modifiedStringElements[a]:!0}ComputeDiff(e){return this._ComputeDiff(0,this._originalElementsOrHash.length-1,0,this._modifiedElementsOrHash.length-1,e)}_ComputeDiff(e,a,u,c,m){const f=[!1];let y=this.ComputeDiffRecursive(e,a,u,c,f);return m&&(y=this.PrettifyChanges(y)),{quitEarly:f[0],changes:y}}ComputeDiffRecursive(e,a,u,c,m){for(m[0]=!1;e<=a&&u<=c&&this.ElementsAreEqual(e,u);)e++,u++;for(;a>=e&&c>=u&&this.ElementsAreEqual(a,c);)a--,c--;if(e>a||u>c){let C;return u<=c?(b.Assert(e===a+1,"originalStart should only be one more than originalEnd"),C=[new M.DiffChange(e,0,u,c-u+1)]):e<=a?(b.Assert(u===c+1,"modifiedStart should only be one more than modifiedEnd"),C=[new M.DiffChange(e,a-e+1,u,0)]):(b.Assert(e===a+1,"originalStart should only be one more than originalEnd"),b.Assert(u===c+1,"modifiedStart should only be one more than modifiedEnd"),C=[]),C}const f=[0],y=[0],w=this.ComputeRecursionPoint(e,a,u,c,f,y,m),E=f[0],S=y[0];if(w!==null)return w;if(!m[0]){const C=this.ComputeDiffRecursive(e,E,u,S,m);let r=[];return m[0]?r=[new M.DiffChange(E+1,a-(E+1)+1,S+1,c-(S+1)+1)]:r=this.ComputeDiffRecursive(E+1,a,S+1,c,m),this.ConcatenateChanges(C,r)}return[new M.DiffChange(e,a-e+1,u,c-u+1)]}WALKTRACE(e,a,u,c,m,f,y,w,E,S,C,r,s,l,_,g,v,R){let N=null,D=null,x=new h,T=a,F=u,B=s[0]-g[0]-c,V=-1073741824,k=this.m_forwardHistory.length-1;do{const O=B+e;O===T||O<F&&E[O-1]<E[O+1]?(C=E[O+1],l=C-B-c,C<V&&x.MarkNextChange(),V=C,x.AddModifiedElement(C+1,l),B=O+1-e):(C=E[O-1]+1,l=C-B-c,C<V&&x.MarkNextChange(),V=C-1,x.AddOriginalElement(C,l+1),B=O-1-e),k>=0&&(E=this.m_forwardHistory[k],e=E[0],T=1,F=E.length-1)}while(--k>=-1);if(N=x.getReverseChanges(),R[0]){let O=s[0]+1,I=g[0]+1;if(N!==null&&N.length>0){const W=N[N.length-1];O=Math.max(O,W.getOriginalEnd()),I=Math.max(I,W.getModifiedEnd())}D=[new M.DiffChange(O,r-O+1,I,_-I+1)]}else{x=new h,T=f,F=y,B=s[0]-g[0]-w,V=1073741824,k=v?this.m_reverseHistory.length-1:this.m_reverseHistory.length-2;do{const O=B+m;O===T||O<F&&S[O-1]>=S[O+1]?(C=S[O+1]-1,l=C-B-w,C>V&&x.MarkNextChange(),V=C+1,x.AddOriginalElement(C+1,l+1),B=O+1-m):(C=S[O-1],l=C-B-w,C>V&&x.MarkNextChange(),V=C,x.AddModifiedElement(C+1,l+1),B=O-1-m),k>=0&&(S=this.m_reverseHistory[k],m=S[0],T=1,F=S.length-1)}while(--k>=-1);D=x.getChanges()}return this.ConcatenateChanges(N,D)}ComputeRecursionPoint(e,a,u,c,m,f,y){let w=0,E=0,S=0,C=0,r=0,s=0;e--,u--,m[0]=0,f[0]=0,this.m_forwardHistory=[],this.m_reverseHistory=[];const l=a-e+(c-u),_=l+1,g=new Int32Array(_),v=new Int32Array(_),R=c-u,N=a-e,D=e-u,x=a-c,F=(N-R)%2===0;g[R]=e,v[N]=a,y[0]=!1;for(let B=1;B<=l/2+1;B++){let V=0,k=0;S=this.ClipDiagonalBound(R-B,B,R,_),C=this.ClipDiagonalBound(R+B,B,R,_);for(let I=S;I<=C;I+=2){I===S||I<C&&g[I-1]<g[I+1]?w=g[I+1]:w=g[I-1]+1,E=w-(I-R)-D;const W=w;for(;w<a&&E<c&&this.ElementsAreEqual(w+1,E+1);)w++,E++;if(g[I]=w,w+E>V+k&&(V=w,k=E),!F&&Math.abs(I-N)<=B-1&&w>=v[I])return m[0]=w,f[0]=E,W<=v[I]&&1447>0&&B<=1447+1?this.WALKTRACE(R,S,C,D,N,r,s,x,g,v,w,a,m,E,c,f,F,y):null}const O=(V-e+(k-u)-B)/2;if(this.ContinueProcessingPredicate!==null&&!this.ContinueProcessingPredicate(V,O))return y[0]=!0,m[0]=V,f[0]=k,O>0&&1447>0&&B<=1447+1?this.WALKTRACE(R,S,C,D,N,r,s,x,g,v,w,a,m,E,c,f,F,y):(e++,u++,[new M.DiffChange(e,a-e+1,u,c-u+1)]);r=this.ClipDiagonalBound(N-B,B,N,_),s=this.ClipDiagonalBound(N+B,B,N,_);for(let I=r;I<=s;I+=2){I===r||I<s&&v[I-1]>=v[I+1]?w=v[I+1]-1:w=v[I-1],E=w-(I-N)-x;const W=w;for(;w>e&&E>u&&this.ElementsAreEqual(w,E);)w--,E--;if(v[I]=w,F&&Math.abs(I-R)<=B&&w<=g[I])return m[0]=w,f[0]=E,W>=g[I]&&1447>0&&B<=1447+1?this.WALKTRACE(R,S,C,D,N,r,s,x,g,v,w,a,m,E,c,f,F,y):null}if(B<=1447){let I=new Int32Array(C-S+2);I[0]=R-S+1,p.Copy2(g,S,I,1,C-S+1),this.m_forwardHistory.push(I),I=new Int32Array(s-r+2),I[0]=N-r+1,p.Copy2(v,r,I,1,s-r+1),this.m_reverseHistory.push(I)}}return this.WALKTRACE(R,S,C,D,N,r,s,x,g,v,w,a,m,E,c,f,F,y)}PrettifyChanges(e){for(let a=0;a<e.length;a++){const u=e[a],c=a<e.length-1?e[a+1].originalStart:this._originalElementsOrHash.length,m=a<e.length-1?e[a+1].modifiedStart:this._modifiedElementsOrHash.length,f=u.originalLength>0,y=u.modifiedLength>0;for(;u.originalStart+u.originalLength<c&&u.modifiedStart+u.modifiedLength<m&&(!f||this.OriginalElementsAreEqual(u.originalStart,u.originalStart+u.originalLength))&&(!y||this.ModifiedElementsAreEqual(u.modifiedStart,u.modifiedStart+u.modifiedLength));){const E=this.ElementsAreStrictEqual(u.originalStart,u.modifiedStart);if(this.ElementsAreStrictEqual(u.originalStart+u.originalLength,u.modifiedStart+u.modifiedLength)&&!E)break;u.originalStart++,u.modifiedStart++}const w=[null];if(a<e.length-1&&this.ChangesOverlap(e[a],e[a+1],w)){e[a]=w[0],e.splice(a+1,1),a--;continue}}for(let a=e.length-1;a>=0;a--){const u=e[a];let c=0,m=0;if(a>0){const C=e[a-1];c=C.originalStart+C.originalLength,m=C.modifiedStart+C.modifiedLength}const f=u.originalLength>0,y=u.modifiedLength>0;let w=0,E=this._boundaryScore(u.originalStart,u.originalLength,u.modifiedStart,u.modifiedLength);for(let C=1;;C++){const r=u.originalStart-C,s=u.modifiedStart-C;if(r<c||s<m||f&&!this.OriginalElementsAreEqual(r,r+u.originalLength)||y&&!this.ModifiedElementsAreEqual(s,s+u.modifiedLength))break;const _=(r===c&&s===m?5:0)+this._boundaryScore(r,u.originalLength,s,u.modifiedLength);_>E&&(E=_,w=C)}u.originalStart-=w,u.modifiedStart-=w;const S=[null];if(a>0&&this.ChangesOverlap(e[a-1],e[a],S)){e[a-1]=S[0],e.splice(a,1),a++;continue}}if(this._hasStrings)for(let a=1,u=e.length;a<u;a++){const c=e[a-1],m=e[a],f=m.originalStart-c.originalStart-c.originalLength,y=c.originalStart,w=m.originalStart+m.originalLength,E=w-y,S=c.modifiedStart,C=m.modifiedStart+m.modifiedLength,r=C-S;if(f<5&&E<20&&r<20){const s=this._findBetterContiguousSequence(y,E,S,r,f);if(s){const[l,_]=s;(l!==c.originalStart+c.originalLength||_!==c.modifiedStart+c.modifiedLength)&&(c.originalLength=l-c.originalStart,c.modifiedLength=_-c.modifiedStart,m.originalStart=l+f,m.modifiedStart=_+f,m.originalLength=w-m.originalStart,m.modifiedLength=C-m.modifiedStart)}}}return e}_findBetterContiguousSequence(e,a,u,c,m){if(a<m||c<m)return null;const f=e+a-m+1,y=u+c-m+1;let w=0,E=0,S=0;for(let C=e;C<f;C++)for(let r=u;r<y;r++){const s=this._contiguousSequenceScore(C,r,m);s>0&&s>w&&(w=s,E=C,S=r)}return w>0?[E,S]:null}_contiguousSequenceScore(e,a,u){let c=0;for(let m=0;m<u;m++){if(!this.ElementsAreEqual(e+m,a+m))return 0;c+=this._originalStringElements[e+m].length}return c}_OriginalIsBoundary(e){return e<=0||e>=this._originalElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._originalStringElements[e])}_OriginalRegionIsBoundary(e,a){if(this._OriginalIsBoundary(e)||this._OriginalIsBoundary(e-1))return!0;if(a>0){const u=e+a;if(this._OriginalIsBoundary(u-1)||this._OriginalIsBoundary(u))return!0}return!1}_ModifiedIsBoundary(e){return e<=0||e>=this._modifiedElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._modifiedStringElements[e])}_ModifiedRegionIsBoundary(e,a){if(this._ModifiedIsBoundary(e)||this._ModifiedIsBoundary(e-1))return!0;if(a>0){const u=e+a;if(this._ModifiedIsBoundary(u-1)||this._ModifiedIsBoundary(u))return!0}return!1}_boundaryScore(e,a,u,c){const m=this._OriginalRegionIsBoundary(e,a)?1:0,f=this._ModifiedRegionIsBoundary(u,c)?1:0;return m+f}ConcatenateChanges(e,a){const u=[];if(e.length===0||a.length===0)return a.length>0?a:e;if(this.ChangesOverlap(e[e.length-1],a[0],u)){const c=new Array(e.length+a.length-1);return p.Copy(e,0,c,0,e.length-1),c[e.length-1]=u[0],p.Copy(a,1,c,e.length,a.length-1),c}else{const c=new Array(e.length+a.length);return p.Copy(e,0,c,0,e.length),p.Copy(a,0,c,e.length,a.length),c}}ChangesOverlap(e,a,u){if(b.Assert(e.originalStart<=a.originalStart,"Left change is not less than or equal to right change"),b.Assert(e.modifiedStart<=a.modifiedStart,"Left change is not less than or equal to right change"),e.originalStart+e.originalLength>=a.originalStart||e.modifiedStart+e.modifiedLength>=a.modifiedStart){const c=e.originalStart;let m=e.originalLength;const f=e.modifiedStart;let y=e.modifiedLength;return e.originalStart+e.originalLength>=a.originalStart&&(m=a.originalStart+a.originalLength-e.originalStart),e.modifiedStart+e.modifiedLength>=a.modifiedStart&&(y=a.modifiedStart+a.modifiedLength-e.modifiedStart),u[0]=new M.DiffChange(c,m,f,y),!0}else return u[0]=null,!1}ClipDiagonalBound(e,a,u,c){if(e>=0&&e<c)return e;const m=u,f=c-u-1,y=a%2===0;if(e<0){const w=m%2===0;return y===w?0:1}else{const w=f%2===0;return y===w?c-1:c-2}}}n.LcsDiff=o}),Y(X[25],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.validateConstraint=n.validateConstraints=n.isFunction=n.assertIsDefined=n.assertType=n.isUndefinedOrNull=n.isDefined=n.isUndefined=n.isBoolean=n.isIterable=n.isNumber=n.isTypedArray=n.isObject=n.isString=void 0;function M(f){return typeof f=="string"}n.isString=M;function A(f){return typeof f=="object"&&f!==null&&!Array.isArray(f)&&!(f instanceof RegExp)&&!(f instanceof Date)}n.isObject=A;function i(f){const y=Object.getPrototypeOf(Uint8Array);return typeof f=="object"&&f instanceof y}n.isTypedArray=i;function d(f){return typeof f=="number"&&!isNaN(f)}n.isNumber=d;function b(f){return!!f&&typeof f[Symbol.iterator]=="function"}n.isIterable=b;function p(f){return f===!0||f===!1}n.isBoolean=p;function h(f){return typeof f>"u"}n.isUndefined=h;function o(f){return!L(f)}n.isDefined=o;function L(f){return h(f)||f===null}n.isUndefinedOrNull=L;function e(f,y){if(!f)throw new Error(y?`Unexpected type, expected '${y}'`:"Unexpected type")}n.assertType=e;function a(f){if(L(f))throw new Error("Assertion Failed: argument is undefined or null");return f}n.assertIsDefined=a;function u(f){return typeof f=="function"}n.isFunction=u;function c(f,y){const w=Math.min(f.length,y.length);for(let E=0;E<w;E++)m(f[E],y[E])}n.validateConstraints=c;function m(f,y){if(M(y)){if(typeof f!==y)throw new Error(`argument does not match constraint: typeof ${y}`)}else if(u(y)){try{if(f instanceof y)return}catch{}if(!L(f)&&f.constructor===y||y.length===1&&y.call(void 0,f)===!0)return;throw new Error("argument does not match one of these constraints: arg instanceof constraint, arg.constructor === constraint, nor constraint(arg) === true")}}n.validateConstraint=m}),Y(X[40],J([0,1,25]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Codicon=n.getCodiconFontCharacters=void 0;const A=Object.create(null);function i(b,p){if((0,M.isString)(p)){const h=A[p];if(h===void 0)throw new Error(`${b} references an unknown codicon: ${p}`);p=h}return A[b]=p,{id:b}}function d(){return A}n.getCodiconFontCharacters=d,n.Codicon={add:i("add",6e4),plus:i("plus",6e4),gistNew:i("gist-new",6e4),repoCreate:i("repo-create",6e4),lightbulb:i("lightbulb",60001),lightBulb:i("light-bulb",60001),repo:i("repo",60002),repoDelete:i("repo-delete",60002),gistFork:i("gist-fork",60003),repoForked:i("repo-forked",60003),gitPullRequest:i("git-pull-request",60004),gitPullRequestAbandoned:i("git-pull-request-abandoned",60004),recordKeys:i("record-keys",60005),keyboard:i("keyboard",60005),tag:i("tag",60006),tagAdd:i("tag-add",60006),tagRemove:i("tag-remove",60006),gitPullRequestLabel:i("git-pull-request-label",60006),person:i("person",60007),personFollow:i("person-follow",60007),personOutline:i("person-outline",60007),personFilled:i("person-filled",60007),gitBranch:i("git-branch",60008),gitBranchCreate:i("git-branch-create",60008),gitBranchDelete:i("git-branch-delete",60008),sourceControl:i("source-control",60008),mirror:i("mirror",60009),mirrorPublic:i("mirror-public",60009),star:i("star",60010),starAdd:i("star-add",60010),starDelete:i("star-delete",60010),starEmpty:i("star-empty",60010),comment:i("comment",60011),commentAdd:i("comment-add",60011),alert:i("alert",60012),warning:i("warning",60012),search:i("search",60013),searchSave:i("search-save",60013),logOut:i("log-out",60014),signOut:i("sign-out",60014),logIn:i("log-in",60015),signIn:i("sign-in",60015),eye:i("eye",60016),eyeUnwatch:i("eye-unwatch",60016),eyeWatch:i("eye-watch",60016),circleFilled:i("circle-filled",60017),primitiveDot:i("primitive-dot",60017),closeDirty:i("close-dirty",60017),debugBreakpoint:i("debug-breakpoint",60017),debugBreakpointDisabled:i("debug-breakpoint-disabled",60017),debugBreakpointPending:i("debug-breakpoint-pending",60377),debugHint:i("debug-hint",60017),primitiveSquare:i("primitive-square",60018),edit:i("edit",60019),pencil:i("pencil",60019),info:i("info",60020),issueOpened:i("issue-opened",60020),gistPrivate:i("gist-private",60021),gitForkPrivate:i("git-fork-private",60021),lock:i("lock",60021),mirrorPrivate:i("mirror-private",60021),close:i("close",60022),removeClose:i("remove-close",60022),x:i("x",60022),repoSync:i("repo-sync",60023),sync:i("sync",60023),clone:i("clone",60024),desktopDownload:i("desktop-download",60024),beaker:i("beaker",60025),microscope:i("microscope",60025),vm:i("vm",60026),deviceDesktop:i("device-desktop",60026),file:i("file",60027),fileText:i("file-text",60027),more:i("more",60028),ellipsis:i("ellipsis",60028),kebabHorizontal:i("kebab-horizontal",60028),mailReply:i("mail-reply",60029),reply:i("reply",60029),organization:i("organization",60030),organizationFilled:i("organization-filled",60030),organizationOutline:i("organization-outline",60030),newFile:i("new-file",60031),fileAdd:i("file-add",60031),newFolder:i("new-folder",60032),fileDirectoryCreate:i("file-directory-create",60032),trash:i("trash",60033),trashcan:i("trashcan",60033),history:i("history",60034),clock:i("clock",60034),folder:i("folder",60035),fileDirectory:i("file-directory",60035),symbolFolder:i("symbol-folder",60035),logoGithub:i("logo-github",60036),markGithub:i("mark-github",60036),github:i("github",60036),terminal:i("terminal",60037),console:i("console",60037),repl:i("repl",60037),zap:i("zap",60038),symbolEvent:i("symbol-event",60038),error:i("error",60039),stop:i("stop",60039),variable:i("variable",60040),symbolVariable:i("symbol-variable",60040),array:i("array",60042),symbolArray:i("symbol-array",60042),symbolModule:i("symbol-module",60043),symbolPackage:i("symbol-package",60043),symbolNamespace:i("symbol-namespace",60043),symbolObject:i("symbol-object",60043),symbolMethod:i("symbol-method",60044),symbolFunction:i("symbol-function",60044),symbolConstructor:i("symbol-constructor",60044),symbolBoolean:i("symbol-boolean",60047),symbolNull:i("symbol-null",60047),symbolNumeric:i("symbol-numeric",60048),symbolNumber:i("symbol-number",60048),symbolStructure:i("symbol-structure",60049),symbolStruct:i("symbol-struct",60049),symbolParameter:i("symbol-parameter",60050),symbolTypeParameter:i("symbol-type-parameter",60050),symbolKey:i("symbol-key",60051),symbolText:i("symbol-text",60051),symbolReference:i("symbol-reference",60052),goToFile:i("go-to-file",60052),symbolEnum:i("symbol-enum",60053),symbolValue:i("symbol-value",60053),symbolRuler:i("symbol-ruler",60054),symbolUnit:i("symbol-unit",60054),activateBreakpoints:i("activate-breakpoints",60055),archive:i("archive",60056),arrowBoth:i("arrow-both",60057),arrowDown:i("arrow-down",60058),arrowLeft:i("arrow-left",60059),arrowRight:i("arrow-right",60060),arrowSmallDown:i("arrow-small-down",60061),arrowSmallLeft:i("arrow-small-left",60062),arrowSmallRight:i("arrow-small-right",60063),arrowSmallUp:i("arrow-small-up",60064),arrowUp:i("arrow-up",60065),bell:i("bell",60066),bold:i("bold",60067),book:i("book",60068),bookmark:i("bookmark",60069),debugBreakpointConditionalUnverified:i("debug-breakpoint-conditional-unverified",60070),debugBreakpointConditional:i("debug-breakpoint-conditional",60071),debugBreakpointConditionalDisabled:i("debug-breakpoint-conditional-disabled",60071),debugBreakpointDataUnverified:i("debug-breakpoint-data-unverified",60072),debugBreakpointData:i("debug-breakpoint-data",60073),debugBreakpointDataDisabled:i("debug-breakpoint-data-disabled",60073),debugBreakpointLogUnverified:i("debug-breakpoint-log-unverified",60074),debugBreakpointLog:i("debug-breakpoint-log",60075),debugBreakpointLogDisabled:i("debug-breakpoint-log-disabled",60075),briefcase:i("briefcase",60076),broadcast:i("broadcast",60077),browser:i("browser",60078),bug:i("bug",60079),calendar:i("calendar",60080),caseSensitive:i("case-sensitive",60081),check:i("check",60082),checklist:i("checklist",60083),chevronDown:i("chevron-down",60084),dropDownButton:i("drop-down-button",60084),chevronLeft:i("chevron-left",60085),chevronRight:i("chevron-right",60086),chevronUp:i("chevron-up",60087),chromeClose:i("chrome-close",60088),chromeMaximize:i("chrome-maximize",60089),chromeMinimize:i("chrome-minimize",60090),chromeRestore:i("chrome-restore",60091),circle:i("circle",60092),circleOutline:i("circle-outline",60092),debugBreakpointUnverified:i("debug-breakpoint-unverified",60092),circleSlash:i("circle-slash",60093),circuitBoard:i("circuit-board",60094),clearAll:i("clear-all",60095),clippy:i("clippy",60096),closeAll:i("close-all",60097),cloudDownload:i("cloud-download",60098),cloudUpload:i("cloud-upload",60099),code:i("code",60100),collapseAll:i("collapse-all",60101),colorMode:i("color-mode",60102),commentDiscussion:i("comment-discussion",60103),compareChanges:i("compare-changes",60157),creditCard:i("credit-card",60105),dash:i("dash",60108),dashboard:i("dashboard",60109),database:i("database",60110),debugContinue:i("debug-continue",60111),debugDisconnect:i("debug-disconnect",60112),debugPause:i("debug-pause",60113),debugRestart:i("debug-restart",60114),debugStart:i("debug-start",60115),debugStepInto:i("debug-step-into",60116),debugStepOut:i("debug-step-out",60117),debugStepOver:i("debug-step-over",60118),debugStop:i("debug-stop",60119),debug:i("debug",60120),deviceCameraVideo:i("device-camera-video",60121),deviceCamera:i("device-camera",60122),deviceMobile:i("device-mobile",60123),diffAdded:i("diff-added",60124),diffIgnored:i("diff-ignored",60125),diffModified:i("diff-modified",60126),diffRemoved:i("diff-removed",60127),diffRenamed:i("diff-renamed",60128),diff:i("diff",60129),discard:i("discard",60130),editorLayout:i("editor-layout",60131),emptyWindow:i("empty-window",60132),exclude:i("exclude",60133),extensions:i("extensions",60134),eyeClosed:i("eye-closed",60135),fileBinary:i("file-binary",60136),fileCode:i("file-code",60137),fileMedia:i("file-media",60138),filePdf:i("file-pdf",60139),fileSubmodule:i("file-submodule",60140),fileSymlinkDirectory:i("file-symlink-directory",60141),fileSymlinkFile:i("file-symlink-file",60142),fileZip:i("file-zip",60143),files:i("files",60144),filter:i("filter",60145),flame:i("flame",60146),foldDown:i("fold-down",60147),foldUp:i("fold-up",60148),fold:i("fold",60149),folderActive:i("folder-active",60150),folderOpened:i("folder-opened",60151),gear:i("gear",60152),gift:i("gift",60153),gistSecret:i("gist-secret",60154),gist:i("gist",60155),gitCommit:i("git-commit",60156),gitCompare:i("git-compare",60157),gitMerge:i("git-merge",60158),githubAction:i("github-action",60159),githubAlt:i("github-alt",60160),globe:i("globe",60161),grabber:i("grabber",60162),graph:i("graph",60163),gripper:i("gripper",60164),heart:i("heart",60165),home:i("home",60166),horizontalRule:i("horizontal-rule",60167),hubot:i("hubot",60168),inbox:i("inbox",60169),issueClosed:i("issue-closed",60324),issueReopened:i("issue-reopened",60171),issues:i("issues",60172),italic:i("italic",60173),jersey:i("jersey",60174),json:i("json",60175),bracket:i("bracket",60175),kebabVertical:i("kebab-vertical",60176),key:i("key",60177),law:i("law",60178),lightbulbAutofix:i("lightbulb-autofix",60179),linkExternal:i("link-external",60180),link:i("link",60181),listOrdered:i("list-ordered",60182),listUnordered:i("list-unordered",60183),liveShare:i("live-share",60184),loading:i("loading",60185),location:i("location",60186),mailRead:i("mail-read",60187),mail:i("mail",60188),markdown:i("markdown",60189),megaphone:i("megaphone",60190),mention:i("mention",60191),milestone:i("milestone",60192),gitPullRequestMilestone:i("git-pull-request-milestone",60192),mortarBoard:i("mortar-board",60193),move:i("move",60194),multipleWindows:i("multiple-windows",60195),mute:i("mute",60196),noNewline:i("no-newline",60197),note:i("note",60198),octoface:i("octoface",60199),openPreview:i("open-preview",60200),package:i("package",60201),paintcan:i("paintcan",60202),pin:i("pin",60203),play:i("play",60204),run:i("run",60204),plug:i("plug",60205),preserveCase:i("preserve-case",60206),preview:i("preview",60207),project:i("project",60208),pulse:i("pulse",60209),question:i("question",60210),quote:i("quote",60211),radioTower:i("radio-tower",60212),reactions:i("reactions",60213),references:i("references",60214),refresh:i("refresh",60215),regex:i("regex",60216),remoteExplorer:i("remote-explorer",60217),remote:i("remote",60218),remove:i("remove",60219),replaceAll:i("replace-all",60220),replace:i("replace",60221),repoClone:i("repo-clone",60222),repoForcePush:i("repo-force-push",60223),repoPull:i("repo-pull",60224),repoPush:i("repo-push",60225),report:i("report",60226),requestChanges:i("request-changes",60227),rocket:i("rocket",60228),rootFolderOpened:i("root-folder-opened",60229),rootFolder:i("root-folder",60230),rss:i("rss",60231),ruby:i("ruby",60232),saveAll:i("save-all",60233),saveAs:i("save-as",60234),save:i("save",60235),screenFull:i("screen-full",60236),screenNormal:i("screen-normal",60237),searchStop:i("search-stop",60238),server:i("server",60240),settingsGear:i("settings-gear",60241),settings:i("settings",60242),shield:i("shield",60243),smiley:i("smiley",60244),sortPrecedence:i("sort-precedence",60245),splitHorizontal:i("split-horizontal",60246),splitVertical:i("split-vertical",60247),squirrel:i("squirrel",60248),starFull:i("star-full",60249),starHalf:i("star-half",60250),symbolClass:i("symbol-class",60251),symbolColor:i("symbol-color",60252),symbolCustomColor:i("symbol-customcolor",60252),symbolConstant:i("symbol-constant",60253),symbolEnumMember:i("symbol-enum-member",60254),symbolField:i("symbol-field",60255),symbolFile:i("symbol-file",60256),symbolInterface:i("symbol-interface",60257),symbolKeyword:i("symbol-keyword",60258),symbolMisc:i("symbol-misc",60259),symbolOperator:i("symbol-operator",60260),symbolProperty:i("symbol-property",60261),wrench:i("wrench",60261),wrenchSubaction:i("wrench-subaction",60261),symbolSnippet:i("symbol-snippet",60262),tasklist:i("tasklist",60263),telescope:i("telescope",60264),textSize:i("text-size",60265),threeBars:i("three-bars",60266),thumbsdown:i("thumbsdown",60267),thumbsup:i("thumbsup",60268),tools:i("tools",60269),triangleDown:i("triangle-down",60270),triangleLeft:i("triangle-left",60271),triangleRight:i("triangle-right",60272),triangleUp:i("triangle-up",60273),twitter:i("twitter",60274),unfold:i("unfold",60275),unlock:i("unlock",60276),unmute:i("unmute",60277),unverified:i("unverified",60278),verified:i("verified",60279),versions:i("versions",60280),vmActive:i("vm-active",60281),vmOutline:i("vm-outline",60282),vmRunning:i("vm-running",60283),watch:i("watch",60284),whitespace:i("whitespace",60285),wholeWord:i("whole-word",60286),window:i("window",60287),wordWrap:i("word-wrap",60288),zoomIn:i("zoom-in",60289),zoomOut:i("zoom-out",60290),listFilter:i("list-filter",60291),listFlat:i("list-flat",60292),listSelection:i("list-selection",60293),selection:i("selection",60293),listTree:i("list-tree",60294),debugBreakpointFunctionUnverified:i("debug-breakpoint-function-unverified",60295),debugBreakpointFunction:i("debug-breakpoint-function",60296),debugBreakpointFunctionDisabled:i("debug-breakpoint-function-disabled",60296),debugStackframeActive:i("debug-stackframe-active",60297),circleSmallFilled:i("circle-small-filled",60298),debugStackframeDot:i("debug-stackframe-dot",60298),debugStackframe:i("debug-stackframe",60299),debugStackframeFocused:i("debug-stackframe-focused",60299),debugBreakpointUnsupported:i("debug-breakpoint-unsupported",60300),symbolString:i("symbol-string",60301),debugReverseContinue:i("debug-reverse-continue",60302),debugStepBack:i("debug-step-back",60303),debugRestartFrame:i("debug-restart-frame",60304),callIncoming:i("call-incoming",60306),callOutgoing:i("call-outgoing",60307),menu:i("menu",60308),expandAll:i("expand-all",60309),feedback:i("feedback",60310),gitPullRequestReviewer:i("git-pull-request-reviewer",60310),groupByRefType:i("group-by-ref-type",60311),ungroupByRefType:i("ungroup-by-ref-type",60312),account:i("account",60313),gitPullRequestAssignee:i("git-pull-request-assignee",60313),bellDot:i("bell-dot",60314),debugConsole:i("debug-console",60315),library:i("library",60316),output:i("output",60317),runAll:i("run-all",60318),syncIgnored:i("sync-ignored",60319),pinned:i("pinned",60320),githubInverted:i("github-inverted",60321),debugAlt:i("debug-alt",60305),serverProcess:i("server-process",60322),serverEnvironment:i("server-environment",60323),pass:i("pass",60324),stopCircle:i("stop-circle",60325),playCircle:i("play-circle",60326),record:i("record",60327),debugAltSmall:i("debug-alt-small",60328),vmConnect:i("vm-connect",60329),cloud:i("cloud",60330),merge:i("merge",60331),exportIcon:i("export",60332),graphLeft:i("graph-left",60333),magnet:i("magnet",60334),notebook:i("notebook",60335),redo:i("redo",60336),checkAll:i("check-all",60337),pinnedDirty:i("pinned-dirty",60338),passFilled:i("pass-filled",60339),circleLargeFilled:i("circle-large-filled",60340),circleLarge:i("circle-large",60341),circleLargeOutline:i("circle-large-outline",60341),combine:i("combine",60342),gather:i("gather",60342),table:i("table",60343),variableGroup:i("variable-group",60344),typeHierarchy:i("type-hierarchy",60345),typeHierarchySub:i("type-hierarchy-sub",60346),typeHierarchySuper:i("type-hierarchy-super",60347),gitPullRequestCreate:i("git-pull-request-create",60348),runAbove:i("run-above",60349),runBelow:i("run-below",60350),notebookTemplate:i("notebook-template",60351),debugRerun:i("debug-rerun",60352),workspaceTrusted:i("workspace-trusted",60353),workspaceUntrusted:i("workspace-untrusted",60354),workspaceUnspecified:i("workspace-unspecified",60355),terminalCmd:i("terminal-cmd",60356),terminalDebian:i("terminal-debian",60357),terminalLinux:i("terminal-linux",60358),terminalPowershell:i("terminal-powershell",60359),terminalTmux:i("terminal-tmux",60360),terminalUbuntu:i("terminal-ubuntu",60361),terminalBash:i("terminal-bash",60362),arrowSwap:i("arrow-swap",60363),copy:i("copy",60364),personAdd:i("person-add",60365),filterFilled:i("filter-filled",60366),wand:i("wand",60367),debugLineByLine:i("debug-line-by-line",60368),inspect:i("inspect",60369),layers:i("layers",60370),layersDot:i("layers-dot",60371),layersActive:i("layers-active",60372),compass:i("compass",60373),compassDot:i("compass-dot",60374),compassActive:i("compass-active",60375),azure:i("azure",60376),issueDraft:i("issue-draft",60377),gitPullRequestClosed:i("git-pull-request-closed",60378),gitPullRequestDraft:i("git-pull-request-draft",60379),debugAll:i("debug-all",60380),debugCoverage:i("debug-coverage",60381),runErrors:i("run-errors",60382),folderLibrary:i("folder-library",60383),debugContinueSmall:i("debug-continue-small",60384),beakerStop:i("beaker-stop",60385),graphLine:i("graph-line",60386),graphScatter:i("graph-scatter",60387),pieChart:i("pie-chart",60388),bracketDot:i("bracket-dot",60389),bracketError:i("bracket-error",60390),lockSmall:i("lock-small",60391),azureDevops:i("azure-devops",60392),verifiedFilled:i("verified-filled",60393),newLine:i("newline",60394),layout:i("layout",60395),layoutActivitybarLeft:i("layout-activitybar-left",60396),layoutActivitybarRight:i("layout-activitybar-right",60397),layoutPanelLeft:i("layout-panel-left",60398),layoutPanelCenter:i("layout-panel-center",60399),layoutPanelJustify:i("layout-panel-justify",60400),layoutPanelRight:i("layout-panel-right",60401),layoutPanel:i("layout-panel",60402),layoutSidebarLeft:i("layout-sidebar-left",60403),layoutSidebarRight:i("layout-sidebar-right",60404),layoutStatusbar:i("layout-statusbar",60405),layoutMenubar:i("layout-menubar",60406),layoutCentered:i("layout-centered",60407),layoutSidebarRightOff:i("layout-sidebar-right-off",60416),layoutPanelOff:i("layout-panel-off",60417),layoutSidebarLeftOff:i("layout-sidebar-left-off",60418),target:i("target",60408),indent:i("indent",60409),recordSmall:i("record-small",60410),errorSmall:i("error-small",60411),arrowCircleDown:i("arrow-circle-down",60412),arrowCircleLeft:i("arrow-circle-left",60413),arrowCircleRight:i("arrow-circle-right",60414),arrowCircleUp:i("arrow-circle-up",60415),heartFilled:i("heart-filled",60420),map:i("map",60421),mapFilled:i("map-filled",60422),circleSmall:i("circle-small",60423),bellSlash:i("bell-slash",60424),bellSlashDot:i("bell-slash-dot",60425),commentUnresolved:i("comment-unresolved",60426),gitPullRequestGoToChanges:i("git-pull-request-go-to-changes",60427),gitPullRequestNewChanges:i("git-pull-request-new-changes",60428),searchFuzzy:i("search-fuzzy",60429),commentDraft:i("comment-draft",60430),send:i("send",60431),sparkle:i("sparkle",60432),insert:i("insert",60433),mic:i("mic",60434),thumbsDownFilled:i("thumbsdown-filled",60435),thumbsUpFilled:i("thumbsup-filled",60436),coffee:i("coffee",60437),snake:i("snake",60438),game:i("game",60439),vr:i("vr",60440),chip:i("chip",60441),piano:i("piano",60442),music:i("music",60443),micFilled:i("mic-filled",60444),gitFetch:i("git-fetch",60445),copilot:i("copilot",60446),lightbulbSparkle:i("lightbulb-sparkle",60447),lightbulbSparkleAutofix:i("lightbulb-sparkle-autofix",60447),robot:i("robot",60448),sparkleFilled:i("sparkle-filled",60449),diffSingle:i("diff-single",60450),diffMultiple:i("diff-multiple",60451),surroundWith:i("surround-with",60452),gitStash:i("git-stash",60454),gitStashApply:i("git-stash-apply",60455),gitStashPop:i("git-stash-pop",60456),dialogError:i("dialog-error","error"),dialogWarning:i("dialog-warning","warning"),dialogInfo:i("dialog-info","info"),dialogClose:i("dialog-close","close"),treeItemExpanded:i("tree-item-expanded","chevron-down"),treeFilterOnTypeOn:i("tree-filter-on-type-on","list-filter"),treeFilterOnTypeOff:i("tree-filter-on-type-off","list-selection"),treeFilterClear:i("tree-filter-clear","close"),treeItemLoading:i("tree-item-loading","loading"),menuSelection:i("menu-selection","check"),menuSubmenu:i("menu-submenu","chevron-right"),menuBarMore:i("menubar-more","more"),scrollbarButtonLeft:i("scrollbar-button-left","triangle-left"),scrollbarButtonRight:i("scrollbar-button-right","triangle-right"),scrollbarButtonUp:i("scrollbar-button-up","triangle-up"),scrollbarButtonDown:i("scrollbar-button-down","triangle-down"),toolBarMore:i("toolbar-more","more"),quickInputBack:i("quick-input-back","arrow-left")}}),Y(X[14],J([0,1,25]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.createProxyObject=n.getAllMethodNames=n.getAllPropertyNames=n.equals=n.mixin=n.cloneAndChange=n.deepFreeze=n.deepClone=void 0;function A(u){if(!u||typeof u!="object"||u instanceof RegExp)return u;const c=Array.isArray(u)?[]:{};return Object.entries(u).forEach(([m,f])=>{c[m]=f&&typeof f=="object"?A(f):f}),c}n.deepClone=A;function i(u){if(!u||typeof u!="object")return u;const c=[u];for(;c.length>0;){const m=c.shift();Object.freeze(m);for(const f in m)if(d.call(m,f)){const y=m[f];typeof y=="object"&&!Object.isFrozen(y)&&!(0,M.isTypedArray)(y)&&c.push(y)}}return u}n.deepFreeze=i;const d=Object.prototype.hasOwnProperty;function b(u,c){return p(u,c,new Set)}n.cloneAndChange=b;function p(u,c,m){if((0,M.isUndefinedOrNull)(u))return u;const f=c(u);if(typeof f<"u")return f;if(Array.isArray(u)){const y=[];for(const w of u)y.push(p(w,c,m));return y}if((0,M.isObject)(u)){if(m.has(u))throw new Error("Cannot clone recursive data-structure");m.add(u);const y={};for(const w in u)d.call(u,w)&&(y[w]=p(u[w],c,m));return m.delete(u),y}return u}function h(u,c,m=!0){return(0,M.isObject)(u)?((0,M.isObject)(c)&&Object.keys(c).forEach(f=>{f in u?m&&((0,M.isObject)(u[f])&&(0,M.isObject)(c[f])?h(u[f],c[f],m):u[f]=c[f]):u[f]=c[f]}),u):c}n.mixin=h;function o(u,c){if(u===c)return!0;if(u==null||c===null||c===void 0||typeof u!=typeof c||typeof u!="object"||Array.isArray(u)!==Array.isArray(c))return!1;let m,f;if(Array.isArray(u)){if(u.length!==c.length)return!1;for(m=0;m<u.length;m++)if(!o(u[m],c[m]))return!1}else{const y=[];for(f in u)y.push(f);y.sort();const w=[];for(f in c)w.push(f);if(w.sort(),!o(y,w))return!1;for(m=0;m<y.length;m++)if(!o(u[y[m]],c[y[m]]))return!1}return!0}n.equals=o;function L(u){let c=[];for(;Object.prototype!==u;)c=c.concat(Object.getOwnPropertyNames(u)),u=Object.getPrototypeOf(u);return c}n.getAllPropertyNames=L;function e(u){const c=[];for(const m of L(u))typeof u[m]=="function"&&c.push(m);return c}n.getAllMethodNames=e;function a(u,c){const m=y=>function(){const w=Array.prototype.slice.call(arguments,0);return c(y,w)},f={};for(const y of u)f[y]=m(y);return f}n.createProxyObject=a}),Y(X[26],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.toUint32=n.toUint8=void 0;function M(i){return i<0?0:i>255?255:i|0}n.toUint8=M;function A(i){return i<0?0:i>4294967295?4294967295:i|0}n.toUint32=A}),Y(X[27],J([0,1,26]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.CharacterSet=n.CharacterClassifier=void 0;class A{constructor(b){const p=(0,M.toUint8)(b);this._defaultValue=p,this._asciiMap=A._createAsciiMap(p),this._map=new Map}static _createAsciiMap(b){const p=new Uint8Array(256);return p.fill(b),p}set(b,p){const h=(0,M.toUint8)(p);b>=0&&b<256?this._asciiMap[b]=h:this._map.set(b,h)}get(b){return b>=0&&b<256?this._asciiMap[b]:this._map.get(b)||this._defaultValue}clear(){this._asciiMap.fill(this._defaultValue),this._map.clear()}}n.CharacterClassifier=A;class i{constructor(){this._actual=new A(0)}add(b){this._actual.set(b,1)}has(b){return this._actual.get(b)===1}clear(){return this._actual.clear()}}n.CharacterSet=i}),Y(X[3],J([0,1,5]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.OffsetRangeSet=n.OffsetRange=void 0;class A{static addRange(b,p){let h=0;for(;h<p.length&&p[h].endExclusive<b.start;)h++;let o=h;for(;o<p.length&&p[o].start<=b.endExclusive;)o++;if(h===o)p.splice(h,0,b);else{const L=Math.min(b.start,p[h].start),e=Math.max(b.endExclusive,p[o-1].endExclusive);p.splice(h,o-h,new A(L,e))}}static ofLength(b){return new A(0,b)}static ofStartAndLength(b,p){return new A(b,b+p)}constructor(b,p){if(this.start=b,this.endExclusive=p,b>p)throw new M.BugIndicatingError(`Invalid range: ${this.toString()}`)}get isEmpty(){return this.start===this.endExclusive}delta(b){return new A(this.start+b,this.endExclusive+b)}deltaStart(b){return new A(this.start+b,this.endExclusive)}deltaEnd(b){return new A(this.start,this.endExclusive+b)}get length(){return this.endExclusive-this.start}toString(){return`[${this.start}, ${this.endExclusive})`}contains(b){return this.start<=b&&b<this.endExclusive}join(b){return new A(Math.min(this.start,b.start),Math.max(this.endExclusive,b.endExclusive))}intersect(b){const p=Math.max(this.start,b.start),h=Math.min(this.endExclusive,b.endExclusive);if(p<=h)return new A(p,h)}intersects(b){const p=Math.max(this.start,b.start),h=Math.min(this.endExclusive,b.endExclusive);return p<h}isBefore(b){return this.endExclusive<=b.start}isAfter(b){return this.start>=b.endExclusive}slice(b){return b.slice(this.start,this.endExclusive)}clip(b){if(this.isEmpty)throw new M.BugIndicatingError(`Invalid clipping range: ${this.toString()}`);return Math.max(this.start,Math.min(this.endExclusive-1,b))}clipCyclic(b){if(this.isEmpty)throw new M.BugIndicatingError(`Invalid clipping range: ${this.toString()}`);return b<this.start?this.endExclusive-(this.start-b)%this.length:b>=this.endExclusive?this.start+(b-this.start)%this.length:b}forEach(b){for(let p=this.start;p<this.endExclusive;p++)b(p)}}n.OffsetRange=A;class i{constructor(){this._sortedRanges=[]}addRange(b){let p=0;for(;p<this._sortedRanges.length&&this._sortedRanges[p].endExclusive<b.start;)p++;let h=p;for(;h<this._sortedRanges.length&&this._sortedRanges[h].start<=b.endExclusive;)h++;if(p===h)this._sortedRanges.splice(p,0,b);else{const o=Math.min(b.start,this._sortedRanges[p].start),L=Math.max(b.endExclusive,this._sortedRanges[h-1].endExclusive);this._sortedRanges.splice(p,h-p,new A(o,L))}}toString(){return this._sortedRanges.map(b=>b.toString()).join(", ")}intersectsStrict(b){let p=0;for(;p<this._sortedRanges.length&&this._sortedRanges[p].endExclusive<=b.start;)p++;return p<this._sortedRanges.length&&this._sortedRanges[p].start<b.endExclusive}intersectWithRange(b){const p=new i;for(const h of this._sortedRanges){const o=h.intersect(b);o&&p.addRange(o)}return p}intersectWithRangeLength(b){return this.intersectWithRange(b).length}get length(){return this._sortedRanges.reduce((b,p)=>b+p.length,0)}}n.OffsetRangeSet=i}),Y(X[4],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Position=void 0;class M{constructor(i,d){this.lineNumber=i,this.column=d}with(i=this.lineNumber,d=this.column){return i===this.lineNumber&&d===this.column?this:new M(i,d)}delta(i=0,d=0){return this.with(this.lineNumber+i,this.column+d)}equals(i){return M.equals(this,i)}static equals(i,d){return!i&&!d?!0:!!i&&!!d&&i.lineNumber===d.lineNumber&&i.column===d.column}isBefore(i){return M.isBefore(this,i)}static isBefore(i,d){return i.lineNumber<d.lineNumber?!0:d.lineNumber<i.lineNumber?!1:i.column<d.column}isBeforeOrEqual(i){return M.isBeforeOrEqual(this,i)}static isBeforeOrEqual(i,d){return i.lineNumber<d.lineNumber?!0:d.lineNumber<i.lineNumber?!1:i.column<=d.column}static compare(i,d){const b=i.lineNumber|0,p=d.lineNumber|0;if(b===p){const h=i.column|0,o=d.column|0;return h-o}return b-p}clone(){return new M(this.lineNumber,this.column)}toString(){return"("+this.lineNumber+","+this.column+")"}static lift(i){return new M(i.lineNumber,i.column)}static isIPosition(i){return i&&typeof i.lineNumber=="number"&&typeof i.column=="number"}toJSON(){return{lineNumber:this.lineNumber,column:this.column}}}n.Position=M}),Y(X[2],J([0,1,4]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Range=void 0;class A{constructor(d,b,p,h){d>p||d===p&&b>h?(this.startLineNumber=p,this.startColumn=h,this.endLineNumber=d,this.endColumn=b):(this.startLineNumber=d,this.startColumn=b,this.endLineNumber=p,this.endColumn=h)}isEmpty(){return A.isEmpty(this)}static isEmpty(d){return d.startLineNumber===d.endLineNumber&&d.startColumn===d.endColumn}containsPosition(d){return A.containsPosition(this,d)}static containsPosition(d,b){return!(b.lineNumber<d.startLineNumber||b.lineNumber>d.endLineNumber||b.lineNumber===d.startLineNumber&&b.column<d.startColumn||b.lineNumber===d.endLineNumber&&b.column>d.endColumn)}static strictContainsPosition(d,b){return!(b.lineNumber<d.startLineNumber||b.lineNumber>d.endLineNumber||b.lineNumber===d.startLineNumber&&b.column<=d.startColumn||b.lineNumber===d.endLineNumber&&b.column>=d.endColumn)}containsRange(d){return A.containsRange(this,d)}static containsRange(d,b){return!(b.startLineNumber<d.startLineNumber||b.endLineNumber<d.startLineNumber||b.startLineNumber>d.endLineNumber||b.endLineNumber>d.endLineNumber||b.startLineNumber===d.startLineNumber&&b.startColumn<d.startColumn||b.endLineNumber===d.endLineNumber&&b.endColumn>d.endColumn)}strictContainsRange(d){return A.strictContainsRange(this,d)}static strictContainsRange(d,b){return!(b.startLineNumber<d.startLineNumber||b.endLineNumber<d.startLineNumber||b.startLineNumber>d.endLineNumber||b.endLineNumber>d.endLineNumber||b.startLineNumber===d.startLineNumber&&b.startColumn<=d.startColumn||b.endLineNumber===d.endLineNumber&&b.endColumn>=d.endColumn)}plusRange(d){return A.plusRange(this,d)}static plusRange(d,b){let p,h,o,L;return b.startLineNumber<d.startLineNumber?(p=b.startLineNumber,h=b.startColumn):b.startLineNumber===d.startLineNumber?(p=b.startLineNumber,h=Math.min(b.startColumn,d.startColumn)):(p=d.startLineNumber,h=d.startColumn),b.endLineNumber>d.endLineNumber?(o=b.endLineNumber,L=b.endColumn):b.endLineNumber===d.endLineNumber?(o=b.endLineNumber,L=Math.max(b.endColumn,d.endColumn)):(o=d.endLineNumber,L=d.endColumn),new A(p,h,o,L)}intersectRanges(d){return A.intersectRanges(this,d)}static intersectRanges(d,b){let p=d.startLineNumber,h=d.startColumn,o=d.endLineNumber,L=d.endColumn;const e=b.startLineNumber,a=b.startColumn,u=b.endLineNumber,c=b.endColumn;return p<e?(p=e,h=a):p===e&&(h=Math.max(h,a)),o>u?(o=u,L=c):o===u&&(L=Math.min(L,c)),p>o||p===o&&h>L?null:new A(p,h,o,L)}equalsRange(d){return A.equalsRange(this,d)}static equalsRange(d,b){return!d&&!b?!0:!!d&&!!b&&d.startLineNumber===b.startLineNumber&&d.startColumn===b.startColumn&&d.endLineNumber===b.endLineNumber&&d.endColumn===b.endColumn}getEndPosition(){return A.getEndPosition(this)}static getEndPosition(d){return new M.Position(d.endLineNumber,d.endColumn)}getStartPosition(){return A.getStartPosition(this)}static getStartPosition(d){return new M.Position(d.startLineNumber,d.startColumn)}toString(){return"["+this.startLineNumber+","+this.startColumn+" -> "+this.endLineNumber+","+this.endColumn+"]"}setEndPosition(d,b){return new A(this.startLineNumber,this.startColumn,d,b)}setStartPosition(d,b){return new A(d,b,this.endLineNumber,this.endColumn)}collapseToStart(){return A.collapseToStart(this)}static collapseToStart(d){return new A(d.startLineNumber,d.startColumn,d.startLineNumber,d.startColumn)}collapseToEnd(){return A.collapseToEnd(this)}static collapseToEnd(d){return new A(d.endLineNumber,d.endColumn,d.endLineNumber,d.endColumn)}delta(d){return new A(this.startLineNumber+d,this.startColumn,this.endLineNumber+d,this.endColumn)}static fromPositions(d,b=d){return new A(d.lineNumber,d.column,b.lineNumber,b.column)}static lift(d){return d?new A(d.startLineNumber,d.startColumn,d.endLineNumber,d.endColumn):null}static isIRange(d){return d&&typeof d.startLineNumber=="number"&&typeof d.startColumn=="number"&&typeof d.endLineNumber=="number"&&typeof d.endColumn=="number"}static areIntersectingOrTouching(d,b){return!(d.endLineNumber<b.startLineNumber||d.endLineNumber===b.startLineNumber&&d.endColumn<b.startColumn||b.endLineNumber<d.startLineNumber||b.endLineNumber===d.startLineNumber&&b.endColumn<d.startColumn)}static areIntersecting(d,b){return!(d.endLineNumber<b.startLineNumber||d.endLineNumber===b.startLineNumber&&d.endColumn<=b.startColumn||b.endLineNumber<d.startLineNumber||b.endLineNumber===d.startLineNumber&&b.endColumn<=d.startColumn)}static compareRangesUsingStarts(d,b){if(d&&b){const o=d.startLineNumber|0,L=b.startLineNumber|0;if(o===L){const e=d.startColumn|0,a=b.startColumn|0;if(e===a){const u=d.endLineNumber|0,c=b.endLineNumber|0;if(u===c){const m=d.endColumn|0,f=b.endColumn|0;return m-f}return u-c}return e-a}return o-L}return(d?1:0)-(b?1:0)}static compareRangesUsingEnds(d,b){return d.endLineNumber===b.endLineNumber?d.endColumn===b.endColumn?d.startLineNumber===b.startLineNumber?d.startColumn-b.startColumn:d.startLineNumber-b.startLineNumber:d.endColumn-b.endColumn:d.endLineNumber-b.endLineNumber}static spansMultipleLines(d){return d.endLineNumber>d.startLineNumber}toJSON(){return this}}n.Range=A}),Y(X[10],J([0,1,5,3,2,11]),function(q,n,M,A,i,d){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.LineRangeSet=n.LineRange=void 0;class b{static fromRangeInclusive(o){return new b(o.startLineNumber,o.endLineNumber+1)}static joinMany(o){if(o.length===0)return[];let L=new p(o[0].slice());for(let e=1;e<o.length;e++)L=L.getUnion(new p(o[e].slice()));return L.ranges}static ofLength(o,L){return new b(o,o+L)}static deserialize(o){return new b(o[0],o[1])}constructor(o,L){if(o>L)throw new M.BugIndicatingError(`startLineNumber ${o} cannot be after endLineNumberExclusive ${L}`);this.startLineNumber=o,this.endLineNumberExclusive=L}contains(o){return this.startLineNumber<=o&&o<this.endLineNumberExclusive}get isEmpty(){return this.startLineNumber===this.endLineNumberExclusive}delta(o){return new b(this.startLineNumber+o,this.endLineNumberExclusive+o)}deltaLength(o){return new b(this.startLineNumber,this.endLineNumberExclusive+o)}get length(){return this.endLineNumberExclusive-this.startLineNumber}join(o){return new b(Math.min(this.startLineNumber,o.startLineNumber),Math.max(this.endLineNumberExclusive,o.endLineNumberExclusive))}toString(){return`[${this.startLineNumber},${this.endLineNumberExclusive})`}intersect(o){const L=Math.max(this.startLineNumber,o.startLineNumber),e=Math.min(this.endLineNumberExclusive,o.endLineNumberExclusive);if(L<=e)return new b(L,e)}intersectsStrict(o){return this.startLineNumber<o.endLineNumberExclusive&&o.startLineNumber<this.endLineNumberExclusive}overlapOrTouch(o){return this.startLineNumber<=o.endLineNumberExclusive&&o.startLineNumber<=this.endLineNumberExclusive}equals(o){return this.startLineNumber===o.startLineNumber&&this.endLineNumberExclusive===o.endLineNumberExclusive}toInclusiveRange(){return this.isEmpty?null:new i.Range(this.startLineNumber,1,this.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER)}toExclusiveRange(){return new i.Range(this.startLineNumber,1,this.endLineNumberExclusive,1)}mapToLineArray(o){const L=[];for(let e=this.startLineNumber;e<this.endLineNumberExclusive;e++)L.push(o(e));return L}forEach(o){for(let L=this.startLineNumber;L<this.endLineNumberExclusive;L++)o(L)}serialize(){return[this.startLineNumber,this.endLineNumberExclusive]}includes(o){return this.startLineNumber<=o&&o<this.endLineNumberExclusive}toOffsetRange(){return new A.OffsetRange(this.startLineNumber-1,this.endLineNumberExclusive-1)}}n.LineRange=b;class p{constructor(o=[]){this._normalizedRanges=o}get ranges(){return this._normalizedRanges}addRange(o){if(o.length===0)return;const L=(0,d.findFirstIdxMonotonousOrArrLen)(this._normalizedRanges,a=>a.endLineNumberExclusive>=o.startLineNumber),e=(0,d.findLastIdxMonotonous)(this._normalizedRanges,a=>a.startLineNumber<=o.endLineNumberExclusive)+1;if(L===e)this._normalizedRanges.splice(L,0,o);else if(L===e-1){const a=this._normalizedRanges[L];this._normalizedRanges[L]=a.join(o)}else{const a=this._normalizedRanges[L].join(this._normalizedRanges[e-1]).join(o);this._normalizedRanges.splice(L,e-L,a)}}contains(o){const L=(0,d.findLastMonotonous)(this._normalizedRanges,e=>e.startLineNumber<=o);return!!L&&L.endLineNumberExclusive>o}intersects(o){const L=(0,d.findLastMonotonous)(this._normalizedRanges,e=>e.startLineNumber<o.endLineNumberExclusive);return!!L&&L.endLineNumberExclusive>o.startLineNumber}getUnion(o){if(this._normalizedRanges.length===0)return o;if(o._normalizedRanges.length===0)return this;const L=[];let e=0,a=0,u=null;for(;e<this._normalizedRanges.length||a<o._normalizedRanges.length;){let c=null;if(e<this._normalizedRanges.length&&a<o._normalizedRanges.length){const m=this._normalizedRanges[e],f=o._normalizedRanges[a];m.startLineNumber<f.startLineNumber?(c=m,e++):(c=f,a++)}else e<this._normalizedRanges.length?(c=this._normalizedRanges[e],e++):(c=o._normalizedRanges[a],a++);u===null?u=c:u.endLineNumberExclusive>=c.startLineNumber?u=new b(u.startLineNumber,Math.max(u.endLineNumberExclusive,c.endLineNumberExclusive)):(L.push(u),u=c)}return u!==null&&L.push(u),new p(L)}subtractFrom(o){const L=(0,d.findFirstIdxMonotonousOrArrLen)(this._normalizedRanges,c=>c.endLineNumberExclusive>=o.startLineNumber),e=(0,d.findLastIdxMonotonous)(this._normalizedRanges,c=>c.startLineNumber<=o.endLineNumberExclusive)+1;if(L===e)return new p([o]);const a=[];let u=o.startLineNumber;for(let c=L;c<e;c++){const m=this._normalizedRanges[c];m.startLineNumber>u&&a.push(new b(u,m.startLineNumber)),u=m.endLineNumberExclusive}return u<o.endLineNumberExclusive&&a.push(new b(u,o.endLineNumberExclusive)),new p(a)}toString(){return this._normalizedRanges.map(o=>o.toString()).join(", ")}getIntersection(o){const L=[];let e=0,a=0;for(;e<this._normalizedRanges.length&&a<o._normalizedRanges.length;){const u=this._normalizedRanges[e],c=o._normalizedRanges[a],m=u.intersect(c);m&&!m.isEmpty&&L.push(m),u.endLineNumberExclusive<c.endLineNumberExclusive?e++:a++}return new p(L)}getWithDelta(o){return new p(this._normalizedRanges.map(L=>L.delta(o)))}}n.LineRangeSet=p}),Y(X[41],J([0,1,4,2]),function(q,n,M,A){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Selection=void 0;class i extends A.Range{constructor(b,p,h,o){super(b,p,h,o),this.selectionStartLineNumber=b,this.selectionStartColumn=p,this.positionLineNumber=h,this.positionColumn=o}toString(){return"["+this.selectionStartLineNumber+","+this.selectionStartColumn+" -> "+this.positionLineNumber+","+this.positionColumn+"]"}equalsSelection(b){return i.selectionsEqual(this,b)}static selectionsEqual(b,p){return b.selectionStartLineNumber===p.selectionStartLineNumber&&b.selectionStartColumn===p.selectionStartColumn&&b.positionLineNumber===p.positionLineNumber&&b.positionColumn===p.positionColumn}getDirection(){return this.selectionStartLineNumber===this.startLineNumber&&this.selectionStartColumn===this.startColumn?0:1}setEndPosition(b,p){return this.getDirection()===0?new i(this.startLineNumber,this.startColumn,b,p):new i(b,p,this.startLineNumber,this.startColumn)}getPosition(){return new M.Position(this.positionLineNumber,this.positionColumn)}getSelectionStart(){return new M.Position(this.selectionStartLineNumber,this.selectionStartColumn)}setStartPosition(b,p){return this.getDirection()===0?new i(b,p,this.endLineNumber,this.endColumn):new i(this.endLineNumber,this.endColumn,b,p)}static fromPositions(b,p=b){return new i(b.lineNumber,b.column,p.lineNumber,p.column)}static fromRange(b,p){return p===0?new i(b.startLineNumber,b.startColumn,b.endLineNumber,b.endColumn):new i(b.endLineNumber,b.endColumn,b.startLineNumber,b.startColumn)}static liftSelection(b){return new i(b.selectionStartLineNumber,b.selectionStartColumn,b.positionLineNumber,b.positionColumn)}static selectionsArrEqual(b,p){if(b&&!p||!b&&p)return!1;if(!b&&!p)return!0;if(b.length!==p.length)return!1;for(let h=0,o=b.length;h<o;h++)if(!this.selectionsEqual(b[h],p[h]))return!1;return!0}static isISelection(b){return b&&typeof b.selectionStartLineNumber=="number"&&typeof b.selectionStartColumn=="number"&&typeof b.positionLineNumber=="number"&&typeof b.positionColumn=="number"}static createWithDirection(b,p,h,o,L){return L===0?new i(b,p,h,o):new i(h,o,b,p)}}n.Selection=i}),Y(X[42],J([0,1,27]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getMapForWordSeparators=n.WordCharacterClassifier=void 0;class A extends M.CharacterClassifier{constructor(b){super(0);for(let p=0,h=b.length;p<h;p++)this.set(b.charCodeAt(p),2);this.set(32,1),this.set(9,1)}}n.WordCharacterClassifier=A;function i(d){const b={};return p=>(b.hasOwnProperty(p)||(b[p]=d(p)),b[p])}n.getMapForWordSeparators=i(d=>new A(d))}),Y(X[28],J([0,1,21,22]),function(q,n,M,A){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getWordAtText=n.ensureValidWordDefinition=n.DEFAULT_WORD_REGEXP=n.USUAL_WORD_SEPARATORS=void 0,n.USUAL_WORD_SEPARATORS="`~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?";function i(o=""){let L="(-?\\d*\\.\\d\\w*)|([^";for(const e of n.USUAL_WORD_SEPARATORS)o.indexOf(e)>=0||(L+="\\"+e);return L+="\\s]+)",new RegExp(L,"g")}n.DEFAULT_WORD_REGEXP=i();function d(o){let L=n.DEFAULT_WORD_REGEXP;if(o&&o instanceof RegExp)if(o.global)L=o;else{let e="g";o.ignoreCase&&(e+="i"),o.multiline&&(e+="m"),o.unicode&&(e+="u"),L=new RegExp(o.source,e)}return L.lastIndex=0,L}n.ensureValidWordDefinition=d;const b=new A.LinkedList;b.unshift({maxLen:1e3,windowSize:15,timeBudget:150});function p(o,L,e,a,u){if(L=d(L),u||(u=M.Iterable.first(b)),e.length>u.maxLen){let w=o-u.maxLen/2;return w<0?w=0:a+=w,e=e.substring(w,o+u.maxLen/2),p(o,L,e,a,u)}const c=Date.now(),m=o-1-a;let f=-1,y=null;for(let w=1;!(Date.now()-c>=u.timeBudget);w++){const E=m-u.windowSize*w;L.lastIndex=Math.max(0,E);const S=h(L,e,m,f);if(!S&&y||(y=S,E<=0))break;f=E}if(y){const w={word:y[0],startColumn:a+1+y.index,endColumn:a+1+y.index+y[0].length};return L.lastIndex=0,w}return null}n.getWordAtText=p;function h(o,L,e,a){let u;for(;u=o.exec(L);){const c=u.index||0;if(c<=e&&o.lastIndex>=e)return u;if(a>0&&c>a)return null}return null}}),Y(X[8],J([0,1,7,5,3]),function(q,n,M,A,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.DateTimeout=n.InfiniteTimeout=n.OffsetPair=n.SequenceDiff=n.DiffAlgorithmResult=void 0;class d{static trivial(e,a){return new d([new b(i.OffsetRange.ofLength(e.length),i.OffsetRange.ofLength(a.length))],!1)}static trivialTimedOut(e,a){return new d([new b(i.OffsetRange.ofLength(e.length),i.OffsetRange.ofLength(a.length))],!0)}constructor(e,a){this.diffs=e,this.hitTimeout=a}}n.DiffAlgorithmResult=d;class b{static invert(e,a){const u=[];return(0,M.forEachAdjacent)(e,(c,m)=>{u.push(b.fromOffsetPairs(c?c.getEndExclusives():p.zero,m?m.getStarts():new p(a,(c?c.seq2Range.endExclusive-c.seq1Range.endExclusive:0)+a)))}),u}static fromOffsetPairs(e,a){return new b(new i.OffsetRange(e.offset1,a.offset1),new i.OffsetRange(e.offset2,a.offset2))}constructor(e,a){this.seq1Range=e,this.seq2Range=a}swap(){return new b(this.seq2Range,this.seq1Range)}toString(){return`${this.seq1Range} <-> ${this.seq2Range}`}join(e){return new b(this.seq1Range.join(e.seq1Range),this.seq2Range.join(e.seq2Range))}delta(e){return e===0?this:new b(this.seq1Range.delta(e),this.seq2Range.delta(e))}deltaStart(e){return e===0?this:new b(this.seq1Range.deltaStart(e),this.seq2Range.deltaStart(e))}deltaEnd(e){return e===0?this:new b(this.seq1Range.deltaEnd(e),this.seq2Range.deltaEnd(e))}intersect(e){const a=this.seq1Range.intersect(e.seq1Range),u=this.seq2Range.intersect(e.seq2Range);if(!(!a||!u))return new b(a,u)}getStarts(){return new p(this.seq1Range.start,this.seq2Range.start)}getEndExclusives(){return new p(this.seq1Range.endExclusive,this.seq2Range.endExclusive)}}n.SequenceDiff=b;class p{constructor(e,a){this.offset1=e,this.offset2=a}toString(){return`${this.offset1} <-> ${this.offset2}`}delta(e){return e===0?this:new p(this.offset1+e,this.offset2+e)}equals(e){return this.offset1===e.offset1&&this.offset2===e.offset2}}n.OffsetPair=p,p.zero=new p(0,0),p.max=new p(Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER);class h{isValid(){return!0}}n.InfiniteTimeout=h,h.instance=new h;class o{constructor(e){if(this.timeout=e,this.startTime=Date.now(),this.valid=!0,e<=0)throw new A.BugIndicatingError("timeout must be positive")}isValid(){if(!(Date.now()-this.startTime<this.timeout)&&this.valid){this.valid=!1;debugger}return this.valid}}n.DateTimeout=o}),Y(X[29],J([0,1,3,8]),function(q,n,M,A){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.MyersDiffAlgorithm=void 0;class i{compute(o,L,e=A.InfiniteTimeout.instance){if(o.length===0||L.length===0)return A.DiffAlgorithmResult.trivial(o,L);const a=o,u=L;function c(s,l){for(;s<a.length&&l<u.length&&a.getElement(s)===u.getElement(l);)s++,l++;return s}let m=0;const f=new b;f.set(0,c(0,0));const y=new p;y.set(0,f.get(0)===0?null:new d(null,0,0,f.get(0)));let w=0;e:for(;;){if(m++,!e.isValid())return A.DiffAlgorithmResult.trivialTimedOut(a,u);const s=-Math.min(m,u.length+m%2),l=Math.min(m,a.length+m%2);for(w=s;w<=l;w+=2){let _=0;const g=w===l?-1:f.get(w+1),v=w===s?-1:f.get(w-1)+1;_++;const R=Math.min(Math.max(g,v),a.length),N=R-w;if(_++,R>a.length||N>u.length)continue;const D=c(R,N);f.set(w,D);const x=R===g?y.get(w+1):y.get(w-1);if(y.set(w,D!==R?new d(x,R,N,D-R):x),f.get(w)===a.length&&f.get(w)-w===u.length)break e}}let E=y.get(w);const S=[];let C=a.length,r=u.length;for(;;){const s=E?E.x+E.length:0,l=E?E.y+E.length:0;if((s!==C||l!==r)&&S.push(new A.SequenceDiff(new M.OffsetRange(s,C),new M.OffsetRange(l,r))),!E)break;C=E.x,r=E.y,E=E.prev}return S.reverse(),new A.DiffAlgorithmResult(S,!1)}}n.MyersDiffAlgorithm=i;class d{constructor(o,L,e,a){this.prev=o,this.x=L,this.y=e,this.length=a}}class b{constructor(){this.positiveArr=new Int32Array(10),this.negativeArr=new Int32Array(10)}get(o){return o<0?(o=-o-1,this.negativeArr[o]):this.positiveArr[o]}set(o,L){if(o<0){if(o=-o-1,o>=this.negativeArr.length){const e=this.negativeArr;this.negativeArr=new Int32Array(e.length*2),this.negativeArr.set(e)}this.negativeArr[o]=L}else{if(o>=this.positiveArr.length){const e=this.positiveArr;this.positiveArr=new Int32Array(e.length*2),this.positiveArr.set(e)}this.positiveArr[o]=L}}}class p{constructor(){this.positiveArr=[],this.negativeArr=[]}get(o){return o<0?(o=-o-1,this.negativeArr[o]):this.positiveArr[o]}set(o,L){o<0?(o=-o-1,this.negativeArr[o]=L):this.positiveArr[o]=L}}}),Y(X[43],J([0,1,7,3,8]),function(q,n,M,A,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.removeVeryShortMatchingTextBetweenLongDiffs=n.removeVeryShortMatchingLinesBetweenDiffs=n.extendDiffsToEntireWordIfAppropriate=n.removeShortMatches=n.optimizeSequenceDiffs=void 0;function d(c,m,f){let y=f;return y=b(c,m,y),y=b(c,m,y),y=p(c,m,y),y}n.optimizeSequenceDiffs=d;function b(c,m,f){if(f.length===0)return f;const y=[];y.push(f[0]);for(let E=1;E<f.length;E++){const S=y[y.length-1];let C=f[E];if(C.seq1Range.isEmpty||C.seq2Range.isEmpty){const r=C.seq1Range.start-S.seq1Range.endExclusive;let s;for(s=1;s<=r&&!(c.getElement(C.seq1Range.start-s)!==c.getElement(C.seq1Range.endExclusive-s)||m.getElement(C.seq2Range.start-s)!==m.getElement(C.seq2Range.endExclusive-s));s++);if(s--,s===r){y[y.length-1]=new i.SequenceDiff(new A.OffsetRange(S.seq1Range.start,C.seq1Range.endExclusive-r),new A.OffsetRange(S.seq2Range.start,C.seq2Range.endExclusive-r));continue}C=C.delta(-s)}y.push(C)}const w=[];for(let E=0;E<y.length-1;E++){const S=y[E+1];let C=y[E];if(C.seq1Range.isEmpty||C.seq2Range.isEmpty){const r=S.seq1Range.start-C.seq1Range.endExclusive;let s;for(s=0;s<r&&!(!c.isStronglyEqual(C.seq1Range.start+s,C.seq1Range.endExclusive+s)||!m.isStronglyEqual(C.seq2Range.start+s,C.seq2Range.endExclusive+s));s++);if(s===r){y[E+1]=new i.SequenceDiff(new A.OffsetRange(C.seq1Range.start+r,S.seq1Range.endExclusive),new A.OffsetRange(C.seq2Range.start+r,S.seq2Range.endExclusive));continue}s>0&&(C=C.delta(s))}w.push(C)}return y.length>0&&w.push(y[y.length-1]),w}function p(c,m,f){if(!c.getBoundaryScore||!m.getBoundaryScore)return f;for(let y=0;y<f.length;y++){const w=y>0?f[y-1]:void 0,E=f[y],S=y+1<f.length?f[y+1]:void 0,C=new A.OffsetRange(w?w.seq1Range.endExclusive+1:0,S?S.seq1Range.start-1:c.length),r=new A.OffsetRange(w?w.seq2Range.endExclusive+1:0,S?S.seq2Range.start-1:m.length);E.seq1Range.isEmpty?f[y]=h(E,c,m,C,r):E.seq2Range.isEmpty&&(f[y]=h(E.swap(),m,c,r,C).swap())}return f}function h(c,m,f,y,w){let S=1;for(;c.seq1Range.start-S>=y.start&&c.seq2Range.start-S>=w.start&&f.isStronglyEqual(c.seq2Range.start-S,c.seq2Range.endExclusive-S)&&S<100;)S++;S--;let C=0;for(;c.seq1Range.start+C<y.endExclusive&&c.seq2Range.endExclusive+C<w.endExclusive&&f.isStronglyEqual(c.seq2Range.start+C,c.seq2Range.endExclusive+C)&&C<100;)C++;if(S===0&&C===0)return c;let r=0,s=-1;for(let l=-S;l<=C;l++){const _=c.seq2Range.start+l,g=c.seq2Range.endExclusive+l,v=c.seq1Range.start+l,R=m.getBoundaryScore(v)+f.getBoundaryScore(_)+f.getBoundaryScore(g);R>s&&(s=R,r=l)}return c.delta(r)}function o(c,m,f){const y=[];for(const w of f){const E=y[y.length-1];if(!E){y.push(w);continue}w.seq1Range.start-E.seq1Range.endExclusive<=2||w.seq2Range.start-E.seq2Range.endExclusive<=2?y[y.length-1]=new i.SequenceDiff(E.seq1Range.join(w.seq1Range),E.seq2Range.join(w.seq2Range)):y.push(w)}return y}n.removeShortMatches=o;function L(c,m,f){const y=i.SequenceDiff.invert(f,c.length),w=[];let E=new i.OffsetPair(0,0);function S(r,s){if(r.offset1<E.offset1||r.offset2<E.offset2)return;const l=c.findWordContaining(r.offset1),_=m.findWordContaining(r.offset2);if(!l||!_)return;let g=new i.SequenceDiff(l,_);const v=g.intersect(s);let R=v.seq1Range.length,N=v.seq2Range.length;for(;y.length>0;){const D=y[0];if(!(D.seq1Range.intersects(l)||D.seq2Range.intersects(_)))break;const T=c.findWordContaining(D.seq1Range.start),F=m.findWordContaining(D.seq2Range.start),B=new i.SequenceDiff(T,F),V=B.intersect(D);if(R+=V.seq1Range.length,N+=V.seq2Range.length,g=g.join(B),g.seq1Range.endExclusive>=D.seq1Range.endExclusive)y.shift();else break}R+N<(g.seq1Range.length+g.seq2Range.length)*2/3&&w.push(g),E=g.getEndExclusives()}for(;y.length>0;){const r=y.shift();r.seq1Range.isEmpty||(S(r.getStarts(),r),S(r.getEndExclusives().delta(-1),r))}return e(f,w)}n.extendDiffsToEntireWordIfAppropriate=L;function e(c,m){const f=[];for(;c.length>0||m.length>0;){const y=c[0],w=m[0];let E;y&&(!w||y.seq1Range.start<w.seq1Range.start)?E=c.shift():E=m.shift(),f.length>0&&f[f.length-1].seq1Range.endExclusive>=E.seq1Range.start?f[f.length-1]=f[f.length-1].join(E):f.push(E)}return f}function a(c,m,f){let y=f;if(y.length===0)return y;let w=0,E;do{E=!1;const S=[y[0]];for(let C=1;C<y.length;C++){let l=function(g,v){const R=new A.OffsetRange(s.seq1Range.endExclusive,r.seq1Range.start);return c.getText(R).replace(/\s/g,"").length<=4&&(g.seq1Range.length+g.seq2Range.length>5||v.seq1Range.length+v.seq2Range.length>5)};const r=y[C],s=S[S.length-1];l(s,r)?(E=!0,S[S.length-1]=S[S.length-1].join(r)):S.push(r)}y=S}while(w++<10&&E);return y}n.removeVeryShortMatchingLinesBetweenDiffs=a;function u(c,m,f){let y=f;if(y.length===0)return y;let w=0,E;do{E=!1;const C=[y[0]];for(let r=1;r<y.length;r++){let _=function(v,R){const N=new A.OffsetRange(l.seq1Range.endExclusive,s.seq1Range.start);if(c.countLinesIn(N)>5||N.length>500)return!1;const x=c.getText(N).trim();if(x.length>20||x.split(/\r\n|\r|\n/).length>1)return!1;const T=c.countLinesIn(v.seq1Range),F=v.seq1Range.length,B=m.countLinesIn(v.seq2Range),V=v.seq2Range.length,k=c.countLinesIn(R.seq1Range),O=R.seq1Range.length,I=m.countLinesIn(R.seq2Range),W=R.seq2Range.length,z=2*40+50;function G(t){return Math.min(t,z)}return Math.pow(Math.pow(G(T*40+F),1.5)+Math.pow(G(B*40+V),1.5),1.5)+Math.pow(Math.pow(G(k*40+O),1.5)+Math.pow(G(I*40+W),1.5),1.5)>(z**1.5)**1.5*1.3};const s=y[r],l=C[C.length-1];_(l,s)?(E=!0,C[C.length-1]=C[C.length-1].join(s)):C.push(s)}y=C}while(w++<10&&E);const S=[];return(0,M.forEachWithNeighbors)(y,(C,r,s)=>{let l=r;function _(x){return x.length>0&&x.trim().length<=3&&r.seq1Range.length+r.seq2Range.length>100}const g=c.extendToFullLines(r.seq1Range),v=c.getText(new A.OffsetRange(g.start,r.seq1Range.start));_(v)&&(l=l.deltaStart(-v.length));const R=c.getText(new A.OffsetRange(r.seq1Range.endExclusive,g.endExclusive));_(R)&&(l=l.deltaEnd(R.length));const N=i.SequenceDiff.fromOffsetPairs(C?C.getEndExclusives():i.OffsetPair.zero,s?s.getStarts():i.OffsetPair.max),D=l.intersect(N);S.length>0&&D.getStarts().equals(S[S.length-1].getEndExclusives())?S[S.length-1]=S[S.length-1].join(D):S.push(D)}),S}n.removeVeryShortMatchingTextBetweenLongDiffs=u}),Y(X[44],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.LineSequence=void 0;class M{constructor(d,b){this.trimmedHash=d,this.lines=b}getElement(d){return this.trimmedHash[d]}get length(){return this.trimmedHash.length}getBoundaryScore(d){const b=d===0?0:A(this.lines[d-1]),p=d===this.lines.length?0:A(this.lines[d]);return 1e3-(b+p)}getText(d){return this.lines.slice(d.start,d.endExclusive).join(`
+`)}isStronglyEqual(d,b){return this.lines[d]===this.lines[b]}}n.LineSequence=M;function A(i){let d=0;for(;d<i.length&&(i.charCodeAt(d)===32||i.charCodeAt(d)===9);)d++;return d}}),Y(X[15],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.LineRangeFragment=n.isSpace=n.Array2D=void 0;class M{constructor(b,p){this.width=b,this.height=p,this.array=[],this.array=new Array(b*p)}get(b,p){return this.array[b+p*this.width]}set(b,p,h){this.array[b+p*this.width]=h}}n.Array2D=M;function A(d){return d===32||d===9}n.isSpace=A;class i{static getKey(b){let p=this.chrKeys.get(b);return p===void 0&&(p=this.chrKeys.size,this.chrKeys.set(b,p)),p}constructor(b,p,h){this.range=b,this.lines=p,this.source=h,this.histogram=[];let o=0;for(let L=b.startLineNumber-1;L<b.endLineNumberExclusive-1;L++){const e=p[L];for(let u=0;u<e.length;u++){o++;const c=e[u],m=i.getKey(c);this.histogram[m]=(this.histogram[m]||0)+1}o++;const a=i.getKey(`
+`);this.histogram[a]=(this.histogram[a]||0)+1}this.totalCount=o}computeSimilarity(b){var p,h;let o=0;const L=Math.max(this.histogram.length,b.histogram.length);for(let e=0;e<L;e++)o+=Math.abs(((p=this.histogram[e])!==null&&p!==void 0?p:0)-((h=b.histogram[e])!==null&&h!==void 0?h:0));return 1-o/(this.totalCount+b.totalCount)}}n.LineRangeFragment=i,i.chrKeys=new Map}),Y(X[45],J([0,1,3,8,15]),function(q,n,M,A,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.DynamicProgrammingDiffing=void 0;class d{compute(p,h,o=A.InfiniteTimeout.instance,L){if(p.length===0||h.length===0)return A.DiffAlgorithmResult.trivial(p,h);const e=new i.Array2D(p.length,h.length),a=new i.Array2D(p.length,h.length),u=new i.Array2D(p.length,h.length);for(let S=0;S<p.length;S++)for(let C=0;C<h.length;C++){if(!o.isValid())return A.DiffAlgorithmResult.trivialTimedOut(p,h);const r=S===0?0:e.get(S-1,C),s=C===0?0:e.get(S,C-1);let l;p.getElement(S)===h.getElement(C)?(S===0||C===0?l=0:l=e.get(S-1,C-1),S>0&&C>0&&a.get(S-1,C-1)===3&&(l+=u.get(S-1,C-1)),l+=L?L(S,C):1):l=-1;const _=Math.max(r,s,l);if(_===l){const g=S>0&&C>0?u.get(S-1,C-1):0;u.set(S,C,g+1),a.set(S,C,3)}else _===r?(u.set(S,C,0),a.set(S,C,1)):_===s&&(u.set(S,C,0),a.set(S,C,2));e.set(S,C,_)}const c=[];let m=p.length,f=h.length;function y(S,C){(S+1!==m||C+1!==f)&&c.push(new A.SequenceDiff(new M.OffsetRange(S+1,m),new M.OffsetRange(C+1,f))),m=S,f=C}let w=p.length-1,E=h.length-1;for(;w>=0&&E>=0;)a.get(w,E)===3?(y(w,E),w--,E--):a.get(w,E)===1?w--:E--;return y(-1,-1),c.reverse(),new A.DiffAlgorithmResult(c,!1)}}n.DynamicProgrammingDiffing=d}),Y(X[30],J([0,1,11,3,4,2,15]),function(q,n,M,A,i,d,b){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.LinesSliceCharSequence=void 0;class p{constructor(u,c,m){this.lines=u,this.considerWhitespaceChanges=m,this.elements=[],this.firstCharOffsetByLine=[],this.additionalOffsetByLine=[];let f=!1;c.start>0&&c.endExclusive>=u.length&&(c=new A.OffsetRange(c.start-1,c.endExclusive),f=!0),this.lineRange=c,this.firstCharOffsetByLine[0]=0;for(let y=this.lineRange.start;y<this.lineRange.endExclusive;y++){let w=u[y],E=0;if(f)E=w.length,w="",f=!1;else if(!m){const S=w.trimStart();E=w.length-S.length,w=S.trimEnd()}this.additionalOffsetByLine.push(E);for(let S=0;S<w.length;S++)this.elements.push(w.charCodeAt(S));y<u.length-1&&(this.elements.push(`
+`.charCodeAt(0)),this.firstCharOffsetByLine[y-this.lineRange.start+1]=this.elements.length)}this.additionalOffsetByLine.push(0)}toString(){return`Slice: "${this.text}"`}get text(){return this.getText(new A.OffsetRange(0,this.length))}getText(u){return this.elements.slice(u.start,u.endExclusive).map(c=>String.fromCharCode(c)).join("")}getElement(u){return this.elements[u]}get length(){return this.elements.length}getBoundaryScore(u){const c=e(u>0?this.elements[u-1]:-1),m=e(u<this.elements.length?this.elements[u]:-1);if(c===7&&m===8)return 0;if(c===8)return 150;let f=0;return c!==m&&(f+=10,c===0&&m===1&&(f+=1)),f+=L(c),f+=L(m),f}translateOffset(u){if(this.lineRange.isEmpty)return new i.Position(this.lineRange.start+1,1);const c=(0,M.findLastIdxMonotonous)(this.firstCharOffsetByLine,m=>m<=u);return new i.Position(this.lineRange.start+c+1,u-this.firstCharOffsetByLine[c]+this.additionalOffsetByLine[c]+1)}translateRange(u){return d.Range.fromPositions(this.translateOffset(u.start),this.translateOffset(u.endExclusive))}findWordContaining(u){if(u<0||u>=this.elements.length||!h(this.elements[u]))return;let c=u;for(;c>0&&h(this.elements[c-1]);)c--;let m=u;for(;m<this.elements.length&&h(this.elements[m]);)m++;return new A.OffsetRange(c,m)}countLinesIn(u){return this.translateOffset(u.endExclusive).lineNumber-this.translateOffset(u.start).lineNumber}isStronglyEqual(u,c){return this.elements[u]===this.elements[c]}extendToFullLines(u){var c,m;const f=(c=(0,M.findLastMonotonous)(this.firstCharOffsetByLine,w=>w<=u.start))!==null&&c!==void 0?c:0,y=(m=(0,M.findFirstMonotonous)(this.firstCharOffsetByLine,w=>u.endExclusive<=w))!==null&&m!==void 0?m:this.elements.length;return new A.OffsetRange(f,y)}}n.LinesSliceCharSequence=p;function h(a){return a>=97&&a<=122||a>=65&&a<=90||a>=48&&a<=57}const o={[0]:0,[1]:0,[2]:0,[3]:10,[4]:2,[5]:30,[6]:3,[7]:10,[8]:10};function L(a){return o[a]}function e(a){return a===10?8:a===13?7:(0,b.isSpace)(a)?6:a>=97&&a<=122?0:a>=65&&a<=90?1:a>=48&&a<=57?2:a===-1?3:a===44||a===59?5:4}}),Y(X[31],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.MovedText=n.LinesDiff=void 0;class M{constructor(d,b,p){this.changes=d,this.moves=b,this.hitTimeout=p}}n.LinesDiff=M;class A{constructor(d,b){this.lineRangeMapping=d,this.changes=b}}n.MovedText=A}),Y(X[16],J([0,1,10]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.RangeMapping=n.DetailedLineRangeMapping=n.LineRangeMapping=void 0;class A{static inverse(p,h,o){const L=[];let e=1,a=1;for(const c of p){const m=new A(new M.LineRange(e,c.original.startLineNumber),new M.LineRange(a,c.modified.startLineNumber));m.modified.isEmpty||L.push(m),e=c.original.endLineNumberExclusive,a=c.modified.endLineNumberExclusive}const u=new A(new M.LineRange(e,h+1),new M.LineRange(a,o+1));return u.modified.isEmpty||L.push(u),L}static clip(p,h,o){const L=[];for(const e of p){const a=e.original.intersect(h),u=e.modified.intersect(o);a&&!a.isEmpty&&u&&!u.isEmpty&&L.push(new A(a,u))}return L}constructor(p,h){this.original=p,this.modified=h}toString(){return`{${this.original.toString()}->${this.modified.toString()}}`}flip(){return new A(this.modified,this.original)}join(p){return new A(this.original.join(p.original),this.modified.join(p.modified))}}n.LineRangeMapping=A;class i extends A{constructor(p,h,o){super(p,h),this.innerChanges=o}flip(){var p;return new i(this.modified,this.original,(p=this.innerChanges)===null||p===void 0?void 0:p.map(h=>h.flip()))}}n.DetailedLineRangeMapping=i;class d{constructor(p,h){this.originalRange=p,this.modifiedRange=h}toString(){return`{${this.originalRange.toString()}->${this.modifiedRange.toString()}}`}flip(){return new d(this.modifiedRange,this.originalRange)}}n.RangeMapping=d}),Y(X[46],J([0,1,8,16,7,11,37,10,3,30,15,29]),function(q,n,M,A,i,d,b,p,h,o,L,e){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.computeMovedLines=void 0;function a(E,S,C,r,s,l){let{moves:_,excludedChanges:g}=c(E,S,C,l);if(!l.isValid())return[];const v=E.filter(N=>!g.has(N)),R=m(v,r,s,S,C,l);return(0,i.pushMany)(_,R),_=y(_),_=_.filter(N=>{const D=N.original.toOffsetRange().slice(S).map(T=>T.trim());return D.join(`
+`).length>=15&&u(D,T=>T.length>=2)>=2}),_=w(E,_),_}n.computeMovedLines=a;function u(E,S){let C=0;for(const r of E)S(r)&&C++;return C}function c(E,S,C,r){const s=[],l=E.filter(v=>v.modified.isEmpty&&v.original.length>=3).map(v=>new L.LineRangeFragment(v.original,S,v)),_=new Set(E.filter(v=>v.original.isEmpty&&v.modified.length>=3).map(v=>new L.LineRangeFragment(v.modified,C,v))),g=new Set;for(const v of l){let R=-1,N;for(const D of _){const x=v.computeSimilarity(D);x>R&&(R=x,N=D)}if(R>.9&&N&&(_.delete(N),s.push(new A.LineRangeMapping(v.range,N.range)),g.add(v.source),g.add(N.source)),!r.isValid())return{moves:s,excludedChanges:g}}return{moves:s,excludedChanges:g}}function m(E,S,C,r,s,l){const _=[],g=new b.SetMap;for(const x of E)for(let T=x.original.startLineNumber;T<x.original.endLineNumberExclusive-2;T++){const F=`${S[T-1]}:${S[T+1-1]}:${S[T+2-1]}`;g.add(F,{range:new p.LineRange(T,T+3)})}const v=[];E.sort((0,i.compareBy)(x=>x.modified.startLineNumber,i.numberComparator));for(const x of E){let T=[];for(let F=x.modified.startLineNumber;F<x.modified.endLineNumberExclusive-2;F++){const B=`${C[F-1]}:${C[F+1-1]}:${C[F+2-1]}`,V=new p.LineRange(F,F+3),k=[];g.forEach(B,({range:O})=>{for(const W of T)if(W.originalLineRange.endLineNumberExclusive+1===O.endLineNumberExclusive&&W.modifiedLineRange.endLineNumberExclusive+1===V.endLineNumberExclusive){W.originalLineRange=new p.LineRange(W.originalLineRange.startLineNumber,O.endLineNumberExclusive),W.modifiedLineRange=new p.LineRange(W.modifiedLineRange.startLineNumber,V.endLineNumberExclusive),k.push(W);return}const I={modifiedLineRange:V,originalLineRange:O};v.push(I),k.push(I)}),T=k}if(!l.isValid())return[]}v.sort((0,i.reverseOrder)((0,i.compareBy)(x=>x.modifiedLineRange.length,i.numberComparator)));const R=new p.LineRangeSet,N=new p.LineRangeSet;for(const x of v){const T=x.modifiedLineRange.startLineNumber-x.originalLineRange.startLineNumber,F=R.subtractFrom(x.modifiedLineRange),B=N.subtractFrom(x.originalLineRange).getWithDelta(T),V=F.getIntersection(B);for(const k of V.ranges){if(k.length<3)continue;const O=k,I=k.delta(-T);_.push(new A.LineRangeMapping(I,O)),R.addRange(O),N.addRange(I)}}_.sort((0,i.compareBy)(x=>x.original.startLineNumber,i.numberComparator));const D=new d.MonotonousArray(E);for(let x=0;x<_.length;x++){const T=_[x],F=D.findLastMonotonous(G=>G.original.startLineNumber<=T.original.startLineNumber),B=(0,d.findLastMonotonous)(E,G=>G.modified.startLineNumber<=T.modified.startLineNumber),V=Math.max(T.original.startLineNumber-F.original.startLineNumber,T.modified.startLineNumber-B.modified.startLineNumber),k=D.findLastMonotonous(G=>G.original.startLineNumber<T.original.endLineNumberExclusive),O=(0,d.findLastMonotonous)(E,G=>G.modified.startLineNumber<T.modified.endLineNumberExclusive),I=Math.max(k.original.endLineNumberExclusive-T.original.endLineNumberExclusive,O.modified.endLineNumberExclusive-T.modified.endLineNumberExclusive);let W;for(W=0;W<V;W++){const G=T.original.startLineNumber-W-1,t=T.modified.startLineNumber-W-1;if(G>r.length||t>s.length||R.contains(t)||N.contains(G)||!f(r[G-1],s[t-1],l))break}W>0&&(N.addRange(new p.LineRange(T.original.startLineNumber-W,T.original.startLineNumber)),R.addRange(new p.LineRange(T.modified.startLineNumber-W,T.modified.startLineNumber)));let z;for(z=0;z<I;z++){const G=T.original.endLineNumberExclusive+z,t=T.modified.endLineNumberExclusive+z;if(G>r.length||t>s.length||R.contains(t)||N.contains(G)||!f(r[G-1],s[t-1],l))break}z>0&&(N.addRange(new p.LineRange(T.original.endLineNumberExclusive,T.original.endLineNumberExclusive+z)),R.addRange(new p.LineRange(T.modified.endLineNumberExclusive,T.modified.endLineNumberExclusive+z))),(W>0||z>0)&&(_[x]=new A.LineRangeMapping(new p.LineRange(T.original.startLineNumber-W,T.original.endLineNumberExclusive+z),new p.LineRange(T.modified.startLineNumber-W,T.modified.endLineNumberExclusive+z)))}return _}function f(E,S,C){if(E.trim()===S.trim())return!0;if(E.length>300&&S.length>300)return!1;const s=new e.MyersDiffAlgorithm().compute(new o.LinesSliceCharSequence([E],new h.OffsetRange(0,1),!1),new o.LinesSliceCharSequence([S],new h.OffsetRange(0,1),!1),C);let l=0;const _=M.SequenceDiff.invert(s.diffs,E.length);for(const N of _)N.seq1Range.forEach(D=>{(0,L.isSpace)(E.charCodeAt(D))||l++});function g(N){let D=0;for(let x=0;x<E.length;x++)(0,L.isSpace)(N.charCodeAt(x))||D++;return D}const v=g(E.length>S.length?E:S);return l/v>.6&&v>10}function y(E){if(E.length===0)return E;E.sort((0,i.compareBy)(C=>C.original.startLineNumber,i.numberComparator));const S=[E[0]];for(let C=1;C<E.length;C++){const r=S[S.length-1],s=E[C],l=s.original.startLineNumber-r.original.endLineNumberExclusive,_=s.modified.startLineNumber-r.modified.endLineNumberExclusive;if(l>=0&&_>=0&&l+_<=2){S[S.length-1]=r.join(s);continue}S.push(s)}return S}function w(E,S){const C=new d.MonotonousArray(E);return S=S.filter(r=>{const s=C.findLastMonotonous(g=>g.original.startLineNumber<r.original.endLineNumberExclusive)||new A.LineRangeMapping(new p.LineRange(1,1),new p.LineRange(1,1)),l=(0,d.findLastMonotonous)(E,g=>g.modified.startLineNumber<r.modified.endLineNumberExclusive);return s!==l}),S}}),Y(X[47],J([0,1,7,12,10,3,2,8,45,29,46,43,31,16,30,44]),function(q,n,M,A,i,d,b,p,h,o,L,e,a,u,c,m){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.getLineRangeMapping=n.lineRangeMappingFromRangeMappings=n.DefaultLinesDiffComputer=void 0;class f{constructor(){this.dynamicProgrammingDiffing=new h.DynamicProgrammingDiffing,this.myersDiffingAlgorithm=new o.MyersDiffAlgorithm}computeDiff(S,C,r){if(S.length<=1&&(0,M.equals)(S,C,(z,G)=>z===G))return new a.LinesDiff([],[],!1);if(S.length===1&&S[0].length===0||C.length===1&&C[0].length===0)return new a.LinesDiff([new u.DetailedLineRangeMapping(new i.LineRange(1,S.length+1),new i.LineRange(1,C.length+1),[new u.RangeMapping(new b.Range(1,1,S.length,S[0].length+1),new b.Range(1,1,C.length,C[0].length+1))])],[],!1);const s=r.maxComputationTimeMs===0?p.InfiniteTimeout.instance:new p.DateTimeout(r.maxComputationTimeMs),l=!r.ignoreTrimWhitespace,_=new Map;function g(z){let G=_.get(z);return G===void 0&&(G=_.size,_.set(z,G)),G}const v=S.map(z=>g(z.trim())),R=C.map(z=>g(z.trim())),N=new m.LineSequence(v,S),D=new m.LineSequence(R,C),x=(()=>N.length+D.length<1700?this.dynamicProgrammingDiffing.compute(N,D,s,(z,G)=>S[z]===C[G]?C[G].length===0?.1:1+Math.log(1+C[G].length):.99):this.myersDiffingAlgorithm.compute(N,D))();let T=x.diffs,F=x.hitTimeout;T=(0,e.optimizeSequenceDiffs)(N,D,T),T=(0,e.removeVeryShortMatchingLinesBetweenDiffs)(N,D,T);const B=[],V=z=>{if(l)for(let G=0;G<z;G++){const t=k+G,se=O+G;if(S[t]!==C[se]){const ce=this.refineDiff(S,C,new p.SequenceDiff(new d.OffsetRange(t,t+1),new d.OffsetRange(se,se+1)),s,l);for(const me of ce.mappings)B.push(me);ce.hitTimeout&&(F=!0)}}};let k=0,O=0;for(const z of T){(0,A.assertFn)(()=>z.seq1Range.start-k===z.seq2Range.start-O);const G=z.seq1Range.start-k;V(G),k=z.seq1Range.endExclusive,O=z.seq2Range.endExclusive;const t=this.refineDiff(S,C,z,s,l);t.hitTimeout&&(F=!0);for(const se of t.mappings)B.push(se)}V(S.length-k);const I=y(B,S,C);let W=[];return r.computeMoves&&(W=this.computeMoves(I,S,C,v,R,s,l)),(0,A.assertFn)(()=>{function z(t,se){if(t.lineNumber<1||t.lineNumber>se.length)return!1;const ce=se[t.lineNumber-1];return!(t.column<1||t.column>ce.length+1)}function G(t,se){return!(t.startLineNumber<1||t.startLineNumber>se.length+1||t.endLineNumberExclusive<1||t.endLineNumberExclusive>se.length+1)}for(const t of I){if(!t.innerChanges)return!1;for(const se of t.innerChanges)if(!(z(se.modifiedRange.getStartPosition(),C)&&z(se.modifiedRange.getEndPosition(),C)&&z(se.originalRange.getStartPosition(),S)&&z(se.originalRange.getEndPosition(),S)))return!1;if(!G(t.modified,C)||!G(t.original,S))return!1}return!0}),new a.LinesDiff(I,W,F)}computeMoves(S,C,r,s,l,_,g){return(0,L.computeMovedLines)(S,C,r,s,l,_).map(N=>{const D=this.refineDiff(C,r,new p.SequenceDiff(N.original.toOffsetRange(),N.modified.toOffsetRange()),_,g),x=y(D.mappings,C,r,!0);return new a.MovedText(N,x)})}refineDiff(S,C,r,s,l){const _=new c.LinesSliceCharSequence(S,r.seq1Range,l),g=new c.LinesSliceCharSequence(C,r.seq2Range,l),v=_.length+g.length<500?this.dynamicProgrammingDiffing.compute(_,g,s):this.myersDiffingAlgorithm.compute(_,g,s);let R=v.diffs;return R=(0,e.optimizeSequenceDiffs)(_,g,R),R=(0,e.extendDiffsToEntireWordIfAppropriate)(_,g,R),R=(0,e.removeShortMatches)(_,g,R),R=(0,e.removeVeryShortMatchingTextBetweenLongDiffs)(_,g,R),{mappings:R.map(D=>new u.RangeMapping(_.translateRange(D.seq1Range),g.translateRange(D.seq2Range))),hitTimeout:v.hitTimeout}}}n.DefaultLinesDiffComputer=f;function y(E,S,C,r=!1){const s=[];for(const l of(0,M.groupAdjacentBy)(E.map(_=>w(_,S,C)),(_,g)=>_.original.overlapOrTouch(g.original)||_.modified.overlapOrTouch(g.modified))){const _=l[0],g=l[l.length-1];s.push(new u.DetailedLineRangeMapping(_.original.join(g.original),_.modified.join(g.modified),l.map(v=>v.innerChanges[0])))}return(0,A.assertFn)(()=>!r&&s.length>0&&s[0].original.startLineNumber!==s[0].modified.startLineNumber?!1:(0,A.checkAdjacentItems)(s,(l,_)=>_.original.startLineNumber-l.original.endLineNumberExclusive===_.modified.startLineNumber-l.modified.endLineNumberExclusive&&l.original.endLineNumberExclusive<_.original.startLineNumber&&l.modified.endLineNumberExclusive<_.modified.startLineNumber)),s}n.lineRangeMappingFromRangeMappings=y;function w(E,S,C){let r=0,s=0;E.modifiedRange.endColumn===1&&E.originalRange.endColumn===1&&E.originalRange.startLineNumber+r<=E.originalRange.endLineNumber&&E.modifiedRange.startLineNumber+r<=E.modifiedRange.endLineNumber&&(s=-1),E.modifiedRange.startColumn-1>=C[E.modifiedRange.startLineNumber-1].length&&E.originalRange.startColumn-1>=S[E.originalRange.startLineNumber-1].length&&E.originalRange.startLineNumber<=E.originalRange.endLineNumber+s&&E.modifiedRange.startLineNumber<=E.modifiedRange.endLineNumber+s&&(r=1);const l=new i.LineRange(E.originalRange.startLineNumber+r,E.originalRange.endLineNumber+1+s),_=new i.LineRange(E.modifiedRange.startLineNumber+r,E.modifiedRange.endLineNumber+1+s);return new u.DetailedLineRangeMapping(l,_,[E])}n.getLineRangeMapping=w}),Y(X[48],J([0,1,24,31,16,6,2,12,10]),function(q,n,M,A,i,d,b,p,h){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.DiffComputer=n.LegacyLinesDiffComputer=void 0;const o=3;class L{computeDiff(r,s,l){var _;const v=new y(r,s,{maxComputationTime:l.maxComputationTimeMs,shouldIgnoreTrimWhitespace:l.ignoreTrimWhitespace,shouldComputeCharChanges:!0,shouldMakePrettyDiff:!0,shouldPostProcessCharChanges:!0}).computeDiff(),R=[];let N=null;for(const D of v.changes){let x;D.originalEndLineNumber===0?x=new h.LineRange(D.originalStartLineNumber+1,D.originalStartLineNumber+1):x=new h.LineRange(D.originalStartLineNumber,D.originalEndLineNumber+1);let T;D.modifiedEndLineNumber===0?T=new h.LineRange(D.modifiedStartLineNumber+1,D.modifiedStartLineNumber+1):T=new h.LineRange(D.modifiedStartLineNumber,D.modifiedEndLineNumber+1);let F=new i.DetailedLineRangeMapping(x,T,(_=D.charChanges)===null||_===void 0?void 0:_.map(B=>new i.RangeMapping(new b.Range(B.originalStartLineNumber,B.originalStartColumn,B.originalEndLineNumber,B.originalEndColumn),new b.Range(B.modifiedStartLineNumber,B.modifiedStartColumn,B.modifiedEndLineNumber,B.modifiedEndColumn))));N&&(N.modified.endLineNumberExclusive===F.modified.startLineNumber||N.original.endLineNumberExclusive===F.original.startLineNumber)&&(F=new i.DetailedLineRangeMapping(N.original.join(F.original),N.modified.join(F.modified),N.innerChanges&&F.innerChanges?N.innerChanges.concat(F.innerChanges):void 0),R.pop()),R.push(F),N=F}return(0,p.assertFn)(()=>(0,p.checkAdjacentItems)(R,(D,x)=>x.original.startLineNumber-D.original.endLineNumberExclusive===x.modified.startLineNumber-D.modified.endLineNumberExclusive&&D.original.endLineNumberExclusive<x.original.startLineNumber&&D.modified.endLineNumberExclusive<x.modified.startLineNumber)),new A.LinesDiff(R,[],v.quitEarly)}}n.LegacyLinesDiffComputer=L;function e(C,r,s,l){return new M.LcsDiff(C,r,s).ComputeDiff(l)}class a{constructor(r){const s=[],l=[];for(let _=0,g=r.length;_<g;_++)s[_]=w(r[_],1),l[_]=E(r[_],1);this.lines=r,this._startColumns=s,this._endColumns=l}getElements(){const r=[];for(let s=0,l=this.lines.length;s<l;s++)r[s]=this.lines[s].substring(this._startColumns[s]-1,this._endColumns[s]-1);return r}getStrictElement(r){return this.lines[r]}getStartLineNumber(r){return r+1}getEndLineNumber(r){return r+1}createCharSequence(r,s,l){const _=[],g=[],v=[];let R=0;for(let N=s;N<=l;N++){const D=this.lines[N],x=r?this._startColumns[N]:1,T=r?this._endColumns[N]:D.length+1;for(let F=x;F<T;F++)_[R]=D.charCodeAt(F-1),g[R]=N+1,v[R]=F,R++;!r&&N<l&&(_[R]=10,g[R]=N+1,v[R]=D.length+1,R++)}return new u(_,g,v)}}class u{constructor(r,s,l){this._charCodes=r,this._lineNumbers=s,this._columns=l}toString(){return"["+this._charCodes.map((r,s)=>(r===10?"\\n":String.fromCharCode(r))+`-(${this._lineNumbers[s]},${this._columns[s]})`).join(", ")+"]"}_assertIndex(r,s){if(r<0||r>=s.length)throw new Error("Illegal index")}getElements(){return this._charCodes}getStartLineNumber(r){return r>0&&r===this._lineNumbers.length?this.getEndLineNumber(r-1):(this._assertIndex(r,this._lineNumbers),this._lineNumbers[r])}getEndLineNumber(r){return r===-1?this.getStartLineNumber(r+1):(this._assertIndex(r,this._lineNumbers),this._charCodes[r]===10?this._lineNumbers[r]+1:this._lineNumbers[r])}getStartColumn(r){return r>0&&r===this._columns.length?this.getEndColumn(r-1):(this._assertIndex(r,this._columns),this._columns[r])}getEndColumn(r){return r===-1?this.getStartColumn(r+1):(this._assertIndex(r,this._columns),this._charCodes[r]===10?1:this._columns[r]+1)}}class c{constructor(r,s,l,_,g,v,R,N){this.originalStartLineNumber=r,this.originalStartColumn=s,this.originalEndLineNumber=l,this.originalEndColumn=_,this.modifiedStartLineNumber=g,this.modifiedStartColumn=v,this.modifiedEndLineNumber=R,this.modifiedEndColumn=N}static createFromDiffChange(r,s,l){const _=s.getStartLineNumber(r.originalStart),g=s.getStartColumn(r.originalStart),v=s.getEndLineNumber(r.originalStart+r.originalLength-1),R=s.getEndColumn(r.originalStart+r.originalLength-1),N=l.getStartLineNumber(r.modifiedStart),D=l.getStartColumn(r.modifiedStart),x=l.getEndLineNumber(r.modifiedStart+r.modifiedLength-1),T=l.getEndColumn(r.modifiedStart+r.modifiedLength-1);return new c(_,g,v,R,N,D,x,T)}}function m(C){if(C.length<=1)return C;const r=[C[0]];let s=r[0];for(let l=1,_=C.length;l<_;l++){const g=C[l],v=g.originalStart-(s.originalStart+s.originalLength),R=g.modifiedStart-(s.modifiedStart+s.modifiedLength);Math.min(v,R)<o?(s.originalLength=g.originalStart+g.originalLength-s.originalStart,s.modifiedLength=g.modifiedStart+g.modifiedLength-s.modifiedStart):(r.push(g),s=g)}return r}class f{constructor(r,s,l,_,g){this.originalStartLineNumber=r,this.originalEndLineNumber=s,this.modifiedStartLineNumber=l,this.modifiedEndLineNumber=_,this.charChanges=g}static createFromDiffResult(r,s,l,_,g,v,R){let N,D,x,T,F;if(s.originalLength===0?(N=l.getStartLineNumber(s.originalStart)-1,D=0):(N=l.getStartLineNumber(s.originalStart),D=l.getEndLineNumber(s.originalStart+s.originalLength-1)),s.modifiedLength===0?(x=_.getStartLineNumber(s.modifiedStart)-1,T=0):(x=_.getStartLineNumber(s.modifiedStart),T=_.getEndLineNumber(s.modifiedStart+s.modifiedLength-1)),v&&s.originalLength>0&&s.originalLength<20&&s.modifiedLength>0&&s.modifiedLength<20&&g()){const B=l.createCharSequence(r,s.originalStart,s.originalStart+s.originalLength-1),V=_.createCharSequence(r,s.modifiedStart,s.modifiedStart+s.modifiedLength-1);if(B.getElements().length>0&&V.getElements().length>0){let k=e(B,V,g,!0).changes;R&&(k=m(k)),F=[];for(let O=0,I=k.length;O<I;O++)F.push(c.createFromDiffChange(k[O],B,V))}}return new f(N,D,x,T,F)}}class y{constructor(r,s,l){this.shouldComputeCharChanges=l.shouldComputeCharChanges,this.shouldPostProcessCharChanges=l.shouldPostProcessCharChanges,this.shouldIgnoreTrimWhitespace=l.shouldIgnoreTrimWhitespace,this.shouldMakePrettyDiff=l.shouldMakePrettyDiff,this.originalLines=r,this.modifiedLines=s,this.original=new a(r),this.modified=new a(s),this.continueLineDiff=S(l.maxComputationTime),this.continueCharDiff=S(l.maxComputationTime===0?0:Math.min(l.maxComputationTime,5e3))}computeDiff(){if(this.original.lines.length===1&&this.original.lines[0].length===0)return this.modified.lines.length===1&&this.modified.lines[0].length===0?{quitEarly:!1,changes:[]}:{quitEarly:!1,changes:[{originalStartLineNumber:1,originalEndLineNumber:1,modifiedStartLineNumber:1,modifiedEndLineNumber:this.modified.lines.length,charChanges:void 0}]};if(this.modified.lines.length===1&&this.modified.lines[0].length===0)return{quitEarly:!1,changes:[{originalStartLineNumber:1,originalEndLineNumber:this.original.lines.length,modifiedStartLineNumber:1,modifiedEndLineNumber:1,charChanges:void 0}]};const r=e(this.original,this.modified,this.continueLineDiff,this.shouldMakePrettyDiff),s=r.changes,l=r.quitEarly;if(this.shouldIgnoreTrimWhitespace){const R=[];for(let N=0,D=s.length;N<D;N++)R.push(f.createFromDiffResult(this.shouldIgnoreTrimWhitespace,s[N],this.original,this.modified,this.continueCharDiff,this.shouldComputeCharChanges,this.shouldPostProcessCharChanges));return{quitEarly:l,changes:R}}const _=[];let g=0,v=0;for(let R=-1,N=s.length;R<N;R++){const D=R+1<N?s[R+1]:null,x=D?D.originalStart:this.originalLines.length,T=D?D.modifiedStart:this.modifiedLines.length;for(;g<x&&v<T;){const F=this.originalLines[g],B=this.modifiedLines[v];if(F!==B){{let V=w(F,1),k=w(B,1);for(;V>1&&k>1;){const O=F.charCodeAt(V-2),I=B.charCodeAt(k-2);if(O!==I)break;V--,k--}(V>1||k>1)&&this._pushTrimWhitespaceCharChange(_,g+1,1,V,v+1,1,k)}{let V=E(F,1),k=E(B,1);const O=F.length+1,I=B.length+1;for(;V<O&&k<I;){const W=F.charCodeAt(V-1),z=F.charCodeAt(k-1);if(W!==z)break;V++,k++}(V<O||k<I)&&this._pushTrimWhitespaceCharChange(_,g+1,V,O,v+1,k,I)}}g++,v++}D&&(_.push(f.createFromDiffResult(this.shouldIgnoreTrimWhitespace,D,this.original,this.modified,this.continueCharDiff,this.shouldComputeCharChanges,this.shouldPostProcessCharChanges)),g+=D.originalLength,v+=D.modifiedLength)}return{quitEarly:l,changes:_}}_pushTrimWhitespaceCharChange(r,s,l,_,g,v,R){if(this._mergeTrimWhitespaceCharChange(r,s,l,_,g,v,R))return;let N;this.shouldComputeCharChanges&&(N=[new c(s,l,s,_,g,v,g,R)]),r.push(new f(s,s,g,g,N))}_mergeTrimWhitespaceCharChange(r,s,l,_,g,v,R){const N=r.length;if(N===0)return!1;const D=r[N-1];return D.originalEndLineNumber===0||D.modifiedEndLineNumber===0?!1:D.originalEndLineNumber===s&&D.modifiedEndLineNumber===g?(this.shouldComputeCharChanges&&D.charChanges&&D.charChanges.push(new c(s,l,s,_,g,v,g,R)),!0):D.originalEndLineNumber+1===s&&D.modifiedEndLineNumber+1===g?(D.originalEndLineNumber=s,D.modifiedEndLineNumber=g,this.shouldComputeCharChanges&&D.charChanges&&D.charChanges.push(new c(s,l,s,_,g,v,g,R)),!0):!1}}n.DiffComputer=y;function w(C,r){const s=d.firstNonWhitespaceIndex(C);return s===-1?r:s+1}function E(C,r){const s=d.lastNonWhitespaceIndex(C);return s===-1?r:s+2}function S(C){if(C===0)return()=>!0;const r=Date.now();return()=>Date.now()-r<C}}),Y(X[49],J([0,1,48,47]),function(q,n,M,A){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.linesDiffComputers=void 0,n.linesDiffComputers={getLegacy:()=>new M.LegacyLinesDiffComputer,getDefault:()=>new A.DefaultLinesDiffComputer}}),Y(X[50],J([0,1,33]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.computeDefaultDocumentColors=void 0;function A(a){const u=[];for(const c of a){const m=Number(c);(m||m===0&&c.replace(/\s/g,"")!=="")&&u.push(m)}return u}function i(a,u,c,m){return{red:a/255,blue:c/255,green:u/255,alpha:m}}function d(a,u){const c=u.index,m=u[0].length;if(!c)return;const f=a.positionAt(c);return{startLineNumber:f.lineNumber,startColumn:f.column,endLineNumber:f.lineNumber,endColumn:f.column+m}}function b(a,u){if(!a)return;const c=M.Color.Format.CSS.parseHex(u);if(c)return{range:a,color:i(c.rgba.r,c.rgba.g,c.rgba.b,c.rgba.a)}}function p(a,u,c){if(!a||u.length!==1)return;const f=u[0].values(),y=A(f);return{range:a,color:i(y[0],y[1],y[2],c?y[3]:1)}}function h(a,u,c){if(!a||u.length!==1)return;const f=u[0].values(),y=A(f),w=new M.Color(new M.HSLA(y[0],y[1]/100,y[2]/100,c?y[3]:1));return{range:a,color:i(w.rgba.r,w.rgba.g,w.rgba.b,w.rgba.a)}}function o(a,u){return typeof a=="string"?[...a.matchAll(u)]:a.findMatches(u)}function L(a){const u=[],m=o(a,/\b(rgb|rgba|hsl|hsla)(\([0-9\s,.\%]*\))|(#)([A-Fa-f0-9]{3})\b|(#)([A-Fa-f0-9]{4})\b|(#)([A-Fa-f0-9]{6})\b|(#)([A-Fa-f0-9]{8})\b/gm);if(m.length>0)for(const f of m){const y=f.filter(C=>C!==void 0),w=y[1],E=y[2];if(!E)continue;let S;if(w==="rgb"){const C=/^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*\)$/gm;S=p(d(a,f),o(E,C),!1)}else if(w==="rgba"){const C=/^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm;S=p(d(a,f),o(E,C),!0)}else if(w==="hsl"){const C=/^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*\)$/gm;S=h(d(a,f),o(E,C),!1)}else if(w==="hsla"){const C=/^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm;S=h(d(a,f),o(E,C),!0)}else w==="#"&&(S=b(d(a,f),w+E));S&&u.push(S)}return u}function e(a){return!a||typeof a.getValue!="function"||typeof a.positionAt!="function"?[]:L(a)}n.computeDefaultDocumentColors=e}),Y(X[51],J([0,1,27]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.computeLinks=n.LinkComputer=n.StateMachine=void 0;class A{constructor(a,u,c){const m=new Uint8Array(a*u);for(let f=0,y=a*u;f<y;f++)m[f]=c;this._data=m,this.rows=a,this.cols=u}get(a,u){return this._data[a*this.cols+u]}set(a,u,c){this._data[a*this.cols+u]=c}}class i{constructor(a){let u=0,c=0;for(let f=0,y=a.length;f<y;f++){const[w,E,S]=a[f];E>u&&(u=E),w>c&&(c=w),S>c&&(c=S)}u++,c++;const m=new A(c,u,0);for(let f=0,y=a.length;f<y;f++){const[w,E,S]=a[f];m.set(w,E,S)}this._states=m,this._maxCharCode=u}nextState(a,u){return u<0||u>=this._maxCharCode?0:this._states.get(a,u)}}n.StateMachine=i;let d=null;function b(){return d===null&&(d=new i([[1,104,2],[1,72,2],[1,102,6],[1,70,6],[2,116,3],[2,84,3],[3,116,4],[3,84,4],[4,112,5],[4,80,5],[5,115,9],[5,83,9],[5,58,10],[6,105,7],[6,73,7],[7,108,8],[7,76,8],[8,101,9],[8,69,9],[9,58,10],[10,47,11],[11,47,12]])),d}let p=null;function h(){if(p===null){p=new M.CharacterClassifier(0);const e=` 	<>'"\u3001\u3002\uFF61\uFF64\uFF0C\uFF0E\uFF1A\uFF1B\u2018\u3008\u300C\u300E\u3014\uFF08\uFF3B\uFF5B\uFF62\uFF63\uFF5D\uFF3D\uFF09\u3015\u300F\u300D\u3009\u2019\uFF40\uFF5E\u2026`;for(let u=0;u<e.length;u++)p.set(e.charCodeAt(u),1);const a=".,;:";for(let u=0;u<a.length;u++)p.set(a.charCodeAt(u),2)}return p}class o{static _createLink(a,u,c,m,f){let y=f-1;do{const w=u.charCodeAt(y);if(a.get(w)!==2)break;y--}while(y>m);if(m>0){const w=u.charCodeAt(m-1),E=u.charCodeAt(y);(w===40&&E===41||w===91&&E===93||w===123&&E===125)&&y--}return{range:{startLineNumber:c,startColumn:m+1,endLineNumber:c,endColumn:y+2},url:u.substring(m,y+1)}}static computeLinks(a,u=b()){const c=h(),m=[];for(let f=1,y=a.getLineCount();f<=y;f++){const w=a.getLineContent(f),E=w.length;let S=0,C=0,r=0,s=1,l=!1,_=!1,g=!1,v=!1;for(;S<E;){let R=!1;const N=w.charCodeAt(S);if(s===13){let D;switch(N){case 40:l=!0,D=0;break;case 41:D=l?0:1;break;case 91:g=!0,_=!0,D=0;break;case 93:g=!1,D=_?0:1;break;case 123:v=!0,D=0;break;case 125:D=v?0:1;break;case 39:case 34:case 96:r===N?D=1:r===39||r===34||r===96?D=0:D=1;break;case 42:D=r===42?1:0;break;case 124:D=r===124?1:0;break;case 32:D=g?0:1;break;default:D=c.get(N)}D===1&&(m.push(o._createLink(c,w,f,C,S)),R=!0)}else if(s===12){let D;N===91?(_=!0,D=0):D=c.get(N),D===1?R=!0:s=13}else s=u.nextState(s,N),s===0&&(R=!0);R&&(s=1,l=!1,_=!1,v=!1,C=S+1,r=N),S++}s===13&&m.push(o._createLink(c,w,f,C,E))}return m}}n.LinkComputer=o;function L(e){return!e||typeof e.getLineCount!="function"||typeof e.getLineContent!="function"?[]:o.computeLinks(e)}n.computeLinks=L}),Y(X[52],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.BasicInplaceReplace=void 0;class M{constructor(){this._defaultValueSet=[["true","false"],["True","False"],["Private","Public","Friend","ReadOnly","Partial","Protected","WriteOnly"],["public","protected","private"]]}navigateValueSet(i,d,b,p,h){if(i&&d){const o=this.doNavigateValueSet(d,h);if(o)return{range:i,value:o}}if(b&&p){const o=this.doNavigateValueSet(p,h);if(o)return{range:b,value:o}}return null}doNavigateValueSet(i,d){const b=this.numberReplace(i,d);return b!==null?b:this.textReplace(i,d)}numberReplace(i,d){const b=Math.pow(10,i.length-(i.lastIndexOf(".")+1));let p=Number(i);const h=parseFloat(i);return!isNaN(p)&&!isNaN(h)&&p===h?p===0&&!d?null:(p=Math.floor(p*b),p+=d?b:-b,String(p/b)):null}textReplace(i,d){return this.valueSetsReplace(this._defaultValueSet,i,d)}valueSetsReplace(i,d,b){let p=null;for(let h=0,o=i.length;p===null&&h<o;h++)p=this.valueSetReplace(i[h],d,b);return p}valueSetReplace(i,d,b){let p=i.indexOf(d);return p>=0?(p+=b?1:-1,p<0?p=i.length-1:p%=i.length,i[p]):null}}n.BasicInplaceReplace=M,M.INSTANCE=new M}),Y(X[53],J([0,1,14]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.shouldSynchronizeModel=n.ApplyEditsResult=n.SearchData=n.ValidAnnotatedEditOperation=n.isITextSnapshot=n.FindMatch=n.TextModelResolvedOptions=n.InjectedTextCursorStops=n.MinimapPosition=n.GlyphMarginLane=n.OverviewRulerLane=void 0;var A;(function(c){c[c.Left=1]="Left",c[c.Center=2]="Center",c[c.Right=4]="Right",c[c.Full=7]="Full"})(A||(n.OverviewRulerLane=A={}));var i;(function(c){c[c.Left=1]="Left",c[c.Center=2]="Center",c[c.Right=3]="Right"})(i||(n.GlyphMarginLane=i={}));var d;(function(c){c[c.Inline=1]="Inline",c[c.Gutter=2]="Gutter"})(d||(n.MinimapPosition=d={}));var b;(function(c){c[c.Both=0]="Both",c[c.Right=1]="Right",c[c.Left=2]="Left",c[c.None=3]="None"})(b||(n.InjectedTextCursorStops=b={}));class p{get originalIndentSize(){return this._indentSizeIsTabSize?"tabSize":this.indentSize}constructor(m){this._textModelResolvedOptionsBrand=void 0,this.tabSize=Math.max(1,m.tabSize|0),m.indentSize==="tabSize"?(this.indentSize=this.tabSize,this._indentSizeIsTabSize=!0):(this.indentSize=Math.max(1,m.indentSize|0),this._indentSizeIsTabSize=!1),this.insertSpaces=!!m.insertSpaces,this.defaultEOL=m.defaultEOL|0,this.trimAutoWhitespace=!!m.trimAutoWhitespace,this.bracketPairColorizationOptions=m.bracketPairColorizationOptions}equals(m){return this.tabSize===m.tabSize&&this._indentSizeIsTabSize===m._indentSizeIsTabSize&&this.indentSize===m.indentSize&&this.insertSpaces===m.insertSpaces&&this.defaultEOL===m.defaultEOL&&this.trimAutoWhitespace===m.trimAutoWhitespace&&(0,M.equals)(this.bracketPairColorizationOptions,m.bracketPairColorizationOptions)}createChangeEvent(m){return{tabSize:this.tabSize!==m.tabSize,indentSize:this.indentSize!==m.indentSize,insertSpaces:this.insertSpaces!==m.insertSpaces,trimAutoWhitespace:this.trimAutoWhitespace!==m.trimAutoWhitespace}}}n.TextModelResolvedOptions=p;class h{constructor(m,f){this._findMatchBrand=void 0,this.range=m,this.matches=f}}n.FindMatch=h;function o(c){return c&&typeof c.read=="function"}n.isITextSnapshot=o;class L{constructor(m,f,y,w,E,S){this.identifier=m,this.range=f,this.text=y,this.forceMoveMarkers=w,this.isAutoWhitespaceEdit=E,this._isTracked=S}}n.ValidAnnotatedEditOperation=L;class e{constructor(m,f,y){this.regex=m,this.wordSeparators=f,this.simpleSearch=y}}n.SearchData=e;class a{constructor(m,f,y){this.reverseEdits=m,this.changes=f,this.trimAutoWhitespaceLineNumbers=y}}n.ApplyEditsResult=a;function u(c){return!c.isTooLargeForSyncing()&&!c.isForSimpleWidget}n.shouldSynchronizeModel=u}),Y(X[54],J([0,1,7,26]),function(q,n,M,A){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.PrefixSumIndexOfResult=n.ConstantTimePrefixSumComputer=n.PrefixSumComputer=void 0;class i{constructor(h){this.values=h,this.prefixSum=new Uint32Array(h.length),this.prefixSumValidIndex=new Int32Array(1),this.prefixSumValidIndex[0]=-1}insertValues(h,o){h=(0,A.toUint32)(h);const L=this.values,e=this.prefixSum,a=o.length;return a===0?!1:(this.values=new Uint32Array(L.length+a),this.values.set(L.subarray(0,h),0),this.values.set(L.subarray(h),h+a),this.values.set(o,h),h-1<this.prefixSumValidIndex[0]&&(this.prefixSumValidIndex[0]=h-1),this.prefixSum=new Uint32Array(this.values.length),this.prefixSumValidIndex[0]>=0&&this.prefixSum.set(e.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}setValue(h,o){return h=(0,A.toUint32)(h),o=(0,A.toUint32)(o),this.values[h]===o?!1:(this.values[h]=o,h-1<this.prefixSumValidIndex[0]&&(this.prefixSumValidIndex[0]=h-1),!0)}removeValues(h,o){h=(0,A.toUint32)(h),o=(0,A.toUint32)(o);const L=this.values,e=this.prefixSum;if(h>=L.length)return!1;const a=L.length-h;return o>=a&&(o=a),o===0?!1:(this.values=new Uint32Array(L.length-o),this.values.set(L.subarray(0,h),0),this.values.set(L.subarray(h+o),h),this.prefixSum=new Uint32Array(this.values.length),h-1<this.prefixSumValidIndex[0]&&(this.prefixSumValidIndex[0]=h-1),this.prefixSumValidIndex[0]>=0&&this.prefixSum.set(e.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}getTotalSum(){return this.values.length===0?0:this._getPrefixSum(this.values.length-1)}getPrefixSum(h){return h<0?0:(h=(0,A.toUint32)(h),this._getPrefixSum(h))}_getPrefixSum(h){if(h<=this.prefixSumValidIndex[0])return this.prefixSum[h];let o=this.prefixSumValidIndex[0]+1;o===0&&(this.prefixSum[0]=this.values[0],o++),h>=this.values.length&&(h=this.values.length-1);for(let L=o;L<=h;L++)this.prefixSum[L]=this.prefixSum[L-1]+this.values[L];return this.prefixSumValidIndex[0]=Math.max(this.prefixSumValidIndex[0],h),this.prefixSum[h]}getIndexOf(h){h=Math.floor(h),this.getTotalSum();let o=0,L=this.values.length-1,e=0,a=0,u=0;for(;o<=L;)if(e=o+(L-o)/2|0,a=this.prefixSum[e],u=a-this.values[e],h<u)L=e-1;else if(h>=a)o=e+1;else break;return new b(e,h-u)}}n.PrefixSumComputer=i;class d{constructor(h){this._values=h,this._isValid=!1,this._validEndIndex=-1,this._prefixSum=[],this._indexBySum=[]}getTotalSum(){return this._ensureValid(),this._indexBySum.length}getPrefixSum(h){return this._ensureValid(),h===0?0:this._prefixSum[h-1]}getIndexOf(h){this._ensureValid();const o=this._indexBySum[h],L=o>0?this._prefixSum[o-1]:0;return new b(o,h-L)}removeValues(h,o){this._values.splice(h,o),this._invalidate(h)}insertValues(h,o){this._values=(0,M.arrayInsert)(this._values,h,o),this._invalidate(h)}_invalidate(h){this._isValid=!1,this._validEndIndex=Math.min(this._validEndIndex,h-1)}_ensureValid(){if(!this._isValid){for(let h=this._validEndIndex+1,o=this._values.length;h<o;h++){const L=this._values[h],e=h>0?this._prefixSum[h-1]:0;this._prefixSum[h]=e+L;for(let a=0;a<L;a++)this._indexBySum[e+a]=h}this._prefixSum.length=this._values.length,this._indexBySum.length=this._prefixSum[this._prefixSum.length-1],this._isValid=!0,this._validEndIndex=this._values.length-1}}setValue(h,o){this._values[h]!==o&&(this._values[h]=o,this._invalidate(h))}}n.ConstantTimePrefixSumComputer=d;class b{constructor(h,o){this.index=h,this.remainder=o,this._prefixSumIndexOfResultBrand=void 0,this.index=h,this.remainder=o}}n.PrefixSumIndexOfResult=b}),Y(X[55],J([0,1,6,4,54]),function(q,n,M,A,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.MirrorTextModel=void 0;class d{constructor(p,h,o,L){this._uri=p,this._lines=h,this._eol=o,this._versionId=L,this._lineStarts=null,this._cachedTextValue=null}dispose(){this._lines.length=0}get version(){return this._versionId}getText(){return this._cachedTextValue===null&&(this._cachedTextValue=this._lines.join(this._eol)),this._cachedTextValue}onEvents(p){p.eol&&p.eol!==this._eol&&(this._eol=p.eol,this._lineStarts=null);const h=p.changes;for(const o of h)this._acceptDeleteRange(o.range),this._acceptInsertText(new A.Position(o.range.startLineNumber,o.range.startColumn),o.text);this._versionId=p.versionId,this._cachedTextValue=null}_ensureLineStarts(){if(!this._lineStarts){const p=this._eol.length,h=this._lines.length,o=new Uint32Array(h);for(let L=0;L<h;L++)o[L]=this._lines[L].length+p;this._lineStarts=new i.PrefixSumComputer(o)}}_setLineText(p,h){this._lines[p]=h,this._lineStarts&&this._lineStarts.setValue(p,this._lines[p].length+this._eol.length)}_acceptDeleteRange(p){if(p.startLineNumber===p.endLineNumber){if(p.startColumn===p.endColumn)return;this._setLineText(p.startLineNumber-1,this._lines[p.startLineNumber-1].substring(0,p.startColumn-1)+this._lines[p.startLineNumber-1].substring(p.endColumn-1));return}this._setLineText(p.startLineNumber-1,this._lines[p.startLineNumber-1].substring(0,p.startColumn-1)+this._lines[p.endLineNumber-1].substring(p.endColumn-1)),this._lines.splice(p.startLineNumber,p.endLineNumber-p.startLineNumber),this._lineStarts&&this._lineStarts.removeValues(p.startLineNumber,p.endLineNumber-p.startLineNumber)}_acceptInsertText(p,h){if(h.length===0)return;const o=(0,M.splitLines)(h);if(o.length===1){this._setLineText(p.lineNumber-1,this._lines[p.lineNumber-1].substring(0,p.column-1)+o[0]+this._lines[p.lineNumber-1].substring(p.column-1));return}o[o.length-1]+=this._lines[p.lineNumber-1].substring(p.column-1),this._setLineText(p.lineNumber-1,this._lines[p.lineNumber-1].substring(0,p.column-1)+o[0]);const L=new Uint32Array(o.length-1);for(let e=1;e<o.length;e++)this._lines.splice(p.lineNumber+e-1,0,o[e]),L[e-1]=o[e].length+this._eol.length;this._lineStarts&&this._lineStarts.insertValues(p.lineNumber,L)}}n.MirrorTextModel=d}),Y(X[56],J([0,1,6,42,4,2,53]),function(q,n,M,A,i,d,b){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.Searcher=n.isValidMatch=n.TextModelSearch=n.createFindMatch=n.isMultilineRegexSource=n.SearchParams=void 0;const p=999;class h{constructor(w,E,S,C){this.searchString=w,this.isRegex=E,this.matchCase=S,this.wordSeparators=C}parseSearchRequest(){if(this.searchString==="")return null;let w;this.isRegex?w=o(this.searchString):w=this.searchString.indexOf(`
+`)>=0;let E=null;try{E=M.createRegExp(this.searchString,this.isRegex,{matchCase:this.matchCase,wholeWord:!1,multiline:w,global:!0,unicode:!0})}catch{return null}if(!E)return null;let S=!this.isRegex&&!w;return S&&this.searchString.toLowerCase()!==this.searchString.toUpperCase()&&(S=this.matchCase),new b.SearchData(E,this.wordSeparators?(0,A.getMapForWordSeparators)(this.wordSeparators):null,S?this.searchString:null)}}n.SearchParams=h;function o(y){if(!y||y.length===0)return!1;for(let w=0,E=y.length;w<E;w++){const S=y.charCodeAt(w);if(S===10)return!0;if(S===92){if(w++,w>=E)break;const C=y.charCodeAt(w);if(C===110||C===114||C===87)return!0}}return!1}n.isMultilineRegexSource=o;function L(y,w,E){if(!E)return new b.FindMatch(y,null);const S=[];for(let C=0,r=w.length;C<r;C++)S[C]=w[C];return new b.FindMatch(y,S)}n.createFindMatch=L;class e{constructor(w){const E=[];let S=0;for(let C=0,r=w.length;C<r;C++)w.charCodeAt(C)===10&&(E[S++]=C);this._lineFeedsOffsets=E}findLineFeedCountBeforeOffset(w){const E=this._lineFeedsOffsets;let S=0,C=E.length-1;if(C===-1||w<=E[0])return 0;for(;S<C;){const r=S+((C-S)/2>>0);E[r]>=w?C=r-1:E[r+1]>=w?(S=r,C=r):S=r+1}return S+1}}class a{static findMatches(w,E,S,C,r){const s=E.parseSearchRequest();return s?s.regex.multiline?this._doFindMatchesMultiline(w,S,new f(s.wordSeparators,s.regex),C,r):this._doFindMatchesLineByLine(w,S,s,C,r):[]}static _getMultilineMatchRange(w,E,S,C,r,s){let l,_=0;C?(_=C.findLineFeedCountBeforeOffset(r),l=E+r+_):l=E+r;let g;if(C){const D=C.findLineFeedCountBeforeOffset(r+s.length)-_;g=l+s.length+D}else g=l+s.length;const v=w.getPositionAt(l),R=w.getPositionAt(g);return new d.Range(v.lineNumber,v.column,R.lineNumber,R.column)}static _doFindMatchesMultiline(w,E,S,C,r){const s=w.getOffsetAt(E.getStartPosition()),l=w.getValueInRange(E,1),_=w.getEOL()===`\r
+`?new e(l):null,g=[];let v=0,R;for(S.reset(0);R=S.next(l);)if(g[v++]=L(this._getMultilineMatchRange(w,s,l,_,R.index,R[0]),R,C),v>=r)return g;return g}static _doFindMatchesLineByLine(w,E,S,C,r){const s=[];let l=0;if(E.startLineNumber===E.endLineNumber){const g=w.getLineContent(E.startLineNumber).substring(E.startColumn-1,E.endColumn-1);return l=this._findMatchesInLine(S,g,E.startLineNumber,E.startColumn-1,l,s,C,r),s}const _=w.getLineContent(E.startLineNumber).substring(E.startColumn-1);l=this._findMatchesInLine(S,_,E.startLineNumber,E.startColumn-1,l,s,C,r);for(let g=E.startLineNumber+1;g<E.endLineNumber&&l<r;g++)l=this._findMatchesInLine(S,w.getLineContent(g),g,0,l,s,C,r);if(l<r){const g=w.getLineContent(E.endLineNumber).substring(0,E.endColumn-1);l=this._findMatchesInLine(S,g,E.endLineNumber,0,l,s,C,r)}return s}static _findMatchesInLine(w,E,S,C,r,s,l,_){const g=w.wordSeparators;if(!l&&w.simpleSearch){const N=w.simpleSearch,D=N.length,x=E.length;let T=-D;for(;(T=E.indexOf(N,T+D))!==-1;)if((!g||m(g,E,x,T,D))&&(s[r++]=new b.FindMatch(new d.Range(S,T+1+C,S,T+1+D+C),null),r>=_))return r;return r}const v=new f(w.wordSeparators,w.regex);let R;v.reset(0);do if(R=v.next(E),R&&(s[r++]=L(new d.Range(S,R.index+1+C,S,R.index+1+R[0].length+C),R,l),r>=_))return r;while(R);return r}static findNextMatch(w,E,S,C){const r=E.parseSearchRequest();if(!r)return null;const s=new f(r.wordSeparators,r.regex);return r.regex.multiline?this._doFindNextMatchMultiline(w,S,s,C):this._doFindNextMatchLineByLine(w,S,s,C)}static _doFindNextMatchMultiline(w,E,S,C){const r=new i.Position(E.lineNumber,1),s=w.getOffsetAt(r),l=w.getLineCount(),_=w.getValueInRange(new d.Range(r.lineNumber,r.column,l,w.getLineMaxColumn(l)),1),g=w.getEOL()===`\r
+`?new e(_):null;S.reset(E.column-1);const v=S.next(_);return v?L(this._getMultilineMatchRange(w,s,_,g,v.index,v[0]),v,C):E.lineNumber!==1||E.column!==1?this._doFindNextMatchMultiline(w,new i.Position(1,1),S,C):null}static _doFindNextMatchLineByLine(w,E,S,C){const r=w.getLineCount(),s=E.lineNumber,l=w.getLineContent(s),_=this._findFirstMatchInLine(S,l,s,E.column,C);if(_)return _;for(let g=1;g<=r;g++){const v=(s+g-1)%r,R=w.getLineContent(v+1),N=this._findFirstMatchInLine(S,R,v+1,1,C);if(N)return N}return null}static _findFirstMatchInLine(w,E,S,C,r){w.reset(C-1);const s=w.next(E);return s?L(new d.Range(S,s.index+1,S,s.index+1+s[0].length),s,r):null}static findPreviousMatch(w,E,S,C){const r=E.parseSearchRequest();if(!r)return null;const s=new f(r.wordSeparators,r.regex);return r.regex.multiline?this._doFindPreviousMatchMultiline(w,S,s,C):this._doFindPreviousMatchLineByLine(w,S,s,C)}static _doFindPreviousMatchMultiline(w,E,S,C){const r=this._doFindMatchesMultiline(w,new d.Range(1,1,E.lineNumber,E.column),S,C,10*p);if(r.length>0)return r[r.length-1];const s=w.getLineCount();return E.lineNumber!==s||E.column!==w.getLineMaxColumn(s)?this._doFindPreviousMatchMultiline(w,new i.Position(s,w.getLineMaxColumn(s)),S,C):null}static _doFindPreviousMatchLineByLine(w,E,S,C){const r=w.getLineCount(),s=E.lineNumber,l=w.getLineContent(s).substring(0,E.column-1),_=this._findLastMatchInLine(S,l,s,C);if(_)return _;for(let g=1;g<=r;g++){const v=(r+s-g-1)%r,R=w.getLineContent(v+1),N=this._findLastMatchInLine(S,R,v+1,C);if(N)return N}return null}static _findLastMatchInLine(w,E,S,C){let r=null,s;for(w.reset(0);s=w.next(E);)r=L(new d.Range(S,s.index+1,S,s.index+1+s[0].length),s,C);return r}}n.TextModelSearch=a;function u(y,w,E,S,C){if(S===0)return!0;const r=w.charCodeAt(S-1);if(y.get(r)!==0||r===13||r===10)return!0;if(C>0){const s=w.charCodeAt(S);if(y.get(s)!==0)return!0}return!1}function c(y,w,E,S,C){if(S+C===E)return!0;const r=w.charCodeAt(S+C);if(y.get(r)!==0||r===13||r===10)return!0;if(C>0){const s=w.charCodeAt(S+C-1);if(y.get(s)!==0)return!0}return!1}function m(y,w,E,S,C){return u(y,w,E,S,C)&&c(y,w,E,S,C)}n.isValidMatch=m;class f{constructor(w,E){this._wordSeparators=w,this._searchRegex=E,this._prevMatchStartIndex=-1,this._prevMatchLength=0}reset(w){this._searchRegex.lastIndex=w,this._prevMatchStartIndex=-1,this._prevMatchLength=0}next(w){const E=w.length;let S;do{if(this._prevMatchStartIndex+this._prevMatchLength===E||(S=this._searchRegex.exec(w),!S))return null;const C=S.index,r=S[0].length;if(C===this._prevMatchStartIndex&&r===this._prevMatchLength){if(r===0){M.getNextCodePoint(w,E,this._searchRegex.lastIndex)>65535?this._searchRegex.lastIndex+=2:this._searchRegex.lastIndex+=1;continue}return null}if(this._prevMatchStartIndex=C,this._prevMatchLength=r,!this._wordSeparators||m(this._wordSeparators,w,E,C,r))return S}while(S);return null}}n.Searcher=f}),Y(X[57],J([0,1,2,56,6,12,28]),function(q,n,M,A,i,d,b){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.UnicodeTextModelHighlighter=void 0;class p{static computeUnicodeHighlights(a,u,c){const m=c?c.startLineNumber:1,f=c?c.endLineNumber:a.getLineCount(),y=new o(u),w=y.getCandidateCodePoints();let E;w==="allNonBasicAscii"?E=new RegExp("[^\\t\\n\\r\\x20-\\x7E]","g"):E=new RegExp(`${h(Array.from(w))}`,"g");const S=new A.Searcher(null,E),C=[];let r=!1,s,l=0,_=0,g=0;e:for(let v=m,R=f;v<=R;v++){const N=a.getLineContent(v),D=N.length;S.reset(0);do if(s=S.next(N),s){let x=s.index,T=s.index+s[0].length;if(x>0){const k=N.charCodeAt(x-1);i.isHighSurrogate(k)&&x--}if(T+1<D){const k=N.charCodeAt(T-1);i.isHighSurrogate(k)&&T++}const F=N.substring(x,T);let B=(0,b.getWordAtText)(x+1,b.DEFAULT_WORD_REGEXP,N,0);B&&B.endColumn<=x+1&&(B=null);const V=y.shouldHighlightNonBasicASCII(F,B?B.word:null);if(V!==0){V===3?l++:V===2?_++:V===1?g++:(0,d.assertNever)(V);const k=1e3;if(C.length>=k){r=!0;break e}C.push(new M.Range(v,x+1,v,T+1))}}while(s)}return{ranges:C,hasMore:r,ambiguousCharacterCount:l,invisibleCharacterCount:_,nonBasicAsciiCharacterCount:g}}static computeUnicodeHighlightReason(a,u){const c=new o(u);switch(c.shouldHighlightNonBasicASCII(a,null)){case 0:return null;case 2:return{kind:1};case 3:{const f=a.codePointAt(0),y=c.ambiguousCharacters.getPrimaryConfusable(f),w=i.AmbiguousCharacters.getLocales().filter(E=>!i.AmbiguousCharacters.getInstance(new Set([...u.allowedLocales,E])).isAmbiguous(f));return{kind:0,confusableWith:String.fromCodePoint(y),notAmbiguousInLocales:w}}case 1:return{kind:2}}}}n.UnicodeTextModelHighlighter=p;function h(e,a){return`[${i.escapeRegExpCharacters(e.map(c=>String.fromCodePoint(c)).join(""))}]`}class o{constructor(a){this.options=a,this.allowedCodePoints=new Set(a.allowedCodePoints),this.ambiguousCharacters=i.AmbiguousCharacters.getInstance(new Set(a.allowedLocales))}getCandidateCodePoints(){if(this.options.nonBasicASCII)return"allNonBasicAscii";const a=new Set;if(this.options.invisibleCharacters)for(const u of i.InvisibleCharacters.codePoints)L(String.fromCodePoint(u))||a.add(u);if(this.options.ambiguousCharacters)for(const u of this.ambiguousCharacters.getConfusableCodePoints())a.add(u);for(const u of this.allowedCodePoints)a.delete(u);return a}shouldHighlightNonBasicASCII(a,u){const c=a.codePointAt(0);if(this.allowedCodePoints.has(c))return 0;if(this.options.nonBasicASCII)return 1;let m=!1,f=!1;if(u)for(const y of u){const w=y.codePointAt(0),E=i.isBasicASCII(y);m=m||E,!E&&!this.ambiguousCharacters.isAmbiguous(w)&&!i.InvisibleCharacters.isInvisibleCharacter(w)&&(f=!0)}return!m&&f?0:this.options.invisibleCharacters&&!L(a)&&i.InvisibleCharacters.isInvisibleCharacter(c)?2:this.options.ambiguousCharacters&&this.ambiguousCharacters.isAmbiguous(c)?3:0}}function L(e){return e===" "||e===`
+`||e==="	"}}),Y(X[58],J([0,1]),function(q,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.WrappingIndent=n.TrackedRangeStickiness=n.TextEditorCursorStyle=n.TextEditorCursorBlinkingStyle=n.SymbolTag=n.SymbolKind=n.SignatureHelpTriggerKind=n.ShowLightbulbIconMode=n.SelectionDirection=n.ScrollbarVisibility=n.ScrollType=n.RenderMinimap=n.RenderLineNumbersType=n.PositionAffinity=n.OverviewRulerLane=n.OverlayWidgetPositionPreference=n.MouseTargetType=n.MinimapPosition=n.MarkerTag=n.MarkerSeverity=n.KeyCode=n.InlineCompletionTriggerKind=n.InlayHintKind=n.InjectedTextCursorStops=n.IndentAction=n.GlyphMarginLane=n.EndOfLineSequence=n.EndOfLinePreference=n.EditorOption=n.EditorAutoIndentStrategy=n.DocumentHighlightKind=n.DefaultEndOfLine=n.CursorChangeReason=n.ContentWidgetPositionPreference=n.CompletionTriggerKind=n.CompletionItemTag=n.CompletionItemKind=n.CompletionItemInsertTextRule=n.CodeActionTriggerType=n.AccessibilitySupport=void 0;var M;(function(t){t[t.Unknown=0]="Unknown",t[t.Disabled=1]="Disabled",t[t.Enabled=2]="Enabled"})(M||(n.AccessibilitySupport=M={}));var A;(function(t){t[t.Invoke=1]="Invoke",t[t.Auto=2]="Auto"})(A||(n.CodeActionTriggerType=A={}));var i;(function(t){t[t.None=0]="None",t[t.KeepWhitespace=1]="KeepWhitespace",t[t.InsertAsSnippet=4]="InsertAsSnippet"})(i||(n.CompletionItemInsertTextRule=i={}));var d;(function(t){t[t.Method=0]="Method",t[t.Function=1]="Function",t[t.Constructor=2]="Constructor",t[t.Field=3]="Field",t[t.Variable=4]="Variable",t[t.Class=5]="Class",t[t.Struct=6]="Struct",t[t.Interface=7]="Interface",t[t.Module=8]="Module",t[t.Property=9]="Property",t[t.Event=10]="Event",t[t.Operator=11]="Operator",t[t.Unit=12]="Unit",t[t.Value=13]="Value",t[t.Constant=14]="Constant",t[t.Enum=15]="Enum",t[t.EnumMember=16]="EnumMember",t[t.Keyword=17]="Keyword",t[t.Text=18]="Text",t[t.Color=19]="Color",t[t.File=20]="File",t[t.Reference=21]="Reference",t[t.Customcolor=22]="Customcolor",t[t.Folder=23]="Folder",t[t.TypeParameter=24]="TypeParameter",t[t.User=25]="User",t[t.Issue=26]="Issue",t[t.Snippet=27]="Snippet"})(d||(n.CompletionItemKind=d={}));var b;(function(t){t[t.Deprecated=1]="Deprecated"})(b||(n.CompletionItemTag=b={}));var p;(function(t){t[t.Invoke=0]="Invoke",t[t.TriggerCharacter=1]="TriggerCharacter",t[t.TriggerForIncompleteCompletions=2]="TriggerForIncompleteCompletions"})(p||(n.CompletionTriggerKind=p={}));var h;(function(t){t[t.EXACT=0]="EXACT",t[t.ABOVE=1]="ABOVE",t[t.BELOW=2]="BELOW"})(h||(n.ContentWidgetPositionPreference=h={}));var o;(function(t){t[t.NotSet=0]="NotSet",t[t.ContentFlush=1]="ContentFlush",t[t.RecoverFromMarkers=2]="RecoverFromMarkers",t[t.Explicit=3]="Explicit",t[t.Paste=4]="Paste",t[t.Undo=5]="Undo",t[t.Redo=6]="Redo"})(o||(n.CursorChangeReason=o={}));var L;(function(t){t[t.LF=1]="LF",t[t.CRLF=2]="CRLF"})(L||(n.DefaultEndOfLine=L={}));var e;(function(t){t[t.Text=0]="Text",t[t.Read=1]="Read",t[t.Write=2]="Write"})(e||(n.DocumentHighlightKind=e={}));var a;(function(t){t[t.None=0]="None",t[t.Keep=1]="Keep",t[t.Brackets=2]="Brackets",t[t.Advanced=3]="Advanced",t[t.Full=4]="Full"})(a||(n.EditorAutoIndentStrategy=a={}));var u;(function(t){t[t.acceptSuggestionOnCommitCharacter=0]="acceptSuggestionOnCommitCharacter",t[t.acceptSuggestionOnEnter=1]="acceptSuggestionOnEnter",t[t.accessibilitySupport=2]="accessibilitySupport",t[t.accessibilityPageSize=3]="accessibilityPageSize",t[t.ariaLabel=4]="ariaLabel",t[t.ariaRequired=5]="ariaRequired",t[t.autoClosingBrackets=6]="autoClosingBrackets",t[t.autoClosingComments=7]="autoClosingComments",t[t.screenReaderAnnounceInlineSuggestion=8]="screenReaderAnnounceInlineSuggestion",t[t.autoClosingDelete=9]="autoClosingDelete",t[t.autoClosingOvertype=10]="autoClosingOvertype",t[t.autoClosingQuotes=11]="autoClosingQuotes",t[t.autoIndent=12]="autoIndent",t[t.automaticLayout=13]="automaticLayout",t[t.autoSurround=14]="autoSurround",t[t.bracketPairColorization=15]="bracketPairColorization",t[t.guides=16]="guides",t[t.codeLens=17]="codeLens",t[t.codeLensFontFamily=18]="codeLensFontFamily",t[t.codeLensFontSize=19]="codeLensFontSize",t[t.colorDecorators=20]="colorDecorators",t[t.colorDecoratorsLimit=21]="colorDecoratorsLimit",t[t.columnSelection=22]="columnSelection",t[t.comments=23]="comments",t[t.contextmenu=24]="contextmenu",t[t.copyWithSyntaxHighlighting=25]="copyWithSyntaxHighlighting",t[t.cursorBlinking=26]="cursorBlinking",t[t.cursorSmoothCaretAnimation=27]="cursorSmoothCaretAnimation",t[t.cursorStyle=28]="cursorStyle",t[t.cursorSurroundingLines=29]="cursorSurroundingLines",t[t.cursorSurroundingLinesStyle=30]="cursorSurroundingLinesStyle",t[t.cursorWidth=31]="cursorWidth",t[t.disableLayerHinting=32]="disableLayerHinting",t[t.disableMonospaceOptimizations=33]="disableMonospaceOptimizations",t[t.domReadOnly=34]="domReadOnly",t[t.dragAndDrop=35]="dragAndDrop",t[t.dropIntoEditor=36]="dropIntoEditor",t[t.emptySelectionClipboard=37]="emptySelectionClipboard",t[t.experimentalWhitespaceRendering=38]="experimentalWhitespaceRendering",t[t.extraEditorClassName=39]="extraEditorClassName",t[t.fastScrollSensitivity=40]="fastScrollSensitivity",t[t.find=41]="find",t[t.fixedOverflowWidgets=42]="fixedOverflowWidgets",t[t.folding=43]="folding",t[t.foldingStrategy=44]="foldingStrategy",t[t.foldingHighlight=45]="foldingHighlight",t[t.foldingImportsByDefault=46]="foldingImportsByDefault",t[t.foldingMaximumRegions=47]="foldingMaximumRegions",t[t.unfoldOnClickAfterEndOfLine=48]="unfoldOnClickAfterEndOfLine",t[t.fontFamily=49]="fontFamily",t[t.fontInfo=50]="fontInfo",t[t.fontLigatures=51]="fontLigatures",t[t.fontSize=52]="fontSize",t[t.fontWeight=53]="fontWeight",t[t.fontVariations=54]="fontVariations",t[t.formatOnPaste=55]="formatOnPaste",t[t.formatOnType=56]="formatOnType",t[t.glyphMargin=57]="glyphMargin",t[t.gotoLocation=58]="gotoLocation",t[t.hideCursorInOverviewRuler=59]="hideCursorInOverviewRuler",t[t.hover=60]="hover",t[t.inDiffEditor=61]="inDiffEditor",t[t.inlineSuggest=62]="inlineSuggest",t[t.letterSpacing=63]="letterSpacing",t[t.lightbulb=64]="lightbulb",t[t.lineDecorationsWidth=65]="lineDecorationsWidth",t[t.lineHeight=66]="lineHeight",t[t.lineNumbers=67]="lineNumbers",t[t.lineNumbersMinChars=68]="lineNumbersMinChars",t[t.linkedEditing=69]="linkedEditing",t[t.links=70]="links",t[t.matchBrackets=71]="matchBrackets",t[t.minimap=72]="minimap",t[t.mouseStyle=73]="mouseStyle",t[t.mouseWheelScrollSensitivity=74]="mouseWheelScrollSensitivity",t[t.mouseWheelZoom=75]="mouseWheelZoom",t[t.multiCursorMergeOverlapping=76]="multiCursorMergeOverlapping",t[t.multiCursorModifier=77]="multiCursorModifier",t[t.multiCursorPaste=78]="multiCursorPaste",t[t.multiCursorLimit=79]="multiCursorLimit",t[t.occurrencesHighlight=80]="occurrencesHighlight",t[t.overviewRulerBorder=81]="overviewRulerBorder",t[t.overviewRulerLanes=82]="overviewRulerLanes",t[t.padding=83]="padding",t[t.pasteAs=84]="pasteAs",t[t.parameterHints=85]="parameterHints",t[t.peekWidgetDefaultFocus=86]="peekWidgetDefaultFocus",t[t.definitionLinkOpensInPeek=87]="definitionLinkOpensInPeek",t[t.quickSuggestions=88]="quickSuggestions",t[t.quickSuggestionsDelay=89]="quickSuggestionsDelay",t[t.readOnly=90]="readOnly",t[t.readOnlyMessage=91]="readOnlyMessage",t[t.renameOnType=92]="renameOnType",t[t.renderControlCharacters=93]="renderControlCharacters",t[t.renderFinalNewline=94]="renderFinalNewline",t[t.renderLineHighlight=95]="renderLineHighlight",t[t.renderLineHighlightOnlyWhenFocus=96]="renderLineHighlightOnlyWhenFocus",t[t.renderValidationDecorations=97]="renderValidationDecorations",t[t.renderWhitespace=98]="renderWhitespace",t[t.revealHorizontalRightPadding=99]="revealHorizontalRightPadding",t[t.roundedSelection=100]="roundedSelection",t[t.rulers=101]="rulers",t[t.scrollbar=102]="scrollbar",t[t.scrollBeyondLastColumn=103]="scrollBeyondLastColumn",t[t.scrollBeyondLastLine=104]="scrollBeyondLastLine",t[t.scrollPredominantAxis=105]="scrollPredominantAxis",t[t.selectionClipboard=106]="selectionClipboard",t[t.selectionHighlight=107]="selectionHighlight",t[t.selectOnLineNumbers=108]="selectOnLineNumbers",t[t.showFoldingControls=109]="showFoldingControls",t[t.showUnused=110]="showUnused",t[t.snippetSuggestions=111]="snippetSuggestions",t[t.smartSelect=112]="smartSelect",t[t.smoothScrolling=113]="smoothScrolling",t[t.stickyScroll=114]="stickyScroll",t[t.stickyTabStops=115]="stickyTabStops",t[t.stopRenderingLineAfter=116]="stopRenderingLineAfter",t[t.suggest=117]="suggest",t[t.suggestFontSize=118]="suggestFontSize",t[t.suggestLineHeight=119]="suggestLineHeight",t[t.suggestOnTriggerCharacters=120]="suggestOnTriggerCharacters",t[t.suggestSelection=121]="suggestSelection",t[t.tabCompletion=122]="tabCompletion",t[t.tabIndex=123]="tabIndex",t[t.unicodeHighlighting=124]="unicodeHighlighting",t[t.unusualLineTerminators=125]="unusualLineTerminators",t[t.useShadowDOM=126]="useShadowDOM",t[t.useTabStops=127]="useTabStops",t[t.wordBreak=128]="wordBreak",t[t.wordSeparators=129]="wordSeparators",t[t.wordWrap=130]="wordWrap",t[t.wordWrapBreakAfterCharacters=131]="wordWrapBreakAfterCharacters",t[t.wordWrapBreakBeforeCharacters=132]="wordWrapBreakBeforeCharacters",t[t.wordWrapColumn=133]="wordWrapColumn",t[t.wordWrapOverride1=134]="wordWrapOverride1",t[t.wordWrapOverride2=135]="wordWrapOverride2",t[t.wrappingIndent=136]="wrappingIndent",t[t.wrappingStrategy=137]="wrappingStrategy",t[t.showDeprecated=138]="showDeprecated",t[t.inlayHints=139]="inlayHints",t[t.editorClassName=140]="editorClassName",t[t.pixelRatio=141]="pixelRatio",t[t.tabFocusMode=142]="tabFocusMode",t[t.layoutInfo=143]="layoutInfo",t[t.wrappingInfo=144]="wrappingInfo",t[t.defaultColorDecorators=145]="defaultColorDecorators",t[t.colorDecoratorsActivatedOn=146]="colorDecoratorsActivatedOn",t[t.inlineCompletionsAccessibilityVerbose=147]="inlineCompletionsAccessibilityVerbose"})(u||(n.EditorOption=u={}));var c;(function(t){t[t.TextDefined=0]="TextDefined",t[t.LF=1]="LF",t[t.CRLF=2]="CRLF"})(c||(n.EndOfLinePreference=c={}));var m;(function(t){t[t.LF=0]="LF",t[t.CRLF=1]="CRLF"})(m||(n.EndOfLineSequence=m={}));var f;(function(t){t[t.Left=1]="Left",t[t.Center=2]="Center",t[t.Right=3]="Right"})(f||(n.GlyphMarginLane=f={}));var y;(function(t){t[t.None=0]="None",t[t.Indent=1]="Indent",t[t.IndentOutdent=2]="IndentOutdent",t[t.Outdent=3]="Outdent"})(y||(n.IndentAction=y={}));var w;(function(t){t[t.Both=0]="Both",t[t.Right=1]="Right",t[t.Left=2]="Left",t[t.None=3]="None"})(w||(n.InjectedTextCursorStops=w={}));var E;(function(t){t[t.Type=1]="Type",t[t.Parameter=2]="Parameter"})(E||(n.InlayHintKind=E={}));var S;(function(t){t[t.Automatic=0]="Automatic",t[t.Explicit=1]="Explicit"})(S||(n.InlineCompletionTriggerKind=S={}));var C;(function(t){t[t.DependsOnKbLayout=-1]="DependsOnKbLayout",t[t.Unknown=0]="Unknown",t[t.Backspace=1]="Backspace",t[t.Tab=2]="Tab",t[t.Enter=3]="Enter",t[t.Shift=4]="Shift",t[t.Ctrl=5]="Ctrl",t[t.Alt=6]="Alt",t[t.PauseBreak=7]="PauseBreak",t[t.CapsLock=8]="CapsLock",t[t.Escape=9]="Escape",t[t.Space=10]="Space",t[t.PageUp=11]="PageUp",t[t.PageDown=12]="PageDown",t[t.End=13]="End",t[t.Home=14]="Home",t[t.LeftArrow=15]="LeftArrow",t[t.UpArrow=16]="UpArrow",t[t.RightArrow=17]="RightArrow",t[t.DownArrow=18]="DownArrow",t[t.Insert=19]="Insert",t[t.Delete=20]="Delete",t[t.Digit0=21]="Digit0",t[t.Digit1=22]="Digit1",t[t.Digit2=23]="Digit2",t[t.Digit3=24]="Digit3",t[t.Digit4=25]="Digit4",t[t.Digit5=26]="Digit5",t[t.Digit6=27]="Digit6",t[t.Digit7=28]="Digit7",t[t.Digit8=29]="Digit8",t[t.Digit9=30]="Digit9",t[t.KeyA=31]="KeyA",t[t.KeyB=32]="KeyB",t[t.KeyC=33]="KeyC",t[t.KeyD=34]="KeyD",t[t.KeyE=35]="KeyE",t[t.KeyF=36]="KeyF",t[t.KeyG=37]="KeyG",t[t.KeyH=38]="KeyH",t[t.KeyI=39]="KeyI",t[t.KeyJ=40]="KeyJ",t[t.KeyK=41]="KeyK",t[t.KeyL=42]="KeyL",t[t.KeyM=43]="KeyM",t[t.KeyN=44]="KeyN",t[t.KeyO=45]="KeyO",t[t.KeyP=46]="KeyP",t[t.KeyQ=47]="KeyQ",t[t.KeyR=48]="KeyR",t[t.KeyS=49]="KeyS",t[t.KeyT=50]="KeyT",t[t.KeyU=51]="KeyU",t[t.KeyV=52]="KeyV",t[t.KeyW=53]="KeyW",t[t.KeyX=54]="KeyX",t[t.KeyY=55]="KeyY",t[t.KeyZ=56]="KeyZ",t[t.Meta=57]="Meta",t[t.ContextMenu=58]="ContextMenu",t[t.F1=59]="F1",t[t.F2=60]="F2",t[t.F3=61]="F3",t[t.F4=62]="F4",t[t.F5=63]="F5",t[t.F6=64]="F6",t[t.F7=65]="F7",t[t.F8=66]="F8",t[t.F9=67]="F9",t[t.F10=68]="F10",t[t.F11=69]="F11",t[t.F12=70]="F12",t[t.F13=71]="F13",t[t.F14=72]="F14",t[t.F15=73]="F15",t[t.F16=74]="F16",t[t.F17=75]="F17",t[t.F18=76]="F18",t[t.F19=77]="F19",t[t.F20=78]="F20",t[t.F21=79]="F21",t[t.F22=80]="F22",t[t.F23=81]="F23",t[t.F24=82]="F24",t[t.NumLock=83]="NumLock",t[t.ScrollLock=84]="ScrollLock",t[t.Semicolon=85]="Semicolon",t[t.Equal=86]="Equal",t[t.Comma=87]="Comma",t[t.Minus=88]="Minus",t[t.Period=89]="Period",t[t.Slash=90]="Slash",t[t.Backquote=91]="Backquote",t[t.BracketLeft=92]="BracketLeft",t[t.Backslash=93]="Backslash",t[t.BracketRight=94]="BracketRight",t[t.Quote=95]="Quote",t[t.OEM_8=96]="OEM_8",t[t.IntlBackslash=97]="IntlBackslash",t[t.Numpad0=98]="Numpad0",t[t.Numpad1=99]="Numpad1",t[t.Numpad2=100]="Numpad2",t[t.Numpad3=101]="Numpad3",t[t.Numpad4=102]="Numpad4",t[t.Numpad5=103]="Numpad5",t[t.Numpad6=104]="Numpad6",t[t.Numpad7=105]="Numpad7",t[t.Numpad8=106]="Numpad8",t[t.Numpad9=107]="Numpad9",t[t.NumpadMultiply=108]="NumpadMultiply",t[t.NumpadAdd=109]="NumpadAdd",t[t.NUMPAD_SEPARATOR=110]="NUMPAD_SEPARATOR",t[t.NumpadSubtract=111]="NumpadSubtract",t[t.NumpadDecimal=112]="NumpadDecimal",t[t.NumpadDivide=113]="NumpadDivide",t[t.KEY_IN_COMPOSITION=114]="KEY_IN_COMPOSITION",t[t.ABNT_C1=115]="ABNT_C1",t[t.ABNT_C2=116]="ABNT_C2",t[t.AudioVolumeMute=117]="AudioVolumeMute",t[t.AudioVolumeUp=118]="AudioVolumeUp",t[t.AudioVolumeDown=119]="AudioVolumeDown",t[t.BrowserSearch=120]="BrowserSearch",t[t.BrowserHome=121]="BrowserHome",t[t.BrowserBack=122]="BrowserBack",t[t.BrowserForward=123]="BrowserForward",t[t.MediaTrackNext=124]="MediaTrackNext",t[t.MediaTrackPrevious=125]="MediaTrackPrevious",t[t.MediaStop=126]="MediaStop",t[t.MediaPlayPause=127]="MediaPlayPause",t[t.LaunchMediaPlayer=128]="LaunchMediaPlayer",t[t.LaunchMail=129]="LaunchMail",t[t.LaunchApp2=130]="LaunchApp2",t[t.Clear=131]="Clear",t[t.MAX_VALUE=132]="MAX_VALUE"})(C||(n.KeyCode=C={}));var r;(function(t){t[t.Hint=1]="Hint",t[t.Info=2]="Info",t[t.Warning=4]="Warning",t[t.Error=8]="Error"})(r||(n.MarkerSeverity=r={}));var s;(function(t){t[t.Unnecessary=1]="Unnecessary",t[t.Deprecated=2]="Deprecated"})(s||(n.MarkerTag=s={}));var l;(function(t){t[t.Inline=1]="Inline",t[t.Gutter=2]="Gutter"})(l||(n.MinimapPosition=l={}));var _;(function(t){t[t.UNKNOWN=0]="UNKNOWN",t[t.TEXTAREA=1]="TEXTAREA",t[t.GUTTER_GLYPH_MARGIN=2]="GUTTER_GLYPH_MARGIN",t[t.GUTTER_LINE_NUMBERS=3]="GUTTER_LINE_NUMBERS",t[t.GUTTER_LINE_DECORATIONS=4]="GUTTER_LINE_DECORATIONS",t[t.GUTTER_VIEW_ZONE=5]="GUTTER_VIEW_ZONE",t[t.CONTENT_TEXT=6]="CONTENT_TEXT",t[t.CONTENT_EMPTY=7]="CONTENT_EMPTY",t[t.CONTENT_VIEW_ZONE=8]="CONTENT_VIEW_ZONE",t[t.CONTENT_WIDGET=9]="CONTENT_WIDGET",t[t.OVERVIEW_RULER=10]="OVERVIEW_RULER",t[t.SCROLLBAR=11]="SCROLLBAR",t[t.OVERLAY_WIDGET=12]="OVERLAY_WIDGET",t[t.OUTSIDE_EDITOR=13]="OUTSIDE_EDITOR"})(_||(n.MouseTargetType=_={}));var g;(function(t){t[t.TOP_RIGHT_CORNER=0]="TOP_RIGHT_CORNER",t[t.BOTTOM_RIGHT_CORNER=1]="BOTTOM_RIGHT_CORNER",t[t.TOP_CENTER=2]="TOP_CENTER"})(g||(n.OverlayWidgetPositionPreference=g={}));var v;(function(t){t[t.Left=1]="Left",t[t.Center=2]="Center",t[t.Right=4]="Right",t[t.Full=7]="Full"})(v||(n.OverviewRulerLane=v={}));var R;(function(t){t[t.Left=0]="Left",t[t.Right=1]="Right",t[t.None=2]="None",t[t.LeftOfInjectedText=3]="LeftOfInjectedText",t[t.RightOfInjectedText=4]="RightOfInjectedText"})(R||(n.PositionAffinity=R={}));var N;(function(t){t[t.Off=0]="Off",t[t.On=1]="On",t[t.Relative=2]="Relative",t[t.Interval=3]="Interval",t[t.Custom=4]="Custom"})(N||(n.RenderLineNumbersType=N={}));var D;(function(t){t[t.None=0]="None",t[t.Text=1]="Text",t[t.Blocks=2]="Blocks"})(D||(n.RenderMinimap=D={}));var x;(function(t){t[t.Smooth=0]="Smooth",t[t.Immediate=1]="Immediate"})(x||(n.ScrollType=x={}));var T;(function(t){t[t.Auto=1]="Auto",t[t.Hidden=2]="Hidden",t[t.Visible=3]="Visible"})(T||(n.ScrollbarVisibility=T={}));var F;(function(t){t[t.LTR=0]="LTR",t[t.RTL=1]="RTL"})(F||(n.SelectionDirection=F={}));var B;(function(t){t.Off="off",t.OnCode="onCode",t.On="on"})(B||(n.ShowLightbulbIconMode=B={}));var V;(function(t){t[t.Invoke=1]="Invoke",t[t.TriggerCharacter=2]="TriggerCharacter",t[t.ContentChange=3]="ContentChange"})(V||(n.SignatureHelpTriggerKind=V={}));var k;(function(t){t[t.File=0]="File",t[t.Module=1]="Module",t[t.Namespace=2]="Namespace",t[t.Package=3]="Package",t[t.Class=4]="Class",t[t.Method=5]="Method",t[t.Property=6]="Property",t[t.Field=7]="Field",t[t.Constructor=8]="Constructor",t[t.Enum=9]="Enum",t[t.Interface=10]="Interface",t[t.Function=11]="Function",t[t.Variable=12]="Variable",t[t.Constant=13]="Constant",t[t.String=14]="String",t[t.Number=15]="Number",t[t.Boolean=16]="Boolean",t[t.Array=17]="Array",t[t.Object=18]="Object",t[t.Key=19]="Key",t[t.Null=20]="Null",t[t.EnumMember=21]="EnumMember",t[t.Struct=22]="Struct",t[t.Event=23]="Event",t[t.Operator=24]="Operator",t[t.TypeParameter=25]="TypeParameter"})(k||(n.SymbolKind=k={}));var O;(function(t){t[t.Deprecated=1]="Deprecated"})(O||(n.SymbolTag=O={}));var I;(function(t){t[t.Hidden=0]="Hidden",t[t.Blink=1]="Blink",t[t.Smooth=2]="Smooth",t[t.Phase=3]="Phase",t[t.Expand=4]="Expand",t[t.Solid=5]="Solid"})(I||(n.TextEditorCursorBlinkingStyle=I={}));var W;(function(t){t[t.Line=1]="Line",t[t.Block=2]="Block",t[t.Underline=3]="Underline",t[t.LineThin=4]="LineThin",t[t.BlockOutline=5]="BlockOutline",t[t.UnderlineThin=6]="UnderlineThin"})(W||(n.TextEditorCursorStyle=W={}));var z;(function(t){t[t.AlwaysGrowsWhenTypingAtEdges=0]="AlwaysGrowsWhenTypingAtEdges",t[t.NeverGrowsWhenTypingAtEdges=1]="NeverGrowsWhenTypingAtEdges",t[t.GrowsOnlyWhenTypingBefore=2]="GrowsOnlyWhenTypingBefore",t[t.GrowsOnlyWhenTypingAfter=3]="GrowsOnlyWhenTypingAfter"})(z||(n.TrackedRangeStickiness=z={}));var G;(function(t){t[t.None=0]="None",t[t.Same=1]="Same",t[t.Indent=2]="Indent",t[t.DeepIndent=3]="DeepIndent"})(G||(n.WrappingIndent=G={}))}),Y(X[59],J([0,1,9,13]),function(q,n,M,A){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.TokenizationRegistry=void 0;class i{constructor(){this._tokenizationSupports=new Map,this._factories=new Map,this._onDidChange=new M.Emitter,this.onDidChange=this._onDidChange.event,this._colorMap=null}handleChange(p){this._onDidChange.fire({changedLanguages:p,changedColorMap:!1})}register(p,h){return this._tokenizationSupports.set(p,h),this.handleChange([p]),(0,A.toDisposable)(()=>{this._tokenizationSupports.get(p)===h&&(this._tokenizationSupports.delete(p),this.handleChange([p]))})}get(p){return this._tokenizationSupports.get(p)||null}registerFactory(p,h){var o;(o=this._factories.get(p))===null||o===void 0||o.dispose();const L=new d(this,p,h);return this._factories.set(p,L),(0,A.toDisposable)(()=>{const e=this._factories.get(p);!e||e!==L||(this._factories.delete(p),e.dispose())})}async getOrCreate(p){const h=this.get(p);if(h)return h;const o=this._factories.get(p);return!o||o.isResolved?null:(await o.resolve(),this.get(p))}isResolved(p){if(this.get(p))return!0;const o=this._factories.get(p);return!!(!o||o.isResolved)}setColorMap(p){this._colorMap=p,this._onDidChange.fire({changedLanguages:Array.from(this._tokenizationSupports.keys()),changedColorMap:!0})}getColorMap(){return this._colorMap}getDefaultBackground(){return this._colorMap&&this._colorMap.length>2?this._colorMap[2]:null}}n.TokenizationRegistry=i;class d extends A.Disposable{get isResolved(){return this._isResolved}constructor(p,h,o){super(),this._registry=p,this._languageId=h,this._factory=o,this._isDisposed=!1,this._resolvePromise=null,this._isResolved=!1}dispose(){this._isDisposed=!0,super.dispose()}async resolve(){return this._resolvePromise||(this._resolvePromise=this._create()),this._resolvePromise}async _create(){const p=await this._factory.tokenizationSupport;this._isResolved=!0,p&&!this._isDisposed&&this._register(this._registry.register(this._languageId,p))}}}),Y(X[60],J([19,61]),function(q,n){return q.create("vs/base/common/platform",n)}),Y(X[17],J([0,1,60]),function(q,n,M){"use strict";var A;Object.defineProperty(n,"__esModule",{value:!0}),n.isAndroid=n.isEdge=n.isSafari=n.isFirefox=n.isChrome=n.isLittleEndian=n.OS=n.setTimeout0=n.setTimeout0IsFaster=n.language=n.userAgent=n.isMobile=n.isIOS=n.webWorkerOrigin=n.isWebWorker=n.isWeb=n.isNative=n.isLinux=n.isMacintosh=n.isWindows=n.LANGUAGE_DEFAULT=void 0,n.LANGUAGE_DEFAULT="en";let i=!1,d=!1,b=!1,p=!1,h=!1,o=!1,L=!1,e=!1,a=!1,u=!1,c,m=n.LANGUAGE_DEFAULT,f=n.LANGUAGE_DEFAULT,y,w;const E=globalThis;let S;typeof E.vscode<"u"&&typeof E.vscode.process<"u"?S=E.vscode.process:typeof process<"u"&&(S=process);const C=typeof((A=S?.versions)===null||A===void 0?void 0:A.electron)=="string",r=C&&S?.type==="renderer";if(typeof S=="object"){i=S.platform==="win32",d=S.platform==="darwin",b=S.platform==="linux",p=b&&!!S.env.SNAP&&!!S.env.SNAP_REVISION,L=C,a=!!S.env.CI||!!S.env.BUILD_ARTIFACTSTAGINGDIRECTORY,c=n.LANGUAGE_DEFAULT,m=n.LANGUAGE_DEFAULT;const v=S.env.VSCODE_NLS_CONFIG;if(v)try{const R=JSON.parse(v),N=R.availableLanguages["*"];c=R.locale,f=R.osLocale,m=N||n.LANGUAGE_DEFAULT,y=R._translationsConfigFile}catch{}h=!0}else typeof navigator=="object"&&!r?(w=navigator.userAgent,i=w.indexOf("Windows")>=0,d=w.indexOf("Macintosh")>=0,e=(w.indexOf("Macintosh")>=0||w.indexOf("iPad")>=0||w.indexOf("iPhone")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,b=w.indexOf("Linux")>=0,u=w?.indexOf("Mobi")>=0,o=!0,c=M.getConfiguredDefaultLocale(M.localize(0,null))||n.LANGUAGE_DEFAULT,m=c,f=navigator.language):console.error("Unable to resolve platform.");let s=0;d?s=1:i?s=3:b&&(s=2),n.isWindows=i,n.isMacintosh=d,n.isLinux=b,n.isNative=h,n.isWeb=o,n.isWebWorker=o&&typeof E.importScripts=="function",n.webWorkerOrigin=n.isWebWorker?E.origin:void 0,n.isIOS=e,n.isMobile=u,n.userAgent=w,n.language=m,n.setTimeout0IsFaster=typeof E.postMessage=="function"&&!E.importScripts,n.setTimeout0=(()=>{if(n.setTimeout0IsFaster){const v=[];E.addEventListener("message",N=>{if(N.data&&N.data.vscodeScheduleAsyncWork)for(let D=0,x=v.length;D<x;D++){const T=v[D];if(T.id===N.data.vscodeScheduleAsyncWork){v.splice(D,1),T.callback();return}}});let R=0;return N=>{const D=++R;v.push({id:D,callback:N}),E.postMessage({vscodeScheduleAsyncWork:D},"*")}}return v=>setTimeout(v)})(),n.OS=d||e?2:i?1:3;let l=!0,_=!1;function g(){if(!_){_=!0;const v=new Uint8Array(2);v[0]=1,v[1]=2,l=new Uint16Array(v.buffer)[0]===(2<<8)+1}return l}n.isLittleEndian=g,n.isChrome=!!(n.userAgent&&n.userAgent.indexOf("Chrome")>=0),n.isFirefox=!!(n.userAgent&&n.userAgent.indexOf("Firefox")>=0),n.isSafari=!!(!n.isChrome&&n.userAgent&&n.userAgent.indexOf("Safari")>=0),n.isEdge=!!(n.userAgent&&n.userAgent.indexOf("Edg/")>=0),n.isAndroid=!!(n.userAgent&&n.userAgent.indexOf("Android")>=0)}),Y(X[62],J([0,1,17]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.platform=n.env=n.cwd=void 0;let A;const i=globalThis.vscode;if(typeof i<"u"&&typeof i.process<"u"){const d=i.process;A={get platform(){return d.platform},get arch(){return d.arch},get env(){return d.env},cwd(){return d.cwd()}}}else typeof process<"u"?A={get platform(){return process.platform},get arch(){return process.arch},get env(){return process.env},cwd(){return process.env.VSCODE_CWD||process.cwd()}}:A={get platform(){return M.isWindows?"win32":M.isMacintosh?"darwin":"linux"},get arch(){},get env(){return{}},cwd(){return"/"}};n.cwd=A.cwd,n.env=A.env,n.platform=A.platform}),Y(X[63],J([0,1,62]),function(q,n,M){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.sep=n.extname=n.basename=n.dirname=n.relative=n.resolve=n.normalize=n.posix=n.win32=void 0;const A=65,i=97,d=90,b=122,p=46,h=47,o=92,L=58,e=63;class a extends Error{constructor(s,l,_){let g;typeof l=="string"&&l.indexOf("not ")===0?(g="must not be",l=l.replace(/^not /,"")):g="must be";const v=s.indexOf(".")!==-1?"property":"argument";let R=`The "${s}" ${v} ${g} of type ${l}`;R+=`. Received type ${typeof _}`,super(R),this.code="ERR_INVALID_ARG_TYPE"}}function u(r,s){if(r===null||typeof r!="object")throw new a(s,"Object",r)}function c(r,s){if(typeof r!="string")throw new a(s,"string",r)}const m=M.platform==="win32";function f(r){return r===h||r===o}function y(r){return r===h}function w(r){return r>=A&&r<=d||r>=i&&r<=b}function E(r,s,l,_){let g="",v=0,R=-1,N=0,D=0;for(let x=0;x<=r.length;++x){if(x<r.length)D=r.charCodeAt(x);else{if(_(D))break;D=h}if(_(D)){if(!(R===x-1||N===1))if(N===2){if(g.length<2||v!==2||g.charCodeAt(g.length-1)!==p||g.charCodeAt(g.length-2)!==p){if(g.length>2){const T=g.lastIndexOf(l);T===-1?(g="",v=0):(g=g.slice(0,T),v=g.length-1-g.lastIndexOf(l)),R=x,N=0;continue}else if(g.length!==0){g="",v=0,R=x,N=0;continue}}s&&(g+=g.length>0?`${l}..`:"..",v=2)}else g.length>0?g+=`${l}${r.slice(R+1,x)}`:g=r.slice(R+1,x),v=x-R-1;R=x,N=0}else D===p&&N!==-1?++N:N=-1}return g}function S(r,s){u(s,"pathObject");const l=s.dir||s.root,_=s.base||`${s.name||""}${s.ext||""}`;return l?l===s.root?`${l}${_}`:`${l}${r}${_}`:_}n.win32={resolve(...r){let s="",l="",_=!1;for(let g=r.length-1;g>=-1;g--){let v;if(g>=0){if(v=r[g],c(v,"path"),v.length===0)continue}else s.length===0?v=M.cwd():(v=M.env[`=${s}`]||M.cwd(),(v===void 0||v.slice(0,2).toLowerCase()!==s.toLowerCase()&&v.charCodeAt(2)===o)&&(v=`${s}\\`));const R=v.length;let N=0,D="",x=!1;const T=v.charCodeAt(0);if(R===1)f(T)&&(N=1,x=!0);else if(f(T))if(x=!0,f(v.charCodeAt(1))){let F=2,B=F;for(;F<R&&!f(v.charCodeAt(F));)F++;if(F<R&&F!==B){const V=v.slice(B,F);for(B=F;F<R&&f(v.charCodeAt(F));)F++;if(F<R&&F!==B){for(B=F;F<R&&!f(v.charCodeAt(F));)F++;(F===R||F!==B)&&(D=`\\\\${V}\\${v.slice(B,F)}`,N=F)}}}else N=1;else w(T)&&v.charCodeAt(1)===L&&(D=v.slice(0,2),N=2,R>2&&f(v.charCodeAt(2))&&(x=!0,N=3));if(D.length>0)if(s.length>0){if(D.toLowerCase()!==s.toLowerCase())continue}else s=D;if(_){if(s.length>0)break}else if(l=`${v.slice(N)}\\${l}`,_=x,x&&s.length>0)break}return l=E(l,!_,"\\",f),_?`${s}\\${l}`:`${s}${l}`||"."},normalize(r){c(r,"path");const s=r.length;if(s===0)return".";let l=0,_,g=!1;const v=r.charCodeAt(0);if(s===1)return y(v)?"\\":r;if(f(v))if(g=!0,f(r.charCodeAt(1))){let N=2,D=N;for(;N<s&&!f(r.charCodeAt(N));)N++;if(N<s&&N!==D){const x=r.slice(D,N);for(D=N;N<s&&f(r.charCodeAt(N));)N++;if(N<s&&N!==D){for(D=N;N<s&&!f(r.charCodeAt(N));)N++;if(N===s)return`\\\\${x}\\${r.slice(D)}\\`;N!==D&&(_=`\\\\${x}\\${r.slice(D,N)}`,l=N)}}}else l=1;else w(v)&&r.charCodeAt(1)===L&&(_=r.slice(0,2),l=2,s>2&&f(r.charCodeAt(2))&&(g=!0,l=3));let R=l<s?E(r.slice(l),!g,"\\",f):"";return R.length===0&&!g&&(R="."),R.length>0&&f(r.charCodeAt(s-1))&&(R+="\\"),_===void 0?g?`\\${R}`:R:g?`${_}\\${R}`:`${_}${R}`},isAbsolute(r){c(r,"path");const s=r.length;if(s===0)return!1;const l=r.charCodeAt(0);return f(l)||s>2&&w(l)&&r.charCodeAt(1)===L&&f(r.charCodeAt(2))},join(...r){if(r.length===0)return".";let s,l;for(let v=0;v<r.length;++v){const R=r[v];c(R,"path"),R.length>0&&(s===void 0?s=l=R:s+=`\\${R}`)}if(s===void 0)return".";let _=!0,g=0;if(typeof l=="string"&&f(l.charCodeAt(0))){++g;const v=l.length;v>1&&f(l.charCodeAt(1))&&(++g,v>2&&(f(l.charCodeAt(2))?++g:_=!1))}if(_){for(;g<s.length&&f(s.charCodeAt(g));)g++;g>=2&&(s=`\\${s.slice(g)}`)}return n.win32.normalize(s)},relative(r,s){if(c(r,"from"),c(s,"to"),r===s)return"";const l=n.win32.resolve(r),_=n.win32.resolve(s);if(l===_||(r=l.toLowerCase(),s=_.toLowerCase(),r===s))return"";let g=0;for(;g<r.length&&r.charCodeAt(g)===o;)g++;let v=r.length;for(;v-1>g&&r.charCodeAt(v-1)===o;)v--;const R=v-g;let N=0;for(;N<s.length&&s.charCodeAt(N)===o;)N++;let D=s.length;for(;D-1>N&&s.charCodeAt(D-1)===o;)D--;const x=D-N,T=R<x?R:x;let F=-1,B=0;for(;B<T;B++){const k=r.charCodeAt(g+B);if(k!==s.charCodeAt(N+B))break;k===o&&(F=B)}if(B!==T){if(F===-1)return _}else{if(x>T){if(s.charCodeAt(N+B)===o)return _.slice(N+B+1);if(B===2)return _.slice(N+B)}R>T&&(r.charCodeAt(g+B)===o?F=B:B===2&&(F=3)),F===-1&&(F=0)}let V="";for(B=g+F+1;B<=v;++B)(B===v||r.charCodeAt(B)===o)&&(V+=V.length===0?"..":"\\..");return N+=F,V.length>0?`${V}${_.slice(N,D)}`:(_.charCodeAt(N)===o&&++N,_.slice(N,D))},toNamespacedPath(r){if(typeof r!="string"||r.length===0)return r;const s=n.win32.resolve(r);if(s.length<=2)return r;if(s.charCodeAt(0)===o){if(s.charCodeAt(1)===o){const l=s.charCodeAt(2);if(l!==e&&l!==p)return`\\\\?\\UNC\\${s.slice(2)}`}}else if(w(s.charCodeAt(0))&&s.charCodeAt(1)===L&&s.charCodeAt(2)===o)return`\\\\?\\${s}`;return r},dirname(r){c(r,"path");const s=r.length;if(s===0)return".";let l=-1,_=0;const g=r.charCodeAt(0);if(s===1)return f(g)?r:".";if(f(g)){if(l=_=1,f(r.charCodeAt(1))){let N=2,D=N;for(;N<s&&!f(r.charCodeAt(N));)N++;if(N<s&&N!==D){for(D=N;N<s&&f(r.charCodeAt(N));)N++;if(N<s&&N!==D){for(D=N;N<s&&!f(r.charCodeAt(N));)N++;if(N===s)return r;N!==D&&(l=_=N+1)}}}}else w(g)&&r.charCodeAt(1)===L&&(l=s>2&&f(r.charCodeAt(2))?3:2,_=l);let v=-1,R=!0;for(let N=s-1;N>=_;--N)if(f(r.charCodeAt(N))){if(!R){v=N;break}}else R=!1;if(v===-1){if(l===-1)return".";v=l}return r.slice(0,v)},basename(r,s){s!==void 0&&c(s,"ext"),c(r,"path");let l=0,_=-1,g=!0,v;if(r.length>=2&&w(r.charCodeAt(0))&&r.charCodeAt(1)===L&&(l=2),s!==void 0&&s.length>0&&s.length<=r.length){if(s===r)return"";let R=s.length-1,N=-1;for(v=r.length-1;v>=l;--v){const D=r.charCodeAt(v);if(f(D)){if(!g){l=v+1;break}}else N===-1&&(g=!1,N=v+1),R>=0&&(D===s.charCodeAt(R)?--R===-1&&(_=v):(R=-1,_=N))}return l===_?_=N:_===-1&&(_=r.length),r.slice(l,_)}for(v=r.length-1;v>=l;--v)if(f(r.charCodeAt(v))){if(!g){l=v+1;break}}else _===-1&&(g=!1,_=v+1);return _===-1?"":r.slice(l,_)},extname(r){c(r,"path");let s=0,l=-1,_=0,g=-1,v=!0,R=0;r.length>=2&&r.charCodeAt(1)===L&&w(r.charCodeAt(0))&&(s=_=2);for(let N=r.length-1;N>=s;--N){const D=r.charCodeAt(N);if(f(D)){if(!v){_=N+1;break}continue}g===-1&&(v=!1,g=N+1),D===p?l===-1?l=N:R!==1&&(R=1):l!==-1&&(R=-1)}return l===-1||g===-1||R===0||R===1&&l===g-1&&l===_+1?"":r.slice(l,g)},format:S.bind(null,"\\"),parse(r){c(r,"path");const s={root:"",dir:"",base:"",ext:"",name:""};if(r.length===0)return s;const l=r.length;let _=0,g=r.charCodeAt(0);if(l===1)return f(g)?(s.root=s.dir=r,s):(s.base=s.name=r,s);if(f(g)){if(_=1,f(r.charCodeAt(1))){let F=2,B=F;for(;F<l&&!f(r.charCodeAt(F));)F++;if(F<l&&F!==B){for(B=F;F<l&&f(r.charCodeAt(F));)F++;if(F<l&&F!==B){for(B=F;F<l&&!f(r.charCodeAt(F));)F++;F===l?_=F:F!==B&&(_=F+1)}}}}else if(w(g)&&r.charCodeAt(1)===L){if(l<=2)return s.root=s.dir=r,s;if(_=2,f(r.charCodeAt(2))){if(l===3)return s.root=s.dir=r,s;_=3}}_>0&&(s.root=r.slice(0,_));let v=-1,R=_,N=-1,D=!0,x=r.length-1,T=0;for(;x>=_;--x){if(g=r.charCodeAt(x),f(g)){if(!D){R=x+1;break}continue}N===-1&&(D=!1,N=x+1),g===p?v===-1?v=x:T!==1&&(T=1):v!==-1&&(T=-1)}return N!==-1&&(v===-1||T===0||T===1&&v===N-1&&v===R+1?s.base=s.name=r.slice(R,N):(s.name=r.slice(R,v),s.base=r.slice(R,N),s.ext=r.slice(v,N))),R>0&&R!==_?s.dir=r.slice(0,R-1):s.dir=s.root,s},sep:"\\",delimiter:";",win32:null,posix:null};const C=(()=>{if(m){const r=/\\/g;return()=>{const s=M.cwd().replace(r,"/");return s.slice(s.indexOf("/"))}}return()=>M.cwd()})();n.posix={resolve(...r){let s="",l=!1;for(let _=r.length-1;_>=-1&&!l;_--){const g=_>=0?r[_]:C();c(g,"path"),g.length!==0&&(s=`${g}/${s}`,l=g.charCodeAt(0)===h)}return s=E(s,!l,"/",y),l?`/${s}`:s.length>0?s:"."},normalize(r){if(c(r,"path"),r.length===0)return".";const s=r.charCodeAt(0)===h,l=r.charCodeAt(r.length-1)===h;return r=E(r,!s,"/",y),r.length===0?s?"/":l?"./":".":(l&&(r+="/"),s?`/${r}`:r)},isAbsolute(r){return c(r,"path"),r.length>0&&r.charCodeAt(0)===h},join(...r){if(r.length===0)return".";let s;for(let l=0;l<r.length;++l){const _=r[l];c(_,"path"),_.length>0&&(s===void 0?s=_:s+=`/${_}`)}return s===void 0?".":n.posix.normalize(s)},relative(r,s){if(c(r,"from"),c(s,"to"),r===s||(r=n.posix.resolve(r),s=n.posix.resolve(s),r===s))return"";const l=1,_=r.length,g=_-l,v=1,R=s.length-v,N=g<R?g:R;let D=-1,x=0;for(;x<N;x++){const F=r.charCodeAt(l+x);if(F!==s.charCodeAt(v+x))break;F===h&&(D=x)}if(x===N)if(R>N){if(s.charCodeAt(v+x)===h)return s.slice(v+x+1);if(x===0)return s.slice(v+x)}else g>N&&(r.charCodeAt(l+x)===h?D=x:x===0&&(D=0));let T="";for(x=l+D+1;x<=_;++x)(x===_||r.charCodeAt(x)===h)&&(T+=T.length===0?"..":"/..");return`${T}${s.slice(v+D)}`},toNamespacedPath(r){return r},dirname(r){if(c(r,"path"),r.length===0)return".";const s=r.charCodeAt(0)===h;let l=-1,_=!0;for(let g=r.length-1;g>=1;--g)if(r.charCodeAt(g)===h){if(!_){l=g;break}}else _=!1;return l===-1?s?"/":".":s&&l===1?"//":r.slice(0,l)},basename(r,s){s!==void 0&&c(s,"ext"),c(r,"path");let l=0,_=-1,g=!0,v;if(s!==void 0&&s.length>0&&s.length<=r.length){if(s===r)return"";let R=s.length-1,N=-1;for(v=r.length-1;v>=0;--v){const D=r.charCodeAt(v);if(D===h){if(!g){l=v+1;break}}else N===-1&&(g=!1,N=v+1),R>=0&&(D===s.charCodeAt(R)?--R===-1&&(_=v):(R=-1,_=N))}return l===_?_=N:_===-1&&(_=r.length),r.slice(l,_)}for(v=r.length-1;v>=0;--v)if(r.charCodeAt(v)===h){if(!g){l=v+1;break}}else _===-1&&(g=!1,_=v+1);return _===-1?"":r.slice(l,_)},extname(r){c(r,"path");let s=-1,l=0,_=-1,g=!0,v=0;for(let R=r.length-1;R>=0;--R){const N=r.charCodeAt(R);if(N===h){if(!g){l=R+1;break}continue}_===-1&&(g=!1,_=R+1),N===p?s===-1?s=R:v!==1&&(v=1):s!==-1&&(v=-1)}return s===-1||_===-1||v===0||v===1&&s===_-1&&s===l+1?"":r.slice(s,_)},format:S.bind(null,"/"),parse(r){c(r,"path");const s={root:"",dir:"",base:"",ext:"",name:""};if(r.length===0)return s;const l=r.charCodeAt(0)===h;let _;l?(s.root="/",_=1):_=0;let g=-1,v=0,R=-1,N=!0,D=r.length-1,x=0;for(;D>=_;--D){const T=r.charCodeAt(D);if(T===h){if(!N){v=D+1;break}continue}R===-1&&(N=!1,R=D+1),T===p?g===-1?g=D:x!==1&&(x=1):g!==-1&&(x=-1)}if(R!==-1){const T=v===0&&l?1:v;g===-1||x===0||x===1&&g===R-1&&g===v+1?s.base=s.name=r.slice(T,R):(s.name=r.slice(T,g),s.base=r.slice(T,R),s.ext=r.slice(g,R))}return v>0?s.dir=r.slice(0,v-1):l&&(s.dir="/"),s},sep:"/",delimiter:":",win32:null,posix:null},n.posix.win32=n.win32.win32=n.win32,n.posix.posix=n.win32.posix=n.posix,n.normalize=m?n.win32.normalize:n.posix.normalize,n.resolve=m?n.win32.resolve:n.posix.resolve,n.relative=m?n.win32.relative:n.posix.relative,n.dirname=m?n.win32.dirname:n.posix.dirname,n.basename=m?n.win32.basename:n.posix.basename,n.extname=m?n.win32.extname:n.posix.extname,n.sep=m?n.win32.sep:n.posix.sep}),Y(X[18],J([0,1,63,17]),function(q,n,M,A){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.uriToFsPath=n.URI=void 0;const i=/^\w[\w\d+.-]*$/,d=/^\//,b=/^\/\//;function p(l,_){if(!l.scheme&&_)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${l.authority}", path: "${l.path}", query: "${l.query}", fragment: "${l.fragment}"}`);if(l.scheme&&!i.test(l.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(l.path){if(l.authority){if(!d.test(l.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(b.test(l.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}function h(l,_){return!l&&!_?"file":l}function o(l,_){switch(l){case"https":case"http":case"file":_?_[0]!==e&&(_=e+_):_=e;break}return _}const L="",e="/",a=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class u{static isUri(_){return _ instanceof u?!0:_?typeof _.authority=="string"&&typeof _.fragment=="string"&&typeof _.path=="string"&&typeof _.query=="string"&&typeof _.scheme=="string"&&typeof _.fsPath=="string"&&typeof _.with=="function"&&typeof _.toString=="function":!1}constructor(_,g,v,R,N,D=!1){typeof _=="object"?(this.scheme=_.scheme||L,this.authority=_.authority||L,this.path=_.path||L,this.query=_.query||L,this.fragment=_.fragment||L):(this.scheme=h(_,D),this.authority=g||L,this.path=o(this.scheme,v||L),this.query=R||L,this.fragment=N||L,p(this,D))}get fsPath(){return E(this,!1)}with(_){if(!_)return this;let{scheme:g,authority:v,path:R,query:N,fragment:D}=_;return g===void 0?g=this.scheme:g===null&&(g=L),v===void 0?v=this.authority:v===null&&(v=L),R===void 0?R=this.path:R===null&&(R=L),N===void 0?N=this.query:N===null&&(N=L),D===void 0?D=this.fragment:D===null&&(D=L),g===this.scheme&&v===this.authority&&R===this.path&&N===this.query&&D===this.fragment?this:new m(g,v,R,N,D)}static parse(_,g=!1){const v=a.exec(_);return v?new m(v[2]||L,s(v[4]||L),s(v[5]||L),s(v[7]||L),s(v[9]||L),g):new m(L,L,L,L,L)}static file(_){let g=L;if(A.isWindows&&(_=_.replace(/\\/g,e)),_[0]===e&&_[1]===e){const v=_.indexOf(e,2);v===-1?(g=_.substring(2),_=e):(g=_.substring(2,v),_=_.substring(v)||e)}return new m("file",g,_,L,L)}static from(_,g){return new m(_.scheme,_.authority,_.path,_.query,_.fragment,g)}static joinPath(_,...g){if(!_.path)throw new Error("[UriError]: cannot call joinPath on URI without path");let v;return A.isWindows&&_.scheme==="file"?v=u.file(M.win32.join(E(_,!0),...g)).path:v=M.posix.join(_.path,...g),_.with({path:v})}toString(_=!1){return S(this,_)}toJSON(){return this}static revive(_){var g,v;if(_){if(_ instanceof u)return _;{const R=new m(_);return R._formatted=(g=_.external)!==null&&g!==void 0?g:null,R._fsPath=_._sep===c&&(v=_.fsPath)!==null&&v!==void 0?v:null,R}}else return _}}n.URI=u;const c=A.isWindows?1:void 0;class m extends u{constructor(){super(...arguments),this._formatted=null,this._fsPath=null}get fsPath(){return this._fsPath||(this._fsPath=E(this,!1)),this._fsPath}toString(_=!1){return _?S(this,!0):(this._formatted||(this._formatted=S(this,!1)),this._formatted)}toJSON(){const _={$mid:1};return this._fsPath&&(_.fsPath=this._fsPath,_._sep=c),this._formatted&&(_.external=this._formatted),this.path&&(_.path=this.path),this.scheme&&(_.scheme=this.scheme),this.authority&&(_.authority=this.authority),this.query&&(_.query=this.query),this.fragment&&(_.fragment=this.fragment),_}}const f={[58]:"%3A",[47]:"%2F",[63]:"%3F",[35]:"%23",[91]:"%5B",[93]:"%5D",[64]:"%40",[33]:"%21",[36]:"%24",[38]:"%26",[39]:"%27",[40]:"%28",[41]:"%29",[42]:"%2A",[43]:"%2B",[44]:"%2C",[59]:"%3B",[61]:"%3D",[32]:"%20"};function y(l,_,g){let v,R=-1;for(let N=0;N<l.length;N++){const D=l.charCodeAt(N);if(D>=97&&D<=122||D>=65&&D<=90||D>=48&&D<=57||D===45||D===46||D===95||D===126||_&&D===47||g&&D===91||g&&D===93||g&&D===58)R!==-1&&(v+=encodeURIComponent(l.substring(R,N)),R=-1),v!==void 0&&(v+=l.charAt(N));else{v===void 0&&(v=l.substr(0,N));const x=f[D];x!==void 0?(R!==-1&&(v+=encodeURIComponent(l.substring(R,N)),R=-1),v+=x):R===-1&&(R=N)}}return R!==-1&&(v+=encodeURIComponent(l.substring(R))),v!==void 0?v:l}function w(l){let _;for(let g=0;g<l.length;g++){const v=l.charCodeAt(g);v===35||v===63?(_===void 0&&(_=l.substr(0,g)),_+=f[v]):_!==void 0&&(_+=l[g])}return _!==void 0?_:l}function E(l,_){let g;return l.authority&&l.path.length>1&&l.scheme==="file"?g=`//${l.authority}${l.path}`:l.path.charCodeAt(0)===47&&(l.path.charCodeAt(1)>=65&&l.path.charCodeAt(1)<=90||l.path.charCodeAt(1)>=97&&l.path.charCodeAt(1)<=122)&&l.path.charCodeAt(2)===58?_?g=l.path.substr(1):g=l.path[1].toLowerCase()+l.path.substr(2):g=l.path,A.isWindows&&(g=g.replace(/\//g,"\\")),g}n.uriToFsPath=E;function S(l,_){const g=_?w:y;let v="",{scheme:R,authority:N,path:D,query:x,fragment:T}=l;if(R&&(v+=R,v+=":"),(N||R==="file")&&(v+=e,v+=e),N){let F=N.indexOf("@");if(F!==-1){const B=N.substr(0,F);N=N.substr(F+1),F=B.lastIndexOf(":"),F===-1?v+=g(B,!1,!1):(v+=g(B.substr(0,F),!1,!1),v+=":",v+=g(B.substr(F+1),!1,!0)),v+="@"}N=N.toLowerCase(),F=N.lastIndexOf(":"),F===-1?v+=g(N,!1,!0):(v+=g(N.substr(0,F),!1,!0),v+=N.substr(F))}if(D){if(D.length>=3&&D.charCodeAt(0)===47&&D.charCodeAt(2)===58){const F=D.charCodeAt(1);F>=65&&F<=90&&(D=`/${String.fromCharCode(F+32)}:${D.substr(3)}`)}else if(D.length>=2&&D.charCodeAt(1)===58){const F=D.charCodeAt(0);F>=65&&F<=90&&(D=`${String.fromCharCode(F+32)}:${D.substr(2)}`)}v+=g(D,!0,!1)}return x&&(v+="?",v+=g(x,!1,!1)),T&&(v+="#",v+=_?T:y(T,!1,!1)),v}function C(l){try{return decodeURIComponent(l)}catch{return l.length>3?l.substr(0,3)+C(l.substr(3)):l}}const r=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function s(l){return l.match(r)?l.replace(r,_=>C(_)):l}}),Y(X[67],J([0,1,5,9,13,14,17,6]),function(q,n,M,A,i,d,b,p){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.create=n.SimpleWorkerServer=n.SimpleWorkerClient=n.logOnceWebWorkerWarning=void 0;const h="$initialize";let o=!1;function L(s){b.isWeb&&(o||(o=!0,console.warn("Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq")),console.warn(s.message))}n.logOnceWebWorkerWarning=L;class e{constructor(l,_,g,v){this.vsWorker=l,this.req=_,this.method=g,this.args=v,this.type=0}}class a{constructor(l,_,g,v){this.vsWorker=l,this.seq=_,this.res=g,this.err=v,this.type=1}}class u{constructor(l,_,g,v){this.vsWorker=l,this.req=_,this.eventName=g,this.arg=v,this.type=2}}class c{constructor(l,_,g){this.vsWorker=l,this.req=_,this.event=g,this.type=3}}class m{constructor(l,_){this.vsWorker=l,this.req=_,this.type=4}}class f{constructor(l){this._workerId=-1,this._handler=l,this._lastSentReq=0,this._pendingReplies=Object.create(null),this._pendingEmitters=new Map,this._pendingEvents=new Map}setWorkerId(l){this._workerId=l}sendMessage(l,_){const g=String(++this._lastSentReq);return new Promise((v,R)=>{this._pendingReplies[g]={resolve:v,reject:R},this._send(new e(this._workerId,g,l,_))})}listen(l,_){let g=null;const v=new A.Emitter({onWillAddFirstListener:()=>{g=String(++this._lastSentReq),this._pendingEmitters.set(g,v),this._send(new u(this._workerId,g,l,_))},onDidRemoveLastListener:()=>{this._pendingEmitters.delete(g),this._send(new m(this._workerId,g)),g=null}});return v.event}handleMessage(l){!l||!l.vsWorker||this._workerId!==-1&&l.vsWorker!==this._workerId||this._handleMessage(l)}_handleMessage(l){switch(l.type){case 1:return this._handleReplyMessage(l);case 0:return this._handleRequestMessage(l);case 2:return this._handleSubscribeEventMessage(l);case 3:return this._handleEventMessage(l);case 4:return this._handleUnsubscribeEventMessage(l)}}_handleReplyMessage(l){if(!this._pendingReplies[l.seq]){console.warn("Got reply to unknown seq");return}const _=this._pendingReplies[l.seq];if(delete this._pendingReplies[l.seq],l.err){let g=l.err;l.err.$isError&&(g=new Error,g.name=l.err.name,g.message=l.err.message,g.stack=l.err.stack),_.reject(g);return}_.resolve(l.res)}_handleRequestMessage(l){const _=l.req;this._handler.handleMessage(l.method,l.args).then(v=>{this._send(new a(this._workerId,_,v,void 0))},v=>{v.detail instanceof Error&&(v.detail=(0,M.transformErrorForSerialization)(v.detail)),this._send(new a(this._workerId,_,void 0,(0,M.transformErrorForSerialization)(v)))})}_handleSubscribeEventMessage(l){const _=l.req,g=this._handler.handleEvent(l.eventName,l.arg)(v=>{this._send(new c(this._workerId,_,v))});this._pendingEvents.set(_,g)}_handleEventMessage(l){if(!this._pendingEmitters.has(l.req)){console.warn("Got event for unknown req");return}this._pendingEmitters.get(l.req).fire(l.event)}_handleUnsubscribeEventMessage(l){if(!this._pendingEvents.has(l.req)){console.warn("Got unsubscribe for unknown req");return}this._pendingEvents.get(l.req).dispose(),this._pendingEvents.delete(l.req)}_send(l){const _=[];if(l.type===0)for(let g=0;g<l.args.length;g++)l.args[g]instanceof ArrayBuffer&&_.push(l.args[g]);else l.type===1&&l.res instanceof ArrayBuffer&&_.push(l.res);this._handler.sendMessage(l,_)}}class y extends i.Disposable{constructor(l,_,g){super();let v=null;this._worker=this._register(l.create("vs/base/common/worker/simpleWorker",F=>{this._protocol.handleMessage(F)},F=>{v?.(F)})),this._protocol=new f({sendMessage:(F,B)=>{this._worker.postMessage(F,B)},handleMessage:(F,B)=>{if(typeof g[F]!="function")return Promise.reject(new Error("Missing method "+F+" on main thread host."));try{return Promise.resolve(g[F].apply(g,B))}catch(V){return Promise.reject(V)}},handleEvent:(F,B)=>{if(E(F)){const V=g[F].call(g,B);if(typeof V!="function")throw new Error(`Missing dynamic event ${F} on main thread host.`);return V}if(w(F)){const V=g[F];if(typeof V!="function")throw new Error(`Missing event ${F} on main thread host.`);return V}throw new Error(`Malformed event name ${F}`)}}),this._protocol.setWorkerId(this._worker.getId());let R=null;const N=globalThis.require;typeof N<"u"&&typeof N.getConfig=="function"?R=N.getConfig():typeof globalThis.requirejs<"u"&&(R=globalThis.requirejs.s.contexts._.config);const D=(0,d.getAllMethodNames)(g);this._onModuleLoaded=this._protocol.sendMessage(h,[this._worker.getId(),JSON.parse(JSON.stringify(R)),_,D]);const x=(F,B)=>this._request(F,B),T=(F,B)=>this._protocol.listen(F,B);this._lazyProxy=new Promise((F,B)=>{v=B,this._onModuleLoaded.then(V=>{F(S(V,x,T))},V=>{B(V),this._onError("Worker failed to load "+_,V)})})}getProxyObject(){return this._lazyProxy}_request(l,_){return new Promise((g,v)=>{this._onModuleLoaded.then(()=>{this._protocol.sendMessage(l,_).then(g,v)},v)})}_onError(l,_){console.error(l),console.info(_)}}n.SimpleWorkerClient=y;function w(s){return s[0]==="o"&&s[1]==="n"&&p.isUpperAsciiLetter(s.charCodeAt(2))}function E(s){return/^onDynamic/.test(s)&&p.isUpperAsciiLetter(s.charCodeAt(9))}function S(s,l,_){const g=N=>function(){const D=Array.prototype.slice.call(arguments,0);return l(N,D)},v=N=>function(D){return _(N,D)},R={};for(const N of s){if(E(N)){R[N]=v(N);continue}if(w(N)){R[N]=_(N,void 0);continue}R[N]=g(N)}return R}class C{constructor(l,_){this._requestHandlerFactory=_,this._requestHandler=null,this._protocol=new f({sendMessage:(g,v)=>{l(g,v)},handleMessage:(g,v)=>this._handleMessage(g,v),handleEvent:(g,v)=>this._handleEvent(g,v)})}onmessage(l){this._protocol.handleMessage(l)}_handleMessage(l,_){if(l===h)return this.initialize(_[0],_[1],_[2],_[3]);if(!this._requestHandler||typeof this._requestHandler[l]!="function")return Promise.reject(new Error("Missing requestHandler or method: "+l));try{return Promise.resolve(this._requestHandler[l].apply(this._requestHandler,_))}catch(g){return Promise.reject(g)}}_handleEvent(l,_){if(!this._requestHandler)throw new Error("Missing requestHandler");if(E(l)){const g=this._requestHandler[l].call(this._requestHandler,_);if(typeof g!="function")throw new Error(`Missing dynamic event ${l} on request handler.`);return g}if(w(l)){const g=this._requestHandler[l];if(typeof g!="function")throw new Error(`Missing event ${l} on request handler.`);return g}throw new Error(`Malformed event name ${l}`)}initialize(l,_,g,v){this._protocol.setWorkerId(l);const D=S(v,(x,T)=>this._protocol.sendMessage(x,T),(x,T)=>this._protocol.listen(x,T));return this._requestHandlerFactory?(this._requestHandler=this._requestHandlerFactory(D),Promise.resolve((0,d.getAllMethodNames)(this._requestHandler))):(_&&(typeof _.baseUrl<"u"&&delete _.baseUrl,typeof _.paths<"u"&&typeof _.paths.vs<"u"&&delete _.paths.vs,typeof _.trustedTypesPolicy<"u"&&delete _.trustedTypesPolicy,_.catchError=!0,globalThis.require.config(_)),new Promise((x,T)=>{(globalThis.require||q)([g],B=>{if(this._requestHandler=B.create(D),!this._requestHandler){T(new Error("No RequestHandler!"));return}x((0,d.getAllMethodNames)(this._requestHandler))},T)}))}}n.SimpleWorkerServer=C;function r(s){return new C(s,null)}n.create=r}),Y(X[64],J([19,61]),function(q,n){return q.create("vs/editor/common/languages",n)}),Y(X[65],J([0,1,40,18,2,59,64]),function(q,n,M,A,i,d,b){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.TokenizationRegistry=n.LazyTokenizationSupport=n.InlayHintKind=n.Command=n.FoldingRangeKind=n.TextEdit=n.SymbolKinds=n.getAriaLabelForSymbol=n.symbolKindNames=n.isLocationLink=n.DocumentHighlightKind=n.SignatureHelpTriggerKind=n.SelectedSuggestionInfo=n.InlineCompletionTriggerKind=n.CompletionItemKinds=n.EncodedTokenizationResult=n.TokenizationResult=n.Token=void 0;class p{constructor(l,_,g){this.offset=l,this.type=_,this.language=g,this._tokenBrand=void 0}toString(){return"("+this.offset+", "+this.type+")"}}n.Token=p;class h{constructor(l,_){this.tokens=l,this.endState=_,this._tokenizationResultBrand=void 0}}n.TokenizationResult=h;class o{constructor(l,_){this.tokens=l,this.endState=_,this._encodedTokenizationResultBrand=void 0}}n.EncodedTokenizationResult=o;var L;(function(s){const l=new Map;l.set(0,M.Codicon.symbolMethod),l.set(1,M.Codicon.symbolFunction),l.set(2,M.Codicon.symbolConstructor),l.set(3,M.Codicon.symbolField),l.set(4,M.Codicon.symbolVariable),l.set(5,M.Codicon.symbolClass),l.set(6,M.Codicon.symbolStruct),l.set(7,M.Codicon.symbolInterface),l.set(8,M.Codicon.symbolModule),l.set(9,M.Codicon.symbolProperty),l.set(10,M.Codicon.symbolEvent),l.set(11,M.Codicon.symbolOperator),l.set(12,M.Codicon.symbolUnit),l.set(13,M.Codicon.symbolValue),l.set(15,M.Codicon.symbolEnum),l.set(14,M.Codicon.symbolConstant),l.set(15,M.Codicon.symbolEnum),l.set(16,M.Codicon.symbolEnumMember),l.set(17,M.Codicon.symbolKeyword),l.set(27,M.Codicon.symbolSnippet),l.set(18,M.Codicon.symbolText),l.set(19,M.Codicon.symbolColor),l.set(20,M.Codicon.symbolFile),l.set(21,M.Codicon.symbolReference),l.set(22,M.Codicon.symbolCustomColor),l.set(23,M.Codicon.symbolFolder),l.set(24,M.Codicon.symbolTypeParameter),l.set(25,M.Codicon.account),l.set(26,M.Codicon.issues);function _(R){let N=l.get(R);return N||(console.info("No codicon found for CompletionItemKind "+R),N=M.Codicon.symbolProperty),N}s.toIcon=_;const g=new Map;g.set("method",0),g.set("function",1),g.set("constructor",2),g.set("field",3),g.set("variable",4),g.set("class",5),g.set("struct",6),g.set("interface",7),g.set("module",8),g.set("property",9),g.set("event",10),g.set("operator",11),g.set("unit",12),g.set("value",13),g.set("constant",14),g.set("enum",15),g.set("enum-member",16),g.set("enumMember",16),g.set("keyword",17),g.set("snippet",27),g.set("text",18),g.set("color",19),g.set("file",20),g.set("reference",21),g.set("customcolor",22),g.set("folder",23),g.set("type-parameter",24),g.set("typeParameter",24),g.set("account",25),g.set("issue",26);function v(R,N){let D=g.get(R);return typeof D>"u"&&!N&&(D=9),D}s.fromString=v})(L||(n.CompletionItemKinds=L={}));var e;(function(s){s[s.Automatic=0]="Automatic",s[s.Explicit=1]="Explicit"})(e||(n.InlineCompletionTriggerKind=e={}));class a{constructor(l,_,g,v){this.range=l,this.text=_,this.completionKind=g,this.isSnippetText=v}equals(l){return i.Range.lift(this.range).equalsRange(l.range)&&this.text===l.text&&this.completionKind===l.completionKind&&this.isSnippetText===l.isSnippetText}}n.SelectedSuggestionInfo=a;var u;(function(s){s[s.Invoke=1]="Invoke",s[s.TriggerCharacter=2]="TriggerCharacter",s[s.ContentChange=3]="ContentChange"})(u||(n.SignatureHelpTriggerKind=u={}));var c;(function(s){s[s.Text=0]="Text",s[s.Read=1]="Read",s[s.Write=2]="Write"})(c||(n.DocumentHighlightKind=c={}));function m(s){return s&&A.URI.isUri(s.uri)&&i.Range.isIRange(s.range)&&(i.Range.isIRange(s.originSelectionRange)||i.Range.isIRange(s.targetSelectionRange))}n.isLocationLink=m,n.symbolKindNames={[17]:(0,b.localize)(0,null),[16]:(0,b.localize)(1,null),[4]:(0,b.localize)(2,null),[13]:(0,b.localize)(3,null),[8]:(0,b.localize)(4,null),[9]:(0,b.localize)(5,null),[21]:(0,b.localize)(6,null),[23]:(0,b.localize)(7,null),[7]:(0,b.localize)(8,null),[0]:(0,b.localize)(9,null),[11]:(0,b.localize)(10,null),[10]:(0,b.localize)(11,null),[19]:(0,b.localize)(12,null),[5]:(0,b.localize)(13,null),[1]:(0,b.localize)(14,null),[2]:(0,b.localize)(15,null),[20]:(0,b.localize)(16,null),[15]:(0,b.localize)(17,null),[18]:(0,b.localize)(18,null),[24]:(0,b.localize)(19,null),[3]:(0,b.localize)(20,null),[6]:(0,b.localize)(21,null),[14]:(0,b.localize)(22,null),[22]:(0,b.localize)(23,null),[25]:(0,b.localize)(24,null),[12]:(0,b.localize)(25,null)};function f(s,l){return(0,b.localize)(26,null,s,n.symbolKindNames[l])}n.getAriaLabelForSymbol=f;var y;(function(s){const l=new Map;l.set(0,M.Codicon.symbolFile),l.set(1,M.Codicon.symbolModule),l.set(2,M.Codicon.symbolNamespace),l.set(3,M.Codicon.symbolPackage),l.set(4,M.Codicon.symbolClass),l.set(5,M.Codicon.symbolMethod),l.set(6,M.Codicon.symbolProperty),l.set(7,M.Codicon.symbolField),l.set(8,M.Codicon.symbolConstructor),l.set(9,M.Codicon.symbolEnum),l.set(10,M.Codicon.symbolInterface),l.set(11,M.Codicon.symbolFunction),l.set(12,M.Codicon.symbolVariable),l.set(13,M.Codicon.symbolConstant),l.set(14,M.Codicon.symbolString),l.set(15,M.Codicon.symbolNumber),l.set(16,M.Codicon.symbolBoolean),l.set(17,M.Codicon.symbolArray),l.set(18,M.Codicon.symbolObject),l.set(19,M.Codicon.symbolKey),l.set(20,M.Codicon.symbolNull),l.set(21,M.Codicon.symbolEnumMember),l.set(22,M.Codicon.symbolStruct),l.set(23,M.Codicon.symbolEvent),l.set(24,M.Codicon.symbolOperator),l.set(25,M.Codicon.symbolTypeParameter);function _(g){let v=l.get(g);return v||(console.info("No codicon found for SymbolKind "+g),v=M.Codicon.symbolProperty),v}s.toIcon=_})(y||(n.SymbolKinds=y={}));class w{}n.TextEdit=w;class E{static fromValue(l){switch(l){case"comment":return E.Comment;case"imports":return E.Imports;case"region":return E.Region}return new E(l)}constructor(l){this.value=l}}n.FoldingRangeKind=E,E.Comment=new E("comment"),E.Imports=new E("imports"),E.Region=new E("region");var S;(function(s){function l(_){return!_||typeof _!="object"?!1:typeof _.id=="string"&&typeof _.title=="string"}s.is=l})(S||(n.Command=S={}));var C;(function(s){s[s.Type=1]="Type",s[s.Parameter=2]="Parameter"})(C||(n.InlayHintKind=C={}));class r{constructor(l){this.createSupport=l,this._tokenizationSupport=null}dispose(){this._tokenizationSupport&&this._tokenizationSupport.then(l=>{l&&l.dispose()})}get tokenizationSupport(){return this._tokenizationSupport||(this._tokenizationSupport=this.createSupport()),this._tokenizationSupport}}n.LazyTokenizationSupport=r,n.TokenizationRegistry=new d.TokenizationRegistry}),Y(X[66],J([0,1,38,9,35,18,4,2,41,65,58]),function(q,n,M,A,i,d,b,p,h,o,L){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.createMonacoBaseAPI=n.KeyMod=void 0;class e{static chord(c,m){return(0,i.KeyChord)(c,m)}}n.KeyMod=e,e.CtrlCmd=2048,e.Shift=1024,e.Alt=512,e.WinCtrl=256;function a(){return{editor:void 0,languages:void 0,CancellationTokenSource:M.CancellationTokenSource,Emitter:A.Emitter,KeyCode:L.KeyCode,KeyMod:e,Position:b.Position,Range:p.Range,Selection:h.Selection,SelectionDirection:L.SelectionDirection,MarkerSeverity:L.MarkerSeverity,MarkerTag:L.MarkerTag,Uri:d.URI,Token:o.Token}}n.createMonacoBaseAPI=a}),Y(X[68],J([0,1,24,18,4,2,55,28,51,52,66,23,57,49,14,50]),function(q,n,M,A,i,d,b,p,h,o,L,e,a,u,c,m){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.create=n.EditorSimpleWorker=void 0;class f extends b.MirrorTextModel{get uri(){return this._uri}get eol(){return this._eol}getValue(){return this.getText()}findMatches(S){const C=[];for(let r=0;r<this._lines.length;r++){const s=this._lines[r],l=this.offsetAt(new i.Position(r+1,1)),_=s.matchAll(S);for(const g of _)(g.index||g.index===0)&&(g.index=g.index+l),C.push(g)}return C}getLinesContent(){return this._lines.slice(0)}getLineCount(){return this._lines.length}getLineContent(S){return this._lines[S-1]}getWordAtPosition(S,C){const r=(0,p.getWordAtText)(S.column,(0,p.ensureValidWordDefinition)(C),this._lines[S.lineNumber-1],0);return r?new d.Range(S.lineNumber,r.startColumn,S.lineNumber,r.endColumn):null}words(S){const C=this._lines,r=this._wordenize.bind(this);let s=0,l="",_=0,g=[];return{*[Symbol.iterator](){for(;;)if(_<g.length){const v=l.substring(g[_].start,g[_].end);_+=1,yield v}else if(s<C.length)l=C[s],g=r(l,S),_=0,s+=1;else break}}}getLineWords(S,C){const r=this._lines[S-1],s=this._wordenize(r,C),l=[];for(const _ of s)l.push({word:r.substring(_.start,_.end),startColumn:_.start+1,endColumn:_.end+1});return l}_wordenize(S,C){const r=[];let s;for(C.lastIndex=0;(s=C.exec(S))&&s[0].length!==0;)r.push({start:s.index,end:s.index+s[0].length});return r}getValueInRange(S){if(S=this._validateRange(S),S.startLineNumber===S.endLineNumber)return this._lines[S.startLineNumber-1].substring(S.startColumn-1,S.endColumn-1);const C=this._eol,r=S.startLineNumber-1,s=S.endLineNumber-1,l=[];l.push(this._lines[r].substring(S.startColumn-1));for(let _=r+1;_<s;_++)l.push(this._lines[_]);return l.push(this._lines[s].substring(0,S.endColumn-1)),l.join(C)}offsetAt(S){return S=this._validatePosition(S),this._ensureLineStarts(),this._lineStarts.getPrefixSum(S.lineNumber-2)+(S.column-1)}positionAt(S){S=Math.floor(S),S=Math.max(0,S),this._ensureLineStarts();const C=this._lineStarts.getIndexOf(S),r=this._lines[C.index].length;return{lineNumber:1+C.index,column:1+Math.min(C.remainder,r)}}_validateRange(S){const C=this._validatePosition({lineNumber:S.startLineNumber,column:S.startColumn}),r=this._validatePosition({lineNumber:S.endLineNumber,column:S.endColumn});return C.lineNumber!==S.startLineNumber||C.column!==S.startColumn||r.lineNumber!==S.endLineNumber||r.column!==S.endColumn?{startLineNumber:C.lineNumber,startColumn:C.column,endLineNumber:r.lineNumber,endColumn:r.column}:S}_validatePosition(S){if(!i.Position.isIPosition(S))throw new Error("bad position");let{lineNumber:C,column:r}=S,s=!1;if(C<1)C=1,r=1,s=!0;else if(C>this._lines.length)C=this._lines.length,r=this._lines[C-1].length+1,s=!0;else{const l=this._lines[C-1].length+1;r<1?(r=1,s=!0):r>l&&(r=l,s=!0)}return s?{lineNumber:C,column:r}:S}}class y{constructor(S,C){this._host=S,this._models=Object.create(null),this._foreignModuleFactory=C,this._foreignModule=null}dispose(){this._models=Object.create(null)}_getModel(S){return this._models[S]}_getModels(){const S=[];return Object.keys(this._models).forEach(C=>S.push(this._models[C])),S}acceptNewModel(S){this._models[S.url]=new f(A.URI.parse(S.url),S.lines,S.EOL,S.versionId)}acceptModelChanged(S,C){if(!this._models[S])return;this._models[S].onEvents(C)}acceptRemovedModel(S){this._models[S]&&delete this._models[S]}async computeUnicodeHighlights(S,C,r){const s=this._getModel(S);return s?a.UnicodeTextModelHighlighter.computeUnicodeHighlights(s,C,r):{ranges:[],hasMore:!1,ambiguousCharacterCount:0,invisibleCharacterCount:0,nonBasicAsciiCharacterCount:0}}async computeDiff(S,C,r,s){const l=this._getModel(S),_=this._getModel(C);return!l||!_?null:y.computeDiff(l,_,r,s)}static computeDiff(S,C,r,s){const l=s==="advanced"?u.linesDiffComputers.getDefault():u.linesDiffComputers.getLegacy(),_=S.getLinesContent(),g=C.getLinesContent(),v=l.computeDiff(_,g,r),R=v.changes.length>0?!1:this._modelsAreIdentical(S,C);function N(D){return D.map(x=>{var T;return[x.original.startLineNumber,x.original.endLineNumberExclusive,x.modified.startLineNumber,x.modified.endLineNumberExclusive,(T=x.innerChanges)===null||T===void 0?void 0:T.map(F=>[F.originalRange.startLineNumber,F.originalRange.startColumn,F.originalRange.endLineNumber,F.originalRange.endColumn,F.modifiedRange.startLineNumber,F.modifiedRange.startColumn,F.modifiedRange.endLineNumber,F.modifiedRange.endColumn])]})}return{identical:R,quitEarly:v.hitTimeout,changes:N(v.changes),moves:v.moves.map(D=>[D.lineRangeMapping.original.startLineNumber,D.lineRangeMapping.original.endLineNumberExclusive,D.lineRangeMapping.modified.startLineNumber,D.lineRangeMapping.modified.endLineNumberExclusive,N(D.changes)])}}static _modelsAreIdentical(S,C){const r=S.getLineCount(),s=C.getLineCount();if(r!==s)return!1;for(let l=1;l<=r;l++){const _=S.getLineContent(l),g=C.getLineContent(l);if(_!==g)return!1}return!0}async computeMoreMinimalEdits(S,C,r){const s=this._getModel(S);if(!s)return C;const l=[];let _;C=C.slice(0).sort((v,R)=>{if(v.range&&R.range)return d.Range.compareRangesUsingStarts(v.range,R.range);const N=v.range?0:1,D=R.range?0:1;return N-D});let g=0;for(let v=1;v<C.length;v++)d.Range.getEndPosition(C[g].range).equals(d.Range.getStartPosition(C[v].range))?(C[g].range=d.Range.fromPositions(d.Range.getStartPosition(C[g].range),d.Range.getEndPosition(C[v].range)),C[g].text+=C[v].text):(g++,C[g]=C[v]);C.length=g+1;for(let{range:v,text:R,eol:N}of C){if(typeof N=="number"&&(_=N),d.Range.isEmpty(v)&&!R)continue;const D=s.getValueInRange(v);if(R=R.replace(/\r\n|\n|\r/g,s.eol),D===R)continue;if(Math.max(R.length,D.length)>y._diffLimit){l.push({range:v,text:R});continue}const x=(0,M.stringDiff)(D,R,r),T=s.offsetAt(d.Range.lift(v).getStartPosition());for(const F of x){const B=s.positionAt(T+F.originalStart),V=s.positionAt(T+F.originalStart+F.originalLength),k={text:R.substr(F.modifiedStart,F.modifiedLength),range:{startLineNumber:B.lineNumber,startColumn:B.column,endLineNumber:V.lineNumber,endColumn:V.column}};s.getValueInRange(k.range)!==k.text&&l.push(k)}}return typeof _=="number"&&l.push({eol:_,text:"",range:{startLineNumber:0,startColumn:0,endLineNumber:0,endColumn:0}}),l}async computeLinks(S){const C=this._getModel(S);return C?(0,h.computeLinks)(C):null}async computeDefaultDocumentColors(S){const C=this._getModel(S);return C?(0,m.computeDefaultDocumentColors)(C):null}async textualSuggest(S,C,r,s){const l=new e.StopWatch,_=new RegExp(r,s),g=new Set;e:for(const v of S){const R=this._getModel(v);if(R){for(const N of R.words(_))if(!(N===C||!isNaN(Number(N)))&&(g.add(N),g.size>y._suggestionsLimit))break e}}return{words:Array.from(g),duration:l.elapsed()}}async computeWordRanges(S,C,r,s){const l=this._getModel(S);if(!l)return Object.create(null);const _=new RegExp(r,s),g=Object.create(null);for(let v=C.startLineNumber;v<C.endLineNumber;v++){const R=l.getLineWords(v,_);for(const N of R){if(!isNaN(Number(N.word)))continue;let D=g[N.word];D||(D=[],g[N.word]=D),D.push({startLineNumber:v,startColumn:N.startColumn,endLineNumber:v,endColumn:N.endColumn})}}return g}async navigateValueSet(S,C,r,s,l){const _=this._getModel(S);if(!_)return null;const g=new RegExp(s,l);C.startColumn===C.endColumn&&(C={startLineNumber:C.startLineNumber,startColumn:C.startColumn,endLineNumber:C.endLineNumber,endColumn:C.endColumn+1});const v=_.getValueInRange(C),R=_.getWordAtPosition({lineNumber:C.startLineNumber,column:C.startColumn},g);if(!R)return null;const N=_.getValueInRange(R);return o.BasicInplaceReplace.INSTANCE.navigateValueSet(C,v,R,N,r)}loadForeignModule(S,C,r){const s=(g,v)=>this._host.fhr(g,v),_={host:(0,c.createProxyObject)(r,s),getMirrorModels:()=>this._getModels()};return this._foreignModuleFactory?(this._foreignModule=this._foreignModuleFactory(_,C),Promise.resolve((0,c.getAllMethodNames)(this._foreignModule))):new Promise((g,v)=>{q([S],R=>{this._foreignModule=R.create(_,C),g((0,c.getAllMethodNames)(this._foreignModule))},v)})}fmr(S,C){if(!this._foreignModule||typeof this._foreignModule[S]!="function")return Promise.reject(new Error("Missing requestHandler or method: "+S));try{return Promise.resolve(this._foreignModule[S].apply(this._foreignModule,C))}catch(r){return Promise.reject(r)}}}n.EditorSimpleWorker=y,y._diffLimit=1e5,y._suggestionsLimit=1e4;function w(E){return new y(E,null)}n.create=w,typeof importScripts=="function"&&(globalThis.monaco=(0,L.createMonacoBaseAPI)())})}).call(this);
+
+//# sourceMappingURL=../../../../min-maps/vs/base/worker/workerMain.js.map
\ No newline at end of file
diff --git a/public/vs/basic-languages/abap/abap.js b/public/vs/basic-languages/abap/abap.js
new file mode 100644
index 0000000..1846aac
--- /dev/null
+++ b/public/vs/basic-languages/abap/abap.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/abap/abap", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var i in e)s(t,i,{get:e[i],enumerable:!0})},d=(t,e,i,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of r(e))!c.call(t,n)&&n!==i&&s(t,n,{get:()=>e[n],enumerable:!(a=o(e,n))||a.enumerable});return t};var p=t=>d(s({},"__esModule",{value:!0}),t);var g={};l(g,{conf:()=>m,language:()=>u});var m={comments:{lineComment:"*"},brackets:[["[","]"],["(",")"]]},u={defaultToken:"invalid",ignoreCase:!0,tokenPostfix:".abap",keywords:["abap-source","abbreviated","abstract","accept","accepting","according","activation","actual","add","add-corresponding","adjacent","after","alias","aliases","align","all","allocate","alpha","analysis","analyzer","and","append","appendage","appending","application","archive","area","arithmetic","as","ascending","aspect","assert","assign","assigned","assigning","association","asynchronous","at","attributes","authority","authority-check","avg","back","background","backup","backward","badi","base","before","begin","between","big","binary","bintohex","bit","black","blank","blanks","blob","block","blocks","blue","bound","boundaries","bounds","boxed","break-point","buffer","by","bypassing","byte","byte-order","call","calling","case","cast","casting","catch","center","centered","chain","chain-input","chain-request","change","changing","channels","character","char-to-hex","check","checkbox","ci_","circular","class","class-coding","class-data","class-events","class-methods","class-pool","cleanup","clear","client","clob","clock","close","coalesce","code","coding","col_background","col_group","col_heading","col_key","col_negative","col_normal","col_positive","col_total","collect","color","column","columns","comment","comments","commit","common","communication","comparing","component","components","compression","compute","concat","concat_with_space","concatenate","cond","condense","condition","connect","connection","constants","context","contexts","continue","control","controls","conv","conversion","convert","copies","copy","corresponding","country","cover","cpi","create","creating","critical","currency","currency_conversion","current","cursor","cursor-selection","customer","customer-function","dangerous","data","database","datainfo","dataset","date","dats_add_days","dats_add_months","dats_days_between","dats_is_valid","daylight","dd/mm/yy","dd/mm/yyyy","ddmmyy","deallocate","decimal_shift","decimals","declarations","deep","default","deferred","define","defining","definition","delete","deleting","demand","department","descending","describe","destination","detail","dialog","directory","disconnect","display","display-mode","distinct","divide","divide-corresponding","division","do","dummy","duplicate","duplicates","duration","during","dynamic","dynpro","edit","editor-call","else","elseif","empty","enabled","enabling","encoding","end","endat","endcase","endcatch","endchain","endclass","enddo","endenhancement","end-enhancement-section","endexec","endform","endfunction","endian","endif","ending","endinterface","end-lines","endloop","endmethod","endmodule","end-of-definition","end-of-editing","end-of-file","end-of-page","end-of-selection","endon","endprovide","endselect","end-test-injection","end-test-seam","endtry","endwhile","endwith","engineering","enhancement","enhancement-point","enhancements","enhancement-section","entries","entry","enum","environment","equiv","errormessage","errors","escaping","event","events","exact","except","exception","exceptions","exception-table","exclude","excluding","exec","execute","exists","exit","exit-command","expand","expanding","expiration","explicit","exponent","export","exporting","extend","extended","extension","extract","fail","fetch","field","field-groups","fields","field-symbol","field-symbols","file","filter","filters","filter-table","final","find","first","first-line","fixed-point","fkeq","fkge","flush","font","for","form","format","forward","found","frame","frames","free","friends","from","function","functionality","function-pool","further","gaps","generate","get","giving","gkeq","gkge","global","grant","green","group","groups","handle","handler","harmless","hashed","having","hdb","header","headers","heading","head-lines","help-id","help-request","hextobin","hide","high","hint","hold","hotspot","icon","id","identification","identifier","ids","if","ignore","ignoring","immediately","implementation","implementations","implemented","implicit","import","importing","in","inactive","incl","include","includes","including","increment","index","index-line","infotypes","inheriting","init","initial","initialization","inner","inout","input","insert","instance","instances","instr","intensified","interface","interface-pool","interfaces","internal","intervals","into","inverse","inverted-date","is","iso","job","join","keep","keeping","kernel","key","keys","keywords","kind","language","last","late","layout","leading","leave","left","left-justified","leftplus","leftspace","legacy","length","let","level","levels","like","line","lines","line-count","linefeed","line-selection","line-size","list","listbox","list-processing","little","llang","load","load-of-program","lob","local","locale","locator","logfile","logical","log-point","long","loop","low","lower","lpad","lpi","ltrim","mail","main","major-id","mapping","margin","mark","mask","match","matchcode","max","maximum","medium","members","memory","mesh","message","message-id","messages","messaging","method","methods","min","minimum","minor-id","mm/dd/yy","mm/dd/yyyy","mmddyy","mode","modif","modifier","modify","module","move","move-corresponding","multiply","multiply-corresponding","name","nametab","native","nested","nesting","new","new-line","new-page","new-section","next","no","no-display","no-extension","no-gap","no-gaps","no-grouping","no-heading","no-scrolling","no-sign","no-title","no-topofpage","no-zero","node","nodes","non-unicode","non-unique","not","null","number","object","objects","obligatory","occurrence","occurrences","occurs","of","off","offset","ole","on","only","open","option","optional","options","or","order","other","others","out","outer","output","output-length","overflow","overlay","pack","package","pad","padding","page","pages","parameter","parameters","parameter-table","part","partially","pattern","percentage","perform","performing","person","pf1","pf10","pf11","pf12","pf13","pf14","pf15","pf2","pf3","pf4","pf5","pf6","pf7","pf8","pf9","pf-status","pink","places","pool","pos_high","pos_low","position","pragmas","precompiled","preferred","preserving","primary","print","print-control","priority","private","procedure","process","program","property","protected","provide","public","push","pushbutton","put","queue-only","quickinfo","radiobutton","raise","raising","range","ranges","read","reader","read-only","receive","received","receiver","receiving","red","redefinition","reduce","reduced","ref","reference","refresh","regex","reject","remote","renaming","replace","replacement","replacing","report","request","requested","reserve","reset","resolution","respecting","responsible","result","results","resumable","resume","retry","return","returncode","returning","returns","right","right-justified","rightplus","rightspace","risk","rmc_communication_failure","rmc_invalid_status","rmc_system_failure","role","rollback","rows","rpad","rtrim","run","sap","sap-spool","saving","scale_preserving","scale_preserving_scientific","scan","scientific","scientific_with_leading_zero","scroll","scroll-boundary","scrolling","search","secondary","seconds","section","select","selection","selections","selection-screen","selection-set","selection-sets","selection-table","select-options","send","separate","separated","set","shared","shift","short","shortdump-id","sign_as_postfix","single","size","skip","skipping","smart","some","sort","sortable","sorted","source","specified","split","spool","spots","sql","sqlscript","stable","stamp","standard","starting","start-of-editing","start-of-selection","state","statement","statements","static","statics","statusinfo","step-loop","stop","structure","structures","style","subkey","submatches","submit","subroutine","subscreen","subtract","subtract-corresponding","suffix","sum","summary","summing","supplied","supply","suppress","switch","switchstates","symbol","syncpoints","syntax","syntax-check","syntax-trace","system-call","system-exceptions","system-exit","tab","tabbed","table","tables","tableview","tabstrip","target","task","tasks","test","testing","test-injection","test-seam","text","textpool","then","throw","time","times","timestamp","timezone","tims_is_valid","title","titlebar","title-lines","to","tokenization","tokens","top-lines","top-of-page","trace-file","trace-table","trailing","transaction","transfer","transformation","translate","transporting","trmac","truncate","truncation","try","tstmp_add_seconds","tstmp_current_utctimestamp","tstmp_is_valid","tstmp_seconds_between","type","type-pool","type-pools","types","uline","unassign","under","unicode","union","unique","unit_conversion","unix","unpack","until","unwind","up","update","upper","user","user-command","using","utf-8","valid","value","value-request","values","vary","varying","verification-message","version","via","view","visible","wait","warning","when","whenever","where","while","width","window","windows","with","with-heading","without","with-title","word","work","write","writer","xml","xsd","yellow","yes","yymmdd","zero","zone","abap_system_timezone","abap_user_timezone","access","action","adabas","adjust_numbers","allow_precision_loss","allowed","amdp","applicationuser","as_geo_json","as400","associations","balance","behavior","breakup","bulk","cds","cds_client","check_before_save","child","clients","corr","corr_spearman","cross","cycles","datn_add_days","datn_add_months","datn_days_between","dats_from_datn","dats_tims_to_tstmp","dats_to_datn","db2","db6","ddl","dense_rank","depth","deterministic","discarding","entities","entity","error","failed","finalize","first_value","fltp_to_dec","following","fractional","full","graph","grouping","hierarchy","hierarchy_ancestors","hierarchy_ancestors_aggregate","hierarchy_descendants","hierarchy_descendants_aggregate","hierarchy_siblings","incremental","indicators","lag","last_value","lead","leaves","like_regexpr","link","locale_sap","lock","locks","many","mapped","matched","measures","median","mssqlnt","multiple","nodetype","ntile","nulls","occurrences_regexpr","one","operations","oracle","orphans","over","parent","parents","partition","pcre","period","pfcg_mapping","preceding","privileged","product","projection","rank","redirected","replace_regexpr","reported","response","responses","root","row","row_number","sap_system_date","save","schema","session","sets","shortdump","siblings","spantree","start","stddev","string_agg","subtotal","sybase","tims_from_timn","tims_to_timn","to_blob","to_clob","total","trace-entry","tstmp_to_dats","tstmp_to_dst","tstmp_to_tims","tstmpl_from_utcl","tstmpl_to_utcl","unbounded","utcl_add_seconds","utcl_current","utcl_seconds_between","uuid","var","verbatim"],builtinFunctions:["abs","acos","asin","atan","bit-set","boolc","boolx","ceil","char_off","charlen","cmax","cmin","concat_lines_of","contains","contains_any_not_of","contains_any_of","cos","cosh","count","count_any_not_of","count_any_of","dbmaxlen","distance","escape","exp","find_any_not_of","find_any_of","find_end","floor","frac","from_mixed","ipow","line_exists","line_index","log","log10","matches","nmax","nmin","numofchar","repeat","rescale","reverse","round","segment","shift_left","shift_right","sign","sin","sinh","sqrt","strlen","substring","substring_after","substring_before","substring_from","substring_to","tan","tanh","to_lower","to_mixed","to_upper","trunc","utclong_add","utclong_current","utclong_diff","xsdbool","xstrlen"],typeKeywords:["b","c","d","decfloat16","decfloat34","f","i","int8","n","p","s","string","t","utclong","x","xstring","any","clike","csequence","decfloat","numeric","simple","xsequence","accp","char","clnt","cuky","curr","datn","dats","d16d","d16n","d16r","d34d","d34n","d34r","dec","df16_dec","df16_raw","df34_dec","df34_raw","fltp","geom_ewkb","int1","int2","int4","lang","lchr","lraw","numc","quan","raw","rawstring","sstring","timn","tims","unit","utcl","df16_scl","df34_scl","prec","varc","abap_bool","abap_false","abap_true","abap_undefined","me","screen","space","super","sy","syst","table_line","*sys*"],builtinMethods:["class_constructor","constructor"],derivedTypes:["%CID","%CID_REF","%CONTROL","%DATA","%ELEMENT","%FAIL","%KEY","%MSG","%PARAM","%PID","%PID_ASSOC","%PID_PARENT","%_HINTS"],cdsLanguage:["@AbapAnnotation","@AbapCatalog","@AccessControl","@API","@ClientDependent","@ClientHandling","@CompatibilityContract","@DataAging","@EndUserText","@Environment","@LanguageDependency","@MappingRole","@Metadata","@MetadataExtension","@ObjectModel","@Scope","@Semantics","$EXTENSION","$SELF"],selectors:["->","->*","=>","~","~*"],operators:[" +"," -","/","*","**","div","mod","=","#","@","+=","-=","*=","/=","**=","&&=","?=","&","&&","bit-and","bit-not","bit-or","bit-xor","m","o","z","<"," >","<=",">=","<>","><","=<","=>","bt","byte-ca","byte-cn","byte-co","byte-cs","byte-na","byte-ns","ca","cn","co","cp","cs","eq","ge","gt","le","lt","na","nb","ne","np","ns","*/","*:","--","/*","//"],symbols:/[=><!~?&+\-*\/\^%#@]+/,tokenizer:{root:[[/[a-z_\/$%@]([\w\/$%]|-(?!>))*/,{cases:{"@typeKeywords":"type","@keywords":"keyword","@cdsLanguage":"annotation","@derivedTypes":"type","@builtinFunctions":"type","@builtinMethods":"type","@operators":"key","@default":"identifier"}}],[/<[\w]+>/,"identifier"],[/##[\w|_]+/,"comment"],{include:"@whitespace"},[/[:,.]/,"delimiter"],[/[{}()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@selectors":"tag","@operators":"key","@default":""}}],[/'/,{token:"string",bracket:"@open",next:"@stringquote"}],[/`/,{token:"string",bracket:"@open",next:"@stringping"}],[/\|/,{token:"string",bracket:"@open",next:"@stringtemplate"}],[/\d+/,"number"]],stringtemplate:[[/[^\\\|]+/,"string"],[/\\\|/,"string"],[/\|/,{token:"string",bracket:"@close",next:"@pop"}]],stringping:[[/[^\\`]+/,"string"],[/`/,{token:"string",bracket:"@close",next:"@pop"}]],stringquote:[[/[^\\']+/,"string"],[/'/,{token:"string",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[/^\*.*$/,"comment"],[/\".*$/,"comment"]]}};return p(g);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/apex/apex.js b/public/vs/basic-languages/apex/apex.js
new file mode 100644
index 0000000..4286997
--- /dev/null
+++ b/public/vs/basic-languages/apex/apex.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/apex/apex", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var i=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var d=(e,t)=>{for(var s in t)i(e,s,{get:t[s],enumerable:!0})},g=(e,t,s,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of c(t))!l.call(e,o)&&o!==s&&i(e,o,{get:()=>t[o],enumerable:!(a=r(t,o))||a.enumerable});return e};var p=e=>g(i({},"__esModule",{value:!0}),e);var h={};d(h,{conf:()=>m,language:()=>b});var m={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:<editor-fold\\b))"),end:new RegExp("^\\s*//\\s*(?:(?:#?endregion\\b)|(?:</editor-fold>))")}}},u=["abstract","activate","and","any","array","as","asc","assert","autonomous","begin","bigdecimal","blob","boolean","break","bulk","by","case","cast","catch","char","class","collect","commit","const","continue","convertcurrency","decimal","default","delete","desc","do","double","else","end","enum","exception","exit","export","extends","false","final","finally","float","for","from","future","get","global","goto","group","having","hint","if","implements","import","in","inner","insert","instanceof","int","interface","into","join","last_90_days","last_month","last_n_days","last_week","like","limit","list","long","loop","map","merge","native","new","next_90_days","next_month","next_n_days","next_week","not","null","nulls","number","object","of","on","or","outer","override","package","parallel","pragma","private","protected","public","retrieve","return","returning","rollback","savepoint","search","select","set","short","sort","stat","static","strictfp","super","switch","synchronized","system","testmethod","then","this","this_month","this_week","throw","throws","today","tolabel","tomorrow","transaction","transient","trigger","true","try","type","undelete","update","upsert","using","virtual","void","volatile","webservice","when","where","while","yesterday"],f=e=>e.charAt(0).toUpperCase()+e.substr(1),n=[];u.forEach(e=>{n.push(e),n.push(e.toUpperCase()),n.push(f(e))});var b={defaultToken:"",tokenPostfix:".apex",keywords:n,operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,digits:/\d+(_+\d+)*/,octaldigits:/[0-7]+(_+[0-7]+)*/,binarydigits:/[0-1]+(_+[0-1]+)*/,hexdigits:/[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,tokenizer:{root:[[/[a-z_$][\w$]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],[/[A-Z][\w\$]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"type.identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@apexdoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],apexdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}};return p(h);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/azcli/azcli.js b/public/vs/basic-languages/azcli/azcli.js
new file mode 100644
index 0000000..0d0e5c0
--- /dev/null
+++ b/public/vs/basic-languages/azcli/azcli.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/azcli/azcli", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(t,e)=>{for(var o in e)s(t,o,{get:e[o],enumerable:!0})},k=(t,e,o,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of r(e))!l.call(t,n)&&n!==o&&s(t,n,{get:()=>e[n],enumerable:!(a=i(e,n))||a.enumerable});return t};var p=t=>k(s({},"__esModule",{value:!0}),t);var d={};c(d,{conf:()=>f,language:()=>g});var f={comments:{lineComment:"#"}},g={defaultToken:"keyword",ignoreCase:!0,tokenPostfix:".azcli",str:/[^#\s]/,tokenizer:{root:[{include:"@comment"},[/\s-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":{token:"key.identifier",next:"@type"}}}],[/^-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":{token:"key.identifier",next:"@type"}}}]],type:[{include:"@comment"},[/-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":"key.identifier"}}],[/@str+\s*/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}]],comment:[[/#.*$/,{cases:{"@eos":{token:"comment",next:"@popall"}}}]]}};return p(d);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/bat/bat.js b/public/vs/basic-languages/bat/bat.js
new file mode 100644
index 0000000..2f3ef12
--- /dev/null
+++ b/public/vs/basic-languages/bat/bat.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/bat/bat", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var n=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var g=(o,e)=>{for(var t in e)n(o,t,{get:e[t],enumerable:!0})},c=(o,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of l(e))!i.call(o,s)&&s!==t&&n(o,s,{get:()=>e[s],enumerable:!(a=r(e,s))||a.enumerable});return o};var p=o=>c(n({},"__esModule",{value:!0}),o);var k={};g(k,{conf:()=>d,language:()=>m});var d={comments:{lineComment:"REM"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],folding:{markers:{start:new RegExp("^\\s*(::\\s*|REM\\s+)#region"),end:new RegExp("^\\s*(::\\s*|REM\\s+)#endregion")}}},m={defaultToken:"",ignoreCase:!0,tokenPostfix:".bat",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:/call|defined|echo|errorlevel|exist|for|goto|if|pause|set|shift|start|title|not|pushd|popd/,symbols:/[=><!~?&|+\-*\/\^;\.,]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^(\s*)(rem(?:\s.*|))$/,["","comment"]],[/(\@?)(@keywords)(?!\w)/,[{token:"keyword"},{token:"keyword.$2"}]],[/[ \t\r\n]+/,""],[/setlocal(?!\w)/,"keyword.tag-setlocal"],[/endlocal(?!\w)/,"keyword.tag-setlocal"],[/[a-zA-Z_]\w*/,""],[/:\w*/,"metatag"],[/%[^%]+%/,"variable"],[/%%[\w]+(?!\w)/,"variable"],[/[{}()\[\]]/,"@brackets"],[/@symbols/,"delimiter"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F_]*[0-9a-fA-F]/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],string:[[/[^\\"'%]+/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/%[\w ]+%/,"variable"],[/%%[\w]+(?!\w)/,"variable"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}],[/$/,"string","@popall"]]}};return p(k);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/bicep/bicep.js b/public/vs/basic-languages/bicep/bicep.js
new file mode 100644
index 0000000..d61b86b
--- /dev/null
+++ b/public/vs/basic-languages/bicep/bicep.js
@@ -0,0 +1,11 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/bicep/bicep", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var g=(e,n)=>{for(var o in n)r(e,o,{get:n[o],enumerable:!0})},l=(e,n,o,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of c(n))!a.call(e,t)&&t!==o&&r(e,t,{get:()=>n[t],enumerable:!(i=s(n,t))||i.enumerable});return e};var m=e=>l(r({},"__esModule",{value:!0}),e);var y={};g(y,{conf:()=>$,language:()=>w});var p=e=>`\\b${e}\\b`,k="[_a-zA-Z]",x="[_a-zA-Z0-9]",u=p(`${k}${x}*`),d=["targetScope","resource","module","param","var","output","for","in","if","existing"],b=["true","false","null"],f="[ \\t\\r\\n]",C="[0-9]+",$={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'"},{open:"'''",close:"'''"}],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:"'''",close:"'''",notIn:["string","comment"]}],autoCloseBefore:`:.,=}])' 
+	`,indentationRules:{increaseIndentPattern:new RegExp("^((?!\\/\\/).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$"),decreaseIndentPattern:new RegExp("^((?!.*?\\/\\*).*\\*/)?\\s*[\\}\\]].*$")}},w={defaultToken:"",tokenPostfix:".bicep",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],symbols:/[=><!~?:&|+\-*/^%]+/,keywords:d,namedLiterals:b,escapes:"\\\\(u{[0-9A-Fa-f]+}|n|r|t|\\\\|'|\\${)",tokenizer:{root:[{include:"@expression"},{include:"@whitespace"}],stringVerbatim:[{regex:"(|'|'')[^']",action:{token:"string"}},{regex:"'''",action:{token:"string.quote",next:"@pop"}}],stringLiteral:[{regex:"\\${",action:{token:"delimiter.bracket",next:"@bracketCounting"}},{regex:"[^\\\\'$]+",action:{token:"string"}},{regex:"@escapes",action:{token:"string.escape"}},{regex:"\\\\.",action:{token:"string.escape.invalid"}},{regex:"'",action:{token:"string",next:"@pop"}}],bracketCounting:[{regex:"{",action:{token:"delimiter.bracket",next:"@bracketCounting"}},{regex:"}",action:{token:"delimiter.bracket",next:"@pop"}},{include:"expression"}],comment:[{regex:"[^\\*]+",action:{token:"comment"}},{regex:"\\*\\/",action:{token:"comment",next:"@pop"}},{regex:"[\\/*]",action:{token:"comment"}}],whitespace:[{regex:f},{regex:"\\/\\*",action:{token:"comment",next:"@comment"}},{regex:"\\/\\/.*$",action:{token:"comment"}}],expression:[{regex:"'''",action:{token:"string.quote",next:"@stringVerbatim"}},{regex:"'",action:{token:"string.quote",next:"@stringLiteral"}},{regex:C,action:{token:"number"}},{regex:u,action:{cases:{"@keywords":{token:"keyword"},"@namedLiterals":{token:"keyword"},"@default":{token:"identifier"}}}}]}};return m(y);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/cameligo/cameligo.js b/public/vs/basic-languages/cameligo/cameligo.js
new file mode 100644
index 0000000..54b5a9e
--- /dev/null
+++ b/public/vs/basic-languages/cameligo/cameligo.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/cameligo/cameligo", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var n in e)s(o,n,{get:e[n],enumerable:!0})},m=(o,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of a(e))!l.call(o,t)&&t!==n&&s(o,t,{get:()=>e[t],enumerable:!(r=i(e,t))||r.enumerable});return o};var p=o=>m(s({},"__esModule",{value:!0}),o);var u={};c(u,{conf:()=>d,language:()=>g});var d={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'},{open:"(*",close:"*)"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'},{open:"(*",close:"*)"}]},g={defaultToken:"",tokenPostfix:".cameligo",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["abs","assert","block","Bytes","case","Crypto","Current","else","failwith","false","for","fun","if","in","let","let%entry","let%init","List","list","Map","map","match","match%nat","mod","not","operation","Operation","of","record","Set","set","sender","skip","source","String","then","to","true","type","with"],typeKeywords:["int","unit","string","tz","nat","bool"],operators:["=",">","<","<=",">=","<>",":",":=","and","mod","or","+","-","*","/","@","&","^","%","->","<-","&&","||"],symbols:/[=><:@\^&|+\-*\/\^%]+/,tokenizer:{root:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\$[0-9a-fA-F]{1,16}/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/'/,"string","@string"],[/'[^\\']'/,"string"],[/'/,"string.invalid"],[/\#\d+/,"string"]],comment:[[/[^\(\*]+/,"comment"],[/\*\)/,"comment","@pop"],[/\(\*/,"comment"]],string:[[/[^\\']+/,"string"],[/\\./,"string.escape.invalid"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\(\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}};return p(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/clojure/clojure.js b/public/vs/basic-languages/clojure/clojure.js
new file mode 100644
index 0000000..b469c57
--- /dev/null
+++ b/public/vs/basic-languages/clojure/clojure.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/clojure/clojure", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var a=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var d=(t,e)=>{for(var r in e)a(t,r,{get:e[r],enumerable:!0})},l=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of i(e))!c.call(t,n)&&n!==r&&a(t,n,{get:()=>e[n],enumerable:!(s=o(e,n))||s.enumerable});return t};var p=t=>l(a({},"__esModule",{value:!0}),t);var h={};d(h,{conf:()=>u,language:()=>m});var u={comments:{lineComment:";;"},brackets:[["[","]"],["(",")"],["{","}"]],autoClosingPairs:[{open:"[",close:"]"},{open:'"',close:'"'},{open:"(",close:")"},{open:"{",close:"}"}],surroundingPairs:[{open:"[",close:"]"},{open:'"',close:'"'},{open:"(",close:")"},{open:"{",close:"}"}]},m={defaultToken:"",ignoreCase:!0,tokenPostfix:".clj",brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"}],constants:["true","false","nil"],numbers:/^(?:[+\-]?\d+(?:(?:N|(?:[eE][+\-]?\d+))|(?:\.?\d*(?:M|(?:[eE][+\-]?\d+))?)|\/\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?(?=[\\\[\]\s"#'(),;@^`{}~]|$))/,characters:/^(?:\\(?:backspace|formfeed|newline|return|space|tab|o[0-7]{3}|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{4}|.)?(?=[\\\[\]\s"(),;@^`{}~]|$))/,escapes:/^\\(?:["'\\bfnrt]|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,qualifiedSymbols:/^(?:(?:[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*(?:\.[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*\/)?(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*(?=[\\\[\]\s"(),;@^`{}~]|$))/,specialForms:[".","catch","def","do","if","monitor-enter","monitor-exit","new","quote","recur","set!","throw","try","var"],coreSymbols:["*","*'","*1","*2","*3","*agent*","*allow-unresolved-vars*","*assert*","*clojure-version*","*command-line-args*","*compile-files*","*compile-path*","*compiler-options*","*data-readers*","*default-data-reader-fn*","*e","*err*","*file*","*flush-on-newline*","*fn-loader*","*in*","*math-context*","*ns*","*out*","*print-dup*","*print-length*","*print-level*","*print-meta*","*print-namespace-maps*","*print-readably*","*read-eval*","*reader-resolver*","*source-path*","*suppress-read*","*unchecked-math*","*use-context-classloader*","*verbose-defrecords*","*warn-on-reflection*","+","+'","-","-'","->","->>","->ArrayChunk","->Eduction","->Vec","->VecNode","->VecSeq","-cache-protocol-fn","-reset-methods","..","/","<","<=","=","==",">",">=","EMPTY-NODE","Inst","StackTraceElement->vec","Throwable->map","accessor","aclone","add-classpath","add-watch","agent","agent-error","agent-errors","aget","alength","alias","all-ns","alter","alter-meta!","alter-var-root","amap","ancestors","and","any?","apply","areduce","array-map","as->","aset","aset-boolean","aset-byte","aset-char","aset-double","aset-float","aset-int","aset-long","aset-short","assert","assoc","assoc!","assoc-in","associative?","atom","await","await-for","await1","bases","bean","bigdec","bigint","biginteger","binding","bit-and","bit-and-not","bit-clear","bit-flip","bit-not","bit-or","bit-set","bit-shift-left","bit-shift-right","bit-test","bit-xor","boolean","boolean-array","boolean?","booleans","bound-fn","bound-fn*","bound?","bounded-count","butlast","byte","byte-array","bytes","bytes?","case","cast","cat","char","char-array","char-escape-string","char-name-string","char?","chars","chunk","chunk-append","chunk-buffer","chunk-cons","chunk-first","chunk-next","chunk-rest","chunked-seq?","class","class?","clear-agent-errors","clojure-version","coll?","comment","commute","comp","comparator","compare","compare-and-set!","compile","complement","completing","concat","cond","cond->","cond->>","condp","conj","conj!","cons","constantly","construct-proxy","contains?","count","counted?","create-ns","create-struct","cycle","dec","dec'","decimal?","declare","dedupe","default-data-readers","definline","definterface","defmacro","defmethod","defmulti","defn","defn-","defonce","defprotocol","defrecord","defstruct","deftype","delay","delay?","deliver","denominator","deref","derive","descendants","destructure","disj","disj!","dissoc","dissoc!","distinct","distinct?","doall","dorun","doseq","dosync","dotimes","doto","double","double-array","double?","doubles","drop","drop-last","drop-while","eduction","empty","empty?","ensure","ensure-reduced","enumeration-seq","error-handler","error-mode","eval","even?","every-pred","every?","ex-data","ex-info","extend","extend-protocol","extend-type","extenders","extends?","false?","ffirst","file-seq","filter","filterv","find","find-keyword","find-ns","find-protocol-impl","find-protocol-method","find-var","first","flatten","float","float-array","float?","floats","flush","fn","fn?","fnext","fnil","for","force","format","frequencies","future","future-call","future-cancel","future-cancelled?","future-done?","future?","gen-class","gen-interface","gensym","get","get-in","get-method","get-proxy-class","get-thread-bindings","get-validator","group-by","halt-when","hash","hash-combine","hash-map","hash-ordered-coll","hash-set","hash-unordered-coll","ident?","identical?","identity","if-let","if-not","if-some","ifn?","import","in-ns","inc","inc'","indexed?","init-proxy","inst-ms","inst-ms*","inst?","instance?","int","int-array","int?","integer?","interleave","intern","interpose","into","into-array","ints","io!","isa?","iterate","iterator-seq","juxt","keep","keep-indexed","key","keys","keyword","keyword?","last","lazy-cat","lazy-seq","let","letfn","line-seq","list","list*","list?","load","load-file","load-reader","load-string","loaded-libs","locking","long","long-array","longs","loop","macroexpand","macroexpand-1","make-array","make-hierarchy","map","map-entry?","map-indexed","map?","mapcat","mapv","max","max-key","memfn","memoize","merge","merge-with","meta","method-sig","methods","min","min-key","mix-collection-hash","mod","munge","name","namespace","namespace-munge","nat-int?","neg-int?","neg?","newline","next","nfirst","nil?","nnext","not","not-any?","not-empty","not-every?","not=","ns","ns-aliases","ns-imports","ns-interns","ns-map","ns-name","ns-publics","ns-refers","ns-resolve","ns-unalias","ns-unmap","nth","nthnext","nthrest","num","number?","numerator","object-array","odd?","or","parents","partial","partition","partition-all","partition-by","pcalls","peek","persistent!","pmap","pop","pop!","pop-thread-bindings","pos-int?","pos?","pr","pr-str","prefer-method","prefers","primitives-classnames","print","print-ctor","print-dup","print-method","print-simple","print-str","printf","println","println-str","prn","prn-str","promise","proxy","proxy-call-with-super","proxy-mappings","proxy-name","proxy-super","push-thread-bindings","pvalues","qualified-ident?","qualified-keyword?","qualified-symbol?","quot","rand","rand-int","rand-nth","random-sample","range","ratio?","rational?","rationalize","re-find","re-groups","re-matcher","re-matches","re-pattern","re-seq","read","read-line","read-string","reader-conditional","reader-conditional?","realized?","record?","reduce","reduce-kv","reduced","reduced?","reductions","ref","ref-history-count","ref-max-history","ref-min-history","ref-set","refer","refer-clojure","reify","release-pending-sends","rem","remove","remove-all-methods","remove-method","remove-ns","remove-watch","repeat","repeatedly","replace","replicate","require","reset!","reset-meta!","reset-vals!","resolve","rest","restart-agent","resultset-seq","reverse","reversible?","rseq","rsubseq","run!","satisfies?","second","select-keys","send","send-off","send-via","seq","seq?","seqable?","seque","sequence","sequential?","set","set-agent-send-executor!","set-agent-send-off-executor!","set-error-handler!","set-error-mode!","set-validator!","set?","short","short-array","shorts","shuffle","shutdown-agents","simple-ident?","simple-keyword?","simple-symbol?","slurp","some","some->","some->>","some-fn","some?","sort","sort-by","sorted-map","sorted-map-by","sorted-set","sorted-set-by","sorted?","special-symbol?","spit","split-at","split-with","str","string?","struct","struct-map","subs","subseq","subvec","supers","swap!","swap-vals!","symbol","symbol?","sync","tagged-literal","tagged-literal?","take","take-last","take-nth","take-while","test","the-ns","thread-bound?","time","to-array","to-array-2d","trampoline","transduce","transient","tree-seq","true?","type","unchecked-add","unchecked-add-int","unchecked-byte","unchecked-char","unchecked-dec","unchecked-dec-int","unchecked-divide-int","unchecked-double","unchecked-float","unchecked-inc","unchecked-inc-int","unchecked-int","unchecked-long","unchecked-multiply","unchecked-multiply-int","unchecked-negate","unchecked-negate-int","unchecked-remainder-int","unchecked-short","unchecked-subtract","unchecked-subtract-int","underive","unquote","unquote-splicing","unreduced","unsigned-bit-shift-right","update","update-in","update-proxy","uri?","use","uuid?","val","vals","var-get","var-set","var?","vary-meta","vec","vector","vector-of","vector?","volatile!","volatile?","vreset!","vswap!","when","when-first","when-let","when-not","when-some","while","with-bindings","with-bindings*","with-in-str","with-loading-context","with-local-vars","with-meta","with-open","with-out-str","with-precision","with-redefs","with-redefs-fn","xml-seq","zero?","zipmap"],tokenizer:{root:[{include:"@whitespace"},[/@numbers/,"number"],[/@characters/,"string"],{include:"@string"},[/[()\[\]{}]/,"@brackets"],[/\/#"(?:\.|(?:")|[^"\n])*"\/g/,"regexp"],[/[#'@^`~]/,"meta"],[/@qualifiedSymbols/,{cases:{"^:.+$":"constant","@specialForms":"keyword","@coreSymbols":"keyword","@constants":"constant","@default":"identifier"}}]],whitespace:[[/[\s,]+/,"white"],[/;.*$/,"comment"],[/\(comment\b/,"comment","@comment"]],comment:[[/\(/,"comment","@push"],[/\)/,"comment","@pop"],[/[^()]/,"comment"]],string:[[/"/,"string","@multiLineString"]],multiLineString:[[/"/,"string","@popall"],[/@escapes/,"string.escape"],[/./,"string"]]}};return p(h);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/coffee/coffee.js b/public/vs/basic-languages/coffee/coffee.js
new file mode 100644
index 0000000..ef54f54
--- /dev/null
+++ b/public/vs/basic-languages/coffee/coffee.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/coffee/coffee", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var l=(n,e)=>{for(var t in e)s(n,t,{get:e[t],enumerable:!0})},p=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of g(e))!a.call(n,r)&&r!==t&&s(n,r,{get:()=>e[r],enumerable:!(o=i(e,r))||o.enumerable});return n};var c=n=>p(s({},"__esModule",{value:!0}),n);var m={};l(m,{conf:()=>d,language:()=>x});var d={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#%\^\&\*\(\)\=\$\-\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{blockComment:["###","###"],lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},x={defaultToken:"",ignoreCase:!0,tokenPostfix:".coffee",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],regEx:/\/(?!\/\/)(?:[^\/\\]|\\.)*\/[igm]*/,keywords:["and","or","is","isnt","not","on","yes","@","no","off","true","false","null","this","new","delete","typeof","in","instanceof","return","throw","break","continue","debugger","if","else","switch","for","while","do","try","catch","finally","class","extends","super","undefined","then","unless","until","loop","of","by","when"],symbols:/[=><!~?&%|+\-*\/\^\.,\:]+/,escapes:/\\(?:[abfnrtv\\"'$]|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/\@[a-zA-Z_]\w*/,"variable.predefined"],[/[a-zA-Z_]\w*/,{cases:{this:"variable.predefined","@keywords":{token:"keyword.$0"},"@default":""}}],[/[ \t\r\n]+/,""],[/###/,"comment","@comment"],[/#.*$/,"comment"],["///",{token:"regexp",next:"@hereregexp"}],[/^(\s*)(@regEx)/,["","regexp"]],[/(\()(\s*)(@regEx)/,["@brackets","","regexp"]],[/(\,)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\=)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\:)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\[)(\s*)(@regEx)/,["@brackets","","regexp"]],[/(\!)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\&)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\|)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\?)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\{)(\s*)(@regEx)/,["@brackets","","regexp"]],[/(\;)(\s*)(@regEx)/,["","","regexp"]],[/}/,{cases:{"$S2==interpolatedstring":{token:"string",next:"@pop"},"@default":"@brackets"}}],[/[{}()\[\]]/,"@brackets"],[/@symbols/,"delimiter"],[/\d+[eE]([\-+]?\d+)?/,"number.float"],[/\d+\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/0[0-7]+(?!\d)/,"number.octal"],[/\d+/,"number"],[/[,.]/,"delimiter"],[/"""/,"string",'@herestring."""'],[/'''/,"string","@herestring.'''"],[/"/,{cases:{"@eos":"string","@default":{token:"string",next:'@string."'}}}],[/'/,{cases:{"@eos":"string","@default":{token:"string",next:"@string.'"}}}]],string:[[/[^"'\#\\]+/,"string"],[/@escapes/,"string.escape"],[/\./,"string.escape.invalid"],[/\./,"string.escape.invalid"],[/#{/,{cases:{'$S2=="':{token:"string",next:"root.interpolatedstring"},"@default":"string"}}],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}],[/#/,"string"]],herestring:[[/("""|''')/,{cases:{"$1==$S2":{token:"string",next:"@pop"},"@default":"string"}}],[/[^#\\'"]+/,"string"],[/['"]+/,"string"],[/@escapes/,"string.escape"],[/\./,"string.escape.invalid"],[/#{/,{token:"string.quote",next:"root.interpolatedstring"}],[/#/,"string"]],comment:[[/[^#]+/,"comment"],[/###/,"comment","@pop"],[/#/,"comment"]],hereregexp:[[/[^\\\/#]+/,"regexp"],[/\\./,"regexp"],[/#.*$/,"comment"],["///[igm]*",{token:"regexp",next:"@pop"}],[/\//,"regexp"]]}};return c(m);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/cpp/cpp.js b/public/vs/basic-languages/cpp/cpp.js
new file mode 100644
index 0000000..d7de6a5
--- /dev/null
+++ b/public/vs/basic-languages/cpp/cpp.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/cpp/cpp", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var c=(n,e)=>{for(var i in e)r(n,i,{get:e[i],enumerable:!0})},l=(n,e,i,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of _(e))!s.call(n,t)&&t!==i&&r(n,t,{get:()=>e[t],enumerable:!(o=a(e,t))||o.enumerable});return n};var d=n=>l(r({},"__esModule",{value:!0}),n);var g={};c(g,{conf:()=>p,language:()=>m});var p={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#pragma\\s+region\\b"),end:new RegExp("^\\s*#pragma\\s+endregion\\b")}}},m={defaultToken:"",tokenPostfix:".cpp",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["abstract","amp","array","auto","bool","break","case","catch","char","class","const","constexpr","const_cast","continue","cpu","decltype","default","delegate","delete","do","double","dynamic_cast","each","else","enum","event","explicit","export","extern","false","final","finally","float","for","friend","gcnew","generic","goto","if","in","initonly","inline","int","interface","interior_ptr","internal","literal","long","mutable","namespace","new","noexcept","nullptr","__nullptr","operator","override","partial","pascal","pin_ptr","private","property","protected","public","ref","register","reinterpret_cast","restrict","return","safe_cast","sealed","short","signed","sizeof","static","static_assert","static_cast","struct","switch","template","this","thread_local","throw","tile_static","true","try","typedef","typeid","typename","union","unsigned","using","virtual","void","volatile","wchar_t","where","while","_asm","_based","_cdecl","_declspec","_fastcall","_if_exists","_if_not_exists","_inline","_multiple_inheritance","_pascal","_single_inheritance","_stdcall","_virtual_inheritance","_w64","__abstract","__alignof","__asm","__assume","__based","__box","__builtin_alignof","__cdecl","__clrcall","__declspec","__delegate","__event","__except","__fastcall","__finally","__forceinline","__gc","__hook","__identifier","__if_exists","__if_not_exists","__inline","__int128","__int16","__int32","__int64","__int8","__interface","__leave","__m128","__m128d","__m128i","__m256","__m256d","__m256i","__m512","__m512d","__m512i","__m64","__multiple_inheritance","__newslot","__nogc","__noop","__nounwind","__novtordisp","__pascal","__pin","__pragma","__property","__ptr32","__ptr64","__raise","__restrict","__resume","__sealed","__single_inheritance","__stdcall","__super","__thiscall","__try","__try_cast","__typeof","__unaligned","__unhook","__uuidof","__value","__virtual_inheritance","__w64","__wchar_t"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>="],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[0abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,integersuffix:/([uU](ll|LL|l|L)|(ll|LL|l|L)?[uU]?)/,floatsuffix:/[fFlL]?/,encoding:/u|u8|U|L/,tokenizer:{root:[[/@encoding?R\"(?:([^ ()\\\t]*))\(/,{token:"string.raw.begin",next:"@raw.$1"}],[/[a-zA-Z_]\w*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],[/^\s*#\s*include/,{token:"keyword.directive.include",next:"@include"}],[/^\s*#\s*\w+/,"keyword.directive"],{include:"@whitespace"},[/\[\s*\[/,{token:"annotation",next:"@annotation"}],[/[{}()<>\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*\\$/,"comment","@linecomment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],linecomment:[[/.*[^\\]$/,"comment","@pop"],[/[^]+/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],raw:[[/(.*)(\))(?:([^ ()\\\t"]*))(\")/,{cases:{"$3==$S2":["string.raw","string.raw.end","string.raw.end",{token:"string.raw.end",next:"@pop"}],"@default":["string.raw","string.raw","string.raw","string.raw"]}}],[/.*/,"string.raw"]],annotation:[{include:"@whitespace"},[/using|alignas/,"keyword"],[/[a-zA-Z0-9_]+/,"annotation"],[/[,:]/,"delimiter"],[/[()]/,"@brackets"],[/\]\s*\]/,{token:"annotation",next:"@pop"}]],include:[[/(\s*)(<)([^<>]*)(>)/,["","keyword.directive.include.begin","string.include.identifier",{token:"keyword.directive.include.end",next:"@pop"}]],[/(\s*)(")([^"]*)(")/,["","keyword.directive.include.begin","string.include.identifier",{token:"keyword.directive.include.end",next:"@pop"}]]]}};return d(g);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/csharp/csharp.js b/public/vs/basic-languages/csharp/csharp.js
new file mode 100644
index 0000000..227f65a
--- /dev/null
+++ b/public/vs/basic-languages/csharp/csharp.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/csharp/csharp", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var o in e)s(t,o,{get:e[o],enumerable:!0})},p=(t,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!c.call(t,n)&&n!==o&&s(t,n,{get:()=>e[n],enumerable:!(i=r(e,n))||i.enumerable});return t};var g=t=>p(s({},"__esModule",{value:!0}),t);var u={};l(u,{conf:()=>d,language:()=>m});var d={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\$\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},m={defaultToken:"",tokenPostfix:".cs",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["extern","alias","using","bool","decimal","sbyte","byte","short","ushort","int","uint","long","ulong","char","float","double","object","dynamic","string","assembly","is","as","ref","out","this","base","new","typeof","void","checked","unchecked","default","delegate","var","const","if","else","switch","case","while","do","for","foreach","in","break","continue","goto","return","throw","try","catch","finally","lock","yield","from","let","where","join","on","equals","into","orderby","ascending","descending","select","group","by","namespace","partial","class","field","event","method","param","public","protected","internal","private","abstract","sealed","static","struct","readonly","volatile","virtual","override","params","get","set","add","remove","operator","true","false","implicit","explicit","interface","enum","null","async","await","fixed","sizeof","stackalloc","unsafe","nameof","when"],namespaceFollows:["namespace","using"],parenFollows:["if","for","while","switch","foreach","using","catch","when"],operators:["=","??","||","&&","|","^","&","==","!=","<=",">=","<<","+","-","*","/","%","!","~","++","--","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>=",">>","=>"],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/\@?[a-zA-Z_]\w*/,{cases:{"@namespaceFollows":{token:"keyword.$0",next:"@namespace"},"@keywords":{token:"keyword.$0",next:"@qualified"},"@default":{token:"identifier",next:"@qualified"}}}],{include:"@whitespace"},[/}/,{cases:{"$S2==interpolatedstring":{token:"string.quote",next:"@pop"},"$S2==litinterpstring":{token:"string.quote",next:"@pop"},"@default":"@brackets"}}],[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/[0-9_]*\.[0-9_]+([eE][\-+]?\d+)?[fFdD]?/,"number.float"],[/0[xX][0-9a-fA-F_]+/,"number.hex"],[/0[bB][01_]+/,"number.hex"],[/[0-9_]+/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",next:"@string"}],[/\$\@"/,{token:"string.quote",next:"@litinterpstring"}],[/\@"/,{token:"string.quote",next:"@litstring"}],[/\$"/,{token:"string.quote",next:"@interpolatedstring"}],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],qualified:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],[/\./,"delimiter"],["","","@pop"]],namespace:[{include:"@whitespace"},[/[A-Z]\w*/,"namespace"],[/[\.=]/,"delimiter"],["","","@pop"]],comment:[[/[^\/*]+/,"comment"],["\\*/","comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",next:"@pop"}]],litstring:[[/[^"]+/,"string"],[/""/,"string.escape"],[/"/,{token:"string.quote",next:"@pop"}]],litinterpstring:[[/[^"{]+/,"string"],[/""/,"string.escape"],[/{{/,"string.escape"],[/}}/,"string.escape"],[/{/,{token:"string.quote",next:"root.litinterpstring"}],[/"/,{token:"string.quote",next:"@pop"}]],interpolatedstring:[[/[^\\"{]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/{{/,"string.escape"],[/}}/,"string.escape"],[/{/,{token:"string.quote",next:"root.interpolatedstring"}],[/"/,{token:"string.quote",next:"@pop"}]],whitespace:[[/^[ \t\v\f]*#((r)|(load))(?=\s)/,"directive.csx"],[/^[ \t\v\f]*#\w.*$/,"namespace.cpp"],[/[ \t\v\f\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}};return g(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/csp/csp.js b/public/vs/basic-languages/csp/csp.js
new file mode 100644
index 0000000..1eea163
--- /dev/null
+++ b/public/vs/basic-languages/csp/csp.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/csp/csp", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var a=(r,t)=>{for(var s in t)o(r,s,{get:t[s],enumerable:!0})},c=(r,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of u(t))!g.call(r,e)&&e!==s&&o(r,e,{get:()=>t[e],enumerable:!(n=i(t,e))||n.enumerable});return r};var q=r=>c(o({},"__esModule",{value:!0}),r);var p={};a(p,{conf:()=>f,language:()=>l});var f={brackets:[],autoClosingPairs:[],surroundingPairs:[]},l={keywords:[],typeKeywords:[],tokenPostfix:".csp",operators:[],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/child-src/,"string.quote"],[/connect-src/,"string.quote"],[/default-src/,"string.quote"],[/font-src/,"string.quote"],[/frame-src/,"string.quote"],[/img-src/,"string.quote"],[/manifest-src/,"string.quote"],[/media-src/,"string.quote"],[/object-src/,"string.quote"],[/script-src/,"string.quote"],[/style-src/,"string.quote"],[/worker-src/,"string.quote"],[/base-uri/,"string.quote"],[/plugin-types/,"string.quote"],[/sandbox/,"string.quote"],[/disown-opener/,"string.quote"],[/form-action/,"string.quote"],[/frame-ancestors/,"string.quote"],[/report-uri/,"string.quote"],[/report-to/,"string.quote"],[/upgrade-insecure-requests/,"string.quote"],[/block-all-mixed-content/,"string.quote"],[/require-sri-for/,"string.quote"],[/reflected-xss/,"string.quote"],[/referrer/,"string.quote"],[/policy-uri/,"string.quote"],[/'self'/,"string.quote"],[/'unsafe-inline'/,"string.quote"],[/'unsafe-eval'/,"string.quote"],[/'strict-dynamic'/,"string.quote"],[/'unsafe-hashed-attributes'/,"string.quote"]]}};return q(p);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/css/css.js b/public/vs/basic-languages/css/css.js
new file mode 100644
index 0000000..b8ca034
--- /dev/null
+++ b/public/vs/basic-languages/css/css.js
@@ -0,0 +1,12 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/css/css", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var m=(t,e)=>{for(var o in e)r(t,o,{get:e[o],enumerable:!0})},c=(t,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of s(e))!l.call(t,n)&&n!==o&&r(t,n,{get:()=>e[n],enumerable:!(i=a(e,n))||i.enumerable});return t};var d=t=>c(r({},"__esModule",{value:!0}),t);var k={};m(k,{conf:()=>u,language:()=>p});var u={wordPattern:/(#?-?\d*\.\d\w*%?)|((::|[@#.!:])?[\w-?]+%?)|::|[@#.!:]/g,comments:{blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/"),end:new RegExp("^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/")}}},p={defaultToken:"",tokenPostfix:".css",ws:`[ 	
+\r\f]*`,identifier:"-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",brackets:[{open:"{",close:"}",token:"delimiter.bracket"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{root:[{include:"@selector"}],selector:[{include:"@comments"},{include:"@import"},{include:"@strings"},["[@](keyframes|-webkit-keyframes|-moz-keyframes|-o-keyframes)",{token:"keyword",next:"@keyframedeclaration"}],["[@](page|content|font-face|-moz-document)",{token:"keyword"}],["[@](charset|namespace)",{token:"keyword",next:"@declarationbody"}],["(url-prefix)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],["(url)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],{include:"@selectorname"},["[\\*]","tag"],["[>\\+,]","delimiter"],["\\[",{token:"delimiter.bracket",next:"@selectorattribute"}],["{",{token:"delimiter.bracket",next:"@selectorbody"}]],selectorbody:[{include:"@comments"},["[*_]?@identifier@ws:(?=(\\s|\\d|[^{;}]*[;}]))","attribute.name","@rulevalue"],["}",{token:"delimiter.bracket",next:"@pop"}]],selectorname:[["(\\.|#(?=[^{])|%|(@identifier)|:)+","tag"]],selectorattribute:[{include:"@term"},["]",{token:"delimiter.bracket",next:"@pop"}]],term:[{include:"@comments"},["(url-prefix)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],["(url)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],{include:"@functioninvocation"},{include:"@numbers"},{include:"@name"},{include:"@strings"},["([<>=\\+\\-\\*\\/\\^\\|\\~,])","delimiter"],[",","delimiter"]],rulevalue:[{include:"@comments"},{include:"@strings"},{include:"@term"},["!important","keyword"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],warndebug:[["[@](warn|debug)",{token:"keyword",next:"@declarationbody"}]],import:[["[@](import)",{token:"keyword",next:"@declarationbody"}]],urldeclaration:[{include:"@strings"},[`[^)\r
+]+`,"string"],["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],parenthizedterm:[{include:"@term"},["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],declarationbody:[{include:"@term"},[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[/[^*/]+/,"comment"],[/./,"comment"]],name:[["@identifier","attribute.value"]],numbers:[["-?(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"attribute.value.number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","attribute.value.hex"]],units:[["(em|ex|ch|rem|fr|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","attribute.value.unit","@pop"]],keyframedeclaration:[["@identifier","attribute.value"],["{",{token:"delimiter.bracket",switchTo:"@keyframebody"}]],keyframebody:[{include:"@term"},["{",{token:"delimiter.bracket",next:"@selectorbody"}],["}",{token:"delimiter.bracket",next:"@pop"}]],functioninvocation:[["@identifier\\(",{token:"attribute.value",next:"@functionarguments"}]],functionarguments:[["\\$@identifier@ws:","attribute.name"],["[,]","delimiter"],{include:"@term"},["\\)",{token:"attribute.value",next:"@pop"}]],strings:[['~?"',{token:"string",next:"@stringenddoublequote"}],["~?'",{token:"string",next:"@stringendquote"}]],stringenddoublequote:[["\\\\.","string"],['"',{token:"string",next:"@pop"}],[/[^\\"]+/,"string"],[".","string"]],stringendquote:[["\\\\.","string"],["'",{token:"string",next:"@pop"}],[/[^\\']+/,"string"],[".","string"]]}};return d(k);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/cypher/cypher.js b/public/vs/basic-languages/cypher/cypher.js
new file mode 100644
index 0000000..2adff36
--- /dev/null
+++ b/public/vs/basic-languages/cypher/cypher.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/cypher/cypher", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(i,e)=>{for(var n in e)s(i,n,{get:e[n],enumerable:!0})},g=(i,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of a(e))!l.call(i,t)&&t!==n&&s(i,t,{get:()=>e[t],enumerable:!(o=r(e,t))||o.enumerable});return i};var p=i=>g(s({},"__esModule",{value:!0}),i);var u={};c(u,{conf:()=>d,language:()=>m});var d={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}]},m={defaultToken:"",tokenPostfix:".cypher",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["ALL","AND","AS","ASC","ASCENDING","BY","CALL","CASE","CONTAINS","CREATE","DELETE","DESC","DESCENDING","DETACH","DISTINCT","ELSE","END","ENDS","EXISTS","IN","IS","LIMIT","MANDATORY","MATCH","MERGE","NOT","ON","ON","OPTIONAL","OR","ORDER","REMOVE","RETURN","SET","SKIP","STARTS","THEN","UNION","UNWIND","WHEN","WHERE","WITH","XOR","YIELD"],builtinLiterals:["true","TRUE","false","FALSE","null","NULL"],builtinFunctions:["abs","acos","asin","atan","atan2","avg","ceil","coalesce","collect","cos","cot","count","degrees","e","endNode","exists","exp","floor","head","id","keys","labels","last","left","length","log","log10","lTrim","max","min","nodes","percentileCont","percentileDisc","pi","properties","radians","rand","range","relationships","replace","reverse","right","round","rTrim","sign","sin","size","split","sqrt","startNode","stDev","stDevP","substring","sum","tail","tan","timestamp","toBoolean","toFloat","toInteger","toLower","toString","toUpper","trim","type"],operators:["+","-","*","/","%","^","=","<>","<",">","<=",">=","->","<-","-->","<--"],escapes:/\\(?:[tbnrf\\"'`]|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,digits:/\d+/,octaldigits:/[0-7]+/,hexdigits:/[0-9a-fA-F]+/,tokenizer:{root:[[/[{}[\]()]/,"@brackets"],{include:"common"}],common:[{include:"@whitespace"},{include:"@numbers"},{include:"@strings"},[/:[a-zA-Z_][\w]*/,"type.identifier"],[/[a-zA-Z_][\w]*(?=\()/,{cases:{"@builtinFunctions":"predefined.function"}}],[/[a-zA-Z_$][\w$]*/,{cases:{"@keywords":"keyword","@builtinLiterals":"predefined.literal","@default":"identifier"}}],[/`/,"identifier.escape","@identifierBacktick"],[/[;,.:|]/,"delimiter"],[/[<>=%+\-*/^]+/,{cases:{"@operators":"delimiter","@default":""}}]],numbers:[[/-?(@digits)[eE](-?(@digits))?/,"number.float"],[/-?(@digits)?\.(@digits)([eE]-?(@digits))?/,"number.float"],[/-?0x(@hexdigits)/,"number.hex"],[/-?0(@octaldigits)/,"number.octal"],[/-?(@digits)/,"number"]],strings:[[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@stringDouble"],[/'/,"string","@stringSingle"]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/\/\/.*/,"comment"],[/[^/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[/*]/,"comment"]],stringDouble:[[/[^\\"]+/,"string"],[/@escapes/,"string"],[/\\./,"string.invalid"],[/"/,"string","@pop"]],stringSingle:[[/[^\\']+/,"string"],[/@escapes/,"string"],[/\\./,"string.invalid"],[/'/,"string","@pop"]],identifierBacktick:[[/[^\\`]+/,"identifier.escape"],[/@escapes/,"identifier.escape"],[/\\./,"identifier.escape.invalid"],[/`/,"identifier.escape","@pop"]]}};return p(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/dart/dart.js b/public/vs/basic-languages/dart/dart.js
new file mode 100644
index 0000000..ff50462
--- /dev/null
+++ b/public/vs/basic-languages/dart/dart.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/dart/dart", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var p=(n,e)=>{for(var t in e)r(n,t,{get:e[t],enumerable:!0})},g=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of c(e))!a.call(n,o)&&o!==t&&r(n,o,{get:()=>e[o],enumerable:!(s=i(e,o))||s.enumerable});return n};var l=n=>g(r({},"__esModule",{value:!0}),n);var x={};p(x,{conf:()=>d,language:()=>m});var d={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string"]},{open:"`",close:"`",notIn:["string","comment"]},{open:"/**",close:" */",notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:"(",close:")"},{open:'"',close:'"'},{open:"`",close:"`"}],folding:{markers:{start:/^\s*\s*#?region\b/,end:/^\s*\s*#?endregion\b/}}},m={defaultToken:"invalid",tokenPostfix:".dart",keywords:["abstract","dynamic","implements","show","as","else","import","static","assert","enum","in","super","async","export","interface","switch","await","extends","is","sync","break","external","library","this","case","factory","mixin","throw","catch","false","new","true","class","final","null","try","const","finally","on","typedef","continue","for","operator","var","covariant","Function","part","void","default","get","rethrow","while","deferred","hide","return","with","do","if","set","yield"],typeKeywords:["int","double","String","bool"],operators:["+","-","*","/","~/","%","++","--","==","!=",">","<",">=","<=","=","-=","/=","%=",">>=","^=","+=","*=","~/=","<<=","&=","!=","||","&&","&","|","^","~","<<",">>","!",">>>","??","?",":","|="],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,digits:/\d+(_+\d+)*/,octaldigits:/[0-7]+(_+[0-7]+)*/,binarydigits:/[0-1]+(_+[0-1]+)*/,hexdigits:/[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,regexpctl:/[(){}\[\]\$\^|\-*+?\.]/,regexpesc:/\\(?:[bBdDfnrstvwWn0\\\/]|@regexpctl|c[A-Z]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})/,tokenizer:{root:[[/[{}]/,"delimiter.bracket"],{include:"common"}],common:[[/[a-z_$][\w$]*/,{cases:{"@typeKeywords":"type.identifier","@keywords":"keyword","@default":"identifier"}}],[/[A-Z_$][\w\$]*/,"type.identifier"],{include:"@whitespace"},[/\/(?=([^\\\/]|\\.)+\/([gimsuy]*)(\s*)(\.|;|,|\)|\]|\}|$))/,{token:"regexp",bracket:"@open",next:"@regexp"}],[/@[a-zA-Z]+/,"annotation"],[/[()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/!(?=([^=]|$))/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/(@digits)[eE]([\-+]?(@digits))?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?/,"number.float"],[/0[xX](@hexdigits)n?/,"number.hex"],[/0[oO]?(@octaldigits)n?/,"number.octal"],[/0[bB](@binarydigits)n?/,"number.binary"],[/(@digits)n?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@jsdoc"],[/\/\*/,"comment","@comment"],[/\/\/\/.*$/,"comment.doc"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],jsdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],regexp:[[/(\{)(\d+(?:,\d*)?)(\})/,["regexp.escape.control","regexp.escape.control","regexp.escape.control"]],[/(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/,["regexp.escape.control",{token:"regexp.escape.control",next:"@regexrange"}]],[/(\()(\?:|\?=|\?!)/,["regexp.escape.control","regexp.escape.control"]],[/[()]/,"regexp.escape.control"],[/@regexpctl/,"regexp.escape.control"],[/[^\\\/]/,"regexp"],[/@regexpesc/,"regexp.escape"],[/\\\./,"regexp.invalid"],[/(\/)([gimsuy]*)/,[{token:"regexp",bracket:"@close",next:"@pop"},"keyword.other"]]],regexrange:[[/-/,"regexp.escape.control"],[/\^/,"regexp.invalid"],[/@regexpesc/,"regexp.escape"],[/[^\]]/,"regexp"],[/\]/,{token:"regexp.escape.control",next:"@pop",bracket:"@close"}]],string_double:[[/[^\\"\$]+/,"string"],[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"],[/\$\w+/,"identifier"]],string_single:[[/[^\\'\$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"],[/\$\w+/,"identifier"]]}};return l(x);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/dockerfile/dockerfile.js b/public/vs/basic-languages/dockerfile/dockerfile.js
new file mode 100644
index 0000000..a1c2c17
--- /dev/null
+++ b/public/vs/basic-languages/dockerfile/dockerfile.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/dockerfile/dockerfile", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var a=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var p=(o,e)=>{for(var s in e)a(o,s,{get:e[s],enumerable:!0})},g=(o,e,s,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of r(e))!i.call(o,n)&&n!==s&&a(o,n,{get:()=>e[n],enumerable:!(t=l(e,n))||t.enumerable});return o};var c=o=>g(a({},"__esModule",{value:!0}),o);var k={};p(k,{conf:()=>u,language:()=>d});var u={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},d={defaultToken:"",tokenPostfix:".dockerfile",variable:/\${?[\w]+}?/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},[/(ONBUILD)(\s+)/,["keyword",""]],[/(ENV)(\s+)([\w]+)/,["keyword","",{token:"variable",next:"@arguments"}]],[/(FROM|MAINTAINER|RUN|EXPOSE|ENV|ADD|ARG|VOLUME|LABEL|USER|WORKDIR|COPY|CMD|STOPSIGNAL|SHELL|HEALTHCHECK|ENTRYPOINT)/,{token:"keyword",next:"@arguments"}]],arguments:[{include:"@whitespace"},{include:"@strings"},[/(@variable)/,{cases:{"@eos":{token:"variable",next:"@popall"},"@default":"variable"}}],[/\\/,{cases:{"@eos":"","@default":""}}],[/./,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],whitespace:[[/\s+/,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],comment:[[/(^#.*$)/,"comment","@popall"]],strings:[[/\\'$/,"","@popall"],[/\\'/,""],[/'$/,"string","@popall"],[/'/,"string","@stringBody"],[/"$/,"string","@popall"],[/"/,"string","@dblStringBody"]],stringBody:[[/[^\\\$']/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/'$/,"string","@popall"],[/'/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]],dblStringBody:[[/[^\\\$"]/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/"$/,"string","@popall"],[/"/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]]}};return c(k);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/ecl/ecl.js b/public/vs/basic-languages/ecl/ecl.js
new file mode 100644
index 0000000..146b508
--- /dev/null
+++ b/public/vs/basic-languages/ecl/ecl.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/ecl/ecl", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var t in e)r(o,t,{get:e[t],enumerable:!0})},d=(o,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of s(e))!l.call(o,n)&&n!==t&&r(o,n,{get:()=>e[n],enumerable:!(a=i(e,n))||a.enumerable});return o};var p=o=>d(r({},"__esModule",{value:!0}),o);var g={};c(g,{conf:()=>m,language:()=>u});var m={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}]},u={defaultToken:"",tokenPostfix:".ecl",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],pounds:["append","break","declare","demangle","end","for","getdatatype","if","inmodule","loop","mangle","onwarning","option","set","stored","uniquename"].join("|"),keywords:["__compressed__","after","all","and","any","as","atmost","before","beginc","best","between","case","cluster","compressed","compression","const","counter","csv","default","descend","embed","encoding","encrypt","end","endc","endembed","endmacro","enum","escape","except","exclusive","expire","export","extend","fail","few","fileposition","first","flat","forward","from","full","function","functionmacro","group","grouped","heading","hole","ifblock","import","in","inner","interface","internal","joined","keep","keyed","last","left","limit","linkcounted","literal","little_endian","load","local","locale","lookup","lzw","macro","many","maxcount","maxlength","min skew","module","mofn","multiple","named","namespace","nocase","noroot","noscan","nosort","not","noxpath","of","onfail","only","opt","or","outer","overwrite","packed","partition","penalty","physicallength","pipe","prefetch","quote","record","repeat","retry","return","right","right1","right2","rows","rowset","scan","scope","self","separator","service","shared","skew","skip","smart","soapaction","sql","stable","store","terminator","thor","threshold","timelimit","timeout","token","transform","trim","type","unicodeorder","unordered","unsorted","unstable","update","use","validate","virtual","whole","width","wild","within","wnotrim","xml","xpath"],functions:["abs","acos","aggregate","allnodes","apply","ascii","asin","assert","asstring","atan","atan2","ave","build","buildindex","case","catch","choose","choosen","choosesets","clustersize","combine","correlation","cos","cosh","count","covariance","cron","dataset","dedup","define","denormalize","dictionary","distribute","distributed","distribution","ebcdic","enth","error","evaluate","event","eventextra","eventname","exists","exp","fail","failcode","failmessage","fetch","fromunicode","fromxml","getenv","getisvalid","global","graph","group","hash","hash32","hash64","hashcrc","hashmd5","having","httpcall","httpheader","if","iff","index","intformat","isvalid","iterate","join","keydiff","keypatch","keyunicode","length","library","limit","ln","loadxml","local","log","loop","map","matched","matchlength","matchposition","matchtext","matchunicode","max","merge","mergejoin","min","nofold","nolocal","nonempty","normalize","nothor","notify","output","parallel","parse","pipe","power","preload","process","project","pull","random","range","rank","ranked","realformat","recordof","regexfind","regexreplace","regroup","rejected","rollup","round","roundup","row","rowdiff","sample","sequential","set","sin","sinh","sizeof","soapcall","sort","sorted","sqrt","stepped","stored","sum","table","tan","tanh","thisnode","topn","tounicode","toxml","transfer","transform","trim","truncate","typeof","ungroup","unicodeorder","variance","wait","which","workunit","xmldecode","xmlencode","xmltext","xmlunicode"],typesint:["integer","unsigned"].join("|"),typesnum:["data","qstring","string","unicode","utf8","varstring","varunicode"],typesone:["ascii","big_endian","boolean","data","decimal","ebcdic","grouped","integer","linkcounted","pattern","qstring","real","record","rule","set of","streamed","string","token","udecimal","unicode","unsigned","utf8","varstring","varunicode"].join("|"),operators:["+","-","/",":=","<","<>","=",">","\\","and","in","not","or"],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/@typesint[4|8]/,"type"],[/#(@pounds)/,"type"],[/@typesone/,"type"],[/[a-zA-Z_$][\w-$]*/,{cases:{"@functions":"keyword.function","@keywords":"keyword","@operators":"operator"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/[0-9_]*\.[0-9_]+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F_]+/,"number.hex"],[/0[bB][01]+/,"number.hex"],[/[0-9_]+/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\v\f\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]]}};return p(g);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/elixir/elixir.js b/public/vs/basic-languages/elixir/elixir.js
new file mode 100644
index 0000000..4f8cade
--- /dev/null
+++ b/public/vs/basic-languages/elixir/elixir.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/elixir/elixir", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var d=(t,e)=>{for(var i in e)o(t,i,{get:e[i],enumerable:!0})},c=(t,e,i,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of s(e))!a.call(t,n)&&n!==i&&o(t,n,{get:()=>e[n],enumerable:!(r=l(e,n))||r.enumerable});return t};var m=t=>c(o({},"__esModule",{value:!0}),t);var p={};d(p,{conf:()=>u,language:()=>g});var u={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'"},{open:'"',close:'"'}],autoClosingPairs:[{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["comment"]},{open:'"""',close:'"""'},{open:"`",close:"`",notIn:["string","comment"]},{open:"(",close:")"},{open:"{",close:"}"},{open:"[",close:"]"},{open:"<<",close:">>"}],indentationRules:{increaseIndentPattern:/^\s*(after|else|catch|rescue|fn|[^#]*(do|<\-|\->|\{|\[|\=))\s*$/,decreaseIndentPattern:/^\s*((\}|\])\s*$|(after|else|catch|rescue|end)\b)/}},g={defaultToken:"source",tokenPostfix:".elixir",brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"<<",close:">>",token:"delimiter.angle.special"}],declarationKeywords:["def","defp","defn","defnp","defguard","defguardp","defmacro","defmacrop","defdelegate","defcallback","defmacrocallback","defmodule","defprotocol","defexception","defimpl","defstruct"],operatorKeywords:["and","in","not","or","when"],namespaceKeywords:["alias","import","require","use"],otherKeywords:["after","case","catch","cond","do","else","end","fn","for","if","quote","raise","receive","rescue","super","throw","try","unless","unquote_splicing","unquote","with"],constants:["true","false","nil"],nameBuiltin:["__MODULE__","__DIR__","__ENV__","__CALLER__","__STACKTRACE__"],operator:/-[->]?|!={0,2}|\*{1,2}|\/|\\\\|&{1,3}|\.\.?|\^(?:\^\^)?|\+\+?|<(?:-|<<|=|>|\|>|~>?)?|=~|={1,3}|>(?:=|>>)?|\|~>|\|>|\|{1,3}|~>>?|~~~|::/,variableName:/[a-z_][a-zA-Z0-9_]*[?!]?/,atomName:/[a-zA-Z_][a-zA-Z0-9_@]*[?!]?|@specialAtomName|@operator/,specialAtomName:/\.\.\.|<<>>|%\{\}|%|\{\}/,aliasPart:/[A-Z][a-zA-Z0-9_]*/,moduleName:/@aliasPart(?:\.@aliasPart)*/,sigilSymmetricDelimiter:/"""|'''|"|'|\/|\|/,sigilStartDelimiter:/@sigilSymmetricDelimiter|<|\{|\[|\(/,sigilEndDelimiter:/@sigilSymmetricDelimiter|>|\}|\]|\)/,sigilModifiers:/[a-zA-Z0-9]*/,decimal:/\d(?:_?\d)*/,hex:/[0-9a-fA-F](_?[0-9a-fA-F])*/,octal:/[0-7](_?[0-7])*/,binary:/[01](_?[01])*/,escape:/\\u[0-9a-fA-F]{4}|\\x[0-9a-fA-F]{2}|\\./,tokenizer:{root:[{include:"@whitespace"},{include:"@comments"},{include:"@keywordsShorthand"},{include:"@numbers"},{include:"@identifiers"},{include:"@strings"},{include:"@atoms"},{include:"@sigils"},{include:"@attributes"},{include:"@symbols"}],whitespace:[[/\s+/,"white"]],comments:[[/(#)(.*)/,["comment.punctuation","comment"]]],keywordsShorthand:[[/(@atomName)(:)(\s+)/,["constant","constant.punctuation","white"]],[/"(?=([^"]|#\{.*?\}|\\")*":)/,{token:"constant.delimiter",next:"@doubleQuotedStringKeyword"}],[/'(?=([^']|#\{.*?\}|\\')*':)/,{token:"constant.delimiter",next:"@singleQuotedStringKeyword"}]],doubleQuotedStringKeyword:[[/":/,{token:"constant.delimiter",next:"@pop"}],{include:"@stringConstantContentInterpol"}],singleQuotedStringKeyword:[[/':/,{token:"constant.delimiter",next:"@pop"}],{include:"@stringConstantContentInterpol"}],numbers:[[/0b@binary/,"number.binary"],[/0o@octal/,"number.octal"],[/0x@hex/,"number.hex"],[/@decimal\.@decimal([eE]-?@decimal)?/,"number.float"],[/@decimal/,"number"]],identifiers:[[/\b(defp?|defnp?|defmacrop?|defguardp?|defdelegate)(\s+)(@variableName)(?!\s+@operator)/,["keyword.declaration","white",{cases:{unquote:"keyword","@default":"function"}}]],[/(@variableName)(?=\s*\.?\s*\()/,{cases:{"@declarationKeywords":"keyword.declaration","@namespaceKeywords":"keyword","@otherKeywords":"keyword","@default":"function.call"}}],[/(@moduleName)(\s*)(\.)(\s*)(@variableName)/,["type.identifier","white","operator","white","function.call"]],[/(:)(@atomName)(\s*)(\.)(\s*)(@variableName)/,["constant.punctuation","constant","white","operator","white","function.call"]],[/(\|>)(\s*)(@variableName)/,["operator","white",{cases:{"@otherKeywords":"keyword","@default":"function.call"}}]],[/(&)(\s*)(@variableName)/,["operator","white","function.call"]],[/@variableName/,{cases:{"@declarationKeywords":"keyword.declaration","@operatorKeywords":"keyword.operator","@namespaceKeywords":"keyword","@otherKeywords":"keyword","@constants":"constant.language","@nameBuiltin":"variable.language","_.*":"comment.unused","@default":"identifier"}}],[/@moduleName/,"type.identifier"]],strings:[[/"""/,{token:"string.delimiter",next:"@doubleQuotedHeredoc"}],[/'''/,{token:"string.delimiter",next:"@singleQuotedHeredoc"}],[/"/,{token:"string.delimiter",next:"@doubleQuotedString"}],[/'/,{token:"string.delimiter",next:"@singleQuotedString"}]],doubleQuotedHeredoc:[[/"""/,{token:"string.delimiter",next:"@pop"}],{include:"@stringContentInterpol"}],singleQuotedHeredoc:[[/'''/,{token:"string.delimiter",next:"@pop"}],{include:"@stringContentInterpol"}],doubleQuotedString:[[/"/,{token:"string.delimiter",next:"@pop"}],{include:"@stringContentInterpol"}],singleQuotedString:[[/'/,{token:"string.delimiter",next:"@pop"}],{include:"@stringContentInterpol"}],atoms:[[/(:)(@atomName)/,["constant.punctuation","constant"]],[/:"/,{token:"constant.delimiter",next:"@doubleQuotedStringAtom"}],[/:'/,{token:"constant.delimiter",next:"@singleQuotedStringAtom"}]],doubleQuotedStringAtom:[[/"/,{token:"constant.delimiter",next:"@pop"}],{include:"@stringConstantContentInterpol"}],singleQuotedStringAtom:[[/'/,{token:"constant.delimiter",next:"@pop"}],{include:"@stringConstantContentInterpol"}],sigils:[[/~[a-z]@sigilStartDelimiter/,{token:"@rematch",next:"@sigil.interpol"}],[/~([A-Z]+)@sigilStartDelimiter/,{token:"@rematch",next:"@sigil.noInterpol"}]],sigil:[[/~([a-z]|[A-Z]+)\{/,{token:"@rematch",switchTo:"@sigilStart.$S2.$1.{.}"}],[/~([a-z]|[A-Z]+)\[/,{token:"@rematch",switchTo:"@sigilStart.$S2.$1.[.]"}],[/~([a-z]|[A-Z]+)\(/,{token:"@rematch",switchTo:"@sigilStart.$S2.$1.(.)"}],[/~([a-z]|[A-Z]+)\</,{token:"@rematch",switchTo:"@sigilStart.$S2.$1.<.>"}],[/~([a-z]|[A-Z]+)(@sigilSymmetricDelimiter)/,{token:"@rematch",switchTo:"@sigilStart.$S2.$1.$2.$2"}]],"sigilStart.interpol.s":[[/~s@sigilStartDelimiter/,{token:"string.delimiter",switchTo:"@sigilContinue.$S2.$S3.$S4.$S5"}]],"sigilContinue.interpol.s":[[/(@sigilEndDelimiter)@sigilModifiers/,{cases:{"$1==$S5":{token:"string.delimiter",next:"@pop"},"@default":"string"}}],{include:"@stringContentInterpol"}],"sigilStart.noInterpol.S":[[/~S@sigilStartDelimiter/,{token:"string.delimiter",switchTo:"@sigilContinue.$S2.$S3.$S4.$S5"}]],"sigilContinue.noInterpol.S":[[/(^|[^\\])\\@sigilEndDelimiter/,"string"],[/(@sigilEndDelimiter)@sigilModifiers/,{cases:{"$1==$S5":{token:"string.delimiter",next:"@pop"},"@default":"string"}}],{include:"@stringContent"}],"sigilStart.interpol.r":[[/~r@sigilStartDelimiter/,{token:"regexp.delimiter",switchTo:"@sigilContinue.$S2.$S3.$S4.$S5"}]],"sigilContinue.interpol.r":[[/(@sigilEndDelimiter)@sigilModifiers/,{cases:{"$1==$S5":{token:"regexp.delimiter",next:"@pop"},"@default":"regexp"}}],{include:"@regexpContentInterpol"}],"sigilStart.noInterpol.R":[[/~R@sigilStartDelimiter/,{token:"regexp.delimiter",switchTo:"@sigilContinue.$S2.$S3.$S4.$S5"}]],"sigilContinue.noInterpol.R":[[/(^|[^\\])\\@sigilEndDelimiter/,"regexp"],[/(@sigilEndDelimiter)@sigilModifiers/,{cases:{"$1==$S5":{token:"regexp.delimiter",next:"@pop"},"@default":"regexp"}}],{include:"@regexpContent"}],"sigilStart.interpol":[[/~([a-z]|[A-Z]+)@sigilStartDelimiter/,{token:"sigil.delimiter",switchTo:"@sigilContinue.$S2.$S3.$S4.$S5"}]],"sigilContinue.interpol":[[/(@sigilEndDelimiter)@sigilModifiers/,{cases:{"$1==$S5":{token:"sigil.delimiter",next:"@pop"},"@default":"sigil"}}],{include:"@sigilContentInterpol"}],"sigilStart.noInterpol":[[/~([a-z]|[A-Z]+)@sigilStartDelimiter/,{token:"sigil.delimiter",switchTo:"@sigilContinue.$S2.$S3.$S4.$S5"}]],"sigilContinue.noInterpol":[[/(^|[^\\])\\@sigilEndDelimiter/,"sigil"],[/(@sigilEndDelimiter)@sigilModifiers/,{cases:{"$1==$S5":{token:"sigil.delimiter",next:"@pop"},"@default":"sigil"}}],{include:"@sigilContent"}],attributes:[[/\@(module|type)?doc (~[sS])?"""/,{token:"comment.block.documentation",next:"@doubleQuotedHeredocDocstring"}],[/\@(module|type)?doc (~[sS])?'''/,{token:"comment.block.documentation",next:"@singleQuotedHeredocDocstring"}],[/\@(module|type)?doc (~[sS])?"/,{token:"comment.block.documentation",next:"@doubleQuotedStringDocstring"}],[/\@(module|type)?doc (~[sS])?'/,{token:"comment.block.documentation",next:"@singleQuotedStringDocstring"}],[/\@(module|type)?doc false/,"comment.block.documentation"],[/\@(@variableName)/,"variable"]],doubleQuotedHeredocDocstring:[[/"""/,{token:"comment.block.documentation",next:"@pop"}],{include:"@docstringContent"}],singleQuotedHeredocDocstring:[[/'''/,{token:"comment.block.documentation",next:"@pop"}],{include:"@docstringContent"}],doubleQuotedStringDocstring:[[/"/,{token:"comment.block.documentation",next:"@pop"}],{include:"@docstringContent"}],singleQuotedStringDocstring:[[/'/,{token:"comment.block.documentation",next:"@pop"}],{include:"@docstringContent"}],symbols:[[/\?(\\.|[^\\\s])/,"number.constant"],[/&\d+/,"operator"],[/<<<|>>>/,"operator"],[/[()\[\]\{\}]|<<|>>/,"@brackets"],[/\.\.\./,"identifier"],[/=>/,"punctuation"],[/@operator/,"operator"],[/[:;,.%]/,"punctuation"]],stringContentInterpol:[{include:"@interpolation"},{include:"@escapeChar"},{include:"@stringContent"}],stringContent:[[/./,"string"]],stringConstantContentInterpol:[{include:"@interpolation"},{include:"@escapeChar"},{include:"@stringConstantContent"}],stringConstantContent:[[/./,"constant"]],regexpContentInterpol:[{include:"@interpolation"},{include:"@escapeChar"},{include:"@regexpContent"}],regexpContent:[[/(\s)(#)(\s.*)$/,["white","comment.punctuation","comment"]],[/./,"regexp"]],sigilContentInterpol:[{include:"@interpolation"},{include:"@escapeChar"},{include:"@sigilContent"}],sigilContent:[[/./,"sigil"]],docstringContent:[[/./,"comment.block.documentation"]],escapeChar:[[/@escape/,"constant.character.escape"]],interpolation:[[/#{/,{token:"delimiter.bracket.embed",next:"@interpolationContinue"}]],interpolationContinue:[[/}/,{token:"delimiter.bracket.embed",next:"@pop"}],{include:"@root"}]}};return m(p);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/flow9/flow9.js b/public/vs/basic-languages/flow9/flow9.js
new file mode 100644
index 0000000..d24f377
--- /dev/null
+++ b/public/vs/basic-languages/flow9/flow9.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/flow9/flow9", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var t in e)s(o,t,{get:e[t],enumerable:!0})},m=(o,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!l.call(o,n)&&n!==t&&s(o,n,{get:()=>e[n],enumerable:!(i=r(e,n))||i.enumerable});return o};var p=o=>m(s({},"__esModule",{value:!0}),o);var u={};c(u,{conf:()=>g,language:()=>f});var g={comments:{blockComment:["/*","*/"],lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string"]},{open:"[",close:"]",notIn:["string"]},{open:"(",close:")",notIn:["string"]},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}]},f={defaultToken:"",tokenPostfix:".flow",keywords:["import","require","export","forbid","native","if","else","cast","unsafe","switch","default"],types:["io","mutable","bool","int","double","string","flow","void","ref","true","false","with"],operators:["=",">","<","<=",">=","==","!","!=",":=","::=","&&","||","+","-","*","/","@","&","%",":","->","\\","$","??","^"],symbols:/[@$=><!~?:&|+\-*\\\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/[a-zA-Z_]\w*/,{cases:{"@keywords":"keyword","@types":"type","@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"delimiter"],[/[<>](?!@symbols)/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}};return p(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/freemarker2/freemarker2.js b/public/vs/basic-languages/freemarker2/freemarker2.js
new file mode 100644
index 0000000..c9b2b4d
--- /dev/null
+++ b/public/vs/basic-languages/freemarker2/freemarker2.js
@@ -0,0 +1,12 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/freemarker2/freemarker2", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var B=Object.create;var d=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var T=Object.getPrototypeOf,v=Object.prototype.hasOwnProperty;var w=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(n,i)=>(typeof require<"u"?require:n)[i]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var h=(t,n)=>()=>(n||t((n={exports:{}}).exports,n),n.exports),S=(t,n)=>{for(var i in n)d(t,i,{get:n[i],enumerable:!0})},s=(t,n,i,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of D(n))!v.call(t,o)&&o!==i&&d(t,o,{get:()=>n[o],enumerable:!(e=C(n,o))||e.enumerable});return t},m=(t,n,i)=>(s(t,n,"default"),i&&s(i,n,"default")),x=(t,n,i)=>(i=t!=null?B(T(t)):{},s(n||!t||!t.__esModule?d(i,"default",{value:t,enumerable:!0}):i,t)),I=t=>s(d({},"__esModule",{value:!0}),t);var F=h((q,f)=>{var y=x(w("vs/editor/editor.api"));f.exports=y});var M={};S(M,{TagAngleInterpolationBracket:()=>L,TagAngleInterpolationDollar:()=>R,TagAutoInterpolationBracket:()=>j,TagAutoInterpolationDollar:()=>Z,TagBracketInterpolationBracket:()=>O,TagBracketInterpolationDollar:()=>z});var _={};m(_,x(F()));var l=["assign","flush","ftl","return","global","import","include","break","continue","local","nested","nt","setting","stop","t","lt","rt","fallback"],k=["attempt","autoesc","autoEsc","compress","comment","escape","noescape","function","if","list","items","sep","macro","noparse","noParse","noautoesc","noAutoEsc","outputformat","switch","visit","recurse"],r={close:">",id:"angle",open:"<"},u={close:"\\]",id:"bracket",open:"\\["},P={close:"[>\\]]",id:"auto",open:"[<\\[]"},g={close:"\\}",id:"dollar",open1:"\\$",open2:"\\{"},A={close:"\\]",id:"bracket",open1:"\\[",open2:"="};function p(t){return{brackets:[["<",">"],["[","]"],["(",")"],["{","}"]],comments:{blockComment:[`${t.open}--`,`--${t.close}`]},autoCloseBefore:`
+\r	 }]),.:;=`,autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string"]}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"}],folding:{markers:{start:new RegExp(`${t.open}#(?:${k.join("|")})([^/${t.close}]*(?!/)${t.close})[^${t.open}]*$`),end:new RegExp(`${t.open}/#(?:${k.join("|")})[\\r\\n\\t ]*>`)}},onEnterRules:[{beforeText:new RegExp(`${t.open}#(?!(?:${l.join("|")}))([a-zA-Z_]+)([^/${t.close}]*(?!/)${t.close})[^${t.open}]*$`),afterText:new RegExp(`^${t.open}/#([a-zA-Z_]+)[\\r\\n\\t ]*${t.close}$`),action:{indentAction:_.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp(`${t.open}#(?!(?:${l.join("|")}))([a-zA-Z_]+)([^/${t.close}]*(?!/)${t.close})[^${t.open}]*$`),action:{indentAction:_.languages.IndentAction.Indent}}]}}function b(){return{brackets:[["<",">"],["[","]"],["(",")"],["{","}"]],autoCloseBefore:`
+\r	 }]),.:;=`,autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string"]}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"}],folding:{markers:{start:new RegExp(`[<\\[]#(?:${k.join("|")})([^/>\\]]*(?!/)[>\\]])[^<\\[]*$`),end:new RegExp(`[<\\[]/#(?:${k.join("|")})[\\r\\n\\t ]*>`)}},onEnterRules:[{beforeText:new RegExp(`[<\\[]#(?!(?:${l.join("|")}))([a-zA-Z_]+)([^/>\\]]*(?!/)[>\\]])[^[<\\[]]*$`),afterText:new RegExp("^[<\\[]/#([a-zA-Z_]+)[\\r\\n\\t ]*[>\\]]$"),action:{indentAction:_.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp(`[<\\[]#(?!(?:${l.join("|")}))([a-zA-Z_]+)([^/>\\]]*(?!/)[>\\]])[^[<\\[]]*$`),action:{indentAction:_.languages.IndentAction.Indent}}]}}function a(t,n){let i=`_${t.id}_${n.id}`,e=c=>c.replace(/__id__/g,i),o=c=>{let E=c.source.replace(/__id__/g,i);return new RegExp(E,c.flags)};return{unicode:!0,includeLF:!1,start:e("default__id__"),ignoreCase:!1,defaultToken:"invalid",tokenPostfix:".freemarker2",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],[e("open__id__")]:new RegExp(t.open),[e("close__id__")]:new RegExp(t.close),[e("iOpen1__id__")]:new RegExp(n.open1),[e("iOpen2__id__")]:new RegExp(n.open2),[e("iClose__id__")]:new RegExp(n.close),[e("startTag__id__")]:o(/(@open__id__)(#)/),[e("endTag__id__")]:o(/(@open__id__)(\/#)/),[e("startOrEndTag__id__")]:o(/(@open__id__)(\/?#)/),[e("closeTag1__id__")]:o(/((?:@blank)*)(@close__id__)/),[e("closeTag2__id__")]:o(/((?:@blank)*\/?)(@close__id__)/),blank:/[ \t\n\r]/,keywords:["false","true","in","as","using"],directiveStartCloseTag1:/attempt|recover|sep|auto[eE]sc|no(?:autoe|AutoE)sc|compress|default|no[eE]scape|comment|no[pP]arse/,directiveStartCloseTag2:/else|break|continue|return|stop|flush|t|lt|rt|nt|nested|recurse|fallback|ftl/,directiveStartBlank:/if|else[iI]f|list|for[eE]ach|switch|case|assign|global|local|include|import|function|macro|transform|visit|stop|return|call|setting|output[fF]ormat|nested|recurse|escape|ftl|items/,directiveEndCloseTag1:/if|list|items|sep|recover|attempt|for[eE]ach|local|global|assign|function|macro|output[fF]ormat|auto[eE]sc|no(?:autoe|AutoE)sc|compress|transform|switch|escape|no[eE]scape/,escapedChar:/\\(?:[ntrfbgla\\'"\{=]|(?:x[0-9A-Fa-f]{1,4}))/,asciiDigit:/[0-9]/,integer:/[0-9]+/,nonEscapedIdStartChar:/[\$@-Z_a-z\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u1FFF\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183-\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3006\u3031-\u3035\u303B-\u303C\u3040-\u318F\u31A0-\u31BA\u31F0-\u31FF\u3300-\u337F\u3400-\u4DB5\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,escapedIdChar:/\\[\-\.:#]/,idStartChar:/(?:@nonEscapedIdStartChar)|(?:@escapedIdChar)/,id:/(?:@idStartChar)(?:(?:@idStartChar)|(?:@asciiDigit))*/,specialHashKeys:/\*\*|\*|false|true|in|as|using/,namedSymbols:/&lt;=|&gt;=|\\lte|\\lt|&lt;|\\gte|\\gt|&gt;|&amp;&amp;|\\and|-&gt;|->|==|!=|\+=|-=|\*=|\/=|%=|\+\+|--|<=|&&|\|\||:|\.\.\.|\.\.\*|\.\.<|\.\.!|\?\?|=|<|\+|-|\*|\/|%|\||\.\.|\?|!|&|\.|,|;/,arrows:["->","-&gt;"],delimiters:[";",":",",","."],stringOperators:["lte","lt","gte","gt"],noParseTags:["noparse","noParse","comment"],tokenizer:{[e("default__id__")]:[{include:e("@directive_token__id__")},{include:e("@interpolation_and_text_token__id__")}],[e("fmExpression__id__.directive")]:[{include:e("@blank_and_expression_comment_token__id__")},{include:e("@directive_end_token__id__")},{include:e("@expression_token__id__")}],[e("fmExpression__id__.interpolation")]:[{include:e("@blank_and_expression_comment_token__id__")},{include:e("@expression_token__id__")},{include:e("@greater_operators_token__id__")}],[e("inParen__id__.plain")]:[{include:e("@blank_and_expression_comment_token__id__")},{include:e("@directive_end_token__id__")},{include:e("@expression_token__id__")}],[e("inParen__id__.gt")]:[{include:e("@blank_and_expression_comment_token__id__")},{include:e("@expression_token__id__")},{include:e("@greater_operators_token__id__")}],[e("noSpaceExpression__id__")]:[{include:e("@no_space_expression_end_token__id__")},{include:e("@directive_end_token__id__")},{include:e("@expression_token__id__")}],[e("unifiedCall__id__")]:[{include:e("@unified_call_token__id__")}],[e("singleString__id__")]:[{include:e("@string_single_token__id__")}],[e("doubleString__id__")]:[{include:e("@string_double_token__id__")}],[e("rawSingleString__id__")]:[{include:e("@string_single_raw_token__id__")}],[e("rawDoubleString__id__")]:[{include:e("@string_double_raw_token__id__")}],[e("expressionComment__id__")]:[{include:e("@expression_comment_token__id__")}],[e("noParse__id__")]:[{include:e("@no_parse_token__id__")}],[e("terseComment__id__")]:[{include:e("@terse_comment_token__id__")}],[e("directive_token__id__")]:[[o(/(?:@startTag__id__)(@directiveStartCloseTag1)(?:@closeTag1__id__)/),t.id==="auto"?{cases:{"$1==<":{token:"@rematch",switchTo:`@default_angle_${n.id}`},"$1==[":{token:"@rematch",switchTo:`@default_bracket_${n.id}`}}}:[{token:"@brackets.directive"},{token:"delimiter.directive"},{cases:{"@noParseTags":{token:"tag",next:e("@noParse__id__.$3")},"@default":{token:"tag"}}},{token:"delimiter.directive"},{token:"@brackets.directive"}]],[o(/(?:@startTag__id__)(@directiveStartCloseTag2)(?:@closeTag2__id__)/),t.id==="auto"?{cases:{"$1==<":{token:"@rematch",switchTo:`@default_angle_${n.id}`},"$1==[":{token:"@rematch",switchTo:`@default_bracket_${n.id}`}}}:[{token:"@brackets.directive"},{token:"delimiter.directive"},{token:"tag"},{token:"delimiter.directive"},{token:"@brackets.directive"}]],[o(/(?:@startTag__id__)(@directiveStartBlank)(@blank)/),t.id==="auto"?{cases:{"$1==<":{token:"@rematch",switchTo:`@default_angle_${n.id}`},"$1==[":{token:"@rematch",switchTo:`@default_bracket_${n.id}`}}}:[{token:"@brackets.directive"},{token:"delimiter.directive"},{token:"tag"},{token:"",next:e("@fmExpression__id__.directive")}]],[o(/(?:@endTag__id__)(@directiveEndCloseTag1)(?:@closeTag1__id__)/),t.id==="auto"?{cases:{"$1==<":{token:"@rematch",switchTo:`@default_angle_${n.id}`},"$1==[":{token:"@rematch",switchTo:`@default_bracket_${n.id}`}}}:[{token:"@brackets.directive"},{token:"delimiter.directive"},{token:"tag"},{token:"delimiter.directive"},{token:"@brackets.directive"}]],[o(/(@open__id__)(@)/),t.id==="auto"?{cases:{"$1==<":{token:"@rematch",switchTo:`@default_angle_${n.id}`},"$1==[":{token:"@rematch",switchTo:`@default_bracket_${n.id}`}}}:[{token:"@brackets.directive"},{token:"delimiter.directive",next:e("@unifiedCall__id__")}]],[o(/(@open__id__)(\/@)((?:(?:@id)(?:\.(?:@id))*)?)(?:@closeTag1__id__)/),[{token:"@brackets.directive"},{token:"delimiter.directive"},{token:"tag"},{token:"delimiter.directive"},{token:"@brackets.directive"}]],[o(/(@open__id__)#--/),t.id==="auto"?{cases:{"$1==<":{token:"@rematch",switchTo:`@default_angle_${n.id}`},"$1==[":{token:"@rematch",switchTo:`@default_bracket_${n.id}`}}}:{token:"comment",next:e("@terseComment__id__")}],[o(/(?:@startOrEndTag__id__)([a-zA-Z_]+)/),t.id==="auto"?{cases:{"$1==<":{token:"@rematch",switchTo:`@default_angle_${n.id}`},"$1==[":{token:"@rematch",switchTo:`@default_bracket_${n.id}`}}}:[{token:"@brackets.directive"},{token:"delimiter.directive"},{token:"tag.invalid",next:e("@fmExpression__id__.directive")}]]],[e("interpolation_and_text_token__id__")]:[[o(/(@iOpen1__id__)(@iOpen2__id__)/),[{token:n.id==="bracket"?"@brackets.interpolation":"delimiter.interpolation"},{token:n.id==="bracket"?"delimiter.interpolation":"@brackets.interpolation",next:e("@fmExpression__id__.interpolation")}]],[/[\$#<\[\{]|(?:@blank)+|[^\$<#\[\{\n\r\t ]+/,{token:"source"}]],[e("string_single_token__id__")]:[[/[^'\\]/,{token:"string"}],[/@escapedChar/,{token:"string.escape"}],[/'/,{token:"string",next:"@pop"}]],[e("string_double_token__id__")]:[[/[^"\\]/,{token:"string"}],[/@escapedChar/,{token:"string.escape"}],[/"/,{token:"string",next:"@pop"}]],[e("string_single_raw_token__id__")]:[[/[^']+/,{token:"string.raw"}],[/'/,{token:"string.raw",next:"@pop"}]],[e("string_double_raw_token__id__")]:[[/[^"]+/,{token:"string.raw"}],[/"/,{token:"string.raw",next:"@pop"}]],[e("expression_token__id__")]:[[/(r?)(['"])/,{cases:{"r'":[{token:"keyword"},{token:"string.raw",next:e("@rawSingleString__id__")}],'r"':[{token:"keyword"},{token:"string.raw",next:e("@rawDoubleString__id__")}],"'":[{token:"source"},{token:"string",next:e("@singleString__id__")}],'"':[{token:"source"},{token:"string",next:e("@doubleString__id__")}]}}],[/(?:@integer)(?:\.(?:@integer))?/,{cases:{"(?:@integer)":{token:"number"},"@default":{token:"number.float"}}}],[/(\.)(@blank*)(@specialHashKeys)/,[{token:"delimiter"},{token:""},{token:"identifier"}]],[/(?:@namedSymbols)/,{cases:{"@arrows":{token:"meta.arrow"},"@delimiters":{token:"delimiter"},"@default":{token:"operators"}}}],[/@id/,{cases:{"@keywords":{token:"keyword.$0"},"@stringOperators":{token:"operators"},"@default":{token:"identifier"}}}],[/[\[\]\(\)\{\}]/,{cases:{"\\[":{cases:{"$S2==gt":{token:"@brackets",next:e("@inParen__id__.gt")},"@default":{token:"@brackets",next:e("@inParen__id__.plain")}}},"\\]":{cases:{...n.id==="bracket"?{"$S2==interpolation":{token:"@brackets.interpolation",next:"@popall"}}:{},...t.id==="bracket"?{"$S2==directive":{token:"@brackets.directive",next:"@popall"}}:{},[e("$S1==inParen__id__")]:{token:"@brackets",next:"@pop"},"@default":{token:"@brackets"}}},"\\(":{token:"@brackets",next:e("@inParen__id__.gt")},"\\)":{cases:{[e("$S1==inParen__id__")]:{token:"@brackets",next:"@pop"},"@default":{token:"@brackets"}}},"\\{":{cases:{"$S2==gt":{token:"@brackets",next:e("@inParen__id__.gt")},"@default":{token:"@brackets",next:e("@inParen__id__.plain")}}},"\\}":{cases:{...n.id==="bracket"?{}:{"$S2==interpolation":{token:"@brackets.interpolation",next:"@popall"}},[e("$S1==inParen__id__")]:{token:"@brackets",next:"@pop"},"@default":{token:"@brackets"}}}}}],[/\$\{/,{token:"delimiter.invalid"}]],[e("blank_and_expression_comment_token__id__")]:[[/(?:@blank)+/,{token:""}],[/[<\[][#!]--/,{token:"comment",next:e("@expressionComment__id__")}]],[e("directive_end_token__id__")]:[[/>/,t.id==="bracket"?{token:"operators"}:{token:"@brackets.directive",next:"@popall"}],[o(/(\/)(@close__id__)/),[{token:"delimiter.directive"},{token:"@brackets.directive",next:"@popall"}]]],[e("greater_operators_token__id__")]:[[/>/,{token:"operators"}],[/>=/,{token:"operators"}]],[e("no_space_expression_end_token__id__")]:[[/(?:@blank)+/,{token:"",switchTo:e("@fmExpression__id__.directive")}]],[e("unified_call_token__id__")]:[[/(@id)((?:@blank)+)/,[{token:"tag"},{token:"",next:e("@fmExpression__id__.directive")}]],[o(/(@id)(\/?)(@close__id__)/),[{token:"tag"},{token:"delimiter.directive"},{token:"@brackets.directive",next:"@popall"}]],[/./,{token:"@rematch",next:e("@noSpaceExpression__id__")}]],[e("no_parse_token__id__")]:[[o(/(@open__id__)(\/#?)([a-zA-Z]+)((?:@blank)*)(@close__id__)/),{cases:{"$S2==$3":[{token:"@brackets.directive"},{token:"delimiter.directive"},{token:"tag"},{token:""},{token:"@brackets.directive",next:"@popall"}],"$S2==comment":[{token:"comment"},{token:"comment"},{token:"comment"},{token:"comment"},{token:"comment"}],"@default":[{token:"source"},{token:"source"},{token:"source"},{token:"source"},{token:"source"}]}}],[/[^<\[\-]+|[<\[\-]/,{cases:{"$S2==comment":{token:"comment"},"@default":{token:"source"}}}]],[e("expression_comment_token__id__")]:[[/--[>\]]/,{token:"comment",next:"@pop"}],[/[^\->\]]+|[>\]\-]/,{token:"comment"}]],[e("terse_comment_token__id__")]:[[o(/--(?:@close__id__)/),{token:"comment",next:"@popall"}],[/[^<\[\-]+|[<\[\-]/,{token:"comment"}]]}}}function $(t){let n=a(r,t),i=a(u,t),e=a(P,t);return{...n,...i,...e,unicode:!0,includeLF:!1,start:`default_auto_${t.id}`,ignoreCase:!1,defaultToken:"invalid",tokenPostfix:".freemarker2",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{...n.tokenizer,...i.tokenizer,...e.tokenizer}}}var R={conf:p(r),language:a(r,g)},z={conf:p(u),language:a(u,g)},L={conf:p(r),language:a(r,A)},O={conf:p(u),language:a(u,A)},Z={conf:b(),language:$(g)},j={conf:b(),language:$(A)};return I(M);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/fsharp/fsharp.js b/public/vs/basic-languages/fsharp/fsharp.js
new file mode 100644
index 0000000..112ed29
--- /dev/null
+++ b/public/vs/basic-languages/fsharp/fsharp.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/fsharp/fsharp", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(n,e)=>{for(var o in e)s(n,o,{get:e[o],enumerable:!0})},g=(n,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of a(e))!l.call(n,t)&&t!==o&&s(n,t,{get:()=>e[t],enumerable:!(i=r(e,t))||i.enumerable});return n};var f=n=>g(s({},"__esModule",{value:!0}),n);var d={};c(d,{conf:()=>m,language:()=>u});var m={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*//\\s*#region\\b|^\\s*\\(\\*\\s*#region(.*)\\*\\)"),end:new RegExp("^\\s*//\\s*#endregion\\b|^\\s*\\(\\*\\s*#endregion\\s*\\*\\)")}}},u={defaultToken:"",tokenPostfix:".fs",keywords:["abstract","and","atomic","as","assert","asr","base","begin","break","checked","component","const","constraint","constructor","continue","class","default","delegate","do","done","downcast","downto","elif","else","end","exception","eager","event","external","extern","false","finally","for","fun","function","fixed","functor","global","if","in","include","inherit","inline","interface","internal","land","lor","lsl","lsr","lxor","lazy","let","match","member","mod","module","mutable","namespace","method","mixin","new","not","null","of","open","or","object","override","private","parallel","process","protected","pure","public","rec","return","static","sealed","struct","sig","then","to","true","tailcall","trait","try","type","upcast","use","val","void","virtual","volatile","when","while","with","yield"],symbols:/[=><!~?:&|+\-*\^%;\.,\/]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,integersuffix:/[uU]?[yslnLI]?/,floatsuffix:/[fFmM]?/,tokenizer:{root:[[/[a-zA-Z_]\w*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/\[<.*>\]/,"annotation"],[/^#(if|else|endif)/,"keyword"],[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,"delimiter"],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0x[0-9a-fA-F]+LF/,"number.float"],[/0x[0-9a-fA-F]+(@integersuffix)/,"number.hex"],[/0b[0-1]+(@integersuffix)/,"number.bin"],[/\d+(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"""/,"string",'@string."""'],[/"/,"string",'@string."'],[/\@"/,{token:"string.quote",next:"@litstring"}],[/'[^\\']'B?/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\(\*(?!\))/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^*(]+/,"comment"],[/\*\)/,"comment","@pop"],[/\*/,"comment"],[/\(\*\)/,"comment"],[/\(/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/("""|"B?)/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]],litstring:[[/[^"]+/,"string"],[/""/,"string.escape"],[/"/,{token:"string.quote",next:"@pop"}]]}};return f(d);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/go/go.js b/public/vs/basic-languages/go/go.js
new file mode 100644
index 0000000..8f88085
--- /dev/null
+++ b/public/vs/basic-languages/go/go.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/go/go", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var m=(n,e)=>{for(var t in e)s(n,t,{get:e[t],enumerable:!0})},l=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of a(e))!c.call(n,o)&&o!==t&&s(n,o,{get:()=>e[o],enumerable:!(r=i(e,o))||r.enumerable});return n};var g=n=>l(s({},"__esModule",{value:!0}),n);var d={};m(d,{conf:()=>p,language:()=>u});var p={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"`",close:"`",notIn:["string"]},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"`",close:"`"},{open:'"',close:'"'},{open:"'",close:"'"}]},u={defaultToken:"",tokenPostfix:".go",keywords:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var","bool","true","false","uint8","uint16","uint32","uint64","int8","int16","int32","int64","float32","float64","complex64","complex128","byte","rune","uint","int","uintptr","string","nil"],operators:["+","-","*","/","%","&","|","^","<<",">>","&^","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>=","&^=","&&","||","<-","++","--","==","<",">","=","!","!=","<=",">=",":=","...","(",")","","]","{","}",",",";",".",":"],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/[a-zA-Z_]\w*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/\[\[.*\]\]/,"annotation"],[/^\s*#\w+/,"keyword"],[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex"],[/0[0-7']*[0-7]/,"number.octal"],[/0[bB][0-1']*[0-1]/,"number.binary"],[/\d[\d']*/,"number"],[/\d/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/`/,"string","@rawstring"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],rawstring:[[/[^\`]/,"string"],[/`/,"string","@pop"]]}};return g(d);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/graphql/graphql.js b/public/vs/basic-languages/graphql/graphql.js
new file mode 100644
index 0000000..7eb3ed5
--- /dev/null
+++ b/public/vs/basic-languages/graphql/graphql.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/graphql/graphql", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(n,e)=>{for(var t in e)s(n,t,{get:e[t],enumerable:!0})},d=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of i(e))!l.call(n,o)&&o!==t&&s(n,o,{get:()=>e[o],enumerable:!(r=a(e,o))||r.enumerable});return n};var p=n=>d(s({},"__esModule",{value:!0}),n);var u={};c(u,{conf:()=>g,language:()=>I});var g={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"""',close:'"""',notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"""',close:'"""'},{open:'"',close:'"'}],folding:{offSide:!0}},I={defaultToken:"invalid",tokenPostfix:".gql",keywords:["null","true","false","query","mutation","subscription","extend","schema","directive","scalar","type","interface","union","enum","input","implements","fragment","on"],typeKeywords:["Int","Float","String","Boolean","ID"],directiveLocations:["SCHEMA","SCALAR","OBJECT","FIELD_DEFINITION","ARGUMENT_DEFINITION","INTERFACE","UNION","ENUM","ENUM_VALUE","INPUT_OBJECT","INPUT_FIELD_DEFINITION","QUERY","MUTATION","SUBSCRIPTION","FIELD","FRAGMENT_DEFINITION","FRAGMENT_SPREAD","INLINE_FRAGMENT","VARIABLE_DEFINITION"],operators:["=","!","?",":","&","|"],symbols:/[=!?:&|]+/,escapes:/\\(?:["\\\/bfnrt]|u[0-9A-Fa-f]{4})/,tokenizer:{root:[[/[a-z_][\w$]*/,{cases:{"@keywords":"keyword","@default":"key.identifier"}}],[/[$][\w$]*/,{cases:{"@keywords":"keyword","@default":"argument.identifier"}}],[/[A-Z][\w\$]*/,{cases:{"@typeKeywords":"keyword","@default":"type.identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,{token:"annotation",log:"annotation token: $0"}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/"""/,{token:"string",next:"@mlstring",nextEmbedded:"markdown"}],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",bracket:"@open",next:"@string"}]],mlstring:[[/[^"]+/,"string"],['"""',{token:"string",next:"@pop",nextEmbedded:"@pop"}]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[/#.*$/,"comment"]]}};return p(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/handlebars/handlebars.js b/public/vs/basic-languages/handlebars/handlebars.js
new file mode 100644
index 0000000..e071216
--- /dev/null
+++ b/public/vs/basic-languages/handlebars/handlebars.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/handlebars/handlebars", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var h=Object.create;var i=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var y=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var T=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),S=(e,t)=>{for(var n in t)i(e,n,{get:t[n],enumerable:!0})},m=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of u(t))!k.call(e,r)&&r!==n&&i(e,r,{get:()=>t[r],enumerable:!(o=b(t,r))||o.enumerable});return e},l=(e,t,n)=>(m(e,t,"default"),n&&m(n,t,"default")),s=(e,t,n)=>(n=e!=null?h(x(e)):{},m(t||!e||!e.__esModule?i(n,"default",{value:e,enumerable:!0}):n,e)),E=e=>m(i({},"__esModule",{value:!0}),e);var c=T((I,d)=>{var w=s(y("vs/editor/editor.api"));d.exports=w});var f={};S(f,{conf:()=>g,language:()=>$});var a={};l(a,s(c()));var p=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"],g={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:["{{!--","--}}"]},brackets:[["<!--","-->"],["<",">"],["{{","}}"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"<",close:">"},{open:'"',close:'"'},{open:"'",close:"'"}],onEnterRules:[{beforeText:new RegExp(`<(?!(?:${p.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:a.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp(`<(?!(?:${p.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),action:{indentAction:a.languages.IndentAction.Indent}}]},$={defaultToken:"",tokenPostfix:"",tokenizer:{root:[[/\{\{!--/,"comment.block.start.handlebars","@commentBlock"],[/\{\{!/,"comment.start.handlebars","@comment"],[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.root"}],[/<!DOCTYPE/,"metatag.html","@doctype"],[/<!--/,"comment.html","@commentHtml"],[/(<)(\w+)(\/>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)(script)/,["delimiter.html",{token:"tag.html",next:"@script"}]],[/(<)(style)/,["delimiter.html",{token:"tag.html",next:"@style"}]],[/(<)([:\w]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)(\w+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/</,"delimiter.html"],[/\{/,"delimiter.html"],[/[^<{]+/]],doctype:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.comment"}],[/[^>]+/,"metatag.content.html"],[/>/,"metatag.html","@pop"]],comment:[[/\}\}/,"comment.end.handlebars","@pop"],[/./,"comment.content.handlebars"]],commentBlock:[[/--\}\}/,"comment.block.end.handlebars","@pop"],[/./,"comment.content.handlebars"]],commentHtml:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.comment"}],[/-->/,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],handlebarsInSimpleState:[[/\{\{\{?/,"delimiter.handlebars"],[/\}\}\}?/,{token:"delimiter.handlebars",switchTo:"@$S2.$S3"}],{include:"handlebarsRoot"}],handlebarsInEmbeddedState:[[/\{\{\{?/,"delimiter.handlebars"],[/\}\}\}?/,{token:"delimiter.handlebars",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],{include:"handlebarsRoot"}],handlebarsRoot:[[/"[^"]*"/,"string.handlebars"],[/[#/][^\s}]+/,"keyword.helper.handlebars"],[/else\b/,"keyword.helper.handlebars"],[/[\s]+/],[/[^}]/,"variable.parameter.handlebars"]]}};return E(f);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/hcl/hcl.js b/public/vs/basic-languages/hcl/hcl.js
new file mode 100644
index 0000000..d1699f3
--- /dev/null
+++ b/public/vs/basic-languages/hcl/hcl.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/hcl/hcl", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var o in e)r(t,o,{get:e[o],enumerable:!0})},d=(t,e,o,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of i(e))!c.call(t,s)&&s!==o&&r(t,s,{get:()=>e[s],enumerable:!(n=a(e,s))||n.enumerable});return t};var m=t=>d(r({},"__esModule",{value:!0}),t);var f={};l(f,{conf:()=>p,language:()=>g});var p={comments:{lineComment:"#",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},g={defaultToken:"",tokenPostfix:".hcl",keywords:["var","local","path","for_each","any","string","number","bool","true","false","null","if ","else ","endif ","for ","in","endfor"],operators:["=",">=","<=","==","!=","+","-","*","/","%","&&","||","!","<",">","?","...",":"],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,terraformFunctions:/(abs|ceil|floor|log|max|min|pow|signum|chomp|format|formatlist|indent|join|lower|regex|regexall|replace|split|strrev|substr|title|trimspace|upper|chunklist|coalesce|coalescelist|compact|concat|contains|distinct|element|flatten|index|keys|length|list|lookup|map|matchkeys|merge|range|reverse|setintersection|setproduct|setunion|slice|sort|transpose|values|zipmap|base64decode|base64encode|base64gzip|csvdecode|jsondecode|jsonencode|urlencode|yamldecode|yamlencode|abspath|dirname|pathexpand|basename|file|fileexists|fileset|filebase64|templatefile|formatdate|timeadd|timestamp|base64sha256|base64sha512|bcrypt|filebase64sha256|filebase64sha512|filemd5|filemd1|filesha256|filesha512|md5|rsadecrypt|sha1|sha256|sha512|uuid|uuidv5|cidrhost|cidrnetmask|cidrsubnet|tobool|tolist|tomap|tonumber|toset|tostring)/,terraformMainBlocks:/(module|data|terraform|resource|provider|variable|output|locals)/,tokenizer:{root:[[/^@terraformMainBlocks([ \t]*)([\w-]+|"[\w-]+"|)([ \t]*)([\w-]+|"[\w-]+"|)([ \t]*)(\{)/,["type","","string","","string","","@brackets"]],[/(\w+[ \t]+)([ \t]*)([\w-]+|"[\w-]+"|)([ \t]*)([\w-]+|"[\w-]+"|)([ \t]*)(\{)/,["identifier","","string","","string","","@brackets"]],[/(\w+[ \t]+)([ \t]*)([\w-]+|"[\w-]+"|)([ \t]*)([\w-]+|"[\w-]+"|)(=)(\{)/,["identifier","","string","","operator","","@brackets"]],{include:"@terraform"}],terraform:[[/@terraformFunctions(\()/,["type","@brackets"]],[/[a-zA-Z_]\w*-*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"variable"}}],{include:"@whitespace"},{include:"@heredoc"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\d[\d']*/,"number"],[/\d/,"number"],[/[;,.]/,"delimiter"],[/"/,"string","@string"],[/'/,"invalid"]],heredoc:[[/<<[-]*\s*["]?([\w\-]+)["]?/,{token:"string.heredoc.delimiter",next:"@heredocBody.$1"}]],heredocBody:[[/([\w\-]+)$/,{cases:{"$1==$S2":[{token:"string.heredoc.delimiter",next:"@popall"}],"@default":"string.heredoc"}}],[/./,"string.heredoc"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"],[/#.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],string:[[/\$\{/,{token:"delimiter",next:"@stringExpression"}],[/[^\\"\$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@popall"]],stringInsideExpression:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],stringExpression:[[/\}/,{token:"delimiter",next:"@pop"}],[/"/,"string","@stringInsideExpression"],{include:"@terraform"}]}};return m(f);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/html/html.js b/public/vs/basic-languages/html/html.js
new file mode 100644
index 0000000..afedbd5
--- /dev/null
+++ b/public/vs/basic-languages/html/html.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/html/html", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var u=Object.create;var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty;var k=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var E=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),T=(e,t)=>{for(var n in t)a(e,n,{get:t[n],enumerable:!0})},o=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of x(t))!g.call(e,r)&&r!==n&&a(e,r,{get:()=>t[r],enumerable:!(s=b(t,r))||s.enumerable});return e},d=(e,t,n)=>(o(e,t,"default"),n&&o(n,t,"default")),m=(e,t,n)=>(n=e!=null?u(y(e)):{},o(t||!e||!e.__esModule?a(n,"default",{value:e,enumerable:!0}):n,e)),w=e=>o(a({},"__esModule",{value:!0}),e);var l=E((A,p)=>{var h=m(k("vs/editor/editor.api"));p.exports=h});var $={};T($,{conf:()=>v,language:()=>f});var i={};d(i,m(l()));var c=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"],v={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:["<!--","-->"]},brackets:[["<!--","-->"],["<",">"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"}],onEnterRules:[{beforeText:new RegExp(`<(?!(?:${c.join("|")}))([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:i.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp(`<(?!(?:${c.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),action:{indentAction:i.languages.IndentAction.Indent}}],folding:{markers:{start:new RegExp("^\\s*<!--\\s*#region\\b.*-->"),end:new RegExp("^\\s*<!--\\s*#endregion\\b.*-->")}}},f={defaultToken:"",tokenPostfix:".html",ignoreCase:!0,tokenizer:{root:[[/<!DOCTYPE/,"metatag","@doctype"],[/<!--/,"comment","@comment"],[/(<)((?:[\w\-]+:)?[\w\-]+)(\s*)(\/>)/,["delimiter","tag","","delimiter"]],[/(<)(script)/,["delimiter",{token:"tag",next:"@script"}]],[/(<)(style)/,["delimiter",{token:"tag",next:"@style"}]],[/(<)((?:[\w\-]+:)?[\w\-]+)/,["delimiter",{token:"tag",next:"@otherTag"}]],[/(<\/)((?:[\w\-]+:)?[\w\-]+)/,["delimiter",{token:"tag",next:"@otherTag"}]],[/</,"delimiter"],[/[^<]+/]],doctype:[[/[^>]+/,"metatag.content"],[/>/,"metatag","@pop"]],comment:[[/-->/,"comment","@pop"],[/[^-]+/,"comment.content"],[/./,"comment.content"]],otherTag:[[/\/?>/,"delimiter","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter","tag",{token:"delimiter",next:"@pop"}]]],scriptAfterType:[[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/"module"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.text/javascript"}],[/'module'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.text/javascript"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/>/,{token:"delimiter",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]],style:[[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter","tag",{token:"delimiter",next:"@pop"}]]],styleAfterType:[[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/>/,{token:"delimiter",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]]}};return w($);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/ini/ini.js b/public/vs/basic-languages/ini/ini.js
new file mode 100644
index 0000000..777f251
--- /dev/null
+++ b/public/vs/basic-languages/ini/ini.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/ini/ini", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var t=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var c=(n,e)=>{for(var s in e)t(n,s,{get:e[s],enumerable:!0})},l=(n,e,s,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of r(e))!g.call(n,o)&&o!==s&&t(n,o,{get:()=>e[o],enumerable:!(a=i(e,o))||a.enumerable});return n};var p=n=>l(t({},"__esModule",{value:!0}),n);var f={};c(f,{conf:()=>u,language:()=>m});var u={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},m={defaultToken:"",tokenPostfix:".ini",escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^\[[^\]]*\]/,"metatag"],[/(^\w+)(\s*)(\=)/,["key","","delimiter"]],{include:"@whitespace"},[/\d+/,"number"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],whitespace:[[/[ \t\r\n]+/,""],[/^\s*[#;].*$/,"comment"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}};return p(f);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/java/java.js b/public/vs/basic-languages/java/java.js
new file mode 100644
index 0000000..b28dddf
--- /dev/null
+++ b/public/vs/basic-languages/java/java.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/java/java", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var o in e)s(t,o,{get:e[o],enumerable:!0})},d=(t,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of r(e))!c.call(t,n)&&n!==o&&s(t,n,{get:()=>e[n],enumerable:!(i=a(e,n))||i.enumerable});return t};var g=t=>d(s({},"__esModule",{value:!0}),t);var f={};l(f,{conf:()=>m,language:()=>p});var m={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:<editor-fold\\b))"),end:new RegExp("^\\s*//\\s*(?:(?:#?endregion\\b)|(?:</editor-fold>))")}}},p={defaultToken:"",tokenPostfix:".java",keywords:["abstract","continue","for","new","switch","assert","default","goto","package","synchronized","boolean","do","if","private","this","break","double","implements","protected","throw","byte","else","import","public","throws","case","enum","instanceof","return","transient","catch","extends","int","short","try","char","final","interface","static","void","class","finally","long","strictfp","volatile","const","float","native","super","while","true","false","yield","record","sealed","non-sealed","permits"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,digits:/\d+(_+\d+)*/,octaldigits:/[0-7]+(_+[0-7]+)*/,binarydigits:/[0-1]+(_+[0-1]+)*/,hexdigits:/[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,tokenizer:{root:[["non-sealed","keyword.non-sealed"],[/[a-zA-Z_$][\w$]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/0[xX](@hexdigits)[Ll]?/,"number.hex"],[/0(@octaldigits)[Ll]?/,"number.octal"],[/0[bB](@binarydigits)[Ll]?/,"number.binary"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"""/,"string","@multistring"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@javadoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],javadoc:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],multistring:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"""/,"string","@pop"],[/./,"string"]]}};return g(f);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/javascript/javascript.js b/public/vs/basic-languages/javascript/javascript.js
new file mode 100644
index 0000000..e30c31a
--- /dev/null
+++ b/public/vs/basic-languages/javascript/javascript.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/javascript/javascript", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var x=Object.create;var a=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var b=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var y=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var w=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),h=(e,t)=>{for(var n in t)a(e,n,{get:t[n],enumerable:!0})},s=(e,t,n,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of f(t))!k.call(e,r)&&r!==n&&a(e,r,{get:()=>t[r],enumerable:!(c=u(t,r))||c.enumerable});return e},g=(e,t,n)=>(s(e,t,"default"),n&&s(n,t,"default")),p=(e,t,n)=>(n=e!=null?x(b(e)):{},s(t||!e||!e.__esModule?a(n,"default",{value:e,enumerable:!0}):n,e)),v=e=>s(a({},"__esModule",{value:!0}),e);var d=w((C,l)=>{var A=p(y("vs/editor/editor.api"));l.exports=A});var _={};h(_,{conf:()=>$,language:()=>T});var i={};g(i,p(d()));var m={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],onEnterRules:[{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,afterText:/^\s*\*\/$/,action:{indentAction:i.languages.IndentAction.IndentOutdent,appendText:" * "}},{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,action:{indentAction:i.languages.IndentAction.None,appendText:" * "}},{beforeText:/^(\t|(\ \ ))*\ \*(\ ([^\*]|\*(?!\/))*)?$/,action:{indentAction:i.languages.IndentAction.None,appendText:"* "}},{beforeText:/^(\t|(\ \ ))*\ \*\/\s*$/,action:{indentAction:i.languages.IndentAction.None,removeText:1}}],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"`",close:"`",notIn:["string","comment"]},{open:"/**",close:" */",notIn:["string"]}],folding:{markers:{start:new RegExp("^\\s*//\\s*#?region\\b"),end:new RegExp("^\\s*//\\s*#?endregion\\b")}}},o={defaultToken:"invalid",tokenPostfix:".ts",keywords:["abstract","any","as","asserts","bigint","boolean","break","case","catch","class","continue","const","constructor","debugger","declare","default","delete","do","else","enum","export","extends","false","finally","for","from","function","get","if","implements","import","in","infer","instanceof","interface","is","keyof","let","module","namespace","never","new","null","number","object","out","package","private","protected","public","override","readonly","require","global","return","satisfies","set","static","string","super","switch","symbol","this","throw","true","try","type","typeof","undefined","unique","unknown","var","void","while","with","yield","async","await","of"],operators:["<=",">=","==","!=","===","!==","=>","+","-","**","*","/","%","++","--","<<","</",">>",">>>","&","|","^","!","~","&&","||","??","?",":","=","+=","-=","*=","**=","/=","%=","<<=",">>=",">>>=","&=","|=","^=","@"],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,digits:/\d+(_+\d+)*/,octaldigits:/[0-7]+(_+[0-7]+)*/,binarydigits:/[0-1]+(_+[0-1]+)*/,hexdigits:/[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,regexpctl:/[(){}\[\]\$\^|\-*+?\.]/,regexpesc:/\\(?:[bBdDfnrstvwWn0\\\/]|@regexpctl|c[A-Z]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})/,tokenizer:{root:[[/[{}]/,"delimiter.bracket"],{include:"common"}],common:[[/#?[a-z_$][\w$]*/,{cases:{"@keywords":"keyword","@default":"identifier"}}],[/[A-Z][\w\$]*/,"type.identifier"],{include:"@whitespace"},[/\/(?=([^\\\/]|\\.)+\/([dgimsuy]*)(\s*)(\.|;|,|\)|\]|\}|$))/,{token:"regexp",bracket:"@open",next:"@regexp"}],[/[()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/!(?=([^=]|$))/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/(@digits)[eE]([\-+]?(@digits))?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?/,"number.float"],[/0[xX](@hexdigits)n?/,"number.hex"],[/0[oO]?(@octaldigits)n?/,"number.octal"],[/0[bB](@binarydigits)n?/,"number.binary"],[/(@digits)n?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"],[/`/,"string","@string_backtick"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@jsdoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],jsdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],regexp:[[/(\{)(\d+(?:,\d*)?)(\})/,["regexp.escape.control","regexp.escape.control","regexp.escape.control"]],[/(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/,["regexp.escape.control",{token:"regexp.escape.control",next:"@regexrange"}]],[/(\()(\?:|\?=|\?!)/,["regexp.escape.control","regexp.escape.control"]],[/[()]/,"regexp.escape.control"],[/@regexpctl/,"regexp.escape.control"],[/[^\\\/]/,"regexp"],[/@regexpesc/,"regexp.escape"],[/\\\./,"regexp.invalid"],[/(\/)([dgimsuy]*)/,[{token:"regexp",bracket:"@close",next:"@pop"},"keyword.other"]]],regexrange:[[/-/,"regexp.escape.control"],[/\^/,"regexp.invalid"],[/@regexpesc/,"regexp.escape"],[/[^\]]/,"regexp"],[/\]/,{token:"regexp.escape.control",next:"@pop",bracket:"@close"}]],string_double:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],string_single:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]],string_backtick:[[/\$\{/,{token:"delimiter.bracket",next:"@bracketCounting"}],[/[^\\`$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/`/,"string","@pop"]],bracketCounting:[[/\{/,"delimiter.bracket","@bracketCounting"],[/\}/,"delimiter.bracket","@pop"],{include:"common"}]}};var $=m,T={defaultToken:"invalid",tokenPostfix:".js",keywords:["break","case","catch","class","continue","const","constructor","debugger","default","delete","do","else","export","extends","false","finally","for","from","function","get","if","import","in","instanceof","let","new","null","return","set","static","super","switch","symbol","this","throw","true","try","typeof","undefined","var","void","while","with","yield","async","await","of"],typeKeywords:[],operators:o.operators,symbols:o.symbols,escapes:o.escapes,digits:o.digits,octaldigits:o.octaldigits,binarydigits:o.binarydigits,hexdigits:o.hexdigits,regexpctl:o.regexpctl,regexpesc:o.regexpesc,tokenizer:o.tokenizer};return v(_);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/julia/julia.js b/public/vs/basic-languages/julia/julia.js
new file mode 100644
index 0000000..772a503
--- /dev/null
+++ b/public/vs/basic-languages/julia/julia.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/julia/julia", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var c=(t,e)=>{for(var n in e)o(t,n,{get:e[n],enumerable:!0})},l=(t,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of s(e))!p.call(t,r)&&r!==n&&o(t,r,{get:()=>e[r],enumerable:!(a=i(e,r))||a.enumerable});return t};var d=t=>l(o({},"__esModule",{value:!0}),t);var u={};c(u,{conf:()=>g,language:()=>m});var g={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},m={tokenPostfix:".julia",keywords:["begin","while","if","for","try","return","break","continue","function","macro","quote","let","local","global","const","do","struct","module","baremodule","using","import","export","end","else","elseif","catch","finally","mutable","primitive","abstract","type","in","isa","where","new"],types:["LinRange","LineNumberNode","LinearIndices","LoadError","MIME","Matrix","Method","MethodError","Missing","MissingException","Module","NTuple","NamedTuple","Nothing","Number","OrdinalRange","OutOfMemoryError","OverflowError","Pair","PartialQuickSort","PermutedDimsArray","Pipe","Ptr","QuoteNode","Rational","RawFD","ReadOnlyMemoryError","Real","ReentrantLock","Ref","Regex","RegexMatch","RoundingMode","SegmentationFault","Set","Signed","Some","StackOverflowError","StepRange","StepRangeLen","StridedArray","StridedMatrix","StridedVecOrMat","StridedVector","String","StringIndexError","SubArray","SubString","SubstitutionString","Symbol","SystemError","Task","Text","TextDisplay","Timer","Tuple","Type","TypeError","TypeVar","UInt","UInt128","UInt16","UInt32","UInt64","UInt8","UndefInitializer","AbstractArray","UndefKeywordError","AbstractChannel","UndefRefError","AbstractChar","UndefVarError","AbstractDict","Union","AbstractDisplay","UnionAll","AbstractFloat","UnitRange","AbstractIrrational","Unsigned","AbstractMatrix","AbstractRange","Val","AbstractSet","Vararg","AbstractString","VecElement","AbstractUnitRange","VecOrMat","AbstractVecOrMat","Vector","AbstractVector","VersionNumber","Any","WeakKeyDict","ArgumentError","WeakRef","Array","AssertionError","BigFloat","BigInt","BitArray","BitMatrix","BitSet","BitVector","Bool","BoundsError","CapturedException","CartesianIndex","CartesianIndices","Cchar","Cdouble","Cfloat","Channel","Char","Cint","Cintmax_t","Clong","Clonglong","Cmd","Colon","Complex","ComplexF16","ComplexF32","ComplexF64","CompositeException","Condition","Cptrdiff_t","Cshort","Csize_t","Cssize_t","Cstring","Cuchar","Cuint","Cuintmax_t","Culong","Culonglong","Cushort","Cvoid","Cwchar_t","Cwstring","DataType","DenseArray","DenseMatrix","DenseVecOrMat","DenseVector","Dict","DimensionMismatch","Dims","DivideError","DomainError","EOFError","Enum","ErrorException","Exception","ExponentialBackOff","Expr","Float16","Float32","Float64","Function","GlobalRef","HTML","IO","IOBuffer","IOContext","IOStream","IdDict","IndexCartesian","IndexLinear","IndexStyle","InexactError","InitError","Int","Int128","Int16","Int32","Int64","Int8","Integer","InterruptException","InvalidStateException","Irrational","KeyError"],keywordops:["<:",">:",":","=>","...",".","->","?"],allops:/[^\w\d\s()\[\]{}"'#]+/,constants:["true","false","nothing","missing","undef","Inf","pi","NaN","\u03C0","\u212F","ans","PROGRAM_FILE","ARGS","C_NULL","VERSION","DEPOT_PATH","LOAD_PATH"],operators:["!","!=","!==","%","&","*","+","-","/","//","<","<<","<=","==","===","=>",">",">=",">>",">>>","\\","^","|","|>","~","\xF7","\u2208","\u2209","\u220B","\u220C","\u2218","\u221A","\u221B","\u2229","\u222A","\u2248","\u2249","\u2260","\u2261","\u2262","\u2264","\u2265","\u2286","\u2287","\u2288","\u2289","\u228A","\u228B","\u22BB"],brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],ident:/蟺|鈩瘄\b(?!\d)\w+\b/,escape:/(?:[abefnrstv\\"'\n\r]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2}|u[0-9A-Fa-f]{4})/,escapes:/\\(?:C\-(@escape|.)|c(@escape|.)|@escape)/,tokenizer:{root:[[/(::)\s*|\b(isa)\s+/,"keyword","@typeanno"],[/\b(isa)(\s*\(@ident\s*,\s*)/,["keyword",{token:"",next:"@typeanno"}]],[/\b(type|struct)[ \t]+/,"keyword","@typeanno"],[/^\s*:@ident[!?]?/,"metatag"],[/(return)(\s*:@ident[!?]?)/,["keyword","metatag"]],[/(\(|\[|\{|@allops)(\s*:@ident[!?]?)/,["","metatag"]],[/:\(/,"metatag","@quote"],[/r"""/,"regexp.delim","@tregexp"],[/r"/,"regexp.delim","@sregexp"],[/raw"""/,"string.delim","@rtstring"],[/[bv]?"""/,"string.delim","@dtstring"],[/raw"/,"string.delim","@rsstring"],[/[bv]?"/,"string.delim","@dsstring"],[/(@ident)\{/,{cases:{"$1@types":{token:"type",next:"@gen"},"@default":{token:"type",next:"@gen"}}}],[/@ident[!?'']?(?=\.?\()/,{cases:{"@types":"type","@keywords":"keyword","@constants":"variable","@default":"keyword.flow"}}],[/@ident[!?']?/,{cases:{"@types":"type","@keywords":"keyword","@constants":"variable","@default":"identifier"}}],[/\$\w+/,"key"],[/\$\(/,"key","@paste"],[/@@@ident/,"annotation"],{include:"@whitespace"},[/'(?:@escapes|.)'/,"string.character"],[/[()\[\]{}]/,"@brackets"],[/@allops/,{cases:{"@keywordops":"keyword","@operators":"operator"}}],[/[;,]/,"delimiter"],[/0[xX][0-9a-fA-F](_?[0-9a-fA-F])*/,"number.hex"],[/0[_oO][0-7](_?[0-7])*/,"number.octal"],[/0[bB][01](_?[01])*/,"number.binary"],[/[+\-]?\d+(\.\d+)?(im?|[eE][+\-]?\d+(\.\d+)?)?/,"number"]],typeanno:[[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*\{/,"type","@gen"],[/([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*)(\s*<:\s*)/,["type","keyword"]],[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*/,"type","@pop"],["","","@pop"]],gen:[[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*\{/,"type","@push"],[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*/,"type"],[/<:/,"keyword"],[/(\})(\s*<:\s*)/,["type",{token:"keyword",next:"@pop"}]],[/\}/,"type","@pop"],{include:"@root"}],quote:[[/\$\(/,"key","@paste"],[/\(/,"@brackets","@paren"],[/\)/,"metatag","@pop"],{include:"@root"}],paste:[[/:\(/,"metatag","@quote"],[/\(/,"@brackets","@paren"],[/\)/,"key","@pop"],{include:"@root"}],paren:[[/\$\(/,"key","@paste"],[/:\(/,"metatag","@quote"],[/\(/,"@brackets","@push"],[/\)/,"@brackets","@pop"],{include:"@root"}],sregexp:[[/^.*/,"invalid"],[/[^\\"()\[\]{}]/,"regexp"],[/[()\[\]{}]/,"@brackets"],[/\\./,"operator.scss"],[/"[imsx]*/,"regexp.delim","@pop"]],tregexp:[[/[^\\"()\[\]{}]/,"regexp"],[/[()\[\]{}]/,"@brackets"],[/\\./,"operator.scss"],[/"(?!"")/,"string"],[/"""[imsx]*/,"regexp.delim","@pop"]],rsstring:[[/^.*/,"invalid"],[/[^\\"]/,"string"],[/\\./,"string.escape"],[/"/,"string.delim","@pop"]],rtstring:[[/[^\\"]/,"string"],[/\\./,"string.escape"],[/"(?!"")/,"string"],[/"""/,"string.delim","@pop"]],dsstring:[[/^.*/,"invalid"],[/[^\\"\$]/,"string"],[/\$/,"","@interpolated"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string.delim","@pop"]],dtstring:[[/[^\\"\$]/,"string"],[/\$/,"","@interpolated"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"(?!"")/,"string"],[/"""/,"string.delim","@pop"]],interpolated:[[/\(/,{token:"",switchTo:"@interpolated_compound"}],[/[a-zA-Z_]\w*/,"identifier"],["","","@pop"]],interpolated_compound:[[/\)/,"","@pop"],{include:"@root"}],whitespace:[[/[ \t\r\n]+/,""],[/#=/,"comment","@multi_comment"],[/#.*$/,"comment"]],multi_comment:[[/#=/,"comment","@push"],[/=#/,"comment","@pop"],[/=(?!#)|#(?!=)/,"comment"],[/[^#=]+/,"comment"]]}};return d(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/kotlin/kotlin.js b/public/vs/basic-languages/kotlin/kotlin.js
new file mode 100644
index 0000000..b57872b
--- /dev/null
+++ b/public/vs/basic-languages/kotlin/kotlin.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/kotlin/kotlin", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(n,e)=>{for(var i in e)o(n,i,{get:e[i],enumerable:!0})},d=(n,e,i,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of r(e))!c.call(n,t)&&t!==i&&o(n,t,{get:()=>e[t],enumerable:!(s=a(e,t))||s.enumerable});return n};var g=n=>d(o({},"__esModule",{value:!0}),n);var f={};l(f,{conf:()=>m,language:()=>p});var m={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:<editor-fold\\b))"),end:new RegExp("^\\s*//\\s*(?:(?:#?endregion\\b)|(?:</editor-fold>))")}}},p={defaultToken:"",tokenPostfix:".kt",keywords:["as","as?","break","class","continue","do","else","false","for","fun","if","in","!in","interface","is","!is","null","object","package","return","super","this","throw","true","try","typealias","val","var","when","while","by","catch","constructor","delegate","dynamic","field","file","finally","get","import","init","param","property","receiver","set","setparam","where","actual","abstract","annotation","companion","const","crossinline","data","enum","expect","external","final","infix","inline","inner","internal","lateinit","noinline","open","operator","out","override","private","protected","public","reified","sealed","suspend","tailrec","vararg","field","it"],operators:["+","-","*","/","%","=","+=","-=","*=","/=","%=","++","--","&&","||","!","==","!=","===","!==",">","<","<=",">=","[","]","!!","?.","?:","::","..",":","?","->","@",";","$","_"],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,digits:/\d+(_+\d+)*/,octaldigits:/[0-7]+(_+[0-7]+)*/,binarydigits:/[0-1]+(_+[0-1]+)*/,hexdigits:/[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,tokenizer:{root:[[/[A-Z][\w\$]*/,"type.identifier"],[/[a-zA-Z_$][\w$]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/0[xX](@hexdigits)[Ll]?/,"number.hex"],[/0(@octaldigits)[Ll]?/,"number.octal"],[/0[bB](@binarydigits)[Ll]?/,"number.binary"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"""/,"string","@multistring"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@javadoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],javadoc:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc","@push"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],multistring:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"""/,"string","@pop"],[/./,"string"]]}};return g(f);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/less/less.js b/public/vs/basic-languages/less/less.js
new file mode 100644
index 0000000..47d0404
--- /dev/null
+++ b/public/vs/basic-languages/less/less.js
@@ -0,0 +1,11 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/less/less", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var d=(t,e)=>{for(var i in e)r(t,i,{get:e[i],enumerable:!0})},u=(t,e,i,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!l.call(t,n)&&n!==i&&r(t,n,{get:()=>e[n],enumerable:!(o=s(e,n))||o.enumerable});return t};var c=t=>u(r({},"__esModule",{value:!0}),t);var p={};d(p,{conf:()=>m,language:()=>g});var m={wordPattern:/(#?-?\d*\.\d\w*%?)|([@#!.:]?[\w-?]+%?)|[@#!.]/g,comments:{blockComment:["/*","*/"],lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/"),end:new RegExp("^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/")}}},g={defaultToken:"",tokenPostfix:".less",identifier:"-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",identifierPlus:"-?-?([a-zA-Z:.]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-:.]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{root:[{include:"@nestedJSBegin"},["[ \\t\\r\\n]+",""],{include:"@comments"},{include:"@keyword"},{include:"@strings"},{include:"@numbers"},["[*_]?[a-zA-Z\\-\\s]+(?=:.*(;|(\\\\$)))","attribute.name","@attribute"],["url(\\-prefix)?\\(",{token:"tag",next:"@urldeclaration"}],["[{}()\\[\\]]","@brackets"],["[,:;]","delimiter"],["#@identifierPlus","tag.id"],["&","tag"],["\\.@identifierPlus(?=\\()","tag.class","@attribute"],["\\.@identifierPlus","tag.class"],["@identifierPlus","tag"],{include:"@operators"},["@(@identifier(?=[:,\\)]))","variable","@attribute"],["@(@identifier)","variable"],["@","key","@atRules"]],nestedJSBegin:[["``","delimiter.backtick"],["`",{token:"delimiter.backtick",next:"@nestedJSEnd",nextEmbedded:"text/javascript"}]],nestedJSEnd:[["`",{token:"delimiter.backtick",next:"@pop",nextEmbedded:"@pop"}]],operators:[["[<>=\\+\\-\\*\\/\\^\\|\\~]","operator"]],keyword:[["(@[\\s]*import|![\\s]*important|true|false|when|iscolor|isnumber|isstring|iskeyword|isurl|ispixel|ispercentage|isem|hue|saturation|lightness|alpha|lighten|darken|saturate|desaturate|fadein|fadeout|fade|spin|mix|round|ceil|floor|percentage)\\b","keyword"]],urldeclaration:[{include:"@strings"},[`[^)\r
+]+`,"string"],["\\)",{token:"tag",next:"@pop"}]],attribute:[{include:"@nestedJSBegin"},{include:"@comments"},{include:"@strings"},{include:"@numbers"},{include:"@keyword"},["[a-zA-Z\\-]+(?=\\()","attribute.value","@attribute"],[">","operator","@pop"],["@identifier","attribute.value"],{include:"@operators"},["@(@identifier)","variable"],["[)\\}]","@brackets","@pop"],["[{}()\\[\\]>]","@brackets"],["[;]","delimiter","@pop"],["[,=:]","delimiter"],["\\s",""],[".","attribute.value"]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],numbers:[["(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"attribute.value.number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","attribute.value.hex"]],units:[["(em|ex|ch|rem|fr|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","attribute.value.unit","@pop"]],strings:[['~?"',{token:"string.delimiter",next:"@stringsEndDoubleQuote"}],["~?'",{token:"string.delimiter",next:"@stringsEndQuote"}]],stringsEndDoubleQuote:[['\\\\"',"string"],['"',{token:"string.delimiter",next:"@popall"}],[".","string"]],stringsEndQuote:[["\\\\'","string"],["'",{token:"string.delimiter",next:"@popall"}],[".","string"]],atRules:[{include:"@comments"},{include:"@strings"},["[()]","delimiter"],["[\\{;]","delimiter","@pop"],[".","key"]]}};return c(p);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/lexon/lexon.js b/public/vs/basic-languages/lexon/lexon.js
new file mode 100644
index 0000000..18236c6
--- /dev/null
+++ b/public/vs/basic-languages/lexon/lexon.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/lexon/lexon", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var n=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var i in e)n(t,i,{get:e[i],enumerable:!0})},p=(t,e,i,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of d(e))!a.call(t,o)&&o!==i&&n(t,o,{get:()=>e[o],enumerable:!(r=s(e,o))||r.enumerable});return t};var c=t=>p(n({},"__esModule",{value:!0}),t);var k={};l(k,{conf:()=>m,language:()=>u});var m={comments:{lineComment:"COMMENT"},brackets:[["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:":",close:"."}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"`",close:"`"},{open:'"',close:'"'},{open:"'",close:"'"},{open:":",close:"."}],folding:{markers:{start:new RegExp("^\\s*(::\\s*|COMMENT\\s+)#region"),end:new RegExp("^\\s*(::\\s*|COMMENT\\s+)#endregion")}}},u={tokenPostfix:".lexon",ignoreCase:!0,keywords:["lexon","lex","clause","terms","contracts","may","pay","pays","appoints","into","to"],typeKeywords:["amount","person","key","time","date","asset","text"],operators:["less","greater","equal","le","gt","or","and","add","added","subtract","subtracted","multiply","multiplied","times","divide","divided","is","be","certified"],symbols:/[=><!~?:&|+\-*\/\^%]+/,tokenizer:{root:[[/^(\s*)(comment:?(?:\s.*|))$/,["","comment"]],[/"/,{token:"identifier.quote",bracket:"@open",next:"@quoted_identifier"}],["LEX$",{token:"keyword",bracket:"@open",next:"@identifier_until_period"}],["LEXON",{token:"keyword",bracket:"@open",next:"@semver"}],[":",{token:"delimiter",bracket:"@open",next:"@identifier_until_period"}],[/[a-z_$][\w$]*/,{cases:{"@operators":"operator","@typeKeywords":"keyword.type","@keywords":"keyword","@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,"delimiter"],[/\d*\.\d*\.\d*/,"number.semver"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"]],quoted_identifier:[[/[^\\"]+/,"identifier"],[/"/,{token:"identifier.quote",bracket:"@close",next:"@pop"}]],space_identifier_until_period:[[":","delimiter"],[" ",{token:"white",next:"@identifier_rest"}]],identifier_until_period:[{include:"@whitespace"},[":",{token:"delimiter",next:"@identifier_rest"}],[/[^\\.]+/,"identifier"],[/\./,{token:"delimiter",bracket:"@close",next:"@pop"}]],identifier_rest:[[/[^\\.]+/,"identifier"],[/\./,{token:"delimiter",bracket:"@close",next:"@pop"}]],semver:[{include:"@whitespace"},[":","delimiter"],[/\d*\.\d*\.\d*/,{token:"number.semver",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"]]}};return c(k);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/liquid/liquid.js b/public/vs/basic-languages/liquid/liquid.js
new file mode 100644
index 0000000..dfdf6af
--- /dev/null
+++ b/public/vs/basic-languages/liquid/liquid.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/liquid/liquid", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var p=Object.create;var a=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var h=Object.getPrototypeOf,q=Object.prototype.hasOwnProperty;var f=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,i)=>(typeof require<"u"?require:t)[i]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var b=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),T=(e,t)=>{for(var i in t)a(e,i,{get:t[i],enumerable:!0})},r=(e,t,i,l)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of w(t))!q.call(e,o)&&o!==i&&a(e,o,{get:()=>t[o],enumerable:!(l=g(t,o))||l.enumerable});return e},d=(e,t,i)=>(r(e,t,"default"),i&&r(i,t,"default")),s=(e,t,i)=>(i=e!=null?p(h(e)):{},r(t||!e||!e.__esModule?a(i,"default",{value:e,enumerable:!0}):i,e)),k=e=>r(a({},"__esModule",{value:!0}),e);var c=b((y,u)=>{var _=s(f("vs/editor/editor.api"));u.exports=_});var $={};T($,{conf:()=>x,language:()=>S});var n={};d(n,s(c()));var m=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"],x={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,brackets:[["<!--","-->"],["<",">"],["{{","}}"],["{%","%}"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"%",close:"%"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"<",close:">"},{open:'"',close:'"'},{open:"'",close:"'"}],onEnterRules:[{beforeText:new RegExp(`<(?!(?:${m.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:n.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp(`<(?!(?:${m.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),action:{indentAction:n.languages.IndentAction.Indent}}]},S={defaultToken:"",tokenPostfix:"",builtinTags:["if","else","elseif","endif","render","assign","capture","endcapture","case","endcase","comment","endcomment","cycle","decrement","for","endfor","include","increment","layout","raw","endraw","render","tablerow","endtablerow","unless","endunless"],builtinFilters:["abs","append","at_least","at_most","capitalize","ceil","compact","date","default","divided_by","downcase","escape","escape_once","first","floor","join","json","last","lstrip","map","minus","modulo","newline_to_br","plus","prepend","remove","remove_first","replace","replace_first","reverse","round","rstrip","size","slice","sort","sort_natural","split","strip","strip_html","strip_newlines","times","truncate","truncatewords","uniq","upcase","url_decode","url_encode","where"],constants:["true","false"],operators:["==","!=",">","<",">=","<="],symbol:/[=><!]+/,identifier:/[a-zA-Z_][\w]*/,tokenizer:{root:[[/\{\%\s*comment\s*\%\}/,"comment.start.liquid","@comment"],[/\{\{/,{token:"@rematch",switchTo:"@liquidState.root"}],[/\{\%/,{token:"@rematch",switchTo:"@liquidState.root"}],[/(<)([\w\-]+)(\/>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)([:\w]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)([\w\-]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/</,"delimiter.html"],[/\{/,"delimiter.html"],[/[^<{]+/]],comment:[[/\{\%\s*endcomment\s*\%\}/,"comment.end.liquid","@pop"],[/./,"comment.content.liquid"]],otherTag:[[/\{\{/,{token:"@rematch",switchTo:"@liquidState.otherTag"}],[/\{\%/,{token:"@rematch",switchTo:"@liquidState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],liquidState:[[/\{\{/,"delimiter.output.liquid"],[/\}\}/,{token:"delimiter.output.liquid",switchTo:"@$S2.$S3"}],[/\{\%/,"delimiter.tag.liquid"],[/raw\s*\%\}/,"delimiter.tag.liquid","@liquidRaw"],[/\%\}/,{token:"delimiter.tag.liquid",switchTo:"@$S2.$S3"}],{include:"liquidRoot"}],liquidRaw:[[/^(?!\{\%\s*endraw\s*\%\}).+/],[/\{\%/,"delimiter.tag.liquid"],[/@identifier/],[/\%\}/,{token:"delimiter.tag.liquid",next:"@root"}]],liquidRoot:[[/\d+(\.\d+)?/,"number.liquid"],[/"[^"]*"/,"string.liquid"],[/'[^']*'/,"string.liquid"],[/\s+/],[/@symbol/,{cases:{"@operators":"operator.liquid","@default":""}}],[/\./],[/@identifier/,{cases:{"@constants":"keyword.liquid","@builtinFilters":"predefined.liquid","@builtinTags":"predefined.liquid","@default":"variable.liquid"}}],[/[^}|%]/,"variable.liquid"]]}};return k($);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/lua/lua.js b/public/vs/basic-languages/lua/lua.js
new file mode 100644
index 0000000..657ca73
--- /dev/null
+++ b/public/vs/basic-languages/lua/lua.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/lua/lua", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var t in e)s(o,t,{get:e[t],enumerable:!0})},m=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of i(e))!l.call(o,n)&&n!==t&&s(o,n,{get:()=>e[n],enumerable:!(r=a(e,n))||r.enumerable});return o};var p=o=>m(s({},"__esModule",{value:!0}),o);var u={};c(u,{conf:()=>d,language:()=>g});var d={comments:{lineComment:"--",blockComment:["--[[","]]"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},g={defaultToken:"",tokenPostfix:".lua",keywords:["and","break","do","else","elseif","end","false","for","function","goto","if","in","local","nil","not","or","repeat","return","then","true","until","while"],brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],operators:["+","-","*","/","%","^","#","==","~=","<=",">=","<",">","=",";",":",",",".","..","..."],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/[a-zA-Z_]\w*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/(,)(\s*)([a-zA-Z_]\w*)(\s*)(:)(?!:)/,["delimiter","","key","","delimiter"]],[/({)(\s*)([a-zA-Z_]\w*)(\s*)(:)(?!:)/,["@brackets","","key","","delimiter"]],[/[{}()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F_]*[0-9a-fA-F]/,"number.hex"],[/\d+?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],whitespace:[[/[ \t\r\n]+/,""],[/--\[([=]*)\[/,"comment","@comment.$1"],[/--.*$/,"comment"]],comment:[[/[^\]]+/,"comment"],[/\]([=]*)\]/,{cases:{"$1==$S2":{token:"comment",next:"@pop"},"@default":"comment"}}],[/./,"comment"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}};return p(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/m3/m3.js b/public/vs/basic-languages/m3/m3.js
new file mode 100644
index 0000000..d5fd350
--- /dev/null
+++ b/public/vs/basic-languages/m3/m3.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/m3/m3", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var R=(o,e)=>{for(var s in e)r(o,s,{get:e[s],enumerable:!0})},c=(o,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of a(e))!i.call(o,t)&&t!==s&&r(o,t,{get:()=>e[t],enumerable:!(n=E(e,t))||n.enumerable});return o};var m=o=>c(r({},"__esModule",{value:!0}),o);var N={};R(N,{conf:()=>A,language:()=>p});var A={comments:{blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"(*",close:"*)"},{open:"<*",close:"*>"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}]},p={defaultToken:"",tokenPostfix:".m3",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["AND","ANY","ARRAY","AS","BEGIN","BITS","BRANDED","BY","CASE","CONST","DIV","DO","ELSE","ELSIF","END","EVAL","EXCEPT","EXCEPTION","EXIT","EXPORTS","FINALLY","FOR","FROM","GENERIC","IF","IMPORT","IN","INTERFACE","LOCK","LOOP","METHODS","MOD","MODULE","NOT","OBJECT","OF","OR","OVERRIDES","PROCEDURE","RAISE","RAISES","READONLY","RECORD","REF","REPEAT","RETURN","REVEAL","SET","THEN","TO","TRY","TYPE","TYPECASE","UNSAFE","UNTIL","UNTRACED","VALUE","VAR","WHILE","WITH"],reservedConstNames:["ABS","ADR","ADRSIZE","BITSIZE","BYTESIZE","CEILING","DEC","DISPOSE","FALSE","FIRST","FLOAT","FLOOR","INC","ISTYPE","LAST","LOOPHOLE","MAX","MIN","NARROW","NEW","NIL","NUMBER","ORD","ROUND","SUBARRAY","TRUE","TRUNC","TYPECODE","VAL"],reservedTypeNames:["ADDRESS","ANY","BOOLEAN","CARDINAL","CHAR","EXTENDED","INTEGER","LONGCARD","LONGINT","LONGREAL","MUTEX","NULL","REAL","REFANY","ROOT","TEXT"],operators:["+","-","*","/","&","^","."],relations:["=","#","<","<=",">",">=","<:",":"],delimiters:["|","..","=>",",",";",":="],symbols:/[>=<#.,:;+\-*/&^]+/,escapes:/\\(?:[\\fnrt"']|[0-7]{3})/,tokenizer:{root:[[/_\w*/,"invalid"],[/[a-zA-Z][a-zA-Z0-9_]*/,{cases:{"@keywords":{token:"keyword.$0"},"@reservedConstNames":{token:"constant.reserved.$0"},"@reservedTypeNames":{token:"type.reserved.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[0-9]+\.[0-9]+(?:[DdEeXx][\+\-]?[0-9]+)?/,"number.float"],[/[0-9]+(?:\_[0-9a-fA-F]+)?L?/,"number"],[/@symbols/,{cases:{"@operators":"operators","@relations":"operators","@delimiters":"delimiter","@default":"invalid"}}],[/'[^\\']'/,"string.char"],[/(')(@escapes)(')/,["string.char","string.escape","string.char"]],[/'/,"invalid"],[/"([^"\\]|\\.)*$/,"invalid"],[/"/,"string.text","@text"]],text:[[/[^\\"]+/,"string.text"],[/@escapes/,"string.escape"],[/\\./,"invalid"],[/"/,"string.text","@pop"]],comment:[[/\(\*/,"comment","@push"],[/\*\)/,"comment","@pop"],[/./,"comment"]],pragma:[[/<\*/,"keyword.pragma","@push"],[/\*>/,"keyword.pragma","@pop"],[/./,"keyword.pragma"]],whitespace:[[/[ \t\r\n]+/,"white"],[/\(\*/,"comment","@comment"],[/<\*/,"keyword.pragma","@pragma"]]}};return m(N);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/markdown/markdown.js b/public/vs/basic-languages/markdown/markdown.js
new file mode 100644
index 0000000..e99b852
--- /dev/null
+++ b/public/vs/basic-languages/markdown/markdown.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/markdown/markdown", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var o in e)s(t,o,{get:e[o],enumerable:!0})},m=(t,e,o,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of c(e))!i.call(t,n)&&n!==o&&s(t,n,{get:()=>e[n],enumerable:!(a=r(e,n))||a.enumerable});return t};var d=t=>m(s({},"__esModule",{value:!0}),t);var b={};l(b,{conf:()=>p,language:()=>g});var p={comments:{blockComment:["<!--","-->"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">",notIn:["string"]}],surroundingPairs:[{open:"(",close:")"},{open:"[",close:"]"},{open:"`",close:"`"}],folding:{markers:{start:new RegExp("^\\s*<!--\\s*#?region\\b.*-->"),end:new RegExp("^\\s*<!--\\s*#?endregion\\b.*-->")}}},g={defaultToken:"",tokenPostfix:".md",control:/[\\`*_\[\]{}()#+\-\.!]/,noncontrol:/[^\\`*_\[\]{}()#+\-\.!]/,escapes:/\\(?:@control)/,jsescapes:/\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/,empty:["area","base","basefont","br","col","frame","hr","img","input","isindex","link","meta","param"],tokenizer:{root:[[/^\s*\|/,"@rematch","@table_header"],[/^(\s{0,3})(#+)((?:[^\\#]|@escapes)+)((?:#+)?)/,["white","keyword","keyword","keyword"]],[/^\s*(=+|\-+)\s*$/,"keyword"],[/^\s*((\*[ ]?)+)\s*$/,"meta.separator"],[/^\s*>+/,"comment"],[/^\s*([\*\-+:]|\d+\.)\s/,"keyword"],[/^(\t|[ ]{4})[^ ].*$/,"string"],[/^\s*~~~\s*((?:\w|[\/\-#])+)?\s*$/,{token:"string",next:"@codeblock"}],[/^\s*```\s*((?:\w|[\/\-#])+).*$/,{token:"string",next:"@codeblockgh",nextEmbedded:"$1"}],[/^\s*```\s*$/,{token:"string",next:"@codeblock"}],{include:"@linecontent"}],table_header:[{include:"@table_common"},[/[^\|]+/,"keyword.table.header"]],table_body:[{include:"@table_common"},{include:"@linecontent"}],table_common:[[/\s*[\-:]+\s*/,{token:"keyword",switchTo:"table_body"}],[/^\s*\|/,"keyword.table.left"],[/^\s*[^\|]/,"@rematch","@pop"],[/^\s*$/,"@rematch","@pop"],[/\|/,{cases:{"@eos":"keyword.table.right","@default":"keyword.table.middle"}}]],codeblock:[[/^\s*~~~\s*$/,{token:"string",next:"@pop"}],[/^\s*```\s*$/,{token:"string",next:"@pop"}],[/.*$/,"variable.source"]],codeblockgh:[[/```\s*$/,{token:"string",next:"@pop",nextEmbedded:"@pop"}],[/[^`]+/,"variable.source"]],linecontent:[[/&\w+;/,"string.escape"],[/@escapes/,"escape"],[/\b__([^\\_]|@escapes|_(?!_))+__\b/,"strong"],[/\*\*([^\\*]|@escapes|\*(?!\*))+\*\*/,"strong"],[/\b_[^_]+_\b/,"emphasis"],[/\*([^\\*]|@escapes)+\*/,"emphasis"],[/`([^\\`]|@escapes)+`/,"variable"],[/\{+[^}]+\}+/,"string.target"],[/(!?\[)((?:[^\]\\]|@escapes)*)(\]\([^\)]+\))/,["string.link","","string.link"]],[/(!?\[)((?:[^\]\\]|@escapes)*)(\])/,"string.link"],{include:"html"}],html:[[/<(\w+)\/>/,"tag"],[/<(\w+)(\-|\w)*/,{cases:{"@empty":{token:"tag",next:"@tag.$1"},"@default":{token:"tag",next:"@tag.$1"}}}],[/<\/(\w+)(\-|\w)*\s*>/,{token:"tag"}],[/<!--/,"comment","@comment"]],comment:[[/[^<\-]+/,"comment.content"],[/-->/,"comment","@pop"],[/<!--/,"comment.content.invalid"],[/[<\-]/,"comment.content"]],tag:[[/[ \t\r\n]+/,"white"],[/(type)(\s*=\s*)(")([^"]+)(")/,["attribute.name.html","delimiter.html","string.html",{token:"string.html",switchTo:"@tag.$S2.$4"},"string.html"]],[/(type)(\s*=\s*)(')([^']+)(')/,["attribute.name.html","delimiter.html","string.html",{token:"string.html",switchTo:"@tag.$S2.$4"},"string.html"]],[/(\w+)(\s*=\s*)("[^"]*"|'[^']*')/,["attribute.name.html","delimiter.html","string.html"]],[/\w+/,"attribute.name.html"],[/\/>/,"tag","@pop"],[/>/,{cases:{"$S2==style":{token:"tag",switchTo:"embeddedStyle",nextEmbedded:"text/css"},"$S2==script":{cases:{$S3:{token:"tag",switchTo:"embeddedScript",nextEmbedded:"$S3"},"@default":{token:"tag",switchTo:"embeddedScript",nextEmbedded:"text/javascript"}}},"@default":{token:"tag",next:"@pop"}}}]],embeddedStyle:[[/[^<]+/,""],[/<\/style\s*>/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/</,""]],embeddedScript:[[/[^<]+/,""],[/<\/script\s*>/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/</,""]]}};return d(b);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/mdx/mdx.js b/public/vs/basic-languages/mdx/mdx.js
new file mode 100644
index 0000000..a1d65a5
--- /dev/null
+++ b/public/vs/basic-languages/mdx/mdx.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/mdx/mdx", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var x=Object.create;var r=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var b=Object.getPrototypeOf,g=Object.prototype.hasOwnProperty;var h=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var f=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),u=(e,t)=>{for(var n in t)r(e,n,{get:t[n],enumerable:!0})},s=(e,t,n,d)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of l(t))!g.call(e,i)&&i!==n&&r(e,i,{get:()=>t[i],enumerable:!(d=m(t,i))||d.enumerable});return e},c=(e,t,n)=>(s(e,t,"default"),n&&s(n,t,"default")),p=(e,t,n)=>(n=e!=null?x(b(e)):{},s(t||!e||!e.__esModule?r(n,"default",{value:e,enumerable:!0}):n,e)),w=e=>s(r({},"__esModule",{value:!0}),e);var k=f((T,a)=>{var $=p(h("vs/editor/editor.api"));a.exports=$});var A={};u(A,{conf:()=>_,language:()=>y});var o={};c(o,p(k()));var _={comments:{blockComment:["{/*","*/}"]},brackets:[["{","}"]],autoClosingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"\u201C",close:"\u201D"},{open:"\u2018",close:"\u2019"},{open:"`",close:"`"},{open:"{",close:"}"},{open:"(",close:")"},{open:"_",close:"_"},{open:"**",close:"**"},{open:"<",close:">"}],onEnterRules:[{beforeText:/^\s*- .+/,action:{indentAction:o.languages.IndentAction.None,appendText:"- "}},{beforeText:/^\s*\+ .+/,action:{indentAction:o.languages.IndentAction.None,appendText:"+ "}},{beforeText:/^\s*\* .+/,action:{indentAction:o.languages.IndentAction.None,appendText:"* "}},{beforeText:/^> /,action:{indentAction:o.languages.IndentAction.None,appendText:"> "}},{beforeText:/<\w+/,action:{indentAction:o.languages.IndentAction.Indent}},{beforeText:/\s+>\s*$/,action:{indentAction:o.languages.IndentAction.Indent}},{beforeText:/<\/\w+>/,action:{indentAction:o.languages.IndentAction.Outdent}},...Array.from({length:100},(e,t)=>({beforeText:new RegExp(`^${t}\\. .+`),action:{indentAction:o.languages.IndentAction.None,appendText:`${t+1}. `}}))]},y={defaultToken:"",tokenPostfix:".mdx",control:/[!#()*+.[\\\]_`{}\-]/,escapes:/\\@control/,tokenizer:{root:[[/^---$/,{token:"meta.content",next:"@frontmatter",nextEmbedded:"yaml"}],[/^\s*import/,{token:"keyword",next:"@import",nextEmbedded:"js"}],[/^\s*export/,{token:"keyword",next:"@export",nextEmbedded:"js"}],[/<\w+/,{token:"type.identifier",next:"@jsx"}],[/<\/?\w+>/,"type.identifier"],[/^(\s*)(>*\s*)(#{1,6}\s)/,[{token:"white"},{token:"comment"},{token:"keyword",next:"@header"}]],[/^(\s*)(>*\s*)([*+-])(\s+)/,["white","comment","keyword","white"]],[/^(\s*)(>*\s*)(\d{1,9}\.)(\s+)/,["white","comment","number","white"]],[/^(\s*)(>*\s*)(\d{1,9}\.)(\s+)/,["white","comment","number","white"]],[/^(\s*)(>*\s*)(-{3,}|\*{3,}|_{3,})$/,["white","comment","keyword"]],[/`{3,}(\s.*)?$/,{token:"string",next:"@codeblock_backtick"}],[/~{3,}(\s.*)?$/,{token:"string",next:"@codeblock_tilde"}],[/`{3,}(\S+).*$/,{token:"string",next:"@codeblock_highlight_backtick",nextEmbedded:"$1"}],[/~{3,}(\S+).*$/,{token:"string",next:"@codeblock_highlight_tilde",nextEmbedded:"$1"}],[/^(\s*)(-{4,})$/,["white","comment"]],[/^(\s*)(>+)/,["white","comment"]],{include:"content"}],content:[[/(\[)(.+)(]\()(.+)(\s+".*")(\))/,["","string.link","","type.identifier","string.link",""]],[/(\[)(.+)(]\()(.+)(\))/,["","type.identifier","","string.link",""]],[/(\[)(.+)(]\[)(.+)(])/,["","type.identifier","","type.identifier",""]],[/(\[)(.+)(]:\s+)(\S*)/,["","type.identifier","","string.link"]],[/(\[)(.+)(])/,["","type.identifier",""]],[/`.*`/,"variable.source"],[/_/,{token:"emphasis",next:"@emphasis_underscore"}],[/\*(?!\*)/,{token:"emphasis",next:"@emphasis_asterisk"}],[/\*\*/,{token:"strong",next:"@strong"}],[/{/,{token:"delimiter.bracket",next:"@expression",nextEmbedded:"js"}]],import:[[/'\s*(;|$)/,{token:"string",next:"@pop",nextEmbedded:"@pop"}]],expression:[[/{/,{token:"delimiter.bracket",next:"@expression"}],[/}/,{token:"delimiter.bracket",next:"@pop",nextEmbedded:"@pop"}]],export:[[/^\s*$/,{token:"delimiter.bracket",next:"@pop",nextEmbedded:"@pop"}]],jsx:[[/\s+/,""],[/(\w+)(=)("(?:[^"\\]|\\.)*")/,["attribute.name","operator","string"]],[/(\w+)(=)('(?:[^'\\]|\\.)*')/,["attribute.name","operator","string"]],[/(\w+(?=\s|>|={|$))/,["attribute.name"]],[/={/,{token:"delimiter.bracket",next:"@expression",nextEmbedded:"js"}],[/>/,{token:"type.identifier",next:"@pop"}]],header:[[/.$/,{token:"keyword",next:"@pop"}],{include:"content"},[/./,{token:"keyword"}]],strong:[[/\*\*/,{token:"strong",next:"@pop"}],{include:"content"},[/./,{token:"strong"}]],emphasis_underscore:[[/_/,{token:"emphasis",next:"@pop"}],{include:"content"},[/./,{token:"emphasis"}]],emphasis_asterisk:[[/\*(?!\*)/,{token:"emphasis",next:"@pop"}],{include:"content"},[/./,{token:"emphasis"}]],frontmatter:[[/^---$/,{token:"meta.content",nextEmbedded:"@pop",next:"@pop"}]],codeblock_highlight_backtick:[[/\s*`{3,}\s*$/,{token:"string",next:"@pop",nextEmbedded:"@pop"}],[/.*$/,"variable.source"]],codeblock_highlight_tilde:[[/\s*~{3,}\s*$/,{token:"string",next:"@pop",nextEmbedded:"@pop"}],[/.*$/,"variable.source"]],codeblock_backtick:[[/\s*`{3,}\s*$/,{token:"string",next:"@pop"}],[/.*$/,"variable.source"]],codeblock_tilde:[[/\s*~{3,}\s*$/,{token:"string",next:"@pop"}],[/.*$/,"variable.source"]]}};return w(A);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/mips/mips.js b/public/vs/basic-languages/mips/mips.js
new file mode 100644
index 0000000..64fbfbc
--- /dev/null
+++ b/public/vs/basic-languages/mips/mips.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/mips/mips", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var n in e)s(t,n,{get:e[n],enumerable:!0})},d=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of o(e))!g.call(t,r)&&r!==n&&s(t,r,{get:()=>e[r],enumerable:!(i=a(e,r))||i.enumerable});return t};var m=t=>d(s({},"__esModule",{value:!0}),t);var x={};l(x,{conf:()=>p,language:()=>u});var p={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#%\^\&\*\(\)\=\$\-\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{blockComment:["###","###"],lineComment:"#"},folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},u={defaultToken:"",ignoreCase:!1,tokenPostfix:".mips",regEx:/\/(?!\/\/)(?:[^\/\\]|\\.)*\/[igm]*/,keywords:[".data",".text","syscall","trap","add","addu","addi","addiu","and","andi","div","divu","mult","multu","nor","or","ori","sll","slv","sra","srav","srl","srlv","sub","subu","xor","xori","lhi","lho","lhi","llo","slt","slti","sltu","sltiu","beq","bgtz","blez","bne","j","jal","jalr","jr","lb","lbu","lh","lhu","lw","li","la","sb","sh","sw","mfhi","mflo","mthi","mtlo","move"],symbols:/[\.,\:]+/,escapes:/\\(?:[abfnrtv\\"'$]|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/\$[a-zA-Z_]\w*/,"variable.predefined"],[/[.a-zA-Z_]\w*/,{cases:{this:"variable.predefined","@keywords":{token:"keyword.$0"},"@default":""}}],[/[ \t\r\n]+/,""],[/#.*$/,"comment"],["///",{token:"regexp",next:"@hereregexp"}],[/^(\s*)(@regEx)/,["","regexp"]],[/(\,)(\s*)(@regEx)/,["delimiter","","regexp"]],[/(\:)(\s*)(@regEx)/,["delimiter","","regexp"]],[/@symbols/,"delimiter"],[/\d+[eE]([\-+]?\d+)?/,"number.float"],[/\d+\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/0[0-7]+(?!\d)/,"number.octal"],[/\d+/,"number"],[/[,.]/,"delimiter"],[/"""/,"string",'@herestring."""'],[/'''/,"string","@herestring.'''"],[/"/,{cases:{"@eos":"string","@default":{token:"string",next:'@string."'}}}],[/'/,{cases:{"@eos":"string","@default":{token:"string",next:"@string.'"}}}]],string:[[/[^"'\#\\]+/,"string"],[/@escapes/,"string.escape"],[/\./,"string.escape.invalid"],[/\./,"string.escape.invalid"],[/#{/,{cases:{'$S2=="':{token:"string",next:"root.interpolatedstring"},"@default":"string"}}],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}],[/#/,"string"]],herestring:[[/("""|''')/,{cases:{"$1==$S2":{token:"string",next:"@pop"},"@default":"string"}}],[/[^#\\'"]+/,"string"],[/['"]+/,"string"],[/@escapes/,"string.escape"],[/\./,"string.escape.invalid"],[/#{/,{token:"string.quote",next:"root.interpolatedstring"}],[/#/,"string"]],comment:[[/[^#]+/,"comment"],[/#/,"comment"]],hereregexp:[[/[^\\\/#]+/,"regexp"],[/\\./,"regexp"],[/#.*$/,"comment"],["///[igm]*",{token:"regexp",next:"@pop"}],[/\//,"regexp"]]}};return m(x);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/msdax/msdax.js b/public/vs/basic-languages/msdax/msdax.js
new file mode 100644
index 0000000..f6564ff
--- /dev/null
+++ b/public/vs/basic-languages/msdax/msdax.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/msdax/msdax", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var e=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var n=(T,E)=>{for(var N in E)e(T,N,{get:E[N],enumerable:!0})},t=(T,E,N,R)=>{if(E&&typeof E=="object"||typeof E=="function")for(let A of O(E))!S.call(T,A)&&A!==N&&e(T,A,{get:()=>E[A],enumerable:!(R=I(E,A))||R.enumerable});return T};var L=T=>t(e({},"__esModule",{value:!0}),T);var D={};n(D,{conf:()=>C,language:()=>o});var C={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["[","]"],["(",")"],["{","}"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]}]},o={defaultToken:"",tokenPostfix:".msdax",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"{",close:"}",token:"delimiter.brackets"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["VAR","RETURN","NOT","EVALUATE","DATATABLE","ORDER","BY","START","AT","DEFINE","MEASURE","ASC","DESC","IN","BOOLEAN","DOUBLE","INTEGER","DATETIME","CURRENCY","STRING"],functions:["CLOSINGBALANCEMONTH","CLOSINGBALANCEQUARTER","CLOSINGBALANCEYEAR","DATEADD","DATESBETWEEN","DATESINPERIOD","DATESMTD","DATESQTD","DATESYTD","ENDOFMONTH","ENDOFQUARTER","ENDOFYEAR","FIRSTDATE","FIRSTNONBLANK","LASTDATE","LASTNONBLANK","NEXTDAY","NEXTMONTH","NEXTQUARTER","NEXTYEAR","OPENINGBALANCEMONTH","OPENINGBALANCEQUARTER","OPENINGBALANCEYEAR","PARALLELPERIOD","PREVIOUSDAY","PREVIOUSMONTH","PREVIOUSQUARTER","PREVIOUSYEAR","SAMEPERIODLASTYEAR","STARTOFMONTH","STARTOFQUARTER","STARTOFYEAR","TOTALMTD","TOTALQTD","TOTALYTD","ADDCOLUMNS","ADDMISSINGITEMS","ALL","ALLEXCEPT","ALLNOBLANKROW","ALLSELECTED","CALCULATE","CALCULATETABLE","CALENDAR","CALENDARAUTO","CROSSFILTER","CROSSJOIN","CURRENTGROUP","DATATABLE","DETAILROWS","DISTINCT","EARLIER","EARLIEST","EXCEPT","FILTER","FILTERS","GENERATE","GENERATEALL","GROUPBY","IGNORE","INTERSECT","ISONORAFTER","KEEPFILTERS","LOOKUPVALUE","NATURALINNERJOIN","NATURALLEFTOUTERJOIN","RELATED","RELATEDTABLE","ROLLUP","ROLLUPADDISSUBTOTAL","ROLLUPGROUP","ROLLUPISSUBTOTAL","ROW","SAMPLE","SELECTCOLUMNS","SUBSTITUTEWITHINDEX","SUMMARIZE","SUMMARIZECOLUMNS","TOPN","TREATAS","UNION","USERELATIONSHIP","VALUES","SUM","SUMX","PATH","PATHCONTAINS","PATHITEM","PATHITEMREVERSE","PATHLENGTH","AVERAGE","AVERAGEA","AVERAGEX","COUNT","COUNTA","COUNTAX","COUNTBLANK","COUNTROWS","COUNTX","DISTINCTCOUNT","DIVIDE","GEOMEAN","GEOMEANX","MAX","MAXA","MAXX","MEDIAN","MEDIANX","MIN","MINA","MINX","PERCENTILE.EXC","PERCENTILE.INC","PERCENTILEX.EXC","PERCENTILEX.INC","PRODUCT","PRODUCTX","RANK.EQ","RANKX","STDEV.P","STDEV.S","STDEVX.P","STDEVX.S","VAR.P","VAR.S","VARX.P","VARX.S","XIRR","XNPV","DATE","DATEDIFF","DATEVALUE","DAY","EDATE","EOMONTH","HOUR","MINUTE","MONTH","NOW","SECOND","TIME","TIMEVALUE","TODAY","WEEKDAY","WEEKNUM","YEAR","YEARFRAC","CONTAINS","CONTAINSROW","CUSTOMDATA","ERROR","HASONEFILTER","HASONEVALUE","ISBLANK","ISCROSSFILTERED","ISEMPTY","ISERROR","ISEVEN","ISFILTERED","ISLOGICAL","ISNONTEXT","ISNUMBER","ISODD","ISSUBTOTAL","ISTEXT","USERNAME","USERPRINCIPALNAME","AND","FALSE","IF","IFERROR","NOT","OR","SWITCH","TRUE","ABS","ACOS","ACOSH","ACOT","ACOTH","ASIN","ASINH","ATAN","ATANH","BETA.DIST","BETA.INV","CEILING","CHISQ.DIST","CHISQ.DIST.RT","CHISQ.INV","CHISQ.INV.RT","COMBIN","COMBINA","CONFIDENCE.NORM","CONFIDENCE.T","COS","COSH","COT","COTH","CURRENCY","DEGREES","EVEN","EXP","EXPON.DIST","FACT","FLOOR","GCD","INT","ISO.CEILING","LCM","LN","LOG","LOG10","MOD","MROUND","ODD","PERMUT","PI","POISSON.DIST","POWER","QUOTIENT","RADIANS","RAND","RANDBETWEEN","ROUND","ROUNDDOWN","ROUNDUP","SIGN","SIN","SINH","SQRT","SQRTPI","TAN","TANH","TRUNC","BLANK","CONCATENATE","CONCATENATEX","EXACT","FIND","FIXED","FORMAT","LEFT","LEN","LOWER","MID","REPLACE","REPT","RIGHT","SEARCH","SUBSTITUTE","TRIM","UNICHAR","UNICODE","UPPER","VALUE"],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},[/[;,.]/,"delimiter"],[/[({})]/,"@brackets"],[/[a-z_][a-zA-Z0-9_]*/,{cases:{"@keywords":"keyword","@functions":"keyword","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/\/\/+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/N"/,{token:"string",next:"@string"}],[/"/,{token:"string",next:"@string"}]],string:[[/[^"]+/,"string"],[/""/,"string"],[/"/,{token:"string",next:"@pop"}]],complexIdentifiers:[[/\[/,{token:"identifier.quote",next:"@bracketedIdentifier"}],[/'/,{token:"identifier.quote",next:"@quotedIdentifier"}]],bracketedIdentifier:[[/[^\]]+/,"identifier"],[/]]/,"identifier"],[/]/,{token:"identifier.quote",next:"@pop"}]],quotedIdentifier:[[/[^']+/,"identifier"],[/''/,"identifier"],[/'/,{token:"identifier.quote",next:"@pop"}]]}};return L(D);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/mysql/mysql.js b/public/vs/basic-languages/mysql/mysql.js
new file mode 100644
index 0000000..e2f0297
--- /dev/null
+++ b/public/vs/basic-languages/mysql/mysql.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/mysql/mysql", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var A=Object.defineProperty;var e=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var o=(T,E)=>{for(var R in E)A(T,R,{get:E[R],enumerable:!0})},O=(T,E,R,_)=>{if(E&&typeof E=="object"||typeof E=="function")for(let S of I(E))!N.call(T,S)&&S!==R&&A(T,S,{get:()=>E[S],enumerable:!(_=e(E,S))||_.enumerable});return T};var t=T=>O(A({},"__esModule",{value:!0}),T);var L={};o(L,{conf:()=>n,language:()=>C});var n={comments:{lineComment:"--",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},C={defaultToken:"",tokenPostfix:".sql",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["ACCESSIBLE","ADD","ALL","ALTER","ANALYZE","AND","AS","ASC","ASENSITIVE","BEFORE","BETWEEN","BIGINT","BINARY","BLOB","BOTH","BY","CALL","CASCADE","CASE","CHANGE","CHAR","CHARACTER","CHECK","COLLATE","COLUMN","CONDITION","CONSTRAINT","CONTINUE","CONVERT","CREATE","CROSS","CUBE","CUME_DIST","CURRENT_DATE","CURRENT_TIME","CURRENT_TIMESTAMP","CURRENT_USER","CURSOR","DATABASE","DATABASES","DAY_HOUR","DAY_MICROSECOND","DAY_MINUTE","DAY_SECOND","DEC","DECIMAL","DECLARE","DEFAULT","DELAYED","DELETE","DENSE_RANK","DESC","DESCRIBE","DETERMINISTIC","DISTINCT","DISTINCTROW","DIV","DOUBLE","DROP","DUAL","EACH","ELSE","ELSEIF","EMPTY","ENCLOSED","ESCAPED","EXCEPT","EXISTS","EXIT","EXPLAIN","FALSE","FETCH","FIRST_VALUE","FLOAT","FLOAT4","FLOAT8","FOR","FORCE","FOREIGN","FROM","FULLTEXT","FUNCTION","GENERATED","GET","GRANT","GROUP","GROUPING","GROUPS","HAVING","HIGH_PRIORITY","HOUR_MICROSECOND","HOUR_MINUTE","HOUR_SECOND","IF","IGNORE","IN","INDEX","INFILE","INNER","INOUT","INSENSITIVE","INSERT","INT","INT1","INT2","INT3","INT4","INT8","INTEGER","INTERVAL","INTO","IO_AFTER_GTIDS","IO_BEFORE_GTIDS","IS","ITERATE","JOIN","JSON_TABLE","KEY","KEYS","KILL","LAG","LAST_VALUE","LATERAL","LEAD","LEADING","LEAVE","LEFT","LIKE","LIMIT","LINEAR","LINES","LOAD","LOCALTIME","LOCALTIMESTAMP","LOCK","LONG","LONGBLOB","LONGTEXT","LOOP","LOW_PRIORITY","MASTER_BIND","MASTER_SSL_VERIFY_SERVER_CERT","MATCH","MAXVALUE","MEDIUMBLOB","MEDIUMINT","MEDIUMTEXT","MIDDLEINT","MINUTE_MICROSECOND","MINUTE_SECOND","MOD","MODIFIES","NATURAL","NOT","NO_WRITE_TO_BINLOG","NTH_VALUE","NTILE","NULL","NUMERIC","OF","ON","OPTIMIZE","OPTIMIZER_COSTS","OPTION","OPTIONALLY","OR","ORDER","OUT","OUTER","OUTFILE","OVER","PARTITION","PERCENT_RANK","PRECISION","PRIMARY","PROCEDURE","PURGE","RANGE","RANK","READ","READS","READ_WRITE","REAL","RECURSIVE","REFERENCES","REGEXP","RELEASE","RENAME","REPEAT","REPLACE","REQUIRE","RESIGNAL","RESTRICT","RETURN","REVOKE","RIGHT","RLIKE","ROW","ROWS","ROW_NUMBER","SCHEMA","SCHEMAS","SECOND_MICROSECOND","SELECT","SENSITIVE","SEPARATOR","SET","SHOW","SIGNAL","SMALLINT","SPATIAL","SPECIFIC","SQL","SQLEXCEPTION","SQLSTATE","SQLWARNING","SQL_BIG_RESULT","SQL_CALC_FOUND_ROWS","SQL_SMALL_RESULT","SSL","STARTING","STORED","STRAIGHT_JOIN","SYSTEM","TABLE","TERMINATED","THEN","TINYBLOB","TINYINT","TINYTEXT","TO","TRAILING","TRIGGER","TRUE","UNDO","UNION","UNIQUE","UNLOCK","UNSIGNED","UPDATE","USAGE","USE","USING","UTC_DATE","UTC_TIME","UTC_TIMESTAMP","VALUES","VARBINARY","VARCHAR","VARCHARACTER","VARYING","VIRTUAL","WHEN","WHERE","WHILE","WINDOW","WITH","WRITE","XOR","YEAR_MONTH","ZEROFILL"],operators:["AND","BETWEEN","IN","LIKE","NOT","OR","IS","NULL","INTERSECT","UNION","INNER","JOIN","LEFT","OUTER","RIGHT"],builtinFunctions:["ABS","ACOS","ADDDATE","ADDTIME","AES_DECRYPT","AES_ENCRYPT","ANY_VALUE","Area","AsBinary","AsWKB","ASCII","ASIN","AsText","AsWKT","ASYMMETRIC_DECRYPT","ASYMMETRIC_DERIVE","ASYMMETRIC_ENCRYPT","ASYMMETRIC_SIGN","ASYMMETRIC_VERIFY","ATAN","ATAN2","ATAN","AVG","BENCHMARK","BIN","BIT_AND","BIT_COUNT","BIT_LENGTH","BIT_OR","BIT_XOR","Buffer","CAST","CEIL","CEILING","Centroid","CHAR","CHAR_LENGTH","CHARACTER_LENGTH","CHARSET","COALESCE","COERCIBILITY","COLLATION","COMPRESS","CONCAT","CONCAT_WS","CONNECTION_ID","Contains","CONV","CONVERT","CONVERT_TZ","ConvexHull","COS","COT","COUNT","CRC32","CREATE_ASYMMETRIC_PRIV_KEY","CREATE_ASYMMETRIC_PUB_KEY","CREATE_DH_PARAMETERS","CREATE_DIGEST","Crosses","CUME_DIST","CURDATE","CURRENT_DATE","CURRENT_ROLE","CURRENT_TIME","CURRENT_TIMESTAMP","CURRENT_USER","CURTIME","DATABASE","DATE","DATE_ADD","DATE_FORMAT","DATE_SUB","DATEDIFF","DAY","DAYNAME","DAYOFMONTH","DAYOFWEEK","DAYOFYEAR","DECODE","DEFAULT","DEGREES","DES_DECRYPT","DES_ENCRYPT","DENSE_RANK","Dimension","Disjoint","Distance","ELT","ENCODE","ENCRYPT","EndPoint","Envelope","Equals","EXP","EXPORT_SET","ExteriorRing","EXTRACT","ExtractValue","FIELD","FIND_IN_SET","FIRST_VALUE","FLOOR","FORMAT","FORMAT_BYTES","FORMAT_PICO_TIME","FOUND_ROWS","FROM_BASE64","FROM_DAYS","FROM_UNIXTIME","GEN_RANGE","GEN_RND_EMAIL","GEN_RND_PAN","GEN_RND_SSN","GEN_RND_US_PHONE","GeomCollection","GeomCollFromText","GeometryCollectionFromText","GeomCollFromWKB","GeometryCollectionFromWKB","GeometryCollection","GeometryN","GeometryType","GeomFromText","GeometryFromText","GeomFromWKB","GeometryFromWKB","GET_FORMAT","GET_LOCK","GLength","GREATEST","GROUP_CONCAT","GROUPING","GTID_SUBSET","GTID_SUBTRACT","HEX","HOUR","ICU_VERSION","IF","IFNULL","INET_ATON","INET_NTOA","INET6_ATON","INET6_NTOA","INSERT","INSTR","InteriorRingN","Intersects","INTERVAL","IS_FREE_LOCK","IS_IPV4","IS_IPV4_COMPAT","IS_IPV4_MAPPED","IS_IPV6","IS_USED_LOCK","IS_UUID","IsClosed","IsEmpty","ISNULL","IsSimple","JSON_APPEND","JSON_ARRAY","JSON_ARRAY_APPEND","JSON_ARRAY_INSERT","JSON_ARRAYAGG","JSON_CONTAINS","JSON_CONTAINS_PATH","JSON_DEPTH","JSON_EXTRACT","JSON_INSERT","JSON_KEYS","JSON_LENGTH","JSON_MERGE","JSON_MERGE_PATCH","JSON_MERGE_PRESERVE","JSON_OBJECT","JSON_OBJECTAGG","JSON_OVERLAPS","JSON_PRETTY","JSON_QUOTE","JSON_REMOVE","JSON_REPLACE","JSON_SCHEMA_VALID","JSON_SCHEMA_VALIDATION_REPORT","JSON_SEARCH","JSON_SET","JSON_STORAGE_FREE","JSON_STORAGE_SIZE","JSON_TABLE","JSON_TYPE","JSON_UNQUOTE","JSON_VALID","LAG","LAST_DAY","LAST_INSERT_ID","LAST_VALUE","LCASE","LEAD","LEAST","LEFT","LENGTH","LineFromText","LineStringFromText","LineFromWKB","LineStringFromWKB","LineString","LN","LOAD_FILE","LOCALTIME","LOCALTIMESTAMP","LOCATE","LOG","LOG10","LOG2","LOWER","LPAD","LTRIM","MAKE_SET","MAKEDATE","MAKETIME","MASK_INNER","MASK_OUTER","MASK_PAN","MASK_PAN_RELAXED","MASK_SSN","MASTER_POS_WAIT","MAX","MBRContains","MBRCoveredBy","MBRCovers","MBRDisjoint","MBREqual","MBREquals","MBRIntersects","MBROverlaps","MBRTouches","MBRWithin","MD5","MEMBER OF","MICROSECOND","MID","MIN","MINUTE","MLineFromText","MultiLineStringFromText","MLineFromWKB","MultiLineStringFromWKB","MOD","MONTH","MONTHNAME","MPointFromText","MultiPointFromText","MPointFromWKB","MultiPointFromWKB","MPolyFromText","MultiPolygonFromText","MPolyFromWKB","MultiPolygonFromWKB","MultiLineString","MultiPoint","MultiPolygon","NAME_CONST","NOT IN","NOW","NTH_VALUE","NTILE","NULLIF","NumGeometries","NumInteriorRings","NumPoints","OCT","OCTET_LENGTH","OLD_PASSWORD","ORD","Overlaps","PASSWORD","PERCENT_RANK","PERIOD_ADD","PERIOD_DIFF","PI","Point","PointFromText","PointFromWKB","PointN","PolyFromText","PolygonFromText","PolyFromWKB","PolygonFromWKB","Polygon","POSITION","POW","POWER","PS_CURRENT_THREAD_ID","PS_THREAD_ID","PROCEDURE ANALYSE","QUARTER","QUOTE","RADIANS","RAND","RANDOM_BYTES","RANK","REGEXP_INSTR","REGEXP_LIKE","REGEXP_REPLACE","REGEXP_REPLACE","RELEASE_ALL_LOCKS","RELEASE_LOCK","REPEAT","REPLACE","REVERSE","RIGHT","ROLES_GRAPHML","ROUND","ROW_COUNT","ROW_NUMBER","RPAD","RTRIM","SCHEMA","SEC_TO_TIME","SECOND","SESSION_USER","SHA1","SHA","SHA2","SIGN","SIN","SLEEP","SOUNDEX","SOURCE_POS_WAIT","SPACE","SQRT","SRID","ST_Area","ST_AsBinary","ST_AsWKB","ST_AsGeoJSON","ST_AsText","ST_AsWKT","ST_Buffer","ST_Buffer_Strategy","ST_Centroid","ST_Collect","ST_Contains","ST_ConvexHull","ST_Crosses","ST_Difference","ST_Dimension","ST_Disjoint","ST_Distance","ST_Distance_Sphere","ST_EndPoint","ST_Envelope","ST_Equals","ST_ExteriorRing","ST_FrechetDistance","ST_GeoHash","ST_GeomCollFromText","ST_GeometryCollectionFromText","ST_GeomCollFromTxt","ST_GeomCollFromWKB","ST_GeometryCollectionFromWKB","ST_GeometryN","ST_GeometryType","ST_GeomFromGeoJSON","ST_GeomFromText","ST_GeometryFromText","ST_GeomFromWKB","ST_GeometryFromWKB","ST_HausdorffDistance","ST_InteriorRingN","ST_Intersection","ST_Intersects","ST_IsClosed","ST_IsEmpty","ST_IsSimple","ST_IsValid","ST_LatFromGeoHash","ST_Length","ST_LineFromText","ST_LineStringFromText","ST_LineFromWKB","ST_LineStringFromWKB","ST_LineInterpolatePoint","ST_LineInterpolatePoints","ST_LongFromGeoHash","ST_Longitude","ST_MakeEnvelope","ST_MLineFromText","ST_MultiLineStringFromText","ST_MLineFromWKB","ST_MultiLineStringFromWKB","ST_MPointFromText","ST_MultiPointFromText","ST_MPointFromWKB","ST_MultiPointFromWKB","ST_MPolyFromText","ST_MultiPolygonFromText","ST_MPolyFromWKB","ST_MultiPolygonFromWKB","ST_NumGeometries","ST_NumInteriorRing","ST_NumInteriorRings","ST_NumPoints","ST_Overlaps","ST_PointAtDistance","ST_PointFromGeoHash","ST_PointFromText","ST_PointFromWKB","ST_PointN","ST_PolyFromText","ST_PolygonFromText","ST_PolyFromWKB","ST_PolygonFromWKB","ST_Simplify","ST_SRID","ST_StartPoint","ST_SwapXY","ST_SymDifference","ST_Touches","ST_Transform","ST_Union","ST_Validate","ST_Within","ST_X","ST_Y","StartPoint","STATEMENT_DIGEST","STATEMENT_DIGEST_TEXT","STD","STDDEV","STDDEV_POP","STDDEV_SAMP","STR_TO_DATE","STRCMP","SUBDATE","SUBSTR","SUBSTRING","SUBSTRING_INDEX","SUBTIME","SUM","SYSDATE","SYSTEM_USER","TAN","TIME","TIME_FORMAT","TIME_TO_SEC","TIMEDIFF","TIMESTAMP","TIMESTAMPADD","TIMESTAMPDIFF","TO_BASE64","TO_DAYS","TO_SECONDS","Touches","TRIM","TRUNCATE","UCASE","UNCOMPRESS","UNCOMPRESSED_LENGTH","UNHEX","UNIX_TIMESTAMP","UpdateXML","UPPER","USER","UTC_DATE","UTC_TIME","UTC_TIMESTAMP","UUID","UUID_SHORT","UUID_TO_BIN","VALIDATE_PASSWORD_STRENGTH","VALUES","VAR_POP","VAR_SAMP","VARIANCE","VERSION","WAIT_FOR_EXECUTED_GTID_SET","WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS","WEEK","WEEKDAY","WEEKOFYEAR","WEIGHT_STRING","Within","X","Y","YEAR","YEARWEEK"],builtinVariables:[],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@]+/,{cases:{"@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@keywords":"keyword","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/#+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/'/,{token:"string",next:"@string"}],[/"/,{token:"string.double",next:"@stringDouble"}]],string:[[/\\'/,"string"],[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],stringDouble:[[/[^"]+/,"string.double"],[/""/,"string.double"],[/"/,{token:"string.double",next:"@pop"}]],complexIdentifiers:[[/`/,{token:"identifier.quote",next:"@quotedIdentifier"}]],quotedIdentifier:[[/[^`]+/,"identifier"],[/``/,"identifier"],[/`/,{token:"identifier.quote",next:"@pop"}]],scopes:[]}};return t(L);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/objective-c/objective-c.js b/public/vs/basic-languages/objective-c/objective-c.js
new file mode 100644
index 0000000..f643e3e
--- /dev/null
+++ b/public/vs/basic-languages/objective-c/objective-c.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/objective-c/objective-c", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var l=(o,e)=>{for(var t in e)s(o,t,{get:e[t],enumerable:!0})},p=(o,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of c(e))!a.call(o,n)&&n!==t&&s(o,n,{get:()=>e[n],enumerable:!(i=r(e,n))||i.enumerable});return o};var d=o=>p(s({},"__esModule",{value:!0}),o);var u={};l(u,{conf:()=>g,language:()=>m});var g={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},m={defaultToken:"",tokenPostfix:".objective-c",keywords:["#import","#include","#define","#else","#endif","#if","#ifdef","#ifndef","#ident","#undef","@class","@defs","@dynamic","@encode","@end","@implementation","@interface","@package","@private","@protected","@property","@protocol","@public","@selector","@synthesize","__declspec","assign","auto","BOOL","break","bycopy","byref","case","char","Class","const","copy","continue","default","do","double","else","enum","extern","FALSE","false","float","for","goto","if","in","int","id","inout","IMP","long","nil","nonatomic","NULL","oneway","out","private","public","protected","readwrite","readonly","register","return","SEL","self","short","signed","sizeof","static","struct","super","switch","typedef","TRUE","true","union","unsigned","volatile","void","while"],decpart:/\d(_?\d)*/,decimal:/0|@decpart/,tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@numbers"},{include:"@strings"},[/[,:;]/,"delimiter"],[/[{}\[\]()<>]/,"@brackets"],[/[a-zA-Z@#]\w*/,{cases:{"@keywords":"keyword","@default":"identifier"}}],[/[<>=\\+\\-\\*\\/\\^\\|\\~,]|and\\b|or\\b|not\\b]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],numbers:[[/0[xX][0-9a-fA-F]*(_?[0-9a-fA-F])*/,"number.hex"],[/@decimal((\.@decpart)?([eE][\-+]?@decpart)?)[fF]*/,{cases:{"(\\d)*":"number",$0:"number.float"}}]],strings:[[/'$/,"string.escape","@popall"],[/'/,"string.escape","@stringBody"],[/"$/,"string.escape","@popall"],[/"/,"string.escape","@dblStringBody"]],stringBody:[[/[^\\']+$/,"string","@popall"],[/[^\\']+/,"string"],[/\\./,"string"],[/'/,"string.escape","@popall"],[/\\$/,"string"]],dblStringBody:[[/[^\\"]+$/,"string","@popall"],[/[^\\"]+/,"string"],[/\\./,"string"],[/"/,"string.escape","@popall"],[/\\$/,"string"]]}};return d(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/pascal/pascal.js b/public/vs/basic-languages/pascal/pascal.js
new file mode 100644
index 0000000..3685b92
--- /dev/null
+++ b/public/vs/basic-languages/pascal/pascal.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/pascal/pascal", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var n=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(t,e)=>{for(var r in e)n(t,r,{get:e[r],enumerable:!0})},d=(t,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of a(e))!l.call(t,o)&&o!==r&&n(t,o,{get:()=>e[o],enumerable:!(i=s(e,o))||i.enumerable});return t};var p=t=>d(n({},"__esModule",{value:!0}),t);var g={};c(g,{conf:()=>m,language:()=>u});var m={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["{","}"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*\\{\\$REGION(\\s\\'.*\\')?\\}"),end:new RegExp("^\\s*\\{\\$ENDREGION\\}")}}},u={defaultToken:"",tokenPostfix:".pascal",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["absolute","abstract","all","and_then","array","as","asm","attribute","begin","bindable","case","class","const","contains","default","div","else","end","except","exports","external","far","file","finalization","finally","forward","generic","goto","if","implements","import","in","index","inherited","initialization","interrupt","is","label","library","mod","module","name","near","not","object","of","on","only","operator","or_else","otherwise","override","package","packed","pow","private","program","protected","public","published","interface","implementation","qualified","read","record","resident","requires","resourcestring","restricted","segment","set","shl","shr","specialize","stored","strict","then","threadvar","to","try","type","unit","uses","var","view","virtual","dynamic","overload","reintroduce","with","write","xor","true","false","procedure","function","constructor","destructor","property","break","continue","exit","abort","while","do","for","raise","repeat","until"],typeKeywords:["boolean","double","byte","integer","shortint","char","longint","float","string"],operators:["=",">","<","<=",">=","<>",":",":=","and","or","+","-","*","/","@","&","^","%"],symbols:/[=><:@\^&|+\-*\/\^%]+/,tokenizer:{root:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\$[0-9a-fA-F]{1,16}/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/'/,"string","@string"],[/'[^\\']'/,"string"],[/'/,"string.invalid"],[/\#\d+/,"string"]],comment:[[/[^\*\}]+/,"comment"],[/\}/,"comment","@pop"],[/[\{]/,"comment"]],string:[[/[^\\']+/,"string"],[/\\./,"string.escape.invalid"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\{/,"comment","@comment"],[/\/\/.*$/,"comment"]]}};return p(g);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/pascaligo/pascaligo.js b/public/vs/basic-languages/pascaligo/pascaligo.js
new file mode 100644
index 0000000..853bdd6
--- /dev/null
+++ b/public/vs/basic-languages/pascaligo/pascaligo.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/pascaligo/pascaligo", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var t in e)s(o,t,{get:e[t],enumerable:!0})},m=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!l.call(o,n)&&n!==t&&s(o,n,{get:()=>e[n],enumerable:!(r=i(e,n))||r.enumerable});return o};var p=o=>m(s({},"__esModule",{value:!0}),o);var u={};c(u,{conf:()=>d,language:()=>g});var d={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}]},g={defaultToken:"",tokenPostfix:".pascaligo",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["begin","block","case","const","else","end","fail","for","from","function","if","is","nil","of","remove","return","skip","then","type","var","while","with","option","None","transaction"],typeKeywords:["bool","int","list","map","nat","record","string","unit","address","map","mtz","xtz"],operators:["=",">","<","<=",">=","<>",":",":=","and","mod","or","+","-","*","/","@","&","^","%"],symbols:/[=><:@\^&|+\-*\/\^%]+/,tokenizer:{root:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\$[0-9a-fA-F]{1,16}/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/'/,"string","@string"],[/'[^\\']'/,"string"],[/'/,"string.invalid"],[/\#\d+/,"string"]],comment:[[/[^\(\*]+/,"comment"],[/\*\)/,"comment","@pop"],[/\(\*/,"comment"]],string:[[/[^\\']+/,"string"],[/\\./,"string.escape.invalid"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\(\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}};return p(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/perl/perl.js b/public/vs/basic-languages/perl/perl.js
new file mode 100644
index 0000000..3f3d8fb
--- /dev/null
+++ b/public/vs/basic-languages/perl/perl.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/perl/perl", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var a=(t,e)=>{for(var n in e)r(t,n,{get:e[n],enumerable:!0})},$=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of l(e))!d.call(t,s)&&s!==n&&r(t,s,{get:()=>e[s],enumerable:!(i=o(e,s))||i.enumerable});return t};var c=t=>$(r({},"__esModule",{value:!0}),t);var m={};a(m,{conf:()=>g,language:()=>p});var g={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}]},p={defaultToken:"",tokenPostfix:".perl",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["__DATA__","else","lock","__END__","elsif","lt","__FILE__","eq","__LINE__","exp","ne","sub","__PACKAGE__","for","no","and","foreach","or","unless","cmp","ge","package","until","continue","gt","while","CORE","if","xor","do","le","__DIE__","__WARN__"],builtinFunctions:["-A","END","length","setpgrp","-B","endgrent","link","setpriority","-b","endhostent","listen","setprotoent","-C","endnetent","local","setpwent","-c","endprotoent","localtime","setservent","-d","endpwent","log","setsockopt","-e","endservent","lstat","shift","-f","eof","map","shmctl","-g","eval","mkdir","shmget","-k","exec","msgctl","shmread","-l","exists","msgget","shmwrite","-M","exit","msgrcv","shutdown","-O","fcntl","msgsnd","sin","-o","fileno","my","sleep","-p","flock","next","socket","-r","fork","not","socketpair","-R","format","oct","sort","-S","formline","open","splice","-s","getc","opendir","split","-T","getgrent","ord","sprintf","-t","getgrgid","our","sqrt","-u","getgrnam","pack","srand","-w","gethostbyaddr","pipe","stat","-W","gethostbyname","pop","state","-X","gethostent","pos","study","-x","getlogin","print","substr","-z","getnetbyaddr","printf","symlink","abs","getnetbyname","prototype","syscall","accept","getnetent","push","sysopen","alarm","getpeername","quotemeta","sysread","atan2","getpgrp","rand","sysseek","AUTOLOAD","getppid","read","system","BEGIN","getpriority","readdir","syswrite","bind","getprotobyname","readline","tell","binmode","getprotobynumber","readlink","telldir","bless","getprotoent","readpipe","tie","break","getpwent","recv","tied","caller","getpwnam","redo","time","chdir","getpwuid","ref","times","CHECK","getservbyname","rename","truncate","chmod","getservbyport","require","uc","chomp","getservent","reset","ucfirst","chop","getsockname","return","umask","chown","getsockopt","reverse","undef","chr","glob","rewinddir","UNITCHECK","chroot","gmtime","rindex","unlink","close","goto","rmdir","unpack","closedir","grep","say","unshift","connect","hex","scalar","untie","cos","index","seek","use","crypt","INIT","seekdir","utime","dbmclose","int","select","values","dbmopen","ioctl","semctl","vec","defined","join","semget","wait","delete","keys","semop","waitpid","DESTROY","kill","send","wantarray","die","last","setgrent","warn","dump","lc","sethostent","write","each","lcfirst","setnetent"],builtinFileHandlers:["ARGV","STDERR","STDOUT","ARGVOUT","STDIN","ENV"],builtinVariables:["$!","$^RE_TRIE_MAXBUF","$LAST_REGEXP_CODE_RESULT",'$"',"$^S","$LIST_SEPARATOR","$#","$^T","$MATCH","$$","$^TAINT","$MULTILINE_MATCHING","$%","$^UNICODE","$NR","$&","$^UTF8LOCALE","$OFMT","$'","$^V","$OFS","$(","$^W","$ORS","$)","$^WARNING_BITS","$OS_ERROR","$*","$^WIDE_SYSTEM_CALLS","$OSNAME","$+","$^X","$OUTPUT_AUTO_FLUSH","$,","$_","$OUTPUT_FIELD_SEPARATOR","$-","$`","$OUTPUT_RECORD_SEPARATOR","$.","$a","$PERL_VERSION","$/","$ACCUMULATOR","$PERLDB","$0","$ARG","$PID","$:","$ARGV","$POSTMATCH","$;","$b","$PREMATCH","$<","$BASETIME","$PROCESS_ID","$=","$CHILD_ERROR","$PROGRAM_NAME","$>","$COMPILING","$REAL_GROUP_ID","$?","$DEBUGGING","$REAL_USER_ID","$@","$EFFECTIVE_GROUP_ID","$RS","$[","$EFFECTIVE_USER_ID","$SUBSCRIPT_SEPARATOR","$\\","$EGID","$SUBSEP","$]","$ERRNO","$SYSTEM_FD_MAX","$^","$EUID","$UID","$^A","$EVAL_ERROR","$WARNING","$^C","$EXCEPTIONS_BEING_CAUGHT","$|","$^CHILD_ERROR_NATIVE","$EXECUTABLE_NAME","$~","$^D","$EXTENDED_OS_ERROR","%!","$^E","$FORMAT_FORMFEED","%^H","$^ENCODING","$FORMAT_LINE_BREAK_CHARACTERS","%ENV","$^F","$FORMAT_LINES_LEFT","%INC","$^H","$FORMAT_LINES_PER_PAGE","%OVERLOAD","$^I","$FORMAT_NAME","%SIG","$^L","$FORMAT_PAGE_NUMBER","@+","$^M","$FORMAT_TOP_NAME","@-","$^N","$GID","@_","$^O","$INPLACE_EDIT","@ARGV","$^OPEN","$INPUT_LINE_NUMBER","@INC","$^P","$INPUT_RECORD_SEPARATOR","@LAST_MATCH_START","$^R","$LAST_MATCH_END","$^RE_DEBUG_FLAGS","$LAST_PAREN_MATCH"],symbols:/[:+\-\^*$&%@=<>!?|\/~\.]/,quoteLikeOps:["qr","m","s","q","qq","qx","qw","tr","y"],escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},[/[a-zA-Z\-_][\w\-_]*/,{cases:{"@keywords":"keyword","@builtinFunctions":"type.identifier","@builtinFileHandlers":"variable.predefined","@quoteLikeOps":{token:"@rematch",next:"quotedConstructs"},"@default":""}}],[/[\$@%][*@#?\+\-\$!\w\\\^><~:;\.]+/,{cases:{"@builtinVariables":"variable.predefined","@default":"variable"}}],{include:"@strings"},{include:"@dblStrings"},{include:"@perldoc"},{include:"@heredoc"},[/[{}\[\]()]/,"@brackets"],[/[\/](?:(?:\[(?:\\]|[^\]])+\])|(?:\\\/|[^\]\/]))*[\/]\w*\s*(?=[).,;]|$)/,"regexp"],[/@symbols/,"operators"],{include:"@numbers"},[/[,;]/,"delimiter"]],whitespace:[[/\s+/,"white"],[/(^#!.*$)/,"metatag"],[/(^#.*$)/,"comment"]],numbers:[[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F_]*[0-9a-fA-F]/,"number.hex"],[/\d+/,"number"]],strings:[[/'/,"string","@stringBody"]],stringBody:[[/'/,"string","@popall"],[/\\'/,"string.escape"],[/./,"string"]],dblStrings:[[/"/,"string","@dblStringBody"]],dblStringBody:[[/"/,"string","@popall"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],{include:"@variables"},[/./,"string"]],quotedConstructs:[[/(q|qw|tr|y)\s*\(/,{token:"string.delim",switchTo:"@qstring.(.)"}],[/(q|qw|tr|y)\s*\[/,{token:"string.delim",switchTo:"@qstring.[.]"}],[/(q|qw|tr|y)\s*\{/,{token:"string.delim",switchTo:"@qstring.{.}"}],[/(q|qw|tr|y)\s*</,{token:"string.delim",switchTo:"@qstring.<.>"}],[/(q|qw|tr|y)#/,{token:"string.delim",switchTo:"@qstring.#.#"}],[/(q|qw|tr|y)\s*([^A-Za-z0-9#\s])/,{token:"string.delim",switchTo:"@qstring.$2.$2"}],[/(q|qw|tr|y)\s+(\w)/,{token:"string.delim",switchTo:"@qstring.$2.$2"}],[/(qr|m|s)\s*\(/,{token:"regexp.delim",switchTo:"@qregexp.(.)"}],[/(qr|m|s)\s*\[/,{token:"regexp.delim",switchTo:"@qregexp.[.]"}],[/(qr|m|s)\s*\{/,{token:"regexp.delim",switchTo:"@qregexp.{.}"}],[/(qr|m|s)\s*</,{token:"regexp.delim",switchTo:"@qregexp.<.>"}],[/(qr|m|s)#/,{token:"regexp.delim",switchTo:"@qregexp.#.#"}],[/(qr|m|s)\s*([^A-Za-z0-9_#\s])/,{token:"regexp.delim",switchTo:"@qregexp.$2.$2"}],[/(qr|m|s)\s+(\w)/,{token:"regexp.delim",switchTo:"@qregexp.$2.$2"}],[/(qq|qx)\s*\(/,{token:"string.delim",switchTo:"@qqstring.(.)"}],[/(qq|qx)\s*\[/,{token:"string.delim",switchTo:"@qqstring.[.]"}],[/(qq|qx)\s*\{/,{token:"string.delim",switchTo:"@qqstring.{.}"}],[/(qq|qx)\s*</,{token:"string.delim",switchTo:"@qqstring.<.>"}],[/(qq|qx)#/,{token:"string.delim",switchTo:"@qqstring.#.#"}],[/(qq|qx)\s*([^A-Za-z0-9#\s])/,{token:"string.delim",switchTo:"@qqstring.$2.$2"}],[/(qq|qx)\s+(\w)/,{token:"string.delim",switchTo:"@qqstring.$2.$2"}]],qstring:[[/\\./,"string.escape"],[/./,{cases:{"$#==$S3":{token:"string.delim",next:"@pop"},"$#==$S2":{token:"string.delim",next:"@push"},"@default":"string"}}]],qregexp:[{include:"@variables"},[/\\./,"regexp.escape"],[/./,{cases:{"$#==$S3":{token:"regexp.delim",next:"@regexpModifiers"},"$#==$S2":{token:"regexp.delim",next:"@push"},"@default":"regexp"}}]],regexpModifiers:[[/[msixpodualngcer]+/,{token:"regexp.modifier",next:"@popall"}]],qqstring:[{include:"@variables"},{include:"@qstring"}],heredoc:[[/<<\s*['"`]?([\w\-]+)['"`]?/,{token:"string.heredoc.delimiter",next:"@heredocBody.$1"}]],heredocBody:[[/^([\w\-]+)$/,{cases:{"$1==$S2":[{token:"string.heredoc.delimiter",next:"@popall"}],"@default":"string.heredoc"}}],[/./,"string.heredoc"]],perldoc:[[/^=\w/,"comment.doc","@perldocBody"]],perldocBody:[[/^=cut\b/,"type.identifier","@popall"],[/./,"comment.doc"]],variables:[[/\$\w+/,"variable"],[/@\w+/,"variable"],[/%\w+/,"variable"]]}};return c(m);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/pgsql/pgsql.js b/public/vs/basic-languages/pgsql/pgsql.js
new file mode 100644
index 0000000..71121ff
--- /dev/null
+++ b/public/vs/basic-languages/pgsql/pgsql.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/pgsql/pgsql", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var p=(_,e)=>{for(var s in e)r(_,s,{get:e[s],enumerable:!0})},l=(_,e,s,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of i(e))!n.call(_,t)&&t!==s&&r(_,t,{get:()=>e[t],enumerable:!(a=o(e,t))||a.enumerable});return _};var g=_=>l(r({},"__esModule",{value:!0}),_);var m={};p(m,{conf:()=>c,language:()=>d});var c={comments:{lineComment:"--",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},d={defaultToken:"",tokenPostfix:".sql",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["ALL","ANALYSE","ANALYZE","AND","ANY","ARRAY","AS","ASC","ASYMMETRIC","AUTHORIZATION","BINARY","BOTH","CASE","CAST","CHECK","COLLATE","COLLATION","COLUMN","CONCURRENTLY","CONSTRAINT","CREATE","CROSS","CURRENT_CATALOG","CURRENT_DATE","CURRENT_ROLE","CURRENT_SCHEMA","CURRENT_TIME","CURRENT_TIMESTAMP","CURRENT_USER","DEFAULT","DEFERRABLE","DESC","DISTINCT","DO","ELSE","END","EXCEPT","FALSE","FETCH","FOR","FOREIGN","FREEZE","FROM","FULL","GRANT","GROUP","HAVING","ILIKE","IN","INITIALLY","INNER","INTERSECT","INTO","IS","ISNULL","JOIN","LATERAL","LEADING","LEFT","LIKE","LIMIT","LOCALTIME","LOCALTIMESTAMP","NATURAL","NOT","NOTNULL","NULL","OFFSET","ON","ONLY","OR","ORDER","OUTER","OVERLAPS","PLACING","PRIMARY","REFERENCES","RETURNING","RIGHT","SELECT","SESSION_USER","SIMILAR","SOME","SYMMETRIC","TABLE","TABLESAMPLE","THEN","TO","TRAILING","TRUE","UNION","UNIQUE","USER","USING","VARIADIC","VERBOSE","WHEN","WHERE","WINDOW","WITH"],operators:["AND","BETWEEN","IN","LIKE","NOT","OR","IS","NULL","INTERSECT","UNION","INNER","JOIN","LEFT","OUTER","RIGHT"],builtinFunctions:["abbrev","abs","acldefault","aclexplode","acos","acosd","acosh","age","any","area","array_agg","array_append","array_cat","array_dims","array_fill","array_length","array_lower","array_ndims","array_position","array_positions","array_prepend","array_remove","array_replace","array_to_json","array_to_string","array_to_tsvector","array_upper","ascii","asin","asind","asinh","atan","atan2","atan2d","atand","atanh","avg","bit","bit_and","bit_count","bit_length","bit_or","bit_xor","bool_and","bool_or","bound_box","box","brin_desummarize_range","brin_summarize_new_values","brin_summarize_range","broadcast","btrim","cardinality","cbrt","ceil","ceiling","center","char_length","character_length","chr","circle","clock_timestamp","coalesce","col_description","concat","concat_ws","convert","convert_from","convert_to","corr","cos","cosd","cosh","cot","cotd","count","covar_pop","covar_samp","cume_dist","current_catalog","current_database","current_date","current_query","current_role","current_schema","current_schemas","current_setting","current_time","current_timestamp","current_user","currval","cursor_to_xml","cursor_to_xmlschema","date_bin","date_part","date_trunc","database_to_xml","database_to_xml_and_xmlschema","database_to_xmlschema","decode","degrees","dense_rank","diagonal","diameter","div","encode","enum_first","enum_last","enum_range","every","exp","extract","factorial","family","first_value","floor","format","format_type","gcd","gen_random_uuid","generate_series","generate_subscripts","get_bit","get_byte","get_current_ts_config","gin_clean_pending_list","greatest","grouping","has_any_column_privilege","has_column_privilege","has_database_privilege","has_foreign_data_wrapper_privilege","has_function_privilege","has_language_privilege","has_schema_privilege","has_sequence_privilege","has_server_privilege","has_table_privilege","has_tablespace_privilege","has_type_privilege","height","host","hostmask","inet_client_addr","inet_client_port","inet_merge","inet_same_family","inet_server_addr","inet_server_port","initcap","isclosed","isempty","isfinite","isopen","json_agg","json_array_elements","json_array_elements_text","json_array_length","json_build_array","json_build_object","json_each","json_each_text","json_extract_path","json_extract_path_text","json_object","json_object_agg","json_object_keys","json_populate_record","json_populate_recordset","json_strip_nulls","json_to_record","json_to_recordset","json_to_tsvector","json_typeof","jsonb_agg","jsonb_array_elements","jsonb_array_elements_text","jsonb_array_length","jsonb_build_array","jsonb_build_object","jsonb_each","jsonb_each_text","jsonb_extract_path","jsonb_extract_path_text","jsonb_insert","jsonb_object","jsonb_object_agg","jsonb_object_keys","jsonb_path_exists","jsonb_path_match","jsonb_path_query","jsonb_path_query_array","jsonb_path_exists_tz","jsonb_path_query_first","jsonb_path_query_array_tz","jsonb_path_query_first_tz","jsonb_path_query_tz","jsonb_path_match_tz","jsonb_populate_record","jsonb_populate_recordset","jsonb_pretty","jsonb_set","jsonb_set_lax","jsonb_strip_nulls","jsonb_to_record","jsonb_to_recordset","jsonb_to_tsvector","jsonb_typeof","justify_days","justify_hours","justify_interval","lag","last_value","lastval","lcm","lead","least","left","length","line","ln","localtime","localtimestamp","log","log10","lower","lower_inc","lower_inf","lpad","lseg","ltrim","macaddr8_set7bit","make_date","make_interval","make_time","make_timestamp","make_timestamptz","makeaclitem","masklen","max","md5","min","min_scale","mod","mode","multirange","netmask","network","nextval","normalize","now","npoints","nth_value","ntile","nullif","num_nonnulls","num_nulls","numnode","obj_description","octet_length","overlay","parse_ident","path","pclose","percent_rank","percentile_cont","percentile_disc","pg_advisory_lock","pg_advisory_lock_shared","pg_advisory_unlock","pg_advisory_unlock_all","pg_advisory_unlock_shared","pg_advisory_xact_lock","pg_advisory_xact_lock_shared","pg_backend_pid","pg_backup_start_time","pg_blocking_pids","pg_cancel_backend","pg_client_encoding","pg_collation_actual_version","pg_collation_is_visible","pg_column_compression","pg_column_size","pg_conf_load_time","pg_control_checkpoint","pg_control_init","pg_control_recovery","pg_control_system","pg_conversion_is_visible","pg_copy_logical_replication_slot","pg_copy_physical_replication_slot","pg_create_logical_replication_slot","pg_create_physical_replication_slot","pg_create_restore_point","pg_current_logfile","pg_current_snapshot","pg_current_wal_flush_lsn","pg_current_wal_insert_lsn","pg_current_wal_lsn","pg_current_xact_id","pg_current_xact_id_if_assigned","pg_current_xlog_flush_location","pg_current_xlog_insert_location","pg_current_xlog_location","pg_database_size","pg_describe_object","pg_drop_replication_slot","pg_event_trigger_ddl_commands","pg_event_trigger_dropped_objects","pg_event_trigger_table_rewrite_oid","pg_event_trigger_table_rewrite_reason","pg_export_snapshot","pg_filenode_relation","pg_function_is_visible","pg_get_catalog_foreign_keys","pg_get_constraintdef","pg_get_expr","pg_get_function_arguments","pg_get_function_identity_arguments","pg_get_function_result","pg_get_functiondef","pg_get_indexdef","pg_get_keywords","pg_get_object_address","pg_get_owned_sequence","pg_get_ruledef","pg_get_serial_sequence","pg_get_statisticsobjdef","pg_get_triggerdef","pg_get_userbyid","pg_get_viewdef","pg_get_wal_replay_pause_state","pg_has_role","pg_identify_object","pg_identify_object_as_address","pg_import_system_collations","pg_index_column_has_property","pg_index_has_property","pg_indexam_has_property","pg_indexes_size","pg_is_in_backup","pg_is_in_recovery","pg_is_other_temp_schema","pg_is_wal_replay_paused","pg_is_xlog_replay_paused","pg_jit_available","pg_last_committed_xact","pg_last_wal_receive_lsn","pg_last_wal_replay_lsn","pg_last_xact_replay_timestamp","pg_last_xlog_receive_location","pg_last_xlog_replay_location","pg_listening_channels","pg_log_backend_memory_contexts","pg_logical_emit_message","pg_logical_slot_get_binary_changes","pg_logical_slot_get_changes","pg_logical_slot_peek_binary_changes","pg_logical_slot_peek_changes","pg_ls_archive_statusdir","pg_ls_dir","pg_ls_logdir","pg_ls_tmpdir","pg_ls_waldir","pg_mcv_list_items","pg_my_temp_schema","pg_notification_queue_usage","pg_opclass_is_visible","pg_operator_is_visible","pg_opfamily_is_visible","pg_options_to_table","pg_partition_ancestors","pg_partition_root","pg_partition_tree","pg_postmaster_start_time","pg_promote","pg_read_binary_file","pg_read_file","pg_relation_filenode","pg_relation_filepath","pg_relation_size","pg_reload_conf","pg_replication_origin_advance","pg_replication_origin_create","pg_replication_origin_drop","pg_replication_origin_oid","pg_replication_origin_progress","pg_replication_origin_session_is_setup","pg_replication_origin_session_progress","pg_replication_origin_session_reset","pg_replication_origin_session_setup","pg_replication_origin_xact_reset","pg_replication_origin_xact_setup","pg_replication_slot_advance","pg_rotate_logfile","pg_safe_snapshot_blocking_pids","pg_size_bytes","pg_size_pretty","pg_sleep","pg_sleep_for","pg_sleep_until","pg_snapshot_xip","pg_snapshot_xmax","pg_snapshot_xmin","pg_start_backup","pg_stat_file","pg_statistics_obj_is_visible","pg_stop_backup","pg_switch_wal","pg_switch_xlog","pg_table_is_visible","pg_table_size","pg_tablespace_databases","pg_tablespace_location","pg_tablespace_size","pg_terminate_backend","pg_total_relation_size","pg_trigger_depth","pg_try_advisory_lock","pg_try_advisory_lock_shared","pg_try_advisory_xact_lock","pg_try_advisory_xact_lock_shared","pg_ts_config_is_visible","pg_ts_dict_is_visible","pg_ts_parser_is_visible","pg_ts_template_is_visible","pg_type_is_visible","pg_typeof","pg_visible_in_snapshot","pg_wal_lsn_diff","pg_wal_replay_pause","pg_wal_replay_resume","pg_walfile_name","pg_walfile_name_offset","pg_xact_commit_timestamp","pg_xact_commit_timestamp_origin","pg_xact_status","pg_xlog_location_diff","pg_xlog_replay_pause","pg_xlog_replay_resume","pg_xlogfile_name","pg_xlogfile_name_offset","phraseto_tsquery","pi","plainto_tsquery","point","polygon","popen","position","power","pqserverversion","query_to_xml","query_to_xml_and_xmlschema","query_to_xmlschema","querytree","quote_ident","quote_literal","quote_nullable","radians","radius","random","range_agg","range_intersect_agg","range_merge","rank","regexp_count","regexp_instr","regexp_like","regexp_match","regexp_matches","regexp_replace","regexp_split_to_array","regexp_split_to_table","regexp_substr","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","repeat","replace","reverse","right","round","row_number","row_security_active","row_to_json","rpad","rtrim","scale","schema_to_xml","schema_to_xml_and_xmlschema","schema_to_xmlschema","session_user","set_bit","set_byte","set_config","set_masklen","setseed","setval","setweight","sha224","sha256","sha384","sha512","shobj_description","sign","sin","sind","sinh","slope","split_part","sprintf","sqrt","starts_with","statement_timestamp","stddev","stddev_pop","stddev_samp","string_agg","string_to_array","string_to_table","strip","strpos","substr","substring","sum","suppress_redundant_updates_trigger","table_to_xml","table_to_xml_and_xmlschema","table_to_xmlschema","tan","tand","tanh","text","timeofday","timezone","to_ascii","to_char","to_date","to_hex","to_json","to_number","to_regclass","to_regcollation","to_regnamespace","to_regoper","to_regoperator","to_regproc","to_regprocedure","to_regrole","to_regtype","to_timestamp","to_tsquery","to_tsvector","transaction_timestamp","translate","trim","trim_array","trim_scale","trunc","ts_debug","ts_delete","ts_filter","ts_headline","ts_lexize","ts_parse","ts_rank","ts_rank_cd","ts_rewrite","ts_stat","ts_token_type","tsquery_phrase","tsvector_to_array","tsvector_update_trigger","tsvector_update_trigger_column","txid_current","txid_current_if_assigned","txid_current_snapshot","txid_snapshot_xip","txid_snapshot_xmax","txid_snapshot_xmin","txid_status","txid_visible_in_snapshot","unistr","unnest","upper","upper_inc","upper_inf","user","var_pop","var_samp","variance","version","websearch_to_tsquery","width","width_bucket","xml_is_well_formed","xml_is_well_formed_content","xml_is_well_formed_document","xmlagg","xmlcomment","xmlconcat","xmlelement","xmlexists","xmlforest","xmlparse","xmlpi","xmlroot","xmlserialize","xpath","xpath_exists"],builtinVariables:[],pseudoColumns:[],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@pseudoColumns"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@keywords":"keyword","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],pseudoColumns:[[/[$][A-Za-z_][\w@#$]*/,{cases:{"@pseudoColumns":"predefined","@default":"identifier"}}]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/'/,{token:"string",next:"@string"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],complexIdentifiers:[[/"/,{token:"identifier.quote",next:"@quotedIdentifier"}]],quotedIdentifier:[[/[^"]+/,"identifier"],[/""/,"identifier"],[/"/,{token:"identifier.quote",next:"@pop"}]],scopes:[]}};return g(m);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/php/php.js b/public/vs/basic-languages/php/php.js
new file mode 100644
index 0000000..1b0320c
--- /dev/null
+++ b/public/vs/basic-languages/php/php.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/php/php", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var i=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var s=(t,e)=>{for(var n in e)i(t,n,{get:e[n],enumerable:!0})},h=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let p of m(e))!a.call(t,p)&&p!==n&&i(t,p,{get:()=>e[p],enumerable:!(r=o(e,p))||r.enumerable});return t};var l=t=>h(i({},"__esModule",{value:!0}),t);var u={};s(u,{conf:()=>d,language:()=>c});var d={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string"]},{open:"[",close:"]",notIn:["string"]},{open:"(",close:")",notIn:["string"]},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]}],folding:{markers:{start:new RegExp("^\\s*(#|//)region\\b"),end:new RegExp("^\\s*(#|//)endregion\\b")}}},c={defaultToken:"",tokenPostfix:"",tokenizer:{root:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.root"}],[/<!DOCTYPE/,"metatag.html","@doctype"],[/<!--/,"comment.html","@comment"],[/(<)(\w+)(\/>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)(script)/,["delimiter.html",{token:"tag.html",next:"@script"}]],[/(<)(style)/,["delimiter.html",{token:"tag.html",next:"@style"}]],[/(<)([:\w]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)(\w+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/</,"delimiter.html"],[/[^<]+/]],doctype:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.comment"}],[/[^>]+/,"metatag.content.html"],[/>/,"metatag.html","@pop"]],comment:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.comment"}],[/-->/,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],phpInSimpleState:[[/<\?((php)|=)?/,"metatag.php"],[/\?>/,{token:"metatag.php",switchTo:"@$S2.$S3"}],{include:"phpRoot"}],phpInEmbeddedState:[[/<\?((php)|=)?/,"metatag.php"],[/\?>/,{token:"metatag.php",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],{include:"phpRoot"}],phpRoot:[[/[a-zA-Z_]\w*/,{cases:{"@phpKeywords":{token:"keyword.php"},"@phpCompileTimeConstants":{token:"constant.php"},"@default":"identifier.php"}}],[/[$a-zA-Z_]\w*/,{cases:{"@phpPreDefinedVariables":{token:"variable.predefined.php"},"@default":"variable.php"}}],[/[{}]/,"delimiter.bracket.php"],[/[\[\]]/,"delimiter.array.php"],[/[()]/,"delimiter.parenthesis.php"],[/[ \t\r\n]+/],[/(#|\/\/)$/,"comment.php"],[/(#|\/\/)/,"comment.php","@phpLineComment"],[/\/\*/,"comment.php","@phpComment"],[/"/,"string.php","@phpDoubleQuoteString"],[/'/,"string.php","@phpSingleQuoteString"],[/[\+\-\*\%\&\|\^\~\!\=\<\>\/\?\;\:\.\,\@]/,"delimiter.php"],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float.php"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float.php"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex.php"],[/0[0-7']*[0-7]/,"number.octal.php"],[/0[bB][0-1']*[0-1]/,"number.binary.php"],[/\d[\d']*/,"number.php"],[/\d/,"number.php"]],phpComment:[[/\*\//,"comment.php","@pop"],[/[^*]+/,"comment.php"],[/./,"comment.php"]],phpLineComment:[[/\?>/,{token:"@rematch",next:"@pop"}],[/.$/,"comment.php","@pop"],[/[^?]+$/,"comment.php","@pop"],[/[^?]+/,"comment.php"],[/./,"comment.php"]],phpDoubleQuoteString:[[/[^\\"]+/,"string.php"],[/@escapes/,"string.escape.php"],[/\\./,"string.escape.invalid.php"],[/"/,"string.php","@pop"]],phpSingleQuoteString:[[/[^\\']+/,"string.php"],[/@escapes/,"string.escape.php"],[/\\./,"string.escape.invalid.php"],[/'/,"string.php","@pop"]]},phpKeywords:["abstract","and","array","as","break","callable","case","catch","cfunction","class","clone","const","continue","declare","default","do","else","elseif","enddeclare","endfor","endforeach","endif","endswitch","endwhile","extends","false","final","for","foreach","function","global","goto","if","implements","interface","instanceof","insteadof","namespace","new","null","object","old_function","or","private","protected","public","resource","static","switch","throw","trait","try","true","use","var","while","xor","die","echo","empty","exit","eval","include","include_once","isset","list","require","require_once","return","print","unset","yield","__construct"],phpCompileTimeConstants:["__CLASS__","__DIR__","__FILE__","__LINE__","__NAMESPACE__","__METHOD__","__FUNCTION__","__TRAIT__"],phpPreDefinedVariables:["$GLOBALS","$_SERVER","$_GET","$_POST","$_FILES","$_REQUEST","$_SESSION","$_ENV","$_COOKIE","$php_errormsg","$HTTP_RAW_POST_DATA","$http_response_header","$argc","$argv"],escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/};return l(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/pla/pla.js b/public/vs/basic-languages/pla/pla.js
new file mode 100644
index 0000000..8aec48e
--- /dev/null
+++ b/public/vs/basic-languages/pla/pla.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/pla/pla", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var l=(o,e)=>{for(var n in e)s(o,n,{get:e[n],enumerable:!0})},c=(o,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of r(e))!p.call(o,t)&&t!==n&&s(o,t,{get:()=>e[t],enumerable:!(i=a(e,t))||i.enumerable});return o};var d=o=>c(s({},"__esModule",{value:!0}),o);var u={};l(u,{conf:()=>k,language:()=>m});var k={comments:{lineComment:"#"},brackets:[["[","]"],["<",">"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"<",close:">"},{open:"(",close:")"}],surroundingPairs:[{open:"[",close:"]"},{open:"<",close:">"},{open:"(",close:")"}]},m={defaultToken:"",tokenPostfix:".pla",brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"<",close:">",token:"delimiter.angle"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:[".i",".o",".mv",".ilb",".ob",".label",".type",".phase",".pair",".symbolic",".symbolic-output",".kiss",".p",".e",".end"],comment:/#.*$/,identifier:/[a-zA-Z]+[a-zA-Z0-9_\-]*/,plaContent:/[01\-~\|]+/,tokenizer:{root:[{include:"@whitespace"},[/@comment/,"comment"],[/\.([a-zA-Z_\-]+)/,{cases:{"@eos":{token:"keyword.$1"},"@keywords":{cases:{".type":{token:"keyword.$1",next:"@type"},"@default":{token:"keyword.$1",next:"@keywordArg"}}},"@default":{token:"keyword.$1"}}}],[/@identifier/,"identifier"],[/@plaContent/,"string"]],whitespace:[[/[ \t\r\n]+/,""]],type:[{include:"@whitespace"},[/\w+/,{token:"type",next:"@pop"}]],keywordArg:[[/[ \t\r\n]+/,{cases:{"@eos":{token:"",next:"@pop"},"@default":""}}],[/@comment/,"comment","@pop"],[/[<>()\[\]]/,{cases:{"@eos":{token:"@brackets",next:"@pop"},"@default":"@brackets"}}],[/\-?\d+/,{cases:{"@eos":{token:"number",next:"@pop"},"@default":"number"}}],[/@identifier/,{cases:{"@eos":{token:"identifier",next:"@pop"},"@default":"identifier"}}],[/[;=]/,{cases:{"@eos":{token:"delimiter",next:"@pop"},"@default":"delimiter"}}]]}};return d(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/postiats/postiats.js b/public/vs/basic-languages/postiats/postiats.js
new file mode 100644
index 0000000..919288d
--- /dev/null
+++ b/public/vs/basic-languages/postiats/postiats.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/postiats/postiats", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var i=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var p=(t,e)=>{for(var o in e)i(t,o,{get:e[o],enumerable:!0})},l=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of s(e))!c.call(t,n)&&n!==o&&i(t,n,{get:()=>e[n],enumerable:!(r=a(e,n))||r.enumerable});return t};var d=t=>l(i({},"__esModule",{value:!0}),t);var g={};p(g,{conf:()=>m,language:()=>x});var m={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},x={tokenPostfix:".pats",defaultToken:"invalid",keywords:["abstype","abst0ype","absprop","absview","absvtype","absviewtype","absvt0ype","absviewt0ype","as","and","assume","begin","classdec","datasort","datatype","dataprop","dataview","datavtype","dataviewtype","do","end","extern","extype","extvar","exception","fn","fnx","fun","prfn","prfun","praxi","castfn","if","then","else","ifcase","in","infix","infixl","infixr","prefix","postfix","implmnt","implement","primplmnt","primplement","import","let","local","macdef","macrodef","nonfix","symelim","symintr","overload","of","op","rec","sif","scase","sortdef","sta","stacst","stadef","static","staload","dynload","try","tkindef","typedef","propdef","viewdef","vtypedef","viewtypedef","prval","var","prvar","when","where","with","withtype","withprop","withview","withvtype","withviewtype"],keywords_dlr:["$delay","$ldelay","$arrpsz","$arrptrsize","$d2ctype","$effmask","$effmask_ntm","$effmask_exn","$effmask_ref","$effmask_wrt","$effmask_all","$extern","$extkind","$extype","$extype_struct","$extval","$extfcall","$extmcall","$literal","$myfilename","$mylocation","$myfunction","$lst","$lst_t","$lst_vt","$list","$list_t","$list_vt","$rec","$rec_t","$rec_vt","$record","$record_t","$record_vt","$tup","$tup_t","$tup_vt","$tuple","$tuple_t","$tuple_vt","$break","$continue","$raise","$showtype","$vcopyenv_v","$vcopyenv_vt","$tempenver","$solver_assert","$solver_verify"],keywords_srp:["#if","#ifdef","#ifndef","#then","#elif","#elifdef","#elifndef","#else","#endif","#error","#prerr","#print","#assert","#undef","#define","#include","#require","#pragma","#codegen2","#codegen3"],irregular_keyword_list:["val+","val-","val","case+","case-","case","addr@","addr","fold@","free@","fix@","fix","lam@","lam","llam@","llam","viewt@ype+","viewt@ype-","viewt@ype","viewtype+","viewtype-","viewtype","view+","view-","view@","view","type+","type-","type","vtype+","vtype-","vtype","vt@ype+","vt@ype-","vt@ype","viewt@ype+","viewt@ype-","viewt@ype","viewtype+","viewtype-","viewtype","prop+","prop-","prop","type+","type-","type","t@ype","t@ype+","t@ype-","abst@ype","abstype","absviewt@ype","absvt@ype","for*","for","while*","while"],keywords_types:["bool","double","byte","int","short","char","void","unit","long","float","string","strptr"],keywords_effects:["0","fun","clo","prf","funclo","cloptr","cloref","ref","ntm","1"],operators:["@","!","|","`",":","$",".","=","#","~","..","...","=>","=<>","=/=>","=>>","=/=>>","<",">","><",".<",">.",".<>.","->","-<>"],brackets:[{open:",(",close:")",token:"delimiter.parenthesis"},{open:"`(",close:")",token:"delimiter.parenthesis"},{open:"%(",close:")",token:"delimiter.parenthesis"},{open:"'(",close:")",token:"delimiter.parenthesis"},{open:"'{",close:"}",token:"delimiter.parenthesis"},{open:"@(",close:")",token:"delimiter.parenthesis"},{open:"@{",close:"}",token:"delimiter.brace"},{open:"@[",close:"]",token:"delimiter.square"},{open:"#[",close:"]",token:"delimiter.square"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],symbols:/[=><!~?:&|+\-*\/\^%]+/,IDENTFST:/[a-zA-Z_]/,IDENTRST:/[a-zA-Z0-9_'$]/,symbolic:/[%&+-./:=@~`^|*!$#?<>]/,digit:/[0-9]/,digitseq0:/@digit*/,xdigit:/[0-9A-Za-z]/,xdigitseq0:/@xdigit*/,INTSP:/[lLuU]/,FLOATSP:/[fFlL]/,fexponent:/[eE][+-]?[0-9]+/,fexponent_bin:/[pP][+-]?[0-9]+/,deciexp:/\.[0-9]*@fexponent?/,hexiexp:/\.[0-9a-zA-Z]*@fexponent_bin?/,irregular_keywords:/val[+-]?|case[+-]?|addr\@?|fold\@|free\@|fix\@?|lam\@?|llam\@?|prop[+-]?|type[+-]?|view[+-@]?|viewt@?ype[+-]?|t@?ype[+-]?|v(iew)?t@?ype[+-]?|abst@?ype|absv(iew)?t@?ype|for\*?|while\*?/,ESCHAR:/[ntvbrfa\\\?'"\(\[\{]/,start:"root",tokenizer:{root:[{regex:/[ \t\r\n]+/,action:{token:""}},{regex:/\(\*\)/,action:{token:"invalid"}},{regex:/\(\*/,action:{token:"comment",next:"lexing_COMMENT_block_ml"}},{regex:/\(/,action:"@brackets"},{regex:/\)/,action:"@brackets"},{regex:/\[/,action:"@brackets"},{regex:/\]/,action:"@brackets"},{regex:/\{/,action:"@brackets"},{regex:/\}/,action:"@brackets"},{regex:/,\(/,action:"@brackets"},{regex:/,/,action:{token:"delimiter.comma"}},{regex:/;/,action:{token:"delimiter.semicolon"}},{regex:/@\(/,action:"@brackets"},{regex:/@\[/,action:"@brackets"},{regex:/@\{/,action:"@brackets"},{regex:/:</,action:{token:"keyword",next:"@lexing_EFFECT_commaseq0"}},{regex:/\.@symbolic+/,action:{token:"identifier.sym"}},{regex:/\.@digit*@fexponent@FLOATSP*/,action:{token:"number.float"}},{regex:/\.@digit+/,action:{token:"number.float"}},{regex:/\$@IDENTFST@IDENTRST*/,action:{cases:{"@keywords_dlr":{token:"keyword.dlr"},"@default":{token:"namespace"}}}},{regex:/\#@IDENTFST@IDENTRST*/,action:{cases:{"@keywords_srp":{token:"keyword.srp"},"@default":{token:"identifier"}}}},{regex:/%\(/,action:{token:"delimiter.parenthesis"}},{regex:/^%{(#|\^|\$)?/,action:{token:"keyword",next:"@lexing_EXTCODE",nextEmbedded:"text/javascript"}},{regex:/^%}/,action:{token:"keyword"}},{regex:/'\(/,action:{token:"delimiter.parenthesis"}},{regex:/'\[/,action:{token:"delimiter.bracket"}},{regex:/'\{/,action:{token:"delimiter.brace"}},[/(')(\\@ESCHAR|\\[xX]@xdigit+|\\@digit+)(')/,["string","string.escape","string"]],[/'[^\\']'/,"string"],[/"/,"string.quote","@lexing_DQUOTE"],{regex:/`\(/,action:"@brackets"},{regex:/\\/,action:{token:"punctuation"}},{regex:/@irregular_keywords(?!@IDENTRST)/,action:{token:"keyword"}},{regex:/@IDENTFST@IDENTRST*[<!\[]?/,action:{cases:{"@keywords":{token:"keyword"},"@keywords_types":{token:"type"},"@default":{token:"identifier"}}}},{regex:/\/\/\/\//,action:{token:"comment",next:"@lexing_COMMENT_rest"}},{regex:/\/\/.*$/,action:{token:"comment"}},{regex:/\/\*/,action:{token:"comment",next:"@lexing_COMMENT_block_c"}},{regex:/-<|=</,action:{token:"keyword",next:"@lexing_EFFECT_commaseq0"}},{regex:/@symbolic+/,action:{cases:{"@operators":"keyword","@default":"operator"}}},{regex:/0[xX]@xdigit+(@hexiexp|@fexponent_bin)@FLOATSP*/,action:{token:"number.float"}},{regex:/0[xX]@xdigit+@INTSP*/,action:{token:"number.hex"}},{regex:/0[0-7]+(?![0-9])@INTSP*/,action:{token:"number.octal"}},{regex:/@digit+(@fexponent|@deciexp)@FLOATSP*/,action:{token:"number.float"}},{regex:/@digit@digitseq0@INTSP*/,action:{token:"number.decimal"}},{regex:/@digit+@INTSP*/,action:{token:"number"}}],lexing_COMMENT_block_ml:[[/[^\(\*]+/,"comment"],[/\(\*/,"comment","@push"],[/\(\*/,"comment.invalid"],[/\*\)/,"comment","@pop"],[/\*/,"comment"]],lexing_COMMENT_block_c:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],lexing_COMMENT_rest:[[/$/,"comment","@pop"],[/.*/,"comment"]],lexing_EFFECT_commaseq0:[{regex:/@IDENTFST@IDENTRST+|@digit+/,action:{cases:{"@keywords_effects":{token:"type.effect"},"@default":{token:"identifier"}}}},{regex:/,/,action:{token:"punctuation"}},{regex:/>/,action:{token:"@rematch",next:"@pop"}}],lexing_EXTCODE:[{regex:/^%}/,action:{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}},{regex:/[^%]+/,action:""}],lexing_DQUOTE:[{regex:/"/,action:{token:"string.quote",next:"@pop"}},{regex:/(\{\$)(@IDENTFST@IDENTRST*)(\})/,action:[{token:"string.escape"},{token:"identifier"},{token:"string.escape"}]},{regex:/\\$/,action:{token:"string.escape"}},{regex:/\\(@ESCHAR|[xX]@xdigit+|@digit+)/,action:{token:"string.escape"}},{regex:/[^\\"]+/,action:{token:"string"}}]}};return d(g);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/powerquery/powerquery.js b/public/vs/basic-languages/powerquery/powerquery.js
new file mode 100644
index 0000000..573adbd
--- /dev/null
+++ b/public/vs/basic-languages/powerquery/powerquery.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/powerquery/powerquery", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var i=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var T=(t,e)=>{for(var n in e)i(t,n,{get:e[n],enumerable:!0})},m=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of s(e))!l.call(t,a)&&a!==n&&i(t,a,{get:()=>e[a],enumerable:!(o=r(e,a))||o.enumerable});return t};var u=t=>m(i({},"__esModule",{value:!0}),t);var b={};T(b,{conf:()=>d,language:()=>c});var d={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["[","]"],["(",")"],["{","}"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment","identifier"]},{open:"[",close:"]",notIn:["string","comment","identifier"]},{open:"(",close:")",notIn:["string","comment","identifier"]},{open:"{",close:"}",notIn:["string","comment","identifier"]}]},c={defaultToken:"",tokenPostfix:".pq",ignoreCase:!1,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"{",close:"}",token:"delimiter.brackets"},{open:"(",close:")",token:"delimiter.parenthesis"}],operatorKeywords:["and","not","or"],keywords:["as","each","else","error","false","if","in","is","let","meta","otherwise","section","shared","then","true","try","type"],constructors:["#binary","#date","#datetime","#datetimezone","#duration","#table","#time"],constants:["#infinity","#nan","#sections","#shared"],typeKeywords:["action","any","anynonnull","none","null","logical","number","time","date","datetime","datetimezone","duration","text","binary","list","record","table","function"],builtinFunctions:["Access.Database","Action.Return","Action.Sequence","Action.Try","ActiveDirectory.Domains","AdoDotNet.DataSource","AdoDotNet.Query","AdobeAnalytics.Cubes","AnalysisServices.Database","AnalysisServices.Databases","AzureStorage.BlobContents","AzureStorage.Blobs","AzureStorage.Tables","Binary.Buffer","Binary.Combine","Binary.Compress","Binary.Decompress","Binary.End","Binary.From","Binary.FromList","Binary.FromText","Binary.InferContentType","Binary.Length","Binary.ToList","Binary.ToText","BinaryFormat.7BitEncodedSignedInteger","BinaryFormat.7BitEncodedUnsignedInteger","BinaryFormat.Binary","BinaryFormat.Byte","BinaryFormat.ByteOrder","BinaryFormat.Choice","BinaryFormat.Decimal","BinaryFormat.Double","BinaryFormat.Group","BinaryFormat.Length","BinaryFormat.List","BinaryFormat.Null","BinaryFormat.Record","BinaryFormat.SignedInteger16","BinaryFormat.SignedInteger32","BinaryFormat.SignedInteger64","BinaryFormat.Single","BinaryFormat.Text","BinaryFormat.Transform","BinaryFormat.UnsignedInteger16","BinaryFormat.UnsignedInteger32","BinaryFormat.UnsignedInteger64","Byte.From","Character.FromNumber","Character.ToNumber","Combiner.CombineTextByDelimiter","Combiner.CombineTextByEachDelimiter","Combiner.CombineTextByLengths","Combiner.CombineTextByPositions","Combiner.CombineTextByRanges","Comparer.Equals","Comparer.FromCulture","Comparer.Ordinal","Comparer.OrdinalIgnoreCase","Csv.Document","Cube.AddAndExpandDimensionColumn","Cube.AddMeasureColumn","Cube.ApplyParameter","Cube.AttributeMemberId","Cube.AttributeMemberProperty","Cube.CollapseAndRemoveColumns","Cube.Dimensions","Cube.DisplayFolders","Cube.Measures","Cube.Parameters","Cube.Properties","Cube.PropertyKey","Cube.ReplaceDimensions","Cube.Transform","Currency.From","DB2.Database","Date.AddDays","Date.AddMonths","Date.AddQuarters","Date.AddWeeks","Date.AddYears","Date.Day","Date.DayOfWeek","Date.DayOfWeekName","Date.DayOfYear","Date.DaysInMonth","Date.EndOfDay","Date.EndOfMonth","Date.EndOfQuarter","Date.EndOfWeek","Date.EndOfYear","Date.From","Date.FromText","Date.IsInCurrentDay","Date.IsInCurrentMonth","Date.IsInCurrentQuarter","Date.IsInCurrentWeek","Date.IsInCurrentYear","Date.IsInNextDay","Date.IsInNextMonth","Date.IsInNextNDays","Date.IsInNextNMonths","Date.IsInNextNQuarters","Date.IsInNextNWeeks","Date.IsInNextNYears","Date.IsInNextQuarter","Date.IsInNextWeek","Date.IsInNextYear","Date.IsInPreviousDay","Date.IsInPreviousMonth","Date.IsInPreviousNDays","Date.IsInPreviousNMonths","Date.IsInPreviousNQuarters","Date.IsInPreviousNWeeks","Date.IsInPreviousNYears","Date.IsInPreviousQuarter","Date.IsInPreviousWeek","Date.IsInPreviousYear","Date.IsInYearToDate","Date.IsLeapYear","Date.Month","Date.MonthName","Date.QuarterOfYear","Date.StartOfDay","Date.StartOfMonth","Date.StartOfQuarter","Date.StartOfWeek","Date.StartOfYear","Date.ToRecord","Date.ToText","Date.WeekOfMonth","Date.WeekOfYear","Date.Year","DateTime.AddZone","DateTime.Date","DateTime.FixedLocalNow","DateTime.From","DateTime.FromFileTime","DateTime.FromText","DateTime.IsInCurrentHour","DateTime.IsInCurrentMinute","DateTime.IsInCurrentSecond","DateTime.IsInNextHour","DateTime.IsInNextMinute","DateTime.IsInNextNHours","DateTime.IsInNextNMinutes","DateTime.IsInNextNSeconds","DateTime.IsInNextSecond","DateTime.IsInPreviousHour","DateTime.IsInPreviousMinute","DateTime.IsInPreviousNHours","DateTime.IsInPreviousNMinutes","DateTime.IsInPreviousNSeconds","DateTime.IsInPreviousSecond","DateTime.LocalNow","DateTime.Time","DateTime.ToRecord","DateTime.ToText","DateTimeZone.FixedLocalNow","DateTimeZone.FixedUtcNow","DateTimeZone.From","DateTimeZone.FromFileTime","DateTimeZone.FromText","DateTimeZone.LocalNow","DateTimeZone.RemoveZone","DateTimeZone.SwitchZone","DateTimeZone.ToLocal","DateTimeZone.ToRecord","DateTimeZone.ToText","DateTimeZone.ToUtc","DateTimeZone.UtcNow","DateTimeZone.ZoneHours","DateTimeZone.ZoneMinutes","Decimal.From","Diagnostics.ActivityId","Diagnostics.Trace","DirectQueryCapabilities.From","Double.From","Duration.Days","Duration.From","Duration.FromText","Duration.Hours","Duration.Minutes","Duration.Seconds","Duration.ToRecord","Duration.ToText","Duration.TotalDays","Duration.TotalHours","Duration.TotalMinutes","Duration.TotalSeconds","Embedded.Value","Error.Record","Excel.CurrentWorkbook","Excel.Workbook","Exchange.Contents","Expression.Constant","Expression.Evaluate","Expression.Identifier","Facebook.Graph","File.Contents","Folder.Contents","Folder.Files","Function.From","Function.Invoke","Function.InvokeAfter","Function.IsDataSource","GoogleAnalytics.Accounts","Guid.From","HdInsight.Containers","HdInsight.Contents","HdInsight.Files","Hdfs.Contents","Hdfs.Files","Informix.Database","Int16.From","Int32.From","Int64.From","Int8.From","ItemExpression.From","Json.Document","Json.FromValue","Lines.FromBinary","Lines.FromText","Lines.ToBinary","Lines.ToText","List.Accumulate","List.AllTrue","List.Alternate","List.AnyTrue","List.Average","List.Buffer","List.Combine","List.Contains","List.ContainsAll","List.ContainsAny","List.Count","List.Covariance","List.DateTimeZones","List.DateTimes","List.Dates","List.Difference","List.Distinct","List.Durations","List.FindText","List.First","List.FirstN","List.Generate","List.InsertRange","List.Intersect","List.IsDistinct","List.IsEmpty","List.Last","List.LastN","List.MatchesAll","List.MatchesAny","List.Max","List.MaxN","List.Median","List.Min","List.MinN","List.Mode","List.Modes","List.NonNullCount","List.Numbers","List.PositionOf","List.PositionOfAny","List.Positions","List.Product","List.Random","List.Range","List.RemoveFirstN","List.RemoveItems","List.RemoveLastN","List.RemoveMatchingItems","List.RemoveNulls","List.RemoveRange","List.Repeat","List.ReplaceMatchingItems","List.ReplaceRange","List.ReplaceValue","List.Reverse","List.Select","List.Single","List.SingleOrDefault","List.Skip","List.Sort","List.StandardDeviation","List.Sum","List.Times","List.Transform","List.TransformMany","List.Union","List.Zip","Logical.From","Logical.FromText","Logical.ToText","MQ.Queue","MySQL.Database","Number.Abs","Number.Acos","Number.Asin","Number.Atan","Number.Atan2","Number.BitwiseAnd","Number.BitwiseNot","Number.BitwiseOr","Number.BitwiseShiftLeft","Number.BitwiseShiftRight","Number.BitwiseXor","Number.Combinations","Number.Cos","Number.Cosh","Number.Exp","Number.Factorial","Number.From","Number.FromText","Number.IntegerDivide","Number.IsEven","Number.IsNaN","Number.IsOdd","Number.Ln","Number.Log","Number.Log10","Number.Mod","Number.Permutations","Number.Power","Number.Random","Number.RandomBetween","Number.Round","Number.RoundAwayFromZero","Number.RoundDown","Number.RoundTowardZero","Number.RoundUp","Number.Sign","Number.Sin","Number.Sinh","Number.Sqrt","Number.Tan","Number.Tanh","Number.ToText","OData.Feed","Odbc.DataSource","Odbc.Query","OleDb.DataSource","OleDb.Query","Oracle.Database","Percentage.From","PostgreSQL.Database","RData.FromBinary","Record.AddField","Record.Combine","Record.Field","Record.FieldCount","Record.FieldNames","Record.FieldOrDefault","Record.FieldValues","Record.FromList","Record.FromTable","Record.HasFields","Record.RemoveFields","Record.RenameFields","Record.ReorderFields","Record.SelectFields","Record.ToList","Record.ToTable","Record.TransformFields","Replacer.ReplaceText","Replacer.ReplaceValue","RowExpression.Column","RowExpression.From","Salesforce.Data","Salesforce.Reports","SapBusinessWarehouse.Cubes","SapHana.Database","SharePoint.Contents","SharePoint.Files","SharePoint.Tables","Single.From","Soda.Feed","Splitter.SplitByNothing","Splitter.SplitTextByAnyDelimiter","Splitter.SplitTextByDelimiter","Splitter.SplitTextByEachDelimiter","Splitter.SplitTextByLengths","Splitter.SplitTextByPositions","Splitter.SplitTextByRanges","Splitter.SplitTextByRepeatedLengths","Splitter.SplitTextByWhitespace","Sql.Database","Sql.Databases","SqlExpression.SchemaFrom","SqlExpression.ToExpression","Sybase.Database","Table.AddColumn","Table.AddIndexColumn","Table.AddJoinColumn","Table.AddKey","Table.AggregateTableColumn","Table.AlternateRows","Table.Buffer","Table.Column","Table.ColumnCount","Table.ColumnNames","Table.ColumnsOfType","Table.Combine","Table.CombineColumns","Table.Contains","Table.ContainsAll","Table.ContainsAny","Table.DemoteHeaders","Table.Distinct","Table.DuplicateColumn","Table.ExpandListColumn","Table.ExpandRecordColumn","Table.ExpandTableColumn","Table.FillDown","Table.FillUp","Table.FilterWithDataTable","Table.FindText","Table.First","Table.FirstN","Table.FirstValue","Table.FromColumns","Table.FromList","Table.FromPartitions","Table.FromRecords","Table.FromRows","Table.FromValue","Table.Group","Table.HasColumns","Table.InsertRows","Table.IsDistinct","Table.IsEmpty","Table.Join","Table.Keys","Table.Last","Table.LastN","Table.MatchesAllRows","Table.MatchesAnyRows","Table.Max","Table.MaxN","Table.Min","Table.MinN","Table.NestedJoin","Table.Partition","Table.PartitionValues","Table.Pivot","Table.PositionOf","Table.PositionOfAny","Table.PrefixColumns","Table.Profile","Table.PromoteHeaders","Table.Range","Table.RemoveColumns","Table.RemoveFirstN","Table.RemoveLastN","Table.RemoveMatchingRows","Table.RemoveRows","Table.RemoveRowsWithErrors","Table.RenameColumns","Table.ReorderColumns","Table.Repeat","Table.ReplaceErrorValues","Table.ReplaceKeys","Table.ReplaceMatchingRows","Table.ReplaceRelationshipIdentity","Table.ReplaceRows","Table.ReplaceValue","Table.ReverseRows","Table.RowCount","Table.Schema","Table.SelectColumns","Table.SelectRows","Table.SelectRowsWithErrors","Table.SingleRow","Table.Skip","Table.Sort","Table.SplitColumn","Table.ToColumns","Table.ToList","Table.ToRecords","Table.ToRows","Table.TransformColumnNames","Table.TransformColumnTypes","Table.TransformColumns","Table.TransformRows","Table.Transpose","Table.Unpivot","Table.UnpivotOtherColumns","Table.View","Table.ViewFunction","TableAction.DeleteRows","TableAction.InsertRows","TableAction.UpdateRows","Tables.GetRelationships","Teradata.Database","Text.AfterDelimiter","Text.At","Text.BeforeDelimiter","Text.BetweenDelimiters","Text.Clean","Text.Combine","Text.Contains","Text.End","Text.EndsWith","Text.Format","Text.From","Text.FromBinary","Text.Insert","Text.Length","Text.Lower","Text.Middle","Text.NewGuid","Text.PadEnd","Text.PadStart","Text.PositionOf","Text.PositionOfAny","Text.Proper","Text.Range","Text.Remove","Text.RemoveRange","Text.Repeat","Text.Replace","Text.ReplaceRange","Text.Select","Text.Split","Text.SplitAny","Text.Start","Text.StartsWith","Text.ToBinary","Text.ToList","Text.Trim","Text.TrimEnd","Text.TrimStart","Text.Upper","Time.EndOfHour","Time.From","Time.FromText","Time.Hour","Time.Minute","Time.Second","Time.StartOfHour","Time.ToRecord","Time.ToText","Type.AddTableKey","Type.ClosedRecord","Type.Facets","Type.ForFunction","Type.ForRecord","Type.FunctionParameters","Type.FunctionRequiredParameters","Type.FunctionReturn","Type.Is","Type.IsNullable","Type.IsOpenRecord","Type.ListItem","Type.NonNullable","Type.OpenRecord","Type.RecordFields","Type.ReplaceFacets","Type.ReplaceTableKeys","Type.TableColumn","Type.TableKeys","Type.TableRow","Type.TableSchema","Type.Union","Uri.BuildQueryString","Uri.Combine","Uri.EscapeDataString","Uri.Parts","Value.Add","Value.As","Value.Compare","Value.Divide","Value.Equals","Value.Firewall","Value.FromText","Value.Is","Value.Metadata","Value.Multiply","Value.NativeQuery","Value.NullableEquals","Value.RemoveMetadata","Value.ReplaceMetadata","Value.ReplaceType","Value.Subtract","Value.Type","ValueAction.NativeStatement","ValueAction.Replace","Variable.Value","Web.Contents","Web.Page","WebAction.Request","Xml.Document","Xml.Tables"],builtinConstants:["BinaryEncoding.Base64","BinaryEncoding.Hex","BinaryOccurrence.Optional","BinaryOccurrence.Repeating","BinaryOccurrence.Required","ByteOrder.BigEndian","ByteOrder.LittleEndian","Compression.Deflate","Compression.GZip","CsvStyle.QuoteAfterDelimiter","CsvStyle.QuoteAlways","Culture.Current","Day.Friday","Day.Monday","Day.Saturday","Day.Sunday","Day.Thursday","Day.Tuesday","Day.Wednesday","ExtraValues.Error","ExtraValues.Ignore","ExtraValues.List","GroupKind.Global","GroupKind.Local","JoinAlgorithm.Dynamic","JoinAlgorithm.LeftHash","JoinAlgorithm.LeftIndex","JoinAlgorithm.PairwiseHash","JoinAlgorithm.RightHash","JoinAlgorithm.RightIndex","JoinAlgorithm.SortMerge","JoinKind.FullOuter","JoinKind.Inner","JoinKind.LeftAnti","JoinKind.LeftOuter","JoinKind.RightAnti","JoinKind.RightOuter","JoinSide.Left","JoinSide.Right","MissingField.Error","MissingField.Ignore","MissingField.UseNull","Number.E","Number.Epsilon","Number.NaN","Number.NegativeInfinity","Number.PI","Number.PositiveInfinity","Occurrence.All","Occurrence.First","Occurrence.Last","Occurrence.Optional","Occurrence.Repeating","Occurrence.Required","Order.Ascending","Order.Descending","Precision.Decimal","Precision.Double","QuoteStyle.Csv","QuoteStyle.None","RelativePosition.FromEnd","RelativePosition.FromStart","RoundingMode.AwayFromZero","RoundingMode.Down","RoundingMode.ToEven","RoundingMode.TowardZero","RoundingMode.Up","SapHanaDistribution.All","SapHanaDistribution.Connection","SapHanaDistribution.Off","SapHanaDistribution.Statement","SapHanaRangeOperator.Equals","SapHanaRangeOperator.GreaterThan","SapHanaRangeOperator.GreaterThanOrEquals","SapHanaRangeOperator.LessThan","SapHanaRangeOperator.LessThanOrEquals","SapHanaRangeOperator.NotEquals","TextEncoding.Ascii","TextEncoding.BigEndianUnicode","TextEncoding.Unicode","TextEncoding.Utf16","TextEncoding.Utf8","TextEncoding.Windows","TraceLevel.Critical","TraceLevel.Error","TraceLevel.Information","TraceLevel.Verbose","TraceLevel.Warning","WebMethod.Delete","WebMethod.Get","WebMethod.Head","WebMethod.Patch","WebMethod.Post","WebMethod.Put"],builtinTypes:["Action.Type","Any.Type","Binary.Type","BinaryEncoding.Type","BinaryOccurrence.Type","Byte.Type","ByteOrder.Type","Character.Type","Compression.Type","CsvStyle.Type","Currency.Type","Date.Type","DateTime.Type","DateTimeZone.Type","Day.Type","Decimal.Type","Double.Type","Duration.Type","ExtraValues.Type","Function.Type","GroupKind.Type","Guid.Type","Int16.Type","Int32.Type","Int64.Type","Int8.Type","JoinAlgorithm.Type","JoinKind.Type","JoinSide.Type","List.Type","Logical.Type","MissingField.Type","None.Type","Null.Type","Number.Type","Occurrence.Type","Order.Type","Password.Type","Percentage.Type","Precision.Type","QuoteStyle.Type","Record.Type","RelativePosition.Type","RoundingMode.Type","SapHanaDistribution.Type","SapHanaRangeOperator.Type","Single.Type","Table.Type","Text.Type","TextEncoding.Type","Time.Type","TraceLevel.Type","Type.Type","Uri.Type","WebMethod.Type"],tokenizer:{root:[[/#"[\w \.]+"/,"identifier.quote"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/\d+([eE][\-+]?\d+)?/,"number"],[/(#?[a-z]+)\b/,{cases:{"@typeKeywords":"type","@keywords":"keyword","@constants":"constant","@constructors":"constructor","@operatorKeywords":"operators","@default":"identifier"}}],[/\b([A-Z][a-zA-Z0-9]+\.Type)\b/,{cases:{"@builtinTypes":"type","@default":"identifier"}}],[/\b([A-Z][a-zA-Z0-9]+\.[A-Z][a-zA-Z0-9]+)\b/,{cases:{"@builtinFunctions":"keyword.function","@builtinConstants":"constant","@default":"identifier"}}],[/\b([a-zA-Z_][\w\.]*)\b/,"identifier"],{include:"@whitespace"},{include:"@comments"},{include:"@strings"},[/[{}()\[\]]/,"@brackets"],[/([=\+<>\-\*&@\?\/!])|([<>]=)|(<>)|(=>)|(\.\.\.)|(\.\.)/,"operators"],[/[,;]/,"delimiter"]],whitespace:[[/\s+/,"white"]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],strings:[['"',"string","@string"]],string:[['""',"string.escape"],['"',"string","@pop"],[".","string"]]}};return u(b);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/powershell/powershell.js b/public/vs/basic-languages/powershell/powershell.js
new file mode 100644
index 0000000..13a5fa0
--- /dev/null
+++ b/public/vs/basic-languages/powershell/powershell.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/powershell/powershell", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(n,e)=>{for(var t in e)o(n,t,{get:e[t],enumerable:!0})},g=(n,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of i(e))!l.call(n,s)&&s!==t&&o(n,s,{get:()=>e[s],enumerable:!(a=r(e,s))||a.enumerable});return n};var p=n=>g(o({},"__esModule",{value:!0}),n);var u={};c(u,{conf:()=>d,language:()=>m});var d={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#%\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"#",blockComment:["<#","#>"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},m={defaultToken:"",ignoreCase:!0,tokenPostfix:".ps1",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],keywords:["begin","break","catch","class","continue","data","define","do","dynamicparam","else","elseif","end","exit","filter","finally","for","foreach","from","function","if","in","param","process","return","switch","throw","trap","try","until","using","var","while","workflow","parallel","sequence","inlinescript","configuration"],helpKeywords:/SYNOPSIS|DESCRIPTION|PARAMETER|EXAMPLE|INPUTS|OUTPUTS|NOTES|LINK|COMPONENT|ROLE|FUNCTIONALITY|FORWARDHELPTARGETNAME|FORWARDHELPCATEGORY|REMOTEHELPRUNSPACE|EXTERNALHELP/,symbols:/[=><!~?&%|+\-*\/\^;\.,]+/,escapes:/`(?:[abfnrtv\\"'$]|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/[a-zA-Z_][\w-]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":""}}],[/[ \t\r\n]+/,""],[/^:\w*/,"metatag"],[/\$(\{((global|local|private|script|using):)?[\w]+\}|((global|local|private|script|using):)?[\w]+)/,"variable"],[/<#/,"comment","@comment"],[/#.*$/,"comment"],[/[{}()\[\]]/,"@brackets"],[/@symbols/,"delimiter"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F_]*[0-9a-fA-F]/,"number.hex"],[/\d+?/,"number"],[/[;,.]/,"delimiter"],[/\@"/,"string",'@herestring."'],[/\@'/,"string","@herestring.'"],[/"/,{cases:{"@eos":"string","@default":{token:"string",next:'@string."'}}}],[/'/,{cases:{"@eos":"string","@default":{token:"string",next:"@string.'"}}}]],string:[[/[^"'\$`]+/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/@escapes/,{cases:{"@eos":{token:"string.escape",next:"@popall"},"@default":"string.escape"}}],[/`./,{cases:{"@eos":{token:"string.escape.invalid",next:"@popall"},"@default":"string.escape.invalid"}}],[/\$[\w]+$/,{cases:{'$S2=="':{token:"variable",next:"@popall"},"@default":{token:"string",next:"@popall"}}}],[/\$[\w]+/,{cases:{'$S2=="':"variable","@default":"string"}}],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}}}]],herestring:[[/^\s*(["'])@/,{cases:{"$1==$S2":{token:"string",next:"@pop"},"@default":"string"}}],[/[^\$`]+/,"string"],[/@escapes/,"string.escape"],[/`./,"string.escape.invalid"],[/\$[\w]+/,{cases:{'$S2=="':"variable","@default":"string"}}]],comment:[[/[^#\.]+/,"comment"],[/#>/,"comment","@pop"],[/(\.)(@helpKeywords)(?!\w)/,{token:"comment.keyword.$2"}],[/[\.#]/,"comment"]]}};return p(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/protobuf/protobuf.js b/public/vs/basic-languages/protobuf/protobuf.js
new file mode 100644
index 0000000..f43ece3
--- /dev/null
+++ b/public/vs/basic-languages/protobuf/protobuf.js
@@ -0,0 +1,11 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/protobuf/protobuf", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var p=(t,e)=>{for(var i in e)o(t,i,{get:e[i],enumerable:!0})},d=(t,e,i,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of c(e))!a.call(t,n)&&n!==i&&o(t,n,{get:()=>e[n],enumerable:!(s=r(e,n))||s.enumerable});return t};var l=t=>d(o({},"__esModule",{value:!0}),t);var m={};p(m,{conf:()=>u,language:()=>f});var k=["true","false"],u={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:'"',close:'"'},{open:"'",close:"'"}],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string"]}],autoCloseBefore:`.,=}])>' 
+	`,indentationRules:{increaseIndentPattern:new RegExp("^((?!\\/\\/).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$"),decreaseIndentPattern:new RegExp("^((?!.*?\\/\\*).*\\*/)?\\s*[\\}\\]].*$")}},f={defaultToken:"",tokenPostfix:".proto",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],symbols:/[=><!~?:&|+\-*/^%]+/,keywords:["syntax","import","weak","public","package","option","repeated","oneof","map","reserved","to","max","enum","message","service","rpc","stream","returns","package","optional","true","false"],builtinTypes:["double","float","int32","int64","uint32","uint64","sint32","sint64","fixed32","fixed64","sfixed32","sfixed64","bool","string","bytes"],operators:["=","+","-"],namedLiterals:k,escapes:"\\\\(u{[0-9A-Fa-f]+}|n|r|t|\\\\|'|\\${)",identifier:/[a-zA-Z]\w*/,fullIdentifier:/@identifier(?:\s*\.\s*@identifier)*/,optionName:/(?:@identifier|\(\s*@fullIdentifier\s*\))(?:\s*\.\s*@identifier)*/,messageName:/@identifier/,enumName:/@identifier/,messageType:/\.?\s*(?:@identifier\s*\.\s*)*@messageName/,enumType:/\.?\s*(?:@identifier\s*\.\s*)*@enumName/,floatLit:/[0-9]+\s*\.\s*[0-9]*(?:@exponent)?|[0-9]+@exponent|\.[0-9]+(?:@exponent)?/,exponent:/[eE]\s*[+-]?\s*[0-9]+/,boolLit:/true\b|false\b/,decimalLit:/[1-9][0-9]*/,octalLit:/0[0-7]*/,hexLit:/0[xX][0-9a-fA-F]+/,type:/double|float|int32|int64|uint32|uint64|sint32|sint64|fixed32|fixed64|sfixed32|sfixed64|bool|string|bytes|@messageType|@enumType/,keyType:/int32|int64|uint32|uint64|sint32|sint64|fixed32|fixed64|sfixed32|sfixed64|bool|string/,tokenizer:{root:[{include:"@whitespace"},[/syntax/,"keyword"],[/=/,"operators"],[/;/,"delimiter"],[/(")(proto3)(")/,["string.quote","string",{token:"string.quote",switchTo:"@topLevel.proto3"}]],[/(")(proto2)(")/,["string.quote","string",{token:"string.quote",switchTo:"@topLevel.proto2"}]],[/.*?/,{token:"",switchTo:"@topLevel.proto2"}]],topLevel:[{include:"@whitespace"},{include:"@constant"},[/=/,"operators"],[/[;.]/,"delimiter"],[/@fullIdentifier/,{cases:{option:{token:"keyword",next:"@option.$S2"},enum:{token:"keyword",next:"@enumDecl.$S2"},message:{token:"keyword",next:"@messageDecl.$S2"},service:{token:"keyword",next:"@serviceDecl.$S2"},extend:{cases:{"$S2==proto2":{token:"keyword",next:"@extendDecl.$S2"}}},"@keywords":"keyword","@default":"identifier"}}]],enumDecl:[{include:"@whitespace"},[/@identifier/,"type.identifier"],[/{/,{token:"@brackets",bracket:"@open",switchTo:"@enumBody.$S2"}]],enumBody:[{include:"@whitespace"},{include:"@constant"},[/=/,"operators"],[/;/,"delimiter"],[/option\b/,"keyword","@option.$S2"],[/@identifier/,"identifier"],[/\[/,{token:"@brackets",bracket:"@open",next:"@options.$S2"}],[/}/,{token:"@brackets",bracket:"@close",next:"@pop"}]],messageDecl:[{include:"@whitespace"},[/@identifier/,"type.identifier"],[/{/,{token:"@brackets",bracket:"@open",switchTo:"@messageBody.$S2"}]],messageBody:[{include:"@whitespace"},{include:"@constant"},[/=/,"operators"],[/;/,"delimiter"],["(map)(s*)(<)",["keyword","white",{token:"@brackets",bracket:"@open",next:"@map.$S2"}]],[/@identifier/,{cases:{option:{token:"keyword",next:"@option.$S2"},enum:{token:"keyword",next:"@enumDecl.$S2"},message:{token:"keyword",next:"@messageDecl.$S2"},oneof:{token:"keyword",next:"@oneofDecl.$S2"},extensions:{cases:{"$S2==proto2":{token:"keyword",next:"@reserved.$S2"}}},reserved:{token:"keyword",next:"@reserved.$S2"},"(?:repeated|optional)":{token:"keyword",next:"@field.$S2"},required:{cases:{"$S2==proto2":{token:"keyword",next:"@field.$S2"}}},"$S2==proto3":{token:"@rematch",next:"@field.$S2"}}}],[/\[/,{token:"@brackets",bracket:"@open",next:"@options.$S2"}],[/}/,{token:"@brackets",bracket:"@close",next:"@pop"}]],extendDecl:[{include:"@whitespace"},[/@identifier/,"type.identifier"],[/{/,{token:"@brackets",bracket:"@open",switchTo:"@extendBody.$S2"}]],extendBody:[{include:"@whitespace"},{include:"@constant"},[/;/,"delimiter"],[/(?:repeated|optional|required)/,"keyword","@field.$S2"],[/\[/,{token:"@brackets",bracket:"@open",next:"@options.$S2"}],[/}/,{token:"@brackets",bracket:"@close",next:"@pop"}]],options:[{include:"@whitespace"},{include:"@constant"},[/;/,"delimiter"],[/@optionName/,"annotation"],[/[()]/,"annotation.brackets"],[/=/,"operator"],[/\]/,{token:"@brackets",bracket:"@close",next:"@pop"}]],option:[{include:"@whitespace"},[/@optionName/,"annotation"],[/[()]/,"annotation.brackets"],[/=/,"operator","@pop"]],oneofDecl:[{include:"@whitespace"},[/@identifier/,"identifier"],[/{/,{token:"@brackets",bracket:"@open",switchTo:"@oneofBody.$S2"}]],oneofBody:[{include:"@whitespace"},{include:"@constant"},[/;/,"delimiter"],[/(@identifier)(\s*)(=)/,["identifier","white","delimiter"]],[/@fullIdentifier|\./,{cases:{"@builtinTypes":"keyword","@default":"type.identifier"}}],[/\[/,{token:"@brackets",bracket:"@open",next:"@options.$S2"}],[/}/,{token:"@brackets",bracket:"@close",next:"@pop"}]],reserved:[{include:"@whitespace"},[/,/,"delimiter"],[/;/,"delimiter","@pop"],{include:"@constant"},[/to\b|max\b/,"keyword"]],map:[{include:"@whitespace"},[/@fullIdentifier|\./,{cases:{"@builtinTypes":"keyword","@default":"type.identifier"}}],[/,/,"delimiter"],[/>/,{token:"@brackets",bracket:"@close",switchTo:"identifier"}]],field:[{include:"@whitespace"},["group",{cases:{"$S2==proto2":{token:"keyword",switchTo:"@groupDecl.$S2"}}}],[/(@identifier)(\s*)(=)/,["identifier","white",{token:"delimiter",next:"@pop"}]],[/@fullIdentifier|\./,{cases:{"@builtinTypes":"keyword","@default":"type.identifier"}}]],groupDecl:[{include:"@whitespace"},[/@identifier/,"identifier"],["=","operator"],[/{/,{token:"@brackets",bracket:"@open",switchTo:"@messageBody.$S2"}],{include:"@constant"}],type:[{include:"@whitespace"},[/@identifier/,"type.identifier","@pop"],[/./,"delimiter"]],identifier:[{include:"@whitespace"},[/@identifier/,"identifier","@pop"]],serviceDecl:[{include:"@whitespace"},[/@identifier/,"identifier"],[/{/,{token:"@brackets",bracket:"@open",switchTo:"@serviceBody.$S2"}]],serviceBody:[{include:"@whitespace"},{include:"@constant"},[/;/,"delimiter"],[/option\b/,"keyword","@option.$S2"],[/rpc\b/,"keyword","@rpc.$S2"],[/\[/,{token:"@brackets",bracket:"@open",next:"@options.$S2"}],[/}/,{token:"@brackets",bracket:"@close",next:"@pop"}]],rpc:[{include:"@whitespace"},[/@identifier/,"identifier"],[/\(/,{token:"@brackets",bracket:"@open",switchTo:"@request.$S2"}],[/{/,{token:"@brackets",bracket:"@open",next:"@methodOptions.$S2"}],[/;/,"delimiter","@pop"]],request:[{include:"@whitespace"},[/@messageType/,{cases:{stream:{token:"keyword",next:"@type.$S2"},"@default":"type.identifier"}}],[/\)/,{token:"@brackets",bracket:"@close",switchTo:"@returns.$S2"}]],returns:[{include:"@whitespace"},[/returns\b/,"keyword"],[/\(/,{token:"@brackets",bracket:"@open",switchTo:"@response.$S2"}]],response:[{include:"@whitespace"},[/@messageType/,{cases:{stream:{token:"keyword",next:"@type.$S2"},"@default":"type.identifier"}}],[/\)/,{token:"@brackets",bracket:"@close",switchTo:"@rpc.$S2"}]],methodOptions:[{include:"@whitespace"},{include:"@constant"},[/;/,"delimiter"],["option","keyword"],[/@optionName/,"annotation"],[/[()]/,"annotation.brackets"],[/=/,"operator"],[/}/,{token:"@brackets",bracket:"@close",next:"@pop"}]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],["\\*/","comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],stringSingle:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]],constant:[["@boolLit","keyword.constant"],["@hexLit","number.hex"],["@octalLit","number.octal"],["@decimalLit","number"],["@floatLit","number.float"],[/("([^"\\]|\\.)*|'([^'\\]|\\.)*)$/,"string.invalid"],[/"/,{token:"string.quote",bracket:"@open",next:"@string"}],[/'/,{token:"string.quote",bracket:"@open",next:"@stringSingle"}],[/{/,{token:"@brackets",bracket:"@open",next:"@prototext"}],[/identifier/,"identifier"]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],prototext:[{include:"@whitespace"},{include:"@constant"},[/@identifier/,"identifier"],[/[:;]/,"delimiter"],[/}/,{token:"@brackets",bracket:"@close",next:"@pop"}]]}};return l(m);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/pug/pug.js b/public/vs/basic-languages/pug/pug.js
new file mode 100644
index 0000000..1acd196
--- /dev/null
+++ b/public/vs/basic-languages/pug/pug.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/pug/pug", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var a=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var r=Object.prototype.hasOwnProperty;var p=(t,e)=>{for(var o in e)a(t,o,{get:e[o],enumerable:!0})},c=(t,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of l(e))!r.call(t,n)&&n!==o&&a(t,n,{get:()=>e[n],enumerable:!(s=i(e,n))||s.enumerable});return t};var d=t=>c(a({},"__esModule",{value:!0}),t);var g={};p(g,{conf:()=>m,language:()=>u});var m={comments:{lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}],folding:{offSide:!0}},u={defaultToken:"",tokenPostfix:".pug",ignoreCase:!0,brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],keywords:["append","block","case","default","doctype","each","else","extends","for","if","in","include","mixin","typeof","unless","var","when"],tags:["a","abbr","acronym","address","area","article","aside","audio","b","base","basefont","bdi","bdo","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","command","datalist","dd","del","details","dfn","div","dl","dt","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","keygen","kbd","label","li","link","map","mark","menu","meta","meter","nav","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strike","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","tracks","tt","u","ul","video","wbr"],symbols:/[\+\-\*\%\&\|\!\=\/\.\,\:]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^(\s*)([a-zA-Z_-][\w-]*)/,{cases:{"$2@tags":{cases:{"@eos":["","tag"],"@default":["",{token:"tag",next:"@tag.$1"}]}},"$2@keywords":["",{token:"keyword.$2"}],"@default":["",""]}}],[/^(\s*)(#[a-zA-Z_-][\w-]*)/,{cases:{"@eos":["","tag.id"],"@default":["",{token:"tag.id",next:"@tag.$1"}]}}],[/^(\s*)(\.[a-zA-Z_-][\w-]*)/,{cases:{"@eos":["","tag.class"],"@default":["",{token:"tag.class",next:"@tag.$1"}]}}],[/^(\s*)(\|.*)$/,""],{include:"@whitespace"},[/[a-zA-Z_$][\w$]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":""}}],[/[{}()\[\]]/,"@brackets"],[/@symbols/,"delimiter"],[/\d+\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\d+/,"number"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],tag:[[/(\.)(\s*$)/,[{token:"delimiter",next:"@blockText.$S2."},""]],[/\s+/,{token:"",next:"@simpleText"}],[/#[a-zA-Z_-][\w-]*/,{cases:{"@eos":{token:"tag.id",next:"@pop"},"@default":"tag.id"}}],[/\.[a-zA-Z_-][\w-]*/,{cases:{"@eos":{token:"tag.class",next:"@pop"},"@default":"tag.class"}}],[/\(/,{token:"delimiter.parenthesis",next:"@attributeList"}]],simpleText:[[/[^#]+$/,{token:"",next:"@popall"}],[/[^#]+/,{token:""}],[/(#{)([^}]*)(})/,{cases:{"@eos":["interpolation.delimiter","interpolation",{token:"interpolation.delimiter",next:"@popall"}],"@default":["interpolation.delimiter","interpolation","interpolation.delimiter"]}}],[/#$/,{token:"",next:"@popall"}],[/#/,""]],attributeList:[[/\s+/,""],[/(\w+)(\s*=\s*)("|')/,["attribute.name","delimiter",{token:"attribute.value",next:"@value.$3"}]],[/\w+/,"attribute.name"],[/,/,{cases:{"@eos":{token:"attribute.delimiter",next:"@popall"},"@default":"attribute.delimiter"}}],[/\)$/,{token:"delimiter.parenthesis",next:"@popall"}],[/\)/,{token:"delimiter.parenthesis",next:"@pop"}]],whitespace:[[/^(\s*)(\/\/.*)$/,{token:"comment",next:"@blockText.$1.comment"}],[/[ \t\r\n]+/,""],[/<!--/,{token:"comment",next:"@comment"}]],blockText:[[/^\s+.*$/,{cases:{"($S2\\s+.*$)":{token:"$S3"},"@default":{token:"@rematch",next:"@popall"}}}],[/./,{token:"@rematch",next:"@popall"}]],comment:[[/[^<\-]+/,"comment.content"],[/-->/,{token:"comment",next:"@pop"}],[/<!--/,"comment.content.invalid"],[/[<\-]/,"comment.content"]],string:[[/[^\\"'#]+/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/@escapes/,{cases:{"@eos":{token:"string.escape",next:"@popall"},"@default":"string.escape"}}],[/\\./,{cases:{"@eos":{token:"string.escape.invalid",next:"@popall"},"@default":"string.escape.invalid"}}],[/(#{)([^}]*)(})/,["interpolation.delimiter","interpolation","interpolation.delimiter"]],[/#/,"string"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":{token:"string"}}}]],value:[[/[^\\"']+/,{cases:{"@eos":{token:"attribute.value",next:"@popall"},"@default":"attribute.value"}}],[/\\./,{cases:{"@eos":{token:"attribute.value",next:"@popall"},"@default":"attribute.value"}}],[/["']/,{cases:{"$#==$S2":{token:"attribute.value",next:"@pop"},"@default":{token:"attribute.value"}}}]]}};return d(g);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/python/python.js b/public/vs/basic-languages/python/python.js
new file mode 100644
index 0000000..b035d7d
--- /dev/null
+++ b/public/vs/basic-languages/python/python.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/python/python", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var d=Object.create;var i=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var u=Object.getPrototypeOf,f=Object.prototype.hasOwnProperty;var b=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,t)=>(typeof require<"u"?require:n)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var y=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports),h=(e,n)=>{for(var t in n)i(e,t,{get:n[t],enumerable:!0})},o=(e,n,t,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of _(n))!f.call(e,r)&&r!==t&&i(e,r,{get:()=>n[r],enumerable:!(a=m(n,r))||a.enumerable});return e},l=(e,n,t)=>(o(e,n,"default"),t&&o(t,n,"default")),c=(e,n,t)=>(t=e!=null?d(u(e)):{},o(n||!e||!e.__esModule?i(t,"default",{value:e,enumerable:!0}):t,e)),x=e=>o(i({},"__esModule",{value:!0}),e);var g=y((v,p)=>{var w=c(b("vs/editor/editor.api"));p.exports=w});var D={};h(D,{conf:()=>k,language:()=>$});var s={};l(s,c(g()));var k={comments:{lineComment:"#",blockComment:["'''","'''"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],onEnterRules:[{beforeText:new RegExp("^\\s*(?:def|class|for|if|elif|else|while|try|with|finally|except|async|match|case).*?:\\s*$"),action:{indentAction:s.languages.IndentAction.Indent}}],folding:{offSide:!0,markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},$={defaultToken:"",tokenPostfix:".python",keywords:["False","None","True","_","and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","exec","finally","for","from","global","if","import","in","is","lambda","match","nonlocal","not","or","pass","print","raise","return","try","type","while","with","yield","int","float","long","complex","hex","abs","all","any","apply","basestring","bin","bool","buffer","bytearray","callable","chr","classmethod","cmp","coerce","compile","complex","delattr","dict","dir","divmod","enumerate","eval","execfile","file","filter","format","frozenset","getattr","globals","hasattr","hash","help","id","input","intern","isinstance","issubclass","iter","len","locals","list","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","reversed","range","raw_input","reduce","reload","repr","reversed","round","self","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","unichr","unicode","vars","xrange","zip","__dict__","__methods__","__members__","__class__","__bases__","__name__","__mro__","__subclasses__","__init__","__import__"],brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"}],tokenizer:{root:[{include:"@whitespace"},{include:"@numbers"},{include:"@strings"},[/[,:;]/,"delimiter"],[/[{}\[\]()]/,"@brackets"],[/@[a-zA-Z_]\w*/,"tag"],[/[a-zA-Z_]\w*/,{cases:{"@keywords":"keyword","@default":"identifier"}}]],whitespace:[[/\s+/,"white"],[/(^#.*$)/,"comment"],[/'''/,"string","@endDocString"],[/"""/,"string","@endDblDocString"]],endDocString:[[/[^']+/,"string"],[/\\'/,"string"],[/'''/,"string","@popall"],[/'/,"string"]],endDblDocString:[[/[^"]+/,"string"],[/\\"/,"string"],[/"""/,"string","@popall"],[/"/,"string"]],numbers:[[/-?0x([abcdef]|[ABCDEF]|\d)+[lL]?/,"number.hex"],[/-?(\d*\.)?\d+([eE][+\-]?\d+)?[jJ]?[lL]?/,"number"]],strings:[[/'$/,"string.escape","@popall"],[/'/,"string.escape","@stringBody"],[/"$/,"string.escape","@popall"],[/"/,"string.escape","@dblStringBody"]],stringBody:[[/[^\\']+$/,"string","@popall"],[/[^\\']+/,"string"],[/\\./,"string"],[/'/,"string.escape","@popall"],[/\\$/,"string"]],dblStringBody:[[/[^\\"]+$/,"string","@popall"],[/[^\\"]+/,"string"],[/\\./,"string"],[/"/,"string.escape","@popall"],[/\\$/,"string"]]}};return x(D);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/qsharp/qsharp.js b/public/vs/basic-languages/qsharp/qsharp.js
new file mode 100644
index 0000000..43da86f
--- /dev/null
+++ b/public/vs/basic-languages/qsharp/qsharp.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/qsharp/qsharp", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var a=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(t,e)=>{for(var n in e)a(t,n,{get:e[n],enumerable:!0})},u=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of r(e))!l.call(t,o)&&o!==n&&a(t,o,{get:()=>e[o],enumerable:!(s=i(e,o))||s.enumerable});return t};var p=t=>u(a({},"__esModule",{value:!0}),t);var m={};c(m,{conf:()=>d,language:()=>g});var d={comments:{lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},g={keywords:["namespace","open","as","operation","function","body","adjoint","newtype","controlled","if","elif","else","repeat","until","fixup","for","in","while","return","fail","within","apply","Adjoint","Controlled","Adj","Ctl","is","self","auto","distribute","invert","intrinsic","let","set","w/","new","not","and","or","use","borrow","using","borrowing","mutable","internal"],typeKeywords:["Unit","Int","BigInt","Double","Bool","String","Qubit","Result","Pauli","Range"],invalidKeywords:["abstract","base","bool","break","byte","case","catch","char","checked","class","const","continue","decimal","default","delegate","do","double","enum","event","explicit","extern","finally","fixed","float","foreach","goto","implicit","int","interface","lock","long","null","object","operator","out","override","params","private","protected","public","readonly","ref","sbyte","sealed","short","sizeof","stackalloc","static","string","struct","switch","this","throw","try","typeof","unit","ulong","unchecked","unsafe","ushort","virtual","void","volatile"],constants:["true","false","PauliI","PauliX","PauliY","PauliZ","One","Zero"],builtin:["X","Y","Z","H","HY","S","T","SWAP","CNOT","CCNOT","MultiX","R","RFrac","Rx","Ry","Rz","R1","R1Frac","Exp","ExpFrac","Measure","M","MultiM","Message","Length","Assert","AssertProb","AssertEqual"],operators:["and=","<-","->","*","*=","@","!","^","^=",":","::","..","==","...","=","=>",">",">=","<","<=","-","-=","!=","or=","%","%=","|","+","+=","?","/","/=","&&&","&&&=","^^^","^^^=",">>>",">>>=","<<<","<<<=","|||","|||=","~~~","_","w/","w/="],namespaceFollows:["namespace","open"],symbols:/[=><!~?:&|+\-*\/\^%@._]+/,escapes:/\\[\s\S]/,tokenizer:{root:[[/[a-zA-Z_$][\w$]*/,{cases:{"@namespaceFollows":{token:"keyword.$0",next:"@namespace"},"@typeKeywords":"type","@keywords":"keyword","@constants":"constant","@builtin":"keyword","@invalidKeywords":"invalid","@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/"/,{token:"string.quote",bracket:"@open",next:"@string"}]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],namespace:[{include:"@whitespace"},[/[A-Za-z]\w*/,"namespace"],[/[\.=]/,"delimiter"],["","","@pop"]],whitespace:[[/[ \t\r\n]+/,"white"],[/(\/\/).*/,"comment"]]}};return p(m);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/r/r.js b/public/vs/basic-languages/r/r.js
new file mode 100644
index 0000000..7b18c40
--- /dev/null
+++ b/public/vs/basic-languages/r/r.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/r/r", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var a=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(o,e)=>{for(var t in e)a(o,t,{get:e[t],enumerable:!0})},p=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of i(e))!c.call(o,r)&&r!==t&&a(o,r,{get:()=>e[r],enumerable:!(n=s(e,r))||n.enumerable});return o};var m=o=>p(a({},"__esModule",{value:!0}),o);var u={};l(u,{conf:()=>d,language:()=>g});var d={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},g={defaultToken:"",tokenPostfix:".r",roxygen:["@alias","@aliases","@assignee","@author","@backref","@callGraph","@callGraphDepth","@callGraphPrimitives","@concept","@describeIn","@description","@details","@docType","@encoding","@evalNamespace","@evalRd","@example","@examples","@export","@exportClass","@exportMethod","@exportPattern","@family","@field","@formals","@format","@import","@importClassesFrom","@importFrom","@importMethodsFrom","@include","@inherit","@inheritDotParams","@inheritParams","@inheritSection","@keywords","@md","@method","@name","@noMd","@noRd","@note","@param","@rawNamespace","@rawRd","@rdname","@references","@return","@S3method","@section","@seealso","@setClass","@slot","@source","@template","@templateVar","@title","@TODO","@usage","@useDynLib"],constants:["NULL","FALSE","TRUE","NA","Inf","NaN","NA_integer_","NA_real_","NA_complex_","NA_character_","T","F","LETTERS","letters","month.abb","month.name","pi","R.version.string"],keywords:["break","next","return","if","else","for","in","repeat","while","array","category","character","complex","double","function","integer","list","logical","matrix","numeric","vector","data.frame","factor","library","require","attach","detach","source"],special:["\\n","\\r","\\t","\\b","\\a","\\f","\\v","\\'",'\\"',"\\\\"],brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"}],tokenizer:{root:[{include:"@numbers"},{include:"@strings"},[/[{}\[\]()]/,"@brackets"],{include:"@operators"},[/#'$/,"comment.doc"],[/#'/,"comment.doc","@roxygen"],[/(^#.*$)/,"comment"],[/\s+/,"white"],[/[,:;]/,"delimiter"],[/@[a-zA-Z]\w*/,"tag"],[/[a-zA-Z]\w*/,{cases:{"@keywords":"keyword","@constants":"constant","@default":"identifier"}}]],roxygen:[[/@\w+/,{cases:{"@roxygen":"tag","@eos":{token:"comment.doc",next:"@pop"},"@default":"comment.doc"}}],[/\s+/,{cases:{"@eos":{token:"comment.doc",next:"@pop"},"@default":"comment.doc"}}],[/.*/,{token:"comment.doc",next:"@pop"}]],numbers:[[/0[xX][0-9a-fA-F]+/,"number.hex"],[/-?(\d*\.)?\d+([eE][+\-]?\d+)?/,"number"]],operators:[[/<{1,2}-/,"operator"],[/->{1,2}/,"operator"],[/%[^%\s]+%/,"operator"],[/\*\*/,"operator"],[/%%/,"operator"],[/&&/,"operator"],[/\|\|/,"operator"],[/<</,"operator"],[/>>/,"operator"],[/[-+=&|!<>^~*/:$]/,"operator"]],strings:[[/'/,"string.escape","@stringBody"],[/"/,"string.escape","@dblStringBody"]],stringBody:[[/\\./,{cases:{"@special":"string","@default":"error-token"}}],[/'/,"string.escape","@popall"],[/./,"string"]],dblStringBody:[[/\\./,{cases:{"@special":"string","@default":"error-token"}}],[/"/,"string.escape","@popall"],[/./,"string"]]}};return m(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/razor/razor.js b/public/vs/basic-languages/razor/razor.js
new file mode 100644
index 0000000..3f550c6
--- /dev/null
+++ b/public/vs/basic-languages/razor/razor.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/razor/razor", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var h=Object.create;var m=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var k=Object.getPrototypeOf,x=Object.prototype.hasOwnProperty;var y=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var T=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),w=(t,e)=>{for(var r in e)m(t,r,{get:e[r],enumerable:!0})},i=(t,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of b(e))!x.call(t,n)&&n!==r&&m(t,n,{get:()=>e[n],enumerable:!(a=u(e,n))||a.enumerable});return t},s=(t,e,r)=>(i(t,e,"default"),r&&i(r,e,"default")),c=(t,e,r)=>(r=t!=null?h(k(t)):{},i(e||!t||!t.__esModule?m(r,"default",{value:t,enumerable:!0}):r,t)),g=t=>i(m({},"__esModule",{value:!0}),t);var d=T(($,l)=>{var S=c(y("vs/editor/editor.api"));l.exports=S});var z={};w(z,{conf:()=>f,language:()=>E});var o={};s(o,c(d()));var p=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"],f={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:["<!--","-->"]},brackets:[["<!--","-->"],["<",">"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],onEnterRules:[{beforeText:new RegExp(`<(?!(?:${p.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:o.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp(`<(?!(?:${p.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),action:{indentAction:o.languages.IndentAction.Indent}}]},E={defaultToken:"",tokenPostfix:"",tokenizer:{root:[[/@@@@/],[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.root"}],[/<!DOCTYPE/,"metatag.html","@doctype"],[/<!--/,"comment.html","@comment"],[/(<)([\w\-]+)(\/>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)(script)/,["delimiter.html",{token:"tag.html",next:"@script"}]],[/(<)(style)/,["delimiter.html",{token:"tag.html",next:"@style"}]],[/(<)([:\w\-]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)([\w\-]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/</,"delimiter.html"],[/[ \t\r\n]+/],[/[^<@]+/]],doctype:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.comment"}],[/[^>]+/,"metatag.content.html"],[/>/,"metatag.html","@pop"]],comment:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.comment"}],[/-->/,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],razorInSimpleState:[[/@\*/,"comment.cs","@razorBlockCommentTopLevel"],[/@[{(]/,"metatag.cs","@razorRootTopLevel"],[/(@)(\s*[\w]+)/,["metatag.cs",{token:"identifier.cs",switchTo:"@$S2.$S3"}]],[/[})]/,{token:"metatag.cs",switchTo:"@$S2.$S3"}],[/\*@/,{token:"comment.cs",switchTo:"@$S2.$S3"}]],razorInEmbeddedState:[[/@\*/,"comment.cs","@razorBlockCommentTopLevel"],[/@[{(]/,"metatag.cs","@razorRootTopLevel"],[/(@)(\s*[\w]+)/,["metatag.cs",{token:"identifier.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}]],[/[})]/,{token:"metatag.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],[/\*@/,{token:"comment.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}]],razorBlockCommentTopLevel:[[/\*@/,"@rematch","@pop"],[/[^*]+/,"comment.cs"],[/./,"comment.cs"]],razorBlockComment:[[/\*@/,"comment.cs","@pop"],[/[^*]+/,"comment.cs"],[/./,"comment.cs"]],razorRootTopLevel:[[/\{/,"delimiter.bracket.cs","@razorRoot"],[/\(/,"delimiter.parenthesis.cs","@razorRoot"],[/[})]/,"@rematch","@pop"],{include:"razorCommon"}],razorRoot:[[/\{/,"delimiter.bracket.cs","@razorRoot"],[/\(/,"delimiter.parenthesis.cs","@razorRoot"],[/\}/,"delimiter.bracket.cs","@pop"],[/\)/,"delimiter.parenthesis.cs","@pop"],{include:"razorCommon"}],razorCommon:[[/[a-zA-Z_]\w*/,{cases:{"@razorKeywords":{token:"keyword.cs"},"@default":"identifier.cs"}}],[/[\[\]]/,"delimiter.array.cs"],[/[ \t\r\n]+/],[/\/\/.*$/,"comment.cs"],[/@\*/,"comment.cs","@razorBlockComment"],[/"([^"]*)"/,"string.cs"],[/'([^']*)'/,"string.cs"],[/(<)([\w\-]+)(\/>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)([\w\-]+)(>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<\/)([\w\-]+)(>)/,["delimiter.html","tag.html","delimiter.html"]],[/[\+\-\*\%\&\|\^\~\!\=\<\>\/\?\;\:\.\,]/,"delimiter.cs"],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float.cs"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float.cs"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex.cs"],[/0[0-7']*[0-7]/,"number.octal.cs"],[/0[bB][0-1']*[0-1]/,"number.binary.cs"],[/\d[\d']*/,"number.cs"],[/\d/,"number.cs"]]},razorKeywords:["abstract","as","async","await","base","bool","break","by","byte","case","catch","char","checked","class","const","continue","decimal","default","delegate","do","double","descending","explicit","event","extern","else","enum","false","finally","fixed","float","for","foreach","from","goto","group","if","implicit","in","int","interface","internal","into","is","lock","long","nameof","new","null","namespace","object","operator","out","override","orderby","params","private","protected","public","readonly","ref","return","switch","struct","sbyte","sealed","short","sizeof","stackalloc","static","string","select","this","throw","true","try","typeof","uint","ulong","unchecked","unsafe","ushort","using","var","virtual","volatile","void","when","while","where","yield","model","inject"],escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/};return g(z);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/redis/redis.js b/public/vs/basic-languages/redis/redis.js
new file mode 100644
index 0000000..511c538
--- /dev/null
+++ b/public/vs/basic-languages/redis/redis.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/redis/redis", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var R=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var A=(S,E)=>{for(var T in E)R(S,T,{get:E[T],enumerable:!0})},O=(S,E,T,o)=>{if(E&&typeof E=="object"||typeof E=="function")for(let e of N(E))!s.call(S,e)&&e!==T&&R(S,e,{get:()=>E[e],enumerable:!(o=n(E,e))||o.enumerable});return S};var L=S=>O(R({},"__esModule",{value:!0}),S);var r={};A(r,{conf:()=>I,language:()=>i});var I={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},i={defaultToken:"",tokenPostfix:".redis",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["APPEND","AUTH","BGREWRITEAOF","BGSAVE","BITCOUNT","BITFIELD","BITOP","BITPOS","BLPOP","BRPOP","BRPOPLPUSH","CLIENT","KILL","LIST","GETNAME","PAUSE","REPLY","SETNAME","CLUSTER","ADDSLOTS","COUNT-FAILURE-REPORTS","COUNTKEYSINSLOT","DELSLOTS","FAILOVER","FORGET","GETKEYSINSLOT","INFO","KEYSLOT","MEET","NODES","REPLICATE","RESET","SAVECONFIG","SET-CONFIG-EPOCH","SETSLOT","SLAVES","SLOTS","COMMAND","COUNT","GETKEYS","CONFIG","GET","REWRITE","SET","RESETSTAT","DBSIZE","DEBUG","OBJECT","SEGFAULT","DECR","DECRBY","DEL","DISCARD","DUMP","ECHO","EVAL","EVALSHA","EXEC","EXISTS","EXPIRE","EXPIREAT","FLUSHALL","FLUSHDB","GEOADD","GEOHASH","GEOPOS","GEODIST","GEORADIUS","GEORADIUSBYMEMBER","GETBIT","GETRANGE","GETSET","HDEL","HEXISTS","HGET","HGETALL","HINCRBY","HINCRBYFLOAT","HKEYS","HLEN","HMGET","HMSET","HSET","HSETNX","HSTRLEN","HVALS","INCR","INCRBY","INCRBYFLOAT","KEYS","LASTSAVE","LINDEX","LINSERT","LLEN","LPOP","LPUSH","LPUSHX","LRANGE","LREM","LSET","LTRIM","MGET","MIGRATE","MONITOR","MOVE","MSET","MSETNX","MULTI","PERSIST","PEXPIRE","PEXPIREAT","PFADD","PFCOUNT","PFMERGE","PING","PSETEX","PSUBSCRIBE","PUBSUB","PTTL","PUBLISH","PUNSUBSCRIBE","QUIT","RANDOMKEY","READONLY","READWRITE","RENAME","RENAMENX","RESTORE","ROLE","RPOP","RPOPLPUSH","RPUSH","RPUSHX","SADD","SAVE","SCARD","SCRIPT","FLUSH","LOAD","SDIFF","SDIFFSTORE","SELECT","SETBIT","SETEX","SETNX","SETRANGE","SHUTDOWN","SINTER","SINTERSTORE","SISMEMBER","SLAVEOF","SLOWLOG","SMEMBERS","SMOVE","SORT","SPOP","SRANDMEMBER","SREM","STRLEN","SUBSCRIBE","SUNION","SUNIONSTORE","SWAPDB","SYNC","TIME","TOUCH","TTL","TYPE","UNSUBSCRIBE","UNLINK","UNWATCH","WAIT","WATCH","ZADD","ZCARD","ZCOUNT","ZINCRBY","ZINTERSTORE","ZLEXCOUNT","ZRANGE","ZRANGEBYLEX","ZREVRANGEBYLEX","ZRANGEBYSCORE","ZRANK","ZREM","ZREMRANGEBYLEX","ZREMRANGEBYRANK","ZREMRANGEBYSCORE","ZREVRANGE","ZREVRANGEBYSCORE","ZREVRANK","ZSCORE","ZUNIONSTORE","SCAN","SSCAN","HSCAN","ZSCAN"],operators:[],builtinFunctions:[],builtinVariables:[],pseudoColumns:[],tokenizer:{root:[{include:"@whitespace"},{include:"@pseudoColumns"},{include:"@numbers"},{include:"@strings"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@keywords":"keyword","@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],pseudoColumns:[[/[$][A-Za-z_][\w@#$]*/,{cases:{"@pseudoColumns":"predefined","@default":"identifier"}}]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/'/,{token:"string",next:"@string"}],[/"/,{token:"string.double",next:"@stringDouble"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],stringDouble:[[/[^"]+/,"string.double"],[/""/,"string.double"],[/"/,{token:"string.double",next:"@pop"}]],scopes:[]}};return L(r);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/redshift/redshift.js b/public/vs/basic-languages/redshift/redshift.js
new file mode 100644
index 0000000..07bd103
--- /dev/null
+++ b/public/vs/basic-languages/redshift/redshift.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/redshift/redshift", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var i=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var p=(_,e)=>{for(var r in e)i(_,r,{get:e[r],enumerable:!0})},l=(_,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of o(e))!n.call(_,t)&&t!==r&&i(_,t,{get:()=>e[t],enumerable:!(a=s(e,t))||a.enumerable});return _};var g=_=>l(i({},"__esModule",{value:!0}),_);var m={};p(m,{conf:()=>c,language:()=>d});var c={comments:{lineComment:"--",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},d={defaultToken:"",tokenPostfix:".sql",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["AES128","AES256","ALL","ALLOWOVERWRITE","ANALYSE","ANALYZE","AND","ANY","ARRAY","AS","ASC","AUTHORIZATION","AZ64","BACKUP","BETWEEN","BINARY","BLANKSASNULL","BOTH","BYTEDICT","BZIP2","CASE","CAST","CHECK","COLLATE","COLUMN","CONSTRAINT","CREATE","CREDENTIALS","CROSS","CURRENT_DATE","CURRENT_TIME","CURRENT_TIMESTAMP","CURRENT_USER","CURRENT_USER_ID","DEFAULT","DEFERRABLE","DEFLATE","DEFRAG","DELTA","DELTA32K","DESC","DISABLE","DISTINCT","DO","ELSE","EMPTYASNULL","ENABLE","ENCODE","ENCRYPT","ENCRYPTION","END","EXCEPT","EXPLICIT","FALSE","FOR","FOREIGN","FREEZE","FROM","FULL","GLOBALDICT256","GLOBALDICT64K","GRANT","GROUP","GZIP","HAVING","IDENTITY","IGNORE","ILIKE","IN","INITIALLY","INNER","INTERSECT","INTO","IS","ISNULL","JOIN","LANGUAGE","LEADING","LEFT","LIKE","LIMIT","LOCALTIME","LOCALTIMESTAMP","LUN","LUNS","LZO","LZOP","MINUS","MOSTLY16","MOSTLY32","MOSTLY8","NATURAL","NEW","NOT","NOTNULL","NULL","NULLS","OFF","OFFLINE","OFFSET","OID","OLD","ON","ONLY","OPEN","OR","ORDER","OUTER","OVERLAPS","PARALLEL","PARTITION","PERCENT","PERMISSIONS","PLACING","PRIMARY","RAW","READRATIO","RECOVER","REFERENCES","RESPECT","REJECTLOG","RESORT","RESTORE","RIGHT","SELECT","SESSION_USER","SIMILAR","SNAPSHOT","SOME","SYSDATE","SYSTEM","TABLE","TAG","TDES","TEXT255","TEXT32K","THEN","TIMESTAMP","TO","TOP","TRAILING","TRUE","TRUNCATECOLUMNS","UNION","UNIQUE","USER","USING","VERBOSE","WALLET","WHEN","WHERE","WITH","WITHOUT"],operators:["AND","BETWEEN","IN","LIKE","NOT","OR","IS","NULL","INTERSECT","UNION","INNER","JOIN","LEFT","OUTER","RIGHT"],builtinFunctions:["current_schema","current_schemas","has_database_privilege","has_schema_privilege","has_table_privilege","age","current_time","current_timestamp","localtime","isfinite","now","ascii","get_bit","get_byte","set_bit","set_byte","to_ascii","approximate percentile_disc","avg","count","listagg","max","median","min","percentile_cont","stddev_samp","stddev_pop","sum","var_samp","var_pop","bit_and","bit_or","bool_and","bool_or","cume_dist","first_value","lag","last_value","lead","nth_value","ratio_to_report","dense_rank","ntile","percent_rank","rank","row_number","case","coalesce","decode","greatest","least","nvl","nvl2","nullif","add_months","at time zone","convert_timezone","current_date","date_cmp","date_cmp_timestamp","date_cmp_timestamptz","date_part_year","dateadd","datediff","date_part","date_trunc","extract","getdate","interval_cmp","last_day","months_between","next_day","sysdate","timeofday","timestamp_cmp","timestamp_cmp_date","timestamp_cmp_timestamptz","timestamptz_cmp","timestamptz_cmp_date","timestamptz_cmp_timestamp","timezone","to_timestamp","trunc","abs","acos","asin","atan","atan2","cbrt","ceil","ceiling","checksum","cos","cot","degrees","dexp","dlog1","dlog10","exp","floor","ln","log","mod","pi","power","radians","random","round","sin","sign","sqrt","tan","to_hex","bpcharcmp","btrim","bttext_pattern_cmp","char_length","character_length","charindex","chr","concat","crc32","func_sha1","initcap","left and rights","len","length","lower","lpad and rpads","ltrim","md5","octet_length","position","quote_ident","quote_literal","regexp_count","regexp_instr","regexp_replace","regexp_substr","repeat","replace","replicate","reverse","rtrim","split_part","strpos","strtol","substring","textlen","translate","trim","upper","cast","convert","to_char","to_date","to_number","json_array_length","json_extract_array_element_text","json_extract_path_text","current_setting","pg_cancel_backend","pg_terminate_backend","set_config","current_database","current_user","current_user_id","pg_backend_pid","pg_last_copy_count","pg_last_copy_id","pg_last_query_id","pg_last_unload_count","session_user","slice_num","user","version","abbrev","acosd","any","area","array_agg","array_append","array_cat","array_dims","array_fill","array_length","array_lower","array_ndims","array_position","array_positions","array_prepend","array_remove","array_replace","array_to_json","array_to_string","array_to_tsvector","array_upper","asind","atan2d","atand","bit","bit_length","bound_box","box","brin_summarize_new_values","broadcast","cardinality","center","circle","clock_timestamp","col_description","concat_ws","convert_from","convert_to","corr","cosd","cotd","covar_pop","covar_samp","current_catalog","current_query","current_role","currval","cursor_to_xml","diameter","div","encode","enum_first","enum_last","enum_range","every","family","format","format_type","generate_series","generate_subscripts","get_current_ts_config","gin_clean_pending_list","grouping","has_any_column_privilege","has_column_privilege","has_foreign_data_wrapper_privilege","has_function_privilege","has_language_privilege","has_sequence_privilege","has_server_privilege","has_tablespace_privilege","has_type_privilege","height","host","hostmask","inet_client_addr","inet_client_port","inet_merge","inet_same_family","inet_server_addr","inet_server_port","isclosed","isempty","isopen","json_agg","json_object","json_object_agg","json_populate_record","json_populate_recordset","json_to_record","json_to_recordset","jsonb_agg","jsonb_object_agg","justify_days","justify_hours","justify_interval","lastval","left","line","localtimestamp","lower_inc","lower_inf","lpad","lseg","make_date","make_interval","make_time","make_timestamp","make_timestamptz","masklen","mode","netmask","network","nextval","npoints","num_nonnulls","num_nulls","numnode","obj_description","overlay","parse_ident","path","pclose","percentile_disc","pg_advisory_lock","pg_advisory_lock_shared","pg_advisory_unlock","pg_advisory_unlock_all","pg_advisory_unlock_shared","pg_advisory_xact_lock","pg_advisory_xact_lock_shared","pg_backup_start_time","pg_blocking_pids","pg_client_encoding","pg_collation_is_visible","pg_column_size","pg_conf_load_time","pg_control_checkpoint","pg_control_init","pg_control_recovery","pg_control_system","pg_conversion_is_visible","pg_create_logical_replication_slot","pg_create_physical_replication_slot","pg_create_restore_point","pg_current_xlog_flush_location","pg_current_xlog_insert_location","pg_current_xlog_location","pg_database_size","pg_describe_object","pg_drop_replication_slot","pg_export_snapshot","pg_filenode_relation","pg_function_is_visible","pg_get_constraintdef","pg_get_expr","pg_get_function_arguments","pg_get_function_identity_arguments","pg_get_function_result","pg_get_functiondef","pg_get_indexdef","pg_get_keywords","pg_get_object_address","pg_get_owned_sequence","pg_get_ruledef","pg_get_serial_sequence","pg_get_triggerdef","pg_get_userbyid","pg_get_viewdef","pg_has_role","pg_identify_object","pg_identify_object_as_address","pg_index_column_has_property","pg_index_has_property","pg_indexam_has_property","pg_indexes_size","pg_is_in_backup","pg_is_in_recovery","pg_is_other_temp_schema","pg_is_xlog_replay_paused","pg_last_committed_xact","pg_last_xact_replay_timestamp","pg_last_xlog_receive_location","pg_last_xlog_replay_location","pg_listening_channels","pg_logical_emit_message","pg_logical_slot_get_binary_changes","pg_logical_slot_get_changes","pg_logical_slot_peek_binary_changes","pg_logical_slot_peek_changes","pg_ls_dir","pg_my_temp_schema","pg_notification_queue_usage","pg_opclass_is_visible","pg_operator_is_visible","pg_opfamily_is_visible","pg_options_to_table","pg_postmaster_start_time","pg_read_binary_file","pg_read_file","pg_relation_filenode","pg_relation_filepath","pg_relation_size","pg_reload_conf","pg_replication_origin_create","pg_replication_origin_drop","pg_replication_origin_oid","pg_replication_origin_progress","pg_replication_origin_session_is_setup","pg_replication_origin_session_progress","pg_replication_origin_session_reset","pg_replication_origin_session_setup","pg_replication_origin_xact_reset","pg_replication_origin_xact_setup","pg_rotate_logfile","pg_size_bytes","pg_size_pretty","pg_sleep","pg_sleep_for","pg_sleep_until","pg_start_backup","pg_stat_file","pg_stop_backup","pg_switch_xlog","pg_table_is_visible","pg_table_size","pg_tablespace_databases","pg_tablespace_location","pg_tablespace_size","pg_total_relation_size","pg_trigger_depth","pg_try_advisory_lock","pg_try_advisory_lock_shared","pg_try_advisory_xact_lock","pg_try_advisory_xact_lock_shared","pg_ts_config_is_visible","pg_ts_dict_is_visible","pg_ts_parser_is_visible","pg_ts_template_is_visible","pg_type_is_visible","pg_typeof","pg_xact_commit_timestamp","pg_xlog_location_diff","pg_xlog_replay_pause","pg_xlog_replay_resume","pg_xlogfile_name","pg_xlogfile_name_offset","phraseto_tsquery","plainto_tsquery","point","polygon","popen","pqserverversion","query_to_xml","querytree","quote_nullable","radius","range_merge","regexp_matches","regexp_split_to_array","regexp_split_to_table","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","right","row_security_active","row_to_json","rpad","scale","set_masklen","setseed","setval","setweight","shobj_description","sind","sprintf","statement_timestamp","stddev","string_agg","string_to_array","strip","substr","table_to_xml","table_to_xml_and_xmlschema","tand","text","to_json","to_regclass","to_regnamespace","to_regoper","to_regoperator","to_regproc","to_regprocedure","to_regrole","to_regtype","to_tsquery","to_tsvector","transaction_timestamp","ts_debug","ts_delete","ts_filter","ts_headline","ts_lexize","ts_parse","ts_rank","ts_rank_cd","ts_rewrite","ts_stat","ts_token_type","tsquery_phrase","tsvector_to_array","tsvector_update_trigger","tsvector_update_trigger_column","txid_current","txid_current_snapshot","txid_snapshot_xip","txid_snapshot_xmax","txid_snapshot_xmin","txid_visible_in_snapshot","unnest","upper_inc","upper_inf","variance","width","width_bucket","xml_is_well_formed","xml_is_well_formed_content","xml_is_well_formed_document","xmlagg","xmlcomment","xmlconcat","xmlelement","xmlexists","xmlforest","xmlparse","xmlpi","xmlroot","xmlserialize","xpath","xpath_exists"],builtinVariables:[],pseudoColumns:[],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@pseudoColumns"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@keywords":"keyword","@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],pseudoColumns:[[/[$][A-Za-z_][\w@#$]*/,{cases:{"@pseudoColumns":"predefined","@default":"identifier"}}]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/'/,{token:"string",next:"@string"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],complexIdentifiers:[[/"/,{token:"identifier.quote",next:"@quotedIdentifier"}]],quotedIdentifier:[[/[^"]+/,"identifier"],[/""/,"identifier"],[/"/,{token:"identifier.quote",next:"@pop"}]],scopes:[]}};return g(m);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/restructuredtext/restructuredtext.js b/public/vs/basic-languages/restructuredtext/restructuredtext.js
new file mode 100644
index 0000000..1b3c680
--- /dev/null
+++ b/public/vs/basic-languages/restructuredtext/restructuredtext.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/restructuredtext/restructuredtext", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var t=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var r=Object.prototype.hasOwnProperty;var k=(n,e)=>{for(var i in e)t(n,i,{get:e[i],enumerable:!0})},c=(n,e,i,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of l(e))!r.call(n,s)&&s!==i&&t(n,s,{get:()=>e[s],enumerable:!(o=a(e,s))||o.enumerable});return n};var p=n=>c(t({},"__esModule",{value:!0}),n);var g={};k(g,{conf:()=>u,language:()=>m});var u={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">",notIn:["string"]}],surroundingPairs:[{open:"(",close:")"},{open:"[",close:"]"},{open:"`",close:"`"}],folding:{markers:{start:new RegExp("^\\s*<!--\\s*#?region\\b.*-->"),end:new RegExp("^\\s*<!--\\s*#?endregion\\b.*-->")}}},m={defaultToken:"",tokenPostfix:".rst",control:/[\\`*_\[\]{}()#+\-\.!]/,escapes:/\\(?:@control)/,empty:["area","base","basefont","br","col","frame","hr","img","input","isindex","link","meta","param"],alphanumerics:/[A-Za-z0-9]/,simpleRefNameWithoutBq:/(?:@alphanumerics[-_+:.]*@alphanumerics)+|(?:@alphanumerics+)/,simpleRefName:/(?:`@phrase`|@simpleRefNameWithoutBq)/,phrase:/@simpleRefNameWithoutBq(?:\s@simpleRefNameWithoutBq)*/,citationName:/[A-Za-z][A-Za-z0-9-_.]*/,blockLiteralStart:/(?:[!"#$%&'()*+,-./:;<=>?@\[\]^_`{|}~]|[\s])/,precedingChars:/(?:[ -:/'"<([{])/,followingChars:/(?:[ -.,:;!?/'")\]}>]|$)/,punctuation:/(=|-|~|`|#|"|\^|\+|\*|:|\.|'|_|\+)/,tokenizer:{root:[[/^(@punctuation{3,}$){1,1}?/,"keyword"],[/^\s*([\*\-+鈥b�|[a-zA-Z0-9]+\.|\([a-zA-Z0-9]+\)|[a-zA-Z0-9]+\))\s/,"keyword"],[/([ ]::)\s*$/,"keyword","@blankLineOfLiteralBlocks"],[/(::)\s*$/,"keyword","@blankLineOfLiteralBlocks"],{include:"@tables"},{include:"@explicitMarkupBlocks"},{include:"@inlineMarkup"}],explicitMarkupBlocks:[{include:"@citations"},{include:"@footnotes"},[/^(\.\.\s)(@simpleRefName)(::\s)(.*)$/,[{token:"",next:"subsequentLines"},"keyword","",""]],[/^(\.\.)(\s+)(_)(@simpleRefName)(:)(\s+)(.*)/,[{token:"",next:"hyperlinks"},"","","string.link","","","string.link"]],[/^((?:(?:\.\.)(?:\s+))?)(__)(:)(\s+)(.*)/,[{token:"",next:"subsequentLines"},"","","","string.link"]],[/^(__\s+)(.+)/,["","string.link"]],[/^(\.\.)( \|)([^| ]+[^|]*[^| ]*)(\| )(@simpleRefName)(:: .*)/,[{token:"",next:"subsequentLines"},"","string.link","","keyword",""],"@rawBlocks"],[/(\|)([^| ]+[^|]*[^| ]*)(\|_{0,2})/,["","string.link",""]],[/^(\.\.)([ ].*)$/,[{token:"",next:"@comments"},"comment"]]],inlineMarkup:[{include:"@citationsReference"},{include:"@footnotesReference"},[/(@simpleRefName)(_{1,2})/,["string.link",""]],[/(`)([^<`]+\s+)(<)(.*)(>)(`)(_)/,["","string.link","","string.link","","",""]],[/\*\*([^\\*]|\*(?!\*))+\*\*/,"strong"],[/\*[^*]+\*/,"emphasis"],[/(``)((?:[^`]|\`(?!`))+)(``)/,["","keyword",""]],[/(__\s+)(.+)/,["","keyword"]],[/(:)((?:@simpleRefNameWithoutBq)?)(:`)([^`]+)(`)/,["","keyword","","",""]],[/(`)([^`]+)(`:)((?:@simpleRefNameWithoutBq)?)(:)/,["","","","keyword",""]],[/(`)([^`]+)(`)/,""],[/(_`)(@phrase)(`)/,["","string.link",""]]],citations:[[/^(\.\.\s+\[)((?:@citationName))(\]\s+)(.*)/,[{token:"",next:"@subsequentLines"},"string.link","",""]]],citationsReference:[[/(\[)(@citationName)(\]_)/,["","string.link",""]]],footnotes:[[/^(\.\.\s+\[)((?:[0-9]+))(\]\s+.*)/,[{token:"",next:"@subsequentLines"},"string.link",""]],[/^(\.\.\s+\[)((?:#@simpleRefName?))(\]\s+)(.*)/,[{token:"",next:"@subsequentLines"},"string.link","",""]],[/^(\.\.\s+\[)((?:\*))(\]\s+)(.*)/,[{token:"",next:"@subsequentLines"},"string.link","",""]]],footnotesReference:[[/(\[)([0-9]+)(\])(_)/,["","string.link","",""]],[/(\[)(#@simpleRefName?)(\])(_)/,["","string.link","",""]],[/(\[)(\*)(\])(_)/,["","string.link","",""]]],blankLineOfLiteralBlocks:[[/^$/,"","@subsequentLinesOfLiteralBlocks"],[/^.*$/,"","@pop"]],subsequentLinesOfLiteralBlocks:[[/(@blockLiteralStart+)(.*)/,["keyword",""]],[/^(?!blockLiteralStart)/,"","@popall"]],subsequentLines:[[/^[\s]+.*/,""],[/^(?!\s)/,"","@pop"]],hyperlinks:[[/^[\s]+.*/,"string.link"],[/^(?!\s)/,"","@pop"]],comments:[[/^[\s]+.*/,"comment"],[/^(?!\s)/,"","@pop"]],tables:[[/\+-[+-]+/,"keyword"],[/\+=[+=]+/,"keyword"]]}};return p(g);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/ruby/ruby.js b/public/vs/basic-languages/ruby/ruby.js
new file mode 100644
index 0000000..d3526cc
--- /dev/null
+++ b/public/vs/basic-languages/ruby/ruby.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/ruby/ruby", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(t,e)=>{for(var r in e)o(t,r,{get:e[r],enumerable:!0})},l=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of c(e))!d.call(t,n)&&n!==r&&o(t,n,{get:()=>e[n],enumerable:!(s=i(e,n))||s.enumerable});return t};var a=t=>l(o({},"__esModule",{value:!0}),t);var m={};p(m,{conf:()=>g,language:()=>x});var g={comments:{lineComment:"#",blockComment:["=begin","=end"]},brackets:[["(",")"],["{","}"],["[","]"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],indentationRules:{increaseIndentPattern:new RegExp(`^\\s*((begin|class|(private|protected)\\s+def|def|else|elsif|ensure|for|if|module|rescue|unless|until|when|while|case)|([^#]*\\sdo\\b)|([^#]*=\\s*(case|if|unless)))\\b([^#\\{;]|("|'|/).*\\4)*(#.*)?$`),decreaseIndentPattern:new RegExp("^\\s*([}\\]]([,)]?\\s*(#|$)|\\.[a-zA-Z_]\\w*\\b)|(end|rescue|ensure|else|elsif|when)\\b)")}},x={tokenPostfix:".ruby",keywords:["__LINE__","__ENCODING__","__FILE__","BEGIN","END","alias","and","begin","break","case","class","def","defined?","do","else","elsif","end","ensure","for","false","if","in","module","next","nil","not","or","redo","rescue","retry","return","self","super","then","true","undef","unless","until","when","while","yield"],keywordops:["::","..","...","?",":","=>"],builtins:["require","public","private","include","extend","attr_reader","protected","private_class_method","protected_class_method","new"],declarations:["module","class","def","case","do","begin","for","if","while","until","unless"],linedecls:["def","case","do","begin","for","if","while","until","unless"],operators:["^","&","|","<=>","==","===","!~","=~",">",">=","<","<=","<<",">>","+","-","*","/","%","**","~","+@","-@","[]","[]=","`","+=","-=","*=","**=","/=","^=","%=","<<=",">>=","&=","&&=","||=","|="],brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],symbols:/[=><!~?:&|+\-*\/\^%\.]+/,escape:/(?:[abefnrstv\\"'\n\r]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2}|u[0-9A-Fa-f]{4})/,escapes:/\\(?:C\-(@escape|.)|c(@escape|.)|@escape)/,decpart:/\d(_?\d)*/,decimal:/0|@decpart/,delim:/[^a-zA-Z0-9\s\n\r]/,heredelim:/(?:\w+|'[^']*'|"[^"]*"|`[^`]*`)/,regexpctl:/[(){}\[\]\$\^|\-*+?\.]/,regexpesc:/\\(?:[AzZbBdDfnrstvwWn0\\\/]|@regexpctl|c[A-Z]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})?/,tokenizer:{root:[[/^(\s*)([a-z_]\w*[!?=]?)/,["white",{cases:{"for|until|while":{token:"keyword.$2",next:"@dodecl.$2"},"@declarations":{token:"keyword.$2",next:"@root.$2"},end:{token:"keyword.$S2",next:"@pop"},"@keywords":"keyword","@builtins":"predefined","@default":"identifier"}}]],[/[a-z_]\w*[!?=]?/,{cases:{"if|unless|while|until":{token:"keyword.$0x",next:"@modifier.$0x"},for:{token:"keyword.$2",next:"@dodecl.$2"},"@linedecls":{token:"keyword.$0",next:"@root.$0"},end:{token:"keyword.$S2",next:"@pop"},"@keywords":"keyword","@builtins":"predefined","@default":"identifier"}}],[/[A-Z][\w]*[!?=]?/,"constructor.identifier"],[/\$[\w]*/,"global.constant"],[/@[\w]*/,"namespace.instance.identifier"],[/@@@[\w]*/,"namespace.class.identifier"],[/<<[-~](@heredelim).*/,{token:"string.heredoc.delimiter",next:"@heredoc.$1"}],[/[ \t\r\n]+<<(@heredelim).*/,{token:"string.heredoc.delimiter",next:"@heredoc.$1"}],[/^<<(@heredelim).*/,{token:"string.heredoc.delimiter",next:"@heredoc.$1"}],{include:"@whitespace"},[/"/,{token:"string.d.delim",next:'@dstring.d."'}],[/'/,{token:"string.sq.delim",next:"@sstring.sq"}],[/%([rsqxwW]|Q?)/,{token:"@rematch",next:"pstring"}],[/`/,{token:"string.x.delim",next:"@dstring.x.`"}],[/:(\w|[$@])\w*[!?=]?/,"string.s"],[/:"/,{token:"string.s.delim",next:'@dstring.s."'}],[/:'/,{token:"string.s.delim",next:"@sstring.s"}],[/\/(?=(\\\/|[^\/\n])+\/)/,{token:"regexp.delim",next:"@regexp"}],[/[{}()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@keywordops":"keyword","@operators":"operator","@default":""}}],[/[;,]/,"delimiter"],[/0[xX][0-9a-fA-F](_?[0-9a-fA-F])*/,"number.hex"],[/0[_oO][0-7](_?[0-7])*/,"number.octal"],[/0[bB][01](_?[01])*/,"number.binary"],[/0[dD]@decpart/,"number"],[/@decimal((\.@decpart)?([eE][\-+]?@decpart)?)/,{cases:{$1:"number.float","@default":"number"}}]],dodecl:[[/^/,{token:"",switchTo:"@root.$S2"}],[/[a-z_]\w*[!?=]?/,{cases:{end:{token:"keyword.$S2",next:"@pop"},do:{token:"keyword",switchTo:"@root.$S2"},"@linedecls":{token:"@rematch",switchTo:"@root.$S2"},"@keywords":"keyword","@builtins":"predefined","@default":"identifier"}}],{include:"@root"}],modifier:[[/^/,"","@pop"],[/[a-z_]\w*[!?=]?/,{cases:{end:{token:"keyword.$S2",next:"@pop"},"then|else|elsif|do":{token:"keyword",switchTo:"@root.$S2"},"@linedecls":{token:"@rematch",switchTo:"@root.$S2"},"@keywords":"keyword","@builtins":"predefined","@default":"identifier"}}],{include:"@root"}],sstring:[[/[^\\']+/,"string.$S2"],[/\\\\|\\'|\\$/,"string.$S2.escape"],[/\\./,"string.$S2.invalid"],[/'/,{token:"string.$S2.delim",next:"@pop"}]],dstring:[[/[^\\`"#]+/,"string.$S2"],[/#/,"string.$S2.escape","@interpolated"],[/\\$/,"string.$S2.escape"],[/@escapes/,"string.$S2.escape"],[/\\./,"string.$S2.escape.invalid"],[/[`"]/,{cases:{"$#==$S3":{token:"string.$S2.delim",next:"@pop"},"@default":"string.$S2"}}]],heredoc:[[/^(\s*)(@heredelim)$/,{cases:{"$2==$S2":["string.heredoc",{token:"string.heredoc.delimiter",next:"@pop"}],"@default":["string.heredoc","string.heredoc"]}}],[/.*/,"string.heredoc"]],interpolated:[[/\$\w*/,"global.constant","@pop"],[/@\w*/,"namespace.class.identifier","@pop"],[/@@@\w*/,"namespace.instance.identifier","@pop"],[/[{]/,{token:"string.escape.curly",switchTo:"@interpolated_compound"}],["","","@pop"]],interpolated_compound:[[/[}]/,{token:"string.escape.curly",next:"@pop"}],{include:"@root"}],pregexp:[{include:"@whitespace"},[/[^\(\{\[\\]/,{cases:{"$#==$S3":{token:"regexp.delim",next:"@pop"},"$#==$S2":{token:"regexp.delim",next:"@push"},"~[)}\\]]":"@brackets.regexp.escape.control","~@regexpctl":"regexp.escape.control","@default":"regexp"}}],{include:"@regexcontrol"}],regexp:[{include:"@regexcontrol"},[/[^\\\/]/,"regexp"],["/[ixmp]*",{token:"regexp.delim"},"@pop"]],regexcontrol:[[/(\{)(\d+(?:,\d*)?)(\})/,["@brackets.regexp.escape.control","regexp.escape.control","@brackets.regexp.escape.control"]],[/(\[)(\^?)/,["@brackets.regexp.escape.control",{token:"regexp.escape.control",next:"@regexrange"}]],[/(\()(\?[:=!])/,["@brackets.regexp.escape.control","regexp.escape.control"]],[/\(\?#/,{token:"regexp.escape.control",next:"@regexpcomment"}],[/[()]/,"@brackets.regexp.escape.control"],[/@regexpctl/,"regexp.escape.control"],[/\\$/,"regexp.escape"],[/@regexpesc/,"regexp.escape"],[/\\\./,"regexp.invalid"],[/#/,"regexp.escape","@interpolated"]],regexrange:[[/-/,"regexp.escape.control"],[/\^/,"regexp.invalid"],[/\\$/,"regexp.escape"],[/@regexpesc/,"regexp.escape"],[/[^\]]/,"regexp"],[/\]/,"@brackets.regexp.escape.control","@pop"]],regexpcomment:[[/[^)]+/,"comment"],[/\)/,{token:"regexp.escape.control",next:"@pop"}]],pstring:[[/%([qws])\(/,{token:"string.$1.delim",switchTo:"@qstring.$1.(.)"}],[/%([qws])\[/,{token:"string.$1.delim",switchTo:"@qstring.$1.[.]"}],[/%([qws])\{/,{token:"string.$1.delim",switchTo:"@qstring.$1.{.}"}],[/%([qws])</,{token:"string.$1.delim",switchTo:"@qstring.$1.<.>"}],[/%([qws])(@delim)/,{token:"string.$1.delim",switchTo:"@qstring.$1.$2.$2"}],[/%r\(/,{token:"regexp.delim",switchTo:"@pregexp.(.)"}],[/%r\[/,{token:"regexp.delim",switchTo:"@pregexp.[.]"}],[/%r\{/,{token:"regexp.delim",switchTo:"@pregexp.{.}"}],[/%r</,{token:"regexp.delim",switchTo:"@pregexp.<.>"}],[/%r(@delim)/,{token:"regexp.delim",switchTo:"@pregexp.$1.$1"}],[/%(x|W|Q?)\(/,{token:"string.$1.delim",switchTo:"@qqstring.$1.(.)"}],[/%(x|W|Q?)\[/,{token:"string.$1.delim",switchTo:"@qqstring.$1.[.]"}],[/%(x|W|Q?)\{/,{token:"string.$1.delim",switchTo:"@qqstring.$1.{.}"}],[/%(x|W|Q?)</,{token:"string.$1.delim",switchTo:"@qqstring.$1.<.>"}],[/%(x|W|Q?)(@delim)/,{token:"string.$1.delim",switchTo:"@qqstring.$1.$2.$2"}],[/%([rqwsxW]|Q?)./,{token:"invalid",next:"@pop"}],[/./,{token:"invalid",next:"@pop"}]],qstring:[[/\\$/,"string.$S2.escape"],[/\\./,"string.$S2.escape"],[/./,{cases:{"$#==$S4":{token:"string.$S2.delim",next:"@pop"},"$#==$S3":{token:"string.$S2.delim",next:"@push"},"@default":"string.$S2"}}]],qqstring:[[/#/,"string.$S2.escape","@interpolated"],{include:"@qstring"}],whitespace:[[/[ \t\r\n]+/,""],[/^\s*=begin\b/,"comment","@comment"],[/#.*$/,"comment"]],comment:[[/[^=]+/,"comment"],[/^\s*=begin\b/,"comment.invalid"],[/^\s*=end\b.*/,"comment","@pop"],[/[=]/,"comment"]]}};return a(m);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/rust/rust.js b/public/vs/basic-languages/rust/rust.js
new file mode 100644
index 0000000..fc42135
--- /dev/null
+++ b/public/vs/basic-languages/rust/rust.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/rust/rust", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var _=(t,e)=>{for(var n in e)r(t,n,{get:e[n],enumerable:!0})},u=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of a(e))!c.call(t,o)&&o!==n&&r(t,o,{get:()=>e[o],enumerable:!(s=i(e,o))||s.enumerable});return t};var l=t=>u(r({},"__esModule",{value:!0}),t);var m={};_(m,{conf:()=>f,language:()=>p});var f={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#pragma\\s+region\\b"),end:new RegExp("^\\s*#pragma\\s+endregion\\b")}}},p={tokenPostfix:".rust",defaultToken:"invalid",keywords:["as","async","await","box","break","const","continue","crate","dyn","else","enum","extern","false","fn","for","if","impl","in","let","loop","match","mod","move","mut","pub","ref","return","self","static","struct","super","trait","true","try","type","unsafe","use","where","while","catch","default","union","static","abstract","alignof","become","do","final","macro","offsetof","override","priv","proc","pure","sizeof","typeof","unsized","virtual","yield"],typeKeywords:["Self","m32","m64","m128","f80","f16","f128","int","uint","float","char","bool","u8","u16","u32","u64","f32","f64","i8","i16","i32","i64","str","Option","Either","c_float","c_double","c_void","FILE","fpos_t","DIR","dirent","c_char","c_schar","c_uchar","c_short","c_ushort","c_int","c_uint","c_long","c_ulong","size_t","ptrdiff_t","clock_t","time_t","c_longlong","c_ulonglong","intptr_t","uintptr_t","off_t","dev_t","ino_t","pid_t","mode_t","ssize_t"],constants:["true","false","Some","None","Left","Right","Ok","Err"],supportConstants:["EXIT_FAILURE","EXIT_SUCCESS","RAND_MAX","EOF","SEEK_SET","SEEK_CUR","SEEK_END","_IOFBF","_IONBF","_IOLBF","BUFSIZ","FOPEN_MAX","FILENAME_MAX","L_tmpnam","TMP_MAX","O_RDONLY","O_WRONLY","O_RDWR","O_APPEND","O_CREAT","O_EXCL","O_TRUNC","S_IFIFO","S_IFCHR","S_IFBLK","S_IFDIR","S_IFREG","S_IFMT","S_IEXEC","S_IWRITE","S_IREAD","S_IRWXU","S_IXUSR","S_IWUSR","S_IRUSR","F_OK","R_OK","W_OK","X_OK","STDIN_FILENO","STDOUT_FILENO","STDERR_FILENO"],supportMacros:["format!","print!","println!","panic!","format_args!","unreachable!","write!","writeln!"],operators:["!","!=","%","%=","&","&=","&&","*","*=","+","+=","-","-=","->",".","..","...","/","/=",":",";","<<","<<=","<","<=","=","==","=>",">",">=",">>",">>=","@","^","^=","|","|=","||","_","?","#"],escapes:/\\([nrt0\"''\\]|x\h{2}|u\{\h{1,6}\})/,delimiters:/[,]/,symbols:/[\#\!\%\&\*\+\-\.\/\:\;\<\=\>\@\^\|_\?]+/,intSuffixes:/[iu](8|16|32|64|128|size)/,floatSuffixes:/f(32|64)/,tokenizer:{root:[[/r(#*)"/,{token:"string.quote",bracket:"@open",next:"@stringraw.$1"}],[/[a-zA-Z][a-zA-Z0-9_]*!?|_[a-zA-Z0-9_]+/,{cases:{"@typeKeywords":"keyword.type","@keywords":"keyword","@supportConstants":"keyword","@supportMacros":"keyword","@constants":"keyword","@default":"identifier"}}],[/\$/,"identifier"],[/'[a-zA-Z_][a-zA-Z0-9_]*(?=[^\'])/,"identifier"],[/'(\S|@escapes)'/,"string.byteliteral"],[/"/,{token:"string.quote",bracket:"@open",next:"@string"}],{include:"@numbers"},{include:"@whitespace"},[/@delimiters/,{cases:{"@keywords":"keyword","@default":"delimiter"}}],[/[{}()\[\]<>]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],["\\*/","comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],stringraw:[[/[^"#]+/,{token:"string"}],[/"(#*)/,{cases:{"$1==$S2":{token:"string.quote",bracket:"@close",next:"@pop"},"@default":{token:"string"}}}],[/["#]/,{token:"string"}]],numbers:[[/(0o[0-7_]+)(@intSuffixes)?/,{token:"number"}],[/(0b[0-1_]+)(@intSuffixes)?/,{token:"number"}],[/[\d][\d_]*(\.[\d][\d_]*)?[eE][+-][\d_]+(@floatSuffixes)?/,{token:"number"}],[/\b(\d\.?[\d_]*)(@floatSuffixes)?\b/,{token:"number"}],[/(0x[\da-fA-F]+)_?(@intSuffixes)?/,{token:"number"}],[/[\d][\d_]*(@intSuffixes?)?/,{token:"number"}]]}};return l(m);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/sb/sb.js b/public/vs/basic-languages/sb/sb.js
new file mode 100644
index 0000000..8ca4a64
--- /dev/null
+++ b/public/vs/basic-languages/sb/sb.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/sb/sb", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var d=(o,e)=>{for(var t in e)r(o,t,{get:e[t],enumerable:!0})},c=(o,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!l.call(o,n)&&n!==t&&r(o,n,{get:()=>e[n],enumerable:!(s=i(e,n))||s.enumerable});return o};var g=o=>c(r({},"__esModule",{value:!0}),o);var m={};d(m,{conf:()=>p,language:()=>f});var p={comments:{lineComment:"'"},brackets:[["(",")"],["[","]"],["If","EndIf"],["While","EndWhile"],["For","EndFor"],["Sub","EndSub"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]}]},f={defaultToken:"",tokenPostfix:".sb",ignoreCase:!0,brackets:[{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"keyword.tag-if",open:"If",close:"EndIf"},{token:"keyword.tag-while",open:"While",close:"EndWhile"},{token:"keyword.tag-for",open:"For",close:"EndFor"},{token:"keyword.tag-sub",open:"Sub",close:"EndSub"}],keywords:["Else","ElseIf","EndFor","EndIf","EndSub","EndWhile","For","Goto","If","Step","Sub","Then","To","While"],tagwords:["If","Sub","While","For"],operators:[">","<","<>","<=",">=","And","Or","+","-","*","/","="],identifier:/[a-zA-Z_][\w]*/,symbols:/[=><:+\-*\/%\.,]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},[/(@identifier)(?=[.])/,"type"],[/@identifier/,{cases:{"@keywords":{token:"keyword.$0"},"@operators":"operator","@default":"variable.name"}}],[/([.])(@identifier)/,{cases:{$2:["delimiter","type.member"],"@default":""}}],[/\d*\.\d+/,"number.float"],[/\d+/,"number"],[/[()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":"delimiter"}}],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],whitespace:[[/[ \t\r\n]+/,""],[/(\').*$/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"C?/,"string","@pop"]]}};return g(m);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/scala/scala.js b/public/vs/basic-languages/scala/scala.js
new file mode 100644
index 0000000..30af62e
--- /dev/null
+++ b/public/vs/basic-languages/scala/scala.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/scala/scala", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var n=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var r in e)n(t,r,{get:e[r],enumerable:!0})},c=(t,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of i(e))!d.call(t,o)&&o!==r&&n(t,o,{get:()=>e[o],enumerable:!(a=s(e,o))||a.enumerable});return t};var g=t=>c(n({},"__esModule",{value:!0}),t);var m={};l(m,{conf:()=>p,language:()=>w});var p={wordPattern:/(unary_[@~!#%^&*()\-=+\\|:<>\/?]+)|([a-zA-Z_$][\w$]*?_=)|(`[^`]+`)|([a-zA-Z_$][\w$]*)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:<editor-fold\\b))"),end:new RegExp("^\\s*//\\s*(?:(?:#?endregion\\b)|(?:</editor-fold>))")}}},w={tokenPostfix:".scala",keywords:["asInstanceOf","catch","class","classOf","def","do","else","extends","finally","for","foreach","forSome","if","import","isInstanceOf","macro","match","new","object","package","return","throw","trait","try","type","until","val","var","while","with","yield","given","enum","then"],softKeywords:["as","export","extension","end","derives","on"],constants:["true","false","null","this","super"],modifiers:["abstract","final","implicit","lazy","override","private","protected","sealed"],softModifiers:["inline","opaque","open","transparent","using"],name:/(?:[a-z_$][\w$]*|`[^`]+`)/,type:/(?:[A-Z][\w$]*)/,symbols:/[=><!~?:&|+\-*\/^\\%@#]+/,digits:/\d+(_+\d+)*/,hexdigits:/[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,escapes:/\\(?:[btnfr\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,fstring_conv:/[bBhHsScCdoxXeEfgGaAt]|[Tn](?:[HIklMSLNpzZsQ]|[BbhAaCYyjmde]|[RTrDFC])/,tokenizer:{root:[[/\braw"""/,{token:"string.quote",bracket:"@open",next:"@rawstringt"}],[/\braw"/,{token:"string.quote",bracket:"@open",next:"@rawstring"}],[/\bs"""/,{token:"string.quote",bracket:"@open",next:"@sstringt"}],[/\bs"/,{token:"string.quote",bracket:"@open",next:"@sstring"}],[/\bf""""/,{token:"string.quote",bracket:"@open",next:"@fstringt"}],[/\bf"/,{token:"string.quote",bracket:"@open",next:"@fstring"}],[/"""/,{token:"string.quote",bracket:"@open",next:"@stringt"}],[/"/,{token:"string.quote",bracket:"@open",next:"@string"}],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float","@allowMethod"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float","@allowMethod"],[/0[xX](@hexdigits)[Ll]?/,"number.hex","@allowMethod"],[/(@digits)[fFdD]/,"number.float","@allowMethod"],[/(@digits)[lL]?/,"number","@allowMethod"],[/\b_\*/,"key"],[/\b(_)\b/,"keyword","@allowMethod"],[/\bimport\b/,"keyword","@import"],[/\b(case)([ \t]+)(class)\b/,["keyword.modifier","white","keyword"]],[/\bcase\b/,"keyword","@case"],[/\bva[lr]\b/,"keyword","@vardef"],[/\b(def)([ \t]+)((?:unary_)?@symbols|@name(?:_=)|@name)/,["keyword","white","identifier"]],[/@name(?=[ \t]*:(?!:))/,"variable"],[/(\.)(@name|@symbols)/,["operator",{token:"@rematch",next:"@allowMethod"}]],[/([{(])(\s*)(@name(?=\s*=>))/,["@brackets","white","variable"]],[/@name/,{cases:{"@keywords":"keyword","@softKeywords":"keyword","@modifiers":"keyword.modifier","@softModifiers":"keyword.modifier","@constants":{token:"constant",next:"@allowMethod"},"@default":{token:"identifier",next:"@allowMethod"}}}],[/@type/,"type","@allowMethod"],{include:"@whitespace"},[/@[a-zA-Z_$][\w$]*(?:\.[a-zA-Z_$][\w$]*)*/,"annotation"],[/[{(]/,"@brackets"],[/[})]/,"@brackets","@allowMethod"],[/\[/,"operator.square"],[/](?!\s*(?:va[rl]|def|type)\b)/,"operator.square","@allowMethod"],[/]/,"operator.square"],[/([=-]>|<-|>:|<:|:>|<%)(?=[\s\w()[\]{},\."'`])/,"keyword"],[/@symbols/,"operator"],[/[;,\.]/,"delimiter"],[/'[a-zA-Z$][\w$]*(?!')/,"attribute.name"],[/'[^\\']'/,"string","@allowMethod"],[/(')(@escapes)(')/,["string","string.escape",{token:"string",next:"@allowMethod"}]],[/'/,"string.invalid"]],import:[[/;/,"delimiter","@pop"],[/^|$/,"","@pop"],[/[ \t]+/,"white"],[/[\n\r]+/,"white","@pop"],[/\/\*/,"comment","@comment"],[/@name|@type/,"type"],[/[(){}]/,"@brackets"],[/[[\]]/,"operator.square"],[/[\.,]/,"delimiter"]],allowMethod:[[/^|$/,"","@pop"],[/[ \t]+/,"white"],[/[\n\r]+/,"white","@pop"],[/\/\*/,"comment","@comment"],[/(?==>[\s\w([{])/,"keyword","@pop"],[/(@name|@symbols)(?=[ \t]*[[({"'`]|[ \t]+(?:[+-]?\.?\d|\w))/,{cases:{"@keywords":{token:"keyword",next:"@pop"},"->|<-|>:|<:|<%":{token:"keyword",next:"@pop"},"@default":{token:"@rematch",next:"@pop"}}}],["","","@pop"]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],case:[[/\b_\*/,"key"],[/\b(_|true|false|null|this|super)\b/,"keyword","@allowMethod"],[/\bif\b|=>/,"keyword","@pop"],[/`[^`]+`/,"identifier","@allowMethod"],[/@name/,"variable","@allowMethod"],[/:::?|\||@(?![a-z_$])/,"keyword"],{include:"@root"}],vardef:[[/\b_\*/,"key"],[/\b(_|true|false|null|this|super)\b/,"keyword"],[/@name/,"variable"],[/:::?|\||@(?![a-z_$])/,"keyword"],[/=|:(?!:)/,"operator","@pop"],[/$/,"white","@pop"],{include:"@root"}],string:[[/[^\\"\n\r]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}]],stringt:[[/[^\\"\n\r]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/"/,"string"]],fstring:[[/@escapes/,"string.escape"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/%%/,"string"],[/(%)([\-#+ 0,(])(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","keyword.modifier","number","metatag"]],[/(%)(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","number","metatag"]],[/(%)([\-#+ 0,(])(@fstring_conv)/,["metatag","keyword.modifier","metatag"]],[/(%)(@fstring_conv)/,["metatag","metatag"]],[/./,"string"]],fstringt:[[/@escapes/,"string.escape"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/%%/,"string"],[/(%)([\-#+ 0,(])(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","keyword.modifier","number","metatag"]],[/(%)(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","number","metatag"]],[/(%)([\-#+ 0,(])(@fstring_conv)/,["metatag","keyword.modifier","metatag"]],[/(%)(@fstring_conv)/,["metatag","metatag"]],[/./,"string"]],sstring:[[/@escapes/,"string.escape"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/./,"string"]],sstringt:[[/@escapes/,"string.escape"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/./,"string"]],interp:[[/{/,"operator","@push"],[/}/,"operator","@pop"],{include:"@root"}],rawstring:[[/[^"]/,"string"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}]],rawstringt:[[/[^"]/,"string"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/"/,"string"]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}};return g(m);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/scheme/scheme.js b/public/vs/basic-languages/scheme/scheme.js
new file mode 100644
index 0000000..1798bfd
--- /dev/null
+++ b/public/vs/basic-languages/scheme/scheme.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/scheme/scheme", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var t in e)s(o,t,{get:e[t],enumerable:!0})},m=(o,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of i(e))!l.call(o,n)&&n!==t&&s(o,n,{get:()=>e[n],enumerable:!(a=r(e,n))||a.enumerable});return o};var p=o=>m(s({},"__esModule",{value:!0}),o);var u={};c(u,{conf:()=>d,language:()=>g});var d={comments:{lineComment:";",blockComment:["#|","|#"]},brackets:[["(",")"],["{","}"],["[","]"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},g={defaultToken:"",ignoreCase:!0,tokenPostfix:".scheme",brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],keywords:["case","do","let","loop","if","else","when","cons","car","cdr","cond","lambda","lambda*","syntax-rules","format","set!","quote","eval","append","list","list?","member?","load"],constants:["#t","#f"],operators:["eq?","eqv?","equal?","and","or","not","null?"],tokenizer:{root:[[/#[xXoObB][0-9a-fA-F]+/,"number.hex"],[/[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?/,"number.float"],[/(?:\b(?:(define|define-syntax|define-macro))\b)(\s+)((?:\w|\-|\!|\?)*)/,["keyword","white","variable"]],{include:"@whitespace"},{include:"@strings"},[/[a-zA-Z_#][a-zA-Z0-9_\-\?\!\*]*/,{cases:{"@keywords":"keyword","@constants":"constant","@operators":"operators","@default":"identifier"}}]],comment:[[/[^\|#]+/,"comment"],[/#\|/,"comment","@push"],[/\|#/,"comment","@pop"],[/[\|#]/,"comment"]],whitespace:[[/[ \t\r\n]+/,"white"],[/#\|/,"comment","@comment"],[/;.*$/,"comment"]],strings:[[/"$/,"string","@popall"],[/"(?=.)/,"string","@multiLineString"]],multiLineString:[[/[^\\"]+$/,"string","@popall"],[/[^\\"]+/,"string"],[/\\./,"string.escape"],[/"/,"string","@popall"],[/\\$/,"string"]]}};return p(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/scss/scss.js b/public/vs/basic-languages/scss/scss.js
new file mode 100644
index 0000000..3dbd04f
--- /dev/null
+++ b/public/vs/basic-languages/scss/scss.js
@@ -0,0 +1,12 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/scss/scss", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var i=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var c=(t,e)=>{for(var o in e)i(t,o,{get:e[o],enumerable:!0})},m=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of l(e))!d.call(t,n)&&n!==o&&i(t,n,{get:()=>e[n],enumerable:!(r=a(e,n))||r.enumerable});return t};var s=t=>m(i({},"__esModule",{value:!0}),t);var k={};c(k,{conf:()=>u,language:()=>p});var u={wordPattern:/(#?-?\d*\.\d\w*%?)|([@$#!.:]?[\w-?]+%?)|[@#!.]/g,comments:{blockComment:["/*","*/"],lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/"),end:new RegExp("^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/")}}},p={defaultToken:"",tokenPostfix:".scss",ws:`[ 	
+\r\f]*`,identifier:"-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{root:[{include:"@selector"}],selector:[{include:"@comments"},{include:"@import"},{include:"@variabledeclaration"},{include:"@warndebug"},["[@](include)",{token:"keyword",next:"@includedeclaration"}],["[@](keyframes|-webkit-keyframes|-moz-keyframes|-o-keyframes)",{token:"keyword",next:"@keyframedeclaration"}],["[@](page|content|font-face|-moz-document)",{token:"keyword"}],["[@](charset|namespace)",{token:"keyword",next:"@declarationbody"}],["[@](function)",{token:"keyword",next:"@functiondeclaration"}],["[@](mixin)",{token:"keyword",next:"@mixindeclaration"}],["url(\\-prefix)?\\(",{token:"meta",next:"@urldeclaration"}],{include:"@controlstatement"},{include:"@selectorname"},["[&\\*]","tag"],["[>\\+,]","delimiter"],["\\[",{token:"delimiter.bracket",next:"@selectorattribute"}],["{",{token:"delimiter.curly",next:"@selectorbody"}]],selectorbody:[["[*_]?@identifier@ws:(?=(\\s|\\d|[^{;}]*[;}]))","attribute.name","@rulevalue"],{include:"@selector"},["[@](extend)",{token:"keyword",next:"@extendbody"}],["[@](return)",{token:"keyword",next:"@declarationbody"}],["}",{token:"delimiter.curly",next:"@pop"}]],selectorname:[["#{",{token:"meta",next:"@variableinterpolation"}],["(\\.|#(?=[^{])|%|(@identifier)|:)+","tag"]],selectorattribute:[{include:"@term"},["]",{token:"delimiter.bracket",next:"@pop"}]],term:[{include:"@comments"},["url(\\-prefix)?\\(",{token:"meta",next:"@urldeclaration"}],{include:"@functioninvocation"},{include:"@numbers"},{include:"@strings"},{include:"@variablereference"},["(and\\b|or\\b|not\\b)","operator"],{include:"@name"},["([<>=\\+\\-\\*\\/\\^\\|\\~,])","operator"],[",","delimiter"],["!default","literal"],["\\(",{token:"delimiter.parenthesis",next:"@parenthizedterm"}]],rulevalue:[{include:"@term"},["!important","literal"],[";","delimiter","@pop"],["{",{token:"delimiter.curly",switchTo:"@nestedproperty"}],["(?=})",{token:"",next:"@pop"}]],nestedproperty:[["[*_]?@identifier@ws:","attribute.name","@rulevalue"],{include:"@comments"},["}",{token:"delimiter.curly",next:"@pop"}]],warndebug:[["[@](warn|debug)",{token:"keyword",next:"@declarationbody"}]],import:[["[@](import)",{token:"keyword",next:"@declarationbody"}]],variabledeclaration:[["\\$@identifier@ws:","variable.decl","@declarationbody"]],urldeclaration:[{include:"@strings"},[`[^)\r
+]+`,"string"],["\\)",{token:"meta",next:"@pop"}]],parenthizedterm:[{include:"@term"},["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],declarationbody:[{include:"@term"},[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],extendbody:[{include:"@selectorname"},["!optional","literal"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],variablereference:[["\\$@identifier","variable.ref"],["\\.\\.\\.","operator"],["#{",{token:"meta",next:"@variableinterpolation"}]],variableinterpolation:[{include:"@variablereference"},["}",{token:"meta",next:"@pop"}]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],name:[["@identifier","attribute.value"]],numbers:[["(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","number.hex"]],units:[["(em|ex|ch|rem|fr|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","number","@pop"]],functiondeclaration:[["@identifier@ws\\(",{token:"meta",next:"@parameterdeclaration"}],["{",{token:"delimiter.curly",switchTo:"@functionbody"}]],mixindeclaration:[["@identifier@ws\\(",{token:"meta",next:"@parameterdeclaration"}],["@identifier","meta"],["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],parameterdeclaration:[["\\$@identifier@ws:","variable.decl"],["\\.\\.\\.","operator"],[",","delimiter"],{include:"@term"},["\\)",{token:"meta",next:"@pop"}]],includedeclaration:[{include:"@functioninvocation"},["@identifier","meta"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}],["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],keyframedeclaration:[["@identifier","meta"],["{",{token:"delimiter.curly",switchTo:"@keyframebody"}]],keyframebody:[{include:"@term"},["{",{token:"delimiter.curly",next:"@selectorbody"}],["}",{token:"delimiter.curly",next:"@pop"}]],controlstatement:[["[@](if|else|for|while|each|media)",{token:"keyword.flow",next:"@controlstatementdeclaration"}]],controlstatementdeclaration:[["(in|from|through|if|to)\\b",{token:"keyword.flow"}],{include:"@term"},["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],functionbody:[["[@](return)",{token:"keyword"}],{include:"@variabledeclaration"},{include:"@term"},{include:"@controlstatement"},[";","delimiter"],["}",{token:"delimiter.curly",next:"@pop"}]],functioninvocation:[["@identifier\\(",{token:"meta",next:"@functionarguments"}]],functionarguments:[["\\$@identifier@ws:","attribute.name"],["[,]","delimiter"],{include:"@term"},["\\)",{token:"meta",next:"@pop"}]],strings:[['~?"',{token:"string.delimiter",next:"@stringenddoublequote"}],["~?'",{token:"string.delimiter",next:"@stringendquote"}]],stringenddoublequote:[["\\\\.","string"],['"',{token:"string.delimiter",next:"@pop"}],[".","string"]],stringendquote:[["\\\\.","string"],["'",{token:"string.delimiter",next:"@pop"}],[".","string"]]}};return s(k);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/shell/shell.js b/public/vs/basic-languages/shell/shell.js
new file mode 100644
index 0000000..3a62103
--- /dev/null
+++ b/public/vs/basic-languages/shell/shell.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/shell/shell", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var a=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(r,e)=>{for(var i in e)a(r,i,{get:e[i],enumerable:!0})},d=(r,e,i,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of n(e))!l.call(r,t)&&t!==i&&a(r,t,{get:()=>e[t],enumerable:!(o=s(e,t))||o.enumerable});return r};var p=r=>d(a({},"__esModule",{value:!0}),r);var g={};c(g,{conf:()=>m,language:()=>u});var m={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}]},u={defaultToken:"",ignoreCase:!0,tokenPostfix:".shell",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["if","then","do","else","elif","while","until","for","in","esac","fi","fin","fil","done","exit","set","unset","export","function"],builtins:["ab","awk","bash","beep","cat","cc","cd","chown","chmod","chroot","clear","cp","curl","cut","diff","echo","find","gawk","gcc","get","git","grep","hg","kill","killall","ln","ls","make","mkdir","openssl","mv","nc","node","npm","ping","ps","restart","rm","rmdir","sed","service","sh","shopt","shred","source","sort","sleep","ssh","start","stop","su","sudo","svn","tee","telnet","top","touch","vi","vim","wall","wc","wget","who","write","yes","zsh"],startingWithDash:/\-+\w+/,identifiersWithDashes:/[a-zA-Z]\w+(?:@startingWithDash)+/,symbols:/[=><!~?&|+\-*\/\^;\.,]+/,tokenizer:{root:[[/@identifiersWithDashes/,""],[/(\s)((?:@startingWithDash)+)/,["white","attribute.name"]],[/[a-zA-Z]\w*/,{cases:{"@keywords":"keyword","@builtins":"type.identifier","@default":""}}],{include:"@whitespace"},{include:"@strings"},{include:"@parameters"},{include:"@heredoc"},[/[{}\[\]()]/,"@brackets"],[/@symbols/,"delimiter"],{include:"@numbers"},[/[,;]/,"delimiter"]],whitespace:[[/\s+/,"white"],[/(^#!.*$)/,"metatag"],[/(^#.*$)/,"comment"]],numbers:[[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F_]*[0-9a-fA-F]/,"number.hex"],[/\d+/,"number"]],strings:[[/'/,"string","@stringBody"],[/"/,"string","@dblStringBody"]],stringBody:[[/'/,"string","@popall"],[/./,"string"]],dblStringBody:[[/"/,"string","@popall"],[/./,"string"]],heredoc:[[/(<<[-<]?)(\s*)(['"`]?)([\w\-]+)(['"`]?)/,["constants","white","string.heredoc.delimiter","string.heredoc","string.heredoc.delimiter"]]],parameters:[[/\$\d+/,"variable.predefined"],[/\$\w+/,"variable"],[/\$[*@#?\-$!0_]/,"variable"],[/\$'/,"variable","@parameterBodyQuote"],[/\$"/,"variable","@parameterBodyDoubleQuote"],[/\$\(/,"variable","@parameterBodyParen"],[/\$\{/,"variable","@parameterBodyCurlyBrace"]],parameterBodyQuote:[[/[^#:%*@\-!_']+/,"variable"],[/[#:%*@\-!_]/,"delimiter"],[/[']/,"variable","@pop"]],parameterBodyDoubleQuote:[[/[^#:%*@\-!_"]+/,"variable"],[/[#:%*@\-!_]/,"delimiter"],[/["]/,"variable","@pop"]],parameterBodyParen:[[/[^#:%*@\-!_)]+/,"variable"],[/[#:%*@\-!_]/,"delimiter"],[/[)]/,"variable","@pop"]],parameterBodyCurlyBrace:[[/[^#:%*@\-!_}]+/,"variable"],[/[#:%*@\-!_]/,"delimiter"],[/[}]/,"variable","@pop"]]}};return p(g);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/solidity/solidity.js b/public/vs/basic-languages/solidity/solidity.js
new file mode 100644
index 0000000..bb96282
--- /dev/null
+++ b/public/vs/basic-languages/solidity/solidity.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/solidity/solidity", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var f=Object.defineProperty;var t=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var o=(e,x)=>{for(var d in x)f(e,d,{get:x[d],enumerable:!0})},r=(e,x,d,u)=>{if(x&&typeof x=="object"||typeof x=="function")for(let i of n(x))!s.call(e,i)&&i!==d&&f(e,i,{get:()=>x[i],enumerable:!(u=t(x,i))||u.enumerable});return e};var a=e=>r(f({},"__esModule",{value:!0}),e);var l={};o(l,{conf:()=>c,language:()=>m});var c={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},m={defaultToken:"",tokenPostfix:".sol",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["pragma","solidity","contract","library","using","struct","function","modifier","constructor","address","string","bool","Int","Uint","Byte","Fixed","Ufixed","int","int8","int16","int24","int32","int40","int48","int56","int64","int72","int80","int88","int96","int104","int112","int120","int128","int136","int144","int152","int160","int168","int176","int184","int192","int200","int208","int216","int224","int232","int240","int248","int256","uint","uint8","uint16","uint24","uint32","uint40","uint48","uint56","uint64","uint72","uint80","uint88","uint96","uint104","uint112","uint120","uint128","uint136","uint144","uint152","uint160","uint168","uint176","uint184","uint192","uint200","uint208","uint216","uint224","uint232","uint240","uint248","uint256","byte","bytes","bytes1","bytes2","bytes3","bytes4","bytes5","bytes6","bytes7","bytes8","bytes9","bytes10","bytes11","bytes12","bytes13","bytes14","bytes15","bytes16","bytes17","bytes18","bytes19","bytes20","bytes21","bytes22","bytes23","bytes24","bytes25","bytes26","bytes27","bytes28","bytes29","bytes30","bytes31","bytes32","fixed","fixed0x8","fixed0x16","fixed0x24","fixed0x32","fixed0x40","fixed0x48","fixed0x56","fixed0x64","fixed0x72","fixed0x80","fixed0x88","fixed0x96","fixed0x104","fixed0x112","fixed0x120","fixed0x128","fixed0x136","fixed0x144","fixed0x152","fixed0x160","fixed0x168","fixed0x176","fixed0x184","fixed0x192","fixed0x200","fixed0x208","fixed0x216","fixed0x224","fixed0x232","fixed0x240","fixed0x248","fixed0x256","fixed8x8","fixed8x16","fixed8x24","fixed8x32","fixed8x40","fixed8x48","fixed8x56","fixed8x64","fixed8x72","fixed8x80","fixed8x88","fixed8x96","fixed8x104","fixed8x112","fixed8x120","fixed8x128","fixed8x136","fixed8x144","fixed8x152","fixed8x160","fixed8x168","fixed8x176","fixed8x184","fixed8x192","fixed8x200","fixed8x208","fixed8x216","fixed8x224","fixed8x232","fixed8x240","fixed8x248","fixed16x8","fixed16x16","fixed16x24","fixed16x32","fixed16x40","fixed16x48","fixed16x56","fixed16x64","fixed16x72","fixed16x80","fixed16x88","fixed16x96","fixed16x104","fixed16x112","fixed16x120","fixed16x128","fixed16x136","fixed16x144","fixed16x152","fixed16x160","fixed16x168","fixed16x176","fixed16x184","fixed16x192","fixed16x200","fixed16x208","fixed16x216","fixed16x224","fixed16x232","fixed16x240","fixed24x8","fixed24x16","fixed24x24","fixed24x32","fixed24x40","fixed24x48","fixed24x56","fixed24x64","fixed24x72","fixed24x80","fixed24x88","fixed24x96","fixed24x104","fixed24x112","fixed24x120","fixed24x128","fixed24x136","fixed24x144","fixed24x152","fixed24x160","fixed24x168","fixed24x176","fixed24x184","fixed24x192","fixed24x200","fixed24x208","fixed24x216","fixed24x224","fixed24x232","fixed32x8","fixed32x16","fixed32x24","fixed32x32","fixed32x40","fixed32x48","fixed32x56","fixed32x64","fixed32x72","fixed32x80","fixed32x88","fixed32x96","fixed32x104","fixed32x112","fixed32x120","fixed32x128","fixed32x136","fixed32x144","fixed32x152","fixed32x160","fixed32x168","fixed32x176","fixed32x184","fixed32x192","fixed32x200","fixed32x208","fixed32x216","fixed32x224","fixed40x8","fixed40x16","fixed40x24","fixed40x32","fixed40x40","fixed40x48","fixed40x56","fixed40x64","fixed40x72","fixed40x80","fixed40x88","fixed40x96","fixed40x104","fixed40x112","fixed40x120","fixed40x128","fixed40x136","fixed40x144","fixed40x152","fixed40x160","fixed40x168","fixed40x176","fixed40x184","fixed40x192","fixed40x200","fixed40x208","fixed40x216","fixed48x8","fixed48x16","fixed48x24","fixed48x32","fixed48x40","fixed48x48","fixed48x56","fixed48x64","fixed48x72","fixed48x80","fixed48x88","fixed48x96","fixed48x104","fixed48x112","fixed48x120","fixed48x128","fixed48x136","fixed48x144","fixed48x152","fixed48x160","fixed48x168","fixed48x176","fixed48x184","fixed48x192","fixed48x200","fixed48x208","fixed56x8","fixed56x16","fixed56x24","fixed56x32","fixed56x40","fixed56x48","fixed56x56","fixed56x64","fixed56x72","fixed56x80","fixed56x88","fixed56x96","fixed56x104","fixed56x112","fixed56x120","fixed56x128","fixed56x136","fixed56x144","fixed56x152","fixed56x160","fixed56x168","fixed56x176","fixed56x184","fixed56x192","fixed56x200","fixed64x8","fixed64x16","fixed64x24","fixed64x32","fixed64x40","fixed64x48","fixed64x56","fixed64x64","fixed64x72","fixed64x80","fixed64x88","fixed64x96","fixed64x104","fixed64x112","fixed64x120","fixed64x128","fixed64x136","fixed64x144","fixed64x152","fixed64x160","fixed64x168","fixed64x176","fixed64x184","fixed64x192","fixed72x8","fixed72x16","fixed72x24","fixed72x32","fixed72x40","fixed72x48","fixed72x56","fixed72x64","fixed72x72","fixed72x80","fixed72x88","fixed72x96","fixed72x104","fixed72x112","fixed72x120","fixed72x128","fixed72x136","fixed72x144","fixed72x152","fixed72x160","fixed72x168","fixed72x176","fixed72x184","fixed80x8","fixed80x16","fixed80x24","fixed80x32","fixed80x40","fixed80x48","fixed80x56","fixed80x64","fixed80x72","fixed80x80","fixed80x88","fixed80x96","fixed80x104","fixed80x112","fixed80x120","fixed80x128","fixed80x136","fixed80x144","fixed80x152","fixed80x160","fixed80x168","fixed80x176","fixed88x8","fixed88x16","fixed88x24","fixed88x32","fixed88x40","fixed88x48","fixed88x56","fixed88x64","fixed88x72","fixed88x80","fixed88x88","fixed88x96","fixed88x104","fixed88x112","fixed88x120","fixed88x128","fixed88x136","fixed88x144","fixed88x152","fixed88x160","fixed88x168","fixed96x8","fixed96x16","fixed96x24","fixed96x32","fixed96x40","fixed96x48","fixed96x56","fixed96x64","fixed96x72","fixed96x80","fixed96x88","fixed96x96","fixed96x104","fixed96x112","fixed96x120","fixed96x128","fixed96x136","fixed96x144","fixed96x152","fixed96x160","fixed104x8","fixed104x16","fixed104x24","fixed104x32","fixed104x40","fixed104x48","fixed104x56","fixed104x64","fixed104x72","fixed104x80","fixed104x88","fixed104x96","fixed104x104","fixed104x112","fixed104x120","fixed104x128","fixed104x136","fixed104x144","fixed104x152","fixed112x8","fixed112x16","fixed112x24","fixed112x32","fixed112x40","fixed112x48","fixed112x56","fixed112x64","fixed112x72","fixed112x80","fixed112x88","fixed112x96","fixed112x104","fixed112x112","fixed112x120","fixed112x128","fixed112x136","fixed112x144","fixed120x8","fixed120x16","fixed120x24","fixed120x32","fixed120x40","fixed120x48","fixed120x56","fixed120x64","fixed120x72","fixed120x80","fixed120x88","fixed120x96","fixed120x104","fixed120x112","fixed120x120","fixed120x128","fixed120x136","fixed128x8","fixed128x16","fixed128x24","fixed128x32","fixed128x40","fixed128x48","fixed128x56","fixed128x64","fixed128x72","fixed128x80","fixed128x88","fixed128x96","fixed128x104","fixed128x112","fixed128x120","fixed128x128","fixed136x8","fixed136x16","fixed136x24","fixed136x32","fixed136x40","fixed136x48","fixed136x56","fixed136x64","fixed136x72","fixed136x80","fixed136x88","fixed136x96","fixed136x104","fixed136x112","fixed136x120","fixed144x8","fixed144x16","fixed144x24","fixed144x32","fixed144x40","fixed144x48","fixed144x56","fixed144x64","fixed144x72","fixed144x80","fixed144x88","fixed144x96","fixed144x104","fixed144x112","fixed152x8","fixed152x16","fixed152x24","fixed152x32","fixed152x40","fixed152x48","fixed152x56","fixed152x64","fixed152x72","fixed152x80","fixed152x88","fixed152x96","fixed152x104","fixed160x8","fixed160x16","fixed160x24","fixed160x32","fixed160x40","fixed160x48","fixed160x56","fixed160x64","fixed160x72","fixed160x80","fixed160x88","fixed160x96","fixed168x8","fixed168x16","fixed168x24","fixed168x32","fixed168x40","fixed168x48","fixed168x56","fixed168x64","fixed168x72","fixed168x80","fixed168x88","fixed176x8","fixed176x16","fixed176x24","fixed176x32","fixed176x40","fixed176x48","fixed176x56","fixed176x64","fixed176x72","fixed176x80","fixed184x8","fixed184x16","fixed184x24","fixed184x32","fixed184x40","fixed184x48","fixed184x56","fixed184x64","fixed184x72","fixed192x8","fixed192x16","fixed192x24","fixed192x32","fixed192x40","fixed192x48","fixed192x56","fixed192x64","fixed200x8","fixed200x16","fixed200x24","fixed200x32","fixed200x40","fixed200x48","fixed200x56","fixed208x8","fixed208x16","fixed208x24","fixed208x32","fixed208x40","fixed208x48","fixed216x8","fixed216x16","fixed216x24","fixed216x32","fixed216x40","fixed224x8","fixed224x16","fixed224x24","fixed224x32","fixed232x8","fixed232x16","fixed232x24","fixed240x8","fixed240x16","fixed248x8","ufixed","ufixed0x8","ufixed0x16","ufixed0x24","ufixed0x32","ufixed0x40","ufixed0x48","ufixed0x56","ufixed0x64","ufixed0x72","ufixed0x80","ufixed0x88","ufixed0x96","ufixed0x104","ufixed0x112","ufixed0x120","ufixed0x128","ufixed0x136","ufixed0x144","ufixed0x152","ufixed0x160","ufixed0x168","ufixed0x176","ufixed0x184","ufixed0x192","ufixed0x200","ufixed0x208","ufixed0x216","ufixed0x224","ufixed0x232","ufixed0x240","ufixed0x248","ufixed0x256","ufixed8x8","ufixed8x16","ufixed8x24","ufixed8x32","ufixed8x40","ufixed8x48","ufixed8x56","ufixed8x64","ufixed8x72","ufixed8x80","ufixed8x88","ufixed8x96","ufixed8x104","ufixed8x112","ufixed8x120","ufixed8x128","ufixed8x136","ufixed8x144","ufixed8x152","ufixed8x160","ufixed8x168","ufixed8x176","ufixed8x184","ufixed8x192","ufixed8x200","ufixed8x208","ufixed8x216","ufixed8x224","ufixed8x232","ufixed8x240","ufixed8x248","ufixed16x8","ufixed16x16","ufixed16x24","ufixed16x32","ufixed16x40","ufixed16x48","ufixed16x56","ufixed16x64","ufixed16x72","ufixed16x80","ufixed16x88","ufixed16x96","ufixed16x104","ufixed16x112","ufixed16x120","ufixed16x128","ufixed16x136","ufixed16x144","ufixed16x152","ufixed16x160","ufixed16x168","ufixed16x176","ufixed16x184","ufixed16x192","ufixed16x200","ufixed16x208","ufixed16x216","ufixed16x224","ufixed16x232","ufixed16x240","ufixed24x8","ufixed24x16","ufixed24x24","ufixed24x32","ufixed24x40","ufixed24x48","ufixed24x56","ufixed24x64","ufixed24x72","ufixed24x80","ufixed24x88","ufixed24x96","ufixed24x104","ufixed24x112","ufixed24x120","ufixed24x128","ufixed24x136","ufixed24x144","ufixed24x152","ufixed24x160","ufixed24x168","ufixed24x176","ufixed24x184","ufixed24x192","ufixed24x200","ufixed24x208","ufixed24x216","ufixed24x224","ufixed24x232","ufixed32x8","ufixed32x16","ufixed32x24","ufixed32x32","ufixed32x40","ufixed32x48","ufixed32x56","ufixed32x64","ufixed32x72","ufixed32x80","ufixed32x88","ufixed32x96","ufixed32x104","ufixed32x112","ufixed32x120","ufixed32x128","ufixed32x136","ufixed32x144","ufixed32x152","ufixed32x160","ufixed32x168","ufixed32x176","ufixed32x184","ufixed32x192","ufixed32x200","ufixed32x208","ufixed32x216","ufixed32x224","ufixed40x8","ufixed40x16","ufixed40x24","ufixed40x32","ufixed40x40","ufixed40x48","ufixed40x56","ufixed40x64","ufixed40x72","ufixed40x80","ufixed40x88","ufixed40x96","ufixed40x104","ufixed40x112","ufixed40x120","ufixed40x128","ufixed40x136","ufixed40x144","ufixed40x152","ufixed40x160","ufixed40x168","ufixed40x176","ufixed40x184","ufixed40x192","ufixed40x200","ufixed40x208","ufixed40x216","ufixed48x8","ufixed48x16","ufixed48x24","ufixed48x32","ufixed48x40","ufixed48x48","ufixed48x56","ufixed48x64","ufixed48x72","ufixed48x80","ufixed48x88","ufixed48x96","ufixed48x104","ufixed48x112","ufixed48x120","ufixed48x128","ufixed48x136","ufixed48x144","ufixed48x152","ufixed48x160","ufixed48x168","ufixed48x176","ufixed48x184","ufixed48x192","ufixed48x200","ufixed48x208","ufixed56x8","ufixed56x16","ufixed56x24","ufixed56x32","ufixed56x40","ufixed56x48","ufixed56x56","ufixed56x64","ufixed56x72","ufixed56x80","ufixed56x88","ufixed56x96","ufixed56x104","ufixed56x112","ufixed56x120","ufixed56x128","ufixed56x136","ufixed56x144","ufixed56x152","ufixed56x160","ufixed56x168","ufixed56x176","ufixed56x184","ufixed56x192","ufixed56x200","ufixed64x8","ufixed64x16","ufixed64x24","ufixed64x32","ufixed64x40","ufixed64x48","ufixed64x56","ufixed64x64","ufixed64x72","ufixed64x80","ufixed64x88","ufixed64x96","ufixed64x104","ufixed64x112","ufixed64x120","ufixed64x128","ufixed64x136","ufixed64x144","ufixed64x152","ufixed64x160","ufixed64x168","ufixed64x176","ufixed64x184","ufixed64x192","ufixed72x8","ufixed72x16","ufixed72x24","ufixed72x32","ufixed72x40","ufixed72x48","ufixed72x56","ufixed72x64","ufixed72x72","ufixed72x80","ufixed72x88","ufixed72x96","ufixed72x104","ufixed72x112","ufixed72x120","ufixed72x128","ufixed72x136","ufixed72x144","ufixed72x152","ufixed72x160","ufixed72x168","ufixed72x176","ufixed72x184","ufixed80x8","ufixed80x16","ufixed80x24","ufixed80x32","ufixed80x40","ufixed80x48","ufixed80x56","ufixed80x64","ufixed80x72","ufixed80x80","ufixed80x88","ufixed80x96","ufixed80x104","ufixed80x112","ufixed80x120","ufixed80x128","ufixed80x136","ufixed80x144","ufixed80x152","ufixed80x160","ufixed80x168","ufixed80x176","ufixed88x8","ufixed88x16","ufixed88x24","ufixed88x32","ufixed88x40","ufixed88x48","ufixed88x56","ufixed88x64","ufixed88x72","ufixed88x80","ufixed88x88","ufixed88x96","ufixed88x104","ufixed88x112","ufixed88x120","ufixed88x128","ufixed88x136","ufixed88x144","ufixed88x152","ufixed88x160","ufixed88x168","ufixed96x8","ufixed96x16","ufixed96x24","ufixed96x32","ufixed96x40","ufixed96x48","ufixed96x56","ufixed96x64","ufixed96x72","ufixed96x80","ufixed96x88","ufixed96x96","ufixed96x104","ufixed96x112","ufixed96x120","ufixed96x128","ufixed96x136","ufixed96x144","ufixed96x152","ufixed96x160","ufixed104x8","ufixed104x16","ufixed104x24","ufixed104x32","ufixed104x40","ufixed104x48","ufixed104x56","ufixed104x64","ufixed104x72","ufixed104x80","ufixed104x88","ufixed104x96","ufixed104x104","ufixed104x112","ufixed104x120","ufixed104x128","ufixed104x136","ufixed104x144","ufixed104x152","ufixed112x8","ufixed112x16","ufixed112x24","ufixed112x32","ufixed112x40","ufixed112x48","ufixed112x56","ufixed112x64","ufixed112x72","ufixed112x80","ufixed112x88","ufixed112x96","ufixed112x104","ufixed112x112","ufixed112x120","ufixed112x128","ufixed112x136","ufixed112x144","ufixed120x8","ufixed120x16","ufixed120x24","ufixed120x32","ufixed120x40","ufixed120x48","ufixed120x56","ufixed120x64","ufixed120x72","ufixed120x80","ufixed120x88","ufixed120x96","ufixed120x104","ufixed120x112","ufixed120x120","ufixed120x128","ufixed120x136","ufixed128x8","ufixed128x16","ufixed128x24","ufixed128x32","ufixed128x40","ufixed128x48","ufixed128x56","ufixed128x64","ufixed128x72","ufixed128x80","ufixed128x88","ufixed128x96","ufixed128x104","ufixed128x112","ufixed128x120","ufixed128x128","ufixed136x8","ufixed136x16","ufixed136x24","ufixed136x32","ufixed136x40","ufixed136x48","ufixed136x56","ufixed136x64","ufixed136x72","ufixed136x80","ufixed136x88","ufixed136x96","ufixed136x104","ufixed136x112","ufixed136x120","ufixed144x8","ufixed144x16","ufixed144x24","ufixed144x32","ufixed144x40","ufixed144x48","ufixed144x56","ufixed144x64","ufixed144x72","ufixed144x80","ufixed144x88","ufixed144x96","ufixed144x104","ufixed144x112","ufixed152x8","ufixed152x16","ufixed152x24","ufixed152x32","ufixed152x40","ufixed152x48","ufixed152x56","ufixed152x64","ufixed152x72","ufixed152x80","ufixed152x88","ufixed152x96","ufixed152x104","ufixed160x8","ufixed160x16","ufixed160x24","ufixed160x32","ufixed160x40","ufixed160x48","ufixed160x56","ufixed160x64","ufixed160x72","ufixed160x80","ufixed160x88","ufixed160x96","ufixed168x8","ufixed168x16","ufixed168x24","ufixed168x32","ufixed168x40","ufixed168x48","ufixed168x56","ufixed168x64","ufixed168x72","ufixed168x80","ufixed168x88","ufixed176x8","ufixed176x16","ufixed176x24","ufixed176x32","ufixed176x40","ufixed176x48","ufixed176x56","ufixed176x64","ufixed176x72","ufixed176x80","ufixed184x8","ufixed184x16","ufixed184x24","ufixed184x32","ufixed184x40","ufixed184x48","ufixed184x56","ufixed184x64","ufixed184x72","ufixed192x8","ufixed192x16","ufixed192x24","ufixed192x32","ufixed192x40","ufixed192x48","ufixed192x56","ufixed192x64","ufixed200x8","ufixed200x16","ufixed200x24","ufixed200x32","ufixed200x40","ufixed200x48","ufixed200x56","ufixed208x8","ufixed208x16","ufixed208x24","ufixed208x32","ufixed208x40","ufixed208x48","ufixed216x8","ufixed216x16","ufixed216x24","ufixed216x32","ufixed216x40","ufixed224x8","ufixed224x16","ufixed224x24","ufixed224x32","ufixed232x8","ufixed232x16","ufixed232x24","ufixed240x8","ufixed240x16","ufixed248x8","event","enum","let","mapping","private","public","external","inherited","payable","true","false","var","import","constant","if","else","for","else","for","while","do","break","continue","throw","returns","return","suicide","new","is","this","super"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,integersuffix:/(ll|LL|u|U|l|L)?(ll|LL|u|U|l|L)?/,floatsuffix:/[fFlL]?/,tokenizer:{root:[[/[a-zA-Z_]\w*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/\[\[.*\]\]/,"annotation"],[/^\s*#\w+/,"keyword"],[/int\d*/,"keyword"],[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}};return a(l);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/sophia/sophia.js b/public/vs/basic-languages/sophia/sophia.js
new file mode 100644
index 0000000..f5aaca8
--- /dev/null
+++ b/public/vs/basic-languages/sophia/sophia.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/sophia/sophia", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var o in e)s(t,o,{get:e[o],enumerable:!0})},m=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!c.call(t,n)&&n!==o&&s(t,n,{get:()=>e[n],enumerable:!(r=i(e,n))||r.enumerable});return t};var d=t=>m(s({},"__esModule",{value:!0}),t);var u={};l(u,{conf:()=>f,language:()=>g});var f={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},g={defaultToken:"",tokenPostfix:".aes",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["contract","library","entrypoint","function","stateful","state","hash","signature","tuple","list","address","string","bool","int","record","datatype","type","option","oracle","oracle_query","Call","Bits","Bytes","Oracle","String","Crypto","Address","Auth","Chain","None","Some","bits","bytes","event","let","map","private","public","true","false","var","if","else","throw"],operators:["=",">","<","!","~","?","::",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,integersuffix:/(ll|LL|u|U|l|L)?(ll|LL|u|U|l|L)?/,floatsuffix:/[fFlL]?/,tokenizer:{root:[[/[a-zA-Z_]\w*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/\[\[.*\]\]/,"annotation"],[/^\s*#\w+/,"keyword"],[/int\d*/,"keyword"],[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}};return d(u);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/sparql/sparql.js b/public/vs/basic-languages/sparql/sparql.js
new file mode 100644
index 0000000..3f2502c
--- /dev/null
+++ b/public/vs/basic-languages/sparql/sparql.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/sparql/sparql", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var d=(s,e)=>{for(var n in e)o(s,n,{get:e[n],enumerable:!0})},c=(s,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of a(e))!l.call(s,t)&&t!==n&&o(s,t,{get:()=>e[t],enumerable:!(r=i(e,t))||r.enumerable});return s};var g=s=>c(o({},"__esModule",{value:!0}),s);var m={};d(m,{conf:()=>u,language:()=>p});var u={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"'",close:"'",notIn:["string"]},{open:'"',close:'"',notIn:["string"]},{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"}]},p={defaultToken:"",tokenPostfix:".rq",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["add","as","asc","ask","base","by","clear","construct","copy","create","data","delete","desc","describe","distinct","drop","false","filter","from","graph","group","having","in","insert","limit","load","minus","move","named","not","offset","optional","order","prefix","reduced","select","service","silent","to","true","undef","union","using","values","where","with"],builtinFunctions:["a","abs","avg","bind","bnode","bound","ceil","coalesce","concat","contains","count","datatype","day","encode_for_uri","exists","floor","group_concat","hours","if","iri","isblank","isiri","isliteral","isnumeric","isuri","lang","langmatches","lcase","max","md5","min","minutes","month","now","rand","regex","replace","round","sameterm","sample","seconds","sha1","sha256","sha384","sha512","str","strafter","strbefore","strdt","strends","strlang","strlen","strstarts","struuid","substr","sum","timezone","tz","ucase","uri","uuid","year"],ignoreCase:!0,tokenizer:{root:[[/<[^\s\u00a0>]*>?/,"tag"],{include:"@strings"},[/#.*/,"comment"],[/[{}()\[\]]/,"@brackets"],[/[;,.]/,"delimiter"],[/[_\w\d]+:(\.(?=[\w_\-\\%])|[:\w_-]|\\[-\\_~.!$&'()*+,;=/?#@%]|%[a-f\d][a-f\d])*/,"tag"],[/:(\.(?=[\w_\-\\%])|[:\w_-]|\\[-\\_~.!$&'()*+,;=/?#@%]|%[a-f\d][a-f\d])+/,"tag"],[/[$?]?[_\w\d]+/,{cases:{"@keywords":{token:"keyword"},"@builtinFunctions":{token:"predefined.sql"},"@default":"identifier"}}],[/\^\^/,"operator.sql"],[/\^[*+\-<>=&|^\/!?]*/,"operator.sql"],[/[*+\-<>=&|\/!?]/,"operator.sql"],[/@[a-z\d\-]*/,"metatag.html"],[/\s+/,"white"]],strings:[[/'([^'\\]|\\.)*$/,"string.invalid"],[/'$/,"string.sql","@pop"],[/'/,"string.sql","@stringBody"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"$/,"string.sql","@pop"],[/"/,"string.sql","@dblStringBody"]],stringBody:[[/[^\\']+/,"string.sql"],[/\\./,"string.escape"],[/'/,"string.sql","@pop"]],dblStringBody:[[/[^\\"]+/,"string.sql"],[/\\./,"string.escape"],[/"/,"string.sql","@pop"]]}};return g(m);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/sql/sql.js b/public/vs/basic-languages/sql/sql.js
new file mode 100644
index 0000000..d155acb
--- /dev/null
+++ b/public/vs/basic-languages/sql/sql.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/sql/sql", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var I=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var L=(T,E)=>{for(var A in E)I(T,A,{get:E[A],enumerable:!0})},e=(T,E,A,N)=>{if(E&&typeof E=="object"||typeof E=="function")for(let R of O(E))!C.call(T,R)&&R!==A&&I(T,R,{get:()=>E[R],enumerable:!(N=S(E,R))||N.enumerable});return T};var P=T=>e(I({},"__esModule",{value:!0}),T);var M={};L(M,{conf:()=>D,language:()=>U});var D={comments:{lineComment:"--",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},U={defaultToken:"",tokenPostfix:".sql",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["ABORT","ABSOLUTE","ACTION","ADA","ADD","AFTER","ALL","ALLOCATE","ALTER","ALWAYS","ANALYZE","AND","ANY","ARE","AS","ASC","ASSERTION","AT","ATTACH","AUTHORIZATION","AUTOINCREMENT","AVG","BACKUP","BEFORE","BEGIN","BETWEEN","BIT","BIT_LENGTH","BOTH","BREAK","BROWSE","BULK","BY","CASCADE","CASCADED","CASE","CAST","CATALOG","CHAR","CHARACTER","CHARACTER_LENGTH","CHAR_LENGTH","CHECK","CHECKPOINT","CLOSE","CLUSTERED","COALESCE","COLLATE","COLLATION","COLUMN","COMMIT","COMPUTE","CONFLICT","CONNECT","CONNECTION","CONSTRAINT","CONSTRAINTS","CONTAINS","CONTAINSTABLE","CONTINUE","CONVERT","CORRESPONDING","COUNT","CREATE","CROSS","CURRENT","CURRENT_DATE","CURRENT_TIME","CURRENT_TIMESTAMP","CURRENT_USER","CURSOR","DATABASE","DATE","DAY","DBCC","DEALLOCATE","DEC","DECIMAL","DECLARE","DEFAULT","DEFERRABLE","DEFERRED","DELETE","DENY","DESC","DESCRIBE","DESCRIPTOR","DETACH","DIAGNOSTICS","DISCONNECT","DISK","DISTINCT","DISTRIBUTED","DO","DOMAIN","DOUBLE","DROP","DUMP","EACH","ELSE","END","END-EXEC","ERRLVL","ESCAPE","EXCEPT","EXCEPTION","EXCLUDE","EXCLUSIVE","EXEC","EXECUTE","EXISTS","EXIT","EXPLAIN","EXTERNAL","EXTRACT","FAIL","FALSE","FETCH","FILE","FILLFACTOR","FILTER","FIRST","FLOAT","FOLLOWING","FOR","FOREIGN","FORTRAN","FOUND","FREETEXT","FREETEXTTABLE","FROM","FULL","FUNCTION","GENERATED","GET","GLOB","GLOBAL","GO","GOTO","GRANT","GROUP","GROUPS","HAVING","HOLDLOCK","HOUR","IDENTITY","IDENTITYCOL","IDENTITY_INSERT","IF","IGNORE","IMMEDIATE","IN","INCLUDE","INDEX","INDEXED","INDICATOR","INITIALLY","INNER","INPUT","INSENSITIVE","INSERT","INSTEAD","INT","INTEGER","INTERSECT","INTERVAL","INTO","IS","ISNULL","ISOLATION","JOIN","KEY","KILL","LANGUAGE","LAST","LEADING","LEFT","LEVEL","LIKE","LIMIT","LINENO","LOAD","LOCAL","LOWER","MATCH","MATERIALIZED","MAX","MERGE","MIN","MINUTE","MODULE","MONTH","NAMES","NATIONAL","NATURAL","NCHAR","NEXT","NO","NOCHECK","NONCLUSTERED","NONE","NOT","NOTHING","NOTNULL","NULL","NULLIF","NULLS","NUMERIC","OCTET_LENGTH","OF","OFF","OFFSET","OFFSETS","ON","ONLY","OPEN","OPENDATASOURCE","OPENQUERY","OPENROWSET","OPENXML","OPTION","OR","ORDER","OTHERS","OUTER","OUTPUT","OVER","OVERLAPS","PAD","PARTIAL","PARTITION","PASCAL","PERCENT","PIVOT","PLAN","POSITION","PRAGMA","PRECEDING","PRECISION","PREPARE","PRESERVE","PRIMARY","PRINT","PRIOR","PRIVILEGES","PROC","PROCEDURE","PUBLIC","QUERY","RAISE","RAISERROR","RANGE","READ","READTEXT","REAL","RECONFIGURE","RECURSIVE","REFERENCES","REGEXP","REINDEX","RELATIVE","RELEASE","RENAME","REPLACE","REPLICATION","RESTORE","RESTRICT","RETURN","RETURNING","REVERT","REVOKE","RIGHT","ROLLBACK","ROW","ROWCOUNT","ROWGUIDCOL","ROWS","RULE","SAVE","SAVEPOINT","SCHEMA","SCROLL","SECOND","SECTION","SECURITYAUDIT","SELECT","SEMANTICKEYPHRASETABLE","SEMANTICSIMILARITYDETAILSTABLE","SEMANTICSIMILARITYTABLE","SESSION","SESSION_USER","SET","SETUSER","SHUTDOWN","SIZE","SMALLINT","SOME","SPACE","SQL","SQLCA","SQLCODE","SQLERROR","SQLSTATE","SQLWARNING","STATISTICS","SUBSTRING","SUM","SYSTEM_USER","TABLE","TABLESAMPLE","TEMP","TEMPORARY","TEXTSIZE","THEN","TIES","TIME","TIMESTAMP","TIMEZONE_HOUR","TIMEZONE_MINUTE","TO","TOP","TRAILING","TRAN","TRANSACTION","TRANSLATE","TRANSLATION","TRIGGER","TRIM","TRUE","TRUNCATE","TRY_CONVERT","TSEQUAL","UNBOUNDED","UNION","UNIQUE","UNKNOWN","UNPIVOT","UPDATE","UPDATETEXT","UPPER","USAGE","USE","USER","USING","VACUUM","VALUE","VALUES","VARCHAR","VARYING","VIEW","VIRTUAL","WAITFOR","WHEN","WHENEVER","WHERE","WHILE","WINDOW","WITH","WITHIN GROUP","WITHOUT","WORK","WRITE","WRITETEXT","YEAR","ZONE"],operators:["ALL","AND","ANY","BETWEEN","EXISTS","IN","LIKE","NOT","OR","SOME","EXCEPT","INTERSECT","UNION","APPLY","CROSS","FULL","INNER","JOIN","LEFT","OUTER","RIGHT","CONTAINS","FREETEXT","IS","NULL","PIVOT","UNPIVOT","MATCHED"],builtinFunctions:["AVG","CHECKSUM_AGG","COUNT","COUNT_BIG","GROUPING","GROUPING_ID","MAX","MIN","SUM","STDEV","STDEVP","VAR","VARP","CUME_DIST","FIRST_VALUE","LAG","LAST_VALUE","LEAD","PERCENTILE_CONT","PERCENTILE_DISC","PERCENT_RANK","COLLATE","COLLATIONPROPERTY","TERTIARY_WEIGHTS","FEDERATION_FILTERING_VALUE","CAST","CONVERT","PARSE","TRY_CAST","TRY_CONVERT","TRY_PARSE","ASYMKEY_ID","ASYMKEYPROPERTY","CERTPROPERTY","CERT_ID","CRYPT_GEN_RANDOM","DECRYPTBYASYMKEY","DECRYPTBYCERT","DECRYPTBYKEY","DECRYPTBYKEYAUTOASYMKEY","DECRYPTBYKEYAUTOCERT","DECRYPTBYPASSPHRASE","ENCRYPTBYASYMKEY","ENCRYPTBYCERT","ENCRYPTBYKEY","ENCRYPTBYPASSPHRASE","HASHBYTES","IS_OBJECTSIGNED","KEY_GUID","KEY_ID","KEY_NAME","SIGNBYASYMKEY","SIGNBYCERT","SYMKEYPROPERTY","VERIFYSIGNEDBYCERT","VERIFYSIGNEDBYASYMKEY","CURSOR_STATUS","DATALENGTH","IDENT_CURRENT","IDENT_INCR","IDENT_SEED","IDENTITY","SQL_VARIANT_PROPERTY","CURRENT_TIMESTAMP","DATEADD","DATEDIFF","DATEFROMPARTS","DATENAME","DATEPART","DATETIME2FROMPARTS","DATETIMEFROMPARTS","DATETIMEOFFSETFROMPARTS","DAY","EOMONTH","GETDATE","GETUTCDATE","ISDATE","MONTH","SMALLDATETIMEFROMPARTS","SWITCHOFFSET","SYSDATETIME","SYSDATETIMEOFFSET","SYSUTCDATETIME","TIMEFROMPARTS","TODATETIMEOFFSET","YEAR","CHOOSE","COALESCE","IIF","NULLIF","ABS","ACOS","ASIN","ATAN","ATN2","CEILING","COS","COT","DEGREES","EXP","FLOOR","LOG","LOG10","PI","POWER","RADIANS","RAND","ROUND","SIGN","SIN","SQRT","SQUARE","TAN","APP_NAME","APPLOCK_MODE","APPLOCK_TEST","ASSEMBLYPROPERTY","COL_LENGTH","COL_NAME","COLUMNPROPERTY","DATABASE_PRINCIPAL_ID","DATABASEPROPERTYEX","DB_ID","DB_NAME","FILE_ID","FILE_IDEX","FILE_NAME","FILEGROUP_ID","FILEGROUP_NAME","FILEGROUPPROPERTY","FILEPROPERTY","FULLTEXTCATALOGPROPERTY","FULLTEXTSERVICEPROPERTY","INDEX_COL","INDEXKEY_PROPERTY","INDEXPROPERTY","OBJECT_DEFINITION","OBJECT_ID","OBJECT_NAME","OBJECT_SCHEMA_NAME","OBJECTPROPERTY","OBJECTPROPERTYEX","ORIGINAL_DB_NAME","PARSENAME","SCHEMA_ID","SCHEMA_NAME","SCOPE_IDENTITY","SERVERPROPERTY","STATS_DATE","TYPE_ID","TYPE_NAME","TYPEPROPERTY","DENSE_RANK","NTILE","RANK","ROW_NUMBER","PUBLISHINGSERVERNAME","OPENDATASOURCE","OPENQUERY","OPENROWSET","OPENXML","CERTENCODED","CERTPRIVATEKEY","CURRENT_USER","HAS_DBACCESS","HAS_PERMS_BY_NAME","IS_MEMBER","IS_ROLEMEMBER","IS_SRVROLEMEMBER","LOGINPROPERTY","ORIGINAL_LOGIN","PERMISSIONS","PWDENCRYPT","PWDCOMPARE","SESSION_USER","SESSIONPROPERTY","SUSER_ID","SUSER_NAME","SUSER_SID","SUSER_SNAME","SYSTEM_USER","USER","USER_ID","USER_NAME","ASCII","CHAR","CHARINDEX","CONCAT","DIFFERENCE","FORMAT","LEFT","LEN","LOWER","LTRIM","NCHAR","PATINDEX","QUOTENAME","REPLACE","REPLICATE","REVERSE","RIGHT","RTRIM","SOUNDEX","SPACE","STR","STUFF","SUBSTRING","UNICODE","UPPER","BINARY_CHECKSUM","CHECKSUM","CONNECTIONPROPERTY","CONTEXT_INFO","CURRENT_REQUEST_ID","ERROR_LINE","ERROR_NUMBER","ERROR_MESSAGE","ERROR_PROCEDURE","ERROR_SEVERITY","ERROR_STATE","FORMATMESSAGE","GETANSINULL","GET_FILESTREAM_TRANSACTION_CONTEXT","HOST_ID","HOST_NAME","ISNULL","ISNUMERIC","MIN_ACTIVE_ROWVERSION","NEWID","NEWSEQUENTIALID","ROWCOUNT_BIG","XACT_STATE","TEXTPTR","TEXTVALID","COLUMNS_UPDATED","EVENTDATA","TRIGGER_NESTLEVEL","UPDATE","CHANGETABLE","CHANGE_TRACKING_CONTEXT","CHANGE_TRACKING_CURRENT_VERSION","CHANGE_TRACKING_IS_COLUMN_IN_MASK","CHANGE_TRACKING_MIN_VALID_VERSION","CONTAINSTABLE","FREETEXTTABLE","SEMANTICKEYPHRASETABLE","SEMANTICSIMILARITYDETAILSTABLE","SEMANTICSIMILARITYTABLE","FILETABLEROOTPATH","GETFILENAMESPACEPATH","GETPATHLOCATOR","PATHNAME","GET_TRANSMISSION_STATUS"],builtinVariables:["@@DATEFIRST","@@DBTS","@@LANGID","@@LANGUAGE","@@LOCK_TIMEOUT","@@MAX_CONNECTIONS","@@MAX_PRECISION","@@NESTLEVEL","@@OPTIONS","@@REMSERVER","@@SERVERNAME","@@SERVICENAME","@@SPID","@@TEXTSIZE","@@VERSION","@@CURSOR_ROWS","@@FETCH_STATUS","@@DATEFIRST","@@PROCID","@@ERROR","@@IDENTITY","@@ROWCOUNT","@@TRANCOUNT","@@CONNECTIONS","@@CPU_BUSY","@@IDLE","@@IO_BUSY","@@PACKET_ERRORS","@@PACK_RECEIVED","@@PACK_SENT","@@TIMETICKS","@@TOTAL_ERRORS","@@TOTAL_READ","@@TOTAL_WRITE"],pseudoColumns:["$ACTION","$IDENTITY","$ROWGUID","$PARTITION"],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@pseudoColumns"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@keywords":"keyword","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],pseudoColumns:[[/[$][A-Za-z_][\w@#$]*/,{cases:{"@pseudoColumns":"predefined","@default":"identifier"}}]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/N'/,{token:"string",next:"@string"}],[/'/,{token:"string",next:"@string"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],complexIdentifiers:[[/\[/,{token:"identifier.quote",next:"@bracketedIdentifier"}],[/"/,{token:"identifier.quote",next:"@quotedIdentifier"}]],bracketedIdentifier:[[/[^\]]+/,"identifier"],[/]]/,"identifier"],[/]/,{token:"identifier.quote",next:"@pop"}]],quotedIdentifier:[[/[^"]+/,"identifier"],[/""/,"identifier"],[/"/,{token:"identifier.quote",next:"@pop"}]],scopes:[[/BEGIN\s+(DISTRIBUTED\s+)?TRAN(SACTION)?\b/i,"keyword"],[/BEGIN\s+TRY\b/i,{token:"keyword.try"}],[/END\s+TRY\b/i,{token:"keyword.try"}],[/BEGIN\s+CATCH\b/i,{token:"keyword.catch"}],[/END\s+CATCH\b/i,{token:"keyword.catch"}],[/(BEGIN|CASE)\b/i,{token:"keyword.block"}],[/END\b/i,{token:"keyword.block"}],[/WHEN\b/i,{token:"keyword.choice"}],[/THEN\b/i,{token:"keyword.choice"}]]}};return P(M);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/st/st.js b/public/vs/basic-languages/st/st.js
new file mode 100644
index 0000000..d13923e
--- /dev/null
+++ b/public/vs/basic-languages/st/st.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/st/st", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var d=(n,e)=>{for(var t in e)r(n,t,{get:e[t],enumerable:!0})},l=(n,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of c(e))!i.call(n,o)&&o!==t&&r(n,o,{get:()=>e[o],enumerable:!(a=s(e,o))||a.enumerable});return n};var _=n=>l(r({},"__esModule",{value:!0}),n);var m={};d(m,{conf:()=>p,language:()=>u});var p={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["var","end_var"],["var_input","end_var"],["var_output","end_var"],["var_in_out","end_var"],["var_temp","end_var"],["var_global","end_var"],["var_access","end_var"],["var_external","end_var"],["type","end_type"],["struct","end_struct"],["program","end_program"],["function","end_function"],["function_block","end_function_block"],["action","end_action"],["step","end_step"],["initial_step","end_step"],["transaction","end_transaction"],["configuration","end_configuration"],["tcp","end_tcp"],["recource","end_recource"],["channel","end_channel"],["library","end_library"],["folder","end_folder"],["binaries","end_binaries"],["includes","end_includes"],["sources","end_sources"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"/*",close:"*/"},{open:"'",close:"'",notIn:["string_sq"]},{open:'"',close:'"',notIn:["string_dq"]},{open:"var_input",close:"end_var"},{open:"var_output",close:"end_var"},{open:"var_in_out",close:"end_var"},{open:"var_temp",close:"end_var"},{open:"var_global",close:"end_var"},{open:"var_access",close:"end_var"},{open:"var_external",close:"end_var"},{open:"type",close:"end_type"},{open:"struct",close:"end_struct"},{open:"program",close:"end_program"},{open:"function",close:"end_function"},{open:"function_block",close:"end_function_block"},{open:"action",close:"end_action"},{open:"step",close:"end_step"},{open:"initial_step",close:"end_step"},{open:"transaction",close:"end_transaction"},{open:"configuration",close:"end_configuration"},{open:"tcp",close:"end_tcp"},{open:"recource",close:"end_recource"},{open:"channel",close:"end_channel"},{open:"library",close:"end_library"},{open:"folder",close:"end_folder"},{open:"binaries",close:"end_binaries"},{open:"includes",close:"end_includes"},{open:"sources",close:"end_sources"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"var",close:"end_var"},{open:"var_input",close:"end_var"},{open:"var_output",close:"end_var"},{open:"var_in_out",close:"end_var"},{open:"var_temp",close:"end_var"},{open:"var_global",close:"end_var"},{open:"var_access",close:"end_var"},{open:"var_external",close:"end_var"},{open:"type",close:"end_type"},{open:"struct",close:"end_struct"},{open:"program",close:"end_program"},{open:"function",close:"end_function"},{open:"function_block",close:"end_function_block"},{open:"action",close:"end_action"},{open:"step",close:"end_step"},{open:"initial_step",close:"end_step"},{open:"transaction",close:"end_transaction"},{open:"configuration",close:"end_configuration"},{open:"tcp",close:"end_tcp"},{open:"recource",close:"end_recource"},{open:"channel",close:"end_channel"},{open:"library",close:"end_library"},{open:"folder",close:"end_folder"},{open:"binaries",close:"end_binaries"},{open:"includes",close:"end_includes"},{open:"sources",close:"end_sources"}],folding:{markers:{start:new RegExp("^\\s*#pragma\\s+region\\b"),end:new RegExp("^\\s*#pragma\\s+endregion\\b")}}},u={defaultToken:"",tokenPostfix:".st",ignoreCase:!0,brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["if","end_if","elsif","else","case","of","to","__try","__catch","__finally","do","with","by","while","repeat","end_while","end_repeat","end_case","for","end_for","task","retain","non_retain","constant","with","at","exit","return","interval","priority","address","port","on_channel","then","iec","file","uses","version","packagetype","displayname","copyright","summary","vendor","common_source","from","extends","implements"],constant:["false","true","null"],defineKeywords:["var","var_input","var_output","var_in_out","var_temp","var_global","var_access","var_external","end_var","type","end_type","struct","end_struct","program","end_program","function","end_function","function_block","end_function_block","interface","end_interface","method","end_method","property","end_property","namespace","end_namespace","configuration","end_configuration","tcp","end_tcp","resource","end_resource","channel","end_channel","library","end_library","folder","end_folder","binaries","end_binaries","includes","end_includes","sources","end_sources","action","end_action","step","initial_step","end_step","transaction","end_transaction"],typeKeywords:["int","sint","dint","lint","usint","uint","udint","ulint","real","lreal","time","date","time_of_day","date_and_time","string","bool","byte","word","dword","array","pointer","lword"],operators:["=",">","<",":",":=","<=",">=","<>","&","+","-","*","**","MOD","^","or","and","not","xor","abs","acos","asin","atan","cos","exp","expt","ln","log","sin","sqrt","tan","sel","max","min","limit","mux","shl","shr","rol","ror","indexof","sizeof","adr","adrinst","bitadr","is_valid","ref","ref_to"],builtinVariables:[],builtinFunctions:["sr","rs","tp","ton","tof","eq","ge","le","lt","ne","round","trunc","ctd","\u0441tu","ctud","r_trig","f_trig","move","concat","delete","find","insert","left","len","replace","right","rtc"],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/(\.\.)/,"delimiter"],[/\b(16#[0-9A-Fa-f\_]*)+\b/,"number.hex"],[/\b(2#[01\_]+)+\b/,"number.binary"],[/\b(8#[0-9\_]*)+\b/,"number.octal"],[/\b\d*\.\d+([eE][\-+]?\d+)?\b/,"number.float"],[/\b(L?REAL)#[0-9\_\.e]+\b/,"number.float"],[/\b(BYTE|(?:D|L)?WORD|U?(?:S|D|L)?INT)#[0-9\_]+\b/,"number"],[/\d+/,"number"],[/\b(T|DT|TOD)#[0-9:-_shmyd]+\b/,"tag"],[/\%(I|Q|M)(X|B|W|D|L)[0-9\.]+/,"tag"],[/\%(I|Q|M)[0-9\.]*/,"tag"],[/\b[A-Za-z]{1,6}#[0-9]+\b/,"tag"],[/\b(TO_|CTU_|CTD_|CTUD_|MUX_|SEL_)[A_Za-z]+\b/,"predefined"],[/\b[A_Za-z]+(_TO_)[A_Za-z]+\b/,"predefined"],[/[;]/,"delimiter"],[/[.]/,{token:"delimiter",next:"@params"}],[/[a-zA-Z_]\w*/,{cases:{"@operators":"operators","@keywords":"keyword","@typeKeywords":"type","@defineKeywords":"variable","@constant":"constant","@builtinVariables":"predefined","@builtinFunctions":"predefined","@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",bracket:"@open",next:"@string_dq"}],[/'/,{token:"string.quote",bracket:"@open",next:"@string_sq"}],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],params:[[/\b[A-Za-z0-9_]+\b(?=\()/,{token:"identifier",next:"@pop"}],[/\b[A-Za-z0-9_]+\b/,"variable.name","@pop"]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],["\\*/","comment","@pop"],[/[\/*]/,"comment"]],comment2:[[/[^\(*]+/,"comment"],[/\(\*/,"comment","@push"],["\\*\\)","comment","@pop"],[/[\(*]/,"comment"]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\/.*$/,"comment"],[/\/\*/,"comment","@comment"],[/\(\*/,"comment","@comment2"]],string_dq:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],string_sq:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]]}};return _(m);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/swift/swift.js b/public/vs/basic-languages/swift/swift.js
new file mode 100644
index 0000000..0ec247b
--- /dev/null
+++ b/public/vs/basic-languages/swift/swift.js
@@ -0,0 +1,13 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/swift/swift", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var i=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(o,e)=>{for(var n in e)i(o,n,{get:e[n],enumerable:!0})},u=(o,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of s(e))!l.call(o,t)&&t!==n&&i(o,t,{get:()=>e[t],enumerable:!(r=a(e,t))||r.enumerable});return o};var d=o=>u(i({},"__esModule",{value:!0}),o);var f={};c(f,{conf:()=>p,language:()=>m});var p={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}]},m={defaultToken:"",tokenPostfix:".swift",identifier:/[a-zA-Z_][\w$]*/,attributes:["@GKInspectable","@IBAction","@IBDesignable","@IBInspectable","@IBOutlet","@IBSegueAction","@NSApplicationMain","@NSCopying","@NSManaged","@Sendable","@UIApplicationMain","@autoclosure","@actorIndependent","@asyncHandler","@available","@convention","@derivative","@differentiable","@discardableResult","@dynamicCallable","@dynamicMemberLookup","@escaping","@frozen","@globalActor","@inlinable","@inline","@main","@noDerivative","@nonobjc","@noreturn","@objc","@objcMembers","@preconcurrency","@propertyWrapper","@requires_stored_property_inits","@resultBuilder","@testable","@unchecked","@unknown","@usableFromInline","@warn_unqualified_access"],accessmodifiers:["open","public","internal","fileprivate","private"],keywords:["#available","#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning","Any","Protocol","Self","Type","actor","as","assignment","associatedtype","associativity","async","await","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","do","dynamic","dynamicType","else","enum","extension","fallthrough","false","fileprivate","final","for","func","get","guard","higherThan","if","import","in","indirect","infix","init","inout","internal","is","isolated","lazy","left","let","lowerThan","mutating","nil","none","nonisolated","nonmutating","open","operator","optional","override","postfix","precedence","precedencegroup","prefix","private","protocol","public","repeat","required","rethrows","return","right","safe","self","set","some","static","struct","subscript","super","switch","throw","throws","true","try","typealias","unowned","unsafe","var","weak","where","while","willSet","__consuming","__owned"],symbols:/[=(){}\[\].,:;@#\_&\-<>`?!+*\\\/]/,operatorstart:/[\/=\-+!*%<>&|^~?\u00A1-\u00A7\u00A9\u00AB\u00AC\u00AE\u00B0-\u00B1\u00B6\u00BB\u00BF\u00D7\u00F7\u2016-\u2017\u2020-\u2027\u2030-\u203E\u2041-\u2053\u2055-\u205E\u2190-\u23FF\u2500-\u2775\u2794-\u2BFF\u2E00-\u2E7F\u3001-\u3003\u3008-\u3030]/,operatorend:/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE00-\uFE0F\uFE20-\uFE2F\uE0100-\uE01EF]/,operators:/(@operatorstart)((@operatorstart)|(@operatorend))*/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},{include:"@attribute"},{include:"@literal"},{include:"@keyword"},{include:"@invokedmethod"},{include:"@symbol"}],whitespace:[[/\s+/,"white"],[/"""/,"string.quote","@endDblDocString"]],endDblDocString:[[/[^"]+/,"string"],[/\\"/,"string"],[/"""/,"string.quote","@popall"],[/"/,"string"]],symbol:[[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/[.]/,"delimiter"],[/@operators/,"operator"],[/@symbols/,"operator"]],comment:[[/\/\/\/.*$/,"comment.doc"],[/\/\*\*/,"comment.doc","@commentdocbody"],[/\/\/.*$/,"comment"],[/\/\*/,"comment","@commentbody"]],commentdocbody:[[/\/\*/,"comment","@commentbody"],[/\*\//,"comment.doc","@pop"],[/\:[a-zA-Z]+\:/,"comment.doc.param"],[/./,"comment.doc"]],commentbody:[[/\/\*/,"comment","@commentbody"],[/\*\//,"comment","@pop"],[/./,"comment"]],attribute:[[/@@@identifier/,{cases:{"@attributes":"keyword.control","@default":""}}]],literal:[[/"/,{token:"string.quote",next:"@stringlit"}],[/0[b]([01]_?)+/,"number.binary"],[/0[o]([0-7]_?)+/,"number.octal"],[/0[x]([0-9a-fA-F]_?)+([pP][\-+](\d_?)+)?/,"number.hex"],[/(\d_?)*\.(\d_?)+([eE][\-+]?(\d_?)+)?/,"number.float"],[/(\d_?)+/,"number"]],stringlit:[[/\\\(/,{token:"operator",next:"@interpolatedexpression"}],[/@escapes/,"string"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",next:"@pop"}],[/./,"string"]],interpolatedexpression:[[/\(/,{token:"operator",next:"@interpolatedexpression"}],[/\)/,{token:"operator",next:"@pop"}],{include:"@literal"},{include:"@keyword"},{include:"@symbol"}],keyword:[[/`/,{token:"operator",next:"@escapedkeyword"}],[/@identifier/,{cases:{"@keywords":"keyword","[A-Z][a-zA-Z0-9$]*":"type.identifier","@default":"identifier"}}]],escapedkeyword:[[/`/,{token:"operator",next:"@pop"}],[/./,"identifier"]],invokedmethod:[[/([.])(@identifier)/,{cases:{$2:["delimeter","type.identifier"],"@default":""}}]]}};return d(f);})();
+/*!---------------------------------------------------------------------------------------------
+ *  Copyright (C) David Owens II, owensd.io. All rights reserved.
+ *--------------------------------------------------------------------------------------------*/
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/systemverilog/systemverilog.js b/public/vs/basic-languages/systemverilog/systemverilog.js
new file mode 100644
index 0000000..48c9fea
--- /dev/null
+++ b/public/vs/basic-languages/systemverilog/systemverilog.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/systemverilog/systemverilog", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var d=(n,e)=>{for(var t in e)r(n,t,{get:e[t],enumerable:!0})},l=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of a(e))!c.call(n,i)&&i!==t&&r(n,i,{get:()=>e[i],enumerable:!(o=s(e,i))||o.enumerable});return n};var p=n=>l(r({},"__esModule",{value:!0}),n);var f={};d(f,{conf:()=>u,language:()=>m});var u={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["begin","end"],["case","endcase"],["casex","endcase"],["casez","endcase"],["checker","endchecker"],["class","endclass"],["clocking","endclocking"],["config","endconfig"],["function","endfunction"],["generate","endgenerate"],["group","endgroup"],["interface","endinterface"],["module","endmodule"],["package","endpackage"],["primitive","endprimitive"],["program","endprogram"],["property","endproperty"],["specify","endspecify"],["sequence","endsequence"],["table","endtable"],["task","endtask"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{offSide:!1,markers:{start:new RegExp("^(?:\\s*|.*(?!\\/[\\/\\*])[^\\w])(?:begin|case(x|z)?|class|clocking|config|covergroup|function|generate|interface|module|package|primitive|property|program|sequence|specify|table|task)\\b"),end:new RegExp("^(?:\\s*|.*(?!\\/[\\/\\*])[^\\w])(?:end|endcase|endclass|endclocking|endconfig|endgroup|endfunction|endgenerate|endinterface|endmodule|endpackage|endprimitive|endproperty|endprogram|endsequence|endspecify|endtable|endtask)\\b")}}},m={defaultToken:"",tokenPostfix:".sv",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["accept_on","alias","always","always_comb","always_ff","always_latch","and","assert","assign","assume","automatic","before","begin","bind","bins","binsof","bit","break","buf","bufif0","bufif1","byte","case","casex","casez","cell","chandle","checker","class","clocking","cmos","config","const","constraint","context","continue","cover","covergroup","coverpoint","cross","deassign","default","defparam","design","disable","dist","do","edge","else","end","endcase","endchecker","endclass","endclocking","endconfig","endfunction","endgenerate","endgroup","endinterface","endmodule","endpackage","endprimitive","endprogram","endproperty","endspecify","endsequence","endtable","endtask","enum","event","eventually","expect","export","extends","extern","final","first_match","for","force","foreach","forever","fork","forkjoin","function","generate","genvar","global","highz0","highz1","if","iff","ifnone","ignore_bins","illegal_bins","implements","implies","import","incdir","include","initial","inout","input","inside","instance","int","integer","interconnect","interface","intersect","join","join_any","join_none","large","let","liblist","library","local","localparam","logic","longint","macromodule","matches","medium","modport","module","nand","negedge","nettype","new","nexttime","nmos","nor","noshowcancelled","not","notif0","notif1","null","or","output","package","packed","parameter","pmos","posedge","primitive","priority","program","property","protected","pull0","pull1","pulldown","pullup","pulsestyle_ondetect","pulsestyle_onevent","pure","rand","randc","randcase","randsequence","rcmos","real","realtime","ref","reg","reject_on","release","repeat","restrict","return","rnmos","rpmos","rtran","rtranif0","rtranif1","s_always","s_eventually","s_nexttime","s_until","s_until_with","scalared","sequence","shortint","shortreal","showcancelled","signed","small","soft","solve","specify","specparam","static","string","strong","strong0","strong1","struct","super","supply0","supply1","sync_accept_on","sync_reject_on","table","tagged","task","this","throughout","time","timeprecision","timeunit","tran","tranif0","tranif1","tri","tri0","tri1","triand","trior","trireg","type","typedef","union","unique","unique0","unsigned","until","until_with","untyped","use","uwire","var","vectored","virtual","void","wait","wait_order","wand","weak","weak0","weak1","while","wildcard","wire","with","within","wor","xnor","xor"],builtin_gates:["and","nand","nor","or","xor","xnor","buf","not","bufif0","bufif1","notif1","notif0","cmos","nmos","pmos","rcmos","rnmos","rpmos","tran","tranif1","tranif0","rtran","rtranif1","rtranif0"],operators:["=","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>+","<<<=",">>>=","?",":","+","-","!","~","&","~&","|","~|","^","~^","^~","+","-","*","/","%","==","!=","===","!==","==?","!=?","&&","||","**","<","<=",">",">=","&","|","^",">>","<<",">>>","<<<","++","--","->","<->","inside","dist","::","+:","-:","*>","&&&","|->","|=>","#=#"],symbols:/[=><!~?:&|+\-*\/\^%#]+/,escapes:/%%|\\(?:[antvf\\"']|x[0-9A-Fa-f]{1,2}|[0-7]{1,3})/,identifier:/(?:[a-zA-Z_][a-zA-Z0-9_$\.]*|\\\S+ )/,systemcall:/[$][a-zA-Z0-9_]+/,timeunits:/s|ms|us|ns|ps|fs/,tokenizer:{root:[[/^(\s*)(@identifier)/,["",{cases:{"@builtin_gates":{token:"keyword.$2",next:"@module_instance"},table:{token:"keyword.$2",next:"@table"},"@keywords":{token:"keyword.$2"},"@default":{token:"identifier",next:"@module_instance"}}}]],[/^\s*`include/,{token:"keyword.directive.include",next:"@include"}],[/^\s*`\s*\w+/,"keyword"],{include:"@identifier_or_keyword"},{include:"@whitespace"},[/\(\*.*\*\)/,"annotation"],[/@systemcall/,"variable.predefined"],[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],{include:"@numbers"},[/[;,.]/,"delimiter"],{include:"@strings"}],identifier_or_keyword:[[/@identifier/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}]],numbers:[[/\d+?[\d_]*(?:\.[\d_]+)?[eE][\-+]?\d+/,"number.float"],[/\d+?[\d_]*\.[\d_]+(?:\s*@timeunits)?/,"number.float"],[/(?:\d+?[\d_]*\s*)?'[sS]?[dD]\s*[0-9xXzZ?]+?[0-9xXzZ?_]*/,"number"],[/(?:\d+?[\d_]*\s*)?'[sS]?[bB]\s*[0-1xXzZ?]+?[0-1xXzZ?_]*/,"number.binary"],[/(?:\d+?[\d_]*\s*)?'[sS]?[oO]\s*[0-7xXzZ?]+?[0-7xXzZ?_]*/,"number.octal"],[/(?:\d+?[\d_]*\s*)?'[sS]?[hH]\s*[0-9a-fA-FxXzZ?]+?[0-9a-fA-FxXzZ?_]*/,"number.hex"],[/1step/,"number"],[/[\dxXzZ]+?[\dxXzZ_]*(?:\s*@timeunits)?/,"number"],[/'[01xXzZ]+/,"number"]],module_instance:[{include:"@whitespace"},[/(#?)(\()/,["",{token:"@brackets",next:"@port_connection"}]],[/@identifier\s*[;={}\[\],]/,{token:"@rematch",next:"@pop"}],[/@symbols|[;={}\[\],]/,{token:"@rematch",next:"@pop"}],[/@identifier/,"type"],[/;/,"delimiter","@pop"]],port_connection:[{include:"@identifier_or_keyword"},{include:"@whitespace"},[/@systemcall/,"variable.predefined"],{include:"@numbers"},{include:"@strings"},[/[,]/,"delimiter"],[/\(/,"@brackets","@port_connection"],[/\)/,"@brackets","@pop"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],strings:[[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],include:[[/(\s*)(")([\w*\/*]*)(.\w*)(")/,["","string.include.identifier","string.include.identifier","string.include.identifier",{token:"string.include.identifier",next:"@pop"}]],[/(\s*)(<)([\w*\/*]*)(.\w*)(>)/,["","string.include.identifier","string.include.identifier","string.include.identifier",{token:"string.include.identifier",next:"@pop"}]]],table:[{include:"@whitespace"},[/[()]/,"@brackets"],[/[:;]/,"delimiter"],[/[01\-*?xXbBrRfFpPnN]/,"variable.predefined"],["endtable","keyword.endtable","@pop"]]}};return p(f);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/tcl/tcl.js b/public/vs/basic-languages/tcl/tcl.js
new file mode 100644
index 0000000..8d602dc
--- /dev/null
+++ b/public/vs/basic-languages/tcl/tcl.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/tcl/tcl", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var c=(t,e)=>{for(var o in e)s(t,o,{get:e[o],enumerable:!0})},p=(t,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of a(e))!l.call(t,n)&&n!==o&&s(t,n,{get:()=>e[n],enumerable:!(i=r(e,n))||i.enumerable});return t};var u=t=>p(s({},"__esModule",{value:!0}),t);var g={};c(g,{conf:()=>k,language:()=>d});var k={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},d={tokenPostfix:".tcl",specialFunctions:["set","unset","rename","variable","proc","coroutine","foreach","incr","append","lappend","linsert","lreplace"],mainFunctions:["if","then","elseif","else","case","switch","while","for","break","continue","return","package","namespace","catch","exit","eval","expr","uplevel","upvar"],builtinFunctions:["file","info","concat","join","lindex","list","llength","lrange","lsearch","lsort","split","array","parray","binary","format","regexp","regsub","scan","string","subst","dict","cd","clock","exec","glob","pid","pwd","close","eof","fblocked","fconfigure","fcopy","fileevent","flush","gets","open","puts","read","seek","socket","tell","interp","after","auto_execok","auto_load","auto_mkindex","auto_reset","bgerror","error","global","history","load","source","time","trace","unknown","unset","update","vwait","winfo","wm","bind","event","pack","place","grid","font","bell","clipboard","destroy","focus","grab","lower","option","raise","selection","send","tk","tkwait","tk_bisque","tk_focusNext","tk_focusPrev","tk_focusFollowsMouse","tk_popup","tk_setPalette"],symbols:/[=><!~?:&|+\-*\/\^%]+/,brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],escapes:/\\(?:[abfnrtv\\"'\[\]\{\};\$]|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,variables:/(?:\$+(?:(?:\:\:?)?[a-zA-Z_]\w*)+)/,tokenizer:{root:[[/[a-zA-Z_]\w*/,{cases:{"@specialFunctions":{token:"keyword.flow",next:"@specialFunc"},"@mainFunctions":"keyword","@builtinFunctions":"variable","@default":"operator.scss"}}],[/\s+\-+(?!\d|\.)\w*|{\*}/,"metatag"],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/@symbols/,"operator"],[/\$+(?:\:\:)?\{/,{token:"identifier",next:"@nestedVariable"}],[/@variables/,"type.identifier"],[/\.(?!\d|\.)[\w\-]*/,"operator.sql"],[/\d+(\.\d+)?/,"number"],[/\d+/,"number"],[/;/,"delimiter"],[/"/,{token:"string.quote",bracket:"@open",next:"@dstring"}],[/'/,{token:"string.quote",bracket:"@open",next:"@sstring"}]],dstring:[[/\[/,{token:"@brackets",next:"@nestedCall"}],[/\$+(?:\:\:)?\{/,{token:"identifier",next:"@nestedVariable"}],[/@variables/,"type.identifier"],[/[^\\$\[\]"]+/,"string"],[/@escapes/,"string.escape"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],sstring:[[/\[/,{token:"@brackets",next:"@nestedCall"}],[/\$+(?:\:\:)?\{/,{token:"identifier",next:"@nestedVariable"}],[/@variables/,"type.identifier"],[/[^\\$\[\]']+/,"string"],[/@escapes/,"string.escape"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"],[/#.*\\$/,{token:"comment",next:"@newlineComment"}],[/#.*(?!\\)$/,"comment"]],newlineComment:[[/.*\\$/,"comment"],[/.*(?!\\)$/,{token:"comment",next:"@pop"}]],nestedVariable:[[/[^\{\}\$]+/,"type.identifier"],[/\}/,{token:"identifier",next:"@pop"}]],nestedCall:[[/\[/,{token:"@brackets",next:"@nestedCall"}],[/\]/,{token:"@brackets",next:"@pop"}],{include:"root"}],specialFunc:[[/"/,{token:"string",next:"@dstring"}],[/'/,{token:"string",next:"@sstring"}],[/\S+/,{token:"type",next:"@pop"}]]}};return u(g);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/twig/twig.js b/public/vs/basic-languages/twig/twig.js
new file mode 100644
index 0000000..88ce78b
--- /dev/null
+++ b/public/vs/basic-languages/twig/twig.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/twig/twig", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var m=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var s=(e,t)=>{for(var r in t)m(e,r,{get:t[r],enumerable:!0})},d=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of n(t))!a.call(e,i)&&i!==r&&m(e,i,{get:()=>t[i],enumerable:!(o=l(t,i))||o.enumerable});return e};var p=e=>d(m({},"__esModule",{value:!0}),e);var g={};s(g,{conf:()=>h,language:()=>c});var h={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:["{#","#}"]},brackets:[["{#","#}"],["{%","%}"],["{{","}}"],["(",")"],["[","]"],["<!--","-->"],["<",">"]],autoClosingPairs:[{open:"{# ",close:" #}"},{open:"{% ",close:" %}"},{open:"{{ ",close:" }}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}]},c={defaultToken:"",tokenPostfix:"",ignoreCase:!0,keywords:["apply","autoescape","block","deprecated","do","embed","extends","flush","for","from","if","import","include","macro","sandbox","set","use","verbatim","with","endapply","endautoescape","endblock","endembed","endfor","endif","endmacro","endsandbox","endset","endwith","true","false"],tokenizer:{root:[[/\s+/],[/{#/,"comment.twig","@commentState"],[/{%[-~]?/,"delimiter.twig","@blockState"],[/{{[-~]?/,"delimiter.twig","@variableState"],[/<!DOCTYPE/,"metatag.html","@doctype"],[/<!--/,"comment.html","@comment"],[/(<)((?:[\w\-]+:)?[\w\-]+)(\s*)(\/>)/,["delimiter.html","tag.html","","delimiter.html"]],[/(<)(script)/,["delimiter.html",{token:"tag.html",next:"@script"}]],[/(<)(style)/,["delimiter.html",{token:"tag.html",next:"@style"}]],[/(<)((?:[\w\-]+:)?[\w\-]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)((?:[\w\-]+:)?[\w\-]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/</,"delimiter.html"],[/[^<{]+/]],commentState:[[/#}/,"comment.twig","@pop"],[/./,"comment.twig"]],blockState:[[/[-~]?%}/,"delimiter.twig","@pop"],[/\s+/],[/(verbatim)(\s*)([-~]?%})/,["keyword.twig","",{token:"delimiter.twig",next:"@rawDataState"}]],{include:"expression"}],rawDataState:[[/({%[-~]?)(\s*)(endverbatim)(\s*)([-~]?%})/,["delimiter.twig","","keyword.twig","",{token:"delimiter.twig",next:"@popall"}]],[/./,"string.twig"]],variableState:[[/[-~]?}}/,"delimiter.twig","@pop"],{include:"expression"}],stringState:[[/"/,"string.twig","@pop"],[/#{\s*/,"string.twig","@interpolationState"],[/[^#"\\]*(?:(?:\\.|#(?!\{))[^#"\\]*)*/,"string.twig"]],interpolationState:[[/}/,"string.twig","@pop"],{include:"expression"}],expression:[[/\s+/],[/\+|-|\/{1,2}|%|\*{1,2}/,"operators.twig"],[/(and|or|not|b-and|b-xor|b-or)(\s+)/,["operators.twig",""]],[/==|!=|<|>|>=|<=/,"operators.twig"],[/(starts with|ends with|matches)(\s+)/,["operators.twig",""]],[/(in)(\s+)/,["operators.twig",""]],[/(is)(\s+)/,["operators.twig",""]],[/\||~|:|\.{1,2}|\?{1,2}/,"operators.twig"],[/[^\W\d][\w]*/,{cases:{"@keywords":"keyword.twig","@default":"variable.twig"}}],[/\d+(\.\d+)?/,"number.twig"],[/\(|\)|\[|\]|{|}|,/,"delimiter.twig"],[/"([^#"\\]*(?:\\.[^#"\\]*)*)"|\'([^\'\\]*(?:\\.[^\'\\]*)*)\'/,"string.twig"],[/"/,"string.twig","@stringState"],[/=>/,"operators.twig"],[/=/,"operators.twig"]],doctype:[[/[^>]+/,"metatag.content.html"],[/>/,"metatag.html","@pop"]],comment:[[/-->/,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/]],script:[[/type/,"attribute.name.html","@scriptAfterType"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/=/,"delimiter.html","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value.html",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value.html",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]],style:[[/type/,"attribute.name.html","@styleAfterType"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/=/,"delimiter.html","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value.html",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value.html",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]]}};return p(g);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/typescript/typescript.js b/public/vs/basic-languages/typescript/typescript.js
new file mode 100644
index 0000000..5a892d8
--- /dev/null
+++ b/public/vs/basic-languages/typescript/typescript.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/typescript/typescript", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var l=Object.create;var s=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var b=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty;var f=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var k=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),y=(e,t)=>{for(var n in t)s(e,n,{get:t[n],enumerable:!0})},i=(e,t,n,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of x(t))!u.call(e,r)&&r!==n&&s(e,r,{get:()=>t[r],enumerable:!(c=m(t,r))||c.enumerable});return e},a=(e,t,n)=>(i(e,t,"default"),n&&i(n,t,"default")),p=(e,t,n)=>(n=e!=null?l(b(e)):{},i(t||!e||!e.__esModule?s(n,"default",{value:e,enumerable:!0}):n,e)),w=e=>i(s({},"__esModule",{value:!0}),e);var d=k((T,g)=>{var A=p(f("vs/editor/editor.api"));g.exports=A});var h={};y(h,{conf:()=>v,language:()=>$});var o={};a(o,p(d()));var v={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],onEnterRules:[{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,afterText:/^\s*\*\/$/,action:{indentAction:o.languages.IndentAction.IndentOutdent,appendText:" * "}},{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,action:{indentAction:o.languages.IndentAction.None,appendText:" * "}},{beforeText:/^(\t|(\ \ ))*\ \*(\ ([^\*]|\*(?!\/))*)?$/,action:{indentAction:o.languages.IndentAction.None,appendText:"* "}},{beforeText:/^(\t|(\ \ ))*\ \*\/\s*$/,action:{indentAction:o.languages.IndentAction.None,removeText:1}}],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"`",close:"`",notIn:["string","comment"]},{open:"/**",close:" */",notIn:["string"]}],folding:{markers:{start:new RegExp("^\\s*//\\s*#?region\\b"),end:new RegExp("^\\s*//\\s*#?endregion\\b")}}},$={defaultToken:"invalid",tokenPostfix:".ts",keywords:["abstract","any","as","asserts","bigint","boolean","break","case","catch","class","continue","const","constructor","debugger","declare","default","delete","do","else","enum","export","extends","false","finally","for","from","function","get","if","implements","import","in","infer","instanceof","interface","is","keyof","let","module","namespace","never","new","null","number","object","out","package","private","protected","public","override","readonly","require","global","return","satisfies","set","static","string","super","switch","symbol","this","throw","true","try","type","typeof","undefined","unique","unknown","var","void","while","with","yield","async","await","of"],operators:["<=",">=","==","!=","===","!==","=>","+","-","**","*","/","%","++","--","<<","</",">>",">>>","&","|","^","!","~","&&","||","??","?",":","=","+=","-=","*=","**=","/=","%=","<<=",">>=",">>>=","&=","|=","^=","@"],symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,digits:/\d+(_+\d+)*/,octaldigits:/[0-7]+(_+[0-7]+)*/,binarydigits:/[0-1]+(_+[0-1]+)*/,hexdigits:/[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,regexpctl:/[(){}\[\]\$\^|\-*+?\.]/,regexpesc:/\\(?:[bBdDfnrstvwWn0\\\/]|@regexpctl|c[A-Z]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})/,tokenizer:{root:[[/[{}]/,"delimiter.bracket"],{include:"common"}],common:[[/#?[a-z_$][\w$]*/,{cases:{"@keywords":"keyword","@default":"identifier"}}],[/[A-Z][\w\$]*/,"type.identifier"],{include:"@whitespace"},[/\/(?=([^\\\/]|\\.)+\/([dgimsuy]*)(\s*)(\.|;|,|\)|\]|\}|$))/,{token:"regexp",bracket:"@open",next:"@regexp"}],[/[()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/!(?=([^=]|$))/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/(@digits)[eE]([\-+]?(@digits))?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?/,"number.float"],[/0[xX](@hexdigits)n?/,"number.hex"],[/0[oO]?(@octaldigits)n?/,"number.octal"],[/0[bB](@binarydigits)n?/,"number.binary"],[/(@digits)n?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"],[/`/,"string","@string_backtick"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@jsdoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],jsdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],regexp:[[/(\{)(\d+(?:,\d*)?)(\})/,["regexp.escape.control","regexp.escape.control","regexp.escape.control"]],[/(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/,["regexp.escape.control",{token:"regexp.escape.control",next:"@regexrange"}]],[/(\()(\?:|\?=|\?!)/,["regexp.escape.control","regexp.escape.control"]],[/[()]/,"regexp.escape.control"],[/@regexpctl/,"regexp.escape.control"],[/[^\\\/]/,"regexp"],[/@regexpesc/,"regexp.escape"],[/\\\./,"regexp.invalid"],[/(\/)([dgimsuy]*)/,[{token:"regexp",bracket:"@close",next:"@pop"},"keyword.other"]]],regexrange:[[/-/,"regexp.escape.control"],[/\^/,"regexp.invalid"],[/@regexpesc/,"regexp.escape"],[/[^\]]/,"regexp"],[/\]/,{token:"regexp.escape.control",next:"@pop",bracket:"@close"}]],string_double:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],string_single:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]],string_backtick:[[/\$\{/,{token:"delimiter.bracket",next:"@bracketCounting"}],[/[^\\`$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/`/,"string","@pop"]],bracketCounting:[[/\{/,"delimiter.bracket","@bracketCounting"],[/\}/,"delimiter.bracket","@pop"],{include:"common"}]}};return w(h);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/vb/vb.js b/public/vs/basic-languages/vb/vb.js
new file mode 100644
index 0000000..88fdbcd
--- /dev/null
+++ b/public/vs/basic-languages/vb/vb.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/vb/vb", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var r=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var i=(n,e)=>{for(var t in e)r(n,t,{get:e[t],enumerable:!0})},c=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of d(e))!l.call(n,o)&&o!==t&&r(n,o,{get:()=>e[o],enumerable:!(s=a(e,o))||s.enumerable});return n};var u=n=>c(r({},"__esModule",{value:!0}),n);var k={};i(k,{conf:()=>g,language:()=>p});var g={comments:{lineComment:"'",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"],["addhandler","end addhandler"],["class","end class"],["enum","end enum"],["event","end event"],["function","end function"],["get","end get"],["if","end if"],["interface","end interface"],["module","end module"],["namespace","end namespace"],["operator","end operator"],["property","end property"],["raiseevent","end raiseevent"],["removehandler","end removehandler"],["select","end select"],["set","end set"],["structure","end structure"],["sub","end sub"],["synclock","end synclock"],["try","end try"],["while","end while"],["with","end with"],["using","end using"],["do","loop"],["for","next"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"<",close:">",notIn:["string","comment"]}],folding:{markers:{start:new RegExp("^\\s*#Region\\b"),end:new RegExp("^\\s*#End Region\\b")}}},p={defaultToken:"",tokenPostfix:".vb",ignoreCase:!0,brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.angle",open:"<",close:">"},{token:"keyword.tag-addhandler",open:"addhandler",close:"end addhandler"},{token:"keyword.tag-class",open:"class",close:"end class"},{token:"keyword.tag-enum",open:"enum",close:"end enum"},{token:"keyword.tag-event",open:"event",close:"end event"},{token:"keyword.tag-function",open:"function",close:"end function"},{token:"keyword.tag-get",open:"get",close:"end get"},{token:"keyword.tag-if",open:"if",close:"end if"},{token:"keyword.tag-interface",open:"interface",close:"end interface"},{token:"keyword.tag-module",open:"module",close:"end module"},{token:"keyword.tag-namespace",open:"namespace",close:"end namespace"},{token:"keyword.tag-operator",open:"operator",close:"end operator"},{token:"keyword.tag-property",open:"property",close:"end property"},{token:"keyword.tag-raiseevent",open:"raiseevent",close:"end raiseevent"},{token:"keyword.tag-removehandler",open:"removehandler",close:"end removehandler"},{token:"keyword.tag-select",open:"select",close:"end select"},{token:"keyword.tag-set",open:"set",close:"end set"},{token:"keyword.tag-structure",open:"structure",close:"end structure"},{token:"keyword.tag-sub",open:"sub",close:"end sub"},{token:"keyword.tag-synclock",open:"synclock",close:"end synclock"},{token:"keyword.tag-try",open:"try",close:"end try"},{token:"keyword.tag-while",open:"while",close:"end while"},{token:"keyword.tag-with",open:"with",close:"end with"},{token:"keyword.tag-using",open:"using",close:"end using"},{token:"keyword.tag-do",open:"do",close:"loop"},{token:"keyword.tag-for",open:"for",close:"next"}],keywords:["AddHandler","AddressOf","Alias","And","AndAlso","As","Async","Boolean","ByRef","Byte","ByVal","Call","Case","Catch","CBool","CByte","CChar","CDate","CDbl","CDec","Char","CInt","Class","CLng","CObj","Const","Continue","CSByte","CShort","CSng","CStr","CType","CUInt","CULng","CUShort","Date","Decimal","Declare","Default","Delegate","Dim","DirectCast","Do","Double","Each","Else","ElseIf","End","EndIf","Enum","Erase","Error","Event","Exit","False","Finally","For","Friend","Function","Get","GetType","GetXMLNamespace","Global","GoSub","GoTo","Handles","If","Implements","Imports","In","Inherits","Integer","Interface","Is","IsNot","Let","Lib","Like","Long","Loop","Me","Mod","Module","MustInherit","MustOverride","MyBase","MyClass","NameOf","Namespace","Narrowing","New","Next","Not","Nothing","NotInheritable","NotOverridable","Object","Of","On","Operator","Option","Optional","Or","OrElse","Out","Overloads","Overridable","Overrides","ParamArray","Partial","Private","Property","Protected","Public","RaiseEvent","ReadOnly","ReDim","RemoveHandler","Resume","Return","SByte","Select","Set","Shadows","Shared","Short","Single","Static","Step","Stop","String","Structure","Sub","SyncLock","Then","Throw","To","True","Try","TryCast","TypeOf","UInteger","ULong","UShort","Using","Variant","Wend","When","While","Widening","With","WithEvents","WriteOnly","Xor"],tagwords:["If","Sub","Select","Try","Class","Enum","Function","Get","Interface","Module","Namespace","Operator","Set","Structure","Using","While","With","Do","Loop","For","Next","Property","Continue","AddHandler","RemoveHandler","Event","RaiseEvent","SyncLock"],symbols:/[=><!~?;\.,:&|+\-*\/\^%]+/,integersuffix:/U?[DI%L&S@]?/,floatsuffix:/[R#F!]?/,tokenizer:{root:[{include:"@whitespace"},[/next(?!\w)/,{token:"keyword.tag-for"}],[/loop(?!\w)/,{token:"keyword.tag-do"}],[/end\s+(?!for|do)(addhandler|class|enum|event|function|get|if|interface|module|namespace|operator|property|raiseevent|removehandler|select|set|structure|sub|synclock|try|while|with|using)/,{token:"keyword.tag-$1"}],[/[a-zA-Z_]\w*/,{cases:{"@tagwords":{token:"keyword.tag-$0"},"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],[/^\s*#\w+/,"keyword"],[/\d*\d+e([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+(e[\-+]?\d+)?(@floatsuffix)/,"number.float"],[/&H[0-9a-f]+(@integersuffix)/,"number.hex"],[/&0[0-7]+(@integersuffix)/,"number.octal"],[/\d+(@integersuffix)/,"number"],[/#.*#/,"number"],[/[{}()\[\]]/,"@brackets"],[/@symbols/,"delimiter"],[/["\u201c\u201d]/,{token:"string.quote",next:"@string"}]],whitespace:[[/[ \t\r\n]+/,""],[/(\'|REM(?!\w)).*$/,"comment"]],string:[[/[^"\u201c\u201d]+/,"string"],[/["\u201c\u201d]{2}/,"string.escape"],[/["\u201c\u201d]C?/,{token:"string.quote",next:"@pop"}]]}};return u(k);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/wgsl/wgsl.js b/public/vs/basic-languages/wgsl/wgsl.js
new file mode 100644
index 0000000..3497c87
--- /dev/null
+++ b/public/vs/basic-languages/wgsl/wgsl.js
@@ -0,0 +1,307 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/wgsl/wgsl", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var s=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var p=(t,e)=>{for(var a in e)s(t,a,{get:e[a],enumerable:!0})},d=(t,e,a,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of l(e))!u.call(t,i)&&i!==a&&s(t,i,{get:()=>e[i],enumerable:!(o=m(e,i))||o.enumerable});return t};var x=t=>d(s({},"__esModule",{value:!0}),t);var F={};p(F,{conf:()=>f,language:()=>L});var f={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"}]};function r(t){let e=[],a=t.split(/\t+|\r+|\n+| +/);for(let o=0;o<a.length;++o)a[o].length>0&&e.push(a[o]);return e}var g=r("true false"),_=r(`
+			  alias
+			  break
+			  case
+			  const
+			  const_assert
+			  continue
+			  continuing
+			  default
+			  diagnostic
+			  discard
+			  else
+			  enable
+			  fn
+			  for
+			  if
+			  let
+			  loop
+			  override
+			  requires
+			  return
+			  struct
+			  switch
+			  var
+			  while
+			  `),h=r(`
+			  NULL
+			  Self
+			  abstract
+			  active
+			  alignas
+			  alignof
+			  as
+			  asm
+			  asm_fragment
+			  async
+			  attribute
+			  auto
+			  await
+			  become
+			  binding_array
+			  cast
+			  catch
+			  class
+			  co_await
+			  co_return
+			  co_yield
+			  coherent
+			  column_major
+			  common
+			  compile
+			  compile_fragment
+			  concept
+			  const_cast
+			  consteval
+			  constexpr
+			  constinit
+			  crate
+			  debugger
+			  decltype
+			  delete
+			  demote
+			  demote_to_helper
+			  do
+			  dynamic_cast
+			  enum
+			  explicit
+			  export
+			  extends
+			  extern
+			  external
+			  fallthrough
+			  filter
+			  final
+			  finally
+			  friend
+			  from
+			  fxgroup
+			  get
+			  goto
+			  groupshared
+			  highp
+			  impl
+			  implements
+			  import
+			  inline
+			  instanceof
+			  interface
+			  layout
+			  lowp
+			  macro
+			  macro_rules
+			  match
+			  mediump
+			  meta
+			  mod
+			  module
+			  move
+			  mut
+			  mutable
+			  namespace
+			  new
+			  nil
+			  noexcept
+			  noinline
+			  nointerpolation
+			  noperspective
+			  null
+			  nullptr
+			  of
+			  operator
+			  package
+			  packoffset
+			  partition
+			  pass
+			  patch
+			  pixelfragment
+			  precise
+			  precision
+			  premerge
+			  priv
+			  protected
+			  pub
+			  public
+			  readonly
+			  ref
+			  regardless
+			  register
+			  reinterpret_cast
+			  require
+			  resource
+			  restrict
+			  self
+			  set
+			  shared
+			  sizeof
+			  smooth
+			  snorm
+			  static
+			  static_assert
+			  static_cast
+			  std
+			  subroutine
+			  super
+			  target
+			  template
+			  this
+			  thread_local
+			  throw
+			  trait
+			  try
+			  type
+			  typedef
+			  typeid
+			  typename
+			  typeof
+			  union
+			  unless
+			  unorm
+			  unsafe
+			  unsized
+			  use
+			  using
+			  varying
+			  virtual
+			  volatile
+			  wgsl
+			  where
+			  with
+			  writeonly
+			  yield
+			  `),b=r(`
+		read write read_write
+		function private workgroup uniform storage
+		perspective linear flat
+		center centroid sample
+		vertex_index instance_index position front_facing frag_depth
+			local_invocation_id local_invocation_index
+			global_invocation_id workgroup_id num_workgroups
+			sample_index sample_mask
+		rgba8unorm
+		rgba8snorm
+		rgba8uint
+		rgba8sint
+		rgba16uint
+		rgba16sint
+		rgba16float
+		r32uint
+		r32sint
+		r32float
+		rg32uint
+		rg32sint
+		rg32float
+		rgba32uint
+		rgba32sint
+		rgba32float
+		bgra8unorm
+`),v=r(`
+		bool
+		f16
+		f32
+		i32
+		sampler sampler_comparison
+		texture_depth_2d
+		texture_depth_2d_array
+		texture_depth_cube
+		texture_depth_cube_array
+		texture_depth_multisampled_2d
+		texture_external
+		texture_external
+		u32
+		`),y=r(`
+		array
+		atomic
+		mat2x2
+		mat2x3
+		mat2x4
+		mat3x2
+		mat3x3
+		mat3x4
+		mat4x2
+		mat4x3
+		mat4x4
+		ptr
+		texture_1d
+		texture_2d
+		texture_2d_array
+		texture_3d
+		texture_cube
+		texture_cube_array
+		texture_multisampled_2d
+		texture_storage_1d
+		texture_storage_2d
+		texture_storage_2d_array
+		texture_storage_3d
+		vec2
+		vec3
+		vec4
+		`),k=r(`
+		vec2i vec3i vec4i
+		vec2u vec3u vec4u
+		vec2f vec3f vec4f
+		vec2h vec3h vec4h
+		mat2x2f mat2x3f mat2x4f
+		mat3x2f mat3x3f mat3x4f
+		mat4x2f mat4x3f mat4x4f
+		mat2x2h mat2x3h mat2x4h
+		mat3x2h mat3x3h mat3x4h
+		mat4x2h mat4x3h mat4x4h
+		`),w=r(`
+  bitcast all any select arrayLength abs acos acosh asin asinh atan atanh atan2
+  ceil clamp cos cosh countLeadingZeros countOneBits countTrailingZeros cross
+  degrees determinant distance dot exp exp2 extractBits faceForward firstLeadingBit
+  firstTrailingBit floor fma fract frexp inverseBits inverseSqrt ldexp length
+  log log2 max min mix modf normalize pow quantizeToF16 radians reflect refract
+  reverseBits round saturate sign sin sinh smoothstep sqrt step tan tanh transpose
+  trunc dpdx dpdxCoarse dpdxFine dpdy dpdyCoarse dpdyFine fwidth fwidthCoarse fwidthFine
+  textureDimensions textureGather textureGatherCompare textureLoad textureNumLayers
+  textureNumLevels textureNumSamples textureSample textureSampleBias textureSampleCompare
+  textureSampleCompareLevel textureSampleGrad textureSampleLevel textureSampleBaseClampToEdge
+  textureStore atomicLoad atomicStore atomicAdd atomicSub atomicMax atomicMin
+  atomicAnd atomicOr atomicXor atomicExchange atomicCompareExchangeWeak pack4x8snorm
+  pack4x8unorm pack2x16snorm pack2x16unorm pack2x16float unpack4x8snorm unpack4x8unorm
+  unpack2x16snorm unpack2x16unorm unpack2x16float storageBarrier workgroupBarrier
+  workgroupUniformLoad
+`),S=r(`
+					 &
+					 &&
+					 ->
+					 /
+					 =
+					 ==
+					 !=
+					 >
+					 >=
+					 <
+					 <=
+					 %
+					 -
+					 --
+					 +
+					 ++
+					 |
+					 ||
+					 *
+					 <<
+					 >>
+					 +=
+					 -=
+					 *=
+					 /=
+					 %=
+					 &=
+					 |=
+					 ^=
+					 >>=
+					 <<=
+					 `),C=/enable|requires|diagnostic/,c=/[_\p{XID_Start}]\p{XID_Continue}*/u,n="variable.predefined",L={tokenPostfix:".wgsl",defaultToken:"invalid",unicode:!0,atoms:g,keywords:_,reserved:h,predeclared_enums:b,predeclared_types:v,predeclared_type_generators:y,predeclared_type_aliases:k,predeclared_intrinsics:w,operators:S,symbols:/[!%&*+\-\.\/:;<=>^|_~,]+/,tokenizer:{root:[[C,"keyword","@directive"],[c,{cases:{"@atoms":n,"@keywords":"keyword","@reserved":"invalid","@predeclared_enums":n,"@predeclared_types":n,"@predeclared_type_generators":n,"@predeclared_type_aliases":n,"@predeclared_intrinsics":n,"@default":"identifier"}}],{include:"@commentOrSpace"},{include:"@numbers"},[/[{}()\[\]]/,"@brackets"],["@","annotation","@attribute"],[/@symbols/,{cases:{"@operators":"operator","@default":"delimiter"}}],[/./,"invalid"]],commentOrSpace:[[/\s+/,"white"],[/\/\*/,"comment","@blockComment"],[/\/\/.*$/,"comment"]],blockComment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],attribute:[{include:"@commentOrSpace"},[/\w+/,"annotation","@pop"]],directive:[{include:"@commentOrSpace"},[/[()]/,"@brackets"],[/,/,"delimiter"],[c,"meta.content"],[/;/,"delimiter","@pop"]],numbers:[[/0[fh]/,"number.float"],[/[1-9][0-9]*[fh]/,"number.float"],[/[0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[fh]?/,"number.float"],[/[0-9]+\.[0-9]*([eE][+-]?[0-9]+)?[fh]?/,"number.float"],[/[0-9]+[eE][+-]?[0-9]+[fh]?/,"number.float"],[/0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+(?:[pP][+-]?[0-9]+[fh]?)?/,"number.hex"],[/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*(?:[pP][+-]?[0-9]+[fh]?)?/,"number.hex"],[/0[xX][0-9a-fA-F]+[pP][+-]?[0-9]+[fh]?/,"number.hex"],[/0[xX][0-9a-fA-F]+[iu]?/,"number.hex"],[/[1-9][0-9]*[iu]?/,"number"],[/0[iu]?/,"number"]]}};return x(F);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/xml/xml.js b/public/vs/basic-languages/xml/xml.js
new file mode 100644
index 0000000..a97261a
--- /dev/null
+++ b/public/vs/basic-languages/xml/xml.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/xml/xml", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var u=Object.create;var m=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var k=Object.getPrototypeOf,x=Object.prototype.hasOwnProperty;var f=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var w=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),b=(e,t)=>{for(var n in t)m(e,n,{get:t[n],enumerable:!0})},i=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of p(t))!x.call(e,o)&&o!==n&&m(e,o,{get:()=>t[o],enumerable:!(r=g(t,o))||r.enumerable});return e},l=(e,t,n)=>(i(e,t,"default"),n&&i(n,t,"default")),c=(e,t,n)=>(n=e!=null?u(k(e)):{},i(t||!e||!e.__esModule?m(n,"default",{value:e,enumerable:!0}):n,e)),q=e=>i(m({},"__esModule",{value:!0}),e);var s=w((v,d)=>{var N=c(f("vs/editor/editor.api"));d.exports=N});var I={};b(I,{conf:()=>A,language:()=>C});var a={};l(a,c(s()));var A={comments:{blockComment:["<!--","-->"]},brackets:[["<",">"]],autoClosingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],surroundingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],onEnterRules:[{beforeText:new RegExp("<([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$","i"),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:a.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp("<(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),action:{indentAction:a.languages.IndentAction.Indent}}]},C={defaultToken:"",tokenPostfix:".xml",ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,""],{include:"@whitespace"},[/(<)(@qualifiedName)/,[{token:"delimiter"},{token:"tag",next:"@tag"}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:"delimiter"},{token:"tag"},"",{token:"delimiter"}]],[/(<\?)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/(<\!)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/<\!\[CDATA\[/,{token:"delimiter.cdata",next:"@cdata"}],[/&\w+;/,"string.escape"]],cdata:[[/[^\]]+/,""],[/\]\]>/,{token:"delimiter.cdata",next:"@pop"}],[/\]/,""]],tag:[[/[ \t\r\n]+/,""],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,["attribute.name","","attribute.value"]],[/@qualifiedName/,"attribute.name"],[/\?>/,{token:"delimiter",next:"@pop"}],[/(\/)(>)/,[{token:"tag"},{token:"delimiter",next:"@pop"}]],[/>/,{token:"delimiter",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[/<!--/,{token:"comment",next:"@comment"}]],comment:[[/[^<\-]+/,"comment.content"],[/-->/,{token:"comment",next:"@pop"}],[/<!--/,"comment.content.invalid"],[/[<\-]/,"comment.content"]]}};return q(I);})();
+return moduleExports;
+});
diff --git a/public/vs/basic-languages/yaml/yaml.js b/public/vs/basic-languages/yaml/yaml.js
new file mode 100644
index 0000000..b6eba27
--- /dev/null
+++ b/public/vs/basic-languages/yaml/yaml.js
@@ -0,0 +1,10 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/yaml/yaml", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var m=Object.create;var l=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var g=Object.getPrototypeOf,f=Object.prototype.hasOwnProperty;var w=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,t)=>(typeof require<"u"?require:n)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var S=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports),k=(e,n)=>{for(var t in n)l(e,t,{get:n[t],enumerable:!0})},a=(e,n,t,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of p(n))!f.call(e,r)&&r!==t&&l(e,r,{get:()=>n[r],enumerable:!(i=b(n,r))||i.enumerable});return e},c=(e,n,t)=>(a(e,n,"default"),t&&a(t,n,"default")),u=(e,n,t)=>(t=e!=null?m(g(e)):{},a(n||!e||!e.__esModule?l(t,"default",{value:e,enumerable:!0}):t,e)),y=e=>a(l({},"__esModule",{value:!0}),e);var d=S((C,s)=>{var h=u(w("vs/editor/editor.api"));s.exports=h});var $={};k($,{conf:()=>N,language:()=>x});var o={};c(o,u(d()));var N={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{offSide:!0},onEnterRules:[{beforeText:/:\s*$/,action:{indentAction:o.languages.IndentAction.Indent}}]},x={tokenPostfix:".yaml",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["true","True","TRUE","false","False","FALSE","null","Null","Null","~"],numberInteger:/(?:0|[+-]?[0-9]+)/,numberFloat:/(?:0|[+-]?[0-9]+)(?:\.[0-9]+)?(?:e[-+][1-9][0-9]*)?/,numberOctal:/0o[0-7]+/,numberHex:/0x[0-9a-fA-F]+/,numberInfinity:/[+-]?\.(?:inf|Inf|INF)/,numberNaN:/\.(?:nan|Nan|NAN)/,numberDate:/\d{4}-\d\d-\d\d([Tt ]\d\d:\d\d:\d\d(\.\d+)?(( ?[+-]\d\d?(:\d\d)?)|Z)?)?/,escapes:/\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},[/%[^ ]+.*$/,"meta.directive"],[/---/,"operators.directivesEnd"],[/\.{3}/,"operators.documentEnd"],[/[-?:](?= )/,"operators"],{include:"@anchor"},{include:"@tagHandle"},{include:"@flowCollections"},{include:"@blockStyle"},[/@numberInteger(?![ \t]*\S+)/,"number"],[/@numberFloat(?![ \t]*\S+)/,"number.float"],[/@numberOctal(?![ \t]*\S+)/,"number.octal"],[/@numberHex(?![ \t]*\S+)/,"number.hex"],[/@numberInfinity(?![ \t]*\S+)/,"number.infinity"],[/@numberNaN(?![ \t]*\S+)/,"number.nan"],[/@numberDate(?![ \t]*\S+)/,"number.date"],[/(".*?"|'.*?'|[^#'"]*?)([ \t]*)(:)( |$)/,["type","white","operators","white"]],{include:"@flowScalars"},[/.+?(?=(\s+#|$))/,{cases:{"@keywords":"keyword","@default":"string"}}]],object:[{include:"@whitespace"},{include:"@comment"},[/\}/,"@brackets","@pop"],[/,/,"delimiter.comma"],[/:(?= )/,"operators"],[/(?:".*?"|'.*?'|[^,\{\[]+?)(?=: )/,"type"],{include:"@flowCollections"},{include:"@flowScalars"},{include:"@tagHandle"},{include:"@anchor"},{include:"@flowNumber"},[/[^\},]+/,{cases:{"@keywords":"keyword","@default":"string"}}]],array:[{include:"@whitespace"},{include:"@comment"},[/\]/,"@brackets","@pop"],[/,/,"delimiter.comma"],{include:"@flowCollections"},{include:"@flowScalars"},{include:"@tagHandle"},{include:"@anchor"},{include:"@flowNumber"},[/[^\],]+/,{cases:{"@keywords":"keyword","@default":"string"}}]],multiString:[[/^( +).+$/,"string","@multiStringContinued.$1"]],multiStringContinued:[[/^( *).+$/,{cases:{"$1==$S2":"string","@default":{token:"@rematch",next:"@popall"}}}]],whitespace:[[/[ \t\r\n]+/,"white"]],comment:[[/#.*$/,"comment"]],flowCollections:[[/\[/,"@brackets","@array"],[/\{/,"@brackets","@object"]],flowScalars:[[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/'[^']*'/,"string"],[/"/,"string","@doubleQuotedString"]],doubleQuotedString:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],blockStyle:[[/[>|][0-9]*[+-]?$/,"operators","@multiString"]],flowNumber:[[/@numberInteger(?=[ \t]*[,\]\}])/,"number"],[/@numberFloat(?=[ \t]*[,\]\}])/,"number.float"],[/@numberOctal(?=[ \t]*[,\]\}])/,"number.octal"],[/@numberHex(?=[ \t]*[,\]\}])/,"number.hex"],[/@numberInfinity(?=[ \t]*[,\]\}])/,"number.infinity"],[/@numberNaN(?=[ \t]*[,\]\}])/,"number.nan"],[/@numberDate(?=[ \t]*[,\]\}])/,"number.date"]],tagHandle:[[/\![^ ]*/,"tag"]],anchor:[[/[&*][^ ]+/,"namespace"]]}};return y($);})();
+return moduleExports;
+});
diff --git a/public/vs/editor/editor.main.css b/public/vs/editor/editor.main.css
new file mode 100644
index 0000000..2c937f3
--- /dev/null
+++ b/public/vs/editor/editor.main.css
@@ -0,0 +1,6 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/.monaco-action-bar{white-space:nowrap;height:100%}.monaco-action-bar .actions-container{display:flex;margin:0 auto;padding:0;height:100%;width:100%;align-items:center}.monaco-action-bar.vertical .actions-container{display:inline-block}.monaco-action-bar .action-item{display:block;align-items:center;justify-content:center;cursor:pointer;position:relative}.monaco-action-bar .action-item.disabled{cursor:default}.monaco-action-bar .action-item .codicon,.monaco-action-bar .action-item .icon{display:block}.monaco-action-bar .action-item .codicon{display:flex;align-items:center;width:16px;height:16px}.monaco-action-bar .action-label{display:flex;font-size:11px;padding:3px;border-radius:5px}.monaco-action-bar .action-item.disabled .action-label,.monaco-action-bar .action-item.disabled .action-label:before,.monaco-action-bar .action-item.disabled .action-label:hover{opacity:.6}.monaco-action-bar.vertical{text-align:left}.monaco-action-bar.vertical .action-item{display:block}.monaco-action-bar.vertical .action-label.separator{display:block;border-bottom:1px solid #bbb;padding-top:1px;margin-left:.8em;margin-right:.8em}.monaco-action-bar .action-item .action-label.separator{width:1px;height:16px;margin:5px 4px!important;cursor:default;min-width:1px;padding:0;background-color:#bbb}.secondary-actions .monaco-action-bar .action-label{margin-left:6px}.monaco-action-bar .action-item.select-container{overflow:hidden;flex:1;max-width:170px;min-width:60px;display:flex;align-items:center;justify-content:center;margin-right:10px}.monaco-action-bar .action-item.action-dropdown-item{display:flex}.monaco-action-bar .action-item.action-dropdown-item>.action-dropdown-item-separator{display:flex;align-items:center;cursor:default}.monaco-action-bar .action-item.action-dropdown-item>.action-dropdown-item-separator>div{width:1px}.monaco-aria-container{position:absolute;left:-999em}.monaco-text-button{box-sizing:border-box;display:flex;width:100%;padding:4px;border-radius:2px;text-align:center;cursor:pointer;justify-content:center;align-items:center;border:1px solid var(--vscode-button-border,transparent);line-height:18px}.monaco-text-button:focus{outline-offset:2px!important}.monaco-text-button:hover{text-decoration:none!important}.monaco-button.disabled,.monaco-button.disabled:focus{opacity:.4!important;cursor:default}.monaco-text-button .codicon{margin:0 .2em;color:inherit!important}.monaco-text-button.monaco-text-button-with-short-label{flex-direction:row;flex-wrap:wrap;padding:0 4px;overflow:hidden;height:28px}.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label{flex-basis:100%}.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label-short{flex-grow:1;width:0;overflow:hidden}.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label,.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label-short{display:flex;justify-content:center;align-items:center;font-weight:400;font-style:inherit;padding:4px 0}.monaco-button-dropdown{display:flex;cursor:pointer}.monaco-button-dropdown.disabled{cursor:default}.monaco-button-dropdown>.monaco-button:focus{outline-offset:-1px!important}.monaco-button-dropdown.disabled>.monaco-button-dropdown-separator,.monaco-button-dropdown.disabled>.monaco-button.disabled,.monaco-button-dropdown.disabled>.monaco-button.disabled:focus{opacity:.4!important}.monaco-button-dropdown>.monaco-button.monaco-text-button{border-right-width:0!important}.monaco-button-dropdown .monaco-button-dropdown-separator{padding:4px 0;cursor:default}.monaco-button-dropdown .monaco-button-dropdown-separator>div{height:100%;width:1px}.monaco-button-dropdown>.monaco-button.monaco-dropdown-button{border:1px solid var(--vscode-button-border,transparent);border-left-width:0!important;border-radius:0 2px 2px 0;display:flex;align-items:center}.monaco-button-dropdown>.monaco-button.monaco-text-button{border-radius:2px 0 0 2px}.monaco-description-button{display:flex;flex-direction:column;align-items:center;margin:4px 5px}.monaco-description-button .monaco-button-description{font-style:italic;font-size:11px;padding:4px 20px}.monaco-description-button .monaco-button-description,.monaco-description-button .monaco-button-label{display:flex;justify-content:center;align-items:center}.monaco-description-button .monaco-button-description>.codicon,.monaco-description-button .monaco-button-label>.codicon{margin:0 .2em;color:inherit!important}.monaco-button-dropdown.default-colors>.monaco-button,.monaco-button.default-colors{color:var(--vscode-button-foreground);background-color:var(--vscode-button-background)}.monaco-button-dropdown.default-colors>.monaco-button:hover,.monaco-button.default-colors:hover{background-color:var(--vscode-button-hoverBackground)}.monaco-button-dropdown.default-colors>.monaco-button.secondary,.monaco-button.default-colors.secondary{color:var(--vscode-button-secondaryForeground);background-color:var(--vscode-button-secondaryBackground)}.monaco-button-dropdown.default-colors>.monaco-button.secondary:hover,.monaco-button.default-colors.secondary:hover{background-color:var(--vscode-button-secondaryHoverBackground)}.monaco-button-dropdown.default-colors .monaco-button-dropdown-separator{background-color:var(--vscode-button-background);border-top:1px solid var(--vscode-button-border);border-bottom:1px solid var(--vscode-button-border)}.monaco-button-dropdown.default-colors .monaco-button.secondary+.monaco-button-dropdown-separator{background-color:var(--vscode-button-secondaryBackground)}.monaco-button-dropdown.default-colors .monaco-button-dropdown-separator>div{background-color:var(--vscode-button-separator)}@font-face{font-family:codicon;font-display:block;src:url(../base/browser/ui/codicons/codicon/codicon.ttf) format("truetype")}.codicon[class*=codicon-]{font:normal normal normal 16px/1 codicon;display:inline-block;text-decoration:none;text-rendering:auto;text-align:center;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;user-select:none;-webkit-user-select:none}.codicon-wrench-subaction{opacity:.5}@keyframes codicon-spin{to{transform:rotate(1turn)}}.codicon-gear.codicon-modifier-spin,.codicon-loading.codicon-modifier-spin,.codicon-notebook-state-executing.codicon-modifier-spin,.codicon-sync.codicon-modifier-spin{animation:codicon-spin 1.5s steps(30) infinite}.codicon-modifier-disabled{opacity:.4}.codicon-loading,.codicon-tree-item-loading:before{animation-duration:1s!important;animation-timing-function:cubic-bezier(.53,.21,.29,.67)!important}.context-view{position:absolute}.context-view.fixed{all:initial;font-family:inherit;font-size:13px;position:fixed;color:inherit}.monaco-count-badge{padding:3px 6px;border-radius:11px;font-size:11px;min-width:18px;min-height:18px;line-height:11px;font-weight:400;text-align:center;display:inline-block;box-sizing:border-box}.monaco-count-badge.long{padding:2px 3px;border-radius:2px;min-height:auto;line-height:normal}.monaco-dropdown{height:100%;padding:0}.monaco-dropdown>.dropdown-label{cursor:pointer;height:100%;display:flex;align-items:center;justify-content:center}.monaco-dropdown>.dropdown-label>.action-label.disabled{cursor:default}.monaco-dropdown-with-primary{display:flex!important;flex-direction:row;border-radius:5px}.monaco-dropdown-with-primary>.action-container>.action-label{margin-right:0}.monaco-dropdown-with-primary>.dropdown-action-container>.monaco-dropdown>.dropdown-label .codicon[class*=codicon-]{font-size:12px;padding-left:0;padding-right:0;line-height:16px;margin-left:-3px}.monaco-dropdown-with-primary>.dropdown-action-container>.monaco-dropdown>.dropdown-label>.action-label{display:block;background-size:16px;background-position:50%;background-repeat:no-repeat}.monaco-findInput{position:relative}.monaco-findInput .monaco-inputbox{font-size:13px;width:100%}.monaco-findInput>.controls{position:absolute;top:3px;right:2px}.vs .monaco-findInput.disabled{background-color:#e1e1e1}.vs-dark .monaco-findInput.disabled{background-color:#333}.hc-light .monaco-findInput.highlight-0 .controls,.monaco-findInput.highlight-0 .controls{animation:monaco-findInput-highlight-0 .1s linear 0s}.hc-light .monaco-findInput.highlight-1 .controls,.monaco-findInput.highlight-1 .controls{animation:monaco-findInput-highlight-1 .1s linear 0s}.hc-black .monaco-findInput.highlight-0 .controls,.vs-dark .monaco-findInput.highlight-0 .controls{animation:monaco-findInput-highlight-dark-0 .1s linear 0s}.hc-black .monaco-findInput.highlight-1 .controls,.vs-dark .monaco-findInput.highlight-1 .controls{animation:monaco-findInput-highlight-dark-1 .1s linear 0s}@keyframes monaco-findInput-highlight-0{0%{background:rgba(253,255,0,.8)}to{background:transparent}}@keyframes monaco-findInput-highlight-1{0%{background:rgba(253,255,0,.8)}99%{background:transparent}}@keyframes monaco-findInput-highlight-dark-0{0%{background:hsla(0,0%,100%,.44)}to{background:transparent}}@keyframes monaco-findInput-highlight-dark-1{0%{background:hsla(0,0%,100%,.44)}99%{background:transparent}}.monaco-hover{cursor:default;position:absolute;overflow:hidden;user-select:text;-webkit-user-select:text;box-sizing:border-box;animation:fadein .1s linear;line-height:1.5em;white-space:var(--vscode-hover-whiteSpace,normal)}.monaco-hover.hidden{display:none}.monaco-hover a:hover:not(.disabled){cursor:pointer}.monaco-hover .hover-contents:not(.html-hover-contents){padding:4px 8px}.monaco-hover .markdown-hover>.hover-contents:not(.code-hover-contents){max-width:var(--vscode-hover-maxWidth,500px);word-wrap:break-word}.monaco-hover .markdown-hover>.hover-contents:not(.code-hover-contents) hr{min-width:100%}.monaco-hover .code,.monaco-hover h1,.monaco-hover h2,.monaco-hover h3,.monaco-hover h4,.monaco-hover h5,.monaco-hover h6,.monaco-hover p,.monaco-hover ul{margin:8px 0}.monaco-hover h1,.monaco-hover h2,.monaco-hover h3,.monaco-hover h4,.monaco-hover h5,.monaco-hover h6{line-height:1.1}.monaco-hover code{font-family:var(--monaco-monospace-font)}.monaco-hover hr{box-sizing:border-box;border-left:0;border-right:0;margin:4px -8px -4px;height:1px}.monaco-hover .code:first-child,.monaco-hover p:first-child,.monaco-hover ul:first-child{margin-top:0}.monaco-hover .code:last-child,.monaco-hover p:last-child,.monaco-hover ul:last-child{margin-bottom:0}.monaco-hover ol,.monaco-hover ul{padding-left:20px}.monaco-hover li>p{margin-bottom:0}.monaco-hover li>ul{margin-top:0}.monaco-hover code{border-radius:3px;padding:0 .4em}.monaco-hover .monaco-tokenized-source{white-space:var(--vscode-hover-sourceWhiteSpace,pre-wrap)}.monaco-hover .hover-row.status-bar{font-size:12px;line-height:22px}.monaco-hover .hover-row.status-bar .info{font-style:italic;padding:0 8px}.monaco-hover .hover-row.status-bar .actions{display:flex;padding:0 8px}.monaco-hover .hover-row.status-bar .actions .action-container{margin-right:16px;cursor:pointer}.monaco-hover .hover-row.status-bar .actions .action-container .action .icon{padding-right:4px}.monaco-hover .markdown-hover .hover-contents .codicon{color:inherit;font-size:inherit;vertical-align:middle}.monaco-hover .hover-contents a.code-link,.monaco-hover .hover-contents a.code-link:hover{color:inherit}.monaco-hover .hover-contents a.code-link:before{content:"("}.monaco-hover .hover-contents a.code-link:after{content:")"}.monaco-hover .hover-contents a.code-link>span{text-decoration:underline;border-bottom:1px solid transparent;text-underline-position:under;color:var(--vscode-textLink-foreground)}.monaco-hover .hover-contents a.code-link>span:hover{color:var(--vscode-textLink-activeForeground)}.monaco-hover .markdown-hover .hover-contents:not(.code-hover-contents):not(.html-hover-contents) span{margin-bottom:4px;display:inline-block}.monaco-hover-content .action-container a{-webkit-user-select:none;user-select:none}.monaco-hover-content .action-container.disabled{pointer-events:none;opacity:.4;cursor:default}.monaco-icon-label{display:flex;overflow:hidden;text-overflow:ellipsis}.monaco-icon-label:before{background-size:16px;background-position:0;background-repeat:no-repeat;padding-right:6px;width:16px;height:22px;line-height:inherit!important;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top;flex-shrink:0}.monaco-icon-label-container.disabled{color:var(--vscode-disabledForeground)}.monaco-icon-label>.monaco-icon-label-container{min-width:0;overflow:hidden;text-overflow:ellipsis;flex:1}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-name-container>.label-name{color:inherit;white-space:pre}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-name-container>.label-name>.label-separator{margin:0 2px;opacity:.5}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-suffix-container>.label-suffix{opacity:.7;white-space:pre}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{opacity:.7;margin-left:.5em;font-size:.9em;white-space:pre}.monaco-icon-label.nowrap>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{white-space:nowrap}.vs .monaco-icon-label>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{opacity:.95}.monaco-icon-label.italic>.monaco-icon-label-container>.monaco-icon-description-container>.label-description,.monaco-icon-label.italic>.monaco-icon-label-container>.monaco-icon-name-container>.label-name{font-style:italic}.monaco-icon-label.deprecated{text-decoration:line-through;opacity:.66}.monaco-icon-label.italic:after{font-style:italic}.monaco-icon-label.strikethrough>.monaco-icon-label-container>.monaco-icon-description-container>.label-description,.monaco-icon-label.strikethrough>.monaco-icon-label-container>.monaco-icon-name-container>.label-name{text-decoration:line-through}.monaco-icon-label:after{opacity:.75;font-size:90%;font-weight:600;margin:auto 16px 0 5px;text-align:center}.monaco-list:focus .selected .monaco-icon-label,.monaco-list:focus .selected .monaco-icon-label:after{color:inherit!important}.monaco-list-row.focused.selected .label-description,.monaco-list-row.selected .label-description{opacity:.8}.monaco-inputbox{position:relative;display:block;padding:0;box-sizing:border-box;border-radius:2px;font-size:inherit}.monaco-inputbox>.ibwrapper>.input,.monaco-inputbox>.ibwrapper>.mirror{padding:4px 6px}.monaco-inputbox>.ibwrapper{position:relative;width:100%;height:100%}.monaco-inputbox>.ibwrapper>.input{display:inline-block;box-sizing:border-box;width:100%;height:100%;line-height:inherit;border:none;font-family:inherit;font-size:inherit;resize:none;color:inherit}.monaco-inputbox>.ibwrapper>input{text-overflow:ellipsis}.monaco-inputbox>.ibwrapper>textarea.input{display:block;scrollbar-width:none;outline:none}.monaco-inputbox>.ibwrapper>textarea.input::-webkit-scrollbar{display:none}.monaco-inputbox>.ibwrapper>textarea.input.empty{white-space:nowrap}.monaco-inputbox>.ibwrapper>.mirror{position:absolute;display:inline-block;width:100%;top:0;left:0;box-sizing:border-box;white-space:pre-wrap;visibility:hidden;word-wrap:break-word}.monaco-inputbox-container{text-align:right}.monaco-inputbox-container .monaco-inputbox-message{display:inline-block;overflow:hidden;text-align:left;width:100%;box-sizing:border-box;padding:.4em;font-size:12px;line-height:17px;margin-top:-1px;word-wrap:break-word}.monaco-inputbox .monaco-action-bar{position:absolute;right:2px;top:4px}.monaco-inputbox .monaco-action-bar .action-item{margin-left:2px}.monaco-inputbox .monaco-action-bar .action-item .codicon{background-repeat:no-repeat;width:16px;height:16px}.monaco-keybinding{display:flex;align-items:center;line-height:10px}.monaco-keybinding>.monaco-keybinding-key{display:inline-block;border-style:solid;border-width:1px;border-radius:3px;vertical-align:middle;font-size:11px;padding:3px 5px;margin:0 2px}.monaco-keybinding>.monaco-keybinding-key:first-child{margin-left:0}.monaco-keybinding>.monaco-keybinding-key:last-child{margin-right:0}.monaco-keybinding>.monaco-keybinding-key-separator{display:inline-block}.monaco-keybinding>.monaco-keybinding-key-chord-separator{width:6px}.monaco-list{position:relative;height:100%;width:100%;white-space:nowrap}.monaco-list.mouse-support{user-select:none;-webkit-user-select:none}.monaco-list>.monaco-scrollable-element{height:100%}.monaco-list-rows{position:relative;width:100%;height:100%}.monaco-list.horizontal-scrolling .monaco-list-rows{width:auto;min-width:100%}.monaco-list-row{position:absolute;box-sizing:border-box;overflow:hidden;width:100%}.monaco-list.mouse-support .monaco-list-row{cursor:pointer;touch-action:none}.monaco-list .monaco-scrollable-element>.scrollbar.vertical,.monaco-pane-view>.monaco-split-view2.vertical>.monaco-scrollable-element>.scrollbar.vertical{z-index:14}.monaco-list-row.scrolling{display:none!important}.monaco-list.element-focused,.monaco-list.selection-multiple,.monaco-list.selection-single{outline:0!important}.monaco-drag-image{display:inline-block;padding:1px 7px;border-radius:10px;font-size:12px;position:absolute;z-index:1000}.monaco-list-type-filter-message{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;padding:40px 1em 1em;text-align:center;white-space:normal;opacity:.7;pointer-events:none}.monaco-list-type-filter-message:empty{display:none}.monaco-mouse-cursor-text{cursor:text}.monaco-progress-container{width:100%;height:2px;overflow:hidden}.monaco-progress-container .progress-bit{width:2%;height:2px;position:absolute;left:0;display:none}.monaco-progress-container.active .progress-bit{display:inherit}.monaco-progress-container.discrete .progress-bit{left:0;transition:width .1s linear}.monaco-progress-container.discrete.done .progress-bit{width:100%}.monaco-progress-container.infinite .progress-bit{animation-name:progress;animation-duration:4s;animation-iteration-count:infinite;transform:translateZ(0);animation-timing-function:linear}.monaco-progress-container.infinite.infinite-long-running .progress-bit{animation-timing-function:steps(100)}@keyframes progress{0%{transform:translateX(0) scaleX(1)}50%{transform:translateX(2500%) scaleX(3)}to{transform:translateX(4900%) scaleX(1)}}:root{--vscode-sash-size:4px;--vscode-sash-hover-size:4px}.monaco-sash{position:absolute;z-index:35;touch-action:none}.monaco-sash.disabled{pointer-events:none}.monaco-sash.mac.vertical{cursor:col-resize}.monaco-sash.vertical.minimum{cursor:e-resize}.monaco-sash.vertical.maximum{cursor:w-resize}.monaco-sash.mac.horizontal{cursor:row-resize}.monaco-sash.horizontal.minimum{cursor:s-resize}.monaco-sash.horizontal.maximum{cursor:n-resize}.monaco-sash.disabled{cursor:default!important;pointer-events:none!important}.monaco-sash.vertical{cursor:ew-resize;top:0;width:var(--vscode-sash-size);height:100%}.monaco-sash.horizontal{cursor:ns-resize;left:0;width:100%;height:var(--vscode-sash-size)}.monaco-sash:not(.disabled)>.orthogonal-drag-handle{content:" ";height:calc(var(--vscode-sash-size)*2);width:calc(var(--vscode-sash-size)*2);z-index:100;display:block;cursor:all-scroll;position:absolute}.monaco-sash.horizontal.orthogonal-edge-north:not(.disabled)>.orthogonal-drag-handle.start,.monaco-sash.horizontal.orthogonal-edge-south:not(.disabled)>.orthogonal-drag-handle.end{cursor:nwse-resize}.monaco-sash.horizontal.orthogonal-edge-north:not(.disabled)>.orthogonal-drag-handle.end,.monaco-sash.horizontal.orthogonal-edge-south:not(.disabled)>.orthogonal-drag-handle.start{cursor:nesw-resize}.monaco-sash.vertical>.orthogonal-drag-handle.start{left:calc(var(--vscode-sash-size)*-0.5);top:calc(var(--vscode-sash-size)*-1)}.monaco-sash.vertical>.orthogonal-drag-handle.end{left:calc(var(--vscode-sash-size)*-0.5);bottom:calc(var(--vscode-sash-size)*-1)}.monaco-sash.horizontal>.orthogonal-drag-handle.start{top:calc(var(--vscode-sash-size)*-0.5);left:calc(var(--vscode-sash-size)*-1)}.monaco-sash.horizontal>.orthogonal-drag-handle.end{top:calc(var(--vscode-sash-size)*-0.5);right:calc(var(--vscode-sash-size)*-1)}.monaco-sash:before{content:"";pointer-events:none;position:absolute;width:100%;height:100%;background:transparent}.monaco-workbench:not(.reduce-motion) .monaco-sash:before{transition:background-color .1s ease-out}.monaco-sash.active:before,.monaco-sash.hover:before{background:var(--vscode-sash-hoverBorder)}.monaco-sash.vertical:before{width:var(--vscode-sash-hover-size);left:calc(50% - var(--vscode-sash-hover-size)/2)}.monaco-sash.horizontal:before{height:var(--vscode-sash-hover-size);top:calc(50% - var(--vscode-sash-hover-size)/2)}.pointer-events-disabled{pointer-events:none!important}.monaco-sash.debug{background:#0ff}.monaco-sash.debug.disabled{background:rgba(0,255,255,.2)}.monaco-sash.debug:not(.disabled)>.orthogonal-drag-handle{background:red}.monaco-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.monaco-scrollable-element>.visible{opacity:1;background:transparent;transition:opacity .1s linear;z-index:11}.monaco-scrollable-element>.invisible{opacity:0;pointer-events:none}.monaco-scrollable-element>.invisible.fade{transition:opacity .8s linear}.monaco-scrollable-element>.shadow{position:absolute;display:none}.monaco-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow) 0 6px 6px -6px inset}.monaco-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow) 6px 0 6px -6px inset}.monaco-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.monaco-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow) 6px 0 6px -6px inset}.monaco-scrollable-element>.scrollbar>.slider{background:var(--vscode-scrollbarSlider-background)}.monaco-scrollable-element>.scrollbar>.slider:hover{background:var(--vscode-scrollbarSlider-hoverBackground)}.monaco-scrollable-element>.scrollbar>.slider.active{background:var(--vscode-scrollbarSlider-activeBackground)}.monaco-select-box{width:100%;cursor:pointer;border-radius:2px}.monaco-select-box-dropdown-container{font-size:13px;font-weight:400;text-transform:none}.monaco-action-bar .action-item.select-container{cursor:default}.monaco-action-bar .action-item .monaco-select-box{cursor:pointer;min-width:100px;min-height:18px;padding:2px 23px 2px 8px}.mac .monaco-action-bar .action-item .monaco-select-box{font-size:11px;border-radius:5px}.monaco-select-box-dropdown-padding{--dropdown-padding-top:1px;--dropdown-padding-bottom:1px}.hc-black .monaco-select-box-dropdown-padding,.hc-light .monaco-select-box-dropdown-padding{--dropdown-padding-top:3px;--dropdown-padding-bottom:4px}.monaco-select-box-dropdown-container{display:none;box-sizing:border-box}.monaco-select-box-dropdown-container>.select-box-details-pane>.select-box-description-markdown *{margin:0}.monaco-select-box-dropdown-container>.select-box-details-pane>.select-box-description-markdown a:focus{outline:1px solid -webkit-focus-ring-color;outline-offset:-1px}.monaco-select-box-dropdown-container>.select-box-details-pane>.select-box-description-markdown code{line-height:15px;font-family:var(--monaco-monospace-font)}.monaco-select-box-dropdown-container.visible{display:flex;flex-direction:column;text-align:left;width:1px;overflow:hidden;border-bottom-left-radius:3px;border-bottom-right-radius:3px}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container{flex:0 0 auto;align-self:flex-start;padding-top:var(--dropdown-padding-top);padding-bottom:var(--dropdown-padding-bottom);padding-left:1px;padding-right:1px;width:100%;overflow:hidden;box-sizing:border-box}.monaco-select-box-dropdown-container>.select-box-details-pane{padding:5px}.hc-black .monaco-select-box-dropdown-container>.select-box-dropdown-list-container{padding-top:var(--dropdown-padding-top);padding-bottom:var(--dropdown-padding-bottom)}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row{cursor:pointer}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.option-text{text-overflow:ellipsis;overflow:hidden;padding-left:3.5px;white-space:nowrap;float:left}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.option-detail{text-overflow:ellipsis;overflow:hidden;padding-left:3.5px;white-space:nowrap;float:left;opacity:.7}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.option-decorator-right{text-overflow:ellipsis;overflow:hidden;padding-right:10px;white-space:nowrap;float:right}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.visually-hidden{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-dropdown-container-width-control{flex:1 1 auto;align-self:flex-start;opacity:0}.monaco-select-box-dropdown-container>.select-box-dropdown-container-width-control>.width-control-div{overflow:hidden;max-height:0}.monaco-select-box-dropdown-container>.select-box-dropdown-container-width-control>.width-control-div>.option-text-width-control{padding-left:4px;padding-right:8px;white-space:nowrap}.monaco-split-view2{position:relative;width:100%;height:100%}.monaco-split-view2>.sash-container{position:absolute;width:100%;height:100%;pointer-events:none}.monaco-split-view2>.sash-container>.monaco-sash{pointer-events:auto}.monaco-split-view2>.monaco-scrollable-element{width:100%;height:100%}.monaco-split-view2>.monaco-scrollable-element>.split-view-container{width:100%;height:100%;white-space:nowrap;position:relative}.monaco-split-view2>.monaco-scrollable-element>.split-view-container>.split-view-view{white-space:normal;position:absolute}.monaco-split-view2>.monaco-scrollable-element>.split-view-container>.split-view-view:not(.visible){display:none}.monaco-split-view2.vertical>.monaco-scrollable-element>.split-view-container>.split-view-view{width:100%}.monaco-split-view2.horizontal>.monaco-scrollable-element>.split-view-container>.split-view-view{height:100%}.monaco-split-view2.separator-border>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{content:" ";position:absolute;top:0;left:0;z-index:5;pointer-events:none;background-color:var(--separator-border)}.monaco-split-view2.separator-border.horizontal>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{height:100%;width:1px}.monaco-split-view2.separator-border.vertical>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{height:1px;width:100%}.monaco-table{display:flex;flex-direction:column;position:relative;height:100%;width:100%;white-space:nowrap;overflow:hidden}.monaco-table>.monaco-split-view2{border-bottom:1px solid transparent}.monaco-table>.monaco-list{flex:1}.monaco-table-tr{display:flex;height:100%}.monaco-table-th{width:100%;height:100%;font-weight:700;overflow:hidden;text-overflow:ellipsis}.monaco-table-td,.monaco-table-th{box-sizing:border-box;flex-shrink:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.monaco-table>.monaco-split-view2 .monaco-sash.vertical:before{content:"";position:absolute;left:calc(var(--vscode-sash-size)/2);width:0;border-left:1px solid transparent}.monaco-workbench:not(.reduce-motion) .monaco-table>.monaco-split-view2,.monaco-workbench:not(.reduce-motion) .monaco-table>.monaco-split-view2 .monaco-sash.vertical:before{transition:border-color .2s ease-out}.monaco-custom-toggle{margin-left:2px;float:left;cursor:pointer;overflow:hidden;width:20px;height:20px;border-radius:3px;border:1px solid transparent;padding:1px;box-sizing:border-box;user-select:none;-webkit-user-select:none}.monaco-custom-toggle:hover{background-color:var(--vscode-inputOption-hoverBackground)}.hc-black .monaco-custom-toggle:hover,.hc-light .monaco-custom-toggle:hover{border:1px dashed var(--vscode-focusBorder)}.hc-black .monaco-custom-toggle,.hc-black .monaco-custom-toggle:hover,.hc-light .monaco-custom-toggle,.hc-light .monaco-custom-toggle:hover{background:none}.monaco-custom-toggle.monaco-checkbox{height:18px;width:18px;border:1px solid transparent;border-radius:3px;margin-right:9px;margin-left:0;padding:0;opacity:1;background-size:16px!important}.monaco-action-bar .checkbox-action-item{display:flex;align-items:center}.monaco-action-bar .checkbox-action-item>.monaco-custom-toggle.monaco-checkbox{margin-right:4px}.monaco-action-bar .checkbox-action-item>.checkbox-label{font-size:12px}.monaco-custom-toggle.monaco-checkbox:not(.checked):before{visibility:hidden}.monaco-toolbar{height:100%}.monaco-toolbar .toolbar-toggle-more{display:inline-block;padding:0}.monaco-tl-row{display:flex;height:100%;align-items:center;position:relative}.monaco-tl-row.disabled{cursor:default}.monaco-tl-indent{height:100%;position:absolute;top:0;left:16px;pointer-events:none}.hide-arrows .monaco-tl-indent{left:12px}.monaco-tl-indent>.indent-guide{display:inline-block;box-sizing:border-box;height:100%;border-left:1px solid transparent}.monaco-workbench:not(.reduce-motion) .monaco-tl-indent>.indent-guide{transition:border-color .1s linear}.monaco-tl-contents,.monaco-tl-twistie{height:100%}.monaco-tl-twistie{font-size:10px;text-align:right;padding-right:6px;flex-shrink:0;width:16px;display:flex!important;align-items:center;justify-content:center;transform:translateX(3px)}.monaco-tl-contents{flex:1;overflow:hidden}.monaco-tl-twistie:before{border-radius:20px}.monaco-tl-twistie.collapsed:before{transform:rotate(-90deg)}.monaco-tl-twistie.codicon-tree-item-loading:before{animation:codicon-spin 1.25s steps(30) infinite}.monaco-tree-type-filter{position:absolute;top:0;display:flex;padding:3px;max-width:200px;z-index:100;margin:0 6px;border:1px solid var(--vscode-widget-border);border-bottom-left-radius:4px;border-bottom-right-radius:4px}.monaco-workbench:not(.reduce-motion) .monaco-tree-type-filter{transition:top .3s}.monaco-tree-type-filter.disabled{top:-40px!important}.monaco-tree-type-filter-grab{display:flex!important;align-items:center;justify-content:center;cursor:grab;margin-right:2px}.monaco-tree-type-filter-grab.grabbing{cursor:grabbing}.monaco-tree-type-filter-input{flex:1}.monaco-tree-type-filter-input .monaco-inputbox{height:23px}.monaco-tree-type-filter-input .monaco-inputbox>.ibwrapper>.input,.monaco-tree-type-filter-input .monaco-inputbox>.ibwrapper>.mirror{padding:2px 4px}.monaco-tree-type-filter-input .monaco-findInput>.controls{top:2px}.monaco-tree-type-filter-actionbar{margin-left:4px}.monaco-tree-type-filter-actionbar .monaco-action-bar .action-label{padding:2px}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container{position:absolute;top:0;left:0;width:100%;height:0;z-index:13;background-color:var(--vscode-sideBar-background)}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-row.monaco-list-row{position:absolute;width:100%;opacity:1!important;overflow:hidden;background-color:var(--vscode-sideBar-background)}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-row:hover{background-color:var(--vscode-list-hoverBackground)!important;cursor:pointer}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container.empty,.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container.empty .monaco-tree-sticky-container-shadow{display:none}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-container-shadow{position:absolute;bottom:-3px;left:0;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow) 0 6px 6px -6px inset}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container[tabindex="0"]:focus{outline:none}.monaco-editor .inputarea{min-width:0;min-height:0;margin:0;padding:0;position:absolute;outline:none!important;resize:none;border:none;overflow:hidden;color:transparent;background-color:transparent;z-index:-10}.monaco-editor .inputarea.ime-input{z-index:10;caret-color:var(--vscode-editorCursor-foreground);color:var(--vscode-editor-foreground)}.monaco-editor .blockDecorations-container{position:absolute;top:0;pointer-events:none}.monaco-editor .blockDecorations-block{position:absolute;box-sizing:border-box}.monaco-editor .margin-view-overlays .current-line,.monaco-editor .view-overlays .current-line{display:block;position:absolute;left:0;top:0;box-sizing:border-box}.monaco-editor .margin-view-overlays .current-line.current-line-margin.current-line-margin-both{border-right:0}.monaco-editor .lines-content .cdr{position:absolute}.monaco-editor .glyph-margin{position:absolute;top:0}.monaco-editor .glyph-margin-widgets .cgmr{position:absolute;display:flex;align-items:center;justify-content:center}.monaco-editor .glyph-margin-widgets .cgmr.codicon-modifier-spin:before{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.monaco-editor .lines-content .core-guide{position:absolute;box-sizing:border-box}.monaco-editor .margin-view-overlays .line-numbers{font-variant-numeric:tabular-nums;position:absolute;text-align:right;display:inline-block;vertical-align:middle;box-sizing:border-box;cursor:default;height:100%}.monaco-editor .relative-current-line-number{text-align:left;display:inline-block;width:100%}.monaco-editor .margin-view-overlays .line-numbers.lh-odd{margin-top:1px}.monaco-editor .line-numbers{color:var(--vscode-editorLineNumber-foreground)}.monaco-editor .line-numbers.active-line-number{color:var(--vscode-editorLineNumber-activeForeground)}.mtkcontrol{color:#fff!important;background:#960000!important}.mtkoverflow{background-color:var(--vscode-button-background,var(--vscode-editor-background));color:var(--vscode-button-foreground,var(--vscode-editor-foreground));border:1px solid var(--vscode-contrastBorder);border-radius:2px;padding:4px;cursor:pointer}.mtkoverflow:hover{background-color:var(--vscode-button-hoverBackground)}.monaco-editor.no-user-select .lines-content,.monaco-editor.no-user-select .view-line,.monaco-editor.no-user-select .view-lines{user-select:none;-webkit-user-select:none}.monaco-editor.mac .lines-content:hover,.monaco-editor.mac .view-line:hover,.monaco-editor.mac .view-lines:hover{user-select:text;-webkit-user-select:text;-ms-user-select:text}.monaco-editor.enable-user-select{user-select:initial;-webkit-user-select:initial}.monaco-editor .view-lines{white-space:nowrap}.monaco-editor .view-line{position:absolute;width:100%}.monaco-editor .mtkw,.monaco-editor .mtkz{color:var(--vscode-editorWhitespace-foreground)!important}.monaco-editor .mtkz{display:inline-block}.monaco-editor .lines-decorations{position:absolute;top:0;background:#fff}.monaco-editor .margin-view-overlays .cldr{position:absolute;height:100%}.monaco-editor .margin{background-color:var(--vscode-editorGutter-background)}.monaco-editor .margin-view-overlays .cmdr{position:absolute;left:0;width:100%;height:100%}.monaco-editor .minimap.slider-mouseover .minimap-slider{opacity:0;transition:opacity .1s linear}.monaco-editor .minimap.slider-mouseover .minimap-slider.active,.monaco-editor .minimap.slider-mouseover:hover .minimap-slider{opacity:1}.monaco-editor .minimap-slider .minimap-slider-horizontal{background:var(--vscode-minimapSlider-background)}.monaco-editor .minimap-slider:hover .minimap-slider-horizontal{background:var(--vscode-minimapSlider-hoverBackground)}.monaco-editor .minimap-slider.active .minimap-slider-horizontal{background:var(--vscode-minimapSlider-activeBackground)}.monaco-editor .minimap-shadow-visible{box-shadow:var(--vscode-scrollbar-shadow) -6px 0 6px -6px inset}.monaco-editor .minimap-shadow-hidden{position:absolute;width:0}.monaco-editor .minimap-shadow-visible{position:absolute;left:-6px;width:6px}.monaco-editor.no-minimap-shadow .minimap-shadow-visible{position:absolute;left:-1px;width:1px}.minimap.autohide{opacity:0;transition:opacity .5s}.minimap.autohide:hover{opacity:1}.monaco-editor .minimap{z-index:5}.monaco-editor .overlayWidgets{position:absolute;top:0;left:0}.monaco-editor .view-ruler{position:absolute;top:0;box-shadow:1px 0 0 0 var(--vscode-editorRuler-foreground) inset}.monaco-editor .scroll-decoration{position:absolute;top:0;left:0;height:6px;box-shadow:var(--vscode-scrollbar-shadow) 0 6px 6px -6px inset}.monaco-editor .lines-content .cslr{position:absolute}.monaco-editor .focused .selected-text{background-color:var(--vscode-editor-selectionBackground)}.monaco-editor .selected-text{background-color:var(--vscode-editor-inactiveSelectionBackground)}.monaco-editor .top-left-radius{border-top-left-radius:3px}.monaco-editor .bottom-left-radius{border-bottom-left-radius:3px}.monaco-editor .top-right-radius{border-top-right-radius:3px}.monaco-editor .bottom-right-radius{border-bottom-right-radius:3px}.monaco-editor.hc-black .top-left-radius{border-top-left-radius:0}.monaco-editor.hc-black .bottom-left-radius{border-bottom-left-radius:0}.monaco-editor.hc-black .top-right-radius{border-top-right-radius:0}.monaco-editor.hc-black .bottom-right-radius{border-bottom-right-radius:0}.monaco-editor.hc-light .top-left-radius{border-top-left-radius:0}.monaco-editor.hc-light .bottom-left-radius{border-bottom-left-radius:0}.monaco-editor.hc-light .top-right-radius{border-top-right-radius:0}.monaco-editor.hc-light .bottom-right-radius{border-bottom-right-radius:0}.monaco-editor .cursors-layer{position:absolute;top:0}.monaco-editor .cursors-layer>.cursor{position:absolute;overflow:hidden;box-sizing:border-box}.monaco-editor .cursors-layer.cursor-smooth-caret-animation>.cursor{transition:all 80ms}.monaco-editor .cursors-layer.cursor-block-outline-style>.cursor{background:transparent!important;border-style:solid;border-width:1px}.monaco-editor .cursors-layer.cursor-underline-style>.cursor{border-bottom-width:2px;border-bottom-style:solid;background:transparent!important}.monaco-editor .cursors-layer.cursor-underline-thin-style>.cursor{border-bottom-width:1px;border-bottom-style:solid;background:transparent!important}@keyframes monaco-cursor-smooth{0%,20%{opacity:1}60%,to{opacity:0}}@keyframes monaco-cursor-phase{0%,20%{opacity:1}90%,to{opacity:0}}@keyframes monaco-cursor-expand{0%,20%{transform:scaleY(1)}80%,to{transform:scaleY(0)}}.cursor-smooth{animation:monaco-cursor-smooth .5s ease-in-out 0s 20 alternate}.cursor-phase{animation:monaco-cursor-phase .5s ease-in-out 0s 20 alternate}.cursor-expand>.cursor{animation:monaco-cursor-expand .5s ease-in-out 0s 20 alternate}.monaco-editor .mwh{position:absolute;color:var(--vscode-editorWhitespace-foreground)!important}.monaco-diff-editor .diff-review-line-number{text-align:right;display:inline-block;color:var(--vscode-editorLineNumber-foreground)}.monaco-diff-editor .diff-review{position:absolute;user-select:none;-webkit-user-select:none;z-index:99}.monaco-diff-editor .diff-review-summary{padding-left:10px}.monaco-diff-editor .diff-review-shadow{position:absolute;box-shadow:var(--vscode-scrollbar-shadow) 0 -6px 6px -6px inset}.monaco-diff-editor .diff-review-row{white-space:pre}.monaco-diff-editor .diff-review-table{display:table;min-width:100%}.monaco-diff-editor .diff-review-row{display:table-row;width:100%}.monaco-diff-editor .diff-review-spacer{display:inline-block;width:10px;vertical-align:middle}.monaco-diff-editor .diff-review-spacer>.codicon{font-size:9px!important}.monaco-diff-editor .diff-review-actions{display:inline-block;position:absolute;right:10px;top:2px;z-index:100}.monaco-diff-editor .diff-review-actions .action-label{width:16px;height:16px;margin:2px 0}.monaco-diff-editor .revertButton{cursor:pointer}.monaco-editor .diff-hidden-lines-widget{width:100%}.monaco-editor .diff-hidden-lines{height:0;transform:translateY(-10px);font-size:13px;line-height:14px}.monaco-editor .diff-hidden-lines .bottom.dragging,.monaco-editor .diff-hidden-lines .top.dragging,.monaco-editor .diff-hidden-lines:not(.dragging) .bottom:hover,.monaco-editor .diff-hidden-lines:not(.dragging) .top:hover{background-color:var(--vscode-focusBorder)}.monaco-editor .diff-hidden-lines .bottom,.monaco-editor .diff-hidden-lines .top{transition:background-color .1s ease-out;height:4px;background-color:transparent;background-clip:padding-box;border-bottom:2px solid transparent;border-top:4px solid transparent}.monaco-editor .diff-hidden-lines .bottom.canMoveTop:not(.canMoveBottom),.monaco-editor .diff-hidden-lines .top.canMoveTop:not(.canMoveBottom),.monaco-editor.draggingUnchangedRegion.canMoveTop:not(.canMoveBottom) *{cursor:n-resize!important}.monaco-editor .diff-hidden-lines .bottom:not(.canMoveTop).canMoveBottom,.monaco-editor .diff-hidden-lines .top:not(.canMoveTop).canMoveBottom,.monaco-editor.draggingUnchangedRegion:not(.canMoveTop).canMoveBottom *{cursor:s-resize!important}.monaco-editor .diff-hidden-lines .bottom.canMoveTop.canMoveBottom,.monaco-editor .diff-hidden-lines .top.canMoveTop.canMoveBottom,.monaco-editor.draggingUnchangedRegion.canMoveTop.canMoveBottom *{cursor:ns-resize!important}.monaco-editor .diff-hidden-lines .top{transform:translateY(4px)}.monaco-editor .diff-hidden-lines .bottom{transform:translateY(-6px)}.monaco-editor .diff-unchanged-lines{background:var(--vscode-diffEditor-unchangedCodeBackground)}.monaco-editor .noModificationsOverlay{z-index:1;background:var(--vscode-editor-background);display:flex;justify-content:center;align-items:center}.monaco-editor .diff-hidden-lines .center{background:var(--vscode-diffEditor-unchangedRegionBackground);color:var(--vscode-diffEditor-unchangedRegionForeground);overflow:hidden;display:block;text-overflow:ellipsis;white-space:nowrap;height:24px;box-shadow:inset 0 -5px 5px -7px var(--vscode-diffEditor-unchangedRegionShadow),inset 0 5px 5px -7px var(--vscode-diffEditor-unchangedRegionShadow)}.monaco-editor .diff-hidden-lines .center span.codicon{vertical-align:middle}.monaco-editor .diff-hidden-lines .center a:hover .codicon{cursor:pointer;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .diff-hidden-lines div.breadcrumb-item{cursor:pointer}.monaco-editor .diff-hidden-lines div.breadcrumb-item:hover{color:var(--vscode-editorLink-activeForeground)}.monaco-editor .movedModified,.monaco-editor .movedOriginal{border:2px solid var(--vscode-diffEditor-move-border)}.monaco-editor .movedModified.currentMove,.monaco-editor .movedOriginal.currentMove{border:2px solid var(--vscode-diffEditor-moveActive-border)}.monaco-diff-editor .moved-blocks-lines path.currentMove{stroke:var(--vscode-diffEditor-moveActive-border)}.monaco-diff-editor .moved-blocks-lines path{pointer-events:visiblestroke}.monaco-diff-editor .moved-blocks-lines .arrow{fill:var(--vscode-diffEditor-move-border)}.monaco-diff-editor .moved-blocks-lines .arrow.currentMove{fill:var(--vscode-diffEditor-moveActive-border)}.monaco-diff-editor .moved-blocks-lines .arrow-rectangle{fill:var(--vscode-editor-background)}.monaco-diff-editor .moved-blocks-lines{position:absolute;pointer-events:none}.monaco-diff-editor .moved-blocks-lines path{fill:none;stroke:var(--vscode-diffEditor-move-border);stroke-width:2}.monaco-editor .char-delete.diff-range-empty{margin-left:-1px;border-left:3px solid var(--vscode-diffEditor-removedTextBackground)}.monaco-editor .char-insert.diff-range-empty{border-left:3px solid var(--vscode-diffEditor-insertedTextBackground)}.monaco-editor .fold-unchanged{cursor:pointer}.monaco-diff-editor .diff-moved-code-block{display:flex;justify-content:flex-end;margin-top:-4px}.monaco-diff-editor .diff-moved-code-block .action-bar .action-label.codicon{width:12px;height:12px;font-size:12px}.monaco-diff-editor .diffOverview{z-index:9}.monaco-diff-editor .diffOverview .diffViewport{z-index:10}.monaco-diff-editor.vs .diffOverview{background:rgba(0,0,0,.03)}.monaco-diff-editor.vs-dark .diffOverview{background:hsla(0,0%,100%,.01)}.monaco-scrollable-element.modified-in-monaco-diff-editor.vs-dark .scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.vs .scrollbar{background:transparent}.monaco-scrollable-element.modified-in-monaco-diff-editor.hc-black .scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.hc-light .scrollbar{background:none}.monaco-scrollable-element.modified-in-monaco-diff-editor .slider{z-index:10}.modified-in-monaco-diff-editor .slider.active{background:hsla(0,0%,67.1%,.4)}.modified-in-monaco-diff-editor.hc-black .slider.active,.modified-in-monaco-diff-editor.hc-light .slider.active{background:none}.monaco-diff-editor .delete-sign,.monaco-diff-editor .insert-sign,.monaco-editor .delete-sign,.monaco-editor .insert-sign{font-size:11px!important;opacity:.7!important;display:flex!important;align-items:center}.monaco-diff-editor.hc-black .delete-sign,.monaco-diff-editor.hc-black .insert-sign,.monaco-diff-editor.hc-light .delete-sign,.monaco-diff-editor.hc-light .insert-sign,.monaco-editor.hc-black .delete-sign,.monaco-editor.hc-black .insert-sign,.monaco-editor.hc-light .delete-sign,.monaco-editor.hc-light .insert-sign{opacity:1}.monaco-editor .inline-added-margin-view-zone,.monaco-editor .inline-deleted-margin-view-zone{text-align:right}.monaco-editor .arrow-revert-change{z-index:10;position:absolute}.monaco-editor .arrow-revert-change:hover{cursor:pointer}.monaco-editor .view-zones .view-lines .view-line span{display:inline-block}.monaco-editor .margin-view-zones .lightbulb-glyph:hover{cursor:pointer}.monaco-diff-editor .char-insert,.monaco-editor .char-insert{background-color:var(--vscode-diffEditor-insertedTextBackground)}.monaco-diff-editor .line-insert,.monaco-editor .line-insert{background-color:var(--vscode-diffEditor-insertedLineBackground,var(--vscode-diffEditor-insertedTextBackground))}.monaco-editor .char-insert,.monaco-editor .line-insert{box-sizing:border-box;border:1px solid var(--vscode-diffEditor-insertedTextBorder)}.monaco-editor.hc-black .char-insert,.monaco-editor.hc-black .line-insert,.monaco-editor.hc-light .char-insert,.monaco-editor.hc-light .line-insert{border-style:dashed}.monaco-editor .char-delete,.monaco-editor .line-delete{box-sizing:border-box;border:1px solid var(--vscode-diffEditor-removedTextBorder)}.monaco-editor.hc-black .char-delete,.monaco-editor.hc-black .line-delete,.monaco-editor.hc-light .char-delete,.monaco-editor.hc-light .line-delete{border-style:dashed}.monaco-diff-editor .gutter-insert,.monaco-editor .gutter-insert,.monaco-editor .inline-added-margin-view-zone{background-color:var(--vscode-diffEditorGutter-insertedLineBackground,var(--vscode-diffEditor-insertedLineBackground),var(--vscode-diffEditor-insertedTextBackground))}.monaco-diff-editor .char-delete,.monaco-editor .char-delete{background-color:var(--vscode-diffEditor-removedTextBackground)}.monaco-diff-editor .line-delete,.monaco-editor .line-delete{background-color:var(--vscode-diffEditor-removedLineBackground,var(--vscode-diffEditor-removedTextBackground))}.monaco-diff-editor .gutter-delete,.monaco-editor .gutter-delete,.monaco-editor .inline-deleted-margin-view-zone{background-color:var(--vscode-diffEditorGutter-removedLineBackground,var(--vscode-diffEditor-removedLineBackground),var(--vscode-diffEditor-removedTextBackground))}.monaco-diff-editor.side-by-side .editor.modified{box-shadow:-6px 0 5px -5px var(--vscode-scrollbar-shadow);border-left:1px solid var(--vscode-diffEditor-border)}.monaco-diff-editor .diffViewport{background:var(--vscode-scrollbarSlider-background)}.monaco-diff-editor .diffViewport:hover{background:var(--vscode-scrollbarSlider-hoverBackground)}.monaco-diff-editor .diffViewport:active{background:var(--vscode-scrollbarSlider-activeBackground)}.monaco-editor .diagonal-fill{background-image:linear-gradient(-45deg,var(--vscode-diffEditor-diagonalFill) 12.5%,transparent 0,transparent 50%,var(--vscode-diffEditor-diagonalFill) 0,var(--vscode-diffEditor-diagonalFill) 62.5%,transparent 0,transparent);background-size:8px 8px}.monaco-workbench .workbench-hover{position:relative;font-size:13px;line-height:19px;z-index:40;overflow:hidden;max-width:700px;background:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border);border-radius:3px;color:var(--vscode-editorHoverWidget-foreground);box-shadow:0 2px 8px var(--vscode-widget-shadow)}.monaco-workbench .workbench-hover hr{border-bottom:none}.monaco-workbench .workbench-hover:not(.skip-fade-in){animation:fadein .1s linear}.monaco-workbench .workbench-hover.compact{font-size:12px}.monaco-workbench .workbench-hover.compact .hover-contents{padding:2px 8px}.monaco-workbench .workbench-hover-container.locked .workbench-hover{outline:1px solid var(--vscode-editorHoverWidget-border)}.monaco-workbench .workbench-hover-container.locked .workbench-hover:focus,.monaco-workbench .workbench-hover-lock:focus{outline:1px solid var(--vscode-focusBorder)}.monaco-workbench .workbench-hover-container.locked .workbench-hover-lock:hover{background:var(--vscode-toolbar-hoverBackground)}.monaco-workbench .workbench-hover-pointer{position:absolute;z-index:41;pointer-events:none}.monaco-workbench .workbench-hover-pointer:after{content:"";position:absolute;width:5px;height:5px;background-color:var(--vscode-editorHoverWidget-background);border-right:1px solid var(--vscode-editorHoverWidget-border);border-bottom:1px solid var(--vscode-editorHoverWidget-border)}.monaco-workbench .locked .workbench-hover-pointer:after{width:4px;height:4px;border-right-width:2px;border-bottom-width:2px}.monaco-workbench .workbench-hover-pointer.left{left:-3px}.monaco-workbench .workbench-hover-pointer.right{right:3px}.monaco-workbench .workbench-hover-pointer.top{top:-3px}.monaco-workbench .workbench-hover-pointer.bottom{bottom:3px}.monaco-workbench .workbench-hover-pointer.left:after{transform:rotate(135deg)}.monaco-workbench .workbench-hover-pointer.right:after{transform:rotate(315deg)}.monaco-workbench .workbench-hover-pointer.top:after{transform:rotate(225deg)}.monaco-workbench .workbench-hover-pointer.bottom:after{transform:rotate(45deg)}.monaco-workbench .workbench-hover a{color:var(--vscode-textLink-foreground)}.monaco-workbench .workbench-hover a:focus{outline:1px solid;outline-offset:-1px;text-decoration:underline;outline-color:var(--vscode-focusBorder)}.monaco-workbench .workbench-hover a:active,.monaco-workbench .workbench-hover a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-workbench .workbench-hover code{background:var(--vscode-textCodeBlock-background)}.monaco-workbench .workbench-hover .hover-row .actions{background:var(--vscode-editorHoverWidget-statusBarBackground)}.monaco-workbench .workbench-hover.right-aligned{left:1px}.monaco-workbench .workbench-hover.right-aligned .hover-row.status-bar .actions{flex-direction:row-reverse}.monaco-workbench .workbench-hover.right-aligned .hover-row.status-bar .actions .action-container{margin-right:0;margin-left:16px}.monaco-editor .rendered-markdown kbd{background-color:var(--vscode-keybindingLabel-background);color:var(--vscode-keybindingLabel-foreground);border-radius:3px;border:1px solid var(--vscode-keybindingLabel-border);border-bottom-color:var(--vscode-keybindingLabel-bottomBorder);box-shadow:inset 0 -1px 0 var(--vscode-widget-shadow);vertical-align:middle;padding:1px 3px}::-ms-clear{display:none}.monaco-editor .editor-widget input{color:inherit}.monaco-editor{position:relative;overflow:visible;-webkit-text-size-adjust:100%;color:var(--vscode-editor-foreground)}.monaco-editor,.monaco-editor-background{background-color:var(--vscode-editor-background)}.monaco-editor .rangeHighlight{background-color:var(--vscode-editor-rangeHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-rangeHighlightBorder)}.monaco-editor.hc-black .rangeHighlight,.monaco-editor.hc-light .rangeHighlight{border-style:dotted}.monaco-editor .symbolHighlight{background-color:var(--vscode-editor-symbolHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-symbolHighlightBorder)}.monaco-editor.hc-black .symbolHighlight,.monaco-editor.hc-light .symbolHighlight{border-style:dotted}.monaco-editor .overflow-guard{position:relative;overflow:hidden}.monaco-editor .view-overlays{position:absolute;top:0}.monaco-editor .squiggly-error{border-bottom:4px double var(--vscode-editorError-border)}.monaco-editor .squiggly-error:before{display:block;content:"";width:100%;height:100%;background:var(--vscode-editorError-background)}.monaco-editor .squiggly-warning{border-bottom:4px double var(--vscode-editorWarning-border)}.monaco-editor .squiggly-warning:before{display:block;content:"";width:100%;height:100%;background:var(--vscode-editorWarning-background)}.monaco-editor .squiggly-info{border-bottom:4px double var(--vscode-editorInfo-border)}.monaco-editor .squiggly-info:before{display:block;content:"";width:100%;height:100%;background:var(--vscode-editorInfo-background)}.monaco-editor .squiggly-hint{border-bottom:2px dotted var(--vscode-editorHint-border)}.monaco-editor.showUnused .squiggly-unnecessary{border-bottom:2px dashed var(--vscode-editorUnnecessaryCode-border)}.monaco-editor.showDeprecated .squiggly-inline-deprecated{text-decoration:line-through;text-decoration-color:var(--vscode-editor-foreground,inherit)}.monaco-component.multiDiffEditor{background:var(--vscode-multiDiffEditor-background);overflow-y:hidden}.monaco-component .multiDiffEntry{display:flex;flex-direction:column;flex:1;overflow:hidden;border-bottom:1px solid var(--vscode-multiDiffEditor-border)}.monaco-component .multiDiffEntry .collapse-button{margin:0 5px;cursor:pointer}.monaco-component .multiDiffEntry .collapse-button a{display:block}.monaco-component .multiDiffEntry .header{display:flex;align-items:center;padding:8px 5px;color:var(--vscode-foreground);background:var(--vscode-editor-background);z-index:1000;border-top:1px solid var(--vscode-multiDiffEditor-border);border-bottom:1px solid var(--vscode-sideBarSectionHeader-border)}.monaco-component .multiDiffEntry .header.shadow{box-shadow:var(--vscode-scrollbar-shadow) 0 6px 6px -6px}.monaco-component .multiDiffEntry .header .file-path{display:flex;flex:1;min-width:0}.monaco-component .multiDiffEntry .header .file-path .title{font-size:14px;line-height:22px}.monaco-component .multiDiffEntry .header .file-path .status{font-weight:600;opacity:.75;margin:0 10px;line-height:22px}.monaco-component .multiDiffEntry .header .file-path .title.original{flex:1;min-width:0;text-overflow:ellipsis}.monaco-component .multiDiffEntry .header .actions{padding:0 8px}.monaco-component .multiDiffEntry .editorParent{flex:1;display:flex;flex-direction:column}.monaco-component .multiDiffEntry .editorContainer{flex:1}.monaco-editor .selection-anchor{background-color:#007acc;width:2px!important}.monaco-editor .bracket-match{box-sizing:border-box;background-color:var(--vscode-editorBracketMatch-background);border:1px solid var(--vscode-editorBracketMatch-border)}.monaco-editor .lightBulbWidget{display:flex;align-items:center;justify-content:center}.monaco-editor .lightBulbWidget:hover{cursor:pointer}.monaco-editor .lightBulbWidget.codicon-light-bulb,.monaco-editor .lightBulbWidget.codicon-lightbulb-sparkle{color:var(--vscode-editorLightBulb-foreground)}.monaco-editor .lightBulbWidget.codicon-lightbulb-autofix,.monaco-editor .lightBulbWidget.codicon-lightbulb-sparkle-autofix{color:var(--vscode-editorLightBulbAutoFix-foreground,var(--vscode-editorLightBulb-foreground))}.monaco-editor .lightBulbWidget.codicon-sparkle-filled{color:var(--vscode-editorLightBulbAi-foreground,var(--vscode-icon-foreground))}.monaco-editor .lightBulbWidget:before{position:relative;z-index:2}.monaco-editor .lightBulbWidget:after{position:absolute;top:0;left:0;content:"";display:block;width:100%;height:100%;opacity:.3;background-color:var(--vscode-editor-background);z-index:1}.monaco-editor .codelens-decoration{overflow:hidden;display:inline-block;text-overflow:ellipsis;white-space:nowrap;color:var(--vscode-editorCodeLens-foreground);line-height:var(--vscode-editorCodeLens-lineHeight);font-size:var(--vscode-editorCodeLens-fontSize);padding-right:calc(var(--vscode-editorCodeLens-fontSize)*0.5);font-feature-settings:var(--vscode-editorCodeLens-fontFeatureSettings);font-family:var(--vscode-editorCodeLens-fontFamily),var(--vscode-editorCodeLens-fontFamilyDefault)}.monaco-editor .codelens-decoration>a,.monaco-editor .codelens-decoration>span{user-select:none;-webkit-user-select:none;white-space:nowrap;vertical-align:sub}.monaco-editor .codelens-decoration>a{text-decoration:none}.monaco-editor .codelens-decoration>a:hover{cursor:pointer}.monaco-editor .codelens-decoration>a:hover,.monaco-editor .codelens-decoration>a:hover .codicon{color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .codelens-decoration .codicon{vertical-align:middle;color:currentColor!important;color:var(--vscode-editorCodeLens-foreground);line-height:var(--vscode-editorCodeLens-lineHeight);font-size:var(--vscode-editorCodeLens-fontSize)}.monaco-editor .codelens-decoration>a:hover .codicon:before{cursor:pointer}@keyframes fadein{0%{opacity:0;visibility:visible}to{opacity:1}}.monaco-editor .codelens-decoration.fadein{animation:fadein .1s linear}.colorpicker-widget{height:190px;user-select:none;-webkit-user-select:none}.colorpicker-color-decoration,.hc-light .colorpicker-color-decoration{border:.1em solid #000;box-sizing:border-box;margin:.1em .2em 0;width:.8em;height:.8em;line-height:.8em;display:inline-block;cursor:pointer}.hc-black .colorpicker-color-decoration,.vs-dark .colorpicker-color-decoration{border:.1em solid #eee}.colorpicker-header{display:flex;height:24px;position:relative;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAHUlEQVQYV2PYvXu3JAi7uLiAMaYAjAGTQBPYLQkAa/0Zef3qRswAAAAASUVORK5CYII=);background-size:9px 9px;image-rendering:pixelated}.colorpicker-header .picked-color{width:240px;display:flex;align-items:center;justify-content:center;line-height:24px;cursor:pointer;color:#fff;flex:1;white-space:nowrap;overflow:hidden}.colorpicker-header .picked-color .picked-color-presentation{white-space:nowrap;margin-left:5px;margin-right:5px}.colorpicker-header .picked-color .codicon{color:inherit;font-size:14px}.colorpicker-header .picked-color.light{color:#000}.colorpicker-header .original-color{width:74px;z-index:inherit;cursor:pointer}.standalone-colorpicker{color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border)}.colorpicker-header.standalone-colorpicker{border-bottom:none}.colorpicker-header .close-button{cursor:pointer;background-color:var(--vscode-editorHoverWidget-background);border-left:1px solid var(--vscode-editorHoverWidget-border)}.colorpicker-header .close-button-inner-div{width:100%;height:100%;text-align:center}.colorpicker-header .close-button-inner-div:hover{background-color:var(--vscode-toolbar-hoverBackground)}.colorpicker-header .close-icon{padding:3px}.colorpicker-body{display:flex;padding:8px;position:relative}.colorpicker-body .saturation-wrap{overflow:hidden;height:150px;position:relative;min-width:220px;flex:1}.colorpicker-body .saturation-box{height:150px;position:absolute}.colorpicker-body .saturation-selection{width:9px;height:9px;margin:-5px 0 0 -5px;border:1px solid #fff;border-radius:100%;box-shadow:0 0 2px rgba(0,0,0,.8);position:absolute}.colorpicker-body .strip{width:25px;height:150px}.colorpicker-body .standalone-strip{width:25px;height:122px}.colorpicker-body .hue-strip{position:relative;margin-left:8px;cursor:grab;background:linear-gradient(180deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.colorpicker-body .opacity-strip{position:relative;margin-left:8px;cursor:grab;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAHUlEQVQYV2PYvXu3JAi7uLiAMaYAjAGTQBPYLQkAa/0Zef3qRswAAAAASUVORK5CYII=);background-size:9px 9px;image-rendering:pixelated}.colorpicker-body .strip.grabbing{cursor:grabbing}.colorpicker-body .slider{position:absolute;top:0;left:-2px;width:calc(100% + 4px);height:4px;box-sizing:border-box;border:1px solid hsla(0,0%,100%,.71);box-shadow:0 0 1px rgba(0,0,0,.85)}.colorpicker-body .strip .overlay{height:150px;pointer-events:none}.colorpicker-body .standalone-strip .standalone-overlay{height:122px;pointer-events:none}.standalone-colorpicker-body{display:block;border:1px solid transparent;border-bottom:1px solid var(--vscode-editorHoverWidget-border);overflow:hidden}.colorpicker-body .insert-button{position:absolute;height:20px;width:58px;padding:0;right:8px;bottom:8px;background:var(--vscode-button-background);color:var(--vscode-button-foreground);border-radius:2px;border:none;cursor:pointer}.colorpicker-body .insert-button:hover{background:var(--vscode-button-hoverBackground)}.monaco-editor.hc-light .dnd-target,.monaco-editor.vs .dnd-target{border-right:2px dotted #000;color:#fff}.monaco-editor.vs-dark .dnd-target{border-right:2px dotted #aeafad;color:#51504f}.monaco-editor.hc-black .dnd-target{border-right:2px dotted #fff;color:#000}.monaco-editor.hc-black.mac.mouse-default .view-lines,.monaco-editor.hc-light.mac.mouse-default .view-lines,.monaco-editor.mouse-default .view-lines,.monaco-editor.vs-dark.mac.mouse-default .view-lines{cursor:default}.monaco-editor.hc-black.mac.mouse-copy .view-lines,.monaco-editor.hc-light.mac.mouse-copy .view-lines,.monaco-editor.mouse-copy .view-lines,.monaco-editor.vs-dark.mac.mouse-copy .view-lines{cursor:copy}.post-edit-widget{box-shadow:0 0 8px 2px var(--vscode-widget-shadow);border:1px solid var(--vscode-widget-border,transparent);border-radius:4px;background-color:var(--vscode-editorWidget-background);overflow:hidden}.post-edit-widget .monaco-button{padding:2px;border:none;border-radius:0}.post-edit-widget .monaco-button:hover{background-color:var(--vscode-button-secondaryHoverBackground)!important}.post-edit-widget .monaco-button .codicon{margin:0}.monaco-editor .findOptionsWidget{background-color:var(--vscode-editorWidget-background);color:var(--vscode-editorWidget-foreground);box-shadow:0 0 8px 2px var(--vscode-widget-shadow);border:2px solid var(--vscode-contrastBorder)}.monaco-editor .find-widget{position:absolute;z-index:35;height:33px;overflow:hidden;line-height:19px;transition:transform .2s linear;padding:0 4px;box-sizing:border-box;transform:translateY(calc(-100% - 10px));border-bottom-left-radius:4px;border-bottom-right-radius:4px}.monaco-workbench.reduce-motion .monaco-editor .find-widget{transition:transform 0ms linear}.monaco-editor .find-widget textarea{margin:0}.monaco-editor .find-widget.hiddenEditor{display:none}.monaco-editor .find-widget.replaceToggled>.replace-part{display:flex}.monaco-editor .find-widget.visible{transform:translateY(0)}.monaco-editor .find-widget .monaco-inputbox.synthetic-focus{outline:1px solid -webkit-focus-ring-color;outline-offset:-1px}.monaco-editor .find-widget .monaco-inputbox .input{background-color:transparent;min-height:0}.monaco-editor .find-widget .monaco-findInput .input{font-size:13px}.monaco-editor .find-widget>.find-part,.monaco-editor .find-widget>.replace-part{margin:3px 25px 0 17px;font-size:12px;display:flex}.monaco-editor .find-widget>.find-part .monaco-inputbox,.monaco-editor .find-widget>.replace-part .monaco-inputbox{min-height:25px}.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.mirror{padding-right:22px}.monaco-editor .find-widget>.find-part .monaco-inputbox>.ibwrapper>.input,.monaco-editor .find-widget>.find-part .monaco-inputbox>.ibwrapper>.mirror,.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.input,.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.mirror{padding-top:2px;padding-bottom:2px}.monaco-editor .find-widget>.find-part .find-actions,.monaco-editor .find-widget>.replace-part .replace-actions{height:25px;display:flex;align-items:center}.monaco-editor .find-widget .monaco-findInput{vertical-align:middle;display:flex;flex:1}.monaco-editor .find-widget .monaco-findInput .monaco-scrollable-element{width:100%}.monaco-editor .find-widget .monaco-findInput .monaco-scrollable-element .scrollbar.vertical{opacity:0}.monaco-editor .find-widget .matchesCount{display:flex;flex:initial;margin:0 0 0 3px;padding:2px 0 0 2px;height:25px;vertical-align:middle;box-sizing:border-box;text-align:center;line-height:23px}.monaco-editor .find-widget .button{width:16px;height:16px;padding:3px;border-radius:5px;flex:initial;margin-left:3px;background-position:50%;background-repeat:no-repeat;cursor:pointer;display:flex;align-items:center;justify-content:center}.monaco-editor .find-widget .codicon-find-selection{width:22px;height:22px;padding:3px;border-radius:5px}.monaco-editor .find-widget .button.left{margin-left:0;margin-right:3px}.monaco-editor .find-widget .button.wide{width:auto;padding:1px 6px;top:-1px}.monaco-editor .find-widget .button.toggle{position:absolute;top:0;left:3px;width:18px;height:100%;border-radius:0;box-sizing:border-box}.monaco-editor .find-widget .button.toggle.disabled{display:none}.monaco-editor .find-widget .disabled{color:var(--vscode-disabledForeground);cursor:default}.monaco-editor .find-widget>.replace-part{display:none}.monaco-editor .find-widget>.replace-part>.monaco-findInput{position:relative;display:flex;vertical-align:middle;flex:auto;flex-grow:0;flex-shrink:0}.monaco-editor .find-widget>.replace-part>.monaco-findInput>.controls{position:absolute;top:3px;right:2px}.monaco-editor .find-widget.reduced-find-widget .matchesCount{display:none}.monaco-editor .find-widget.narrow-find-widget{max-width:257px!important}.monaco-editor .find-widget.collapsed-find-widget{max-width:170px!important}.monaco-editor .find-widget.collapsed-find-widget .button.next,.monaco-editor .find-widget.collapsed-find-widget .button.previous,.monaco-editor .find-widget.collapsed-find-widget .button.replace,.monaco-editor .find-widget.collapsed-find-widget .button.replace-all,.monaco-editor .find-widget.collapsed-find-widget>.find-part .monaco-findInput .controls{display:none}.monaco-editor .findMatch{animation-duration:0;animation-name:inherit!important}.monaco-editor .find-widget .monaco-sash{left:0!important}.monaco-editor.hc-black .find-widget .button:before{position:relative;top:1px;left:2px}.monaco-editor .find-widget>.button.codicon-widget-close{position:absolute;top:5px;right:4px}.monaco-editor .margin-view-overlays .codicon-folding-collapsed,.monaco-editor .margin-view-overlays .codicon-folding-expanded,.monaco-editor .margin-view-overlays .codicon-folding-manual-collapsed,.monaco-editor .margin-view-overlays .codicon-folding-manual-expanded{cursor:pointer;opacity:0;transition:opacity .5s;display:flex;align-items:center;justify-content:center;font-size:140%;margin-left:2px}.monaco-workbench.reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-collapsed,.monaco-workbench.reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-expanded,.monaco-workbench.reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-manual-collapsed,.monaco-workbench.reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-manual-expanded{transition:initial}.monaco-editor .margin-view-overlays .codicon.alwaysShowFoldIcons,.monaco-editor .margin-view-overlays .codicon.codicon-folding-collapsed,.monaco-editor .margin-view-overlays .codicon.codicon-folding-manual-collapsed,.monaco-editor .margin-view-overlays:hover .codicon{opacity:1}.monaco-editor .inline-folded:after{color:grey;margin:.1em .2em 0;content:"\22EF";display:inline;line-height:1em;cursor:pointer}.monaco-editor .folded-background{background-color:var(--vscode-editor-foldBackground)}.monaco-editor .cldr.codicon.codicon-folding-collapsed,.monaco-editor .cldr.codicon.codicon-folding-expanded,.monaco-editor .cldr.codicon.codicon-folding-manual-collapsed,.monaco-editor .cldr.codicon.codicon-folding-manual-expanded{color:var(--vscode-editorGutter-foldingControlForeground)!important}.monaco-editor .peekview-widget .head .peekview-title .severity-icon{display:inline-block;vertical-align:text-top;margin-right:4px}.monaco-editor .marker-widget{text-overflow:ellipsis;white-space:nowrap}.monaco-editor .marker-widget>.stale{opacity:.6;font-style:italic}.monaco-editor .marker-widget .title{display:inline-block;padding-right:5px}.monaco-editor .marker-widget .descriptioncontainer{position:absolute;white-space:pre;user-select:text;-webkit-user-select:text;padding:8px 12px 0 20px}.monaco-editor .marker-widget .descriptioncontainer .message{display:flex;flex-direction:column}.monaco-editor .marker-widget .descriptioncontainer .message .details{padding-left:6px}.monaco-editor .marker-widget .descriptioncontainer .message .source,.monaco-editor .marker-widget .descriptioncontainer .message span.code{opacity:.6}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link{opacity:.6;color:inherit}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link:before{content:"("}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link:after{content:")"}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link>span{text-decoration:underline;border-bottom:1px solid transparent;text-underline-position:under;color:var(--vscode-textLink-activeForeground)}.monaco-editor .marker-widget .descriptioncontainer .filename{cursor:pointer;color:var(--vscode-textLink-activeForeground)}.monaco-editor .goto-definition-link{text-decoration:underline;cursor:pointer;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .zone-widget .zone-widget-container.reference-zone-widget{border-top-width:1px;border-bottom-width:1px}.monaco-editor .reference-zone-widget .inline{display:inline-block;vertical-align:top}.monaco-editor .reference-zone-widget .messages{height:100%;width:100%;text-align:center;padding:3em 0}.monaco-editor .reference-zone-widget .ref-tree{line-height:23px;background-color:var(--vscode-peekViewResult-background);color:var(--vscode-peekViewResult-lineForeground)}.monaco-editor .reference-zone-widget .ref-tree .reference{text-overflow:ellipsis;overflow:hidden}.monaco-editor .reference-zone-widget .ref-tree .reference-file{display:inline-flex;width:100%;height:100%;color:var(--vscode-peekViewResult-fileForeground)}.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .selected .reference-file{color:inherit!important}.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .monaco-list-rows>.monaco-list-row.selected:not(.highlighted){background-color:var(--vscode-peekViewResult-selectionBackground);color:var(--vscode-peekViewResult-selectionForeground)!important}.monaco-editor .reference-zone-widget .ref-tree .reference-file .count{margin-right:12px;margin-left:auto}.monaco-editor .reference-zone-widget .ref-tree .referenceMatch .highlight{background-color:var(--vscode-peekViewResult-matchHighlightBackground)}.monaco-editor .reference-zone-widget .preview .reference-decoration{background-color:var(--vscode-peekViewEditor-matchHighlightBackground);border:2px solid var(--vscode-peekViewEditor-matchHighlightBorder);box-sizing:border-box}.monaco-editor .reference-zone-widget .preview .monaco-editor .inputarea.ime-input,.monaco-editor .reference-zone-widget .preview .monaco-editor .monaco-editor-background{background-color:var(--vscode-peekViewEditor-background)}.monaco-editor .reference-zone-widget .preview .monaco-editor .margin{background-color:var(--vscode-peekViewEditorGutter-background)}.monaco-editor.hc-black .reference-zone-widget .ref-tree .reference-file,.monaco-editor.hc-light .reference-zone-widget .ref-tree .reference-file{font-weight:700}.monaco-editor.hc-black .reference-zone-widget .ref-tree .referenceMatch .highlight,.monaco-editor.hc-light .reference-zone-widget .ref-tree .referenceMatch .highlight{border:1px dotted var(--vscode-contrastActiveBorder,transparent);box-sizing:border-box}.monaco-editor .hoverHighlight{background-color:var(--vscode-editor-hoverHighlightBackground)}.monaco-editor .monaco-hover{color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border);border-radius:3px}.monaco-editor .monaco-hover a{color:var(--vscode-textLink-foreground)}.monaco-editor .monaco-hover a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor .monaco-hover .hover-row .actions{background-color:var(--vscode-editorHoverWidget-statusBarBackground)}.monaco-editor .monaco-hover code{background-color:var(--vscode-textCodeBlock-background)}.monaco-editor.vs .valueSetReplacement{outline:solid 2px var(--vscode-editorBracketMatch-border)}.monaco-editor .suggest-preview-additional-widget{white-space:nowrap}.monaco-editor .suggest-preview-additional-widget .content-spacer{color:transparent;white-space:pre}.monaco-editor .suggest-preview-additional-widget .button{display:inline-block;cursor:pointer;text-decoration:underline;text-underline-position:under}.monaco-editor .ghost-text-hidden{opacity:0;font-size:0}.monaco-editor .ghost-text-decoration,.monaco-editor .suggest-preview-text .ghost-text{font-style:italic}.monaco-editor .inline-completion-text-to-replace{text-decoration:underline;text-underline-position:under}.monaco-editor .ghost-text-decoration,.monaco-editor .ghost-text-decoration-preview,.monaco-editor .suggest-preview-text .ghost-text{color:var(--vscode-editorGhostText-foreground)!important;background-color:var(--vscode-editorGhostText-background);border:1px solid var(--vscode-editorGhostText-border)}.monaco-editor .inlineSuggestionsHints.withBorder{z-index:39;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border)}.monaco-editor .inlineSuggestionsHints a,.monaco-editor .inlineSuggestionsHints a:hover{color:var(--vscode-foreground)}.monaco-editor .inlineSuggestionsHints .keybinding{display:flex;margin-left:4px;opacity:.6}.monaco-editor .inlineSuggestionsHints .keybinding .monaco-keybinding-key{font-size:8px;padding:2px 3px}.monaco-editor .inlineSuggestionsHints .availableSuggestionCount a{display:flex;min-width:19px;justify-content:center}.monaco-editor .inlineSuggestionStatusBarItemLabel{margin-right:2px}.inline-editor-progress-decoration{display:inline-block;width:1em;height:1em}.inline-progress-widget{display:flex!important;justify-content:center;align-items:center}.inline-progress-widget .icon{font-size:80%!important}.inline-progress-widget:hover .icon{font-size:90%!important;animation:none}.inline-progress-widget:hover .icon:before{content:"\ea76"}.monaco-editor .linked-editing-decoration{background-color:var(--vscode-editor-linkedEditingBackground);min-width:1px}.monaco-editor .detected-link,.monaco-editor .detected-link-active{text-decoration:underline;text-underline-position:under}.monaco-editor .detected-link-active{cursor:pointer;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .monaco-editor-overlaymessage{padding-bottom:8px;z-index:10000}.monaco-editor .monaco-editor-overlaymessage.below{padding-bottom:0;padding-top:8px;z-index:10000}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.monaco-editor .monaco-editor-overlaymessage.fadeIn{animation:fadeIn .15s ease-out}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.monaco-editor .monaco-editor-overlaymessage.fadeOut{animation:fadeOut .1s ease-out}.monaco-editor .monaco-editor-overlaymessage .message{padding:2px 4px;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-inputValidation-infoBorder);border-radius:3px}.monaco-editor .monaco-editor-overlaymessage .message p{margin-block:0}.monaco-editor .monaco-editor-overlaymessage .message a{color:var(--vscode-textLink-foreground)}.monaco-editor .monaco-editor-overlaymessage .message a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor.hc-black .monaco-editor-overlaymessage .message,.monaco-editor.hc-light .monaco-editor-overlaymessage .message{border-width:2px}.monaco-editor .monaco-editor-overlaymessage .anchor{width:0!important;height:0!important;z-index:1000;border:8px solid transparent;position:absolute;left:2px}.monaco-editor .monaco-editor-overlaymessage .anchor.top{border-bottom-color:var(--vscode-inputValidation-infoBorder)}.monaco-editor .monaco-editor-overlaymessage .anchor.below{border-top-color:var(--vscode-inputValidation-infoBorder)}.monaco-editor .monaco-editor-overlaymessage.below .anchor.below,.monaco-editor .monaco-editor-overlaymessage:not(.below) .anchor.top{display:none}.monaco-editor .monaco-editor-overlaymessage.below .anchor.top{display:inherit;top:-8px}.monaco-editor .parameter-hints-widget{z-index:39;display:flex;flex-direction:column;line-height:1.5em;cursor:default;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border)}.hc-black .monaco-editor .parameter-hints-widget,.hc-light .monaco-editor .parameter-hints-widget{border-width:2px}.monaco-editor .parameter-hints-widget>.phwrapper{max-width:440px;display:flex;flex-direction:row}.monaco-editor .parameter-hints-widget.multiple{min-height:3.3em;padding:0}.monaco-editor .parameter-hints-widget.multiple .body:before{content:"";display:block;height:100%;position:absolute;opacity:.5;border-left:1px solid var(--vscode-editorHoverWidget-border)}.monaco-editor .parameter-hints-widget p,.monaco-editor .parameter-hints-widget ul{margin:8px 0}.monaco-editor .parameter-hints-widget .body,.monaco-editor .parameter-hints-widget .monaco-scrollable-element{display:flex;flex:1;flex-direction:column;min-height:100%}.monaco-editor .parameter-hints-widget .signature{padding:4px 5px;position:relative}.monaco-editor .parameter-hints-widget .signature.has-docs:after{content:"";display:block;position:absolute;left:0;width:100%;padding-top:4px;opacity:.5;border-bottom:1px solid var(--vscode-editorHoverWidget-border)}.monaco-editor .parameter-hints-widget .docs{padding:0 10px 0 5px;white-space:pre-wrap}.monaco-editor .parameter-hints-widget .docs.empty{display:none}.monaco-editor .parameter-hints-widget .docs a{color:var(--vscode-textLink-foreground)}.monaco-editor .parameter-hints-widget .docs a:hover{color:var(--vscode-textLink-activeForeground);cursor:pointer}.monaco-editor .parameter-hints-widget .docs .markdown-docs{white-space:normal}.monaco-editor .parameter-hints-widget .docs code{font-family:var(--monaco-monospace-font);border-radius:3px;padding:0 .4em;background-color:var(--vscode-textCodeBlock-background)}.monaco-editor .parameter-hints-widget .docs .code,.monaco-editor .parameter-hints-widget .docs .monaco-tokenized-source{white-space:pre-wrap}.monaco-editor .parameter-hints-widget .controls{display:none;flex-direction:column;align-items:center;min-width:22px;justify-content:flex-end}.monaco-editor .parameter-hints-widget.multiple .controls{display:flex;padding:0 2px}.monaco-editor .parameter-hints-widget.multiple .button{width:16px;height:16px;background-repeat:no-repeat;cursor:pointer}.monaco-editor .parameter-hints-widget .button.previous{bottom:24px}.monaco-editor .parameter-hints-widget .overloads{text-align:center;height:12px;line-height:12px;font-family:var(--monaco-monospace-font)}.monaco-editor .parameter-hints-widget .signature .parameter.active{color:var(--vscode-editorHoverWidget-highlightForeground);font-weight:700}.monaco-editor .parameter-hints-widget .documentation-parameter>.parameter{font-weight:700;margin-right:.5em}.monaco-editor .peekview-widget .head{box-sizing:border-box;display:flex;justify-content:space-between;flex-wrap:nowrap}.monaco-editor .peekview-widget .head .peekview-title{display:flex;align-items:baseline;font-size:13px;margin-left:20px;min-width:0;text-overflow:ellipsis;overflow:hidden}.monaco-editor .peekview-widget .head .peekview-title.clickable{cursor:pointer}.monaco-editor .peekview-widget .head .peekview-title .dirname:not(:empty){font-size:.9em;margin-left:.5em}.monaco-editor .peekview-widget .head .peekview-title .dirname,.monaco-editor .peekview-widget .head .peekview-title .filename,.monaco-editor .peekview-widget .head .peekview-title .meta{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.monaco-editor .peekview-widget .head .peekview-title .meta:not(:empty):before{content:"-";padding:0 .3em}.monaco-editor .peekview-widget .head .peekview-actions{flex:1;text-align:right;padding-right:2px}.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar{display:inline-block}.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar,.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar>.actions-container{height:100%}.monaco-editor .peekview-widget>.body{border-top:1px solid;position:relative}.monaco-editor .peekview-widget .head .peekview-title .codicon{margin-right:4px;align-self:center}.monaco-editor .peekview-widget .monaco-list .monaco-list-row.focused .codicon{color:inherit!important}.monaco-editor .rename-box{z-index:100;color:inherit;border-radius:4px}.monaco-editor .rename-box.preview{padding:4px 4px 0}.monaco-editor .rename-box .rename-input{padding:3px;border-radius:2px}.monaco-editor .rename-box .rename-label{display:none;opacity:.8}.monaco-editor .rename-box.preview .rename-label{display:inherit}.monaco-editor .snippet-placeholder{min-width:2px;outline-style:solid;outline-width:1px;background-color:var(--vscode-editor-snippetTabstopHighlightBackground,transparent);outline-color:var(--vscode-editor-snippetTabstopHighlightBorder,transparent)}.monaco-editor .finish-snippet-placeholder{outline-style:solid;outline-width:1px;background-color:var(--vscode-editor-snippetFinalTabstopHighlightBackground,transparent);outline-color:var(--vscode-editor-snippetFinalTabstopHighlightBorder,transparent)}.monaco-editor .sticky-widget{overflow:hidden}.monaco-editor .sticky-widget-line-numbers{float:left;background-color:inherit}.monaco-editor .sticky-widget-lines-scrollable{display:inline-block;position:absolute;overflow:hidden;width:var(--vscode-editorStickyScroll-scrollableWidth);background-color:inherit}.monaco-editor .sticky-widget-lines{position:absolute;background-color:inherit}.monaco-editor .sticky-line-content,.monaco-editor .sticky-line-number{color:var(--vscode-editorLineNumber-foreground);white-space:nowrap;display:inline-block;position:absolute;background-color:inherit}.monaco-editor .sticky-line-number .codicon-folding-collapsed,.monaco-editor .sticky-line-number .codicon-folding-expanded{float:right;transition:var(--vscode-editorStickyScroll-foldingOpacityTransition)}.monaco-editor .sticky-line-content{width:var(--vscode-editorStickyScroll-scrollableWidth);background-color:inherit;white-space:nowrap}.monaco-editor .sticky-line-number-inner{display:inline-block;text-align:right}.monaco-editor .sticky-widget{border-bottom:1px solid var(--vscode-editorStickyScroll-border)}.monaco-editor .sticky-line-content:hover{background-color:var(--vscode-editorStickyScrollHover-background);cursor:pointer}.monaco-editor .sticky-widget{width:100%;box-shadow:var(--vscode-editorStickyScroll-shadow) 0 3px 2px -2px;z-index:4;background-color:var(--vscode-editorStickyScroll-background)}.monaco-editor .sticky-widget.peek{background-color:var(--vscode-peekViewEditorStickyScroll-background)}.monaco-editor .suggest-widget{width:430px;z-index:40;display:flex;flex-direction:column;border-radius:3px}.monaco-editor .suggest-widget.message{flex-direction:row;align-items:center}.monaco-editor .suggest-details,.monaco-editor .suggest-widget{flex:0 1 auto;width:100%;border:1px solid var(--vscode-editorSuggestWidget-border);background-color:var(--vscode-editorSuggestWidget-background)}.monaco-editor.hc-black .suggest-details,.monaco-editor.hc-black .suggest-widget,.monaco-editor.hc-light .suggest-details,.monaco-editor.hc-light .suggest-widget{border-width:2px}.monaco-editor .suggest-widget .suggest-status-bar{box-sizing:border-box;display:none;flex-flow:row nowrap;justify-content:space-between;width:100%;font-size:80%;padding:0 4px;border-top:1px solid var(--vscode-editorSuggestWidget-border);overflow:hidden}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar{display:flex}.monaco-editor .suggest-widget .suggest-status-bar .left{padding-right:8px}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-label{color:var(--vscode-editorSuggestWidgetStatus-foreground)}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-item:not(:last-of-type) .action-label{margin-right:0}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-item:not(:last-of-type) .action-label:after{content:", ";margin-right:.3em}.monaco-editor .suggest-widget.with-status-bar .monaco-list .monaco-list-row.focused.string-label>.contents>.main>.right>.readMore,.monaco-editor .suggest-widget.with-status-bar .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget.with-status-bar:not(.docs-side) .monaco-list .monaco-list-row:hover>.contents>.main>.right.can-expand-details>.details-label{width:100%}.monaco-editor .suggest-widget>.message{padding-left:22px}.monaco-editor .suggest-widget>.tree{height:100%;width:100%}.monaco-editor .suggest-widget .monaco-list{user-select:none;-webkit-user-select:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row{display:flex;-mox-box-sizing:border-box;box-sizing:border-box;padding-right:10px;background-repeat:no-repeat;background-position:2px 2px;white-space:nowrap;cursor:pointer;touch-action:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused{color:var(--vscode-editorSuggestWidget-selectedForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused .codicon{color:var(--vscode-editorSuggestWidget-selectedIconForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents{flex:1;height:100%;overflow:hidden;padding-left:2px}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main{display:flex;overflow:hidden;text-overflow:ellipsis;white-space:pre;justify-content:space-between}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right{display:flex}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.focused)>.contents>.main .monaco-icon-label{color:var(--vscode-editorSuggestWidget-foreground)}.monaco-editor .suggest-widget:not(.frozen) .monaco-highlighted-label .highlight{font-weight:700}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main .monaco-highlighted-label .highlight{color:var(--vscode-editorSuggestWidget-highlightForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused>.contents>.main .monaco-highlighted-label .highlight{color:var(--vscode-editorSuggestWidget-focusHighlightForeground)}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore:before{color:inherit;opacity:1;font-size:14px;cursor:pointer}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close{position:absolute;top:6px;right:2px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close:hover,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore:hover{opacity:1}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{opacity:.7}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.signature-label{overflow:hidden;text-overflow:ellipsis;opacity:.6}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.qualifier-label{margin-left:12px;opacity:.4;font-size:85%;line-height:normal;text-overflow:ellipsis;overflow:hidden;align-self:center}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{font-size:85%;margin-left:1.1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label>.monaco-tokenized-source{display:inline}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{display:none}.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row.focused:not(.string-label)>.contents>.main>.right>.details-label,.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.string-label)>.contents>.main>.right>.details-label,.monaco-editor .suggest-widget:not(.shows-details) .monaco-list .monaco-list-row.focused>.contents>.main>.right>.details-label{display:inline}.monaco-editor .suggest-widget:not(.docs-side) .monaco-list .monaco-list-row.focused:hover>.contents>.main>.right.can-expand-details>.details-label{width:calc(100% - 26px)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left{flex-shrink:1;flex-grow:1;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.monaco-icon-label{flex-shrink:0}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.string-label)>.contents>.main>.left>.monaco-icon-label{max-width:100%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.string-label>.contents>.main>.left>.monaco-icon-label{flex-shrink:1}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right{overflow:hidden;flex-shrink:4;max-width:70%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:inline-block;position:absolute;right:10px;width:18px;height:18px;visibility:hidden}.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:none!important}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.string-label>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused.string-label>.contents>.main>.right>.readMore{display:inline-block}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused:hover>.contents>.main>.right>.readMore{visibility:visible}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label.deprecated{opacity:.66;text-decoration:unset}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label.deprecated>.monaco-icon-label-container>.monaco-icon-name-container{text-decoration:line-through}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label:before{height:100%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon{display:block;height:16px;width:16px;margin-left:2px;background-repeat:no-repeat;background-size:80%;background-position:50%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.hide{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon{display:flex;align-items:center;margin-right:4px}.monaco-editor .suggest-widget.no-icons .monaco-list .monaco-list-row .icon,.monaco-editor .suggest-widget.no-icons .monaco-list .monaco-list-row .suggest-icon:before{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.customcolor .colorspan{margin:0 0 0 .3em;border:.1em solid #000;width:.7em;height:.7em;display:inline-block}.monaco-editor .suggest-details-container{z-index:41}.monaco-editor .suggest-details{display:flex;flex-direction:column;cursor:default;color:var(--vscode-editorSuggestWidget-foreground)}.monaco-editor .suggest-details.focused{border-color:var(--vscode-focusBorder)}.monaco-editor .suggest-details a{color:var(--vscode-textLink-foreground)}.monaco-editor .suggest-details a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor .suggest-details code{background-color:var(--vscode-textCodeBlock-background)}.monaco-editor .suggest-details.no-docs{display:none}.monaco-editor .suggest-details>.monaco-scrollable-element{flex:1}.monaco-editor .suggest-details>.monaco-scrollable-element>.body{box-sizing:border-box;height:100%;width:100%}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.type{flex:2;overflow:hidden;text-overflow:ellipsis;opacity:.7;white-space:pre;margin:0 24px 0 0;padding:4px 0 12px 5px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.type.auto-wrap{white-space:normal;word-break:break-all}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs{margin:0;padding:4px 5px;white-space:pre-wrap}.monaco-editor .suggest-details.no-type>.monaco-scrollable-element>.body>.docs{margin-right:24px;overflow:hidden}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs{padding:0;white-space:normal;min-height:calc(1rem + 8px)}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div,.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>span:not(:empty){padding:4px 5px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div>p:first-child{margin-top:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div>p:last-child{margin-bottom:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs .monaco-tokenized-source{white-space:pre}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs .code{white-space:pre-wrap;word-wrap:break-word}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs .codicon{vertical-align:sub}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>p:empty{display:none}.monaco-editor .suggest-details code{border-radius:3px;padding:0 .4em}.monaco-editor .suggest-details ol,.monaco-editor .suggest-details ul{padding-left:20px}.monaco-editor .suggest-details p code{font-family:var(--monaco-monospace-font)}.monaco-editor .codicon.codicon-symbol-array,.monaco-workbench .codicon.codicon-symbol-array{color:var(--vscode-symbolIcon-arrayForeground)}.monaco-editor .codicon.codicon-symbol-boolean,.monaco-workbench .codicon.codicon-symbol-boolean{color:var(--vscode-symbolIcon-booleanForeground)}.monaco-editor .codicon.codicon-symbol-class,.monaco-workbench .codicon.codicon-symbol-class{color:var(--vscode-symbolIcon-classForeground)}.monaco-editor .codicon.codicon-symbol-method,.monaco-workbench .codicon.codicon-symbol-method{color:var(--vscode-symbolIcon-methodForeground)}.monaco-editor .codicon.codicon-symbol-color,.monaco-workbench .codicon.codicon-symbol-color{color:var(--vscode-symbolIcon-colorForeground)}.monaco-editor .codicon.codicon-symbol-constant,.monaco-workbench .codicon.codicon-symbol-constant{color:var(--vscode-symbolIcon-constantForeground)}.monaco-editor .codicon.codicon-symbol-constructor,.monaco-workbench .codicon.codicon-symbol-constructor{color:var(--vscode-symbolIcon-constructorForeground)}.monaco-editor .codicon.codicon-symbol-enum,.monaco-editor .codicon.codicon-symbol-value,.monaco-workbench .codicon.codicon-symbol-enum,.monaco-workbench .codicon.codicon-symbol-value{color:var(--vscode-symbolIcon-enumeratorForeground)}.monaco-editor .codicon.codicon-symbol-enum-member,.monaco-workbench .codicon.codicon-symbol-enum-member{color:var(--vscode-symbolIcon-enumeratorMemberForeground)}.monaco-editor .codicon.codicon-symbol-event,.monaco-workbench .codicon.codicon-symbol-event{color:var(--vscode-symbolIcon-eventForeground)}.monaco-editor .codicon.codicon-symbol-field,.monaco-workbench .codicon.codicon-symbol-field{color:var(--vscode-symbolIcon-fieldForeground)}.monaco-editor .codicon.codicon-symbol-file,.monaco-workbench .codicon.codicon-symbol-file{color:var(--vscode-symbolIcon-fileForeground)}.monaco-editor .codicon.codicon-symbol-folder,.monaco-workbench .codicon.codicon-symbol-folder{color:var(--vscode-symbolIcon-folderForeground)}.monaco-editor .codicon.codicon-symbol-function,.monaco-workbench .codicon.codicon-symbol-function{color:var(--vscode-symbolIcon-functionForeground)}.monaco-editor .codicon.codicon-symbol-interface,.monaco-workbench .codicon.codicon-symbol-interface{color:var(--vscode-symbolIcon-interfaceForeground)}.monaco-editor .codicon.codicon-symbol-key,.monaco-workbench .codicon.codicon-symbol-key{color:var(--vscode-symbolIcon-keyForeground)}.monaco-editor .codicon.codicon-symbol-keyword,.monaco-workbench .codicon.codicon-symbol-keyword{color:var(--vscode-symbolIcon-keywordForeground)}.monaco-editor .codicon.codicon-symbol-module,.monaco-workbench .codicon.codicon-symbol-module{color:var(--vscode-symbolIcon-moduleForeground)}.monaco-editor .codicon.codicon-symbol-namespace,.monaco-workbench .codicon.codicon-symbol-namespace{color:var(--vscode-symbolIcon-namespaceForeground)}.monaco-editor .codicon.codicon-symbol-null,.monaco-workbench .codicon.codicon-symbol-null{color:var(--vscode-symbolIcon-nullForeground)}.monaco-editor .codicon.codicon-symbol-number,.monaco-workbench .codicon.codicon-symbol-number{color:var(--vscode-symbolIcon-numberForeground)}.monaco-editor .codicon.codicon-symbol-object,.monaco-workbench .codicon.codicon-symbol-object{color:var(--vscode-symbolIcon-objectForeground)}.monaco-editor .codicon.codicon-symbol-operator,.monaco-workbench .codicon.codicon-symbol-operator{color:var(--vscode-symbolIcon-operatorForeground)}.monaco-editor .codicon.codicon-symbol-package,.monaco-workbench .codicon.codicon-symbol-package{color:var(--vscode-symbolIcon-packageForeground)}.monaco-editor .codicon.codicon-symbol-property,.monaco-workbench .codicon.codicon-symbol-property{color:var(--vscode-symbolIcon-propertyForeground)}.monaco-editor .codicon.codicon-symbol-reference,.monaco-workbench .codicon.codicon-symbol-reference{color:var(--vscode-symbolIcon-referenceForeground)}.monaco-editor .codicon.codicon-symbol-snippet,.monaco-workbench .codicon.codicon-symbol-snippet{color:var(--vscode-symbolIcon-snippetForeground)}.monaco-editor .codicon.codicon-symbol-string,.monaco-workbench .codicon.codicon-symbol-string{color:var(--vscode-symbolIcon-stringForeground)}.monaco-editor .codicon.codicon-symbol-struct,.monaco-workbench .codicon.codicon-symbol-struct{color:var(--vscode-symbolIcon-structForeground)}.monaco-editor .codicon.codicon-symbol-text,.monaco-workbench .codicon.codicon-symbol-text{color:var(--vscode-symbolIcon-textForeground)}.monaco-editor .codicon.codicon-symbol-type-parameter,.monaco-workbench .codicon.codicon-symbol-type-parameter{color:var(--vscode-symbolIcon-typeParameterForeground)}.monaco-editor .codicon.codicon-symbol-unit,.monaco-workbench .codicon.codicon-symbol-unit{color:var(--vscode-symbolIcon-unitForeground)}.monaco-editor .codicon.codicon-symbol-variable,.monaco-workbench .codicon.codicon-symbol-variable{color:var(--vscode-symbolIcon-variableForeground)}.editor-banner{box-sizing:border-box;cursor:default;width:100%;font-size:12px;display:flex;overflow:visible;height:26px;background:var(--vscode-banner-background)}.editor-banner .icon-container{display:flex;flex-shrink:0;align-items:center;padding:0 6px 0 10px}.editor-banner .icon-container.custom-icon{background-repeat:no-repeat;background-position:50%;background-size:16px;width:16px;padding:0;margin:0 6px 0 10px}.editor-banner .message-container{display:flex;align-items:center;line-height:26px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.editor-banner .message-container p{margin-block-start:0;margin-block-end:0}.editor-banner .message-actions-container{flex-grow:1;flex-shrink:0;line-height:26px;margin:0 4px}.editor-banner .message-actions-container a.monaco-button{width:inherit;margin:2px 8px;padding:0 12px}.editor-banner .message-actions-container a{padding:3px;margin-left:12px;text-decoration:underline}.editor-banner .action-container{padding:0 10px 0 6px}.editor-banner{background-color:var(--vscode-banner-background)}.editor-banner,.editor-banner .action-container .codicon,.editor-banner .message-actions-container .monaco-link{color:var(--vscode-banner-foreground)}.editor-banner .icon-container .codicon{color:var(--vscode-banner-iconForeground)}.monaco-editor .unicode-highlight{border:1px solid var(--vscode-editorUnicodeHighlight-border);background-color:var(--vscode-editorUnicodeHighlight-background);box-sizing:border-box}.monaco-editor .focused .selectionHighlight{background-color:var(--vscode-editor-selectionHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-selectionHighlightBorder)}.monaco-editor.hc-black .focused .selectionHighlight,.monaco-editor.hc-light .focused .selectionHighlight{border-style:dotted}.monaco-editor .wordHighlight{background-color:var(--vscode-editor-wordHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-wordHighlightBorder)}.monaco-editor.hc-black .wordHighlight,.monaco-editor.hc-light .wordHighlight{border-style:dotted}.monaco-editor .wordHighlightStrong{background-color:var(--vscode-editor-wordHighlightStrongBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-wordHighlightStrongBorder)}.monaco-editor.hc-black .wordHighlightStrong,.monaco-editor.hc-light .wordHighlightStrong{border-style:dotted}.monaco-editor .wordHighlightText{background-color:var(--vscode-editor-wordHighlightTextBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-wordHighlightTextBorder)}.monaco-editor.hc-black .wordHighlightText,.monaco-editor.hc-light .wordHighlightText{border-style:dotted}.monaco-editor .zone-widget{position:absolute;z-index:10}.monaco-editor .zone-widget .zone-widget-container{border-top-style:solid;border-bottom-style:solid;border-top-width:0;border-bottom-width:0;position:relative}.monaco-editor .iPadShowKeyboard{width:58px;min-width:0;height:36px;min-height:0;margin:0;padding:0;position:absolute;resize:none;overflow:hidden;background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00OC4wMzYgNC4wMUg0LjAwOFYzMi4wM2g0NC4wMjhWNC4wMXpNNC4wMDguMDA4QTQuMDAzIDQuMDAzIDAgMDAuMDA1IDQuMDFWMzIuMDNhNC4wMDMgNC4wMDMgMCAwMDQuMDAzIDQuMDAyaDQ0LjAyOGE0LjAwMyA0LjAwMyAwIDAwNC4wMDMtNC4wMDJWNC4wMUE0LjAwMyA0LjAwMyAwIDAwNDguMDM2LjAwOEg0LjAwOHpNOC4wMSA4LjAxM2g0LjAwM3Y0LjAwM0g4LjAxVjguMDEzem0xMi4wMDggMGgtNC4wMDJ2NC4wMDNoNC4wMDJWOC4wMTN6bTQuMDAzIDBoNC4wMDJ2NC4wMDNoLTQuMDAyVjguMDEzem0xMi4wMDggMGgtNC4wMDN2NC4wMDNoNC4wMDNWOC4wMTN6bTQuMDAyIDBoNC4wMDN2NC4wMDNINDAuMDNWOC4wMTN6bS0yNC4wMTUgOC4wMDVIOC4wMXY0LjAwM2g4LjAwNnYtNC4wMDN6bTQuMDAyIDBoNC4wMDN2NC4wMDNoLTQuMDAzdi00LjAwM3ptMTIuMDA4IDBoLTQuMDAzdjQuMDAzaDQuMDAzdi00LjAwM3ptMTIuMDA4IDB2NC4wMDNoLTguMDA1di00LjAwM2g4LjAwNXptLTMyLjAyMSA4LjAwNUg4LjAxdjQuMDAzaDQuMDAzdi00LjAwM3ptNC4wMDMgMGgyMC4wMTN2NC4wMDNIMTYuMDE2di00LjAwM3ptMjguMDE4IDBINDAuMDN2NC4wMDNoNC4wMDN2LTQuMDAzeiIgZmlsbD0iIzQyNDI0MiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImNsaXAwIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMCAwaDUzdjM2SDB6Ii8+PC9jbGlwUGF0aD48L2RlZnM+PC9zdmc+) 50% no-repeat;border:4px solid #f6f6f6;border-radius:4px}.monaco-editor.vs-dark .iPadShowKeyboard{background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00OC4wMzYgNC4wMUg0LjAwOFYzMi4wM2g0NC4wMjhWNC4wMXpNNC4wMDguMDA4QTQuMDAzIDQuMDAzIDAgMDAuMDA1IDQuMDFWMzIuMDNhNC4wMDMgNC4wMDMgMCAwMDQuMDAzIDQuMDAyaDQ0LjAyOGE0LjAwMyA0LjAwMyAwIDAwNC4wMDMtNC4wMDJWNC4wMUE0LjAwMyA0LjAwMyAwIDAwNDguMDM2LjAwOEg0LjAwOHpNOC4wMSA4LjAxM2g0LjAwM3Y0LjAwM0g4LjAxVjguMDEzem0xMi4wMDggMGgtNC4wMDJ2NC4wMDNoNC4wMDJWOC4wMTN6bTQuMDAzIDBoNC4wMDJ2NC4wMDNoLTQuMDAyVjguMDEzem0xMi4wMDggMGgtNC4wMDN2NC4wMDNoNC4wMDNWOC4wMTN6bTQuMDAyIDBoNC4wMDN2NC4wMDNINDAuMDNWOC4wMTN6bS0yNC4wMTUgOC4wMDVIOC4wMXY0LjAwM2g4LjAwNnYtNC4wMDN6bTQuMDAyIDBoNC4wMDN2NC4wMDNoLTQuMDAzdi00LjAwM3ptMTIuMDA4IDBoLTQuMDAzdjQuMDAzaDQuMDAzdi00LjAwM3ptMTIuMDA4IDB2NC4wMDNoLTguMDA1di00LjAwM2g4LjAwNXptLTMyLjAyMSA4LjAwNUg4LjAxdjQuMDAzaDQuMDAzdi00LjAwM3ptNC4wMDMgMGgyMC4wMTN2NC4wMDNIMTYuMDE2di00LjAwM3ptMjguMDE4IDBINDAuMDN2NC4wMDNoNC4wMDN2LTQuMDAzeiIgZmlsbD0iI0M1QzVDNSIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImNsaXAwIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMCAwaDUzdjM2SDB6Ii8+PC9jbGlwUGF0aD48L2RlZnM+PC9zdmc+) 50% no-repeat;border:4px solid #252526}.monaco-editor .tokens-inspect-widget{z-index:50;user-select:text;-webkit-user-select:text;padding:10px;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border)}.monaco-editor.hc-black .tokens-inspect-widget,.monaco-editor.hc-light .tokens-inspect-widget{border-width:2px}.monaco-editor .tokens-inspect-widget .tokens-inspect-separator{height:1px;border:0;background-color:var(--vscode-editorHoverWidget-border)}.monaco-editor .tokens-inspect-widget .tm-token{font-family:var(--monaco-monospace-font)}.monaco-editor .tokens-inspect-widget .tm-token-length{font-weight:400;font-size:60%;float:right}.monaco-editor .tokens-inspect-widget .tm-metadata-table{width:100%}.monaco-editor .tokens-inspect-widget .tm-metadata-value{font-family:var(--monaco-monospace-font);text-align:right}.monaco-editor .tokens-inspect-widget .tm-token-type{font-family:var(--monaco-monospace-font)}.quick-input-widget{font-size:13px}.quick-input-widget .monaco-highlighted-label .highlight{color:#0066bf}.vs .quick-input-widget .monaco-list-row.focused .monaco-highlighted-label .highlight{color:#9dddff}.vs-dark .quick-input-widget .monaco-highlighted-label .highlight{color:#0097fb}.hc-black .quick-input-widget .monaco-highlighted-label .highlight{color:#f38518}.hc-light .quick-input-widget .monaco-highlighted-label .highlight{color:#0f4a85}.monaco-keybinding>.monaco-keybinding-key{background-color:hsla(0,0%,86.7%,.4);border:1px solid hsla(0,0%,80%,.4);border-bottom-color:hsla(0,0%,73.3%,.4);box-shadow:inset 0 -1px 0 hsla(0,0%,73.3%,.4);color:#555}.hc-black .monaco-keybinding>.monaco-keybinding-key{background-color:transparent;border:1px solid #6fc3df;box-shadow:none;color:#fff}.hc-light .monaco-keybinding>.monaco-keybinding-key{background-color:transparent;border:1px solid #0f4a85;box-shadow:none;color:#292929}.vs-dark .monaco-keybinding>.monaco-keybinding-key{background-color:hsla(0,0%,50.2%,.17);border:1px solid rgba(51,51,51,.6);border-bottom-color:rgba(68,68,68,.6);box-shadow:inset 0 -1px 0 rgba(68,68,68,.6);color:#ccc}.monaco-editor{font-family:-apple-system,BlinkMacSystemFont,Segoe WPC,Segoe UI,HelveticaNeue-Light,system-ui,Ubuntu,Droid Sans,sans-serif;--monaco-monospace-font:"SF Mono",Monaco,Menlo,Consolas,"Ubuntu Mono","Liberation Mono","DejaVu Sans Mono","Courier New",monospace}.monaco-editor.hc-black .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.hc-light .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.vs-dark .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-menu .monaco-action-bar.vertical .action-item .action-menu-item:focus .action-label{stroke-width:1.2px}.monaco-hover p{margin:0}.monaco-aria-container{position:absolute!important;top:0;height:1px;width:1px;margin:-1px;overflow:hidden;padding:0;clip:rect(1px,1px,1px,1px);clip-path:inset(50%)}.monaco-diff-editor .synthetic-focus,.monaco-diff-editor [tabindex="0"]:focus,.monaco-diff-editor [tabindex="-1"]:focus,.monaco-diff-editor button:focus,.monaco-diff-editor input[type=button]:focus,.monaco-diff-editor input[type=checkbox]:focus,.monaco-diff-editor input[type=search]:focus,.monaco-diff-editor input[type=text]:focus,.monaco-diff-editor select:focus,.monaco-diff-editor textarea:focus,.monaco-editor{outline-width:1px;outline-style:solid;outline-offset:-1px;outline-color:var(--vscode-focusBorder);opacity:1}.action-widget{font-size:13px;border-radius:0;min-width:160px;max-width:80vw;z-index:40;display:block;width:100%;border:1px solid var(--vscode-editorWidget-border)!important;border-radius:2px;background-color:var(--vscode-editorWidget-background);color:var(--vscode-editorWidget-foreground)}.context-view-block{z-index:-1}.context-view-block,.context-view-pointerBlock{position:fixed;cursor:auto;left:0;top:0;width:100%;height:100%}.context-view-pointerBlock{z-index:2}.action-widget .monaco-list{user-select:none;-webkit-user-select:none;border:0!important}.action-widget .monaco-list:focus:before{outline:0!important}.action-widget .monaco-list .monaco-scrollable-element{overflow:visible}.action-widget .monaco-list .monaco-list-row{padding:0 10px;white-space:nowrap;cursor:pointer;touch-action:none;width:100%}.action-widget .monaco-list .monaco-list-row.action.focused:not(.option-disabled){background-color:var(--vscode-quickInputList-focusBackground)!important;color:var(--vscode-quickInputList-focusForeground);outline:1px solid var(--vscode-menu-selectionBorder,transparent);outline-offset:-1px}.action-widget .monaco-list-row.group-header{color:var(--vscode-descriptionForeground)!important;font-weight:600}.action-widget .monaco-list .group-header,.action-widget .monaco-list .option-disabled,.action-widget .monaco-list .option-disabled .focused,.action-widget .monaco-list .option-disabled .focused:before,.action-widget .monaco-list .option-disabled:before{cursor:default!important;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;background-color:transparent!important;outline:0 solid!important}.action-widget .monaco-list-row.action{display:flex;gap:6px;align-items:center}.action-widget .monaco-list-row.action.option-disabled,.action-widget .monaco-list-row.action.option-disabled .codicon,.action-widget .monaco-list:focus .monaco-list-row.focused.action.option-disabled,.action-widget .monaco-list:not(.drop-target):not(.dragging) .monaco-list-row:hover:not(.selected):not(.focused).option-disabled{color:var(--vscode-disabledForeground)}.action-widget .monaco-list-row.action:not(.option-disabled) .codicon{color:inherit}.action-widget .monaco-list-row.action .title{flex:1;overflow:hidden;text-overflow:ellipsis}.action-widget .monaco-list-row.action .monaco-keybinding>.monaco-keybinding-key{background-color:var(--vscode-keybindingLabel-background);color:var(--vscode-keybindingLabel-foreground);border-radius:3px;border:1px solid var(--vscode-keybindingLabel-border);border-bottom-color:var(--vscode-keybindingLabel-bottomBorder);box-shadow:inset 0 -1px 0 var(--vscode-widget-shadow)}.action-widget .action-widget-action-bar{background-color:var(--vscode-editorHoverWidget-statusBarBackground);border-top:1px solid var(--vscode-editorHoverWidget-border)}.action-widget .action-widget-action-bar:before{display:block;content:"";width:100%}.action-widget .action-widget-action-bar .actions-container{padding:0 8px}.action-widget-action-bar .action-label{color:var(--vscode-textLink-activeForeground);font-size:12px;line-height:22px;padding:0;pointer-events:all}.action-widget-action-bar .action-item{margin-right:16px;pointer-events:none}.action-widget-action-bar .action-label:hover{background-color:transparent!important}.monaco-action-bar .actions-container.highlight-toggled .action-label.checked{background:var(--vscode-actionBar-toggledBackground)!important}.monaco-action-bar .action-item.menu-entry .action-label.icon{width:16px;height:16px;background-repeat:no-repeat;background-position:50%;background-size:16px}.monaco-dropdown-with-default{display:flex!important;flex-direction:row;border-radius:5px}.monaco-dropdown-with-default>.action-container>.action-label{margin-right:0}.monaco-dropdown-with-default>.action-container.menu-entry>.action-label.icon{width:16px;height:16px;background-repeat:no-repeat;background-position:50%;background-size:16px}.monaco-dropdown-with-default:hover{background-color:var(--vscode-toolbar-hoverBackground)}.monaco-dropdown-with-default>.dropdown-action-container>.monaco-dropdown>.dropdown-label .codicon[class*=codicon-]{font-size:12px;padding-left:0;padding-right:0;line-height:16px;margin-left:-3px}.monaco-dropdown-with-default>.dropdown-action-container>.monaco-dropdown>.dropdown-label>.action-label{display:block;background-size:16px;background-position:50%;background-repeat:no-repeat}.monaco-link{color:var(--vscode-textLink-foreground)}.monaco-link:hover{color:var(--vscode-textLink-activeForeground)}.quick-input-widget{position:absolute;width:600px;z-index:2550;left:50%;margin-left:-300px;-webkit-app-region:no-drag;border-radius:6px}.quick-input-titlebar{display:flex;align-items:center;border-top-left-radius:5px;border-top-right-radius:5px}.quick-input-left-action-bar{display:flex;margin-left:4px;flex:1}.quick-input-title{padding:3px 0;text-align:center;text-overflow:ellipsis;overflow:hidden}.quick-input-right-action-bar{display:flex;margin-right:4px;flex:1}.quick-input-right-action-bar>.actions-container{justify-content:flex-end}.quick-input-titlebar .monaco-action-bar .action-label.codicon{background-position:50%;background-repeat:no-repeat;padding:2px}.quick-input-description{margin:6px 6px 6px 11px}.quick-input-header .quick-input-description{margin:4px 2px;flex:1}.quick-input-header{display:flex;padding:8px 6px 6px}.quick-input-widget.hidden-input .quick-input-header{padding:0;margin-bottom:0}.quick-input-and-message{display:flex;flex-direction:column;flex-grow:1;min-width:0;position:relative}.quick-input-check-all{align-self:center;margin:0}.quick-input-filter{flex-grow:1;display:flex;position:relative}.quick-input-box{flex-grow:1}.quick-input-widget.show-checkboxes .quick-input-box,.quick-input-widget.show-checkboxes .quick-input-message{margin-left:5px}.quick-input-visible-count{position:absolute;left:-10000px}.quick-input-count{align-self:center;position:absolute;right:4px;display:flex;align-items:center}.quick-input-count .monaco-count-badge{vertical-align:middle;padding:2px 4px;border-radius:2px;min-height:auto;line-height:normal}.quick-input-action{margin-left:6px}.quick-input-action .monaco-text-button{font-size:11px;padding:0 6px;display:flex;height:25px;align-items:center}.quick-input-message{margin-top:-1px;padding:5px;overflow-wrap:break-word}.quick-input-message>.codicon{margin:0 .2em;vertical-align:text-bottom}.quick-input-message a{color:inherit}.quick-input-progress.monaco-progress-container{position:relative}.quick-input-list{line-height:22px}.quick-input-widget.hidden-input .quick-input-list{margin-top:4px;padding-bottom:4px}.quick-input-list .monaco-list{overflow:hidden;max-height:440px;padding-bottom:5px}.quick-input-list .monaco-scrollable-element{padding:0 5px}.quick-input-list .quick-input-list-entry{box-sizing:border-box;overflow:hidden;display:flex;height:100%;padding:0 6px}.quick-input-list .quick-input-list-entry.quick-input-list-separator-border{border-top-width:1px;border-top-style:solid}.quick-input-list .monaco-list-row{border-radius:3px}.quick-input-list .monaco-list-row[data-index="0"] .quick-input-list-entry.quick-input-list-separator-border{border-top-style:none}.quick-input-list .quick-input-list-label{overflow:hidden;display:flex;height:100%;flex:1}.quick-input-list .quick-input-list-checkbox{align-self:center;margin:0}.quick-input-list .quick-input-list-icon{background-size:16px;background-position:0;background-repeat:no-repeat;padding-right:6px;width:16px;height:22px;display:flex;align-items:center;justify-content:center}.quick-input-list .quick-input-list-rows{overflow:hidden;text-overflow:ellipsis;display:flex;flex-direction:column;height:100%;flex:1;margin-left:5px}.quick-input-widget.show-checkboxes .quick-input-list .quick-input-list-rows{margin-left:10px}.quick-input-widget .quick-input-list .quick-input-list-checkbox{display:none}.quick-input-widget.show-checkboxes .quick-input-list .quick-input-list-checkbox{display:inline}.quick-input-list .quick-input-list-rows>.quick-input-list-row{display:flex;align-items:center}.quick-input-list .quick-input-list-rows>.quick-input-list-row .monaco-icon-label,.quick-input-list .quick-input-list-rows>.quick-input-list-row .monaco-icon-label .monaco-icon-label-container>.monaco-icon-name-container{flex:1}.quick-input-list .quick-input-list-rows>.quick-input-list-row .codicon[class*=codicon-]{vertical-align:text-bottom}.quick-input-list .quick-input-list-rows .monaco-highlighted-label>span{opacity:1}.quick-input-list .quick-input-list-entry .quick-input-list-entry-keybinding{margin-right:8px}.quick-input-list .quick-input-list-label-meta{opacity:.7;line-height:normal;text-overflow:ellipsis;overflow:hidden}.quick-input-list .monaco-highlighted-label .highlight{font-weight:700}.quick-input-list .quick-input-list-entry .quick-input-list-separator{margin-right:4px}.quick-input-list .quick-input-list-entry-action-bar{display:flex;flex:0;overflow:visible}.quick-input-list .quick-input-list-entry-action-bar .action-label{display:none}.quick-input-list .quick-input-list-entry-action-bar .action-label.codicon{margin-right:4px;padding:0 2px 2px}.quick-input-list .quick-input-list-entry-action-bar{margin-top:1px;margin-right:4px}.quick-input-list .monaco-list-row.focused .quick-input-list-entry-action-bar .action-label,.quick-input-list .quick-input-list-entry .quick-input-list-entry-action-bar .action-label.always-visible,.quick-input-list .quick-input-list-entry:hover .quick-input-list-entry-action-bar .action-label{display:flex}.quick-input-list .monaco-list-row.focused .monaco-keybinding-key,.quick-input-list .monaco-list-row.focused .quick-input-list-entry .quick-input-list-separator{color:inherit}.quick-input-list .monaco-list-row.focused .monaco-keybinding-key{background:none}.quick-input-list .quick-input-list-separator-as-item{font-weight:600;font-size:12px}.extension-editor .codicon.codicon-error,.extensions-viewlet>.extensions .codicon.codicon-error,.markers-panel .marker-icon .codicon.codicon-error,.markers-panel .marker-icon.error,.monaco-editor .zone-widget .codicon.codicon-error,.preferences-editor .codicon.codicon-error,.text-search-provider-messages .providerMessage .codicon.codicon-error{color:var(--vscode-problemsErrorIcon-foreground)}.extension-editor .codicon.codicon-warning,.extensions-viewlet>.extensions .codicon.codicon-warning,.markers-panel .marker-icon .codicon.codicon-warning,.markers-panel .marker-icon.warning,.monaco-editor .zone-widget .codicon.codicon-warning,.preferences-editor .codicon.codicon-warning,.text-search-provider-messages .providerMessage .codicon.codicon-warning{color:var(--vscode-problemsWarningIcon-foreground)}.extension-editor .codicon.codicon-info,.extensions-viewlet>.extensions .codicon.codicon-info,.markers-panel .marker-icon .codicon.codicon-info,.markers-panel .marker-icon.info,.monaco-editor .zone-widget .codicon.codicon-info,.preferences-editor .codicon.codicon-info,.text-search-provider-messages .providerMessage .codicon.codicon-info{color:var(--vscode-problemsInfoIcon-foreground)}
\ No newline at end of file
diff --git a/public/vs/editor/editor.main.js b/public/vs/editor/editor.main.js
new file mode 100644
index 0000000..e3dab92
--- /dev/null
+++ b/public/vs/editor/editor.main.js
@@ -0,0 +1,762 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/(function(){var se=["exports","require","vs/base/common/lifecycle","vs/nls","vs/nls!vs/editor/editor.main","vs/editor/common/core/range","vs/base/common/event","vs/base/browser/dom","vs/platform/instantiation/common/instantiation","vs/css!vs/editor/editor.main","vs/editor/common/core/position","vs/base/common/strings","vs/base/common/errors","vs/base/common/arrays","vs/base/common/async","vs/platform/contextkey/common/contextkey","vs/editor/browser/editorExtensions","vs/base/common/platform","vs/editor/common/services/languageFeatures","vs/base/common/cancellation","vs/base/common/types","vs/editor/common/editorContextKeys","vs/base/common/uri","vs/platform/theme/common/themeService","vs/editor/common/core/selection","vs/platform/commands/common/commands","vs/base/common/codicons","vs/platform/configuration/common/configuration","vs/base/common/themables","vs/platform/theme/common/colorRegistry","vs/platform/actions/common/actions","vs/editor/common/languages","vs/editor/common/languages/languageConfigurationRegistry","vs/editor/browser/services/codeEditorService","vs/platform/keybinding/common/keybinding","vs/base/common/observable","vs/editor/common/config/editorOptions","vs/platform/registry/common/platform","vs/editor/common/model/textModel","vs/base/common/color","vs/base/browser/fastDomNode","vs/editor/common/model","vs/base/common/actions","vs/editor/common/languages/language","vs/base/browser/window","vs/platform/instantiation/common/extensions","vs/base/browser/keyboardEvent","vs/base/common/network","vs/base/browser/ui/aria/aria","vs/base/common/resources","vs/platform/notification/common/notification","vs/editor/common/services/model","vs/base/common/iterator","vs/base/common/map","vs/base/browser/browser","vs/base/common/objects","vs/editor/browser/view/viewPart","vs/platform/opener/common/opener","vs/base/common/htmlContent","vs/platform/contextview/browser/contextView","vs/base/common/arraysFind","vs/base/common/stopwatch","vs/editor/common/core/lineRange","vs/base/browser/touch","vs/platform/log/common/log","vs/base/common/keyCodes","vs/base/common/linkedList","vs/base/browser/mouseEvent","vs/editor/common/services/resolverService","vs/platform/accessibility/common/accessibility","vs/platform/quickinput/common/quickInput","vs/base/common/filters","vs/editor/browser/config/domFontInfo","vs/editor/common/core/offsetRange","vs/editor/common/core/editOperation","vs/editor/common/cursorCommon","vs/base/browser/ui/widget","vs/base/browser/ui/scrollbar/scrollableElement","vs/base/browser/ui/actionbar/actionbar","vs/editor/common/services/languageFeatureDebounce","vs/editor/common/languages/modesRegistry","vs/platform/telemetry/common/telemetry","vs/platform/theme/common/iconRegistry","vs/editor/common/core/editorColorRegistry","vs/base/browser/event","vs/editor/common/core/cursorColumns","vs/editor/common/viewModel","vs/editor/browser/widget/diffEditor/utils","vs/platform/progress/common/progress","vs/platform/theme/common/theme","vs/base/common/assert","vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/length","vs/platform/storage/common/storage","vs/base/browser/trustedTypes","vs/editor/common/tokens/lineTokens","vs/base/common/path","vs/editor/common/standaloneStrings","vs/platform/markers/common/markers","vs/platform/configuration/common/configurationRegistry","vs/base/common/lazy","vs/base/common/severity","vs/editor/contrib/hover/browser/hoverTypes","vs/editor/common/core/stringBuilder","vs/platform/clipboard/common/clipboardService","vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer","vs/editor/contrib/editorState/browser/editorState","vs/platform/theme/browser/defaultStyles","vs/base/common/decorators","vs/base/common/functional","vs/base/common/mime","vs/base/common/observableInternal/base","vs/base/common/hash","vs/editor/common/diff/rangeMapping","vs/editor/common/languages/languageConfiguration","vs/editor/common/textModelEvents","vs/editor/browser/view/dynamicViewOverlay","vs/editor/contrib/codeAction/common/types","vs/editor/contrib/snippet/browser/snippetParser","vs/base/browser/ui/iconLabel/iconLabels","vs/base/browser/ui/list/listWidget","vs/editor/common/viewLayout/viewLineRenderer","vs/editor/common/services/editorWorker","vs/platform/audioCues/browser/audioCueService","vs/platform/layout/browser/layoutService","vs/platform/keybinding/common/keybindingsRegistry","vs/base/common/keybindings","vs/base/common/iconLabels","vs/editor/browser/stableEditorScroll","vs/editor/common/core/characterClassifier","vs/editor/common/core/eolCounter","vs/editor/common/commands/replaceCommand","vs/editor/common/editorFeatures","vs/editor/common/encodedTokenAttributes","vs/editor/common/languages/supports","vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/smallImmutableSet","vs/base/browser/ui/actionbar/actionViewItems","vs/editor/browser/services/bulkEditService","vs/editor/standalone/common/standaloneTheme","vs/editor/contrib/suggest/browser/suggest","vs/platform/quickinput/common/quickAccess","vs/editor/contrib/codeAction/browser/codeAction","vs/platform/actions/browser/menuEntryActionViewItem","vs/editor/contrib/peekView/browser/peekView","vs/base/browser/ui/tree/tree","vs/base/common/buffer","vs/base/common/numbers","vs/base/common/observableInternal/logging","vs/base/common/scrollable","vs/editor/browser/view/renderingContext","vs/editor/common/config/editorZoom","vs/editor/common/core/wordCharacterClassifier","vs/editor/common/core/wordHelper","vs/editor/common/diff/defaultLinesDiffComputer/algorithms/diffAlgorithm","vs/editor/browser/editorBrowser","vs/editor/common/viewEventHandler","vs/editor/common/viewLayout/lineDecorations","vs/editor/contrib/inlineCompletions/browser/utils","vs/base/browser/globalPointerMoveMonitor","vs/base/browser/ui/sash/sash","vs/base/browser/ui/toggle/toggle","vs/editor/common/languages/nullTokenize","vs/editor/contrib/gotoSymbol/browser/referencesModel","vs/platform/dialogs/common/dialogs","vs/platform/instantiation/common/serviceCollection","vs/platform/label/common/label","vs/editor/contrib/documentSymbols/browser/outlineModel","vs/editor/contrib/message/browser/messageController","vs/editor/browser/editorDom","vs/editor/browser/widget/embeddedCodeEditorWidget","vs/platform/workspace/common/workspace","vs/base/common/idGenerator","vs/base/common/observableInternal/derived","vs/base/common/range","vs/base/common/diff/diff","vs/base/common/uint","vs/base/common/uuid","vs/base/common/dataTransfer","vs/base/browser/ui/codicons/codiconStyles","vs/css!vs/platform/quickinput/browser/media/quickInput","vs/editor/common/core/textModelDefaults","vs/editor/common/editorCommon","vs/editor/common/cursor/cursorWordOperations","vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/beforeEditPositionMapper","vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/ast","vs/editor/common/model/textModelSearch","vs/editor/contrib/folding/browser/foldingRanges","vs/base/browser/markdownRenderer","vs/base/browser/ui/tree/abstractTree","vs/editor/contrib/gotoSymbol/browser/link/clickLinkGesture","vs/editor/common/services/textResourceConfiguration","vs/editor/browser/controller/textAreaInput","vs/editor/browser/coreCommands","vs/platform/list/browser/listService","vs/platform/undoRedo/common/undoRedo","vs/editor/browser/widget/codeEditorWidget","vs/editor/contrib/find/browser/findModel","vs/editor/contrib/snippet/browser/snippetController2","vs/base/browser/ui/scrollbar/scrollbarState","vs/base/browser/dnd","vs/base/common/ternarySearchTree","vs/base/browser/ui/mouseCursor/mouseCursor","vs/css!vs/editor/contrib/colorPicker/browser/colorPicker","vs/editor/browser/config/tabFocus","vs/editor/common/core/indentation","vs/editor/common/diff/defaultLinesDiffComputer/utils","vs/editor/common/diff/linesDiffComputer","vs/editor/common/cursor/cursorMoveOperations","vs/editor/common/cursor/cursorDeleteOperations","vs/editor/common/cursor/cursorMoveCommands","vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/tokenizer","vs/editor/common/model/utils","vs/editor/common/standalone/standaloneEnums","vs/editor/common/textModelGuides","vs/editor/browser/viewParts/glyphMargin/glyphMargin","vs/editor/common/viewEvents","vs/editor/common/viewModelEventDispatcher","vs/editor/contrib/inlineCompletions/browser/commandIds","vs/editor/contrib/inlineCompletions/browser/ghostText","vs/base/common/keybindingLabels","vs/base/browser/canIUse","vs/base/browser/ui/tree/indexTreeModel","vs/base/browser/ui/tree/objectTreeModel","vs/base/common/extpath","vs/base/common/marshalling","vs/base/browser/ui/keybindingLabel/keybindingLabel","vs/base/browser/ui/resizable/resizable","vs/base/browser/ui/scrollbar/scrollbarArrow","vs/base/browser/ui/hover/hoverWidget","vs/base/browser/ui/list/listView","vs/base/browser/ui/button/button","vs/base/browser/ui/iconLabel/iconLabel","vs/base/browser/ui/inputbox/inputBox","vs/base/browser/ui/findinput/findInput","vs/editor/browser/view/viewLayer","vs/editor/common/languages/supports/richEditBrackets","vs/editor/common/config/fontInfo","vs/platform/instantiation/common/descriptors","vs/editor/common/services/markerDecorations","vs/editor/common/services/semanticTokensStyling","vs/editor/contrib/dropOrPasteInto/browser/edit","vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys","vs/editor/contrib/parameterHints/browser/provideSignatureHelp","vs/platform/contextkey/common/contextkeys","vs/platform/environment/common/environment","vs/platform/hover/browser/hover","vs/platform/jsonschemas/common/jsonContributionRegistry","vs/editor/common/config/editorConfigurationSchema","vs/editor/browser/services/editorWorkerService","vs/editor/common/languages/autoIndent","vs/editor/common/languages/enterAction","vs/editor/common/commands/shiftCommand","vs/editor/common/cursor/cursorTypeOperations","vs/editor/contrib/gotoSymbol/browser/goToSymbol","vs/editor/contrib/hover/browser/markdownHoverParticipant","vs/editor/contrib/symbolIcons/browser/symbolIcons","vs/editor/browser/viewParts/lines/viewLine","vs/editor/common/services/semanticTokensProviderStyling","vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget","vs/editor/browser/widget/diffEditor/registrations.contribution","vs/editor/browser/widget/diffEditor/diffEditorWidget","vs/editor/contrib/codeAction/browser/codeActionController","vs/editor/contrib/folding/browser/folding","vs/editor/contrib/inlineProgress/browser/inlineProgress","vs/editor/contrib/gotoSymbol/browser/goToCommands","vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController","vs/editor/standalone/browser/standaloneServices","vs/base/browser/performance","vs/base/common/cache","vs/base/common/collections","vs/base/common/observableInternal/autorun","vs/base/common/ime","vs/base/common/symbols","vs/css!vs/base/browser/ui/actionbar/actionbar","vs/css!vs/base/browser/ui/dropdown/dropdown","vs/css!vs/base/browser/ui/findinput/findInput","vs/css!vs/base/browser/ui/list/list","vs/css!vs/platform/actionWidget/browser/actionWidget","vs/editor/browser/viewParts/minimap/minimapCharSheet","vs/editor/common/config/diffEditor","vs/editor/browser/view/viewUserInputEvents","vs/editor/browser/controller/textAreaState","vs/editor/common/core/rgba","vs/editor/common/cursor/cursorAtomicMoveOperations","vs/editor/common/diff/defaultLinesDiffComputer/algorithms/myersDiffAlgorithm","vs/editor/common/diff/defaultLinesDiffComputer/heuristicSequenceOptimizations","vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence","vs/editor/common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer","vs/editor/common/editorAction","vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/combineTextEditInfos","vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/parser","vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/brackets","vs/editor/common/model/prefixSumComputer","vs/editor/common/model/textModelPart","vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase","vs/editor/common/modelLineProjectionData","vs/editor/common/services/treeViewsDnd","vs/editor/common/services/unicodeTextModelHighlighter","vs/editor/common/model/guidesTextModelPart","vs/editor/common/tokens/contiguousMultilineTokensBuilder","vs/editor/browser/viewParts/margin/margin","vs/editor/common/viewModel/overviewZoneManager","vs/editor/contrib/comment/browser/blockCommentCommand","vs/editor/contrib/folding/browser/foldingModel","vs/editor/contrib/folding/browser/indentRangeProvider","vs/editor/contrib/folding/browser/syntaxRangeProvider","vs/editor/contrib/format/browser/formattingEdit","vs/editor/contrib/indentation/browser/indentUtils","vs/editor/contrib/inlineCompletions/browser/singleTextEdit","vs/editor/contrib/semanticTokens/common/semanticTokensConfig","vs/editor/contrib/smartSelect/browser/bracketSelections","vs/editor/contrib/stickyScroll/browser/stickyScrollElement","vs/editor/contrib/suggest/browser/completionModel","vs/editor/contrib/suggest/browser/wordDistance","vs/editor/standalone/common/monarch/monarchCommon","vs/base/common/process","vs/base/common/glob","vs/base/browser/dompurify/dompurify","vs/base/browser/formattedTextRenderer","vs/base/browser/ui/contextview/contextview","vs/base/browser/ui/countBadge/countBadge","vs/base/browser/ui/highlightedlabel/highlightedLabel","vs/base/browser/ui/scrollbar/abstractScrollbar","vs/base/browser/ui/splitview/splitview","vs/base/browser/ui/findinput/findInputToggles","vs/base/browser/ui/iconLabel/iconLabelHover","vs/base/browser/ui/dropdown/dropdownActionViewItem","vs/base/browser/ui/tree/objectTree","vs/base/common/worker/simpleWorker","vs/editor/browser/config/elementSizeObserver","vs/editor/common/core/textChange","vs/editor/common/languageSelector","vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer","vs/editor/contrib/hover/browser/hoverOperation","vs/editor/contrib/inlayHints/browser/inlayHints","vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature","vs/editor/browser/config/fontMeasurements","vs/editor/common/viewModel/viewModelDecorations","vs/editor/common/languages/textToHtmlTokenizer","vs/editor/common/services/editorBaseApi","vs/editor/common/viewModel/minimapTokensColorTracker","vs/editor/common/model/editStack","vs/platform/files/common/files","vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature","vs/editor/contrib/codelens/browser/codelens","vs/editor/contrib/semanticTokens/common/getSemanticTokens","vs/editor/standalone/common/monarch/monarchLexer","vs/editor/contrib/dropOrPasteInto/browser/postEditWidget","vs/platform/keybinding/common/keybindingResolver","vs/platform/keybinding/common/resolvedKeybindingItem","vs/editor/standalone/browser/standaloneLayoutService","vs/platform/quickinput/browser/quickInputUtils","vs/platform/dnd/browser/dnd","vs/editor/browser/dnd","vs/editor/contrib/colorPicker/browser/defaultDocumentColorProvider","vs/editor/contrib/colorPicker/browser/color","vs/editor/contrib/suggest/browser/suggestWidgetDetails","vs/platform/configuration/common/configurationModels","vs/platform/history/browser/contextScopedHistoryWidget","vs/editor/contrib/suggest/browser/suggestMemory","vs/editor/browser/widget/diffEditor/diffEditorViewModel","vs/editor/contrib/codeAction/browser/codeActionModel","vs/editor/contrib/codeAction/browser/lightBulbWidget","vs/editor/contrib/format/browser/format","vs/editor/contrib/hover/browser/getHover","vs/editor/contrib/wordOperations/browser/wordOperations","vs/editor/browser/controller/mouseTarget","vs/platform/quickinput/browser/quickInputList","vs/platform/quickinput/browser/quickInput","vs/editor/browser/widget/diffEditor/features/overviewRulerFeature","vs/editor/browser/viewParts/lineNumbers/lineNumbers","vs/editor/contrib/quickAccess/browser/editorNavigationQuickAccess","vs/editor/standalone/browser/standaloneCodeEditorService","vs/editor/standalone/browser/standaloneThemeService","vs/platform/actions/browser/toolbar","vs/editor/browser/widget/multiDiffEditorWidget/diffEditorItemTemplate","vs/editor/contrib/colorPicker/browser/colorDetector","vs/editor/contrib/colorPicker/browser/colorHoverParticipant","vs/editor/contrib/find/browser/findController","vs/editor/contrib/folding/browser/foldingDecorations","vs/editor/contrib/hover/browser/contentHover","vs/editor/contrib/dropOrPasteInto/browser/copyPasteController","vs/editor/contrib/wordHighlighter/browser/highlightDecorations","vs/editor/contrib/gotoError/browser/gotoError","vs/editor/contrib/gotoSymbol/browser/peek/referencesController","vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition","vs/editor/contrib/hover/browser/hover","vs/editor/contrib/inlayHints/browser/inlayHintsLocations","vs/editor/contrib/inlayHints/browser/inlayHintsController","vs/editor/contrib/stickyScroll/browser/stickyScrollController","vs/editor/contrib/dropOrPasteInto/browser/defaultProviders","vs/editor/contrib/snippet/browser/snippetSession","vs/editor/contrib/suggest/browser/suggestModel","vs/editor/contrib/suggest/browser/suggestController","vs/platform/workspace/common/workspaceTrust","vs/base/browser/iframe","vs/base/browser/ui/list/list","vs/base/browser/ui/list/splice","vs/base/common/diff/diffChange","vs/base/common/comparers","vs/base/common/linkedText","vs/base/common/marked/marked","vs/base/common/naturalLanguage/korean","vs/base/common/navigator","vs/base/common/history","vs/base/common/observableInternal/utils","vs/base/browser/ui/list/rangeMap","vs/base/common/search","vs/base/common/tfIdf","vs/css!vs/base/browser/ui/aria/aria","vs/css!vs/base/browser/ui/button/button","vs/css!vs/base/browser/ui/codicons/codicon/codicon","vs/css!vs/base/browser/ui/codicons/codicon/codicon-modifiers","vs/css!vs/base/browser/ui/contextview/contextview","vs/css!vs/base/browser/ui/countBadge/countBadge","vs/css!vs/base/browser/ui/hover/hover","vs/css!vs/base/browser/ui/iconLabel/iconlabel","vs/css!vs/base/browser/ui/inputbox/inputBox","vs/css!vs/base/browser/ui/keybindingLabel/keybindingLabel","vs/css!vs/base/browser/ui/mouseCursor/mouseCursor","vs/css!vs/base/browser/ui/progressbar/progressbar","vs/css!vs/base/browser/ui/sash/sash","vs/css!vs/base/browser/ui/scrollbar/media/scrollbars","vs/css!vs/base/browser/ui/selectBox/selectBox","vs/css!vs/base/browser/ui/selectBox/selectBoxCustom","vs/css!vs/base/browser/ui/splitview/splitview","vs/css!vs/base/browser/ui/table/table","vs/css!vs/base/browser/ui/toggle/toggle","vs/css!vs/base/browser/ui/toolbar/toolbar","vs/css!vs/base/browser/ui/tree/media/tree","vs/css!vs/editor/browser/controller/textAreaHandler","vs/css!vs/editor/browser/viewParts/blockDecorations/blockDecorations","vs/css!vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight","vs/css!vs/editor/browser/viewParts/decorations/decorations","vs/css!vs/editor/browser/viewParts/glyphMargin/glyphMargin","vs/css!vs/editor/browser/viewParts/indentGuides/indentGuides","vs/css!vs/editor/browser/viewParts/lineNumbers/lineNumbers","vs/css!vs/editor/browser/viewParts/lines/viewLines","vs/css!vs/editor/browser/viewParts/linesDecorations/linesDecorations","vs/css!vs/editor/browser/viewParts/margin/margin","vs/css!vs/editor/browser/viewParts/marginDecorations/marginDecorations","vs/css!vs/editor/browser/viewParts/minimap/minimap","vs/css!vs/editor/browser/viewParts/overlayWidgets/overlayWidgets","vs/css!vs/editor/browser/viewParts/rulers/rulers","vs/css!vs/editor/browser/viewParts/scrollDecoration/scrollDecoration","vs/css!vs/editor/browser/viewParts/selections/selections","vs/css!vs/editor/browser/viewParts/viewCursors/viewCursors","vs/css!vs/editor/browser/viewParts/whitespace/whitespace","vs/css!vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer","vs/css!vs/editor/browser/widget/diffEditor/style","vs/css!vs/editor/browser/widget/hoverWidget/hover","vs/css!vs/editor/browser/widget/markdownRenderer/browser/renderedMarkdown","vs/css!vs/editor/browser/widget/media/editor","vs/css!vs/editor/browser/widget/multiDiffEditorWidget/style","vs/css!vs/editor/contrib/anchorSelect/browser/anchorSelect","vs/css!vs/editor/contrib/bracketMatching/browser/bracketMatching","vs/css!vs/editor/contrib/codeAction/browser/lightBulbWidget","vs/css!vs/editor/contrib/codelens/browser/codelensWidget","vs/css!vs/editor/contrib/dnd/browser/dnd","vs/css!vs/editor/contrib/dropOrPasteInto/browser/postEditWidget","vs/css!vs/editor/contrib/find/browser/findOptionsWidget","vs/css!vs/editor/contrib/find/browser/findWidget","vs/css!vs/editor/contrib/folding/browser/folding","vs/css!vs/editor/contrib/gotoError/browser/media/gotoErrorWidget","vs/css!vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition","vs/css!vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget","vs/css!vs/editor/contrib/hover/browser/hover","vs/css!vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace","vs/css!vs/editor/contrib/inlineCompletions/browser/ghostText","vs/css!vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget","vs/css!vs/editor/contrib/inlineProgress/browser/inlineProgressWidget","vs/css!vs/editor/contrib/linkedEditing/browser/linkedEditing","vs/css!vs/editor/contrib/links/browser/links","vs/css!vs/editor/contrib/message/browser/messageController","vs/css!vs/editor/contrib/parameterHints/browser/parameterHints","vs/css!vs/editor/contrib/peekView/browser/media/peekViewWidget","vs/css!vs/editor/contrib/rename/browser/renameInputField","vs/css!vs/editor/contrib/snippet/browser/snippetSession","vs/css!vs/editor/contrib/stickyScroll/browser/stickyScroll","vs/css!vs/editor/contrib/suggest/browser/media/suggest","vs/css!vs/editor/contrib/symbolIcons/browser/symbolIcons","vs/css!vs/editor/contrib/unicodeHighlighter/browser/bannerController","vs/css!vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter","vs/css!vs/editor/contrib/wordHighlighter/browser/highlightDecorations","vs/css!vs/editor/contrib/zoneWidget/browser/zoneWidget","vs/css!vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard","vs/css!vs/editor/standalone/browser/inspectTokens/inspectTokens","vs/css!vs/editor/standalone/browser/quickInput/standaloneQuickInput","vs/css!vs/editor/standalone/browser/standalone-tokens","vs/css!vs/platform/actions/browser/menuEntryActionViewItem","vs/css!vs/platform/opener/browser/link","vs/css!vs/platform/severityIcon/browser/media/severityIcon","vs/editor/browser/config/charWidthReader","vs/editor/browser/config/migrateOptions","vs/editor/browser/viewParts/lines/domReadingContext","vs/editor/browser/viewParts/lines/rangeUtil","vs/editor/browser/viewParts/minimap/minimapCharRenderer","vs/editor/browser/viewParts/minimap/minimapPreBaked","vs/editor/browser/viewParts/minimap/minimapCharRendererFactory","vs/editor/browser/widget/diffEditor/delegatingEditorImpl","vs/editor/browser/widget/multiDiffEditorWidget/objectPool","vs/editor/common/commands/trimTrailingWhitespaceCommand","vs/editor/common/commands/surroundSelectionCommand","vs/editor/common/cursor/cursorContext","vs/editor/common/diff/defaultLinesDiffComputer/lineSequence","vs/editor/common/diff/defaultLinesDiffComputer/algorithms/dynamicProgrammingDiffing","vs/editor/common/diff/defaultLinesDiffComputer/computeMovedLines","vs/editor/common/diff/legacyLinesDiffComputer","vs/editor/common/diff/linesDiffComputers","vs/editor/common/editorTheme","vs/editor/common/languages/defaultDocumentColorsComputer","vs/editor/common/languages/linkComputer","vs/editor/common/cursor/cursorColumnSelection","vs/editor/common/cursor/oneCursor","vs/editor/common/cursor/cursorCollection","vs/editor/common/languages/supports/characterPair","vs/editor/common/languages/supports/indentRules","vs/editor/common/languages/supports/inplaceReplaceSupport","vs/editor/common/languages/supports/languageBracketsConfiguration","vs/editor/common/languages/supports/onEnter","vs/editor/common/languages/supports/tokenization","vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/nodeReader","vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/concat23Trees","vs/editor/common/model/bracketPairsTextModelPart/fixBrackets","vs/editor/common/model/fixedArray","vs/editor/common/model/indentationGuesser","vs/editor/common/model/intervalTree","vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase","vs/editor/common/model/mirrorTextModel","vs/editor/common/textModelBracketPairs","vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/bracketPairsTree","vs/editor/common/tokenizationRegistry","vs/editor/common/tokens/contiguousMultilineTokens","vs/editor/common/tokens/contiguousTokensEditing","vs/editor/common/tokens/contiguousTokensStore","vs/editor/common/tokens/sparseMultilineTokens","vs/editor/common/tokens/sparseTokensStore","vs/editor/browser/viewParts/blockDecorations/blockDecorations","vs/editor/browser/viewParts/decorations/decorations","vs/editor/browser/viewParts/linesDecorations/linesDecorations","vs/editor/browser/viewParts/marginDecorations/marginDecorations","vs/editor/browser/viewParts/rulers/rulers","vs/editor/browser/viewParts/scrollDecoration/scrollDecoration","vs/editor/browser/viewParts/viewZones/viewZones","vs/editor/common/viewLayout/linePart","vs/editor/common/viewLayout/linesLayout","vs/editor/common/viewLayout/viewLinesViewportData","vs/editor/common/viewModel/glyphLanesModel","vs/editor/common/viewModel/modelLineProjection","vs/editor/common/viewModel/monospaceLineBreaksComputer","vs/editor/browser/viewParts/overviewRuler/overviewRuler","vs/editor/common/viewModel/viewContext","vs/editor/common/viewLayout/viewLayout","vs/editor/contrib/caretOperations/browser/moveCaretCommand","vs/editor/contrib/colorPicker/browser/colorPickerModel","vs/editor/contrib/comment/browser/lineCommentCommand","vs/editor/contrib/dnd/browser/dragAndDropCommand","vs/editor/contrib/find/browser/replaceAllCommand","vs/editor/contrib/find/browser/replacePattern","vs/editor/contrib/folding/browser/hiddenRangeModel","vs/editor/contrib/inPlaceReplace/browser/inPlaceReplaceCommand","vs/editor/contrib/linesOperations/browser/copyLinesCommand","vs/editor/contrib/linesOperations/browser/sortLinesCommand","vs/editor/contrib/smartSelect/browser/wordSelections","vs/editor/contrib/suggest/browser/suggestCommitCharacters","vs/editor/contrib/suggest/browser/suggestOvertypingCapturer","vs/editor/standalone/common/monarch/monarchCompile","vs/nls!vs/base/browser/ui/actionbar/actionViewItems","vs/nls!vs/base/browser/ui/findinput/findInput","vs/nls!vs/base/browser/ui/findinput/findInputToggles","vs/nls!vs/base/browser/ui/findinput/replaceInput","vs/nls!vs/base/browser/ui/hover/hoverWidget","vs/nls!vs/base/browser/ui/iconLabel/iconLabelHover","vs/nls!vs/base/browser/ui/inputbox/inputBox","vs/nls!vs/base/browser/ui/keybindingLabel/keybindingLabel","vs/nls!vs/base/browser/ui/selectBox/selectBoxCustom","vs/nls!vs/base/browser/ui/toolbar/toolbar","vs/nls!vs/base/browser/ui/tree/abstractTree","vs/nls!vs/base/common/actions","vs/editor/browser/widget/multiDiffEditorWidget/utils","vs/nls!vs/base/common/errorMessage","vs/base/common/errorMessage","vs/nls!vs/base/common/keybindingLabels","vs/nls!vs/base/common/platform","vs/base/browser/ui/scrollbar/scrollbarVisibilityController","vs/base/browser/ui/tree/compressedObjectTreeModel","vs/base/common/hotReload","vs/base/common/fuzzyScorer","vs/base/common/labels","vs/base/browser/ui/dropdown/dropdown","vs/base/browser/ui/list/rowCache","vs/base/browser/ui/progressbar/progressbar","vs/base/browser/ui/selectBox/selectBoxNative","vs/base/browser/ui/scrollbar/horizontalScrollbar","vs/base/browser/ui/scrollbar/verticalScrollbar","vs/base/browser/ui/list/listPaging","vs/base/browser/ui/table/tableWidget","vs/base/browser/ui/selectBox/selectBoxCustom","vs/base/browser/ui/selectBox/selectBox","vs/base/browser/ui/findinput/replaceInput","vs/base/browser/ui/menu/menu","vs/base/browser/ui/toolbar/toolbar","vs/base/browser/ui/tree/dataTree","vs/base/browser/ui/tree/asyncDataTree","vs/base/browser/defaultWorkerFactory","vs/base/parts/storage/common/storage","vs/editor/browser/viewParts/contentWidgets/contentWidgets","vs/editor/browser/viewParts/overlayWidgets/overlayWidgets","vs/editor/browser/widget/codeEditorContributions","vs/editor/browser/widget/diffEditor/components/diffEditorSash","vs/editor/browser/view/domLineBreaksComputer","vs/editor/browser/view/viewOverlays","vs/editor/common/languageFeatureRegistry","vs/editor/common/languages/supports/electricCharacter","vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl","vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder","vs/editor/common/services/semanticTokensDto","vs/editor/contrib/hover/browser/resizableContentWidget","vs/editor/contrib/inlineCompletions/browser/provideInlineCompletions","vs/nls!vs/editor/browser/controller/textAreaHandler","vs/nls!vs/editor/browser/coreCommands","vs/nls!vs/editor/browser/editorExtensions","vs/nls!vs/editor/browser/widget/codeEditorWidget","vs/nls!vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer","vs/nls!vs/editor/browser/widget/diffEditor/components/diffEditorEditors","vs/nls!vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin","vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin","vs/nls!vs/editor/browser/widget/diffEditor/diffEditor.contribution","vs/nls!vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature","vs/nls!vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature","vs/nls!vs/editor/browser/widget/diffEditor/features/revertButtonsFeature","vs/editor/browser/widget/diffEditor/features/revertButtonsFeature","vs/nls!vs/editor/browser/widget/diffEditor/registrations.contribution","vs/nls!vs/editor/browser/widget/hoverWidget/hoverWidget","vs/nls!vs/editor/browser/widget/multiDiffEditorWidget/colors","vs/nls!vs/editor/common/config/editorConfigurationSchema","vs/nls!vs/editor/common/config/editorOptions","vs/editor/browser/viewParts/viewCursors/viewCursor","vs/editor/browser/widget/diffEditor/diffEditorOptions","vs/nls!vs/editor/common/core/editorColorRegistry","vs/nls!vs/editor/common/editorContextKeys","vs/nls!vs/editor/common/languages","vs/editor/common/model/textModelTokens","vs/editor/common/model/tokenizationTextModelPart","vs/editor/common/services/editorSimpleWorker","vs/nls!vs/editor/common/languages/modesRegistry","vs/nls!vs/editor/common/model/editStack","vs/nls!vs/editor/common/standaloneStrings","vs/nls!vs/editor/common/viewLayout/viewLineRenderer","vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/renderLines","vs/nls!vs/editor/contrib/anchorSelect/browser/anchorSelect","vs/nls!vs/editor/contrib/bracketMatching/browser/bracketMatching","vs/nls!vs/editor/contrib/caretOperations/browser/caretOperations","vs/nls!vs/editor/contrib/caretOperations/browser/transpose","vs/nls!vs/editor/contrib/clipboard/browser/clipboard","vs/nls!vs/editor/contrib/codeAction/browser/codeAction","vs/nls!vs/editor/contrib/codeAction/browser/codeActionCommands","vs/nls!vs/editor/contrib/codeAction/browser/codeActionContributions","vs/nls!vs/editor/contrib/codeAction/browser/codeActionController","vs/nls!vs/editor/contrib/codeAction/browser/codeActionMenu","vs/nls!vs/editor/contrib/codeAction/browser/lightBulbWidget","vs/nls!vs/editor/contrib/codelens/browser/codelensController","vs/nls!vs/editor/contrib/colorPicker/browser/colorPickerWidget","vs/nls!vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions","vs/nls!vs/editor/contrib/comment/browser/comment","vs/nls!vs/editor/contrib/contextmenu/browser/contextmenu","vs/nls!vs/editor/contrib/cursorUndo/browser/cursorUndo","vs/nls!vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution","vs/nls!vs/editor/contrib/dropOrPasteInto/browser/copyPasteController","vs/nls!vs/editor/contrib/dropOrPasteInto/browser/defaultProviders","vs/nls!vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution","vs/nls!vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController","vs/nls!vs/editor/contrib/editorState/browser/keybindingCancellation","vs/nls!vs/editor/contrib/find/browser/findController","vs/nls!vs/editor/contrib/find/browser/findWidget","vs/nls!vs/editor/contrib/folding/browser/folding","vs/nls!vs/editor/contrib/folding/browser/foldingDecorations","vs/nls!vs/editor/contrib/fontZoom/browser/fontZoom","vs/nls!vs/editor/contrib/format/browser/formatActions","vs/nls!vs/editor/contrib/gotoError/browser/gotoError","vs/nls!vs/editor/contrib/gotoError/browser/gotoErrorWidget","vs/nls!vs/editor/contrib/gotoSymbol/browser/goToCommands","vs/nls!vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition","vs/nls!vs/editor/contrib/gotoSymbol/browser/peek/referencesController","vs/nls!vs/editor/contrib/gotoSymbol/browser/peek/referencesTree","vs/nls!vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget","vs/nls!vs/editor/contrib/gotoSymbol/browser/referencesModel","vs/nls!vs/editor/contrib/gotoSymbol/browser/symbolNavigation","vs/nls!vs/editor/contrib/hover/browser/hover","vs/nls!vs/editor/contrib/hover/browser/markdownHoverParticipant","vs/nls!vs/editor/contrib/hover/browser/markerHoverParticipant","vs/nls!vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace","vs/nls!vs/editor/contrib/indentation/browser/indentation","vs/nls!vs/editor/contrib/inlayHints/browser/inlayHintsHover","vs/nls!vs/editor/contrib/inlineCompletions/browser/commands","vs/nls!vs/editor/contrib/inlineCompletions/browser/hoverParticipant","vs/nls!vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys","vs/nls!vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController","vs/nls!vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget","vs/nls!vs/editor/contrib/lineSelection/browser/lineSelection","vs/nls!vs/editor/contrib/linesOperations/browser/linesOperations","vs/nls!vs/editor/contrib/linkedEditing/browser/linkedEditing","vs/nls!vs/editor/contrib/links/browser/links","vs/nls!vs/editor/contrib/message/browser/messageController","vs/nls!vs/editor/contrib/multicursor/browser/multicursor","vs/nls!vs/editor/contrib/parameterHints/browser/parameterHints","vs/nls!vs/editor/contrib/parameterHints/browser/parameterHintsWidget","vs/nls!vs/editor/contrib/peekView/browser/peekView","vs/nls!vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess","vs/nls!vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess","vs/nls!vs/editor/contrib/readOnlyMessage/browser/contribution","vs/nls!vs/editor/contrib/rename/browser/rename","vs/nls!vs/editor/contrib/rename/browser/renameInputField","vs/nls!vs/editor/contrib/smartSelect/browser/smartSelect","vs/nls!vs/editor/contrib/snippet/browser/snippetController2","vs/nls!vs/editor/contrib/snippet/browser/snippetVariables","vs/nls!vs/editor/contrib/stickyScroll/browser/stickyScrollActions","vs/nls!vs/editor/contrib/suggest/browser/suggest","vs/nls!vs/editor/contrib/suggest/browser/suggestController","vs/nls!vs/editor/contrib/suggest/browser/suggestWidget","vs/nls!vs/editor/contrib/suggest/browser/suggestWidgetDetails","vs/nls!vs/editor/contrib/suggest/browser/suggestWidgetRenderer","vs/nls!vs/editor/contrib/suggest/browser/suggestWidgetStatus","vs/nls!vs/editor/contrib/symbolIcons/browser/symbolIcons","vs/nls!vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode","vs/nls!vs/editor/contrib/tokenization/browser/tokenization","vs/nls!vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter","vs/nls!vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators","vs/nls!vs/editor/contrib/wordHighlighter/browser/highlightDecorations","vs/nls!vs/editor/contrib/wordHighlighter/browser/wordHighlighter","vs/nls!vs/editor/contrib/wordOperations/browser/wordOperations","vs/nls!vs/platform/action/common/actionCommonCategories","vs/nls!vs/platform/actionWidget/browser/actionList","vs/nls!vs/platform/actionWidget/browser/actionWidget","vs/nls!vs/platform/actions/browser/menuEntryActionViewItem","vs/nls!vs/platform/actions/browser/toolbar","vs/nls!vs/platform/actions/common/menuService","vs/nls!vs/platform/audioCues/browser/audioCueService","vs/nls!vs/platform/configuration/common/configurationRegistry","vs/nls!vs/platform/contextkey/browser/contextKeyService","vs/nls!vs/platform/contextkey/common/contextkey","vs/nls!vs/platform/contextkey/common/contextkeys","vs/nls!vs/platform/contextkey/common/scanner","vs/nls!vs/platform/history/browser/contextScopedHistoryWidget","vs/nls!vs/platform/keybinding/common/abstractKeybindingService","vs/nls!vs/platform/list/browser/listService","vs/nls!vs/platform/markers/common/markers","vs/nls!vs/platform/quickinput/browser/commandsQuickAccess","vs/nls!vs/platform/quickinput/browser/helpQuickAccess","vs/nls!vs/platform/quickinput/browser/quickInput","vs/nls!vs/platform/quickinput/browser/quickInputController","vs/nls!vs/platform/quickinput/browser/quickInputList","vs/nls!vs/platform/quickinput/browser/quickInputUtils","vs/nls!vs/platform/theme/common/colorRegistry","vs/nls!vs/platform/theme/common/iconRegistry","vs/nls!vs/platform/undoRedo/common/undoRedoService","vs/nls!vs/platform/workspace/common/workspace","vs/platform/action/common/action","vs/platform/action/common/actionCommonCategories","vs/platform/contextkey/common/scanner","vs/platform/editor/common/editor","vs/platform/extensions/common/extensions","vs/platform/history/browser/historyWidgetKeybindingHint","vs/platform/instantiation/common/graph","vs/editor/common/services/languageFeaturesService","vs/editor/common/services/treeViewsDndService","vs/editor/contrib/inlineCompletions/browser/ghostTextWidget","vs/editor/contrib/links/browser/getLinks","vs/editor/standalone/browser/colorizer","vs/editor/contrib/parameterHints/browser/parameterHintsModel","vs/editor/contrib/suggest/browser/suggestAlternatives","vs/editor/contrib/suggest/browser/wordContextKey","vs/editor/browser/config/editorConfiguration","vs/platform/contextkey/browser/contextKeyService","vs/platform/instantiation/common/instantiationService","vs/platform/keybinding/common/baseResolvedKeybinding","vs/platform/keybinding/common/abstractKeybindingService","vs/platform/keybinding/common/usLayoutResolvedKeybinding","vs/platform/accessibility/browser/accessibilityService","vs/platform/contextview/browser/contextViewService","vs/editor/contrib/diffEditorBreadcrumbs/browser/contribution","vs/editor/contrib/documentSymbols/browser/documentSymbols","vs/platform/clipboard/browser/clipboardService","vs/platform/log/common/logService","vs/editor/contrib/gotoError/browser/markerNavigationService","vs/platform/markers/common/markerService","vs/editor/browser/services/openerService","vs/platform/opener/browser/link","vs/platform/quickinput/browser/pickerQuickAccess","vs/platform/quickinput/browser/quickInputBox","vs/editor/browser/widget/hoverWidget/hoverWidget","vs/editor/browser/services/webWorker","vs/editor/common/cursor/cursor","vs/editor/common/services/getIconClasses","vs/editor/common/services/languagesAssociations","vs/editor/common/services/languagesRegistry","vs/editor/common/services/languageService","vs/editor/contrib/hover/browser/marginHover","vs/editor/contrib/inlineCompletions/browser/inlineCompletionsSource","vs/editor/contrib/linesOperations/browser/moveLinesCommand","vs/platform/configuration/common/configurations","vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode","vs/platform/quickinput/browser/helpQuickAccess","vs/editor/standalone/browser/quickAccess/standaloneHelpQuickAccess","vs/platform/quickinput/browser/quickAccess","vs/platform/severityIcon/browser/severityIcon","vs/editor/contrib/codelens/browser/codeLensCache","vs/platform/actions/common/menuService","vs/editor/browser/services/markerDecorations","vs/editor/browser/view/viewController","vs/editor/browser/widget/diffEditor/diffProviderFactoryService","vs/editor/contrib/anchorSelect/browser/anchorSelect","vs/editor/contrib/caretOperations/browser/caretOperations","vs/editor/contrib/caretOperations/browser/transpose","vs/editor/contrib/comment/browser/comment","vs/editor/contrib/cursorUndo/browser/cursorUndo","vs/editor/contrib/editorState/browser/keybindingCancellation","vs/editor/contrib/codeAction/browser/codeActionKeybindingResolver","vs/editor/contrib/fontZoom/browser/fontZoom","vs/editor/contrib/format/browser/formatActions","vs/editor/contrib/gotoSymbol/browser/symbolNavigation","vs/editor/contrib/indentation/browser/indentation","vs/editor/contrib/lineSelection/browser/lineSelection","vs/editor/contrib/linesOperations/browser/linesOperations","vs/editor/contrib/longLinesHelper/browser/longLinesHelper","vs/editor/contrib/readOnlyMessage/browser/contribution","vs/editor/contrib/smartSelect/browser/smartSelect","vs/editor/contrib/tokenization/browser/tokenization","vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators","vs/editor/contrib/wordPartOperations/browser/wordPartOperations","vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard","vs/editor/standalone/browser/inspectTokens/inspectTokens","vs/platform/quickinput/browser/commandsQuickAccess","vs/editor/contrib/quickAccess/browser/commandsQuickAccess","vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess","vs/editor/browser/viewParts/minimap/minimap","vs/editor/browser/widget/multiDiffEditorWidget/colors","vs/editor/contrib/codeAction/browser/codeActionMenu","vs/editor/contrib/gotoSymbol/browser/peek/referencesTree","vs/platform/actionWidget/browser/actionList","vs/platform/actionWidget/browser/actionWidget","vs/platform/contextview/browser/contextMenuHandler","vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer","vs/editor/contrib/colorPicker/browser/colorPickerWidget","vs/editor/contrib/parameterHints/browser/parameterHintsWidget","vs/editor/contrib/parameterHints/browser/parameterHints","vs/editor/contrib/unicodeHighlighter/browser/bannerController","vs/platform/theme/browser/iconsStyleSheet","vs/editor/browser/controller/mouseHandler","vs/editor/browser/controller/pointerHandler","vs/editor/browser/viewParts/lines/viewLines","vs/platform/quickinput/browser/quickInputController","vs/editor/browser/services/abstractCodeEditorService","vs/editor/browser/services/hoverService","vs/editor/browser/viewParts/editorScrollbar/editorScrollbar","vs/editor/browser/viewParts/selections/selections","vs/editor/browser/widget/diffEditor/components/diffEditorEditors","vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight","vs/editor/browser/viewParts/indentGuides/indentGuides","vs/editor/browser/controller/textAreaHandler","vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler","vs/editor/browser/viewParts/viewCursors/viewCursors","vs/editor/browser/viewParts/whitespace/whitespace","vs/editor/browser/view","vs/editor/common/model/bracketPairsTextModelPart/colorizedBracketPairsDecorationProvider","vs/editor/common/services/markerDecorationsService","vs/editor/common/services/semanticTokensStylingService","vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess","vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess","vs/editor/contrib/rename/browser/renameInputField","vs/editor/contrib/rename/browser/rename","vs/editor/contrib/semanticTokens/browser/documentSemanticTokens","vs/editor/contrib/semanticTokens/browser/viewportSemanticTokens","vs/editor/contrib/suggest/browser/suggestWidgetRenderer","vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess","vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess","vs/editor/standalone/common/themes","vs/editor/standalone/browser/toggleHighContrast/toggleHighContrast","vs/editor/contrib/suggest/browser/suggestWidgetStatus","vs/platform/contextview/browser/contextMenuService","vs/platform/quickinput/browser/quickInputService","vs/editor/standalone/browser/quickInput/standaloneQuickInputService","vs/editor/browser/widget/diffEditor/components/diffEditorDecorations","vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/diffEditorViewZones","vs/editor/common/services/modelService","vs/editor/common/viewModel/viewModelLines","vs/editor/common/viewModel/viewModelImpl","vs/editor/browser/widget/diffEditor/diffEditor.contribution","vs/editor/browser/widget/multiDiffEditorWidget/multiDiffEditorWidgetImpl","vs/editor/browser/widget/multiDiffEditorWidget/multiDiffEditorWidget","vs/editor/contrib/bracketMatching/browser/bracketMatching","vs/editor/contrib/codeAction/browser/codeActionCommands","vs/editor/contrib/codeAction/browser/codeActionContributions","vs/editor/contrib/codelens/browser/codelensWidget","vs/editor/contrib/codelens/browser/codelensController","vs/editor/contrib/dnd/browser/dnd","vs/editor/contrib/find/browser/findDecorations","vs/editor/contrib/find/browser/findOptionsWidget","vs/editor/contrib/find/browser/findState","vs/editor/contrib/find/browser/findWidget","vs/editor/contrib/colorPicker/browser/standaloneColorPickerWidget","vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions","vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace","vs/editor/contrib/clipboard/browser/clipboard","vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController","vs/editor/contrib/linkedEditing/browser/linkedEditing","vs/editor/contrib/links/browser/links","vs/editor/contrib/stickyScroll/browser/stickyScrollModelProvider","vs/editor/contrib/stickyScroll/browser/stickyScrollProvider","vs/editor/contrib/stickyScroll/browser/stickyScrollWidget","vs/editor/contrib/suggest/browser/suggestWidget","vs/editor/contrib/multicursor/browser/multicursor","vs/editor/contrib/wordHighlighter/browser/wordHighlighter","vs/editor/contrib/zoneWidget/browser/zoneWidget","vs/editor/contrib/gotoError/browser/gotoErrorWidget","vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget","vs/editor/contrib/hover/browser/markerHoverParticipant","vs/editor/contrib/colorPicker/browser/colorContributions","vs/editor/contrib/inlayHints/browser/inlayHintsHover","vs/editor/contrib/inlayHints/browser/inlayHintsContribution","vs/editor/contrib/stickyScroll/browser/stickyScrollActions","vs/editor/contrib/stickyScroll/browser/stickyScrollContribution","vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch","vs/platform/undoRedo/common/undoRedoService","vs/editor/contrib/contextmenu/browser/contextmenu","vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution","vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution","vs/editor/contrib/snippet/browser/snippetVariables","vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel","vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider","vs/editor/contrib/inlineCompletions/browser/commands","vs/editor/contrib/inlineCompletions/browser/hoverParticipant","vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution","vs/editor/contrib/suggest/browser/suggestInlineCompletions","vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter","vs/editor/editor.all","vs/editor/standalone/browser/standaloneCodeEditor","vs/editor/standalone/browser/standaloneEditor","vs/editor/standalone/browser/standaloneLanguages","vs/editor/editor.api","vs/css","vs/editor/edcore.main"],oe=function(te){for(var e=[],L=0,k=te.length;L<k;L++)e[L]=se[te[L]];return e};define(se[939],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.load=void 0;function L(p,_,v,b){if(b=b||{},(b["vs/css"]||{}).disabled){v({});return}const i=_.toUrl(p+".css");k(p,i,()=>{v({})},n=>{typeof v.error=="function"&&v.error("Could not find "+i+".")})}e.load=L;function k(p,_,v,b){if(y(p,_)){v();return}E(p,_,v,b)}function y(p,_){const v=window.document.getElementsByTagName("link");for(let b=0,a=v.length;b<a;b++){const i=v[b].getAttribute("data-name"),n=v[b].getAttribute("href");if(i===p||n===_)return!0}return!1}function E(p,_,v,b){const a=document.createElement("link");a.setAttribute("rel","stylesheet"),a.setAttribute("type","text/css"),a.setAttribute("data-name",p),S(p,a,v,b),a.setAttribute("href",_),(window.document.head||window.document.getElementsByTagName("head")[0]).appendChild(a)}function S(p,_,v,b){const a=()=>{_.removeEventListener("load",i),_.removeEventListener("error",n)},i=t=>{a(),v()},n=t=>{a(),b(t)};_.addEventListener("load",i),_.addEventListener("error",n)}}),define(se[3],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.load=e.create=e.setPseudoTranslation=e.getConfiguredDefaultLocale=e.localize2=e.localize=void 0;let L=typeof document<"u"&&document.location&&document.location.hash.indexOf("pseudo=true")>=0;const k="i-default";function y(u,f){let c;return f.length===0?c=u:c=u.replace(/\{(\d+)\}/g,(d,s)=>{const l=s[0],o=f[l];let g=d;return typeof o=="string"?g=o:(typeof o=="number"||typeof o=="boolean"||o===void 0||o===null)&&(g=String(o)),g}),L&&(c="\uFF3B"+c.replace(/[aouei]/g,"$&$&")+"\uFF3D"),c}function E(u,f){let c=u[f];return c||(c=u["*"],c)?c:null}function S(u){return u.charAt(u.length-1)==="/"?u:u+"/"}async function p(u,f,c){const d=S(u)+S(f)+"vscode/"+S(c),s=await fetch(d);if(s.ok)return await s.json();throw new Error(`${s.status} - ${s.statusText}`)}function _(u){return function(f,c){const d=Array.prototype.slice.call(arguments,2);return y(u[f],d)}}function v(u){return(f,c,...d)=>({value:y(u[f],d),original:y(c,d)})}function b(u,f,...c){return y(f,c)}e.localize=b;function a(u,f,...c){const d=y(f,c);return{value:d,original:d}}e.localize2=a;function i(u){}e.getConfiguredDefaultLocale=i;function n(u){L=u}e.setPseudoTranslation=n;function t(u,f){var c;return{localize:_(f[u]),localize2:v(f[u]),getConfiguredDefaultLocale:(c=f.getConfiguredDefaultLocale)!==null&&c!==void 0?c:d=>{}}}e.create=t;function r(u,f,c,d){var s;const l=(s=d["vs/nls"])!==null&&s!==void 0?s:{};if(!u||u.length===0)return c({localize:b,localize2:a,getConfiguredDefaultLocale:()=>{var C;return(C=l.availableLanguages)===null||C===void 0?void 0:C["*"]}});const o=l.availableLanguages?E(l.availableLanguages,u):null,g=o===null||o===k;let h=".nls";g||(h=h+"."+o);const m=C=>{Array.isArray(C)?(C.localize=_(C),C.localize2=v(C)):(C.localize=_(C[u]),C.localize2=v(C[u])),C.getConfiguredDefaultLocale=()=>{var w;return(w=l.availableLanguages)===null||w===void 0?void 0:w["*"]},c(C)};typeof l.loadBundle=="function"?l.loadBundle(u,o,(C,w)=>{C?f([u+".nls"],m):m(w)}):l.translationServiceUrl&&!g?(async()=>{var C;try{const w=await p(l.translationServiceUrl,o,u);return m(w)}catch(w){if(!o.includes("-"))return console.error(w),f([u+".nls"],m);try{const D=o.split("-")[0],I=await p(l.translationServiceUrl,D,u);return(C=l.availableLanguages)!==null&&C!==void 0||(l.availableLanguages={}),l.availableLanguages["*"]=D,m(I)}catch(D){return console.error(D),f([u+".nls"],m)}}})():f([u+h],m,C=>{if(h===".nls"){console.error("Failed trying to load default language strings",C);return}console.error(`Failed to load message bundle for language ${o}. Falling back to the default language:`,C),f([u+".nls"],m)})}e.load=r});/*! @license DOMPurify 3.0.5 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.0.5/LICENSE */const{entries:Bt,setPrototypeOf:Wt,isFrozen:Zt,getPrototypeOf:Yt,getOwnPropertyDescriptor:Qt}=Object;let{freeze:gt,seal:bt,create:Xt}=Object,{apply:Nt,construct:At}=typeof Reflect<"u"&&Reflect;Nt||(Nt=function(e,L,k){return e.apply(L,k)}),gt||(gt=function(e){return e}),bt||(bt=function(e){return e}),At||(At=function(e,L){return new e(...L)});const Jt=Ct(Array.prototype.forEach),Vt=Ct(Array.prototype.pop),Et=Ct(Array.prototype.push),kt=Ct(String.prototype.toLowerCase),Rt=Ct(String.prototype.toString),ei=Ct(String.prototype.match),_t=Ct(String.prototype.replace),ti=Ct(String.prototype.indexOf),ii=Ct(String.prototype.trim),vt=Ct(RegExp.prototype.test),It=ni(TypeError);function Ct(te){return function(e){for(var L=arguments.length,k=new Array(L>1?L-1:0),y=1;y<L;y++)k[y-1]=arguments[y];return Nt(te,e,k)}}function ni(te){return function(){for(var e=arguments.length,L=new Array(e),k=0;k<e;k++)L[k]=arguments[k];return At(te,L)}}function Ye(te,e,L){var k;L=(k=L)!==null&&k!==void 0?k:kt,Wt&&Wt(te,null);let y=e.length;for(;y--;){let E=e[y];if(typeof E=="string"){const S=L(E);S!==E&&(Zt(e)||(e[y]=S),E=S)}te[E]=!0}return te}function Lt(te){const e=Xt(null);for(const[L,k]of Bt(te))e[L]=k;return e}function Tt(te,e){for(;te!==null;){const k=Qt(te,e);if(k){if(k.get)return Ct(k.get);if(typeof k.value=="function")return Ct(k.value)}te=Yt(te)}function L(k){return console.warn("fallback value for",k),null}return L}const zt=gt(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),Pt=gt(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),Ot=gt(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),si=gt(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),Ft=gt(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),oi=gt(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),Ht=gt(["#text"]),Ut=gt(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),xt=gt(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),Kt=gt(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),Mt=gt(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),ri=bt(/\{\{[\w\W]*|[\w\W]*\}\}/gm),ai=bt(/<%[\w\W]*|[\w\W]*%>/gm),li=bt(/\${[\w\W]*}/gm),di=bt(/^data-[\-\w.\u00B7-\uFFFF]/),ci=bt(/^aria-[\-\w]+$/),qt=bt(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ui=bt(/^(?:\w+script|data):/i),hi=bt(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),jt=bt(/^html$/i);var $t=Object.freeze({__proto__:null,MUSTACHE_EXPR:ri,ERB_EXPR:ai,TMPLIT_EXPR:li,DATA_ATTR:di,ARIA_ATTR:ci,IS_ALLOWED_URI:qt,IS_SCRIPT_OR_DATA:ui,ATTR_WHITESPACE:hi,DOCTYPE_NAME:jt});const gi=()=>typeof window>"u"?null:window,fi=function(e,L){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let k=null;const y="data-tt-policy-suffix";L&&L.hasAttribute(y)&&(k=L.getAttribute(y));const E="dompurify"+(k?"#"+k:"");try{return e.createPolicy(E,{createHTML(S){return S},createScriptURL(S){return S}})}catch{return console.warn("TrustedTypes policy "+E+" could not be created."),null}};function Gt(){let te=arguments.length>0&&arguments[0]!==void 0?arguments[0]:gi();const e=Te=>Gt(Te);if(e.version="3.0.5",e.removed=[],!te||!te.document||te.document.nodeType!==9)return e.isSupported=!1,e;const L=te.document,k=L.currentScript;let{document:y}=te;const{DocumentFragment:E,HTMLTemplateElement:S,Node:p,Element:_,NodeFilter:v,NamedNodeMap:b=te.NamedNodeMap||te.MozNamedAttrMap,HTMLFormElement:a,DOMParser:i,trustedTypes:n}=te,t=_.prototype,r=Tt(t,"cloneNode"),u=Tt(t,"nextSibling"),f=Tt(t,"childNodes"),c=Tt(t,"parentNode");if(typeof S=="function"){const Te=y.createElement("template");Te.content&&Te.content.ownerDocument&&(y=Te.content.ownerDocument)}let d,s="";const{implementation:l,createNodeIterator:o,createDocumentFragment:g,getElementsByTagName:h}=y,{importNode:m}=L;let C={};e.isSupported=typeof Bt=="function"&&typeof c=="function"&&l&&l.createHTMLDocument!==void 0;const{MUSTACHE_EXPR:w,ERB_EXPR:D,TMPLIT_EXPR:I,DATA_ATTR:T,ARIA_ATTR:A,IS_SCRIPT_OR_DATA:P,ATTR_WHITESPACE:N}=$t;let{IS_ALLOWED_URI:M}=$t,R=null;const x=Ye({},[...zt,...Pt,...Ot,...Ft,...Ht]);let O=null;const B=Ye({},[...Ut,...xt,...Kt,...Mt]);let W=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),V=null,K=null,F=!0,q=!0,ie=!1,ae=!0,ne=!1,$=!1,J=!1,Q=!1,re=!1,de=!1,he=!1,me=!0,X=!1;const U="user-content-";let G=!0,z=!1,H={},Y=null;const j=Ye({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Z=null;const ee=Ye({},["audio","video","img","source","image","track"]);let le=null;const ue=Ye({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ce="http://www.w3.org/1998/Math/MathML",pe="http://www.w3.org/2000/svg",ve="http://www.w3.org/1999/xhtml";let Ce=ve,Se=!1,_e=null;const Ee=Ye({},[ce,pe,ve],Rt);let Ae;const xe=["application/xhtml+xml","text/html"],Be="text/html";let De,Ie=null;const fe=y.createElement("form"),be=function(we){return we instanceof RegExp||we instanceof Function},Ne=function(we){if(!(Ie&&Ie===we)){if((!we||typeof we!="object")&&(we={}),we=Lt(we),Ae=xe.indexOf(we.PARSER_MEDIA_TYPE)===-1?Ae=Be:Ae=we.PARSER_MEDIA_TYPE,De=Ae==="application/xhtml+xml"?Rt:kt,R="ALLOWED_TAGS"in we?Ye({},we.ALLOWED_TAGS,De):x,O="ALLOWED_ATTR"in we?Ye({},we.ALLOWED_ATTR,De):B,_e="ALLOWED_NAMESPACES"in we?Ye({},we.ALLOWED_NAMESPACES,Rt):Ee,le="ADD_URI_SAFE_ATTR"in we?Ye(Lt(ue),we.ADD_URI_SAFE_ATTR,De):ue,Z="ADD_DATA_URI_TAGS"in we?Ye(Lt(ee),we.ADD_DATA_URI_TAGS,De):ee,Y="FORBID_CONTENTS"in we?Ye({},we.FORBID_CONTENTS,De):j,V="FORBID_TAGS"in we?Ye({},we.FORBID_TAGS,De):{},K="FORBID_ATTR"in we?Ye({},we.FORBID_ATTR,De):{},H="USE_PROFILES"in we?we.USE_PROFILES:!1,F=we.ALLOW_ARIA_ATTR!==!1,q=we.ALLOW_DATA_ATTR!==!1,ie=we.ALLOW_UNKNOWN_PROTOCOLS||!1,ae=we.ALLOW_SELF_CLOSE_IN_ATTR!==!1,ne=we.SAFE_FOR_TEMPLATES||!1,$=we.WHOLE_DOCUMENT||!1,re=we.RETURN_DOM||!1,de=we.RETURN_DOM_FRAGMENT||!1,he=we.RETURN_TRUSTED_TYPE||!1,Q=we.FORCE_BODY||!1,me=we.SANITIZE_DOM!==!1,X=we.SANITIZE_NAMED_PROPS||!1,G=we.KEEP_CONTENT!==!1,z=we.IN_PLACE||!1,M=we.ALLOWED_URI_REGEXP||qt,Ce=we.NAMESPACE||ve,W=we.CUSTOM_ELEMENT_HANDLING||{},we.CUSTOM_ELEMENT_HANDLING&&be(we.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(W.tagNameCheck=we.CUSTOM_ELEMENT_HANDLING.tagNameCheck),we.CUSTOM_ELEMENT_HANDLING&&be(we.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(W.attributeNameCheck=we.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),we.CUSTOM_ELEMENT_HANDLING&&typeof we.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(W.allowCustomizedBuiltInElements=we.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),ne&&(q=!1),de&&(re=!0),H&&(R=Ye({},[...Ht]),O=[],H.html===!0&&(Ye(R,zt),Ye(O,Ut)),H.svg===!0&&(Ye(R,Pt),Ye(O,xt),Ye(O,Mt)),H.svgFilters===!0&&(Ye(R,Ot),Ye(O,xt),Ye(O,Mt)),H.mathMl===!0&&(Ye(R,Ft),Ye(O,Kt),Ye(O,Mt))),we.ADD_TAGS&&(R===x&&(R=Lt(R)),Ye(R,we.ADD_TAGS,De)),we.ADD_ATTR&&(O===B&&(O=Lt(O)),Ye(O,we.ADD_ATTR,De)),we.ADD_URI_SAFE_ATTR&&Ye(le,we.ADD_URI_SAFE_ATTR,De),we.FORBID_CONTENTS&&(Y===j&&(Y=Lt(Y)),Ye(Y,we.FORBID_CONTENTS,De)),G&&(R["#text"]=!0),$&&Ye(R,["html","head","body"]),R.table&&(Ye(R,["tbody"]),delete V.tbody),we.TRUSTED_TYPES_POLICY){if(typeof we.TRUSTED_TYPES_POLICY.createHTML!="function")throw It('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof we.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw It('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');d=we.TRUSTED_TYPES_POLICY,s=d.createHTML("")}else d===void 0&&(d=fi(n,k)),d!==null&&typeof s=="string"&&(s=d.createHTML(""));gt&&gt(we),Ie=we}},Pe=Ye({},["mi","mo","mn","ms","mtext"]),ze=Ye({},["foreignobject","desc","title","annotation-xml"]),Ke=Ye({},["title","style","font","a","script"]),je=Ye({},Pt);Ye(je,Ot),Ye(je,si);const Je=Ye({},Ft);Ye(Je,oi);const rt=function(we){let Re=c(we);(!Re||!Re.tagName)&&(Re={namespaceURI:Ce,tagName:"template"});const Oe=kt(we.tagName),Ve=kt(Re.tagName);return _e[we.namespaceURI]?we.namespaceURI===pe?Re.namespaceURI===ve?Oe==="svg":Re.namespaceURI===ce?Oe==="svg"&&(Ve==="annotation-xml"||Pe[Ve]):!!je[Oe]:we.namespaceURI===ce?Re.namespaceURI===ve?Oe==="math":Re.namespaceURI===pe?Oe==="math"&&ze[Ve]:!!Je[Oe]:we.namespaceURI===ve?Re.namespaceURI===pe&&!ze[Ve]||Re.namespaceURI===ce&&!Pe[Ve]?!1:!Je[Oe]&&(Ke[Oe]||!je[Oe]):!!(Ae==="application/xhtml+xml"&&_e[we.namespaceURI]):!1},et=function(we){Et(e.removed,{element:we});try{we.parentNode.removeChild(we)}catch{we.remove()}},st=function(we,Re){try{Et(e.removed,{attribute:Re.getAttributeNode(we),from:Re})}catch{Et(e.removed,{attribute:null,from:Re})}if(Re.removeAttribute(we),we==="is"&&!O[we])if(re||de)try{et(Re)}catch{}else try{Re.setAttribute(we,"")}catch{}},Qe=function(we){let Re,Oe;if(Q)we="<remove></remove>"+we;else{const Ze=ei(we,/^[\r\n\t ]+/);Oe=Ze&&Ze[0]}Ae==="application/xhtml+xml"&&Ce===ve&&(we='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+we+"</body></html>");const Ve=d?d.createHTML(we):we;if(Ce===ve)try{Re=new i().parseFromString(Ve,Ae)}catch{}if(!Re||!Re.documentElement){Re=l.createDocument(Ce,"template",null);try{Re.documentElement.innerHTML=Se?s:Ve}catch{}}const $e=Re.body||Re.documentElement;return we&&Oe&&$e.insertBefore(y.createTextNode(Oe),$e.childNodes[0]||null),Ce===ve?h.call(Re,$?"html":"body")[0]:$?Re.documentElement:$e},ft=function(we){return o.call(we.ownerDocument||we,we,v.SHOW_ELEMENT|v.SHOW_COMMENT|v.SHOW_TEXT,null,!1)},at=function(we){return we instanceof a&&(typeof we.nodeName!="string"||typeof we.textContent!="string"||typeof we.removeChild!="function"||!(we.attributes instanceof b)||typeof we.removeAttribute!="function"||typeof we.setAttribute!="function"||typeof we.namespaceURI!="string"||typeof we.insertBefore!="function"||typeof we.hasChildNodes!="function")},ct=function(we){return typeof p=="object"?we instanceof p:we&&typeof we=="object"&&typeof we.nodeType=="number"&&typeof we.nodeName=="string"},lt=function(we,Re,Oe){C[we]&&Jt(C[we],Ve=>{Ve.call(e,Re,Oe,Ie)})},mt=function(we){let Re;if(lt("beforeSanitizeElements",we,null),at(we))return et(we),!0;const Oe=De(we.nodeName);if(lt("uponSanitizeElement",we,{tagName:Oe,allowedTags:R}),we.hasChildNodes()&&!ct(we.firstElementChild)&&(!ct(we.content)||!ct(we.content.firstElementChild))&&vt(/<[/\w]/g,we.innerHTML)&&vt(/<[/\w]/g,we.textContent))return et(we),!0;if(!R[Oe]||V[Oe]){if(!V[Oe]&&Le(Oe)&&(W.tagNameCheck instanceof RegExp&&vt(W.tagNameCheck,Oe)||W.tagNameCheck instanceof Function&&W.tagNameCheck(Oe)))return!1;if(G&&!Y[Oe]){const Ve=c(we)||we.parentNode,$e=f(we)||we.childNodes;if($e&&Ve){const Ze=$e.length;for(let Ge=Ze-1;Ge>=0;--Ge)Ve.insertBefore(r($e[Ge],!0),u(we))}}return et(we),!0}return we instanceof _&&!rt(we)||(Oe==="noscript"||Oe==="noembed"||Oe==="noframes")&&vt(/<\/no(script|embed|frames)/i,we.innerHTML)?(et(we),!0):(ne&&we.nodeType===3&&(Re=we.textContent,Re=_t(Re,w," "),Re=_t(Re,D," "),Re=_t(Re,I," "),we.textContent!==Re&&(Et(e.removed,{element:we.cloneNode()}),we.textContent=Re)),lt("afterSanitizeElements",we,null),!1)},pt=function(we,Re,Oe){if(me&&(Re==="id"||Re==="name")&&(Oe in y||Oe in fe))return!1;if(!(q&&!K[Re]&&vt(T,Re))){if(!(F&&vt(A,Re))){if(!O[Re]||K[Re]){if(!(Le(we)&&(W.tagNameCheck instanceof RegExp&&vt(W.tagNameCheck,we)||W.tagNameCheck instanceof Function&&W.tagNameCheck(we))&&(W.attributeNameCheck instanceof RegExp&&vt(W.attributeNameCheck,Re)||W.attributeNameCheck instanceof Function&&W.attributeNameCheck(Re))||Re==="is"&&W.allowCustomizedBuiltInElements&&(W.tagNameCheck instanceof RegExp&&vt(W.tagNameCheck,Oe)||W.tagNameCheck instanceof Function&&W.tagNameCheck(Oe))))return!1}else if(!le[Re]){if(!vt(M,_t(Oe,N,""))){if(!((Re==="src"||Re==="xlink:href"||Re==="href")&&we!=="script"&&ti(Oe,"data:")===0&&Z[we])){if(!(ie&&!vt(P,_t(Oe,N,"")))){if(Oe)return!1}}}}}}return!0},Le=function(we){return we.indexOf("-")>0},ye=function(we){let Re,Oe,Ve,$e;lt("beforeSanitizeAttributes",we,null);const{attributes:Ze}=we;if(!Ze)return;const Ge={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:O};for($e=Ze.length;$e--;){Re=Ze[$e];const{name:qe,namespaceURI:Fe}=Re;if(Oe=qe==="value"?Re.value:ii(Re.value),Ve=De(qe),Ge.attrName=Ve,Ge.attrValue=Oe,Ge.keepAttr=!0,Ge.forceKeepAttr=void 0,lt("uponSanitizeAttribute",we,Ge),Oe=Ge.attrValue,Ge.forceKeepAttr||(st(qe,we),!Ge.keepAttr))continue;if(!ae&&vt(/\/>/i,Oe)){st(qe,we);continue}ne&&(Oe=_t(Oe,w," "),Oe=_t(Oe,D," "),Oe=_t(Oe,I," "));const We=De(we.nodeName);if(pt(We,Ve,Oe)){if(X&&(Ve==="id"||Ve==="name")&&(st(qe,we),Oe=U+Oe),d&&typeof n=="object"&&typeof n.getAttributeType=="function"&&!Fe)switch(n.getAttributeType(We,Ve)){case"TrustedHTML":{Oe=d.createHTML(Oe);break}case"TrustedScriptURL":{Oe=d.createScriptURL(Oe);break}}try{Fe?we.setAttributeNS(Fe,qe,Oe):we.setAttribute(qe,Oe),Vt(e.removed)}catch{}}}lt("afterSanitizeAttributes",we,null)},Me=function Te(we){let Re;const Oe=ft(we);for(lt("beforeSanitizeShadowDOM",we,null);Re=Oe.nextNode();)lt("uponSanitizeShadowNode",Re,null),!mt(Re)&&(Re.content instanceof E&&Te(Re.content),ye(Re));lt("afterSanitizeShadowDOM",we,null)};return e.sanitize=function(Te){let we=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},Re,Oe,Ve,$e;if(Se=!Te,Se&&(Te="<!-->"),typeof Te!="string"&&!ct(Te))if(typeof Te.toString=="function"){if(Te=Te.toString(),typeof Te!="string")throw It("dirty is not a string, aborting")}else throw It("toString is not a function");if(!e.isSupported)return Te;if(J||Ne(we),e.removed=[],typeof Te=="string"&&(z=!1),z){if(Te.nodeName){const qe=De(Te.nodeName);if(!R[qe]||V[qe])throw It("root node is forbidden and cannot be sanitized in-place")}}else if(Te instanceof p)Re=Qe("<!---->"),Oe=Re.ownerDocument.importNode(Te,!0),Oe.nodeType===1&&Oe.nodeName==="BODY"||Oe.nodeName==="HTML"?Re=Oe:Re.appendChild(Oe);else{if(!re&&!ne&&!$&&Te.indexOf("<")===-1)return d&&he?d.createHTML(Te):Te;if(Re=Qe(Te),!Re)return re?null:he?s:""}Re&&Q&&et(Re.firstChild);const Ze=ft(z?Te:Re);for(;Ve=Ze.nextNode();)mt(Ve)||(Ve.content instanceof E&&Me(Ve.content),ye(Ve));if(z)return Te;if(re){if(de)for($e=g.call(Re.ownerDocument);Re.firstChild;)$e.appendChild(Re.firstChild);else $e=Re;return(O.shadowroot||O.shadowrootmode)&&($e=m.call(L,$e,!0)),$e}let Ge=$?Re.outerHTML:Re.innerHTML;return $&&R["!doctype"]&&Re.ownerDocument&&Re.ownerDocument.doctype&&Re.ownerDocument.doctype.name&&vt(jt,Re.ownerDocument.doctype.name)&&(Ge="<!DOCTYPE "+Re.ownerDocument.doctype.name+`>
+`+Ge),ne&&(Ge=_t(Ge,w," "),Ge=_t(Ge,D," "),Ge=_t(Ge,I," ")),d&&he?d.createHTML(Ge):Ge},e.setConfig=function(Te){Ne(Te),J=!0},e.clearConfig=function(){Ie=null,J=!1},e.isValidAttribute=function(Te,we,Re){Ie||Ne({});const Oe=De(Te),Ve=De(we);return pt(Oe,Ve,Re)},e.addHook=function(Te,we){typeof we=="function"&&(C[Te]=C[Te]||[],Et(C[Te],we))},e.removeHook=function(Te){if(C[Te])return Vt(C[Te])},e.removeHooks=function(Te){C[Te]&&(C[Te]=[])},e.removeAllHooks=function(){C={}},e}var mi=Gt();define("vs/base/browser/dompurify/dompurify",function(){return mi}),define(se[40],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createFastDomNode=e.FastDomNode=void 0;class L{constructor(S){this.domNode=S,this._maxWidth="",this._width="",this._height="",this._top="",this._left="",this._bottom="",this._right="",this._paddingLeft="",this._fontFamily="",this._fontWeight="",this._fontSize="",this._fontStyle="",this._fontFeatureSettings="",this._fontVariationSettings="",this._textDecoration="",this._lineHeight="",this._letterSpacing="",this._className="",this._display="",this._position="",this._visibility="",this._color="",this._backgroundColor="",this._layerHint=!1,this._contain="none",this._boxShadow=""}setMaxWidth(S){const p=k(S);this._maxWidth!==p&&(this._maxWidth=p,this.domNode.style.maxWidth=this._maxWidth)}setWidth(S){const p=k(S);this._width!==p&&(this._width=p,this.domNode.style.width=this._width)}setHeight(S){const p=k(S);this._height!==p&&(this._height=p,this.domNode.style.height=this._height)}setTop(S){const p=k(S);this._top!==p&&(this._top=p,this.domNode.style.top=this._top)}setLeft(S){const p=k(S);this._left!==p&&(this._left=p,this.domNode.style.left=this._left)}setBottom(S){const p=k(S);this._bottom!==p&&(this._bottom=p,this.domNode.style.bottom=this._bottom)}setRight(S){const p=k(S);this._right!==p&&(this._right=p,this.domNode.style.right=this._right)}setPaddingLeft(S){const p=k(S);this._paddingLeft!==p&&(this._paddingLeft=p,this.domNode.style.paddingLeft=this._paddingLeft)}setFontFamily(S){this._fontFamily!==S&&(this._fontFamily=S,this.domNode.style.fontFamily=this._fontFamily)}setFontWeight(S){this._fontWeight!==S&&(this._fontWeight=S,this.domNode.style.fontWeight=this._fontWeight)}setFontSize(S){const p=k(S);this._fontSize!==p&&(this._fontSize=p,this.domNode.style.fontSize=this._fontSize)}setFontStyle(S){this._fontStyle!==S&&(this._fontStyle=S,this.domNode.style.fontStyle=this._fontStyle)}setFontFeatureSettings(S){this._fontFeatureSettings!==S&&(this._fontFeatureSettings=S,this.domNode.style.fontFeatureSettings=this._fontFeatureSettings)}setFontVariationSettings(S){this._fontVariationSettings!==S&&(this._fontVariationSettings=S,this.domNode.style.fontVariationSettings=this._fontVariationSettings)}setTextDecoration(S){this._textDecoration!==S&&(this._textDecoration=S,this.domNode.style.textDecoration=this._textDecoration)}setLineHeight(S){const p=k(S);this._lineHeight!==p&&(this._lineHeight=p,this.domNode.style.lineHeight=this._lineHeight)}setLetterSpacing(S){const p=k(S);this._letterSpacing!==p&&(this._letterSpacing=p,this.domNode.style.letterSpacing=this._letterSpacing)}setClassName(S){this._className!==S&&(this._className=S,this.domNode.className=this._className)}toggleClassName(S,p){this.domNode.classList.toggle(S,p),this._className=this.domNode.className}setDisplay(S){this._display!==S&&(this._display=S,this.domNode.style.display=this._display)}setPosition(S){this._position!==S&&(this._position=S,this.domNode.style.position=this._position)}setVisibility(S){this._visibility!==S&&(this._visibility=S,this.domNode.style.visibility=this._visibility)}setColor(S){this._color!==S&&(this._color=S,this.domNode.style.color=this._color)}setBackgroundColor(S){this._backgroundColor!==S&&(this._backgroundColor=S,this.domNode.style.backgroundColor=this._backgroundColor)}setLayerHinting(S){this._layerHint!==S&&(this._layerHint=S,this.domNode.style.transform=this._layerHint?"translate3d(0px, 0px, 0px)":"")}setBoxShadow(S){this._boxShadow!==S&&(this._boxShadow=S,this.domNode.style.boxShadow=S)}setContain(S){this._contain!==S&&(this._contain=S,this.domNode.style.contain=this._contain)}setAttribute(S,p){this.domNode.setAttribute(S,p)}removeAttribute(S){this.domNode.removeAttribute(S)}appendChild(S){this.domNode.appendChild(S.domNode)}removeChild(S){this.domNode.removeChild(S.domNode)}}e.FastDomNode=L;function k(E){return typeof E=="number"?`${E}px`:E}function y(E){return new L(E)}e.createFastDomNode=y}),define(se[394],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IframeUtils=void 0;const L=new WeakMap;function k(E){if(!E.parent||E.parent===E)return null;try{const S=E.location,p=E.parent.location;if(S.origin!=="null"&&p.origin!=="null"&&S.origin!==p.origin)return null}catch{return null}return E.parent}class y{static getSameOriginWindowChain(S){let p=L.get(S);if(!p){p=[],L.set(S,p);let _=S,v;do v=k(_),v?p.push({window:new WeakRef(_),iframeElement:_.frameElement||null}):p.push({window:new WeakRef(_),iframeElement:null}),_=v;while(_)}return p.slice(0)}static getPositionOfChildWindowRelativeToAncestorWindow(S,p){var _,v;if(!p||S===p)return{top:0,left:0};let b=0,a=0;const i=this.getSameOriginWindowChain(S);for(const n of i){const t=n.window.deref();if(b+=(_=t?.scrollY)!==null&&_!==void 0?_:0,a+=(v=t?.scrollX)!==null&&v!==void 0?v:0,t===p||!n.iframeElement)break;const r=n.iframeElement.getBoundingClientRect();b+=r.top,a+=r.left}return{top:b,left:a}}}e.IframeUtils=y}),define(se[266],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.inputLatency=void 0;var L;(function(k){const y={total:0,min:Number.MAX_VALUE,max:0},E={...y},S={...y},p={...y};let _=0;const v={keydown:0,input:0,render:0};function b(){s(),performance.mark("inputlatency/start"),performance.mark("keydown/start"),v.keydown=1,queueMicrotask(a)}k.onKeyDown=b;function a(){v.keydown===1&&(performance.mark("keydown/end"),v.keydown=2)}function i(){performance.mark("input/start"),v.input=1,d()}k.onBeforeInput=i;function n(){v.input===0&&i(),queueMicrotask(t)}k.onInput=n;function t(){v.input===1&&(performance.mark("input/end"),v.input=2)}function r(){s()}k.onKeyUp=r;function u(){s()}k.onSelectionChange=u;function f(){v.keydown===2&&v.input===2&&v.render===0&&(performance.mark("render/start"),v.render=1,queueMicrotask(c),d())}k.onRenderStart=f;function c(){v.render===1&&(performance.mark("render/end"),v.render=2)}function d(){setTimeout(s)}function s(){v.keydown===2&&v.input===2&&v.render===2&&(performance.mark("inputlatency/end"),performance.measure("keydown","keydown/start","keydown/end"),performance.measure("input","input/start","input/end"),performance.measure("render","render/start","render/end"),performance.measure("inputlatency","inputlatency/start","inputlatency/end"),l("keydown",y),l("input",E),l("render",S),l("inputlatency",p),_++,o())}function l(C,w){const D=performance.getEntriesByName(C)[0].duration;w.total+=D,w.min=Math.min(w.min,D),w.max=Math.max(w.max,D)}function o(){performance.clearMarks("keydown/start"),performance.clearMarks("keydown/end"),performance.clearMarks("input/start"),performance.clearMarks("input/end"),performance.clearMarks("render/start"),performance.clearMarks("render/end"),performance.clearMarks("inputlatency/start"),performance.clearMarks("inputlatency/end"),performance.clearMeasures("keydown"),performance.clearMeasures("input"),performance.clearMeasures("render"),performance.clearMeasures("inputlatency"),v.keydown=0,v.input=0,v.render=0}function g(){if(_===0)return;const C={keydown:h(y),input:h(E),render:h(S),total:h(p),sampleCount:_};return m(y),m(E),m(S),m(p),_=0,C}k.getAndClearMeasurements=g;function h(C){return{average:C.total/_,max:C.max,min:C.min}}function m(C){C.total=0,C.min=Number.MAX_VALUE,C.max=0}})(L||(e.inputLatency=L={}))}),define(se[395],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ListError=void 0;class L extends Error{constructor(y,E){super(`ListError [${y}] ${E}`)}}e.ListError=L}),define(se[396],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CombinedSpliceable=void 0;class L{constructor(y){this.spliceables=y}splice(y,E,S){this.spliceables.forEach(p=>p.splice(y,E,S))}}e.CombinedSpliceable=L}),define(se[197],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ScrollbarState=void 0;const L=20;class k{constructor(E,S,p,_,v,b){this._scrollbarSize=Math.round(S),this._oppositeScrollbarSize=Math.round(p),this._arrowSize=Math.round(E),this._visibleSize=_,this._scrollSize=v,this._scrollPosition=b,this._computedAvailableSize=0,this._computedIsNeeded=!1,this._computedSliderSize=0,this._computedSliderRatio=0,this._computedSliderPosition=0,this._refreshComputedValues()}clone(){return new k(this._arrowSize,this._scrollbarSize,this._oppositeScrollbarSize,this._visibleSize,this._scrollSize,this._scrollPosition)}setVisibleSize(E){const S=Math.round(E);return this._visibleSize!==S?(this._visibleSize=S,this._refreshComputedValues(),!0):!1}setScrollSize(E){const S=Math.round(E);return this._scrollSize!==S?(this._scrollSize=S,this._refreshComputedValues(),!0):!1}setScrollPosition(E){const S=Math.round(E);return this._scrollPosition!==S?(this._scrollPosition=S,this._refreshComputedValues(),!0):!1}setScrollbarSize(E){this._scrollbarSize=Math.round(E)}setOppositeScrollbarSize(E){this._oppositeScrollbarSize=Math.round(E)}static _computeValues(E,S,p,_,v){const b=Math.max(0,p-E),a=Math.max(0,b-2*S),i=_>0&&_>p;if(!i)return{computedAvailableSize:Math.round(b),computedIsNeeded:i,computedSliderSize:Math.round(a),computedSliderRatio:0,computedSliderPosition:0};const n=Math.round(Math.max(L,Math.floor(p*a/_))),t=(a-n)/(_-p),r=v*t;return{computedAvailableSize:Math.round(b),computedIsNeeded:i,computedSliderSize:Math.round(n),computedSliderRatio:t,computedSliderPosition:Math.round(r)}}_refreshComputedValues(){const E=k._computeValues(this._oppositeScrollbarSize,this._arrowSize,this._visibleSize,this._scrollSize,this._scrollPosition);this._computedAvailableSize=E.computedAvailableSize,this._computedIsNeeded=E.computedIsNeeded,this._computedSliderSize=E.computedSliderSize,this._computedSliderRatio=E.computedSliderRatio,this._computedSliderPosition=E.computedSliderPosition}getArrowSize(){return this._arrowSize}getScrollPosition(){return this._scrollPosition}getRectangleLargeSize(){return this._computedAvailableSize}getRectangleSmallSize(){return this._scrollbarSize}isNeeded(){return this._computedIsNeeded}getSliderSize(){return this._computedSliderSize}getSliderPosition(){return this._computedSliderPosition}getDesiredScrollPositionFromOffset(E){if(!this._computedIsNeeded)return 0;const S=E-this._arrowSize-this._computedSliderSize/2;return Math.round(S/this._computedSliderRatio)}getDesiredScrollPositionFromOffsetPaged(E){if(!this._computedIsNeeded)return 0;const S=E-this._arrowSize;let p=this._scrollPosition;return S<this._computedSliderPosition?p-=this._visibleSize:p+=this._visibleSize,p}getDesiredScrollPositionFromDelta(E){if(!this._computedIsNeeded)return 0;const S=this._computedSliderPosition+E;return Math.round(S/this._computedSliderRatio)}}e.ScrollbarState=k}),define(se[143],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WeakMapper=e.TreeError=e.TreeMouseEventTarget=e.ObjectTreeElementCollapseState=void 0;var L;(function(S){S[S.Expanded=0]="Expanded",S[S.Collapsed=1]="Collapsed",S[S.PreserveOrExpanded=2]="PreserveOrExpanded",S[S.PreserveOrCollapsed=3]="PreserveOrCollapsed"})(L||(e.ObjectTreeElementCollapseState=L={}));var k;(function(S){S[S.Unknown=0]="Unknown",S[S.Twistie=1]="Twistie",S[S.Element=2]="Element",S[S.Filter=3]="Filter"})(k||(e.TreeMouseEventTarget=k={}));class y extends Error{constructor(p,_){super(`TreeError [${p}] ${_}`)}}e.TreeError=y;class E{constructor(p){this.fn=p,this._map=new WeakMap}map(p){let _=this._map.get(p);return _||(_=this.fn(p),this._map.set(p,_)),_}}e.WeakMapper=E}),define(se[44],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.$window=e.mainWindow=e.ensureCodeWindow=void 0;function L(k,y){const E=k;typeof E.vscodeWindowId!="number"&&Object.defineProperty(E,"vscodeWindowId",{get:()=>y})}e.ensureCodeWindow=L,e.mainWindow=window,e.$window=e.mainWindow}),define(se[13],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CallbackIterable=e.ArrayQueue=e.reverseOrder=e.booleanComparator=e.numberComparator=e.tieBreakComparators=e.compareBy=e.CompareResult=e.splice=e.insertInto=e.asArray=e.pushMany=e.pushToEnd=e.pushToStart=e.arrayInsert=e.range=e.firstOrDefault=e.distinct=e.isNonEmptyArray=e.isFalsyOrEmpty=e.coalesceInPlace=e.coalesce=e.forEachWithNeighbors=e.forEachAdjacent=e.groupAdjacentBy=e.groupBy=e.quickSelect=e.binarySearch2=e.binarySearch=e.removeFastWithoutKeepingOrder=e.equals=e.tail2=e.tail=void 0;function L(x,O=0){return x[x.length-(1+O)]}e.tail=L;function k(x){if(x.length===0)throw new Error("Invalid tail call");return[x.slice(0,x.length-1),x[x.length-1]]}e.tail2=k;function y(x,O,B=(W,V)=>W===V){if(x===O)return!0;if(!x||!O||x.length!==O.length)return!1;for(let W=0,V=x.length;W<V;W++)if(!B(x[W],O[W]))return!1;return!0}e.equals=y;function E(x,O){const B=x.length-1;O<B&&(x[O]=x[B]),x.pop()}e.removeFastWithoutKeepingOrder=E;function S(x,O,B){return p(x.length,W=>B(x[W],O))}e.binarySearch=S;function p(x,O){let B=0,W=x-1;for(;B<=W;){const V=(B+W)/2|0,K=O(V);if(K<0)B=V+1;else if(K>0)W=V-1;else return V}return-(B+1)}e.binarySearch2=p;function _(x,O,B){if(x=x|0,x>=O.length)throw new TypeError("invalid index");const W=O[Math.floor(O.length*Math.random())],V=[],K=[],F=[];for(const q of O){const ie=B(q,W);ie<0?V.push(q):ie>0?K.push(q):F.push(q)}return x<V.length?_(x,V,B):x<V.length+F.length?F[0]:_(x-(V.length+F.length),K,B)}e.quickSelect=_;function v(x,O){const B=[];let W;for(const V of x.slice(0).sort(O))!W||O(W[0],V)!==0?(W=[V],B.push(W)):W.push(V);return B}e.groupBy=v;function*b(x,O){let B,W;for(const V of x)W!==void 0&&O(W,V)?B.push(V):(B&&(yield B),B=[V]),W=V;B&&(yield B)}e.groupAdjacentBy=b;function a(x,O){for(let B=0;B<=x.length;B++)O(B===0?void 0:x[B-1],B===x.length?void 0:x[B])}e.forEachAdjacent=a;function i(x,O){for(let B=0;B<x.length;B++)O(B===0?void 0:x[B-1],x[B],B+1===x.length?void 0:x[B+1])}e.forEachWithNeighbors=i;function n(x){return x.filter(O=>!!O)}e.coalesce=n;function t(x){let O=0;for(let B=0;B<x.length;B++)x[B]&&(x[O]=x[B],O+=1);x.length=O}e.coalesceInPlace=t;function r(x){return!Array.isArray(x)||x.length===0}e.isFalsyOrEmpty=r;function u(x){return Array.isArray(x)&&x.length>0}e.isNonEmptyArray=u;function f(x,O=B=>B){const B=new Set;return x.filter(W=>{const V=O(W);return B.has(V)?!1:(B.add(V),!0)})}e.distinct=f;function c(x,O){return x.length>0?x[0]:O}e.firstOrDefault=c;function d(x,O){let B=typeof O=="number"?x:0;typeof O=="number"?B=x:(B=0,O=x);const W=[];if(B<=O)for(let V=B;V<O;V++)W.push(V);else for(let V=B;V>O;V--)W.push(V);return W}e.range=d;function s(x,O,B){const W=x.slice(0,O),V=x.slice(O);return W.concat(B,V)}e.arrayInsert=s;function l(x,O){const B=x.indexOf(O);B>-1&&(x.splice(B,1),x.unshift(O))}e.pushToStart=l;function o(x,O){const B=x.indexOf(O);B>-1&&(x.splice(B,1),x.push(O))}e.pushToEnd=o;function g(x,O){for(const B of O)x.push(B)}e.pushMany=g;function h(x){return Array.isArray(x)?x:[x]}e.asArray=h;function m(x,O,B){const W=w(x,O),V=x.length,K=B.length;x.length=V+K;for(let F=V-1;F>=W;F--)x[F+K]=x[F];for(let F=0;F<K;F++)x[F+W]=B[F]}e.insertInto=m;function C(x,O,B,W){const V=w(x,O);let K=x.splice(V,B);return K===void 0&&(K=[]),m(x,V,W),K}e.splice=C;function w(x,O){return O<0?Math.max(O+x.length,0):Math.min(O,x.length)}var D;(function(x){function O(K){return K<0}x.isLessThan=O;function B(K){return K<=0}x.isLessThanOrEqual=B;function W(K){return K>0}x.isGreaterThan=W;function V(K){return K===0}x.isNeitherLessOrGreaterThan=V,x.greaterThan=1,x.lessThan=-1,x.neitherLessOrGreaterThan=0})(D||(e.CompareResult=D={}));function I(x,O){return(B,W)=>O(x(B),x(W))}e.compareBy=I;function T(...x){return(O,B)=>{for(const W of x){const V=W(O,B);if(!D.isNeitherLessOrGreaterThan(V))return V}return D.neitherLessOrGreaterThan}}e.tieBreakComparators=T;const A=(x,O)=>x-O;e.numberComparator=A;const P=(x,O)=>(0,e.numberComparator)(x?1:0,O?1:0);e.booleanComparator=P;function N(x){return(O,B)=>-x(O,B)}e.reverseOrder=N;class M{constructor(O){this.items=O,this.firstIdx=0,this.lastIdx=this.items.length-1}get length(){return this.lastIdx-this.firstIdx+1}takeWhile(O){let B=this.firstIdx;for(;B<this.items.length&&O(this.items[B]);)B++;const W=B===this.firstIdx?null:this.items.slice(this.firstIdx,B);return this.firstIdx=B,W}takeFromEndWhile(O){let B=this.lastIdx;for(;B>=0&&O(this.items[B]);)B--;const W=B===this.lastIdx?null:this.items.slice(B+1,this.lastIdx+1);return this.lastIdx=B,W}peek(){if(this.length!==0)return this.items[this.firstIdx]}dequeue(){const O=this.items[this.firstIdx];return this.firstIdx++,O}takeCount(O){const B=this.items.slice(this.firstIdx,this.firstIdx+O);return this.firstIdx+=O,B}}e.ArrayQueue=M;class R{constructor(O){this.iterate=O}toArray(){const O=[];return this.iterate(B=>(O.push(B),!0)),O}filter(O){return new R(B=>this.iterate(W=>O(W)?B(W):!0))}map(O){return new R(B=>this.iterate(W=>B(O(W))))}findLast(O){let B;return this.iterate(W=>(O(W)&&(B=W),!0)),B}findLastMaxBy(O){let B,W=!0;return this.iterate(V=>((W||D.isGreaterThan(O(V,B)))&&(W=!1,B=V),!0)),B}}e.CallbackIterable=R,R.empty=new R(x=>{})}),define(se[60],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.mapFindFirst=e.findMaxIdxBy=e.findFirstMinBy=e.findLastMaxBy=e.findFirstMaxBy=e.MonotonousArray=e.findFirstIdxMonotonousOrArrLen=e.findFirstMonotonous=e.findLastIdxMonotonous=e.findLastMonotonous=e.findLastIdx=e.findLast=void 0;function L(t,r,u){const f=k(t,r);if(f!==-1)return t[f]}e.findLast=L;function k(t,r,u=t.length-1){for(let f=u;f>=0;f--){const c=t[f];if(r(c))return f}return-1}e.findLastIdx=k;function y(t,r){const u=E(t,r);return u===-1?void 0:t[u]}e.findLastMonotonous=y;function E(t,r,u=0,f=t.length){let c=u,d=f;for(;c<d;){const s=Math.floor((c+d)/2);r(t[s])?c=s+1:d=s}return c-1}e.findLastIdxMonotonous=E;function S(t,r){const u=p(t,r);return u===t.length?void 0:t[u]}e.findFirstMonotonous=S;function p(t,r,u=0,f=t.length){let c=u,d=f;for(;c<d;){const s=Math.floor((c+d)/2);r(t[s])?d=s:c=s+1}return c}e.findFirstIdxMonotonousOrArrLen=p;class _{constructor(r){this._array=r,this._findLastMonotonousLastIdx=0}findLastMonotonous(r){if(_.assertInvariants){if(this._prevFindLastPredicate){for(const f of this._array)if(this._prevFindLastPredicate(f)&&!r(f))throw new Error("MonotonousArray: current predicate must be weaker than (or equal to) the previous predicate.")}this._prevFindLastPredicate=r}const u=E(this._array,r,this._findLastMonotonousLastIdx);return this._findLastMonotonousLastIdx=u+1,u===-1?void 0:this._array[u]}}e.MonotonousArray=_,_.assertInvariants=!1;function v(t,r){if(t.length===0)return;let u=t[0];for(let f=1;f<t.length;f++){const c=t[f];r(c,u)>0&&(u=c)}return u}e.findFirstMaxBy=v;function b(t,r){if(t.length===0)return;let u=t[0];for(let f=1;f<t.length;f++){const c=t[f];r(c,u)>=0&&(u=c)}return u}e.findLastMaxBy=b;function a(t,r){return v(t,(u,f)=>-r(u,f))}e.findFirstMinBy=a;function i(t,r){if(t.length===0)return-1;let u=0;for(let f=1;f<t.length;f++){const c=t[f];r(c,t[u])>0&&(u=f)}return u}e.findMaxIdxBy=i;function n(t,r){for(const u of t){const f=r(u);if(f!==void 0)return f}}e.mapFindFirst=n}),define(se[267],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CachedFunction=e.LRUCachedFunction=void 0;class L{constructor(E){this.fn=E,this.lastCache=void 0,this.lastArgKey=void 0}get(E){const S=JSON.stringify(E);return this.lastArgKey!==S&&(this.lastArgKey=S,this.lastCache=this.fn(E)),this.lastCache}}e.LRUCachedFunction=L;class k{get cachedValues(){return this._map}constructor(E){this.fn=E,this._map=new Map}get(E){if(this._map.has(E))return this._map.get(E);const S=this.fn(E);return this._map.set(E,S),S}}e.CachedFunction=k}),define(se[268],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.intersection=e.diffSets=void 0;function L(y,E){const S=[],p=[];for(const _ of y)E.has(_)||S.push(_);for(const _ of E)y.has(_)||p.push(_);return{removed:S,added:p}}e.diffSets=L;function k(y,E){const S=new Set;for(const p of E)y.has(p)&&S.add(p);return S}e.intersection=k}),define(se[39],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Color=e.HSVA=e.HSLA=e.RGBA=void 0;function L(p,_){const v=Math.pow(10,_);return Math.round(p*v)/v}class k{constructor(_,v,b,a=1){this._rgbaBrand=void 0,this.r=Math.min(255,Math.max(0,_))|0,this.g=Math.min(255,Math.max(0,v))|0,this.b=Math.min(255,Math.max(0,b))|0,this.a=L(Math.max(Math.min(1,a),0),3)}static equals(_,v){return _.r===v.r&&_.g===v.g&&_.b===v.b&&_.a===v.a}}e.RGBA=k;class y{constructor(_,v,b,a){this._hslaBrand=void 0,this.h=Math.max(Math.min(360,_),0)|0,this.s=L(Math.max(Math.min(1,v),0),3),this.l=L(Math.max(Math.min(1,b),0),3),this.a=L(Math.max(Math.min(1,a),0),3)}static equals(_,v){return _.h===v.h&&_.s===v.s&&_.l===v.l&&_.a===v.a}static fromRGBA(_){const v=_.r/255,b=_.g/255,a=_.b/255,i=_.a,n=Math.max(v,b,a),t=Math.min(v,b,a);let r=0,u=0;const f=(t+n)/2,c=n-t;if(c>0){switch(u=Math.min(f<=.5?c/(2*f):c/(2-2*f),1),n){case v:r=(b-a)/c+(b<a?6:0);break;case b:r=(a-v)/c+2;break;case a:r=(v-b)/c+4;break}r*=60,r=Math.round(r)}return new y(r,u,f,i)}static _hue2rgb(_,v,b){return b<0&&(b+=1),b>1&&(b-=1),b<1/6?_+(v-_)*6*b:b<1/2?v:b<2/3?_+(v-_)*(2/3-b)*6:_}static toRGBA(_){const v=_.h/360,{s:b,l:a,a:i}=_;let n,t,r;if(b===0)n=t=r=a;else{const u=a<.5?a*(1+b):a+b-a*b,f=2*a-u;n=y._hue2rgb(f,u,v+1/3),t=y._hue2rgb(f,u,v),r=y._hue2rgb(f,u,v-1/3)}return new k(Math.round(n*255),Math.round(t*255),Math.round(r*255),i)}}e.HSLA=y;class E{constructor(_,v,b,a){this._hsvaBrand=void 0,this.h=Math.max(Math.min(360,_),0)|0,this.s=L(Math.max(Math.min(1,v),0),3),this.v=L(Math.max(Math.min(1,b),0),3),this.a=L(Math.max(Math.min(1,a),0),3)}static equals(_,v){return _.h===v.h&&_.s===v.s&&_.v===v.v&&_.a===v.a}static fromRGBA(_){const v=_.r/255,b=_.g/255,a=_.b/255,i=Math.max(v,b,a),n=Math.min(v,b,a),t=i-n,r=i===0?0:t/i;let u;return t===0?u=0:i===v?u=((b-a)/t%6+6)%6:i===b?u=(a-v)/t+2:u=(v-b)/t+4,new E(Math.round(u*60),r,i,_.a)}static toRGBA(_){const{h:v,s:b,v:a,a:i}=_,n=a*b,t=n*(1-Math.abs(v/60%2-1)),r=a-n;let[u,f,c]=[0,0,0];return v<60?(u=n,f=t):v<120?(u=t,f=n):v<180?(f=n,c=t):v<240?(f=t,c=n):v<300?(u=t,c=n):v<=360&&(u=n,c=t),u=Math.round((u+r)*255),f=Math.round((f+r)*255),c=Math.round((c+r)*255),new k(u,f,c,i)}}e.HSVA=E;class S{static fromHex(_){return S.Format.CSS.parseHex(_)||S.red}static equals(_,v){return!_&&!v?!0:!_||!v?!1:_.equals(v)}get hsla(){return this._hsla?this._hsla:y.fromRGBA(this.rgba)}get hsva(){return this._hsva?this._hsva:E.fromRGBA(this.rgba)}constructor(_){if(_)if(_ instanceof k)this.rgba=_;else if(_ instanceof y)this._hsla=_,this.rgba=y.toRGBA(_);else if(_ instanceof E)this._hsva=_,this.rgba=E.toRGBA(_);else throw new Error("Invalid color ctor argument");else throw new Error("Color needs a value")}equals(_){return!!_&&k.equals(this.rgba,_.rgba)&&y.equals(this.hsla,_.hsla)&&E.equals(this.hsva,_.hsva)}getRelativeLuminance(){const _=S._relativeLuminanceForComponent(this.rgba.r),v=S._relativeLuminanceForComponent(this.rgba.g),b=S._relativeLuminanceForComponent(this.rgba.b),a=.2126*_+.7152*v+.0722*b;return L(a,4)}static _relativeLuminanceForComponent(_){const v=_/255;return v<=.03928?v/12.92:Math.pow((v+.055)/1.055,2.4)}isLighter(){return(this.rgba.r*299+this.rgba.g*587+this.rgba.b*114)/1e3>=128}isLighterThan(_){const v=this.getRelativeLuminance(),b=_.getRelativeLuminance();return v>b}isDarkerThan(_){const v=this.getRelativeLuminance(),b=_.getRelativeLuminance();return v<b}lighten(_){return new S(new y(this.hsla.h,this.hsla.s,this.hsla.l+this.hsla.l*_,this.hsla.a))}darken(_){return new S(new y(this.hsla.h,this.hsla.s,this.hsla.l-this.hsla.l*_,this.hsla.a))}transparent(_){const{r:v,g:b,b:a,a:i}=this.rgba;return new S(new k(v,b,a,i*_))}isTransparent(){return this.rgba.a===0}isOpaque(){return this.rgba.a===1}opposite(){return new S(new k(255-this.rgba.r,255-this.rgba.g,255-this.rgba.b,this.rgba.a))}makeOpaque(_){if(this.isOpaque()||_.rgba.a!==1)return this;const{r:v,g:b,b:a,a:i}=this.rgba;return new S(new k(_.rgba.r-i*(_.rgba.r-v),_.rgba.g-i*(_.rgba.g-b),_.rgba.b-i*(_.rgba.b-a),1))}toString(){return this._toString||(this._toString=S.Format.CSS.format(this)),this._toString}static getLighterColor(_,v,b){if(_.isLighterThan(v))return _;b=b||.5;const a=_.getRelativeLuminance(),i=v.getRelativeLuminance();return b=b*(i-a)/i,_.lighten(b)}static getDarkerColor(_,v,b){if(_.isDarkerThan(v))return _;b=b||.5;const a=_.getRelativeLuminance(),i=v.getRelativeLuminance();return b=b*(a-i)/a,_.darken(b)}}e.Color=S,S.white=new S(new k(255,255,255,1)),S.black=new S(new k(0,0,0,1)),S.red=new S(new k(255,0,0,1)),S.blue=new S(new k(0,0,255,1)),S.green=new S(new k(0,255,0,1)),S.cyan=new S(new k(0,255,255,1)),S.lightgrey=new S(new k(211,211,211,1)),S.transparent=new S(new k(0,0,0,0)),function(p){let _;(function(v){let b;(function(a){function i(o){return o.rgba.a===1?`rgb(${o.rgba.r}, ${o.rgba.g}, ${o.rgba.b})`:p.Format.CSS.formatRGBA(o)}a.formatRGB=i;function n(o){return`rgba(${o.rgba.r}, ${o.rgba.g}, ${o.rgba.b}, ${+o.rgba.a.toFixed(2)})`}a.formatRGBA=n;function t(o){return o.hsla.a===1?`hsl(${o.hsla.h}, ${(o.hsla.s*100).toFixed(2)}%, ${(o.hsla.l*100).toFixed(2)}%)`:p.Format.CSS.formatHSLA(o)}a.formatHSL=t;function r(o){return`hsla(${o.hsla.h}, ${(o.hsla.s*100).toFixed(2)}%, ${(o.hsla.l*100).toFixed(2)}%, ${o.hsla.a.toFixed(2)})`}a.formatHSLA=r;function u(o){const g=o.toString(16);return g.length!==2?"0"+g:g}function f(o){return`#${u(o.rgba.r)}${u(o.rgba.g)}${u(o.rgba.b)}`}a.formatHex=f;function c(o,g=!1){return g&&o.rgba.a===1?p.Format.CSS.formatHex(o):`#${u(o.rgba.r)}${u(o.rgba.g)}${u(o.rgba.b)}${u(Math.round(o.rgba.a*255))}`}a.formatHexA=c;function d(o){return o.isOpaque()?p.Format.CSS.formatHex(o):p.Format.CSS.formatRGBA(o)}a.format=d;function s(o){const g=o.length;if(g===0||o.charCodeAt(0)!==35)return null;if(g===7){const h=16*l(o.charCodeAt(1))+l(o.charCodeAt(2)),m=16*l(o.charCodeAt(3))+l(o.charCodeAt(4)),C=16*l(o.charCodeAt(5))+l(o.charCodeAt(6));return new p(new k(h,m,C,1))}if(g===9){const h=16*l(o.charCodeAt(1))+l(o.charCodeAt(2)),m=16*l(o.charCodeAt(3))+l(o.charCodeAt(4)),C=16*l(o.charCodeAt(5))+l(o.charCodeAt(6)),w=16*l(o.charCodeAt(7))+l(o.charCodeAt(8));return new p(new k(h,m,C,w/255))}if(g===4){const h=l(o.charCodeAt(1)),m=l(o.charCodeAt(2)),C=l(o.charCodeAt(3));return new p(new k(16*h+h,16*m+m,16*C+C))}if(g===5){const h=l(o.charCodeAt(1)),m=l(o.charCodeAt(2)),C=l(o.charCodeAt(3)),w=l(o.charCodeAt(4));return new p(new k(16*h+h,16*m+m,16*C+C,(16*w+w)/255))}return null}a.parseHex=s;function l(o){switch(o){case 48:return 0;case 49:return 1;case 50:return 2;case 51:return 3;case 52:return 4;case 53:return 5;case 54:return 6;case 55:return 7;case 56:return 8;case 57:return 9;case 97:return 10;case 65:return 10;case 98:return 11;case 66:return 11;case 99:return 12;case 67:return 12;case 100:return 13;case 68:return 13;case 101:return 14;case 69:return 14;case 102:return 15;case 70:return 15}return 0}})(b=v.CSS||(v.CSS={}))})(_=p.Format||(p.Format={}))}(S||(e.Color=S={}))}),define(se[107],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.memoize=void 0;function L(k,y,E){let S=null,p=null;if(typeof E.value=="function"?(S="value",p=E.value,p.length!==0&&console.warn("Memoize should only be used in functions with zero parameters")):typeof E.get=="function"&&(S="get",p=E.get),!p)throw new Error("not supported");const _=`$memoize$${y}`;E[S]=function(...v){return this.hasOwnProperty(_)||Object.defineProperty(this,_,{configurable:!1,enumerable:!1,writable:!1,value:p.apply(this,v)}),this[_]}}e.memoize=L}),define(se[397],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffChange=void 0;class L{constructor(y,E,S,p){this.originalStart=y,this.originalLength=E,this.modifiedStart=S,this.modifiedLength=p}getOriginalEnd(){return this.originalStart+this.originalLength}getModifiedEnd(){return this.modifiedStart+this.modifiedLength}}e.DiffChange=L}),define(se[12],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BugIndicatingError=e.ErrorNoTelemetry=e.NotSupportedError=e.illegalState=e.illegalArgument=e.canceled=e.CancellationError=e.isCancellationError=e.transformErrorForSerialization=e.onUnexpectedExternalError=e.onUnexpectedError=e.errorHandler=e.ErrorHandler=void 0;class L{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(u){setTimeout(()=>{throw u.stack?n.isErrorNoTelemetry(u)?new n(u.message+`
+
+`+u.stack):new Error(u.message+`
+
+`+u.stack):u},0)}}emit(u){this.listeners.forEach(f=>{f(u)})}onUnexpectedError(u){this.unexpectedErrorHandler(u),this.emit(u)}onUnexpectedExternalError(u){this.unexpectedErrorHandler(u)}}e.ErrorHandler=L,e.errorHandler=new L;function k(r){p(r)||e.errorHandler.onUnexpectedError(r)}e.onUnexpectedError=k;function y(r){p(r)||e.errorHandler.onUnexpectedExternalError(r)}e.onUnexpectedExternalError=y;function E(r){if(r instanceof Error){const{name:u,message:f}=r,c=r.stacktrace||r.stack;return{$isError:!0,name:u,message:f,stack:c,noTelemetry:n.isErrorNoTelemetry(r)}}return r}e.transformErrorForSerialization=E;const S="Canceled";function p(r){return r instanceof _?!0:r instanceof Error&&r.name===S&&r.message===S}e.isCancellationError=p;class _ extends Error{constructor(){super(S),this.name=this.message}}e.CancellationError=_;function v(){const r=new Error(S);return r.name=r.message,r}e.canceled=v;function b(r){return r?new Error(`Illegal argument: ${r}`):new Error("Illegal argument")}e.illegalArgument=b;function a(r){return r?new Error(`Illegal state: ${r}`):new Error("Illegal state")}e.illegalState=a;class i extends Error{constructor(u){super("NotSupported"),u&&(this.message=u)}}e.NotSupportedError=i;class n extends Error{constructor(u){super(u),this.name="CodeExpectedError"}static fromError(u){if(u instanceof n)return u;const f=new n;return f.message=u.message,f.stack=u.stack,f}static isErrorNoTelemetry(u){return u.name==="CodeExpectedError"}}e.ErrorNoTelemetry=n;class t extends Error{constructor(u){super(u||"An unexpected bug occurred."),Object.setPrototypeOf(this,t.prototype)}}e.BugIndicatingError=t}),define(se[93],oe([1,0,44,12]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createTrustedTypesPolicy=void 0;function y(E,S){var p;const _=globalThis.MonacoEnvironment;if(_?.createTrustedTypesPolicy)try{return _.createTrustedTypesPolicy(E,S)}catch(v){(0,k.onUnexpectedError)(v);return}try{return(p=L.mainWindow.trustedTypes)===null||p===void 0?void 0:p.createPolicy(E,S)}catch(v){(0,k.onUnexpectedError)(v);return}}e.createTrustedTypesPolicy=y}),define(se[90],oe([1,0,12]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.checkAdjacentItems=e.assertFn=e.softAssert=e.assertNever=e.ok=void 0;function k(_,v){if(!_)throw new Error(v?`Assertion failed (${v})`:"Assertion Failed")}e.ok=k;function y(_,v="Unreachable"){throw new Error(v)}e.assertNever=y;function E(_){_||(0,L.onUnexpectedError)(new L.BugIndicatingError("Assertion Failed"))}e.softAssert=E;function S(_){if(!_()){debugger;_(),(0,L.onUnexpectedError)(new L.BugIndicatingError("Assertion Failed"))}}e.assertFn=S;function p(_,v){let b=0;for(;b<_.length-1;){const a=_[b],i=_[b+1];if(!v(a,i))return!1;b++}return!0}e.checkAdjacentItems=p}),define(se[108],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createSingleCallFunction=void 0;function L(k,y){const E=this;let S=!1,p;return function(){if(S)return p;if(S=!0,y)try{p=k.apply(E,arguments)}finally{y()}else p=k.apply(E,arguments);return p}}e.createSingleCallFunction=L}),define(se[170],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.defaultGenerator=e.IdGenerator=void 0;class L{constructor(y){this._prefix=y,this._lastId=0}nextId(){return this._prefix+ ++this._lastId}}e.IdGenerator=L,e.defaultGenerator=new L("id#")}),define(se[52],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Iterable=void 0;var L;(function(k){function y(o){return o&&typeof o=="object"&&typeof o[Symbol.iterator]=="function"}k.is=y;const E=Object.freeze([]);function S(){return E}k.empty=S;function*p(o){yield o}k.single=p;function _(o){return y(o)?o:p(o)}k.wrap=_;function v(o){return o||E}k.from=v;function*b(o){for(let g=o.length-1;g>=0;g--)yield o[g]}k.reverse=b;function a(o){return!o||o[Symbol.iterator]().next().done===!0}k.isEmpty=a;function i(o){return o[Symbol.iterator]().next().value}k.first=i;function n(o,g){for(const h of o)if(g(h))return!0;return!1}k.some=n;function t(o,g){for(const h of o)if(g(h))return h}k.find=t;function*r(o,g){for(const h of o)g(h)&&(yield h)}k.filter=r;function*u(o,g){let h=0;for(const m of o)yield g(m,h++)}k.map=u;function*f(...o){for(const g of o)yield*g}k.concat=f;function c(o,g,h){let m=h;for(const C of o)m=g(m,C);return m}k.reduce=c;function*d(o,g,h=o.length){for(g<0&&(g+=o.length),h<0?h+=o.length:h>o.length&&(h=o.length);g<h;g++)yield o[g]}k.slice=d;function s(o,g=Number.POSITIVE_INFINITY){const h=[];if(g===0)return[h,o];const m=o[Symbol.iterator]();for(let C=0;C<g;C++){const w=m.next();if(w.done)return[h,k.empty()];h.push(w.value)}return[h,{[Symbol.iterator](){return m}}]}k.consume=s;async function l(o){const g=[];for await(const h of o)g.push(h);return Promise.resolve(g)}k.asyncToArray=l})(L||(e.Iterable=L={}))}),define(se[65],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.KeyChord=e.KeyCodeUtils=e.IMMUTABLE_KEY_CODE_TO_CODE=e.IMMUTABLE_CODE_TO_KEY_CODE=e.NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE=e.EVENT_KEY_CODE_MAP=void 0;class L{constructor(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}define(i,n){this._keyCodeToStr[i]=n,this._strToKeyCode[n.toLowerCase()]=i}keyCodeToStr(i){return this._keyCodeToStr[i]}strToKeyCode(i){return this._strToKeyCode[i.toLowerCase()]||0}}const k=new L,y=new L,E=new L;e.EVENT_KEY_CODE_MAP=new Array(230),e.NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE={};const S=[],p=Object.create(null),_=Object.create(null);e.IMMUTABLE_CODE_TO_KEY_CODE=[],e.IMMUTABLE_KEY_CODE_TO_CODE=[];for(let a=0;a<=193;a++)e.IMMUTABLE_CODE_TO_KEY_CODE[a]=-1;for(let a=0;a<=132;a++)e.IMMUTABLE_KEY_CODE_TO_CODE[a]=-1;(function(){const a="",i=[[1,0,"None",0,"unknown",0,"VK_UNKNOWN",a,a],[1,1,"Hyper",0,a,0,a,a,a],[1,2,"Super",0,a,0,a,a,a],[1,3,"Fn",0,a,0,a,a,a],[1,4,"FnLock",0,a,0,a,a,a],[1,5,"Suspend",0,a,0,a,a,a],[1,6,"Resume",0,a,0,a,a,a],[1,7,"Turbo",0,a,0,a,a,a],[1,8,"Sleep",0,a,0,"VK_SLEEP",a,a],[1,9,"WakeUp",0,a,0,a,a,a],[0,10,"KeyA",31,"A",65,"VK_A",a,a],[0,11,"KeyB",32,"B",66,"VK_B",a,a],[0,12,"KeyC",33,"C",67,"VK_C",a,a],[0,13,"KeyD",34,"D",68,"VK_D",a,a],[0,14,"KeyE",35,"E",69,"VK_E",a,a],[0,15,"KeyF",36,"F",70,"VK_F",a,a],[0,16,"KeyG",37,"G",71,"VK_G",a,a],[0,17,"KeyH",38,"H",72,"VK_H",a,a],[0,18,"KeyI",39,"I",73,"VK_I",a,a],[0,19,"KeyJ",40,"J",74,"VK_J",a,a],[0,20,"KeyK",41,"K",75,"VK_K",a,a],[0,21,"KeyL",42,"L",76,"VK_L",a,a],[0,22,"KeyM",43,"M",77,"VK_M",a,a],[0,23,"KeyN",44,"N",78,"VK_N",a,a],[0,24,"KeyO",45,"O",79,"VK_O",a,a],[0,25,"KeyP",46,"P",80,"VK_P",a,a],[0,26,"KeyQ",47,"Q",81,"VK_Q",a,a],[0,27,"KeyR",48,"R",82,"VK_R",a,a],[0,28,"KeyS",49,"S",83,"VK_S",a,a],[0,29,"KeyT",50,"T",84,"VK_T",a,a],[0,30,"KeyU",51,"U",85,"VK_U",a,a],[0,31,"KeyV",52,"V",86,"VK_V",a,a],[0,32,"KeyW",53,"W",87,"VK_W",a,a],[0,33,"KeyX",54,"X",88,"VK_X",a,a],[0,34,"KeyY",55,"Y",89,"VK_Y",a,a],[0,35,"KeyZ",56,"Z",90,"VK_Z",a,a],[0,36,"Digit1",22,"1",49,"VK_1",a,a],[0,37,"Digit2",23,"2",50,"VK_2",a,a],[0,38,"Digit3",24,"3",51,"VK_3",a,a],[0,39,"Digit4",25,"4",52,"VK_4",a,a],[0,40,"Digit5",26,"5",53,"VK_5",a,a],[0,41,"Digit6",27,"6",54,"VK_6",a,a],[0,42,"Digit7",28,"7",55,"VK_7",a,a],[0,43,"Digit8",29,"8",56,"VK_8",a,a],[0,44,"Digit9",30,"9",57,"VK_9",a,a],[0,45,"Digit0",21,"0",48,"VK_0",a,a],[1,46,"Enter",3,"Enter",13,"VK_RETURN",a,a],[1,47,"Escape",9,"Escape",27,"VK_ESCAPE",a,a],[1,48,"Backspace",1,"Backspace",8,"VK_BACK",a,a],[1,49,"Tab",2,"Tab",9,"VK_TAB",a,a],[1,50,"Space",10,"Space",32,"VK_SPACE",a,a],[0,51,"Minus",88,"-",189,"VK_OEM_MINUS","-","OEM_MINUS"],[0,52,"Equal",86,"=",187,"VK_OEM_PLUS","=","OEM_PLUS"],[0,53,"BracketLeft",92,"[",219,"VK_OEM_4","[","OEM_4"],[0,54,"BracketRight",94,"]",221,"VK_OEM_6","]","OEM_6"],[0,55,"Backslash",93,"\\",220,"VK_OEM_5","\\","OEM_5"],[0,56,"IntlHash",0,a,0,a,a,a],[0,57,"Semicolon",85,";",186,"VK_OEM_1",";","OEM_1"],[0,58,"Quote",95,"'",222,"VK_OEM_7","'","OEM_7"],[0,59,"Backquote",91,"`",192,"VK_OEM_3","`","OEM_3"],[0,60,"Comma",87,",",188,"VK_OEM_COMMA",",","OEM_COMMA"],[0,61,"Period",89,".",190,"VK_OEM_PERIOD",".","OEM_PERIOD"],[0,62,"Slash",90,"/",191,"VK_OEM_2","/","OEM_2"],[1,63,"CapsLock",8,"CapsLock",20,"VK_CAPITAL",a,a],[1,64,"F1",59,"F1",112,"VK_F1",a,a],[1,65,"F2",60,"F2",113,"VK_F2",a,a],[1,66,"F3",61,"F3",114,"VK_F3",a,a],[1,67,"F4",62,"F4",115,"VK_F4",a,a],[1,68,"F5",63,"F5",116,"VK_F5",a,a],[1,69,"F6",64,"F6",117,"VK_F6",a,a],[1,70,"F7",65,"F7",118,"VK_F7",a,a],[1,71,"F8",66,"F8",119,"VK_F8",a,a],[1,72,"F9",67,"F9",120,"VK_F9",a,a],[1,73,"F10",68,"F10",121,"VK_F10",a,a],[1,74,"F11",69,"F11",122,"VK_F11",a,a],[1,75,"F12",70,"F12",123,"VK_F12",a,a],[1,76,"PrintScreen",0,a,0,a,a,a],[1,77,"ScrollLock",84,"ScrollLock",145,"VK_SCROLL",a,a],[1,78,"Pause",7,"PauseBreak",19,"VK_PAUSE",a,a],[1,79,"Insert",19,"Insert",45,"VK_INSERT",a,a],[1,80,"Home",14,"Home",36,"VK_HOME",a,a],[1,81,"PageUp",11,"PageUp",33,"VK_PRIOR",a,a],[1,82,"Delete",20,"Delete",46,"VK_DELETE",a,a],[1,83,"End",13,"End",35,"VK_END",a,a],[1,84,"PageDown",12,"PageDown",34,"VK_NEXT",a,a],[1,85,"ArrowRight",17,"RightArrow",39,"VK_RIGHT","Right",a],[1,86,"ArrowLeft",15,"LeftArrow",37,"VK_LEFT","Left",a],[1,87,"ArrowDown",18,"DownArrow",40,"VK_DOWN","Down",a],[1,88,"ArrowUp",16,"UpArrow",38,"VK_UP","Up",a],[1,89,"NumLock",83,"NumLock",144,"VK_NUMLOCK",a,a],[1,90,"NumpadDivide",113,"NumPad_Divide",111,"VK_DIVIDE",a,a],[1,91,"NumpadMultiply",108,"NumPad_Multiply",106,"VK_MULTIPLY",a,a],[1,92,"NumpadSubtract",111,"NumPad_Subtract",109,"VK_SUBTRACT",a,a],[1,93,"NumpadAdd",109,"NumPad_Add",107,"VK_ADD",a,a],[1,94,"NumpadEnter",3,a,0,a,a,a],[1,95,"Numpad1",99,"NumPad1",97,"VK_NUMPAD1",a,a],[1,96,"Numpad2",100,"NumPad2",98,"VK_NUMPAD2",a,a],[1,97,"Numpad3",101,"NumPad3",99,"VK_NUMPAD3",a,a],[1,98,"Numpad4",102,"NumPad4",100,"VK_NUMPAD4",a,a],[1,99,"Numpad5",103,"NumPad5",101,"VK_NUMPAD5",a,a],[1,100,"Numpad6",104,"NumPad6",102,"VK_NUMPAD6",a,a],[1,101,"Numpad7",105,"NumPad7",103,"VK_NUMPAD7",a,a],[1,102,"Numpad8",106,"NumPad8",104,"VK_NUMPAD8",a,a],[1,103,"Numpad9",107,"NumPad9",105,"VK_NUMPAD9",a,a],[1,104,"Numpad0",98,"NumPad0",96,"VK_NUMPAD0",a,a],[1,105,"NumpadDecimal",112,"NumPad_Decimal",110,"VK_DECIMAL",a,a],[0,106,"IntlBackslash",97,"OEM_102",226,"VK_OEM_102",a,a],[1,107,"ContextMenu",58,"ContextMenu",93,a,a,a],[1,108,"Power",0,a,0,a,a,a],[1,109,"NumpadEqual",0,a,0,a,a,a],[1,110,"F13",71,"F13",124,"VK_F13",a,a],[1,111,"F14",72,"F14",125,"VK_F14",a,a],[1,112,"F15",73,"F15",126,"VK_F15",a,a],[1,113,"F16",74,"F16",127,"VK_F16",a,a],[1,114,"F17",75,"F17",128,"VK_F17",a,a],[1,115,"F18",76,"F18",129,"VK_F18",a,a],[1,116,"F19",77,"F19",130,"VK_F19",a,a],[1,117,"F20",78,"F20",131,"VK_F20",a,a],[1,118,"F21",79,"F21",132,"VK_F21",a,a],[1,119,"F22",80,"F22",133,"VK_F22",a,a],[1,120,"F23",81,"F23",134,"VK_F23",a,a],[1,121,"F24",82,"F24",135,"VK_F24",a,a],[1,122,"Open",0,a,0,a,a,a],[1,123,"Help",0,a,0,a,a,a],[1,124,"Select",0,a,0,a,a,a],[1,125,"Again",0,a,0,a,a,a],[1,126,"Undo",0,a,0,a,a,a],[1,127,"Cut",0,a,0,a,a,a],[1,128,"Copy",0,a,0,a,a,a],[1,129,"Paste",0,a,0,a,a,a],[1,130,"Find",0,a,0,a,a,a],[1,131,"AudioVolumeMute",117,"AudioVolumeMute",173,"VK_VOLUME_MUTE",a,a],[1,132,"AudioVolumeUp",118,"AudioVolumeUp",175,"VK_VOLUME_UP",a,a],[1,133,"AudioVolumeDown",119,"AudioVolumeDown",174,"VK_VOLUME_DOWN",a,a],[1,134,"NumpadComma",110,"NumPad_Separator",108,"VK_SEPARATOR",a,a],[0,135,"IntlRo",115,"ABNT_C1",193,"VK_ABNT_C1",a,a],[1,136,"KanaMode",0,a,0,a,a,a],[0,137,"IntlYen",0,a,0,a,a,a],[1,138,"Convert",0,a,0,a,a,a],[1,139,"NonConvert",0,a,0,a,a,a],[1,140,"Lang1",0,a,0,a,a,a],[1,141,"Lang2",0,a,0,a,a,a],[1,142,"Lang3",0,a,0,a,a,a],[1,143,"Lang4",0,a,0,a,a,a],[1,144,"Lang5",0,a,0,a,a,a],[1,145,"Abort",0,a,0,a,a,a],[1,146,"Props",0,a,0,a,a,a],[1,147,"NumpadParenLeft",0,a,0,a,a,a],[1,148,"NumpadParenRight",0,a,0,a,a,a],[1,149,"NumpadBackspace",0,a,0,a,a,a],[1,150,"NumpadMemoryStore",0,a,0,a,a,a],[1,151,"NumpadMemoryRecall",0,a,0,a,a,a],[1,152,"NumpadMemoryClear",0,a,0,a,a,a],[1,153,"NumpadMemoryAdd",0,a,0,a,a,a],[1,154,"NumpadMemorySubtract",0,a,0,a,a,a],[1,155,"NumpadClear",131,"Clear",12,"VK_CLEAR",a,a],[1,156,"NumpadClearEntry",0,a,0,a,a,a],[1,0,a,5,"Ctrl",17,"VK_CONTROL",a,a],[1,0,a,4,"Shift",16,"VK_SHIFT",a,a],[1,0,a,6,"Alt",18,"VK_MENU",a,a],[1,0,a,57,"Meta",91,"VK_COMMAND",a,a],[1,157,"ControlLeft",5,a,0,"VK_LCONTROL",a,a],[1,158,"ShiftLeft",4,a,0,"VK_LSHIFT",a,a],[1,159,"AltLeft",6,a,0,"VK_LMENU",a,a],[1,160,"MetaLeft",57,a,0,"VK_LWIN",a,a],[1,161,"ControlRight",5,a,0,"VK_RCONTROL",a,a],[1,162,"ShiftRight",4,a,0,"VK_RSHIFT",a,a],[1,163,"AltRight",6,a,0,"VK_RMENU",a,a],[1,164,"MetaRight",57,a,0,"VK_RWIN",a,a],[1,165,"BrightnessUp",0,a,0,a,a,a],[1,166,"BrightnessDown",0,a,0,a,a,a],[1,167,"MediaPlay",0,a,0,a,a,a],[1,168,"MediaRecord",0,a,0,a,a,a],[1,169,"MediaFastForward",0,a,0,a,a,a],[1,170,"MediaRewind",0,a,0,a,a,a],[1,171,"MediaTrackNext",124,"MediaTrackNext",176,"VK_MEDIA_NEXT_TRACK",a,a],[1,172,"MediaTrackPrevious",125,"MediaTrackPrevious",177,"VK_MEDIA_PREV_TRACK",a,a],[1,173,"MediaStop",126,"MediaStop",178,"VK_MEDIA_STOP",a,a],[1,174,"Eject",0,a,0,a,a,a],[1,175,"MediaPlayPause",127,"MediaPlayPause",179,"VK_MEDIA_PLAY_PAUSE",a,a],[1,176,"MediaSelect",128,"LaunchMediaPlayer",181,"VK_MEDIA_LAUNCH_MEDIA_SELECT",a,a],[1,177,"LaunchMail",129,"LaunchMail",180,"VK_MEDIA_LAUNCH_MAIL",a,a],[1,178,"LaunchApp2",130,"LaunchApp2",183,"VK_MEDIA_LAUNCH_APP2",a,a],[1,179,"LaunchApp1",0,a,0,"VK_MEDIA_LAUNCH_APP1",a,a],[1,180,"SelectTask",0,a,0,a,a,a],[1,181,"LaunchScreenSaver",0,a,0,a,a,a],[1,182,"BrowserSearch",120,"BrowserSearch",170,"VK_BROWSER_SEARCH",a,a],[1,183,"BrowserHome",121,"BrowserHome",172,"VK_BROWSER_HOME",a,a],[1,184,"BrowserBack",122,"BrowserBack",166,"VK_BROWSER_BACK",a,a],[1,185,"BrowserForward",123,"BrowserForward",167,"VK_BROWSER_FORWARD",a,a],[1,186,"BrowserStop",0,a,0,"VK_BROWSER_STOP",a,a],[1,187,"BrowserRefresh",0,a,0,"VK_BROWSER_REFRESH",a,a],[1,188,"BrowserFavorites",0,a,0,"VK_BROWSER_FAVORITES",a,a],[1,189,"ZoomToggle",0,a,0,a,a,a],[1,190,"MailReply",0,a,0,a,a,a],[1,191,"MailForward",0,a,0,a,a,a],[1,192,"MailSend",0,a,0,a,a,a],[1,0,a,114,"KeyInComposition",229,a,a,a],[1,0,a,116,"ABNT_C2",194,"VK_ABNT_C2",a,a],[1,0,a,96,"OEM_8",223,"VK_OEM_8",a,a],[1,0,a,0,a,0,"VK_KANA",a,a],[1,0,a,0,a,0,"VK_HANGUL",a,a],[1,0,a,0,a,0,"VK_JUNJA",a,a],[1,0,a,0,a,0,"VK_FINAL",a,a],[1,0,a,0,a,0,"VK_HANJA",a,a],[1,0,a,0,a,0,"VK_KANJI",a,a],[1,0,a,0,a,0,"VK_CONVERT",a,a],[1,0,a,0,a,0,"VK_NONCONVERT",a,a],[1,0,a,0,a,0,"VK_ACCEPT",a,a],[1,0,a,0,a,0,"VK_MODECHANGE",a,a],[1,0,a,0,a,0,"VK_SELECT",a,a],[1,0,a,0,a,0,"VK_PRINT",a,a],[1,0,a,0,a,0,"VK_EXECUTE",a,a],[1,0,a,0,a,0,"VK_SNAPSHOT",a,a],[1,0,a,0,a,0,"VK_HELP",a,a],[1,0,a,0,a,0,"VK_APPS",a,a],[1,0,a,0,a,0,"VK_PROCESSKEY",a,a],[1,0,a,0,a,0,"VK_PACKET",a,a],[1,0,a,0,a,0,"VK_DBE_SBCSCHAR",a,a],[1,0,a,0,a,0,"VK_DBE_DBCSCHAR",a,a],[1,0,a,0,a,0,"VK_ATTN",a,a],[1,0,a,0,a,0,"VK_CRSEL",a,a],[1,0,a,0,a,0,"VK_EXSEL",a,a],[1,0,a,0,a,0,"VK_EREOF",a,a],[1,0,a,0,a,0,"VK_PLAY",a,a],[1,0,a,0,a,0,"VK_ZOOM",a,a],[1,0,a,0,a,0,"VK_NONAME",a,a],[1,0,a,0,a,0,"VK_PA1",a,a],[1,0,a,0,a,0,"VK_OEM_CLEAR",a,a]],n=[],t=[];for(const r of i){const[u,f,c,d,s,l,o,g,h]=r;if(t[f]||(t[f]=!0,S[f]=c,p[c]=f,_[c.toLowerCase()]=f,u&&(e.IMMUTABLE_CODE_TO_KEY_CODE[f]=d,d!==0&&d!==3&&d!==5&&d!==4&&d!==6&&d!==57&&(e.IMMUTABLE_KEY_CODE_TO_CODE[d]=f))),!n[d]){if(n[d]=!0,!s)throw new Error(`String representation missing for key code ${d} around scan code ${c}`);k.define(d,s),y.define(d,g||s),E.define(d,h||g||s)}l&&(e.EVENT_KEY_CODE_MAP[l]=d),o&&(e.NATIVE_WINDOWS_KEY_CODE_TO_KEY_CODE[o]=d)}e.IMMUTABLE_KEY_CODE_TO_CODE[3]=46})();var v;(function(a){function i(c){return k.keyCodeToStr(c)}a.toString=i;function n(c){return k.strToKeyCode(c)}a.fromString=n;function t(c){return y.keyCodeToStr(c)}a.toUserSettingsUS=t;function r(c){return E.keyCodeToStr(c)}a.toUserSettingsGeneral=r;function u(c){return y.strToKeyCode(c)||E.strToKeyCode(c)}a.fromUserSettings=u;function f(c){if(c>=98&&c<=113)return null;switch(c){case 16:return"Up";case 18:return"Down";case 15:return"Left";case 17:return"Right"}return k.keyCodeToStr(c)}a.toElectronAccelerator=f})(v||(e.KeyCodeUtils=v={}));function b(a,i){const n=(i&65535)<<16>>>0;return(a|n)>>>0}e.KeyChord=b}),define(se[125],oe([1,0,12]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResolvedKeybinding=e.ResolvedChord=e.Keybinding=e.ScanCodeChord=e.KeyCodeChord=e.createSimpleKeybinding=e.decodeKeybinding=void 0;function k(b,a){if(typeof b=="number"){if(b===0)return null;const i=(b&65535)>>>0,n=(b&4294901760)>>>16;return n!==0?new p([y(i,a),y(n,a)]):new p([y(i,a)])}else{const i=[];for(let n=0;n<b.length;n++)i.push(y(b[n],a));return new p(i)}}e.decodeKeybinding=k;function y(b,a){const i=!!(b&2048),n=!!(b&256),t=a===2?n:i,r=!!(b&1024),u=!!(b&512),f=a===2?i:n,c=b&255;return new E(t,r,u,f,c)}e.createSimpleKeybinding=y;class E{constructor(a,i,n,t,r){this.ctrlKey=a,this.shiftKey=i,this.altKey=n,this.metaKey=t,this.keyCode=r}equals(a){return a instanceof E&&this.ctrlKey===a.ctrlKey&&this.shiftKey===a.shiftKey&&this.altKey===a.altKey&&this.metaKey===a.metaKey&&this.keyCode===a.keyCode}isModifierKey(){return this.keyCode===0||this.keyCode===5||this.keyCode===57||this.keyCode===6||this.keyCode===4}isDuplicateModifierCase(){return this.ctrlKey&&this.keyCode===5||this.shiftKey&&this.keyCode===4||this.altKey&&this.keyCode===6||this.metaKey&&this.keyCode===57}}e.KeyCodeChord=E;class S{constructor(a,i,n,t,r){this.ctrlKey=a,this.shiftKey=i,this.altKey=n,this.metaKey=t,this.scanCode=r}isDuplicateModifierCase(){return this.ctrlKey&&(this.scanCode===157||this.scanCode===161)||this.shiftKey&&(this.scanCode===158||this.scanCode===162)||this.altKey&&(this.scanCode===159||this.scanCode===163)||this.metaKey&&(this.scanCode===160||this.scanCode===164)}}e.ScanCodeChord=S;class p{constructor(a){if(a.length===0)throw(0,L.illegalArgument)("chords");this.chords=a}}e.Keybinding=p;class _{constructor(a,i,n,t,r,u){this.ctrlKey=a,this.shiftKey=i,this.altKey=n,this.metaKey=t,this.keyLabel=r,this.keyAriaLabel=u}}e.ResolvedChord=_;class v{}e.ResolvedKeybinding=v}),define(se[99],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Lazy=void 0;class L{constructor(y){this.executor=y,this._didRun=!1}get value(){if(!this._didRun)try{this._value=this.executor()}catch(y){this._error=y}finally{this._didRun=!0}if(this._error)throw this._error;return this._value}get rawValue(){return this._value}}e.Lazy=L}),define(se[144],oe([1,0,99]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.writeUInt8=e.readUInt8=e.writeUInt32BE=e.readUInt32BE=e.writeUInt16LE=e.readUInt16LE=e.VSBuffer=void 0;const k=typeof Buffer<"u",y=new L.Lazy(()=>new Uint8Array(256));let E;class S{static wrap(t){return k&&!Buffer.isBuffer(t)&&(t=Buffer.from(t.buffer,t.byteOffset,t.byteLength)),new S(t)}constructor(t){this.buffer=t,this.byteLength=this.buffer.byteLength}toString(){return k?this.buffer.toString():(E||(E=new TextDecoder),E.decode(this.buffer))}}e.VSBuffer=S;function p(n,t){return n[t+0]<<0>>>0|n[t+1]<<8>>>0}e.readUInt16LE=p;function _(n,t,r){n[r+0]=t&255,t=t>>>8,n[r+1]=t&255}e.writeUInt16LE=_;function v(n,t){return n[t]*2**24+n[t+1]*2**16+n[t+2]*2**8+n[t+3]}e.readUInt32BE=v;function b(n,t,r){n[r+3]=t,t=t>>>8,n[r+2]=t,t=t>>>8,n[r+1]=t,t=t>>>8,n[r]=t}e.writeUInt32BE=b;function a(n,t){return n[t]}e.readUInt8=a;function i(n,t,r){n[r]=t}e.writeUInt8=i}),define(se[398],oe([1,0,99]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compareByPrefix=e.compareAnything=e.compareFileNames=void 0;const k=new L.Lazy(()=>{const v=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});return{collator:v,collatorIsNumeric:v.resolvedOptions().numeric}}),y=new L.Lazy(()=>({collator:new Intl.Collator(void 0,{numeric:!0})})),E=new L.Lazy(()=>({collator:new Intl.Collator(void 0,{numeric:!0,sensitivity:"accent"})}));function S(v,b,a=!1){const i=v||"",n=b||"",t=k.value.collator.compare(i,n);return k.value.collatorIsNumeric&&t===0&&i!==n?i<n?-1:1:t}e.compareFileNames=S;function p(v,b,a){const i=v.toLowerCase(),n=b.toLowerCase(),t=_(v,b,a);if(t)return t;const r=i.endsWith(a),u=n.endsWith(a);if(r!==u)return r?-1:1;const f=S(i,n);return f!==0?f:i.localeCompare(n)}e.compareAnything=p;function _(v,b,a){const i=v.toLowerCase(),n=b.toLowerCase(),t=i.startsWith(a),r=n.startsWith(a);if(t!==r)return t?-1:1;if(t&&r){if(i.length<n.length)return-1;if(i.length>n.length)return 1}return 0}e.compareByPrefix=_}),define(se[2],oe([1,0,108,52]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DisposableMap=e.ImmortalReference=e.RefCountedDisposable=e.MutableDisposable=e.Disposable=e.DisposableStore=e.toDisposable=e.combinedDisposable=e.dispose=e.isDisposable=e.markAsSingleton=e.markAsDisposed=e.trackDisposable=e.setDisposableTracker=void 0;const y=!1;let E=null;function S(o){E=o}if(e.setDisposableTracker=S,y){const o="__is_disposable_tracked__";S(new class{trackDisposable(g){const h=new Error("Potentially leaked disposable").stack;setTimeout(()=>{g[o]||console.log(h)},3e3)}setParent(g,h){if(g&&g!==f.None)try{g[o]=!0}catch{}}markAsDisposed(g){if(g&&g!==f.None)try{g[o]=!0}catch{}}markAsSingleton(g){}})}function p(o){return E?.trackDisposable(o),o}e.trackDisposable=p;function _(o){E?.markAsDisposed(o)}e.markAsDisposed=_;function v(o,g){E?.setParent(o,g)}function b(o,g){if(E)for(const h of o)E.setParent(h,g)}function a(o){return E?.markAsSingleton(o),o}e.markAsSingleton=a;function i(o){return typeof o.dispose=="function"&&o.dispose.length===0}e.isDisposable=i;function n(o){if(k.Iterable.is(o)){const g=[];for(const h of o)if(h)try{h.dispose()}catch(m){g.push(m)}if(g.length===1)throw g[0];if(g.length>1)throw new AggregateError(g,"Encountered errors while disposing of store");return Array.isArray(o)?[]:o}else if(o)return o.dispose(),o}e.dispose=n;function t(...o){const g=r(()=>n(o));return b(o,g),g}e.combinedDisposable=t;function r(o){const g=p({dispose:(0,L.createSingleCallFunction)(()=>{_(g),o()})});return g}e.toDisposable=r;class u{constructor(){this._toDispose=new Set,this._isDisposed=!1,p(this)}dispose(){this._isDisposed||(_(this),this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){if(this._toDispose.size!==0)try{n(this._toDispose)}finally{this._toDispose.clear()}}add(g){if(!g)return g;if(g===this)throw new Error("Cannot register a disposable on itself!");return v(g,this),this._isDisposed?u.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(g),g}deleteAndLeak(g){g&&this._toDispose.has(g)&&(this._toDispose.delete(g),v(g,null))}}e.DisposableStore=u,u.DISABLE_DISPOSED_WARNING=!1;class f{constructor(){this._store=new u,p(this),v(this._store,this)}dispose(){_(this),this._store.dispose()}_register(g){if(g===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(g)}}e.Disposable=f,f.None=Object.freeze({dispose(){}});class c{constructor(){this._isDisposed=!1,p(this)}get value(){return this._isDisposed?void 0:this._value}set value(g){var h;this._isDisposed||g===this._value||((h=this._value)===null||h===void 0||h.dispose(),g&&v(g,this),this._value=g)}clear(){this.value=void 0}dispose(){var g;this._isDisposed=!0,_(this),(g=this._value)===null||g===void 0||g.dispose(),this._value=void 0}}e.MutableDisposable=c;class d{constructor(g){this._disposable=g,this._counter=1}acquire(){return this._counter++,this}release(){return--this._counter===0&&this._disposable.dispose(),this}}e.RefCountedDisposable=d;class s{constructor(g){this.object=g}dispose(){}}e.ImmortalReference=s;class l{constructor(){this._store=new Map,this._isDisposed=!1,p(this)}dispose(){_(this),this._isDisposed=!0,this.clearAndDisposeAll()}clearAndDisposeAll(){if(this._store.size)try{n(this._store.values())}finally{this._store.clear()}}get(g){return this._store.get(g)}set(g,h,m=!1){var C;this._isDisposed&&console.warn(new Error("Trying to add a disposable to a DisposableMap that has already been disposed of. The added object will be leaked!").stack),m||(C=this._store.get(g))===null||C===void 0||C.dispose(),this._store.set(g,h)}deleteAndDispose(g){var h;(h=this._store.get(g))===null||h===void 0||h.dispose(),this._store.delete(g)}[Symbol.iterator](){return this._store[Symbol.iterator]()}}e.DisposableMap=l}),define(se[66],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinkedList=void 0;class L{constructor(E){this.element=E,this.next=L.Undefined,this.prev=L.Undefined}}L.Undefined=new L(void 0);class k{constructor(){this._first=L.Undefined,this._last=L.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===L.Undefined}clear(){let E=this._first;for(;E!==L.Undefined;){const S=E.next;E.prev=L.Undefined,E.next=L.Undefined,E=S}this._first=L.Undefined,this._last=L.Undefined,this._size=0}unshift(E){return this._insert(E,!1)}push(E){return this._insert(E,!0)}_insert(E,S){const p=new L(E);if(this._first===L.Undefined)this._first=p,this._last=p;else if(S){const v=this._last;this._last=p,p.prev=v,v.next=p}else{const v=this._first;this._first=p,p.next=v,v.prev=p}this._size+=1;let _=!1;return()=>{_||(_=!0,this._remove(p))}}shift(){if(this._first!==L.Undefined){const E=this._first.element;return this._remove(this._first),E}}pop(){if(this._last!==L.Undefined){const E=this._last.element;return this._remove(this._last),E}}_remove(E){if(E.prev!==L.Undefined&&E.next!==L.Undefined){const S=E.prev;S.next=E.next,E.next.prev=S}else E.prev===L.Undefined&&E.next===L.Undefined?(this._first=L.Undefined,this._last=L.Undefined):E.next===L.Undefined?(this._last=this._last.prev,this._last.next=L.Undefined):E.prev===L.Undefined&&(this._first=this._first.next,this._first.prev=L.Undefined);this._size-=1}*[Symbol.iterator](){let E=this._first;for(;E!==L.Undefined;)yield E.element,E=E.next}}e.LinkedList=k});var ke=this&&this.__decorate||function(te,e,L,k){var y=arguments.length,E=y<3?e:k===null?k=Object.getOwnPropertyDescriptor(e,L):k,S;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")E=Reflect.decorate(te,e,L,k);else for(var p=te.length-1;p>=0;p--)(S=te[p])&&(E=(y<3?S(E):y>3?S(e,L,E):S(e,L))||E);return y>3&&E&&Object.defineProperty(e,L,E),E};define(se[399],oe([1,0,107]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.parseLinkedText=e.LinkedText=void 0;class k{constructor(p){this.nodes=p}toString(){return this.nodes.map(p=>typeof p=="string"?p:p.label).join("")}}e.LinkedText=k,ke([L.memoize],k.prototype,"toString",null);const y=/\[([^\]]+)\]\(((?:https?:\/\/|command:|file:)[^\)\s]+)(?: (["'])(.+?)(\3))?\)/gi;function E(S){const p=[];let _=0,v;for(;v=y.exec(S);){v.index-_>0&&p.push(S.substring(_,v.index));const[,b,a,,i]=v;i?p.push({label:b,href:a,title:i}):p.push({label:b,href:a}),_=v.index+v[0].length}return _<S.length&&p.push(S.substring(_)),new k(p)}e.parseLinkedText=E}),define(se[53],oe([1,0]),function(te,e){"use strict";var L,k;Object.defineProperty(e,"__esModule",{value:!0}),e.SetMap=e.BidirectionalMap=e.LRUCache=e.LinkedMap=e.ResourceMap=void 0;class y{constructor(i,n){this.uri=i,this.value=n}}function E(a){return Array.isArray(a)}class S{constructor(i,n){if(this[L]="ResourceMap",i instanceof S)this.map=new Map(i.map),this.toKey=n??S.defaultToKey;else if(E(i)){this.map=new Map,this.toKey=n??S.defaultToKey;for(const[t,r]of i)this.set(t,r)}else this.map=new Map,this.toKey=i??S.defaultToKey}set(i,n){return this.map.set(this.toKey(i),new y(i,n)),this}get(i){var n;return(n=this.map.get(this.toKey(i)))===null||n===void 0?void 0:n.value}has(i){return this.map.has(this.toKey(i))}get size(){return this.map.size}clear(){this.map.clear()}delete(i){return this.map.delete(this.toKey(i))}forEach(i,n){typeof n<"u"&&(i=i.bind(n));for(const[t,r]of this.map)i(r.value,r.uri,this)}*values(){for(const i of this.map.values())yield i.value}*keys(){for(const i of this.map.values())yield i.uri}*entries(){for(const i of this.map.values())yield[i.uri,i.value]}*[(L=Symbol.toStringTag,Symbol.iterator)](){for(const[,i]of this.map)yield[i.uri,i.value]}}e.ResourceMap=S,S.defaultToKey=a=>a.toString();class p{constructor(){this[k]="LinkedMap",this._map=new Map,this._head=void 0,this._tail=void 0,this._size=0,this._state=0}clear(){this._map.clear(),this._head=void 0,this._tail=void 0,this._size=0,this._state++}isEmpty(){return!this._head&&!this._tail}get size(){return this._size}get first(){var i;return(i=this._head)===null||i===void 0?void 0:i.value}get last(){var i;return(i=this._tail)===null||i===void 0?void 0:i.value}has(i){return this._map.has(i)}get(i,n=0){const t=this._map.get(i);if(t)return n!==0&&this.touch(t,n),t.value}set(i,n,t=0){let r=this._map.get(i);if(r)r.value=n,t!==0&&this.touch(r,t);else{switch(r={key:i,value:n,next:void 0,previous:void 0},t){case 0:this.addItemLast(r);break;case 1:this.addItemFirst(r);break;case 2:this.addItemLast(r);break;default:this.addItemLast(r);break}this._map.set(i,r),this._size++}return this}delete(i){return!!this.remove(i)}remove(i){const n=this._map.get(i);if(n)return this._map.delete(i),this.removeItem(n),this._size--,n.value}shift(){if(!this._head&&!this._tail)return;if(!this._head||!this._tail)throw new Error("Invalid list");const i=this._head;return this._map.delete(i.key),this.removeItem(i),this._size--,i.value}forEach(i,n){const t=this._state;let r=this._head;for(;r;){if(n?i.bind(n)(r.value,r.key,this):i(r.value,r.key,this),this._state!==t)throw new Error("LinkedMap got modified during iteration.");r=r.next}}keys(){const i=this,n=this._state;let t=this._head;const r={[Symbol.iterator](){return r},next(){if(i._state!==n)throw new Error("LinkedMap got modified during iteration.");if(t){const u={value:t.key,done:!1};return t=t.next,u}else return{value:void 0,done:!0}}};return r}values(){const i=this,n=this._state;let t=this._head;const r={[Symbol.iterator](){return r},next(){if(i._state!==n)throw new Error("LinkedMap got modified during iteration.");if(t){const u={value:t.value,done:!1};return t=t.next,u}else return{value:void 0,done:!0}}};return r}entries(){const i=this,n=this._state;let t=this._head;const r={[Symbol.iterator](){return r},next(){if(i._state!==n)throw new Error("LinkedMap got modified during iteration.");if(t){const u={value:[t.key,t.value],done:!1};return t=t.next,u}else return{value:void 0,done:!0}}};return r}[(k=Symbol.toStringTag,Symbol.iterator)](){return this.entries()}trimOld(i){if(i>=this.size)return;if(i===0){this.clear();return}let n=this._head,t=this.size;for(;n&&t>i;)this._map.delete(n.key),n=n.next,t--;this._head=n,this._size=t,n&&(n.previous=void 0),this._state++}addItemFirst(i){if(!this._head&&!this._tail)this._tail=i;else if(this._head)i.next=this._head,this._head.previous=i;else throw new Error("Invalid list");this._head=i,this._state++}addItemLast(i){if(!this._head&&!this._tail)this._head=i;else if(this._tail)i.previous=this._tail,this._tail.next=i;else throw new Error("Invalid list");this._tail=i,this._state++}removeItem(i){if(i===this._head&&i===this._tail)this._head=void 0,this._tail=void 0;else if(i===this._head){if(!i.next)throw new Error("Invalid list");i.next.previous=void 0,this._head=i.next}else if(i===this._tail){if(!i.previous)throw new Error("Invalid list");i.previous.next=void 0,this._tail=i.previous}else{const n=i.next,t=i.previous;if(!n||!t)throw new Error("Invalid list");n.previous=t,t.next=n}i.next=void 0,i.previous=void 0,this._state++}touch(i,n){if(!this._head||!this._tail)throw new Error("Invalid list");if(!(n!==1&&n!==2)){if(n===1){if(i===this._head)return;const t=i.next,r=i.previous;i===this._tail?(r.next=void 0,this._tail=r):(t.previous=r,r.next=t),i.previous=void 0,i.next=this._head,this._head.previous=i,this._head=i,this._state++}else if(n===2){if(i===this._tail)return;const t=i.next,r=i.previous;i===this._head?(t.previous=void 0,this._head=t):(t.previous=r,r.next=t),i.next=void 0,i.previous=this._tail,this._tail.next=i,this._tail=i,this._state++}}}toJSON(){const i=[];return this.forEach((n,t)=>{i.push([t,n])}),i}fromJSON(i){this.clear();for(const[n,t]of i)this.set(n,t)}}e.LinkedMap=p;class _ extends p{constructor(i,n=1){super(),this._limit=i,this._ratio=Math.min(Math.max(0,n),1)}get limit(){return this._limit}set limit(i){this._limit=i,this.checkTrim()}get(i,n=2){return super.get(i,n)}peek(i){return super.get(i,0)}set(i,n){return super.set(i,n,2),this.checkTrim(),this}checkTrim(){this.size>this._limit&&this.trimOld(Math.round(this._limit*this._ratio))}}e.LRUCache=_;class v{constructor(i){if(this._m1=new Map,this._m2=new Map,i)for(const[n,t]of i)this.set(n,t)}clear(){this._m1.clear(),this._m2.clear()}set(i,n){this._m1.set(i,n),this._m2.set(n,i)}get(i){return this._m1.get(i)}getKey(i){return this._m2.get(i)}delete(i){const n=this._m1.get(i);return n===void 0?!1:(this._m1.delete(i),this._m2.delete(n),!0)}keys(){return this._m1.keys()}values(){return this._m1.values()}}e.BidirectionalMap=v;class b{constructor(){this.map=new Map}add(i,n){let t=this.map.get(i);t||(t=new Set,this.map.set(i,t)),t.add(n)}delete(i,n){const t=this.map.get(i);t&&(t.delete(n),t.size===0&&this.map.delete(i))}forEach(i,n){const t=this.map.get(i);t&&t.forEach(n)}get(i){const n=this.map.get(i);return n||new Set}}e.SetMap=b}),function(te,e){typeof define=="function"&&define.amd?define(se[400],oe([0]),e):typeof exports=="object"&&typeof module<"u"?e(exports):(te=typeof globalThis<"u"?globalThis:te||self,e(te.marked={}))}(this,function(te){"use strict";function e(U,G){for(var z=0;z<G.length;z++){var H=G[z];H.enumerable=H.enumerable||!1,H.configurable=!0,"value"in H&&(H.writable=!0),Object.defineProperty(U,H.key,H)}}function L(U,G,z){return G&&e(U.prototype,G),z&&e(U,z),Object.defineProperty(U,"prototype",{writable:!1}),U}function k(U,G){if(U){if(typeof U=="string")return y(U,G);var z=Object.prototype.toString.call(U).slice(8,-1);if(z==="Object"&&U.constructor&&(z=U.constructor.name),z==="Map"||z==="Set")return Array.from(U);if(z==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(z))return y(U,G)}}function y(U,G){(G==null||G>U.length)&&(G=U.length);for(var z=0,H=new Array(G);z<G;z++)H[z]=U[z];return H}function E(U,G){var z=typeof Symbol<"u"&&U[Symbol.iterator]||U["@@iterator"];if(z)return(z=z.call(U)).next.bind(z);if(Array.isArray(U)||(z=k(U))||G&&U&&typeof U.length=="number"){z&&(U=z);var H=0;return function(){return H>=U.length?{done:!0}:{done:!1,value:U[H++]}}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
+In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function S(){return{async:!1,baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}te.defaults=S();function p(U){te.defaults=U}var _=/[&<>"']/,v=/[&<>"']/g,b=/[<>"']|&(?!#?\w+;)/,a=/[<>"']|&(?!#?\w+;)/g,i={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},n=function(G){return i[G]};function t(U,G){if(G){if(_.test(U))return U.replace(v,n)}else if(b.test(U))return U.replace(a,n);return U}var r=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function u(U){return U.replace(r,function(G,z){return z=z.toLowerCase(),z==="colon"?":":z.charAt(0)==="#"?z.charAt(1)==="x"?String.fromCharCode(parseInt(z.substring(2),16)):String.fromCharCode(+z.substring(1)):""})}var f=/(^|[^\[])\^/g;function c(U,G){U=typeof U=="string"?U:U.source,G=G||"";var z={replace:function(Y,j){return j=j.source||j,j=j.replace(f,"$1"),U=U.replace(Y,j),z},getRegex:function(){return new RegExp(U,G)}};return z}var d=/[^\w:]/g,s=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function l(U,G,z){if(U){var H;try{H=decodeURIComponent(u(z)).replace(d,"").toLowerCase()}catch{return null}if(H.indexOf("javascript:")===0||H.indexOf("vbscript:")===0||H.indexOf("data:")===0)return null}G&&!s.test(z)&&(z=C(G,z));try{z=encodeURI(z).replace(/%25/g,"%")}catch{return null}return z}var o={},g=/^[^:]+:\/*[^/]*$/,h=/^([^:]+:)[\s\S]*$/,m=/^([^:]+:\/*[^/]*)[\s\S]*$/;function C(U,G){o[" "+U]||(g.test(U)?o[" "+U]=U+"/":o[" "+U]=T(U,"/",!0)),U=o[" "+U];var z=U.indexOf(":")===-1;return G.substring(0,2)==="//"?z?G:U.replace(h,"$1")+G:G.charAt(0)==="/"?z?G:U.replace(m,"$1")+G:U+G}var w={exec:function(){}};function D(U){for(var G=1,z,H;G<arguments.length;G++){z=arguments[G];for(H in z)Object.prototype.hasOwnProperty.call(z,H)&&(U[H]=z[H])}return U}function I(U,G){var z=U.replace(/\|/g,function(j,Z,ee){for(var le=!1,ue=Z;--ue>=0&&ee[ue]==="\\";)le=!le;return le?"|":" |"}),H=z.split(/ \|/),Y=0;if(H[0].trim()||H.shift(),H.length>0&&!H[H.length-1].trim()&&H.pop(),H.length>G)H.splice(G);else for(;H.length<G;)H.push("");for(;Y<H.length;Y++)H[Y]=H[Y].trim().replace(/\\\|/g,"|");return H}function T(U,G,z){var H=U.length;if(H===0)return"";for(var Y=0;Y<H;){var j=U.charAt(H-Y-1);if(j===G&&!z)Y++;else if(j!==G&&z)Y++;else break}return U.slice(0,H-Y)}function A(U,G){if(U.indexOf(G[1])===-1)return-1;for(var z=U.length,H=0,Y=0;Y<z;Y++)if(U[Y]==="\\")Y++;else if(U[Y]===G[0])H++;else if(U[Y]===G[1]&&(H--,H<0))return Y;return-1}function P(U){U&&U.sanitize&&!U.silent&&console.warn("marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options")}function N(U,G){if(G<1)return"";for(var z="";G>1;)G&1&&(z+=U),G>>=1,U+=U;return z+U}function M(U,G,z,H){var Y=G.href,j=G.title?t(G.title):null,Z=U[1].replace(/\\([\[\]])/g,"$1");if(U[0].charAt(0)!=="!"){H.state.inLink=!0;var ee={type:"link",raw:z,href:Y,title:j,text:Z,tokens:H.inlineTokens(Z)};return H.state.inLink=!1,ee}return{type:"image",raw:z,href:Y,title:j,text:t(Z)}}function R(U,G){var z=U.match(/^(\s+)(?:```)/);if(z===null)return G;var H=z[1];return G.split(`
+`).map(function(Y){var j=Y.match(/^\s+/);if(j===null)return Y;var Z=j[0];return Z.length>=H.length?Y.slice(H.length):Y}).join(`
+`)}var x=function(){function U(z){this.options=z||te.defaults}var G=U.prototype;return G.space=function(H){var Y=this.rules.block.newline.exec(H);if(Y&&Y[0].length>0)return{type:"space",raw:Y[0]}},G.code=function(H){var Y=this.rules.block.code.exec(H);if(Y){var j=Y[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:Y[0],codeBlockStyle:"indented",text:this.options.pedantic?j:T(j,`
+`)}}},G.fences=function(H){var Y=this.rules.block.fences.exec(H);if(Y){var j=Y[0],Z=R(j,Y[3]||"");return{type:"code",raw:j,lang:Y[2]?Y[2].trim():Y[2],text:Z}}},G.heading=function(H){var Y=this.rules.block.heading.exec(H);if(Y){var j=Y[2].trim();if(/#$/.test(j)){var Z=T(j,"#");(this.options.pedantic||!Z||/ $/.test(Z))&&(j=Z.trim())}return{type:"heading",raw:Y[0],depth:Y[1].length,text:j,tokens:this.lexer.inline(j)}}},G.hr=function(H){var Y=this.rules.block.hr.exec(H);if(Y)return{type:"hr",raw:Y[0]}},G.blockquote=function(H){var Y=this.rules.block.blockquote.exec(H);if(Y){var j=Y[0].replace(/^ *>[ \t]?/gm,"");return{type:"blockquote",raw:Y[0],tokens:this.lexer.blockTokens(j,[]),text:j}}},G.list=function(H){var Y=this.rules.block.list.exec(H);if(Y){var j,Z,ee,le,ue,ce,pe,ve,Ce,Se,_e,Ee,Ae=Y[1].trim(),xe=Ae.length>1,Be={type:"list",raw:"",ordered:xe,start:xe?+Ae.slice(0,-1):"",loose:!1,items:[]};Ae=xe?"\\d{1,9}\\"+Ae.slice(-1):"\\"+Ae,this.options.pedantic&&(Ae=xe?Ae:"[*+-]");for(var De=new RegExp("^( {0,3}"+Ae+")((?:[	 ][^\\n]*)?(?:\\n|$))");H&&(Ee=!1,!(!(Y=De.exec(H))||this.rules.block.hr.test(H)));){if(j=Y[0],H=H.substring(j.length),ve=Y[2].split(`
+`,1)[0],Ce=H.split(`
+`,1)[0],this.options.pedantic?(le=2,_e=ve.trimLeft()):(le=Y[2].search(/[^ ]/),le=le>4?1:le,_e=ve.slice(le),le+=Y[1].length),ce=!1,!ve&&/^ *$/.test(Ce)&&(j+=Ce+`
+`,H=H.substring(Ce.length+1),Ee=!0),!Ee)for(var Ie=new RegExp("^ {0,"+Math.min(3,le-1)+"}(?:[*+-]|\\d{1,9}[.)])((?: [^\\n]*)?(?:\\n|$))"),fe=new RegExp("^ {0,"+Math.min(3,le-1)+"}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)"),be=new RegExp("^ {0,"+Math.min(3,le-1)+"}(?:```|~~~)"),Ne=new RegExp("^ {0,"+Math.min(3,le-1)+"}#");H&&(Se=H.split(`
+`,1)[0],ve=Se,this.options.pedantic&&(ve=ve.replace(/^ {1,4}(?=( {4})*[^ ])/g,"  ")),!(be.test(ve)||Ne.test(ve)||Ie.test(ve)||fe.test(H)));){if(ve.search(/[^ ]/)>=le||!ve.trim())_e+=`
+`+ve.slice(le);else if(!ce)_e+=`
+`+ve;else break;!ce&&!ve.trim()&&(ce=!0),j+=Se+`
+`,H=H.substring(Se.length+1)}Be.loose||(pe?Be.loose=!0:/\n *\n *$/.test(j)&&(pe=!0)),this.options.gfm&&(Z=/^\[[ xX]\] /.exec(_e),Z&&(ee=Z[0]!=="[ ] ",_e=_e.replace(/^\[[ xX]\] +/,""))),Be.items.push({type:"list_item",raw:j,task:!!Z,checked:ee,loose:!1,text:_e}),Be.raw+=j}Be.items[Be.items.length-1].raw=j.trimRight(),Be.items[Be.items.length-1].text=_e.trimRight(),Be.raw=Be.raw.trimRight();var Pe=Be.items.length;for(ue=0;ue<Pe;ue++){this.lexer.state.top=!1,Be.items[ue].tokens=this.lexer.blockTokens(Be.items[ue].text,[]);var ze=Be.items[ue].tokens.filter(function(je){return je.type==="space"}),Ke=ze.every(function(je){for(var Je=je.raw.split(""),rt=0,et=E(Je),st;!(st=et()).done;){var Qe=st.value;if(Qe===`
+`&&(rt+=1),rt>1)return!0}return!1});!Be.loose&&ze.length&&Ke&&(Be.loose=!0,Be.items[ue].loose=!0)}return Be}},G.html=function(H){var Y=this.rules.block.html.exec(H);if(Y){var j={type:"html",raw:Y[0],pre:!this.options.sanitizer&&(Y[1]==="pre"||Y[1]==="script"||Y[1]==="style"),text:Y[0]};if(this.options.sanitize){var Z=this.options.sanitizer?this.options.sanitizer(Y[0]):t(Y[0]);j.type="paragraph",j.text=Z,j.tokens=this.lexer.inline(Z)}return j}},G.def=function(H){var Y=this.rules.block.def.exec(H);if(Y){Y[3]&&(Y[3]=Y[3].substring(1,Y[3].length-1));var j=Y[1].toLowerCase().replace(/\s+/g," ");return{type:"def",tag:j,raw:Y[0],href:Y[2],title:Y[3]}}},G.table=function(H){var Y=this.rules.block.table.exec(H);if(Y){var j={type:"table",header:I(Y[1]).map(function(pe){return{text:pe}}),align:Y[2].replace(/^ *|\| *$/g,"").split(/ *\| */),rows:Y[3]&&Y[3].trim()?Y[3].replace(/\n[ \t]*$/,"").split(`
+`):[]};if(j.header.length===j.align.length){j.raw=Y[0];var Z=j.align.length,ee,le,ue,ce;for(ee=0;ee<Z;ee++)/^ *-+: *$/.test(j.align[ee])?j.align[ee]="right":/^ *:-+: *$/.test(j.align[ee])?j.align[ee]="center":/^ *:-+ *$/.test(j.align[ee])?j.align[ee]="left":j.align[ee]=null;for(Z=j.rows.length,ee=0;ee<Z;ee++)j.rows[ee]=I(j.rows[ee],j.header.length).map(function(pe){return{text:pe}});for(Z=j.header.length,le=0;le<Z;le++)j.header[le].tokens=this.lexer.inline(j.header[le].text);for(Z=j.rows.length,le=0;le<Z;le++)for(ce=j.rows[le],ue=0;ue<ce.length;ue++)ce[ue].tokens=this.lexer.inline(ce[ue].text);return j}}},G.lheading=function(H){var Y=this.rules.block.lheading.exec(H);if(Y)return{type:"heading",raw:Y[0],depth:Y[2].charAt(0)==="="?1:2,text:Y[1],tokens:this.lexer.inline(Y[1])}},G.paragraph=function(H){var Y=this.rules.block.paragraph.exec(H);if(Y){var j=Y[1].charAt(Y[1].length-1)===`
+`?Y[1].slice(0,-1):Y[1];return{type:"paragraph",raw:Y[0],text:j,tokens:this.lexer.inline(j)}}},G.text=function(H){var Y=this.rules.block.text.exec(H);if(Y)return{type:"text",raw:Y[0],text:Y[0],tokens:this.lexer.inline(Y[0])}},G.escape=function(H){var Y=this.rules.inline.escape.exec(H);if(Y)return{type:"escape",raw:Y[0],text:t(Y[1])}},G.tag=function(H){var Y=this.rules.inline.tag.exec(H);if(Y)return!this.lexer.state.inLink&&/^<a /i.test(Y[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&/^<\/a>/i.test(Y[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(Y[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(Y[0])&&(this.lexer.state.inRawBlock=!1),{type:this.options.sanitize?"text":"html",raw:Y[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(Y[0]):t(Y[0]):Y[0]}},G.link=function(H){var Y=this.rules.inline.link.exec(H);if(Y){var j=Y[2].trim();if(!this.options.pedantic&&/^</.test(j)){if(!/>$/.test(j))return;var Z=T(j.slice(0,-1),"\\");if((j.length-Z.length)%2===0)return}else{var ee=A(Y[2],"()");if(ee>-1){var le=Y[0].indexOf("!")===0?5:4,ue=le+Y[1].length+ee;Y[2]=Y[2].substring(0,ee),Y[0]=Y[0].substring(0,ue).trim(),Y[3]=""}}var ce=Y[2],pe="";if(this.options.pedantic){var ve=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(ce);ve&&(ce=ve[1],pe=ve[3])}else pe=Y[3]?Y[3].slice(1,-1):"";return ce=ce.trim(),/^</.test(ce)&&(this.options.pedantic&&!/>$/.test(j)?ce=ce.slice(1):ce=ce.slice(1,-1)),M(Y,{href:ce&&ce.replace(this.rules.inline._escapes,"$1"),title:pe&&pe.replace(this.rules.inline._escapes,"$1")},Y[0],this.lexer)}},G.reflink=function(H,Y){var j;if((j=this.rules.inline.reflink.exec(H))||(j=this.rules.inline.nolink.exec(H))){var Z=(j[2]||j[1]).replace(/\s+/g," ");if(Z=Y[Z.toLowerCase()],!Z||!Z.href){var ee=j[0].charAt(0);return{type:"text",raw:ee,text:ee}}return M(j,Z,j[0],this.lexer)}},G.emStrong=function(H,Y,j){j===void 0&&(j="");var Z=this.rules.inline.emStrong.lDelim.exec(H);if(Z&&!(Z[3]&&j.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDF70-\uDF81\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD837[\uDF00-\uDF1E]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD839[\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF38\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/))){var ee=Z[1]||Z[2]||"";if(!ee||ee&&(j===""||this.rules.inline.punctuation.exec(j))){var le=Z[0].length-1,ue,ce,pe=le,ve=0,Ce=Z[0][0]==="*"?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(Ce.lastIndex=0,Y=Y.slice(-1*H.length+le);(Z=Ce.exec(Y))!=null;)if(ue=Z[1]||Z[2]||Z[3]||Z[4]||Z[5]||Z[6],!!ue){if(ce=ue.length,Z[3]||Z[4]){pe+=ce;continue}else if((Z[5]||Z[6])&&le%3&&!((le+ce)%3)){ve+=ce;continue}if(pe-=ce,!(pe>0)){if(ce=Math.min(ce,ce+pe+ve),Math.min(le,ce)%2){var Se=H.slice(1,le+Z.index+ce);return{type:"em",raw:H.slice(0,le+Z.index+ce+1),text:Se,tokens:this.lexer.inlineTokens(Se)}}var _e=H.slice(2,le+Z.index+ce-1);return{type:"strong",raw:H.slice(0,le+Z.index+ce+1),text:_e,tokens:this.lexer.inlineTokens(_e)}}}}}},G.codespan=function(H){var Y=this.rules.inline.code.exec(H);if(Y){var j=Y[2].replace(/\n/g," "),Z=/[^ ]/.test(j),ee=/^ /.test(j)&&/ $/.test(j);return Z&&ee&&(j=j.substring(1,j.length-1)),j=t(j,!0),{type:"codespan",raw:Y[0],text:j}}},G.br=function(H){var Y=this.rules.inline.br.exec(H);if(Y)return{type:"br",raw:Y[0]}},G.del=function(H){var Y=this.rules.inline.del.exec(H);if(Y)return{type:"del",raw:Y[0],text:Y[2],tokens:this.lexer.inlineTokens(Y[2])}},G.autolink=function(H,Y){var j=this.rules.inline.autolink.exec(H);if(j){var Z,ee;return j[2]==="@"?(Z=t(this.options.mangle?Y(j[1]):j[1]),ee="mailto:"+Z):(Z=t(j[1]),ee=Z),{type:"link",raw:j[0],text:Z,href:ee,tokens:[{type:"text",raw:Z,text:Z}]}}},G.url=function(H,Y){var j;if(j=this.rules.inline.url.exec(H)){var Z,ee;if(j[2]==="@")Z=t(this.options.mangle?Y(j[0]):j[0]),ee="mailto:"+Z;else{var le;do le=j[0],j[0]=this.rules.inline._backpedal.exec(j[0])[0];while(le!==j[0]);Z=t(j[0]),j[1]==="www."?ee="http://"+Z:ee=Z}return{type:"link",raw:j[0],text:Z,href:ee,tokens:[{type:"text",raw:Z,text:Z}]}}},G.inlineText=function(H,Y){var j=this.rules.inline.text.exec(H);if(j){var Z;return this.lexer.state.inRawBlock?Z=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(j[0]):t(j[0]):j[0]:Z=t(this.options.smartypants?Y(j[0]):j[0]),{type:"text",raw:j[0],text:Z}}},U}(),O={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/,hr:/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/,html:"^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))",def:/^ {0,3}\[(label)\]: *(?:\n *)?<?([^\s>]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/,table:w,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,text:/^[^\n]+/};O._label=/(?!\s*\])(?:\\.|[^\[\]\\])+/,O._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/,O.def=c(O.def).replace("label",O._label).replace("title",O._title).getRegex(),O.bullet=/(?:[*+-]|\d{1,9}[.)])/,O.listItemStart=c(/^( *)(bull) */).replace("bull",O.bullet).getRegex(),O.list=c(O.list).replace(/bull/g,O.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+O.def.source+")").getRegex(),O._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",O._comment=/<!--(?!-?>)[\s\S]*?(?:-->|$)/,O.html=c(O.html,"i").replace("comment",O._comment).replace("tag",O._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),O.paragraph=c(O._paragraph).replace("hr",O.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",O._tag).getRegex(),O.blockquote=c(O.blockquote).replace("paragraph",O.paragraph).getRegex(),O.normal=D({},O),O.gfm=D({},O.normal,{table:"^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),O.gfm.table=c(O.gfm.table).replace("hr",O.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",O._tag).getRegex(),O.gfm.paragraph=c(O._paragraph).replace("hr",O.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("table",O.gfm.table).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",O._tag).getRegex(),O.pedantic=D({},O.normal,{html:c(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",O._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:w,paragraph:c(O.normal._paragraph).replace("hr",O.hr).replace("heading",` *#{1,6} *[^
+]`).replace("lheading",O.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var B={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:w,tag:"^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(ref)\]/,nolink:/^!?\[(ref)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,rDelimAst:/^[^_*]*?\_\_[^_*]*?\*[^_*]*?(?=\_\_)|[^*]+(?=[^*])|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,rDelimUnd:/^[^_*]*?\*\*[^_*]*?\_[^_*]*?(?=\*\*)|[^_]+(?=[^_])|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:w,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,punctuation:/^([\spunctuation])/};B._punctuation="!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~",B.punctuation=c(B.punctuation).replace(/punctuation/g,B._punctuation).getRegex(),B.blockSkip=/\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g,B.escapedEmSt=/\\\*|\\_/g,B._comment=c(O._comment).replace("(?:-->|$)","-->").getRegex(),B.emStrong.lDelim=c(B.emStrong.lDelim).replace(/punct/g,B._punctuation).getRegex(),B.emStrong.rDelimAst=c(B.emStrong.rDelimAst,"g").replace(/punct/g,B._punctuation).getRegex(),B.emStrong.rDelimUnd=c(B.emStrong.rDelimUnd,"g").replace(/punct/g,B._punctuation).getRegex(),B._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,B._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,B._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,B.autolink=c(B.autolink).replace("scheme",B._scheme).replace("email",B._email).getRegex(),B._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,B.tag=c(B.tag).replace("comment",B._comment).replace("attribute",B._attribute).getRegex(),B._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,B._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,B._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,B.link=c(B.link).replace("label",B._label).replace("href",B._href).replace("title",B._title).getRegex(),B.reflink=c(B.reflink).replace("label",B._label).replace("ref",O._label).getRegex(),B.nolink=c(B.nolink).replace("ref",O._label).getRegex(),B.reflinkSearch=c(B.reflinkSearch,"g").replace("reflink",B.reflink).replace("nolink",B.nolink).getRegex(),B.normal=D({},B),B.pedantic=D({},B.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:c(/^!?\[(label)\]\((.*?)\)/).replace("label",B._label).getRegex(),reflink:c(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",B._label).getRegex()}),B.gfm=D({},B.normal,{escape:c(B.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/}),B.gfm.url=c(B.gfm.url,"i").replace("email",B.gfm._extended_email).getRegex(),B.breaks=D({},B.gfm,{br:c(B.br).replace("{2,}","*").getRegex(),text:c(B.gfm.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()});function W(U){return U.replace(/---/g,"\u2014").replace(/--/g,"\u2013").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1\u2018").replace(/'/g,"\u2019").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1\u201C").replace(/"/g,"\u201D").replace(/\.{3}/g,"\u2026")}function V(U){var G="",z,H,Y=U.length;for(z=0;z<Y;z++)H=U.charCodeAt(z),Math.random()>.5&&(H="x"+H.toString(16)),G+="&#"+H+";";return G}var K=function(){function U(z){this.tokens=[],this.tokens.links=Object.create(null),this.options=z||te.defaults,this.options.tokenizer=this.options.tokenizer||new x,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};var H={block:O.normal,inline:B.normal};this.options.pedantic?(H.block=O.pedantic,H.inline=B.pedantic):this.options.gfm&&(H.block=O.gfm,this.options.breaks?H.inline=B.breaks:H.inline=B.gfm),this.tokenizer.rules=H}U.lex=function(H,Y){var j=new U(Y);return j.lex(H)},U.lexInline=function(H,Y){var j=new U(Y);return j.inlineTokens(H)};var G=U.prototype;return G.lex=function(H){H=H.replace(/\r\n|\r/g,`
+`),this.blockTokens(H,this.tokens);for(var Y;Y=this.inlineQueue.shift();)this.inlineTokens(Y.src,Y.tokens);return this.tokens},G.blockTokens=function(H,Y){var j=this;Y===void 0&&(Y=[]),this.options.pedantic?H=H.replace(/\t/g,"    ").replace(/^ +$/gm,""):H=H.replace(/^( *)(\t+)/gm,function(pe,ve,Ce){return ve+"    ".repeat(Ce.length)});for(var Z,ee,le,ue;H;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some(function(pe){return(Z=pe.call({lexer:j},H,Y))?(H=H.substring(Z.raw.length),Y.push(Z),!0):!1}))){if(Z=this.tokenizer.space(H)){H=H.substring(Z.raw.length),Z.raw.length===1&&Y.length>0?Y[Y.length-1].raw+=`
+`:Y.push(Z);continue}if(Z=this.tokenizer.code(H)){H=H.substring(Z.raw.length),ee=Y[Y.length-1],ee&&(ee.type==="paragraph"||ee.type==="text")?(ee.raw+=`
+`+Z.raw,ee.text+=`
+`+Z.text,this.inlineQueue[this.inlineQueue.length-1].src=ee.text):Y.push(Z);continue}if(Z=this.tokenizer.fences(H)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(Z=this.tokenizer.heading(H)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(Z=this.tokenizer.hr(H)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(Z=this.tokenizer.blockquote(H)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(Z=this.tokenizer.list(H)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(Z=this.tokenizer.html(H)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(Z=this.tokenizer.def(H)){H=H.substring(Z.raw.length),ee=Y[Y.length-1],ee&&(ee.type==="paragraph"||ee.type==="text")?(ee.raw+=`
+`+Z.raw,ee.text+=`
+`+Z.raw,this.inlineQueue[this.inlineQueue.length-1].src=ee.text):this.tokens.links[Z.tag]||(this.tokens.links[Z.tag]={href:Z.href,title:Z.title});continue}if(Z=this.tokenizer.table(H)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(Z=this.tokenizer.lheading(H)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(le=H,this.options.extensions&&this.options.extensions.startBlock&&function(){var pe=1/0,ve=H.slice(1),Ce=void 0;j.options.extensions.startBlock.forEach(function(Se){Ce=Se.call({lexer:this},ve),typeof Ce=="number"&&Ce>=0&&(pe=Math.min(pe,Ce))}),pe<1/0&&pe>=0&&(le=H.substring(0,pe+1))}(),this.state.top&&(Z=this.tokenizer.paragraph(le))){ee=Y[Y.length-1],ue&&ee.type==="paragraph"?(ee.raw+=`
+`+Z.raw,ee.text+=`
+`+Z.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=ee.text):Y.push(Z),ue=le.length!==H.length,H=H.substring(Z.raw.length);continue}if(Z=this.tokenizer.text(H)){H=H.substring(Z.raw.length),ee=Y[Y.length-1],ee&&ee.type==="text"?(ee.raw+=`
+`+Z.raw,ee.text+=`
+`+Z.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=ee.text):Y.push(Z);continue}if(H){var ce="Infinite loop on byte: "+H.charCodeAt(0);if(this.options.silent){console.error(ce);break}else throw new Error(ce)}}return this.state.top=!0,Y},G.inline=function(H,Y){return Y===void 0&&(Y=[]),this.inlineQueue.push({src:H,tokens:Y}),Y},G.inlineTokens=function(H,Y){var j=this;Y===void 0&&(Y=[]);var Z,ee,le,ue=H,ce,pe,ve;if(this.tokens.links){var Ce=Object.keys(this.tokens.links);if(Ce.length>0)for(;(ce=this.tokenizer.rules.inline.reflinkSearch.exec(ue))!=null;)Ce.includes(ce[0].slice(ce[0].lastIndexOf("[")+1,-1))&&(ue=ue.slice(0,ce.index)+"["+N("a",ce[0].length-2)+"]"+ue.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(ce=this.tokenizer.rules.inline.blockSkip.exec(ue))!=null;)ue=ue.slice(0,ce.index)+"["+N("a",ce[0].length-2)+"]"+ue.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;(ce=this.tokenizer.rules.inline.escapedEmSt.exec(ue))!=null;)ue=ue.slice(0,ce.index)+"++"+ue.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);for(;H;)if(pe||(ve=""),pe=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some(function(_e){return(Z=_e.call({lexer:j},H,Y))?(H=H.substring(Z.raw.length),Y.push(Z),!0):!1}))){if(Z=this.tokenizer.escape(H)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(Z=this.tokenizer.tag(H)){H=H.substring(Z.raw.length),ee=Y[Y.length-1],ee&&Z.type==="text"&&ee.type==="text"?(ee.raw+=Z.raw,ee.text+=Z.text):Y.push(Z);continue}if(Z=this.tokenizer.link(H)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(Z=this.tokenizer.reflink(H,this.tokens.links)){H=H.substring(Z.raw.length),ee=Y[Y.length-1],ee&&Z.type==="text"&&ee.type==="text"?(ee.raw+=Z.raw,ee.text+=Z.text):Y.push(Z);continue}if(Z=this.tokenizer.emStrong(H,ue,ve)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(Z=this.tokenizer.codespan(H)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(Z=this.tokenizer.br(H)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(Z=this.tokenizer.del(H)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(Z=this.tokenizer.autolink(H,V)){H=H.substring(Z.raw.length),Y.push(Z);continue}if(!this.state.inLink&&(Z=this.tokenizer.url(H,V))){H=H.substring(Z.raw.length),Y.push(Z);continue}if(le=H,this.options.extensions&&this.options.extensions.startInline&&function(){var _e=1/0,Ee=H.slice(1),Ae=void 0;j.options.extensions.startInline.forEach(function(xe){Ae=xe.call({lexer:this},Ee),typeof Ae=="number"&&Ae>=0&&(_e=Math.min(_e,Ae))}),_e<1/0&&_e>=0&&(le=H.substring(0,_e+1))}(),Z=this.tokenizer.inlineText(le,W)){H=H.substring(Z.raw.length),Z.raw.slice(-1)!=="_"&&(ve=Z.raw.slice(-1)),pe=!0,ee=Y[Y.length-1],ee&&ee.type==="text"?(ee.raw+=Z.raw,ee.text+=Z.text):Y.push(Z);continue}if(H){var Se="Infinite loop on byte: "+H.charCodeAt(0);if(this.options.silent){console.error(Se);break}else throw new Error(Se)}}return Y},L(U,null,[{key:"rules",get:function(){return{block:O,inline:B}}}]),U}(),F=function(){function U(z){this.options=z||te.defaults}var G=U.prototype;return G.code=function(H,Y,j){var Z=(Y||"").match(/\S*/)[0];if(this.options.highlight){var ee=this.options.highlight(H,Z);ee!=null&&ee!==H&&(j=!0,H=ee)}return H=H.replace(/\n$/,"")+`
+`,Z?'<pre><code class="'+this.options.langPrefix+t(Z,!0)+'">'+(j?H:t(H,!0))+`</code></pre>
+`:"<pre><code>"+(j?H:t(H,!0))+`</code></pre>
+`},G.blockquote=function(H){return`<blockquote>
+`+H+`</blockquote>
+`},G.html=function(H){return H},G.heading=function(H,Y,j,Z){if(this.options.headerIds){var ee=this.options.headerPrefix+Z.slug(j);return"<h"+Y+' id="'+ee+'">'+H+"</h"+Y+`>
+`}return"<h"+Y+">"+H+"</h"+Y+`>
+`},G.hr=function(){return this.options.xhtml?`<hr/>
+`:`<hr>
+`},G.list=function(H,Y,j){var Z=Y?"ol":"ul",ee=Y&&j!==1?' start="'+j+'"':"";return"<"+Z+ee+`>
+`+H+"</"+Z+`>
+`},G.listitem=function(H){return"<li>"+H+`</li>
+`},G.checkbox=function(H){return"<input "+(H?'checked="" ':"")+'disabled="" type="checkbox"'+(this.options.xhtml?" /":"")+"> "},G.paragraph=function(H){return"<p>"+H+`</p>
+`},G.table=function(H,Y){return Y&&(Y="<tbody>"+Y+"</tbody>"),`<table>
+<thead>
+`+H+`</thead>
+`+Y+`</table>
+`},G.tablerow=function(H){return`<tr>
+`+H+`</tr>
+`},G.tablecell=function(H,Y){var j=Y.header?"th":"td",Z=Y.align?"<"+j+' align="'+Y.align+'">':"<"+j+">";return Z+H+("</"+j+`>
+`)},G.strong=function(H){return"<strong>"+H+"</strong>"},G.em=function(H){return"<em>"+H+"</em>"},G.codespan=function(H){return"<code>"+H+"</code>"},G.br=function(){return this.options.xhtml?"<br/>":"<br>"},G.del=function(H){return"<del>"+H+"</del>"},G.link=function(H,Y,j){if(H=l(this.options.sanitize,this.options.baseUrl,H),H===null)return j;var Z='<a href="'+t(H)+'"';return Y&&(Z+=' title="'+Y+'"'),Z+=">"+j+"</a>",Z},G.image=function(H,Y,j){if(H=l(this.options.sanitize,this.options.baseUrl,H),H===null)return j;var Z='<img src="'+H+'" alt="'+j+'"';return Y&&(Z+=' title="'+Y+'"'),Z+=this.options.xhtml?"/>":">",Z},G.text=function(H){return H},U}(),q=function(){function U(){}var G=U.prototype;return G.strong=function(H){return H},G.em=function(H){return H},G.codespan=function(H){return H},G.del=function(H){return H},G.html=function(H){return H},G.text=function(H){return H},G.link=function(H,Y,j){return""+j},G.image=function(H,Y,j){return""+j},G.br=function(){return""},U}(),ie=function(){function U(){this.seen={}}var G=U.prototype;return G.serialize=function(H){return H.toLowerCase().trim().replace(/<[!\/a-z].*?>/ig,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},G.getNextSafeSlug=function(H,Y){var j=H,Z=0;if(this.seen.hasOwnProperty(j)){Z=this.seen[H];do Z++,j=H+"-"+Z;while(this.seen.hasOwnProperty(j))}return Y||(this.seen[H]=Z,this.seen[j]=0),j},G.slug=function(H,Y){Y===void 0&&(Y={});var j=this.serialize(H);return this.getNextSafeSlug(j,Y.dryrun)},U}(),ae=function(){function U(z){this.options=z||te.defaults,this.options.renderer=this.options.renderer||new F,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new q,this.slugger=new ie}U.parse=function(H,Y){var j=new U(Y);return j.parse(H)},U.parseInline=function(H,Y){var j=new U(Y);return j.parseInline(H)};var G=U.prototype;return G.parse=function(H,Y){Y===void 0&&(Y=!0);var j="",Z,ee,le,ue,ce,pe,ve,Ce,Se,_e,Ee,Ae,xe,Be,De,Ie,fe,be,Ne,Pe=H.length;for(Z=0;Z<Pe;Z++){if(_e=H[Z],this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[_e.type]&&(Ne=this.options.extensions.renderers[_e.type].call({parser:this},_e),Ne!==!1||!["space","hr","heading","code","table","blockquote","list","html","paragraph","text"].includes(_e.type))){j+=Ne||"";continue}switch(_e.type){case"space":continue;case"hr":{j+=this.renderer.hr();continue}case"heading":{j+=this.renderer.heading(this.parseInline(_e.tokens),_e.depth,u(this.parseInline(_e.tokens,this.textRenderer)),this.slugger);continue}case"code":{j+=this.renderer.code(_e.text,_e.lang,_e.escaped);continue}case"table":{for(Ce="",ve="",ue=_e.header.length,ee=0;ee<ue;ee++)ve+=this.renderer.tablecell(this.parseInline(_e.header[ee].tokens),{header:!0,align:_e.align[ee]});for(Ce+=this.renderer.tablerow(ve),Se="",ue=_e.rows.length,ee=0;ee<ue;ee++){for(pe=_e.rows[ee],ve="",ce=pe.length,le=0;le<ce;le++)ve+=this.renderer.tablecell(this.parseInline(pe[le].tokens),{header:!1,align:_e.align[le]});Se+=this.renderer.tablerow(ve)}j+=this.renderer.table(Ce,Se);continue}case"blockquote":{Se=this.parse(_e.tokens),j+=this.renderer.blockquote(Se);continue}case"list":{for(Ee=_e.ordered,Ae=_e.start,xe=_e.loose,ue=_e.items.length,Se="",ee=0;ee<ue;ee++)De=_e.items[ee],Ie=De.checked,fe=De.task,Be="",De.task&&(be=this.renderer.checkbox(Ie),xe?De.tokens.length>0&&De.tokens[0].type==="paragraph"?(De.tokens[0].text=be+" "+De.tokens[0].text,De.tokens[0].tokens&&De.tokens[0].tokens.length>0&&De.tokens[0].tokens[0].type==="text"&&(De.tokens[0].tokens[0].text=be+" "+De.tokens[0].tokens[0].text)):De.tokens.unshift({type:"text",text:be}):Be+=be),Be+=this.parse(De.tokens,xe),Se+=this.renderer.listitem(Be,fe,Ie);j+=this.renderer.list(Se,Ee,Ae);continue}case"html":{j+=this.renderer.html(_e.text);continue}case"paragraph":{j+=this.renderer.paragraph(this.parseInline(_e.tokens));continue}case"text":{for(Se=_e.tokens?this.parseInline(_e.tokens):_e.text;Z+1<Pe&&H[Z+1].type==="text";)_e=H[++Z],Se+=`
+`+(_e.tokens?this.parseInline(_e.tokens):_e.text);j+=Y?this.renderer.paragraph(Se):Se;continue}default:{var ze='Token with "'+_e.type+'" type was not found.';if(this.options.silent){console.error(ze);return}else throw new Error(ze)}}}return j},G.parseInline=function(H,Y){Y=Y||this.renderer;var j="",Z,ee,le,ue=H.length;for(Z=0;Z<ue;Z++){if(ee=H[Z],this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[ee.type]&&(le=this.options.extensions.renderers[ee.type].call({parser:this},ee),le!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(ee.type))){j+=le||"";continue}switch(ee.type){case"escape":{j+=Y.text(ee.text);break}case"html":{j+=Y.html(ee.text);break}case"link":{j+=Y.link(ee.href,ee.title,this.parseInline(ee.tokens,Y));break}case"image":{j+=Y.image(ee.href,ee.title,ee.text);break}case"strong":{j+=Y.strong(this.parseInline(ee.tokens,Y));break}case"em":{j+=Y.em(this.parseInline(ee.tokens,Y));break}case"codespan":{j+=Y.codespan(ee.text);break}case"br":{j+=Y.br();break}case"del":{j+=Y.del(this.parseInline(ee.tokens,Y));break}case"text":{j+=Y.text(ee.text);break}default:{var ce='Token with "'+ee.type+'" type was not found.';if(this.options.silent){console.error(ce);return}else throw new Error(ce)}}}return j},U}();function ne(U,G,z){if(typeof U>"u"||U===null)throw new Error("marked(): input parameter is undefined or null");if(typeof U!="string")throw new Error("marked(): input parameter is of type "+Object.prototype.toString.call(U)+", string expected");if(typeof G=="function"&&(z=G,G=null),G=D({},ne.defaults,G||{}),P(G),z){var H=G.highlight,Y;try{Y=K.lex(U,G)}catch(ue){return z(ue)}var j=function(ce){var pe;if(!ce)try{G.walkTokens&&ne.walkTokens(Y,G.walkTokens),pe=ae.parse(Y,G)}catch(ve){ce=ve}return G.highlight=H,ce?z(ce):z(null,pe)};if(!H||H.length<3||(delete G.highlight,!Y.length))return j();var Z=0;ne.walkTokens(Y,function(ue){ue.type==="code"&&(Z++,setTimeout(function(){H(ue.text,ue.lang,function(ce,pe){if(ce)return j(ce);pe!=null&&pe!==ue.text&&(ue.text=pe,ue.escaped=!0),Z--,Z===0&&j()})},0))}),Z===0&&j();return}function ee(ue){if(ue.message+=`
+Please report this to https://github.com/markedjs/marked.`,G.silent)return"<p>An error occurred:</p><pre>"+t(ue.message+"",!0)+"</pre>";throw ue}try{var le=K.lex(U,G);if(G.walkTokens){if(G.async)return Promise.all(ne.walkTokens(le,G.walkTokens)).then(function(){return ae.parse(le,G)}).catch(ee);ne.walkTokens(le,G.walkTokens)}return ae.parse(le,G)}catch(ue){ee(ue)}}ne.options=ne.setOptions=function(U){return D(ne.defaults,U),p(ne.defaults),ne},ne.getDefaults=S,ne.defaults=te.defaults,ne.use=function(){for(var U=arguments.length,G=new Array(U),z=0;z<U;z++)G[z]=arguments[z];var H=D.apply(void 0,[{}].concat(G)),Y=ne.defaults.extensions||{renderers:{},childTokens:{}},j;G.forEach(function(Z){if(Z.extensions&&(j=!0,Z.extensions.forEach(function(le){if(!le.name)throw new Error("extension name required");if(le.renderer){var ue=Y.renderers?Y.renderers[le.name]:null;ue?Y.renderers[le.name]=function(){for(var ce=arguments.length,pe=new Array(ce),ve=0;ve<ce;ve++)pe[ve]=arguments[ve];var Ce=le.renderer.apply(this,pe);return Ce===!1&&(Ce=ue.apply(this,pe)),Ce}:Y.renderers[le.name]=le.renderer}if(le.tokenizer){if(!le.level||le.level!=="block"&&le.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");Y[le.level]?Y[le.level].unshift(le.tokenizer):Y[le.level]=[le.tokenizer],le.start&&(le.level==="block"?Y.startBlock?Y.startBlock.push(le.start):Y.startBlock=[le.start]:le.level==="inline"&&(Y.startInline?Y.startInline.push(le.start):Y.startInline=[le.start]))}le.childTokens&&(Y.childTokens[le.name]=le.childTokens)})),Z.renderer&&function(){var le=ne.defaults.renderer||new F,ue=function(ve){var Ce=le[ve];le[ve]=function(){for(var Se=arguments.length,_e=new Array(Se),Ee=0;Ee<Se;Ee++)_e[Ee]=arguments[Ee];var Ae=Z.renderer[ve].apply(le,_e);return Ae===!1&&(Ae=Ce.apply(le,_e)),Ae}};for(var ce in Z.renderer)ue(ce);H.renderer=le}(),Z.tokenizer&&function(){var le=ne.defaults.tokenizer||new x,ue=function(ve){var Ce=le[ve];le[ve]=function(){for(var Se=arguments.length,_e=new Array(Se),Ee=0;Ee<Se;Ee++)_e[Ee]=arguments[Ee];var Ae=Z.tokenizer[ve].apply(le,_e);return Ae===!1&&(Ae=Ce.apply(le,_e)),Ae}};for(var ce in Z.tokenizer)ue(ce);H.tokenizer=le}(),Z.walkTokens){var ee=ne.defaults.walkTokens;H.walkTokens=function(le){var ue=[];return ue.push(Z.walkTokens.call(this,le)),ee&&(ue=ue.concat(ee.call(this,le))),ue}}j&&(H.extensions=Y),ne.setOptions(H)})},ne.walkTokens=function(U,G){for(var z=[],H=function(){var ee=j.value;switch(z=z.concat(G.call(ne,ee)),ee.type){case"table":{for(var le=E(ee.header),ue;!(ue=le()).done;){var ce=ue.value;z=z.concat(ne.walkTokens(ce.tokens,G))}for(var pe=E(ee.rows),ve;!(ve=pe()).done;)for(var Ce=ve.value,Se=E(Ce),_e;!(_e=Se()).done;){var Ee=_e.value;z=z.concat(ne.walkTokens(Ee.tokens,G))}break}case"list":{z=z.concat(ne.walkTokens(ee.items,G));break}default:ne.defaults.extensions&&ne.defaults.extensions.childTokens&&ne.defaults.extensions.childTokens[ee.type]?ne.defaults.extensions.childTokens[ee.type].forEach(function(Ae){z=z.concat(ne.walkTokens(ee[Ae],G))}):ee.tokens&&(z=z.concat(ne.walkTokens(ee.tokens,G)))}},Y=E(U),j;!(j=Y()).done;)H();return z},ne.parseInline=function(U,G){if(typeof U>"u"||U===null)throw new Error("marked.parseInline(): input parameter is undefined or null");if(typeof U!="string")throw new Error("marked.parseInline(): input parameter is of type "+Object.prototype.toString.call(U)+", string expected");G=D({},ne.defaults,G||{}),P(G);try{var z=K.lexInline(U,G);return G.walkTokens&&ne.walkTokens(z,G.walkTokens),ae.parseInline(z,G)}catch(H){if(H.message+=`
+Please report this to https://github.com/markedjs/marked.`,G.silent)return"<p>An error occurred:</p><pre>"+t(H.message+"",!0)+"</pre>";throw H}},ne.Parser=ae,ne.parser=ae.parse,ne.Renderer=F,ne.TextRenderer=q,ne.Lexer=K,ne.lexer=K.lex,ne.Tokenizer=x,ne.Slugger=ie,ne.parse=ne;var $=ne.options,J=ne.setOptions,Q=ne.use,re=ne.walkTokens,de=ne.parseInline,he=ne,me=ae.parse,X=K.lex;te.Lexer=K,te.Parser=ae,te.Renderer=F,te.Slugger=ie,te.TextRenderer=q,te.Tokenizer=x,te.getDefaults=S,te.lexer=X,te.marked=ne,te.options=$,te.parse=he,te.parseInline=de,te.parser=me,te.setOptions=J,te.use=Q,te.walkTokens=re,Object.defineProperty(te,"__esModule",{value:!0})}),define(se[109],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Mimes=void 0,e.Mimes=Object.freeze({text:"text/plain",binary:"application/octet-stream",unknown:"application/unknown",markdown:"text/markdown",latex:"text/latex",uriList:"text/uri-list"})}),define(se[198],oe([1,0,109]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DataTransfers=void 0,e.DataTransfers={RESOURCES:"ResourceURLs",DOWNLOAD_URL:"DownloadURL",FILES:"Files",TEXT:L.Mimes.text,INTERNAL_URI_LIST:"application/vnd.code.uri-list"}}),define(se[401],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getKoreanAltChars=void 0;function L(i){const n=E(i);if(n&&n.length>0)return new Uint32Array(n)}e.getKoreanAltChars=L;let k=0;const y=new Uint32Array(10);function E(i){if(k=0,S(i,_,4352),k>0||(S(i,v,4449),k>0)||(S(i,b,4520),k>0)||(S(i,a,12593),k))return y.subarray(0,k);if(i>=44032&&i<=55203){const n=i-44032,t=n%588,r=Math.floor(n/588),u=Math.floor(t/28),f=t%28-1;if(r<_.length?S(r,_,0):4352+r-12593<a.length&&S(4352+r,a,12593),u<v.length?S(u,v,0):4449+u-12593<a.length&&S(4449+u-12593,a,12593),f>=0&&(f<b.length?S(f,b,0):4520+f-12593<a.length&&S(4520+f-12593,a,12593)),k>0)return y.subarray(0,k)}}function S(i,n,t){i>=t&&i<t+n.length&&p(n[i-t])}function p(i){i!==0&&(y[k++]=i&255,i>>8&&(y[k++]=i>>8&255),i>>16&&(y[k++]=i>>16&255))}const _=new Uint8Array([114,82,115,101,69,102,97,113,81,116,84,100,119,87,99,122,120,118,103]),v=new Uint16Array([107,111,105,79,106,112,117,80,104,27496,28520,27752,121,110,27246,28782,27758,98,109,27757,108]),b=new Uint16Array([114,82,29810,115,30579,26483,101,102,29286,24934,29030,29798,30822,30310,26470,97,113,29809,116,84,100,119,99,122,120,118,103]),a=new Uint16Array([114,82,29810,115,30579,26483,101,69,102,29286,24934,29030,29798,30822,30310,26470,97,113,81,29809,116,84,100,119,87,99,122,120,118,103,107,111,105,79,106,112,117,80,104,27496,28520,27752,121,110,27246,28782,27758,98,109,27757,108])}),define(se[402],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ArrayNavigator=void 0;class L{constructor(y,E=0,S=y.length,p=E-1){this.items=y,this.start=E,this.end=S,this.index=p}current(){return this.index===this.start-1||this.index===this.end?null:this.items[this.index]}next(){return this.index=Math.min(this.index+1,this.end),this.current()}previous(){return this.index=Math.max(this.index-1,this.start-1),this.current()}first(){return this.index=this.start,this.current()}last(){return this.index=this.end-1,this.current()}}e.ArrayNavigator=L}),define(se[403],oe([1,0,402]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HistoryNavigator=void 0;class k{constructor(E=[],S=10){this._initialize(E),this._limit=S,this._onChange()}getHistory(){return this._elements}add(E){this._history.delete(E),this._history.add(E),this._onChange()}next(){return this._navigator.next()}previous(){return this._currentPosition()!==0?this._navigator.previous():null}current(){return this._navigator.current()}first(){return this._navigator.first()}last(){return this._navigator.last()}isLast(){return this._currentPosition()>=this._elements.length-1}isNowhere(){return this._navigator.current()===null}has(E){return this._history.has(E)}_onChange(){this._reduceToLimit();const E=this._elements;this._navigator=new L.ArrayNavigator(E,0,E.length,E.length)}_reduceToLimit(){const E=this._elements;E.length>this._limit&&this._initialize(E.slice(E.length-this._limit))}_currentPosition(){const E=this._navigator.current();return E?this._elements.indexOf(E):-1}_initialize(E){this._history=new Set;for(const S of E)this._history.add(S)}get _elements(){const E=[];return this._history.forEach(S=>E.push(S)),E}}e.HistoryNavigator=k}),define(se[145],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SlidingWindowAverage=e.MovingAverage=e.clamp=void 0;function L(E,S,p){return Math.min(Math.max(E,S),p)}e.clamp=L;class k{constructor(){this._n=1,this._val=0}update(S){return this._val=this._val+(S-this._val)/this._n,this._n+=1,this._val}get value(){return this._val}}e.MovingAverage=k;class y{constructor(S){this._n=0,this._val=0,this._values=[],this._index=0,this._sum=0,this._values=new Array(S),this._values.fill(0,0,S)}update(S){const p=this._values[this._index];return this._values[this._index]=S,this._index=(this._index+1)%this._values.length,this._sum-=p,this._sum+=S,this._n<this._values.length&&(this._n+=1),this._val=this._sum/this._n,this._val}get value(){return this._val}}e.SlidingWindowAverage=y}),define(se[146],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ConsoleObservableLogger=e.getLogger=e.setLogger=void 0;let L;function k(r){L=r}e.setLogger=k;function y(){return L}e.getLogger=y;class E{constructor(){this.indentation=0,this.changedObservablesSets=new WeakMap}textToConsoleArgs(u){return S([p(n("|  ",this.indentation)),u])}formatInfo(u){return u.hadValue?u.didChange?[p(" "),v(b(u.oldValue,70),{color:"red",strikeThrough:!0}),p(" "),v(b(u.newValue,60),{color:"green"})]:[p(" (unchanged)")]:[p(" "),v(b(u.newValue,60),{color:"green"}),p(" (initial)")]}handleObservableChanged(u,f){console.log(...this.textToConsoleArgs([_("observable value changed"),v(u.debugName,{color:"BlueViolet"}),...this.formatInfo(f)]))}formatChanges(u){if(u.size!==0)return v(" (changed deps: "+[...u].map(f=>f.debugName).join(", ")+")",{color:"gray"})}handleDerivedCreated(u){const f=u.handleChange;this.changedObservablesSets.set(u,new Set),u.handleChange=(c,d)=>(this.changedObservablesSets.get(u).add(c),f.apply(u,[c,d]))}handleDerivedRecomputed(u,f){const c=this.changedObservablesSets.get(u);console.log(...this.textToConsoleArgs([_("derived recomputed"),v(u.debugName,{color:"BlueViolet"}),...this.formatInfo(f),this.formatChanges(c),{data:[{fn:u._computeFn}]}])),c.clear()}handleFromEventObservableTriggered(u,f){console.log(...this.textToConsoleArgs([_("observable from event triggered"),v(u.debugName,{color:"BlueViolet"}),...this.formatInfo(f),{data:[{fn:u._getValue}]}]))}handleAutorunCreated(u){const f=u.handleChange;this.changedObservablesSets.set(u,new Set),u.handleChange=(c,d)=>(this.changedObservablesSets.get(u).add(c),f.apply(u,[c,d]))}handleAutorunTriggered(u){const f=this.changedObservablesSets.get(u);console.log(...this.textToConsoleArgs([_("autorun"),v(u.debugName,{color:"BlueViolet"}),this.formatChanges(f),{data:[{fn:u._runFn}]}])),f.clear(),this.indentation++}handleAutorunFinished(u){this.indentation--}handleBeginTransaction(u){let f=u.getDebugName();f===void 0&&(f=""),console.log(...this.textToConsoleArgs([_("transaction"),v(f,{color:"BlueViolet"}),{data:[{fn:u._fn}]}])),this.indentation++}handleEndTransaction(){this.indentation--}}e.ConsoleObservableLogger=E;function S(r){const u=new Array,f=[];let c="";function d(l){if("length"in l)for(const o of l)o&&d(o);else"text"in l?(c+=`%c${l.text}`,u.push(l.style),l.data&&f.push(...l.data)):"data"in l&&f.push(...l.data)}d(r);const s=[c,...u];return s.push(...f),s}function p(r){return v(r,{color:"black"})}function _(r){return v(t(`${r}: `,10),{color:"black",bold:!0})}function v(r,u={color:"black"}){function f(d){return Object.entries(d).reduce((s,[l,o])=>`${s}${l}:${o};`,"")}const c={color:u.color};return u.strikeThrough&&(c["text-decoration"]="line-through"),u.bold&&(c["font-weight"]="bold"),{text:r,style:f(c)}}function b(r,u){switch(typeof r){case"number":return""+r;case"string":return r.length+2<=u?`"${r}"`:`"${r.substr(0,u-7)}"+...`;case"boolean":return r?"true":"false";case"undefined":return"undefined";case"object":return r===null?"null":Array.isArray(r)?a(r,u):i(r,u);case"symbol":return r.toString();case"function":return`[[Function${r.name?" "+r.name:""}]]`;default:return""+r}}function a(r,u){let f="[ ",c=!0;for(const d of r){if(c||(f+=", "),f.length-5>u){f+="...";break}c=!1,f+=`${b(d,u-f.length)}`}return f+=" ]",f}function i(r,u){let f="{ ",c=!0;for(const[d,s]of Object.entries(r)){if(c||(f+=", "),f.length-5>u){f+="...";break}c=!1,f+=`${d}: ${b(s,u-f.length)}`}return f+=" }",f}function n(r,u){let f="";for(let c=1;c<=u;c++)f+=r;return f}function t(r,u){for(;r.length<u;)r+=" ";return r}}),define(se[110],oe([1,0,146]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DisposableObservableValue=e.disposableObservableValue=e.ObservableValue=e.observableValue=e.getFunctionName=e.getDebugName=e.TransactionImpl=e.subtransaction=e.asyncTransaction=e.globalTransaction=e.transaction=e.BaseObservable=e.ConvenientObservable=e._setDerivedOpts=e._setKeepObserved=e._setRecomputeInitiallyAndOnChange=void 0;let k;function y(T){k=T}e._setRecomputeInitiallyAndOnChange=y;let E;function S(T){E=T}e._setKeepObserved=S;let p;function _(T){p=T}e._setDerivedOpts=_;class v{get TChange(){return null}reportChanges(){this.get()}read(A){return A?A.readObservable(this):this.get()}map(A,P){const N=P===void 0?void 0:A,M=P===void 0?A:P;return p({owner:N,debugName:()=>{const R=m(M);if(R!==void 0)return R;const O=/^\s*\(?\s*([a-zA-Z_$][a-zA-Z_$0-9]*)\s*\)?\s*=>\s*\1(?:\??)\.([a-zA-Z_$][a-zA-Z_$0-9]*)\s*$/.exec(M.toString());if(O)return`${this.debugName}.${O[2]}`;if(!N)return`${this.debugName} (mapped)`}},R=>M(this.read(R),R))}recomputeInitiallyAndOnChange(A,P){return A.add(k(this,P)),this}}e.ConvenientObservable=v;class b extends v{constructor(){super(...arguments),this.observers=new Set}addObserver(A){const P=this.observers.size;this.observers.add(A),P===0&&this.onFirstObserverAdded()}removeObserver(A){this.observers.delete(A)&&this.observers.size===0&&this.onLastObserverRemoved()}onFirstObserverAdded(){}onLastObserverRemoved(){}}e.BaseObservable=b;function a(T,A){const P=new u(T,A);try{T(P)}finally{P.finish()}}e.transaction=a;let i;function n(T){if(i)T(i);else{const A=new u(T,void 0);i=A;try{T(A)}finally{A.finish(),i=void 0}}}e.globalTransaction=n;async function t(T,A){const P=new u(T,A);try{await T(P)}finally{P.finish()}}e.asyncTransaction=t;function r(T,A,P){T?A(T):a(A,P)}e.subtransaction=r;class u{constructor(A,P){var N;this._fn=A,this._getDebugName=P,this.updatingObservers=[],(N=(0,L.getLogger)())===null||N===void 0||N.handleBeginTransaction(this)}getDebugName(){return this._getDebugName?this._getDebugName():m(this._fn)}updateObserver(A,P){this.updatingObservers.push({observer:A,observable:P}),A.beginUpdate(P)}finish(){var A;const P=this.updatingObservers;for(let N=0;N<P.length;N++){const{observer:M,observable:R}=P[N];M.endUpdate(R)}this.updatingObservers=null,(A=(0,L.getLogger)())===null||A===void 0||A.handleEndTransaction()}}e.TransactionImpl=u;const f=new Map,c=new WeakMap;function d(T,A,P,N){var M;const R=c.get(T);if(R)return R;const x=s(T,A,P,N);if(x){let O=(M=f.get(x))!==null&&M!==void 0?M:0;O++,f.set(x,O);const B=O===1?x:`${x}#${O}`;return c.set(T,B),B}}e.getDebugName=d;function s(T,A,P,N){const M=c.get(T);if(M)return M;const R=N?g(N)+".":"";let x;if(A!==void 0)if(typeof A=="function"){if(x=A(),x!==void 0)return R+x}else return R+A;if(P!==void 0&&(x=m(P),x!==void 0))return R+x;if(N!==void 0){for(const O in N)if(N[O]===T)return R+O}}const l=new Map,o=new WeakMap;function g(T){var A;const P=o.get(T);if(P)return P;const N=h(T);let M=(A=l.get(N))!==null&&A!==void 0?A:0;M++,l.set(N,M);const R=M===1?N:`${N}#${M}`;return o.set(T,R),R}function h(T){const A=T.constructor;return A?A.name:"Object"}function m(T){const A=T.toString(),N=/\/\*\*\s*@description\s*([^*]*)\*\//.exec(A),M=N?N[1]:void 0;return M?.trim()}e.getFunctionName=m;function C(T,A){return typeof T=="string"?new w(void 0,T,A):new w(T,void 0,A)}e.observableValue=C;class w extends b{get debugName(){var A;return(A=d(this,this._debugName,void 0,this._owner))!==null&&A!==void 0?A:"ObservableValue"}constructor(A,P,N){super(),this._owner=A,this._debugName=P,this._value=N}get(){return this._value}set(A,P,N){var M;if(this._value===A)return;let R;P||(P=R=new u(()=>{},()=>`Setting ${this.debugName}`));try{const x=this._value;this._setValue(A),(M=(0,L.getLogger)())===null||M===void 0||M.handleObservableChanged(this,{oldValue:x,newValue:A,change:N,didChange:!0,hadValue:!0});for(const O of this.observers)P.updateObserver(O,this),O.handleChange(this,N)}finally{R&&R.finish()}}toString(){return`${this.debugName}: ${this._value}`}_setValue(A){this._value=A}}e.ObservableValue=w;function D(T,A){return typeof T=="string"?new I(void 0,T,A):new I(T,void 0,A)}e.disposableObservableValue=D;class I extends w{_setValue(A){this._value!==A&&(this._value&&this._value.dispose(),this._value=A)}dispose(){var A;(A=this._value)===null||A===void 0||A.dispose()}}e.DisposableObservableValue=I}),define(se[269],oe([1,0,90,2,110,146]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AutorunObserver=e.autorunWithStore=e.autorunHandleChanges=e.autorunOpts=e.autorun=void 0;function S(a){return new b(void 0,a,void 0,void 0)}e.autorun=S;function p(a,i){return new b(a.debugName,i,void 0,void 0)}e.autorunOpts=p;function _(a,i){return new b(a.debugName,i,a.createEmptyChangeSummary,a.handleChange)}e.autorunHandleChanges=_;function v(a){const i=new k.DisposableStore,n=p({debugName:()=>(0,y.getFunctionName)(a)||"(anonymous)"},t=>{i.clear(),a(t,i)});return(0,k.toDisposable)(()=>{n.dispose(),i.dispose()})}e.autorunWithStore=v;class b{get debugName(){if(typeof this._debugName=="string")return this._debugName;if(typeof this._debugName=="function"){const n=this._debugName();if(n!==void 0)return n}const i=(0,y.getFunctionName)(this._runFn);return i!==void 0?i:"(anonymous)"}constructor(i,n,t,r){var u,f;this._debugName=i,this._runFn=n,this.createChangeSummary=t,this._handleChange=r,this.state=2,this.updateCount=0,this.disposed=!1,this.dependencies=new Set,this.dependenciesToBeRemoved=new Set,this.changeSummary=(u=this.createChangeSummary)===null||u===void 0?void 0:u.call(this),(f=(0,E.getLogger)())===null||f===void 0||f.handleAutorunCreated(this),this._runIfNeeded(),(0,k.trackDisposable)(this)}dispose(){this.disposed=!0;for(const i of this.dependencies)i.removeObserver(this);this.dependencies.clear(),(0,k.markAsDisposed)(this)}_runIfNeeded(){var i,n,t;if(this.state===3)return;const r=this.dependenciesToBeRemoved;this.dependenciesToBeRemoved=this.dependencies,this.dependencies=r,this.state=3;const u=this.disposed;try{if(!u){(i=(0,E.getLogger)())===null||i===void 0||i.handleAutorunTriggered(this);const f=this.changeSummary;this.changeSummary=(n=this.createChangeSummary)===null||n===void 0?void 0:n.call(this),this._runFn(this,f)}}finally{u||(t=(0,E.getLogger)())===null||t===void 0||t.handleAutorunFinished(this);for(const f of this.dependenciesToBeRemoved)f.removeObserver(this);this.dependenciesToBeRemoved.clear()}}toString(){return`Autorun<${this.debugName}>`}beginUpdate(){this.state===3&&(this.state=1),this.updateCount++}endUpdate(){if(this.updateCount===1)do{if(this.state===1){this.state=3;for(const i of this.dependencies)if(i.reportChanges(),this.state===2)break}this._runIfNeeded()}while(this.state!==3);this.updateCount--,(0,L.assertFn)(()=>this.updateCount>=0)}handlePossibleChange(i){this.state===3&&this.dependencies.has(i)&&!this.dependenciesToBeRemoved.has(i)&&(this.state=1)}handleChange(i,n){this.dependencies.has(i)&&!this.dependenciesToBeRemoved.has(i)&&(!this._handleChange||this._handleChange({changedObservable:i,change:n,didChange:r=>r===i},this.changeSummary))&&(this.state=2)}readObservable(i){if(this.disposed)return i.get();i.addObserver(this);const n=i.get();return this.dependencies.add(i),this.dependenciesToBeRemoved.delete(i),n}}e.AutorunObserver=b,function(a){a.Observer=b}(S||(e.autorun=S={}))}),define(se[171],oe([1,0,90,2,110,146]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Derived=e.derivedDisposable=e.derivedWithStore=e.derivedHandleChanges=e.derivedOpts=e.derived=void 0;const S=(n,t)=>n===t;function p(n,t){return t!==void 0?new i(n,void 0,t,void 0,void 0,void 0,S):new i(void 0,void 0,n,void 0,void 0,void 0,S)}e.derived=p;function _(n,t){var r;return new i(n.owner,n.debugName,t,void 0,void 0,n.onLastObserverRemoved,(r=n.equalityComparer)!==null&&r!==void 0?r:S)}e.derivedOpts=_;function v(n,t){var r;return new i(n.owner,n.debugName,t,n.createEmptyChangeSummary,n.handleChange,void 0,(r=n.equalityComparer)!==null&&r!==void 0?r:S)}e.derivedHandleChanges=v;function b(n,t){let r,u;t===void 0?(r=n,u=void 0):(u=n,r=t);const f=new k.DisposableStore;return new i(u,()=>{var c;return(c=(0,y.getFunctionName)(r))!==null&&c!==void 0?c:"(anonymous)"},c=>(f.clear(),r(c,f)),void 0,void 0,()=>f.dispose(),S)}e.derivedWithStore=b;function a(n,t){let r,u;t===void 0?(r=n,u=void 0):(u=n,r=t);const f=new k.DisposableStore;return new i(u,()=>{var c;return(c=(0,y.getFunctionName)(r))!==null&&c!==void 0?c:"(anonymous)"},c=>{f.clear();const d=r(c);return d&&f.add(d),d},void 0,void 0,()=>f.dispose(),S)}e.derivedDisposable=a,(0,y._setDerivedOpts)(_);class i extends y.BaseObservable{get debugName(){var t;return(t=(0,y.getDebugName)(this,this._debugName,this._computeFn,this._owner))!==null&&t!==void 0?t:"(anonymous)"}constructor(t,r,u,f,c,d=void 0,s){var l,o;super(),this._owner=t,this._debugName=r,this._computeFn=u,this.createChangeSummary=f,this._handleChange=c,this._handleLastObserverRemoved=d,this._equalityComparator=s,this.state=0,this.value=void 0,this.updateCount=0,this.dependencies=new Set,this.dependenciesToBeRemoved=new Set,this.changeSummary=void 0,this.changeSummary=(l=this.createChangeSummary)===null||l===void 0?void 0:l.call(this),(o=(0,E.getLogger)())===null||o===void 0||o.handleDerivedCreated(this)}onLastObserverRemoved(){var t;this.state=0,this.value=void 0;for(const r of this.dependencies)r.removeObserver(this);this.dependencies.clear(),(t=this._handleLastObserverRemoved)===null||t===void 0||t.call(this)}get(){var t;if(this.observers.size===0){const r=this._computeFn(this,(t=this.createChangeSummary)===null||t===void 0?void 0:t.call(this));return this.onLastObserverRemoved(),r}else{do{if(this.state===1){for(const r of this.dependencies)if(r.reportChanges(),this.state===2)break}this.state===1&&(this.state=3),this._recomputeIfNeeded()}while(this.state!==3);return this.value}}_recomputeIfNeeded(){var t,r;if(this.state===3)return;const u=this.dependenciesToBeRemoved;this.dependenciesToBeRemoved=this.dependencies,this.dependencies=u;const f=this.state!==0,c=this.value;this.state=3;const d=this.changeSummary;this.changeSummary=(t=this.createChangeSummary)===null||t===void 0?void 0:t.call(this);try{this.value=this._computeFn(this,d)}finally{for(const l of this.dependenciesToBeRemoved)l.removeObserver(this);this.dependenciesToBeRemoved.clear()}const s=f&&!this._equalityComparator(c,this.value);if((r=(0,E.getLogger)())===null||r===void 0||r.handleDerivedRecomputed(this,{oldValue:c,newValue:this.value,change:void 0,didChange:s,hadValue:f}),s)for(const l of this.observers)l.handleChange(this,void 0)}toString(){return`LazyDerived<${this.debugName}>`}beginUpdate(t){this.updateCount++;const r=this.updateCount===1;if(this.state===3&&(this.state=1,!r))for(const u of this.observers)u.handlePossibleChange(this);if(r)for(const u of this.observers)u.beginUpdate(this)}endUpdate(t){if(this.updateCount--,this.updateCount===0){const r=[...this.observers];for(const u of r)u.endUpdate(this)}(0,L.assertFn)(()=>this.updateCount>=0)}handlePossibleChange(t){if(this.state===3&&this.dependencies.has(t)&&!this.dependenciesToBeRemoved.has(t)){this.state=1;for(const r of this.observers)r.handlePossibleChange(this)}}handleChange(t,r){if(this.dependencies.has(t)&&!this.dependenciesToBeRemoved.has(t)){const u=this._handleChange?this._handleChange({changedObservable:t,change:r,didChange:c=>c===t},this.changeSummary):!0,f=this.state===3;if(u&&(this.state===1||f)&&(this.state=2,f))for(const c of this.observers)c.handlePossibleChange(this)}}readObservable(t){t.addObserver(this);const r=t.get();return this.dependencies.add(t),this.dependenciesToBeRemoved.delete(t),r}addObserver(t){const r=!this.observers.has(t)&&this.updateCount>0;super.addObserver(t),r&&t.beginUpdate(this)}removeObserver(t){const r=this.observers.has(t)&&this.updateCount>0;super.removeObserver(t),r&&t.endUpdate(this)}}e.Derived=i}),define(se[404],oe([1,0,2,269,110,171,146]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.mapObservableArrayCached=e.derivedObservableWithCache=e.recomputeInitiallyAndOnChange=e.keepObserved=e.observableSignal=e.observableSignalFromEvent=e.FromEventObservable=e.observableFromEvent=e.waitForState=e.constObservable=void 0;function p(o){return new _(o)}e.constObservable=p;class _ extends y.ConvenientObservable{constructor(g){super(),this.value=g}get debugName(){return this.toString()}get(){return this.value}addObserver(g){}removeObserver(g){}toString(){return`Const: ${this.value}`}}function v(o,g){return new Promise(h=>{let m=!1,C=!1;const w=o.map(I=>({isFinished:g(I),state:I})),D=(0,k.autorun)(I=>{const{isFinished:T,state:A}=w.read(I);T&&(m?D.dispose():C=!0,h(A))});m=!0,C&&D.dispose()})}e.waitForState=v;function b(o,g){return new a(o,g)}e.observableFromEvent=b;class a extends y.BaseObservable{constructor(g,h){super(),this.event=g,this._getValue=h,this.hasValue=!1,this.handleEvent=m=>{var C;const w=this._getValue(m),D=this.value,I=!this.hasValue||D!==w;let T=!1;I&&(this.value=w,this.hasValue&&(T=!0,(0,y.subtransaction)(a.globalTransaction,A=>{var P;(P=(0,S.getLogger)())===null||P===void 0||P.handleFromEventObservableTriggered(this,{oldValue:D,newValue:w,change:void 0,didChange:I,hadValue:this.hasValue});for(const N of this.observers)A.updateObserver(N,this),N.handleChange(this,void 0)},()=>{const A=this.getDebugName();return"Event fired"+(A?`: ${A}`:"")})),this.hasValue=!0),T||(C=(0,S.getLogger)())===null||C===void 0||C.handleFromEventObservableTriggered(this,{oldValue:D,newValue:w,change:void 0,didChange:I,hadValue:this.hasValue})}}getDebugName(){return(0,y.getFunctionName)(this._getValue)}get debugName(){const g=this.getDebugName();return"From Event"+(g?`: ${g}`:"")}onFirstObserverAdded(){this.subscription=this.event(this.handleEvent)}onLastObserverRemoved(){this.subscription.dispose(),this.subscription=void 0,this.hasValue=!1,this.value=void 0}get(){return this.subscription?(this.hasValue||this.handleEvent(void 0),this.value):this._getValue(void 0)}}e.FromEventObservable=a,function(o){o.Observer=a;function g(h,m){let C=!1;a.globalTransaction===void 0&&(a.globalTransaction=h,C=!0);try{m()}finally{C&&(a.globalTransaction=void 0)}}o.batchEventsGlobally=g}(b||(e.observableFromEvent=b={}));function i(o,g){return new n(o,g)}e.observableSignalFromEvent=i;class n extends y.BaseObservable{constructor(g,h){super(),this.debugName=g,this.event=h,this.handleEvent=()=>{(0,y.transaction)(m=>{for(const C of this.observers)m.updateObserver(C,this),C.handleChange(this,void 0)},()=>this.debugName)}}onFirstObserverAdded(){this.subscription=this.event(this.handleEvent)}onLastObserverRemoved(){this.subscription.dispose(),this.subscription=void 0}get(){}}function t(o){return typeof o=="string"?new r(o):new r(void 0,o)}e.observableSignal=t;class r extends y.BaseObservable{get debugName(){var g;return(g=(0,y.getDebugName)(this,this._debugName,void 0,this._owner))!==null&&g!==void 0?g:"Observable Signal"}constructor(g,h){super(),this._debugName=g,this._owner=h}trigger(g,h){if(!g){(0,y.transaction)(m=>{this.trigger(m,h)},()=>`Trigger signal ${this.debugName}`);return}for(const m of this.observers)g.updateObserver(m,this),m.handleChange(this,h)}get(){}}function u(o){const g=new c(!1,void 0);return o.addObserver(g),(0,L.toDisposable)(()=>{o.removeObserver(g)})}e.keepObserved=u,(0,y._setKeepObserved)(u);function f(o,g){const h=new c(!0,g);return o.addObserver(h),g?g(o.get()):o.reportChanges(),(0,L.toDisposable)(()=>{o.removeObserver(h)})}e.recomputeInitiallyAndOnChange=f,(0,y._setRecomputeInitiallyAndOnChange)(f);class c{constructor(g,h){this._forceRecompute=g,this._handleValue=h,this._counter=0}beginUpdate(g){this._counter++}endUpdate(g){this._counter--,this._counter===0&&this._forceRecompute&&(this._handleValue?this._handleValue(g.get()):g.reportChanges())}handlePossibleChange(g){}handleChange(g,h){}}function d(o){let g;return(0,E.derived)(m=>(g=o(m,g),g))}e.derivedObservableWithCache=d;function s(o,g,h,m){let C=new l(h,m);return(0,E.derivedOpts)({debugName:()=>(0,y.getDebugName)(C,void 0,h,o),owner:o,onLastObserverRemoved:()=>{C.dispose(),C=new l(h)}},D=>(C.setItems(g.read(D)),C.getItems()))}e.mapObservableArrayCached=s;class l{constructor(g,h){this._map=g,this._keySelector=h,this._cache=new Map,this._items=[]}dispose(){this._cache.forEach(g=>g.store.dispose()),this._cache.clear()}setItems(g){const h=[],m=new Set(this._cache.keys());for(const C of g){const w=this._keySelector?this._keySelector(C):C;let D=this._cache.get(w);if(D)m.delete(w);else{const I=new L.DisposableStore;D={out:this._map(C,I),store:I},this._cache.set(w,D)}h.push(D.out)}for(const C of m)this._cache.get(C).store.dispose(),this._cache.delete(C);this._items=h}getItems(){return this._items}}}),define(se[35],oe([1,0,110,171,269,404,146]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.waitForState=e.observableSignalFromEvent=e.observableSignal=e.observableFromEvent=e.recomputeInitiallyAndOnChange=e.keepObserved=e.derivedObservableWithCache=e.constObservable=e.autorunOpts=e.autorunWithStore=e.autorunHandleChanges=e.autorun=e.derivedWithStore=e.derivedHandleChanges=e.derivedOpts=e.derived=e.subtransaction=e.transaction=e.disposableObservableValue=e.observableValue=void 0,Object.defineProperty(e,"observableValue",{enumerable:!0,get:function(){return L.observableValue}}),Object.defineProperty(e,"disposableObservableValue",{enumerable:!0,get:function(){return L.disposableObservableValue}}),Object.defineProperty(e,"transaction",{enumerable:!0,get:function(){return L.transaction}}),Object.defineProperty(e,"subtransaction",{enumerable:!0,get:function(){return L.subtransaction}}),Object.defineProperty(e,"derived",{enumerable:!0,get:function(){return k.derived}}),Object.defineProperty(e,"derivedOpts",{enumerable:!0,get:function(){return k.derivedOpts}}),Object.defineProperty(e,"derivedHandleChanges",{enumerable:!0,get:function(){return k.derivedHandleChanges}}),Object.defineProperty(e,"derivedWithStore",{enumerable:!0,get:function(){return k.derivedWithStore}}),Object.defineProperty(e,"autorun",{enumerable:!0,get:function(){return y.autorun}}),Object.defineProperty(e,"autorunHandleChanges",{enumerable:!0,get:function(){return y.autorunHandleChanges}}),Object.defineProperty(e,"autorunWithStore",{enumerable:!0,get:function(){return y.autorunWithStore}}),Object.defineProperty(e,"autorunOpts",{enumerable:!0,get:function(){return y.autorunOpts}}),Object.defineProperty(e,"constObservable",{enumerable:!0,get:function(){return E.constObservable}}),Object.defineProperty(e,"derivedObservableWithCache",{enumerable:!0,get:function(){return E.derivedObservableWithCache}}),Object.defineProperty(e,"keepObserved",{enumerable:!0,get:function(){return E.keepObserved}}),Object.defineProperty(e,"recomputeInitiallyAndOnChange",{enumerable:!0,get:function(){return E.recomputeInitiallyAndOnChange}}),Object.defineProperty(e,"observableFromEvent",{enumerable:!0,get:function(){return E.observableFromEvent}}),Object.defineProperty(e,"observableSignal",{enumerable:!0,get:function(){return E.observableSignal}}),Object.defineProperty(e,"observableSignalFromEvent",{enumerable:!0,get:function(){return E.observableSignalFromEvent}}),Object.defineProperty(e,"waitForState",{enumerable:!0,get:function(){return E.waitForState}}),!1&&(0,S.setLogger)(new S.ConsoleObservableLogger)}),define(se[172],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Range=void 0;var L;(function(k){function y(_,v){if(_.start>=v.end||v.start>=_.end)return{start:0,end:0};const b=Math.max(_.start,v.start),a=Math.min(_.end,v.end);return a-b<=0?{start:0,end:0}:{start:b,end:a}}k.intersect=y;function E(_){return _.end-_.start<=0}k.isEmpty=E;function S(_,v){return!E(y(_,v))}k.intersects=S;function p(_,v){const b=[],a={start:_.start,end:Math.min(v.start,_.end)},i={start:Math.max(v.end,_.start),end:_.end};return E(a)||b.push(a),E(i)||b.push(i),b}k.relativeComplement=p})(L||(e.Range=L={}))}),define(se[405],oe([1,0,172]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RangeMap=e.consolidate=e.shift=e.groupIntersect=void 0;function k(_,v){const b=[];for(const a of v){if(_.start>=a.range.end)continue;if(_.end<a.range.start)break;const i=L.Range.intersect(_,a.range);L.Range.isEmpty(i)||b.push({range:i,size:a.size})}return b}e.groupIntersect=k;function y({start:_,end:v},b){return{start:_+b,end:v+b}}e.shift=y;function E(_){const v=[];let b=null;for(const a of _){const i=a.range.start,n=a.range.end,t=a.size;if(b&&t===b.size){b.range.end=n;continue}b={range:{start:i,end:n},size:t},v.push(b)}return v}e.consolidate=E;function S(..._){return E(_.reduce((v,b)=>v.concat(b),[]))}class p{get paddingTop(){return this._paddingTop}set paddingTop(v){this._size=this._size+v-this._paddingTop,this._paddingTop=v}constructor(v){this.groups=[],this._size=0,this._paddingTop=0,this._paddingTop=v??0,this._size=this._paddingTop}splice(v,b,a=[]){const i=a.length-b,n=k({start:0,end:v},this.groups),t=k({start:v+b,end:Number.POSITIVE_INFINITY},this.groups).map(u=>({range:y(u.range,i),size:u.size})),r=a.map((u,f)=>({range:{start:v+f,end:v+f+1},size:u.size}));this.groups=S(n,r,t),this._size=this._paddingTop+this.groups.reduce((u,f)=>u+f.size*(f.range.end-f.range.start),0)}get count(){const v=this.groups.length;return v?this.groups[v-1].range.end:0}get size(){return this._size}indexAt(v){if(v<0)return-1;if(v<this._paddingTop)return 0;let b=0,a=this._paddingTop;for(const i of this.groups){const n=i.range.end-i.range.start,t=a+n*i.size;if(v<t)return b+Math.floor((v-a)/i.size);b+=n,a=t}return b}indexAfter(v){return Math.min(this.indexAt(v)+1,this.count)}positionAt(v){if(v<0)return-1;let b=0,a=0;for(const i of this.groups){const n=i.range.end-i.range.start,t=a+n;if(v<t)return this._paddingTop+b+(v-a)*i.size;b+=n*i.size,a=t}return-1}}e.RangeMap=p}),define(se[61],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StopWatch=void 0;const L=globalThis.performance&&typeof globalThis.performance.now=="function";class k{static create(E){return new k(E)}constructor(E){this._now=L&&E===!1?Date.now:globalThis.performance.now.bind(globalThis.performance),this._startTime=this._now(),this._stopTime=-1}stop(){this._stopTime=this._now()}elapsed(){return this._stopTime!==-1?this._stopTime-this._startTime:this._now()-this._startTime}}e.StopWatch=k}),define(se[6],oe([1,0,12,108,2,66,61]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Relay=e.EventBufferer=e.EventMultiplexer=e.MicrotaskEmitter=e.DebounceEmitter=e.PauseableEmitter=e.createEventDeliveryQueue=e.Emitter=e.EventProfiling=e.Event=void 0;const p=!1,_=!1;var v;(function(C){C.None=()=>y.Disposable.None;function w(X){if(_){const{onDidAddListener:U}=X,G=n.create();let z=0;X.onDidAddListener=()=>{++z===2&&(console.warn("snapshotted emitter LIKELY used public and SHOULD HAVE BEEN created with DisposableStore. snapshotted here"),G.print()),U?.()}}}function D(X,U){return B(X,()=>{},0,void 0,!0,void 0,U)}C.defer=D;function I(X){return(U,G=null,z)=>{let H=!1,Y;return Y=X(j=>{if(!H)return Y?Y.dispose():H=!0,U.call(G,j)},null,z),H&&Y.dispose(),Y}}C.once=I;function T(X,U,G){return x((z,H=null,Y)=>X(j=>z.call(H,U(j)),null,Y),G)}C.map=T;function A(X,U,G){return x((z,H=null,Y)=>X(j=>{U(j),z.call(H,j)},null,Y),G)}C.forEach=A;function P(X,U,G){return x((z,H=null,Y)=>X(j=>U(j)&&z.call(H,j),null,Y),G)}C.filter=P;function N(X){return X}C.signal=N;function M(...X){return(U,G=null,z)=>{const H=(0,y.combinedDisposable)(...X.map(Y=>Y(j=>U.call(G,j))));return O(H,z)}}C.any=M;function R(X,U,G,z){let H=G;return T(X,Y=>(H=U(H,Y),H),z)}C.reduce=R;function x(X,U){let G;const z={onWillAddFirstListener(){G=X(H.fire,H)},onDidRemoveLastListener(){G?.dispose()}};U||w(z);const H=new f(z);return U?.add(H),H.event}function O(X,U){return U instanceof Array?U.push(X):U&&U.add(X),X}function B(X,U,G=100,z=!1,H=!1,Y,j){let Z,ee,le,ue=0,ce;const pe={leakWarningThreshold:Y,onWillAddFirstListener(){Z=X(Ce=>{ue++,ee=U(ee,Ce),z&&!le&&(ve.fire(ee),ee=void 0),ce=()=>{const Se=ee;ee=void 0,le=void 0,(!z||ue>1)&&ve.fire(Se),ue=0},typeof G=="number"?(clearTimeout(le),le=setTimeout(ce,G)):le===void 0&&(le=0,queueMicrotask(ce))})},onWillRemoveListener(){H&&ue>0&&ce?.()},onDidRemoveLastListener(){ce=void 0,Z.dispose()}};j||w(pe);const ve=new f(pe);return j?.add(ve),ve.event}C.debounce=B;function W(X,U=0,G){return C.debounce(X,(z,H)=>z?(z.push(H),z):[H],U,void 0,!0,void 0,G)}C.accumulate=W;function V(X,U=(z,H)=>z===H,G){let z=!0,H;return P(X,Y=>{const j=z||!U(Y,H);return z=!1,H=Y,j},G)}C.latch=V;function K(X,U,G){return[C.filter(X,U,G),C.filter(X,z=>!U(z),G)]}C.split=K;function F(X,U=!1,G=[],z){let H=G.slice(),Y=X(ee=>{H?H.push(ee):Z.fire(ee)});z&&z.add(Y);const j=()=>{H?.forEach(ee=>Z.fire(ee)),H=null},Z=new f({onWillAddFirstListener(){Y||(Y=X(ee=>Z.fire(ee)),z&&z.add(Y))},onDidAddFirstListener(){H&&(U?setTimeout(j):j())},onDidRemoveLastListener(){Y&&Y.dispose(),Y=null}});return z&&z.add(Z),Z.event}C.buffer=F;function q(X,U){return(z,H,Y)=>{const j=U(new ae);return X(function(Z){const ee=j.evaluate(Z);ee!==ie&&z.call(H,ee)},void 0,Y)}}C.chain=q;const ie=Symbol("HaltChainable");class ae{constructor(){this.steps=[]}map(U){return this.steps.push(U),this}forEach(U){return this.steps.push(G=>(U(G),G)),this}filter(U){return this.steps.push(G=>U(G)?G:ie),this}reduce(U,G){let z=G;return this.steps.push(H=>(z=U(z,H),z)),this}latch(U=(G,z)=>G===z){let G=!0,z;return this.steps.push(H=>{const Y=G||!U(H,z);return G=!1,z=H,Y?H:ie}),this}evaluate(U){for(const G of this.steps)if(U=G(U),U===ie)break;return U}}function ne(X,U,G=z=>z){const z=(...Z)=>j.fire(G(...Z)),H=()=>X.on(U,z),Y=()=>X.removeListener(U,z),j=new f({onWillAddFirstListener:H,onDidRemoveLastListener:Y});return j.event}C.fromNodeEventEmitter=ne;function $(X,U,G=z=>z){const z=(...Z)=>j.fire(G(...Z)),H=()=>X.addEventListener(U,z),Y=()=>X.removeEventListener(U,z),j=new f({onWillAddFirstListener:H,onDidRemoveLastListener:Y});return j.event}C.fromDOMEventEmitter=$;function J(X){return new Promise(U=>I(X)(U))}C.toPromise=J;function Q(X){const U=new f;return X.then(G=>{U.fire(G)},()=>{U.fire(void 0)}).finally(()=>{U.dispose()}),U.event}C.fromPromise=Q;function re(X,U,G){return U(G),X(z=>U(z))}C.runAndSubscribe=re;class de{constructor(U,G){this._observable=U,this._counter=0,this._hasChanged=!1;const z={onWillAddFirstListener:()=>{U.addObserver(this)},onDidRemoveLastListener:()=>{U.removeObserver(this)}};G||w(z),this.emitter=new f(z),G&&G.add(this.emitter)}beginUpdate(U){this._counter++}handlePossibleChange(U){}handleChange(U,G){this._hasChanged=!0}endUpdate(U){this._counter--,this._counter===0&&(this._observable.reportChanges(),this._hasChanged&&(this._hasChanged=!1,this.emitter.fire(this._observable.get())))}}function he(X,U){return new de(X,U).emitter.event}C.fromObservable=he;function me(X){return(U,G,z)=>{let H=0,Y=!1;const j={beginUpdate(){H++},endUpdate(){H--,H===0&&(X.reportChanges(),Y&&(Y=!1,U.call(G)))},handlePossibleChange(){},handleChange(){Y=!0}};X.addObserver(j),X.reportChanges();const Z={dispose(){X.removeObserver(j)}};return z instanceof y.DisposableStore?z.add(Z):Array.isArray(z)&&z.push(Z),Z}}C.fromObservableLight=me})(v||(e.Event=v={}));class b{constructor(w){this.listenerCount=0,this.invocationCount=0,this.elapsedOverall=0,this.durations=[],this.name=`${w}_${b._idPool++}`,b.all.add(this)}start(w){this._stopWatch=new S.StopWatch,this.listenerCount=w}stop(){if(this._stopWatch){const w=this._stopWatch.elapsed();this.durations.push(w),this.elapsedOverall+=w,this.invocationCount+=1,this._stopWatch=void 0}}}e.EventProfiling=b,b.all=new Set,b._idPool=0;let a=-1;class i{constructor(w,D=Math.random().toString(18).slice(2,5)){this.threshold=w,this.name=D,this._warnCountdown=0}dispose(){var w;(w=this._stacks)===null||w===void 0||w.clear()}check(w,D){const I=this.threshold;if(I<=0||D<I)return;this._stacks||(this._stacks=new Map);const T=this._stacks.get(w.value)||0;if(this._stacks.set(w.value,T+1),this._warnCountdown-=1,this._warnCountdown<=0){this._warnCountdown=I*.5;let A,P=0;for(const[N,M]of this._stacks)(!A||P<M)&&(A=N,P=M);console.warn(`[${this.name}] potential listener LEAK detected, having ${D} listeners already. MOST frequent listener (${P}):`),console.warn(A)}return()=>{const A=this._stacks.get(w.value)||0;this._stacks.set(w.value,A-1)}}}class n{static create(){var w;return new n((w=new Error().stack)!==null&&w!==void 0?w:"")}constructor(w){this.value=w}print(){console.warn(this.value.split(`
+`).slice(2).join(`
+`))}}class t{constructor(w){this.value=w}}const r=2,u=(C,w)=>{if(C instanceof t)w(C);else for(let D=0;D<C.length;D++){const I=C[D];I&&w(I)}};class f{constructor(w){var D,I,T,A,P;this._size=0,this._options=w,this._leakageMon=a>0||!((D=this._options)===null||D===void 0)&&D.leakWarningThreshold?new i((T=(I=this._options)===null||I===void 0?void 0:I.leakWarningThreshold)!==null&&T!==void 0?T:a):void 0,this._perfMon=!((A=this._options)===null||A===void 0)&&A._profName?new b(this._options._profName):void 0,this._deliveryQueue=(P=this._options)===null||P===void 0?void 0:P.deliveryQueue}dispose(){var w,D,I,T;if(!this._disposed){if(this._disposed=!0,((w=this._deliveryQueue)===null||w===void 0?void 0:w.current)===this&&this._deliveryQueue.reset(),this._listeners){if(p){const A=this._listeners;queueMicrotask(()=>{u(A,P=>{var N;return(N=P.stack)===null||N===void 0?void 0:N.print()})})}this._listeners=void 0,this._size=0}(I=(D=this._options)===null||D===void 0?void 0:D.onDidRemoveLastListener)===null||I===void 0||I.call(D),(T=this._leakageMon)===null||T===void 0||T.dispose()}}get event(){var w;return(w=this._event)!==null&&w!==void 0||(this._event=(D,I,T)=>{var A,P,N,M,R;if(this._leakageMon&&this._size>this._leakageMon.threshold*3)return console.warn(`[${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far`),y.Disposable.None;if(this._disposed)return y.Disposable.None;I&&(D=D.bind(I));const x=new t(D);let O,B;this._leakageMon&&this._size>=Math.ceil(this._leakageMon.threshold*.2)&&(x.stack=n.create(),O=this._leakageMon.check(x.stack,this._size+1)),p&&(x.stack=B??n.create()),this._listeners?this._listeners instanceof t?((R=this._deliveryQueue)!==null&&R!==void 0||(this._deliveryQueue=new d),this._listeners=[this._listeners,x]):this._listeners.push(x):((P=(A=this._options)===null||A===void 0?void 0:A.onWillAddFirstListener)===null||P===void 0||P.call(A,this),this._listeners=x,(M=(N=this._options)===null||N===void 0?void 0:N.onDidAddFirstListener)===null||M===void 0||M.call(N,this)),this._size++;const W=(0,y.toDisposable)(()=>{O?.(),this._removeListener(x)});return T instanceof y.DisposableStore?T.add(W):Array.isArray(T)&&T.push(W),W}),this._event}_removeListener(w){var D,I,T,A;if((I=(D=this._options)===null||D===void 0?void 0:D.onWillRemoveListener)===null||I===void 0||I.call(D,this),!this._listeners)return;if(this._size===1){this._listeners=void 0,(A=(T=this._options)===null||T===void 0?void 0:T.onDidRemoveLastListener)===null||A===void 0||A.call(T,this),this._size=0;return}const P=this._listeners,N=P.indexOf(w);if(N===-1)throw console.log("disposed?",this._disposed),console.log("size?",this._size),console.log("arr?",JSON.stringify(this._listeners)),new Error("Attempted to dispose unknown listener");this._size--,P[N]=void 0;const M=this._deliveryQueue.current===this;if(this._size*r<=P.length){let R=0;for(let x=0;x<P.length;x++)P[x]?P[R++]=P[x]:M&&(this._deliveryQueue.end--,R<this._deliveryQueue.i&&this._deliveryQueue.i--);P.length=R}}_deliver(w,D){var I;if(!w)return;const T=((I=this._options)===null||I===void 0?void 0:I.onListenerError)||L.onUnexpectedError;if(!T){w.value(D);return}try{w.value(D)}catch(A){T(A)}}_deliverQueue(w){const D=w.current._listeners;for(;w.i<w.end;)this._deliver(D[w.i++],w.value);w.reset()}fire(w){var D,I,T,A;if(!((D=this._deliveryQueue)===null||D===void 0)&&D.current&&(this._deliverQueue(this._deliveryQueue),(I=this._perfMon)===null||I===void 0||I.stop()),(T=this._perfMon)===null||T===void 0||T.start(this._size),this._listeners)if(this._listeners instanceof t)this._deliver(this._listeners,w);else{const P=this._deliveryQueue;P.enqueue(this,w,this._listeners.length),this._deliverQueue(P)}(A=this._perfMon)===null||A===void 0||A.stop()}hasListeners(){return this._size>0}}e.Emitter=f;const c=()=>new d;e.createEventDeliveryQueue=c;class d{constructor(){this.i=-1,this.end=0}enqueue(w,D,I){this.i=0,this.end=I,this.current=w,this.value=D}reset(){this.i=this.end,this.current=void 0,this.value=void 0}}class s extends f{constructor(w){super(w),this._isPaused=0,this._eventQueue=new E.LinkedList,this._mergeFn=w?.merge}pause(){this._isPaused++}resume(){if(this._isPaused!==0&&--this._isPaused===0)if(this._mergeFn){if(this._eventQueue.size>0){const w=Array.from(this._eventQueue);this._eventQueue.clear(),super.fire(this._mergeFn(w))}}else for(;!this._isPaused&&this._eventQueue.size!==0;)super.fire(this._eventQueue.shift())}fire(w){this._size&&(this._isPaused!==0?this._eventQueue.push(w):super.fire(w))}}e.PauseableEmitter=s;class l extends s{constructor(w){var D;super(w),this._delay=(D=w.delay)!==null&&D!==void 0?D:100}fire(w){this._handle||(this.pause(),this._handle=setTimeout(()=>{this._handle=void 0,this.resume()},this._delay)),super.fire(w)}}e.DebounceEmitter=l;class o extends f{constructor(w){super(w),this._queuedEvents=[],this._mergeFn=w?.merge}fire(w){this.hasListeners()&&(this._queuedEvents.push(w),this._queuedEvents.length===1&&queueMicrotask(()=>{this._mergeFn?super.fire(this._mergeFn(this._queuedEvents)):this._queuedEvents.forEach(D=>super.fire(D)),this._queuedEvents=[]}))}}e.MicrotaskEmitter=o;class g{constructor(){this.hasListeners=!1,this.events=[],this.emitter=new f({onWillAddFirstListener:()=>this.onFirstListenerAdd(),onDidRemoveLastListener:()=>this.onLastListenerRemove()})}get event(){return this.emitter.event}add(w){const D={event:w,listener:null};this.events.push(D),this.hasListeners&&this.hook(D);const I=()=>{this.hasListeners&&this.unhook(D);const T=this.events.indexOf(D);this.events.splice(T,1)};return(0,y.toDisposable)((0,k.createSingleCallFunction)(I))}onFirstListenerAdd(){this.hasListeners=!0,this.events.forEach(w=>this.hook(w))}onLastListenerRemove(){this.hasListeners=!1,this.events.forEach(w=>this.unhook(w))}hook(w){w.listener=w.event(D=>this.emitter.fire(D))}unhook(w){w.listener&&w.listener.dispose(),w.listener=null}dispose(){this.emitter.dispose()}}e.EventMultiplexer=g;class h{constructor(){this.buffers=[]}wrapEvent(w){return(D,I,T)=>w(A=>{const P=this.buffers[this.buffers.length-1];P?P.push(()=>D.call(I,A)):D.call(I,A)},void 0,T)}bufferEvents(w){const D=[];this.buffers.push(D);const I=w();return this.buffers.pop(),D.forEach(T=>T()),I}}e.EventBufferer=h;class m{constructor(){this.listening=!1,this.inputEvent=v.None,this.inputEventListener=y.Disposable.None,this.emitter=new f({onDidAddFirstListener:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onDidRemoveLastListener:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(w){this.inputEvent=w,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=w(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}e.Relay=m}),define(se[54],oe([1,0,44,6,2]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isStandalone=e.isAndroid=e.isElectron=e.isWebkitWebView=e.isSafari=e.isChrome=e.isWebKit=e.isFirefox=e.getZoomFactor=e.PixelRatio=e.addMatchMediaChangeListener=void 0;class E{constructor(){this.mapWindowIdToZoomFactor=new Map}getZoomFactor(r){var u;return(u=this.mapWindowIdToZoomFactor.get(this.getWindowId(r)))!==null&&u!==void 0?u:1}getWindowId(r){return r.vscodeWindowId}}E.INSTANCE=new E;class S extends y.Disposable{constructor(){super(),this._onDidChange=this._register(new k.Emitter),this.onDidChange=this._onDidChange.event,this._listener=()=>this._handleChange(!0),this._mediaQueryList=null,this._handleChange(!1)}_handleChange(r){var u;(u=this._mediaQueryList)===null||u===void 0||u.removeEventListener("change",this._listener),this._mediaQueryList=L.$window.matchMedia(`(resolution: ${L.$window.devicePixelRatio}dppx)`),this._mediaQueryList.addEventListener("change",this._listener),r&&this._onDidChange.fire()}}class p extends y.Disposable{get value(){return this._value}constructor(){super(),this._onDidChange=this._register(new k.Emitter),this.onDidChange=this._onDidChange.event,this._value=this._getPixelRatio();const r=this._register(new S);this._register(r.onDidChange(()=>{this._value=this._getPixelRatio(),this._onDidChange.fire(this._value)}))}_getPixelRatio(){const r=document.createElement("canvas").getContext("2d"),u=L.$window.devicePixelRatio||1,f=r.webkitBackingStorePixelRatio||r.mozBackingStorePixelRatio||r.msBackingStorePixelRatio||r.oBackingStorePixelRatio||r.backingStorePixelRatio||1;return u/f}}class _{constructor(){this._pixelRatioMonitor=null}_getOrCreatePixelRatioMonitor(){return this._pixelRatioMonitor||(this._pixelRatioMonitor=(0,y.markAsSingleton)(new p)),this._pixelRatioMonitor}get value(){return this._getOrCreatePixelRatioMonitor().value}get onDidChange(){return this._getOrCreatePixelRatioMonitor().onDidChange}}function v(t,r,u){typeof r=="string"&&(r=t.matchMedia(r)),r.addEventListener("change",u)}e.addMatchMediaChangeListener=v,e.PixelRatio=new _;function b(t){return E.INSTANCE.getZoomFactor(t)}e.getZoomFactor=b;const a=navigator.userAgent;e.isFirefox=a.indexOf("Firefox")>=0,e.isWebKit=a.indexOf("AppleWebKit")>=0,e.isChrome=a.indexOf("Chrome")>=0,e.isSafari=!e.isChrome&&a.indexOf("Safari")>=0,e.isWebkitWebView=!e.isChrome&&!e.isSafari&&e.isWebKit,e.isElectron=a.indexOf("Electron/")>=0,e.isAndroid=a.indexOf("Android")>=0;let i=!1;if(typeof L.mainWindow.matchMedia=="function"){const t=L.mainWindow.matchMedia("(display-mode: standalone) or (display-mode: window-controls-overlay)"),r=L.mainWindow.matchMedia("(display-mode: fullscreen)");i=t.matches,v(L.mainWindow,t,({matches:u})=>{i&&r.matches||(i=u)})}function n(){return i}e.isStandalone=n}),define(se[84],oe([1,0,6]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DomEmitter=void 0;class k{get event(){return this.emitter.event}constructor(E,S,p){const _=v=>this.emitter.fire(v);this.emitter=new L.Emitter({onWillAddFirstListener:()=>E.addEventListener(S,_,p),onDidRemoveLastListener:()=>E.removeEventListener(S,_,p)})}dispose(){this.emitter.dispose()}}e.DomEmitter=k}),define(se[19],oe([1,0,6]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CancellationTokenSource=e.CancellationToken=void 0;const k=Object.freeze(function(p,_){const v=setTimeout(p.bind(_),0);return{dispose(){clearTimeout(v)}}});var y;(function(p){function _(v){return v===p.None||v===p.Cancelled||v instanceof E?!0:!v||typeof v!="object"?!1:typeof v.isCancellationRequested=="boolean"&&typeof v.onCancellationRequested=="function"}p.isCancellationToken=_,p.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:L.Event.None}),p.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:k})})(y||(e.CancellationToken=y={}));class E{constructor(){this._isCancelled=!1,this._emitter=null}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?k:(this._emitter||(this._emitter=new L.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=null)}}class S{constructor(_){this._token=void 0,this._parentListener=void 0,this._parentListener=_&&_.onCancellationRequested(this.cancel,this)}get token(){return this._token||(this._token=new E),this._token}cancel(){this._token?this._token instanceof E&&this._token.cancel():this._token=y.Cancelled}dispose(_=!1){var v;_&&this.cancel(),(v=this._parentListener)===null||v===void 0||v.dispose(),this._token?this._token instanceof E&&this._token.dispose():this._token=y.None}}e.CancellationTokenSource=S}),define(se[270],oe([1,0,6]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IME=e.IMEImpl=void 0;class k{constructor(){this._onDidChange=new L.Emitter,this.onDidChange=this._onDidChange.event,this._enabled=!0}get enabled(){return this._enabled}enable(){this._enabled=!0,this._onDidChange.fire()}disable(){this._enabled=!1,this._onDidChange.fire()}}e.IMEImpl=k,e.IME=new k}),define(se[147],oe([1,0,6,2]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SmoothScrollingOperation=e.SmoothScrollingUpdate=e.Scrollable=e.ScrollState=void 0;class y{constructor(n,t,r,u,f,c,d){this._forceIntegerValues=n,this._scrollStateBrand=void 0,this._forceIntegerValues&&(t=t|0,r=r|0,u=u|0,f=f|0,c=c|0,d=d|0),this.rawScrollLeft=u,this.rawScrollTop=d,t<0&&(t=0),u+t>r&&(u=r-t),u<0&&(u=0),f<0&&(f=0),d+f>c&&(d=c-f),d<0&&(d=0),this.width=t,this.scrollWidth=r,this.scrollLeft=u,this.height=f,this.scrollHeight=c,this.scrollTop=d}equals(n){return this.rawScrollLeft===n.rawScrollLeft&&this.rawScrollTop===n.rawScrollTop&&this.width===n.width&&this.scrollWidth===n.scrollWidth&&this.scrollLeft===n.scrollLeft&&this.height===n.height&&this.scrollHeight===n.scrollHeight&&this.scrollTop===n.scrollTop}withScrollDimensions(n,t){return new y(this._forceIntegerValues,typeof n.width<"u"?n.width:this.width,typeof n.scrollWidth<"u"?n.scrollWidth:this.scrollWidth,t?this.rawScrollLeft:this.scrollLeft,typeof n.height<"u"?n.height:this.height,typeof n.scrollHeight<"u"?n.scrollHeight:this.scrollHeight,t?this.rawScrollTop:this.scrollTop)}withScrollPosition(n){return new y(this._forceIntegerValues,this.width,this.scrollWidth,typeof n.scrollLeft<"u"?n.scrollLeft:this.rawScrollLeft,this.height,this.scrollHeight,typeof n.scrollTop<"u"?n.scrollTop:this.rawScrollTop)}createScrollEvent(n,t){const r=this.width!==n.width,u=this.scrollWidth!==n.scrollWidth,f=this.scrollLeft!==n.scrollLeft,c=this.height!==n.height,d=this.scrollHeight!==n.scrollHeight,s=this.scrollTop!==n.scrollTop;return{inSmoothScrolling:t,oldWidth:n.width,oldScrollWidth:n.scrollWidth,oldScrollLeft:n.scrollLeft,width:this.width,scrollWidth:this.scrollWidth,scrollLeft:this.scrollLeft,oldHeight:n.height,oldScrollHeight:n.scrollHeight,oldScrollTop:n.scrollTop,height:this.height,scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,widthChanged:r,scrollWidthChanged:u,scrollLeftChanged:f,heightChanged:c,scrollHeightChanged:d,scrollTopChanged:s}}}e.ScrollState=y;class E extends k.Disposable{constructor(n){super(),this._scrollableBrand=void 0,this._onScroll=this._register(new L.Emitter),this.onScroll=this._onScroll.event,this._smoothScrollDuration=n.smoothScrollDuration,this._scheduleAtNextAnimationFrame=n.scheduleAtNextAnimationFrame,this._state=new y(n.forceIntegerValues,0,0,0,0,0,0),this._smoothScrolling=null}dispose(){this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),super.dispose()}setSmoothScrollDuration(n){this._smoothScrollDuration=n}validateScrollPosition(n){return this._state.withScrollPosition(n)}getScrollDimensions(){return this._state}setScrollDimensions(n,t){var r;const u=this._state.withScrollDimensions(n,t);this._setState(u,!!this._smoothScrolling),(r=this._smoothScrolling)===null||r===void 0||r.acceptScrollDimensions(this._state)}getFutureScrollPosition(){return this._smoothScrolling?this._smoothScrolling.to:this._state}getCurrentScrollPosition(){return this._state}setScrollPositionNow(n){const t=this._state.withScrollPosition(n);this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),this._setState(t,!1)}setScrollPositionSmooth(n,t){if(this._smoothScrollDuration===0)return this.setScrollPositionNow(n);if(this._smoothScrolling){n={scrollLeft:typeof n.scrollLeft>"u"?this._smoothScrolling.to.scrollLeft:n.scrollLeft,scrollTop:typeof n.scrollTop>"u"?this._smoothScrolling.to.scrollTop:n.scrollTop};const r=this._state.withScrollPosition(n);if(this._smoothScrolling.to.scrollLeft===r.scrollLeft&&this._smoothScrolling.to.scrollTop===r.scrollTop)return;let u;t?u=new v(this._smoothScrolling.from,r,this._smoothScrolling.startTime,this._smoothScrolling.duration):u=this._smoothScrolling.combine(this._state,r,this._smoothScrollDuration),this._smoothScrolling.dispose(),this._smoothScrolling=u}else{const r=this._state.withScrollPosition(n);this._smoothScrolling=v.start(this._state,r,this._smoothScrollDuration)}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}hasPendingScrollAnimation(){return!!this._smoothScrolling}_performSmoothScrolling(){if(!this._smoothScrolling)return;const n=this._smoothScrolling.tick(),t=this._state.withScrollPosition(n);if(this._setState(t,!0),!!this._smoothScrolling){if(n.isDone){this._smoothScrolling.dispose(),this._smoothScrolling=null;return}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{this._smoothScrolling&&(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}}_setState(n,t){const r=this._state;r.equals(n)||(this._state=n,this._onScroll.fire(this._state.createScrollEvent(r,t)))}}e.Scrollable=E;class S{constructor(n,t,r){this.scrollLeft=n,this.scrollTop=t,this.isDone=r}}e.SmoothScrollingUpdate=S;function p(i,n){const t=n-i;return function(r){return i+t*a(r)}}function _(i,n,t){return function(r){return r<t?i(r/t):n((r-t)/(1-t))}}class v{constructor(n,t,r,u){this.from=n,this.to=t,this.duration=u,this.startTime=r,this.animationFrameDisposable=null,this._initAnimations()}_initAnimations(){this.scrollLeft=this._initAnimation(this.from.scrollLeft,this.to.scrollLeft,this.to.width),this.scrollTop=this._initAnimation(this.from.scrollTop,this.to.scrollTop,this.to.height)}_initAnimation(n,t,r){if(Math.abs(n-t)>2.5*r){let f,c;return n<t?(f=n+.75*r,c=t-.75*r):(f=n-.75*r,c=t+.75*r),_(p(n,f),p(c,t),.33)}return p(n,t)}dispose(){this.animationFrameDisposable!==null&&(this.animationFrameDisposable.dispose(),this.animationFrameDisposable=null)}acceptScrollDimensions(n){this.to=n.withScrollPosition(this.to),this._initAnimations()}tick(){return this._tick(Date.now())}_tick(n){const t=(n-this.startTime)/this.duration;if(t<1){const r=this.scrollLeft(t),u=this.scrollTop(t);return new S(r,u,!1)}return new S(this.to.scrollLeft,this.to.scrollTop,!0)}combine(n,t,r){return v.start(n,t,r)}static start(n,t,r){r=r+10;const u=Date.now()-10;return new v(n,t,u,r)}}e.SmoothScrollingOperation=v;function b(i){return Math.pow(i,3)}function a(i){return 1-b(1-i)}}),define(se[11],oe([1,0,267,99]),function(te,e,L,k){"use strict";var y;Object.defineProperty(e,"__esModule",{value:!0}),e.InvisibleCharacters=e.AmbiguousCharacters=e.noBreakWhitespace=e.getLeftDeleteOffset=e.singleLetterHash=e.containsUppercaseCharacter=e.startsWithUTF8BOM=e.UTF8_BOM_CHARACTER=e.isEmojiImprecise=e.isFullWidthCharacter=e.containsUnusualLineTerminators=e.UNUSUAL_LINE_TERMINATORS=e.isBasicASCII=e.containsRTL=e.getCharContainingOffset=e.prevCharLength=e.nextCharLength=e.GraphemeIterator=e.CodePointIterator=e.getNextCodePoint=e.computeCodePoint=e.isLowSurrogate=e.isHighSurrogate=e.commonSuffixLength=e.commonPrefixLength=e.startsWithIgnoreCase=e.equalsIgnoreCase=e.isUpperAsciiLetter=e.isLowerAsciiLetter=e.isAsciiDigit=e.compareSubstringIgnoreCase=e.compareIgnoreCase=e.compareSubstring=e.compare=e.lastNonWhitespaceIndex=e.getLeadingWhitespace=e.firstNonWhitespaceIndex=e.splitLines=e.regExpLeadsToEndlessLoop=e.createRegExp=e.stripWildcards=e.convertSimple2RegExpPattern=e.rtrim=e.ltrim=e.trim=e.escapeRegExpCharacters=e.escape=e.htmlAttributeEncodeValue=e.format=e.isFalsyOrWhitespace=void 0;function E(ee){return!ee||typeof ee!="string"?!0:ee.trim().length===0}e.isFalsyOrWhitespace=E;const S=/{(\d+)}/g;function p(ee,...le){return le.length===0?ee:ee.replace(S,function(ue,ce){const pe=parseInt(ce,10);return isNaN(pe)||pe<0||pe>=le.length?ue:le[pe]})}e.format=p;function _(ee){return ee.replace(/[<>"'&]/g,le=>{switch(le){case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case"'":return"&apos;";case"&":return"&amp;"}return le})}e.htmlAttributeEncodeValue=_;function v(ee){return ee.replace(/[<>&]/g,function(le){switch(le){case"<":return"&lt;";case">":return"&gt;";case"&":return"&amp;";default:return le}})}e.escape=v;function b(ee){return ee.replace(/[\\\{\}\*\+\?\|\^\$\.\[\]\(\)]/g,"\\$&")}e.escapeRegExpCharacters=b;function a(ee,le=" "){const ue=i(ee,le);return n(ue,le)}e.trim=a;function i(ee,le){if(!ee||!le)return ee;const ue=le.length;if(ue===0||ee.length===0)return ee;let ce=0;for(;ee.indexOf(le,ce)===ce;)ce=ce+ue;return ee.substring(ce)}e.ltrim=i;function n(ee,le){if(!ee||!le)return ee;const ue=le.length,ce=ee.length;if(ue===0||ce===0)return ee;let pe=ce,ve=-1;for(;ve=ee.lastIndexOf(le,pe-1),!(ve===-1||ve+ue!==pe);){if(ve===0)return"";pe=ve}return ee.substring(0,pe)}e.rtrim=n;function t(ee){return ee.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g,"\\$&").replace(/[\*]/g,".*")}e.convertSimple2RegExpPattern=t;function r(ee){return ee.replace(/\*/g,"")}e.stripWildcards=r;function u(ee,le,ue={}){if(!ee)throw new Error("Cannot create regex from empty string");le||(ee=b(ee)),ue.wholeWord&&(/\B/.test(ee.charAt(0))||(ee="\\b"+ee),/\B/.test(ee.charAt(ee.length-1))||(ee=ee+"\\b"));let ce="";return ue.global&&(ce+="g"),ue.matchCase||(ce+="i"),ue.multiline&&(ce+="m"),ue.unicode&&(ce+="u"),new RegExp(ee,ce)}e.createRegExp=u;function f(ee){return ee.source==="^"||ee.source==="^$"||ee.source==="$"||ee.source==="^\\s*$"?!1:!!(ee.exec("")&&ee.lastIndex===0)}e.regExpLeadsToEndlessLoop=f;function c(ee){return ee.split(/\r\n|\r|\n/)}e.splitLines=c;function d(ee){for(let le=0,ue=ee.length;le<ue;le++){const ce=ee.charCodeAt(le);if(ce!==32&&ce!==9)return le}return-1}e.firstNonWhitespaceIndex=d;function s(ee,le=0,ue=ee.length){for(let ce=le;ce<ue;ce++){const pe=ee.charCodeAt(ce);if(pe!==32&&pe!==9)return ee.substring(le,ce)}return ee.substring(le,ue)}e.getLeadingWhitespace=s;function l(ee,le=ee.length-1){for(let ue=le;ue>=0;ue--){const ce=ee.charCodeAt(ue);if(ce!==32&&ce!==9)return ue}return-1}e.lastNonWhitespaceIndex=l;function o(ee,le){return ee<le?-1:ee>le?1:0}e.compare=o;function g(ee,le,ue=0,ce=ee.length,pe=0,ve=le.length){for(;ue<ce&&pe<ve;ue++,pe++){const _e=ee.charCodeAt(ue),Ee=le.charCodeAt(pe);if(_e<Ee)return-1;if(_e>Ee)return 1}const Ce=ce-ue,Se=ve-pe;return Ce<Se?-1:Ce>Se?1:0}e.compareSubstring=g;function h(ee,le){return m(ee,le,0,ee.length,0,le.length)}e.compareIgnoreCase=h;function m(ee,le,ue=0,ce=ee.length,pe=0,ve=le.length){for(;ue<ce&&pe<ve;ue++,pe++){let _e=ee.charCodeAt(ue),Ee=le.charCodeAt(pe);if(_e===Ee)continue;if(_e>=128||Ee>=128)return g(ee.toLowerCase(),le.toLowerCase(),ue,ce,pe,ve);w(_e)&&(_e-=32),w(Ee)&&(Ee-=32);const Ae=_e-Ee;if(Ae!==0)return Ae}const Ce=ce-ue,Se=ve-pe;return Ce<Se?-1:Ce>Se?1:0}e.compareSubstringIgnoreCase=m;function C(ee){return ee>=48&&ee<=57}e.isAsciiDigit=C;function w(ee){return ee>=97&&ee<=122}e.isLowerAsciiLetter=w;function D(ee){return ee>=65&&ee<=90}e.isUpperAsciiLetter=D;function I(ee,le){return ee.length===le.length&&m(ee,le)===0}e.equalsIgnoreCase=I;function T(ee,le){const ue=le.length;return le.length>ee.length?!1:m(ee,le,0,ue)===0}e.startsWithIgnoreCase=T;function A(ee,le){const ue=Math.min(ee.length,le.length);let ce;for(ce=0;ce<ue;ce++)if(ee.charCodeAt(ce)!==le.charCodeAt(ce))return ce;return ue}e.commonPrefixLength=A;function P(ee,le){const ue=Math.min(ee.length,le.length);let ce;const pe=ee.length-1,ve=le.length-1;for(ce=0;ce<ue;ce++)if(ee.charCodeAt(pe-ce)!==le.charCodeAt(ve-ce))return ce;return ue}e.commonSuffixLength=P;function N(ee){return 55296<=ee&&ee<=56319}e.isHighSurrogate=N;function M(ee){return 56320<=ee&&ee<=57343}e.isLowSurrogate=M;function R(ee,le){return(ee-55296<<10)+(le-56320)+65536}e.computeCodePoint=R;function x(ee,le,ue){const ce=ee.charCodeAt(ue);if(N(ce)&&ue+1<le){const pe=ee.charCodeAt(ue+1);if(M(pe))return R(ce,pe)}return ce}e.getNextCodePoint=x;function O(ee,le){const ue=ee.charCodeAt(le-1);if(M(ue)&&le>1){const ce=ee.charCodeAt(le-2);if(N(ce))return R(ce,ue)}return ue}class B{get offset(){return this._offset}constructor(le,ue=0){this._str=le,this._len=le.length,this._offset=ue}setOffset(le){this._offset=le}prevCodePoint(){const le=O(this._str,this._offset);return this._offset-=le>=65536?2:1,le}nextCodePoint(){const le=x(this._str,this._len,this._offset);return this._offset+=le>=65536?2:1,le}eol(){return this._offset>=this._len}}e.CodePointIterator=B;class W{get offset(){return this._iterator.offset}constructor(le,ue=0){this._iterator=new B(le,ue)}nextGraphemeLength(){const le=U.getInstance(),ue=this._iterator,ce=ue.offset;let pe=le.getGraphemeBreakType(ue.nextCodePoint());for(;!ue.eol();){const ve=ue.offset,Ce=le.getGraphemeBreakType(ue.nextCodePoint());if(X(pe,Ce)){ue.setOffset(ve);break}pe=Ce}return ue.offset-ce}prevGraphemeLength(){const le=U.getInstance(),ue=this._iterator,ce=ue.offset;let pe=le.getGraphemeBreakType(ue.prevCodePoint());for(;ue.offset>0;){const ve=ue.offset,Ce=le.getGraphemeBreakType(ue.prevCodePoint());if(X(Ce,pe)){ue.setOffset(ve);break}pe=Ce}return ce-ue.offset}eol(){return this._iterator.eol()}}e.GraphemeIterator=W;function V(ee,le){return new W(ee,le).nextGraphemeLength()}e.nextCharLength=V;function K(ee,le){return new W(ee,le).prevGraphemeLength()}e.prevCharLength=K;function F(ee,le){le>0&&M(ee.charCodeAt(le))&&le--;const ue=le+V(ee,le);return[ue-K(ee,ue),ue]}e.getCharContainingOffset=F;let q;function ie(){return/(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA\u07FE-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u088E\u08A0-\u08C9\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDC7\uFDF0-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE35\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDD23\uDE80-\uDEA9\uDEAD-\uDF45\uDF51-\uDF81\uDF86-\uDFF6]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD4B-\uDFFF]|\uD83B[\uDC00-\uDEBB])/}function ae(ee){return q||(q=ie()),q.test(ee)}e.containsRTL=ae;const ne=/^[\t\n\r\x20-\x7E]*$/;function $(ee){return ne.test(ee)}e.isBasicASCII=$,e.UNUSUAL_LINE_TERMINATORS=/[\u2028\u2029]/;function J(ee){return e.UNUSUAL_LINE_TERMINATORS.test(ee)}e.containsUnusualLineTerminators=J;function Q(ee){return ee>=11904&&ee<=55215||ee>=63744&&ee<=64255||ee>=65281&&ee<=65374}e.isFullWidthCharacter=Q;function re(ee){return ee>=127462&&ee<=127487||ee===8986||ee===8987||ee===9200||ee===9203||ee>=9728&&ee<=10175||ee===11088||ee===11093||ee>=127744&&ee<=128591||ee>=128640&&ee<=128764||ee>=128992&&ee<=129008||ee>=129280&&ee<=129535||ee>=129648&&ee<=129782}e.isEmojiImprecise=re,e.UTF8_BOM_CHARACTER=String.fromCharCode(65279);function de(ee){return!!(ee&&ee.length>0&&ee.charCodeAt(0)===65279)}e.startsWithUTF8BOM=de;function he(ee,le=!1){return ee?(le&&(ee=ee.replace(/\\./g,"")),ee.toLowerCase()!==ee):!1}e.containsUppercaseCharacter=he;function me(ee){return ee=ee%(2*26),ee<26?String.fromCharCode(97+ee):String.fromCharCode(65+ee-26)}e.singleLetterHash=me;function X(ee,le){return ee===0?le!==5&&le!==7:ee===2&&le===3?!1:ee===4||ee===2||ee===3||le===4||le===2||le===3?!0:!(ee===8&&(le===8||le===9||le===11||le===12)||(ee===11||ee===9)&&(le===9||le===10)||(ee===12||ee===10)&&le===10||le===5||le===13||le===7||ee===1||ee===13&&le===14||ee===6&&le===6)}class U{static getInstance(){return U._INSTANCE||(U._INSTANCE=new U),U._INSTANCE}constructor(){this._data=G()}getGraphemeBreakType(le){if(le<32)return le===10?3:le===13?2:4;if(le<127)return 0;const ue=this._data,ce=ue.length/3;let pe=1;for(;pe<=ce;)if(le<ue[3*pe])pe=2*pe;else if(le>ue[3*pe+1])pe=2*pe+1;else return ue[3*pe+2];return 0}}U._INSTANCE=null;function G(){return JSON.parse("[0,0,0,51229,51255,12,44061,44087,12,127462,127487,6,7083,7085,5,47645,47671,12,54813,54839,12,128678,128678,14,3270,3270,5,9919,9923,14,45853,45879,12,49437,49463,12,53021,53047,12,71216,71218,7,128398,128399,14,129360,129374,14,2519,2519,5,4448,4519,9,9742,9742,14,12336,12336,14,44957,44983,12,46749,46775,12,48541,48567,12,50333,50359,12,52125,52151,12,53917,53943,12,69888,69890,5,73018,73018,5,127990,127990,14,128558,128559,14,128759,128760,14,129653,129655,14,2027,2035,5,2891,2892,7,3761,3761,5,6683,6683,5,8293,8293,4,9825,9826,14,9999,9999,14,43452,43453,5,44509,44535,12,45405,45431,12,46301,46327,12,47197,47223,12,48093,48119,12,48989,49015,12,49885,49911,12,50781,50807,12,51677,51703,12,52573,52599,12,53469,53495,12,54365,54391,12,65279,65279,4,70471,70472,7,72145,72147,7,119173,119179,5,127799,127818,14,128240,128244,14,128512,128512,14,128652,128652,14,128721,128722,14,129292,129292,14,129445,129450,14,129734,129743,14,1476,1477,5,2366,2368,7,2750,2752,7,3076,3076,5,3415,3415,5,4141,4144,5,6109,6109,5,6964,6964,5,7394,7400,5,9197,9198,14,9770,9770,14,9877,9877,14,9968,9969,14,10084,10084,14,43052,43052,5,43713,43713,5,44285,44311,12,44733,44759,12,45181,45207,12,45629,45655,12,46077,46103,12,46525,46551,12,46973,46999,12,47421,47447,12,47869,47895,12,48317,48343,12,48765,48791,12,49213,49239,12,49661,49687,12,50109,50135,12,50557,50583,12,51005,51031,12,51453,51479,12,51901,51927,12,52349,52375,12,52797,52823,12,53245,53271,12,53693,53719,12,54141,54167,12,54589,54615,12,55037,55063,12,69506,69509,5,70191,70193,5,70841,70841,7,71463,71467,5,72330,72342,5,94031,94031,5,123628,123631,5,127763,127765,14,127941,127941,14,128043,128062,14,128302,128317,14,128465,128467,14,128539,128539,14,128640,128640,14,128662,128662,14,128703,128703,14,128745,128745,14,129004,129007,14,129329,129330,14,129402,129402,14,129483,129483,14,129686,129704,14,130048,131069,14,173,173,4,1757,1757,1,2200,2207,5,2434,2435,7,2631,2632,5,2817,2817,5,3008,3008,5,3201,3201,5,3387,3388,5,3542,3542,5,3902,3903,7,4190,4192,5,6002,6003,5,6439,6440,5,6765,6770,7,7019,7027,5,7154,7155,7,8205,8205,13,8505,8505,14,9654,9654,14,9757,9757,14,9792,9792,14,9852,9853,14,9890,9894,14,9937,9937,14,9981,9981,14,10035,10036,14,11035,11036,14,42654,42655,5,43346,43347,7,43587,43587,5,44006,44007,7,44173,44199,12,44397,44423,12,44621,44647,12,44845,44871,12,45069,45095,12,45293,45319,12,45517,45543,12,45741,45767,12,45965,45991,12,46189,46215,12,46413,46439,12,46637,46663,12,46861,46887,12,47085,47111,12,47309,47335,12,47533,47559,12,47757,47783,12,47981,48007,12,48205,48231,12,48429,48455,12,48653,48679,12,48877,48903,12,49101,49127,12,49325,49351,12,49549,49575,12,49773,49799,12,49997,50023,12,50221,50247,12,50445,50471,12,50669,50695,12,50893,50919,12,51117,51143,12,51341,51367,12,51565,51591,12,51789,51815,12,52013,52039,12,52237,52263,12,52461,52487,12,52685,52711,12,52909,52935,12,53133,53159,12,53357,53383,12,53581,53607,12,53805,53831,12,54029,54055,12,54253,54279,12,54477,54503,12,54701,54727,12,54925,54951,12,55149,55175,12,68101,68102,5,69762,69762,7,70067,70069,7,70371,70378,5,70720,70721,7,71087,71087,5,71341,71341,5,71995,71996,5,72249,72249,7,72850,72871,5,73109,73109,5,118576,118598,5,121505,121519,5,127245,127247,14,127568,127569,14,127777,127777,14,127872,127891,14,127956,127967,14,128015,128016,14,128110,128172,14,128259,128259,14,128367,128368,14,128424,128424,14,128488,128488,14,128530,128532,14,128550,128551,14,128566,128566,14,128647,128647,14,128656,128656,14,128667,128673,14,128691,128693,14,128715,128715,14,128728,128732,14,128752,128752,14,128765,128767,14,129096,129103,14,129311,129311,14,129344,129349,14,129394,129394,14,129413,129425,14,129466,129471,14,129511,129535,14,129664,129666,14,129719,129722,14,129760,129767,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2307,2307,7,2382,2383,7,2497,2500,5,2563,2563,7,2677,2677,5,2763,2764,7,2879,2879,5,2914,2915,5,3021,3021,5,3142,3144,5,3263,3263,5,3285,3286,5,3398,3400,7,3530,3530,5,3633,3633,5,3864,3865,5,3974,3975,5,4155,4156,7,4229,4230,5,5909,5909,7,6078,6085,7,6277,6278,5,6451,6456,7,6744,6750,5,6846,6846,5,6972,6972,5,7074,7077,5,7146,7148,7,7222,7223,5,7416,7417,5,8234,8238,4,8417,8417,5,9000,9000,14,9203,9203,14,9730,9731,14,9748,9749,14,9762,9763,14,9776,9783,14,9800,9811,14,9831,9831,14,9872,9873,14,9882,9882,14,9900,9903,14,9929,9933,14,9941,9960,14,9974,9974,14,9989,9989,14,10006,10006,14,10062,10062,14,10160,10160,14,11647,11647,5,12953,12953,14,43019,43019,5,43232,43249,5,43443,43443,5,43567,43568,7,43696,43696,5,43765,43765,7,44013,44013,5,44117,44143,12,44229,44255,12,44341,44367,12,44453,44479,12,44565,44591,12,44677,44703,12,44789,44815,12,44901,44927,12,45013,45039,12,45125,45151,12,45237,45263,12,45349,45375,12,45461,45487,12,45573,45599,12,45685,45711,12,45797,45823,12,45909,45935,12,46021,46047,12,46133,46159,12,46245,46271,12,46357,46383,12,46469,46495,12,46581,46607,12,46693,46719,12,46805,46831,12,46917,46943,12,47029,47055,12,47141,47167,12,47253,47279,12,47365,47391,12,47477,47503,12,47589,47615,12,47701,47727,12,47813,47839,12,47925,47951,12,48037,48063,12,48149,48175,12,48261,48287,12,48373,48399,12,48485,48511,12,48597,48623,12,48709,48735,12,48821,48847,12,48933,48959,12,49045,49071,12,49157,49183,12,49269,49295,12,49381,49407,12,49493,49519,12,49605,49631,12,49717,49743,12,49829,49855,12,49941,49967,12,50053,50079,12,50165,50191,12,50277,50303,12,50389,50415,12,50501,50527,12,50613,50639,12,50725,50751,12,50837,50863,12,50949,50975,12,51061,51087,12,51173,51199,12,51285,51311,12,51397,51423,12,51509,51535,12,51621,51647,12,51733,51759,12,51845,51871,12,51957,51983,12,52069,52095,12,52181,52207,12,52293,52319,12,52405,52431,12,52517,52543,12,52629,52655,12,52741,52767,12,52853,52879,12,52965,52991,12,53077,53103,12,53189,53215,12,53301,53327,12,53413,53439,12,53525,53551,12,53637,53663,12,53749,53775,12,53861,53887,12,53973,53999,12,54085,54111,12,54197,54223,12,54309,54335,12,54421,54447,12,54533,54559,12,54645,54671,12,54757,54783,12,54869,54895,12,54981,55007,12,55093,55119,12,55243,55291,10,66045,66045,5,68325,68326,5,69688,69702,5,69817,69818,5,69957,69958,7,70089,70092,5,70198,70199,5,70462,70462,5,70502,70508,5,70750,70750,5,70846,70846,7,71100,71101,5,71230,71230,7,71351,71351,5,71737,71738,5,72000,72000,7,72160,72160,5,72273,72278,5,72752,72758,5,72882,72883,5,73031,73031,5,73461,73462,7,94192,94193,7,119149,119149,7,121403,121452,5,122915,122916,5,126980,126980,14,127358,127359,14,127535,127535,14,127759,127759,14,127771,127771,14,127792,127793,14,127825,127867,14,127897,127899,14,127945,127945,14,127985,127986,14,128000,128007,14,128021,128021,14,128066,128100,14,128184,128235,14,128249,128252,14,128266,128276,14,128335,128335,14,128379,128390,14,128407,128419,14,128444,128444,14,128481,128481,14,128499,128499,14,128526,128526,14,128536,128536,14,128543,128543,14,128556,128556,14,128564,128564,14,128577,128580,14,128643,128645,14,128649,128649,14,128654,128654,14,128660,128660,14,128664,128664,14,128675,128675,14,128686,128689,14,128695,128696,14,128705,128709,14,128717,128719,14,128725,128725,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129009,129023,14,129160,129167,14,129296,129304,14,129320,129327,14,129340,129342,14,129356,129356,14,129388,129392,14,129399,129400,14,129404,129407,14,129432,129442,14,129454,129455,14,129473,129474,14,129485,129487,14,129648,129651,14,129659,129660,14,129671,129679,14,129709,129711,14,129728,129730,14,129751,129753,14,129776,129782,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2274,2274,1,2363,2363,7,2377,2380,7,2402,2403,5,2494,2494,5,2507,2508,7,2558,2558,5,2622,2624,7,2641,2641,5,2691,2691,7,2759,2760,5,2786,2787,5,2876,2876,5,2881,2884,5,2901,2902,5,3006,3006,5,3014,3016,7,3072,3072,5,3134,3136,5,3157,3158,5,3260,3260,5,3266,3266,5,3274,3275,7,3328,3329,5,3391,3392,7,3405,3405,5,3457,3457,5,3536,3537,7,3551,3551,5,3636,3642,5,3764,3772,5,3895,3895,5,3967,3967,7,3993,4028,5,4146,4151,5,4182,4183,7,4226,4226,5,4253,4253,5,4957,4959,5,5940,5940,7,6070,6070,7,6087,6088,7,6158,6158,4,6432,6434,5,6448,6449,7,6679,6680,5,6742,6742,5,6754,6754,5,6783,6783,5,6912,6915,5,6966,6970,5,6978,6978,5,7042,7042,7,7080,7081,5,7143,7143,7,7150,7150,7,7212,7219,5,7380,7392,5,7412,7412,5,8203,8203,4,8232,8232,4,8265,8265,14,8400,8412,5,8421,8432,5,8617,8618,14,9167,9167,14,9200,9200,14,9410,9410,14,9723,9726,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9774,14,9786,9786,14,9794,9794,14,9823,9823,14,9828,9828,14,9833,9850,14,9855,9855,14,9875,9875,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9935,9935,14,9939,9939,14,9962,9962,14,9972,9972,14,9978,9978,14,9986,9986,14,9997,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10133,10135,14,10548,10549,14,11093,11093,14,12330,12333,5,12441,12442,5,42608,42610,5,43010,43010,5,43045,43046,5,43188,43203,7,43302,43309,5,43392,43394,5,43446,43449,5,43493,43493,5,43571,43572,7,43597,43597,7,43703,43704,5,43756,43757,5,44003,44004,7,44009,44010,7,44033,44059,12,44089,44115,12,44145,44171,12,44201,44227,12,44257,44283,12,44313,44339,12,44369,44395,12,44425,44451,12,44481,44507,12,44537,44563,12,44593,44619,12,44649,44675,12,44705,44731,12,44761,44787,12,44817,44843,12,44873,44899,12,44929,44955,12,44985,45011,12,45041,45067,12,45097,45123,12,45153,45179,12,45209,45235,12,45265,45291,12,45321,45347,12,45377,45403,12,45433,45459,12,45489,45515,12,45545,45571,12,45601,45627,12,45657,45683,12,45713,45739,12,45769,45795,12,45825,45851,12,45881,45907,12,45937,45963,12,45993,46019,12,46049,46075,12,46105,46131,12,46161,46187,12,46217,46243,12,46273,46299,12,46329,46355,12,46385,46411,12,46441,46467,12,46497,46523,12,46553,46579,12,46609,46635,12,46665,46691,12,46721,46747,12,46777,46803,12,46833,46859,12,46889,46915,12,46945,46971,12,47001,47027,12,47057,47083,12,47113,47139,12,47169,47195,12,47225,47251,12,47281,47307,12,47337,47363,12,47393,47419,12,47449,47475,12,47505,47531,12,47561,47587,12,47617,47643,12,47673,47699,12,47729,47755,12,47785,47811,12,47841,47867,12,47897,47923,12,47953,47979,12,48009,48035,12,48065,48091,12,48121,48147,12,48177,48203,12,48233,48259,12,48289,48315,12,48345,48371,12,48401,48427,12,48457,48483,12,48513,48539,12,48569,48595,12,48625,48651,12,48681,48707,12,48737,48763,12,48793,48819,12,48849,48875,12,48905,48931,12,48961,48987,12,49017,49043,12,49073,49099,12,49129,49155,12,49185,49211,12,49241,49267,12,49297,49323,12,49353,49379,12,49409,49435,12,49465,49491,12,49521,49547,12,49577,49603,12,49633,49659,12,49689,49715,12,49745,49771,12,49801,49827,12,49857,49883,12,49913,49939,12,49969,49995,12,50025,50051,12,50081,50107,12,50137,50163,12,50193,50219,12,50249,50275,12,50305,50331,12,50361,50387,12,50417,50443,12,50473,50499,12,50529,50555,12,50585,50611,12,50641,50667,12,50697,50723,12,50753,50779,12,50809,50835,12,50865,50891,12,50921,50947,12,50977,51003,12,51033,51059,12,51089,51115,12,51145,51171,12,51201,51227,12,51257,51283,12,51313,51339,12,51369,51395,12,51425,51451,12,51481,51507,12,51537,51563,12,51593,51619,12,51649,51675,12,51705,51731,12,51761,51787,12,51817,51843,12,51873,51899,12,51929,51955,12,51985,52011,12,52041,52067,12,52097,52123,12,52153,52179,12,52209,52235,12,52265,52291,12,52321,52347,12,52377,52403,12,52433,52459,12,52489,52515,12,52545,52571,12,52601,52627,12,52657,52683,12,52713,52739,12,52769,52795,12,52825,52851,12,52881,52907,12,52937,52963,12,52993,53019,12,53049,53075,12,53105,53131,12,53161,53187,12,53217,53243,12,53273,53299,12,53329,53355,12,53385,53411,12,53441,53467,12,53497,53523,12,53553,53579,12,53609,53635,12,53665,53691,12,53721,53747,12,53777,53803,12,53833,53859,12,53889,53915,12,53945,53971,12,54001,54027,12,54057,54083,12,54113,54139,12,54169,54195,12,54225,54251,12,54281,54307,12,54337,54363,12,54393,54419,12,54449,54475,12,54505,54531,12,54561,54587,12,54617,54643,12,54673,54699,12,54729,54755,12,54785,54811,12,54841,54867,12,54897,54923,12,54953,54979,12,55009,55035,12,55065,55091,12,55121,55147,12,55177,55203,12,65024,65039,5,65520,65528,4,66422,66426,5,68152,68154,5,69291,69292,5,69633,69633,5,69747,69748,5,69811,69814,5,69826,69826,5,69932,69932,7,70016,70017,5,70079,70080,7,70095,70095,5,70196,70196,5,70367,70367,5,70402,70403,7,70464,70464,5,70487,70487,5,70709,70711,7,70725,70725,7,70833,70834,7,70843,70844,7,70849,70849,7,71090,71093,5,71103,71104,5,71227,71228,7,71339,71339,5,71344,71349,5,71458,71461,5,71727,71735,5,71985,71989,7,71998,71998,5,72002,72002,7,72154,72155,5,72193,72202,5,72251,72254,5,72281,72283,5,72344,72345,5,72766,72766,7,72874,72880,5,72885,72886,5,73023,73029,5,73104,73105,5,73111,73111,5,92912,92916,5,94095,94098,5,113824,113827,4,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,125252,125258,5,127183,127183,14,127340,127343,14,127377,127386,14,127491,127503,14,127548,127551,14,127744,127756,14,127761,127761,14,127769,127769,14,127773,127774,14,127780,127788,14,127796,127797,14,127820,127823,14,127869,127869,14,127894,127895,14,127902,127903,14,127943,127943,14,127947,127950,14,127972,127972,14,127988,127988,14,127992,127994,14,128009,128011,14,128019,128019,14,128023,128041,14,128064,128064,14,128102,128107,14,128174,128181,14,128238,128238,14,128246,128247,14,128254,128254,14,128264,128264,14,128278,128299,14,128329,128330,14,128348,128359,14,128371,128377,14,128392,128393,14,128401,128404,14,128421,128421,14,128433,128434,14,128450,128452,14,128476,128478,14,128483,128483,14,128495,128495,14,128506,128506,14,128519,128520,14,128528,128528,14,128534,128534,14,128538,128538,14,128540,128542,14,128544,128549,14,128552,128555,14,128557,128557,14,128560,128563,14,128565,128565,14,128567,128576,14,128581,128591,14,128641,128642,14,128646,128646,14,128648,128648,14,128650,128651,14,128653,128653,14,128655,128655,14,128657,128659,14,128661,128661,14,128663,128663,14,128665,128666,14,128674,128674,14,128676,128677,14,128679,128685,14,128690,128690,14,128694,128694,14,128697,128702,14,128704,128704,14,128710,128714,14,128716,128716,14,128720,128720,14,128723,128724,14,128726,128727,14,128733,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129008,129008,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129661,129663,14,129667,129670,14,129680,129685,14,129705,129708,14,129712,129718,14,129723,129727,14,129731,129733,14,129744,129750,14,129754,129759,14,129768,129775,14,129783,129791,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2192,2193,1,2250,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3132,3132,5,3137,3140,7,3146,3149,5,3170,3171,5,3202,3203,7,3262,3262,7,3264,3265,7,3267,3268,7,3271,3272,7,3276,3277,5,3298,3299,5,3330,3331,7,3390,3390,5,3393,3396,5,3402,3404,7,3406,3406,1,3426,3427,5,3458,3459,7,3535,3535,5,3538,3540,5,3544,3550,7,3570,3571,7,3635,3635,7,3655,3662,5,3763,3763,7,3784,3789,5,3893,3893,5,3897,3897,5,3953,3966,5,3968,3972,5,3981,3991,5,4038,4038,5,4145,4145,7,4153,4154,5,4157,4158,5,4184,4185,5,4209,4212,5,4228,4228,7,4237,4237,5,4352,4447,8,4520,4607,10,5906,5908,5,5938,5939,5,5970,5971,5,6068,6069,5,6071,6077,5,6086,6086,5,6089,6099,5,6155,6157,5,6159,6159,5,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6862,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7679,5,8204,8204,5,8206,8207,4,8233,8233,4,8252,8252,14,8288,8292,4,8294,8303,4,8413,8416,5,8418,8420,5,8482,8482,14,8596,8601,14,8986,8987,14,9096,9096,14,9193,9196,14,9199,9199,14,9201,9202,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9729,14,9732,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9775,9775,14,9784,9785,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9874,14,9876,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9934,14,9936,9936,14,9938,9938,14,9940,9940,14,9961,9961,14,9963,9967,14,9970,9971,14,9973,9973,14,9975,9977,14,9979,9980,14,9982,9985,14,9987,9988,14,9992,9996,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10083,14,10085,10087,14,10145,10145,14,10175,10175,14,11013,11015,14,11088,11088,14,11503,11505,5,11744,11775,5,12334,12335,5,12349,12349,14,12951,12951,14,42607,42607,5,42612,42621,5,42736,42737,5,43014,43014,5,43043,43044,7,43047,43047,7,43136,43137,7,43204,43205,5,43263,43263,5,43335,43345,5,43360,43388,8,43395,43395,7,43444,43445,7,43450,43451,7,43454,43456,7,43561,43566,5,43569,43570,5,43573,43574,5,43596,43596,5,43644,43644,5,43698,43700,5,43710,43711,5,43755,43755,7,43758,43759,7,43766,43766,5,44005,44005,5,44008,44008,5,44012,44012,7,44032,44032,11,44060,44060,11,44088,44088,11,44116,44116,11,44144,44144,11,44172,44172,11,44200,44200,11,44228,44228,11,44256,44256,11,44284,44284,11,44312,44312,11,44340,44340,11,44368,44368,11,44396,44396,11,44424,44424,11,44452,44452,11,44480,44480,11,44508,44508,11,44536,44536,11,44564,44564,11,44592,44592,11,44620,44620,11,44648,44648,11,44676,44676,11,44704,44704,11,44732,44732,11,44760,44760,11,44788,44788,11,44816,44816,11,44844,44844,11,44872,44872,11,44900,44900,11,44928,44928,11,44956,44956,11,44984,44984,11,45012,45012,11,45040,45040,11,45068,45068,11,45096,45096,11,45124,45124,11,45152,45152,11,45180,45180,11,45208,45208,11,45236,45236,11,45264,45264,11,45292,45292,11,45320,45320,11,45348,45348,11,45376,45376,11,45404,45404,11,45432,45432,11,45460,45460,11,45488,45488,11,45516,45516,11,45544,45544,11,45572,45572,11,45600,45600,11,45628,45628,11,45656,45656,11,45684,45684,11,45712,45712,11,45740,45740,11,45768,45768,11,45796,45796,11,45824,45824,11,45852,45852,11,45880,45880,11,45908,45908,11,45936,45936,11,45964,45964,11,45992,45992,11,46020,46020,11,46048,46048,11,46076,46076,11,46104,46104,11,46132,46132,11,46160,46160,11,46188,46188,11,46216,46216,11,46244,46244,11,46272,46272,11,46300,46300,11,46328,46328,11,46356,46356,11,46384,46384,11,46412,46412,11,46440,46440,11,46468,46468,11,46496,46496,11,46524,46524,11,46552,46552,11,46580,46580,11,46608,46608,11,46636,46636,11,46664,46664,11,46692,46692,11,46720,46720,11,46748,46748,11,46776,46776,11,46804,46804,11,46832,46832,11,46860,46860,11,46888,46888,11,46916,46916,11,46944,46944,11,46972,46972,11,47000,47000,11,47028,47028,11,47056,47056,11,47084,47084,11,47112,47112,11,47140,47140,11,47168,47168,11,47196,47196,11,47224,47224,11,47252,47252,11,47280,47280,11,47308,47308,11,47336,47336,11,47364,47364,11,47392,47392,11,47420,47420,11,47448,47448,11,47476,47476,11,47504,47504,11,47532,47532,11,47560,47560,11,47588,47588,11,47616,47616,11,47644,47644,11,47672,47672,11,47700,47700,11,47728,47728,11,47756,47756,11,47784,47784,11,47812,47812,11,47840,47840,11,47868,47868,11,47896,47896,11,47924,47924,11,47952,47952,11,47980,47980,11,48008,48008,11,48036,48036,11,48064,48064,11,48092,48092,11,48120,48120,11,48148,48148,11,48176,48176,11,48204,48204,11,48232,48232,11,48260,48260,11,48288,48288,11,48316,48316,11,48344,48344,11,48372,48372,11,48400,48400,11,48428,48428,11,48456,48456,11,48484,48484,11,48512,48512,11,48540,48540,11,48568,48568,11,48596,48596,11,48624,48624,11,48652,48652,11,48680,48680,11,48708,48708,11,48736,48736,11,48764,48764,11,48792,48792,11,48820,48820,11,48848,48848,11,48876,48876,11,48904,48904,11,48932,48932,11,48960,48960,11,48988,48988,11,49016,49016,11,49044,49044,11,49072,49072,11,49100,49100,11,49128,49128,11,49156,49156,11,49184,49184,11,49212,49212,11,49240,49240,11,49268,49268,11,49296,49296,11,49324,49324,11,49352,49352,11,49380,49380,11,49408,49408,11,49436,49436,11,49464,49464,11,49492,49492,11,49520,49520,11,49548,49548,11,49576,49576,11,49604,49604,11,49632,49632,11,49660,49660,11,49688,49688,11,49716,49716,11,49744,49744,11,49772,49772,11,49800,49800,11,49828,49828,11,49856,49856,11,49884,49884,11,49912,49912,11,49940,49940,11,49968,49968,11,49996,49996,11,50024,50024,11,50052,50052,11,50080,50080,11,50108,50108,11,50136,50136,11,50164,50164,11,50192,50192,11,50220,50220,11,50248,50248,11,50276,50276,11,50304,50304,11,50332,50332,11,50360,50360,11,50388,50388,11,50416,50416,11,50444,50444,11,50472,50472,11,50500,50500,11,50528,50528,11,50556,50556,11,50584,50584,11,50612,50612,11,50640,50640,11,50668,50668,11,50696,50696,11,50724,50724,11,50752,50752,11,50780,50780,11,50808,50808,11,50836,50836,11,50864,50864,11,50892,50892,11,50920,50920,11,50948,50948,11,50976,50976,11,51004,51004,11,51032,51032,11,51060,51060,11,51088,51088,11,51116,51116,11,51144,51144,11,51172,51172,11,51200,51200,11,51228,51228,11,51256,51256,11,51284,51284,11,51312,51312,11,51340,51340,11,51368,51368,11,51396,51396,11,51424,51424,11,51452,51452,11,51480,51480,11,51508,51508,11,51536,51536,11,51564,51564,11,51592,51592,11,51620,51620,11,51648,51648,11,51676,51676,11,51704,51704,11,51732,51732,11,51760,51760,11,51788,51788,11,51816,51816,11,51844,51844,11,51872,51872,11,51900,51900,11,51928,51928,11,51956,51956,11,51984,51984,11,52012,52012,11,52040,52040,11,52068,52068,11,52096,52096,11,52124,52124,11,52152,52152,11,52180,52180,11,52208,52208,11,52236,52236,11,52264,52264,11,52292,52292,11,52320,52320,11,52348,52348,11,52376,52376,11,52404,52404,11,52432,52432,11,52460,52460,11,52488,52488,11,52516,52516,11,52544,52544,11,52572,52572,11,52600,52600,11,52628,52628,11,52656,52656,11,52684,52684,11,52712,52712,11,52740,52740,11,52768,52768,11,52796,52796,11,52824,52824,11,52852,52852,11,52880,52880,11,52908,52908,11,52936,52936,11,52964,52964,11,52992,52992,11,53020,53020,11,53048,53048,11,53076,53076,11,53104,53104,11,53132,53132,11,53160,53160,11,53188,53188,11,53216,53216,11,53244,53244,11,53272,53272,11,53300,53300,11,53328,53328,11,53356,53356,11,53384,53384,11,53412,53412,11,53440,53440,11,53468,53468,11,53496,53496,11,53524,53524,11,53552,53552,11,53580,53580,11,53608,53608,11,53636,53636,11,53664,53664,11,53692,53692,11,53720,53720,11,53748,53748,11,53776,53776,11,53804,53804,11,53832,53832,11,53860,53860,11,53888,53888,11,53916,53916,11,53944,53944,11,53972,53972,11,54000,54000,11,54028,54028,11,54056,54056,11,54084,54084,11,54112,54112,11,54140,54140,11,54168,54168,11,54196,54196,11,54224,54224,11,54252,54252,11,54280,54280,11,54308,54308,11,54336,54336,11,54364,54364,11,54392,54392,11,54420,54420,11,54448,54448,11,54476,54476,11,54504,54504,11,54532,54532,11,54560,54560,11,54588,54588,11,54616,54616,11,54644,54644,11,54672,54672,11,54700,54700,11,54728,54728,11,54756,54756,11,54784,54784,11,54812,54812,11,54840,54840,11,54868,54868,11,54896,54896,11,54924,54924,11,54952,54952,11,54980,54980,11,55008,55008,11,55036,55036,11,55064,55064,11,55092,55092,11,55120,55120,11,55148,55148,11,55176,55176,11,55216,55238,9,64286,64286,5,65056,65071,5,65438,65439,5,65529,65531,4,66272,66272,5,68097,68099,5,68108,68111,5,68159,68159,5,68900,68903,5,69446,69456,5,69632,69632,7,69634,69634,7,69744,69744,5,69759,69761,5,69808,69810,7,69815,69816,7,69821,69821,1,69837,69837,1,69927,69931,5,69933,69940,5,70003,70003,5,70018,70018,7,70070,70078,5,70082,70083,1,70094,70094,7,70188,70190,7,70194,70195,7,70197,70197,7,70206,70206,5,70368,70370,7,70400,70401,5,70459,70460,5,70463,70463,7,70465,70468,7,70475,70477,7,70498,70499,7,70512,70516,5,70712,70719,5,70722,70724,5,70726,70726,5,70832,70832,5,70835,70840,5,70842,70842,5,70845,70845,5,70847,70848,5,70850,70851,5,71088,71089,7,71096,71099,7,71102,71102,7,71132,71133,5,71219,71226,5,71229,71229,5,71231,71232,5,71340,71340,7,71342,71343,7,71350,71350,7,71453,71455,5,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,118528,118573,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123566,123566,5,125136,125142,5,126976,126979,14,126981,127182,14,127184,127231,14,127279,127279,14,127344,127345,14,127374,127374,14,127405,127461,14,127489,127490,14,127514,127514,14,127538,127546,14,127561,127567,14,127570,127743,14,127757,127758,14,127760,127760,14,127762,127762,14,127766,127768,14,127770,127770,14,127772,127772,14,127775,127776,14,127778,127779,14,127789,127791,14,127794,127795,14,127798,127798,14,127819,127819,14,127824,127824,14,127868,127868,14,127870,127871,14,127892,127893,14,127896,127896,14,127900,127901,14,127904,127940,14,127942,127942,14,127944,127944,14,127946,127946,14,127951,127955,14,127968,127971,14,127973,127984,14,127987,127987,14,127989,127989,14,127991,127991,14,127995,127999,5,128008,128008,14,128012,128014,14,128017,128018,14,128020,128020,14,128022,128022,14,128042,128042,14,128063,128063,14,128065,128065,14,128101,128101,14,128108,128109,14,128173,128173,14,128182,128183,14,128236,128237,14,128239,128239,14,128245,128245,14,128248,128248,14,128253,128253,14,128255,128258,14,128260,128263,14,128265,128265,14,128277,128277,14,128300,128301,14,128326,128328,14,128331,128334,14,128336,128347,14,128360,128366,14,128369,128370,14,128378,128378,14,128391,128391,14,128394,128397,14,128400,128400,14,128405,128406,14,128420,128420,14,128422,128423,14,128425,128432,14,128435,128443,14,128445,128449,14,128453,128464,14,128468,128475,14,128479,128480,14,128482,128482,14,128484,128487,14,128489,128494,14,128496,128498,14,128500,128505,14,128507,128511,14,128513,128518,14,128521,128525,14,128527,128527,14,128529,128529,14,128533,128533,14,128535,128535,14,128537,128537,14]")}function z(ee,le){if(ee===0)return 0;const ue=H(ee,le);if(ue!==void 0)return ue;const ce=new B(le,ee);return ce.prevCodePoint(),ce.offset}e.getLeftDeleteOffset=z;function H(ee,le){const ue=new B(le,ee);let ce=ue.prevCodePoint();for(;Y(ce)||ce===65039||ce===8419;){if(ue.offset===0)return;ce=ue.prevCodePoint()}if(!re(ce))return;let pe=ue.offset;return pe>0&&ue.prevCodePoint()===8205&&(pe=ue.offset),pe}function Y(ee){return 127995<=ee&&ee<=127999}e.noBreakWhitespace="\xA0";class j{static getInstance(le){return y.cache.get(Array.from(le))}static getLocales(){return y._locales.value}constructor(le){this.confusableDictionary=le}isAmbiguous(le){return this.confusableDictionary.has(le)}getPrimaryConfusable(le){return this.confusableDictionary.get(le)}getConfusableCodePoints(){return new Set(this.confusableDictionary.keys())}}e.AmbiguousCharacters=j,y=j,j.ambiguousCharacterData=new k.Lazy(()=>JSON.parse('{"_common":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,8218,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,8242,96,1370,96,1523,96,8175,96,65344,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71922,67,71913,67,65315,67,8557,67,8450,67,8493,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71919,87,71910,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,66293,90,71909,90,65338,90,8484,90,8488,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65297,49,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125,119846,109],"_default":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"cs":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"de":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"es":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"fr":[65374,126,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"it":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ja":[8211,45,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65292,44,65307,59],"ko":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pl":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pt-BR":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"qps-ploc":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ru":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"tr":[160,32,8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"zh-hans":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41],"zh-hant":[8211,45,65374,126,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65307,59]}')),j.cache=new L.LRUCachedFunction(ee=>{function le(Ee){const Ae=new Map;for(let xe=0;xe<Ee.length;xe+=2)Ae.set(Ee[xe],Ee[xe+1]);return Ae}function ue(Ee,Ae){const xe=new Map(Ee);for(const[Be,De]of Ae)xe.set(Be,De);return xe}function ce(Ee,Ae){if(!Ee)return Ae;const xe=new Map;for(const[Be,De]of Ee)Ae.has(Be)&&xe.set(Be,De);return xe}const pe=y.ambiguousCharacterData.value;let ve=ee.filter(Ee=>!Ee.startsWith("_")&&Ee in pe);ve.length===0&&(ve=["_default"]);let Ce;for(const Ee of ve){const Ae=le(pe[Ee]);Ce=ce(Ce,Ae)}const Se=le(pe._common),_e=ue(Se,Ce);return new y(_e)}),j._locales=new k.Lazy(()=>Object.keys(y.ambiguousCharacterData.value).filter(ee=>!ee.startsWith("_")));class Z{static getRawData(){return JSON.parse("[9,10,11,12,13,32,127,160,173,847,1564,4447,4448,6068,6069,6155,6156,6157,6158,7355,7356,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8234,8235,8236,8237,8238,8239,8287,8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,10240,12288,12644,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65279,65440,65520,65521,65522,65523,65524,65525,65526,65527,65528,65532,78844,119155,119156,119157,119158,119159,119160,119161,119162,917504,917505,917506,917507,917508,917509,917510,917511,917512,917513,917514,917515,917516,917517,917518,917519,917520,917521,917522,917523,917524,917525,917526,917527,917528,917529,917530,917531,917532,917533,917534,917535,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999]")}static getData(){return this._data||(this._data=new Set(Z.getRawData())),this._data}static isInvisibleCharacter(le){return Z.getData().has(le)}static get codePoints(){return Z.getData()}}e.InvisibleCharacters=Z,Z._data=void 0}),define(se[71],oe([1,0,53,401,11]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.fuzzyScoreGracefulAggressive=e.fuzzyScore=e.FuzzyScoreOptions=e.FuzzyScore=e.isPatternInWord=e.createMatches=e.anyScore=e.matchesFuzzy2=e.matchesFuzzy=e.matchesWords=e.matchesCamelCase=e.isUpper=e.matchesSubString=e.matchesContiguousSubString=e.matchesPrefix=e.matchesStrictPrefix=e.or=void 0;function E(...Z){return function(ee,le){for(let ue=0,ce=Z.length;ue<ce;ue++){const pe=Z[ue](ee,le);if(pe)return pe}return null}}e.or=E,e.matchesStrictPrefix=S.bind(void 0,!1),e.matchesPrefix=S.bind(void 0,!0);function S(Z,ee,le){if(!le||le.length<ee.length)return null;let ue;return Z?ue=y.startsWithIgnoreCase(le,ee):ue=le.indexOf(ee)===0,ue?ee.length>0?[{start:0,end:ee.length}]:[]:null}function p(Z,ee){const le=ee.toLowerCase().indexOf(Z.toLowerCase());return le===-1?null:[{start:le,end:le+Z.length}]}e.matchesContiguousSubString=p;function _(Z,ee){return v(Z.toLowerCase(),ee.toLowerCase(),0,0)}e.matchesSubString=_;function v(Z,ee,le,ue){if(le===Z.length)return[];if(ue===ee.length)return null;if(Z[le]===ee[ue]){let ce=null;return(ce=v(Z,ee,le+1,ue+1))?s({start:ue,end:ue+1},ce):null}return v(Z,ee,le,ue+1)}function b(Z){return 97<=Z&&Z<=122}function a(Z){return 65<=Z&&Z<=90}e.isUpper=a;function i(Z){return 48<=Z&&Z<=57}function n(Z){return Z===32||Z===9||Z===10||Z===13}const t=new Set;"()[]{}<>`'\"-/;:,.?!".split("").forEach(Z=>t.add(Z.charCodeAt(0)));function r(Z){return n(Z)||t.has(Z)}function u(Z,ee){return Z===ee||r(Z)&&r(ee)}const f=new Map;function c(Z){if(f.has(Z))return f.get(Z);let ee;const le=(0,k.getKoreanAltChars)(Z);return le&&(ee=le),f.set(Z,ee),ee}function d(Z){return b(Z)||a(Z)||i(Z)}function s(Z,ee){return ee.length===0?ee=[Z]:Z.end===ee[0].start?ee[0].start=Z.start:ee.unshift(Z),ee}function l(Z,ee){for(let le=ee;le<Z.length;le++){const ue=Z.charCodeAt(le);if(a(ue)||i(ue)||le>0&&!d(Z.charCodeAt(le-1)))return le}return Z.length}function o(Z,ee,le,ue){if(le===Z.length)return[];if(ue===ee.length)return null;if(Z[le]!==ee[ue].toLowerCase())return null;{let ce=null,pe=ue+1;for(ce=o(Z,ee,le+1,ue+1);!ce&&(pe=l(ee,pe))<ee.length;)ce=o(Z,ee,le+1,pe),pe++;return ce===null?null:s({start:ue,end:ue+1},ce)}}function g(Z){let ee=0,le=0,ue=0,ce=0,pe=0;for(let Ee=0;Ee<Z.length;Ee++)pe=Z.charCodeAt(Ee),a(pe)&&ee++,b(pe)&&le++,d(pe)&&ue++,i(pe)&&ce++;const ve=ee/Z.length,Ce=le/Z.length,Se=ue/Z.length,_e=ce/Z.length;return{upperPercent:ve,lowerPercent:Ce,alphaPercent:Se,numericPercent:_e}}function h(Z){const{upperPercent:ee,lowerPercent:le}=Z;return le===0&&ee>.6}function m(Z){const{upperPercent:ee,lowerPercent:le,alphaPercent:ue,numericPercent:ce}=Z;return le>.2&&ee<.8&&ue>.6&&ce<.2}function C(Z){let ee=0,le=0,ue=0,ce=0;for(let pe=0;pe<Z.length;pe++)ue=Z.charCodeAt(pe),a(ue)&&ee++,b(ue)&&le++,n(ue)&&ce++;return(ee===0||le===0)&&ce===0?Z.length<=30:ee<=5}function w(Z,ee){if(!ee||(ee=ee.trim(),ee.length===0)||!C(Z)||ee.length>60)return null;const le=g(ee);if(!m(le)){if(!h(le))return null;ee=ee.toLowerCase()}let ue=null,ce=0;for(Z=Z.toLowerCase();ce<ee.length&&(ue=o(Z,ee,0,ce))===null;)ce=l(ee,ce+1);return ue}e.matchesCamelCase=w;function D(Z,ee,le=!1){if(!ee||ee.length===0)return null;let ue=null,ce=0;for(Z=Z.toLowerCase(),ee=ee.toLowerCase();ce<ee.length&&(ue=I(Z,ee,0,ce,le),ue===null);)ce=T(ee,ce+1);return ue}e.matchesWords=D;function I(Z,ee,le,ue,ce){let pe=0;if(le===Z.length)return[];if(ue===ee.length)return null;if(!u(Z.charCodeAt(le),ee.charCodeAt(ue))){const Se=c(Z.charCodeAt(le));if(!Se)return null;for(let _e=0;_e<Se.length;_e++)if(!u(Se[_e],ee.charCodeAt(ue+_e)))return null;pe+=Se.length-1}let ve=null,Ce=ue+pe+1;if(ve=I(Z,ee,le+1,Ce,ce),!ce)for(;!ve&&(Ce=T(ee,Ce))<ee.length;)ve=I(Z,ee,le+1,Ce,ce),Ce++;if(!ve)return null;if(Z.charCodeAt(le)!==ee.charCodeAt(ue)){const Se=c(Z.charCodeAt(le));if(!Se)return ve;for(let _e=0;_e<Se.length;_e++)if(Se[_e]!==ee.charCodeAt(ue+_e))return ve}return s({start:ue,end:ue+pe+1},ve)}function T(Z,ee){for(let le=ee;le<Z.length;le++)if(r(Z.charCodeAt(le))||le>0&&r(Z.charCodeAt(le-1)))return le;return Z.length}const A=E(e.matchesPrefix,w,p),P=E(e.matchesPrefix,w,_),N=new L.LRUCache(1e4);function M(Z,ee,le=!1){if(typeof Z!="string"||typeof ee!="string")return null;let ue=N.get(Z);ue||(ue=new RegExp(y.convertSimple2RegExpPattern(Z),"i"),N.set(Z,ue));const ce=ue.exec(ee);return ce?[{start:ce.index,end:ce.index+ce[0].length}]:le?P(Z,ee):A(Z,ee)}e.matchesFuzzy=M;function R(Z,ee){const le=U(Z,Z.toLowerCase(),0,ee,ee.toLowerCase(),0,{firstMatchCanBeWeak:!0,boostFullMatch:!0});return le?O(le):null}e.matchesFuzzy2=R;function x(Z,ee,le,ue,ce,pe){const ve=Math.min(13,Z.length);for(;le<ve;le++){const Ce=U(Z,ee,le,ue,ce,pe,{firstMatchCanBeWeak:!0,boostFullMatch:!0});if(Ce)return Ce}return[0,pe]}e.anyScore=x;function O(Z){if(typeof Z>"u")return[];const ee=[],le=Z[1];for(let ue=Z.length-1;ue>1;ue--){const ce=Z[ue]+le,pe=ee[ee.length-1];pe&&pe.end===ce?pe.end=ce+1:ee.push({start:ce,end:ce+1})}return ee}e.createMatches=O;const B=128;function W(){const Z=[],ee=[];for(let le=0;le<=B;le++)ee[le]=0;for(let le=0;le<=B;le++)Z.push(ee.slice(0));return Z}function V(Z){const ee=[];for(let le=0;le<=Z;le++)ee[le]=0;return ee}const K=V(2*B),F=V(2*B),q=W(),ie=W(),ae=W(),ne=!1;function $(Z,ee,le,ue,ce){function pe(Ce,Se,_e=" "){for(;Ce.length<Se;)Ce=_e+Ce;return Ce}let ve=` |   |${ue.split("").map(Ce=>pe(Ce,3)).join("|")}
+`;for(let Ce=0;Ce<=le;Ce++)Ce===0?ve+=" |":ve+=`${ee[Ce-1]}|`,ve+=Z[Ce].slice(0,ce+1).map(Se=>pe(Se.toString(),3)).join("|")+`
+`;return ve}function J(Z,ee,le,ue){Z=Z.substr(ee),le=le.substr(ue),console.log($(ie,Z,Z.length,le,le.length)),console.log($(ae,Z,Z.length,le,le.length)),console.log($(q,Z,Z.length,le,le.length))}function Q(Z,ee){if(ee<0||ee>=Z.length)return!1;const le=Z.codePointAt(ee);switch(le){case 95:case 45:case 46:case 32:case 47:case 92:case 39:case 34:case 58:case 36:case 60:case 62:case 40:case 41:case 91:case 93:case 123:case 125:return!0;case void 0:return!1;default:return!!y.isEmojiImprecise(le)}}function re(Z,ee){if(ee<0||ee>=Z.length)return!1;switch(Z.charCodeAt(ee)){case 32:case 9:return!0;default:return!1}}function de(Z,ee,le){return ee[Z]!==le[Z]}function he(Z,ee,le,ue,ce,pe,ve=!1){for(;ee<le&&ce<pe;)Z[ee]===ue[ce]&&(ve&&(K[ee]=ce),ee+=1),ce+=1;return ee===le}e.isPatternInWord=he;var me;(function(Z){Z.Default=[-100,0];function ee(le){return!le||le.length===2&&le[0]===-100&&le[1]===0}Z.isDefault=ee})(me||(e.FuzzyScore=me={}));class X{constructor(ee,le){this.firstMatchCanBeWeak=ee,this.boostFullMatch=le}}e.FuzzyScoreOptions=X,X.default={boostFullMatch:!0,firstMatchCanBeWeak:!1};function U(Z,ee,le,ue,ce,pe,ve=X.default){const Ce=Z.length>B?B:Z.length,Se=ue.length>B?B:ue.length;if(le>=Ce||pe>=Se||Ce-le>Se-pe||!he(ee,le,Ce,ce,pe,Se,!0))return;G(Ce,Se,le,pe,ee,ce);let _e=1,Ee=1,Ae=le,xe=pe;const Be=[!1];for(_e=1,Ae=le;Ae<Ce;_e++,Ae++){const Ne=K[Ae],Pe=F[Ae],ze=Ae+1<Ce?F[Ae+1]:Se;for(Ee=Ne-pe+1,xe=Ne;xe<ze;Ee++,xe++){let Ke=Number.MIN_SAFE_INTEGER,je=!1;xe<=Pe&&(Ke=z(Z,ee,Ae,le,ue,ce,xe,Se,pe,q[_e-1][Ee-1]===0,Be));let Je=0;Ke!==Number.MAX_SAFE_INTEGER&&(je=!0,Je=Ke+ie[_e-1][Ee-1]);const rt=xe>Ne,et=rt?ie[_e][Ee-1]+(q[_e][Ee-1]>0?-5:0):0,st=xe>Ne+1&&q[_e][Ee-1]>0,Qe=st?ie[_e][Ee-2]+(q[_e][Ee-2]>0?-5:0):0;if(st&&(!rt||Qe>=et)&&(!je||Qe>=Je))ie[_e][Ee]=Qe,ae[_e][Ee]=3,q[_e][Ee]=0;else if(rt&&(!je||et>=Je))ie[_e][Ee]=et,ae[_e][Ee]=2,q[_e][Ee]=0;else if(je)ie[_e][Ee]=Je,ae[_e][Ee]=1,q[_e][Ee]=q[_e-1][Ee-1]+1;else throw new Error("not possible")}}if(ne&&J(Z,le,ue,pe),!Be[0]&&!ve.firstMatchCanBeWeak)return;_e--,Ee--;const De=[ie[_e][Ee],pe];let Ie=0,fe=0;for(;_e>=1;){let Ne=Ee;do{const Pe=ae[_e][Ne];if(Pe===3)Ne=Ne-2;else if(Pe===2)Ne=Ne-1;else break}while(Ne>=1);Ie>1&&ee[le+_e-1]===ce[pe+Ee-1]&&!de(Ne+pe-1,ue,ce)&&Ie+1>q[_e][Ne]&&(Ne=Ee),Ne===Ee?Ie++:Ie=1,fe||(fe=Ne),_e--,Ee=Ne-1,De.push(Ee)}Se===Ce&&ve.boostFullMatch&&(De[0]+=2);const be=fe-Ce;return De[0]-=be,De}e.fuzzyScore=U;function G(Z,ee,le,ue,ce,pe){let ve=Z-1,Ce=ee-1;for(;ve>=le&&Ce>=ue;)ce[ve]===pe[Ce]&&(F[ve]=Ce,ve--),Ce--}function z(Z,ee,le,ue,ce,pe,ve,Ce,Se,_e,Ee){if(ee[le]!==pe[ve])return Number.MIN_SAFE_INTEGER;let Ae=1,xe=!1;return ve===le-ue?Ae=Z[le]===ce[ve]?7:5:de(ve,ce,pe)&&(ve===0||!de(ve-1,ce,pe))?(Ae=Z[le]===ce[ve]?7:5,xe=!0):Q(pe,ve)&&(ve===0||!Q(pe,ve-1))?Ae=5:(Q(pe,ve-1)||re(pe,ve-1))&&(Ae=5,xe=!0),Ae>1&&le===ue&&(Ee[0]=!0),xe||(xe=de(ve,ce,pe)||Q(pe,ve-1)||re(pe,ve-1)),le===ue?ve>Se&&(Ae-=xe?3:5):_e?Ae+=xe?2:0:Ae+=xe?0:1,ve+1===Ce&&(Ae-=xe?3:5),Ae}function H(Z,ee,le,ue,ce,pe,ve){return Y(Z,ee,le,ue,ce,pe,!0,ve)}e.fuzzyScoreGracefulAggressive=H;function Y(Z,ee,le,ue,ce,pe,ve,Ce){let Se=U(Z,ee,le,ue,ce,pe,Ce);if(Se&&!ve)return Se;if(Z.length>=3){const _e=Math.min(7,Z.length-1);for(let Ee=le+1;Ee<_e;Ee++){const Ae=j(Z,Ee);if(Ae){const xe=U(Ae,Ae.toLowerCase(),le,ue,ce,pe,Ce);xe&&(xe[0]-=3,(!Se||xe[0]>Se[0])&&(Se=xe))}}}return Se}function j(Z,ee){if(ee+1>=Z.length)return;const le=Z[ee],ue=Z[ee+1];if(le!==ue)return Z.slice(0,ee)+ue+le+Z.slice(ee+2)}}),define(se[111],oe([1,0,11]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StringSHA1=e.toHexString=e.stringHash=e.numberHash=e.doHash=e.hash=void 0;function k(r){return y(r,0)}e.hash=k;function y(r,u){switch(typeof r){case"object":return r===null?E(349,u):Array.isArray(r)?_(r,u):v(r,u);case"string":return p(r,u);case"boolean":return S(r,u);case"number":return E(r,u);case"undefined":return E(937,u);default:return E(617,u)}}e.doHash=y;function E(r,u){return(u<<5)-u+r|0}e.numberHash=E;function S(r,u){return E(r?433:863,u)}function p(r,u){u=E(149417,u);for(let f=0,c=r.length;f<c;f++)u=E(r.charCodeAt(f),u);return u}e.stringHash=p;function _(r,u){return u=E(104579,u),r.reduce((f,c)=>y(c,f),u)}function v(r,u){return u=E(181387,u),Object.keys(r).sort().reduce((f,c)=>(f=p(c,f),y(r[c],f)),u)}function b(r,u,f=32){const c=f-u,d=~((1<<c)-1);return(r<<u|(d&r)>>>c)>>>0}function a(r,u=0,f=r.byteLength,c=0){for(let d=0;d<f;d++)r[u+d]=c}function i(r,u,f="0"){for(;r.length<u;)r=f+r;return r}function n(r,u=32){return r instanceof ArrayBuffer?Array.from(new Uint8Array(r)).map(f=>f.toString(16).padStart(2,"0")).join(""):i((r>>>0).toString(16),u/4)}e.toHexString=n;class t{constructor(){this._h0=1732584193,this._h1=4023233417,this._h2=2562383102,this._h3=271733878,this._h4=3285377520,this._buff=new Uint8Array(64+3),this._buffDV=new DataView(this._buff.buffer),this._buffLen=0,this._totalLen=0,this._leftoverHighSurrogate=0,this._finished=!1}update(u){const f=u.length;if(f===0)return;const c=this._buff;let d=this._buffLen,s=this._leftoverHighSurrogate,l,o;for(s!==0?(l=s,o=-1,s=0):(l=u.charCodeAt(0),o=0);;){let g=l;if(L.isHighSurrogate(l))if(o+1<f){const h=u.charCodeAt(o+1);L.isLowSurrogate(h)?(o++,g=L.computeCodePoint(l,h)):g=65533}else{s=l;break}else L.isLowSurrogate(l)&&(g=65533);if(d=this._push(c,d,g),o++,o<f)l=u.charCodeAt(o);else break}this._buffLen=d,this._leftoverHighSurrogate=s}_push(u,f,c){return c<128?u[f++]=c:c<2048?(u[f++]=192|(c&1984)>>>6,u[f++]=128|(c&63)>>>0):c<65536?(u[f++]=224|(c&61440)>>>12,u[f++]=128|(c&4032)>>>6,u[f++]=128|(c&63)>>>0):(u[f++]=240|(c&1835008)>>>18,u[f++]=128|(c&258048)>>>12,u[f++]=128|(c&4032)>>>6,u[f++]=128|(c&63)>>>0),f>=64&&(this._step(),f-=64,this._totalLen+=64,u[0]=u[64+0],u[1]=u[64+1],u[2]=u[64+2]),f}digest(){return this._finished||(this._finished=!0,this._leftoverHighSurrogate&&(this._leftoverHighSurrogate=0,this._buffLen=this._push(this._buff,this._buffLen,65533)),this._totalLen+=this._buffLen,this._wrapUp()),n(this._h0)+n(this._h1)+n(this._h2)+n(this._h3)+n(this._h4)}_wrapUp(){this._buff[this._buffLen++]=128,a(this._buff,this._buffLen),this._buffLen>56&&(this._step(),a(this._buff));const u=8*this._totalLen;this._buffDV.setUint32(56,Math.floor(u/4294967296),!1),this._buffDV.setUint32(60,u%4294967296,!1),this._step()}_step(){const u=t._bigBlock32,f=this._buffDV;for(let C=0;C<64;C+=4)u.setUint32(C,f.getUint32(C,!1),!1);for(let C=64;C<320;C+=4)u.setUint32(C,b(u.getUint32(C-12,!1)^u.getUint32(C-32,!1)^u.getUint32(C-56,!1)^u.getUint32(C-64,!1),1),!1);let c=this._h0,d=this._h1,s=this._h2,l=this._h3,o=this._h4,g,h,m;for(let C=0;C<80;C++)C<20?(g=d&s|~d&l,h=1518500249):C<40?(g=d^s^l,h=1859775393):C<60?(g=d&s|d&l|s&l,h=2400959708):(g=d^s^l,h=3395469782),m=b(c,5)+g+o+h+u.getUint32(C*4,!1)&4294967295,o=l,l=s,s=b(d,30),d=c,c=m;this._h0=this._h0+c&4294967295,this._h1=this._h1+d&4294967295,this._h2=this._h2+s&4294967295,this._h3=this._h3+l&4294967295,this._h4=this._h4+o&4294967295}}e.StringSHA1=t,t._bigBlock32=new DataView(new ArrayBuffer(320))}),define(se[173],oe([1,0,397,111]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LcsDiff=e.stringDiff=e.StringDiffSequence=void 0;class y{constructor(a){this.source=a}getElements(){const a=this.source,i=new Int32Array(a.length);for(let n=0,t=a.length;n<t;n++)i[n]=a.charCodeAt(n);return i}}e.StringDiffSequence=y;function E(b,a,i){return new v(new y(b),new y(a)).ComputeDiff(i).changes}e.stringDiff=E;class S{static Assert(a,i){if(!a)throw new Error(i)}}class p{static Copy(a,i,n,t,r){for(let u=0;u<r;u++)n[t+u]=a[i+u]}static Copy2(a,i,n,t,r){for(let u=0;u<r;u++)n[t+u]=a[i+u]}}class _{constructor(){this.m_changes=[],this.m_originalStart=1073741824,this.m_modifiedStart=1073741824,this.m_originalCount=0,this.m_modifiedCount=0}MarkNextChange(){(this.m_originalCount>0||this.m_modifiedCount>0)&&this.m_changes.push(new L.DiffChange(this.m_originalStart,this.m_originalCount,this.m_modifiedStart,this.m_modifiedCount)),this.m_originalCount=0,this.m_modifiedCount=0,this.m_originalStart=1073741824,this.m_modifiedStart=1073741824}AddOriginalElement(a,i){this.m_originalStart=Math.min(this.m_originalStart,a),this.m_modifiedStart=Math.min(this.m_modifiedStart,i),this.m_originalCount++}AddModifiedElement(a,i){this.m_originalStart=Math.min(this.m_originalStart,a),this.m_modifiedStart=Math.min(this.m_modifiedStart,i),this.m_modifiedCount++}getChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes}getReverseChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes.reverse(),this.m_changes}}class v{constructor(a,i,n=null){this.ContinueProcessingPredicate=n,this._originalSequence=a,this._modifiedSequence=i;const[t,r,u]=v._getElements(a),[f,c,d]=v._getElements(i);this._hasStrings=u&&d,this._originalStringElements=t,this._originalElementsOrHash=r,this._modifiedStringElements=f,this._modifiedElementsOrHash=c,this.m_forwardHistory=[],this.m_reverseHistory=[]}static _isStringArray(a){return a.length>0&&typeof a[0]=="string"}static _getElements(a){const i=a.getElements();if(v._isStringArray(i)){const n=new Int32Array(i.length);for(let t=0,r=i.length;t<r;t++)n[t]=(0,k.stringHash)(i[t],0);return[i,n,!0]}return i instanceof Int32Array?[[],i,!1]:[[],new Int32Array(i),!1]}ElementsAreEqual(a,i){return this._originalElementsOrHash[a]!==this._modifiedElementsOrHash[i]?!1:this._hasStrings?this._originalStringElements[a]===this._modifiedStringElements[i]:!0}ElementsAreStrictEqual(a,i){if(!this.ElementsAreEqual(a,i))return!1;const n=v._getStrictElement(this._originalSequence,a),t=v._getStrictElement(this._modifiedSequence,i);return n===t}static _getStrictElement(a,i){return typeof a.getStrictElement=="function"?a.getStrictElement(i):null}OriginalElementsAreEqual(a,i){return this._originalElementsOrHash[a]!==this._originalElementsOrHash[i]?!1:this._hasStrings?this._originalStringElements[a]===this._originalStringElements[i]:!0}ModifiedElementsAreEqual(a,i){return this._modifiedElementsOrHash[a]!==this._modifiedElementsOrHash[i]?!1:this._hasStrings?this._modifiedStringElements[a]===this._modifiedStringElements[i]:!0}ComputeDiff(a){return this._ComputeDiff(0,this._originalElementsOrHash.length-1,0,this._modifiedElementsOrHash.length-1,a)}_ComputeDiff(a,i,n,t,r){const u=[!1];let f=this.ComputeDiffRecursive(a,i,n,t,u);return r&&(f=this.PrettifyChanges(f)),{quitEarly:u[0],changes:f}}ComputeDiffRecursive(a,i,n,t,r){for(r[0]=!1;a<=i&&n<=t&&this.ElementsAreEqual(a,n);)a++,n++;for(;i>=a&&t>=n&&this.ElementsAreEqual(i,t);)i--,t--;if(a>i||n>t){let l;return n<=t?(S.Assert(a===i+1,"originalStart should only be one more than originalEnd"),l=[new L.DiffChange(a,0,n,t-n+1)]):a<=i?(S.Assert(n===t+1,"modifiedStart should only be one more than modifiedEnd"),l=[new L.DiffChange(a,i-a+1,n,0)]):(S.Assert(a===i+1,"originalStart should only be one more than originalEnd"),S.Assert(n===t+1,"modifiedStart should only be one more than modifiedEnd"),l=[]),l}const u=[0],f=[0],c=this.ComputeRecursionPoint(a,i,n,t,u,f,r),d=u[0],s=f[0];if(c!==null)return c;if(!r[0]){const l=this.ComputeDiffRecursive(a,d,n,s,r);let o=[];return r[0]?o=[new L.DiffChange(d+1,i-(d+1)+1,s+1,t-(s+1)+1)]:o=this.ComputeDiffRecursive(d+1,i,s+1,t,r),this.ConcatenateChanges(l,o)}return[new L.DiffChange(a,i-a+1,n,t-n+1)]}WALKTRACE(a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w,D){let I=null,T=null,A=new _,P=i,N=n,M=g[0]-C[0]-t,R=-1073741824,x=this.m_forwardHistory.length-1;do{const O=M+a;O===P||O<N&&d[O-1]<d[O+1]?(l=d[O+1],h=l-M-t,l<R&&A.MarkNextChange(),R=l,A.AddModifiedElement(l+1,h),M=O+1-a):(l=d[O-1]+1,h=l-M-t,l<R&&A.MarkNextChange(),R=l-1,A.AddOriginalElement(l,h+1),M=O-1-a),x>=0&&(d=this.m_forwardHistory[x],a=d[0],P=1,N=d.length-1)}while(--x>=-1);if(I=A.getReverseChanges(),D[0]){let O=g[0]+1,B=C[0]+1;if(I!==null&&I.length>0){const W=I[I.length-1];O=Math.max(O,W.getOriginalEnd()),B=Math.max(B,W.getModifiedEnd())}T=[new L.DiffChange(O,o-O+1,B,m-B+1)]}else{A=new _,P=u,N=f,M=g[0]-C[0]-c,R=1073741824,x=w?this.m_reverseHistory.length-1:this.m_reverseHistory.length-2;do{const O=M+r;O===P||O<N&&s[O-1]>=s[O+1]?(l=s[O+1]-1,h=l-M-c,l>R&&A.MarkNextChange(),R=l+1,A.AddOriginalElement(l+1,h+1),M=O+1-r):(l=s[O-1],h=l-M-c,l>R&&A.MarkNextChange(),R=l,A.AddModifiedElement(l+1,h+1),M=O-1-r),x>=0&&(s=this.m_reverseHistory[x],r=s[0],P=1,N=s.length-1)}while(--x>=-1);T=A.getChanges()}return this.ConcatenateChanges(I,T)}ComputeRecursionPoint(a,i,n,t,r,u,f){let c=0,d=0,s=0,l=0,o=0,g=0;a--,n--,r[0]=0,u[0]=0,this.m_forwardHistory=[],this.m_reverseHistory=[];const h=i-a+(t-n),m=h+1,C=new Int32Array(m),w=new Int32Array(m),D=t-n,I=i-a,T=a-n,A=i-t,N=(I-D)%2===0;C[D]=a,w[I]=i,f[0]=!1;for(let M=1;M<=h/2+1;M++){let R=0,x=0;s=this.ClipDiagonalBound(D-M,M,D,m),l=this.ClipDiagonalBound(D+M,M,D,m);for(let B=s;B<=l;B+=2){B===s||B<l&&C[B-1]<C[B+1]?c=C[B+1]:c=C[B-1]+1,d=c-(B-D)-T;const W=c;for(;c<i&&d<t&&this.ElementsAreEqual(c+1,d+1);)c++,d++;if(C[B]=c,c+d>R+x&&(R=c,x=d),!N&&Math.abs(B-I)<=M-1&&c>=w[B])return r[0]=c,u[0]=d,W<=w[B]&&1447>0&&M<=1447+1?this.WALKTRACE(D,s,l,T,I,o,g,A,C,w,c,i,r,d,t,u,N,f):null}const O=(R-a+(x-n)-M)/2;if(this.ContinueProcessingPredicate!==null&&!this.ContinueProcessingPredicate(R,O))return f[0]=!0,r[0]=R,u[0]=x,O>0&&1447>0&&M<=1447+1?this.WALKTRACE(D,s,l,T,I,o,g,A,C,w,c,i,r,d,t,u,N,f):(a++,n++,[new L.DiffChange(a,i-a+1,n,t-n+1)]);o=this.ClipDiagonalBound(I-M,M,I,m),g=this.ClipDiagonalBound(I+M,M,I,m);for(let B=o;B<=g;B+=2){B===o||B<g&&w[B-1]>=w[B+1]?c=w[B+1]-1:c=w[B-1],d=c-(B-I)-A;const W=c;for(;c>a&&d>n&&this.ElementsAreEqual(c,d);)c--,d--;if(w[B]=c,N&&Math.abs(B-D)<=M&&c<=C[B])return r[0]=c,u[0]=d,W>=C[B]&&1447>0&&M<=1447+1?this.WALKTRACE(D,s,l,T,I,o,g,A,C,w,c,i,r,d,t,u,N,f):null}if(M<=1447){let B=new Int32Array(l-s+2);B[0]=D-s+1,p.Copy2(C,s,B,1,l-s+1),this.m_forwardHistory.push(B),B=new Int32Array(g-o+2),B[0]=I-o+1,p.Copy2(w,o,B,1,g-o+1),this.m_reverseHistory.push(B)}}return this.WALKTRACE(D,s,l,T,I,o,g,A,C,w,c,i,r,d,t,u,N,f)}PrettifyChanges(a){for(let i=0;i<a.length;i++){const n=a[i],t=i<a.length-1?a[i+1].originalStart:this._originalElementsOrHash.length,r=i<a.length-1?a[i+1].modifiedStart:this._modifiedElementsOrHash.length,u=n.originalLength>0,f=n.modifiedLength>0;for(;n.originalStart+n.originalLength<t&&n.modifiedStart+n.modifiedLength<r&&(!u||this.OriginalElementsAreEqual(n.originalStart,n.originalStart+n.originalLength))&&(!f||this.ModifiedElementsAreEqual(n.modifiedStart,n.modifiedStart+n.modifiedLength));){const d=this.ElementsAreStrictEqual(n.originalStart,n.modifiedStart);if(this.ElementsAreStrictEqual(n.originalStart+n.originalLength,n.modifiedStart+n.modifiedLength)&&!d)break;n.originalStart++,n.modifiedStart++}const c=[null];if(i<a.length-1&&this.ChangesOverlap(a[i],a[i+1],c)){a[i]=c[0],a.splice(i+1,1),i--;continue}}for(let i=a.length-1;i>=0;i--){const n=a[i];let t=0,r=0;if(i>0){const l=a[i-1];t=l.originalStart+l.originalLength,r=l.modifiedStart+l.modifiedLength}const u=n.originalLength>0,f=n.modifiedLength>0;let c=0,d=this._boundaryScore(n.originalStart,n.originalLength,n.modifiedStart,n.modifiedLength);for(let l=1;;l++){const o=n.originalStart-l,g=n.modifiedStart-l;if(o<t||g<r||u&&!this.OriginalElementsAreEqual(o,o+n.originalLength)||f&&!this.ModifiedElementsAreEqual(g,g+n.modifiedLength))break;const m=(o===t&&g===r?5:0)+this._boundaryScore(o,n.originalLength,g,n.modifiedLength);m>d&&(d=m,c=l)}n.originalStart-=c,n.modifiedStart-=c;const s=[null];if(i>0&&this.ChangesOverlap(a[i-1],a[i],s)){a[i-1]=s[0],a.splice(i,1),i++;continue}}if(this._hasStrings)for(let i=1,n=a.length;i<n;i++){const t=a[i-1],r=a[i],u=r.originalStart-t.originalStart-t.originalLength,f=t.originalStart,c=r.originalStart+r.originalLength,d=c-f,s=t.modifiedStart,l=r.modifiedStart+r.modifiedLength,o=l-s;if(u<5&&d<20&&o<20){const g=this._findBetterContiguousSequence(f,d,s,o,u);if(g){const[h,m]=g;(h!==t.originalStart+t.originalLength||m!==t.modifiedStart+t.modifiedLength)&&(t.originalLength=h-t.originalStart,t.modifiedLength=m-t.modifiedStart,r.originalStart=h+u,r.modifiedStart=m+u,r.originalLength=c-r.originalStart,r.modifiedLength=l-r.modifiedStart)}}}return a}_findBetterContiguousSequence(a,i,n,t,r){if(i<r||t<r)return null;const u=a+i-r+1,f=n+t-r+1;let c=0,d=0,s=0;for(let l=a;l<u;l++)for(let o=n;o<f;o++){const g=this._contiguousSequenceScore(l,o,r);g>0&&g>c&&(c=g,d=l,s=o)}return c>0?[d,s]:null}_contiguousSequenceScore(a,i,n){let t=0;for(let r=0;r<n;r++){if(!this.ElementsAreEqual(a+r,i+r))return 0;t+=this._originalStringElements[a+r].length}return t}_OriginalIsBoundary(a){return a<=0||a>=this._originalElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._originalStringElements[a])}_OriginalRegionIsBoundary(a,i){if(this._OriginalIsBoundary(a)||this._OriginalIsBoundary(a-1))return!0;if(i>0){const n=a+i;if(this._OriginalIsBoundary(n-1)||this._OriginalIsBoundary(n))return!0}return!1}_ModifiedIsBoundary(a){return a<=0||a>=this._modifiedElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._modifiedStringElements[a])}_ModifiedRegionIsBoundary(a,i){if(this._ModifiedIsBoundary(a)||this._ModifiedIsBoundary(a-1))return!0;if(i>0){const n=a+i;if(this._ModifiedIsBoundary(n-1)||this._ModifiedIsBoundary(n))return!0}return!1}_boundaryScore(a,i,n,t){const r=this._OriginalRegionIsBoundary(a,i)?1:0,u=this._ModifiedRegionIsBoundary(n,t)?1:0;return r+u}ConcatenateChanges(a,i){const n=[];if(a.length===0||i.length===0)return i.length>0?i:a;if(this.ChangesOverlap(a[a.length-1],i[0],n)){const t=new Array(a.length+i.length-1);return p.Copy(a,0,t,0,a.length-1),t[a.length-1]=n[0],p.Copy(i,1,t,a.length,i.length-1),t}else{const t=new Array(a.length+i.length);return p.Copy(a,0,t,0,a.length),p.Copy(i,0,t,a.length,i.length),t}}ChangesOverlap(a,i,n){if(S.Assert(a.originalStart<=i.originalStart,"Left change is not less than or equal to right change"),S.Assert(a.modifiedStart<=i.modifiedStart,"Left change is not less than or equal to right change"),a.originalStart+a.originalLength>=i.originalStart||a.modifiedStart+a.modifiedLength>=i.modifiedStart){const t=a.originalStart;let r=a.originalLength;const u=a.modifiedStart;let f=a.modifiedLength;return a.originalStart+a.originalLength>=i.originalStart&&(r=i.originalStart+i.originalLength-a.originalStart),a.modifiedStart+a.modifiedLength>=i.modifiedStart&&(f=i.modifiedStart+i.modifiedLength-a.modifiedStart),n[0]=new L.DiffChange(t,r,u,f),!0}else return n[0]=null,!1}ClipDiagonalBound(a,i,n,t){if(a>=0&&a<t)return a;const r=n,u=t-n-1,f=i%2===0;if(a<0){const c=r%2===0;return f===c?0:1}else{const c=u%2===0;return f===c?t-1:t-2}}}e.LcsDiff=v}),define(se[406],oe([1,0,11]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.buildReplaceStringWithCasePreserved=void 0;function k(S,p){if(S&&S[0]!==""){const _=y(S,p,"-"),v=y(S,p,"_");return _&&!v?E(S,p,"-"):!_&&v?E(S,p,"_"):S[0].toUpperCase()===S[0]?p.toUpperCase():S[0].toLowerCase()===S[0]?p.toLowerCase():L.containsUppercaseCharacter(S[0][0])&&p.length>0?p[0].toUpperCase()+p.substr(1):S[0][0].toUpperCase()!==S[0][0]&&p.length>0?p[0].toLowerCase()+p.substr(1):p}else return p}e.buildReplaceStringWithCasePreserved=k;function y(S,p,_){return S[0].indexOf(_)!==-1&&p.indexOf(_)!==-1&&S[0].split(_).length===p.split(_).length}function E(S,p,_){const v=p.split(_),b=S[0].split(_);let a="";return v.forEach((i,n)=>{a+=k([b[n]],i)+_}),a.slice(0,-1)}}),define(se[100],oe([1,0,11]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var k;(function(y){y[y.Ignore=0]="Ignore",y[y.Info=1]="Info",y[y.Warning=2]="Warning",y[y.Error=3]="Error"})(k||(k={})),function(y){const E="error",S="warning",p="warn",_="info",v="ignore";function b(i){return i?L.equalsIgnoreCase(E,i)?y.Error:L.equalsIgnoreCase(S,i)||L.equalsIgnoreCase(p,i)?y.Warning:L.equalsIgnoreCase(_,i)?y.Info:y.Ignore:y.Ignore}y.fromValue=b;function a(i){switch(i){case y.Error:return E;case y.Warning:return S;case y.Info:return _;default:return v}}y.toString=a}(k||(k={})),e.default=k}),define(se[271],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MicrotaskDelay=void 0,e.MicrotaskDelay=Symbol("MicrotaskDelay")}),define(se[199],oe([1,0,11]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TernarySearchTree=e.UriIterator=e.PathIterator=e.ConfigKeysIterator=e.StringIterator=void 0;class k{constructor(){this._value="",this._pos=0}reset(b){return this._value=b,this._pos=0,this}next(){return this._pos+=1,this}hasNext(){return this._pos<this._value.length-1}cmp(b){const a=b.charCodeAt(0),i=this._value.charCodeAt(this._pos);return a-i}value(){return this._value[this._pos]}}e.StringIterator=k;class y{constructor(b=!0){this._caseSensitive=b}reset(b){return this._value=b,this._from=0,this._to=0,this.next()}hasNext(){return this._to<this._value.length}next(){this._from=this._to;let b=!0;for(;this._to<this._value.length;this._to++)if(this._value.charCodeAt(this._to)===46)if(b)this._from++;else break;else b=!1;return this}cmp(b){return this._caseSensitive?(0,L.compareSubstring)(b,this._value,0,b.length,this._from,this._to):(0,L.compareSubstringIgnoreCase)(b,this._value,0,b.length,this._from,this._to)}value(){return this._value.substring(this._from,this._to)}}e.ConfigKeysIterator=y;class E{constructor(b=!0,a=!0){this._splitOnBackslash=b,this._caseSensitive=a}reset(b){this._from=0,this._to=0,this._value=b,this._valueLen=b.length;for(let a=b.length-1;a>=0;a--,this._valueLen--){const i=this._value.charCodeAt(a);if(!(i===47||this._splitOnBackslash&&i===92))break}return this.next()}hasNext(){return this._to<this._valueLen}next(){this._from=this._to;let b=!0;for(;this._to<this._valueLen;this._to++){const a=this._value.charCodeAt(this._to);if(a===47||this._splitOnBackslash&&a===92)if(b)this._from++;else break;else b=!1}return this}cmp(b){return this._caseSensitive?(0,L.compareSubstring)(b,this._value,0,b.length,this._from,this._to):(0,L.compareSubstringIgnoreCase)(b,this._value,0,b.length,this._from,this._to)}value(){return this._value.substring(this._from,this._to)}}e.PathIterator=E;class S{constructor(b,a){this._ignorePathCasing=b,this._ignoreQueryAndFragment=a,this._states=[],this._stateIdx=0}reset(b){return this._value=b,this._states=[],this._value.scheme&&this._states.push(1),this._value.authority&&this._states.push(2),this._value.path&&(this._pathIterator=new E(!1,!this._ignorePathCasing(b)),this._pathIterator.reset(b.path),this._pathIterator.value()&&this._states.push(3)),this._ignoreQueryAndFragment(b)||(this._value.query&&this._states.push(4),this._value.fragment&&this._states.push(5)),this._stateIdx=0,this}next(){return this._states[this._stateIdx]===3&&this._pathIterator.hasNext()?this._pathIterator.next():this._stateIdx+=1,this}hasNext(){return this._states[this._stateIdx]===3&&this._pathIterator.hasNext()||this._stateIdx<this._states.length-1}cmp(b){if(this._states[this._stateIdx]===1)return(0,L.compareIgnoreCase)(b,this._value.scheme);if(this._states[this._stateIdx]===2)return(0,L.compareIgnoreCase)(b,this._value.authority);if(this._states[this._stateIdx]===3)return this._pathIterator.cmp(b);if(this._states[this._stateIdx]===4)return(0,L.compare)(b,this._value.query);if(this._states[this._stateIdx]===5)return(0,L.compare)(b,this._value.fragment);throw new Error}value(){if(this._states[this._stateIdx]===1)return this._value.scheme;if(this._states[this._stateIdx]===2)return this._value.authority;if(this._states[this._stateIdx]===3)return this._pathIterator.value();if(this._states[this._stateIdx]===4)return this._value.query;if(this._states[this._stateIdx]===5)return this._value.fragment;throw new Error}}e.UriIterator=S;class p{constructor(){this.height=1}rotateLeft(){const b=this.right;return this.right=b.left,b.left=this,this.updateHeight(),b.updateHeight(),b}rotateRight(){const b=this.left;return this.left=b.right,b.right=this,this.updateHeight(),b.updateHeight(),b}updateHeight(){this.height=1+Math.max(this.heightLeft,this.heightRight)}balanceFactor(){return this.heightRight-this.heightLeft}get heightLeft(){var b,a;return(a=(b=this.left)===null||b===void 0?void 0:b.height)!==null&&a!==void 0?a:0}get heightRight(){var b,a;return(a=(b=this.right)===null||b===void 0?void 0:b.height)!==null&&a!==void 0?a:0}}class _{static forUris(b=()=>!1,a=()=>!1){return new _(new S(b,a))}static forStrings(){return new _(new k)}static forConfigKeys(){return new _(new y)}constructor(b){this._iter=b}clear(){this._root=void 0}set(b,a){const i=this._iter.reset(b);let n;this._root||(this._root=new p,this._root.segment=i.value());const t=[];for(n=this._root;;){const u=i.cmp(n.segment);if(u>0)n.left||(n.left=new p,n.left.segment=i.value()),t.push([-1,n]),n=n.left;else if(u<0)n.right||(n.right=new p,n.right.segment=i.value()),t.push([1,n]),n=n.right;else if(i.hasNext())i.next(),n.mid||(n.mid=new p,n.mid.segment=i.value()),t.push([0,n]),n=n.mid;else break}const r=n.value;n.value=a,n.key=b;for(let u=t.length-1;u>=0;u--){const f=t[u][1];f.updateHeight();const c=f.balanceFactor();if(c<-1||c>1){const d=t[u][0],s=t[u+1][0];if(d===1&&s===1)t[u][1]=f.rotateLeft();else if(d===-1&&s===-1)t[u][1]=f.rotateRight();else if(d===1&&s===-1)f.right=t[u+1][1]=t[u+1][1].rotateRight(),t[u][1]=f.rotateLeft();else if(d===-1&&s===1)f.left=t[u+1][1]=t[u+1][1].rotateLeft(),t[u][1]=f.rotateRight();else throw new Error;if(u>0)switch(t[u-1][0]){case-1:t[u-1][1].left=t[u][1];break;case 1:t[u-1][1].right=t[u][1];break;case 0:t[u-1][1].mid=t[u][1];break}else this._root=t[0][1]}}return r}get(b){var a;return(a=this._getNode(b))===null||a===void 0?void 0:a.value}_getNode(b){const a=this._iter.reset(b);let i=this._root;for(;i;){const n=a.cmp(i.segment);if(n>0)i=i.left;else if(n<0)i=i.right;else if(a.hasNext())a.next(),i=i.mid;else break}return i}has(b){const a=this._getNode(b);return!(a?.value===void 0&&a?.mid===void 0)}delete(b){return this._delete(b,!1)}deleteSuperstr(b){return this._delete(b,!0)}_delete(b,a){var i;const n=this._iter.reset(b),t=[];let r=this._root;for(;r;){const u=n.cmp(r.segment);if(u>0)t.push([-1,r]),r=r.left;else if(u<0)t.push([1,r]),r=r.right;else if(n.hasNext())n.next(),t.push([0,r]),r=r.mid;else break}if(r){if(a?(r.left=void 0,r.mid=void 0,r.right=void 0,r.height=1):(r.key=void 0,r.value=void 0),!r.mid&&!r.value)if(r.left&&r.right){const u=this._min(r.right);if(u.key){const{key:f,value:c,segment:d}=u;this._delete(u.key,!1),r.key=f,r.value=c,r.segment=d}}else{const u=(i=r.left)!==null&&i!==void 0?i:r.right;if(t.length>0){const[f,c]=t[t.length-1];switch(f){case-1:c.left=u;break;case 0:c.mid=u;break;case 1:c.right=u;break}}else this._root=u}for(let u=t.length-1;u>=0;u--){const f=t[u][1];f.updateHeight();const c=f.balanceFactor();if(c>1?(f.right.balanceFactor()>=0||(f.right=f.right.rotateRight()),t[u][1]=f.rotateLeft()):c<-1&&(f.left.balanceFactor()<=0||(f.left=f.left.rotateLeft()),t[u][1]=f.rotateRight()),u>0)switch(t[u-1][0]){case-1:t[u-1][1].left=t[u][1];break;case 1:t[u-1][1].right=t[u][1];break;case 0:t[u-1][1].mid=t[u][1];break}else this._root=t[0][1]}}}_min(b){for(;b.left;)b=b.left;return b}findSubstr(b){const a=this._iter.reset(b);let i=this._root,n;for(;i;){const t=a.cmp(i.segment);if(t>0)i=i.left;else if(t<0)i=i.right;else if(a.hasNext())a.next(),n=i.value||n,i=i.mid;else break}return i&&i.value||n}findSuperstr(b){return this._findSuperstrOrElement(b,!1)}_findSuperstrOrElement(b,a){const i=this._iter.reset(b);let n=this._root;for(;n;){const t=i.cmp(n.segment);if(t>0)n=n.left;else if(t<0)n=n.right;else if(i.hasNext())i.next(),n=n.mid;else return n.mid?this._entries(n.mid):a?n.value:void 0}}forEach(b){for(const[a,i]of this)b(i,a)}*[Symbol.iterator](){yield*this._entries(this._root)}_entries(b){const a=[];return this._dfsEntries(b,a),a[Symbol.iterator]()}_dfsEntries(b,a){b&&(b.left&&this._dfsEntries(b.left,a),b.value&&a.push([b.key,b.value]),b.mid&&this._dfsEntries(b.mid,a),b.right&&this._dfsEntries(b.right,a))}}e.TernarySearchTree=_}),define(se[407],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.normalizeTfIdfScores=e.TfIdfCalculator=void 0;function L(E){var S;const p=new Map;for(const _ of E)p.set(_,((S=p.get(_))!==null&&S!==void 0?S:0)+1);return p}class k{constructor(){this.chunkCount=0,this.chunkOccurrences=new Map,this.documents=new Map}calculateScores(S,p){const _=this.computeEmbedding(S),v=new Map,b=[];for(const[a,i]of this.documents){if(p.isCancellationRequested)return[];for(const n of i.chunks){const t=this.computeSimilarityScore(n,_,v);t>0&&b.push({key:a,score:t})}}return b}static termFrequencies(S){return L(k.splitTerms(S))}static*splitTerms(S){const p=_=>_.toLowerCase();for(const[_]of S.matchAll(/\b\p{Letter}[\p{Letter}\d]{2,}\b/gu)){yield p(_);const v=_.replace(/([a-z])([A-Z])/g,"$1 $2").split(/\s+/g);if(v.length>1)for(const b of v)b.length>2&&/\p{Letter}{3,}/gu.test(b)&&(yield p(b))}}updateDocuments(S){var p;for(const{key:_}of S)this.deleteDocument(_);for(const _ of S){const v=[];for(const b of _.textChunks){const a=k.termFrequencies(b);for(const i of a.keys())this.chunkOccurrences.set(i,((p=this.chunkOccurrences.get(i))!==null&&p!==void 0?p:0)+1);v.push({text:b,tf:a})}this.chunkCount+=v.length,this.documents.set(_.key,{chunks:v})}return this}deleteDocument(S){const p=this.documents.get(S);if(p){this.documents.delete(S),this.chunkCount-=p.chunks.length;for(const _ of p.chunks)for(const v of _.tf.keys()){const b=this.chunkOccurrences.get(v);if(typeof b=="number"){const a=b-1;a<=0?this.chunkOccurrences.delete(v):this.chunkOccurrences.set(v,a)}}}}computeSimilarityScore(S,p,_){let v=0;for(const[b,a]of Object.entries(p)){const i=S.tf.get(b);if(!i)continue;let n=_.get(b);typeof n!="number"&&(n=this.computeIdf(b),_.set(b,n));const t=i*n;v+=t*a}return v}computeEmbedding(S){const p=k.termFrequencies(S);return this.computeTfidf(p)}computeIdf(S){var p;const _=(p=this.chunkOccurrences.get(S))!==null&&p!==void 0?p:0;return _>0?Math.log((this.chunkCount+1)/_):0}computeTfidf(S){const p=Object.create(null);for(const[_,v]of S){const b=this.computeIdf(_);b>0&&(p[_]=v*b)}return p}}e.TfIdfCalculator=k;function y(E){var S,p;const _=E.slice(0);_.sort((b,a)=>a.score-b.score);const v=(p=(S=_[0])===null||S===void 0?void 0:S.score)!==null&&p!==void 0?p:0;if(v>0)for(const b of _)b.score/=v;return _}e.normalizeTfIdfScores=y}),define(se[20],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.validateConstraint=e.validateConstraints=e.isFunction=e.assertIsDefined=e.assertType=e.isUndefinedOrNull=e.isDefined=e.isUndefined=e.isBoolean=e.isIterable=e.isNumber=e.isTypedArray=e.isObject=e.isString=void 0;function L(u){return typeof u=="string"}e.isString=L;function k(u){return typeof u=="object"&&u!==null&&!Array.isArray(u)&&!(u instanceof RegExp)&&!(u instanceof Date)}e.isObject=k;function y(u){const f=Object.getPrototypeOf(Uint8Array);return typeof u=="object"&&u instanceof f}e.isTypedArray=y;function E(u){return typeof u=="number"&&!isNaN(u)}e.isNumber=E;function S(u){return!!u&&typeof u[Symbol.iterator]=="function"}e.isIterable=S;function p(u){return u===!0||u===!1}e.isBoolean=p;function _(u){return typeof u>"u"}e.isUndefined=_;function v(u){return!b(u)}e.isDefined=v;function b(u){return _(u)||u===null}e.isUndefinedOrNull=b;function a(u,f){if(!u)throw new Error(f?`Unexpected type, expected '${f}'`:"Unexpected type")}e.assertType=a;function i(u){if(b(u))throw new Error("Assertion Failed: argument is undefined or null");return u}e.assertIsDefined=i;function n(u){return typeof u=="function"}e.isFunction=n;function t(u,f){const c=Math.min(u.length,f.length);for(let d=0;d<c;d++)r(u[d],f[d])}e.validateConstraints=t;function r(u,f){if(L(f)){if(typeof u!==f)throw new Error(`argument does not match constraint: typeof ${f}`)}else if(n(f)){try{if(u instanceof f)return}catch{}if(!b(u)&&u.constructor===f||f.length===1&&f.call(void 0,u)===!0)return;throw new Error("argument does not match one of these constraints: arg instanceof constraint, arg.constructor === constraint, nor constraint(arg) === true")}}e.validateConstraint=r}),define(se[26],oe([1,0,20]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Codicon=e.getCodiconFontCharacters=void 0;const k=Object.create(null);function y(S,p){if((0,L.isString)(p)){const _=k[p];if(_===void 0)throw new Error(`${S} references an unknown codicon: ${p}`);p=_}return k[S]=p,{id:S}}function E(){return k}e.getCodiconFontCharacters=E,e.Codicon={add:y("add",6e4),plus:y("plus",6e4),gistNew:y("gist-new",6e4),repoCreate:y("repo-create",6e4),lightbulb:y("lightbulb",60001),lightBulb:y("light-bulb",60001),repo:y("repo",60002),repoDelete:y("repo-delete",60002),gistFork:y("gist-fork",60003),repoForked:y("repo-forked",60003),gitPullRequest:y("git-pull-request",60004),gitPullRequestAbandoned:y("git-pull-request-abandoned",60004),recordKeys:y("record-keys",60005),keyboard:y("keyboard",60005),tag:y("tag",60006),tagAdd:y("tag-add",60006),tagRemove:y("tag-remove",60006),gitPullRequestLabel:y("git-pull-request-label",60006),person:y("person",60007),personFollow:y("person-follow",60007),personOutline:y("person-outline",60007),personFilled:y("person-filled",60007),gitBranch:y("git-branch",60008),gitBranchCreate:y("git-branch-create",60008),gitBranchDelete:y("git-branch-delete",60008),sourceControl:y("source-control",60008),mirror:y("mirror",60009),mirrorPublic:y("mirror-public",60009),star:y("star",60010),starAdd:y("star-add",60010),starDelete:y("star-delete",60010),starEmpty:y("star-empty",60010),comment:y("comment",60011),commentAdd:y("comment-add",60011),alert:y("alert",60012),warning:y("warning",60012),search:y("search",60013),searchSave:y("search-save",60013),logOut:y("log-out",60014),signOut:y("sign-out",60014),logIn:y("log-in",60015),signIn:y("sign-in",60015),eye:y("eye",60016),eyeUnwatch:y("eye-unwatch",60016),eyeWatch:y("eye-watch",60016),circleFilled:y("circle-filled",60017),primitiveDot:y("primitive-dot",60017),closeDirty:y("close-dirty",60017),debugBreakpoint:y("debug-breakpoint",60017),debugBreakpointDisabled:y("debug-breakpoint-disabled",60017),debugBreakpointPending:y("debug-breakpoint-pending",60377),debugHint:y("debug-hint",60017),primitiveSquare:y("primitive-square",60018),edit:y("edit",60019),pencil:y("pencil",60019),info:y("info",60020),issueOpened:y("issue-opened",60020),gistPrivate:y("gist-private",60021),gitForkPrivate:y("git-fork-private",60021),lock:y("lock",60021),mirrorPrivate:y("mirror-private",60021),close:y("close",60022),removeClose:y("remove-close",60022),x:y("x",60022),repoSync:y("repo-sync",60023),sync:y("sync",60023),clone:y("clone",60024),desktopDownload:y("desktop-download",60024),beaker:y("beaker",60025),microscope:y("microscope",60025),vm:y("vm",60026),deviceDesktop:y("device-desktop",60026),file:y("file",60027),fileText:y("file-text",60027),more:y("more",60028),ellipsis:y("ellipsis",60028),kebabHorizontal:y("kebab-horizontal",60028),mailReply:y("mail-reply",60029),reply:y("reply",60029),organization:y("organization",60030),organizationFilled:y("organization-filled",60030),organizationOutline:y("organization-outline",60030),newFile:y("new-file",60031),fileAdd:y("file-add",60031),newFolder:y("new-folder",60032),fileDirectoryCreate:y("file-directory-create",60032),trash:y("trash",60033),trashcan:y("trashcan",60033),history:y("history",60034),clock:y("clock",60034),folder:y("folder",60035),fileDirectory:y("file-directory",60035),symbolFolder:y("symbol-folder",60035),logoGithub:y("logo-github",60036),markGithub:y("mark-github",60036),github:y("github",60036),terminal:y("terminal",60037),console:y("console",60037),repl:y("repl",60037),zap:y("zap",60038),symbolEvent:y("symbol-event",60038),error:y("error",60039),stop:y("stop",60039),variable:y("variable",60040),symbolVariable:y("symbol-variable",60040),array:y("array",60042),symbolArray:y("symbol-array",60042),symbolModule:y("symbol-module",60043),symbolPackage:y("symbol-package",60043),symbolNamespace:y("symbol-namespace",60043),symbolObject:y("symbol-object",60043),symbolMethod:y("symbol-method",60044),symbolFunction:y("symbol-function",60044),symbolConstructor:y("symbol-constructor",60044),symbolBoolean:y("symbol-boolean",60047),symbolNull:y("symbol-null",60047),symbolNumeric:y("symbol-numeric",60048),symbolNumber:y("symbol-number",60048),symbolStructure:y("symbol-structure",60049),symbolStruct:y("symbol-struct",60049),symbolParameter:y("symbol-parameter",60050),symbolTypeParameter:y("symbol-type-parameter",60050),symbolKey:y("symbol-key",60051),symbolText:y("symbol-text",60051),symbolReference:y("symbol-reference",60052),goToFile:y("go-to-file",60052),symbolEnum:y("symbol-enum",60053),symbolValue:y("symbol-value",60053),symbolRuler:y("symbol-ruler",60054),symbolUnit:y("symbol-unit",60054),activateBreakpoints:y("activate-breakpoints",60055),archive:y("archive",60056),arrowBoth:y("arrow-both",60057),arrowDown:y("arrow-down",60058),arrowLeft:y("arrow-left",60059),arrowRight:y("arrow-right",60060),arrowSmallDown:y("arrow-small-down",60061),arrowSmallLeft:y("arrow-small-left",60062),arrowSmallRight:y("arrow-small-right",60063),arrowSmallUp:y("arrow-small-up",60064),arrowUp:y("arrow-up",60065),bell:y("bell",60066),bold:y("bold",60067),book:y("book",60068),bookmark:y("bookmark",60069),debugBreakpointConditionalUnverified:y("debug-breakpoint-conditional-unverified",60070),debugBreakpointConditional:y("debug-breakpoint-conditional",60071),debugBreakpointConditionalDisabled:y("debug-breakpoint-conditional-disabled",60071),debugBreakpointDataUnverified:y("debug-breakpoint-data-unverified",60072),debugBreakpointData:y("debug-breakpoint-data",60073),debugBreakpointDataDisabled:y("debug-breakpoint-data-disabled",60073),debugBreakpointLogUnverified:y("debug-breakpoint-log-unverified",60074),debugBreakpointLog:y("debug-breakpoint-log",60075),debugBreakpointLogDisabled:y("debug-breakpoint-log-disabled",60075),briefcase:y("briefcase",60076),broadcast:y("broadcast",60077),browser:y("browser",60078),bug:y("bug",60079),calendar:y("calendar",60080),caseSensitive:y("case-sensitive",60081),check:y("check",60082),checklist:y("checklist",60083),chevronDown:y("chevron-down",60084),dropDownButton:y("drop-down-button",60084),chevronLeft:y("chevron-left",60085),chevronRight:y("chevron-right",60086),chevronUp:y("chevron-up",60087),chromeClose:y("chrome-close",60088),chromeMaximize:y("chrome-maximize",60089),chromeMinimize:y("chrome-minimize",60090),chromeRestore:y("chrome-restore",60091),circle:y("circle",60092),circleOutline:y("circle-outline",60092),debugBreakpointUnverified:y("debug-breakpoint-unverified",60092),circleSlash:y("circle-slash",60093),circuitBoard:y("circuit-board",60094),clearAll:y("clear-all",60095),clippy:y("clippy",60096),closeAll:y("close-all",60097),cloudDownload:y("cloud-download",60098),cloudUpload:y("cloud-upload",60099),code:y("code",60100),collapseAll:y("collapse-all",60101),colorMode:y("color-mode",60102),commentDiscussion:y("comment-discussion",60103),compareChanges:y("compare-changes",60157),creditCard:y("credit-card",60105),dash:y("dash",60108),dashboard:y("dashboard",60109),database:y("database",60110),debugContinue:y("debug-continue",60111),debugDisconnect:y("debug-disconnect",60112),debugPause:y("debug-pause",60113),debugRestart:y("debug-restart",60114),debugStart:y("debug-start",60115),debugStepInto:y("debug-step-into",60116),debugStepOut:y("debug-step-out",60117),debugStepOver:y("debug-step-over",60118),debugStop:y("debug-stop",60119),debug:y("debug",60120),deviceCameraVideo:y("device-camera-video",60121),deviceCamera:y("device-camera",60122),deviceMobile:y("device-mobile",60123),diffAdded:y("diff-added",60124),diffIgnored:y("diff-ignored",60125),diffModified:y("diff-modified",60126),diffRemoved:y("diff-removed",60127),diffRenamed:y("diff-renamed",60128),diff:y("diff",60129),discard:y("discard",60130),editorLayout:y("editor-layout",60131),emptyWindow:y("empty-window",60132),exclude:y("exclude",60133),extensions:y("extensions",60134),eyeClosed:y("eye-closed",60135),fileBinary:y("file-binary",60136),fileCode:y("file-code",60137),fileMedia:y("file-media",60138),filePdf:y("file-pdf",60139),fileSubmodule:y("file-submodule",60140),fileSymlinkDirectory:y("file-symlink-directory",60141),fileSymlinkFile:y("file-symlink-file",60142),fileZip:y("file-zip",60143),files:y("files",60144),filter:y("filter",60145),flame:y("flame",60146),foldDown:y("fold-down",60147),foldUp:y("fold-up",60148),fold:y("fold",60149),folderActive:y("folder-active",60150),folderOpened:y("folder-opened",60151),gear:y("gear",60152),gift:y("gift",60153),gistSecret:y("gist-secret",60154),gist:y("gist",60155),gitCommit:y("git-commit",60156),gitCompare:y("git-compare",60157),gitMerge:y("git-merge",60158),githubAction:y("github-action",60159),githubAlt:y("github-alt",60160),globe:y("globe",60161),grabber:y("grabber",60162),graph:y("graph",60163),gripper:y("gripper",60164),heart:y("heart",60165),home:y("home",60166),horizontalRule:y("horizontal-rule",60167),hubot:y("hubot",60168),inbox:y("inbox",60169),issueClosed:y("issue-closed",60324),issueReopened:y("issue-reopened",60171),issues:y("issues",60172),italic:y("italic",60173),jersey:y("jersey",60174),json:y("json",60175),bracket:y("bracket",60175),kebabVertical:y("kebab-vertical",60176),key:y("key",60177),law:y("law",60178),lightbulbAutofix:y("lightbulb-autofix",60179),linkExternal:y("link-external",60180),link:y("link",60181),listOrdered:y("list-ordered",60182),listUnordered:y("list-unordered",60183),liveShare:y("live-share",60184),loading:y("loading",60185),location:y("location",60186),mailRead:y("mail-read",60187),mail:y("mail",60188),markdown:y("markdown",60189),megaphone:y("megaphone",60190),mention:y("mention",60191),milestone:y("milestone",60192),gitPullRequestMilestone:y("git-pull-request-milestone",60192),mortarBoard:y("mortar-board",60193),move:y("move",60194),multipleWindows:y("multiple-windows",60195),mute:y("mute",60196),noNewline:y("no-newline",60197),note:y("note",60198),octoface:y("octoface",60199),openPreview:y("open-preview",60200),package:y("package",60201),paintcan:y("paintcan",60202),pin:y("pin",60203),play:y("play",60204),run:y("run",60204),plug:y("plug",60205),preserveCase:y("preserve-case",60206),preview:y("preview",60207),project:y("project",60208),pulse:y("pulse",60209),question:y("question",60210),quote:y("quote",60211),radioTower:y("radio-tower",60212),reactions:y("reactions",60213),references:y("references",60214),refresh:y("refresh",60215),regex:y("regex",60216),remoteExplorer:y("remote-explorer",60217),remote:y("remote",60218),remove:y("remove",60219),replaceAll:y("replace-all",60220),replace:y("replace",60221),repoClone:y("repo-clone",60222),repoForcePush:y("repo-force-push",60223),repoPull:y("repo-pull",60224),repoPush:y("repo-push",60225),report:y("report",60226),requestChanges:y("request-changes",60227),rocket:y("rocket",60228),rootFolderOpened:y("root-folder-opened",60229),rootFolder:y("root-folder",60230),rss:y("rss",60231),ruby:y("ruby",60232),saveAll:y("save-all",60233),saveAs:y("save-as",60234),save:y("save",60235),screenFull:y("screen-full",60236),screenNormal:y("screen-normal",60237),searchStop:y("search-stop",60238),server:y("server",60240),settingsGear:y("settings-gear",60241),settings:y("settings",60242),shield:y("shield",60243),smiley:y("smiley",60244),sortPrecedence:y("sort-precedence",60245),splitHorizontal:y("split-horizontal",60246),splitVertical:y("split-vertical",60247),squirrel:y("squirrel",60248),starFull:y("star-full",60249),starHalf:y("star-half",60250),symbolClass:y("symbol-class",60251),symbolColor:y("symbol-color",60252),symbolCustomColor:y("symbol-customcolor",60252),symbolConstant:y("symbol-constant",60253),symbolEnumMember:y("symbol-enum-member",60254),symbolField:y("symbol-field",60255),symbolFile:y("symbol-file",60256),symbolInterface:y("symbol-interface",60257),symbolKeyword:y("symbol-keyword",60258),symbolMisc:y("symbol-misc",60259),symbolOperator:y("symbol-operator",60260),symbolProperty:y("symbol-property",60261),wrench:y("wrench",60261),wrenchSubaction:y("wrench-subaction",60261),symbolSnippet:y("symbol-snippet",60262),tasklist:y("tasklist",60263),telescope:y("telescope",60264),textSize:y("text-size",60265),threeBars:y("three-bars",60266),thumbsdown:y("thumbsdown",60267),thumbsup:y("thumbsup",60268),tools:y("tools",60269),triangleDown:y("triangle-down",60270),triangleLeft:y("triangle-left",60271),triangleRight:y("triangle-right",60272),triangleUp:y("triangle-up",60273),twitter:y("twitter",60274),unfold:y("unfold",60275),unlock:y("unlock",60276),unmute:y("unmute",60277),unverified:y("unverified",60278),verified:y("verified",60279),versions:y("versions",60280),vmActive:y("vm-active",60281),vmOutline:y("vm-outline",60282),vmRunning:y("vm-running",60283),watch:y("watch",60284),whitespace:y("whitespace",60285),wholeWord:y("whole-word",60286),window:y("window",60287),wordWrap:y("word-wrap",60288),zoomIn:y("zoom-in",60289),zoomOut:y("zoom-out",60290),listFilter:y("list-filter",60291),listFlat:y("list-flat",60292),listSelection:y("list-selection",60293),selection:y("selection",60293),listTree:y("list-tree",60294),debugBreakpointFunctionUnverified:y("debug-breakpoint-function-unverified",60295),debugBreakpointFunction:y("debug-breakpoint-function",60296),debugBreakpointFunctionDisabled:y("debug-breakpoint-function-disabled",60296),debugStackframeActive:y("debug-stackframe-active",60297),circleSmallFilled:y("circle-small-filled",60298),debugStackframeDot:y("debug-stackframe-dot",60298),debugStackframe:y("debug-stackframe",60299),debugStackframeFocused:y("debug-stackframe-focused",60299),debugBreakpointUnsupported:y("debug-breakpoint-unsupported",60300),symbolString:y("symbol-string",60301),debugReverseContinue:y("debug-reverse-continue",60302),debugStepBack:y("debug-step-back",60303),debugRestartFrame:y("debug-restart-frame",60304),callIncoming:y("call-incoming",60306),callOutgoing:y("call-outgoing",60307),menu:y("menu",60308),expandAll:y("expand-all",60309),feedback:y("feedback",60310),gitPullRequestReviewer:y("git-pull-request-reviewer",60310),groupByRefType:y("group-by-ref-type",60311),ungroupByRefType:y("ungroup-by-ref-type",60312),account:y("account",60313),gitPullRequestAssignee:y("git-pull-request-assignee",60313),bellDot:y("bell-dot",60314),debugConsole:y("debug-console",60315),library:y("library",60316),output:y("output",60317),runAll:y("run-all",60318),syncIgnored:y("sync-ignored",60319),pinned:y("pinned",60320),githubInverted:y("github-inverted",60321),debugAlt:y("debug-alt",60305),serverProcess:y("server-process",60322),serverEnvironment:y("server-environment",60323),pass:y("pass",60324),stopCircle:y("stop-circle",60325),playCircle:y("play-circle",60326),record:y("record",60327),debugAltSmall:y("debug-alt-small",60328),vmConnect:y("vm-connect",60329),cloud:y("cloud",60330),merge:y("merge",60331),exportIcon:y("export",60332),graphLeft:y("graph-left",60333),magnet:y("magnet",60334),notebook:y("notebook",60335),redo:y("redo",60336),checkAll:y("check-all",60337),pinnedDirty:y("pinned-dirty",60338),passFilled:y("pass-filled",60339),circleLargeFilled:y("circle-large-filled",60340),circleLarge:y("circle-large",60341),circleLargeOutline:y("circle-large-outline",60341),combine:y("combine",60342),gather:y("gather",60342),table:y("table",60343),variableGroup:y("variable-group",60344),typeHierarchy:y("type-hierarchy",60345),typeHierarchySub:y("type-hierarchy-sub",60346),typeHierarchySuper:y("type-hierarchy-super",60347),gitPullRequestCreate:y("git-pull-request-create",60348),runAbove:y("run-above",60349),runBelow:y("run-below",60350),notebookTemplate:y("notebook-template",60351),debugRerun:y("debug-rerun",60352),workspaceTrusted:y("workspace-trusted",60353),workspaceUntrusted:y("workspace-untrusted",60354),workspaceUnspecified:y("workspace-unspecified",60355),terminalCmd:y("terminal-cmd",60356),terminalDebian:y("terminal-debian",60357),terminalLinux:y("terminal-linux",60358),terminalPowershell:y("terminal-powershell",60359),terminalTmux:y("terminal-tmux",60360),terminalUbuntu:y("terminal-ubuntu",60361),terminalBash:y("terminal-bash",60362),arrowSwap:y("arrow-swap",60363),copy:y("copy",60364),personAdd:y("person-add",60365),filterFilled:y("filter-filled",60366),wand:y("wand",60367),debugLineByLine:y("debug-line-by-line",60368),inspect:y("inspect",60369),layers:y("layers",60370),layersDot:y("layers-dot",60371),layersActive:y("layers-active",60372),compass:y("compass",60373),compassDot:y("compass-dot",60374),compassActive:y("compass-active",60375),azure:y("azure",60376),issueDraft:y("issue-draft",60377),gitPullRequestClosed:y("git-pull-request-closed",60378),gitPullRequestDraft:y("git-pull-request-draft",60379),debugAll:y("debug-all",60380),debugCoverage:y("debug-coverage",60381),runErrors:y("run-errors",60382),folderLibrary:y("folder-library",60383),debugContinueSmall:y("debug-continue-small",60384),beakerStop:y("beaker-stop",60385),graphLine:y("graph-line",60386),graphScatter:y("graph-scatter",60387),pieChart:y("pie-chart",60388),bracketDot:y("bracket-dot",60389),bracketError:y("bracket-error",60390),lockSmall:y("lock-small",60391),azureDevops:y("azure-devops",60392),verifiedFilled:y("verified-filled",60393),newLine:y("newline",60394),layout:y("layout",60395),layoutActivitybarLeft:y("layout-activitybar-left",60396),layoutActivitybarRight:y("layout-activitybar-right",60397),layoutPanelLeft:y("layout-panel-left",60398),layoutPanelCenter:y("layout-panel-center",60399),layoutPanelJustify:y("layout-panel-justify",60400),layoutPanelRight:y("layout-panel-right",60401),layoutPanel:y("layout-panel",60402),layoutSidebarLeft:y("layout-sidebar-left",60403),layoutSidebarRight:y("layout-sidebar-right",60404),layoutStatusbar:y("layout-statusbar",60405),layoutMenubar:y("layout-menubar",60406),layoutCentered:y("layout-centered",60407),layoutSidebarRightOff:y("layout-sidebar-right-off",60416),layoutPanelOff:y("layout-panel-off",60417),layoutSidebarLeftOff:y("layout-sidebar-left-off",60418),target:y("target",60408),indent:y("indent",60409),recordSmall:y("record-small",60410),errorSmall:y("error-small",60411),arrowCircleDown:y("arrow-circle-down",60412),arrowCircleLeft:y("arrow-circle-left",60413),arrowCircleRight:y("arrow-circle-right",60414),arrowCircleUp:y("arrow-circle-up",60415),heartFilled:y("heart-filled",60420),map:y("map",60421),mapFilled:y("map-filled",60422),circleSmall:y("circle-small",60423),bellSlash:y("bell-slash",60424),bellSlashDot:y("bell-slash-dot",60425),commentUnresolved:y("comment-unresolved",60426),gitPullRequestGoToChanges:y("git-pull-request-go-to-changes",60427),gitPullRequestNewChanges:y("git-pull-request-new-changes",60428),searchFuzzy:y("search-fuzzy",60429),commentDraft:y("comment-draft",60430),send:y("send",60431),sparkle:y("sparkle",60432),insert:y("insert",60433),mic:y("mic",60434),thumbsDownFilled:y("thumbsdown-filled",60435),thumbsUpFilled:y("thumbsup-filled",60436),coffee:y("coffee",60437),snake:y("snake",60438),game:y("game",60439),vr:y("vr",60440),chip:y("chip",60441),piano:y("piano",60442),music:y("music",60443),micFilled:y("mic-filled",60444),gitFetch:y("git-fetch",60445),copilot:y("copilot",60446),lightbulbSparkle:y("lightbulb-sparkle",60447),lightbulbSparkleAutofix:y("lightbulb-sparkle-autofix",60447),robot:y("robot",60448),sparkleFilled:y("sparkle-filled",60449),diffSingle:y("diff-single",60450),diffMultiple:y("diff-multiple",60451),surroundWith:y("surround-with",60452),gitStash:y("git-stash",60454),gitStashApply:y("git-stash-apply",60455),gitStashPop:y("git-stash-pop",60456),dialogError:y("dialog-error","error"),dialogWarning:y("dialog-warning","warning"),dialogInfo:y("dialog-info","info"),dialogClose:y("dialog-close","close"),treeItemExpanded:y("tree-item-expanded","chevron-down"),treeFilterOnTypeOn:y("tree-filter-on-type-on","list-filter"),treeFilterOnTypeOff:y("tree-filter-on-type-off","list-selection"),treeFilterClear:y("tree-filter-clear","close"),treeItemLoading:y("tree-item-loading","loading"),menuSelection:y("menu-selection","check"),menuSubmenu:y("menu-submenu","chevron-right"),menuBarMore:y("menubar-more","more"),scrollbarButtonLeft:y("scrollbar-button-left","triangle-left"),scrollbarButtonRight:y("scrollbar-button-right","triangle-right"),scrollbarButtonUp:y("scrollbar-button-up","triangle-up"),scrollbarButtonDown:y("scrollbar-button-down","triangle-down"),toolBarMore:y("toolbar-more","more"),quickInputBack:y("quick-input-back","arrow-left")}}),define(se[55],oe([1,0,20]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createProxyObject=e.getAllMethodNames=e.getAllPropertyNames=e.equals=e.mixin=e.cloneAndChange=e.deepFreeze=e.deepClone=void 0;function k(n){if(!n||typeof n!="object"||n instanceof RegExp)return n;const t=Array.isArray(n)?[]:{};return Object.entries(n).forEach(([r,u])=>{t[r]=u&&typeof u=="object"?k(u):u}),t}e.deepClone=k;function y(n){if(!n||typeof n!="object")return n;const t=[n];for(;t.length>0;){const r=t.shift();Object.freeze(r);for(const u in r)if(E.call(r,u)){const f=r[u];typeof f=="object"&&!Object.isFrozen(f)&&!(0,L.isTypedArray)(f)&&t.push(f)}}return n}e.deepFreeze=y;const E=Object.prototype.hasOwnProperty;function S(n,t){return p(n,t,new Set)}e.cloneAndChange=S;function p(n,t,r){if((0,L.isUndefinedOrNull)(n))return n;const u=t(n);if(typeof u<"u")return u;if(Array.isArray(n)){const f=[];for(const c of n)f.push(p(c,t,r));return f}if((0,L.isObject)(n)){if(r.has(n))throw new Error("Cannot clone recursive data-structure");r.add(n);const f={};for(const c in n)E.call(n,c)&&(f[c]=p(n[c],t,r));return r.delete(n),f}return n}function _(n,t,r=!0){return(0,L.isObject)(n)?((0,L.isObject)(t)&&Object.keys(t).forEach(u=>{u in n?r&&((0,L.isObject)(n[u])&&(0,L.isObject)(t[u])?_(n[u],t[u],r):n[u]=t[u]):n[u]=t[u]}),n):t}e.mixin=_;function v(n,t){if(n===t)return!0;if(n==null||t===null||t===void 0||typeof n!=typeof t||typeof n!="object"||Array.isArray(n)!==Array.isArray(t))return!1;let r,u;if(Array.isArray(n)){if(n.length!==t.length)return!1;for(r=0;r<n.length;r++)if(!v(n[r],t[r]))return!1}else{const f=[];for(u in n)f.push(u);f.sort();const c=[];for(u in t)c.push(u);if(c.sort(),!v(f,c))return!1;for(r=0;r<f.length;r++)if(!v(n[f[r]],t[f[r]]))return!1}return!0}e.equals=v;function b(n){let t=[];for(;Object.prototype!==n;)t=t.concat(Object.getOwnPropertyNames(n)),n=Object.getPrototypeOf(n);return t}e.getAllPropertyNames=b;function a(n){const t=[];for(const r of b(n))typeof n[r]=="function"&&t.push(r);return t}e.getAllMethodNames=a;function i(n,t){const r=f=>function(){const c=Array.prototype.slice.call(arguments,0);return t(f,c)},u={};for(const f of n)u[f]=r(f);return u}e.createProxyObject=i}),define(se[28],oe([1,0,26]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ThemeIcon=e.ThemeColor=void 0;var k;(function(E){function S(p){return p&&typeof p=="object"&&typeof p.id=="string"}E.isThemeColor=S})(k||(e.ThemeColor=k={}));var y;(function(E){E.iconNameSegment="[A-Za-z0-9]+",E.iconNameExpression="[A-Za-z0-9-]+",E.iconModifierExpression="~[A-Za-z]+",E.iconNameCharacter="[A-Za-z0-9~-]";const S=new RegExp(`^(${E.iconNameExpression})(${E.iconModifierExpression})?$`);function p(f){const c=S.exec(f.id);if(!c)return p(L.Codicon.error);const[,d,s]=c,l=["codicon","codicon-"+d];return s&&l.push("codicon-modifier-"+s.substring(1)),l}E.asClassNameArray=p;function _(f){return p(f).join(" ")}E.asClassName=_;function v(f){return"."+p(f).join(".")}E.asCSSSelector=v;function b(f){return f&&typeof f=="object"&&typeof f.id=="string"&&(typeof f.color>"u"||k.isThemeColor(f.color))}E.isThemeIcon=b;const a=new RegExp(`^\\$\\((${E.iconNameExpression}(?:${E.iconModifierExpression})?)\\)$`);function i(f){const c=a.exec(f);if(!c)return;const[,d]=c;return{id:d}}E.fromString=i;function n(f){return{id:f}}E.fromId=n;function t(f,c){let d=f.id;const s=d.lastIndexOf("~");return s!==-1&&(d=d.substring(0,s)),c&&(d=`${d}~${c}`),{id:d}}E.modify=t;function r(f){const c=f.id.lastIndexOf("~");if(c!==-1)return f.id.substring(c+1)}E.getModifier=r;function u(f,c){var d,s;return f.id===c.id&&((d=f.color)===null||d===void 0?void 0:d.id)===((s=c.color)===null||s===void 0?void 0:s.id)}E.isEqual=u})(y||(e.ThemeIcon=y={}))}),define(se[126],oe([1,0,71,11,28]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.matchesFuzzyIconAware=e.parseLabelWithIcons=e.getCodiconAriaLabel=e.stripIcons=e.markdownEscapeEscapedIcons=e.escapeIcons=void 0;const E="$(",S=new RegExp(`\\$\\(${y.ThemeIcon.iconNameExpression}(?:${y.ThemeIcon.iconModifierExpression})?\\)`,"g"),p=new RegExp(`(\\\\)?${S.source}`,"g");function _(f){return f.replace(p,(c,d)=>d?c:`\\${c}`)}e.escapeIcons=_;const v=new RegExp(`\\\\${S.source}`,"g");function b(f){return f.replace(v,c=>`\\${c}`)}e.markdownEscapeEscapedIcons=b;const a=new RegExp(`(\\s)?(\\\\)?${S.source}(\\s)?`,"g");function i(f){return f.indexOf(E)===-1?f:f.replace(a,(c,d,s,l)=>s?c:d||l||"")}e.stripIcons=i;function n(f){return f?f.replace(/\$\((.*?)\)/g,(c,d)=>` ${d} `).trim():""}e.getCodiconAriaLabel=n;const t=new RegExp(`\\$\\(${y.ThemeIcon.iconNameCharacter}+\\)`,"g");function r(f){t.lastIndex=0;let c="";const d=[];let s=0;for(;;){const l=t.lastIndex,o=t.exec(f),g=f.substring(l,o?.index);if(g.length>0){c+=g;for(let h=0;h<g.length;h++)d.push(s)}if(!o)break;s+=o[0].length}return{text:c,iconOffsets:d}}e.parseLabelWithIcons=r;function u(f,c,d=!1){const{text:s,iconOffsets:l}=c;if(!l||l.length===0)return(0,L.matchesFuzzy)(f,s,d);const o=(0,k.ltrim)(s," "),g=s.length-o.length,h=(0,L.matchesFuzzy)(f,o,d);if(h)for(const m of h){const C=l[m.start+g]+g;m.start+=C,m.end+=C}return h}e.matchesFuzzyIconAware=u}),define(se[174],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toUint32=e.toUint8=void 0;function L(y){return y<0?0:y>255?255:y|0}e.toUint8=L;function k(y){return y<0?0:y>4294967295?4294967295:y|0}e.toUint32=k}),define(se[175],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.generateUuid=void 0,e.generateUuid=function(){if(typeof crypto=="object"&&typeof crypto.randomUUID=="function")return crypto.randomUUID.bind(crypto);let L;typeof crypto=="object"&&typeof crypto.getRandomValues=="function"?L=crypto.getRandomValues.bind(crypto):L=function(E){for(let S=0;S<E.length;S++)E[S]=Math.floor(Math.random()*256);return E};const k=new Uint8Array(16),y=[];for(let E=0;E<256;E++)y.push(E.toString(16).padStart(2,"0"));return function(){L(k),k[6]=k[6]&15|64,k[8]=k[8]&63|128;let S=0,p="";return p+=y[k[S++]],p+=y[k[S++]],p+=y[k[S++]],p+=y[k[S++]],p+="-",p+=y[k[S++]],p+=y[k[S++]],p+="-",p+=y[k[S++]],p+=y[k[S++]],p+="-",p+=y[k[S++]],p+=y[k[S++]],p+="-",p+=y[k[S++]],p+=y[k[S++]],p+=y[k[S++]],p+=y[k[S++]],p+=y[k[S++]],p+=y[k[S++]],p}}()}),define(se[176],oe([1,0,13,52,175]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UriList=e.matchesMimeType=e.VSDataTransfer=e.createFileDataTransferItem=e.createStringDataTransferItem=void 0;function E(a){return{asString:async()=>a,asFile:()=>{},value:typeof a=="string"?a:void 0}}e.createStringDataTransferItem=E;function S(a,i,n){const t={id:(0,y.generateUuid)(),name:a,uri:i,data:n};return{asString:async()=>"",asFile:()=>t,value:void 0}}e.createFileDataTransferItem=S;class p{constructor(){this._entries=new Map}get size(){let i=0;for(const n of this._entries)i++;return i}has(i){return this._entries.has(this.toKey(i))}matches(i){const n=[...this._entries.keys()];return k.Iterable.some(this,([t,r])=>r.asFile())&&n.push("files"),b(_(i),n)}get(i){var n;return(n=this._entries.get(this.toKey(i)))===null||n===void 0?void 0:n[0]}append(i,n){const t=this._entries.get(i);t?t.push(n):this._entries.set(this.toKey(i),[n])}replace(i,n){this._entries.set(this.toKey(i),[n])}delete(i){this._entries.delete(this.toKey(i))}*[Symbol.iterator](){for(const[i,n]of this._entries)for(const t of n)yield[i,t]}toKey(i){return _(i)}}e.VSDataTransfer=p;function _(a){return a.toLowerCase()}function v(a,i){return b(_(a),i.map(_))}e.matchesMimeType=v;function b(a,i){if(a==="*/*")return i.length>0;if(i.includes(a))return!0;const n=a.match(/^([a-z]+)\/([a-z]+|\*)$/i);if(!n)return!1;const[t,r,u]=n;return u==="*"?i.some(f=>f.startsWith(r+"/")):!1}e.UriList=Object.freeze({create:a=>(0,L.distinct)(a.map(i=>i.toString())).join(`\r
+`),split:a=>a.split(`\r
+`),parse:a=>e.UriList.split(a).filter(i=>!i.startsWith("#"))})}),define(se[272],oe([9]),{}),define(se[408],oe([9]),{}),define(se[409],oe([9]),{}),define(se[410],oe([9]),{}),define(se[411],oe([9]),{}),define(se[177],oe([1,0,410,411]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0})}),define(se[412],oe([9]),{}),define(se[413],oe([9]),{}),define(se[273],oe([9]),{}),define(se[274],oe([9]),{}),define(se[414],oe([9]),{}),define(se[415],oe([9]),{}),define(se[416],oe([9]),{}),define(se[417],oe([9]),{}),define(se[275],oe([9]),{}),define(se[418],oe([9]),{}),define(se[200],oe([1,0,418]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME=void 0,e.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME="monaco-mouse-cursor-text"}),define(se[419],oe([9]),{}),define(se[420],oe([9]),{}),define(se[421],oe([9]),{}),define(se[422],oe([9]),{}),define(se[423],oe([9]),{}),define(se[424],oe([9]),{}),define(se[425],oe([9]),{}),define(se[426],oe([9]),{}),define(se[427],oe([9]),{}),define(se[428],oe([9]),{}),define(se[429],oe([9]),{}),define(se[430],oe([9]),{}),define(se[431],oe([9]),{}),define(se[432],oe([9]),{}),define(se[433],oe([9]),{}),define(se[434],oe([9]),{}),define(se[435],oe([9]),{}),define(se[436],oe([9]),{}),define(se[437],oe([9]),{}),define(se[438],oe([9]),{}),define(se[439],oe([9]),{}),define(se[440],oe([9]),{}),define(se[441],oe([9]),{}),define(se[442],oe([9]),{}),define(se[443],oe([9]),{}),define(se[444],oe([9]),{}),define(se[445],oe([9]),{}),define(se[446],oe([9]),{}),define(se[447],oe([9]),{}),define(se[448],oe([9]),{}),define(se[449],oe([9]),{}),define(se[450],oe([9]),{}),define(se[451],oe([9]),{}),define(se[452],oe([9]),{}),define(se[453],oe([9]),{}),define(se[454],oe([9]),{}),define(se[455],oe([9]),{}),define(se[456],oe([9]),{}),define(se[201],oe([9]),{}),define(se[457],oe([9]),{}),define(se[458],oe([9]),{}),define(se[459],oe([9]),{}),define(se[460],oe([9]),{}),define(se[461],oe([9]),{}),define(se[462],oe([9]),{}),define(se[463],oe([9]),{}),define(se[464],oe([9]),{}),define(se[465],oe([9]),{}),define(se[466],oe([9]),{}),define(se[467],oe([9]),{}),define(se[468],oe([9]),{}),define(se[469],oe([9]),{}),define(se[470],oe([9]),{}),define(se[471],oe([9]),{}),define(se[472],oe([9]),{}),define(se[473],oe([9]),{}),define(se[474],oe([9]),{}),define(se[475],oe([9]),{}),define(se[476],oe([9]),{}),define(se[477],oe([9]),{}),define(se[478],oe([9]),{}),define(se[479],oe([9]),{}),define(se[480],oe([9]),{}),define(se[481],oe([9]),{}),define(se[482],oe([9]),{}),define(se[483],oe([9]),{}),define(se[484],oe([9]),{}),define(se[485],oe([9]),{}),define(se[486],oe([9]),{}),define(se[487],oe([9]),{}),define(se[276],oe([9]),{}),define(se[488],oe([9]),{}),define(se[489],oe([9]),{}),define(se[178],oe([9]),{}),define(se[490],oe([9]),{}),define(se[72],oe([1,0,40]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.applyFontInfo=void 0;function k(y,E){y instanceof L.FastDomNode?(y.setFontFamily(E.getMassagedFontFamily()),y.setFontWeight(E.fontWeight),y.setFontSize(E.fontSize),y.setFontFeatureSettings(E.fontFeatureSettings),y.setFontVariationSettings(E.fontVariationSettings),y.setLineHeight(E.lineHeight),y.setLetterSpacing(E.letterSpacing)):(y.style.fontFamily=E.getMassagedFontFamily(),y.style.fontWeight=E.fontWeight,y.style.fontSize=E.fontSize+"px",y.style.fontFeatureSettings=E.fontFeatureSettings,y.style.fontVariationSettings=E.fontVariationSettings,y.style.lineHeight=E.lineHeight+"px",y.style.letterSpacing=E.letterSpacing+"px")}e.applyFontInfo=k}),define(se[491],oe([1,0,44,72]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.readCharWidths=e.CharWidthRequest=void 0;class y{constructor(_,v){this.chr=_,this.type=v,this.width=0}fulfill(_){this.width=_}}e.CharWidthRequest=y;class E{constructor(_,v){this._bareFontInfo=_,this._requests=v,this._container=null,this._testElements=null}read(){this._createDomElements(),L.$window.document.body.appendChild(this._container),this._readFromDomElements(),L.$window.document.body.removeChild(this._container),this._container=null,this._testElements=null}_createDomElements(){const _=document.createElement("div");_.style.position="absolute",_.style.top="-50000px",_.style.width="50000px";const v=document.createElement("div");(0,k.applyFontInfo)(v,this._bareFontInfo),_.appendChild(v);const b=document.createElement("div");(0,k.applyFontInfo)(b,this._bareFontInfo),b.style.fontWeight="bold",_.appendChild(b);const a=document.createElement("div");(0,k.applyFontInfo)(a,this._bareFontInfo),a.style.fontStyle="italic",_.appendChild(a);const i=[];for(const n of this._requests){let t;n.type===0&&(t=v),n.type===2&&(t=b),n.type===1&&(t=a),t.appendChild(document.createElement("br"));const r=document.createElement("span");E._render(r,n),t.appendChild(r),i.push(r)}this._container=_,this._testElements=i}static _render(_,v){if(v.chr===" "){let b="\xA0";for(let a=0;a<8;a++)b+=b;_.innerText=b}else{let b=v.chr;for(let a=0;a<8;a++)b+=b;_.textContent=b}}_readFromDomElements(){for(let _=0,v=this._requests.length;_<v;_++){const b=this._requests[_],a=this._testElements[_];b.fulfill(a.offsetWidth/256)}}}function S(p,_){new E(p,_).read()}e.readCharWidths=S}),define(se[492],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.migrateOptions=e.EditorSettingMigration=void 0;class L{constructor(_,v){this.key=_,this.migrate=v}apply(_){const v=L._read(_,this.key),b=i=>L._read(_,i),a=(i,n)=>L._write(_,i,n);this.migrate(v,b,a)}static _read(_,v){if(typeof _>"u")return;const b=v.indexOf(".");if(b>=0){const a=v.substring(0,b);return this._read(_[a],v.substring(b+1))}return _[v]}static _write(_,v,b){const a=v.indexOf(".");if(a>=0){const i=v.substring(0,a);_[i]=_[i]||{},this._write(_[i],v.substring(a+1),b);return}_[v]=b}}e.EditorSettingMigration=L,L.items=[];function k(p,_){L.items.push(new L(p,_))}function y(p,_){k(p,(v,b,a)=>{if(typeof v<"u"){for(const[i,n]of _)if(v===i){a(p,n);return}}})}function E(p){L.items.forEach(_=>_.apply(p))}e.migrateOptions=E,y("wordWrap",[[!0,"on"],[!1,"off"]]),y("lineNumbers",[[!0,"on"],[!1,"off"]]),y("cursorBlinking",[["visible","solid"]]),y("renderWhitespace",[[!0,"boundary"],[!1,"none"]]),y("renderLineHighlight",[[!0,"line"],[!1,"none"]]),y("acceptSuggestionOnEnter",[[!0,"on"],[!1,"off"]]),y("tabCompletion",[[!1,"off"],[!0,"onlySnippets"]]),y("hover",[[!0,{enabled:!0}],[!1,{enabled:!1}]]),y("parameterHints",[[!0,{enabled:!0}],[!1,{enabled:!1}]]),y("autoIndent",[[!1,"advanced"],[!0,"full"]]),y("matchBrackets",[[!0,"always"],[!1,"never"]]),y("renderFinalNewline",[[!0,"on"],[!1,"off"]]),y("cursorSmoothCaretAnimation",[[!0,"on"],[!1,"off"]]),y("occurrencesHighlight",[[!0,"singleFile"],[!1,"off"]]),y("wordBasedSuggestions",[[!0,"matchingDocuments"],[!1,"off"]]),k("autoClosingBrackets",(p,_,v)=>{p===!1&&(v("autoClosingBrackets","never"),typeof _("autoClosingQuotes")>"u"&&v("autoClosingQuotes","never"),typeof _("autoSurround")>"u"&&v("autoSurround","never"))}),k("renderIndentGuides",(p,_,v)=>{typeof p<"u"&&(v("renderIndentGuides",void 0),typeof _("guides.indentation")>"u"&&v("guides.indentation",!!p))}),k("highlightActiveIndentGuide",(p,_,v)=>{typeof p<"u"&&(v("highlightActiveIndentGuide",void 0),typeof _("guides.highlightActiveIndentation")>"u"&&v("guides.highlightActiveIndentation",!!p))});const S={method:"showMethods",function:"showFunctions",constructor:"showConstructors",deprecated:"showDeprecated",field:"showFields",variable:"showVariables",class:"showClasses",struct:"showStructs",interface:"showInterfaces",module:"showModules",property:"showProperties",event:"showEvents",operator:"showOperators",unit:"showUnits",value:"showValues",constant:"showConstants",enum:"showEnums",enumMember:"showEnumMembers",keyword:"showKeywords",text:"showWords",color:"showColors",file:"showFiles",reference:"showReferences",folder:"showFolders",typeParameter:"showTypeParameters",snippet:"showSnippets"};k("suggest.filteredTypes",(p,_,v)=>{if(p&&typeof p=="object"){for(const b of Object.entries(S))p[b[0]]===!1&&typeof _(`suggest.${b[1]}`)>"u"&&v(`suggest.${b[1]}`,!1);v("suggest.filteredTypes",void 0)}}),k("quickSuggestions",(p,_,v)=>{if(typeof p=="boolean"){const b=p?"on":"off";v("quickSuggestions",{comments:b,strings:b,other:b})}}),k("experimental.stickyScroll.enabled",(p,_,v)=>{typeof p=="boolean"&&(v("experimental.stickyScroll.enabled",void 0),typeof _("stickyScroll.enabled")>"u"&&v("stickyScroll.enabled",p))}),k("experimental.stickyScroll.maxLineCount",(p,_,v)=>{typeof p=="number"&&(v("experimental.stickyScroll.maxLineCount",void 0),typeof _("stickyScroll.maxLineCount")>"u"&&v("stickyScroll.maxLineCount",p))}),k("codeActionsOnSave",(p,_,v)=>{if(p&&typeof p=="object"){let b=!1;const a={};for(const i of Object.entries(p))typeof i[1]=="boolean"?(b=!0,a[i[0]]=i[1]?"explicit":"never"):a[i[0]]=i[1];b&&v("codeActionsOnSave",a)}}),k("codeActionWidget.includeNearbyQuickfixes",(p,_,v)=>{typeof p=="boolean"&&(v("codeActionWidget.includeNearbyQuickfixes",void 0),typeof _("codeActionWidget.includeNearbyQuickFixes")>"u"&&v("codeActionWidget.includeNearbyQuickFixes",p))}),k("lightbulb.enabled",(p,_,v)=>{typeof p=="boolean"&&v("lightbulb.enabled",p?void 0:"off")})}),define(se[202],oe([1,0,6]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TabFocus=void 0;class k{constructor(){this._tabFocus=!1,this._onDidChangeTabFocus=new L.Emitter,this.onDidChangeTabFocus=this._onDidChangeTabFocus.event}getTabFocusMode(){return this._tabFocus}setTabFocusMode(E){this._tabFocus=E,this._onDidChangeTabFocus.fire(this._tabFocus)}}e.TabFocus=new k}),define(se[127],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StableEditorScrollState=void 0;class L{static capture(y){if(y.getScrollTop()===0||y.hasPendingScrollAnimation())return new L(y.getScrollTop(),y.getContentHeight(),null,0,null);let E=null,S=0;const p=y.getVisibleRanges();if(p.length>0){E=p[0].getStartPosition();const _=y.getTopForPosition(E.lineNumber,E.column);S=y.getScrollTop()-_}return new L(y.getScrollTop(),y.getContentHeight(),E,S,y.getPosition())}constructor(y,E,S,p,_){this._initialScrollTop=y,this._initialContentHeight=E,this._visiblePosition=S,this._visiblePositionScrollDelta=p,this._cursorPosition=_}restore(y){if(!(this._initialContentHeight===y.getContentHeight()&&this._initialScrollTop===y.getScrollTop())&&this._visiblePosition){const E=y.getTopForPosition(this._visiblePosition.lineNumber,this._visiblePosition.column);y.setScrollTop(E+this._visiblePositionScrollDelta)}}restoreRelativeVerticalPositionOfCursor(y){if(this._initialContentHeight===y.getContentHeight()&&this._initialScrollTop===y.getScrollTop())return;const E=y.getPosition();if(!this._cursorPosition||!E)return;const S=y.getTopForLineNumber(E.lineNumber)-y.getTopForLineNumber(this._cursorPosition.lineNumber);y.setScrollTop(y.getScrollTop()+S)}}e.StableEditorScrollState=L}),define(se[148],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.VisibleRanges=e.HorizontalPosition=e.FloatHorizontalRange=e.HorizontalRange=e.LineVisibleRanges=e.RenderingContext=e.RestrictedRenderingContext=void 0;class L{constructor(b,a){this._restrictedRenderingContextBrand=void 0,this._viewLayout=b,this.viewportData=a,this.scrollWidth=this._viewLayout.getScrollWidth(),this.scrollHeight=this._viewLayout.getScrollHeight(),this.visibleRange=this.viewportData.visibleRange,this.bigNumbersDelta=this.viewportData.bigNumbersDelta;const i=this._viewLayout.getCurrentViewport();this.scrollTop=i.top,this.scrollLeft=i.left,this.viewportWidth=i.width,this.viewportHeight=i.height}getScrolledTopFromAbsoluteTop(b){return b-this.scrollTop}getVerticalOffsetForLineNumber(b,a){return this._viewLayout.getVerticalOffsetForLineNumber(b,a)}getVerticalOffsetAfterLineNumber(b,a){return this._viewLayout.getVerticalOffsetAfterLineNumber(b,a)}getDecorationsInViewport(){return this.viewportData.getDecorationsInViewport()}}e.RestrictedRenderingContext=L;class k extends L{constructor(b,a,i){super(b,a),this._renderingContextBrand=void 0,this._viewLines=i}linesVisibleRangesForRange(b,a){return this._viewLines.linesVisibleRangesForRange(b,a)}visibleRangeForPosition(b){return this._viewLines.visibleRangeForPosition(b)}}e.RenderingContext=k;class y{constructor(b,a,i,n){this.outsideRenderedLine=b,this.lineNumber=a,this.ranges=i,this.continuesOnNextLine=n}}e.LineVisibleRanges=y;class E{static from(b){const a=new Array(b.length);for(let i=0,n=b.length;i<n;i++){const t=b[i];a[i]=new E(t.left,t.width)}return a}constructor(b,a){this._horizontalRangeBrand=void 0,this.left=Math.round(b),this.width=Math.round(a)}toString(){return`[${this.left},${this.width}]`}}e.HorizontalRange=E;class S{constructor(b,a){this._floatHorizontalRangeBrand=void 0,this.left=b,this.width=a}toString(){return`[${this.left},${this.width}]`}static compare(b,a){return b.left-a.left}}e.FloatHorizontalRange=S;class p{constructor(b,a){this.outsideRenderedLine=b,this.originalLeft=a,this.left=Math.round(this.originalLeft)}}e.HorizontalPosition=p;class _{constructor(b,a){this.outsideRenderedLine=b,this.ranges=a}}e.VisibleRanges=_}),define(se[493],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DomReadingContext=void 0;class L{get didDomLayout(){return this._didDomLayout}readClientRect(){if(!this._clientRectRead){this._clientRectRead=!0;const y=this._domNode.getBoundingClientRect();this.markDidDomLayout(),this._clientRectDeltaLeft=y.left,this._clientRectScale=y.width/this._domNode.offsetWidth}}get clientRectDeltaLeft(){return this._clientRectRead||this.readClientRect(),this._clientRectDeltaLeft}get clientRectScale(){return this._clientRectRead||this.readClientRect(),this._clientRectScale}constructor(y,E){this._domNode=y,this.endNode=E,this._didDomLayout=!1,this._clientRectDeltaLeft=0,this._clientRectScale=1,this._clientRectRead=!1}markDidDomLayout(){this._didDomLayout=!0}}e.DomReadingContext=L}),define(se[494],oe([1,0,148]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RangeUtil=void 0;class k{static _createRange(){return this._handyReadyRange||(this._handyReadyRange=document.createRange()),this._handyReadyRange}static _detachRange(E,S){E.selectNodeContents(S)}static _readClientRects(E,S,p,_,v){const b=this._createRange();try{return b.setStart(E,S),b.setEnd(p,_),b.getClientRects()}catch{return null}finally{this._detachRange(b,v)}}static _mergeAdjacentRanges(E){if(E.length===1)return E;E.sort(L.FloatHorizontalRange.compare);const S=[];let p=0,_=E[0];for(let v=1,b=E.length;v<b;v++){const a=E[v];_.left+_.width+.9>=a.left?_.width=Math.max(_.width,a.left+a.width-_.left):(S[p++]=_,_=a)}return S[p++]=_,S}static _createHorizontalRangesFromClientRects(E,S,p){if(!E||E.length===0)return null;const _=[];for(let v=0,b=E.length;v<b;v++){const a=E[v];_[v]=new L.FloatHorizontalRange(Math.max(0,(a.left-S)/p),a.width/p)}return this._mergeAdjacentRanges(_)}static readHorizontalRanges(E,S,p,_,v,b){const i=E.children.length-1;if(0>i)return null;if(S=Math.min(i,Math.max(0,S)),_=Math.min(i,Math.max(0,_)),S===_&&p===v&&p===0&&!E.children[S].firstChild){const u=E.children[S].getClientRects();return b.markDidDomLayout(),this._createHorizontalRangesFromClientRects(u,b.clientRectDeltaLeft,b.clientRectScale)}S!==_&&_>0&&v===0&&(_--,v=1073741824);let n=E.children[S].firstChild,t=E.children[_].firstChild;if((!n||!t)&&(!n&&p===0&&S>0&&(n=E.children[S-1].firstChild,p=1073741824),!t&&v===0&&_>0&&(t=E.children[_-1].firstChild,v=1073741824)),!n||!t)return null;p=Math.min(n.textContent.length,Math.max(0,p)),v=Math.min(t.textContent.length,Math.max(0,v));const r=this._readClientRects(n,p,t,v,b.endNode);return b.markDidDomLayout(),this._createHorizontalRangesFromClientRects(r,b.clientRectDeltaLeft,b.clientRectScale)}}e.RangeUtil=k}),define(se[277],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getCharIndex=e.allCharCodes=void 0,e.allCharCodes=(()=>{const k=[];for(let y=32;y<=126;y++)k.push(y);return k.push(65533),k})();const L=(k,y)=>(k-=32,k<0||k>96?y<=2?(k+96)%96:96-1:k);e.getCharIndex=L}),define(se[495],oe([1,0,277,174]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MinimapCharRenderer=void 0;class y{constructor(S,p){this.scale=p,this._minimapCharRendererBrand=void 0,this.charDataNormal=y.soften(S,12/15),this.charDataLight=y.soften(S,50/60)}static soften(S,p){const _=new Uint8ClampedArray(S.length);for(let v=0,b=S.length;v<b;v++)_[v]=(0,k.toUint8)(S[v]*p);return _}renderChar(S,p,_,v,b,a,i,n,t,r,u){const f=1*this.scale,c=2*this.scale,d=u?1:c;if(p+f>S.width||_+d>S.height){console.warn("bad render request outside image data");return}const s=r?this.charDataLight:this.charDataNormal,l=(0,L.getCharIndex)(v,t),o=S.width*4,g=i.r,h=i.g,m=i.b,C=b.r-g,w=b.g-h,D=b.b-m,I=Math.max(a,n),T=S.data;let A=l*f*c,P=_*o+p*4;for(let N=0;N<d;N++){let M=P;for(let R=0;R<f;R++){const x=s[A++]/255*(a/255);T[M++]=g+C*x,T[M++]=h+w*x,T[M++]=m+D*x,T[M++]=I}P+=o}}blockRenderChar(S,p,_,v,b,a,i,n){const t=1*this.scale,r=2*this.scale,u=n?1:r;if(p+t>S.width||_+u>S.height){console.warn("bad render request outside image data");return}const f=S.width*4,c=.5*(b/255),d=a.r,s=a.g,l=a.b,o=v.r-d,g=v.g-s,h=v.b-l,m=d+o*c,C=s+g*c,w=l+h*c,D=Math.max(b,i),I=S.data;let T=_*f+p*4;for(let A=0;A<u;A++){let P=T;for(let N=0;N<t;N++)I[P++]=m,I[P++]=C,I[P++]=w,I[P++]=D;T+=f}}}e.MinimapCharRenderer=y}),define(se[496],oe([1,0,108]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.prebakedMiniMaps=void 0;const k={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15},y=E=>{const S=new Uint8ClampedArray(E.length/2);for(let p=0;p<E.length;p+=2)S[p>>1]=k[E[p]]<<4|k[E[p+1]]&15;return S};e.prebakedMiniMaps={1:(0,L.createSingleCallFunction)(()=>y("0000511D6300CF609C709645A78432005642574171487021003C451900274D35D762755E8B629C5BA856AF57BA649530C167D1512A272A3F6038604460398526BCA2A968DB6F8957C768BE5FBE2FB467CF5D8D5B795DC7625B5DFF50DE64C466DB2FC47CD860A65E9A2EB96CB54CE06DA763AB2EA26860524D3763536601005116008177A8705E53AB738E6A982F88BAA35B5F5B626D9C636B449B737E5B7B678598869A662F6B5B8542706C704C80736A607578685B70594A49715A4522E792")),2:(0,L.createSingleCallFunction)(()=>y("000000000000000055394F383D2800008B8B1F210002000081B1CBCBCC820000847AAF6B9AAF2119BE08B8881AD60000A44FD07DCCF107015338130C00000000385972265F390B406E2437634B4B48031B12B8A0847000001E15B29A402F0000000000004B33460B00007A752C2A0000000000004D3900000084394B82013400ABA5CFC7AD9C0302A45A3E5A98AB000089A43382D97900008BA54AA087A70A0248A6A7AE6DBE0000BF6F94987EA40A01A06DCFA7A7A9030496C32F77891D0000A99FB1A0AFA80603B29AB9CA75930D010C0948354D3900000C0948354F37460D0028BE673D8400000000AF9D7B6E00002B007AA8933400007AA642675C2700007984CFB9C3985B768772A8A6B7B20000CAAECAAFC4B700009F94A6009F840009D09F9BA4CA9C0000CC8FC76DC87F0000C991C472A2000000A894A48CA7B501079BA2C9C69BA20000B19A5D3FA89000005CA6009DA2960901B0A7F0669FB200009D009E00B7890000DAD0F5D092820000D294D4C48BD10000B5A7A4A3B1A50402CAB6CBA6A2000000B5A7A4A3B1A8044FCDADD19D9CB00000B7778F7B8AAE0803C9AB5D3F5D3F00009EA09EA0BAB006039EA0989A8C7900009B9EF4D6B7C00000A9A7816CACA80000ABAC84705D3F000096DA635CDC8C00006F486F266F263D4784006124097B00374F6D2D6D2D6D4A3A95872322000000030000000000008D8939130000000000002E22A5C9CBC70600AB25C0B5C9B400061A2DB04CA67001082AA6BEBEBFC606002321DACBC19E03087AA08B6768380000282FBAC0B8CA7A88AD25BBA5A29900004C396C5894A6000040485A6E356E9442A32CD17EADA70000B4237923628600003E2DE9C1D7B500002F25BBA5A2990000231DB6AFB4A804023025C0B5CAB588062B2CBDBEC0C706882435A75CA20000002326BD6A82A908048B4B9A5A668000002423A09CB4BB060025259C9D8A7900001C1FCAB2C7C700002A2A9387ABA200002626A4A47D6E9D14333163A0C87500004B6F9C2D643A257049364936493647358A34438355497F1A0000A24C1D590000D38DFFBDD4CD3126"))}}),define(se[497],oe([1,0,495,277,496,174]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MinimapCharRendererFactory=void 0;class S{static create(_,v){if(this.lastCreated&&_===this.lastCreated.scale&&v===this.lastFontFamily)return this.lastCreated;let b;return y.prebakedMiniMaps[_]?b=new L.MinimapCharRenderer(y.prebakedMiniMaps[_](),_):b=S.createFromSampleData(S.createSampleData(v).data,_),this.lastFontFamily=v,this.lastCreated=b,b}static createSampleData(_){const v=document.createElement("canvas"),b=v.getContext("2d");v.style.height="16px",v.height=16,v.width=96*10,v.style.width=96*10+"px",b.fillStyle="#ffffff",b.font=`bold 16px ${_}`,b.textBaseline="middle";let a=0;for(const i of k.allCharCodes)b.fillText(String.fromCharCode(i),a,16/2),a+=10;return b.getImageData(0,0,96*10,16)}static createFromSampleData(_,v){if(_.length!==61440)throw new Error("Unexpected source in MinimapCharRenderer");const a=S._downsample(_,v);return new L.MinimapCharRenderer(a,v)}static _downsampleChar(_,v,b,a,i){const n=1*i,t=2*i;let r=a,u=0;for(let f=0;f<t;f++){const c=f/t*16,d=(f+1)/t*16;for(let s=0;s<n;s++){const l=s/n*10,o=(s+1)/n*10;let g=0,h=0;for(let C=c;C<d;C++){const w=v+Math.floor(C)*3840,D=1-(C-Math.floor(C));for(let I=l;I<o;I++){const T=1-(I-Math.floor(I)),A=w+Math.floor(I)*4,P=T*D;h+=P,g+=_[A]*_[A+3]/255*P}}const m=g/h;u=Math.max(u,m),b[r++]=(0,E.toUint8)(m)}}return u}static _downsample(_,v){const b=2*v*1*v,a=b*96,i=new Uint8ClampedArray(a);let n=0,t=0,r=0;for(let u=0;u<96;u++)r=Math.max(r,this._downsampleChar(_,t,i,n,v)),n+=b,t+=10*4;if(r>0){const u=255/r;for(let f=0;f<a;f++)i[f]*=u}return i}}e.MinimapCharRendererFactory=S}),define(se[498],oe([1,0,6,2]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DelegatingEditor=void 0;class y extends k.Disposable{constructor(){super(...arguments),this._id=++y.idCounter,this._onDidDispose=this._register(new L.Emitter),this.onDidDispose=this._onDidDispose.event}getId(){return this.getEditorType()+":v2:"+this._id}getVisibleColumnFromPosition(S){return this._targetEditor.getVisibleColumnFromPosition(S)}getPosition(){return this._targetEditor.getPosition()}setPosition(S,p="api"){this._targetEditor.setPosition(S,p)}revealLine(S,p=0){this._targetEditor.revealLine(S,p)}revealLineInCenter(S,p=0){this._targetEditor.revealLineInCenter(S,p)}revealLineInCenterIfOutsideViewport(S,p=0){this._targetEditor.revealLineInCenterIfOutsideViewport(S,p)}revealLineNearTop(S,p=0){this._targetEditor.revealLineNearTop(S,p)}revealPosition(S,p=0){this._targetEditor.revealPosition(S,p)}revealPositionInCenter(S,p=0){this._targetEditor.revealPositionInCenter(S,p)}revealPositionInCenterIfOutsideViewport(S,p=0){this._targetEditor.revealPositionInCenterIfOutsideViewport(S,p)}revealPositionNearTop(S,p=0){this._targetEditor.revealPositionNearTop(S,p)}getSelection(){return this._targetEditor.getSelection()}getSelections(){return this._targetEditor.getSelections()}setSelection(S,p="api"){this._targetEditor.setSelection(S,p)}setSelections(S,p="api"){this._targetEditor.setSelections(S,p)}revealLines(S,p,_=0){this._targetEditor.revealLines(S,p,_)}revealLinesInCenter(S,p,_=0){this._targetEditor.revealLinesInCenter(S,p,_)}revealLinesInCenterIfOutsideViewport(S,p,_=0){this._targetEditor.revealLinesInCenterIfOutsideViewport(S,p,_)}revealLinesNearTop(S,p,_=0){this._targetEditor.revealLinesNearTop(S,p,_)}revealRange(S,p=0,_=!1,v=!0){this._targetEditor.revealRange(S,p,_,v)}revealRangeInCenter(S,p=0){this._targetEditor.revealRangeInCenter(S,p)}revealRangeInCenterIfOutsideViewport(S,p=0){this._targetEditor.revealRangeInCenterIfOutsideViewport(S,p)}revealRangeNearTop(S,p=0){this._targetEditor.revealRangeNearTop(S,p)}revealRangeNearTopIfOutsideViewport(S,p=0){this._targetEditor.revealRangeNearTopIfOutsideViewport(S,p)}revealRangeAtTop(S,p=0){this._targetEditor.revealRangeAtTop(S,p)}getSupportedActions(){return this._targetEditor.getSupportedActions()}focus(){this._targetEditor.focus()}trigger(S,p,_){this._targetEditor.trigger(S,p,_)}createDecorationsCollection(S){return this._targetEditor.createDecorationsCollection(S)}changeDecorations(S){return this._targetEditor.changeDecorations(S)}}e.DelegatingEditor=y,y.idCounter=0}),define(se[499],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ObjectPool=void 0;class L{constructor(y){this._create=y,this._unused=new Set,this._used=new Set,this._itemData=new Map}getUnusedObj(y){var E;let S;if(this._unused.size===0)S=this._create(y),this._itemData.set(S,y);else{const p=[...this._unused.values()];S=(E=p.find(_=>this._itemData.get(_).getId()===y.getId()))!==null&&E!==void 0?E:p[0],this._unused.delete(S),this._itemData.set(S,y),S.setData(y)}return this._used.add(S),{object:S,dispose:()=>{this._used.delete(S),this._unused.size>5?S.dispose():this._unused.add(S)}}}dispose(){for(const y of this._used)y.dispose();for(const y of this._unused)y.dispose();this._used.clear(),this._unused.clear()}}e.ObjectPool=L}),define(se[278],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.diffEditorDefaultOptions=void 0,e.diffEditorDefaultOptions={enableSplitViewResizing:!0,splitViewDefaultRatio:.5,renderSideBySide:!0,renderMarginRevertIcon:!0,maxComputationTime:5e3,maxFileSize:50,ignoreTrimWhitespace:!0,renderIndicators:!0,originalEditable:!1,diffCodeLens:!1,renderOverviewRuler:!0,diffWordWrap:"inherit",diffAlgorithm:"advanced",accessibilityVerbose:!1,experimental:{showMoves:!1,showEmptyDecorations:!0},hideUnchangedRegions:{enabled:!1,contextLineCount:3,minimumLineCount:3,revealLineCount:20},isInEmbeddedEditor:!1,onlyShowAccessibleDiffViewer:!1,renderSideBySideInlineBreakpoint:900,useInlineViewWhenSpaceIsLimited:!0}}),define(se[149],oe([1,0,6]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorZoom=void 0,e.EditorZoom=new class{constructor(){this._zoomLevel=0,this._onDidChangeZoomLevel=new L.Emitter,this.onDidChangeZoomLevel=this._onDidChangeZoomLevel.event}getZoomLevel(){return this._zoomLevel}setZoomLevel(k){k=Math.min(Math.max(-5,k),20),this._zoomLevel!==k&&(this._zoomLevel=k,this._onDidChangeZoomLevel.fire(this._zoomLevel))}}}),define(se[128],oe([1,0,174]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CharacterSet=e.CharacterClassifier=void 0;class k{constructor(S){const p=(0,L.toUint8)(S);this._defaultValue=p,this._asciiMap=k._createAsciiMap(p),this._map=new Map}static _createAsciiMap(S){const p=new Uint8Array(256);return p.fill(S),p}set(S,p){const _=(0,L.toUint8)(p);S>=0&&S<256?this._asciiMap[S]=_:this._map.set(S,_)}get(S){return S>=0&&S<256?this._asciiMap[S]:this._map.get(S)||this._defaultValue}clear(){this._asciiMap.fill(this._defaultValue),this._map.clear()}}e.CharacterClassifier=k;class y{constructor(){this._actual=new k(0)}add(S){this._actual.set(S,1)}has(S){return this._actual.get(S)===1}clear(){return this._actual.clear()}}e.CharacterSet=y}),define(se[85],oe([1,0,11]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorColumns=void 0;class k{static _nextVisibleColumn(E,S,p){return E===9?k.nextRenderTabStop(S,p):L.isFullWidthCharacter(E)||L.isEmojiImprecise(E)?S+2:S+1}static visibleColumnFromColumn(E,S,p){const _=Math.min(S-1,E.length),v=E.substring(0,_),b=new L.GraphemeIterator(v);let a=0;for(;!b.eol();){const i=L.getNextCodePoint(v,_,b.offset);b.nextGraphemeLength(),a=this._nextVisibleColumn(i,a,p)}return a}static columnFromVisibleColumn(E,S,p){if(S<=0)return 1;const _=E.length,v=new L.GraphemeIterator(E);let b=0,a=1;for(;!v.eol();){const i=L.getNextCodePoint(E,_,v.offset);v.nextGraphemeLength();const n=this._nextVisibleColumn(i,b,p),t=v.offset+1;if(n>=S){const r=S-b;return n-S<r?t:a}b=n,a=t}return _+1}static nextRenderTabStop(E,S){return E+S-E%S}static nextIndentTabStop(E,S){return E+S-E%S}static prevRenderTabStop(E,S){return Math.max(0,E-1-(E-1)%S)}static prevIndentTabStop(E,S){return Math.max(0,E-1-(E-1)%S)}}e.CursorColumns=k}),define(se[129],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.countEOL=void 0;function L(k){let y=0,E=0,S=0,p=0;for(let _=0,v=k.length;_<v;_++){const b=k.charCodeAt(_);b===13?(y===0&&(E=_),y++,_+1<v&&k.charCodeAt(_+1)===10?(p|=2,_++):p|=3,S=_+1):b===10&&(p|=1,y===0&&(E=_),y++,S=_+1)}return y===0&&(E=k.length),[y,E,k.length-S,p]}e.countEOL=L}),define(se[203],oe([1,0,11,85]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.normalizeIndentation=void 0;function y(S,p,_){let v=0;for(let a=0;a<S.length;a++)S.charAt(a)==="	"?v=k.CursorColumns.nextIndentTabStop(v,p):v++;let b="";if(!_){const a=Math.floor(v/p);v=v%p;for(let i=0;i<a;i++)b+="	"}for(let a=0;a<v;a++)b+=" ";return b}function E(S,p,_){let v=L.firstNonWhitespaceIndex(S);return v===-1&&(v=S.length),y(S.substring(0,v),p,_)+S.substring(v)}e.normalizeIndentation=E}),define(se[73],oe([1,0,12]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OffsetRangeSet=e.OffsetRange=void 0;class k{static addRange(S,p){let _=0;for(;_<p.length&&p[_].endExclusive<S.start;)_++;let v=_;for(;v<p.length&&p[v].start<=S.endExclusive;)v++;if(_===v)p.splice(_,0,S);else{const b=Math.min(S.start,p[_].start),a=Math.max(S.endExclusive,p[v-1].endExclusive);p.splice(_,v-_,new k(b,a))}}static ofLength(S){return new k(0,S)}static ofStartAndLength(S,p){return new k(S,S+p)}constructor(S,p){if(this.start=S,this.endExclusive=p,S>p)throw new L.BugIndicatingError(`Invalid range: ${this.toString()}`)}get isEmpty(){return this.start===this.endExclusive}delta(S){return new k(this.start+S,this.endExclusive+S)}deltaStart(S){return new k(this.start+S,this.endExclusive)}deltaEnd(S){return new k(this.start,this.endExclusive+S)}get length(){return this.endExclusive-this.start}toString(){return`[${this.start}, ${this.endExclusive})`}contains(S){return this.start<=S&&S<this.endExclusive}join(S){return new k(Math.min(this.start,S.start),Math.max(this.endExclusive,S.endExclusive))}intersect(S){const p=Math.max(this.start,S.start),_=Math.min(this.endExclusive,S.endExclusive);if(p<=_)return new k(p,_)}intersects(S){const p=Math.max(this.start,S.start),_=Math.min(this.endExclusive,S.endExclusive);return p<_}isBefore(S){return this.endExclusive<=S.start}isAfter(S){return this.start>=S.endExclusive}slice(S){return S.slice(this.start,this.endExclusive)}clip(S){if(this.isEmpty)throw new L.BugIndicatingError(`Invalid clipping range: ${this.toString()}`);return Math.max(this.start,Math.min(this.endExclusive-1,S))}clipCyclic(S){if(this.isEmpty)throw new L.BugIndicatingError(`Invalid clipping range: ${this.toString()}`);return S<this.start?this.endExclusive-(this.start-S)%this.length:S>=this.endExclusive?this.start+(S-this.start)%this.length:S}forEach(S){for(let p=this.start;p<this.endExclusive;p++)S(p)}}e.OffsetRange=k;class y{constructor(){this._sortedRanges=[]}addRange(S){let p=0;for(;p<this._sortedRanges.length&&this._sortedRanges[p].endExclusive<S.start;)p++;let _=p;for(;_<this._sortedRanges.length&&this._sortedRanges[_].start<=S.endExclusive;)_++;if(p===_)this._sortedRanges.splice(p,0,S);else{const v=Math.min(S.start,this._sortedRanges[p].start),b=Math.max(S.endExclusive,this._sortedRanges[_-1].endExclusive);this._sortedRanges.splice(p,_-p,new k(v,b))}}toString(){return this._sortedRanges.map(S=>S.toString()).join(", ")}intersectsStrict(S){let p=0;for(;p<this._sortedRanges.length&&this._sortedRanges[p].endExclusive<=S.start;)p++;return p<this._sortedRanges.length&&this._sortedRanges[p].start<S.endExclusive}intersectWithRange(S){const p=new y;for(const _ of this._sortedRanges){const v=_.intersect(S);v&&p.addRange(v)}return p}intersectWithRangeLength(S){return this.intersectWithRange(S).length}get length(){return this._sortedRanges.reduce((S,p)=>S+p.length,0)}}e.OffsetRangeSet=y}),define(se[10],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Position=void 0;class L{constructor(y,E){this.lineNumber=y,this.column=E}with(y=this.lineNumber,E=this.column){return y===this.lineNumber&&E===this.column?this:new L(y,E)}delta(y=0,E=0){return this.with(this.lineNumber+y,this.column+E)}equals(y){return L.equals(this,y)}static equals(y,E){return!y&&!E?!0:!!y&&!!E&&y.lineNumber===E.lineNumber&&y.column===E.column}isBefore(y){return L.isBefore(this,y)}static isBefore(y,E){return y.lineNumber<E.lineNumber?!0:E.lineNumber<y.lineNumber?!1:y.column<E.column}isBeforeOrEqual(y){return L.isBeforeOrEqual(this,y)}static isBeforeOrEqual(y,E){return y.lineNumber<E.lineNumber?!0:E.lineNumber<y.lineNumber?!1:y.column<=E.column}static compare(y,E){const S=y.lineNumber|0,p=E.lineNumber|0;if(S===p){const _=y.column|0,v=E.column|0;return _-v}return S-p}clone(){return new L(this.lineNumber,this.column)}toString(){return"("+this.lineNumber+","+this.column+")"}static lift(y){return new L(y.lineNumber,y.column)}static isIPosition(y){return y&&typeof y.lineNumber=="number"&&typeof y.column=="number"}toJSON(){return{lineNumber:this.lineNumber,column:this.column}}}e.Position=L}),define(se[279],oe([1,0,10]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewUserInputEvents=void 0;class k{constructor(E){this.onKeyDown=null,this.onKeyUp=null,this.onContextMenu=null,this.onMouseMove=null,this.onMouseLeave=null,this.onMouseDown=null,this.onMouseUp=null,this.onMouseDrag=null,this.onMouseDrop=null,this.onMouseDropCanceled=null,this.onMouseWheel=null,this._coordinatesConverter=E}emitKeyDown(E){var S;(S=this.onKeyDown)===null||S===void 0||S.call(this,E)}emitKeyUp(E){var S;(S=this.onKeyUp)===null||S===void 0||S.call(this,E)}emitContextMenu(E){var S;(S=this.onContextMenu)===null||S===void 0||S.call(this,this._convertViewToModelMouseEvent(E))}emitMouseMove(E){var S;(S=this.onMouseMove)===null||S===void 0||S.call(this,this._convertViewToModelMouseEvent(E))}emitMouseLeave(E){var S;(S=this.onMouseLeave)===null||S===void 0||S.call(this,this._convertViewToModelMouseEvent(E))}emitMouseDown(E){var S;(S=this.onMouseDown)===null||S===void 0||S.call(this,this._convertViewToModelMouseEvent(E))}emitMouseUp(E){var S;(S=this.onMouseUp)===null||S===void 0||S.call(this,this._convertViewToModelMouseEvent(E))}emitMouseDrag(E){var S;(S=this.onMouseDrag)===null||S===void 0||S.call(this,this._convertViewToModelMouseEvent(E))}emitMouseDrop(E){var S;(S=this.onMouseDrop)===null||S===void 0||S.call(this,this._convertViewToModelMouseEvent(E))}emitMouseDropCanceled(){var E;(E=this.onMouseDropCanceled)===null||E===void 0||E.call(this)}emitMouseWheel(E){var S;(S=this.onMouseWheel)===null||S===void 0||S.call(this,E)}_convertViewToModelMouseEvent(E){return E.target?{event:E.event,target:this._convertViewToModelMouseTarget(E.target)}:E}_convertViewToModelMouseTarget(E){return k.convertViewToModelMouseTarget(E,this._coordinatesConverter)}static convertViewToModelMouseTarget(E,S){const p={...E};return p.position&&(p.position=S.convertViewPositionToModelPosition(p.position)),p.range&&(p.range=S.convertViewRangeToModelRange(p.range)),(p.type===5||p.type===8)&&(p.detail=this.convertViewToModelViewZoneData(p.detail,S)),p}static convertViewToModelViewZoneData(E,S){return{viewZoneId:E.viewZoneId,positionBefore:E.positionBefore?S.convertViewPositionToModelPosition(E.positionBefore):E.positionBefore,positionAfter:E.positionAfter?S.convertViewPositionToModelPosition(E.positionAfter):E.positionAfter,position:S.convertViewPositionToModelPosition(E.position),afterLineNumber:S.convertViewPositionToModelPosition(new L.Position(E.afterLineNumber,1)).lineNumber}}}e.ViewUserInputEvents=k}),define(se[5],oe([1,0,10]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Range=void 0;class k{constructor(E,S,p,_){E>p||E===p&&S>_?(this.startLineNumber=p,this.startColumn=_,this.endLineNumber=E,this.endColumn=S):(this.startLineNumber=E,this.startColumn=S,this.endLineNumber=p,this.endColumn=_)}isEmpty(){return k.isEmpty(this)}static isEmpty(E){return E.startLineNumber===E.endLineNumber&&E.startColumn===E.endColumn}containsPosition(E){return k.containsPosition(this,E)}static containsPosition(E,S){return!(S.lineNumber<E.startLineNumber||S.lineNumber>E.endLineNumber||S.lineNumber===E.startLineNumber&&S.column<E.startColumn||S.lineNumber===E.endLineNumber&&S.column>E.endColumn)}static strictContainsPosition(E,S){return!(S.lineNumber<E.startLineNumber||S.lineNumber>E.endLineNumber||S.lineNumber===E.startLineNumber&&S.column<=E.startColumn||S.lineNumber===E.endLineNumber&&S.column>=E.endColumn)}containsRange(E){return k.containsRange(this,E)}static containsRange(E,S){return!(S.startLineNumber<E.startLineNumber||S.endLineNumber<E.startLineNumber||S.startLineNumber>E.endLineNumber||S.endLineNumber>E.endLineNumber||S.startLineNumber===E.startLineNumber&&S.startColumn<E.startColumn||S.endLineNumber===E.endLineNumber&&S.endColumn>E.endColumn)}strictContainsRange(E){return k.strictContainsRange(this,E)}static strictContainsRange(E,S){return!(S.startLineNumber<E.startLineNumber||S.endLineNumber<E.startLineNumber||S.startLineNumber>E.endLineNumber||S.endLineNumber>E.endLineNumber||S.startLineNumber===E.startLineNumber&&S.startColumn<=E.startColumn||S.endLineNumber===E.endLineNumber&&S.endColumn>=E.endColumn)}plusRange(E){return k.plusRange(this,E)}static plusRange(E,S){let p,_,v,b;return S.startLineNumber<E.startLineNumber?(p=S.startLineNumber,_=S.startColumn):S.startLineNumber===E.startLineNumber?(p=S.startLineNumber,_=Math.min(S.startColumn,E.startColumn)):(p=E.startLineNumber,_=E.startColumn),S.endLineNumber>E.endLineNumber?(v=S.endLineNumber,b=S.endColumn):S.endLineNumber===E.endLineNumber?(v=S.endLineNumber,b=Math.max(S.endColumn,E.endColumn)):(v=E.endLineNumber,b=E.endColumn),new k(p,_,v,b)}intersectRanges(E){return k.intersectRanges(this,E)}static intersectRanges(E,S){let p=E.startLineNumber,_=E.startColumn,v=E.endLineNumber,b=E.endColumn;const a=S.startLineNumber,i=S.startColumn,n=S.endLineNumber,t=S.endColumn;return p<a?(p=a,_=i):p===a&&(_=Math.max(_,i)),v>n?(v=n,b=t):v===n&&(b=Math.min(b,t)),p>v||p===v&&_>b?null:new k(p,_,v,b)}equalsRange(E){return k.equalsRange(this,E)}static equalsRange(E,S){return!E&&!S?!0:!!E&&!!S&&E.startLineNumber===S.startLineNumber&&E.startColumn===S.startColumn&&E.endLineNumber===S.endLineNumber&&E.endColumn===S.endColumn}getEndPosition(){return k.getEndPosition(this)}static getEndPosition(E){return new L.Position(E.endLineNumber,E.endColumn)}getStartPosition(){return k.getStartPosition(this)}static getStartPosition(E){return new L.Position(E.startLineNumber,E.startColumn)}toString(){return"["+this.startLineNumber+","+this.startColumn+" -> "+this.endLineNumber+","+this.endColumn+"]"}setEndPosition(E,S){return new k(this.startLineNumber,this.startColumn,E,S)}setStartPosition(E,S){return new k(E,S,this.endLineNumber,this.endColumn)}collapseToStart(){return k.collapseToStart(this)}static collapseToStart(E){return new k(E.startLineNumber,E.startColumn,E.startLineNumber,E.startColumn)}collapseToEnd(){return k.collapseToEnd(this)}static collapseToEnd(E){return new k(E.endLineNumber,E.endColumn,E.endLineNumber,E.endColumn)}delta(E){return new k(this.startLineNumber+E,this.startColumn,this.endLineNumber+E,this.endColumn)}static fromPositions(E,S=E){return new k(E.lineNumber,E.column,S.lineNumber,S.column)}static lift(E){return E?new k(E.startLineNumber,E.startColumn,E.endLineNumber,E.endColumn):null}static isIRange(E){return E&&typeof E.startLineNumber=="number"&&typeof E.startColumn=="number"&&typeof E.endLineNumber=="number"&&typeof E.endColumn=="number"}static areIntersectingOrTouching(E,S){return!(E.endLineNumber<S.startLineNumber||E.endLineNumber===S.startLineNumber&&E.endColumn<S.startColumn||S.endLineNumber<E.startLineNumber||S.endLineNumber===E.startLineNumber&&S.endColumn<E.startColumn)}static areIntersecting(E,S){return!(E.endLineNumber<S.startLineNumber||E.endLineNumber===S.startLineNumber&&E.endColumn<=S.startColumn||S.endLineNumber<E.startLineNumber||S.endLineNumber===E.startLineNumber&&S.endColumn<=E.startColumn)}static compareRangesUsingStarts(E,S){if(E&&S){const v=E.startLineNumber|0,b=S.startLineNumber|0;if(v===b){const a=E.startColumn|0,i=S.startColumn|0;if(a===i){const n=E.endLineNumber|0,t=S.endLineNumber|0;if(n===t){const r=E.endColumn|0,u=S.endColumn|0;return r-u}return n-t}return a-i}return v-b}return(E?1:0)-(S?1:0)}static compareRangesUsingEnds(E,S){return E.endLineNumber===S.endLineNumber?E.endColumn===S.endColumn?E.startLineNumber===S.startLineNumber?E.startColumn-S.startColumn:E.startLineNumber-S.startLineNumber:E.endColumn-S.endColumn:E.endLineNumber-S.endLineNumber}static spansMultipleLines(E){return E.endLineNumber>E.startLineNumber}toJSON(){return this}}e.Range=k}),define(se[280],oe([1,0,11,5]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PagedScreenReaderStrategy=e.TextAreaState=e._debugComposition=void 0,e._debugComposition=!1;class y{constructor(p,_,v,b,a){this.value=p,this.selectionStart=_,this.selectionEnd=v,this.selection=b,this.newlineCountBeforeSelection=a}toString(){return`[ <${this.value}>, selectionStart: ${this.selectionStart}, selectionEnd: ${this.selectionEnd}]`}static readFromTextArea(p,_){const v=p.getValue(),b=p.getSelectionStart(),a=p.getSelectionEnd();let i;if(_){const n=v.substring(0,b),t=_.value.substring(0,_.selectionStart);n===t&&(i=_.newlineCountBeforeSelection)}return new y(v,b,a,null,i)}collapseSelection(){return this.selectionStart===this.value.length?this:new y(this.value,this.value.length,this.value.length,null,void 0)}writeToTextArea(p,_,v){e._debugComposition&&console.log(`writeToTextArea ${p}: ${this.toString()}`),_.setValue(p,this.value),v&&_.setSelectionRange(p,this.selectionStart,this.selectionEnd)}deduceEditorPosition(p){var _,v,b,a,i,n,t,r;if(p<=this.selectionStart){const c=this.value.substring(p,this.selectionStart);return this._finishDeduceEditorPosition((v=(_=this.selection)===null||_===void 0?void 0:_.getStartPosition())!==null&&v!==void 0?v:null,c,-1)}if(p>=this.selectionEnd){const c=this.value.substring(this.selectionEnd,p);return this._finishDeduceEditorPosition((a=(b=this.selection)===null||b===void 0?void 0:b.getEndPosition())!==null&&a!==void 0?a:null,c,1)}const u=this.value.substring(this.selectionStart,p);if(u.indexOf(String.fromCharCode(8230))===-1)return this._finishDeduceEditorPosition((n=(i=this.selection)===null||i===void 0?void 0:i.getStartPosition())!==null&&n!==void 0?n:null,u,1);const f=this.value.substring(p,this.selectionEnd);return this._finishDeduceEditorPosition((r=(t=this.selection)===null||t===void 0?void 0:t.getEndPosition())!==null&&r!==void 0?r:null,f,-1)}_finishDeduceEditorPosition(p,_,v){let b=0,a=-1;for(;(a=_.indexOf(`
+`,a+1))!==-1;)b++;return[p,v*_.length,b]}static deduceInput(p,_,v){if(!p)return{text:"",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:0};e._debugComposition&&(console.log("------------------------deduceInput"),console.log(`PREVIOUS STATE: ${p.toString()}`),console.log(`CURRENT STATE: ${_.toString()}`));const b=Math.min(L.commonPrefixLength(p.value,_.value),p.selectionStart,_.selectionStart),a=Math.min(L.commonSuffixLength(p.value,_.value),p.value.length-p.selectionEnd,_.value.length-_.selectionEnd),i=p.value.substring(b,p.value.length-a),n=_.value.substring(b,_.value.length-a),t=p.selectionStart-b,r=p.selectionEnd-b,u=_.selectionStart-b,f=_.selectionEnd-b;if(e._debugComposition&&(console.log(`AFTER DIFFING PREVIOUS STATE: <${i}>, selectionStart: ${t}, selectionEnd: ${r}`),console.log(`AFTER DIFFING CURRENT STATE: <${n}>, selectionStart: ${u}, selectionEnd: ${f}`)),u===f){const d=p.selectionStart-b;return e._debugComposition&&console.log(`REMOVE PREVIOUS: ${d} chars`),{text:n,replacePrevCharCnt:d,replaceNextCharCnt:0,positionDelta:0}}const c=r-t;return{text:n,replacePrevCharCnt:c,replaceNextCharCnt:0,positionDelta:0}}static deduceAndroidCompositionInput(p,_){if(!p)return{text:"",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:0};if(e._debugComposition&&(console.log("------------------------deduceAndroidCompositionInput"),console.log(`PREVIOUS STATE: ${p.toString()}`),console.log(`CURRENT STATE: ${_.toString()}`)),p.value===_.value)return{text:"",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:_.selectionEnd-p.selectionEnd};const v=Math.min(L.commonPrefixLength(p.value,_.value),p.selectionEnd),b=Math.min(L.commonSuffixLength(p.value,_.value),p.value.length-p.selectionEnd),a=p.value.substring(v,p.value.length-b),i=_.value.substring(v,_.value.length-b),n=p.selectionStart-v,t=p.selectionEnd-v,r=_.selectionStart-v,u=_.selectionEnd-v;return e._debugComposition&&(console.log(`AFTER DIFFING PREVIOUS STATE: <${a}>, selectionStart: ${n}, selectionEnd: ${t}`),console.log(`AFTER DIFFING CURRENT STATE: <${i}>, selectionStart: ${r}, selectionEnd: ${u}`)),{text:i,replacePrevCharCnt:t,replaceNextCharCnt:a.length-t,positionDelta:u-i.length}}}e.TextAreaState=y,y.EMPTY=new y("",0,0,null,void 0);class E{static _getPageOfLine(p,_){return Math.floor((p-1)/_)}static _getRangeForPage(p,_){const v=p*_,b=v+1,a=v+_;return new k.Range(b,1,a+1,1)}static fromEditorSelection(p,_,v,b){const i=E._getPageOfLine(_.startLineNumber,v),n=E._getRangeForPage(i,v),t=E._getPageOfLine(_.endLineNumber,v),r=E._getRangeForPage(t,v);let u=n.intersectRanges(new k.Range(1,1,_.startLineNumber,_.startColumn));if(b&&p.getValueLengthInRange(u,1)>500){const g=p.modifyPosition(u.getEndPosition(),-500);u=k.Range.fromPositions(g,u.getEndPosition())}const f=p.getValueInRange(u,1),c=p.getLineCount(),d=p.getLineMaxColumn(c);let s=r.intersectRanges(new k.Range(_.endLineNumber,_.endColumn,c,d));if(b&&p.getValueLengthInRange(s,1)>500){const g=p.modifyPosition(s.getStartPosition(),500);s=k.Range.fromPositions(s.getStartPosition(),g)}const l=p.getValueInRange(s,1);let o;if(i===t||i+1===t)o=p.getValueInRange(_,1);else{const g=n.intersectRanges(_),h=r.intersectRanges(_);o=p.getValueInRange(g,1)+String.fromCharCode(8230)+p.getValueInRange(h,1)}return b&&o.length>2*500&&(o=o.substring(0,500)+String.fromCharCode(8230)+o.substring(o.length-500,o.length)),new y(f+o+l,f.length,f.length+o.length,_,u.endLineNumber-u.startLineNumber)}}e.PagedScreenReaderStrategy=E}),define(se[74],oe([1,0,5]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditOperation=void 0;class k{static insert(E,S){return{range:new L.Range(E.lineNumber,E.column,E.lineNumber,E.column),text:S,forceMoveMarkers:!0}}static delete(E){return{range:E,text:null}}static replace(E,S){return{range:E,text:S}}static replaceMove(E,S){return{range:E,text:S,forceMoveMarkers:!0}}}e.EditOperation=k}),define(se[500],oe([1,0,11,74,5]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.trimTrailingWhitespace=e.TrimTrailingWhitespaceCommand=void 0;class E{constructor(_,v){this._selection=_,this._cursors=v,this._selectionId=null}getEditOperations(_,v){const b=S(_,this._cursors);for(let a=0,i=b.length;a<i;a++){const n=b[a];v.addEditOperation(n.range,n.text)}this._selectionId=v.trackSelection(this._selection)}computeCursorState(_,v){return v.getTrackedSelection(this._selectionId)}}e.TrimTrailingWhitespaceCommand=E;function S(p,_){_.sort((n,t)=>n.lineNumber===t.lineNumber?n.column-t.column:n.lineNumber-t.lineNumber);for(let n=_.length-2;n>=0;n--)_[n].lineNumber===_[n+1].lineNumber&&_.splice(n,1);const v=[];let b=0,a=0;const i=_.length;for(let n=1,t=p.getLineCount();n<=t;n++){const r=p.getLineContent(n),u=r.length+1;let f=0;if(a<i&&_[a].lineNumber===n&&(f=_[a].column,a++,f===u)||r.length===0)continue;const c=L.lastNonWhitespaceIndex(r);let d=0;if(c===-1)d=1;else if(c!==r.length-1)d=c+2;else continue;d=Math.max(f,d),v[b++]=k.EditOperation.delete(new y.Range(n,d,n,u))}return v}e.trimTrailingWhitespace=S}),define(se[62],oe([1,0,12,73,5,60]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineRangeSet=e.LineRange=void 0;class S{static fromRangeInclusive(v){return new S(v.startLineNumber,v.endLineNumber+1)}static joinMany(v){if(v.length===0)return[];let b=new p(v[0].slice());for(let a=1;a<v.length;a++)b=b.getUnion(new p(v[a].slice()));return b.ranges}static ofLength(v,b){return new S(v,v+b)}static deserialize(v){return new S(v[0],v[1])}constructor(v,b){if(v>b)throw new L.BugIndicatingError(`startLineNumber ${v} cannot be after endLineNumberExclusive ${b}`);this.startLineNumber=v,this.endLineNumberExclusive=b}contains(v){return this.startLineNumber<=v&&v<this.endLineNumberExclusive}get isEmpty(){return this.startLineNumber===this.endLineNumberExclusive}delta(v){return new S(this.startLineNumber+v,this.endLineNumberExclusive+v)}deltaLength(v){return new S(this.startLineNumber,this.endLineNumberExclusive+v)}get length(){return this.endLineNumberExclusive-this.startLineNumber}join(v){return new S(Math.min(this.startLineNumber,v.startLineNumber),Math.max(this.endLineNumberExclusive,v.endLineNumberExclusive))}toString(){return`[${this.startLineNumber},${this.endLineNumberExclusive})`}intersect(v){const b=Math.max(this.startLineNumber,v.startLineNumber),a=Math.min(this.endLineNumberExclusive,v.endLineNumberExclusive);if(b<=a)return new S(b,a)}intersectsStrict(v){return this.startLineNumber<v.endLineNumberExclusive&&v.startLineNumber<this.endLineNumberExclusive}overlapOrTouch(v){return this.startLineNumber<=v.endLineNumberExclusive&&v.startLineNumber<=this.endLineNumberExclusive}equals(v){return this.startLineNumber===v.startLineNumber&&this.endLineNumberExclusive===v.endLineNumberExclusive}toInclusiveRange(){return this.isEmpty?null:new y.Range(this.startLineNumber,1,this.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER)}toExclusiveRange(){return new y.Range(this.startLineNumber,1,this.endLineNumberExclusive,1)}mapToLineArray(v){const b=[];for(let a=this.startLineNumber;a<this.endLineNumberExclusive;a++)b.push(v(a));return b}forEach(v){for(let b=this.startLineNumber;b<this.endLineNumberExclusive;b++)v(b)}serialize(){return[this.startLineNumber,this.endLineNumberExclusive]}includes(v){return this.startLineNumber<=v&&v<this.endLineNumberExclusive}toOffsetRange(){return new k.OffsetRange(this.startLineNumber-1,this.endLineNumberExclusive-1)}}e.LineRange=S;class p{constructor(v=[]){this._normalizedRanges=v}get ranges(){return this._normalizedRanges}addRange(v){if(v.length===0)return;const b=(0,E.findFirstIdxMonotonousOrArrLen)(this._normalizedRanges,i=>i.endLineNumberExclusive>=v.startLineNumber),a=(0,E.findLastIdxMonotonous)(this._normalizedRanges,i=>i.startLineNumber<=v.endLineNumberExclusive)+1;if(b===a)this._normalizedRanges.splice(b,0,v);else if(b===a-1){const i=this._normalizedRanges[b];this._normalizedRanges[b]=i.join(v)}else{const i=this._normalizedRanges[b].join(this._normalizedRanges[a-1]).join(v);this._normalizedRanges.splice(b,a-b,i)}}contains(v){const b=(0,E.findLastMonotonous)(this._normalizedRanges,a=>a.startLineNumber<=v);return!!b&&b.endLineNumberExclusive>v}intersects(v){const b=(0,E.findLastMonotonous)(this._normalizedRanges,a=>a.startLineNumber<v.endLineNumberExclusive);return!!b&&b.endLineNumberExclusive>v.startLineNumber}getUnion(v){if(this._normalizedRanges.length===0)return v;if(v._normalizedRanges.length===0)return this;const b=[];let a=0,i=0,n=null;for(;a<this._normalizedRanges.length||i<v._normalizedRanges.length;){let t=null;if(a<this._normalizedRanges.length&&i<v._normalizedRanges.length){const r=this._normalizedRanges[a],u=v._normalizedRanges[i];r.startLineNumber<u.startLineNumber?(t=r,a++):(t=u,i++)}else a<this._normalizedRanges.length?(t=this._normalizedRanges[a],a++):(t=v._normalizedRanges[i],i++);n===null?n=t:n.endLineNumberExclusive>=t.startLineNumber?n=new S(n.startLineNumber,Math.max(n.endLineNumberExclusive,t.endLineNumberExclusive)):(b.push(n),n=t)}return n!==null&&b.push(n),new p(b)}subtractFrom(v){const b=(0,E.findFirstIdxMonotonousOrArrLen)(this._normalizedRanges,t=>t.endLineNumberExclusive>=v.startLineNumber),a=(0,E.findLastIdxMonotonous)(this._normalizedRanges,t=>t.startLineNumber<=v.endLineNumberExclusive)+1;if(b===a)return new p([v]);const i=[];let n=v.startLineNumber;for(let t=b;t<a;t++){const r=this._normalizedRanges[t];r.startLineNumber>n&&i.push(new S(n,r.startLineNumber)),n=r.endLineNumberExclusive}return n<v.endLineNumberExclusive&&i.push(new S(n,v.endLineNumberExclusive)),new p(i)}toString(){return this._normalizedRanges.map(v=>v.toString()).join(", ")}getIntersection(v){const b=[];let a=0,i=0;for(;a<this._normalizedRanges.length&&i<v._normalizedRanges.length;){const n=this._normalizedRanges[a],t=v._normalizedRanges[i],r=n.intersect(t);r&&!r.isEmpty&&b.push(r),n.endLineNumberExclusive<t.endLineNumberExclusive?a++:i++}return new p(b)}getWithDelta(v){return new p(this._normalizedRanges.map(b=>b.delta(v)))}}e.LineRangeSet=p}),define(se[281],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RGBA8=void 0;class L{constructor(y,E,S,p){this._rgba8Brand=void 0,this.r=L._clamp(y),this.g=L._clamp(E),this.b=L._clamp(S),this.a=L._clamp(p)}equals(y){return this.r===y.r&&this.g===y.g&&this.b===y.b&&this.a===y.a}static _clamp(y){return y<0?0:y>255?255:y|0}}e.RGBA8=L,L.Empty=new L(0,0,0,0)}),define(se[24],oe([1,0,10,5]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Selection=void 0;class y extends k.Range{constructor(S,p,_,v){super(S,p,_,v),this.selectionStartLineNumber=S,this.selectionStartColumn=p,this.positionLineNumber=_,this.positionColumn=v}toString(){return"["+this.selectionStartLineNumber+","+this.selectionStartColumn+" -> "+this.positionLineNumber+","+this.positionColumn+"]"}equalsSelection(S){return y.selectionsEqual(this,S)}static selectionsEqual(S,p){return S.selectionStartLineNumber===p.selectionStartLineNumber&&S.selectionStartColumn===p.selectionStartColumn&&S.positionLineNumber===p.positionLineNumber&&S.positionColumn===p.positionColumn}getDirection(){return this.selectionStartLineNumber===this.startLineNumber&&this.selectionStartColumn===this.startColumn?0:1}setEndPosition(S,p){return this.getDirection()===0?new y(this.startLineNumber,this.startColumn,S,p):new y(S,p,this.startLineNumber,this.startColumn)}getPosition(){return new L.Position(this.positionLineNumber,this.positionColumn)}getSelectionStart(){return new L.Position(this.selectionStartLineNumber,this.selectionStartColumn)}setStartPosition(S,p){return this.getDirection()===0?new y(S,p,this.endLineNumber,this.endColumn):new y(this.endLineNumber,this.endColumn,S,p)}static fromPositions(S,p=S){return new y(S.lineNumber,S.column,p.lineNumber,p.column)}static fromRange(S,p){return p===0?new y(S.startLineNumber,S.startColumn,S.endLineNumber,S.endColumn):new y(S.endLineNumber,S.endColumn,S.startLineNumber,S.startColumn)}static liftSelection(S){return new y(S.selectionStartLineNumber,S.selectionStartColumn,S.positionLineNumber,S.positionColumn)}static selectionsArrEqual(S,p){if(S&&!p||!S&&p)return!1;if(!S&&!p)return!0;if(S.length!==p.length)return!1;for(let _=0,v=S.length;_<v;_++)if(!this.selectionsEqual(S[_],p[_]))return!1;return!0}static isISelection(S){return S&&typeof S.selectionStartLineNumber=="number"&&typeof S.selectionStartColumn=="number"&&typeof S.positionLineNumber=="number"&&typeof S.positionColumn=="number"}static createWithDirection(S,p,_,v,b){return b===0?new y(S,p,_,v):new y(_,v,S,p)}}e.Selection=y}),define(se[130],oe([1,0,24]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReplaceCommandThatPreservesSelection=e.ReplaceCommandWithOffsetCursorState=e.ReplaceCommandWithoutChangingPosition=e.ReplaceCommandThatSelectsText=e.ReplaceCommand=void 0;class k{constructor(v,b,a=!1){this._range=v,this._text=b,this.insertsAutoWhitespace=a}getEditOperations(v,b){b.addTrackedEditOperation(this._range,this._text)}computeCursorState(v,b){const i=b.getInverseEditOperations()[0].range;return L.Selection.fromPositions(i.getEndPosition())}}e.ReplaceCommand=k;class y{constructor(v,b){this._range=v,this._text=b}getEditOperations(v,b){b.addTrackedEditOperation(this._range,this._text)}computeCursorState(v,b){const i=b.getInverseEditOperations()[0].range;return L.Selection.fromRange(i,0)}}e.ReplaceCommandThatSelectsText=y;class E{constructor(v,b,a=!1){this._range=v,this._text=b,this.insertsAutoWhitespace=a}getEditOperations(v,b){b.addTrackedEditOperation(this._range,this._text)}computeCursorState(v,b){const i=b.getInverseEditOperations()[0].range;return L.Selection.fromPositions(i.getStartPosition())}}e.ReplaceCommandWithoutChangingPosition=E;class S{constructor(v,b,a,i,n=!1){this._range=v,this._text=b,this._columnDeltaOffset=i,this._lineNumberDeltaOffset=a,this.insertsAutoWhitespace=n}getEditOperations(v,b){b.addTrackedEditOperation(this._range,this._text)}computeCursorState(v,b){const i=b.getInverseEditOperations()[0].range;return L.Selection.fromPositions(i.getEndPosition().delta(this._lineNumberDeltaOffset,this._columnDeltaOffset))}}e.ReplaceCommandWithOffsetCursorState=S;class p{constructor(v,b,a,i=!1){this._range=v,this._text=b,this._initialSelection=a,this._forceMoveMarkers=i,this._selectionId=null}getEditOperations(v,b){b.addTrackedEditOperation(this._range,this._text,this._forceMoveMarkers),this._selectionId=b.trackSelection(this._initialSelection)}computeCursorState(v,b){return b.getTrackedSelection(this._selectionId)}}e.ReplaceCommandThatPreservesSelection=p}),define(se[501],oe([1,0,5,24]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompositionSurroundSelectionCommand=e.SurroundSelectionCommand=void 0;class y{constructor(p,_,v){this._range=p,this._charBeforeSelection=_,this._charAfterSelection=v}getEditOperations(p,_){_.addTrackedEditOperation(new L.Range(this._range.startLineNumber,this._range.startColumn,this._range.startLineNumber,this._range.startColumn),this._charBeforeSelection),_.addTrackedEditOperation(new L.Range(this._range.endLineNumber,this._range.endColumn,this._range.endLineNumber,this._range.endColumn),this._charAfterSelection)}computeCursorState(p,_){const v=_.getInverseEditOperations(),b=v[0].range,a=v[1].range;return new k.Selection(b.endLineNumber,b.endColumn,a.endLineNumber,a.endColumn-this._charAfterSelection.length)}}e.SurroundSelectionCommand=y;class E{constructor(p,_,v){this._position=p,this._text=_,this._charAfter=v}getEditOperations(p,_){_.addTrackedEditOperation(new L.Range(this._position.lineNumber,this._position.column,this._position.lineNumber,this._position.column),this._text+this._charAfter)}computeCursorState(p,_){const b=_.getInverseEditOperations()[0].range;return new k.Selection(b.endLineNumber,b.startColumn,b.endLineNumber,b.endColumn-this._charAfter.length)}}e.CompositionSurroundSelectionCommand=E}),define(se[179],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EDITOR_MODEL_DEFAULTS=void 0,e.EDITOR_MODEL_DEFAULTS={tabSize:4,indentSize:4,insertSpaces:!0,detectIndentation:!0,trimAutoWhitespace:!0,largeFileOptimizations:!0,bracketPairColorizationOptions:{enabled:!0,independentColorPoolPerBracketType:!1}}}),define(se[150],oe([1,0,128]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getMapForWordSeparators=e.WordCharacterClassifier=void 0;class k extends L.CharacterClassifier{constructor(S){super(0);for(let p=0,_=S.length;p<_;p++)this.set(S.charCodeAt(p),2);this.set(32,1),this.set(9,1)}}e.WordCharacterClassifier=k;function y(E){const S={};return p=>(S.hasOwnProperty(p)||(S[p]=E(p)),S[p])}e.getMapForWordSeparators=y(E=>new k(E))}),define(se[151],oe([1,0,52,66]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getWordAtText=e.ensureValidWordDefinition=e.DEFAULT_WORD_REGEXP=e.USUAL_WORD_SEPARATORS=void 0,e.USUAL_WORD_SEPARATORS="`~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?";function y(v=""){let b="(-?\\d*\\.\\d\\w*)|([^";for(const a of e.USUAL_WORD_SEPARATORS)v.indexOf(a)>=0||(b+="\\"+a);return b+="\\s]+)",new RegExp(b,"g")}e.DEFAULT_WORD_REGEXP=y();function E(v){let b=e.DEFAULT_WORD_REGEXP;if(v&&v instanceof RegExp)if(v.global)b=v;else{let a="g";v.ignoreCase&&(a+="i"),v.multiline&&(a+="m"),v.unicode&&(a+="u"),b=new RegExp(v.source,a)}return b.lastIndex=0,b}e.ensureValidWordDefinition=E;const S=new k.LinkedList;S.unshift({maxLen:1e3,windowSize:15,timeBudget:150});function p(v,b,a,i,n){if(b=E(b),n||(n=L.Iterable.first(S)),a.length>n.maxLen){let c=v-n.maxLen/2;return c<0?c=0:i+=c,a=a.substring(c,v+n.maxLen/2),p(v,b,a,i,n)}const t=Date.now(),r=v-1-i;let u=-1,f=null;for(let c=1;!(Date.now()-t>=n.timeBudget);c++){const d=r-n.windowSize*c;b.lastIndex=Math.max(0,d);const s=_(b,a,r,u);if(!s&&f||(f=s,d<=0))break;u=d}if(f){const c={word:f[0],startColumn:i+1+f.index,endColumn:i+1+f.index+f[0].length};return b.lastIndex=0,c}return null}e.getWordAtText=p;function _(v,b,a,i){let n;for(;n=v.exec(b);){const t=n.index||0;if(t<=a&&v.lastIndex>=a)return n;if(i>0&&t>i)return null}return null}}),define(se[282],oe([1,0,85]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AtomicTabMoveOperations=void 0;class k{static whitespaceVisibleColumn(E,S,p){const _=E.length;let v=0,b=-1,a=-1;for(let i=0;i<_;i++){if(i===S)return[b,a,v];switch(v%p===0&&(b=i,a=v),E.charCodeAt(i)){case 32:v+=1;break;case 9:v=L.CursorColumns.nextRenderTabStop(v,p);break;default:return[-1,-1,-1]}}return S===_?[b,a,v]:[-1,-1,-1]}static atomicPosition(E,S,p,_){const v=E.length,[b,a,i]=k.whitespaceVisibleColumn(E,S,p);if(i===-1)return-1;let n;switch(_){case 0:n=!0;break;case 1:n=!1;break;case 2:if(i%p===0)return S;n=i%p<=p/2;break}if(n){if(b===-1)return-1;let u=a;for(let f=b;f<v;++f){if(u===a+p)return b;switch(E.charCodeAt(f)){case 32:u+=1;break;case 9:u=L.CursorColumns.nextRenderTabStop(u,p);break;default:return-1}}return u===a+p?b:-1}const t=L.CursorColumns.nextRenderTabStop(i,p);let r=i;for(let u=S;u<v;u++){if(r===t)return u;switch(E.charCodeAt(u)){case 32:r+=1;break;case 9:r=L.CursorColumns.nextRenderTabStop(r,p);break;default:return-1}}return r===t?v:-1}}e.AtomicTabMoveOperations=k}),define(se[502],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorContext=void 0;class L{constructor(y,E,S,p){this._cursorContextBrand=void 0,this.model=y,this.viewModel=E,this.coordinatesConverter=S,this.cursorConfig=p}}e.CursorContext=L}),define(se[152],oe([1,0,13,12,73]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DateTimeout=e.InfiniteTimeout=e.OffsetPair=e.SequenceDiff=e.DiffAlgorithmResult=void 0;class E{static trivial(a,i){return new E([new S(y.OffsetRange.ofLength(a.length),y.OffsetRange.ofLength(i.length))],!1)}static trivialTimedOut(a,i){return new E([new S(y.OffsetRange.ofLength(a.length),y.OffsetRange.ofLength(i.length))],!0)}constructor(a,i){this.diffs=a,this.hitTimeout=i}}e.DiffAlgorithmResult=E;class S{static invert(a,i){const n=[];return(0,L.forEachAdjacent)(a,(t,r)=>{n.push(S.fromOffsetPairs(t?t.getEndExclusives():p.zero,r?r.getStarts():new p(i,(t?t.seq2Range.endExclusive-t.seq1Range.endExclusive:0)+i)))}),n}static fromOffsetPairs(a,i){return new S(new y.OffsetRange(a.offset1,i.offset1),new y.OffsetRange(a.offset2,i.offset2))}constructor(a,i){this.seq1Range=a,this.seq2Range=i}swap(){return new S(this.seq2Range,this.seq1Range)}toString(){return`${this.seq1Range} <-> ${this.seq2Range}`}join(a){return new S(this.seq1Range.join(a.seq1Range),this.seq2Range.join(a.seq2Range))}delta(a){return a===0?this:new S(this.seq1Range.delta(a),this.seq2Range.delta(a))}deltaStart(a){return a===0?this:new S(this.seq1Range.deltaStart(a),this.seq2Range.deltaStart(a))}deltaEnd(a){return a===0?this:new S(this.seq1Range.deltaEnd(a),this.seq2Range.deltaEnd(a))}intersect(a){const i=this.seq1Range.intersect(a.seq1Range),n=this.seq2Range.intersect(a.seq2Range);if(!(!i||!n))return new S(i,n)}getStarts(){return new p(this.seq1Range.start,this.seq2Range.start)}getEndExclusives(){return new p(this.seq1Range.endExclusive,this.seq2Range.endExclusive)}}e.SequenceDiff=S;class p{constructor(a,i){this.offset1=a,this.offset2=i}toString(){return`${this.offset1} <-> ${this.offset2}`}delta(a){return a===0?this:new p(this.offset1+a,this.offset2+a)}equals(a){return this.offset1===a.offset1&&this.offset2===a.offset2}}e.OffsetPair=p,p.zero=new p(0,0),p.max=new p(Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER);class _{isValid(){return!0}}e.InfiniteTimeout=_,_.instance=new _;class v{constructor(a){if(this.timeout=a,this.startTime=Date.now(),this.valid=!0,a<=0)throw new k.BugIndicatingError("timeout must be positive")}isValid(){if(!(Date.now()-this.startTime<this.timeout)&&this.valid){this.valid=!1;debugger}return this.valid}}e.DateTimeout=v}),define(se[283],oe([1,0,73,152]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MyersDiffAlgorithm=void 0;class y{compute(v,b,a=k.InfiniteTimeout.instance){if(v.length===0||b.length===0)return k.DiffAlgorithmResult.trivial(v,b);const i=v,n=b;function t(g,h){for(;g<i.length&&h<n.length&&i.getElement(g)===n.getElement(h);)g++,h++;return g}let r=0;const u=new S;u.set(0,t(0,0));const f=new p;f.set(0,u.get(0)===0?null:new E(null,0,0,u.get(0)));let c=0;e:for(;;){if(r++,!a.isValid())return k.DiffAlgorithmResult.trivialTimedOut(i,n);const g=-Math.min(r,n.length+r%2),h=Math.min(r,i.length+r%2);for(c=g;c<=h;c+=2){let m=0;const C=c===h?-1:u.get(c+1),w=c===g?-1:u.get(c-1)+1;m++;const D=Math.min(Math.max(C,w),i.length),I=D-c;if(m++,D>i.length||I>n.length)continue;const T=t(D,I);u.set(c,T);const A=D===C?f.get(c+1):f.get(c-1);if(f.set(c,T!==D?new E(A,D,I,T-D):A),u.get(c)===i.length&&u.get(c)-c===n.length)break e}}let d=f.get(c);const s=[];let l=i.length,o=n.length;for(;;){const g=d?d.x+d.length:0,h=d?d.y+d.length:0;if((g!==l||h!==o)&&s.push(new k.SequenceDiff(new L.OffsetRange(g,l),new L.OffsetRange(h,o))),!d)break;l=d.x,o=d.y,d=d.prev}return s.reverse(),new k.DiffAlgorithmResult(s,!1)}}e.MyersDiffAlgorithm=y;class E{constructor(v,b,a,i){this.prev=v,this.x=b,this.y=a,this.length=i}}class S{constructor(){this.positiveArr=new Int32Array(10),this.negativeArr=new Int32Array(10)}get(v){return v<0?(v=-v-1,this.negativeArr[v]):this.positiveArr[v]}set(v,b){if(v<0){if(v=-v-1,v>=this.negativeArr.length){const a=this.negativeArr;this.negativeArr=new Int32Array(a.length*2),this.negativeArr.set(a)}this.negativeArr[v]=b}else{if(v>=this.positiveArr.length){const a=this.positiveArr;this.positiveArr=new Int32Array(a.length*2),this.positiveArr.set(a)}this.positiveArr[v]=b}}}class p{constructor(){this.positiveArr=[],this.negativeArr=[]}get(v){return v<0?(v=-v-1,this.negativeArr[v]):this.positiveArr[v]}set(v,b){v<0?(v=-v-1,this.negativeArr[v]=b):this.positiveArr[v]=b}}}),define(se[284],oe([1,0,13,73,152]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.removeVeryShortMatchingTextBetweenLongDiffs=e.removeVeryShortMatchingLinesBetweenDiffs=e.extendDiffsToEntireWordIfAppropriate=e.removeShortMatches=e.optimizeSequenceDiffs=void 0;function E(t,r,u){let f=u;return f=S(t,r,f),f=S(t,r,f),f=p(t,r,f),f}e.optimizeSequenceDiffs=E;function S(t,r,u){if(u.length===0)return u;const f=[];f.push(u[0]);for(let d=1;d<u.length;d++){const s=f[f.length-1];let l=u[d];if(l.seq1Range.isEmpty||l.seq2Range.isEmpty){const o=l.seq1Range.start-s.seq1Range.endExclusive;let g;for(g=1;g<=o&&!(t.getElement(l.seq1Range.start-g)!==t.getElement(l.seq1Range.endExclusive-g)||r.getElement(l.seq2Range.start-g)!==r.getElement(l.seq2Range.endExclusive-g));g++);if(g--,g===o){f[f.length-1]=new y.SequenceDiff(new k.OffsetRange(s.seq1Range.start,l.seq1Range.endExclusive-o),new k.OffsetRange(s.seq2Range.start,l.seq2Range.endExclusive-o));continue}l=l.delta(-g)}f.push(l)}const c=[];for(let d=0;d<f.length-1;d++){const s=f[d+1];let l=f[d];if(l.seq1Range.isEmpty||l.seq2Range.isEmpty){const o=s.seq1Range.start-l.seq1Range.endExclusive;let g;for(g=0;g<o&&!(!t.isStronglyEqual(l.seq1Range.start+g,l.seq1Range.endExclusive+g)||!r.isStronglyEqual(l.seq2Range.start+g,l.seq2Range.endExclusive+g));g++);if(g===o){f[d+1]=new y.SequenceDiff(new k.OffsetRange(l.seq1Range.start+o,s.seq1Range.endExclusive),new k.OffsetRange(l.seq2Range.start+o,s.seq2Range.endExclusive));continue}g>0&&(l=l.delta(g))}c.push(l)}return f.length>0&&c.push(f[f.length-1]),c}function p(t,r,u){if(!t.getBoundaryScore||!r.getBoundaryScore)return u;for(let f=0;f<u.length;f++){const c=f>0?u[f-1]:void 0,d=u[f],s=f+1<u.length?u[f+1]:void 0,l=new k.OffsetRange(c?c.seq1Range.endExclusive+1:0,s?s.seq1Range.start-1:t.length),o=new k.OffsetRange(c?c.seq2Range.endExclusive+1:0,s?s.seq2Range.start-1:r.length);d.seq1Range.isEmpty?u[f]=_(d,t,r,l,o):d.seq2Range.isEmpty&&(u[f]=_(d.swap(),r,t,o,l).swap())}return u}function _(t,r,u,f,c){let s=1;for(;t.seq1Range.start-s>=f.start&&t.seq2Range.start-s>=c.start&&u.isStronglyEqual(t.seq2Range.start-s,t.seq2Range.endExclusive-s)&&s<100;)s++;s--;let l=0;for(;t.seq1Range.start+l<f.endExclusive&&t.seq2Range.endExclusive+l<c.endExclusive&&u.isStronglyEqual(t.seq2Range.start+l,t.seq2Range.endExclusive+l)&&l<100;)l++;if(s===0&&l===0)return t;let o=0,g=-1;for(let h=-s;h<=l;h++){const m=t.seq2Range.start+h,C=t.seq2Range.endExclusive+h,w=t.seq1Range.start+h,D=r.getBoundaryScore(w)+u.getBoundaryScore(m)+u.getBoundaryScore(C);D>g&&(g=D,o=h)}return t.delta(o)}function v(t,r,u){const f=[];for(const c of u){const d=f[f.length-1];if(!d){f.push(c);continue}c.seq1Range.start-d.seq1Range.endExclusive<=2||c.seq2Range.start-d.seq2Range.endExclusive<=2?f[f.length-1]=new y.SequenceDiff(d.seq1Range.join(c.seq1Range),d.seq2Range.join(c.seq2Range)):f.push(c)}return f}e.removeShortMatches=v;function b(t,r,u){const f=y.SequenceDiff.invert(u,t.length),c=[];let d=new y.OffsetPair(0,0);function s(o,g){if(o.offset1<d.offset1||o.offset2<d.offset2)return;const h=t.findWordContaining(o.offset1),m=r.findWordContaining(o.offset2);if(!h||!m)return;let C=new y.SequenceDiff(h,m);const w=C.intersect(g);let D=w.seq1Range.length,I=w.seq2Range.length;for(;f.length>0;){const T=f[0];if(!(T.seq1Range.intersects(h)||T.seq2Range.intersects(m)))break;const P=t.findWordContaining(T.seq1Range.start),N=r.findWordContaining(T.seq2Range.start),M=new y.SequenceDiff(P,N),R=M.intersect(T);if(D+=R.seq1Range.length,I+=R.seq2Range.length,C=C.join(M),C.seq1Range.endExclusive>=T.seq1Range.endExclusive)f.shift();else break}D+I<(C.seq1Range.length+C.seq2Range.length)*2/3&&c.push(C),d=C.getEndExclusives()}for(;f.length>0;){const o=f.shift();o.seq1Range.isEmpty||(s(o.getStarts(),o),s(o.getEndExclusives().delta(-1),o))}return a(u,c)}e.extendDiffsToEntireWordIfAppropriate=b;function a(t,r){const u=[];for(;t.length>0||r.length>0;){const f=t[0],c=r[0];let d;f&&(!c||f.seq1Range.start<c.seq1Range.start)?d=t.shift():d=r.shift(),u.length>0&&u[u.length-1].seq1Range.endExclusive>=d.seq1Range.start?u[u.length-1]=u[u.length-1].join(d):u.push(d)}return u}function i(t,r,u){let f=u;if(f.length===0)return f;let c=0,d;do{d=!1;const s=[f[0]];for(let l=1;l<f.length;l++){let h=function(C,w){const D=new k.OffsetRange(g.seq1Range.endExclusive,o.seq1Range.start);return t.getText(D).replace(/\s/g,"").length<=4&&(C.seq1Range.length+C.seq2Range.length>5||w.seq1Range.length+w.seq2Range.length>5)};const o=f[l],g=s[s.length-1];h(g,o)?(d=!0,s[s.length-1]=s[s.length-1].join(o)):s.push(o)}f=s}while(c++<10&&d);return f}e.removeVeryShortMatchingLinesBetweenDiffs=i;function n(t,r,u){let f=u;if(f.length===0)return f;let c=0,d;do{d=!1;const l=[f[0]];for(let o=1;o<f.length;o++){let m=function(w,D){const I=new k.OffsetRange(h.seq1Range.endExclusive,g.seq1Range.start);if(t.countLinesIn(I)>5||I.length>500)return!1;const A=t.getText(I).trim();if(A.length>20||A.split(/\r\n|\r|\n/).length>1)return!1;const P=t.countLinesIn(w.seq1Range),N=w.seq1Range.length,M=r.countLinesIn(w.seq2Range),R=w.seq2Range.length,x=t.countLinesIn(D.seq1Range),O=D.seq1Range.length,B=r.countLinesIn(D.seq2Range),W=D.seq2Range.length,V=2*40+50;function K(F){return Math.min(F,V)}return Math.pow(Math.pow(K(P*40+N),1.5)+Math.pow(K(M*40+R),1.5),1.5)+Math.pow(Math.pow(K(x*40+O),1.5)+Math.pow(K(B*40+W),1.5),1.5)>(V**1.5)**1.5*1.3};const g=f[o],h=l[l.length-1];m(h,g)?(d=!0,l[l.length-1]=l[l.length-1].join(g)):l.push(g)}f=l}while(c++<10&&d);const s=[];return(0,L.forEachWithNeighbors)(f,(l,o,g)=>{let h=o;function m(A){return A.length>0&&A.trim().length<=3&&o.seq1Range.length+o.seq2Range.length>100}const C=t.extendToFullLines(o.seq1Range),w=t.getText(new k.OffsetRange(C.start,o.seq1Range.start));m(w)&&(h=h.deltaStart(-w.length));const D=t.getText(new k.OffsetRange(o.seq1Range.endExclusive,C.endExclusive));m(D)&&(h=h.deltaEnd(D.length));const I=y.SequenceDiff.fromOffsetPairs(l?l.getEndExclusives():y.OffsetPair.zero,g?g.getStarts():y.OffsetPair.max),T=h.intersect(I);s.length>0&&T.getStarts().equals(s[s.length-1].getEndExclusives())?s[s.length-1]=s[s.length-1].join(T):s.push(T)}),s}e.removeVeryShortMatchingTextBetweenLongDiffs=n}),define(se[503],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineSequence=void 0;class L{constructor(E,S){this.trimmedHash=E,this.lines=S}getElement(E){return this.trimmedHash[E]}get length(){return this.trimmedHash.length}getBoundaryScore(E){const S=E===0?0:k(this.lines[E-1]),p=E===this.lines.length?0:k(this.lines[E]);return 1e3-(S+p)}getText(E){return this.lines.slice(E.start,E.endExclusive).join(`
+`)}isStronglyEqual(E,S){return this.lines[E]===this.lines[S]}}e.LineSequence=L;function k(y){let E=0;for(;E<y.length&&(y.charCodeAt(E)===32||y.charCodeAt(E)===9);)E++;return E}}),define(se[204],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineRangeFragment=e.isSpace=e.Array2D=void 0;class L{constructor(S,p){this.width=S,this.height=p,this.array=[],this.array=new Array(S*p)}get(S,p){return this.array[S+p*this.width]}set(S,p,_){this.array[S+p*this.width]=_}}e.Array2D=L;function k(E){return E===32||E===9}e.isSpace=k;class y{static getKey(S){let p=this.chrKeys.get(S);return p===void 0&&(p=this.chrKeys.size,this.chrKeys.set(S,p)),p}constructor(S,p,_){this.range=S,this.lines=p,this.source=_,this.histogram=[];let v=0;for(let b=S.startLineNumber-1;b<S.endLineNumberExclusive-1;b++){const a=p[b];for(let n=0;n<a.length;n++){v++;const t=a[n],r=y.getKey(t);this.histogram[r]=(this.histogram[r]||0)+1}v++;const i=y.getKey(`
+`);this.histogram[i]=(this.histogram[i]||0)+1}this.totalCount=v}computeSimilarity(S){var p,_;let v=0;const b=Math.max(this.histogram.length,S.histogram.length);for(let a=0;a<b;a++)v+=Math.abs(((p=this.histogram[a])!==null&&p!==void 0?p:0)-((_=S.histogram[a])!==null&&_!==void 0?_:0));return 1-v/(this.totalCount+S.totalCount)}}e.LineRangeFragment=y,y.chrKeys=new Map}),define(se[504],oe([1,0,73,152,204]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DynamicProgrammingDiffing=void 0;class E{compute(p,_,v=k.InfiniteTimeout.instance,b){if(p.length===0||_.length===0)return k.DiffAlgorithmResult.trivial(p,_);const a=new y.Array2D(p.length,_.length),i=new y.Array2D(p.length,_.length),n=new y.Array2D(p.length,_.length);for(let s=0;s<p.length;s++)for(let l=0;l<_.length;l++){if(!v.isValid())return k.DiffAlgorithmResult.trivialTimedOut(p,_);const o=s===0?0:a.get(s-1,l),g=l===0?0:a.get(s,l-1);let h;p.getElement(s)===_.getElement(l)?(s===0||l===0?h=0:h=a.get(s-1,l-1),s>0&&l>0&&i.get(s-1,l-1)===3&&(h+=n.get(s-1,l-1)),h+=b?b(s,l):1):h=-1;const m=Math.max(o,g,h);if(m===h){const C=s>0&&l>0?n.get(s-1,l-1):0;n.set(s,l,C+1),i.set(s,l,3)}else m===o?(n.set(s,l,0),i.set(s,l,1)):m===g&&(n.set(s,l,0),i.set(s,l,2));a.set(s,l,m)}const t=[];let r=p.length,u=_.length;function f(s,l){(s+1!==r||l+1!==u)&&t.push(new k.SequenceDiff(new L.OffsetRange(s+1,r),new L.OffsetRange(l+1,u))),r=s,u=l}let c=p.length-1,d=_.length-1;for(;c>=0&&d>=0;)i.get(c,d)===3?(f(c,d),c--,d--):i.get(c,d)===1?c--:d--;return f(-1,-1),t.reverse(),new k.DiffAlgorithmResult(t,!1)}}e.DynamicProgrammingDiffing=E}),define(se[285],oe([1,0,60,73,10,5,204]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinesSliceCharSequence=void 0;class p{constructor(n,t,r){this.lines=n,this.considerWhitespaceChanges=r,this.elements=[],this.firstCharOffsetByLine=[],this.additionalOffsetByLine=[];let u=!1;t.start>0&&t.endExclusive>=n.length&&(t=new k.OffsetRange(t.start-1,t.endExclusive),u=!0),this.lineRange=t,this.firstCharOffsetByLine[0]=0;for(let f=this.lineRange.start;f<this.lineRange.endExclusive;f++){let c=n[f],d=0;if(u)d=c.length,c="",u=!1;else if(!r){const s=c.trimStart();d=c.length-s.length,c=s.trimEnd()}this.additionalOffsetByLine.push(d);for(let s=0;s<c.length;s++)this.elements.push(c.charCodeAt(s));f<n.length-1&&(this.elements.push(`
+`.charCodeAt(0)),this.firstCharOffsetByLine[f-this.lineRange.start+1]=this.elements.length)}this.additionalOffsetByLine.push(0)}toString(){return`Slice: "${this.text}"`}get text(){return this.getText(new k.OffsetRange(0,this.length))}getText(n){return this.elements.slice(n.start,n.endExclusive).map(t=>String.fromCharCode(t)).join("")}getElement(n){return this.elements[n]}get length(){return this.elements.length}getBoundaryScore(n){const t=a(n>0?this.elements[n-1]:-1),r=a(n<this.elements.length?this.elements[n]:-1);if(t===7&&r===8)return 0;if(t===8)return 150;let u=0;return t!==r&&(u+=10,t===0&&r===1&&(u+=1)),u+=b(t),u+=b(r),u}translateOffset(n){if(this.lineRange.isEmpty)return new y.Position(this.lineRange.start+1,1);const t=(0,L.findLastIdxMonotonous)(this.firstCharOffsetByLine,r=>r<=n);return new y.Position(this.lineRange.start+t+1,n-this.firstCharOffsetByLine[t]+this.additionalOffsetByLine[t]+1)}translateRange(n){return E.Range.fromPositions(this.translateOffset(n.start),this.translateOffset(n.endExclusive))}findWordContaining(n){if(n<0||n>=this.elements.length||!_(this.elements[n]))return;let t=n;for(;t>0&&_(this.elements[t-1]);)t--;let r=n;for(;r<this.elements.length&&_(this.elements[r]);)r++;return new k.OffsetRange(t,r)}countLinesIn(n){return this.translateOffset(n.endExclusive).lineNumber-this.translateOffset(n.start).lineNumber}isStronglyEqual(n,t){return this.elements[n]===this.elements[t]}extendToFullLines(n){var t,r;const u=(t=(0,L.findLastMonotonous)(this.firstCharOffsetByLine,c=>c<=n.start))!==null&&t!==void 0?t:0,f=(r=(0,L.findFirstMonotonous)(this.firstCharOffsetByLine,c=>n.endExclusive<=c))!==null&&r!==void 0?r:this.elements.length;return new k.OffsetRange(u,f)}}e.LinesSliceCharSequence=p;function _(i){return i>=97&&i<=122||i>=65&&i<=90||i>=48&&i<=57}const v={[0]:0,[1]:0,[2]:0,[3]:10,[4]:2,[5]:30,[6]:3,[7]:10,[8]:10};function b(i){return v[i]}function a(i){return i===10?8:i===13?7:(0,S.isSpace)(i)?6:i>=97&&i<=122?0:i>=65&&i<=90?1:i>=48&&i<=57?2:i===-1?3:i===44||i===59?5:4}}),define(se[205],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MovedText=e.LinesDiff=void 0;class L{constructor(E,S,p){this.changes=E,this.moves=S,this.hitTimeout=p}}e.LinesDiff=L;class k{constructor(E,S){this.lineRangeMapping=E,this.changes=S}}e.MovedText=k}),define(se[112],oe([1,0,62]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RangeMapping=e.DetailedLineRangeMapping=e.LineRangeMapping=void 0;class k{static inverse(p,_,v){const b=[];let a=1,i=1;for(const t of p){const r=new k(new L.LineRange(a,t.original.startLineNumber),new L.LineRange(i,t.modified.startLineNumber));r.modified.isEmpty||b.push(r),a=t.original.endLineNumberExclusive,i=t.modified.endLineNumberExclusive}const n=new k(new L.LineRange(a,_+1),new L.LineRange(i,v+1));return n.modified.isEmpty||b.push(n),b}static clip(p,_,v){const b=[];for(const a of p){const i=a.original.intersect(_),n=a.modified.intersect(v);i&&!i.isEmpty&&n&&!n.isEmpty&&b.push(new k(i,n))}return b}constructor(p,_){this.original=p,this.modified=_}toString(){return`{${this.original.toString()}->${this.modified.toString()}}`}flip(){return new k(this.modified,this.original)}join(p){return new k(this.original.join(p.original),this.modified.join(p.modified))}}e.LineRangeMapping=k;class y extends k{constructor(p,_,v){super(p,_),this.innerChanges=v}flip(){var p;return new y(this.modified,this.original,(p=this.innerChanges)===null||p===void 0?void 0:p.map(_=>_.flip()))}}e.DetailedLineRangeMapping=y;class E{constructor(p,_){this.originalRange=p,this.modifiedRange=_}toString(){return`{${this.originalRange.toString()}->${this.modifiedRange.toString()}}`}flip(){return new E(this.modifiedRange,this.originalRange)}}e.RangeMapping=E}),define(se[505],oe([1,0,152,112,13,60,53,62,73,285,204,283]),function(te,e,L,k,y,E,S,p,_,v,b,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.computeMovedLines=void 0;function i(d,s,l,o,g,h){let{moves:m,excludedChanges:C}=t(d,s,l,h);if(!h.isValid())return[];const w=d.filter(I=>!C.has(I)),D=r(w,o,g,s,l,h);return(0,y.pushMany)(m,D),m=f(m),m=m.filter(I=>{const T=I.original.toOffsetRange().slice(s).map(P=>P.trim());return T.join(`
+`).length>=15&&n(T,P=>P.length>=2)>=2}),m=c(d,m),m}e.computeMovedLines=i;function n(d,s){let l=0;for(const o of d)s(o)&&l++;return l}function t(d,s,l,o){const g=[],h=d.filter(w=>w.modified.isEmpty&&w.original.length>=3).map(w=>new b.LineRangeFragment(w.original,s,w)),m=new Set(d.filter(w=>w.original.isEmpty&&w.modified.length>=3).map(w=>new b.LineRangeFragment(w.modified,l,w))),C=new Set;for(const w of h){let D=-1,I;for(const T of m){const A=w.computeSimilarity(T);A>D&&(D=A,I=T)}if(D>.9&&I&&(m.delete(I),g.push(new k.LineRangeMapping(w.range,I.range)),C.add(w.source),C.add(I.source)),!o.isValid())return{moves:g,excludedChanges:C}}return{moves:g,excludedChanges:C}}function r(d,s,l,o,g,h){const m=[],C=new S.SetMap;for(const A of d)for(let P=A.original.startLineNumber;P<A.original.endLineNumberExclusive-2;P++){const N=`${s[P-1]}:${s[P+1-1]}:${s[P+2-1]}`;C.add(N,{range:new p.LineRange(P,P+3)})}const w=[];d.sort((0,y.compareBy)(A=>A.modified.startLineNumber,y.numberComparator));for(const A of d){let P=[];for(let N=A.modified.startLineNumber;N<A.modified.endLineNumberExclusive-2;N++){const M=`${l[N-1]}:${l[N+1-1]}:${l[N+2-1]}`,R=new p.LineRange(N,N+3),x=[];C.forEach(M,({range:O})=>{for(const W of P)if(W.originalLineRange.endLineNumberExclusive+1===O.endLineNumberExclusive&&W.modifiedLineRange.endLineNumberExclusive+1===R.endLineNumberExclusive){W.originalLineRange=new p.LineRange(W.originalLineRange.startLineNumber,O.endLineNumberExclusive),W.modifiedLineRange=new p.LineRange(W.modifiedLineRange.startLineNumber,R.endLineNumberExclusive),x.push(W);return}const B={modifiedLineRange:R,originalLineRange:O};w.push(B),x.push(B)}),P=x}if(!h.isValid())return[]}w.sort((0,y.reverseOrder)((0,y.compareBy)(A=>A.modifiedLineRange.length,y.numberComparator)));const D=new p.LineRangeSet,I=new p.LineRangeSet;for(const A of w){const P=A.modifiedLineRange.startLineNumber-A.originalLineRange.startLineNumber,N=D.subtractFrom(A.modifiedLineRange),M=I.subtractFrom(A.originalLineRange).getWithDelta(P),R=N.getIntersection(M);for(const x of R.ranges){if(x.length<3)continue;const O=x,B=x.delta(-P);m.push(new k.LineRangeMapping(B,O)),D.addRange(O),I.addRange(B)}}m.sort((0,y.compareBy)(A=>A.original.startLineNumber,y.numberComparator));const T=new E.MonotonousArray(d);for(let A=0;A<m.length;A++){const P=m[A],N=T.findLastMonotonous(K=>K.original.startLineNumber<=P.original.startLineNumber),M=(0,E.findLastMonotonous)(d,K=>K.modified.startLineNumber<=P.modified.startLineNumber),R=Math.max(P.original.startLineNumber-N.original.startLineNumber,P.modified.startLineNumber-M.modified.startLineNumber),x=T.findLastMonotonous(K=>K.original.startLineNumber<P.original.endLineNumberExclusive),O=(0,E.findLastMonotonous)(d,K=>K.modified.startLineNumber<P.modified.endLineNumberExclusive),B=Math.max(x.original.endLineNumberExclusive-P.original.endLineNumberExclusive,O.modified.endLineNumberExclusive-P.modified.endLineNumberExclusive);let W;for(W=0;W<R;W++){const K=P.original.startLineNumber-W-1,F=P.modified.startLineNumber-W-1;if(K>o.length||F>g.length||D.contains(F)||I.contains(K)||!u(o[K-1],g[F-1],h))break}W>0&&(I.addRange(new p.LineRange(P.original.startLineNumber-W,P.original.startLineNumber)),D.addRange(new p.LineRange(P.modified.startLineNumber-W,P.modified.startLineNumber)));let V;for(V=0;V<B;V++){const K=P.original.endLineNumberExclusive+V,F=P.modified.endLineNumberExclusive+V;if(K>o.length||F>g.length||D.contains(F)||I.contains(K)||!u(o[K-1],g[F-1],h))break}V>0&&(I.addRange(new p.LineRange(P.original.endLineNumberExclusive,P.original.endLineNumberExclusive+V)),D.addRange(new p.LineRange(P.modified.endLineNumberExclusive,P.modified.endLineNumberExclusive+V))),(W>0||V>0)&&(m[A]=new k.LineRangeMapping(new p.LineRange(P.original.startLineNumber-W,P.original.endLineNumberExclusive+V),new p.LineRange(P.modified.startLineNumber-W,P.modified.endLineNumberExclusive+V)))}return m}function u(d,s,l){if(d.trim()===s.trim())return!0;if(d.length>300&&s.length>300)return!1;const g=new a.MyersDiffAlgorithm().compute(new v.LinesSliceCharSequence([d],new _.OffsetRange(0,1),!1),new v.LinesSliceCharSequence([s],new _.OffsetRange(0,1),!1),l);let h=0;const m=L.SequenceDiff.invert(g.diffs,d.length);for(const I of m)I.seq1Range.forEach(T=>{(0,b.isSpace)(d.charCodeAt(T))||h++});function C(I){let T=0;for(let A=0;A<d.length;A++)(0,b.isSpace)(I.charCodeAt(A))||T++;return T}const w=C(d.length>s.length?d:s);return h/w>.6&&w>10}function f(d){if(d.length===0)return d;d.sort((0,y.compareBy)(l=>l.original.startLineNumber,y.numberComparator));const s=[d[0]];for(let l=1;l<d.length;l++){const o=s[s.length-1],g=d[l],h=g.original.startLineNumber-o.original.endLineNumberExclusive,m=g.modified.startLineNumber-o.modified.endLineNumberExclusive;if(h>=0&&m>=0&&h+m<=2){s[s.length-1]=o.join(g);continue}s.push(g)}return s}function c(d,s){const l=new E.MonotonousArray(d);return s=s.filter(o=>{const g=l.findLastMonotonous(C=>C.original.startLineNumber<o.original.endLineNumberExclusive)||new k.LineRangeMapping(new p.LineRange(1,1),new p.LineRange(1,1)),h=(0,E.findLastMonotonous)(d,C=>C.modified.startLineNumber<o.modified.endLineNumberExclusive);return g!==h}),s}}),define(se[286],oe([1,0,13,90,62,73,5,152,504,283,505,284,205,112,285,503]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getLineRangeMapping=e.lineRangeMappingFromRangeMappings=e.DefaultLinesDiffComputer=void 0;class u{constructor(){this.dynamicProgrammingDiffing=new _.DynamicProgrammingDiffing,this.myersDiffingAlgorithm=new v.MyersDiffAlgorithm}computeDiff(s,l,o){if(s.length<=1&&(0,L.equals)(s,l,(V,K)=>V===K))return new i.LinesDiff([],[],!1);if(s.length===1&&s[0].length===0||l.length===1&&l[0].length===0)return new i.LinesDiff([new n.DetailedLineRangeMapping(new y.LineRange(1,s.length+1),new y.LineRange(1,l.length+1),[new n.RangeMapping(new S.Range(1,1,s.length,s[0].length+1),new S.Range(1,1,l.length,l[0].length+1))])],[],!1);const g=o.maxComputationTimeMs===0?p.InfiniteTimeout.instance:new p.DateTimeout(o.maxComputationTimeMs),h=!o.ignoreTrimWhitespace,m=new Map;function C(V){let K=m.get(V);return K===void 0&&(K=m.size,m.set(V,K)),K}const w=s.map(V=>C(V.trim())),D=l.map(V=>C(V.trim())),I=new r.LineSequence(w,s),T=new r.LineSequence(D,l),A=(()=>I.length+T.length<1700?this.dynamicProgrammingDiffing.compute(I,T,g,(V,K)=>s[V]===l[K]?l[K].length===0?.1:1+Math.log(1+l[K].length):.99):this.myersDiffingAlgorithm.compute(I,T))();let P=A.diffs,N=A.hitTimeout;P=(0,a.optimizeSequenceDiffs)(I,T,P),P=(0,a.removeVeryShortMatchingLinesBetweenDiffs)(I,T,P);const M=[],R=V=>{if(h)for(let K=0;K<V;K++){const F=x+K,q=O+K;if(s[F]!==l[q]){const ie=this.refineDiff(s,l,new p.SequenceDiff(new E.OffsetRange(F,F+1),new E.OffsetRange(q,q+1)),g,h);for(const ae of ie.mappings)M.push(ae);ie.hitTimeout&&(N=!0)}}};let x=0,O=0;for(const V of P){(0,k.assertFn)(()=>V.seq1Range.start-x===V.seq2Range.start-O);const K=V.seq1Range.start-x;R(K),x=V.seq1Range.endExclusive,O=V.seq2Range.endExclusive;const F=this.refineDiff(s,l,V,g,h);F.hitTimeout&&(N=!0);for(const q of F.mappings)M.push(q)}R(s.length-x);const B=f(M,s,l);let W=[];return o.computeMoves&&(W=this.computeMoves(B,s,l,w,D,g,h)),(0,k.assertFn)(()=>{function V(F,q){if(F.lineNumber<1||F.lineNumber>q.length)return!1;const ie=q[F.lineNumber-1];return!(F.column<1||F.column>ie.length+1)}function K(F,q){return!(F.startLineNumber<1||F.startLineNumber>q.length+1||F.endLineNumberExclusive<1||F.endLineNumberExclusive>q.length+1)}for(const F of B){if(!F.innerChanges)return!1;for(const q of F.innerChanges)if(!(V(q.modifiedRange.getStartPosition(),l)&&V(q.modifiedRange.getEndPosition(),l)&&V(q.originalRange.getStartPosition(),s)&&V(q.originalRange.getEndPosition(),s)))return!1;if(!K(F.modified,l)||!K(F.original,s))return!1}return!0}),new i.LinesDiff(B,W,N)}computeMoves(s,l,o,g,h,m,C){return(0,b.computeMovedLines)(s,l,o,g,h,m).map(I=>{const T=this.refineDiff(l,o,new p.SequenceDiff(I.original.toOffsetRange(),I.modified.toOffsetRange()),m,C),A=f(T.mappings,l,o,!0);return new i.MovedText(I,A)})}refineDiff(s,l,o,g,h){const m=new t.LinesSliceCharSequence(s,o.seq1Range,h),C=new t.LinesSliceCharSequence(l,o.seq2Range,h),w=m.length+C.length<500?this.dynamicProgrammingDiffing.compute(m,C,g):this.myersDiffingAlgorithm.compute(m,C,g);let D=w.diffs;return D=(0,a.optimizeSequenceDiffs)(m,C,D),D=(0,a.extendDiffsToEntireWordIfAppropriate)(m,C,D),D=(0,a.removeShortMatches)(m,C,D),D=(0,a.removeVeryShortMatchingTextBetweenLongDiffs)(m,C,D),{mappings:D.map(T=>new n.RangeMapping(m.translateRange(T.seq1Range),C.translateRange(T.seq2Range))),hitTimeout:w.hitTimeout}}}e.DefaultLinesDiffComputer=u;function f(d,s,l,o=!1){const g=[];for(const h of(0,L.groupAdjacentBy)(d.map(m=>c(m,s,l)),(m,C)=>m.original.overlapOrTouch(C.original)||m.modified.overlapOrTouch(C.modified))){const m=h[0],C=h[h.length-1];g.push(new n.DetailedLineRangeMapping(m.original.join(C.original),m.modified.join(C.modified),h.map(w=>w.innerChanges[0])))}return(0,k.assertFn)(()=>!o&&g.length>0&&g[0].original.startLineNumber!==g[0].modified.startLineNumber?!1:(0,k.checkAdjacentItems)(g,(h,m)=>m.original.startLineNumber-h.original.endLineNumberExclusive===m.modified.startLineNumber-h.modified.endLineNumberExclusive&&h.original.endLineNumberExclusive<m.original.startLineNumber&&h.modified.endLineNumberExclusive<m.modified.startLineNumber)),g}e.lineRangeMappingFromRangeMappings=f;function c(d,s,l){let o=0,g=0;d.modifiedRange.endColumn===1&&d.originalRange.endColumn===1&&d.originalRange.startLineNumber+o<=d.originalRange.endLineNumber&&d.modifiedRange.startLineNumber+o<=d.modifiedRange.endLineNumber&&(g=-1),d.modifiedRange.startColumn-1>=l[d.modifiedRange.startLineNumber-1].length&&d.originalRange.startColumn-1>=s[d.originalRange.startLineNumber-1].length&&d.originalRange.startLineNumber<=d.originalRange.endLineNumber+g&&d.modifiedRange.startLineNumber<=d.modifiedRange.endLineNumber+g&&(o=1);const h=new y.LineRange(d.originalRange.startLineNumber+o,d.originalRange.endLineNumber+1+g),m=new y.LineRange(d.modifiedRange.startLineNumber+o,d.modifiedRange.endLineNumber+1+g);return new n.DetailedLineRangeMapping(h,m,[d])}e.getLineRangeMapping=c}),define(se[506],oe([1,0,173,205,112,11,5,90,62]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffComputer=e.LegacyLinesDiffComputer=void 0;const v=3;class b{computeDiff(o,g,h){var m;const w=new f(o,g,{maxComputationTime:h.maxComputationTimeMs,shouldIgnoreTrimWhitespace:h.ignoreTrimWhitespace,shouldComputeCharChanges:!0,shouldMakePrettyDiff:!0,shouldPostProcessCharChanges:!0}).computeDiff(),D=[];let I=null;for(const T of w.changes){let A;T.originalEndLineNumber===0?A=new _.LineRange(T.originalStartLineNumber+1,T.originalStartLineNumber+1):A=new _.LineRange(T.originalStartLineNumber,T.originalEndLineNumber+1);let P;T.modifiedEndLineNumber===0?P=new _.LineRange(T.modifiedStartLineNumber+1,T.modifiedStartLineNumber+1):P=new _.LineRange(T.modifiedStartLineNumber,T.modifiedEndLineNumber+1);let N=new y.DetailedLineRangeMapping(A,P,(m=T.charChanges)===null||m===void 0?void 0:m.map(M=>new y.RangeMapping(new S.Range(M.originalStartLineNumber,M.originalStartColumn,M.originalEndLineNumber,M.originalEndColumn),new S.Range(M.modifiedStartLineNumber,M.modifiedStartColumn,M.modifiedEndLineNumber,M.modifiedEndColumn))));I&&(I.modified.endLineNumberExclusive===N.modified.startLineNumber||I.original.endLineNumberExclusive===N.original.startLineNumber)&&(N=new y.DetailedLineRangeMapping(I.original.join(N.original),I.modified.join(N.modified),I.innerChanges&&N.innerChanges?I.innerChanges.concat(N.innerChanges):void 0),D.pop()),D.push(N),I=N}return(0,p.assertFn)(()=>(0,p.checkAdjacentItems)(D,(T,A)=>A.original.startLineNumber-T.original.endLineNumberExclusive===A.modified.startLineNumber-T.modified.endLineNumberExclusive&&T.original.endLineNumberExclusive<A.original.startLineNumber&&T.modified.endLineNumberExclusive<A.modified.startLineNumber)),new k.LinesDiff(D,[],w.quitEarly)}}e.LegacyLinesDiffComputer=b;function a(l,o,g,h){return new L.LcsDiff(l,o,g).ComputeDiff(h)}class i{constructor(o){const g=[],h=[];for(let m=0,C=o.length;m<C;m++)g[m]=c(o[m],1),h[m]=d(o[m],1);this.lines=o,this._startColumns=g,this._endColumns=h}getElements(){const o=[];for(let g=0,h=this.lines.length;g<h;g++)o[g]=this.lines[g].substring(this._startColumns[g]-1,this._endColumns[g]-1);return o}getStrictElement(o){return this.lines[o]}getStartLineNumber(o){return o+1}getEndLineNumber(o){return o+1}createCharSequence(o,g,h){const m=[],C=[],w=[];let D=0;for(let I=g;I<=h;I++){const T=this.lines[I],A=o?this._startColumns[I]:1,P=o?this._endColumns[I]:T.length+1;for(let N=A;N<P;N++)m[D]=T.charCodeAt(N-1),C[D]=I+1,w[D]=N,D++;!o&&I<h&&(m[D]=10,C[D]=I+1,w[D]=T.length+1,D++)}return new n(m,C,w)}}class n{constructor(o,g,h){this._charCodes=o,this._lineNumbers=g,this._columns=h}toString(){return"["+this._charCodes.map((o,g)=>(o===10?"\\n":String.fromCharCode(o))+`-(${this._lineNumbers[g]},${this._columns[g]})`).join(", ")+"]"}_assertIndex(o,g){if(o<0||o>=g.length)throw new Error("Illegal index")}getElements(){return this._charCodes}getStartLineNumber(o){return o>0&&o===this._lineNumbers.length?this.getEndLineNumber(o-1):(this._assertIndex(o,this._lineNumbers),this._lineNumbers[o])}getEndLineNumber(o){return o===-1?this.getStartLineNumber(o+1):(this._assertIndex(o,this._lineNumbers),this._charCodes[o]===10?this._lineNumbers[o]+1:this._lineNumbers[o])}getStartColumn(o){return o>0&&o===this._columns.length?this.getEndColumn(o-1):(this._assertIndex(o,this._columns),this._columns[o])}getEndColumn(o){return o===-1?this.getStartColumn(o+1):(this._assertIndex(o,this._columns),this._charCodes[o]===10?1:this._columns[o]+1)}}class t{constructor(o,g,h,m,C,w,D,I){this.originalStartLineNumber=o,this.originalStartColumn=g,this.originalEndLineNumber=h,this.originalEndColumn=m,this.modifiedStartLineNumber=C,this.modifiedStartColumn=w,this.modifiedEndLineNumber=D,this.modifiedEndColumn=I}static createFromDiffChange(o,g,h){const m=g.getStartLineNumber(o.originalStart),C=g.getStartColumn(o.originalStart),w=g.getEndLineNumber(o.originalStart+o.originalLength-1),D=g.getEndColumn(o.originalStart+o.originalLength-1),I=h.getStartLineNumber(o.modifiedStart),T=h.getStartColumn(o.modifiedStart),A=h.getEndLineNumber(o.modifiedStart+o.modifiedLength-1),P=h.getEndColumn(o.modifiedStart+o.modifiedLength-1);return new t(m,C,w,D,I,T,A,P)}}function r(l){if(l.length<=1)return l;const o=[l[0]];let g=o[0];for(let h=1,m=l.length;h<m;h++){const C=l[h],w=C.originalStart-(g.originalStart+g.originalLength),D=C.modifiedStart-(g.modifiedStart+g.modifiedLength);Math.min(w,D)<v?(g.originalLength=C.originalStart+C.originalLength-g.originalStart,g.modifiedLength=C.modifiedStart+C.modifiedLength-g.modifiedStart):(o.push(C),g=C)}return o}class u{constructor(o,g,h,m,C){this.originalStartLineNumber=o,this.originalEndLineNumber=g,this.modifiedStartLineNumber=h,this.modifiedEndLineNumber=m,this.charChanges=C}static createFromDiffResult(o,g,h,m,C,w,D){let I,T,A,P,N;if(g.originalLength===0?(I=h.getStartLineNumber(g.originalStart)-1,T=0):(I=h.getStartLineNumber(g.originalStart),T=h.getEndLineNumber(g.originalStart+g.originalLength-1)),g.modifiedLength===0?(A=m.getStartLineNumber(g.modifiedStart)-1,P=0):(A=m.getStartLineNumber(g.modifiedStart),P=m.getEndLineNumber(g.modifiedStart+g.modifiedLength-1)),w&&g.originalLength>0&&g.originalLength<20&&g.modifiedLength>0&&g.modifiedLength<20&&C()){const M=h.createCharSequence(o,g.originalStart,g.originalStart+g.originalLength-1),R=m.createCharSequence(o,g.modifiedStart,g.modifiedStart+g.modifiedLength-1);if(M.getElements().length>0&&R.getElements().length>0){let x=a(M,R,C,!0).changes;D&&(x=r(x)),N=[];for(let O=0,B=x.length;O<B;O++)N.push(t.createFromDiffChange(x[O],M,R))}}return new u(I,T,A,P,N)}}class f{constructor(o,g,h){this.shouldComputeCharChanges=h.shouldComputeCharChanges,this.shouldPostProcessCharChanges=h.shouldPostProcessCharChanges,this.shouldIgnoreTrimWhitespace=h.shouldIgnoreTrimWhitespace,this.shouldMakePrettyDiff=h.shouldMakePrettyDiff,this.originalLines=o,this.modifiedLines=g,this.original=new i(o),this.modified=new i(g),this.continueLineDiff=s(h.maxComputationTime),this.continueCharDiff=s(h.maxComputationTime===0?0:Math.min(h.maxComputationTime,5e3))}computeDiff(){if(this.original.lines.length===1&&this.original.lines[0].length===0)return this.modified.lines.length===1&&this.modified.lines[0].length===0?{quitEarly:!1,changes:[]}:{quitEarly:!1,changes:[{originalStartLineNumber:1,originalEndLineNumber:1,modifiedStartLineNumber:1,modifiedEndLineNumber:this.modified.lines.length,charChanges:void 0}]};if(this.modified.lines.length===1&&this.modified.lines[0].length===0)return{quitEarly:!1,changes:[{originalStartLineNumber:1,originalEndLineNumber:this.original.lines.length,modifiedStartLineNumber:1,modifiedEndLineNumber:1,charChanges:void 0}]};const o=a(this.original,this.modified,this.continueLineDiff,this.shouldMakePrettyDiff),g=o.changes,h=o.quitEarly;if(this.shouldIgnoreTrimWhitespace){const D=[];for(let I=0,T=g.length;I<T;I++)D.push(u.createFromDiffResult(this.shouldIgnoreTrimWhitespace,g[I],this.original,this.modified,this.continueCharDiff,this.shouldComputeCharChanges,this.shouldPostProcessCharChanges));return{quitEarly:h,changes:D}}const m=[];let C=0,w=0;for(let D=-1,I=g.length;D<I;D++){const T=D+1<I?g[D+1]:null,A=T?T.originalStart:this.originalLines.length,P=T?T.modifiedStart:this.modifiedLines.length;for(;C<A&&w<P;){const N=this.originalLines[C],M=this.modifiedLines[w];if(N!==M){{let R=c(N,1),x=c(M,1);for(;R>1&&x>1;){const O=N.charCodeAt(R-2),B=M.charCodeAt(x-2);if(O!==B)break;R--,x--}(R>1||x>1)&&this._pushTrimWhitespaceCharChange(m,C+1,1,R,w+1,1,x)}{let R=d(N,1),x=d(M,1);const O=N.length+1,B=M.length+1;for(;R<O&&x<B;){const W=N.charCodeAt(R-1),V=N.charCodeAt(x-1);if(W!==V)break;R++,x++}(R<O||x<B)&&this._pushTrimWhitespaceCharChange(m,C+1,R,O,w+1,x,B)}}C++,w++}T&&(m.push(u.createFromDiffResult(this.shouldIgnoreTrimWhitespace,T,this.original,this.modified,this.continueCharDiff,this.shouldComputeCharChanges,this.shouldPostProcessCharChanges)),C+=T.originalLength,w+=T.modifiedLength)}return{quitEarly:h,changes:m}}_pushTrimWhitespaceCharChange(o,g,h,m,C,w,D){if(this._mergeTrimWhitespaceCharChange(o,g,h,m,C,w,D))return;let I;this.shouldComputeCharChanges&&(I=[new t(g,h,g,m,C,w,C,D)]),o.push(new u(g,g,C,C,I))}_mergeTrimWhitespaceCharChange(o,g,h,m,C,w,D){const I=o.length;if(I===0)return!1;const T=o[I-1];return T.originalEndLineNumber===0||T.modifiedEndLineNumber===0?!1:T.originalEndLineNumber===g&&T.modifiedEndLineNumber===C?(this.shouldComputeCharChanges&&T.charChanges&&T.charChanges.push(new t(g,h,g,m,C,w,C,D)),!0):T.originalEndLineNumber+1===g&&T.modifiedEndLineNumber+1===C?(T.originalEndLineNumber=g,T.modifiedEndLineNumber=C,this.shouldComputeCharChanges&&T.charChanges&&T.charChanges.push(new t(g,h,g,m,C,w,C,D)),!0):!1}}e.DiffComputer=f;function c(l,o){const g=E.firstNonWhitespaceIndex(l);return g===-1?o:g+1}function d(l,o){const g=E.lastNonWhitespaceIndex(l);return g===-1?o:g+2}function s(l){if(l===0)return()=>!0;const o=Date.now();return()=>Date.now()-o<l}}),define(se[507],oe([1,0,506,286]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.linesDiffComputers=void 0,e.linesDiffComputers={getLegacy:()=>new L.LegacyLinesDiffComputer,getDefault:()=>new k.DefaultLinesDiffComputer}}),define(se[287],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InternalEditorAction=void 0;class L{constructor(y,E,S,p,_,v,b){this.id=y,this.label=E,this.alias=S,this.metadata=p,this._precondition=_,this._run=v,this._contextKeyService=b}isSupported(){return this._contextKeyService.contextMatchesRules(this._precondition)}run(y){return this.isSupported()?this._run(y):Promise.resolve(void 0)}}e.InternalEditorAction=L}),define(se[180],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorType=void 0,e.EditorType={ICodeEditor:"vs.editor.ICodeEditor",IDiffEditor:"vs.editor.IDiffEditor"}}),define(se[153],oe([1,0,180]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getCodeEditor=e.isCompositeEditor=e.isDiffEditor=e.isCodeEditor=void 0;function k(p){return p&&typeof p.getEditorType=="function"?p.getEditorType()===L.EditorType.ICodeEditor:!1}e.isCodeEditor=k;function y(p){return p&&typeof p.getEditorType=="function"?p.getEditorType()===L.EditorType.IDiffEditor:!1}e.isDiffEditor=y;function E(p){return!!p&&typeof p=="object"&&typeof p.onDidChangeActiveEditor=="function"}e.isCompositeEditor=E;function S(p){return k(p)?p:y(p)?p.getModifiedEditor():E(p)&&k(p.activeCodeEditor)?p.activeCodeEditor:null}e.getCodeEditor=S}),define(se[131],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getEditorFeatures=e.registerEditorFeature=void 0;const L=[];function k(E){L.push(E)}e.registerEditorFeature=k;function y(){return L.slice(0)}e.getEditorFeatures=y}),define(se[508],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorTheme=void 0;class L{get type(){return this._theme.type}get value(){return this._theme}constructor(y){this._theme=y}update(y){this._theme=y}getColor(y){return this._theme.getColor(y)}}e.EditorTheme=L}),define(se[132],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TokenMetadata=void 0;class L{static getLanguageId(y){return(y&255)>>>0}static getTokenType(y){return(y&768)>>>8}static containsBalancedBrackets(y){return(y&1024)!==0}static getFontStyle(y){return(y&30720)>>>11}static getForeground(y){return(y&16744448)>>>15}static getBackground(y){return(y&4278190080)>>>24}static getClassNameFromMetadata(y){let S="mtk"+this.getForeground(y);const p=this.getFontStyle(y);return p&1&&(S+=" mtki"),p&2&&(S+=" mtkb"),p&4&&(S+=" mtku"),p&8&&(S+=" mtks"),S}static getInlineStyleFromMetadata(y,E){const S=this.getForeground(y),p=this.getFontStyle(y);let _=`color: ${E[S]};`;p&1&&(_+="font-style: italic;"),p&2&&(_+="font-weight: bold;");let v="";return p&4&&(v+=" underline"),p&8&&(v+=" line-through"),v&&(_+=`text-decoration:${v};`),_}static getPresentationFromMetadata(y){const E=this.getForeground(y),S=this.getFontStyle(y);return{foreground:E,italic:!!(S&1),bold:!!(S&2),underline:!!(S&4),strikethrough:!!(S&8)}}}e.TokenMetadata=L}),define(se[509],oe([1,0,39]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.computeDefaultDocumentColors=void 0;function k(i){const n=[];for(const t of i){const r=Number(t);(r||r===0&&t.replace(/\s/g,"")!=="")&&n.push(r)}return n}function y(i,n,t,r){return{red:i/255,blue:t/255,green:n/255,alpha:r}}function E(i,n){const t=n.index,r=n[0].length;if(!t)return;const u=i.positionAt(t);return{startLineNumber:u.lineNumber,startColumn:u.column,endLineNumber:u.lineNumber,endColumn:u.column+r}}function S(i,n){if(!i)return;const t=L.Color.Format.CSS.parseHex(n);if(t)return{range:i,color:y(t.rgba.r,t.rgba.g,t.rgba.b,t.rgba.a)}}function p(i,n,t){if(!i||n.length!==1)return;const u=n[0].values(),f=k(u);return{range:i,color:y(f[0],f[1],f[2],t?f[3]:1)}}function _(i,n,t){if(!i||n.length!==1)return;const u=n[0].values(),f=k(u),c=new L.Color(new L.HSLA(f[0],f[1]/100,f[2]/100,t?f[3]:1));return{range:i,color:y(c.rgba.r,c.rgba.g,c.rgba.b,c.rgba.a)}}function v(i,n){return typeof i=="string"?[...i.matchAll(n)]:i.findMatches(n)}function b(i){const n=[],r=v(i,/\b(rgb|rgba|hsl|hsla)(\([0-9\s,.\%]*\))|(#)([A-Fa-f0-9]{3})\b|(#)([A-Fa-f0-9]{4})\b|(#)([A-Fa-f0-9]{6})\b|(#)([A-Fa-f0-9]{8})\b/gm);if(r.length>0)for(const u of r){const f=u.filter(l=>l!==void 0),c=f[1],d=f[2];if(!d)continue;let s;if(c==="rgb"){const l=/^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*\)$/gm;s=p(E(i,u),v(d,l),!1)}else if(c==="rgba"){const l=/^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm;s=p(E(i,u),v(d,l),!0)}else if(c==="hsl"){const l=/^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*\)$/gm;s=_(E(i,u),v(d,l),!1)}else if(c==="hsla"){const l=/^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm;s=_(E(i,u),v(d,l),!0)}else c==="#"&&(s=S(E(i,u),c+d));s&&n.push(s)}return n}function a(i){return!i||typeof i.getValue!="function"||typeof i.positionAt!="function"?[]:b(i)}e.computeDefaultDocumentColors=a}),define(se[113],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AutoClosingPairs=e.StandardAutoClosingPairConditional=e.IndentAction=void 0;var L;(function(S){S[S.None=0]="None",S[S.Indent=1]="Indent",S[S.IndentOutdent=2]="IndentOutdent",S[S.Outdent=3]="Outdent"})(L||(e.IndentAction=L={}));class k{constructor(p){if(this._neutralCharacter=null,this._neutralCharacterSearched=!1,this.open=p.open,this.close=p.close,this._inString=!0,this._inComment=!0,this._inRegEx=!0,Array.isArray(p.notIn))for(let _=0,v=p.notIn.length;_<v;_++)switch(p.notIn[_]){case"string":this._inString=!1;break;case"comment":this._inComment=!1;break;case"regex":this._inRegEx=!1;break}}isOK(p){switch(p){case 0:return!0;case 1:return this._inComment;case 2:return this._inString;case 3:return this._inRegEx}}shouldAutoClose(p,_){if(p.getTokenCount()===0)return!0;const v=p.findTokenIndexAtOffset(_-2),b=p.getStandardTokenType(v);return this.isOK(b)}_findNeutralCharacterInRange(p,_){for(let v=p;v<=_;v++){const b=String.fromCharCode(v);if(!this.open.includes(b)&&!this.close.includes(b))return b}return null}findNeutralCharacter(){return this._neutralCharacterSearched||(this._neutralCharacterSearched=!0,this._neutralCharacter||(this._neutralCharacter=this._findNeutralCharacterInRange(48,57)),this._neutralCharacter||(this._neutralCharacter=this._findNeutralCharacterInRange(97,122)),this._neutralCharacter||(this._neutralCharacter=this._findNeutralCharacterInRange(65,90))),this._neutralCharacter}}e.StandardAutoClosingPairConditional=k;class y{constructor(p){this.autoClosingPairsOpenByStart=new Map,this.autoClosingPairsOpenByEnd=new Map,this.autoClosingPairsCloseByStart=new Map,this.autoClosingPairsCloseByEnd=new Map,this.autoClosingPairsCloseSingleChar=new Map;for(const _ of p)E(this.autoClosingPairsOpenByStart,_.open.charAt(0),_),E(this.autoClosingPairsOpenByEnd,_.open.charAt(_.open.length-1),_),E(this.autoClosingPairsCloseByStart,_.close.charAt(0),_),E(this.autoClosingPairsCloseByEnd,_.close.charAt(_.close.length-1),_),_.close.length===1&&_.open.length===1&&E(this.autoClosingPairsCloseSingleChar,_.close,_)}}e.AutoClosingPairs=y;function E(S,p,_){S.has(p)?S.get(p).push(_):S.set(p,[_])}}),define(se[510],oe([1,0,128]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.computeLinks=e.LinkComputer=e.StateMachine=void 0;class k{constructor(i,n,t){const r=new Uint8Array(i*n);for(let u=0,f=i*n;u<f;u++)r[u]=t;this._data=r,this.rows=i,this.cols=n}get(i,n){return this._data[i*this.cols+n]}set(i,n,t){this._data[i*this.cols+n]=t}}class y{constructor(i){let n=0,t=0;for(let u=0,f=i.length;u<f;u++){const[c,d,s]=i[u];d>n&&(n=d),c>t&&(t=c),s>t&&(t=s)}n++,t++;const r=new k(t,n,0);for(let u=0,f=i.length;u<f;u++){const[c,d,s]=i[u];r.set(c,d,s)}this._states=r,this._maxCharCode=n}nextState(i,n){return n<0||n>=this._maxCharCode?0:this._states.get(i,n)}}e.StateMachine=y;let E=null;function S(){return E===null&&(E=new y([[1,104,2],[1,72,2],[1,102,6],[1,70,6],[2,116,3],[2,84,3],[3,116,4],[3,84,4],[4,112,5],[4,80,5],[5,115,9],[5,83,9],[5,58,10],[6,105,7],[6,73,7],[7,108,8],[7,76,8],[8,101,9],[8,69,9],[9,58,10],[10,47,11],[11,47,12]])),E}let p=null;function _(){if(p===null){p=new L.CharacterClassifier(0);const a=` 	<>'"\u3001\u3002\uFF61\uFF64\uFF0C\uFF0E\uFF1A\uFF1B\u2018\u3008\u300C\u300E\u3014\uFF08\uFF3B\uFF5B\uFF62\uFF63\uFF5D\uFF3D\uFF09\u3015\u300F\u300D\u3009\u2019\uFF40\uFF5E\u2026`;for(let n=0;n<a.length;n++)p.set(a.charCodeAt(n),1);const i=".,;:";for(let n=0;n<i.length;n++)p.set(i.charCodeAt(n),2)}return p}class v{static _createLink(i,n,t,r,u){let f=u-1;do{const c=n.charCodeAt(f);if(i.get(c)!==2)break;f--}while(f>r);if(r>0){const c=n.charCodeAt(r-1),d=n.charCodeAt(f);(c===40&&d===41||c===91&&d===93||c===123&&d===125)&&f--}return{range:{startLineNumber:t,startColumn:r+1,endLineNumber:t,endColumn:f+2},url:n.substring(r,f+1)}}static computeLinks(i,n=S()){const t=_(),r=[];for(let u=1,f=i.getLineCount();u<=f;u++){const c=i.getLineContent(u),d=c.length;let s=0,l=0,o=0,g=1,h=!1,m=!1,C=!1,w=!1;for(;s<d;){let D=!1;const I=c.charCodeAt(s);if(g===13){let T;switch(I){case 40:h=!0,T=0;break;case 41:T=h?0:1;break;case 91:C=!0,m=!0,T=0;break;case 93:C=!1,T=m?0:1;break;case 123:w=!0,T=0;break;case 125:T=w?0:1;break;case 39:case 34:case 96:o===I?T=1:o===39||o===34||o===96?T=0:T=1;break;case 42:T=o===42?1:0;break;case 124:T=o===124?1:0;break;case 32:T=C?0:1;break;default:T=t.get(I)}T===1&&(r.push(v._createLink(t,c,u,l,s)),D=!0)}else if(g===12){let T;I===91?(m=!0,T=0):T=t.get(I),T===1?D=!0:g=13}else g=n.nextState(g,I),g===0&&(D=!0);D&&(g=1,h=!1,m=!1,w=!1,l=s+1,o=I),s++}g===13&&r.push(v._createLink(t,c,u,l,d))}return r}}e.LinkComputer=v;function b(a){return!a||typeof a.getLineCount!="function"||typeof a.getLineContent!="function"?[]:v.computeLinks(a)}e.computeLinks=b}),define(se[133],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ignoreBracketsInToken=e.ScopedLineTokens=e.createScopedLineTokens=void 0;function L(E,S){const p=E.getCount(),_=E.findTokenIndexAtOffset(S),v=E.getLanguageId(_);let b=_;for(;b+1<p&&E.getLanguageId(b+1)===v;)b++;let a=_;for(;a>0&&E.getLanguageId(a-1)===v;)a--;return new k(E,v,a,b+1,E.getStartOffset(a),E.getEndOffset(b))}e.createScopedLineTokens=L;class k{constructor(S,p,_,v,b,a){this._scopedLineTokensBrand=void 0,this._actual=S,this.languageId=p,this._firstTokenIndex=_,this._lastTokenIndex=v,this.firstCharOffset=b,this._lastCharOffset=a}getLineContent(){return this._actual.getLineContent().substring(this.firstCharOffset,this._lastCharOffset)}getActualLineContentBefore(S){return this._actual.getLineContent().substring(0,this.firstCharOffset+S)}getTokenCount(){return this._lastTokenIndex-this._firstTokenIndex}findTokenIndexAtOffset(S){return this._actual.findTokenIndexAtOffset(S+this.firstCharOffset)-this._firstTokenIndex}getStandardTokenType(S){return this._actual.getStandardTokenType(S+this._firstTokenIndex)}}e.ScopedLineTokens=k;function y(E){return(E&3)!==0}e.ignoreBracketsInToken=y}),define(se[75],oe([1,0,10,5,24,133,85,203]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isQuote=e.EditOperationResult=e.SingleCursorState=e.PartialViewCursorState=e.PartialModelCursorState=e.CursorState=e.CursorConfiguration=void 0;const _=()=>!0,v=()=>!1,b=c=>c===" "||c==="	";class a{static shouldRecreate(d){return d.hasChanged(143)||d.hasChanged(129)||d.hasChanged(37)||d.hasChanged(76)||d.hasChanged(78)||d.hasChanged(79)||d.hasChanged(6)||d.hasChanged(7)||d.hasChanged(11)||d.hasChanged(9)||d.hasChanged(10)||d.hasChanged(14)||d.hasChanged(127)||d.hasChanged(50)||d.hasChanged(90)}constructor(d,s,l,o){var g;this.languageConfigurationService=o,this._cursorMoveConfigurationBrand=void 0,this._languageId=d;const h=l.options,m=h.get(143),C=h.get(50);this.readOnly=h.get(90),this.tabSize=s.tabSize,this.indentSize=s.indentSize,this.insertSpaces=s.insertSpaces,this.stickyTabStops=h.get(115),this.lineHeight=C.lineHeight,this.typicalHalfwidthCharacterWidth=C.typicalHalfwidthCharacterWidth,this.pageSize=Math.max(1,Math.floor(m.height/this.lineHeight)-2),this.useTabStops=h.get(127),this.wordSeparators=h.get(129),this.emptySelectionClipboard=h.get(37),this.copyWithSyntaxHighlighting=h.get(25),this.multiCursorMergeOverlapping=h.get(76),this.multiCursorPaste=h.get(78),this.multiCursorLimit=h.get(79),this.autoClosingBrackets=h.get(6),this.autoClosingComments=h.get(7),this.autoClosingQuotes=h.get(11),this.autoClosingDelete=h.get(9),this.autoClosingOvertype=h.get(10),this.autoSurround=h.get(14),this.autoIndent=h.get(12),this.surroundingPairs={},this._electricChars=null,this.shouldAutoCloseBefore={quote:this._getShouldAutoClose(d,this.autoClosingQuotes,!0),comment:this._getShouldAutoClose(d,this.autoClosingComments,!1),bracket:this._getShouldAutoClose(d,this.autoClosingBrackets,!1)},this.autoClosingPairs=this.languageConfigurationService.getLanguageConfiguration(d).getAutoClosingPairs();const w=this.languageConfigurationService.getLanguageConfiguration(d).getSurroundingPairs();if(w)for(const I of w)this.surroundingPairs[I.open]=I.close;const D=this.languageConfigurationService.getLanguageConfiguration(d).comments;this.blockCommentStartToken=(g=D?.blockCommentStartToken)!==null&&g!==void 0?g:null}get electricChars(){var d;if(!this._electricChars){this._electricChars={};const s=(d=this.languageConfigurationService.getLanguageConfiguration(this._languageId).electricCharacter)===null||d===void 0?void 0:d.getElectricCharacters();if(s)for(const l of s)this._electricChars[l]=!0}return this._electricChars}onElectricCharacter(d,s,l){const o=(0,E.createScopedLineTokens)(s,l-1),g=this.languageConfigurationService.getLanguageConfiguration(o.languageId).electricCharacter;return g?g.onElectricCharacter(d,o,l-o.firstCharOffset):null}normalizeIndentation(d){return(0,p.normalizeIndentation)(d,this.indentSize,this.insertSpaces)}_getShouldAutoClose(d,s,l){switch(s){case"beforeWhitespace":return b;case"languageDefined":return this._getLanguageDefinedShouldAutoClose(d,l);case"always":return _;case"never":return v}}_getLanguageDefinedShouldAutoClose(d,s){const l=this.languageConfigurationService.getLanguageConfiguration(d).getAutoCloseBeforeSet(s);return o=>l.indexOf(o)!==-1}visibleColumnFromColumn(d,s){return S.CursorColumns.visibleColumnFromColumn(d.getLineContent(s.lineNumber),s.column,this.tabSize)}columnFromVisibleColumn(d,s,l){const o=S.CursorColumns.columnFromVisibleColumn(d.getLineContent(s),l,this.tabSize),g=d.getLineMinColumn(s);if(o<g)return g;const h=d.getLineMaxColumn(s);return o>h?h:o}}e.CursorConfiguration=a;class i{static fromModelState(d){return new n(d)}static fromViewState(d){return new t(d)}static fromModelSelection(d){const s=y.Selection.liftSelection(d),l=new r(k.Range.fromPositions(s.getSelectionStart()),0,0,s.getPosition(),0);return i.fromModelState(l)}static fromModelSelections(d){const s=[];for(let l=0,o=d.length;l<o;l++)s[l]=this.fromModelSelection(d[l]);return s}constructor(d,s){this._cursorStateBrand=void 0,this.modelState=d,this.viewState=s}equals(d){return this.viewState.equals(d.viewState)&&this.modelState.equals(d.modelState)}}e.CursorState=i;class n{constructor(d){this.modelState=d,this.viewState=null}}e.PartialModelCursorState=n;class t{constructor(d){this.modelState=null,this.viewState=d}}e.PartialViewCursorState=t;class r{constructor(d,s,l,o,g){this.selectionStart=d,this.selectionStartKind=s,this.selectionStartLeftoverVisibleColumns=l,this.position=o,this.leftoverVisibleColumns=g,this._singleCursorStateBrand=void 0,this.selection=r._computeSelection(this.selectionStart,this.position)}equals(d){return this.selectionStartLeftoverVisibleColumns===d.selectionStartLeftoverVisibleColumns&&this.leftoverVisibleColumns===d.leftoverVisibleColumns&&this.selectionStartKind===d.selectionStartKind&&this.position.equals(d.position)&&this.selectionStart.equalsRange(d.selectionStart)}hasSelection(){return!this.selection.isEmpty()||!this.selectionStart.isEmpty()}move(d,s,l,o){return d?new r(this.selectionStart,this.selectionStartKind,this.selectionStartLeftoverVisibleColumns,new L.Position(s,l),o):new r(new k.Range(s,l,s,l),0,o,new L.Position(s,l),o)}static _computeSelection(d,s){return d.isEmpty()||!s.isBeforeOrEqual(d.getStartPosition())?y.Selection.fromPositions(d.getStartPosition(),s):y.Selection.fromPositions(d.getEndPosition(),s)}}e.SingleCursorState=r;class u{constructor(d,s,l){this._editOperationResultBrand=void 0,this.type=d,this.commands=s,this.shouldPushStackElementBefore=l.shouldPushStackElementBefore,this.shouldPushStackElementAfter=l.shouldPushStackElementAfter}}e.EditOperationResult=u;function f(c){return c==="'"||c==='"'||c==="`"}e.isQuote=f}),define(se[511],oe([1,0,75,10,5]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColumnSelection=void 0;class E{static columnSelect(p,_,v,b,a,i){const n=Math.abs(a-v)+1,t=v>a,r=b>i,u=b<i,f=[];for(let c=0;c<n;c++){const d=v+(t?-c:c),s=p.columnFromVisibleColumn(_,d,b),l=p.columnFromVisibleColumn(_,d,i),o=p.visibleColumnFromColumn(_,new k.Position(d,s)),g=p.visibleColumnFromColumn(_,new k.Position(d,l));u&&(o>i||g<b)||r&&(g>b||o<i)||f.push(new L.SingleCursorState(new y.Range(d,s,d,s),0,0,new k.Position(d,l),0))}if(f.length===0)for(let c=0;c<n;c++){const d=v+(t?-c:c),s=_.getLineMaxColumn(d);f.push(new L.SingleCursorState(new y.Range(d,s,d,s),0,0,new k.Position(d,s),0))}return{viewStates:f,reversed:t,fromLineNumber:v,fromVisualColumn:b,toLineNumber:a,toVisualColumn:i}}static columnSelectLeft(p,_,v){let b=v.toViewVisualColumn;return b>0&&b--,E.columnSelect(p,_,v.fromViewLineNumber,v.fromViewVisualColumn,v.toViewLineNumber,b)}static columnSelectRight(p,_,v){let b=0;const a=Math.min(v.fromViewLineNumber,v.toViewLineNumber),i=Math.max(v.fromViewLineNumber,v.toViewLineNumber);for(let t=a;t<=i;t++){const r=_.getLineMaxColumn(t),u=p.visibleColumnFromColumn(_,new k.Position(t,r));b=Math.max(b,u)}let n=v.toViewVisualColumn;return n<b&&n++,this.columnSelect(p,_,v.fromViewLineNumber,v.fromViewVisualColumn,v.toViewLineNumber,n)}static columnSelectUp(p,_,v,b){const a=b?p.pageSize:1,i=Math.max(1,v.toViewLineNumber-a);return this.columnSelect(p,_,v.fromViewLineNumber,v.fromViewVisualColumn,i,v.toViewVisualColumn)}static columnSelectDown(p,_,v,b){const a=b?p.pageSize:1,i=Math.min(_.getLineCount(),v.toViewLineNumber+a);return this.columnSelect(p,_,v.fromViewLineNumber,v.fromViewVisualColumn,i,v.toViewVisualColumn)}}e.ColumnSelection=E}),define(se[206],oe([1,0,11,85,10,5,282,75]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MoveOperations=e.CursorPosition=void 0;class _{constructor(a,i,n){this._cursorPositionBrand=void 0,this.lineNumber=a,this.column=i,this.leftoverVisibleColumns=n}}e.CursorPosition=_;class v{static leftPosition(a,i){if(i.column>a.getLineMinColumn(i.lineNumber))return i.delta(void 0,-L.prevCharLength(a.getLineContent(i.lineNumber),i.column-1));if(i.lineNumber>1){const n=i.lineNumber-1;return new y.Position(n,a.getLineMaxColumn(n))}else return i}static leftPositionAtomicSoftTabs(a,i,n){if(i.column<=a.getLineIndentColumn(i.lineNumber)){const t=a.getLineMinColumn(i.lineNumber),r=a.getLineContent(i.lineNumber),u=S.AtomicTabMoveOperations.atomicPosition(r,i.column-1,n,0);if(u!==-1&&u+1>=t)return new y.Position(i.lineNumber,u+1)}return this.leftPosition(a,i)}static left(a,i,n){const t=a.stickyTabStops?v.leftPositionAtomicSoftTabs(i,n,a.tabSize):v.leftPosition(i,n);return new _(t.lineNumber,t.column,0)}static moveLeft(a,i,n,t,r){let u,f;if(n.hasSelection()&&!t)u=n.selection.startLineNumber,f=n.selection.startColumn;else{const c=n.position.delta(void 0,-(r-1)),d=i.normalizePosition(v.clipPositionColumn(c,i),0),s=v.left(a,i,d);u=s.lineNumber,f=s.column}return n.move(t,u,f,0)}static clipPositionColumn(a,i){return new y.Position(a.lineNumber,v.clipRange(a.column,i.getLineMinColumn(a.lineNumber),i.getLineMaxColumn(a.lineNumber)))}static clipRange(a,i,n){return a<i?i:a>n?n:a}static rightPosition(a,i,n){return n<a.getLineMaxColumn(i)?n=n+L.nextCharLength(a.getLineContent(i),n-1):i<a.getLineCount()&&(i=i+1,n=a.getLineMinColumn(i)),new y.Position(i,n)}static rightPositionAtomicSoftTabs(a,i,n,t,r){if(n<a.getLineIndentColumn(i)){const u=a.getLineContent(i),f=S.AtomicTabMoveOperations.atomicPosition(u,n-1,t,1);if(f!==-1)return new y.Position(i,f+1)}return this.rightPosition(a,i,n)}static right(a,i,n){const t=a.stickyTabStops?v.rightPositionAtomicSoftTabs(i,n.lineNumber,n.column,a.tabSize,a.indentSize):v.rightPosition(i,n.lineNumber,n.column);return new _(t.lineNumber,t.column,0)}static moveRight(a,i,n,t,r){let u,f;if(n.hasSelection()&&!t)u=n.selection.endLineNumber,f=n.selection.endColumn;else{const c=n.position.delta(void 0,r-1),d=i.normalizePosition(v.clipPositionColumn(c,i),1),s=v.right(a,i,d);u=s.lineNumber,f=s.column}return n.move(t,u,f,0)}static vertical(a,i,n,t,r,u,f,c){const d=k.CursorColumns.visibleColumnFromColumn(i.getLineContent(n),t,a.tabSize)+r,s=i.getLineCount(),l=n===1&&t===1,o=n===s&&t===i.getLineMaxColumn(n),g=u<n?l:o;if(n=u,n<1?(n=1,f?t=i.getLineMinColumn(n):t=Math.min(i.getLineMaxColumn(n),t)):n>s?(n=s,f?t=i.getLineMaxColumn(n):t=Math.min(i.getLineMaxColumn(n),t)):t=a.columnFromVisibleColumn(i,n,d),g?r=0:r=d-k.CursorColumns.visibleColumnFromColumn(i.getLineContent(n),t,a.tabSize),c!==void 0){const h=new y.Position(n,t),m=i.normalizePosition(h,c);r=r+(t-m.column),n=m.lineNumber,t=m.column}return new _(n,t,r)}static down(a,i,n,t,r,u,f){return this.vertical(a,i,n,t,r,n+u,f,4)}static moveDown(a,i,n,t,r){let u,f;n.hasSelection()&&!t?(u=n.selection.endLineNumber,f=n.selection.endColumn):(u=n.position.lineNumber,f=n.position.column);let c=0,d;do if(d=v.down(a,i,u+c,f,n.leftoverVisibleColumns,r,!0),i.normalizePosition(new y.Position(d.lineNumber,d.column),2).lineNumber>u)break;while(c++<10&&u+c<i.getLineCount());return n.move(t,d.lineNumber,d.column,d.leftoverVisibleColumns)}static translateDown(a,i,n){const t=n.selection,r=v.down(a,i,t.selectionStartLineNumber,t.selectionStartColumn,n.selectionStartLeftoverVisibleColumns,1,!1),u=v.down(a,i,t.positionLineNumber,t.positionColumn,n.leftoverVisibleColumns,1,!1);return new p.SingleCursorState(new E.Range(r.lineNumber,r.column,r.lineNumber,r.column),0,r.leftoverVisibleColumns,new y.Position(u.lineNumber,u.column),u.leftoverVisibleColumns)}static up(a,i,n,t,r,u,f){return this.vertical(a,i,n,t,r,n-u,f,3)}static moveUp(a,i,n,t,r){let u,f;n.hasSelection()&&!t?(u=n.selection.startLineNumber,f=n.selection.startColumn):(u=n.position.lineNumber,f=n.position.column);const c=v.up(a,i,u,f,n.leftoverVisibleColumns,r,!0);return n.move(t,c.lineNumber,c.column,c.leftoverVisibleColumns)}static translateUp(a,i,n){const t=n.selection,r=v.up(a,i,t.selectionStartLineNumber,t.selectionStartColumn,n.selectionStartLeftoverVisibleColumns,1,!1),u=v.up(a,i,t.positionLineNumber,t.positionColumn,n.leftoverVisibleColumns,1,!1);return new p.SingleCursorState(new E.Range(r.lineNumber,r.column,r.lineNumber,r.column),0,r.leftoverVisibleColumns,new y.Position(u.lineNumber,u.column),u.leftoverVisibleColumns)}static _isBlankLine(a,i){return a.getLineFirstNonWhitespaceColumn(i)===0}static moveToPrevBlankLine(a,i,n,t){let r=n.position.lineNumber;for(;r>1&&this._isBlankLine(i,r);)r--;for(;r>1&&!this._isBlankLine(i,r);)r--;return n.move(t,r,i.getLineMinColumn(r),0)}static moveToNextBlankLine(a,i,n,t){const r=i.getLineCount();let u=n.position.lineNumber;for(;u<r&&this._isBlankLine(i,u);)u++;for(;u<r&&!this._isBlankLine(i,u);)u++;return n.move(t,u,i.getLineMinColumn(u),0)}static moveToBeginningOfLine(a,i,n,t){const r=n.position.lineNumber,u=i.getLineMinColumn(r),f=i.getLineFirstNonWhitespaceColumn(r)||u;let c;return n.position.column===f?c=u:c=f,n.move(t,r,c,0)}static moveToEndOfLine(a,i,n,t,r){const u=n.position.lineNumber,f=i.getLineMaxColumn(u);return n.move(t,u,f,r?1073741824-f:0)}static moveToBeginningOfBuffer(a,i,n,t){return n.move(t,1,1,0)}static moveToEndOfBuffer(a,i,n,t){const r=i.getLineCount(),u=i.getLineMaxColumn(r);return n.move(t,r,u,0)}}e.MoveOperations=v}),define(se[207],oe([1,0,11,130,75,85,206,5,10]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DeleteOperations=void 0;class v{static deleteRight(a,i,n,t){const r=[];let u=a!==3;for(let f=0,c=t.length;f<c;f++){const d=t[f];let s=d;if(s.isEmpty()){const l=d.getPosition(),o=S.MoveOperations.right(i,n,l);s=new p.Range(o.lineNumber,o.column,l.lineNumber,l.column)}if(s.isEmpty()){r[f]=null;continue}s.startLineNumber!==s.endLineNumber&&(u=!0),r[f]=new k.ReplaceCommand(s,"")}return[u,r]}static isAutoClosingPairDelete(a,i,n,t,r,u,f){if(i==="never"&&n==="never"||a==="never")return!1;for(let c=0,d=u.length;c<d;c++){const s=u[c],l=s.getPosition();if(!s.isEmpty())return!1;const o=r.getLineContent(l.lineNumber);if(l.column<2||l.column>=o.length+1)return!1;const g=o.charAt(l.column-2),h=t.get(g);if(!h)return!1;if((0,y.isQuote)(g)){if(n==="never")return!1}else if(i==="never")return!1;const m=o.charAt(l.column-1);let C=!1;for(const w of h)w.open===g&&w.close===m&&(C=!0);if(!C)return!1;if(a==="auto"){let w=!1;for(let D=0,I=f.length;D<I;D++){const T=f[D];if(l.lineNumber===T.startLineNumber&&l.column===T.startColumn){w=!0;break}}if(!w)return!1}}return!0}static _runAutoClosingPairDelete(a,i,n){const t=[];for(let r=0,u=n.length;r<u;r++){const f=n[r].getPosition(),c=new p.Range(f.lineNumber,f.column-1,f.lineNumber,f.column+1);t[r]=new k.ReplaceCommand(c,"")}return[!0,t]}static deleteLeft(a,i,n,t,r){if(this.isAutoClosingPairDelete(i.autoClosingDelete,i.autoClosingBrackets,i.autoClosingQuotes,i.autoClosingPairs.autoClosingPairsOpenByEnd,n,t,r))return this._runAutoClosingPairDelete(i,n,t);const u=[];let f=a!==2;for(let c=0,d=t.length;c<d;c++){const s=v.getDeleteRange(t[c],n,i);if(s.isEmpty()){u[c]=null;continue}s.startLineNumber!==s.endLineNumber&&(f=!0),u[c]=new k.ReplaceCommand(s,"")}return[f,u]}static getDeleteRange(a,i,n){if(!a.isEmpty())return a;const t=a.getPosition();if(n.useTabStops&&t.column>1){const r=i.getLineContent(t.lineNumber),u=L.firstNonWhitespaceIndex(r),f=u===-1?r.length+1:u+1;if(t.column<=f){const c=n.visibleColumnFromColumn(i,t),d=E.CursorColumns.prevIndentTabStop(c,n.indentSize),s=n.columnFromVisibleColumn(i,t.lineNumber,d);return new p.Range(t.lineNumber,s,t.lineNumber,t.column)}}return p.Range.fromPositions(v.getPositionAfterDeleteLeft(t,i),t)}static getPositionAfterDeleteLeft(a,i){if(a.column>1){const n=L.getLeftDeleteOffset(a.column-1,i.getLineContent(a.lineNumber));return a.with(void 0,n+1)}else if(a.lineNumber>1){const n=a.lineNumber-1;return new _.Position(n,i.getLineMaxColumn(n))}else return a}static cut(a,i,n){const t=[];let r=null;n.sort((u,f)=>_.Position.compare(u.getStartPosition(),f.getEndPosition()));for(let u=0,f=n.length;u<f;u++){const c=n[u];if(c.isEmpty())if(a.emptySelectionClipboard){const d=c.getPosition();let s,l,o,g;d.lineNumber<i.getLineCount()?(s=d.lineNumber,l=1,o=d.lineNumber+1,g=1):d.lineNumber>1&&r?.endLineNumber!==d.lineNumber?(s=d.lineNumber-1,l=i.getLineMaxColumn(d.lineNumber-1),o=d.lineNumber,g=i.getLineMaxColumn(d.lineNumber)):(s=d.lineNumber,l=1,o=d.lineNumber,g=i.getLineMaxColumn(d.lineNumber));const h=new p.Range(s,l,o,g);r=h,h.isEmpty()?t[u]=null:t[u]=new k.ReplaceCommand(h,"")}else t[u]=null;else t[u]=new k.ReplaceCommand(c,"")}return new y.EditOperationResult(0,t,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!0})}}e.DeleteOperations=v}),define(se[181],oe([1,0,11,75,207,150,10,5]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WordPartOperations=e.WordOperations=void 0;class _{static _createWord(i,n,t,r,u){return{start:r,end:u,wordType:n,nextCharClass:t}}static _findPreviousWordOnLine(i,n,t){const r=n.getLineContent(t.lineNumber);return this._doFindPreviousWordOnLine(r,i,t)}static _doFindPreviousWordOnLine(i,n,t){let r=0;for(let u=t.column-2;u>=0;u--){const f=i.charCodeAt(u),c=n.get(f);if(c===0){if(r===2)return this._createWord(i,r,c,u+1,this._findEndOfWord(i,n,r,u+1));r=1}else if(c===2){if(r===1)return this._createWord(i,r,c,u+1,this._findEndOfWord(i,n,r,u+1));r=2}else if(c===1&&r!==0)return this._createWord(i,r,c,u+1,this._findEndOfWord(i,n,r,u+1))}return r!==0?this._createWord(i,r,1,0,this._findEndOfWord(i,n,r,0)):null}static _findEndOfWord(i,n,t,r){const u=i.length;for(let f=r;f<u;f++){const c=i.charCodeAt(f),d=n.get(c);if(d===1||t===1&&d===2||t===2&&d===0)return f}return u}static _findNextWordOnLine(i,n,t){const r=n.getLineContent(t.lineNumber);return this._doFindNextWordOnLine(r,i,t)}static _doFindNextWordOnLine(i,n,t){let r=0;const u=i.length;for(let f=t.column-1;f<u;f++){const c=i.charCodeAt(f),d=n.get(c);if(d===0){if(r===2)return this._createWord(i,r,d,this._findStartOfWord(i,n,r,f-1),f);r=1}else if(d===2){if(r===1)return this._createWord(i,r,d,this._findStartOfWord(i,n,r,f-1),f);r=2}else if(d===1&&r!==0)return this._createWord(i,r,d,this._findStartOfWord(i,n,r,f-1),f)}return r!==0?this._createWord(i,r,1,this._findStartOfWord(i,n,r,u-1),u):null}static _findStartOfWord(i,n,t,r){for(let u=r;u>=0;u--){const f=i.charCodeAt(u),c=n.get(f);if(c===1||t===1&&c===2||t===2&&c===0)return u+1}return 0}static moveWordLeft(i,n,t,r){let u=t.lineNumber,f=t.column;f===1&&u>1&&(u=u-1,f=n.getLineMaxColumn(u));let c=_._findPreviousWordOnLine(i,n,new S.Position(u,f));if(r===0)return new S.Position(u,c?c.start+1:1);if(r===1)return c&&c.wordType===2&&c.end-c.start===1&&c.nextCharClass===0&&(c=_._findPreviousWordOnLine(i,n,new S.Position(u,c.start+1))),new S.Position(u,c?c.start+1:1);if(r===3){for(;c&&c.wordType===2;)c=_._findPreviousWordOnLine(i,n,new S.Position(u,c.start+1));return new S.Position(u,c?c.start+1:1)}return c&&f<=c.end+1&&(c=_._findPreviousWordOnLine(i,n,new S.Position(u,c.start+1))),new S.Position(u,c?c.end+1:1)}static _moveWordPartLeft(i,n){const t=n.lineNumber,r=i.getLineMaxColumn(t);if(n.column===1)return t>1?new S.Position(t-1,i.getLineMaxColumn(t-1)):n;const u=i.getLineContent(t);for(let f=n.column-1;f>1;f--){const c=u.charCodeAt(f-2),d=u.charCodeAt(f-1);if(c===95&&d!==95)return new S.Position(t,f);if(c===45&&d!==45)return new S.Position(t,f);if((L.isLowerAsciiLetter(c)||L.isAsciiDigit(c))&&L.isUpperAsciiLetter(d))return new S.Position(t,f);if(L.isUpperAsciiLetter(c)&&L.isUpperAsciiLetter(d)&&f+1<r){const s=u.charCodeAt(f);if(L.isLowerAsciiLetter(s)||L.isAsciiDigit(s))return new S.Position(t,f)}}return new S.Position(t,1)}static moveWordRight(i,n,t,r){let u=t.lineNumber,f=t.column,c=!1;f===n.getLineMaxColumn(u)&&u<n.getLineCount()&&(c=!0,u=u+1,f=1);let d=_._findNextWordOnLine(i,n,new S.Position(u,f));if(r===2)d&&d.wordType===2&&d.end-d.start===1&&d.nextCharClass===0&&(d=_._findNextWordOnLine(i,n,new S.Position(u,d.end+1))),d?f=d.end+1:f=n.getLineMaxColumn(u);else if(r===3){for(c&&(f=0);d&&(d.wordType===2||d.start+1<=f);)d=_._findNextWordOnLine(i,n,new S.Position(u,d.end+1));d?f=d.start+1:f=n.getLineMaxColumn(u)}else d&&!c&&f>=d.start+1&&(d=_._findNextWordOnLine(i,n,new S.Position(u,d.end+1))),d?f=d.start+1:f=n.getLineMaxColumn(u);return new S.Position(u,f)}static _moveWordPartRight(i,n){const t=n.lineNumber,r=i.getLineMaxColumn(t);if(n.column===r)return t<i.getLineCount()?new S.Position(t+1,1):n;const u=i.getLineContent(t);for(let f=n.column+1;f<r;f++){const c=u.charCodeAt(f-2),d=u.charCodeAt(f-1);if(c!==95&&d===95)return new S.Position(t,f);if(c!==45&&d===45)return new S.Position(t,f);if((L.isLowerAsciiLetter(c)||L.isAsciiDigit(c))&&L.isUpperAsciiLetter(d))return new S.Position(t,f);if(L.isUpperAsciiLetter(c)&&L.isUpperAsciiLetter(d)&&f+1<r){const s=u.charCodeAt(f);if(L.isLowerAsciiLetter(s)||L.isAsciiDigit(s))return new S.Position(t,f)}}return new S.Position(t,r)}static _deleteWordLeftWhitespace(i,n){const t=i.getLineContent(n.lineNumber),r=n.column-2,u=L.lastNonWhitespaceIndex(t,r);return u+1<r?new p.Range(n.lineNumber,u+2,n.lineNumber,n.column):null}static deleteWordLeft(i,n){const t=i.wordSeparators,r=i.model,u=i.selection,f=i.whitespaceHeuristics;if(!u.isEmpty())return u;if(y.DeleteOperations.isAutoClosingPairDelete(i.autoClosingDelete,i.autoClosingBrackets,i.autoClosingQuotes,i.autoClosingPairs.autoClosingPairsOpenByEnd,i.model,[i.selection],i.autoClosedCharacters)){const o=i.selection.getPosition();return new p.Range(o.lineNumber,o.column-1,o.lineNumber,o.column+1)}const c=new S.Position(u.positionLineNumber,u.positionColumn);let d=c.lineNumber,s=c.column;if(d===1&&s===1)return null;if(f){const o=this._deleteWordLeftWhitespace(r,c);if(o)return o}let l=_._findPreviousWordOnLine(t,r,c);return n===0?l?s=l.start+1:s>1?s=1:(d--,s=r.getLineMaxColumn(d)):(l&&s<=l.end+1&&(l=_._findPreviousWordOnLine(t,r,new S.Position(d,l.start+1))),l?s=l.end+1:s>1?s=1:(d--,s=r.getLineMaxColumn(d))),new p.Range(d,s,c.lineNumber,c.column)}static deleteInsideWord(i,n,t){if(!t.isEmpty())return t;const r=new S.Position(t.positionLineNumber,t.positionColumn),u=this._deleteInsideWordWhitespace(n,r);return u||this._deleteInsideWordDetermineDeleteRange(i,n,r)}static _charAtIsWhitespace(i,n){const t=i.charCodeAt(n);return t===32||t===9}static _deleteInsideWordWhitespace(i,n){const t=i.getLineContent(n.lineNumber),r=t.length;if(r===0)return null;let u=Math.max(n.column-2,0);if(!this._charAtIsWhitespace(t,u))return null;let f=Math.min(n.column-1,r-1);if(!this._charAtIsWhitespace(t,f))return null;for(;u>0&&this._charAtIsWhitespace(t,u-1);)u--;for(;f+1<r&&this._charAtIsWhitespace(t,f+1);)f++;return new p.Range(n.lineNumber,u+1,n.lineNumber,f+2)}static _deleteInsideWordDetermineDeleteRange(i,n,t){const r=n.getLineContent(t.lineNumber),u=r.length;if(u===0)return t.lineNumber>1?new p.Range(t.lineNumber-1,n.getLineMaxColumn(t.lineNumber-1),t.lineNumber,1):t.lineNumber<n.getLineCount()?new p.Range(t.lineNumber,1,t.lineNumber+1,1):new p.Range(t.lineNumber,1,t.lineNumber,1);const f=o=>o.start+1<=t.column&&t.column<=o.end+1,c=(o,g)=>(o=Math.min(o,t.column),g=Math.max(g,t.column),new p.Range(t.lineNumber,o,t.lineNumber,g)),d=o=>{let g=o.start+1,h=o.end+1,m=!1;for(;h-1<u&&this._charAtIsWhitespace(r,h-1);)m=!0,h++;if(!m)for(;g>1&&this._charAtIsWhitespace(r,g-2);)g--;return c(g,h)},s=_._findPreviousWordOnLine(i,n,t);if(s&&f(s))return d(s);const l=_._findNextWordOnLine(i,n,t);return l&&f(l)?d(l):s&&l?c(s.end+1,l.start+1):s?c(s.start+1,s.end+1):l?c(l.start+1,l.end+1):c(1,u+1)}static _deleteWordPartLeft(i,n){if(!n.isEmpty())return n;const t=n.getPosition(),r=_._moveWordPartLeft(i,t);return new p.Range(t.lineNumber,t.column,r.lineNumber,r.column)}static _findFirstNonWhitespaceChar(i,n){const t=i.length;for(let r=n;r<t;r++){const u=i.charAt(r);if(u!==" "&&u!=="	")return r}return t}static _deleteWordRightWhitespace(i,n){const t=i.getLineContent(n.lineNumber),r=n.column-1,u=this._findFirstNonWhitespaceChar(t,r);return r+1<u?new p.Range(n.lineNumber,n.column,n.lineNumber,u+1):null}static deleteWordRight(i,n){const t=i.wordSeparators,r=i.model,u=i.selection,f=i.whitespaceHeuristics;if(!u.isEmpty())return u;const c=new S.Position(u.positionLineNumber,u.positionColumn);let d=c.lineNumber,s=c.column;const l=r.getLineCount(),o=r.getLineMaxColumn(d);if(d===l&&s===o)return null;if(f){const h=this._deleteWordRightWhitespace(r,c);if(h)return h}let g=_._findNextWordOnLine(t,r,c);return n===2?g?s=g.end+1:s<o||d===l?s=o:(d++,g=_._findNextWordOnLine(t,r,new S.Position(d,1)),g?s=g.start+1:s=r.getLineMaxColumn(d)):(g&&s>=g.start+1&&(g=_._findNextWordOnLine(t,r,new S.Position(d,g.end+1))),g?s=g.start+1:s<o||d===l?s=o:(d++,g=_._findNextWordOnLine(t,r,new S.Position(d,1)),g?s=g.start+1:s=r.getLineMaxColumn(d))),new p.Range(d,s,c.lineNumber,c.column)}static _deleteWordPartRight(i,n){if(!n.isEmpty())return n;const t=n.getPosition(),r=_._moveWordPartRight(i,t);return new p.Range(t.lineNumber,t.column,r.lineNumber,r.column)}static _createWordAtPosition(i,n,t){const r=new p.Range(n,t.start+1,n,t.end+1);return{word:i.getValueInRange(r),startColumn:r.startColumn,endColumn:r.endColumn}}static getWordAtPosition(i,n,t){const r=(0,E.getMapForWordSeparators)(n),u=_._findPreviousWordOnLine(r,i,t);if(u&&u.wordType===1&&u.start<=t.column-1&&t.column-1<=u.end)return _._createWordAtPosition(i,t.lineNumber,u);const f=_._findNextWordOnLine(r,i,t);return f&&f.wordType===1&&f.start<=t.column-1&&t.column-1<=f.end?_._createWordAtPosition(i,t.lineNumber,f):null}static word(i,n,t,r,u){const f=(0,E.getMapForWordSeparators)(i.wordSeparators),c=_._findPreviousWordOnLine(f,n,u),d=_._findNextWordOnLine(f,n,u);if(!r){let h,m;return c&&c.wordType===1&&c.start<=u.column-1&&u.column-1<=c.end?(h=c.start+1,m=c.end+1):d&&d.wordType===1&&d.start<=u.column-1&&u.column-1<=d.end?(h=d.start+1,m=d.end+1):(c?h=c.end+1:h=1,d?m=d.start+1:m=n.getLineMaxColumn(u.lineNumber)),new k.SingleCursorState(new p.Range(u.lineNumber,h,u.lineNumber,m),1,0,new S.Position(u.lineNumber,m),0)}let s,l;c&&c.wordType===1&&c.start<u.column-1&&u.column-1<c.end?(s=c.start+1,l=c.end+1):d&&d.wordType===1&&d.start<u.column-1&&u.column-1<d.end?(s=d.start+1,l=d.end+1):(s=u.column,l=u.column);const o=u.lineNumber;let g;if(t.selectionStart.containsPosition(u))g=t.selectionStart.endColumn;else if(u.isBeforeOrEqual(t.selectionStart.getStartPosition())){g=s;const h=new S.Position(o,g);t.selectionStart.containsPosition(h)&&(g=t.selectionStart.endColumn)}else{g=l;const h=new S.Position(o,g);t.selectionStart.containsPosition(h)&&(g=t.selectionStart.startColumn)}return t.move(!0,o,g,0)}}e.WordOperations=_;class v extends _{static deleteWordPartLeft(i){const n=b([_.deleteWordLeft(i,0),_.deleteWordLeft(i,2),_._deleteWordPartLeft(i.model,i.selection)]);return n.sort(p.Range.compareRangesUsingEnds),n[2]}static deleteWordPartRight(i){const n=b([_.deleteWordRight(i,0),_.deleteWordRight(i,2),_._deleteWordPartRight(i.model,i.selection)]);return n.sort(p.Range.compareRangesUsingStarts),n[0]}static moveWordPartLeft(i,n,t){const r=b([_.moveWordLeft(i,n,t,0),_.moveWordLeft(i,n,t,2),_._moveWordPartLeft(n,t)]);return r.sort(S.Position.compare),r[2]}static moveWordPartRight(i,n,t){const r=b([_.moveWordRight(i,n,t,0),_.moveWordRight(i,n,t,2),_._moveWordPartRight(n,t)]);return r.sort(S.Position.compare),r[0]}}e.WordPartOperations=v;function b(a){return a.filter(i=>!!i)}}),define(se[208],oe([1,0,20,75,206,181,10,5]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorMove=e.CursorMoveCommands=void 0;class _{static addCursorDown(a,i,n){const t=[];let r=0;for(let u=0,f=i.length;u<f;u++){const c=i[u];t[r++]=new k.CursorState(c.modelState,c.viewState),n?t[r++]=k.CursorState.fromModelState(y.MoveOperations.translateDown(a.cursorConfig,a.model,c.modelState)):t[r++]=k.CursorState.fromViewState(y.MoveOperations.translateDown(a.cursorConfig,a,c.viewState))}return t}static addCursorUp(a,i,n){const t=[];let r=0;for(let u=0,f=i.length;u<f;u++){const c=i[u];t[r++]=new k.CursorState(c.modelState,c.viewState),n?t[r++]=k.CursorState.fromModelState(y.MoveOperations.translateUp(a.cursorConfig,a.model,c.modelState)):t[r++]=k.CursorState.fromViewState(y.MoveOperations.translateUp(a.cursorConfig,a,c.viewState))}return t}static moveToBeginningOfLine(a,i,n){const t=[];for(let r=0,u=i.length;r<u;r++){const f=i[r];t[r]=this._moveToLineStart(a,f,n)}return t}static _moveToLineStart(a,i,n){const t=i.viewState.position.column,r=i.modelState.position.column,u=t===r,f=i.viewState.position.lineNumber,c=a.getLineFirstNonWhitespaceColumn(f);return!u&&!(t===c)?this._moveToLineStartByView(a,i,n):this._moveToLineStartByModel(a,i,n)}static _moveToLineStartByView(a,i,n){return k.CursorState.fromViewState(y.MoveOperations.moveToBeginningOfLine(a.cursorConfig,a,i.viewState,n))}static _moveToLineStartByModel(a,i,n){return k.CursorState.fromModelState(y.MoveOperations.moveToBeginningOfLine(a.cursorConfig,a.model,i.modelState,n))}static moveToEndOfLine(a,i,n,t){const r=[];for(let u=0,f=i.length;u<f;u++){const c=i[u];r[u]=this._moveToLineEnd(a,c,n,t)}return r}static _moveToLineEnd(a,i,n,t){const r=i.viewState.position,u=a.getLineMaxColumn(r.lineNumber),f=r.column===u,c=i.modelState.position,d=a.model.getLineMaxColumn(c.lineNumber),s=u-r.column===d-c.column;return f||s?this._moveToLineEndByModel(a,i,n,t):this._moveToLineEndByView(a,i,n,t)}static _moveToLineEndByView(a,i,n,t){return k.CursorState.fromViewState(y.MoveOperations.moveToEndOfLine(a.cursorConfig,a,i.viewState,n,t))}static _moveToLineEndByModel(a,i,n,t){return k.CursorState.fromModelState(y.MoveOperations.moveToEndOfLine(a.cursorConfig,a.model,i.modelState,n,t))}static expandLineSelection(a,i){const n=[];for(let t=0,r=i.length;t<r;t++){const u=i[t],f=u.modelState.selection.startLineNumber,c=a.model.getLineCount();let d=u.modelState.selection.endLineNumber,s;d===c?s=a.model.getLineMaxColumn(c):(d++,s=1),n[t]=k.CursorState.fromModelState(new k.SingleCursorState(new p.Range(f,1,f,1),0,0,new S.Position(d,s),0))}return n}static moveToBeginningOfBuffer(a,i,n){const t=[];for(let r=0,u=i.length;r<u;r++){const f=i[r];t[r]=k.CursorState.fromModelState(y.MoveOperations.moveToBeginningOfBuffer(a.cursorConfig,a.model,f.modelState,n))}return t}static moveToEndOfBuffer(a,i,n){const t=[];for(let r=0,u=i.length;r<u;r++){const f=i[r];t[r]=k.CursorState.fromModelState(y.MoveOperations.moveToEndOfBuffer(a.cursorConfig,a.model,f.modelState,n))}return t}static selectAll(a,i){const n=a.model.getLineCount(),t=a.model.getLineMaxColumn(n);return k.CursorState.fromModelState(new k.SingleCursorState(new p.Range(1,1,1,1),0,0,new S.Position(n,t),0))}static line(a,i,n,t,r){const u=a.model.validatePosition(t),f=r?a.coordinatesConverter.validateViewPosition(new S.Position(r.lineNumber,r.column),u):a.coordinatesConverter.convertModelPositionToViewPosition(u);if(!n){const d=a.model.getLineCount();let s=u.lineNumber+1,l=1;return s>d&&(s=d,l=a.model.getLineMaxColumn(s)),k.CursorState.fromModelState(new k.SingleCursorState(new p.Range(u.lineNumber,1,s,l),2,0,new S.Position(s,l),0))}const c=i.modelState.selectionStart.getStartPosition().lineNumber;if(u.lineNumber<c)return k.CursorState.fromViewState(i.viewState.move(!0,f.lineNumber,1,0));if(u.lineNumber>c){const d=a.getLineCount();let s=f.lineNumber+1,l=1;return s>d&&(s=d,l=a.getLineMaxColumn(s)),k.CursorState.fromViewState(i.viewState.move(!0,s,l,0))}else{const d=i.modelState.selectionStart.getEndPosition();return k.CursorState.fromModelState(i.modelState.move(!0,d.lineNumber,d.column,0))}}static word(a,i,n,t){const r=a.model.validatePosition(t);return k.CursorState.fromModelState(E.WordOperations.word(a.cursorConfig,a.model,i.modelState,n,r))}static cancelSelection(a,i){if(!i.modelState.hasSelection())return new k.CursorState(i.modelState,i.viewState);const n=i.viewState.position.lineNumber,t=i.viewState.position.column;return k.CursorState.fromViewState(new k.SingleCursorState(new p.Range(n,t,n,t),0,0,new S.Position(n,t),0))}static moveTo(a,i,n,t,r){if(n){if(i.modelState.selectionStartKind===1)return this.word(a,i,n,t);if(i.modelState.selectionStartKind===2)return this.line(a,i,n,t,r)}const u=a.model.validatePosition(t),f=r?a.coordinatesConverter.validateViewPosition(new S.Position(r.lineNumber,r.column),u):a.coordinatesConverter.convertModelPositionToViewPosition(u);return k.CursorState.fromViewState(i.viewState.move(n,f.lineNumber,f.column,0))}static simpleMove(a,i,n,t,r,u){switch(n){case 0:return u===4?this._moveHalfLineLeft(a,i,t):this._moveLeft(a,i,t,r);case 1:return u===4?this._moveHalfLineRight(a,i,t):this._moveRight(a,i,t,r);case 2:return u===2?this._moveUpByViewLines(a,i,t,r):this._moveUpByModelLines(a,i,t,r);case 3:return u===2?this._moveDownByViewLines(a,i,t,r):this._moveDownByModelLines(a,i,t,r);case 4:return u===2?i.map(f=>k.CursorState.fromViewState(y.MoveOperations.moveToPrevBlankLine(a.cursorConfig,a,f.viewState,t))):i.map(f=>k.CursorState.fromModelState(y.MoveOperations.moveToPrevBlankLine(a.cursorConfig,a.model,f.modelState,t)));case 5:return u===2?i.map(f=>k.CursorState.fromViewState(y.MoveOperations.moveToNextBlankLine(a.cursorConfig,a,f.viewState,t))):i.map(f=>k.CursorState.fromModelState(y.MoveOperations.moveToNextBlankLine(a.cursorConfig,a.model,f.modelState,t)));case 6:return this._moveToViewMinColumn(a,i,t);case 7:return this._moveToViewFirstNonWhitespaceColumn(a,i,t);case 8:return this._moveToViewCenterColumn(a,i,t);case 9:return this._moveToViewMaxColumn(a,i,t);case 10:return this._moveToViewLastNonWhitespaceColumn(a,i,t);default:return null}}static viewportMove(a,i,n,t,r){const u=a.getCompletelyVisibleViewRange(),f=a.coordinatesConverter.convertViewRangeToModelRange(u);switch(n){case 11:{const c=this._firstLineNumberInRange(a.model,f,r),d=a.model.getLineFirstNonWhitespaceColumn(c);return[this._moveToModelPosition(a,i[0],t,c,d)]}case 13:{const c=this._lastLineNumberInRange(a.model,f,r),d=a.model.getLineFirstNonWhitespaceColumn(c);return[this._moveToModelPosition(a,i[0],t,c,d)]}case 12:{const c=Math.round((f.startLineNumber+f.endLineNumber)/2),d=a.model.getLineFirstNonWhitespaceColumn(c);return[this._moveToModelPosition(a,i[0],t,c,d)]}case 14:{const c=[];for(let d=0,s=i.length;d<s;d++){const l=i[d];c[d]=this.findPositionInViewportIfOutside(a,l,u,t)}return c}default:return null}}static findPositionInViewportIfOutside(a,i,n,t){const r=i.viewState.position.lineNumber;if(n.startLineNumber<=r&&r<=n.endLineNumber-1)return new k.CursorState(i.modelState,i.viewState);{let u;r>n.endLineNumber-1?u=n.endLineNumber-1:r<n.startLineNumber?u=n.startLineNumber:u=r;const f=y.MoveOperations.vertical(a.cursorConfig,a,r,i.viewState.position.column,i.viewState.leftoverVisibleColumns,u,!1);return k.CursorState.fromViewState(i.viewState.move(t,f.lineNumber,f.column,f.leftoverVisibleColumns))}}static _firstLineNumberInRange(a,i,n){let t=i.startLineNumber;return i.startColumn!==a.getLineMinColumn(t)&&t++,Math.min(i.endLineNumber,t+n-1)}static _lastLineNumberInRange(a,i,n){let t=i.startLineNumber;return i.startColumn!==a.getLineMinColumn(t)&&t++,Math.max(t,i.endLineNumber-n+1)}static _moveLeft(a,i,n,t){return i.map(r=>k.CursorState.fromViewState(y.MoveOperations.moveLeft(a.cursorConfig,a,r.viewState,n,t)))}static _moveHalfLineLeft(a,i,n){const t=[];for(let r=0,u=i.length;r<u;r++){const f=i[r],c=f.viewState.position.lineNumber,d=Math.round(a.getLineLength(c)/2);t[r]=k.CursorState.fromViewState(y.MoveOperations.moveLeft(a.cursorConfig,a,f.viewState,n,d))}return t}static _moveRight(a,i,n,t){return i.map(r=>k.CursorState.fromViewState(y.MoveOperations.moveRight(a.cursorConfig,a,r.viewState,n,t)))}static _moveHalfLineRight(a,i,n){const t=[];for(let r=0,u=i.length;r<u;r++){const f=i[r],c=f.viewState.position.lineNumber,d=Math.round(a.getLineLength(c)/2);t[r]=k.CursorState.fromViewState(y.MoveOperations.moveRight(a.cursorConfig,a,f.viewState,n,d))}return t}static _moveDownByViewLines(a,i,n,t){const r=[];for(let u=0,f=i.length;u<f;u++){const c=i[u];r[u]=k.CursorState.fromViewState(y.MoveOperations.moveDown(a.cursorConfig,a,c.viewState,n,t))}return r}static _moveDownByModelLines(a,i,n,t){const r=[];for(let u=0,f=i.length;u<f;u++){const c=i[u];r[u]=k.CursorState.fromModelState(y.MoveOperations.moveDown(a.cursorConfig,a.model,c.modelState,n,t))}return r}static _moveUpByViewLines(a,i,n,t){const r=[];for(let u=0,f=i.length;u<f;u++){const c=i[u];r[u]=k.CursorState.fromViewState(y.MoveOperations.moveUp(a.cursorConfig,a,c.viewState,n,t))}return r}static _moveUpByModelLines(a,i,n,t){const r=[];for(let u=0,f=i.length;u<f;u++){const c=i[u];r[u]=k.CursorState.fromModelState(y.MoveOperations.moveUp(a.cursorConfig,a.model,c.modelState,n,t))}return r}static _moveToViewPosition(a,i,n,t,r){return k.CursorState.fromViewState(i.viewState.move(n,t,r,0))}static _moveToModelPosition(a,i,n,t,r){return k.CursorState.fromModelState(i.modelState.move(n,t,r,0))}static _moveToViewMinColumn(a,i,n){const t=[];for(let r=0,u=i.length;r<u;r++){const f=i[r],c=f.viewState.position.lineNumber,d=a.getLineMinColumn(c);t[r]=this._moveToViewPosition(a,f,n,c,d)}return t}static _moveToViewFirstNonWhitespaceColumn(a,i,n){const t=[];for(let r=0,u=i.length;r<u;r++){const f=i[r],c=f.viewState.position.lineNumber,d=a.getLineFirstNonWhitespaceColumn(c);t[r]=this._moveToViewPosition(a,f,n,c,d)}return t}static _moveToViewCenterColumn(a,i,n){const t=[];for(let r=0,u=i.length;r<u;r++){const f=i[r],c=f.viewState.position.lineNumber,d=Math.round((a.getLineMaxColumn(c)+a.getLineMinColumn(c))/2);t[r]=this._moveToViewPosition(a,f,n,c,d)}return t}static _moveToViewMaxColumn(a,i,n){const t=[];for(let r=0,u=i.length;r<u;r++){const f=i[r],c=f.viewState.position.lineNumber,d=a.getLineMaxColumn(c);t[r]=this._moveToViewPosition(a,f,n,c,d)}return t}static _moveToViewLastNonWhitespaceColumn(a,i,n){const t=[];for(let r=0,u=i.length;r<u;r++){const f=i[r],c=f.viewState.position.lineNumber,d=a.getLineLastNonWhitespaceColumn(c);t[r]=this._moveToViewPosition(a,f,n,c,d)}return t}}e.CursorMoveCommands=_;var v;(function(b){const a=function(n){if(!L.isObject(n))return!1;const t=n;return!(!L.isString(t.to)||!L.isUndefined(t.select)&&!L.isBoolean(t.select)||!L.isUndefined(t.by)&&!L.isString(t.by)||!L.isUndefined(t.value)&&!L.isNumber(t.value))};b.metadata={description:"Move cursor to a logical position in the view",args:[{name:"Cursor move argument object",description:`Property-value pairs that can be passed through this argument:
+					* 'to': A mandatory logical position value providing where to move the cursor.
+						\`\`\`
+						'left', 'right', 'up', 'down', 'prevBlankLine', 'nextBlankLine',
+						'wrappedLineStart', 'wrappedLineEnd', 'wrappedLineColumnCenter'
+						'wrappedLineFirstNonWhitespaceCharacter', 'wrappedLineLastNonWhitespaceCharacter'
+						'viewPortTop', 'viewPortCenter', 'viewPortBottom', 'viewPortIfOutside'
+						\`\`\`
+					* 'by': Unit to move. Default is computed based on 'to' value.
+						\`\`\`
+						'line', 'wrappedLine', 'character', 'halfLine'
+						\`\`\`
+					* 'value': Number of units to move. Default is '1'.
+					* 'select': If 'true' makes the selection. Default is 'false'.
+				`,constraint:a,schema:{type:"object",required:["to"],properties:{to:{type:"string",enum:["left","right","up","down","prevBlankLine","nextBlankLine","wrappedLineStart","wrappedLineEnd","wrappedLineColumnCenter","wrappedLineFirstNonWhitespaceCharacter","wrappedLineLastNonWhitespaceCharacter","viewPortTop","viewPortCenter","viewPortBottom","viewPortIfOutside"]},by:{type:"string",enum:["line","wrappedLine","character","halfLine"]},value:{type:"number",default:1},select:{type:"boolean",default:!1}}}}]},b.RawDirection={Left:"left",Right:"right",Up:"up",Down:"down",PrevBlankLine:"prevBlankLine",NextBlankLine:"nextBlankLine",WrappedLineStart:"wrappedLineStart",WrappedLineFirstNonWhitespaceCharacter:"wrappedLineFirstNonWhitespaceCharacter",WrappedLineColumnCenter:"wrappedLineColumnCenter",WrappedLineEnd:"wrappedLineEnd",WrappedLineLastNonWhitespaceCharacter:"wrappedLineLastNonWhitespaceCharacter",ViewPortTop:"viewPortTop",ViewPortCenter:"viewPortCenter",ViewPortBottom:"viewPortBottom",ViewPortIfOutside:"viewPortIfOutside"},b.RawUnit={Line:"line",WrappedLine:"wrappedLine",Character:"character",HalfLine:"halfLine"};function i(n){if(!n.to)return null;let t;switch(n.to){case b.RawDirection.Left:t=0;break;case b.RawDirection.Right:t=1;break;case b.RawDirection.Up:t=2;break;case b.RawDirection.Down:t=3;break;case b.RawDirection.PrevBlankLine:t=4;break;case b.RawDirection.NextBlankLine:t=5;break;case b.RawDirection.WrappedLineStart:t=6;break;case b.RawDirection.WrappedLineFirstNonWhitespaceCharacter:t=7;break;case b.RawDirection.WrappedLineColumnCenter:t=8;break;case b.RawDirection.WrappedLineEnd:t=9;break;case b.RawDirection.WrappedLineLastNonWhitespaceCharacter:t=10;break;case b.RawDirection.ViewPortTop:t=11;break;case b.RawDirection.ViewPortBottom:t=13;break;case b.RawDirection.ViewPortCenter:t=12;break;case b.RawDirection.ViewPortIfOutside:t=14;break;default:return null}let r=0;switch(n.by){case b.RawUnit.Line:r=1;break;case b.RawUnit.WrappedLine:r=2;break;case b.RawUnit.Character:r=3;break;case b.RawUnit.HalfLine:r=4;break}return{direction:t,unit:r,select:!!n.select,value:n.value||1}}b.parse=i})(v||(e.CursorMove=v={}))}),define(se[512],oe([1,0,75,10,5,24]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Cursor=void 0;class S{constructor(_){this._selTrackedRange=null,this._trackSelection=!0,this._setState(_,new L.SingleCursorState(new y.Range(1,1,1,1),0,0,new k.Position(1,1),0),new L.SingleCursorState(new y.Range(1,1,1,1),0,0,new k.Position(1,1),0))}dispose(_){this._removeTrackedRange(_)}startTrackingSelection(_){this._trackSelection=!0,this._updateTrackedRange(_)}stopTrackingSelection(_){this._trackSelection=!1,this._removeTrackedRange(_)}_updateTrackedRange(_){this._trackSelection&&(this._selTrackedRange=_.model._setTrackedRange(this._selTrackedRange,this.modelState.selection,0))}_removeTrackedRange(_){this._selTrackedRange=_.model._setTrackedRange(this._selTrackedRange,null,0)}asCursorState(){return new L.CursorState(this.modelState,this.viewState)}readSelectionFromMarkers(_){const v=_.model._getTrackedRange(this._selTrackedRange);return this.modelState.selection.isEmpty()&&!v.isEmpty()?E.Selection.fromRange(v.collapseToEnd(),this.modelState.selection.getDirection()):E.Selection.fromRange(v,this.modelState.selection.getDirection())}ensureValidState(_){this._setState(_,this.modelState,this.viewState)}setState(_,v,b){this._setState(_,v,b)}static _validatePositionWithCache(_,v,b,a){return v.equals(b)?a:_.normalizePosition(v,2)}static _validateViewState(_,v){const b=v.position,a=v.selectionStart.getStartPosition(),i=v.selectionStart.getEndPosition(),n=_.normalizePosition(b,2),t=this._validatePositionWithCache(_,a,b,n),r=this._validatePositionWithCache(_,i,a,t);return b.equals(n)&&a.equals(t)&&i.equals(r)?v:new L.SingleCursorState(y.Range.fromPositions(t,r),v.selectionStartKind,v.selectionStartLeftoverVisibleColumns+a.column-t.column,n,v.leftoverVisibleColumns+b.column-n.column)}_setState(_,v,b){if(b&&(b=S._validateViewState(_.viewModel,b)),v){const a=_.model.validateRange(v.selectionStart),i=v.selectionStart.equalsRange(a)?v.selectionStartLeftoverVisibleColumns:0,n=_.model.validatePosition(v.position),t=v.position.equals(n)?v.leftoverVisibleColumns:0;v=new L.SingleCursorState(a,v.selectionStartKind,i,n,t)}else{if(!b)return;const a=_.model.validateRange(_.coordinatesConverter.convertViewRangeToModelRange(b.selectionStart)),i=_.model.validatePosition(_.coordinatesConverter.convertViewPositionToModelPosition(b.position));v=new L.SingleCursorState(a,b.selectionStartKind,b.selectionStartLeftoverVisibleColumns,i,b.leftoverVisibleColumns)}if(b){const a=_.coordinatesConverter.validateViewRange(b.selectionStart,v.selectionStart),i=_.coordinatesConverter.validateViewPosition(b.position,v.position);b=new L.SingleCursorState(a,v.selectionStartKind,v.selectionStartLeftoverVisibleColumns,i,v.leftoverVisibleColumns)}else{const a=_.coordinatesConverter.convertModelPositionToViewPosition(new k.Position(v.selectionStart.startLineNumber,v.selectionStart.startColumn)),i=_.coordinatesConverter.convertModelPositionToViewPosition(new k.Position(v.selectionStart.endLineNumber,v.selectionStart.endColumn)),n=new y.Range(a.lineNumber,a.column,i.lineNumber,i.column),t=_.coordinatesConverter.convertModelPositionToViewPosition(v.position);b=new L.SingleCursorState(n,v.selectionStartKind,v.selectionStartLeftoverVisibleColumns,t,v.leftoverVisibleColumns)}this.modelState=v,this.viewState=b,this._updateTrackedRange(_)}}e.Cursor=S}),define(se[513],oe([1,0,13,60,75,512,10,5,24]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorCollection=void 0;class v{constructor(a){this.context=a,this.cursors=[new E.Cursor(a)],this.lastAddedCursorIndex=0}dispose(){for(const a of this.cursors)a.dispose(this.context)}startTrackingSelections(){for(const a of this.cursors)a.startTrackingSelection(this.context)}stopTrackingSelections(){for(const a of this.cursors)a.stopTrackingSelection(this.context)}updateContext(a){this.context=a}ensureValidState(){for(const a of this.cursors)a.ensureValidState(this.context)}readSelectionFromMarkers(){return this.cursors.map(a=>a.readSelectionFromMarkers(this.context))}getAll(){return this.cursors.map(a=>a.asCursorState())}getViewPositions(){return this.cursors.map(a=>a.viewState.position)}getTopMostViewPosition(){return(0,k.findFirstMinBy)(this.cursors,(0,L.compareBy)(a=>a.viewState.position,S.Position.compare)).viewState.position}getBottomMostViewPosition(){return(0,k.findLastMaxBy)(this.cursors,(0,L.compareBy)(a=>a.viewState.position,S.Position.compare)).viewState.position}getSelections(){return this.cursors.map(a=>a.modelState.selection)}getViewSelections(){return this.cursors.map(a=>a.viewState.selection)}setSelections(a){this.setStates(y.CursorState.fromModelSelections(a))}getPrimaryCursor(){return this.cursors[0].asCursorState()}setStates(a){a!==null&&(this.cursors[0].setState(this.context,a[0].modelState,a[0].viewState),this._setSecondaryStates(a.slice(1)))}_setSecondaryStates(a){const i=this.cursors.length-1,n=a.length;if(i<n){const t=n-i;for(let r=0;r<t;r++)this._addSecondaryCursor()}else if(i>n){const t=i-n;for(let r=0;r<t;r++)this._removeSecondaryCursor(this.cursors.length-2)}for(let t=0;t<n;t++)this.cursors[t+1].setState(this.context,a[t].modelState,a[t].viewState)}killSecondaryCursors(){this._setSecondaryStates([])}_addSecondaryCursor(){this.cursors.push(new E.Cursor(this.context)),this.lastAddedCursorIndex=this.cursors.length-1}getLastAddedCursorIndex(){return this.cursors.length===1||this.lastAddedCursorIndex===0?0:this.lastAddedCursorIndex}_removeSecondaryCursor(a){this.lastAddedCursorIndex>=a+1&&this.lastAddedCursorIndex--,this.cursors[a+1].dispose(this.context),this.cursors.splice(a+1,1)}normalize(){if(this.cursors.length===1)return;const a=this.cursors.slice(0),i=[];for(let n=0,t=a.length;n<t;n++)i.push({index:n,selection:a[n].modelState.selection});i.sort((0,L.compareBy)(n=>n.selection,p.Range.compareRangesUsingStarts));for(let n=0;n<i.length-1;n++){const t=i[n],r=i[n+1],u=t.selection,f=r.selection;if(!this.context.cursorConfig.multiCursorMergeOverlapping)continue;let c;if(f.isEmpty()||u.isEmpty()?c=f.getStartPosition().isBeforeOrEqual(u.getEndPosition()):c=f.getStartPosition().isBefore(u.getEndPosition()),c){const d=t.index<r.index?n:n+1,s=t.index<r.index?n+1:n,l=i[s].index,o=i[d].index,g=i[s].selection,h=i[d].selection;if(!g.equalsSelection(h)){const m=g.plusRange(h),C=g.selectionStartLineNumber===g.startLineNumber&&g.selectionStartColumn===g.startColumn,w=h.selectionStartLineNumber===h.startLineNumber&&h.selectionStartColumn===h.startColumn;let D;l===this.lastAddedCursorIndex?(D=C,this.lastAddedCursorIndex=o):D=w;let I;D?I=new _.Selection(m.startLineNumber,m.startColumn,m.endLineNumber,m.endColumn):I=new _.Selection(m.endLineNumber,m.endColumn,m.startLineNumber,m.startColumn),i[d].selection=I;const T=y.CursorState.fromModelSelection(I);a[o].setState(this.context,T.modelState,T.viewState)}for(const m of i)m.index>l&&m.index--;a.splice(l,1),i.splice(s,1),this._removeSecondaryCursor(l-1),n--}}}}e.CursorCollection=v}),define(se[514],oe([1,0,113]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CharacterPairSupport=void 0;class k{constructor(E){if(E.autoClosingPairs?this._autoClosingPairs=E.autoClosingPairs.map(S=>new L.StandardAutoClosingPairConditional(S)):E.brackets?this._autoClosingPairs=E.brackets.map(S=>new L.StandardAutoClosingPairConditional({open:S[0],close:S[1]})):this._autoClosingPairs=[],E.__electricCharacterSupport&&E.__electricCharacterSupport.docComment){const S=E.__electricCharacterSupport.docComment;this._autoClosingPairs.push(new L.StandardAutoClosingPairConditional({open:S.open,close:S.close||""}))}this._autoCloseBeforeForQuotes=typeof E.autoCloseBefore=="string"?E.autoCloseBefore:k.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_QUOTES,this._autoCloseBeforeForBrackets=typeof E.autoCloseBefore=="string"?E.autoCloseBefore:k.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_BRACKETS,this._surroundingPairs=E.surroundingPairs||this._autoClosingPairs}getAutoClosingPairs(){return this._autoClosingPairs}getAutoCloseBeforeSet(E){return E?this._autoCloseBeforeForQuotes:this._autoCloseBeforeForBrackets}getSurroundingPairs(){return this._surroundingPairs}}e.CharacterPairSupport=k,k.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_QUOTES=`;:.,=}])> 
+	`,k.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_BRACKETS=`'"\`;:.,=}])> 
+	`}),define(se[515],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndentRulesSupport=void 0;function L(y){return y.global&&(y.lastIndex=0),!0}class k{constructor(E){this._indentationRules=E}shouldIncrease(E){return!!(this._indentationRules&&this._indentationRules.increaseIndentPattern&&L(this._indentationRules.increaseIndentPattern)&&this._indentationRules.increaseIndentPattern.test(E))}shouldDecrease(E){return!!(this._indentationRules&&this._indentationRules.decreaseIndentPattern&&L(this._indentationRules.decreaseIndentPattern)&&this._indentationRules.decreaseIndentPattern.test(E))}shouldIndentNextLine(E){return!!(this._indentationRules&&this._indentationRules.indentNextLinePattern&&L(this._indentationRules.indentNextLinePattern)&&this._indentationRules.indentNextLinePattern.test(E))}shouldIgnore(E){return!!(this._indentationRules&&this._indentationRules.unIndentedLinePattern&&L(this._indentationRules.unIndentedLinePattern)&&this._indentationRules.unIndentedLinePattern.test(E))}getIndentMetadata(E){let S=0;return this.shouldIncrease(E)&&(S+=1),this.shouldDecrease(E)&&(S+=2),this.shouldIndentNextLine(E)&&(S+=4),this.shouldIgnore(E)&&(S+=8),S}}e.IndentRulesSupport=k}),define(se[516],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BasicInplaceReplace=void 0;class L{constructor(){this._defaultValueSet=[["true","false"],["True","False"],["Private","Public","Friend","ReadOnly","Partial","Protected","WriteOnly"],["public","protected","private"]]}navigateValueSet(y,E,S,p,_){if(y&&E){const v=this.doNavigateValueSet(E,_);if(v)return{range:y,value:v}}if(S&&p){const v=this.doNavigateValueSet(p,_);if(v)return{range:S,value:v}}return null}doNavigateValueSet(y,E){const S=this.numberReplace(y,E);return S!==null?S:this.textReplace(y,E)}numberReplace(y,E){const S=Math.pow(10,y.length-(y.lastIndexOf(".")+1));let p=Number(y);const _=parseFloat(y);return!isNaN(p)&&!isNaN(_)&&p===_?p===0&&!E?null:(p=Math.floor(p*S),p+=E?S:-S,String(p/S)):null}textReplace(y,E){return this.valueSetsReplace(this._defaultValueSet,y,E)}valueSetsReplace(y,E,S){let p=null;for(let _=0,v=y.length;p===null&&_<v;_++)p=this.valueSetReplace(y[_],E,S);return p}valueSetReplace(y,E,S){let p=y.indexOf(E);return p>=0?(p+=S?1:-1,p<0?p=y.length-1:p%=y.length,y[p]):null}}e.BasicInplaceReplace=L,L.INSTANCE=new L}),define(se[517],oe([1,0,267]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ClosingBracketKind=e.OpeningBracketKind=e.BracketKindBase=e.LanguageBracketsConfiguration=void 0;class k{constructor(v,b){this.languageId=v;const a=b.brackets?y(b.brackets):[],i=new L.CachedFunction(r=>{const u=new Set;return{info:new S(this,r,u),closing:u}}),n=new L.CachedFunction(r=>{const u=new Set,f=new Set;return{info:new p(this,r,u,f),opening:u,openingColorized:f}});for(const[r,u]of a){const f=i.get(r),c=n.get(u);f.closing.add(c.info),c.opening.add(f.info)}const t=b.colorizedBracketPairs?y(b.colorizedBracketPairs):a.filter(r=>!(r[0]==="<"&&r[1]===">"));for(const[r,u]of t){const f=i.get(r),c=n.get(u);f.closing.add(c.info),c.openingColorized.add(f.info),c.opening.add(f.info)}this._openingBrackets=new Map([...i.cachedValues].map(([r,u])=>[r,u.info])),this._closingBrackets=new Map([...n.cachedValues].map(([r,u])=>[r,u.info]))}get openingBrackets(){return[...this._openingBrackets.values()]}get closingBrackets(){return[...this._closingBrackets.values()]}getOpeningBracketInfo(v){return this._openingBrackets.get(v)}getClosingBracketInfo(v){return this._closingBrackets.get(v)}getBracketInfo(v){return this.getOpeningBracketInfo(v)||this.getClosingBracketInfo(v)}}e.LanguageBracketsConfiguration=k;function y(_){return _.filter(([v,b])=>v!==""&&b!=="")}class E{constructor(v,b){this.config=v,this.bracketText=b}get languageId(){return this.config.languageId}}e.BracketKindBase=E;class S extends E{constructor(v,b,a){super(v,b),this.openedBrackets=a,this.isOpeningBracket=!0}}e.OpeningBracketKind=S;class p extends E{constructor(v,b,a,i){super(v,b),this.openingBrackets=a,this.openingColorizedBrackets=i,this.isOpeningBracket=!1}closes(v){return v.config!==this.config?!1:this.openingBrackets.has(v)}closesColorized(v){return v.config!==this.config?!1:this.openingColorizedBrackets.has(v)}getOpeningBrackets(){return[...this.openingBrackets]}}e.ClosingBracketKind=p}),define(se[518],oe([1,0,12,11,113]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OnEnterSupport=void 0;class E{constructor(p){p=p||{},p.brackets=p.brackets||[["(",")"],["{","}"],["[","]"]],this._brackets=[],p.brackets.forEach(_=>{const v=E._createOpenBracketRegExp(_[0]),b=E._createCloseBracketRegExp(_[1]);v&&b&&this._brackets.push({open:_[0],openRegExp:v,close:_[1],closeRegExp:b})}),this._regExpRules=p.onEnterRules||[]}onEnter(p,_,v,b){if(p>=3)for(let a=0,i=this._regExpRules.length;a<i;a++){const n=this._regExpRules[a];if([{reg:n.beforeText,text:v},{reg:n.afterText,text:b},{reg:n.previousLineText,text:_}].every(r=>r.reg?(r.reg.lastIndex=0,r.reg.test(r.text)):!0))return n.action}if(p>=2&&v.length>0&&b.length>0)for(let a=0,i=this._brackets.length;a<i;a++){const n=this._brackets[a];if(n.openRegExp.test(v)&&n.closeRegExp.test(b))return{indentAction:y.IndentAction.IndentOutdent}}if(p>=2&&v.length>0){for(let a=0,i=this._brackets.length;a<i;a++)if(this._brackets[a].openRegExp.test(v))return{indentAction:y.IndentAction.Indent}}return null}static _createOpenBracketRegExp(p){let _=k.escapeRegExpCharacters(p);return/\B/.test(_.charAt(0))||(_="\\b"+_),_+="\\s*$",E._safeRegExp(_)}static _createCloseBracketRegExp(p){let _=k.escapeRegExpCharacters(p);return/\B/.test(_.charAt(_.length-1))||(_=_+"\\b"),_="^\\s*"+_,E._safeRegExp(_)}static _safeRegExp(p){try{return new RegExp(p)}catch(_){return(0,L.onUnexpectedError)(_),null}}}e.OnEnterSupport=E}),define(se[519],oe([1,0,39]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.generateTokensCSSForColorMap=e.ThemeTrieElement=e.ThemeTrieElementRule=e.strcmp=e.toStandardTokenType=e.TokenTheme=e.ColorMap=e.parseTokenTheme=e.ParsedTokenThemeRule=void 0;class k{constructor(u,f,c,d,s){this._parsedThemeRuleBrand=void 0,this.token=u,this.index=f,this.fontStyle=c,this.foreground=d,this.background=s}}e.ParsedTokenThemeRule=k;function y(r){if(!r||!Array.isArray(r))return[];const u=[];let f=0;for(let c=0,d=r.length;c<d;c++){const s=r[c];let l=-1;if(typeof s.fontStyle=="string"){l=0;const h=s.fontStyle.split(" ");for(let m=0,C=h.length;m<C;m++)switch(h[m]){case"italic":l=l|1;break;case"bold":l=l|2;break;case"underline":l=l|4;break;case"strikethrough":l=l|8;break}}let o=null;typeof s.foreground=="string"&&(o=s.foreground);let g=null;typeof s.background=="string"&&(g=s.background),u[f++]=new k(s.token||"",c,l,o,g)}return u}e.parseTokenTheme=y;function E(r,u){r.sort((m,C)=>{const w=a(m.token,C.token);return w!==0?w:m.index-C.index});let f=0,c="000000",d="ffffff";for(;r.length>=1&&r[0].token==="";){const m=r.shift();m.fontStyle!==-1&&(f=m.fontStyle),m.foreground!==null&&(c=m.foreground),m.background!==null&&(d=m.background)}const s=new p;for(const m of u)s.getId(m);const l=s.getId(c),o=s.getId(d),g=new i(f,l,o),h=new n(g);for(let m=0,C=r.length;m<C;m++){const w=r[m];h.insert(w.token,w.fontStyle,s.getId(w.foreground),s.getId(w.background))}return new _(s,h)}const S=/^#?([0-9A-Fa-f]{6})([0-9A-Fa-f]{2})?$/;class p{constructor(){this._lastColorId=0,this._id2color=[],this._color2id=new Map}getId(u){if(u===null)return 0;const f=u.match(S);if(!f)throw new Error("Illegal value for token color: "+u);u=f[1].toUpperCase();let c=this._color2id.get(u);return c||(c=++this._lastColorId,this._color2id.set(u,c),this._id2color[c]=L.Color.fromHex("#"+u),c)}getColorMap(){return this._id2color.slice(0)}}e.ColorMap=p;class _{static createFromRawTokenTheme(u,f){return this.createFromParsedTokenTheme(y(u),f)}static createFromParsedTokenTheme(u,f){return E(u,f)}constructor(u,f){this._colorMap=u,this._root=f,this._cache=new Map}getColorMap(){return this._colorMap.getColorMap()}_match(u){return this._root.match(u)}match(u,f){let c=this._cache.get(f);if(typeof c>"u"){const d=this._match(f),s=b(f);c=(d.metadata|s<<8)>>>0,this._cache.set(f,c)}return(c|u<<0)>>>0}}e.TokenTheme=_;const v=/\b(comment|string|regex|regexp)\b/;function b(r){const u=r.match(v);if(!u)return 0;switch(u[1]){case"comment":return 1;case"string":return 2;case"regex":return 3;case"regexp":return 3}throw new Error("Unexpected match for standard token type!")}e.toStandardTokenType=b;function a(r,u){return r<u?-1:r>u?1:0}e.strcmp=a;class i{constructor(u,f,c){this._themeTrieElementRuleBrand=void 0,this._fontStyle=u,this._foreground=f,this._background=c,this.metadata=(this._fontStyle<<11|this._foreground<<15|this._background<<24)>>>0}clone(){return new i(this._fontStyle,this._foreground,this._background)}acceptOverwrite(u,f,c){u!==-1&&(this._fontStyle=u),f!==0&&(this._foreground=f),c!==0&&(this._background=c),this.metadata=(this._fontStyle<<11|this._foreground<<15|this._background<<24)>>>0}}e.ThemeTrieElementRule=i;class n{constructor(u){this._themeTrieElementBrand=void 0,this._mainRule=u,this._children=new Map}match(u){if(u==="")return this._mainRule;const f=u.indexOf(".");let c,d;f===-1?(c=u,d=""):(c=u.substring(0,f),d=u.substring(f+1));const s=this._children.get(c);return typeof s<"u"?s.match(d):this._mainRule}insert(u,f,c,d){if(u===""){this._mainRule.acceptOverwrite(f,c,d);return}const s=u.indexOf(".");let l,o;s===-1?(l=u,o=""):(l=u.substring(0,s),o=u.substring(s+1));let g=this._children.get(l);typeof g>"u"&&(g=new n(this._mainRule.clone()),this._children.set(l,g)),g.insert(o,f,c,d)}}e.ThemeTrieElement=n;function t(r){const u=[];for(let f=1,c=r.length;f<c;f++){const d=r[f];u[f]=`.mtk${f} { color: ${d}; }`}return u.push(".mtki { font-style: italic; }"),u.push(".mtkb { font-weight: bold; }"),u.push(".mtku { text-decoration: underline; text-underline-position: under; }"),u.push(".mtks { text-decoration: line-through; }"),u.push(".mtks.mtku { text-decoration: underline line-through; text-underline-position: under; }"),u.join(`
+`)}e.generateTokensCSSForColorMap=t}),define(se[41],oe([1,0,55]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.shouldSynchronizeModel=e.ApplyEditsResult=e.SearchData=e.ValidAnnotatedEditOperation=e.isITextSnapshot=e.FindMatch=e.TextModelResolvedOptions=e.InjectedTextCursorStops=e.MinimapPosition=e.GlyphMarginLane=e.OverviewRulerLane=void 0;var k;(function(t){t[t.Left=1]="Left",t[t.Center=2]="Center",t[t.Right=4]="Right",t[t.Full=7]="Full"})(k||(e.OverviewRulerLane=k={}));var y;(function(t){t[t.Left=1]="Left",t[t.Center=2]="Center",t[t.Right=3]="Right"})(y||(e.GlyphMarginLane=y={}));var E;(function(t){t[t.Inline=1]="Inline",t[t.Gutter=2]="Gutter"})(E||(e.MinimapPosition=E={}));var S;(function(t){t[t.Both=0]="Both",t[t.Right=1]="Right",t[t.Left=2]="Left",t[t.None=3]="None"})(S||(e.InjectedTextCursorStops=S={}));class p{get originalIndentSize(){return this._indentSizeIsTabSize?"tabSize":this.indentSize}constructor(r){this._textModelResolvedOptionsBrand=void 0,this.tabSize=Math.max(1,r.tabSize|0),r.indentSize==="tabSize"?(this.indentSize=this.tabSize,this._indentSizeIsTabSize=!0):(this.indentSize=Math.max(1,r.indentSize|0),this._indentSizeIsTabSize=!1),this.insertSpaces=!!r.insertSpaces,this.defaultEOL=r.defaultEOL|0,this.trimAutoWhitespace=!!r.trimAutoWhitespace,this.bracketPairColorizationOptions=r.bracketPairColorizationOptions}equals(r){return this.tabSize===r.tabSize&&this._indentSizeIsTabSize===r._indentSizeIsTabSize&&this.indentSize===r.indentSize&&this.insertSpaces===r.insertSpaces&&this.defaultEOL===r.defaultEOL&&this.trimAutoWhitespace===r.trimAutoWhitespace&&(0,L.equals)(this.bracketPairColorizationOptions,r.bracketPairColorizationOptions)}createChangeEvent(r){return{tabSize:this.tabSize!==r.tabSize,indentSize:this.indentSize!==r.indentSize,insertSpaces:this.insertSpaces!==r.insertSpaces,trimAutoWhitespace:this.trimAutoWhitespace!==r.trimAutoWhitespace}}}e.TextModelResolvedOptions=p;class _{constructor(r,u){this._findMatchBrand=void 0,this.range=r,this.matches=u}}e.FindMatch=_;function v(t){return t&&typeof t.read=="function"}e.isITextSnapshot=v;class b{constructor(r,u,f,c,d,s){this.identifier=r,this.range=u,this.text=f,this.forceMoveMarkers=c,this.isAutoWhitespaceEdit=d,this._isTracked=s}}e.ValidAnnotatedEditOperation=b;class a{constructor(r,u,f){this.regex=r,this.wordSeparators=u,this.simpleSearch=f}}e.SearchData=a;class i{constructor(r,u,f){this.reverseEdits=r,this.changes=u,this.trimAutoWhitespaceLineNumbers=f}}e.ApplyEditsResult=i;function n(t){return!t.isTooLargeForSyncing()&&!t.isForSimpleWidget}e.shouldSynchronizeModel=n}),define(se[91],oe([1,0,11,5]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.lengthOfString=e.lengthsToRange=e.positionToLength=e.lengthGreaterThanEqual=e.lengthLessThanEqual=e.lengthLessThan=e.lengthDiffNonNegative=e.lengthEquals=e.sumLengths=e.lengthAdd=e.lengthGetColumnCountIfZeroLineCount=e.lengthGetLineCount=e.lengthToObj=e.toLength=e.lengthIsZero=e.lengthZero=e.lengthDiff=e.LengthObj=void 0;class y{constructor(g,h){this.lineCount=g,this.columnCount=h}toString(){return`${this.lineCount},${this.columnCount}`}}e.LengthObj=y,y.zero=new y(0,0);function E(o,g,h,m){return o!==h?_(h-o,m):_(0,m-g)}e.lengthDiff=E,e.lengthZero=0;function S(o){return o===0}e.lengthIsZero=S;const p=2**26;function _(o,g){return o*p+g}e.toLength=_;function v(o){const g=o,h=Math.floor(g/p),m=g-h*p;return new y(h,m)}e.lengthToObj=v;function b(o){return Math.floor(o/p)}e.lengthGetLineCount=b;function a(o){return o}e.lengthGetColumnCountIfZeroLineCount=a;function i(o,g){let h=o+g;return g>=p&&(h=h-o%p),h}e.lengthAdd=i;function n(o,g){return o.reduce((h,m)=>i(h,g(m)),e.lengthZero)}e.sumLengths=n;function t(o,g){return o===g}e.lengthEquals=t;function r(o,g){const h=o,m=g;if(m-h<=0)return e.lengthZero;const w=Math.floor(h/p),D=Math.floor(m/p),I=m-D*p;if(w===D){const T=h-w*p;return _(0,I-T)}else return _(D-w,I)}e.lengthDiffNonNegative=r;function u(o,g){return o<g}e.lengthLessThan=u;function f(o,g){return o<=g}e.lengthLessThanEqual=f;function c(o,g){return o>=g}e.lengthGreaterThanEqual=c;function d(o){return _(o.lineNumber-1,o.column-1)}e.positionToLength=d;function s(o,g){const h=o,m=Math.floor(h/p),C=h-m*p,w=g,D=Math.floor(w/p),I=w-D*p;return new k.Range(m+1,C+1,D+1,I+1)}e.lengthsToRange=s;function l(o){const g=(0,L.splitLines)(o);return _(g.length-1,g[g.length-1].length)}e.lengthOfString=l}),define(se[182],oe([1,0,5,91]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BeforeEditPositionMapper=e.TextEditInfo=void 0;class y{static fromModelContentChanges(_){return _.map(b=>{const a=L.Range.lift(b.range);return new y((0,k.positionToLength)(a.getStartPosition()),(0,k.positionToLength)(a.getEndPosition()),(0,k.lengthOfString)(b.text))}).reverse()}constructor(_,v,b){this.startOffset=_,this.endOffset=v,this.newLength=b}toString(){return`[${(0,k.lengthToObj)(this.startOffset)}...${(0,k.lengthToObj)(this.endOffset)}) -> ${(0,k.lengthToObj)(this.newLength)}`}}e.TextEditInfo=y;class E{constructor(_){this.nextEditIdx=0,this.deltaOldToNewLineCount=0,this.deltaOldToNewColumnCount=0,this.deltaLineIdxInOld=-1,this.edits=_.map(v=>S.from(v))}getOffsetBeforeChange(_){return this.adjustNextEdit(_),this.translateCurToOld(_)}getDistanceToNextChange(_){this.adjustNextEdit(_);const v=this.edits[this.nextEditIdx],b=v?this.translateOldToCur(v.offsetObj):null;return b===null?null:(0,k.lengthDiffNonNegative)(_,b)}translateOldToCur(_){return _.lineCount===this.deltaLineIdxInOld?(0,k.toLength)(_.lineCount+this.deltaOldToNewLineCount,_.columnCount+this.deltaOldToNewColumnCount):(0,k.toLength)(_.lineCount+this.deltaOldToNewLineCount,_.columnCount)}translateCurToOld(_){const v=(0,k.lengthToObj)(_);return v.lineCount-this.deltaOldToNewLineCount===this.deltaLineIdxInOld?(0,k.toLength)(v.lineCount-this.deltaOldToNewLineCount,v.columnCount-this.deltaOldToNewColumnCount):(0,k.toLength)(v.lineCount-this.deltaOldToNewLineCount,v.columnCount)}adjustNextEdit(_){for(;this.nextEditIdx<this.edits.length;){const v=this.edits[this.nextEditIdx],b=this.translateOldToCur(v.endOffsetAfterObj);if((0,k.lengthLessThanEqual)(b,_)){this.nextEditIdx++;const a=(0,k.lengthToObj)(b),i=(0,k.lengthToObj)(this.translateOldToCur(v.endOffsetBeforeObj)),n=a.lineCount-i.lineCount;this.deltaOldToNewLineCount+=n;const t=this.deltaLineIdxInOld===v.endOffsetBeforeObj.lineCount?this.deltaOldToNewColumnCount:0,r=a.columnCount-i.columnCount;this.deltaOldToNewColumnCount=t+r,this.deltaLineIdxInOld=v.endOffsetBeforeObj.lineCount}else break}}}e.BeforeEditPositionMapper=E;class S{static from(_){return new S(_.startOffset,_.endOffset,_.newLength)}constructor(_,v,b){this.endOffsetBeforeObj=(0,k.lengthToObj)(v),this.endOffsetAfterObj=(0,k.lengthToObj)((0,k.lengthAdd)(_,b)),this.offsetObj=(0,k.lengthToObj)(_)}}}),define(se[288],oe([1,0,13,182,91]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.combineTextEditInfos=void 0;function E(_,v){if(_.length===0)return v;if(v.length===0)return _;const b=new L.ArrayQueue(p(_)),a=p(v);a.push({modified:!1,lengthBefore:void 0,lengthAfter:void 0});let i=b.dequeue();function n(f){if(f===void 0){const d=b.takeWhile(s=>!0)||[];return i&&d.unshift(i),d}const c=[];for(;i&&!(0,y.lengthIsZero)(f);){const[d,s]=i.splitAt(f);c.push(d),f=(0,y.lengthDiffNonNegative)(d.lengthAfter,f),i=s??b.dequeue()}return(0,y.lengthIsZero)(f)||c.push(new S(!1,f,f)),c}const t=[];function r(f,c,d){if(t.length>0&&(0,y.lengthEquals)(t[t.length-1].endOffset,f)){const s=t[t.length-1];t[t.length-1]=new k.TextEditInfo(s.startOffset,c,(0,y.lengthAdd)(s.newLength,d))}else t.push({startOffset:f,endOffset:c,newLength:d})}let u=y.lengthZero;for(const f of a){const c=n(f.lengthBefore);if(f.modified){const d=(0,y.sumLengths)(c,l=>l.lengthBefore),s=(0,y.lengthAdd)(u,d);r(u,s,f.lengthAfter),u=s}else for(const d of c){const s=u;u=(0,y.lengthAdd)(u,d.lengthBefore),d.modified&&r(s,u,d.lengthAfter)}}return t}e.combineTextEditInfos=E;class S{constructor(v,b,a){this.modified=v,this.lengthBefore=b,this.lengthAfter=a}splitAt(v){const b=(0,y.lengthDiffNonNegative)(v,this.lengthAfter);return(0,y.lengthEquals)(b,y.lengthZero)?[this,void 0]:this.modified?[new S(this.modified,this.lengthBefore,v),new S(this.modified,y.lengthZero,b)]:[new S(this.modified,v,v),new S(this.modified,b,b)]}toString(){return`${this.modified?"M":"U"}:${(0,y.lengthToObj)(this.lengthBefore)} -> ${(0,y.lengthToObj)(this.lengthAfter)}`}}function p(_){const v=[];let b=y.lengthZero;for(const a of _){const i=(0,y.lengthDiffNonNegative)(b,a.startOffset);(0,y.lengthIsZero)(i)||v.push(new S(!1,i,i));const n=(0,y.lengthDiffNonNegative)(a.startOffset,a.endOffset);v.push(new S(!0,n,a.newLength)),b=a.endOffset}return v}}),define(se[520],oe([1,0,91]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.NodeReader=void 0;class k{constructor(p){this.lastOffset=L.lengthZero,this.nextNodes=[p],this.offsets=[L.lengthZero],this.idxs=[]}readLongestNodeAt(p,_){if((0,L.lengthLessThan)(p,this.lastOffset))throw new Error("Invalid offset");for(this.lastOffset=p;;){const v=E(this.nextNodes);if(!v)return;const b=E(this.offsets);if((0,L.lengthLessThan)(p,b))return;if((0,L.lengthLessThan)(b,p))if((0,L.lengthAdd)(b,v.length)<=p)this.nextNodeAfterCurrent();else{const a=y(v);a!==-1?(this.nextNodes.push(v.getChild(a)),this.offsets.push(b),this.idxs.push(a)):this.nextNodeAfterCurrent()}else{if(_(v))return this.nextNodeAfterCurrent(),v;{const a=y(v);if(a===-1){this.nextNodeAfterCurrent();return}else this.nextNodes.push(v.getChild(a)),this.offsets.push(b),this.idxs.push(a)}}}}nextNodeAfterCurrent(){for(;;){const p=E(this.offsets),_=E(this.nextNodes);if(this.nextNodes.pop(),this.offsets.pop(),this.idxs.length===0)break;const v=E(this.nextNodes),b=y(v,this.idxs[this.idxs.length-1]);if(b!==-1){this.nextNodes.push(v.getChild(b)),this.offsets.push((0,L.lengthAdd)(p,_.length)),this.idxs[this.idxs.length-1]=b;break}else this.idxs.pop()}}}e.NodeReader=k;function y(S,p=-1){for(;;){if(p++,p>=S.childrenLength)return-1;if(S.getChild(p))return p}}function E(S){return S.length>0?S[S.length-1]:void 0}}),define(se[134],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DenseKeyProvider=e.identityKeyProvider=e.SmallImmutableSet=void 0;const L=[];class k{static create(S,p){if(S<=128&&p.length===0){let _=k.cache[S];return _||(_=new k(S,p),k.cache[S]=_),_}return new k(S,p)}static getEmpty(){return this.empty}constructor(S,p){this.items=S,this.additionalItems=p}add(S,p){const _=p.getKey(S);let v=_>>5;if(v===0){const a=1<<_|this.items;return a===this.items?this:k.create(a,this.additionalItems)}v--;const b=this.additionalItems.slice(0);for(;b.length<v;)b.push(0);return b[v]|=1<<(_&31),k.create(this.items,b)}merge(S){const p=this.items|S.items;if(this.additionalItems===L&&S.additionalItems===L)return p===this.items?this:p===S.items?S:k.create(p,L);const _=[];for(let v=0;v<Math.max(this.additionalItems.length,S.additionalItems.length);v++){const b=this.additionalItems[v]||0,a=S.additionalItems[v]||0;_.push(b|a)}return k.create(p,_)}intersects(S){if(this.items&S.items)return!0;for(let p=0;p<Math.min(this.additionalItems.length,S.additionalItems.length);p++)if(this.additionalItems[p]&S.additionalItems[p])return!0;return!1}}e.SmallImmutableSet=k,k.cache=new Array(129),k.empty=k.create(0,L),e.identityKeyProvider={getKey(E){return E}};class y{constructor(){this.items=new Map}getKey(S){let p=this.items.get(S);return p===void 0&&(p=this.items.size,this.items.set(S,p)),p}}e.DenseKeyProvider=y}),define(se[183],oe([1,0,12,85,91,134]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InvalidBracketAstNode=e.BracketAstNode=e.TextAstNode=e.ListAstNode=e.PairAstNode=void 0;class S{get length(){return this._length}constructor(d){this._length=d}}class p extends S{static create(d,s,l){let o=d.length;return s&&(o=(0,y.lengthAdd)(o,s.length)),l&&(o=(0,y.lengthAdd)(o,l.length)),new p(o,d,s,l,s?s.missingOpeningBracketIds:E.SmallImmutableSet.getEmpty())}get kind(){return 2}get listHeight(){return 0}get childrenLength(){return 3}getChild(d){switch(d){case 0:return this.openingBracket;case 1:return this.child;case 2:return this.closingBracket}throw new Error("Invalid child index")}get children(){const d=[];return d.push(this.openingBracket),this.child&&d.push(this.child),this.closingBracket&&d.push(this.closingBracket),d}constructor(d,s,l,o,g){super(d),this.openingBracket=s,this.child=l,this.closingBracket=o,this.missingOpeningBracketIds=g}canBeReused(d){return!(this.closingBracket===null||d.intersects(this.missingOpeningBracketIds))}deepClone(){return new p(this.length,this.openingBracket.deepClone(),this.child&&this.child.deepClone(),this.closingBracket&&this.closingBracket.deepClone(),this.missingOpeningBracketIds)}computeMinIndentation(d,s){return this.child?this.child.computeMinIndentation((0,y.lengthAdd)(d,this.openingBracket.length),s):Number.MAX_SAFE_INTEGER}}e.PairAstNode=p;class _ extends S{static create23(d,s,l,o=!1){let g=d.length,h=d.missingOpeningBracketIds;if(d.listHeight!==s.listHeight)throw new Error("Invalid list heights");if(g=(0,y.lengthAdd)(g,s.length),h=h.merge(s.missingOpeningBracketIds),l){if(d.listHeight!==l.listHeight)throw new Error("Invalid list heights");g=(0,y.lengthAdd)(g,l.length),h=h.merge(l.missingOpeningBracketIds)}return o?new b(g,d.listHeight+1,d,s,l,h):new v(g,d.listHeight+1,d,s,l,h)}static getEmpty(){return new i(y.lengthZero,0,[],E.SmallImmutableSet.getEmpty())}get kind(){return 4}get missingOpeningBracketIds(){return this._missingOpeningBracketIds}constructor(d,s,l){super(d),this.listHeight=s,this._missingOpeningBracketIds=l,this.cachedMinIndentation=-1}throwIfImmutable(){}makeLastElementMutable(){this.throwIfImmutable();const d=this.childrenLength;if(d===0)return;const s=this.getChild(d-1),l=s.kind===4?s.toMutable():s;return s!==l&&this.setChild(d-1,l),l}makeFirstElementMutable(){if(this.throwIfImmutable(),this.childrenLength===0)return;const s=this.getChild(0),l=s.kind===4?s.toMutable():s;return s!==l&&this.setChild(0,l),l}canBeReused(d){if(d.intersects(this.missingOpeningBracketIds)||this.childrenLength===0)return!1;let s=this;for(;s.kind===4;){const l=s.childrenLength;if(l===0)throw new L.BugIndicatingError;s=s.getChild(l-1)}return s.canBeReused(d)}handleChildrenChanged(){this.throwIfImmutable();const d=this.childrenLength;let s=this.getChild(0).length,l=this.getChild(0).missingOpeningBracketIds;for(let o=1;o<d;o++){const g=this.getChild(o);s=(0,y.lengthAdd)(s,g.length),l=l.merge(g.missingOpeningBracketIds)}this._length=s,this._missingOpeningBracketIds=l,this.cachedMinIndentation=-1}computeMinIndentation(d,s){if(this.cachedMinIndentation!==-1)return this.cachedMinIndentation;let l=Number.MAX_SAFE_INTEGER,o=d;for(let g=0;g<this.childrenLength;g++){const h=this.getChild(g);h&&(l=Math.min(l,h.computeMinIndentation(o,s)),o=(0,y.lengthAdd)(o,h.length))}return this.cachedMinIndentation=l,l}}e.ListAstNode=_;class v extends _{get childrenLength(){return this._item3!==null?3:2}getChild(d){switch(d){case 0:return this._item1;case 1:return this._item2;case 2:return this._item3}throw new Error("Invalid child index")}setChild(d,s){switch(d){case 0:this._item1=s;return;case 1:this._item2=s;return;case 2:this._item3=s;return}throw new Error("Invalid child index")}get children(){return this._item3?[this._item1,this._item2,this._item3]:[this._item1,this._item2]}get item1(){return this._item1}get item2(){return this._item2}get item3(){return this._item3}constructor(d,s,l,o,g,h){super(d,s,h),this._item1=l,this._item2=o,this._item3=g}deepClone(){return new v(this.length,this.listHeight,this._item1.deepClone(),this._item2.deepClone(),this._item3?this._item3.deepClone():null,this.missingOpeningBracketIds)}appendChildOfSameHeight(d){if(this._item3)throw new Error("Cannot append to a full (2,3) tree node");this.throwIfImmutable(),this._item3=d,this.handleChildrenChanged()}unappendChild(){if(!this._item3)throw new Error("Cannot remove from a non-full (2,3) tree node");this.throwIfImmutable();const d=this._item3;return this._item3=null,this.handleChildrenChanged(),d}prependChildOfSameHeight(d){if(this._item3)throw new Error("Cannot prepend to a full (2,3) tree node");this.throwIfImmutable(),this._item3=this._item2,this._item2=this._item1,this._item1=d,this.handleChildrenChanged()}unprependChild(){if(!this._item3)throw new Error("Cannot remove from a non-full (2,3) tree node");this.throwIfImmutable();const d=this._item1;return this._item1=this._item2,this._item2=this._item3,this._item3=null,this.handleChildrenChanged(),d}toMutable(){return this}}class b extends v{toMutable(){return new v(this.length,this.listHeight,this.item1,this.item2,this.item3,this.missingOpeningBracketIds)}throwIfImmutable(){throw new Error("this instance is immutable")}}class a extends _{get childrenLength(){return this._children.length}getChild(d){return this._children[d]}setChild(d,s){this._children[d]=s}get children(){return this._children}constructor(d,s,l,o){super(d,s,o),this._children=l}deepClone(){const d=new Array(this._children.length);for(let s=0;s<this._children.length;s++)d[s]=this._children[s].deepClone();return new a(this.length,this.listHeight,d,this.missingOpeningBracketIds)}appendChildOfSameHeight(d){this.throwIfImmutable(),this._children.push(d),this.handleChildrenChanged()}unappendChild(){this.throwIfImmutable();const d=this._children.pop();return this.handleChildrenChanged(),d}prependChildOfSameHeight(d){this.throwIfImmutable(),this._children.unshift(d),this.handleChildrenChanged()}unprependChild(){this.throwIfImmutable();const d=this._children.shift();return this.handleChildrenChanged(),d}toMutable(){return this}}class i extends a{toMutable(){return new a(this.length,this.listHeight,[...this.children],this.missingOpeningBracketIds)}throwIfImmutable(){throw new Error("this instance is immutable")}}const n=[];class t extends S{get listHeight(){return 0}get childrenLength(){return 0}getChild(d){return null}get children(){return n}deepClone(){return this}}class r extends t{get kind(){return 0}get missingOpeningBracketIds(){return E.SmallImmutableSet.getEmpty()}canBeReused(d){return!0}computeMinIndentation(d,s){const l=(0,y.lengthToObj)(d),o=(l.columnCount===0?l.lineCount:l.lineCount+1)+1,g=(0,y.lengthGetLineCount)((0,y.lengthAdd)(d,this.length))+1;let h=Number.MAX_SAFE_INTEGER;for(let m=o;m<=g;m++){const C=s.getLineFirstNonWhitespaceColumn(m),w=s.getLineContent(m);if(C===0)continue;const D=k.CursorColumns.visibleColumnFromColumn(w,C,s.getOptions().tabSize);h=Math.min(h,D)}return h}}e.TextAstNode=r;class u extends t{static create(d,s,l){return new u(d,s,l)}get kind(){return 1}get missingOpeningBracketIds(){return E.SmallImmutableSet.getEmpty()}constructor(d,s,l){super(d),this.bracketInfo=s,this.bracketIds=l}get text(){return this.bracketInfo.bracketText}get languageId(){return this.bracketInfo.languageId}canBeReused(d){return!1}computeMinIndentation(d,s){return Number.MAX_SAFE_INTEGER}}e.BracketAstNode=u;class f extends t{get kind(){return 3}constructor(d,s){super(s),this.missingOpeningBracketIds=d}canBeReused(d){return!d.intersects(this.missingOpeningBracketIds)}computeMinIndentation(d,s){return Number.MAX_SAFE_INTEGER}}e.InvalidBracketAstNode=f}),define(se[521],oe([1,0,183]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.concat23TreesOfSameHeight=e.concat23Trees=void 0;function k(v){if(v.length===0)return null;if(v.length===1)return v[0];let b=0;function a(){if(b>=v.length)return null;const r=b,u=v[r].listHeight;for(b++;b<v.length&&v[b].listHeight===u;)b++;return b-r>=2?y(r===0&&b===v.length?v:v.slice(r,b),!1):v[r]}let i=a(),n=a();if(!n)return i;for(let r=a();r;r=a())E(i,n)<=E(n,r)?(i=S(i,n),n=r):n=S(n,r);return S(i,n)}e.concat23Trees=k;function y(v,b=!1){if(v.length===0)return null;if(v.length===1)return v[0];let a=v.length;for(;a>3;){const i=a>>1;for(let n=0;n<i;n++){const t=n<<1;v[n]=L.ListAstNode.create23(v[t],v[t+1],t+3===a?v[t+2]:null,b)}a=i}return L.ListAstNode.create23(v[0],v[1],a>=3?v[2]:null,b)}e.concat23TreesOfSameHeight=y;function E(v,b){return Math.abs(v.listHeight-b.listHeight)}function S(v,b){return v.listHeight===b.listHeight?L.ListAstNode.create23(v,b,null,!1):v.listHeight>b.listHeight?p(v,b):_(b,v)}function p(v,b){v=v.toMutable();let a=v;const i=[];let n;for(;;){if(b.listHeight===a.listHeight){n=b;break}if(a.kind!==4)throw new Error("unexpected");i.push(a),a=a.makeLastElementMutable()}for(let t=i.length-1;t>=0;t--){const r=i[t];n?r.childrenLength>=3?n=L.ListAstNode.create23(r.unappendChild(),n,null,!1):(r.appendChildOfSameHeight(n),n=void 0):r.handleChildrenChanged()}return n?L.ListAstNode.create23(v,n,null,!1):v}function _(v,b){v=v.toMutable();let a=v;const i=[];for(;b.listHeight!==a.listHeight;){if(a.kind!==4)throw new Error("unexpected");i.push(a),a=a.makeFirstElementMutable()}let n=b;for(let t=i.length-1;t>=0;t--){const r=i[t];n?r.childrenLength>=3?n=L.ListAstNode.create23(n,r.unprependChild(),null,!1):(r.prependChildOfSameHeight(n),n=void 0):r.handleChildrenChanged()}return n?L.ListAstNode.create23(n,v,null,!1):v}}),define(se[289],oe([1,0,183,182,134,91,521,520]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.parseDocument=void 0;function _(b,a,i,n){return new v(b,a,i,n).parseDocument()}e.parseDocument=_;class v{constructor(a,i,n,t){if(this.tokenizer=a,this.createImmutableLists=t,this._itemsConstructed=0,this._itemsFromCache=0,n&&t)throw new Error("Not supported");this.oldNodeReader=n?new p.NodeReader(n):void 0,this.positionMapper=new k.BeforeEditPositionMapper(i)}parseDocument(){this._itemsConstructed=0,this._itemsFromCache=0;let a=this.parseList(y.SmallImmutableSet.getEmpty(),0);return a||(a=L.ListAstNode.getEmpty()),a}parseList(a,i){const n=[];for(;;){let r=this.tryReadChildFromCache(a);if(!r){const u=this.tokenizer.peek();if(!u||u.kind===2&&u.bracketIds.intersects(a))break;r=this.parseChild(a,i+1)}r.kind===4&&r.childrenLength===0||n.push(r)}return this.oldNodeReader?(0,S.concat23Trees)(n):(0,S.concat23TreesOfSameHeight)(n,this.createImmutableLists)}tryReadChildFromCache(a){if(this.oldNodeReader){const i=this.positionMapper.getDistanceToNextChange(this.tokenizer.offset);if(i===null||!(0,E.lengthIsZero)(i)){const n=this.oldNodeReader.readLongestNodeAt(this.positionMapper.getOffsetBeforeChange(this.tokenizer.offset),t=>i!==null&&!(0,E.lengthLessThan)(t.length,i)?!1:t.canBeReused(a));if(n)return this._itemsFromCache++,this.tokenizer.skip(n.length),n}}}parseChild(a,i){this._itemsConstructed++;const n=this.tokenizer.read();switch(n.kind){case 2:return new L.InvalidBracketAstNode(n.bracketIds,n.length);case 0:return n.astNode;case 1:{if(i>300)return new L.TextAstNode(n.length);const t=a.merge(n.bracketIds),r=this.parseList(t,i+1),u=this.tokenizer.peek();return u&&u.kind===2&&(u.bracketId===n.bracketId||u.bracketIds.intersects(n.bracketIds))?(this.tokenizer.read(),L.PairAstNode.create(n.astNode,r,u.astNode)):L.PairAstNode.create(n.astNode,r,null)}default:throw new Error("unexpected")}}}}),define(se[209],oe([1,0,12,132,183,91,134]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FastTokenizer=e.TextBufferTokenizer=e.Token=void 0;class p{constructor(i,n,t,r,u){this.length=i,this.kind=n,this.bracketId=t,this.bracketIds=r,this.astNode=u}}e.Token=p;class _{constructor(i,n){this.textModel=i,this.bracketTokens=n,this.reader=new v(this.textModel,this.bracketTokens),this._offset=E.lengthZero,this.didPeek=!1,this.peeked=null,this.textBufferLineCount=i.getLineCount(),this.textBufferLastLineLength=i.getLineLength(this.textBufferLineCount)}get offset(){return this._offset}get length(){return(0,E.toLength)(this.textBufferLineCount-1,this.textBufferLastLineLength)}skip(i){this.didPeek=!1,this._offset=(0,E.lengthAdd)(this._offset,i);const n=(0,E.lengthToObj)(this._offset);this.reader.setPosition(n.lineCount,n.columnCount)}read(){let i;return this.peeked?(this.didPeek=!1,i=this.peeked):i=this.reader.read(),i&&(this._offset=(0,E.lengthAdd)(this._offset,i.length)),i}peek(){return this.didPeek||(this.peeked=this.reader.read(),this.didPeek=!0),this.peeked}}e.TextBufferTokenizer=_;class v{constructor(i,n){this.textModel=i,this.bracketTokens=n,this.lineIdx=0,this.line=null,this.lineCharOffset=0,this.lineTokens=null,this.lineTokenOffset=0,this.peekedToken=null,this.textBufferLineCount=i.getLineCount(),this.textBufferLastLineLength=i.getLineLength(this.textBufferLineCount)}setPosition(i,n){i===this.lineIdx?(this.lineCharOffset=n,this.line!==null&&(this.lineTokenOffset=this.lineCharOffset===0?0:this.lineTokens.findTokenIndexAtOffset(this.lineCharOffset))):(this.lineIdx=i,this.lineCharOffset=n,this.line=null),this.peekedToken=null}read(){if(this.peekedToken){const u=this.peekedToken;return this.peekedToken=null,this.lineCharOffset+=(0,E.lengthGetColumnCountIfZeroLineCount)(u.length),u}if(this.lineIdx>this.textBufferLineCount-1||this.lineIdx===this.textBufferLineCount-1&&this.lineCharOffset>=this.textBufferLastLineLength)return null;this.line===null&&(this.lineTokens=this.textModel.tokenization.getLineTokens(this.lineIdx+1),this.line=this.lineTokens.getLineContent(),this.lineTokenOffset=this.lineCharOffset===0?0:this.lineTokens.findTokenIndexAtOffset(this.lineCharOffset));const i=this.lineIdx,n=this.lineCharOffset;let t=0;for(;;){const u=this.lineTokens,f=u.getCount();let c=null;if(this.lineTokenOffset<f){const d=u.getMetadata(this.lineTokenOffset);for(;this.lineTokenOffset+1<f&&d===u.getMetadata(this.lineTokenOffset+1);)this.lineTokenOffset++;const s=k.TokenMetadata.getTokenType(d)===0,l=k.TokenMetadata.containsBalancedBrackets(d),o=u.getEndOffset(this.lineTokenOffset);if(l&&s&&this.lineCharOffset<o){const g=u.getLanguageId(this.lineTokenOffset),h=this.line.substring(this.lineCharOffset,o),m=this.bracketTokens.getSingleLanguageBracketTokens(g),C=m.regExpGlobal;if(C){C.lastIndex=0;const w=C.exec(h);w&&(c=m.getToken(w[0]),c&&(this.lineCharOffset+=w.index))}}if(t+=o-this.lineCharOffset,c)if(i!==this.lineIdx||n!==this.lineCharOffset){this.peekedToken=c;break}else return this.lineCharOffset+=(0,E.lengthGetColumnCountIfZeroLineCount)(c.length),c;else this.lineTokenOffset++,this.lineCharOffset=o}else if(this.lineIdx===this.textBufferLineCount-1||(this.lineIdx++,this.lineTokens=this.textModel.tokenization.getLineTokens(this.lineIdx+1),this.lineTokenOffset=0,this.line=this.lineTokens.getLineContent(),this.lineCharOffset=0,t+=33,t>1e3))break;if(t>1500)break}const r=(0,E.lengthDiff)(i,n,this.lineIdx,this.lineCharOffset);return new p(r,0,-1,S.SmallImmutableSet.getEmpty(),new y.TextAstNode(r))}}class b{constructor(i,n){this.text=i,this._offset=E.lengthZero,this.idx=0;const t=n.getRegExpStr(),r=t?new RegExp(t+`|
+`,"gi"):null,u=[];let f,c=0,d=0,s=0,l=0;const o=[];for(let m=0;m<60;m++)o.push(new p((0,E.toLength)(0,m),0,-1,S.SmallImmutableSet.getEmpty(),new y.TextAstNode((0,E.toLength)(0,m))));const g=[];for(let m=0;m<60;m++)g.push(new p((0,E.toLength)(1,m),0,-1,S.SmallImmutableSet.getEmpty(),new y.TextAstNode((0,E.toLength)(1,m))));if(r)for(r.lastIndex=0;(f=r.exec(i))!==null;){const m=f.index,C=f[0];if(C===`
+`)c++,d=m+1;else{if(s!==m){let w;if(l===c){const D=m-s;if(D<o.length)w=o[D];else{const I=(0,E.toLength)(0,D);w=new p(I,0,-1,S.SmallImmutableSet.getEmpty(),new y.TextAstNode(I))}}else{const D=c-l,I=m-d;if(D===1&&I<g.length)w=g[I];else{const T=(0,E.toLength)(D,I);w=new p(T,0,-1,S.SmallImmutableSet.getEmpty(),new y.TextAstNode(T))}}u.push(w)}u.push(n.getToken(C)),s=m+C.length,l=c}}const h=i.length;if(s!==h){const m=l===c?(0,E.toLength)(0,h-s):(0,E.toLength)(c-l,h-d);u.push(new p(m,0,-1,S.SmallImmutableSet.getEmpty(),new y.TextAstNode(m)))}this.length=(0,E.toLength)(c,h-d),this.tokens=u}get offset(){return this._offset}read(){return this.tokens[this.idx++]||null}peek(){return this.tokens[this.idx]||null}skip(i){throw new L.NotSupportedError}}e.FastTokenizer=b}),define(se[290],oe([1,0,11,183,91,134,209]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguageAgnosticBracketTokens=e.BracketTokens=void 0;class p{static createFromLanguage(a,i){function n(r){return i.getKey(`${r.languageId}:::${r.bracketText}`)}const t=new Map;for(const r of a.bracketsNew.openingBrackets){const u=(0,y.toLength)(0,r.bracketText.length),f=n(r),c=E.SmallImmutableSet.getEmpty().add(f,E.identityKeyProvider);t.set(r.bracketText,new S.Token(u,1,f,c,k.BracketAstNode.create(u,r,c)))}for(const r of a.bracketsNew.closingBrackets){const u=(0,y.toLength)(0,r.bracketText.length);let f=E.SmallImmutableSet.getEmpty();const c=r.getOpeningBrackets();for(const d of c)f=f.add(n(d),E.identityKeyProvider);t.set(r.bracketText,new S.Token(u,2,n(c[0]),f,k.BracketAstNode.create(u,r,f)))}return new p(t)}constructor(a){this.map=a,this.hasRegExp=!1,this._regExpGlobal=null}getRegExpStr(){if(this.isEmpty)return null;{const a=[...this.map.keys()];return a.sort(),a.reverse(),a.map(i=>_(i)).join("|")}}get regExpGlobal(){if(!this.hasRegExp){const a=this.getRegExpStr();this._regExpGlobal=a?new RegExp(a,"gi"):null,this.hasRegExp=!0}return this._regExpGlobal}getToken(a){return this.map.get(a.toLowerCase())}findClosingTokenText(a){for(const[i,n]of this.map)if(n.kind===2&&n.bracketIds.intersects(a))return i}get isEmpty(){return this.map.size===0}}e.BracketTokens=p;function _(b){let a=(0,L.escapeRegExpCharacters)(b);return/^[\w ]+/.test(b)&&(a=`\\b${a}`),/[\w ]+$/.test(b)&&(a=`${a}\\b`),a}class v{constructor(a,i){this.denseKeyProvider=a,this.getLanguageConfiguration=i,this.languageIdToBracketTokens=new Map}didLanguageChange(a){return this.languageIdToBracketTokens.has(a)}getSingleLanguageBracketTokens(a){let i=this.languageIdToBracketTokens.get(a);return i||(i=p.createFromLanguage(this.getLanguageConfiguration(a),this.denseKeyProvider),this.languageIdToBracketTokens.set(a,i)),i}}e.LanguageAgnosticBracketTokens=v}),define(se[522],oe([1,0,290,91,289,134,209]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.fixBracketsInLine=void 0;function p(v,b){const a=new E.DenseKeyProvider,i=new L.LanguageAgnosticBracketTokens(a,c=>b.getLanguageConfiguration(c)),n=new S.TextBufferTokenizer(new _([v]),i),t=(0,y.parseDocument)(n,[],void 0,!0);let r="";const u=v.getLineContent();function f(c,d){if(c.kind===2)if(f(c.openingBracket,d),d=(0,k.lengthAdd)(d,c.openingBracket.length),c.child&&(f(c.child,d),d=(0,k.lengthAdd)(d,c.child.length)),c.closingBracket)f(c.closingBracket,d),d=(0,k.lengthAdd)(d,c.closingBracket.length);else{const l=i.getSingleLanguageBracketTokens(c.openingBracket.languageId).findClosingTokenText(c.openingBracket.bracketIds);r+=l}else if(c.kind!==3){if(c.kind===0||c.kind===1)r+=u.substring((0,k.lengthGetColumnCountIfZeroLineCount)(d),(0,k.lengthGetColumnCountIfZeroLineCount)((0,k.lengthAdd)(d,c.length)));else if(c.kind===4)for(const s of c.children)f(s,d),d=(0,k.lengthAdd)(d,s.length)}}return f(t,k.lengthZero),r}e.fixBracketsInLine=p;class _{constructor(b){this.lines=b,this.tokenization={getLineTokens:a=>this.lines[a-1]}}getLineCount(){return this.lines.length}getLineLength(b){return this.lines[b-1].getLineContent().length}}}),define(se[523],oe([1,0,13]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FixedArray=void 0;class k{constructor(S){this._default=S,this._store=[]}get(S){return S<this._store.length?this._store[S]:this._default}set(S,p){for(;S>=this._store.length;)this._store[this._store.length]=this._default;this._store[S]=p}replace(S,p,_){if(S>=this._store.length)return;if(p===0){this.insert(S,_);return}else if(_===0){this.delete(S,p);return}const v=this._store.slice(0,S),b=this._store.slice(S+p),a=y(_,this._default);this._store=v.concat(a,b)}delete(S,p){p===0||S>=this._store.length||this._store.splice(S,p)}insert(S,p){if(p===0||S>=this._store.length)return;const _=[];for(let v=0;v<p;v++)_[v]=this._default;this._store=(0,L.arrayInsert)(this._store,S,_)}}e.FixedArray=k;function y(E,S){const p=[];for(let _=0;_<E;_++)p[_]=S;return p}}),define(se[524],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.guessIndentation=void 0;class L{constructor(){this.spacesDiff=0,this.looksLikeAlignment=!1}}function k(E,S,p,_,v){v.spacesDiff=0,v.looksLikeAlignment=!1;let b;for(b=0;b<S&&b<_;b++){const f=E.charCodeAt(b),c=p.charCodeAt(b);if(f!==c)break}let a=0,i=0;for(let f=b;f<S;f++)E.charCodeAt(f)===32?a++:i++;let n=0,t=0;for(let f=b;f<_;f++)p.charCodeAt(f)===32?n++:t++;if(a>0&&i>0||n>0&&t>0)return;const r=Math.abs(i-t),u=Math.abs(a-n);if(r===0){v.spacesDiff=u,u>0&&0<=n-1&&n-1<E.length&&n<p.length&&p.charCodeAt(n)!==32&&E.charCodeAt(n-1)===32&&E.charCodeAt(E.length-1)===44&&(v.looksLikeAlignment=!0);return}if(u%r===0){v.spacesDiff=u/r;return}}function y(E,S,p){const _=Math.min(E.getLineCount(),1e4);let v=0,b=0,a="",i=0;const n=[2,4,6,8,3,5,7],t=8,r=[0,0,0,0,0,0,0,0,0],u=new L;for(let d=1;d<=_;d++){const s=E.getLineLength(d),l=E.getLineContent(d),o=s<=65536;let g=!1,h=0,m=0,C=0;for(let D=0,I=s;D<I;D++){const T=o?l.charCodeAt(D):E.getLineCharCode(d,D);if(T===9)C++;else if(T===32)m++;else{g=!0,h=D;break}}if(!g||(C>0?v++:m>1&&b++,k(a,i,l,h,u),u.looksLikeAlignment&&!(p&&S===u.spacesDiff)))continue;const w=u.spacesDiff;w<=t&&r[w]++,a=l,i=h}let f=p;v!==b&&(f=v<b);let c=S;if(f){let d=f?0:.1*_;n.forEach(s=>{const l=r[s];l>d&&(d=l,c=s)}),c===4&&r[4]>0&&r[2]>0&&r[2]>=r[4]/2&&(c=2)}return{insertSpaces:f,tabSize:c}}e.guessIndentation=y}),define(se[525],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.intervalCompare=e.recomputeMaxEnd=e.nodeAcceptEdit=e.IntervalTree=e.SENTINEL=e.IntervalNode=e.getNodeColor=void 0;function L(x){return(x.metadata&1)>>>0}e.getNodeColor=L;function k(x,O){x.metadata=x.metadata&254|O<<0}function y(x){return(x.metadata&2)>>>1===1}function E(x,O){x.metadata=x.metadata&253|(O?1:0)<<1}function S(x){return(x.metadata&4)>>>2===1}function p(x,O){x.metadata=x.metadata&251|(O?1:0)<<2}function _(x){return(x.metadata&64)>>>6===1}function v(x,O){x.metadata=x.metadata&191|(O?1:0)<<6}function b(x){return(x.metadata&24)>>>3}function a(x,O){x.metadata=x.metadata&231|O<<3}function i(x){return(x.metadata&32)>>>5===1}function n(x,O){x.metadata=x.metadata&223|(O?1:0)<<5}class t{constructor(O,B,W){this.metadata=0,this.parent=this,this.left=this,this.right=this,k(this,1),this.start=B,this.end=W,this.delta=0,this.maxEnd=W,this.id=O,this.ownerId=0,this.options=null,p(this,!1),v(this,!1),a(this,1),n(this,!1),this.cachedVersionId=0,this.cachedAbsoluteStart=B,this.cachedAbsoluteEnd=W,this.range=null,E(this,!1)}reset(O,B,W,V){this.start=B,this.end=W,this.maxEnd=W,this.cachedVersionId=O,this.cachedAbsoluteStart=B,this.cachedAbsoluteEnd=W,this.range=V}setOptions(O){this.options=O;const B=this.options.className;p(this,B==="squiggly-error"||B==="squiggly-warning"||B==="squiggly-info"),v(this,this.options.glyphMarginClassName!==null),a(this,this.options.stickiness),n(this,this.options.collapseOnReplaceEdit)}setCachedOffsets(O,B,W){this.cachedVersionId!==W&&(this.range=null),this.cachedVersionId=W,this.cachedAbsoluteStart=O,this.cachedAbsoluteEnd=B}detach(){this.parent=null,this.left=null,this.right=null}}e.IntervalNode=t,e.SENTINEL=new t(null,0,0),e.SENTINEL.parent=e.SENTINEL,e.SENTINEL.left=e.SENTINEL,e.SENTINEL.right=e.SENTINEL,k(e.SENTINEL,0);class r{constructor(){this.root=e.SENTINEL,this.requestNormalizeDelta=!1}intervalSearch(O,B,W,V,K,F){return this.root===e.SENTINEL?[]:h(this,O,B,W,V,K,F)}search(O,B,W,V){return this.root===e.SENTINEL?[]:g(this,O,B,W,V)}collectNodesFromOwner(O){return l(this,O)}collectNodesPostOrder(){return o(this)}insert(O){m(this,O),this._normalizeDeltaIfNecessary()}delete(O){w(this,O),this._normalizeDeltaIfNecessary()}resolveNode(O,B){const W=O;let V=0;for(;O!==this.root;)O===O.parent.right&&(V+=O.parent.delta),O=O.parent;const K=W.start+V,F=W.end+V;W.setCachedOffsets(K,F,B)}acceptReplace(O,B,W,V){const K=d(this,O,O+B);for(let F=0,q=K.length;F<q;F++){const ie=K[F];w(this,ie)}this._normalizeDeltaIfNecessary(),s(this,O,O+B,W),this._normalizeDeltaIfNecessary();for(let F=0,q=K.length;F<q;F++){const ie=K[F];ie.start=ie.cachedAbsoluteStart,ie.end=ie.cachedAbsoluteEnd,c(ie,O,O+B,W,V),ie.maxEnd=ie.end,m(this,ie)}this._normalizeDeltaIfNecessary()}_normalizeDeltaIfNecessary(){this.requestNormalizeDelta&&(this.requestNormalizeDelta=!1,u(this))}}e.IntervalTree=r;function u(x){let O=x.root,B=0;for(;O!==e.SENTINEL;){if(O.left!==e.SENTINEL&&!y(O.left)){O=O.left;continue}if(O.right!==e.SENTINEL&&!y(O.right)){B+=O.delta,O=O.right;continue}O.start=B+O.start,O.end=B+O.end,O.delta=0,N(O),E(O,!0),E(O.left,!1),E(O.right,!1),O===O.parent.right&&(B-=O.parent.delta),O=O.parent}E(x.root,!1)}function f(x,O,B,W){return x<B?!0:x>B||W===1?!1:W===2?!0:O}function c(x,O,B,W,V){const K=b(x),F=K===0||K===2,q=K===1||K===2,ie=B-O,ae=W,ne=Math.min(ie,ae),$=x.start;let J=!1;const Q=x.end;let re=!1;O<=$&&Q<=B&&i(x)&&(x.start=O,J=!0,x.end=O,re=!0);{const he=V?1:ie>0?2:0;!J&&f($,F,O,he)&&(J=!0),!re&&f(Q,q,O,he)&&(re=!0)}if(ne>0&&!V){const he=ie>ae?2:0;!J&&f($,F,O+ne,he)&&(J=!0),!re&&f(Q,q,O+ne,he)&&(re=!0)}{const he=V?1:0;!J&&f($,F,B,he)&&(x.start=O+ae,J=!0),!re&&f(Q,q,B,he)&&(x.end=O+ae,re=!0)}const de=ae-ie;J||(x.start=Math.max(0,$+de)),re||(x.end=Math.max(0,Q+de)),x.start>x.end&&(x.end=x.start)}e.nodeAcceptEdit=c;function d(x,O,B){let W=x.root,V=0,K=0,F=0,q=0;const ie=[];let ae=0;for(;W!==e.SENTINEL;){if(y(W)){E(W.left,!1),E(W.right,!1),W===W.parent.right&&(V-=W.parent.delta),W=W.parent;continue}if(!y(W.left)){if(K=V+W.maxEnd,K<O){E(W,!0);continue}if(W.left!==e.SENTINEL){W=W.left;continue}}if(F=V+W.start,F>B){E(W,!0);continue}if(q=V+W.end,q>=O&&(W.setCachedOffsets(F,q,0),ie[ae++]=W),E(W,!0),W.right!==e.SENTINEL&&!y(W.right)){V+=W.delta,W=W.right;continue}}return E(x.root,!1),ie}function s(x,O,B,W){let V=x.root,K=0,F=0,q=0;const ie=W-(B-O);for(;V!==e.SENTINEL;){if(y(V)){E(V.left,!1),E(V.right,!1),V===V.parent.right&&(K-=V.parent.delta),N(V),V=V.parent;continue}if(!y(V.left)){if(F=K+V.maxEnd,F<O){E(V,!0);continue}if(V.left!==e.SENTINEL){V=V.left;continue}}if(q=K+V.start,q>B){V.start+=ie,V.end+=ie,V.delta+=ie,(V.delta<-1073741824||V.delta>1073741824)&&(x.requestNormalizeDelta=!0),E(V,!0);continue}if(E(V,!0),V.right!==e.SENTINEL&&!y(V.right)){K+=V.delta,V=V.right;continue}}E(x.root,!1)}function l(x,O){let B=x.root;const W=[];let V=0;for(;B!==e.SENTINEL;){if(y(B)){E(B.left,!1),E(B.right,!1),B=B.parent;continue}if(B.left!==e.SENTINEL&&!y(B.left)){B=B.left;continue}if(B.ownerId===O&&(W[V++]=B),E(B,!0),B.right!==e.SENTINEL&&!y(B.right)){B=B.right;continue}}return E(x.root,!1),W}function o(x){let O=x.root;const B=[];let W=0;for(;O!==e.SENTINEL;){if(y(O)){E(O.left,!1),E(O.right,!1),O=O.parent;continue}if(O.left!==e.SENTINEL&&!y(O.left)){O=O.left;continue}if(O.right!==e.SENTINEL&&!y(O.right)){O=O.right;continue}B[W++]=O,E(O,!0)}return E(x.root,!1),B}function g(x,O,B,W,V){let K=x.root,F=0,q=0,ie=0;const ae=[];let ne=0;for(;K!==e.SENTINEL;){if(y(K)){E(K.left,!1),E(K.right,!1),K===K.parent.right&&(F-=K.parent.delta),K=K.parent;continue}if(K.left!==e.SENTINEL&&!y(K.left)){K=K.left;continue}q=F+K.start,ie=F+K.end,K.setCachedOffsets(q,ie,W);let $=!0;if(O&&K.ownerId&&K.ownerId!==O&&($=!1),B&&S(K)&&($=!1),V&&!_(K)&&($=!1),$&&(ae[ne++]=K),E(K,!0),K.right!==e.SENTINEL&&!y(K.right)){F+=K.delta,K=K.right;continue}}return E(x.root,!1),ae}function h(x,O,B,W,V,K,F){let q=x.root,ie=0,ae=0,ne=0,$=0;const J=[];let Q=0;for(;q!==e.SENTINEL;){if(y(q)){E(q.left,!1),E(q.right,!1),q===q.parent.right&&(ie-=q.parent.delta),q=q.parent;continue}if(!y(q.left)){if(ae=ie+q.maxEnd,ae<O){E(q,!0);continue}if(q.left!==e.SENTINEL){q=q.left;continue}}if(ne=ie+q.start,ne>B){E(q,!0);continue}if($=ie+q.end,$>=O){q.setCachedOffsets(ne,$,K);let re=!0;W&&q.ownerId&&q.ownerId!==W&&(re=!1),V&&S(q)&&(re=!1),F&&!_(q)&&(re=!1),re&&(J[Q++]=q)}if(E(q,!0),q.right!==e.SENTINEL&&!y(q.right)){ie+=q.delta,q=q.right;continue}}return E(x.root,!1),J}function m(x,O){if(x.root===e.SENTINEL)return O.parent=e.SENTINEL,O.left=e.SENTINEL,O.right=e.SENTINEL,k(O,0),x.root=O,x.root;C(x,O),M(O.parent);let B=O;for(;B!==x.root&&L(B.parent)===1;)if(B.parent===B.parent.parent.left){const W=B.parent.parent.right;L(W)===1?(k(B.parent,0),k(W,0),k(B.parent.parent,1),B=B.parent.parent):(B===B.parent.right&&(B=B.parent,T(x,B)),k(B.parent,0),k(B.parent.parent,1),A(x,B.parent.parent))}else{const W=B.parent.parent.left;L(W)===1?(k(B.parent,0),k(W,0),k(B.parent.parent,1),B=B.parent.parent):(B===B.parent.left&&(B=B.parent,A(x,B)),k(B.parent,0),k(B.parent.parent,1),T(x,B.parent.parent))}return k(x.root,0),O}function C(x,O){let B=0,W=x.root;const V=O.start,K=O.end;for(;;)if(R(V,K,W.start+B,W.end+B)<0)if(W.left===e.SENTINEL){O.start-=B,O.end-=B,O.maxEnd-=B,W.left=O;break}else W=W.left;else if(W.right===e.SENTINEL){O.start-=B+W.delta,O.end-=B+W.delta,O.maxEnd-=B+W.delta,W.right=O;break}else B+=W.delta,W=W.right;O.parent=W,O.left=e.SENTINEL,O.right=e.SENTINEL,k(O,1)}function w(x,O){let B,W;if(O.left===e.SENTINEL?(B=O.right,W=O,B.delta+=O.delta,(B.delta<-1073741824||B.delta>1073741824)&&(x.requestNormalizeDelta=!0),B.start+=O.delta,B.end+=O.delta):O.right===e.SENTINEL?(B=O.left,W=O):(W=D(O.right),B=W.right,B.start+=W.delta,B.end+=W.delta,B.delta+=W.delta,(B.delta<-1073741824||B.delta>1073741824)&&(x.requestNormalizeDelta=!0),W.start+=O.delta,W.end+=O.delta,W.delta=O.delta,(W.delta<-1073741824||W.delta>1073741824)&&(x.requestNormalizeDelta=!0)),W===x.root){x.root=B,k(B,0),O.detach(),I(),N(B),x.root.parent=e.SENTINEL;return}const V=L(W)===1;if(W===W.parent.left?W.parent.left=B:W.parent.right=B,W===O?B.parent=W.parent:(W.parent===O?B.parent=W:B.parent=W.parent,W.left=O.left,W.right=O.right,W.parent=O.parent,k(W,L(O)),O===x.root?x.root=W:O===O.parent.left?O.parent.left=W:O.parent.right=W,W.left!==e.SENTINEL&&(W.left.parent=W),W.right!==e.SENTINEL&&(W.right.parent=W)),O.detach(),V){M(B.parent),W!==O&&(M(W),M(W.parent)),I();return}M(B),M(B.parent),W!==O&&(M(W),M(W.parent));let K;for(;B!==x.root&&L(B)===0;)B===B.parent.left?(K=B.parent.right,L(K)===1&&(k(K,0),k(B.parent,1),T(x,B.parent),K=B.parent.right),L(K.left)===0&&L(K.right)===0?(k(K,1),B=B.parent):(L(K.right)===0&&(k(K.left,0),k(K,1),A(x,K),K=B.parent.right),k(K,L(B.parent)),k(B.parent,0),k(K.right,0),T(x,B.parent),B=x.root)):(K=B.parent.left,L(K)===1&&(k(K,0),k(B.parent,1),A(x,B.parent),K=B.parent.left),L(K.left)===0&&L(K.right)===0?(k(K,1),B=B.parent):(L(K.left)===0&&(k(K.right,0),k(K,1),T(x,K),K=B.parent.left),k(K,L(B.parent)),k(B.parent,0),k(K.left,0),A(x,B.parent),B=x.root));k(B,0),I()}function D(x){for(;x.left!==e.SENTINEL;)x=x.left;return x}function I(){e.SENTINEL.parent=e.SENTINEL,e.SENTINEL.delta=0,e.SENTINEL.start=0,e.SENTINEL.end=0}function T(x,O){const B=O.right;B.delta+=O.delta,(B.delta<-1073741824||B.delta>1073741824)&&(x.requestNormalizeDelta=!0),B.start+=O.delta,B.end+=O.delta,O.right=B.left,B.left!==e.SENTINEL&&(B.left.parent=O),B.parent=O.parent,O.parent===e.SENTINEL?x.root=B:O===O.parent.left?O.parent.left=B:O.parent.right=B,B.left=O,O.parent=B,N(O),N(B)}function A(x,O){const B=O.left;O.delta-=B.delta,(O.delta<-1073741824||O.delta>1073741824)&&(x.requestNormalizeDelta=!0),O.start-=B.delta,O.end-=B.delta,O.left=B.right,B.right!==e.SENTINEL&&(B.right.parent=O),B.parent=O.parent,O.parent===e.SENTINEL?x.root=B:O===O.parent.right?O.parent.right=B:O.parent.left=B,B.right=O,O.parent=B,N(O),N(B)}function P(x){let O=x.end;if(x.left!==e.SENTINEL){const B=x.left.maxEnd;B>O&&(O=B)}if(x.right!==e.SENTINEL){const B=x.right.maxEnd+x.delta;B>O&&(O=B)}return O}function N(x){x.maxEnd=P(x)}e.recomputeMaxEnd=N;function M(x){for(;x!==e.SENTINEL;){const O=P(x);if(x.maxEnd===O)return;x.maxEnd=O,x=x.parent}}function R(x,O,B,W){return x===B?O-W:x-B}e.intervalCompare=R}),define(se[526],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.recomputeTreeMetadata=e.updateTreeMetadata=e.fixInsert=e.rbDelete=e.rightRotate=e.leftRotate=e.righttest=e.leftest=e.SENTINEL=e.TreeNode=void 0;class L{constructor(r,u){this.piece=r,this.color=u,this.size_left=0,this.lf_left=0,this.parent=this,this.left=this,this.right=this}next(){if(this.right!==e.SENTINEL)return k(this.right);let r=this;for(;r.parent!==e.SENTINEL&&r.parent.left!==r;)r=r.parent;return r.parent===e.SENTINEL?e.SENTINEL:r.parent}prev(){if(this.left!==e.SENTINEL)return y(this.left);let r=this;for(;r.parent!==e.SENTINEL&&r.parent.right!==r;)r=r.parent;return r.parent===e.SENTINEL?e.SENTINEL:r.parent}detach(){this.parent=null,this.left=null,this.right=null}}e.TreeNode=L,e.SENTINEL=new L(null,0),e.SENTINEL.parent=e.SENTINEL,e.SENTINEL.left=e.SENTINEL,e.SENTINEL.right=e.SENTINEL,e.SENTINEL.color=0;function k(t){for(;t.left!==e.SENTINEL;)t=t.left;return t}e.leftest=k;function y(t){for(;t.right!==e.SENTINEL;)t=t.right;return t}e.righttest=y;function E(t){return t===e.SENTINEL?0:t.size_left+t.piece.length+E(t.right)}function S(t){return t===e.SENTINEL?0:t.lf_left+t.piece.lineFeedCnt+S(t.right)}function p(){e.SENTINEL.parent=e.SENTINEL}function _(t,r){const u=r.right;u.size_left+=r.size_left+(r.piece?r.piece.length:0),u.lf_left+=r.lf_left+(r.piece?r.piece.lineFeedCnt:0),r.right=u.left,u.left!==e.SENTINEL&&(u.left.parent=r),u.parent=r.parent,r.parent===e.SENTINEL?t.root=u:r.parent.left===r?r.parent.left=u:r.parent.right=u,u.left=r,r.parent=u}e.leftRotate=_;function v(t,r){const u=r.left;r.left=u.right,u.right!==e.SENTINEL&&(u.right.parent=r),u.parent=r.parent,r.size_left-=u.size_left+(u.piece?u.piece.length:0),r.lf_left-=u.lf_left+(u.piece?u.piece.lineFeedCnt:0),r.parent===e.SENTINEL?t.root=u:r===r.parent.right?r.parent.right=u:r.parent.left=u,u.right=r,r.parent=u}e.rightRotate=v;function b(t,r){let u,f;if(r.left===e.SENTINEL?(f=r,u=f.right):r.right===e.SENTINEL?(f=r,u=f.left):(f=k(r.right),u=f.right),f===t.root){t.root=u,u.color=0,r.detach(),p(),t.root.parent=e.SENTINEL;return}const c=f.color===1;if(f===f.parent.left?f.parent.left=u:f.parent.right=u,f===r?(u.parent=f.parent,n(t,u)):(f.parent===r?u.parent=f:u.parent=f.parent,n(t,u),f.left=r.left,f.right=r.right,f.parent=r.parent,f.color=r.color,r===t.root?t.root=f:r===r.parent.left?r.parent.left=f:r.parent.right=f,f.left!==e.SENTINEL&&(f.left.parent=f),f.right!==e.SENTINEL&&(f.right.parent=f),f.size_left=r.size_left,f.lf_left=r.lf_left,n(t,f)),r.detach(),u.parent.left===u){const s=E(u),l=S(u);if(s!==u.parent.size_left||l!==u.parent.lf_left){const o=s-u.parent.size_left,g=l-u.parent.lf_left;u.parent.size_left=s,u.parent.lf_left=l,i(t,u.parent,o,g)}}if(n(t,u.parent),c){p();return}let d;for(;u!==t.root&&u.color===0;)u===u.parent.left?(d=u.parent.right,d.color===1&&(d.color=0,u.parent.color=1,_(t,u.parent),d=u.parent.right),d.left.color===0&&d.right.color===0?(d.color=1,u=u.parent):(d.right.color===0&&(d.left.color=0,d.color=1,v(t,d),d=u.parent.right),d.color=u.parent.color,u.parent.color=0,d.right.color=0,_(t,u.parent),u=t.root)):(d=u.parent.left,d.color===1&&(d.color=0,u.parent.color=1,v(t,u.parent),d=u.parent.left),d.left.color===0&&d.right.color===0?(d.color=1,u=u.parent):(d.left.color===0&&(d.right.color=0,d.color=1,_(t,d),d=u.parent.left),d.color=u.parent.color,u.parent.color=0,d.left.color=0,v(t,u.parent),u=t.root));u.color=0,p()}e.rbDelete=b;function a(t,r){for(n(t,r);r!==t.root&&r.parent.color===1;)if(r.parent===r.parent.parent.left){const u=r.parent.parent.right;u.color===1?(r.parent.color=0,u.color=0,r.parent.parent.color=1,r=r.parent.parent):(r===r.parent.right&&(r=r.parent,_(t,r)),r.parent.color=0,r.parent.parent.color=1,v(t,r.parent.parent))}else{const u=r.parent.parent.left;u.color===1?(r.parent.color=0,u.color=0,r.parent.parent.color=1,r=r.parent.parent):(r===r.parent.left&&(r=r.parent,v(t,r)),r.parent.color=0,r.parent.parent.color=1,_(t,r.parent.parent))}t.root.color=0}e.fixInsert=a;function i(t,r,u,f){for(;r!==t.root&&r!==e.SENTINEL;)r.parent.left===r&&(r.parent.size_left+=u,r.parent.lf_left+=f),r=r.parent}e.updateTreeMetadata=i;function n(t,r){let u=0,f=0;if(r!==t.root){for(;r!==t.root&&r===r.parent.right;)r=r.parent;if(r!==t.root)for(r=r.parent,u=E(r.left)-r.size_left,f=S(r.left)-r.lf_left,r.size_left+=u,r.lf_left+=f;r!==t.root&&(u!==0||f!==0);)r.parent.left===r&&(r.parent.size_left+=u,r.parent.lf_left+=f),r=r.parent}}e.recomputeTreeMetadata=n}),define(se[291],oe([1,0,13,174]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PrefixSumIndexOfResult=e.ConstantTimePrefixSumComputer=e.PrefixSumComputer=void 0;class y{constructor(_){this.values=_,this.prefixSum=new Uint32Array(_.length),this.prefixSumValidIndex=new Int32Array(1),this.prefixSumValidIndex[0]=-1}insertValues(_,v){_=(0,k.toUint32)(_);const b=this.values,a=this.prefixSum,i=v.length;return i===0?!1:(this.values=new Uint32Array(b.length+i),this.values.set(b.subarray(0,_),0),this.values.set(b.subarray(_),_+i),this.values.set(v,_),_-1<this.prefixSumValidIndex[0]&&(this.prefixSumValidIndex[0]=_-1),this.prefixSum=new Uint32Array(this.values.length),this.prefixSumValidIndex[0]>=0&&this.prefixSum.set(a.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}setValue(_,v){return _=(0,k.toUint32)(_),v=(0,k.toUint32)(v),this.values[_]===v?!1:(this.values[_]=v,_-1<this.prefixSumValidIndex[0]&&(this.prefixSumValidIndex[0]=_-1),!0)}removeValues(_,v){_=(0,k.toUint32)(_),v=(0,k.toUint32)(v);const b=this.values,a=this.prefixSum;if(_>=b.length)return!1;const i=b.length-_;return v>=i&&(v=i),v===0?!1:(this.values=new Uint32Array(b.length-v),this.values.set(b.subarray(0,_),0),this.values.set(b.subarray(_+v),_),this.prefixSum=new Uint32Array(this.values.length),_-1<this.prefixSumValidIndex[0]&&(this.prefixSumValidIndex[0]=_-1),this.prefixSumValidIndex[0]>=0&&this.prefixSum.set(a.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}getTotalSum(){return this.values.length===0?0:this._getPrefixSum(this.values.length-1)}getPrefixSum(_){return _<0?0:(_=(0,k.toUint32)(_),this._getPrefixSum(_))}_getPrefixSum(_){if(_<=this.prefixSumValidIndex[0])return this.prefixSum[_];let v=this.prefixSumValidIndex[0]+1;v===0&&(this.prefixSum[0]=this.values[0],v++),_>=this.values.length&&(_=this.values.length-1);for(let b=v;b<=_;b++)this.prefixSum[b]=this.prefixSum[b-1]+this.values[b];return this.prefixSumValidIndex[0]=Math.max(this.prefixSumValidIndex[0],_),this.prefixSum[_]}getIndexOf(_){_=Math.floor(_),this.getTotalSum();let v=0,b=this.values.length-1,a=0,i=0,n=0;for(;v<=b;)if(a=v+(b-v)/2|0,i=this.prefixSum[a],n=i-this.values[a],_<n)b=a-1;else if(_>=i)v=a+1;else break;return new S(a,_-n)}}e.PrefixSumComputer=y;class E{constructor(_){this._values=_,this._isValid=!1,this._validEndIndex=-1,this._prefixSum=[],this._indexBySum=[]}getTotalSum(){return this._ensureValid(),this._indexBySum.length}getPrefixSum(_){return this._ensureValid(),_===0?0:this._prefixSum[_-1]}getIndexOf(_){this._ensureValid();const v=this._indexBySum[_],b=v>0?this._prefixSum[v-1]:0;return new S(v,_-b)}removeValues(_,v){this._values.splice(_,v),this._invalidate(_)}insertValues(_,v){this._values=(0,L.arrayInsert)(this._values,_,v),this._invalidate(_)}_invalidate(_){this._isValid=!1,this._validEndIndex=Math.min(this._validEndIndex,_-1)}_ensureValid(){if(!this._isValid){for(let _=this._validEndIndex+1,v=this._values.length;_<v;_++){const b=this._values[_],a=_>0?this._prefixSum[_-1]:0;this._prefixSum[_]=a+b;for(let i=0;i<b;i++)this._indexBySum[a+i]=_}this._prefixSum.length=this._values.length,this._indexBySum.length=this._prefixSum[this._prefixSum.length-1],this._isValid=!0,this._validEndIndex=this._values.length-1}}setValue(_,v){this._values[_]!==v&&(this._values[_]=v,this._invalidate(_))}}e.ConstantTimePrefixSumComputer=E;class S{constructor(_,v){this.index=_,this.remainder=v,this._prefixSumIndexOfResultBrand=void 0,this.index=_,this.remainder=v}}e.PrefixSumIndexOfResult=S}),define(se[527],oe([1,0,11,10,291]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MirrorTextModel=void 0;class E{constructor(p,_,v,b){this._uri=p,this._lines=_,this._eol=v,this._versionId=b,this._lineStarts=null,this._cachedTextValue=null}dispose(){this._lines.length=0}get version(){return this._versionId}getText(){return this._cachedTextValue===null&&(this._cachedTextValue=this._lines.join(this._eol)),this._cachedTextValue}onEvents(p){p.eol&&p.eol!==this._eol&&(this._eol=p.eol,this._lineStarts=null);const _=p.changes;for(const v of _)this._acceptDeleteRange(v.range),this._acceptInsertText(new k.Position(v.range.startLineNumber,v.range.startColumn),v.text);this._versionId=p.versionId,this._cachedTextValue=null}_ensureLineStarts(){if(!this._lineStarts){const p=this._eol.length,_=this._lines.length,v=new Uint32Array(_);for(let b=0;b<_;b++)v[b]=this._lines[b].length+p;this._lineStarts=new y.PrefixSumComputer(v)}}_setLineText(p,_){this._lines[p]=_,this._lineStarts&&this._lineStarts.setValue(p,this._lines[p].length+this._eol.length)}_acceptDeleteRange(p){if(p.startLineNumber===p.endLineNumber){if(p.startColumn===p.endColumn)return;this._setLineText(p.startLineNumber-1,this._lines[p.startLineNumber-1].substring(0,p.startColumn-1)+this._lines[p.startLineNumber-1].substring(p.endColumn-1));return}this._setLineText(p.startLineNumber-1,this._lines[p.startLineNumber-1].substring(0,p.startColumn-1)+this._lines[p.endLineNumber-1].substring(p.endColumn-1)),this._lines.splice(p.startLineNumber,p.endLineNumber-p.startLineNumber),this._lineStarts&&this._lineStarts.removeValues(p.startLineNumber,p.endLineNumber-p.startLineNumber)}_acceptInsertText(p,_){if(_.length===0)return;const v=(0,L.splitLines)(_);if(v.length===1){this._setLineText(p.lineNumber-1,this._lines[p.lineNumber-1].substring(0,p.column-1)+v[0]+this._lines[p.lineNumber-1].substring(p.column-1));return}v[v.length-1]+=this._lines[p.lineNumber-1].substring(p.column-1),this._setLineText(p.lineNumber-1,this._lines[p.lineNumber-1].substring(0,p.column-1)+v[0]);const b=new Uint32Array(v.length-1);for(let a=1;a<v.length;a++)this._lines.splice(p.lineNumber+a-1,0,v[a]),b[a-1]=v[a].length+this._eol.length;this._lineStarts&&this._lineStarts.insertValues(p.lineNumber,b)}}e.MirrorTextModel=E}),define(se[292],oe([1,0,2]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TextModelPart=void 0;class k extends L.Disposable{constructor(){super(...arguments),this._isDisposed=!1}dispose(){super.dispose(),this._isDisposed=!0}assertNotDisposed(){if(this._isDisposed)throw new Error("TextModelPart is disposed!")}}e.TextModelPart=k}),define(se[184],oe([1,0,11,150,10,5,41]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Searcher=e.isValidMatch=e.TextModelSearch=e.createFindMatch=e.isMultilineRegexSource=e.SearchParams=void 0;const p=999;class _{constructor(c,d,s,l){this.searchString=c,this.isRegex=d,this.matchCase=s,this.wordSeparators=l}parseSearchRequest(){if(this.searchString==="")return null;let c;this.isRegex?c=v(this.searchString):c=this.searchString.indexOf(`
+`)>=0;let d=null;try{d=L.createRegExp(this.searchString,this.isRegex,{matchCase:this.matchCase,wholeWord:!1,multiline:c,global:!0,unicode:!0})}catch{return null}if(!d)return null;let s=!this.isRegex&&!c;return s&&this.searchString.toLowerCase()!==this.searchString.toUpperCase()&&(s=this.matchCase),new S.SearchData(d,this.wordSeparators?(0,k.getMapForWordSeparators)(this.wordSeparators):null,s?this.searchString:null)}}e.SearchParams=_;function v(f){if(!f||f.length===0)return!1;for(let c=0,d=f.length;c<d;c++){const s=f.charCodeAt(c);if(s===10)return!0;if(s===92){if(c++,c>=d)break;const l=f.charCodeAt(c);if(l===110||l===114||l===87)return!0}}return!1}e.isMultilineRegexSource=v;function b(f,c,d){if(!d)return new S.FindMatch(f,null);const s=[];for(let l=0,o=c.length;l<o;l++)s[l]=c[l];return new S.FindMatch(f,s)}e.createFindMatch=b;class a{constructor(c){const d=[];let s=0;for(let l=0,o=c.length;l<o;l++)c.charCodeAt(l)===10&&(d[s++]=l);this._lineFeedsOffsets=d}findLineFeedCountBeforeOffset(c){const d=this._lineFeedsOffsets;let s=0,l=d.length-1;if(l===-1||c<=d[0])return 0;for(;s<l;){const o=s+((l-s)/2>>0);d[o]>=c?l=o-1:d[o+1]>=c?(s=o,l=o):s=o+1}return s+1}}class i{static findMatches(c,d,s,l,o){const g=d.parseSearchRequest();return g?g.regex.multiline?this._doFindMatchesMultiline(c,s,new u(g.wordSeparators,g.regex),l,o):this._doFindMatchesLineByLine(c,s,g,l,o):[]}static _getMultilineMatchRange(c,d,s,l,o,g){let h,m=0;l?(m=l.findLineFeedCountBeforeOffset(o),h=d+o+m):h=d+o;let C;if(l){const T=l.findLineFeedCountBeforeOffset(o+g.length)-m;C=h+g.length+T}else C=h+g.length;const w=c.getPositionAt(h),D=c.getPositionAt(C);return new E.Range(w.lineNumber,w.column,D.lineNumber,D.column)}static _doFindMatchesMultiline(c,d,s,l,o){const g=c.getOffsetAt(d.getStartPosition()),h=c.getValueInRange(d,1),m=c.getEOL()===`\r
+`?new a(h):null,C=[];let w=0,D;for(s.reset(0);D=s.next(h);)if(C[w++]=b(this._getMultilineMatchRange(c,g,h,m,D.index,D[0]),D,l),w>=o)return C;return C}static _doFindMatchesLineByLine(c,d,s,l,o){const g=[];let h=0;if(d.startLineNumber===d.endLineNumber){const C=c.getLineContent(d.startLineNumber).substring(d.startColumn-1,d.endColumn-1);return h=this._findMatchesInLine(s,C,d.startLineNumber,d.startColumn-1,h,g,l,o),g}const m=c.getLineContent(d.startLineNumber).substring(d.startColumn-1);h=this._findMatchesInLine(s,m,d.startLineNumber,d.startColumn-1,h,g,l,o);for(let C=d.startLineNumber+1;C<d.endLineNumber&&h<o;C++)h=this._findMatchesInLine(s,c.getLineContent(C),C,0,h,g,l,o);if(h<o){const C=c.getLineContent(d.endLineNumber).substring(0,d.endColumn-1);h=this._findMatchesInLine(s,C,d.endLineNumber,0,h,g,l,o)}return g}static _findMatchesInLine(c,d,s,l,o,g,h,m){const C=c.wordSeparators;if(!h&&c.simpleSearch){const I=c.simpleSearch,T=I.length,A=d.length;let P=-T;for(;(P=d.indexOf(I,P+T))!==-1;)if((!C||r(C,d,A,P,T))&&(g[o++]=new S.FindMatch(new E.Range(s,P+1+l,s,P+1+T+l),null),o>=m))return o;return o}const w=new u(c.wordSeparators,c.regex);let D;w.reset(0);do if(D=w.next(d),D&&(g[o++]=b(new E.Range(s,D.index+1+l,s,D.index+1+D[0].length+l),D,h),o>=m))return o;while(D);return o}static findNextMatch(c,d,s,l){const o=d.parseSearchRequest();if(!o)return null;const g=new u(o.wordSeparators,o.regex);return o.regex.multiline?this._doFindNextMatchMultiline(c,s,g,l):this._doFindNextMatchLineByLine(c,s,g,l)}static _doFindNextMatchMultiline(c,d,s,l){const o=new y.Position(d.lineNumber,1),g=c.getOffsetAt(o),h=c.getLineCount(),m=c.getValueInRange(new E.Range(o.lineNumber,o.column,h,c.getLineMaxColumn(h)),1),C=c.getEOL()===`\r
+`?new a(m):null;s.reset(d.column-1);const w=s.next(m);return w?b(this._getMultilineMatchRange(c,g,m,C,w.index,w[0]),w,l):d.lineNumber!==1||d.column!==1?this._doFindNextMatchMultiline(c,new y.Position(1,1),s,l):null}static _doFindNextMatchLineByLine(c,d,s,l){const o=c.getLineCount(),g=d.lineNumber,h=c.getLineContent(g),m=this._findFirstMatchInLine(s,h,g,d.column,l);if(m)return m;for(let C=1;C<=o;C++){const w=(g+C-1)%o,D=c.getLineContent(w+1),I=this._findFirstMatchInLine(s,D,w+1,1,l);if(I)return I}return null}static _findFirstMatchInLine(c,d,s,l,o){c.reset(l-1);const g=c.next(d);return g?b(new E.Range(s,g.index+1,s,g.index+1+g[0].length),g,o):null}static findPreviousMatch(c,d,s,l){const o=d.parseSearchRequest();if(!o)return null;const g=new u(o.wordSeparators,o.regex);return o.regex.multiline?this._doFindPreviousMatchMultiline(c,s,g,l):this._doFindPreviousMatchLineByLine(c,s,g,l)}static _doFindPreviousMatchMultiline(c,d,s,l){const o=this._doFindMatchesMultiline(c,new E.Range(1,1,d.lineNumber,d.column),s,l,10*p);if(o.length>0)return o[o.length-1];const g=c.getLineCount();return d.lineNumber!==g||d.column!==c.getLineMaxColumn(g)?this._doFindPreviousMatchMultiline(c,new y.Position(g,c.getLineMaxColumn(g)),s,l):null}static _doFindPreviousMatchLineByLine(c,d,s,l){const o=c.getLineCount(),g=d.lineNumber,h=c.getLineContent(g).substring(0,d.column-1),m=this._findLastMatchInLine(s,h,g,l);if(m)return m;for(let C=1;C<=o;C++){const w=(o+g-C-1)%o,D=c.getLineContent(w+1),I=this._findLastMatchInLine(s,D,w+1,l);if(I)return I}return null}static _findLastMatchInLine(c,d,s,l){let o=null,g;for(c.reset(0);g=c.next(d);)o=b(new E.Range(s,g.index+1,s,g.index+1+g[0].length),g,l);return o}}e.TextModelSearch=i;function n(f,c,d,s,l){if(s===0)return!0;const o=c.charCodeAt(s-1);if(f.get(o)!==0||o===13||o===10)return!0;if(l>0){const g=c.charCodeAt(s);if(f.get(g)!==0)return!0}return!1}function t(f,c,d,s,l){if(s+l===d)return!0;const o=c.charCodeAt(s+l);if(f.get(o)!==0||o===13||o===10)return!0;if(l>0){const g=c.charCodeAt(s+l-1);if(f.get(g)!==0)return!0}return!1}function r(f,c,d,s,l){return n(f,c,d,s,l)&&t(f,c,d,s,l)}e.isValidMatch=r;class u{constructor(c,d){this._wordSeparators=c,this._searchRegex=d,this._prevMatchStartIndex=-1,this._prevMatchLength=0}reset(c){this._searchRegex.lastIndex=c,this._prevMatchStartIndex=-1,this._prevMatchLength=0}next(c){const d=c.length;let s;do{if(this._prevMatchStartIndex+this._prevMatchLength===d||(s=this._searchRegex.exec(c),!s))return null;const l=s.index,o=s[0].length;if(l===this._prevMatchStartIndex&&o===this._prevMatchLength){if(o===0){L.getNextCodePoint(c,d,this._searchRegex.lastIndex)>65535?this._searchRegex.lastIndex+=2:this._searchRegex.lastIndex+=1;continue}return null}if(this._prevMatchStartIndex=l,this._prevMatchLength=o,!this._wordSeparators||r(this._wordSeparators,c,d,l,o))return s}while(s);return null}}e.Searcher=u}),define(se[293],oe([1,0,10,5,41,526,184]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PieceTreeBase=e.StringBuffer=e.Piece=e.createLineStarts=e.createLineStartsFast=void 0;const p=65535;function _(f){let c;return f[f.length-1]<65536?c=new Uint16Array(f.length):c=new Uint32Array(f.length),c.set(f,0),c}class v{constructor(c,d,s,l,o){this.lineStarts=c,this.cr=d,this.lf=s,this.crlf=l,this.isBasicASCII=o}}function b(f,c=!0){const d=[0];let s=1;for(let l=0,o=f.length;l<o;l++){const g=f.charCodeAt(l);g===13?l+1<o&&f.charCodeAt(l+1)===10?(d[s++]=l+2,l++):d[s++]=l+1:g===10&&(d[s++]=l+1)}return c?_(d):d}e.createLineStartsFast=b;function a(f,c){f.length=0,f[0]=0;let d=1,s=0,l=0,o=0,g=!0;for(let m=0,C=c.length;m<C;m++){const w=c.charCodeAt(m);w===13?m+1<C&&c.charCodeAt(m+1)===10?(o++,f[d++]=m+2,m++):(s++,f[d++]=m+1):w===10?(l++,f[d++]=m+1):g&&w!==9&&(w<32||w>126)&&(g=!1)}const h=new v(_(f),s,l,o,g);return f.length=0,h}e.createLineStarts=a;class i{constructor(c,d,s,l,o){this.bufferIndex=c,this.start=d,this.end=s,this.lineFeedCnt=l,this.length=o}}e.Piece=i;class n{constructor(c,d){this.buffer=c,this.lineStarts=d}}e.StringBuffer=n;class t{constructor(c,d){this._pieces=[],this._tree=c,this._BOM=d,this._index=0,c.root!==E.SENTINEL&&c.iterate(c.root,s=>(s!==E.SENTINEL&&this._pieces.push(s.piece),!0))}read(){return this._pieces.length===0?this._index===0?(this._index++,this._BOM):null:this._index>this._pieces.length-1?null:this._index===0?this._BOM+this._tree.getPieceContent(this._pieces[this._index++]):this._tree.getPieceContent(this._pieces[this._index++])}}class r{constructor(c){this._limit=c,this._cache=[]}get(c){for(let d=this._cache.length-1;d>=0;d--){const s=this._cache[d];if(s.nodeStartOffset<=c&&s.nodeStartOffset+s.node.piece.length>=c)return s}return null}get2(c){for(let d=this._cache.length-1;d>=0;d--){const s=this._cache[d];if(s.nodeStartLineNumber&&s.nodeStartLineNumber<c&&s.nodeStartLineNumber+s.node.piece.lineFeedCnt>=c)return s}return null}set(c){this._cache.length>=this._limit&&this._cache.shift(),this._cache.push(c)}validate(c){let d=!1;const s=this._cache;for(let l=0;l<s.length;l++){const o=s[l];if(o.node.parent===null||o.nodeStartOffset>=c){s[l]=null,d=!0;continue}}if(d){const l=[];for(const o of s)o!==null&&l.push(o);this._cache=l}}}class u{constructor(c,d,s){this.create(c,d,s)}create(c,d,s){this._buffers=[new n("",[0])],this._lastChangeBufferPos={line:0,column:0},this.root=E.SENTINEL,this._lineCnt=1,this._length=0,this._EOL=d,this._EOLLength=d.length,this._EOLNormalized=s;let l=null;for(let o=0,g=c.length;o<g;o++)if(c[o].buffer.length>0){c[o].lineStarts||(c[o].lineStarts=b(c[o].buffer));const h=new i(o+1,{line:0,column:0},{line:c[o].lineStarts.length-1,column:c[o].buffer.length-c[o].lineStarts[c[o].lineStarts.length-1]},c[o].lineStarts.length-1,c[o].buffer.length);this._buffers.push(c[o]),l=this.rbInsertRight(l,h)}this._searchCache=new r(1),this._lastVisitedLine={lineNumber:0,value:""},this.computeBufferMetadata()}normalizeEOL(c){const d=p,s=d-Math.floor(d/3),l=s*2;let o="",g=0;const h=[];if(this.iterate(this.root,m=>{const C=this.getNodeContent(m),w=C.length;if(g<=s||g+w<l)return o+=C,g+=w,!0;const D=o.replace(/\r\n|\r|\n/g,c);return h.push(new n(D,b(D))),o=C,g=w,!0}),g>0){const m=o.replace(/\r\n|\r|\n/g,c);h.push(new n(m,b(m)))}this.create(h,c,!0)}getEOL(){return this._EOL}setEOL(c){this._EOL=c,this._EOLLength=this._EOL.length,this.normalizeEOL(c)}createSnapshot(c){return new t(this,c)}getOffsetAt(c,d){let s=0,l=this.root;for(;l!==E.SENTINEL;)if(l.left!==E.SENTINEL&&l.lf_left+1>=c)l=l.left;else if(l.lf_left+l.piece.lineFeedCnt+1>=c){s+=l.size_left;const o=this.getAccumulatedValue(l,c-l.lf_left-2);return s+=o+d-1}else c-=l.lf_left+l.piece.lineFeedCnt,s+=l.size_left+l.piece.length,l=l.right;return s}getPositionAt(c){c=Math.floor(c),c=Math.max(0,c);let d=this.root,s=0;const l=c;for(;d!==E.SENTINEL;)if(d.size_left!==0&&d.size_left>=c)d=d.left;else if(d.size_left+d.piece.length>=c){const o=this.getIndexOf(d,c-d.size_left);if(s+=d.lf_left+o.index,o.index===0){const g=this.getOffsetAt(s+1,1),h=l-g;return new L.Position(s+1,h+1)}return new L.Position(s+1,o.remainder+1)}else if(c-=d.size_left+d.piece.length,s+=d.lf_left+d.piece.lineFeedCnt,d.right===E.SENTINEL){const o=this.getOffsetAt(s+1,1),g=l-c-o;return new L.Position(s+1,g+1)}else d=d.right;return new L.Position(1,1)}getValueInRange(c,d){if(c.startLineNumber===c.endLineNumber&&c.startColumn===c.endColumn)return"";const s=this.nodeAt2(c.startLineNumber,c.startColumn),l=this.nodeAt2(c.endLineNumber,c.endColumn),o=this.getValueInRange2(s,l);return d?d!==this._EOL||!this._EOLNormalized?o.replace(/\r\n|\r|\n/g,d):d===this.getEOL()&&this._EOLNormalized?o:o.replace(/\r\n|\r|\n/g,d):o}getValueInRange2(c,d){if(c.node===d.node){const h=c.node,m=this._buffers[h.piece.bufferIndex].buffer,C=this.offsetInBuffer(h.piece.bufferIndex,h.piece.start);return m.substring(C+c.remainder,C+d.remainder)}let s=c.node;const l=this._buffers[s.piece.bufferIndex].buffer,o=this.offsetInBuffer(s.piece.bufferIndex,s.piece.start);let g=l.substring(o+c.remainder,o+s.piece.length);for(s=s.next();s!==E.SENTINEL;){const h=this._buffers[s.piece.bufferIndex].buffer,m=this.offsetInBuffer(s.piece.bufferIndex,s.piece.start);if(s===d.node){g+=h.substring(m,m+d.remainder);break}else g+=h.substr(m,s.piece.length);s=s.next()}return g}getLinesContent(){const c=[];let d=0,s="",l=!1;return this.iterate(this.root,o=>{if(o===E.SENTINEL)return!0;const g=o.piece;let h=g.length;if(h===0)return!0;const m=this._buffers[g.bufferIndex].buffer,C=this._buffers[g.bufferIndex].lineStarts,w=g.start.line,D=g.end.line;let I=C[w]+g.start.column;if(l&&(m.charCodeAt(I)===10&&(I++,h--),c[d++]=s,s="",l=!1,h===0))return!0;if(w===D)return!this._EOLNormalized&&m.charCodeAt(I+h-1)===13?(l=!0,s+=m.substr(I,h-1)):s+=m.substr(I,h),!0;s+=this._EOLNormalized?m.substring(I,Math.max(I,C[w+1]-this._EOLLength)):m.substring(I,C[w+1]).replace(/(\r\n|\r|\n)$/,""),c[d++]=s;for(let T=w+1;T<D;T++)s=this._EOLNormalized?m.substring(C[T],C[T+1]-this._EOLLength):m.substring(C[T],C[T+1]).replace(/(\r\n|\r|\n)$/,""),c[d++]=s;return!this._EOLNormalized&&m.charCodeAt(C[D]+g.end.column-1)===13?(l=!0,g.end.column===0?d--:s=m.substr(C[D],g.end.column-1)):s=m.substr(C[D],g.end.column),!0}),l&&(c[d++]=s,s=""),c[d++]=s,c}getLength(){return this._length}getLineCount(){return this._lineCnt}getLineContent(c){return this._lastVisitedLine.lineNumber===c?this._lastVisitedLine.value:(this._lastVisitedLine.lineNumber=c,c===this._lineCnt?this._lastVisitedLine.value=this.getLineRawContent(c):this._EOLNormalized?this._lastVisitedLine.value=this.getLineRawContent(c,this._EOLLength):this._lastVisitedLine.value=this.getLineRawContent(c).replace(/(\r\n|\r|\n)$/,""),this._lastVisitedLine.value)}_getCharCode(c){if(c.remainder===c.node.piece.length){const d=c.node.next();if(!d)return 0;const s=this._buffers[d.piece.bufferIndex],l=this.offsetInBuffer(d.piece.bufferIndex,d.piece.start);return s.buffer.charCodeAt(l)}else{const d=this._buffers[c.node.piece.bufferIndex],l=this.offsetInBuffer(c.node.piece.bufferIndex,c.node.piece.start)+c.remainder;return d.buffer.charCodeAt(l)}}getLineCharCode(c,d){const s=this.nodeAt2(c,d+1);return this._getCharCode(s)}getLineLength(c){if(c===this.getLineCount()){const d=this.getOffsetAt(c,1);return this.getLength()-d}return this.getOffsetAt(c+1,1)-this.getOffsetAt(c,1)-this._EOLLength}findMatchesInNode(c,d,s,l,o,g,h,m,C,w,D){const I=this._buffers[c.piece.bufferIndex],T=this.offsetInBuffer(c.piece.bufferIndex,c.piece.start),A=this.offsetInBuffer(c.piece.bufferIndex,o),P=this.offsetInBuffer(c.piece.bufferIndex,g);let N;const M={line:0,column:0};let R,x;d._wordSeparators?(R=I.buffer.substring(A,P),x=O=>O+A,d.reset(0)):(R=I.buffer,x=O=>O,d.reset(A));do if(N=d.next(R),N){if(x(N.index)>=P)return w;this.positionInBuffer(c,x(N.index)-T,M);const O=this.getLineFeedCnt(c.piece.bufferIndex,o,M),B=M.line===o.line?M.column-o.column+l:M.column+1,W=B+N[0].length;if(D[w++]=(0,S.createFindMatch)(new k.Range(s+O,B,s+O,W),N,m),x(N.index)+N[0].length>=P||w>=C)return w}while(N);return w}findMatchesLineByLine(c,d,s,l){const o=[];let g=0;const h=new S.Searcher(d.wordSeparators,d.regex);let m=this.nodeAt2(c.startLineNumber,c.startColumn);if(m===null)return[];const C=this.nodeAt2(c.endLineNumber,c.endColumn);if(C===null)return[];let w=this.positionInBuffer(m.node,m.remainder);const D=this.positionInBuffer(C.node,C.remainder);if(m.node===C.node)return this.findMatchesInNode(m.node,h,c.startLineNumber,c.startColumn,w,D,d,s,l,g,o),o;let I=c.startLineNumber,T=m.node;for(;T!==C.node;){const P=this.getLineFeedCnt(T.piece.bufferIndex,w,T.piece.end);if(P>=1){const M=this._buffers[T.piece.bufferIndex].lineStarts,R=this.offsetInBuffer(T.piece.bufferIndex,T.piece.start),x=M[w.line+P],O=I===c.startLineNumber?c.startColumn:1;if(g=this.findMatchesInNode(T,h,I,O,w,this.positionInBuffer(T,x-R),d,s,l,g,o),g>=l)return o;I+=P}const N=I===c.startLineNumber?c.startColumn-1:0;if(I===c.endLineNumber){const M=this.getLineContent(I).substring(N,c.endColumn-1);return g=this._findMatchesInLine(d,h,M,c.endLineNumber,N,g,o,s,l),o}if(g=this._findMatchesInLine(d,h,this.getLineContent(I).substr(N),I,N,g,o,s,l),g>=l)return o;I++,m=this.nodeAt2(I,1),T=m.node,w=this.positionInBuffer(m.node,m.remainder)}if(I===c.endLineNumber){const P=I===c.startLineNumber?c.startColumn-1:0,N=this.getLineContent(I).substring(P,c.endColumn-1);return g=this._findMatchesInLine(d,h,N,c.endLineNumber,P,g,o,s,l),o}const A=I===c.startLineNumber?c.startColumn:1;return g=this.findMatchesInNode(C.node,h,I,A,w,D,d,s,l,g,o),o}_findMatchesInLine(c,d,s,l,o,g,h,m,C){const w=c.wordSeparators;if(!m&&c.simpleSearch){const I=c.simpleSearch,T=I.length,A=s.length;let P=-T;for(;(P=s.indexOf(I,P+T))!==-1;)if((!w||(0,S.isValidMatch)(w,s,A,P,T))&&(h[g++]=new y.FindMatch(new k.Range(l,P+1+o,l,P+1+T+o),null),g>=C))return g;return g}let D;d.reset(0);do if(D=d.next(s),D&&(h[g++]=(0,S.createFindMatch)(new k.Range(l,D.index+1+o,l,D.index+1+D[0].length+o),D,m),g>=C))return g;while(D);return g}insert(c,d,s=!1){if(this._EOLNormalized=this._EOLNormalized&&s,this._lastVisitedLine.lineNumber=0,this._lastVisitedLine.value="",this.root!==E.SENTINEL){const{node:l,remainder:o,nodeStartOffset:g}=this.nodeAt(c),h=l.piece,m=h.bufferIndex,C=this.positionInBuffer(l,o);if(l.piece.bufferIndex===0&&h.end.line===this._lastChangeBufferPos.line&&h.end.column===this._lastChangeBufferPos.column&&g+h.length===c&&d.length<p){this.appendToNode(l,d),this.computeBufferMetadata();return}if(g===c)this.insertContentToNodeLeft(d,l),this._searchCache.validate(c);else if(g+l.piece.length>c){const w=[];let D=new i(h.bufferIndex,C,h.end,this.getLineFeedCnt(h.bufferIndex,C,h.end),this.offsetInBuffer(m,h.end)-this.offsetInBuffer(m,C));if(this.shouldCheckCRLF()&&this.endWithCR(d)&&this.nodeCharCodeAt(l,o)===10){const P={line:D.start.line+1,column:0};D=new i(D.bufferIndex,P,D.end,this.getLineFeedCnt(D.bufferIndex,P,D.end),D.length-1),d+=`
+`}if(this.shouldCheckCRLF()&&this.startWithLF(d))if(this.nodeCharCodeAt(l,o-1)===13){const P=this.positionInBuffer(l,o-1);this.deleteNodeTail(l,P),d="\r"+d,l.piece.length===0&&w.push(l)}else this.deleteNodeTail(l,C);else this.deleteNodeTail(l,C);const I=this.createNewPieces(d);D.length>0&&this.rbInsertRight(l,D);let T=l;for(let A=0;A<I.length;A++)T=this.rbInsertRight(T,I[A]);this.deleteNodes(w)}else this.insertContentToNodeRight(d,l)}else{const l=this.createNewPieces(d);let o=this.rbInsertLeft(null,l[0]);for(let g=1;g<l.length;g++)o=this.rbInsertRight(o,l[g])}this.computeBufferMetadata()}delete(c,d){if(this._lastVisitedLine.lineNumber=0,this._lastVisitedLine.value="",d<=0||this.root===E.SENTINEL)return;const s=this.nodeAt(c),l=this.nodeAt(c+d),o=s.node,g=l.node;if(o===g){const I=this.positionInBuffer(o,s.remainder),T=this.positionInBuffer(o,l.remainder);if(s.nodeStartOffset===c){if(d===o.piece.length){const A=o.next();(0,E.rbDelete)(this,o),this.validateCRLFWithPrevNode(A),this.computeBufferMetadata();return}this.deleteNodeHead(o,T),this._searchCache.validate(c),this.validateCRLFWithPrevNode(o),this.computeBufferMetadata();return}if(s.nodeStartOffset+o.piece.length===c+d){this.deleteNodeTail(o,I),this.validateCRLFWithNextNode(o),this.computeBufferMetadata();return}this.shrinkNode(o,I,T),this.computeBufferMetadata();return}const h=[],m=this.positionInBuffer(o,s.remainder);this.deleteNodeTail(o,m),this._searchCache.validate(c),o.piece.length===0&&h.push(o);const C=this.positionInBuffer(g,l.remainder);this.deleteNodeHead(g,C),g.piece.length===0&&h.push(g);const w=o.next();for(let I=w;I!==E.SENTINEL&&I!==g;I=I.next())h.push(I);const D=o.piece.length===0?o.prev():o;this.deleteNodes(h),this.validateCRLFWithNextNode(D),this.computeBufferMetadata()}insertContentToNodeLeft(c,d){const s=[];if(this.shouldCheckCRLF()&&this.endWithCR(c)&&this.startWithLF(d)){const g=d.piece,h={line:g.start.line+1,column:0},m=new i(g.bufferIndex,h,g.end,this.getLineFeedCnt(g.bufferIndex,h,g.end),g.length-1);d.piece=m,c+=`
+`,(0,E.updateTreeMetadata)(this,d,-1,-1),d.piece.length===0&&s.push(d)}const l=this.createNewPieces(c);let o=this.rbInsertLeft(d,l[l.length-1]);for(let g=l.length-2;g>=0;g--)o=this.rbInsertLeft(o,l[g]);this.validateCRLFWithPrevNode(o),this.deleteNodes(s)}insertContentToNodeRight(c,d){this.adjustCarriageReturnFromNext(c,d)&&(c+=`
+`);const s=this.createNewPieces(c),l=this.rbInsertRight(d,s[0]);let o=l;for(let g=1;g<s.length;g++)o=this.rbInsertRight(o,s[g]);this.validateCRLFWithPrevNode(l)}positionInBuffer(c,d,s){const l=c.piece,o=c.piece.bufferIndex,g=this._buffers[o].lineStarts,m=g[l.start.line]+l.start.column+d;let C=l.start.line,w=l.end.line,D=0,I=0,T=0;for(;C<=w&&(D=C+(w-C)/2|0,T=g[D],D!==w);)if(I=g[D+1],m<T)w=D-1;else if(m>=I)C=D+1;else break;return s?(s.line=D,s.column=m-T,null):{line:D,column:m-T}}getLineFeedCnt(c,d,s){if(s.column===0)return s.line-d.line;const l=this._buffers[c].lineStarts;if(s.line===l.length-1)return s.line-d.line;const o=l[s.line+1],g=l[s.line]+s.column;if(o>g+1)return s.line-d.line;const h=g-1;return this._buffers[c].buffer.charCodeAt(h)===13?s.line-d.line+1:s.line-d.line}offsetInBuffer(c,d){return this._buffers[c].lineStarts[d.line]+d.column}deleteNodes(c){for(let d=0;d<c.length;d++)(0,E.rbDelete)(this,c[d])}createNewPieces(c){if(c.length>p){const w=[];for(;c.length>p;){const I=c.charCodeAt(p-1);let T;I===13||I>=55296&&I<=56319?(T=c.substring(0,p-1),c=c.substring(p-1)):(T=c.substring(0,p),c=c.substring(p));const A=b(T);w.push(new i(this._buffers.length,{line:0,column:0},{line:A.length-1,column:T.length-A[A.length-1]},A.length-1,T.length)),this._buffers.push(new n(T,A))}const D=b(c);return w.push(new i(this._buffers.length,{line:0,column:0},{line:D.length-1,column:c.length-D[D.length-1]},D.length-1,c.length)),this._buffers.push(new n(c,D)),w}let d=this._buffers[0].buffer.length;const s=b(c,!1);let l=this._lastChangeBufferPos;if(this._buffers[0].lineStarts[this._buffers[0].lineStarts.length-1]===d&&d!==0&&this.startWithLF(c)&&this.endWithCR(this._buffers[0].buffer)){this._lastChangeBufferPos={line:this._lastChangeBufferPos.line,column:this._lastChangeBufferPos.column+1},l=this._lastChangeBufferPos;for(let w=0;w<s.length;w++)s[w]+=d+1;this._buffers[0].lineStarts=this._buffers[0].lineStarts.concat(s.slice(1)),this._buffers[0].buffer+="_"+c,d+=1}else{if(d!==0)for(let w=0;w<s.length;w++)s[w]+=d;this._buffers[0].lineStarts=this._buffers[0].lineStarts.concat(s.slice(1)),this._buffers[0].buffer+=c}const o=this._buffers[0].buffer.length,g=this._buffers[0].lineStarts.length-1,h=o-this._buffers[0].lineStarts[g],m={line:g,column:h},C=new i(0,l,m,this.getLineFeedCnt(0,l,m),o-d);return this._lastChangeBufferPos=m,[C]}getLineRawContent(c,d=0){let s=this.root,l="";const o=this._searchCache.get2(c);if(o){s=o.node;const g=this.getAccumulatedValue(s,c-o.nodeStartLineNumber-1),h=this._buffers[s.piece.bufferIndex].buffer,m=this.offsetInBuffer(s.piece.bufferIndex,s.piece.start);if(o.nodeStartLineNumber+s.piece.lineFeedCnt===c)l=h.substring(m+g,m+s.piece.length);else{const C=this.getAccumulatedValue(s,c-o.nodeStartLineNumber);return h.substring(m+g,m+C-d)}}else{let g=0;const h=c;for(;s!==E.SENTINEL;)if(s.left!==E.SENTINEL&&s.lf_left>=c-1)s=s.left;else if(s.lf_left+s.piece.lineFeedCnt>c-1){const m=this.getAccumulatedValue(s,c-s.lf_left-2),C=this.getAccumulatedValue(s,c-s.lf_left-1),w=this._buffers[s.piece.bufferIndex].buffer,D=this.offsetInBuffer(s.piece.bufferIndex,s.piece.start);return g+=s.size_left,this._searchCache.set({node:s,nodeStartOffset:g,nodeStartLineNumber:h-(c-1-s.lf_left)}),w.substring(D+m,D+C-d)}else if(s.lf_left+s.piece.lineFeedCnt===c-1){const m=this.getAccumulatedValue(s,c-s.lf_left-2),C=this._buffers[s.piece.bufferIndex].buffer,w=this.offsetInBuffer(s.piece.bufferIndex,s.piece.start);l=C.substring(w+m,w+s.piece.length);break}else c-=s.lf_left+s.piece.lineFeedCnt,g+=s.size_left+s.piece.length,s=s.right}for(s=s.next();s!==E.SENTINEL;){const g=this._buffers[s.piece.bufferIndex].buffer;if(s.piece.lineFeedCnt>0){const h=this.getAccumulatedValue(s,0),m=this.offsetInBuffer(s.piece.bufferIndex,s.piece.start);return l+=g.substring(m,m+h-d),l}else{const h=this.offsetInBuffer(s.piece.bufferIndex,s.piece.start);l+=g.substr(h,s.piece.length)}s=s.next()}return l}computeBufferMetadata(){let c=this.root,d=1,s=0;for(;c!==E.SENTINEL;)d+=c.lf_left+c.piece.lineFeedCnt,s+=c.size_left+c.piece.length,c=c.right;this._lineCnt=d,this._length=s,this._searchCache.validate(this._length)}getIndexOf(c,d){const s=c.piece,l=this.positionInBuffer(c,d),o=l.line-s.start.line;if(this.offsetInBuffer(s.bufferIndex,s.end)-this.offsetInBuffer(s.bufferIndex,s.start)===d){const g=this.getLineFeedCnt(c.piece.bufferIndex,s.start,l);if(g!==o)return{index:g,remainder:0}}return{index:o,remainder:l.column}}getAccumulatedValue(c,d){if(d<0)return 0;const s=c.piece,l=this._buffers[s.bufferIndex].lineStarts,o=s.start.line+d+1;return o>s.end.line?l[s.end.line]+s.end.column-l[s.start.line]-s.start.column:l[o]-l[s.start.line]-s.start.column}deleteNodeTail(c,d){const s=c.piece,l=s.lineFeedCnt,o=this.offsetInBuffer(s.bufferIndex,s.end),g=d,h=this.offsetInBuffer(s.bufferIndex,g),m=this.getLineFeedCnt(s.bufferIndex,s.start,g),C=m-l,w=h-o,D=s.length+w;c.piece=new i(s.bufferIndex,s.start,g,m,D),(0,E.updateTreeMetadata)(this,c,w,C)}deleteNodeHead(c,d){const s=c.piece,l=s.lineFeedCnt,o=this.offsetInBuffer(s.bufferIndex,s.start),g=d,h=this.getLineFeedCnt(s.bufferIndex,g,s.end),m=this.offsetInBuffer(s.bufferIndex,g),C=h-l,w=o-m,D=s.length+w;c.piece=new i(s.bufferIndex,g,s.end,h,D),(0,E.updateTreeMetadata)(this,c,w,C)}shrinkNode(c,d,s){const l=c.piece,o=l.start,g=l.end,h=l.length,m=l.lineFeedCnt,C=d,w=this.getLineFeedCnt(l.bufferIndex,l.start,C),D=this.offsetInBuffer(l.bufferIndex,d)-this.offsetInBuffer(l.bufferIndex,o);c.piece=new i(l.bufferIndex,l.start,C,w,D),(0,E.updateTreeMetadata)(this,c,D-h,w-m);const I=new i(l.bufferIndex,s,g,this.getLineFeedCnt(l.bufferIndex,s,g),this.offsetInBuffer(l.bufferIndex,g)-this.offsetInBuffer(l.bufferIndex,s)),T=this.rbInsertRight(c,I);this.validateCRLFWithPrevNode(T)}appendToNode(c,d){this.adjustCarriageReturnFromNext(d,c)&&(d+=`
+`);const s=this.shouldCheckCRLF()&&this.startWithLF(d)&&this.endWithCR(c),l=this._buffers[0].buffer.length;this._buffers[0].buffer+=d;const o=b(d,!1);for(let T=0;T<o.length;T++)o[T]+=l;if(s){const T=this._buffers[0].lineStarts[this._buffers[0].lineStarts.length-2];this._buffers[0].lineStarts.pop(),this._lastChangeBufferPos={line:this._lastChangeBufferPos.line-1,column:l-T}}this._buffers[0].lineStarts=this._buffers[0].lineStarts.concat(o.slice(1));const g=this._buffers[0].lineStarts.length-1,h=this._buffers[0].buffer.length-this._buffers[0].lineStarts[g],m={line:g,column:h},C=c.piece.length+d.length,w=c.piece.lineFeedCnt,D=this.getLineFeedCnt(0,c.piece.start,m),I=D-w;c.piece=new i(c.piece.bufferIndex,c.piece.start,m,D,C),this._lastChangeBufferPos=m,(0,E.updateTreeMetadata)(this,c,d.length,I)}nodeAt(c){let d=this.root;const s=this._searchCache.get(c);if(s)return{node:s.node,nodeStartOffset:s.nodeStartOffset,remainder:c-s.nodeStartOffset};let l=0;for(;d!==E.SENTINEL;)if(d.size_left>c)d=d.left;else if(d.size_left+d.piece.length>=c){l+=d.size_left;const o={node:d,remainder:c-d.size_left,nodeStartOffset:l};return this._searchCache.set(o),o}else c-=d.size_left+d.piece.length,l+=d.size_left+d.piece.length,d=d.right;return null}nodeAt2(c,d){let s=this.root,l=0;for(;s!==E.SENTINEL;)if(s.left!==E.SENTINEL&&s.lf_left>=c-1)s=s.left;else if(s.lf_left+s.piece.lineFeedCnt>c-1){const o=this.getAccumulatedValue(s,c-s.lf_left-2),g=this.getAccumulatedValue(s,c-s.lf_left-1);return l+=s.size_left,{node:s,remainder:Math.min(o+d-1,g),nodeStartOffset:l}}else if(s.lf_left+s.piece.lineFeedCnt===c-1){const o=this.getAccumulatedValue(s,c-s.lf_left-2);if(o+d-1<=s.piece.length)return{node:s,remainder:o+d-1,nodeStartOffset:l};d-=s.piece.length-o;break}else c-=s.lf_left+s.piece.lineFeedCnt,l+=s.size_left+s.piece.length,s=s.right;for(s=s.next();s!==E.SENTINEL;){if(s.piece.lineFeedCnt>0){const o=this.getAccumulatedValue(s,0),g=this.offsetOfNode(s);return{node:s,remainder:Math.min(d-1,o),nodeStartOffset:g}}else if(s.piece.length>=d-1){const o=this.offsetOfNode(s);return{node:s,remainder:d-1,nodeStartOffset:o}}else d-=s.piece.length;s=s.next()}return null}nodeCharCodeAt(c,d){if(c.piece.lineFeedCnt<1)return-1;const s=this._buffers[c.piece.bufferIndex],l=this.offsetInBuffer(c.piece.bufferIndex,c.piece.start)+d;return s.buffer.charCodeAt(l)}offsetOfNode(c){if(!c)return 0;let d=c.size_left;for(;c!==this.root;)c.parent.right===c&&(d+=c.parent.size_left+c.parent.piece.length),c=c.parent;return d}shouldCheckCRLF(){return!(this._EOLNormalized&&this._EOL===`
+`)}startWithLF(c){if(typeof c=="string")return c.charCodeAt(0)===10;if(c===E.SENTINEL||c.piece.lineFeedCnt===0)return!1;const d=c.piece,s=this._buffers[d.bufferIndex].lineStarts,l=d.start.line,o=s[l]+d.start.column;return l===s.length-1||s[l+1]>o+1?!1:this._buffers[d.bufferIndex].buffer.charCodeAt(o)===10}endWithCR(c){return typeof c=="string"?c.charCodeAt(c.length-1)===13:c===E.SENTINEL||c.piece.lineFeedCnt===0?!1:this.nodeCharCodeAt(c,c.piece.length-1)===13}validateCRLFWithPrevNode(c){if(this.shouldCheckCRLF()&&this.startWithLF(c)){const d=c.prev();this.endWithCR(d)&&this.fixCRLF(d,c)}}validateCRLFWithNextNode(c){if(this.shouldCheckCRLF()&&this.endWithCR(c)){const d=c.next();this.startWithLF(d)&&this.fixCRLF(c,d)}}fixCRLF(c,d){const s=[],l=this._buffers[c.piece.bufferIndex].lineStarts;let o;c.piece.end.column===0?o={line:c.piece.end.line-1,column:l[c.piece.end.line]-l[c.piece.end.line-1]-1}:o={line:c.piece.end.line,column:c.piece.end.column-1};const g=c.piece.length-1,h=c.piece.lineFeedCnt-1;c.piece=new i(c.piece.bufferIndex,c.piece.start,o,h,g),(0,E.updateTreeMetadata)(this,c,-1,-1),c.piece.length===0&&s.push(c);const m={line:d.piece.start.line+1,column:0},C=d.piece.length-1,w=this.getLineFeedCnt(d.piece.bufferIndex,m,d.piece.end);d.piece=new i(d.piece.bufferIndex,m,d.piece.end,w,C),(0,E.updateTreeMetadata)(this,d,-1,-1),d.piece.length===0&&s.push(d);const D=this.createNewPieces(`\r
+`);this.rbInsertRight(c,D[0]);for(let I=0;I<s.length;I++)(0,E.rbDelete)(this,s[I])}adjustCarriageReturnFromNext(c,d){if(this.shouldCheckCRLF()&&this.endWithCR(c)){const s=d.next();if(this.startWithLF(s)){if(c+=`
+`,s.piece.length===1)(0,E.rbDelete)(this,s);else{const l=s.piece,o={line:l.start.line+1,column:0},g=l.length-1,h=this.getLineFeedCnt(l.bufferIndex,o,l.end);s.piece=new i(l.bufferIndex,o,l.end,h,g),(0,E.updateTreeMetadata)(this,s,-1,-1)}return!0}}return!1}iterate(c,d){if(c===E.SENTINEL)return d(E.SENTINEL);const s=this.iterate(c.left,d);return s&&d(c)&&this.iterate(c.right,d)}getNodeContent(c){if(c===E.SENTINEL)return"";const d=this._buffers[c.piece.bufferIndex],s=c.piece,l=this.offsetInBuffer(s.bufferIndex,s.start),o=this.offsetInBuffer(s.bufferIndex,s.end);return d.buffer.substring(l,o)}getPieceContent(c){const d=this._buffers[c.bufferIndex],s=this.offsetInBuffer(c.bufferIndex,c.start),l=this.offsetInBuffer(c.bufferIndex,c.end);return d.buffer.substring(s,l)}rbInsertRight(c,d){const s=new E.TreeNode(d,1);if(s.left=E.SENTINEL,s.right=E.SENTINEL,s.parent=E.SENTINEL,s.size_left=0,s.lf_left=0,this.root===E.SENTINEL)this.root=s,s.color=0;else if(c.right===E.SENTINEL)c.right=s,s.parent=c;else{const o=(0,E.leftest)(c.right);o.left=s,s.parent=o}return(0,E.fixInsert)(this,s),s}rbInsertLeft(c,d){const s=new E.TreeNode(d,1);if(s.left=E.SENTINEL,s.right=E.SENTINEL,s.parent=E.SENTINEL,s.size_left=0,s.lf_left=0,this.root===E.SENTINEL)this.root=s,s.color=0;else if(c.left===E.SENTINEL)c.left=s,s.parent=c;else{const l=(0,E.righttest)(c.left);l.right=s,s.parent=l}return(0,E.fixInsert)(this,s),s}}e.PieceTreeBase=u}),define(se[210],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.computeIndentLevel=void 0;function L(k,y){let E=0,S=0;const p=k.length;for(;S<p;){const _=k.charCodeAt(S);if(_===32)E++;else if(_===9)E=E-E%y+y;else break;S++}return S===p?-1:E}e.computeIndentLevel=L}),define(se[294],oe([1,0,90,10,41]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OutputPosition=e.InjectedText=e.ModelLineProjectionData=void 0;class E{constructor(a,i,n,t,r){this.injectionOffsets=a,this.injectionOptions=i,this.breakOffsets=n,this.breakOffsetsVisibleColumn=t,this.wrappedTextIndentLength=r}getOutputLineCount(){return this.breakOffsets.length}getMinOutputOffset(a){return a>0?this.wrappedTextIndentLength:0}getLineLength(a){const i=a>0?this.breakOffsets[a-1]:0;let t=this.breakOffsets[a]-i;return a>0&&(t+=this.wrappedTextIndentLength),t}getMaxOutputOffset(a){return this.getLineLength(a)}translateToInputOffset(a,i){a>0&&(i=Math.max(0,i-this.wrappedTextIndentLength));let t=a===0?i:this.breakOffsets[a-1]+i;if(this.injectionOffsets!==null)for(let r=0;r<this.injectionOffsets.length&&t>this.injectionOffsets[r];r++)t<this.injectionOffsets[r]+this.injectionOptions[r].content.length?t=this.injectionOffsets[r]:t-=this.injectionOptions[r].content.length;return t}translateToOutputPosition(a,i=2){let n=a;if(this.injectionOffsets!==null)for(let t=0;t<this.injectionOffsets.length&&!(a<this.injectionOffsets[t]||i!==1&&a===this.injectionOffsets[t]);t++)n+=this.injectionOptions[t].content.length;return this.offsetInInputWithInjectionsToOutputPosition(n,i)}offsetInInputWithInjectionsToOutputPosition(a,i=2){let n=0,t=this.breakOffsets.length-1,r=0,u=0;for(;n<=t;){r=n+(t-n)/2|0;const c=this.breakOffsets[r];if(u=r>0?this.breakOffsets[r-1]:0,i===0)if(a<=u)t=r-1;else if(a>c)n=r+1;else break;else if(a<u)t=r-1;else if(a>=c)n=r+1;else break}let f=a-u;return r>0&&(f+=this.wrappedTextIndentLength),new v(r,f)}normalizeOutputPosition(a,i,n){if(this.injectionOffsets!==null){const t=this.outputPositionToOffsetInInputWithInjections(a,i),r=this.normalizeOffsetInInputWithInjectionsAroundInjections(t,n);if(r!==t)return this.offsetInInputWithInjectionsToOutputPosition(r,n)}if(n===0){if(a>0&&i===this.getMinOutputOffset(a))return new v(a-1,this.getMaxOutputOffset(a-1))}else if(n===1){const t=this.getOutputLineCount()-1;if(a<t&&i===this.getMaxOutputOffset(a))return new v(a+1,this.getMinOutputOffset(a+1))}return new v(a,i)}outputPositionToOffsetInInputWithInjections(a,i){return a>0&&(i=Math.max(0,i-this.wrappedTextIndentLength)),(a>0?this.breakOffsets[a-1]:0)+i}normalizeOffsetInInputWithInjectionsAroundInjections(a,i){const n=this.getInjectedTextAtOffset(a);if(!n)return a;if(i===2){if(a===n.offsetInInputWithInjections+n.length&&S(this.injectionOptions[n.injectedTextIndex].cursorStops))return n.offsetInInputWithInjections+n.length;{let t=n.offsetInInputWithInjections;if(p(this.injectionOptions[n.injectedTextIndex].cursorStops))return t;let r=n.injectedTextIndex-1;for(;r>=0&&this.injectionOffsets[r]===this.injectionOffsets[n.injectedTextIndex]&&!(S(this.injectionOptions[r].cursorStops)||(t-=this.injectionOptions[r].content.length,p(this.injectionOptions[r].cursorStops)));)r--;return t}}else if(i===1||i===4){let t=n.offsetInInputWithInjections+n.length,r=n.injectedTextIndex;for(;r+1<this.injectionOffsets.length&&this.injectionOffsets[r+1]===this.injectionOffsets[r];)t+=this.injectionOptions[r+1].content.length,r++;return t}else if(i===0||i===3){let t=n.offsetInInputWithInjections,r=n.injectedTextIndex;for(;r-1>=0&&this.injectionOffsets[r-1]===this.injectionOffsets[r];)t-=this.injectionOptions[r-1].content.length,r--;return t}(0,L.assertNever)(i)}getInjectedText(a,i){const n=this.outputPositionToOffsetInInputWithInjections(a,i),t=this.getInjectedTextAtOffset(n);return t?{options:this.injectionOptions[t.injectedTextIndex]}:null}getInjectedTextAtOffset(a){const i=this.injectionOffsets,n=this.injectionOptions;if(i!==null){let t=0;for(let r=0;r<i.length;r++){const u=n[r].content.length,f=i[r]+t,c=i[r]+t+u;if(f>a)break;if(a<=c)return{injectedTextIndex:r,offsetInInputWithInjections:f,length:u};t+=u}}}}e.ModelLineProjectionData=E;function S(b){return b==null?!0:b===y.InjectedTextCursorStops.Right||b===y.InjectedTextCursorStops.Both}function p(b){return b==null?!0:b===y.InjectedTextCursorStops.Left||b===y.InjectedTextCursorStops.Both}class _{constructor(a){this.options=a}}e.InjectedText=_;class v{constructor(a,i){this.outputLineIndex=a,this.outputOffset=i}toString(){return`${this.outputLineIndex}:${this.outputOffset}`}toPosition(a){return new k.Position(a+this.outputLineIndex,this.outputOffset+1)}}e.OutputPosition=v}),define(se[295],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DraggedTreeItemsIdentifier=e.TreeViewsDnDService=void 0;class L{constructor(){this._dragOperations=new Map}removeDragOperationTransfer(E){if(E&&this._dragOperations.has(E)){const S=this._dragOperations.get(E);return this._dragOperations.delete(E),S}}}e.TreeViewsDnDService=L;class k{constructor(E){this.identifier=E}}e.DraggedTreeItemsIdentifier=k}),define(se[296],oe([1,0,5,184,11,90,151]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UnicodeTextModelHighlighter=void 0;class p{static computeUnicodeHighlights(i,n,t){const r=t?t.startLineNumber:1,u=t?t.endLineNumber:i.getLineCount(),f=new v(n),c=f.getCandidateCodePoints();let d;c==="allNonBasicAscii"?d=new RegExp("[^\\t\\n\\r\\x20-\\x7E]","g"):d=new RegExp(`${_(Array.from(c))}`,"g");const s=new k.Searcher(null,d),l=[];let o=!1,g,h=0,m=0,C=0;e:for(let w=r,D=u;w<=D;w++){const I=i.getLineContent(w),T=I.length;s.reset(0);do if(g=s.next(I),g){let A=g.index,P=g.index+g[0].length;if(A>0){const x=I.charCodeAt(A-1);y.isHighSurrogate(x)&&A--}if(P+1<T){const x=I.charCodeAt(P-1);y.isHighSurrogate(x)&&P++}const N=I.substring(A,P);let M=(0,S.getWordAtText)(A+1,S.DEFAULT_WORD_REGEXP,I,0);M&&M.endColumn<=A+1&&(M=null);const R=f.shouldHighlightNonBasicASCII(N,M?M.word:null);if(R!==0){R===3?h++:R===2?m++:R===1?C++:(0,E.assertNever)(R);const x=1e3;if(l.length>=x){o=!0;break e}l.push(new L.Range(w,A+1,w,P+1))}}while(g)}return{ranges:l,hasMore:o,ambiguousCharacterCount:h,invisibleCharacterCount:m,nonBasicAsciiCharacterCount:C}}static computeUnicodeHighlightReason(i,n){const t=new v(n);switch(t.shouldHighlightNonBasicASCII(i,null)){case 0:return null;case 2:return{kind:1};case 3:{const u=i.codePointAt(0),f=t.ambiguousCharacters.getPrimaryConfusable(u),c=y.AmbiguousCharacters.getLocales().filter(d=>!y.AmbiguousCharacters.getInstance(new Set([...n.allowedLocales,d])).isAmbiguous(u));return{kind:0,confusableWith:String.fromCodePoint(f),notAmbiguousInLocales:c}}case 1:return{kind:2}}}}e.UnicodeTextModelHighlighter=p;function _(a,i){return`[${y.escapeRegExpCharacters(a.map(t=>String.fromCodePoint(t)).join(""))}]`}class v{constructor(i){this.options=i,this.allowedCodePoints=new Set(i.allowedCodePoints),this.ambiguousCharacters=y.AmbiguousCharacters.getInstance(new Set(i.allowedLocales))}getCandidateCodePoints(){if(this.options.nonBasicASCII)return"allNonBasicAscii";const i=new Set;if(this.options.invisibleCharacters)for(const n of y.InvisibleCharacters.codePoints)b(String.fromCodePoint(n))||i.add(n);if(this.options.ambiguousCharacters)for(const n of this.ambiguousCharacters.getConfusableCodePoints())i.add(n);for(const n of this.allowedCodePoints)i.delete(n);return i}shouldHighlightNonBasicASCII(i,n){const t=i.codePointAt(0);if(this.allowedCodePoints.has(t))return 0;if(this.options.nonBasicASCII)return 1;let r=!1,u=!1;if(n)for(const f of n){const c=f.codePointAt(0),d=y.isBasicASCII(f);r=r||d,!d&&!this.ambiguousCharacters.isAmbiguous(c)&&!y.InvisibleCharacters.isInvisibleCharacter(c)&&(u=!0)}return!r&&u?0:this.options.invisibleCharacters&&!b(i)&&y.InvisibleCharacters.isInvisibleCharacter(t)?2:this.options.ambiguousCharacters&&this.ambiguousCharacters.isAmbiguous(t)?3:0}}function b(a){return a===" "||a===`
+`||a==="	"}}),define(se[211],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WrappingIndent=e.TrackedRangeStickiness=e.TextEditorCursorStyle=e.TextEditorCursorBlinkingStyle=e.SymbolTag=e.SymbolKind=e.SignatureHelpTriggerKind=e.ShowLightbulbIconMode=e.SelectionDirection=e.ScrollbarVisibility=e.ScrollType=e.RenderMinimap=e.RenderLineNumbersType=e.PositionAffinity=e.OverviewRulerLane=e.OverlayWidgetPositionPreference=e.MouseTargetType=e.MinimapPosition=e.MarkerTag=e.MarkerSeverity=e.KeyCode=e.InlineCompletionTriggerKind=e.InlayHintKind=e.InjectedTextCursorStops=e.IndentAction=e.GlyphMarginLane=e.EndOfLineSequence=e.EndOfLinePreference=e.EditorOption=e.EditorAutoIndentStrategy=e.DocumentHighlightKind=e.DefaultEndOfLine=e.CursorChangeReason=e.ContentWidgetPositionPreference=e.CompletionTriggerKind=e.CompletionItemTag=e.CompletionItemKind=e.CompletionItemInsertTextRule=e.CodeActionTriggerType=e.AccessibilitySupport=void 0;var L;(function(F){F[F.Unknown=0]="Unknown",F[F.Disabled=1]="Disabled",F[F.Enabled=2]="Enabled"})(L||(e.AccessibilitySupport=L={}));var k;(function(F){F[F.Invoke=1]="Invoke",F[F.Auto=2]="Auto"})(k||(e.CodeActionTriggerType=k={}));var y;(function(F){F[F.None=0]="None",F[F.KeepWhitespace=1]="KeepWhitespace",F[F.InsertAsSnippet=4]="InsertAsSnippet"})(y||(e.CompletionItemInsertTextRule=y={}));var E;(function(F){F[F.Method=0]="Method",F[F.Function=1]="Function",F[F.Constructor=2]="Constructor",F[F.Field=3]="Field",F[F.Variable=4]="Variable",F[F.Class=5]="Class",F[F.Struct=6]="Struct",F[F.Interface=7]="Interface",F[F.Module=8]="Module",F[F.Property=9]="Property",F[F.Event=10]="Event",F[F.Operator=11]="Operator",F[F.Unit=12]="Unit",F[F.Value=13]="Value",F[F.Constant=14]="Constant",F[F.Enum=15]="Enum",F[F.EnumMember=16]="EnumMember",F[F.Keyword=17]="Keyword",F[F.Text=18]="Text",F[F.Color=19]="Color",F[F.File=20]="File",F[F.Reference=21]="Reference",F[F.Customcolor=22]="Customcolor",F[F.Folder=23]="Folder",F[F.TypeParameter=24]="TypeParameter",F[F.User=25]="User",F[F.Issue=26]="Issue",F[F.Snippet=27]="Snippet"})(E||(e.CompletionItemKind=E={}));var S;(function(F){F[F.Deprecated=1]="Deprecated"})(S||(e.CompletionItemTag=S={}));var p;(function(F){F[F.Invoke=0]="Invoke",F[F.TriggerCharacter=1]="TriggerCharacter",F[F.TriggerForIncompleteCompletions=2]="TriggerForIncompleteCompletions"})(p||(e.CompletionTriggerKind=p={}));var _;(function(F){F[F.EXACT=0]="EXACT",F[F.ABOVE=1]="ABOVE",F[F.BELOW=2]="BELOW"})(_||(e.ContentWidgetPositionPreference=_={}));var v;(function(F){F[F.NotSet=0]="NotSet",F[F.ContentFlush=1]="ContentFlush",F[F.RecoverFromMarkers=2]="RecoverFromMarkers",F[F.Explicit=3]="Explicit",F[F.Paste=4]="Paste",F[F.Undo=5]="Undo",F[F.Redo=6]="Redo"})(v||(e.CursorChangeReason=v={}));var b;(function(F){F[F.LF=1]="LF",F[F.CRLF=2]="CRLF"})(b||(e.DefaultEndOfLine=b={}));var a;(function(F){F[F.Text=0]="Text",F[F.Read=1]="Read",F[F.Write=2]="Write"})(a||(e.DocumentHighlightKind=a={}));var i;(function(F){F[F.None=0]="None",F[F.Keep=1]="Keep",F[F.Brackets=2]="Brackets",F[F.Advanced=3]="Advanced",F[F.Full=4]="Full"})(i||(e.EditorAutoIndentStrategy=i={}));var n;(function(F){F[F.acceptSuggestionOnCommitCharacter=0]="acceptSuggestionOnCommitCharacter",F[F.acceptSuggestionOnEnter=1]="acceptSuggestionOnEnter",F[F.accessibilitySupport=2]="accessibilitySupport",F[F.accessibilityPageSize=3]="accessibilityPageSize",F[F.ariaLabel=4]="ariaLabel",F[F.ariaRequired=5]="ariaRequired",F[F.autoClosingBrackets=6]="autoClosingBrackets",F[F.autoClosingComments=7]="autoClosingComments",F[F.screenReaderAnnounceInlineSuggestion=8]="screenReaderAnnounceInlineSuggestion",F[F.autoClosingDelete=9]="autoClosingDelete",F[F.autoClosingOvertype=10]="autoClosingOvertype",F[F.autoClosingQuotes=11]="autoClosingQuotes",F[F.autoIndent=12]="autoIndent",F[F.automaticLayout=13]="automaticLayout",F[F.autoSurround=14]="autoSurround",F[F.bracketPairColorization=15]="bracketPairColorization",F[F.guides=16]="guides",F[F.codeLens=17]="codeLens",F[F.codeLensFontFamily=18]="codeLensFontFamily",F[F.codeLensFontSize=19]="codeLensFontSize",F[F.colorDecorators=20]="colorDecorators",F[F.colorDecoratorsLimit=21]="colorDecoratorsLimit",F[F.columnSelection=22]="columnSelection",F[F.comments=23]="comments",F[F.contextmenu=24]="contextmenu",F[F.copyWithSyntaxHighlighting=25]="copyWithSyntaxHighlighting",F[F.cursorBlinking=26]="cursorBlinking",F[F.cursorSmoothCaretAnimation=27]="cursorSmoothCaretAnimation",F[F.cursorStyle=28]="cursorStyle",F[F.cursorSurroundingLines=29]="cursorSurroundingLines",F[F.cursorSurroundingLinesStyle=30]="cursorSurroundingLinesStyle",F[F.cursorWidth=31]="cursorWidth",F[F.disableLayerHinting=32]="disableLayerHinting",F[F.disableMonospaceOptimizations=33]="disableMonospaceOptimizations",F[F.domReadOnly=34]="domReadOnly",F[F.dragAndDrop=35]="dragAndDrop",F[F.dropIntoEditor=36]="dropIntoEditor",F[F.emptySelectionClipboard=37]="emptySelectionClipboard",F[F.experimentalWhitespaceRendering=38]="experimentalWhitespaceRendering",F[F.extraEditorClassName=39]="extraEditorClassName",F[F.fastScrollSensitivity=40]="fastScrollSensitivity",F[F.find=41]="find",F[F.fixedOverflowWidgets=42]="fixedOverflowWidgets",F[F.folding=43]="folding",F[F.foldingStrategy=44]="foldingStrategy",F[F.foldingHighlight=45]="foldingHighlight",F[F.foldingImportsByDefault=46]="foldingImportsByDefault",F[F.foldingMaximumRegions=47]="foldingMaximumRegions",F[F.unfoldOnClickAfterEndOfLine=48]="unfoldOnClickAfterEndOfLine",F[F.fontFamily=49]="fontFamily",F[F.fontInfo=50]="fontInfo",F[F.fontLigatures=51]="fontLigatures",F[F.fontSize=52]="fontSize",F[F.fontWeight=53]="fontWeight",F[F.fontVariations=54]="fontVariations",F[F.formatOnPaste=55]="formatOnPaste",F[F.formatOnType=56]="formatOnType",F[F.glyphMargin=57]="glyphMargin",F[F.gotoLocation=58]="gotoLocation",F[F.hideCursorInOverviewRuler=59]="hideCursorInOverviewRuler",F[F.hover=60]="hover",F[F.inDiffEditor=61]="inDiffEditor",F[F.inlineSuggest=62]="inlineSuggest",F[F.letterSpacing=63]="letterSpacing",F[F.lightbulb=64]="lightbulb",F[F.lineDecorationsWidth=65]="lineDecorationsWidth",F[F.lineHeight=66]="lineHeight",F[F.lineNumbers=67]="lineNumbers",F[F.lineNumbersMinChars=68]="lineNumbersMinChars",F[F.linkedEditing=69]="linkedEditing",F[F.links=70]="links",F[F.matchBrackets=71]="matchBrackets",F[F.minimap=72]="minimap",F[F.mouseStyle=73]="mouseStyle",F[F.mouseWheelScrollSensitivity=74]="mouseWheelScrollSensitivity",F[F.mouseWheelZoom=75]="mouseWheelZoom",F[F.multiCursorMergeOverlapping=76]="multiCursorMergeOverlapping",F[F.multiCursorModifier=77]="multiCursorModifier",F[F.multiCursorPaste=78]="multiCursorPaste",F[F.multiCursorLimit=79]="multiCursorLimit",F[F.occurrencesHighlight=80]="occurrencesHighlight",F[F.overviewRulerBorder=81]="overviewRulerBorder",F[F.overviewRulerLanes=82]="overviewRulerLanes",F[F.padding=83]="padding",F[F.pasteAs=84]="pasteAs",F[F.parameterHints=85]="parameterHints",F[F.peekWidgetDefaultFocus=86]="peekWidgetDefaultFocus",F[F.definitionLinkOpensInPeek=87]="definitionLinkOpensInPeek",F[F.quickSuggestions=88]="quickSuggestions",F[F.quickSuggestionsDelay=89]="quickSuggestionsDelay",F[F.readOnly=90]="readOnly",F[F.readOnlyMessage=91]="readOnlyMessage",F[F.renameOnType=92]="renameOnType",F[F.renderControlCharacters=93]="renderControlCharacters",F[F.renderFinalNewline=94]="renderFinalNewline",F[F.renderLineHighlight=95]="renderLineHighlight",F[F.renderLineHighlightOnlyWhenFocus=96]="renderLineHighlightOnlyWhenFocus",F[F.renderValidationDecorations=97]="renderValidationDecorations",F[F.renderWhitespace=98]="renderWhitespace",F[F.revealHorizontalRightPadding=99]="revealHorizontalRightPadding",F[F.roundedSelection=100]="roundedSelection",F[F.rulers=101]="rulers",F[F.scrollbar=102]="scrollbar",F[F.scrollBeyondLastColumn=103]="scrollBeyondLastColumn",F[F.scrollBeyondLastLine=104]="scrollBeyondLastLine",F[F.scrollPredominantAxis=105]="scrollPredominantAxis",F[F.selectionClipboard=106]="selectionClipboard",F[F.selectionHighlight=107]="selectionHighlight",F[F.selectOnLineNumbers=108]="selectOnLineNumbers",F[F.showFoldingControls=109]="showFoldingControls",F[F.showUnused=110]="showUnused",F[F.snippetSuggestions=111]="snippetSuggestions",F[F.smartSelect=112]="smartSelect",F[F.smoothScrolling=113]="smoothScrolling",F[F.stickyScroll=114]="stickyScroll",F[F.stickyTabStops=115]="stickyTabStops",F[F.stopRenderingLineAfter=116]="stopRenderingLineAfter",F[F.suggest=117]="suggest",F[F.suggestFontSize=118]="suggestFontSize",F[F.suggestLineHeight=119]="suggestLineHeight",F[F.suggestOnTriggerCharacters=120]="suggestOnTriggerCharacters",F[F.suggestSelection=121]="suggestSelection",F[F.tabCompletion=122]="tabCompletion",F[F.tabIndex=123]="tabIndex",F[F.unicodeHighlighting=124]="unicodeHighlighting",F[F.unusualLineTerminators=125]="unusualLineTerminators",F[F.useShadowDOM=126]="useShadowDOM",F[F.useTabStops=127]="useTabStops",F[F.wordBreak=128]="wordBreak",F[F.wordSeparators=129]="wordSeparators",F[F.wordWrap=130]="wordWrap",F[F.wordWrapBreakAfterCharacters=131]="wordWrapBreakAfterCharacters",F[F.wordWrapBreakBeforeCharacters=132]="wordWrapBreakBeforeCharacters",F[F.wordWrapColumn=133]="wordWrapColumn",F[F.wordWrapOverride1=134]="wordWrapOverride1",F[F.wordWrapOverride2=135]="wordWrapOverride2",F[F.wrappingIndent=136]="wrappingIndent",F[F.wrappingStrategy=137]="wrappingStrategy",F[F.showDeprecated=138]="showDeprecated",F[F.inlayHints=139]="inlayHints",F[F.editorClassName=140]="editorClassName",F[F.pixelRatio=141]="pixelRatio",F[F.tabFocusMode=142]="tabFocusMode",F[F.layoutInfo=143]="layoutInfo",F[F.wrappingInfo=144]="wrappingInfo",F[F.defaultColorDecorators=145]="defaultColorDecorators",F[F.colorDecoratorsActivatedOn=146]="colorDecoratorsActivatedOn",F[F.inlineCompletionsAccessibilityVerbose=147]="inlineCompletionsAccessibilityVerbose"})(n||(e.EditorOption=n={}));var t;(function(F){F[F.TextDefined=0]="TextDefined",F[F.LF=1]="LF",F[F.CRLF=2]="CRLF"})(t||(e.EndOfLinePreference=t={}));var r;(function(F){F[F.LF=0]="LF",F[F.CRLF=1]="CRLF"})(r||(e.EndOfLineSequence=r={}));var u;(function(F){F[F.Left=1]="Left",F[F.Center=2]="Center",F[F.Right=3]="Right"})(u||(e.GlyphMarginLane=u={}));var f;(function(F){F[F.None=0]="None",F[F.Indent=1]="Indent",F[F.IndentOutdent=2]="IndentOutdent",F[F.Outdent=3]="Outdent"})(f||(e.IndentAction=f={}));var c;(function(F){F[F.Both=0]="Both",F[F.Right=1]="Right",F[F.Left=2]="Left",F[F.None=3]="None"})(c||(e.InjectedTextCursorStops=c={}));var d;(function(F){F[F.Type=1]="Type",F[F.Parameter=2]="Parameter"})(d||(e.InlayHintKind=d={}));var s;(function(F){F[F.Automatic=0]="Automatic",F[F.Explicit=1]="Explicit"})(s||(e.InlineCompletionTriggerKind=s={}));var l;(function(F){F[F.DependsOnKbLayout=-1]="DependsOnKbLayout",F[F.Unknown=0]="Unknown",F[F.Backspace=1]="Backspace",F[F.Tab=2]="Tab",F[F.Enter=3]="Enter",F[F.Shift=4]="Shift",F[F.Ctrl=5]="Ctrl",F[F.Alt=6]="Alt",F[F.PauseBreak=7]="PauseBreak",F[F.CapsLock=8]="CapsLock",F[F.Escape=9]="Escape",F[F.Space=10]="Space",F[F.PageUp=11]="PageUp",F[F.PageDown=12]="PageDown",F[F.End=13]="End",F[F.Home=14]="Home",F[F.LeftArrow=15]="LeftArrow",F[F.UpArrow=16]="UpArrow",F[F.RightArrow=17]="RightArrow",F[F.DownArrow=18]="DownArrow",F[F.Insert=19]="Insert",F[F.Delete=20]="Delete",F[F.Digit0=21]="Digit0",F[F.Digit1=22]="Digit1",F[F.Digit2=23]="Digit2",F[F.Digit3=24]="Digit3",F[F.Digit4=25]="Digit4",F[F.Digit5=26]="Digit5",F[F.Digit6=27]="Digit6",F[F.Digit7=28]="Digit7",F[F.Digit8=29]="Digit8",F[F.Digit9=30]="Digit9",F[F.KeyA=31]="KeyA",F[F.KeyB=32]="KeyB",F[F.KeyC=33]="KeyC",F[F.KeyD=34]="KeyD",F[F.KeyE=35]="KeyE",F[F.KeyF=36]="KeyF",F[F.KeyG=37]="KeyG",F[F.KeyH=38]="KeyH",F[F.KeyI=39]="KeyI",F[F.KeyJ=40]="KeyJ",F[F.KeyK=41]="KeyK",F[F.KeyL=42]="KeyL",F[F.KeyM=43]="KeyM",F[F.KeyN=44]="KeyN",F[F.KeyO=45]="KeyO",F[F.KeyP=46]="KeyP",F[F.KeyQ=47]="KeyQ",F[F.KeyR=48]="KeyR",F[F.KeyS=49]="KeyS",F[F.KeyT=50]="KeyT",F[F.KeyU=51]="KeyU",F[F.KeyV=52]="KeyV",F[F.KeyW=53]="KeyW",F[F.KeyX=54]="KeyX",F[F.KeyY=55]="KeyY",F[F.KeyZ=56]="KeyZ",F[F.Meta=57]="Meta",F[F.ContextMenu=58]="ContextMenu",F[F.F1=59]="F1",F[F.F2=60]="F2",F[F.F3=61]="F3",F[F.F4=62]="F4",F[F.F5=63]="F5",F[F.F6=64]="F6",F[F.F7=65]="F7",F[F.F8=66]="F8",F[F.F9=67]="F9",F[F.F10=68]="F10",F[F.F11=69]="F11",F[F.F12=70]="F12",F[F.F13=71]="F13",F[F.F14=72]="F14",F[F.F15=73]="F15",F[F.F16=74]="F16",F[F.F17=75]="F17",F[F.F18=76]="F18",F[F.F19=77]="F19",F[F.F20=78]="F20",F[F.F21=79]="F21",F[F.F22=80]="F22",F[F.F23=81]="F23",F[F.F24=82]="F24",F[F.NumLock=83]="NumLock",F[F.ScrollLock=84]="ScrollLock",F[F.Semicolon=85]="Semicolon",F[F.Equal=86]="Equal",F[F.Comma=87]="Comma",F[F.Minus=88]="Minus",F[F.Period=89]="Period",F[F.Slash=90]="Slash",F[F.Backquote=91]="Backquote",F[F.BracketLeft=92]="BracketLeft",F[F.Backslash=93]="Backslash",F[F.BracketRight=94]="BracketRight",F[F.Quote=95]="Quote",F[F.OEM_8=96]="OEM_8",F[F.IntlBackslash=97]="IntlBackslash",F[F.Numpad0=98]="Numpad0",F[F.Numpad1=99]="Numpad1",F[F.Numpad2=100]="Numpad2",F[F.Numpad3=101]="Numpad3",F[F.Numpad4=102]="Numpad4",F[F.Numpad5=103]="Numpad5",F[F.Numpad6=104]="Numpad6",F[F.Numpad7=105]="Numpad7",F[F.Numpad8=106]="Numpad8",F[F.Numpad9=107]="Numpad9",F[F.NumpadMultiply=108]="NumpadMultiply",F[F.NumpadAdd=109]="NumpadAdd",F[F.NUMPAD_SEPARATOR=110]="NUMPAD_SEPARATOR",F[F.NumpadSubtract=111]="NumpadSubtract",F[F.NumpadDecimal=112]="NumpadDecimal",F[F.NumpadDivide=113]="NumpadDivide",F[F.KEY_IN_COMPOSITION=114]="KEY_IN_COMPOSITION",F[F.ABNT_C1=115]="ABNT_C1",F[F.ABNT_C2=116]="ABNT_C2",F[F.AudioVolumeMute=117]="AudioVolumeMute",F[F.AudioVolumeUp=118]="AudioVolumeUp",F[F.AudioVolumeDown=119]="AudioVolumeDown",F[F.BrowserSearch=120]="BrowserSearch",F[F.BrowserHome=121]="BrowserHome",F[F.BrowserBack=122]="BrowserBack",F[F.BrowserForward=123]="BrowserForward",F[F.MediaTrackNext=124]="MediaTrackNext",F[F.MediaTrackPrevious=125]="MediaTrackPrevious",F[F.MediaStop=126]="MediaStop",F[F.MediaPlayPause=127]="MediaPlayPause",F[F.LaunchMediaPlayer=128]="LaunchMediaPlayer",F[F.LaunchMail=129]="LaunchMail",F[F.LaunchApp2=130]="LaunchApp2",F[F.Clear=131]="Clear",F[F.MAX_VALUE=132]="MAX_VALUE"})(l||(e.KeyCode=l={}));var o;(function(F){F[F.Hint=1]="Hint",F[F.Info=2]="Info",F[F.Warning=4]="Warning",F[F.Error=8]="Error"})(o||(e.MarkerSeverity=o={}));var g;(function(F){F[F.Unnecessary=1]="Unnecessary",F[F.Deprecated=2]="Deprecated"})(g||(e.MarkerTag=g={}));var h;(function(F){F[F.Inline=1]="Inline",F[F.Gutter=2]="Gutter"})(h||(e.MinimapPosition=h={}));var m;(function(F){F[F.UNKNOWN=0]="UNKNOWN",F[F.TEXTAREA=1]="TEXTAREA",F[F.GUTTER_GLYPH_MARGIN=2]="GUTTER_GLYPH_MARGIN",F[F.GUTTER_LINE_NUMBERS=3]="GUTTER_LINE_NUMBERS",F[F.GUTTER_LINE_DECORATIONS=4]="GUTTER_LINE_DECORATIONS",F[F.GUTTER_VIEW_ZONE=5]="GUTTER_VIEW_ZONE",F[F.CONTENT_TEXT=6]="CONTENT_TEXT",F[F.CONTENT_EMPTY=7]="CONTENT_EMPTY",F[F.CONTENT_VIEW_ZONE=8]="CONTENT_VIEW_ZONE",F[F.CONTENT_WIDGET=9]="CONTENT_WIDGET",F[F.OVERVIEW_RULER=10]="OVERVIEW_RULER",F[F.SCROLLBAR=11]="SCROLLBAR",F[F.OVERLAY_WIDGET=12]="OVERLAY_WIDGET",F[F.OUTSIDE_EDITOR=13]="OUTSIDE_EDITOR"})(m||(e.MouseTargetType=m={}));var C;(function(F){F[F.TOP_RIGHT_CORNER=0]="TOP_RIGHT_CORNER",F[F.BOTTOM_RIGHT_CORNER=1]="BOTTOM_RIGHT_CORNER",F[F.TOP_CENTER=2]="TOP_CENTER"})(C||(e.OverlayWidgetPositionPreference=C={}));var w;(function(F){F[F.Left=1]="Left",F[F.Center=2]="Center",F[F.Right=4]="Right",F[F.Full=7]="Full"})(w||(e.OverviewRulerLane=w={}));var D;(function(F){F[F.Left=0]="Left",F[F.Right=1]="Right",F[F.None=2]="None",F[F.LeftOfInjectedText=3]="LeftOfInjectedText",F[F.RightOfInjectedText=4]="RightOfInjectedText"})(D||(e.PositionAffinity=D={}));var I;(function(F){F[F.Off=0]="Off",F[F.On=1]="On",F[F.Relative=2]="Relative",F[F.Interval=3]="Interval",F[F.Custom=4]="Custom"})(I||(e.RenderLineNumbersType=I={}));var T;(function(F){F[F.None=0]="None",F[F.Text=1]="Text",F[F.Blocks=2]="Blocks"})(T||(e.RenderMinimap=T={}));var A;(function(F){F[F.Smooth=0]="Smooth",F[F.Immediate=1]="Immediate"})(A||(e.ScrollType=A={}));var P;(function(F){F[F.Auto=1]="Auto",F[F.Hidden=2]="Hidden",F[F.Visible=3]="Visible"})(P||(e.ScrollbarVisibility=P={}));var N;(function(F){F[F.LTR=0]="LTR",F[F.RTL=1]="RTL"})(N||(e.SelectionDirection=N={}));var M;(function(F){F.Off="off",F.OnCode="onCode",F.On="on"})(M||(e.ShowLightbulbIconMode=M={}));var R;(function(F){F[F.Invoke=1]="Invoke",F[F.TriggerCharacter=2]="TriggerCharacter",F[F.ContentChange=3]="ContentChange"})(R||(e.SignatureHelpTriggerKind=R={}));var x;(function(F){F[F.File=0]="File",F[F.Module=1]="Module",F[F.Namespace=2]="Namespace",F[F.Package=3]="Package",F[F.Class=4]="Class",F[F.Method=5]="Method",F[F.Property=6]="Property",F[F.Field=7]="Field",F[F.Constructor=8]="Constructor",F[F.Enum=9]="Enum",F[F.Interface=10]="Interface",F[F.Function=11]="Function",F[F.Variable=12]="Variable",F[F.Constant=13]="Constant",F[F.String=14]="String",F[F.Number=15]="Number",F[F.Boolean=16]="Boolean",F[F.Array=17]="Array",F[F.Object=18]="Object",F[F.Key=19]="Key",F[F.Null=20]="Null",F[F.EnumMember=21]="EnumMember",F[F.Struct=22]="Struct",F[F.Event=23]="Event",F[F.Operator=24]="Operator",F[F.TypeParameter=25]="TypeParameter"})(x||(e.SymbolKind=x={}));var O;(function(F){F[F.Deprecated=1]="Deprecated"})(O||(e.SymbolTag=O={}));var B;(function(F){F[F.Hidden=0]="Hidden",F[F.Blink=1]="Blink",F[F.Smooth=2]="Smooth",F[F.Phase=3]="Phase",F[F.Expand=4]="Expand",F[F.Solid=5]="Solid"})(B||(e.TextEditorCursorBlinkingStyle=B={}));var W;(function(F){F[F.Line=1]="Line",F[F.Block=2]="Block",F[F.Underline=3]="Underline",F[F.LineThin=4]="LineThin",F[F.BlockOutline=5]="BlockOutline",F[F.UnderlineThin=6]="UnderlineThin"})(W||(e.TextEditorCursorStyle=W={}));var V;(function(F){F[F.AlwaysGrowsWhenTypingAtEdges=0]="AlwaysGrowsWhenTypingAtEdges",F[F.NeverGrowsWhenTypingAtEdges=1]="NeverGrowsWhenTypingAtEdges",F[F.GrowsOnlyWhenTypingBefore=2]="GrowsOnlyWhenTypingBefore",F[F.GrowsOnlyWhenTypingAfter=3]="GrowsOnlyWhenTypingAfter"})(V||(e.TrackedRangeStickiness=V={}));var K;(function(F){F[F.None=0]="None",F[F.Same=1]="Same",F[F.Indent=2]="Indent",F[F.DeepIndent=3]="DeepIndent"})(K||(e.WrappingIndent=K={}))}),define(se[528],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketPairWithMinIndentationInfo=e.BracketPairInfo=e.BracketInfo=void 0;class L{constructor(S,p,_,v){this.range=S,this.nestingLevel=p,this.nestingLevelOfEqualBracketType=_,this.isInvalid=v}}e.BracketInfo=L;class k{constructor(S,p,_,v,b,a){this.range=S,this.openingBracketRange=p,this.closingBracketRange=_,this.nestingLevel=v,this.nestingLevelOfEqualBracketType=b,this.bracketPairNode=a}get openingBracketInfo(){return this.bracketPairNode.openingBracket.bracketInfo}}e.BracketPairInfo=k;class y extends k{constructor(S,p,_,v,b,a,i){super(S,p,_,v,b,a),this.minVisibleColumnIndentation=i}}e.BracketPairWithMinIndentationInfo=y}),define(se[529],oe([1,0,6,2,528,182,290,91,289,134,209,13,288]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketPairsTree=void 0;class n extends k.Disposable{didLanguageChange(s){return this.brackets.didLanguageChange(s)}constructor(s,l){if(super(),this.textModel=s,this.getLanguageConfiguration=l,this.didChangeEmitter=new L.Emitter,this.denseKeyProvider=new v.DenseKeyProvider,this.brackets=new S.LanguageAgnosticBracketTokens(this.denseKeyProvider,this.getLanguageConfiguration),this.onDidChange=this.didChangeEmitter.event,this.queuedTextEditsForInitialAstWithoutTokens=[],this.queuedTextEdits=[],s.tokenization.hasTokens)s.tokenization.backgroundTokenizationState===2?(this.initialAstWithoutTokens=void 0,this.astWithTokens=this.parseDocumentFromTextBuffer([],void 0,!1)):(this.initialAstWithoutTokens=this.parseDocumentFromTextBuffer([],void 0,!0),this.astWithTokens=this.initialAstWithoutTokens);else{const o=this.brackets.getSingleLanguageBracketTokens(this.textModel.getLanguageId()),g=new b.FastTokenizer(this.textModel.getValue(),o);this.initialAstWithoutTokens=(0,_.parseDocument)(g,[],void 0,!0),this.astWithTokens=this.initialAstWithoutTokens}}handleDidChangeBackgroundTokenizationState(){if(this.textModel.tokenization.backgroundTokenizationState===2){const s=this.initialAstWithoutTokens===void 0;this.initialAstWithoutTokens=void 0,s||this.didChangeEmitter.fire()}}handleDidChangeTokens({ranges:s}){const l=s.map(o=>new E.TextEditInfo((0,p.toLength)(o.fromLineNumber-1,0),(0,p.toLength)(o.toLineNumber,0),(0,p.toLength)(o.toLineNumber-o.fromLineNumber+1,0)));this.handleEdits(l,!0),this.initialAstWithoutTokens||this.didChangeEmitter.fire()}handleContentChanged(s){const l=E.TextEditInfo.fromModelContentChanges(s.changes);this.handleEdits(l,!1)}handleEdits(s,l){const o=(0,i.combineTextEditInfos)(this.queuedTextEdits,s);this.queuedTextEdits=o,this.initialAstWithoutTokens&&!l&&(this.queuedTextEditsForInitialAstWithoutTokens=(0,i.combineTextEditInfos)(this.queuedTextEditsForInitialAstWithoutTokens,s))}flushQueue(){this.queuedTextEdits.length>0&&(this.astWithTokens=this.parseDocumentFromTextBuffer(this.queuedTextEdits,this.astWithTokens,!1),this.queuedTextEdits=[]),this.queuedTextEditsForInitialAstWithoutTokens.length>0&&(this.initialAstWithoutTokens&&(this.initialAstWithoutTokens=this.parseDocumentFromTextBuffer(this.queuedTextEditsForInitialAstWithoutTokens,this.initialAstWithoutTokens,!1)),this.queuedTextEditsForInitialAstWithoutTokens=[])}parseDocumentFromTextBuffer(s,l,o){const h=l,m=new b.TextBufferTokenizer(this.textModel,this.brackets);return(0,_.parseDocument)(m,s,h,o)}getBracketsInRange(s,l){this.flushQueue();const o=(0,p.toLength)(s.startLineNumber-1,s.startColumn-1),g=(0,p.toLength)(s.endLineNumber-1,s.endColumn-1);return new a.CallbackIterable(h=>{const m=this.initialAstWithoutTokens||this.astWithTokens;u(m,p.lengthZero,m.length,o,g,h,0,0,new Map,l)})}getBracketPairsInRange(s,l){this.flushQueue();const o=(0,p.positionToLength)(s.getStartPosition()),g=(0,p.positionToLength)(s.getEndPosition());return new a.CallbackIterable(h=>{const m=this.initialAstWithoutTokens||this.astWithTokens,C=new f(h,l,this.textModel);c(m,p.lengthZero,m.length,o,g,C,0,new Map)})}getFirstBracketAfter(s){this.flushQueue();const l=this.initialAstWithoutTokens||this.astWithTokens;return r(l,p.lengthZero,l.length,(0,p.positionToLength)(s))}getFirstBracketBefore(s){this.flushQueue();const l=this.initialAstWithoutTokens||this.astWithTokens;return t(l,p.lengthZero,l.length,(0,p.positionToLength)(s))}}e.BracketPairsTree=n;function t(d,s,l,o){if(d.kind===4||d.kind===2){const g=[];for(const h of d.children)l=(0,p.lengthAdd)(s,h.length),g.push({nodeOffsetStart:s,nodeOffsetEnd:l}),s=l;for(let h=g.length-1;h>=0;h--){const{nodeOffsetStart:m,nodeOffsetEnd:C}=g[h];if((0,p.lengthLessThan)(m,o)){const w=t(d.children[h],m,C,o);if(w)return w}}return null}else{if(d.kind===3)return null;if(d.kind===1){const g=(0,p.lengthsToRange)(s,l);return{bracketInfo:d.bracketInfo,range:g}}}return null}function r(d,s,l,o){if(d.kind===4||d.kind===2){for(const g of d.children){if(l=(0,p.lengthAdd)(s,g.length),(0,p.lengthLessThan)(o,l)){const h=r(g,s,l,o);if(h)return h}s=l}return null}else{if(d.kind===3)return null;if(d.kind===1){const g=(0,p.lengthsToRange)(s,l);return{bracketInfo:d.bracketInfo,range:g}}}return null}function u(d,s,l,o,g,h,m,C,w,D,I=!1){if(m>200)return!0;e:for(;;)switch(d.kind){case 4:{const T=d.childrenLength;for(let A=0;A<T;A++){const P=d.getChild(A);if(P){if(l=(0,p.lengthAdd)(s,P.length),(0,p.lengthLessThanEqual)(s,g)&&(0,p.lengthGreaterThanEqual)(l,o)){if((0,p.lengthGreaterThanEqual)(l,g)){d=P;continue e}if(!u(P,s,l,o,g,h,m,0,w,D))return!1}s=l}}return!0}case 2:{const T=!D||!d.closingBracket||d.closingBracket.bracketInfo.closesColorized(d.openingBracket.bracketInfo);let A=0;if(w){let N=w.get(d.openingBracket.text);N===void 0&&(N=0),A=N,T&&(N++,w.set(d.openingBracket.text,N))}const P=d.childrenLength;for(let N=0;N<P;N++){const M=d.getChild(N);if(M){if(l=(0,p.lengthAdd)(s,M.length),(0,p.lengthLessThanEqual)(s,g)&&(0,p.lengthGreaterThanEqual)(l,o)){if((0,p.lengthGreaterThanEqual)(l,g)&&M.kind!==1){d=M,T?(m++,C=A+1):C=A;continue e}if((T||M.kind!==1||!d.closingBracket)&&!u(M,s,l,o,g,h,T?m+1:m,T?A+1:A,w,D,!d.closingBracket))return!1}s=l}}return w?.set(d.openingBracket.text,A),!0}case 3:{const T=(0,p.lengthsToRange)(s,l);return h(new y.BracketInfo(T,m-1,0,!0))}case 1:{const T=(0,p.lengthsToRange)(s,l);return h(new y.BracketInfo(T,m-1,C-1,I))}case 0:return!0}}class f{constructor(s,l,o){this.push=s,this.includeMinIndentation=l,this.textModel=o}}function c(d,s,l,o,g,h,m,C){var w;if(m>200)return!0;let D=!0;if(d.kind===2){let I=0;if(C){let P=C.get(d.openingBracket.text);P===void 0&&(P=0),I=P,P++,C.set(d.openingBracket.text,P)}const T=(0,p.lengthAdd)(s,d.openingBracket.length);let A=-1;if(h.includeMinIndentation&&(A=d.computeMinIndentation(s,h.textModel)),D=h.push(new y.BracketPairWithMinIndentationInfo((0,p.lengthsToRange)(s,l),(0,p.lengthsToRange)(s,T),d.closingBracket?(0,p.lengthsToRange)((0,p.lengthAdd)(T,((w=d.child)===null||w===void 0?void 0:w.length)||p.lengthZero),l):void 0,m,I,d,A)),s=T,D&&d.child){const P=d.child;if(l=(0,p.lengthAdd)(s,P.length),(0,p.lengthLessThanEqual)(s,g)&&(0,p.lengthGreaterThanEqual)(l,o)&&(D=c(P,s,l,o,g,h,m+1,C),!D))return!1}C?.set(d.openingBracket.text,I)}else{let I=s;for(const T of d.children){const A=I;if(I=(0,p.lengthAdd)(I,T.length),(0,p.lengthLessThanEqual)(A,g)&&(0,p.lengthLessThanEqual)(o,I)&&(D=c(T,A,I,o,g,h,m,C),!D))return!1}}return D}}),define(se[114],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InternalModelContentChangeEvent=e.ModelInjectedTextChangedEvent=e.ModelRawContentChangedEvent=e.ModelRawEOLChanged=e.ModelRawLinesInserted=e.ModelRawLinesDeleted=e.ModelRawLineChanged=e.LineInjectedText=e.ModelRawFlush=void 0;class L{constructor(){this.changeType=1}}e.ModelRawFlush=L;class k{static applyInjectedText(i,n){if(!n||n.length===0)return i;let t="",r=0;for(const u of n)t+=i.substring(r,u.column-1),r=u.column-1,t+=u.options.content;return t+=i.substring(r),t}static fromDecorations(i){const n=[];for(const t of i)t.options.before&&t.options.before.content.length>0&&n.push(new k(t.ownerId,t.range.startLineNumber,t.range.startColumn,t.options.before,0)),t.options.after&&t.options.after.content.length>0&&n.push(new k(t.ownerId,t.range.endLineNumber,t.range.endColumn,t.options.after,1));return n.sort((t,r)=>t.lineNumber===r.lineNumber?t.column===r.column?t.order-r.order:t.column-r.column:t.lineNumber-r.lineNumber),n}constructor(i,n,t,r,u){this.ownerId=i,this.lineNumber=n,this.column=t,this.options=r,this.order=u}}e.LineInjectedText=k;class y{constructor(i,n,t){this.changeType=2,this.lineNumber=i,this.detail=n,this.injectedText=t}}e.ModelRawLineChanged=y;class E{constructor(i,n){this.changeType=3,this.fromLineNumber=i,this.toLineNumber=n}}e.ModelRawLinesDeleted=E;class S{constructor(i,n,t,r){this.changeType=4,this.injectedTexts=r,this.fromLineNumber=i,this.toLineNumber=n,this.detail=t}}e.ModelRawLinesInserted=S;class p{constructor(){this.changeType=5}}e.ModelRawEOLChanged=p;class _{constructor(i,n,t,r){this.changes=i,this.versionId=n,this.isUndoing=t,this.isRedoing=r,this.resultingSelection=null}containsEvent(i){for(let n=0,t=this.changes.length;n<t;n++)if(this.changes[n].changeType===i)return!0;return!1}static merge(i,n){const t=[].concat(i.changes).concat(n.changes),r=n.versionId,u=i.isUndoing||n.isUndoing,f=i.isRedoing||n.isRedoing;return new _(t,r,u,f)}}e.ModelRawContentChangedEvent=_;class v{constructor(i){this.changes=i}}e.ModelInjectedTextChangedEvent=v;class b{constructor(i,n){this.rawContentChangedEvent=i,this.contentChangedEvent=n}merge(i){const n=_.merge(this.rawContentChangedEvent,i.rawContentChangedEvent),t=b._mergeChangeEvents(this.contentChangedEvent,i.contentChangedEvent);return new b(n,t)}static _mergeChangeEvents(i,n){const t=[].concat(i.changes).concat(n.changes),r=n.eol,u=n.versionId,f=i.isUndoing||n.isUndoing,c=i.isRedoing||n.isRedoing,d=i.isFlush||n.isFlush,s=i.isEolChange&&n.isEolChange;return{changes:t,eol:r,isEolChange:s,versionId:u,isUndoing:f,isRedoing:c,isFlush:d}}}e.InternalModelContentChangeEvent=b}),define(se[212],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndentGuideHorizontalLine=e.IndentGuide=e.HorizontalGuidesState=void 0;var L;(function(E){E[E.Disabled=0]="Disabled",E[E.EnabledForActive=1]="EnabledForActive",E[E.Enabled=2]="Enabled"})(L||(e.HorizontalGuidesState=L={}));class k{constructor(S,p,_,v,b,a){if(this.visibleColumn=S,this.column=p,this.className=_,this.horizontalLine=v,this.forWrappedLinesAfterColumn=b,this.forWrappedLinesBeforeOrAtColumn=a,S!==-1==(p!==-1))throw new Error}}e.IndentGuide=k;class y{constructor(S,p){this.top=S,this.endColumn=p}}e.IndentGuideHorizontalLine=y}),define(se[297],oe([1,0,60,11,85,5,292,210,212,12]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketPairGuidesClassNames=e.GuidesTextModelPart=void 0;class b extends S.TextModelPart{constructor(n,t){super(),this.textModel=n,this.languageConfigurationService=t}getLanguageConfiguration(n){return this.languageConfigurationService.getLanguageConfiguration(n)}_computeIndentLevel(n){return(0,p.computeIndentLevel)(this.textModel.getLineContent(n+1),this.textModel.getOptions().tabSize)}getActiveIndentGuide(n,t,r){this.assertNotDisposed();const u=this.textModel.getLineCount();if(n<1||n>u)throw new v.BugIndicatingError("Illegal value for lineNumber");const f=this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules,c=!!(f&&f.offSide);let d=-2,s=-1,l=-2,o=-1;const g=R=>{if(d!==-1&&(d===-2||d>R-1)){d=-1,s=-1;for(let x=R-2;x>=0;x--){const O=this._computeIndentLevel(x);if(O>=0){d=x,s=O;break}}}if(l===-2){l=-1,o=-1;for(let x=R;x<u;x++){const O=this._computeIndentLevel(x);if(O>=0){l=x,o=O;break}}}};let h=-2,m=-1,C=-2,w=-1;const D=R=>{if(h===-2){h=-1,m=-1;for(let x=R-2;x>=0;x--){const O=this._computeIndentLevel(x);if(O>=0){h=x,m=O;break}}}if(C!==-1&&(C===-2||C<R-1)){C=-1,w=-1;for(let x=R;x<u;x++){const O=this._computeIndentLevel(x);if(O>=0){C=x,w=O;break}}}};let I=0,T=!0,A=0,P=!0,N=0,M=0;for(let R=0;T||P;R++){const x=n-R,O=n+R;R>1&&(x<1||x<t)&&(T=!1),R>1&&(O>u||O>r)&&(P=!1),R>5e4&&(T=!1,P=!1);let B=-1;if(T&&x>=1){const V=this._computeIndentLevel(x-1);V>=0?(l=x-1,o=V,B=Math.ceil(V/this.textModel.getOptions().indentSize)):(g(x),B=this._getIndentLevelForWhitespaceLine(c,s,o))}let W=-1;if(P&&O<=u){const V=this._computeIndentLevel(O-1);V>=0?(h=O-1,m=V,W=Math.ceil(V/this.textModel.getOptions().indentSize)):(D(O),W=this._getIndentLevelForWhitespaceLine(c,m,w))}if(R===0){M=B;continue}if(R===1){if(O<=u&&W>=0&&M+1===W){T=!1,I=O,A=O,N=W;continue}if(x>=1&&B>=0&&B-1===M){P=!1,I=x,A=x,N=B;continue}if(I=n,A=n,N=M,N===0)return{startLineNumber:I,endLineNumber:A,indent:N}}T&&(B>=N?I=x:T=!1),P&&(W>=N?A=O:P=!1)}return{startLineNumber:I,endLineNumber:A,indent:N}}getLinesBracketGuides(n,t,r,u){var f;const c=[];for(let h=n;h<=t;h++)c.push([]);const d=!0,s=this.textModel.bracketPairs.getBracketPairsInRangeWithMinIndentation(new E.Range(n,1,t,this.textModel.getLineMaxColumn(t))).toArray();let l;if(r&&s.length>0){const h=(n<=r.lineNumber&&r.lineNumber<=t?s:this.textModel.bracketPairs.getBracketPairsInRange(E.Range.fromPositions(r)).toArray()).filter(m=>E.Range.strictContainsPosition(m.range,r));l=(f=(0,L.findLast)(h,m=>d||m.range.startLineNumber!==m.range.endLineNumber))===null||f===void 0?void 0:f.range}const o=this.textModel.getOptions().bracketPairColorizationOptions.independentColorPoolPerBracketType,g=new a;for(const h of s){if(!h.closingBracketRange)continue;const m=l&&h.range.equalsRange(l);if(!m&&!u.includeInactive)continue;const C=g.getInlineClassName(h.nestingLevel,h.nestingLevelOfEqualBracketType,o)+(u.highlightActive&&m?" "+g.activeClassName:""),w=h.openingBracketRange.getStartPosition(),D=h.closingBracketRange.getStartPosition(),I=u.horizontalGuides===_.HorizontalGuidesState.Enabled||u.horizontalGuides===_.HorizontalGuidesState.EnabledForActive&&m;if(h.range.startLineNumber===h.range.endLineNumber){d&&I&&c[h.range.startLineNumber-n].push(new _.IndentGuide(-1,h.openingBracketRange.getEndPosition().column,C,new _.IndentGuideHorizontalLine(!1,D.column),-1,-1));continue}const T=this.getVisibleColumnFromPosition(D),A=this.getVisibleColumnFromPosition(h.openingBracketRange.getStartPosition()),P=Math.min(A,T,h.minVisibleColumnIndentation+1);let N=!1;k.firstNonWhitespaceIndex(this.textModel.getLineContent(h.closingBracketRange.startLineNumber))<h.closingBracketRange.startColumn-1&&(N=!0);const x=Math.max(w.lineNumber,n),O=Math.min(D.lineNumber,t),B=N?1:0;for(let W=x;W<O+B;W++)c[W-n].push(new _.IndentGuide(P,-1,C,null,W===w.lineNumber?w.column:-1,W===D.lineNumber?D.column:-1));I&&(w.lineNumber>=n&&A>P&&c[w.lineNumber-n].push(new _.IndentGuide(P,-1,C,new _.IndentGuideHorizontalLine(!1,w.column),-1,-1)),D.lineNumber<=t&&T>P&&c[D.lineNumber-n].push(new _.IndentGuide(P,-1,C,new _.IndentGuideHorizontalLine(!N,D.column),-1,-1)))}for(const h of c)h.sort((m,C)=>m.visibleColumn-C.visibleColumn);return c}getVisibleColumnFromPosition(n){return y.CursorColumns.visibleColumnFromColumn(this.textModel.getLineContent(n.lineNumber),n.column,this.textModel.getOptions().tabSize)+1}getLinesIndentGuides(n,t){this.assertNotDisposed();const r=this.textModel.getLineCount();if(n<1||n>r)throw new Error("Illegal value for startLineNumber");if(t<1||t>r)throw new Error("Illegal value for endLineNumber");const u=this.textModel.getOptions(),f=this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules,c=!!(f&&f.offSide),d=new Array(t-n+1);let s=-2,l=-1,o=-2,g=-1;for(let h=n;h<=t;h++){const m=h-n,C=this._computeIndentLevel(h-1);if(C>=0){s=h-1,l=C,d[m]=Math.ceil(C/u.indentSize);continue}if(s===-2){s=-1,l=-1;for(let w=h-2;w>=0;w--){const D=this._computeIndentLevel(w);if(D>=0){s=w,l=D;break}}}if(o!==-1&&(o===-2||o<h-1)){o=-1,g=-1;for(let w=h;w<r;w++){const D=this._computeIndentLevel(w);if(D>=0){o=w,g=D;break}}}d[m]=this._getIndentLevelForWhitespaceLine(c,l,g)}return d}_getIndentLevelForWhitespaceLine(n,t,r){const u=this.textModel.getOptions();return t===-1||r===-1?0:t<r?1+Math.floor(t/u.indentSize):t===r||n?Math.ceil(r/u.indentSize):1+Math.floor(r/u.indentSize)}}e.GuidesTextModelPart=b;class a{constructor(){this.activeClassName="indent-active"}getInlineClassName(n,t,r){return this.getInlineClassNameOfLevel(r?t:n)}getInlineClassNameOfLevel(n){return`bracket-indent-guide lvl-${n%30}`}}e.BracketPairGuidesClassNames=a}),define(se[530],oe([1,0,6,2]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TokenizationRegistry=void 0;class y{constructor(){this._tokenizationSupports=new Map,this._factories=new Map,this._onDidChange=new L.Emitter,this.onDidChange=this._onDidChange.event,this._colorMap=null}handleChange(p){this._onDidChange.fire({changedLanguages:p,changedColorMap:!1})}register(p,_){return this._tokenizationSupports.set(p,_),this.handleChange([p]),(0,k.toDisposable)(()=>{this._tokenizationSupports.get(p)===_&&(this._tokenizationSupports.delete(p),this.handleChange([p]))})}get(p){return this._tokenizationSupports.get(p)||null}registerFactory(p,_){var v;(v=this._factories.get(p))===null||v===void 0||v.dispose();const b=new E(this,p,_);return this._factories.set(p,b),(0,k.toDisposable)(()=>{const a=this._factories.get(p);!a||a!==b||(this._factories.delete(p),a.dispose())})}async getOrCreate(p){const _=this.get(p);if(_)return _;const v=this._factories.get(p);return!v||v.isResolved?null:(await v.resolve(),this.get(p))}isResolved(p){if(this.get(p))return!0;const v=this._factories.get(p);return!!(!v||v.isResolved)}setColorMap(p){this._colorMap=p,this._onDidChange.fire({changedLanguages:Array.from(this._tokenizationSupports.keys()),changedColorMap:!0})}getColorMap(){return this._colorMap}getDefaultBackground(){return this._colorMap&&this._colorMap.length>2?this._colorMap[2]:null}}e.TokenizationRegistry=y;class E extends k.Disposable{get isResolved(){return this._isResolved}constructor(p,_,v){super(),this._registry=p,this._languageId=_,this._factory=v,this._isDisposed=!1,this._resolvePromise=null,this._isResolved=!1}dispose(){this._isDisposed=!0,super.dispose()}async resolve(){return this._resolvePromise||(this._resolvePromise=this._create()),this._resolvePromise}async _create(){const p=await this._factory.tokenizationSupport;this._isResolved=!0,p&&!this._isDisposed&&this._register(this._registry.register(this._languageId,p))}}}),define(se[531],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContiguousMultilineTokens=void 0;class L{get startLineNumber(){return this._startLineNumber}get endLineNumber(){return this._startLineNumber+this._tokens.length-1}constructor(y,E){this._startLineNumber=y,this._tokens=E}getLineTokens(y){return this._tokens[y-this._startLineNumber]}appendLineTokens(y){this._tokens.push(y)}}e.ContiguousMultilineTokens=L}),define(se[298],oe([1,0,531]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContiguousMultilineTokensBuilder=void 0;class k{constructor(){this._tokens=[]}add(E,S){if(this._tokens.length>0){const p=this._tokens[this._tokens.length-1];if(p.endLineNumber+1===E){p.appendLineTokens(S);return}}this._tokens.push(new L.ContiguousMultilineTokens(E,[S]))}finalize(){return this._tokens}}e.ContiguousMultilineTokensBuilder=k}),define(se[94],oe([1,0,132]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineTokens=void 0;class k{static createEmpty(S,p){const _=k.defaultTokenMetadata,v=new Uint32Array(2);return v[0]=S.length,v[1]=_,new k(v,S,p)}constructor(S,p,_){this._lineTokensBrand=void 0,this._tokens=S,this._tokensCount=this._tokens.length>>>1,this._text=p,this._languageIdCodec=_}equals(S){return S instanceof k?this.slicedEquals(S,0,this._tokensCount):!1}slicedEquals(S,p,_){if(this._text!==S._text||this._tokensCount!==S._tokensCount)return!1;const v=p<<1,b=v+(_<<1);for(let a=v;a<b;a++)if(this._tokens[a]!==S._tokens[a])return!1;return!0}getLineContent(){return this._text}getCount(){return this._tokensCount}getStartOffset(S){return S>0?this._tokens[S-1<<1]:0}getMetadata(S){return this._tokens[(S<<1)+1]}getLanguageId(S){const p=this._tokens[(S<<1)+1],_=L.TokenMetadata.getLanguageId(p);return this._languageIdCodec.decodeLanguageId(_)}getStandardTokenType(S){const p=this._tokens[(S<<1)+1];return L.TokenMetadata.getTokenType(p)}getForeground(S){const p=this._tokens[(S<<1)+1];return L.TokenMetadata.getForeground(p)}getClassName(S){const p=this._tokens[(S<<1)+1];return L.TokenMetadata.getClassNameFromMetadata(p)}getInlineStyle(S,p){const _=this._tokens[(S<<1)+1];return L.TokenMetadata.getInlineStyleFromMetadata(_,p)}getPresentation(S){const p=this._tokens[(S<<1)+1];return L.TokenMetadata.getPresentationFromMetadata(p)}getEndOffset(S){return this._tokens[S<<1]}findTokenIndexAtOffset(S){return k.findIndexInTokensArray(this._tokens,S)}inflate(){return this}sliceAndInflate(S,p,_){return new y(this,S,p,_)}static convertToEndOffset(S,p){const v=(S.length>>>1)-1;for(let b=0;b<v;b++)S[b<<1]=S[b+1<<1];S[v<<1]=p}static findIndexInTokensArray(S,p){if(S.length<=2)return 0;let _=0,v=(S.length>>>1)-1;for(;_<v;){const b=_+Math.floor((v-_)/2),a=S[b<<1];if(a===p)return b+1;a<p?_=b+1:a>p&&(v=b)}return _}withInserted(S){if(S.length===0)return this;let p=0,_=0,v="";const b=new Array;let a=0;for(;;){const i=p<this._tokensCount?this._tokens[p<<1]:-1,n=_<S.length?S[_]:null;if(i!==-1&&(n===null||i<=n.offset)){v+=this._text.substring(a,i);const t=this._tokens[(p<<1)+1];b.push(v.length,t),p++,a=i}else if(n){if(n.offset>a){v+=this._text.substring(a,n.offset);const t=this._tokens[(p<<1)+1];b.push(v.length,t),a=n.offset}v+=n.text,b.push(v.length,n.tokenMetadata),_++}else break}return new k(new Uint32Array(b),v,this._languageIdCodec)}}e.LineTokens=k,k.defaultTokenMetadata=(0<<11|1<<15|2<<24)>>>0;class y{constructor(S,p,_,v){this._source=S,this._startOffset=p,this._endOffset=_,this._deltaOffset=v,this._firstTokenIndex=S.findTokenIndexAtOffset(p),this._tokensCount=0;for(let b=this._firstTokenIndex,a=S.getCount();b<a&&!(S.getStartOffset(b)>=_);b++)this._tokensCount++}getMetadata(S){return this._source.getMetadata(this._firstTokenIndex+S)}getLanguageId(S){return this._source.getLanguageId(this._firstTokenIndex+S)}getLineContent(){return this._source.getLineContent().substring(this._startOffset,this._endOffset)}equals(S){return S instanceof y?this._startOffset===S._startOffset&&this._endOffset===S._endOffset&&this._deltaOffset===S._deltaOffset&&this._source.slicedEquals(S._source,this._firstTokenIndex,this._tokensCount):!1}getCount(){return this._tokensCount}getForeground(S){return this._source.getForeground(this._firstTokenIndex+S)}getEndOffset(S){const p=this._source.getEndOffset(this._firstTokenIndex+S);return Math.min(this._endOffset,p)-this._startOffset+this._deltaOffset}getClassName(S){return this._source.getClassName(this._firstTokenIndex+S)}getInlineStyle(S,p){return this._source.getInlineStyle(this._firstTokenIndex+S,p)}getPresentation(S){return this._source.getPresentation(this._firstTokenIndex+S)}findTokenIndexAtOffset(S){return this._source.findTokenIndexAtOffset(S+this._startOffset-this._deltaOffset)-this._firstTokenIndex}}}),define(se[532],oe([1,0,94]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toUint32Array=e.ContiguousTokensEditing=e.EMPTY_LINE_TOKENS=void 0,e.EMPTY_LINE_TOKENS=new Uint32Array(0).buffer;class k{static deleteBeginning(S,p){return S===null||S===e.EMPTY_LINE_TOKENS?S:k.delete(S,0,p)}static deleteEnding(S,p){if(S===null||S===e.EMPTY_LINE_TOKENS)return S;const _=y(S),v=_[_.length-2];return k.delete(S,p,v)}static delete(S,p,_){if(S===null||S===e.EMPTY_LINE_TOKENS||p===_)return S;const v=y(S),b=v.length>>>1;if(p===0&&v[v.length-2]===_)return e.EMPTY_LINE_TOKENS;const a=L.LineTokens.findIndexInTokensArray(v,p),i=a>0?v[a-1<<1]:0,n=v[a<<1];if(_<n){const c=_-p;for(let d=a;d<b;d++)v[d<<1]-=c;return S}let t,r;i!==p?(v[a<<1]=p,t=a+1<<1,r=p):(t=a<<1,r=i);const u=_-p;for(let c=a+1;c<b;c++){const d=v[c<<1]-u;d>r&&(v[t++]=d,v[t++]=v[(c<<1)+1],r=d)}if(t===v.length)return S;const f=new Uint32Array(t);return f.set(v.subarray(0,t),0),f.buffer}static append(S,p){if(p===e.EMPTY_LINE_TOKENS)return S;if(S===e.EMPTY_LINE_TOKENS)return p;if(S===null)return S;if(p===null)return null;const _=y(S),v=y(p),b=v.length>>>1,a=new Uint32Array(_.length+v.length);a.set(_,0);let i=_.length;const n=_[_.length-2];for(let t=0;t<b;t++)a[i++]=v[t<<1]+n,a[i++]=v[(t<<1)+1];return a.buffer}static insert(S,p,_){if(S===null||S===e.EMPTY_LINE_TOKENS)return S;const v=y(S),b=v.length>>>1;let a=L.LineTokens.findIndexInTokensArray(v,p);a>0&&v[a-1<<1]===p&&a--;for(let i=a;i<b;i++)v[i<<1]+=_;return S}}e.ContiguousTokensEditing=k;function y(E){return E instanceof Uint32Array?E:new Uint32Array(E)}e.toUint32Array=y}),define(se[533],oe([1,0,13,10,532,94,132]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContiguousTokensStore=void 0;class p{constructor(b){this._lineTokens=[],this._len=0,this._languageIdCodec=b}flush(){this._lineTokens=[],this._len=0}get hasTokens(){return this._lineTokens.length>0}getTokens(b,a,i){let n=null;if(a<this._len&&(n=this._lineTokens[a]),n!==null&&n!==y.EMPTY_LINE_TOKENS)return new E.LineTokens((0,y.toUint32Array)(n),i,this._languageIdCodec);const t=new Uint32Array(2);return t[0]=i.length,t[1]=_(this._languageIdCodec.encodeLanguageId(b)),new E.LineTokens(t,i,this._languageIdCodec)}static _massageTokens(b,a,i){const n=i?(0,y.toUint32Array)(i):null;if(a===0){let t=!1;if(n&&n.length>1&&(t=S.TokenMetadata.getLanguageId(n[1])!==b),!t)return y.EMPTY_LINE_TOKENS}if(!n||n.length===0){const t=new Uint32Array(2);return t[0]=a,t[1]=_(b),t.buffer}return n[n.length-2]=a,n.byteOffset===0&&n.byteLength===n.buffer.byteLength?n.buffer:n}_ensureLine(b){for(;b>=this._len;)this._lineTokens[this._len]=null,this._len++}_deleteLines(b,a){a!==0&&(b+a>this._len&&(a=this._len-b),this._lineTokens.splice(b,a),this._len-=a)}_insertLines(b,a){if(a===0)return;const i=[];for(let n=0;n<a;n++)i[n]=null;this._lineTokens=L.arrayInsert(this._lineTokens,b,i),this._len+=a}setTokens(b,a,i,n,t){const r=p._massageTokens(this._languageIdCodec.encodeLanguageId(b),i,n);this._ensureLine(a);const u=this._lineTokens[a];return this._lineTokens[a]=r,t?!p._equals(u,r):!1}static _equals(b,a){if(!b||!a)return!b&&!a;const i=(0,y.toUint32Array)(b),n=(0,y.toUint32Array)(a);if(i.length!==n.length)return!1;for(let t=0,r=i.length;t<r;t++)if(i[t]!==n[t])return!1;return!0}acceptEdit(b,a,i){this._acceptDeleteRange(b),this._acceptInsertText(new k.Position(b.startLineNumber,b.startColumn),a,i)}_acceptDeleteRange(b){const a=b.startLineNumber-1;if(a>=this._len)return;if(b.startLineNumber===b.endLineNumber){if(b.startColumn===b.endColumn)return;this._lineTokens[a]=y.ContiguousTokensEditing.delete(this._lineTokens[a],b.startColumn-1,b.endColumn-1);return}this._lineTokens[a]=y.ContiguousTokensEditing.deleteEnding(this._lineTokens[a],b.startColumn-1);const i=b.endLineNumber-1;let n=null;i<this._len&&(n=y.ContiguousTokensEditing.deleteBeginning(this._lineTokens[i],b.endColumn-1)),this._lineTokens[a]=y.ContiguousTokensEditing.append(this._lineTokens[a],n),this._deleteLines(b.startLineNumber,b.endLineNumber-b.startLineNumber)}_acceptInsertText(b,a,i){if(a===0&&i===0)return;const n=b.lineNumber-1;if(!(n>=this._len)){if(a===0){this._lineTokens[n]=y.ContiguousTokensEditing.insert(this._lineTokens[n],b.column-1,i);return}this._lineTokens[n]=y.ContiguousTokensEditing.deleteEnding(this._lineTokens[n],b.column-1),this._lineTokens[n]=y.ContiguousTokensEditing.insert(this._lineTokens[n],b.column-1,i),this._insertLines(b.lineNumber,a)}}setMultilineTokens(b,a){if(b.length===0)return{changes:[]};const i=[];for(let n=0,t=b.length;n<t;n++){const r=b[n];let u=0,f=0,c=!1;for(let d=r.startLineNumber;d<=r.endLineNumber;d++)c?(this.setTokens(a.getLanguageId(),d-1,a.getLineLength(d),r.getLineTokens(d),!1),f=d):this.setTokens(a.getLanguageId(),d-1,a.getLineLength(d),r.getLineTokens(d),!0)&&(c=!0,u=d,f=d);c&&i.push({fromLineNumber:u,toLineNumber:f})}return{changes:i}}}e.ContiguousTokensStore=p;function _(v){return(v<<0|0<<8|0<<11|1<<15|2<<24|1024)>>>0}}),define(se[534],oe([1,0,10,5,129]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SparseLineTokens=e.SparseMultilineTokens=void 0;class E{static create(v,b){return new E(v,new S(b))}get startLineNumber(){return this._startLineNumber}get endLineNumber(){return this._endLineNumber}constructor(v,b){this._startLineNumber=v,this._tokens=b,this._endLineNumber=this._startLineNumber+this._tokens.getMaxDeltaLine()}toString(){return this._tokens.toString(this._startLineNumber)}_updateEndLineNumber(){this._endLineNumber=this._startLineNumber+this._tokens.getMaxDeltaLine()}isEmpty(){return this._tokens.isEmpty()}getLineTokens(v){return this._startLineNumber<=v&&v<=this._endLineNumber?this._tokens.getLineTokens(v-this._startLineNumber):null}getRange(){const v=this._tokens.getRange();return v&&new k.Range(this._startLineNumber+v.startLineNumber,v.startColumn,this._startLineNumber+v.endLineNumber,v.endColumn)}removeTokens(v){const b=v.startLineNumber-this._startLineNumber,a=v.endLineNumber-this._startLineNumber;this._startLineNumber+=this._tokens.removeTokens(b,v.startColumn-1,a,v.endColumn-1),this._updateEndLineNumber()}split(v){const b=v.startLineNumber-this._startLineNumber,a=v.endLineNumber-this._startLineNumber,[i,n,t]=this._tokens.split(b,v.startColumn-1,a,v.endColumn-1);return[new E(this._startLineNumber,i),new E(this._startLineNumber+t,n)]}applyEdit(v,b){const[a,i,n]=(0,y.countEOL)(b);this.acceptEdit(v,a,i,n,b.length>0?b.charCodeAt(0):0)}acceptEdit(v,b,a,i,n){this._acceptDeleteRange(v),this._acceptInsertText(new L.Position(v.startLineNumber,v.startColumn),b,a,i,n),this._updateEndLineNumber()}_acceptDeleteRange(v){if(v.startLineNumber===v.endLineNumber&&v.startColumn===v.endColumn)return;const b=v.startLineNumber-this._startLineNumber,a=v.endLineNumber-this._startLineNumber;if(a<0){const n=a-b;this._startLineNumber-=n;return}const i=this._tokens.getMaxDeltaLine();if(!(b>=i+1)){if(b<0&&a>=i+1){this._startLineNumber=0,this._tokens.clear();return}if(b<0){const n=-b;this._startLineNumber-=n,this._tokens.acceptDeleteRange(v.startColumn-1,0,0,a,v.endColumn-1)}else this._tokens.acceptDeleteRange(0,b,v.startColumn-1,a,v.endColumn-1)}}_acceptInsertText(v,b,a,i,n){if(b===0&&a===0)return;const t=v.lineNumber-this._startLineNumber;if(t<0){this._startLineNumber+=b;return}const r=this._tokens.getMaxDeltaLine();t>=r+1||this._tokens.acceptInsertText(t,v.column-1,b,a,i,n)}}e.SparseMultilineTokens=E;class S{constructor(v){this._tokens=v,this._tokenCount=v.length/4}toString(v){const b=[];for(let a=0;a<this._tokenCount;a++)b.push(`(${this._getDeltaLine(a)+v},${this._getStartCharacter(a)}-${this._getEndCharacter(a)})`);return`[${b.join(",")}]`}getMaxDeltaLine(){const v=this._getTokenCount();return v===0?-1:this._getDeltaLine(v-1)}getRange(){const v=this._getTokenCount();if(v===0)return null;const b=this._getStartCharacter(0),a=this._getDeltaLine(v-1),i=this._getEndCharacter(v-1);return new k.Range(0,b+1,a,i+1)}_getTokenCount(){return this._tokenCount}_getDeltaLine(v){return this._tokens[4*v]}_getStartCharacter(v){return this._tokens[4*v+1]}_getEndCharacter(v){return this._tokens[4*v+2]}isEmpty(){return this._getTokenCount()===0}getLineTokens(v){let b=0,a=this._getTokenCount()-1;for(;b<a;){const i=b+Math.floor((a-b)/2),n=this._getDeltaLine(i);if(n<v)b=i+1;else if(n>v)a=i-1;else{let t=i;for(;t>b&&this._getDeltaLine(t-1)===v;)t--;let r=i;for(;r<a&&this._getDeltaLine(r+1)===v;)r++;return new p(this._tokens.subarray(4*t,4*r+4))}}return this._getDeltaLine(b)===v?new p(this._tokens.subarray(4*b,4*b+4)):null}clear(){this._tokenCount=0}removeTokens(v,b,a,i){const n=this._tokens,t=this._tokenCount;let r=0,u=!1,f=0;for(let c=0;c<t;c++){const d=4*c,s=n[d],l=n[d+1],o=n[d+2],g=n[d+3];if((s>v||s===v&&o>=b)&&(s<a||s===a&&l<=i))u=!0;else{if(r===0&&(f=s),u){const h=4*r;n[h]=s-f,n[h+1]=l,n[h+2]=o,n[h+3]=g}r++}}return this._tokenCount=r,f}split(v,b,a,i){const n=this._tokens,t=this._tokenCount,r=[],u=[];let f=r,c=0,d=0;for(let s=0;s<t;s++){const l=4*s,o=n[l],g=n[l+1],h=n[l+2],m=n[l+3];if(o>v||o===v&&h>=b){if(o<a||o===a&&g<=i)continue;f!==u&&(f=u,c=0,d=o)}f[c++]=o-d,f[c++]=g,f[c++]=h,f[c++]=m}return[new S(new Uint32Array(r)),new S(new Uint32Array(u)),d]}acceptDeleteRange(v,b,a,i,n){const t=this._tokens,r=this._tokenCount,u=i-b;let f=0,c=!1;for(let d=0;d<r;d++){const s=4*d;let l=t[s],o=t[s+1],g=t[s+2];const h=t[s+3];if(l<b||l===b&&g<=a){f++;continue}else if(l===b&&o<a)l===i&&g>n?g-=n-a:g=a;else if(l===b&&o===a)if(l===i&&g>n)g-=n-a;else{c=!0;continue}else if(l<i||l===i&&o<n)if(l===i&&g>n)l=b,o=a,g=o+(g-n);else{c=!0;continue}else if(l>i){if(u===0&&!c){f=r;break}l-=u}else if(l===i&&o>=n)v&&l===0&&(o+=v,g+=v),l-=u,o-=n-a,g-=n-a;else throw new Error("Not possible!");const m=4*f;t[m]=l,t[m+1]=o,t[m+2]=g,t[m+3]=h,f++}this._tokenCount=f}acceptInsertText(v,b,a,i,n,t){const r=a===0&&i===1&&(t>=48&&t<=57||t>=65&&t<=90||t>=97&&t<=122),u=this._tokens,f=this._tokenCount;for(let c=0;c<f;c++){const d=4*c;let s=u[d],l=u[d+1],o=u[d+2];if(!(s<v||s===v&&o<b)){if(s===v&&o===b)if(r)o+=1;else continue;else if(s===v&&l<b&&b<o)a===0?o+=i:o=b;else{if(s===v&&l===b&&r)continue;if(s===v)if(s+=a,a===0)l+=i,o+=i;else{const g=o-l;l=n+(l-b),o=l+g}else s+=a}u[d]=s,u[d+1]=l,u[d+2]=o}}}}class p{constructor(v){this._tokens=v}getCount(){return this._tokens.length/4}getStartCharacter(v){return this._tokens[4*v+1]}getEndCharacter(v){return this._tokens[4*v+2]}getMetadata(v){return this._tokens[4*v+3]}}e.SparseLineTokens=p}),define(se[535],oe([1,0,13,94]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SparseTokensStore=void 0;class y{constructor(S){this._pieces=[],this._isComplete=!1,this._languageIdCodec=S}flush(){this._pieces=[],this._isComplete=!1}isEmpty(){return this._pieces.length===0}set(S,p){this._pieces=S||[],this._isComplete=p}setPartial(S,p){let _=S;if(p.length>0){const b=p[0].getRange(),a=p[p.length-1].getRange();if(!b||!a)return S;_=S.plusRange(b).plusRange(a)}let v=null;for(let b=0,a=this._pieces.length;b<a;b++){const i=this._pieces[b];if(i.endLineNumber<_.startLineNumber)continue;if(i.startLineNumber>_.endLineNumber){v=v||{index:b};break}if(i.removeTokens(_),i.isEmpty()){this._pieces.splice(b,1),b--,a--;continue}if(i.endLineNumber<_.startLineNumber)continue;if(i.startLineNumber>_.endLineNumber){v=v||{index:b};continue}const[n,t]=i.split(_);if(n.isEmpty()){v=v||{index:b};continue}t.isEmpty()||(this._pieces.splice(b,1,n,t),b++,a++,v=v||{index:b})}return v=v||{index:this._pieces.length},p.length>0&&(this._pieces=L.arrayInsert(this._pieces,v.index,p)),_}isComplete(){return this._isComplete}addSparseTokens(S,p){if(p.getLineContent().length===0)return p;const _=this._pieces;if(_.length===0)return p;const v=y._findFirstPieceWithLine(_,S),b=_[v].getLineTokens(S);if(!b)return p;const a=p.getCount(),i=b.getCount();let n=0;const t=[];let r=0,u=0;const f=(c,d)=>{c!==u&&(u=c,t[r++]=c,t[r++]=d)};for(let c=0;c<i;c++){const d=b.getStartCharacter(c),s=b.getEndCharacter(c),l=b.getMetadata(c),o=((l&1?2048:0)|(l&2?4096:0)|(l&4?8192:0)|(l&8?16384:0)|(l&16?16744448:0)|(l&32?4278190080:0))>>>0,g=~o>>>0;for(;n<a&&p.getEndOffset(n)<=d;)f(p.getEndOffset(n),p.getMetadata(n)),n++;for(n<a&&p.getStartOffset(n)<d&&f(d,p.getMetadata(n));n<a&&p.getEndOffset(n)<s;)f(p.getEndOffset(n),p.getMetadata(n)&g|l&o),n++;if(n<a)f(s,p.getMetadata(n)&g|l&o),p.getEndOffset(n)===s&&n++;else{const h=Math.min(Math.max(0,n-1),a-1);f(s,p.getMetadata(h)&g|l&o)}}for(;n<a;)f(p.getEndOffset(n),p.getMetadata(n)),n++;return new k.LineTokens(new Uint32Array(t),p.getLineContent(),this._languageIdCodec)}static _findFirstPieceWithLine(S,p){let _=0,v=S.length-1;for(;_<v;){let b=_+Math.floor((v-_)/2);if(S[b].endLineNumber<p)_=b+1;else if(S[b].startLineNumber>p)v=b-1;else{for(;b>_&&S[b-1].startLineNumber<=p&&p<=S[b-1].endLineNumber;)b--;return b}}return _}acceptEdit(S,p,_,v,b){for(const a of this._pieces)a.acceptEdit(S,p,_,v,b)}}e.SparseTokensStore=y}),define(se[154],oe([1,0,2]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewEventHandler=void 0;class k extends L.Disposable{constructor(){super(),this._shouldRender=!0}shouldRender(){return this._shouldRender}forceShouldRender(){this._shouldRender=!0}setShouldRender(){this._shouldRender=!0}onDidRender(){this._shouldRender=!1}onCompositionStart(E){return!1}onCompositionEnd(E){return!1}onConfigurationChanged(E){return!1}onCursorStateChanged(E){return!1}onDecorationsChanged(E){return!1}onFlushed(E){return!1}onFocusChanged(E){return!1}onLanguageConfigurationChanged(E){return!1}onLineMappingChanged(E){return!1}onLinesChanged(E){return!1}onLinesDeleted(E){return!1}onLinesInserted(E){return!1}onRevealRangeRequest(E){return!1}onScrollChanged(E){return!1}onThemeChanged(E){return!1}onTokensChanged(E){return!1}onTokensColorsChanged(E){return!1}onZonesChanged(E){return!1}handleEvents(E){let S=!1;for(let p=0,_=E.length;p<_;p++){const v=E[p];switch(v.type){case 0:this.onCompositionStart(v)&&(S=!0);break;case 1:this.onCompositionEnd(v)&&(S=!0);break;case 2:this.onConfigurationChanged(v)&&(S=!0);break;case 3:this.onCursorStateChanged(v)&&(S=!0);break;case 4:this.onDecorationsChanged(v)&&(S=!0);break;case 5:this.onFlushed(v)&&(S=!0);break;case 6:this.onFocusChanged(v)&&(S=!0);break;case 7:this.onLanguageConfigurationChanged(v)&&(S=!0);break;case 8:this.onLineMappingChanged(v)&&(S=!0);break;case 9:this.onLinesChanged(v)&&(S=!0);break;case 10:this.onLinesDeleted(v)&&(S=!0);break;case 11:this.onLinesInserted(v)&&(S=!0);break;case 12:this.onRevealRangeRequest(v)&&(S=!0);break;case 13:this.onScrollChanged(v)&&(S=!0);break;case 15:this.onTokensChanged(v)&&(S=!0);break;case 14:this.onThemeChanged(v)&&(S=!0);break;case 16:this.onTokensColorsChanged(v)&&(S=!0);break;case 17:this.onZonesChanged(v)&&(S=!0);break;default:console.info("View received unknown event: "),console.info(v)}}S&&(this._shouldRender=!0)}}e.ViewEventHandler=k}),define(se[115],oe([1,0,154]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DynamicViewOverlay=void 0;class k extends L.ViewEventHandler{}e.DynamicViewOverlay=k}),define(se[56],oe([1,0,154]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PartFingerprints=e.ViewPart=void 0;class k extends L.ViewEventHandler{constructor(S){super(),this._context=S,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}}e.ViewPart=k;class y{static write(S,p){S.setAttribute("data-mprt",String(p))}static read(S){const p=S.getAttribute("data-mprt");return p===null?0:parseInt(p,10)}static collect(S,p){const _=[];let v=0;for(;S&&S!==S.ownerDocument.body&&S!==p;)S.nodeType===S.ELEMENT_NODE&&(_[v++]=this.read(S)),S=S.parentElement;const b=new Uint8Array(v);for(let a=0;a<v;a++)b[a]=_[v-a-1];return b}}e.PartFingerprints=y}),define(se[536],oe([1,0,40,56,430]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BlockDecorations=void 0;class y extends k.ViewPart{constructor(S){super(S),this.blocks=[],this.contentWidth=-1,this.contentLeft=0,this.domNode=(0,L.createFastDomNode)(document.createElement("div")),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this.domNode.setClassName("blockDecorations-container"),this.update()}update(){let S=!1;const _=this._context.configuration.options.get(143),v=_.contentWidth-_.verticalScrollbarWidth;this.contentWidth!==v&&(this.contentWidth=v,S=!0);const b=_.contentLeft;return this.contentLeft!==b&&(this.contentLeft=b,S=!0),S}dispose(){super.dispose()}onConfigurationChanged(S){return this.update()}onScrollChanged(S){return S.scrollTopChanged||S.scrollLeftChanged}onDecorationsChanged(S){return!0}onZonesChanged(S){return!0}prepareRender(S){}render(S){var p;let _=0;const v=S.getDecorationsInViewport();for(const b of v){if(!b.options.blockClassName)continue;let a=this.blocks[_];a||(a=this.blocks[_]=(0,L.createFastDomNode)(document.createElement("div")),this.domNode.appendChild(a));let i,n;b.options.blockIsAfterEnd?(i=S.getVerticalOffsetAfterLineNumber(b.range.endLineNumber,!1),n=S.getVerticalOffsetAfterLineNumber(b.range.endLineNumber,!0)):(i=S.getVerticalOffsetForLineNumber(b.range.startLineNumber,!0),n=b.range.isEmpty()&&!b.options.blockDoesNotCollapse?S.getVerticalOffsetForLineNumber(b.range.startLineNumber,!1):S.getVerticalOffsetAfterLineNumber(b.range.endLineNumber,!0));const[t,r,u,f]=(p=b.options.blockPadding)!==null&&p!==void 0?p:[0,0,0,0];a.setClassName("blockDecorations-block "+b.options.blockClassName),a.setLeft(this.contentLeft-f),a.setWidth(this.contentWidth+f+r),a.setTop(i-S.scrollTop-t),a.setHeight(n-i+t+u),_++}for(let b=_;b<this.blocks.length;b++)this.blocks[b].domNode.remove();this.blocks.length=_}}e.BlockDecorations=y}),define(se[537],oe([1,0,115,148,5,432]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DecorationsOverlay=void 0;class E extends L.DynamicViewOverlay{constructor(p){super(),this._context=p;const _=this._context.configuration.options;this._lineHeight=_.get(66),this._typicalHalfwidthCharacterWidth=_.get(50).typicalHalfwidthCharacterWidth,this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(p){const _=this._context.configuration.options;return this._lineHeight=_.get(66),this._typicalHalfwidthCharacterWidth=_.get(50).typicalHalfwidthCharacterWidth,!0}onDecorationsChanged(p){return!0}onFlushed(p){return!0}onLinesChanged(p){return!0}onLinesDeleted(p){return!0}onLinesInserted(p){return!0}onScrollChanged(p){return p.scrollTopChanged||p.scrollWidthChanged}onZonesChanged(p){return!0}prepareRender(p){const _=p.getDecorationsInViewport();let v=[],b=0;for(let t=0,r=_.length;t<r;t++){const u=_[t];u.options.className&&(v[b++]=u)}v=v.sort((t,r)=>{if(t.options.zIndex<r.options.zIndex)return-1;if(t.options.zIndex>r.options.zIndex)return 1;const u=t.options.className,f=r.options.className;return u<f?-1:u>f?1:y.Range.compareRangesUsingStarts(t.range,r.range)});const a=p.visibleRange.startLineNumber,i=p.visibleRange.endLineNumber,n=[];for(let t=a;t<=i;t++){const r=t-a;n[r]=""}this._renderWholeLineDecorations(p,v,n),this._renderNormalDecorations(p,v,n),this._renderResult=n}_renderWholeLineDecorations(p,_,v){const b=String(this._lineHeight),a=p.visibleRange.startLineNumber,i=p.visibleRange.endLineNumber;for(let n=0,t=_.length;n<t;n++){const r=_[n];if(!r.options.isWholeLine)continue;const u='<div class="cdr '+r.options.className+'" style="left:0;width:100%;height:'+b+'px;"></div>',f=Math.max(r.range.startLineNumber,a),c=Math.min(r.range.endLineNumber,i);for(let d=f;d<=c;d++){const s=d-a;v[s]+=u}}}_renderNormalDecorations(p,_,v){var b;const a=String(this._lineHeight),i=p.visibleRange.startLineNumber;let n=null,t=!1,r=null,u=!1;for(let f=0,c=_.length;f<c;f++){const d=_[f];if(d.options.isWholeLine)continue;const s=d.options.className,l=!!d.options.showIfCollapsed;let o=d.range;if(l&&o.endColumn===1&&o.endLineNumber!==o.startLineNumber&&(o=new y.Range(o.startLineNumber,o.startColumn,o.endLineNumber-1,this._context.viewModel.getLineMaxColumn(o.endLineNumber-1))),n===s&&t===l&&y.Range.areIntersectingOrTouching(r,o)){r=y.Range.plusRange(r,o);continue}n!==null&&this._renderNormalDecoration(p,r,n,u,t,a,i,v),n=s,t=l,r=o,u=(b=d.options.shouldFillLineOnLineBreak)!==null&&b!==void 0?b:!1}n!==null&&this._renderNormalDecoration(p,r,n,u,t,a,i,v)}_renderNormalDecoration(p,_,v,b,a,i,n,t){const r=p.linesVisibleRangesForRange(_,v==="findMatch");if(r)for(let u=0,f=r.length;u<f;u++){const c=r[u];if(c.outsideRenderedLine)continue;const d=c.lineNumber-n;if(a&&c.ranges.length===1){const s=c.ranges[0];if(s.width<this._typicalHalfwidthCharacterWidth){const l=Math.round(s.left+s.width/2),o=Math.max(0,Math.round(l-this._typicalHalfwidthCharacterWidth/2));c.ranges[0]=new k.HorizontalRange(o,this._typicalHalfwidthCharacterWidth)}}for(let s=0,l=c.ranges.length;s<l;s++){const o=b&&c.continuesOnNextLine&&l===1,g=c.ranges[s],h='<div class="cdr '+v+'" style="left:'+String(g.left)+(o?"px;width:100%;height:":"px;width:"+String(g.width)+"px;height:")+i+'px;"></div>';t[d]+=h}}}render(p,_){if(!this._renderResult)return"";const v=_-p;return v<0||v>=this._renderResult.length?"":this._renderResult[v]}}e.DecorationsOverlay=E}),define(se[213],oe([1,0,40,13,115,56,10,5,41,433]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlyphMarginWidgets=e.DedupOverlay=e.VisibleLineDecorationsToRender=e.LineDecorationToRender=e.DecorationToRender=void 0;class v{constructor(c,d,s,l,o){this.startLineNumber=c,this.endLineNumber=d,this.className=s,this.tooltip=l,this._decorationToRenderBrand=void 0,this.zIndex=o??0}}e.DecorationToRender=v;class b{constructor(c,d,s){this.className=c,this.zIndex=d,this.tooltip=s}}e.LineDecorationToRender=b;class a{constructor(){this.decorations=[]}add(c){this.decorations.push(c)}getDecorations(){return this.decorations}}e.VisibleLineDecorationsToRender=a;class i extends y.DynamicViewOverlay{_render(c,d,s){const l=[];for(let h=c;h<=d;h++){const m=h-c;l[m]=new a}if(s.length===0)return l;s.sort((h,m)=>h.className===m.className?h.startLineNumber===m.startLineNumber?h.endLineNumber-m.endLineNumber:h.startLineNumber-m.startLineNumber:h.className<m.className?-1:1);let o=null,g=0;for(let h=0,m=s.length;h<m;h++){const C=s[h],w=C.className,D=C.zIndex;let I=Math.max(C.startLineNumber,c)-c;const T=Math.min(C.endLineNumber,d)-c;o===w?(I=Math.max(g+1,I),g=Math.max(g,T)):(o=w,g=T);for(let A=I;A<=g;A++)l[A].add(new b(w,D,C.tooltip))}return l}}e.DedupOverlay=i;class n extends E.ViewPart{constructor(c){super(c),this._widgets={},this._context=c;const d=this._context.configuration.options,s=d.get(143);this.domNode=(0,L.createFastDomNode)(document.createElement("div")),this.domNode.setClassName("glyph-margin-widgets"),this.domNode.setPosition("absolute"),this.domNode.setTop(0),this._lineHeight=d.get(66),this._glyphMargin=d.get(57),this._glyphMarginLeft=s.glyphMarginLeft,this._glyphMarginWidth=s.glyphMarginWidth,this._glyphMarginDecorationLaneCount=s.glyphMarginDecorationLaneCount,this._managedDomNodes=[],this._decorationGlyphsToRender=[]}dispose(){this._managedDomNodes=[],this._decorationGlyphsToRender=[],this._widgets={},super.dispose()}getWidgets(){return Object.values(this._widgets)}onConfigurationChanged(c){const d=this._context.configuration.options,s=d.get(143);return this._lineHeight=d.get(66),this._glyphMargin=d.get(57),this._glyphMarginLeft=s.glyphMarginLeft,this._glyphMarginWidth=s.glyphMarginWidth,this._glyphMarginDecorationLaneCount=s.glyphMarginDecorationLaneCount,!0}onDecorationsChanged(c){return!0}onFlushed(c){return!0}onLinesChanged(c){return!0}onLinesDeleted(c){return!0}onLinesInserted(c){return!0}onScrollChanged(c){return c.scrollTopChanged}onZonesChanged(c){return!0}addWidget(c){const d=(0,L.createFastDomNode)(c.getDomNode());this._widgets[c.getId()]={widget:c,preference:c.getPosition(),domNode:d,renderInfo:null},d.setPosition("absolute"),d.setDisplay("none"),d.setAttribute("widgetId",c.getId()),this.domNode.appendChild(d),this.setShouldRender()}setWidgetPosition(c,d){const s=this._widgets[c.getId()];return s.preference.lane===d.lane&&s.preference.zIndex===d.zIndex&&p.Range.equalsRange(s.preference.range,d.range)?!1:(s.preference=d,this.setShouldRender(),!0)}removeWidget(c){var d;const s=c.getId();if(this._widgets[s]){const o=this._widgets[s].domNode.domNode;delete this._widgets[s],(d=o.parentNode)===null||d===void 0||d.removeChild(o),this.setShouldRender()}}_collectDecorationBasedGlyphRenderRequest(c,d){var s,l,o;const g=c.visibleRange.startLineNumber,h=c.visibleRange.endLineNumber,m=c.getDecorationsInViewport();for(const C of m){const w=C.options.glyphMarginClassName;if(!w)continue;const D=Math.max(C.range.startLineNumber,g),I=Math.min(C.range.endLineNumber,h),T=(l=(s=C.options.glyphMargin)===null||s===void 0?void 0:s.position)!==null&&l!==void 0?l:_.GlyphMarginLane.Center,A=(o=C.options.zIndex)!==null&&o!==void 0?o:0;for(let P=D;P<=I;P++){const N=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new S.Position(P,0)),M=this._context.viewModel.glyphLanes.getLanesAtLine(N.lineNumber).indexOf(T);d.push(new t(P,M,A,w))}}}_collectWidgetBasedGlyphRenderRequest(c,d){const s=c.visibleRange.startLineNumber,l=c.visibleRange.endLineNumber;for(const o of Object.values(this._widgets)){const g=o.preference.range,{startLineNumber:h,endLineNumber:m}=this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(p.Range.lift(g));if(!h||!m||m<s||h>l)continue;const C=Math.max(h,s),w=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new S.Position(C,0)),D=this._context.viewModel.glyphLanes.getLanesAtLine(w.lineNumber).indexOf(o.preference.lane);d.push(new r(C,D,o.preference.zIndex,o))}}_collectSortedGlyphRenderRequests(c){const d=[];return this._collectDecorationBasedGlyphRenderRequest(c,d),this._collectWidgetBasedGlyphRenderRequest(c,d),d.sort((s,l)=>s.lineNumber===l.lineNumber?s.laneIndex===l.laneIndex?s.zIndex===l.zIndex?l.type===s.type?s.type===0&&l.type===0?s.className<l.className?-1:1:0:l.type-s.type:l.zIndex-s.zIndex:s.laneIndex-l.laneIndex:s.lineNumber-l.lineNumber),d}prepareRender(c){if(!this._glyphMargin){this._decorationGlyphsToRender=[];return}for(const l of Object.values(this._widgets))l.renderInfo=null;const d=new k.ArrayQueue(this._collectSortedGlyphRenderRequests(c)),s=[];for(;d.length>0;){const l=d.peek();if(!l)break;const o=d.takeWhile(h=>h.lineNumber===l.lineNumber&&h.laneIndex===l.laneIndex);if(!o||o.length===0)break;const g=o[0];if(g.type===0){const h=[];for(const m of o){if(m.zIndex!==g.zIndex||m.type!==g.type)break;(h.length===0||h[h.length-1]!==m.className)&&h.push(m.className)}s.push(g.accept(h.join(" ")))}else g.widget.renderInfo={lineNumber:g.lineNumber,laneIndex:g.laneIndex}}this._decorationGlyphsToRender=s}render(c){if(!this._glyphMargin){for(const s of Object.values(this._widgets))s.domNode.setDisplay("none");for(;this._managedDomNodes.length>0;){const s=this._managedDomNodes.pop();s?.domNode.remove()}return}const d=Math.round(this._glyphMarginWidth/this._glyphMarginDecorationLaneCount);for(const s of Object.values(this._widgets))if(!s.renderInfo)s.domNode.setDisplay("none");else{const l=c.viewportData.relativeVerticalOffset[s.renderInfo.lineNumber-c.viewportData.startLineNumber],o=this._glyphMarginLeft+s.renderInfo.laneIndex*this._lineHeight;s.domNode.setDisplay("block"),s.domNode.setTop(l),s.domNode.setLeft(o),s.domNode.setWidth(d),s.domNode.setHeight(this._lineHeight)}for(let s=0;s<this._decorationGlyphsToRender.length;s++){const l=this._decorationGlyphsToRender[s],o=c.viewportData.relativeVerticalOffset[l.lineNumber-c.viewportData.startLineNumber],g=this._glyphMarginLeft+l.laneIndex*this._lineHeight;let h;s<this._managedDomNodes.length?h=this._managedDomNodes[s]:(h=(0,L.createFastDomNode)(document.createElement("div")),this._managedDomNodes.push(h),this.domNode.appendChild(h)),h.setClassName("cgmr codicon "+l.combinedClassName),h.setPosition("absolute"),h.setTop(o),h.setLeft(g),h.setWidth(d),h.setHeight(this._lineHeight)}for(;this._managedDomNodes.length>this._decorationGlyphsToRender.length;){const s=this._managedDomNodes.pop();s?.domNode.remove()}}}e.GlyphMarginWidgets=n;class t{constructor(c,d,s,l){this.lineNumber=c,this.laneIndex=d,this.zIndex=s,this.className=l,this.type=0}accept(c){return new u(this.lineNumber,this.laneIndex,c)}}class r{constructor(c,d,s,l){this.lineNumber=c,this.laneIndex=d,this.zIndex=s,this.widget=l,this.type=1}}class u{constructor(c,d,s){this.lineNumber=c,this.laneIndex=d,this.combinedClassName=s}}}),define(se[538],oe([1,0,213,437]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinesDecorationsOverlay=void 0;class k extends L.DedupOverlay{constructor(E){super(),this._context=E;const p=this._context.configuration.options.get(143);this._decorationsLeft=p.decorationsLeft,this._decorationsWidth=p.decorationsWidth,this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(E){const p=this._context.configuration.options.get(143);return this._decorationsLeft=p.decorationsLeft,this._decorationsWidth=p.decorationsWidth,!0}onDecorationsChanged(E){return!0}onFlushed(E){return!0}onLinesChanged(E){return!0}onLinesDeleted(E){return!0}onLinesInserted(E){return!0}onScrollChanged(E){return E.scrollTopChanged}onZonesChanged(E){return!0}_getDecorations(E){var S,p;const _=E.getDecorationsInViewport(),v=[];let b=0;for(let a=0,i=_.length;a<i;a++){const n=_[a],t=n.options.linesDecorationsClassName,r=n.options.zIndex;t&&(v[b++]=new L.DecorationToRender(n.range.startLineNumber,n.range.endLineNumber,t,(S=n.options.linesDecorationsTooltip)!==null&&S!==void 0?S:null,r));const u=n.options.firstLineDecorationClassName;u&&(v[b++]=new L.DecorationToRender(n.range.startLineNumber,n.range.startLineNumber,u,(p=n.options.linesDecorationsTooltip)!==null&&p!==void 0?p:null,r))}return v}prepareRender(E){const S=E.visibleRange.startLineNumber,p=E.visibleRange.endLineNumber,_=this._render(S,p,this._getDecorations(E)),v=this._decorationsLeft.toString(),b=this._decorationsWidth.toString(),a='" style="left:'+v+"px;width:"+b+'px;"></div>',i=[];for(let n=S;n<=p;n++){const t=n-S,r=_[t].getDecorations();let u="";for(const f of r){let c='<div class="cldr '+f.className;f.tooltip!==null&&(c+='" title="'+f.tooltip),c+=a,u+=c}i[t]=u}this._renderResult=i}render(E,S){return this._renderResult?this._renderResult[S-E]:""}}e.LinesDecorationsOverlay=k}),define(se[299],oe([1,0,40,56,438]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Margin=void 0;class y extends k.ViewPart{constructor(S){super(S);const p=this._context.configuration.options,_=p.get(143);this._canUseLayerHinting=!p.get(32),this._contentLeft=_.contentLeft,this._glyphMarginLeft=_.glyphMarginLeft,this._glyphMarginWidth=_.glyphMarginWidth,this._domNode=(0,L.createFastDomNode)(document.createElement("div")),this._domNode.setClassName(y.OUTER_CLASS_NAME),this._domNode.setPosition("absolute"),this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true"),this._glyphMarginBackgroundDomNode=(0,L.createFastDomNode)(document.createElement("div")),this._glyphMarginBackgroundDomNode.setClassName(y.CLASS_NAME),this._domNode.appendChild(this._glyphMarginBackgroundDomNode)}dispose(){super.dispose()}getDomNode(){return this._domNode}onConfigurationChanged(S){const p=this._context.configuration.options,_=p.get(143);return this._canUseLayerHinting=!p.get(32),this._contentLeft=_.contentLeft,this._glyphMarginLeft=_.glyphMarginLeft,this._glyphMarginWidth=_.glyphMarginWidth,!0}onScrollChanged(S){return super.onScrollChanged(S)||S.scrollTopChanged}prepareRender(S){}render(S){this._domNode.setLayerHinting(this._canUseLayerHinting),this._domNode.setContain("strict");const p=S.scrollTop-S.bigNumbersDelta;this._domNode.setTop(-p);const _=Math.min(S.scrollHeight,1e6);this._domNode.setHeight(_),this._domNode.setWidth(this._contentLeft),this._glyphMarginBackgroundDomNode.setLeft(this._glyphMarginLeft),this._glyphMarginBackgroundDomNode.setWidth(this._glyphMarginWidth),this._glyphMarginBackgroundDomNode.setHeight(_)}}e.Margin=y,y.CLASS_NAME="glyph-margin",y.OUTER_CLASS_NAME="margin"}),define(se[539],oe([1,0,213,439]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarginViewLineDecorationsOverlay=void 0;class k extends L.DedupOverlay{constructor(E){super(),this._context=E,this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(E){return!0}onDecorationsChanged(E){return!0}onFlushed(E){return!0}onLinesChanged(E){return!0}onLinesDeleted(E){return!0}onLinesInserted(E){return!0}onScrollChanged(E){return E.scrollTopChanged}onZonesChanged(E){return!0}_getDecorations(E){const S=E.getDecorationsInViewport(),p=[];let _=0;for(let v=0,b=S.length;v<b;v++){const a=S[v],i=a.options.marginClassName,n=a.options.zIndex;i&&(p[_++]=new L.DecorationToRender(a.range.startLineNumber,a.range.endLineNumber,i,null,n))}return p}prepareRender(E){const S=E.visibleRange.startLineNumber,p=E.visibleRange.endLineNumber,_=this._render(S,p,this._getDecorations(E)),v=[];for(let b=S;b<=p;b++){const a=b-S,i=_[a].getDecorations();let n="";for(const t of i)n+='<div class="cmdr '+t.className+'" style=""></div>';v[a]=n}this._renderResult=v}render(E,S){return this._renderResult?this._renderResult[S-E]:""}}e.MarginViewLineDecorationsOverlay=k}),define(se[540],oe([1,0,40,56,442]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Rulers=void 0;class y extends k.ViewPart{constructor(S){super(S),this.domNode=(0,L.createFastDomNode)(document.createElement("div")),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this.domNode.setClassName("view-rulers"),this._renderedRulers=[];const p=this._context.configuration.options;this._rulers=p.get(101),this._typicalHalfwidthCharacterWidth=p.get(50).typicalHalfwidthCharacterWidth}dispose(){super.dispose()}onConfigurationChanged(S){const p=this._context.configuration.options;return this._rulers=p.get(101),this._typicalHalfwidthCharacterWidth=p.get(50).typicalHalfwidthCharacterWidth,!0}onScrollChanged(S){return S.scrollHeightChanged}prepareRender(S){}_ensureRulersCount(){const S=this._renderedRulers.length,p=this._rulers.length;if(S===p)return;if(S<p){const{tabSize:v}=this._context.viewModel.model.getOptions(),b=v;let a=p-S;for(;a>0;){const i=(0,L.createFastDomNode)(document.createElement("div"));i.setClassName("view-ruler"),i.setWidth(b),this.domNode.appendChild(i),this._renderedRulers.push(i),a--}return}let _=S-p;for(;_>0;){const v=this._renderedRulers.pop();this.domNode.removeChild(v),_--}}render(S){this._ensureRulersCount();for(let p=0,_=this._rulers.length;p<_;p++){const v=this._renderedRulers[p],b=this._rulers[p];v.setBoxShadow(b.color?`1px 0 0 0 ${b.color} inset`:""),v.setHeight(Math.min(S.scrollHeight,1e6)),v.setLeft(b.column*this._typicalHalfwidthCharacterWidth)}}}e.Rulers=y}),define(se[541],oe([1,0,40,56,443]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ScrollDecorationViewPart=void 0;class y extends k.ViewPart{constructor(S){super(S),this._scrollTop=0,this._width=0,this._updateWidth(),this._shouldShow=!1;const _=this._context.configuration.options.get(102);this._useShadows=_.useShadows,this._domNode=(0,L.createFastDomNode)(document.createElement("div")),this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true")}dispose(){super.dispose()}_updateShouldShow(){const S=this._useShadows&&this._scrollTop>0;return this._shouldShow!==S?(this._shouldShow=S,!0):!1}getDomNode(){return this._domNode}_updateWidth(){const p=this._context.configuration.options.get(143);p.minimap.renderMinimap===0||p.minimap.minimapWidth>0&&p.minimap.minimapLeft===0?this._width=p.width:this._width=p.width-p.verticalScrollbarWidth}onConfigurationChanged(S){const _=this._context.configuration.options.get(102);return this._useShadows=_.useShadows,this._updateWidth(),this._updateShouldShow(),!0}onScrollChanged(S){return this._scrollTop=S.scrollTop,this._updateShouldShow()}prepareRender(S){}render(S){this._domNode.setWidth(this._width),this._domNode.setClassName(this._shouldShow?"scroll-decoration":"")}}e.ScrollDecorationViewPart=y}),define(se[542],oe([1,0,40,12,56,10]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewZones=void 0;const S=()=>{throw new Error("Invalid change accessor")};class p extends y.ViewPart{constructor(b){super(b);const a=this._context.configuration.options,i=a.get(143);this._lineHeight=a.get(66),this._contentWidth=i.contentWidth,this._contentLeft=i.contentLeft,this.domNode=(0,L.createFastDomNode)(document.createElement("div")),this.domNode.setClassName("view-zones"),this.domNode.setPosition("absolute"),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this.marginDomNode=(0,L.createFastDomNode)(document.createElement("div")),this.marginDomNode.setClassName("margin-view-zones"),this.marginDomNode.setPosition("absolute"),this.marginDomNode.setAttribute("role","presentation"),this.marginDomNode.setAttribute("aria-hidden","true"),this._zones={}}dispose(){super.dispose(),this._zones={}}_recomputeWhitespacesProps(){const b=this._context.viewLayout.getWhitespaces(),a=new Map;for(const n of b)a.set(n.id,n);let i=!1;return this._context.viewModel.changeWhitespace(n=>{const t=Object.keys(this._zones);for(let r=0,u=t.length;r<u;r++){const f=t[r],c=this._zones[f],d=this._computeWhitespaceProps(c.delegate);c.isInHiddenArea=d.isInHiddenArea;const s=a.get(f);s&&(s.afterLineNumber!==d.afterViewLineNumber||s.height!==d.heightInPx)&&(n.changeOneWhitespace(f,d.afterViewLineNumber,d.heightInPx),this._safeCallOnComputedHeight(c.delegate,d.heightInPx),i=!0)}}),i}onConfigurationChanged(b){const a=this._context.configuration.options,i=a.get(143);return this._lineHeight=a.get(66),this._contentWidth=i.contentWidth,this._contentLeft=i.contentLeft,b.hasChanged(66)&&this._recomputeWhitespacesProps(),!0}onLineMappingChanged(b){return this._recomputeWhitespacesProps()}onLinesDeleted(b){return!0}onScrollChanged(b){return b.scrollTopChanged||b.scrollWidthChanged}onZonesChanged(b){return!0}onLinesInserted(b){return!0}_getZoneOrdinal(b){var a,i;return(i=(a=b.ordinal)!==null&&a!==void 0?a:b.afterColumn)!==null&&i!==void 0?i:1e4}_computeWhitespaceProps(b){if(b.afterLineNumber===0)return{isInHiddenArea:!1,afterViewLineNumber:0,heightInPx:this._heightInPixels(b),minWidthInPx:this._minWidthInPixels(b)};let a;if(typeof b.afterColumn<"u")a=this._context.viewModel.model.validatePosition({lineNumber:b.afterLineNumber,column:b.afterColumn});else{const r=this._context.viewModel.model.validatePosition({lineNumber:b.afterLineNumber,column:1}).lineNumber;a=new E.Position(r,this._context.viewModel.model.getLineMaxColumn(r))}let i;a.column===this._context.viewModel.model.getLineMaxColumn(a.lineNumber)?i=this._context.viewModel.model.validatePosition({lineNumber:a.lineNumber+1,column:1}):i=this._context.viewModel.model.validatePosition({lineNumber:a.lineNumber,column:a.column+1});const n=this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(a,b.afterColumnAffinity,!0),t=b.showInHiddenAreas||this._context.viewModel.coordinatesConverter.modelPositionIsVisible(i);return{isInHiddenArea:!t,afterViewLineNumber:n.lineNumber,heightInPx:t?this._heightInPixels(b):0,minWidthInPx:this._minWidthInPixels(b)}}changeViewZones(b){let a=!1;return this._context.viewModel.changeWhitespace(i=>{const n={addZone:t=>(a=!0,this._addZone(i,t)),removeZone:t=>{t&&(a=this._removeZone(i,t)||a)},layoutZone:t=>{t&&(a=this._layoutZone(i,t)||a)}};_(b,n),n.addZone=S,n.removeZone=S,n.layoutZone=S}),a}_addZone(b,a){const i=this._computeWhitespaceProps(a),t={whitespaceId:b.insertWhitespace(i.afterViewLineNumber,this._getZoneOrdinal(a),i.heightInPx,i.minWidthInPx),delegate:a,isInHiddenArea:i.isInHiddenArea,isVisible:!1,domNode:(0,L.createFastDomNode)(a.domNode),marginDomNode:a.marginDomNode?(0,L.createFastDomNode)(a.marginDomNode):null};return this._safeCallOnComputedHeight(t.delegate,i.heightInPx),t.domNode.setPosition("absolute"),t.domNode.domNode.style.width="100%",t.domNode.setDisplay("none"),t.domNode.setAttribute("monaco-view-zone",t.whitespaceId),this.domNode.appendChild(t.domNode),t.marginDomNode&&(t.marginDomNode.setPosition("absolute"),t.marginDomNode.domNode.style.width="100%",t.marginDomNode.setDisplay("none"),t.marginDomNode.setAttribute("monaco-view-zone",t.whitespaceId),this.marginDomNode.appendChild(t.marginDomNode)),this._zones[t.whitespaceId]=t,this.setShouldRender(),t.whitespaceId}_removeZone(b,a){if(this._zones.hasOwnProperty(a)){const i=this._zones[a];return delete this._zones[a],b.removeWhitespace(i.whitespaceId),i.domNode.removeAttribute("monaco-visible-view-zone"),i.domNode.removeAttribute("monaco-view-zone"),i.domNode.domNode.parentNode.removeChild(i.domNode.domNode),i.marginDomNode&&(i.marginDomNode.removeAttribute("monaco-visible-view-zone"),i.marginDomNode.removeAttribute("monaco-view-zone"),i.marginDomNode.domNode.parentNode.removeChild(i.marginDomNode.domNode)),this.setShouldRender(),!0}return!1}_layoutZone(b,a){if(this._zones.hasOwnProperty(a)){const i=this._zones[a],n=this._computeWhitespaceProps(i.delegate);return i.isInHiddenArea=n.isInHiddenArea,b.changeOneWhitespace(i.whitespaceId,n.afterViewLineNumber,n.heightInPx),this._safeCallOnComputedHeight(i.delegate,n.heightInPx),this.setShouldRender(),!0}return!1}shouldSuppressMouseDownOnViewZone(b){return this._zones.hasOwnProperty(b)?!!this._zones[b].delegate.suppressMouseDown:!1}_heightInPixels(b){return typeof b.heightInPx=="number"?b.heightInPx:typeof b.heightInLines=="number"?this._lineHeight*b.heightInLines:this._lineHeight}_minWidthInPixels(b){return typeof b.minWidthInPx=="number"?b.minWidthInPx:0}_safeCallOnComputedHeight(b,a){if(typeof b.onComputedHeight=="function")try{b.onComputedHeight(a)}catch(i){(0,k.onUnexpectedError)(i)}}_safeCallOnDomNodeTop(b,a){if(typeof b.onDomNodeTop=="function")try{b.onDomNodeTop(a)}catch(i){(0,k.onUnexpectedError)(i)}}prepareRender(b){}render(b){const a=b.viewportData.whitespaceViewportData,i={};let n=!1;for(const r of a)this._zones[r.id].isInHiddenArea||(i[r.id]=r,n=!0);const t=Object.keys(this._zones);for(let r=0,u=t.length;r<u;r++){const f=t[r],c=this._zones[f];let d=0,s=0,l="none";i.hasOwnProperty(f)?(d=i[f].verticalOffset-b.bigNumbersDelta,s=i[f].height,l="block",c.isVisible||(c.domNode.setAttribute("monaco-visible-view-zone","true"),c.isVisible=!0),this._safeCallOnDomNodeTop(c.delegate,b.getScrolledTopFromAbsoluteTop(i[f].verticalOffset))):(c.isVisible&&(c.domNode.removeAttribute("monaco-visible-view-zone"),c.isVisible=!1),this._safeCallOnDomNodeTop(c.delegate,b.getScrolledTopFromAbsoluteTop(-1e6))),c.domNode.setTop(d),c.domNode.setHeight(s),c.domNode.setDisplay(l),c.marginDomNode&&(c.marginDomNode.setTop(d),c.marginDomNode.setHeight(s),c.marginDomNode.setDisplay(l))}n&&(this.domNode.setWidth(Math.max(b.scrollWidth,this._contentWidth)),this.marginDomNode.setWidth(this._contentLeft))}}e.ViewZones=p;function _(v,b){try{return v(b)}catch(a){(0,k.onUnexpectedError)(a)}}}),define(se[214],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewZonesChangedEvent=e.ViewTokensColorsChangedEvent=e.ViewTokensChangedEvent=e.ViewThemeChangedEvent=e.ViewScrollChangedEvent=e.ViewRevealRangeRequestEvent=e.ViewLinesInsertedEvent=e.ViewLinesDeletedEvent=e.ViewLinesChangedEvent=e.ViewLineMappingChangedEvent=e.ViewLanguageConfigurationEvent=e.ViewFocusChangedEvent=e.ViewFlushedEvent=e.ViewDecorationsChangedEvent=e.ViewCursorStateChangedEvent=e.ViewConfigurationChangedEvent=e.ViewCompositionEndEvent=e.ViewCompositionStartEvent=void 0;class L{constructor(){this.type=0}}e.ViewCompositionStartEvent=L;class k{constructor(){this.type=1}}e.ViewCompositionEndEvent=k;class y{constructor(l){this.type=2,this._source=l}hasChanged(l){return this._source.hasChanged(l)}}e.ViewConfigurationChangedEvent=y;class E{constructor(l,o,g){this.selections=l,this.modelSelections=o,this.reason=g,this.type=3}}e.ViewCursorStateChangedEvent=E;class S{constructor(l){this.type=4,l?(this.affectsMinimap=l.affectsMinimap,this.affectsOverviewRuler=l.affectsOverviewRuler,this.affectsGlyphMargin=l.affectsGlyphMargin,this.affectsLineNumber=l.affectsLineNumber):(this.affectsMinimap=!0,this.affectsOverviewRuler=!0,this.affectsGlyphMargin=!0,this.affectsLineNumber=!0)}}e.ViewDecorationsChangedEvent=S;class p{constructor(){this.type=5}}e.ViewFlushedEvent=p;class _{constructor(l){this.type=6,this.isFocused=l}}e.ViewFocusChangedEvent=_;class v{constructor(){this.type=7}}e.ViewLanguageConfigurationEvent=v;class b{constructor(){this.type=8}}e.ViewLineMappingChangedEvent=b;class a{constructor(l,o){this.fromLineNumber=l,this.count=o,this.type=9}}e.ViewLinesChangedEvent=a;class i{constructor(l,o){this.type=10,this.fromLineNumber=l,this.toLineNumber=o}}e.ViewLinesDeletedEvent=i;class n{constructor(l,o){this.type=11,this.fromLineNumber=l,this.toLineNumber=o}}e.ViewLinesInsertedEvent=n;class t{constructor(l,o,g,h,m,C,w){this.source=l,this.minimalReveal=o,this.range=g,this.selections=h,this.verticalType=m,this.revealHorizontal=C,this.scrollType=w,this.type=12}}e.ViewRevealRangeRequestEvent=t;class r{constructor(l){this.type=13,this.scrollWidth=l.scrollWidth,this.scrollLeft=l.scrollLeft,this.scrollHeight=l.scrollHeight,this.scrollTop=l.scrollTop,this.scrollWidthChanged=l.scrollWidthChanged,this.scrollLeftChanged=l.scrollLeftChanged,this.scrollHeightChanged=l.scrollHeightChanged,this.scrollTopChanged=l.scrollTopChanged}}e.ViewScrollChangedEvent=r;class u{constructor(l){this.theme=l,this.type=14}}e.ViewThemeChangedEvent=u;class f{constructor(l){this.type=15,this.ranges=l}}e.ViewTokensChangedEvent=f;class c{constructor(){this.type=16}}e.ViewTokensColorsChangedEvent=c;class d{constructor(){this.type=17}}e.ViewZonesChangedEvent=d}),define(se[155],oe([1,0,11]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineDecorationsNormalizer=e.DecorationSegment=e.LineDecoration=void 0;class k{constructor(_,v,b,a){this.startColumn=_,this.endColumn=v,this.className=b,this.type=a,this._lineDecorationBrand=void 0}static _equals(_,v){return _.startColumn===v.startColumn&&_.endColumn===v.endColumn&&_.className===v.className&&_.type===v.type}static equalsArr(_,v){const b=_.length,a=v.length;if(b!==a)return!1;for(let i=0;i<b;i++)if(!k._equals(_[i],v[i]))return!1;return!0}static extractWrapped(_,v,b){if(_.length===0)return _;const a=v+1,i=b+1,n=b-v,t=[];let r=0;for(const u of _)u.endColumn<=a||u.startColumn>=i||(t[r++]=new k(Math.max(1,u.startColumn-a+1),Math.min(n+1,u.endColumn-a+1),u.className,u.type));return t}static filter(_,v,b,a){if(_.length===0)return[];const i=[];let n=0;for(let t=0,r=_.length;t<r;t++){const u=_[t],f=u.range;if(f.endLineNumber<v||f.startLineNumber>v||f.isEmpty()&&(u.type===0||u.type===3))continue;const c=f.startLineNumber===v?f.startColumn:b,d=f.endLineNumber===v?f.endColumn:a;i[n++]=new k(c,d,u.inlineClassName,u.type)}return i}static _typeCompare(_,v){const b=[2,0,1,3];return b[_]-b[v]}static compare(_,v){if(_.startColumn!==v.startColumn)return _.startColumn-v.startColumn;if(_.endColumn!==v.endColumn)return _.endColumn-v.endColumn;const b=k._typeCompare(_.type,v.type);return b!==0?b:_.className!==v.className?_.className<v.className?-1:1:0}}e.LineDecoration=k;class y{constructor(_,v,b,a){this.startOffset=_,this.endOffset=v,this.className=b,this.metadata=a}}e.DecorationSegment=y;class E{constructor(){this.stopOffsets=[],this.classNames=[],this.metadata=[],this.count=0}static _metadata(_){let v=0;for(let b=0,a=_.length;b<a;b++)v|=_[b];return v}consumeLowerThan(_,v,b){for(;this.count>0&&this.stopOffsets[0]<_;){let a=0;for(;a+1<this.count&&this.stopOffsets[a]===this.stopOffsets[a+1];)a++;b.push(new y(v,this.stopOffsets[a],this.classNames.join(" "),E._metadata(this.metadata))),v=this.stopOffsets[a]+1,this.stopOffsets.splice(0,a+1),this.classNames.splice(0,a+1),this.metadata.splice(0,a+1),this.count-=a+1}return this.count>0&&v<_&&(b.push(new y(v,_-1,this.classNames.join(" "),E._metadata(this.metadata))),v=_),v}insert(_,v,b){if(this.count===0||this.stopOffsets[this.count-1]<=_)this.stopOffsets.push(_),this.classNames.push(v),this.metadata.push(b);else for(let a=0;a<this.count;a++)if(this.stopOffsets[a]>=_){this.stopOffsets.splice(a,0,_),this.classNames.splice(a,0,v),this.metadata.splice(a,0,b);break}this.count++}}class S{static normalize(_,v){if(v.length===0)return[];const b=[],a=new E;let i=0;for(let n=0,t=v.length;n<t;n++){const r=v[n];let u=r.startColumn,f=r.endColumn;const c=r.className,d=r.type===1?2:r.type===2?4:0;if(u>1){const o=_.charCodeAt(u-2);L.isHighSurrogate(o)&&u--}if(f>1){const o=_.charCodeAt(f-2);L.isHighSurrogate(o)&&f--}const s=u-1,l=f-2;i=a.consumeLowerThan(s,i,b),a.count===0&&(i=s),a.insert(l,c,d)}return a.consumeLowerThan(1073741824,i,b),b}}e.LineDecorationsNormalizer=S}),define(se[543],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinePart=void 0;class L{constructor(y,E,S,p){this.endIndex=y,this.type=E,this.metadata=S,this.containsRTL=p,this._linePartBrand=void 0}isWhitespace(){return!!(this.metadata&1)}isPseudoAfter(){return!!(this.metadata&4)}}e.LinePart=L}),define(se[544],oe([1,0,11]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinesLayout=e.EditorWhitespace=void 0;class k{constructor(){this._hasPending=!1,this._inserts=[],this._changes=[],this._removes=[]}insert(p){this._hasPending=!0,this._inserts.push(p)}change(p){this._hasPending=!0,this._changes.push(p)}remove(p){this._hasPending=!0,this._removes.push(p)}mustCommit(){return this._hasPending}commit(p){if(!this._hasPending)return;const _=this._inserts,v=this._changes,b=this._removes;this._hasPending=!1,this._inserts=[],this._changes=[],this._removes=[],p._commitPendingChanges(_,v,b)}}class y{constructor(p,_,v,b,a){this.id=p,this.afterLineNumber=_,this.ordinal=v,this.height=b,this.minWidth=a,this.prefixSum=0}}e.EditorWhitespace=y;class E{constructor(p,_,v,b){this._instanceId=L.singleLetterHash(++E.INSTANCE_COUNT),this._pendingChanges=new k,this._lastWhitespaceId=0,this._arr=[],this._prefixSumValidIndex=-1,this._minWidth=-1,this._lineCount=p,this._lineHeight=_,this._paddingTop=v,this._paddingBottom=b}static findInsertionIndex(p,_,v){let b=0,a=p.length;for(;b<a;){const i=b+a>>>1;_===p[i].afterLineNumber?v<p[i].ordinal?a=i:b=i+1:_<p[i].afterLineNumber?a=i:b=i+1}return b}setLineHeight(p){this._checkPendingChanges(),this._lineHeight=p}setPadding(p,_){this._paddingTop=p,this._paddingBottom=_}onFlushed(p){this._checkPendingChanges(),this._lineCount=p}changeWhitespace(p){let _=!1;try{p({insertWhitespace:(b,a,i,n)=>{_=!0,b=b|0,a=a|0,i=i|0,n=n|0;const t=this._instanceId+ ++this._lastWhitespaceId;return this._pendingChanges.insert(new y(t,b,a,i,n)),t},changeOneWhitespace:(b,a,i)=>{_=!0,a=a|0,i=i|0,this._pendingChanges.change({id:b,newAfterLineNumber:a,newHeight:i})},removeWhitespace:b=>{_=!0,this._pendingChanges.remove({id:b})}})}finally{this._pendingChanges.commit(this)}return _}_commitPendingChanges(p,_,v){if((p.length>0||v.length>0)&&(this._minWidth=-1),p.length+_.length+v.length<=1){for(const t of p)this._insertWhitespace(t);for(const t of _)this._changeOneWhitespace(t.id,t.newAfterLineNumber,t.newHeight);for(const t of v){const r=this._findWhitespaceIndex(t.id);r!==-1&&this._removeWhitespace(r)}return}const b=new Set;for(const t of v)b.add(t.id);const a=new Map;for(const t of _)a.set(t.id,t);const i=t=>{const r=[];for(const u of t)if(!b.has(u.id)){if(a.has(u.id)){const f=a.get(u.id);u.afterLineNumber=f.newAfterLineNumber,u.height=f.newHeight}r.push(u)}return r},n=i(this._arr).concat(i(p));n.sort((t,r)=>t.afterLineNumber===r.afterLineNumber?t.ordinal-r.ordinal:t.afterLineNumber-r.afterLineNumber),this._arr=n,this._prefixSumValidIndex=-1}_checkPendingChanges(){this._pendingChanges.mustCommit()&&this._pendingChanges.commit(this)}_insertWhitespace(p){const _=E.findInsertionIndex(this._arr,p.afterLineNumber,p.ordinal);this._arr.splice(_,0,p),this._prefixSumValidIndex=Math.min(this._prefixSumValidIndex,_-1)}_findWhitespaceIndex(p){const _=this._arr;for(let v=0,b=_.length;v<b;v++)if(_[v].id===p)return v;return-1}_changeOneWhitespace(p,_,v){const b=this._findWhitespaceIndex(p);if(b!==-1&&(this._arr[b].height!==v&&(this._arr[b].height=v,this._prefixSumValidIndex=Math.min(this._prefixSumValidIndex,b-1)),this._arr[b].afterLineNumber!==_)){const a=this._arr[b];this._removeWhitespace(b),a.afterLineNumber=_,this._insertWhitespace(a)}}_removeWhitespace(p){this._arr.splice(p,1),this._prefixSumValidIndex=Math.min(this._prefixSumValidIndex,p-1)}onLinesDeleted(p,_){this._checkPendingChanges(),p=p|0,_=_|0,this._lineCount-=_-p+1;for(let v=0,b=this._arr.length;v<b;v++){const a=this._arr[v].afterLineNumber;p<=a&&a<=_?this._arr[v].afterLineNumber=p-1:a>_&&(this._arr[v].afterLineNumber-=_-p+1)}}onLinesInserted(p,_){this._checkPendingChanges(),p=p|0,_=_|0,this._lineCount+=_-p+1;for(let v=0,b=this._arr.length;v<b;v++){const a=this._arr[v].afterLineNumber;p<=a&&(this._arr[v].afterLineNumber+=_-p+1)}}getWhitespacesTotalHeight(){return this._checkPendingChanges(),this._arr.length===0?0:this.getWhitespacesAccumulatedHeight(this._arr.length-1)}getWhitespacesAccumulatedHeight(p){this._checkPendingChanges(),p=p|0;let _=Math.max(0,this._prefixSumValidIndex+1);_===0&&(this._arr[0].prefixSum=this._arr[0].height,_++);for(let v=_;v<=p;v++)this._arr[v].prefixSum=this._arr[v-1].prefixSum+this._arr[v].height;return this._prefixSumValidIndex=Math.max(this._prefixSumValidIndex,p),this._arr[p].prefixSum}getLinesTotalHeight(){this._checkPendingChanges();const p=this._lineHeight*this._lineCount,_=this.getWhitespacesTotalHeight();return p+_+this._paddingTop+this._paddingBottom}getWhitespaceAccumulatedHeightBeforeLineNumber(p){this._checkPendingChanges(),p=p|0;const _=this._findLastWhitespaceBeforeLineNumber(p);return _===-1?0:this.getWhitespacesAccumulatedHeight(_)}_findLastWhitespaceBeforeLineNumber(p){p=p|0;const _=this._arr;let v=0,b=_.length-1;for(;v<=b;){const i=(b-v|0)/2|0,n=v+i|0;if(_[n].afterLineNumber<p){if(n+1>=_.length||_[n+1].afterLineNumber>=p)return n;v=n+1|0}else b=n-1|0}return-1}_findFirstWhitespaceAfterLineNumber(p){p=p|0;const v=this._findLastWhitespaceBeforeLineNumber(p)+1;return v<this._arr.length?v:-1}getFirstWhitespaceIndexAfterLineNumber(p){return this._checkPendingChanges(),p=p|0,this._findFirstWhitespaceAfterLineNumber(p)}getVerticalOffsetForLineNumber(p,_=!1){this._checkPendingChanges(),p=p|0;let v;p>1?v=this._lineHeight*(p-1):v=0;const b=this.getWhitespaceAccumulatedHeightBeforeLineNumber(p-(_?1:0));return v+b+this._paddingTop}getVerticalOffsetAfterLineNumber(p,_=!1){this._checkPendingChanges(),p=p|0;const v=this._lineHeight*p,b=this.getWhitespaceAccumulatedHeightBeforeLineNumber(p+(_?1:0));return v+b+this._paddingTop}getWhitespaceMinWidth(){if(this._checkPendingChanges(),this._minWidth===-1){let p=0;for(let _=0,v=this._arr.length;_<v;_++)p=Math.max(p,this._arr[_].minWidth);this._minWidth=p}return this._minWidth}isAfterLines(p){this._checkPendingChanges();const _=this.getLinesTotalHeight();return p>_}isInTopPadding(p){return this._paddingTop===0?!1:(this._checkPendingChanges(),p<this._paddingTop)}isInBottomPadding(p){if(this._paddingBottom===0)return!1;this._checkPendingChanges();const _=this.getLinesTotalHeight();return p>=_-this._paddingBottom}getLineNumberAtOrAfterVerticalOffset(p){if(this._checkPendingChanges(),p=p|0,p<0)return 1;const _=this._lineCount|0,v=this._lineHeight;let b=1,a=_;for(;b<a;){const i=(b+a)/2|0,n=this.getVerticalOffsetForLineNumber(i)|0;if(p>=n+v)b=i+1;else{if(p>=n)return i;a=i}}return b>_?_:b}getLinesViewportData(p,_){this._checkPendingChanges(),p=p|0,_=_|0;const v=this._lineHeight,b=this.getLineNumberAtOrAfterVerticalOffset(p)|0,a=this.getVerticalOffsetForLineNumber(b)|0;let i=this._lineCount|0,n=this.getFirstWhitespaceIndexAfterLineNumber(b)|0;const t=this.getWhitespacesCount()|0;let r,u;n===-1?(n=t,u=i+1,r=0):(u=this.getAfterLineNumberForWhitespaceIndex(n)|0,r=this.getHeightForWhitespaceIndex(n)|0);let f=a,c=f;const d=5e5;let s=0;a>=d&&(s=Math.floor(a/d)*d,s=Math.floor(s/v)*v,c-=s);const l=[],o=p+(_-p)/2;let g=-1;for(let w=b;w<=i;w++){if(g===-1){const D=f,I=f+v;(D<=o&&o<I||D>o)&&(g=w)}for(f+=v,l[w-b]=c,c+=v;u===w;)c+=r,f+=r,n++,n>=t?u=i+1:(u=this.getAfterLineNumberForWhitespaceIndex(n)|0,r=this.getHeightForWhitespaceIndex(n)|0);if(f>=_){i=w;break}}g===-1&&(g=i);const h=this.getVerticalOffsetForLineNumber(i)|0;let m=b,C=i;return m<C&&a<p&&m++,m<C&&h+v>_&&C--,{bigNumbersDelta:s,startLineNumber:b,endLineNumber:i,relativeVerticalOffset:l,centeredLineNumber:g,completelyVisibleStartLineNumber:m,completelyVisibleEndLineNumber:C}}getVerticalOffsetForWhitespaceIndex(p){this._checkPendingChanges(),p=p|0;const _=this.getAfterLineNumberForWhitespaceIndex(p);let v;_>=1?v=this._lineHeight*_:v=0;let b;return p>0?b=this.getWhitespacesAccumulatedHeight(p-1):b=0,v+b+this._paddingTop}getWhitespaceIndexAtOrAfterVerticallOffset(p){this._checkPendingChanges(),p=p|0;let _=0,v=this.getWhitespacesCount()-1;if(v<0)return-1;const b=this.getVerticalOffsetForWhitespaceIndex(v),a=this.getHeightForWhitespaceIndex(v);if(p>=b+a)return-1;for(;_<v;){const i=Math.floor((_+v)/2),n=this.getVerticalOffsetForWhitespaceIndex(i),t=this.getHeightForWhitespaceIndex(i);if(p>=n+t)_=i+1;else{if(p>=n)return i;v=i}}return _}getWhitespaceAtVerticalOffset(p){this._checkPendingChanges(),p=p|0;const _=this.getWhitespaceIndexAtOrAfterVerticallOffset(p);if(_<0||_>=this.getWhitespacesCount())return null;const v=this.getVerticalOffsetForWhitespaceIndex(_);if(v>p)return null;const b=this.getHeightForWhitespaceIndex(_),a=this.getIdForWhitespaceIndex(_),i=this.getAfterLineNumberForWhitespaceIndex(_);return{id:a,afterLineNumber:i,verticalOffset:v,height:b}}getWhitespaceViewportData(p,_){this._checkPendingChanges(),p=p|0,_=_|0;const v=this.getWhitespaceIndexAtOrAfterVerticallOffset(p),b=this.getWhitespacesCount()-1;if(v<0)return[];const a=[];for(let i=v;i<=b;i++){const n=this.getVerticalOffsetForWhitespaceIndex(i),t=this.getHeightForWhitespaceIndex(i);if(n>=_)break;a.push({id:this.getIdForWhitespaceIndex(i),afterLineNumber:this.getAfterLineNumberForWhitespaceIndex(i),verticalOffset:n,height:t})}return a}getWhitespaces(){return this._checkPendingChanges(),this._arr.slice(0)}getWhitespacesCount(){return this._checkPendingChanges(),this._arr.length}getIdForWhitespaceIndex(p){return this._checkPendingChanges(),p=p|0,this._arr[p].id}getAfterLineNumberForWhitespaceIndex(p){return this._checkPendingChanges(),p=p|0,this._arr[p].afterLineNumber}getHeightForWhitespaceIndex(p){return this._checkPendingChanges(),p=p|0,this._arr[p].height}}e.LinesLayout=E,E.INSTANCE_COUNT=0}),define(se[545],oe([1,0,5]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewportData=void 0;class k{constructor(E,S,p,_){this.selections=E,this.startLineNumber=S.startLineNumber|0,this.endLineNumber=S.endLineNumber|0,this.relativeVerticalOffset=S.relativeVerticalOffset,this.bigNumbersDelta=S.bigNumbersDelta|0,this.whitespaceViewportData=p,this._model=_,this.visibleRange=new L.Range(S.startLineNumber,this._model.getLineMinColumn(S.startLineNumber),S.endLineNumber,this._model.getLineMaxColumn(S.endLineNumber))}getViewLineRenderingData(E){return this._model.getViewportViewLineRenderingData(this.visibleRange,E)}getDecorationsInViewport(){return this._model.getDecorationsInViewport(this.visibleRange)}}e.ViewportData=k}),define(se[86],oe([1,0,13,11,5]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OverviewRulerDecorationsGroup=e.ViewModelDecoration=e.SingleLineInlineDecoration=e.InlineDecoration=e.ViewLineRenderingData=e.ViewLineData=e.MinimapLinesRenderingData=e.Viewport=void 0;class E{constructor(t,r,u,f){this._viewportBrand=void 0,this.top=t|0,this.left=r|0,this.width=u|0,this.height=f|0}}e.Viewport=E;class S{constructor(t,r){this.tabSize=t,this.data=r}}e.MinimapLinesRenderingData=S;class p{constructor(t,r,u,f,c,d,s){this._viewLineDataBrand=void 0,this.content=t,this.continuesWithWrappedLine=r,this.minColumn=u,this.maxColumn=f,this.startVisibleColumn=c,this.tokens=d,this.inlineDecorations=s}}e.ViewLineData=p;class _{constructor(t,r,u,f,c,d,s,l,o,g){this.minColumn=t,this.maxColumn=r,this.content=u,this.continuesWithWrappedLine=f,this.isBasicASCII=_.isBasicASCII(u,d),this.containsRTL=_.containsRTL(u,this.isBasicASCII,c),this.tokens=s,this.inlineDecorations=l,this.tabSize=o,this.startVisibleColumn=g}static isBasicASCII(t,r){return r?k.isBasicASCII(t):!0}static containsRTL(t,r,u){return!r&&u?k.containsRTL(t):!1}}e.ViewLineRenderingData=_;class v{constructor(t,r,u){this.range=t,this.inlineClassName=r,this.type=u}}e.InlineDecoration=v;class b{constructor(t,r,u,f){this.startOffset=t,this.endOffset=r,this.inlineClassName=u,this.inlineClassNameAffectsLetterSpacing=f}toInlineDecoration(t){return new v(new y.Range(t,this.startOffset+1,t,this.endOffset+1),this.inlineClassName,this.inlineClassNameAffectsLetterSpacing?3:0)}}e.SingleLineInlineDecoration=b;class a{constructor(t,r){this._viewModelDecorationBrand=void 0,this.range=t,this.options=r}}e.ViewModelDecoration=a;class i{constructor(t,r,u){this.color=t,this.zIndex=r,this.data=u}static compareByRenderingProps(t,r){return t.zIndex===r.zIndex?t.color<r.color?-1:t.color>r.color?1:0:t.zIndex-r.zIndex}static equals(t,r){return t.color===r.color&&t.zIndex===r.zIndex&&L.equals(t.data,r.data)}static equalsArr(t,r){return L.equals(t,r,i.equals)}}e.OverviewRulerDecorationsGroup=i}),define(se[546],oe([1,0,41]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlyphMarginLanesModel=void 0;const k=L.GlyphMarginLane.Right;class y{constructor(S){this.persist=0,this._requiredLanes=1,this.lanes=new Uint8Array(Math.ceil((S+1)*k/8))}reset(S){const p=Math.ceil((S+1)*k/8);this.lanes.length<p?this.lanes=new Uint8Array(p):this.lanes.fill(0),this._requiredLanes=1}get requiredLanes(){return this._requiredLanes}push(S,p,_){_&&(this.persist|=1<<S-1);for(let v=p.startLineNumber;v<=p.endLineNumber;v++){const b=k*v+(S-1);this.lanes[b>>>3]|=1<<b%8,this._requiredLanes=Math.max(this._requiredLanes,this.countAtLine(v))}}getLanesAtLine(S){const p=[];let _=k*S;for(let v=0;v<k;v++)(this.persist&1<<v||this.lanes[_>>>3]&1<<_%8)&&p.push(v+1),_++;return p.length?p:[L.GlyphMarginLane.Center]}countAtLine(S){let p=k*S,_=0;for(let v=0;v<k;v++)(this.persist&1<<v||this.lanes[p>>>3]&1<<p%8)&&_++,p++;return _}}e.GlyphMarginLanesModel=y}),define(se[547],oe([1,0,94,10,114,86]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createModelLineProjection=void 0;function S(n,t){return n===null?t?_.INSTANCE:v.INSTANCE:new p(n,t)}e.createModelLineProjection=S;class p{constructor(t,r){this._projectionData=t,this._isVisible=r}isVisible(){return this._isVisible}setVisible(t){return this._isVisible=t,this}getProjectionData(){return this._projectionData}getViewLineCount(){return this._isVisible?this._projectionData.getOutputLineCount():0}getViewLineContent(t,r,u){this._assertVisible();const f=u>0?this._projectionData.breakOffsets[u-1]:0,c=this._projectionData.breakOffsets[u];let d;if(this._projectionData.injectionOffsets!==null){const s=this._projectionData.injectionOffsets.map((o,g)=>new y.LineInjectedText(0,0,o+1,this._projectionData.injectionOptions[g],0));d=y.LineInjectedText.applyInjectedText(t.getLineContent(r),s).substring(f,c)}else d=t.getValueInRange({startLineNumber:r,startColumn:f+1,endLineNumber:r,endColumn:c+1});return u>0&&(d=a(this._projectionData.wrappedTextIndentLength)+d),d}getViewLineLength(t,r,u){return this._assertVisible(),this._projectionData.getLineLength(u)}getViewLineMinColumn(t,r,u){return this._assertVisible(),this._projectionData.getMinOutputOffset(u)+1}getViewLineMaxColumn(t,r,u){return this._assertVisible(),this._projectionData.getMaxOutputOffset(u)+1}getViewLineData(t,r,u){const f=new Array;return this.getViewLinesData(t,r,u,1,0,[!0],f),f[0]}getViewLinesData(t,r,u,f,c,d,s){this._assertVisible();const l=this._projectionData,o=l.injectionOffsets,g=l.injectionOptions;let h=null;if(o){h=[];let C=0,w=0;for(let D=0;D<l.getOutputLineCount();D++){const I=new Array;h[D]=I;const T=D>0?l.breakOffsets[D-1]:0,A=l.breakOffsets[D];for(;w<o.length;){const P=g[w].content.length,N=o[w]+C,M=N+P;if(N>A)break;if(T<M){const R=g[w];if(R.inlineClassName){const x=D>0?l.wrappedTextIndentLength:0,O=x+Math.max(N-T,0),B=x+Math.min(M-T,A-T);O!==B&&I.push(new E.SingleLineInlineDecoration(O,B,R.inlineClassName,R.inlineClassNameAffectsLetterSpacing))}}if(M<=A)C+=P,w++;else break}}}let m;o?m=t.tokenization.getLineTokens(r).withInserted(o.map((C,w)=>({offset:C,text:g[w].content,tokenMetadata:L.LineTokens.defaultTokenMetadata}))):m=t.tokenization.getLineTokens(r);for(let C=u;C<u+f;C++){const w=c+C-u;if(!d[w]){s[w]=null;continue}s[w]=this._getViewLineData(m,h?h[C]:null,C)}}_getViewLineData(t,r,u){this._assertVisible();const f=this._projectionData,c=u>0?f.wrappedTextIndentLength:0,d=u>0?f.breakOffsets[u-1]:0,s=f.breakOffsets[u],l=t.sliceAndInflate(d,s,c);let o=l.getLineContent();u>0&&(o=a(f.wrappedTextIndentLength)+o);const g=this._projectionData.getMinOutputOffset(u)+1,h=o.length+1,m=u+1<this.getViewLineCount(),C=u===0?0:f.breakOffsetsVisibleColumn[u-1];return new E.ViewLineData(o,m,g,h,C,l,r)}getModelColumnOfViewPosition(t,r){return this._assertVisible(),this._projectionData.translateToInputOffset(t,r-1)+1}getViewPositionOfModelPosition(t,r,u=2){return this._assertVisible(),this._projectionData.translateToOutputPosition(r-1,u).toPosition(t)}getViewLineNumberOfModelPosition(t,r){this._assertVisible();const u=this._projectionData.translateToOutputPosition(r-1);return t+u.outputLineIndex}normalizePosition(t,r,u){const f=r.lineNumber-t;return this._projectionData.normalizeOutputPosition(t,r.column-1,u).toPosition(f)}getInjectedTextAt(t,r){return this._projectionData.getInjectedText(t,r-1)}_assertVisible(){if(!this._isVisible)throw new Error("Not supported")}}class _{constructor(){}isVisible(){return!0}setVisible(t){return t?this:v.INSTANCE}getProjectionData(){return null}getViewLineCount(){return 1}getViewLineContent(t,r,u){return t.getLineContent(r)}getViewLineLength(t,r,u){return t.getLineLength(r)}getViewLineMinColumn(t,r,u){return t.getLineMinColumn(r)}getViewLineMaxColumn(t,r,u){return t.getLineMaxColumn(r)}getViewLineData(t,r,u){const f=t.tokenization.getLineTokens(r),c=f.getLineContent();return new E.ViewLineData(c,!1,1,c.length+1,0,f.inflate(),null)}getViewLinesData(t,r,u,f,c,d,s){if(!d[c]){s[c]=null;return}s[c]=this.getViewLineData(t,r,0)}getModelColumnOfViewPosition(t,r){return r}getViewPositionOfModelPosition(t,r){return new k.Position(t,r)}getViewLineNumberOfModelPosition(t,r){return t}normalizePosition(t,r,u){return r}getInjectedTextAt(t,r){return null}}_.INSTANCE=new _;class v{constructor(){}isVisible(){return!1}setVisible(t){return t?_.INSTANCE:this}getProjectionData(){return null}getViewLineCount(){return 0}getViewLineContent(t,r,u){throw new Error("Not supported")}getViewLineLength(t,r,u){throw new Error("Not supported")}getViewLineMinColumn(t,r,u){throw new Error("Not supported")}getViewLineMaxColumn(t,r,u){throw new Error("Not supported")}getViewLineData(t,r,u){throw new Error("Not supported")}getViewLinesData(t,r,u,f,c,d,s){throw new Error("Not supported")}getModelColumnOfViewPosition(t,r){throw new Error("Not supported")}getViewPositionOfModelPosition(t,r){throw new Error("Not supported")}getViewLineNumberOfModelPosition(t,r){throw new Error("Not supported")}normalizePosition(t,r,u){throw new Error("Not supported")}getInjectedTextAt(t,r){throw new Error("Not supported")}}v.INSTANCE=new v;const b=[""];function a(n){if(n>=b.length)for(let t=1;t<=n;t++)b[t]=i(t);return b[n]}function i(n){return new Array(n+1).join(" ")}}),define(se[548],oe([1,0,11,128,114,294]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MonospaceLineBreaksComputerFactory=void 0;class S{static create(f){return new S(f.get(132),f.get(131))}constructor(f,c){this.classifier=new p(f,c)}createLineBreaksComputer(f,c,d,s,l){const o=[],g=[],h=[];return{addRequest:(m,C,w)=>{o.push(m),g.push(C),h.push(w)},finalize:()=>{const m=f.typicalFullwidthCharacterWidth/f.typicalHalfwidthCharacterWidth,C=[];for(let w=0,D=o.length;w<D;w++){const I=g[w],T=h[w];T&&!T.injectionOptions&&!I?C[w]=b(this.classifier,T,o[w],c,d,m,s,l):C[w]=a(this.classifier,o[w],I,c,d,m,s,l)}return _.length=0,v.length=0,C}}}}e.MonospaceLineBreaksComputerFactory=S;class p extends k.CharacterClassifier{constructor(f,c){super(0);for(let d=0;d<f.length;d++)this.set(f.charCodeAt(d),1);for(let d=0;d<c.length;d++)this.set(c.charCodeAt(d),2)}get(f){return f>=0&&f<256?this._asciiMap[f]:f>=12352&&f<=12543||f>=13312&&f<=19903||f>=19968&&f<=40959?3:this._map.get(f)||this._defaultValue}}let _=[],v=[];function b(u,f,c,d,s,l,o,g){if(s===-1)return null;const h=c.length;if(h<=1)return null;const m=g==="keepAll",C=f.breakOffsets,w=f.breakOffsetsVisibleColumn,D=r(c,d,s,l,o),I=s-D,T=_,A=v;let P=0,N=0,M=0,R=s;const x=C.length;let O=0;if(O>=0){let B=Math.abs(w[O]-R);for(;O+1<x;){const W=Math.abs(w[O+1]-R);if(W>=B)break;B=W,O++}}for(;O<x;){let B=O<0?0:C[O],W=O<0?0:w[O];N>B&&(B=N,W=M);let V=0,K=0,F=0,q=0;if(W<=R){let ae=W,ne=B===0?0:c.charCodeAt(B-1),$=B===0?0:u.get(ne),J=!0;for(let Q=B;Q<h;Q++){const re=Q,de=c.charCodeAt(Q);let he,me;if(L.isHighSurrogate(de)?(Q++,he=0,me=2):(he=u.get(de),me=i(de,ae,d,l)),re>N&&t(ne,$,de,he,m)&&(V=re,K=ae),ae+=me,ae>R){re>N?(F=re,q=ae-me):(F=Q+1,q=ae),ae-K>I&&(V=0),J=!1;break}ne=de,$=he}if(J){P>0&&(T[P]=C[C.length-1],A[P]=w[C.length-1],P++);break}}if(V===0){let ae=W,ne=c.charCodeAt(B),$=u.get(ne),J=!1;for(let Q=B-1;Q>=N;Q--){const re=Q+1,de=c.charCodeAt(Q);if(de===9){J=!0;break}let he,me;if(L.isLowSurrogate(de)?(Q--,he=0,me=2):(he=u.get(de),me=L.isFullWidthCharacter(de)?l:1),ae<=R){if(F===0&&(F=re,q=ae),ae<=R-I)break;if(t(de,he,ne,$,m)){V=re,K=ae;break}}ae-=me,ne=de,$=he}if(V!==0){const Q=I-(q-K);if(Q<=d){const re=c.charCodeAt(F);let de;L.isHighSurrogate(re)?de=2:de=i(re,q,d,l),Q-de<0&&(V=0)}}if(J){O--;continue}}if(V===0&&(V=F,K=q),V<=N){const ae=c.charCodeAt(N);L.isHighSurrogate(ae)?(V=N+2,K=M+2):(V=N+1,K=M+i(ae,M,d,l))}for(N=V,T[P]=V,M=K,A[P]=K,P++,R=K+I;O<0||O<x&&w[O]<K;)O++;let ie=Math.abs(w[O]-R);for(;O+1<x;){const ae=Math.abs(w[O+1]-R);if(ae>=ie)break;ie=ae,O++}}return P===0?null:(T.length=P,A.length=P,_=f.breakOffsets,v=f.breakOffsetsVisibleColumn,f.breakOffsets=T,f.breakOffsetsVisibleColumn=A,f.wrappedTextIndentLength=D,f)}function a(u,f,c,d,s,l,o,g){const h=y.LineInjectedText.applyInjectedText(f,c);let m,C;if(c&&c.length>0?(m=c.map(K=>K.options),C=c.map(K=>K.column-1)):(m=null,C=null),s===-1)return m?new E.ModelLineProjectionData(C,m,[h.length],[],0):null;const w=h.length;if(w<=1)return m?new E.ModelLineProjectionData(C,m,[h.length],[],0):null;const D=g==="keepAll",I=r(h,d,s,l,o),T=s-I,A=[],P=[];let N=0,M=0,R=0,x=s,O=h.charCodeAt(0),B=u.get(O),W=i(O,0,d,l),V=1;L.isHighSurrogate(O)&&(W+=1,O=h.charCodeAt(1),B=u.get(O),V++);for(let K=V;K<w;K++){const F=K,q=h.charCodeAt(K);let ie,ae;L.isHighSurrogate(q)?(K++,ie=0,ae=2):(ie=u.get(q),ae=i(q,W,d,l)),t(O,B,q,ie,D)&&(M=F,R=W),W+=ae,W>x&&((M===0||W-R>T)&&(M=F,R=W-ae),A[N]=M,P[N]=R,N++,x=R+T,M=0),O=q,B=ie}return N===0&&(!c||c.length===0)?null:(A[N]=w,P[N]=W,new E.ModelLineProjectionData(C,m,A,P,I))}function i(u,f,c,d){return u===9?c-f%c:L.isFullWidthCharacter(u)||u<32?d:1}function n(u,f){return f-u%f}function t(u,f,c,d,s){return c!==32&&(f===2&&d!==2||f!==1&&d===1||!s&&f===3&&d!==2||!s&&d===3&&f!==1)}function r(u,f,c,d,s){let l=0;if(s!==0){const o=L.firstNonWhitespaceIndex(u);if(o!==-1){for(let h=0;h<o;h++){const m=u.charCodeAt(h)===9?n(l,f):1;l+=m}const g=s===3?2:s===2?1:0;for(let h=0;h<g;h++){const m=n(l,f);l+=m}l+d>c&&(l=0)}}return l}}),define(se[300],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OverviewZoneManager=e.OverviewRulerZone=e.ColorZone=void 0;class L{constructor(S,p,_){this._colorZoneBrand=void 0,this.from=S|0,this.to=p|0,this.colorId=_|0}static compare(S,p){return S.colorId===p.colorId?S.from===p.from?S.to-p.to:S.from-p.from:S.colorId-p.colorId}}e.ColorZone=L;class k{constructor(S,p,_,v){this._overviewRulerZoneBrand=void 0,this.startLineNumber=S,this.endLineNumber=p,this.heightInLines=_,this.color=v,this._colorZone=null}static compare(S,p){return S.color===p.color?S.startLineNumber===p.startLineNumber?S.heightInLines===p.heightInLines?S.endLineNumber-p.endLineNumber:S.heightInLines-p.heightInLines:S.startLineNumber-p.startLineNumber:S.color<p.color?-1:1}setColorZone(S){this._colorZone=S}getColorZones(){return this._colorZone}}e.OverviewRulerZone=k;class y{constructor(S){this._getVerticalOffsetForLine=S,this._zones=[],this._colorZonesInvalid=!1,this._lineHeight=0,this._domWidth=0,this._domHeight=0,this._outerHeight=0,this._pixelRatio=1,this._lastAssignedId=0,this._color2Id=Object.create(null),this._id2Color=[]}getId2Color(){return this._id2Color}setZones(S){this._zones=S,this._zones.sort(k.compare)}setLineHeight(S){return this._lineHeight===S?!1:(this._lineHeight=S,this._colorZonesInvalid=!0,!0)}setPixelRatio(S){this._pixelRatio=S,this._colorZonesInvalid=!0}getDOMWidth(){return this._domWidth}getCanvasWidth(){return this._domWidth*this._pixelRatio}setDOMWidth(S){return this._domWidth===S?!1:(this._domWidth=S,this._colorZonesInvalid=!0,!0)}getDOMHeight(){return this._domHeight}getCanvasHeight(){return this._domHeight*this._pixelRatio}setDOMHeight(S){return this._domHeight===S?!1:(this._domHeight=S,this._colorZonesInvalid=!0,!0)}getOuterHeight(){return this._outerHeight}setOuterHeight(S){return this._outerHeight===S?!1:(this._outerHeight=S,this._colorZonesInvalid=!0,!0)}resolveColorZones(){const S=this._colorZonesInvalid,p=Math.floor(this._lineHeight),_=Math.floor(this.getCanvasHeight()),v=Math.floor(this._outerHeight),b=_/v,a=Math.floor(4*this._pixelRatio/2),i=[];for(let n=0,t=this._zones.length;n<t;n++){const r=this._zones[n];if(!S){const m=r.getColorZones();if(m){i.push(m);continue}}const u=this._getVerticalOffsetForLine(r.startLineNumber),f=r.heightInLines===0?this._getVerticalOffsetForLine(r.endLineNumber)+p:u+r.heightInLines*p,c=Math.floor(b*u),d=Math.floor(b*f);let s=Math.floor((c+d)/2),l=d-s;l<a&&(l=a),s-l<0&&(s=l),s+l>_&&(s=_-l);const o=r.color;let g=this._color2Id[o];g||(g=++this._lastAssignedId,this._color2Id[o]=g,this._id2Color[g]=o);const h=new L(s-l,s+l,g);r.setColorZone(h),i.push(h)}return this._colorZonesInvalid=!1,i.sort(L.compare),i}}e.OverviewZoneManager=y}),define(se[549],oe([1,0,40,300,154]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OverviewRuler=void 0;class E extends y.ViewEventHandler{constructor(p,_){super(),this._context=p;const v=this._context.configuration.options;this._domNode=(0,L.createFastDomNode)(document.createElement("canvas")),this._domNode.setClassName(_),this._domNode.setPosition("absolute"),this._domNode.setLayerHinting(!0),this._domNode.setContain("strict"),this._zoneManager=new k.OverviewZoneManager(b=>this._context.viewLayout.getVerticalOffsetForLineNumber(b)),this._zoneManager.setDOMWidth(0),this._zoneManager.setDOMHeight(0),this._zoneManager.setOuterHeight(this._context.viewLayout.getScrollHeight()),this._zoneManager.setLineHeight(v.get(66)),this._zoneManager.setPixelRatio(v.get(141)),this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}onConfigurationChanged(p){const _=this._context.configuration.options;return p.hasChanged(66)&&(this._zoneManager.setLineHeight(_.get(66)),this._render()),p.hasChanged(141)&&(this._zoneManager.setPixelRatio(_.get(141)),this._domNode.setWidth(this._zoneManager.getDOMWidth()),this._domNode.setHeight(this._zoneManager.getDOMHeight()),this._domNode.domNode.width=this._zoneManager.getCanvasWidth(),this._domNode.domNode.height=this._zoneManager.getCanvasHeight(),this._render()),!0}onFlushed(p){return this._render(),!0}onScrollChanged(p){return p.scrollHeightChanged&&(this._zoneManager.setOuterHeight(p.scrollHeight),this._render()),!0}onZonesChanged(p){return this._render(),!0}getDomNode(){return this._domNode.domNode}setLayout(p){this._domNode.setTop(p.top),this._domNode.setRight(p.right);let _=!1;_=this._zoneManager.setDOMWidth(p.width)||_,_=this._zoneManager.setDOMHeight(p.height)||_,_&&(this._domNode.setWidth(this._zoneManager.getDOMWidth()),this._domNode.setHeight(this._zoneManager.getDOMHeight()),this._domNode.domNode.width=this._zoneManager.getCanvasWidth(),this._domNode.domNode.height=this._zoneManager.getCanvasHeight(),this._render())}setZones(p){this._zoneManager.setZones(p),this._render()}_render(){if(this._zoneManager.getOuterHeight()===0)return!1;const p=this._zoneManager.getCanvasWidth(),_=this._zoneManager.getCanvasHeight(),v=this._zoneManager.resolveColorZones(),b=this._zoneManager.getId2Color(),a=this._domNode.domNode.getContext("2d");return a.clearRect(0,0,p,_),v.length>0&&this._renderOneLane(a,v,b,p),!0}_renderOneLane(p,_,v,b){let a=0,i=0,n=0;for(const t of _){const r=t.colorId,u=t.from,f=t.to;r!==a?(p.fillRect(0,i,b,n-i),a=r,p.fillStyle=v[a],i=u,n=f):n>=u?n=Math.max(n,f):(p.fillRect(0,i,b,n-i),i=u,n=f)}p.fillRect(0,i,b,n-i)}}e.OverviewRuler=E}),define(se[550],oe([1,0,508]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewContext=void 0;class k{constructor(E,S,p){this.configuration=E,this.theme=new L.EditorTheme(S),this.viewModel=p,this.viewLayout=p.viewLayout}addEventHandler(E){this.viewModel.addViewEventHandler(E)}removeEventHandler(E){this.viewModel.removeViewEventHandler(E)}}e.ViewContext=k}),define(se[215],oe([1,0,6,2]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ModelTokensChangedEvent=e.ModelOptionsChangedEvent=e.ModelContentChangedEvent=e.ModelLanguageConfigurationChangedEvent=e.ModelLanguageChangedEvent=e.ModelDecorationsChangedEvent=e.ReadOnlyEditAttemptEvent=e.CursorStateChangedEvent=e.HiddenAreasChangedEvent=e.ViewZonesChangedEvent=e.ScrollChangedEvent=e.FocusChangedEvent=e.ContentSizeChangedEvent=e.ViewModelEventsCollector=e.ViewModelEventDispatcher=void 0;class y extends k.Disposable{constructor(){super(),this._onEvent=this._register(new L.Emitter),this.onEvent=this._onEvent.event,this._eventHandlers=[],this._viewEventQueue=null,this._isConsumingViewEventQueue=!1,this._collector=null,this._collectorCnt=0,this._outgoingEvents=[]}emitOutgoingEvent(s){this._addOutgoingEvent(s),this._emitOutgoingEvents()}_addOutgoingEvent(s){for(let l=0,o=this._outgoingEvents.length;l<o;l++){const g=this._outgoingEvents[l].kind===s.kind?this._outgoingEvents[l].attemptToMerge(s):null;if(g){this._outgoingEvents[l]=g;return}}this._outgoingEvents.push(s)}_emitOutgoingEvents(){for(;this._outgoingEvents.length>0;){if(this._collector||this._isConsumingViewEventQueue)return;const s=this._outgoingEvents.shift();s.isNoOp()||this._onEvent.fire(s)}}addViewEventHandler(s){for(let l=0,o=this._eventHandlers.length;l<o;l++)this._eventHandlers[l]===s&&console.warn("Detected duplicate listener in ViewEventDispatcher",s);this._eventHandlers.push(s)}removeViewEventHandler(s){for(let l=0;l<this._eventHandlers.length;l++)if(this._eventHandlers[l]===s){this._eventHandlers.splice(l,1);break}}beginEmitViewEvents(){return this._collectorCnt++,this._collectorCnt===1&&(this._collector=new E),this._collector}endEmitViewEvents(){if(this._collectorCnt--,this._collectorCnt===0){const s=this._collector.outgoingEvents,l=this._collector.viewEvents;this._collector=null;for(const o of s)this._addOutgoingEvent(o);l.length>0&&this._emitMany(l)}this._emitOutgoingEvents()}emitSingleViewEvent(s){try{this.beginEmitViewEvents().emitViewEvent(s)}finally{this.endEmitViewEvents()}}_emitMany(s){this._viewEventQueue?this._viewEventQueue=this._viewEventQueue.concat(s):this._viewEventQueue=s,this._isConsumingViewEventQueue||this._consumeViewEventQueue()}_consumeViewEventQueue(){try{this._isConsumingViewEventQueue=!0,this._doConsumeQueue()}finally{this._isConsumingViewEventQueue=!1}}_doConsumeQueue(){for(;this._viewEventQueue;){const s=this._viewEventQueue;this._viewEventQueue=null;const l=this._eventHandlers.slice(0);for(const o of l)o.handleEvents(s)}}}e.ViewModelEventDispatcher=y;class E{constructor(){this.viewEvents=[],this.outgoingEvents=[]}emitViewEvent(s){this.viewEvents.push(s)}emitOutgoingEvent(s){this.outgoingEvents.push(s)}}e.ViewModelEventsCollector=E;class S{constructor(s,l,o,g){this.kind=0,this._oldContentWidth=s,this._oldContentHeight=l,this.contentWidth=o,this.contentHeight=g,this.contentWidthChanged=this._oldContentWidth!==this.contentWidth,this.contentHeightChanged=this._oldContentHeight!==this.contentHeight}isNoOp(){return!this.contentWidthChanged&&!this.contentHeightChanged}attemptToMerge(s){return s.kind!==this.kind?null:new S(this._oldContentWidth,this._oldContentHeight,s.contentWidth,s.contentHeight)}}e.ContentSizeChangedEvent=S;class p{constructor(s,l){this.kind=1,this.oldHasFocus=s,this.hasFocus=l}isNoOp(){return this.oldHasFocus===this.hasFocus}attemptToMerge(s){return s.kind!==this.kind?null:new p(this.oldHasFocus,s.hasFocus)}}e.FocusChangedEvent=p;class _{constructor(s,l,o,g,h,m,C,w){this.kind=2,this._oldScrollWidth=s,this._oldScrollLeft=l,this._oldScrollHeight=o,this._oldScrollTop=g,this.scrollWidth=h,this.scrollLeft=m,this.scrollHeight=C,this.scrollTop=w,this.scrollWidthChanged=this._oldScrollWidth!==this.scrollWidth,this.scrollLeftChanged=this._oldScrollLeft!==this.scrollLeft,this.scrollHeightChanged=this._oldScrollHeight!==this.scrollHeight,this.scrollTopChanged=this._oldScrollTop!==this.scrollTop}isNoOp(){return!this.scrollWidthChanged&&!this.scrollLeftChanged&&!this.scrollHeightChanged&&!this.scrollTopChanged}attemptToMerge(s){return s.kind!==this.kind?null:new _(this._oldScrollWidth,this._oldScrollLeft,this._oldScrollHeight,this._oldScrollTop,s.scrollWidth,s.scrollLeft,s.scrollHeight,s.scrollTop)}}e.ScrollChangedEvent=_;class v{constructor(){this.kind=3}isNoOp(){return!1}attemptToMerge(s){return s.kind!==this.kind?null:this}}e.ViewZonesChangedEvent=v;class b{constructor(){this.kind=4}isNoOp(){return!1}attemptToMerge(s){return s.kind!==this.kind?null:this}}e.HiddenAreasChangedEvent=b;class a{constructor(s,l,o,g,h,m,C){this.kind=6,this.oldSelections=s,this.selections=l,this.oldModelVersionId=o,this.modelVersionId=g,this.source=h,this.reason=m,this.reachedMaxCursorCount=C}static _selectionsAreEqual(s,l){if(!s&&!l)return!0;if(!s||!l)return!1;const o=s.length,g=l.length;if(o!==g)return!1;for(let h=0;h<o;h++)if(!s[h].equalsSelection(l[h]))return!1;return!0}isNoOp(){return a._selectionsAreEqual(this.oldSelections,this.selections)&&this.oldModelVersionId===this.modelVersionId}attemptToMerge(s){return s.kind!==this.kind?null:new a(this.oldSelections,s.selections,this.oldModelVersionId,s.modelVersionId,s.source,s.reason,this.reachedMaxCursorCount||s.reachedMaxCursorCount)}}e.CursorStateChangedEvent=a;class i{constructor(){this.kind=5}isNoOp(){return!1}attemptToMerge(s){return s.kind!==this.kind?null:this}}e.ReadOnlyEditAttemptEvent=i;class n{constructor(s){this.event=s,this.kind=7}isNoOp(){return!1}attemptToMerge(s){return null}}e.ModelDecorationsChangedEvent=n;class t{constructor(s){this.event=s,this.kind=8}isNoOp(){return!1}attemptToMerge(s){return null}}e.ModelLanguageChangedEvent=t;class r{constructor(s){this.event=s,this.kind=9}isNoOp(){return!1}attemptToMerge(s){return null}}e.ModelLanguageConfigurationChangedEvent=r;class u{constructor(s){this.event=s,this.kind=10}isNoOp(){return!1}attemptToMerge(s){return null}}e.ModelContentChangedEvent=u;class f{constructor(s){this.event=s,this.kind=11}isNoOp(){return!1}attemptToMerge(s){return null}}e.ModelOptionsChangedEvent=f;class c{constructor(s){this.event=s,this.kind=12}isNoOp(){return!1}attemptToMerge(s){return null}}e.ModelTokensChangedEvent=c}),define(se[551],oe([1,0,6,2,147,544,86,215]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewLayout=void 0;const _=125;class v{constructor(n,t,r,u){n=n|0,t=t|0,r=r|0,u=u|0,n<0&&(n=0),t<0&&(t=0),r<0&&(r=0),u<0&&(u=0),this.width=n,this.contentWidth=t,this.scrollWidth=Math.max(n,t),this.height=r,this.contentHeight=u,this.scrollHeight=Math.max(r,u)}equals(n){return this.width===n.width&&this.contentWidth===n.contentWidth&&this.height===n.height&&this.contentHeight===n.contentHeight}}class b extends k.Disposable{constructor(n,t){super(),this._onDidContentSizeChange=this._register(new L.Emitter),this.onDidContentSizeChange=this._onDidContentSizeChange.event,this._dimensions=new v(0,0,0,0),this._scrollable=this._register(new y.Scrollable({forceIntegerValues:!0,smoothScrollDuration:n,scheduleAtNextAnimationFrame:t})),this.onDidScroll=this._scrollable.onScroll}getScrollable(){return this._scrollable}setSmoothScrollDuration(n){this._scrollable.setSmoothScrollDuration(n)}validateScrollPosition(n){return this._scrollable.validateScrollPosition(n)}getScrollDimensions(){return this._dimensions}setScrollDimensions(n){if(this._dimensions.equals(n))return;const t=this._dimensions;this._dimensions=n,this._scrollable.setScrollDimensions({width:n.width,scrollWidth:n.scrollWidth,height:n.height,scrollHeight:n.scrollHeight},!0);const r=t.contentWidth!==n.contentWidth,u=t.contentHeight!==n.contentHeight;(r||u)&&this._onDidContentSizeChange.fire(new p.ContentSizeChangedEvent(t.contentWidth,t.contentHeight,n.contentWidth,n.contentHeight))}getFutureScrollPosition(){return this._scrollable.getFutureScrollPosition()}getCurrentScrollPosition(){return this._scrollable.getCurrentScrollPosition()}setScrollPositionNow(n){this._scrollable.setScrollPositionNow(n)}setScrollPositionSmooth(n){this._scrollable.setScrollPositionSmooth(n)}hasPendingScrollAnimation(){return this._scrollable.hasPendingScrollAnimation()}}class a extends k.Disposable{constructor(n,t,r){super(),this._configuration=n;const u=this._configuration.options,f=u.get(143),c=u.get(83);this._linesLayout=new E.LinesLayout(t,u.get(66),c.top,c.bottom),this._maxLineWidth=0,this._overlayWidgetsMinWidth=0,this._scrollable=this._register(new b(0,r)),this._configureSmoothScrollDuration(),this._scrollable.setScrollDimensions(new v(f.contentWidth,0,f.height,0)),this.onDidScroll=this._scrollable.onDidScroll,this.onDidContentSizeChange=this._scrollable.onDidContentSizeChange,this._updateHeight()}dispose(){super.dispose()}getScrollable(){return this._scrollable.getScrollable()}onHeightMaybeChanged(){this._updateHeight()}_configureSmoothScrollDuration(){this._scrollable.setSmoothScrollDuration(this._configuration.options.get(113)?_:0)}onConfigurationChanged(n){const t=this._configuration.options;if(n.hasChanged(66)&&this._linesLayout.setLineHeight(t.get(66)),n.hasChanged(83)){const r=t.get(83);this._linesLayout.setPadding(r.top,r.bottom)}if(n.hasChanged(143)){const r=t.get(143),u=r.contentWidth,f=r.height,c=this._scrollable.getScrollDimensions(),d=c.contentWidth;this._scrollable.setScrollDimensions(new v(u,c.contentWidth,f,this._getContentHeight(u,f,d)))}else this._updateHeight();n.hasChanged(113)&&this._configureSmoothScrollDuration()}onFlushed(n){this._linesLayout.onFlushed(n)}onLinesDeleted(n,t){this._linesLayout.onLinesDeleted(n,t)}onLinesInserted(n,t){this._linesLayout.onLinesInserted(n,t)}_getHorizontalScrollbarHeight(n,t){const u=this._configuration.options.get(102);return u.horizontal===2||n>=t?0:u.horizontalScrollbarSize}_getContentHeight(n,t,r){const u=this._configuration.options;let f=this._linesLayout.getLinesTotalHeight();return u.get(104)?f+=Math.max(0,t-u.get(66)-u.get(83).bottom):u.get(102).ignoreHorizontalScrollbarInContentHeight||(f+=this._getHorizontalScrollbarHeight(n,r)),f}_updateHeight(){const n=this._scrollable.getScrollDimensions(),t=n.width,r=n.height,u=n.contentWidth;this._scrollable.setScrollDimensions(new v(t,n.contentWidth,r,this._getContentHeight(t,r,u)))}getCurrentViewport(){const n=this._scrollable.getScrollDimensions(),t=this._scrollable.getCurrentScrollPosition();return new S.Viewport(t.scrollTop,t.scrollLeft,n.width,n.height)}getFutureViewport(){const n=this._scrollable.getScrollDimensions(),t=this._scrollable.getFutureScrollPosition();return new S.Viewport(t.scrollTop,t.scrollLeft,n.width,n.height)}_computeContentWidth(){const n=this._configuration.options,t=this._maxLineWidth,r=n.get(144),u=n.get(50),f=n.get(143);if(r.isViewportWrapping){const c=n.get(72);return t>f.contentWidth+u.typicalHalfwidthCharacterWidth&&c.enabled&&c.side==="right"?t+f.verticalScrollbarWidth:t}else{const c=n.get(103)*u.typicalHalfwidthCharacterWidth,d=this._linesLayout.getWhitespaceMinWidth();return Math.max(t+c+f.verticalScrollbarWidth,d,this._overlayWidgetsMinWidth)}}setMaxLineWidth(n){this._maxLineWidth=n,this._updateContentWidth()}setOverlayWidgetsMinWidth(n){this._overlayWidgetsMinWidth=n,this._updateContentWidth()}_updateContentWidth(){const n=this._scrollable.getScrollDimensions();this._scrollable.setScrollDimensions(new v(n.width,this._computeContentWidth(),n.height,n.contentHeight)),this._updateHeight()}saveState(){const n=this._scrollable.getFutureScrollPosition(),t=n.scrollTop,r=this._linesLayout.getLineNumberAtOrAfterVerticalOffset(t),u=this._linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(r);return{scrollTop:t,scrollTopWithoutViewZones:t-u,scrollLeft:n.scrollLeft}}changeWhitespace(n){const t=this._linesLayout.changeWhitespace(n);return t&&this.onHeightMaybeChanged(),t}getVerticalOffsetForLineNumber(n,t=!1){return this._linesLayout.getVerticalOffsetForLineNumber(n,t)}getVerticalOffsetAfterLineNumber(n,t=!1){return this._linesLayout.getVerticalOffsetAfterLineNumber(n,t)}isAfterLines(n){return this._linesLayout.isAfterLines(n)}isInTopPadding(n){return this._linesLayout.isInTopPadding(n)}isInBottomPadding(n){return this._linesLayout.isInBottomPadding(n)}getLineNumberAtVerticalOffset(n){return this._linesLayout.getLineNumberAtOrAfterVerticalOffset(n)}getWhitespaceAtVerticalOffset(n){return this._linesLayout.getWhitespaceAtVerticalOffset(n)}getLinesViewportData(){const n=this.getCurrentViewport();return this._linesLayout.getLinesViewportData(n.top,n.top+n.height)}getLinesViewportDataAtScrollTop(n){const t=this._scrollable.getScrollDimensions();return n+t.height>t.scrollHeight&&(n=t.scrollHeight-t.height),n<0&&(n=0),this._linesLayout.getLinesViewportData(n,n+t.height)}getWhitespaceViewportData(){const n=this.getCurrentViewport();return this._linesLayout.getWhitespaceViewportData(n.top,n.top+n.height)}getWhitespaces(){return this._linesLayout.getWhitespaces()}getContentWidth(){return this._scrollable.getScrollDimensions().contentWidth}getScrollWidth(){return this._scrollable.getScrollDimensions().scrollWidth}getContentHeight(){return this._scrollable.getScrollDimensions().contentHeight}getScrollHeight(){return this._scrollable.getScrollDimensions().scrollHeight}getCurrentScrollLeft(){return this._scrollable.getCurrentScrollPosition().scrollLeft}getCurrentScrollTop(){return this._scrollable.getCurrentScrollPosition().scrollTop}validateScrollPosition(n){return this._scrollable.validateScrollPosition(n)}setScrollPosition(n,t){t===1?this._scrollable.setScrollPositionNow(n):this._scrollable.setScrollPositionSmooth(n)}hasPendingScrollAnimation(){return this._scrollable.hasPendingScrollAnimation()}deltaScrollNow(n,t){const r=this._scrollable.getCurrentScrollPosition();this._scrollable.setScrollPositionNow({scrollLeft:r.scrollLeft+n,scrollTop:r.scrollTop+t})}}e.ViewLayout=a}),define(se[552],oe([1,0,5,24]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MoveCaretCommand=void 0;class y{constructor(S,p){this._selection=S,this._isMovingLeft=p}getEditOperations(S,p){if(this._selection.startLineNumber!==this._selection.endLineNumber||this._selection.isEmpty())return;const _=this._selection.startLineNumber,v=this._selection.startColumn,b=this._selection.endColumn;if(!(this._isMovingLeft&&v===1)&&!(!this._isMovingLeft&&b===S.getLineMaxColumn(_)))if(this._isMovingLeft){const a=new L.Range(_,v-1,_,v),i=S.getValueInRange(a);p.addEditOperation(a,null),p.addEditOperation(new L.Range(_,b,_,b),i)}else{const a=new L.Range(_,b,_,b+1),i=S.getValueInRange(a);p.addEditOperation(a,null),p.addEditOperation(new L.Range(_,v,_,v),i)}}computeCursorState(S,p){return this._isMovingLeft?new k.Selection(this._selection.startLineNumber,this._selection.startColumn-1,this._selection.endLineNumber,this._selection.endColumn-1):new k.Selection(this._selection.startLineNumber,this._selection.startColumn+1,this._selection.endLineNumber,this._selection.endColumn+1)}}e.MoveCaretCommand=y}),define(se[116],oe([1,0,12]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionItem=e.CodeActionCommandArgs=e.filtersAction=e.mayIncludeActionsOfKind=e.CodeActionTriggerSource=e.CodeActionKind=void 0;class k{constructor(a){this.value=a}equals(a){return this.value===a.value}contains(a){return this.equals(a)||this.value===""||a.value.startsWith(this.value+k.sep)}intersects(a){return this.contains(a)||a.contains(this)}append(a){return new k(this.value+k.sep+a)}}e.CodeActionKind=k,k.sep=".",k.None=new k("@@none@@"),k.Empty=new k(""),k.QuickFix=new k("quickfix"),k.Refactor=new k("refactor"),k.RefactorExtract=k.Refactor.append("extract"),k.RefactorInline=k.Refactor.append("inline"),k.RefactorMove=k.Refactor.append("move"),k.RefactorRewrite=k.Refactor.append("rewrite"),k.Notebook=new k("notebook"),k.Source=new k("source"),k.SourceOrganizeImports=k.Source.append("organizeImports"),k.SourceFixAll=k.Source.append("fixAll"),k.SurroundWith=k.Refactor.append("surround");var y;(function(b){b.Refactor="refactor",b.RefactorPreview="refactor preview",b.Lightbulb="lightbulb",b.Default="other (default)",b.SourceAction="source action",b.QuickFix="quick fix action",b.FixAll="fix all",b.OrganizeImports="organize imports",b.AutoFix="auto fix",b.QuickFixHover="quick fix hover window",b.OnSave="save participants",b.ProblemsView="problems view"})(y||(e.CodeActionTriggerSource=y={}));function E(b,a){return!(b.include&&!b.include.intersects(a)||b.excludes&&b.excludes.some(i=>p(a,i,b.include))||!b.includeSourceActions&&k.Source.contains(a))}e.mayIncludeActionsOfKind=E;function S(b,a){const i=a.kind?new k(a.kind):void 0;return!(b.include&&(!i||!b.include.contains(i))||b.excludes&&i&&b.excludes.some(n=>p(i,n,b.include))||!b.includeSourceActions&&i&&k.Source.contains(i)||b.onlyIncludePreferredActions&&!a.isPreferred)}e.filtersAction=S;function p(b,a,i){return!(!a.contains(b)||i&&a.contains(i))}class _{static fromUser(a,i){return!a||typeof a!="object"?new _(i.kind,i.apply,!1):new _(_.getKindFromUser(a,i.kind),_.getApplyFromUser(a,i.apply),_.getPreferredUser(a))}static getApplyFromUser(a,i){switch(typeof a.apply=="string"?a.apply.toLowerCase():""){case"first":return"first";case"never":return"never";case"ifsingle":return"ifSingle";default:return i}}static getKindFromUser(a,i){return typeof a.kind=="string"?new k(a.kind):i}static getPreferredUser(a){return typeof a.preferred=="boolean"?a.preferred:!1}constructor(a,i,n){this.kind=a,this.apply=i,this.preferred=n}}e.CodeActionCommandArgs=_;class v{constructor(a,i,n){this.action=a,this.provider=i,this.highlightRange=n}async resolve(a){var i;if(!((i=this.provider)===null||i===void 0)&&i.resolveCodeAction&&!this.action.edit){let n;try{n=await this.provider.resolveCodeAction(this.action,a)}catch(t){(0,L.onUnexpectedExternalError)(t)}n&&(this.action.edit=n.edit)}return this}}e.CodeActionItem=v}),define(se[553],oe([1,0,6]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorPickerModel=void 0;class k{get color(){return this._color}set color(E){this._color.equals(E)||(this._color=E,this._onDidChangeColor.fire(E))}get presentation(){return this.colorPresentations[this.presentationIndex]}get colorPresentations(){return this._colorPresentations}set colorPresentations(E){this._colorPresentations=E,this.presentationIndex>E.length-1&&(this.presentationIndex=0),this._onDidChangePresentation.fire(this.presentation)}constructor(E,S,p){this.presentationIndex=p,this._onColorFlushed=new L.Emitter,this.onColorFlushed=this._onColorFlushed.event,this._onDidChangeColor=new L.Emitter,this.onDidChangeColor=this._onDidChangeColor.event,this._onDidChangePresentation=new L.Emitter,this.onDidChangePresentation=this._onDidChangePresentation.event,this.originalColor=E,this._color=E,this._colorPresentations=S}selectNextColorPresentation(){this.presentationIndex=(this.presentationIndex+1)%this.colorPresentations.length,this.flushColor(),this._onDidChangePresentation.fire(this.presentation)}guessColorPresentation(E,S){let p=-1;for(let _=0;_<this.colorPresentations.length;_++)if(S.toLowerCase()===this.colorPresentations[_].label){p=_;break}if(p===-1){const _=S.split("(")[0].toLowerCase();for(let v=0;v<this.colorPresentations.length;v++)if(this.colorPresentations[v].label.toLowerCase().startsWith(_)){p=v;break}}p!==-1&&p!==this.presentationIndex&&(this.presentationIndex=p,this._onDidChangePresentation.fire(this.presentation))}flushColor(){this._onColorFlushed.fire(this._color)}}e.ColorPickerModel=k}),define(se[301],oe([1,0,74,10,5,24]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BlockCommentCommand=void 0;class S{constructor(_,v,b){this.languageConfigurationService=b,this._selection=_,this._insertSpace=v,this._usedEndToken=null}static _haystackHasNeedleAtOffset(_,v,b){if(b<0)return!1;const a=v.length,i=_.length;if(b+a>i)return!1;for(let n=0;n<a;n++){const t=_.charCodeAt(b+n),r=v.charCodeAt(n);if(t!==r&&!(t>=65&&t<=90&&t+32===r)&&!(r>=65&&r<=90&&r+32===t))return!1}return!0}_createOperationsForBlockComment(_,v,b,a,i,n){const t=_.startLineNumber,r=_.startColumn,u=_.endLineNumber,f=_.endColumn,c=i.getLineContent(t),d=i.getLineContent(u);let s=c.lastIndexOf(v,r-1+v.length),l=d.indexOf(b,f-1-b.length);if(s!==-1&&l!==-1)if(t===u)c.substring(s+v.length,l).indexOf(b)>=0&&(s=-1,l=-1);else{const g=c.substring(s+v.length),h=d.substring(0,l);(g.indexOf(b)>=0||h.indexOf(b)>=0)&&(s=-1,l=-1)}let o;s!==-1&&l!==-1?(a&&s+v.length<c.length&&c.charCodeAt(s+v.length)===32&&(v=v+" "),a&&l>0&&d.charCodeAt(l-1)===32&&(b=" "+b,l-=1),o=S._createRemoveBlockCommentOperations(new y.Range(t,s+v.length+1,u,l+1),v,b)):(o=S._createAddBlockCommentOperations(_,v,b,this._insertSpace),this._usedEndToken=o.length===1?b:null);for(const g of o)n.addTrackedEditOperation(g.range,g.text)}static _createRemoveBlockCommentOperations(_,v,b){const a=[];return y.Range.isEmpty(_)?a.push(L.EditOperation.delete(new y.Range(_.startLineNumber,_.startColumn-v.length,_.endLineNumber,_.endColumn+b.length))):(a.push(L.EditOperation.delete(new y.Range(_.startLineNumber,_.startColumn-v.length,_.startLineNumber,_.startColumn))),a.push(L.EditOperation.delete(new y.Range(_.endLineNumber,_.endColumn,_.endLineNumber,_.endColumn+b.length)))),a}static _createAddBlockCommentOperations(_,v,b,a){const i=[];return y.Range.isEmpty(_)?i.push(L.EditOperation.replace(new y.Range(_.startLineNumber,_.startColumn,_.endLineNumber,_.endColumn),v+"  "+b)):(i.push(L.EditOperation.insert(new k.Position(_.startLineNumber,_.startColumn),v+(a?" ":""))),i.push(L.EditOperation.insert(new k.Position(_.endLineNumber,_.endColumn),(a?" ":"")+b))),i}getEditOperations(_,v){const b=this._selection.startLineNumber,a=this._selection.startColumn;_.tokenization.tokenizeIfCheap(b);const i=_.getLanguageIdAtPosition(b,a),n=this.languageConfigurationService.getLanguageConfiguration(i).comments;!n||!n.blockCommentStartToken||!n.blockCommentEndToken||this._createOperationsForBlockComment(this._selection,n.blockCommentStartToken,n.blockCommentEndToken,this._insertSpace,_,v)}computeCursorState(_,v){const b=v.getInverseEditOperations();if(b.length===2){const a=b[0],i=b[1];return new E.Selection(a.range.endLineNumber,a.range.endColumn,i.range.startLineNumber,i.range.startColumn)}else{const a=b[0].range,i=this._usedEndToken?-this._usedEndToken.length-1:0;return new E.Selection(a.endLineNumber,a.endColumn+i,a.endLineNumber,a.endColumn+i)}}}e.BlockCommentCommand=S}),define(se[554],oe([1,0,11,74,10,5,24,301]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineCommentCommand=void 0;class _{constructor(b,a,i,n,t,r,u){this.languageConfigurationService=b,this._selection=a,this._tabSize=i,this._type=n,this._insertSpace=t,this._selectionId=null,this._deltaColumn=0,this._moveEndPositionDown=!1,this._ignoreEmptyLines=r,this._ignoreFirstLine=u||!1}static _gatherPreflightCommentStrings(b,a,i,n){b.tokenization.tokenizeIfCheap(a);const t=b.getLanguageIdAtPosition(a,1),r=n.getLanguageConfiguration(t).comments,u=r?r.lineCommentToken:null;if(!u)return null;const f=[];for(let c=0,d=i-a+1;c<d;c++)f[c]={ignore:!1,commentStr:u,commentStrOffset:0,commentStrLength:u.length};return f}static _analyzeLines(b,a,i,n,t,r,u,f){let c=!0,d;b===0?d=!0:b===1?d=!1:d=!0;for(let s=0,l=n.length;s<l;s++){const o=n[s],g=t+s;if(g===t&&u){o.ignore=!0;continue}const h=i.getLineContent(g),m=L.firstNonWhitespaceIndex(h);if(m===-1){o.ignore=r,o.commentStrOffset=h.length;continue}if(c=!1,o.ignore=!1,o.commentStrOffset=m,d&&!p.BlockCommentCommand._haystackHasNeedleAtOffset(h,o.commentStr,m)&&(b===0?d=!1:b===1||(o.ignore=!0)),d&&a){const C=m+o.commentStrLength;C<h.length&&h.charCodeAt(C)===32&&(o.commentStrLength+=1)}}if(b===0&&c){d=!1;for(let s=0,l=n.length;s<l;s++)n[s].ignore=!1}return{supported:!0,shouldRemoveComments:d,lines:n}}static _gatherPreflightData(b,a,i,n,t,r,u,f){const c=_._gatherPreflightCommentStrings(i,n,t,f);return c===null?{supported:!1}:_._analyzeLines(b,a,i,c,n,r,u,f)}_executeLineComments(b,a,i,n){let t;i.shouldRemoveComments?t=_._createRemoveLineCommentsOperations(i.lines,n.startLineNumber):(_._normalizeInsertionPoint(b,i.lines,n.startLineNumber,this._tabSize),t=this._createAddLineCommentsOperations(i.lines,n.startLineNumber));const r=new y.Position(n.positionLineNumber,n.positionColumn);for(let u=0,f=t.length;u<f;u++)a.addEditOperation(t[u].range,t[u].text),E.Range.isEmpty(t[u].range)&&E.Range.getStartPosition(t[u].range).equals(r)&&b.getLineContent(r.lineNumber).length+1===r.column&&(this._deltaColumn=(t[u].text||"").length);this._selectionId=a.trackSelection(n)}_attemptRemoveBlockComment(b,a,i,n){let t=a.startLineNumber,r=a.endLineNumber;const u=n.length+Math.max(b.getLineFirstNonWhitespaceColumn(a.startLineNumber),a.startColumn);let f=b.getLineContent(t).lastIndexOf(i,u-1),c=b.getLineContent(r).indexOf(n,a.endColumn-1-i.length);return f!==-1&&c===-1&&(c=b.getLineContent(t).indexOf(n,f+i.length),r=t),f===-1&&c!==-1&&(f=b.getLineContent(r).lastIndexOf(i,c),t=r),a.isEmpty()&&(f===-1||c===-1)&&(f=b.getLineContent(t).indexOf(i),f!==-1&&(c=b.getLineContent(t).indexOf(n,f+i.length))),f!==-1&&b.getLineContent(t).charCodeAt(f+i.length)===32&&(i+=" "),c!==-1&&b.getLineContent(r).charCodeAt(c-1)===32&&(n=" "+n,c-=1),f!==-1&&c!==-1?p.BlockCommentCommand._createRemoveBlockCommentOperations(new E.Range(t,f+i.length+1,r,c+1),i,n):null}_executeBlockComment(b,a,i){b.tokenization.tokenizeIfCheap(i.startLineNumber);const n=b.getLanguageIdAtPosition(i.startLineNumber,1),t=this.languageConfigurationService.getLanguageConfiguration(n).comments;if(!t||!t.blockCommentStartToken||!t.blockCommentEndToken)return;const r=t.blockCommentStartToken,u=t.blockCommentEndToken;let f=this._attemptRemoveBlockComment(b,i,r,u);if(!f){if(i.isEmpty()){const c=b.getLineContent(i.startLineNumber);let d=L.firstNonWhitespaceIndex(c);d===-1&&(d=c.length),f=p.BlockCommentCommand._createAddBlockCommentOperations(new E.Range(i.startLineNumber,d+1,i.startLineNumber,c.length+1),r,u,this._insertSpace)}else f=p.BlockCommentCommand._createAddBlockCommentOperations(new E.Range(i.startLineNumber,b.getLineFirstNonWhitespaceColumn(i.startLineNumber),i.endLineNumber,b.getLineMaxColumn(i.endLineNumber)),r,u,this._insertSpace);f.length===1&&(this._deltaColumn=r.length+1)}this._selectionId=a.trackSelection(i);for(const c of f)a.addEditOperation(c.range,c.text)}getEditOperations(b,a){let i=this._selection;if(this._moveEndPositionDown=!1,i.startLineNumber===i.endLineNumber&&this._ignoreFirstLine){a.addEditOperation(new E.Range(i.startLineNumber,b.getLineMaxColumn(i.startLineNumber),i.startLineNumber+1,1),i.startLineNumber===b.getLineCount()?"":`
+`),this._selectionId=a.trackSelection(i);return}i.startLineNumber<i.endLineNumber&&i.endColumn===1&&(this._moveEndPositionDown=!0,i=i.setEndPosition(i.endLineNumber-1,b.getLineMaxColumn(i.endLineNumber-1)));const n=_._gatherPreflightData(this._type,this._insertSpace,b,i.startLineNumber,i.endLineNumber,this._ignoreEmptyLines,this._ignoreFirstLine,this.languageConfigurationService);return n.supported?this._executeLineComments(b,a,n,i):this._executeBlockComment(b,a,i)}computeCursorState(b,a){let i=a.getTrackedSelection(this._selectionId);return this._moveEndPositionDown&&(i=i.setEndPosition(i.endLineNumber+1,1)),new S.Selection(i.selectionStartLineNumber,i.selectionStartColumn+this._deltaColumn,i.positionLineNumber,i.positionColumn+this._deltaColumn)}static _createRemoveLineCommentsOperations(b,a){const i=[];for(let n=0,t=b.length;n<t;n++){const r=b[n];r.ignore||i.push(k.EditOperation.delete(new E.Range(a+n,r.commentStrOffset+1,a+n,r.commentStrOffset+r.commentStrLength+1)))}return i}_createAddLineCommentsOperations(b,a){const i=[],n=this._insertSpace?" ":"";for(let t=0,r=b.length;t<r;t++){const u=b[t];u.ignore||i.push(k.EditOperation.insert(new y.Position(a+t,u.commentStrOffset+1),u.commentStr+n))}return i}static nextVisibleColumn(b,a,i,n){return i?b+(a-b%a):b+n}static _normalizeInsertionPoint(b,a,i,n){let t=1073741824,r,u;for(let f=0,c=a.length;f<c;f++){if(a[f].ignore)continue;const d=b.getLineContent(i+f);let s=0;for(let l=0,o=a[f].commentStrOffset;s<t&&l<o;l++)s=_.nextVisibleColumn(s,n,d.charCodeAt(l)===9,1);s<t&&(t=s)}t=Math.floor(t/n)*n;for(let f=0,c=a.length;f<c;f++){if(a[f].ignore)continue;const d=b.getLineContent(i+f);let s=0;for(r=0,u=a[f].commentStrOffset;s<t&&r<u;r++)s=_.nextVisibleColumn(s,n,d.charCodeAt(r)===9,1);s>t?a[f].commentStrOffset=r-1:a[f].commentStrOffset=r}}}e.LineCommentCommand=_}),define(se[555],oe([1,0,5,24]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DragAndDropCommand=void 0;class y{constructor(S,p,_){this.selection=S,this.targetPosition=p,this.copy=_,this.targetSelection=null}getEditOperations(S,p){const _=S.getValueInRange(this.selection);if(this.copy||p.addEditOperation(this.selection,null),p.addEditOperation(new L.Range(this.targetPosition.lineNumber,this.targetPosition.column,this.targetPosition.lineNumber,this.targetPosition.column),_),this.selection.containsPosition(this.targetPosition)&&!(this.copy&&(this.selection.getEndPosition().equals(this.targetPosition)||this.selection.getStartPosition().equals(this.targetPosition)))){this.targetSelection=this.selection;return}if(this.copy){this.targetSelection=new k.Selection(this.targetPosition.lineNumber,this.targetPosition.column,this.selection.endLineNumber-this.selection.startLineNumber+this.targetPosition.lineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column+this.selection.endColumn-this.selection.startColumn:this.selection.endColumn);return}if(this.targetPosition.lineNumber>this.selection.endLineNumber){this.targetSelection=new k.Selection(this.targetPosition.lineNumber-this.selection.endLineNumber+this.selection.startLineNumber,this.targetPosition.column,this.targetPosition.lineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column+this.selection.endColumn-this.selection.startColumn:this.selection.endColumn);return}if(this.targetPosition.lineNumber<this.selection.endLineNumber){this.targetSelection=new k.Selection(this.targetPosition.lineNumber,this.targetPosition.column,this.targetPosition.lineNumber+this.selection.endLineNumber-this.selection.startLineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column+this.selection.endColumn-this.selection.startColumn:this.selection.endColumn);return}this.selection.endColumn<=this.targetPosition.column?this.targetSelection=new k.Selection(this.targetPosition.lineNumber-this.selection.endLineNumber+this.selection.startLineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column-this.selection.endColumn+this.selection.startColumn:this.targetPosition.column-this.selection.endColumn+this.selection.startColumn,this.targetPosition.lineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column:this.selection.endColumn):this.targetSelection=new k.Selection(this.targetPosition.lineNumber-this.selection.endLineNumber+this.selection.startLineNumber,this.targetPosition.column,this.targetPosition.lineNumber,this.targetPosition.column+this.selection.endColumn-this.selection.startColumn)}computeCursorState(S,p){return this.targetSelection}}e.DragAndDropCommand=y}),define(se[556],oe([1,0,5]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReplaceAllCommand=void 0;class k{constructor(E,S,p){this._editorSelection=E,this._ranges=S,this._replaceStrings=p,this._trackedEditorSelectionId=null}getEditOperations(E,S){if(this._ranges.length>0){const p=[];for(let b=0;b<this._ranges.length;b++)p.push({range:this._ranges[b],text:this._replaceStrings[b]});p.sort((b,a)=>L.Range.compareRangesUsingStarts(b.range,a.range));const _=[];let v=p[0];for(let b=1;b<p.length;b++)v.range.endLineNumber===p[b].range.startLineNumber&&v.range.endColumn===p[b].range.startColumn?(v.range=v.range.plusRange(p[b].range),v.text=v.text+p[b].text):(_.push(v),v=p[b]);_.push(v);for(const b of _)S.addEditOperation(b.range,b.text)}this._trackedEditorSelectionId=S.trackSelection(this._editorSelection)}computeCursorState(E,S){return S.getTrackedSelection(this._trackedEditorSelectionId)}}e.ReplaceAllCommand=k}),define(se[557],oe([1,0,406]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.parseReplaceString=e.ReplacePiece=e.ReplacePattern=void 0;class k{constructor(b){this.staticValue=b,this.kind=0}}class y{constructor(b){this.pieces=b,this.kind=1}}class E{static fromStaticValue(b){return new E([S.staticValue(b)])}get hasReplacementPatterns(){return this._state.kind===1}constructor(b){!b||b.length===0?this._state=new k(""):b.length===1&&b[0].staticValue!==null?this._state=new k(b[0].staticValue):this._state=new y(b)}buildReplaceString(b,a){if(this._state.kind===0)return a?(0,L.buildReplaceStringWithCasePreserved)(b,this._state.staticValue):this._state.staticValue;let i="";for(let n=0,t=this._state.pieces.length;n<t;n++){const r=this._state.pieces[n];if(r.staticValue!==null){i+=r.staticValue;continue}let u=E._substitute(r.matchIndex,b);if(r.caseOps!==null&&r.caseOps.length>0){const f=[],c=r.caseOps.length;let d=0;for(let s=0,l=u.length;s<l;s++){if(d>=c){f.push(u.slice(s));break}switch(r.caseOps[d]){case"U":f.push(u[s].toUpperCase());break;case"u":f.push(u[s].toUpperCase()),d++;break;case"L":f.push(u[s].toLowerCase());break;case"l":f.push(u[s].toLowerCase()),d++;break;default:f.push(u[s])}}u=f.join("")}i+=u}return i}static _substitute(b,a){if(a===null)return"";if(b===0)return a[0];let i="";for(;b>0;){if(b<a.length)return(a[b]||"")+i;i=String(b%10)+i,b=Math.floor(b/10)}return"$"+i}}e.ReplacePattern=E;class S{static staticValue(b){return new S(b,-1,null)}static caseOps(b,a){return new S(null,b,a)}constructor(b,a,i){this.staticValue=b,this.matchIndex=a,!i||i.length===0?this.caseOps=null:this.caseOps=i.slice(0)}}e.ReplacePiece=S;class p{constructor(b){this._source=b,this._lastCharIndex=0,this._result=[],this._resultLen=0,this._currentStaticPiece=""}emitUnchanged(b){this._emitStatic(this._source.substring(this._lastCharIndex,b)),this._lastCharIndex=b}emitStatic(b,a){this._emitStatic(b),this._lastCharIndex=a}_emitStatic(b){b.length!==0&&(this._currentStaticPiece+=b)}emitMatchIndex(b,a,i){this._currentStaticPiece.length!==0&&(this._result[this._resultLen++]=S.staticValue(this._currentStaticPiece),this._currentStaticPiece=""),this._result[this._resultLen++]=S.caseOps(b,i),this._lastCharIndex=a}finalize(){return this.emitUnchanged(this._source.length),this._currentStaticPiece.length!==0&&(this._result[this._resultLen++]=S.staticValue(this._currentStaticPiece),this._currentStaticPiece=""),new E(this._result)}}function _(v){if(!v||v.length===0)return new E(null);const b=[],a=new p(v);for(let i=0,n=v.length;i<n;i++){const t=v.charCodeAt(i);if(t===92){if(i++,i>=n)break;const r=v.charCodeAt(i);switch(r){case 92:a.emitUnchanged(i-1),a.emitStatic("\\",i+1);break;case 110:a.emitUnchanged(i-1),a.emitStatic(`
+`,i+1);break;case 116:a.emitUnchanged(i-1),a.emitStatic("	",i+1);break;case 117:case 85:case 108:case 76:a.emitUnchanged(i-1),a.emitStatic("",i+1),b.push(String.fromCharCode(r));break}continue}if(t===36){if(i++,i>=n)break;const r=v.charCodeAt(i);if(r===36){a.emitUnchanged(i-1),a.emitStatic("$",i+1);continue}if(r===48||r===38){a.emitUnchanged(i-1),a.emitMatchIndex(0,i+1,b),b.length=0;continue}if(49<=r&&r<=57){let u=r-48;if(i+1<n){const f=v.charCodeAt(i+1);if(48<=f&&f<=57){i++,u=u*10+(f-48),a.emitUnchanged(i-2),a.emitMatchIndex(u,i+1,b),b.length=0;continue}}a.emitUnchanged(i-1),a.emitMatchIndex(u,i+1,b),b.length=0;continue}}}return a.finalize()}e.parseReplaceString=_}),define(se[185],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FoldingRegion=e.FoldingRegions=e.MAX_LINE_NUMBER=e.MAX_FOLDING_REGIONS=e.foldSourceAbbr=void 0,e.foldSourceAbbr={[0]:" ",[1]:"u",[2]:"r"},e.MAX_FOLDING_REGIONS=65535,e.MAX_LINE_NUMBER=16777215;const L=4278190080;class k{constructor(p){const _=Math.ceil(p/32);this._states=new Uint32Array(_)}get(p){const _=p/32|0,v=p%32;return(this._states[_]&1<<v)!==0}set(p,_){const v=p/32|0,b=p%32,a=this._states[v];_?this._states[v]=a|1<<b:this._states[v]=a&~(1<<b)}}class y{constructor(p,_,v){if(p.length!==_.length||p.length>e.MAX_FOLDING_REGIONS)throw new Error("invalid startIndexes or endIndexes size");this._startIndexes=p,this._endIndexes=_,this._collapseStates=new k(p.length),this._userDefinedStates=new k(p.length),this._recoveredStates=new k(p.length),this._types=v,this._parentsComputed=!1}ensureParentIndices(){if(!this._parentsComputed){this._parentsComputed=!0;const p=[],_=(v,b)=>{const a=p[p.length-1];return this.getStartLineNumber(a)<=v&&this.getEndLineNumber(a)>=b};for(let v=0,b=this._startIndexes.length;v<b;v++){const a=this._startIndexes[v],i=this._endIndexes[v];if(a>e.MAX_LINE_NUMBER||i>e.MAX_LINE_NUMBER)throw new Error("startLineNumber or endLineNumber must not exceed "+e.MAX_LINE_NUMBER);for(;p.length>0&&!_(a,i);)p.pop();const n=p.length>0?p[p.length-1]:-1;p.push(v),this._startIndexes[v]=a+((n&255)<<24),this._endIndexes[v]=i+((n&65280)<<16)}}}get length(){return this._startIndexes.length}getStartLineNumber(p){return this._startIndexes[p]&e.MAX_LINE_NUMBER}getEndLineNumber(p){return this._endIndexes[p]&e.MAX_LINE_NUMBER}getType(p){return this._types?this._types[p]:void 0}hasTypes(){return!!this._types}isCollapsed(p){return this._collapseStates.get(p)}setCollapsed(p,_){this._collapseStates.set(p,_)}isUserDefined(p){return this._userDefinedStates.get(p)}setUserDefined(p,_){return this._userDefinedStates.set(p,_)}isRecovered(p){return this._recoveredStates.get(p)}setRecovered(p,_){return this._recoveredStates.set(p,_)}getSource(p){return this.isUserDefined(p)?1:this.isRecovered(p)?2:0}setSource(p,_){_===1?(this.setUserDefined(p,!0),this.setRecovered(p,!1)):_===2?(this.setUserDefined(p,!1),this.setRecovered(p,!0)):(this.setUserDefined(p,!1),this.setRecovered(p,!1))}setCollapsedAllOfType(p,_){let v=!1;if(this._types)for(let b=0;b<this._types.length;b++)this._types[b]===p&&(this.setCollapsed(b,_),v=!0);return v}toRegion(p){return new E(this,p)}getParentIndex(p){this.ensureParentIndices();const _=((this._startIndexes[p]&L)>>>24)+((this._endIndexes[p]&L)>>>16);return _===e.MAX_FOLDING_REGIONS?-1:_}contains(p,_){return this.getStartLineNumber(p)<=_&&this.getEndLineNumber(p)>=_}findIndex(p){let _=0,v=this._startIndexes.length;if(v===0)return-1;for(;_<v;){const b=Math.floor((_+v)/2);p<this.getStartLineNumber(b)?v=b:_=b+1}return _-1}findRange(p){let _=this.findIndex(p);if(_>=0){if(this.getEndLineNumber(_)>=p)return _;for(_=this.getParentIndex(_);_!==-1;){if(this.contains(_,p))return _;_=this.getParentIndex(_)}}return-1}toString(){const p=[];for(let _=0;_<this.length;_++)p[_]=`[${e.foldSourceAbbr[this.getSource(_)]}${this.isCollapsed(_)?"+":"-"}] ${this.getStartLineNumber(_)}/${this.getEndLineNumber(_)}`;return p.join(", ")}toFoldRange(p){return{startLineNumber:this._startIndexes[p]&e.MAX_LINE_NUMBER,endLineNumber:this._endIndexes[p]&e.MAX_LINE_NUMBER,type:this._types?this._types[p]:void 0,isCollapsed:this.isCollapsed(p),source:this.getSource(p)}}static fromFoldRanges(p){const _=p.length,v=new Uint32Array(_),b=new Uint32Array(_);let a=[],i=!1;for(let t=0;t<_;t++){const r=p[t];v[t]=r.startLineNumber,b[t]=r.endLineNumber,a.push(r.type),r.type&&(i=!0)}i||(a=void 0);const n=new y(v,b,a);for(let t=0;t<_;t++)p[t].isCollapsed&&n.setCollapsed(t,!0),n.setSource(t,p[t].source);return n}static sanitizeAndMerge(p,_,v){v=v??Number.MAX_VALUE;const b=(l,o)=>Array.isArray(l)?g=>g<o?l[g]:void 0:g=>g<o?l.toFoldRange(g):void 0,a=b(p,p.length),i=b(_,_.length);let n=0,t=0,r=a(0),u=i(0);const f=[];let c,d=0;const s=[];for(;r||u;){let l;if(u&&(!r||r.startLineNumber>=u.startLineNumber))r&&r.startLineNumber===u.startLineNumber?(u.source===1?l=u:(l=r,l.isCollapsed=u.isCollapsed&&r.endLineNumber===u.endLineNumber,l.source=0),r=a(++n)):(l=u,u.isCollapsed&&u.source===0&&(l.source=2)),u=i(++t);else{let o=t,g=u;for(;;){if(!g||g.startLineNumber>r.endLineNumber){l=r;break}if(g.source===1&&g.endLineNumber>r.endLineNumber)break;g=i(++o)}r=a(++n)}if(l){for(;c&&c.endLineNumber<l.startLineNumber;)c=f.pop();l.endLineNumber>l.startLineNumber&&l.startLineNumber>d&&l.endLineNumber<=v&&(!c||c.endLineNumber>=l.endLineNumber)&&(s.push(l),d=l.startLineNumber,c&&f.push(c),c=l)}}return s}}e.FoldingRegions=y;class E{constructor(p,_){this.ranges=p,this.index=_}get startLineNumber(){return this.ranges.getStartLineNumber(this.index)}get endLineNumber(){return this.ranges.getEndLineNumber(this.index)}get regionIndex(){return this.index}get parentIndex(){return this.ranges.getParentIndex(this.index)}get isCollapsed(){return this.ranges.isCollapsed(this.index)}containedBy(p){return p.startLineNumber<=this.startLineNumber&&p.endLineNumber>=this.endLineNumber}containsLine(p){return this.startLineNumber<=p&&p<=this.endLineNumber}}e.FoldingRegion=E}),define(se[302],oe([1,0,6,185,111]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getNextFoldLine=e.getPreviousFoldLine=e.getParentFoldLine=e.setCollapseStateForType=e.setCollapseStateForMatchingLines=e.setCollapseStateForRest=e.setCollapseStateAtLevel=e.setCollapseStateUp=e.setCollapseStateLevelsUp=e.setCollapseStateLevelsDown=e.toggleCollapseState=e.FoldingModel=void 0;class E{get regions(){return this._regions}get textModel(){return this._textModel}constructor(c,d){this._updateEventEmitter=new L.Emitter,this.onDidChange=this._updateEventEmitter.event,this._textModel=c,this._decorationProvider=d,this._regions=new k.FoldingRegions(new Uint32Array(0),new Uint32Array(0)),this._editorDecorationIds=[]}toggleCollapseState(c){if(!c.length)return;c=c.sort((s,l)=>s.regionIndex-l.regionIndex);const d={};this._decorationProvider.changeDecorations(s=>{let l=0,o=-1,g=-1;const h=m=>{for(;l<m;){const C=this._regions.getEndLineNumber(l),w=this._regions.isCollapsed(l);if(C<=o){const D=this.regions.getSource(l)!==0;s.changeDecorationOptions(this._editorDecorationIds[l],this._decorationProvider.getDecorationOption(w,C<=g,D))}w&&C>g&&(g=C),l++}};for(const m of c){const C=m.regionIndex,w=this._editorDecorationIds[C];if(w&&!d[w]){d[w]=!0,h(C);const D=!this._regions.isCollapsed(C);this._regions.setCollapsed(C,D),o=Math.max(o,this._regions.getEndLineNumber(C))}}h(this._regions.length)}),this._updateEventEmitter.fire({model:this,collapseStateChanged:c})}removeManualRanges(c){const d=new Array,s=l=>{for(const o of c)if(!(o.startLineNumber>l.endLineNumber||l.startLineNumber>o.endLineNumber))return!0;return!1};for(let l=0;l<this._regions.length;l++){const o=this._regions.toFoldRange(l);(o.source===0||!s(o))&&d.push(o)}this.updatePost(k.FoldingRegions.fromFoldRanges(d))}update(c,d=[]){const s=this._currentFoldedOrManualRanges(d),l=k.FoldingRegions.sanitizeAndMerge(c,s,this._textModel.getLineCount());this.updatePost(k.FoldingRegions.fromFoldRanges(l))}updatePost(c){const d=[];let s=-1;for(let l=0,o=c.length;l<o;l++){const g=c.getStartLineNumber(l),h=c.getEndLineNumber(l),m=c.isCollapsed(l),C=c.getSource(l)!==0,w={startLineNumber:g,startColumn:this._textModel.getLineMaxColumn(g),endLineNumber:h,endColumn:this._textModel.getLineMaxColumn(h)+1};d.push({range:w,options:this._decorationProvider.getDecorationOption(m,h<=s,C)}),m&&h>s&&(s=h)}this._decorationProvider.changeDecorations(l=>this._editorDecorationIds=l.deltaDecorations(this._editorDecorationIds,d)),this._regions=c,this._updateEventEmitter.fire({model:this})}_currentFoldedOrManualRanges(c=[]){const d=(l,o)=>{for(const g of c)if(l<g&&g<=o)return!0;return!1},s=[];for(let l=0,o=this._regions.length;l<o;l++){let g=this.regions.isCollapsed(l);const h=this.regions.getSource(l);if(g||h!==0){const m=this._regions.toFoldRange(l),C=this._textModel.getDecorationRange(this._editorDecorationIds[l]);C&&(g&&d(C.startLineNumber,C.endLineNumber)&&(g=!1),s.push({startLineNumber:C.startLineNumber,endLineNumber:C.endLineNumber,type:m.type,isCollapsed:g,source:h}))}}return s}getMemento(){const c=this._currentFoldedOrManualRanges(),d=[],s=this._textModel.getLineCount();for(let l=0,o=c.length;l<o;l++){const g=c[l];if(g.startLineNumber>=g.endLineNumber||g.startLineNumber<1||g.endLineNumber>s)continue;const h=this._getLinesChecksum(g.startLineNumber+1,g.endLineNumber);d.push({startLineNumber:g.startLineNumber,endLineNumber:g.endLineNumber,isCollapsed:g.isCollapsed,source:g.source,checksum:h})}return d.length>0?d:void 0}applyMemento(c){var d,s;if(!Array.isArray(c))return;const l=[],o=this._textModel.getLineCount();for(const h of c){if(h.startLineNumber>=h.endLineNumber||h.startLineNumber<1||h.endLineNumber>o)continue;const m=this._getLinesChecksum(h.startLineNumber+1,h.endLineNumber);(!h.checksum||m===h.checksum)&&l.push({startLineNumber:h.startLineNumber,endLineNumber:h.endLineNumber,type:void 0,isCollapsed:(d=h.isCollapsed)!==null&&d!==void 0?d:!0,source:(s=h.source)!==null&&s!==void 0?s:0})}const g=k.FoldingRegions.sanitizeAndMerge(this._regions,l,o);this.updatePost(k.FoldingRegions.fromFoldRanges(g))}_getLinesChecksum(c,d){return(0,y.hash)(this._textModel.getLineContent(c)+this._textModel.getLineContent(d))%1e6}dispose(){this._decorationProvider.removeDecorations(this._editorDecorationIds)}getAllRegionsAtLine(c,d){const s=[];if(this._regions){let l=this._regions.findRange(c),o=1;for(;l>=0;){const g=this._regions.toRegion(l);(!d||d(g,o))&&s.push(g),o++,l=g.parentIndex}}return s}getRegionAtLine(c){if(this._regions){const d=this._regions.findRange(c);if(d>=0)return this._regions.toRegion(d)}return null}getRegionsInside(c,d){const s=[],l=c?c.regionIndex+1:0,o=c?c.endLineNumber:Number.MAX_VALUE;if(d&&d.length===2){const g=[];for(let h=l,m=this._regions.length;h<m;h++){const C=this._regions.toRegion(h);if(this._regions.getStartLineNumber(h)<o){for(;g.length>0&&!C.containedBy(g[g.length-1]);)g.pop();g.push(C),d(C,g.length)&&s.push(C)}else break}}else for(let g=l,h=this._regions.length;g<h;g++){const m=this._regions.toRegion(g);if(this._regions.getStartLineNumber(g)<o)(!d||d(m))&&s.push(m);else break}return s}}e.FoldingModel=E;function S(f,c,d){const s=[];for(const l of d){const o=f.getRegionAtLine(l);if(o){const g=!o.isCollapsed;if(s.push(o),c>1){const h=f.getRegionsInside(o,(m,C)=>m.isCollapsed!==g&&C<c);s.push(...h)}}}f.toggleCollapseState(s)}e.toggleCollapseState=S;function p(f,c,d=Number.MAX_VALUE,s){const l=[];if(s&&s.length>0)for(const o of s){const g=f.getRegionAtLine(o);if(g&&(g.isCollapsed!==c&&l.push(g),d>1)){const h=f.getRegionsInside(g,(m,C)=>m.isCollapsed!==c&&C<d);l.push(...h)}}else{const o=f.getRegionsInside(null,(g,h)=>g.isCollapsed!==c&&h<d);l.push(...o)}f.toggleCollapseState(l)}e.setCollapseStateLevelsDown=p;function _(f,c,d,s){const l=[];for(const o of s){const g=f.getAllRegionsAtLine(o,(h,m)=>h.isCollapsed!==c&&m<=d);l.push(...g)}f.toggleCollapseState(l)}e.setCollapseStateLevelsUp=_;function v(f,c,d){const s=[];for(const l of d){const o=f.getAllRegionsAtLine(l,g=>g.isCollapsed!==c);o.length>0&&s.push(o[0])}f.toggleCollapseState(s)}e.setCollapseStateUp=v;function b(f,c,d,s){const l=(g,h)=>h===c&&g.isCollapsed!==d&&!s.some(m=>g.containsLine(m)),o=f.getRegionsInside(null,l);f.toggleCollapseState(o)}e.setCollapseStateAtLevel=b;function a(f,c,d){const s=[];for(const g of d){const h=f.getAllRegionsAtLine(g,void 0);h.length>0&&s.push(h[0])}const l=g=>s.every(h=>!h.containedBy(g)&&!g.containedBy(h))&&g.isCollapsed!==c,o=f.getRegionsInside(null,l);f.toggleCollapseState(o)}e.setCollapseStateForRest=a;function i(f,c,d){const s=f.textModel,l=f.regions,o=[];for(let g=l.length-1;g>=0;g--)if(d!==l.isCollapsed(g)){const h=l.getStartLineNumber(g);c.test(s.getLineContent(h))&&o.push(l.toRegion(g))}f.toggleCollapseState(o)}e.setCollapseStateForMatchingLines=i;function n(f,c,d){const s=f.regions,l=[];for(let o=s.length-1;o>=0;o--)d!==s.isCollapsed(o)&&c===s.getType(o)&&l.push(s.toRegion(o));f.toggleCollapseState(l)}e.setCollapseStateForType=n;function t(f,c){let d=null;const s=c.getRegionAtLine(f);if(s!==null&&(d=s.startLineNumber,f===d)){const l=s.parentIndex;l!==-1?d=c.regions.getStartLineNumber(l):d=null}return d}e.getParentFoldLine=t;function r(f,c){let d=c.getRegionAtLine(f);if(d!==null&&d.startLineNumber===f){if(f!==d.startLineNumber)return d.startLineNumber;{const s=d.parentIndex;let l=0;for(s!==-1&&(l=c.regions.getStartLineNumber(d.parentIndex));d!==null;)if(d.regionIndex>0){if(d=c.regions.toRegion(d.regionIndex-1),d.startLineNumber<=l)return null;if(d.parentIndex===s)return d.startLineNumber}else return null}}else if(c.regions.length>0)for(d=c.regions.toRegion(c.regions.length-1);d!==null;){if(d.startLineNumber<f)return d.startLineNumber;d.regionIndex>0?d=c.regions.toRegion(d.regionIndex-1):d=null}return null}e.getPreviousFoldLine=r;function u(f,c){let d=c.getRegionAtLine(f);if(d!==null&&d.startLineNumber===f){const s=d.parentIndex;let l=0;if(s!==-1)l=c.regions.getEndLineNumber(d.parentIndex);else{if(c.regions.length===0)return null;l=c.regions.getEndLineNumber(c.regions.length-1)}for(;d!==null;)if(d.regionIndex<c.regions.length){if(d=c.regions.toRegion(d.regionIndex+1),d.startLineNumber>=l)return null;if(d.parentIndex===s)return d.startLineNumber}else return null}else if(c.regions.length>0)for(d=c.regions.toRegion(0);d!==null;){if(d.startLineNumber>f)return d.startLineNumber;d.regionIndex<c.regions.length?d=c.regions.toRegion(d.regionIndex+1):d=null}return null}e.getNextFoldLine=u}),define(se[558],oe([1,0,60,6,5,129]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HiddenRangeModel=void 0;class S{get onDidChange(){return this._updateEventEmitter.event}get hiddenRanges(){return this._hiddenRanges}constructor(b){this._updateEventEmitter=new k.Emitter,this._hasLineChanges=!1,this._foldingModel=b,this._foldingModelListener=b.onDidChange(a=>this.updateHiddenRanges()),this._hiddenRanges=[],b.regions.length&&this.updateHiddenRanges()}notifyChangeModelContent(b){this._hiddenRanges.length&&!this._hasLineChanges&&(this._hasLineChanges=b.changes.some(a=>a.range.endLineNumber!==a.range.startLineNumber||(0,E.countEOL)(a.text)[0]!==0))}updateHiddenRanges(){let b=!1;const a=[];let i=0,n=0,t=Number.MAX_VALUE,r=-1;const u=this._foldingModel.regions;for(;i<u.length;i++){if(!u.isCollapsed(i))continue;const f=u.getStartLineNumber(i)+1,c=u.getEndLineNumber(i);t<=f&&c<=r||(!b&&n<this._hiddenRanges.length&&this._hiddenRanges[n].startLineNumber===f&&this._hiddenRanges[n].endLineNumber===c?(a.push(this._hiddenRanges[n]),n++):(b=!0,a.push(new y.Range(f,1,c,1))),t=f,r=c)}(this._hasLineChanges||b||n<this._hiddenRanges.length)&&this.applyHiddenRanges(a)}applyHiddenRanges(b){this._hiddenRanges=b,this._hasLineChanges=!1,this._updateEventEmitter.fire(b)}hasRanges(){return this._hiddenRanges.length>0}isHidden(b){return _(this._hiddenRanges,b)!==null}adjustSelections(b){let a=!1;const i=this._foldingModel.textModel;let n=null;const t=r=>((!n||!p(r,n))&&(n=_(this._hiddenRanges,r)),n?n.startLineNumber-1:null);for(let r=0,u=b.length;r<u;r++){let f=b[r];const c=t(f.startLineNumber);c&&(f=f.setStartPosition(c,i.getLineMaxColumn(c)),a=!0);const d=t(f.endLineNumber);d&&(f=f.setEndPosition(d,i.getLineMaxColumn(d)),a=!0),b[r]=f}return a}dispose(){this.hiddenRanges.length>0&&(this._hiddenRanges=[],this._updateEventEmitter.fire(this._hiddenRanges)),this._foldingModelListener&&(this._foldingModelListener.dispose(),this._foldingModelListener=null)}}e.HiddenRangeModel=S;function p(v,b){return v>=b.startLineNumber&&v<=b.endLineNumber}function _(v,b){const a=(0,L.findFirstIdxMonotonousOrArrLen)(v,i=>b<i.startLineNumber)-1;return a>=0&&v[a].endLineNumber>=b?v[a]:null}}),define(se[303],oe([1,0,210,185]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.computeRanges=e.RangesCollector=e.IndentRangeProvider=void 0;const y=5e3,E="indent";class S{constructor(a,i,n){this.editorModel=a,this.languageConfigurationService=i,this.foldingRangesLimit=n,this.id=E}dispose(){}compute(a){const i=this.languageConfigurationService.getLanguageConfiguration(this.editorModel.getLanguageId()).foldingRules,n=i&&!!i.offSide,t=i&&i.markers;return Promise.resolve(v(this.editorModel,n,t,this.foldingRangesLimit))}}e.IndentRangeProvider=S;class p{constructor(a){this._startIndexes=[],this._endIndexes=[],this._indentOccurrences=[],this._length=0,this._foldingRangesLimit=a}insertFirst(a,i,n){if(a>k.MAX_LINE_NUMBER||i>k.MAX_LINE_NUMBER)return;const t=this._length;this._startIndexes[t]=a,this._endIndexes[t]=i,this._length++,n<1e3&&(this._indentOccurrences[n]=(this._indentOccurrences[n]||0)+1)}toIndentRanges(a){const i=this._foldingRangesLimit.limit;if(this._length<=i){this._foldingRangesLimit.update(this._length,!1);const n=new Uint32Array(this._length),t=new Uint32Array(this._length);for(let r=this._length-1,u=0;r>=0;r--,u++)n[u]=this._startIndexes[r],t[u]=this._endIndexes[r];return new k.FoldingRegions(n,t)}else{this._foldingRangesLimit.update(this._length,i);let n=0,t=this._indentOccurrences.length;for(let c=0;c<this._indentOccurrences.length;c++){const d=this._indentOccurrences[c];if(d){if(d+n>i){t=c;break}n+=d}}const r=a.getOptions().tabSize,u=new Uint32Array(i),f=new Uint32Array(i);for(let c=this._length-1,d=0;c>=0;c--){const s=this._startIndexes[c],l=a.getLineContent(s),o=(0,L.computeIndentLevel)(l,r);(o<t||o===t&&n++<i)&&(u[d]=s,f[d]=this._endIndexes[c],d++)}return new k.FoldingRegions(u,f)}}}e.RangesCollector=p;const _={limit:y,update:()=>{}};function v(b,a,i,n=_){const t=b.getOptions().tabSize,r=new p(n);let u;i&&(u=new RegExp(`(${i.start.source})|(?:${i.end.source})`));const f=[],c=b.getLineCount()+1;f.push({indent:-1,endAbove:c,line:c});for(let d=b.getLineCount();d>0;d--){const s=b.getLineContent(d),l=(0,L.computeIndentLevel)(s,t);let o=f[f.length-1];if(l===-1){a&&(o.endAbove=d);continue}let g;if(u&&(g=s.match(u)))if(g[1]){let h=f.length-1;for(;h>0&&f[h].indent!==-2;)h--;if(h>0){f.length=h+1,o=f[h],r.insertFirst(d,o.line,l),o.line=d,o.indent=l,o.endAbove=d;continue}}else{f.push({indent:-2,endAbove:d,line:d});continue}if(o.indent>l){do f.pop(),o=f[f.length-1];while(o.indent>l);const h=o.endAbove-1;h-d>=1&&r.insertFirst(d,h,l)}o.indent===l?o.endAbove=d:f.push({indent:l,endAbove:d,line:d})}return r.toIndentRanges(b)}e.computeRanges=v}),define(se[304],oe([1,0,12,2,185]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.sanitizeRanges=e.SyntaxRangeProvider=void 0;const E={},S="syntax";class p{constructor(i,n,t,r,u){this.editorModel=i,this.providers=n,this.handleFoldingRangesChange=t,this.foldingRangesLimit=r,this.fallbackRangeProvider=u,this.id=S,this.disposables=new k.DisposableStore,u&&this.disposables.add(u);for(const f of n)typeof f.onDidChange=="function"&&this.disposables.add(f.onDidChange(t))}compute(i){return _(this.providers,this.editorModel,i).then(n=>{var t,r;return n?b(n,this.foldingRangesLimit):(r=(t=this.fallbackRangeProvider)===null||t===void 0?void 0:t.compute(i))!==null&&r!==void 0?r:null})}dispose(){this.disposables.dispose()}}e.SyntaxRangeProvider=p;function _(a,i,n){let t=null;const r=a.map((u,f)=>Promise.resolve(u.provideFoldingRanges(i,E,n)).then(c=>{if(!n.isCancellationRequested&&Array.isArray(c)){Array.isArray(t)||(t=[]);const d=i.getLineCount();for(const s of c)s.start>0&&s.end>s.start&&s.end<=d&&t.push({start:s.start,end:s.end,rank:f,kind:s.kind})}},L.onUnexpectedExternalError));return Promise.all(r).then(u=>t)}class v{constructor(i){this._startIndexes=[],this._endIndexes=[],this._nestingLevels=[],this._nestingLevelCounts=[],this._types=[],this._length=0,this._foldingRangesLimit=i}add(i,n,t,r){if(i>y.MAX_LINE_NUMBER||n>y.MAX_LINE_NUMBER)return;const u=this._length;this._startIndexes[u]=i,this._endIndexes[u]=n,this._nestingLevels[u]=r,this._types[u]=t,this._length++,r<30&&(this._nestingLevelCounts[r]=(this._nestingLevelCounts[r]||0)+1)}toIndentRanges(){const i=this._foldingRangesLimit.limit;if(this._length<=i){this._foldingRangesLimit.update(this._length,!1);const n=new Uint32Array(this._length),t=new Uint32Array(this._length);for(let r=0;r<this._length;r++)n[r]=this._startIndexes[r],t[r]=this._endIndexes[r];return new y.FoldingRegions(n,t,this._types)}else{this._foldingRangesLimit.update(this._length,i);let n=0,t=this._nestingLevelCounts.length;for(let c=0;c<this._nestingLevelCounts.length;c++){const d=this._nestingLevelCounts[c];if(d){if(d+n>i){t=c;break}n+=d}}const r=new Uint32Array(i),u=new Uint32Array(i),f=[];for(let c=0,d=0;c<this._length;c++){const s=this._nestingLevels[c];(s<t||s===t&&n++<i)&&(r[d]=this._startIndexes[c],u[d]=this._endIndexes[c],f[d]=this._types[c],d++)}return new y.FoldingRegions(r,u,f)}}}function b(a,i){const n=a.sort((f,c)=>{let d=f.start-c.start;return d===0&&(d=f.rank-c.rank),d}),t=new v(i);let r;const u=[];for(const f of n)if(!r)r=f,t.add(f.start,f.end,f.kind&&f.kind.value,u.length);else if(f.start>r.start)if(f.end<=r.end)u.push(r),r=f,t.add(f.start,f.end,f.kind&&f.kind.value,u.length);else{if(f.start>r.end){do r=u.pop();while(r&&f.start>r.end);r&&u.push(r),r=f}t.add(f.start,f.end,f.kind&&f.kind.value,u.length)}return t.toIndentRanges()}e.sanitizeRanges=b}),define(se[305],oe([1,0,74,5,127]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FormattingEdit=void 0;class E{static _handleEolEdits(p,_){let v;const b=[];for(const a of _)typeof a.eol=="number"&&(v=a.eol),a.range&&typeof a.text=="string"&&b.push(a);return typeof v=="number"&&p.hasModel()&&p.getModel().pushEOL(v),b}static _isFullModelReplaceEdit(p,_){if(!p.hasModel())return!1;const v=p.getModel(),b=v.validateRange(_.range);return v.getFullModelRange().equalsRange(b)}static execute(p,_,v){v&&p.pushUndoStop();const b=y.StableEditorScrollState.capture(p),a=E._handleEolEdits(p,_);a.length===1&&E._isFullModelReplaceEdit(p,a[0])?p.executeEdits("formatEditsCommand",a.map(i=>L.EditOperation.replace(k.Range.lift(i.range),i.text))):p.executeEdits("formatEditsCommand",a.map(i=>L.EditOperation.replaceMove(k.Range.lift(i.range),i.text))),v&&p.pushUndoStop(),b.restoreRelativeVerticalPositionOfCursor(p)}}e.FormattingEdit=E}),define(se[101],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HoverParticipantRegistry=e.HoverForeignElementAnchor=e.HoverRangeAnchor=void 0;class L{constructor(E,S,p,_){this.priority=E,this.range=S,this.initialMousePosX=p,this.initialMousePosY=_,this.type=1}equals(E){return E.type===1&&this.range.equalsRange(E.range)}canAdoptVisibleHover(E,S){return E.type===1&&S.lineNumber===this.range.startLineNumber}}e.HoverRangeAnchor=L;class k{constructor(E,S,p,_,v,b){this.priority=E,this.owner=S,this.range=p,this.initialMousePosX=_,this.initialMousePosY=v,this.supportsMarkerHover=b,this.type=2}equals(E){return E.type===2&&this.owner===E.owner}canAdoptVisibleHover(E,S){return E.type===2&&this.owner===E.owner}}e.HoverForeignElementAnchor=k,e.HoverParticipantRegistry=new class{constructor(){this._participants=[]}register(E){this._participants.push(E)}getAll(){return this._participants}}}),define(se[559],oe([1,0,24]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InPlaceReplaceCommand=void 0;class k{constructor(E,S,p){this._editRange=E,this._originalSelection=S,this._text=p}getEditOperations(E,S){S.addTrackedEditOperation(this._editRange,this._text)}computeCursorState(E,S){const _=S.getInverseEditOperations()[0].range;return this._originalSelection.isEmpty()?new L.Selection(_.endLineNumber,Math.min(this._originalSelection.positionColumn,_.endColumn),_.endLineNumber,Math.min(this._originalSelection.positionColumn,_.endColumn)):new L.Selection(_.endLineNumber,_.endColumn-this._text.length,_.endLineNumber,_.endColumn)}}e.InPlaceReplaceCommand=k}),define(se[306],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.generateIndent=e.getSpaceCnt=void 0;function L(y,E){let S=0;for(let p=0;p<y.length;p++)y.charAt(p)==="	"?S+=E:S++;return S}e.getSpaceCnt=L;function k(y,E,S){y=y<0?0:y;let p="";if(!S){const _=Math.floor(y/E);y=y%E;for(let v=0;v<_;v++)p+="	"}for(let _=0;_<y;_++)p+=" ";return p}e.generateIndent=k}),define(se[216],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.showNextInlineSuggestionActionId=e.showPreviousInlineSuggestionActionId=e.inlineSuggestCommitId=void 0,e.inlineSuggestCommitId="editor.action.inlineSuggest.commit",e.showPreviousInlineSuggestionActionId="editor.action.inlineSuggest.showPrevious",e.showNextInlineSuggestionActionId="editor.action.inlineSuggest.showNext"}),define(se[156],oe([1,0,12,2,35,10,5]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.lengthOfText=e.addPositions=e.applyObservableDecorations=e.ColumnRange=e.getReadonlyEmptyArray=e.applyEdits=void 0;function p(r,u){const f=new _(r),c=u.map(d=>{const s=S.Range.lift(d.range);return{startOffset:f.getOffset(s.getStartPosition()),endOffset:f.getOffset(s.getEndPosition()),text:d.text}});c.sort((d,s)=>s.startOffset-d.startOffset);for(const d of c)r=r.substring(0,d.startOffset)+d.text+r.substring(d.endOffset);return r}e.applyEdits=p;class _{constructor(u){this.lineStartOffsetByLineIdx=[],this.lineStartOffsetByLineIdx.push(0);for(let f=0;f<u.length;f++)u.charAt(f)===`
+`&&this.lineStartOffsetByLineIdx.push(f+1)}getOffset(u){return this.lineStartOffsetByLineIdx[u.lineNumber-1]+u.column-1}}const v=[];function b(){return v}e.getReadonlyEmptyArray=b;class a{constructor(u,f){if(this.startColumn=u,this.endColumnExclusive=f,u>f)throw new L.BugIndicatingError(`startColumn ${u} cannot be after endColumnExclusive ${f}`)}toRange(u){return new S.Range(u,this.startColumn,u,this.endColumnExclusive)}equals(u){return this.startColumn===u.startColumn&&this.endColumnExclusive===u.endColumnExclusive}}e.ColumnRange=a;function i(r,u){const f=new k.DisposableStore,c=r.createDecorationsCollection();return f.add((0,y.autorunOpts)({debugName:()=>`Apply decorations from ${u.debugName}`},d=>{const s=u.read(d);c.set(s)})),f.add({dispose:()=>{c.clear()}}),f}e.applyObservableDecorations=i;function n(r,u){return new E.Position(r.lineNumber+u.lineNumber-1,u.lineNumber===1?r.column+u.column-1:u.column)}e.addPositions=n;function t(r){let u=1,f=1;for(const c of r)c===`
+`?(u++,f=1):f++;return new E.Position(u,f)}e.lengthOfText=t}),define(se[217],oe([1,0,156]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ghostTextOrReplacementEquals=e.GhostTextReplacement=e.GhostTextPart=e.GhostText=void 0;class k{constructor(_,v){this.lineNumber=_,this.parts=v}equals(_){return this.lineNumber===_.lineNumber&&this.parts.length===_.parts.length&&this.parts.every((v,b)=>v.equals(_.parts[b]))}renderForScreenReader(_){if(this.parts.length===0)return"";const v=this.parts[this.parts.length-1],b=_.substr(0,v.column-1);return(0,L.applyEdits)(b,this.parts.map(i=>({range:{startLineNumber:1,endLineNumber:1,startColumn:i.column,endColumn:i.column},text:i.lines.join(`
+`)}))).substring(this.parts[0].column-1)}isEmpty(){return this.parts.every(_=>_.lines.length===0)}get lineCount(){return 1+this.parts.reduce((_,v)=>_+v.lines.length-1,0)}}e.GhostText=k;class y{constructor(_,v,b){this.column=_,this.lines=v,this.preview=b}equals(_){return this.column===_.column&&this.lines.length===_.lines.length&&this.lines.every((v,b)=>v===_.lines[b])}}e.GhostTextPart=y;class E{constructor(_,v,b,a=0){this.lineNumber=_,this.columnRange=v,this.newLines=b,this.additionalReservedLineCount=a,this.parts=[new y(this.columnRange.endColumnExclusive,this.newLines,!1)]}renderForScreenReader(_){return this.newLines.join(`
+`)}get lineCount(){return this.newLines.length}isEmpty(){return this.parts.every(_=>_.lines.length===0)}equals(_){return this.lineNumber===_.lineNumber&&this.columnRange.equals(_.columnRange)&&this.newLines.length===_.newLines.length&&this.newLines.every((v,b)=>v===_.newLines[b])&&this.additionalReservedLineCount===_.additionalReservedLineCount}}e.GhostTextReplacement=E;function S(p,_){return p===_?!0:!p||!_?!1:p instanceof k&&_ instanceof k||p instanceof E&&_ instanceof E?p.equals(_):!1}e.ghostTextOrReplacementEquals=S}),define(se[307],oe([1,0,173,11,5,217,156]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SingleTextEdit=void 0;class p{constructor(t,r){this.range=t,this.text=r}removeCommonPrefix(t,r){const u=r?this.range.intersectRanges(r):this.range;if(!u)return this;const f=t.getValueInRange(u,1),c=(0,k.commonPrefixLength)(f,this.text),d=(0,S.addPositions)(this.range.getStartPosition(),(0,S.lengthOfText)(f.substring(0,c))),s=this.text.substring(c),l=y.Range.fromPositions(d,this.range.getEndPosition());return new p(l,s)}augments(t){return this.text.startsWith(t.text)&&_(this.range,t.range)}computeGhostText(t,r,u,f=0){let c=this.removeCommonPrefix(t);if(c.range.endLineNumber!==c.range.startLineNumber)return;const d=t.getLineContent(c.range.startLineNumber),s=(0,k.getLeadingWhitespace)(d).length;if(c.range.startColumn-1<=s){const w=(0,k.getLeadingWhitespace)(c.text).length,D=d.substring(c.range.startColumn-1,s),[I,T]=[c.range.getStartPosition(),c.range.getEndPosition()],A=I.column+D.length<=T.column?I.delta(0,D.length):T,P=y.Range.fromPositions(A,T),N=c.text.startsWith(D)?c.text.substring(D.length):c.text.substring(w);c=new p(P,N)}const o=t.getValueInRange(c.range),g=b(o,c.text);if(!g)return;const h=c.range.startLineNumber,m=new Array;if(r==="prefix"){const w=g.filter(D=>D.originalLength===0);if(w.length>1||w.length===1&&w[0].originalStart!==o.length)return}const C=c.text.length-f;for(const w of g){const D=c.range.startColumn+w.originalStart+w.originalLength;if(r==="subwordSmart"&&u&&u.lineNumber===c.range.startLineNumber&&D<u.column||w.originalLength>0)return;if(w.modifiedLength===0)continue;const I=w.modifiedStart+w.modifiedLength,T=Math.max(w.modifiedStart,Math.min(I,C)),A=c.text.substring(w.modifiedStart,T),P=c.text.substring(T,Math.max(w.modifiedStart,I));if(A.length>0){const N=(0,k.splitLines)(A);m.push(new E.GhostTextPart(D,N,!1))}if(P.length>0){const N=(0,k.splitLines)(P);m.push(new E.GhostTextPart(D,N,!0))}}return new E.GhostText(h,m)}}e.SingleTextEdit=p;function _(n,t){return t.getStartPosition().equals(n.getStartPosition())&&t.getEndPosition().isBeforeOrEqual(n.getEndPosition())}let v;function b(n,t){if(v?.originalValue===n&&v?.newValue===t)return v?.changes;{let r=i(n,t,!0);if(r){const u=a(r);if(u>0){const f=i(n,t,!1);f&&a(f)<u&&(r=f)}}return v={originalValue:n,newValue:t,changes:r},r}}function a(n){let t=0;for(const r of n)t+=r.originalLength;return t}function i(n,t,r){if(n.length>5e3||t.length>5e3)return;function u(o){let g=0;for(let h=0,m=o.length;h<m;h++){const C=o.charCodeAt(h);C>g&&(g=C)}return g}const f=Math.max(u(n),u(t));function c(o){if(o<0)throw new Error("unexpected");return f+o+1}function d(o){let g=0,h=0;const m=new Int32Array(o.length);for(let C=0,w=o.length;C<w;C++)if(r&&o[C]==="("){const D=h*100+g;m[C]=c(2*D),g++}else if(r&&o[C]===")"){g=Math.max(g-1,0);const D=h*100+g;m[C]=c(2*D+1),g===0&&h++}else m[C]=o.charCodeAt(C);return m}const s=d(n),l=d(t);return new L.LcsDiff({getElements:()=>s},{getElements:()=>l}).ComputeDiff(!1).changes}}),define(se[560],oe([1,0,5,24]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CopyLinesCommand=void 0;class y{constructor(S,p,_){this._selection=S,this._isCopyingDown=p,this._noop=_||!1,this._selectionDirection=0,this._selectionId=null,this._startLineNumberDelta=0,this._endLineNumberDelta=0}getEditOperations(S,p){let _=this._selection;this._startLineNumberDelta=0,this._endLineNumberDelta=0,_.startLineNumber<_.endLineNumber&&_.endColumn===1&&(this._endLineNumberDelta=1,_=_.setEndPosition(_.endLineNumber-1,S.getLineMaxColumn(_.endLineNumber-1)));const v=[];for(let a=_.startLineNumber;a<=_.endLineNumber;a++)v.push(S.getLineContent(a));const b=v.join(`
+`);b===""&&this._isCopyingDown&&(this._startLineNumberDelta++,this._endLineNumberDelta++),this._noop?p.addEditOperation(new L.Range(_.endLineNumber,S.getLineMaxColumn(_.endLineNumber),_.endLineNumber+1,1),_.endLineNumber===S.getLineCount()?"":`
+`):this._isCopyingDown?p.addEditOperation(new L.Range(_.startLineNumber,1,_.startLineNumber,1),b+`
+`):p.addEditOperation(new L.Range(_.endLineNumber,S.getLineMaxColumn(_.endLineNumber),_.endLineNumber,S.getLineMaxColumn(_.endLineNumber)),`
+`+b),this._selectionId=p.trackSelection(_),this._selectionDirection=this._selection.getDirection()}computeCursorState(S,p){let _=p.getTrackedSelection(this._selectionId);if(this._startLineNumberDelta!==0||this._endLineNumberDelta!==0){let v=_.startLineNumber,b=_.startColumn,a=_.endLineNumber,i=_.endColumn;this._startLineNumberDelta!==0&&(v=v+this._startLineNumberDelta,b=1),this._endLineNumberDelta!==0&&(a=a+this._endLineNumberDelta,i=1),_=k.Selection.createWithDirection(v,b,a,i,this._selectionDirection)}return _}}e.CopyLinesCommand=y}),define(se[561],oe([1,0,74,5]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SortLinesCommand=void 0;class y{static getCollator(){return y._COLLATOR||(y._COLLATOR=new Intl.Collator),y._COLLATOR}constructor(_,v){this.selection=_,this.descending=v,this.selectionId=null}getEditOperations(_,v){const b=S(_,this.selection,this.descending);b&&v.addEditOperation(b.range,b.text),this.selectionId=v.trackSelection(this.selection)}computeCursorState(_,v){return v.getTrackedSelection(this.selectionId)}static canRun(_,v,b){if(_===null)return!1;const a=E(_,v,b);if(!a)return!1;for(let i=0,n=a.before.length;i<n;i++)if(a.before[i]!==a.after[i])return!0;return!1}}e.SortLinesCommand=y,y._COLLATOR=null;function E(p,_,v){const b=_.startLineNumber;let a=_.endLineNumber;if(_.endColumn===1&&a--,b>=a)return null;const i=[];for(let t=b;t<=a;t++)i.push(p.getLineContent(t));let n=i.slice(0);return n.sort(y.getCollator().compare),v===!0&&(n=n.reverse()),{startLineNumber:b,endLineNumber:a,before:i,after:n}}function S(p,_,v){const b=E(p,_,v);return b?L.EditOperation.replace(new k.Range(b.startLineNumber,1,b.endLineNumber,p.getLineMaxColumn(b.endLineNumber)),b.after.join(`
+`)):null}}),define(se[308],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isSemanticColoringEnabled=e.SEMANTIC_HIGHLIGHTING_SETTING_ID=void 0,e.SEMANTIC_HIGHLIGHTING_SETTING_ID="editor.semanticHighlighting";function L(k,y,E){var S;const p=(S=E.getValue(e.SEMANTIC_HIGHLIGHTING_SETTING_ID,{overrideIdentifier:k.getLanguageId(),resource:k.uri}))===null||S===void 0?void 0:S.enabled;return typeof p=="boolean"?p:y.getColorTheme().semanticHighlighting}e.isSemanticColoringEnabled=L}),define(se[309],oe([1,0,66,10,5]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketSelectionRangeProvider=void 0;class E{async provideSelectionRanges(p,_){const v=[];for(const b of _){const a=[];v.push(a);const i=new Map;await new Promise(n=>E._bracketsRightYield(n,0,p,b,i)),await new Promise(n=>E._bracketsLeftYield(n,0,p,b,i,a))}return v}static _bracketsRightYield(p,_,v,b,a){const i=new Map,n=Date.now();for(;;){if(_>=E._maxRounds){p();break}if(!b){p();break}const t=v.bracketPairs.findNextBracket(b);if(!t){p();break}if(Date.now()-n>E._maxDuration){setTimeout(()=>E._bracketsRightYield(p,_+1,v,b,a));break}if(t.bracketInfo.isOpeningBracket){const u=t.bracketInfo.bracketText,f=i.has(u)?i.get(u):0;i.set(u,f+1)}else{const u=t.bracketInfo.getOpeningBrackets()[0].bracketText;let f=i.has(u)?i.get(u):0;if(f-=1,i.set(u,Math.max(0,f)),f<0){let c=a.get(u);c||(c=new L.LinkedList,a.set(u,c)),c.push(t.range)}}b=t.range.getEndPosition()}}static _bracketsLeftYield(p,_,v,b,a,i){const n=new Map,t=Date.now();for(;;){if(_>=E._maxRounds&&a.size===0){p();break}if(!b){p();break}const r=v.bracketPairs.findPrevBracket(b);if(!r){p();break}if(Date.now()-t>E._maxDuration){setTimeout(()=>E._bracketsLeftYield(p,_+1,v,b,a,i));break}if(r.bracketInfo.isOpeningBracket){const f=r.bracketInfo.bracketText;let c=n.has(f)?n.get(f):0;if(c-=1,n.set(f,Math.max(0,c)),c<0){const d=a.get(f);if(d){const s=d.shift();d.size===0&&a.delete(f);const l=y.Range.fromPositions(r.range.getEndPosition(),s.getStartPosition()),o=y.Range.fromPositions(r.range.getStartPosition(),s.getEndPosition());i.push({range:l}),i.push({range:o}),E._addBracketLeading(v,o,i)}}}else{const f=r.bracketInfo.getOpeningBrackets()[0].bracketText,c=n.has(f)?n.get(f):0;n.set(f,c+1)}b=r.range.getStartPosition()}}static _addBracketLeading(p,_,v){if(_.startLineNumber===_.endLineNumber)return;const b=_.startLineNumber,a=p.getLineFirstNonWhitespaceColumn(b);a!==0&&a!==_.startColumn&&(v.push({range:y.Range.fromPositions(new k.Position(b,a),_.getEndPosition())}),v.push({range:y.Range.fromPositions(new k.Position(b,1),_.getEndPosition())}));const i=b-1;if(i>0){const n=p.getLineFirstNonWhitespaceColumn(i);n===_.startColumn&&n!==p.getLineLastNonWhitespaceColumn(i)&&(v.push({range:y.Range.fromPositions(new k.Position(i,n),_.getEndPosition())}),v.push({range:y.Range.fromPositions(new k.Position(i,1),_.getEndPosition())}))}}}e.BracketSelectionRangeProvider=E,E._maxDuration=30,E._maxRounds=2}),define(se[562],oe([1,0,11,5]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WordSelectionRangeProvider=void 0;class y{constructor(S=!0){this.selectSubwords=S}provideSelectionRanges(S,p){const _=[];for(const v of p){const b=[];_.push(b),this.selectSubwords&&this._addInWordRanges(b,S,v),this._addWordRanges(b,S,v),this._addWhitespaceLine(b,S,v),b.push({range:S.getFullModelRange()})}return _}_addInWordRanges(S,p,_){const v=p.getWordAtPosition(_);if(!v)return;const{word:b,startColumn:a}=v,i=_.column-a;let n=i,t=i,r=0;for(;n>=0;n--){const u=b.charCodeAt(n);if(n!==i&&(u===95||u===45))break;if((0,L.isLowerAsciiLetter)(u)&&(0,L.isUpperAsciiLetter)(r))break;r=u}for(n+=1;t<b.length;t++){const u=b.charCodeAt(t);if((0,L.isUpperAsciiLetter)(u)&&(0,L.isLowerAsciiLetter)(r))break;if(u===95||u===45)break;r=u}n<t&&S.push({range:new k.Range(_.lineNumber,a+n,_.lineNumber,a+t)})}_addWordRanges(S,p,_){const v=p.getWordAtPosition(_);v&&S.push({range:new k.Range(_.lineNumber,v.startColumn,_.lineNumber,v.endColumn)})}_addWhitespaceLine(S,p,_){p.getLineLength(_.lineNumber)>0&&p.getLineFirstNonWhitespaceColumn(_.lineNumber)===0&&p.getLineLastNonWhitespaceColumn(_.lineNumber)===0&&S.push({range:new k.Range(_.lineNumber,1,_.lineNumber,p.getLineMaxColumn(_.lineNumber))})}}e.WordSelectionRangeProvider=y}),define(se[117],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SnippetParser=e.TextmateSnippet=e.Variable=e.FormatString=e.Transform=e.Choice=e.Placeholder=e.TransformableMarker=e.Text=e.Marker=e.Scanner=void 0;class L{constructor(){this.value="",this.pos=0}static isDigitCharacter(r){return r>=48&&r<=57}static isVariableCharacter(r){return r===95||r>=97&&r<=122||r>=65&&r<=90}text(r){this.value=r,this.pos=0}tokenText(r){return this.value.substr(r.pos,r.len)}next(){if(this.pos>=this.value.length)return{type:14,pos:this.pos,len:0};const r=this.pos;let u=0,f=this.value.charCodeAt(r),c;if(c=L._table[f],typeof c=="number")return this.pos+=1,{type:c,pos:r,len:1};if(L.isDigitCharacter(f)){c=8;do u+=1,f=this.value.charCodeAt(r+u);while(L.isDigitCharacter(f));return this.pos+=u,{type:c,pos:r,len:u}}if(L.isVariableCharacter(f)){c=9;do f=this.value.charCodeAt(r+ ++u);while(L.isVariableCharacter(f)||L.isDigitCharacter(f));return this.pos+=u,{type:c,pos:r,len:u}}c=10;do u+=1,f=this.value.charCodeAt(r+u);while(!isNaN(f)&&typeof L._table[f]>"u"&&!L.isDigitCharacter(f)&&!L.isVariableCharacter(f));return this.pos+=u,{type:c,pos:r,len:u}}}e.Scanner=L,L._table={[36]:0,[58]:1,[44]:2,[123]:3,[125]:4,[92]:5,[47]:6,[124]:7,[43]:11,[45]:12,[63]:13};class k{constructor(){this._children=[]}appendChild(r){return r instanceof y&&this._children[this._children.length-1]instanceof y?this._children[this._children.length-1].value+=r.value:(r.parent=this,this._children.push(r)),this}replace(r,u){const{parent:f}=r,c=f.children.indexOf(r),d=f.children.slice(0);d.splice(c,1,...u),f._children=d,function s(l,o){for(const g of l)g.parent=o,s(g.children,g)}(u,f)}get children(){return this._children}get rightMostDescendant(){return this._children.length>0?this._children[this._children.length-1].rightMostDescendant:this}get snippet(){let r=this;for(;;){if(!r)return;if(r instanceof i)return r;r=r.parent}}toString(){return this.children.reduce((r,u)=>r+u.toString(),"")}len(){return 0}}e.Marker=k;class y extends k{constructor(r){super(),this.value=r}toString(){return this.value}len(){return this.value.length}clone(){return new y(this.value)}}e.Text=y;class E extends k{}e.TransformableMarker=E;class S extends E{static compareByIndex(r,u){return r.index===u.index?0:r.isFinalTabstop?1:u.isFinalTabstop||r.index<u.index?-1:r.index>u.index?1:0}constructor(r){super(),this.index=r}get isFinalTabstop(){return this.index===0}get choice(){return this._children.length===1&&this._children[0]instanceof p?this._children[0]:void 0}clone(){const r=new S(this.index);return this.transform&&(r.transform=this.transform.clone()),r._children=this.children.map(u=>u.clone()),r}}e.Placeholder=S;class p extends k{constructor(){super(...arguments),this.options=[]}appendChild(r){return r instanceof y&&(r.parent=this,this.options.push(r)),this}toString(){return this.options[0].value}len(){return this.options[0].len()}clone(){const r=new p;return this.options.forEach(r.appendChild,r),r}}e.Choice=p;class _ extends k{constructor(){super(...arguments),this.regexp=new RegExp("")}resolve(r){const u=this;let f=!1,c=r.replace(this.regexp,function(){return f=!0,u._replace(Array.prototype.slice.call(arguments,0,-2))});return!f&&this._children.some(d=>d instanceof v&&!!d.elseValue)&&(c=this._replace([])),c}_replace(r){let u="";for(const f of this._children)if(f instanceof v){let c=r[f.index]||"";c=f.resolve(c),u+=c}else u+=f.toString();return u}toString(){return""}clone(){const r=new _;return r.regexp=new RegExp(this.regexp.source,(this.regexp.ignoreCase?"i":"")+(this.regexp.global?"g":"")),r._children=this.children.map(u=>u.clone()),r}}e.Transform=_;class v extends k{constructor(r,u,f,c){super(),this.index=r,this.shorthandName=u,this.ifValue=f,this.elseValue=c}resolve(r){return this.shorthandName==="upcase"?r?r.toLocaleUpperCase():"":this.shorthandName==="downcase"?r?r.toLocaleLowerCase():"":this.shorthandName==="capitalize"?r?r[0].toLocaleUpperCase()+r.substr(1):"":this.shorthandName==="pascalcase"?r?this._toPascalCase(r):"":this.shorthandName==="camelcase"?r?this._toCamelCase(r):"":r&&typeof this.ifValue=="string"?this.ifValue:!r&&typeof this.elseValue=="string"?this.elseValue:r||""}_toPascalCase(r){const u=r.match(/[a-z0-9]+/gi);return u?u.map(f=>f.charAt(0).toUpperCase()+f.substr(1)).join(""):r}_toCamelCase(r){const u=r.match(/[a-z0-9]+/gi);return u?u.map((f,c)=>c===0?f.charAt(0).toLowerCase()+f.substr(1):f.charAt(0).toUpperCase()+f.substr(1)).join(""):r}clone(){return new v(this.index,this.shorthandName,this.ifValue,this.elseValue)}}e.FormatString=v;class b extends E{constructor(r){super(),this.name=r}resolve(r){let u=r.resolve(this);return this.transform&&(u=this.transform.resolve(u||"")),u!==void 0?(this._children=[new y(u)],!0):!1}clone(){const r=new b(this.name);return this.transform&&(r.transform=this.transform.clone()),r._children=this.children.map(u=>u.clone()),r}}e.Variable=b;function a(t,r){const u=[...t];for(;u.length>0;){const f=u.shift();if(!r(f))break;u.unshift(...f.children)}}class i extends k{get placeholderInfo(){if(!this._placeholders){const r=[];let u;this.walk(function(f){return f instanceof S&&(r.push(f),u=!u||u.index<f.index?f:u),!0}),this._placeholders={all:r,last:u}}return this._placeholders}get placeholders(){const{all:r}=this.placeholderInfo;return r}offset(r){let u=0,f=!1;return this.walk(c=>c===r?(f=!0,!1):(u+=c.len(),!0)),f?u:-1}fullLen(r){let u=0;return a([r],f=>(u+=f.len(),!0)),u}enclosingPlaceholders(r){const u=[];let{parent:f}=r;for(;f;)f instanceof S&&u.push(f),f=f.parent;return u}resolveVariables(r){return this.walk(u=>(u instanceof b&&u.resolve(r)&&(this._placeholders=void 0),!0)),this}appendChild(r){return this._placeholders=void 0,super.appendChild(r)}replace(r,u){return this._placeholders=void 0,super.replace(r,u)}clone(){const r=new i;return this._children=this.children.map(u=>u.clone()),r}walk(r){a(this.children,r)}}e.TextmateSnippet=i;class n{constructor(){this._scanner=new L,this._token={type:14,pos:0,len:0}}static escape(r){return r.replace(/\$|}|\\/g,"\\$&")}static guessNeedsClipboard(r){return/\${?CLIPBOARD/.test(r)}parse(r,u,f){const c=new i;return this.parseFragment(r,c),this.ensureFinalTabstop(c,f??!1,u??!1),c}parseFragment(r,u){const f=u.children.length;for(this._scanner.text(r),this._token=this._scanner.next();this._parse(u););const c=new Map,d=[];u.walk(o=>(o instanceof S&&(o.isFinalTabstop?c.set(0,void 0):!c.has(o.index)&&o.children.length>0?c.set(o.index,o.children):d.push(o)),!0));const s=(o,g)=>{const h=c.get(o.index);if(!h)return;const m=new S(o.index);m.transform=o.transform;for(const C of h){const w=C.clone();m.appendChild(w),w instanceof S&&c.has(w.index)&&!g.has(w.index)&&(g.add(w.index),s(w,g),g.delete(w.index))}u.replace(o,[m])},l=new Set;for(const o of d)s(o,l);return u.children.slice(f)}ensureFinalTabstop(r,u,f){(u||f&&r.placeholders.length>0)&&(r.placeholders.find(d=>d.index===0)||r.appendChild(new S(0)))}_accept(r,u){if(r===void 0||this._token.type===r){const f=u?this._scanner.tokenText(this._token):!0;return this._token=this._scanner.next(),f}return!1}_backTo(r){return this._scanner.pos=r.pos+r.len,this._token=r,!1}_until(r){const u=this._token;for(;this._token.type!==r;){if(this._token.type===14)return!1;if(this._token.type===5){const c=this._scanner.next();if(c.type!==0&&c.type!==4&&c.type!==5)return!1}this._token=this._scanner.next()}const f=this._scanner.value.substring(u.pos,this._token.pos).replace(/\\(\$|}|\\)/g,"$1");return this._token=this._scanner.next(),f}_parse(r){return this._parseEscaped(r)||this._parseTabstopOrVariableName(r)||this._parseComplexPlaceholder(r)||this._parseComplexVariable(r)||this._parseAnything(r)}_parseEscaped(r){let u;return(u=this._accept(5,!0))?(u=this._accept(0,!0)||this._accept(4,!0)||this._accept(5,!0)||u,r.appendChild(new y(u)),!0):!1}_parseTabstopOrVariableName(r){let u;const f=this._token;return this._accept(0)&&(u=this._accept(9,!0)||this._accept(8,!0))?(r.appendChild(/^\d+$/.test(u)?new S(Number(u)):new b(u)),!0):this._backTo(f)}_parseComplexPlaceholder(r){let u;const f=this._token;if(!(this._accept(0)&&this._accept(3)&&(u=this._accept(8,!0))))return this._backTo(f);const d=new S(Number(u));if(this._accept(1))for(;;){if(this._accept(4))return r.appendChild(d),!0;if(!this._parse(d))return r.appendChild(new y("${"+u+":")),d.children.forEach(r.appendChild,r),!0}else if(d.index>0&&this._accept(7)){const s=new p;for(;;){if(this._parseChoiceElement(s)){if(this._accept(2))continue;if(this._accept(7)&&(d.appendChild(s),this._accept(4)))return r.appendChild(d),!0}return this._backTo(f),!1}}else return this._accept(6)?this._parseTransform(d)?(r.appendChild(d),!0):(this._backTo(f),!1):this._accept(4)?(r.appendChild(d),!0):this._backTo(f)}_parseChoiceElement(r){const u=this._token,f=[];for(;!(this._token.type===2||this._token.type===7);){let c;if((c=this._accept(5,!0))?c=this._accept(2,!0)||this._accept(7,!0)||this._accept(5,!0)||c:c=this._accept(void 0,!0),!c)return this._backTo(u),!1;f.push(c)}return f.length===0?(this._backTo(u),!1):(r.appendChild(new y(f.join(""))),!0)}_parseComplexVariable(r){let u;const f=this._token;if(!(this._accept(0)&&this._accept(3)&&(u=this._accept(9,!0))))return this._backTo(f);const d=new b(u);if(this._accept(1))for(;;){if(this._accept(4))return r.appendChild(d),!0;if(!this._parse(d))return r.appendChild(new y("${"+u+":")),d.children.forEach(r.appendChild,r),!0}else return this._accept(6)?this._parseTransform(d)?(r.appendChild(d),!0):(this._backTo(f),!1):this._accept(4)?(r.appendChild(d),!0):this._backTo(f)}_parseTransform(r){const u=new _;let f="",c="";for(;!this._accept(6);){let d;if(d=this._accept(5,!0)){d=this._accept(6,!0)||d,f+=d;continue}if(this._token.type!==14){f+=this._accept(void 0,!0);continue}return!1}for(;!this._accept(6);){let d;if(d=this._accept(5,!0)){d=this._accept(5,!0)||this._accept(6,!0)||d,u.appendChild(new y(d));continue}if(!(this._parseFormatString(u)||this._parseAnything(u)))return!1}for(;!this._accept(4);){if(this._token.type!==14){c+=this._accept(void 0,!0);continue}return!1}try{u.regexp=new RegExp(f,c)}catch{return!1}return r.transform=u,!0}_parseFormatString(r){const u=this._token;if(!this._accept(0))return!1;let f=!1;this._accept(3)&&(f=!0);const c=this._accept(8,!0);if(c)if(f){if(this._accept(4))return r.appendChild(new v(Number(c))),!0;if(!this._accept(1))return this._backTo(u),!1}else return r.appendChild(new v(Number(c))),!0;else return this._backTo(u),!1;if(this._accept(6)){const d=this._accept(9,!0);return!d||!this._accept(4)?(this._backTo(u),!1):(r.appendChild(new v(Number(c),d)),!0)}else if(this._accept(11)){const d=this._until(4);if(d)return r.appendChild(new v(Number(c),void 0,d,void 0)),!0}else if(this._accept(12)){const d=this._until(4);if(d)return r.appendChild(new v(Number(c),void 0,void 0,d)),!0}else if(this._accept(13)){const d=this._until(1);if(d){const s=this._until(4);if(s)return r.appendChild(new v(Number(c),void 0,d,s)),!0}}else{const d=this._until(4);if(d)return r.appendChild(new v(Number(c),void 0,void 0,d)),!0}return this._backTo(u),!1}_parseAnything(r){return this._token.type!==14?(r.appendChild(new y(this._scanner.tokenText(this._token))),this._accept(void 0),!0):!1}}e.SnippetParser=n}),define(se[310],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StickyModel=e.StickyElement=e.StickyRange=void 0;class L{constructor(S,p){this.startLineNumber=S,this.endLineNumber=p}}e.StickyRange=L;class k{constructor(S,p,_){this.range=S,this.children=p,this.parent=_}}e.StickyElement=k;class y{constructor(S,p,_,v){this.uri=S,this.version=p,this.element=_,this.outlineProviderId=v}}e.StickyModel=y}),define(se[311],oe([1,0,13,71,11]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompletionModel=e.LineContext=void 0;class E{constructor(_,v){this.leadingLineContent=_,this.characterCountDelta=v}}e.LineContext=E;class S{constructor(_,v,b,a,i,n,t=k.FuzzyScoreOptions.default,r=void 0){this.clipboardText=r,this._snippetCompareFn=S._compareCompletionItems,this._items=_,this._column=v,this._wordDistance=a,this._options=i,this._refilterKind=1,this._lineContext=b,this._fuzzyScoreOptions=t,n==="top"?this._snippetCompareFn=S._compareCompletionItemsSnippetsUp:n==="bottom"&&(this._snippetCompareFn=S._compareCompletionItemsSnippetsDown)}get lineContext(){return this._lineContext}set lineContext(_){(this._lineContext.leadingLineContent!==_.leadingLineContent||this._lineContext.characterCountDelta!==_.characterCountDelta)&&(this._refilterKind=this._lineContext.characterCountDelta<_.characterCountDelta&&this._filteredItems?2:1,this._lineContext=_)}get items(){return this._ensureCachedState(),this._filteredItems}getItemsByProvider(){return this._ensureCachedState(),this._itemsByProvider}getIncompleteProvider(){this._ensureCachedState();const _=new Set;for(const[v,b]of this.getItemsByProvider())b.length>0&&b[0].container.incomplete&&_.add(v);return _}get stats(){return this._ensureCachedState(),this._stats}_ensureCachedState(){this._refilterKind!==0&&this._createCachedState()}_createCachedState(){this._itemsByProvider=new Map;const _=[],{leadingLineContent:v,characterCountDelta:b}=this._lineContext;let a="",i="";const n=this._refilterKind===1?this._items:this._filteredItems,t=[],r=!this._options.filterGraceful||n.length>2e3?k.fuzzyScore:k.fuzzyScoreGracefulAggressive;for(let u=0;u<n.length;u++){const f=n[u];if(f.isInvalid)continue;const c=this._itemsByProvider.get(f.provider);c?c.push(f):this._itemsByProvider.set(f.provider,[f]);const d=f.position.column-f.editStart.column,s=d+b-(f.position.column-this._column);if(a.length!==s&&(a=s===0?"":v.slice(-s),i=a.toLowerCase()),f.word=a,s===0)f.score=k.FuzzyScore.Default;else{let l=0;for(;l<d;){const o=a.charCodeAt(l);if(o===32||o===9)l+=1;else break}if(l>=s)f.score=k.FuzzyScore.Default;else if(typeof f.completion.filterText=="string"){const o=r(a,i,l,f.completion.filterText,f.filterTextLow,0,this._fuzzyScoreOptions);if(!o)continue;(0,y.compareIgnoreCase)(f.completion.filterText,f.textLabel)===0?f.score=o:(f.score=(0,k.anyScore)(a,i,l,f.textLabel,f.labelLow,0),f.score[0]=o[0])}else{const o=r(a,i,l,f.textLabel,f.labelLow,0,this._fuzzyScoreOptions);if(!o)continue;f.score=o}}f.idx=u,f.distance=this._wordDistance.distance(f.position,f.completion),t.push(f),_.push(f.textLabel.length)}this._filteredItems=t.sort(this._snippetCompareFn),this._refilterKind=0,this._stats={pLabelLen:_.length?(0,L.quickSelect)(_.length-.85,_,(u,f)=>u-f):0}}static _compareCompletionItems(_,v){return _.score[0]>v.score[0]?-1:_.score[0]<v.score[0]?1:_.distance<v.distance?-1:_.distance>v.distance?1:_.idx<v.idx?-1:_.idx>v.idx?1:0}static _compareCompletionItemsSnippetsDown(_,v){if(_.completion.kind!==v.completion.kind){if(_.completion.kind===27)return 1;if(v.completion.kind===27)return-1}return S._compareCompletionItems(_,v)}static _compareCompletionItemsSnippetsUp(_,v){if(_.completion.kind!==v.completion.kind){if(_.completion.kind===27)return-1;if(v.completion.kind===27)return 1}return S._compareCompletionItems(_,v)}}e.CompletionModel=S}),define(se[563],oe([1,0,13,2,128]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CommitCharacterController=void 0;class E{constructor(p,_,v,b){this._disposables=new k.DisposableStore,this._disposables.add(v.onDidSuggest(a=>{a.completionModel.items.length===0&&this.reset()})),this._disposables.add(v.onDidCancel(a=>{this.reset()})),this._disposables.add(_.onDidShow(()=>this._onItem(_.getFocusedItem()))),this._disposables.add(_.onDidFocus(this._onItem,this)),this._disposables.add(_.onDidHide(this.reset,this)),this._disposables.add(p.onWillType(a=>{if(this._active&&!_.isFrozen()&&v.state!==0){const i=a.charCodeAt(a.length-1);this._active.acceptCharacters.has(i)&&p.getOption(0)&&b(this._active.item)}}))}_onItem(p){if(!p||!(0,L.isNonEmptyArray)(p.item.completion.commitCharacters)){this.reset();return}if(this._active&&this._active.item.item===p.item)return;const _=new y.CharacterSet;for(const v of p.item.completion.commitCharacters)v.length>0&&_.add(v.charCodeAt(0));this._active={acceptCharacters:_,item:p}}reset(){this._active=void 0}dispose(){this._disposables.dispose()}}e.CommitCharacterController=E}),define(se[564],oe([1,0,2]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OvertypingCapturer=void 0;class k{constructor(E,S){this._disposables=new L.DisposableStore,this._lastOvertyped=[],this._locked=!1,this._disposables.add(E.onWillType(()=>{if(this._locked||!E.hasModel())return;const p=E.getSelections(),_=p.length;let v=!1;for(let a=0;a<_;a++)if(!p[a].isEmpty()){v=!0;break}if(!v){this._lastOvertyped.length!==0&&(this._lastOvertyped.length=0);return}this._lastOvertyped=[];const b=E.getModel();for(let a=0;a<_;a++){const i=p[a];if(b.getValueLengthInRange(i)>k._maxSelectionLength)return;this._lastOvertyped[a]={value:b.getValueInRange(i),multiline:i.startLineNumber!==i.endLineNumber}}})),this._disposables.add(S.onDidTrigger(p=>{this._locked=!0})),this._disposables.add(S.onDidCancel(p=>{this._locked=!1}))}getLastOvertypedInfo(E){if(E>=0&&E<this._lastOvertyped.length)return this._lastOvertyped[E]}dispose(){this._disposables.dispose()}}e.OvertypingCapturer=k,k._maxSelectionLength=51200}),define(se[312],oe([1,0,13,5,309]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WordDistance=void 0;class E{static async create(p,_){if(!_.getOption(117).localityBonus||!_.hasModel())return E.None;const v=_.getModel(),b=_.getPosition();if(!p.canComputeWordRanges(v.uri))return E.None;const[a]=await new y.BracketSelectionRangeProvider().provideSelectionRanges(v,[b]);if(a.length===0)return E.None;const i=await p.computeWordRanges(v.uri,a[0].range);if(!i)return E.None;const n=v.getWordUntilPosition(b);return delete i[n.word],new class extends E{distance(t,r){if(!b.equals(_.getPosition()))return 0;if(r.kind===17)return 2<<20;const u=typeof r.label=="string"?r.label:r.label.label,f=i[u];if((0,L.isFalsyOrEmpty)(f))return 2<<20;const c=(0,L.binarySearch)(f,k.Range.fromPositions(t),k.Range.compareRangesUsingStarts),d=c>=0?f[c]:f[Math.max(0,~c-1)];let s=a.length;for(const l of a){if(!k.Range.containsRange(l.range,d))break;s-=1}return s}}}}e.WordDistance=E,E.None=new class extends E{distance(){return 0}}}),define(se[313],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.stateExists=e.findRules=e.substituteMatches=e.createError=e.log=e.sanitize=e.fixCase=e.empty=e.isIAction=e.isString=e.isFuzzyAction=e.isFuzzyActionArr=void 0;function L(t){return Array.isArray(t)}e.isFuzzyActionArr=L;function k(t){return!L(t)}e.isFuzzyAction=k;function y(t){return typeof t=="string"}e.isString=y;function E(t){return!y(t)}e.isIAction=E;function S(t){return!t}e.empty=S;function p(t,r){return t.ignoreCase&&r?r.toLowerCase():r}e.fixCase=p;function _(t){return t.replace(/[&<>'"_]/g,"-")}e.sanitize=_;function v(t,r){console.log(`${t.languageId}: ${r}`)}e.log=v;function b(t,r){return new Error(`${t.languageId}: ${r}`)}e.createError=b;function a(t,r,u,f,c){const d=/\$((\$)|(#)|(\d\d?)|[sS](\d\d?)|@(\w+))/g;let s=null;return r.replace(d,function(l,o,g,h,m,C,w,D,I){return S(g)?S(h)?!S(m)&&m<f.length?p(t,f[m]):!S(w)&&t&&typeof t[w]=="string"?t[w]:(s===null&&(s=c.split("."),s.unshift(c)),!S(C)&&C<s.length?p(t,s[C]):""):p(t,u):"$"})}e.substituteMatches=a;function i(t,r){let u=r;for(;u&&u.length>0;){const f=t.tokenizer[u];if(f)return f;const c=u.lastIndexOf(".");c<0?u=null:u=u.substr(0,c)}return null}e.findRules=i;function n(t,r){let u=r;for(;u&&u.length>0;){if(t.stateNames[u])return!0;const c=u.lastIndexOf(".");c<0?u=null:u=u.substr(0,c)}return!1}e.stateExists=n}),define(se[565],oe([1,0,313]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compile=void 0;function k(t,r){if(!r||!Array.isArray(r))return!1;for(const u of r)if(!t(u))return!1;return!0}function y(t,r){return typeof t=="boolean"?t:r}function E(t,r){return typeof t=="string"?t:r}function S(t){const r={};for(const u of t)r[u]=!0;return r}function p(t,r=!1){r&&(t=t.map(function(f){return f.toLowerCase()}));const u=S(t);return r?function(f){return u[f.toLowerCase()]!==void 0&&u.hasOwnProperty(f.toLowerCase())}:function(f){return u[f]!==void 0&&u.hasOwnProperty(f)}}function _(t,r){r=r.replace(/@@/g,"");let u=0,f;do f=!1,r=r.replace(/@(\w+)/g,function(d,s){f=!0;let l="";if(typeof t[s]=="string")l=t[s];else if(t[s]&&t[s]instanceof RegExp)l=t[s].source;else throw t[s]===void 0?L.createError(t,"language definition does not contain attribute '"+s+"', used at: "+r):L.createError(t,"attribute reference '"+s+"' must be a string, used at: "+r);return L.empty(l)?"":"(?:"+l+")"}),u++;while(f&&u<5);r=r.replace(/\x01/g,"@");const c=(t.ignoreCase?"i":"")+(t.unicode?"u":"");return new RegExp(r,c)}function v(t,r,u,f){if(f<0)return t;if(f<r.length)return r[f];if(f>=100){f=f-100;const c=u.split(".");if(c.unshift(u),f<c.length)return c[f]}return null}function b(t,r,u,f){let c=-1,d=u,s=u.match(/^\$(([sS]?)(\d\d?)|#)(.*)$/);s&&(s[3]&&(c=parseInt(s[3]),s[2]&&(c=c+100)),d=s[4]);let l="~",o=d;!d||d.length===0?(l="!=",o=""):/^\w*$/.test(o)?l="==":(s=d.match(/^(@|!@|~|!~|==|!=)(.*)$/),s&&(l=s[1],o=s[2]));let g;if((l==="~"||l==="!~")&&/^(\w|\|)*$/.test(o)){const h=p(o.split("|"),t.ignoreCase);g=function(m){return l==="~"?h(m):!h(m)}}else if(l==="@"||l==="!@"){const h=t[o];if(!h)throw L.createError(t,"the @ match target '"+o+"' is not defined, in rule: "+r);if(!k(function(C){return typeof C=="string"},h))throw L.createError(t,"the @ match target '"+o+"' must be an array of strings, in rule: "+r);const m=p(h,t.ignoreCase);g=function(C){return l==="@"?m(C):!m(C)}}else if(l==="~"||l==="!~")if(o.indexOf("$")<0){const h=_(t,"^"+o+"$");g=function(m){return l==="~"?h.test(m):!h.test(m)}}else g=function(h,m,C,w){return _(t,"^"+L.substituteMatches(t,o,m,C,w)+"$").test(h)};else if(o.indexOf("$")<0){const h=L.fixCase(t,o);g=function(m){return l==="=="?m===h:m!==h}}else{const h=L.fixCase(t,o);g=function(m,C,w,D,I){const T=L.substituteMatches(t,h,C,w,D);return l==="=="?m===T:m!==T}}return c===-1?{name:u,value:f,test:function(h,m,C,w){return g(h,h,m,C,w)}}:{name:u,value:f,test:function(h,m,C,w){const D=v(h,m,C,c);return g(D||"",h,m,C,w)}}}function a(t,r,u){if(u){if(typeof u=="string")return u;if(u.token||u.token===""){if(typeof u.token!="string")throw L.createError(t,"a 'token' attribute must be of type string, in rule: "+r);{const f={token:u.token};if(u.token.indexOf("$")>=0&&(f.tokenSubst=!0),typeof u.bracket=="string")if(u.bracket==="@open")f.bracket=1;else if(u.bracket==="@close")f.bracket=-1;else throw L.createError(t,"a 'bracket' attribute must be either '@open' or '@close', in rule: "+r);if(u.next){if(typeof u.next!="string")throw L.createError(t,"the next state must be a string value in rule: "+r);{let c=u.next;if(!/^(@pop|@push|@popall)$/.test(c)&&(c[0]==="@"&&(c=c.substr(1)),c.indexOf("$")<0&&!L.stateExists(t,L.substituteMatches(t,c,"",[],""))))throw L.createError(t,"the next state '"+u.next+"' is not defined in rule: "+r);f.next=c}}return typeof u.goBack=="number"&&(f.goBack=u.goBack),typeof u.switchTo=="string"&&(f.switchTo=u.switchTo),typeof u.log=="string"&&(f.log=u.log),typeof u.nextEmbedded=="string"&&(f.nextEmbedded=u.nextEmbedded,t.usesEmbedded=!0),f}}else if(Array.isArray(u)){const f=[];for(let c=0,d=u.length;c<d;c++)f[c]=a(t,r,u[c]);return{group:f}}else if(u.cases){const f=[];for(const d in u.cases)if(u.cases.hasOwnProperty(d)){const s=a(t,r,u.cases[d]);d==="@default"||d==="@"||d===""?f.push({test:void 0,value:s,name:d}):d==="@eos"?f.push({test:function(l,o,g,h){return h},value:s,name:d}):f.push(b(t,r,d,s))}const c=t.defaultToken;return{test:function(d,s,l,o){for(const g of f)if(!g.test||g.test(d,s,l,o))return g.value;return c}}}else throw L.createError(t,"an action must be a string, an object with a 'token' or 'cases' attribute, or an array of actions; in rule: "+r)}else return{token:""}}class i{constructor(r){this.regex=new RegExp(""),this.action={token:""},this.matchOnlyAtLineStart=!1,this.name="",this.name=r}setRegex(r,u){let f;if(typeof u=="string")f=u;else if(u instanceof RegExp)f=u.source;else throw L.createError(r,"rules must start with a match string or regular expression: "+this.name);this.matchOnlyAtLineStart=f.length>0&&f[0]==="^",this.name=this.name+": "+f,this.regex=_(r,"^(?:"+(this.matchOnlyAtLineStart?f.substr(1):f)+")")}setAction(r,u){this.action=a(r,this.name,u)}}function n(t,r){if(!r||typeof r!="object")throw new Error("Monarch: expecting a language definition object");const u={};u.languageId=t,u.includeLF=y(r.includeLF,!1),u.noThrow=!1,u.maxStack=100,u.start=typeof r.start=="string"?r.start:null,u.ignoreCase=y(r.ignoreCase,!1),u.unicode=y(r.unicode,!1),u.tokenPostfix=E(r.tokenPostfix,"."+u.languageId),u.defaultToken=E(r.defaultToken,"source"),u.usesEmbedded=!1;const f=r;f.languageId=t,f.includeLF=u.includeLF,f.ignoreCase=u.ignoreCase,f.unicode=u.unicode,f.noThrow=u.noThrow,f.usesEmbedded=u.usesEmbedded,f.stateNames=r.tokenizer,f.defaultToken=u.defaultToken;function c(s,l,o){for(const g of o){let h=g.include;if(h){if(typeof h!="string")throw L.createError(u,"an 'include' attribute must be a string at: "+s);if(h[0]==="@"&&(h=h.substr(1)),!r.tokenizer[h])throw L.createError(u,"include target '"+h+"' is not defined at: "+s);c(s+"."+h,l,r.tokenizer[h])}else{const m=new i(s);if(Array.isArray(g)&&g.length>=1&&g.length<=3)if(m.setRegex(f,g[0]),g.length>=3)if(typeof g[1]=="string")m.setAction(f,{token:g[1],next:g[2]});else if(typeof g[1]=="object"){const C=g[1];C.next=g[2],m.setAction(f,C)}else throw L.createError(u,"a next state as the last element of a rule can only be given if the action is either an object or a string, at: "+s);else m.setAction(f,g[1]);else{if(!g.regex)throw L.createError(u,"a rule must either be an array, or an object with a 'regex' or 'include' field at: "+s);g.name&&typeof g.name=="string"&&(m.name=g.name),g.matchOnlyAtStart&&(m.matchOnlyAtLineStart=y(g.matchOnlyAtLineStart,!1)),m.setRegex(f,g.regex),m.setAction(f,g.action)}l.push(m)}}}if(!r.tokenizer||typeof r.tokenizer!="object")throw L.createError(u,"a language definition must define the 'tokenizer' attribute as an object");u.tokenizer=[];for(const s in r.tokenizer)if(r.tokenizer.hasOwnProperty(s)){u.start||(u.start=s);const l=r.tokenizer[s];u.tokenizer[s]=new Array,c("tokenizer."+s,u.tokenizer[s],l)}if(u.usesEmbedded=f.usesEmbedded,r.brackets){if(!Array.isArray(r.brackets))throw L.createError(u,"the 'brackets' attribute must be defined as an array")}else r.brackets=[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}];const d=[];for(const s of r.brackets){let l=s;if(l&&Array.isArray(l)&&l.length===3&&(l={token:l[2],open:l[0],close:l[1]}),l.open===l.close)throw L.createError(u,"open and close brackets in a 'brackets' attribute must be different: "+l.open+`
+ hint: use the 'bracket' attribute if matching on equal brackets is required.`);if(typeof l.open=="string"&&typeof l.token=="string"&&typeof l.close=="string")d.push({token:l.token+u.tokenPostfix,open:L.fixCase(u,l.open),close:L.fixCase(u,l.close)});else throw L.createError(u,"every element in the 'brackets' array must be a '{open,close,token}' object or array")}return u.brackets=d,u.noThrow=!0,u}e.compile=n}),define(se[566],oe([3,4]),function(te,e){return te.create("vs/base/browser/ui/actionbar/actionViewItems",e)}),define(se[567],oe([3,4]),function(te,e){return te.create("vs/base/browser/ui/findinput/findInput",e)}),define(se[568],oe([3,4]),function(te,e){return te.create("vs/base/browser/ui/findinput/findInputToggles",e)}),define(se[569],oe([3,4]),function(te,e){return te.create("vs/base/browser/ui/findinput/replaceInput",e)}),define(se[570],oe([3,4]),function(te,e){return te.create("vs/base/browser/ui/hover/hoverWidget",e)}),define(se[571],oe([3,4]),function(te,e){return te.create("vs/base/browser/ui/iconLabel/iconLabelHover",e)}),define(se[572],oe([3,4]),function(te,e){return te.create("vs/base/browser/ui/inputbox/inputBox",e)}),define(se[573],oe([3,4]),function(te,e){return te.create("vs/base/browser/ui/keybindingLabel/keybindingLabel",e)}),define(se[574],oe([3,4]),function(te,e){return te.create("vs/base/browser/ui/selectBox/selectBoxCustom",e)}),define(se[575],oe([3,4]),function(te,e){return te.create("vs/base/browser/ui/toolbar/toolbar",e)}),define(se[576],oe([3,4]),function(te,e){return te.create("vs/base/browser/ui/tree/abstractTree",e)}),define(se[577],oe([3,4]),function(te,e){return te.create("vs/base/common/actions",e)}),define(se[42],oe([1,0,6,2,577]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toAction=e.EmptySubmenuAction=e.SubmenuAction=e.Separator=e.ActionRunner=e.Action=void 0;class E extends k.Disposable{constructor(i,n="",t="",r=!0,u){super(),this._onDidChange=this._register(new L.Emitter),this.onDidChange=this._onDidChange.event,this._enabled=!0,this._id=i,this._label=n,this._cssClass=t,this._enabled=r,this._actionCallback=u}get id(){return this._id}get label(){return this._label}set label(i){this._setLabel(i)}_setLabel(i){this._label!==i&&(this._label=i,this._onDidChange.fire({label:i}))}get tooltip(){return this._tooltip||""}set tooltip(i){this._setTooltip(i)}_setTooltip(i){this._tooltip!==i&&(this._tooltip=i,this._onDidChange.fire({tooltip:i}))}get class(){return this._cssClass}set class(i){this._setClass(i)}_setClass(i){this._cssClass!==i&&(this._cssClass=i,this._onDidChange.fire({class:i}))}get enabled(){return this._enabled}set enabled(i){this._setEnabled(i)}_setEnabled(i){this._enabled!==i&&(this._enabled=i,this._onDidChange.fire({enabled:i}))}get checked(){return this._checked}set checked(i){this._setChecked(i)}_setChecked(i){this._checked!==i&&(this._checked=i,this._onDidChange.fire({checked:i}))}async run(i,n){this._actionCallback&&await this._actionCallback(i)}}e.Action=E;class S extends k.Disposable{constructor(){super(...arguments),this._onWillRun=this._register(new L.Emitter),this.onWillRun=this._onWillRun.event,this._onDidRun=this._register(new L.Emitter),this.onDidRun=this._onDidRun.event}async run(i,n){if(!i.enabled)return;this._onWillRun.fire({action:i});let t;try{await this.runAction(i,n)}catch(r){t=r}this._onDidRun.fire({action:i,error:t})}async runAction(i,n){await i.run(n)}}e.ActionRunner=S;class p{constructor(){this.id=p.ID,this.label="",this.tooltip="",this.class="separator",this.enabled=!1,this.checked=!1}static join(...i){let n=[];for(const t of i)t.length&&(n.length?n=[...n,new p,...t]:n=t);return n}async run(){}}e.Separator=p,p.ID="vs.actions.separator";class _{get actions(){return this._actions}constructor(i,n,t,r){this.tooltip="",this.enabled=!0,this.checked=void 0,this.id=i,this.label=n,this.class=r,this._actions=t}async run(){}}e.SubmenuAction=_;class v extends E{constructor(){super(v.ID,y.localize(0,null),void 0,!1)}}e.EmptySubmenuAction=v,v.ID="vs.actions.empty";function b(a){var i,n;return{id:a.id,label:a.label,class:a.class,enabled:(i=a.enabled)!==null&&i!==void 0?i:!0,checked:(n=a.checked)!==null&&n!==void 0?n:!1,run:async(...t)=>a.run(...t),tooltip:a.label}}e.toAction=b}),define(se[578],oe([1,0,42]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ActionRunnerWithContext=void 0;class k extends L.ActionRunner{constructor(E){super(),this._getContext=E}runAction(E,S){return super.runAction(E,this._getContext())}}e.ActionRunnerWithContext=k}),define(se[579],oe([3,4]),function(te,e){return te.create("vs/base/common/errorMessage",e)}),define(se[580],oe([1,0,13,20,579]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toErrorMessage=void 0;function E(v,b){return b&&(v.stack||v.stacktrace)?y.localize(0,null,p(v),S(v.stack)||S(v.stacktrace)):p(v)}function S(v){return Array.isArray(v)?v.join(`
+`):v}function p(v){return v.code==="ERR_UNC_HOST_NOT_ALLOWED"?`${v.message}. Please update the 'security.allowedUNCHosts' setting if you want to allow this host.`:typeof v.code=="string"&&typeof v.errno=="number"&&typeof v.syscall=="string"?y.localize(1,null,v.message):v.message||y.localize(2,null)}function _(v=null,b=!1){if(!v)return y.localize(3,null);if(Array.isArray(v)){const a=L.coalesce(v),i=_(a[0],b);return a.length>1?y.localize(4,null,i,a.length):i}if(k.isString(v))return v;if(v.detail){const a=v.detail;if(a.error)return E(a.error,b);if(a.exception)return E(a.exception,b)}return v.stack?E(v,b):v.message?v.message:y.localize(5,null)}e.toErrorMessage=_}),define(se[581],oe([3,4]),function(te,e){return te.create("vs/base/common/keybindingLabels",e)}),define(se[218],oe([1,0,581]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UserSettingsLabelProvider=e.ElectronAcceleratorLabelProvider=e.AriaLabelProvider=e.UILabelProvider=e.ModifierLabelProvider=void 0;class k{constructor(S,p,_=p){this.modifierLabels=[null],this.modifierLabels[2]=S,this.modifierLabels[1]=p,this.modifierLabels[3]=_}toLabel(S,p,_){if(p.length===0)return null;const v=[];for(let b=0,a=p.length;b<a;b++){const i=p[b],n=_(i);if(n===null)return null;v[b]=y(i,n,this.modifierLabels[S])}return v.join(" ")}}e.ModifierLabelProvider=k,e.UILabelProvider=new k({ctrlKey:"\u2303",shiftKey:"\u21E7",altKey:"\u2325",metaKey:"\u2318",separator:""},{ctrlKey:L.localize(0,null),shiftKey:L.localize(1,null),altKey:L.localize(2,null),metaKey:L.localize(3,null),separator:"+"},{ctrlKey:L.localize(4,null),shiftKey:L.localize(5,null),altKey:L.localize(6,null),metaKey:L.localize(7,null),separator:"+"}),e.AriaLabelProvider=new k({ctrlKey:L.localize(8,null),shiftKey:L.localize(9,null),altKey:L.localize(10,null),metaKey:L.localize(11,null),separator:"+"},{ctrlKey:L.localize(12,null),shiftKey:L.localize(13,null),altKey:L.localize(14,null),metaKey:L.localize(15,null),separator:"+"},{ctrlKey:L.localize(16,null),shiftKey:L.localize(17,null),altKey:L.localize(18,null),metaKey:L.localize(19,null),separator:"+"}),e.ElectronAcceleratorLabelProvider=new k({ctrlKey:"Ctrl",shiftKey:"Shift",altKey:"Alt",metaKey:"Cmd",separator:"+"},{ctrlKey:"Ctrl",shiftKey:"Shift",altKey:"Alt",metaKey:"Super",separator:"+"}),e.UserSettingsLabelProvider=new k({ctrlKey:"ctrl",shiftKey:"shift",altKey:"alt",metaKey:"cmd",separator:"+"},{ctrlKey:"ctrl",shiftKey:"shift",altKey:"alt",metaKey:"win",separator:"+"},{ctrlKey:"ctrl",shiftKey:"shift",altKey:"alt",metaKey:"meta",separator:"+"});function y(E,S,p){if(S===null)return"";const _=[];return E.ctrlKey&&_.push(p.ctrlKey),E.shiftKey&&_.push(p.shiftKey),E.altKey&&_.push(p.altKey),E.metaKey&&_.push(p.metaKey),S!==""&&_.push(S),_.join(p.separator)}}),define(se[582],oe([3,4]),function(te,e){return te.create("vs/base/common/platform",e)}),define(se[17],oe([1,0,582]),function(te,e,L){"use strict";var k;Object.defineProperty(e,"__esModule",{value:!0}),e.isAndroid=e.isEdge=e.isSafari=e.isFirefox=e.isChrome=e.isLittleEndian=e.OS=e.setTimeout0=e.setTimeout0IsFaster=e.language=e.userAgent=e.isMobile=e.isIOS=e.webWorkerOrigin=e.isWebWorker=e.isWeb=e.isNative=e.isLinux=e.isMacintosh=e.isWindows=e.LANGUAGE_DEFAULT=void 0,e.LANGUAGE_DEFAULT="en";let y=!1,E=!1,S=!1,p=!1,_=!1,v=!1,b=!1,a=!1,i=!1,n=!1,t,r=e.LANGUAGE_DEFAULT,u=e.LANGUAGE_DEFAULT,f,c;const d=globalThis;let s;typeof d.vscode<"u"&&typeof d.vscode.process<"u"?s=d.vscode.process:typeof process<"u"&&(s=process);const l=typeof((k=s?.versions)===null||k===void 0?void 0:k.electron)=="string",o=l&&s?.type==="renderer";if(typeof s=="object"){y=s.platform==="win32",E=s.platform==="darwin",S=s.platform==="linux",p=S&&!!s.env.SNAP&&!!s.env.SNAP_REVISION,b=l,i=!!s.env.CI||!!s.env.BUILD_ARTIFACTSTAGINGDIRECTORY,t=e.LANGUAGE_DEFAULT,r=e.LANGUAGE_DEFAULT;const w=s.env.VSCODE_NLS_CONFIG;if(w)try{const D=JSON.parse(w),I=D.availableLanguages["*"];t=D.locale,u=D.osLocale,r=I||e.LANGUAGE_DEFAULT,f=D._translationsConfigFile}catch{}_=!0}else typeof navigator=="object"&&!o?(c=navigator.userAgent,y=c.indexOf("Windows")>=0,E=c.indexOf("Macintosh")>=0,a=(c.indexOf("Macintosh")>=0||c.indexOf("iPad")>=0||c.indexOf("iPhone")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,S=c.indexOf("Linux")>=0,n=c?.indexOf("Mobi")>=0,v=!0,t=L.getConfiguredDefaultLocale(L.localize(0,null))||e.LANGUAGE_DEFAULT,r=t,u=navigator.language):console.error("Unable to resolve platform.");let g=0;E?g=1:y?g=3:S&&(g=2),e.isWindows=y,e.isMacintosh=E,e.isLinux=S,e.isNative=_,e.isWeb=v,e.isWebWorker=v&&typeof d.importScripts=="function",e.webWorkerOrigin=e.isWebWorker?d.origin:void 0,e.isIOS=a,e.isMobile=n,e.userAgent=c,e.language=r,e.setTimeout0IsFaster=typeof d.postMessage=="function"&&!d.importScripts,e.setTimeout0=(()=>{if(e.setTimeout0IsFaster){const w=[];d.addEventListener("message",I=>{if(I.data&&I.data.vscodeScheduleAsyncWork)for(let T=0,A=w.length;T<A;T++){const P=w[T];if(P.id===I.data.vscodeScheduleAsyncWork){w.splice(T,1),P.callback();return}}});let D=0;return I=>{const T=++D;w.push({id:T,callback:I}),d.postMessage({vscodeScheduleAsyncWork:T},"*")}}return w=>setTimeout(w)})(),e.OS=E||a?2:y?1:3;let h=!0,m=!1;function C(){if(!m){m=!0;const w=new Uint8Array(2);w[0]=1,w[1]=2,h=new Uint16Array(w.buffer)[0]===(2<<8)+1}return h}e.isLittleEndian=C,e.isChrome=!!(e.userAgent&&e.userAgent.indexOf("Chrome")>=0),e.isFirefox=!!(e.userAgent&&e.userAgent.indexOf("Firefox")>=0),e.isSafari=!!(!e.isChrome&&e.userAgent&&e.userAgent.indexOf("Safari")>=0),e.isEdge=!!(e.userAgent&&e.userAgent.indexOf("Edg/")>=0),e.isAndroid=!!(e.userAgent&&e.userAgent.indexOf("Android")>=0)}),define(se[219],oe([1,0,54,44,17]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BrowserFeatures=void 0,e.BrowserFeatures={clipboard:{writeText:y.isNative||document.queryCommandSupported&&document.queryCommandSupported("copy")||!!(navigator&&navigator.clipboard&&navigator.clipboard.writeText),readText:y.isNative||!!(navigator&&navigator.clipboard&&navigator.clipboard.readText)},keyboard:(()=>y.isNative||L.isStandalone()?0:navigator.keyboard||L.isSafari?1:2)(),touch:"ontouchstart"in k.mainWindow||navigator.maxTouchPoints>0,pointerEvents:k.mainWindow.PointerEvent&&("ontouchstart"in k.mainWindow||navigator.maxTouchPoints>0)}}),define(se[46],oe([1,0,54,65,125,17]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandardKeyboardEvent=void 0;function S(i){if(i.charCode){const t=String.fromCharCode(i.charCode).toUpperCase();return k.KeyCodeUtils.fromString(t)}const n=i.keyCode;if(n===3)return 7;if(L.isFirefox)switch(n){case 59:return 85;case 60:if(E.isLinux)return 97;break;case 61:return 86;case 107:return 109;case 109:return 111;case 173:return 88;case 224:if(E.isMacintosh)return 57;break}else if(L.isWebKit){if(E.isMacintosh&&n===93)return 57;if(!E.isMacintosh&&n===92)return 57}return k.EVENT_KEY_CODE_MAP[n]||0}const p=E.isMacintosh?256:2048,_=512,v=1024,b=E.isMacintosh?2048:256;class a{constructor(n){this._standardKeyboardEventBrand=!0;const t=n;this.browserEvent=t,this.target=t.target,this.ctrlKey=t.ctrlKey,this.shiftKey=t.shiftKey,this.altKey=t.altKey,this.metaKey=t.metaKey,this.altGraphKey=t.getModifierState("AltGraph"),this.keyCode=S(t),this.code=t.code,this.ctrlKey=this.ctrlKey||this.keyCode===5,this.altKey=this.altKey||this.keyCode===6,this.shiftKey=this.shiftKey||this.keyCode===4,this.metaKey=this.metaKey||this.keyCode===57,this._asKeybinding=this._computeKeybinding(),this._asKeyCodeChord=this._computeKeyCodeChord()}preventDefault(){this.browserEvent&&this.browserEvent.preventDefault&&this.browserEvent.preventDefault()}stopPropagation(){this.browserEvent&&this.browserEvent.stopPropagation&&this.browserEvent.stopPropagation()}toKeyCodeChord(){return this._asKeyCodeChord}equals(n){return this._asKeybinding===n}_computeKeybinding(){let n=0;this.keyCode!==5&&this.keyCode!==4&&this.keyCode!==6&&this.keyCode!==57&&(n=this.keyCode);let t=0;return this.ctrlKey&&(t|=p),this.altKey&&(t|=_),this.shiftKey&&(t|=v),this.metaKey&&(t|=b),t|=n,t}_computeKeyCodeChord(){let n=0;return this.keyCode!==5&&this.keyCode!==4&&this.keyCode!==6&&this.keyCode!==57&&(n=this.keyCode),new y.KeyCodeChord(this.ctrlKey,this.shiftKey,this.altKey,this.metaKey,n)}}e.StandardKeyboardEvent=a}),define(se[67],oe([1,0,54,394,17]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandardWheelEvent=e.StandardMouseEvent=void 0;class E{constructor(_,v){this.timestamp=Date.now(),this.browserEvent=v,this.leftButton=v.button===0,this.middleButton=v.button===1,this.rightButton=v.button===2,this.buttons=v.buttons,this.target=v.target,this.detail=v.detail||1,v.type==="dblclick"&&(this.detail=2),this.ctrlKey=v.ctrlKey,this.shiftKey=v.shiftKey,this.altKey=v.altKey,this.metaKey=v.metaKey,typeof v.pageX=="number"?(this.posx=v.pageX,this.posy=v.pageY):(this.posx=v.clientX+this.target.ownerDocument.body.scrollLeft+this.target.ownerDocument.documentElement.scrollLeft,this.posy=v.clientY+this.target.ownerDocument.body.scrollTop+this.target.ownerDocument.documentElement.scrollTop);const b=k.IframeUtils.getPositionOfChildWindowRelativeToAncestorWindow(_,v.view);this.posx-=b.left,this.posy-=b.top}preventDefault(){this.browserEvent.preventDefault()}stopPropagation(){this.browserEvent.stopPropagation()}}e.StandardMouseEvent=E;class S{constructor(_,v=0,b=0){var a;if(this.browserEvent=_||null,this.target=_?_.target||_.targetNode||_.srcElement:null,this.deltaY=b,this.deltaX=v,_){const i=_,n=_,t=((a=_.view)===null||a===void 0?void 0:a.devicePixelRatio)||1;if(typeof i.wheelDeltaY<"u")L.isChrome?this.deltaY=i.wheelDeltaY/(120*t):this.deltaY=i.wheelDeltaY/120;else if(typeof n.VERTICAL_AXIS<"u"&&n.axis===n.VERTICAL_AXIS)this.deltaY=-n.detail/3;else if(_.type==="wheel"){const r=_;r.deltaMode===r.DOM_DELTA_LINE?L.isFirefox&&!y.isMacintosh?this.deltaY=-_.deltaY/3:this.deltaY=-_.deltaY:this.deltaY=-_.deltaY/40}if(typeof i.wheelDeltaX<"u")L.isSafari&&y.isWindows?this.deltaX=-(i.wheelDeltaX/120):L.isChrome?this.deltaX=i.wheelDeltaX/(120*t):this.deltaX=i.wheelDeltaX/120;else if(typeof n.HORIZONTAL_AXIS<"u"&&n.axis===n.HORIZONTAL_AXIS)this.deltaX=-_.detail/3;else if(_.type==="wheel"){const r=_;r.deltaMode===r.DOM_DELTA_LINE?L.isFirefox&&!y.isMacintosh?this.deltaX=-_.deltaX/3:this.deltaX=-_.deltaX:this.deltaX=-_.deltaX/40}this.deltaY===0&&this.deltaX===0&&_.wheelDelta&&(L.isChrome?this.deltaY=_.wheelDelta/(120*t):this.deltaY=_.wheelDelta/120)}}preventDefault(){var _;(_=this.browserEvent)===null||_===void 0||_.preventDefault()}stopPropagation(){var _;(_=this.browserEvent)===null||_===void 0||_.stopPropagation()}}e.StandardWheelEvent=S}),define(se[14],oe([1,0,19,12,6,2,17,271]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createCancelableAsyncIterable=e.CancelableAsyncIterableObject=e.AsyncIterableObject=e.Promises=e.DeferredPromise=e.GlobalIdleValue=e.AbstractIdleValue=e._runWhenIdle=e.runWhenGlobalIdle=e.RunOnceScheduler=e.IntervalTimer=e.TimeoutTimer=e.first=e.disposableTimeout=e.timeout=e.ThrottledDelayer=e.Delayer=e.Throttler=e.raceCancellation=e.createCancelablePromise=e.isThenable=void 0;function _(I){return!!I&&typeof I.then=="function"}e.isThenable=_;function v(I){const T=new L.CancellationTokenSource,A=I(T.token),P=new Promise((N,M)=>{const R=T.token.onCancellationRequested(()=>{R.dispose(),M(new k.CancellationError)});Promise.resolve(A).then(x=>{R.dispose(),T.dispose(),N(x)},x=>{R.dispose(),T.dispose(),M(x)})});return new class{cancel(){T.cancel(),T.dispose()}then(N,M){return P.then(N,M)}catch(N){return this.then(void 0,N)}finally(N){return P.finally(N)}}}e.createCancelablePromise=v;function b(I,T,A){return new Promise((P,N)=>{const M=T.onCancellationRequested(()=>{M.dispose(),P(A)});I.then(P,N).finally(()=>M.dispose())})}e.raceCancellation=b;class a{constructor(){this.isDisposed=!1,this.activePromise=null,this.queuedPromise=null,this.queuedPromiseFactory=null}queue(T){if(this.isDisposed)return Promise.reject(new Error("Throttler is disposed"));if(this.activePromise){if(this.queuedPromiseFactory=T,!this.queuedPromise){const A=()=>{if(this.queuedPromise=null,this.isDisposed)return;const P=this.queue(this.queuedPromiseFactory);return this.queuedPromiseFactory=null,P};this.queuedPromise=new Promise(P=>{this.activePromise.then(A,A).then(P)})}return new Promise((A,P)=>{this.queuedPromise.then(A,P)})}return this.activePromise=T(),new Promise((A,P)=>{this.activePromise.then(N=>{this.activePromise=null,A(N)},N=>{this.activePromise=null,P(N)})})}dispose(){this.isDisposed=!0}}e.Throttler=a;const i=(I,T)=>{let A=!0;const P=setTimeout(()=>{A=!1,T()},I);return{isTriggered:()=>A,dispose:()=>{clearTimeout(P),A=!1}}},n=I=>{let T=!0;return queueMicrotask(()=>{T&&(T=!1,I())}),{isTriggered:()=>T,dispose:()=>{T=!1}}};class t{constructor(T){this.defaultDelay=T,this.deferred=null,this.completionPromise=null,this.doResolve=null,this.doReject=null,this.task=null}trigger(T,A=this.defaultDelay){this.task=T,this.cancelTimeout(),this.completionPromise||(this.completionPromise=new Promise((N,M)=>{this.doResolve=N,this.doReject=M}).then(()=>{if(this.completionPromise=null,this.doResolve=null,this.task){const N=this.task;return this.task=null,N()}}));const P=()=>{var N;this.deferred=null,(N=this.doResolve)===null||N===void 0||N.call(this,null)};return this.deferred=A===p.MicrotaskDelay?n(P):i(A,P),this.completionPromise}isTriggered(){var T;return!!(!((T=this.deferred)===null||T===void 0)&&T.isTriggered())}cancel(){var T;this.cancelTimeout(),this.completionPromise&&((T=this.doReject)===null||T===void 0||T.call(this,new k.CancellationError),this.completionPromise=null)}cancelTimeout(){var T;(T=this.deferred)===null||T===void 0||T.dispose(),this.deferred=null}dispose(){this.cancel()}}e.Delayer=t;class r{constructor(T){this.delayer=new t(T),this.throttler=new a}trigger(T,A){return this.delayer.trigger(()=>this.throttler.queue(T),A)}cancel(){this.delayer.cancel()}dispose(){this.delayer.dispose(),this.throttler.dispose()}}e.ThrottledDelayer=r;function u(I,T){return T?new Promise((A,P)=>{const N=setTimeout(()=>{M.dispose(),A()},I),M=T.onCancellationRequested(()=>{clearTimeout(N),M.dispose(),P(new k.CancellationError)})}):v(A=>u(I,A))}e.timeout=u;function f(I,T=0,A){const P=setTimeout(()=>{I(),A&&N.dispose()},T),N=(0,E.toDisposable)(()=>{clearTimeout(P),A?.deleteAndLeak(N)});return A?.add(N),N}e.disposableTimeout=f;function c(I,T=P=>!!P,A=null){let P=0;const N=I.length,M=()=>{if(P>=N)return Promise.resolve(A);const R=I[P++];return Promise.resolve(R()).then(O=>T(O)?Promise.resolve(O):M())};return M()}e.first=c;class d{constructor(T,A){this._token=-1,typeof T=="function"&&typeof A=="number"&&this.setIfNotSet(T,A)}dispose(){this.cancel()}cancel(){this._token!==-1&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(T,A){this.cancel(),this._token=setTimeout(()=>{this._token=-1,T()},A)}setIfNotSet(T,A){this._token===-1&&(this._token=setTimeout(()=>{this._token=-1,T()},A))}}e.TimeoutTimer=d;class s{constructor(){this.disposable=void 0}cancel(){var T;(T=this.disposable)===null||T===void 0||T.dispose(),this.disposable=void 0}cancelAndSet(T,A,P=globalThis){this.cancel();const N=P.setInterval(()=>{T()},A);this.disposable=(0,E.toDisposable)(()=>{P.clearInterval(N),this.disposable=void 0})}dispose(){this.cancel()}}e.IntervalTimer=s;class l{constructor(T,A){this.timeoutToken=-1,this.runner=T,this.timeout=A,this.timeoutHandler=this.onTimeout.bind(this)}dispose(){this.cancel(),this.runner=null}cancel(){this.isScheduled()&&(clearTimeout(this.timeoutToken),this.timeoutToken=-1)}schedule(T=this.timeout){this.cancel(),this.timeoutToken=setTimeout(this.timeoutHandler,T)}get delay(){return this.timeout}set delay(T){this.timeout=T}isScheduled(){return this.timeoutToken!==-1}onTimeout(){this.timeoutToken=-1,this.runner&&this.doRun()}doRun(){var T;(T=this.runner)===null||T===void 0||T.call(this)}}e.RunOnceScheduler=l,function(){typeof globalThis.requestIdleCallback!="function"||typeof globalThis.cancelIdleCallback!="function"?e._runWhenIdle=(I,T)=>{(0,S.setTimeout0)(()=>{if(A)return;const P=Date.now()+15;T(Object.freeze({didTimeout:!0,timeRemaining(){return Math.max(0,P-Date.now())}}))});let A=!1;return{dispose(){A||(A=!0)}}}:e._runWhenIdle=(I,T,A)=>{const P=I.requestIdleCallback(T,typeof A=="number"?{timeout:A}:void 0);let N=!1;return{dispose(){N||(N=!0,I.cancelIdleCallback(P))}}},e.runWhenGlobalIdle=I=>(0,e._runWhenIdle)(globalThis,I)}();class o{constructor(T,A){this._didRun=!1,this._executor=()=>{try{this._value=A()}catch(P){this._error=P}finally{this._didRun=!0}},this._handle=(0,e._runWhenIdle)(T,()=>this._executor())}dispose(){this._handle.dispose()}get value(){if(this._didRun||(this._handle.dispose(),this._executor()),this._error)throw this._error;return this._value}get isInitialized(){return this._didRun}}e.AbstractIdleValue=o;class g extends o{constructor(T){super(globalThis,T)}}e.GlobalIdleValue=g;class h{get isRejected(){var T;return((T=this.outcome)===null||T===void 0?void 0:T.outcome)===1}get isSettled(){return!!this.outcome}constructor(){this.p=new Promise((T,A)=>{this.completeCallback=T,this.errorCallback=A})}complete(T){return new Promise(A=>{this.completeCallback(T),this.outcome={outcome:0,value:T},A()})}error(T){return new Promise(A=>{this.errorCallback(T),this.outcome={outcome:1,value:T},A()})}cancel(){return this.error(new k.CancellationError)}}e.DeferredPromise=h;var m;(function(I){async function T(P){let N;const M=await Promise.all(P.map(R=>R.then(x=>x,x=>{N||(N=x)})));if(typeof N<"u")throw N;return M}I.settled=T;function A(P){return new Promise(async(N,M)=>{try{await P(N,M)}catch(R){M(R)}})}I.withAsyncBody=A})(m||(e.Promises=m={}));class C{static fromArray(T){return new C(A=>{A.emitMany(T)})}static fromPromise(T){return new C(async A=>{A.emitMany(await T)})}static fromPromises(T){return new C(async A=>{await Promise.all(T.map(async P=>A.emitOne(await P)))})}static merge(T){return new C(async A=>{await Promise.all(T.map(async P=>{for await(const N of P)A.emitOne(N)}))})}constructor(T){this._state=0,this._results=[],this._error=null,this._onStateChanged=new y.Emitter,queueMicrotask(async()=>{const A={emitOne:P=>this.emitOne(P),emitMany:P=>this.emitMany(P),reject:P=>this.reject(P)};try{await Promise.resolve(T(A)),this.resolve()}catch(P){this.reject(P)}finally{A.emitOne=void 0,A.emitMany=void 0,A.reject=void 0}})}[Symbol.asyncIterator](){let T=0;return{next:async()=>{do{if(this._state===2)throw this._error;if(T<this._results.length)return{done:!1,value:this._results[T++]};if(this._state===1)return{done:!0,value:void 0};await y.Event.toPromise(this._onStateChanged.event)}while(!0)}}}static map(T,A){return new C(async P=>{for await(const N of T)P.emitOne(A(N))})}map(T){return C.map(this,T)}static filter(T,A){return new C(async P=>{for await(const N of T)A(N)&&P.emitOne(N)})}filter(T){return C.filter(this,T)}static coalesce(T){return C.filter(T,A=>!!A)}coalesce(){return C.coalesce(this)}static async toPromise(T){const A=[];for await(const P of T)A.push(P);return A}toPromise(){return C.toPromise(this)}emitOne(T){this._state===0&&(this._results.push(T),this._onStateChanged.fire())}emitMany(T){this._state===0&&(this._results=this._results.concat(T),this._onStateChanged.fire())}resolve(){this._state===0&&(this._state=1,this._onStateChanged.fire())}reject(T){this._state===0&&(this._state=2,this._error=T,this._onStateChanged.fire())}}e.AsyncIterableObject=C,C.EMPTY=C.fromArray([]);class w extends C{constructor(T,A){super(A),this._source=T}cancel(){this._source.cancel()}}e.CancelableAsyncIterableObject=w;function D(I){const T=new L.CancellationTokenSource,A=I(T.token);return new w(T,async P=>{const N=T.token.onCancellationRequested(()=>{N.dispose(),T.dispose(),P.reject(new k.CancellationError)});try{for await(const M of A){if(T.token.isCancellationRequested)return;P.emitOne(M)}N.dispose(),T.dispose()}catch(M){N.dispose(),T.dispose(),P.reject(M)}})}e.createCancelableAsyncIterable=D}),define(se[583],oe([1,0,14,2]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ScrollbarVisibilityController=void 0;class y extends k.Disposable{constructor(S,p,_){super(),this._visibility=S,this._visibleClassName=p,this._invisibleClassName=_,this._domNode=null,this._isVisible=!1,this._isNeeded=!1,this._rawShouldBeVisible=!1,this._shouldBeVisible=!1,this._revealTimer=this._register(new L.TimeoutTimer)}setVisibility(S){this._visibility!==S&&(this._visibility=S,this._updateShouldBeVisible())}setShouldBeVisible(S){this._rawShouldBeVisible=S,this._updateShouldBeVisible()}_applyVisibilitySetting(){return this._visibility===2?!1:this._visibility===3?!0:this._rawShouldBeVisible}_updateShouldBeVisible(){const S=this._applyVisibilitySetting();this._shouldBeVisible!==S&&(this._shouldBeVisible=S,this.ensureVisibility())}setIsNeeded(S){this._isNeeded!==S&&(this._isNeeded=S,this.ensureVisibility())}setDomNode(S){this._domNode=S,this._domNode.setClassName(this._invisibleClassName),this.setShouldBeVisible(!1)}ensureVisibility(){if(!this._isNeeded){this._hide(!1);return}this._shouldBeVisible?this._reveal():this._hide(!0)}_reveal(){this._isVisible||(this._isVisible=!0,this._revealTimer.setIfNotSet(()=>{var S;(S=this._domNode)===null||S===void 0||S.setClassName(this._visibleClassName)},0))}_hide(S){var p;this._revealTimer.cancel(),this._isVisible&&(this._isVisible=!1,(p=this._domNode)===null||p===void 0||p.setClassName(this._invisibleClassName+(S?" fade":"")))}}e.ScrollbarVisibilityController=y}),define(se[220],oe([1,0,143,13,14,271,173,6,52]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndexTreeModel=e.getVisibleState=e.isFilterResult=void 0;function v(n){return typeof n=="object"&&"visibility"in n&&"data"in n}e.isFilterResult=v;function b(n){switch(n){case!0:return 1;case!1:return 0;default:return n}}e.getVisibleState=b;function a(n){return typeof n.collapsible=="boolean"}class i{constructor(t,r,u,f={}){this.user=t,this.list=r,this.rootRef=[],this.eventBufferer=new p.EventBufferer,this._onDidChangeCollapseState=new p.Emitter,this.onDidChangeCollapseState=this.eventBufferer.wrapEvent(this._onDidChangeCollapseState.event),this._onDidChangeRenderNodeCount=new p.Emitter,this.onDidChangeRenderNodeCount=this.eventBufferer.wrapEvent(this._onDidChangeRenderNodeCount.event),this._onDidSplice=new p.Emitter,this.onDidSplice=this._onDidSplice.event,this.refilterDelayer=new y.Delayer(E.MicrotaskDelay),this.collapseByDefault=typeof f.collapseByDefault>"u"?!1:f.collapseByDefault,this.filter=f.filter,this.autoExpandSingleChildren=typeof f.autoExpandSingleChildren>"u"?!1:f.autoExpandSingleChildren,this.root={parent:void 0,element:u,children:[],depth:0,visibleChildrenCount:0,visibleChildIndex:-1,collapsible:!1,collapsed:!1,renderNodeCount:0,visibility:1,visible:!0,filterData:void 0}}splice(t,r,u=_.Iterable.empty(),f={}){if(t.length===0)throw new L.TreeError(this.user,"Invalid tree location");f.diffIdentityProvider?this.spliceSmart(f.diffIdentityProvider,t,r,u,f):this.spliceSimple(t,r,u,f)}spliceSmart(t,r,u,f,c,d){var s;f===void 0&&(f=_.Iterable.empty()),d===void 0&&(d=(s=c.diffDepth)!==null&&s!==void 0?s:0);const{parentNode:l}=this.getParentNodeWithListIndex(r);if(!l.lastDiffIds)return this.spliceSimple(r,u,f,c);const o=[...f],g=r[r.length-1],h=new S.LcsDiff({getElements:()=>l.lastDiffIds},{getElements:()=>[...l.children.slice(0,g),...o,...l.children.slice(g+u)].map(I=>t.getId(I.element).toString())}).ComputeDiff(!1);if(h.quitEarly)return l.lastDiffIds=void 0,this.spliceSimple(r,u,o,c);const m=r.slice(0,-1),C=(I,T,A)=>{if(d>0)for(let P=0;P<A;P++)I--,T--,this.spliceSmart(t,[...m,I,0],Number.MAX_SAFE_INTEGER,o[T].children,c,d-1)};let w=Math.min(l.children.length,g+u),D=o.length;for(const I of h.changes.sort((T,A)=>A.originalStart-T.originalStart))C(w,D,w-(I.originalStart+I.originalLength)),w=I.originalStart,D=I.modifiedStart-g,this.spliceSimple([...m,w],I.originalLength,_.Iterable.slice(o,D,D+I.modifiedLength),c);C(w,D,w)}spliceSimple(t,r,u=_.Iterable.empty(),{onDidCreateNode:f,onDidDeleteNode:c,diffIdentityProvider:d}){const{parentNode:s,listIndex:l,revealed:o,visible:g}=this.getParentNodeWithListIndex(t),h=[],m=_.Iterable.map(u,M=>this.createTreeNode(M,s,s.visible?1:0,o,h,f)),C=t[t.length-1];let w=0;for(let M=C;M>=0&&M<s.children.length;M--){const R=s.children[M];if(R.visible){w=R.visibleChildIndex;break}}const D=[];let I=0,T=0;for(const M of m)D.push(M),T+=M.renderNodeCount,M.visible&&(M.visibleChildIndex=w+I++);const A=(0,k.splice)(s.children,C,r,D);d?s.lastDiffIds?(0,k.splice)(s.lastDiffIds,C,r,D.map(M=>d.getId(M.element).toString())):s.lastDiffIds=s.children.map(M=>d.getId(M.element).toString()):s.lastDiffIds=void 0;let P=0;for(const M of A)M.visible&&P++;if(P!==0)for(let M=C+D.length;M<s.children.length;M++){const R=s.children[M];R.visible&&(R.visibleChildIndex-=P)}if(s.visibleChildrenCount+=I-P,o&&g){const M=A.reduce((R,x)=>R+(x.visible?x.renderNodeCount:0),0);this._updateAncestorsRenderNodeCount(s,T-M),this.list.splice(l,M,h)}if(A.length>0&&c){const M=R=>{c(R),R.children.forEach(M)};A.forEach(M)}this._onDidSplice.fire({insertedNodes:D,deletedNodes:A});let N=s;for(;N;){if(N.visibility===2){this.refilterDelayer.trigger(()=>this.refilter());break}N=N.parent}}rerender(t){if(t.length===0)throw new L.TreeError(this.user,"Invalid tree location");const{node:r,listIndex:u,revealed:f}=this.getTreeNodeWithListIndex(t);r.visible&&f&&this.list.splice(u,1,[r])}has(t){return this.hasTreeNode(t)}getListIndex(t){const{listIndex:r,visible:u,revealed:f}=this.getTreeNodeWithListIndex(t);return u&&f?r:-1}getListRenderCount(t){return this.getTreeNode(t).renderNodeCount}isCollapsible(t){return this.getTreeNode(t).collapsible}setCollapsible(t,r){const u=this.getTreeNode(t);typeof r>"u"&&(r=!u.collapsible);const f={collapsible:r};return this.eventBufferer.bufferEvents(()=>this._setCollapseState(t,f))}isCollapsed(t){return this.getTreeNode(t).collapsed}setCollapsed(t,r,u){const f=this.getTreeNode(t);typeof r>"u"&&(r=!f.collapsed);const c={collapsed:r,recursive:u||!1};return this.eventBufferer.bufferEvents(()=>this._setCollapseState(t,c))}_setCollapseState(t,r){const{node:u,listIndex:f,revealed:c}=this.getTreeNodeWithListIndex(t),d=this._setListNodeCollapseState(u,f,c,r);if(u!==this.root&&this.autoExpandSingleChildren&&d&&!a(r)&&u.collapsible&&!u.collapsed&&!r.recursive){let s=-1;for(let l=0;l<u.children.length;l++)if(u.children[l].visible)if(s>-1){s=-1;break}else s=l;s>-1&&this._setCollapseState([...t,s],r)}return d}_setListNodeCollapseState(t,r,u,f){const c=this._setNodeCollapseState(t,f,!1);if(!u||!t.visible||!c)return c;const d=t.renderNodeCount,s=this.updateNodeAfterCollapseChange(t),l=d-(r===-1?0:1);return this.list.splice(r+1,l,s.slice(1)),c}_setNodeCollapseState(t,r,u){let f;if(t===this.root?f=!1:(a(r)?(f=t.collapsible!==r.collapsible,t.collapsible=r.collapsible):t.collapsible?(f=t.collapsed!==r.collapsed,t.collapsed=r.collapsed):f=!1,f&&this._onDidChangeCollapseState.fire({node:t,deep:u})),!a(r)&&r.recursive)for(const c of t.children)f=this._setNodeCollapseState(c,r,!0)||f;return f}expandTo(t){this.eventBufferer.bufferEvents(()=>{let r=this.getTreeNode(t);for(;r.parent;)r=r.parent,t=t.slice(0,t.length-1),r.collapsed&&this._setCollapseState(t,{collapsed:!1,recursive:!1})})}refilter(){const t=this.root.renderNodeCount,r=this.updateNodeAfterFilterChange(this.root);this.list.splice(0,t,r),this.refilterDelayer.cancel()}createTreeNode(t,r,u,f,c,d){const s={parent:r,element:t.element,children:[],depth:r.depth+1,visibleChildrenCount:0,visibleChildIndex:-1,collapsible:typeof t.collapsible=="boolean"?t.collapsible:typeof t.collapsed<"u",collapsed:typeof t.collapsed>"u"?this.collapseByDefault:t.collapsed,renderNodeCount:1,visibility:1,visible:!0,filterData:void 0},l=this._filterNode(s,u);s.visibility=l,f&&c.push(s);const o=t.children||_.Iterable.empty(),g=f&&l!==0&&!s.collapsed;let h=0,m=1;for(const C of o){const w=this.createTreeNode(C,s,l,g,c,d);s.children.push(w),m+=w.renderNodeCount,w.visible&&(w.visibleChildIndex=h++)}return s.collapsible=s.collapsible||s.children.length>0,s.visibleChildrenCount=h,s.visible=l===2?h>0:l===1,s.visible?s.collapsed||(s.renderNodeCount=m):(s.renderNodeCount=0,f&&c.pop()),d?.(s),s}updateNodeAfterCollapseChange(t){const r=t.renderNodeCount,u=[];return this._updateNodeAfterCollapseChange(t,u),this._updateAncestorsRenderNodeCount(t.parent,u.length-r),u}_updateNodeAfterCollapseChange(t,r){if(t.visible===!1)return 0;if(r.push(t),t.renderNodeCount=1,!t.collapsed)for(const u of t.children)t.renderNodeCount+=this._updateNodeAfterCollapseChange(u,r);return this._onDidChangeRenderNodeCount.fire(t),t.renderNodeCount}updateNodeAfterFilterChange(t){const r=t.renderNodeCount,u=[];return this._updateNodeAfterFilterChange(t,t.visible?1:0,u),this._updateAncestorsRenderNodeCount(t.parent,u.length-r),u}_updateNodeAfterFilterChange(t,r,u,f=!0){let c;if(t!==this.root){if(c=this._filterNode(t,r),c===0)return t.visible=!1,t.renderNodeCount=0,!1;f&&u.push(t)}const d=u.length;t.renderNodeCount=t===this.root?0:1;let s=!1;if(!t.collapsed||c!==0){let l=0;for(const o of t.children)s=this._updateNodeAfterFilterChange(o,c,u,f&&!t.collapsed)||s,o.visible&&(o.visibleChildIndex=l++);t.visibleChildrenCount=l}else t.visibleChildrenCount=0;return t!==this.root&&(t.visible=c===2?s:c===1,t.visibility=c),t.visible?t.collapsed||(t.renderNodeCount+=u.length-d):(t.renderNodeCount=0,f&&u.pop()),this._onDidChangeRenderNodeCount.fire(t),t.visible}_updateAncestorsRenderNodeCount(t,r){if(r!==0)for(;t;)t.renderNodeCount+=r,this._onDidChangeRenderNodeCount.fire(t),t=t.parent}_filterNode(t,r){const u=this.filter?this.filter.filter(t.element,r):1;return typeof u=="boolean"?(t.filterData=void 0,u?1:0):v(u)?(t.filterData=u.data,b(u.visibility)):(t.filterData=void 0,b(u))}hasTreeNode(t,r=this.root){if(!t||t.length===0)return!0;const[u,...f]=t;return u<0||u>r.children.length?!1:this.hasTreeNode(f,r.children[u])}getTreeNode(t,r=this.root){if(!t||t.length===0)return r;const[u,...f]=t;if(u<0||u>r.children.length)throw new L.TreeError(this.user,"Invalid tree location");return this.getTreeNode(f,r.children[u])}getTreeNodeWithListIndex(t){if(t.length===0)return{node:this.root,listIndex:-1,revealed:!0,visible:!1};const{parentNode:r,listIndex:u,revealed:f,visible:c}=this.getParentNodeWithListIndex(t),d=t[t.length-1];if(d<0||d>r.children.length)throw new L.TreeError(this.user,"Invalid tree location");const s=r.children[d];return{node:s,listIndex:u,revealed:f,visible:c&&s.visible}}getParentNodeWithListIndex(t,r=this.root,u=0,f=!0,c=!0){const[d,...s]=t;if(d<0||d>r.children.length)throw new L.TreeError(this.user,"Invalid tree location");for(let l=0;l<d;l++)u+=r.children[l].renderNodeCount;return f=f&&!r.collapsed,c=c&&r.visible,s.length===0?{parentNode:r,listIndex:u,revealed:f,visible:c}:this.getParentNodeWithListIndex(s,r.children[d],u+1,f,c)}getNode(t=[]){return this.getTreeNode(t)}getNodeLocation(t){const r=[];let u=t;for(;u.parent;)r.push(u.parent.children.indexOf(u)),u=u.parent;return r.reverse()}getParentNodeLocation(t){if(t.length!==0)return t.length===1?[]:(0,k.tail2)(t)[0]}getFirstElementChild(t){const r=this.getTreeNode(t);if(r.children.length!==0)return r.children[0].element}}e.IndexTreeModel=i}),define(se[221],oe([1,0,220,143,52]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ObjectTreeModel=void 0;class E{constructor(p,_,v={}){this.user=p,this.rootRef=null,this.nodes=new Map,this.nodesByIdentity=new Map,this.model=new L.IndexTreeModel(p,_,null,v),this.onDidSplice=this.model.onDidSplice,this.onDidChangeCollapseState=this.model.onDidChangeCollapseState,this.onDidChangeRenderNodeCount=this.model.onDidChangeRenderNodeCount,v.sorter&&(this.sorter={compare(b,a){return v.sorter.compare(b.element,a.element)}}),this.identityProvider=v.identityProvider}setChildren(p,_=y.Iterable.empty(),v={}){const b=this.getElementLocation(p);this._setChildren(b,this.preserveCollapseState(_),v)}_setChildren(p,_=y.Iterable.empty(),v){const b=new Set,a=new Set,i=t=>{var r;if(t.element===null)return;const u=t;if(b.add(u.element),this.nodes.set(u.element,u),this.identityProvider){const f=this.identityProvider.getId(u.element).toString();a.add(f),this.nodesByIdentity.set(f,u)}(r=v.onDidCreateNode)===null||r===void 0||r.call(v,u)},n=t=>{var r;if(t.element===null)return;const u=t;if(b.has(u.element)||this.nodes.delete(u.element),this.identityProvider){const f=this.identityProvider.getId(u.element).toString();a.has(f)||this.nodesByIdentity.delete(f)}(r=v.onDidDeleteNode)===null||r===void 0||r.call(v,u)};this.model.splice([...p,0],Number.MAX_VALUE,_,{...v,onDidCreateNode:i,onDidDeleteNode:n})}preserveCollapseState(p=y.Iterable.empty()){return this.sorter&&(p=[...p].sort(this.sorter.compare.bind(this.sorter))),y.Iterable.map(p,_=>{let v=this.nodes.get(_.element);if(!v&&this.identityProvider){const i=this.identityProvider.getId(_.element).toString();v=this.nodesByIdentity.get(i)}if(!v){let i;return typeof _.collapsed>"u"?i=void 0:_.collapsed===k.ObjectTreeElementCollapseState.Collapsed||_.collapsed===k.ObjectTreeElementCollapseState.PreserveOrCollapsed?i=!0:_.collapsed===k.ObjectTreeElementCollapseState.Expanded||_.collapsed===k.ObjectTreeElementCollapseState.PreserveOrExpanded?i=!1:i=!!_.collapsed,{..._,children:this.preserveCollapseState(_.children),collapsed:i}}const b=typeof _.collapsible=="boolean"?_.collapsible:v.collapsible;let a;return typeof _.collapsed>"u"||_.collapsed===k.ObjectTreeElementCollapseState.PreserveOrCollapsed||_.collapsed===k.ObjectTreeElementCollapseState.PreserveOrExpanded?a=v.collapsed:_.collapsed===k.ObjectTreeElementCollapseState.Collapsed?a=!0:_.collapsed===k.ObjectTreeElementCollapseState.Expanded?a=!1:a=!!_.collapsed,{..._,collapsible:b,collapsed:a,children:this.preserveCollapseState(_.children)}})}rerender(p){const _=this.getElementLocation(p);this.model.rerender(_)}getFirstElementChild(p=null){const _=this.getElementLocation(p);return this.model.getFirstElementChild(_)}has(p){return this.nodes.has(p)}getListIndex(p){const _=this.getElementLocation(p);return this.model.getListIndex(_)}getListRenderCount(p){const _=this.getElementLocation(p);return this.model.getListRenderCount(_)}isCollapsible(p){const _=this.getElementLocation(p);return this.model.isCollapsible(_)}setCollapsible(p,_){const v=this.getElementLocation(p);return this.model.setCollapsible(v,_)}isCollapsed(p){const _=this.getElementLocation(p);return this.model.isCollapsed(_)}setCollapsed(p,_,v){const b=this.getElementLocation(p);return this.model.setCollapsed(b,_,v)}expandTo(p){const _=this.getElementLocation(p);this.model.expandTo(_)}refilter(){this.model.refilter()}getNode(p=null){if(p===null)return this.model.getNode(this.model.rootRef);const _=this.nodes.get(p);if(!_)throw new k.TreeError(this.user,`Tree element not found: ${p}`);return _}getNodeLocation(p){return p.element}getParentNodeLocation(p){if(p===null)throw new k.TreeError(this.user,"Invalid getParentNodeLocation call");const _=this.nodes.get(p);if(!_)throw new k.TreeError(this.user,`Tree element not found: ${p}`);const v=this.model.getNodeLocation(_),b=this.model.getParentNodeLocation(v);return this.model.getNode(b).element}getElementLocation(p){if(p===null)return[];const _=this.nodes.get(p);if(!_)throw new k.TreeError(this.user,`Tree element not found: ${p}`);return this.model.getNodeLocation(_)}}e.ObjectTreeModel=E}),define(se[584],oe([1,0,221,143,13,6,52]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompressibleObjectTreeModel=e.DefaultElementMapper=e.CompressedObjectTreeModel=e.decompress=e.compress=void 0;function p(d){const s=[d.element],l=d.incompressible||!1;return{element:{elements:s,incompressible:l},children:S.Iterable.map(S.Iterable.from(d.children),p),collapsible:d.collapsible,collapsed:d.collapsed}}function _(d){const s=[d.element],l=d.incompressible||!1;let o,g;for(;[g,o]=S.Iterable.consume(S.Iterable.from(d.children),2),!(g.length!==1||g[0].incompressible);)d=g[0],s.push(d.element);return{element:{elements:s,incompressible:l},children:S.Iterable.map(S.Iterable.concat(g,o),_),collapsible:d.collapsible,collapsed:d.collapsed}}e.compress=_;function v(d,s=0){let l;return s<d.element.elements.length-1?l=[v(d,s+1)]:l=S.Iterable.map(S.Iterable.from(d.children),o=>v(o,0)),s===0&&d.element.incompressible?{element:d.element.elements[s],children:l,incompressible:!0,collapsible:d.collapsible,collapsed:d.collapsed}:{element:d.element.elements[s],children:l,collapsible:d.collapsible,collapsed:d.collapsed}}function b(d){return v(d,0)}e.decompress=b;function a(d,s,l){return d.element===s?{...d,children:l}:{...d,children:S.Iterable.map(S.Iterable.from(d.children),o=>a(o,s,l))}}const i=d=>({getId(s){return s.elements.map(l=>d.getId(l).toString()).join("\0")}});class n{get onDidSplice(){return this.model.onDidSplice}get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}get onDidChangeRenderNodeCount(){return this.model.onDidChangeRenderNodeCount}constructor(s,l,o={}){this.user=s,this.rootRef=null,this.nodes=new Map,this.model=new L.ObjectTreeModel(s,l,o),this.enabled=typeof o.compressionEnabled>"u"?!0:o.compressionEnabled,this.identityProvider=o.identityProvider}setChildren(s,l=S.Iterable.empty(),o){const g=o.diffIdentityProvider&&i(o.diffIdentityProvider);if(s===null){const N=S.Iterable.map(l,this.enabled?_:p);this._setChildren(null,N,{diffIdentityProvider:g,diffDepth:1/0});return}const h=this.nodes.get(s);if(!h)throw new k.TreeError(this.user,"Unknown compressed tree node");const m=this.model.getNode(h),C=this.model.getParentNodeLocation(h),w=this.model.getNode(C),D=b(m),I=a(D,s,l),T=(this.enabled?_:p)(I),A=o.diffIdentityProvider?(N,M)=>o.diffIdentityProvider.getId(N)===o.diffIdentityProvider.getId(M):void 0;if((0,y.equals)(T.element.elements,m.element.elements,A)){this._setChildren(h,T.children||S.Iterable.empty(),{diffIdentityProvider:g,diffDepth:1});return}const P=w.children.map(N=>N===m?T:N);this._setChildren(w.element,P,{diffIdentityProvider:g,diffDepth:m.depth-w.depth})}isCompressionEnabled(){return this.enabled}setCompressionEnabled(s){if(s===this.enabled)return;this.enabled=s;const o=this.model.getNode().children,g=S.Iterable.map(o,b),h=S.Iterable.map(g,s?_:p);this._setChildren(null,h,{diffIdentityProvider:this.identityProvider,diffDepth:1/0})}_setChildren(s,l,o){const g=new Set,h=C=>{for(const w of C.element.elements)g.add(w),this.nodes.set(w,C.element)},m=C=>{for(const w of C.element.elements)g.has(w)||this.nodes.delete(w)};this.model.setChildren(s,l,{...o,onDidCreateNode:h,onDidDeleteNode:m})}has(s){return this.nodes.has(s)}getListIndex(s){const l=this.getCompressedNode(s);return this.model.getListIndex(l)}getListRenderCount(s){const l=this.getCompressedNode(s);return this.model.getListRenderCount(l)}getNode(s){if(typeof s>"u")return this.model.getNode();const l=this.getCompressedNode(s);return this.model.getNode(l)}getNodeLocation(s){const l=this.model.getNodeLocation(s);return l===null?null:l.elements[l.elements.length-1]}getParentNodeLocation(s){const l=this.getCompressedNode(s),o=this.model.getParentNodeLocation(l);return o===null?null:o.elements[o.elements.length-1]}getFirstElementChild(s){const l=this.getCompressedNode(s);return this.model.getFirstElementChild(l)}isCollapsible(s){const l=this.getCompressedNode(s);return this.model.isCollapsible(l)}setCollapsible(s,l){const o=this.getCompressedNode(s);return this.model.setCollapsible(o,l)}isCollapsed(s){const l=this.getCompressedNode(s);return this.model.isCollapsed(l)}setCollapsed(s,l,o){const g=this.getCompressedNode(s);return this.model.setCollapsed(g,l,o)}expandTo(s){const l=this.getCompressedNode(s);this.model.expandTo(l)}rerender(s){const l=this.getCompressedNode(s);this.model.rerender(l)}refilter(){this.model.refilter()}getCompressedNode(s){if(s===null)return null;const l=this.nodes.get(s);if(!l)throw new k.TreeError(this.user,`Tree element not found: ${s}`);return l}}e.CompressedObjectTreeModel=n;const t=d=>d[d.length-1];e.DefaultElementMapper=t;class r{get element(){return this.node.element===null?null:this.unwrapper(this.node.element)}get children(){return this.node.children.map(s=>new r(this.unwrapper,s))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}constructor(s,l){this.unwrapper=s,this.node=l}}function u(d,s){return{splice(l,o,g){s.splice(l,o,g.map(h=>d.map(h)))},updateElementHeight(l,o){s.updateElementHeight(l,o)}}}function f(d,s){return{...s,identityProvider:s.identityProvider&&{getId(l){return s.identityProvider.getId(d(l))}},sorter:s.sorter&&{compare(l,o){return s.sorter.compare(l.elements[0],o.elements[0])}},filter:s.filter&&{filter(l,o){return s.filter.filter(d(l),o)}}}}class c{get onDidSplice(){return E.Event.map(this.model.onDidSplice,({insertedNodes:s,deletedNodes:l})=>({insertedNodes:s.map(o=>this.nodeMapper.map(o)),deletedNodes:l.map(o=>this.nodeMapper.map(o))}))}get onDidChangeCollapseState(){return E.Event.map(this.model.onDidChangeCollapseState,({node:s,deep:l})=>({node:this.nodeMapper.map(s),deep:l}))}get onDidChangeRenderNodeCount(){return E.Event.map(this.model.onDidChangeRenderNodeCount,s=>this.nodeMapper.map(s))}constructor(s,l,o={}){this.rootRef=null,this.elementMapper=o.elementMapper||e.DefaultElementMapper;const g=h=>this.elementMapper(h.elements);this.nodeMapper=new k.WeakMapper(h=>new r(g,h)),this.model=new n(s,u(this.nodeMapper,l),f(g,o))}setChildren(s,l=S.Iterable.empty(),o={}){this.model.setChildren(s,l,o)}isCompressionEnabled(){return this.model.isCompressionEnabled()}setCompressionEnabled(s){this.model.setCompressionEnabled(s)}has(s){return this.model.has(s)}getListIndex(s){return this.model.getListIndex(s)}getListRenderCount(s){return this.model.getListRenderCount(s)}getNode(s){return this.nodeMapper.map(this.model.getNode(s))}getNodeLocation(s){return s.element}getParentNodeLocation(s){return this.model.getParentNodeLocation(s)}getFirstElementChild(s){const l=this.model.getFirstElementChild(s);return l===null||typeof l>"u"?l:this.elementMapper(l.elements)}isCollapsible(s){return this.model.isCollapsible(s)}setCollapsible(s,l){return this.model.setCollapsible(s,l)}isCollapsed(s){return this.model.isCollapsed(s)}setCollapsed(s,l,o){return this.model.setCollapsed(s,l,o)}expandTo(s){return this.model.expandTo(s)}rerender(s){return this.model.rerender(s)}refilter(){return this.model.refilter()}getCompressedTreeNode(s=null){return this.model.getNode(s)}}e.CompressibleObjectTreeModel=c}),define(se[314],oe([1,0,17]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.platform=e.env=e.cwd=void 0;let k;const y=globalThis.vscode;if(typeof y<"u"&&typeof y.process<"u"){const E=y.process;k={get platform(){return E.platform},get arch(){return E.arch},get env(){return E.env},cwd(){return E.cwd()}}}else typeof process<"u"?k={get platform(){return process.platform},get arch(){return process.arch},get env(){return process.env},cwd(){return process.env.VSCODE_CWD||process.cwd()}}:k={get platform(){return L.isWindows?"win32":L.isMacintosh?"darwin":"linux"},get arch(){},get env(){return{}},cwd(){return"/"}};e.cwd=k.cwd,e.env=k.env,e.platform=k.platform}),define(se[585],oe([1,0,314]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.registerHotReloadHandler=e.isHotReloadEnabled=void 0;function k(){return L.env&&!!L.env.VSCODE_DEV}e.isHotReloadEnabled=k;function y(p){if(k()){const _=E();return _.add(p),{dispose(){_.delete(p)}}}else return{dispose(){}}}e.registerHotReloadHandler=y;function E(){S||(S=new Set);const p=globalThis;return p.$hotReload_applyNewExports||(p.$hotReload_applyNewExports=_=>{for(const v of S){const b=v(_);if(b)return b}}),S}let S;k()&&y(({oldExports:p,newSrc:_})=>{if(_.indexOf("/* hot-reload:patch-prototype-methods */")!==-1)return v=>{var b,a;for(const i in v){const n=v[i];if(console.log(`[hot-reload] Patching prototype methods of '${i}'`,{exportedItem:n}),typeof n=="function"&&n.prototype){const t=p[i];if(t){for(const r of Object.getOwnPropertyNames(n.prototype)){const u=Object.getOwnPropertyDescriptor(n.prototype,r),f=Object.getOwnPropertyDescriptor(t.prototype,r);((b=u?.value)===null||b===void 0?void 0:b.toString())!==((a=f?.value)===null||a===void 0?void 0:a.toString())&&console.log(`[hot-reload] Patching prototype method '${i}.${r}'`),Object.defineProperty(t.prototype,r,u)}v[i]=t}}}return!0}})}),define(se[95],oe([1,0,314]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.sep=e.extname=e.basename=e.dirname=e.relative=e.resolve=e.normalize=e.posix=e.win32=void 0;const k=65,y=97,E=90,S=122,p=46,_=47,v=92,b=58,a=63;class i extends Error{constructor(g,h,m){let C;typeof h=="string"&&h.indexOf("not ")===0?(C="must not be",h=h.replace(/^not /,"")):C="must be";const w=g.indexOf(".")!==-1?"property":"argument";let D=`The "${g}" ${w} ${C} of type ${h}`;D+=`. Received type ${typeof m}`,super(D),this.code="ERR_INVALID_ARG_TYPE"}}function n(o,g){if(o===null||typeof o!="object")throw new i(g,"Object",o)}function t(o,g){if(typeof o!="string")throw new i(g,"string",o)}const r=L.platform==="win32";function u(o){return o===_||o===v}function f(o){return o===_}function c(o){return o>=k&&o<=E||o>=y&&o<=S}function d(o,g,h,m){let C="",w=0,D=-1,I=0,T=0;for(let A=0;A<=o.length;++A){if(A<o.length)T=o.charCodeAt(A);else{if(m(T))break;T=_}if(m(T)){if(!(D===A-1||I===1))if(I===2){if(C.length<2||w!==2||C.charCodeAt(C.length-1)!==p||C.charCodeAt(C.length-2)!==p){if(C.length>2){const P=C.lastIndexOf(h);P===-1?(C="",w=0):(C=C.slice(0,P),w=C.length-1-C.lastIndexOf(h)),D=A,I=0;continue}else if(C.length!==0){C="",w=0,D=A,I=0;continue}}g&&(C+=C.length>0?`${h}..`:"..",w=2)}else C.length>0?C+=`${h}${o.slice(D+1,A)}`:C=o.slice(D+1,A),w=A-D-1;D=A,I=0}else T===p&&I!==-1?++I:I=-1}return C}function s(o,g){n(g,"pathObject");const h=g.dir||g.root,m=g.base||`${g.name||""}${g.ext||""}`;return h?h===g.root?`${h}${m}`:`${h}${o}${m}`:m}e.win32={resolve(...o){let g="",h="",m=!1;for(let C=o.length-1;C>=-1;C--){let w;if(C>=0){if(w=o[C],t(w,"path"),w.length===0)continue}else g.length===0?w=L.cwd():(w=L.env[`=${g}`]||L.cwd(),(w===void 0||w.slice(0,2).toLowerCase()!==g.toLowerCase()&&w.charCodeAt(2)===v)&&(w=`${g}\\`));const D=w.length;let I=0,T="",A=!1;const P=w.charCodeAt(0);if(D===1)u(P)&&(I=1,A=!0);else if(u(P))if(A=!0,u(w.charCodeAt(1))){let N=2,M=N;for(;N<D&&!u(w.charCodeAt(N));)N++;if(N<D&&N!==M){const R=w.slice(M,N);for(M=N;N<D&&u(w.charCodeAt(N));)N++;if(N<D&&N!==M){for(M=N;N<D&&!u(w.charCodeAt(N));)N++;(N===D||N!==M)&&(T=`\\\\${R}\\${w.slice(M,N)}`,I=N)}}}else I=1;else c(P)&&w.charCodeAt(1)===b&&(T=w.slice(0,2),I=2,D>2&&u(w.charCodeAt(2))&&(A=!0,I=3));if(T.length>0)if(g.length>0){if(T.toLowerCase()!==g.toLowerCase())continue}else g=T;if(m){if(g.length>0)break}else if(h=`${w.slice(I)}\\${h}`,m=A,A&&g.length>0)break}return h=d(h,!m,"\\",u),m?`${g}\\${h}`:`${g}${h}`||"."},normalize(o){t(o,"path");const g=o.length;if(g===0)return".";let h=0,m,C=!1;const w=o.charCodeAt(0);if(g===1)return f(w)?"\\":o;if(u(w))if(C=!0,u(o.charCodeAt(1))){let I=2,T=I;for(;I<g&&!u(o.charCodeAt(I));)I++;if(I<g&&I!==T){const A=o.slice(T,I);for(T=I;I<g&&u(o.charCodeAt(I));)I++;if(I<g&&I!==T){for(T=I;I<g&&!u(o.charCodeAt(I));)I++;if(I===g)return`\\\\${A}\\${o.slice(T)}\\`;I!==T&&(m=`\\\\${A}\\${o.slice(T,I)}`,h=I)}}}else h=1;else c(w)&&o.charCodeAt(1)===b&&(m=o.slice(0,2),h=2,g>2&&u(o.charCodeAt(2))&&(C=!0,h=3));let D=h<g?d(o.slice(h),!C,"\\",u):"";return D.length===0&&!C&&(D="."),D.length>0&&u(o.charCodeAt(g-1))&&(D+="\\"),m===void 0?C?`\\${D}`:D:C?`${m}\\${D}`:`${m}${D}`},isAbsolute(o){t(o,"path");const g=o.length;if(g===0)return!1;const h=o.charCodeAt(0);return u(h)||g>2&&c(h)&&o.charCodeAt(1)===b&&u(o.charCodeAt(2))},join(...o){if(o.length===0)return".";let g,h;for(let w=0;w<o.length;++w){const D=o[w];t(D,"path"),D.length>0&&(g===void 0?g=h=D:g+=`\\${D}`)}if(g===void 0)return".";let m=!0,C=0;if(typeof h=="string"&&u(h.charCodeAt(0))){++C;const w=h.length;w>1&&u(h.charCodeAt(1))&&(++C,w>2&&(u(h.charCodeAt(2))?++C:m=!1))}if(m){for(;C<g.length&&u(g.charCodeAt(C));)C++;C>=2&&(g=`\\${g.slice(C)}`)}return e.win32.normalize(g)},relative(o,g){if(t(o,"from"),t(g,"to"),o===g)return"";const h=e.win32.resolve(o),m=e.win32.resolve(g);if(h===m||(o=h.toLowerCase(),g=m.toLowerCase(),o===g))return"";let C=0;for(;C<o.length&&o.charCodeAt(C)===v;)C++;let w=o.length;for(;w-1>C&&o.charCodeAt(w-1)===v;)w--;const D=w-C;let I=0;for(;I<g.length&&g.charCodeAt(I)===v;)I++;let T=g.length;for(;T-1>I&&g.charCodeAt(T-1)===v;)T--;const A=T-I,P=D<A?D:A;let N=-1,M=0;for(;M<P;M++){const x=o.charCodeAt(C+M);if(x!==g.charCodeAt(I+M))break;x===v&&(N=M)}if(M!==P){if(N===-1)return m}else{if(A>P){if(g.charCodeAt(I+M)===v)return m.slice(I+M+1);if(M===2)return m.slice(I+M)}D>P&&(o.charCodeAt(C+M)===v?N=M:M===2&&(N=3)),N===-1&&(N=0)}let R="";for(M=C+N+1;M<=w;++M)(M===w||o.charCodeAt(M)===v)&&(R+=R.length===0?"..":"\\..");return I+=N,R.length>0?`${R}${m.slice(I,T)}`:(m.charCodeAt(I)===v&&++I,m.slice(I,T))},toNamespacedPath(o){if(typeof o!="string"||o.length===0)return o;const g=e.win32.resolve(o);if(g.length<=2)return o;if(g.charCodeAt(0)===v){if(g.charCodeAt(1)===v){const h=g.charCodeAt(2);if(h!==a&&h!==p)return`\\\\?\\UNC\\${g.slice(2)}`}}else if(c(g.charCodeAt(0))&&g.charCodeAt(1)===b&&g.charCodeAt(2)===v)return`\\\\?\\${g}`;return o},dirname(o){t(o,"path");const g=o.length;if(g===0)return".";let h=-1,m=0;const C=o.charCodeAt(0);if(g===1)return u(C)?o:".";if(u(C)){if(h=m=1,u(o.charCodeAt(1))){let I=2,T=I;for(;I<g&&!u(o.charCodeAt(I));)I++;if(I<g&&I!==T){for(T=I;I<g&&u(o.charCodeAt(I));)I++;if(I<g&&I!==T){for(T=I;I<g&&!u(o.charCodeAt(I));)I++;if(I===g)return o;I!==T&&(h=m=I+1)}}}}else c(C)&&o.charCodeAt(1)===b&&(h=g>2&&u(o.charCodeAt(2))?3:2,m=h);let w=-1,D=!0;for(let I=g-1;I>=m;--I)if(u(o.charCodeAt(I))){if(!D){w=I;break}}else D=!1;if(w===-1){if(h===-1)return".";w=h}return o.slice(0,w)},basename(o,g){g!==void 0&&t(g,"ext"),t(o,"path");let h=0,m=-1,C=!0,w;if(o.length>=2&&c(o.charCodeAt(0))&&o.charCodeAt(1)===b&&(h=2),g!==void 0&&g.length>0&&g.length<=o.length){if(g===o)return"";let D=g.length-1,I=-1;for(w=o.length-1;w>=h;--w){const T=o.charCodeAt(w);if(u(T)){if(!C){h=w+1;break}}else I===-1&&(C=!1,I=w+1),D>=0&&(T===g.charCodeAt(D)?--D===-1&&(m=w):(D=-1,m=I))}return h===m?m=I:m===-1&&(m=o.length),o.slice(h,m)}for(w=o.length-1;w>=h;--w)if(u(o.charCodeAt(w))){if(!C){h=w+1;break}}else m===-1&&(C=!1,m=w+1);return m===-1?"":o.slice(h,m)},extname(o){t(o,"path");let g=0,h=-1,m=0,C=-1,w=!0,D=0;o.length>=2&&o.charCodeAt(1)===b&&c(o.charCodeAt(0))&&(g=m=2);for(let I=o.length-1;I>=g;--I){const T=o.charCodeAt(I);if(u(T)){if(!w){m=I+1;break}continue}C===-1&&(w=!1,C=I+1),T===p?h===-1?h=I:D!==1&&(D=1):h!==-1&&(D=-1)}return h===-1||C===-1||D===0||D===1&&h===C-1&&h===m+1?"":o.slice(h,C)},format:s.bind(null,"\\"),parse(o){t(o,"path");const g={root:"",dir:"",base:"",ext:"",name:""};if(o.length===0)return g;const h=o.length;let m=0,C=o.charCodeAt(0);if(h===1)return u(C)?(g.root=g.dir=o,g):(g.base=g.name=o,g);if(u(C)){if(m=1,u(o.charCodeAt(1))){let N=2,M=N;for(;N<h&&!u(o.charCodeAt(N));)N++;if(N<h&&N!==M){for(M=N;N<h&&u(o.charCodeAt(N));)N++;if(N<h&&N!==M){for(M=N;N<h&&!u(o.charCodeAt(N));)N++;N===h?m=N:N!==M&&(m=N+1)}}}}else if(c(C)&&o.charCodeAt(1)===b){if(h<=2)return g.root=g.dir=o,g;if(m=2,u(o.charCodeAt(2))){if(h===3)return g.root=g.dir=o,g;m=3}}m>0&&(g.root=o.slice(0,m));let w=-1,D=m,I=-1,T=!0,A=o.length-1,P=0;for(;A>=m;--A){if(C=o.charCodeAt(A),u(C)){if(!T){D=A+1;break}continue}I===-1&&(T=!1,I=A+1),C===p?w===-1?w=A:P!==1&&(P=1):w!==-1&&(P=-1)}return I!==-1&&(w===-1||P===0||P===1&&w===I-1&&w===D+1?g.base=g.name=o.slice(D,I):(g.name=o.slice(D,w),g.base=o.slice(D,I),g.ext=o.slice(w,I))),D>0&&D!==m?g.dir=o.slice(0,D-1):g.dir=g.root,g},sep:"\\",delimiter:";",win32:null,posix:null};const l=(()=>{if(r){const o=/\\/g;return()=>{const g=L.cwd().replace(o,"/");return g.slice(g.indexOf("/"))}}return()=>L.cwd()})();e.posix={resolve(...o){let g="",h=!1;for(let m=o.length-1;m>=-1&&!h;m--){const C=m>=0?o[m]:l();t(C,"path"),C.length!==0&&(g=`${C}/${g}`,h=C.charCodeAt(0)===_)}return g=d(g,!h,"/",f),h?`/${g}`:g.length>0?g:"."},normalize(o){if(t(o,"path"),o.length===0)return".";const g=o.charCodeAt(0)===_,h=o.charCodeAt(o.length-1)===_;return o=d(o,!g,"/",f),o.length===0?g?"/":h?"./":".":(h&&(o+="/"),g?`/${o}`:o)},isAbsolute(o){return t(o,"path"),o.length>0&&o.charCodeAt(0)===_},join(...o){if(o.length===0)return".";let g;for(let h=0;h<o.length;++h){const m=o[h];t(m,"path"),m.length>0&&(g===void 0?g=m:g+=`/${m}`)}return g===void 0?".":e.posix.normalize(g)},relative(o,g){if(t(o,"from"),t(g,"to"),o===g||(o=e.posix.resolve(o),g=e.posix.resolve(g),o===g))return"";const h=1,m=o.length,C=m-h,w=1,D=g.length-w,I=C<D?C:D;let T=-1,A=0;for(;A<I;A++){const N=o.charCodeAt(h+A);if(N!==g.charCodeAt(w+A))break;N===_&&(T=A)}if(A===I)if(D>I){if(g.charCodeAt(w+A)===_)return g.slice(w+A+1);if(A===0)return g.slice(w+A)}else C>I&&(o.charCodeAt(h+A)===_?T=A:A===0&&(T=0));let P="";for(A=h+T+1;A<=m;++A)(A===m||o.charCodeAt(A)===_)&&(P+=P.length===0?"..":"/..");return`${P}${g.slice(w+T)}`},toNamespacedPath(o){return o},dirname(o){if(t(o,"path"),o.length===0)return".";const g=o.charCodeAt(0)===_;let h=-1,m=!0;for(let C=o.length-1;C>=1;--C)if(o.charCodeAt(C)===_){if(!m){h=C;break}}else m=!1;return h===-1?g?"/":".":g&&h===1?"//":o.slice(0,h)},basename(o,g){g!==void 0&&t(g,"ext"),t(o,"path");let h=0,m=-1,C=!0,w;if(g!==void 0&&g.length>0&&g.length<=o.length){if(g===o)return"";let D=g.length-1,I=-1;for(w=o.length-1;w>=0;--w){const T=o.charCodeAt(w);if(T===_){if(!C){h=w+1;break}}else I===-1&&(C=!1,I=w+1),D>=0&&(T===g.charCodeAt(D)?--D===-1&&(m=w):(D=-1,m=I))}return h===m?m=I:m===-1&&(m=o.length),o.slice(h,m)}for(w=o.length-1;w>=0;--w)if(o.charCodeAt(w)===_){if(!C){h=w+1;break}}else m===-1&&(C=!1,m=w+1);return m===-1?"":o.slice(h,m)},extname(o){t(o,"path");let g=-1,h=0,m=-1,C=!0,w=0;for(let D=o.length-1;D>=0;--D){const I=o.charCodeAt(D);if(I===_){if(!C){h=D+1;break}continue}m===-1&&(C=!1,m=D+1),I===p?g===-1?g=D:w!==1&&(w=1):g!==-1&&(w=-1)}return g===-1||m===-1||w===0||w===1&&g===m-1&&g===h+1?"":o.slice(g,m)},format:s.bind(null,"/"),parse(o){t(o,"path");const g={root:"",dir:"",base:"",ext:"",name:""};if(o.length===0)return g;const h=o.charCodeAt(0)===_;let m;h?(g.root="/",m=1):m=0;let C=-1,w=0,D=-1,I=!0,T=o.length-1,A=0;for(;T>=m;--T){const P=o.charCodeAt(T);if(P===_){if(!I){w=T+1;break}continue}D===-1&&(I=!1,D=T+1),P===p?C===-1?C=T:A!==1&&(A=1):C!==-1&&(A=-1)}if(D!==-1){const P=w===0&&h?1:w;C===-1||A===0||A===1&&C===D-1&&C===w+1?g.base=g.name=o.slice(P,D):(g.name=o.slice(P,C),g.base=o.slice(P,D),g.ext=o.slice(C,D))}return w>0?g.dir=o.slice(0,w-1):h&&(g.dir="/"),g},sep:"/",delimiter:":",win32:null,posix:null},e.posix.win32=e.win32.win32=e.win32,e.posix.posix=e.win32.posix=e.posix,e.normalize=r?e.win32.normalize:e.posix.normalize,e.resolve=r?e.win32.resolve:e.posix.resolve,e.relative=r?e.win32.relative:e.posix.relative,e.dirname=r?e.win32.dirname:e.posix.dirname,e.basename=r?e.win32.basename:e.posix.basename,e.extname=r?e.win32.extname:e.posix.extname,e.sep=r?e.win32.sep:e.posix.sep}),define(se[222],oe([1,0,95,17,11]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.hasDriveLetter=e.isWindowsDriveLetter=e.isEqualOrParent=e.getRoot=e.toPosixPath=e.toSlashes=e.isPathSeparator=void 0;function E(i){return i===47||i===92}e.isPathSeparator=E;function S(i){return i.replace(/[\\/]/g,L.posix.sep)}e.toSlashes=S;function p(i){return i.indexOf("/")===-1&&(i=S(i)),/^[a-zA-Z]:(\/|$)/.test(i)&&(i="/"+i),i}e.toPosixPath=p;function _(i,n=L.posix.sep){if(!i)return"";const t=i.length,r=i.charCodeAt(0);if(E(r)){if(E(i.charCodeAt(1))&&!E(i.charCodeAt(2))){let f=3;const c=f;for(;f<t&&!E(i.charCodeAt(f));f++);if(c!==f&&!E(i.charCodeAt(f+1))){for(f+=1;f<t;f++)if(E(i.charCodeAt(f)))return i.slice(0,f+1).replace(/[\\/]/g,n)}}return n}else if(b(r)&&i.charCodeAt(1)===58)return E(i.charCodeAt(2))?i.slice(0,2)+n:i.slice(0,2);let u=i.indexOf("://");if(u!==-1){for(u+=3;u<t;u++)if(E(i.charCodeAt(u)))return i.slice(0,u+1)}return""}e.getRoot=_;function v(i,n,t,r=L.sep){if(i===n)return!0;if(!i||!n||n.length>i.length)return!1;if(t){if(!(0,y.startsWithIgnoreCase)(i,n))return!1;if(n.length===i.length)return!0;let f=n.length;return n.charAt(n.length-1)===r&&f--,i.charAt(f)===r}return n.charAt(n.length-1)!==r&&(n+=r),i.indexOf(n)===0}e.isEqualOrParent=v;function b(i){return i>=65&&i<=90||i>=97&&i<=122}e.isWindowsDriveLetter=b;function a(i,n=k.isWindows){return n?b(i.charCodeAt(0))&&i.charCodeAt(1)===58:!1}e.hasDriveLetter=a}),define(se[586],oe([1,0,71,95,17,11]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.pieceToQuery=e.prepareQuery=e.scoreFuzzy2=void 0;const S=[void 0,[]];function p(c,d,s=0,l=0){const o=d;return o.values&&o.values.length>1?_(c,o.values,s,l):v(c,d,s,l)}e.scoreFuzzy2=p;function _(c,d,s,l){let o=0;const g=[];for(const h of d){const[m,C]=v(c,h,s,l);if(typeof m!="number")return S;o+=m,g.push(...C)}return[o,a(g)]}function v(c,d,s,l){const o=(0,L.fuzzyScore)(d.original,d.originalLowercase,s,c,c.toLowerCase(),l,{firstMatchCanBeWeak:!0,boostFullMatch:!0});return o?[o[0],(0,L.createMatches)(o)]:S}const b=Object.freeze({score:0});function a(c){const d=c.sort((o,g)=>o.start-g.start),s=[];let l;for(const o of d)!l||!i(l,o)?(l=o,s.push(o)):(l.start=Math.min(l.start,o.start),l.end=Math.max(l.end,o.end));return s}function i(c,d){return!(c.end<d.start||d.end<c.start)}function n(c){return c.startsWith('"')&&c.endsWith('"')}const t=" ";function r(c){typeof c!="string"&&(c="");const d=c.toLowerCase(),{pathNormalized:s,normalized:l,normalizedLowercase:o}=u(c),g=s.indexOf(k.sep)>=0,h=n(c);let m;const C=c.split(t);if(C.length>1)for(const w of C){const D=n(w),{pathNormalized:I,normalized:T,normalizedLowercase:A}=u(w);T&&(m||(m=[]),m.push({original:w,originalLowercase:w.toLowerCase(),pathNormalized:I,normalized:T,normalizedLowercase:A,expectContiguousMatch:D}))}return{original:c,originalLowercase:d,pathNormalized:s,normalized:l,normalizedLowercase:o,values:m,containsPathSeparator:g,expectContiguousMatch:h}}e.prepareQuery=r;function u(c){let d;y.isWindows?d=c.replace(/\//g,k.sep):d=c.replace(/\\/g,k.sep);const s=(0,E.stripWildcards)(d).replace(/\s|"/g,"");return{pathNormalized:d,normalized:s,normalizedLowercase:s.toLowerCase()}}function f(c){return Array.isArray(c)?r(c.map(d=>d.original).join(t)):r(c.original)}e.pieceToQuery=f}),define(se[315],oe([1,0,14,222,53,95,17,11]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isRelativePattern=e.parse=e.match=e.splitGlobAware=e.GLOB_SPLIT=e.GLOBSTAR=void 0,e.GLOBSTAR="**",e.GLOB_SPLIT="/";const _="[/\\\\]",v="[^/\\\\]",b=/\//g;function a(O,B){switch(O){case 0:return"";case 1:return`${v}*?`;default:return`(?:${_}|${v}+${_}${B?`|${_}${v}+`:""})*?`}}function i(O,B){if(!O)return[];const W=[];let V=!1,K=!1,F="";for(const q of O){switch(q){case B:if(!V&&!K){W.push(F),F="";continue}break;case"{":V=!0;break;case"}":V=!1;break;case"[":K=!0;break;case"]":K=!1;break}F+=q}return F&&W.push(F),W}e.splitGlobAware=i;function n(O){if(!O)return"";let B="";const W=i(O,e.GLOB_SPLIT);if(W.every(V=>V===e.GLOBSTAR))B=".*";else{let V=!1;W.forEach((K,F)=>{if(K===e.GLOBSTAR){if(V)return;B+=a(2,F===W.length-1)}else{let q=!1,ie="",ae=!1,ne="";for(const $ of K){if($!=="}"&&q){ie+=$;continue}if(ae&&($!=="]"||!ne)){let J;$==="-"?J=$:($==="^"||$==="!")&&!ne?J="^":$===e.GLOB_SPLIT?J="":J=(0,p.escapeRegExpCharacters)($),ne+=J;continue}switch($){case"{":q=!0;continue;case"[":ae=!0;continue;case"}":{const Q=`(?:${i(ie,",").map(re=>n(re)).join("|")})`;B+=Q,q=!1,ie="";break}case"]":{B+="["+ne+"]",ae=!1,ne="";break}case"?":B+=v;continue;case"*":B+=a(1);continue;default:B+=(0,p.escapeRegExpCharacters)($)}}F<W.length-1&&(W[F+1]!==e.GLOBSTAR||F+2<W.length)&&(B+=_)}V=K===e.GLOBSTAR})}return B}const t=/^\*\*\/\*\.[\w\.-]+$/,r=/^\*\*\/([\w\.-]+)\/?$/,u=/^{\*\*\/\*?[\w\.-]+\/?(,\*\*\/\*?[\w\.-]+\/?)*}$/,f=/^{\*\*\/\*?[\w\.-]+(\/(\*\*)?)?(,\*\*\/\*?[\w\.-]+(\/(\*\*)?)?)*}$/,c=/^\*\*((\/[\w\.-]+)+)\/?$/,d=/^([\w\.-]+(\/[\w\.-]+)*)\/?$/,s=new y.LRUCache(1e4),l=function(){return!1},o=function(){return null};function g(O,B){if(!O)return o;let W;typeof O!="string"?W=O.pattern:W=O,W=W.trim();const V=`${W}_${!!B.trimForExclusions}`;let K=s.get(V);if(K)return h(K,O);let F;return t.test(W)?K=C(W.substr(4),W):(F=r.exec(m(W,B)))?K=w(F[1],W):(B.trimForExclusions?f:u).test(W)?K=D(W,B):(F=c.exec(m(W,B)))?K=I(F[1].substr(1),W,!0):(F=d.exec(m(W,B)))?K=I(F[1],W,!1):K=T(W),s.set(V,K),h(K,O)}function h(O,B){if(typeof B=="string")return O;const W=function(V,K){return(0,k.isEqualOrParent)(V,B.base,!S.isLinux)?O((0,p.ltrim)(V.substr(B.base.length),E.sep),K):null};return W.allBasenames=O.allBasenames,W.allPaths=O.allPaths,W.basenames=O.basenames,W.patterns=O.patterns,W}function m(O,B){return B.trimForExclusions&&O.endsWith("/**")?O.substr(0,O.length-2):O}function C(O,B){return function(W,V){return typeof W=="string"&&W.endsWith(O)?B:null}}function w(O,B){const W=`/${O}`,V=`\\${O}`,K=function(q,ie){return typeof q!="string"?null:ie?ie===O?B:null:q===O||q.endsWith(W)||q.endsWith(V)?B:null},F=[O];return K.basenames=F,K.patterns=[B],K.allBasenames=F,K}function D(O,B){const W=x(O.slice(1,-1).split(",").map(ie=>g(ie,B)).filter(ie=>ie!==o),O),V=W.length;if(!V)return o;if(V===1)return W[0];const K=function(ie,ae){for(let ne=0,$=W.length;ne<$;ne++)if(W[ne](ie,ae))return O;return null},F=W.find(ie=>!!ie.allBasenames);F&&(K.allBasenames=F.allBasenames);const q=W.reduce((ie,ae)=>ae.allPaths?ie.concat(ae.allPaths):ie,[]);return q.length&&(K.allPaths=q),K}function I(O,B,W){const V=E.sep===E.posix.sep,K=V?O:O.replace(b,E.sep),F=E.sep+K,q=E.posix.sep+O;let ie;return W?ie=function(ae,ne){return typeof ae=="string"&&(ae===K||ae.endsWith(F)||!V&&(ae===O||ae.endsWith(q)))?B:null}:ie=function(ae,ne){return typeof ae=="string"&&(ae===K||!V&&ae===O)?B:null},ie.allPaths=[(W?"*/":"./")+O],ie}function T(O){try{const B=new RegExp(`^${n(O)}$`);return function(W){return B.lastIndex=0,typeof W=="string"&&B.test(W)?O:null}}catch{return o}}function A(O,B,W){return!O||typeof B!="string"?!1:P(O)(B,void 0,W)}e.match=A;function P(O,B={}){if(!O)return l;if(typeof O=="string"||N(O)){const W=g(O,B);if(W===o)return l;const V=function(K,F){return!!W(K,F)};return W.allBasenames&&(V.allBasenames=W.allBasenames),W.allPaths&&(V.allPaths=W.allPaths),V}return M(O,B)}e.parse=P;function N(O){const B=O;return B?typeof B.base=="string"&&typeof B.pattern=="string":!1}e.isRelativePattern=N;function M(O,B){const W=x(Object.getOwnPropertyNames(O).map(ie=>R(ie,O[ie],B)).filter(ie=>ie!==o)),V=W.length;if(!V)return o;if(!W.some(ie=>!!ie.requiresSiblings)){if(V===1)return W[0];const ie=function($,J){let Q;for(let re=0,de=W.length;re<de;re++){const he=W[re]($,J);if(typeof he=="string")return he;(0,L.isThenable)(he)&&(Q||(Q=[]),Q.push(he))}return Q?(async()=>{for(const re of Q){const de=await re;if(typeof de=="string")return de}return null})():null},ae=W.find($=>!!$.allBasenames);ae&&(ie.allBasenames=ae.allBasenames);const ne=W.reduce(($,J)=>J.allPaths?$.concat(J.allPaths):$,[]);return ne.length&&(ie.allPaths=ne),ie}const K=function(ie,ae,ne){let $,J;for(let Q=0,re=W.length;Q<re;Q++){const de=W[Q];de.requiresSiblings&&ne&&(ae||(ae=(0,E.basename)(ie)),$||($=ae.substr(0,ae.length-(0,E.extname)(ie).length)));const he=de(ie,ae,$,ne);if(typeof he=="string")return he;(0,L.isThenable)(he)&&(J||(J=[]),J.push(he))}return J?(async()=>{for(const Q of J){const re=await Q;if(typeof re=="string")return re}return null})():null},F=W.find(ie=>!!ie.allBasenames);F&&(K.allBasenames=F.allBasenames);const q=W.reduce((ie,ae)=>ae.allPaths?ie.concat(ae.allPaths):ie,[]);return q.length&&(K.allPaths=q),K}function R(O,B,W){if(B===!1)return o;const V=g(O,W);if(V===o)return o;if(typeof B=="boolean")return V;if(B){const K=B.when;if(typeof K=="string"){const F=(q,ie,ae,ne)=>{if(!ne||!V(q,ie))return null;const $=K.replace("$(basename)",()=>ae),J=ne($);return(0,L.isThenable)(J)?J.then(Q=>Q?O:null):J?O:null};return F.requiresSiblings=!0,F}}return V}function x(O,B){const W=O.filter(ie=>!!ie.basenames);if(W.length<2)return O;const V=W.reduce((ie,ae)=>{const ne=ae.basenames;return ne?ie.concat(ne):ie},[]);let K;if(B){K=[];for(let ie=0,ae=V.length;ie<ae;ie++)K.push(B)}else K=W.reduce((ie,ae)=>{const ne=ae.patterns;return ne?ie.concat(ne):ie},[]);const F=function(ie,ae){if(typeof ie!="string")return null;if(!ae){let $;for($=ie.length;$>0;$--){const J=ie.charCodeAt($-1);if(J===47||J===92)break}ae=ie.substr($)}const ne=V.indexOf(ae);return ne!==-1?K[ne]:null};F.basenames=V,F.patterns=K,F.allBasenames=V;const q=O.filter(ie=>!ie.basenames);return q.push(F),q}}),define(se[587],oe([1,0,222,17]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.normalizeDriveLetter=void 0;function y(S,p=k.isWindows){return(0,L.hasDriveLetter)(S,p)?S.charAt(0).toUpperCase()+S.slice(1):S}e.normalizeDriveLetter=y;let E=Object.create(null)}),define(se[22],oe([1,0,95,17]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.uriToFsPath=e.URI=void 0;const y=/^\w[\w\d+.-]*$/,E=/^\//,S=/^\/\//;function p(h,m){if(!h.scheme&&m)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${h.authority}", path: "${h.path}", query: "${h.query}", fragment: "${h.fragment}"}`);if(h.scheme&&!y.test(h.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(h.path){if(h.authority){if(!E.test(h.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(S.test(h.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}function _(h,m){return!h&&!m?"file":h}function v(h,m){switch(h){case"https":case"http":case"file":m?m[0]!==a&&(m=a+m):m=a;break}return m}const b="",a="/",i=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class n{static isUri(m){return m instanceof n?!0:m?typeof m.authority=="string"&&typeof m.fragment=="string"&&typeof m.path=="string"&&typeof m.query=="string"&&typeof m.scheme=="string"&&typeof m.fsPath=="string"&&typeof m.with=="function"&&typeof m.toString=="function":!1}constructor(m,C,w,D,I,T=!1){typeof m=="object"?(this.scheme=m.scheme||b,this.authority=m.authority||b,this.path=m.path||b,this.query=m.query||b,this.fragment=m.fragment||b):(this.scheme=_(m,T),this.authority=C||b,this.path=v(this.scheme,w||b),this.query=D||b,this.fragment=I||b,p(this,T))}get fsPath(){return d(this,!1)}with(m){if(!m)return this;let{scheme:C,authority:w,path:D,query:I,fragment:T}=m;return C===void 0?C=this.scheme:C===null&&(C=b),w===void 0?w=this.authority:w===null&&(w=b),D===void 0?D=this.path:D===null&&(D=b),I===void 0?I=this.query:I===null&&(I=b),T===void 0?T=this.fragment:T===null&&(T=b),C===this.scheme&&w===this.authority&&D===this.path&&I===this.query&&T===this.fragment?this:new r(C,w,D,I,T)}static parse(m,C=!1){const w=i.exec(m);return w?new r(w[2]||b,g(w[4]||b),g(w[5]||b),g(w[7]||b),g(w[9]||b),C):new r(b,b,b,b,b)}static file(m){let C=b;if(k.isWindows&&(m=m.replace(/\\/g,a)),m[0]===a&&m[1]===a){const w=m.indexOf(a,2);w===-1?(C=m.substring(2),m=a):(C=m.substring(2,w),m=m.substring(w)||a)}return new r("file",C,m,b,b)}static from(m,C){return new r(m.scheme,m.authority,m.path,m.query,m.fragment,C)}static joinPath(m,...C){if(!m.path)throw new Error("[UriError]: cannot call joinPath on URI without path");let w;return k.isWindows&&m.scheme==="file"?w=n.file(L.win32.join(d(m,!0),...C)).path:w=L.posix.join(m.path,...C),m.with({path:w})}toString(m=!1){return s(this,m)}toJSON(){return this}static revive(m){var C,w;if(m){if(m instanceof n)return m;{const D=new r(m);return D._formatted=(C=m.external)!==null&&C!==void 0?C:null,D._fsPath=m._sep===t&&(w=m.fsPath)!==null&&w!==void 0?w:null,D}}else return m}}e.URI=n;const t=k.isWindows?1:void 0;class r extends n{constructor(){super(...arguments),this._formatted=null,this._fsPath=null}get fsPath(){return this._fsPath||(this._fsPath=d(this,!1)),this._fsPath}toString(m=!1){return m?s(this,!0):(this._formatted||(this._formatted=s(this,!1)),this._formatted)}toJSON(){const m={$mid:1};return this._fsPath&&(m.fsPath=this._fsPath,m._sep=t),this._formatted&&(m.external=this._formatted),this.path&&(m.path=this.path),this.scheme&&(m.scheme=this.scheme),this.authority&&(m.authority=this.authority),this.query&&(m.query=this.query),this.fragment&&(m.fragment=this.fragment),m}}const u={[58]:"%3A",[47]:"%2F",[63]:"%3F",[35]:"%23",[91]:"%5B",[93]:"%5D",[64]:"%40",[33]:"%21",[36]:"%24",[38]:"%26",[39]:"%27",[40]:"%28",[41]:"%29",[42]:"%2A",[43]:"%2B",[44]:"%2C",[59]:"%3B",[61]:"%3D",[32]:"%20"};function f(h,m,C){let w,D=-1;for(let I=0;I<h.length;I++){const T=h.charCodeAt(I);if(T>=97&&T<=122||T>=65&&T<=90||T>=48&&T<=57||T===45||T===46||T===95||T===126||m&&T===47||C&&T===91||C&&T===93||C&&T===58)D!==-1&&(w+=encodeURIComponent(h.substring(D,I)),D=-1),w!==void 0&&(w+=h.charAt(I));else{w===void 0&&(w=h.substr(0,I));const A=u[T];A!==void 0?(D!==-1&&(w+=encodeURIComponent(h.substring(D,I)),D=-1),w+=A):D===-1&&(D=I)}}return D!==-1&&(w+=encodeURIComponent(h.substring(D))),w!==void 0?w:h}function c(h){let m;for(let C=0;C<h.length;C++){const w=h.charCodeAt(C);w===35||w===63?(m===void 0&&(m=h.substr(0,C)),m+=u[w]):m!==void 0&&(m+=h[C])}return m!==void 0?m:h}function d(h,m){let C;return h.authority&&h.path.length>1&&h.scheme==="file"?C=`//${h.authority}${h.path}`:h.path.charCodeAt(0)===47&&(h.path.charCodeAt(1)>=65&&h.path.charCodeAt(1)<=90||h.path.charCodeAt(1)>=97&&h.path.charCodeAt(1)<=122)&&h.path.charCodeAt(2)===58?m?C=h.path.substr(1):C=h.path[1].toLowerCase()+h.path.substr(2):C=h.path,k.isWindows&&(C=C.replace(/\//g,"\\")),C}e.uriToFsPath=d;function s(h,m){const C=m?c:f;let w="",{scheme:D,authority:I,path:T,query:A,fragment:P}=h;if(D&&(w+=D,w+=":"),(I||D==="file")&&(w+=a,w+=a),I){let N=I.indexOf("@");if(N!==-1){const M=I.substr(0,N);I=I.substr(N+1),N=M.lastIndexOf(":"),N===-1?w+=C(M,!1,!1):(w+=C(M.substr(0,N),!1,!1),w+=":",w+=C(M.substr(N+1),!1,!0)),w+="@"}I=I.toLowerCase(),N=I.lastIndexOf(":"),N===-1?w+=C(I,!1,!0):(w+=C(I.substr(0,N),!1,!0),w+=I.substr(N))}if(T){if(T.length>=3&&T.charCodeAt(0)===47&&T.charCodeAt(2)===58){const N=T.charCodeAt(1);N>=65&&N<=90&&(T=`/${String.fromCharCode(N+32)}:${T.substr(3)}`)}else if(T.length>=2&&T.charCodeAt(1)===58){const N=T.charCodeAt(0);N>=65&&N<=90&&(T=`${String.fromCharCode(N+32)}:${T.substr(2)}`)}w+=C(T,!0,!1)}return A&&(w+="?",w+=C(A,!1,!1)),P&&(w+="#",w+=m?P:f(P,!1,!1)),w}function l(h){try{return decodeURIComponent(h)}catch{return h.length>3?h.substr(0,3)+l(h.substr(3)):h}}const o=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function g(h){return h.match(o)?h.replace(o,m=>l(m)):h}}),define(se[223],oe([1,0,144,22]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.revive=e.parse=e.stringify=void 0;function y(_){return JSON.stringify(_,S)}e.stringify=y;function E(_){let v=JSON.parse(_);return v=p(v),v}e.parse=E;function S(_,v){return v instanceof RegExp?{$mid:2,source:v.source,flags:v.flags}:v}function p(_,v=0){if(!_||v>200)return _;if(typeof _=="object"){switch(_.$mid){case 1:return k.URI.revive(_);case 2:return new RegExp(_.source,_.flags);case 17:return new Date(_.source)}if(_ instanceof L.VSBuffer||_ instanceof Uint8Array)return _;if(Array.isArray(_))for(let b=0;b<_.length;++b)_[b]=p(_[b],v+1);else for(const b in _)Object.hasOwnProperty.call(_,b)&&(_[b]=p(_[b],v+1))}return _}e.revive=p}),define(se[47],oe([1,0,12,17,11,22]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.COI=e.FileAccess=e.VSCODE_AUTHORITY=e.RemoteAuthorities=e.connectionTokenQueryName=e.matchesSomeScheme=e.matchesScheme=e.Schemas=void 0;var S;(function(i){i.inMemory="inmemory",i.vscode="vscode",i.internal="private",i.walkThrough="walkThrough",i.walkThroughSnippet="walkThroughSnippet",i.http="http",i.https="https",i.file="file",i.mailto="mailto",i.untitled="untitled",i.data="data",i.command="command",i.vscodeRemote="vscode-remote",i.vscodeRemoteResource="vscode-remote-resource",i.vscodeManagedRemoteResource="vscode-managed-remote-resource",i.vscodeUserData="vscode-userdata",i.vscodeCustomEditor="vscode-custom-editor",i.vscodeNotebookCell="vscode-notebook-cell",i.vscodeNotebookCellMetadata="vscode-notebook-cell-metadata",i.vscodeNotebookCellOutput="vscode-notebook-cell-output",i.vscodeInteractiveInput="vscode-interactive-input",i.vscodeSettings="vscode-settings",i.vscodeWorkspaceTrust="vscode-workspace-trust",i.vscodeTerminal="vscode-terminal",i.vscodeChatSesssion="vscode-chat-editor",i.webviewPanel="webview-panel",i.vscodeWebview="vscode-webview",i.extension="extension",i.vscodeFileResource="vscode-file",i.tmp="tmp",i.vsls="vsls",i.vscodeSourceControl="vscode-scm"})(S||(e.Schemas=S={}));function p(i,n){return E.URI.isUri(i)?(0,y.equalsIgnoreCase)(i.scheme,n):(0,y.startsWithIgnoreCase)(i,n+":")}e.matchesScheme=p;function _(i,...n){return n.some(t=>p(i,t))}e.matchesSomeScheme=_,e.connectionTokenQueryName="tkn";class v{constructor(){this._hosts=Object.create(null),this._ports=Object.create(null),this._connectionTokens=Object.create(null),this._preferredWebSchema="http",this._delegate=null,this._remoteResourcesPath=`/${S.vscodeRemoteResource}`}setPreferredWebSchema(n){this._preferredWebSchema=n}rewrite(n){if(this._delegate)try{return this._delegate(n)}catch(d){return L.onUnexpectedError(d),n}const t=n.authority;let r=this._hosts[t];r&&r.indexOf(":")!==-1&&r.indexOf("[")===-1&&(r=`[${r}]`);const u=this._ports[t],f=this._connectionTokens[t];let c=`path=${encodeURIComponent(n.path)}`;return typeof f=="string"&&(c+=`&${e.connectionTokenQueryName}=${encodeURIComponent(f)}`),E.URI.from({scheme:k.isWeb?this._preferredWebSchema:S.vscodeRemoteResource,authority:`${r}:${u}`,path:this._remoteResourcesPath,query:c})}}e.RemoteAuthorities=new v,e.VSCODE_AUTHORITY="vscode-app";class b{uriToBrowserUri(n){return n.scheme===S.vscodeRemote?e.RemoteAuthorities.rewrite(n):n.scheme===S.file&&(k.isNative||k.webWorkerOrigin===`${S.vscodeFileResource}://${b.FALLBACK_AUTHORITY}`)?n.with({scheme:S.vscodeFileResource,authority:n.authority||b.FALLBACK_AUTHORITY,query:null,fragment:null}):n}}b.FALLBACK_AUTHORITY=e.VSCODE_AUTHORITY,e.FileAccess=new b;var a;(function(i){const n=new Map([["1",{"Cross-Origin-Opener-Policy":"same-origin"}],["2",{"Cross-Origin-Embedder-Policy":"require-corp"}],["3",{"Cross-Origin-Opener-Policy":"same-origin","Cross-Origin-Embedder-Policy":"require-corp"}]]);i.CoopAndCoep=Object.freeze(n.get("3"));const t="vscode-coi";function r(f){let c;typeof f=="string"?c=new URL(f).searchParams:f instanceof URL?c=f.searchParams:E.URI.isUri(f)&&(c=new URL(f.toString(!0)).searchParams);const d=c?.get(t);if(d)return n.get(d)}i.getHeadersFromQuery=r;function u(f,c,d){if(!globalThis.crossOriginIsolated)return;const s=c&&d?"3":d?"2":"1";f instanceof URLSearchParams?f.set(t,s):f[t]=s}i.addSearchParam=u})(a||(e.COI=a={}))}),define(se[7],oe([1,0,54,219,46,67,14,12,6,316,2,47,17,111,44]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t){"use strict";var r;Object.defineProperty(e,"__esModule",{value:!0}),e.h=e.DragAndDropObserver=e.ModifierKeyEmitter=e.basicMarkupHtmlTags=e.hookDomPurifyHrefAndSrcSanitizer=e.asCssValueWithDefault=e.asCSSPropertyValue=e.asCSSUrl=e.animate=e.windowOpenNoOpener=e.computeScreenAwareSize=e.hide=e.show=e.setVisibility=e.$=e.Namespace=e.reset=e.prepend=e.append=e.after=e.trackFocus=e.restoreParentsScrollTop=e.saveParentsScrollTop=e.EventHelper=e.isEventLike=e.EventType=e.isKeyboardEvent=e.isMouseEvent=e.removeCSSRulesContainingSelector=e.createCSSRule=e.sharedMutationObserver=e.createStyleSheet=e.createStyleSheet2=e.getActiveWindow=e.getActiveDocument=e.isAncestorOfActiveElement=e.isActiveElement=e.getActiveElement=e.getShadowRoot=e.isInShadowDOM=e.isShadowRoot=e.hasParentWithClass=e.findParentWithClass=e.isAncestor=e.getTotalHeight=e.getContentHeight=e.getContentWidth=e.getTotalWidth=e.getDomNodeZoomLevel=e.getDomNodePagePosition=e.size=e.getTopLeftOffset=e.Dimension=e.getClientArea=e.getComputedStyle=e.WindowIntervalTimer=e.scheduleAtNextAnimationFrame=e.runAtThisOrScheduleAtNextAnimationFrame=e.WindowIdleValue=e.runWhenWindowIdle=e.addDisposableGenericMouseUpListener=e.addDisposableGenericMouseDownListener=e.addStandardDisposableGenericMouseUpListener=e.addStandardDisposableGenericMouseDownListener=e.addStandardDisposableListener=e.addDisposableListener=e.clearNode=e.onDidUnregisterWindow=e.onWillUnregisterWindow=e.onDidRegisterWindow=e.hasWindow=e.getWindowById=e.getWindowId=e.getWindowsCount=e.getWindows=e.getDocument=e.getWindow=e.registerWindow=void 0,r=function(){const Le=new Map;(0,t.ensureCodeWindow)(t.mainWindow,1),Le.set(t.mainWindow.vscodeWindowId,{window:t.mainWindow,disposables:new b.DisposableStore});const ye=new _.Emitter,Me=new _.Emitter,Te=new _.Emitter;return{onDidRegisterWindow:ye.event,onWillUnregisterWindow:Te.event,onDidUnregisterWindow:Me.event,registerWindow(we){if(Le.has(we.vscodeWindowId))return b.Disposable.None;const Re=new b.DisposableStore,Oe={window:we,disposables:Re.add(new b.DisposableStore)};return Le.set(we.vscodeWindowId,Oe),Re.add((0,b.toDisposable)(()=>{Le.delete(we.vscodeWindowId),Me.fire(we)})),Re.add(c(we,e.EventType.BEFORE_UNLOAD,()=>{Te.fire(we)})),ye.fire(Oe),Re},getWindows(){return Le.values()},getWindowsCount(){return Le.size},getWindowId(we){return we.vscodeWindowId},hasWindow(we){return Le.has(we)},getWindowById(we){return Le.get(we)},getWindow(we){var Re;const Oe=we;if(!((Re=Oe?.ownerDocument)===null||Re===void 0)&&Re.defaultView)return Oe.ownerDocument.defaultView.window;const Ve=we;return Ve?.view?Ve.view.window:t.mainWindow},getDocument(we){const Re=we;return(0,e.getWindow)(Re).document}}}(),e.registerWindow=r.registerWindow,e.getWindow=r.getWindow,e.getDocument=r.getDocument,e.getWindows=r.getWindows,e.getWindowsCount=r.getWindowsCount,e.getWindowId=r.getWindowId,e.getWindowById=r.getWindowById,e.hasWindow=r.hasWindow,e.onDidRegisterWindow=r.onDidRegisterWindow,e.onWillUnregisterWindow=r.onWillUnregisterWindow,e.onDidUnregisterWindow=r.onDidUnregisterWindow;function u(Le){for(;Le.firstChild;)Le.firstChild.remove()}e.clearNode=u;class f{constructor(ye,Me,Te,we){this._node=ye,this._type=Me,this._handler=Te,this._options=we||!1,this._node.addEventListener(this._type,this._handler,this._options)}dispose(){this._handler&&(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}}function c(Le,ye,Me,Te){return new f(Le,ye,Me,Te)}e.addDisposableListener=c;function d(Le,ye){return function(Me){return ye(new E.StandardMouseEvent(Le,Me))}}function s(Le){return function(ye){return Le(new y.StandardKeyboardEvent(ye))}}const l=function(ye,Me,Te,we){let Re=Te;return Me==="click"||Me==="mousedown"?Re=d((0,e.getWindow)(ye),Te):(Me==="keydown"||Me==="keypress"||Me==="keyup")&&(Re=s(Te)),c(ye,Me,Re,we)};e.addStandardDisposableListener=l;const o=function(ye,Me,Te){const we=d((0,e.getWindow)(ye),Me);return h(ye,we,Te)};e.addStandardDisposableGenericMouseDownListener=o;const g=function(ye,Me,Te){const we=d((0,e.getWindow)(ye),Me);return m(ye,we,Te)};e.addStandardDisposableGenericMouseUpListener=g;function h(Le,ye,Me){return c(Le,i.isIOS&&k.BrowserFeatures.pointerEvents?e.EventType.POINTER_DOWN:e.EventType.MOUSE_DOWN,ye,Me)}e.addDisposableGenericMouseDownListener=h;function m(Le,ye,Me){return c(Le,i.isIOS&&k.BrowserFeatures.pointerEvents?e.EventType.POINTER_UP:e.EventType.MOUSE_UP,ye,Me)}e.addDisposableGenericMouseUpListener=m;function C(Le,ye,Me){return(0,S._runWhenIdle)(Le,ye,Me)}e.runWhenWindowIdle=C;class w extends S.AbstractIdleValue{constructor(ye,Me){super(ye,Me)}}e.WindowIdleValue=w;class D extends S.IntervalTimer{constructor(ye){super(),this.defaultTarget=ye&&(0,e.getWindow)(ye)}cancelAndSet(ye,Me,Te){return super.cancelAndSet(ye,Me,Te??this.defaultTarget)}}e.WindowIntervalTimer=D;class I{constructor(ye,Me=0){this._runner=ye,this.priority=Me,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(ye){(0,p.onUnexpectedError)(ye)}}static sort(ye,Me){return Me.priority-ye.priority}}(function(){const Le=new Map,ye=new Map,Me=new Map,Te=new Map,we=Re=>{var Oe;Me.set(Re,!1);const Ve=(Oe=Le.get(Re))!==null&&Oe!==void 0?Oe:[];for(ye.set(Re,Ve),Le.set(Re,[]),Te.set(Re,!0);Ve.length>0;)Ve.sort(I.sort),Ve.shift().execute();Te.set(Re,!1)};e.scheduleAtNextAnimationFrame=(Re,Oe,Ve=0)=>{const $e=(0,e.getWindowId)(Re),Ze=new I(Oe,Ve);let Ge=Le.get($e);return Ge||(Ge=[],Le.set($e,Ge)),Ge.push(Ze),Me.get($e)||(Me.set($e,!0),Re.requestAnimationFrame(()=>we($e))),Ze},e.runAtThisOrScheduleAtNextAnimationFrame=(Re,Oe,Ve)=>{const $e=(0,e.getWindowId)(Re);if(Te.get($e)){const Ze=new I(Oe,Ve);let Ge=ye.get($e);return Ge||(Ge=[],ye.set($e,Ge)),Ge.push(Ze),Ze}else return(0,e.scheduleAtNextAnimationFrame)(Re,Oe,Ve)}})();function T(Le){return(0,e.getWindow)(Le).getComputedStyle(Le,null)}e.getComputedStyle=T;function A(Le,ye){const Me=(0,e.getWindow)(Le),Te=Me.document;if(Le!==Te.body)return new N(Le.clientWidth,Le.clientHeight);if(i.isIOS&&Me?.visualViewport)return new N(Me.visualViewport.width,Me.visualViewport.height);if(Me?.innerWidth&&Me.innerHeight)return new N(Me.innerWidth,Me.innerHeight);if(Te.body&&Te.body.clientWidth&&Te.body.clientHeight)return new N(Te.body.clientWidth,Te.body.clientHeight);if(Te.documentElement&&Te.documentElement.clientWidth&&Te.documentElement.clientHeight)return new N(Te.documentElement.clientWidth,Te.documentElement.clientHeight);if(ye)return A(ye);throw new Error("Unable to figure out browser width and height")}e.getClientArea=A;class P{static convertToPixels(ye,Me){return parseFloat(Me)||0}static getDimension(ye,Me,Te){const we=T(ye),Re=we?we.getPropertyValue(Me):"0";return P.convertToPixels(ye,Re)}static getBorderLeftWidth(ye){return P.getDimension(ye,"border-left-width","borderLeftWidth")}static getBorderRightWidth(ye){return P.getDimension(ye,"border-right-width","borderRightWidth")}static getBorderTopWidth(ye){return P.getDimension(ye,"border-top-width","borderTopWidth")}static getBorderBottomWidth(ye){return P.getDimension(ye,"border-bottom-width","borderBottomWidth")}static getPaddingLeft(ye){return P.getDimension(ye,"padding-left","paddingLeft")}static getPaddingRight(ye){return P.getDimension(ye,"padding-right","paddingRight")}static getPaddingTop(ye){return P.getDimension(ye,"padding-top","paddingTop")}static getPaddingBottom(ye){return P.getDimension(ye,"padding-bottom","paddingBottom")}static getMarginLeft(ye){return P.getDimension(ye,"margin-left","marginLeft")}static getMarginTop(ye){return P.getDimension(ye,"margin-top","marginTop")}static getMarginRight(ye){return P.getDimension(ye,"margin-right","marginRight")}static getMarginBottom(ye){return P.getDimension(ye,"margin-bottom","marginBottom")}}class N{constructor(ye,Me){this.width=ye,this.height=Me}with(ye=this.width,Me=this.height){return ye!==this.width||Me!==this.height?new N(ye,Me):this}static is(ye){return typeof ye=="object"&&typeof ye.height=="number"&&typeof ye.width=="number"}static lift(ye){return ye instanceof N?ye:new N(ye.width,ye.height)}static equals(ye,Me){return ye===Me?!0:!ye||!Me?!1:ye.width===Me.width&&ye.height===Me.height}}e.Dimension=N,N.None=new N(0,0);function M(Le){let ye=Le.offsetParent,Me=Le.offsetTop,Te=Le.offsetLeft;for(;(Le=Le.parentNode)!==null&&Le!==Le.ownerDocument.body&&Le!==Le.ownerDocument.documentElement;){Me-=Le.scrollTop;const we=ae(Le)?null:T(Le);we&&(Te-=we.direction!=="rtl"?Le.scrollLeft:-Le.scrollLeft),Le===ye&&(Te+=P.getBorderLeftWidth(Le),Me+=P.getBorderTopWidth(Le),Me+=Le.offsetTop,Te+=Le.offsetLeft,ye=Le.offsetParent)}return{left:Te,top:Me}}e.getTopLeftOffset=M;function R(Le,ye,Me){typeof ye=="number"&&(Le.style.width=`${ye}px`),typeof Me=="number"&&(Le.style.height=`${Me}px`)}e.size=R;function x(Le){const ye=Le.getBoundingClientRect(),Me=(0,e.getWindow)(Le);return{left:ye.left+Me.scrollX,top:ye.top+Me.scrollY,width:ye.width,height:ye.height}}e.getDomNodePagePosition=x;function O(Le){let ye=Le,Me=1;do{const Te=T(ye).zoom;Te!=null&&Te!=="1"&&(Me*=Te),ye=ye.parentElement}while(ye!==null&&ye!==ye.ownerDocument.documentElement);return Me}e.getDomNodeZoomLevel=O;function B(Le){const ye=P.getMarginLeft(Le)+P.getMarginRight(Le);return Le.offsetWidth+ye}e.getTotalWidth=B;function W(Le){const ye=P.getBorderLeftWidth(Le)+P.getBorderRightWidth(Le),Me=P.getPaddingLeft(Le)+P.getPaddingRight(Le);return Le.offsetWidth-ye-Me}e.getContentWidth=W;function V(Le){const ye=P.getBorderTopWidth(Le)+P.getBorderBottomWidth(Le),Me=P.getPaddingTop(Le)+P.getPaddingBottom(Le);return Le.offsetHeight-ye-Me}e.getContentHeight=V;function K(Le){const ye=P.getMarginTop(Le)+P.getMarginBottom(Le);return Le.offsetHeight+ye}e.getTotalHeight=K;function F(Le,ye){return!!ye?.contains(Le)}e.isAncestor=F;function q(Le,ye,Me){for(;Le&&Le.nodeType===Le.ELEMENT_NODE;){if(Le.classList.contains(ye))return Le;if(Me){if(typeof Me=="string"){if(Le.classList.contains(Me))return null}else if(Le===Me)return null}Le=Le.parentNode}return null}e.findParentWithClass=q;function ie(Le,ye,Me){return!!q(Le,ye,Me)}e.hasParentWithClass=ie;function ae(Le){return Le&&!!Le.host&&!!Le.mode}e.isShadowRoot=ae;function ne(Le){return!!$(Le)}e.isInShadowDOM=ne;function $(Le){for(var ye;Le.parentNode;){if(Le===((ye=Le.ownerDocument)===null||ye===void 0?void 0:ye.body))return null;Le=Le.parentNode}return ae(Le)?Le:null}e.getShadowRoot=$;function J(){let Le=de().activeElement;for(;Le?.shadowRoot;)Le=Le.shadowRoot.activeElement;return Le}e.getActiveElement=J;function Q(Le){return J()===Le}e.isActiveElement=Q;function re(Le){return F(J(),Le)}e.isAncestorOfActiveElement=re;function de(){var Le;return(0,e.getWindowsCount)()<=1?t.mainWindow.document:(Le=Array.from((0,e.getWindows)()).map(({window:Me})=>Me.document).find(Me=>Me.hasFocus()))!==null&&Le!==void 0?Le:t.mainWindow.document}e.getActiveDocument=de;function he(){var Le,ye;return(ye=(Le=de().defaultView)===null||Le===void 0?void 0:Le.window)!==null&&ye!==void 0?ye:t.mainWindow}e.getActiveWindow=he;const me=new Map;function X(){return new U}e.createStyleSheet2=X;class U{constructor(){this._currentCssStyle="",this._styleSheet=void 0}setStyle(ye){ye!==this._currentCssStyle&&(this._currentCssStyle=ye,this._styleSheet?this._styleSheet.innerText=ye:this._styleSheet=G(t.mainWindow.document.head,Me=>Me.innerText=ye))}dispose(){this._styleSheet&&(u(this._styleSheet),this._styleSheet=void 0)}}function G(Le=t.mainWindow.document.head,ye,Me){const Te=document.createElement("style");if(Te.type="text/css",Te.media="screen",ye?.(Te),Le.appendChild(Te),Me&&Me.add((0,b.toDisposable)(()=>Le.removeChild(Te))),Le===t.mainWindow.document.head){const we=new Set;me.set(Te,we);for(const{window:Re,disposables:Oe}of(0,e.getWindows)()){if(Re===t.mainWindow)continue;const Ve=Oe.add(z(Te,we,Re));Me?.add(Ve)}}return Te}e.createStyleSheet=G;function z(Le,ye,Me){var Te,we;const Re=new b.DisposableStore,Oe=Le.cloneNode(!0);Me.document.head.appendChild(Oe),Re.add((0,b.toDisposable)(()=>Me.document.head.removeChild(Oe)));for(const Ve of j(Le))(Te=Oe.sheet)===null||Te===void 0||Te.insertRule(Ve.cssText,(we=Oe.sheet)===null||we===void 0?void 0:we.cssRules.length);return Re.add(e.sharedMutationObserver.observe(Le,Re,{childList:!0})(()=>{Oe.textContent=Le.textContent})),ye.add(Oe),Re.add((0,b.toDisposable)(()=>ye.delete(Oe))),Re}e.sharedMutationObserver=new class{constructor(){this.mutationObservers=new Map}observe(Le,ye,Me){let Te=this.mutationObservers.get(Le);Te||(Te=new Map,this.mutationObservers.set(Le,Te));const we=(0,n.hash)(Me);let Re=Te.get(we);if(Re)Re.users+=1;else{const Oe=new _.Emitter,Ve=new MutationObserver(Ze=>Oe.fire(Ze));Ve.observe(Le,Me);const $e=Re={users:1,observer:Ve,onDidMutate:Oe.event};ye.add((0,b.toDisposable)(()=>{$e.users-=1,$e.users===0&&(Oe.dispose(),Ve.disconnect(),Te?.delete(we),Te?.size===0&&this.mutationObservers.delete(Le))})),Te.set(we,Re)}return Re.onDidMutate}};let H=null;function Y(){return H||(H=G()),H}function j(Le){var ye,Me;return!((ye=Le?.sheet)===null||ye===void 0)&&ye.rules?Le.sheet.rules:!((Me=Le?.sheet)===null||Me===void 0)&&Me.cssRules?Le.sheet.cssRules:[]}function Z(Le,ye,Me=Y()){var Te,we;if(!(!Me||!ye)){(Te=Me.sheet)===null||Te===void 0||Te.insertRule(`${Le} {${ye}}`,0);for(const Re of(we=me.get(Me))!==null&&we!==void 0?we:[])Z(Le,ye,Re)}}e.createCSSRule=Z;function ee(Le,ye=Y()){var Me,Te;if(!ye)return;const we=j(ye),Re=[];for(let Oe=0;Oe<we.length;Oe++){const Ve=we[Oe];le(Ve)&&Ve.selectorText.indexOf(Le)!==-1&&Re.push(Oe)}for(let Oe=Re.length-1;Oe>=0;Oe--)(Me=ye.sheet)===null||Me===void 0||Me.deleteRule(Re[Oe]);for(const Oe of(Te=me.get(ye))!==null&&Te!==void 0?Te:[])ee(Le,Oe)}e.removeCSSRulesContainingSelector=ee;function le(Le){return typeof Le.selectorText=="string"}function ue(Le){return Le instanceof MouseEvent||Le instanceof(0,e.getWindow)(Le).MouseEvent}e.isMouseEvent=ue;function ce(Le){return Le instanceof KeyboardEvent||Le instanceof(0,e.getWindow)(Le).KeyboardEvent}e.isKeyboardEvent=ce,e.EventType={CLICK:"click",AUXCLICK:"auxclick",DBLCLICK:"dblclick",MOUSE_UP:"mouseup",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_MOVE:"mousemove",MOUSE_OUT:"mouseout",MOUSE_ENTER:"mouseenter",MOUSE_LEAVE:"mouseleave",MOUSE_WHEEL:"wheel",POINTER_UP:"pointerup",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",POINTER_LEAVE:"pointerleave",CONTEXT_MENU:"contextmenu",WHEEL:"wheel",KEY_DOWN:"keydown",KEY_PRESS:"keypress",KEY_UP:"keyup",LOAD:"load",BEFORE_UNLOAD:"beforeunload",UNLOAD:"unload",PAGE_SHOW:"pageshow",PAGE_HIDE:"pagehide",PASTE:"paste",ABORT:"abort",ERROR:"error",RESIZE:"resize",SCROLL:"scroll",FULLSCREEN_CHANGE:"fullscreenchange",WK_FULLSCREEN_CHANGE:"webkitfullscreenchange",SELECT:"select",CHANGE:"change",SUBMIT:"submit",RESET:"reset",FOCUS:"focus",FOCUS_IN:"focusin",FOCUS_OUT:"focusout",BLUR:"blur",INPUT:"input",STORAGE:"storage",DRAG_START:"dragstart",DRAG:"drag",DRAG_ENTER:"dragenter",DRAG_LEAVE:"dragleave",DRAG_OVER:"dragover",DROP:"drop",DRAG_END:"dragend",ANIMATION_START:L.isWebKit?"webkitAnimationStart":"animationstart",ANIMATION_END:L.isWebKit?"webkitAnimationEnd":"animationend",ANIMATION_ITERATION:L.isWebKit?"webkitAnimationIteration":"animationiteration"};function pe(Le){const ye=Le;return!!(ye&&typeof ye.preventDefault=="function"&&typeof ye.stopPropagation=="function")}e.isEventLike=pe,e.EventHelper={stop:(Le,ye)=>(Le.preventDefault(),ye&&Le.stopPropagation(),Le)};function ve(Le){const ye=[];for(let Me=0;Le&&Le.nodeType===Le.ELEMENT_NODE;Me++)ye[Me]=Le.scrollTop,Le=Le.parentNode;return ye}e.saveParentsScrollTop=ve;function Ce(Le,ye){for(let Me=0;Le&&Le.nodeType===Le.ELEMENT_NODE;Me++)Le.scrollTop!==ye[Me]&&(Le.scrollTop=ye[Me]),Le=Le.parentNode}e.restoreParentsScrollTop=Ce;class Se extends b.Disposable{static hasFocusWithin(ye){if(ye instanceof HTMLElement){const Me=$(ye),Te=Me?Me.activeElement:ye.ownerDocument.activeElement;return F(Te,ye)}else{const Me=ye;return F(Me.document.activeElement,Me.document)}}constructor(ye){super(),this._onDidFocus=this._register(new _.Emitter),this.onDidFocus=this._onDidFocus.event,this._onDidBlur=this._register(new _.Emitter),this.onDidBlur=this._onDidBlur.event;let Me=Se.hasFocusWithin(ye),Te=!1;const we=()=>{Te=!1,Me||(Me=!0,this._onDidFocus.fire())},Re=()=>{Me&&(Te=!0,(ye instanceof HTMLElement?(0,e.getWindow)(ye):ye).setTimeout(()=>{Te&&(Te=!1,Me=!1,this._onDidBlur.fire())},0))};this._refreshStateHandler=()=>{Se.hasFocusWithin(ye)!==Me&&(Me?Re():we())},this._register(c(ye,e.EventType.FOCUS,we,!0)),this._register(c(ye,e.EventType.BLUR,Re,!0)),ye instanceof HTMLElement&&(this._register(c(ye,e.EventType.FOCUS_IN,()=>this._refreshStateHandler())),this._register(c(ye,e.EventType.FOCUS_OUT,()=>this._refreshStateHandler())))}}function _e(Le){return new Se(Le)}e.trackFocus=_e;function Ee(Le,ye){return Le.after(ye),ye}e.after=Ee;function Ae(Le,...ye){if(Le.append(...ye),ye.length===1&&typeof ye[0]!="string")return ye[0]}e.append=Ae;function xe(Le,ye){return Le.insertBefore(ye,Le.firstChild),ye}e.prepend=xe;function Be(Le,...ye){Le.innerText="",Ae(Le,...ye)}e.reset=Be;const De=/([\w\-]+)?(#([\w\-]+))?((\.([\w\-]+))*)/;var Ie;(function(Le){Le.HTML="http://www.w3.org/1999/xhtml",Le.SVG="http://www.w3.org/2000/svg"})(Ie||(e.Namespace=Ie={}));function fe(Le,ye,Me,...Te){const we=De.exec(ye);if(!we)throw new Error("Bad use of emmet");const Re=we[1]||"div";let Oe;return Le!==Ie.HTML?Oe=document.createElementNS(Le,Re):Oe=document.createElement(Re),we[3]&&(Oe.id=we[3]),we[4]&&(Oe.className=we[4].replace(/\./g," ").trim()),Me&&Object.entries(Me).forEach(([Ve,$e])=>{typeof $e>"u"||(/^on\w+$/.test(Ve)?Oe[Ve]=$e:Ve==="selected"?$e&&Oe.setAttribute(Ve,"true"):Oe.setAttribute(Ve,$e))}),Oe.append(...Te),Oe}function be(Le,ye,...Me){return fe(Ie.HTML,Le,ye,...Me)}e.$=be,be.SVG=function(Le,ye,...Me){return fe(Ie.SVG,Le,ye,...Me)};function Ne(Le,...ye){Le?Pe(...ye):ze(...ye)}e.setVisibility=Ne;function Pe(...Le){for(const ye of Le)ye.style.display="",ye.removeAttribute("aria-hidden")}e.show=Pe;function ze(...Le){for(const ye of Le)ye.style.display="none",ye.setAttribute("aria-hidden","true")}e.hide=ze;function Ke(Le,ye){const Me=Le.devicePixelRatio*ye;return Math.max(1,Math.floor(Me))/Le.devicePixelRatio}e.computeScreenAwareSize=Ke;function je(Le){t.mainWindow.open(Le,"_blank","noopener")}e.windowOpenNoOpener=je;function Je(Le,ye){const Me=()=>{ye(),Te=(0,e.scheduleAtNextAnimationFrame)(Le,Me)};let Te=(0,e.scheduleAtNextAnimationFrame)(Le,Me);return(0,b.toDisposable)(()=>Te.dispose())}e.animate=Je,a.RemoteAuthorities.setPreferredWebSchema(/^https:/.test(t.mainWindow.location.href)?"https":"http");function rt(Le){return Le?`url('${a.FileAccess.uriToBrowserUri(Le).toString(!0).replace(/'/g,"%27")}')`:"url('')"}e.asCSSUrl=rt;function et(Le){return`'${Le.replace(/'/g,"%27")}'`}e.asCSSPropertyValue=et;function st(Le,ye){if(Le!==void 0){const Me=Le.match(/^\s*var\((.+)\)$/);if(Me){const Te=Me[1].split(",",2);return Te.length===2&&(ye=st(Te[1].trim(),ye)),`var(${Te[0]}, ${ye})`}return Le}return ye}e.asCssValueWithDefault=st;function Qe(Le,ye=!1){const Me=document.createElement("a");return v.addHook("afterSanitizeAttributes",Te=>{for(const we of["href","src"])if(Te.hasAttribute(we)){const Re=Te.getAttribute(we);if(we==="href"&&Re.startsWith("#"))continue;if(Me.href=Re,!Le.includes(Me.protocol.replace(/:$/,""))){if(ye&&we==="src"&&Me.href.startsWith("data:"))continue;Te.removeAttribute(we)}}}),(0,b.toDisposable)(()=>{v.removeHook("afterSanitizeAttributes")})}e.hookDomPurifyHrefAndSrcSanitizer=Qe,e.basicMarkupHtmlTags=Object.freeze(["a","abbr","b","bdo","blockquote","br","caption","cite","code","col","colgroup","dd","del","details","dfn","div","dl","dt","em","figcaption","figure","h1","h2","h3","h4","h5","h6","hr","i","img","input","ins","kbd","label","li","mark","ol","p","pre","q","rp","rt","ruby","samp","small","small","source","span","strike","strong","sub","summary","sup","table","tbody","td","tfoot","th","thead","time","tr","tt","u","ul","var","video","wbr"]);const ft=Object.freeze({ALLOWED_TAGS:["a","button","blockquote","code","div","h1","h2","h3","h4","h5","h6","hr","input","label","li","p","pre","select","small","span","strong","textarea","ul","ol"],ALLOWED_ATTR:["href","data-href","data-command","target","title","name","src","alt","class","id","role","tabindex","style","data-code","width","height","align","x-dispatch","required","checked","placeholder","type","start"],RETURN_DOM:!1,RETURN_DOM_FRAGMENT:!1,RETURN_TRUSTED_TYPE:!0});class at extends _.Emitter{constructor(){super(),this._subscriptions=new b.DisposableStore,this._keyStatus={altKey:!1,shiftKey:!1,ctrlKey:!1,metaKey:!1},this._subscriptions.add(_.Event.runAndSubscribe(e.onDidRegisterWindow,({window:ye,disposables:Me})=>this.registerListeners(ye,Me),{window:t.mainWindow,disposables:this._subscriptions}))}registerListeners(ye,Me){Me.add(c(ye,"keydown",Te=>{if(Te.defaultPrevented)return;const we=new y.StandardKeyboardEvent(Te);if(!(we.keyCode===6&&Te.repeat)){if(Te.altKey&&!this._keyStatus.altKey)this._keyStatus.lastKeyPressed="alt";else if(Te.ctrlKey&&!this._keyStatus.ctrlKey)this._keyStatus.lastKeyPressed="ctrl";else if(Te.metaKey&&!this._keyStatus.metaKey)this._keyStatus.lastKeyPressed="meta";else if(Te.shiftKey&&!this._keyStatus.shiftKey)this._keyStatus.lastKeyPressed="shift";else if(we.keyCode!==6)this._keyStatus.lastKeyPressed=void 0;else return;this._keyStatus.altKey=Te.altKey,this._keyStatus.ctrlKey=Te.ctrlKey,this._keyStatus.metaKey=Te.metaKey,this._keyStatus.shiftKey=Te.shiftKey,this._keyStatus.lastKeyPressed&&(this._keyStatus.event=Te,this.fire(this._keyStatus))}},!0)),Me.add(c(ye,"keyup",Te=>{Te.defaultPrevented||(!Te.altKey&&this._keyStatus.altKey?this._keyStatus.lastKeyReleased="alt":!Te.ctrlKey&&this._keyStatus.ctrlKey?this._keyStatus.lastKeyReleased="ctrl":!Te.metaKey&&this._keyStatus.metaKey?this._keyStatus.lastKeyReleased="meta":!Te.shiftKey&&this._keyStatus.shiftKey?this._keyStatus.lastKeyReleased="shift":this._keyStatus.lastKeyReleased=void 0,this._keyStatus.lastKeyPressed!==this._keyStatus.lastKeyReleased&&(this._keyStatus.lastKeyPressed=void 0),this._keyStatus.altKey=Te.altKey,this._keyStatus.ctrlKey=Te.ctrlKey,this._keyStatus.metaKey=Te.metaKey,this._keyStatus.shiftKey=Te.shiftKey,this._keyStatus.lastKeyReleased&&(this._keyStatus.event=Te,this.fire(this._keyStatus)))},!0)),Me.add(c(ye.document.body,"mousedown",()=>{this._keyStatus.lastKeyPressed=void 0},!0)),Me.add(c(ye.document.body,"mouseup",()=>{this._keyStatus.lastKeyPressed=void 0},!0)),Me.add(c(ye.document.body,"mousemove",Te=>{Te.buttons&&(this._keyStatus.lastKeyPressed=void 0)},!0)),Me.add(c(ye,"blur",()=>{this.resetKeyStatus()}))}get keyStatus(){return this._keyStatus}resetKeyStatus(){this.doResetKeyStatus(),this.fire(this._keyStatus)}doResetKeyStatus(){this._keyStatus={altKey:!1,shiftKey:!1,ctrlKey:!1,metaKey:!1}}static getInstance(){return at.instance||(at.instance=new at),at.instance}dispose(){super.dispose(),this._subscriptions.dispose()}}e.ModifierKeyEmitter=at;class ct extends b.Disposable{constructor(ye,Me){super(),this.element=ye,this.callbacks=Me,this.counter=0,this.dragStartTime=0,this.registerListeners()}registerListeners(){this.callbacks.onDragStart&&this._register(c(this.element,e.EventType.DRAG_START,ye=>{var Me,Te;(Te=(Me=this.callbacks).onDragStart)===null||Te===void 0||Te.call(Me,ye)})),this.callbacks.onDrag&&this._register(c(this.element,e.EventType.DRAG,ye=>{var Me,Te;(Te=(Me=this.callbacks).onDrag)===null||Te===void 0||Te.call(Me,ye)})),this._register(c(this.element,e.EventType.DRAG_ENTER,ye=>{var Me,Te;this.counter++,this.dragStartTime=ye.timeStamp,(Te=(Me=this.callbacks).onDragEnter)===null||Te===void 0||Te.call(Me,ye)})),this._register(c(this.element,e.EventType.DRAG_OVER,ye=>{var Me,Te;ye.preventDefault(),(Te=(Me=this.callbacks).onDragOver)===null||Te===void 0||Te.call(Me,ye,ye.timeStamp-this.dragStartTime)})),this._register(c(this.element,e.EventType.DRAG_LEAVE,ye=>{var Me,Te;this.counter--,this.counter===0&&(this.dragStartTime=0,(Te=(Me=this.callbacks).onDragLeave)===null||Te===void 0||Te.call(Me,ye))})),this._register(c(this.element,e.EventType.DRAG_END,ye=>{var Me,Te;this.counter=0,this.dragStartTime=0,(Te=(Me=this.callbacks).onDragEnd)===null||Te===void 0||Te.call(Me,ye)})),this._register(c(this.element,e.EventType.DROP,ye=>{var Me,Te;this.counter=0,this.dragStartTime=0,(Te=(Me=this.callbacks).onDrop)===null||Te===void 0||Te.call(Me,ye)}))}}e.DragAndDropObserver=ct;const lt=/(?<tag>[\w\-]+)?(?:#(?<id>[\w\-]+))?(?<class>(?:\.(?:[\w\-]+))*)(?:@(?<name>(?:[\w\_])+))?/;function mt(Le,...ye){let Me,Te;Array.isArray(ye[0])?(Me={},Te=ye[0]):(Me=ye[0]||{},Te=ye[1]);const we=lt.exec(Le);if(!we||!we.groups)throw new Error("Bad use of h");const Re=we.groups.tag||"div",Oe=document.createElement(Re);we.groups.id&&(Oe.id=we.groups.id);const Ve=[];if(we.groups.class)for(const Ze of we.groups.class.split("."))Ze!==""&&Ve.push(Ze);if(Me.className!==void 0)for(const Ze of Me.className.split("."))Ze!==""&&Ve.push(Ze);Ve.length>0&&(Oe.className=Ve.join(" "));const $e={};if(we.groups.name&&($e[we.groups.name]=Oe),Te)for(const Ze of Te)Ze instanceof HTMLElement?Oe.appendChild(Ze):typeof Ze=="string"?Oe.append(Ze):"root"in Ze&&(Object.assign($e,Ze),Oe.appendChild(Ze.root));for(const[Ze,Ge]of Object.entries(Me))if(Ze!=="className")if(Ze==="style")for(const[qe,Fe]of Object.entries(Ge))Oe.style.setProperty(pt(qe),typeof Fe=="number"?Fe+"px":""+Fe);else Ze==="tabIndex"?Oe.tabIndex=Ge:Oe.setAttribute(pt(Ze),Ge.toString());return $e.root=Oe,$e}e.h=mt;function pt(Le){return Le.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}}),define(se[317],oe([1,0,7]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createElement=e.renderFormattedText=e.renderText=void 0;function k(a,i={}){const n=E(i);return n.textContent=a,n}e.renderText=k;function y(a,i={}){const n=E(i);return p(n,_(a,!!i.renderCodeSegments),i.actionHandler,i.renderCodeSegments),n}e.renderFormattedText=y;function E(a){const i=a.inline?"span":"div",n=document.createElement(i);return a.className&&(n.className=a.className),n}e.createElement=E;class S{constructor(i){this.source=i,this.index=0}eos(){return this.index>=this.source.length}next(){const i=this.peek();return this.advance(),i}peek(){return this.source[this.index]}advance(){this.index++}}function p(a,i,n,t){let r;if(i.type===2)r=document.createTextNode(i.content||"");else if(i.type===3)r=document.createElement("b");else if(i.type===4)r=document.createElement("i");else if(i.type===7&&t)r=document.createElement("code");else if(i.type===5&&n){const u=document.createElement("a");n.disposables.add(L.addStandardDisposableListener(u,"click",f=>{n.callback(String(i.index),f)})),r=u}else i.type===8?r=document.createElement("br"):i.type===1&&(r=a);r&&a!==r&&a.appendChild(r),r&&Array.isArray(i.children)&&i.children.forEach(u=>{p(r,u,n,t)})}function _(a,i){const n={type:1,children:[]};let t=0,r=n;const u=[],f=new S(a);for(;!f.eos();){let c=f.next();const d=c==="\\"&&b(f.peek(),i)!==0;if(d&&(c=f.next()),!d&&v(c,i)&&c===f.peek()){f.advance(),r.type===2&&(r=u.pop());const s=b(c,i);if(r.type===s||r.type===5&&s===6)r=u.pop();else{const l={type:s,children:[]};s===5&&(l.index=t,t++),r.children.push(l),u.push(r),r=l}}else if(c===`
+`)r.type===2&&(r=u.pop()),r.children.push({type:8});else if(r.type!==2){const s={type:2,content:c};r.children.push(s),u.push(r),r=s}else r.content+=c}return r.type===2&&(r=u.pop()),u.length,n}function v(a,i){return b(a,i)!==0}function b(a,i){switch(a){case"*":return 3;case"_":return 4;case"[":return 5;case"]":return 6;case"`":return i?7:0;default:return 0}}}),define(se[157],oe([1,0,7,2]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlobalPointerMoveMonitor=void 0;class y{constructor(){this._hooks=new k.DisposableStore,this._pointerMoveCallback=null,this._onStopCallback=null}dispose(){this.stopMonitoring(!1),this._hooks.dispose()}stopMonitoring(S,p){if(!this.isMonitoring())return;this._hooks.clear(),this._pointerMoveCallback=null;const _=this._onStopCallback;this._onStopCallback=null,S&&_&&_(p)}isMonitoring(){return!!this._pointerMoveCallback}startMonitoring(S,p,_,v,b){this.isMonitoring()&&this.stopMonitoring(!1),this._pointerMoveCallback=v,this._onStopCallback=b;let a=S;try{S.setPointerCapture(p),this._hooks.add((0,k.toDisposable)(()=>{try{S.releasePointerCapture(p)}catch{}}))}catch{a=L.getWindow(S)}this._hooks.add(L.addDisposableListener(a,L.EventType.POINTER_MOVE,i=>{if(i.buttons!==_){this.stopMonitoring(!0);return}i.preventDefault(),this._pointerMoveCallback(i)})),this._hooks.add(L.addDisposableListener(a,L.EventType.POINTER_UP,i=>this.stopMonitoring(!0)))}}e.GlobalPointerMoveMonitor=y}),define(se[63],oe([1,0,7,44,13,107,6,2,66]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Gesture=e.EventType=void 0;var v;(function(a){a.Tap="-monaco-gesturetap",a.Change="-monaco-gesturechange",a.Start="-monaco-gesturestart",a.End="-monaco-gesturesend",a.Contextmenu="-monaco-gesturecontextmenu"})(v||(e.EventType=v={}));class b extends p.Disposable{constructor(){super(),this.dispatched=!1,this.targets=new _.LinkedList,this.ignoreTargets=new _.LinkedList,this.activeTouches={},this.handle=null,this._lastSetTapCountTime=0,this._register(S.Event.runAndSubscribe(L.onDidRegisterWindow,({window:i,disposables:n})=>{n.add(L.addDisposableListener(i.document,"touchstart",t=>this.onTouchStart(t),{passive:!1})),n.add(L.addDisposableListener(i.document,"touchend",t=>this.onTouchEnd(i,t))),n.add(L.addDisposableListener(i.document,"touchmove",t=>this.onTouchMove(t),{passive:!1}))},{window:k.mainWindow,disposables:this._store}))}static addTarget(i){if(!b.isTouchDevice())return p.Disposable.None;b.INSTANCE||(b.INSTANCE=(0,p.markAsSingleton)(new b));const n=b.INSTANCE.targets.push(i);return(0,p.toDisposable)(n)}static ignoreTarget(i){if(!b.isTouchDevice())return p.Disposable.None;b.INSTANCE||(b.INSTANCE=(0,p.markAsSingleton)(new b));const n=b.INSTANCE.ignoreTargets.push(i);return(0,p.toDisposable)(n)}static isTouchDevice(){return"ontouchstart"in k.mainWindow||navigator.maxTouchPoints>0}dispose(){this.handle&&(this.handle.dispose(),this.handle=null),super.dispose()}onTouchStart(i){const n=Date.now();this.handle&&(this.handle.dispose(),this.handle=null);for(let t=0,r=i.targetTouches.length;t<r;t++){const u=i.targetTouches.item(t);this.activeTouches[u.identifier]={id:u.identifier,initialTarget:u.target,initialTimeStamp:n,initialPageX:u.pageX,initialPageY:u.pageY,rollingTimestamps:[n],rollingPageX:[u.pageX],rollingPageY:[u.pageY]};const f=this.newGestureEvent(v.Start,u.target);f.pageX=u.pageX,f.pageY=u.pageY,this.dispatchEvent(f)}this.dispatched&&(i.preventDefault(),i.stopPropagation(),this.dispatched=!1)}onTouchEnd(i,n){const t=Date.now(),r=Object.keys(this.activeTouches).length;for(let u=0,f=n.changedTouches.length;u<f;u++){const c=n.changedTouches.item(u);if(!this.activeTouches.hasOwnProperty(String(c.identifier))){console.warn("move of an UNKNOWN touch",c);continue}const d=this.activeTouches[c.identifier],s=Date.now()-d.initialTimeStamp;if(s<b.HOLD_DELAY&&Math.abs(d.initialPageX-y.tail(d.rollingPageX))<30&&Math.abs(d.initialPageY-y.tail(d.rollingPageY))<30){const l=this.newGestureEvent(v.Tap,d.initialTarget);l.pageX=y.tail(d.rollingPageX),l.pageY=y.tail(d.rollingPageY),this.dispatchEvent(l)}else if(s>=b.HOLD_DELAY&&Math.abs(d.initialPageX-y.tail(d.rollingPageX))<30&&Math.abs(d.initialPageY-y.tail(d.rollingPageY))<30){const l=this.newGestureEvent(v.Contextmenu,d.initialTarget);l.pageX=y.tail(d.rollingPageX),l.pageY=y.tail(d.rollingPageY),this.dispatchEvent(l)}else if(r===1){const l=y.tail(d.rollingPageX),o=y.tail(d.rollingPageY),g=y.tail(d.rollingTimestamps)-d.rollingTimestamps[0],h=l-d.rollingPageX[0],m=o-d.rollingPageY[0],C=[...this.targets].filter(w=>d.initialTarget instanceof Node&&w.contains(d.initialTarget));this.inertia(i,C,t,Math.abs(h)/g,h>0?1:-1,l,Math.abs(m)/g,m>0?1:-1,o)}this.dispatchEvent(this.newGestureEvent(v.End,d.initialTarget)),delete this.activeTouches[c.identifier]}this.dispatched&&(n.preventDefault(),n.stopPropagation(),this.dispatched=!1)}newGestureEvent(i,n){const t=document.createEvent("CustomEvent");return t.initEvent(i,!1,!0),t.initialTarget=n,t.tapCount=0,t}dispatchEvent(i){if(i.type===v.Tap){const n=new Date().getTime();let t=0;n-this._lastSetTapCountTime>b.CLEAR_TAP_COUNT_TIME?t=1:t=2,this._lastSetTapCountTime=n,i.tapCount=t}else(i.type===v.Change||i.type===v.Contextmenu)&&(this._lastSetTapCountTime=0);if(i.initialTarget instanceof Node){for(const n of this.ignoreTargets)if(n.contains(i.initialTarget))return;for(const n of this.targets)n.contains(i.initialTarget)&&(n.dispatchEvent(i),this.dispatched=!0)}}inertia(i,n,t,r,u,f,c,d,s){this.handle=L.scheduleAtNextAnimationFrame(i,()=>{const l=Date.now(),o=l-t;let g=0,h=0,m=!0;r+=b.SCROLL_FRICTION*o,c+=b.SCROLL_FRICTION*o,r>0&&(m=!1,g=u*r*o),c>0&&(m=!1,h=d*c*o);const C=this.newGestureEvent(v.Change);C.translationX=g,C.translationY=h,n.forEach(w=>w.dispatchEvent(C)),m||this.inertia(i,n,l,r,u,f+g,c,d,s+h)})}onTouchMove(i){const n=Date.now();for(let t=0,r=i.changedTouches.length;t<r;t++){const u=i.changedTouches.item(t);if(!this.activeTouches.hasOwnProperty(String(u.identifier))){console.warn("end of an UNKNOWN touch",u);continue}const f=this.activeTouches[u.identifier],c=this.newGestureEvent(v.Change,f.initialTarget);c.translationX=u.pageX-y.tail(f.rollingPageX),c.translationY=u.pageY-y.tail(f.rollingPageY),c.pageX=u.pageX,c.pageY=u.pageY,this.dispatchEvent(c),f.rollingPageX.length>3&&(f.rollingPageX.shift(),f.rollingPageY.shift(),f.rollingTimestamps.shift()),f.rollingPageX.push(u.pageX),f.rollingPageY.push(u.pageY),f.rollingTimestamps.push(n)}this.dispatched&&(i.preventDefault(),i.stopPropagation(),this.dispatched=!1)}}e.Gesture=b,b.SCROLL_FRICTION=-.005,b.HOLD_DELAY=700,b.CLEAR_TAP_COUNT_TIME=400,ke([E.memoize],b,"isTouchDevice",null)}),define(se[48],oe([1,0,7,408]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.status=e.alert=e.setARIAContainer=void 0;const k=2e4;let y,E,S,p,_;function v(n){y=document.createElement("div"),y.className="monaco-aria-container";const t=()=>{const u=document.createElement("div");return u.className="monaco-alert",u.setAttribute("role","alert"),u.setAttribute("aria-atomic","true"),y.appendChild(u),u};E=t(),S=t();const r=()=>{const u=document.createElement("div");return u.className="monaco-status",u.setAttribute("aria-live","polite"),u.setAttribute("aria-atomic","true"),y.appendChild(u),u};p=r(),_=r(),n.appendChild(y)}e.setARIAContainer=v;function b(n){y&&(E.textContent!==n?(L.clearNode(S),i(E,n)):(L.clearNode(E),i(S,n)))}e.alert=b;function a(n){y&&(p.textContent!==n?(L.clearNode(_),i(p,n)):(L.clearNode(p),i(_,n)))}e.status=a;function i(n,t){L.clearNode(n),t.length>k&&(t=t.substr(0,k)),n.textContent=t,n.style.visibility="hidden",n.style.visibility="visible"}}),define(se[318],oe([1,0,219,7,2,17,172,412]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextView=e.layout=e.LayoutAnchorMode=e.isAnchor=void 0;function p(i){const n=i;return!!n&&typeof n.x=="number"&&typeof n.y=="number"}e.isAnchor=p;var _;(function(i){i[i.AVOID=0]="AVOID",i[i.ALIGN=1]="ALIGN"})(_||(e.LayoutAnchorMode=_={}));function v(i,n,t){const r=t.mode===_.ALIGN?t.offset:t.offset+t.size,u=t.mode===_.ALIGN?t.offset+t.size:t.offset;return t.position===0?n<=i-r?r:n<=u?u-n:Math.max(i-n,0):n<=u?u-n:n<=i-r?r:0}e.layout=v;class b extends y.Disposable{constructor(n,t){super(),this.container=null,this.useFixedPosition=!1,this.useShadowDOM=!1,this.delegate=null,this.toDisposeOnClean=y.Disposable.None,this.toDisposeOnSetContainer=y.Disposable.None,this.shadowRoot=null,this.shadowRootHostElement=null,this.view=k.$(".context-view"),k.hide(this.view),this.setContainer(n,t),this._register((0,y.toDisposable)(()=>this.setContainer(null,1)))}setContainer(n,t){var r;this.useFixedPosition=t!==1;const u=this.useShadowDOM;if(this.useShadowDOM=t===3,!(n===this.container&&u===this.useShadowDOM)&&(this.container&&(this.toDisposeOnSetContainer.dispose(),this.shadowRoot?(this.shadowRoot.removeChild(this.view),this.shadowRoot=null,(r=this.shadowRootHostElement)===null||r===void 0||r.remove(),this.shadowRootHostElement=null):this.container.removeChild(this.view),this.container=null),n)){if(this.container=n,this.useShadowDOM){this.shadowRootHostElement=k.$(".shadow-root-host"),this.container.appendChild(this.shadowRootHostElement),this.shadowRoot=this.shadowRootHostElement.attachShadow({mode:"open"});const c=document.createElement("style");c.textContent=a,this.shadowRoot.appendChild(c),this.shadowRoot.appendChild(this.view),this.shadowRoot.appendChild(k.$("slot"))}else this.container.appendChild(this.view);const f=new y.DisposableStore;b.BUBBLE_UP_EVENTS.forEach(c=>{f.add(k.addStandardDisposableListener(this.container,c,d=>{this.onDOMEvent(d,!1)}))}),b.BUBBLE_DOWN_EVENTS.forEach(c=>{f.add(k.addStandardDisposableListener(this.container,c,d=>{this.onDOMEvent(d,!0)},!0))}),this.toDisposeOnSetContainer=f}}show(n){var t,r;this.isVisible()&&this.hide(),k.clearNode(this.view),this.view.className="context-view",this.view.style.top="0px",this.view.style.left="0px",this.view.style.zIndex="2575",this.view.style.position=this.useFixedPosition?"fixed":"absolute",k.show(this.view),this.toDisposeOnClean=n.render(this.view)||y.Disposable.None,this.delegate=n,this.doLayout(),(r=(t=this.delegate).focus)===null||r===void 0||r.call(t)}getViewElement(){return this.view}layout(){if(this.isVisible()){if(this.delegate.canRelayout===!1&&!(E.isIOS&&L.BrowserFeatures.pointerEvents)){this.hide();return}this.delegate.layout&&this.delegate.layout(),this.doLayout()}}doLayout(){if(!this.isVisible())return;const n=this.delegate.getAnchor();let t;if(n instanceof HTMLElement){const h=k.getDomNodePagePosition(n),m=k.getDomNodeZoomLevel(n);t={top:h.top*m,left:h.left*m,width:h.width*m,height:h.height*m}}else p(n)?t={top:n.y,left:n.x,width:n.width||1,height:n.height||2}:t={top:n.posy,left:n.posx,width:2,height:2};const r=k.getTotalWidth(this.view),u=k.getTotalHeight(this.view),f=this.delegate.anchorPosition||0,c=this.delegate.anchorAlignment||0,d=this.delegate.anchorAxisAlignment||0;let s,l;const o=k.getActiveWindow();if(d===0){const h={offset:t.top-o.pageYOffset,size:t.height,position:f===0?0:1},m={offset:t.left,size:t.width,position:c===0?0:1,mode:_.ALIGN};s=v(o.innerHeight,u,h)+o.pageYOffset,S.Range.intersects({start:s,end:s+u},{start:h.offset,end:h.offset+h.size})&&(m.mode=_.AVOID),l=v(o.innerWidth,r,m)}else{const h={offset:t.left,size:t.width,position:c===0?0:1},m={offset:t.top,size:t.height,position:f===0?0:1,mode:_.ALIGN};l=v(o.innerWidth,r,h),S.Range.intersects({start:l,end:l+r},{start:h.offset,end:h.offset+h.size})&&(m.mode=_.AVOID),s=v(o.innerHeight,u,m)+o.pageYOffset}this.view.classList.remove("top","bottom","left","right"),this.view.classList.add(f===0?"bottom":"top"),this.view.classList.add(c===0?"left":"right"),this.view.classList.toggle("fixed",this.useFixedPosition);const g=k.getDomNodePagePosition(this.container);this.view.style.top=`${s-(this.useFixedPosition?k.getDomNodePagePosition(this.view).top:g.top)}px`,this.view.style.left=`${l-(this.useFixedPosition?k.getDomNodePagePosition(this.view).left:g.left)}px`,this.view.style.width="initial"}hide(n){const t=this.delegate;this.delegate=null,t?.onHide&&t.onHide(n),this.toDisposeOnClean.dispose(),k.hide(this.view)}isVisible(){return!!this.delegate}onDOMEvent(n,t){this.delegate&&(this.delegate.onDOMEvent?this.delegate.onDOMEvent(n,k.getWindow(n).document.activeElement):t&&!k.isAncestor(n.target,this.container)&&this.hide())}dispose(){this.hide(),super.dispose()}}e.ContextView=b,b.BUBBLE_UP_EVENTS=["click","keydown","focus","blur"],b.BUBBLE_DOWN_EVENTS=["click"];const a=`
+	:host {
+		all: initial; /* 1st rule so subsequent properties are reset. */
+	}
+
+	.codicon[class*='codicon-'] {
+		font: normal normal normal 16px/1 codicon;
+		display: inline-block;
+		text-decoration: none;
+		text-rendering: auto;
+		text-align: center;
+		-webkit-font-smoothing: antialiased;
+		-moz-osx-font-smoothing: grayscale;
+		user-select: none;
+		-webkit-user-select: none;
+		-ms-user-select: none;
+	}
+
+	:host {
+		font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", system-ui, "Ubuntu", "Droid Sans", sans-serif;
+	}
+
+	:host-context(.mac) { font-family: -apple-system, BlinkMacSystemFont, sans-serif; }
+	:host-context(.mac:lang(zh-Hans)) { font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", sans-serif; }
+	:host-context(.mac:lang(zh-Hant)) { font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", sans-serif; }
+	:host-context(.mac:lang(ja)) { font-family: -apple-system, BlinkMacSystemFont, "Hiragino Kaku Gothic Pro", sans-serif; }
+	:host-context(.mac:lang(ko)) { font-family: -apple-system, BlinkMacSystemFont, "Nanum Gothic", "Apple SD Gothic Neo", "AppleGothic", sans-serif; }
+
+	:host-context(.windows) { font-family: "Segoe WPC", "Segoe UI", sans-serif; }
+	:host-context(.windows:lang(zh-Hans)) { font-family: "Segoe WPC", "Segoe UI", "Microsoft YaHei", sans-serif; }
+	:host-context(.windows:lang(zh-Hant)) { font-family: "Segoe WPC", "Segoe UI", "Microsoft Jhenghei", sans-serif; }
+	:host-context(.windows:lang(ja)) { font-family: "Segoe WPC", "Segoe UI", "Yu Gothic UI", "Meiryo UI", sans-serif; }
+	:host-context(.windows:lang(ko)) { font-family: "Segoe WPC", "Segoe UI", "Malgun Gothic", "Dotom", sans-serif; }
+
+	:host-context(.linux) { font-family: system-ui, "Ubuntu", "Droid Sans", sans-serif; }
+	:host-context(.linux:lang(zh-Hans)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans SC", "Source Han Sans CN", "Source Han Sans", sans-serif; }
+	:host-context(.linux:lang(zh-Hant)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans TC", "Source Han Sans TW", "Source Han Sans", sans-serif; }
+	:host-context(.linux:lang(ja)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans J", "Source Han Sans JP", "Source Han Sans", sans-serif; }
+	:host-context(.linux:lang(ko)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans K", "Source Han Sans JR", "Source Han Sans", "UnDotum", "FBaekmuk Gulim", sans-serif; }
+`}),define(se[319],oe([1,0,7,11,413]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CountBadge=void 0;class y{constructor(S,p,_){this.options=p,this.styles=_,this.count=0,this.element=(0,L.append)(S,(0,L.$)(".monaco-count-badge")),this.countFormat=this.options.countFormat||"{0}",this.titleFormat=this.options.titleFormat||"",this.setCount(this.options.count||0)}setCount(S){this.count=S,this.render()}setTitleFormat(S){this.titleFormat=S,this.render()}render(){var S,p;this.element.textContent=(0,k.format)(this.countFormat,this.count),this.element.title=(0,k.format)(this.titleFormat,this.count),this.element.style.backgroundColor=(S=this.styles.badgeBackground)!==null&&S!==void 0?S:"",this.element.style.color=(p=this.styles.badgeForeground)!==null&&p!==void 0?p:"",this.styles.badgeBorder&&(this.element.style.border=`1px solid ${this.styles.badgeBorder}`)}}e.CountBadge=y}),define(se[588],oe([1,0,7,46,63,42,6,273]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DropdownMenu=void 0;class p extends E.ActionRunner{constructor(b,a){super(),this._onDidChangeVisibility=this._register(new S.Emitter),this.onDidChangeVisibility=this._onDidChangeVisibility.event,this._element=(0,L.append)(b,(0,L.$)(".monaco-dropdown")),this._label=(0,L.append)(this._element,(0,L.$)(".dropdown-label"));let i=a.labelRenderer;i||(i=t=>(t.textContent=a.label||"",null));for(const t of[L.EventType.CLICK,L.EventType.MOUSE_DOWN,y.EventType.Tap])this._register((0,L.addDisposableListener)(this.element,t,r=>L.EventHelper.stop(r,!0)));for(const t of[L.EventType.MOUSE_DOWN,y.EventType.Tap])this._register((0,L.addDisposableListener)(this._label,t,r=>{(0,L.isMouseEvent)(r)&&(r.detail>1||r.button!==0)||(this.visible?this.hide():this.show())}));this._register((0,L.addDisposableListener)(this._label,L.EventType.KEY_UP,t=>{const r=new k.StandardKeyboardEvent(t);(r.equals(3)||r.equals(10))&&(L.EventHelper.stop(t,!0),this.visible?this.hide():this.show())}));const n=i(this._label);n&&this._register(n),this._register(y.Gesture.addTarget(this._label))}get element(){return this._element}show(){this.visible||(this.visible=!0,this._onDidChangeVisibility.fire(!0))}hide(){this.visible&&(this.visible=!1,this._onDidChangeVisibility.fire(!1))}dispose(){super.dispose(),this.hide(),this.boxContainer&&(this.boxContainer.remove(),this.boxContainer=void 0),this.contents&&(this.contents.remove(),this.contents=void 0),this._label&&(this._label.remove(),this._label=void 0)}}class _ extends p{constructor(b,a){super(b,a),this._options=a,this._actions=[],this.actions=a.actions||[]}set menuOptions(b){this._menuOptions=b}get menuOptions(){return this._menuOptions}get actions(){return this._options.actionProvider?this._options.actionProvider.getActions():this._actions}set actions(b){this._actions=b}show(){super.show(),this.element.classList.add("active"),this._options.contextMenuProvider.showContextMenu({getAnchor:()=>this.element,getActions:()=>this.actions,getActionsContext:()=>this.menuOptions?this.menuOptions.context:null,getActionViewItem:(b,a)=>this.menuOptions&&this.menuOptions.actionViewItemProvider?this.menuOptions.actionViewItemProvider(b,a):void 0,getKeyBinding:b=>this.menuOptions&&this.menuOptions.getKeyBinding?this.menuOptions.getKeyBinding(b):void 0,getMenuClassName:()=>this._options.menuClassName||"",onHide:()=>this.onHide(),actionRunner:this.menuOptions?this.menuOptions.actionRunner:void 0,anchorAlignment:this.menuOptions?this.menuOptions.anchorAlignment:0,domForShadowRoot:this._options.menuAsChild?this.element:void 0,skipTelemetry:this._options.skipTelemetry})}hide(){super.hide()}onHide(){this.hide(),this.element.classList.remove("active")}}e.DropdownMenu=_}),define(se[118],oe([1,0,7,28]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.renderIcon=e.renderLabelWithIcons=void 0;const y=new RegExp(`(\\\\)?\\$\\((${k.ThemeIcon.iconNameExpression}(?:${k.ThemeIcon.iconModifierExpression})?)\\)`,"g");function E(p){const _=new Array;let v,b=0,a=0;for(;(v=y.exec(p))!==null;){a=v.index||0,b<a&&_.push(p.substring(b,a)),b=(v.index||0)+v[0].length;const[,i,n]=v;_.push(i?`$(${n})`:S({id:n}))}return b<p.length&&_.push(p.substring(b)),_}e.renderLabelWithIcons=E;function S(p){const _=L.$("span");return _.classList.add(...k.ThemeIcon.asClassNameArray(p)),_}e.renderIcon=S}),define(se[320],oe([1,0,7,118,55]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HighlightedLabel=void 0;class E{constructor(p,_){var v;this.text="",this.title="",this.highlights=[],this.didEverRender=!1,this.supportIcons=(v=_?.supportIcons)!==null&&v!==void 0?v:!1,this.domNode=L.append(p,L.$("span.monaco-highlighted-label"))}get element(){return this.domNode}set(p,_=[],v="",b){p||(p=""),b&&(p=E.escapeNewLines(p,_)),!(this.didEverRender&&this.text===p&&this.title===v&&y.equals(this.highlights,_))&&(this.text=p,this.title=v,this.highlights=_,this.render())}render(){const p=[];let _=0;for(const v of this.highlights){if(v.end===v.start)continue;if(_<v.start){const i=this.text.substring(_,v.start);this.supportIcons?p.push(...(0,k.renderLabelWithIcons)(i)):p.push(i),_=v.start}const b=this.text.substring(_,v.end),a=L.$("span.highlight",void 0,...this.supportIcons?(0,k.renderLabelWithIcons)(b):[b]);v.extraClasses&&a.classList.add(...v.extraClasses),p.push(a),_=v.end}if(_<this.text.length){const v=this.text.substring(_);this.supportIcons?p.push(...(0,k.renderLabelWithIcons)(v)):p.push(v)}L.reset(this.domNode,...p),this.title?this.domNode.title=this.title:this.domNode.removeAttribute("title"),this.didEverRender=!0}static escapeNewLines(p,_){let v=0,b=0;return p.replace(/\r\n|\r|\n/g,(a,i)=>{b=a===`\r
+`?-1:0,i+=v;for(const n of _)n.end<=i||(n.start>=i&&(n.start+=b),n.end>=i&&(n.end+=b));return v+=b,"\u23CE"})}}e.HighlightedLabel=E}),define(se[224],oe([1,0,7,218,55,573,417]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.KeybindingLabel=e.unthemedKeybindingLabelOptions=void 0;const S=L.$;e.unthemedKeybindingLabelOptions={keybindingLabelBackground:void 0,keybindingLabelForeground:void 0,keybindingLabelBorder:void 0,keybindingLabelBottomBorder:void 0,keybindingLabelShadow:void 0};class p{constructor(v,b,a){this.os=b,this.keyElements=new Set,this.options=a||Object.create(null);const i=this.options.keybindingLabelForeground;this.domNode=L.append(v,S(".monaco-keybinding")),i&&(this.domNode.style.color=i),this.didEverRender=!1,v.appendChild(this.domNode)}get element(){return this.domNode}set(v,b){this.didEverRender&&this.keybinding===v&&p.areSame(this.matches,b)||(this.keybinding=v,this.matches=b,this.render())}render(){var v;if(this.clear(),this.keybinding){const b=this.keybinding.getChords();b[0]&&this.renderChord(this.domNode,b[0],this.matches?this.matches.firstPart:null);for(let i=1;i<b.length;i++)L.append(this.domNode,S("span.monaco-keybinding-key-chord-separator",void 0," ")),this.renderChord(this.domNode,b[i],this.matches?this.matches.chordPart:null);const a=(v=this.options.disableTitle)!==null&&v!==void 0&&v?void 0:this.keybinding.getAriaLabel()||void 0;a!==void 0?this.domNode.title=a:this.domNode.removeAttribute("title")}else this.options&&this.options.renderUnboundKeybindings&&this.renderUnbound(this.domNode);this.didEverRender=!0}clear(){L.clearNode(this.domNode),this.keyElements.clear()}renderChord(v,b,a){const i=k.UILabelProvider.modifierLabels[this.os];b.ctrlKey&&this.renderKey(v,i.ctrlKey,!!a?.ctrlKey,i.separator),b.shiftKey&&this.renderKey(v,i.shiftKey,!!a?.shiftKey,i.separator),b.altKey&&this.renderKey(v,i.altKey,!!a?.altKey,i.separator),b.metaKey&&this.renderKey(v,i.metaKey,!!a?.metaKey,i.separator);const n=b.keyLabel;n&&this.renderKey(v,n,!!a?.keyCode,"")}renderKey(v,b,a,i){L.append(v,this.createKeyElement(b,a?".highlight":"")),i&&L.append(v,S("span.monaco-keybinding-key-separator",void 0,i))}renderUnbound(v){L.append(v,this.createKeyElement((0,E.localize)(0,null)))}createKeyElement(v,b=""){const a=S("span.monaco-keybinding-key"+b,void 0,v);return this.keyElements.add(a),this.options.keybindingLabelBackground&&(a.style.backgroundColor=this.options.keybindingLabelBackground),this.options.keybindingLabelBorder&&(a.style.borderColor=this.options.keybindingLabelBorder),this.options.keybindingLabelBottomBorder&&(a.style.borderBottomColor=this.options.keybindingLabelBottomBorder),this.options.keybindingLabelShadow&&(a.style.boxShadow=`inset 0 -1px 0 ${this.options.keybindingLabelShadow}`),a}static areSame(v,b){return v===b||!v&&!b?!0:!!v&&!!b&&(0,y.equals)(v.firstPart,b.firstPart)&&(0,y.equals)(v.chordPart,b.chordPart)}}e.KeybindingLabel=p}),define(se[589],oe([1,0,7]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RowCache=void 0;function k(E){var S;try{(S=E.parentElement)===null||S===void 0||S.removeChild(E)}catch{}}class y{constructor(S){this.renderers=S,this.cache=new Map,this.transactionNodesPendingRemoval=new Set,this.inTransaction=!1}alloc(S){let p=this.getTemplateCache(S).pop(),_=!1;if(p)_=this.transactionNodesPendingRemoval.has(p.domNode),_&&this.transactionNodesPendingRemoval.delete(p.domNode);else{const v=(0,L.$)(".monaco-list-row"),a=this.getRenderer(S).renderTemplate(v);p={domNode:v,templateId:S,templateData:a}}return{row:p,isReusingConnectedDomNode:_}}release(S){S&&this.releaseRow(S)}transact(S){if(this.inTransaction)throw new Error("Already in transaction");this.inTransaction=!0;try{S()}finally{for(const p of this.transactionNodesPendingRemoval)this.doRemoveNode(p);this.transactionNodesPendingRemoval.clear(),this.inTransaction=!1}}releaseRow(S){const{domNode:p,templateId:_}=S;p&&(this.inTransaction?this.transactionNodesPendingRemoval.add(p):this.doRemoveNode(p)),this.getTemplateCache(_).push(S)}doRemoveNode(S){S.classList.remove("scrolling"),k(S)}getTemplateCache(S){let p=this.cache.get(S);return p||(p=[],this.cache.set(S,p)),p}dispose(){this.cache.forEach((S,p)=>{for(const _ of S)this.getRenderer(p).disposeTemplate(_.templateData),_.templateData=null}),this.cache.clear(),this.transactionNodesPendingRemoval.clear()}getRenderer(S){const p=this.renderers.get(S);if(!p)throw new Error(`No renderer found for ${S}`);return p}}e.RowCache=y}),define(se[590],oe([1,0,7,14,2,419]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ProgressBar=void 0;const E="done",S="active",p="infinite",_="infinite-long-running",v="discrete";class b extends y.Disposable{constructor(i,n){super(),this.workedVal=0,this.showDelayedScheduler=this._register(new k.RunOnceScheduler(()=>(0,L.show)(this.element),0)),this.longRunningScheduler=this._register(new k.RunOnceScheduler(()=>this.infiniteLongRunning(),b.LONG_RUNNING_INFINITE_THRESHOLD)),this.create(i,n)}create(i,n){this.element=document.createElement("div"),this.element.classList.add("monaco-progress-container"),this.element.setAttribute("role","progressbar"),this.element.setAttribute("aria-valuemin","0"),i.appendChild(this.element),this.bit=document.createElement("div"),this.bit.classList.add("progress-bit"),this.bit.style.backgroundColor=n?.progressBarBackground||"#0E70C0",this.element.appendChild(this.bit)}off(){this.bit.style.width="inherit",this.bit.style.opacity="1",this.element.classList.remove(S,p,_,v),this.workedVal=0,this.totalWork=void 0,this.longRunningScheduler.cancel()}stop(){return this.doDone(!1)}doDone(i){return this.element.classList.add(E),this.element.classList.contains(p)?(this.bit.style.opacity="0",i?setTimeout(()=>this.off(),200):this.off()):(this.bit.style.width="inherit",i?setTimeout(()=>this.off(),200):this.off()),this}infinite(){return this.bit.style.width="2%",this.bit.style.opacity="1",this.element.classList.remove(v,E,_),this.element.classList.add(S,p),this.longRunningScheduler.schedule(),this}infiniteLongRunning(){this.element.classList.add(_)}getContainer(){return this.element}}e.ProgressBar=b,b.LONG_RUNNING_INFINITE_THRESHOLD=1e4}),define(se[158],oe([1,0,7,84,63,14,107,6,2,17,420]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Sash=e.OrthogonalEdge=void 0;const b=!1;var a;(function(l){l.North="north",l.South="south",l.East="east",l.West="west"})(a||(e.OrthogonalEdge=a={}));let i=4;const n=new p.Emitter;let t=300;const r=new p.Emitter;class u{constructor(o){this.el=o,this.disposables=new _.DisposableStore}get onPointerMove(){return this.disposables.add(new k.DomEmitter((0,L.getWindow)(this.el),"mousemove")).event}get onPointerUp(){return this.disposables.add(new k.DomEmitter((0,L.getWindow)(this.el),"mouseup")).event}dispose(){this.disposables.dispose()}}ke([S.memoize],u.prototype,"onPointerMove",null),ke([S.memoize],u.prototype,"onPointerUp",null);class f{get onPointerMove(){return this.disposables.add(new k.DomEmitter(this.el,y.EventType.Change)).event}get onPointerUp(){return this.disposables.add(new k.DomEmitter(this.el,y.EventType.End)).event}constructor(o){this.el=o,this.disposables=new _.DisposableStore}dispose(){this.disposables.dispose()}}ke([S.memoize],f.prototype,"onPointerMove",null),ke([S.memoize],f.prototype,"onPointerUp",null);class c{get onPointerMove(){return this.factory.onPointerMove}get onPointerUp(){return this.factory.onPointerUp}constructor(o){this.factory=o}dispose(){}}ke([S.memoize],c.prototype,"onPointerMove",null),ke([S.memoize],c.prototype,"onPointerUp",null);const d="pointer-events-disabled";class s extends _.Disposable{get state(){return this._state}get orthogonalStartSash(){return this._orthogonalStartSash}get orthogonalEndSash(){return this._orthogonalEndSash}set state(o){this._state!==o&&(this.el.classList.toggle("disabled",o===0),this.el.classList.toggle("minimum",o===1),this.el.classList.toggle("maximum",o===2),this._state=o,this.onDidEnablementChange.fire(o))}set orthogonalStartSash(o){if(this._orthogonalStartSash!==o){if(this.orthogonalStartDragHandleDisposables.clear(),this.orthogonalStartSashDisposables.clear(),o){const g=h=>{this.orthogonalStartDragHandleDisposables.clear(),h!==0&&(this._orthogonalStartDragHandle=(0,L.append)(this.el,(0,L.$)(".orthogonal-drag-handle.start")),this.orthogonalStartDragHandleDisposables.add((0,_.toDisposable)(()=>this._orthogonalStartDragHandle.remove())),this.orthogonalStartDragHandleDisposables.add(new k.DomEmitter(this._orthogonalStartDragHandle,"mouseenter")).event(()=>s.onMouseEnter(o),void 0,this.orthogonalStartDragHandleDisposables),this.orthogonalStartDragHandleDisposables.add(new k.DomEmitter(this._orthogonalStartDragHandle,"mouseleave")).event(()=>s.onMouseLeave(o),void 0,this.orthogonalStartDragHandleDisposables))};this.orthogonalStartSashDisposables.add(o.onDidEnablementChange.event(g,this)),g(o.state)}this._orthogonalStartSash=o}}set orthogonalEndSash(o){if(this._orthogonalEndSash!==o){if(this.orthogonalEndDragHandleDisposables.clear(),this.orthogonalEndSashDisposables.clear(),o){const g=h=>{this.orthogonalEndDragHandleDisposables.clear(),h!==0&&(this._orthogonalEndDragHandle=(0,L.append)(this.el,(0,L.$)(".orthogonal-drag-handle.end")),this.orthogonalEndDragHandleDisposables.add((0,_.toDisposable)(()=>this._orthogonalEndDragHandle.remove())),this.orthogonalEndDragHandleDisposables.add(new k.DomEmitter(this._orthogonalEndDragHandle,"mouseenter")).event(()=>s.onMouseEnter(o),void 0,this.orthogonalEndDragHandleDisposables),this.orthogonalEndDragHandleDisposables.add(new k.DomEmitter(this._orthogonalEndDragHandle,"mouseleave")).event(()=>s.onMouseLeave(o),void 0,this.orthogonalEndDragHandleDisposables))};this.orthogonalEndSashDisposables.add(o.onDidEnablementChange.event(g,this)),g(o.state)}this._orthogonalEndSash=o}}constructor(o,g,h){super(),this.hoverDelay=t,this.hoverDelayer=this._register(new E.Delayer(this.hoverDelay)),this._state=3,this.onDidEnablementChange=this._register(new p.Emitter),this._onDidStart=this._register(new p.Emitter),this._onDidChange=this._register(new p.Emitter),this._onDidReset=this._register(new p.Emitter),this._onDidEnd=this._register(new p.Emitter),this.orthogonalStartSashDisposables=this._register(new _.DisposableStore),this.orthogonalStartDragHandleDisposables=this._register(new _.DisposableStore),this.orthogonalEndSashDisposables=this._register(new _.DisposableStore),this.orthogonalEndDragHandleDisposables=this._register(new _.DisposableStore),this.onDidStart=this._onDidStart.event,this.onDidChange=this._onDidChange.event,this.onDidReset=this._onDidReset.event,this.onDidEnd=this._onDidEnd.event,this.linkedSash=void 0,this.el=(0,L.append)(o,(0,L.$)(".monaco-sash")),h.orthogonalEdge&&this.el.classList.add(`orthogonal-edge-${h.orthogonalEdge}`),v.isMacintosh&&this.el.classList.add("mac");const m=this._register(new k.DomEmitter(this.el,"mousedown")).event;this._register(m(P=>this.onPointerStart(P,new u(o)),this));const C=this._register(new k.DomEmitter(this.el,"dblclick")).event;this._register(C(this.onPointerDoublePress,this));const w=this._register(new k.DomEmitter(this.el,"mouseenter")).event;this._register(w(()=>s.onMouseEnter(this)));const D=this._register(new k.DomEmitter(this.el,"mouseleave")).event;this._register(D(()=>s.onMouseLeave(this))),this._register(y.Gesture.addTarget(this.el));const I=this._register(new k.DomEmitter(this.el,y.EventType.Start)).event;this._register(I(P=>this.onPointerStart(P,new f(this.el)),this));const T=this._register(new k.DomEmitter(this.el,y.EventType.Tap)).event;let A;this._register(T(P=>{if(A){clearTimeout(A),A=void 0,this.onPointerDoublePress(P);return}clearTimeout(A),A=setTimeout(()=>A=void 0,250)},this)),typeof h.size=="number"?(this.size=h.size,h.orientation===0?this.el.style.width=`${this.size}px`:this.el.style.height=`${this.size}px`):(this.size=i,this._register(n.event(P=>{this.size=P,this.layout()}))),this._register(r.event(P=>this.hoverDelay=P)),this.layoutProvider=g,this.orthogonalStartSash=h.orthogonalStartSash,this.orthogonalEndSash=h.orthogonalEndSash,this.orientation=h.orientation||0,this.orientation===1?(this.el.classList.add("horizontal"),this.el.classList.remove("vertical")):(this.el.classList.remove("horizontal"),this.el.classList.add("vertical")),this.el.classList.toggle("debug",b),this.layout()}onPointerStart(o,g){L.EventHelper.stop(o);let h=!1;if(!o.__orthogonalSashEvent){const R=this.getOrthogonalSash(o);R&&(h=!0,o.__orthogonalSashEvent=!0,R.onPointerStart(o,new c(g)))}if(this.linkedSash&&!o.__linkedSashEvent&&(o.__linkedSashEvent=!0,this.linkedSash.onPointerStart(o,new c(g))),!this.state)return;const m=this.el.ownerDocument.getElementsByTagName("iframe");for(const R of m)R.classList.add(d);const C=o.pageX,w=o.pageY,D=o.altKey,I={startX:C,currentX:C,startY:w,currentY:w,altKey:D};this.el.classList.add("active"),this._onDidStart.fire(I);const T=(0,L.createStyleSheet)(this.el),A=()=>{let R="";h?R="all-scroll":this.orientation===1?this.state===1?R="s-resize":this.state===2?R="n-resize":R=v.isMacintosh?"row-resize":"ns-resize":this.state===1?R="e-resize":this.state===2?R="w-resize":R=v.isMacintosh?"col-resize":"ew-resize",T.textContent=`* { cursor: ${R} !important; }`},P=new _.DisposableStore;A(),h||this.onDidEnablementChange.event(A,null,P);const N=R=>{L.EventHelper.stop(R,!1);const x={startX:C,currentX:R.pageX,startY:w,currentY:R.pageY,altKey:D};this._onDidChange.fire(x)},M=R=>{L.EventHelper.stop(R,!1),this.el.removeChild(T),this.el.classList.remove("active"),this._onDidEnd.fire(),P.dispose();for(const x of m)x.classList.remove(d)};g.onPointerMove(N,null,P),g.onPointerUp(M,null,P),P.add(g)}onPointerDoublePress(o){const g=this.getOrthogonalSash(o);g&&g._onDidReset.fire(),this.linkedSash&&this.linkedSash._onDidReset.fire(),this._onDidReset.fire()}static onMouseEnter(o,g=!1){o.el.classList.contains("active")?(o.hoverDelayer.cancel(),o.el.classList.add("hover")):o.hoverDelayer.trigger(()=>o.el.classList.add("hover"),o.hoverDelay).then(void 0,()=>{}),!g&&o.linkedSash&&s.onMouseEnter(o.linkedSash,!0)}static onMouseLeave(o,g=!1){o.hoverDelayer.cancel(),o.el.classList.remove("hover"),!g&&o.linkedSash&&s.onMouseLeave(o.linkedSash,!0)}clearSashHoverState(){s.onMouseLeave(this)}layout(){if(this.orientation===0){const o=this.layoutProvider;this.el.style.left=o.getVerticalSashLeft(this)-this.size/2+"px",o.getVerticalSashTop&&(this.el.style.top=o.getVerticalSashTop(this)+"px"),o.getVerticalSashHeight&&(this.el.style.height=o.getVerticalSashHeight(this)+"px")}else{const o=this.layoutProvider;this.el.style.top=o.getHorizontalSashTop(this)-this.size/2+"px",o.getHorizontalSashLeft&&(this.el.style.left=o.getHorizontalSashLeft(this)+"px"),o.getHorizontalSashWidth&&(this.el.style.width=o.getHorizontalSashWidth(this)+"px")}}getOrthogonalSash(o){var g;const h=(g=o.initialTarget)!==null&&g!==void 0?g:o.target;if(!(!h||!(h instanceof HTMLElement))&&h.classList.contains("orthogonal-drag-handle"))return h.classList.contains("start")?this.orthogonalStartSash:this.orthogonalEndSash}dispose(){super.dispose(),this.el.remove()}}e.Sash=s}),define(se[225],oe([1,0,7,158,6,2]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResizableHTMLElement=void 0;class S{constructor(){this._onDidWillResize=new y.Emitter,this.onDidWillResize=this._onDidWillResize.event,this._onDidResize=new y.Emitter,this.onDidResize=this._onDidResize.event,this._sashListener=new E.DisposableStore,this._size=new L.Dimension(0,0),this._minSize=new L.Dimension(0,0),this._maxSize=new L.Dimension(Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER),this.domNode=document.createElement("div"),this._eastSash=new k.Sash(this.domNode,{getVerticalSashLeft:()=>this._size.width},{orientation:0}),this._westSash=new k.Sash(this.domNode,{getVerticalSashLeft:()=>0},{orientation:0}),this._northSash=new k.Sash(this.domNode,{getHorizontalSashTop:()=>0},{orientation:1,orthogonalEdge:k.OrthogonalEdge.North}),this._southSash=new k.Sash(this.domNode,{getHorizontalSashTop:()=>this._size.height},{orientation:1,orthogonalEdge:k.OrthogonalEdge.South}),this._northSash.orthogonalStartSash=this._westSash,this._northSash.orthogonalEndSash=this._eastSash,this._southSash.orthogonalStartSash=this._westSash,this._southSash.orthogonalEndSash=this._eastSash;let _,v=0,b=0;this._sashListener.add(y.Event.any(this._northSash.onDidStart,this._eastSash.onDidStart,this._southSash.onDidStart,this._westSash.onDidStart)(()=>{_===void 0&&(this._onDidWillResize.fire(),_=this._size,v=0,b=0)})),this._sashListener.add(y.Event.any(this._northSash.onDidEnd,this._eastSash.onDidEnd,this._southSash.onDidEnd,this._westSash.onDidEnd)(()=>{_!==void 0&&(_=void 0,v=0,b=0,this._onDidResize.fire({dimension:this._size,done:!0}))})),this._sashListener.add(this._eastSash.onDidChange(a=>{_&&(b=a.currentX-a.startX,this.layout(_.height+v,_.width+b),this._onDidResize.fire({dimension:this._size,done:!1,east:!0}))})),this._sashListener.add(this._westSash.onDidChange(a=>{_&&(b=-(a.currentX-a.startX),this.layout(_.height+v,_.width+b),this._onDidResize.fire({dimension:this._size,done:!1,west:!0}))})),this._sashListener.add(this._northSash.onDidChange(a=>{_&&(v=-(a.currentY-a.startY),this.layout(_.height+v,_.width+b),this._onDidResize.fire({dimension:this._size,done:!1,north:!0}))})),this._sashListener.add(this._southSash.onDidChange(a=>{_&&(v=a.currentY-a.startY,this.layout(_.height+v,_.width+b),this._onDidResize.fire({dimension:this._size,done:!1,south:!0}))})),this._sashListener.add(y.Event.any(this._eastSash.onDidReset,this._westSash.onDidReset)(a=>{this._preferredSize&&(this.layout(this._size.height,this._preferredSize.width),this._onDidResize.fire({dimension:this._size,done:!0}))})),this._sashListener.add(y.Event.any(this._northSash.onDidReset,this._southSash.onDidReset)(a=>{this._preferredSize&&(this.layout(this._preferredSize.height,this._size.width),this._onDidResize.fire({dimension:this._size,done:!0}))}))}dispose(){this._northSash.dispose(),this._southSash.dispose(),this._eastSash.dispose(),this._westSash.dispose(),this._sashListener.dispose(),this._onDidResize.dispose(),this._onDidWillResize.dispose(),this.domNode.remove()}enableSashes(_,v,b,a){this._northSash.state=_?3:0,this._eastSash.state=v?3:0,this._southSash.state=b?3:0,this._westSash.state=a?3:0}layout(_=this.size.height,v=this.size.width){const{height:b,width:a}=this._minSize,{height:i,width:n}=this._maxSize;_=Math.max(b,Math.min(i,_)),v=Math.max(a,Math.min(n,v));const t=new L.Dimension(v,_);L.Dimension.equals(t,this._size)||(this.domNode.style.height=_+"px",this.domNode.style.width=v+"px",this._size=t,this._northSash.layout(),this._eastSash.layout(),this._southSash.layout(),this._westSash.layout())}clearSashHoverState(){this._eastSash.clearSashHoverState(),this._westSash.clearSashHoverState(),this._northSash.clearSashHoverState(),this._southSash.clearSashHoverState()}get size(){return this._size}set maxSize(_){this._maxSize=_}get maxSize(){return this._maxSize}set minSize(_){this._minSize=_}get minSize(){return this._minSize}set preferredSize(_){this._preferredSize=_}get preferredSize(){return this._preferredSize}}e.ResizableHTMLElement=S}),define(se[591],oe([1,0,7,63,13,6,2,17]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectBoxNative=void 0;class _ extends S.Disposable{constructor(b,a,i,n){super(),this.selected=0,this.selectBoxOptions=n||Object.create(null),this.options=[],this.selectElement=document.createElement("select"),this.selectElement.className="monaco-select-box",typeof this.selectBoxOptions.ariaLabel=="string"&&this.selectElement.setAttribute("aria-label",this.selectBoxOptions.ariaLabel),typeof this.selectBoxOptions.ariaDescription=="string"&&this.selectElement.setAttribute("aria-description",this.selectBoxOptions.ariaDescription),this._onDidSelect=this._register(new E.Emitter),this.styles=i,this.registerListeners(),this.setOptions(b,a)}registerListeners(){this._register(k.Gesture.addTarget(this.selectElement)),[k.EventType.Tap].forEach(b=>{this._register(L.addDisposableListener(this.selectElement,b,a=>{this.selectElement.focus()}))}),this._register(L.addStandardDisposableListener(this.selectElement,"click",b=>{L.EventHelper.stop(b,!0)})),this._register(L.addStandardDisposableListener(this.selectElement,"change",b=>{this.selectElement.title=b.target.value,this._onDidSelect.fire({index:b.target.selectedIndex,selected:b.target.value})})),this._register(L.addStandardDisposableListener(this.selectElement,"keydown",b=>{let a=!1;p.isMacintosh?(b.keyCode===18||b.keyCode===16||b.keyCode===10)&&(a=!0):(b.keyCode===18&&b.altKey||b.keyCode===10||b.keyCode===3)&&(a=!0),a&&b.stopPropagation()}))}get onDidSelect(){return this._onDidSelect.event}setOptions(b,a){(!this.options||!y.equals(this.options,b))&&(this.options=b,this.selectElement.options.length=0,this.options.forEach((i,n)=>{this.selectElement.add(this.createOption(i.text,n,i.isDisabled))})),a!==void 0&&this.select(a)}select(b){this.options.length===0?this.selected=0:b>=0&&b<this.options.length?this.selected=b:b>this.options.length-1?this.select(this.options.length-1):this.selected<0&&(this.selected=0),this.selectElement.selectedIndex=this.selected,this.selected<this.options.length&&typeof this.options[this.selected].text=="string"?this.selectElement.title=this.options[this.selected].text:this.selectElement.title=""}focus(){this.selectElement&&(this.selectElement.tabIndex=0,this.selectElement.focus())}blur(){this.selectElement&&(this.selectElement.tabIndex=-1,this.selectElement.blur())}setFocusable(b){this.selectElement.tabIndex=b?0:-1}render(b){b.classList.add("select-container"),b.appendChild(this.selectElement),this.setOptions(this.options,this.selected),this.applyStyles()}applyStyles(){var b,a,i;this.selectElement&&(this.selectElement.style.backgroundColor=(b=this.styles.selectBackground)!==null&&b!==void 0?b:"",this.selectElement.style.color=(a=this.styles.selectForeground)!==null&&a!==void 0?a:"",this.selectElement.style.borderColor=(i=this.styles.selectBorder)!==null&&i!==void 0?i:"")}createOption(b,a,i){const n=document.createElement("option");return n.value=b,n.text=b,n.disabled=!!i,n}}e.SelectBoxNative=_}),define(se[76],oe([1,0,7,46,67,63,2]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Widget=void 0;class p extends S.Disposable{onclick(v,b){this._register(L.addDisposableListener(v,L.EventType.CLICK,a=>b(new y.StandardMouseEvent(L.getWindow(v),a))))}onmousedown(v,b){this._register(L.addDisposableListener(v,L.EventType.MOUSE_DOWN,a=>b(new y.StandardMouseEvent(L.getWindow(v),a))))}onmouseover(v,b){this._register(L.addDisposableListener(v,L.EventType.MOUSE_OVER,a=>b(new y.StandardMouseEvent(L.getWindow(v),a))))}onmouseleave(v,b){this._register(L.addDisposableListener(v,L.EventType.MOUSE_LEAVE,a=>b(new y.StandardMouseEvent(L.getWindow(v),a))))}onkeydown(v,b){this._register(L.addDisposableListener(v,L.EventType.KEY_DOWN,a=>b(new k.StandardKeyboardEvent(a))))}onkeyup(v,b){this._register(L.addDisposableListener(v,L.EventType.KEY_UP,a=>b(new k.StandardKeyboardEvent(a))))}oninput(v,b){this._register(L.addDisposableListener(v,L.EventType.INPUT,b))}onblur(v,b){this._register(L.addDisposableListener(v,L.EventType.BLUR,b))}onfocus(v,b){this._register(L.addDisposableListener(v,L.EventType.FOCUS,b))}ignoreGesture(v){return E.Gesture.ignoreTarget(v)}}e.Widget=p}),define(se[226],oe([1,0,157,76,14,28,7]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ScrollbarArrow=e.ARROW_IMG_SIZE=void 0,e.ARROW_IMG_SIZE=11;class p extends k.Widget{constructor(v){super(),this._onActivate=v.onActivate,this.bgDomNode=document.createElement("div"),this.bgDomNode.className="arrow-background",this.bgDomNode.style.position="absolute",this.bgDomNode.style.width=v.bgWidth+"px",this.bgDomNode.style.height=v.bgHeight+"px",typeof v.top<"u"&&(this.bgDomNode.style.top="0px"),typeof v.left<"u"&&(this.bgDomNode.style.left="0px"),typeof v.bottom<"u"&&(this.bgDomNode.style.bottom="0px"),typeof v.right<"u"&&(this.bgDomNode.style.right="0px"),this.domNode=document.createElement("div"),this.domNode.className=v.className,this.domNode.classList.add(...E.ThemeIcon.asClassNameArray(v.icon)),this.domNode.style.position="absolute",this.domNode.style.width=e.ARROW_IMG_SIZE+"px",this.domNode.style.height=e.ARROW_IMG_SIZE+"px",typeof v.top<"u"&&(this.domNode.style.top=v.top+"px"),typeof v.left<"u"&&(this.domNode.style.left=v.left+"px"),typeof v.bottom<"u"&&(this.domNode.style.bottom=v.bottom+"px"),typeof v.right<"u"&&(this.domNode.style.right=v.right+"px"),this._pointerMoveMonitor=this._register(new L.GlobalPointerMoveMonitor),this._register(S.addStandardDisposableListener(this.bgDomNode,S.EventType.POINTER_DOWN,b=>this._arrowPointerDown(b))),this._register(S.addStandardDisposableListener(this.domNode,S.EventType.POINTER_DOWN,b=>this._arrowPointerDown(b))),this._pointerdownRepeatTimer=this._register(new S.WindowIntervalTimer),this._pointerdownScheduleRepeatTimer=this._register(new y.TimeoutTimer)}_arrowPointerDown(v){if(!v.target||!(v.target instanceof Element))return;const b=()=>{this._pointerdownRepeatTimer.cancelAndSet(()=>this._onActivate(),1e3/24,S.getWindow(v))};this._onActivate(),this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancelAndSet(b,200),this._pointerMoveMonitor.startMonitoring(v.target,v.pointerId,v.buttons,a=>{},()=>{this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancel()}),v.preventDefault()}}e.ScrollbarArrow=p}),define(se[321],oe([1,0,7,40,157,226,583,76,17]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractScrollbar=void 0;const v=140;class b extends p.Widget{constructor(i){super(),this._lazyRender=i.lazyRender,this._host=i.host,this._scrollable=i.scrollable,this._scrollByPage=i.scrollByPage,this._scrollbarState=i.scrollbarState,this._visibilityController=this._register(new S.ScrollbarVisibilityController(i.visibility,"visible scrollbar "+i.extraScrollbarClassName,"invisible scrollbar "+i.extraScrollbarClassName)),this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._pointerMoveMonitor=this._register(new y.GlobalPointerMoveMonitor),this._shouldRender=!0,this.domNode=(0,k.createFastDomNode)(document.createElement("div")),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this._visibilityController.setDomNode(this.domNode),this.domNode.setPosition("absolute"),this._register(L.addDisposableListener(this.domNode.domNode,L.EventType.POINTER_DOWN,n=>this._domNodePointerDown(n)))}_createArrow(i){const n=this._register(new E.ScrollbarArrow(i));this.domNode.domNode.appendChild(n.bgDomNode),this.domNode.domNode.appendChild(n.domNode)}_createSlider(i,n,t,r){this.slider=(0,k.createFastDomNode)(document.createElement("div")),this.slider.setClassName("slider"),this.slider.setPosition("absolute"),this.slider.setTop(i),this.slider.setLeft(n),typeof t=="number"&&this.slider.setWidth(t),typeof r=="number"&&this.slider.setHeight(r),this.slider.setLayerHinting(!0),this.slider.setContain("strict"),this.domNode.domNode.appendChild(this.slider.domNode),this._register(L.addDisposableListener(this.slider.domNode,L.EventType.POINTER_DOWN,u=>{u.button===0&&(u.preventDefault(),this._sliderPointerDown(u))})),this.onclick(this.slider.domNode,u=>{u.leftButton&&u.stopPropagation()})}_onElementSize(i){return this._scrollbarState.setVisibleSize(i)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_onElementScrollSize(i){return this._scrollbarState.setScrollSize(i)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_onElementScrollPosition(i){return this._scrollbarState.setScrollPosition(i)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}beginReveal(){this._visibilityController.setShouldBeVisible(!0)}beginHide(){this._visibilityController.setShouldBeVisible(!1)}render(){this._shouldRender&&(this._shouldRender=!1,this._renderDomNode(this._scrollbarState.getRectangleLargeSize(),this._scrollbarState.getRectangleSmallSize()),this._updateSlider(this._scrollbarState.getSliderSize(),this._scrollbarState.getArrowSize()+this._scrollbarState.getSliderPosition()))}_domNodePointerDown(i){i.target===this.domNode.domNode&&this._onPointerDown(i)}delegatePointerDown(i){const n=this.domNode.domNode.getClientRects()[0].top,t=n+this._scrollbarState.getSliderPosition(),r=n+this._scrollbarState.getSliderPosition()+this._scrollbarState.getSliderSize(),u=this._sliderPointerPosition(i);t<=u&&u<=r?i.button===0&&(i.preventDefault(),this._sliderPointerDown(i)):this._onPointerDown(i)}_onPointerDown(i){let n,t;if(i.target===this.domNode.domNode&&typeof i.offsetX=="number"&&typeof i.offsetY=="number")n=i.offsetX,t=i.offsetY;else{const u=L.getDomNodePagePosition(this.domNode.domNode);n=i.pageX-u.left,t=i.pageY-u.top}const r=this._pointerDownRelativePosition(n,t);this._setDesiredScrollPositionNow(this._scrollByPage?this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(r):this._scrollbarState.getDesiredScrollPositionFromOffset(r)),i.button===0&&(i.preventDefault(),this._sliderPointerDown(i))}_sliderPointerDown(i){if(!i.target||!(i.target instanceof Element))return;const n=this._sliderPointerPosition(i),t=this._sliderOrthogonalPointerPosition(i),r=this._scrollbarState.clone();this.slider.toggleClassName("active",!0),this._pointerMoveMonitor.startMonitoring(i.target,i.pointerId,i.buttons,u=>{const f=this._sliderOrthogonalPointerPosition(u),c=Math.abs(f-t);if(_.isWindows&&c>v){this._setDesiredScrollPositionNow(r.getScrollPosition());return}const s=this._sliderPointerPosition(u)-n;this._setDesiredScrollPositionNow(r.getDesiredScrollPositionFromDelta(s))},()=>{this.slider.toggleClassName("active",!1),this._host.onDragEnd()}),this._host.onDragStart()}_setDesiredScrollPositionNow(i){const n={};this.writeScrollPosition(n,i),this._scrollable.setScrollPositionNow(n)}updateScrollbarSize(i){this._updateScrollbarSize(i),this._scrollbarState.setScrollbarSize(i),this._shouldRender=!0,this._lazyRender||this.render()}isNeeded(){return this._scrollbarState.isNeeded()}}e.AbstractScrollbar=b}),define(se[592],oe([1,0,67,321,226,197,26]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HorizontalScrollbar=void 0;class p extends k.AbstractScrollbar{constructor(v,b,a){const i=v.getScrollDimensions(),n=v.getCurrentScrollPosition();if(super({lazyRender:b.lazyRender,host:a,scrollbarState:new E.ScrollbarState(b.horizontalHasArrows?b.arrowSize:0,b.horizontal===2?0:b.horizontalScrollbarSize,b.vertical===2?0:b.verticalScrollbarSize,i.width,i.scrollWidth,n.scrollLeft),visibility:b.horizontal,extraScrollbarClassName:"horizontal",scrollable:v,scrollByPage:b.scrollByPage}),b.horizontalHasArrows){const t=(b.arrowSize-y.ARROW_IMG_SIZE)/2,r=(b.horizontalScrollbarSize-y.ARROW_IMG_SIZE)/2;this._createArrow({className:"scra",icon:S.Codicon.scrollbarButtonLeft,top:r,left:t,bottom:void 0,right:void 0,bgWidth:b.arrowSize,bgHeight:b.horizontalScrollbarSize,onActivate:()=>this._host.onMouseWheel(new L.StandardWheelEvent(null,1,0))}),this._createArrow({className:"scra",icon:S.Codicon.scrollbarButtonRight,top:r,left:void 0,bottom:void 0,right:t,bgWidth:b.arrowSize,bgHeight:b.horizontalScrollbarSize,onActivate:()=>this._host.onMouseWheel(new L.StandardWheelEvent(null,-1,0))})}this._createSlider(Math.floor((b.horizontalScrollbarSize-b.horizontalSliderSize)/2),0,void 0,b.horizontalSliderSize)}_updateSlider(v,b){this.slider.setWidth(v),this.slider.setLeft(b)}_renderDomNode(v,b){this.domNode.setWidth(v),this.domNode.setHeight(b),this.domNode.setLeft(0),this.domNode.setBottom(0)}onDidScroll(v){return this._shouldRender=this._onElementScrollSize(v.scrollWidth)||this._shouldRender,this._shouldRender=this._onElementScrollPosition(v.scrollLeft)||this._shouldRender,this._shouldRender=this._onElementSize(v.width)||this._shouldRender,this._shouldRender}_pointerDownRelativePosition(v,b){return v}_sliderPointerPosition(v){return v.pageX}_sliderOrthogonalPointerPosition(v){return v.pageY}_updateScrollbarSize(v){this.slider.setHeight(v)}writeScrollPosition(v,b){v.scrollLeft=b}updateOptions(v){this.updateScrollbarSize(v.horizontal===2?0:v.horizontalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(v.vertical===2?0:v.verticalScrollbarSize),this._visibilityController.setVisibility(v.horizontal),this._scrollByPage=v.scrollByPage}}e.HorizontalScrollbar=p}),define(se[593],oe([1,0,67,321,226,197,26]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.VerticalScrollbar=void 0;class p extends k.AbstractScrollbar{constructor(v,b,a){const i=v.getScrollDimensions(),n=v.getCurrentScrollPosition();if(super({lazyRender:b.lazyRender,host:a,scrollbarState:new E.ScrollbarState(b.verticalHasArrows?b.arrowSize:0,b.vertical===2?0:b.verticalScrollbarSize,0,i.height,i.scrollHeight,n.scrollTop),visibility:b.vertical,extraScrollbarClassName:"vertical",scrollable:v,scrollByPage:b.scrollByPage}),b.verticalHasArrows){const t=(b.arrowSize-y.ARROW_IMG_SIZE)/2,r=(b.verticalScrollbarSize-y.ARROW_IMG_SIZE)/2;this._createArrow({className:"scra",icon:S.Codicon.scrollbarButtonUp,top:t,left:r,bottom:void 0,right:void 0,bgWidth:b.verticalScrollbarSize,bgHeight:b.arrowSize,onActivate:()=>this._host.onMouseWheel(new L.StandardWheelEvent(null,0,1))}),this._createArrow({className:"scra",icon:S.Codicon.scrollbarButtonDown,top:void 0,left:r,bottom:t,right:void 0,bgWidth:b.verticalScrollbarSize,bgHeight:b.arrowSize,onActivate:()=>this._host.onMouseWheel(new L.StandardWheelEvent(null,0,-1))})}this._createSlider(0,Math.floor((b.verticalScrollbarSize-b.verticalSliderSize)/2),b.verticalSliderSize,void 0)}_updateSlider(v,b){this.slider.setHeight(v),this.slider.setTop(b)}_renderDomNode(v,b){this.domNode.setWidth(b),this.domNode.setHeight(v),this.domNode.setRight(0),this.domNode.setTop(0)}onDidScroll(v){return this._shouldRender=this._onElementScrollSize(v.scrollHeight)||this._shouldRender,this._shouldRender=this._onElementScrollPosition(v.scrollTop)||this._shouldRender,this._shouldRender=this._onElementSize(v.height)||this._shouldRender,this._shouldRender}_pointerDownRelativePosition(v,b){return b}_sliderPointerPosition(v){return v.pageY}_sliderOrthogonalPointerPosition(v){return v.pageX}_updateScrollbarSize(v){this.slider.setWidth(v)}writeScrollPosition(v,b){v.scrollTop=b}updateOptions(v){this.updateScrollbarSize(v.vertical===2?0:v.verticalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(0),this._visibilityController.setVisibility(v.vertical),this._scrollByPage=v.scrollByPage}}e.VerticalScrollbar=p}),define(se[77],oe([1,0,54,7,40,67,592,593,76,14,6,2,17,147,421]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DomScrollableElement=e.SmoothScrollableElement=e.ScrollableElement=e.AbstractScrollableElement=e.MouseWheelClassifier=void 0;const t=500,r=50,u=!0;class f{constructor(m,C,w){this.timestamp=m,this.deltaX=C,this.deltaY=w,this.score=0}}class c{constructor(){this._capacity=5,this._memory=[],this._front=-1,this._rear=-1}isPhysicalMouseWheel(){if(this._front===-1&&this._rear===-1)return!1;let m=1,C=0,w=1,D=this._rear;do{const I=D===this._front?m:Math.pow(2,-w);if(m-=I,C+=this._memory[D].score*I,D===this._front)break;D=(this._capacity+D-1)%this._capacity,w++}while(!0);return C<=.5}acceptStandardWheelEvent(m){if(L.isChrome){const C=k.getWindow(m.browserEvent),w=(0,L.getZoomFactor)(C);this.accept(Date.now(),m.deltaX*w,m.deltaY*w)}else this.accept(Date.now(),m.deltaX,m.deltaY)}accept(m,C,w){const D=new f(m,C,w);D.score=this._computeScore(D),this._front===-1&&this._rear===-1?(this._memory[0]=D,this._front=0,this._rear=0):(this._rear=(this._rear+1)%this._capacity,this._rear===this._front&&(this._front=(this._front+1)%this._capacity),this._memory[this._rear]=D)}_computeScore(m){if(Math.abs(m.deltaX)>0&&Math.abs(m.deltaY)>0)return 1;let C=.5;const w=this._front===-1&&this._rear===-1?null:this._memory[this._rear];return(!this._isAlmostInt(m.deltaX)||!this._isAlmostInt(m.deltaY))&&(C+=.25),Math.min(Math.max(C,0),1)}_isAlmostInt(m){return Math.abs(Math.round(m)-m)<.01}}e.MouseWheelClassifier=c,c.INSTANCE=new c;class d extends _.Widget{get options(){return this._options}constructor(m,C,w){super(),this._onScroll=this._register(new b.Emitter),this.onScroll=this._onScroll.event,this._onWillScroll=this._register(new b.Emitter),m.style.overflow="hidden",this._options=g(C),this._scrollable=w,this._register(this._scrollable.onScroll(I=>{this._onWillScroll.fire(I),this._onDidScroll(I),this._onScroll.fire(I)}));const D={onMouseWheel:I=>this._onMouseWheel(I),onDragStart:()=>this._onDragStart(),onDragEnd:()=>this._onDragEnd()};this._verticalScrollbar=this._register(new p.VerticalScrollbar(this._scrollable,this._options,D)),this._horizontalScrollbar=this._register(new S.HorizontalScrollbar(this._scrollable,this._options,D)),this._domNode=document.createElement("div"),this._domNode.className="monaco-scrollable-element "+this._options.className,this._domNode.setAttribute("role","presentation"),this._domNode.style.position="relative",this._domNode.style.overflow="hidden",this._domNode.appendChild(m),this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode),this._domNode.appendChild(this._verticalScrollbar.domNode.domNode),this._options.useShadows?(this._leftShadowDomNode=(0,y.createFastDomNode)(document.createElement("div")),this._leftShadowDomNode.setClassName("shadow"),this._domNode.appendChild(this._leftShadowDomNode.domNode),this._topShadowDomNode=(0,y.createFastDomNode)(document.createElement("div")),this._topShadowDomNode.setClassName("shadow"),this._domNode.appendChild(this._topShadowDomNode.domNode),this._topLeftShadowDomNode=(0,y.createFastDomNode)(document.createElement("div")),this._topLeftShadowDomNode.setClassName("shadow"),this._domNode.appendChild(this._topLeftShadowDomNode.domNode)):(this._leftShadowDomNode=null,this._topShadowDomNode=null,this._topLeftShadowDomNode=null),this._listenOnDomNode=this._options.listenOnDomNode||this._domNode,this._mouseWheelToDispose=[],this._setListeningToMouseWheel(this._options.handleMouseWheel),this.onmouseover(this._listenOnDomNode,I=>this._onMouseOver(I)),this.onmouseleave(this._listenOnDomNode,I=>this._onMouseLeave(I)),this._hideTimeout=this._register(new v.TimeoutTimer),this._isDragging=!1,this._mouseIsOver=!1,this._shouldRender=!0,this._revealOnScroll=!0}dispose(){this._mouseWheelToDispose=(0,a.dispose)(this._mouseWheelToDispose),super.dispose()}getDomNode(){return this._domNode}getOverviewRulerLayoutInfo(){return{parent:this._domNode,insertBefore:this._verticalScrollbar.domNode.domNode}}delegateVerticalScrollbarPointerDown(m){this._verticalScrollbar.delegatePointerDown(m)}getScrollDimensions(){return this._scrollable.getScrollDimensions()}setScrollDimensions(m){this._scrollable.setScrollDimensions(m,!1)}updateClassName(m){this._options.className=m,i.isMacintosh&&(this._options.className+=" mac"),this._domNode.className="monaco-scrollable-element "+this._options.className}updateOptions(m){typeof m.handleMouseWheel<"u"&&(this._options.handleMouseWheel=m.handleMouseWheel,this._setListeningToMouseWheel(this._options.handleMouseWheel)),typeof m.mouseWheelScrollSensitivity<"u"&&(this._options.mouseWheelScrollSensitivity=m.mouseWheelScrollSensitivity),typeof m.fastScrollSensitivity<"u"&&(this._options.fastScrollSensitivity=m.fastScrollSensitivity),typeof m.scrollPredominantAxis<"u"&&(this._options.scrollPredominantAxis=m.scrollPredominantAxis),typeof m.horizontal<"u"&&(this._options.horizontal=m.horizontal),typeof m.vertical<"u"&&(this._options.vertical=m.vertical),typeof m.horizontalScrollbarSize<"u"&&(this._options.horizontalScrollbarSize=m.horizontalScrollbarSize),typeof m.verticalScrollbarSize<"u"&&(this._options.verticalScrollbarSize=m.verticalScrollbarSize),typeof m.scrollByPage<"u"&&(this._options.scrollByPage=m.scrollByPage),this._horizontalScrollbar.updateOptions(this._options),this._verticalScrollbar.updateOptions(this._options),this._options.lazyRender||this._render()}delegateScrollFromMouseWheelEvent(m){this._onMouseWheel(new E.StandardWheelEvent(m))}_setListeningToMouseWheel(m){if(this._mouseWheelToDispose.length>0!==m&&(this._mouseWheelToDispose=(0,a.dispose)(this._mouseWheelToDispose),m)){const w=D=>{this._onMouseWheel(new E.StandardWheelEvent(D))};this._mouseWheelToDispose.push(k.addDisposableListener(this._listenOnDomNode,k.EventType.MOUSE_WHEEL,w,{passive:!1}))}}_onMouseWheel(m){var C;if(!((C=m.browserEvent)===null||C===void 0)&&C.defaultPrevented)return;const w=c.INSTANCE;u&&w.acceptStandardWheelEvent(m);let D=!1;if(m.deltaY||m.deltaX){let T=m.deltaY*this._options.mouseWheelScrollSensitivity,A=m.deltaX*this._options.mouseWheelScrollSensitivity;this._options.scrollPredominantAxis&&(this._options.scrollYToX&&A+T===0?A=T=0:Math.abs(T)>=Math.abs(A)?A=0:T=0),this._options.flipAxes&&([T,A]=[A,T]);const P=!i.isMacintosh&&m.browserEvent&&m.browserEvent.shiftKey;(this._options.scrollYToX||P)&&!A&&(A=T,T=0),m.browserEvent&&m.browserEvent.altKey&&(A=A*this._options.fastScrollSensitivity,T=T*this._options.fastScrollSensitivity);const N=this._scrollable.getFutureScrollPosition();let M={};if(T){const R=r*T,x=N.scrollTop-(R<0?Math.floor(R):Math.ceil(R));this._verticalScrollbar.writeScrollPosition(M,x)}if(A){const R=r*A,x=N.scrollLeft-(R<0?Math.floor(R):Math.ceil(R));this._horizontalScrollbar.writeScrollPosition(M,x)}M=this._scrollable.validateScrollPosition(M),(N.scrollLeft!==M.scrollLeft||N.scrollTop!==M.scrollTop)&&(u&&this._options.mouseWheelSmoothScroll&&w.isPhysicalMouseWheel()?this._scrollable.setScrollPositionSmooth(M):this._scrollable.setScrollPositionNow(M),D=!0)}let I=D;!I&&this._options.alwaysConsumeMouseWheel&&(I=!0),!I&&this._options.consumeMouseWheelIfScrollbarIsNeeded&&(this._verticalScrollbar.isNeeded()||this._horizontalScrollbar.isNeeded())&&(I=!0),I&&(m.preventDefault(),m.stopPropagation())}_onDidScroll(m){this._shouldRender=this._horizontalScrollbar.onDidScroll(m)||this._shouldRender,this._shouldRender=this._verticalScrollbar.onDidScroll(m)||this._shouldRender,this._options.useShadows&&(this._shouldRender=!0),this._revealOnScroll&&this._reveal(),this._options.lazyRender||this._render()}renderNow(){if(!this._options.lazyRender)throw new Error("Please use `lazyRender` together with `renderNow`!");this._render()}_render(){if(this._shouldRender&&(this._shouldRender=!1,this._horizontalScrollbar.render(),this._verticalScrollbar.render(),this._options.useShadows)){const m=this._scrollable.getCurrentScrollPosition(),C=m.scrollTop>0,w=m.scrollLeft>0,D=w?" left":"",I=C?" top":"",T=w||C?" top-left-corner":"";this._leftShadowDomNode.setClassName(`shadow${D}`),this._topShadowDomNode.setClassName(`shadow${I}`),this._topLeftShadowDomNode.setClassName(`shadow${T}${I}${D}`)}}_onDragStart(){this._isDragging=!0,this._reveal()}_onDragEnd(){this._isDragging=!1,this._hide()}_onMouseLeave(m){this._mouseIsOver=!1,this._hide()}_onMouseOver(m){this._mouseIsOver=!0,this._reveal()}_reveal(){this._verticalScrollbar.beginReveal(),this._horizontalScrollbar.beginReveal(),this._scheduleHide()}_hide(){!this._mouseIsOver&&!this._isDragging&&(this._verticalScrollbar.beginHide(),this._horizontalScrollbar.beginHide())}_scheduleHide(){!this._mouseIsOver&&!this._isDragging&&this._hideTimeout.cancelAndSet(()=>this._hide(),t)}}e.AbstractScrollableElement=d;class s extends d{constructor(m,C){C=C||{},C.mouseWheelSmoothScroll=!1;const w=new n.Scrollable({forceIntegerValues:!0,smoothScrollDuration:0,scheduleAtNextAnimationFrame:D=>k.scheduleAtNextAnimationFrame(k.getWindow(m),D)});super(m,C,w),this._register(w)}setScrollPosition(m){this._scrollable.setScrollPositionNow(m)}}e.ScrollableElement=s;class l extends d{constructor(m,C,w){super(m,C,w)}setScrollPosition(m){m.reuseAnimation?this._scrollable.setScrollPositionSmooth(m,m.reuseAnimation):this._scrollable.setScrollPositionNow(m)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}}e.SmoothScrollableElement=l;class o extends d{constructor(m,C){C=C||{},C.mouseWheelSmoothScroll=!1;const w=new n.Scrollable({forceIntegerValues:!1,smoothScrollDuration:0,scheduleAtNextAnimationFrame:D=>k.scheduleAtNextAnimationFrame(k.getWindow(m),D)});super(m,C,w),this._register(w),this._element=m,this._register(this.onScroll(D=>{D.scrollTopChanged&&(this._element.scrollTop=D.scrollTop),D.scrollLeftChanged&&(this._element.scrollLeft=D.scrollLeft)})),this.scanDomNode()}setScrollPosition(m){this._scrollable.setScrollPositionNow(m)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}scanDomNode(){this.setScrollDimensions({width:this._element.clientWidth,scrollWidth:this._element.scrollWidth,height:this._element.clientHeight,scrollHeight:this._element.scrollHeight}),this.setScrollPosition({scrollLeft:this._element.scrollLeft,scrollTop:this._element.scrollTop})}}e.DomScrollableElement=o;function g(h){const m={lazyRender:typeof h.lazyRender<"u"?h.lazyRender:!1,className:typeof h.className<"u"?h.className:"",useShadows:typeof h.useShadows<"u"?h.useShadows:!0,handleMouseWheel:typeof h.handleMouseWheel<"u"?h.handleMouseWheel:!0,flipAxes:typeof h.flipAxes<"u"?h.flipAxes:!1,consumeMouseWheelIfScrollbarIsNeeded:typeof h.consumeMouseWheelIfScrollbarIsNeeded<"u"?h.consumeMouseWheelIfScrollbarIsNeeded:!1,alwaysConsumeMouseWheel:typeof h.alwaysConsumeMouseWheel<"u"?h.alwaysConsumeMouseWheel:!1,scrollYToX:typeof h.scrollYToX<"u"?h.scrollYToX:!1,mouseWheelScrollSensitivity:typeof h.mouseWheelScrollSensitivity<"u"?h.mouseWheelScrollSensitivity:1,fastScrollSensitivity:typeof h.fastScrollSensitivity<"u"?h.fastScrollSensitivity:5,scrollPredominantAxis:typeof h.scrollPredominantAxis<"u"?h.scrollPredominantAxis:!0,mouseWheelSmoothScroll:typeof h.mouseWheelSmoothScroll<"u"?h.mouseWheelSmoothScroll:!0,arrowSize:typeof h.arrowSize<"u"?h.arrowSize:11,listenOnDomNode:typeof h.listenOnDomNode<"u"?h.listenOnDomNode:null,horizontal:typeof h.horizontal<"u"?h.horizontal:1,horizontalScrollbarSize:typeof h.horizontalScrollbarSize<"u"?h.horizontalScrollbarSize:10,horizontalSliderSize:typeof h.horizontalSliderSize<"u"?h.horizontalSliderSize:0,horizontalHasArrows:typeof h.horizontalHasArrows<"u"?h.horizontalHasArrows:!1,vertical:typeof h.vertical<"u"?h.vertical:1,verticalScrollbarSize:typeof h.verticalScrollbarSize<"u"?h.verticalScrollbarSize:10,verticalHasArrows:typeof h.verticalHasArrows<"u"?h.verticalHasArrows:!1,verticalSliderSize:typeof h.verticalSliderSize<"u"?h.verticalSliderSize:0,scrollByPage:typeof h.scrollByPage<"u"?h.scrollByPage:!1};return m.horizontalSliderSize=typeof h.horizontalSliderSize<"u"?h.horizontalSliderSize:m.horizontalScrollbarSize,m.verticalSliderSize=typeof h.verticalSliderSize<"u"?h.verticalSliderSize:m.verticalScrollbarSize,i.isMacintosh&&(m.className+=" mac"),m}}),define(se[227],oe([1,0,7,46,77,2,570,414]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getHoverAccessibleViewHint=e.HoverAction=e.HoverWidget=void 0;const p=L.$;class _ extends E.Disposable{constructor(){super(),this.containerDomNode=document.createElement("div"),this.containerDomNode.className="monaco-hover",this.containerDomNode.tabIndex=0,this.containerDomNode.setAttribute("role","tooltip"),this.contentsDomNode=document.createElement("div"),this.contentsDomNode.className="monaco-hover-content",this.scrollbar=this._register(new y.DomScrollableElement(this.contentsDomNode,{consumeMouseWheelIfScrollbarIsNeeded:!0})),this.containerDomNode.appendChild(this.scrollbar.getDomNode())}onContentsChanged(){this.scrollbar.scanDomNode()}}e.HoverWidget=_;class v extends E.Disposable{static render(i,n,t){return new v(i,n,t)}constructor(i,n,t){super(),this.actionContainer=L.append(i,p("div.action-container")),this.actionContainer.setAttribute("tabindex","0"),this.action=L.append(this.actionContainer,p("a.action")),this.action.setAttribute("role","button"),n.iconClass&&L.append(this.action,p(`span.icon.${n.iconClass}`));const r=L.append(this.action,p("span"));r.textContent=t?`${n.label} (${t})`:n.label,this._register(L.addDisposableListener(this.actionContainer,L.EventType.CLICK,u=>{u.stopPropagation(),u.preventDefault(),n.run(this.actionContainer)})),this._register(L.addDisposableListener(this.actionContainer,L.EventType.KEY_DOWN,u=>{const f=new k.StandardKeyboardEvent(u);(f.equals(3)||f.equals(10))&&(u.stopPropagation(),u.preventDefault(),n.run(this.actionContainer))})),this.setEnabled(!0)}setEnabled(i){i?(this.actionContainer.classList.remove("disabled"),this.actionContainer.removeAttribute("aria-disabled")):(this.actionContainer.classList.add("disabled"),this.actionContainer.setAttribute("aria-disabled","true"))}}e.HoverAction=v;function b(a,i){return a&&i?(0,S.localize)(0,null,i):a?(0,S.localize)(1,null):""}e.getHoverAccessibleViewHint=b}),define(se[228],oe([1,0,198,7,84,63,77,13,14,107,6,2,172,147,405,589,12]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ListView=e.NativeDragAndDropData=e.ExternalElementsDragAndDropData=e.ElementsDragAndDropData=void 0;const f={CurrentDragAndDropData:void 0},c={useShadows:!0,verticalScrollMode:1,setRowLineHeight:!0,setRowHeight:!0,supportDynamicHeights:!1,dnd:{getDragElements(m){return[m]},getDragURI(){return null},onDragStart(){},onDragOver(){return!1},drop(){},dispose(){}},horizontalScrolling:!1,transformOptimization:!0,alwaysConsumeMouseWheel:!0};class d{constructor(C){this.elements=C}update(){}getData(){return this.elements}}e.ElementsDragAndDropData=d;class s{constructor(C){this.elements=C}update(){}getData(){return this.elements}}e.ExternalElementsDragAndDropData=s;class l{constructor(){this.types=[],this.files=[]}update(C){if(C.types&&this.types.splice(0,this.types.length,...C.types),C.files){this.files.splice(0,this.files.length);for(let w=0;w<C.files.length;w++){const D=C.files.item(w);D&&(D.size||D.type)&&this.files.push(D)}}}getData(){return{types:this.types,files:this.files}}}e.NativeDragAndDropData=l;function o(m,C){return Array.isArray(m)&&Array.isArray(C)?(0,p.equals)(m,C):m===C}class g{constructor(C){C?.getSetSize?this.getSetSize=C.getSetSize.bind(C):this.getSetSize=(w,D,I)=>I,C?.getPosInSet?this.getPosInSet=C.getPosInSet.bind(C):this.getPosInSet=(w,D)=>D+1,C?.getRole?this.getRole=C.getRole.bind(C):this.getRole=w=>"listitem",C?.isChecked?this.isChecked=C.isChecked.bind(C):this.isChecked=w=>{}}}class h{get contentHeight(){return this.rangeMap.size}get onDidScroll(){return this.scrollableElement.onScroll}get scrollableElementDomNode(){return this.scrollableElement.getDomNode()}get horizontalScrolling(){return this._horizontalScrolling}set horizontalScrolling(C){if(C!==this._horizontalScrolling){if(C&&this.supportDynamicHeights)throw new Error("Horizontal scrolling and dynamic heights not supported simultaneously");if(this._horizontalScrolling=C,this.domNode.classList.toggle("horizontal-scrolling",this._horizontalScrolling),this._horizontalScrolling){for(const w of this.items)this.measureItemWidth(w);this.updateScrollWidth(),this.scrollableElement.setScrollDimensions({width:(0,k.getContentWidth)(this.domNode)}),this.rowsContainer.style.width=`${Math.max(this.scrollWidth||0,this.renderWidth)}px`}else this.scrollableElementWidthDelayer.cancel(),this.scrollableElement.setScrollDimensions({width:this.renderWidth,scrollWidth:this.renderWidth}),this.rowsContainer.style.width=""}}constructor(C,w,D,I=c){var T,A,P,N,M,R,x,O,B,W,V,K,F;if(this.virtualDelegate=w,this.domId=`list_id_${++h.InstanceCount}`,this.renderers=new Map,this.renderWidth=0,this._scrollHeight=0,this.scrollableElementUpdateDisposable=null,this.scrollableElementWidthDelayer=new _.Delayer(50),this.splicing=!1,this.dragOverAnimationStopDisposable=a.Disposable.None,this.dragOverMouseY=0,this.canDrop=!1,this.currentDragFeedbackDisposable=a.Disposable.None,this.onDragLeaveTimeout=a.Disposable.None,this.disposables=new a.DisposableStore,this._onDidChangeContentHeight=new b.Emitter,this._onDidChangeContentWidth=new b.Emitter,this.onDidChangeContentHeight=b.Event.latch(this._onDidChangeContentHeight.event,void 0,this.disposables),this._horizontalScrolling=!1,I.horizontalScrolling&&I.supportDynamicHeights)throw new Error("Horizontal scrolling and dynamic heights not supported simultaneously");this.items=[],this.itemId=0,this.rangeMap=new t.RangeMap((T=I.paddingTop)!==null&&T!==void 0?T:0);for(const ie of D)this.renderers.set(ie.templateId,ie);this.cache=this.disposables.add(new r.RowCache(this.renderers)),this.lastRenderTop=0,this.lastRenderHeight=0,this.domNode=document.createElement("div"),this.domNode.className="monaco-list",this.domNode.classList.add(this.domId),this.domNode.tabIndex=0,this.domNode.classList.toggle("mouse-support",typeof I.mouseSupport=="boolean"?I.mouseSupport:!0),this._horizontalScrolling=(A=I.horizontalScrolling)!==null&&A!==void 0?A:c.horizontalScrolling,this.domNode.classList.toggle("horizontal-scrolling",this._horizontalScrolling),this.paddingBottom=typeof I.paddingBottom>"u"?0:I.paddingBottom,this.accessibilityProvider=new g(I.accessibilityProvider),this.rowsContainer=document.createElement("div"),this.rowsContainer.className="monaco-list-rows",((P=I.transformOptimization)!==null&&P!==void 0?P:c.transformOptimization)&&(this.rowsContainer.style.transform="translate3d(0px, 0px, 0px)",this.rowsContainer.style.overflow="hidden",this.rowsContainer.style.contain="strict"),this.disposables.add(E.Gesture.addTarget(this.rowsContainer)),this.scrollable=this.disposables.add(new n.Scrollable({forceIntegerValues:!0,smoothScrollDuration:(N=I.smoothScrolling)!==null&&N!==void 0&&N?125:0,scheduleAtNextAnimationFrame:ie=>(0,k.scheduleAtNextAnimationFrame)((0,k.getWindow)(this.domNode),ie)})),this.scrollableElement=this.disposables.add(new S.SmoothScrollableElement(this.rowsContainer,{alwaysConsumeMouseWheel:(M=I.alwaysConsumeMouseWheel)!==null&&M!==void 0?M:c.alwaysConsumeMouseWheel,horizontal:1,vertical:(R=I.verticalScrollMode)!==null&&R!==void 0?R:c.verticalScrollMode,useShadows:(x=I.useShadows)!==null&&x!==void 0?x:c.useShadows,mouseWheelScrollSensitivity:I.mouseWheelScrollSensitivity,fastScrollSensitivity:I.fastScrollSensitivity,scrollByPage:I.scrollByPage},this.scrollable)),this.domNode.appendChild(this.scrollableElement.getDomNode()),C.appendChild(this.domNode),this.scrollableElement.onScroll(this.onScroll,this,this.disposables),this.disposables.add((0,k.addDisposableListener)(this.rowsContainer,E.EventType.Change,ie=>this.onTouchChange(ie))),this.disposables.add((0,k.addDisposableListener)(this.scrollableElement.getDomNode(),"scroll",ie=>ie.target.scrollTop=0)),this.disposables.add((0,k.addDisposableListener)(this.domNode,"dragover",ie=>this.onDragOver(this.toDragEvent(ie)))),this.disposables.add((0,k.addDisposableListener)(this.domNode,"drop",ie=>this.onDrop(this.toDragEvent(ie)))),this.disposables.add((0,k.addDisposableListener)(this.domNode,"dragleave",ie=>this.onDragLeave(this.toDragEvent(ie)))),this.disposables.add((0,k.addDisposableListener)(this.domNode,"dragend",ie=>this.onDragEnd(ie))),this.setRowLineHeight=(O=I.setRowLineHeight)!==null&&O!==void 0?O:c.setRowLineHeight,this.setRowHeight=(B=I.setRowHeight)!==null&&B!==void 0?B:c.setRowHeight,this.supportDynamicHeights=(W=I.supportDynamicHeights)!==null&&W!==void 0?W:c.supportDynamicHeights,this.dnd=(V=I.dnd)!==null&&V!==void 0?V:this.disposables.add(c.dnd),this.layout((K=I.initialSize)===null||K===void 0?void 0:K.height,(F=I.initialSize)===null||F===void 0?void 0:F.width)}updateOptions(C){C.paddingBottom!==void 0&&(this.paddingBottom=C.paddingBottom,this.scrollableElement.setScrollDimensions({scrollHeight:this.scrollHeight})),C.smoothScrolling!==void 0&&this.scrollable.setSmoothScrollDuration(C.smoothScrolling?125:0),C.horizontalScrolling!==void 0&&(this.horizontalScrolling=C.horizontalScrolling);let w;if(C.scrollByPage!==void 0&&(w={...w??{},scrollByPage:C.scrollByPage}),C.mouseWheelScrollSensitivity!==void 0&&(w={...w??{},mouseWheelScrollSensitivity:C.mouseWheelScrollSensitivity}),C.fastScrollSensitivity!==void 0&&(w={...w??{},fastScrollSensitivity:C.fastScrollSensitivity}),w&&this.scrollableElement.updateOptions(w),C.paddingTop!==void 0&&C.paddingTop!==this.rangeMap.paddingTop){const D=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight),I=C.paddingTop-this.rangeMap.paddingTop;this.rangeMap.paddingTop=C.paddingTop,this.render(D,Math.max(0,this.lastRenderTop+I),this.lastRenderHeight,void 0,void 0,!0),this.setScrollTop(this.lastRenderTop),this.eventuallyUpdateScrollDimensions(),this.supportDynamicHeights&&this._rerender(this.lastRenderTop,this.lastRenderHeight)}}splice(C,w,D=[]){if(this.splicing)throw new Error("Can't run recursive splices.");this.splicing=!0;try{return this._splice(C,w,D)}finally{this.splicing=!1,this._onDidChangeContentHeight.fire(this.contentHeight)}}_splice(C,w,D=[]){const I=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight),T={start:C,end:C+w},A=i.Range.intersect(I,T),P=new Map;for(let $=A.end-1;$>=A.start;$--){const J=this.items[$];if(J.dragStartDisposable.dispose(),J.checkedDisposable.dispose(),J.row){let Q=P.get(J.templateId);Q||(Q=[],P.set(J.templateId,Q));const re=this.renderers.get(J.templateId);re&&re.disposeElement&&re.disposeElement(J.element,$,J.row.templateData,J.size),Q.push(J.row)}J.row=null}const N={start:C+w,end:this.items.length},M=i.Range.intersect(N,I),R=i.Range.relativeComplement(N,I),x=D.map($=>({id:String(this.itemId++),element:$,templateId:this.virtualDelegate.getTemplateId($),size:this.virtualDelegate.getHeight($),width:void 0,hasDynamicHeight:!!this.virtualDelegate.hasDynamicHeight&&this.virtualDelegate.hasDynamicHeight($),lastDynamicHeightWidth:void 0,row:null,uri:void 0,dropTarget:!1,dragStartDisposable:a.Disposable.None,checkedDisposable:a.Disposable.None}));let O;C===0&&w>=this.items.length?(this.rangeMap=new t.RangeMap(this.rangeMap.paddingTop),this.rangeMap.splice(0,0,x),O=this.items,this.items=x):(this.rangeMap.splice(C,w,x),O=this.items.splice(C,w,...x));const B=D.length-w,W=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight),V=(0,t.shift)(M,B),K=i.Range.intersect(W,V);for(let $=K.start;$<K.end;$++)this.updateItemInDOM(this.items[$],$);const F=i.Range.relativeComplement(V,W);for(const $ of F)for(let J=$.start;J<$.end;J++)this.removeItemFromDOM(J);const q=R.map($=>(0,t.shift)($,B)),ae=[{start:C,end:C+D.length},...q].map($=>i.Range.intersect(W,$)),ne=this.getNextToLastElement(ae);for(const $ of ae)for(let J=$.start;J<$.end;J++){const Q=this.items[J],re=P.get(Q.templateId),de=re?.pop();this.insertItemInDOM(J,ne,de)}for(const $ of P.values())for(const J of $)this.cache.release(J);return this.eventuallyUpdateScrollDimensions(),this.supportDynamicHeights&&this._rerender(this.scrollTop,this.renderHeight),O.map($=>$.element)}eventuallyUpdateScrollDimensions(){this._scrollHeight=this.contentHeight,this.rowsContainer.style.height=`${this._scrollHeight}px`,this.scrollableElementUpdateDisposable||(this.scrollableElementUpdateDisposable=(0,k.scheduleAtNextAnimationFrame)((0,k.getWindow)(this.domNode),()=>{this.scrollableElement.setScrollDimensions({scrollHeight:this.scrollHeight}),this.updateScrollWidth(),this.scrollableElementUpdateDisposable=null}))}eventuallyUpdateScrollWidth(){if(!this.horizontalScrolling){this.scrollableElementWidthDelayer.cancel();return}this.scrollableElementWidthDelayer.trigger(()=>this.updateScrollWidth())}updateScrollWidth(){if(!this.horizontalScrolling)return;let C=0;for(const w of this.items)typeof w.width<"u"&&(C=Math.max(C,w.width));this.scrollWidth=C,this.scrollableElement.setScrollDimensions({scrollWidth:C===0?0:C+10}),this._onDidChangeContentWidth.fire(this.scrollWidth)}rerender(){if(this.supportDynamicHeights){for(const C of this.items)C.lastDynamicHeightWidth=void 0;this._rerender(this.lastRenderTop,this.lastRenderHeight)}}get length(){return this.items.length}get renderHeight(){return this.scrollableElement.getScrollDimensions().height}get firstVisibleIndex(){return this.getRenderRange(this.lastRenderTop,this.lastRenderHeight).start}element(C){return this.items[C].element}indexOf(C){return this.items.findIndex(w=>w.element===C)}domElement(C){const w=this.items[C].row;return w&&w.domNode}elementHeight(C){return this.items[C].size}elementTop(C){return this.rangeMap.positionAt(C)}indexAt(C){return this.rangeMap.indexAt(C)}indexAfter(C){return this.rangeMap.indexAfter(C)}layout(C,w){const D={height:typeof C=="number"?C:(0,k.getContentHeight)(this.domNode)};this.scrollableElementUpdateDisposable&&(this.scrollableElementUpdateDisposable.dispose(),this.scrollableElementUpdateDisposable=null,D.scrollHeight=this.scrollHeight),this.scrollableElement.setScrollDimensions(D),typeof w<"u"&&(this.renderWidth=w,this.supportDynamicHeights&&this._rerender(this.scrollTop,this.renderHeight)),this.horizontalScrolling&&this.scrollableElement.setScrollDimensions({width:typeof w=="number"?w:(0,k.getContentWidth)(this.domNode)})}render(C,w,D,I,T,A=!1){const P=this.getRenderRange(w,D),N=i.Range.relativeComplement(P,C),M=i.Range.relativeComplement(C,P),R=this.getNextToLastElement(N);if(A){const x=i.Range.intersect(C,P);for(let O=x.start;O<x.end;O++)this.updateItemInDOM(this.items[O],O)}this.cache.transact(()=>{for(const x of M)for(let O=x.start;O<x.end;O++)this.removeItemFromDOM(O);for(const x of N)for(let O=x.start;O<x.end;O++)this.insertItemInDOM(O,R)}),I!==void 0&&(this.rowsContainer.style.left=`-${I}px`),this.rowsContainer.style.top=`-${w}px`,this.horizontalScrolling&&T!==void 0&&(this.rowsContainer.style.width=`${Math.max(T,this.renderWidth)}px`),this.lastRenderTop=w,this.lastRenderHeight=D}insertItemInDOM(C,w,D){const I=this.items[C];let T=!1;if(!I.row)if(D)I.row=D;else{const R=this.cache.alloc(I.templateId);I.row=R.row,T=R.isReusingConnectedDomNode}const A=this.accessibilityProvider.getRole(I.element)||"listitem";I.row.domNode.setAttribute("role",A);const P=this.accessibilityProvider.isChecked(I.element);if(typeof P=="boolean")I.row.domNode.setAttribute("aria-checked",String(!!P));else if(P){const R=x=>I.row.domNode.setAttribute("aria-checked",String(!!x));R(P.value),I.checkedDisposable=P.onDidChange(R)}(T||!I.row.domNode.parentElement)&&(w?this.rowsContainer.insertBefore(I.row.domNode,w):this.rowsContainer.appendChild(I.row.domNode)),this.updateItemInDOM(I,C);const N=this.renderers.get(I.templateId);if(!N)throw new Error(`No renderer found for template id ${I.templateId}`);N?.renderElement(I.element,C,I.row.templateData,I.size);const M=this.dnd.getDragURI(I.element);I.dragStartDisposable.dispose(),I.row.domNode.draggable=!!M,M&&(I.dragStartDisposable=(0,k.addDisposableListener)(I.row.domNode,"dragstart",R=>this.onDragStart(I.element,M,R))),this.horizontalScrolling&&(this.measureItemWidth(I),this.eventuallyUpdateScrollWidth())}measureItemWidth(C){if(!C.row||!C.row.domNode)return;C.row.domNode.style.width="fit-content",C.width=(0,k.getContentWidth)(C.row.domNode);const w=(0,k.getWindow)(C.row.domNode).getComputedStyle(C.row.domNode);w.paddingLeft&&(C.width+=parseFloat(w.paddingLeft)),w.paddingRight&&(C.width+=parseFloat(w.paddingRight)),C.row.domNode.style.width=""}updateItemInDOM(C,w){C.row.domNode.style.top=`${this.elementTop(w)}px`,this.setRowHeight&&(C.row.domNode.style.height=`${C.size}px`),this.setRowLineHeight&&(C.row.domNode.style.lineHeight=`${C.size}px`),C.row.domNode.setAttribute("data-index",`${w}`),C.row.domNode.setAttribute("data-last-element",w===this.length-1?"true":"false"),C.row.domNode.setAttribute("data-parity",w%2===0?"even":"odd"),C.row.domNode.setAttribute("aria-setsize",String(this.accessibilityProvider.getSetSize(C.element,w,this.length))),C.row.domNode.setAttribute("aria-posinset",String(this.accessibilityProvider.getPosInSet(C.element,w))),C.row.domNode.setAttribute("id",this.getElementDomId(w)),C.row.domNode.classList.toggle("drop-target",C.dropTarget)}removeItemFromDOM(C){const w=this.items[C];if(w.dragStartDisposable.dispose(),w.checkedDisposable.dispose(),w.row){const D=this.renderers.get(w.templateId);D&&D.disposeElement&&D.disposeElement(w.element,C,w.row.templateData,w.size),this.cache.release(w.row),w.row=null}this.horizontalScrolling&&this.eventuallyUpdateScrollWidth()}getScrollTop(){return this.scrollableElement.getScrollPosition().scrollTop}setScrollTop(C,w){this.scrollableElementUpdateDisposable&&(this.scrollableElementUpdateDisposable.dispose(),this.scrollableElementUpdateDisposable=null,this.scrollableElement.setScrollDimensions({scrollHeight:this.scrollHeight})),this.scrollableElement.setScrollPosition({scrollTop:C,reuseAnimation:w})}get scrollTop(){return this.getScrollTop()}set scrollTop(C){this.setScrollTop(C)}get scrollHeight(){return this._scrollHeight+(this.horizontalScrolling?10:0)+this.paddingBottom}get onMouseClick(){return b.Event.map(this.disposables.add(new y.DomEmitter(this.domNode,"click")).event,C=>this.toMouseEvent(C),this.disposables)}get onMouseDblClick(){return b.Event.map(this.disposables.add(new y.DomEmitter(this.domNode,"dblclick")).event,C=>this.toMouseEvent(C),this.disposables)}get onMouseMiddleClick(){return b.Event.filter(b.Event.map(this.disposables.add(new y.DomEmitter(this.domNode,"auxclick")).event,C=>this.toMouseEvent(C),this.disposables),C=>C.browserEvent.button===1,this.disposables)}get onMouseDown(){return b.Event.map(this.disposables.add(new y.DomEmitter(this.domNode,"mousedown")).event,C=>this.toMouseEvent(C),this.disposables)}get onMouseOver(){return b.Event.map(this.disposables.add(new y.DomEmitter(this.domNode,"mouseover")).event,C=>this.toMouseEvent(C),this.disposables)}get onMouseOut(){return b.Event.map(this.disposables.add(new y.DomEmitter(this.domNode,"mouseout")).event,C=>this.toMouseEvent(C),this.disposables)}get onContextMenu(){return b.Event.any(b.Event.map(this.disposables.add(new y.DomEmitter(this.domNode,"contextmenu")).event,C=>this.toMouseEvent(C),this.disposables),b.Event.map(this.disposables.add(new y.DomEmitter(this.domNode,E.EventType.Contextmenu)).event,C=>this.toGestureEvent(C),this.disposables))}get onTouchStart(){return b.Event.map(this.disposables.add(new y.DomEmitter(this.domNode,"touchstart")).event,C=>this.toTouchEvent(C),this.disposables)}get onTap(){return b.Event.map(this.disposables.add(new y.DomEmitter(this.rowsContainer,E.EventType.Tap)).event,C=>this.toGestureEvent(C),this.disposables)}toMouseEvent(C){const w=this.getItemIndexFromEventTarget(C.target||null),D=typeof w>"u"?void 0:this.items[w],I=D&&D.element;return{browserEvent:C,index:w,element:I}}toTouchEvent(C){const w=this.getItemIndexFromEventTarget(C.target||null),D=typeof w>"u"?void 0:this.items[w],I=D&&D.element;return{browserEvent:C,index:w,element:I}}toGestureEvent(C){const w=this.getItemIndexFromEventTarget(C.initialTarget||null),D=typeof w>"u"?void 0:this.items[w],I=D&&D.element;return{browserEvent:C,index:w,element:I}}toDragEvent(C){const w=this.getItemIndexFromEventTarget(C.target||null),D=typeof w>"u"?void 0:this.items[w],I=D&&D.element,T=this.getTargetSector(C,w);return{browserEvent:C,index:w,element:I,sector:T}}onScroll(C){try{const w=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight);this.render(w,C.scrollTop,C.height,C.scrollLeft,C.scrollWidth),this.supportDynamicHeights&&this._rerender(C.scrollTop,C.height,C.inSmoothScrolling)}catch(w){throw console.error("Got bad scroll event:",C),w}}onTouchChange(C){C.preventDefault(),C.stopPropagation(),this.scrollTop-=C.translationY}onDragStart(C,w,D){var I,T;if(!D.dataTransfer)return;const A=this.dnd.getDragElements(C);if(D.dataTransfer.effectAllowed="copyMove",D.dataTransfer.setData(L.DataTransfers.TEXT,w),D.dataTransfer.setDragImage){let P;this.dnd.getDragLabel&&(P=this.dnd.getDragLabel(A,D)),typeof P>"u"&&(P=String(A.length));const N=(0,k.$)(".monaco-drag-image");N.textContent=P;const R=(x=>{for(;x&&!x.classList.contains("monaco-workbench");)x=x.parentElement;return x||this.domNode.ownerDocument})(this.domNode);R.appendChild(N),D.dataTransfer.setDragImage(N,-10,-10),setTimeout(()=>R.removeChild(N),0)}this.domNode.classList.add("dragging"),this.currentDragData=new d(A),f.CurrentDragAndDropData=new s(A),(T=(I=this.dnd).onDragStart)===null||T===void 0||T.call(I,this.currentDragData,D)}onDragOver(C){var w,D;if(C.browserEvent.preventDefault(),this.onDragLeaveTimeout.dispose(),f.CurrentDragAndDropData&&f.CurrentDragAndDropData.getData()==="vscode-ui"||(this.setupDragAndDropScrollTopAnimation(C.browserEvent),!C.browserEvent.dataTransfer))return!1;if(!this.currentDragData)if(f.CurrentDragAndDropData)this.currentDragData=f.CurrentDragAndDropData;else{if(!C.browserEvent.dataTransfer.types)return!1;this.currentDragData=new l}const I=this.dnd.onDragOver(this.currentDragData,C.element,C.index,C.sector,C.browserEvent);if(this.canDrop=typeof I=="boolean"?I:I.accept,!this.canDrop)return this.currentDragFeedback=void 0,this.currentDragFeedbackDisposable.dispose(),!1;C.browserEvent.dataTransfer.dropEffect=typeof I!="boolean"&&((w=I.effect)===null||w===void 0?void 0:w.type)===0?"copy":"move";let T;typeof I!="boolean"&&I.feedback?T=I.feedback:typeof C.index>"u"?T=[-1]:T=[C.index],T=(0,p.distinct)(T).filter(P=>P>=-1&&P<this.length).sort((P,N)=>P-N),T=T[0]===-1?[-1]:T;let A=typeof I!="boolean"&&I.effect&&I.effect.position?I.effect.position:"drop-target";if(o(this.currentDragFeedback,T)&&this.currentDragFeedbackPosition===A)return!0;if(this.currentDragFeedback=T,this.currentDragFeedbackPosition=A,this.currentDragFeedbackDisposable.dispose(),T[0]===-1)this.domNode.classList.add(A),this.rowsContainer.classList.add(A),this.currentDragFeedbackDisposable=(0,a.toDisposable)(()=>{this.domNode.classList.remove(A),this.rowsContainer.classList.remove(A)});else{if(T.length>1&&A!=="drop-target")throw new Error("Can't use multiple feedbacks with position different than 'over'");A==="drop-target-after"&&T[0]<this.length-1&&(T[0]+=1,A="drop-target-before");for(const P of T){const N=this.items[P];N.dropTarget=!0,(D=N.row)===null||D===void 0||D.domNode.classList.add(A)}this.currentDragFeedbackDisposable=(0,a.toDisposable)(()=>{var P;for(const N of T){const M=this.items[N];M.dropTarget=!1,(P=M.row)===null||P===void 0||P.domNode.classList.remove(A)}})}return!0}onDragLeave(C){var w,D;this.onDragLeaveTimeout.dispose(),this.onDragLeaveTimeout=(0,_.disposableTimeout)(()=>this.clearDragOverFeedback(),100,this.disposables),this.currentDragData&&((D=(w=this.dnd).onDragLeave)===null||D===void 0||D.call(w,this.currentDragData,C.element,C.index,C.browserEvent))}onDrop(C){if(!this.canDrop)return;const w=this.currentDragData;this.teardownDragAndDropScrollTopAnimation(),this.clearDragOverFeedback(),this.domNode.classList.remove("dragging"),this.currentDragData=void 0,f.CurrentDragAndDropData=void 0,!(!w||!C.browserEvent.dataTransfer)&&(C.browserEvent.preventDefault(),w.update(C.browserEvent.dataTransfer),this.dnd.drop(w,C.element,C.index,C.sector,C.browserEvent))}onDragEnd(C){var w,D;this.canDrop=!1,this.teardownDragAndDropScrollTopAnimation(),this.clearDragOverFeedback(),this.domNode.classList.remove("dragging"),this.currentDragData=void 0,f.CurrentDragAndDropData=void 0,(D=(w=this.dnd).onDragEnd)===null||D===void 0||D.call(w,C)}clearDragOverFeedback(){this.currentDragFeedback=void 0,this.currentDragFeedbackPosition=void 0,this.currentDragFeedbackDisposable.dispose(),this.currentDragFeedbackDisposable=a.Disposable.None}setupDragAndDropScrollTopAnimation(C){if(!this.dragOverAnimationDisposable){const w=(0,k.getTopLeftOffset)(this.domNode).top;this.dragOverAnimationDisposable=(0,k.animate)((0,k.getWindow)(this.domNode),this.animateDragAndDropScrollTop.bind(this,w))}this.dragOverAnimationStopDisposable.dispose(),this.dragOverAnimationStopDisposable=(0,_.disposableTimeout)(()=>{this.dragOverAnimationDisposable&&(this.dragOverAnimationDisposable.dispose(),this.dragOverAnimationDisposable=void 0)},1e3,this.disposables),this.dragOverMouseY=C.pageY}animateDragAndDropScrollTop(C){if(this.dragOverMouseY===void 0)return;const w=this.dragOverMouseY-C,D=this.renderHeight-35;w<35?this.scrollTop+=Math.max(-14,Math.floor(.3*(w-35))):w>D&&(this.scrollTop+=Math.min(14,Math.floor(.3*(w-D))))}teardownDragAndDropScrollTopAnimation(){this.dragOverAnimationStopDisposable.dispose(),this.dragOverAnimationDisposable&&(this.dragOverAnimationDisposable.dispose(),this.dragOverAnimationDisposable=void 0)}getTargetSector(C,w){if(w===void 0)return;const D=C.offsetY/this.items[w].size;return Math.floor(D/.25)}getItemIndexFromEventTarget(C){const w=this.scrollableElement.getDomNode();let D=C;for(;D instanceof HTMLElement&&D!==this.rowsContainer&&w.contains(D);){const I=D.getAttribute("data-index");if(I){const T=Number(I);if(!isNaN(T))return T}D=D.parentElement}}getRenderRange(C,w){return{start:this.rangeMap.indexAt(C),end:this.rangeMap.indexAfter(C+w-1)}}_rerender(C,w,D){const I=this.getRenderRange(C,w);let T,A;C===this.elementTop(I.start)?(T=I.start,A=0):I.end-I.start>1&&(T=I.start+1,A=this.elementTop(T)-C);let P=0;for(;;){const N=this.getRenderRange(C,w);let M=!1;for(let R=N.start;R<N.end;R++){const x=this.probeDynamicHeight(R);x!==0&&this.rangeMap.splice(R,1,[this.items[R]]),P+=x,M=M||x!==0}if(!M){P!==0&&this.eventuallyUpdateScrollDimensions();const R=i.Range.relativeComplement(I,N);for(const O of R)for(let B=O.start;B<O.end;B++)this.items[B].row&&this.removeItemFromDOM(B);const x=i.Range.relativeComplement(N,I);for(const O of x)for(let B=O.start;B<O.end;B++){const W=B+1,V=W<this.items.length?this.items[W].row:null,K=V?V.domNode:null;this.insertItemInDOM(B,K)}for(let O=N.start;O<N.end;O++)this.items[O].row&&this.updateItemInDOM(this.items[O],O);if(typeof T=="number"){const O=this.scrollable.getFutureScrollPosition().scrollTop-C,B=this.elementTop(T)-A+O;this.setScrollTop(B,D)}this._onDidChangeContentHeight.fire(this.contentHeight);return}}}probeDynamicHeight(C){var w,D,I;const T=this.items[C];if(this.virtualDelegate.getDynamicHeight){const M=this.virtualDelegate.getDynamicHeight(T.element);if(M!==null){const R=T.size;return T.size=M,T.lastDynamicHeightWidth=this.renderWidth,M-R}}if(!T.hasDynamicHeight||T.lastDynamicHeightWidth===this.renderWidth||this.virtualDelegate.hasDynamicHeight&&!this.virtualDelegate.hasDynamicHeight(T.element))return 0;const A=T.size;if(T.row)return T.row.domNode.style.height="",T.size=T.row.domNode.offsetHeight,T.lastDynamicHeightWidth=this.renderWidth,T.size-A;const{row:P}=this.cache.alloc(T.templateId);P.domNode.style.height="",this.rowsContainer.appendChild(P.domNode);const N=this.renderers.get(T.templateId);if(!N)throw new u.BugIndicatingError("Missing renderer for templateId: "+T.templateId);return N.renderElement(T.element,C,P.templateData,void 0),T.size=P.domNode.offsetHeight,(w=N.disposeElement)===null||w===void 0||w.call(N,T.element,C,P.templateData,void 0),(I=(D=this.virtualDelegate).setDynamicHeight)===null||I===void 0||I.call(D,T.element,T.size),T.lastDynamicHeightWidth=this.renderWidth,this.rowsContainer.removeChild(P.domNode),this.cache.release(P),T.size-A}getNextToLastElement(C){const w=C[C.length-1];if(!w)return null;const D=this.items[w.end];return!D||!D.row?null:D.row.domNode}getElementDomId(C){return`${this.domId}_${C}`}dispose(){var C,w;for(const D of this.items)if(D.dragStartDisposable.dispose(),D.checkedDisposable.dispose(),D.row){const I=this.renderers.get(D.row.templateId);I&&((C=I.disposeElement)===null||C===void 0||C.call(I,D.element,-1,D.row.templateData,void 0),I.disposeTemplate(D.row.templateData))}this.items=[],this.domNode&&this.domNode.parentNode&&this.domNode.parentNode.removeChild(this.domNode),(w=this.dragOverAnimationDisposable)===null||w===void 0||w.dispose(),this.disposables.dispose()}}e.ListView=h,h.InstanceCount=0,ke([v.memoize],h.prototype,"onMouseClick",null),ke([v.memoize],h.prototype,"onMouseDblClick",null),ke([v.memoize],h.prototype,"onMouseMiddleClick",null),ke([v.memoize],h.prototype,"onMouseDown",null),ke([v.memoize],h.prototype,"onMouseOver",null),ke([v.memoize],h.prototype,"onMouseOut",null),ke([v.memoize],h.prototype,"onContextMenu",null),ke([v.memoize],h.prototype,"onTouchStart",null),ke([v.memoize],h.prototype,"onTap",null)}),define(se[119],oe([1,0,7,84,46,63,48,396,13,14,39,107,6,71,2,145,17,20,395,228,67,275]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.List=e.unthemedListStyles=e.DefaultStyleController=e.MouseController=e.isSelectionRangeChangeEvent=e.isSelectionSingleChangeEvent=e.DefaultKeyboardNavigationDelegate=e.TypeNavigationMode=e.isButton=e.isStickyScrollContainer=e.isStickyScrollElement=e.isActionItem=e.isMonacoCustomToggle=e.isMonacoEditor=e.isInputElement=void 0;class l{constructor(X){this.trait=X,this.renderedElements=[]}get templateId(){return`template:${this.trait.name}`}renderTemplate(X){return X}renderElement(X,U,G){const z=this.renderedElements.findIndex(H=>H.templateData===G);if(z>=0){const H=this.renderedElements[z];this.trait.unrender(G),H.index=U}else{const H={index:U,templateData:G};this.renderedElements.push(H)}this.trait.renderIndex(U,G)}splice(X,U,G){const z=[];for(const H of this.renderedElements)H.index<X?z.push(H):H.index>=X+U&&z.push({index:H.index+G-U,templateData:H.templateData});this.renderedElements=z}renderIndexes(X){for(const{index:U,templateData:G}of this.renderedElements)X.indexOf(U)>-1&&this.trait.renderIndex(U,G)}disposeTemplate(X){const U=this.renderedElements.findIndex(G=>G.templateData===X);U<0||this.renderedElements.splice(U,1)}}class o{get name(){return this._trait}get renderer(){return new l(this)}constructor(X){this._trait=X,this.indexes=[],this.sortedIndexes=[],this._onChange=new i.Emitter,this.onChange=this._onChange.event}splice(X,U,G){const z=G.length-U,H=X+U,Y=[];let j=0;for(;j<this.sortedIndexes.length&&this.sortedIndexes[j]<X;)Y.push(this.sortedIndexes[j++]);for(let Z=0;Z<G.length;Z++)G[Z]&&Y.push(Z+X);for(;j<this.sortedIndexes.length&&this.sortedIndexes[j]>=H;)Y.push(this.sortedIndexes[j++]+z);this.renderer.splice(X,U,G.length),this._set(Y,Y)}renderIndex(X,U){U.classList.toggle(this._trait,this.contains(X))}unrender(X){X.classList.remove(this._trait)}set(X,U){return this._set(X,[...X].sort(J),U)}_set(X,U,G){const z=this.indexes,H=this.sortedIndexes;this.indexes=X,this.sortedIndexes=U;const Y=ne(H,X);return this.renderer.renderIndexes(Y),this._onChange.fire({indexes:X,browserEvent:G}),z}get(){return this.indexes}contains(X){return(0,_.binarySearch)(this.sortedIndexes,X,J)>=0}dispose(){(0,t.dispose)(this._onChange)}}ke([a.memoize],o.prototype,"renderer",null);class g extends o{constructor(X){super("selected"),this.setAriaSelected=X}renderIndex(X,U){super.renderIndex(X,U),this.setAriaSelected&&(this.contains(X)?U.setAttribute("aria-selected","true"):U.setAttribute("aria-selected","false"))}}class h{constructor(X,U,G){this.trait=X,this.view=U,this.identityProvider=G}splice(X,U,G){if(!this.identityProvider)return this.trait.splice(X,U,new Array(G.length).fill(!1));const z=this.trait.get().map(j=>this.identityProvider.getId(this.view.element(j)).toString());if(z.length===0)return this.trait.splice(X,U,new Array(G.length).fill(!1));const H=new Set(z),Y=G.map(j=>H.has(this.identityProvider.getId(j).toString()));this.trait.splice(X,U,Y)}}function m(me){return me.tagName==="INPUT"||me.tagName==="TEXTAREA"}e.isInputElement=m;function C(me,X){return me.classList.contains(X)?!0:me.classList.contains("monaco-list")||!me.parentElement?!1:C(me.parentElement,X)}function w(me){return C(me,"monaco-editor")}e.isMonacoEditor=w;function D(me){return C(me,"monaco-custom-toggle")}e.isMonacoCustomToggle=D;function I(me){return C(me,"action-item")}e.isActionItem=I;function T(me){return C(me,"monaco-tree-sticky-row")}e.isStickyScrollElement=T;function A(me){return me.classList.contains("monaco-tree-sticky-container")}e.isStickyScrollContainer=A;function P(me){return me.tagName==="A"&&me.classList.contains("monaco-button")||me.tagName==="DIV"&&me.classList.contains("monaco-button-dropdown")?!0:me.classList.contains("monaco-list")||!me.parentElement?!1:P(me.parentElement)}e.isButton=P;class N{get onKeyDown(){return i.Event.chain(this.disposables.add(new k.DomEmitter(this.view.domNode,"keydown")).event,X=>X.filter(U=>!m(U.target)).map(U=>new y.StandardKeyboardEvent(U)))}constructor(X,U,G){this.list=X,this.view=U,this.disposables=new t.DisposableStore,this.multipleSelectionDisposables=new t.DisposableStore,this.multipleSelectionSupport=G.multipleSelectionSupport,this.disposables.add(this.onKeyDown(z=>{switch(z.keyCode){case 3:return this.onEnter(z);case 16:return this.onUpArrow(z);case 18:return this.onDownArrow(z);case 11:return this.onPageUpArrow(z);case 12:return this.onPageDownArrow(z);case 9:return this.onEscape(z);case 31:this.multipleSelectionSupport&&(u.isMacintosh?z.metaKey:z.ctrlKey)&&this.onCtrlA(z)}}))}updateOptions(X){X.multipleSelectionSupport!==void 0&&(this.multipleSelectionSupport=X.multipleSelectionSupport)}onEnter(X){X.preventDefault(),X.stopPropagation(),this.list.setSelection(this.list.getFocus(),X.browserEvent)}onUpArrow(X){X.preventDefault(),X.stopPropagation(),this.list.focusPrevious(1,!1,X.browserEvent);const U=this.list.getFocus()[0];this.list.setAnchor(U),this.list.reveal(U),this.view.domNode.focus()}onDownArrow(X){X.preventDefault(),X.stopPropagation(),this.list.focusNext(1,!1,X.browserEvent);const U=this.list.getFocus()[0];this.list.setAnchor(U),this.list.reveal(U),this.view.domNode.focus()}onPageUpArrow(X){X.preventDefault(),X.stopPropagation(),this.list.focusPreviousPage(X.browserEvent);const U=this.list.getFocus()[0];this.list.setAnchor(U),this.list.reveal(U),this.view.domNode.focus()}onPageDownArrow(X){X.preventDefault(),X.stopPropagation(),this.list.focusNextPage(X.browserEvent);const U=this.list.getFocus()[0];this.list.setAnchor(U),this.list.reveal(U),this.view.domNode.focus()}onCtrlA(X){X.preventDefault(),X.stopPropagation(),this.list.setSelection((0,_.range)(this.list.length),X.browserEvent),this.list.setAnchor(void 0),this.view.domNode.focus()}onEscape(X){this.list.getSelection().length&&(X.preventDefault(),X.stopPropagation(),this.list.setSelection([],X.browserEvent),this.list.setAnchor(void 0),this.view.domNode.focus())}dispose(){this.disposables.dispose(),this.multipleSelectionDisposables.dispose()}}ke([a.memoize],N.prototype,"onKeyDown",null);var M;(function(me){me[me.Automatic=0]="Automatic",me[me.Trigger=1]="Trigger"})(M||(e.TypeNavigationMode=M={}));var R;(function(me){me[me.Idle=0]="Idle",me[me.Typing=1]="Typing"})(R||(R={})),e.DefaultKeyboardNavigationDelegate=new class{mightProducePrintableCharacter(me){return me.ctrlKey||me.metaKey||me.altKey?!1:me.keyCode>=31&&me.keyCode<=56||me.keyCode>=21&&me.keyCode<=30||me.keyCode>=98&&me.keyCode<=107||me.keyCode>=85&&me.keyCode<=95}};class x{constructor(X,U,G,z,H){this.list=X,this.view=U,this.keyboardNavigationLabelProvider=G,this.keyboardNavigationEventFilter=z,this.delegate=H,this.enabled=!1,this.state=R.Idle,this.mode=M.Automatic,this.triggered=!1,this.previouslyFocused=-1,this.enabledDisposables=new t.DisposableStore,this.disposables=new t.DisposableStore,this.updateOptions(X.options)}updateOptions(X){var U,G;!((U=X.typeNavigationEnabled)!==null&&U!==void 0)||U?this.enable():this.disable(),this.mode=(G=X.typeNavigationMode)!==null&&G!==void 0?G:M.Automatic}enable(){if(this.enabled)return;let X=!1;const U=i.Event.chain(this.enabledDisposables.add(new k.DomEmitter(this.view.domNode,"keydown")).event,H=>H.filter(Y=>!m(Y.target)).filter(()=>this.mode===M.Automatic||this.triggered).map(Y=>new y.StandardKeyboardEvent(Y)).filter(Y=>X||this.keyboardNavigationEventFilter(Y)).filter(Y=>this.delegate.mightProducePrintableCharacter(Y)).forEach(Y=>L.EventHelper.stop(Y,!0)).map(Y=>Y.browserEvent.key)),G=i.Event.debounce(U,()=>null,800,void 0,void 0,void 0,this.enabledDisposables);i.Event.reduce(i.Event.any(U,G),(H,Y)=>Y===null?null:(H||"")+Y,void 0,this.enabledDisposables)(this.onInput,this,this.enabledDisposables),G(this.onClear,this,this.enabledDisposables),U(()=>X=!0,void 0,this.enabledDisposables),G(()=>X=!1,void 0,this.enabledDisposables),this.enabled=!0,this.triggered=!1}disable(){this.enabled&&(this.enabledDisposables.clear(),this.enabled=!1,this.triggered=!1)}onClear(){var X;const U=this.list.getFocus();if(U.length>0&&U[0]===this.previouslyFocused){const G=(X=this.list.options.accessibilityProvider)===null||X===void 0?void 0:X.getAriaLabel(this.list.element(U[0]));G&&(0,S.alert)(G)}this.previouslyFocused=-1}onInput(X){if(!X){this.state=R.Idle,this.triggered=!1;return}const U=this.list.getFocus(),G=U.length>0?U[0]:0,z=this.state===R.Idle?1:0;this.state=R.Typing;for(let H=0;H<this.list.length;H++){const Y=(G+H+z)%this.list.length,j=this.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(this.view.element(Y)),Z=j&&j.toString();if(this.list.options.typeNavigationEnabled){if(typeof Z<"u"){if((0,n.matchesPrefix)(X,Z)){this.previouslyFocused=G,this.list.setFocus([Y]),this.list.reveal(Y);return}const ee=(0,n.matchesFuzzy2)(X,Z);if(ee&&ee[0].end-ee[0].start>1&&ee.length===1){this.previouslyFocused=G,this.list.setFocus([Y]),this.list.reveal(Y);return}}}else if(typeof Z>"u"||(0,n.matchesPrefix)(X,Z)){this.previouslyFocused=G,this.list.setFocus([Y]),this.list.reveal(Y);return}}}dispose(){this.disable(),this.enabledDisposables.dispose(),this.disposables.dispose()}}class O{constructor(X,U){this.list=X,this.view=U,this.disposables=new t.DisposableStore;const G=i.Event.chain(this.disposables.add(new k.DomEmitter(U.domNode,"keydown")).event,H=>H.filter(Y=>!m(Y.target)).map(Y=>new y.StandardKeyboardEvent(Y)));i.Event.chain(G,H=>H.filter(Y=>Y.keyCode===2&&!Y.ctrlKey&&!Y.metaKey&&!Y.shiftKey&&!Y.altKey))(this.onTab,this,this.disposables)}onTab(X){if(X.target!==this.view.domNode)return;const U=this.list.getFocus();if(U.length===0)return;const G=this.view.domElement(U[0]);if(!G)return;const z=G.querySelector("[tabIndex]");if(!z||!(z instanceof HTMLElement)||z.tabIndex===-1)return;const H=(0,L.getWindow)(z).getComputedStyle(z);H.visibility==="hidden"||H.display==="none"||(X.preventDefault(),X.stopPropagation(),z.focus())}dispose(){this.disposables.dispose()}}function B(me){return u.isMacintosh?me.browserEvent.metaKey:me.browserEvent.ctrlKey}e.isSelectionSingleChangeEvent=B;function W(me){return me.browserEvent.shiftKey}e.isSelectionRangeChangeEvent=W;function V(me){return(0,L.isMouseEvent)(me)&&me.button===2}const K={isSelectionSingleChangeEvent:B,isSelectionRangeChangeEvent:W};class F{constructor(X){this.list=X,this.disposables=new t.DisposableStore,this._onPointer=new i.Emitter,this.onPointer=this._onPointer.event,X.options.multipleSelectionSupport!==!1&&(this.multipleSelectionController=this.list.options.multipleSelectionController||K),this.mouseSupport=typeof X.options.mouseSupport>"u"||!!X.options.mouseSupport,this.mouseSupport&&(X.onMouseDown(this.onMouseDown,this,this.disposables),X.onContextMenu(this.onContextMenu,this,this.disposables),X.onMouseDblClick(this.onDoubleClick,this,this.disposables),X.onTouchStart(this.onMouseDown,this,this.disposables),this.disposables.add(E.Gesture.addTarget(X.getHTMLElement()))),i.Event.any(X.onMouseClick,X.onMouseMiddleClick,X.onTap)(this.onViewPointer,this,this.disposables)}updateOptions(X){X.multipleSelectionSupport!==void 0&&(this.multipleSelectionController=void 0,X.multipleSelectionSupport&&(this.multipleSelectionController=this.list.options.multipleSelectionController||K))}isSelectionSingleChangeEvent(X){return this.multipleSelectionController?this.multipleSelectionController.isSelectionSingleChangeEvent(X):!1}isSelectionRangeChangeEvent(X){return this.multipleSelectionController?this.multipleSelectionController.isSelectionRangeChangeEvent(X):!1}isSelectionChangeEvent(X){return this.isSelectionSingleChangeEvent(X)||this.isSelectionRangeChangeEvent(X)}onMouseDown(X){w(X.browserEvent.target)||(0,L.getActiveElement)()!==X.browserEvent.target&&this.list.domFocus()}onContextMenu(X){if(m(X.browserEvent.target)||w(X.browserEvent.target))return;const U=typeof X.index>"u"?[]:[X.index];this.list.setFocus(U,X.browserEvent)}onViewPointer(X){if(!this.mouseSupport||m(X.browserEvent.target)||w(X.browserEvent.target)||X.browserEvent.isHandledByList)return;X.browserEvent.isHandledByList=!0;const U=X.index;if(typeof U>"u"){this.list.setFocus([],X.browserEvent),this.list.setSelection([],X.browserEvent),this.list.setAnchor(void 0);return}if(this.isSelectionChangeEvent(X))return this.changeSelection(X);this.list.setFocus([U],X.browserEvent),this.list.setAnchor(U),V(X.browserEvent)||this.list.setSelection([U],X.browserEvent),this._onPointer.fire(X)}onDoubleClick(X){if(m(X.browserEvent.target)||w(X.browserEvent.target)||this.isSelectionChangeEvent(X)||X.browserEvent.isHandledByList)return;X.browserEvent.isHandledByList=!0;const U=this.list.getFocus();this.list.setSelection(U,X.browserEvent)}changeSelection(X){const U=X.index;let G=this.list.getAnchor();if(this.isSelectionRangeChangeEvent(X)){if(typeof G>"u"){const le=this.list.getFocus()[0];G=le??U,this.list.setAnchor(G)}const z=Math.min(G,U),H=Math.max(G,U),Y=(0,_.range)(z,H+1),j=this.list.getSelection(),Z=ae(ne(j,[G]),G);if(Z.length===0)return;const ee=ne(Y,$(j,Z));this.list.setSelection(ee,X.browserEvent),this.list.setFocus([U],X.browserEvent)}else if(this.isSelectionSingleChangeEvent(X)){const z=this.list.getSelection(),H=z.filter(Y=>Y!==U);this.list.setFocus([U]),this.list.setAnchor(U),z.length===H.length?this.list.setSelection([...H,U],X.browserEvent):this.list.setSelection(H,X.browserEvent)}}dispose(){this.disposables.dispose()}}e.MouseController=F;class q{constructor(X,U){this.styleElement=X,this.selectorSuffix=U}style(X){var U,G;const z=this.selectorSuffix&&`.${this.selectorSuffix}`,H=[];X.listBackground&&H.push(`.monaco-list${z} .monaco-list-rows { background: ${X.listBackground}; }`),X.listFocusBackground&&(H.push(`.monaco-list${z}:focus .monaco-list-row.focused { background-color: ${X.listFocusBackground}; }`),H.push(`.monaco-list${z}:focus .monaco-list-row.focused:hover { background-color: ${X.listFocusBackground}; }`)),X.listFocusForeground&&H.push(`.monaco-list${z}:focus .monaco-list-row.focused { color: ${X.listFocusForeground}; }`),X.listActiveSelectionBackground&&(H.push(`.monaco-list${z}:focus .monaco-list-row.selected { background-color: ${X.listActiveSelectionBackground}; }`),H.push(`.monaco-list${z}:focus .monaco-list-row.selected:hover { background-color: ${X.listActiveSelectionBackground}; }`)),X.listActiveSelectionForeground&&H.push(`.monaco-list${z}:focus .monaco-list-row.selected { color: ${X.listActiveSelectionForeground}; }`),X.listActiveSelectionIconForeground&&H.push(`.monaco-list${z}:focus .monaco-list-row.selected .codicon { color: ${X.listActiveSelectionIconForeground}; }`),X.listFocusAndSelectionBackground&&H.push(`
+				.monaco-drag-image,
+				.monaco-list${z}:focus .monaco-list-row.selected.focused { background-color: ${X.listFocusAndSelectionBackground}; }
+			`),X.listFocusAndSelectionForeground&&H.push(`
+				.monaco-drag-image,
+				.monaco-list${z}:focus .monaco-list-row.selected.focused { color: ${X.listFocusAndSelectionForeground}; }
+			`),X.listInactiveFocusForeground&&(H.push(`.monaco-list${z} .monaco-list-row.focused { color:  ${X.listInactiveFocusForeground}; }`),H.push(`.monaco-list${z} .monaco-list-row.focused:hover { color:  ${X.listInactiveFocusForeground}; }`)),X.listInactiveSelectionIconForeground&&H.push(`.monaco-list${z} .monaco-list-row.focused .codicon { color:  ${X.listInactiveSelectionIconForeground}; }`),X.listInactiveFocusBackground&&(H.push(`.monaco-list${z} .monaco-list-row.focused { background-color:  ${X.listInactiveFocusBackground}; }`),H.push(`.monaco-list${z} .monaco-list-row.focused:hover { background-color:  ${X.listInactiveFocusBackground}; }`)),X.listInactiveSelectionBackground&&(H.push(`.monaco-list${z} .monaco-list-row.selected { background-color:  ${X.listInactiveSelectionBackground}; }`),H.push(`.monaco-list${z} .monaco-list-row.selected:hover { background-color:  ${X.listInactiveSelectionBackground}; }`)),X.listInactiveSelectionForeground&&H.push(`.monaco-list${z} .monaco-list-row.selected { color: ${X.listInactiveSelectionForeground}; }`),X.listHoverBackground&&H.push(`.monaco-list${z}:not(.drop-target):not(.dragging) .monaco-list-row:hover:not(.selected):not(.focused) { background-color: ${X.listHoverBackground}; }`),X.listHoverForeground&&H.push(`.monaco-list${z}:not(.drop-target):not(.dragging) .monaco-list-row:hover:not(.selected):not(.focused) { color:  ${X.listHoverForeground}; }`);const Y=(0,L.asCssValueWithDefault)(X.listFocusAndSelectionOutline,(0,L.asCssValueWithDefault)(X.listSelectionOutline,(U=X.listFocusOutline)!==null&&U!==void 0?U:""));Y&&H.push(`.monaco-list${z}:focus .monaco-list-row.focused.selected { outline: 1px solid ${Y}; outline-offset: -1px;}`),X.listFocusOutline&&H.push(`
+				.monaco-drag-image,
+				.monaco-list${z}:focus .monaco-list-row.focused { outline: 1px solid ${X.listFocusOutline}; outline-offset: -1px; }
+				.monaco-workbench.context-menu-visible .monaco-list${z}.last-focused .monaco-list-row.focused { outline: 1px solid ${X.listFocusOutline}; outline-offset: -1px; }
+			`);const j=(0,L.asCssValueWithDefault)(X.listSelectionOutline,(G=X.listInactiveFocusOutline)!==null&&G!==void 0?G:"");j&&H.push(`.monaco-list${z} .monaco-list-row.focused.selected { outline: 1px dotted ${j}; outline-offset: -1px; }`),X.listSelectionOutline&&H.push(`.monaco-list${z} .monaco-list-row.selected { outline: 1px dotted ${X.listSelectionOutline}; outline-offset: -1px; }`),X.listInactiveFocusOutline&&H.push(`.monaco-list${z} .monaco-list-row.focused { outline: 1px dotted ${X.listInactiveFocusOutline}; outline-offset: -1px; }`),X.listHoverOutline&&H.push(`.monaco-list${z} .monaco-list-row:hover { outline: 1px dashed ${X.listHoverOutline}; outline-offset: -1px; }`),X.listDropOverBackground&&H.push(`
+				.monaco-list${z}.drop-target,
+				.monaco-list${z} .monaco-list-rows.drop-target,
+				.monaco-list${z} .monaco-list-row.drop-target { background-color: ${X.listDropOverBackground} !important; color: inherit !important; }
+			`),X.listDropBetweenBackground&&(H.push(`
+			.monaco-list${z} .monaco-list-rows.drop-target-before .monaco-list-row:first-child::before,
+			.monaco-list${z} .monaco-list-row.drop-target-before::before {
+				content: ""; position: absolute; top: 0px; left: 0px; width: 100%; height: 1px;
+				background-color: ${X.listDropBetweenBackground};
+			}`),H.push(`
+			.monaco-list${z} .monaco-list-rows.drop-target-after .monaco-list-row:last-child::after,
+			.monaco-list${z} .monaco-list-row.drop-target-after::after {
+				content: ""; position: absolute; bottom: 0px; left: 0px; width: 100%; height: 1px;
+				background-color: ${X.listDropBetweenBackground};
+			}`)),X.tableColumnsBorder&&H.push(`
+				.monaco-table > .monaco-split-view2,
+				.monaco-table > .monaco-split-view2 .monaco-sash.vertical::before,
+				.monaco-workbench:not(.reduce-motion) .monaco-table:hover > .monaco-split-view2,
+				.monaco-workbench:not(.reduce-motion) .monaco-table:hover > .monaco-split-view2 .monaco-sash.vertical::before {
+					border-color: ${X.tableColumnsBorder};
+				}
+
+				.monaco-workbench:not(.reduce-motion) .monaco-table > .monaco-split-view2,
+				.monaco-workbench:not(.reduce-motion) .monaco-table > .monaco-split-view2 .monaco-sash.vertical::before {
+					border-color: transparent;
+				}
+			`),X.tableOddRowsBackgroundColor&&H.push(`
+				.monaco-table .monaco-list-row[data-parity=odd]:not(.focused):not(.selected):not(:hover) .monaco-table-tr,
+				.monaco-table .monaco-list:not(:focus) .monaco-list-row[data-parity=odd].focused:not(.selected):not(:hover) .monaco-table-tr,
+				.monaco-table .monaco-list:not(.focused) .monaco-list-row[data-parity=odd].focused:not(.selected):not(:hover) .monaco-table-tr {
+					background-color: ${X.tableOddRowsBackgroundColor};
+				}
+			`),this.styleElement.textContent=H.join(`
+`)}}e.DefaultStyleController=q,e.unthemedListStyles={listFocusBackground:"#7FB0D0",listActiveSelectionBackground:"#0E639C",listActiveSelectionForeground:"#FFFFFF",listActiveSelectionIconForeground:"#FFFFFF",listFocusAndSelectionOutline:"#90C2F9",listFocusAndSelectionBackground:"#094771",listFocusAndSelectionForeground:"#FFFFFF",listInactiveSelectionBackground:"#3F3F46",listInactiveSelectionIconForeground:"#FFFFFF",listHoverBackground:"#2A2D2E",listDropOverBackground:"#383B3D",listDropBetweenBackground:"#EEEEEE",treeIndentGuidesStroke:"#a9a9a9",treeInactiveIndentGuidesStroke:b.Color.fromHex("#a9a9a9").transparent(.4).toString(),tableColumnsBorder:b.Color.fromHex("#cccccc").transparent(.2).toString(),tableOddRowsBackgroundColor:b.Color.fromHex("#cccccc").transparent(.04).toString(),listBackground:void 0,listFocusForeground:void 0,listInactiveSelectionForeground:void 0,listInactiveFocusForeground:void 0,listInactiveFocusBackground:void 0,listHoverForeground:void 0,listFocusOutline:void 0,listInactiveFocusOutline:void 0,listSelectionOutline:void 0,listHoverOutline:void 0};const ie={keyboardSupport:!0,mouseSupport:!0,multipleSelectionSupport:!0,dnd:{getDragURI(){return null},onDragStart(){},onDragOver(){return!1},drop(){},dispose(){}}};function ae(me,X){const U=me.indexOf(X);if(U===-1)return[];const G=[];let z=U-1;for(;z>=0&&me[z]===X-(U-z);)G.push(me[z--]);for(G.reverse(),z=U;z<me.length&&me[z]===X+(z-U);)G.push(me[z++]);return G}function ne(me,X){const U=[];let G=0,z=0;for(;G<me.length||z<X.length;)if(G>=me.length)U.push(X[z++]);else if(z>=X.length)U.push(me[G++]);else if(me[G]===X[z]){U.push(me[G]),G++,z++;continue}else me[G]<X[z]?U.push(me[G++]):U.push(X[z++]);return U}function $(me,X){const U=[];let G=0,z=0;for(;G<me.length||z<X.length;)if(G>=me.length)U.push(X[z++]);else if(z>=X.length)U.push(me[G++]);else if(me[G]===X[z]){G++,z++;continue}else me[G]<X[z]?U.push(me[G++]):z++;return U}const J=(me,X)=>me-X;class Q{constructor(X,U){this._templateId=X,this.renderers=U}get templateId(){return this._templateId}renderTemplate(X){return this.renderers.map(U=>U.renderTemplate(X))}renderElement(X,U,G,z){let H=0;for(const Y of this.renderers)Y.renderElement(X,U,G[H++],z)}disposeElement(X,U,G,z){var H;let Y=0;for(const j of this.renderers)(H=j.disposeElement)===null||H===void 0||H.call(j,X,U,G[Y],z),Y+=1}disposeTemplate(X){let U=0;for(const G of this.renderers)G.disposeTemplate(X[U++])}}class re{constructor(X){this.accessibilityProvider=X,this.templateId="a18n"}renderTemplate(X){return X}renderElement(X,U,G){const z=this.accessibilityProvider.getAriaLabel(X);z?G.setAttribute("aria-label",z):G.removeAttribute("aria-label");const H=this.accessibilityProvider.getAriaLevel&&this.accessibilityProvider.getAriaLevel(X);typeof H=="number"?G.setAttribute("aria-level",`${H}`):G.removeAttribute("aria-level")}disposeTemplate(X){}}class de{constructor(X,U){this.list=X,this.dnd=U}getDragElements(X){const U=this.list.getSelectedElements();return U.indexOf(X)>-1?U:[X]}getDragURI(X){return this.dnd.getDragURI(X)}getDragLabel(X,U){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(X,U)}onDragStart(X,U){var G,z;(z=(G=this.dnd).onDragStart)===null||z===void 0||z.call(G,X,U)}onDragOver(X,U,G,z,H){return this.dnd.onDragOver(X,U,G,z,H)}onDragLeave(X,U,G,z){var H,Y;(Y=(H=this.dnd).onDragLeave)===null||Y===void 0||Y.call(H,X,U,G,z)}onDragEnd(X){var U,G;(G=(U=this.dnd).onDragEnd)===null||G===void 0||G.call(U,X)}drop(X,U,G,z,H){this.dnd.drop(X,U,G,z,H)}dispose(){this.dnd.dispose()}}class he{get onDidChangeFocus(){return i.Event.map(this.eventBufferer.wrapEvent(this.focus.onChange),X=>this.toListEvent(X),this.disposables)}get onDidChangeSelection(){return i.Event.map(this.eventBufferer.wrapEvent(this.selection.onChange),X=>this.toListEvent(X),this.disposables)}get domId(){return this.view.domId}get onDidScroll(){return this.view.onDidScroll}get onMouseClick(){return this.view.onMouseClick}get onMouseDblClick(){return this.view.onMouseDblClick}get onMouseMiddleClick(){return this.view.onMouseMiddleClick}get onPointer(){return this.mouseController.onPointer}get onMouseDown(){return this.view.onMouseDown}get onMouseOver(){return this.view.onMouseOver}get onMouseOut(){return this.view.onMouseOut}get onTouchStart(){return this.view.onTouchStart}get onTap(){return this.view.onTap}get onContextMenu(){let X=!1;const U=i.Event.chain(this.disposables.add(new k.DomEmitter(this.view.domNode,"keydown")).event,H=>H.map(Y=>new y.StandardKeyboardEvent(Y)).filter(Y=>X=Y.keyCode===58||Y.shiftKey&&Y.keyCode===68).map(Y=>L.EventHelper.stop(Y,!0)).filter(()=>!1)),G=i.Event.chain(this.disposables.add(new k.DomEmitter(this.view.domNode,"keyup")).event,H=>H.forEach(()=>X=!1).map(Y=>new y.StandardKeyboardEvent(Y)).filter(Y=>Y.keyCode===58||Y.shiftKey&&Y.keyCode===68).map(Y=>L.EventHelper.stop(Y,!0)).map(({browserEvent:Y})=>{const j=this.getFocus(),Z=j.length?j[0]:void 0,ee=typeof Z<"u"?this.view.element(Z):void 0,le=typeof Z<"u"?this.view.domElement(Z):this.view.domNode;return{index:Z,element:ee,anchor:le,browserEvent:Y}})),z=i.Event.chain(this.view.onContextMenu,H=>H.filter(Y=>!X).map(({element:Y,index:j,browserEvent:Z})=>({element:Y,index:j,anchor:new s.StandardMouseEvent((0,L.getWindow)(this.view.domNode),Z),browserEvent:Z})));return i.Event.any(U,G,z)}get onKeyDown(){return this.disposables.add(new k.DomEmitter(this.view.domNode,"keydown")).event}get onDidFocus(){return i.Event.signal(this.disposables.add(new k.DomEmitter(this.view.domNode,"focus",!0)).event)}constructor(X,U,G,z,H=ie){var Y,j,Z,ee;this.user=X,this._options=H,this.focus=new o("focused"),this.anchor=new o("anchor"),this.eventBufferer=new i.EventBufferer,this._ariaLabel="",this.disposables=new t.DisposableStore,this._onDidDispose=new i.Emitter,this.onDidDispose=this._onDidDispose.event;const le=this._options.accessibilityProvider&&this._options.accessibilityProvider.getWidgetRole?(Y=this._options.accessibilityProvider)===null||Y===void 0?void 0:Y.getWidgetRole():"list";this.selection=new g(le!=="listbox");const ue=[this.focus.renderer,this.selection.renderer];this.accessibilityProvider=H.accessibilityProvider,this.accessibilityProvider&&(ue.push(new re(this.accessibilityProvider)),(Z=(j=this.accessibilityProvider).onDidChangeActiveDescendant)===null||Z===void 0||Z.call(j,this.onDidChangeActiveDescendant,this,this.disposables)),z=z.map(pe=>new Q(pe.templateId,[...ue,pe]));const ce={...H,dnd:H.dnd&&new de(this,H.dnd)};if(this.view=this.createListView(U,G,z,ce),this.view.domNode.setAttribute("role",le),H.styleController)this.styleController=H.styleController(this.view.domId);else{const pe=(0,L.createStyleSheet)(this.view.domNode);this.styleController=new q(pe,this.view.domId)}if(this.spliceable=new p.CombinedSpliceable([new h(this.focus,this.view,H.identityProvider),new h(this.selection,this.view,H.identityProvider),new h(this.anchor,this.view,H.identityProvider),this.view]),this.disposables.add(this.focus),this.disposables.add(this.selection),this.disposables.add(this.anchor),this.disposables.add(this.view),this.disposables.add(this._onDidDispose),this.disposables.add(new O(this,this.view)),(typeof H.keyboardSupport!="boolean"||H.keyboardSupport)&&(this.keyboardController=new N(this,this.view,H),this.disposables.add(this.keyboardController)),H.keyboardNavigationLabelProvider){const pe=H.keyboardNavigationDelegate||e.DefaultKeyboardNavigationDelegate;this.typeNavigationController=new x(this,this.view,H.keyboardNavigationLabelProvider,(ee=H.keyboardNavigationEventFilter)!==null&&ee!==void 0?ee:()=>!0,pe),this.disposables.add(this.typeNavigationController)}this.mouseController=this.createMouseController(H),this.disposables.add(this.mouseController),this.onDidChangeFocus(this._onFocusChange,this,this.disposables),this.onDidChangeSelection(this._onSelectionChange,this,this.disposables),this.accessibilityProvider&&(this.ariaLabel=this.accessibilityProvider.getWidgetAriaLabel()),this._options.multipleSelectionSupport!==!1&&this.view.domNode.setAttribute("aria-multiselectable","true")}createListView(X,U,G,z){return new d.ListView(X,U,G,z)}createMouseController(X){return new F(this)}updateOptions(X={}){var U,G;this._options={...this._options,...X},(U=this.typeNavigationController)===null||U===void 0||U.updateOptions(this._options),this._options.multipleSelectionController!==void 0&&(this._options.multipleSelectionSupport?this.view.domNode.setAttribute("aria-multiselectable","true"):this.view.domNode.removeAttribute("aria-multiselectable")),this.mouseController.updateOptions(X),(G=this.keyboardController)===null||G===void 0||G.updateOptions(X),this.view.updateOptions(X)}get options(){return this._options}splice(X,U,G=[]){if(X<0||X>this.view.length)throw new c.ListError(this.user,`Invalid start index: ${X}`);if(U<0)throw new c.ListError(this.user,`Invalid delete count: ${U}`);U===0&&G.length===0||this.eventBufferer.bufferEvents(()=>this.spliceable.splice(X,U,G))}rerender(){this.view.rerender()}element(X){return this.view.element(X)}indexOf(X){return this.view.indexOf(X)}indexAt(X){return this.view.indexAt(X)}get length(){return this.view.length}get contentHeight(){return this.view.contentHeight}get onDidChangeContentHeight(){return this.view.onDidChangeContentHeight}get scrollTop(){return this.view.getScrollTop()}set scrollTop(X){this.view.setScrollTop(X)}get scrollHeight(){return this.view.scrollHeight}get renderHeight(){return this.view.renderHeight}get firstVisibleIndex(){return this.view.firstVisibleIndex}get ariaLabel(){return this._ariaLabel}set ariaLabel(X){this._ariaLabel=X,this.view.domNode.setAttribute("aria-label",X)}domFocus(){this.view.domNode.focus({preventScroll:!0})}layout(X,U){this.view.layout(X,U)}setSelection(X,U){for(const G of X)if(G<0||G>=this.length)throw new c.ListError(this.user,`Invalid index ${G}`);this.selection.set(X,U)}getSelection(){return this.selection.get()}getSelectedElements(){return this.getSelection().map(X=>this.view.element(X))}setAnchor(X){if(typeof X>"u"){this.anchor.set([]);return}if(X<0||X>=this.length)throw new c.ListError(this.user,`Invalid index ${X}`);this.anchor.set([X])}getAnchor(){return(0,_.firstOrDefault)(this.anchor.get(),void 0)}getAnchorElement(){const X=this.getAnchor();return typeof X>"u"?void 0:this.element(X)}setFocus(X,U){for(const G of X)if(G<0||G>=this.length)throw new c.ListError(this.user,`Invalid index ${G}`);this.focus.set(X,U)}focusNext(X=1,U=!1,G,z){if(this.length===0)return;const H=this.focus.get(),Y=this.findNextIndex(H.length>0?H[0]+X:0,U,z);Y>-1&&this.setFocus([Y],G)}focusPrevious(X=1,U=!1,G,z){if(this.length===0)return;const H=this.focus.get(),Y=this.findPreviousIndex(H.length>0?H[0]-X:0,U,z);Y>-1&&this.setFocus([Y],G)}async focusNextPage(X,U){let G=this.view.indexAt(this.view.getScrollTop()+this.view.renderHeight);G=G===0?0:G-1;const z=this.getFocus()[0];if(z!==G&&(z===void 0||G>z)){const H=this.findPreviousIndex(G,!1,U);H>-1&&z!==H?this.setFocus([H],X):this.setFocus([G],X)}else{const H=this.view.getScrollTop();let Y=H+this.view.renderHeight;G>z&&(Y-=this.view.elementHeight(G)),this.view.setScrollTop(Y),this.view.getScrollTop()!==H&&(this.setFocus([]),await(0,v.timeout)(0),await this.focusNextPage(X,U))}}async focusPreviousPage(X,U,G=()=>0){let z;const H=G(),Y=this.view.getScrollTop()+H;Y===0?z=this.view.indexAt(Y):z=this.view.indexAfter(Y-1);const j=this.getFocus()[0];if(j!==z&&(j===void 0||j>=z)){const Z=this.findNextIndex(z,!1,U);Z>-1&&j!==Z?this.setFocus([Z],X):this.setFocus([z],X)}else{const Z=Y;this.view.setScrollTop(Y-this.view.renderHeight-H),this.view.getScrollTop()+G()!==Z&&(this.setFocus([]),await(0,v.timeout)(0),await this.focusPreviousPage(X,U,G))}}focusLast(X,U){if(this.length===0)return;const G=this.findPreviousIndex(this.length-1,!1,U);G>-1&&this.setFocus([G],X)}focusFirst(X,U){this.focusNth(0,X,U)}focusNth(X,U,G){if(this.length===0)return;const z=this.findNextIndex(X,!1,G);z>-1&&this.setFocus([z],U)}findNextIndex(X,U=!1,G){for(let z=0;z<this.length;z++){if(X>=this.length&&!U)return-1;if(X=X%this.length,!G||G(this.element(X)))return X;X++}return-1}findPreviousIndex(X,U=!1,G){for(let z=0;z<this.length;z++){if(X<0&&!U)return-1;if(X=(this.length+X%this.length)%this.length,!G||G(this.element(X)))return X;X--}return-1}getFocus(){return this.focus.get()}getFocusedElements(){return this.getFocus().map(X=>this.view.element(X))}reveal(X,U,G=0){if(X<0||X>=this.length)throw new c.ListError(this.user,`Invalid index ${X}`);const z=this.view.getScrollTop(),H=this.view.elementTop(X),Y=this.view.elementHeight(X);if((0,f.isNumber)(U)){const j=Y-this.view.renderHeight+G;this.view.setScrollTop(j*(0,r.clamp)(U,0,1)+H-G)}else{const j=H+Y,Z=z+this.view.renderHeight;H<z+G&&j>=Z||(H<z+G||j>=Z&&Y>=this.view.renderHeight?this.view.setScrollTop(H-G):j>=Z&&this.view.setScrollTop(j-this.view.renderHeight))}}getRelativeTop(X,U=0){if(X<0||X>=this.length)throw new c.ListError(this.user,`Invalid index ${X}`);const G=this.view.getScrollTop(),z=this.view.elementTop(X),H=this.view.elementHeight(X);if(z<G+U||z+H>G+this.view.renderHeight)return null;const Y=H-this.view.renderHeight+U;return Math.abs((G+U-z)/Y)}getHTMLElement(){return this.view.domNode}getScrollableElement(){return this.view.scrollableElementDomNode}getElementID(X){return this.view.getElementDomId(X)}getElementTop(X){return this.view.elementTop(X)}style(X){this.styleController.style(X)}toListEvent({indexes:X,browserEvent:U}){return{indexes:X,elements:X.map(G=>this.view.element(G)),browserEvent:U}}_onFocusChange(){const X=this.focus.get();this.view.domNode.classList.toggle("element-focused",X.length>0),this.onDidChangeActiveDescendant()}onDidChangeActiveDescendant(){var X;const U=this.focus.get();if(U.length>0){let G;!((X=this.accessibilityProvider)===null||X===void 0)&&X.getActiveDescendantId&&(G=this.accessibilityProvider.getActiveDescendantId(this.view.element(U[0]))),this.view.domNode.setAttribute("aria-activedescendant",G||this.view.getElementDomId(U[0]))}else this.view.domNode.removeAttribute("aria-activedescendant")}_onSelectionChange(){const X=this.selection.get();this.view.domNode.classList.toggle("selection-none",X.length===0),this.view.domNode.classList.toggle("selection-single",X.length===1),this.view.domNode.classList.toggle("selection-multiple",X.length>1)}dispose(){this._onDidDispose.fire(),this.disposables.dispose(),this._onDidDispose.dispose()}}e.List=he,ke([a.memoize],he.prototype,"onDidChangeFocus",null),ke([a.memoize],he.prototype,"onDidChangeSelection",null),ke([a.memoize],he.prototype,"onContextMenu",null),ke([a.memoize],he.prototype,"onKeyDown",null),ke([a.memoize],he.prototype,"onDidFocus",null)}),define(se[594],oe([1,0,13,19,6,2,119,275]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PagedList=void 0;class p{get templateId(){return this.renderer.templateId}constructor(i,n){this.renderer=i,this.modelProvider=n}renderTemplate(i){return{data:this.renderer.renderTemplate(i),disposable:E.Disposable.None}}renderElement(i,n,t,r){var u;if((u=t.disposable)===null||u===void 0||u.dispose(),!t.data)return;const f=this.modelProvider();if(f.isResolved(i))return this.renderer.renderElement(f.get(i),i,t.data,r);const c=new k.CancellationTokenSource,d=f.resolve(i,c.token);t.disposable={dispose:()=>c.cancel()},this.renderer.renderPlaceholder(i,t.data),d.then(s=>this.renderer.renderElement(s,i,t.data,r))}disposeTemplate(i){i.disposable&&(i.disposable.dispose(),i.disposable=void 0),i.data&&(this.renderer.disposeTemplate(i.data),i.data=void 0)}}class _{constructor(i,n){this.modelProvider=i,this.accessibilityProvider=n}getWidgetAriaLabel(){return this.accessibilityProvider.getWidgetAriaLabel()}getAriaLabel(i){const n=this.modelProvider();return n.isResolved(i)?this.accessibilityProvider.getAriaLabel(n.get(i)):null}}function v(a,i){return{...i,accessibilityProvider:i.accessibilityProvider&&new _(a,i.accessibilityProvider)}}class b{constructor(i,n,t,r,u={}){const f=()=>this.model,c=r.map(d=>new p(d,f));this.list=new S.List(i,n,t,c,v(f,u))}updateOptions(i){this.list.updateOptions(i)}getHTMLElement(){return this.list.getHTMLElement()}get onDidFocus(){return this.list.onDidFocus}get widget(){return this.list}get onDidDispose(){return this.list.onDidDispose}get onMouseDblClick(){return y.Event.map(this.list.onMouseDblClick,({element:i,index:n,browserEvent:t})=>({element:i===void 0?void 0:this._model.get(i),index:n,browserEvent:t}))}get onPointer(){return y.Event.map(this.list.onPointer,({element:i,index:n,browserEvent:t})=>({element:i===void 0?void 0:this._model.get(i),index:n,browserEvent:t}))}get onDidChangeSelection(){return y.Event.map(this.list.onDidChangeSelection,({elements:i,indexes:n,browserEvent:t})=>({elements:i.map(r=>this._model.get(r)),indexes:n,browserEvent:t}))}get model(){return this._model}set model(i){this._model=i,this.list.splice(0,this.list.length,(0,L.range)(i.length))}getFocus(){return this.list.getFocus()}getSelection(){return this.list.getSelection()}getSelectedElements(){return this.getSelection().map(i=>this.model.get(i))}style(i){this.list.style(i)}dispose(){this.list.dispose()}}e.PagedList=b}),define(se[322],oe([1,0,7,84,158,77,13,39,6,2,145,147,20,424]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SplitView=e.Sizing=void 0;const n={separatorBorder:p.Color.transparent};class t{set size(l){this._size=l}get size(){return this._size}get visible(){return typeof this._cachedVisibleSize>"u"}setVisible(l,o){var g,h;if(l!==this.visible){l?(this.size=(0,b.clamp)(this._cachedVisibleSize,this.viewMinimumSize,this.viewMaximumSize),this._cachedVisibleSize=void 0):(this._cachedVisibleSize=typeof o=="number"?o:this.size,this.size=0),this.container.classList.toggle("visible",l);try{(h=(g=this.view).setVisible)===null||h===void 0||h.call(g,l)}catch(m){console.error("Splitview: Failed to set visible view"),console.error(m)}}}get minimumSize(){return this.visible?this.view.minimumSize:0}get viewMinimumSize(){return this.view.minimumSize}get maximumSize(){return this.visible?this.view.maximumSize:0}get viewMaximumSize(){return this.view.maximumSize}get priority(){return this.view.priority}get proportionalLayout(){var l;return(l=this.view.proportionalLayout)!==null&&l!==void 0?l:!0}get snap(){return!!this.view.snap}set enabled(l){this.container.style.pointerEvents=l?"":"none"}constructor(l,o,g,h){this.container=l,this.view=o,this.disposable=h,this._cachedVisibleSize=void 0,typeof g=="number"?(this._size=g,this._cachedVisibleSize=void 0,l.classList.add("visible")):(this._size=0,this._cachedVisibleSize=g.cachedVisibleSize)}layout(l,o){this.layoutContainer(l);try{this.view.layout(this.size,l,o)}catch(g){console.error("Splitview: Failed to layout view"),console.error(g)}}dispose(){this.disposable.dispose()}}class r extends t{layoutContainer(l){this.container.style.top=`${l}px`,this.container.style.height=`${this.size}px`}}class u extends t{layoutContainer(l){this.container.style.left=`${l}px`,this.container.style.width=`${this.size}px`}}var f;(function(s){s[s.Idle=0]="Idle",s[s.Busy=1]="Busy"})(f||(f={}));var c;(function(s){s.Distribute={type:"distribute"};function l(h){return{type:"split",index:h}}s.Split=l;function o(h){return{type:"auto",index:h}}s.Auto=o;function g(h){return{type:"invisible",cachedVisibleSize:h}}s.Invisible=g})(c||(e.Sizing=c={}));class d extends v.Disposable{get orthogonalStartSash(){return this._orthogonalStartSash}get orthogonalEndSash(){return this._orthogonalEndSash}get startSnappingEnabled(){return this._startSnappingEnabled}get endSnappingEnabled(){return this._endSnappingEnabled}set orthogonalStartSash(l){for(const o of this.sashItems)o.sash.orthogonalStartSash=l;this._orthogonalStartSash=l}set orthogonalEndSash(l){for(const o of this.sashItems)o.sash.orthogonalEndSash=l;this._orthogonalEndSash=l}set startSnappingEnabled(l){this._startSnappingEnabled!==l&&(this._startSnappingEnabled=l,this.updateSashEnablement())}set endSnappingEnabled(l){this._endSnappingEnabled!==l&&(this._endSnappingEnabled=l,this.updateSashEnablement())}constructor(l,o={}){var g,h,m,C,w;super(),this.size=0,this._contentSize=0,this.proportions=void 0,this.viewItems=[],this.sashItems=[],this.state=f.Idle,this._onDidSashChange=this._register(new _.Emitter),this._onDidSashReset=this._register(new _.Emitter),this._startSnappingEnabled=!0,this._endSnappingEnabled=!0,this.onDidSashChange=this._onDidSashChange.event,this.onDidSashReset=this._onDidSashReset.event,this.orientation=(g=o.orientation)!==null&&g!==void 0?g:0,this.inverseAltBehavior=(h=o.inverseAltBehavior)!==null&&h!==void 0?h:!1,this.proportionalLayout=(m=o.proportionalLayout)!==null&&m!==void 0?m:!0,this.getSashOrthogonalSize=o.getSashOrthogonalSize,this.el=document.createElement("div"),this.el.classList.add("monaco-split-view2"),this.el.classList.add(this.orientation===0?"vertical":"horizontal"),l.appendChild(this.el),this.sashContainer=(0,L.append)(this.el,(0,L.$)(".sash-container")),this.viewContainer=(0,L.$)(".split-view-container"),this.scrollable=this._register(new a.Scrollable({forceIntegerValues:!0,smoothScrollDuration:125,scheduleAtNextAnimationFrame:I=>(0,L.scheduleAtNextAnimationFrame)((0,L.getWindow)(this.el),I)})),this.scrollableElement=this._register(new E.SmoothScrollableElement(this.viewContainer,{vertical:this.orientation===0?(C=o.scrollbarVisibility)!==null&&C!==void 0?C:1:2,horizontal:this.orientation===1?(w=o.scrollbarVisibility)!==null&&w!==void 0?w:1:2},this.scrollable));const D=this._register(new k.DomEmitter(this.viewContainer,"scroll")).event;this._register(D(I=>{const T=this.scrollableElement.getScrollPosition(),A=Math.abs(this.viewContainer.scrollLeft-T.scrollLeft)<=1?void 0:this.viewContainer.scrollLeft,P=Math.abs(this.viewContainer.scrollTop-T.scrollTop)<=1?void 0:this.viewContainer.scrollTop;(A!==void 0||P!==void 0)&&this.scrollableElement.setScrollPosition({scrollLeft:A,scrollTop:P})})),this.onDidScroll=this.scrollableElement.onScroll,this._register(this.onDidScroll(I=>{I.scrollTopChanged&&(this.viewContainer.scrollTop=I.scrollTop),I.scrollLeftChanged&&(this.viewContainer.scrollLeft=I.scrollLeft)})),(0,L.append)(this.el,this.scrollableElement.getDomNode()),this.style(o.styles||n),o.descriptor&&(this.size=o.descriptor.size,o.descriptor.views.forEach((I,T)=>{const A=i.isUndefined(I.visible)||I.visible?I.size:{type:"invisible",cachedVisibleSize:I.size},P=I.view;this.doAddView(P,A,T,!0)}),this._contentSize=this.viewItems.reduce((I,T)=>I+T.size,0),this.saveProportions())}style(l){l.separatorBorder.isTransparent()?(this.el.classList.remove("separator-border"),this.el.style.removeProperty("--separator-border")):(this.el.classList.add("separator-border"),this.el.style.setProperty("--separator-border",l.separatorBorder.toString()))}addView(l,o,g=this.viewItems.length,h){this.doAddView(l,o,g,h)}layout(l,o){const g=Math.max(this.size,this._contentSize);if(this.size=l,this.layoutContext=o,this.proportions){let h=0;for(let m=0;m<this.viewItems.length;m++){const C=this.viewItems[m],w=this.proportions[m];typeof w=="number"?h+=w:l-=C.size}for(let m=0;m<this.viewItems.length;m++){const C=this.viewItems[m],w=this.proportions[m];typeof w=="number"&&h>0&&(C.size=(0,b.clamp)(Math.round(w*l/h),C.minimumSize,C.maximumSize))}}else{const h=(0,S.range)(this.viewItems.length),m=h.filter(w=>this.viewItems[w].priority===1),C=h.filter(w=>this.viewItems[w].priority===2);this.resize(this.viewItems.length-1,l-g,void 0,m,C)}this.distributeEmptySpace(),this.layoutViews()}saveProportions(){this.proportionalLayout&&this._contentSize>0&&(this.proportions=this.viewItems.map(l=>l.proportionalLayout&&l.visible?l.size/this._contentSize:void 0))}onSashStart({sash:l,start:o,alt:g}){for(const w of this.viewItems)w.enabled=!1;const h=this.sashItems.findIndex(w=>w.sash===l),m=(0,v.combinedDisposable)((0,L.addDisposableListener)(this.el.ownerDocument.body,"keydown",w=>C(this.sashDragState.current,w.altKey)),(0,L.addDisposableListener)(this.el.ownerDocument.body,"keyup",()=>C(this.sashDragState.current,!1))),C=(w,D)=>{const I=this.viewItems.map(M=>M.size);let T=Number.NEGATIVE_INFINITY,A=Number.POSITIVE_INFINITY;if(this.inverseAltBehavior&&(D=!D),D)if(h===this.sashItems.length-1){const R=this.viewItems[h];T=(R.minimumSize-R.size)/2,A=(R.maximumSize-R.size)/2}else{const R=this.viewItems[h+1];T=(R.size-R.maximumSize)/2,A=(R.size-R.minimumSize)/2}let P,N;if(!D){const M=(0,S.range)(h,-1),R=(0,S.range)(h+1,this.viewItems.length),x=M.reduce((ie,ae)=>ie+(this.viewItems[ae].minimumSize-I[ae]),0),O=M.reduce((ie,ae)=>ie+(this.viewItems[ae].viewMaximumSize-I[ae]),0),B=R.length===0?Number.POSITIVE_INFINITY:R.reduce((ie,ae)=>ie+(I[ae]-this.viewItems[ae].minimumSize),0),W=R.length===0?Number.NEGATIVE_INFINITY:R.reduce((ie,ae)=>ie+(I[ae]-this.viewItems[ae].viewMaximumSize),0),V=Math.max(x,W),K=Math.min(B,O),F=this.findFirstSnapIndex(M),q=this.findFirstSnapIndex(R);if(typeof F=="number"){const ie=this.viewItems[F],ae=Math.floor(ie.viewMinimumSize/2);P={index:F,limitDelta:ie.visible?V-ae:V+ae,size:ie.size}}if(typeof q=="number"){const ie=this.viewItems[q],ae=Math.floor(ie.viewMinimumSize/2);N={index:q,limitDelta:ie.visible?K+ae:K-ae,size:ie.size}}}this.sashDragState={start:w,current:w,index:h,sizes:I,minDelta:T,maxDelta:A,alt:D,snapBefore:P,snapAfter:N,disposable:m}};C(o,g)}onSashChange({current:l}){const{index:o,start:g,sizes:h,alt:m,minDelta:C,maxDelta:w,snapBefore:D,snapAfter:I}=this.sashDragState;this.sashDragState.current=l;const T=l-g,A=this.resize(o,T,h,void 0,void 0,C,w,D,I);if(m){const P=o===this.sashItems.length-1,N=this.viewItems.map(W=>W.size),M=P?o:o+1,R=this.viewItems[M],x=R.size-R.maximumSize,O=R.size-R.minimumSize,B=P?o-1:o+1;this.resize(B,-A,N,void 0,void 0,x,O)}this.distributeEmptySpace(),this.layoutViews()}onSashEnd(l){this._onDidSashChange.fire(l),this.sashDragState.disposable.dispose(),this.saveProportions();for(const o of this.viewItems)o.enabled=!0}onViewChange(l,o){const g=this.viewItems.indexOf(l);g<0||g>=this.viewItems.length||(o=typeof o=="number"?o:l.size,o=(0,b.clamp)(o,l.minimumSize,l.maximumSize),this.inverseAltBehavior&&g>0?(this.resize(g-1,Math.floor((l.size-o)/2)),this.distributeEmptySpace(),this.layoutViews()):(l.size=o,this.relayout([g],void 0)))}resizeView(l,o){if(!(l<0||l>=this.viewItems.length)){if(this.state!==f.Idle)throw new Error("Cant modify splitview");this.state=f.Busy;try{const g=(0,S.range)(this.viewItems.length).filter(w=>w!==l),h=[...g.filter(w=>this.viewItems[w].priority===1),l],m=g.filter(w=>this.viewItems[w].priority===2),C=this.viewItems[l];o=Math.round(o),o=(0,b.clamp)(o,C.minimumSize,Math.min(C.maximumSize,this.size)),C.size=o,this.relayout(h,m)}finally{this.state=f.Idle}}}distributeViewSizes(){const l=[];let o=0;for(const w of this.viewItems)w.maximumSize-w.minimumSize>0&&(l.push(w),o+=w.size);const g=Math.floor(o/l.length);for(const w of l)w.size=(0,b.clamp)(g,w.minimumSize,w.maximumSize);const h=(0,S.range)(this.viewItems.length),m=h.filter(w=>this.viewItems[w].priority===1),C=h.filter(w=>this.viewItems[w].priority===2);this.relayout(m,C)}getViewSize(l){return l<0||l>=this.viewItems.length?-1:this.viewItems[l].size}doAddView(l,o,g=this.viewItems.length,h){if(this.state!==f.Idle)throw new Error("Cant modify splitview");this.state=f.Busy;try{const m=(0,L.$)(".split-view-view");g===this.viewItems.length?this.viewContainer.appendChild(m):this.viewContainer.insertBefore(m,this.viewContainer.children.item(g));const C=l.onDidChange(P=>this.onViewChange(T,P)),w=(0,v.toDisposable)(()=>this.viewContainer.removeChild(m)),D=(0,v.combinedDisposable)(C,w);let I;typeof o=="number"?I=o:(o.type==="auto"&&(this.areViewsDistributed()?o={type:"distribute"}:o={type:"split",index:o.index}),o.type==="split"?I=this.getViewSize(o.index)/2:o.type==="invisible"?I={cachedVisibleSize:o.cachedVisibleSize}:I=l.minimumSize);const T=this.orientation===0?new r(m,l,I,D):new u(m,l,I,D);if(this.viewItems.splice(g,0,T),this.viewItems.length>1){const P={orthogonalStartSash:this.orthogonalStartSash,orthogonalEndSash:this.orthogonalEndSash},N=this.orientation===0?new y.Sash(this.sashContainer,{getHorizontalSashTop:ie=>this.getSashPosition(ie),getHorizontalSashWidth:this.getSashOrthogonalSize},{...P,orientation:1}):new y.Sash(this.sashContainer,{getVerticalSashLeft:ie=>this.getSashPosition(ie),getVerticalSashHeight:this.getSashOrthogonalSize},{...P,orientation:0}),M=this.orientation===0?ie=>({sash:N,start:ie.startY,current:ie.currentY,alt:ie.altKey}):ie=>({sash:N,start:ie.startX,current:ie.currentX,alt:ie.altKey}),x=_.Event.map(N.onDidStart,M)(this.onSashStart,this),B=_.Event.map(N.onDidChange,M)(this.onSashChange,this),V=_.Event.map(N.onDidEnd,()=>this.sashItems.findIndex(ie=>ie.sash===N))(this.onSashEnd,this),K=N.onDidReset(()=>{const ie=this.sashItems.findIndex(Q=>Q.sash===N),ae=(0,S.range)(ie,-1),ne=(0,S.range)(ie+1,this.viewItems.length),$=this.findFirstSnapIndex(ae),J=this.findFirstSnapIndex(ne);typeof $=="number"&&!this.viewItems[$].visible||typeof J=="number"&&!this.viewItems[J].visible||this._onDidSashReset.fire(ie)}),F=(0,v.combinedDisposable)(x,B,V,K,N),q={sash:N,disposable:F};this.sashItems.splice(g-1,0,q)}m.appendChild(l.element);let A;typeof o!="number"&&o.type==="split"&&(A=[o.index]),h||this.relayout([g],A),!h&&typeof o!="number"&&o.type==="distribute"&&this.distributeViewSizes()}finally{this.state=f.Idle}}relayout(l,o){const g=this.viewItems.reduce((h,m)=>h+m.size,0);this.resize(this.viewItems.length-1,this.size-g,void 0,l,o),this.distributeEmptySpace(),this.layoutViews(),this.saveProportions()}resize(l,o,g=this.viewItems.map(T=>T.size),h,m,C=Number.NEGATIVE_INFINITY,w=Number.POSITIVE_INFINITY,D,I){if(l<0||l>=this.viewItems.length)return 0;const T=(0,S.range)(l,-1),A=(0,S.range)(l+1,this.viewItems.length);if(m)for(const q of m)(0,S.pushToStart)(T,q),(0,S.pushToStart)(A,q);if(h)for(const q of h)(0,S.pushToEnd)(T,q),(0,S.pushToEnd)(A,q);const P=T.map(q=>this.viewItems[q]),N=T.map(q=>g[q]),M=A.map(q=>this.viewItems[q]),R=A.map(q=>g[q]),x=T.reduce((q,ie)=>q+(this.viewItems[ie].minimumSize-g[ie]),0),O=T.reduce((q,ie)=>q+(this.viewItems[ie].maximumSize-g[ie]),0),B=A.length===0?Number.POSITIVE_INFINITY:A.reduce((q,ie)=>q+(g[ie]-this.viewItems[ie].minimumSize),0),W=A.length===0?Number.NEGATIVE_INFINITY:A.reduce((q,ie)=>q+(g[ie]-this.viewItems[ie].maximumSize),0),V=Math.max(x,W,C),K=Math.min(B,O,w);let F=!1;if(D){const q=this.viewItems[D.index],ie=o>=D.limitDelta;F=ie!==q.visible,q.setVisible(ie,D.size)}if(!F&&I){const q=this.viewItems[I.index],ie=o<I.limitDelta;F=ie!==q.visible,q.setVisible(ie,I.size)}if(F)return this.resize(l,o,g,h,m,C,w);o=(0,b.clamp)(o,V,K);for(let q=0,ie=o;q<P.length;q++){const ae=P[q],ne=(0,b.clamp)(N[q]+ie,ae.minimumSize,ae.maximumSize),$=ne-N[q];ie-=$,ae.size=ne}for(let q=0,ie=o;q<M.length;q++){const ae=M[q],ne=(0,b.clamp)(R[q]-ie,ae.minimumSize,ae.maximumSize),$=ne-R[q];ie+=$,ae.size=ne}return o}distributeEmptySpace(l){const o=this.viewItems.reduce((w,D)=>w+D.size,0);let g=this.size-o;const h=(0,S.range)(this.viewItems.length-1,-1),m=h.filter(w=>this.viewItems[w].priority===1),C=h.filter(w=>this.viewItems[w].priority===2);for(const w of C)(0,S.pushToStart)(h,w);for(const w of m)(0,S.pushToEnd)(h,w);typeof l=="number"&&(0,S.pushToEnd)(h,l);for(let w=0;g!==0&&w<h.length;w++){const D=this.viewItems[h[w]],I=(0,b.clamp)(D.size+g,D.minimumSize,D.maximumSize),T=I-D.size;g-=T,D.size=I}}layoutViews(){this._contentSize=this.viewItems.reduce((o,g)=>o+g.size,0);let l=0;for(const o of this.viewItems)o.layout(l,this.layoutContext),l+=o.size;this.sashItems.forEach(o=>o.sash.layout()),this.updateSashEnablement(),this.updateScrollableElement()}updateScrollableElement(){this.orientation===0?this.scrollableElement.setScrollDimensions({height:this.size,scrollHeight:this._contentSize}):this.scrollableElement.setScrollDimensions({width:this.size,scrollWidth:this._contentSize})}updateSashEnablement(){let l=!1;const o=this.viewItems.map(D=>l=D.size-D.minimumSize>0||l);l=!1;const g=this.viewItems.map(D=>l=D.maximumSize-D.size>0||l),h=[...this.viewItems].reverse();l=!1;const m=h.map(D=>l=D.size-D.minimumSize>0||l).reverse();l=!1;const C=h.map(D=>l=D.maximumSize-D.size>0||l).reverse();let w=0;for(let D=0;D<this.sashItems.length;D++){const{sash:I}=this.sashItems[D],T=this.viewItems[D];w+=T.size;const A=!(o[D]&&C[D+1]),P=!(g[D]&&m[D+1]);if(A&&P){const N=(0,S.range)(D,-1),M=(0,S.range)(D+1,this.viewItems.length),R=this.findFirstSnapIndex(N),x=this.findFirstSnapIndex(M),O=typeof R=="number"&&!this.viewItems[R].visible,B=typeof x=="number"&&!this.viewItems[x].visible;O&&m[D]&&(w>0||this.startSnappingEnabled)?I.state=1:B&&o[D]&&(w<this._contentSize||this.endSnappingEnabled)?I.state=2:I.state=0}else A&&!P?I.state=1:!A&&P?I.state=2:I.state=3}}getSashPosition(l){let o=0;for(let g=0;g<this.sashItems.length;g++)if(o+=this.viewItems[g].size,this.sashItems[g].sash===l)return o;return 0}findFirstSnapIndex(l){for(const o of l){const g=this.viewItems[o];if(g.visible&&g.snap)return o}for(const o of l){const g=this.viewItems[o];if(g.visible&&g.maximumSize-g.minimumSize>0)return;if(!g.visible&&g.snap)return o}}areViewsDistributed(){let l,o;for(const g of this.viewItems)if(l=l===void 0?g.size:Math.min(l,g.size),o=o===void 0?g.size:Math.max(o,g.size),o-l>2)return!1;return!0}dispose(){var l;(l=this.sashDragState)===null||l===void 0||l.disposable.dispose(),(0,v.dispose)(this.viewItems),this.viewItems=[],this.sashItems.forEach(o=>o.disposable.dispose()),this.sashItems=[],super.dispose()}}e.SplitView=d}),define(se[595],oe([1,0,7,119,322,6,2,425]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Table=void 0;class p{constructor(i,n,t){this.columns=i,this.getColumnSize=t,this.templateId=p.TemplateId,this.renderedTemplates=new Set;const r=new Map(n.map(u=>[u.templateId,u]));this.renderers=[];for(const u of i){const f=r.get(u.templateId);if(!f)throw new Error(`Table cell renderer for template id ${u.templateId} not found.`);this.renderers.push(f)}}renderTemplate(i){const n=(0,L.append)(i,(0,L.$)(".monaco-table-tr")),t=[],r=[];for(let f=0;f<this.columns.length;f++){const c=this.renderers[f],d=(0,L.append)(n,(0,L.$)(".monaco-table-td",{"data-col-index":f}));d.style.width=`${this.getColumnSize(f)}px`,t.push(d),r.push(c.renderTemplate(d))}const u={container:i,cellContainers:t,cellTemplateData:r};return this.renderedTemplates.add(u),u}renderElement(i,n,t,r){for(let u=0;u<this.columns.length;u++){const c=this.columns[u].project(i);this.renderers[u].renderElement(c,n,t.cellTemplateData[u],r)}}disposeElement(i,n,t,r){for(let u=0;u<this.columns.length;u++){const f=this.renderers[u];if(f.disposeElement){const d=this.columns[u].project(i);f.disposeElement(d,n,t.cellTemplateData[u],r)}}}disposeTemplate(i){for(let n=0;n<this.columns.length;n++)this.renderers[n].disposeTemplate(i.cellTemplateData[n]);(0,L.clearNode)(i.container),this.renderedTemplates.delete(i)}layoutColumn(i,n){for(const{cellContainers:t}of this.renderedTemplates)t[i].style.width=`${n}px`}}p.TemplateId="row";function _(a){return{getHeight(i){return a.getHeight(i)},getTemplateId(){return p.TemplateId}}}class v{get minimumSize(){var i;return(i=this.column.minimumWidth)!==null&&i!==void 0?i:120}get maximumSize(){var i;return(i=this.column.maximumWidth)!==null&&i!==void 0?i:Number.POSITIVE_INFINITY}get onDidChange(){var i;return(i=this.column.onDidChangeWidthConstraints)!==null&&i!==void 0?i:E.Event.None}constructor(i,n){this.column=i,this.index=n,this._onDidLayout=new E.Emitter,this.onDidLayout=this._onDidLayout.event,this.element=(0,L.$)(".monaco-table-th",{"data-col-index":n,title:i.tooltip},i.label)}layout(i){this._onDidLayout.fire([this.index,i])}}class b{get onDidChangeFocus(){return this.list.onDidChangeFocus}get onDidChangeSelection(){return this.list.onDidChangeSelection}get onDidScroll(){return this.list.onDidScroll}get onMouseDblClick(){return this.list.onMouseDblClick}get onPointer(){return this.list.onPointer}get onDidFocus(){return this.list.onDidFocus}get scrollTop(){return this.list.scrollTop}set scrollTop(i){this.list.scrollTop=i}get scrollHeight(){return this.list.scrollHeight}get renderHeight(){return this.list.renderHeight}get onDidDispose(){return this.list.onDidDispose}constructor(i,n,t,r,u,f){this.virtualDelegate=t,this.domId=`table_id_${++b.InstanceCount}`,this.disposables=new S.DisposableStore,this.cachedWidth=0,this.cachedHeight=0,this.domNode=(0,L.append)(n,(0,L.$)(`.monaco-table.${this.domId}`));const c=r.map((l,o)=>new v(l,o)),d={size:c.reduce((l,o)=>l+o.column.weight,0),views:c.map(l=>({size:l.column.weight,view:l}))};this.splitview=this.disposables.add(new y.SplitView(this.domNode,{orientation:1,scrollbarVisibility:2,getSashOrthogonalSize:()=>this.cachedHeight,descriptor:d})),this.splitview.el.style.height=`${t.headerRowHeight}px`,this.splitview.el.style.lineHeight=`${t.headerRowHeight}px`;const s=new p(r,u,l=>this.splitview.getViewSize(l));this.list=this.disposables.add(new k.List(i,this.domNode,_(t),[s],f)),E.Event.any(...c.map(l=>l.onDidLayout))(([l,o])=>s.layoutColumn(l,o),null,this.disposables),this.splitview.onDidSashReset(l=>{const o=r.reduce((h,m)=>h+m.weight,0),g=r[l].weight/o*this.cachedWidth;this.splitview.resizeView(l,g)},null,this.disposables),this.styleElement=(0,L.createStyleSheet)(this.domNode),this.style(k.unthemedListStyles)}updateOptions(i){this.list.updateOptions(i)}splice(i,n,t=[]){this.list.splice(i,n,t)}getHTMLElement(){return this.domNode}style(i){const n=[];n.push(`.monaco-table.${this.domId} > .monaco-split-view2 .monaco-sash.vertical::before {
+			top: ${this.virtualDelegate.headerRowHeight+1}px;
+			height: calc(100% - ${this.virtualDelegate.headerRowHeight}px);
+		}`),this.styleElement.textContent=n.join(`
+`),this.list.style(i)}getSelectedElements(){return this.list.getSelectedElements()}getSelection(){return this.list.getSelection()}getFocus(){return this.list.getFocus()}dispose(){this.disposables.dispose()}}e.Table=b,b.InstanceCount=0}),define(se[159],oe([1,0,76,28,6,426]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Toggle=e.unthemedToggleStyles=void 0,e.unthemedToggleStyles={inputActiveOptionBorder:"#007ACC00",inputActiveOptionForeground:"#FFFFFF",inputActiveOptionBackground:"#0E639C50"};class E extends L.Widget{constructor(p){super(),this._onChange=this._register(new y.Emitter),this.onChange=this._onChange.event,this._onKeyDown=this._register(new y.Emitter),this.onKeyDown=this._onKeyDown.event,this._opts=p,this._checked=this._opts.isChecked;const _=["monaco-custom-toggle"];this._opts.icon&&(this._icon=this._opts.icon,_.push(...k.ThemeIcon.asClassNameArray(this._icon))),this._opts.actionClassName&&_.push(...this._opts.actionClassName.split(" ")),this._checked&&_.push("checked"),this.domNode=document.createElement("div"),this.domNode.title=this._opts.title,this.domNode.classList.add(..._),this._opts.notFocusable||(this.domNode.tabIndex=0),this.domNode.setAttribute("role","checkbox"),this.domNode.setAttribute("aria-checked",String(this._checked)),this.domNode.setAttribute("aria-label",this._opts.title),this.applyStyles(),this.onclick(this.domNode,v=>{this.enabled&&(this.checked=!this._checked,this._onChange.fire(!1),v.preventDefault())}),this._register(this.ignoreGesture(this.domNode)),this.onkeydown(this.domNode,v=>{if(v.keyCode===10||v.keyCode===3){this.checked=!this._checked,this._onChange.fire(!0),v.preventDefault(),v.stopPropagation();return}this._onKeyDown.fire(v)})}get enabled(){return this.domNode.getAttribute("aria-disabled")!=="true"}focus(){this.domNode.focus()}get checked(){return this._checked}set checked(p){this._checked=p,this.domNode.setAttribute("aria-checked",String(this._checked)),this.domNode.classList.toggle("checked",this._checked),this.applyStyles()}width(){return 2+2+2+16}applyStyles(){this.domNode&&(this.domNode.style.borderColor=this._checked&&this._opts.inputActiveOptionBorder||"",this.domNode.style.color=this._checked&&this._opts.inputActiveOptionForeground||"inherit",this.domNode.style.backgroundColor=this._checked&&this._opts.inputActiveOptionBackground||"")}enable(){this.domNode.setAttribute("aria-disabled",String(!1))}disable(){this.domNode.setAttribute("aria-disabled",String(!0))}}e.Toggle=E}),define(se[323],oe([1,0,159,26,568]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RegexToggle=e.WholeWordsToggle=e.CaseSensitiveToggle=void 0;const E=y.localize(0,null),S=y.localize(1,null),p=y.localize(2,null);class _ extends L.Toggle{constructor(i){super({icon:k.Codicon.caseSensitive,title:E+i.appendTitle,isChecked:i.isChecked,inputActiveOptionBorder:i.inputActiveOptionBorder,inputActiveOptionForeground:i.inputActiveOptionForeground,inputActiveOptionBackground:i.inputActiveOptionBackground})}}e.CaseSensitiveToggle=_;class v extends L.Toggle{constructor(i){super({icon:k.Codicon.wholeWord,title:S+i.appendTitle,isChecked:i.isChecked,inputActiveOptionBorder:i.inputActiveOptionBorder,inputActiveOptionForeground:i.inputActiveOptionForeground,inputActiveOptionBackground:i.inputActiveOptionBackground})}}e.WholeWordsToggle=v;class b extends L.Toggle{constructor(i){super({icon:k.Codicon.regex,title:p+i.appendTitle,isChecked:i.isChecked,inputActiveOptionBorder:i.inputActiveOptionBorder,inputActiveOptionForeground:i.inputActiveOptionForeground,inputActiveOptionBackground:i.inputActiveOptionBackground})}}e.RegexToggle=b}),define(se[49],oe([1,0,222,47,95,17,11,22]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DataUri=e.addTrailingPathSeparator=e.removeTrailingPathSeparator=e.hasTrailingPathSeparator=e.isEqualAuthority=e.isAbsolutePath=e.resolvePath=e.relativePath=e.normalizePath=e.joinPath=e.dirname=e.extname=e.basename=e.basenameOrAuthority=e.getComparisonKey=e.isEqualOrParent=e.isEqual=e.extUriIgnorePathCase=e.extUriBiasedIgnorePathCase=e.extUri=e.ExtUri=e.originalFSPath=void 0;function _(a){return(0,p.uriToFsPath)(a,!0)}e.originalFSPath=_;class v{constructor(i){this._ignorePathCasing=i}compare(i,n,t=!1){return i===n?0:(0,S.compare)(this.getComparisonKey(i,t),this.getComparisonKey(n,t))}isEqual(i,n,t=!1){return i===n?!0:!i||!n?!1:this.getComparisonKey(i,t)===this.getComparisonKey(n,t)}getComparisonKey(i,n=!1){return i.with({path:this._ignorePathCasing(i)?i.path.toLowerCase():void 0,fragment:n?null:void 0}).toString()}isEqualOrParent(i,n,t=!1){if(i.scheme===n.scheme){if(i.scheme===k.Schemas.file)return L.isEqualOrParent(_(i),_(n),this._ignorePathCasing(i))&&i.query===n.query&&(t||i.fragment===n.fragment);if((0,e.isEqualAuthority)(i.authority,n.authority))return L.isEqualOrParent(i.path,n.path,this._ignorePathCasing(i),"/")&&i.query===n.query&&(t||i.fragment===n.fragment)}return!1}joinPath(i,...n){return p.URI.joinPath(i,...n)}basenameOrAuthority(i){return(0,e.basename)(i)||i.authority}basename(i){return y.posix.basename(i.path)}extname(i){return y.posix.extname(i.path)}dirname(i){if(i.path.length===0)return i;let n;return i.scheme===k.Schemas.file?n=p.URI.file(y.dirname(_(i))).path:(n=y.posix.dirname(i.path),i.authority&&n.length&&n.charCodeAt(0)!==47&&(console.error(`dirname("${i.toString})) resulted in a relative path`),n="/")),i.with({path:n})}normalizePath(i){if(!i.path.length)return i;let n;return i.scheme===k.Schemas.file?n=p.URI.file(y.normalize(_(i))).path:n=y.posix.normalize(i.path),i.with({path:n})}relativePath(i,n){if(i.scheme!==n.scheme||!(0,e.isEqualAuthority)(i.authority,n.authority))return;if(i.scheme===k.Schemas.file){const u=y.relative(_(i),_(n));return E.isWindows?L.toSlashes(u):u}let t=i.path||"/";const r=n.path||"/";if(this._ignorePathCasing(i)){let u=0;for(const f=Math.min(t.length,r.length);u<f&&!(t.charCodeAt(u)!==r.charCodeAt(u)&&t.charAt(u).toLowerCase()!==r.charAt(u).toLowerCase());u++);t=r.substr(0,u)+t.substr(u)}return y.posix.relative(t,r)}resolvePath(i,n){if(i.scheme===k.Schemas.file){const t=p.URI.file(y.resolve(_(i),n));return i.with({authority:t.authority,path:t.path})}return n=L.toPosixPath(n),i.with({path:y.posix.resolve(i.path,n)})}isAbsolutePath(i){return!!i.path&&i.path[0]==="/"}isEqualAuthority(i,n){return i===n||i!==void 0&&n!==void 0&&(0,S.equalsIgnoreCase)(i,n)}hasTrailingPathSeparator(i,n=y.sep){if(i.scheme===k.Schemas.file){const t=_(i);return t.length>L.getRoot(t).length&&t[t.length-1]===n}else{const t=i.path;return t.length>1&&t.charCodeAt(t.length-1)===47&&!/^[a-zA-Z]:(\/$|\\$)/.test(i.fsPath)}}removeTrailingPathSeparator(i,n=y.sep){return(0,e.hasTrailingPathSeparator)(i,n)?i.with({path:i.path.substr(0,i.path.length-1)}):i}addTrailingPathSeparator(i,n=y.sep){let t=!1;if(i.scheme===k.Schemas.file){const r=_(i);t=r!==void 0&&r.length===L.getRoot(r).length&&r[r.length-1]===n}else{n="/";const r=i.path;t=r.length===1&&r.charCodeAt(r.length-1)===47}return!t&&!(0,e.hasTrailingPathSeparator)(i,n)?i.with({path:i.path+"/"}):i}}e.ExtUri=v,e.extUri=new v(()=>!1),e.extUriBiasedIgnorePathCase=new v(a=>a.scheme===k.Schemas.file?!E.isLinux:!0),e.extUriIgnorePathCase=new v(a=>!0),e.isEqual=e.extUri.isEqual.bind(e.extUri),e.isEqualOrParent=e.extUri.isEqualOrParent.bind(e.extUri),e.getComparisonKey=e.extUri.getComparisonKey.bind(e.extUri),e.basenameOrAuthority=e.extUri.basenameOrAuthority.bind(e.extUri),e.basename=e.extUri.basename.bind(e.extUri),e.extname=e.extUri.extname.bind(e.extUri),e.dirname=e.extUri.dirname.bind(e.extUri),e.joinPath=e.extUri.joinPath.bind(e.extUri),e.normalizePath=e.extUri.normalizePath.bind(e.extUri),e.relativePath=e.extUri.relativePath.bind(e.extUri),e.resolvePath=e.extUri.resolvePath.bind(e.extUri),e.isAbsolutePath=e.extUri.isAbsolutePath.bind(e.extUri),e.isEqualAuthority=e.extUri.isEqualAuthority.bind(e.extUri),e.hasTrailingPathSeparator=e.extUri.hasTrailingPathSeparator.bind(e.extUri),e.removeTrailingPathSeparator=e.extUri.removeTrailingPathSeparator.bind(e.extUri),e.addTrailingPathSeparator=e.extUri.addTrailingPathSeparator.bind(e.extUri);var b;(function(a){a.META_DATA_LABEL="label",a.META_DATA_DESCRIPTION="description",a.META_DATA_SIZE="size",a.META_DATA_MIME="mime";function i(n){const t=new Map;n.path.substring(n.path.indexOf(";")+1,n.path.lastIndexOf(";")).split(";").forEach(f=>{const[c,d]=f.split(":");c&&d&&t.set(c,d)});const u=n.path.substring(0,n.path.indexOf(";"));return u&&t.set(a.META_DATA_MIME,u),t}a.parseMetaData=i})(b||(e.DataUri=b={}))}),define(se[58],oe([1,0,12,126,49,11,22]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.parseHrefAndDimensions=e.removeMarkdownEscapes=e.escapeDoubleQuotes=e.appendEscapedMarkdownCodeBlockFence=e.escapeMarkdownSyntaxTokens=e.markdownStringEqual=e.isMarkdownString=e.isEmptyMarkdownString=e.MarkdownString=void 0;class p{constructor(f="",c=!1){var d,s,l;if(this.value=f,typeof this.value!="string")throw(0,L.illegalArgument)("value");typeof c=="boolean"?(this.isTrusted=c,this.supportThemeIcons=!1,this.supportHtml=!1):(this.isTrusted=(d=c.isTrusted)!==null&&d!==void 0?d:void 0,this.supportThemeIcons=(s=c.supportThemeIcons)!==null&&s!==void 0?s:!1,this.supportHtml=(l=c.supportHtml)!==null&&l!==void 0?l:!1)}appendText(f,c=0){return this.value+=a(this.supportThemeIcons?(0,k.escapeIcons)(f):f).replace(/([ \t]+)/g,(d,s)=>"&nbsp;".repeat(s.length)).replace(/\>/gm,"\\>").replace(/\n/g,c===1?`\\
+`:`
+
+`),this}appendMarkdown(f){return this.value+=f,this}appendCodeblock(f,c){return this.value+=`
+${i(c,f)}
+`,this}appendLink(f,c,d){return this.value+="[",this.value+=this._escape(c,"]"),this.value+="](",this.value+=this._escape(String(f),")"),d&&(this.value+=` "${this._escape(this._escape(d,'"'),")")}"`),this.value+=")",this}_escape(f,c){const d=new RegExp((0,E.escapeRegExpCharacters)(c),"g");return f.replace(d,(s,l)=>f.charAt(l-1)!=="\\"?`\\${s}`:s)}}e.MarkdownString=p;function _(u){return v(u)?!u.value:Array.isArray(u)?u.every(_):!0}e.isEmptyMarkdownString=_;function v(u){return u instanceof p?!0:u&&typeof u=="object"?typeof u.value=="string"&&(typeof u.isTrusted=="boolean"||typeof u.isTrusted=="object"||u.isTrusted===void 0)&&(typeof u.supportThemeIcons=="boolean"||u.supportThemeIcons===void 0):!1}e.isMarkdownString=v;function b(u,f){return u===f?!0:!u||!f?!1:u.value===f.value&&u.isTrusted===f.isTrusted&&u.supportThemeIcons===f.supportThemeIcons&&u.supportHtml===f.supportHtml&&(u.baseUri===f.baseUri||!!u.baseUri&&!!f.baseUri&&(0,y.isEqual)(S.URI.from(u.baseUri),S.URI.from(f.baseUri)))}e.markdownStringEqual=b;function a(u){return u.replace(/[\\`*_{}[\]()#+\-!~]/g,"\\$&")}e.escapeMarkdownSyntaxTokens=a;function i(u,f){var c,d;const s=(d=(c=u.match(/^`+/gm))===null||c===void 0?void 0:c.reduce((o,g)=>o.length>g.length?o:g).length)!==null&&d!==void 0?d:0,l=s>=3?s+1:3;return[`${"`".repeat(l)}${f}`,u,`${"`".repeat(l)}`].join(`
+`)}e.appendEscapedMarkdownCodeBlockFence=i;function n(u){return u.replace(/"/g,"&quot;")}e.escapeDoubleQuotes=n;function t(u){return u&&u.replace(/\\([\\`*_{}[\]()#+\-.!~])/g,"$1")}e.removeMarkdownEscapes=t;function r(u){const f=[],c=u.split("|").map(s=>s.trim());u=c[0];const d=c[1];if(d){const s=/height=(\d+)/.exec(d),l=/width=(\d+)/.exec(d),o=s?s[1]:"",g=l?l[1]:"",h=isFinite(parseInt(g)),m=isFinite(parseInt(o));h&&f.push(`width="${g}"`),m&&f.push(`height="${o}"`)}return{href:u,dimensions:f}}e.parseHrefAndDimensions=r}),define(se[186],oe([1,0,7,316,84,317,46,67,118,12,6,58,126,170,99,2,400,223,47,55,49,11,22]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.fillInIncompleteTokens=e.renderMarkdownAsPlaintext=e.renderStringAsPlaintext=e.allowedMarkdownAttr=e.renderMarkdown=void 0;const g=Object.freeze({image:($,J,Q)=>{let re=[],de=[];return $&&({href:$,dimensions:re}=(0,a.parseHrefAndDimensions)($),de.push(`src="${(0,a.escapeDoubleQuotes)($)}"`)),Q&&de.push(`alt="${(0,a.escapeDoubleQuotes)(Q)}"`),J&&de.push(`title="${(0,a.escapeDoubleQuotes)(J)}"`),re.length&&(de=de.concat(re)),"<img "+de.join(" ")+">"},paragraph:$=>`<p>${$}</p>`,link:($,J,Q)=>typeof $!="string"?"":($===Q&&(Q=(0,a.removeMarkdownEscapes)(Q)),J=typeof J=="string"?(0,a.escapeDoubleQuotes)((0,a.removeMarkdownEscapes)(J)):"",$=(0,a.removeMarkdownEscapes)($),$=$.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;"),`<a href="${$}" title="${J||$}" draggable="false">${Q}</a>`)});function h($,J={},Q={}){var re,de;const he=new r.DisposableStore;let me=!1;const X=(0,E.createElement)(J),U=function(ue){let ce;try{ce=(0,f.parse)(decodeURIComponent(ue))}catch{}return ce?(ce=(0,d.cloneAndChange)(ce,pe=>{if($.uris&&$.uris[pe])return o.URI.revive($.uris[pe])}),encodeURIComponent(JSON.stringify(ce))):ue},G=function(ue,ce){const pe=$.uris&&$.uris[ue];let ve=o.URI.revive(pe);return ce?ue.startsWith(c.Schemas.data+":")?ue:(ve||(ve=o.URI.parse(ue)),c.FileAccess.uriToBrowserUri(ve).toString(!0)):!ve||o.URI.parse(ue).toString()===ve.toString()?ue:(ve.query&&(ve=ve.with({query:U(ve.query)})),ve.toString())},z=new u.marked.Renderer;z.image=g.image,z.link=g.link,z.paragraph=g.paragraph;const H=[],Y=[];if(J.codeBlockRendererSync?z.code=(ue,ce)=>{const pe=n.defaultGenerator.nextId(),ve=J.codeBlockRendererSync(m(ce),ue);return Y.push([pe,ve]),`<div class="code" data-code="${pe}">${(0,l.escape)(ue)}</div>`}:J.codeBlockRenderer&&(z.code=(ue,ce)=>{const pe=n.defaultGenerator.nextId(),ve=J.codeBlockRenderer(m(ce),ue);return H.push(ve.then(Ce=>[pe,Ce])),`<div class="code" data-code="${pe}">${(0,l.escape)(ue)}</div>`}),J.actionHandler){const ue=function(ve){let Ce=ve.target;if(!(Ce.tagName!=="A"&&(Ce=Ce.parentElement,!Ce||Ce.tagName!=="A")))try{let Se=Ce.dataset.href;Se&&($.baseUri&&(Se=C(o.URI.from($.baseUri),Se)),J.actionHandler.callback(Se,ve))}catch(Se){(0,v.onUnexpectedError)(Se)}finally{ve.preventDefault()}},ce=J.actionHandler.disposables.add(new y.DomEmitter(X,"click")),pe=J.actionHandler.disposables.add(new y.DomEmitter(X,"auxclick"));J.actionHandler.disposables.add(b.Event.any(ce.event,pe.event)(ve=>{const Ce=new p.StandardMouseEvent(L.getWindow(X),ve);!Ce.leftButton&&!Ce.middleButton||ue(Ce)})),J.actionHandler.disposables.add(L.addDisposableListener(X,"keydown",ve=>{const Ce=new S.StandardKeyboardEvent(ve);!Ce.equals(10)&&!Ce.equals(3)||ue(Ce)}))}$.supportHtml||(Q.sanitizer=ue=>($.isTrusted?ue.match(/^(<span[^>]+>)|(<\/\s*span>)$/):void 0)?ue:"",Q.sanitize=!0,Q.silent=!0),Q.renderer=z;let j=(re=$.value)!==null&&re!==void 0?re:"";j.length>1e5&&(j=`${j.substr(0,1e5)}\u2026`),$.supportThemeIcons&&(j=(0,i.markdownEscapeEscapedIcons)(j));let Z;if(J.fillInIncompleteTokens){const ue={...u.marked.defaults,...Q},ce=u.marked.lexer(j,ue),pe=R(ce);Z=u.marked.parser(pe,ue)}else Z=u.marked.parse(j,Q);$.supportThemeIcons&&(Z=(0,_.renderLabelWithIcons)(Z).map(ce=>typeof ce=="string"?ce:ce.outerHTML).join(""));const le=new DOMParser().parseFromString(w($,Z),"text/html");if(le.body.querySelectorAll("img").forEach(ue=>{const ce=ue.getAttribute("src");if(ce){let pe=ce;try{$.baseUri&&(pe=C(o.URI.from($.baseUri),pe))}catch{}ue.src=G(pe,!0)}}),le.body.querySelectorAll("a").forEach(ue=>{const ce=ue.getAttribute("href");if(ue.setAttribute("href",""),!ce||/^data:|javascript:/i.test(ce)||/^command:/i.test(ce)&&!$.isTrusted||/^command:(\/\/\/)?_workbench\.downloadResource/i.test(ce))ue.replaceWith(...ue.childNodes);else{let pe=G(ce,!1);$.baseUri&&(pe=C(o.URI.from($.baseUri),ce)),ue.dataset.href=pe}}),X.innerHTML=w($,le.body.innerHTML),H.length>0)Promise.all(H).then(ue=>{var ce,pe;if(me)return;const ve=new Map(ue),Ce=X.querySelectorAll("div[data-code]");for(const Se of Ce){const _e=ve.get((ce=Se.dataset.code)!==null&&ce!==void 0?ce:"");_e&&L.reset(Se,_e)}(pe=J.asyncRenderCallback)===null||pe===void 0||pe.call(J)});else if(Y.length>0){const ue=new Map(Y),ce=X.querySelectorAll("div[data-code]");for(const pe of ce){const ve=ue.get((de=pe.dataset.code)!==null&&de!==void 0?de:"");ve&&L.reset(pe,ve)}}if(J.asyncRenderCallback)for(const ue of X.getElementsByTagName("img")){const ce=he.add(L.addDisposableListener(ue,"load",()=>{ce.dispose(),J.asyncRenderCallback()}))}return{element:X,dispose:()=>{me=!0,he.dispose()}}}e.renderMarkdown=h;function m($){if(!$)return"";const J=$.split(/[\s+|:|,|\{|\?]/,1);return J.length?J[0]:$}function C($,J){return/^\w[\w\d+.-]*:/.test(J)?J:$.path.endsWith("/")?(0,s.resolvePath)($,J).toString():(0,s.resolvePath)((0,s.dirname)($),J).toString()}function w($,J){const{config:Q,allowedSchemes:re}=D($);k.addHook("uponSanitizeAttribute",(he,me)=>{var X;if(me.attrName==="style"||me.attrName==="class"){if(he.tagName==="SPAN"){if(me.attrName==="style"){me.keepAttr=/^(color\:(#[0-9a-fA-F]+|var\(--vscode(-[a-zA-Z]+)+\));)?(background-color\:(#[0-9a-fA-F]+|var\(--vscode(-[a-zA-Z]+)+\));)?$/.test(me.attrValue);return}else if(me.attrName==="class"){me.keepAttr=/^codicon codicon-[a-z\-]+( codicon-modifier-[a-z\-]+)?$/.test(me.attrValue);return}}me.keepAttr=!1;return}else if(he.tagName==="INPUT"&&((X=he.attributes.getNamedItem("type"))===null||X===void 0?void 0:X.value)==="checkbox"){if(me.attrName==="type"&&me.attrValue==="checkbox"||me.attrName==="disabled"||me.attrName==="checked"){me.keepAttr=!0;return}me.keepAttr=!1}}),k.addHook("uponSanitizeElement",(he,me)=>{var X,U;me.tagName==="input"&&(((X=he.attributes.getNamedItem("type"))===null||X===void 0?void 0:X.value)==="checkbox"?he.setAttribute("disabled",""):(U=he.parentElement)===null||U===void 0||U.removeChild(he))});const de=L.hookDomPurifyHrefAndSrcSanitizer(re);try{return k.sanitize(J,{...Q,RETURN_TRUSTED_TYPE:!0})}finally{k.removeHook("uponSanitizeAttribute"),de.dispose()}}e.allowedMarkdownAttr=["align","autoplay","alt","checked","class","controls","data-code","data-href","disabled","draggable","height","href","loop","muted","playsinline","poster","src","style","target","title","type","width","start"];function D($){const J=[c.Schemas.http,c.Schemas.https,c.Schemas.mailto,c.Schemas.data,c.Schemas.file,c.Schemas.vscodeFileResource,c.Schemas.vscodeRemote,c.Schemas.vscodeRemoteResource];return $.isTrusted&&J.push(c.Schemas.command),{config:{ALLOWED_TAGS:[...L.basicMarkupHtmlTags],ALLOWED_ATTR:e.allowedMarkdownAttr,ALLOW_UNKNOWN_PROTOCOLS:!0},allowedSchemes:J}}function I($){return typeof $=="string"?$:T($)}e.renderStringAsPlaintext=I;function T($){var J;let Q=(J=$.value)!==null&&J!==void 0?J:"";Q.length>1e5&&(Q=`${Q.substr(0,1e5)}\u2026`);const re=u.marked.parse(Q,{renderer:P.value}).replace(/&(#\d+|[a-zA-Z]+);/g,de=>{var he;return(he=A.get(de))!==null&&he!==void 0?he:de});return w({isTrusted:!1},re).toString()}e.renderMarkdownAsPlaintext=T;const A=new Map([["&quot;",'"'],["&nbsp;"," "],["&amp;","&"],["&#39;","'"],["&lt;","<"],["&gt;",">"]]),P=new t.Lazy(()=>{const $=new u.marked.Renderer;return $.code=J=>J,$.blockquote=J=>J,$.html=J=>"",$.heading=(J,Q,re)=>J+`
+`,$.hr=()=>"",$.list=(J,Q)=>J,$.listitem=J=>J+`
+`,$.paragraph=J=>J+`
+`,$.table=(J,Q)=>J+Q+`
+`,$.tablerow=J=>J,$.tablecell=(J,Q)=>J+" ",$.strong=J=>J,$.em=J=>J,$.codespan=J=>J,$.br=()=>`
+`,$.del=J=>J,$.image=(J,Q,re)=>"",$.text=J=>J,$.link=(J,Q,re)=>re,$});function N($){let J="";return $.forEach(Q=>{J+=Q.raw}),J}function M($){var J,Q;for(let re=0;re<$.tokens.length;re++){const de=$.tokens[re];if(de.type==="text"){const he=de.raw.split(`
+`),me=he[he.length-1];if(me.includes("`"))return O($);if(me.includes("**"))return q($);if(me.match(/\*\w/))return B($);if(me.match(/(^|\s)__\w/))return ie($);if(me.match(/(^|\s)_\w/))return W($);if(me.match(/(^|\s)\[.*\]\(\w*/)){const X=$.tokens.slice(re+1);return((J=X[0])===null||J===void 0?void 0:J.type)==="link"&&((Q=X[1])===null||Q===void 0?void 0:Q.type)==="text"&&X[1].raw.match(/^ *"[^"]*$/)?K($):V($)}else if(me.match(/(^|\s)\[\w/))return F($)}}}function R($){let J,Q;for(J=0;J<$.length;J++){const re=$[J];if(re.type==="paragraph"&&re.raw.match(/(\n|^)```/)){Q=x($.slice(J));break}if(re.type==="paragraph"&&re.raw.match(/(\n|^)\|/)){Q=ne($.slice(J));break}if(J===$.length-1&&re.type==="paragraph"){const de=M(re);if(de){Q=[de];break}}}if(Q){const re=[...$.slice(0,J),...Q];return re.links=$.links,re}return $}e.fillInIncompleteTokens=R;function x($){const J=N($);return u.marked.lexer(J+"\n```")}function O($){return ae($,"`")}function B($){return ae($,"*")}function W($){return ae($,"_")}function V($){return ae($,")")}function K($){return ae($,'")')}function F($){return ae($,"](about:blank)")}function q($){return ae($,"**")}function ie($){return ae($,"__")}function ae($,J){const Q=N(Array.isArray($)?$:[$]);return u.marked.lexer(Q+J)[0]}function ne($){const J=N($),Q=J.split(`
+`);let re,de=!1;for(let he=0;he<Q.length;he++){const me=Q[he].trim();if(typeof re>"u"&&me.match(/^\s*\|/)){const X=me.match(/(\|[^\|]+)(?=\||$)/g);X&&(re=X.length)}else if(typeof re=="number")if(me.match(/^\s*\|/)){if(he!==Q.length-1)return;de=!0}else return}if(typeof re=="number"&&re>0){const he=de?Q.slice(0,-1).join(`
+`):J,me=!!he.match(/\|\s*$/),X=he+(me?"":"|")+`
+|${" --- |".repeat(re)}`;return u.marked.lexer(X)}}}),define(se[229],oe([1,0,7,316,46,186,63,118,39,6,58,2,28,409]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Button=e.unthemedButtonStyles=void 0,e.unthemedButtonStyles={buttonBackground:"#0E639C",buttonHoverBackground:"#006BB3",buttonSeparator:_.Color.white.toString(),buttonForeground:_.Color.white.toString(),buttonBorder:void 0,buttonSecondaryBackground:void 0,buttonSecondaryForeground:void 0,buttonSecondaryHoverBackground:void 0};class n extends a.Disposable{get onDidClick(){return this._onDidClick.event}constructor(r,u){super(),this._label="",this._onDidClick=this._register(new v.Emitter),this.options=u,this._element=document.createElement("a"),this._element.classList.add("monaco-button"),this._element.tabIndex=0,this._element.setAttribute("role","button"),this._element.classList.toggle("secondary",!!u.secondary);const f=u.secondary?u.buttonSecondaryBackground:u.buttonBackground,c=u.secondary?u.buttonSecondaryForeground:u.buttonForeground;this._element.style.color=c||"",this._element.style.backgroundColor=f||"",u.supportShortLabel&&(this._labelShortElement=document.createElement("div"),this._labelShortElement.classList.add("monaco-button-label-short"),this._element.appendChild(this._labelShortElement),this._labelElement=document.createElement("div"),this._labelElement.classList.add("monaco-button-label"),this._element.appendChild(this._labelElement),this._element.classList.add("monaco-text-button-with-short-label")),typeof u.ariaLabel=="string"&&this._element.setAttribute("aria-label",u.ariaLabel),r.appendChild(this._element),this._register(S.Gesture.addTarget(this._element)),[L.EventType.CLICK,S.EventType.Tap].forEach(d=>{this._register((0,L.addDisposableListener)(this._element,d,s=>{if(!this.enabled){L.EventHelper.stop(s);return}this._onDidClick.fire(s)}))}),this._register((0,L.addDisposableListener)(this._element,L.EventType.KEY_DOWN,d=>{const s=new y.StandardKeyboardEvent(d);let l=!1;this.enabled&&(s.equals(3)||s.equals(10))?(this._onDidClick.fire(d),l=!0):s.equals(9)&&(this._element.blur(),l=!0),l&&L.EventHelper.stop(s,!0)})),this._register((0,L.addDisposableListener)(this._element,L.EventType.MOUSE_OVER,d=>{this._element.classList.contains("disabled")||this.updateBackground(!0)})),this._register((0,L.addDisposableListener)(this._element,L.EventType.MOUSE_OUT,d=>{this.updateBackground(!1)})),this.focusTracker=this._register((0,L.trackFocus)(this._element)),this._register(this.focusTracker.onDidFocus(()=>{this.enabled&&this.updateBackground(!0)})),this._register(this.focusTracker.onDidBlur(()=>{this.enabled&&this.updateBackground(!1)}))}dispose(){super.dispose(),this._element.remove()}getContentElements(r){const u=[];for(let f of(0,p.renderLabelWithIcons)(r))if(typeof f=="string"){if(f=f.trim(),f==="")continue;const c=document.createElement("span");c.textContent=f,u.push(c)}else u.push(f);return u}updateBackground(r){let u;this.options.secondary?u=r?this.options.buttonSecondaryHoverBackground:this.options.buttonSecondaryBackground:u=r?this.options.buttonHoverBackground:this.options.buttonBackground,u&&(this._element.style.backgroundColor=u)}get element(){return this._element}set label(r){var u;if(this._label===r||(0,b.isMarkdownString)(this._label)&&(0,b.isMarkdownString)(r)&&(0,b.markdownStringEqual)(this._label,r))return;this._element.classList.add("monaco-text-button");const f=this.options.supportShortLabel?this._labelElement:this._element;if((0,b.isMarkdownString)(r)){const c=(0,E.renderMarkdown)(r,{inline:!0});c.dispose();const d=(u=c.element.querySelector("p"))===null||u===void 0?void 0:u.innerHTML;if(d){const s=(0,k.sanitize)(d,{ADD_TAGS:["b","i","u","code","span"],ALLOWED_ATTR:["class"],RETURN_TRUSTED_TYPE:!0});f.innerHTML=s}else(0,L.reset)(f)}else this.options.supportIcons?(0,L.reset)(f,...this.getContentElements(r)):f.textContent=r;typeof this.options.title=="string"?this._element.title=this.options.title:this.options.title&&(this._element.title=(0,E.renderStringAsPlaintext)(r)),typeof this.options.ariaLabel=="string"?this._element.setAttribute("aria-label",this.options.ariaLabel):this.options.ariaLabel&&this._element.setAttribute("aria-label",this._element.title),this._label=r}get label(){return this._label}set icon(r){this._element.classList.add(...i.ThemeIcon.asClassNameArray(r))}set enabled(r){r?(this._element.classList.remove("disabled"),this._element.setAttribute("aria-disabled",String(!1)),this._element.tabIndex=0):(this._element.classList.add("disabled"),this._element.setAttribute("aria-disabled",String(!0)))}get enabled(){return!this._element.classList.contains("disabled")}}e.Button=n}),define(se[324],oe([1,0,7,14,19,58,126,2,20,571]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.setupCustomHover=e.setupNativeHover=void 0;function b(n,t){(0,_.isString)(t)?n.title=(0,S.stripIcons)(t):t?.markdownNotSupportedFallback?n.title=t.markdownNotSupportedFallback:n.removeAttribute("title")}e.setupNativeHover=b;class a{constructor(t,r,u){this.hoverDelegate=t,this.target=r,this.fadeInAnimation=u}async update(t,r,u){var f;if(this._cancellationTokenSource&&(this._cancellationTokenSource.dispose(!0),this._cancellationTokenSource=void 0),this.isDisposed)return;let c;if(t===void 0||(0,_.isString)(t)||t instanceof HTMLElement)c=t;else if(!(0,_.isFunction)(t.markdown))c=(f=t.markdown)!==null&&f!==void 0?f:t.markdownNotSupportedFallback;else{this._hoverWidget||this.show((0,v.localize)(0,null),r),this._cancellationTokenSource=new y.CancellationTokenSource;const d=this._cancellationTokenSource.token;if(c=await t.markdown(d),c===void 0&&(c=t.markdownNotSupportedFallback),this.isDisposed||d.isCancellationRequested)return}this.show(c,r,u)}show(t,r,u){const f=this._hoverWidget;if(this.hasContent(t)){const c={content:t,target:this.target,appearance:{showPointer:this.hoverDelegate.placement==="element",skipFadeInAnimation:!this.fadeInAnimation||!!f},position:{hoverPosition:2},...u};this._hoverWidget=this.hoverDelegate.showHover(c,r)}f?.dispose()}hasContent(t){return t?(0,E.isMarkdownString)(t)?!!t.value:!0:!1}get isDisposed(){var t;return(t=this._hoverWidget)===null||t===void 0?void 0:t.isDisposed}dispose(){var t,r;(t=this._hoverWidget)===null||t===void 0||t.dispose(),(r=this._cancellationTokenSource)===null||r===void 0||r.dispose(!0),this._cancellationTokenSource=void 0}}function i(n,t,r,u){let f,c;const d=(T,A)=>{var P;const N=c!==void 0;T&&(c?.dispose(),c=void 0),A&&(f?.dispose(),f=void 0),N&&((P=n.onDidHideHover)===null||P===void 0||P.call(n))},s=(T,A,P)=>new k.TimeoutTimer(async()=>{(!c||c.isDisposed)&&(c=new a(n,P||t,T>0),await c.update(r,A,u))},T);let l=!1;const o=L.addDisposableListener(t,L.EventType.MOUSE_DOWN,()=>{l=!0,d(!0,!0)},!0),g=L.addDisposableListener(t,L.EventType.MOUSE_UP,()=>{l=!1},!0),h=L.addDisposableListener(t,L.EventType.MOUSE_LEAVE,T=>{l=!1,d(!1,T.fromElement===t)},!0),m=()=>{if(f)return;const T=new p.DisposableStore,A={targetElements:[t],dispose:()=>{}};if(n.placement===void 0||n.placement==="mouse"){const P=N=>{A.x=N.x+10,N.target instanceof HTMLElement&&N.target.classList.contains("action-label")&&d(!0,!0)};T.add(L.addDisposableListener(t,L.EventType.MOUSE_MOVE,P,!0))}T.add(s(n.delay,!1,A)),f=T},C=L.addDisposableListener(t,L.EventType.MOUSE_OVER,m,!0),w=()=>{if(l||f)return;const T={targetElements:[t],dispose:()=>{}},A=new p.DisposableStore,P=()=>d(!0,!0);A.add(L.addDisposableListener(t,L.EventType.BLUR,P,!0)),A.add(s(n.delay,!1,T)),f=A},D=L.addDisposableListener(t,L.EventType.FOCUS,w,!0);return{show:T=>{d(!1,!0),s(0,T)},hide:()=>{d(!0,!0)},update:async(T,A)=>{r=T,await c?.update(r,void 0,A)},dispose:()=>{C.dispose(),h.dispose(),o.dispose(),g.dispose(),D.dispose(),d(!0,!0)}}}e.setupCustomHover=i}),define(se[230],oe([1,0,7,320,324,2,55,172,415]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IconLabel=void 0;class _{constructor(t){this._element=t}get element(){return this._element}set textContent(t){this.disposed||t===this._textContent||(this._textContent=t,this._element.textContent=t)}set className(t){this.disposed||t===this._className||(this._className=t,this._element.className=t)}set empty(t){this.disposed||t===this._empty||(this._empty=t,this._element.style.marginLeft=t?"0":"")}dispose(){this.disposed=!0}}class v extends E.Disposable{constructor(t,r){super(),this.customHovers=new Map,this.creationOptions=r,this.domNode=this._register(new _(L.append(t,L.$(".monaco-icon-label")))),this.labelContainer=L.append(this.domNode.element,L.$(".monaco-icon-label-container")),this.nameContainer=L.append(this.labelContainer,L.$("span.monaco-icon-name-container")),r?.supportHighlights||r?.supportIcons?this.nameNode=new i(this.nameContainer,!!r.supportIcons):this.nameNode=new b(this.nameContainer),this.hoverDelegate=r?.hoverDelegate}get element(){return this.domNode.element}setLabel(t,r,u){var f;const c=["monaco-icon-label"],d=["monaco-icon-label-container"];let s="";if(u&&(u.extraClasses&&c.push(...u.extraClasses),u.italic&&c.push("italic"),u.strikethrough&&c.push("strikethrough"),u.disabledCommand&&d.push("disabled"),u.title&&(typeof u.title=="string"?s+=u.title:s+=t)),this.domNode.className=c.join(" "),this.domNode.element.setAttribute("aria-label",s),this.labelContainer.className=d.join(" "),this.setupHover(u?.descriptionTitle?this.labelContainer:this.element,u?.title),this.nameNode.setLabel(t,u),r||this.descriptionNode){const l=this.getOrCreateDescriptionNode();l instanceof k.HighlightedLabel?(l.set(r||"",u?u.descriptionMatches:void 0,void 0,u?.labelEscapeNewLines),this.setupHover(l.element,u?.descriptionTitle)):(l.textContent=r&&u?.labelEscapeNewLines?k.HighlightedLabel.escapeNewLines(r,[]):r||"",this.setupHover(l.element,u?.descriptionTitle||""),l.empty=!r)}if(u?.suffix||this.suffixNode){const l=this.getOrCreateSuffixNode();l.textContent=(f=u?.suffix)!==null&&f!==void 0?f:""}}setupHover(t,r){const u=this.customHovers.get(t);if(u&&(u.dispose(),this.customHovers.delete(t)),!r){t.removeAttribute("title");return}if(!this.hoverDelegate)(0,y.setupNativeHover)(t,r);else{const f=(0,y.setupCustomHover)(this.hoverDelegate,t,r);f&&this.customHovers.set(t,f)}}dispose(){super.dispose();for(const t of this.customHovers.values())t.dispose();this.customHovers.clear()}getOrCreateSuffixNode(){if(!this.suffixNode){const t=this._register(new _(L.after(this.nameContainer,L.$("span.monaco-icon-suffix-container"))));this.suffixNode=this._register(new _(L.append(t.element,L.$("span.label-suffix"))))}return this.suffixNode}getOrCreateDescriptionNode(){var t;if(!this.descriptionNode){const r=this._register(new _(L.append(this.labelContainer,L.$("span.monaco-icon-description-container"))));!((t=this.creationOptions)===null||t===void 0)&&t.supportDescriptionHighlights?this.descriptionNode=new k.HighlightedLabel(L.append(r.element,L.$("span.label-description")),{supportIcons:!!this.creationOptions.supportIcons}):this.descriptionNode=this._register(new _(L.append(r.element,L.$("span.label-description"))))}return this.descriptionNode}}e.IconLabel=v;class b{constructor(t){this.container=t,this.label=void 0,this.singleLabel=void 0}setLabel(t,r){if(!(this.label===t&&(0,S.equals)(this.options,r)))if(this.label=t,this.options=r,typeof t=="string")this.singleLabel||(this.container.innerText="",this.container.classList.remove("multiple"),this.singleLabel=L.append(this.container,L.$("a.label-name",{id:r?.domId}))),this.singleLabel.textContent=t;else{this.container.innerText="",this.container.classList.add("multiple"),this.singleLabel=void 0;for(let u=0;u<t.length;u++){const f=t[u],c=r?.domId&&`${r?.domId}_${u}`;L.append(this.container,L.$("a.label-name",{id:c,"data-icon-label-count":t.length,"data-icon-label-index":u,role:"treeitem"},f)),u<t.length-1&&L.append(this.container,L.$("span.label-separator",void 0,r?.separator||"/"))}}}}function a(n,t,r){if(!r)return;let u=0;return n.map(f=>{const c={start:u,end:u+f.length},d=r.map(s=>p.Range.intersect(c,s)).filter(s=>!p.Range.isEmpty(s)).map(({start:s,end:l})=>({start:s-u,end:l-u}));return u=c.end+t.length,d})}class i{constructor(t,r){this.container=t,this.supportIcons=r,this.label=void 0,this.singleLabel=void 0}setLabel(t,r){if(!(this.label===t&&(0,S.equals)(this.options,r)))if(this.label=t,this.options=r,typeof t=="string")this.singleLabel||(this.container.innerText="",this.container.classList.remove("multiple"),this.singleLabel=new k.HighlightedLabel(L.append(this.container,L.$("a.label-name",{id:r?.domId})),{supportIcons:this.supportIcons})),this.singleLabel.set(t,r?.matches,void 0,r?.labelEscapeNewLines);else{this.container.innerText="",this.container.classList.add("multiple"),this.singleLabel=void 0;const u=r?.separator||"/",f=a(t,u,r?.matches);for(let c=0;c<t.length;c++){const d=t[c],s=f?f[c]:void 0,l=r?.domId&&`${r?.domId}_${c}`,o=L.$("a.label-name",{id:l,"data-icon-label-count":t.length,"data-icon-label-index":c,role:"treeitem"});new k.HighlightedLabel(L.append(this.container,o),{supportIcons:this.supportIcons}).set(d,s,void 0,r?.labelEscapeNewLines),c<t.length-1&&L.append(o,L.$("span.label-separator",void 0,u))}}}}}),define(se[596],oe([1,0,7,84,46,186,119,13,6,65,2,17,574,423]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectBoxList=void 0;const n=L.$,t="selectOption.entry.template";class r{get templateId(){return t}renderTemplate(c){const d=Object.create(null);return d.root=c,d.text=L.append(c,n(".option-text")),d.detail=L.append(c,n(".option-detail")),d.decoratorRight=L.append(c,n(".option-decorator-right")),d}renderElement(c,d,s){const l=s,o=c.text,g=c.detail,h=c.decoratorRight,m=c.isDisabled;l.text.textContent=o,l.detail.textContent=g||"",l.decoratorRight.innerText=h||"",m?l.root.classList.add("option-disabled"):l.root.classList.remove("option-disabled")}disposeTemplate(c){}}class u extends b.Disposable{constructor(c,d,s,l,o){super(),this.options=[],this._currentSelection=0,this._hasDetails=!1,this._skipLayout=!1,this._sticky=!1,this._isVisible=!1,this.styles=l,this.selectBoxOptions=o||Object.create(null),typeof this.selectBoxOptions.minBottomMargin!="number"?this.selectBoxOptions.minBottomMargin=u.DEFAULT_DROPDOWN_MINIMUM_BOTTOM_MARGIN:this.selectBoxOptions.minBottomMargin<0&&(this.selectBoxOptions.minBottomMargin=0),this.selectElement=document.createElement("select"),this.selectElement.className="monaco-select-box monaco-select-box-dropdown-padding",typeof this.selectBoxOptions.ariaLabel=="string"&&this.selectElement.setAttribute("aria-label",this.selectBoxOptions.ariaLabel),typeof this.selectBoxOptions.ariaDescription=="string"&&this.selectElement.setAttribute("aria-description",this.selectBoxOptions.ariaDescription),this._onDidSelect=new _.Emitter,this._register(this._onDidSelect),this.registerListeners(),this.constructSelectDropDown(s),this.selected=d||0,c&&this.setOptions(c,d),this.initStyleSheet()}getHeight(){return 22}getTemplateId(){return t}constructSelectDropDown(c){this.contextViewProvider=c,this.selectDropDownContainer=L.$(".monaco-select-box-dropdown-container"),this.selectDropDownContainer.classList.add("monaco-select-box-dropdown-padding"),this.selectionDetailsPane=L.append(this.selectDropDownContainer,n(".select-box-details-pane"));const d=L.append(this.selectDropDownContainer,n(".select-box-dropdown-container-width-control")),s=L.append(d,n(".width-control-div"));this.widthControlElement=document.createElement("span"),this.widthControlElement.className="option-text-width-control",L.append(s,this.widthControlElement),this._dropDownPosition=0,this.styleElement=L.createStyleSheet(this.selectDropDownContainer),this.selectDropDownContainer.setAttribute("draggable","true"),this._register(L.addDisposableListener(this.selectDropDownContainer,L.EventType.DRAG_START,l=>{L.EventHelper.stop(l,!0)}))}registerListeners(){this._register(L.addStandardDisposableListener(this.selectElement,"change",d=>{this.selected=d.target.selectedIndex,this._onDidSelect.fire({index:d.target.selectedIndex,selected:d.target.value}),this.options[this.selected]&&this.options[this.selected].text&&(this.selectElement.title=this.options[this.selected].text)})),this._register(L.addDisposableListener(this.selectElement,L.EventType.CLICK,d=>{L.EventHelper.stop(d),this._isVisible?this.hideSelectDropDown(!0):this.showSelectDropDown()})),this._register(L.addDisposableListener(this.selectElement,L.EventType.MOUSE_DOWN,d=>{L.EventHelper.stop(d)}));let c;this._register(L.addDisposableListener(this.selectElement,"touchstart",d=>{c=this._isVisible})),this._register(L.addDisposableListener(this.selectElement,"touchend",d=>{L.EventHelper.stop(d),c?this.hideSelectDropDown(!0):this.showSelectDropDown()})),this._register(L.addDisposableListener(this.selectElement,L.EventType.KEY_DOWN,d=>{const s=new y.StandardKeyboardEvent(d);let l=!1;a.isMacintosh?(s.keyCode===18||s.keyCode===16||s.keyCode===10||s.keyCode===3)&&(l=!0):(s.keyCode===18&&s.altKey||s.keyCode===16&&s.altKey||s.keyCode===10||s.keyCode===3)&&(l=!0),l&&(this.showSelectDropDown(),L.EventHelper.stop(d,!0))}))}get onDidSelect(){return this._onDidSelect.event}setOptions(c,d){p.equals(this.options,c)||(this.options=c,this.selectElement.options.length=0,this._hasDetails=!1,this._cachedMaxDetailsHeight=void 0,this.options.forEach((s,l)=>{this.selectElement.add(this.createOption(s.text,l,s.isDisabled)),typeof s.description=="string"&&(this._hasDetails=!0)})),d!==void 0&&(this.select(d),this._currentSelection=this.selected)}setOptionsList(){var c;(c=this.selectList)===null||c===void 0||c.splice(0,this.selectList.length,this.options)}select(c){c>=0&&c<this.options.length?this.selected=c:c>this.options.length-1?this.select(this.options.length-1):this.selected<0&&(this.selected=0),this.selectElement.selectedIndex=this.selected,this.options[this.selected]&&this.options[this.selected].text&&(this.selectElement.title=this.options[this.selected].text)}focus(){this.selectElement&&(this.selectElement.tabIndex=0,this.selectElement.focus())}blur(){this.selectElement&&(this.selectElement.tabIndex=-1,this.selectElement.blur())}setFocusable(c){this.selectElement.tabIndex=c?0:-1}render(c){this.container=c,c.classList.add("select-container"),c.appendChild(this.selectElement),this.styleSelectElement()}initStyleSheet(){const c=[];this.styles.listFocusBackground&&c.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.focused { background-color: ${this.styles.listFocusBackground} !important; }`),this.styles.listFocusForeground&&c.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.focused { color: ${this.styles.listFocusForeground} !important; }`),this.styles.decoratorRightForeground&&c.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.focused) .option-decorator-right { color: ${this.styles.decoratorRightForeground}; }`),this.styles.selectBackground&&this.styles.selectBorder&&this.styles.selectBorder!==this.styles.selectBackground?(c.push(`.monaco-select-box-dropdown-container { border: 1px solid ${this.styles.selectBorder} } `),c.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-top { border-top: 1px solid ${this.styles.selectBorder} } `),c.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-bottom { border-bottom: 1px solid ${this.styles.selectBorder} } `)):this.styles.selectListBorder&&(c.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-top { border-top: 1px solid ${this.styles.selectListBorder} } `),c.push(`.monaco-select-box-dropdown-container > .select-box-details-pane.border-bottom { border-bottom: 1px solid ${this.styles.selectListBorder} } `)),this.styles.listHoverForeground&&c.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.option-disabled):not(.focused):hover { color: ${this.styles.listHoverForeground} !important; }`),this.styles.listHoverBackground&&c.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.option-disabled):not(.focused):hover { background-color: ${this.styles.listHoverBackground} !important; }`),this.styles.listFocusOutline&&c.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.focused { outline: 1.6px dotted ${this.styles.listFocusOutline} !important; outline-offset: -1.6px !important; }`),this.styles.listHoverOutline&&c.push(`.monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row:not(.option-disabled):not(.focused):hover { outline: 1.6px dashed ${this.styles.listHoverOutline} !important; outline-offset: -1.6px !important; }`),c.push(".monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.option-disabled.focused { background-color: transparent !important; color: inherit !important; outline: none !important; }"),c.push(".monaco-select-box-dropdown-container > .select-box-dropdown-list-container .monaco-list .monaco-list-row.option-disabled:hover { background-color: transparent !important; color: inherit !important; outline: none !important; }"),this.styleElement.textContent=c.join(`
+`)}styleSelectElement(){var c,d,s;const l=(c=this.styles.selectBackground)!==null&&c!==void 0?c:"",o=(d=this.styles.selectForeground)!==null&&d!==void 0?d:"",g=(s=this.styles.selectBorder)!==null&&s!==void 0?s:"";this.selectElement.style.backgroundColor=l,this.selectElement.style.color=o,this.selectElement.style.borderColor=g}styleList(){var c,d;const s=(c=this.styles.selectBackground)!==null&&c!==void 0?c:"",l=L.asCssValueWithDefault(this.styles.selectListBackground,s);this.selectDropDownListContainer.style.backgroundColor=l,this.selectionDetailsPane.style.backgroundColor=l;const o=(d=this.styles.focusBorder)!==null&&d!==void 0?d:"";this.selectDropDownContainer.style.outlineColor=o,this.selectDropDownContainer.style.outlineOffset="-1px",this.selectList.style(this.styles)}createOption(c,d,s){const l=document.createElement("option");return l.value=c,l.text=c,l.disabled=!!s,l}showSelectDropDown(){this.selectionDetailsPane.innerText="",!(!this.contextViewProvider||this._isVisible)&&(this.createSelectList(this.selectDropDownContainer),this.setOptionsList(),this.contextViewProvider.showContextView({getAnchor:()=>this.selectElement,render:c=>this.renderSelectDropDown(c,!0),layout:()=>{this.layoutSelectDropDown()},onHide:()=>{this.selectDropDownContainer.classList.remove("visible"),this.selectElement.classList.remove("synthetic-focus")},anchorPosition:this._dropDownPosition},this.selectBoxOptions.optionsAsChildren?this.container:void 0),this._isVisible=!0,this.hideSelectDropDown(!1),this.contextViewProvider.showContextView({getAnchor:()=>this.selectElement,render:c=>this.renderSelectDropDown(c),layout:()=>this.layoutSelectDropDown(),onHide:()=>{this.selectDropDownContainer.classList.remove("visible"),this.selectElement.classList.remove("synthetic-focus")},anchorPosition:this._dropDownPosition},this.selectBoxOptions.optionsAsChildren?this.container:void 0),this._currentSelection=this.selected,this._isVisible=!0,this.selectElement.setAttribute("aria-expanded","true"))}hideSelectDropDown(c){!this.contextViewProvider||!this._isVisible||(this._isVisible=!1,this.selectElement.setAttribute("aria-expanded","false"),c&&this.selectElement.focus(),this.contextViewProvider.hideContextView())}renderSelectDropDown(c,d){return c.appendChild(this.selectDropDownContainer),this.layoutSelectDropDown(d),{dispose:()=>{try{c.removeChild(this.selectDropDownContainer)}catch{}}}}measureMaxDetailsHeight(){let c=0;return this.options.forEach((d,s)=>{this.updateDetail(s),this.selectionDetailsPane.offsetHeight>c&&(c=this.selectionDetailsPane.offsetHeight)}),c}layoutSelectDropDown(c){if(this._skipLayout)return!1;if(this.selectList){this.selectDropDownContainer.classList.add("visible");const d=L.getWindow(this.selectElement),s=L.getDomNodePagePosition(this.selectElement),l=L.getWindow(this.selectElement).getComputedStyle(this.selectElement),o=parseFloat(l.getPropertyValue("--dropdown-padding-top"))+parseFloat(l.getPropertyValue("--dropdown-padding-bottom")),g=d.innerHeight-s.top-s.height-(this.selectBoxOptions.minBottomMargin||0),h=s.top-u.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN,m=this.selectElement.offsetWidth,C=this.setWidthControlElement(this.widthControlElement),w=Math.max(C,Math.round(m)).toString()+"px";this.selectDropDownContainer.style.width=w,this.selectList.getHTMLElement().style.height="",this.selectList.layout();let D=this.selectList.contentHeight;this._hasDetails&&this._cachedMaxDetailsHeight===void 0&&(this._cachedMaxDetailsHeight=this.measureMaxDetailsHeight());const I=this._hasDetails?this._cachedMaxDetailsHeight:0,T=D+o+I,A=Math.floor((g-o-I)/this.getHeight()),P=Math.floor((h-o-I)/this.getHeight());if(c)return s.top+s.height>d.innerHeight-22||s.top<u.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN||A<1&&P<1?!1:(A<u.DEFAULT_MINIMUM_VISIBLE_OPTIONS&&P>A&&this.options.length>A?(this._dropDownPosition=1,this.selectDropDownContainer.removeChild(this.selectDropDownListContainer),this.selectDropDownContainer.removeChild(this.selectionDetailsPane),this.selectDropDownContainer.appendChild(this.selectionDetailsPane),this.selectDropDownContainer.appendChild(this.selectDropDownListContainer),this.selectionDetailsPane.classList.remove("border-top"),this.selectionDetailsPane.classList.add("border-bottom")):(this._dropDownPosition=0,this.selectDropDownContainer.removeChild(this.selectDropDownListContainer),this.selectDropDownContainer.removeChild(this.selectionDetailsPane),this.selectDropDownContainer.appendChild(this.selectDropDownListContainer),this.selectDropDownContainer.appendChild(this.selectionDetailsPane),this.selectionDetailsPane.classList.remove("border-bottom"),this.selectionDetailsPane.classList.add("border-top")),!0);if(s.top+s.height>d.innerHeight-22||s.top<u.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN||this._dropDownPosition===0&&A<1||this._dropDownPosition===1&&P<1)return this.hideSelectDropDown(!0),!1;if(this._dropDownPosition===0){if(this._isVisible&&A+P<1)return this.hideSelectDropDown(!0),!1;T>g&&(D=A*this.getHeight())}else T>h&&(D=P*this.getHeight());return this.selectList.layout(D),this.selectList.domFocus(),this.selectList.length>0&&(this.selectList.setFocus([this.selected||0]),this.selectList.reveal(this.selectList.getFocus()[0]||0)),this._hasDetails?(this.selectList.getHTMLElement().style.height=D+o+"px",this.selectDropDownContainer.style.height=""):this.selectDropDownContainer.style.height=D+o+"px",this.updateDetail(this.selected),this.selectDropDownContainer.style.width=w,this.selectDropDownListContainer.setAttribute("tabindex","0"),this.selectElement.classList.add("synthetic-focus"),this.selectDropDownContainer.classList.add("synthetic-focus"),!0}else return!1}setWidthControlElement(c){let d=0;if(c){let s=0,l=0;this.options.forEach((o,g)=>{const h=o.detail?o.detail.length:0,m=o.decoratorRight?o.decoratorRight.length:0,C=o.text.length+h+m;C>l&&(s=g,l=C)}),c.textContent=this.options[s].text+(this.options[s].decoratorRight?this.options[s].decoratorRight+" ":""),d=L.getTotalWidth(c)}return d}createSelectList(c){if(this.selectList)return;this.selectDropDownListContainer=L.append(c,n(".select-box-dropdown-list-container")),this.listRenderer=new r,this.selectList=new S.List("SelectBoxCustom",this.selectDropDownListContainer,this,[this.listRenderer],{useShadows:!1,verticalScrollMode:3,keyboardSupport:!1,mouseSupport:!1,accessibilityProvider:{getAriaLabel:l=>{let o=l.text;return l.detail&&(o+=`. ${l.detail}`),l.decoratorRight&&(o+=`. ${l.decoratorRight}`),l.description&&(o+=`. ${l.description}`),o},getWidgetAriaLabel:()=>(0,i.localize)(0,null),getRole:()=>a.isMacintosh?"":"option",getWidgetRole:()=>"listbox"}}),this.selectBoxOptions.ariaLabel&&(this.selectList.ariaLabel=this.selectBoxOptions.ariaLabel);const d=this._register(new k.DomEmitter(this.selectDropDownListContainer,"keydown")),s=_.Event.chain(d.event,l=>l.filter(()=>this.selectList.length>0).map(o=>new y.StandardKeyboardEvent(o)));this._register(_.Event.chain(s,l=>l.filter(o=>o.keyCode===3))(this.onEnter,this)),this._register(_.Event.chain(s,l=>l.filter(o=>o.keyCode===2))(this.onEnter,this)),this._register(_.Event.chain(s,l=>l.filter(o=>o.keyCode===9))(this.onEscape,this)),this._register(_.Event.chain(s,l=>l.filter(o=>o.keyCode===16))(this.onUpArrow,this)),this._register(_.Event.chain(s,l=>l.filter(o=>o.keyCode===18))(this.onDownArrow,this)),this._register(_.Event.chain(s,l=>l.filter(o=>o.keyCode===12))(this.onPageDown,this)),this._register(_.Event.chain(s,l=>l.filter(o=>o.keyCode===11))(this.onPageUp,this)),this._register(_.Event.chain(s,l=>l.filter(o=>o.keyCode===14))(this.onHome,this)),this._register(_.Event.chain(s,l=>l.filter(o=>o.keyCode===13))(this.onEnd,this)),this._register(_.Event.chain(s,l=>l.filter(o=>o.keyCode>=21&&o.keyCode<=56||o.keyCode>=85&&o.keyCode<=113))(this.onCharacter,this)),this._register(L.addDisposableListener(this.selectList.getHTMLElement(),L.EventType.POINTER_UP,l=>this.onPointerUp(l))),this._register(this.selectList.onMouseOver(l=>typeof l.index<"u"&&this.selectList.setFocus([l.index]))),this._register(this.selectList.onDidChangeFocus(l=>this.onListFocus(l))),this._register(L.addDisposableListener(this.selectDropDownContainer,L.EventType.FOCUS_OUT,l=>{!this._isVisible||L.isAncestor(l.relatedTarget,this.selectDropDownContainer)||this.onListBlur()})),this.selectList.getHTMLElement().setAttribute("aria-label",this.selectBoxOptions.ariaLabel||""),this.selectList.getHTMLElement().setAttribute("aria-expanded","true"),this.styleList()}onPointerUp(c){if(!this.selectList.length)return;L.EventHelper.stop(c);const d=c.target;if(!d||d.classList.contains("slider"))return;const s=d.closest(".monaco-list-row");if(!s)return;const l=Number(s.getAttribute("data-index")),o=s.classList.contains("option-disabled");l>=0&&l<this.options.length&&!o&&(this.selected=l,this.select(this.selected),this.selectList.setFocus([this.selected]),this.selectList.reveal(this.selectList.getFocus()[0]),this.selected!==this._currentSelection&&(this._currentSelection=this.selected,this._onDidSelect.fire({index:this.selectElement.selectedIndex,selected:this.options[this.selected].text}),this.options[this.selected]&&this.options[this.selected].text&&(this.selectElement.title=this.options[this.selected].text)),this.hideSelectDropDown(!0))}onListBlur(){this._sticky||(this.selected!==this._currentSelection&&this.select(this._currentSelection),this.hideSelectDropDown(!1))}renderDescriptionMarkdown(c,d){const s=o=>{for(let g=0;g<o.childNodes.length;g++){const h=o.childNodes.item(g);(h.tagName&&h.tagName.toLowerCase())==="img"?o.removeChild(h):s(h)}},l=(0,E.renderMarkdown)({value:c,supportThemeIcons:!0},{actionHandler:d});return l.element.classList.add("select-box-description-markdown"),s(l.element),l.element}onListFocus(c){!this._isVisible||!this._hasDetails||this.updateDetail(c.indexes[0])}updateDetail(c){var d,s;this.selectionDetailsPane.innerText="";const l=this.options[c],o=(d=l?.description)!==null&&d!==void 0?d:"",g=(s=l?.descriptionIsMarkdown)!==null&&s!==void 0?s:!1;if(o){if(g){const h=l.descriptionMarkdownActionHandler;this.selectionDetailsPane.appendChild(this.renderDescriptionMarkdown(o,h))}else this.selectionDetailsPane.innerText=o;this.selectionDetailsPane.style.display="block"}else this.selectionDetailsPane.style.display="none";this._skipLayout=!0,this.contextViewProvider.layout(),this._skipLayout=!1}onEscape(c){L.EventHelper.stop(c),this.select(this._currentSelection),this.hideSelectDropDown(!0)}onEnter(c){L.EventHelper.stop(c),this.selected!==this._currentSelection&&(this._currentSelection=this.selected,this._onDidSelect.fire({index:this.selectElement.selectedIndex,selected:this.options[this.selected].text}),this.options[this.selected]&&this.options[this.selected].text&&(this.selectElement.title=this.options[this.selected].text)),this.hideSelectDropDown(!0)}onDownArrow(c){if(this.selected<this.options.length-1){L.EventHelper.stop(c,!0);const d=this.options[this.selected+1].isDisabled;if(d&&this.options.length>this.selected+2)this.selected+=2;else{if(d)return;this.selected++}this.select(this.selected),this.selectList.setFocus([this.selected]),this.selectList.reveal(this.selectList.getFocus()[0])}}onUpArrow(c){this.selected>0&&(L.EventHelper.stop(c,!0),this.options[this.selected-1].isDisabled&&this.selected>1?this.selected-=2:this.selected--,this.select(this.selected),this.selectList.setFocus([this.selected]),this.selectList.reveal(this.selectList.getFocus()[0]))}onPageUp(c){L.EventHelper.stop(c),this.selectList.focusPreviousPage(),setTimeout(()=>{this.selected=this.selectList.getFocus()[0],this.options[this.selected].isDisabled&&this.selected<this.options.length-1&&(this.selected++,this.selectList.setFocus([this.selected])),this.selectList.reveal(this.selected),this.select(this.selected)},1)}onPageDown(c){L.EventHelper.stop(c),this.selectList.focusNextPage(),setTimeout(()=>{this.selected=this.selectList.getFocus()[0],this.options[this.selected].isDisabled&&this.selected>0&&(this.selected--,this.selectList.setFocus([this.selected])),this.selectList.reveal(this.selected),this.select(this.selected)},1)}onHome(c){L.EventHelper.stop(c),!(this.options.length<2)&&(this.selected=0,this.options[this.selected].isDisabled&&this.selected>1&&this.selected++,this.selectList.setFocus([this.selected]),this.selectList.reveal(this.selected),this.select(this.selected))}onEnd(c){L.EventHelper.stop(c),!(this.options.length<2)&&(this.selected=this.options.length-1,this.options[this.selected].isDisabled&&this.selected>1&&this.selected--,this.selectList.setFocus([this.selected]),this.selectList.reveal(this.selected),this.select(this.selected))}onCharacter(c){const d=v.KeyCodeUtils.toString(c.keyCode);let s=-1;for(let l=0;l<this.options.length-1;l++)if(s=(l+this.selected+1)%this.options.length,this.options[s].text.charAt(0).toUpperCase()===d&&!this.options[s].isDisabled){this.select(s),this.selectList.setFocus([s]),this.selectList.reveal(this.selectList.getFocus()[0]),L.EventHelper.stop(c);break}}dispose(){this.hideSelectDropDown(!1),super.dispose()}}e.SelectBoxList=u,u.DEFAULT_DROPDOWN_MINIMUM_BOTTOM_MARGIN=32,u.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN=2,u.DEFAULT_MINIMUM_VISIBLE_OPTIONS=3}),define(se[597],oe([1,0,596,591,76,17,422]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectBox=void 0;class S extends y.Widget{constructor(_,v,b,a,i){super(),E.isMacintosh&&!i?.useCustomDrawn?this.selectBoxDelegate=new k.SelectBoxNative(_,v,a,i):this.selectBoxDelegate=new L.SelectBoxList(_,v,b,a,i),this._register(this.selectBoxDelegate)}get onDidSelect(){return this.selectBoxDelegate.onDidSelect}setOptions(_,v){this.selectBoxDelegate.setOptions(_,v)}select(_){this.selectBoxDelegate.select(_)}focus(){this.selectBoxDelegate.focus()}blur(){this.selectBoxDelegate.blur()}setFocusable(_){this.selectBoxDelegate.setFocusable(_)}render(_){this.selectBoxDelegate.render(_)}}e.SelectBox=S}),define(se[135],oe([1,0,54,198,7,63,324,597,42,2,17,20,566,272]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectActionViewItem=e.ActionViewItem=e.BaseActionViewItem=void 0;class n extends v.Disposable{get action(){return this._action}constructor(f,c,d={}){super(),this.options=d,this._context=f||this,this._action=c,c instanceof _.Action&&this._register(c.onDidChange(s=>{this.element&&this.handleActionChangeEvent(s)}))}handleActionChangeEvent(f){f.enabled!==void 0&&this.updateEnabled(),f.checked!==void 0&&this.updateChecked(),f.class!==void 0&&this.updateClass(),f.label!==void 0&&(this.updateLabel(),this.updateTooltip()),f.tooltip!==void 0&&this.updateTooltip()}get actionRunner(){return this._actionRunner||(this._actionRunner=this._register(new _.ActionRunner)),this._actionRunner}set actionRunner(f){this._actionRunner=f}isEnabled(){return this._action.enabled}setActionContext(f){this._context=f}render(f){const c=this.element=f;this._register(E.Gesture.addTarget(f));const d=this.options&&this.options.draggable;d&&(f.draggable=!0,L.isFirefox&&this._register((0,y.addDisposableListener)(f,y.EventType.DRAG_START,s=>{var l;return(l=s.dataTransfer)===null||l===void 0?void 0:l.setData(k.DataTransfers.TEXT,this._action.label)}))),this._register((0,y.addDisposableListener)(c,E.EventType.Tap,s=>this.onClick(s,!0))),this._register((0,y.addDisposableListener)(c,y.EventType.MOUSE_DOWN,s=>{d||y.EventHelper.stop(s,!0),this._action.enabled&&s.button===0&&c.classList.add("active")})),b.isMacintosh&&this._register((0,y.addDisposableListener)(c,y.EventType.CONTEXT_MENU,s=>{s.button===0&&s.ctrlKey===!0&&this.onClick(s)})),this._register((0,y.addDisposableListener)(c,y.EventType.CLICK,s=>{y.EventHelper.stop(s,!0),this.options&&this.options.isMenu||this.onClick(s)})),this._register((0,y.addDisposableListener)(c,y.EventType.DBLCLICK,s=>{y.EventHelper.stop(s,!0)})),[y.EventType.MOUSE_UP,y.EventType.MOUSE_OUT].forEach(s=>{this._register((0,y.addDisposableListener)(c,s,l=>{y.EventHelper.stop(l),c.classList.remove("active")}))})}onClick(f,c=!1){var d;y.EventHelper.stop(f,!0);const s=a.isUndefinedOrNull(this._context)?!((d=this.options)===null||d===void 0)&&d.useEventAsContext?f:{preserveFocus:c}:this._context;this.actionRunner.run(this._action,s)}focus(){this.element&&(this.element.tabIndex=0,this.element.focus(),this.element.classList.add("focused"))}blur(){this.element&&(this.element.blur(),this.element.tabIndex=-1,this.element.classList.remove("focused"))}setFocusable(f){this.element&&(this.element.tabIndex=f?0:-1)}get trapsArrowNavigation(){return!1}updateEnabled(){}updateLabel(){}getClass(){return this.action.class}getTooltip(){return this.action.tooltip}updateTooltip(){var f;if(!this.element)return;const c=(f=this.getTooltip())!==null&&f!==void 0?f:"";this.updateAriaLabel(),this.options.hoverDelegate?(this.element.title="",this.customHover?this.customHover.update(c):(this.customHover=(0,S.setupCustomHover)(this.options.hoverDelegate,this.element,c),this._store.add(this.customHover))):this.element.title=c}updateAriaLabel(){var f;if(this.element){const c=(f=this.getTooltip())!==null&&f!==void 0?f:"";this.element.setAttribute("aria-label",c)}}updateClass(){}updateChecked(){}dispose(){this.element&&(this.element.remove(),this.element=void 0),this._context=void 0,super.dispose()}}e.BaseActionViewItem=n;class t extends n{constructor(f,c,d){super(f,c,d),this.options=d,this.options.icon=d.icon!==void 0?d.icon:!1,this.options.label=d.label!==void 0?d.label:!0,this.cssClass=""}render(f){super.render(f),a.assertType(this.element);const c=document.createElement("a");if(c.classList.add("action-label"),c.setAttribute("role",this.getDefaultAriaRole()),this.label=c,this.element.appendChild(c),this.options.label&&this.options.keybinding){const d=document.createElement("span");d.classList.add("keybinding"),d.textContent=this.options.keybinding,this.element.appendChild(d)}this.updateClass(),this.updateLabel(),this.updateTooltip(),this.updateEnabled(),this.updateChecked()}getDefaultAriaRole(){return this._action.id===_.Separator.ID?"presentation":this.options.isMenu?"menuitem":"button"}focus(){this.label&&(this.label.tabIndex=0,this.label.focus())}blur(){this.label&&(this.label.tabIndex=-1)}setFocusable(f){this.label&&(this.label.tabIndex=f?0:-1)}updateLabel(){this.options.label&&this.label&&(this.label.textContent=this.action.label)}getTooltip(){let f=null;return this.action.tooltip?f=this.action.tooltip:!this.options.label&&this.action.label&&this.options.icon&&(f=this.action.label,this.options.keybinding&&(f=i.localize(0,null,f,this.options.keybinding))),f??void 0}updateClass(){var f;this.cssClass&&this.label&&this.label.classList.remove(...this.cssClass.split(" ")),this.options.icon?(this.cssClass=this.getClass(),this.label&&(this.label.classList.add("codicon"),this.cssClass&&this.label.classList.add(...this.cssClass.split(" "))),this.updateEnabled()):(f=this.label)===null||f===void 0||f.classList.remove("codicon")}updateEnabled(){var f,c;this.action.enabled?(this.label&&(this.label.removeAttribute("aria-disabled"),this.label.classList.remove("disabled")),(f=this.element)===null||f===void 0||f.classList.remove("disabled")):(this.label&&(this.label.setAttribute("aria-disabled","true"),this.label.classList.add("disabled")),(c=this.element)===null||c===void 0||c.classList.add("disabled"))}updateAriaLabel(){var f;if(this.label){const c=(f=this.getTooltip())!==null&&f!==void 0?f:"";this.label.setAttribute("aria-label",c)}}updateChecked(){this.label&&(this.action.checked!==void 0?(this.label.classList.toggle("checked",this.action.checked),this.label.setAttribute("aria-checked",this.action.checked?"true":"false"),this.label.setAttribute("role","checkbox")):(this.label.classList.remove("checked"),this.label.removeAttribute("aria-checked"),this.label.setAttribute("role",this.getDefaultAriaRole())))}}e.ActionViewItem=t;class r extends n{constructor(f,c,d,s,l,o,g){super(f,c),this.selectBox=new p.SelectBox(d,s,l,o,g),this.selectBox.setFocusable(!1),this._register(this.selectBox),this.registerListeners()}select(f){this.selectBox.select(f)}registerListeners(){this._register(this.selectBox.onDidSelect(f=>this.runAction(f.selected,f.index)))}runAction(f,c){this.actionRunner.run(this._action,this.getActionContext(f,c))}getActionContext(f,c){return f}setFocusable(f){this.selectBox.setFocusable(f)}focus(){var f;(f=this.selectBox)===null||f===void 0||f.focus()}blur(){var f;(f=this.selectBox)===null||f===void 0||f.blur()}render(f){this.selectBox.render(f)}}e.SelectActionViewItem=r}),define(se[78],oe([1,0,7,46,135,42,6,2,20,272]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ActionBar=void 0;class v extends p.Disposable{constructor(a,i={}){var n,t,r,u,f,c;super(),this._actionRunnerDisposables=this._register(new p.DisposableStore),this.viewItemDisposables=this._register(new p.DisposableMap),this.triggerKeyDown=!1,this.focusable=!0,this._onDidBlur=this._register(new S.Emitter),this.onDidBlur=this._onDidBlur.event,this._onDidCancel=this._register(new S.Emitter({onWillAddFirstListener:()=>this.cancelHasListener=!0})),this.onDidCancel=this._onDidCancel.event,this.cancelHasListener=!1,this._onDidRun=this._register(new S.Emitter),this.onDidRun=this._onDidRun.event,this._onWillRun=this._register(new S.Emitter),this.onWillRun=this._onWillRun.event,this.options=i,this._context=(n=i.context)!==null&&n!==void 0?n:null,this._orientation=(t=this.options.orientation)!==null&&t!==void 0?t:0,this._triggerKeys={keyDown:(u=(r=this.options.triggerKeys)===null||r===void 0?void 0:r.keyDown)!==null&&u!==void 0?u:!1,keys:(c=(f=this.options.triggerKeys)===null||f===void 0?void 0:f.keys)!==null&&c!==void 0?c:[3,10]},this.options.actionRunner?this._actionRunner=this.options.actionRunner:(this._actionRunner=new E.ActionRunner,this._actionRunnerDisposables.add(this._actionRunner)),this._actionRunnerDisposables.add(this._actionRunner.onDidRun(l=>this._onDidRun.fire(l))),this._actionRunnerDisposables.add(this._actionRunner.onWillRun(l=>this._onWillRun.fire(l))),this.viewItems=[],this.focusedItem=void 0,this.domNode=document.createElement("div"),this.domNode.className="monaco-action-bar",i.animated!==!1&&this.domNode.classList.add("animated");let d,s;switch(this._orientation){case 0:d=[15],s=[17];break;case 1:d=[16],s=[18],this.domNode.className+=" vertical";break}this._register(L.addDisposableListener(this.domNode,L.EventType.KEY_DOWN,l=>{const o=new k.StandardKeyboardEvent(l);let g=!0;const h=typeof this.focusedItem=="number"?this.viewItems[this.focusedItem]:void 0;d&&(o.equals(d[0])||o.equals(d[1]))?g=this.focusPrevious():s&&(o.equals(s[0])||o.equals(s[1]))?g=this.focusNext():o.equals(9)&&this.cancelHasListener?this._onDidCancel.fire():o.equals(14)?g=this.focusFirst():o.equals(13)?g=this.focusLast():o.equals(2)&&h instanceof y.BaseActionViewItem&&h.trapsArrowNavigation?g=this.focusNext():this.isTriggerKeyEvent(o)?this._triggerKeys.keyDown?this.doTrigger(o):this.triggerKeyDown=!0:g=!1,g&&(o.preventDefault(),o.stopPropagation())})),this._register(L.addDisposableListener(this.domNode,L.EventType.KEY_UP,l=>{const o=new k.StandardKeyboardEvent(l);this.isTriggerKeyEvent(o)?(!this._triggerKeys.keyDown&&this.triggerKeyDown&&(this.triggerKeyDown=!1,this.doTrigger(o)),o.preventDefault(),o.stopPropagation()):(o.equals(2)||o.equals(1026)||o.equals(16)||o.equals(18)||o.equals(15)||o.equals(17))&&this.updateFocusedItem()})),this.focusTracker=this._register(L.trackFocus(this.domNode)),this._register(this.focusTracker.onDidBlur(()=>{(L.getActiveElement()===this.domNode||!L.isAncestor(L.getActiveElement(),this.domNode))&&(this._onDidBlur.fire(),this.previouslyFocusedItem=this.focusedItem,this.focusedItem=void 0,this.triggerKeyDown=!1)})),this._register(this.focusTracker.onDidFocus(()=>this.updateFocusedItem())),this.actionsList=document.createElement("ul"),this.actionsList.className="actions-container",this.options.highlightToggledItems&&this.actionsList.classList.add("highlight-toggled"),this.actionsList.setAttribute("role",this.options.ariaRole||"toolbar"),this.options.ariaLabel&&this.actionsList.setAttribute("aria-label",this.options.ariaLabel),this.domNode.appendChild(this.actionsList),a.appendChild(this.domNode)}refreshRole(){this.length()>=1?this.actionsList.setAttribute("role",this.options.ariaRole||"toolbar"):this.actionsList.setAttribute("role","presentation")}setFocusable(a){if(this.focusable=a,this.focusable){const i=this.viewItems.find(n=>n instanceof y.BaseActionViewItem&&n.isEnabled());i instanceof y.BaseActionViewItem&&i.setFocusable(!0)}else this.viewItems.forEach(i=>{i instanceof y.BaseActionViewItem&&i.setFocusable(!1)})}isTriggerKeyEvent(a){let i=!1;return this._triggerKeys.keys.forEach(n=>{i=i||a.equals(n)}),i}updateFocusedItem(){var a,i;for(let n=0;n<this.actionsList.children.length;n++){const t=this.actionsList.children[n];if(L.isAncestor(L.getActiveElement(),t)){this.focusedItem=n,(i=(a=this.viewItems[this.focusedItem])===null||a===void 0?void 0:a.showHover)===null||i===void 0||i.call(a);break}}}get context(){return this._context}set context(a){this._context=a,this.viewItems.forEach(i=>i.setActionContext(a))}get actionRunner(){return this._actionRunner}set actionRunner(a){this._actionRunner=a,this._actionRunnerDisposables.clear(),this._actionRunnerDisposables.add(this._actionRunner.onDidRun(i=>this._onDidRun.fire(i))),this._actionRunnerDisposables.add(this._actionRunner.onWillRun(i=>this._onWillRun.fire(i))),this.viewItems.forEach(i=>i.actionRunner=a)}getContainer(){return this.domNode}getAction(a){var i;if(typeof a=="number")return(i=this.viewItems[a])===null||i===void 0?void 0:i.action;if(a instanceof HTMLElement){for(;a.parentElement!==this.actionsList;){if(!a.parentElement)return;a=a.parentElement}for(let n=0;n<this.actionsList.childNodes.length;n++)if(this.actionsList.childNodes[n]===a)return this.viewItems[n].action}}push(a,i={}){const n=Array.isArray(a)?a:[a];let t=_.isNumber(i.index)?i.index:null;n.forEach(r=>{const u=document.createElement("li");u.className="action-item",u.setAttribute("role","presentation");let f;const c={hoverDelegate:this.options.hoverDelegate,...i};this.options.actionViewItemProvider&&(f=this.options.actionViewItemProvider(r,c)),f||(f=new y.ActionViewItem(this.context,r,c)),this.options.allowContextMenu||this.viewItemDisposables.set(f,L.addDisposableListener(u,L.EventType.CONTEXT_MENU,d=>{L.EventHelper.stop(d,!0)})),f.actionRunner=this._actionRunner,f.setActionContext(this.context),f.render(u),this.focusable&&f instanceof y.BaseActionViewItem&&this.viewItems.length===0&&f.setFocusable(!0),t===null||t<0||t>=this.actionsList.children.length?(this.actionsList.appendChild(u),this.viewItems.push(f)):(this.actionsList.insertBefore(u,this.actionsList.children[t]),this.viewItems.splice(t,0,f),t++)}),typeof this.focusedItem=="number"&&this.focus(this.focusedItem),this.refreshRole()}clear(){this.isEmpty()||(this.viewItems=(0,p.dispose)(this.viewItems),this.viewItemDisposables.clearAndDisposeAll(),L.clearNode(this.actionsList),this.refreshRole())}length(){return this.viewItems.length}isEmpty(){return this.viewItems.length===0}focus(a){let i=!1,n;if(a===void 0?i=!0:typeof a=="number"?n=a:typeof a=="boolean"&&(i=a),i&&typeof this.focusedItem>"u"){const t=this.viewItems.findIndex(r=>r.isEnabled());this.focusedItem=t===-1?void 0:t,this.updateFocus(void 0,void 0,!0)}else n!==void 0&&(this.focusedItem=n),this.updateFocus(void 0,void 0,!0)}focusFirst(){return this.focusedItem=this.length()-1,this.focusNext(!0)}focusLast(){return this.focusedItem=0,this.focusPrevious(!0)}focusNext(a){if(typeof this.focusedItem>"u")this.focusedItem=this.viewItems.length-1;else if(this.viewItems.length<=1)return!1;const i=this.focusedItem;let n;do{if(!a&&this.options.preventLoopNavigation&&this.focusedItem+1>=this.viewItems.length)return this.focusedItem=i,!1;this.focusedItem=(this.focusedItem+1)%this.viewItems.length,n=this.viewItems[this.focusedItem]}while(this.focusedItem!==i&&(this.options.focusOnlyEnabledItems&&!n.isEnabled()||n.action.id===E.Separator.ID));return this.updateFocus(),!0}focusPrevious(a){if(typeof this.focusedItem>"u")this.focusedItem=0;else if(this.viewItems.length<=1)return!1;const i=this.focusedItem;let n;do{if(this.focusedItem=this.focusedItem-1,this.focusedItem<0){if(!a&&this.options.preventLoopNavigation)return this.focusedItem=i,!1;this.focusedItem=this.viewItems.length-1}n=this.viewItems[this.focusedItem]}while(this.focusedItem!==i&&(this.options.focusOnlyEnabledItems&&!n.isEnabled()||n.action.id===E.Separator.ID));return this.updateFocus(!0),!0}updateFocus(a,i,n=!1){var t,r;typeof this.focusedItem>"u"&&this.actionsList.focus({preventScroll:i}),this.previouslyFocusedItem!==void 0&&this.previouslyFocusedItem!==this.focusedItem&&((t=this.viewItems[this.previouslyFocusedItem])===null||t===void 0||t.blur());const u=this.focusedItem!==void 0?this.viewItems[this.focusedItem]:void 0;if(u){let f=!0;_.isFunction(u.focus)||(f=!1),this.options.focusOnlyEnabledItems&&_.isFunction(u.isEnabled)&&!u.isEnabled()&&(f=!1),u.action.id===E.Separator.ID&&(f=!1),f?(n||this.previouslyFocusedItem!==this.focusedItem)&&(u.focus(a),this.previouslyFocusedItem=this.focusedItem):(this.actionsList.focus({preventScroll:i}),this.previouslyFocusedItem=void 0),f&&((r=u.showHover)===null||r===void 0||r.call(u))}}doTrigger(a){if(typeof this.focusedItem>"u")return;const i=this.viewItems[this.focusedItem];if(i instanceof y.BaseActionViewItem){const n=i._context===null||i._context===void 0?a:i._context;this.run(i._action,n)}}async run(a,i){await this._actionRunner.run(a,i)}dispose(){this._context=void 0,this.viewItems=(0,p.dispose)(this.viewItems),this.getContainer().remove(),super.dispose()}}e.ActionBar=v}),define(se[325],oe([1,0,7,135,588,6,273]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DropdownMenuActionViewItem=void 0;class S extends k.BaseActionViewItem{constructor(_,v,b,a=Object.create(null)){super(null,_,a),this.actionItem=null,this._onDidChangeVisibility=this._register(new E.Emitter),this.onDidChangeVisibility=this._onDidChangeVisibility.event,this.menuActionsOrProvider=v,this.contextMenuProvider=b,this.options=a,this.options.actionRunner&&(this.actionRunner=this.options.actionRunner)}render(_){this.actionItem=_;const v=i=>{this.element=(0,L.append)(i,(0,L.$)("a.action-label"));let n=[];return typeof this.options.classNames=="string"?n=this.options.classNames.split(/\s+/g).filter(t=>!!t):this.options.classNames&&(n=this.options.classNames),n.find(t=>t==="icon")||n.push("codicon"),this.element.classList.add(...n),this.element.setAttribute("role","button"),this.element.setAttribute("aria-haspopup","true"),this.element.setAttribute("aria-expanded","false"),this.element.title=this._action.label||"",this.element.ariaLabel=this._action.label||"",null},b=Array.isArray(this.menuActionsOrProvider),a={contextMenuProvider:this.contextMenuProvider,labelRenderer:v,menuAsChild:this.options.menuAsChild,actions:b?this.menuActionsOrProvider:void 0,actionProvider:b?void 0:this.menuActionsOrProvider,skipTelemetry:this.options.skipTelemetry};if(this.dropdownMenu=this._register(new y.DropdownMenu(_,a)),this._register(this.dropdownMenu.onDidChangeVisibility(i=>{var n;(n=this.element)===null||n===void 0||n.setAttribute("aria-expanded",`${i}`),this._onDidChangeVisibility.fire(i)})),this.dropdownMenu.menuOptions={actionViewItemProvider:this.options.actionViewItemProvider,actionRunner:this.actionRunner,getKeyBinding:this.options.keybindingProvider,context:this._context},this.options.anchorAlignmentProvider){const i=this;this.dropdownMenu.menuOptions={...this.dropdownMenu.menuOptions,get anchorAlignment(){return i.options.anchorAlignmentProvider()}}}this.updateTooltip(),this.updateEnabled()}getTooltip(){let _=null;return this.action.tooltip?_=this.action.tooltip:this.action.label&&(_=this.action.label),_??void 0}setActionContext(_){super.setActionContext(_),this.dropdownMenu&&(this.dropdownMenu.menuOptions?this.dropdownMenu.menuOptions.context=_:this.dropdownMenu.menuOptions={context:_})}show(){var _;(_=this.dropdownMenu)===null||_===void 0||_.show()}updateEnabled(){var _,v;const b=!this.action.enabled;(_=this.actionItem)===null||_===void 0||_.classList.toggle("disabled",b),(v=this.element)===null||v===void 0||v.classList.toggle("disabled",b)}}e.DropdownMenuActionViewItem=S}),define(se[231],oe([1,0,7,84,317,78,48,77,76,6,403,55,572,416]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HistoryInputBox=e.InputBox=e.unthemedInboxStyles=void 0;const n=L.$;e.unthemedInboxStyles={inputBackground:"#3C3C3C",inputForeground:"#CCCCCC",inputValidationInfoBorder:"#55AAFF",inputValidationInfoBackground:"#063B49",inputValidationWarningBorder:"#B89500",inputValidationWarningBackground:"#352A05",inputValidationErrorBorder:"#BE1100",inputValidationErrorBackground:"#5A1D1D",inputBorder:void 0,inputValidationErrorForeground:void 0,inputValidationInfoForeground:void 0,inputValidationWarningForeground:void 0};class t extends _.Widget{constructor(f,c,d){var s;super(),this.state="idle",this.maxHeight=Number.POSITIVE_INFINITY,this._onDidChange=this._register(new v.Emitter),this.onDidChange=this._onDidChange.event,this._onDidHeightChange=this._register(new v.Emitter),this.onDidHeightChange=this._onDidHeightChange.event,this.contextViewProvider=c,this.options=d,this.message=null,this.placeholder=this.options.placeholder||"",this.tooltip=(s=this.options.tooltip)!==null&&s!==void 0?s:this.placeholder||"",this.ariaLabel=this.options.ariaLabel||"",this.options.validationOptions&&(this.validation=this.options.validationOptions.validation),this.element=L.append(f,n(".monaco-inputbox.idle"));const l=this.options.flexibleHeight?"textarea":"input",o=L.append(this.element,n(".ibwrapper"));if(this.input=L.append(o,n(l+".input.empty")),this.input.setAttribute("autocorrect","off"),this.input.setAttribute("autocapitalize","off"),this.input.setAttribute("spellcheck","false"),this.onfocus(this.input,()=>this.element.classList.add("synthetic-focus")),this.onblur(this.input,()=>this.element.classList.remove("synthetic-focus")),this.options.flexibleHeight){this.maxHeight=typeof this.options.flexibleMaxHeight=="number"?this.options.flexibleMaxHeight:Number.POSITIVE_INFINITY,this.mirror=L.append(o,n("div.mirror")),this.mirror.innerText="\xA0",this.scrollableElement=new p.ScrollableElement(this.element,{vertical:1}),this.options.flexibleWidth&&(this.input.setAttribute("wrap","off"),this.mirror.style.whiteSpace="pre",this.mirror.style.wordWrap="initial"),L.append(f,this.scrollableElement.getDomNode()),this._register(this.scrollableElement),this._register(this.scrollableElement.onScroll(m=>this.input.scrollTop=m.scrollTop));const g=this._register(new k.DomEmitter(f.ownerDocument,"selectionchange")),h=v.Event.filter(g.event,()=>{const m=f.ownerDocument.getSelection();return m?.anchorNode===o});this._register(h(this.updateScrollDimensions,this)),this._register(this.onDidHeightChange(this.updateScrollDimensions,this))}else this.input.type=this.options.type||"text",this.input.setAttribute("wrap","off");this.ariaLabel&&this.input.setAttribute("aria-label",this.ariaLabel),this.placeholder&&!this.options.showPlaceholderOnFocus&&this.setPlaceHolder(this.placeholder),this.tooltip&&this.setTooltip(this.tooltip),this.oninput(this.input,()=>this.onValueChange()),this.onblur(this.input,()=>this.onBlur()),this.onfocus(this.input,()=>this.onFocus()),this._register(this.ignoreGesture(this.input)),setTimeout(()=>this.updateMirror(),0),this.options.actions&&(this.actionbar=this._register(new E.ActionBar(this.element)),this.actionbar.push(this.options.actions,{icon:!0,label:!1})),this.applyStyles()}onBlur(){this._hideMessage(),this.options.showPlaceholderOnFocus&&this.input.setAttribute("placeholder","")}onFocus(){this._showMessage(),this.options.showPlaceholderOnFocus&&this.input.setAttribute("placeholder",this.placeholder||"")}setPlaceHolder(f){this.placeholder=f,this.input.setAttribute("placeholder",f)}setTooltip(f){this.tooltip=f,this.input.title=f}get inputElement(){return this.input}get value(){return this.input.value}set value(f){this.input.value!==f&&(this.input.value=f,this.onValueChange())}get height(){return typeof this.cachedHeight=="number"?this.cachedHeight:L.getTotalHeight(this.element)}focus(){this.input.focus()}blur(){this.input.blur()}hasFocus(){return L.isActiveElement(this.input)}select(f=null){this.input.select(),f&&(this.input.setSelectionRange(f.start,f.end),f.end===this.input.value.length&&(this.input.scrollLeft=this.input.scrollWidth))}isSelectionAtEnd(){return this.input.selectionEnd===this.input.value.length&&this.input.selectionStart===this.input.selectionEnd}enable(){this.input.removeAttribute("disabled")}disable(){this.blur(),this.input.disabled=!0,this._hideMessage()}set paddingRight(f){this.input.style.width=`calc(100% - ${f}px)`,this.mirror&&(this.mirror.style.paddingRight=f+"px")}updateScrollDimensions(){if(typeof this.cachedContentHeight!="number"||typeof this.cachedHeight!="number"||!this.scrollableElement)return;const f=this.cachedContentHeight,c=this.cachedHeight,d=this.input.scrollTop;this.scrollableElement.setScrollDimensions({scrollHeight:f,height:c}),this.scrollableElement.setScrollPosition({scrollTop:d})}showMessage(f,c){if(this.state==="open"&&(0,a.equals)(this.message,f))return;this.message=f,this.element.classList.remove("idle"),this.element.classList.remove("info"),this.element.classList.remove("warning"),this.element.classList.remove("error"),this.element.classList.add(this.classForType(f.type));const d=this.stylesForType(this.message.type);this.element.style.border=`1px solid ${L.asCssValueWithDefault(d.border,"transparent")}`,this.message.content&&(this.hasFocus()||c)&&this._showMessage()}hideMessage(){this.message=null,this.element.classList.remove("info"),this.element.classList.remove("warning"),this.element.classList.remove("error"),this.element.classList.add("idle"),this._hideMessage(),this.applyStyles()}validate(){let f=null;return this.validation&&(f=this.validation(this.value),f?(this.inputElement.setAttribute("aria-invalid","true"),this.showMessage(f)):this.inputElement.hasAttribute("aria-invalid")&&(this.inputElement.removeAttribute("aria-invalid"),this.hideMessage())),f?.type}stylesForType(f){const c=this.options.inputBoxStyles;switch(f){case 1:return{border:c.inputValidationInfoBorder,background:c.inputValidationInfoBackground,foreground:c.inputValidationInfoForeground};case 2:return{border:c.inputValidationWarningBorder,background:c.inputValidationWarningBackground,foreground:c.inputValidationWarningForeground};default:return{border:c.inputValidationErrorBorder,background:c.inputValidationErrorBackground,foreground:c.inputValidationErrorForeground}}}classForType(f){switch(f){case 1:return"info";case 2:return"warning";default:return"error"}}_showMessage(){if(!this.contextViewProvider||!this.message)return;let f;const c=()=>f.style.width=L.getTotalWidth(this.element)+"px";this.contextViewProvider.showContextView({getAnchor:()=>this.element,anchorAlignment:1,render:s=>{var l,o;if(!this.message)return null;f=L.append(s,n(".monaco-inputbox-container")),c();const g={inline:!0,className:"monaco-inputbox-message"},h=this.message.formatContent?(0,y.renderFormattedText)(this.message.content,g):(0,y.renderText)(this.message.content,g);h.classList.add(this.classForType(this.message.type));const m=this.stylesForType(this.message.type);return h.style.backgroundColor=(l=m.background)!==null&&l!==void 0?l:"",h.style.color=(o=m.foreground)!==null&&o!==void 0?o:"",h.style.border=m.border?`1px solid ${m.border}`:"",L.append(f,h),null},onHide:()=>{this.state="closed"},layout:c});let d;this.message.type===3?d=i.localize(0,null,this.message.content):this.message.type===2?d=i.localize(1,null,this.message.content):d=i.localize(2,null,this.message.content),S.alert(d),this.state="open"}_hideMessage(){this.contextViewProvider&&(this.state==="open"&&this.contextViewProvider.hideContextView(),this.state="idle")}onValueChange(){this._onDidChange.fire(this.value),this.validate(),this.updateMirror(),this.input.classList.toggle("empty",!this.value),this.state==="open"&&this.contextViewProvider&&this.contextViewProvider.layout()}updateMirror(){if(!this.mirror)return;const f=this.value,d=f.charCodeAt(f.length-1)===10?" ":"";(f+d).replace(/\u000c/g,"")?this.mirror.textContent=f+d:this.mirror.innerText="\xA0",this.layout()}applyStyles(){var f,c,d;const s=this.options.inputBoxStyles,l=(f=s.inputBackground)!==null&&f!==void 0?f:"",o=(c=s.inputForeground)!==null&&c!==void 0?c:"",g=(d=s.inputBorder)!==null&&d!==void 0?d:"";this.element.style.backgroundColor=l,this.element.style.color=o,this.input.style.backgroundColor="inherit",this.input.style.color=o,this.element.style.border=`1px solid ${L.asCssValueWithDefault(g,"transparent")}`}layout(){if(!this.mirror)return;const f=this.cachedContentHeight;this.cachedContentHeight=L.getTotalHeight(this.mirror),f!==this.cachedContentHeight&&(this.cachedHeight=Math.min(this.cachedContentHeight,this.maxHeight),this.input.style.height=this.cachedHeight+"px",this._onDidHeightChange.fire(this.cachedContentHeight))}insertAtCursor(f){const c=this.inputElement,d=c.selectionStart,s=c.selectionEnd,l=c.value;d!==null&&s!==null&&(this.value=l.substr(0,d)+f+l.substr(s),c.setSelectionRange(d+1,d+1),this.layout())}dispose(){var f;this._hideMessage(),this.message=null,(f=this.actionbar)===null||f===void 0||f.dispose(),super.dispose()}}e.InputBox=t;class r extends t{constructor(f,c,d){const s=i.localize(3,null,"\u21C5"),l=i.localize(4,null,"\u21C5");super(f,c,d),this._onDidFocus=this._register(new v.Emitter),this.onDidFocus=this._onDidFocus.event,this._onDidBlur=this._register(new v.Emitter),this.onDidBlur=this._onDidBlur.event,this.history=new b.HistoryNavigator(d.history,100);const o=()=>{if(d.showHistoryHint&&d.showHistoryHint()&&!this.placeholder.endsWith(s)&&!this.placeholder.endsWith(l)&&this.history.getHistory().length){const g=this.placeholder.endsWith(")")?s:l,h=this.placeholder+g;d.showPlaceholderOnFocus&&!L.isActiveElement(this.input)?this.placeholder=h:this.setPlaceHolder(h)}};this.observer=new MutationObserver((g,h)=>{g.forEach(m=>{m.target.textContent||o()})}),this.observer.observe(this.input,{attributeFilter:["class"]}),this.onfocus(this.input,()=>o()),this.onblur(this.input,()=>{const g=h=>{if(this.placeholder.endsWith(h)){const m=this.placeholder.slice(0,this.placeholder.length-h.length);return d.showPlaceholderOnFocus?this.placeholder=m:this.setPlaceHolder(m),!0}else return!1};g(l)||g(s)})}dispose(){super.dispose(),this.observer&&(this.observer.disconnect(),this.observer=void 0)}addToHistory(f){this.value&&(f||this.value!==this.getCurrentValue())&&this.history.add(this.value)}isAtLastInHistory(){return this.history.isLast()}isNowhereInHistory(){return this.history.isNowhere()}showNextValue(){this.history.has(this.value)||this.addToHistory();let f=this.getNextValue();f&&(f=f===this.value?this.getNextValue():f),this.value=f??"",S.status(this.value?this.value:i.localize(5,null))}showPreviousValue(){this.history.has(this.value)||this.addToHistory();let f=this.getPreviousValue();f&&(f=f===this.value?this.getPreviousValue():f),f&&(this.value=f,S.status(this.value))}setPlaceHolder(f){super.setPlaceHolder(f),this.setTooltip(f)}onBlur(){super.onBlur(),this._onDidBlur.fire()}onFocus(){super.onFocus(),this._onDidFocus.fire()}getCurrentValue(){let f=this.history.current();return f||(f=this.history.last(),this.history.next()),f}getPreviousValue(){return this.history.previous()||this.history.first()}getNextValue(){return this.history.next()}}e.HistoryInputBox=r}),define(se[232],oe([1,0,7,323,231,76,6,567,2,274]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FindInput=void 0;const v=p.localize(0,null);class b extends E.Widget{constructor(i,n,t){super(),this.fixFocusOnOptionClickEnabled=!0,this.imeSessionInProgress=!1,this.additionalTogglesDisposables=this._register(new _.MutableDisposable),this.additionalToggles=[],this._onDidOptionChange=this._register(new S.Emitter),this.onDidOptionChange=this._onDidOptionChange.event,this._onKeyDown=this._register(new S.Emitter),this.onKeyDown=this._onKeyDown.event,this._onMouseDown=this._register(new S.Emitter),this.onMouseDown=this._onMouseDown.event,this._onInput=this._register(new S.Emitter),this._onKeyUp=this._register(new S.Emitter),this._onCaseSensitiveKeyDown=this._register(new S.Emitter),this.onCaseSensitiveKeyDown=this._onCaseSensitiveKeyDown.event,this._onRegexKeyDown=this._register(new S.Emitter),this.onRegexKeyDown=this._onRegexKeyDown.event,this._lastHighlightFindOptions=0,this.placeholder=t.placeholder||"",this.validation=t.validation,this.label=t.label||v,this.showCommonFindToggles=!!t.showCommonFindToggles;const r=t.appendCaseSensitiveLabel||"",u=t.appendWholeWordsLabel||"",f=t.appendRegexLabel||"",c=t.history||[],d=!!t.flexibleHeight,s=!!t.flexibleWidth,l=t.flexibleMaxHeight;if(this.domNode=document.createElement("div"),this.domNode.classList.add("monaco-findInput"),this.inputBox=this._register(new y.HistoryInputBox(this.domNode,n,{placeholder:this.placeholder||"",ariaLabel:this.label||"",validationOptions:{validation:this.validation},history:c,showHistoryHint:t.showHistoryHint,flexibleHeight:d,flexibleWidth:s,flexibleMaxHeight:l,inputBoxStyles:t.inputBoxStyles})),this.showCommonFindToggles){this.regex=this._register(new k.RegexToggle({appendTitle:f,isChecked:!1,...t.toggleStyles})),this._register(this.regex.onChange(g=>{this._onDidOptionChange.fire(g),!g&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.regex.onKeyDown(g=>{this._onRegexKeyDown.fire(g)})),this.wholeWords=this._register(new k.WholeWordsToggle({appendTitle:u,isChecked:!1,...t.toggleStyles})),this._register(this.wholeWords.onChange(g=>{this._onDidOptionChange.fire(g),!g&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this.caseSensitive=this._register(new k.CaseSensitiveToggle({appendTitle:r,isChecked:!1,...t.toggleStyles})),this._register(this.caseSensitive.onChange(g=>{this._onDidOptionChange.fire(g),!g&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.caseSensitive.onKeyDown(g=>{this._onCaseSensitiveKeyDown.fire(g)}));const o=[this.caseSensitive.domNode,this.wholeWords.domNode,this.regex.domNode];this.onkeydown(this.domNode,g=>{if(g.equals(15)||g.equals(17)||g.equals(9)){const h=o.indexOf(this.domNode.ownerDocument.activeElement);if(h>=0){let m=-1;g.equals(17)?m=(h+1)%o.length:g.equals(15)&&(h===0?m=o.length-1:m=h-1),g.equals(9)?(o[h].blur(),this.inputBox.focus()):m>=0&&o[m].focus(),L.EventHelper.stop(g,!0)}}})}this.controls=document.createElement("div"),this.controls.className="controls",this.controls.style.display=this.showCommonFindToggles?"":"none",this.caseSensitive&&this.controls.append(this.caseSensitive.domNode),this.wholeWords&&this.controls.appendChild(this.wholeWords.domNode),this.regex&&this.controls.appendChild(this.regex.domNode),this.setAdditionalToggles(t?.additionalToggles),this.controls&&this.domNode.appendChild(this.controls),i?.appendChild(this.domNode),this._register(L.addDisposableListener(this.inputBox.inputElement,"compositionstart",o=>{this.imeSessionInProgress=!0})),this._register(L.addDisposableListener(this.inputBox.inputElement,"compositionend",o=>{this.imeSessionInProgress=!1,this._onInput.fire()})),this.onkeydown(this.inputBox.inputElement,o=>this._onKeyDown.fire(o)),this.onkeyup(this.inputBox.inputElement,o=>this._onKeyUp.fire(o)),this.oninput(this.inputBox.inputElement,o=>this._onInput.fire()),this.onmousedown(this.inputBox.inputElement,o=>this._onMouseDown.fire(o))}get onDidChange(){return this.inputBox.onDidChange}layout(i){this.inputBox.layout(),this.updateInputBoxPadding(i.collapsedFindWidget)}enable(){var i,n,t;this.domNode.classList.remove("disabled"),this.inputBox.enable(),(i=this.regex)===null||i===void 0||i.enable(),(n=this.wholeWords)===null||n===void 0||n.enable(),(t=this.caseSensitive)===null||t===void 0||t.enable();for(const r of this.additionalToggles)r.enable()}disable(){var i,n,t;this.domNode.classList.add("disabled"),this.inputBox.disable(),(i=this.regex)===null||i===void 0||i.disable(),(n=this.wholeWords)===null||n===void 0||n.disable(),(t=this.caseSensitive)===null||t===void 0||t.disable();for(const r of this.additionalToggles)r.disable()}setFocusInputOnOptionClick(i){this.fixFocusOnOptionClickEnabled=i}setEnabled(i){i?this.enable():this.disable()}setAdditionalToggles(i){for(const n of this.additionalToggles)n.domNode.remove();this.additionalToggles=[],this.additionalTogglesDisposables.value=new _.DisposableStore;for(const n of i??[])this.additionalTogglesDisposables.value.add(n),this.controls.appendChild(n.domNode),this.additionalTogglesDisposables.value.add(n.onChange(t=>{this._onDidOptionChange.fire(t),!t&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus()})),this.additionalToggles.push(n);this.additionalToggles.length>0&&(this.controls.style.display=""),this.updateInputBoxPadding()}updateInputBoxPadding(i=!1){var n,t,r,u,f,c;i?this.inputBox.paddingRight=0:this.inputBox.paddingRight=((t=(n=this.caseSensitive)===null||n===void 0?void 0:n.width())!==null&&t!==void 0?t:0)+((u=(r=this.wholeWords)===null||r===void 0?void 0:r.width())!==null&&u!==void 0?u:0)+((c=(f=this.regex)===null||f===void 0?void 0:f.width())!==null&&c!==void 0?c:0)+this.additionalToggles.reduce((d,s)=>d+s.width(),0)}getValue(){return this.inputBox.value}setValue(i){this.inputBox.value!==i&&(this.inputBox.value=i)}select(){this.inputBox.select()}focus(){this.inputBox.focus()}getCaseSensitive(){var i,n;return(n=(i=this.caseSensitive)===null||i===void 0?void 0:i.checked)!==null&&n!==void 0?n:!1}setCaseSensitive(i){this.caseSensitive&&(this.caseSensitive.checked=i)}getWholeWords(){var i,n;return(n=(i=this.wholeWords)===null||i===void 0?void 0:i.checked)!==null&&n!==void 0?n:!1}setWholeWords(i){this.wholeWords&&(this.wholeWords.checked=i)}getRegex(){var i,n;return(n=(i=this.regex)===null||i===void 0?void 0:i.checked)!==null&&n!==void 0?n:!1}setRegex(i){this.regex&&(this.regex.checked=i,this.validate())}focusOnCaseSensitive(){var i;(i=this.caseSensitive)===null||i===void 0||i.focus()}highlightFindOptions(){this.domNode.classList.remove("highlight-"+this._lastHighlightFindOptions),this._lastHighlightFindOptions=1-this._lastHighlightFindOptions,this.domNode.classList.add("highlight-"+this._lastHighlightFindOptions)}validate(){this.inputBox.validate()}showMessage(i){this.inputBox.showMessage(i)}clearMessage(){this.inputBox.hideMessage()}}e.FindInput=b}),define(se[598],oe([1,0,7,159,231,76,26,6,569,274]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReplaceInput=void 0;const v=_.localize(0,null),b=_.localize(1,null);class a extends k.Toggle{constructor(t){super({icon:S.Codicon.preserveCase,title:b+t.appendTitle,isChecked:t.isChecked,inputActiveOptionBorder:t.inputActiveOptionBorder,inputActiveOptionForeground:t.inputActiveOptionForeground,inputActiveOptionBackground:t.inputActiveOptionBackground})}}class i extends E.Widget{constructor(t,r,u,f){super(),this._showOptionButtons=u,this.fixFocusOnOptionClickEnabled=!0,this.cachedOptionsWidth=0,this._onDidOptionChange=this._register(new p.Emitter),this.onDidOptionChange=this._onDidOptionChange.event,this._onKeyDown=this._register(new p.Emitter),this.onKeyDown=this._onKeyDown.event,this._onMouseDown=this._register(new p.Emitter),this._onInput=this._register(new p.Emitter),this._onKeyUp=this._register(new p.Emitter),this._onPreserveCaseKeyDown=this._register(new p.Emitter),this.onPreserveCaseKeyDown=this._onPreserveCaseKeyDown.event,this.contextViewProvider=r,this.placeholder=f.placeholder||"",this.validation=f.validation,this.label=f.label||v;const c=f.appendPreserveCaseLabel||"",d=f.history||[],s=!!f.flexibleHeight,l=!!f.flexibleWidth,o=f.flexibleMaxHeight;this.domNode=document.createElement("div"),this.domNode.classList.add("monaco-findInput"),this.inputBox=this._register(new y.HistoryInputBox(this.domNode,this.contextViewProvider,{ariaLabel:this.label||"",placeholder:this.placeholder||"",validationOptions:{validation:this.validation},history:d,showHistoryHint:f.showHistoryHint,flexibleHeight:s,flexibleWidth:l,flexibleMaxHeight:o,inputBoxStyles:f.inputBoxStyles})),this.preserveCase=this._register(new a({appendTitle:c,isChecked:!1,...f.toggleStyles})),this._register(this.preserveCase.onChange(m=>{this._onDidOptionChange.fire(m),!m&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.preserveCase.onKeyDown(m=>{this._onPreserveCaseKeyDown.fire(m)})),this._showOptionButtons?this.cachedOptionsWidth=this.preserveCase.width():this.cachedOptionsWidth=0;const g=[this.preserveCase.domNode];this.onkeydown(this.domNode,m=>{if(m.equals(15)||m.equals(17)||m.equals(9)){const C=g.indexOf(this.domNode.ownerDocument.activeElement);if(C>=0){let w=-1;m.equals(17)?w=(C+1)%g.length:m.equals(15)&&(C===0?w=g.length-1:w=C-1),m.equals(9)?(g[C].blur(),this.inputBox.focus()):w>=0&&g[w].focus(),L.EventHelper.stop(m,!0)}}});const h=document.createElement("div");h.className="controls",h.style.display=this._showOptionButtons?"block":"none",h.appendChild(this.preserveCase.domNode),this.domNode.appendChild(h),t?.appendChild(this.domNode),this.onkeydown(this.inputBox.inputElement,m=>this._onKeyDown.fire(m)),this.onkeyup(this.inputBox.inputElement,m=>this._onKeyUp.fire(m)),this.oninput(this.inputBox.inputElement,m=>this._onInput.fire()),this.onmousedown(this.inputBox.inputElement,m=>this._onMouseDown.fire(m))}enable(){this.domNode.classList.remove("disabled"),this.inputBox.enable(),this.preserveCase.enable()}disable(){this.domNode.classList.add("disabled"),this.inputBox.disable(),this.preserveCase.disable()}setEnabled(t){t?this.enable():this.disable()}select(){this.inputBox.select()}focus(){this.inputBox.focus()}getPreserveCase(){return this.preserveCase.checked}setPreserveCase(t){this.preserveCase.checked=t}focusOnPreserve(){this.preserveCase.focus()}validate(){var t;(t=this.inputBox)===null||t===void 0||t.validate()}set width(t){this.inputBox.paddingRight=this.cachedOptionsWidth,this.domNode.style.width=t+"px"}dispose(){super.dispose()}}e.ReplaceInput=i}),define(se[599],oe([1,0,54,63,7,46,67,78,135,318,77,42,14,26,28,126,2,17,11]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.formatRule=e.cleanMnemonic=e.Menu=e.Direction=e.MENU_ESCAPED_MNEMONIC_REGEX=e.MENU_MNEMONIC_REGEX=void 0,e.MENU_MNEMONIC_REGEX=/\(&([^\s&])\)|(^|[^&])&([^\s&])/,e.MENU_ESCAPED_MNEMONIC_REGEX=/(&amp;)?(&amp;)([^\s&])/g;var d;(function(w){w[w.Right=0]="Right",w[w.Left=1]="Left"})(d||(e.Direction=d={}));class s extends p.ActionBar{constructor(D,I,T,A){D.classList.add("monaco-menu-container"),D.setAttribute("role","presentation");const P=document.createElement("div");P.classList.add("monaco-menu"),P.setAttribute("role","presentation"),super(P,{orientation:1,actionViewItemProvider:x=>this.doGetActionViewItem(x,T,N),context:T.context,actionRunner:T.actionRunner,ariaLabel:T.ariaLabel,ariaRole:"menu",focusOnlyEnabledItems:!0,triggerKeys:{keys:[3,...f.isMacintosh||f.isLinux?[10]:[]],keyDown:!0}}),this.menuStyles=A,this.menuElement=P,this.actionsList.tabIndex=0,this.initializeOrUpdateStyleSheet(D,A),this._register(k.Gesture.addTarget(P)),this._register((0,y.addDisposableListener)(P,y.EventType.KEY_DOWN,x=>{new E.StandardKeyboardEvent(x).equals(2)&&x.preventDefault()})),T.enableMnemonics&&this._register((0,y.addDisposableListener)(P,y.EventType.KEY_DOWN,x=>{const O=x.key.toLocaleLowerCase();if(this.mnemonics.has(O)){y.EventHelper.stop(x,!0);const B=this.mnemonics.get(O);if(B.length===1&&(B[0]instanceof o&&B[0].container&&this.focusItemByElement(B[0].container),B[0].onClick(x)),B.length>1){const W=B.shift();W&&W.container&&(this.focusItemByElement(W.container),B.push(W)),this.mnemonics.set(O,B)}}})),f.isLinux&&this._register((0,y.addDisposableListener)(P,y.EventType.KEY_DOWN,x=>{const O=new E.StandardKeyboardEvent(x);O.equals(14)||O.equals(11)?(this.focusedItem=this.viewItems.length-1,this.focusNext(),y.EventHelper.stop(x,!0)):(O.equals(13)||O.equals(12))&&(this.focusedItem=0,this.focusPrevious(),y.EventHelper.stop(x,!0))})),this._register((0,y.addDisposableListener)(this.domNode,y.EventType.MOUSE_OUT,x=>{const O=x.relatedTarget;(0,y.isAncestor)(O,this.domNode)||(this.focusedItem=void 0,this.updateFocus(),x.stopPropagation())})),this._register((0,y.addDisposableListener)(this.actionsList,y.EventType.MOUSE_OVER,x=>{let O=x.target;if(!(!O||!(0,y.isAncestor)(O,this.actionsList)||O===this.actionsList)){for(;O.parentElement!==this.actionsList&&O.parentElement!==null;)O=O.parentElement;if(O.classList.contains("action-item")){const B=this.focusedItem;this.setFocusedItem(O),B!==this.focusedItem&&this.updateFocus()}}})),this._register(k.Gesture.addTarget(this.actionsList)),this._register((0,y.addDisposableListener)(this.actionsList,k.EventType.Tap,x=>{let O=x.initialTarget;if(!(!O||!(0,y.isAncestor)(O,this.actionsList)||O===this.actionsList)){for(;O.parentElement!==this.actionsList&&O.parentElement!==null;)O=O.parentElement;if(O.classList.contains("action-item")){const B=this.focusedItem;this.setFocusedItem(O),B!==this.focusedItem&&this.updateFocus()}}}));const N={parent:this};this.mnemonics=new Map,this.scrollableElement=this._register(new b.DomScrollableElement(P,{alwaysConsumeMouseWheel:!0,horizontal:2,vertical:3,verticalScrollbarSize:7,handleMouseWheel:!0,useShadows:!0}));const M=this.scrollableElement.getDomNode();M.style.position="",this.styleScrollElement(M,A),this._register((0,y.addDisposableListener)(P,k.EventType.Change,x=>{y.EventHelper.stop(x,!0);const O=this.scrollableElement.getScrollPosition().scrollTop;this.scrollableElement.setScrollPosition({scrollTop:O-x.translationY})})),this._register((0,y.addDisposableListener)(M,y.EventType.MOUSE_UP,x=>{x.preventDefault()}));const R=(0,y.getWindow)(D);P.style.maxHeight=`${Math.max(10,R.innerHeight-D.getBoundingClientRect().top-35)}px`,I=I.filter((x,O)=>{var B;return!((B=T.submenuIds)===null||B===void 0)&&B.has(x.id)?(console.warn(`Found submenu cycle: ${x.id}`),!1):!(x instanceof a.Separator&&(O===I.length-1||O===0||I[O-1]instanceof a.Separator))}),this.push(I,{icon:!0,label:!0,isMenu:!0}),D.appendChild(this.scrollableElement.getDomNode()),this.scrollableElement.scanDomNode(),this.viewItems.filter(x=>!(x instanceof g)).forEach((x,O,B)=>{x.updatePositionInSet(O+1,B.length)})}initializeOrUpdateStyleSheet(D,I){this.styleSheet||((0,y.isInShadowDOM)(D)?this.styleSheet=(0,y.createStyleSheet)(D):(s.globalStyleSheet||(s.globalStyleSheet=(0,y.createStyleSheet)()),this.styleSheet=s.globalStyleSheet)),this.styleSheet.textContent=C(I,(0,y.isInShadowDOM)(D))}styleScrollElement(D,I){var T,A;const P=(T=I.foregroundColor)!==null&&T!==void 0?T:"",N=(A=I.backgroundColor)!==null&&A!==void 0?A:"",M=I.borderColor?`1px solid ${I.borderColor}`:"",R="5px",x=I.shadowColor?`0 2px 8px ${I.shadowColor}`:"";D.style.outline=M,D.style.borderRadius=R,D.style.color=P,D.style.backgroundColor=N,D.style.boxShadow=x}getContainer(){return this.scrollableElement.getDomNode()}get onScroll(){return this.scrollableElement.onScroll}focusItemByElement(D){const I=this.focusedItem;this.setFocusedItem(D),I!==this.focusedItem&&this.updateFocus()}setFocusedItem(D){for(let I=0;I<this.actionsList.children.length;I++){const T=this.actionsList.children[I];if(D===T){this.focusedItem=I;break}}}updateFocus(D){super.updateFocus(D,!0,!0),typeof this.focusedItem<"u"&&this.scrollableElement.setScrollPosition({scrollTop:Math.round(this.menuElement.scrollTop)})}doGetActionViewItem(D,I,T){if(D instanceof a.Separator)return new g(I.context,D,{icon:!0},this.menuStyles);if(D instanceof a.SubmenuAction){const A=new o(D,D.actions,T,{...I,submenuIds:new Set([...I.submenuIds||[],D.id])},this.menuStyles);if(I.enableMnemonics){const P=A.getMnemonic();if(P&&A.isEnabled()){let N=[];this.mnemonics.has(P)&&(N=this.mnemonics.get(P)),N.push(A),this.mnemonics.set(P,N)}}return A}else{const A={enableMnemonics:I.enableMnemonics,useEventAsContext:I.useEventAsContext};if(I.getKeyBinding){const N=I.getKeyBinding(D);if(N){const M=N.getLabel();M&&(A.keybinding=M)}}const P=new l(I.context,D,A,this.menuStyles);if(I.enableMnemonics){const N=P.getMnemonic();if(N&&P.isEnabled()){let M=[];this.mnemonics.has(N)&&(M=this.mnemonics.get(N)),M.push(P),this.mnemonics.set(N,M)}}return P}}}e.Menu=s;class l extends _.BaseActionViewItem{constructor(D,I,T,A){if(T.isMenu=!0,super(I,I,T),this.menuStyle=A,this.options=T,this.options.icon=T.icon!==void 0?T.icon:!1,this.options.label=T.label!==void 0?T.label:!0,this.cssClass="",this.options.label&&T.enableMnemonics){const P=this.action.label;if(P){const N=e.MENU_MNEMONIC_REGEX.exec(P);N&&(this.mnemonic=(N[1]?N[1]:N[3]).toLocaleLowerCase())}}this.runOnceToEnableMouseUp=new i.RunOnceScheduler(()=>{this.element&&(this._register((0,y.addDisposableListener)(this.element,y.EventType.MOUSE_UP,P=>{if(y.EventHelper.stop(P,!0),L.isFirefox){if(new S.StandardMouseEvent((0,y.getWindow)(this.element),P).rightButton)return;this.onClick(P)}else setTimeout(()=>{this.onClick(P)},0)})),this._register((0,y.addDisposableListener)(this.element,y.EventType.CONTEXT_MENU,P=>{y.EventHelper.stop(P,!0)})))},100),this._register(this.runOnceToEnableMouseUp)}render(D){super.render(D),this.element&&(this.container=D,this.item=(0,y.append)(this.element,(0,y.$)("a.action-menu-item")),this._action.id===a.Separator.ID?this.item.setAttribute("role","presentation"):(this.item.setAttribute("role","menuitem"),this.mnemonic&&this.item.setAttribute("aria-keyshortcuts",`${this.mnemonic}`)),this.check=(0,y.append)(this.item,(0,y.$)("span.menu-item-check"+t.ThemeIcon.asCSSSelector(n.Codicon.menuSelection))),this.check.setAttribute("role","none"),this.label=(0,y.append)(this.item,(0,y.$)("span.action-label")),this.options.label&&this.options.keybinding&&((0,y.append)(this.item,(0,y.$)("span.keybinding")).textContent=this.options.keybinding),this.runOnceToEnableMouseUp.schedule(),this.updateClass(),this.updateLabel(),this.updateTooltip(),this.updateEnabled(),this.updateChecked(),this.applyStyle())}blur(){super.blur(),this.applyStyle()}focus(){var D;super.focus(),(D=this.item)===null||D===void 0||D.focus(),this.applyStyle()}updatePositionInSet(D,I){this.item&&(this.item.setAttribute("aria-posinset",`${D}`),this.item.setAttribute("aria-setsize",`${I}`))}updateLabel(){var D;if(this.label&&this.options.label){(0,y.clearNode)(this.label);let I=(0,r.stripIcons)(this.action.label);if(I){const T=h(I);this.options.enableMnemonics||(I=T),this.label.setAttribute("aria-label",T.replace(/&&/g,"&"));const A=e.MENU_MNEMONIC_REGEX.exec(I);if(A){I=c.escape(I),e.MENU_ESCAPED_MNEMONIC_REGEX.lastIndex=0;let P=e.MENU_ESCAPED_MNEMONIC_REGEX.exec(I);for(;P&&P[1];)P=e.MENU_ESCAPED_MNEMONIC_REGEX.exec(I);const N=M=>M.replace(/&amp;&amp;/g,"&amp;");P?this.label.append(c.ltrim(N(I.substr(0,P.index))," "),(0,y.$)("u",{"aria-hidden":"true"},P[3]),c.rtrim(N(I.substr(P.index+P[0].length))," ")):this.label.innerText=N(I).trim(),(D=this.item)===null||D===void 0||D.setAttribute("aria-keyshortcuts",(A[1]?A[1]:A[3]).toLocaleLowerCase())}else this.label.innerText=I.replace(/&&/g,"&").trim()}}}updateTooltip(){}updateClass(){this.cssClass&&this.item&&this.item.classList.remove(...this.cssClass.split(" ")),this.options.icon&&this.label?(this.cssClass=this.action.class||"",this.label.classList.add("icon"),this.cssClass&&this.label.classList.add(...this.cssClass.split(" ")),this.updateEnabled()):this.label&&this.label.classList.remove("icon")}updateEnabled(){this.action.enabled?(this.element&&(this.element.classList.remove("disabled"),this.element.removeAttribute("aria-disabled")),this.item&&(this.item.classList.remove("disabled"),this.item.removeAttribute("aria-disabled"),this.item.tabIndex=0)):(this.element&&(this.element.classList.add("disabled"),this.element.setAttribute("aria-disabled","true")),this.item&&(this.item.classList.add("disabled"),this.item.setAttribute("aria-disabled","true")))}updateChecked(){if(!this.item)return;const D=this.action.checked;this.item.classList.toggle("checked",!!D),D!==void 0?(this.item.setAttribute("role","menuitemcheckbox"),this.item.setAttribute("aria-checked",D?"true":"false")):(this.item.setAttribute("role","menuitem"),this.item.setAttribute("aria-checked",""))}getMnemonic(){return this.mnemonic}applyStyle(){const D=this.element&&this.element.classList.contains("focused"),I=D&&this.menuStyle.selectionForegroundColor?this.menuStyle.selectionForegroundColor:this.menuStyle.foregroundColor,T=D&&this.menuStyle.selectionBackgroundColor?this.menuStyle.selectionBackgroundColor:void 0,A=D&&this.menuStyle.selectionBorderColor?`1px solid ${this.menuStyle.selectionBorderColor}`:"",P=D&&this.menuStyle.selectionBorderColor?"-1px":"";this.item&&(this.item.style.color=I??"",this.item.style.backgroundColor=T??"",this.item.style.outline=A,this.item.style.outlineOffset=P),this.check&&(this.check.style.color=I??"")}}class o extends l{constructor(D,I,T,A,P){super(D,D,A,P),this.submenuActions=I,this.parentData=T,this.submenuOptions=A,this.mysubmenu=null,this.submenuDisposables=this._register(new u.DisposableStore),this.mouseOver=!1,this.expandDirection=A&&A.expandDirection!==void 0?A.expandDirection:d.Right,this.showScheduler=new i.RunOnceScheduler(()=>{this.mouseOver&&(this.cleanupExistingSubmenu(!1),this.createSubmenu(!1))},250),this.hideScheduler=new i.RunOnceScheduler(()=>{this.element&&!(0,y.isAncestor)((0,y.getActiveElement)(),this.element)&&this.parentData.submenu===this.mysubmenu&&(this.parentData.parent.focus(!1),this.cleanupExistingSubmenu(!0))},750)}render(D){super.render(D),this.element&&(this.item&&(this.item.classList.add("monaco-submenu-item"),this.item.tabIndex=0,this.item.setAttribute("aria-haspopup","true"),this.updateAriaExpanded("false"),this.submenuIndicator=(0,y.append)(this.item,(0,y.$)("span.submenu-indicator"+t.ThemeIcon.asCSSSelector(n.Codicon.menuSubmenu))),this.submenuIndicator.setAttribute("aria-hidden","true")),this._register((0,y.addDisposableListener)(this.element,y.EventType.KEY_UP,I=>{const T=new E.StandardKeyboardEvent(I);(T.equals(17)||T.equals(3))&&(y.EventHelper.stop(I,!0),this.createSubmenu(!0))})),this._register((0,y.addDisposableListener)(this.element,y.EventType.KEY_DOWN,I=>{const T=new E.StandardKeyboardEvent(I);(0,y.getActiveElement)()===this.item&&(T.equals(17)||T.equals(3))&&y.EventHelper.stop(I,!0)})),this._register((0,y.addDisposableListener)(this.element,y.EventType.MOUSE_OVER,I=>{this.mouseOver||(this.mouseOver=!0,this.showScheduler.schedule())})),this._register((0,y.addDisposableListener)(this.element,y.EventType.MOUSE_LEAVE,I=>{this.mouseOver=!1})),this._register((0,y.addDisposableListener)(this.element,y.EventType.FOCUS_OUT,I=>{this.element&&!(0,y.isAncestor)((0,y.getActiveElement)(),this.element)&&this.hideScheduler.schedule()})),this._register(this.parentData.parent.onScroll(()=>{this.parentData.submenu===this.mysubmenu&&(this.parentData.parent.focus(!1),this.cleanupExistingSubmenu(!0))})))}updateEnabled(){}onClick(D){y.EventHelper.stop(D,!0),this.cleanupExistingSubmenu(!1),this.createSubmenu(!0)}cleanupExistingSubmenu(D){if(this.parentData.submenu&&(D||this.parentData.submenu!==this.mysubmenu)){try{this.parentData.submenu.dispose()}catch{}this.parentData.submenu=void 0,this.updateAriaExpanded("false"),this.submenuContainer&&(this.submenuDisposables.clear(),this.submenuContainer=void 0)}}calculateSubmenuMenuLayout(D,I,T,A){const P={top:0,left:0};return P.left=(0,v.layout)(D.width,I.width,{position:A===d.Right?0:1,offset:T.left,size:T.width}),P.left>=T.left&&P.left<T.left+T.width&&(T.left+10+I.width<=D.width&&(P.left=T.left+10),T.top+=10,T.height=0),P.top=(0,v.layout)(D.height,I.height,{position:0,offset:T.top,size:0}),P.top+I.height===T.top&&P.top+T.height+I.height<=D.height&&(P.top+=T.height),P}createSubmenu(D=!0){if(this.element)if(this.parentData.submenu)this.parentData.submenu.focus(!1);else{this.updateAriaExpanded("true"),this.submenuContainer=(0,y.append)(this.element,(0,y.$)("div.monaco-submenu")),this.submenuContainer.classList.add("menubar-menu-items-holder","context-view");const I=(0,y.getWindow)(this.parentData.parent.domNode).getComputedStyle(this.parentData.parent.domNode),T=parseFloat(I.paddingTop||"0")||0;this.submenuContainer.style.zIndex="1",this.submenuContainer.style.position="fixed",this.submenuContainer.style.top="0",this.submenuContainer.style.left="0",this.parentData.submenu=new s(this.submenuContainer,this.submenuActions.length?this.submenuActions:[new a.EmptySubmenuAction],this.submenuOptions,this.menuStyle);const A=this.element.getBoundingClientRect(),P={top:A.top-T,left:A.left,height:A.height+2*T,width:A.width},N=this.submenuContainer.getBoundingClientRect(),M=(0,y.getWindow)(this.element),{top:R,left:x}=this.calculateSubmenuMenuLayout(new y.Dimension(M.innerWidth,M.innerHeight),y.Dimension.lift(N),P,this.expandDirection);this.submenuContainer.style.left=`${x-N.left}px`,this.submenuContainer.style.top=`${R-N.top}px`,this.submenuDisposables.add((0,y.addDisposableListener)(this.submenuContainer,y.EventType.KEY_UP,O=>{new E.StandardKeyboardEvent(O).equals(15)&&(y.EventHelper.stop(O,!0),this.parentData.parent.focus(),this.cleanupExistingSubmenu(!0))})),this.submenuDisposables.add((0,y.addDisposableListener)(this.submenuContainer,y.EventType.KEY_DOWN,O=>{new E.StandardKeyboardEvent(O).equals(15)&&y.EventHelper.stop(O,!0)})),this.submenuDisposables.add(this.parentData.submenu.onDidCancel(()=>{this.parentData.parent.focus(),this.cleanupExistingSubmenu(!0)})),this.parentData.submenu.focus(D),this.mysubmenu=this.parentData.submenu}}updateAriaExpanded(D){var I;this.item&&((I=this.item)===null||I===void 0||I.setAttribute("aria-expanded",D))}applyStyle(){super.applyStyle();const I=this.element&&this.element.classList.contains("focused")&&this.menuStyle.selectionForegroundColor?this.menuStyle.selectionForegroundColor:this.menuStyle.foregroundColor;this.submenuIndicator&&(this.submenuIndicator.style.color=I??"")}dispose(){super.dispose(),this.hideScheduler.dispose(),this.mysubmenu&&(this.mysubmenu.dispose(),this.mysubmenu=null),this.submenuContainer&&(this.submenuContainer=void 0)}}class g extends _.ActionViewItem{constructor(D,I,T,A){super(D,I,T),this.menuStyles=A}render(D){super.render(D),this.label&&(this.label.style.borderBottomColor=this.menuStyles.separatorColor?`${this.menuStyles.separatorColor}`:"")}}function h(w){const D=e.MENU_MNEMONIC_REGEX,I=D.exec(w);if(!I)return w;const T=!I[1];return w.replace(D,T?"$2$3":"").trim()}e.cleanMnemonic=h;function m(w){const D=(0,n.getCodiconFontCharacters)()[w.id];return`.codicon-${w.id}:before { content: '\\${D.toString(16)}'; }`}e.formatRule=m;function C(w,D){let I=`
+.monaco-menu {
+	font-size: 13px;
+	border-radius: 5px;
+	min-width: 160px;
+}
+
+${m(n.Codicon.menuSelection)}
+${m(n.Codicon.menuSubmenu)}
+
+.monaco-menu .monaco-action-bar {
+	text-align: right;
+	overflow: hidden;
+	white-space: nowrap;
+}
+
+.monaco-menu .monaco-action-bar .actions-container {
+	display: flex;
+	margin: 0 auto;
+	padding: 0;
+	width: 100%;
+	justify-content: flex-end;
+}
+
+.monaco-menu .monaco-action-bar.vertical .actions-container {
+	display: inline-block;
+}
+
+.monaco-menu .monaco-action-bar.reverse .actions-container {
+	flex-direction: row-reverse;
+}
+
+.monaco-menu .monaco-action-bar .action-item {
+	cursor: pointer;
+	display: inline-block;
+	transition: transform 50ms ease;
+	position: relative;  /* DO NOT REMOVE - this is the key to preventing the ghosting icon bug in Chrome 42 */
+}
+
+.monaco-menu .monaco-action-bar .action-item.disabled {
+	cursor: default;
+}
+
+.monaco-menu .monaco-action-bar.animated .action-item.active {
+	transform: scale(1.272019649, 1.272019649); /* 1.272019649 = \u221A\u03C6 */
+}
+
+.monaco-menu .monaco-action-bar .action-item .icon,
+.monaco-menu .monaco-action-bar .action-item .codicon {
+	display: inline-block;
+}
+
+.monaco-menu .monaco-action-bar .action-item .codicon {
+	display: flex;
+	align-items: center;
+}
+
+.monaco-menu .monaco-action-bar .action-label {
+	font-size: 11px;
+	margin-right: 4px;
+}
+
+.monaco-menu .monaco-action-bar .action-item.disabled .action-label,
+.monaco-menu .monaco-action-bar .action-item.disabled .action-label:hover {
+	color: var(--vscode-disabledForeground);
+}
+
+/* Vertical actions */
+
+.monaco-menu .monaco-action-bar.vertical {
+	text-align: left;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-item {
+	display: block;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-label.separator {
+	display: block;
+	border-bottom: 1px solid var(--vscode-menu-separatorBackground);
+	padding-top: 1px;
+	padding: 30px;
+}
+
+.monaco-menu .secondary-actions .monaco-action-bar .action-label {
+	margin-left: 6px;
+}
+
+/* Action Items */
+.monaco-menu .monaco-action-bar .action-item.select-container {
+	overflow: hidden; /* somehow the dropdown overflows its container, we prevent it here to not push */
+	flex: 1;
+	max-width: 170px;
+	min-width: 60px;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	margin-right: 10px;
+}
+
+.monaco-menu .monaco-action-bar.vertical {
+	margin-left: 0;
+	overflow: visible;
+}
+
+.monaco-menu .monaco-action-bar.vertical .actions-container {
+	display: block;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-item {
+	padding: 0;
+	transform: none;
+	display: flex;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-item.active {
+	transform: none;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-menu-item {
+	flex: 1 1 auto;
+	display: flex;
+	height: 2em;
+	align-items: center;
+	position: relative;
+	margin: 0 4px;
+	border-radius: 4px;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-menu-item:hover .keybinding,
+.monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .keybinding {
+	opacity: unset;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-label {
+	flex: 1 1 auto;
+	text-decoration: none;
+	padding: 0 1em;
+	background: none;
+	font-size: 12px;
+	line-height: 1;
+}
+
+.monaco-menu .monaco-action-bar.vertical .keybinding,
+.monaco-menu .monaco-action-bar.vertical .submenu-indicator {
+	display: inline-block;
+	flex: 2 1 auto;
+	padding: 0 1em;
+	text-align: right;
+	font-size: 12px;
+	line-height: 1;
+}
+
+.monaco-menu .monaco-action-bar.vertical .submenu-indicator {
+	height: 100%;
+}
+
+.monaco-menu .monaco-action-bar.vertical .submenu-indicator.codicon {
+	font-size: 16px !important;
+	display: flex;
+	align-items: center;
+}
+
+.monaco-menu .monaco-action-bar.vertical .submenu-indicator.codicon::before {
+	margin-left: auto;
+	margin-right: -20px;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-item.disabled .keybinding,
+.monaco-menu .monaco-action-bar.vertical .action-item.disabled .submenu-indicator {
+	opacity: 0.4;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-label:not(.separator) {
+	display: inline-block;
+	box-sizing: border-box;
+	margin: 0;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-item {
+	position: static;
+	overflow: visible;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-item .monaco-submenu {
+	position: absolute;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-label.separator {
+	width: 100%;
+	height: 0px !important;
+	opacity: 1;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-label.separator.text {
+	padding: 0.7em 1em 0.1em 1em;
+	font-weight: bold;
+	opacity: 1;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-label:hover {
+	color: inherit;
+}
+
+.monaco-menu .monaco-action-bar.vertical .menu-item-check {
+	position: absolute;
+	visibility: hidden;
+	width: 1em;
+	height: 100%;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-menu-item.checked .menu-item-check {
+	visibility: visible;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+/* Context Menu */
+
+.context-view.monaco-menu-container {
+	outline: 0;
+	border: none;
+	animation: fadeIn 0.083s linear;
+	-webkit-app-region: no-drag;
+}
+
+.context-view.monaco-menu-container :focus,
+.context-view.monaco-menu-container .monaco-action-bar.vertical:focus,
+.context-view.monaco-menu-container .monaco-action-bar.vertical :focus {
+	outline: 0;
+}
+
+.hc-black .context-view.monaco-menu-container,
+.hc-light .context-view.monaco-menu-container,
+:host-context(.hc-black) .context-view.monaco-menu-container,
+:host-context(.hc-light) .context-view.monaco-menu-container {
+	box-shadow: none;
+}
+
+.hc-black .monaco-menu .monaco-action-bar.vertical .action-item.focused,
+.hc-light .monaco-menu .monaco-action-bar.vertical .action-item.focused,
+:host-context(.hc-black) .monaco-menu .monaco-action-bar.vertical .action-item.focused,
+:host-context(.hc-light) .monaco-menu .monaco-action-bar.vertical .action-item.focused {
+	background: none;
+}
+
+/* Vertical Action Bar Styles */
+
+.monaco-menu .monaco-action-bar.vertical {
+	padding: 4px 0;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-menu-item {
+	height: 2em;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-label:not(.separator),
+.monaco-menu .monaco-action-bar.vertical .keybinding {
+	font-size: inherit;
+	padding: 0 2em;
+}
+
+.monaco-menu .monaco-action-bar.vertical .menu-item-check {
+	font-size: inherit;
+	width: 2em;
+}
+
+.monaco-menu .monaco-action-bar.vertical .action-label.separator {
+	font-size: inherit;
+	margin: 5px 0 !important;
+	padding: 0;
+	border-radius: 0;
+}
+
+.linux .monaco-menu .monaco-action-bar.vertical .action-label.separator,
+:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .action-label.separator {
+	margin-left: 0;
+	margin-right: 0;
+}
+
+.monaco-menu .monaco-action-bar.vertical .submenu-indicator {
+	font-size: 60%;
+	padding: 0 1.8em;
+}
+
+.linux .monaco-menu .monaco-action-bar.vertical .submenu-indicator,
+:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .submenu-indicator {
+	height: 100%;
+	mask-size: 10px 10px;
+	-webkit-mask-size: 10px 10px;
+}
+
+.monaco-menu .action-item {
+	cursor: default;
+}`;if(D){I+=`
+			/* Arrows */
+			.monaco-scrollable-element > .scrollbar > .scra {
+				cursor: pointer;
+				font-size: 11px !important;
+			}
+
+			.monaco-scrollable-element > .visible {
+				opacity: 1;
+
+				/* Background rule added for IE9 - to allow clicks on dom node */
+				background:rgba(0,0,0,0);
+
+				transition: opacity 100ms linear;
+			}
+			.monaco-scrollable-element > .invisible {
+				opacity: 0;
+				pointer-events: none;
+			}
+			.monaco-scrollable-element > .invisible.fade {
+				transition: opacity 800ms linear;
+			}
+
+			/* Scrollable Content Inset Shadow */
+			.monaco-scrollable-element > .shadow {
+				position: absolute;
+				display: none;
+			}
+			.monaco-scrollable-element > .shadow.top {
+				display: block;
+				top: 0;
+				left: 3px;
+				height: 3px;
+				width: 100%;
+			}
+			.monaco-scrollable-element > .shadow.left {
+				display: block;
+				top: 3px;
+				left: 0;
+				height: 100%;
+				width: 3px;
+			}
+			.monaco-scrollable-element > .shadow.top-left-corner {
+				display: block;
+				top: 0;
+				left: 0;
+				height: 3px;
+				width: 3px;
+			}
+		`;const T=w.scrollbarShadow;T&&(I+=`
+				.monaco-scrollable-element > .shadow.top {
+					box-shadow: ${T} 0 6px 6px -6px inset;
+				}
+
+				.monaco-scrollable-element > .shadow.left {
+					box-shadow: ${T} 6px 0 6px -6px inset;
+				}
+
+				.monaco-scrollable-element > .shadow.top.left {
+					box-shadow: ${T} 6px 6px 6px -6px inset;
+				}
+			`);const A=w.scrollbarSliderBackground;A&&(I+=`
+				.monaco-scrollable-element > .scrollbar > .slider {
+					background: ${A};
+				}
+			`);const P=w.scrollbarSliderHoverBackground;P&&(I+=`
+				.monaco-scrollable-element > .scrollbar > .slider:hover {
+					background: ${P};
+				}
+			`);const N=w.scrollbarSliderActiveBackground;N&&(I+=`
+				.monaco-scrollable-element > .scrollbar > .slider.active {
+					background: ${N};
+				}
+			`)}return I}}),define(se[600],oe([1,0,78,325,42,26,28,6,2,575,427]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ToggleMenuAction=e.ToolBar=void 0;class b extends _.Disposable{constructor(n,t,r={orientation:0}){super(),this.submenuActionViewItems=[],this.hasSecondaryActions=!1,this._onDidChangeDropdownVisibility=this._register(new p.EventMultiplexer),this.onDidChangeDropdownVisibility=this._onDidChangeDropdownVisibility.event,this.disposables=this._register(new _.DisposableStore),this.options=r,this.lookupKeybindings=typeof this.options.getKeyBinding=="function",this.toggleMenuAction=this._register(new a(()=>{var u;return(u=this.toggleMenuActionViewItem)===null||u===void 0?void 0:u.show()},r.toggleMenuTitle)),this.element=document.createElement("div"),this.element.className="monaco-toolbar",n.appendChild(this.element),this.actionBar=this._register(new L.ActionBar(this.element,{orientation:r.orientation,ariaLabel:r.ariaLabel,actionRunner:r.actionRunner,allowContextMenu:r.allowContextMenu,highlightToggledItems:r.highlightToggledItems,actionViewItemProvider:(u,f)=>{var c;if(u.id===a.ID)return this.toggleMenuActionViewItem=new k.DropdownMenuActionViewItem(u,u.menuActions,t,{actionViewItemProvider:this.options.actionViewItemProvider,actionRunner:this.actionRunner,keybindingProvider:this.options.getKeyBinding,classNames:S.ThemeIcon.asClassNameArray((c=r.moreIcon)!==null&&c!==void 0?c:E.Codicon.toolBarMore),anchorAlignmentProvider:this.options.anchorAlignmentProvider,menuAsChild:!!this.options.renderDropdownAsChildElement,skipTelemetry:this.options.skipTelemetry,isMenu:!0}),this.toggleMenuActionViewItem.setActionContext(this.actionBar.context),this.disposables.add(this._onDidChangeDropdownVisibility.add(this.toggleMenuActionViewItem.onDidChangeVisibility)),this.toggleMenuActionViewItem;if(r.actionViewItemProvider){const d=r.actionViewItemProvider(u,f);if(d)return d}if(u instanceof y.SubmenuAction){const d=new k.DropdownMenuActionViewItem(u,u.actions,t,{actionViewItemProvider:this.options.actionViewItemProvider,actionRunner:this.actionRunner,keybindingProvider:this.options.getKeyBinding,classNames:u.class,anchorAlignmentProvider:this.options.anchorAlignmentProvider,menuAsChild:!!this.options.renderDropdownAsChildElement,skipTelemetry:this.options.skipTelemetry});return d.setActionContext(this.actionBar.context),this.submenuActionViewItems.push(d),this.disposables.add(this._onDidChangeDropdownVisibility.add(d.onDidChangeVisibility)),d}}}))}set actionRunner(n){this.actionBar.actionRunner=n}get actionRunner(){return this.actionBar.actionRunner}getElement(){return this.element}getItemAction(n){return this.actionBar.getAction(n)}setActions(n,t){this.clear();const r=n?n.slice(0):[];this.hasSecondaryActions=!!(t&&t.length>0),this.hasSecondaryActions&&t&&(this.toggleMenuAction.menuActions=t.slice(0),r.push(this.toggleMenuAction)),r.forEach(u=>{this.actionBar.push(u,{icon:!0,label:!1,keybinding:this.getKeybindingLabel(u)})})}getKeybindingLabel(n){var t,r,u;const f=this.lookupKeybindings?(r=(t=this.options).getKeyBinding)===null||r===void 0?void 0:r.call(t,n):void 0;return(u=f?.getLabel())!==null&&u!==void 0?u:void 0}clear(){this.submenuActionViewItems=[],this.disposables.clear(),this.actionBar.clear()}dispose(){this.clear(),this.disposables.dispose(),super.dispose()}}e.ToolBar=b;class a extends y.Action{constructor(n,t){t=t||v.localize(0,null),super(a.ID,t,void 0,!0),this._menuActions=[],this.toggleDropdownMenu=n}async run(){this.toggleDropdownMenu()}get menuActions(){return this._menuActions}set menuActions(n){this._menuActions=n}}e.ToggleMenuAction=a,a.ID="toolbar.toggle.more"}),define(se[187],oe([1,0,7,84,46,78,232,231,228,119,159,220,143,42,13,14,26,28,53,6,71,2,145,20,576,428]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractTree=e.TreeFindMatchType=e.TreeFindMode=e.FuzzyToggle=e.ModeToggle=e.TreeRenderer=e.RenderIndentGuides=e.ComposedTreeDelegate=void 0;class m extends _.ElementsDragAndDropData{constructor(U){super(U.elements.map(G=>G.element)),this.data=U}}function C(X){return X instanceof _.ElementsDragAndDropData?new m(X):X}class w{constructor(U,G){this.modelProvider=U,this.dnd=G,this.autoExpandDisposable=l.Disposable.None,this.disposables=new l.DisposableStore}getDragURI(U){return this.dnd.getDragURI(U.element)}getDragLabel(U,G){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(U.map(z=>z.element),G)}onDragStart(U,G){var z,H;(H=(z=this.dnd).onDragStart)===null||H===void 0||H.call(z,C(U),G)}onDragOver(U,G,z,H,Y,j=!0){const Z=this.dnd.onDragOver(C(U),G&&G.element,z,H,Y),ee=this.autoExpandNode!==G;if(ee&&(this.autoExpandDisposable.dispose(),this.autoExpandNode=G),typeof G>"u")return Z;if(ee&&typeof Z!="boolean"&&Z.autoExpand&&(this.autoExpandDisposable=(0,r.disposableTimeout)(()=>{const ve=this.modelProvider(),Ce=ve.getNodeLocation(G);ve.isCollapsed(Ce)&&ve.setCollapsed(Ce,!1),this.autoExpandNode=void 0},500,this.disposables)),typeof Z=="boolean"||!Z.accept||typeof Z.bubble>"u"||Z.feedback){if(!j){const ve=typeof Z=="boolean"?Z:Z.accept,Ce=typeof Z=="boolean"?void 0:Z.effect;return{accept:ve,effect:Ce,feedback:[z]}}return Z}if(Z.bubble===1){const ve=this.modelProvider(),Ce=ve.getNodeLocation(G),Se=ve.getParentNodeLocation(Ce),_e=ve.getNode(Se),Ee=Se&&ve.getListIndex(Se);return this.onDragOver(U,_e,Ee,H,Y,!1)}const le=this.modelProvider(),ue=le.getNodeLocation(G),ce=le.getListIndex(ue),pe=le.getListRenderCount(ue);return{...Z,feedback:(0,t.range)(ce,ce+pe)}}drop(U,G,z,H,Y){this.autoExpandDisposable.dispose(),this.autoExpandNode=void 0,this.dnd.drop(C(U),G&&G.element,z,H,Y)}onDragEnd(U){var G,z;(z=(G=this.dnd).onDragEnd)===null||z===void 0||z.call(G,U)}dispose(){this.disposables.dispose(),this.dnd.dispose()}}function D(X,U){return U&&{...U,identityProvider:U.identityProvider&&{getId(G){return U.identityProvider.getId(G.element)}},dnd:U.dnd&&new w(X,U.dnd),multipleSelectionController:U.multipleSelectionController&&{isSelectionSingleChangeEvent(G){return U.multipleSelectionController.isSelectionSingleChangeEvent({...G,element:G.element})},isSelectionRangeChangeEvent(G){return U.multipleSelectionController.isSelectionRangeChangeEvent({...G,element:G.element})}},accessibilityProvider:U.accessibilityProvider&&{...U.accessibilityProvider,getSetSize(G){const z=X(),H=z.getNodeLocation(G),Y=z.getParentNodeLocation(H);return z.getNode(Y).visibleChildrenCount},getPosInSet(G){return G.visibleChildIndex+1},isChecked:U.accessibilityProvider&&U.accessibilityProvider.isChecked?G=>U.accessibilityProvider.isChecked(G.element):void 0,getRole:U.accessibilityProvider&&U.accessibilityProvider.getRole?G=>U.accessibilityProvider.getRole(G.element):()=>"treeitem",getAriaLabel(G){return U.accessibilityProvider.getAriaLabel(G.element)},getWidgetAriaLabel(){return U.accessibilityProvider.getWidgetAriaLabel()},getWidgetRole:U.accessibilityProvider&&U.accessibilityProvider.getWidgetRole?()=>U.accessibilityProvider.getWidgetRole():()=>"tree",getAriaLevel:U.accessibilityProvider&&U.accessibilityProvider.getAriaLevel?G=>U.accessibilityProvider.getAriaLevel(G.element):G=>G.depth,getActiveDescendantId:U.accessibilityProvider.getActiveDescendantId&&(G=>U.accessibilityProvider.getActiveDescendantId(G.element))},keyboardNavigationLabelProvider:U.keyboardNavigationLabelProvider&&{...U.keyboardNavigationLabelProvider,getKeyboardNavigationLabel(G){return U.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(G.element)}}}}class I{constructor(U){this.delegate=U}getHeight(U){return this.delegate.getHeight(U.element)}getTemplateId(U){return this.delegate.getTemplateId(U.element)}hasDynamicHeight(U){return!!this.delegate.hasDynamicHeight&&this.delegate.hasDynamicHeight(U.element)}setDynamicHeight(U,G){var z,H;(H=(z=this.delegate).setDynamicHeight)===null||H===void 0||H.call(z,U.element,G)}}e.ComposedTreeDelegate=I;var T;(function(X){X.None="none",X.OnHover="onHover",X.Always="always"})(T||(e.RenderIndentGuides=T={}));class A{get elements(){return this._elements}constructor(U,G=[]){this._elements=G,this.disposables=new l.DisposableStore,this.onDidChange=d.Event.forEach(U,z=>this._elements=z,this.disposables)}dispose(){this.disposables.dispose()}}class P{constructor(U,G,z,H,Y,j={}){var Z;this.renderer=U,this.modelProvider=G,this.activeNodes=H,this.renderedIndentGuides=Y,this.renderedElements=new Map,this.renderedNodes=new Map,this.indent=P.DefaultIndent,this.hideTwistiesOfChildlessElements=!1,this.shouldRenderIndentGuides=!1,this.activeIndentNodes=new Set,this.indentGuidesDisposable=l.Disposable.None,this.disposables=new l.DisposableStore,this.templateId=U.templateId,this.updateOptions(j),d.Event.map(z,ee=>ee.node)(this.onDidChangeNodeTwistieState,this,this.disposables),(Z=U.onDidChangeTwistieState)===null||Z===void 0||Z.call(U,this.onDidChangeTwistieState,this,this.disposables)}updateOptions(U={}){if(typeof U.indent<"u"){const G=(0,o.clamp)(U.indent,0,40);if(G!==this.indent){this.indent=G;for(const[z,H]of this.renderedNodes)this.renderTreeElement(z,H)}}if(typeof U.renderIndentGuides<"u"){const G=U.renderIndentGuides!==T.None;if(G!==this.shouldRenderIndentGuides){this.shouldRenderIndentGuides=G;for(const[z,H]of this.renderedNodes)this._renderIndentGuides(z,H);if(this.indentGuidesDisposable.dispose(),G){const z=new l.DisposableStore;this.activeNodes.onDidChange(this._onDidChangeActiveNodes,this,z),this.indentGuidesDisposable=z,this._onDidChangeActiveNodes(this.activeNodes.elements)}}}typeof U.hideTwistiesOfChildlessElements<"u"&&(this.hideTwistiesOfChildlessElements=U.hideTwistiesOfChildlessElements)}renderTemplate(U){const G=(0,L.append)(U,(0,L.$)(".monaco-tl-row")),z=(0,L.append)(G,(0,L.$)(".monaco-tl-indent")),H=(0,L.append)(G,(0,L.$)(".monaco-tl-twistie")),Y=(0,L.append)(G,(0,L.$)(".monaco-tl-contents")),j=this.renderer.renderTemplate(Y);return{container:U,indent:z,twistie:H,indentGuidesDisposable:l.Disposable.None,templateData:j}}renderElement(U,G,z,H){this.renderedNodes.set(U,z),this.renderedElements.set(U.element,U),this.renderTreeElement(U,z),this.renderer.renderElement(U,G,z.templateData,H)}disposeElement(U,G,z,H){var Y,j;z.indentGuidesDisposable.dispose(),(j=(Y=this.renderer).disposeElement)===null||j===void 0||j.call(Y,U,G,z.templateData,H),typeof H=="number"&&(this.renderedNodes.delete(U),this.renderedElements.delete(U.element))}disposeTemplate(U){this.renderer.disposeTemplate(U.templateData)}onDidChangeTwistieState(U){const G=this.renderedElements.get(U);G&&this.onDidChangeNodeTwistieState(G)}onDidChangeNodeTwistieState(U){const G=this.renderedNodes.get(U);G&&(this._onDidChangeActiveNodes(this.activeNodes.elements),this.renderTreeElement(U,G))}renderTreeElement(U,G){const z=P.DefaultIndent+(U.depth-1)*this.indent;G.twistie.style.paddingLeft=`${z}px`,G.indent.style.width=`${z+this.indent-16}px`,U.collapsible?G.container.setAttribute("aria-expanded",String(!U.collapsed)):G.container.removeAttribute("aria-expanded"),G.twistie.classList.remove(...f.ThemeIcon.asClassNameArray(u.Codicon.treeItemExpanded));let H=!1;this.renderer.renderTwistie&&(H=this.renderer.renderTwistie(U.element,G.twistie)),U.collapsible&&(!this.hideTwistiesOfChildlessElements||U.visibleChildrenCount>0)?(H||G.twistie.classList.add(...f.ThemeIcon.asClassNameArray(u.Codicon.treeItemExpanded)),G.twistie.classList.add("collapsible"),G.twistie.classList.toggle("collapsed",U.collapsed)):G.twistie.classList.remove("collapsible","collapsed"),this._renderIndentGuides(U,G)}_renderIndentGuides(U,G){if((0,L.clearNode)(G.indent),G.indentGuidesDisposable.dispose(),!this.shouldRenderIndentGuides)return;const z=new l.DisposableStore,H=this.modelProvider();for(;;){const Y=H.getNodeLocation(U),j=H.getParentNodeLocation(Y);if(!j)break;const Z=H.getNode(j),ee=(0,L.$)(".indent-guide",{style:`width: ${this.indent}px`});this.activeIndentNodes.has(Z)&&ee.classList.add("active"),G.indent.childElementCount===0?G.indent.appendChild(ee):G.indent.insertBefore(ee,G.indent.firstElementChild),this.renderedIndentGuides.add(Z,ee),z.add((0,l.toDisposable)(()=>this.renderedIndentGuides.delete(Z,ee))),U=Z}G.indentGuidesDisposable=z}_onDidChangeActiveNodes(U){if(!this.shouldRenderIndentGuides)return;const G=new Set,z=this.modelProvider();U.forEach(H=>{const Y=z.getNodeLocation(H);try{const j=z.getParentNodeLocation(Y);H.collapsible&&H.children.length>0&&!H.collapsed?G.add(H):j&&G.add(z.getNode(j))}catch{}}),this.activeIndentNodes.forEach(H=>{G.has(H)||this.renderedIndentGuides.forEach(H,Y=>Y.classList.remove("active"))}),G.forEach(H=>{this.activeIndentNodes.has(H)||this.renderedIndentGuides.forEach(H,Y=>Y.classList.add("active"))}),this.activeIndentNodes=G}dispose(){this.renderedNodes.clear(),this.renderedElements.clear(),this.indentGuidesDisposable.dispose(),(0,l.dispose)(this.disposables)}}e.TreeRenderer=P,P.DefaultIndent=8;class N{get totalCount(){return this._totalCount}get matchCount(){return this._matchCount}constructor(U,G,z){this.tree=U,this.keyboardNavigationLabelProvider=G,this._filter=z,this._totalCount=0,this._matchCount=0,this._pattern="",this._lowercasePattern="",this.disposables=new l.DisposableStore,U.onWillRefilter(this.reset,this,this.disposables)}filter(U,G){let z=1;if(this._filter){const j=this._filter.filter(U,G);if(typeof j=="boolean"?z=j?1:0:(0,a.isFilterResult)(j)?z=(0,a.getVisibleState)(j.visibility):z=j,z===0)return!1}if(this._totalCount++,!this._pattern)return this._matchCount++,{data:s.FuzzyScore.Default,visibility:z};const H=this.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(U),Y=Array.isArray(H)?H:[H];for(const j of Y){const Z=j&&j.toString();if(typeof Z>"u")return{data:s.FuzzyScore.Default,visibility:z};let ee;if(this.tree.findMatchType===B.Contiguous){const le=Z.toLowerCase().indexOf(this._lowercasePattern);if(le>-1){ee=[Number.MAX_SAFE_INTEGER,0];for(let ue=this._lowercasePattern.length;ue>0;ue--)ee.push(le+ue-1)}}else ee=(0,s.fuzzyScore)(this._pattern,this._lowercasePattern,0,Z,Z.toLowerCase(),0,{firstMatchCanBeWeak:!0,boostFullMatch:!0});if(ee)return this._matchCount++,Y.length===1?{data:ee,visibility:z}:{data:{label:Z,score:ee},visibility:z}}return this.tree.findMode===O.Filter?typeof this.tree.options.defaultFindVisibility=="number"?this.tree.options.defaultFindVisibility:this.tree.options.defaultFindVisibility?this.tree.options.defaultFindVisibility(U):2:{data:s.FuzzyScore.Default,visibility:z}}reset(){this._totalCount=0,this._matchCount=0}dispose(){(0,l.dispose)(this.disposables)}}class M extends b.Toggle{constructor(U){var G;super({icon:u.Codicon.listFilter,title:(0,h.localize)(0,null),isChecked:(G=U.isChecked)!==null&&G!==void 0?G:!1,inputActiveOptionBorder:U.inputActiveOptionBorder,inputActiveOptionForeground:U.inputActiveOptionForeground,inputActiveOptionBackground:U.inputActiveOptionBackground})}}e.ModeToggle=M;class R extends b.Toggle{constructor(U){var G;super({icon:u.Codicon.searchFuzzy,title:(0,h.localize)(1,null),isChecked:(G=U.isChecked)!==null&&G!==void 0?G:!1,inputActiveOptionBorder:U.inputActiveOptionBorder,inputActiveOptionForeground:U.inputActiveOptionForeground,inputActiveOptionBackground:U.inputActiveOptionBackground})}}e.FuzzyToggle=R;const x={inputBoxStyles:p.unthemedInboxStyles,toggleStyles:b.unthemedToggleStyles,listFilterWidgetBackground:void 0,listFilterWidgetNoMatchesOutline:void 0,listFilterWidgetOutline:void 0,listFilterWidgetShadow:void 0};var O;(function(X){X[X.Highlight=0]="Highlight",X[X.Filter=1]="Filter"})(O||(e.TreeFindMode=O={}));var B;(function(X){X[X.Fuzzy=0]="Fuzzy",X[X.Contiguous=1]="Contiguous"})(B||(e.TreeFindMatchType=B={}));class W extends l.Disposable{set mode(U){this.modeToggle.checked=U===O.Filter,this.findInput.inputBox.setPlaceHolder(U===O.Filter?(0,h.localize)(2,null):(0,h.localize)(3,null))}set matchType(U){this.matchTypeToggle.checked=U===B.Fuzzy}constructor(U,G,z,H,Y,j){var Z;super(),this.tree=G,this.elements=(0,L.h)(".monaco-tree-type-filter",[(0,L.h)(".monaco-tree-type-filter-grab.codicon.codicon-debug-gripper@grab",{tabIndex:0}),(0,L.h)(".monaco-tree-type-filter-input@findInput"),(0,L.h)(".monaco-tree-type-filter-actionbar@actionbar")]),this.width=0,this.right=0,this.top=0,this._onDidDisable=new d.Emitter,U.appendChild(this.elements.root),this._register((0,l.toDisposable)(()=>U.removeChild(this.elements.root)));const ee=(Z=j?.styles)!==null&&Z!==void 0?Z:x;ee.listFilterWidgetBackground&&(this.elements.root.style.backgroundColor=ee.listFilterWidgetBackground),ee.listFilterWidgetShadow&&(this.elements.root.style.boxShadow=`0 0 8px 2px ${ee.listFilterWidgetShadow}`),this.modeToggle=this._register(new M({...ee.toggleStyles,isChecked:H===O.Filter})),this.matchTypeToggle=this._register(new R({...ee.toggleStyles,isChecked:Y===B.Fuzzy})),this.onDidChangeMode=d.Event.map(this.modeToggle.onChange,()=>this.modeToggle.checked?O.Filter:O.Highlight,this._store),this.onDidChangeMatchType=d.Event.map(this.matchTypeToggle.onChange,()=>this.matchTypeToggle.checked?B.Fuzzy:B.Contiguous,this._store),this.findInput=this._register(new S.FindInput(this.elements.findInput,z,{label:(0,h.localize)(4,null),additionalToggles:[this.modeToggle,this.matchTypeToggle],showCommonFindToggles:!1,inputBoxStyles:ee.inputBoxStyles,toggleStyles:ee.toggleStyles,history:j?.history})),this.actionbar=this._register(new E.ActionBar(this.elements.actionbar)),this.mode=H;const le=this._register(new k.DomEmitter(this.findInput.inputBox.inputElement,"keydown")),ue=d.Event.chain(le.event,Ce=>Ce.map(Se=>new y.StandardKeyboardEvent(Se)));this._register(ue(Ce=>{if(Ce.equals(3)){Ce.preventDefault(),Ce.stopPropagation(),this.findInput.inputBox.addToHistory(),this.tree.domFocus();return}if(Ce.equals(18)){Ce.preventDefault(),Ce.stopPropagation(),this.findInput.inputBox.isAtLastInHistory()||this.findInput.inputBox.isNowhereInHistory()?(this.findInput.inputBox.addToHistory(),this.tree.domFocus()):this.findInput.inputBox.showNextValue();return}if(Ce.equals(16)){Ce.preventDefault(),Ce.stopPropagation(),this.findInput.inputBox.showPreviousValue();return}}));const ce=this._register(new n.Action("close",(0,h.localize)(5,null),"codicon codicon-close",!0,()=>this.dispose()));this.actionbar.push(ce,{icon:!0,label:!1});const pe=this._register(new k.DomEmitter(this.elements.grab,"mousedown"));this._register(pe.event(Ce=>{const Se=new l.DisposableStore,_e=Se.add(new k.DomEmitter((0,L.getWindow)(Ce),"mousemove")),Ee=Se.add(new k.DomEmitter((0,L.getWindow)(Ce),"mouseup")),Ae=this.right,xe=Ce.pageX,Be=this.top,De=Ce.pageY;this.elements.grab.classList.add("grabbing");const Ie=this.elements.root.style.transition;this.elements.root.style.transition="unset";const fe=be=>{const Ne=be.pageX-xe;this.right=Ae-Ne;const Pe=be.pageY-De;this.top=Be+Pe,this.layout()};Se.add(_e.event(fe)),Se.add(Ee.event(be=>{fe(be),this.elements.grab.classList.remove("grabbing"),this.elements.root.style.transition=Ie,Se.dispose()}))}));const ve=d.Event.chain(this._register(new k.DomEmitter(this.elements.grab,"keydown")).event,Ce=>Ce.map(Se=>new y.StandardKeyboardEvent(Se)));this._register(ve(Ce=>{let Se,_e;if(Ce.keyCode===15?Se=Number.POSITIVE_INFINITY:Ce.keyCode===17?Se=0:Ce.keyCode===10&&(Se=this.right===0?Number.POSITIVE_INFINITY:0),Ce.keyCode===16?_e=0:Ce.keyCode===18&&(_e=Number.POSITIVE_INFINITY),Se!==void 0&&(Ce.preventDefault(),Ce.stopPropagation(),this.right=Se,this.layout()),_e!==void 0){Ce.preventDefault(),Ce.stopPropagation(),this.top=_e;const Ee=this.elements.root.style.transition;this.elements.root.style.transition="unset",this.layout(),setTimeout(()=>{this.elements.root.style.transition=Ee},0)}})),this.onDidChangeValue=this.findInput.onDidChange}layout(U=this.width){this.width=U,this.right=(0,o.clamp)(this.right,0,Math.max(0,U-212)),this.elements.root.style.right=`${this.right}px`,this.top=(0,o.clamp)(this.top,0,24),this.elements.root.style.top=`${this.top}px`}showMessage(U){this.findInput.showMessage(U)}clearMessage(){this.findInput.clearMessage()}async dispose(){this._onDidDisable.fire(),this.elements.root.classList.add("disabled"),await(0,r.timeout)(300),super.dispose()}}class V{get pattern(){return this._pattern}get mode(){return this._mode}set mode(U){U!==this._mode&&(this._mode=U,this.widget&&(this.widget.mode=this._mode),this.tree.refilter(),this.render(),this._onDidChangeMode.fire(U))}get matchType(){return this._matchType}set matchType(U){U!==this._matchType&&(this._matchType=U,this.widget&&(this.widget.matchType=this._matchType),this.tree.refilter(),this.render(),this._onDidChangeMatchType.fire(U))}constructor(U,G,z,H,Y,j={}){var Z,ee;this.tree=U,this.view=z,this.filter=H,this.contextViewProvider=Y,this.options=j,this._pattern="",this.width=0,this._onDidChangeMode=new d.Emitter,this.onDidChangeMode=this._onDidChangeMode.event,this._onDidChangeMatchType=new d.Emitter,this.onDidChangeMatchType=this._onDidChangeMatchType.event,this._onDidChangePattern=new d.Emitter,this._onDidChangeOpenState=new d.Emitter,this.onDidChangeOpenState=this._onDidChangeOpenState.event,this.enabledDisposables=new l.DisposableStore,this.disposables=new l.DisposableStore,this._mode=(Z=U.options.defaultFindMode)!==null&&Z!==void 0?Z:O.Highlight,this._matchType=(ee=U.options.defaultFindMatchType)!==null&&ee!==void 0?ee:B.Fuzzy,G.onDidSplice(this.onDidSpliceModel,this,this.disposables)}updateOptions(U={}){U.defaultFindMode!==void 0&&(this.mode=U.defaultFindMode),U.defaultFindMatchType!==void 0&&(this.matchType=U.defaultFindMatchType)}onDidSpliceModel(){!this.widget||this.pattern.length===0||(this.tree.refilter(),this.render())}render(){var U,G,z,H;const Y=this.filter.totalCount>0&&this.filter.matchCount===0;this.pattern&&Y?!((U=this.tree.options.showNotFoundMessage)!==null&&U!==void 0)||U?(G=this.widget)===null||G===void 0||G.showMessage({type:2,content:(0,h.localize)(6,null)}):(z=this.widget)===null||z===void 0||z.showMessage({type:2}):(H=this.widget)===null||H===void 0||H.clearMessage()}shouldAllowFocus(U){return!this.widget||!this.pattern||this.filter.totalCount>0&&this.filter.matchCount<=1?!0:!s.FuzzyScore.isDefault(U.filterData)}layout(U){var G;this.width=U,(G=this.widget)===null||G===void 0||G.layout(U)}dispose(){this._history=void 0,this._onDidChangePattern.dispose(),this.enabledDisposables.dispose(),this.disposables.dispose()}}function K(X,U){return X.position===U.position&&F(X,U)}function F(X,U){return X.node.element===U.node.element&&X.startIndex===U.startIndex&&X.height===U.height&&X.endIndex===U.endIndex}class q{constructor(U=[]){this.stickyNodes=U}get count(){return this.stickyNodes.length}equal(U){return(0,t.equals)(this.stickyNodes,U.stickyNodes,K)}lastNodePartiallyVisible(){if(this.count===0)return!1;const U=this.stickyNodes[this.count-1];if(this.count===1)return U.position!==0;const G=this.stickyNodes[this.count-2];return G.position+G.height!==U.position}animationStateChanged(U){if(!(0,t.equals)(this.stickyNodes,U.stickyNodes,F)||this.count===0)return!1;const G=this.stickyNodes[this.count-1],z=U.stickyNodes[U.count-1];return G.position!==z.position}}class ie{constrainStickyScrollNodes(U,G,z){for(let H=0;H<U.length;H++){const Y=U[H];if(Y.position+Y.height>z||H>=G)return U.slice(0,H)}return U}}class ae extends l.Disposable{constructor(U,G,z,H,Y,j={}){var Z;super(),this.tree=U,this.model=G,this.view=z,this.treeDelegate=Y,this.maxWidgetViewRatio=.4;const ee=this.validateStickySettings(j);this.stickyScrollMaxItemCount=ee.stickyScrollMaxItemCount,this.stickyScrollDelegate=(Z=j.stickyScrollDelegate)!==null&&Z!==void 0?Z:new ie,this._widget=this._register(new ne(z.getScrollableElement(),z,U,H,Y,j.accessibilityProvider)),this.onDidChangeHasFocus=this._widget.onDidChangeHasFocus,this.onContextMenu=this._widget.onContextMenu,this._register(z.onDidScroll(()=>this.update())),this._register(z.onDidChangeContentHeight(()=>this.update())),this._register(U.onDidChangeCollapseState(()=>this.update())),this.update()}getNodeAtHeight(U){let G;if(U===0?G=this.view.firstVisibleIndex:G=this.view.indexAt(U+this.view.scrollTop),!(G<0||G>=this.view.length))return this.view.element(G)}update(){const U=this.getNodeAtHeight(0);if(!U||this.tree.scrollTop===0){this._widget.setState(void 0);return}const G=this.findStickyState(U);this._widget.setState(G)}findStickyState(U){const G=[];let z=U,H=0,Y=this.getNextStickyNode(z,void 0,H);for(;Y&&(G.push(Y),H+=Y.height,!(G.length<=this.stickyScrollMaxItemCount&&(z=this.getNextVisibleNode(Y),!z)));)Y=this.getNextStickyNode(z,Y.node,H);const j=this.constrainStickyNodes(G);return j.length?new q(j):void 0}getNextVisibleNode(U){return this.getNodeAtHeight(U.position+U.height)}getNextStickyNode(U,G,z){const H=this.getAncestorUnderPrevious(U,G);if(H&&!(H===U&&(!this.nodeIsUncollapsedParent(U)||this.nodeTopAlignsWithStickyNodesBottom(U,z))))return this.createStickyScrollNode(H,z)}nodeTopAlignsWithStickyNodesBottom(U,G){const z=this.getNodeIndex(U),H=this.view.getElementTop(z),Y=G;return this.view.scrollTop===H-Y}createStickyScrollNode(U,G){const z=this.treeDelegate.getHeight(U),{startIndex:H,endIndex:Y}=this.getNodeRange(U),j=this.calculateStickyNodePosition(Y,G,z);return{node:U,position:j,height:z,startIndex:H,endIndex:Y}}getAncestorUnderPrevious(U,G=void 0){let z=U,H=this.getParentNode(z);for(;H;){if(H===G)return z;z=H,H=this.getParentNode(z)}if(G===void 0)return z}calculateStickyNodePosition(U,G,z){let H=this.view.getRelativeTop(U);if(H===null&&this.view.firstVisibleIndex===U&&U+1<this.view.length){const le=this.treeDelegate.getHeight(this.view.element(U)),ue=this.view.getRelativeTop(U+1);H=ue?ue-le/this.view.renderHeight:null}if(H===null)return G;const Y=this.view.element(U),j=this.treeDelegate.getHeight(Y),ee=H*this.view.renderHeight+j;return G+z>ee&&G<=ee?ee-z:G}constrainStickyNodes(U){if(U.length===0)return[];const G=this.view.renderHeight*this.maxWidgetViewRatio,z=U[U.length-1];if(U.length<=this.stickyScrollMaxItemCount&&z.position+z.height<=G)return U;const H=this.stickyScrollDelegate.constrainStickyScrollNodes(U,this.stickyScrollMaxItemCount,G);if(!H.length)return[];const Y=H[H.length-1];if(H.length>this.stickyScrollMaxItemCount||Y.position+Y.height>G)throw new Error("stickyScrollDelegate violates constraints");return H}getParentNode(U){const G=this.model.getNodeLocation(U),z=this.model.getParentNodeLocation(G);return z?this.model.getNode(z):void 0}nodeIsUncollapsedParent(U){const G=this.model.getNodeLocation(U);return this.model.getListRenderCount(G)>1}getNodeIndex(U){const G=this.model.getNodeLocation(U);return this.model.getListIndex(G)}getNodeRange(U){const G=this.model.getNodeLocation(U),z=this.model.getListIndex(G);if(z<0)throw new Error("Node not found in tree");const H=this.model.getListRenderCount(G),Y=z+H-1;return{startIndex:z,endIndex:Y}}nodePositionTopBelowWidget(U){const G=[];let z=this.getParentNode(U);for(;z;)G.push(z),z=this.getParentNode(z);let H=0;for(let Y=0;Y<G.length&&Y<this.stickyScrollMaxItemCount;Y++)H+=this.treeDelegate.getHeight(G[Y]);return H}domFocus(){this._widget.domFocus()}focusedLast(){return this._widget.focusedLast()}updateOptions(U={}){if(!U.stickyScrollMaxItemCount)return;const G=this.validateStickySettings(U);this.stickyScrollMaxItemCount!==G.stickyScrollMaxItemCount&&(this.stickyScrollMaxItemCount=G.stickyScrollMaxItemCount,this.update())}validateStickySettings(U){let G=7;return typeof U.stickyScrollMaxItemCount=="number"&&(G=Math.max(U.stickyScrollMaxItemCount,1)),{stickyScrollMaxItemCount:G}}}class ne{constructor(U,G,z,H,Y,j){this.view=G,this.tree=z,this.treeRenderers=H,this.treeDelegate=Y,this.accessibilityProvider=j,this._previousElements=[],this._previousStateDisposables=new l.DisposableStore,this._rootDomNode=(0,L.$)(".monaco-tree-sticky-container.empty"),U.appendChild(this._rootDomNode);const Z=(0,L.$)(".monaco-tree-sticky-container-shadow");this._rootDomNode.appendChild(Z),this.stickyScrollFocus=new $(this._rootDomNode,G),this.onDidChangeHasFocus=this.stickyScrollFocus.onDidChangeHasFocus,this.onContextMenu=this.stickyScrollFocus.onContextMenu}setState(U){const G=!!this._previousState&&this._previousState.count>0,z=!!U&&U.count>0;if(!G&&!z||G&&z&&this._previousState.equal(U))return;if(G!==z&&this.setVisible(z),!z){this._previousState=void 0,this._previousElements=[],this._previousStateDisposables.clear();return}const H=U.stickyNodes[U.count-1];if(this._previousState&&U.animationStateChanged(this._previousState))this._previousElements[this._previousState.count-1].style.top=`${H.position}px`;else{this._previousStateDisposables.clear();const Y=Array(U.count);for(let j=U.count-1;j>=0;j--){const Z=U.stickyNodes[j],{element:ee,disposable:le}=this.createElement(Z,j,U.count);Y[j]=ee,this._rootDomNode.appendChild(ee),this._previousStateDisposables.add(le)}this.stickyScrollFocus.updateElements(Y,U),this._previousElements=Y}this._previousState=U,this._rootDomNode.style.height=`${H.position+H.height}px`}createElement(U,G,z){const H=U.startIndex,Y=document.createElement("div");Y.style.top=`${U.position}px`,Y.style.height=`${U.height}px`,Y.style.lineHeight=`${U.height}px`,Y.classList.add("monaco-tree-sticky-row"),Y.classList.add("monaco-list-row"),Y.setAttribute("data-index",`${H}`),Y.setAttribute("data-parity",H%2===0?"even":"odd"),Y.setAttribute("id",this.view.getElementID(H)),this.setAccessibilityAttributes(Y,U.node.element,G,z);const j=this.treeDelegate.getTemplateId(U.node),Z=this.treeRenderers.find(ce=>ce.templateId===j);if(!Z)throw new Error(`No renderer found for template id ${j}`);let ee=U.node;ee===this.tree.getNode(this.tree.getNodeLocation(U.node))&&(ee=new Proxy(U.node,{}));const le=Z.renderTemplate(Y);Z.renderElement(ee,U.startIndex,le,U.height);const ue=(0,l.toDisposable)(()=>{Z.disposeElement(ee,U.startIndex,le,U.height),Z.disposeTemplate(le),Y.remove()});return{element:Y,disposable:ue}}setAccessibilityAttributes(U,G,z,H){var Y;if(!this.accessibilityProvider)return;this.accessibilityProvider.getSetSize&&U.setAttribute("aria-setsize",String(this.accessibilityProvider.getSetSize(G,z,H))),this.accessibilityProvider.getPosInSet&&U.setAttribute("aria-posinset",String(this.accessibilityProvider.getPosInSet(G,z))),this.accessibilityProvider.getRole&&U.setAttribute("role",(Y=this.accessibilityProvider.getRole(G))!==null&&Y!==void 0?Y:"treeitem");const j=this.accessibilityProvider.getAriaLabel(G);j&&U.setAttribute("aria-label",j);const Z=this.accessibilityProvider.getAriaLevel&&this.accessibilityProvider.getAriaLevel(G);typeof Z=="number"&&U.setAttribute("aria-level",`${Z}`),U.setAttribute("aria-selected",String(!1))}setVisible(U){this._rootDomNode.classList.toggle("empty",!U),U||this.stickyScrollFocus.updateElements([],void 0)}domFocus(){this.stickyScrollFocus.domFocus()}focusedLast(){return this.stickyScrollFocus.focusedLast()}dispose(){this.stickyScrollFocus.dispose(),this._previousStateDisposables.dispose(),this._rootDomNode.remove()}}class $ extends l.Disposable{get domHasFocus(){return this._domHasFocus}set domHasFocus(U){U!==this._domHasFocus&&(this._onDidChangeHasFocus.fire(U),this._domHasFocus=U)}constructor(U,G){super(),this.container=U,this.view=G,this.focusedIndex=-1,this.elements=[],this._onDidChangeHasFocus=new d.Emitter,this.onDidChangeHasFocus=this._onDidChangeHasFocus.event,this._onContextMenu=new d.Emitter,this.onContextMenu=this._onContextMenu.event,this._domHasFocus=!1,this.container.addEventListener("focus",()=>this.onFocus()),this.container.addEventListener("blur",()=>this.onBlur()),this._register(this.view.onDidFocus(()=>this.toggleStickyScrollFocused(!1))),this._register(this.view.onKeyDown(z=>this.onKeyDown(z))),this._register(this.view.onMouseDown(z=>this.onMouseDown(z))),this._register(this.view.onContextMenu(z=>this.handleContextMenu(z)))}handleContextMenu(U){const G=U.browserEvent.target;if(!(0,v.isStickyScrollContainer)(G)&&!(0,v.isStickyScrollElement)(G)){this.focusedLast()&&this.view.domFocus();return}if(!(0,L.isKeyboardEvent)(U.browserEvent)){if(!this.state)throw new Error("Context menu should not be triggered when state is undefined");const j=this.state.stickyNodes.findIndex(Z=>{var ee;return Z.node.element===((ee=U.element)===null||ee===void 0?void 0:ee.element)});if(j===-1)throw new Error("Context menu should not be triggered when element is not in sticky scroll widget");this.container.focus(),this.setFocus(j);return}if(!this.state||this.focusedIndex<0)throw new Error("Context menu key should not be triggered when focus is not in sticky scroll widget");const H=this.state.stickyNodes[this.focusedIndex].node.element,Y=this.elements[this.focusedIndex];this._onContextMenu.fire({element:H,anchor:Y,browserEvent:U.browserEvent,isStickyScroll:!0})}onKeyDown(U){if(this.domHasFocus&&this.state){if(U.key==="ArrowUp")this.setFocusedElement(Math.max(0,this.focusedIndex-1)),U.preventDefault(),U.stopPropagation();else if(U.key==="ArrowDown"||U.key==="ArrowRight"){if(this.focusedIndex>=this.state.count-1){const G=this.state.stickyNodes[this.state.count-1].startIndex+1;this.view.domFocus(),this.view.setFocus([G]),this.scrollNodeUnderWidget(G,this.state)}else this.setFocusedElement(this.focusedIndex+1);U.preventDefault(),U.stopPropagation()}}}onMouseDown(U){const G=U.browserEvent.target;!(0,v.isStickyScrollContainer)(G)&&!(0,v.isStickyScrollElement)(G)||(U.browserEvent.preventDefault(),U.browserEvent.stopPropagation())}updateElements(U,G){if(G&&G.count===0)throw new Error("Sticky scroll state must be undefined when there are no sticky nodes");if(G&&G.count!==U.length)throw new Error("Sticky scroll focus received illigel state");const z=this.focusedIndex;if(this.removeFocus(),this.elements=U,this.state=G,G){const H=(0,o.clamp)(z,0,G.count-1);this.setFocus(H)}else this.domHasFocus&&this.view.domFocus();this.container.tabIndex=G?0:-1}setFocusedElement(U){const G=this.state;if(!G)throw new Error("Cannot set focus when state is undefined");if(this.setFocus(U),!(U<G.count-1)&&G.lastNodePartiallyVisible()){const z=G.stickyNodes[U];this.scrollNodeUnderWidget(z.endIndex+1,G)}}scrollNodeUnderWidget(U,G){const z=G.stickyNodes[G.count-1],H=G.count>1?G.stickyNodes[G.count-2]:void 0,Y=this.view.getElementTop(U),j=H?H.position+H.height+z.height:z.height;this.view.scrollTop=Y-j}domFocus(){if(!this.state)throw new Error("Cannot focus when state is undefined");this.container.focus()}focusedLast(){return this.state?this.view.getHTMLElement().classList.contains("sticky-scroll-focused"):!1}removeFocus(){this.focusedIndex!==-1&&(this.toggleElementFocus(this.elements[this.focusedIndex],!1),this.focusedIndex=-1)}setFocus(U){if(0>U)throw new Error("addFocus() can not remove focus");if(!this.state&&U>=0)throw new Error("Cannot set focus index when state is undefined");if(this.state&&U>=this.state.count)throw new Error("Cannot set focus index to an index that does not exist");const G=this.focusedIndex;G>=0&&this.toggleElementFocus(this.elements[G],!1),U>=0&&this.toggleElementFocus(this.elements[U],!0),this.focusedIndex=U}toggleElementFocus(U,G){U.classList.toggle("focused",G)}toggleStickyScrollFocused(U){this.view.getHTMLElement().classList.toggle("sticky-scroll-focused",U)}onFocus(){if(!this.state||this.elements.length===0)throw new Error("Cannot focus when state is undefined or elements are empty");this.domHasFocus=!0,this.toggleStickyScrollFocused(!0),this.focusedIndex===-1&&this.setFocus(0)}onBlur(){this.domHasFocus=!1}dispose(){this.toggleStickyScrollFocused(!1),this._onDidChangeHasFocus.fire(!1),super.dispose()}}function J(X){let U=i.TreeMouseEventTarget.Unknown;return(0,L.hasParentWithClass)(X.browserEvent.target,"monaco-tl-twistie","monaco-tl-row")?U=i.TreeMouseEventTarget.Twistie:(0,L.hasParentWithClass)(X.browserEvent.target,"monaco-tl-contents","monaco-tl-row")?U=i.TreeMouseEventTarget.Element:(0,L.hasParentWithClass)(X.browserEvent.target,"monaco-tree-type-filter","monaco-list")&&(U=i.TreeMouseEventTarget.Filter),{browserEvent:X.browserEvent,element:X.element?X.element.element:null,target:U}}function Q(X,U){U(X),X.children.forEach(G=>Q(G,U))}class re{get nodeSet(){return this._nodeSet||(this._nodeSet=this.createNodeSet()),this._nodeSet}constructor(U,G){this.getFirstViewElementWithTrait=U,this.identityProvider=G,this.nodes=[],this._onDidChange=new d.Emitter,this.onDidChange=this._onDidChange.event}set(U,G){!G?.__forceEvent&&(0,t.equals)(this.nodes,U)||this._set(U,!1,G)}_set(U,G,z){if(this.nodes=[...U],this.elements=void 0,this._nodeSet=void 0,!G){const H=this;this._onDidChange.fire({get elements(){return H.get()},browserEvent:z})}}get(){return this.elements||(this.elements=this.nodes.map(U=>U.element)),[...this.elements]}getNodes(){return this.nodes}has(U){return this.nodeSet.has(U)}onDidModelSplice({insertedNodes:U,deletedNodes:G}){if(!this.identityProvider){const ee=this.createNodeSet(),le=ue=>ee.delete(ue);G.forEach(ue=>Q(ue,le)),this.set([...ee.values()]);return}const z=new Set,H=ee=>z.add(this.identityProvider.getId(ee.element).toString());G.forEach(ee=>Q(ee,H));const Y=new Map,j=ee=>Y.set(this.identityProvider.getId(ee.element).toString(),ee);U.forEach(ee=>Q(ee,j));const Z=[];for(const ee of this.nodes){const le=this.identityProvider.getId(ee.element).toString();if(!z.has(le))Z.push(ee);else{const ce=Y.get(le);ce&&ce.visible&&Z.push(ce)}}if(this.nodes.length>0&&Z.length===0){const ee=this.getFirstViewElementWithTrait();ee&&Z.push(ee)}this._set(Z,!0)}createNodeSet(){const U=new Set;for(const G of this.nodes)U.add(G);return U}}class de extends v.MouseController{constructor(U,G,z){super(U),this.tree=G,this.stickyScrollProvider=z}onViewPointer(U){if((0,v.isButton)(U.browserEvent.target)||(0,v.isInputElement)(U.browserEvent.target)||(0,v.isMonacoEditor)(U.browserEvent.target)||U.browserEvent.isHandledByList)return;const G=U.element;if(!G)return super.onViewPointer(U);if(this.isSelectionRangeChangeEvent(U)||this.isSelectionSingleChangeEvent(U))return super.onViewPointer(U);const z=U.browserEvent.target,H=z.classList.contains("monaco-tl-twistie")||z.classList.contains("monaco-icon-label")&&z.classList.contains("folder-icon")&&U.browserEvent.offsetX<16,Y=(0,v.isStickyScrollElement)(U.browserEvent.target);let j=!1;if(Y?j=!0:typeof this.tree.expandOnlyOnTwistieClick=="function"?j=this.tree.expandOnlyOnTwistieClick(G.element):j=!!this.tree.expandOnlyOnTwistieClick,Y)this.handleStickyScrollMouseEvent(U,G);else{if(j&&!H&&U.browserEvent.detail!==2)return super.onViewPointer(U);if(!this.tree.expandOnDoubleClick&&U.browserEvent.detail===2)return super.onViewPointer(U)}if(G.collapsible&&(!Y||H)){const Z=this.tree.getNodeLocation(G),ee=U.browserEvent.altKey;if(this.tree.setFocus([Z]),this.tree.toggleCollapsed(Z,ee),j&&H){U.browserEvent.isHandledByList=!0;return}}Y||super.onViewPointer(U)}handleStickyScrollMouseEvent(U,G){if((0,v.isMonacoCustomToggle)(U.browserEvent.target)||(0,v.isActionItem)(U.browserEvent.target))return;const z=this.stickyScrollProvider();if(!z)throw new Error("Sticky scroll controller not found");const H=this.list.indexOf(G),Y=this.list.getElementTop(H),j=z.nodePositionTopBelowWidget(G);this.tree.scrollTop=Y-j,this.list.domFocus(),this.list.setFocus([H]),this.list.setSelection([H])}onDoubleClick(U){U.browserEvent.target.classList.contains("monaco-tl-twistie")||!this.tree.expandOnDoubleClick||U.browserEvent.isHandledByList||super.onDoubleClick(U)}onMouseDown(U){const G=U.browserEvent.target;if(!(0,v.isStickyScrollContainer)(G)&&!(0,v.isStickyScrollElement)(G)){super.onMouseDown(U);return}}onContextMenu(U){const G=U.browserEvent.target;if(!(0,v.isStickyScrollContainer)(G)&&!(0,v.isStickyScrollElement)(G)){super.onContextMenu(U);return}}}class he extends v.List{constructor(U,G,z,H,Y,j,Z,ee){super(U,G,z,H,ee),this.focusTrait=Y,this.selectionTrait=j,this.anchorTrait=Z}createMouseController(U){return new de(this,U.tree,U.stickyScrollProvider)}splice(U,G,z=[]){if(super.splice(U,G,z),z.length===0)return;const H=[],Y=[];let j;z.forEach((Z,ee)=>{this.focusTrait.has(Z)&&H.push(U+ee),this.selectionTrait.has(Z)&&Y.push(U+ee),this.anchorTrait.has(Z)&&(j=U+ee)}),H.length>0&&super.setFocus((0,t.distinct)([...super.getFocus(),...H])),Y.length>0&&super.setSelection((0,t.distinct)([...super.getSelection(),...Y])),typeof j=="number"&&super.setAnchor(j)}setFocus(U,G,z=!1){super.setFocus(U,G),z||this.focusTrait.set(U.map(H=>this.element(H)),G)}setSelection(U,G,z=!1){super.setSelection(U,G),z||this.selectionTrait.set(U.map(H=>this.element(H)),G)}setAnchor(U,G=!1){super.setAnchor(U),G||(typeof U>"u"?this.anchorTrait.set([]):this.anchorTrait.set([this.element(U)]))}}class me{get onDidScroll(){return this.view.onDidScroll}get onDidChangeFocus(){return this.eventBufferer.wrapEvent(this.focus.onDidChange)}get onDidChangeSelection(){return this.eventBufferer.wrapEvent(this.selection.onDidChange)}get onMouseDblClick(){return d.Event.filter(d.Event.map(this.view.onMouseDblClick,J),U=>U.target!==i.TreeMouseEventTarget.Filter)}get onPointer(){return d.Event.map(this.view.onPointer,J)}get onDidFocus(){return this.view.onDidFocus}get onDidChangeModel(){return d.Event.signal(this.model.onDidSplice)}get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}get findMode(){var U,G;return(G=(U=this.findController)===null||U===void 0?void 0:U.mode)!==null&&G!==void 0?G:O.Highlight}set findMode(U){this.findController&&(this.findController.mode=U)}get findMatchType(){var U,G;return(G=(U=this.findController)===null||U===void 0?void 0:U.matchType)!==null&&G!==void 0?G:B.Fuzzy}set findMatchType(U){this.findController&&(this.findController.matchType=U)}get expandOnDoubleClick(){return typeof this._options.expandOnDoubleClick>"u"?!0:this._options.expandOnDoubleClick}get expandOnlyOnTwistieClick(){return typeof this._options.expandOnlyOnTwistieClick>"u"?!0:this._options.expandOnlyOnTwistieClick}get onDidDispose(){return this.view.onDidDispose}constructor(U,G,z,H,Y={}){var j;this._user=U,this._options=Y,this.eventBufferer=new d.EventBufferer,this.onDidChangeFindOpenState=d.Event.None,this.onDidChangeStickyScrollFocused=d.Event.None,this.disposables=new l.DisposableStore,this._onWillRefilter=new d.Emitter,this.onWillRefilter=this._onWillRefilter.event,this._onDidUpdateOptions=new d.Emitter,this.treeDelegate=new I(z);const Z=new d.Relay,ee=new d.Relay,le=this.disposables.add(new A(ee.event)),ue=new c.SetMap;this.renderers=H.map(Se=>new P(Se,()=>this.model,Z.event,le,ue,Y));for(const Se of this.renderers)this.disposables.add(Se);let ce;Y.keyboardNavigationLabelProvider&&(ce=new N(this,Y.keyboardNavigationLabelProvider,Y.filter),Y={...Y,filter:ce},this.disposables.add(ce)),this.focus=new re(()=>this.view.getFocusedElements()[0],Y.identityProvider),this.selection=new re(()=>this.view.getSelectedElements()[0],Y.identityProvider),this.anchor=new re(()=>this.view.getAnchorElement(),Y.identityProvider),this.view=new he(U,G,this.treeDelegate,this.renderers,this.focus,this.selection,this.anchor,{...D(()=>this.model,Y),tree:this,stickyScrollProvider:()=>this.stickyScrollController}),this.model=this.createModel(U,this.view,Y),Z.input=this.model.onDidChangeCollapseState;const pe=d.Event.forEach(this.model.onDidSplice,Se=>{this.eventBufferer.bufferEvents(()=>{this.focus.onDidModelSplice(Se),this.selection.onDidModelSplice(Se)})},this.disposables);pe(()=>null,null,this.disposables);const ve=this.disposables.add(new d.Emitter),Ce=this.disposables.add(new r.Delayer(0));if(this.disposables.add(d.Event.any(pe,this.focus.onDidChange,this.selection.onDidChange)(()=>{Ce.trigger(()=>{const Se=new Set;for(const _e of this.focus.getNodes())Se.add(_e);for(const _e of this.selection.getNodes())Se.add(_e);ve.fire([...Se.values()])})})),ee.input=ve.event,Y.keyboardSupport!==!1){const Se=d.Event.chain(this.view.onKeyDown,_e=>_e.filter(Ee=>!(0,v.isInputElement)(Ee.target)).map(Ee=>new y.StandardKeyboardEvent(Ee)));d.Event.chain(Se,_e=>_e.filter(Ee=>Ee.keyCode===15))(this.onLeftArrow,this,this.disposables),d.Event.chain(Se,_e=>_e.filter(Ee=>Ee.keyCode===17))(this.onRightArrow,this,this.disposables),d.Event.chain(Se,_e=>_e.filter(Ee=>Ee.keyCode===10))(this.onSpace,this,this.disposables)}if((!((j=Y.findWidgetEnabled)!==null&&j!==void 0)||j)&&Y.keyboardNavigationLabelProvider&&Y.contextViewProvider){const Se=this.options.findWidgetStyles?{styles:this.options.findWidgetStyles}:void 0;this.findController=new V(this,this.model,this.view,ce,Y.contextViewProvider,Se),this.focusNavigationFilter=_e=>this.findController.shouldAllowFocus(_e),this.onDidChangeFindOpenState=this.findController.onDidChangeOpenState,this.disposables.add(this.findController),this.onDidChangeFindMode=this.findController.onDidChangeMode,this.onDidChangeFindMatchType=this.findController.onDidChangeMatchType}else this.onDidChangeFindMode=d.Event.None,this.onDidChangeFindMatchType=d.Event.None;Y.enableStickyScroll&&(this.stickyScrollController=new ae(this,this.model,this.view,this.renderers,this.treeDelegate,Y),this.onDidChangeStickyScrollFocused=this.stickyScrollController.onDidChangeHasFocus),this.styleElement=(0,L.createStyleSheet)(this.view.getHTMLElement()),this.getHTMLElement().classList.toggle("always",this._options.renderIndentGuides===T.Always)}updateOptions(U={}){var G;this._options={...this._options,...U};for(const z of this.renderers)z.updateOptions(U);this.view.updateOptions(this._options),(G=this.findController)===null||G===void 0||G.updateOptions(U),this.updateStickyScroll(U),this._onDidUpdateOptions.fire(this._options),this.getHTMLElement().classList.toggle("always",this._options.renderIndentGuides===T.Always)}get options(){return this._options}updateStickyScroll(U){var G;!this.stickyScrollController&&this._options.enableStickyScroll?(this.stickyScrollController=new ae(this,this.model,this.view,this.renderers,this.treeDelegate,this._options),this.onDidChangeStickyScrollFocused=this.stickyScrollController.onDidChangeHasFocus):this.stickyScrollController&&!this._options.enableStickyScroll&&(this.onDidChangeStickyScrollFocused=d.Event.None,this.stickyScrollController.dispose(),this.stickyScrollController=void 0),(G=this.stickyScrollController)===null||G===void 0||G.updateOptions(U)}getHTMLElement(){return this.view.getHTMLElement()}get scrollTop(){return this.view.scrollTop}set scrollTop(U){this.view.scrollTop=U}get scrollHeight(){return this.view.scrollHeight}get renderHeight(){return this.view.renderHeight}domFocus(){var U;!((U=this.stickyScrollController)===null||U===void 0)&&U.focusedLast()?this.stickyScrollController.domFocus():this.view.domFocus()}layout(U,G){var z;this.view.layout(U,G),(0,g.isNumber)(G)&&((z=this.findController)===null||z===void 0||z.layout(G))}style(U){var G;const z=`.${this.view.domId}`,H=[];U.treeIndentGuidesStroke&&(H.push(`.monaco-list${z}:hover .monaco-tl-indent > .indent-guide, .monaco-list${z}.always .monaco-tl-indent > .indent-guide  { border-color: ${U.treeInactiveIndentGuidesStroke}; }`),H.push(`.monaco-list${z} .monaco-tl-indent > .indent-guide.active { border-color: ${U.treeIndentGuidesStroke}; }`)),U.listBackground&&(H.push(`.monaco-list${z} .monaco-scrollable-element .monaco-tree-sticky-container { background-color: ${U.listBackground}; }`),H.push(`.monaco-list${z} .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-row { background-color: ${U.listBackground}; }`)),U.listFocusForeground&&(H.push(`.monaco-list${z}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused { color: ${U.listFocusForeground}; }`),H.push(`.monaco-list${z}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused { color: inherit; }`));const Y=(0,L.asCssValueWithDefault)(U.listFocusAndSelectionOutline,(0,L.asCssValueWithDefault)(U.listSelectionOutline,(G=U.listFocusOutline)!==null&&G!==void 0?G:""));Y&&(H.push(`.monaco-list${z}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused.selected { outline: 1px solid ${Y}; outline-offset: -1px;}`),H.push(`.monaco-list${z}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused.selected { outline: inherit;}`)),U.listFocusOutline&&(H.push(`.monaco-list${z}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused { outline: 1px solid ${U.listFocusOutline}; outline-offset: -1px; }`),H.push(`.monaco-list${z}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused { outline: inherit; }`),H.push(`.monaco-workbench.context-menu-visible .monaco-list${z}.last-focused.sticky-scroll-focused .monaco-list-rows .monaco-list-row.focused { outline: inherit; }`),H.push(`.monaco-workbench.context-menu-visible .monaco-list${z}.last-focused:not(.sticky-scroll-focused) .monaco-tree-sticky-container .monaco-list-rows .monaco-list-row.focused { outline: inherit; }`)),this.styleElement.textContent=H.join(`
+`),this.view.style(U)}getParentElement(U){const G=this.model.getParentNodeLocation(U);return this.model.getNode(G).element}getFirstElementChild(U){return this.model.getFirstElementChild(U)}getNode(U){return this.model.getNode(U)}getNodeLocation(U){return this.model.getNodeLocation(U)}collapse(U,G=!1){return this.model.setCollapsed(U,!0,G)}expand(U,G=!1){return this.model.setCollapsed(U,!1,G)}toggleCollapsed(U,G=!1){return this.model.setCollapsed(U,void 0,G)}isCollapsible(U){return this.model.isCollapsible(U)}setCollapsible(U,G){return this.model.setCollapsible(U,G)}isCollapsed(U){return this.model.isCollapsed(U)}refilter(){this._onWillRefilter.fire(void 0),this.model.refilter()}setSelection(U,G){this.eventBufferer.bufferEvents(()=>{const z=U.map(Y=>this.model.getNode(Y));this.selection.set(z,G);const H=U.map(Y=>this.model.getListIndex(Y)).filter(Y=>Y>-1);this.view.setSelection(H,G,!0)})}getSelection(){return this.selection.get()}setFocus(U,G){this.eventBufferer.bufferEvents(()=>{const z=U.map(Y=>this.model.getNode(Y));this.focus.set(z,G);const H=U.map(Y=>this.model.getListIndex(Y)).filter(Y=>Y>-1);this.view.setFocus(H,G,!0)})}getFocus(){return this.focus.get()}reveal(U,G){this.model.expandTo(U);const z=this.model.getListIndex(U);if(z!==-1)if(!this.stickyScrollController)this.view.reveal(z,G);else{const H=this.stickyScrollController.nodePositionTopBelowWidget(this.getNode(U));this.view.reveal(z,G,H)}}onLeftArrow(U){U.preventDefault(),U.stopPropagation();const G=this.view.getFocusedElements();if(G.length===0)return;const z=G[0],H=this.model.getNodeLocation(z);if(!this.model.setCollapsed(H,!0)){const j=this.model.getParentNodeLocation(H);if(!j)return;const Z=this.model.getListIndex(j);this.view.reveal(Z),this.view.setFocus([Z])}}onRightArrow(U){U.preventDefault(),U.stopPropagation();const G=this.view.getFocusedElements();if(G.length===0)return;const z=G[0],H=this.model.getNodeLocation(z);if(!this.model.setCollapsed(H,!1)){if(!z.children.some(ee=>ee.visible))return;const[j]=this.view.getFocus(),Z=j+1;this.view.reveal(Z),this.view.setFocus([Z])}}onSpace(U){U.preventDefault(),U.stopPropagation();const G=this.view.getFocusedElements();if(G.length===0)return;const z=G[0],H=this.model.getNodeLocation(z),Y=U.browserEvent.altKey;this.model.setCollapsed(H,void 0,Y)}dispose(){var U;(0,l.dispose)(this.disposables),(U=this.stickyScrollController)===null||U===void 0||U.dispose(),this.view.dispose()}}e.AbstractTree=me}),define(se[601],oe([1,0,187,221]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DataTree=void 0;class y extends L.AbstractTree{constructor(S,p,_,v,b,a={}){super(S,p,_,v,a),this.user=S,this.dataSource=b,this.identityProvider=a.identityProvider}createModel(S,p,_){return new k.ObjectTreeModel(S,p,_)}}e.DataTree=y}),define(se[326],oe([1,0,187,584,221,107,52]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompressibleObjectTree=e.ObjectTree=void 0;class p extends L.AbstractTree{get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}constructor(n,t,r,u,f={}){super(n,t,r,u,f),this.user=n}setChildren(n,t=S.Iterable.empty(),r){this.model.setChildren(n,t,r)}rerender(n){if(n===void 0){this.view.rerender();return}this.model.rerender(n)}hasElement(n){return this.model.has(n)}createModel(n,t,r){return new y.ObjectTreeModel(n,t,r)}}e.ObjectTree=p;class _{get compressedTreeNodeProvider(){return this._compressedTreeNodeProvider()}constructor(n,t,r){this._compressedTreeNodeProvider=n,this.stickyScrollDelegate=t,this.renderer=r,this.templateId=r.templateId,r.onDidChangeTwistieState&&(this.onDidChangeTwistieState=r.onDidChangeTwistieState)}renderTemplate(n){return{compressedTreeNode:void 0,data:this.renderer.renderTemplate(n)}}renderElement(n,t,r,u){let f=this.stickyScrollDelegate.getCompressedNode(n);f||(f=this.compressedTreeNodeProvider.getCompressedTreeNode(n.element)),f.element.elements.length===1?(r.compressedTreeNode=void 0,this.renderer.renderElement(n,t,r.data,u)):(r.compressedTreeNode=f,this.renderer.renderCompressedElements(f,t,r.data,u))}disposeElement(n,t,r,u){var f,c,d,s;r.compressedTreeNode?(c=(f=this.renderer).disposeCompressedElements)===null||c===void 0||c.call(f,r.compressedTreeNode,t,r.data,u):(s=(d=this.renderer).disposeElement)===null||s===void 0||s.call(d,n,t,r.data,u)}disposeTemplate(n){this.renderer.disposeTemplate(n.data)}renderTwistie(n,t){return this.renderer.renderTwistie?this.renderer.renderTwistie(n,t):!1}}ke([E.memoize],_.prototype,"compressedTreeNodeProvider",null);class v{constructor(n){this.modelProvider=n,this.compressedStickyNodes=new Map}getCompressedNode(n){return this.compressedStickyNodes.get(n)}constrainStickyScrollNodes(n,t,r){if(this.compressedStickyNodes.clear(),n.length===0)return[];for(let u=0;u<n.length;u++){const f=n[u],c=f.position+f.height;if(u+1<n.length&&c+n[u+1].height>r||u>=t-1&&t<n.length){const s=n.slice(0,u),l=n.slice(u),o=this.compressStickyNodes(l);return[...s,o]}}return n}compressStickyNodes(n){if(n.length===0)throw new Error("Can't compress empty sticky nodes");if(!this.modelProvider().isCompressionEnabled())return n[0];const t=[];for(const s of n){const l=this.modelProvider().getCompressedTreeNode(s.node.element);if(l.element){if(l.element.incompressible)break;t.push(...l.element.elements)}}if(t.length<2)return n[0];const r=n[n.length-1],u={elements:t,incompressible:!1},f={...r.node,children:[],element:u},c=new Proxy(n[0].node,{}),d={node:c,startIndex:n[0].startIndex,endIndex:r.endIndex,position:n[0].position,height:n[0].height};return this.compressedStickyNodes.set(c,f),d}}function b(i,n){return n&&{...n,keyboardNavigationLabelProvider:n.keyboardNavigationLabelProvider&&{getKeyboardNavigationLabel(t){let r;try{r=i().getCompressedTreeNode(t)}catch{return n.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(t)}return r.element.elements.length===1?n.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(t):n.keyboardNavigationLabelProvider.getCompressedNodeKeyboardNavigationLabel(r.element.elements)}}}}class a extends p{constructor(n,t,r,u,f={}){const c=()=>this,d=new v(()=>this.model),s=u.map(l=>new _(c,d,l));super(n,t,r,s,{...b(c,f),stickyScrollDelegate:d})}setChildren(n,t=S.Iterable.empty(),r){this.model.setChildren(n,t,r)}createModel(n,t,r){return new k.CompressibleObjectTreeModel(n,t,r)}updateOptions(n={}){super.updateOptions(n),typeof n.compressionEnabled<"u"&&this.model.setCompressionEnabled(n.compressionEnabled)}getCompressedTreeNode(n=null){return this.model.getCompressedTreeNode(n)}}e.CompressibleObjectTree=a}),define(se[602],oe([1,0,228,187,220,326,143,14,26,28,12,6,52,2,20]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompressibleAsyncDataTree=e.AsyncDataTree=void 0;function r(N){return{...N,children:[],refreshPromise:void 0,stale:!0,slow:!1,forceExpanded:!1}}function u(N,M){return M.parent?M.parent===N?!0:u(N,M.parent):!1}function f(N,M){return N===M||u(N,M)||u(M,N)}class c{get element(){return this.node.element.element}get children(){return this.node.children.map(M=>new c(M))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}constructor(M){this.node=M}}class d{constructor(M,R,x){this.renderer=M,this.nodeMapper=R,this.onDidChangeTwistieState=x,this.renderedNodes=new Map,this.templateId=M.templateId}renderTemplate(M){return{templateData:this.renderer.renderTemplate(M)}}renderElement(M,R,x,O){this.renderer.renderElement(this.nodeMapper.map(M),R,x.templateData,O)}renderTwistie(M,R){return M.slow?(R.classList.add(...v.ThemeIcon.asClassNameArray(_.Codicon.treeItemLoading)),!0):(R.classList.remove(...v.ThemeIcon.asClassNameArray(_.Codicon.treeItemLoading)),!1)}disposeElement(M,R,x,O){var B,W;(W=(B=this.renderer).disposeElement)===null||W===void 0||W.call(B,this.nodeMapper.map(M),R,x.templateData,O)}disposeTemplate(M){this.renderer.disposeTemplate(M.templateData)}dispose(){this.renderedNodes.clear()}}function s(N){return{browserEvent:N.browserEvent,elements:N.elements.map(M=>M.element)}}function l(N){return{browserEvent:N.browserEvent,element:N.element&&N.element.element,target:N.target}}class o extends L.ElementsDragAndDropData{constructor(M){super(M.elements.map(R=>R.element)),this.data=M}}function g(N){return N instanceof L.ElementsDragAndDropData?new o(N):N}class h{constructor(M){this.dnd=M}getDragURI(M){return this.dnd.getDragURI(M.element)}getDragLabel(M,R){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(M.map(x=>x.element),R)}onDragStart(M,R){var x,O;(O=(x=this.dnd).onDragStart)===null||O===void 0||O.call(x,g(M),R)}onDragOver(M,R,x,O,B,W=!0){return this.dnd.onDragOver(g(M),R&&R.element,x,O,B)}drop(M,R,x,O,B){this.dnd.drop(g(M),R&&R.element,x,O,B)}onDragEnd(M){var R,x;(x=(R=this.dnd).onDragEnd)===null||x===void 0||x.call(R,M)}dispose(){this.dnd.dispose()}}function m(N){return N&&{...N,collapseByDefault:!0,identityProvider:N.identityProvider&&{getId(M){return N.identityProvider.getId(M.element)}},dnd:N.dnd&&new h(N.dnd),multipleSelectionController:N.multipleSelectionController&&{isSelectionSingleChangeEvent(M){return N.multipleSelectionController.isSelectionSingleChangeEvent({...M,element:M.element})},isSelectionRangeChangeEvent(M){return N.multipleSelectionController.isSelectionRangeChangeEvent({...M,element:M.element})}},accessibilityProvider:N.accessibilityProvider&&{...N.accessibilityProvider,getPosInSet:void 0,getSetSize:void 0,getRole:N.accessibilityProvider.getRole?M=>N.accessibilityProvider.getRole(M.element):()=>"treeitem",isChecked:N.accessibilityProvider.isChecked?M=>{var R;return!!(!((R=N.accessibilityProvider)===null||R===void 0)&&R.isChecked(M.element))}:void 0,getAriaLabel(M){return N.accessibilityProvider.getAriaLabel(M.element)},getWidgetAriaLabel(){return N.accessibilityProvider.getWidgetAriaLabel()},getWidgetRole:N.accessibilityProvider.getWidgetRole?()=>N.accessibilityProvider.getWidgetRole():()=>"tree",getAriaLevel:N.accessibilityProvider.getAriaLevel&&(M=>N.accessibilityProvider.getAriaLevel(M.element)),getActiveDescendantId:N.accessibilityProvider.getActiveDescendantId&&(M=>N.accessibilityProvider.getActiveDescendantId(M.element))},filter:N.filter&&{filter(M,R){return N.filter.filter(M.element,R)}},keyboardNavigationLabelProvider:N.keyboardNavigationLabelProvider&&{...N.keyboardNavigationLabelProvider,getKeyboardNavigationLabel(M){return N.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(M.element)}},sorter:void 0,expandOnlyOnTwistieClick:typeof N.expandOnlyOnTwistieClick>"u"?void 0:typeof N.expandOnlyOnTwistieClick!="function"?N.expandOnlyOnTwistieClick:M=>N.expandOnlyOnTwistieClick(M.element),defaultFindVisibility:M=>M.hasChildren&&M.stale?1:typeof N.defaultFindVisibility=="number"?N.defaultFindVisibility:typeof N.defaultFindVisibility>"u"?2:N.defaultFindVisibility(M.element)}}function C(N,M){M(N),N.children.forEach(R=>C(R,M))}class w{get onDidScroll(){return this.tree.onDidScroll}get onDidChangeFocus(){return a.Event.map(this.tree.onDidChangeFocus,s)}get onDidChangeSelection(){return a.Event.map(this.tree.onDidChangeSelection,s)}get onMouseDblClick(){return a.Event.map(this.tree.onMouseDblClick,l)}get onPointer(){return a.Event.map(this.tree.onPointer,l)}get onDidFocus(){return this.tree.onDidFocus}get onDidChangeModel(){return this.tree.onDidChangeModel}get onDidChangeCollapseState(){return this.tree.onDidChangeCollapseState}get onDidChangeFindOpenState(){return this.tree.onDidChangeFindOpenState}get onDidChangeStickyScrollFocused(){return this.tree.onDidChangeStickyScrollFocused}get onDidDispose(){return this.tree.onDidDispose}constructor(M,R,x,O,B,W={}){this.user=M,this.dataSource=B,this.nodes=new Map,this.subTreeRefreshPromises=new Map,this.refreshPromises=new Map,this._onDidRender=new a.Emitter,this._onDidChangeNodeSlowState=new a.Emitter,this.nodeMapper=new S.WeakMapper(V=>new c(V)),this.disposables=new n.DisposableStore,this.identityProvider=W.identityProvider,this.autoExpandSingleChildren=typeof W.autoExpandSingleChildren>"u"?!1:W.autoExpandSingleChildren,this.sorter=W.sorter,this.getDefaultCollapseState=V=>W.collapseByDefault?W.collapseByDefault(V)?S.ObjectTreeElementCollapseState.PreserveOrCollapsed:S.ObjectTreeElementCollapseState.PreserveOrExpanded:void 0,this.tree=this.createTree(M,R,x,O,W),this.onDidChangeFindMode=this.tree.onDidChangeFindMode,this.onDidChangeFindMatchType=this.tree.onDidChangeFindMatchType,this.root=r({element:void 0,parent:null,hasChildren:!0,defaultCollapseState:void 0}),this.identityProvider&&(this.root={...this.root,id:null}),this.nodes.set(null,this.root),this.tree.onDidChangeCollapseState(this._onDidChangeCollapseState,this,this.disposables)}createTree(M,R,x,O,B){const W=new k.ComposedTreeDelegate(x),V=O.map(F=>new d(F,this.nodeMapper,this._onDidChangeNodeSlowState.event)),K=m(B)||{};return new E.ObjectTree(M,R,W,V,K)}updateOptions(M={}){this.tree.updateOptions(M)}getHTMLElement(){return this.tree.getHTMLElement()}get scrollTop(){return this.tree.scrollTop}set scrollTop(M){this.tree.scrollTop=M}get scrollHeight(){return this.tree.scrollHeight}get renderHeight(){return this.tree.renderHeight}domFocus(){this.tree.domFocus()}layout(M,R){this.tree.layout(M,R)}style(M){this.tree.style(M)}getInput(){return this.root.element}async setInput(M,R){this.refreshPromises.forEach(O=>O.cancel()),this.refreshPromises.clear(),this.root.element=M;const x=R&&{viewState:R,focus:[],selection:[]};await this._updateChildren(M,!0,!1,x),x&&(this.tree.setFocus(x.focus),this.tree.setSelection(x.selection)),R&&typeof R.scrollTop=="number"&&(this.scrollTop=R.scrollTop)}async _updateChildren(M=this.root.element,R=!0,x=!1,O,B){if(typeof this.root.element>"u")throw new S.TreeError(this.user,"Tree input not set");this.root.refreshPromise&&(await this.root.refreshPromise,await a.Event.toPromise(this._onDidRender.event));const W=this.getDataNode(M);if(await this.refreshAndRenderNode(W,R,O,B),x)try{this.tree.rerender(W)}catch{}}rerender(M){if(M===void 0||M===this.root.element){this.tree.rerender();return}const R=this.getDataNode(M);this.tree.rerender(R)}getNode(M=this.root.element){const R=this.getDataNode(M),x=this.tree.getNode(R===this.root?null:R);return this.nodeMapper.map(x)}collapse(M,R=!1){const x=this.getDataNode(M);return this.tree.collapse(x===this.root?null:x,R)}async expand(M,R=!1){if(typeof this.root.element>"u")throw new S.TreeError(this.user,"Tree input not set");this.root.refreshPromise&&(await this.root.refreshPromise,await a.Event.toPromise(this._onDidRender.event));const x=this.getDataNode(M);if(this.tree.hasElement(x)&&!this.tree.isCollapsible(x)||(x.refreshPromise&&(await this.root.refreshPromise,await a.Event.toPromise(this._onDidRender.event)),x!==this.root&&!x.refreshPromise&&!this.tree.isCollapsed(x)))return!1;const O=this.tree.expand(x===this.root?null:x,R);return x.refreshPromise&&(await this.root.refreshPromise,await a.Event.toPromise(this._onDidRender.event)),O}setSelection(M,R){const x=M.map(O=>this.getDataNode(O));this.tree.setSelection(x,R)}getSelection(){return this.tree.getSelection().map(R=>R.element)}setFocus(M,R){const x=M.map(O=>this.getDataNode(O));this.tree.setFocus(x,R)}getFocus(){return this.tree.getFocus().map(R=>R.element)}reveal(M,R){this.tree.reveal(this.getDataNode(M),R)}getParentElement(M){const R=this.tree.getParentElement(this.getDataNode(M));return R&&R.element}getFirstElementChild(M=this.root.element){const R=this.getDataNode(M),x=this.tree.getFirstElementChild(R===this.root?null:R);return x&&x.element}getDataNode(M){const R=this.nodes.get(M===this.root.element?null:M);if(!R)throw new S.TreeError(this.user,`Data tree node not found: ${M}`);return R}async refreshAndRenderNode(M,R,x,O){await this.refreshNode(M,R,x),!this.disposables.isDisposed&&this.render(M,x,O)}async refreshNode(M,R,x){let O;if(this.subTreeRefreshPromises.forEach((B,W)=>{!O&&f(W,M)&&(O=B.then(()=>this.refreshNode(M,R,x)))}),O)return O;if(M!==this.root&&this.tree.getNode(M).collapsed){M.hasChildren=!!this.dataSource.hasChildren(M.element),M.stale=!0;return}return this.doRefreshSubTree(M,R,x)}async doRefreshSubTree(M,R,x){let O;M.refreshPromise=new Promise(B=>O=B),this.subTreeRefreshPromises.set(M,M.refreshPromise),M.refreshPromise.finally(()=>{M.refreshPromise=void 0,this.subTreeRefreshPromises.delete(M)});try{const B=await this.doRefreshNode(M,R,x);M.stale=!1,await p.Promises.settled(B.map(W=>this.doRefreshSubTree(W,R,x)))}finally{O()}}async doRefreshNode(M,R,x){M.hasChildren=!!this.dataSource.hasChildren(M.element);let O;if(!M.hasChildren)O=Promise.resolve(i.Iterable.empty());else{const B=this.doGetChildren(M);if((0,t.isIterable)(B))O=Promise.resolve(B);else{const W=(0,p.timeout)(800);W.then(()=>{M.slow=!0,this._onDidChangeNodeSlowState.fire(M)},V=>null),O=B.finally(()=>W.cancel())}}try{const B=await O;return this.setChildren(M,B,R,x)}catch(B){if(M!==this.root&&this.tree.hasElement(M)&&this.tree.collapse(M),(0,b.isCancellationError)(B))return[];throw B}finally{M.slow&&(M.slow=!1,this._onDidChangeNodeSlowState.fire(M))}}doGetChildren(M){let R=this.refreshPromises.get(M);if(R)return R;const x=this.dataSource.getChildren(M.element);return(0,t.isIterable)(x)?this.processChildren(x):(R=(0,p.createCancelablePromise)(async()=>this.processChildren(await x)),this.refreshPromises.set(M,R),R.finally(()=>{this.refreshPromises.delete(M)}))}_onDidChangeCollapseState({node:M,deep:R}){M.element!==null&&!M.collapsed&&M.element.stale&&(R?this.collapse(M.element.element):this.refreshAndRenderNode(M.element,!1).catch(b.onUnexpectedError))}setChildren(M,R,x,O){const B=[...R];if(M.children.length===0&&B.length===0)return[];const W=new Map,V=new Map;for(const q of M.children)W.set(q.element,q),this.identityProvider&&V.set(q.id,{node:q,collapsed:this.tree.hasElement(q)&&this.tree.isCollapsed(q)});const K=[],F=B.map(q=>{const ie=!!this.dataSource.hasChildren(q);if(!this.identityProvider){const J=r({element:q,parent:M,hasChildren:ie,defaultCollapseState:this.getDefaultCollapseState(q)});return ie&&J.defaultCollapseState===S.ObjectTreeElementCollapseState.PreserveOrExpanded&&K.push(J),J}const ae=this.identityProvider.getId(q).toString(),ne=V.get(ae);if(ne){const J=ne.node;return W.delete(J.element),this.nodes.delete(J.element),this.nodes.set(q,J),J.element=q,J.hasChildren=ie,x?ne.collapsed?(J.children.forEach(Q=>C(Q,re=>this.nodes.delete(re.element))),J.children.splice(0,J.children.length),J.stale=!0):K.push(J):ie&&!ne.collapsed&&K.push(J),J}const $=r({element:q,parent:M,id:ae,hasChildren:ie,defaultCollapseState:this.getDefaultCollapseState(q)});return O&&O.viewState.focus&&O.viewState.focus.indexOf(ae)>-1&&O.focus.push($),O&&O.viewState.selection&&O.viewState.selection.indexOf(ae)>-1&&O.selection.push($),(O&&O.viewState.expanded&&O.viewState.expanded.indexOf(ae)>-1||ie&&$.defaultCollapseState===S.ObjectTreeElementCollapseState.PreserveOrExpanded)&&K.push($),$});for(const q of W.values())C(q,ie=>this.nodes.delete(ie.element));for(const q of F)this.nodes.set(q.element,q);return M.children.splice(0,M.children.length,...F),M!==this.root&&this.autoExpandSingleChildren&&F.length===1&&K.length===0&&(F[0].forceExpanded=!0,K.push(F[0])),K}render(M,R,x){const O=M.children.map(W=>this.asTreeElement(W,R)),B=x&&{...x,diffIdentityProvider:x.diffIdentityProvider&&{getId(W){return x.diffIdentityProvider.getId(W.element)}}};this.tree.setChildren(M===this.root?null:M,O,B),M!==this.root&&this.tree.setCollapsible(M,M.hasChildren),this._onDidRender.fire()}asTreeElement(M,R){if(M.stale)return{element:M,collapsible:M.hasChildren,collapsed:!0};let x;return R&&R.viewState.expanded&&M.id&&R.viewState.expanded.indexOf(M.id)>-1?x=!1:M.forceExpanded?(x=!1,M.forceExpanded=!1):x=M.defaultCollapseState,{element:M,children:M.hasChildren?i.Iterable.map(M.children,O=>this.asTreeElement(O,R)):[],collapsible:M.hasChildren,collapsed:x}}processChildren(M){return this.sorter&&(M=[...M].sort(this.sorter.compare.bind(this.sorter))),M}dispose(){this.disposables.dispose(),this.tree.dispose()}}e.AsyncDataTree=w;class D{get element(){return{elements:this.node.element.elements.map(M=>M.element),incompressible:this.node.element.incompressible}}get children(){return this.node.children.map(M=>new D(M))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}constructor(M){this.node=M}}class I{constructor(M,R,x,O){this.renderer=M,this.nodeMapper=R,this.compressibleNodeMapperProvider=x,this.onDidChangeTwistieState=O,this.renderedNodes=new Map,this.disposables=[],this.templateId=M.templateId}renderTemplate(M){return{templateData:this.renderer.renderTemplate(M)}}renderElement(M,R,x,O){this.renderer.renderElement(this.nodeMapper.map(M),R,x.templateData,O)}renderCompressedElements(M,R,x,O){this.renderer.renderCompressedElements(this.compressibleNodeMapperProvider().map(M),R,x.templateData,O)}renderTwistie(M,R){return M.slow?(R.classList.add(...v.ThemeIcon.asClassNameArray(_.Codicon.treeItemLoading)),!0):(R.classList.remove(...v.ThemeIcon.asClassNameArray(_.Codicon.treeItemLoading)),!1)}disposeElement(M,R,x,O){var B,W;(W=(B=this.renderer).disposeElement)===null||W===void 0||W.call(B,this.nodeMapper.map(M),R,x.templateData,O)}disposeCompressedElements(M,R,x,O){var B,W;(W=(B=this.renderer).disposeCompressedElements)===null||W===void 0||W.call(B,this.compressibleNodeMapperProvider().map(M),R,x.templateData,O)}disposeTemplate(M){this.renderer.disposeTemplate(M.templateData)}dispose(){this.renderedNodes.clear(),this.disposables=(0,n.dispose)(this.disposables)}}function T(N){const M=N&&m(N);return M&&{...M,keyboardNavigationLabelProvider:M.keyboardNavigationLabelProvider&&{...M.keyboardNavigationLabelProvider,getCompressedNodeKeyboardNavigationLabel(R){return N.keyboardNavigationLabelProvider.getCompressedNodeKeyboardNavigationLabel(R.map(x=>x.element))}}}}class A extends w{constructor(M,R,x,O,B,W,V={}){super(M,R,x,B,W,V),this.compressionDelegate=O,this.compressibleNodeMapper=new S.WeakMapper(K=>new D(K)),this.filter=V.filter}createTree(M,R,x,O,B){const W=new k.ComposedTreeDelegate(x),V=O.map(F=>new I(F,this.nodeMapper,()=>this.compressibleNodeMapper,this._onDidChangeNodeSlowState.event)),K=T(B)||{};return new E.CompressibleObjectTree(M,R,W,V,K)}asTreeElement(M,R){return{incompressible:this.compressionDelegate.isIncompressible(M.element),...super.asTreeElement(M,R)}}updateOptions(M={}){this.tree.updateOptions(M)}render(M,R,x){if(!this.identityProvider)return super.render(M,R);const O=ne=>this.identityProvider.getId(ne).toString(),B=ne=>{const $=new Set;for(const J of ne){const Q=this.tree.getCompressedTreeNode(J===this.root?null:J);if(Q.element)for(const re of Q.element.elements)$.add(O(re.element))}return $},W=B(this.tree.getSelection()),V=B(this.tree.getFocus());super.render(M,R,x);const K=this.getSelection();let F=!1;const q=this.getFocus();let ie=!1;const ae=ne=>{const $=ne.element;if($)for(let J=0;J<$.elements.length;J++){const Q=O($.elements[J].element),re=$.elements[$.elements.length-1].element;W.has(Q)&&K.indexOf(re)===-1&&(K.push(re),F=!0),V.has(Q)&&q.indexOf(re)===-1&&(q.push(re),ie=!0)}ne.children.forEach(ae)};ae(this.tree.getCompressedTreeNode(M===this.root?null:M)),F&&this.setSelection(K),ie&&this.setFocus(q)}processChildren(M){return this.filter&&(M=i.Iterable.filter(M,R=>{const x=this.filter.filter(R,1),O=P(x);if(O===2)throw new Error("Recursive tree visibility not supported in async data compressed trees");return O===1})),super.processChildren(M)}}e.CompressibleAsyncDataTree=A;function P(N){return typeof N=="boolean"?N?1:0:(0,y.isFilterResult)(N)?(0,y.getVisibleState)(N.visibility):(0,y.getVisibleState)(N)}}),define(se[327],oe([1,0,12,6,2,55,17,11]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.create=e.SimpleWorkerServer=e.SimpleWorkerClient=e.logOnceWebWorkerWarning=void 0;const _="$initialize";let v=!1;function b(g){S.isWeb&&(v||(v=!0,console.warn("Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq")),console.warn(g.message))}e.logOnceWebWorkerWarning=b;class a{constructor(h,m,C,w){this.vsWorker=h,this.req=m,this.method=C,this.args=w,this.type=0}}class i{constructor(h,m,C,w){this.vsWorker=h,this.seq=m,this.res=C,this.err=w,this.type=1}}class n{constructor(h,m,C,w){this.vsWorker=h,this.req=m,this.eventName=C,this.arg=w,this.type=2}}class t{constructor(h,m,C){this.vsWorker=h,this.req=m,this.event=C,this.type=3}}class r{constructor(h,m){this.vsWorker=h,this.req=m,this.type=4}}class u{constructor(h){this._workerId=-1,this._handler=h,this._lastSentReq=0,this._pendingReplies=Object.create(null),this._pendingEmitters=new Map,this._pendingEvents=new Map}setWorkerId(h){this._workerId=h}sendMessage(h,m){const C=String(++this._lastSentReq);return new Promise((w,D)=>{this._pendingReplies[C]={resolve:w,reject:D},this._send(new a(this._workerId,C,h,m))})}listen(h,m){let C=null;const w=new k.Emitter({onWillAddFirstListener:()=>{C=String(++this._lastSentReq),this._pendingEmitters.set(C,w),this._send(new n(this._workerId,C,h,m))},onDidRemoveLastListener:()=>{this._pendingEmitters.delete(C),this._send(new r(this._workerId,C)),C=null}});return w.event}handleMessage(h){!h||!h.vsWorker||this._workerId!==-1&&h.vsWorker!==this._workerId||this._handleMessage(h)}_handleMessage(h){switch(h.type){case 1:return this._handleReplyMessage(h);case 0:return this._handleRequestMessage(h);case 2:return this._handleSubscribeEventMessage(h);case 3:return this._handleEventMessage(h);case 4:return this._handleUnsubscribeEventMessage(h)}}_handleReplyMessage(h){if(!this._pendingReplies[h.seq]){console.warn("Got reply to unknown seq");return}const m=this._pendingReplies[h.seq];if(delete this._pendingReplies[h.seq],h.err){let C=h.err;h.err.$isError&&(C=new Error,C.name=h.err.name,C.message=h.err.message,C.stack=h.err.stack),m.reject(C);return}m.resolve(h.res)}_handleRequestMessage(h){const m=h.req;this._handler.handleMessage(h.method,h.args).then(w=>{this._send(new i(this._workerId,m,w,void 0))},w=>{w.detail instanceof Error&&(w.detail=(0,L.transformErrorForSerialization)(w.detail)),this._send(new i(this._workerId,m,void 0,(0,L.transformErrorForSerialization)(w)))})}_handleSubscribeEventMessage(h){const m=h.req,C=this._handler.handleEvent(h.eventName,h.arg)(w=>{this._send(new t(this._workerId,m,w))});this._pendingEvents.set(m,C)}_handleEventMessage(h){if(!this._pendingEmitters.has(h.req)){console.warn("Got event for unknown req");return}this._pendingEmitters.get(h.req).fire(h.event)}_handleUnsubscribeEventMessage(h){if(!this._pendingEvents.has(h.req)){console.warn("Got unsubscribe for unknown req");return}this._pendingEvents.get(h.req).dispose(),this._pendingEvents.delete(h.req)}_send(h){const m=[];if(h.type===0)for(let C=0;C<h.args.length;C++)h.args[C]instanceof ArrayBuffer&&m.push(h.args[C]);else h.type===1&&h.res instanceof ArrayBuffer&&m.push(h.res);this._handler.sendMessage(h,m)}}class f extends y.Disposable{constructor(h,m,C){super();let w=null;this._worker=this._register(h.create("vs/base/common/worker/simpleWorker",N=>{this._protocol.handleMessage(N)},N=>{w?.(N)})),this._protocol=new u({sendMessage:(N,M)=>{this._worker.postMessage(N,M)},handleMessage:(N,M)=>{if(typeof C[N]!="function")return Promise.reject(new Error("Missing method "+N+" on main thread host."));try{return Promise.resolve(C[N].apply(C,M))}catch(R){return Promise.reject(R)}},handleEvent:(N,M)=>{if(d(N)){const R=C[N].call(C,M);if(typeof R!="function")throw new Error(`Missing dynamic event ${N} on main thread host.`);return R}if(c(N)){const R=C[N];if(typeof R!="function")throw new Error(`Missing event ${N} on main thread host.`);return R}throw new Error(`Malformed event name ${N}`)}}),this._protocol.setWorkerId(this._worker.getId());let D=null;const I=globalThis.require;typeof I<"u"&&typeof I.getConfig=="function"?D=I.getConfig():typeof globalThis.requirejs<"u"&&(D=globalThis.requirejs.s.contexts._.config);const T=(0,E.getAllMethodNames)(C);this._onModuleLoaded=this._protocol.sendMessage(_,[this._worker.getId(),JSON.parse(JSON.stringify(D)),m,T]);const A=(N,M)=>this._request(N,M),P=(N,M)=>this._protocol.listen(N,M);this._lazyProxy=new Promise((N,M)=>{w=M,this._onModuleLoaded.then(R=>{N(s(R,A,P))},R=>{M(R),this._onError("Worker failed to load "+m,R)})})}getProxyObject(){return this._lazyProxy}_request(h,m){return new Promise((C,w)=>{this._onModuleLoaded.then(()=>{this._protocol.sendMessage(h,m).then(C,w)},w)})}_onError(h,m){console.error(h),console.info(m)}}e.SimpleWorkerClient=f;function c(g){return g[0]==="o"&&g[1]==="n"&&p.isUpperAsciiLetter(g.charCodeAt(2))}function d(g){return/^onDynamic/.test(g)&&p.isUpperAsciiLetter(g.charCodeAt(9))}function s(g,h,m){const C=I=>function(){const T=Array.prototype.slice.call(arguments,0);return h(I,T)},w=I=>function(T){return m(I,T)},D={};for(const I of g){if(d(I)){D[I]=w(I);continue}if(c(I)){D[I]=m(I,void 0);continue}D[I]=C(I)}return D}class l{constructor(h,m){this._requestHandlerFactory=m,this._requestHandler=null,this._protocol=new u({sendMessage:(C,w)=>{h(C,w)},handleMessage:(C,w)=>this._handleMessage(C,w),handleEvent:(C,w)=>this._handleEvent(C,w)})}onmessage(h){this._protocol.handleMessage(h)}_handleMessage(h,m){if(h===_)return this.initialize(m[0],m[1],m[2],m[3]);if(!this._requestHandler||typeof this._requestHandler[h]!="function")return Promise.reject(new Error("Missing requestHandler or method: "+h));try{return Promise.resolve(this._requestHandler[h].apply(this._requestHandler,m))}catch(C){return Promise.reject(C)}}_handleEvent(h,m){if(!this._requestHandler)throw new Error("Missing requestHandler");if(d(h)){const C=this._requestHandler[h].call(this._requestHandler,m);if(typeof C!="function")throw new Error(`Missing dynamic event ${h} on request handler.`);return C}if(c(h)){const C=this._requestHandler[h];if(typeof C!="function")throw new Error(`Missing event ${h} on request handler.`);return C}throw new Error(`Malformed event name ${h}`)}initialize(h,m,C,w){this._protocol.setWorkerId(h);const T=s(w,(A,P)=>this._protocol.sendMessage(A,P),(A,P)=>this._protocol.listen(A,P));return this._requestHandlerFactory?(this._requestHandler=this._requestHandlerFactory(T),Promise.resolve((0,E.getAllMethodNames)(this._requestHandler))):(m&&(typeof m.baseUrl<"u"&&delete m.baseUrl,typeof m.paths<"u"&&typeof m.paths.vs<"u"&&delete m.paths.vs,typeof m.trustedTypesPolicy<"u"&&delete m.trustedTypesPolicy,m.catchError=!0,globalThis.require.config(m)),new Promise((A,P)=>{(globalThis.require||te)([C],M=>{if(this._requestHandler=M.create(T),!this._requestHandler){P(new Error("No RequestHandler!"));return}A((0,E.getAllMethodNames)(this._requestHandler))},P)}))}}e.SimpleWorkerServer=l;function o(g){return new l(g,null)}e.create=o}),define(se[603],oe([1,0,93,12,47,327,2]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DefaultWorkerFactory=e.getWorkerBootstrapUrl=void 0;const p=(0,L.createTrustedTypesPolicy)("defaultWorkerFactory",{createScriptURL:n=>n});function _(n){const t=globalThis.MonacoEnvironment;if(t){if(typeof t.getWorker=="function")return t.getWorker("workerMain.js",n);if(typeof t.getWorkerUrl=="function"){const r=t.getWorkerUrl("workerMain.js",n);return new Worker(p?p.createScriptURL(r):r,{name:n})}}if(typeof te=="function"){const r=te.toUrl("vs/base/worker/workerMain.js"),u=v(r,n);return new Worker(p?p.createScriptURL(u):u,{name:n})}throw new Error("You must define a function MonacoEnvironment.getWorkerUrl or MonacoEnvironment.getWorker")}function v(n,t){if(/^((http:)|(https:)|(file:))/.test(n)&&n.substring(0,globalThis.origin.length)!==globalThis.origin){const d="vs/base/worker/defaultWorkerFactory.js",s=te.toUrl(d).slice(0,-d.length),l=`/*${t}*/globalThis.MonacoEnvironment={baseUrl: '${s}'};const ttPolicy = globalThis.trustedTypes?.createPolicy('defaultWorkerFactory', { createScriptURL: value => value });importScripts(ttPolicy?.createScriptURL('${n}') ?? '${n}');/*${t}*/`,o=new Blob([l],{type:"application/javascript"});return URL.createObjectURL(o)}const r=n.lastIndexOf("?"),u=n.lastIndexOf("#",r),f=r>0?new URLSearchParams(n.substring(r+1,~u?u:void 0)):new URLSearchParams;return y.COI.addSearchParam(f,!0,!0),f.toString()?`${n}?${f.toString()}#${t}`:`${n}#${t}`}e.getWorkerBootstrapUrl=v;function b(n){return typeof n.then=="function"}class a extends S.Disposable{constructor(t,r,u,f,c){super(),this.id=r,this.label=u;const d=_(u);b(d)?this.worker=d:this.worker=Promise.resolve(d),this.postMessage(t,[]),this.worker.then(s=>{s.onmessage=function(l){f(l.data)},s.onmessageerror=c,typeof s.addEventListener=="function"&&s.addEventListener("error",c)}),this._register((0,S.toDisposable)(()=>{var s;(s=this.worker)===null||s===void 0||s.then(l=>{l.onmessage=null,l.onmessageerror=null,l.removeEventListener("error",c),l.terminate()}),this.worker=null}))}getId(){return this.id}postMessage(t,r){var u;(u=this.worker)===null||u===void 0||u.then(f=>{try{f.postMessage(t,r)}catch(c){(0,k.onUnexpectedError)(c),(0,k.onUnexpectedError)(new Error(`FAILED to post message to '${this.label}'-worker`,{cause:c}))}})}}class i{constructor(t){this._label=t,this._webWorkerFailedBeforeError=!1}create(t,r,u){const f=++i.LAST_WORKER_ID;if(this._webWorkerFailedBeforeError)throw this._webWorkerFailedBeforeError;return new a(t,f,this._label||"anonymous"+f,r,c=>{(0,E.logOnceWebWorkerWarning)(c),this._webWorkerFailedBeforeError=c,u(c)})}}e.DefaultWorkerFactory=i,i.LAST_WORKER_ID=0}),define(se[604],oe([1,0,14,6,2,223,20]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InMemoryStorageDatabase=e.Storage=e.StorageState=e.StorageHint=void 0;var p;(function(a){a[a.STORAGE_DOES_NOT_EXIST=0]="STORAGE_DOES_NOT_EXIST",a[a.STORAGE_IN_MEMORY=1]="STORAGE_IN_MEMORY"})(p||(e.StorageHint=p={}));var _;(function(a){a[a.None=0]="None",a[a.Initialized=1]="Initialized",a[a.Closed=2]="Closed"})(_||(e.StorageState=_={}));class v extends y.Disposable{constructor(i,n=Object.create(null)){super(),this.database=i,this.options=n,this._onDidChangeStorage=this._register(new k.PauseableEmitter),this.onDidChangeStorage=this._onDidChangeStorage.event,this.state=_.None,this.cache=new Map,this.flushDelayer=this._register(new L.ThrottledDelayer(v.DEFAULT_FLUSH_DELAY)),this.pendingDeletes=new Set,this.pendingInserts=new Map,this.whenFlushedCallbacks=[],this.registerListeners()}registerListeners(){this._register(this.database.onDidChangeItemsExternal(i=>this.onDidChangeItemsExternal(i)))}onDidChangeItemsExternal(i){var n,t;this._onDidChangeStorage.pause();try{(n=i.changed)===null||n===void 0||n.forEach((r,u)=>this.acceptExternal(u,r)),(t=i.deleted)===null||t===void 0||t.forEach(r=>this.acceptExternal(r,void 0))}finally{this._onDidChangeStorage.resume()}}acceptExternal(i,n){if(this.state===_.Closed)return;let t=!1;(0,S.isUndefinedOrNull)(n)?t=this.cache.delete(i):this.cache.get(i)!==n&&(this.cache.set(i,n),t=!0),t&&this._onDidChangeStorage.fire({key:i,external:!0})}get(i,n){const t=this.cache.get(i);return(0,S.isUndefinedOrNull)(t)?n:t}getBoolean(i,n){const t=this.get(i);return(0,S.isUndefinedOrNull)(t)?n:t==="true"}getNumber(i,n){const t=this.get(i);return(0,S.isUndefinedOrNull)(t)?n:parseInt(t,10)}async set(i,n,t=!1){if(this.state===_.Closed)return;if((0,S.isUndefinedOrNull)(n))return this.delete(i,t);const r=(0,S.isObject)(n)||Array.isArray(n)?(0,E.stringify)(n):String(n);if(this.cache.get(i)!==r)return this.cache.set(i,r),this.pendingInserts.set(i,r),this.pendingDeletes.delete(i),this._onDidChangeStorage.fire({key:i,external:t}),this.doFlush()}async delete(i,n=!1){if(!(this.state===_.Closed||!this.cache.delete(i)))return this.pendingDeletes.has(i)||this.pendingDeletes.add(i),this.pendingInserts.delete(i),this._onDidChangeStorage.fire({key:i,external:n}),this.doFlush()}get hasPending(){return this.pendingInserts.size>0||this.pendingDeletes.size>0}async flushPending(){if(!this.hasPending)return;const i={insert:this.pendingInserts,delete:this.pendingDeletes};return this.pendingDeletes=new Set,this.pendingInserts=new Map,this.database.updateItems(i).finally(()=>{var n;if(!this.hasPending)for(;this.whenFlushedCallbacks.length;)(n=this.whenFlushedCallbacks.pop())===null||n===void 0||n()})}async doFlush(i){return this.options.hint===p.STORAGE_IN_MEMORY?this.flushPending():this.flushDelayer.trigger(()=>this.flushPending(),i)}}e.Storage=v,v.DEFAULT_FLUSH_DELAY=100;class b{constructor(){this.onDidChangeItemsExternal=k.Event.None,this.items=new Map}async updateItems(i){var n,t;(n=i.insert)===null||n===void 0||n.forEach((r,u)=>this.items.set(u,r)),(t=i.delete)===null||t===void 0||t.forEach(r=>this.items.delete(r))}}e.InMemoryStorageDatabase=b}),define(se[328],oe([1,0,2,6,7]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ElementSizeObserver=void 0;class E extends L.Disposable{constructor(p,_){super(),this._onDidChange=this._register(new k.Emitter),this.onDidChange=this._onDidChange.event,this._referenceDomElement=p,this._width=-1,this._height=-1,this._resizeObserver=null,this.measureReferenceDomElement(!1,_)}dispose(){this.stopObserving(),super.dispose()}getWidth(){return this._width}getHeight(){return this._height}startObserving(){if(!this._resizeObserver&&this._referenceDomElement){let p=null;const _=()=>{p?this.observe({width:p.width,height:p.height}):this.observe()};let v=!1,b=!1;const a=()=>{if(v&&!b)try{v=!1,b=!0,_()}finally{(0,y.scheduleAtNextAnimationFrame)((0,y.getWindow)(this._referenceDomElement),()=>{b=!1,a()})}};this._resizeObserver=new ResizeObserver(i=>{i&&i[0]&&i[0].contentRect?p={width:i[0].contentRect.width,height:i[0].contentRect.height}:p=null,v=!0,a()}),this._resizeObserver.observe(this._referenceDomElement)}}stopObserving(){this._resizeObserver&&(this._resizeObserver.disconnect(),this._resizeObserver=null)}observe(p){this.measureReferenceDomElement(!0,p)}measureReferenceDomElement(p,_){let v=0,b=0;_?(v=_.width,b=_.height):this._referenceDomElement&&(v=this._referenceDomElement.clientWidth,b=this._referenceDomElement.clientHeight),v=Math.max(5,v),b=Math.max(5,b),(this._width!==v||this._height!==b)&&(this._width=v,this._height=b,p&&this._onDidChange.fire())}}e.ElementSizeObserver=E}),define(se[605],oe([1,0,7,40,56]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewContentWidgets=void 0;class E extends y.ViewPart{constructor(i,n){super(i),this._viewDomNode=n,this._widgets={},this.domNode=(0,k.createFastDomNode)(document.createElement("div")),y.PartFingerprints.write(this.domNode,1),this.domNode.setClassName("contentWidgets"),this.domNode.setPosition("absolute"),this.domNode.setTop(0),this.overflowingContentWidgetsDomNode=(0,k.createFastDomNode)(document.createElement("div")),y.PartFingerprints.write(this.overflowingContentWidgetsDomNode,2),this.overflowingContentWidgetsDomNode.setClassName("overflowingContentWidgets")}dispose(){super.dispose(),this._widgets={}}onConfigurationChanged(i){const n=Object.keys(this._widgets);for(const t of n)this._widgets[t].onConfigurationChanged(i);return!0}onDecorationsChanged(i){return!0}onFlushed(i){return!0}onLineMappingChanged(i){return this._updateAnchorsViewPositions(),!0}onLinesChanged(i){return this._updateAnchorsViewPositions(),!0}onLinesDeleted(i){return this._updateAnchorsViewPositions(),!0}onLinesInserted(i){return this._updateAnchorsViewPositions(),!0}onScrollChanged(i){return!0}onZonesChanged(i){return!0}_updateAnchorsViewPositions(){const i=Object.keys(this._widgets);for(const n of i)this._widgets[n].updateAnchorViewPosition()}addWidget(i){const n=new S(this._context,this._viewDomNode,i);this._widgets[n.id]=n,n.allowEditorOverflow?this.overflowingContentWidgetsDomNode.appendChild(n.domNode):this.domNode.appendChild(n.domNode),this.setShouldRender()}setWidgetPosition(i,n,t,r,u){this._widgets[i.getId()].setPosition(n,t,r,u),this.setShouldRender()}removeWidget(i){const n=i.getId();if(this._widgets.hasOwnProperty(n)){const t=this._widgets[n];delete this._widgets[n];const r=t.domNode.domNode;r.parentNode.removeChild(r),r.removeAttribute("monaco-visible-content-widget"),this.setShouldRender()}}shouldSuppressMouseDownOnWidget(i){return this._widgets.hasOwnProperty(i)?this._widgets[i].suppressMouseDown:!1}onBeforeRender(i){const n=Object.keys(this._widgets);for(const t of n)this._widgets[t].onBeforeRender(i)}prepareRender(i){const n=Object.keys(this._widgets);for(const t of n)this._widgets[t].prepareRender(i)}render(i){const n=Object.keys(this._widgets);for(const t of n)this._widgets[t].render(i)}}e.ViewContentWidgets=E;class S{constructor(i,n,t){this._primaryAnchor=new p(null,null),this._secondaryAnchor=new p(null,null),this._context=i,this._viewDomNode=n,this._actual=t,this.domNode=(0,k.createFastDomNode)(this._actual.getDomNode()),this.id=this._actual.getId(),this.allowEditorOverflow=this._actual.allowEditorOverflow||!1,this.suppressMouseDown=this._actual.suppressMouseDown||!1;const r=this._context.configuration.options,u=r.get(143);this._fixedOverflowWidgets=r.get(42),this._contentWidth=u.contentWidth,this._contentLeft=u.contentLeft,this._lineHeight=r.get(66),this._affinity=null,this._preference=[],this._cachedDomNodeOffsetWidth=-1,this._cachedDomNodeOffsetHeight=-1,this._maxWidth=this._getMaxWidth(),this._isVisible=!1,this._renderData=null,this.domNode.setPosition(this._fixedOverflowWidgets&&this.allowEditorOverflow?"fixed":"absolute"),this.domNode.setDisplay("none"),this.domNode.setVisibility("hidden"),this.domNode.setAttribute("widgetId",this.id),this.domNode.setMaxWidth(this._maxWidth)}onConfigurationChanged(i){const n=this._context.configuration.options;if(this._lineHeight=n.get(66),i.hasChanged(143)){const t=n.get(143);this._contentLeft=t.contentLeft,this._contentWidth=t.contentWidth,this._maxWidth=this._getMaxWidth()}}updateAnchorViewPosition(){this._setPosition(this._affinity,this._primaryAnchor.modelPosition,this._secondaryAnchor.modelPosition)}_setPosition(i,n,t){this._affinity=i,this._primaryAnchor=r(n,this._context.viewModel,this._affinity),this._secondaryAnchor=r(t,this._context.viewModel,this._affinity);function r(u,f,c){if(!u)return new p(null,null);const d=f.model.validatePosition(u);if(f.coordinatesConverter.modelPositionIsVisible(d)){const s=f.coordinatesConverter.convertModelPositionToViewPosition(d,c??void 0);return new p(u,s)}return new p(u,null)}}_getMaxWidth(){const i=this.domNode.domNode.ownerDocument,n=i.defaultView;return this.allowEditorOverflow?n?.innerWidth||i.documentElement.offsetWidth||i.body.offsetWidth:this._contentWidth}setPosition(i,n,t,r){this._setPosition(r,i,n),this._preference=t,this._primaryAnchor.viewPosition&&this._preference&&this._preference.length>0?this.domNode.setDisplay("block"):this.domNode.setDisplay("none"),this._cachedDomNodeOffsetWidth=-1,this._cachedDomNodeOffsetHeight=-1}_layoutBoxInViewport(i,n,t,r){const u=i.top,f=u,c=i.top+i.height,d=r.viewportHeight-c,s=u-t,l=f>=t,o=c,g=d>=t;let h=i.left;return h+n>r.scrollLeft+r.viewportWidth&&(h=r.scrollLeft+r.viewportWidth-n),h<r.scrollLeft&&(h=r.scrollLeft),{fitsAbove:l,aboveTop:s,fitsBelow:g,belowTop:o,left:h}}_layoutHorizontalSegmentInPage(i,n,t,r){var u;const d=Math.max(15,n.left-r),s=Math.min(n.left+n.width+r,i.width-15),o=this._viewDomNode.domNode.ownerDocument.defaultView;let g=n.left+t-((u=o?.scrollX)!==null&&u!==void 0?u:0);if(g+r>s){const h=g-(s-r);g-=h,t-=h}if(g<d){const h=g-d;g-=h,t-=h}return[t,g]}_layoutBoxInPage(i,n,t,r){var u,f;const c=i.top-t,d=i.top+i.height,s=L.getDomNodePagePosition(this._viewDomNode.domNode),l=this._viewDomNode.domNode.ownerDocument,o=l.defaultView,g=s.top+c-((u=o?.scrollY)!==null&&u!==void 0?u:0),h=s.top+d-((f=o?.scrollY)!==null&&f!==void 0?f:0),m=L.getClientArea(l.body),[C,w]=this._layoutHorizontalSegmentInPage(m,s,i.left-r.scrollLeft+this._contentLeft,n),D=22,I=22,T=g>=D,A=h+t<=m.height-I;return this._fixedOverflowWidgets?{fitsAbove:T,aboveTop:Math.max(g,D),fitsBelow:A,belowTop:h,left:w}:{fitsAbove:T,aboveTop:c,fitsBelow:A,belowTop:d,left:C}}_prepareRenderWidgetAtExactPositionOverflowing(i){return new _(i.top,i.left+this._contentLeft)}_getAnchorsCoordinates(i){var n,t;const r=c(this._primaryAnchor.viewPosition,this._affinity,this._lineHeight),u=((n=this._secondaryAnchor.viewPosition)===null||n===void 0?void 0:n.lineNumber)===((t=this._primaryAnchor.viewPosition)===null||t===void 0?void 0:t.lineNumber)?this._secondaryAnchor.viewPosition:null,f=c(u,this._affinity,this._lineHeight);return{primary:r,secondary:f};function c(d,s,l){if(!d)return null;const o=i.visibleRangeForPosition(d);if(!o)return null;const g=d.column===1&&s===3?0:o.left,h=i.getVerticalOffsetForLineNumber(d.lineNumber)-i.scrollTop;return new v(h,g,l)}}_reduceAnchorCoordinates(i,n,t){if(!n)return i;const r=this._context.configuration.options.get(50);let u=n.left;return u<i.left?u=Math.max(u,i.left-t+r.typicalFullwidthCharacterWidth):u=Math.min(u,i.left+t-r.typicalFullwidthCharacterWidth),new v(i.top,u,i.height)}_prepareRenderWidget(i){if(!this._preference||this._preference.length===0)return null;const{primary:n,secondary:t}=this._getAnchorsCoordinates(i);if(!n)return null;if(this._cachedDomNodeOffsetWidth===-1||this._cachedDomNodeOffsetHeight===-1){let f=null;if(typeof this._actual.beforeRender=="function"&&(f=b(this._actual.beforeRender,this._actual)),f)this._cachedDomNodeOffsetWidth=f.width,this._cachedDomNodeOffsetHeight=f.height;else{const d=this.domNode.domNode.getBoundingClientRect();this._cachedDomNodeOffsetWidth=Math.round(d.width),this._cachedDomNodeOffsetHeight=Math.round(d.height)}}const r=this._reduceAnchorCoordinates(n,t,this._cachedDomNodeOffsetWidth);let u;this.allowEditorOverflow?u=this._layoutBoxInPage(r,this._cachedDomNodeOffsetWidth,this._cachedDomNodeOffsetHeight,i):u=this._layoutBoxInViewport(r,this._cachedDomNodeOffsetWidth,this._cachedDomNodeOffsetHeight,i);for(let f=1;f<=2;f++)for(const c of this._preference)if(c===1){if(!u)return null;if(f===2||u.fitsAbove)return{coordinate:new _(u.aboveTop,u.left),position:1}}else if(c===2){if(!u)return null;if(f===2||u.fitsBelow)return{coordinate:new _(u.belowTop,u.left),position:2}}else return this.allowEditorOverflow?{coordinate:this._prepareRenderWidgetAtExactPositionOverflowing(new _(r.top,r.left)),position:0}:{coordinate:new _(r.top,r.left),position:0};return null}onBeforeRender(i){!this._primaryAnchor.viewPosition||!this._preference||this._primaryAnchor.viewPosition.lineNumber<i.startLineNumber||this._primaryAnchor.viewPosition.lineNumber>i.endLineNumber||this.domNode.setMaxWidth(this._maxWidth)}prepareRender(i){this._renderData=this._prepareRenderWidget(i)}render(i){if(!this._renderData){this._isVisible&&(this.domNode.removeAttribute("monaco-visible-content-widget"),this._isVisible=!1,this.domNode.setVisibility("hidden")),typeof this._actual.afterRender=="function"&&b(this._actual.afterRender,this._actual,null);return}this.allowEditorOverflow?(this.domNode.setTop(this._renderData.coordinate.top),this.domNode.setLeft(this._renderData.coordinate.left)):(this.domNode.setTop(this._renderData.coordinate.top+i.scrollTop-i.bigNumbersDelta),this.domNode.setLeft(this._renderData.coordinate.left)),this._isVisible||(this.domNode.setVisibility("inherit"),this.domNode.setAttribute("monaco-visible-content-widget","true"),this._isVisible=!0),typeof this._actual.afterRender=="function"&&b(this._actual.afterRender,this._actual,this._renderData.position)}}class p{constructor(i,n){this.modelPosition=i,this.viewPosition=n}}class _{constructor(i,n){this.top=i,this.left=n,this._coordinateBrand=void 0}}class v{constructor(i,n,t){this.top=i,this.left=n,this.height=t,this._anchorCoordinateBrand=void 0}}function b(a,i,...n){try{return a.call(i,...n)}catch{return null}}}),define(se[606],oe([1,0,40,56,7,441]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewOverlayWidgets=void 0;class E extends k.ViewPart{constructor(p,_){super(p),this._viewDomNode=_;const b=this._context.configuration.options.get(143);this._widgets={},this._verticalScrollbarWidth=b.verticalScrollbarWidth,this._minimapWidth=b.minimap.minimapWidth,this._horizontalScrollbarHeight=b.horizontalScrollbarHeight,this._editorHeight=b.height,this._editorWidth=b.width,this._viewDomNodeRect={top:0,left:0,width:0,height:0},this._domNode=(0,L.createFastDomNode)(document.createElement("div")),k.PartFingerprints.write(this._domNode,4),this._domNode.setClassName("overlayWidgets"),this.overflowingOverlayWidgetsDomNode=(0,L.createFastDomNode)(document.createElement("div")),k.PartFingerprints.write(this.overflowingOverlayWidgetsDomNode,5),this.overflowingOverlayWidgetsDomNode.setClassName("overflowingOverlayWidgets")}dispose(){super.dispose(),this._widgets={}}getDomNode(){return this._domNode}onConfigurationChanged(p){const v=this._context.configuration.options.get(143);return this._verticalScrollbarWidth=v.verticalScrollbarWidth,this._minimapWidth=v.minimap.minimapWidth,this._horizontalScrollbarHeight=v.horizontalScrollbarHeight,this._editorHeight=v.height,this._editorWidth=v.width,!0}addWidget(p){const _=(0,L.createFastDomNode)(p.getDomNode());this._widgets[p.getId()]={widget:p,preference:null,domNode:_},_.setPosition("absolute"),_.setAttribute("widgetId",p.getId()),p.allowEditorOverflow?this.overflowingOverlayWidgetsDomNode.appendChild(_):this._domNode.appendChild(_),this.setShouldRender(),this._updateMaxMinWidth()}setWidgetPosition(p,_){const v=this._widgets[p.getId()];return v.preference===_?(this._updateMaxMinWidth(),!1):(v.preference=_,this.setShouldRender(),this._updateMaxMinWidth(),!0)}removeWidget(p){const _=p.getId();if(this._widgets.hasOwnProperty(_)){const b=this._widgets[_].domNode.domNode;delete this._widgets[_],b.remove(),this.setShouldRender(),this._updateMaxMinWidth()}}_updateMaxMinWidth(){var p,_;let v=0;const b=Object.keys(this._widgets);for(let a=0,i=b.length;a<i;a++){const n=b[a],r=(_=(p=this._widgets[n].widget).getMinContentWidthInPx)===null||_===void 0?void 0:_.call(p);typeof r<"u"&&(v=Math.max(v,r))}this._context.viewLayout.setOverlayWidgetsMinWidth(v)}_renderWidget(p){const _=p.domNode;if(p.preference===null){_.setTop("");return}if(p.preference===0)_.setTop(0),_.setRight(2*this._verticalScrollbarWidth+this._minimapWidth);else if(p.preference===1){const v=_.domNode.clientHeight;_.setTop(this._editorHeight-v-2*this._horizontalScrollbarHeight),_.setRight(2*this._verticalScrollbarWidth+this._minimapWidth)}else if(p.preference===2)_.setTop(0),_.domNode.style.right="50%";else{const{top:v,left:b}=p.preference;if(this._context.configuration.options.get(42)&&p.widget.allowEditorOverflow){const i=this._viewDomNodeRect;_.setTop(v+i.top),_.setLeft(b+i.left),_.setPosition("fixed")}else _.setTop(v),_.setLeft(b),_.setPosition("absolute")}}prepareRender(p){this._viewDomNodeRect=y.getDomNodePagePosition(this._viewDomNode.domNode)}render(p){this._domNode.setWidth(this._editorWidth);const _=Object.keys(this._widgets);for(let v=0,b=_.length;v<b;v++){const a=_[v];this._renderWidget(this._widgets[a])}}}e.ViewOverlayWidgets=E}),define(se[607],oe([1,0,7,12,2]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeEditorContributions=void 0;class E extends y.Disposable{constructor(){super(),this._editor=null,this._instantiationService=null,this._instances=this._register(new y.DisposableMap),this._pending=new Map,this._finishedInstantiation=[],this._finishedInstantiation[0]=!1,this._finishedInstantiation[1]=!1,this._finishedInstantiation[2]=!1,this._finishedInstantiation[3]=!1}initialize(p,_,v){this._editor=p,this._instantiationService=v;for(const b of _){if(this._pending.has(b.id)){(0,k.onUnexpectedError)(new Error(`Cannot have two contributions with the same id ${b.id}`));continue}this._pending.set(b.id,b)}this._instantiateSome(0),this._register((0,L.runWhenWindowIdle)((0,L.getWindow)(this._editor.getDomNode()),()=>{this._instantiateSome(1)})),this._register((0,L.runWhenWindowIdle)((0,L.getWindow)(this._editor.getDomNode()),()=>{this._instantiateSome(2)})),this._register((0,L.runWhenWindowIdle)((0,L.getWindow)(this._editor.getDomNode()),()=>{this._instantiateSome(3)},5e3))}saveViewState(){const p={};for(const[_,v]of this._instances)typeof v.saveViewState=="function"&&(p[_]=v.saveViewState());return p}restoreViewState(p){for(const[_,v]of this._instances)typeof v.restoreViewState=="function"&&v.restoreViewState(p[_])}get(p){return this._instantiateById(p),this._instances.get(p)||null}onBeforeInteractionEvent(){this._instantiateSome(2)}onAfterModelAttached(){var p;this._register((0,L.runWhenWindowIdle)((0,L.getWindow)((p=this._editor)===null||p===void 0?void 0:p.getDomNode()),()=>{this._instantiateSome(1)},50))}_instantiateSome(p){if(this._finishedInstantiation[p])return;this._finishedInstantiation[p]=!0;const _=this._findPendingContributionsByInstantiation(p);for(const v of _)this._instantiateById(v.id)}_findPendingContributionsByInstantiation(p){const _=[];for(const[,v]of this._pending)v.instantiation===p&&_.push(v);return _}_instantiateById(p){const _=this._pending.get(p);if(_){if(this._pending.delete(p),!this._instantiationService||!this._editor)throw new Error("Cannot instantiate contributions before being initialized!");try{const v=this._instantiationService.createInstance(_.ctor,this._editor);this._instances.set(_.id,v),typeof v.restoreViewState=="function"&&_.instantiation!==0&&console.warn(`Editor contribution '${_.id}' should be eager instantiated because it uses saveViewState / restoreViewState.`)}catch(v){(0,k.onUnexpectedError)(v)}}}}e.CodeEditorContributions=E}),define(se[608],oe([1,0,158,2,35]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorSash=void 0;class E extends k.Disposable{constructor(p,_,v,b){super(),this._options=p,this._domNode=_,this._dimensions=v,this._sashes=b,this._sashRatio=(0,y.observableValue)(this,void 0),this.sashLeft=(0,y.derived)(this,a=>{var i;const n=(i=this._sashRatio.read(a))!==null&&i!==void 0?i:this._options.splitViewDefaultRatio.read(a);return this._computeSashLeft(n,a)}),this._sash=this._register(new L.Sash(this._domNode,{getVerticalSashTop:a=>0,getVerticalSashLeft:a=>this.sashLeft.get(),getVerticalSashHeight:a=>this._dimensions.height.get()},{orientation:0})),this._startSashPosition=void 0,this._register(this._sash.onDidStart(()=>{this._startSashPosition=this.sashLeft.get()})),this._register(this._sash.onDidChange(a=>{const i=this._dimensions.width.get(),n=this._computeSashLeft((this._startSashPosition+(a.currentX-a.startX))/i,void 0);this._sashRatio.set(n/i,void 0)})),this._register(this._sash.onDidEnd(()=>this._sash.layout())),this._register(this._sash.onDidReset(()=>this._sashRatio.set(void 0,void 0))),this._register((0,y.autorun)(a=>{const i=this._sashes.read(a);i&&(this._sash.orthogonalEndSash=i.bottom)})),this._register((0,y.autorun)(a=>{const i=this._options.enableSplitViewResizing.read(a);this._sash.state=i?3:0,this.sashLeft.read(a),this._dimensions.height.read(a),this._sash.layout()}))}_computeSashLeft(p,_){const v=this._dimensions.width.read(_),b=Math.floor(this._options.splitViewDefaultRatio.read(_)*v),a=this._options.enableSplitViewResizing.read(_)?Math.floor(p*v):b,i=100;return v<=i*2?b:a<i?i:a>v-i?v-i:a}}e.DiffEditorSash=E}),define(se[87],oe([1,0,60,19,585,2,35,328,10,5,91]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.filterWithPrevious=e.bindContextKey=e.translatePosition=e.DisposableCancellationTokenSource=e.applyViewZones=e.observeHotReloadableExports=e.readHotReloadableExport=e.applyStyle=e.ManagedOverlayWidget=e.PlaceholderViewZone=e.ViewZoneOverlayWidget=e.animatedObservable=e.ObservableElementSizeObserver=e.appendRemoveOnDispose=e.applyObservableDecorations=e.joinCombine=void 0;function a(T,A,P,N){if(T.length===0)return A;if(A.length===0)return T;const M=[];let R=0,x=0;for(;R<T.length&&x<A.length;){const O=T[R],B=A[x],W=P(O),V=P(B);W<V?(M.push(O),R++):W>V?(M.push(B),x++):(M.push(N(O,B)),R++,x++)}for(;R<T.length;)M.push(T[R]),R++;for(;x<A.length;)M.push(A[x]),x++;return M}e.joinCombine=a;function i(T,A){const P=new E.DisposableStore,N=T.createDecorationsCollection();return P.add((0,S.autorunOpts)({debugName:()=>`Apply decorations from ${A.debugName}`},M=>{const R=A.read(M);N.set(R)})),P.add({dispose:()=>{N.clear()}}),P}e.applyObservableDecorations=i;function n(T,A){return T.appendChild(A),(0,E.toDisposable)(()=>{T.removeChild(A)})}e.appendRemoveOnDispose=n;class t extends E.Disposable{get width(){return this._width}get height(){return this._height}constructor(A,P){super(),this.elementSizeObserver=this._register(new p.ElementSizeObserver(A,P)),this._width=(0,S.observableValue)(this,this.elementSizeObserver.getWidth()),this._height=(0,S.observableValue)(this,this.elementSizeObserver.getHeight()),this._register(this.elementSizeObserver.onDidChange(N=>(0,S.transaction)(M=>{this._width.set(this.elementSizeObserver.getWidth(),M),this._height.set(this.elementSizeObserver.getHeight(),M)})))}observe(A){this.elementSizeObserver.observe(A)}setAutomaticLayout(A){A?this.elementSizeObserver.startObserving():this.elementSizeObserver.stopObserving()}}e.ObservableElementSizeObserver=t;function r(T,A,P){let N=A.get(),M=N,R=N;const x=(0,S.observableValue)("animatedValue",N);let O=-1;const B=300;let W;P.add((0,S.autorunHandleChanges)({createEmptyChangeSummary:()=>({animate:!1}),handleChange:(K,F)=>(K.didChange(A)&&(F.animate=F.animate||K.change),!0)},(K,F)=>{W!==void 0&&(T.cancelAnimationFrame(W),W=void 0),M=R,N=A.read(K),O=Date.now()-(F.animate?0:B),V()}));function V(){const K=Date.now()-O;R=Math.floor(u(K,M,N-M,B)),K<B?W=T.requestAnimationFrame(V):R=N,x.set(R,void 0)}return x}e.animatedObservable=r;function u(T,A,P,N){return T===N?A+P:P*(-Math.pow(2,-10*T/N)+1)+A}class f extends E.Disposable{constructor(A,P,N){super(),this._register(new d(A,N)),this._register(s(N,{height:P.actualHeight,top:P.actualTop}))}}e.ViewZoneOverlayWidget=f;class c{get afterLineNumber(){return this._afterLineNumber.get()}constructor(A,P){this._afterLineNumber=A,this.heightInPx=P,this.domNode=document.createElement("div"),this._actualTop=(0,S.observableValue)(this,void 0),this._actualHeight=(0,S.observableValue)(this,void 0),this.actualTop=this._actualTop,this.actualHeight=this._actualHeight,this.showInHiddenAreas=!0,this.onChange=this._afterLineNumber,this.onDomNodeTop=N=>{this._actualTop.set(N,void 0)},this.onComputedHeight=N=>{this._actualHeight.set(N,void 0)}}}e.PlaceholderViewZone=c;class d{constructor(A,P){this._editor=A,this._domElement=P,this._overlayWidgetId=`managedOverlayWidget-${d._counter++}`,this._overlayWidget={getId:()=>this._overlayWidgetId,getDomNode:()=>this._domElement,getPosition:()=>null},this._editor.addOverlayWidget(this._overlayWidget)}dispose(){this._editor.removeOverlayWidget(this._overlayWidget)}}e.ManagedOverlayWidget=d,d._counter=0;function s(T,A){return(0,S.autorun)(P=>{for(let[N,M]of Object.entries(A))M&&typeof M=="object"&&"read"in M&&(M=M.read(P)),typeof M=="number"&&(M=`${M}px`),N=N.replace(/[A-Z]/g,R=>"-"+R.toLowerCase()),T.style[N]=M})}e.applyStyle=s;function l(T,A){return o([T],A),T}e.readHotReloadableExport=l;function o(T,A){(0,y.isHotReloadEnabled)()&&(0,S.observableSignalFromEvent)("reload",N=>(0,y.registerHotReloadHandler)(({oldExports:M})=>{if([...Object.values(M)].some(R=>T.includes(R)))return R=>(N(void 0),!0)})).read(A)}e.observeHotReloadableExports=o;function g(T,A,P,N){const M=new E.DisposableStore,R=[];return M.add((0,S.autorunWithStore)((x,O)=>{const B=A.read(x),W=new Map,V=new Map;P&&P(!0),T.changeViewZones(K=>{for(const F of R)K.removeZone(F),N?.delete(F);R.length=0;for(const F of B){const q=K.addZone(F);F.setZoneId&&F.setZoneId(q),R.push(q),N?.add(q),W.set(F,q)}}),P&&P(!1),O.add((0,S.autorunHandleChanges)({createEmptyChangeSummary(){return{zoneIds:[]}},handleChange(K,F){const q=V.get(K.changedObservable);return q!==void 0&&F.zoneIds.push(q),!0}},(K,F)=>{for(const q of B)q.onChange&&(V.set(q.onChange,W.get(q)),q.onChange.read(K));P&&P(!0),T.changeViewZones(q=>{for(const ie of F.zoneIds)q.layoutZone(ie)}),P&&P(!1)}))})),M.add({dispose(){P&&P(!0),T.changeViewZones(x=>{for(const O of R)x.removeZone(O)}),N?.clear(),P&&P(!1)}}),M}e.applyViewZones=g;class h extends k.CancellationTokenSource{dispose(){super.dispose(!0)}}e.DisposableCancellationTokenSource=h;function m(T,A){const P=(0,L.findLast)(A,M=>M.original.startLineNumber<=T.lineNumber);if(!P)return v.Range.fromPositions(T);if(P.original.endLineNumberExclusive<=T.lineNumber){const M=T.lineNumber-P.original.endLineNumberExclusive+P.modified.endLineNumberExclusive;return v.Range.fromPositions(new _.Position(M,T.column))}if(!P.innerChanges)return v.Range.fromPositions(new _.Position(P.modified.startLineNumber,1));const N=(0,L.findLast)(P.innerChanges,M=>M.originalRange.getStartPosition().isBeforeOrEqual(T));if(!N){const M=T.lineNumber-P.original.startLineNumber+P.modified.startLineNumber;return v.Range.fromPositions(new _.Position(M,T.column))}if(N.originalRange.containsPosition(T))return N.modifiedRange;{const M=C(N.originalRange.getEndPosition(),T);return v.Range.fromPositions(w(N.modifiedRange.getEndPosition(),M))}}e.translatePosition=m;function C(T,A){return T.lineNumber===A.lineNumber?new b.LengthObj(0,A.column-T.column):new b.LengthObj(A.lineNumber-T.lineNumber,A.column-1)}function w(T,A){return A.lineCount===0?new _.Position(T.lineNumber,T.column+A.columnCount):new _.Position(T.lineNumber+A.lineCount,A.columnCount+1)}function D(T,A,P){const N=T.bindTo(A);return(0,S.autorunOpts)({debugName:()=>`Update ${T.key}`},M=>{N.set(P(M))})}e.bindContextKey=D;function I(T,A){let P;return T.filter(N=>{const M=A(N,P);return P=N,M})}e.filterWithPrevious=I}),define(se[102],oe([1,0,11,17,144]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StringBuilder=e.decodeUTF16LE=e.getPlatformTextDecoder=void 0;let E;function S(){return E||(E=new TextDecoder("UTF-16LE")),E}let p;function _(){return p||(p=new TextDecoder("UTF-16BE")),p}let v;function b(){return v||(v=k.isLittleEndian()?S():_()),v}e.getPlatformTextDecoder=b;function a(t,r,u){const f=new Uint16Array(t.buffer,r,u);return u>0&&(f[0]===65279||f[0]===65534)?i(t,r,u):S().decode(f)}e.decodeUTF16LE=a;function i(t,r,u){const f=[];let c=0;for(let d=0;d<u;d++){const s=y.readUInt16LE(t,r);r+=2,f[c++]=String.fromCharCode(s)}return f.join("")}class n{constructor(r){this._capacity=r|0,this._buffer=new Uint16Array(this._capacity),this._completedStrings=null,this._bufferLength=0}reset(){this._completedStrings=null,this._bufferLength=0}build(){return this._completedStrings!==null?(this._flushBuffer(),this._completedStrings.join("")):this._buildBuffer()}_buildBuffer(){if(this._bufferLength===0)return"";const r=new Uint16Array(this._buffer.buffer,0,this._bufferLength);return b().decode(r)}_flushBuffer(){const r=this._buildBuffer();this._bufferLength=0,this._completedStrings===null?this._completedStrings=[r]:this._completedStrings[this._completedStrings.length]=r}appendCharCode(r){const u=this._capacity-this._bufferLength;u<=1&&(u===0||L.isHighSurrogate(r))&&this._flushBuffer(),this._buffer[this._bufferLength++]=r}appendASCIICharCode(r){this._bufferLength===this._capacity&&this._flushBuffer(),this._buffer[this._bufferLength++]=r}appendString(r){const u=r.length;if(this._bufferLength+u>=this._capacity){this._flushBuffer(),this._completedStrings[this._completedStrings.length]=r;return}for(let f=0;f<u;f++)this._buffer[this._bufferLength++]=r.charCodeAt(f)}}e.StringBuilder=n}),define(se[609],oe([1,0,93,11,20,72,102,294,114]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DOMLineBreaksComputerFactory=void 0;const v=(0,L.createTrustedTypesPolicy)("domLineBreaksComputer",{createHTML:u=>u});class b{static create(f){return new b(new WeakRef(f))}constructor(f){this.targetWindow=f}createLineBreaksComputer(f,c,d,s,l){const o=[],g=[];return{addRequest:(h,m,C)=>{o.push(h),g.push(m)},finalize:()=>a((0,y.assertIsDefined)(this.targetWindow.deref()),o,f,c,d,s,l,g)}}}e.DOMLineBreaksComputerFactory=b;function a(u,f,c,d,s,l,o,g){var h;function m(F){const q=g[F];if(q){const ie=_.LineInjectedText.applyInjectedText(f[F],q),ae=q.map($=>$.options),ne=q.map($=>$.column-1);return new p.ModelLineProjectionData(ne,ae,[ie.length],[],0)}else return null}if(s===-1){const F=[];for(let q=0,ie=f.length;q<ie;q++)F[q]=m(q);return F}const C=Math.round(s*c.typicalHalfwidthCharacterWidth),D=Math.round(d*(l===3?2:l===2?1:0)),I=Math.ceil(c.spaceWidth*D),T=document.createElement("div");(0,E.applyFontInfo)(T,c);const A=new S.StringBuilder(1e4),P=[],N=[],M=[],R=[],x=[];for(let F=0;F<f.length;F++){const q=_.LineInjectedText.applyInjectedText(f[F],g[F]);let ie=0,ae=0,ne=C;if(l!==0)if(ie=k.firstNonWhitespaceIndex(q),ie===-1)ie=0;else{for(let re=0;re<ie;re++){const de=q.charCodeAt(re)===9?d-ae%d:1;ae+=de}const Q=Math.ceil(c.spaceWidth*ae);Q+c.typicalFullwidthCharacterWidth>C?(ie=0,ae=0):ne=C-Q}const $=q.substr(ie),J=i($,ae,d,ne,A,I);P[F]=ie,N[F]=ae,M[F]=$,R[F]=J[0],x[F]=J[1]}const O=A.build(),B=(h=v?.createHTML(O))!==null&&h!==void 0?h:O;T.innerHTML=B,T.style.position="absolute",T.style.top="10000",o==="keepAll"?(T.style.wordBreak="keep-all",T.style.overflowWrap="anywhere"):(T.style.wordBreak="inherit",T.style.overflowWrap="break-word"),u.document.body.appendChild(T);const W=document.createRange(),V=Array.prototype.slice.call(T.children,0),K=[];for(let F=0;F<f.length;F++){const q=V[F],ie=n(W,q,M[F],R[F]);if(ie===null){K[F]=m(F);continue}const ae=P[F],ne=N[F]+D,$=x[F],J=[];for(let he=0,me=ie.length;he<me;he++)J[he]=$[ie[he]];if(ae!==0)for(let he=0,me=ie.length;he<me;he++)ie[he]+=ae;let Q,re;const de=g[F];de?(Q=de.map(he=>he.options),re=de.map(he=>he.column-1)):(Q=null,re=null),K[F]=new p.ModelLineProjectionData(re,Q,ie,J,ne)}return u.document.body.removeChild(T),K}function i(u,f,c,d,s,l){if(l!==0){const D=String(l);s.appendString('<div style="text-indent: -'),s.appendString(D),s.appendString("px; padding-left: "),s.appendString(D),s.appendString("px; box-sizing: border-box; width:")}else s.appendString('<div style="width:');s.appendString(String(d)),s.appendString('px;">');const o=u.length;let g=f,h=0;const m=[],C=[];let w=0<o?u.charCodeAt(0):0;s.appendString("<span>");for(let D=0;D<o;D++){D!==0&&D%16384===0&&s.appendString("</span><span>"),m[D]=h,C[D]=g;const I=w;w=D+1<o?u.charCodeAt(D+1):0;let T=1,A=1;switch(I){case 9:T=c-g%c,A=T;for(let P=1;P<=T;P++)P<T?s.appendCharCode(160):s.appendASCIICharCode(32);break;case 32:w===32?s.appendCharCode(160):s.appendASCIICharCode(32);break;case 60:s.appendString("&lt;");break;case 62:s.appendString("&gt;");break;case 38:s.appendString("&amp;");break;case 0:s.appendString("&#00;");break;case 65279:case 8232:case 8233:case 133:s.appendCharCode(65533);break;default:k.isFullWidthCharacter(I)&&A++,I<32?s.appendCharCode(9216+I):s.appendCharCode(I)}h+=T,g+=A}return s.appendString("</span>"),m[u.length]=h,C[u.length]=g,s.appendString("</div>"),[m,C]}function n(u,f,c,d){if(c.length<=1)return null;const s=Array.prototype.slice.call(f.children,0),l=[];try{t(u,s,d,0,null,c.length-1,null,l)}catch(o){return console.log(o),null}return l.length===0?null:(l.push(c.length),l)}function t(u,f,c,d,s,l,o,g){if(d===l||(s=s||r(u,f,c[d],c[d+1]),o=o||r(u,f,c[l],c[l+1]),Math.abs(s[0].top-o[0].top)<=.1))return;if(d+1===l){g.push(l);return}const h=d+(l-d)/2|0,m=r(u,f,c[h],c[h+1]);t(u,f,c,d,s,h,m,g),t(u,f,c,h,m,l,o,g)}function r(u,f,c,d){return u.setStart(f[c/16384|0].firstChild,c%16384),u.setEnd(f[d/16384|0].firstChild,d%16384),u.getClientRects()}}),define(se[233],oe([1,0,40,93,12,102]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.VisibleLinesCollection=e.RenderedLinesCollection=void 0;class S{constructor(b){this._createLine=b,this._set(1,[])}flush(){this._set(1,[])}_set(b,a){this._lines=a,this._rendLineNumberStart=b}_get(){return{rendLineNumberStart:this._rendLineNumberStart,lines:this._lines}}getStartLineNumber(){return this._rendLineNumberStart}getEndLineNumber(){return this._rendLineNumberStart+this._lines.length-1}getCount(){return this._lines.length}getLine(b){const a=b-this._rendLineNumberStart;if(a<0||a>=this._lines.length)throw new y.BugIndicatingError("Illegal value for lineNumber");return this._lines[a]}onLinesDeleted(b,a){if(this.getCount()===0)return null;const i=this.getStartLineNumber(),n=this.getEndLineNumber();if(a<i){const f=a-b+1;return this._rendLineNumberStart-=f,null}if(b>n)return null;let t=0,r=0;for(let f=i;f<=n;f++){const c=f-this._rendLineNumberStart;b<=f&&f<=a&&(r===0?(t=c,r=1):r++)}if(b<i){let f=0;a<i?f=a-b+1:f=i-b,this._rendLineNumberStart-=f}return this._lines.splice(t,r)}onLinesChanged(b,a){const i=b+a-1;if(this.getCount()===0)return!1;const n=this.getStartLineNumber(),t=this.getEndLineNumber();let r=!1;for(let u=b;u<=i;u++)u>=n&&u<=t&&(this._lines[u-this._rendLineNumberStart].onContentChanged(),r=!0);return r}onLinesInserted(b,a){if(this.getCount()===0)return null;const i=a-b+1,n=this.getStartLineNumber(),t=this.getEndLineNumber();if(b<=n)return this._rendLineNumberStart+=i,null;if(b>t)return null;if(i+b>t)return this._lines.splice(b-this._rendLineNumberStart,t-b+1);const r=[];for(let s=0;s<i;s++)r[s]=this._createLine();const u=b-this._rendLineNumberStart,f=this._lines.slice(0,u),c=this._lines.slice(u,this._lines.length-i),d=this._lines.slice(this._lines.length-i,this._lines.length);return this._lines=f.concat(r).concat(c),d}onTokensChanged(b){if(this.getCount()===0)return!1;const a=this.getStartLineNumber(),i=this.getEndLineNumber();let n=!1;for(let t=0,r=b.length;t<r;t++){const u=b[t];if(u.toLineNumber<a||u.fromLineNumber>i)continue;const f=Math.max(a,u.fromLineNumber),c=Math.min(i,u.toLineNumber);for(let d=f;d<=c;d++){const s=d-this._rendLineNumberStart;this._lines[s].onTokensChanged(),n=!0}}return n}}e.RenderedLinesCollection=S;class p{constructor(b){this._host=b,this.domNode=this._createDomNode(),this._linesCollection=new S(()=>this._host.createVisibleLine())}_createDomNode(){const b=(0,L.createFastDomNode)(document.createElement("div"));return b.setClassName("view-layer"),b.setPosition("absolute"),b.domNode.setAttribute("role","presentation"),b.domNode.setAttribute("aria-hidden","true"),b}onConfigurationChanged(b){return!!b.hasChanged(143)}onFlushed(b){return this._linesCollection.flush(),!0}onLinesChanged(b){return this._linesCollection.onLinesChanged(b.fromLineNumber,b.count)}onLinesDeleted(b){const a=this._linesCollection.onLinesDeleted(b.fromLineNumber,b.toLineNumber);if(a)for(let i=0,n=a.length;i<n;i++){const t=a[i].getDomNode();t&&this.domNode.domNode.removeChild(t)}return!0}onLinesInserted(b){const a=this._linesCollection.onLinesInserted(b.fromLineNumber,b.toLineNumber);if(a)for(let i=0,n=a.length;i<n;i++){const t=a[i].getDomNode();t&&this.domNode.domNode.removeChild(t)}return!0}onScrollChanged(b){return b.scrollTopChanged}onTokensChanged(b){return this._linesCollection.onTokensChanged(b.ranges)}onZonesChanged(b){return!0}getStartLineNumber(){return this._linesCollection.getStartLineNumber()}getEndLineNumber(){return this._linesCollection.getEndLineNumber()}getVisibleLine(b){return this._linesCollection.getLine(b)}renderLines(b){const a=this._linesCollection._get(),i=new _(this.domNode.domNode,this._host,b),n={rendLineNumberStart:a.rendLineNumberStart,lines:a.lines,linesLength:a.lines.length},t=i.render(n,b.startLineNumber,b.endLineNumber,b.relativeVerticalOffset);this._linesCollection._set(t.rendLineNumberStart,t.lines)}}e.VisibleLinesCollection=p;class _{constructor(b,a,i){this.domNode=b,this.host=a,this.viewportData=i}render(b,a,i,n){const t={rendLineNumberStart:b.rendLineNumberStart,lines:b.lines.slice(0),linesLength:b.linesLength};if(t.rendLineNumberStart+t.linesLength-1<a||i<t.rendLineNumberStart){t.rendLineNumberStart=a,t.linesLength=i-a+1,t.lines=[];for(let r=a;r<=i;r++)t.lines[r-a]=this.host.createVisibleLine();return this._finishRendering(t,!0,n),t}if(this._renderUntouchedLines(t,Math.max(a-t.rendLineNumberStart,0),Math.min(i-t.rendLineNumberStart,t.linesLength-1),n,a),t.rendLineNumberStart>a){const r=a,u=Math.min(i,t.rendLineNumberStart-1);r<=u&&(this._insertLinesBefore(t,r,u,n,a),t.linesLength+=u-r+1)}else if(t.rendLineNumberStart<a){const r=Math.min(t.linesLength,a-t.rendLineNumberStart);r>0&&(this._removeLinesBefore(t,r),t.linesLength-=r)}if(t.rendLineNumberStart=a,t.rendLineNumberStart+t.linesLength-1<i){const r=t.rendLineNumberStart+t.linesLength,u=i;r<=u&&(this._insertLinesAfter(t,r,u,n,a),t.linesLength+=u-r+1)}else if(t.rendLineNumberStart+t.linesLength-1>i){const r=Math.max(0,i-t.rendLineNumberStart+1),f=t.linesLength-1-r+1;f>0&&(this._removeLinesAfter(t,f),t.linesLength-=f)}return this._finishRendering(t,!1,n),t}_renderUntouchedLines(b,a,i,n,t){const r=b.rendLineNumberStart,u=b.lines;for(let f=a;f<=i;f++){const c=r+f;u[f].layoutLine(c,n[c-t])}}_insertLinesBefore(b,a,i,n,t){const r=[];let u=0;for(let f=a;f<=i;f++)r[u++]=this.host.createVisibleLine();b.lines=r.concat(b.lines)}_removeLinesBefore(b,a){for(let i=0;i<a;i++){const n=b.lines[i].getDomNode();n&&this.domNode.removeChild(n)}b.lines.splice(0,a)}_insertLinesAfter(b,a,i,n,t){const r=[];let u=0;for(let f=a;f<=i;f++)r[u++]=this.host.createVisibleLine();b.lines=b.lines.concat(r)}_removeLinesAfter(b,a){const i=b.linesLength-a;for(let n=0;n<a;n++){const t=b.lines[i+n].getDomNode();t&&this.domNode.removeChild(t)}b.lines.splice(i,a)}_finishRenderingNewLines(b,a,i,n){_._ttPolicy&&(i=_._ttPolicy.createHTML(i));const t=this.domNode.lastChild;a||!t?this.domNode.innerHTML=i:t.insertAdjacentHTML("afterend",i);let r=this.domNode.lastChild;for(let u=b.linesLength-1;u>=0;u--){const f=b.lines[u];n[u]&&(f.setDomNode(r),r=r.previousSibling)}}_finishRenderingInvalidLines(b,a,i){const n=document.createElement("div");_._ttPolicy&&(a=_._ttPolicy.createHTML(a)),n.innerHTML=a;for(let t=0;t<b.linesLength;t++){const r=b.lines[t];if(i[t]){const u=n.firstChild,f=r.getDomNode();f.parentNode.replaceChild(u,f),r.setDomNode(u)}}}_finishRendering(b,a,i){const n=_._sb,t=b.linesLength,r=b.lines,u=b.rendLineNumberStart,f=[];{n.reset();let c=!1;for(let d=0;d<t;d++){const s=r[d];f[d]=!1,!(s.getDomNode()||!s.renderLine(d+u,i[d],this.viewportData,n))&&(f[d]=!0,c=!0)}c&&this._finishRenderingNewLines(b,a,n.build(),f)}{n.reset();let c=!1;const d=[];for(let s=0;s<t;s++){const l=r[s];d[s]=!1,!(f[s]||!l.renderLine(s+u,i[s],this.viewportData,n))&&(d[s]=!0,c=!0)}c&&this._finishRenderingInvalidLines(b,n.build(),d)}}}_._ttPolicy=(0,k.createTrustedTypesPolicy)("editorViewLayer",{createHTML:v=>v}),_._sb=new E.StringBuilder(1e5)}),define(se[610],oe([1,0,40,72,233,56]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarginViewOverlays=e.ContentViewOverlays=e.ViewOverlayLine=e.ViewOverlays=void 0;class S extends E.ViewPart{constructor(a){super(a),this._visibleLines=new y.VisibleLinesCollection(this),this.domNode=this._visibleLines.domNode;const n=this._context.configuration.options.get(50);(0,k.applyFontInfo)(this.domNode,n),this._dynamicOverlays=[],this._isFocused=!1,this.domNode.setClassName("view-overlays")}shouldRender(){if(super.shouldRender())return!0;for(let a=0,i=this._dynamicOverlays.length;a<i;a++)if(this._dynamicOverlays[a].shouldRender())return!0;return!1}dispose(){super.dispose();for(let a=0,i=this._dynamicOverlays.length;a<i;a++)this._dynamicOverlays[a].dispose();this._dynamicOverlays=[]}getDomNode(){return this.domNode}createVisibleLine(){return new p(this._context.configuration,this._dynamicOverlays)}addDynamicOverlay(a){this._dynamicOverlays.push(a)}onConfigurationChanged(a){this._visibleLines.onConfigurationChanged(a);const i=this._visibleLines.getStartLineNumber(),n=this._visibleLines.getEndLineNumber();for(let u=i;u<=n;u++)this._visibleLines.getVisibleLine(u).onConfigurationChanged(a);const r=this._context.configuration.options.get(50);return(0,k.applyFontInfo)(this.domNode,r),!0}onFlushed(a){return this._visibleLines.onFlushed(a)}onFocusChanged(a){return this._isFocused=a.isFocused,!0}onLinesChanged(a){return this._visibleLines.onLinesChanged(a)}onLinesDeleted(a){return this._visibleLines.onLinesDeleted(a)}onLinesInserted(a){return this._visibleLines.onLinesInserted(a)}onScrollChanged(a){return this._visibleLines.onScrollChanged(a)||!0}onTokensChanged(a){return this._visibleLines.onTokensChanged(a)}onZonesChanged(a){return this._visibleLines.onZonesChanged(a)}prepareRender(a){const i=this._dynamicOverlays.filter(n=>n.shouldRender());for(let n=0,t=i.length;n<t;n++){const r=i[n];r.prepareRender(a),r.onDidRender()}}render(a){this._viewOverlaysRender(a),this.domNode.toggleClassName("focused",this._isFocused)}_viewOverlaysRender(a){this._visibleLines.renderLines(a.viewportData)}}e.ViewOverlays=S;class p{constructor(a,i){this._configuration=a,this._lineHeight=this._configuration.options.get(66),this._dynamicOverlays=i,this._domNode=null,this._renderedContent=null}getDomNode(){return this._domNode?this._domNode.domNode:null}setDomNode(a){this._domNode=(0,L.createFastDomNode)(a)}onContentChanged(){}onTokensChanged(){}onConfigurationChanged(a){this._lineHeight=this._configuration.options.get(66)}renderLine(a,i,n,t){let r="";for(let u=0,f=this._dynamicOverlays.length;u<f;u++){const c=this._dynamicOverlays[u];r+=c.render(n.startLineNumber,a)}return this._renderedContent===r?!1:(this._renderedContent=r,t.appendString('<div style="position:absolute;top:'),t.appendString(String(i)),t.appendString("px;width:100%;height:"),t.appendString(String(this._lineHeight)),t.appendString('px;">'),t.appendString(r),t.appendString("</div>"),!0)}layoutLine(a,i){this._domNode&&(this._domNode.setTop(i),this._domNode.setHeight(this._lineHeight))}}e.ViewOverlayLine=p;class _ extends S{constructor(a){super(a);const n=this._context.configuration.options.get(143);this._contentWidth=n.contentWidth,this.domNode.setHeight(0)}onConfigurationChanged(a){const n=this._context.configuration.options.get(143);return this._contentWidth=n.contentWidth,super.onConfigurationChanged(a)||!0}onScrollChanged(a){return super.onScrollChanged(a)||a.scrollWidthChanged}_viewOverlaysRender(a){super._viewOverlaysRender(a),this.domNode.setWidth(Math.max(a.scrollWidth,this._contentWidth))}}e.ContentViewOverlays=_;class v extends S{constructor(a){super(a);const i=this._context.configuration.options,n=i.get(143);this._contentLeft=n.contentLeft,this.domNode.setClassName("margin-view-overlays"),this.domNode.setWidth(1),(0,k.applyFontInfo)(this.domNode,i.get(50))}onConfigurationChanged(a){const i=this._context.configuration.options;(0,k.applyFontInfo)(this.domNode,i.get(50));const n=i.get(143);return this._contentLeft=n.contentLeft,super.onConfigurationChanged(a)||!0}onScrollChanged(a){return super.onScrollChanged(a)||a.scrollHeightChanged}_viewOverlaysRender(a){super._viewOverlaysRender(a);const i=Math.min(a.scrollHeight,1e6);this.domNode.setHeight(i),this.domNode.setWidth(this._contentLeft)}}e.MarginViewOverlays=v}),define(se[329],oe([1,0,144,102]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compressConsecutiveTextChanges=e.TextChange=void 0;function y(_){return _.replace(/\n/g,"\\n").replace(/\r/g,"\\r")}class E{get oldLength(){return this.oldText.length}get oldEnd(){return this.oldPosition+this.oldText.length}get newLength(){return this.newText.length}get newEnd(){return this.newPosition+this.newText.length}constructor(v,b,a,i){this.oldPosition=v,this.oldText=b,this.newPosition=a,this.newText=i}toString(){return this.oldText.length===0?`(insert@${this.oldPosition} "${y(this.newText)}")`:this.newText.length===0?`(delete@${this.oldPosition} "${y(this.oldText)}")`:`(replace@${this.oldPosition} "${y(this.oldText)}" with "${y(this.newText)}")`}static _writeStringSize(v){return 4+2*v.length}static _writeString(v,b,a){const i=b.length;L.writeUInt32BE(v,i,a),a+=4;for(let n=0;n<i;n++)L.writeUInt16LE(v,b.charCodeAt(n),a),a+=2;return a}static _readString(v,b){const a=L.readUInt32BE(v,b);return b+=4,(0,k.decodeUTF16LE)(v,b,a)}writeSize(){return 4+4+E._writeStringSize(this.oldText)+E._writeStringSize(this.newText)}write(v,b){return L.writeUInt32BE(v,this.oldPosition,b),b+=4,L.writeUInt32BE(v,this.newPosition,b),b+=4,b=E._writeString(v,this.oldText,b),b=E._writeString(v,this.newText,b),b}static read(v,b,a){const i=L.readUInt32BE(v,b);b+=4;const n=L.readUInt32BE(v,b);b+=4;const t=E._readString(v,b);b+=E._writeStringSize(t);const r=E._readString(v,b);return b+=E._writeStringSize(r),a.push(new E(i,t,n,r)),b}}e.TextChange=E;function S(_,v){return _===null||_.length===0?v:new p(_,v).compress()}e.compressConsecutiveTextChanges=S;class p{constructor(v,b){this._prevEdits=v,this._currEdits=b,this._result=[],this._resultLen=0,this._prevLen=this._prevEdits.length,this._prevDeltaOffset=0,this._currLen=this._currEdits.length,this._currDeltaOffset=0}compress(){let v=0,b=0,a=this._getPrev(v),i=this._getCurr(b);for(;v<this._prevLen||b<this._currLen;){if(a===null){this._acceptCurr(i),i=this._getCurr(++b);continue}if(i===null){this._acceptPrev(a),a=this._getPrev(++v);continue}if(i.oldEnd<=a.newPosition){this._acceptCurr(i),i=this._getCurr(++b);continue}if(a.newEnd<=i.oldPosition){this._acceptPrev(a),a=this._getPrev(++v);continue}if(i.oldPosition<a.newPosition){const[f,c]=p._splitCurr(i,a.newPosition-i.oldPosition);this._acceptCurr(f),i=c;continue}if(a.newPosition<i.oldPosition){const[f,c]=p._splitPrev(a,i.oldPosition-a.newPosition);this._acceptPrev(f),a=c;continue}let r,u;if(i.oldEnd===a.newEnd)r=a,u=i,a=this._getPrev(++v),i=this._getCurr(++b);else if(i.oldEnd<a.newEnd){const[f,c]=p._splitPrev(a,i.oldLength);r=f,u=i,a=c,i=this._getCurr(++b)}else{const[f,c]=p._splitCurr(i,a.newLength);r=a,u=f,a=this._getPrev(++v),i=c}this._result[this._resultLen++]=new E(r.oldPosition,r.oldText,u.newPosition,u.newText),this._prevDeltaOffset+=r.newLength-r.oldLength,this._currDeltaOffset+=u.newLength-u.oldLength}const n=p._merge(this._result);return p._removeNoOps(n)}_acceptCurr(v){this._result[this._resultLen++]=p._rebaseCurr(this._prevDeltaOffset,v),this._currDeltaOffset+=v.newLength-v.oldLength}_getCurr(v){return v<this._currLen?this._currEdits[v]:null}_acceptPrev(v){this._result[this._resultLen++]=p._rebasePrev(this._currDeltaOffset,v),this._prevDeltaOffset+=v.newLength-v.oldLength}_getPrev(v){return v<this._prevLen?this._prevEdits[v]:null}static _rebaseCurr(v,b){return new E(b.oldPosition-v,b.oldText,b.newPosition,b.newText)}static _rebasePrev(v,b){return new E(b.oldPosition,b.oldText,b.newPosition+v,b.newText)}static _splitPrev(v,b){const a=v.newText.substr(0,b),i=v.newText.substr(b);return[new E(v.oldPosition,v.oldText,v.newPosition,a),new E(v.oldEnd,"",v.newPosition+b,i)]}static _splitCurr(v,b){const a=v.oldText.substr(0,b),i=v.oldText.substr(b);return[new E(v.oldPosition,a,v.newPosition,v.newText),new E(v.oldPosition+b,i,v.newEnd,"")]}static _merge(v){if(v.length===0)return v;const b=[];let a=0,i=v[0];for(let n=1;n<v.length;n++){const t=v[n];i.oldEnd===t.oldPosition?i=new E(i.oldPosition,i.oldText+t.oldText,i.newPosition,i.newText+t.newText):(b[a++]=i,i=t)}return b[a++]=i,b}static _removeNoOps(v){if(v.length===0)return v;const b=[];let a=0;for(let i=0;i<v.length;i++){const n=v[i];n.oldText!==n.newText&&(b[a++]=n)}return b}}}),define(se[330],oe([1,0,315,95]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.score=void 0;function y(E,S,p,_,v,b){if(Array.isArray(E)){let a=0;for(const i of E){const n=y(i,S,p,_,v,b);if(n===10)return n;n>a&&(a=n)}return a}else{if(typeof E=="string")return _?E==="*"?5:E===p?10:0:0;if(E){const{language:a,pattern:i,scheme:n,hasAccessToAllModels:t,notebookType:r}=E;if(!_&&!t)return 0;r&&v&&(S=v);let u=0;if(n)if(n===S.scheme)u=10;else if(n==="*")u=5;else return 0;if(a)if(a===p)u=10;else if(a==="*")u=Math.max(u,5);else return 0;if(r)if(r===b)u=10;else if(r==="*"&&b!==void 0)u=Math.max(u,5);else return 0;if(i){let f;if(typeof i=="string"?f=i:f={...i,base:(0,k.normalize)(i.base)},f===S.fsPath||(0,L.match)(f,S.fsPath))u=10;else return 0}return u}else return 0}}e.score=y}),define(se[611],oe([1,0,6,2,41,330]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguageFeatureRegistry=void 0;function S(b){return typeof b=="string"?!1:Array.isArray(b)?b.every(S):!!b.exclusive}class p{constructor(a,i,n,t){this.uri=a,this.languageId=i,this.notebookUri=n,this.notebookType=t}equals(a){var i,n;return this.notebookType===a.notebookType&&this.languageId===a.languageId&&this.uri.toString()===a.uri.toString()&&((i=this.notebookUri)===null||i===void 0?void 0:i.toString())===((n=a.notebookUri)===null||n===void 0?void 0:n.toString())}}class _{constructor(a){this._notebookInfoResolver=a,this._clock=0,this._entries=[],this._onDidChange=new L.Emitter,this.onDidChange=this._onDidChange.event}register(a,i){let n={selector:a,provider:i,_score:-1,_time:this._clock++};return this._entries.push(n),this._lastCandidate=void 0,this._onDidChange.fire(this._entries.length),(0,k.toDisposable)(()=>{if(n){const t=this._entries.indexOf(n);t>=0&&(this._entries.splice(t,1),this._lastCandidate=void 0,this._onDidChange.fire(this._entries.length),n=void 0)}})}has(a){return this.all(a).length>0}all(a){if(!a)return[];this._updateScores(a);const i=[];for(const n of this._entries)n._score>0&&i.push(n.provider);return i}ordered(a){const i=[];return this._orderedForEach(a,n=>i.push(n.provider)),i}orderedGroups(a){const i=[];let n,t;return this._orderedForEach(a,r=>{n&&t===r._score?n.push(r.provider):(t=r._score,n=[r.provider],i.push(n))}),i}_orderedForEach(a,i){this._updateScores(a);for(const n of this._entries)n._score>0&&i(n)}_updateScores(a){var i,n;const t=(i=this._notebookInfoResolver)===null||i===void 0?void 0:i.call(this,a.uri),r=t?new p(a.uri,a.getLanguageId(),t.uri,t.type):new p(a.uri,a.getLanguageId(),void 0,void 0);if(!(!((n=this._lastCandidate)===null||n===void 0)&&n.equals(r))){this._lastCandidate=r;for(const u of this._entries)if(u._score=(0,E.score)(u.selector,r.uri,r.languageId,(0,y.shouldSynchronizeModel)(a),r.notebookUri,r.notebookType),S(u.selector)&&u._score>0){for(const f of this._entries)f._score=0;u._score=1e3;break}this._entries.sort(_._compareByScoreAndTime)}}static _compareByScoreAndTime(a,i){return a._score<i._score?1:a._score>i._score?-1:v(a.selector)&&!v(i.selector)?1:!v(a.selector)&&v(i.selector)?-1:a._time<i._time?1:a._time>i._time?-1:0}}e.LanguageFeatureRegistry=_;function v(b){return typeof b=="string"?!1:Array.isArray(b)?b.some(v):!!b.isBuiltin}}),define(se[234],oe([1,0,11,102,5]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketsUtils=e.RichEditBrackets=e.RichEditBracket=void 0;class E{constructor(s,l,o,g,h,m){this._richEditBracketBrand=void 0,this.languageId=s,this.index=l,this.open=o,this.close=g,this.forwardRegex=h,this.reversedRegex=m,this._openSet=E._toSet(this.open),this._closeSet=E._toSet(this.close)}isOpen(s){return this._openSet.has(s)}isClose(s){return this._closeSet.has(s)}static _toSet(s){const l=new Set;for(const o of s)l.add(o);return l}}e.RichEditBracket=E;function S(d){const s=d.length;d=d.map(m=>[m[0].toLowerCase(),m[1].toLowerCase()]);const l=[];for(let m=0;m<s;m++)l[m]=m;const o=(m,C)=>{const[w,D]=m,[I,T]=C;return w===I||w===T||D===I||D===T},g=(m,C)=>{const w=Math.min(m,C),D=Math.max(m,C);for(let I=0;I<s;I++)l[I]===D&&(l[I]=w)};for(let m=0;m<s;m++){const C=d[m];for(let w=m+1;w<s;w++){const D=d[w];o(C,D)&&g(l[m],l[w])}}const h=[];for(let m=0;m<s;m++){const C=[],w=[];for(let D=0;D<s;D++)if(l[D]===m){const[I,T]=d[D];C.push(I),w.push(T)}C.length>0&&h.push({open:C,close:w})}return h}class p{constructor(s,l){this._richEditBracketsBrand=void 0;const o=S(l);this.brackets=o.map((g,h)=>new E(s,h,g.open,g.close,a(g.open,g.close,o,h),i(g.open,g.close,o,h))),this.forwardRegex=n(this.brackets),this.reversedRegex=t(this.brackets),this.textIsBracket={},this.textIsOpenBracket={},this.maxBracketLength=0;for(const g of this.brackets){for(const h of g.open)this.textIsBracket[h]=g,this.textIsOpenBracket[h]=!0,this.maxBracketLength=Math.max(this.maxBracketLength,h.length);for(const h of g.close)this.textIsBracket[h]=g,this.textIsOpenBracket[h]=!1,this.maxBracketLength=Math.max(this.maxBracketLength,h.length)}}}e.RichEditBrackets=p;function _(d,s,l,o){for(let g=0,h=s.length;g<h;g++){if(g===l)continue;const m=s[g];for(const C of m.open)C.indexOf(d)>=0&&o.push(C);for(const C of m.close)C.indexOf(d)>=0&&o.push(C)}}function v(d,s){return d.length-s.length}function b(d){if(d.length<=1)return d;const s=[],l=new Set;for(const o of d)l.has(o)||(s.push(o),l.add(o));return s}function a(d,s,l,o){let g=[];g=g.concat(d),g=g.concat(s);for(let h=0,m=g.length;h<m;h++)_(g[h],l,o,g);return g=b(g),g.sort(v),g.reverse(),u(g)}function i(d,s,l,o){let g=[];g=g.concat(d),g=g.concat(s);for(let h=0,m=g.length;h<m;h++)_(g[h],l,o,g);return g=b(g),g.sort(v),g.reverse(),u(g.map(f))}function n(d){let s=[];for(const l of d){for(const o of l.open)s.push(o);for(const o of l.close)s.push(o)}return s=b(s),u(s)}function t(d){let s=[];for(const l of d){for(const o of l.open)s.push(o);for(const o of l.close)s.push(o)}return s=b(s),u(s.map(f))}function r(d){const s=/^[\w ]+$/.test(d);return d=L.escapeRegExpCharacters(d),s?`\\b${d}\\b`:d}function u(d){const s=`(${d.map(r).join(")|(")})`;return L.createRegExp(s,!0)}const f=function(){function d(o){const g=new Uint16Array(o.length);let h=0;for(let m=o.length-1;m>=0;m--)g[h++]=o.charCodeAt(m);return k.getPlatformTextDecoder().decode(g)}let s=null,l=null;return function(g){return s!==g&&(s=g,l=d(s)),l}}();class c{static _findPrevBracketInText(s,l,o,g){const h=o.match(s);if(!h)return null;const m=o.length-(h.index||0),C=h[0].length,w=g+m;return new y.Range(l,w-C+1,l,w+1)}static findPrevBracketInRange(s,l,o,g,h){const C=f(o).substring(o.length-h,o.length-g);return this._findPrevBracketInText(s,l,C,g)}static findNextBracketInText(s,l,o,g){const h=o.match(s);if(!h)return null;const m=h.index||0,C=h[0].length;if(C===0)return null;const w=g+m;return new y.Range(l,w+1,l,w+1+C)}static findNextBracketInRange(s,l,o,g,h){const m=o.substring(g,h);return this.findNextBracketInText(s,l,m,g)}}e.BracketsUtils=c}),define(se[612],oe([1,0,13,133,234]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketElectricCharacterSupport=void 0;class E{constructor(p){this._richEditBrackets=p}getElectricCharacters(){const p=[];if(this._richEditBrackets)for(const _ of this._richEditBrackets.brackets)for(const v of _.close){const b=v.charAt(v.length-1);p.push(b)}return(0,L.distinct)(p)}onElectricCharacter(p,_,v){if(!this._richEditBrackets||this._richEditBrackets.brackets.length===0)return null;const b=_.findTokenIndexAtOffset(v-1);if((0,k.ignoreBracketsInToken)(_.getStandardTokenType(b)))return null;const a=this._richEditBrackets.reversedRegex,i=_.getLineContent().substring(0,v-1)+p,n=y.BracketsUtils.findPrevBracketInRange(a,1,i,0,i.length);if(!n)return null;const t=i.substring(n.startColumn-1,n.endColumn-1).toLowerCase();if(this._richEditBrackets.textIsOpenBracket[t])return null;const u=_.getActualLineContentBefore(n.startColumn-1);return/^\s*$/.test(u)?{matchOpenBracket:t}:null}}e.BracketElectricCharacterSupport=E}),define(se[613],oe([1,0,13,6,2,5,133,234,529]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketPairsTextModelPart=void 0;class v extends y.Disposable{get canBuildAST(){return this.textModel.getValueLength()<=5e6}constructor(r,u){super(),this.textModel=r,this.languageConfigurationService=u,this.bracketPairsTree=this._register(new y.MutableDisposable),this.onDidChangeEmitter=new k.Emitter,this.onDidChange=this.onDidChangeEmitter.event,this.bracketsRequested=!1,this._register(this.languageConfigurationService.onDidChange(f=>{var c;(!f.languageId||!((c=this.bracketPairsTree.value)===null||c===void 0)&&c.object.didLanguageChange(f.languageId))&&(this.bracketPairsTree.clear(),this.updateBracketPairsTree())}))}handleDidChangeOptions(r){this.bracketPairsTree.clear(),this.updateBracketPairsTree()}handleDidChangeLanguage(r){this.bracketPairsTree.clear(),this.updateBracketPairsTree()}handleDidChangeContent(r){var u;(u=this.bracketPairsTree.value)===null||u===void 0||u.object.handleContentChanged(r)}handleDidChangeBackgroundTokenizationState(){var r;(r=this.bracketPairsTree.value)===null||r===void 0||r.object.handleDidChangeBackgroundTokenizationState()}handleDidChangeTokens(r){var u;(u=this.bracketPairsTree.value)===null||u===void 0||u.object.handleDidChangeTokens(r)}updateBracketPairsTree(){if(this.bracketsRequested&&this.canBuildAST){if(!this.bracketPairsTree.value){const r=new y.DisposableStore;this.bracketPairsTree.value=b(r.add(new _.BracketPairsTree(this.textModel,u=>this.languageConfigurationService.getLanguageConfiguration(u))),r),r.add(this.bracketPairsTree.value.object.onDidChange(u=>this.onDidChangeEmitter.fire(u))),this.onDidChangeEmitter.fire()}}else this.bracketPairsTree.value&&(this.bracketPairsTree.clear(),this.onDidChangeEmitter.fire())}getBracketPairsInRange(r){var u;return this.bracketsRequested=!0,this.updateBracketPairsTree(),((u=this.bracketPairsTree.value)===null||u===void 0?void 0:u.object.getBracketPairsInRange(r,!1))||L.CallbackIterable.empty}getBracketPairsInRangeWithMinIndentation(r){var u;return this.bracketsRequested=!0,this.updateBracketPairsTree(),((u=this.bracketPairsTree.value)===null||u===void 0?void 0:u.object.getBracketPairsInRange(r,!0))||L.CallbackIterable.empty}getBracketsInRange(r,u=!1){var f;return this.bracketsRequested=!0,this.updateBracketPairsTree(),((f=this.bracketPairsTree.value)===null||f===void 0?void 0:f.object.getBracketsInRange(r,u))||L.CallbackIterable.empty}findMatchingBracketUp(r,u,f){const c=this.textModel.validatePosition(u),d=this.textModel.getLanguageIdAtPosition(c.lineNumber,c.column);if(this.canBuildAST){const s=this.languageConfigurationService.getLanguageConfiguration(d).bracketsNew.getClosingBracketInfo(r);if(!s)return null;const l=this.getBracketPairsInRange(E.Range.fromPositions(u,u)).findLast(o=>s.closes(o.openingBracketInfo));return l?l.openingBracketRange:null}else{const s=r.toLowerCase(),l=this.languageConfigurationService.getLanguageConfiguration(d).brackets;if(!l)return null;const o=l.textIsBracket[s];return o?n(this._findMatchingBracketUp(o,c,a(f))):null}}matchBracket(r,u){if(this.canBuildAST){const f=this.getBracketPairsInRange(E.Range.fromPositions(r,r)).filter(c=>c.closingBracketRange!==void 0&&(c.openingBracketRange.containsPosition(r)||c.closingBracketRange.containsPosition(r))).findLastMaxBy((0,L.compareBy)(c=>c.openingBracketRange.containsPosition(r)?c.openingBracketRange:c.closingBracketRange,E.Range.compareRangesUsingStarts));return f?[f.openingBracketRange,f.closingBracketRange]:null}else{const f=a(u);return this._matchBracket(this.textModel.validatePosition(r),f)}}_establishBracketSearchOffsets(r,u,f,c){const d=u.getCount(),s=u.getLanguageId(c);let l=Math.max(0,r.column-1-f.maxBracketLength);for(let g=c-1;g>=0;g--){const h=u.getEndOffset(g);if(h<=l)break;if((0,S.ignoreBracketsInToken)(u.getStandardTokenType(g))||u.getLanguageId(g)!==s){l=h;break}}let o=Math.min(u.getLineContent().length,r.column-1+f.maxBracketLength);for(let g=c+1;g<d;g++){const h=u.getStartOffset(g);if(h>=o)break;if((0,S.ignoreBracketsInToken)(u.getStandardTokenType(g))||u.getLanguageId(g)!==s){o=h;break}}return{searchStartOffset:l,searchEndOffset:o}}_matchBracket(r,u){const f=r.lineNumber,c=this.textModel.tokenization.getLineTokens(f),d=this.textModel.getLineContent(f),s=c.findTokenIndexAtOffset(r.column-1);if(s<0)return null;const l=this.languageConfigurationService.getLanguageConfiguration(c.getLanguageId(s)).brackets;if(l&&!(0,S.ignoreBracketsInToken)(c.getStandardTokenType(s))){let{searchStartOffset:o,searchEndOffset:g}=this._establishBracketSearchOffsets(r,c,l,s),h=null;for(;;){const m=p.BracketsUtils.findNextBracketInRange(l.forwardRegex,f,d,o,g);if(!m)break;if(m.startColumn<=r.column&&r.column<=m.endColumn){const C=d.substring(m.startColumn-1,m.endColumn-1).toLowerCase(),w=this._matchFoundBracket(m,l.textIsBracket[C],l.textIsOpenBracket[C],u);if(w){if(w instanceof i)return null;h=w}}o=m.endColumn-1}if(h)return h}if(s>0&&c.getStartOffset(s)===r.column-1){const o=s-1,g=this.languageConfigurationService.getLanguageConfiguration(c.getLanguageId(o)).brackets;if(g&&!(0,S.ignoreBracketsInToken)(c.getStandardTokenType(o))){const{searchStartOffset:h,searchEndOffset:m}=this._establishBracketSearchOffsets(r,c,g,o),C=p.BracketsUtils.findPrevBracketInRange(g.reversedRegex,f,d,h,m);if(C&&C.startColumn<=r.column&&r.column<=C.endColumn){const w=d.substring(C.startColumn-1,C.endColumn-1).toLowerCase(),D=this._matchFoundBracket(C,g.textIsBracket[w],g.textIsOpenBracket[w],u);if(D)return D instanceof i?null:D}}}return null}_matchFoundBracket(r,u,f,c){if(!u)return null;const d=f?this._findMatchingBracketDown(u,r.getEndPosition(),c):this._findMatchingBracketUp(u,r.getStartPosition(),c);return d?d instanceof i?d:[r,d]:null}_findMatchingBracketUp(r,u,f){const c=r.languageId,d=r.reversedRegex;let s=-1,l=0;const o=(g,h,m,C)=>{for(;;){if(f&&++l%100===0&&!f())return i.INSTANCE;const w=p.BracketsUtils.findPrevBracketInRange(d,g,h,m,C);if(!w)break;const D=h.substring(w.startColumn-1,w.endColumn-1).toLowerCase();if(r.isOpen(D)?s++:r.isClose(D)&&s--,s===0)return w;C=w.startColumn-1}return null};for(let g=u.lineNumber;g>=1;g--){const h=this.textModel.tokenization.getLineTokens(g),m=h.getCount(),C=this.textModel.getLineContent(g);let w=m-1,D=C.length,I=C.length;g===u.lineNumber&&(w=h.findTokenIndexAtOffset(u.column-1),D=u.column-1,I=u.column-1);let T=!0;for(;w>=0;w--){const A=h.getLanguageId(w)===c&&!(0,S.ignoreBracketsInToken)(h.getStandardTokenType(w));if(A)T?D=h.getStartOffset(w):(D=h.getStartOffset(w),I=h.getEndOffset(w));else if(T&&D!==I){const P=o(g,C,D,I);if(P)return P}T=A}if(T&&D!==I){const A=o(g,C,D,I);if(A)return A}}return null}_findMatchingBracketDown(r,u,f){const c=r.languageId,d=r.forwardRegex;let s=1,l=0;const o=(h,m,C,w)=>{for(;;){if(f&&++l%100===0&&!f())return i.INSTANCE;const D=p.BracketsUtils.findNextBracketInRange(d,h,m,C,w);if(!D)break;const I=m.substring(D.startColumn-1,D.endColumn-1).toLowerCase();if(r.isOpen(I)?s++:r.isClose(I)&&s--,s===0)return D;C=D.endColumn-1}return null},g=this.textModel.getLineCount();for(let h=u.lineNumber;h<=g;h++){const m=this.textModel.tokenization.getLineTokens(h),C=m.getCount(),w=this.textModel.getLineContent(h);let D=0,I=0,T=0;h===u.lineNumber&&(D=m.findTokenIndexAtOffset(u.column-1),I=u.column-1,T=u.column-1);let A=!0;for(;D<C;D++){const P=m.getLanguageId(D)===c&&!(0,S.ignoreBracketsInToken)(m.getStandardTokenType(D));if(P)A||(I=m.getStartOffset(D)),T=m.getEndOffset(D);else if(A&&I!==T){const N=o(h,w,I,T);if(N)return N}A=P}if(A&&I!==T){const P=o(h,w,I,T);if(P)return P}}return null}findPrevBracket(r){var u;const f=this.textModel.validatePosition(r);if(this.canBuildAST)return this.bracketsRequested=!0,this.updateBracketPairsTree(),((u=this.bracketPairsTree.value)===null||u===void 0?void 0:u.object.getFirstBracketBefore(f))||null;let c=null,d=null,s=null;for(let l=f.lineNumber;l>=1;l--){const o=this.textModel.tokenization.getLineTokens(l),g=o.getCount(),h=this.textModel.getLineContent(l);let m=g-1,C=h.length,w=h.length;if(l===f.lineNumber){m=o.findTokenIndexAtOffset(f.column-1),C=f.column-1,w=f.column-1;const I=o.getLanguageId(m);c!==I&&(c=I,d=this.languageConfigurationService.getLanguageConfiguration(c).brackets,s=this.languageConfigurationService.getLanguageConfiguration(c).bracketsNew)}let D=!0;for(;m>=0;m--){const I=o.getLanguageId(m);if(c!==I){if(d&&s&&D&&C!==w){const A=p.BracketsUtils.findPrevBracketInRange(d.reversedRegex,l,h,C,w);if(A)return this._toFoundBracket(s,A);D=!1}c=I,d=this.languageConfigurationService.getLanguageConfiguration(c).brackets,s=this.languageConfigurationService.getLanguageConfiguration(c).bracketsNew}const T=!!d&&!(0,S.ignoreBracketsInToken)(o.getStandardTokenType(m));if(T)D?C=o.getStartOffset(m):(C=o.getStartOffset(m),w=o.getEndOffset(m));else if(s&&d&&D&&C!==w){const A=p.BracketsUtils.findPrevBracketInRange(d.reversedRegex,l,h,C,w);if(A)return this._toFoundBracket(s,A)}D=T}if(s&&d&&D&&C!==w){const I=p.BracketsUtils.findPrevBracketInRange(d.reversedRegex,l,h,C,w);if(I)return this._toFoundBracket(s,I)}}return null}findNextBracket(r){var u;const f=this.textModel.validatePosition(r);if(this.canBuildAST)return this.bracketsRequested=!0,this.updateBracketPairsTree(),((u=this.bracketPairsTree.value)===null||u===void 0?void 0:u.object.getFirstBracketAfter(f))||null;const c=this.textModel.getLineCount();let d=null,s=null,l=null;for(let o=f.lineNumber;o<=c;o++){const g=this.textModel.tokenization.getLineTokens(o),h=g.getCount(),m=this.textModel.getLineContent(o);let C=0,w=0,D=0;if(o===f.lineNumber){C=g.findTokenIndexAtOffset(f.column-1),w=f.column-1,D=f.column-1;const T=g.getLanguageId(C);d!==T&&(d=T,s=this.languageConfigurationService.getLanguageConfiguration(d).brackets,l=this.languageConfigurationService.getLanguageConfiguration(d).bracketsNew)}let I=!0;for(;C<h;C++){const T=g.getLanguageId(C);if(d!==T){if(l&&s&&I&&w!==D){const P=p.BracketsUtils.findNextBracketInRange(s.forwardRegex,o,m,w,D);if(P)return this._toFoundBracket(l,P);I=!1}d=T,s=this.languageConfigurationService.getLanguageConfiguration(d).brackets,l=this.languageConfigurationService.getLanguageConfiguration(d).bracketsNew}const A=!!s&&!(0,S.ignoreBracketsInToken)(g.getStandardTokenType(C));if(A)I||(w=g.getStartOffset(C)),D=g.getEndOffset(C);else if(l&&s&&I&&w!==D){const P=p.BracketsUtils.findNextBracketInRange(s.forwardRegex,o,m,w,D);if(P)return this._toFoundBracket(l,P)}I=A}if(l&&s&&I&&w!==D){const T=p.BracketsUtils.findNextBracketInRange(s.forwardRegex,o,m,w,D);if(T)return this._toFoundBracket(l,T)}}return null}findEnclosingBrackets(r,u){const f=this.textModel.validatePosition(r);if(this.canBuildAST){const w=E.Range.fromPositions(f),D=this.getBracketPairsInRange(E.Range.fromPositions(f,f)).findLast(I=>I.closingBracketRange!==void 0&&I.range.strictContainsRange(w));return D?[D.openingBracketRange,D.closingBracketRange]:null}const c=a(u),d=this.textModel.getLineCount(),s=new Map;let l=[];const o=(w,D)=>{if(!s.has(w)){const I=[];for(let T=0,A=D?D.brackets.length:0;T<A;T++)I[T]=0;s.set(w,I)}l=s.get(w)};let g=0;const h=(w,D,I,T,A)=>{for(;;){if(c&&++g%100===0&&!c())return i.INSTANCE;const P=p.BracketsUtils.findNextBracketInRange(w.forwardRegex,D,I,T,A);if(!P)break;const N=I.substring(P.startColumn-1,P.endColumn-1).toLowerCase(),M=w.textIsBracket[N];if(M&&(M.isOpen(N)?l[M.index]++:M.isClose(N)&&l[M.index]--,l[M.index]===-1))return this._matchFoundBracket(P,M,!1,c);T=P.endColumn-1}return null};let m=null,C=null;for(let w=f.lineNumber;w<=d;w++){const D=this.textModel.tokenization.getLineTokens(w),I=D.getCount(),T=this.textModel.getLineContent(w);let A=0,P=0,N=0;if(w===f.lineNumber){A=D.findTokenIndexAtOffset(f.column-1),P=f.column-1,N=f.column-1;const R=D.getLanguageId(A);m!==R&&(m=R,C=this.languageConfigurationService.getLanguageConfiguration(m).brackets,o(m,C))}let M=!0;for(;A<I;A++){const R=D.getLanguageId(A);if(m!==R){if(C&&M&&P!==N){const O=h(C,w,T,P,N);if(O)return n(O);M=!1}m=R,C=this.languageConfigurationService.getLanguageConfiguration(m).brackets,o(m,C)}const x=!!C&&!(0,S.ignoreBracketsInToken)(D.getStandardTokenType(A));if(x)M||(P=D.getStartOffset(A)),N=D.getEndOffset(A);else if(C&&M&&P!==N){const O=h(C,w,T,P,N);if(O)return n(O)}M=x}if(C&&M&&P!==N){const R=h(C,w,T,P,N);if(R)return n(R)}}return null}_toFoundBracket(r,u){if(!u)return null;let f=this.textModel.getValueInRange(u);f=f.toLowerCase();const c=r.getBracketInfo(f);return c?{range:u,bracketInfo:c}:null}}e.BracketPairsTextModelPart=v;function b(t,r){return{object:t,dispose:()=>r?.dispose()}}function a(t){if(typeof t>"u")return()=>!0;{const r=Date.now();return()=>Date.now()-r<=t}}class i{constructor(){this._searchCanceledBrand=void 0}}i.INSTANCE=new i;function n(t){return t instanceof i?null:t}}),define(se[331],oe([1,0,6,11,5,41,293,129,329,2]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PieceTreeTextBuffer=void 0;class b extends v.Disposable{constructor(i,n,t,r,u,f,c){super(),this._onDidChangeContent=this._register(new L.Emitter),this._BOM=n,this._mightContainNonBasicASCII=!f,this._mightContainRTL=r,this._mightContainUnusualLineTerminators=u,this._pieceTree=new S.PieceTreeBase(i,t,c)}mightContainRTL(){return this._mightContainRTL}mightContainUnusualLineTerminators(){return this._mightContainUnusualLineTerminators}resetMightContainUnusualLineTerminators(){this._mightContainUnusualLineTerminators=!1}mightContainNonBasicASCII(){return this._mightContainNonBasicASCII}getBOM(){return this._BOM}getEOL(){return this._pieceTree.getEOL()}createSnapshot(i){return this._pieceTree.createSnapshot(i?this._BOM:"")}getOffsetAt(i,n){return this._pieceTree.getOffsetAt(i,n)}getPositionAt(i){return this._pieceTree.getPositionAt(i)}getRangeAt(i,n){const t=i+n,r=this.getPositionAt(i),u=this.getPositionAt(t);return new y.Range(r.lineNumber,r.column,u.lineNumber,u.column)}getValueInRange(i,n=0){if(i.isEmpty())return"";const t=this._getEndOfLine(n);return this._pieceTree.getValueInRange(i,t)}getValueLengthInRange(i,n=0){if(i.isEmpty())return 0;if(i.startLineNumber===i.endLineNumber)return i.endColumn-i.startColumn;const t=this.getOffsetAt(i.startLineNumber,i.startColumn),r=this.getOffsetAt(i.endLineNumber,i.endColumn);let u=0;const f=this._getEndOfLine(n),c=this.getEOL();if(f.length!==c.length){const d=f.length-c.length,s=i.endLineNumber-i.startLineNumber;u=d*s}return r-t+u}getCharacterCountInRange(i,n=0){if(this._mightContainNonBasicASCII){let t=0;const r=i.startLineNumber,u=i.endLineNumber;for(let f=r;f<=u;f++){const c=this.getLineContent(f),d=f===r?i.startColumn-1:0,s=f===u?i.endColumn-1:c.length;for(let l=d;l<s;l++)k.isHighSurrogate(c.charCodeAt(l))?(t=t+1,l=l+1):t=t+1}return t+=this._getEndOfLine(n).length*(u-r),t}return this.getValueLengthInRange(i,n)}getLength(){return this._pieceTree.getLength()}getLineCount(){return this._pieceTree.getLineCount()}getLinesContent(){return this._pieceTree.getLinesContent()}getLineContent(i){return this._pieceTree.getLineContent(i)}getLineCharCode(i,n){return this._pieceTree.getLineCharCode(i,n)}getLineLength(i){return this._pieceTree.getLineLength(i)}getLineFirstNonWhitespaceColumn(i){const n=k.firstNonWhitespaceIndex(this.getLineContent(i));return n===-1?0:n+1}getLineLastNonWhitespaceColumn(i){const n=k.lastNonWhitespaceIndex(this.getLineContent(i));return n===-1?0:n+2}_getEndOfLine(i){switch(i){case 1:return`
+`;case 2:return`\r
+`;case 0:return this.getEOL();default:throw new Error("Unknown EOL preference")}}setEOL(i){this._pieceTree.setEOL(i)}applyEdits(i,n,t){let r=this._mightContainRTL,u=this._mightContainUnusualLineTerminators,f=this._mightContainNonBasicASCII,c=!0,d=[];for(let C=0;C<i.length;C++){const w=i[C];c&&w._isTracked&&(c=!1);const D=w.range;if(w.text){let N=!0;f||(N=!k.isBasicASCII(w.text),f=N),!r&&N&&(r=k.containsRTL(w.text)),!u&&N&&(u=k.containsUnusualLineTerminators(w.text))}let I="",T=0,A=0,P=0;if(w.text){let N;[T,A,P,N]=(0,p.countEOL)(w.text);const M=this.getEOL();N===0||N===(M===`\r
+`?2:1)?I=w.text:I=w.text.replace(/\r\n|\r|\n/g,M)}d[C]={sortIndex:C,identifier:w.identifier||null,range:D,rangeOffset:this.getOffsetAt(D.startLineNumber,D.startColumn),rangeLength:this.getValueLengthInRange(D),text:I,eolCount:T,firstLineLength:A,lastLineLength:P,forceMoveMarkers:!!w.forceMoveMarkers,isAutoWhitespaceEdit:w.isAutoWhitespaceEdit||!1}}d.sort(b._sortOpsAscending);let s=!1;for(let C=0,w=d.length-1;C<w;C++){const D=d[C].range.getEndPosition(),I=d[C+1].range.getStartPosition();if(I.isBeforeOrEqual(D)){if(I.isBefore(D))throw new Error("Overlapping ranges are not allowed!");s=!0}}c&&(d=this._reduceOperations(d));const l=t||n?b._getInverseEditRanges(d):[],o=[];if(n)for(let C=0;C<d.length;C++){const w=d[C],D=l[C];if(w.isAutoWhitespaceEdit&&w.range.isEmpty())for(let I=D.startLineNumber;I<=D.endLineNumber;I++){let T="";I===D.startLineNumber&&(T=this.getLineContent(w.range.startLineNumber),k.firstNonWhitespaceIndex(T)!==-1)||o.push({lineNumber:I,oldContent:T})}}let g=null;if(t){let C=0;g=[];for(let w=0;w<d.length;w++){const D=d[w],I=l[w],T=this.getValueInRange(D.range),A=D.rangeOffset+C;C+=D.text.length-T.length,g[w]={sortIndex:D.sortIndex,identifier:D.identifier,range:I,text:T,textChange:new _.TextChange(D.rangeOffset,T,A,D.text)}}s||g.sort((w,D)=>w.sortIndex-D.sortIndex)}this._mightContainRTL=r,this._mightContainUnusualLineTerminators=u,this._mightContainNonBasicASCII=f;const h=this._doApplyEdits(d);let m=null;if(n&&o.length>0){o.sort((C,w)=>w.lineNumber-C.lineNumber),m=[];for(let C=0,w=o.length;C<w;C++){const D=o[C].lineNumber;if(C>0&&o[C-1].lineNumber===D)continue;const I=o[C].oldContent,T=this.getLineContent(D);T.length===0||T===I||k.firstNonWhitespaceIndex(T)!==-1||m.push(D)}}return this._onDidChangeContent.fire(),new E.ApplyEditsResult(g,h,m)}_reduceOperations(i){return i.length<1e3?i:[this._toSingleEditOperation(i)]}_toSingleEditOperation(i){let n=!1;const t=i[0].range,r=i[i.length-1].range,u=new y.Range(t.startLineNumber,t.startColumn,r.endLineNumber,r.endColumn);let f=t.startLineNumber,c=t.startColumn;const d=[];for(let h=0,m=i.length;h<m;h++){const C=i[h],w=C.range;n=n||C.forceMoveMarkers,d.push(this.getValueInRange(new y.Range(f,c,w.startLineNumber,w.startColumn))),C.text.length>0&&d.push(C.text),f=w.endLineNumber,c=w.endColumn}const s=d.join(""),[l,o,g]=(0,p.countEOL)(s);return{sortIndex:0,identifier:i[0].identifier,range:u,rangeOffset:this.getOffsetAt(u.startLineNumber,u.startColumn),rangeLength:this.getValueLengthInRange(u,0),text:s,eolCount:l,firstLineLength:o,lastLineLength:g,forceMoveMarkers:n,isAutoWhitespaceEdit:!1}}_doApplyEdits(i){i.sort(b._sortOpsDescending);const n=[];for(let t=0;t<i.length;t++){const r=i[t],u=r.range.startLineNumber,f=r.range.startColumn,c=r.range.endLineNumber,d=r.range.endColumn;if(u===c&&f===d&&r.text.length===0)continue;r.text?(this._pieceTree.delete(r.rangeOffset,r.rangeLength),this._pieceTree.insert(r.rangeOffset,r.text,!0)):this._pieceTree.delete(r.rangeOffset,r.rangeLength);const s=new y.Range(u,f,c,d);n.push({range:s,rangeLength:r.rangeLength,text:r.text,rangeOffset:r.rangeOffset,forceMoveMarkers:r.forceMoveMarkers})}return n}findMatchesLineByLine(i,n,t,r){return this._pieceTree.findMatchesLineByLine(i,n,t,r)}static _getInverseEditRanges(i){const n=[];let t=0,r=0,u=null;for(let f=0,c=i.length;f<c;f++){const d=i[f];let s,l;u?u.range.endLineNumber===d.range.startLineNumber?(s=t,l=r+(d.range.startColumn-u.range.endColumn)):(s=t+(d.range.startLineNumber-u.range.endLineNumber),l=d.range.startColumn):(s=d.range.startLineNumber,l=d.range.startColumn);let o;if(d.text.length>0){const g=d.eolCount+1;g===1?o=new y.Range(s,l,s,l+d.firstLineLength):o=new y.Range(s,l,s+g-1,d.lastLineLength+1)}else o=new y.Range(s,l,s,l);t=o.endLineNumber,r=o.endColumn,n.push(o),u=d}return n}static _sortOpsAscending(i,n){const t=y.Range.compareRangesUsingEnds(i.range,n.range);return t===0?i.sortIndex-n.sortIndex:t}static _sortOpsDescending(i,n){const t=y.Range.compareRangesUsingEnds(i.range,n.range);return t===0?n.sortIndex-i.sortIndex:-t}}e.PieceTreeTextBuffer=b}),define(se[614],oe([1,0,11,293,331]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PieceTreeTextBufferBuilder=void 0;class E{constructor(_,v,b,a,i,n,t,r,u){this._chunks=_,this._bom=v,this._cr=b,this._lf=a,this._crlf=i,this._containsRTL=n,this._containsUnusualLineTerminators=t,this._isBasicASCII=r,this._normalizeEOL=u}_getEOL(_){const v=this._cr+this._lf+this._crlf,b=this._cr+this._crlf;return v===0?_===1?`
+`:`\r
+`:b>v/2?`\r
+`:`
+`}create(_){const v=this._getEOL(_),b=this._chunks;if(this._normalizeEOL&&(v===`\r
+`&&(this._cr>0||this._lf>0)||v===`
+`&&(this._cr>0||this._crlf>0)))for(let i=0,n=b.length;i<n;i++){const t=b[i].buffer.replace(/\r\n|\r|\n/g,v),r=(0,k.createLineStartsFast)(t);b[i]=new k.StringBuffer(t,r)}const a=new y.PieceTreeTextBuffer(b,this._bom,v,this._containsRTL,this._containsUnusualLineTerminators,this._isBasicASCII,this._normalizeEOL);return{textBuffer:a,disposable:a}}}class S{constructor(){this.chunks=[],this.BOM="",this._hasPreviousChar=!1,this._previousChar=0,this._tmpLineStarts=[],this.cr=0,this.lf=0,this.crlf=0,this.containsRTL=!1,this.containsUnusualLineTerminators=!1,this.isBasicASCII=!0}acceptChunk(_){if(_.length===0)return;this.chunks.length===0&&L.startsWithUTF8BOM(_)&&(this.BOM=L.UTF8_BOM_CHARACTER,_=_.substr(1));const v=_.charCodeAt(_.length-1);v===13||v>=55296&&v<=56319?(this._acceptChunk1(_.substr(0,_.length-1),!1),this._hasPreviousChar=!0,this._previousChar=v):(this._acceptChunk1(_,!1),this._hasPreviousChar=!1,this._previousChar=v)}_acceptChunk1(_,v){!v&&_.length===0||(this._hasPreviousChar?this._acceptChunk2(String.fromCharCode(this._previousChar)+_):this._acceptChunk2(_))}_acceptChunk2(_){const v=(0,k.createLineStarts)(this._tmpLineStarts,_);this.chunks.push(new k.StringBuffer(_,v.lineStarts)),this.cr+=v.cr,this.lf+=v.lf,this.crlf+=v.crlf,v.isBasicASCII||(this.isBasicASCII=!1,this.containsRTL||(this.containsRTL=L.containsRTL(_)),this.containsUnusualLineTerminators||(this.containsUnusualLineTerminators=L.containsUnusualLineTerminators(_)))}finish(_=!0){return this._finish(),new E(this.chunks,this.BOM,this.cr,this.lf,this.crlf,this.containsRTL,this.containsUnusualLineTerminators,this.isBasicASCII,_)}_finish(){if(this.chunks.length===0&&this._acceptChunk1("",!0),this._hasPreviousChar){this._hasPreviousChar=!1;const _=this.chunks[this.chunks.length-1];_.buffer+=String.fromCharCode(this._previousChar);const v=(0,k.createLineStartsFast)(_.buffer);_.lineStarts=v,this._previousChar===13&&this.cr++}}}e.PieceTreeTextBufferBuilder=S}),define(se[615],oe([1,0,144,17]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.encodeSemanticTokensDto=void 0;function y(_){for(let v=0,b=_.length;v<b;v+=4){const a=_[v+0],i=_[v+1],n=_[v+2],t=_[v+3];_[v+0]=t,_[v+1]=n,_[v+2]=i,_[v+3]=a}}function E(_){const v=new Uint8Array(_.buffer,_.byteOffset,_.length*4);return k.isLittleEndian()||y(v),L.VSBuffer.wrap(v)}function S(_){const v=new Uint32Array(p(_));let b=0;if(v[b++]=_.id,_.type==="full")v[b++]=1,v[b++]=_.data.length,v.set(_.data,b),b+=_.data.length;else{v[b++]=2,v[b++]=_.deltas.length;for(const a of _.deltas)v[b++]=a.start,v[b++]=a.deleteCount,a.data?(v[b++]=a.data.length,v.set(a.data,b),b+=a.data.length):v[b++]=0}return E(v)}e.encodeSemanticTokensDto=S;function p(_){let v=0;if(v+=1+1,_.type==="full")v+=1+_.data.length;else{v+=1,v+=(1+1+1)*_.deltas.length;for(const b of _.deltas)b.data&&(v+=b.data.length)}return v}}),define(se[188],oe([1,0,6,2,17]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ClickLinkGesture=e.ClickLinkOptions=e.ClickLinkKeyboardEvent=e.ClickLinkMouseEvent=void 0;function E(a,i){return!!a[i]}class S{constructor(i,n){this.target=i.target,this.isLeftClick=i.event.leftButton,this.isMiddleClick=i.event.middleButton,this.isRightClick=i.event.rightButton,this.hasTriggerModifier=E(i.event,n.triggerModifier),this.hasSideBySideModifier=E(i.event,n.triggerSideBySideModifier),this.isNoneOrSingleMouseDown=i.event.detail<=1}}e.ClickLinkMouseEvent=S;class p{constructor(i,n){this.keyCodeIsTriggerKey=i.keyCode===n.triggerKey,this.keyCodeIsSideBySideKey=i.keyCode===n.triggerSideBySideKey,this.hasTriggerModifier=E(i,n.triggerModifier)}}e.ClickLinkKeyboardEvent=p;class _{constructor(i,n,t,r){this.triggerKey=i,this.triggerModifier=n,this.triggerSideBySideKey=t,this.triggerSideBySideModifier=r}equals(i){return this.triggerKey===i.triggerKey&&this.triggerModifier===i.triggerModifier&&this.triggerSideBySideKey===i.triggerSideBySideKey&&this.triggerSideBySideModifier===i.triggerSideBySideModifier}}e.ClickLinkOptions=_;function v(a){return a==="altKey"?y.isMacintosh?new _(57,"metaKey",6,"altKey"):new _(5,"ctrlKey",6,"altKey"):y.isMacintosh?new _(6,"altKey",57,"metaKey"):new _(6,"altKey",5,"ctrlKey")}class b extends k.Disposable{constructor(i,n){var t;super(),this._onMouseMoveOrRelevantKeyDown=this._register(new L.Emitter),this.onMouseMoveOrRelevantKeyDown=this._onMouseMoveOrRelevantKeyDown.event,this._onExecute=this._register(new L.Emitter),this.onExecute=this._onExecute.event,this._onCancel=this._register(new L.Emitter),this.onCancel=this._onCancel.event,this._editor=i,this._extractLineNumberFromMouseEvent=(t=n?.extractLineNumberFromMouseEvent)!==null&&t!==void 0?t:r=>r.target.position?r.target.position.lineNumber:0,this._opts=v(this._editor.getOption(77)),this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._lineNumberOnMouseDown=0,this._register(this._editor.onDidChangeConfiguration(r=>{if(r.hasChanged(77)){const u=v(this._editor.getOption(77));if(this._opts.equals(u))return;this._opts=u,this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._lineNumberOnMouseDown=0,this._onCancel.fire()}})),this._register(this._editor.onMouseMove(r=>this._onEditorMouseMove(new S(r,this._opts)))),this._register(this._editor.onMouseDown(r=>this._onEditorMouseDown(new S(r,this._opts)))),this._register(this._editor.onMouseUp(r=>this._onEditorMouseUp(new S(r,this._opts)))),this._register(this._editor.onKeyDown(r=>this._onEditorKeyDown(new p(r,this._opts)))),this._register(this._editor.onKeyUp(r=>this._onEditorKeyUp(new p(r,this._opts)))),this._register(this._editor.onMouseDrag(()=>this._resetHandler())),this._register(this._editor.onDidChangeCursorSelection(r=>this._onDidChangeCursorSelection(r))),this._register(this._editor.onDidChangeModel(r=>this._resetHandler())),this._register(this._editor.onDidChangeModelContent(()=>this._resetHandler())),this._register(this._editor.onDidScrollChange(r=>{(r.scrollTopChanged||r.scrollLeftChanged)&&this._resetHandler()}))}_onDidChangeCursorSelection(i){i.selection&&i.selection.startColumn!==i.selection.endColumn&&this._resetHandler()}_onEditorMouseMove(i){this._lastMouseMoveEvent=i,this._onMouseMoveOrRelevantKeyDown.fire([i,null])}_onEditorMouseDown(i){this._hasTriggerKeyOnMouseDown=i.hasTriggerModifier,this._lineNumberOnMouseDown=this._extractLineNumberFromMouseEvent(i)}_onEditorMouseUp(i){const n=this._extractLineNumberFromMouseEvent(i);this._hasTriggerKeyOnMouseDown&&this._lineNumberOnMouseDown&&this._lineNumberOnMouseDown===n&&this._onExecute.fire(i)}_onEditorKeyDown(i){this._lastMouseMoveEvent&&(i.keyCodeIsTriggerKey||i.keyCodeIsSideBySideKey&&i.hasTriggerModifier)?this._onMouseMoveOrRelevantKeyDown.fire([this._lastMouseMoveEvent,i]):i.hasTriggerModifier&&this._onCancel.fire()}_onEditorKeyUp(i){i.keyCodeIsTriggerKey&&this._onCancel.fire()}_resetHandler(){this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._onCancel.fire()}}e.ClickLinkGesture=b}),define(se[332],oe([1,0,14,12,6,2]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HoverOperation=e.HoverResult=void 0;class S{constructor(v,b,a){this.value=v,this.isComplete=b,this.hasLoadingMessage=a}}e.HoverResult=S;class p extends E.Disposable{constructor(v,b){super(),this._editor=v,this._computer=b,this._onResult=this._register(new y.Emitter),this.onResult=this._onResult.event,this._firstWaitScheduler=this._register(new L.RunOnceScheduler(()=>this._triggerAsyncComputation(),0)),this._secondWaitScheduler=this._register(new L.RunOnceScheduler(()=>this._triggerSyncComputation(),0)),this._loadingMessageScheduler=this._register(new L.RunOnceScheduler(()=>this._triggerLoadingMessage(),0)),this._state=0,this._asyncIterable=null,this._asyncIterableDone=!1,this._result=[]}dispose(){this._asyncIterable&&(this._asyncIterable.cancel(),this._asyncIterable=null),super.dispose()}get _hoverTime(){return this._editor.getOption(60).delay}get _firstWaitTime(){return this._hoverTime/2}get _secondWaitTime(){return this._hoverTime-this._firstWaitTime}get _loadingMessageTime(){return 3*this._hoverTime}_setState(v,b=!0){this._state=v,b&&this._fireResult()}_triggerAsyncComputation(){this._setState(2),this._secondWaitScheduler.schedule(this._secondWaitTime),this._computer.computeAsync?(this._asyncIterableDone=!1,this._asyncIterable=(0,L.createCancelableAsyncIterable)(v=>this._computer.computeAsync(v)),(async()=>{try{for await(const v of this._asyncIterable)v&&(this._result.push(v),this._fireResult());this._asyncIterableDone=!0,(this._state===3||this._state===4)&&this._setState(0)}catch(v){(0,k.onUnexpectedError)(v)}})()):this._asyncIterableDone=!0}_triggerSyncComputation(){this._computer.computeSync&&(this._result=this._result.concat(this._computer.computeSync())),this._setState(this._asyncIterableDone?0:3)}_triggerLoadingMessage(){this._state===3&&this._setState(4)}_fireResult(){if(this._state===1||this._state===2)return;const v=this._state===0,b=this._state===4;this._onResult.fire(new S(this._result.slice(0),v,b))}start(v){if(v===0)this._state===0&&(this._setState(1),this._firstWaitScheduler.schedule(this._firstWaitTime),this._loadingMessageScheduler.schedule(this._loadingMessageTime));else switch(this._state){case 0:this._triggerAsyncComputation(),this._secondWaitScheduler.cancel(),this._triggerSyncComputation();break;case 2:this._secondWaitScheduler.cancel(),this._triggerSyncComputation();break}}cancel(){this._firstWaitScheduler.cancel(),this._secondWaitScheduler.cancel(),this._loadingMessageScheduler.cancel(),this._asyncIterable&&(this._asyncIterable.cancel(),this._asyncIterable=null),this._result=[],this._setState(0,!1)}}e.HoverOperation=p}),define(se[616],oe([1,0,225,2,10,7]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResizableContentWidget=void 0;const S=30,p=24;class _ extends k.Disposable{constructor(b,a=new E.Dimension(10,10)){super(),this._editor=b,this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this._resizableNode=this._register(new L.ResizableHTMLElement),this._contentPosition=null,this._isResizing=!1,this._resizableNode.domNode.style.position="absolute",this._resizableNode.minSize=E.Dimension.lift(a),this._resizableNode.layout(a.height,a.width),this._resizableNode.enableSashes(!0,!0,!0,!0),this._register(this._resizableNode.onDidResize(i=>{this._resize(new E.Dimension(i.dimension.width,i.dimension.height)),i.done&&(this._isResizing=!1)})),this._register(this._resizableNode.onDidWillResize(()=>{this._isResizing=!0}))}get isResizing(){return this._isResizing}getDomNode(){return this._resizableNode.domNode}getPosition(){return this._contentPosition}get position(){var b;return!((b=this._contentPosition)===null||b===void 0)&&b.position?y.Position.lift(this._contentPosition.position):void 0}_availableVerticalSpaceAbove(b){const a=this._editor.getDomNode(),i=this._editor.getScrolledVisiblePosition(b);return!a||!i?void 0:E.getDomNodePagePosition(a).top+i.top-S}_availableVerticalSpaceBelow(b){const a=this._editor.getDomNode(),i=this._editor.getScrolledVisiblePosition(b);if(!a||!i)return;const n=E.getDomNodePagePosition(a),t=E.getClientArea(a.ownerDocument.body),r=n.top+i.top+i.height;return t.height-r-p}_findPositionPreference(b,a){var i,n;const t=Math.min((i=this._availableVerticalSpaceBelow(a))!==null&&i!==void 0?i:1/0,b),r=Math.min((n=this._availableVerticalSpaceAbove(a))!==null&&n!==void 0?n:1/0,b),u=Math.min(Math.max(r,t),b),f=Math.min(b,u);let c;return this._editor.getOption(60).above?c=f<=r?1:2:c=f<=t?2:1,c===1?this._resizableNode.enableSashes(!0,!0,!1,!1):this._resizableNode.enableSashes(!1,!0,!0,!1),c}_resize(b){this._resizableNode.layout(b.height,b.width)}}e.ResizableContentWidget=_}),define(se[333],oe([1,0,12,2,10,5,47,22]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.asCommandLink=e.InlayHintsFragments=e.InlayHintItem=e.InlayHintAnchor=void 0;class _{constructor(n,t){this.range=n,this.direction=t}}e.InlayHintAnchor=_;class v{constructor(n,t,r){this.hint=n,this.anchor=t,this.provider=r,this._isResolved=!1}with(n){const t=new v(this.hint,n.anchor,this.provider);return t._isResolved=this._isResolved,t._currentResolve=this._currentResolve,t}async resolve(n){if(typeof this.provider.resolveInlayHint=="function"){if(this._currentResolve)return await this._currentResolve,n.isCancellationRequested?void 0:this.resolve(n);this._isResolved||(this._currentResolve=this._doResolve(n).finally(()=>this._currentResolve=void 0)),await this._currentResolve}}async _doResolve(n){var t,r,u;try{const f=await Promise.resolve(this.provider.resolveInlayHint(this.hint,n));this.hint.tooltip=(t=f?.tooltip)!==null&&t!==void 0?t:this.hint.tooltip,this.hint.label=(r=f?.label)!==null&&r!==void 0?r:this.hint.label,this.hint.textEdits=(u=f?.textEdits)!==null&&u!==void 0?u:this.hint.textEdits,this._isResolved=!0}catch(f){(0,L.onUnexpectedExternalError)(f),this._isResolved=!1}}}e.InlayHintItem=v;class b{static async create(n,t,r,u){const f=[],c=n.ordered(t).reverse().map(d=>r.map(async s=>{try{const l=await d.provideInlayHints(t,s,u);(l?.hints.length||d.onDidChangeInlayHints)&&f.push([l??b._emptyInlayHintList,d])}catch(l){(0,L.onUnexpectedExternalError)(l)}}));if(await Promise.all(c.flat()),u.isCancellationRequested||t.isDisposed())throw new L.CancellationError;return new b(r,f,t)}constructor(n,t,r){this._disposables=new k.DisposableStore,this.ranges=n,this.provider=new Set;const u=[];for(const[f,c]of t){this._disposables.add(f),this.provider.add(c);for(const d of f.hints){const s=r.validatePosition(d.position);let l="before";const o=b._getRangeAtPosition(r,s);let g;o.getStartPosition().isBefore(s)?(g=E.Range.fromPositions(o.getStartPosition(),s),l="after"):(g=E.Range.fromPositions(s,o.getEndPosition()),l="before"),u.push(new v(d,new _(g,l),c))}}this.items=u.sort((f,c)=>y.Position.compare(f.hint.position,c.hint.position))}dispose(){this._disposables.dispose()}static _getRangeAtPosition(n,t){const r=t.lineNumber,u=n.getWordAtPosition(t);if(u)return new E.Range(r,u.startColumn,r,u.endColumn);n.tokenization.tokenizeIfCheap(r);const f=n.tokenization.getLineTokens(r),c=t.column-1,d=f.findTokenIndexAtOffset(c);let s=f.getStartOffset(d),l=f.getEndOffset(d);return l-s===1&&(s===c&&d>1?(s=f.getStartOffset(d-1),l=f.getEndOffset(d-1)):l===c&&d<f.getCount()-1&&(s=f.getStartOffset(d+1),l=f.getEndOffset(d+1))),new E.Range(r,s+1,r,l+1)}}e.InlayHintsFragments=b,b._emptyInlayHintList=Object.freeze({dispose(){},hints:[]});function a(i){return p.URI.from({scheme:S.Schemas.command,path:i.id,query:i.arguments&&encodeURIComponent(JSON.stringify(i.arguments))}).toString()}e.asCommandLink=a}),define(se[617],oe([1,0,90,14,19,53,12,5,522,156,117]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineCompletionItem=e.InlineCompletionList=e.InlineCompletionProviderResult=e.provideInlineCompletions=void 0;async function a(f,c,d,s,l=y.CancellationToken.None,o){const g=r(c,d),h=f.all(d),m=new E.SetMap;for(const M of h)M.groupId&&m.add(M.groupId,M);function C(M){if(!M.yieldsToGroupIds)return[];const R=[];for(const x of M.yieldsToGroupIds||[]){const O=m.get(x);for(const B of O)R.push(B)}return R}const w=new Map,D=new Set;function I(M,R){if(R=[...R,M],D.has(M))return R;D.add(M);try{const x=C(M);for(const O of x){const B=I(O,R);if(B)return B}}finally{D.delete(M)}}function T(M){const R=w.get(M);if(R)return R;const x=I(M,[]);x&&(0,S.onUnexpectedExternalError)(new Error(`Inline completions: cyclic yield-to dependency detected. Path: ${x.map(B=>B.toString?B.toString():""+B).join(" -> ")}`));const O=new k.DeferredPromise;return w.set(M,O.p),(async()=>{if(!x){const B=C(M);for(const W of B){const V=await T(W);if(V&&V.items.length>0)return}}try{return await M.provideInlineCompletions(d,c,s,l)}catch(B){(0,S.onUnexpectedExternalError)(B);return}})().then(B=>O.complete(B),B=>O.error(B)),O.p}const A=await Promise.all(h.map(async M=>({provider:M,completions:await T(M)}))),P=new Map,N=[];for(const M of A){const R=M.completions;if(!R)continue;const x=new n(R,M.provider);N.push(x);for(const O of R.items){const B=t.from(O,x,g,d,o);P.set(B.hash(),B)}}return new i(Array.from(P.values()),new Set(P.keys()),N)}e.provideInlineCompletions=a;class i{constructor(c,d,s){this.completions=c,this.hashs=d,this.providerResults=s}has(c){return this.hashs.has(c.hash())}dispose(){for(const c of this.providerResults)c.removeRef()}}e.InlineCompletionProviderResult=i;class n{constructor(c,d){this.inlineCompletions=c,this.provider=d,this.refCount=1}addRef(){this.refCount++}removeRef(){this.refCount--,this.refCount===0&&this.provider.freeInlineCompletions(this.inlineCompletions)}}e.InlineCompletionList=n;class t{static from(c,d,s,l,o){let g,h,m=c.range?p.Range.lift(c.range):s;if(typeof c.insertText=="string"){if(g=c.insertText,o&&c.completeBracketPairs){g=u(g,m.getStartPosition(),l,o);const C=g.length-c.insertText.length;C!==0&&(m=new p.Range(m.startLineNumber,m.startColumn,m.endLineNumber,m.endColumn+C))}h=void 0}else if("snippet"in c.insertText){const C=c.insertText.snippet.length;if(o&&c.completeBracketPairs){c.insertText.snippet=u(c.insertText.snippet,m.getStartPosition(),l,o);const D=c.insertText.snippet.length-C;D!==0&&(m=new p.Range(m.startLineNumber,m.startColumn,m.endLineNumber,m.endColumn+D))}const w=new b.SnippetParser().parse(c.insertText.snippet);w.children.length===1&&w.children[0]instanceof b.Text?(g=w.children[0].value,h=void 0):(g=w.toString(),h={snippet:c.insertText.snippet,range:m})}else(0,L.assertNever)(c.insertText);return new t(g,c.command,m,g,h,c.additionalTextEdits||(0,v.getReadonlyEmptyArray)(),c,d)}constructor(c,d,s,l,o,g,h,m){this.filterText=c,this.command=d,this.range=s,this.insertText=l,this.snippetInfo=o,this.additionalTextEdits=g,this.sourceInlineCompletion=h,this.source=m,c=c.replace(/\r\n|\r/g,`
+`),l=c.replace(/\r\n|\r/g,`
+`)}withRange(c){return new t(this.filterText,this.command,c,this.insertText,this.snippetInfo,this.additionalTextEdits,this.sourceInlineCompletion,this.source)}hash(){return JSON.stringify({insertText:this.insertText,range:this.range.toString()})}}e.InlineCompletionItem=t;function r(f,c){const d=c.getWordAtPosition(f),s=c.getLineMaxColumn(f.lineNumber);return d?new p.Range(f.lineNumber,d.startColumn,f.lineNumber,s):p.Range.fromPositions(f,f.with(void 0,s))}function u(f,c,d,s){const o=d.getLineContent(c.lineNumber).substring(0,c.column-1)+f,g=d.tokenization.tokenizeLineWithEdit(c,o.length-(c.column-1),f),h=g?.sliceAndInflate(c.column-1,o.length,0);return h?(0,_.fixBracketsInLine)(h,s):f}}),define(se[618],oe([3,4]),function(te,e){return te.create("vs/editor/browser/controller/textAreaHandler",e)}),define(se[619],oe([3,4]),function(te,e){return te.create("vs/editor/browser/coreCommands",e)}),define(se[620],oe([3,4]),function(te,e){return te.create("vs/editor/browser/editorExtensions",e)}),define(se[621],oe([3,4]),function(te,e){return te.create("vs/editor/browser/widget/codeEditorWidget",e)}),define(se[622],oe([3,4]),function(te,e){return te.create("vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer",e)}),define(se[623],oe([3,4]),function(te,e){return te.create("vs/editor/browser/widget/diffEditor/components/diffEditorEditors",e)}),define(se[624],oe([3,4]),function(te,e){return te.create("vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin",e)}),define(se[625],oe([1,0,7,42,26,2,17,28,624]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineDiffDeletedCodeMargin=void 0;class v extends E.Disposable{get visibility(){return this._visibility}set visibility(a){this._visibility!==a&&(this._visibility=a,this._diffActions.style.visibility=a?"visible":"hidden")}constructor(a,i,n,t,r,u,f,c,d){super(),this._getViewZoneId=a,this._marginDomNode=i,this._modifiedEditor=n,this._diff=t,this._editor=r,this._viewLineCounts=u,this._originalTextModel=f,this._contextMenuService=c,this._clipboardService=d,this._visibility=!1,this._marginDomNode.style.zIndex="10",this._diffActions=document.createElement("div"),this._diffActions.className=p.ThemeIcon.asClassName(y.Codicon.lightBulb)+" lightbulb-glyph",this._diffActions.style.position="absolute";const s=this._modifiedEditor.getOption(66);this._diffActions.style.right="0px",this._diffActions.style.visibility="hidden",this._diffActions.style.height=`${s}px`,this._diffActions.style.lineHeight=`${s}px`,this._marginDomNode.appendChild(this._diffActions);let l=0;const o=n.getOption(126)&&!S.isIOS,g=(h,m)=>{var C;this._contextMenuService.showContextMenu({domForShadowRoot:o&&(C=n.getDomNode())!==null&&C!==void 0?C:void 0,getAnchor:()=>({x:h,y:m}),getActions:()=>{const w=[],D=t.modified.isEmpty;return w.push(new k.Action("diff.clipboard.copyDeletedContent",D?t.original.length>1?(0,_.localize)(0,null):(0,_.localize)(1,null):t.original.length>1?(0,_.localize)(2,null):(0,_.localize)(3,null),void 0,!0,async()=>{const T=this._originalTextModel.getValueInRange(t.original.toExclusiveRange());await this._clipboardService.writeText(T)})),t.original.length>1&&w.push(new k.Action("diff.clipboard.copyDeletedLineContent",D?(0,_.localize)(4,null,t.original.startLineNumber+l):(0,_.localize)(5,null,t.original.startLineNumber+l),void 0,!0,async()=>{let T=this._originalTextModel.getLineContent(t.original.startLineNumber+l);T===""&&(T=this._originalTextModel.getEndOfLineSequence()===0?`
+`:`\r
+`),await this._clipboardService.writeText(T)})),n.getOption(90)||w.push(new k.Action("diff.inline.revertChange",(0,_.localize)(6,null),void 0,!0,async()=>{this._editor.revert(this._diff)})),w},autoSelectFirstItem:!0})};this._register((0,L.addStandardDisposableListener)(this._diffActions,"mousedown",h=>{if(!h.leftButton)return;const{top:m,height:C}=(0,L.getDomNodePagePosition)(this._diffActions),w=Math.floor(s/3);h.preventDefault(),g(h.posx,m+C+w)})),this._register(n.onMouseMove(h=>{(h.target.type===8||h.target.type===5)&&h.target.detail.viewZoneId===this._getViewZoneId()?(l=this._updateLightBulbPosition(this._marginDomNode,h.event.browserEvent.y,s),this.visibility=!0):this.visibility=!1})),this._register(n.onMouseDown(h=>{h.event.leftButton&&(h.target.type===8||h.target.type===5)&&h.target.detail.viewZoneId===this._getViewZoneId()&&(h.event.preventDefault(),l=this._updateLightBulbPosition(this._marginDomNode,h.event.browserEvent.y,s),g(h.event.posx,h.event.posy+s))}))}_updateLightBulbPosition(a,i,n){const{top:t}=(0,L.getDomNodePagePosition)(a),r=i-t,u=Math.floor(r/n),f=u*n;if(this._diffActions.style.top=`${f}px`,this._viewLineCounts){let c=0;for(let d=0;d<this._viewLineCounts.length;d++)if(c+=this._viewLineCounts[d],u<c)return d}return u}}e.InlineDiffDeletedCodeMargin=v}),define(se[626],oe([3,4]),function(te,e){return te.create("vs/editor/browser/widget/diffEditor/diffEditor.contribution",e)}),define(se[627],oe([3,4]),function(te,e){return te.create("vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature",e)}),define(se[628],oe([3,4]),function(te,e){return te.create("vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature",e)}),define(se[334],oe([1,0,7,78,42,13,60,26,2,35,28,87,73,628]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MovedBlocksLinesFeature=void 0;class t extends _.Disposable{constructor(c,d,s,l,o){super(),this._rootElement=c,this._diffModel=d,this._originalEditorLayoutInfo=s,this._modifiedEditorLayoutInfo=l,this._editors=o,this._originalScrollTop=(0,v.observableFromEvent)(this._editors.original.onDidScrollChange,()=>this._editors.original.getScrollTop()),this._modifiedScrollTop=(0,v.observableFromEvent)(this._editors.modified.onDidScrollChange,()=>this._editors.modified.getScrollTop()),this._viewZonesChanged=(0,v.observableSignalFromEvent)("onDidChangeViewZones",this._editors.modified.onDidChangeViewZones),this.width=(0,v.observableValue)(this,0),this._modifiedViewZonesChangedSignal=(0,v.observableSignalFromEvent)("modified.onDidChangeViewZones",this._editors.modified.onDidChangeViewZones),this._originalViewZonesChangedSignal=(0,v.observableSignalFromEvent)("original.onDidChangeViewZones",this._editors.original.onDidChangeViewZones),this._state=(0,v.derivedWithStore)(this,(I,T)=>{var A;this._element.replaceChildren();const P=this._diffModel.read(I),N=(A=P?.diff.read(I))===null||A===void 0?void 0:A.movedTexts;if(!N||N.length===0){this.width.set(0,void 0);return}this._viewZonesChanged.read(I);const M=this._originalEditorLayoutInfo.read(I),R=this._modifiedEditorLayoutInfo.read(I);if(!M||!R){this.width.set(0,void 0);return}this._modifiedViewZonesChangedSignal.read(I),this._originalViewZonesChangedSignal.read(I);const x=N.map(q=>{function ie(me,X){const U=X.getTopForLineNumber(me.startLineNumber,!0),G=X.getTopForLineNumber(me.endLineNumberExclusive,!0);return(U+G)/2}const ae=ie(q.lineRangeMapping.original,this._editors.original),ne=this._originalScrollTop.read(I),$=ie(q.lineRangeMapping.modified,this._editors.modified),J=this._modifiedScrollTop.read(I),Q=ae-ne,re=$-J,de=Math.min(ae,$),he=Math.max(ae,$);return{range:new i.OffsetRange(de,he),from:Q,to:re,fromWithoutScroll:ae,toWithoutScroll:$,move:q}});x.sort((0,E.tieBreakComparators)((0,E.compareBy)(q=>q.fromWithoutScroll>q.toWithoutScroll,E.booleanComparator),(0,E.compareBy)(q=>q.fromWithoutScroll>q.toWithoutScroll?q.fromWithoutScroll:-q.toWithoutScroll,E.numberComparator)));const O=r.compute(x.map(q=>q.range)),B=10,W=M.verticalScrollbarWidth,V=(O.getTrackCount()-1)*10+B*2,K=W+V+(R.contentLeft-t.movedCodeBlockPadding);let F=0;for(const q of x){const ie=O.getTrack(F),ae=W+B+ie*10,ne=15,$=15,J=K,Q=R.glyphMarginWidth+R.lineNumbersWidth,re=18,de=document.createElementNS("http://www.w3.org/2000/svg","rect");de.classList.add("arrow-rectangle"),de.setAttribute("x",`${J-Q}`),de.setAttribute("y",`${q.to-re/2}`),de.setAttribute("width",`${Q}`),de.setAttribute("height",`${re}`),this._element.appendChild(de);const he=document.createElementNS("http://www.w3.org/2000/svg","g"),me=document.createElementNS("http://www.w3.org/2000/svg","path");me.setAttribute("d",`M 0 ${q.from} L ${ae} ${q.from} L ${ae} ${q.to} L ${J-$} ${q.to}`),me.setAttribute("fill","none"),he.appendChild(me);const X=document.createElementNS("http://www.w3.org/2000/svg","polygon");X.classList.add("arrow"),T.add((0,v.autorun)(U=>{me.classList.toggle("currentMove",q.move===P.activeMovedText.read(U)),X.classList.toggle("currentMove",q.move===P.activeMovedText.read(U))})),X.setAttribute("points",`${J-$},${q.to-ne/2} ${J},${q.to} ${J-$},${q.to+ne/2}`),he.appendChild(X),this._element.appendChild(he),F++}this.width.set(V,void 0)}),this._element=document.createElementNS("http://www.w3.org/2000/svg","svg"),this._element.setAttribute("class","moved-blocks-lines"),this._rootElement.appendChild(this._element),this._register((0,_.toDisposable)(()=>this._element.remove())),this._register((0,v.autorun)(I=>{const T=this._originalEditorLayoutInfo.read(I),A=this._modifiedEditorLayoutInfo.read(I);!T||!A||(this._element.style.left=`${T.width-T.verticalScrollbarWidth}px`,this._element.style.height=`${T.height}px`,this._element.style.width=`${T.verticalScrollbarWidth+T.contentLeft-t.movedCodeBlockPadding+this.width.read(I)}px`)})),this._register((0,v.recomputeInitiallyAndOnChange)(this._state));const g=(0,v.derived)(I=>{const T=this._diffModel.read(I),A=T?.diff.read(I);return A?A.movedTexts.map(P=>({move:P,original:new a.PlaceholderViewZone((0,v.constObservable)(P.lineRangeMapping.original.startLineNumber-1),18),modified:new a.PlaceholderViewZone((0,v.constObservable)(P.lineRangeMapping.modified.startLineNumber-1),18)})):[]});this._register((0,a.applyViewZones)(this._editors.original,g.map(I=>I.map(T=>T.original)))),this._register((0,a.applyViewZones)(this._editors.modified,g.map(I=>I.map(T=>T.modified)))),this._register((0,v.autorunWithStore)((I,T)=>{const A=g.read(I);for(const P of A)T.add(new u(this._editors.original,P.original,P.move,"original",this._diffModel.get())),T.add(new u(this._editors.modified,P.modified,P.move,"modified",this._diffModel.get()))}));const h=(0,v.observableFromEvent)(this._editors.original.onDidChangeCursorPosition,()=>this._editors.original.getPosition()),m=(0,v.observableFromEvent)(this._editors.modified.onDidChangeCursorPosition,()=>this._editors.modified.getPosition()),C=(0,v.observableSignalFromEvent)("original.onDidFocusEditorWidget",I=>this._editors.original.onDidFocusEditorWidget(()=>setTimeout(()=>I(void 0),0))),w=(0,v.observableSignalFromEvent)("modified.onDidFocusEditorWidget",I=>this._editors.modified.onDidFocusEditorWidget(()=>setTimeout(()=>I(void 0),0)));let D="modified";this._register((0,v.autorunHandleChanges)({createEmptyChangeSummary:()=>{},handleChange:(I,T)=>(I.didChange(C)&&(D="original"),I.didChange(w)&&(D="modified"),!0)},I=>{C.read(I),w.read(I);const T=this._diffModel.read(I);if(!T)return;const A=T.diff.read(I);let P;if(A&&D==="original"){const N=h.read(I);N&&(P=A.movedTexts.find(M=>M.lineRangeMapping.original.contains(N.lineNumber)))}if(A&&D==="modified"){const N=m.read(I);N&&(P=A.movedTexts.find(M=>M.lineRangeMapping.modified.contains(N.lineNumber)))}P!==T.movedTextToCompare.get()&&T.movedTextToCompare.set(void 0,void 0),T.setActiveMovedText(P)}))}}e.MovedBlocksLinesFeature=t,t.movedCodeBlockPadding=4;class r{static compute(c){const d=[],s=[];for(const l of c){let o=d.findIndex(g=>!g.intersectsStrict(l));o===-1&&(d.length>=6?o=(0,S.findMaxIdxBy)(d,(0,E.compareBy)(h=>h.intersectWithRangeLength(l),E.numberComparator)):(o=d.length,d.push(new i.OffsetRangeSet))),d[o].addRange(l),s.push(o)}return new r(d.length,s)}constructor(c,d){this._trackCount=c,this.trackPerLineIdx=d}getTrack(c){return this.trackPerLineIdx[c]}getTrackCount(){return this._trackCount}}class u extends a.ViewZoneOverlayWidget{constructor(c,d,s,l,o){const g=(0,L.h)("div.diff-hidden-lines-widget");super(c,d,g.root),this._editor=c,this._move=s,this._kind=l,this._diffModel=o,this._nodes=(0,L.h)("div.diff-moved-code-block",{style:{marginRight:"4px"}},[(0,L.h)("div.text-content@textContent"),(0,L.h)("div.action-bar@actionBar")]),g.root.appendChild(this._nodes.root);const h=(0,v.observableFromEvent)(this._editor.onDidLayoutChange,()=>this._editor.getLayoutInfo());this._register((0,a.applyStyle)(this._nodes.root,{paddingRight:h.map(I=>I.verticalScrollbarWidth)}));let m;s.changes.length>0?m=this._kind==="original"?(0,n.localize)(0,null,this._move.lineRangeMapping.modified.startLineNumber,this._move.lineRangeMapping.modified.endLineNumberExclusive-1):(0,n.localize)(1,null,this._move.lineRangeMapping.original.startLineNumber,this._move.lineRangeMapping.original.endLineNumberExclusive-1):m=this._kind==="original"?(0,n.localize)(2,null,this._move.lineRangeMapping.modified.startLineNumber,this._move.lineRangeMapping.modified.endLineNumberExclusive-1):(0,n.localize)(3,null,this._move.lineRangeMapping.original.startLineNumber,this._move.lineRangeMapping.original.endLineNumberExclusive-1);const C=this._register(new k.ActionBar(this._nodes.actionBar,{highlightToggledItems:!0})),w=new y.Action("",m,"",!1);C.push(w,{icon:!1,label:!0});const D=new y.Action("","Compare",b.ThemeIcon.asClassName(p.Codicon.compareChanges),!0,()=>{this._editor.focus(),this._diffModel.movedTextToCompare.set(this._diffModel.movedTextToCompare.get()===s?void 0:this._move,void 0)});this._register((0,v.autorun)(I=>{const T=this._diffModel.movedTextToCompare.read(I)===s;D.checked=T})),C.push(D,{icon:!1,label:!0})}}}),define(se[629],oe([3,4]),function(te,e){return te.create("vs/editor/browser/widget/diffEditor/features/revertButtonsFeature",e)}),define(se[630],oe([1,0,7,118,26,2,35,62,5,41,629]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RevertButton=e.RevertButtonsFeature=void 0;class a extends E.Disposable{constructor(t,r,u,f){super(),this._editors=t,this._diffModel=r,this._options=u,this._widget=f;const c=[],d=(0,S.derived)(this,s=>{const l=this._diffModel.read(s),o=l?.diff.read(s);if(!o)return c;const g=this._editors.modifiedSelections.read(s);if(g.every(w=>w.isEmpty()))return c;const h=new p.LineRangeSet(g.map(w=>p.LineRange.fromRangeInclusive(w))),C=o.mappings.filter(w=>w.lineRangeMapping.innerChanges&&h.intersects(w.lineRangeMapping.modified)).map(w=>({mapping:w,rangeMappings:w.lineRangeMapping.innerChanges.filter(D=>g.some(I=>_.Range.areIntersecting(D.modifiedRange,I)))}));return C.length===0||C.every(w=>w.rangeMappings.length===0)?c:C});this._register((0,S.autorunWithStore)((s,l)=>{const o=this._diffModel.read(s),g=o?.diff.read(s);if(!o||!g||this._diffModel.read(s).movedTextToCompare.read(s)||!this._options.shouldRenderRevertArrows.read(s))return;const m=[],C=d.read(s),w=new Set(C.map(D=>D.mapping));if(C.length>0){const D=this._editors.modifiedSelections.read(s),I=l.add(new i(D[D.length-1].positionLineNumber,this._widget,C.flatMap(T=>T.rangeMappings),!0));this._editors.modified.addGlyphMarginWidget(I),m.push(I)}for(const D of g.mappings)if(!w.has(D)&&!D.lineRangeMapping.modified.isEmpty&&D.lineRangeMapping.innerChanges){const I=l.add(new i(D.lineRangeMapping.modified.startLineNumber,this._widget,D.lineRangeMapping.innerChanges,!1));this._editors.modified.addGlyphMarginWidget(I),m.push(I)}l.add((0,E.toDisposable)(()=>{for(const D of m)this._editors.modified.removeGlyphMarginWidget(D)}))}))}}e.RevertButtonsFeature=a;class i extends E.Disposable{getId(){return this._id}constructor(t,r,u,f){super(),this._lineNumber=t,this._widget=r,this._diffs=u,this._selection=f,this._id=`revertButton${i.counter++}`,this._domNode=(0,L.h)("div.revertButton",{title:this._selection?(0,b.localize)(0,null):(0,b.localize)(1,null)},[(0,k.renderIcon)(y.Codicon.arrowRight)]).root,this._register((0,L.addDisposableListener)(this._domNode,L.EventType.MOUSE_DOWN,c=>{c.button!==2&&(c.stopPropagation(),c.preventDefault())})),this._register((0,L.addDisposableListener)(this._domNode,L.EventType.MOUSE_UP,c=>{c.stopPropagation(),c.preventDefault()})),this._register((0,L.addDisposableListener)(this._domNode,L.EventType.CLICK,c=>{this._widget.revertRangeMappings(this._diffs),c.stopPropagation(),c.preventDefault()}))}getDomNode(){return this._domNode}getPosition(){return{lane:v.GlyphMarginLane.Right,range:{startColumn:1,startLineNumber:this._lineNumber,endColumn:1,endLineNumber:this._lineNumber},zIndex:10001}}}e.RevertButton=i,i.counter=0}),define(se[631],oe([3,4]),function(te,e){return te.create("vs/editor/browser/widget/diffEditor/registrations.contribution",e)}),define(se[632],oe([3,4]),function(te,e){return te.create("vs/editor/browser/widget/hoverWidget/hoverWidget",e)}),define(se[633],oe([3,4]),function(te,e){return te.create("vs/editor/browser/widget/multiDiffEditorWidget/colors",e)}),define(se[634],oe([3,4]),function(te,e){return te.create("vs/editor/common/config/editorConfigurationSchema",e)}),define(se[635],oe([3,4]),function(te,e){return te.create("vs/editor/common/config/editorOptions",e)}),define(se[36],oe([1,0,13,55,17,179,151,635]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorOptions=e.editorOptionsRegistry=e.EDITOR_FONT_DEFAULTS=e.unicodeHighlightConfigKeys=e.inUntrustedWorkspace=e.filterValidationDecorations=e.ShowLightbulbIconMode=e.EditorLayoutInfoComputer=e.EditorFontVariations=e.EditorFontLigatures=e.TextEditorCursorStyle=e.stringSet=e.clampedFloat=e.clampedInt=e.boolean=e.ApplyUpdateResult=e.ComputeOptionsMemory=e.ConfigurationChangedEvent=e.MINIMAP_GUTTER_WIDTH=void 0,e.MINIMAP_GUTTER_WIDTH=8;class _{constructor(fe){this._values=fe}hasChanged(fe){return this._values[fe]}}e.ConfigurationChangedEvent=_;class v{constructor(){this.stableMinimapLayoutInput=null,this.stableFitMaxMinimapScale=0,this.stableFitRemainingWidth=0}}e.ComputeOptionsMemory=v;class b{constructor(fe,be,Ne,Pe){this.id=fe,this.name=be,this.defaultValue=Ne,this.schema=Pe}applyUpdate(fe,be){return i(fe,be)}compute(fe,be,Ne){return Ne}}class a{constructor(fe,be){this.newValue=fe,this.didChange=be}}e.ApplyUpdateResult=a;function i(Ie,fe){if(typeof Ie!="object"||typeof fe!="object"||!Ie||!fe)return new a(fe,Ie!==fe);if(Array.isArray(Ie)||Array.isArray(fe)){const Ne=Array.isArray(Ie)&&Array.isArray(fe)&&L.equals(Ie,fe);return new a(fe,!Ne)}let be=!1;for(const Ne in fe)if(fe.hasOwnProperty(Ne)){const Pe=i(Ie[Ne],fe[Ne]);Pe.didChange&&(Ie[Ne]=Pe.newValue,be=!0)}return new a(Ie,be)}class n{constructor(fe){this.schema=void 0,this.id=fe,this.name="_never_",this.defaultValue=void 0}applyUpdate(fe,be){return i(fe,be)}validate(fe){return this.defaultValue}}class t{constructor(fe,be,Ne,Pe){this.id=fe,this.name=be,this.defaultValue=Ne,this.schema=Pe}applyUpdate(fe,be){return i(fe,be)}validate(fe){return typeof fe>"u"?this.defaultValue:fe}compute(fe,be,Ne){return Ne}}function r(Ie,fe){return typeof Ie>"u"?fe:Ie==="false"?!1:!!Ie}e.boolean=r;class u extends t{constructor(fe,be,Ne,Pe=void 0){typeof Pe<"u"&&(Pe.type="boolean",Pe.default=Ne),super(fe,be,Ne,Pe)}validate(fe){return r(fe,this.defaultValue)}}function f(Ie,fe,be,Ne){if(typeof Ie>"u")return fe;let Pe=parseInt(Ie,10);return isNaN(Pe)?fe:(Pe=Math.max(be,Pe),Pe=Math.min(Ne,Pe),Pe|0)}e.clampedInt=f;class c extends t{static clampedInt(fe,be,Ne,Pe){return f(fe,be,Ne,Pe)}constructor(fe,be,Ne,Pe,ze,Ke=void 0){typeof Ke<"u"&&(Ke.type="integer",Ke.default=Ne,Ke.minimum=Pe,Ke.maximum=ze),super(fe,be,Ne,Ke),this.minimum=Pe,this.maximum=ze}validate(fe){return c.clampedInt(fe,this.defaultValue,this.minimum,this.maximum)}}function d(Ie,fe,be,Ne){if(typeof Ie>"u")return fe;const Pe=s.float(Ie,fe);return s.clamp(Pe,be,Ne)}e.clampedFloat=d;class s extends t{static clamp(fe,be,Ne){return fe<be?be:fe>Ne?Ne:fe}static float(fe,be){if(typeof fe=="number")return fe;if(typeof fe>"u")return be;const Ne=parseFloat(fe);return isNaN(Ne)?be:Ne}constructor(fe,be,Ne,Pe,ze){typeof ze<"u"&&(ze.type="number",ze.default=Ne),super(fe,be,Ne,ze),this.validationFn=Pe}validate(fe){return this.validationFn(s.float(fe,this.defaultValue))}}class l extends t{static string(fe,be){return typeof fe!="string"?be:fe}constructor(fe,be,Ne,Pe=void 0){typeof Pe<"u"&&(Pe.type="string",Pe.default=Ne),super(fe,be,Ne,Pe)}validate(fe){return l.string(fe,this.defaultValue)}}function o(Ie,fe,be,Ne){return typeof Ie!="string"?fe:Ne&&Ie in Ne?Ne[Ie]:be.indexOf(Ie)===-1?fe:Ie}e.stringSet=o;class g extends t{constructor(fe,be,Ne,Pe,ze=void 0){typeof ze<"u"&&(ze.type="string",ze.enum=Pe,ze.default=Ne),super(fe,be,Ne,ze),this._allowedValues=Pe}validate(fe){return o(fe,this.defaultValue,this._allowedValues)}}class h extends b{constructor(fe,be,Ne,Pe,ze,Ke,je=void 0){typeof je<"u"&&(je.type="string",je.enum=ze,je.default=Pe),super(fe,be,Ne,je),this._allowedValues=ze,this._convert=Ke}validate(fe){return typeof fe!="string"?this.defaultValue:this._allowedValues.indexOf(fe)===-1?this.defaultValue:this._convert(fe)}}function m(Ie){switch(Ie){case"none":return 0;case"keep":return 1;case"brackets":return 2;case"advanced":return 3;case"full":return 4}}class C extends b{constructor(){super(2,"accessibilitySupport",0,{type:"string",enum:["auto","on","off"],enumDescriptions:[p.localize(0,null),p.localize(1,null),p.localize(2,null)],default:"auto",tags:["accessibility"],description:p.localize(3,null)})}validate(fe){switch(fe){case"auto":return 0;case"off":return 1;case"on":return 2}return this.defaultValue}compute(fe,be,Ne){return Ne===0?fe.accessibilitySupport:Ne}}class w extends b{constructor(){const fe={insertSpace:!0,ignoreEmptyLines:!0};super(23,"comments",fe,{"editor.comments.insertSpace":{type:"boolean",default:fe.insertSpace,description:p.localize(4,null)},"editor.comments.ignoreEmptyLines":{type:"boolean",default:fe.ignoreEmptyLines,description:p.localize(5,null)}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return{insertSpace:r(be.insertSpace,this.defaultValue.insertSpace),ignoreEmptyLines:r(be.ignoreEmptyLines,this.defaultValue.ignoreEmptyLines)}}}function D(Ie){switch(Ie){case"blink":return 1;case"smooth":return 2;case"phase":return 3;case"expand":return 4;case"solid":return 5}}var I;(function(Ie){Ie[Ie.Line=1]="Line",Ie[Ie.Block=2]="Block",Ie[Ie.Underline=3]="Underline",Ie[Ie.LineThin=4]="LineThin",Ie[Ie.BlockOutline=5]="BlockOutline",Ie[Ie.UnderlineThin=6]="UnderlineThin"})(I||(e.TextEditorCursorStyle=I={}));function T(Ie){switch(Ie){case"line":return I.Line;case"block":return I.Block;case"underline":return I.Underline;case"line-thin":return I.LineThin;case"block-outline":return I.BlockOutline;case"underline-thin":return I.UnderlineThin}}class A extends n{constructor(){super(140)}compute(fe,be,Ne){const Pe=["monaco-editor"];return be.get(39)&&Pe.push(be.get(39)),fe.extraEditorClassName&&Pe.push(fe.extraEditorClassName),be.get(73)==="default"?Pe.push("mouse-default"):be.get(73)==="copy"&&Pe.push("mouse-copy"),be.get(110)&&Pe.push("showUnused"),be.get(138)&&Pe.push("showDeprecated"),Pe.join(" ")}}class P extends u{constructor(){super(37,"emptySelectionClipboard",!0,{description:p.localize(6,null)})}compute(fe,be,Ne){return Ne&&fe.emptySelectionClipboard}}class N extends b{constructor(){const fe={cursorMoveOnType:!0,seedSearchStringFromSelection:"always",autoFindInSelection:"never",globalFindClipboard:!1,addExtraSpaceOnTop:!0,loop:!0};super(41,"find",fe,{"editor.find.cursorMoveOnType":{type:"boolean",default:fe.cursorMoveOnType,description:p.localize(7,null)},"editor.find.seedSearchStringFromSelection":{type:"string",enum:["never","always","selection"],default:fe.seedSearchStringFromSelection,enumDescriptions:[p.localize(8,null),p.localize(9,null),p.localize(10,null)],description:p.localize(11,null)},"editor.find.autoFindInSelection":{type:"string",enum:["never","always","multiline"],default:fe.autoFindInSelection,enumDescriptions:[p.localize(12,null),p.localize(13,null),p.localize(14,null)],description:p.localize(15,null)},"editor.find.globalFindClipboard":{type:"boolean",default:fe.globalFindClipboard,description:p.localize(16,null),included:y.isMacintosh},"editor.find.addExtraSpaceOnTop":{type:"boolean",default:fe.addExtraSpaceOnTop,description:p.localize(17,null)},"editor.find.loop":{type:"boolean",default:fe.loop,description:p.localize(18,null)}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return{cursorMoveOnType:r(be.cursorMoveOnType,this.defaultValue.cursorMoveOnType),seedSearchStringFromSelection:typeof fe.seedSearchStringFromSelection=="boolean"?fe.seedSearchStringFromSelection?"always":"never":o(be.seedSearchStringFromSelection,this.defaultValue.seedSearchStringFromSelection,["never","always","selection"]),autoFindInSelection:typeof fe.autoFindInSelection=="boolean"?fe.autoFindInSelection?"always":"never":o(be.autoFindInSelection,this.defaultValue.autoFindInSelection,["never","always","multiline"]),globalFindClipboard:r(be.globalFindClipboard,this.defaultValue.globalFindClipboard),addExtraSpaceOnTop:r(be.addExtraSpaceOnTop,this.defaultValue.addExtraSpaceOnTop),loop:r(be.loop,this.defaultValue.loop)}}}class M extends b{constructor(){super(51,"fontLigatures",M.OFF,{anyOf:[{type:"boolean",description:p.localize(19,null)},{type:"string",description:p.localize(20,null)}],description:p.localize(21,null),default:!1})}validate(fe){return typeof fe>"u"?this.defaultValue:typeof fe=="string"?fe==="false"||fe.length===0?M.OFF:fe==="true"?M.ON:fe:fe?M.ON:M.OFF}}e.EditorFontLigatures=M,M.OFF='"liga" off, "calt" off',M.ON='"liga" on, "calt" on';class R extends b{constructor(){super(54,"fontVariations",R.OFF,{anyOf:[{type:"boolean",description:p.localize(22,null)},{type:"string",description:p.localize(23,null)}],description:p.localize(24,null),default:!1})}validate(fe){return typeof fe>"u"?this.defaultValue:typeof fe=="string"?fe==="false"?R.OFF:fe==="true"?R.TRANSLATE:fe:fe?R.TRANSLATE:R.OFF}compute(fe,be,Ne){return fe.fontInfo.fontVariationSettings}}e.EditorFontVariations=R,R.OFF="normal",R.TRANSLATE="translate";class x extends n{constructor(){super(50)}compute(fe,be,Ne){return fe.fontInfo}}class O extends t{constructor(){super(52,"fontSize",e.EDITOR_FONT_DEFAULTS.fontSize,{type:"number",minimum:6,maximum:100,default:e.EDITOR_FONT_DEFAULTS.fontSize,description:p.localize(25,null)})}validate(fe){const be=s.float(fe,this.defaultValue);return be===0?e.EDITOR_FONT_DEFAULTS.fontSize:s.clamp(be,6,100)}compute(fe,be,Ne){return fe.fontInfo.fontSize}}class B extends b{constructor(){super(53,"fontWeight",e.EDITOR_FONT_DEFAULTS.fontWeight,{anyOf:[{type:"number",minimum:B.MINIMUM_VALUE,maximum:B.MAXIMUM_VALUE,errorMessage:p.localize(26,null)},{type:"string",pattern:"^(normal|bold|1000|[1-9][0-9]{0,2})$"},{enum:B.SUGGESTION_VALUES}],default:e.EDITOR_FONT_DEFAULTS.fontWeight,description:p.localize(27,null)})}validate(fe){return fe==="normal"||fe==="bold"?fe:String(c.clampedInt(fe,e.EDITOR_FONT_DEFAULTS.fontWeight,B.MINIMUM_VALUE,B.MAXIMUM_VALUE))}}B.SUGGESTION_VALUES=["normal","bold","100","200","300","400","500","600","700","800","900"],B.MINIMUM_VALUE=1,B.MAXIMUM_VALUE=1e3;class W extends b{constructor(){const fe={multiple:"peek",multipleDefinitions:"peek",multipleTypeDefinitions:"peek",multipleDeclarations:"peek",multipleImplementations:"peek",multipleReferences:"peek",alternativeDefinitionCommand:"editor.action.goToReferences",alternativeTypeDefinitionCommand:"editor.action.goToReferences",alternativeDeclarationCommand:"editor.action.goToReferences",alternativeImplementationCommand:"",alternativeReferenceCommand:""},be={type:"string",enum:["peek","gotoAndPeek","goto"],default:fe.multiple,enumDescriptions:[p.localize(28,null),p.localize(29,null),p.localize(30,null)]},Ne=["","editor.action.referenceSearch.trigger","editor.action.goToReferences","editor.action.peekImplementation","editor.action.goToImplementation","editor.action.peekTypeDefinition","editor.action.goToTypeDefinition","editor.action.peekDeclaration","editor.action.revealDeclaration","editor.action.peekDefinition","editor.action.revealDefinitionAside","editor.action.revealDefinition"];super(58,"gotoLocation",fe,{"editor.gotoLocation.multiple":{deprecationMessage:p.localize(31,null)},"editor.gotoLocation.multipleDefinitions":{description:p.localize(32,null),...be},"editor.gotoLocation.multipleTypeDefinitions":{description:p.localize(33,null),...be},"editor.gotoLocation.multipleDeclarations":{description:p.localize(34,null),...be},"editor.gotoLocation.multipleImplementations":{description:p.localize(35,null),...be},"editor.gotoLocation.multipleReferences":{description:p.localize(36,null),...be},"editor.gotoLocation.alternativeDefinitionCommand":{type:"string",default:fe.alternativeDefinitionCommand,enum:Ne,description:p.localize(37,null)},"editor.gotoLocation.alternativeTypeDefinitionCommand":{type:"string",default:fe.alternativeTypeDefinitionCommand,enum:Ne,description:p.localize(38,null)},"editor.gotoLocation.alternativeDeclarationCommand":{type:"string",default:fe.alternativeDeclarationCommand,enum:Ne,description:p.localize(39,null)},"editor.gotoLocation.alternativeImplementationCommand":{type:"string",default:fe.alternativeImplementationCommand,enum:Ne,description:p.localize(40,null)},"editor.gotoLocation.alternativeReferenceCommand":{type:"string",default:fe.alternativeReferenceCommand,enum:Ne,description:p.localize(41,null)}})}validate(fe){var be,Ne,Pe,ze,Ke;if(!fe||typeof fe!="object")return this.defaultValue;const je=fe;return{multiple:o(je.multiple,this.defaultValue.multiple,["peek","gotoAndPeek","goto"]),multipleDefinitions:(be=je.multipleDefinitions)!==null&&be!==void 0?be:o(je.multipleDefinitions,"peek",["peek","gotoAndPeek","goto"]),multipleTypeDefinitions:(Ne=je.multipleTypeDefinitions)!==null&&Ne!==void 0?Ne:o(je.multipleTypeDefinitions,"peek",["peek","gotoAndPeek","goto"]),multipleDeclarations:(Pe=je.multipleDeclarations)!==null&&Pe!==void 0?Pe:o(je.multipleDeclarations,"peek",["peek","gotoAndPeek","goto"]),multipleImplementations:(ze=je.multipleImplementations)!==null&&ze!==void 0?ze:o(je.multipleImplementations,"peek",["peek","gotoAndPeek","goto"]),multipleReferences:(Ke=je.multipleReferences)!==null&&Ke!==void 0?Ke:o(je.multipleReferences,"peek",["peek","gotoAndPeek","goto"]),alternativeDefinitionCommand:l.string(je.alternativeDefinitionCommand,this.defaultValue.alternativeDefinitionCommand),alternativeTypeDefinitionCommand:l.string(je.alternativeTypeDefinitionCommand,this.defaultValue.alternativeTypeDefinitionCommand),alternativeDeclarationCommand:l.string(je.alternativeDeclarationCommand,this.defaultValue.alternativeDeclarationCommand),alternativeImplementationCommand:l.string(je.alternativeImplementationCommand,this.defaultValue.alternativeImplementationCommand),alternativeReferenceCommand:l.string(je.alternativeReferenceCommand,this.defaultValue.alternativeReferenceCommand)}}}class V extends b{constructor(){const fe={enabled:!0,delay:300,hidingDelay:300,sticky:!0,above:!0};super(60,"hover",fe,{"editor.hover.enabled":{type:"boolean",default:fe.enabled,description:p.localize(42,null)},"editor.hover.delay":{type:"number",default:fe.delay,minimum:0,maximum:1e4,description:p.localize(43,null)},"editor.hover.sticky":{type:"boolean",default:fe.sticky,description:p.localize(44,null)},"editor.hover.hidingDelay":{type:"integer",minimum:0,default:fe.hidingDelay,description:p.localize(45,null)},"editor.hover.above":{type:"boolean",default:fe.above,description:p.localize(46,null)}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return{enabled:r(be.enabled,this.defaultValue.enabled),delay:c.clampedInt(be.delay,this.defaultValue.delay,0,1e4),sticky:r(be.sticky,this.defaultValue.sticky),hidingDelay:c.clampedInt(be.hidingDelay,this.defaultValue.hidingDelay,0,6e5),above:r(be.above,this.defaultValue.above)}}}class K extends n{constructor(){super(143)}compute(fe,be,Ne){return K.computeLayout(be,{memory:fe.memory,outerWidth:fe.outerWidth,outerHeight:fe.outerHeight,isDominatedByLongLines:fe.isDominatedByLongLines,lineHeight:fe.fontInfo.lineHeight,viewLineCount:fe.viewLineCount,lineNumbersDigitCount:fe.lineNumbersDigitCount,typicalHalfwidthCharacterWidth:fe.fontInfo.typicalHalfwidthCharacterWidth,maxDigitWidth:fe.fontInfo.maxDigitWidth,pixelRatio:fe.pixelRatio,glyphMarginDecorationLaneCount:fe.glyphMarginDecorationLaneCount})}static computeContainedMinimapLineCount(fe){const be=fe.height/fe.lineHeight,Ne=Math.floor(fe.paddingTop/fe.lineHeight);let Pe=Math.floor(fe.paddingBottom/fe.lineHeight);fe.scrollBeyondLastLine&&(Pe=Math.max(Pe,be-1));const ze=(Ne+fe.viewLineCount+Pe)/(fe.pixelRatio*fe.height),Ke=Math.floor(fe.viewLineCount/ze);return{typicalViewportLineCount:be,extraLinesBeforeFirstLine:Ne,extraLinesBeyondLastLine:Pe,desiredRatio:ze,minimapLineCount:Ke}}static _computeMinimapLayout(fe,be){const Ne=fe.outerWidth,Pe=fe.outerHeight,ze=fe.pixelRatio;if(!fe.minimap.enabled)return{renderMinimap:0,minimapLeft:0,minimapWidth:0,minimapHeightIsEditorHeight:!1,minimapIsSampling:!1,minimapScale:1,minimapLineHeight:1,minimapCanvasInnerWidth:0,minimapCanvasInnerHeight:Math.floor(ze*Pe),minimapCanvasOuterWidth:0,minimapCanvasOuterHeight:Pe};const Ke=be.stableMinimapLayoutInput,je=Ke&&fe.outerHeight===Ke.outerHeight&&fe.lineHeight===Ke.lineHeight&&fe.typicalHalfwidthCharacterWidth===Ke.typicalHalfwidthCharacterWidth&&fe.pixelRatio===Ke.pixelRatio&&fe.scrollBeyondLastLine===Ke.scrollBeyondLastLine&&fe.paddingTop===Ke.paddingTop&&fe.paddingBottom===Ke.paddingBottom&&fe.minimap.enabled===Ke.minimap.enabled&&fe.minimap.side===Ke.minimap.side&&fe.minimap.size===Ke.minimap.size&&fe.minimap.showSlider===Ke.minimap.showSlider&&fe.minimap.renderCharacters===Ke.minimap.renderCharacters&&fe.minimap.maxColumn===Ke.minimap.maxColumn&&fe.minimap.scale===Ke.minimap.scale&&fe.verticalScrollbarWidth===Ke.verticalScrollbarWidth&&fe.isViewportWrapping===Ke.isViewportWrapping,Je=fe.lineHeight,rt=fe.typicalHalfwidthCharacterWidth,et=fe.scrollBeyondLastLine,st=fe.minimap.renderCharacters;let Qe=ze>=2?Math.round(fe.minimap.scale*2):fe.minimap.scale;const ft=fe.minimap.maxColumn,at=fe.minimap.size,ct=fe.minimap.side,lt=fe.verticalScrollbarWidth,mt=fe.viewLineCount,pt=fe.remainingWidth,Le=fe.isViewportWrapping,ye=st?2:3;let Me=Math.floor(ze*Pe);const Te=Me/ze;let we=!1,Re=!1,Oe=ye*Qe,Ve=Qe/ze,$e=1;if(at==="fill"||at==="fit"){const{typicalViewportLineCount:Ue,extraLinesBeforeFirstLine:tt,extraLinesBeyondLastLine:Xe,desiredRatio:dt,minimapLineCount:it}=K.computeContainedMinimapLineCount({viewLineCount:mt,scrollBeyondLastLine:et,paddingTop:fe.paddingTop,paddingBottom:fe.paddingBottom,height:Pe,lineHeight:Je,pixelRatio:ze});if(mt/it>1)we=!0,Re=!0,Qe=1,Oe=1,Ve=Qe/ze;else{let ot=!1,ht=Qe+1;if(at==="fit"){const St=Math.ceil((tt+mt+Xe)*Oe);Le&&je&&pt<=be.stableFitRemainingWidth?(ot=!0,ht=be.stableFitMaxMinimapScale):ot=St>Me}if(at==="fill"||ot){we=!0;const St=Qe;Oe=Math.min(Je*ze,Math.max(1,Math.floor(1/dt))),Le&&je&&pt<=be.stableFitRemainingWidth&&(ht=be.stableFitMaxMinimapScale),Qe=Math.min(ht,Math.max(1,Math.floor(Oe/ye))),Qe>St&&($e=Math.min(2,Qe/St)),Ve=Qe/ze/$e,Me=Math.ceil(Math.max(Ue,tt+mt+Xe)*Oe),Le?(be.stableMinimapLayoutInput=fe,be.stableFitRemainingWidth=pt,be.stableFitMaxMinimapScale=Qe):(be.stableMinimapLayoutInput=null,be.stableFitRemainingWidth=0)}}}const Ze=Math.floor(ft*Ve),Ge=Math.min(Ze,Math.max(0,Math.floor((pt-lt-2)*Ve/(rt+Ve)))+e.MINIMAP_GUTTER_WIDTH);let qe=Math.floor(ze*Ge);const Fe=qe/ze;qe=Math.floor(qe*$e);const We=st?1:2,He=ct==="left"?0:Ne-Ge-lt;return{renderMinimap:We,minimapLeft:He,minimapWidth:Ge,minimapHeightIsEditorHeight:we,minimapIsSampling:Re,minimapScale:Qe,minimapLineHeight:Oe,minimapCanvasInnerWidth:qe,minimapCanvasInnerHeight:Me,minimapCanvasOuterWidth:Fe,minimapCanvasOuterHeight:Te}}static computeLayout(fe,be){const Ne=be.outerWidth|0,Pe=be.outerHeight|0,ze=be.lineHeight|0,Ke=be.lineNumbersDigitCount|0,je=be.typicalHalfwidthCharacterWidth,Je=be.maxDigitWidth,rt=be.pixelRatio,et=be.viewLineCount,st=fe.get(135),Qe=st==="inherit"?fe.get(134):st,ft=Qe==="inherit"?fe.get(130):Qe,at=fe.get(133),ct=be.isDominatedByLongLines,lt=fe.get(57),mt=fe.get(67).renderType!==0,pt=fe.get(68),Le=fe.get(104),ye=fe.get(83),Me=fe.get(72),Te=fe.get(102),we=Te.verticalScrollbarSize,Re=Te.verticalHasArrows,Oe=Te.arrowSize,Ve=Te.horizontalScrollbarSize,$e=fe.get(43),Ze=fe.get(109)!=="never";let Ge=fe.get(65);$e&&Ze&&(Ge+=16);let qe=0;if(mt){const wt=Math.max(Ke,pt);qe=Math.round(wt*Je)}let Fe=0;lt&&(Fe=ze*be.glyphMarginDecorationLaneCount);let We=0,He=We+Fe,Ue=He+qe,tt=Ue+Ge;const Xe=Ne-Fe-qe-Ge;let dt=!1,it=!1,nt=-1;Qe==="inherit"&&ct?(dt=!0,it=!0):ft==="on"||ft==="bounded"?it=!0:ft==="wordWrapColumn"&&(nt=at);const ot=K._computeMinimapLayout({outerWidth:Ne,outerHeight:Pe,lineHeight:ze,typicalHalfwidthCharacterWidth:je,pixelRatio:rt,scrollBeyondLastLine:Le,paddingTop:ye.top,paddingBottom:ye.bottom,minimap:Me,verticalScrollbarWidth:we,viewLineCount:et,remainingWidth:Xe,isViewportWrapping:it},be.memory||new v);ot.renderMinimap!==0&&ot.minimapLeft===0&&(We+=ot.minimapWidth,He+=ot.minimapWidth,Ue+=ot.minimapWidth,tt+=ot.minimapWidth);const ht=Xe-ot.minimapWidth,St=Math.max(1,Math.floor((ht-we-2)/je)),ut=Re?Oe:0;return it&&(nt=Math.max(1,St),ft==="bounded"&&(nt=Math.min(nt,at))),{width:Ne,height:Pe,glyphMarginLeft:We,glyphMarginWidth:Fe,glyphMarginDecorationLaneCount:be.glyphMarginDecorationLaneCount,lineNumbersLeft:He,lineNumbersWidth:qe,decorationsLeft:Ue,decorationsWidth:Ge,contentLeft:tt,contentWidth:ht,minimap:ot,viewportColumn:St,isWordWrapMinified:dt,isViewportWrapping:it,wrappingColumn:nt,verticalScrollbarWidth:we,horizontalScrollbarHeight:Ve,overviewRuler:{top:ut,width:we,height:Pe-2*ut,right:0}}}}e.EditorLayoutInfoComputer=K;class F extends b{constructor(){super(137,"wrappingStrategy","simple",{"editor.wrappingStrategy":{enumDescriptions:[p.localize(47,null),p.localize(48,null)],type:"string",enum:["simple","advanced"],default:"simple",description:p.localize(49,null)}})}validate(fe){return o(fe,"simple",["simple","advanced"])}compute(fe,be,Ne){return be.get(2)===2?"advanced":Ne}}var q;(function(Ie){Ie.Off="off",Ie.OnCode="onCode",Ie.On="on"})(q||(e.ShowLightbulbIconMode=q={}));class ie extends b{constructor(){const fe={enabled:q.OnCode};super(64,"lightbulb",fe,{"editor.lightbulb.enabled":{type:"string",tags:["experimental"],enum:[q.Off,q.OnCode,q.On],default:fe.enabled,enumDescriptions:[p.localize(50,null),p.localize(51,null),p.localize(52,null)],description:p.localize(53,null)}})}validate(fe){return!fe||typeof fe!="object"?this.defaultValue:{enabled:o(fe.enabled,this.defaultValue.enabled,[q.Off,q.OnCode,q.On])}}}class ae extends b{constructor(){const fe={enabled:!1,maxLineCount:5,defaultModel:"outlineModel",scrollWithEditor:!0};super(114,"stickyScroll",fe,{"editor.stickyScroll.enabled":{type:"boolean",default:fe.enabled,description:p.localize(54,null),tags:["experimental"]},"editor.stickyScroll.maxLineCount":{type:"number",default:fe.maxLineCount,minimum:1,maximum:10,description:p.localize(55,null)},"editor.stickyScroll.defaultModel":{type:"string",enum:["outlineModel","foldingProviderModel","indentationModel"],default:fe.defaultModel,description:p.localize(56,null)},"editor.stickyScroll.scrollWithEditor":{type:"boolean",default:fe.scrollWithEditor,description:p.localize(57,null)}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return{enabled:r(be.enabled,this.defaultValue.enabled),maxLineCount:c.clampedInt(be.maxLineCount,this.defaultValue.maxLineCount,1,10),defaultModel:o(be.defaultModel,this.defaultValue.defaultModel,["outlineModel","foldingProviderModel","indentationModel"]),scrollWithEditor:r(be.scrollWithEditor,this.defaultValue.scrollWithEditor)}}}class ne extends b{constructor(){const fe={enabled:"on",fontSize:0,fontFamily:"",padding:!1};super(139,"inlayHints",fe,{"editor.inlayHints.enabled":{type:"string",default:fe.enabled,description:p.localize(58,null),enum:["on","onUnlessPressed","offUnlessPressed","off"],markdownEnumDescriptions:[p.localize(59,null),p.localize(60,null,y.isMacintosh?"Ctrl+Option":"Ctrl+Alt"),p.localize(61,null,y.isMacintosh?"Ctrl+Option":"Ctrl+Alt"),p.localize(62,null)]},"editor.inlayHints.fontSize":{type:"number",default:fe.fontSize,markdownDescription:p.localize(63,null,"`#editor.fontSize#`","`5`")},"editor.inlayHints.fontFamily":{type:"string",default:fe.fontFamily,markdownDescription:p.localize(64,null,"`#editor.fontFamily#`")},"editor.inlayHints.padding":{type:"boolean",default:fe.padding,description:p.localize(65,null)}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return typeof be.enabled=="boolean"&&(be.enabled=be.enabled?"on":"off"),{enabled:o(be.enabled,this.defaultValue.enabled,["on","off","offUnlessPressed","onUnlessPressed"]),fontSize:c.clampedInt(be.fontSize,this.defaultValue.fontSize,0,100),fontFamily:l.string(be.fontFamily,this.defaultValue.fontFamily),padding:r(be.padding,this.defaultValue.padding)}}}class $ extends b{constructor(){super(65,"lineDecorationsWidth",10)}validate(fe){return typeof fe=="string"&&/^\d+(\.\d+)?ch$/.test(fe)?-parseFloat(fe.substring(0,fe.length-2)):c.clampedInt(fe,this.defaultValue,0,1e3)}compute(fe,be,Ne){return Ne<0?c.clampedInt(-Ne*fe.fontInfo.typicalHalfwidthCharacterWidth,this.defaultValue,0,1e3):Ne}}class J extends s{constructor(){super(66,"lineHeight",e.EDITOR_FONT_DEFAULTS.lineHeight,fe=>s.clamp(fe,0,150),{markdownDescription:p.localize(66,null)})}compute(fe,be,Ne){return fe.fontInfo.lineHeight}}class Q extends b{constructor(){const fe={enabled:!0,size:"proportional",side:"right",showSlider:"mouseover",autohide:!1,renderCharacters:!0,maxColumn:120,scale:1};super(72,"minimap",fe,{"editor.minimap.enabled":{type:"boolean",default:fe.enabled,description:p.localize(67,null)},"editor.minimap.autohide":{type:"boolean",default:fe.autohide,description:p.localize(68,null)},"editor.minimap.size":{type:"string",enum:["proportional","fill","fit"],enumDescriptions:[p.localize(69,null),p.localize(70,null),p.localize(71,null)],default:fe.size,description:p.localize(72,null)},"editor.minimap.side":{type:"string",enum:["left","right"],default:fe.side,description:p.localize(73,null)},"editor.minimap.showSlider":{type:"string",enum:["always","mouseover"],default:fe.showSlider,description:p.localize(74,null)},"editor.minimap.scale":{type:"number",default:fe.scale,minimum:1,maximum:3,enum:[1,2,3],description:p.localize(75,null)},"editor.minimap.renderCharacters":{type:"boolean",default:fe.renderCharacters,description:p.localize(76,null)},"editor.minimap.maxColumn":{type:"number",default:fe.maxColumn,description:p.localize(77,null)}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return{enabled:r(be.enabled,this.defaultValue.enabled),autohide:r(be.autohide,this.defaultValue.autohide),size:o(be.size,this.defaultValue.size,["proportional","fill","fit"]),side:o(be.side,this.defaultValue.side,["right","left"]),showSlider:o(be.showSlider,this.defaultValue.showSlider,["always","mouseover"]),renderCharacters:r(be.renderCharacters,this.defaultValue.renderCharacters),scale:c.clampedInt(be.scale,1,1,3),maxColumn:c.clampedInt(be.maxColumn,this.defaultValue.maxColumn,1,1e4)}}}function re(Ie){return Ie==="ctrlCmd"?y.isMacintosh?"metaKey":"ctrlKey":"altKey"}class de extends b{constructor(){super(83,"padding",{top:0,bottom:0},{"editor.padding.top":{type:"number",default:0,minimum:0,maximum:1e3,description:p.localize(78,null)},"editor.padding.bottom":{type:"number",default:0,minimum:0,maximum:1e3,description:p.localize(79,null)}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return{top:c.clampedInt(be.top,0,0,1e3),bottom:c.clampedInt(be.bottom,0,0,1e3)}}}class he extends b{constructor(){const fe={enabled:!0,cycle:!0};super(85,"parameterHints",fe,{"editor.parameterHints.enabled":{type:"boolean",default:fe.enabled,description:p.localize(80,null)},"editor.parameterHints.cycle":{type:"boolean",default:fe.cycle,description:p.localize(81,null)}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return{enabled:r(be.enabled,this.defaultValue.enabled),cycle:r(be.cycle,this.defaultValue.cycle)}}}class me extends n{constructor(){super(141)}compute(fe,be,Ne){return fe.pixelRatio}}class X extends b{constructor(){const fe={other:"on",comments:"off",strings:"off"},be=[{type:"boolean"},{type:"string",enum:["on","inline","off"],enumDescriptions:[p.localize(82,null),p.localize(83,null),p.localize(84,null)]}];super(88,"quickSuggestions",fe,{type:"object",additionalProperties:!1,properties:{strings:{anyOf:be,default:fe.strings,description:p.localize(85,null)},comments:{anyOf:be,default:fe.comments,description:p.localize(86,null)},other:{anyOf:be,default:fe.other,description:p.localize(87,null)}},default:fe,markdownDescription:p.localize(88,null,"#editor.suggestOnTriggerCharacters#")}),this.defaultValue=fe}validate(fe){if(typeof fe=="boolean"){const rt=fe?"on":"off";return{comments:rt,strings:rt,other:rt}}if(!fe||typeof fe!="object")return this.defaultValue;const{other:be,comments:Ne,strings:Pe}=fe,ze=["on","inline","off"];let Ke,je,Je;return typeof be=="boolean"?Ke=be?"on":"off":Ke=o(be,this.defaultValue.other,ze),typeof Ne=="boolean"?je=Ne?"on":"off":je=o(Ne,this.defaultValue.comments,ze),typeof Pe=="boolean"?Je=Pe?"on":"off":Je=o(Pe,this.defaultValue.strings,ze),{other:Ke,comments:je,strings:Je}}}class U extends b{constructor(){super(67,"lineNumbers",{renderType:1,renderFn:null},{type:"string",enum:["off","on","relative","interval"],enumDescriptions:[p.localize(89,null),p.localize(90,null),p.localize(91,null),p.localize(92,null)],default:"on",description:p.localize(93,null)})}validate(fe){let be=this.defaultValue.renderType,Ne=this.defaultValue.renderFn;return typeof fe<"u"&&(typeof fe=="function"?(be=4,Ne=fe):fe==="interval"?be=3:fe==="relative"?be=2:fe==="on"?be=1:be=0),{renderType:be,renderFn:Ne}}}function G(Ie){const fe=Ie.get(97);return fe==="editable"?Ie.get(90):fe!=="on"}e.filterValidationDecorations=G;class z extends b{constructor(){const fe=[],be={type:"number",description:p.localize(94,null)};super(101,"rulers",fe,{type:"array",items:{anyOf:[be,{type:["object"],properties:{column:be,color:{type:"string",description:p.localize(95,null),format:"color-hex"}}}]},default:fe,description:p.localize(96,null)})}validate(fe){if(Array.isArray(fe)){const be=[];for(const Ne of fe)if(typeof Ne=="number")be.push({column:c.clampedInt(Ne,0,0,1e4),color:null});else if(Ne&&typeof Ne=="object"){const Pe=Ne;be.push({column:c.clampedInt(Pe.column,0,0,1e4),color:Pe.color})}return be.sort((Ne,Pe)=>Ne.column-Pe.column),be}return this.defaultValue}}class H extends b{constructor(){super(91,"readOnlyMessage",void 0)}validate(fe){return!fe||typeof fe!="object"?this.defaultValue:fe}}function Y(Ie,fe){if(typeof Ie!="string")return fe;switch(Ie){case"hidden":return 2;case"visible":return 3;default:return 1}}class j extends b{constructor(){const fe={vertical:1,horizontal:1,arrowSize:11,useShadows:!0,verticalHasArrows:!1,horizontalHasArrows:!1,horizontalScrollbarSize:12,horizontalSliderSize:12,verticalScrollbarSize:14,verticalSliderSize:14,handleMouseWheel:!0,alwaysConsumeMouseWheel:!0,scrollByPage:!1,ignoreHorizontalScrollbarInContentHeight:!1};super(102,"scrollbar",fe,{"editor.scrollbar.vertical":{type:"string",enum:["auto","visible","hidden"],enumDescriptions:[p.localize(97,null),p.localize(98,null),p.localize(99,null)],default:"auto",description:p.localize(100,null)},"editor.scrollbar.horizontal":{type:"string",enum:["auto","visible","hidden"],enumDescriptions:[p.localize(101,null),p.localize(102,null),p.localize(103,null)],default:"auto",description:p.localize(104,null)},"editor.scrollbar.verticalScrollbarSize":{type:"number",default:fe.verticalScrollbarSize,description:p.localize(105,null)},"editor.scrollbar.horizontalScrollbarSize":{type:"number",default:fe.horizontalScrollbarSize,description:p.localize(106,null)},"editor.scrollbar.scrollByPage":{type:"boolean",default:fe.scrollByPage,description:p.localize(107,null)},"editor.scrollbar.ignoreHorizontalScrollbarInContentHeight":{type:"boolean",default:fe.ignoreHorizontalScrollbarInContentHeight,description:p.localize(108,null)}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe,Ne=c.clampedInt(be.horizontalScrollbarSize,this.defaultValue.horizontalScrollbarSize,0,1e3),Pe=c.clampedInt(be.verticalScrollbarSize,this.defaultValue.verticalScrollbarSize,0,1e3);return{arrowSize:c.clampedInt(be.arrowSize,this.defaultValue.arrowSize,0,1e3),vertical:Y(be.vertical,this.defaultValue.vertical),horizontal:Y(be.horizontal,this.defaultValue.horizontal),useShadows:r(be.useShadows,this.defaultValue.useShadows),verticalHasArrows:r(be.verticalHasArrows,this.defaultValue.verticalHasArrows),horizontalHasArrows:r(be.horizontalHasArrows,this.defaultValue.horizontalHasArrows),handleMouseWheel:r(be.handleMouseWheel,this.defaultValue.handleMouseWheel),alwaysConsumeMouseWheel:r(be.alwaysConsumeMouseWheel,this.defaultValue.alwaysConsumeMouseWheel),horizontalScrollbarSize:Ne,horizontalSliderSize:c.clampedInt(be.horizontalSliderSize,Ne,0,1e3),verticalScrollbarSize:Pe,verticalSliderSize:c.clampedInt(be.verticalSliderSize,Pe,0,1e3),scrollByPage:r(be.scrollByPage,this.defaultValue.scrollByPage),ignoreHorizontalScrollbarInContentHeight:r(be.ignoreHorizontalScrollbarInContentHeight,this.defaultValue.ignoreHorizontalScrollbarInContentHeight)}}}e.inUntrustedWorkspace="inUntrustedWorkspace",e.unicodeHighlightConfigKeys={allowedCharacters:"editor.unicodeHighlight.allowedCharacters",invisibleCharacters:"editor.unicodeHighlight.invisibleCharacters",nonBasicASCII:"editor.unicodeHighlight.nonBasicASCII",ambiguousCharacters:"editor.unicodeHighlight.ambiguousCharacters",includeComments:"editor.unicodeHighlight.includeComments",includeStrings:"editor.unicodeHighlight.includeStrings",allowedLocales:"editor.unicodeHighlight.allowedLocales"};class Z extends b{constructor(){const fe={nonBasicASCII:e.inUntrustedWorkspace,invisibleCharacters:!0,ambiguousCharacters:!0,includeComments:e.inUntrustedWorkspace,includeStrings:!0,allowedCharacters:{},allowedLocales:{_os:!0,_vscode:!0}};super(124,"unicodeHighlight",fe,{[e.unicodeHighlightConfigKeys.nonBasicASCII]:{restricted:!0,type:["boolean","string"],enum:[!0,!1,e.inUntrustedWorkspace],default:fe.nonBasicASCII,description:p.localize(109,null)},[e.unicodeHighlightConfigKeys.invisibleCharacters]:{restricted:!0,type:"boolean",default:fe.invisibleCharacters,description:p.localize(110,null)},[e.unicodeHighlightConfigKeys.ambiguousCharacters]:{restricted:!0,type:"boolean",default:fe.ambiguousCharacters,description:p.localize(111,null)},[e.unicodeHighlightConfigKeys.includeComments]:{restricted:!0,type:["boolean","string"],enum:[!0,!1,e.inUntrustedWorkspace],default:fe.includeComments,description:p.localize(112,null)},[e.unicodeHighlightConfigKeys.includeStrings]:{restricted:!0,type:["boolean","string"],enum:[!0,!1,e.inUntrustedWorkspace],default:fe.includeStrings,description:p.localize(113,null)},[e.unicodeHighlightConfigKeys.allowedCharacters]:{restricted:!0,type:"object",default:fe.allowedCharacters,description:p.localize(114,null),additionalProperties:{type:"boolean"}},[e.unicodeHighlightConfigKeys.allowedLocales]:{restricted:!0,type:"object",additionalProperties:{type:"boolean"},default:fe.allowedLocales,description:p.localize(115,null)}})}applyUpdate(fe,be){let Ne=!1;be.allowedCharacters&&fe&&(k.equals(fe.allowedCharacters,be.allowedCharacters)||(fe={...fe,allowedCharacters:be.allowedCharacters},Ne=!0)),be.allowedLocales&&fe&&(k.equals(fe.allowedLocales,be.allowedLocales)||(fe={...fe,allowedLocales:be.allowedLocales},Ne=!0));const Pe=super.applyUpdate(fe,be);return Ne?new a(Pe.newValue,!0):Pe}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return{nonBasicASCII:ce(be.nonBasicASCII,e.inUntrustedWorkspace,[!0,!1,e.inUntrustedWorkspace]),invisibleCharacters:r(be.invisibleCharacters,this.defaultValue.invisibleCharacters),ambiguousCharacters:r(be.ambiguousCharacters,this.defaultValue.ambiguousCharacters),includeComments:ce(be.includeComments,e.inUntrustedWorkspace,[!0,!1,e.inUntrustedWorkspace]),includeStrings:ce(be.includeStrings,e.inUntrustedWorkspace,[!0,!1,e.inUntrustedWorkspace]),allowedCharacters:this.validateBooleanMap(fe.allowedCharacters,this.defaultValue.allowedCharacters),allowedLocales:this.validateBooleanMap(fe.allowedLocales,this.defaultValue.allowedLocales)}}validateBooleanMap(fe,be){if(typeof fe!="object"||!fe)return be;const Ne={};for(const[Pe,ze]of Object.entries(fe))ze===!0&&(Ne[Pe]=!0);return Ne}}class ee extends b{constructor(){const fe={enabled:!0,mode:"subwordSmart",showToolbar:"onHover",suppressSuggestions:!1,keepOnBlur:!1,fontFamily:"default"};super(62,"inlineSuggest",fe,{"editor.inlineSuggest.enabled":{type:"boolean",default:fe.enabled,description:p.localize(116,null)},"editor.inlineSuggest.showToolbar":{type:"string",default:fe.showToolbar,enum:["always","onHover","never"],enumDescriptions:[p.localize(117,null),p.localize(118,null),p.localize(119,null)],description:p.localize(120,null)},"editor.inlineSuggest.suppressSuggestions":{type:"boolean",default:fe.suppressSuggestions,description:p.localize(121,null)},"editor.inlineSuggest.fontFamily":{type:"string",default:fe.fontFamily,description:p.localize(122,null)}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return{enabled:r(be.enabled,this.defaultValue.enabled),mode:o(be.mode,this.defaultValue.mode,["prefix","subword","subwordSmart"]),showToolbar:o(be.showToolbar,this.defaultValue.showToolbar,["always","onHover","never"]),suppressSuggestions:r(be.suppressSuggestions,this.defaultValue.suppressSuggestions),keepOnBlur:r(be.keepOnBlur,this.defaultValue.keepOnBlur),fontFamily:l.string(be.fontFamily,this.defaultValue.fontFamily)}}}class le extends b{constructor(){const fe={enabled:E.EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions.enabled,independentColorPoolPerBracketType:E.EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions.independentColorPoolPerBracketType};super(15,"bracketPairColorization",fe,{"editor.bracketPairColorization.enabled":{type:"boolean",default:fe.enabled,markdownDescription:p.localize(123,null,"`#workbench.colorCustomizations#`")},"editor.bracketPairColorization.independentColorPoolPerBracketType":{type:"boolean",default:fe.independentColorPoolPerBracketType,description:p.localize(124,null)}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return{enabled:r(be.enabled,this.defaultValue.enabled),independentColorPoolPerBracketType:r(be.independentColorPoolPerBracketType,this.defaultValue.independentColorPoolPerBracketType)}}}class ue extends b{constructor(){const fe={bracketPairs:!1,bracketPairsHorizontal:"active",highlightActiveBracketPair:!0,indentation:!0,highlightActiveIndentation:!0};super(16,"guides",fe,{"editor.guides.bracketPairs":{type:["boolean","string"],enum:[!0,"active",!1],enumDescriptions:[p.localize(125,null),p.localize(126,null),p.localize(127,null)],default:fe.bracketPairs,description:p.localize(128,null)},"editor.guides.bracketPairsHorizontal":{type:["boolean","string"],enum:[!0,"active",!1],enumDescriptions:[p.localize(129,null),p.localize(130,null),p.localize(131,null)],default:fe.bracketPairsHorizontal,description:p.localize(132,null)},"editor.guides.highlightActiveBracketPair":{type:"boolean",default:fe.highlightActiveBracketPair,description:p.localize(133,null)},"editor.guides.indentation":{type:"boolean",default:fe.indentation,description:p.localize(134,null)},"editor.guides.highlightActiveIndentation":{type:["boolean","string"],enum:[!0,"always",!1],enumDescriptions:[p.localize(135,null),p.localize(136,null),p.localize(137,null)],default:fe.highlightActiveIndentation,description:p.localize(138,null)}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return{bracketPairs:ce(be.bracketPairs,this.defaultValue.bracketPairs,[!0,!1,"active"]),bracketPairsHorizontal:ce(be.bracketPairsHorizontal,this.defaultValue.bracketPairsHorizontal,[!0,!1,"active"]),highlightActiveBracketPair:r(be.highlightActiveBracketPair,this.defaultValue.highlightActiveBracketPair),indentation:r(be.indentation,this.defaultValue.indentation),highlightActiveIndentation:ce(be.highlightActiveIndentation,this.defaultValue.highlightActiveIndentation,[!0,!1,"always"])}}}function ce(Ie,fe,be){const Ne=be.indexOf(Ie);return Ne===-1?fe:be[Ne]}class pe extends b{constructor(){const fe={insertMode:"insert",filterGraceful:!0,snippetsPreventQuickSuggestions:!1,localityBonus:!1,shareSuggestSelections:!1,selectionMode:"always",showIcons:!0,showStatusBar:!1,preview:!1,previewMode:"subwordSmart",showInlineDetails:!0,showMethods:!0,showFunctions:!0,showConstructors:!0,showDeprecated:!0,matchOnWordStartOnly:!0,showFields:!0,showVariables:!0,showClasses:!0,showStructs:!0,showInterfaces:!0,showModules:!0,showProperties:!0,showEvents:!0,showOperators:!0,showUnits:!0,showValues:!0,showConstants:!0,showEnums:!0,showEnumMembers:!0,showKeywords:!0,showWords:!0,showColors:!0,showFiles:!0,showReferences:!0,showFolders:!0,showTypeParameters:!0,showSnippets:!0,showUsers:!0,showIssues:!0};super(117,"suggest",fe,{"editor.suggest.insertMode":{type:"string",enum:["insert","replace"],enumDescriptions:[p.localize(139,null),p.localize(140,null)],default:fe.insertMode,description:p.localize(141,null)},"editor.suggest.filterGraceful":{type:"boolean",default:fe.filterGraceful,description:p.localize(142,null)},"editor.suggest.localityBonus":{type:"boolean",default:fe.localityBonus,description:p.localize(143,null)},"editor.suggest.shareSuggestSelections":{type:"boolean",default:fe.shareSuggestSelections,markdownDescription:p.localize(144,null)},"editor.suggest.selectionMode":{type:"string",enum:["always","never","whenTriggerCharacter","whenQuickSuggestion"],enumDescriptions:[p.localize(145,null),p.localize(146,null),p.localize(147,null),p.localize(148,null)],default:fe.selectionMode,markdownDescription:p.localize(149,null)},"editor.suggest.snippetsPreventQuickSuggestions":{type:"boolean",default:fe.snippetsPreventQuickSuggestions,description:p.localize(150,null)},"editor.suggest.showIcons":{type:"boolean",default:fe.showIcons,description:p.localize(151,null)},"editor.suggest.showStatusBar":{type:"boolean",default:fe.showStatusBar,description:p.localize(152,null)},"editor.suggest.preview":{type:"boolean",default:fe.preview,description:p.localize(153,null)},"editor.suggest.showInlineDetails":{type:"boolean",default:fe.showInlineDetails,description:p.localize(154,null)},"editor.suggest.maxVisibleSuggestions":{type:"number",deprecationMessage:p.localize(155,null)},"editor.suggest.filteredTypes":{type:"object",deprecationMessage:p.localize(156,null)},"editor.suggest.showMethods":{type:"boolean",default:!0,markdownDescription:p.localize(157,null)},"editor.suggest.showFunctions":{type:"boolean",default:!0,markdownDescription:p.localize(158,null)},"editor.suggest.showConstructors":{type:"boolean",default:!0,markdownDescription:p.localize(159,null)},"editor.suggest.showDeprecated":{type:"boolean",default:!0,markdownDescription:p.localize(160,null)},"editor.suggest.matchOnWordStartOnly":{type:"boolean",default:!0,markdownDescription:p.localize(161,null)},"editor.suggest.showFields":{type:"boolean",default:!0,markdownDescription:p.localize(162,null)},"editor.suggest.showVariables":{type:"boolean",default:!0,markdownDescription:p.localize(163,null)},"editor.suggest.showClasses":{type:"boolean",default:!0,markdownDescription:p.localize(164,null)},"editor.suggest.showStructs":{type:"boolean",default:!0,markdownDescription:p.localize(165,null)},"editor.suggest.showInterfaces":{type:"boolean",default:!0,markdownDescription:p.localize(166,null)},"editor.suggest.showModules":{type:"boolean",default:!0,markdownDescription:p.localize(167,null)},"editor.suggest.showProperties":{type:"boolean",default:!0,markdownDescription:p.localize(168,null)},"editor.suggest.showEvents":{type:"boolean",default:!0,markdownDescription:p.localize(169,null)},"editor.suggest.showOperators":{type:"boolean",default:!0,markdownDescription:p.localize(170,null)},"editor.suggest.showUnits":{type:"boolean",default:!0,markdownDescription:p.localize(171,null)},"editor.suggest.showValues":{type:"boolean",default:!0,markdownDescription:p.localize(172,null)},"editor.suggest.showConstants":{type:"boolean",default:!0,markdownDescription:p.localize(173,null)},"editor.suggest.showEnums":{type:"boolean",default:!0,markdownDescription:p.localize(174,null)},"editor.suggest.showEnumMembers":{type:"boolean",default:!0,markdownDescription:p.localize(175,null)},"editor.suggest.showKeywords":{type:"boolean",default:!0,markdownDescription:p.localize(176,null)},"editor.suggest.showWords":{type:"boolean",default:!0,markdownDescription:p.localize(177,null)},"editor.suggest.showColors":{type:"boolean",default:!0,markdownDescription:p.localize(178,null)},"editor.suggest.showFiles":{type:"boolean",default:!0,markdownDescription:p.localize(179,null)},"editor.suggest.showReferences":{type:"boolean",default:!0,markdownDescription:p.localize(180,null)},"editor.suggest.showCustomcolors":{type:"boolean",default:!0,markdownDescription:p.localize(181,null)},"editor.suggest.showFolders":{type:"boolean",default:!0,markdownDescription:p.localize(182,null)},"editor.suggest.showTypeParameters":{type:"boolean",default:!0,markdownDescription:p.localize(183,null)},"editor.suggest.showSnippets":{type:"boolean",default:!0,markdownDescription:p.localize(184,null)},"editor.suggest.showUsers":{type:"boolean",default:!0,markdownDescription:p.localize(185,null)},"editor.suggest.showIssues":{type:"boolean",default:!0,markdownDescription:p.localize(186,null)}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return{insertMode:o(be.insertMode,this.defaultValue.insertMode,["insert","replace"]),filterGraceful:r(be.filterGraceful,this.defaultValue.filterGraceful),snippetsPreventQuickSuggestions:r(be.snippetsPreventQuickSuggestions,this.defaultValue.filterGraceful),localityBonus:r(be.localityBonus,this.defaultValue.localityBonus),shareSuggestSelections:r(be.shareSuggestSelections,this.defaultValue.shareSuggestSelections),selectionMode:o(be.selectionMode,this.defaultValue.selectionMode,["always","never","whenQuickSuggestion","whenTriggerCharacter"]),showIcons:r(be.showIcons,this.defaultValue.showIcons),showStatusBar:r(be.showStatusBar,this.defaultValue.showStatusBar),preview:r(be.preview,this.defaultValue.preview),previewMode:o(be.previewMode,this.defaultValue.previewMode,["prefix","subword","subwordSmart"]),showInlineDetails:r(be.showInlineDetails,this.defaultValue.showInlineDetails),showMethods:r(be.showMethods,this.defaultValue.showMethods),showFunctions:r(be.showFunctions,this.defaultValue.showFunctions),showConstructors:r(be.showConstructors,this.defaultValue.showConstructors),showDeprecated:r(be.showDeprecated,this.defaultValue.showDeprecated),matchOnWordStartOnly:r(be.matchOnWordStartOnly,this.defaultValue.matchOnWordStartOnly),showFields:r(be.showFields,this.defaultValue.showFields),showVariables:r(be.showVariables,this.defaultValue.showVariables),showClasses:r(be.showClasses,this.defaultValue.showClasses),showStructs:r(be.showStructs,this.defaultValue.showStructs),showInterfaces:r(be.showInterfaces,this.defaultValue.showInterfaces),showModules:r(be.showModules,this.defaultValue.showModules),showProperties:r(be.showProperties,this.defaultValue.showProperties),showEvents:r(be.showEvents,this.defaultValue.showEvents),showOperators:r(be.showOperators,this.defaultValue.showOperators),showUnits:r(be.showUnits,this.defaultValue.showUnits),showValues:r(be.showValues,this.defaultValue.showValues),showConstants:r(be.showConstants,this.defaultValue.showConstants),showEnums:r(be.showEnums,this.defaultValue.showEnums),showEnumMembers:r(be.showEnumMembers,this.defaultValue.showEnumMembers),showKeywords:r(be.showKeywords,this.defaultValue.showKeywords),showWords:r(be.showWords,this.defaultValue.showWords),showColors:r(be.showColors,this.defaultValue.showColors),showFiles:r(be.showFiles,this.defaultValue.showFiles),showReferences:r(be.showReferences,this.defaultValue.showReferences),showFolders:r(be.showFolders,this.defaultValue.showFolders),showTypeParameters:r(be.showTypeParameters,this.defaultValue.showTypeParameters),showSnippets:r(be.showSnippets,this.defaultValue.showSnippets),showUsers:r(be.showUsers,this.defaultValue.showUsers),showIssues:r(be.showIssues,this.defaultValue.showIssues)}}}class ve extends b{constructor(){super(112,"smartSelect",{selectLeadingAndTrailingWhitespace:!0,selectSubwords:!0},{"editor.smartSelect.selectLeadingAndTrailingWhitespace":{description:p.localize(187,null),default:!0,type:"boolean"},"editor.smartSelect.selectSubwords":{description:p.localize(188,null),default:!0,type:"boolean"}})}validate(fe){return!fe||typeof fe!="object"?this.defaultValue:{selectLeadingAndTrailingWhitespace:r(fe.selectLeadingAndTrailingWhitespace,this.defaultValue.selectLeadingAndTrailingWhitespace),selectSubwords:r(fe.selectSubwords,this.defaultValue.selectSubwords)}}}class Ce extends b{constructor(){super(136,"wrappingIndent",1,{"editor.wrappingIndent":{type:"string",enum:["none","same","indent","deepIndent"],enumDescriptions:[p.localize(189,null),p.localize(190,null),p.localize(191,null),p.localize(192,null)],description:p.localize(193,null),default:"same"}})}validate(fe){switch(fe){case"none":return 0;case"same":return 1;case"indent":return 2;case"deepIndent":return 3}return 1}compute(fe,be,Ne){return be.get(2)===2?0:Ne}}class Se extends n{constructor(){super(144)}compute(fe,be,Ne){const Pe=be.get(143);return{isDominatedByLongLines:fe.isDominatedByLongLines,isWordWrapMinified:Pe.isWordWrapMinified,isViewportWrapping:Pe.isViewportWrapping,wrappingColumn:Pe.wrappingColumn}}}class _e extends b{constructor(){const fe={enabled:!0,showDropSelector:"afterDrop"};super(36,"dropIntoEditor",fe,{"editor.dropIntoEditor.enabled":{type:"boolean",default:fe.enabled,markdownDescription:p.localize(194,null)},"editor.dropIntoEditor.showDropSelector":{type:"string",markdownDescription:p.localize(195,null),enum:["afterDrop","never"],enumDescriptions:[p.localize(196,null),p.localize(197,null)],default:"afterDrop"}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return{enabled:r(be.enabled,this.defaultValue.enabled),showDropSelector:o(be.showDropSelector,this.defaultValue.showDropSelector,["afterDrop","never"])}}}class Ee extends b{constructor(){const fe={enabled:!0,showPasteSelector:"afterPaste"};super(84,"pasteAs",fe,{"editor.pasteAs.enabled":{type:"boolean",default:fe.enabled,markdownDescription:p.localize(198,null)},"editor.pasteAs.showPasteSelector":{type:"string",markdownDescription:p.localize(199,null),enum:["afterPaste","never"],enumDescriptions:[p.localize(200,null),p.localize(201,null)],default:"afterPaste"}})}validate(fe){if(!fe||typeof fe!="object")return this.defaultValue;const be=fe;return{enabled:r(be.enabled,this.defaultValue.enabled),showPasteSelector:o(be.showPasteSelector,this.defaultValue.showPasteSelector,["afterPaste","never"])}}}const Ae="Consolas, 'Courier New', monospace",xe="Menlo, Monaco, 'Courier New', monospace",Be="'Droid Sans Mono', 'monospace', monospace";e.EDITOR_FONT_DEFAULTS={fontFamily:y.isMacintosh?xe:y.isLinux?Be:Ae,fontWeight:"normal",fontSize:y.isMacintosh?12:14,lineHeight:0,letterSpacing:0},e.editorOptionsRegistry=[];function De(Ie){return e.editorOptionsRegistry[Ie.id]=Ie,Ie}e.EditorOptions={acceptSuggestionOnCommitCharacter:De(new u(0,"acceptSuggestionOnCommitCharacter",!0,{markdownDescription:p.localize(202,null)})),acceptSuggestionOnEnter:De(new g(1,"acceptSuggestionOnEnter","on",["on","smart","off"],{markdownEnumDescriptions:["",p.localize(203,null),""],markdownDescription:p.localize(204,null)})),accessibilitySupport:De(new C),accessibilityPageSize:De(new c(3,"accessibilityPageSize",10,1,1073741824,{description:p.localize(205,null),tags:["accessibility"]})),ariaLabel:De(new l(4,"ariaLabel",p.localize(206,null))),ariaRequired:De(new u(5,"ariaRequired",!1,void 0)),screenReaderAnnounceInlineSuggestion:De(new u(8,"screenReaderAnnounceInlineSuggestion",!0,{description:p.localize(207,null),tags:["accessibility"]})),autoClosingBrackets:De(new g(6,"autoClosingBrackets","languageDefined",["always","languageDefined","beforeWhitespace","never"],{enumDescriptions:["",p.localize(208,null),p.localize(209,null),""],description:p.localize(210,null)})),autoClosingComments:De(new g(7,"autoClosingComments","languageDefined",["always","languageDefined","beforeWhitespace","never"],{enumDescriptions:["",p.localize(211,null),p.localize(212,null),""],description:p.localize(213,null)})),autoClosingDelete:De(new g(9,"autoClosingDelete","auto",["always","auto","never"],{enumDescriptions:["",p.localize(214,null),""],description:p.localize(215,null)})),autoClosingOvertype:De(new g(10,"autoClosingOvertype","auto",["always","auto","never"],{enumDescriptions:["",p.localize(216,null),""],description:p.localize(217,null)})),autoClosingQuotes:De(new g(11,"autoClosingQuotes","languageDefined",["always","languageDefined","beforeWhitespace","never"],{enumDescriptions:["",p.localize(218,null),p.localize(219,null),""],description:p.localize(220,null)})),autoIndent:De(new h(12,"autoIndent",4,"full",["none","keep","brackets","advanced","full"],m,{enumDescriptions:[p.localize(221,null),p.localize(222,null),p.localize(223,null),p.localize(224,null),p.localize(225,null)],description:p.localize(226,null)})),automaticLayout:De(new u(13,"automaticLayout",!1)),autoSurround:De(new g(14,"autoSurround","languageDefined",["languageDefined","quotes","brackets","never"],{enumDescriptions:[p.localize(227,null),p.localize(228,null),p.localize(229,null),""],description:p.localize(230,null)})),bracketPairColorization:De(new le),bracketPairGuides:De(new ue),stickyTabStops:De(new u(115,"stickyTabStops",!1,{description:p.localize(231,null)})),codeLens:De(new u(17,"codeLens",!0,{description:p.localize(232,null)})),codeLensFontFamily:De(new l(18,"codeLensFontFamily","",{description:p.localize(233,null)})),codeLensFontSize:De(new c(19,"codeLensFontSize",0,0,100,{type:"number",default:0,minimum:0,maximum:100,markdownDescription:p.localize(234,null)})),colorDecorators:De(new u(20,"colorDecorators",!0,{description:p.localize(235,null)})),colorDecoratorActivatedOn:De(new g(146,"colorDecoratorsActivatedOn","clickAndHover",["clickAndHover","hover","click"],{enumDescriptions:[p.localize(236,null),p.localize(237,null),p.localize(238,null)],description:p.localize(239,null)})),colorDecoratorsLimit:De(new c(21,"colorDecoratorsLimit",500,1,1e6,{markdownDescription:p.localize(240,null)})),columnSelection:De(new u(22,"columnSelection",!1,{description:p.localize(241,null)})),comments:De(new w),contextmenu:De(new u(24,"contextmenu",!0)),copyWithSyntaxHighlighting:De(new u(25,"copyWithSyntaxHighlighting",!0,{description:p.localize(242,null)})),cursorBlinking:De(new h(26,"cursorBlinking",1,"blink",["blink","smooth","phase","expand","solid"],D,{description:p.localize(243,null)})),cursorSmoothCaretAnimation:De(new g(27,"cursorSmoothCaretAnimation","off",["off","explicit","on"],{enumDescriptions:[p.localize(244,null),p.localize(245,null),p.localize(246,null)],description:p.localize(247,null)})),cursorStyle:De(new h(28,"cursorStyle",I.Line,"line",["line","block","underline","line-thin","block-outline","underline-thin"],T,{description:p.localize(248,null)})),cursorSurroundingLines:De(new c(29,"cursorSurroundingLines",0,0,1073741824,{description:p.localize(249,null)})),cursorSurroundingLinesStyle:De(new g(30,"cursorSurroundingLinesStyle","default",["default","all"],{enumDescriptions:[p.localize(250,null),p.localize(251,null)],markdownDescription:p.localize(252,null)})),cursorWidth:De(new c(31,"cursorWidth",0,0,1073741824,{markdownDescription:p.localize(253,null)})),disableLayerHinting:De(new u(32,"disableLayerHinting",!1)),disableMonospaceOptimizations:De(new u(33,"disableMonospaceOptimizations",!1)),domReadOnly:De(new u(34,"domReadOnly",!1)),dragAndDrop:De(new u(35,"dragAndDrop",!0,{description:p.localize(254,null)})),emptySelectionClipboard:De(new P),dropIntoEditor:De(new _e),stickyScroll:De(new ae),experimentalWhitespaceRendering:De(new g(38,"experimentalWhitespaceRendering","svg",["svg","font","off"],{enumDescriptions:[p.localize(255,null),p.localize(256,null),p.localize(257,null)],description:p.localize(258,null)})),extraEditorClassName:De(new l(39,"extraEditorClassName","")),fastScrollSensitivity:De(new s(40,"fastScrollSensitivity",5,Ie=>Ie<=0?5:Ie,{markdownDescription:p.localize(259,null)})),find:De(new N),fixedOverflowWidgets:De(new u(42,"fixedOverflowWidgets",!1)),folding:De(new u(43,"folding",!0,{description:p.localize(260,null)})),foldingStrategy:De(new g(44,"foldingStrategy","auto",["auto","indentation"],{enumDescriptions:[p.localize(261,null),p.localize(262,null)],description:p.localize(263,null)})),foldingHighlight:De(new u(45,"foldingHighlight",!0,{description:p.localize(264,null)})),foldingImportsByDefault:De(new u(46,"foldingImportsByDefault",!1,{description:p.localize(265,null)})),foldingMaximumRegions:De(new c(47,"foldingMaximumRegions",5e3,10,65e3,{description:p.localize(266,null)})),unfoldOnClickAfterEndOfLine:De(new u(48,"unfoldOnClickAfterEndOfLine",!1,{description:p.localize(267,null)})),fontFamily:De(new l(49,"fontFamily",e.EDITOR_FONT_DEFAULTS.fontFamily,{description:p.localize(268,null)})),fontInfo:De(new x),fontLigatures2:De(new M),fontSize:De(new O),fontWeight:De(new B),fontVariations:De(new R),formatOnPaste:De(new u(55,"formatOnPaste",!1,{description:p.localize(269,null)})),formatOnType:De(new u(56,"formatOnType",!1,{description:p.localize(270,null)})),glyphMargin:De(new u(57,"glyphMargin",!0,{description:p.localize(271,null)})),gotoLocation:De(new W),hideCursorInOverviewRuler:De(new u(59,"hideCursorInOverviewRuler",!1,{description:p.localize(272,null)})),hover:De(new V),inDiffEditor:De(new u(61,"inDiffEditor",!1)),letterSpacing:De(new s(63,"letterSpacing",e.EDITOR_FONT_DEFAULTS.letterSpacing,Ie=>s.clamp(Ie,-5,20),{description:p.localize(273,null)})),lightbulb:De(new ie),lineDecorationsWidth:De(new $),lineHeight:De(new J),lineNumbers:De(new U),lineNumbersMinChars:De(new c(68,"lineNumbersMinChars",5,1,300)),linkedEditing:De(new u(69,"linkedEditing",!1,{description:p.localize(274,null)})),links:De(new u(70,"links",!0,{description:p.localize(275,null)})),matchBrackets:De(new g(71,"matchBrackets","always",["always","near","never"],{description:p.localize(276,null)})),minimap:De(new Q),mouseStyle:De(new g(73,"mouseStyle","text",["text","default","copy"])),mouseWheelScrollSensitivity:De(new s(74,"mouseWheelScrollSensitivity",1,Ie=>Ie===0?1:Ie,{markdownDescription:p.localize(277,null)})),mouseWheelZoom:De(new u(75,"mouseWheelZoom",!1,{markdownDescription:y.isMacintosh?p.localize(278,null):p.localize(279,null)})),multiCursorMergeOverlapping:De(new u(76,"multiCursorMergeOverlapping",!0,{description:p.localize(280,null)})),multiCursorModifier:De(new h(77,"multiCursorModifier","altKey","alt",["ctrlCmd","alt"],re,{markdownEnumDescriptions:[p.localize(281,null),p.localize(282,null)],markdownDescription:p.localize(283,null)})),multiCursorPaste:De(new g(78,"multiCursorPaste","spread",["spread","full"],{markdownEnumDescriptions:[p.localize(284,null),p.localize(285,null)],markdownDescription:p.localize(286,null)})),multiCursorLimit:De(new c(79,"multiCursorLimit",1e4,1,1e5,{markdownDescription:p.localize(287,null)})),occurrencesHighlight:De(new g(80,"occurrencesHighlight","singleFile",["off","singleFile","multiFile"],{markdownEnumDescriptions:[p.localize(288,null),p.localize(289,null),p.localize(290,null)],markdownDescription:p.localize(291,null)})),overviewRulerBorder:De(new u(81,"overviewRulerBorder",!0,{description:p.localize(292,null)})),overviewRulerLanes:De(new c(82,"overviewRulerLanes",3,0,3)),padding:De(new de),pasteAs:De(new Ee),parameterHints:De(new he),peekWidgetDefaultFocus:De(new g(86,"peekWidgetDefaultFocus","tree",["tree","editor"],{enumDescriptions:[p.localize(293,null),p.localize(294,null)],description:p.localize(295,null)})),definitionLinkOpensInPeek:De(new u(87,"definitionLinkOpensInPeek",!1,{description:p.localize(296,null)})),quickSuggestions:De(new X),quickSuggestionsDelay:De(new c(89,"quickSuggestionsDelay",10,0,1073741824,{description:p.localize(297,null)})),readOnly:De(new u(90,"readOnly",!1)),readOnlyMessage:De(new H),renameOnType:De(new u(92,"renameOnType",!1,{description:p.localize(298,null),markdownDeprecationMessage:p.localize(299,null)})),renderControlCharacters:De(new u(93,"renderControlCharacters",!0,{description:p.localize(300,null),restricted:!0})),renderFinalNewline:De(new g(94,"renderFinalNewline",y.isLinux?"dimmed":"on",["off","on","dimmed"],{description:p.localize(301,null)})),renderLineHighlight:De(new g(95,"renderLineHighlight","line",["none","gutter","line","all"],{enumDescriptions:["","","",p.localize(302,null)],description:p.localize(303,null)})),renderLineHighlightOnlyWhenFocus:De(new u(96,"renderLineHighlightOnlyWhenFocus",!1,{description:p.localize(304,null)})),renderValidationDecorations:De(new g(97,"renderValidationDecorations","editable",["editable","on","off"])),renderWhitespace:De(new g(98,"renderWhitespace","selection",["none","boundary","selection","trailing","all"],{enumDescriptions:["",p.localize(305,null),p.localize(306,null),p.localize(307,null),""],description:p.localize(308,null)})),revealHorizontalRightPadding:De(new c(99,"revealHorizontalRightPadding",15,0,1e3)),roundedSelection:De(new u(100,"roundedSelection",!0,{description:p.localize(309,null)})),rulers:De(new z),scrollbar:De(new j),scrollBeyondLastColumn:De(new c(103,"scrollBeyondLastColumn",4,0,1073741824,{description:p.localize(310,null)})),scrollBeyondLastLine:De(new u(104,"scrollBeyondLastLine",!0,{description:p.localize(311,null)})),scrollPredominantAxis:De(new u(105,"scrollPredominantAxis",!0,{description:p.localize(312,null)})),selectionClipboard:De(new u(106,"selectionClipboard",!0,{description:p.localize(313,null),included:y.isLinux})),selectionHighlight:De(new u(107,"selectionHighlight",!0,{description:p.localize(314,null)})),selectOnLineNumbers:De(new u(108,"selectOnLineNumbers",!0)),showFoldingControls:De(new g(109,"showFoldingControls","mouseover",["always","never","mouseover"],{enumDescriptions:[p.localize(315,null),p.localize(316,null),p.localize(317,null)],description:p.localize(318,null)})),showUnused:De(new u(110,"showUnused",!0,{description:p.localize(319,null)})),showDeprecated:De(new u(138,"showDeprecated",!0,{description:p.localize(320,null)})),inlayHints:De(new ne),snippetSuggestions:De(new g(111,"snippetSuggestions","inline",["top","bottom","inline","none"],{enumDescriptions:[p.localize(321,null),p.localize(322,null),p.localize(323,null),p.localize(324,null)],description:p.localize(325,null)})),smartSelect:De(new ve),smoothScrolling:De(new u(113,"smoothScrolling",!1,{description:p.localize(326,null)})),stopRenderingLineAfter:De(new c(116,"stopRenderingLineAfter",1e4,-1,1073741824)),suggest:De(new pe),inlineSuggest:De(new ee),inlineCompletionsAccessibilityVerbose:De(new u(147,"inlineCompletionsAccessibilityVerbose",!1,{description:p.localize(327,null)})),suggestFontSize:De(new c(118,"suggestFontSize",0,0,1e3,{markdownDescription:p.localize(328,null,"`0`","`#editor.fontSize#`")})),suggestLineHeight:De(new c(119,"suggestLineHeight",0,0,1e3,{markdownDescription:p.localize(329,null,"`0`","`#editor.lineHeight#`")})),suggestOnTriggerCharacters:De(new u(120,"suggestOnTriggerCharacters",!0,{description:p.localize(330,null)})),suggestSelection:De(new g(121,"suggestSelection","first",["first","recentlyUsed","recentlyUsedByPrefix"],{markdownEnumDescriptions:[p.localize(331,null),p.localize(332,null),p.localize(333,null)],description:p.localize(334,null)})),tabCompletion:De(new g(122,"tabCompletion","off",["on","off","onlySnippets"],{enumDescriptions:[p.localize(335,null),p.localize(336,null),p.localize(337,null)],description:p.localize(338,null)})),tabIndex:De(new c(123,"tabIndex",0,-1,1073741824)),unicodeHighlight:De(new Z),unusualLineTerminators:De(new g(125,"unusualLineTerminators","prompt",["auto","off","prompt"],{enumDescriptions:[p.localize(339,null),p.localize(340,null),p.localize(341,null)],description:p.localize(342,null)})),useShadowDOM:De(new u(126,"useShadowDOM",!0)),useTabStops:De(new u(127,"useTabStops",!0,{description:p.localize(343,null)})),wordBreak:De(new g(128,"wordBreak","normal",["normal","keepAll"],{markdownEnumDescriptions:[p.localize(344,null),p.localize(345,null)],description:p.localize(346,null)})),wordSeparators:De(new l(129,"wordSeparators",S.USUAL_WORD_SEPARATORS,{description:p.localize(347,null)})),wordWrap:De(new g(130,"wordWrap","off",["off","on","wordWrapColumn","bounded"],{markdownEnumDescriptions:[p.localize(348,null),p.localize(349,null),p.localize(350,null),p.localize(351,null)],description:p.localize(352,null)})),wordWrapBreakAfterCharacters:De(new l(131,"wordWrapBreakAfterCharacters"," 	})]?|/&.,;\xA2\xB0\u2032\u2033\u2030\u2103\u3001\u3002\uFF61\uFF64\uFFE0\uFF0C\uFF0E\uFF1A\uFF1B\uFF1F\uFF01\uFF05\u30FB\uFF65\u309D\u309E\u30FD\u30FE\u30FC\u30A1\u30A3\u30A5\u30A7\u30A9\u30C3\u30E3\u30E5\u30E7\u30EE\u30F5\u30F6\u3041\u3043\u3045\u3047\u3049\u3063\u3083\u3085\u3087\u308E\u3095\u3096\u31F0\u31F1\u31F2\u31F3\u31F4\u31F5\u31F6\u31F7\u31F8\u31F9\u31FA\u31FB\u31FC\u31FD\u31FE\u31FF\u3005\u303B\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C\uFF6D\uFF6E\uFF6F\uFF70\u201D\u3009\u300B\u300D\u300F\u3011\u3015\uFF09\uFF3D\uFF5D\uFF63")),wordWrapBreakBeforeCharacters:De(new l(132,"wordWrapBreakBeforeCharacters","([{\u2018\u201C\u3008\u300A\u300C\u300E\u3010\u3014\uFF08\uFF3B\uFF5B\uFF62\xA3\xA5\uFF04\uFFE1\uFFE5+\uFF0B")),wordWrapColumn:De(new c(133,"wordWrapColumn",80,1,1073741824,{markdownDescription:p.localize(353,null)})),wordWrapOverride1:De(new g(134,"wordWrapOverride1","inherit",["off","on","inherit"])),wordWrapOverride2:De(new g(135,"wordWrapOverride2","inherit",["off","on","inherit"])),editorClassName:De(new A),defaultColorDecorators:De(new u(145,"defaultColorDecorators",!1,{markdownDescription:p.localize(354,null)})),pixelRatio:De(new me),tabFocusMode:De(new u(142,"tabFocusMode",!1,{markdownDescription:p.localize(355,null)})),layoutInfo:De(new K),wrappingInfo:De(new Se),wrappingIndent:De(new Ce),wrappingStrategy:De(new F)}}),define(se[636],oe([1,0,7,40,11,72,36,10,5,200]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewCursor=void 0;class b{constructor(n,t,r,u,f,c,d){this.top=n,this.left=t,this.paddingLeft=r,this.width=u,this.height=f,this.textContent=c,this.textContentClassName=d}}class a{constructor(n){this._context=n;const t=this._context.configuration.options,r=t.get(50);this._cursorStyle=t.get(28),this._lineHeight=t.get(66),this._typicalHalfwidthCharacterWidth=r.typicalHalfwidthCharacterWidth,this._lineCursorWidth=Math.min(t.get(31),this._typicalHalfwidthCharacterWidth),this._isVisible=!0,this._domNode=(0,k.createFastDomNode)(document.createElement("div")),this._domNode.setClassName(`cursor ${v.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`),this._domNode.setHeight(this._lineHeight),this._domNode.setTop(0),this._domNode.setLeft(0),(0,E.applyFontInfo)(this._domNode,r),this._domNode.setDisplay("none"),this._position=new p.Position(1,1),this._lastRenderedContent="",this._renderData=null}getDomNode(){return this._domNode}getPosition(){return this._position}show(){this._isVisible||(this._domNode.setVisibility("inherit"),this._isVisible=!0)}hide(){this._isVisible&&(this._domNode.setVisibility("hidden"),this._isVisible=!1)}onConfigurationChanged(n){const t=this._context.configuration.options,r=t.get(50);return this._cursorStyle=t.get(28),this._lineHeight=t.get(66),this._typicalHalfwidthCharacterWidth=r.typicalHalfwidthCharacterWidth,this._lineCursorWidth=Math.min(t.get(31),this._typicalHalfwidthCharacterWidth),(0,E.applyFontInfo)(this._domNode,r),!0}onCursorPositionChanged(n,t){return t?this._domNode.domNode.style.transitionProperty="none":this._domNode.domNode.style.transitionProperty="",this._position=n,!0}_getGraphemeAwarePosition(){const{lineNumber:n,column:t}=this._position,r=this._context.viewModel.getLineContent(n),[u,f]=y.getCharContainingOffset(r,t-1);return[new p.Position(n,u+1),r.substring(u,f)]}_prepareRender(n){let t="",r="";const[u,f]=this._getGraphemeAwarePosition();if(this._cursorStyle===S.TextEditorCursorStyle.Line||this._cursorStyle===S.TextEditorCursorStyle.LineThin){const h=n.visibleRangeForPosition(u);if(!h||h.outsideRenderedLine)return null;const m=L.getWindow(this._domNode.domNode);let C;this._cursorStyle===S.TextEditorCursorStyle.Line?(C=L.computeScreenAwareSize(m,this._lineCursorWidth>0?this._lineCursorWidth:2),C>2&&(t=f,r=this._getTokenClassName(u))):C=L.computeScreenAwareSize(m,1);let w=h.left,D=0;C>=2&&w>=1&&(D=1,w-=D);const I=n.getVerticalOffsetForLineNumber(u.lineNumber)-n.bigNumbersDelta;return new b(I,w,D,C,this._lineHeight,t,r)}const c=n.linesVisibleRangesForRange(new _.Range(u.lineNumber,u.column,u.lineNumber,u.column+f.length),!1);if(!c||c.length===0)return null;const d=c[0];if(d.outsideRenderedLine||d.ranges.length===0)return null;const s=d.ranges[0],l=f==="	"?this._typicalHalfwidthCharacterWidth:s.width<1?this._typicalHalfwidthCharacterWidth:s.width;this._cursorStyle===S.TextEditorCursorStyle.Block&&(t=f,r=this._getTokenClassName(u));let o=n.getVerticalOffsetForLineNumber(u.lineNumber)-n.bigNumbersDelta,g=this._lineHeight;return(this._cursorStyle===S.TextEditorCursorStyle.Underline||this._cursorStyle===S.TextEditorCursorStyle.UnderlineThin)&&(o+=this._lineHeight-2,g=2),new b(o,s.left,0,l,g,t,r)}_getTokenClassName(n){const t=this._context.viewModel.getViewLineData(n.lineNumber),r=t.tokens.findTokenIndexAtOffset(n.column-1);return t.tokens.getClassName(r)}prepareRender(n){this._renderData=this._prepareRender(n)}render(n){return this._renderData?(this._lastRenderedContent!==this._renderData.textContent&&(this._lastRenderedContent=this._renderData.textContent,this._domNode.domNode.textContent=this._lastRenderedContent),this._domNode.setClassName(`cursor ${v.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME} ${this._renderData.textContentClassName}`),this._domNode.setDisplay("block"),this._domNode.setTop(this._renderData.top),this._domNode.setLeft(this._renderData.left),this._domNode.setPaddingLeft(this._renderData.paddingLeft),this._domNode.setWidth(this._renderData.width),this._domNode.setLineHeight(this._renderData.height),this._domNode.setHeight(this._renderData.height),{domNode:this._domNode.domNode,position:this._position,contentLeft:this._renderData.left,height:this._renderData.height,width:2}):(this._domNode.setDisplay("none"),null)}}e.ViewCursor=a}),define(se[637],oe([1,0,35,278,36]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorOptions=void 0;class E{get editorOptions(){return this._options}constructor(_){this._diffEditorWidth=(0,L.observableValue)(this,0),this.couldShowInlineViewBecauseOfSize=(0,L.derived)(this,b=>this._options.read(b).renderSideBySide&&this._diffEditorWidth.read(b)<=this._options.read(b).renderSideBySideInlineBreakpoint),this.renderOverviewRuler=(0,L.derived)(this,b=>this._options.read(b).renderOverviewRuler),this.renderSideBySide=(0,L.derived)(this,b=>this._options.read(b).renderSideBySide&&!(this._options.read(b).useInlineViewWhenSpaceIsLimited&&this.couldShowInlineViewBecauseOfSize.read(b))),this.readOnly=(0,L.derived)(this,b=>this._options.read(b).readOnly),this.shouldRenderRevertArrows=(0,L.derived)(this,b=>!(!this._options.read(b).renderMarginRevertIcon||!this.renderSideBySide.read(b)||this.readOnly.read(b))),this.renderIndicators=(0,L.derived)(this,b=>this._options.read(b).renderIndicators),this.enableSplitViewResizing=(0,L.derived)(this,b=>this._options.read(b).enableSplitViewResizing),this.splitViewDefaultRatio=(0,L.derived)(this,b=>this._options.read(b).splitViewDefaultRatio),this.ignoreTrimWhitespace=(0,L.derived)(this,b=>this._options.read(b).ignoreTrimWhitespace),this.maxComputationTimeMs=(0,L.derived)(this,b=>this._options.read(b).maxComputationTime),this.showMoves=(0,L.derived)(this,b=>this._options.read(b).experimental.showMoves&&this.renderSideBySide.read(b)),this.isInEmbeddedEditor=(0,L.derived)(this,b=>this._options.read(b).isInEmbeddedEditor),this.diffWordWrap=(0,L.derived)(this,b=>this._options.read(b).diffWordWrap),this.originalEditable=(0,L.derived)(this,b=>this._options.read(b).originalEditable),this.diffCodeLens=(0,L.derived)(this,b=>this._options.read(b).diffCodeLens),this.accessibilityVerbose=(0,L.derived)(this,b=>this._options.read(b).accessibilityVerbose),this.diffAlgorithm=(0,L.derived)(this,b=>this._options.read(b).diffAlgorithm),this.showEmptyDecorations=(0,L.derived)(this,b=>this._options.read(b).experimental.showEmptyDecorations),this.onlyShowAccessibleDiffViewer=(0,L.derived)(this,b=>this._options.read(b).onlyShowAccessibleDiffViewer),this.hideUnchangedRegions=(0,L.derived)(this,b=>this._options.read(b).hideUnchangedRegions.enabled),this.hideUnchangedRegionsRevealLineCount=(0,L.derived)(this,b=>this._options.read(b).hideUnchangedRegions.revealLineCount),this.hideUnchangedRegionsContextLineCount=(0,L.derived)(this,b=>this._options.read(b).hideUnchangedRegions.contextLineCount),this.hideUnchangedRegionsMinimumLineCount=(0,L.derived)(this,b=>this._options.read(b).hideUnchangedRegions.minimumLineCount);const v={..._,...S(_,k.diffEditorDefaultOptions)};this._options=(0,L.observableValue)(this,v)}updateOptions(_){const v=S(_,this._options.get()),b={...this._options.get(),..._,...v};this._options.set(b,void 0,{changedOptions:_})}setWidth(_){this._diffEditorWidth.set(_,void 0)}}e.DiffEditorOptions=E;function S(p,_){var v,b,a,i,n,t,r,u;return{enableSplitViewResizing:(0,y.boolean)(p.enableSplitViewResizing,_.enableSplitViewResizing),splitViewDefaultRatio:(0,y.clampedFloat)(p.splitViewDefaultRatio,.5,.1,.9),renderSideBySide:(0,y.boolean)(p.renderSideBySide,_.renderSideBySide),renderMarginRevertIcon:(0,y.boolean)(p.renderMarginRevertIcon,_.renderMarginRevertIcon),maxComputationTime:(0,y.clampedInt)(p.maxComputationTime,_.maxComputationTime,0,1073741824),maxFileSize:(0,y.clampedInt)(p.maxFileSize,_.maxFileSize,0,1073741824),ignoreTrimWhitespace:(0,y.boolean)(p.ignoreTrimWhitespace,_.ignoreTrimWhitespace),renderIndicators:(0,y.boolean)(p.renderIndicators,_.renderIndicators),originalEditable:(0,y.boolean)(p.originalEditable,_.originalEditable),diffCodeLens:(0,y.boolean)(p.diffCodeLens,_.diffCodeLens),renderOverviewRuler:(0,y.boolean)(p.renderOverviewRuler,_.renderOverviewRuler),diffWordWrap:(0,y.stringSet)(p.diffWordWrap,_.diffWordWrap,["off","on","inherit"]),diffAlgorithm:(0,y.stringSet)(p.diffAlgorithm,_.diffAlgorithm,["legacy","advanced"],{smart:"legacy",experimental:"advanced"}),accessibilityVerbose:(0,y.boolean)(p.accessibilityVerbose,_.accessibilityVerbose),experimental:{showMoves:(0,y.boolean)((v=p.experimental)===null||v===void 0?void 0:v.showMoves,_.experimental.showMoves),showEmptyDecorations:(0,y.boolean)((b=p.experimental)===null||b===void 0?void 0:b.showEmptyDecorations,_.experimental.showEmptyDecorations)},hideUnchangedRegions:{enabled:(0,y.boolean)((i=(a=p.hideUnchangedRegions)===null||a===void 0?void 0:a.enabled)!==null&&i!==void 0?i:(n=p.experimental)===null||n===void 0?void 0:n.collapseUnchangedRegions,_.hideUnchangedRegions.enabled),contextLineCount:(0,y.clampedInt)((t=p.hideUnchangedRegions)===null||t===void 0?void 0:t.contextLineCount,_.hideUnchangedRegions.contextLineCount,0,1073741824),minimumLineCount:(0,y.clampedInt)((r=p.hideUnchangedRegions)===null||r===void 0?void 0:r.minimumLineCount,_.hideUnchangedRegions.minimumLineCount,0,1073741824),revealLineCount:(0,y.clampedInt)((u=p.hideUnchangedRegions)===null||u===void 0?void 0:u.revealLineCount,_.hideUnchangedRegions.revealLineCount,0,1073741824)},isInEmbeddedEditor:(0,y.boolean)(p.isInEmbeddedEditor,_.isInEmbeddedEditor),onlyShowAccessibleDiffViewer:(0,y.boolean)(p.onlyShowAccessibleDiffViewer,_.onlyShowAccessibleDiffViewer),renderSideBySideInlineBreakpoint:(0,y.clampedInt)(p.renderSideBySideInlineBreakpoint,_.renderSideBySideInlineBreakpoint,0,1073741824),useInlineViewWhenSpaceIsLimited:(0,y.boolean)(p.useInlineViewWhenSpaceIsLimited,_.useInlineViewWhenSpaceIsLimited)}}}),define(se[235],oe([1,0,17,36,149]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FontInfo=e.SERIALIZED_FONT_INFO_VERSION=e.BareFontInfo=void 0;const E=L.isMacintosh?1.5:1.35,S=8;class p{static createFromValidatedSettings(b,a,i){const n=b.get(49),t=b.get(53),r=b.get(52),u=b.get(51),f=b.get(54),c=b.get(66),d=b.get(63);return p._create(n,t,r,u,f,c,d,a,i)}static _create(b,a,i,n,t,r,u,f,c){r===0?r=E*i:r<S&&(r=r*i),r=Math.round(r),r<S&&(r=S);const d=1+(c?0:y.EditorZoom.getZoomLevel()*.1);return i*=d,r*=d,t===k.EditorFontVariations.TRANSLATE&&(a==="normal"||a==="bold"?t=k.EditorFontVariations.OFF:(t=`'wght' ${parseInt(a,10)}`,a="normal")),new p({pixelRatio:f,fontFamily:b,fontWeight:a,fontSize:i,fontFeatureSettings:n,fontVariationSettings:t,lineHeight:r,letterSpacing:u})}constructor(b){this._bareFontInfoBrand=void 0,this.pixelRatio=b.pixelRatio,this.fontFamily=String(b.fontFamily),this.fontWeight=String(b.fontWeight),this.fontSize=b.fontSize,this.fontFeatureSettings=b.fontFeatureSettings,this.fontVariationSettings=b.fontVariationSettings,this.lineHeight=b.lineHeight|0,this.letterSpacing=b.letterSpacing}getId(){return`${this.pixelRatio}-${this.fontFamily}-${this.fontWeight}-${this.fontSize}-${this.fontFeatureSettings}-${this.fontVariationSettings}-${this.lineHeight}-${this.letterSpacing}`}getMassagedFontFamily(){const b=k.EDITOR_FONT_DEFAULTS.fontFamily,a=p._wrapInQuotes(this.fontFamily);return b&&this.fontFamily!==b?`${a}, ${b}`:a}static _wrapInQuotes(b){return/[,"']/.test(b)?b:/[+ ]/.test(b)?`"${b}"`:b}}e.BareFontInfo=p,e.SERIALIZED_FONT_INFO_VERSION=2;class _ extends p{constructor(b,a){super(b),this._editorStylingBrand=void 0,this.version=e.SERIALIZED_FONT_INFO_VERSION,this.isTrusted=a,this.isMonospace=b.isMonospace,this.typicalHalfwidthCharacterWidth=b.typicalHalfwidthCharacterWidth,this.typicalFullwidthCharacterWidth=b.typicalFullwidthCharacterWidth,this.canUseHalfwidthRightwardsArrow=b.canUseHalfwidthRightwardsArrow,this.spaceWidth=b.spaceWidth,this.middotWidth=b.middotWidth,this.wsmiddotWidth=b.wsmiddotWidth,this.maxDigitWidth=b.maxDigitWidth}equals(b){return this.fontFamily===b.fontFamily&&this.fontWeight===b.fontWeight&&this.fontSize===b.fontSize&&this.fontFeatureSettings===b.fontFeatureSettings&&this.fontVariationSettings===b.fontVariationSettings&&this.lineHeight===b.lineHeight&&this.letterSpacing===b.letterSpacing&&this.typicalHalfwidthCharacterWidth===b.typicalHalfwidthCharacterWidth&&this.typicalFullwidthCharacterWidth===b.typicalFullwidthCharacterWidth&&this.canUseHalfwidthRightwardsArrow===b.canUseHalfwidthRightwardsArrow&&this.spaceWidth===b.spaceWidth&&this.middotWidth===b.middotWidth&&this.wsmiddotWidth===b.wsmiddotWidth&&this.maxDigitWidth===b.maxDigitWidth}}e.FontInfo=_}),define(se[335],oe([1,0,54,44,6,2,491,36,235]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FontMeasurements=e.FontMeasurementsImpl=void 0;class v extends E.Disposable{constructor(){super(),this._onDidChange=this._register(new y.Emitter),this.onDidChange=this._onDidChange.event,this._cache=new b,this._evictUntrustedReadingsTimeout=-1}dispose(){this._evictUntrustedReadingsTimeout!==-1&&(clearTimeout(this._evictUntrustedReadingsTimeout),this._evictUntrustedReadingsTimeout=-1),super.dispose()}clearAllFontInfos(){this._cache=new b,this._onDidChange.fire()}_writeToCache(i,n){this._cache.put(i,n),!n.isTrusted&&this._evictUntrustedReadingsTimeout===-1&&(this._evictUntrustedReadingsTimeout=k.mainWindow.setTimeout(()=>{this._evictUntrustedReadingsTimeout=-1,this._evictUntrustedReadings()},5e3))}_evictUntrustedReadings(){const i=this._cache.getValues();let n=!1;for(const t of i)t.isTrusted||(n=!0,this._cache.remove(t));n&&this._onDidChange.fire()}readFontInfo(i){if(!this._cache.has(i)){let n=this._actualReadFontInfo(i);(n.typicalHalfwidthCharacterWidth<=2||n.typicalFullwidthCharacterWidth<=2||n.spaceWidth<=2||n.maxDigitWidth<=2)&&(n=new _.FontInfo({pixelRatio:L.PixelRatio.value,fontFamily:n.fontFamily,fontWeight:n.fontWeight,fontSize:n.fontSize,fontFeatureSettings:n.fontFeatureSettings,fontVariationSettings:n.fontVariationSettings,lineHeight:n.lineHeight,letterSpacing:n.letterSpacing,isMonospace:n.isMonospace,typicalHalfwidthCharacterWidth:Math.max(n.typicalHalfwidthCharacterWidth,5),typicalFullwidthCharacterWidth:Math.max(n.typicalFullwidthCharacterWidth,5),canUseHalfwidthRightwardsArrow:n.canUseHalfwidthRightwardsArrow,spaceWidth:Math.max(n.spaceWidth,5),middotWidth:Math.max(n.middotWidth,5),wsmiddotWidth:Math.max(n.wsmiddotWidth,5),maxDigitWidth:Math.max(n.maxDigitWidth,5)},!1)),this._writeToCache(i,n)}return this._cache.get(i)}_createRequest(i,n,t,r){const u=new S.CharWidthRequest(i,n);return t.push(u),r?.push(u),u}_actualReadFontInfo(i){const n=[],t=[],r=this._createRequest("n",0,n,t),u=this._createRequest("\uFF4D",0,n,null),f=this._createRequest(" ",0,n,t),c=this._createRequest("0",0,n,t),d=this._createRequest("1",0,n,t),s=this._createRequest("2",0,n,t),l=this._createRequest("3",0,n,t),o=this._createRequest("4",0,n,t),g=this._createRequest("5",0,n,t),h=this._createRequest("6",0,n,t),m=this._createRequest("7",0,n,t),C=this._createRequest("8",0,n,t),w=this._createRequest("9",0,n,t),D=this._createRequest("\u2192",0,n,t),I=this._createRequest("\uFFEB",0,n,null),T=this._createRequest("\xB7",0,n,t),A=this._createRequest(String.fromCharCode(11825),0,n,null),P="|/-_ilm%";for(let O=0,B=P.length;O<B;O++)this._createRequest(P.charAt(O),0,n,t),this._createRequest(P.charAt(O),1,n,t),this._createRequest(P.charAt(O),2,n,t);(0,S.readCharWidths)(i,n);const N=Math.max(c.width,d.width,s.width,l.width,o.width,g.width,h.width,m.width,C.width,w.width);let M=i.fontFeatureSettings===p.EditorFontLigatures.OFF;const R=t[0].width;for(let O=1,B=t.length;M&&O<B;O++){const W=R-t[O].width;if(W<-.001||W>.001){M=!1;break}}let x=!0;return M&&I.width!==R&&(x=!1),I.width>D.width&&(x=!1),new _.FontInfo({pixelRatio:L.PixelRatio.value,fontFamily:i.fontFamily,fontWeight:i.fontWeight,fontSize:i.fontSize,fontFeatureSettings:i.fontFeatureSettings,fontVariationSettings:i.fontVariationSettings,lineHeight:i.lineHeight,letterSpacing:i.letterSpacing,isMonospace:M,typicalHalfwidthCharacterWidth:r.width,typicalFullwidthCharacterWidth:u.width,canUseHalfwidthRightwardsArrow:x,spaceWidth:f.width,middotWidth:T.width,wsmiddotWidth:A.width,maxDigitWidth:N},!0)}}e.FontMeasurementsImpl=v;class b{constructor(){this._keys=Object.create(null),this._values=Object.create(null)}has(i){const n=i.getId();return!!this._values[n]}get(i){const n=i.getId();return this._values[n]}put(i,n){const t=i.getId();this._keys[t]=i,this._values[t]=n}remove(i){const n=i.getId();delete this._keys[n],delete this._values[n]}getValues(){return Object.keys(this._keys).map(i=>this._values[i])}}e.FontMeasurements=new v}),define(se[336],oe([1,0,10,5,86,36]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isModelDecorationInString=e.isModelDecorationInComment=e.isModelDecorationVisible=e.ViewModelDecorations=void 0;class S{constructor(i,n,t,r,u){this.editorId=i,this.model=n,this.configuration=t,this._linesCollection=r,this._coordinatesConverter=u,this._decorationsCache=Object.create(null),this._cachedModelDecorationsResolver=null,this._cachedModelDecorationsResolverViewRange=null}_clearCachedModelDecorationsResolver(){this._cachedModelDecorationsResolver=null,this._cachedModelDecorationsResolverViewRange=null}dispose(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}reset(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}onModelDecorationsChanged(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}onLineMappingChanged(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}_getOrCreateViewModelDecoration(i){const n=i.id;let t=this._decorationsCache[n];if(!t){const r=i.range,u=i.options;let f;if(u.isWholeLine){const c=this._coordinatesConverter.convertModelPositionToViewPosition(new L.Position(r.startLineNumber,1),0,!1,!0),d=this._coordinatesConverter.convertModelPositionToViewPosition(new L.Position(r.endLineNumber,this.model.getLineMaxColumn(r.endLineNumber)),1);f=new k.Range(c.lineNumber,c.column,d.lineNumber,d.column)}else f=this._coordinatesConverter.convertModelRangeToViewRange(r,1);t=new y.ViewModelDecoration(f,u),this._decorationsCache[n]=t}return t}getMinimapDecorationsInRange(i){return this._getDecorationsInRange(i,!0,!1).decorations}getDecorationsViewportData(i){let n=this._cachedModelDecorationsResolver!==null;return n=n&&i.equalsRange(this._cachedModelDecorationsResolverViewRange),n||(this._cachedModelDecorationsResolver=this._getDecorationsInRange(i,!1,!1),this._cachedModelDecorationsResolverViewRange=i),this._cachedModelDecorationsResolver}getInlineDecorationsOnLine(i,n=!1,t=!1){const r=new k.Range(i,this._linesCollection.getViewLineMinColumn(i),i,this._linesCollection.getViewLineMaxColumn(i));return this._getDecorationsInRange(r,n,t).inlineDecorations[0]}_getDecorationsInRange(i,n,t){const r=this._linesCollection.getDecorationsInRange(i,this.editorId,(0,E.filterValidationDecorations)(this.configuration.options),n,t),u=i.startLineNumber,f=i.endLineNumber,c=[];let d=0;const s=[];for(let l=u;l<=f;l++)s[l-u]=[];for(let l=0,o=r.length;l<o;l++){const g=r[l],h=g.options;if(!p(this.model,g))continue;const m=this._getOrCreateViewModelDecoration(g),C=m.range;if(c[d++]=m,h.inlineClassName){const w=new y.InlineDecoration(C,h.inlineClassName,h.inlineClassNameAffectsLetterSpacing?3:0),D=Math.max(u,C.startLineNumber),I=Math.min(f,C.endLineNumber);for(let T=D;T<=I;T++)s[T-u].push(w)}if(h.beforeContentClassName&&u<=C.startLineNumber&&C.startLineNumber<=f){const w=new y.InlineDecoration(new k.Range(C.startLineNumber,C.startColumn,C.startLineNumber,C.startColumn),h.beforeContentClassName,1);s[C.startLineNumber-u].push(w)}if(h.afterContentClassName&&u<=C.endLineNumber&&C.endLineNumber<=f){const w=new y.InlineDecoration(new k.Range(C.endLineNumber,C.endColumn,C.endLineNumber,C.endColumn),h.afterContentClassName,2);s[C.endLineNumber-u].push(w)}}return{decorations:c,inlineDecorations:s}}}e.ViewModelDecorations=S;function p(a,i){return!(i.options.hideInCommentTokens&&_(a,i)||i.options.hideInStringTokens&&v(a,i))}e.isModelDecorationVisible=p;function _(a,i){return b(a,i.range,n=>n===1)}e.isModelDecorationInComment=_;function v(a,i){return b(a,i.range,n=>n===2)}e.isModelDecorationInString=v;function b(a,i,n){for(let t=i.startLineNumber;t<=i.endLineNumber;t++){const r=a.tokenization.getLineTokens(t),u=t===i.startLineNumber,f=t===i.endLineNumber;let c=u?r.findTokenIndexAtOffset(i.startColumn-1):0;for(;c<r.getCount()&&!(f&&r.getStartOffset(c)>i.endColumn-1);){if(!n(r.getStandardTokenType(c)))return!1;c++}}return!0}}),define(se[638],oe([3,4]),function(te,e){return te.create("vs/editor/common/core/editorColorRegistry",e)}),define(se[639],oe([3,4]),function(te,e){return te.create("vs/editor/common/editorContextKeys",e)}),define(se[640],oe([3,4]),function(te,e){return te.create("vs/editor/common/languages",e)}),define(se[31],oe([1,0,26,22,5,530,640]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TokenizationRegistry=e.LazyTokenizationSupport=e.InlayHintKind=e.Command=e.FoldingRangeKind=e.TextEdit=e.SymbolKinds=e.getAriaLabelForSymbol=e.symbolKindNames=e.isLocationLink=e.DocumentHighlightKind=e.SignatureHelpTriggerKind=e.SelectedSuggestionInfo=e.InlineCompletionTriggerKind=e.CompletionItemKinds=e.EncodedTokenizationResult=e.TokenizationResult=e.Token=void 0;class p{constructor(h,m,C){this.offset=h,this.type=m,this.language=C,this._tokenBrand=void 0}toString(){return"("+this.offset+", "+this.type+")"}}e.Token=p;class _{constructor(h,m){this.tokens=h,this.endState=m,this._tokenizationResultBrand=void 0}}e.TokenizationResult=_;class v{constructor(h,m){this.tokens=h,this.endState=m,this._encodedTokenizationResultBrand=void 0}}e.EncodedTokenizationResult=v;var b;(function(g){const h=new Map;h.set(0,L.Codicon.symbolMethod),h.set(1,L.Codicon.symbolFunction),h.set(2,L.Codicon.symbolConstructor),h.set(3,L.Codicon.symbolField),h.set(4,L.Codicon.symbolVariable),h.set(5,L.Codicon.symbolClass),h.set(6,L.Codicon.symbolStruct),h.set(7,L.Codicon.symbolInterface),h.set(8,L.Codicon.symbolModule),h.set(9,L.Codicon.symbolProperty),h.set(10,L.Codicon.symbolEvent),h.set(11,L.Codicon.symbolOperator),h.set(12,L.Codicon.symbolUnit),h.set(13,L.Codicon.symbolValue),h.set(15,L.Codicon.symbolEnum),h.set(14,L.Codicon.symbolConstant),h.set(15,L.Codicon.symbolEnum),h.set(16,L.Codicon.symbolEnumMember),h.set(17,L.Codicon.symbolKeyword),h.set(27,L.Codicon.symbolSnippet),h.set(18,L.Codicon.symbolText),h.set(19,L.Codicon.symbolColor),h.set(20,L.Codicon.symbolFile),h.set(21,L.Codicon.symbolReference),h.set(22,L.Codicon.symbolCustomColor),h.set(23,L.Codicon.symbolFolder),h.set(24,L.Codicon.symbolTypeParameter),h.set(25,L.Codicon.account),h.set(26,L.Codicon.issues);function m(D){let I=h.get(D);return I||(console.info("No codicon found for CompletionItemKind "+D),I=L.Codicon.symbolProperty),I}g.toIcon=m;const C=new Map;C.set("method",0),C.set("function",1),C.set("constructor",2),C.set("field",3),C.set("variable",4),C.set("class",5),C.set("struct",6),C.set("interface",7),C.set("module",8),C.set("property",9),C.set("event",10),C.set("operator",11),C.set("unit",12),C.set("value",13),C.set("constant",14),C.set("enum",15),C.set("enum-member",16),C.set("enumMember",16),C.set("keyword",17),C.set("snippet",27),C.set("text",18),C.set("color",19),C.set("file",20),C.set("reference",21),C.set("customcolor",22),C.set("folder",23),C.set("type-parameter",24),C.set("typeParameter",24),C.set("account",25),C.set("issue",26);function w(D,I){let T=C.get(D);return typeof T>"u"&&!I&&(T=9),T}g.fromString=w})(b||(e.CompletionItemKinds=b={}));var a;(function(g){g[g.Automatic=0]="Automatic",g[g.Explicit=1]="Explicit"})(a||(e.InlineCompletionTriggerKind=a={}));class i{constructor(h,m,C,w){this.range=h,this.text=m,this.completionKind=C,this.isSnippetText=w}equals(h){return y.Range.lift(this.range).equalsRange(h.range)&&this.text===h.text&&this.completionKind===h.completionKind&&this.isSnippetText===h.isSnippetText}}e.SelectedSuggestionInfo=i;var n;(function(g){g[g.Invoke=1]="Invoke",g[g.TriggerCharacter=2]="TriggerCharacter",g[g.ContentChange=3]="ContentChange"})(n||(e.SignatureHelpTriggerKind=n={}));var t;(function(g){g[g.Text=0]="Text",g[g.Read=1]="Read",g[g.Write=2]="Write"})(t||(e.DocumentHighlightKind=t={}));function r(g){return g&&k.URI.isUri(g.uri)&&y.Range.isIRange(g.range)&&(y.Range.isIRange(g.originSelectionRange)||y.Range.isIRange(g.targetSelectionRange))}e.isLocationLink=r,e.symbolKindNames={[17]:(0,S.localize)(0,null),[16]:(0,S.localize)(1,null),[4]:(0,S.localize)(2,null),[13]:(0,S.localize)(3,null),[8]:(0,S.localize)(4,null),[9]:(0,S.localize)(5,null),[21]:(0,S.localize)(6,null),[23]:(0,S.localize)(7,null),[7]:(0,S.localize)(8,null),[0]:(0,S.localize)(9,null),[11]:(0,S.localize)(10,null),[10]:(0,S.localize)(11,null),[19]:(0,S.localize)(12,null),[5]:(0,S.localize)(13,null),[1]:(0,S.localize)(14,null),[2]:(0,S.localize)(15,null),[20]:(0,S.localize)(16,null),[15]:(0,S.localize)(17,null),[18]:(0,S.localize)(18,null),[24]:(0,S.localize)(19,null),[3]:(0,S.localize)(20,null),[6]:(0,S.localize)(21,null),[14]:(0,S.localize)(22,null),[22]:(0,S.localize)(23,null),[25]:(0,S.localize)(24,null),[12]:(0,S.localize)(25,null)};function u(g,h){return(0,S.localize)(26,null,g,e.symbolKindNames[h])}e.getAriaLabelForSymbol=u;var f;(function(g){const h=new Map;h.set(0,L.Codicon.symbolFile),h.set(1,L.Codicon.symbolModule),h.set(2,L.Codicon.symbolNamespace),h.set(3,L.Codicon.symbolPackage),h.set(4,L.Codicon.symbolClass),h.set(5,L.Codicon.symbolMethod),h.set(6,L.Codicon.symbolProperty),h.set(7,L.Codicon.symbolField),h.set(8,L.Codicon.symbolConstructor),h.set(9,L.Codicon.symbolEnum),h.set(10,L.Codicon.symbolInterface),h.set(11,L.Codicon.symbolFunction),h.set(12,L.Codicon.symbolVariable),h.set(13,L.Codicon.symbolConstant),h.set(14,L.Codicon.symbolString),h.set(15,L.Codicon.symbolNumber),h.set(16,L.Codicon.symbolBoolean),h.set(17,L.Codicon.symbolArray),h.set(18,L.Codicon.symbolObject),h.set(19,L.Codicon.symbolKey),h.set(20,L.Codicon.symbolNull),h.set(21,L.Codicon.symbolEnumMember),h.set(22,L.Codicon.symbolStruct),h.set(23,L.Codicon.symbolEvent),h.set(24,L.Codicon.symbolOperator),h.set(25,L.Codicon.symbolTypeParameter);function m(C){let w=h.get(C);return w||(console.info("No codicon found for SymbolKind "+C),w=L.Codicon.symbolProperty),w}g.toIcon=m})(f||(e.SymbolKinds=f={}));class c{}e.TextEdit=c;class d{static fromValue(h){switch(h){case"comment":return d.Comment;case"imports":return d.Imports;case"region":return d.Region}return new d(h)}constructor(h){this.value=h}}e.FoldingRangeKind=d,d.Comment=new d("comment"),d.Imports=new d("imports"),d.Region=new d("region");var s;(function(g){function h(m){return!m||typeof m!="object"?!1:typeof m.id=="string"&&typeof m.title=="string"}g.is=h})(s||(e.Command=s={}));var l;(function(g){g[g.Type=1]="Type",g[g.Parameter=2]="Parameter"})(l||(e.InlayHintKind=l={}));class o{constructor(h){this.createSupport=h,this._tokenizationSupport=null}dispose(){this._tokenizationSupport&&this._tokenizationSupport.then(h=>{h&&h.dispose()})}get tokenizationSupport(){return this._tokenizationSupport||(this._tokenizationSupport=this.createSupport()),this._tokenizationSupport}}e.LazyTokenizationSupport=o,e.TokenizationRegistry=new E.TokenizationRegistry}),define(se[160],oe([1,0,31]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.nullTokenizeEncoded=e.nullTokenize=e.NullState=void 0,e.NullState=new class{clone(){return this}equals(E){return this===E}};function k(E,S){return new L.TokenizationResult([new L.Token(0,"",E)],S)}e.nullTokenize=k;function y(E,S){const p=new Uint32Array(2);return p[0]=0,p[1]=(E<<0|0<<8|0<<11|1<<15|2<<24)>>>0,new L.EncodedTokenizationResult(p,S===null?e.NullState:S)}e.nullTokenizeEncoded=y}),define(se[337],oe([1,0,11,94,31,160]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e._tokenizeToString=e.tokenizeLineToHTML=e.tokenizeToString=void 0;const S={getInitialState:()=>E.NullState,tokenizeEncoded:(b,a,i)=>(0,E.nullTokenizeEncoded)(0,i)};async function p(b,a,i){if(!i)return v(a,b.languageIdCodec,S);const n=await y.TokenizationRegistry.getOrCreate(i);return v(a,b.languageIdCodec,n||S)}e.tokenizeToString=p;function _(b,a,i,n,t,r,u){let f="<div>",c=n,d=0,s=!0;for(let l=0,o=a.getCount();l<o;l++){const g=a.getEndOffset(l);if(g<=n)continue;let h="";for(;c<g&&c<t;c++){const m=b.charCodeAt(c);switch(m){case 9:{let C=r-(c+d)%r;for(d+=C-1;C>0;)u&&s?(h+="&#160;",s=!1):(h+=" ",s=!0),C--;break}case 60:h+="&lt;",s=!1;break;case 62:h+="&gt;",s=!1;break;case 38:h+="&amp;",s=!1;break;case 0:h+="&#00;",s=!1;break;case 65279:case 8232:case 8233:case 133:h+="\uFFFD",s=!1;break;case 13:h+="&#8203",s=!1;break;case 32:u&&s?(h+="&#160;",s=!1):(h+=" ",s=!0);break;default:h+=String.fromCharCode(m),s=!1}}if(f+=`<span style="${a.getInlineStyle(l,i)}">${h}</span>`,g>t||c>=t)break}return f+="</div>",f}e.tokenizeLineToHTML=_;function v(b,a,i){let n='<div class="monaco-tokenized-source">';const t=L.splitLines(b);let r=i.getInitialState();for(let u=0,f=t.length;u<f;u++){const c=t[u];u>0&&(n+="<br/>");const d=i.tokenizeEncoded(c,!0,r);k.LineTokens.convertToEndOffset(d.tokens,c.length);const l=new k.LineTokens(d.tokens,c,a).inflate();let o=0;for(let g=0,h=l.getCount();g<h;g++){const m=l.getClassName(g),C=l.getEndOffset(g);n+=`<span class="${m}">${L.escape(c.substring(o,C))}</span>`,o=C}r=d.endState}return n+="</div>",n}e._tokenizeToString=v}),define(se[641],oe([1,0,14,12,17,61,129,62,73,160,523,298,94]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DefaultBackgroundTokenizer=e.RangePriorityQueueImpl=e.TokenizationStateStore=e.TrackingTokenizationStateStore=e.TokenizerWithStateStoreAndTextModel=e.TokenizerWithStateStore=void 0;class n{constructor(l,o){this.tokenizationSupport=o,this.initialState=this.tokenizationSupport.getInitialState(),this.store=new r(l)}getStartState(l){return this.store.getStartState(l,this.initialState)}getFirstInvalidLine(){return this.store.getFirstInvalidLine(this.initialState)}}e.TokenizerWithStateStore=n;class t extends n{constructor(l,o,g,h){super(l,o),this._textModel=g,this._languageIdCodec=h}updateTokensUntilLine(l,o){const g=this._textModel.getLanguageId();for(;;){const h=this.getFirstInvalidLine();if(!h||h.lineNumber>o)break;const m=this._textModel.getLineContent(h.lineNumber),C=c(this._languageIdCodec,g,this.tokenizationSupport,m,!0,h.startState);l.add(h.lineNumber,C.tokens),this.store.setEndState(h.lineNumber,C.endState)}}getTokenTypeIfInsertingCharacter(l,o){const g=this.getStartState(l.lineNumber);if(!g)return 0;const h=this._textModel.getLanguageId(),m=this._textModel.getLineContent(l.lineNumber),C=m.substring(0,l.column-1)+o+m.substring(l.column-1),w=c(this._languageIdCodec,h,this.tokenizationSupport,C,!0,g),D=new i.LineTokens(w.tokens,C,this._languageIdCodec);if(D.getCount()===0)return 0;const I=D.findTokenIndexAtOffset(l.column-1);return D.getStandardTokenType(I)}tokenizeLineWithEdit(l,o,g){const h=l.lineNumber,m=l.column,C=this.getStartState(h);if(!C)return null;const w=this._textModel.getLineContent(h),D=w.substring(0,m-1)+g+w.substring(m-1+o),I=this._textModel.getLanguageIdAtPosition(h,0),T=c(this._languageIdCodec,I,this.tokenizationSupport,D,!0,C);return new i.LineTokens(T.tokens,D,this._languageIdCodec)}isCheapToTokenize(l){const o=this.store.getFirstInvalidEndStateLineNumberOrMax();return l<o||l===o&&this._textModel.getLineLength(l)<2048}tokenizeHeuristically(l,o,g){if(g<=this.store.getFirstInvalidEndStateLineNumberOrMax())return{heuristicTokens:!1};if(o<=this.store.getFirstInvalidEndStateLineNumberOrMax())return this.updateTokensUntilLine(l,g),{heuristicTokens:!1};let h=this.guessStartState(o);const m=this._textModel.getLanguageId();for(let C=o;C<=g;C++){const w=this._textModel.getLineContent(C),D=c(this._languageIdCodec,m,this.tokenizationSupport,w,!0,h);l.add(C,D.tokens),h=D.endState}return{heuristicTokens:!0}}guessStartState(l){let o=this._textModel.getLineFirstNonWhitespaceColumn(l);const g=[];let h=null;for(let w=l-1;o>1&&w>=1;w--){const D=this._textModel.getLineFirstNonWhitespaceColumn(w);if(D!==0&&D<o&&(g.push(this._textModel.getLineContent(w)),o=D,h=this.getStartState(w),h))break}h||(h=this.tokenizationSupport.getInitialState()),g.reverse();const m=this._textModel.getLanguageId();let C=h;for(const w of g)C=c(this._languageIdCodec,m,this.tokenizationSupport,w,!1,C).endState;return C}}e.TokenizerWithStateStoreAndTextModel=t;class r{constructor(l){this.lineCount=l,this._tokenizationStateStore=new u,this._invalidEndStatesLineNumbers=new f,this._invalidEndStatesLineNumbers.addRange(new _.OffsetRange(1,l+1))}getEndState(l){return this._tokenizationStateStore.getEndState(l)}setEndState(l,o){if(!o)throw new k.BugIndicatingError("Cannot set null/undefined state");this._invalidEndStatesLineNumbers.delete(l);const g=this._tokenizationStateStore.setEndState(l,o);return g&&l<this.lineCount&&this._invalidEndStatesLineNumbers.addRange(new _.OffsetRange(l+1,l+2)),g}acceptChange(l,o){this.lineCount+=o-l.length,this._tokenizationStateStore.acceptChange(l,o),this._invalidEndStatesLineNumbers.addRangeAndResize(new _.OffsetRange(l.startLineNumber,l.endLineNumberExclusive),o)}acceptChanges(l){for(const o of l){const[g]=(0,S.countEOL)(o.text);this.acceptChange(new p.LineRange(o.range.startLineNumber,o.range.endLineNumber+1),g+1)}}invalidateEndStateRange(l){this._invalidEndStatesLineNumbers.addRange(new _.OffsetRange(l.startLineNumber,l.endLineNumberExclusive))}getFirstInvalidEndStateLineNumber(){return this._invalidEndStatesLineNumbers.min}getFirstInvalidEndStateLineNumberOrMax(){return this.getFirstInvalidEndStateLineNumber()||Number.MAX_SAFE_INTEGER}allStatesValid(){return this._invalidEndStatesLineNumbers.min===null}getStartState(l,o){return l===1?o:this.getEndState(l-1)}getFirstInvalidLine(l){const o=this.getFirstInvalidEndStateLineNumber();if(o===null)return null;const g=this.getStartState(o,l);if(!g)throw new k.BugIndicatingError("Start state must be defined");return{lineNumber:o,startState:g}}}e.TrackingTokenizationStateStore=r;class u{constructor(){this._lineEndStates=new b.FixedArray(null)}getEndState(l){return this._lineEndStates.get(l)}setEndState(l,o){const g=this._lineEndStates.get(l);return g&&g.equals(o)?!1:(this._lineEndStates.set(l,o),!0)}acceptChange(l,o){let g=l.length;o>0&&g>0&&(g--,o--),this._lineEndStates.replace(l.startLineNumber,g,o)}}e.TokenizationStateStore=u;class f{constructor(){this._ranges=[]}get min(){return this._ranges.length===0?null:this._ranges[0].start}delete(l){const o=this._ranges.findIndex(g=>g.contains(l));if(o!==-1){const g=this._ranges[o];g.start===l?g.endExclusive===l+1?this._ranges.splice(o,1):this._ranges[o]=new _.OffsetRange(l+1,g.endExclusive):g.endExclusive===l+1?this._ranges[o]=new _.OffsetRange(g.start,l):this._ranges.splice(o,1,new _.OffsetRange(g.start,l),new _.OffsetRange(l+1,g.endExclusive))}}addRange(l){_.OffsetRange.addRange(l,this._ranges)}addRangeAndResize(l,o){let g=0;for(;!(g>=this._ranges.length||l.start<=this._ranges[g].endExclusive);)g++;let h=g;for(;!(h>=this._ranges.length||l.endExclusive<this._ranges[h].start);)h++;const m=o-l.length;for(let C=h;C<this._ranges.length;C++)this._ranges[C]=this._ranges[C].delta(m);if(g===h){const C=new _.OffsetRange(l.start,l.start+o);C.isEmpty||this._ranges.splice(g,0,C)}else{const C=Math.min(l.start,this._ranges[g].start),w=Math.max(l.endExclusive,this._ranges[h-1].endExclusive),D=new _.OffsetRange(C,w+m);D.isEmpty?this._ranges.splice(g,h-g):this._ranges.splice(g,h-g,D)}}toString(){return this._ranges.map(l=>l.toString()).join(" + ")}}e.RangePriorityQueueImpl=f;function c(s,l,o,g,h,m){let C=null;if(o)try{C=o.tokenizeEncoded(g,h,m.clone())}catch(w){(0,k.onUnexpectedError)(w)}return C||(C=(0,v.nullTokenizeEncoded)(s.encodeLanguageId(l),m)),i.LineTokens.convertToEndOffset(C.tokens,g.length),C}class d{constructor(l,o){this._tokenizerWithStateStore=l,this._backgroundTokenStore=o,this._isDisposed=!1,this._isScheduled=!1}dispose(){this._isDisposed=!0}handleChanges(){this._beginBackgroundTokenization()}_beginBackgroundTokenization(){this._isScheduled||!this._tokenizerWithStateStore._textModel.isAttachedToEditor()||!this._hasLinesToTokenize()||(this._isScheduled=!0,(0,L.runWhenGlobalIdle)(l=>{this._isScheduled=!1,this._backgroundTokenizeWithDeadline(l)}))}_backgroundTokenizeWithDeadline(l){const o=Date.now()+l.timeRemaining(),g=()=>{this._isDisposed||!this._tokenizerWithStateStore._textModel.isAttachedToEditor()||!this._hasLinesToTokenize()||(this._backgroundTokenizeForAtLeast1ms(),Date.now()<o?(0,y.setTimeout0)(g):this._beginBackgroundTokenization())};g()}_backgroundTokenizeForAtLeast1ms(){const l=this._tokenizerWithStateStore._textModel.getLineCount(),o=new a.ContiguousMultilineTokensBuilder,g=E.StopWatch.create(!1);do if(g.elapsed()>1||this._tokenizeOneInvalidLine(o)>=l)break;while(this._hasLinesToTokenize());this._backgroundTokenStore.setTokens(o.finalize()),this.checkFinished()}_hasLinesToTokenize(){return this._tokenizerWithStateStore?!this._tokenizerWithStateStore.store.allStatesValid():!1}_tokenizeOneInvalidLine(l){var o;const g=(o=this._tokenizerWithStateStore)===null||o===void 0?void 0:o.getFirstInvalidLine();return g?(this._tokenizerWithStateStore.updateTokensUntilLine(l,g.lineNumber),g.lineNumber):this._tokenizerWithStateStore._textModel.getLineCount()+1}checkFinished(){this._isDisposed||this._tokenizerWithStateStore.store.allStatesValid()&&this._backgroundTokenStore.backgroundTokenizationFinished()}requestTokens(l,o){this._tokenizerWithStateStore.store.invalidateEndStateRange(new p.LineRange(l,o))}}e.DefaultBackgroundTokenizer=d}),define(se[642],oe([1,0,13,14,12,6,2,129,62,10,151,31,292,641,298,533,535]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TokenizationTextModelPart=void 0;class f extends i.TextModelPart{constructor(l,o,g,h,m,C){super(),this._languageService=l,this._languageConfigurationService=o,this._textModel=g,this._bracketPairsTextModelPart=h,this._languageId=m,this._attachedViews=C,this._semanticTokens=new u.SparseTokensStore(this._languageService.languageIdCodec),this._onDidChangeLanguage=this._register(new E.Emitter),this.onDidChangeLanguage=this._onDidChangeLanguage.event,this._onDidChangeLanguageConfiguration=this._register(new E.Emitter),this.onDidChangeLanguageConfiguration=this._onDidChangeLanguageConfiguration.event,this._onDidChangeTokens=this._register(new E.Emitter),this.onDidChangeTokens=this._onDidChangeTokens.event,this.grammarTokens=this._register(new c(this._languageService.languageIdCodec,this._textModel,()=>this._languageId,this._attachedViews)),this._register(this._languageConfigurationService.onDidChange(w=>{w.affects(this._languageId)&&this._onDidChangeLanguageConfiguration.fire({})})),this._register(this.grammarTokens.onDidChangeTokens(w=>{this._emitModelTokensChangedEvent(w)})),this._register(this.grammarTokens.onDidChangeBackgroundTokenizationState(w=>{this._bracketPairsTextModelPart.handleDidChangeBackgroundTokenizationState()}))}handleDidChangeContent(l){if(l.isFlush)this._semanticTokens.flush();else if(!l.isEolChange)for(const o of l.changes){const[g,h,m]=(0,p.countEOL)(o.text);this._semanticTokens.acceptEdit(o.range,g,h,m,o.text.length>0?o.text.charCodeAt(0):0)}this.grammarTokens.handleDidChangeContent(l)}handleDidChangeAttached(){this.grammarTokens.handleDidChangeAttached()}getLineTokens(l){this.validateLineNumber(l);const o=this.grammarTokens.getLineTokens(l);return this._semanticTokens.addSparseTokens(l,o)}_emitModelTokensChangedEvent(l){this._textModel._isDisposing()||(this._bracketPairsTextModelPart.handleDidChangeTokens(l),this._onDidChangeTokens.fire(l))}validateLineNumber(l){if(l<1||l>this._textModel.getLineCount())throw new y.BugIndicatingError("Illegal value for lineNumber")}get hasTokens(){return this.grammarTokens.hasTokens}resetTokenization(){this.grammarTokens.resetTokenization()}get backgroundTokenizationState(){return this.grammarTokens.backgroundTokenizationState}forceTokenization(l){this.validateLineNumber(l),this.grammarTokens.forceTokenization(l)}isCheapToTokenize(l){return this.validateLineNumber(l),this.grammarTokens.isCheapToTokenize(l)}tokenizeIfCheap(l){this.validateLineNumber(l),this.grammarTokens.tokenizeIfCheap(l)}getTokenTypeIfInsertingCharacter(l,o,g){return this.grammarTokens.getTokenTypeIfInsertingCharacter(l,o,g)}tokenizeLineWithEdit(l,o,g){return this.grammarTokens.tokenizeLineWithEdit(l,o,g)}setSemanticTokens(l,o){this._semanticTokens.set(l,o),this._emitModelTokensChangedEvent({semanticTokensApplied:l!==null,ranges:[{fromLineNumber:1,toLineNumber:this._textModel.getLineCount()}]})}hasCompleteSemanticTokens(){return this._semanticTokens.isComplete()}hasSomeSemanticTokens(){return!this._semanticTokens.isEmpty()}setPartialSemanticTokens(l,o){if(this.hasCompleteSemanticTokens())return;const g=this._textModel.validateRange(this._semanticTokens.setPartial(l,o));this._emitModelTokensChangedEvent({semanticTokensApplied:!0,ranges:[{fromLineNumber:g.startLineNumber,toLineNumber:g.endLineNumber}]})}getWordAtPosition(l){this.assertNotDisposed();const o=this._textModel.validatePosition(l),g=this._textModel.getLineContent(o.lineNumber),h=this.getLineTokens(o.lineNumber),m=h.findTokenIndexAtOffset(o.column-1),[C,w]=f._findLanguageBoundaries(h,m),D=(0,b.getWordAtText)(o.column,this.getLanguageConfiguration(h.getLanguageId(m)).getWordDefinition(),g.substring(C,w),C);if(D&&D.startColumn<=l.column&&l.column<=D.endColumn)return D;if(m>0&&C===o.column-1){const[I,T]=f._findLanguageBoundaries(h,m-1),A=(0,b.getWordAtText)(o.column,this.getLanguageConfiguration(h.getLanguageId(m-1)).getWordDefinition(),g.substring(I,T),I);if(A&&A.startColumn<=l.column&&l.column<=A.endColumn)return A}return null}getLanguageConfiguration(l){return this._languageConfigurationService.getLanguageConfiguration(l)}static _findLanguageBoundaries(l,o){const g=l.getLanguageId(o);let h=0;for(let C=o;C>=0&&l.getLanguageId(C)===g;C--)h=l.getStartOffset(C);let m=l.getLineContent().length;for(let C=o,w=l.getCount();C<w&&l.getLanguageId(C)===g;C++)m=l.getEndOffset(C);return[h,m]}getWordUntilPosition(l){const o=this.getWordAtPosition(l);return o?{word:o.word.substr(0,l.column-o.startColumn),startColumn:o.startColumn,endColumn:l.column}:{word:"",startColumn:l.column,endColumn:l.column}}getLanguageId(){return this._languageId}getLanguageIdAtPosition(l,o){const g=this._textModel.validatePosition(new v.Position(l,o)),h=this.getLineTokens(g.lineNumber);return h.getLanguageId(h.findTokenIndexAtOffset(g.column-1))}setLanguageId(l,o="api"){if(this._languageId===l)return;const g={oldLanguage:this._languageId,newLanguage:l,source:o};this._languageId=l,this._bracketPairsTextModelPart.handleDidChangeLanguage(g),this.grammarTokens.resetTokenization(),this._onDidChangeLanguage.fire(g),this._onDidChangeLanguageConfiguration.fire({})}}e.TokenizationTextModelPart=f;class c extends S.Disposable{get backgroundTokenizationState(){return this._backgroundTokenizationState}constructor(l,o,g,h){super(),this._languageIdCodec=l,this._textModel=o,this.getLanguageId=g,this._tokenizer=null,this._defaultBackgroundTokenizer=null,this._backgroundTokenizer=this._register(new S.MutableDisposable),this._tokens=new r.ContiguousTokensStore(this._languageIdCodec),this._debugBackgroundTokenizer=this._register(new S.MutableDisposable),this._backgroundTokenizationState=1,this._onDidChangeBackgroundTokenizationState=this._register(new E.Emitter),this.onDidChangeBackgroundTokenizationState=this._onDidChangeBackgroundTokenizationState.event,this._onDidChangeTokens=this._register(new E.Emitter),this.onDidChangeTokens=this._onDidChangeTokens.event,this._attachedViewStates=this._register(new S.DisposableMap),this._register(a.TokenizationRegistry.onDidChange(m=>{const C=this.getLanguageId();m.changedLanguages.indexOf(C)!==-1&&this.resetTokenization()})),this.resetTokenization(),this._register(h.onDidChangeVisibleRanges(({view:m,state:C})=>{if(C){let w=this._attachedViewStates.get(m);w||(w=new d(()=>this.refreshRanges(w.lineRanges)),this._attachedViewStates.set(m,w)),w.handleStateChange(C)}else this._attachedViewStates.deleteAndDispose(m)}))}resetTokenization(l=!0){var o;this._tokens.flush(),(o=this._debugBackgroundTokens)===null||o===void 0||o.flush(),this._debugBackgroundStates&&(this._debugBackgroundStates=new n.TrackingTokenizationStateStore(this._textModel.getLineCount())),l&&this._onDidChangeTokens.fire({semanticTokensApplied:!1,ranges:[{fromLineNumber:1,toLineNumber:this._textModel.getLineCount()}]});const g=()=>{if(this._textModel.isTooLargeForTokenization())return[null,null];const C=a.TokenizationRegistry.get(this.getLanguageId());if(!C)return[null,null];let w;try{w=C.getInitialState()}catch(D){return(0,y.onUnexpectedError)(D),[null,null]}return[C,w]},[h,m]=g();if(h&&m?this._tokenizer=new n.TokenizerWithStateStoreAndTextModel(this._textModel.getLineCount(),h,this._textModel,this._languageIdCodec):this._tokenizer=null,this._backgroundTokenizer.clear(),this._defaultBackgroundTokenizer=null,this._tokenizer){const C={setTokens:w=>{this.setTokens(w)},backgroundTokenizationFinished:()=>{if(this._backgroundTokenizationState===2)return;const w=2;this._backgroundTokenizationState=w,this._onDidChangeBackgroundTokenizationState.fire()},setEndState:(w,D)=>{var I;if(!this._tokenizer)return;const T=this._tokenizer.store.getFirstInvalidEndStateLineNumber();T!==null&&w>=T&&((I=this._tokenizer)===null||I===void 0||I.store.setEndState(w,D))}};h&&h.createBackgroundTokenizer&&!h.backgroundTokenizerShouldOnlyVerifyTokens&&(this._backgroundTokenizer.value=h.createBackgroundTokenizer(this._textModel,C)),!this._backgroundTokenizer.value&&!this._textModel.isTooLargeForTokenization()&&(this._backgroundTokenizer.value=this._defaultBackgroundTokenizer=new n.DefaultBackgroundTokenizer(this._tokenizer,C),this._defaultBackgroundTokenizer.handleChanges()),h?.backgroundTokenizerShouldOnlyVerifyTokens&&h.createBackgroundTokenizer?(this._debugBackgroundTokens=new r.ContiguousTokensStore(this._languageIdCodec),this._debugBackgroundStates=new n.TrackingTokenizationStateStore(this._textModel.getLineCount()),this._debugBackgroundTokenizer.clear(),this._debugBackgroundTokenizer.value=h.createBackgroundTokenizer(this._textModel,{setTokens:w=>{var D;(D=this._debugBackgroundTokens)===null||D===void 0||D.setMultilineTokens(w,this._textModel)},backgroundTokenizationFinished(){},setEndState:(w,D)=>{var I;(I=this._debugBackgroundStates)===null||I===void 0||I.setEndState(w,D)}})):(this._debugBackgroundTokens=void 0,this._debugBackgroundStates=void 0,this._debugBackgroundTokenizer.value=void 0)}this.refreshAllVisibleLineTokens()}handleDidChangeAttached(){var l;(l=this._defaultBackgroundTokenizer)===null||l===void 0||l.handleChanges()}handleDidChangeContent(l){var o,g,h;if(l.isFlush)this.resetTokenization(!1);else if(!l.isEolChange){for(const m of l.changes){const[C,w]=(0,p.countEOL)(m.text);this._tokens.acceptEdit(m.range,C,w),(o=this._debugBackgroundTokens)===null||o===void 0||o.acceptEdit(m.range,C,w)}(g=this._debugBackgroundStates)===null||g===void 0||g.acceptChanges(l.changes),this._tokenizer&&this._tokenizer.store.acceptChanges(l.changes),(h=this._defaultBackgroundTokenizer)===null||h===void 0||h.handleChanges()}}setTokens(l){const{changes:o}=this._tokens.setMultilineTokens(l,this._textModel);return o.length>0&&this._onDidChangeTokens.fire({semanticTokensApplied:!1,ranges:o}),{changes:o}}refreshAllVisibleLineTokens(){const l=_.LineRange.joinMany([...this._attachedViewStates].map(([o,g])=>g.lineRanges));this.refreshRanges(l)}refreshRanges(l){for(const o of l)this.refreshRange(o.startLineNumber,o.endLineNumberExclusive-1)}refreshRange(l,o){var g,h;if(!this._tokenizer)return;l=Math.max(1,Math.min(this._textModel.getLineCount(),l)),o=Math.min(this._textModel.getLineCount(),o);const m=new t.ContiguousMultilineTokensBuilder,{heuristicTokens:C}=this._tokenizer.tokenizeHeuristically(m,l,o),w=this.setTokens(m.finalize());if(C)for(const D of w.changes)(g=this._backgroundTokenizer.value)===null||g===void 0||g.requestTokens(D.fromLineNumber,D.toLineNumber+1);(h=this._defaultBackgroundTokenizer)===null||h===void 0||h.checkFinished()}forceTokenization(l){var o,g;const h=new t.ContiguousMultilineTokensBuilder;(o=this._tokenizer)===null||o===void 0||o.updateTokensUntilLine(h,l),this.setTokens(h.finalize()),(g=this._defaultBackgroundTokenizer)===null||g===void 0||g.checkFinished()}isCheapToTokenize(l){return this._tokenizer?this._tokenizer.isCheapToTokenize(l):!0}tokenizeIfCheap(l){this.isCheapToTokenize(l)&&this.forceTokenization(l)}getLineTokens(l){var o;const g=this._textModel.getLineContent(l),h=this._tokens.getTokens(this._textModel.getLanguageId(),l-1,g);if(this._debugBackgroundTokens&&this._debugBackgroundStates&&this._tokenizer&&this._debugBackgroundStates.getFirstInvalidEndStateLineNumberOrMax()>l&&this._tokenizer.store.getFirstInvalidEndStateLineNumberOrMax()>l){const m=this._debugBackgroundTokens.getTokens(this._textModel.getLanguageId(),l-1,g);!h.equals(m)&&(!((o=this._debugBackgroundTokenizer.value)===null||o===void 0)&&o.reportMismatchingTokens)&&this._debugBackgroundTokenizer.value.reportMismatchingTokens(l)}return h}getTokenTypeIfInsertingCharacter(l,o,g){if(!this._tokenizer)return 0;const h=this._textModel.validatePosition(new v.Position(l,o));return this.forceTokenization(h.lineNumber),this._tokenizer.getTokenTypeIfInsertingCharacter(h,g)}tokenizeLineWithEdit(l,o,g){if(!this._tokenizer)return null;const h=this._textModel.validatePosition(l);return this.forceTokenization(h.lineNumber),this._tokenizer.tokenizeLineWithEdit(h,o,g)}get hasTokens(){return this._tokens.hasTokens}}class d extends S.Disposable{get lineRanges(){return this._lineRanges}constructor(l){super(),this._refreshTokens=l,this.runner=this._register(new k.RunOnceScheduler(()=>this.update(),50)),this._computedLineRanges=[],this._lineRanges=[]}update(){(0,L.equals)(this._computedLineRanges,this._lineRanges,(l,o)=>l.equals(o))||(this._computedLineRanges=this._lineRanges,this._refreshTokens())}handleStateChange(l){this._lineRanges=l.visibleLineRanges,l.stabilized?(this.runner.cancel(),this.update()):this.runner.schedule()}}}),define(se[338],oe([1,0,19,6,65,22,10,5,24,31,211]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createMonacoBaseAPI=e.KeyMod=void 0;class a{static chord(t,r){return(0,y.KeyChord)(t,r)}}e.KeyMod=a,a.CtrlCmd=2048,a.Shift=1024,a.Alt=512,a.WinCtrl=256;function i(){return{editor:void 0,languages:void 0,CancellationTokenSource:L.CancellationTokenSource,Emitter:k.Emitter,KeyCode:b.KeyCode,KeyMod:a,Position:S.Position,Range:p.Range,Selection:_.Selection,SelectionDirection:b.SelectionDirection,MarkerSeverity:b.MarkerSeverity,MarkerTag:b.MarkerTag,Uri:E.URI,Token:v.Token}}e.createMonacoBaseAPI=i}),define(se[643],oe([1,0,173,22,10,5,527,151,510,516,338,61,296,507,55,509]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.create=e.EditorSimpleWorker=void 0;class u extends S.MirrorTextModel{get uri(){return this._uri}get eol(){return this._eol}getValue(){return this.getText()}findMatches(s){const l=[];for(let o=0;o<this._lines.length;o++){const g=this._lines[o],h=this.offsetAt(new y.Position(o+1,1)),m=g.matchAll(s);for(const C of m)(C.index||C.index===0)&&(C.index=C.index+h),l.push(C)}return l}getLinesContent(){return this._lines.slice(0)}getLineCount(){return this._lines.length}getLineContent(s){return this._lines[s-1]}getWordAtPosition(s,l){const o=(0,p.getWordAtText)(s.column,(0,p.ensureValidWordDefinition)(l),this._lines[s.lineNumber-1],0);return o?new E.Range(s.lineNumber,o.startColumn,s.lineNumber,o.endColumn):null}words(s){const l=this._lines,o=this._wordenize.bind(this);let g=0,h="",m=0,C=[];return{*[Symbol.iterator](){for(;;)if(m<C.length){const w=h.substring(C[m].start,C[m].end);m+=1,yield w}else if(g<l.length)h=l[g],C=o(h,s),m=0,g+=1;else break}}}getLineWords(s,l){const o=this._lines[s-1],g=this._wordenize(o,l),h=[];for(const m of g)h.push({word:o.substring(m.start,m.end),startColumn:m.start+1,endColumn:m.end+1});return h}_wordenize(s,l){const o=[];let g;for(l.lastIndex=0;(g=l.exec(s))&&g[0].length!==0;)o.push({start:g.index,end:g.index+g[0].length});return o}getValueInRange(s){if(s=this._validateRange(s),s.startLineNumber===s.endLineNumber)return this._lines[s.startLineNumber-1].substring(s.startColumn-1,s.endColumn-1);const l=this._eol,o=s.startLineNumber-1,g=s.endLineNumber-1,h=[];h.push(this._lines[o].substring(s.startColumn-1));for(let m=o+1;m<g;m++)h.push(this._lines[m]);return h.push(this._lines[g].substring(0,s.endColumn-1)),h.join(l)}offsetAt(s){return s=this._validatePosition(s),this._ensureLineStarts(),this._lineStarts.getPrefixSum(s.lineNumber-2)+(s.column-1)}positionAt(s){s=Math.floor(s),s=Math.max(0,s),this._ensureLineStarts();const l=this._lineStarts.getIndexOf(s),o=this._lines[l.index].length;return{lineNumber:1+l.index,column:1+Math.min(l.remainder,o)}}_validateRange(s){const l=this._validatePosition({lineNumber:s.startLineNumber,column:s.startColumn}),o=this._validatePosition({lineNumber:s.endLineNumber,column:s.endColumn});return l.lineNumber!==s.startLineNumber||l.column!==s.startColumn||o.lineNumber!==s.endLineNumber||o.column!==s.endColumn?{startLineNumber:l.lineNumber,startColumn:l.column,endLineNumber:o.lineNumber,endColumn:o.column}:s}_validatePosition(s){if(!y.Position.isIPosition(s))throw new Error("bad position");let{lineNumber:l,column:o}=s,g=!1;if(l<1)l=1,o=1,g=!0;else if(l>this._lines.length)l=this._lines.length,o=this._lines[l-1].length+1,g=!0;else{const h=this._lines[l-1].length+1;o<1?(o=1,g=!0):o>h&&(o=h,g=!0)}return g?{lineNumber:l,column:o}:s}}class f{constructor(s,l){this._host=s,this._models=Object.create(null),this._foreignModuleFactory=l,this._foreignModule=null}dispose(){this._models=Object.create(null)}_getModel(s){return this._models[s]}_getModels(){const s=[];return Object.keys(this._models).forEach(l=>s.push(this._models[l])),s}acceptNewModel(s){this._models[s.url]=new u(k.URI.parse(s.url),s.lines,s.EOL,s.versionId)}acceptModelChanged(s,l){if(!this._models[s])return;this._models[s].onEvents(l)}acceptRemovedModel(s){this._models[s]&&delete this._models[s]}async computeUnicodeHighlights(s,l,o){const g=this._getModel(s);return g?i.UnicodeTextModelHighlighter.computeUnicodeHighlights(g,l,o):{ranges:[],hasMore:!1,ambiguousCharacterCount:0,invisibleCharacterCount:0,nonBasicAsciiCharacterCount:0}}async computeDiff(s,l,o,g){const h=this._getModel(s),m=this._getModel(l);return!h||!m?null:f.computeDiff(h,m,o,g)}static computeDiff(s,l,o,g){const h=g==="advanced"?n.linesDiffComputers.getDefault():n.linesDiffComputers.getLegacy(),m=s.getLinesContent(),C=l.getLinesContent(),w=h.computeDiff(m,C,o),D=w.changes.length>0?!1:this._modelsAreIdentical(s,l);function I(T){return T.map(A=>{var P;return[A.original.startLineNumber,A.original.endLineNumberExclusive,A.modified.startLineNumber,A.modified.endLineNumberExclusive,(P=A.innerChanges)===null||P===void 0?void 0:P.map(N=>[N.originalRange.startLineNumber,N.originalRange.startColumn,N.originalRange.endLineNumber,N.originalRange.endColumn,N.modifiedRange.startLineNumber,N.modifiedRange.startColumn,N.modifiedRange.endLineNumber,N.modifiedRange.endColumn])]})}return{identical:D,quitEarly:w.hitTimeout,changes:I(w.changes),moves:w.moves.map(T=>[T.lineRangeMapping.original.startLineNumber,T.lineRangeMapping.original.endLineNumberExclusive,T.lineRangeMapping.modified.startLineNumber,T.lineRangeMapping.modified.endLineNumberExclusive,I(T.changes)])}}static _modelsAreIdentical(s,l){const o=s.getLineCount(),g=l.getLineCount();if(o!==g)return!1;for(let h=1;h<=o;h++){const m=s.getLineContent(h),C=l.getLineContent(h);if(m!==C)return!1}return!0}async computeMoreMinimalEdits(s,l,o){const g=this._getModel(s);if(!g)return l;const h=[];let m;l=l.slice(0).sort((w,D)=>{if(w.range&&D.range)return E.Range.compareRangesUsingStarts(w.range,D.range);const I=w.range?0:1,T=D.range?0:1;return I-T});let C=0;for(let w=1;w<l.length;w++)E.Range.getEndPosition(l[C].range).equals(E.Range.getStartPosition(l[w].range))?(l[C].range=E.Range.fromPositions(E.Range.getStartPosition(l[C].range),E.Range.getEndPosition(l[w].range)),l[C].text+=l[w].text):(C++,l[C]=l[w]);l.length=C+1;for(let{range:w,text:D,eol:I}of l){if(typeof I=="number"&&(m=I),E.Range.isEmpty(w)&&!D)continue;const T=g.getValueInRange(w);if(D=D.replace(/\r\n|\n|\r/g,g.eol),T===D)continue;if(Math.max(D.length,T.length)>f._diffLimit){h.push({range:w,text:D});continue}const A=(0,L.stringDiff)(T,D,o),P=g.offsetAt(E.Range.lift(w).getStartPosition());for(const N of A){const M=g.positionAt(P+N.originalStart),R=g.positionAt(P+N.originalStart+N.originalLength),x={text:D.substr(N.modifiedStart,N.modifiedLength),range:{startLineNumber:M.lineNumber,startColumn:M.column,endLineNumber:R.lineNumber,endColumn:R.column}};g.getValueInRange(x.range)!==x.text&&h.push(x)}}return typeof m=="number"&&h.push({eol:m,text:"",range:{startLineNumber:0,startColumn:0,endLineNumber:0,endColumn:0}}),h}async computeLinks(s){const l=this._getModel(s);return l?(0,_.computeLinks)(l):null}async computeDefaultDocumentColors(s){const l=this._getModel(s);return l?(0,r.computeDefaultDocumentColors)(l):null}async textualSuggest(s,l,o,g){const h=new a.StopWatch,m=new RegExp(o,g),C=new Set;e:for(const w of s){const D=this._getModel(w);if(D){for(const I of D.words(m))if(!(I===l||!isNaN(Number(I)))&&(C.add(I),C.size>f._suggestionsLimit))break e}}return{words:Array.from(C),duration:h.elapsed()}}async computeWordRanges(s,l,o,g){const h=this._getModel(s);if(!h)return Object.create(null);const m=new RegExp(o,g),C=Object.create(null);for(let w=l.startLineNumber;w<l.endLineNumber;w++){const D=h.getLineWords(w,m);for(const I of D){if(!isNaN(Number(I.word)))continue;let T=C[I.word];T||(T=[],C[I.word]=T),T.push({startLineNumber:w,startColumn:I.startColumn,endLineNumber:w,endColumn:I.endColumn})}}return C}async navigateValueSet(s,l,o,g,h){const m=this._getModel(s);if(!m)return null;const C=new RegExp(g,h);l.startColumn===l.endColumn&&(l={startLineNumber:l.startLineNumber,startColumn:l.startColumn,endLineNumber:l.endLineNumber,endColumn:l.endColumn+1});const w=m.getValueInRange(l),D=m.getWordAtPosition({lineNumber:l.startLineNumber,column:l.startColumn},C);if(!D)return null;const I=m.getValueInRange(D);return v.BasicInplaceReplace.INSTANCE.navigateValueSet(l,w,D,I,o)}loadForeignModule(s,l,o){const g=(C,w)=>this._host.fhr(C,w),m={host:(0,t.createProxyObject)(o,g),getMirrorModels:()=>this._getModels()};return this._foreignModuleFactory?(this._foreignModule=this._foreignModuleFactory(m,l),Promise.resolve((0,t.getAllMethodNames)(this._foreignModule))):new Promise((C,w)=>{te([s],D=>{this._foreignModule=D.create(m,l),C((0,t.getAllMethodNames)(this._foreignModule))},w)})}fmr(s,l){if(!this._foreignModule||typeof this._foreignModule[s]!="function")return Promise.reject(new Error("Missing requestHandler or method: "+s));try{return Promise.resolve(this._foreignModule[s].apply(this._foreignModule,l))}catch(o){return Promise.reject(o)}}}e.EditorSimpleWorker=f,f._diffLimit=1e5,f._suggestionsLimit=1e4;function c(d){return new f(d,null)}e.create=c,typeof importScripts=="function"&&(globalThis.monaco=(0,b.createMonacoBaseAPI)())}),define(se[339],oe([1,0,6,2,281,31]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MinimapTokensColorTracker=void 0;class S extends k.Disposable{static getInstance(){return this._INSTANCE||(this._INSTANCE=(0,k.markAsSingleton)(new S)),this._INSTANCE}constructor(){super(),this._onDidChange=new L.Emitter,this.onDidChange=this._onDidChange.event,this._updateColorMap(),this._register(E.TokenizationRegistry.onDidChange(_=>{_.changedColorMap&&this._updateColorMap()}))}_updateColorMap(){const _=E.TokenizationRegistry.getColorMap();if(!_){this._colors=[y.RGBA8.Empty],this._backgroundIsLight=!0;return}this._colors=[y.RGBA8.Empty];for(let b=1;b<_.length;b++){const a=_[b].rgba;this._colors[b]=new y.RGBA8(a.r,a.g,a.b,Math.round(a.a*255))}const v=_[2].getRelativeLuminance();this._backgroundIsLight=v>=.5,this._onDidChange.fire(void 0)}getColor(_){return(_<1||_>=this._colors.length)&&(_=2),this._colors[_]}backgroundIsLight(){return this._backgroundIsLight}}e.MinimapTokensColorTracker=S,S._INSTANCE=null}),define(se[644],oe([3,4]),function(te,e){return te.create("vs/editor/common/languages/modesRegistry",e)}),define(se[645],oe([3,4]),function(te,e){return te.create("vs/editor/common/model/editStack",e)}),define(se[340],oe([1,0,645,12,24,22,329,144,49]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditStack=e.isEditStackElement=e.MultiModelEditStackElement=e.SingleModelEditStackElement=e.SingleModelEditStackData=void 0;function v(u){return u.toString()}class b{static create(f,c){const d=f.getAlternativeVersionId(),s=n(f);return new b(d,d,s,s,c,c,[])}constructor(f,c,d,s,l,o,g){this.beforeVersionId=f,this.afterVersionId=c,this.beforeEOL=d,this.afterEOL=s,this.beforeCursorState=l,this.afterCursorState=o,this.changes=g}append(f,c,d,s,l){c.length>0&&(this.changes=(0,S.compressConsecutiveTextChanges)(this.changes,c)),this.afterEOL=d,this.afterVersionId=s,this.afterCursorState=l}static _writeSelectionsSize(f){return 4+4*4*(f?f.length:0)}static _writeSelections(f,c,d){if(p.writeUInt32BE(f,c?c.length:0,d),d+=4,c)for(const s of c)p.writeUInt32BE(f,s.selectionStartLineNumber,d),d+=4,p.writeUInt32BE(f,s.selectionStartColumn,d),d+=4,p.writeUInt32BE(f,s.positionLineNumber,d),d+=4,p.writeUInt32BE(f,s.positionColumn,d),d+=4;return d}static _readSelections(f,c,d){const s=p.readUInt32BE(f,c);c+=4;for(let l=0;l<s;l++){const o=p.readUInt32BE(f,c);c+=4;const g=p.readUInt32BE(f,c);c+=4;const h=p.readUInt32BE(f,c);c+=4;const m=p.readUInt32BE(f,c);c+=4,d.push(new y.Selection(o,g,h,m))}return c}serialize(){let f=10+b._writeSelectionsSize(this.beforeCursorState)+b._writeSelectionsSize(this.afterCursorState)+4;for(const s of this.changes)f+=s.writeSize();const c=new Uint8Array(f);let d=0;p.writeUInt32BE(c,this.beforeVersionId,d),d+=4,p.writeUInt32BE(c,this.afterVersionId,d),d+=4,p.writeUInt8(c,this.beforeEOL,d),d+=1,p.writeUInt8(c,this.afterEOL,d),d+=1,d=b._writeSelections(c,this.beforeCursorState,d),d=b._writeSelections(c,this.afterCursorState,d),p.writeUInt32BE(c,this.changes.length,d),d+=4;for(const s of this.changes)d=s.write(c,d);return c.buffer}static deserialize(f){const c=new Uint8Array(f);let d=0;const s=p.readUInt32BE(c,d);d+=4;const l=p.readUInt32BE(c,d);d+=4;const o=p.readUInt8(c,d);d+=1;const g=p.readUInt8(c,d);d+=1;const h=[];d=b._readSelections(c,d,h);const m=[];d=b._readSelections(c,d,m);const C=p.readUInt32BE(c,d);d+=4;const w=[];for(let D=0;D<C;D++)d=S.TextChange.read(c,d,w);return new b(s,l,o,g,h,m,w)}}e.SingleModelEditStackData=b;class a{get type(){return 0}get resource(){return E.URI.isUri(this.model)?this.model:this.model.uri}constructor(f,c,d,s){this.label=f,this.code=c,this.model=d,this._data=b.create(d,s)}toString(){return(this._data instanceof b?this._data:b.deserialize(this._data)).changes.map(c=>c.toString()).join(", ")}matchesResource(f){return(E.URI.isUri(this.model)?this.model:this.model.uri).toString()===f.toString()}setModel(f){this.model=f}canAppend(f){return this.model===f&&this._data instanceof b}append(f,c,d,s,l){this._data instanceof b&&this._data.append(f,c,d,s,l)}close(){this._data instanceof b&&(this._data=this._data.serialize())}open(){this._data instanceof b||(this._data=b.deserialize(this._data))}undo(){if(E.URI.isUri(this.model))throw new Error("Invalid SingleModelEditStackElement");this._data instanceof b&&(this._data=this._data.serialize());const f=b.deserialize(this._data);this.model._applyUndo(f.changes,f.beforeEOL,f.beforeVersionId,f.beforeCursorState)}redo(){if(E.URI.isUri(this.model))throw new Error("Invalid SingleModelEditStackElement");this._data instanceof b&&(this._data=this._data.serialize());const f=b.deserialize(this._data);this.model._applyRedo(f.changes,f.afterEOL,f.afterVersionId,f.afterCursorState)}heapSize(){return this._data instanceof b&&(this._data=this._data.serialize()),this._data.byteLength+168}}e.SingleModelEditStackElement=a;class i{get resources(){return this._editStackElementsArr.map(f=>f.resource)}constructor(f,c,d){this.label=f,this.code=c,this.type=1,this._isOpen=!0,this._editStackElementsArr=d.slice(0),this._editStackElementsMap=new Map;for(const s of this._editStackElementsArr){const l=v(s.resource);this._editStackElementsMap.set(l,s)}this._delegate=null}prepareUndoRedo(){if(this._delegate)return this._delegate.prepareUndoRedo(this)}matchesResource(f){const c=v(f);return this._editStackElementsMap.has(c)}setModel(f){const c=v(E.URI.isUri(f)?f:f.uri);this._editStackElementsMap.has(c)&&this._editStackElementsMap.get(c).setModel(f)}canAppend(f){if(!this._isOpen)return!1;const c=v(f.uri);return this._editStackElementsMap.has(c)?this._editStackElementsMap.get(c).canAppend(f):!1}append(f,c,d,s,l){const o=v(f.uri);this._editStackElementsMap.get(o).append(f,c,d,s,l)}close(){this._isOpen=!1}open(){}undo(){this._isOpen=!1;for(const f of this._editStackElementsArr)f.undo()}redo(){for(const f of this._editStackElementsArr)f.redo()}heapSize(f){const c=v(f);return this._editStackElementsMap.has(c)?this._editStackElementsMap.get(c).heapSize():0}split(){return this._editStackElementsArr}toString(){const f=[];for(const c of this._editStackElementsArr)f.push(`${(0,_.basename)(c.resource)}: ${c}`);return`{${f.join(", ")}}`}}e.MultiModelEditStackElement=i;function n(u){return u.getEOL()===`
+`?0:1}function t(u){return u?u instanceof a||u instanceof i:!1}e.isEditStackElement=t;class r{constructor(f,c){this._model=f,this._undoRedoService=c}pushStackElement(){const f=this._undoRedoService.getLastElement(this._model.uri);t(f)&&f.close()}popStackElement(){const f=this._undoRedoService.getLastElement(this._model.uri);t(f)&&f.open()}clear(){this._undoRedoService.removeElements(this._model.uri)}_getOrCreateEditStackElement(f,c){const d=this._undoRedoService.getLastElement(this._model.uri);if(t(d)&&d.canAppend(this._model))return d;const s=new a(L.localize(0,null),"undoredo.textBufferEdit",this._model,f);return this._undoRedoService.pushElement(s,c),s}pushEOL(f){const c=this._getOrCreateEditStackElement(null,void 0);this._model.setEOL(f),c.append(this._model,[],n(this._model),this._model.getAlternativeVersionId(),null)}pushEditOperation(f,c,d,s){const l=this._getOrCreateEditStackElement(f,s),o=this._model.applyEdits(c,!0),g=r._computeCursorState(d,o),h=o.map((m,C)=>({index:C,textChange:m.textChange}));return h.sort((m,C)=>m.textChange.oldPosition===C.textChange.oldPosition?m.index-C.index:m.textChange.oldPosition-C.textChange.oldPosition),l.append(this._model,h.map(m=>m.textChange),n(this._model),this._model.getAlternativeVersionId(),g),g}static _computeCursorState(f,c){try{return f?f(c):null}catch(d){return(0,k.onUnexpectedError)(d),null}}}e.EditStack=r}),define(se[646],oe([3,4]),function(te,e){return te.create("vs/editor/common/standaloneStrings",e)}),define(se[96],oe([1,0,646]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneServicesNLS=e.ToggleHighContrastNLS=e.StandaloneCodeEditorNLS=e.QuickOutlineNLS=e.QuickCommandNLS=e.QuickHelpNLS=e.GoToLineNLS=e.InspectTokensNLS=void 0;var k;(function(a){a.inspectTokensAction=L.localize(0,null)})(k||(e.InspectTokensNLS=k={}));var y;(function(a){a.gotoLineActionLabel=L.localize(1,null)})(y||(e.GoToLineNLS=y={}));var E;(function(a){a.helpQuickAccessActionLabel=L.localize(2,null)})(E||(e.QuickHelpNLS=E={}));var S;(function(a){a.quickCommandActionLabel=L.localize(3,null),a.quickCommandHelp=L.localize(4,null)})(S||(e.QuickCommandNLS=S={}));var p;(function(a){a.quickOutlineActionLabel=L.localize(5,null),a.quickOutlineByCategoryActionLabel=L.localize(6,null)})(p||(e.QuickOutlineNLS=p={}));var _;(function(a){a.editorViewAccessibleLabel=L.localize(7,null),a.accessibilityHelpMessage=L.localize(8,null)})(_||(e.StandaloneCodeEditorNLS=_={}));var v;(function(a){a.toggleHighContrast=L.localize(9,null)})(v||(e.ToggleHighContrastNLS=v={}));var b;(function(a){a.bulkEditServiceSummary=L.localize(10,null)})(b||(e.StandaloneServicesNLS=b={}))}),define(se[647],oe([3,4]),function(te,e){return te.create("vs/editor/common/viewLayout/viewLineRenderer",e)}),define(se[120],oe([1,0,647,11,102,155,543]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.renderViewLine2=e.RenderLineOutput2=e.renderViewLine=e.RenderLineOutput=e.CharacterMapping=e.DomPosition=e.RenderLineInput=e.LineRange=void 0;class p{constructor(w,D){this.startOffset=w,this.endOffset=D}equals(w){return this.startOffset===w.startOffset&&this.endOffset===w.endOffset}}e.LineRange=p;class _{constructor(w,D,I,T,A,P,N,M,R,x,O,B,W,V,K,F,q,ie,ae){this.useMonospaceOptimizations=w,this.canUseHalfwidthRightwardsArrow=D,this.lineContent=I,this.continuesWithWrappedLine=T,this.isBasicASCII=A,this.containsRTL=P,this.fauxIndentLength=N,this.lineTokens=M,this.lineDecorations=R.sort(E.LineDecoration.compare),this.tabSize=x,this.startVisibleColumn=O,this.spaceWidth=B,this.stopRenderingLineAfter=K,this.renderWhitespace=F==="all"?4:F==="boundary"?1:F==="selection"?2:F==="trailing"?3:0,this.renderControlCharacters=q,this.fontLigatures=ie,this.selectionsOnLine=ae&&ae.sort((J,Q)=>J.startOffset<Q.startOffset?-1:1);const ne=Math.abs(V-B),$=Math.abs(W-B);ne<$?(this.renderSpaceWidth=V,this.renderSpaceCharCode=11825):(this.renderSpaceWidth=W,this.renderSpaceCharCode=183)}sameSelection(w){if(this.selectionsOnLine===null)return w===null;if(w===null||w.length!==this.selectionsOnLine.length)return!1;for(let D=0;D<this.selectionsOnLine.length;D++)if(!this.selectionsOnLine[D].equals(w[D]))return!1;return!0}equals(w){return this.useMonospaceOptimizations===w.useMonospaceOptimizations&&this.canUseHalfwidthRightwardsArrow===w.canUseHalfwidthRightwardsArrow&&this.lineContent===w.lineContent&&this.continuesWithWrappedLine===w.continuesWithWrappedLine&&this.isBasicASCII===w.isBasicASCII&&this.containsRTL===w.containsRTL&&this.fauxIndentLength===w.fauxIndentLength&&this.tabSize===w.tabSize&&this.startVisibleColumn===w.startVisibleColumn&&this.spaceWidth===w.spaceWidth&&this.renderSpaceWidth===w.renderSpaceWidth&&this.renderSpaceCharCode===w.renderSpaceCharCode&&this.stopRenderingLineAfter===w.stopRenderingLineAfter&&this.renderWhitespace===w.renderWhitespace&&this.renderControlCharacters===w.renderControlCharacters&&this.fontLigatures===w.fontLigatures&&E.LineDecoration.equalsArr(this.lineDecorations,w.lineDecorations)&&this.lineTokens.equals(w.lineTokens)&&this.sameSelection(w.selectionsOnLine)}}e.RenderLineInput=_;class v{constructor(w,D){this.partIndex=w,this.charIndex=D}}e.DomPosition=v;class b{static getPartIndex(w){return(w&4294901760)>>>16}static getCharIndex(w){return(w&65535)>>>0}constructor(w,D){this.length=w,this._data=new Uint32Array(this.length),this._horizontalOffset=new Uint32Array(this.length)}setColumnInfo(w,D,I,T){const A=(D<<16|I<<0)>>>0;this._data[w-1]=A,this._horizontalOffset[w-1]=T}getHorizontalOffset(w){return this._horizontalOffset.length===0?0:this._horizontalOffset[w-1]}charOffsetToPartData(w){return this.length===0?0:w<0?this._data[0]:w>=this.length?this._data[this.length-1]:this._data[w]}getDomPosition(w){const D=this.charOffsetToPartData(w-1),I=b.getPartIndex(D),T=b.getCharIndex(D);return new v(I,T)}getColumn(w,D){return this.partDataToCharOffset(w.partIndex,D,w.charIndex)+1}partDataToCharOffset(w,D,I){if(this.length===0)return 0;const T=(w<<16|I<<0)>>>0;let A=0,P=this.length-1;for(;A+1<P;){const K=A+P>>>1,F=this._data[K];if(F===T)return K;F>T?P=K:A=K}if(A===P)return A;const N=this._data[A],M=this._data[P];if(N===T)return A;if(M===T)return P;const R=b.getPartIndex(N),x=b.getCharIndex(N),O=b.getPartIndex(M);let B;R!==O?B=D:B=b.getCharIndex(M);const W=I-x,V=B-I;return W<=V?A:P}}e.CharacterMapping=b;class a{constructor(w,D,I){this._renderLineOutputBrand=void 0,this.characterMapping=w,this.containsRTL=D,this.containsForeignElements=I}}e.RenderLineOutput=a;function i(C,w){if(C.lineContent.length===0){if(C.lineDecorations.length>0){w.appendString("<span>");let D=0,I=0,T=0;for(const P of C.lineDecorations)(P.type===1||P.type===2)&&(w.appendString('<span class="'),w.appendString(P.className),w.appendString('"></span>'),P.type===1&&(T|=1,D++),P.type===2&&(T|=2,I++));w.appendString("</span>");const A=new b(1,D+I);return A.setColumnInfo(1,D,0,0),new a(A,!1,T)}return w.appendString("<span><span></span></span>"),new a(new b(0,0),!1,0)}return g(u(C),w)}e.renderViewLine=i;class n{constructor(w,D,I,T){this.characterMapping=w,this.html=D,this.containsRTL=I,this.containsForeignElements=T}}e.RenderLineOutput2=n;function t(C){const w=new y.StringBuilder(1e4),D=i(C,w);return new n(D.characterMapping,w.build(),D.containsRTL,D.containsForeignElements)}e.renderViewLine2=t;class r{constructor(w,D,I,T,A,P,N,M,R,x,O,B,W,V,K,F){this.fontIsMonospace=w,this.canUseHalfwidthRightwardsArrow=D,this.lineContent=I,this.len=T,this.isOverflowing=A,this.overflowingCharCount=P,this.parts=N,this.containsForeignElements=M,this.fauxIndentLength=R,this.tabSize=x,this.startVisibleColumn=O,this.containsRTL=B,this.spaceWidth=W,this.renderSpaceCharCode=V,this.renderWhitespace=K,this.renderControlCharacters=F}}function u(C){const w=C.lineContent;let D,I,T;C.stopRenderingLineAfter!==-1&&C.stopRenderingLineAfter<w.length?(D=!0,I=w.length-C.stopRenderingLineAfter,T=C.stopRenderingLineAfter):(D=!1,I=0,T=w.length);let A=f(w,C.containsRTL,C.lineTokens,C.fauxIndentLength,T);C.renderControlCharacters&&!C.isBasicASCII&&(A=s(w,A)),(C.renderWhitespace===4||C.renderWhitespace===1||C.renderWhitespace===2&&C.selectionsOnLine||C.renderWhitespace===3&&!C.continuesWithWrappedLine)&&(A=l(C,w,T,A));let P=0;if(C.lineDecorations.length>0){for(let N=0,M=C.lineDecorations.length;N<M;N++){const R=C.lineDecorations[N];R.type===3||R.type===1?P|=1:R.type===2&&(P|=2)}A=o(w,T,A,C.lineDecorations)}return C.containsRTL||(A=c(w,A,!C.isBasicASCII||C.fontLigatures)),new r(C.useMonospaceOptimizations,C.canUseHalfwidthRightwardsArrow,w,T,D,I,A,P,C.fauxIndentLength,C.tabSize,C.startVisibleColumn,C.containsRTL,C.spaceWidth,C.renderSpaceCharCode,C.renderWhitespace,C.renderControlCharacters)}function f(C,w,D,I,T){const A=[];let P=0;I>0&&(A[P++]=new S.LinePart(I,"",0,!1));let N=I;for(let M=0,R=D.getCount();M<R;M++){const x=D.getEndOffset(M);if(x<=I)continue;const O=D.getClassName(M);if(x>=T){const W=w?k.containsRTL(C.substring(N,T)):!1;A[P++]=new S.LinePart(T,O,0,W);break}const B=w?k.containsRTL(C.substring(N,x)):!1;A[P++]=new S.LinePart(x,O,0,B),N=x}return A}function c(C,w,D){let I=0;const T=[];let A=0;if(D)for(let P=0,N=w.length;P<N;P++){const M=w[P],R=M.endIndex;if(I+50<R){const x=M.type,O=M.metadata,B=M.containsRTL;let W=-1,V=I;for(let K=I;K<R;K++)C.charCodeAt(K)===32&&(W=K),W!==-1&&K-V>=50&&(T[A++]=new S.LinePart(W+1,x,O,B),V=W+1,W=-1);V!==R&&(T[A++]=new S.LinePart(R,x,O,B))}else T[A++]=M;I=R}else for(let P=0,N=w.length;P<N;P++){const M=w[P],R=M.endIndex,x=R-I;if(x>50){const O=M.type,B=M.metadata,W=M.containsRTL,V=Math.ceil(x/50);for(let K=1;K<V;K++){const F=I+K*50;T[A++]=new S.LinePart(F,O,B,W)}T[A++]=new S.LinePart(R,O,B,W)}else T[A++]=M;I=R}return T}function d(C){return C<32?C!==9:C===127||C>=8234&&C<=8238||C>=8294&&C<=8297||C>=8206&&C<=8207||C===1564}function s(C,w){const D=[];let I=new S.LinePart(0,"",0,!1),T=0;for(const A of w){const P=A.endIndex;for(;T<P;T++){const N=C.charCodeAt(T);d(N)&&(T>I.endIndex&&(I=new S.LinePart(T,A.type,A.metadata,A.containsRTL),D.push(I)),I=new S.LinePart(T+1,"mtkcontrol",A.metadata,!1),D.push(I))}T>I.endIndex&&(I=new S.LinePart(P,A.type,A.metadata,A.containsRTL),D.push(I))}return D}function l(C,w,D,I){const T=C.continuesWithWrappedLine,A=C.fauxIndentLength,P=C.tabSize,N=C.startVisibleColumn,M=C.useMonospaceOptimizations,R=C.selectionsOnLine,x=C.renderWhitespace===1,O=C.renderWhitespace===3,B=C.renderSpaceWidth!==C.spaceWidth,W=[];let V=0,K=0,F=I[K].type,q=I[K].containsRTL,ie=I[K].endIndex;const ae=I.length;let ne=!1,$=k.firstNonWhitespaceIndex(w),J;$===-1?(ne=!0,$=D,J=D):J=k.lastNonWhitespaceIndex(w);let Q=!1,re=0,de=R&&R[re],he=N%P;for(let X=A;X<D;X++){const U=w.charCodeAt(X);de&&X>=de.endOffset&&(re++,de=R&&R[re]);let G;if(X<$||X>J)G=!0;else if(U===9)G=!0;else if(U===32)if(x)if(Q)G=!0;else{const z=X+1<D?w.charCodeAt(X+1):0;G=z===32||z===9}else G=!0;else G=!1;if(G&&R&&(G=!!de&&de.startOffset<=X&&de.endOffset>X),G&&O&&(G=ne||X>J),G&&q&&X>=$&&X<=J&&(G=!1),Q){if(!G||!M&&he>=P){if(B){const z=V>0?W[V-1].endIndex:A;for(let H=z+1;H<=X;H++)W[V++]=new S.LinePart(H,"mtkw",1,!1)}else W[V++]=new S.LinePart(X,"mtkw",1,!1);he=he%P}}else(X===ie||G&&X>A)&&(W[V++]=new S.LinePart(X,F,0,q),he=he%P);for(U===9?he=P:k.isFullWidthCharacter(U)?he+=2:he++,Q=G;X===ie&&(K++,K<ae);)F=I[K].type,q=I[K].containsRTL,ie=I[K].endIndex}let me=!1;if(Q)if(T&&x){const X=D>0?w.charCodeAt(D-1):0,U=D>1?w.charCodeAt(D-2):0;X===32&&U!==32&&U!==9||(me=!0)}else me=!0;if(me)if(B){const X=V>0?W[V-1].endIndex:A;for(let U=X+1;U<=D;U++)W[V++]=new S.LinePart(U,"mtkw",1,!1)}else W[V++]=new S.LinePart(D,"mtkw",1,!1);else W[V++]=new S.LinePart(D,F,0,q);return W}function o(C,w,D,I){I.sort(E.LineDecoration.compare);const T=E.LineDecorationsNormalizer.normalize(C,I),A=T.length;let P=0;const N=[];let M=0,R=0;for(let O=0,B=D.length;O<B;O++){const W=D[O],V=W.endIndex,K=W.type,F=W.metadata,q=W.containsRTL;for(;P<A&&T[P].startOffset<V;){const ie=T[P];if(ie.startOffset>R&&(R=ie.startOffset,N[M++]=new S.LinePart(R,K,F,q)),ie.endOffset+1<=V)R=ie.endOffset+1,N[M++]=new S.LinePart(R,K+" "+ie.className,F|ie.metadata,q),P++;else{R=V,N[M++]=new S.LinePart(R,K+" "+ie.className,F|ie.metadata,q);break}}V>R&&(R=V,N[M++]=new S.LinePart(R,K,F,q))}const x=D[D.length-1].endIndex;if(P<A&&T[P].startOffset===x)for(;P<A&&T[P].startOffset===x;){const O=T[P];N[M++]=new S.LinePart(R,O.className,O.metadata,!1),P++}return N}function g(C,w){const D=C.fontIsMonospace,I=C.canUseHalfwidthRightwardsArrow,T=C.containsForeignElements,A=C.lineContent,P=C.len,N=C.isOverflowing,M=C.overflowingCharCount,R=C.parts,x=C.fauxIndentLength,O=C.tabSize,B=C.startVisibleColumn,W=C.containsRTL,V=C.spaceWidth,K=C.renderSpaceCharCode,F=C.renderWhitespace,q=C.renderControlCharacters,ie=new b(P+1,R.length);let ae=!1,ne=0,$=B,J=0,Q=0,re=0;W?w.appendString('<span dir="ltr">'):w.appendString("<span>");for(let de=0,he=R.length;de<he;de++){const me=R[de],X=me.endIndex,U=me.type,G=me.containsRTL,z=F!==0&&me.isWhitespace(),H=z&&!D&&(U==="mtkw"||!T),Y=ne===X&&me.isPseudoAfter();if(J=0,w.appendString("<span "),G&&w.appendString('style="unicode-bidi:isolate" '),w.appendString('class="'),w.appendString(H?"mtkz":U),w.appendASCIICharCode(34),z){let j=0;{let Z=ne,ee=$;for(;Z<X;Z++){const ue=(A.charCodeAt(Z)===9?O-ee%O:1)|0;j+=ue,Z>=x&&(ee+=ue)}}for(H&&(w.appendString(' style="width:'),w.appendString(String(V*j)),w.appendString('px"')),w.appendASCIICharCode(62);ne<X;ne++){ie.setColumnInfo(ne+1,de-re,J,Q),re=0;const Z=A.charCodeAt(ne);let ee,le;if(Z===9){ee=O-$%O|0,le=ee,!I||le>1?w.appendCharCode(8594):w.appendCharCode(65515);for(let ue=2;ue<=le;ue++)w.appendCharCode(160)}else ee=2,le=1,w.appendCharCode(K),w.appendCharCode(8204);J+=ee,Q+=le,ne>=x&&($+=le)}}else for(w.appendASCIICharCode(62);ne<X;ne++){ie.setColumnInfo(ne+1,de-re,J,Q),re=0;const j=A.charCodeAt(ne);let Z=1,ee=1;switch(j){case 9:Z=O-$%O,ee=Z;for(let le=1;le<=Z;le++)w.appendCharCode(160);break;case 32:w.appendCharCode(160);break;case 60:w.appendString("&lt;");break;case 62:w.appendString("&gt;");break;case 38:w.appendString("&amp;");break;case 0:q?w.appendCharCode(9216):w.appendString("&#00;");break;case 65279:case 8232:case 8233:case 133:w.appendCharCode(65533);break;default:k.isFullWidthCharacter(j)&&ee++,q&&j<32?w.appendCharCode(9216+j):q&&j===127?w.appendCharCode(9249):q&&d(j)?(w.appendString("[U+"),w.appendString(h(j)),w.appendString("]"),Z=8,ee=Z):w.appendCharCode(j)}J+=Z,Q+=ee,ne>=x&&($+=ee)}Y?re++:re=0,ne>=P&&!ae&&me.isPseudoAfter()&&(ae=!0,ie.setColumnInfo(ne+1,de,J,Q)),w.appendString("</span>")}return ae||ie.setColumnInfo(P+1,R.length-1,J,Q),N&&(w.appendString('<span class="mtkoverflow">'),w.appendString(L.localize(0,null,m(M))),w.appendString("</span>")),w.appendString("</span>"),new a(ie,W,T)}function h(C){return C.toString(16).toUpperCase().padStart(4,"0")}function m(C){return C<1024?L.localize(1,null,C):C<1024*1024?`${(C/1024).toFixed(1)} KB`:`${(C/1024/1024).toFixed(1)} MB`}}),define(se[648],oe([1,0,93,72,36,102,155,120,86]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RenderOptions=e.LineSource=e.renderLines=void 0;const v=(0,L.createTrustedTypesPolicy)("diffEditorWidget",{createHTML:t=>t});function b(t,r,u,f){(0,k.applyFontInfo)(f,r.fontInfo);const c=u.length>0,d=new E.StringBuilder(1e4);let s=0,l=0;const o=[];for(let C=0;C<t.lineTokens.length;C++){const w=C+1,D=t.lineTokens[C],I=t.lineBreakData[C],T=S.LineDecoration.filter(u,w,1,Number.MAX_SAFE_INTEGER);if(I){let A=0;for(const P of I.breakOffsets){const N=D.sliceAndInflate(A,P,0);s=Math.max(s,n(l,N,S.LineDecoration.extractWrapped(T,A,P),c,t.mightContainNonBasicASCII,t.mightContainRTL,r,d)),l++,A=P}o.push(I.breakOffsets.length)}else o.push(1),s=Math.max(s,n(l,D,T,c,t.mightContainNonBasicASCII,t.mightContainRTL,r,d)),l++}s+=r.scrollBeyondLastColumn;const g=d.build(),h=v?v.createHTML(g):g;f.innerHTML=h;const m=s*r.typicalHalfwidthCharacterWidth;return{heightInLines:l,minWidthInPx:m,viewLineCounts:o}}e.renderLines=b;class a{constructor(r,u,f,c){this.lineTokens=r,this.lineBreakData=u,this.mightContainNonBasicASCII=f,this.mightContainRTL=c}}e.LineSource=a;class i{static fromEditor(r){var u;const f=r.getOptions(),c=f.get(50),d=f.get(143);return new i(((u=r.getModel())===null||u===void 0?void 0:u.getOptions().tabSize)||0,c,f.get(33),c.typicalHalfwidthCharacterWidth,f.get(103),f.get(66),d.decorationsWidth,f.get(116),f.get(98),f.get(93),f.get(51))}constructor(r,u,f,c,d,s,l,o,g,h,m){this.tabSize=r,this.fontInfo=u,this.disableMonospaceOptimizations=f,this.typicalHalfwidthCharacterWidth=c,this.scrollBeyondLastColumn=d,this.lineHeight=s,this.lineDecorationsWidth=l,this.stopRenderingLineAfter=o,this.renderWhitespace=g,this.renderControlCharacters=h,this.fontLigatures=m}}e.RenderOptions=i;function n(t,r,u,f,c,d,s,l){l.appendString('<div class="view-line'),f||l.appendString(" char-delete"),l.appendString('" style="top:'),l.appendString(String(t*s.lineHeight)),l.appendString('px;width:1000000px;">');const o=r.getLineContent(),g=_.ViewLineRenderingData.isBasicASCII(o,c),h=_.ViewLineRenderingData.containsRTL(o,g,d),m=(0,p.renderViewLine)(new p.RenderLineInput(s.fontInfo.isMonospace&&!s.disableMonospaceOptimizations,s.fontInfo.canUseHalfwidthRightwardsArrow,o,!1,g,h,0,r,u,s.tabSize,0,s.fontInfo.spaceWidth,s.fontInfo.middotWidth,s.fontInfo.wsmiddotWidth,s.stopRenderingLineAfter,s.renderWhitespace,s.renderControlCharacters,s.fontLigatures!==y.EditorFontLigatures.OFF,null),l);return l.appendString("</div>"),m.characterMapping.getHorizontalOffset(m.characterMapping.length)}}),define(se[649],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/anchorSelect/browser/anchorSelect",e)}),define(se[650],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/bracketMatching/browser/bracketMatching",e)}),define(se[651],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/caretOperations/browser/caretOperations",e)}),define(se[652],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/caretOperations/browser/transpose",e)}),define(se[653],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/clipboard/browser/clipboard",e)}),define(se[654],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/codeAction/browser/codeAction",e)}),define(se[655],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/codeAction/browser/codeActionCommands",e)}),define(se[656],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/codeAction/browser/codeActionContributions",e)}),define(se[657],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/codeAction/browser/codeActionController",e)}),define(se[658],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/codeAction/browser/codeActionMenu",e)}),define(se[659],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/codeAction/browser/lightBulbWidget",e)}),define(se[660],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/codelens/browser/codelensController",e)}),define(se[661],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/colorPicker/browser/colorPickerWidget",e)}),define(se[662],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions",e)}),define(se[663],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/comment/browser/comment",e)}),define(se[664],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/contextmenu/browser/contextmenu",e)}),define(se[665],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/cursorUndo/browser/cursorUndo",e)}),define(se[666],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution",e)}),define(se[667],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/dropOrPasteInto/browser/copyPasteController",e)}),define(se[668],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/dropOrPasteInto/browser/defaultProviders",e)}),define(se[669],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution",e)}),define(se[670],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController",e)}),define(se[671],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/editorState/browser/keybindingCancellation",e)}),define(se[672],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/find/browser/findController",e)}),define(se[673],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/find/browser/findWidget",e)}),define(se[674],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/folding/browser/folding",e)}),define(se[675],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/folding/browser/foldingDecorations",e)}),define(se[676],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/fontZoom/browser/fontZoom",e)}),define(se[677],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/format/browser/formatActions",e)}),define(se[678],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/gotoError/browser/gotoError",e)}),define(se[679],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/gotoError/browser/gotoErrorWidget",e)}),define(se[680],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/gotoSymbol/browser/goToCommands",e)}),define(se[681],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition",e)}),define(se[682],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/gotoSymbol/browser/peek/referencesController",e)}),define(se[683],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/gotoSymbol/browser/peek/referencesTree",e)}),define(se[684],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget",e)}),define(se[685],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/gotoSymbol/browser/referencesModel",e)}),define(se[161],oe([1,0,12,6,170,2,53,49,11,5,685]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReferencesModel=e.FileReferences=e.FilePreview=e.OneReference=void 0;class a{constructor(u,f,c,d){this.isProviderFirst=u,this.parent=f,this.link=c,this._rangeCallback=d,this.id=y.defaultGenerator.nextId()}get uri(){return this.link.uri}get range(){var u,f;return(f=(u=this._range)!==null&&u!==void 0?u:this.link.targetSelectionRange)!==null&&f!==void 0?f:this.link.range}set range(u){this._range=u,this._rangeCallback(this)}get ariaMessage(){var u;const f=(u=this.parent.getPreview(this))===null||u===void 0?void 0:u.preview(this.range);return f?(0,b.localize)(1,null,f.value,(0,p.basename)(this.uri),this.range.startLineNumber,this.range.startColumn):(0,b.localize)(0,null,(0,p.basename)(this.uri),this.range.startLineNumber,this.range.startColumn)}}e.OneReference=a;class i{constructor(u){this._modelReference=u}dispose(){this._modelReference.dispose()}preview(u,f=8){const c=this._modelReference.object.textEditorModel;if(!c)return;const{startLineNumber:d,startColumn:s,endLineNumber:l,endColumn:o}=u,g=c.getWordUntilPosition({lineNumber:d,column:s-f}),h=new v.Range(d,g.startColumn,d,s),m=new v.Range(l,o,l,1073741824),C=c.getValueInRange(h).replace(/^\s+/,""),w=c.getValueInRange(u),D=c.getValueInRange(m).replace(/\s+$/,"");return{value:C+w+D,highlight:{start:C.length,end:C.length+w.length}}}}e.FilePreview=i;class n{constructor(u,f){this.parent=u,this.uri=f,this.children=[],this._previews=new S.ResourceMap}dispose(){(0,E.dispose)(this._previews.values()),this._previews.clear()}getPreview(u){return this._previews.get(u.uri)}get ariaMessage(){const u=this.children.length;return u===1?(0,b.localize)(2,null,(0,p.basename)(this.uri),this.uri.fsPath):(0,b.localize)(3,null,u,(0,p.basename)(this.uri),this.uri.fsPath)}async resolve(u){if(this._previews.size!==0)return this;for(const f of this.children)if(!this._previews.has(f.uri))try{const c=await u.createModelReference(f.uri);this._previews.set(f.uri,new i(c))}catch(c){(0,L.onUnexpectedError)(c)}return this}}e.FileReferences=n;class t{constructor(u,f){this.groups=[],this.references=[],this._onDidChangeReferenceRange=new k.Emitter,this.onDidChangeReferenceRange=this._onDidChangeReferenceRange.event,this._links=u,this._title=f;const[c]=u;u.sort(t._compareReferences);let d;for(const s of u)if((!d||!p.extUri.isEqual(d.uri,s.uri,!0))&&(d=new n(this,s.uri),this.groups.push(d)),d.children.length===0||t._compareReferences(s,d.children[d.children.length-1])!==0){const l=new a(c===s,d,s,o=>this._onDidChangeReferenceRange.fire(o));this.references.push(l),d.children.push(l)}}dispose(){(0,E.dispose)(this.groups),this._onDidChangeReferenceRange.dispose(),this.groups.length=0}clone(){return new t(this._links,this._title)}get title(){return this._title}get isEmpty(){return this.groups.length===0}get ariaMessage(){return this.isEmpty?(0,b.localize)(4,null):this.references.length===1?(0,b.localize)(5,null,this.references[0].uri.fsPath):this.groups.length===1?(0,b.localize)(6,null,this.references.length,this.groups[0].uri.fsPath):(0,b.localize)(7,null,this.references.length,this.groups.length)}nextOrPreviousReference(u,f){const{parent:c}=u;let d=c.children.indexOf(u);const s=c.children.length,l=c.parent.groups.length;return l===1||f&&d+1<s||!f&&d>0?(f?d=(d+1)%s:d=(d+s-1)%s,c.children[d]):(d=c.parent.groups.indexOf(c),f?(d=(d+1)%l,c.parent.groups[d].children[0]):(d=(d+l-1)%l,c.parent.groups[d].children[c.parent.groups[d].children.length-1]))}nearestReference(u,f){const c=this.references.map((d,s)=>({idx:s,prefixLen:_.commonPrefixLength(d.uri.toString(),u.toString()),offsetDist:Math.abs(d.range.startLineNumber-f.lineNumber)*100+Math.abs(d.range.startColumn-f.column)})).sort((d,s)=>d.prefixLen>s.prefixLen?-1:d.prefixLen<s.prefixLen?1:d.offsetDist<s.offsetDist?-1:d.offsetDist>s.offsetDist?1:0)[0];if(c)return this.references[c.idx]}referenceAt(u,f){for(const c of this.references)if(c.uri.toString()===u.toString()&&v.Range.containsPosition(c.range,f))return c}firstReference(){for(const u of this.references)if(u.isProviderFirst)return u;return this.references[0]}static _compareReferences(u,f){return p.extUri.compare(u.uri,f.uri)||v.Range.compareRangesUsingStarts(u.range,f.range)}}e.ReferencesModel=t}),define(se[686],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/gotoSymbol/browser/symbolNavigation",e)}),define(se[687],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/hover/browser/hover",e)}),define(se[688],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/hover/browser/markdownHoverParticipant",e)}),define(se[689],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/hover/browser/markerHoverParticipant",e)}),define(se[690],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace",e)}),define(se[691],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/indentation/browser/indentation",e)}),define(se[692],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/inlayHints/browser/inlayHintsHover",e)}),define(se[693],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/inlineCompletions/browser/commands",e)}),define(se[694],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/inlineCompletions/browser/hoverParticipant",e)}),define(se[695],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys",e)}),define(se[696],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController",e)}),define(se[697],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget",e)}),define(se[698],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/lineSelection/browser/lineSelection",e)}),define(se[699],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/linesOperations/browser/linesOperations",e)}),define(se[700],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/linkedEditing/browser/linkedEditing",e)}),define(se[701],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/links/browser/links",e)}),define(se[702],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/message/browser/messageController",e)}),define(se[703],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/multicursor/browser/multicursor",e)}),define(se[704],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/parameterHints/browser/parameterHints",e)}),define(se[705],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/parameterHints/browser/parameterHintsWidget",e)}),define(se[706],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/peekView/browser/peekView",e)}),define(se[707],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess",e)}),define(se[708],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess",e)}),define(se[709],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/readOnlyMessage/browser/contribution",e)}),define(se[710],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/rename/browser/rename",e)}),define(se[711],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/rename/browser/renameInputField",e)}),define(se[712],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/smartSelect/browser/smartSelect",e)}),define(se[713],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/snippet/browser/snippetController2",e)}),define(se[714],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/snippet/browser/snippetVariables",e)}),define(se[715],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/stickyScroll/browser/stickyScrollActions",e)}),define(se[716],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/suggest/browser/suggest",e)}),define(se[717],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/suggest/browser/suggestController",e)}),define(se[718],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/suggest/browser/suggestWidget",e)}),define(se[719],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/suggest/browser/suggestWidgetDetails",e)}),define(se[720],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/suggest/browser/suggestWidgetRenderer",e)}),define(se[721],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/suggest/browser/suggestWidgetStatus",e)}),define(se[722],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/symbolIcons/browser/symbolIcons",e)}),define(se[723],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode",e)}),define(se[724],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/tokenization/browser/tokenization",e)}),define(se[725],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter",e)}),define(se[726],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators",e)}),define(se[727],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/wordHighlighter/browser/highlightDecorations",e)}),define(se[728],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/wordHighlighter/browser/wordHighlighter",e)}),define(se[729],oe([3,4]),function(te,e){return te.create("vs/editor/contrib/wordOperations/browser/wordOperations",e)}),define(se[730],oe([3,4]),function(te,e){return te.create("vs/platform/action/common/actionCommonCategories",e)}),define(se[731],oe([3,4]),function(te,e){return te.create("vs/platform/actionWidget/browser/actionList",e)}),define(se[732],oe([3,4]),function(te,e){return te.create("vs/platform/actionWidget/browser/actionWidget",e)}),define(se[733],oe([3,4]),function(te,e){return te.create("vs/platform/actions/browser/menuEntryActionViewItem",e)}),define(se[734],oe([3,4]),function(te,e){return te.create("vs/platform/actions/browser/toolbar",e)}),define(se[735],oe([3,4]),function(te,e){return te.create("vs/platform/actions/common/menuService",e)}),define(se[736],oe([3,4]),function(te,e){return te.create("vs/platform/audioCues/browser/audioCueService",e)}),define(se[737],oe([3,4]),function(te,e){return te.create("vs/platform/configuration/common/configurationRegistry",e)}),define(se[738],oe([3,4]),function(te,e){return te.create("vs/platform/contextkey/browser/contextKeyService",e)}),define(se[739],oe([3,4]),function(te,e){return te.create("vs/platform/contextkey/common/contextkey",e)}),define(se[740],oe([3,4]),function(te,e){return te.create("vs/platform/contextkey/common/contextkeys",e)}),define(se[741],oe([3,4]),function(te,e){return te.create("vs/platform/contextkey/common/scanner",e)}),define(se[742],oe([3,4]),function(te,e){return te.create("vs/platform/history/browser/contextScopedHistoryWidget",e)}),define(se[743],oe([3,4]),function(te,e){return te.create("vs/platform/keybinding/common/abstractKeybindingService",e)}),define(se[744],oe([3,4]),function(te,e){return te.create("vs/platform/list/browser/listService",e)}),define(se[745],oe([3,4]),function(te,e){return te.create("vs/platform/markers/common/markers",e)}),define(se[746],oe([3,4]),function(te,e){return te.create("vs/platform/quickinput/browser/commandsQuickAccess",e)}),define(se[747],oe([3,4]),function(te,e){return te.create("vs/platform/quickinput/browser/helpQuickAccess",e)}),define(se[748],oe([3,4]),function(te,e){return te.create("vs/platform/quickinput/browser/quickInput",e)}),define(se[749],oe([3,4]),function(te,e){return te.create("vs/platform/quickinput/browser/quickInputController",e)}),define(se[750],oe([3,4]),function(te,e){return te.create("vs/platform/quickinput/browser/quickInputList",e)}),define(se[751],oe([3,4]),function(te,e){return te.create("vs/platform/quickinput/browser/quickInputUtils",e)}),define(se[752],oe([3,4]),function(te,e){return te.create("vs/platform/theme/common/colorRegistry",e)}),define(se[753],oe([3,4]),function(te,e){return te.create("vs/platform/theme/common/iconRegistry",e)}),define(se[754],oe([3,4]),function(te,e){return te.create("vs/platform/undoRedo/common/undoRedoService",e)}),define(se[755],oe([3,4]),function(te,e){return te.create("vs/platform/workspace/common/workspace",e)}),define(se[756],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isICommandActionToggleInfo=void 0;function L(k){return k?k.condition!==void 0:!1}e.isICommandActionToggleInfo=L}),define(se[757],oe([1,0,730]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Categories=void 0,e.Categories=Object.freeze({View:(0,L.localize2)(1,"View"),Help:(0,L.localize2)(2,"Help"),Test:(0,L.localize2)(3,"Test"),File:(0,L.localize2)(4,"File"),Preferences:(0,L.localize2)(5,"Preferences"),Developer:{value:(0,L.localize)(0,null),original:"Developer"}})}),define(se[758],oe([1,0,12,741]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Scanner=void 0;function y(..._){switch(_.length){case 1:return(0,k.localize)(0,null,_[0]);case 2:return(0,k.localize)(1,null,_[0],_[1]);case 3:return(0,k.localize)(2,null,_[0],_[1],_[2]);default:return}}const E=(0,k.localize)(3,null),S=(0,k.localize)(4,null);class p{constructor(){this._input="",this._start=0,this._current=0,this._tokens=[],this._errors=[],this.stringRe=/[a-zA-Z0-9_<>\-\./\\:\*\?\+\[\]\^,#@;"%\$\p{L}-]+/uy}static getLexeme(v){switch(v.type){case 0:return"(";case 1:return")";case 2:return"!";case 3:return v.isTripleEq?"===":"==";case 4:return v.isTripleEq?"!==":"!=";case 5:return"<";case 6:return"<=";case 7:return">=";case 8:return">=";case 9:return"=~";case 10:return v.lexeme;case 11:return"true";case 12:return"false";case 13:return"in";case 14:return"not";case 15:return"&&";case 16:return"||";case 17:return v.lexeme;case 18:return v.lexeme;case 19:return v.lexeme;case 20:return"EOF";default:throw(0,L.illegalState)(`unhandled token type: ${JSON.stringify(v)}; have you forgotten to add a case?`)}}reset(v){return this._input=v,this._start=0,this._current=0,this._tokens=[],this._errors=[],this}scan(){for(;!this._isAtEnd();)switch(this._start=this._current,this._advance()){case 40:this._addToken(0);break;case 41:this._addToken(1);break;case 33:if(this._match(61)){const b=this._match(61);this._tokens.push({type:4,offset:this._start,isTripleEq:b})}else this._addToken(2);break;case 39:this._quotedString();break;case 47:this._regex();break;case 61:if(this._match(61)){const b=this._match(61);this._tokens.push({type:3,offset:this._start,isTripleEq:b})}else this._match(126)?this._addToken(9):this._error(y("==","=~"));break;case 60:this._addToken(this._match(61)?6:5);break;case 62:this._addToken(this._match(61)?8:7);break;case 38:this._match(38)?this._addToken(15):this._error(y("&&"));break;case 124:this._match(124)?this._addToken(16):this._error(y("||"));break;case 32:case 13:case 9:case 10:case 160:break;default:this._string()}return this._start=this._current,this._addToken(20),Array.from(this._tokens)}_match(v){return this._isAtEnd()||this._input.charCodeAt(this._current)!==v?!1:(this._current++,!0)}_advance(){return this._input.charCodeAt(this._current++)}_peek(){return this._isAtEnd()?0:this._input.charCodeAt(this._current)}_addToken(v){this._tokens.push({type:v,offset:this._start})}_error(v){const b=this._start,a=this._input.substring(this._start,this._current),i={type:19,offset:this._start,lexeme:a};this._errors.push({offset:b,lexeme:a,additionalInfo:v}),this._tokens.push(i)}_string(){this.stringRe.lastIndex=this._start;const v=this.stringRe.exec(this._input);if(v){this._current=this._start+v[0].length;const b=this._input.substring(this._start,this._current),a=p._keywords.get(b);a?this._addToken(a):this._tokens.push({type:17,lexeme:b,offset:this._start})}}_quotedString(){for(;this._peek()!==39&&!this._isAtEnd();)this._advance();if(this._isAtEnd()){this._error(E);return}this._advance(),this._tokens.push({type:18,lexeme:this._input.substring(this._start+1,this._current-1),offset:this._start+1})}_regex(){let v=this._current,b=!1,a=!1;for(;;){if(v>=this._input.length){this._current=v,this._error(S);return}const n=this._input.charCodeAt(v);if(b)b=!1;else if(n===47&&!a){v++;break}else n===91?a=!0:n===92?b=!0:n===93&&(a=!1);v++}for(;v<this._input.length&&p._regexFlags.has(this._input.charCodeAt(v));)v++;this._current=v;const i=this._input.substring(this._start,this._current);this._tokens.push({type:10,lexeme:i,offset:this._start})}_isAtEnd(){return this._current>=this._input.length}}e.Scanner=p,p._regexFlags=new Set(["i","g","s","m","y","u"].map(_=>_.charCodeAt(0))),p._keywords=new Map([["not",14],["in",13],["false",12],["true",11]])}),define(se[759],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorOpenSource=void 0;var L;(function(k){k[k.API=0]="API",k[k.USER=1]="USER"})(L||(e.EditorOpenSource=L={}))}),define(se[760],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ExtensionIdentifierSet=e.ExtensionIdentifier=void 0;class L{constructor(E){this.value=E,this._lower=E.toLowerCase()}static toKey(E){return typeof E=="string"?E.toLowerCase():E._lower}}e.ExtensionIdentifier=L;class k{constructor(E){if(this._set=new Set,E)for(const S of E)this.add(S)}add(E){this._set.add(L.toKey(E))}has(E){return this._set.has(L.toKey(E))}}e.ExtensionIdentifierSet=k}),define(se[341],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FileKind=void 0;var L;(function(k){k[k.FILE=0]="FILE",k[k.FOLDER=1]="FOLDER",k[k.ROOT_FOLDER=2]="ROOT_FOLDER"})(L||(e.FileKind=L={}))}),define(se[761],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.showHistoryKeybindingHint=void 0;function L(k){var y,E;return((y=k.lookupKeybinding("history.showPrevious"))===null||y===void 0?void 0:y.getElectronAccelerator())==="Up"&&((E=k.lookupKeybinding("history.showNext"))===null||E===void 0?void 0:E.getElectronAccelerator())==="Down"}e.showHistoryKeybindingHint=L}),define(se[236],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SyncDescriptor=void 0;class L{constructor(y,E=[],S=!1){this.ctor=y,this.staticArguments=E,this.supportsDelayedInstantiation=S}}e.SyncDescriptor=L}),define(se[45],oe([1,0,236]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getSingletonServiceDescriptors=e.registerSingleton=void 0;const k=[];function y(S,p,_){p instanceof L.SyncDescriptor||(p=new L.SyncDescriptor(p,[],!!_)),k.push([S,p])}e.registerSingleton=y;function E(){return k}e.getSingletonServiceDescriptors=E}),define(se[762],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Graph=e.Node=void 0;class L{constructor(E,S){this.key=E,this.data=S,this.incoming=new Map,this.outgoing=new Map}}e.Node=L;class k{constructor(E){this._hashFn=E,this._nodes=new Map}roots(){const E=[];for(const S of this._nodes.values())S.outgoing.size===0&&E.push(S);return E}insertEdge(E,S){const p=this.lookupOrInsertNode(E),_=this.lookupOrInsertNode(S);p.outgoing.set(_.key,_),_.incoming.set(p.key,p)}removeNode(E){const S=this._hashFn(E);this._nodes.delete(S);for(const p of this._nodes.values())p.outgoing.delete(S),p.incoming.delete(S)}lookupOrInsertNode(E){const S=this._hashFn(E);let p=this._nodes.get(S);return p||(p=new L(S,E),this._nodes.set(S,p)),p}isEmpty(){return this._nodes.size===0}toString(){const E=[];for(const[S,p]of this._nodes)E.push(`${S}
+	(-> incoming)[${[...p.incoming.keys()].join(", ")}]
+	(outgoing ->)[${[...p.outgoing.keys()].join(",")}]
+`);return E.join(`
+`)}findCycleSlow(){for(const[E,S]of this._nodes){const p=new Set([E]),_=this._findCycle(S,p);if(_)return _}}_findCycle(E,S){for(const[p,_]of E.outgoing){if(S.has(p))return[...S,p].join(" -> ");S.add(p);const v=this._findCycle(_,S);if(v)return v;S.delete(p)}}}e.Graph=k}),define(se[8],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createDecorator=e.IInstantiationService=e._util=void 0;var L;(function(E){E.serviceIds=new Map,E.DI_TARGET="$di$target",E.DI_DEPENDENCIES="$di$dependencies";function S(p){return p[E.DI_DEPENDENCIES]||[]}E.getServiceDependencies=S})(L||(e._util=L={})),e.IInstantiationService=y("instantiationService");function k(E,S,p){S[L.DI_TARGET]===S?S[L.DI_DEPENDENCIES].push({id:E,index:p}):(S[L.DI_DEPENDENCIES]=[{id:E,index:p}],S[L.DI_TARGET]=S)}function y(E){if(L.serviceIds.has(E))return L.serviceIds.get(E);const S=function(p,_,v){if(arguments.length!==3)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");k(S,p,v)};return S.toString=()=>E,L.serviceIds.set(E,S),S}e.createDecorator=y}),define(se[136],oe([1,0,8,22,20]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResourceFileEdit=e.ResourceTextEdit=e.ResourceEdit=e.IBulkEditService=void 0,e.IBulkEditService=(0,L.createDecorator)("IWorkspaceEditService");class E{constructor(v){this.metadata=v}static convert(v){return v.edits.map(b=>{if(S.is(b))return S.lift(b);if(p.is(b))return p.lift(b);throw new Error("Unsupported edit")})}}e.ResourceEdit=E;class S extends E{static is(v){return v instanceof S?!0:(0,y.isObject)(v)&&k.URI.isUri(v.resource)&&(0,y.isObject)(v.textEdit)}static lift(v){return v instanceof S?v:new S(v.resource,v.textEdit,v.versionId,v.metadata)}constructor(v,b,a=void 0,i){super(i),this.resource=v,this.textEdit=b,this.versionId=a}}e.ResourceTextEdit=S;class p extends E{static is(v){return v instanceof p?!0:(0,y.isObject)(v)&&(!!v.newResource||!!v.oldResource)}static lift(v){return v instanceof p?v:new p(v.oldResource,v.newResource,v.options,v.metadata)}constructor(v,b,a={},i){super(i),this.oldResource=v,this.newResource=b,this.options=a}}e.ResourceFileEdit=p}),define(se[33],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ICodeEditorService=void 0,e.ICodeEditorService=(0,L.createDecorator)("codeEditorService")});var ge=this&&this.__param||function(te,e){return function(L,k){e(L,k,te)}};define(se[342],oe([1,0,7,118,26,58,2,35,171,28,20,87,62,10,5,31,627,8]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f){"use strict";var c;Object.defineProperty(e,"__esModule",{value:!0}),e.HideUnchangedRegionsFeature=void 0;let d=c=class extends S.Disposable{static setBreadcrumbsSourceFactory(o){this._breadcrumbsSourceFactory.set(o,void 0)}get isUpdatingHiddenAreas(){return this._isUpdatingHiddenAreas}constructor(o,g,h,m){super(),this._editors=o,this._diffModel=g,this._options=h,this._instantiationService=m,this._modifiedOutlineSource=(0,_.derivedDisposable)(this,I=>{const T=this._editors.modifiedModel.read(I),A=c._breadcrumbsSourceFactory.read(I);return!T||!A?void 0:A(T,this._instantiationService)}),this._isUpdatingHiddenAreas=!1,this._register(this._editors.original.onDidChangeCursorPosition(I=>{if(I.reason===3){const T=this._diffModel.get();(0,p.transaction)(A=>{for(const P of this._editors.original.getSelections()||[])T?.ensureOriginalLineIsVisible(P.getStartPosition().lineNumber,0,A),T?.ensureOriginalLineIsVisible(P.getEndPosition().lineNumber,0,A)})}})),this._register(this._editors.modified.onDidChangeCursorPosition(I=>{if(I.reason===3){const T=this._diffModel.get();(0,p.transaction)(A=>{for(const P of this._editors.modified.getSelections()||[])T?.ensureModifiedLineIsVisible(P.getStartPosition().lineNumber,0,A),T?.ensureModifiedLineIsVisible(P.getEndPosition().lineNumber,0,A)})}}));const C=this._diffModel.map((I,T)=>{var A,P;const N=(A=I?.unchangedRegions.read(T))!==null&&A!==void 0?A:[];return N.length===1&&N[0].modifiedLineNumber===1&&N[0].lineCount===((P=this._editors.modifiedModel.read(T))===null||P===void 0?void 0:P.getLineCount())?[]:N});this.viewZones=(0,p.derivedWithStore)(this,(I,T)=>{const A=this._modifiedOutlineSource.read(I);if(!A)return{origViewZones:[],modViewZones:[]};const P=[],N=[],M=this._options.renderSideBySide.read(I),R=C.read(I);for(const x of R)if(!x.shouldHideControls(I)){{const O=(0,p.derived)(this,W=>x.getHiddenOriginalRange(W).startLineNumber-1),B=new a.PlaceholderViewZone(O,24);P.push(B),T.add(new s(this._editors.original,B,x,x.originalUnchangedRange,!M,A,W=>this._diffModel.get().ensureModifiedLineIsVisible(W,2,void 0),this._options))}{const O=(0,p.derived)(this,W=>x.getHiddenModifiedRange(W).startLineNumber-1),B=new a.PlaceholderViewZone(O,24);N.push(B),T.add(new s(this._editors.modified,B,x,x.modifiedUnchangedRange,!1,A,W=>this._diffModel.get().ensureModifiedLineIsVisible(W,2,void 0),this._options))}}return{origViewZones:P,modViewZones:N}});const w={description:"unchanged lines",className:"diff-unchanged-lines",isWholeLine:!0},D={description:"Fold Unchanged",glyphMarginHoverMessage:new E.MarkdownString(void 0,{isTrusted:!0,supportThemeIcons:!0}).appendMarkdown((0,u.localize)(0,null)),glyphMarginClassName:"fold-unchanged "+v.ThemeIcon.asClassName(y.Codicon.fold),zIndex:10001};this._register((0,a.applyObservableDecorations)(this._editors.original,(0,p.derived)(this,I=>{const T=C.read(I),A=T.map(P=>({range:P.originalUnchangedRange.toInclusiveRange(),options:w}));for(const P of T)P.shouldHideControls(I)&&A.push({range:t.Range.fromPositions(new n.Position(P.originalLineNumber,1)),options:D});return A}))),this._register((0,a.applyObservableDecorations)(this._editors.modified,(0,p.derived)(this,I=>{const T=C.read(I),A=T.map(P=>({range:P.modifiedUnchangedRange.toInclusiveRange(),options:w}));for(const P of T)P.shouldHideControls(I)&&A.push({range:i.LineRange.ofLength(P.modifiedLineNumber,1).toInclusiveRange(),options:D});return A}))),this._register((0,p.autorun)(I=>{const T=C.read(I);this._isUpdatingHiddenAreas=!0;try{this._editors.original.setHiddenAreas(T.map(A=>A.getHiddenOriginalRange(I).toInclusiveRange()).filter(b.isDefined)),this._editors.modified.setHiddenAreas(T.map(A=>A.getHiddenModifiedRange(I).toInclusiveRange()).filter(b.isDefined))}finally{this._isUpdatingHiddenAreas=!1}})),this._register(this._editors.modified.onMouseUp(I=>{var T;if(!I.event.rightButton&&I.target.position&&(!((T=I.target.element)===null||T===void 0)&&T.className.includes("fold-unchanged"))){const A=I.target.position.lineNumber,P=this._diffModel.get();if(!P)return;const N=P.unchangedRegions.get().find(M=>M.modifiedUnchangedRange.includes(A));if(!N)return;N.collapseAll(void 0),I.event.stopPropagation(),I.event.preventDefault()}})),this._register(this._editors.original.onMouseUp(I=>{var T;if(!I.event.rightButton&&I.target.position&&(!((T=I.target.element)===null||T===void 0)&&T.className.includes("fold-unchanged"))){const A=I.target.position.lineNumber,P=this._diffModel.get();if(!P)return;const N=P.unchangedRegions.get().find(M=>M.originalUnchangedRange.includes(A));if(!N)return;N.collapseAll(void 0),I.event.stopPropagation(),I.event.preventDefault()}}))}};e.HideUnchangedRegionsFeature=d,d._breadcrumbsSourceFactory=(0,p.observableValue)("breadcrumbsSourceFactory",void 0),e.HideUnchangedRegionsFeature=d=c=ke([ge(3,f.IInstantiationService)],d);class s extends a.ViewZoneOverlayWidget{constructor(o,g,h,m,C,w,D,I){const T=(0,L.h)("div.diff-hidden-lines-widget");super(o,g,T.root),this._editor=o,this._unchangedRegion=h,this._unchangedRegionRange=m,this._hide=C,this._modifiedOutlineSource=w,this._revealModifiedHiddenLine=D,this._options=I,this._nodes=(0,L.h)("div.diff-hidden-lines",[(0,L.h)("div.top@top",{title:(0,u.localize)(1,null)}),(0,L.h)("div.center@content",{style:{display:"flex"}},[(0,L.h)("div@first",{style:{display:"flex",justifyContent:"center",alignItems:"center",flexShrink:"0"}},[(0,L.$)("a",{title:(0,u.localize)(2,null),role:"button",onclick:()=>{this._unchangedRegion.showAll(void 0)}},...(0,k.renderLabelWithIcons)("$(unfold)"))]),(0,L.h)("div@others",{style:{display:"flex",justifyContent:"center",alignItems:"center"}})]),(0,L.h)("div.bottom@bottom",{title:(0,u.localize)(3,null),role:"button"})]),T.root.appendChild(this._nodes.root);const A=(0,p.observableFromEvent)(this._editor.onDidLayoutChange,()=>this._editor.getLayoutInfo());this._hide?(0,L.reset)(this._nodes.first):this._register((0,a.applyStyle)(this._nodes.first,{width:A.map(N=>N.contentLeft)})),this._register((0,p.autorun)(N=>{const M=this._unchangedRegion.visibleLineCountTop.read(N)+this._unchangedRegion.visibleLineCountBottom.read(N)===this._unchangedRegion.lineCount;this._nodes.bottom.classList.toggle("canMoveTop",!M),this._nodes.bottom.classList.toggle("canMoveBottom",this._unchangedRegion.visibleLineCountBottom.read(N)>0),this._nodes.top.classList.toggle("canMoveTop",this._unchangedRegion.visibleLineCountTop.read(N)>0),this._nodes.top.classList.toggle("canMoveBottom",!M);const R=this._unchangedRegion.isDragged.read(N),x=this._editor.getDomNode();x&&(x.classList.toggle("draggingUnchangedRegion",!!R),R==="top"?(x.classList.toggle("canMoveTop",this._unchangedRegion.visibleLineCountTop.read(N)>0),x.classList.toggle("canMoveBottom",!M)):R==="bottom"?(x.classList.toggle("canMoveTop",!M),x.classList.toggle("canMoveBottom",this._unchangedRegion.visibleLineCountBottom.read(N)>0)):(x.classList.toggle("canMoveTop",!1),x.classList.toggle("canMoveBottom",!1)))}));const P=this._editor;this._register((0,L.addDisposableListener)(this._nodes.top,"mousedown",N=>{if(N.button!==0)return;this._nodes.top.classList.toggle("dragging",!0),this._nodes.root.classList.toggle("dragging",!0),N.preventDefault();const M=N.clientY;let R=!1;const x=this._unchangedRegion.visibleLineCountTop.get();this._unchangedRegion.isDragged.set("top",void 0);const O=(0,L.getWindow)(this._nodes.top),B=(0,L.addDisposableListener)(O,"mousemove",V=>{const F=V.clientY-M;R=R||Math.abs(F)>2;const q=Math.round(F/P.getOption(66)),ie=Math.max(0,Math.min(x+q,this._unchangedRegion.getMaxVisibleLineCountTop()));this._unchangedRegion.visibleLineCountTop.set(ie,void 0)}),W=(0,L.addDisposableListener)(O,"mouseup",V=>{R||this._unchangedRegion.showMoreAbove(this._options.hideUnchangedRegionsRevealLineCount.get(),void 0),this._nodes.top.classList.toggle("dragging",!1),this._nodes.root.classList.toggle("dragging",!1),this._unchangedRegion.isDragged.set(void 0,void 0),B.dispose(),W.dispose()})})),this._register((0,L.addDisposableListener)(this._nodes.bottom,"mousedown",N=>{if(N.button!==0)return;this._nodes.bottom.classList.toggle("dragging",!0),this._nodes.root.classList.toggle("dragging",!0),N.preventDefault();const M=N.clientY;let R=!1;const x=this._unchangedRegion.visibleLineCountBottom.get();this._unchangedRegion.isDragged.set("bottom",void 0);const O=(0,L.getWindow)(this._nodes.bottom),B=(0,L.addDisposableListener)(O,"mousemove",V=>{const F=V.clientY-M;R=R||Math.abs(F)>2;const q=Math.round(F/P.getOption(66)),ie=Math.max(0,Math.min(x-q,this._unchangedRegion.getMaxVisibleLineCountBottom())),ae=P.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);this._unchangedRegion.visibleLineCountBottom.set(ie,void 0);const ne=P.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);P.setScrollTop(P.getScrollTop()+(ne-ae))}),W=(0,L.addDisposableListener)(O,"mouseup",V=>{if(this._unchangedRegion.isDragged.set(void 0,void 0),!R){const K=P.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);this._unchangedRegion.showMoreBelow(this._options.hideUnchangedRegionsRevealLineCount.get(),void 0);const F=P.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);P.setScrollTop(P.getScrollTop()+(F-K))}this._nodes.bottom.classList.toggle("dragging",!1),this._nodes.root.classList.toggle("dragging",!1),B.dispose(),W.dispose()})})),this._register((0,p.autorun)(N=>{const M=[];if(!this._hide){const R=h.getHiddenModifiedRange(N).length,x=(0,u.localize)(4,null,R),O=(0,L.$)("span",{title:(0,u.localize)(5,null)},x);O.addEventListener("dblclick",V=>{V.button===0&&(V.preventDefault(),this._unchangedRegion.showAll(void 0))}),M.push(O);const B=this._unchangedRegion.getHiddenModifiedRange(N),W=this._modifiedOutlineSource.getBreadcrumbItems(B,N);if(W.length>0){M.push((0,L.$)("span",void 0,"\xA0\xA0|\xA0\xA0"));for(let V=0;V<W.length;V++){const K=W[V],F=r.SymbolKinds.toIcon(K.kind),q=(0,L.h)("div.breadcrumb-item",{style:{display:"flex",alignItems:"center"}},[(0,k.renderIcon)(F),"\xA0",K.name,...V===W.length-1?[]:[(0,k.renderIcon)(y.Codicon.chevronRight)]]).root;M.push(q),q.onclick=()=>{this._revealModifiedHiddenLine(K.startLineNumber)}}}}(0,L.reset)(this._nodes.others,...M)}))}}}),define(se[43],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ILanguageService=void 0,e.ILanguageService=(0,L.createDecorator)("languageService")}),define(se[121],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IEditorWorkerService=void 0,e.IEditorWorkerService=(0,L.createDecorator)("editorWorkerService")}),define(se[18],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ILanguageFeaturesService=void 0,e.ILanguageFeaturesService=(0,L.createDecorator)("ILanguageFeaturesService")}),define(se[763],oe([1,0,611,18,45]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguageFeaturesService=void 0;class E{constructor(){this.referenceProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.renameProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.codeActionProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.definitionProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.typeDefinitionProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.declarationProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.implementationProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.documentSymbolProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.inlayHintsProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.colorProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.codeLensProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.documentFormattingEditProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.documentRangeFormattingEditProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.onTypeFormattingEditProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.signatureHelpProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.hoverProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.documentHighlightProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.multiDocumentHighlightProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.selectionRangeProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.foldingRangeProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.linkProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.inlineCompletionsProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.completionProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.linkedEditingRangeProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.documentRangeSemanticTokensProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.documentSemanticTokensProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.documentOnDropEditProvider=new L.LanguageFeatureRegistry(this._score.bind(this)),this.documentPasteEditProvider=new L.LanguageFeatureRegistry(this._score.bind(this))}_score(p){var _;return(_=this._notebookTypeResolver)===null||_===void 0?void 0:_.call(this,p)}}e.LanguageFeaturesService=E,(0,y.registerSingleton)(k.ILanguageFeaturesService,E,1)}),define(se[237],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IMarkerDecorationsService=void 0,e.IMarkerDecorationsService=(0,L.createDecorator)("markerDecorationsService")}),define(se[51],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IModelService=void 0,e.IModelService=(0,L.createDecorator)("modelService")}),define(se[68],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITextModelService=void 0,e.ITextModelService=(0,L.createDecorator)("textModelService")}),define(se[238],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ISemanticTokensStylingService=void 0,e.ISemanticTokensStylingService=(0,L.createDecorator)("semanticTokensStylingService")}),define(se[189],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITextResourcePropertiesService=e.ITextResourceConfigurationService=void 0,e.ITextResourceConfigurationService=(0,L.createDecorator)("textResourceConfigurationService"),e.ITextResourcePropertiesService=(0,L.createDecorator)("textResourcePropertiesService")}),define(se[764],oe([1,0,45,8,295]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITreeViewsDnDService=void 0,e.ITreeViewsDnDService=(0,k.createDecorator)("treeViewsDndService"),(0,L.registerSingleton)(e.ITreeViewsDnDService,y.TreeViewsDnDService,1)}),define(se[239],oe([1,0,136,117]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.sortEditsByYieldTo=e.createCombinedWorkspaceEdit=void 0;function y(S,p,_){var v,b,a,i;return(typeof _.insertText=="string"?_.insertText==="":_.insertText.snippet==="")?{edits:(b=(v=_.additionalEdit)===null||v===void 0?void 0:v.edits)!==null&&b!==void 0?b:[]}:{edits:[...p.map(n=>new L.ResourceTextEdit(S,{range:n,text:typeof _.insertText=="string"?k.SnippetParser.escape(_.insertText)+"$0":_.insertText.snippet,insertAsSnippet:!0})),...(i=(a=_.additionalEdit)===null||a===void 0?void 0:a.edits)!==null&&i!==void 0?i:[]]}}e.createCombinedWorkspaceEdit=y;function E(S){var p;function _(n,t){return"providerId"in n&&n.providerId===t.providerId||"mimeType"in n&&n.mimeType===t.handledMimeType}const v=new Map;for(const n of S)for(const t of(p=n.yieldTo)!==null&&p!==void 0?p:[])for(const r of S)if(r!==n&&_(t,r)){let u=v.get(n);u||(u=[],v.set(n,u)),u.push(r)}if(!v.size)return Array.from(S);const b=new Set,a=[];function i(n){if(!n.length)return[];const t=n[0];if(a.includes(t))return console.warn(`Yield to cycle detected for ${t.providerId}`),n;if(b.has(t))return i(n.slice(1));let r=[];const u=v.get(t);return u&&(a.push(t),r=i(u),a.pop()),b.add(t),[...r,t,...i(n.slice(1))]}return i(Array.from(S))}e.sortEditsByYieldTo=E}),define(se[765],oe([1,0,93,6,2,35,11,72,36,10,5,102,43,41,94,155,120,217,156,467]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GhostTextWidget=e.GHOST_TEXT_DESCRIPTION=void 0,e.GHOST_TEXT_DESCRIPTION="ghost-text";let d=class extends y.Disposable{constructor(h,m,C){super(),this.editor=h,this.model=m,this.languageService=C,this.isDisposed=(0,E.observableValue)(this,!1),this.currentTextModel=(0,E.observableFromEvent)(this.editor.onDidChangeModel,()=>this.editor.getModel()),this.uiState=(0,E.derived)(this,w=>{if(this.isDisposed.read(w))return;const D=this.currentTextModel.read(w);if(D!==this.model.targetTextModel.read(w))return;const I=this.model.ghostText.read(w);if(!I)return;const T=I instanceof f.GhostTextReplacement?I.columnRange:void 0,A=[],P=[];function N(B,W){if(P.length>0){const V=P[P.length-1];W&&V.decorations.push(new r.LineDecoration(V.content.length+1,V.content.length+1+B[0].length,W,0)),V.content+=B[0],B=B.slice(1)}for(const V of B)P.push({content:V,decorations:W?[new r.LineDecoration(1,V.length+1,W,0)]:[]})}const M=D.getLineContent(I.lineNumber);let R,x=0;for(const B of I.parts){let W=B.lines;R===void 0?(A.push({column:B.column,text:W[0],preview:B.preview}),W=W.slice(1)):N([M.substring(x,B.column-1)],void 0),W.length>0&&(N(W,e.GHOST_TEXT_DESCRIPTION),R===void 0&&B.column<=M.length&&(R=B.column)),x=B.column-1}R!==void 0&&N([M.substring(x)],void 0);const O=R!==void 0?new c.ColumnRange(R,M.length+1):void 0;return{replacedRange:T,inlineTexts:A,additionalLines:P,hiddenRange:O,lineNumber:I.lineNumber,additionalReservedLineCount:this.model.minReservedLineCount.read(w),targetTextModel:D}}),this.decorations=(0,E.derived)(this,w=>{const D=this.uiState.read(w);if(!D)return[];const I=[];D.replacedRange&&I.push({range:D.replacedRange.toRange(D.lineNumber),options:{inlineClassName:"inline-completion-text-to-replace",description:"GhostTextReplacement"}}),D.hiddenRange&&I.push({range:D.hiddenRange.toRange(D.lineNumber),options:{inlineClassName:"ghost-text-hidden",description:"ghost-text-hidden"}});for(const T of D.inlineTexts)I.push({range:b.Range.fromPositions(new v.Position(D.lineNumber,T.column)),options:{description:e.GHOST_TEXT_DESCRIPTION,after:{content:T.text,inlineClassName:T.preview?"ghost-text-decoration-preview":"ghost-text-decoration",cursorStops:n.InjectedTextCursorStops.Left},showIfCollapsed:!0}});return I}),this.additionalLinesWidget=this._register(new s(this.editor,this.languageService.languageIdCodec,(0,E.derived)(w=>{const D=this.uiState.read(w);return D?{lineNumber:D.lineNumber,additionalLines:D.additionalLines,minReservedLineCount:D.additionalReservedLineCount,targetTextModel:D.targetTextModel}:void 0}))),this._register((0,y.toDisposable)(()=>{this.isDisposed.set(!0,void 0)})),this._register((0,c.applyObservableDecorations)(this.editor,this.decorations))}ownsViewZone(h){return this.additionalLinesWidget.viewZoneId===h}};e.GhostTextWidget=d,e.GhostTextWidget=d=ke([ge(2,i.ILanguageService)],d);class s extends y.Disposable{get viewZoneId(){return this._viewZoneId}constructor(h,m,C){super(),this.editor=h,this.languageIdCodec=m,this.lines=C,this._viewZoneId=void 0,this.editorOptionsChanged=(0,E.observableSignalFromEvent)("editorOptionChanged",k.Event.filter(this.editor.onDidChangeConfiguration,w=>w.hasChanged(33)||w.hasChanged(116)||w.hasChanged(98)||w.hasChanged(93)||w.hasChanged(51)||w.hasChanged(50)||w.hasChanged(66))),this._register((0,E.autorun)(w=>{const D=this.lines.read(w);this.editorOptionsChanged.read(w),D?this.updateLines(D.lineNumber,D.additionalLines,D.minReservedLineCount):this.clear()}))}dispose(){super.dispose(),this.clear()}clear(){this.editor.changeViewZones(h=>{this._viewZoneId&&(h.removeZone(this._viewZoneId),this._viewZoneId=void 0)})}updateLines(h,m,C){const w=this.editor.getModel();if(!w)return;const{tabSize:D}=w.getOptions();this.editor.changeViewZones(I=>{this._viewZoneId&&(I.removeZone(this._viewZoneId),this._viewZoneId=void 0);const T=Math.max(m.length,C);if(T>0){const A=document.createElement("div");l(A,D,m,this.editor.getOptions(),this.languageIdCodec),this._viewZoneId=I.addZone({afterLineNumber:h,heightInLines:T,domNode:A,afterColumnAffinity:1})}})}}function l(g,h,m,C,w){const D=C.get(33),I=C.get(116),T="none",A=C.get(93),P=C.get(51),N=C.get(50),M=C.get(66),R=new a.StringBuilder(1e4);R.appendString('<div class="suggest-preview-text">');for(let B=0,W=m.length;B<W;B++){const V=m[B],K=V.content;R.appendString('<div class="view-line'),R.appendString('" style="top:'),R.appendString(String(B*M)),R.appendString('px;width:1000000px;">');const F=S.isBasicASCII(K),q=S.containsRTL(K),ie=t.LineTokens.createEmpty(K,w);(0,u.renderViewLine)(new u.RenderLineInput(N.isMonospace&&!D,N.canUseHalfwidthRightwardsArrow,K,!1,F,q,0,ie,V.decorations,h,0,N.spaceWidth,N.middotWidth,N.wsmiddotWidth,I,T,A,P!==_.EditorFontLigatures.OFF,null),R),R.appendString("</div>")}R.appendString("</div>"),(0,p.applyFontInfo)(g,N);const x=R.build(),O=o?o.createHTML(x):x;g.innerHTML=O}const o=(0,L.createTrustedTypesPolicy)("editorGhostText",{createHTML:g=>g})}),define(se[137],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IStandaloneThemeService=void 0,e.IStandaloneThemeService=(0,L.createDecorator)("themeService")}),define(se[122],oe([1,0,8,736]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AudioCue=e.SoundSource=e.Sound=e.IAudioCueService=void 0,e.IAudioCueService=(0,L.createDecorator)("audioCue");class y{static register(_){return new y(_.fileName)}constructor(_){this.fileName=_}}e.Sound=y,y.error=y.register({fileName:"error.mp3"}),y.warning=y.register({fileName:"warning.mp3"}),y.foldedArea=y.register({fileName:"foldedAreas.mp3"}),y.break=y.register({fileName:"break.mp3"}),y.quickFixes=y.register({fileName:"quickFixes.mp3"}),y.taskCompleted=y.register({fileName:"taskCompleted.mp3"}),y.taskFailed=y.register({fileName:"taskFailed.mp3"}),y.terminalBell=y.register({fileName:"terminalBell.mp3"}),y.diffLineInserted=y.register({fileName:"diffLineInserted.mp3"}),y.diffLineDeleted=y.register({fileName:"diffLineDeleted.mp3"}),y.diffLineModified=y.register({fileName:"diffLineModified.mp3"}),y.chatRequestSent=y.register({fileName:"chatRequestSent.mp3"}),y.chatResponsePending=y.register({fileName:"chatResponsePending.mp3"}),y.chatResponseReceived1=y.register({fileName:"chatResponseReceived1.mp3"}),y.chatResponseReceived2=y.register({fileName:"chatResponseReceived2.mp3"}),y.chatResponseReceived3=y.register({fileName:"chatResponseReceived3.mp3"}),y.chatResponseReceived4=y.register({fileName:"chatResponseReceived4.mp3"}),y.clear=y.register({fileName:"clear.mp3"}),y.save=y.register({fileName:"save.mp3"}),y.format=y.register({fileName:"format.mp3"});class E{constructor(_){this.randomOneOf=_}}e.SoundSource=E;class S{static register(_){const v=new E("randomOneOf"in _.sound?_.sound.randomOneOf:[_.sound]),b=new S(v,_.name,_.settingsKey,_.alertSettingsKey,_.alertMessage);return S._audioCues.add(b),b}constructor(_,v,b,a,i){this.sound=_,this.name=v,this.settingsKey=b,this.alertSettingsKey=a,this.alertMessage=i}}e.AudioCue=S,S._audioCues=new Set,S.error=S.register({name:(0,k.localize)(0,null),sound:y.error,settingsKey:"audioCues.lineHasError",alertSettingsKey:"accessibility.alert.error",alertMessage:(0,k.localize)(1,null)}),S.warning=S.register({name:(0,k.localize)(2,null),sound:y.warning,settingsKey:"audioCues.lineHasWarning",alertSettingsKey:"accessibility.alert.warning",alertMessage:(0,k.localize)(3,null)}),S.foldedArea=S.register({name:(0,k.localize)(4,null),sound:y.foldedArea,settingsKey:"audioCues.lineHasFoldedArea",alertSettingsKey:"accessibility.alert.foldedArea",alertMessage:(0,k.localize)(5,null)}),S.break=S.register({name:(0,k.localize)(6,null),sound:y.break,settingsKey:"audioCues.lineHasBreakpoint",alertSettingsKey:"accessibility.alert.breakpoint",alertMessage:(0,k.localize)(7,null)}),S.inlineSuggestion=S.register({name:(0,k.localize)(8,null),sound:y.quickFixes,settingsKey:"audioCues.lineHasInlineSuggestion"}),S.terminalQuickFix=S.register({name:(0,k.localize)(9,null),sound:y.quickFixes,settingsKey:"audioCues.terminalQuickFix",alertSettingsKey:"accessibility.alert.terminalQuickFix",alertMessage:(0,k.localize)(10,null)}),S.onDebugBreak=S.register({name:(0,k.localize)(11,null),sound:y.break,settingsKey:"audioCues.onDebugBreak",alertSettingsKey:"accessibility.alert.onDebugBreak",alertMessage:(0,k.localize)(12,null)}),S.noInlayHints=S.register({name:(0,k.localize)(13,null),sound:y.error,settingsKey:"audioCues.noInlayHints",alertSettingsKey:"accessibility.alert.noInlayHints",alertMessage:(0,k.localize)(14,null)}),S.taskCompleted=S.register({name:(0,k.localize)(15,null),sound:y.taskCompleted,settingsKey:"audioCues.taskCompleted",alertSettingsKey:"accessibility.alert.taskCompleted",alertMessage:(0,k.localize)(16,null)}),S.taskFailed=S.register({name:(0,k.localize)(17,null),sound:y.taskFailed,settingsKey:"audioCues.taskFailed",alertSettingsKey:"accessibility.alert.taskFailed",alertMessage:(0,k.localize)(18,null)}),S.terminalCommandFailed=S.register({name:(0,k.localize)(19,null),sound:y.error,settingsKey:"audioCues.terminalCommandFailed",alertSettingsKey:"accessibility.alert.terminalCommandFailed",alertMessage:(0,k.localize)(20,null)}),S.terminalBell=S.register({name:(0,k.localize)(21,null),sound:y.terminalBell,settingsKey:"audioCues.terminalBell",alertSettingsKey:"accessibility.alert.terminalBell",alertMessage:(0,k.localize)(22,null)}),S.notebookCellCompleted=S.register({name:(0,k.localize)(23,null),sound:y.taskCompleted,settingsKey:"audioCues.notebookCellCompleted",alertSettingsKey:"accessibility.alert.notebookCellCompleted",alertMessage:(0,k.localize)(24,null)}),S.notebookCellFailed=S.register({name:(0,k.localize)(25,null),sound:y.taskFailed,settingsKey:"audioCues.notebookCellFailed",alertSettingsKey:"accessibility.alert.notebookCellFailed",alertMessage:(0,k.localize)(26,null)}),S.diffLineInserted=S.register({name:(0,k.localize)(27,null),sound:y.diffLineInserted,settingsKey:"audioCues.diffLineInserted"}),S.diffLineDeleted=S.register({name:(0,k.localize)(28,null),sound:y.diffLineDeleted,settingsKey:"audioCues.diffLineDeleted"}),S.diffLineModified=S.register({name:(0,k.localize)(29,null),sound:y.diffLineModified,settingsKey:"audioCues.diffLineModified"}),S.chatRequestSent=S.register({name:(0,k.localize)(30,null),sound:y.chatRequestSent,settingsKey:"audioCues.chatRequestSent",alertSettingsKey:"accessibility.alert.chatRequestSent",alertMessage:(0,k.localize)(31,null)}),S.chatResponseReceived=S.register({name:(0,k.localize)(32,null),settingsKey:"audioCues.chatResponseReceived",sound:{randomOneOf:[y.chatResponseReceived1,y.chatResponseReceived2,y.chatResponseReceived3,y.chatResponseReceived4]}}),S.chatResponsePending=S.register({name:(0,k.localize)(33,null),sound:y.chatResponsePending,settingsKey:"audioCues.chatResponsePending",alertSettingsKey:"accessibility.alert.chatResponsePending",alertMessage:(0,k.localize)(34,null)}),S.clear=S.register({name:(0,k.localize)(35,null),sound:y.clear,settingsKey:"audioCues.clear",alertSettingsKey:"accessibility.alert.clear",alertMessage:(0,k.localize)(36,null)}),S.save=S.register({name:(0,k.localize)(37,null),sound:y.save,settingsKey:"audioCues.save",alertSettingsKey:"accessibility.alert.save",alertMessage:(0,k.localize)(38,null)}),S.format=S.register({name:(0,k.localize)(39,null),sound:y.format,settingsKey:"audioCues.format",alertSettingsKey:"accessibility.alert.format",alertMessage:(0,k.localize)(40,null)})}),define(se[103],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IClipboardService=void 0,e.IClipboardService=(0,L.createDecorator)("clipboardService")}),define(se[25],oe([1,0,6,52,2,66,20,8]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CommandsRegistry=e.ICommandService=void 0,e.ICommandService=(0,p.createDecorator)("commandService"),e.CommandsRegistry=new class{constructor(){this._commands=new Map,this._onDidRegisterCommand=new L.Emitter,this.onDidRegisterCommand=this._onDidRegisterCommand.event}registerCommand(_,v){if(!_)throw new Error("invalid command");if(typeof _=="string"){if(!v)throw new Error("invalid command");return this.registerCommand({id:_,handler:v})}if(_.metadata&&Array.isArray(_.metadata.args)){const t=[];for(const u of _.metadata.args)t.push(u.constraint);const r=_.handler;_.handler=function(u,...f){return(0,S.validateConstraints)(f,t),r(u,...f)}}const{id:b}=_;let a=this._commands.get(b);a||(a=new E.LinkedList,this._commands.set(b,a));const i=a.unshift(_),n=(0,y.toDisposable)(()=>{i();const t=this._commands.get(b);t?.isEmpty()&&this._commands.delete(b)});return this._onDidRegisterCommand.fire(b),n}registerCommandAlias(_,v){return e.CommandsRegistry.registerCommand(_,(b,...a)=>b.get(e.ICommandService).executeCommand(v,...a))}getCommand(_){const v=this._commands.get(_);if(!(!v||v.isEmpty()))return k.Iterable.first(v)}getCommands(){const _=new Map;for(const v of this._commands.keys()){const b=this.getCommand(v);b&&_.set(v,b)}return _}},e.CommandsRegistry.registerCommand("noop",()=>{})}),define(se[343],oe([1,0,19,12,2,20,22,51,25,18]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getCodeLensModel=e.CodeLensModel=void 0;class b{constructor(){this.lenses=[],this._disposables=new y.DisposableStore}dispose(){this._disposables.dispose()}get isDisposed(){return this._disposables.isDisposed}add(n,t){this._disposables.add(n);for(const r of n.lenses)this.lenses.push({symbol:r,provider:t})}}e.CodeLensModel=b;async function a(i,n,t){const r=i.ordered(n),u=new Map,f=new b,c=r.map(async(d,s)=>{u.set(d,s);try{const l=await Promise.resolve(d.provideCodeLenses(n,t));l&&f.add(l,d)}catch(l){(0,k.onUnexpectedExternalError)(l)}});return await Promise.all(c),f.lenses=f.lenses.sort((d,s)=>d.symbol.range.startLineNumber<s.symbol.range.startLineNumber?-1:d.symbol.range.startLineNumber>s.symbol.range.startLineNumber?1:u.get(d.provider)<u.get(s.provider)?-1:u.get(d.provider)>u.get(s.provider)?1:d.symbol.range.startColumn<s.symbol.range.startColumn?-1:d.symbol.range.startColumn>s.symbol.range.startColumn?1:0),f}e.getCodeLensModel=a,_.CommandsRegistry.registerCommand("_executeCodeLensProvider",function(i,...n){let[t,r]=n;(0,E.assertType)(S.URI.isUri(t)),(0,E.assertType)(typeof r=="number"||!r);const{codeLensProvider:u}=i.get(v.ILanguageFeaturesService),f=i.get(p.IModelService).getModel(t);if(!f)throw(0,k.illegalArgument)();const c=[],d=new y.DisposableStore;return a(u,f,L.CancellationToken.None).then(s=>{d.add(s);const l=[];for(const o of s.lenses)r==null||o.symbol.command?c.push(o.symbol):r-- >0&&o.provider.resolveCodeLens&&l.push(Promise.resolve(o.provider.resolveCodeLens(f,o.symbol,L.CancellationToken.None)).then(g=>c.push(g||o.symbol)));return Promise.all(l)}).then(()=>c).finally(()=>{setTimeout(()=>d.dispose(),100)})})}),define(se[766],oe([1,0,13,19,12,2,20,22,5,51,25,18]),function(te,e,L,k,y,E,S,p,_,v,b,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getLinks=e.LinksList=e.Link=void 0;class i{constructor(u,f){this._link=u,this._provider=f}toJSON(){return{range:this.range,url:this.url,tooltip:this.tooltip}}get range(){return this._link.range}get url(){return this._link.url}get tooltip(){return this._link.tooltip}async resolve(u){return this._link.url?this._link.url:typeof this._provider.resolveLink=="function"?Promise.resolve(this._provider.resolveLink(this._link,u)).then(f=>(this._link=f||this._link,this._link.url?this.resolve(u):Promise.reject(new Error("missing")))):Promise.reject(new Error("missing"))}}e.Link=i;class n{constructor(u){this._disposables=new E.DisposableStore;let f=[];for(const[c,d]of u){const s=c.links.map(l=>new i(l,d));f=n._union(f,s),(0,E.isDisposable)(c)&&this._disposables.add(c)}this.links=f}dispose(){this._disposables.dispose(),this.links.length=0}static _union(u,f){const c=[];let d,s,l,o;for(d=0,l=0,s=u.length,o=f.length;d<s&&l<o;){const g=u[d],h=f[l];if(_.Range.areIntersectingOrTouching(g.range,h.range)){d++;continue}_.Range.compareRangesUsingStarts(g.range,h.range)<0?(c.push(g),d++):(c.push(h),l++)}for(;d<s;d++)c.push(u[d]);for(;l<o;l++)c.push(f[l]);return c}}e.LinksList=n;function t(r,u,f){const c=[],d=r.ordered(u).reverse().map((s,l)=>Promise.resolve(s.provideLinks(u,f)).then(o=>{o&&(c[l]=[o,s])},y.onUnexpectedExternalError));return Promise.all(d).then(()=>{const s=new n((0,L.coalesce)(c));return f.isCancellationRequested?(s.dispose(),new n([])):s})}e.getLinks=t,b.CommandsRegistry.registerCommand("_executeLinkProvider",async(r,...u)=>{let[f,c]=u;(0,S.assertType)(f instanceof p.URI),typeof c!="number"&&(c=0);const{linkProvider:d}=r.get(a.ILanguageFeaturesService),s=r.get(v.IModelService).getModel(f);if(!s)return[];const l=await t(d,s,k.CancellationToken.None);if(!l)return[];for(let g=0;g<Math.min(c,l.links.length);g++)await l.links[g].resolve(k.CancellationToken.None);const o=l.links.slice(0);return l.dispose(),o})}),define(se[344],oe([1,0,19,12,22,51,25,20,615,5,18]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getDocumentRangeSemanticTokens=e.hasDocumentRangeSemanticTokensProvider=e.getDocumentSemanticTokens=e.hasDocumentSemanticTokensProvider=e.DocumentSemanticTokensResult=e.isSemanticTokensEdits=e.isSemanticTokens=void 0;function a(o){return o&&!!o.data}e.isSemanticTokens=a;function i(o){return o&&Array.isArray(o.edits)}e.isSemanticTokensEdits=i;class n{constructor(g,h,m){this.provider=g,this.tokens=h,this.error=m}}e.DocumentSemanticTokensResult=n;function t(o,g){return o.has(g)}e.hasDocumentSemanticTokensProvider=t;function r(o,g){const h=o.orderedGroups(g);return h.length>0?h[0]:[]}async function u(o,g,h,m,C){const w=r(o,g),D=await Promise.all(w.map(async I=>{let T,A=null;try{T=await I.provideDocumentSemanticTokens(g,I===h?m:null,C)}catch(P){A=P,T=null}return(!T||!a(T)&&!i(T))&&(T=null),new n(I,T,A)}));for(const I of D){if(I.error)throw I.error;if(I.tokens)return I}return D.length>0?D[0]:null}e.getDocumentSemanticTokens=u;function f(o,g){const h=o.orderedGroups(g);return h.length>0?h[0]:null}class c{constructor(g,h){this.provider=g,this.tokens=h}}function d(o,g){return o.has(g)}e.hasDocumentRangeSemanticTokensProvider=d;function s(o,g){const h=o.orderedGroups(g);return h.length>0?h[0]:[]}async function l(o,g,h,m){const C=s(o,g),w=await Promise.all(C.map(async D=>{let I;try{I=await D.provideDocumentRangeSemanticTokens(g,h,m)}catch(T){(0,k.onUnexpectedExternalError)(T),I=null}return(!I||!a(I))&&(I=null),new c(D,I)}));for(const D of w)if(D.tokens)return D;return w.length>0?w[0]:null}e.getDocumentRangeSemanticTokens=l,S.CommandsRegistry.registerCommand("_provideDocumentSemanticTokensLegend",async(o,...g)=>{const[h]=g;(0,p.assertType)(h instanceof y.URI);const m=o.get(E.IModelService).getModel(h);if(!m)return;const{documentSemanticTokensProvider:C}=o.get(b.ILanguageFeaturesService),w=f(C,m);return w?w[0].getLegend():o.get(S.ICommandService).executeCommand("_provideDocumentRangeSemanticTokensLegend",h)}),S.CommandsRegistry.registerCommand("_provideDocumentSemanticTokens",async(o,...g)=>{const[h]=g;(0,p.assertType)(h instanceof y.URI);const m=o.get(E.IModelService).getModel(h);if(!m)return;const{documentSemanticTokensProvider:C}=o.get(b.ILanguageFeaturesService);if(!t(C,m))return o.get(S.ICommandService).executeCommand("_provideDocumentRangeSemanticTokens",h,m.getFullModelRange());const w=await u(C,m,null,null,L.CancellationToken.None);if(!w)return;const{provider:D,tokens:I}=w;if(!I||!a(I))return;const T=(0,_.encodeSemanticTokensDto)({id:0,type:"full",data:I.data});return I.resultId&&D.releaseDocumentSemanticTokens(I.resultId),T}),S.CommandsRegistry.registerCommand("_provideDocumentRangeSemanticTokensLegend",async(o,...g)=>{const[h,m]=g;(0,p.assertType)(h instanceof y.URI);const C=o.get(E.IModelService).getModel(h);if(!C)return;const{documentRangeSemanticTokensProvider:w}=o.get(b.ILanguageFeaturesService),D=s(w,C);if(D.length===0)return;if(D.length===1)return D[0].getLegend();if(!m||!v.Range.isIRange(m))return console.warn("provideDocumentRangeSemanticTokensLegend might be out-of-sync with provideDocumentRangeSemanticTokens unless a range argument is passed in"),D[0].getLegend();const I=await l(w,C,v.Range.lift(m),L.CancellationToken.None);if(I)return I.provider.getLegend()}),S.CommandsRegistry.registerCommand("_provideDocumentRangeSemanticTokens",async(o,...g)=>{const[h,m]=g;(0,p.assertType)(h instanceof y.URI),(0,p.assertType)(v.Range.isIRange(m));const C=o.get(E.IModelService).getModel(h);if(!C)return;const{documentRangeSemanticTokensProvider:w}=o.get(b.ILanguageFeaturesService),D=await l(w,C,v.Range.lift(m),L.CancellationToken.None);if(!(!D||!D.tokens))return(0,_.encodeSemanticTokensDto)({id:0,type:"full",data:D.tokens.data})})}),define(se[27],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getLanguageTagSettingPlainKey=e.getConfigurationValue=e.removeFromValueTree=e.addToValueTree=e.toValuesTree=e.IConfigurationService=void 0,e.IConfigurationService=(0,L.createDecorator)("configurationService");function k(v,b){const a=Object.create(null);for(const i in v)y(a,i,v[i],b);return a}e.toValuesTree=k;function y(v,b,a,i){const n=b.split("."),t=n.pop();let r=v;for(let u=0;u<n.length;u++){const f=n[u];let c=r[f];switch(typeof c){case"undefined":c=r[f]=Object.create(null);break;case"object":break;default:i(`Ignoring ${b} as ${n.slice(0,u+1).join(".")} is ${JSON.stringify(c)}`);return}r=c}if(typeof r=="object"&&r!==null)try{r[t]=a}catch{i(`Ignoring ${b} as ${n.join(".")} is ${JSON.stringify(r)}`)}else i(`Ignoring ${b} as ${n.join(".")} is ${JSON.stringify(r)}`)}e.addToValueTree=y;function E(v,b){const a=b.split(".");S(v,a)}e.removeFromValueTree=E;function S(v,b){const a=b.shift();if(b.length===0){delete v[a];return}if(Object.keys(v).indexOf(a)!==-1){const i=v[a];typeof i=="object"&&!Array.isArray(i)&&(S(i,b),Object.keys(i).length===0&&delete v[a])}}function p(v,b,a){function i(r,u){let f=r;for(const c of u){if(typeof f!="object"||f===null)return;f=f[c]}return f}const n=b.split("."),t=i(v,n);return typeof t>"u"?a:t}e.getConfigurationValue=p;function _(v){return v.replace(/[\[\]]/g,"")}e.getLanguageTagSettingPlainKey=_}),define(se[345],oe([1,0,2,31,160,313,27]),function(te,e,L,k,y,E,S){"use strict";var p;Object.defineProperty(e,"__esModule",{value:!0}),e.MonarchTokenizer=void 0;const _=5;class v{static create(d,s){return this._INSTANCE.create(d,s)}constructor(d){this._maxCacheDepth=d,this._entries=Object.create(null)}create(d,s){if(d!==null&&d.depth>=this._maxCacheDepth)return new b(d,s);let l=b.getStackElementId(d);l.length>0&&(l+="|"),l+=s;let o=this._entries[l];return o||(o=new b(d,s),this._entries[l]=o,o)}}v._INSTANCE=new v(_);class b{constructor(d,s){this.parent=d,this.state=s,this.depth=(this.parent?this.parent.depth:0)+1}static getStackElementId(d){let s="";for(;d!==null;)s.length>0&&(s+="|"),s+=d.state,d=d.parent;return s}static _equals(d,s){for(;d!==null&&s!==null;){if(d===s)return!0;if(d.state!==s.state)return!1;d=d.parent,s=s.parent}return d===null&&s===null}equals(d){return b._equals(this,d)}push(d){return v.create(this,d)}pop(){return this.parent}popall(){let d=this;for(;d.parent;)d=d.parent;return d}switchTo(d){return v.create(this.parent,d)}}class a{constructor(d,s){this.languageId=d,this.state=s}equals(d){return this.languageId===d.languageId&&this.state.equals(d.state)}clone(){return this.state.clone()===this.state?this:new a(this.languageId,this.state)}}class i{static create(d,s){return this._INSTANCE.create(d,s)}constructor(d){this._maxCacheDepth=d,this._entries=Object.create(null)}create(d,s){if(s!==null)return new n(d,s);if(d!==null&&d.depth>=this._maxCacheDepth)return new n(d,s);const l=b.getStackElementId(d);let o=this._entries[l];return o||(o=new n(d,null),this._entries[l]=o,o)}}i._INSTANCE=new i(_);class n{constructor(d,s){this.stack=d,this.embeddedLanguageData=s}clone(){return(this.embeddedLanguageData?this.embeddedLanguageData.clone():null)===this.embeddedLanguageData?this:i.create(this.stack,this.embeddedLanguageData)}equals(d){return!(d instanceof n)||!this.stack.equals(d.stack)?!1:this.embeddedLanguageData===null&&d.embeddedLanguageData===null?!0:this.embeddedLanguageData===null||d.embeddedLanguageData===null?!1:this.embeddedLanguageData.equals(d.embeddedLanguageData)}}class t{constructor(){this._tokens=[],this._languageId=null,this._lastTokenType=null,this._lastTokenLanguage=null}enterLanguage(d){this._languageId=d}emit(d,s){this._lastTokenType===s&&this._lastTokenLanguage===this._languageId||(this._lastTokenType=s,this._lastTokenLanguage=this._languageId,this._tokens.push(new k.Token(d,s,this._languageId)))}nestedLanguageTokenize(d,s,l,o){const g=l.languageId,h=l.state,m=k.TokenizationRegistry.get(g);if(!m)return this.enterLanguage(g),this.emit(o,""),h;const C=m.tokenize(d,s,h);if(o!==0)for(const w of C.tokens)this._tokens.push(new k.Token(w.offset+o,w.type,w.language));else this._tokens=this._tokens.concat(C.tokens);return this._lastTokenType=null,this._lastTokenLanguage=null,this._languageId=null,C.endState}finalize(d){return new k.TokenizationResult(this._tokens,d)}}class r{constructor(d,s){this._languageService=d,this._theme=s,this._prependTokens=null,this._tokens=[],this._currentLanguageId=0,this._lastTokenMetadata=0}enterLanguage(d){this._currentLanguageId=this._languageService.languageIdCodec.encodeLanguageId(d)}emit(d,s){const l=this._theme.match(this._currentLanguageId,s)|1024;this._lastTokenMetadata!==l&&(this._lastTokenMetadata=l,this._tokens.push(d),this._tokens.push(l))}static _merge(d,s,l){const o=d!==null?d.length:0,g=s.length,h=l!==null?l.length:0;if(o===0&&g===0&&h===0)return new Uint32Array(0);if(o===0&&g===0)return l;if(g===0&&h===0)return d;const m=new Uint32Array(o+g+h);d!==null&&m.set(d);for(let C=0;C<g;C++)m[o+C]=s[C];return l!==null&&m.set(l,o+g),m}nestedLanguageTokenize(d,s,l,o){const g=l.languageId,h=l.state,m=k.TokenizationRegistry.get(g);if(!m)return this.enterLanguage(g),this.emit(o,""),h;const C=m.tokenizeEncoded(d,s,h);if(o!==0)for(let w=0,D=C.tokens.length;w<D;w+=2)C.tokens[w]+=o;return this._prependTokens=r._merge(this._prependTokens,this._tokens,C.tokens),this._tokens=[],this._currentLanguageId=0,this._lastTokenMetadata=0,C.endState}finalize(d){return new k.EncodedTokenizationResult(r._merge(this._prependTokens,this._tokens,null),d)}}let u=p=class extends L.Disposable{constructor(d,s,l,o,g){super(),this._configurationService=g,this._languageService=d,this._standaloneThemeService=s,this._languageId=l,this._lexer=o,this._embeddedLanguages=Object.create(null),this.embeddedLoaded=Promise.resolve(void 0);let h=!1;this._register(k.TokenizationRegistry.onDidChange(m=>{if(h)return;let C=!1;for(let w=0,D=m.changedLanguages.length;w<D;w++){const I=m.changedLanguages[w];if(this._embeddedLanguages[I]){C=!0;break}}C&&(h=!0,k.TokenizationRegistry.handleChange([this._languageId]),h=!1)})),this._maxTokenizationLineLength=this._configurationService.getValue("editor.maxTokenizationLineLength",{overrideIdentifier:this._languageId}),this._register(this._configurationService.onDidChangeConfiguration(m=>{m.affectsConfiguration("editor.maxTokenizationLineLength")&&(this._maxTokenizationLineLength=this._configurationService.getValue("editor.maxTokenizationLineLength",{overrideIdentifier:this._languageId}))}))}getLoadStatus(){const d=[];for(const s in this._embeddedLanguages){const l=k.TokenizationRegistry.get(s);if(l){if(l instanceof p){const o=l.getLoadStatus();o.loaded===!1&&d.push(o.promise)}continue}k.TokenizationRegistry.isResolved(s)||d.push(k.TokenizationRegistry.getOrCreate(s))}return d.length===0?{loaded:!0}:{loaded:!1,promise:Promise.all(d).then(s=>{})}}getInitialState(){const d=v.create(null,this._lexer.start);return i.create(d,null)}tokenize(d,s,l){if(d.length>=this._maxTokenizationLineLength)return(0,y.nullTokenize)(this._languageId,l);const o=new t,g=this._tokenize(d,s,l,o);return o.finalize(g)}tokenizeEncoded(d,s,l){if(d.length>=this._maxTokenizationLineLength)return(0,y.nullTokenizeEncoded)(this._languageService.languageIdCodec.encodeLanguageId(this._languageId),l);const o=new r(this._languageService,this._standaloneThemeService.getColorTheme().tokenTheme),g=this._tokenize(d,s,l,o);return o.finalize(g)}_tokenize(d,s,l,o){return l.embeddedLanguageData?this._nestedTokenize(d,s,l,0,o):this._myTokenize(d,s,l,0,o)}_findLeavingNestedLanguageOffset(d,s){let l=this._lexer.tokenizer[s.stack.state];if(!l&&(l=E.findRules(this._lexer,s.stack.state),!l))throw E.createError(this._lexer,"tokenizer state is not defined: "+s.stack.state);let o=-1,g=!1;for(const h of l){if(!E.isIAction(h.action)||h.action.nextEmbedded!=="@pop")continue;g=!0;let m=h.regex;const C=h.regex.source;if(C.substr(0,4)==="^(?:"&&C.substr(C.length-1,1)===")"){const D=(m.ignoreCase?"i":"")+(m.unicode?"u":"");m=new RegExp(C.substr(4,C.length-5),D)}const w=d.search(m);w===-1||w!==0&&h.matchOnlyAtLineStart||(o===-1||w<o)&&(o=w)}if(!g)throw E.createError(this._lexer,'no rule containing nextEmbedded: "@pop" in tokenizer embedded state: '+s.stack.state);return o}_nestedTokenize(d,s,l,o,g){const h=this._findLeavingNestedLanguageOffset(d,l);if(h===-1){const w=g.nestedLanguageTokenize(d,s,l.embeddedLanguageData,o);return i.create(l.stack,new a(l.embeddedLanguageData.languageId,w))}const m=d.substring(0,h);m.length>0&&g.nestedLanguageTokenize(m,!1,l.embeddedLanguageData,o);const C=d.substring(h);return this._myTokenize(C,s,l,o+h,g)}_safeRuleName(d){return d?d.name:"(unknown)"}_myTokenize(d,s,l,o,g){g.enterLanguage(this._languageId);const h=d.length,m=s&&this._lexer.includeLF?d+`
+`:d,C=m.length;let w=l.embeddedLanguageData,D=l.stack,I=0,T=null,A=!0;for(;A||I<C;){const P=I,N=D.depth,M=T?T.groups.length:0,R=D.state;let x=null,O=null,B=null,W=null,V=null;if(T){x=T.matches;const q=T.groups.shift();O=q.matched,B=q.action,W=T.rule,T.groups.length===0&&(T=null)}else{if(!A&&I>=C)break;A=!1;let q=this._lexer.tokenizer[R];if(!q&&(q=E.findRules(this._lexer,R),!q))throw E.createError(this._lexer,"tokenizer state is not defined: "+R);const ie=m.substr(I);for(const ae of q)if((I===0||!ae.matchOnlyAtLineStart)&&(x=ie.match(ae.regex),x)){O=x[0],B=ae.action;break}}if(x||(x=[""],O=""),B||(I<C&&(x=[m.charAt(I)],O=x[0]),B=this._lexer.defaultToken),O===null)break;for(I+=O.length;E.isFuzzyAction(B)&&E.isIAction(B)&&B.test;)B=B.test(O,x,R,I===C);let K=null;if(typeof B=="string"||Array.isArray(B))K=B;else if(B.group)K=B.group;else if(B.token!==null&&B.token!==void 0){if(B.tokenSubst?K=E.substituteMatches(this._lexer,B.token,O,x,R):K=B.token,B.nextEmbedded)if(B.nextEmbedded==="@pop"){if(!w)throw E.createError(this._lexer,"cannot pop embedded language if not inside one");w=null}else{if(w)throw E.createError(this._lexer,"cannot enter embedded language from within an embedded language");V=E.substituteMatches(this._lexer,B.nextEmbedded,O,x,R)}if(B.goBack&&(I=Math.max(0,I-B.goBack)),B.switchTo&&typeof B.switchTo=="string"){let q=E.substituteMatches(this._lexer,B.switchTo,O,x,R);if(q[0]==="@"&&(q=q.substr(1)),E.findRules(this._lexer,q))D=D.switchTo(q);else throw E.createError(this._lexer,"trying to switch to a state '"+q+"' that is undefined in rule: "+this._safeRuleName(W))}else{if(B.transform&&typeof B.transform=="function")throw E.createError(this._lexer,"action.transform not supported");if(B.next)if(B.next==="@push"){if(D.depth>=this._lexer.maxStack)throw E.createError(this._lexer,"maximum tokenizer stack size reached: ["+D.state+","+D.parent.state+",...]");D=D.push(R)}else if(B.next==="@pop"){if(D.depth<=1)throw E.createError(this._lexer,"trying to pop an empty stack in rule: "+this._safeRuleName(W));D=D.pop()}else if(B.next==="@popall")D=D.popall();else{let q=E.substituteMatches(this._lexer,B.next,O,x,R);if(q[0]==="@"&&(q=q.substr(1)),E.findRules(this._lexer,q))D=D.push(q);else throw E.createError(this._lexer,"trying to set a next state '"+q+"' that is undefined in rule: "+this._safeRuleName(W))}}B.log&&typeof B.log=="string"&&E.log(this._lexer,this._lexer.languageId+": "+E.substituteMatches(this._lexer,B.log,O,x,R))}if(K===null)throw E.createError(this._lexer,"lexer rule has no well-defined action in rule: "+this._safeRuleName(W));const F=q=>{const ie=this._languageService.getLanguageIdByLanguageName(q)||this._languageService.getLanguageIdByMimeType(q)||q,ae=this._getNestedEmbeddedLanguageData(ie);if(I<C){const ne=d.substr(I);return this._nestedTokenize(ne,s,i.create(D,ae),o+I,g)}else return i.create(D,ae)};if(Array.isArray(K)){if(T&&T.groups.length>0)throw E.createError(this._lexer,"groups cannot be nested: "+this._safeRuleName(W));if(x.length!==K.length+1)throw E.createError(this._lexer,"matched number of groups does not match the number of actions in rule: "+this._safeRuleName(W));let q=0;for(let ie=1;ie<x.length;ie++)q+=x[ie].length;if(q!==O.length)throw E.createError(this._lexer,"with groups, all characters should be matched in consecutive groups in rule: "+this._safeRuleName(W));T={rule:W,matches:x,groups:[]};for(let ie=0;ie<K.length;ie++)T.groups[ie]={action:K[ie],matched:x[ie+1]};I-=O.length;continue}else{if(K==="@rematch"&&(I-=O.length,O="",x=null,K="",V!==null))return F(V);if(O.length===0){if(C===0||N!==D.depth||R!==D.state||(T?T.groups.length:0)!==M)continue;throw E.createError(this._lexer,"no progress in tokenizer in rule: "+this._safeRuleName(W))}let q=null;if(E.isString(K)&&K.indexOf("@brackets")===0){const ie=K.substr(9),ae=f(this._lexer,O);if(!ae)throw E.createError(this._lexer,"@brackets token returned but no bracket defined as: "+O);q=E.sanitize(ae.token+ie)}else{const ie=K===""?"":K+this._lexer.tokenPostfix;q=E.sanitize(ie)}P<h&&g.emit(P+o,q)}if(V!==null)return F(V)}return i.create(D,w)}_getNestedEmbeddedLanguageData(d){if(!this._languageService.isRegisteredLanguageId(d))return new a(d,y.NullState);d!==this._languageId&&(this._languageService.requestBasicLanguageFeatures(d),k.TokenizationRegistry.getOrCreate(d),this._embeddedLanguages[d]=!0);const s=k.TokenizationRegistry.get(d);return s?new a(d,s.getInitialState()):new a(d,y.NullState)}};e.MonarchTokenizer=u,e.MonarchTokenizer=u=p=ke([ge(4,S.IConfigurationService)],u);function f(c,d){if(!d)return null;d=E.fixCase(c,d);const s=c.brackets;for(const l of s){if(l.open===d)return{token:l.token,bracketType:1};if(l.close===d)return{token:l.token,bracketType:-1}}return null}}),define(se[767],oe([1,0,93,11,31,94,120,86,345]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Colorizer=void 0;const v=(0,L.createTrustedTypesPolicy)("standaloneColorizer",{createHTML:t=>t});class b{static colorizeElement(r,u,f,c){c=c||{};const d=c.theme||"vs",s=c.mimeType||f.getAttribute("lang")||f.getAttribute("data-lang");if(!s)return console.error("Mode not detected"),Promise.resolve();const l=u.getLanguageIdByMimeType(s)||s;r.setTheme(d);const o=f.firstChild?f.firstChild.nodeValue:"";f.className+=" "+d;const g=h=>{var m;const C=(m=v?.createHTML(h))!==null&&m!==void 0?m:h;f.innerHTML=C};return this.colorize(u,o||"",l,c).then(g,h=>console.error(h))}static async colorize(r,u,f,c){const d=r.languageIdCodec;let s=4;c&&typeof c.tabSize=="number"&&(s=c.tabSize),k.startsWithUTF8BOM(u)&&(u=u.substr(1));const l=k.splitLines(u);if(!r.isRegisteredLanguageId(f))return i(l,s,d);const o=await y.TokenizationRegistry.getOrCreate(f);return o?a(l,s,o,d):i(l,s,d)}static colorizeLine(r,u,f,c,d=4){const s=p.ViewLineRenderingData.isBasicASCII(r,u),l=p.ViewLineRenderingData.containsRTL(r,s,f);return(0,S.renderViewLine2)(new S.RenderLineInput(!1,!0,r,!1,s,l,0,c,[],d,0,0,0,0,-1,"none",!1,!1,null)).html}static colorizeModelLine(r,u,f=4){const c=r.getLineContent(u);r.tokenization.forceTokenization(u);const s=r.tokenization.getLineTokens(u).inflate();return this.colorizeLine(c,r.mightContainNonBasicASCII(),r.mightContainRTL(),s,f)}}e.Colorizer=b;function a(t,r,u,f){return new Promise((c,d)=>{const s=()=>{const l=n(t,r,u,f);if(u instanceof _.MonarchTokenizer){const o=u.getLoadStatus();if(o.loaded===!1){o.promise.then(s,d);return}}c(l)};s()})}function i(t,r,u){let f=[];const d=new Uint32Array(2);d[0]=0,d[1]=33587200;for(let s=0,l=t.length;s<l;s++){const o=t[s];d[0]=o.length;const g=new E.LineTokens(d,o,u),h=p.ViewLineRenderingData.isBasicASCII(o,!0),m=p.ViewLineRenderingData.containsRTL(o,h,!0),C=(0,S.renderViewLine2)(new S.RenderLineInput(!1,!0,o,!1,h,m,0,g,[],r,0,0,0,0,-1,"none",!1,!1,null));f=f.concat(C.html),f.push("<br/>")}return f.join("")}function n(t,r,u,f){let c=[],d=u.getInitialState();for(let s=0,l=t.length;s<l;s++){const o=t[s],g=u.tokenizeEncoded(o,!0,d);E.LineTokens.convertToEndOffset(g.tokens,o.length);const h=new E.LineTokens(g.tokens,o,f),m=p.ViewLineRenderingData.isBasicASCII(o,!0),C=p.ViewLineRenderingData.containsRTL(o,m,!0),w=(0,S.renderViewLine2)(new S.RenderLineInput(!1,!0,o,!1,m,C,0,h.inflate(),[],r,0,0,0,0,-1,"none",!1,!1,null));c=c.concat(w.html),c.push("<br/>"),d=g.endState}return c.join("")}}),define(se[15],oe([1,0,17,11,758,8,739]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.implies=e.IContextKeyService=e.RawContextKey=e.ContextKeyOrExpr=e.ContextKeyAndExpr=e.ContextKeyNotRegexExpr=e.ContextKeyRegexExpr=e.ContextKeySmallerEqualsExpr=e.ContextKeySmallerExpr=e.ContextKeyGreaterEqualsExpr=e.ContextKeyGreaterExpr=e.ContextKeyNotExpr=e.ContextKeyNotEqualsExpr=e.ContextKeyNotInExpr=e.ContextKeyInExpr=e.ContextKeyEqualsExpr=e.ContextKeyDefinedExpr=e.ContextKeyTrueExpr=e.ContextKeyFalseExpr=e.expressionsAreEqualWithConstantSubstitution=e.ContextKeyExpr=e.Parser=void 0;const p=new Map;p.set("false",!1),p.set("true",!0),p.set("isMac",L.isMacintosh),p.set("isLinux",L.isLinux),p.set("isWindows",L.isWindows),p.set("isWeb",L.isWeb),p.set("isMacNative",L.isMacintosh&&!L.isWeb),p.set("isEdge",L.isEdge),p.set("isFirefox",L.isFirefox),p.set("isChrome",L.isChrome),p.set("isSafari",L.isSafari);const _=Object.prototype.hasOwnProperty,v={regexParsingWithErrorRecovery:!0},b=(0,S.localize)(0,null),a=(0,S.localize)(1,null),i=(0,S.localize)(2,null),n=(0,S.localize)(3,null),t=(0,S.localize)(4,null),r=(0,S.localize)(5,null),u=(0,S.localize)(6,null),f=(0,S.localize)(7,null);class c{constructor($=v){this._config=$,this._scanner=new y.Scanner,this._tokens=[],this._current=0,this._parsingErrors=[],this._flagsGYRe=/g|y/g}parse($){if($===""){this._parsingErrors.push({message:b,offset:0,lexeme:"",additionalInfo:a});return}this._tokens=this._scanner.reset($).scan(),this._current=0,this._parsingErrors=[];try{const J=this._expr();if(!this._isAtEnd()){const Q=this._peek(),re=Q.type===17?r:void 0;throw this._parsingErrors.push({message:t,offset:Q.offset,lexeme:y.Scanner.getLexeme(Q),additionalInfo:re}),c._parseError}return J}catch(J){if(J!==c._parseError)throw J;return}}_expr(){return this._or()}_or(){const $=[this._and()];for(;this._matchOne(16);){const J=this._and();$.push(J)}return $.length===1?$[0]:d.or(...$)}_and(){const $=[this._term()];for(;this._matchOne(15);){const J=this._term();$.push(J)}return $.length===1?$[0]:d.and(...$)}_term(){if(this._matchOne(2)){const $=this._peek();switch($.type){case 11:return this._advance(),o.INSTANCE;case 12:return this._advance(),g.INSTANCE;case 0:{this._advance();const J=this._expr();return this._consume(1,n),J?.negate()}case 17:return this._advance(),I.create($.lexeme);default:throw this._errExpectedButGot("KEY | true | false | '(' expression ')'",$)}}return this._primary()}_primary(){const $=this._peek();switch($.type){case 11:return this._advance(),d.true();case 12:return this._advance(),d.false();case 0:{this._advance();const J=this._expr();return this._consume(1,n),J}case 17:{const J=$.lexeme;if(this._advance(),this._matchOne(9)){const re=this._peek();if(!this._config.regexParsingWithErrorRecovery){if(this._advance(),re.type!==10)throw this._errExpectedButGot("REGEX",re);const de=re.lexeme,he=de.lastIndexOf("/"),me=he===de.length-1?void 0:this._removeFlagsGY(de.substring(he+1));let X;try{X=new RegExp(de.substring(1,he),me)}catch{throw this._errExpectedButGot("REGEX",re)}return R.create(J,X)}switch(re.type){case 10:case 19:{const de=[re.lexeme];this._advance();let he=this._peek(),me=0;for(let H=0;H<re.lexeme.length;H++)re.lexeme.charCodeAt(H)===40?me++:re.lexeme.charCodeAt(H)===41&&me--;for(;!this._isAtEnd()&&he.type!==15&&he.type!==16;){switch(he.type){case 0:me++;break;case 1:me--;break;case 10:case 18:for(let H=0;H<he.lexeme.length;H++)he.lexeme.charCodeAt(H)===40?me++:re.lexeme.charCodeAt(H)===41&&me--}if(me<0)break;de.push(y.Scanner.getLexeme(he)),this._advance(),he=this._peek()}const X=de.join(""),U=X.lastIndexOf("/"),G=U===X.length-1?void 0:this._removeFlagsGY(X.substring(U+1));let z;try{z=new RegExp(X.substring(1,U),G)}catch{throw this._errExpectedButGot("REGEX",re)}return d.regex(J,z)}case 18:{const de=re.lexeme;this._advance();let he=null;if(!(0,k.isFalsyOrWhitespace)(de)){const me=de.indexOf("/"),X=de.lastIndexOf("/");if(me!==X&&me>=0){const U=de.slice(me+1,X),G=de[X+1]==="i"?"i":"";try{he=new RegExp(U,G)}catch{throw this._errExpectedButGot("REGEX",re)}}}if(he===null)throw this._errExpectedButGot("REGEX",re);return R.create(J,he)}default:throw this._errExpectedButGot("REGEX",this._peek())}}if(this._matchOne(14)){this._consume(13,i);const re=this._value();return d.notIn(J,re)}switch(this._peek().type){case 3:{this._advance();const re=this._value();if(this._previous().type===18)return d.equals(J,re);switch(re){case"true":return d.has(J);case"false":return d.not(J);default:return d.equals(J,re)}}case 4:{this._advance();const re=this._value();if(this._previous().type===18)return d.notEquals(J,re);switch(re){case"true":return d.not(J);case"false":return d.has(J);default:return d.notEquals(J,re)}}case 5:return this._advance(),N.create(J,this._value());case 6:return this._advance(),M.create(J,this._value());case 7:return this._advance(),A.create(J,this._value());case 8:return this._advance(),P.create(J,this._value());case 13:return this._advance(),d.in(J,this._value());default:return d.has(J)}}case 20:throw this._parsingErrors.push({message:u,offset:$.offset,lexeme:"",additionalInfo:f}),c._parseError;default:throw this._errExpectedButGot(`true | false | KEY 
+	| KEY '=~' REGEX 
+	| KEY ('==' | '!=' | '<' | '<=' | '>' | '>=' | 'in' | 'not' 'in') value`,this._peek())}}_value(){const $=this._peek();switch($.type){case 17:case 18:return this._advance(),$.lexeme;case 11:return this._advance(),"true";case 12:return this._advance(),"false";case 13:return this._advance(),"in";default:return""}}_removeFlagsGY($){return $.replaceAll(this._flagsGYRe,"")}_previous(){return this._tokens[this._current-1]}_matchOne($){return this._check($)?(this._advance(),!0):!1}_advance(){return this._isAtEnd()||this._current++,this._previous()}_consume($,J){if(this._check($))return this._advance();throw this._errExpectedButGot(J,this._peek())}_errExpectedButGot($,J,Q){const re=(0,S.localize)(8,null,$,y.Scanner.getLexeme(J)),de=J.offset,he=y.Scanner.getLexeme(J);return this._parsingErrors.push({message:re,offset:de,lexeme:he,additionalInfo:Q}),c._parseError}_check($){return this._peek().type===$}_peek(){return this._tokens[this._current]}_isAtEnd(){return this._peek().type===20}}e.Parser=c,c._parseError=new Error;class d{static false(){return o.INSTANCE}static true(){return g.INSTANCE}static has($){return h.create($)}static equals($,J){return m.create($,J)}static notEquals($,J){return D.create($,J)}static regex($,J){return R.create($,J)}static in($,J){return C.create($,J)}static notIn($,J){return w.create($,J)}static not($){return I.create($)}static and(...$){return B.create($,null,!0)}static or(...$){return W.create($,null,!0)}static deserialize($){return $==null?void 0:this._parser.parse($)}}e.ContextKeyExpr=d,d._parser=new c({regexParsingWithErrorRecovery:!1});function s(ne,$){const J=ne?ne.substituteConstants():void 0,Q=$?$.substituteConstants():void 0;return!J&&!Q?!0:!J||!Q?!1:J.equals(Q)}e.expressionsAreEqualWithConstantSubstitution=s;function l(ne,$){return ne.cmp($)}class o{constructor(){this.type=0}cmp($){return this.type-$.type}equals($){return $.type===this.type}substituteConstants(){return this}evaluate($){return!1}serialize(){return"false"}keys(){return[]}negate(){return g.INSTANCE}}e.ContextKeyFalseExpr=o,o.INSTANCE=new o;class g{constructor(){this.type=1}cmp($){return this.type-$.type}equals($){return $.type===this.type}substituteConstants(){return this}evaluate($){return!0}serialize(){return"true"}keys(){return[]}negate(){return o.INSTANCE}}e.ContextKeyTrueExpr=g,g.INSTANCE=new g;class h{static create($,J=null){const Q=p.get($);return typeof Q=="boolean"?Q?g.INSTANCE:o.INSTANCE:new h($,J)}constructor($,J){this.key=$,this.negated=J,this.type=2}cmp($){return $.type!==this.type?this.type-$.type:K(this.key,$.key)}equals($){return $.type===this.type?this.key===$.key:!1}substituteConstants(){const $=p.get(this.key);return typeof $=="boolean"?$?g.INSTANCE:o.INSTANCE:this}evaluate($){return!!$.getValue(this.key)}serialize(){return this.key}keys(){return[this.key]}negate(){return this.negated||(this.negated=I.create(this.key,this)),this.negated}}e.ContextKeyDefinedExpr=h;class m{static create($,J,Q=null){if(typeof J=="boolean")return J?h.create($,Q):I.create($,Q);const re=p.get($);return typeof re=="boolean"?J===(re?"true":"false")?g.INSTANCE:o.INSTANCE:new m($,J,Q)}constructor($,J,Q){this.key=$,this.value=J,this.negated=Q,this.type=4}cmp($){return $.type!==this.type?this.type-$.type:F(this.key,this.value,$.key,$.value)}equals($){return $.type===this.type?this.key===$.key&&this.value===$.value:!1}substituteConstants(){const $=p.get(this.key);if(typeof $=="boolean"){const J=$?"true":"false";return this.value===J?g.INSTANCE:o.INSTANCE}return this}evaluate($){return $.getValue(this.key)==this.value}serialize(){return`${this.key} == '${this.value}'`}keys(){return[this.key]}negate(){return this.negated||(this.negated=D.create(this.key,this.value,this)),this.negated}}e.ContextKeyEqualsExpr=m;class C{static create($,J){return new C($,J)}constructor($,J){this.key=$,this.valueKey=J,this.type=10,this.negated=null}cmp($){return $.type!==this.type?this.type-$.type:F(this.key,this.valueKey,$.key,$.valueKey)}equals($){return $.type===this.type?this.key===$.key&&this.valueKey===$.valueKey:!1}substituteConstants(){return this}evaluate($){const J=$.getValue(this.valueKey),Q=$.getValue(this.key);return Array.isArray(J)?J.includes(Q):typeof Q=="string"&&typeof J=="object"&&J!==null?_.call(J,Q):!1}serialize(){return`${this.key} in '${this.valueKey}'`}keys(){return[this.key,this.valueKey]}negate(){return this.negated||(this.negated=w.create(this.key,this.valueKey)),this.negated}}e.ContextKeyInExpr=C;class w{static create($,J){return new w($,J)}constructor($,J){this.key=$,this.valueKey=J,this.type=11,this._negated=C.create($,J)}cmp($){return $.type!==this.type?this.type-$.type:this._negated.cmp($._negated)}equals($){return $.type===this.type?this._negated.equals($._negated):!1}substituteConstants(){return this}evaluate($){return!this._negated.evaluate($)}serialize(){return`${this.key} not in '${this.valueKey}'`}keys(){return this._negated.keys()}negate(){return this._negated}}e.ContextKeyNotInExpr=w;class D{static create($,J,Q=null){if(typeof J=="boolean")return J?I.create($,Q):h.create($,Q);const re=p.get($);return typeof re=="boolean"?J===(re?"true":"false")?o.INSTANCE:g.INSTANCE:new D($,J,Q)}constructor($,J,Q){this.key=$,this.value=J,this.negated=Q,this.type=5}cmp($){return $.type!==this.type?this.type-$.type:F(this.key,this.value,$.key,$.value)}equals($){return $.type===this.type?this.key===$.key&&this.value===$.value:!1}substituteConstants(){const $=p.get(this.key);if(typeof $=="boolean"){const J=$?"true":"false";return this.value===J?o.INSTANCE:g.INSTANCE}return this}evaluate($){return $.getValue(this.key)!=this.value}serialize(){return`${this.key} != '${this.value}'`}keys(){return[this.key]}negate(){return this.negated||(this.negated=m.create(this.key,this.value,this)),this.negated}}e.ContextKeyNotEqualsExpr=D;class I{static create($,J=null){const Q=p.get($);return typeof Q=="boolean"?Q?o.INSTANCE:g.INSTANCE:new I($,J)}constructor($,J){this.key=$,this.negated=J,this.type=3}cmp($){return $.type!==this.type?this.type-$.type:K(this.key,$.key)}equals($){return $.type===this.type?this.key===$.key:!1}substituteConstants(){const $=p.get(this.key);return typeof $=="boolean"?$?o.INSTANCE:g.INSTANCE:this}evaluate($){return!$.getValue(this.key)}serialize(){return`!${this.key}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=h.create(this.key,this)),this.negated}}e.ContextKeyNotExpr=I;function T(ne,$){if(typeof ne=="string"){const J=parseFloat(ne);isNaN(J)||(ne=J)}return typeof ne=="string"||typeof ne=="number"?$(ne):o.INSTANCE}class A{static create($,J,Q=null){return T(J,re=>new A($,re,Q))}constructor($,J,Q){this.key=$,this.value=J,this.negated=Q,this.type=12}cmp($){return $.type!==this.type?this.type-$.type:F(this.key,this.value,$.key,$.value)}equals($){return $.type===this.type?this.key===$.key&&this.value===$.value:!1}substituteConstants(){return this}evaluate($){return typeof this.value=="string"?!1:parseFloat($.getValue(this.key))>this.value}serialize(){return`${this.key} > ${this.value}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=M.create(this.key,this.value,this)),this.negated}}e.ContextKeyGreaterExpr=A;class P{static create($,J,Q=null){return T(J,re=>new P($,re,Q))}constructor($,J,Q){this.key=$,this.value=J,this.negated=Q,this.type=13}cmp($){return $.type!==this.type?this.type-$.type:F(this.key,this.value,$.key,$.value)}equals($){return $.type===this.type?this.key===$.key&&this.value===$.value:!1}substituteConstants(){return this}evaluate($){return typeof this.value=="string"?!1:parseFloat($.getValue(this.key))>=this.value}serialize(){return`${this.key} >= ${this.value}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=N.create(this.key,this.value,this)),this.negated}}e.ContextKeyGreaterEqualsExpr=P;class N{static create($,J,Q=null){return T(J,re=>new N($,re,Q))}constructor($,J,Q){this.key=$,this.value=J,this.negated=Q,this.type=14}cmp($){return $.type!==this.type?this.type-$.type:F(this.key,this.value,$.key,$.value)}equals($){return $.type===this.type?this.key===$.key&&this.value===$.value:!1}substituteConstants(){return this}evaluate($){return typeof this.value=="string"?!1:parseFloat($.getValue(this.key))<this.value}serialize(){return`${this.key} < ${this.value}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=P.create(this.key,this.value,this)),this.negated}}e.ContextKeySmallerExpr=N;class M{static create($,J,Q=null){return T(J,re=>new M($,re,Q))}constructor($,J,Q){this.key=$,this.value=J,this.negated=Q,this.type=15}cmp($){return $.type!==this.type?this.type-$.type:F(this.key,this.value,$.key,$.value)}equals($){return $.type===this.type?this.key===$.key&&this.value===$.value:!1}substituteConstants(){return this}evaluate($){return typeof this.value=="string"?!1:parseFloat($.getValue(this.key))<=this.value}serialize(){return`${this.key} <= ${this.value}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=A.create(this.key,this.value,this)),this.negated}}e.ContextKeySmallerEqualsExpr=M;class R{static create($,J){return new R($,J)}constructor($,J){this.key=$,this.regexp=J,this.type=7,this.negated=null}cmp($){if($.type!==this.type)return this.type-$.type;if(this.key<$.key)return-1;if(this.key>$.key)return 1;const J=this.regexp?this.regexp.source:"",Q=$.regexp?$.regexp.source:"";return J<Q?-1:J>Q?1:0}equals($){if($.type===this.type){const J=this.regexp?this.regexp.source:"",Q=$.regexp?$.regexp.source:"";return this.key===$.key&&J===Q}return!1}substituteConstants(){return this}evaluate($){const J=$.getValue(this.key);return this.regexp?this.regexp.test(J):!1}serialize(){const $=this.regexp?`/${this.regexp.source}/${this.regexp.flags}`:"/invalid/";return`${this.key} =~ ${$}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=x.create(this)),this.negated}}e.ContextKeyRegexExpr=R;class x{static create($){return new x($)}constructor($){this._actual=$,this.type=8}cmp($){return $.type!==this.type?this.type-$.type:this._actual.cmp($._actual)}equals($){return $.type===this.type?this._actual.equals($._actual):!1}substituteConstants(){return this}evaluate($){return!this._actual.evaluate($)}serialize(){return`!(${this._actual.serialize()})`}keys(){return this._actual.keys()}negate(){return this._actual}}e.ContextKeyNotRegexExpr=x;function O(ne){let $=null;for(let J=0,Q=ne.length;J<Q;J++){const re=ne[J].substituteConstants();if(ne[J]!==re&&$===null){$=[];for(let de=0;de<J;de++)$[de]=ne[de]}$!==null&&($[J]=re)}return $===null?ne:$}class B{static create($,J,Q){return B._normalizeArr($,J,Q)}constructor($,J){this.expr=$,this.negated=J,this.type=6}cmp($){if($.type!==this.type)return this.type-$.type;if(this.expr.length<$.expr.length)return-1;if(this.expr.length>$.expr.length)return 1;for(let J=0,Q=this.expr.length;J<Q;J++){const re=l(this.expr[J],$.expr[J]);if(re!==0)return re}return 0}equals($){if($.type===this.type){if(this.expr.length!==$.expr.length)return!1;for(let J=0,Q=this.expr.length;J<Q;J++)if(!this.expr[J].equals($.expr[J]))return!1;return!0}return!1}substituteConstants(){const $=O(this.expr);return $===this.expr?this:B.create($,this.negated,!1)}evaluate($){for(let J=0,Q=this.expr.length;J<Q;J++)if(!this.expr[J].evaluate($))return!1;return!0}static _normalizeArr($,J,Q){const re=[];let de=!1;for(const he of $)if(he){if(he.type===1){de=!0;continue}if(he.type===0)return o.INSTANCE;if(he.type===6){re.push(...he.expr);continue}re.push(he)}if(re.length===0&&de)return g.INSTANCE;if(re.length!==0){if(re.length===1)return re[0];re.sort(l);for(let he=1;he<re.length;he++)re[he-1].equals(re[he])&&(re.splice(he,1),he--);if(re.length===1)return re[0];for(;re.length>1;){const he=re[re.length-1];if(he.type!==9)break;re.pop();const me=re.pop(),X=re.length===0,U=W.create(he.expr.map(G=>B.create([G,me],null,Q)),null,X);U&&(re.push(U),re.sort(l))}if(re.length===1)return re[0];if(Q){for(let he=0;he<re.length;he++)for(let me=he+1;me<re.length;me++)if(re[he].negate().equals(re[me]))return o.INSTANCE;if(re.length===1)return re[0]}return new B(re,J)}}serialize(){return this.expr.map($=>$.serialize()).join(" && ")}keys(){const $=[];for(const J of this.expr)$.push(...J.keys());return $}negate(){if(!this.negated){const $=[];for(const J of this.expr)$.push(J.negate());this.negated=W.create($,this,!0)}return this.negated}}e.ContextKeyAndExpr=B;class W{static create($,J,Q){return W._normalizeArr($,J,Q)}constructor($,J){this.expr=$,this.negated=J,this.type=9}cmp($){if($.type!==this.type)return this.type-$.type;if(this.expr.length<$.expr.length)return-1;if(this.expr.length>$.expr.length)return 1;for(let J=0,Q=this.expr.length;J<Q;J++){const re=l(this.expr[J],$.expr[J]);if(re!==0)return re}return 0}equals($){if($.type===this.type){if(this.expr.length!==$.expr.length)return!1;for(let J=0,Q=this.expr.length;J<Q;J++)if(!this.expr[J].equals($.expr[J]))return!1;return!0}return!1}substituteConstants(){const $=O(this.expr);return $===this.expr?this:W.create($,this.negated,!1)}evaluate($){for(let J=0,Q=this.expr.length;J<Q;J++)if(this.expr[J].evaluate($))return!0;return!1}static _normalizeArr($,J,Q){let re=[],de=!1;if($){for(let he=0,me=$.length;he<me;he++){const X=$[he];if(X){if(X.type===0){de=!0;continue}if(X.type===1)return g.INSTANCE;if(X.type===9){re=re.concat(X.expr);continue}re.push(X)}}if(re.length===0&&de)return o.INSTANCE;re.sort(l)}if(re.length!==0){if(re.length===1)return re[0];for(let he=1;he<re.length;he++)re[he-1].equals(re[he])&&(re.splice(he,1),he--);if(re.length===1)return re[0];if(Q){for(let he=0;he<re.length;he++)for(let me=he+1;me<re.length;me++)if(re[he].negate().equals(re[me]))return g.INSTANCE;if(re.length===1)return re[0]}return new W(re,J)}}serialize(){return this.expr.map($=>$.serialize()).join(" || ")}keys(){const $=[];for(const J of this.expr)$.push(...J.keys());return $}negate(){if(!this.negated){const $=[];for(const J of this.expr)$.push(J.negate());for(;$.length>1;){const J=$.shift(),Q=$.shift(),re=[];for(const de of ae(J))for(const he of ae(Q))re.push(B.create([de,he],null,!1));$.unshift(W.create(re,null,!1))}this.negated=W.create($,this,!0)}return this.negated}}e.ContextKeyOrExpr=W;class V extends h{static all(){return V._info.values()}constructor($,J,Q){super($,null),this._defaultValue=J,typeof Q=="object"?V._info.push({...Q,key:$}):Q!==!0&&V._info.push({key:$,description:Q,type:J!=null?typeof J:void 0})}bindTo($){return $.createKey(this.key,this._defaultValue)}getValue($){return $.getContextKeyValue(this.key)}toNegated(){return this.negate()}isEqualTo($){return m.create(this.key,$)}}e.RawContextKey=V,V._info=[],e.IContextKeyService=(0,E.createDecorator)("contextKeyService");function K(ne,$){return ne<$?-1:ne>$?1:0}function F(ne,$,J,Q){return ne<J?-1:ne>J?1:$<Q?-1:$>Q?1:0}function q(ne,$){if(ne.type===0||$.type===1)return!0;if(ne.type===9)return $.type===9?ie(ne.expr,$.expr):!1;if($.type===9){for(const J of $.expr)if(q(ne,J))return!0;return!1}if(ne.type===6){if($.type===6)return ie($.expr,ne.expr);for(const J of ne.expr)if(q(J,$))return!0;return!1}return ne.equals($)}e.implies=q;function ie(ne,$){let J=0,Q=0;for(;J<ne.length&&Q<$.length;){const re=ne[J].cmp($[Q]);if(re<0)return!1;re===0&&J++,Q++}return J===ne.length}function ae(ne){return ne.type===9?ne.expr:[ne]}}),define(se[21],oe([1,0,639,15]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorContextKeys=void 0;var y;(function(E){E.editorSimpleInput=new k.RawContextKey("editorSimpleInput",!1,!0),E.editorTextFocus=new k.RawContextKey("editorTextFocus",!1,L.localize(0,null)),E.focus=new k.RawContextKey("editorFocus",!1,L.localize(1,null)),E.textInputFocus=new k.RawContextKey("textInputFocus",!1,L.localize(2,null)),E.readOnly=new k.RawContextKey("editorReadonly",!1,L.localize(3,null)),E.inDiffEditor=new k.RawContextKey("inDiffEditor",!1,L.localize(4,null)),E.isEmbeddedDiffEditor=new k.RawContextKey("isEmbeddedDiffEditor",!1,L.localize(5,null)),E.inMultiDiffEditor=new k.RawContextKey("inMultiDiffEditor",!1,L.localize(6,null)),E.multiDiffEditorAllCollapsed=new k.RawContextKey("multiDiffEditorAllCollapsed",void 0,L.localize(7,null)),E.hasChanges=new k.RawContextKey("diffEditorHasChanges",!1,L.localize(8,null)),E.comparingMovedCode=new k.RawContextKey("comparingMovedCode",!1,L.localize(9,null)),E.accessibleDiffViewerVisible=new k.RawContextKey("accessibleDiffViewerVisible",!1,L.localize(10,null)),E.diffEditorRenderSideBySideInlineBreakpointReached=new k.RawContextKey("diffEditorRenderSideBySideInlineBreakpointReached",!1,L.localize(11,null)),E.columnSelection=new k.RawContextKey("editorColumnSelection",!1,L.localize(12,null)),E.writable=E.readOnly.toNegated(),E.hasNonEmptySelection=new k.RawContextKey("editorHasSelection",!1,L.localize(13,null)),E.hasOnlyEmptySelection=E.hasNonEmptySelection.toNegated(),E.hasMultipleSelections=new k.RawContextKey("editorHasMultipleSelections",!1,L.localize(14,null)),E.hasSingleSelection=E.hasMultipleSelections.toNegated(),E.tabMovesFocus=new k.RawContextKey("editorTabMovesFocus",!1,L.localize(15,null)),E.tabDoesNotMoveFocus=E.tabMovesFocus.toNegated(),E.isInWalkThroughSnippet=new k.RawContextKey("isInEmbeddedEditor",!1,!0),E.canUndo=new k.RawContextKey("canUndo",!1,!0),E.canRedo=new k.RawContextKey("canRedo",!1,!0),E.hoverVisible=new k.RawContextKey("editorHoverVisible",!1,L.localize(16,null)),E.hoverFocused=new k.RawContextKey("editorHoverFocused",!1,L.localize(17,null)),E.stickyScrollFocused=new k.RawContextKey("stickyScrollFocused",!1,L.localize(18,null)),E.stickyScrollVisible=new k.RawContextKey("stickyScrollVisible",!1,L.localize(19,null)),E.standaloneColorPickerVisible=new k.RawContextKey("standaloneColorPickerVisible",!1,L.localize(20,null)),E.standaloneColorPickerFocused=new k.RawContextKey("standaloneColorPickerFocused",!1,L.localize(21,null)),E.inCompositeEditor=new k.RawContextKey("inCompositeEditor",void 0,L.localize(22,null)),E.notInCompositeEditor=E.inCompositeEditor.toNegated(),E.languageId=new k.RawContextKey("editorLangId","",L.localize(23,null)),E.hasCompletionItemProvider=new k.RawContextKey("editorHasCompletionItemProvider",!1,L.localize(24,null)),E.hasCodeActionsProvider=new k.RawContextKey("editorHasCodeActionsProvider",!1,L.localize(25,null)),E.hasCodeLensProvider=new k.RawContextKey("editorHasCodeLensProvider",!1,L.localize(26,null)),E.hasDefinitionProvider=new k.RawContextKey("editorHasDefinitionProvider",!1,L.localize(27,null)),E.hasDeclarationProvider=new k.RawContextKey("editorHasDeclarationProvider",!1,L.localize(28,null)),E.hasImplementationProvider=new k.RawContextKey("editorHasImplementationProvider",!1,L.localize(29,null)),E.hasTypeDefinitionProvider=new k.RawContextKey("editorHasTypeDefinitionProvider",!1,L.localize(30,null)),E.hasHoverProvider=new k.RawContextKey("editorHasHoverProvider",!1,L.localize(31,null)),E.hasDocumentHighlightProvider=new k.RawContextKey("editorHasDocumentHighlightProvider",!1,L.localize(32,null)),E.hasDocumentSymbolProvider=new k.RawContextKey("editorHasDocumentSymbolProvider",!1,L.localize(33,null)),E.hasReferenceProvider=new k.RawContextKey("editorHasReferenceProvider",!1,L.localize(34,null)),E.hasRenameProvider=new k.RawContextKey("editorHasRenameProvider",!1,L.localize(35,null)),E.hasSignatureHelpProvider=new k.RawContextKey("editorHasSignatureHelpProvider",!1,L.localize(36,null)),E.hasInlayHintsProvider=new k.RawContextKey("editorHasInlayHintsProvider",!1,L.localize(37,null)),E.hasDocumentFormattingProvider=new k.RawContextKey("editorHasDocumentFormattingProvider",!1,L.localize(38,null)),E.hasDocumentSelectionFormattingProvider=new k.RawContextKey("editorHasDocumentSelectionFormattingProvider",!1,L.localize(39,null)),E.hasMultipleDocumentFormattingProvider=new k.RawContextKey("editorHasMultipleDocumentFormattingProvider",!1,L.localize(40,null)),E.hasMultipleDocumentSelectionFormattingProvider=new k.RawContextKey("editorHasMultipleDocumentSelectionFormattingProvider",!1,L.localize(41,null))})(y||(e.EditorContextKeys=y={}))}),define(se[240],oe([1,0,35,11,85,15,2,695]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineCompletionContextKeys=void 0;class _ extends S.Disposable{constructor(b,a){super(),this.contextKeyService=b,this.model=a,this.inlineCompletionVisible=_.inlineSuggestionVisible.bindTo(this.contextKeyService),this.inlineCompletionSuggestsIndentation=_.inlineSuggestionHasIndentation.bindTo(this.contextKeyService),this.inlineCompletionSuggestsIndentationLessThanTabSize=_.inlineSuggestionHasIndentationLessThanTabSize.bindTo(this.contextKeyService),this.suppressSuggestions=_.suppressSuggestions.bindTo(this.contextKeyService),this._register((0,L.autorun)(i=>{const n=this.model.read(i),t=n?.state.read(i),r=!!t?.inlineCompletion&&t?.ghostText!==void 0&&!t?.ghostText.isEmpty();this.inlineCompletionVisible.set(r),t?.ghostText&&t?.inlineCompletion&&this.suppressSuggestions.set(t.inlineCompletion.inlineCompletion.source.inlineCompletions.suppressSuggestions)})),this._register((0,L.autorun)(i=>{const n=this.model.read(i);let t=!1,r=!0;const u=n?.ghostText.read(i);if(n?.selectedSuggestItem&&u&&u.parts.length>0){const{column:f,lines:c}=u.parts[0],d=c[0],s=n.textModel.getLineIndentColumn(u.lineNumber);if(f<=s){let o=(0,k.firstNonWhitespaceIndex)(d);o===-1&&(o=d.length-1),t=o>0;const g=n.textModel.getOptions().tabSize;r=y.CursorColumns.visibleColumnFromColumn(d,o+1,g)<g}}this.inlineCompletionSuggestsIndentation.set(t),this.inlineCompletionSuggestsIndentationLessThanTabSize.set(r)}))}}e.InlineCompletionContextKeys=_,_.inlineSuggestionVisible=new E.RawContextKey("inlineSuggestionVisible",!1,(0,p.localize)(0,null)),_.inlineSuggestionHasIndentation=new E.RawContextKey("inlineSuggestionHasIndentation",!1,(0,p.localize)(1,null)),_.inlineSuggestionHasIndentationLessThanTabSize=new E.RawContextKey("inlineSuggestionHasIndentationLessThanTabSize",!0,(0,p.localize)(2,null)),_.suppressSuggestions=new E.RawContextKey("inlineSuggestionSuppressSuggestions",void 0,(0,p.localize)(3,null))}),define(se[241],oe([1,0,19,12,20,22,10,31,18,68,25,15]),function(te,e,L,k,y,E,S,p,_,v,b,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.provideSignatureHelp=e.Context=void 0,e.Context={Visible:new a.RawContextKey("parameterHintsVisible",!1),MultipleSignatures:new a.RawContextKey("parameterHintsMultipleSignatures",!1)};async function i(n,t,r,u,f){const c=n.ordered(t);for(const d of c)try{const s=await d.provideSignatureHelp(t,r,f,u);if(s)return s}catch(s){(0,k.onUnexpectedExternalError)(s)}}e.provideSignatureHelp=i,b.CommandsRegistry.registerCommand("_executeSignatureHelpProvider",async(n,...t)=>{const[r,u,f]=t;(0,y.assertType)(E.URI.isUri(r)),(0,y.assertType)(S.Position.isIPosition(u)),(0,y.assertType)(typeof f=="string"||!f);const c=n.get(_.ILanguageFeaturesService),d=await n.get(v.ITextModelService).createModelReference(r);try{const s=await i(c.signatureHelpProvider,d.object.textEditorModel,S.Position.lift(u),{triggerKind:p.SignatureHelpTriggerKind.Invoke,isRetrigger:!1,triggerCharacter:f},L.CancellationToken.None);return s?(setTimeout(()=>s.dispose(),0),s.value):void 0}finally{d.dispose()}})}),define(se[768],oe([1,0,14,12,6,2,128,31,241]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ParameterHintsModel=void 0;var v;(function(i){i.Default={type:0};class n{constructor(u,f){this.request=u,this.previouslyActiveHints=f,this.type=2}}i.Pending=n;class t{constructor(u){this.hints=u,this.type=1}}i.Active=t})(v||(v={}));class b extends E.Disposable{constructor(n,t,r=b.DEFAULT_DELAY){super(),this._onChangedHints=this._register(new y.Emitter),this.onChangedHints=this._onChangedHints.event,this.triggerOnType=!1,this._state=v.Default,this._pendingTriggers=[],this._lastSignatureHelpResult=this._register(new E.MutableDisposable),this.triggerChars=new S.CharacterSet,this.retriggerChars=new S.CharacterSet,this.triggerId=0,this.editor=n,this.providers=t,this.throttledDelayer=new L.Delayer(r),this._register(this.editor.onDidBlurEditorWidget(()=>this.cancel())),this._register(this.editor.onDidChangeConfiguration(()=>this.onEditorConfigurationChange())),this._register(this.editor.onDidChangeModel(u=>this.onModelChanged())),this._register(this.editor.onDidChangeModelLanguage(u=>this.onModelChanged())),this._register(this.editor.onDidChangeCursorSelection(u=>this.onCursorChange(u))),this._register(this.editor.onDidChangeModelContent(u=>this.onModelContentChange())),this._register(this.providers.onDidChange(this.onModelChanged,this)),this._register(this.editor.onDidType(u=>this.onDidType(u))),this.onEditorConfigurationChange(),this.onModelChanged()}get state(){return this._state}set state(n){this._state.type===2&&this._state.request.cancel(),this._state=n}cancel(n=!1){this.state=v.Default,this.throttledDelayer.cancel(),n||this._onChangedHints.fire(void 0)}trigger(n,t){const r=this.editor.getModel();if(!r||!this.providers.has(r))return;const u=++this.triggerId;this._pendingTriggers.push(n),this.throttledDelayer.trigger(()=>this.doTrigger(u),t).catch(k.onUnexpectedError)}next(){if(this.state.type!==1)return;const n=this.state.hints.signatures.length,t=this.state.hints.activeSignature,r=t%n===n-1,u=this.editor.getOption(85).cycle;if((n<2||r)&&!u){this.cancel();return}this.updateActiveSignature(r&&u?0:t+1)}previous(){if(this.state.type!==1)return;const n=this.state.hints.signatures.length,t=this.state.hints.activeSignature,r=t===0,u=this.editor.getOption(85).cycle;if((n<2||r)&&!u){this.cancel();return}this.updateActiveSignature(r&&u?n-1:t-1)}updateActiveSignature(n){this.state.type===1&&(this.state=new v.Active({...this.state.hints,activeSignature:n}),this._onChangedHints.fire(this.state.hints))}async doTrigger(n){const t=this.state.type===1||this.state.type===2,r=this.getLastActiveHints();if(this.cancel(!0),this._pendingTriggers.length===0)return!1;const u=this._pendingTriggers.reduce(a);this._pendingTriggers=[];const f={triggerKind:u.triggerKind,triggerCharacter:u.triggerCharacter,isRetrigger:t,activeSignatureHelp:r};if(!this.editor.hasModel())return!1;const c=this.editor.getModel(),d=this.editor.getPosition();this.state=new v.Pending((0,L.createCancelablePromise)(s=>(0,_.provideSignatureHelp)(this.providers,c,d,f,s)),r);try{const s=await this.state.request;return n!==this.triggerId?(s?.dispose(),!1):!s||!s.value.signatures||s.value.signatures.length===0?(s?.dispose(),this._lastSignatureHelpResult.clear(),this.cancel(),!1):(this.state=new v.Active(s.value),this._lastSignatureHelpResult.value=s,this._onChangedHints.fire(this.state.hints),!0)}catch(s){return n===this.triggerId&&(this.state=v.Default),(0,k.onUnexpectedError)(s),!1}}getLastActiveHints(){switch(this.state.type){case 1:return this.state.hints;case 2:return this.state.previouslyActiveHints;default:return}}get isTriggered(){return this.state.type===1||this.state.type===2||this.throttledDelayer.isTriggered()}onModelChanged(){this.cancel(),this.triggerChars.clear(),this.retriggerChars.clear();const n=this.editor.getModel();if(n)for(const t of this.providers.ordered(n)){for(const r of t.signatureHelpTriggerCharacters||[])if(r.length){const u=r.charCodeAt(0);this.triggerChars.add(u),this.retriggerChars.add(u)}for(const r of t.signatureHelpRetriggerCharacters||[])r.length&&this.retriggerChars.add(r.charCodeAt(0))}}onDidType(n){if(!this.triggerOnType)return;const t=n.length-1,r=n.charCodeAt(t);(this.triggerChars.has(r)||this.isTriggered&&this.retriggerChars.has(r))&&this.trigger({triggerKind:p.SignatureHelpTriggerKind.TriggerCharacter,triggerCharacter:n.charAt(t)})}onCursorChange(n){n.source==="mouse"?this.cancel():this.isTriggered&&this.trigger({triggerKind:p.SignatureHelpTriggerKind.ContentChange})}onModelContentChange(){this.isTriggered&&this.trigger({triggerKind:p.SignatureHelpTriggerKind.ContentChange})}onEditorConfigurationChange(){this.triggerOnType=this.editor.getOption(85).enabled,this.triggerOnType||this.cancel()}dispose(){this.cancel(!0),super.dispose()}}e.ParameterHintsModel=b,b.DEFAULT_DELAY=120;function a(i,n){switch(n.triggerKind){case p.SignatureHelpTriggerKind.Invoke:return n;case p.SignatureHelpTriggerKind.ContentChange:return i;case p.SignatureHelpTriggerKind.TriggerCharacter:default:return n}}}),define(se[769],oe([1,0,15]),function(te,e,L){"use strict";var k;Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestAlternatives=void 0;let y=k=class{constructor(S,p){this._editor=S,this._index=0,this._ckOtherSuggestions=k.OtherSuggestions.bindTo(p)}dispose(){this.reset()}reset(){var S;this._ckOtherSuggestions.reset(),(S=this._listener)===null||S===void 0||S.dispose(),this._model=void 0,this._acceptNext=void 0,this._ignore=!1}set({model:S,index:p},_){if(S.items.length===0){this.reset();return}if(k._moveIndex(!0,S,p)===p){this.reset();return}this._acceptNext=_,this._model=S,this._index=p,this._listener=this._editor.onDidChangeCursorPosition(()=>{this._ignore||this.reset()}),this._ckOtherSuggestions.set(!0)}static _moveIndex(S,p,_){let v=_;for(let b=p.items.length;b>0&&(v=(v+p.items.length+(S?1:-1))%p.items.length,!(v===_||!p.items[v].completion.additionalTextEdits));b--);return v}next(){this._move(!0)}prev(){this._move(!1)}_move(S){if(this._model)try{this._ignore=!0,this._index=k._moveIndex(S,this._model,this._index),this._acceptNext({index:this._index,item:this._model.items[this._index],model:this._model})}finally{this._ignore=!1}}};e.SuggestAlternatives=y,y.OtherSuggestions=new L.RawContextKey("hasOtherSuggestions",!1),e.SuggestAlternatives=y=k=ke([ge(1,L.IContextKeyService)],y)}),define(se[770],oe([1,0,15]),function(te,e,L){"use strict";var k;Object.defineProperty(e,"__esModule",{value:!0}),e.WordContextKey=void 0;let y=k=class{constructor(S,p){this._editor=S,this._enabled=!1,this._ckAtEnd=k.AtEnd.bindTo(p),this._configListener=this._editor.onDidChangeConfiguration(_=>_.hasChanged(122)&&this._update()),this._update()}dispose(){var S;this._configListener.dispose(),(S=this._selectionListener)===null||S===void 0||S.dispose(),this._ckAtEnd.reset()}_update(){const S=this._editor.getOption(122)==="on";if(this._enabled!==S)if(this._enabled=S,this._enabled){const p=()=>{if(!this._editor.hasModel()){this._ckAtEnd.set(!1);return}const _=this._editor.getModel(),v=this._editor.getSelection(),b=_.getWordAtPosition(v.getStartPosition());if(!b){this._ckAtEnd.set(!1);return}this._ckAtEnd.set(b.endColumn===v.getStartPosition().column)};this._selectionListener=this._editor.onDidChangeCursorSelection(p),p()}else this._selectionListener&&(this._ckAtEnd.reset(),this._selectionListener.dispose(),this._selectionListener=void 0)}};e.WordContextKey=y,y.AtEnd=new L.RawContextKey("atEndOfWord",!1),e.WordContextKey=y=k=ke([ge(1,L.IContextKeyService)],y)}),define(se[69],oe([1,0,15,8]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CONTEXT_ACCESSIBILITY_MODE_ENABLED=e.IAccessibilityService=void 0,e.IAccessibilityService=(0,k.createDecorator)("accessibilityService"),e.CONTEXT_ACCESSIBILITY_MODE_ENABLED=new L.RawContextKey("accessibilityModeEnabled",!1)}),define(se[771],oe([1,0,54,13,6,2,55,17,328,335,492,202,36,149,235,69]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ComputedEditorOptions=e.EditorConfiguration=void 0;let u=class extends E.Disposable{constructor(h,m,C,w){super(),this._accessibilityService=w,this._onDidChange=this._register(new y.Emitter),this.onDidChange=this._onDidChange.event,this._onDidChangeFast=this._register(new y.Emitter),this.onDidChangeFast=this._onDidChangeFast.event,this._isDominatedByLongLines=!1,this._viewLineCount=1,this._lineNumbersDigitCount=1,this._reservedHeight=0,this._glyphMarginDecorationLaneCount=1,this._computeOptionsMemory=new i.ComputeOptionsMemory,this.isSimpleWidget=h,this._containerObserver=this._register(new _.ElementSizeObserver(C,m.dimension)),this._rawOptions=o(m),this._validatedOptions=l.validateOptions(this._rawOptions),this.options=this._computeOptions(),this.options.get(13)&&this._containerObserver.startObserving(),this._register(n.EditorZoom.onDidChangeZoomLevel(()=>this._recomputeOptions())),this._register(a.TabFocus.onDidChangeTabFocus(()=>this._recomputeOptions())),this._register(this._containerObserver.onDidChange(()=>this._recomputeOptions())),this._register(v.FontMeasurements.onDidChange(()=>this._recomputeOptions())),this._register(L.PixelRatio.onDidChange(()=>this._recomputeOptions())),this._register(this._accessibilityService.onDidChangeScreenReaderOptimized(()=>this._recomputeOptions()))}_recomputeOptions(){const h=this._computeOptions(),m=l.checkEquals(this.options,h);m!==null&&(this.options=h,this._onDidChangeFast.fire(m),this._onDidChange.fire(m))}_computeOptions(){const h=this._readEnvConfiguration(),m=t.BareFontInfo.createFromValidatedSettings(this._validatedOptions,h.pixelRatio,this.isSimpleWidget),C=this._readFontInfo(m),w={memory:this._computeOptionsMemory,outerWidth:h.outerWidth,outerHeight:h.outerHeight-this._reservedHeight,fontInfo:C,extraEditorClassName:h.extraEditorClassName,isDominatedByLongLines:this._isDominatedByLongLines,viewLineCount:this._viewLineCount,lineNumbersDigitCount:this._lineNumbersDigitCount,emptySelectionClipboard:h.emptySelectionClipboard,pixelRatio:h.pixelRatio,tabFocusMode:a.TabFocus.getTabFocusMode(),accessibilitySupport:h.accessibilitySupport,glyphMarginDecorationLaneCount:this._glyphMarginDecorationLaneCount};return l.computeOptions(this._validatedOptions,w)}_readEnvConfiguration(){return{extraEditorClassName:c(),outerWidth:this._containerObserver.getWidth(),outerHeight:this._containerObserver.getHeight(),emptySelectionClipboard:L.isWebKit||L.isFirefox,pixelRatio:L.PixelRatio.value,accessibilitySupport:this._accessibilityService.isScreenReaderOptimized()?2:this._accessibilityService.getAccessibilitySupport()}}_readFontInfo(h){return v.FontMeasurements.readFontInfo(h)}getRawOptions(){return this._rawOptions}updateOptions(h){const m=o(h);l.applyUpdate(this._rawOptions,m)&&(this._validatedOptions=l.validateOptions(this._rawOptions),this._recomputeOptions())}observeContainer(h){this._containerObserver.observe(h)}setIsDominatedByLongLines(h){this._isDominatedByLongLines!==h&&(this._isDominatedByLongLines=h,this._recomputeOptions())}setModelLineCount(h){const m=f(h);this._lineNumbersDigitCount!==m&&(this._lineNumbersDigitCount=m,this._recomputeOptions())}setViewLineCount(h){this._viewLineCount!==h&&(this._viewLineCount=h,this._recomputeOptions())}setReservedHeight(h){this._reservedHeight!==h&&(this._reservedHeight=h,this._recomputeOptions())}setGlyphMarginDecorationLaneCount(h){this._glyphMarginDecorationLaneCount!==h&&(this._glyphMarginDecorationLaneCount=h,this._recomputeOptions())}};e.EditorConfiguration=u,e.EditorConfiguration=u=ke([ge(3,r.IAccessibilityService)],u);function f(g){let h=0;for(;g;)g=Math.floor(g/10),h++;return h||1}function c(){let g="";return!L.isSafari&&!L.isWebkitWebView&&(g+="no-user-select "),L.isSafari&&(g+="no-minimap-shadow ",g+="enable-user-select "),p.isMacintosh&&(g+="mac "),g}class d{constructor(){this._values=[]}_read(h){return this._values[h]}get(h){return this._values[h]}_write(h,m){this._values[h]=m}}class s{constructor(){this._values=[]}_read(h){if(h>=this._values.length)throw new Error("Cannot read uninitialized value");return this._values[h]}get(h){return this._read(h)}_write(h,m){this._values[h]=m}}e.ComputedEditorOptions=s;class l{static validateOptions(h){const m=new d;for(const C of i.editorOptionsRegistry){const w=C.name==="_never_"?void 0:h[C.name];m._write(C.id,C.validate(w))}return m}static computeOptions(h,m){const C=new s;for(const w of i.editorOptionsRegistry)C._write(w.id,w.compute(m,C,h._read(w.id)));return C}static _deepEquals(h,m){if(typeof h!="object"||typeof m!="object"||!h||!m)return h===m;if(Array.isArray(h)||Array.isArray(m))return Array.isArray(h)&&Array.isArray(m)?k.equals(h,m):!1;if(Object.keys(h).length!==Object.keys(m).length)return!1;for(const C in h)if(!l._deepEquals(h[C],m[C]))return!1;return!0}static checkEquals(h,m){const C=[];let w=!1;for(const D of i.editorOptionsRegistry){const I=!l._deepEquals(h._read(D.id),m._read(D.id));C[D.id]=I,I&&(w=!0)}return w?new i.ConfigurationChangedEvent(C):null}static applyUpdate(h,m){let C=!1;for(const w of i.editorOptionsRegistry)if(m.hasOwnProperty(w.name)){const D=w.applyUpdate(h[w.name],m[w.name]);h[w.name]=D.newValue,C=C||D.didChange}return C}}function o(g){const h=S.deepClone(g);return(0,b.migrateOptions)(h),h}}),define(se[772],oe([1,0,6,52,2,55,199,22,738,25,27,15]),function(te,e,L,k,y,E,S,p,_,v,b,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.setContext=e.ContextKeyService=e.AbstractContextKeyService=e.Context=void 0;const i="data-keybinding-context";class n{constructor(D,I){this._id=D,this._parent=I,this._value=Object.create(null),this._value._contextId=D}get value(){return{...this._value}}setValue(D,I){return this._value[D]!==I?(this._value[D]=I,!0):!1}removeValue(D){return D in this._value?(delete this._value[D],!0):!1}getValue(D){const I=this._value[D];return typeof I>"u"&&this._parent?this._parent.getValue(D):I}}e.Context=n;class t extends n{constructor(){super(-1,null)}setValue(D,I){return!1}removeValue(D){return!1}getValue(D){}}t.INSTANCE=new t;class r extends n{constructor(D,I,T){super(D,null),this._configurationService=I,this._values=S.TernarySearchTree.forConfigKeys(),this._listener=this._configurationService.onDidChangeConfiguration(A=>{if(A.source===7){const P=Array.from(this._values,([N])=>N);this._values.clear(),T.fire(new c(P))}else{const P=[];for(const N of A.affectedKeys){const M=`config.${N}`,R=this._values.findSuperstr(M);R!==void 0&&(P.push(...k.Iterable.map(R,([x])=>x)),this._values.deleteSuperstr(M)),this._values.has(M)&&(P.push(M),this._values.delete(M))}T.fire(new c(P))}})}dispose(){this._listener.dispose()}getValue(D){if(D.indexOf(r._keyPrefix)!==0)return super.getValue(D);if(this._values.has(D))return this._values.get(D);const I=D.substr(r._keyPrefix.length),T=this._configurationService.getValue(I);let A;switch(typeof T){case"number":case"boolean":case"string":A=T;break;default:Array.isArray(T)?A=JSON.stringify(T):A=T}return this._values.set(D,A),A}setValue(D,I){return super.setValue(D,I)}removeValue(D){return super.removeValue(D)}}r._keyPrefix="config.";class u{constructor(D,I,T){this._service=D,this._key=I,this._defaultValue=T,this.reset()}set(D){this._service.setContext(this._key,D)}reset(){typeof this._defaultValue>"u"?this._service.removeContext(this._key):this._service.setContext(this._key,this._defaultValue)}get(){return this._service.getContextKeyValue(this._key)}}class f{constructor(D){this.key=D}affectsSome(D){return D.has(this.key)}allKeysContainedIn(D){return this.affectsSome(D)}}class c{constructor(D){this.keys=D}affectsSome(D){for(const I of this.keys)if(D.has(I))return!0;return!1}allKeysContainedIn(D){return this.keys.every(I=>D.has(I))}}class d{constructor(D){this.events=D}affectsSome(D){for(const I of this.events)if(I.affectsSome(D))return!0;return!1}allKeysContainedIn(D){return this.events.every(I=>I.allKeysContainedIn(D))}}function s(w,D){return w.allKeysContainedIn(new Set(Object.keys(D)))}class l extends y.Disposable{constructor(D){super(),this._onDidChangeContext=this._register(new L.PauseableEmitter({merge:I=>new d(I)})),this.onDidChangeContext=this._onDidChangeContext.event,this._isDisposed=!1,this._myContextId=D}createKey(D,I){if(this._isDisposed)throw new Error("AbstractContextKeyService has been disposed");return new u(this,D,I)}bufferChangeEvents(D){this._onDidChangeContext.pause();try{D()}finally{this._onDidChangeContext.resume()}}createScoped(D){if(this._isDisposed)throw new Error("AbstractContextKeyService has been disposed");return new g(this,D)}contextMatchesRules(D){if(this._isDisposed)throw new Error("AbstractContextKeyService has been disposed");const I=this.getContextValuesContainer(this._myContextId);return D?D.evaluate(I):!0}getContextKeyValue(D){if(!this._isDisposed)return this.getContextValuesContainer(this._myContextId).getValue(D)}setContext(D,I){if(this._isDisposed)return;const T=this.getContextValuesContainer(this._myContextId);T&&T.setValue(D,I)&&this._onDidChangeContext.fire(new f(D))}removeContext(D){this._isDisposed||this.getContextValuesContainer(this._myContextId).removeValue(D)&&this._onDidChangeContext.fire(new f(D))}getContext(D){return this._isDisposed?t.INSTANCE:this.getContextValuesContainer(h(D))}dispose(){super.dispose(),this._isDisposed=!0}}e.AbstractContextKeyService=l;let o=class extends l{constructor(D){super(0),this._contexts=new Map,this._lastContextId=0;const I=this._register(new r(this._myContextId,D,this._onDidChangeContext));this._contexts.set(this._myContextId,I)}getContextValuesContainer(D){return this._isDisposed?t.INSTANCE:this._contexts.get(D)||t.INSTANCE}createChildContext(D=this._myContextId){if(this._isDisposed)throw new Error("ContextKeyService has been disposed");const I=++this._lastContextId;return this._contexts.set(I,new n(I,this.getContextValuesContainer(D))),I}disposeContext(D){this._isDisposed||this._contexts.delete(D)}};e.ContextKeyService=o,e.ContextKeyService=o=ke([ge(0,b.IConfigurationService)],o);class g extends l{constructor(D,I){if(super(D.createChildContext()),this._parentChangeListener=this._register(new y.MutableDisposable),this._parent=D,this._updateParentChangeListener(),this._domNode=I,this._domNode.hasAttribute(i)){let T="";this._domNode.classList&&(T=Array.from(this._domNode.classList.values()).join(", ")),console.error(`Element already has context attribute${T?": "+T:""}`)}this._domNode.setAttribute(i,String(this._myContextId))}_updateParentChangeListener(){this._parentChangeListener.value=this._parent.onDidChangeContext(D=>{const T=this._parent.getContextValuesContainer(this._myContextId).value;s(D,T)||this._onDidChangeContext.fire(D)})}dispose(){this._isDisposed||(this._parent.disposeContext(this._myContextId),this._domNode.removeAttribute(i),super.dispose())}getContextValuesContainer(D){return this._isDisposed?t.INSTANCE:this._parent.getContextValuesContainer(D)}createChildContext(D=this._myContextId){if(this._isDisposed)throw new Error("ScopedContextKeyService has been disposed");return this._parent.createChildContext(D)}disposeContext(D){this._isDisposed||this._parent.disposeContext(D)}}function h(w){for(;w;){if(w.hasAttribute(i)){const D=w.getAttribute(i);return D?parseInt(D,10):NaN}w=w.parentElement}return 0}function m(w,D,I){w.get(a.IContextKeyService).createKey(String(D),C(I))}e.setContext=m;function C(w){return(0,E.cloneAndChange)(w,D=>{if(typeof D=="object"&&D.$mid===1)return p.URI.revive(D).toString();if(D instanceof p.URI)return D.toString()})}v.CommandsRegistry.registerCommand("_setContext",m),v.CommandsRegistry.registerCommand({id:"getContextKeyInfo",handler(){return[...a.RawContextKey.all()].sort((w,D)=>w.key.localeCompare(D.key))},metadata:{description:(0,_.localize)(0,null),args:[]}}),v.CommandsRegistry.registerCommand("_generateContextKeyInfo",function(){const w=[],D=new Set;for(const I of a.RawContextKey.all())D.has(I.key)||(D.add(I.key),w.push(I));w.sort((I,T)=>I.key.localeCompare(T.key)),console.log(JSON.stringify(w,void 0,2))})}),define(se[242],oe([1,0,17,740,15]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InputFocusedContext=e.InputFocusedContextKey=e.ProductQualityContext=e.IsDevelopmentContext=e.IsMobileContext=e.IsIOSContext=e.IsMacNativeContext=e.IsWebContext=e.IsWindowsContext=e.IsLinuxContext=e.IsMacContext=void 0,e.IsMacContext=new y.RawContextKey("isMac",L.isMacintosh,(0,k.localize)(0,null)),e.IsLinuxContext=new y.RawContextKey("isLinux",L.isLinux,(0,k.localize)(1,null)),e.IsWindowsContext=new y.RawContextKey("isWindows",L.isWindows,(0,k.localize)(2,null)),e.IsWebContext=new y.RawContextKey("isWeb",L.isWeb,(0,k.localize)(3,null)),e.IsMacNativeContext=new y.RawContextKey("isMacNative",L.isMacintosh&&!L.isWeb,(0,k.localize)(4,null)),e.IsIOSContext=new y.RawContextKey("isIOS",L.isIOS,(0,k.localize)(5,null)),e.IsMobileContext=new y.RawContextKey("isMobile",L.isMobile,(0,k.localize)(6,null)),e.IsDevelopmentContext=new y.RawContextKey("isDevelopment",!1,!0),e.ProductQualityContext=new y.RawContextKey("productQualityType","",(0,k.localize)(7,null)),e.InputFocusedContextKey="inputFocus",e.InputFocusedContext=new y.RawContextKey(e.InputFocusedContextKey,!1,(0,k.localize)(8,null))}),define(se[59],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IContextMenuService=e.IContextViewService=void 0,e.IContextViewService=(0,L.createDecorator)("contextViewService"),e.IContextMenuService=(0,L.createDecorator)("contextMenuService")}),define(se[162],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IDialogService=void 0,e.IDialogService=(0,L.createDecorator)("dialogService")}),define(se[243],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IEnvironmentService=void 0,e.IEnvironmentService=(0,L.createDecorator)("environmentService")}),define(se[244],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IHoverService=void 0,e.IHoverService=(0,L.createDecorator)("hoverService")}),define(se[163],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ServiceCollection=void 0;class L{constructor(...y){this._entries=new Map;for(const[E,S]of y)this.set(E,S)}set(y,E){const S=this._entries.get(y);return this._entries.set(y,E),S}get(y){return this._entries.get(y)}}e.ServiceCollection=L}),define(se[773],oe([1,0,14,12,2,236,762,8,163,66]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Trace=e.InstantiationService=void 0;const b=!1;class a extends Error{constructor(r){var u;super("cyclic dependency between services"),this.message=(u=r.findCycleSlow())!==null&&u!==void 0?u:`UNABLE to detect cycle, dumping graph: 
+${r.toString()}`}}class i{constructor(r=new _.ServiceCollection,u=!1,f,c=b){var d;this._services=r,this._strict=u,this._parent=f,this._enableTracing=c,this._activeInstantiations=new Set,this._services.set(p.IInstantiationService,this),this._globalGraph=c?(d=f?._globalGraph)!==null&&d!==void 0?d:new S.Graph(s=>s):void 0}createChild(r){return new i(r,this._strict,this,this._enableTracing)}invokeFunction(r,...u){const f=n.traceInvocation(this._enableTracing,r);let c=!1;try{return r({get:s=>{if(c)throw(0,k.illegalState)("service accessor is only valid during the invocation of its target method");const l=this._getOrCreateServiceInstance(s,f);if(!l)throw new Error(`[invokeFunction] unknown service '${s}'`);return l}},...u)}finally{c=!0,f.stop()}}createInstance(r,...u){let f,c;return r instanceof E.SyncDescriptor?(f=n.traceCreation(this._enableTracing,r.ctor),c=this._createInstance(r.ctor,r.staticArguments.concat(u),f)):(f=n.traceCreation(this._enableTracing,r),c=this._createInstance(r,u,f)),f.stop(),c}_createInstance(r,u=[],f){const c=p._util.getServiceDependencies(r).sort((l,o)=>l.index-o.index),d=[];for(const l of c){const o=this._getOrCreateServiceInstance(l.id,f);o||this._throwIfStrict(`[createInstance] ${r.name} depends on UNKNOWN service ${l.id}.`,!1),d.push(o)}const s=c.length>0?c[0].index:u.length;if(u.length!==s){console.trace(`[createInstance] First service dependency of ${r.name} at position ${s+1} conflicts with ${u.length} static arguments`);const l=s-u.length;l>0?u=u.concat(new Array(l)):u=u.slice(0,s)}return Reflect.construct(r,u.concat(d))}_setServiceInstance(r,u){if(this._services.get(r)instanceof E.SyncDescriptor)this._services.set(r,u);else if(this._parent)this._parent._setServiceInstance(r,u);else throw new Error("illegalState - setting UNKNOWN service instance")}_getServiceInstanceOrDescriptor(r){const u=this._services.get(r);return!u&&this._parent?this._parent._getServiceInstanceOrDescriptor(r):u}_getOrCreateServiceInstance(r,u){this._globalGraph&&this._globalGraphImplicitDependency&&this._globalGraph.insertEdge(this._globalGraphImplicitDependency,String(r));const f=this._getServiceInstanceOrDescriptor(r);return f instanceof E.SyncDescriptor?this._safeCreateAndCacheServiceInstance(r,f,u.branch(r,!0)):(u.branch(r,!1),f)}_safeCreateAndCacheServiceInstance(r,u,f){if(this._activeInstantiations.has(r))throw new Error(`illegal state - RECURSIVELY instantiating service '${r}'`);this._activeInstantiations.add(r);try{return this._createAndCacheServiceInstance(r,u,f)}finally{this._activeInstantiations.delete(r)}}_createAndCacheServiceInstance(r,u,f){var c;const d=new S.Graph(o=>o.id.toString());let s=0;const l=[{id:r,desc:u,_trace:f}];for(;l.length;){const o=l.pop();if(d.lookupOrInsertNode(o),s++>1e3)throw new a(d);for(const g of p._util.getServiceDependencies(o.desc.ctor)){const h=this._getServiceInstanceOrDescriptor(g.id);if(h||this._throwIfStrict(`[createInstance] ${r} depends on ${g.id} which is NOT registered.`,!0),(c=this._globalGraph)===null||c===void 0||c.insertEdge(String(o.id),String(g.id)),h instanceof E.SyncDescriptor){const m={id:g.id,desc:h,_trace:o._trace.branch(g.id,!0)};d.insertEdge(o,m),l.push(m)}}}for(;;){const o=d.roots();if(o.length===0){if(!d.isEmpty())throw new a(d);break}for(const{data:g}of o){if(this._getServiceInstanceOrDescriptor(g.id)instanceof E.SyncDescriptor){const m=this._createServiceInstanceWithOwner(g.id,g.desc.ctor,g.desc.staticArguments,g.desc.supportsDelayedInstantiation,g._trace);this._setServiceInstance(g.id,m)}d.removeNode(g)}}return this._getServiceInstanceOrDescriptor(r)}_createServiceInstanceWithOwner(r,u,f=[],c,d){if(this._services.get(r)instanceof E.SyncDescriptor)return this._createServiceInstance(r,u,f,c,d);if(this._parent)return this._parent._createServiceInstanceWithOwner(r,u,f,c,d);throw new Error(`illegalState - creating UNKNOWN service instance ${u.name}`)}_createServiceInstance(r,u,f=[],c,d){if(c){const s=new i(void 0,this._strict,this,this._enableTracing);s._globalGraphImplicitDependency=String(r);const l=new Map,o=new L.GlobalIdleValue(()=>{const g=s._createInstance(u,f,d);for(const[h,m]of l){const C=g[h];if(typeof C=="function")for(const w of m)w.disposable=C.apply(g,w.listener)}return l.clear(),g});return new Proxy(Object.create(null),{get(g,h){if(!o.isInitialized&&typeof h=="string"&&(h.startsWith("onDid")||h.startsWith("onWill"))){let w=l.get(h);return w||(w=new v.LinkedList,l.set(h,w)),(I,T,A)=>{if(o.isInitialized)return o.value[h](I,T,A);{const P={listener:[I,T,A],disposable:void 0},N=w.push(P);return(0,y.toDisposable)(()=>{var R;N(),(R=P.disposable)===null||R===void 0||R.dispose()})}}}if(h in g)return g[h];const m=o.value;let C=m[h];return typeof C!="function"||(C=C.bind(m),g[h]=C),C},set(g,h,m){return o.value[h]=m,!0},getPrototypeOf(g){return u.prototype}})}else return this._createInstance(u,f,d)}_throwIfStrict(r,u){if(u&&console.warn(r),this._strict)throw new Error(r)}}e.InstantiationService=i;class n{static traceInvocation(r,u){return r?new n(2,u.name||new Error().stack.split(`
+`).slice(3,4).join(`
+`)):n._None}static traceCreation(r,u){return r?new n(1,u.name):n._None}constructor(r,u){this.type=r,this.name=u,this._start=Date.now(),this._dep=[]}branch(r,u){const f=new n(3,r.toString());return this._dep.push([r,u,f]),f}stop(){const r=Date.now()-this._start;n._totals+=r;let u=!1;function f(d,s){const l=[],o=new Array(d+1).join("	");for(const[g,h,m]of s._dep)if(h&&m){u=!0,l.push(`${o}CREATES -> ${g}`);const C=f(d+1,m);C&&l.push(C)}else l.push(`${o}uses -> ${g}`);return l.join(`
+`)}const c=[`${this.type===1?"CREATE":"CALL"} ${this.name}`,`${f(1,this)}`,`DONE, took ${r.toFixed(2)}ms (grand total ${n._totals.toFixed(2)}ms)`];(r>2||u)&&n.all.add(c.join(`
+`))}}e.Trace=n,n.all=new Set,n._None=new class extends n{constructor(){super(0,null)}stop(){}branch(){return this}},n._totals=0}),define(se[774],oe([1,0,12,218,125]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BaseResolvedKeybinding=void 0;class E extends y.ResolvedKeybinding{constructor(p,_){if(super(),_.length===0)throw(0,L.illegalArgument)("chords");this._os=p,this._chords=_}getLabel(){return k.UILabelProvider.toLabel(this._os,this._chords,p=>this._getLabel(p))}getAriaLabel(){return k.AriaLabelProvider.toLabel(this._os,this._chords,p=>this._getAriaLabel(p))}getElectronAccelerator(){return this._chords.length>1||this._chords[0].isDuplicateModifierCase()?null:k.ElectronAcceleratorLabelProvider.toLabel(this._os,this._chords,p=>this._getElectronAccelerator(p))}getUserSettingsLabel(){return k.UserSettingsLabelProvider.toLabel(this._os,this._chords,p=>this._getUserSettingsLabel(p))}hasMultipleChords(){return this._chords.length>1}getChords(){return this._chords.map(p=>this._getChord(p))}_getChord(p){return new y.ResolvedChord(p.ctrlKey,p.shiftKey,p.altKey,p.metaKey,this._getLabel(p),this._getAriaLabel(p))}getDispatchChords(){return this._chords.map(p=>this._getChordDispatch(p))}getSingleModifierDispatchChords(){return this._chords.map(p=>this._getSingleModifierChordDispatch(p))}}e.BaseResolvedKeybinding=E}),define(se[34],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IKeybindingService=void 0,e.IKeybindingService=(0,L.createDecorator)("keybindingService")}),define(se[346],oe([1,0,7,229,42,6,2,136,239,15,59,8,34,458]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.PostEditWidgetManager=void 0;let t=n=class extends S.Disposable{constructor(f,c,d,s,l,o,g,h,m,C){super(),this.typeId=f,this.editor=c,this.showCommand=s,this.range=l,this.edits=o,this.onSelectNewEdit=g,this._contextMenuService=h,this._keybindingService=C,this.allowEditorOverflow=!0,this.suppressMouseDown=!0,this.create(),this.visibleContext=d.bindTo(m),this.visibleContext.set(!0),this._register((0,S.toDisposable)(()=>this.visibleContext.reset())),this.editor.addContentWidget(this),this.editor.layoutContentWidget(this),this._register((0,S.toDisposable)(()=>this.editor.removeContentWidget(this))),this._register(this.editor.onDidChangeCursorPosition(w=>{l.containsPosition(w.position)||this.dispose()})),this._register(E.Event.runAndSubscribe(C.onDidUpdateKeybindings,()=>{this._updateButtonTitle()}))}_updateButtonTitle(){var f;const c=(f=this._keybindingService.lookupKeybinding(this.showCommand.id))===null||f===void 0?void 0:f.getLabel();this.button.element.title=this.showCommand.label+(c?` (${c})`:"")}create(){this.domNode=L.$(".post-edit-widget"),this.button=this._register(new k.Button(this.domNode,{supportIcons:!0})),this.button.label="$(insert)",this._register(L.addDisposableListener(this.domNode,L.EventType.CLICK,()=>this.showSelector()))}getId(){return n.baseId+"."+this.typeId}getDomNode(){return this.domNode}getPosition(){return{position:this.range.getEndPosition(),preference:[2]}}showSelector(){this._contextMenuService.showContextMenu({getAnchor:()=>{const f=L.getDomNodePagePosition(this.button.element);return{x:f.left+f.width,y:f.top+f.height}},getActions:()=>this.edits.allEdits.map((f,c)=>(0,y.toAction)({id:"",label:f.label,checked:c===this.edits.activeEditIndex,run:()=>{if(c!==this.edits.activeEditIndex)return this.onSelectNewEdit(c)}}))})}};t.baseId="editor.widget.postEditWidget",t=n=ke([ge(7,b.IContextMenuService),ge(8,v.IContextKeyService),ge(9,i.IKeybindingService)],t);let r=class extends S.Disposable{constructor(f,c,d,s,l,o){super(),this._id=f,this._editor=c,this._visibleContext=d,this._showCommand=s,this._instantiationService=l,this._bulkEditService=o,this._currentWidget=this._register(new S.MutableDisposable),this._register(E.Event.any(c.onDidChangeModel,c.onDidChangeModelContent)(()=>this.clear()))}async applyEditAndShowIfNeeded(f,c,d,s){const l=this._editor.getModel();if(!l||!f.length)return;const o=c.allEdits[c.activeEditIndex];if(!o)return;const g=(0,_.createCombinedWorkspaceEdit)(l.uri,f,o),h=f[0],m=l.deltaDecorations([],[{range:h,options:{description:"paste-line-suffix",stickiness:0}}]);let C,w;try{C=await this._bulkEditService.apply(g,{editor:this._editor,token:s}),w=l.getDecorationRange(m[0])}finally{l.deltaDecorations(m,[])}d&&C.isApplied&&c.allEdits.length>1&&this.show(w??h,c,async D=>{const I=this._editor.getModel();I&&(await I.undo(),this.applyEditAndShowIfNeeded(f,{activeEditIndex:D,allEdits:c.allEdits},d,s))})}show(f,c,d){this.clear(),this._editor.hasModel()&&(this._currentWidget.value=this._instantiationService.createInstance(t,this._id,this._editor,this._visibleContext,this._showCommand,f,c,d))}clear(){this._currentWidget.clear()}tryShowSelector(){var f;(f=this._currentWidget.value)===null||f===void 0||f.showSelector()}};e.PostEditWidgetManager=r,e.PostEditWidgetManager=r=ke([ge(4,a.IInstantiationService),ge(5,p.IBulkEditService)],r)}),define(se[347],oe([1,0,15]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.KeybindingResolver=e.NoMatchingKb=void 0,e.NoMatchingKb={kind:0};const k={kind:1};function y(_,v,b){return{kind:2,commandId:_,commandArgs:v,isBubble:b}}class E{constructor(v,b,a){var i;this._log=a,this._defaultKeybindings=v,this._defaultBoundCommands=new Map;for(const n of v){const t=n.command;t&&t.charAt(0)!=="-"&&this._defaultBoundCommands.set(t,!0)}this._map=new Map,this._lookupMap=new Map,this._keybindings=E.handleRemovals([].concat(v).concat(b));for(let n=0,t=this._keybindings.length;n<t;n++){const r=this._keybindings[n];if(r.chords.length===0)continue;const u=(i=r.when)===null||i===void 0?void 0:i.substituteConstants();u&&u.type===0||this._addKeyPress(r.chords[0],r)}}static _isTargetedForRemoval(v,b,a){if(b){for(let i=0;i<b.length;i++)if(b[i]!==v.chords[i])return!1}return!(a&&a.type!==1&&(!v.when||!(0,L.expressionsAreEqualWithConstantSubstitution)(a,v.when)))}static handleRemovals(v){const b=new Map;for(let i=0,n=v.length;i<n;i++){const t=v[i];if(t.command&&t.command.charAt(0)==="-"){const r=t.command.substring(1);b.has(r)?b.get(r).push(t):b.set(r,[t])}}if(b.size===0)return v;const a=[];for(let i=0,n=v.length;i<n;i++){const t=v[i];if(!t.command||t.command.length===0){a.push(t);continue}if(t.command.charAt(0)==="-")continue;const r=b.get(t.command);if(!r||!t.isDefault){a.push(t);continue}let u=!1;for(const f of r){const c=f.when;if(this._isTargetedForRemoval(t,f.chords,c)){u=!0;break}}if(!u){a.push(t);continue}}return a}_addKeyPress(v,b){const a=this._map.get(v);if(typeof a>"u"){this._map.set(v,[b]),this._addToLookupMap(b);return}for(let i=a.length-1;i>=0;i--){const n=a[i];if(n.command===b.command)continue;let t=!0;for(let r=1;r<n.chords.length&&r<b.chords.length;r++)if(n.chords[r]!==b.chords[r]){t=!1;break}t&&E.whenIsEntirelyIncluded(n.when,b.when)&&this._removeFromLookupMap(n)}a.push(b),this._addToLookupMap(b)}_addToLookupMap(v){if(!v.command)return;let b=this._lookupMap.get(v.command);typeof b>"u"?(b=[v],this._lookupMap.set(v.command,b)):b.push(v)}_removeFromLookupMap(v){if(!v.command)return;const b=this._lookupMap.get(v.command);if(!(typeof b>"u")){for(let a=0,i=b.length;a<i;a++)if(b[a]===v){b.splice(a,1);return}}}static whenIsEntirelyIncluded(v,b){return!b||b.type===1?!0:!v||v.type===1?!1:(0,L.implies)(v,b)}getKeybindings(){return this._keybindings}lookupPrimaryKeybinding(v,b){const a=this._lookupMap.get(v);if(typeof a>"u"||a.length===0)return null;if(a.length===1)return a[0];for(let i=a.length-1;i>=0;i--){const n=a[i];if(b.contextMatchesRules(n.when))return n}return a[a.length-1]}resolve(v,b,a){const i=[...b,a];this._log(`| Resolving ${i}`);const n=this._map.get(i[0]);if(n===void 0)return this._log("\\ No keybinding entries."),e.NoMatchingKb;let t=null;if(i.length<2)t=n;else{t=[];for(let u=0,f=n.length;u<f;u++){const c=n[u];if(i.length>c.chords.length)continue;let d=!0;for(let s=1;s<i.length;s++)if(c.chords[s]!==i[s]){d=!1;break}d&&t.push(c)}}const r=this._findCommand(v,t);return r?i.length<r.chords.length?(this._log(`\\ From ${t.length} keybinding entries, awaiting ${r.chords.length-i.length} more chord(s), when: ${S(r.when)}, source: ${p(r)}.`),k):(this._log(`\\ From ${t.length} keybinding entries, matched ${r.command}, when: ${S(r.when)}, source: ${p(r)}.`),y(r.command,r.commandArgs,r.bubble)):(this._log(`\\ From ${t.length} keybinding entries, no when clauses matched the context.`),e.NoMatchingKb)}_findCommand(v,b){for(let a=b.length-1;a>=0;a--){const i=b[a];if(E._contextMatchesRules(v,i.when))return i}return null}static _contextMatchesRules(v,b){return b?b.evaluate(v):!0}}e.KeybindingResolver=E;function S(_){return _?`${_.serialize()}`:"no when condition"}function p(_){return _.extensionId?_.isBuiltinExtension?`built-in extension ${_.extensionId}`:`user extension ${_.extensionId}`:_.isDefault?"built-in":"user"}}),define(se[775],oe([1,0,14,12,6,270,2,743,347]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractKeybindingService=void 0;const v=/^(cursor|delete|undo|redo|tab|editor\.action\.clipboard)/;class b extends S.Disposable{get onDidUpdateKeybindings(){return this._onDidUpdateKeybindings?this._onDidUpdateKeybindings.event:y.Event.None}get inChordMode(){return this._currentChords.length>0}constructor(n,t,r,u,f){super(),this._contextKeyService=n,this._commandService=t,this._telemetryService=r,this._notificationService=u,this._logService=f,this._onDidUpdateKeybindings=this._register(new y.Emitter),this._currentChords=[],this._currentChordChecker=new L.IntervalTimer,this._currentChordStatusMessage=null,this._ignoreSingleModifiers=a.EMPTY,this._currentSingleModifier=null,this._currentSingleModifierClearTimeout=new L.TimeoutTimer,this._currentlyDispatchingCommandId=null,this._logging=!1}dispose(){super.dispose()}_log(n){this._logging&&this._logService.info(`[KeybindingService]: ${n}`)}getKeybindings(){return this._getResolver().getKeybindings()}lookupKeybinding(n,t){const r=this._getResolver().lookupPrimaryKeybinding(n,t||this._contextKeyService);if(r)return r.resolvedKeybinding}dispatchEvent(n,t){return this._dispatch(n,t)}softDispatch(n,t){this._log("/ Soft dispatching keyboard event");const r=this.resolveKeyboardEvent(n);if(r.hasMultipleChords())return console.warn("keyboard event should not be mapped to multiple chords"),_.NoMatchingKb;const[u]=r.getDispatchChords();if(u===null)return this._log("\\ Keyboard event cannot be dispatched"),_.NoMatchingKb;const f=this._contextKeyService.getContext(t),c=this._currentChords.map(({keypress:d})=>d);return this._getResolver().resolve(f,c,u)}_scheduleLeaveChordMode(){const n=Date.now();this._currentChordChecker.cancelAndSet(()=>{if(!this._documentHasFocus()){this._leaveChordMode();return}Date.now()-n>5e3&&this._leaveChordMode()},500)}_expectAnotherChord(n,t){switch(this._currentChords.push({keypress:n,label:t}),this._currentChords.length){case 0:throw(0,k.illegalState)("impossible");case 1:this._currentChordStatusMessage=this._notificationService.status(p.localize(0,null,t));break;default:{const r=this._currentChords.map(({label:u})=>u).join(", ");this._currentChordStatusMessage=this._notificationService.status(p.localize(1,null,r))}}this._scheduleLeaveChordMode(),E.IME.enabled&&E.IME.disable()}_leaveChordMode(){this._currentChordStatusMessage&&(this._currentChordStatusMessage.dispose(),this._currentChordStatusMessage=null),this._currentChordChecker.cancel(),this._currentChords=[],E.IME.enable()}_dispatch(n,t){return this._doDispatch(this.resolveKeyboardEvent(n),t,!1)}_singleModifierDispatch(n,t){const r=this.resolveKeyboardEvent(n),[u]=r.getSingleModifierDispatchChords();if(u)return this._ignoreSingleModifiers.has(u)?(this._log(`+ Ignoring single modifier ${u} due to it being pressed together with other keys.`),this._ignoreSingleModifiers=a.EMPTY,this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,!1):(this._ignoreSingleModifiers=a.EMPTY,this._currentSingleModifier===null?(this._log(`+ Storing single modifier for possible chord ${u}.`),this._currentSingleModifier=u,this._currentSingleModifierClearTimeout.cancelAndSet(()=>{this._log("+ Clearing single modifier due to 300ms elapsed."),this._currentSingleModifier=null},300),!1):u===this._currentSingleModifier?(this._log(`/ Dispatching single modifier chord ${u} ${u}`),this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,this._doDispatch(r,t,!0)):(this._log(`+ Clearing single modifier due to modifier mismatch: ${this._currentSingleModifier} ${u}`),this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,!1));const[f]=r.getChords();return this._ignoreSingleModifiers=new a(f),this._currentSingleModifier!==null&&this._log("+ Clearing single modifier due to other key up."),this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,!1}_doDispatch(n,t,r=!1){var u;let f=!1;if(n.hasMultipleChords())return console.warn("Unexpected keyboard event mapped to multiple chords"),!1;let c=null,d=null;if(r){const[g]=n.getSingleModifierDispatchChords();c=g,d=g?[g]:[]}else[c]=n.getDispatchChords(),d=this._currentChords.map(({keypress:g})=>g);if(c===null)return this._log("\\ Keyboard event cannot be dispatched in keydown phase."),f;const s=this._contextKeyService.getContext(t),l=n.getLabel(),o=this._getResolver().resolve(s,d,c);switch(o.kind){case 0:{if(this._logService.trace("KeybindingService#dispatch",l,"[ No matching keybinding ]"),this.inChordMode){const g=this._currentChords.map(({label:h})=>h).join(", ");this._log(`+ Leaving multi-chord mode: Nothing bound to "${g}, ${l}".`),this._notificationService.status(p.localize(2,null,g,l),{hideAfter:10*1e3}),this._leaveChordMode(),f=!0}return f}case 1:return this._logService.trace("KeybindingService#dispatch",l,"[ Several keybindings match - more chords needed ]"),f=!0,this._expectAnotherChord(c,l),this._log(this._currentChords.length===1?"+ Entering multi-chord mode...":"+ Continuing multi-chord mode..."),f;case 2:{if(this._logService.trace("KeybindingService#dispatch",l,`[ Will dispatch command ${o.commandId} ]`),o.commandId===null||o.commandId===""){if(this.inChordMode){const g=this._currentChords.map(({label:h})=>h).join(", ");this._log(`+ Leaving chord mode: Nothing bound to "${g}, ${l}".`),this._notificationService.status(p.localize(3,null,g,l),{hideAfter:10*1e3}),this._leaveChordMode(),f=!0}}else{this.inChordMode&&this._leaveChordMode(),o.isBubble||(f=!0),this._log(`+ Invoking command ${o.commandId}.`),this._currentlyDispatchingCommandId=o.commandId;try{typeof o.commandArgs>"u"?this._commandService.executeCommand(o.commandId).then(void 0,g=>this._notificationService.warn(g)):this._commandService.executeCommand(o.commandId,o.commandArgs).then(void 0,g=>this._notificationService.warn(g))}finally{this._currentlyDispatchingCommandId=null}v.test(o.commandId)||this._telemetryService.publicLog2("workbenchActionExecuted",{id:o.commandId,from:"keybinding",detail:(u=n.getUserSettingsLabel())!==null&&u!==void 0?u:void 0})}return f}}}mightProducePrintableCharacter(n){return n.ctrlKey||n.metaKey?!1:n.keyCode>=31&&n.keyCode<=56||n.keyCode>=21&&n.keyCode<=30}}e.AbstractKeybindingService=b;class a{constructor(n){this._ctrlKey=n?n.ctrlKey:!1,this._shiftKey=n?n.shiftKey:!1,this._altKey=n?n.altKey:!1,this._metaKey=n?n.metaKey:!1}has(n){switch(n){case"ctrl":return this._ctrlKey;case"shift":return this._shiftKey;case"alt":return this._altKey;case"meta":return this._metaKey}}}a.EMPTY=new a(null)}),define(se[348],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toEmptyArrayIfContainsNull=e.ResolvedKeybindingItem=void 0;class L{constructor(E,S,p,_,v,b,a){this._resolvedKeybindingItemBrand=void 0,this.resolvedKeybinding=E,this.chords=E?k(E.getDispatchChords()):[],E&&this.chords.length===0&&(this.chords=k(E.getSingleModifierDispatchChords())),this.bubble=S?S.charCodeAt(0)===94:!1,this.command=this.bubble?S.substr(1):S,this.commandArgs=p,this.when=_,this.isDefault=v,this.extensionId=b,this.isBuiltinExtension=a}}e.ResolvedKeybindingItem=L;function k(y){const E=[];for(let S=0,p=y.length;S<p;S++){const _=y[S];if(!_)return[];E.push(_)}return E}e.toEmptyArrayIfContainsNull=k}),define(se[776],oe([1,0,65,125,774,348]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.USLayoutResolvedKeybinding=void 0;class S extends y.BaseResolvedKeybinding{constructor(_,v){super(v,_)}_keyCodeToUILabel(_){if(this._os===2)switch(_){case 15:return"\u2190";case 16:return"\u2191";case 17:return"\u2192";case 18:return"\u2193"}return L.KeyCodeUtils.toString(_)}_getLabel(_){return _.isDuplicateModifierCase()?"":this._keyCodeToUILabel(_.keyCode)}_getAriaLabel(_){return _.isDuplicateModifierCase()?"":L.KeyCodeUtils.toString(_.keyCode)}_getElectronAccelerator(_){return L.KeyCodeUtils.toElectronAccelerator(_.keyCode)}_getUserSettingsLabel(_){if(_.isDuplicateModifierCase())return"";const v=L.KeyCodeUtils.toUserSettingsUS(_.keyCode);return v&&v.toLowerCase()}_getChordDispatch(_){return S.getDispatchStr(_)}static getDispatchStr(_){if(_.isModifierKey())return null;let v="";return _.ctrlKey&&(v+="ctrl+"),_.shiftKey&&(v+="shift+"),_.altKey&&(v+="alt+"),_.metaKey&&(v+="meta+"),v+=L.KeyCodeUtils.toString(_.keyCode),v}_getSingleModifierChordDispatch(_){return _.keyCode===5&&!_.shiftKey&&!_.altKey&&!_.metaKey?"ctrl":_.keyCode===4&&!_.ctrlKey&&!_.altKey&&!_.metaKey?"shift":_.keyCode===6&&!_.ctrlKey&&!_.shiftKey&&!_.metaKey?"alt":_.keyCode===57&&!_.ctrlKey&&!_.shiftKey&&!_.altKey?"meta":null}static _scanCodeToKeyCode(_){const v=L.IMMUTABLE_CODE_TO_KEY_CODE[_];if(v!==-1)return v;switch(_){case 10:return 31;case 11:return 32;case 12:return 33;case 13:return 34;case 14:return 35;case 15:return 36;case 16:return 37;case 17:return 38;case 18:return 39;case 19:return 40;case 20:return 41;case 21:return 42;case 22:return 43;case 23:return 44;case 24:return 45;case 25:return 46;case 26:return 47;case 27:return 48;case 28:return 49;case 29:return 50;case 30:return 51;case 31:return 52;case 32:return 53;case 33:return 54;case 34:return 55;case 35:return 56;case 36:return 22;case 37:return 23;case 38:return 24;case 39:return 25;case 40:return 26;case 41:return 27;case 42:return 28;case 43:return 29;case 44:return 30;case 45:return 21;case 51:return 88;case 52:return 86;case 53:return 92;case 54:return 94;case 55:return 93;case 56:return 0;case 57:return 85;case 58:return 95;case 59:return 91;case 60:return 87;case 61:return 89;case 62:return 90;case 106:return 97}return 0}static _toKeyCodeChord(_){if(!_)return null;if(_ instanceof k.KeyCodeChord)return _;const v=this._scanCodeToKeyCode(_.scanCode);return v===0?null:new k.KeyCodeChord(_.ctrlKey,_.shiftKey,_.altKey,_.metaKey,v)}static resolveKeybinding(_,v){const b=(0,E.toEmptyArrayIfContainsNull)(_.chords.map(a=>this._toKeyCodeChord(a)));return b.length>0?[new S(b,v)]:[]}}e.USLayoutResolvedKeybinding=S}),define(se[164],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ILabelService=void 0,e.ILabelService=(0,L.createDecorator)("labelService")}),define(se[123],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ILayoutService=void 0,e.ILayoutService=(0,L.createDecorator)("layoutService")}),define(se[349],oe([1,0,7,44,13,6,33,45,123]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorScopedLayoutService=void 0;let v=class{get mainContainer(){var i,n;return(n=(i=(0,y.firstOrDefault)(this._codeEditorService.listCodeEditors()))===null||i===void 0?void 0:i.getContainerDomNode())!==null&&n!==void 0?n:k.mainWindow.document.body}get activeContainer(){var i,n;const t=(i=this._codeEditorService.getFocusedCodeEditor())!==null&&i!==void 0?i:this._codeEditorService.getActiveCodeEditor();return(n=t?.getContainerDomNode())!==null&&n!==void 0?n:this.mainContainer}get mainContainerDimension(){return L.getClientArea(this.mainContainer)}get activeContainerDimension(){return L.getClientArea(this.activeContainer)}get containers(){return(0,y.coalesce)(this._codeEditorService.listCodeEditors().map(i=>i.getContainerDomNode()))}getContainer(){return this.activeContainer}focus(){var i;(i=this._codeEditorService.getFocusedCodeEditor())===null||i===void 0||i.focus()}constructor(i){this._codeEditorService=i,this.onDidLayoutMainContainer=E.Event.None,this.onDidLayoutActiveContainer=E.Event.None,this.onDidLayoutContainer=E.Event.None,this.onDidChangeActiveContainer=E.Event.None,this.onDidAddContainer=E.Event.None,this.whenActiveContainerStylesLoaded=Promise.resolve(),this.mainContainerOffset={top:0,quickPickTop:0},this.activeContainerOffset={top:0,quickPickTop:0}}};v=ke([ge(0,S.ICodeEditorService)],v);let b=class extends v{get mainContainer(){return this._container}constructor(i,n){super(n),this._container=i}};e.EditorScopedLayoutService=b,e.EditorScopedLayoutService=b=ke([ge(1,S.ICodeEditorService)],b),(0,p.registerSingleton)(_.ILayoutService,v,1)}),define(se[777],oe([1,0,7,44,6,2,69,27,15,123]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AccessibilityService=void 0;let b=class extends E.Disposable{constructor(i,n,t){super(),this._contextKeyService=i,this._layoutService=n,this._configurationService=t,this._accessibilitySupport=0,this._onDidChangeScreenReaderOptimized=new y.Emitter,this._onDidChangeReducedMotion=new y.Emitter,this._accessibilityModeEnabledContext=S.CONTEXT_ACCESSIBILITY_MODE_ENABLED.bindTo(this._contextKeyService);const r=()=>this._accessibilityModeEnabledContext.set(this.isScreenReaderOptimized());this._register(this._configurationService.onDidChangeConfiguration(f=>{f.affectsConfiguration("editor.accessibilitySupport")&&(r(),this._onDidChangeScreenReaderOptimized.fire()),f.affectsConfiguration("workbench.reduceMotion")&&(this._configMotionReduced=this._configurationService.getValue("workbench.reduceMotion"),this._onDidChangeReducedMotion.fire())})),r(),this._register(this.onDidChangeScreenReaderOptimized(()=>r()));const u=k.mainWindow.matchMedia("(prefers-reduced-motion: reduce)");this._systemMotionReduced=u.matches,this._configMotionReduced=this._configurationService.getValue("workbench.reduceMotion"),this.initReducedMotionListeners(u)}initReducedMotionListeners(i){this._register((0,L.addDisposableListener)(i,"change",()=>{this._systemMotionReduced=i.matches,this._configMotionReduced==="auto"&&this._onDidChangeReducedMotion.fire()}));const n=()=>{const t=this.isMotionReduced();this._layoutService.mainContainer.classList.toggle("reduce-motion",t),this._layoutService.mainContainer.classList.toggle("enable-motion",!t)};n(),this._register(this.onDidChangeReducedMotion(()=>n()))}get onDidChangeScreenReaderOptimized(){return this._onDidChangeScreenReaderOptimized.event}isScreenReaderOptimized(){const i=this._configurationService.getValue("editor.accessibilitySupport");return i==="on"||i==="auto"&&this._accessibilitySupport===2}get onDidChangeReducedMotion(){return this._onDidChangeReducedMotion.event}isMotionReduced(){const i=this._configMotionReduced;return i==="on"||i==="auto"&&this._systemMotionReduced}getAccessibilitySupport(){return this._accessibilitySupport}};e.AccessibilityService=b,e.AccessibilityService=b=ke([ge(0,_.IContextKeyService),ge(1,v.ILayoutService),ge(2,p.IConfigurationService)],b)}),define(se[778],oe([1,0,318,2,123,7]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextViewService=void 0;let S=class extends k.Disposable{constructor(_){super(),this.layoutService=_,this.currentViewDisposable=k.Disposable.None,this.contextView=this._register(new L.ContextView(this.layoutService.mainContainer,1)),this.layout(),this._register(_.onDidLayoutContainer(()=>this.layout()))}showContextView(_,v,b){let a;v?v===this.layoutService.getContainer((0,E.getWindow)(v))?a=1:b?a=3:a=2:a=1,this.contextView.setContainer(v??this.layoutService.activeContainer,a),this.contextView.show(_);const i=(0,k.toDisposable)(()=>{this.currentViewDisposable===i&&this.hideContextView()});return this.currentViewDisposable=i,i}getContextViewElement(){return this.contextView.getViewElement()}layout(){this.contextView.layout()}hideContextView(_){this.contextView.hide(_)}dispose(){super.dispose(),this.currentViewDisposable.dispose(),this.currentViewDisposable=k.Disposable.None}};e.ContextViewService=S,e.ContextViewService=S=ke([ge(0,y.ILayoutService)],S)}),define(se[64],oe([1,0,6,2,15,8]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CONTEXT_LOG_LEVEL=e.LogLevelToString=e.MultiplexLogger=e.ConsoleLogger=e.AbstractLogger=e.DEFAULT_LOG_LEVEL=e.LogLevel=e.ILogService=void 0,e.ILogService=(0,E.createDecorator)("logService");var S;(function(a){a[a.Off=0]="Off",a[a.Trace=1]="Trace",a[a.Debug=2]="Debug",a[a.Info=3]="Info",a[a.Warning=4]="Warning",a[a.Error=5]="Error"})(S||(e.LogLevel=S={})),e.DEFAULT_LOG_LEVEL=S.Info;class p extends k.Disposable{constructor(){super(...arguments),this.level=e.DEFAULT_LOG_LEVEL,this._onDidChangeLogLevel=this._register(new L.Emitter),this.onDidChangeLogLevel=this._onDidChangeLogLevel.event}setLevel(i){this.level!==i&&(this.level=i,this._onDidChangeLogLevel.fire(this.level))}getLevel(){return this.level}checkLogLevel(i){return this.level!==S.Off&&this.level<=i}}e.AbstractLogger=p;class _ extends p{constructor(i=e.DEFAULT_LOG_LEVEL,n=!0){super(),this.useColors=n,this.setLevel(i)}trace(i,...n){this.checkLogLevel(S.Trace)&&(this.useColors?console.log("%cTRACE","color: #888",i,...n):console.log(i,...n))}debug(i,...n){this.checkLogLevel(S.Debug)&&(this.useColors?console.log("%cDEBUG","background: #eee; color: #888",i,...n):console.log(i,...n))}info(i,...n){this.checkLogLevel(S.Info)&&(this.useColors?console.log("%c INFO","color: #33f",i,...n):console.log(i,...n))}warn(i,...n){this.checkLogLevel(S.Warning)&&(this.useColors?console.log("%c WARN","color: #993",i,...n):console.log(i,...n))}error(i,...n){this.checkLogLevel(S.Error)&&(this.useColors?console.log("%c  ERR","color: #f33",i,...n):console.error(i,...n))}}e.ConsoleLogger=_;class v extends p{constructor(i){super(),this.loggers=i,i.length&&this.setLevel(i[0].getLevel())}setLevel(i){for(const n of this.loggers)n.setLevel(i);super.setLevel(i)}trace(i,...n){for(const t of this.loggers)t.trace(i,...n)}debug(i,...n){for(const t of this.loggers)t.debug(i,...n)}info(i,...n){for(const t of this.loggers)t.info(i,...n)}warn(i,...n){for(const t of this.loggers)t.warn(i,...n)}error(i,...n){for(const t of this.loggers)t.error(i,...n)}dispose(){for(const i of this.loggers)i.dispose();super.dispose()}}e.MultiplexLogger=v;function b(a){switch(a){case S.Trace:return"trace";case S.Debug:return"debug";case S.Info:return"info";case S.Warning:return"warn";case S.Error:return"error";case S.Off:return"off"}}e.LogLevelToString=b,e.CONTEXT_LOG_LEVEL=new y.RawContextKey("logLevel",b(S.Info))}),define(se[190],oe([1,0,54,7,84,46,266,14,6,2,109,11,280,24,69,64]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TextAreaWrapper=e.ClipboardEventUtils=e.TextAreaInput=e.InMemoryClipboardMetadataManager=e.CopyOptions=e.TextAreaSyntethicEvents=void 0;var u;(function(l){l.Tap="-monaco-textarea-synthetic-tap"})(u||(e.TextAreaSyntethicEvents=u={})),e.CopyOptions={forceCopyWithSyntaxHighlighting:!1};class f{constructor(){this._lastState=null}set(o,g){this._lastState={lastCopiedValue:o,data:g}}get(o){return this._lastState&&this._lastState.lastCopiedValue===o?this._lastState.data:(this._lastState=null,null)}}e.InMemoryClipboardMetadataManager=f,f.INSTANCE=new f;class c{constructor(){this._lastTypeTextLength=0}handleCompositionUpdate(o){o=o||"";const g={text:o,replacePrevCharCnt:this._lastTypeTextLength,replaceNextCharCnt:0,positionDelta:0};return this._lastTypeTextLength=o.length,g}}let d=class extends v.Disposable{get textAreaState(){return this._textAreaState}constructor(o,g,h,m,C,w){super(),this._host=o,this._textArea=g,this._OS=h,this._browser=m,this._accessibilityService=C,this._logService=w,this._onFocus=this._register(new _.Emitter),this.onFocus=this._onFocus.event,this._onBlur=this._register(new _.Emitter),this.onBlur=this._onBlur.event,this._onKeyDown=this._register(new _.Emitter),this.onKeyDown=this._onKeyDown.event,this._onKeyUp=this._register(new _.Emitter),this.onKeyUp=this._onKeyUp.event,this._onCut=this._register(new _.Emitter),this.onCut=this._onCut.event,this._onPaste=this._register(new _.Emitter),this.onPaste=this._onPaste.event,this._onType=this._register(new _.Emitter),this.onType=this._onType.event,this._onCompositionStart=this._register(new _.Emitter),this.onCompositionStart=this._onCompositionStart.event,this._onCompositionUpdate=this._register(new _.Emitter),this.onCompositionUpdate=this._onCompositionUpdate.event,this._onCompositionEnd=this._register(new _.Emitter),this.onCompositionEnd=this._onCompositionEnd.event,this._onSelectionChangeRequest=this._register(new _.Emitter),this.onSelectionChangeRequest=this._onSelectionChangeRequest.event,this._asyncFocusGainWriteScreenReaderContent=this._register(new v.MutableDisposable),this._asyncTriggerCut=this._register(new p.RunOnceScheduler(()=>this._onCut.fire(),0)),this._textAreaState=i.TextAreaState.EMPTY,this._selectionChangeListener=null,this._accessibilityService.isScreenReaderOptimized()&&this.writeNativeTextAreaContent("ctor"),this._register(_.Event.runAndSubscribe(this._accessibilityService.onDidChangeScreenReaderOptimized,()=>{this._accessibilityService.isScreenReaderOptimized()&&!this._asyncFocusGainWriteScreenReaderContent.value?this._asyncFocusGainWriteScreenReaderContent.value=this._register(new p.RunOnceScheduler(()=>this.writeNativeTextAreaContent("asyncFocusGain"),0)):this._asyncFocusGainWriteScreenReaderContent.clear()})),this._hasFocus=!1,this._currentComposition=null;let D=null;this._register(this._textArea.onKeyDown(I=>{const T=new E.StandardKeyboardEvent(I);(T.keyCode===114||this._currentComposition&&T.keyCode===1)&&T.stopPropagation(),T.equals(9)&&T.preventDefault(),D=T,this._onKeyDown.fire(T)})),this._register(this._textArea.onKeyUp(I=>{const T=new E.StandardKeyboardEvent(I);this._onKeyUp.fire(T)})),this._register(this._textArea.onCompositionStart(I=>{i._debugComposition&&console.log("[compositionstart]",I);const T=new c;if(this._currentComposition){this._currentComposition=T;return}if(this._currentComposition=T,this._OS===2&&D&&D.equals(114)&&this._textAreaState.selectionStart===this._textAreaState.selectionEnd&&this._textAreaState.selectionStart>0&&this._textAreaState.value.substr(this._textAreaState.selectionStart-1,1)===I.data&&(D.code==="ArrowRight"||D.code==="ArrowLeft")){i._debugComposition&&console.log("[compositionstart] Handling long press case on macOS + arrow key",I),T.handleCompositionUpdate("x"),this._onCompositionStart.fire({data:I.data});return}if(this._browser.isAndroid){this._onCompositionStart.fire({data:I.data});return}this._onCompositionStart.fire({data:I.data})})),this._register(this._textArea.onCompositionUpdate(I=>{i._debugComposition&&console.log("[compositionupdate]",I);const T=this._currentComposition;if(!T)return;if(this._browser.isAndroid){const P=i.TextAreaState.readFromTextArea(this._textArea,this._textAreaState),N=i.TextAreaState.deduceAndroidCompositionInput(this._textAreaState,P);this._textAreaState=P,this._onType.fire(N),this._onCompositionUpdate.fire(I);return}const A=T.handleCompositionUpdate(I.data);this._textAreaState=i.TextAreaState.readFromTextArea(this._textArea,this._textAreaState),this._onType.fire(A),this._onCompositionUpdate.fire(I)})),this._register(this._textArea.onCompositionEnd(I=>{i._debugComposition&&console.log("[compositionend]",I);const T=this._currentComposition;if(!T)return;if(this._currentComposition=null,this._browser.isAndroid){const P=i.TextAreaState.readFromTextArea(this._textArea,this._textAreaState),N=i.TextAreaState.deduceAndroidCompositionInput(this._textAreaState,P);this._textAreaState=P,this._onType.fire(N),this._onCompositionEnd.fire();return}const A=T.handleCompositionUpdate(I.data);this._textAreaState=i.TextAreaState.readFromTextArea(this._textArea,this._textAreaState),this._onType.fire(A),this._onCompositionEnd.fire()})),this._register(this._textArea.onInput(I=>{if(i._debugComposition&&console.log("[input]",I),this._textArea.setIgnoreSelectionChangeTime("received input event"),this._currentComposition)return;const T=i.TextAreaState.readFromTextArea(this._textArea,this._textAreaState),A=i.TextAreaState.deduceInput(this._textAreaState,T,this._OS===2);A.replacePrevCharCnt===0&&A.text.length===1&&(a.isHighSurrogate(A.text.charCodeAt(0))||A.text.charCodeAt(0)===127)||(this._textAreaState=T,(A.text!==""||A.replacePrevCharCnt!==0||A.replaceNextCharCnt!==0||A.positionDelta!==0)&&this._onType.fire(A))})),this._register(this._textArea.onCut(I=>{this._textArea.setIgnoreSelectionChangeTime("received cut event"),this._ensureClipboardGetsEditorSelection(I),this._asyncTriggerCut.schedule()})),this._register(this._textArea.onCopy(I=>{this._ensureClipboardGetsEditorSelection(I)})),this._register(this._textArea.onPaste(I=>{if(this._textArea.setIgnoreSelectionChangeTime("received paste event"),I.preventDefault(),!I.clipboardData)return;let[T,A]=e.ClipboardEventUtils.getTextData(I.clipboardData);T&&(A=A||f.INSTANCE.get(T),this._onPaste.fire({text:T,metadata:A}))})),this._register(this._textArea.onFocus(()=>{const I=this._hasFocus;this._setHasFocus(!0),this._accessibilityService.isScreenReaderOptimized()&&this._browser.isSafari&&!I&&this._hasFocus&&(this._asyncFocusGainWriteScreenReaderContent.value||(this._asyncFocusGainWriteScreenReaderContent.value=new p.RunOnceScheduler(()=>this.writeNativeTextAreaContent("asyncFocusGain"),0)),this._asyncFocusGainWriteScreenReaderContent.value.schedule())})),this._register(this._textArea.onBlur(()=>{this._currentComposition&&(this._currentComposition=null,this.writeNativeTextAreaContent("blurWithoutCompositionEnd"),this._onCompositionEnd.fire()),this._setHasFocus(!1)})),this._register(this._textArea.onSyntheticTap(()=>{this._browser.isAndroid&&this._currentComposition&&(this._currentComposition=null,this.writeNativeTextAreaContent("tapWithoutCompositionEnd"),this._onCompositionEnd.fire())}))}_installSelectionChangeListener(){let o=0;return k.addDisposableListener(this._textArea.ownerDocument,"selectionchange",g=>{if(S.inputLatency.onSelectionChange(),!this._hasFocus||this._currentComposition||!this._browser.isChrome)return;const h=Date.now(),m=h-o;if(o=h,m<5)return;const C=h-this._textArea.getIgnoreSelectionChangeTime();if(this._textArea.resetSelectionChangeTime(),C<100||!this._textAreaState.selection)return;const w=this._textArea.getValue();if(this._textAreaState.value!==w)return;const D=this._textArea.getSelectionStart(),I=this._textArea.getSelectionEnd();if(this._textAreaState.selectionStart===D&&this._textAreaState.selectionEnd===I)return;const T=this._textAreaState.deduceEditorPosition(D),A=this._host.deduceModelPosition(T[0],T[1],T[2]),P=this._textAreaState.deduceEditorPosition(I),N=this._host.deduceModelPosition(P[0],P[1],P[2]),M=new n.Selection(A.lineNumber,A.column,N.lineNumber,N.column);this._onSelectionChangeRequest.fire(M)})}dispose(){super.dispose(),this._selectionChangeListener&&(this._selectionChangeListener.dispose(),this._selectionChangeListener=null)}focusTextArea(){this._setHasFocus(!0),this.refreshFocusState()}isFocused(){return this._hasFocus}refreshFocusState(){this._setHasFocus(this._textArea.hasFocus())}_setHasFocus(o){this._hasFocus!==o&&(this._hasFocus=o,this._selectionChangeListener&&(this._selectionChangeListener.dispose(),this._selectionChangeListener=null),this._hasFocus&&(this._selectionChangeListener=this._installSelectionChangeListener()),this._hasFocus&&this.writeNativeTextAreaContent("focusgain"),this._hasFocus?this._onFocus.fire():this._onBlur.fire())}_setAndWriteTextAreaState(o,g){this._hasFocus||(g=g.collapseSelection()),g.writeToTextArea(o,this._textArea,this._hasFocus),this._textAreaState=g}writeNativeTextAreaContent(o){!this._accessibilityService.isScreenReaderOptimized()&&o==="render"||this._currentComposition||(this._logService.trace(`writeTextAreaState(reason: ${o})`),this._setAndWriteTextAreaState(o,this._host.getScreenReaderContent()))}_ensureClipboardGetsEditorSelection(o){const g=this._host.getDataToCopy(),h={version:1,isFromEmptySelection:g.isFromEmptySelection,multicursorText:g.multicursorText,mode:g.mode};f.INSTANCE.set(this._browser.isFirefox?g.text.replace(/\r\n/g,`
+`):g.text,h),o.preventDefault(),o.clipboardData&&e.ClipboardEventUtils.setTextData(o.clipboardData,g.text,g.html,h)}};e.TextAreaInput=d,e.TextAreaInput=d=ke([ge(4,t.IAccessibilityService),ge(5,r.ILogService)],d),e.ClipboardEventUtils={getTextData(l){const o=l.getData(b.Mimes.text);let g=null;const h=l.getData("vscode-editor-data");if(typeof h=="string")try{g=JSON.parse(h),g.version!==1&&(g=null)}catch{}return o.length===0&&g===null&&l.files.length>0?[Array.prototype.slice.call(l.files,0).map(C=>C.name).join(`
+`),null]:[o,g]},setTextData(l,o,g,h){l.setData(b.Mimes.text,o),typeof g=="string"&&l.setData("text/html",g),l.setData("vscode-editor-data",JSON.stringify(h))}};class s extends v.Disposable{get ownerDocument(){return this._actual.ownerDocument}constructor(o){super(),this._actual=o,this.onKeyDown=this._register(new y.DomEmitter(this._actual,"keydown")).event,this.onKeyUp=this._register(new y.DomEmitter(this._actual,"keyup")).event,this.onCompositionStart=this._register(new y.DomEmitter(this._actual,"compositionstart")).event,this.onCompositionUpdate=this._register(new y.DomEmitter(this._actual,"compositionupdate")).event,this.onCompositionEnd=this._register(new y.DomEmitter(this._actual,"compositionend")).event,this.onBeforeInput=this._register(new y.DomEmitter(this._actual,"beforeinput")).event,this.onInput=this._register(new y.DomEmitter(this._actual,"input")).event,this.onCut=this._register(new y.DomEmitter(this._actual,"cut")).event,this.onCopy=this._register(new y.DomEmitter(this._actual,"copy")).event,this.onPaste=this._register(new y.DomEmitter(this._actual,"paste")).event,this.onFocus=this._register(new y.DomEmitter(this._actual,"focus")).event,this.onBlur=this._register(new y.DomEmitter(this._actual,"blur")).event,this._onSyntheticTap=this._register(new _.Emitter),this.onSyntheticTap=this._onSyntheticTap.event,this._ignoreSelectionChangeTime=0,this._register(this.onKeyDown(()=>S.inputLatency.onKeyDown())),this._register(this.onBeforeInput(()=>S.inputLatency.onBeforeInput())),this._register(this.onInput(()=>S.inputLatency.onInput())),this._register(this.onKeyUp(()=>S.inputLatency.onKeyUp())),this._register(k.addDisposableListener(this._actual,u.Tap,()=>this._onSyntheticTap.fire()))}hasFocus(){const o=k.getShadowRoot(this._actual);return o?o.activeElement===this._actual:this._actual.isConnected?k.getActiveElement()===this._actual:!1}setIgnoreSelectionChangeTime(o){this._ignoreSelectionChangeTime=Date.now()}getIgnoreSelectionChangeTime(){return this._ignoreSelectionChangeTime}resetSelectionChangeTime(){this._ignoreSelectionChangeTime=0}getValue(){return this._actual.value}setValue(o,g){const h=this._actual;h.value!==g&&(this.setIgnoreSelectionChangeTime("setValue"),h.value=g)}getSelectionStart(){return this._actual.selectionDirection==="backward"?this._actual.selectionEnd:this._actual.selectionStart}getSelectionEnd(){return this._actual.selectionDirection==="backward"?this._actual.selectionStart:this._actual.selectionEnd}setSelectionRange(o,g,h){const m=this._actual;let C=null;const w=k.getShadowRoot(m);w?C=w.activeElement:C=k.getActiveElement();const D=k.getWindow(C),I=C===m,T=m.selectionStart,A=m.selectionEnd;if(I&&T===g&&A===h){L.isFirefox&&D.parent!==D&&m.focus();return}if(I){this.setIgnoreSelectionChangeTime("setSelectionRange"),m.setSelectionRange(g,h),L.isFirefox&&D.parent!==D&&m.focus();return}try{const P=k.saveParentsScrollTop(m);this.setIgnoreSelectionChangeTime("setSelectionRange"),m.focus(),m.setSelectionRange(g,h),k.restoreParentsScrollTop(m,P)}catch{}}}e.TextAreaWrapper=s}),define(se[79],oe([1,0,111,53,145,243,45,8,64,47]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguageFeatureDebounceService=e.ILanguageFeatureDebounceService=void 0,e.ILanguageFeatureDebounceService=(0,p.createDecorator)("ILanguageFeatureDebounceService");var b;(function(t){const r=new WeakMap;let u=0;function f(c){let d=r.get(c);return d===void 0&&(d=++u,r.set(c,d)),d}t.of=f})(b||(b={}));class a{constructor(r){this._default=r}get(r){return this._default}update(r,u){return this._default}default(){return this._default}}class i{constructor(r,u,f,c,d,s){this._logService=r,this._name=u,this._registry=f,this._default=c,this._min=d,this._max=s,this._cache=new k.LRUCache(50,.7)}_key(r){return r.id+this._registry.all(r).reduce((u,f)=>(0,L.doHash)(b.of(f),u),0)}get(r){const u=this._key(r),f=this._cache.get(u);return f?(0,y.clamp)(f.value,this._min,this._max):this.default()}update(r,u){const f=this._key(r);let c=this._cache.get(f);c||(c=new y.SlidingWindowAverage(6),this._cache.set(f,c));const d=(0,y.clamp)(c.update(u),this._min,this._max);return(0,v.matchesScheme)(r.uri,"output")||this._logService.trace(`[DEBOUNCE: ${this._name}] for ${r.uri.toString()} is ${d}ms`),d}_overall(){const r=new y.MovingAverage;for(const[,u]of this._cache)r.update(u.value);return r.value}default(){const r=this._overall()|0||this._default;return(0,y.clamp)(r,this._min,this._max)}}let n=class{constructor(r,u){this._logService=r,this._data=new Map,this._isDev=u.isExtensionDevelopment||!u.isBuilt}for(r,u,f){var c,d,s;const l=(c=f?.min)!==null&&c!==void 0?c:50,o=(d=f?.max)!==null&&d!==void 0?d:l**2,g=(s=f?.key)!==null&&s!==void 0?s:void 0,h=`${b.of(r)},${l}${g?","+g:""}`;let m=this._data.get(h);return m||(this._isDev?m=new i(this._logService,u,r,this._overallAverage()|0||l*1.5,l,o):(this._logService.debug(`[DEBOUNCE: ${u}] is disabled in developed mode`),m=new a(l*1.5)),this._data.set(h,m)),m}_overallAverage(){const r=new y.MovingAverage;for(const u of this._data.values())r.update(u.default());return r.value}};e.LanguageFeatureDebounceService=n,e.LanguageFeatureDebounceService=n=ke([ge(0,_.ILogService),ge(1,E.IEnvironmentService)],n),(0,S.registerSingleton)(e.ILanguageFeatureDebounceService,n,1)}),define(se[165],oe([1,0,13,19,12,52,53,10,5,79,8,45,51,2,18]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OutlineModelService=e.IOutlineModelService=e.OutlineModel=e.OutlineGroup=e.OutlineElement=e.TreeElement=void 0;class r{remove(){var l;(l=this.parent)===null||l===void 0||l.children.delete(this.id)}static findId(l,o){let g;typeof l=="string"?g=`${o.id}/${l}`:(g=`${o.id}/${l.name}`,o.children.get(g)!==void 0&&(g=`${o.id}/${l.name}_${l.range.startLineNumber}_${l.range.startColumn}`));let h=g;for(let m=0;o.children.get(h)!==void 0;m++)h=`${g}_${m}`;return h}static empty(l){return l.children.size===0}}e.TreeElement=r;class u extends r{constructor(l,o,g){super(),this.id=l,this.parent=o,this.symbol=g,this.children=new Map}}e.OutlineElement=u;class f extends r{constructor(l,o,g,h){super(),this.id=l,this.parent=o,this.label=g,this.order=h,this.children=new Map}}e.OutlineGroup=f;class c extends r{static create(l,o,g){const h=new k.CancellationTokenSource(g),m=new c(o.uri),C=l.ordered(o),w=C.map((I,T)=>{var A;const P=r.findId(`provider_${T}`,m),N=new f(P,m,(A=I.displayName)!==null&&A!==void 0?A:"Unknown Outline Provider",T);return Promise.resolve(I.provideDocumentSymbols(o,h.token)).then(M=>{for(const R of M||[])c._makeOutlineElement(R,N);return N},M=>((0,y.onUnexpectedExternalError)(M),N)).then(M=>{r.empty(M)?M.remove():m._groups.set(P,M)})}),D=l.onDidChange(()=>{const I=l.ordered(o);(0,L.equals)(I,C)||h.cancel()});return Promise.all(w).then(()=>h.token.isCancellationRequested&&!g.isCancellationRequested?c.create(l,o,g):m._compact()).finally(()=>{h.dispose(),D.dispose(),h.dispose()})}static _makeOutlineElement(l,o){const g=r.findId(l,o),h=new u(g,o,l);if(l.children)for(const m of l.children)c._makeOutlineElement(m,h);o.children.set(h.id,h)}constructor(l){super(),this.uri=l,this.id="root",this.parent=void 0,this._groups=new Map,this.children=new Map,this.id="root",this.parent=void 0}_compact(){let l=0;for(const[o,g]of this._groups)g.children.size===0?this._groups.delete(o):l+=1;if(l!==1)this.children=this._groups;else{const o=E.Iterable.first(this._groups.values());for(const[,g]of o.children)g.parent=this,this.children.set(g.id,g)}return this}getTopLevelSymbols(){const l=[];for(const o of this.children.values())o instanceof u?l.push(o.symbol):l.push(...E.Iterable.map(o.children.values(),g=>g.symbol));return l.sort((o,g)=>_.Range.compareRangesUsingStarts(o.range,g.range))}asListOfDocumentSymbols(){const l=this.getTopLevelSymbols(),o=[];return c._flattenDocumentSymbols(o,l,""),o.sort((g,h)=>p.Position.compare(_.Range.getStartPosition(g.range),_.Range.getStartPosition(h.range))||p.Position.compare(_.Range.getEndPosition(h.range),_.Range.getEndPosition(g.range)))}static _flattenDocumentSymbols(l,o,g){for(const h of o)l.push({kind:h.kind,tags:h.tags,name:h.name,detail:h.detail,containerName:h.containerName||g,range:h.range,selectionRange:h.selectionRange,children:void 0}),h.children&&c._flattenDocumentSymbols(l,h.children,h.name)}}e.OutlineModel=c,e.IOutlineModelService=(0,b.createDecorator)("IOutlineModelService");let d=class{constructor(l,o,g){this._languageFeaturesService=l,this._disposables=new n.DisposableStore,this._cache=new S.LRUCache(10,.7),this._debounceInformation=o.for(l.documentSymbolProvider,"DocumentSymbols",{min:350}),this._disposables.add(g.onModelRemoved(h=>{this._cache.delete(h.id)}))}dispose(){this._disposables.dispose()}async getOrCreate(l,o){const g=this._languageFeaturesService.documentSymbolProvider,h=g.ordered(l);let m=this._cache.get(l.id);if(!m||m.versionId!==l.getVersionId()||!(0,L.equals)(m.provider,h)){const w=new k.CancellationTokenSource;m={versionId:l.getVersionId(),provider:h,promiseCnt:0,source:w,promise:c.create(g,l,w.token),model:void 0},this._cache.set(l.id,m);const D=Date.now();m.promise.then(I=>{m.model=I,this._debounceInformation.update(l,Date.now()-D)}).catch(I=>{this._cache.delete(l.id)})}if(m.model)return m.model;m.promiseCnt+=1;const C=o.onCancellationRequested(()=>{--m.promiseCnt===0&&(m.source.cancel(),this._cache.delete(l.id))});try{return await m.promise}finally{C.dispose()}}};e.OutlineModelService=d,e.OutlineModelService=d=ke([ge(0,t.ILanguageFeaturesService),ge(1,v.ILanguageFeatureDebounceService),ge(2,i.IModelService)],d),(0,a.registerSingleton)(e.IOutlineModelService,d,1)}),define(se[779],oe([1,0,13,35,342,87,18,165,2,6]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0});let b=class extends _.Disposable{constructor(i,n,t){super(),this._textModel=i,this._languageFeaturesService=n,this._outlineModelService=t,this._currentModel=(0,k.observableValue)(this,void 0);const r=(0,k.observableSignalFromEvent)("documentSymbolProvider.onDidChange",this._languageFeaturesService.documentSymbolProvider.onDidChange),u=(0,k.observableSignalFromEvent)("_textModel.onDidChangeContent",v.Event.debounce(f=>this._textModel.onDidChangeContent(f),()=>{},100));this._register((0,k.autorunWithStore)(async(f,c)=>{r.read(f),u.read(f);const d=c.add(new E.DisposableCancellationTokenSource),s=await this._outlineModelService.getOrCreate(this._textModel,d.token);c.isDisposed||this._currentModel.set(s,void 0)}))}getBreadcrumbItems(i,n){const t=this._currentModel.read(n);if(!t)return[];const r=t.asListOfDocumentSymbols().filter(u=>i.contains(u.range.startLineNumber)&&!i.contains(u.range.endLineNumber));return r.sort((0,L.reverseOrder)((0,L.compareBy)(u=>u.range.endLineNumber-u.range.startLineNumber,L.numberComparator))),r.map(u=>({name:u.name,kind:u.kind,startLineNumber:u.range.startLineNumber}))}};b=ke([ge(1,S.ILanguageFeaturesService),ge(2,p.IOutlineModelService)],b),y.HideUnchangedRegionsFeature.setBreadcrumbsSourceFactory((a,i)=>i.createInstance(b,a))}),define(se[780],oe([1,0,19,20,22,68,165,25]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),p.CommandsRegistry.registerCommand("_executeDocumentSymbolProvider",async function(_,...v){const[b]=v;(0,k.assertType)(y.URI.isUri(b));const a=_.get(S.IOutlineModelService),n=await _.get(E.ITextModelService).createModelReference(b);try{return(await a.getOrCreate(n.object.textEditorModel,L.CancellationToken.None)).getTopLevelSymbols()}finally{n.dispose()}})}),define(se[781],oe([1,0,54,7,44,14,6,111,2,123,64]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";var a;Object.defineProperty(e,"__esModule",{value:!0}),e.BrowserClipboardService=void 0;let i=a=class extends _.Disposable{constructor(t,r){super(),this.layoutService=t,this.logService=r,this.mapTextToType=new Map,this.findText="",this.resources=[],this.resourcesStateHash=void 0,(L.isSafari||L.isWebkitWebView)&&this.installWebKitWriteTextWorkaround(),this._register(S.Event.runAndSubscribe(k.onDidRegisterWindow,({window:u,disposables:f})=>{f.add((0,k.addDisposableListener)(u.document,"copy",()=>this.clearResources()))},{window:y.mainWindow,disposables:this._store}))}installWebKitWriteTextWorkaround(){const t=()=>{const r=new E.DeferredPromise;this.webKitPendingClipboardWritePromise&&!this.webKitPendingClipboardWritePromise.isSettled&&this.webKitPendingClipboardWritePromise.cancel(),this.webKitPendingClipboardWritePromise=r,navigator.clipboard.write([new ClipboardItem({"text/plain":r.p})]).catch(async u=>{(!(u instanceof Error)||u.name!=="NotAllowedError"||!r.isRejected)&&this.logService.error(u)})};this._register(S.Event.runAndSubscribe(this.layoutService.onDidAddContainer,({container:r,disposables:u})=>{u.add((0,k.addDisposableListener)(r,"click",t)),u.add((0,k.addDisposableListener)(r,"keydown",t))},{container:this.layoutService.mainContainer,disposables:this._store}))}async writeText(t,r){if(this.writeResources([]),r){this.mapTextToType.set(r,t);return}if(this.webKitPendingClipboardWritePromise)return this.webKitPendingClipboardWritePromise.complete(t);try{return await navigator.clipboard.writeText(t)}catch(u){console.error(u)}this.fallbackWriteText(t)}fallbackWriteText(t){const r=(0,k.getActiveDocument)(),u=r.activeElement,f=r.body.appendChild((0,k.$)("textarea",{"aria-hidden":!0}));f.style.height="1px",f.style.width="1px",f.style.position="absolute",f.value=t,f.focus(),f.select(),r.execCommand("copy"),u instanceof HTMLElement&&u.focus(),r.body.removeChild(f)}async readText(t){if(t)return this.mapTextToType.get(t)||"";try{return await navigator.clipboard.readText()}catch(r){console.error(r)}return""}async readFindText(){return this.findText}async writeFindText(t){this.findText=t}async writeResources(t){t.length===0?this.clearResources():(this.resources=t,this.resourcesStateHash=await this.computeResourcesStateHash())}async readResources(){const t=await this.computeResourcesStateHash();return this.resourcesStateHash!==t&&this.clearResources(),this.resources}async computeResourcesStateHash(){if(this.resources.length===0)return;const t=await this.readText();return(0,p.hash)(t.substring(0,a.MAX_RESOURCE_STATE_SOURCE_LENGTH))}clearResources(){this.resources=[],this.resourcesStateHash=void 0}};e.BrowserClipboardService=i,i.MAX_RESOURCE_STATE_SOURCE_LENGTH=1e3,e.BrowserClipboardService=i=a=ke([ge(0,v.ILayoutService),ge(1,b.ILogService)],i)}),define(se[782],oe([1,0,2,64]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LogService=void 0;class y extends L.Disposable{constructor(S,p=[]){super(),this.logger=new k.MultiplexLogger([S,...p]),this._register(S.onDidChangeLogLevel(_=>this.setLevel(_)))}get onDidChangeLogLevel(){return this.logger.onDidChangeLogLevel}setLevel(S){this.logger.setLevel(S)}getLevel(){return this.logger.getLevel()}trace(S,...p){this.logger.trace(S,...p)}debug(S,...p){this.logger.debug(S,...p)}info(S,...p){this.logger.info(S,...p)}warn(S,...p){this.logger.warn(S,...p)}error(S,...p){this.logger.error(S,...p)}}e.LogService=y}),define(se[97],oe([1,0,100,745,8]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IMarkerService=e.IMarkerData=e.MarkerSeverity=void 0;var E;(function(p){p[p.Hint=1]="Hint",p[p.Info=2]="Info",p[p.Warning=4]="Warning",p[p.Error=8]="Error"})(E||(e.MarkerSeverity=E={})),function(p){function _(n,t){return t-n}p.compare=_;const v=Object.create(null);v[p.Error]=(0,k.localize)(0,null),v[p.Warning]=(0,k.localize)(1,null),v[p.Info]=(0,k.localize)(2,null);function b(n){return v[n]||""}p.toString=b;function a(n){switch(n){case L.default.Error:return p.Error;case L.default.Warning:return p.Warning;case L.default.Info:return p.Info;case L.default.Ignore:return p.Hint}}p.fromSeverity=a;function i(n){switch(n){case p.Error:return L.default.Error;case p.Warning:return L.default.Warning;case p.Info:return L.default.Info;case p.Hint:return L.default.Ignore}}p.toSeverity=i}(E||(e.MarkerSeverity=E={}));var S;(function(p){const _="";function v(a){return b(a,!0)}p.makeKey=v;function b(a,i){const n=[_];return a.source?n.push(a.source.replace("\xA6","\\\xA6")):n.push(_),a.code?typeof a.code=="string"?n.push(a.code.replace("\xA6","\\\xA6")):n.push(a.code.value.replace("\xA6","\\\xA6")):n.push(_),a.severity!==void 0&&a.severity!==null?n.push(E.toString(a.severity)):n.push(_),a.message&&i?n.push(a.message.replace("\xA6","\\\xA6")):n.push(_),a.startLineNumber!==void 0&&a.startLineNumber!==null?n.push(a.startLineNumber.toString()):n.push(_),a.startColumn!==void 0&&a.startColumn!==null?n.push(a.startColumn.toString()):n.push(_),a.endLineNumber!==void 0&&a.endLineNumber!==null?n.push(a.endLineNumber.toString()):n.push(_),a.endColumn!==void 0&&a.endColumn!==null?n.push(a.endColumn.toString()):n.push(_),n.push(_),n.join("\xA6")}p.makeKeyOptionalMessage=b})(S||(e.IMarkerData=S={})),e.IMarkerService=(0,y.createDecorator)("markerService")}),define(se[783],oe([1,0,13,6,2,66,11,22,5,45,8,97,27]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IMarkerNavigationService=e.MarkerList=e.MarkerCoordinate=void 0;class n{constructor(f,c,d){this.marker=f,this.index=c,this.total=d}}e.MarkerCoordinate=n;let t=class{constructor(f,c,d){this._markerService=c,this._configService=d,this._onDidChange=new k.Emitter,this.onDidChange=this._onDidChange.event,this._dispoables=new y.DisposableStore,this._markers=[],this._nextIdx=-1,p.URI.isUri(f)?this._resourceFilter=g=>g.toString()===f.toString():f&&(this._resourceFilter=f);const s=this._configService.getValue("problems.sortOrder"),l=(g,h)=>{let m=(0,S.compare)(g.resource.toString(),h.resource.toString());return m===0&&(s==="position"?m=_.Range.compareRangesUsingStarts(g,h)||a.MarkerSeverity.compare(g.severity,h.severity):m=a.MarkerSeverity.compare(g.severity,h.severity)||_.Range.compareRangesUsingStarts(g,h)),m},o=()=>{this._markers=this._markerService.read({resource:p.URI.isUri(f)?f:void 0,severities:a.MarkerSeverity.Error|a.MarkerSeverity.Warning|a.MarkerSeverity.Info}),typeof f=="function"&&(this._markers=this._markers.filter(g=>this._resourceFilter(g.resource))),this._markers.sort(l)};o(),this._dispoables.add(c.onMarkerChanged(g=>{(!this._resourceFilter||g.some(h=>this._resourceFilter(h)))&&(o(),this._nextIdx=-1,this._onDidChange.fire())}))}dispose(){this._dispoables.dispose(),this._onDidChange.dispose()}matches(f){return!this._resourceFilter&&!f?!0:!this._resourceFilter||!f?!1:this._resourceFilter(f)}get selected(){const f=this._markers[this._nextIdx];return f&&new n(f,this._nextIdx+1,this._markers.length)}_initIdx(f,c,d){let s=!1,l=this._markers.findIndex(o=>o.resource.toString()===f.uri.toString());l<0&&(l=(0,L.binarySearch)(this._markers,{resource:f.uri},(o,g)=>(0,S.compare)(o.resource.toString(),g.resource.toString())),l<0&&(l=~l));for(let o=l;o<this._markers.length;o++){let g=_.Range.lift(this._markers[o]);if(g.isEmpty()){const h=f.getWordAtPosition(g.getStartPosition());h&&(g=new _.Range(g.startLineNumber,h.startColumn,g.startLineNumber,h.endColumn))}if(c&&(g.containsPosition(c)||c.isBeforeOrEqual(g.getStartPosition()))){this._nextIdx=o,s=!0;break}if(this._markers[o].resource.toString()!==f.uri.toString())break}s||(this._nextIdx=d?0:this._markers.length-1),this._nextIdx<0&&(this._nextIdx=this._markers.length-1)}resetIndex(){this._nextIdx=-1}move(f,c,d){if(this._markers.length===0)return!1;const s=this._nextIdx;return this._nextIdx===-1?this._initIdx(c,d,f):f?this._nextIdx=(this._nextIdx+1)%this._markers.length:f||(this._nextIdx=(this._nextIdx-1+this._markers.length)%this._markers.length),s!==this._nextIdx}find(f,c){let d=this._markers.findIndex(s=>s.resource.toString()===f.toString());if(!(d<0)){for(;d<this._markers.length;d++)if(_.Range.containsPosition(this._markers[d],c))return new n(this._markers[d],d+1,this._markers.length)}}};e.MarkerList=t,e.MarkerList=t=ke([ge(1,a.IMarkerService),ge(2,i.IConfigurationService)],t),e.IMarkerNavigationService=(0,b.createDecorator)("IMarkerNavigationService");let r=class{constructor(f,c){this._markerService=f,this._configService=c,this._provider=new E.LinkedList}getMarkerList(f){for(const c of this._provider){const d=c.getMarkerList(f);if(d)return d}return new t(f,this._markerService,this._configService)}};r=ke([ge(0,a.IMarkerService),ge(1,i.IConfigurationService)],r),(0,v.registerSingleton)(e.IMarkerNavigationService,r,1)}),define(se[784],oe([1,0,13,6,52,53,47,22,97]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerService=e.unsupportedSchemas=void 0,e.unsupportedSchemas=new Set([S.Schemas.inMemory,S.Schemas.vscodeSourceControl,S.Schemas.walkThrough,S.Schemas.walkThroughSnippet]);class v{constructor(){this._byResource=new E.ResourceMap,this._byOwner=new Map}set(n,t,r){let u=this._byResource.get(n);u||(u=new Map,this._byResource.set(n,u)),u.set(t,r);let f=this._byOwner.get(t);f||(f=new E.ResourceMap,this._byOwner.set(t,f)),f.set(n,r)}get(n,t){const r=this._byResource.get(n);return r?.get(t)}delete(n,t){let r=!1,u=!1;const f=this._byResource.get(n);f&&(r=f.delete(t));const c=this._byOwner.get(t);if(c&&(u=c.delete(n)),r!==u)throw new Error("illegal state");return r&&u}values(n){var t,r,u,f;return typeof n=="string"?(r=(t=this._byOwner.get(n))===null||t===void 0?void 0:t.values())!==null&&r!==void 0?r:y.Iterable.empty():p.URI.isUri(n)?(f=(u=this._byResource.get(n))===null||u===void 0?void 0:u.values())!==null&&f!==void 0?f:y.Iterable.empty():y.Iterable.map(y.Iterable.concat(...this._byOwner.values()),c=>c[1])}}class b{constructor(n){this.errors=0,this.infos=0,this.warnings=0,this.unknowns=0,this._data=new E.ResourceMap,this._service=n,this._subscription=n.onMarkerChanged(this._update,this)}dispose(){this._subscription.dispose()}_update(n){for(const t of n){const r=this._data.get(t);r&&this._substract(r);const u=this._resourceStats(t);this._add(u),this._data.set(t,u)}}_resourceStats(n){const t={errors:0,warnings:0,infos:0,unknowns:0};if(e.unsupportedSchemas.has(n.scheme))return t;for(const{severity:r}of this._service.read({resource:n}))r===_.MarkerSeverity.Error?t.errors+=1:r===_.MarkerSeverity.Warning?t.warnings+=1:r===_.MarkerSeverity.Info?t.infos+=1:t.unknowns+=1;return t}_substract(n){this.errors-=n.errors,this.warnings-=n.warnings,this.infos-=n.infos,this.unknowns-=n.unknowns}_add(n){this.errors+=n.errors,this.warnings+=n.warnings,this.infos+=n.infos,this.unknowns+=n.unknowns}}class a{constructor(){this._onMarkerChanged=new k.DebounceEmitter({delay:0,merge:a._merge}),this.onMarkerChanged=this._onMarkerChanged.event,this._data=new v,this._stats=new b(this)}dispose(){this._stats.dispose(),this._onMarkerChanged.dispose()}remove(n,t){for(const r of t||[])this.changeOne(n,r,[])}changeOne(n,t,r){if((0,L.isFalsyOrEmpty)(r))this._data.delete(t,n)&&this._onMarkerChanged.fire([t]);else{const u=[];for(const f of r){const c=a._toMarker(n,t,f);c&&u.push(c)}this._data.set(t,n,u),this._onMarkerChanged.fire([t])}}static _toMarker(n,t,r){let{code:u,severity:f,message:c,source:d,startLineNumber:s,startColumn:l,endLineNumber:o,endColumn:g,relatedInformation:h,tags:m}=r;if(c)return s=s>0?s:1,l=l>0?l:1,o=o>=s?o:s,g=g>0?g:l,{resource:t,owner:n,code:u,severity:f,message:c,source:d,startLineNumber:s,startColumn:l,endLineNumber:o,endColumn:g,relatedInformation:h,tags:m}}changeAll(n,t){const r=[],u=this._data.values(n);if(u)for(const f of u){const c=y.Iterable.first(f);c&&(r.push(c.resource),this._data.delete(c.resource,n))}if((0,L.isNonEmptyArray)(t)){const f=new E.ResourceMap;for(const{resource:c,marker:d}of t){const s=a._toMarker(n,c,d);if(!s)continue;const l=f.get(c);l?l.push(s):(f.set(c,[s]),r.push(c))}for(const[c,d]of f)this._data.set(c,n,d)}r.length>0&&this._onMarkerChanged.fire(r)}read(n=Object.create(null)){let{owner:t,resource:r,severities:u,take:f}=n;if((!f||f<0)&&(f=-1),t&&r){const c=this._data.get(r,t);if(c){const d=[];for(const s of c)if(a._accept(s,u)){const l=d.push(s);if(f>0&&l===f)break}return d}else return[]}else if(!t&&!r){const c=[];for(const d of this._data.values())for(const s of d)if(a._accept(s,u)){const l=c.push(s);if(f>0&&l===f)return c}return c}else{const c=this._data.values(r??t),d=[];for(const s of c)for(const l of s)if(a._accept(l,u)){const o=d.push(l);if(f>0&&o===f)return d}return d}}static _accept(n,t){return t===void 0||(t&n.severity)===n.severity}static _merge(n){const t=new E.ResourceMap;for(const r of n)for(const u of r)t.set(u,!0);return Array.from(t.keys())}}e.MarkerService=a}),define(se[50],oe([1,0,100,8]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.NoOpNotification=e.INotificationService=e.Severity=void 0,e.Severity=L.default,e.INotificationService=(0,k.createDecorator)("notificationService");class y{}e.NoOpNotification=y}),define(se[57],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.extractSelection=e.IOpenerService=void 0,e.IOpenerService=(0,L.createDecorator)("openerService");function k(y){let E;const S=/^L?(\d+)(?:,(\d+))?(-L?(\d+)(?:,(\d+))?)?/.exec(y.fragment);return S&&(E={startLineNumber:parseInt(S[1]),startColumn:S[2]?parseInt(S[2]):1,endLineNumber:S[4]?parseInt(S[4]):void 0,endColumn:S[4]?S[5]?parseInt(S[5]):1:void 0},y=y.with({fragment:""})),{selection:E,uri:y}}e.extractSelection=k}),define(se[785],oe([1,0,7,44,19,66,53,223,47,49,22,33,25,759,57]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OpenerService=void 0;let r=class{constructor(d){this._commandService=d}async open(d,s){if(!(0,_.matchesScheme)(d,_.Schemas.command))return!1;if(!s?.allowCommands||(typeof d=="string"&&(d=b.URI.parse(d)),Array.isArray(s.allowCommands)&&!s.allowCommands.includes(d.path)))return!0;let l=[];try{l=(0,p.parse)(decodeURIComponent(d.query))}catch{try{l=(0,p.parse)(d.query)}catch{}}return Array.isArray(l)||(l=[l]),await this._commandService.executeCommand(d.path,...l),!0}};r=ke([ge(0,i.ICommandService)],r);let u=class{constructor(d){this._editorService=d}async open(d,s){typeof d=="string"&&(d=b.URI.parse(d));const{selection:l,uri:o}=(0,t.extractSelection)(d);return d=o,d.scheme===_.Schemas.file&&(d=(0,v.normalizePath)(d)),await this._editorService.openCodeEditor({resource:d,options:{selection:l,source:s?.fromUserGesture?n.EditorOpenSource.USER:n.EditorOpenSource.API,...s?.editorOptions}},this._editorService.getFocusedCodeEditor(),s?.openToSide),!0}};u=ke([ge(0,a.ICodeEditorService)],u);let f=class{constructor(d,s){this._openers=new E.LinkedList,this._validators=new E.LinkedList,this._resolvers=new E.LinkedList,this._resolvedUriTargets=new S.ResourceMap(l=>l.with({path:null,fragment:null,query:null}).toString()),this._externalOpeners=new E.LinkedList,this._defaultExternalOpener={openExternal:async l=>((0,_.matchesSomeScheme)(l,_.Schemas.http,_.Schemas.https)?L.windowOpenNoOpener(l):k.mainWindow.location.href=l,!0)},this._openers.push({open:async(l,o)=>o?.openExternal||(0,_.matchesSomeScheme)(l,_.Schemas.mailto,_.Schemas.http,_.Schemas.https,_.Schemas.vsls)?(await this._doOpenExternal(l,o),!0):!1}),this._openers.push(new r(s)),this._openers.push(new u(d))}registerOpener(d){return{dispose:this._openers.unshift(d)}}async open(d,s){var l;const o=typeof d=="string"?b.URI.parse(d):d,g=(l=this._resolvedUriTargets.get(o))!==null&&l!==void 0?l:d;for(const h of this._validators)if(!await h.shouldOpen(g,s))return!1;for(const h of this._openers)if(await h.open(d,s))return!0;return!1}async resolveExternalUri(d,s){for(const l of this._resolvers)try{const o=await l.resolveExternalUri(d,s);if(o)return this._resolvedUriTargets.has(o.resolved)||this._resolvedUriTargets.set(o.resolved,d),o}catch{}throw new Error("Could not resolve external URI: "+d.toString())}async _doOpenExternal(d,s){const l=typeof d=="string"?b.URI.parse(d):d;let o;try{o=(await this.resolveExternalUri(l,s)).resolved}catch{o=l}let g;if(typeof d=="string"&&l.toString()===o.toString()?g=d:g=encodeURI(o.toString(!0)),s?.allowContributedOpeners){const h=typeof s?.allowContributedOpeners=="string"?s?.allowContributedOpeners:void 0;for(const m of this._externalOpeners)if(await m.openExternal(g,{sourceUri:l,preferredOpenerId:h},y.CancellationToken.None))return!0}return this._defaultExternalOpener.openExternal(g,{sourceUri:l},y.CancellationToken.None)}dispose(){this._validators.clear()}};e.OpenerService=f,e.OpenerService=f=ke([ge(0,a.ICodeEditorService),ge(1,i.ICommandService)],f)}),define(se[786],oe([1,0,7,84,46,63,6,2,57,489]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Link=void 0;let v=class extends p.Disposable{get enabled(){return this._enabled}set enabled(a){a?(this.el.setAttribute("aria-disabled","false"),this.el.tabIndex=0,this.el.style.pointerEvents="auto",this.el.style.opacity="1",this.el.style.cursor="pointer",this._enabled=!1):(this.el.setAttribute("aria-disabled","true"),this.el.tabIndex=-1,this.el.style.pointerEvents="none",this.el.style.opacity="0.4",this.el.style.cursor="default",this._enabled=!0),this._enabled=a}constructor(a,i,n={},t){var r;super(),this._link=i,this._enabled=!0,this.el=(0,L.append)(a,(0,L.$)("a.monaco-link",{tabIndex:(r=i.tabIndex)!==null&&r!==void 0?r:0,href:i.href,title:i.title},i.label)),this.el.setAttribute("role","button");const u=this._register(new k.DomEmitter(this.el,"click")),f=this._register(new k.DomEmitter(this.el,"keypress")),c=S.Event.chain(f.event,l=>l.map(o=>new y.StandardKeyboardEvent(o)).filter(o=>o.keyCode===3)),d=this._register(new k.DomEmitter(this.el,E.EventType.Tap)).event;this._register(E.Gesture.addTarget(this.el));const s=S.Event.any(u.event,c,d);this._register(s(l=>{this.enabled&&(L.EventHelper.stop(l,!0),n?.opener?n.opener(this._link.href):t.open(this._link.href,{allowCommands:!0}))})),this.enabled=!0}};e.Link=v,e.Link=v=ke([ge(3,_.IOpenerService)],v)}),define(se[88],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IEditorProgressService=e.Progress=e.emptyProgressRunner=e.IProgressService=void 0,e.IProgressService=(0,L.createDecorator)("progressService"),e.emptyProgressRunner=Object.freeze({total(){},worked(){},done(){}});class k{constructor(E){this.callback=E}report(E){this._value=E,this.callback(this._value)}}e.Progress=k,k.None=Object.freeze({report(){}}),e.IEditorProgressService=(0,L.createDecorator)("editorProgressService")}),define(se[787],oe([1,0,14,19,2,20]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PickerQuickAccessProvider=e.TriggerAction=void 0;var S;(function(b){b[b.NO_ACTION=0]="NO_ACTION",b[b.CLOSE_PICKER=1]="CLOSE_PICKER",b[b.REFRESH_PICKER=2]="REFRESH_PICKER",b[b.REMOVE_ITEM=3]="REMOVE_ITEM"})(S||(e.TriggerAction=S={}));function p(b){const a=b;return Array.isArray(a.items)}function _(b){const a=b;return!!a.picks&&a.additionalPicks instanceof Promise}class v extends y.Disposable{constructor(a,i){super(),this.prefix=a,this.options=i}provide(a,i,n){var t;const r=new y.DisposableStore;a.canAcceptInBackground=!!(!((t=this.options)===null||t===void 0)&&t.canAcceptInBackground),a.matchOnLabel=a.matchOnDescription=a.matchOnDetail=a.sortByLabel=!1;let u;const f=r.add(new y.MutableDisposable),c=async()=>{var d;const s=f.value=new y.DisposableStore;u?.dispose(!0),a.busy=!1,u=new k.CancellationTokenSource(i);const l=u.token;let o=a.value.substring(this.prefix.length);!((d=this.options)===null||d===void 0)&&d.shouldSkipTrimPickFilter||(o=o.trim());const g=this._getPicks(o,s,l,n),h=(C,w)=>{var D;let I,T;if(p(C)?(I=C.items,T=C.active):I=C,I.length===0){if(w)return!1;(o.length>0||a.hideInput)&&(!((D=this.options)===null||D===void 0)&&D.noResultsPick)&&((0,E.isFunction)(this.options.noResultsPick)?I=[this.options.noResultsPick(o)]:I=[this.options.noResultsPick])}return a.items=I,T&&(a.activeItems=[T]),!0},m=async C=>{let w=!1,D=!1;await Promise.all([(async()=>{typeof C.mergeDelay=="number"&&(await(0,L.timeout)(C.mergeDelay),l.isCancellationRequested)||D||(w=h(C.picks,!0))})(),(async()=>{a.busy=!0;try{const I=await C.additionalPicks;if(l.isCancellationRequested)return;let T,A;p(C.picks)?(T=C.picks.items,A=C.picks.active):T=C.picks;let P,N;if(p(I)?(P=I.items,N=I.active):P=I,P.length>0||!w){let M;if(!A&&!N){const R=a.activeItems[0];R&&T.indexOf(R)!==-1&&(M=R)}h({items:[...T,...P],active:A||N||M})}}finally{l.isCancellationRequested||(a.busy=!1),D=!0}})()])};if(g!==null)if(_(g))await m(g);else if(!(g instanceof Promise))h(g);else{a.busy=!0;try{const C=await g;if(l.isCancellationRequested)return;_(C)?await m(C):h(C)}finally{l.isCancellationRequested||(a.busy=!1)}}};return r.add(a.onDidChangeValue(()=>c())),c(),r.add(a.onDidAccept(d=>{const[s]=a.selectedItems;typeof s?.accept=="function"&&(d.inBackground||a.hide(),s.accept(a.keyMods,d))})),r.add(a.onDidTriggerItemButton(async({button:d,item:s})=>{var l,o;if(typeof s.trigger=="function"){const g=(o=(l=s.buttons)===null||l===void 0?void 0:l.indexOf(d))!==null&&o!==void 0?o:-1;if(g>=0){const h=s.trigger(g,a.keyMods),m=typeof h=="number"?h:await h;if(i.isCancellationRequested)return;switch(m){case S.NO_ACTION:break;case S.CLOSE_PICKER:a.hide();break;case S.REFRESH_PICKER:c();break;case S.REMOVE_ITEM:{const C=a.items.indexOf(s);if(C!==-1){const w=a.items.slice(),D=w.splice(C,1),I=a.activeItems.filter(A=>A!==D[0]),T=a.keepScrollPosition;a.keepScrollPosition=!0,a.items=w,I&&(a.activeItems=I),a.keepScrollPosition=T}break}}}}})),r}}e.PickerQuickAccessProvider=v}),define(se[788],oe([1,0,7,232,2,100,178]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputBox=void 0;const S=L.$;class p extends y.Disposable{constructor(v,b,a){super(),this.parent=v,this.onKeyDown=n=>L.addStandardDisposableListener(this.findInput.inputBox.inputElement,L.EventType.KEY_DOWN,n),this.onDidChange=n=>this.findInput.onDidChange(n),this.container=L.append(this.parent,S(".quick-input-box")),this.findInput=this._register(new k.FindInput(this.container,void 0,{label:"",inputBoxStyles:b,toggleStyles:a}));const i=this.findInput.inputBox.inputElement;i.role="combobox",i.ariaHasPopup="menu",i.ariaAutoComplete="list",i.ariaExpanded="true"}get value(){return this.findInput.getValue()}set value(v){this.findInput.setValue(v)}select(v=null){this.findInput.inputBox.select(v)}isSelectionAtEnd(){return this.findInput.inputBox.isSelectionAtEnd()}get placeholder(){return this.findInput.inputBox.inputElement.getAttribute("placeholder")||""}set placeholder(v){this.findInput.inputBox.setPlaceHolder(v)}get password(){return this.findInput.inputBox.inputElement.type==="password"}set password(v){this.findInput.inputBox.inputElement.type=v?"password":"text"}set enabled(v){this.findInput.inputBox.inputElement.toggleAttribute("readonly",!v)}set toggles(v){this.findInput.setAdditionalToggles(v)}setAttribute(v,b){this.findInput.inputBox.inputElement.setAttribute(v,b)}showDecoration(v){v===E.default.Ignore?this.findInput.clearMessage():this.findInput.showMessage({type:v===E.default.Info?1:v===E.default.Warning?2:3,content:""})}stylesForType(v){return this.findInput.inputBox.stylesForType(v===E.default.Info?1:v===E.default.Warning?2:3)}setFocus(){this.findInput.focus()}layout(){this.findInput.inputBox.layout()}}e.QuickInputBox=p}),define(se[350],oe([1,0,7,84,6,46,63,118,170,399,751,178]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.renderQuickInputDescription=e.quickInputButtonToAction=void 0;const a={},i=new _.IdGenerator("quick-input-button-icon-");function n(u){if(!u)return;let f;const c=u.dark.toString();return a[c]?f=a[c]:(f=i.nextId(),L.createCSSRule(`.${f}, .hc-light .${f}`,`background-image: ${L.asCSSUrl(u.light||u.dark)}`),L.createCSSRule(`.vs-dark .${f}, .hc-black .${f}`,`background-image: ${L.asCSSUrl(u.dark)}`),a[c]=f),f}function t(u,f,c){let d=u.iconClass||n(u.iconPath);return u.alwaysVisible&&(d=d?`${d} always-visible`:"always-visible"),{id:f,label:"",tooltip:u.tooltip||"",class:d,enabled:!0,run:c}}e.quickInputButtonToAction=t;function r(u,f,c){L.reset(f);const d=(0,v.parseLinkedText)(u);let s=0;for(const l of d.nodes)if(typeof l=="string")f.append(...(0,p.renderLabelWithIcons)(l));else{let o=l.title;!o&&l.href.startsWith("command:")?o=(0,b.localize)(0,null,l.href.substring(8)):o||(o=l.href);const g=L.$("a",{href:l.href,title:o,tabIndex:s++},l.label);g.style.textDecoration="underline";const h=I=>{L.isEventLike(I)&&L.EventHelper.stop(I,!0),c.callback(l.href)},m=c.disposables.add(new k.DomEmitter(g,L.EventType.CLICK)).event,C=c.disposables.add(new k.DomEmitter(g,L.EventType.KEY_DOWN)).event,w=y.Event.chain(C,I=>I.filter(T=>{const A=new E.StandardKeyboardEvent(T);return A.equals(10)||A.equals(3)}));c.disposables.add(S.Gesture.addTarget(g));const D=c.disposables.add(new k.DomEmitter(g,S.EventType.Tap)).event;y.Event.any(m,D,w)(h,null,c.disposables),f.appendChild(g)}}e.renderQuickInputDescription=r}),define(se[70],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IQuickInputService=e.quickPickItemScorerAccessor=e.QuickPickItemScorerAccessor=e.ItemActivation=e.QuickInputHideReason=e.NO_KEY_MODS=void 0,e.NO_KEY_MODS={ctrlCmd:!1,alt:!1};var k;(function(S){S[S.Blur=1]="Blur",S[S.Gesture=2]="Gesture",S[S.Other=3]="Other"})(k||(e.QuickInputHideReason=k={}));var y;(function(S){S[S.NONE=0]="NONE",S[S.FIRST=1]="FIRST",S[S.SECOND=2]="SECOND",S[S.LAST=3]="LAST"})(y||(e.ItemActivation=y={}));class E{constructor(p){this.options=p}}e.QuickPickItemScorerAccessor=E,e.quickPickItemScorerAccessor=new E,e.IQuickInputService=(0,L.createDecorator)("quickInputService")}),define(se[37],oe([1,0,90,20]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Registry=void 0;class y{constructor(){this.data=new Map}add(S,p){L.ok(k.isString(S)),L.ok(k.isObject(p)),L.ok(!this.data.has(S),"There is already an extension with this id"),this.data.set(S,p)}as(S){return this.data.get(S)||null}}e.Registry=new y}),define(se[351],oe([1,0,37]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LocalSelectionTransfer=e.Extensions=e.CodeDataTransfers=void 0,e.CodeDataTransfers={EDITORS:"CodeEditors",FILES:"CodeFiles"};class k{}e.Extensions={DragAndDropContribution:"workbench.contributions.dragAndDrop"},L.Registry.add(e.Extensions.DragAndDropContribution,new k);class y{constructor(){}static getInstance(){return y.INSTANCE}hasData(S){return S&&S===this.proto}getData(S){if(this.hasData(S))return this.data}}e.LocalSelectionTransfer=y,y.INSTANCE=new y}),define(se[352],oe([1,0,198,176,109,22,351]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toExternalVSDataTransfer=e.toVSDataTransfer=void 0;function p(a){const i=new k.VSDataTransfer;for(const n of a.items){const t=n.type;if(n.kind==="string"){const r=new Promise(u=>n.getAsString(u));i.append(t,(0,k.createStringDataTransferItem)(r))}else if(n.kind==="file"){const r=n.getAsFile();r&&i.append(t,_(r))}}return i}e.toVSDataTransfer=p;function _(a){const i=a.path?E.URI.parse(a.path):void 0;return(0,k.createFileDataTransferItem)(a.name,i,async()=>new Uint8Array(await a.arrayBuffer()))}const v=Object.freeze([S.CodeDataTransfers.EDITORS,S.CodeDataTransfers.FILES,L.DataTransfers.RESOURCES,L.DataTransfers.INTERNAL_URI_LIST]);function b(a,i=!1){const n=p(a),t=n.get(L.DataTransfers.INTERNAL_URI_LIST);if(t)n.replace(y.Mimes.uriList,t);else if(i||!n.has(y.Mimes.uriList)){const r=[];for(const u of a.items){const f=u.getAsFile();if(f){const c=f.path;try{c?r.push(E.URI.file(c).toString()):r.push(E.URI.parse(f.name,!0).toString())}catch{}}}r.length&&n.replace(y.Mimes.uriList,(0,k.createStringDataTransferItem)(k.UriList.create(r)))}for(const r of v)n.delete(r);return n}e.toExternalVSDataTransfer=b}),define(se[245],oe([1,0,6,37]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Extensions=void 0,e.Extensions={JSONContribution:"base.contributions.json"};function y(p){return p.length>0&&p.charAt(p.length-1)==="#"?p.substring(0,p.length-1):p}class E{constructor(){this._onDidChangeSchema=new L.Emitter,this.schemasById={}}registerSchema(_,v){this.schemasById[y(_)]=v,this._onDidChangeSchema.fire(_)}notifySchemaChanged(_){this._onDidChangeSchema.fire(_)}}const S=new E;k.Registry.add(e.Extensions.JSONContribution,S)}),define(se[98],oe([1,0,13,6,20,737,27,245,37]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.validateProperty=e.getDefaultValue=e.overrideIdentifiersFromKey=e.OVERRIDE_PROPERTY_REGEX=e.OVERRIDE_PROPERTY_PATTERN=e.resourceLanguageSettingsSchemaId=e.resourceSettings=e.windowSettings=e.machineOverridableSettings=e.machineSettings=e.applicationSettings=e.allSettings=e.Extensions=void 0,e.Extensions={Configuration:"base.contributions.configuration"},e.allSettings={properties:{},patternProperties:{}},e.applicationSettings={properties:{},patternProperties:{}},e.machineSettings={properties:{},patternProperties:{}},e.machineOverridableSettings={properties:{},patternProperties:{}},e.windowSettings={properties:{},patternProperties:{}},e.resourceSettings={properties:{},patternProperties:{}},e.resourceLanguageSettingsSchemaId="vscode://schemas/settings/resourceLanguage";const v=_.Registry.as(p.Extensions.JSONContribution);class b{constructor(){this.overrideIdentifiers=new Set,this._onDidSchemaChange=new k.Emitter,this._onDidUpdateConfiguration=new k.Emitter,this.configurationDefaultsOverrides=new Map,this.defaultLanguageConfigurationOverridesNode={id:"defaultOverrides",title:E.localize(0,null),properties:{}},this.configurationContributors=[this.defaultLanguageConfigurationOverridesNode],this.resourceLanguageSettingsSchema={properties:{},patternProperties:{},additionalProperties:!0,allowTrailingCommas:!0,allowComments:!0},this.configurationProperties={},this.policyConfigurations=new Map,this.excludedConfigurationProperties={},v.registerSchema(e.resourceLanguageSettingsSchemaId,this.resourceLanguageSettingsSchema),this.registerOverridePropertyPatternKey()}registerConfiguration(c,d=!0){this.registerConfigurations([c],d)}registerConfigurations(c,d=!0){const s=new Set;this.doRegisterConfigurations(c,d,s),v.registerSchema(e.resourceLanguageSettingsSchemaId,this.resourceLanguageSettingsSchema),this._onDidSchemaChange.fire(),this._onDidUpdateConfiguration.fire({properties:s})}registerDefaultConfigurations(c){const d=new Set;this.doRegisterDefaultConfigurations(c,d),this._onDidSchemaChange.fire(),this._onDidUpdateConfiguration.fire({properties:d,defaultsOverrides:!0})}doRegisterDefaultConfigurations(c,d){var s;const l=[];for(const{overrides:o,source:g}of c)for(const h in o)if(d.add(h),e.OVERRIDE_PROPERTY_REGEX.test(h)){const m=this.configurationDefaultsOverrides.get(h),C=(s=m?.valuesSources)!==null&&s!==void 0?s:new Map;if(g)for(const T of Object.keys(o[h]))C.set(T,g);const w={...m?.value||{},...o[h]};this.configurationDefaultsOverrides.set(h,{source:g,value:w,valuesSources:C});const D=(0,S.getLanguageTagSettingPlainKey)(h),I={type:"object",default:w,description:E.localize(1,null,D),$ref:e.resourceLanguageSettingsSchemaId,defaultDefaultValue:w,source:y.isString(g)?void 0:g,defaultValueSource:g};l.push(...n(h)),this.configurationProperties[h]=I,this.defaultLanguageConfigurationOverridesNode.properties[h]=I}else{this.configurationDefaultsOverrides.set(h,{value:o[h],source:g});const m=this.configurationProperties[h];m&&(this.updatePropertyDefaultValue(h,m),this.updateSchema(h,m))}this.doRegisterOverrideIdentifiers(l)}registerOverrideIdentifiers(c){this.doRegisterOverrideIdentifiers(c),this._onDidSchemaChange.fire()}doRegisterOverrideIdentifiers(c){for(const d of c)this.overrideIdentifiers.add(d);this.updateOverridePropertyPatternKey()}doRegisterConfigurations(c,d,s){c.forEach(l=>{this.validateAndRegisterProperties(l,d,l.extensionInfo,l.restrictedProperties,void 0,s),this.configurationContributors.push(l),this.registerJSONConfiguration(l)})}validateAndRegisterProperties(c,d=!0,s,l,o=3,g){var h;o=y.isUndefinedOrNull(c.scope)?o:c.scope;const m=c.properties;if(m)for(const w in m){const D=m[w];if(d&&u(w,D)){delete m[w];continue}if(D.source=s,D.defaultDefaultValue=m[w].default,this.updatePropertyDefaultValue(w,D),e.OVERRIDE_PROPERTY_REGEX.test(w)?D.scope=void 0:(D.scope=y.isUndefinedOrNull(D.scope)?o:D.scope,D.restricted=y.isUndefinedOrNull(D.restricted)?!!l?.includes(w):D.restricted),m[w].hasOwnProperty("included")&&!m[w].included){this.excludedConfigurationProperties[w]=m[w],delete m[w];continue}else this.configurationProperties[w]=m[w],!((h=m[w].policy)===null||h===void 0)&&h.name&&this.policyConfigurations.set(m[w].policy.name,w);!m[w].deprecationMessage&&m[w].markdownDeprecationMessage&&(m[w].deprecationMessage=m[w].markdownDeprecationMessage),g.add(w)}const C=c.allOf;if(C)for(const w of C)this.validateAndRegisterProperties(w,d,s,l,o,g)}getConfigurationProperties(){return this.configurationProperties}getPolicyConfigurations(){return this.policyConfigurations}registerJSONConfiguration(c){const d=s=>{const l=s.properties;if(l)for(const g in l)this.updateSchema(g,l[g]);const o=s.allOf;o?.forEach(d)};d(c)}updateSchema(c,d){switch(e.allSettings.properties[c]=d,d.scope){case 1:e.applicationSettings.properties[c]=d;break;case 2:e.machineSettings.properties[c]=d;break;case 6:e.machineOverridableSettings.properties[c]=d;break;case 3:e.windowSettings.properties[c]=d;break;case 4:e.resourceSettings.properties[c]=d;break;case 5:e.resourceSettings.properties[c]=d,this.resourceLanguageSettingsSchema.properties[c]=d;break}}updateOverridePropertyPatternKey(){for(const c of this.overrideIdentifiers.values()){const d=`[${c}]`,s={type:"object",description:E.localize(2,null),errorMessage:E.localize(3,null),$ref:e.resourceLanguageSettingsSchemaId};this.updatePropertyDefaultValue(d,s),e.allSettings.properties[d]=s,e.applicationSettings.properties[d]=s,e.machineSettings.properties[d]=s,e.machineOverridableSettings.properties[d]=s,e.windowSettings.properties[d]=s,e.resourceSettings.properties[d]=s}}registerOverridePropertyPatternKey(){const c={type:"object",description:E.localize(4,null),errorMessage:E.localize(5,null),$ref:e.resourceLanguageSettingsSchemaId};e.allSettings.patternProperties[e.OVERRIDE_PROPERTY_PATTERN]=c,e.applicationSettings.patternProperties[e.OVERRIDE_PROPERTY_PATTERN]=c,e.machineSettings.patternProperties[e.OVERRIDE_PROPERTY_PATTERN]=c,e.machineOverridableSettings.patternProperties[e.OVERRIDE_PROPERTY_PATTERN]=c,e.windowSettings.patternProperties[e.OVERRIDE_PROPERTY_PATTERN]=c,e.resourceSettings.patternProperties[e.OVERRIDE_PROPERTY_PATTERN]=c,this._onDidSchemaChange.fire()}updatePropertyDefaultValue(c,d){const s=this.configurationDefaultsOverrides.get(c);let l=s?.value,o=s?.source;y.isUndefined(l)&&(l=d.defaultDefaultValue,o=void 0),y.isUndefined(l)&&(l=t(d.type)),d.default=l,d.defaultValueSource=o}}const a="\\[([^\\]]+)\\]",i=new RegExp(a,"g");e.OVERRIDE_PROPERTY_PATTERN=`^(${a})+$`,e.OVERRIDE_PROPERTY_REGEX=new RegExp(e.OVERRIDE_PROPERTY_PATTERN);function n(f){const c=[];if(e.OVERRIDE_PROPERTY_REGEX.test(f)){let d=i.exec(f);for(;d?.length;){const s=d[1].trim();s&&c.push(s),d=i.exec(f)}}return(0,L.distinct)(c)}e.overrideIdentifiersFromKey=n;function t(f){switch(Array.isArray(f)?f[0]:f){case"boolean":return!1;case"integer":case"number":return 0;case"string":return"";case"array":return[];case"object":return{};default:return null}}e.getDefaultValue=t;const r=new b;_.Registry.add(e.Extensions.Configuration,r);function u(f,c){var d,s,l,o;return f.trim()?e.OVERRIDE_PROPERTY_REGEX.test(f)?E.localize(7,null,f):r.getConfigurationProperties()[f]!==void 0?E.localize(8,null,f):!((d=c.policy)===null||d===void 0)&&d.name&&r.getPolicyConfigurations().get((s=c.policy)===null||s===void 0?void 0:s.name)!==void 0?E.localize(9,null,f,(l=c.policy)===null||l===void 0?void 0:l.name,r.getPolicyConfigurations().get((o=c.policy)===null||o===void 0?void 0:o.name)):null:E.localize(6,null)}e.validateProperty=u}),define(se[246],oe([1,0,278,36,179,634,98,37]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isDiffEditorConfigurationKey=e.isEditorConfigurationKey=e.editorConfigurationBaseNode=void 0,e.editorConfigurationBaseNode=Object.freeze({id:"editor",order:5,type:"object",title:E.localize(0,null),scope:5});const _={...e.editorConfigurationBaseNode,properties:{"editor.tabSize":{type:"number",default:y.EDITOR_MODEL_DEFAULTS.tabSize,minimum:1,markdownDescription:E.localize(1,null,"`#editor.detectIndentation#`")},"editor.indentSize":{anyOf:[{type:"string",enum:["tabSize"]},{type:"number",minimum:1}],default:"tabSize",markdownDescription:E.localize(2,null)},"editor.insertSpaces":{type:"boolean",default:y.EDITOR_MODEL_DEFAULTS.insertSpaces,markdownDescription:E.localize(3,null,"`#editor.detectIndentation#`")},"editor.detectIndentation":{type:"boolean",default:y.EDITOR_MODEL_DEFAULTS.detectIndentation,markdownDescription:E.localize(4,null,"`#editor.tabSize#`","`#editor.insertSpaces#`")},"editor.trimAutoWhitespace":{type:"boolean",default:y.EDITOR_MODEL_DEFAULTS.trimAutoWhitespace,description:E.localize(5,null)},"editor.largeFileOptimizations":{type:"boolean",default:y.EDITOR_MODEL_DEFAULTS.largeFileOptimizations,description:E.localize(6,null)},"editor.wordBasedSuggestions":{enum:["off","currentDocument","matchingDocuments","allDocuments"],default:"matchingDocuments",enumDescriptions:[E.localize(7,null),E.localize(8,null),E.localize(9,null),E.localize(10,null)],description:E.localize(11,null)},"editor.semanticHighlighting.enabled":{enum:[!0,!1,"configuredByTheme"],enumDescriptions:[E.localize(12,null),E.localize(13,null),E.localize(14,null)],default:"configuredByTheme",description:E.localize(15,null)},"editor.stablePeek":{type:"boolean",default:!1,markdownDescription:E.localize(16,null)},"editor.maxTokenizationLineLength":{type:"integer",default:2e4,description:E.localize(17,null)},"editor.experimental.asyncTokenization":{type:"boolean",default:!1,description:E.localize(18,null),tags:["experimental"]},"editor.experimental.asyncTokenizationLogging":{type:"boolean",default:!1,description:E.localize(19,null)},"editor.experimental.asyncTokenizationVerification":{type:"boolean",default:!1,description:E.localize(20,null),tags:["experimental"]},"editor.language.brackets":{type:["array","null"],default:null,description:E.localize(21,null),items:{type:"array",items:[{type:"string",description:E.localize(22,null)},{type:"string",description:E.localize(23,null)}]}},"editor.language.colorizedBracketPairs":{type:["array","null"],default:null,description:E.localize(24,null),items:{type:"array",items:[{type:"string",description:E.localize(25,null)},{type:"string",description:E.localize(26,null)}]}},"diffEditor.maxComputationTime":{type:"number",default:L.diffEditorDefaultOptions.maxComputationTime,description:E.localize(27,null)},"diffEditor.maxFileSize":{type:"number",default:L.diffEditorDefaultOptions.maxFileSize,description:E.localize(28,null)},"diffEditor.renderSideBySide":{type:"boolean",default:L.diffEditorDefaultOptions.renderSideBySide,description:E.localize(29,null)},"diffEditor.renderSideBySideInlineBreakpoint":{type:"number",default:L.diffEditorDefaultOptions.renderSideBySideInlineBreakpoint,description:E.localize(30,null)},"diffEditor.useInlineViewWhenSpaceIsLimited":{type:"boolean",default:L.diffEditorDefaultOptions.useInlineViewWhenSpaceIsLimited,description:E.localize(31,null)},"diffEditor.renderMarginRevertIcon":{type:"boolean",default:L.diffEditorDefaultOptions.renderMarginRevertIcon,description:E.localize(32,null)},"diffEditor.ignoreTrimWhitespace":{type:"boolean",default:L.diffEditorDefaultOptions.ignoreTrimWhitespace,description:E.localize(33,null)},"diffEditor.renderIndicators":{type:"boolean",default:L.diffEditorDefaultOptions.renderIndicators,description:E.localize(34,null)},"diffEditor.codeLens":{type:"boolean",default:L.diffEditorDefaultOptions.diffCodeLens,description:E.localize(35,null)},"diffEditor.wordWrap":{type:"string",enum:["off","on","inherit"],default:L.diffEditorDefaultOptions.diffWordWrap,markdownEnumDescriptions:[E.localize(36,null),E.localize(37,null),E.localize(38,null,"`#editor.wordWrap#`")]},"diffEditor.diffAlgorithm":{type:"string",enum:["legacy","advanced"],default:L.diffEditorDefaultOptions.diffAlgorithm,markdownEnumDescriptions:[E.localize(39,null),E.localize(40,null)],tags:["experimental"]},"diffEditor.hideUnchangedRegions.enabled":{type:"boolean",default:L.diffEditorDefaultOptions.hideUnchangedRegions.enabled,markdownDescription:E.localize(41,null)},"diffEditor.hideUnchangedRegions.revealLineCount":{type:"integer",default:L.diffEditorDefaultOptions.hideUnchangedRegions.revealLineCount,markdownDescription:E.localize(42,null),minimum:1},"diffEditor.hideUnchangedRegions.minimumLineCount":{type:"integer",default:L.diffEditorDefaultOptions.hideUnchangedRegions.minimumLineCount,markdownDescription:E.localize(43,null),minimum:1},"diffEditor.hideUnchangedRegions.contextLineCount":{type:"integer",default:L.diffEditorDefaultOptions.hideUnchangedRegions.contextLineCount,markdownDescription:E.localize(44,null),minimum:1},"diffEditor.experimental.showMoves":{type:"boolean",default:L.diffEditorDefaultOptions.experimental.showMoves,markdownDescription:E.localize(45,null)},"diffEditor.experimental.showEmptyDecorations":{type:"boolean",default:L.diffEditorDefaultOptions.experimental.showEmptyDecorations,description:E.localize(46,null)}}};function v(r){return typeof r.type<"u"||typeof r.anyOf<"u"}for(const r of k.editorOptionsRegistry){const u=r.schema;if(typeof u<"u")if(v(u))_.properties[`editor.${r.name}`]=u;else for(const f in u)Object.hasOwnProperty.call(u,f)&&(_.properties[f]=u[f])}let b=null;function a(){return b===null&&(b=Object.create(null),Object.keys(_.properties).forEach(r=>{b[r]=!0})),b}function i(r){return a()[`editor.${r}`]||!1}e.isEditorConfigurationKey=i;function n(r){return a()[`diffEditor.${r}`]||!1}e.isDiffEditorConfigurationKey=n,p.Registry.as(S.Extensions.Configuration).registerConfiguration(_)}),define(se[80],oe([1,0,644,6,37,109,98]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PLAINTEXT_EXTENSION=e.PLAINTEXT_LANGUAGE_ID=e.ModesRegistry=e.EditorModesRegistry=e.Extensions=void 0,e.Extensions={ModesRegistry:"editor.modesRegistry"};class p{constructor(){this._onDidChangeLanguages=new k.Emitter,this.onDidChangeLanguages=this._onDidChangeLanguages.event,this._languages=[]}registerLanguage(v){return this._languages.push(v),this._onDidChangeLanguages.fire(void 0),{dispose:()=>{for(let b=0,a=this._languages.length;b<a;b++)if(this._languages[b]===v){this._languages.splice(b,1);return}}}}getLanguages(){return this._languages}}e.EditorModesRegistry=p,e.ModesRegistry=new p,y.Registry.add(e.Extensions.ModesRegistry,e.ModesRegistry),e.PLAINTEXT_LANGUAGE_ID="plaintext",e.PLAINTEXT_EXTENSION=".txt",e.ModesRegistry.registerLanguage({id:e.PLAINTEXT_LANGUAGE_ID,extensions:[e.PLAINTEXT_EXTENSION],aliases:[L.localize(0,null),"text"],mimetypes:[E.Mimes.text]}),y.Registry.as(S.Extensions.Configuration).registerDefaultConfigurations([{overrides:{"[plaintext]":{"editor.unicodeHighlight.ambiguousCharacters":!1,"editor.unicodeHighlight.invisibleCharacters":!1}}}])}),define(se[104],oe([1,0,186,93,12,6,2,72,43,80,337,57,450]),function(te,e,L,k,y,E,S,p,_,v,b,a){"use strict";var i;Object.defineProperty(e,"__esModule",{value:!0}),e.openLinkFromMarkdown=e.MarkdownRenderer=void 0;let n=i=class{constructor(f,c,d){this._options=f,this._languageService=c,this._openerService=d,this._onDidRenderAsync=new E.Emitter,this.onDidRenderAsync=this._onDidRenderAsync.event}dispose(){this._onDidRenderAsync.dispose()}render(f,c,d){if(!f)return{element:document.createElement("span"),dispose:()=>{}};const s=new S.DisposableStore,l=s.add((0,L.renderMarkdown)(f,{...this._getRenderOptions(f,s),...c},d));return l.element.classList.add("rendered-markdown"),{element:l.element,dispose:()=>s.dispose()}}_getRenderOptions(f,c){return{codeBlockRenderer:async(d,s)=>{var l,o,g;let h;d?h=this._languageService.getLanguageIdByLanguageName(d):this._options.editor&&(h=(l=this._options.editor.getModel())===null||l===void 0?void 0:l.getLanguageId()),h||(h=v.PLAINTEXT_LANGUAGE_ID);const m=await(0,b.tokenizeToString)(this._languageService,s,h),C=document.createElement("span");if(C.innerHTML=(g=(o=i._ttpTokenizer)===null||o===void 0?void 0:o.createHTML(m))!==null&&g!==void 0?g:m,this._options.editor){const w=this._options.editor.getOption(50);(0,p.applyFontInfo)(C,w)}else this._options.codeBlockFontFamily&&(C.style.fontFamily=this._options.codeBlockFontFamily);return this._options.codeBlockFontSize!==void 0&&(C.style.fontSize=this._options.codeBlockFontSize),C},asyncRenderCallback:()=>this._onDidRenderAsync.fire(),actionHandler:{callback:d=>t(this._openerService,d,f.isTrusted),disposables:c}}}};e.MarkdownRenderer=n,n._ttpTokenizer=(0,k.createTrustedTypesPolicy)("tokenizeToString",{createHTML(u){return u}}),e.MarkdownRenderer=n=i=ke([ge(1,_.ILanguageService),ge(2,a.IOpenerService)],n);async function t(u,f,c){try{return await u.open(f,{fromUserGesture:!0,allowContributedOpeners:!0,allowCommands:r(c)})}catch(d){return(0,y.onUnexpectedError)(d),!1}}e.openLinkFromMarkdown=t;function r(u){return u===!0?!0:u&&Array.isArray(u.enabledCommands)?u.enabledCommands:!1}}),define(se[789],oe([1,0,2,6,7,34,27,36,227,76,57,8,104,58,632,17,69,48,449]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HoverWidget=void 0;const c=y.$;let d=class extends v.Widget{get _targetWindow(){return y.getWindow(this._target.targetElements[0])}get _targetDocumentElement(){return y.getWindow(this._target.targetElements[0]).document.documentElement}get isDisposed(){return this._isDisposed}get isMouseIn(){return this._lockMouseTracker.isMouseIn}get domNode(){return this._hover.containerDomNode}get onDispose(){return this._onDispose.event}get onRequestLayout(){return this._onRequestLayout.event}get anchor(){return this._hoverPosition===2?0:1}get x(){return this._x}get y(){return this._y}get isLocked(){return this._isLocked}set isLocked(g){this._isLocked!==g&&(this._isLocked=g,this._hoverContainer.classList.toggle("locked",this._isLocked))}constructor(g,h,m,C,w,D){var I,T,A,P,N,M,R,x;super(),this._keybindingService=h,this._configurationService=m,this._openerService=C,this._instantiationService=w,this._accessibilityService=D,this._messageListeners=new L.DisposableStore,this._isDisposed=!1,this._forcePosition=!1,this._x=0,this._y=0,this._isLocked=!1,this._enableFocusTraps=!1,this._addedFocusTrap=!1,this._onDispose=this._register(new k.Emitter),this._onRequestLayout=this._register(new k.Emitter),this._linkHandler=g.linkHandler||(F=>(0,i.openLinkFromMarkdown)(this._openerService,F,(0,n.isMarkdownString)(g.content)?g.content.isTrusted:void 0)),this._target="targetElements"in g.target?g.target:new l(g.target),this._hoverPointer=!((I=g.appearance)===null||I===void 0)&&I.showPointer?c("div.workbench-hover-pointer"):void 0,this._hover=this._register(new _.HoverWidget),this._hover.containerDomNode.classList.add("workbench-hover","fadeIn"),!((T=g.appearance)===null||T===void 0)&&T.compact&&this._hover.containerDomNode.classList.add("workbench-hover","compact"),!((A=g.appearance)===null||A===void 0)&&A.skipFadeInAnimation&&this._hover.containerDomNode.classList.add("skip-fade-in"),g.additionalClasses&&this._hover.containerDomNode.classList.add(...g.additionalClasses),!((P=g.position)===null||P===void 0)&&P.forcePosition&&(this._forcePosition=!0),g.trapFocus&&(this._enableFocusTraps=!0),this._hoverPosition=(M=(N=g.position)===null||N===void 0?void 0:N.hoverPosition)!==null&&M!==void 0?M:3,this.onmousedown(this._hover.containerDomNode,F=>F.stopPropagation()),this.onkeydown(this._hover.containerDomNode,F=>{F.equals(9)&&this.dispose()}),this._register(y.addDisposableListener(this._targetWindow,"blur",()=>this.dispose()));const O=c("div.hover-row.markdown-hover"),B=c("div.hover-contents");if(typeof g.content=="string")B.textContent=g.content,B.style.whiteSpace="pre-wrap";else if(g.content instanceof HTMLElement)B.appendChild(g.content),B.classList.add("html-hover-contents");else{const F=g.content,q=this._instantiationService.createInstance(i.MarkdownRenderer,{codeBlockFontFamily:this._configurationService.getValue("editor").fontFamily||p.EDITOR_FONT_DEFAULTS.fontFamily}),{element:ie}=q.render(F,{actionHandler:{callback:ae=>this._linkHandler(ae),disposables:this._messageListeners},asyncRenderCallback:()=>{B.classList.add("code-hover-contents"),this.layout(),this._onRequestLayout.fire()}});B.appendChild(ie)}if(O.appendChild(B),this._hover.contentsDomNode.appendChild(O),g.actions&&g.actions.length>0){const F=c("div.hover-row.status-bar"),q=c("div.actions");g.actions.forEach(ie=>{const ae=this._keybindingService.lookupKeybinding(ie.commandId),ne=ae?ae.getLabel():null;_.HoverAction.render(q,{label:ie.label,commandId:ie.commandId,run:$=>{ie.run($),this.dispose()},iconClass:ie.iconClass},ne)}),F.appendChild(q),this._hover.containerDomNode.appendChild(F)}this._hoverContainer=c("div.workbench-hover-container"),this._hoverPointer&&this._hoverContainer.appendChild(this._hoverPointer),this._hoverContainer.appendChild(this._hover.containerDomNode);let W;if(g.actions&&g.actions.length>0?W=!1:((R=g.persistence)===null||R===void 0?void 0:R.hideOnHover)===void 0?W=typeof g.content=="string"||(0,n.isMarkdownString)(g.content)&&!g.content.value.includes("](")&&!g.content.value.includes("</a>"):W=g.persistence.hideOnHover,W&&(!((x=g.appearance)===null||x===void 0)&&x.showHoverHint)){const F=c("div.hover-row.status-bar"),q=c("div.info");q.textContent=(0,t.localize)(0,null,r.isMacintosh?"Option":"Alt"),F.appendChild(q),this._hover.containerDomNode.appendChild(F)}const V=[...this._target.targetElements];W||V.push(this._hoverContainer);const K=this._register(new s(V));if(this._register(K.onMouseOut(()=>{this._isLocked||this.dispose()})),W){const F=[...this._target.targetElements,this._hoverContainer];this._lockMouseTracker=this._register(new s(F)),this._register(this._lockMouseTracker.onMouseOut(()=>{this._isLocked||this.dispose()}))}else this._lockMouseTracker=K}addFocusTrap(){if(!this._enableFocusTraps||this._addedFocusTrap)return;this._addedFocusTrap=!0;const g=this._hover.containerDomNode,h=this.findLastFocusableChild(this._hover.containerDomNode);if(h){const m=y.prepend(this._hoverContainer,c("div")),C=y.append(this._hoverContainer,c("div"));m.tabIndex=0,C.tabIndex=0,this._register(y.addDisposableListener(C,"focus",w=>{g.focus(),w.preventDefault()})),this._register(y.addDisposableListener(m,"focus",w=>{h.focus(),w.preventDefault()}))}}findLastFocusableChild(g){if(g.hasChildNodes())for(let h=0;h<g.childNodes.length;h++){const m=g.childNodes.item(g.childNodes.length-h-1);if(m.nodeType===m.ELEMENT_NODE){const w=m;if(typeof w.tabIndex=="number"&&w.tabIndex>=0)return w}const C=this.findLastFocusableChild(m);if(C)return C}}render(g){var h;g.appendChild(this._hoverContainer);const C=this._hoverContainer.contains(this._hoverContainer.ownerDocument.activeElement)&&(0,_.getHoverAccessibleViewHint)(this._configurationService.getValue("accessibility.verbosity.hover")===!0&&this._accessibilityService.isScreenReaderOptimized(),(h=this._keybindingService.lookupKeybinding("editor.action.accessibleView"))===null||h===void 0?void 0:h.getAriaLabel());C&&(0,f.status)(C),this.layout(),this.addFocusTrap()}layout(){this._hover.containerDomNode.classList.remove("right-aligned"),this._hover.contentsDomNode.style.maxHeight="";const g=P=>{const N=y.getDomNodeZoomLevel(P),M=P.getBoundingClientRect();return{top:M.top*N,bottom:M.bottom*N,right:M.right*N,left:M.left*N}},h=this._target.targetElements.map(P=>g(P)),m=Math.min(...h.map(P=>P.top)),C=Math.max(...h.map(P=>P.right)),w=Math.max(...h.map(P=>P.bottom)),D=Math.min(...h.map(P=>P.left)),I=C-D,T=w-m,A={top:m,right:C,bottom:w,left:D,width:I,height:T,center:{x:D+I/2,y:m+T/2}};if(this.adjustHorizontalHoverPosition(A),this.adjustVerticalHoverPosition(A),this.adjustHoverMaxHeight(A),this._hoverContainer.style.padding="",this._hoverContainer.style.margin="",this._hoverPointer){switch(this._hoverPosition){case 1:A.left+=3,A.right+=3,this._hoverContainer.style.paddingLeft="3px",this._hoverContainer.style.marginLeft="-3px";break;case 0:A.left-=3,A.right-=3,this._hoverContainer.style.paddingRight="3px",this._hoverContainer.style.marginRight="-3px";break;case 2:A.top+=3,A.bottom+=3,this._hoverContainer.style.paddingTop="3px",this._hoverContainer.style.marginTop="-3px";break;case 3:A.top-=3,A.bottom-=3,this._hoverContainer.style.paddingBottom="3px",this._hoverContainer.style.marginBottom="-3px";break}A.center.x=A.left+I/2,A.center.y=A.top+T/2}this.computeXCordinate(A),this.computeYCordinate(A),this._hoverPointer&&(this._hoverPointer.classList.remove("top"),this._hoverPointer.classList.remove("left"),this._hoverPointer.classList.remove("right"),this._hoverPointer.classList.remove("bottom"),this.setHoverPointerPosition(A)),this._hover.onContentsChanged()}computeXCordinate(g){const h=this._hover.containerDomNode.clientWidth+2;this._target.x!==void 0?this._x=this._target.x:this._hoverPosition===1?this._x=g.right:this._hoverPosition===0?this._x=g.left-h:(this._hoverPointer?this._x=g.center.x-this._hover.containerDomNode.clientWidth/2:this._x=g.left,this._x+h>=this._targetDocumentElement.clientWidth&&(this._hover.containerDomNode.classList.add("right-aligned"),this._x=Math.max(this._targetDocumentElement.clientWidth-h-2,this._targetDocumentElement.clientLeft))),this._x<this._targetDocumentElement.clientLeft&&(this._x=g.left+2)}computeYCordinate(g){this._target.y!==void 0?this._y=this._target.y:this._hoverPosition===3?this._y=g.top:this._hoverPosition===2?this._y=g.bottom-2:this._hoverPointer?this._y=g.center.y+this._hover.containerDomNode.clientHeight/2:this._y=g.bottom,this._y>this._targetWindow.innerHeight&&(this._y=g.bottom)}adjustHorizontalHoverPosition(g){if(this._target.x===void 0){if(this._forcePosition){const h=(this._hoverPointer?3:0)+2;this._hoverPosition===1?this._hover.containerDomNode.style.maxWidth=`${this._targetDocumentElement.clientWidth-g.right-h}px`:this._hoverPosition===0&&(this._hover.containerDomNode.style.maxWidth=`${g.left-h}px`);return}this._hoverPosition===1?this._targetDocumentElement.clientWidth-g.right<this._hover.containerDomNode.clientWidth&&(g.left>=this._hover.containerDomNode.clientWidth?this._hoverPosition=0:this._hoverPosition=2):this._hoverPosition===0&&(g.left<this._hover.containerDomNode.clientWidth&&(this._targetDocumentElement.clientWidth-g.right>=this._hover.containerDomNode.clientWidth?this._hoverPosition=1:this._hoverPosition=2),g.left-this._hover.containerDomNode.clientWidth<=this._targetDocumentElement.clientLeft&&(this._hoverPosition=1))}}adjustVerticalHoverPosition(g){this._target.y!==void 0||this._forcePosition||(this._hoverPosition===3?g.top-this._hover.containerDomNode.clientHeight<0&&(this._hoverPosition=2):this._hoverPosition===2&&g.bottom+this._hover.containerDomNode.clientHeight>this._targetWindow.innerHeight&&(this._hoverPosition=3))}adjustHoverMaxHeight(g){let h=this._targetWindow.innerHeight/2;if(this._forcePosition){const m=(this._hoverPointer?3:0)+2;this._hoverPosition===3?h=Math.min(h,g.top-m):this._hoverPosition===2&&(h=Math.min(h,this._targetWindow.innerHeight-g.bottom-m))}if(this._hover.containerDomNode.style.maxHeight=`${h}px`,this._hover.contentsDomNode.clientHeight<this._hover.contentsDomNode.scrollHeight){const m=`${this._hover.scrollbar.options.verticalScrollbarSize}px`;this._hover.contentsDomNode.style.paddingRight!==m&&(this._hover.contentsDomNode.style.paddingRight=m)}}setHoverPointerPosition(g){if(this._hoverPointer)switch(this._hoverPosition){case 0:case 1:{this._hoverPointer.classList.add(this._hoverPosition===0?"right":"left");const h=this._hover.containerDomNode.clientHeight;h>g.height?this._hoverPointer.style.top=`${g.center.y-(this._y-h)-3}px`:this._hoverPointer.style.top=`${Math.round(h/2)-3}px`;break}case 3:case 2:{this._hoverPointer.classList.add(this._hoverPosition===3?"bottom":"top");const h=this._hover.containerDomNode.clientWidth;let m=Math.round(h/2)-3;const C=this._x+m;(C<g.left||C>g.right)&&(m=g.center.x-this._x-3),this._hoverPointer.style.left=`${m}px`;break}}}focus(){this._hover.containerDomNode.focus()}dispose(){this._isDisposed||(this._onDispose.fire(),this._hoverContainer.remove(),this._messageListeners.dispose(),this._target.dispose(),super.dispose()),this._isDisposed=!0}};e.HoverWidget=d,e.HoverWidget=d=ke([ge(1,E.IKeybindingService),ge(2,S.IConfigurationService),ge(3,b.IOpenerService),ge(4,a.IInstantiationService),ge(5,u.IAccessibilityService)],d);class s extends v.Widget{get onMouseOut(){return this._onMouseOut.event}get isMouseIn(){return this._isMouseIn}constructor(g){super(),this._elements=g,this._isMouseIn=!0,this._onMouseOut=this._register(new k.Emitter),this._elements.forEach(h=>this.onmouseover(h,()=>this._onTargetMouseOver(h))),this._elements.forEach(h=>this.onmouseleave(h,()=>this._onTargetMouseLeave(h)))}_onTargetMouseOver(g){this._isMouseIn=!0,this._clearEvaluateMouseStateTimeout(g)}_onTargetMouseLeave(g){this._isMouseIn=!1,this._evaluateMouseState(g)}_evaluateMouseState(g){this._clearEvaluateMouseStateTimeout(g),this._mouseTimeout=y.getWindow(g).setTimeout(()=>this._fireIfMouseOutside(),0)}_clearEvaluateMouseStateTimeout(g){this._mouseTimeout&&(y.getWindow(g).clearTimeout(this._mouseTimeout),this._mouseTimeout=void 0)}_fireIfMouseOutside(){this._isMouseIn||this._onMouseOut.fire()}}class l{constructor(g){this._element=g,this.targetElements=[this._element]}dispose(){}}}),define(se[32],oe([1,0,6,2,11,151,113,133,514,612,515,518,234,8,27,43,45,80,517]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResolvedLanguageConfiguration=e.LanguageConfigurationRegistry=e.LanguageConfigurationChangeEvent=e.getScopedLineTokens=e.getIndentationAtPosition=e.LanguageConfigurationService=e.ILanguageConfigurationService=e.LanguageConfigurationServiceChangeEvent=void 0;class d{constructor(M){this.languageId=M}affects(M){return this.languageId?this.languageId===M:!0}}e.LanguageConfigurationServiceChangeEvent=d,e.ILanguageConfigurationService=(0,n.createDecorator)("languageConfigurationService");let s=class extends k.Disposable{constructor(M,R){super(),this.configurationService=M,this.languageService=R,this._registry=this._register(new A),this.onDidChangeEmitter=this._register(new L.Emitter),this.onDidChange=this.onDidChangeEmitter.event,this.configurations=new Map;const x=new Set(Object.values(o));this._register(this.configurationService.onDidChangeConfiguration(O=>{const B=O.change.keys.some(V=>x.has(V)),W=O.change.overrides.filter(([V,K])=>K.some(F=>x.has(F))).map(([V])=>V);if(B)this.configurations.clear(),this.onDidChangeEmitter.fire(new d(void 0));else for(const V of W)this.languageService.isRegisteredLanguageId(V)&&(this.configurations.delete(V),this.onDidChangeEmitter.fire(new d(V)))})),this._register(this._registry.onDidChange(O=>{this.configurations.delete(O.languageId),this.onDidChangeEmitter.fire(new d(O.languageId))}))}register(M,R,x){return this._registry.register(M,R,x)}getLanguageConfiguration(M){let R=this.configurations.get(M);return R||(R=l(M,this._registry,this.configurationService,this.languageService),this.configurations.set(M,R)),R}};e.LanguageConfigurationService=s,e.LanguageConfigurationService=s=ke([ge(0,t.IConfigurationService),ge(1,r.ILanguageService)],s);function l(N,M,R,x){let O=M.getLanguageConfiguration(N);if(!O){if(!x.isRegisteredLanguageId(N))return new P(N,{});O=new P(N,{})}const B=g(O.languageId,R),W=D([O.underlyingConfig,B]);return new P(O.languageId,W)}const o={brackets:"editor.language.brackets",colorizedBracketPairs:"editor.language.colorizedBracketPairs"};function g(N,M){const R=M.getValue(o.brackets,{overrideIdentifier:N}),x=M.getValue(o.colorizedBracketPairs,{overrideIdentifier:N});return{brackets:h(R),colorizedBracketPairs:h(x)}}function h(N){if(Array.isArray(N))return N.map(M=>{if(!(!Array.isArray(M)||M.length!==2))return[M[0],M[1]]}).filter(M=>!!M)}function m(N,M,R){const x=N.getLineContent(M);let O=y.getLeadingWhitespace(x);return O.length>R-1&&(O=O.substring(0,R-1)),O}e.getIndentationAtPosition=m;function C(N,M,R){N.tokenization.forceTokenization(M);const x=N.tokenization.getLineTokens(M),O=typeof R>"u"?N.getLineMaxColumn(M)-1:R-1;return(0,p.createScopedLineTokens)(x,O)}e.getScopedLineTokens=C;class w{constructor(M){this.languageId=M,this._resolved=null,this._entries=[],this._order=0,this._resolved=null}register(M,R){const x=new I(M,R,++this._order);return this._entries.push(x),this._resolved=null,(0,k.toDisposable)(()=>{for(let O=0;O<this._entries.length;O++)if(this._entries[O]===x){this._entries.splice(O,1),this._resolved=null;break}})}getResolvedConfiguration(){if(!this._resolved){const M=this._resolve();M&&(this._resolved=new P(this.languageId,M))}return this._resolved}_resolve(){return this._entries.length===0?null:(this._entries.sort(I.cmp),D(this._entries.map(M=>M.configuration)))}}function D(N){let M={comments:void 0,brackets:void 0,wordPattern:void 0,indentationRules:void 0,onEnterRules:void 0,autoClosingPairs:void 0,surroundingPairs:void 0,autoCloseBefore:void 0,folding:void 0,colorizedBracketPairs:void 0,__electricCharacterSupport:void 0};for(const R of N)M={comments:R.comments||M.comments,brackets:R.brackets||M.brackets,wordPattern:R.wordPattern||M.wordPattern,indentationRules:R.indentationRules||M.indentationRules,onEnterRules:R.onEnterRules||M.onEnterRules,autoClosingPairs:R.autoClosingPairs||M.autoClosingPairs,surroundingPairs:R.surroundingPairs||M.surroundingPairs,autoCloseBefore:R.autoCloseBefore||M.autoCloseBefore,folding:R.folding||M.folding,colorizedBracketPairs:R.colorizedBracketPairs||M.colorizedBracketPairs,__electricCharacterSupport:R.__electricCharacterSupport||M.__electricCharacterSupport};return M}class I{constructor(M,R,x){this.configuration=M,this.priority=R,this.order=x}static cmp(M,R){return M.priority===R.priority?M.order-R.order:M.priority-R.priority}}class T{constructor(M){this.languageId=M}}e.LanguageConfigurationChangeEvent=T;class A extends k.Disposable{constructor(){super(),this._entries=new Map,this._onDidChange=this._register(new L.Emitter),this.onDidChange=this._onDidChange.event,this._register(this.register(f.PLAINTEXT_LANGUAGE_ID,{brackets:[["(",")"],["[","]"],["{","}"]],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],colorizedBracketPairs:[],folding:{offSide:!0}},0))}register(M,R,x=0){let O=this._entries.get(M);O||(O=new w(M),this._entries.set(M,O));const B=O.register(R,x);return this._onDidChange.fire(new T(M)),(0,k.toDisposable)(()=>{B.dispose(),this._onDidChange.fire(new T(M))})}getLanguageConfiguration(M){const R=this._entries.get(M);return R?.getResolvedConfiguration()||null}}e.LanguageConfigurationRegistry=A;class P{constructor(M,R){this.languageId=M,this.underlyingConfig=R,this._brackets=null,this._electricCharacter=null,this._onEnterSupport=this.underlyingConfig.brackets||this.underlyingConfig.indentationRules||this.underlyingConfig.onEnterRules?new a.OnEnterSupport(this.underlyingConfig):null,this.comments=P._handleComments(this.underlyingConfig),this.characterPair=new _.CharacterPairSupport(this.underlyingConfig),this.wordDefinition=this.underlyingConfig.wordPattern||E.DEFAULT_WORD_REGEXP,this.indentationRules=this.underlyingConfig.indentationRules,this.underlyingConfig.indentationRules?this.indentRulesSupport=new b.IndentRulesSupport(this.underlyingConfig.indentationRules):this.indentRulesSupport=null,this.foldingRules=this.underlyingConfig.folding||{},this.bracketsNew=new c.LanguageBracketsConfiguration(M,this.underlyingConfig)}getWordDefinition(){return(0,E.ensureValidWordDefinition)(this.wordDefinition)}get brackets(){return!this._brackets&&this.underlyingConfig.brackets&&(this._brackets=new i.RichEditBrackets(this.languageId,this.underlyingConfig.brackets)),this._brackets}get electricCharacter(){return this._electricCharacter||(this._electricCharacter=new v.BracketElectricCharacterSupport(this.brackets)),this._electricCharacter}onEnter(M,R,x,O){return this._onEnterSupport?this._onEnterSupport.onEnter(M,R,x,O):null}getAutoClosingPairs(){return new S.AutoClosingPairs(this.characterPair.getAutoClosingPairs())}getAutoCloseBeforeSet(M){return this.characterPair.getAutoCloseBeforeSet(M)}getSurroundingPairs(){return this.characterPair.getSurroundingPairs()}static _handleComments(M){const R=M.comments;if(!R)return null;const x={};if(R.lineComment&&(x.lineCommentToken=R.lineComment),R.blockComment){const[O,B]=R.blockComment;x.blockCommentStartToken=O,x.blockCommentEndToken=B}return x}}e.ResolvedLanguageConfiguration=P,(0,u.registerSingleton)(e.ILanguageConfigurationService,s,1)}),define(se[247],oe([1,0,14,2,327,603,5,32,643,51,189,13,64,61,12,18,205,112,62,44,7]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorWorkerClient=e.EditorWorkerHost=e.EditorWorkerService=void 0;const l=60*1e3,o=5*60*1e3;function g(A,P){const N=A.getModel(P);return!(!N||N.isTooLargeForSyncing())}let h=class extends k.Disposable{constructor(P,N,M,R,x){super(),this._modelService=P,this._workerManager=this._register(new C(this._modelService,R)),this._logService=M,this._register(x.linkProvider.register({language:"*",hasAccessToAllModels:!0},{provideLinks:(O,B)=>g(this._modelService,O.uri)?this._workerManager.withWorker().then(W=>W.computeLinks(O.uri)).then(W=>W&&{links:W}):Promise.resolve({links:[]})})),this._register(x.completionProvider.register("*",new m(this._workerManager,N,this._modelService,R)))}dispose(){super.dispose()}canComputeUnicodeHighlights(P){return g(this._modelService,P)}computedUnicodeHighlights(P,N,M){return this._workerManager.withWorker().then(R=>R.computedUnicodeHighlights(P,N,M))}async computeDiff(P,N,M,R){const x=await this._workerManager.withWorker().then(W=>W.computeDiff(P,N,M,R));if(!x)return null;return{identical:x.identical,quitEarly:x.quitEarly,changes:B(x.changes),moves:x.moves.map(W=>new u.MovedText(new f.LineRangeMapping(new c.LineRange(W[0],W[1]),new c.LineRange(W[2],W[3])),B(W[4])))};function B(W){return W.map(V=>{var K;return new f.DetailedLineRangeMapping(new c.LineRange(V[0],V[1]),new c.LineRange(V[2],V[3]),(K=V[4])===null||K===void 0?void 0:K.map(F=>new f.RangeMapping(new S.Range(F[0],F[1],F[2],F[3]),new S.Range(F[4],F[5],F[6],F[7]))))})}}computeMoreMinimalEdits(P,N,M=!1){if((0,a.isNonEmptyArray)(N)){if(!g(this._modelService,P))return Promise.resolve(N);const R=n.StopWatch.create(),x=this._workerManager.withWorker().then(O=>O.computeMoreMinimalEdits(P,N,M));return x.finally(()=>this._logService.trace("FORMAT#computeMoreMinimalEdits",P.toString(!0),R.elapsed())),Promise.race([x,(0,L.timeout)(1e3).then(()=>N)])}else return Promise.resolve(void 0)}canNavigateValueSet(P){return g(this._modelService,P)}navigateValueSet(P,N,M){return this._workerManager.withWorker().then(R=>R.navigateValueSet(P,N,M))}canComputeWordRanges(P){return g(this._modelService,P)}computeWordRanges(P,N){return this._workerManager.withWorker().then(M=>M.computeWordRanges(P,N))}};e.EditorWorkerService=h,e.EditorWorkerService=h=ke([ge(0,v.IModelService),ge(1,b.ITextResourceConfigurationService),ge(2,i.ILogService),ge(3,p.ILanguageConfigurationService),ge(4,r.ILanguageFeaturesService)],h);class m{constructor(P,N,M,R){this.languageConfigurationService=R,this._debugDisplayName="wordbasedCompletions",this._workerManager=P,this._configurationService=N,this._modelService=M}async provideCompletionItems(P,N){const M=this._configurationService.getValue(P.uri,N,"editor");if(M.wordBasedSuggestions==="off")return;const R=[];if(M.wordBasedSuggestions==="currentDocument")g(this._modelService,P.uri)&&R.push(P.uri);else for(const F of this._modelService.getModels())g(this._modelService,F.uri)&&(F===P?R.unshift(F.uri):(M.wordBasedSuggestions==="allDocuments"||F.getLanguageId()===P.getLanguageId())&&R.push(F.uri));if(R.length===0)return;const x=this.languageConfigurationService.getLanguageConfiguration(P.getLanguageId()).getWordDefinition(),O=P.getWordAtPosition(N),B=O?new S.Range(N.lineNumber,O.startColumn,N.lineNumber,O.endColumn):S.Range.fromPositions(N),W=B.setEndPosition(N.lineNumber,N.column),K=await(await this._workerManager.withWorker()).textualSuggest(R,O?.word,x);if(K)return{duration:K.duration,suggestions:K.words.map(F=>({kind:18,label:F,insertText:F,range:{insert:W,replace:B}}))}}}class C extends k.Disposable{constructor(P,N){super(),this.languageConfigurationService=N,this._modelService=P,this._editorWorkerClient=null,this._lastWorkerUsedTime=new Date().getTime(),this._register(new s.WindowIntervalTimer).cancelAndSet(()=>this._checkStopIdleWorker(),Math.round(o/2),d.$window),this._register(this._modelService.onModelRemoved(R=>this._checkStopEmptyWorker()))}dispose(){this._editorWorkerClient&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null),super.dispose()}_checkStopEmptyWorker(){if(!this._editorWorkerClient)return;this._modelService.getModels().length===0&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null)}_checkStopIdleWorker(){if(!this._editorWorkerClient)return;new Date().getTime()-this._lastWorkerUsedTime>o&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null)}withWorker(){return this._lastWorkerUsedTime=new Date().getTime(),this._editorWorkerClient||(this._editorWorkerClient=new T(this._modelService,!1,"editorWorkerService",this.languageConfigurationService)),Promise.resolve(this._editorWorkerClient)}}class w extends k.Disposable{constructor(P,N,M){if(super(),this._syncedModels=Object.create(null),this._syncedModelsLastUsedTime=Object.create(null),this._proxy=P,this._modelService=N,!M){const R=new L.IntervalTimer;R.cancelAndSet(()=>this._checkStopModelSync(),Math.round(l/2)),this._register(R)}}dispose(){for(const P in this._syncedModels)(0,k.dispose)(this._syncedModels[P]);this._syncedModels=Object.create(null),this._syncedModelsLastUsedTime=Object.create(null),super.dispose()}ensureSyncedResources(P,N){for(const M of P){const R=M.toString();this._syncedModels[R]||this._beginModelSync(M,N),this._syncedModels[R]&&(this._syncedModelsLastUsedTime[R]=new Date().getTime())}}_checkStopModelSync(){const P=new Date().getTime(),N=[];for(const M in this._syncedModelsLastUsedTime)P-this._syncedModelsLastUsedTime[M]>l&&N.push(M);for(const M of N)this._stopModelSync(M)}_beginModelSync(P,N){const M=this._modelService.getModel(P);if(!M||!N&&M.isTooLargeForSyncing())return;const R=P.toString();this._proxy.acceptNewModel({url:M.uri.toString(),lines:M.getLinesContent(),EOL:M.getEOL(),versionId:M.getVersionId()});const x=new k.DisposableStore;x.add(M.onDidChangeContent(O=>{this._proxy.acceptModelChanged(R.toString(),O)})),x.add(M.onWillDispose(()=>{this._stopModelSync(R)})),x.add((0,k.toDisposable)(()=>{this._proxy.acceptRemovedModel(R)})),this._syncedModels[R]=x}_stopModelSync(P){const N=this._syncedModels[P];delete this._syncedModels[P],delete this._syncedModelsLastUsedTime[P],(0,k.dispose)(N)}}class D{constructor(P){this._instance=P,this._proxyObj=Promise.resolve(this._instance)}dispose(){this._instance.dispose()}getProxyObject(){return this._proxyObj}}class I{constructor(P){this._workerClient=P}fhr(P,N){return this._workerClient.fhr(P,N)}}e.EditorWorkerHost=I;class T extends k.Disposable{constructor(P,N,M,R){super(),this.languageConfigurationService=R,this._disposed=!1,this._modelService=P,this._keepIdleModels=N,this._workerFactory=new E.DefaultWorkerFactory(M),this._worker=null,this._modelManager=null}fhr(P,N){throw new Error("Not implemented!")}_getOrCreateWorker(){if(!this._worker)try{this._worker=this._register(new y.SimpleWorkerClient(this._workerFactory,"vs/editor/common/services/editorSimpleWorker",new I(this)))}catch(P){(0,y.logOnceWebWorkerWarning)(P),this._worker=new D(new _.EditorSimpleWorker(new I(this),null))}return this._worker}_getProxy(){return this._getOrCreateWorker().getProxyObject().then(void 0,P=>((0,y.logOnceWebWorkerWarning)(P),this._worker=new D(new _.EditorSimpleWorker(new I(this),null)),this._getOrCreateWorker().getProxyObject()))}_getOrCreateModelManager(P){return this._modelManager||(this._modelManager=this._register(new w(P,this._modelService,this._keepIdleModels))),this._modelManager}async _withSyncedResources(P,N=!1){return this._disposed?Promise.reject((0,t.canceled)()):this._getProxy().then(M=>(this._getOrCreateModelManager(M).ensureSyncedResources(P,N),M))}computedUnicodeHighlights(P,N,M){return this._withSyncedResources([P]).then(R=>R.computeUnicodeHighlights(P.toString(),N,M))}computeDiff(P,N,M,R){return this._withSyncedResources([P,N],!0).then(x=>x.computeDiff(P.toString(),N.toString(),M,R))}computeMoreMinimalEdits(P,N,M){return this._withSyncedResources([P]).then(R=>R.computeMoreMinimalEdits(P.toString(),N,M))}computeLinks(P){return this._withSyncedResources([P]).then(N=>N.computeLinks(P.toString()))}computeDefaultDocumentColors(P){return this._withSyncedResources([P]).then(N=>N.computeDefaultDocumentColors(P.toString()))}async textualSuggest(P,N,M){const R=await this._withSyncedResources(P),x=M.source,O=M.flags;return R.textualSuggest(P.map(B=>B.toString()),N,x,O)}computeWordRanges(P,N){return this._withSyncedResources([P]).then(M=>{const R=this._modelService.getModel(P);if(!R)return Promise.resolve(null);const x=this.languageConfigurationService.getLanguageConfiguration(R.getLanguageId()).getWordDefinition(),O=x.source,B=x.flags;return M.computeWordRanges(P.toString(),N,O,B)})}navigateValueSet(P,N,M){return this._withSyncedResources([P]).then(R=>{const x=this._modelService.getModel(P);if(!x)return null;const O=this.languageConfigurationService.getLanguageConfiguration(x.getLanguageId()).getWordDefinition(),B=O.source,W=O.flags;return R.navigateValueSet(P.toString(),N,M,B,W)})}dispose(){super.dispose(),this._disposed=!0}}e.EditorWorkerClient=T}),define(se[790],oe([1,0,55,247]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createWebWorker=void 0;function y(S,p,_){return new E(S,p,_)}e.createWebWorker=y;class E extends k.EditorWorkerClient{constructor(p,_,v){super(p,v.keepIdleModels||!1,v.label,_),this._foreignModuleId=v.moduleId,this._foreignModuleCreateData=v.createData||null,this._foreignModuleHost=v.host||null,this._foreignProxy=null}fhr(p,_){if(!this._foreignModuleHost||typeof this._foreignModuleHost[p]!="function")return Promise.reject(new Error("Missing method "+p+" or missing main thread foreign host."));try{return Promise.resolve(this._foreignModuleHost[p].apply(this._foreignModuleHost,_))}catch(v){return Promise.reject(v)}}_getForeignProxy(){return this._foreignProxy||(this._foreignProxy=this._getProxy().then(p=>{const _=this._foreignModuleHost?(0,L.getAllMethodNames)(this._foreignModuleHost):[];return p.loadForeignModule(this._foreignModuleId,this._foreignModuleCreateData,_).then(v=>{this._foreignModuleCreateData=null;const b=(n,t)=>p.fmr(n,t),a=(n,t)=>function(){const r=Array.prototype.slice.call(arguments,0);return t(n,r)},i={};for(const n of v)i[n]=a(n,b);return i})})),this._foreignProxy}getProxy(){return this._getForeignProxy()}withSyncedResources(p){return this._withSyncedResources(p).then(_=>this.getProxy())}}}),define(se[248],oe([1,0,11,113,133,32]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getIndentMetadata=e.getIndentActionForType=e.getIndentForEnter=e.getGoodIndentForLine=e.getInheritIndentForLine=void 0;function S(i,n,t){const r=i.tokenization.getLanguageIdAtPosition(n,0);if(n>1){let u,f=-1;for(u=n-1;u>=1;u--){if(i.tokenization.getLanguageIdAtPosition(u,0)!==r)return f;const c=i.getLineContent(u);if(t.shouldIgnore(c)||/^\s+$/.test(c)||c===""){f=u;continue}return u}}return-1}function p(i,n,t,r=!0,u){if(i<4)return null;const f=u.getLanguageConfiguration(n.tokenization.getLanguageId()).indentRulesSupport;if(!f)return null;if(t<=1)return{indentation:"",action:null};for(let s=t-1;s>0&&n.getLineContent(s)==="";s--)if(s===1)return{indentation:"",action:null};const c=S(n,t,f);if(c<0)return null;if(c<1)return{indentation:"",action:null};const d=n.getLineContent(c);if(f.shouldIncrease(d)||f.shouldIndentNextLine(d))return{indentation:L.getLeadingWhitespace(d),action:k.IndentAction.Indent,line:c};if(f.shouldDecrease(d))return{indentation:L.getLeadingWhitespace(d),action:null,line:c};{if(c===1)return{indentation:L.getLeadingWhitespace(n.getLineContent(c)),action:null,line:c};const s=c-1,l=f.getIndentMetadata(n.getLineContent(s));if(!(l&3)&&l&4){let o=0;for(let g=s-1;g>0;g--)if(!f.shouldIndentNextLine(n.getLineContent(g))){o=g;break}return{indentation:L.getLeadingWhitespace(n.getLineContent(o+1)),action:null,line:o+1}}if(r)return{indentation:L.getLeadingWhitespace(n.getLineContent(c)),action:null,line:c};for(let o=c;o>0;o--){const g=n.getLineContent(o);if(f.shouldIncrease(g))return{indentation:L.getLeadingWhitespace(g),action:k.IndentAction.Indent,line:o};if(f.shouldIndentNextLine(g)){let h=0;for(let m=o-1;m>0;m--)if(!f.shouldIndentNextLine(n.getLineContent(o))){h=m;break}return{indentation:L.getLeadingWhitespace(n.getLineContent(h+1)),action:null,line:h+1}}else if(f.shouldDecrease(g))return{indentation:L.getLeadingWhitespace(g),action:null,line:o}}return{indentation:L.getLeadingWhitespace(n.getLineContent(1)),action:null,line:1}}}e.getInheritIndentForLine=p;function _(i,n,t,r,u,f){if(i<4)return null;const c=f.getLanguageConfiguration(t);if(!c)return null;const d=f.getLanguageConfiguration(t).indentRulesSupport;if(!d)return null;const s=p(i,n,r,void 0,f),l=n.getLineContent(r);if(s){const o=s.line;if(o!==void 0){let g=!0;for(let h=o;h<r-1;h++)if(!/^\s*$/.test(n.getLineContent(h))){g=!1;break}if(g){const h=c.onEnter(i,"",n.getLineContent(o),"");if(h){let m=L.getLeadingWhitespace(n.getLineContent(o));return h.removeText&&(m=m.substring(0,m.length-h.removeText)),h.indentAction===k.IndentAction.Indent||h.indentAction===k.IndentAction.IndentOutdent?m=u.shiftIndent(m):h.indentAction===k.IndentAction.Outdent&&(m=u.unshiftIndent(m)),d.shouldDecrease(l)&&(m=u.unshiftIndent(m)),h.appendText&&(m+=h.appendText),L.getLeadingWhitespace(m)}}}return d.shouldDecrease(l)?s.action===k.IndentAction.Indent?s.indentation:u.unshiftIndent(s.indentation):s.action===k.IndentAction.Indent?u.shiftIndent(s.indentation):s.indentation}return null}e.getGoodIndentForLine=_;function v(i,n,t,r,u){if(i<4)return null;n.tokenization.forceTokenization(t.startLineNumber);const f=n.tokenization.getLineTokens(t.startLineNumber),c=(0,y.createScopedLineTokens)(f,t.startColumn-1),d=c.getLineContent();let s=!1,l;c.firstCharOffset>0&&f.getLanguageId(0)!==c.languageId?(s=!0,l=d.substr(0,t.startColumn-1-c.firstCharOffset)):l=f.getLineContent().substring(0,t.startColumn-1);let o;t.isEmpty()?o=d.substr(t.startColumn-1-c.firstCharOffset):o=(0,E.getScopedLineTokens)(n,t.endLineNumber,t.endColumn).getLineContent().substr(t.endColumn-1-c.firstCharOffset);const g=u.getLanguageConfiguration(c.languageId).indentRulesSupport;if(!g)return null;const h=l,m=L.getLeadingWhitespace(l),C={tokenization:{getLineTokens:T=>n.tokenization.getLineTokens(T),getLanguageId:()=>n.getLanguageId(),getLanguageIdAtPosition:(T,A)=>n.getLanguageIdAtPosition(T,A)},getLineContent:T=>T===t.startLineNumber?h:n.getLineContent(T)},w=L.getLeadingWhitespace(f.getLineContent()),D=p(i,C,t.startLineNumber+1,void 0,u);if(!D){const T=s?w:m;return{beforeEnter:T,afterEnter:T}}let I=s?w:D.indentation;return D.action===k.IndentAction.Indent&&(I=r.shiftIndent(I)),g.shouldDecrease(o)&&(I=r.unshiftIndent(I)),{beforeEnter:s?w:m,afterEnter:I}}e.getIndentForEnter=v;function b(i,n,t,r,u,f){if(i<4)return null;const c=(0,E.getScopedLineTokens)(n,t.startLineNumber,t.startColumn);if(c.firstCharOffset)return null;const d=f.getLanguageConfiguration(c.languageId).indentRulesSupport;if(!d)return null;const s=c.getLineContent(),l=s.substr(0,t.startColumn-1-c.firstCharOffset);let o;if(t.isEmpty()?o=s.substr(t.startColumn-1-c.firstCharOffset):o=(0,E.getScopedLineTokens)(n,t.endLineNumber,t.endColumn).getLineContent().substr(t.endColumn-1-c.firstCharOffset),!d.shouldDecrease(l+o)&&d.shouldDecrease(l+r+o)){const g=p(i,n,t.startLineNumber,!1,f);if(!g)return null;let h=g.indentation;return g.action!==k.IndentAction.Indent&&(h=u.unshiftIndent(h)),h}return null}e.getIndentActionForType=b;function a(i,n,t){const r=t.getLanguageConfiguration(i.getLanguageId()).indentRulesSupport;return!r||n<1||n>i.getLineCount()?null:r.getIndentMetadata(i.getLineContent(n))}e.getIndentMetadata=a}),define(se[249],oe([1,0,113,32]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getEnterAction=void 0;function y(E,S,p,_){const v=(0,k.getScopedLineTokens)(S,p.startLineNumber,p.startColumn),b=_.getLanguageConfiguration(v.languageId);if(!b)return null;const a=v.getLineContent(),i=a.substr(0,p.startColumn-1-v.firstCharOffset);let n;p.isEmpty()?n=a.substr(p.startColumn-1-v.firstCharOffset):n=(0,k.getScopedLineTokens)(S,p.endLineNumber,p.endColumn).getLineContent().substr(p.endColumn-1-v.firstCharOffset);let t="";if(p.startLineNumber>1&&v.firstCharOffset===0){const s=(0,k.getScopedLineTokens)(S,p.startLineNumber-1);s.languageId===v.languageId&&(t=s.getLineContent())}const r=b.onEnter(E,t,i,n);if(!r)return null;const u=r.indentAction;let f=r.appendText;const c=r.removeText||0;f?u===L.IndentAction.Indent&&(f="	"+f):u===L.IndentAction.Indent||u===L.IndentAction.IndentOutdent?f="	":f="";let d=(0,k.getIndentationAtPosition)(S,p.startLineNumber,p.startColumn);return c&&(d=d.substring(0,d.length-c)),{indentAction:u,appendText:f,removeText:c,indentation:d}}e.getEnterAction=y}),define(se[250],oe([1,0,11,85,5,24,249,32]),function(te,e,L,k,y,E,S,p){"use strict";var _;Object.defineProperty(e,"__esModule",{value:!0}),e.ShiftCommand=void 0;const v=Object.create(null);function b(i,n){if(n<=0)return"";v[i]||(v[i]=["",i]);const t=v[i];for(let r=t.length;r<=n;r++)t[r]=t[r-1]+i;return t[n]}let a=_=class{static unshiftIndent(n,t,r,u,f){const c=k.CursorColumns.visibleColumnFromColumn(n,t,r);if(f){const d=b(" ",u),l=k.CursorColumns.prevIndentTabStop(c,u)/u;return b(d,l)}else{const d="	",l=k.CursorColumns.prevRenderTabStop(c,r)/r;return b(d,l)}}static shiftIndent(n,t,r,u,f){const c=k.CursorColumns.visibleColumnFromColumn(n,t,r);if(f){const d=b(" ",u),l=k.CursorColumns.nextIndentTabStop(c,u)/u;return b(d,l)}else{const d="	",l=k.CursorColumns.nextRenderTabStop(c,r)/r;return b(d,l)}}constructor(n,t,r){this._languageConfigurationService=r,this._opts=t,this._selection=n,this._selectionId=null,this._useLastEditRangeForCursorEndPosition=!1,this._selectionStartColumnStaysPut=!1}_addEditOperation(n,t,r){this._useLastEditRangeForCursorEndPosition?n.addTrackedEditOperation(t,r):n.addEditOperation(t,r)}getEditOperations(n,t){const r=this._selection.startLineNumber;let u=this._selection.endLineNumber;this._selection.endColumn===1&&r!==u&&(u=u-1);const{tabSize:f,indentSize:c,insertSpaces:d}=this._opts,s=r===u;if(this._opts.useTabStops){this._selection.isEmpty()&&/^\s*$/.test(n.getLineContent(r))&&(this._useLastEditRangeForCursorEndPosition=!0);let l=0,o=0;for(let g=r;g<=u;g++,l=o){o=0;const h=n.getLineContent(g);let m=L.firstNonWhitespaceIndex(h);if(this._opts.isUnshift&&(h.length===0||m===0)||!s&&!this._opts.isUnshift&&h.length===0)continue;if(m===-1&&(m=h.length),g>1&&k.CursorColumns.visibleColumnFromColumn(h,m+1,f)%c!==0&&n.tokenization.isCheapToTokenize(g-1)){const D=(0,S.getEnterAction)(this._opts.autoIndent,n,new y.Range(g-1,n.getLineMaxColumn(g-1),g-1,n.getLineMaxColumn(g-1)),this._languageConfigurationService);if(D){if(o=l,D.appendText)for(let I=0,T=D.appendText.length;I<T&&o<c&&D.appendText.charCodeAt(I)===32;I++)o++;D.removeText&&(o=Math.max(0,o-D.removeText));for(let I=0;I<o&&!(m===0||h.charCodeAt(m-1)!==32);I++)m--}}if(this._opts.isUnshift&&m===0)continue;let C;this._opts.isUnshift?C=_.unshiftIndent(h,m+1,f,c,d):C=_.shiftIndent(h,m+1,f,c,d),this._addEditOperation(t,new y.Range(g,1,g,m+1),C),g===r&&!this._selection.isEmpty()&&(this._selectionStartColumnStaysPut=this._selection.startColumn<=m+1)}}else{!this._opts.isUnshift&&this._selection.isEmpty()&&n.getLineLength(r)===0&&(this._useLastEditRangeForCursorEndPosition=!0);const l=d?b(" ",c):"	";for(let o=r;o<=u;o++){const g=n.getLineContent(o);let h=L.firstNonWhitespaceIndex(g);if(!(this._opts.isUnshift&&(g.length===0||h===0))&&!(!s&&!this._opts.isUnshift&&g.length===0)&&(h===-1&&(h=g.length),!(this._opts.isUnshift&&h===0)))if(this._opts.isUnshift){h=Math.min(h,c);for(let m=0;m<h;m++)if(g.charCodeAt(m)===9){h=m+1;break}this._addEditOperation(t,new y.Range(o,1,o,h+1),"")}else this._addEditOperation(t,new y.Range(o,1,o,1),l),o===r&&!this._selection.isEmpty()&&(this._selectionStartColumnStaysPut=this._selection.startColumn===1)}}this._selectionId=t.trackSelection(this._selection)}computeCursorState(n,t){if(this._useLastEditRangeForCursorEndPosition){const u=t.getInverseEditOperations()[0];return new E.Selection(u.range.endLineNumber,u.range.endColumn,u.range.endLineNumber,u.range.endColumn)}const r=t.getTrackedSelection(this._selectionId);if(this._selectionStartColumnStaysPut){const u=this._selection.startColumn;return r.startColumn<=u?r:r.getDirection()===0?new E.Selection(r.startLineNumber,u,r.endLineNumber,r.endColumn):new E.Selection(r.endLineNumber,r.endColumn,r.startLineNumber,u)}return r}};e.ShiftCommand=a,e.ShiftCommand=a=_=ke([ge(2,p.ILanguageConfigurationService)],a)}),define(se[251],oe([1,0,12,11,130,250,501,75,150,5,10,113,32,133,248,249]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompositionOutcome=e.TypeWithAutoClosingCommand=e.TypeOperations=void 0;class u{static indent(h,m,C){if(m===null||C===null)return[];const w=[];for(let D=0,I=C.length;D<I;D++)w[D]=new E.ShiftCommand(C[D],{isUnshift:!1,tabSize:h.tabSize,indentSize:h.indentSize,insertSpaces:h.insertSpaces,useTabStops:h.useTabStops,autoIndent:h.autoIndent},h.languageConfigurationService);return w}static outdent(h,m,C){const w=[];for(let D=0,I=C.length;D<I;D++)w[D]=new E.ShiftCommand(C[D],{isUnshift:!0,tabSize:h.tabSize,indentSize:h.indentSize,insertSpaces:h.insertSpaces,useTabStops:h.useTabStops,autoIndent:h.autoIndent},h.languageConfigurationService);return w}static shiftIndent(h,m,C){return C=C||1,E.ShiftCommand.shiftIndent(m,m.length+C,h.tabSize,h.indentSize,h.insertSpaces)}static unshiftIndent(h,m,C){return C=C||1,E.ShiftCommand.unshiftIndent(m,m.length+C,h.tabSize,h.indentSize,h.insertSpaces)}static _distributedPaste(h,m,C,w){const D=[];for(let I=0,T=C.length;I<T;I++)D[I]=new y.ReplaceCommand(C[I],w[I]);return new p.EditOperationResult(0,D,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!0})}static _simplePaste(h,m,C,w,D){const I=[];for(let T=0,A=C.length;T<A;T++){const P=C[T],N=P.getPosition();if(D&&!P.isEmpty()&&(D=!1),D&&w.indexOf(`
+`)!==w.length-1&&(D=!1),D){const M=new v.Range(N.lineNumber,1,N.lineNumber,1);I[T]=new y.ReplaceCommandThatPreservesSelection(M,w,P,!0)}else I[T]=new y.ReplaceCommand(P,w)}return new p.EditOperationResult(0,I,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!0})}static _distributePasteToCursors(h,m,C,w,D){if(w||m.length===1)return null;if(D&&D.length===m.length)return D;if(h.multiCursorPaste==="spread"){C.charCodeAt(C.length-1)===10&&(C=C.substr(0,C.length-1)),C.charCodeAt(C.length-1)===13&&(C=C.substr(0,C.length-1));const I=k.splitLines(C);if(I.length===m.length)return I}return null}static paste(h,m,C,w,D,I){const T=this._distributePasteToCursors(h,C,w,D,I);return T?(C=C.sort(v.Range.compareRangesUsingStarts),this._distributedPaste(h,m,C,T)):this._simplePaste(h,m,C,w,D)}static _goodIndentForLine(h,m,C){let w=null,D="";const I=(0,t.getInheritIndentForLine)(h.autoIndent,m,C,!1,h.languageConfigurationService);if(I)w=I.action,D=I.indentation;else if(C>1){let T;for(T=C-1;T>=1;T--){const N=m.getLineContent(T);if(k.lastNonWhitespaceIndex(N)>=0)break}if(T<1)return null;const A=m.getLineMaxColumn(T),P=(0,r.getEnterAction)(h.autoIndent,m,new v.Range(T,A,T,A),h.languageConfigurationService);P&&(D=P.indentation+P.appendText)}return w&&(w===a.IndentAction.Indent&&(D=u.shiftIndent(h,D)),w===a.IndentAction.Outdent&&(D=u.unshiftIndent(h,D)),D=h.normalizeIndentation(D)),D||null}static _replaceJumpToNextIndent(h,m,C,w){let D="";const I=C.getStartPosition();if(h.insertSpaces){const T=h.visibleColumnFromColumn(m,I),A=h.indentSize,P=A-T%A;for(let N=0;N<P;N++)D+=" "}else D="	";return new y.ReplaceCommand(C,D,w)}static tab(h,m,C){const w=[];for(let D=0,I=C.length;D<I;D++){const T=C[D];if(T.isEmpty()){const A=m.getLineContent(T.startLineNumber);if(/^\s*$/.test(A)&&m.tokenization.isCheapToTokenize(T.startLineNumber)){let P=this._goodIndentForLine(h,m,T.startLineNumber);P=P||"	";const N=h.normalizeIndentation(P);if(!A.startsWith(N)){w[D]=new y.ReplaceCommand(new v.Range(T.startLineNumber,1,T.startLineNumber,A.length+1),N,!0);continue}}w[D]=this._replaceJumpToNextIndent(h,m,T,!0)}else{if(T.startLineNumber===T.endLineNumber){const A=m.getLineMaxColumn(T.startLineNumber);if(T.startColumn!==1||T.endColumn!==A){w[D]=this._replaceJumpToNextIndent(h,m,T,!1);continue}}w[D]=new E.ShiftCommand(T,{isUnshift:!1,tabSize:h.tabSize,indentSize:h.indentSize,insertSpaces:h.insertSpaces,useTabStops:h.useTabStops,autoIndent:h.autoIndent},h.languageConfigurationService)}}return w}static compositionType(h,m,C,w,D,I,T,A){const P=w.map(N=>this._compositionType(C,N,D,I,T,A));return new p.EditOperationResult(4,P,{shouldPushStackElementBefore:s(h,4),shouldPushStackElementAfter:!1})}static _compositionType(h,m,C,w,D,I){if(!m.isEmpty())return null;const T=m.getPosition(),A=Math.max(1,T.column-w),P=Math.min(h.getLineMaxColumn(T.lineNumber),T.column+D),N=new v.Range(T.lineNumber,A,T.lineNumber,P);return h.getValueInRange(N)===C&&I===0?null:new y.ReplaceCommandWithOffsetCursorState(N,C,0,I)}static _typeCommand(h,m,C){return C?new y.ReplaceCommandWithoutChangingPosition(h,m,!0):new y.ReplaceCommand(h,m,!0)}static _enter(h,m,C,w){if(h.autoIndent===0)return u._typeCommand(w,`
+`,C);if(!m.tokenization.isCheapToTokenize(w.getStartPosition().lineNumber)||h.autoIndent===1){const A=m.getLineContent(w.startLineNumber),P=k.getLeadingWhitespace(A).substring(0,w.startColumn-1);return u._typeCommand(w,`
+`+h.normalizeIndentation(P),C)}const D=(0,r.getEnterAction)(h.autoIndent,m,w,h.languageConfigurationService);if(D){if(D.indentAction===a.IndentAction.None)return u._typeCommand(w,`
+`+h.normalizeIndentation(D.indentation+D.appendText),C);if(D.indentAction===a.IndentAction.Indent)return u._typeCommand(w,`
+`+h.normalizeIndentation(D.indentation+D.appendText),C);if(D.indentAction===a.IndentAction.IndentOutdent){const A=h.normalizeIndentation(D.indentation),P=h.normalizeIndentation(D.indentation+D.appendText),N=`
+`+P+`
+`+A;return C?new y.ReplaceCommandWithoutChangingPosition(w,N,!0):new y.ReplaceCommandWithOffsetCursorState(w,N,-1,P.length-A.length,!0)}else if(D.indentAction===a.IndentAction.Outdent){const A=u.unshiftIndent(h,D.indentation);return u._typeCommand(w,`
+`+h.normalizeIndentation(A+D.appendText),C)}}const I=m.getLineContent(w.startLineNumber),T=k.getLeadingWhitespace(I).substring(0,w.startColumn-1);if(h.autoIndent>=4){const A=(0,t.getIndentForEnter)(h.autoIndent,m,w,{unshiftIndent:P=>u.unshiftIndent(h,P),shiftIndent:P=>u.shiftIndent(h,P),normalizeIndentation:P=>h.normalizeIndentation(P)},h.languageConfigurationService);if(A){let P=h.visibleColumnFromColumn(m,w.getEndPosition());const N=w.endColumn,M=m.getLineContent(w.endLineNumber),R=k.firstNonWhitespaceIndex(M);if(R>=0?w=w.setEndPosition(w.endLineNumber,Math.max(w.endColumn,R+1)):w=w.setEndPosition(w.endLineNumber,m.getLineMaxColumn(w.endLineNumber)),C)return new y.ReplaceCommandWithoutChangingPosition(w,`
+`+h.normalizeIndentation(A.afterEnter),!0);{let x=0;return N<=R+1&&(h.insertSpaces||(P=Math.ceil(P/h.indentSize)),x=Math.min(P+1-h.normalizeIndentation(A.afterEnter).length-1,0)),new y.ReplaceCommandWithOffsetCursorState(w,`
+`+h.normalizeIndentation(A.afterEnter),0,x,!0)}}}return u._typeCommand(w,`
+`+h.normalizeIndentation(T),C)}static _isAutoIndentType(h,m,C){if(h.autoIndent<4)return!1;for(let w=0,D=C.length;w<D;w++)if(!m.tokenization.isCheapToTokenize(C[w].getEndPosition().lineNumber))return!1;return!0}static _runAutoIndentType(h,m,C,w){const D=(0,i.getIndentationAtPosition)(m,C.startLineNumber,C.startColumn),I=(0,t.getIndentActionForType)(h.autoIndent,m,C,w,{shiftIndent:T=>u.shiftIndent(h,T),unshiftIndent:T=>u.unshiftIndent(h,T)},h.languageConfigurationService);if(I===null)return null;if(I!==h.normalizeIndentation(D)){const T=m.getLineFirstNonWhitespaceColumn(C.startLineNumber);return T===0?u._typeCommand(new v.Range(C.startLineNumber,1,C.endLineNumber,C.endColumn),h.normalizeIndentation(I)+w,!1):u._typeCommand(new v.Range(C.startLineNumber,1,C.endLineNumber,C.endColumn),h.normalizeIndentation(I)+m.getLineContent(C.startLineNumber).substring(T-1,C.startColumn-1)+w,!1)}return null}static _isAutoClosingOvertype(h,m,C,w,D){if(h.autoClosingOvertype==="never"||!h.autoClosingPairs.autoClosingPairsCloseSingleChar.has(D))return!1;for(let I=0,T=C.length;I<T;I++){const A=C[I];if(!A.isEmpty())return!1;const P=A.getPosition(),N=m.getLineContent(P.lineNumber);if(N.charAt(P.column-1)!==D)return!1;const R=(0,p.isQuote)(D);if((P.column>2?N.charCodeAt(P.column-2):0)===92&&R)return!1;if(h.autoClosingOvertype==="auto"){let O=!1;for(let B=0,W=w.length;B<W;B++){const V=w[B];if(P.lineNumber===V.startLineNumber&&P.column===V.startColumn){O=!0;break}}if(!O)return!1}}return!0}static _runAutoClosingOvertype(h,m,C,w,D){const I=[];for(let T=0,A=w.length;T<A;T++){const N=w[T].getPosition(),M=new v.Range(N.lineNumber,N.column,N.lineNumber,N.column+1);I[T]=new y.ReplaceCommand(M,D)}return new p.EditOperationResult(4,I,{shouldPushStackElementBefore:s(h,4),shouldPushStackElementAfter:!1})}static _isBeforeClosingBrace(h,m){const C=m.charAt(0),w=h.autoClosingPairs.autoClosingPairsOpenByStart.get(C)||[],D=h.autoClosingPairs.autoClosingPairsCloseByStart.get(C)||[],I=w.some(A=>m.startsWith(A.open)),T=D.some(A=>m.startsWith(A.close));return!I&&T}static _findAutoClosingPairOpen(h,m,C,w){const D=h.autoClosingPairs.autoClosingPairsOpenByEnd.get(w);if(!D)return null;let I=null;for(const T of D)if(I===null||T.open.length>I.open.length){let A=!0;for(const P of C)if(m.getValueInRange(new v.Range(P.lineNumber,P.column-T.open.length+1,P.lineNumber,P.column))+w!==T.open){A=!1;break}A&&(I=T)}return I}static _findContainedAutoClosingPair(h,m){if(m.open.length<=1)return null;const C=m.close.charAt(m.close.length-1),w=h.autoClosingPairs.autoClosingPairsCloseByEnd.get(C)||[];let D=null;for(const I of w)I.open!==m.open&&m.open.includes(I.open)&&m.close.endsWith(I.close)&&(!D||I.open.length>D.open.length)&&(D=I);return D}static _getAutoClosingPairClose(h,m,C,w,D){for(const O of C)if(!O.isEmpty())return null;const I=C.map(O=>{const B=O.getPosition();return D?{lineNumber:B.lineNumber,beforeColumn:B.column-w.length,afterColumn:B.column}:{lineNumber:B.lineNumber,beforeColumn:B.column,afterColumn:B.column}}),T=this._findAutoClosingPairOpen(h,m,I.map(O=>new b.Position(O.lineNumber,O.beforeColumn)),w);if(!T)return null;let A,P;if((0,p.isQuote)(w)?(A=h.autoClosingQuotes,P=h.shouldAutoCloseBefore.quote):(h.blockCommentStartToken?T.open.includes(h.blockCommentStartToken):!1)?(A=h.autoClosingComments,P=h.shouldAutoCloseBefore.comment):(A=h.autoClosingBrackets,P=h.shouldAutoCloseBefore.bracket),A==="never")return null;const M=this._findContainedAutoClosingPair(h,T),R=M?M.close:"";let x=!0;for(const O of I){const{lineNumber:B,beforeColumn:W,afterColumn:V}=O,K=m.getLineContent(B),F=K.substring(0,W-1),q=K.substring(V-1);if(q.startsWith(R)||(x=!1),q.length>0){const $=q.charAt(0);if(!u._isBeforeClosingBrace(h,q)&&!P($))return null}if(T.open.length===1&&(w==="'"||w==='"')&&A!=="always"){const $=(0,_.getMapForWordSeparators)(h.wordSeparators);if(F.length>0){const J=F.charCodeAt(F.length-1);if($.get(J)===0)return null}}if(!m.tokenization.isCheapToTokenize(B))return null;m.tokenization.forceTokenization(B);const ie=m.tokenization.getLineTokens(B),ae=(0,n.createScopedLineTokens)(ie,W-1);if(!T.shouldAutoClose(ae,W-ae.firstCharOffset))return null;const ne=T.findNeutralCharacter();if(ne){const $=m.tokenization.getTokenTypeIfInsertingCharacter(B,W,ne);if(!T.isOK($))return null}}return x?T.close.substring(0,T.close.length-R.length):T.close}static _runAutoClosingOpenCharType(h,m,C,w,D,I,T){const A=[];for(let P=0,N=w.length;P<N;P++){const M=w[P];A[P]=new f(M,D,!I,T)}return new p.EditOperationResult(4,A,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!1})}static _shouldSurroundChar(h,m){return(0,p.isQuote)(m)?h.autoSurround==="quotes"||h.autoSurround==="languageDefined":h.autoSurround==="brackets"||h.autoSurround==="languageDefined"}static _isSurroundSelectionType(h,m,C,w){if(!u._shouldSurroundChar(h,w)||!h.surroundingPairs.hasOwnProperty(w))return!1;const D=(0,p.isQuote)(w);for(const I of C){if(I.isEmpty())return!1;let T=!0;for(let A=I.startLineNumber;A<=I.endLineNumber;A++){const P=m.getLineContent(A),N=A===I.startLineNumber?I.startColumn-1:0,M=A===I.endLineNumber?I.endColumn-1:P.length,R=P.substring(N,M);if(/[^ \t]/.test(R)){T=!1;break}}if(T)return!1;if(D&&I.startLineNumber===I.endLineNumber&&I.startColumn+1===I.endColumn){const A=m.getValueInRange(I);if((0,p.isQuote)(A))return!1}}return!0}static _runSurroundSelectionType(h,m,C,w,D){const I=[];for(let T=0,A=w.length;T<A;T++){const P=w[T],N=m.surroundingPairs[D];I[T]=new S.SurroundSelectionCommand(P,D,N)}return new p.EditOperationResult(0,I,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!0})}static _isTypeInterceptorElectricChar(h,m,C){return!!(C.length===1&&m.tokenization.isCheapToTokenize(C[0].getEndPosition().lineNumber))}static _typeInterceptorElectricChar(h,m,C,w,D){if(!m.electricChars.hasOwnProperty(D)||!w.isEmpty())return null;const I=w.getPosition();C.tokenization.forceTokenization(I.lineNumber);const T=C.tokenization.getLineTokens(I.lineNumber);let A;try{A=m.onElectricCharacter(D,T,I.column)}catch(P){return(0,L.onUnexpectedError)(P),null}if(!A)return null;if(A.matchOpenBracket){const P=(T.getLineContent()+D).lastIndexOf(A.matchOpenBracket)+1,N=C.bracketPairs.findMatchingBracketUp(A.matchOpenBracket,{lineNumber:I.lineNumber,column:P},500);if(N){if(N.startLineNumber===I.lineNumber)return null;const M=C.getLineContent(N.startLineNumber),R=k.getLeadingWhitespace(M),x=m.normalizeIndentation(R),O=C.getLineContent(I.lineNumber),B=C.getLineFirstNonWhitespaceColumn(I.lineNumber)||I.column,W=O.substring(B-1,I.column-1),V=x+W+D,K=new v.Range(I.lineNumber,1,I.lineNumber,I.column),F=new y.ReplaceCommand(K,V);return new p.EditOperationResult(d(V,h),[F],{shouldPushStackElementBefore:!1,shouldPushStackElementAfter:!0})}}return null}static compositionEndWithInterceptors(h,m,C,w,D,I){if(!w)return null;let T=null;for(const M of w)if(T===null)T=M.insertedText;else if(T!==M.insertedText)return null;if(!T||T.length!==1)return null;const A=T;let P=!1;for(const M of w)if(M.deletedText.length!==0){P=!0;break}if(P){if(!u._shouldSurroundChar(m,A)||!m.surroundingPairs.hasOwnProperty(A))return null;const M=(0,p.isQuote)(A);for(const O of w)if(O.deletedSelectionStart!==0||O.deletedSelectionEnd!==O.deletedText.length||/^[ \t]+$/.test(O.deletedText)||M&&(0,p.isQuote)(O.deletedText))return null;const R=[];for(const O of D){if(!O.isEmpty())return null;R.push(O.getPosition())}if(R.length!==w.length)return null;const x=[];for(let O=0,B=R.length;O<B;O++)x.push(new S.CompositionSurroundSelectionCommand(R[O],w[O].deletedText,m.surroundingPairs[A]));return new p.EditOperationResult(4,x,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!1})}if(this._isAutoClosingOvertype(m,C,D,I,A)){const M=D.map(R=>new y.ReplaceCommand(new v.Range(R.positionLineNumber,R.positionColumn,R.positionLineNumber,R.positionColumn+1),"",!1));return new p.EditOperationResult(4,M,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!1})}const N=this._getAutoClosingPairClose(m,C,D,A,!0);return N!==null?this._runAutoClosingOpenCharType(h,m,C,D,A,!0,N):null}static typeWithInterceptors(h,m,C,w,D,I,T){if(!h&&T===`
+`){const N=[];for(let M=0,R=D.length;M<R;M++)N[M]=u._enter(C,w,!1,D[M]);return new p.EditOperationResult(4,N,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!1})}if(!h&&this._isAutoIndentType(C,w,D)){const N=[];let M=!1;for(let R=0,x=D.length;R<x;R++)if(N[R]=this._runAutoIndentType(C,w,D[R],T),!N[R]){M=!0;break}if(!M)return new p.EditOperationResult(4,N,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!1})}if(this._isAutoClosingOvertype(C,w,D,I,T))return this._runAutoClosingOvertype(m,C,w,D,T);if(!h){const N=this._getAutoClosingPairClose(C,w,D,T,!1);if(N)return this._runAutoClosingOpenCharType(m,C,w,D,T,!1,N)}if(!h&&this._isSurroundSelectionType(C,w,D,T))return this._runSurroundSelectionType(m,C,w,D,T);if(!h&&this._isTypeInterceptorElectricChar(C,w,D)){const N=this._typeInterceptorElectricChar(m,C,w,D[0],T);if(N)return N}const A=[];for(let N=0,M=D.length;N<M;N++)A[N]=new y.ReplaceCommand(D[N],T);const P=d(T,m);return new p.EditOperationResult(P,A,{shouldPushStackElementBefore:s(m,P),shouldPushStackElementAfter:!1})}static typeWithoutInterceptors(h,m,C,w,D){const I=[];for(let A=0,P=w.length;A<P;A++)I[A]=new y.ReplaceCommand(w[A],D);const T=d(D,h);return new p.EditOperationResult(T,I,{shouldPushStackElementBefore:s(h,T),shouldPushStackElementAfter:!1})}static lineInsertBefore(h,m,C){if(m===null||C===null)return[];const w=[];for(let D=0,I=C.length;D<I;D++){let T=C[D].positionLineNumber;if(T===1)w[D]=new y.ReplaceCommandWithoutChangingPosition(new v.Range(1,1,1,1),`
+`);else{T--;const A=m.getLineMaxColumn(T);w[D]=this._enter(h,m,!1,new v.Range(T,A,T,A))}}return w}static lineInsertAfter(h,m,C){if(m===null||C===null)return[];const w=[];for(let D=0,I=C.length;D<I;D++){const T=C[D].positionLineNumber,A=m.getLineMaxColumn(T);w[D]=this._enter(h,m,!1,new v.Range(T,A,T,A))}return w}static lineBreakInsert(h,m,C){const w=[];for(let D=0,I=C.length;D<I;D++)w[D]=this._enter(h,m,!0,C[D]);return w}}e.TypeOperations=u;class f extends y.ReplaceCommandWithOffsetCursorState{constructor(h,m,C,w){super(h,(C?m:"")+w,0,-w.length),this._openCharacter=m,this._closeCharacter=w,this.closeCharacterRange=null,this.enclosingRange=null}computeCursorState(h,m){const w=m.getInverseEditOperations()[0].range;return this.closeCharacterRange=new v.Range(w.startLineNumber,w.endColumn-this._closeCharacter.length,w.endLineNumber,w.endColumn),this.enclosingRange=new v.Range(w.startLineNumber,w.endColumn-this._openCharacter.length-this._closeCharacter.length,w.endLineNumber,w.endColumn),super.computeCursorState(h,m)}}e.TypeWithAutoClosingCommand=f;class c{constructor(h,m,C,w,D,I){this.deletedText=h,this.deletedSelectionStart=m,this.deletedSelectionEnd=C,this.insertedText=w,this.insertedSelectionStart=D,this.insertedSelectionEnd=I}}e.CompositionOutcome=c;function d(g,h){return g===" "?h===5||h===6?6:5:4}function s(g,h){return o(g)&&!o(h)?!0:g===5?!1:l(g)!==l(h)}function l(g){return g===6||g===5?"space":g}function o(g){return g===4||g===5||g===6}}),define(se[791],oe([1,0,12,11,513,75,502,207,251,5,24,114,214,2,215]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorsController=void 0;class r extends n.Disposable{constructor(o,g,h,m){super(),this._model=o,this._knownModelVersionId=this._model.getVersionId(),this._viewModel=g,this._coordinatesConverter=h,this.context=new S.CursorContext(this._model,this._viewModel,this._coordinatesConverter,m),this._cursors=new y.CursorCollection(this.context),this._hasFocus=!1,this._isHandling=!1,this._compositionState=null,this._columnSelectData=null,this._autoClosedActions=[],this._prevEditOperationType=0}dispose(){this._cursors.dispose(),this._autoClosedActions=(0,n.dispose)(this._autoClosedActions),super.dispose()}updateConfiguration(o){this.context=new S.CursorContext(this._model,this._viewModel,this._coordinatesConverter,o),this._cursors.updateContext(this.context)}onLineMappingChanged(o){this._knownModelVersionId===this._model.getVersionId()&&this.setStates(o,"viewModel",0,this.getCursorStates())}setHasFocus(o){this._hasFocus=o}_validateAutoClosedActions(){if(this._autoClosedActions.length>0){const o=this._cursors.getSelections();for(let g=0;g<this._autoClosedActions.length;g++){const h=this._autoClosedActions[g];h.isValid(o)||(h.dispose(),this._autoClosedActions.splice(g,1),g--)}}}getPrimaryCursorState(){return this._cursors.getPrimaryCursor()}getLastAddedCursorIndex(){return this._cursors.getLastAddedCursorIndex()}getCursorStates(){return this._cursors.getAll()}setStates(o,g,h,m){let C=!1;const w=this.context.cursorConfig.multiCursorLimit;m!==null&&m.length>w&&(m=m.slice(0,w),C=!0);const D=u.from(this._model,this);return this._cursors.setStates(m),this._cursors.normalize(),this._columnSelectData=null,this._validateAutoClosedActions(),this._emitStateChangedIfNecessary(o,g,h,D,C)}setCursorColumnSelectData(o){this._columnSelectData=o}revealPrimary(o,g,h,m,C,w){const D=this._cursors.getViewPositions();let I=null,T=null;D.length>1?T=this._cursors.getViewSelections():I=v.Range.fromPositions(D[0],D[0]),o.emitViewEvent(new i.ViewRevealRangeRequestEvent(g,h,I,T,m,C,w))}saveState(){const o=[],g=this._cursors.getSelections();for(let h=0,m=g.length;h<m;h++){const C=g[h];o.push({inSelectionMode:!C.isEmpty(),selectionStart:{lineNumber:C.selectionStartLineNumber,column:C.selectionStartColumn},position:{lineNumber:C.positionLineNumber,column:C.positionColumn}})}return o}restoreState(o,g){const h=[];for(let m=0,C=g.length;m<C;m++){const w=g[m];let D=1,I=1;w.position&&w.position.lineNumber&&(D=w.position.lineNumber),w.position&&w.position.column&&(I=w.position.column);let T=D,A=I;w.selectionStart&&w.selectionStart.lineNumber&&(T=w.selectionStart.lineNumber),w.selectionStart&&w.selectionStart.column&&(A=w.selectionStart.column),h.push({selectionStartLineNumber:T,selectionStartColumn:A,positionLineNumber:D,positionColumn:I})}this.setStates(o,"restoreState",0,E.CursorState.fromModelSelections(h)),this.revealPrimary(o,"restoreState",!1,0,!0,1)}onModelContentChanged(o,g){if(g instanceof a.ModelInjectedTextChangedEvent){if(this._isHandling)return;this._isHandling=!0;try{this.setStates(o,"modelChange",0,this.getCursorStates())}finally{this._isHandling=!1}}else{const h=g.rawContentChangedEvent;if(this._knownModelVersionId=h.versionId,this._isHandling)return;const m=h.containsEvent(1);if(this._prevEditOperationType=0,m)this._cursors.dispose(),this._cursors=new y.CursorCollection(this.context),this._validateAutoClosedActions(),this._emitStateChangedIfNecessary(o,"model",1,null,!1);else if(this._hasFocus&&h.resultingSelection&&h.resultingSelection.length>0){const C=E.CursorState.fromModelSelections(h.resultingSelection);this.setStates(o,"modelChange",h.isUndoing?5:h.isRedoing?6:2,C)&&this.revealPrimary(o,"modelChange",!1,0,!0,0)}else{const C=this._cursors.readSelectionFromMarkers();this.setStates(o,"modelChange",2,E.CursorState.fromModelSelections(C))}}}getSelection(){return this._cursors.getPrimaryCursor().modelState.selection}getTopMostViewPosition(){return this._cursors.getTopMostViewPosition()}getBottomMostViewPosition(){return this._cursors.getBottomMostViewPosition()}getCursorColumnSelectData(){if(this._columnSelectData)return this._columnSelectData;const o=this._cursors.getPrimaryCursor(),g=o.viewState.selectionStart.getStartPosition(),h=o.viewState.position;return{isReal:!1,fromViewLineNumber:g.lineNumber,fromViewVisualColumn:this.context.cursorConfig.visibleColumnFromColumn(this._viewModel,g),toViewLineNumber:h.lineNumber,toViewVisualColumn:this.context.cursorConfig.visibleColumnFromColumn(this._viewModel,h)}}getSelections(){return this._cursors.getSelections()}setSelections(o,g,h,m){this.setStates(o,g,m,E.CursorState.fromModelSelections(h))}getPrevEditOperationType(){return this._prevEditOperationType}setPrevEditOperationType(o){this._prevEditOperationType=o}_pushAutoClosedAction(o,g){const h=[],m=[];for(let D=0,I=o.length;D<I;D++)h.push({range:o[D],options:{description:"auto-closed-character",inlineClassName:"auto-closed-character",stickiness:1}}),m.push({range:g[D],options:{description:"auto-closed-enclosing",stickiness:1}});const C=this._model.deltaDecorations([],h),w=this._model.deltaDecorations([],m);this._autoClosedActions.push(new f(this._model,C,w))}_executeEditOperation(o){if(!o)return;o.shouldPushStackElementBefore&&this._model.pushStackElement();const g=c.executeCommands(this._model,this._cursors.getSelections(),o.commands);if(g){this._interpretCommandResult(g);const h=[],m=[];for(let C=0;C<o.commands.length;C++){const w=o.commands[C];w instanceof _.TypeWithAutoClosingCommand&&w.enclosingRange&&w.closeCharacterRange&&(h.push(w.closeCharacterRange),m.push(w.enclosingRange))}h.length>0&&this._pushAutoClosedAction(h,m),this._prevEditOperationType=o.type}o.shouldPushStackElementAfter&&this._model.pushStackElement()}_interpretCommandResult(o){(!o||o.length===0)&&(o=this._cursors.readSelectionFromMarkers()),this._columnSelectData=null,this._cursors.setSelections(o),this._cursors.normalize()}_emitStateChangedIfNecessary(o,g,h,m,C){const w=u.from(this._model,this);if(w.equals(m))return!1;const D=this._cursors.getSelections(),I=this._cursors.getViewSelections();if(o.emitViewEvent(new i.ViewCursorStateChangedEvent(I,D,h)),!m||m.cursorState.length!==w.cursorState.length||w.cursorState.some((T,A)=>!T.modelState.equals(m.cursorState[A].modelState))){const T=m?m.cursorState.map(P=>P.modelState.selection):null,A=m?m.modelVersionId:0;o.emitOutgoingEvent(new t.CursorStateChangedEvent(T,D,A,w.modelVersionId,g||"keyboard",h,C))}return!0}_findAutoClosingPairs(o){if(!o.length)return null;const g=[];for(let h=0,m=o.length;h<m;h++){const C=o[h];if(!C.text||C.text.indexOf(`
+`)>=0)return null;const w=C.text.match(/([)\]}>'"`])([^)\]}>'"`]*)$/);if(!w)return null;const D=w[1],I=this.context.cursorConfig.autoClosingPairs.autoClosingPairsCloseSingleChar.get(D);if(!I||I.length!==1)return null;const T=I[0].open,A=C.text.length-w[2].length-1,P=C.text.lastIndexOf(T,A-1);if(P===-1)return null;g.push([P,A])}return g}executeEdits(o,g,h,m){let C=null;g==="snippet"&&(C=this._findAutoClosingPairs(h)),C&&(h[0]._isTracked=!0);const w=[],D=[],I=this._model.pushEditOperations(this.getSelections(),h,T=>{if(C)for(let P=0,N=C.length;P<N;P++){const[M,R]=C[P],x=T[P],O=x.range.startLineNumber,B=x.range.startColumn-1+M,W=x.range.startColumn-1+R;w.push(new v.Range(O,W+1,O,W+2)),D.push(new v.Range(O,B+1,O,W+2))}const A=m(T);return A&&(this._isHandling=!0),A});I&&(this._isHandling=!1,this.setSelections(o,g,I,0)),w.length>0&&this._pushAutoClosedAction(w,D)}_executeEdit(o,g,h,m=0){if(this.context.cursorConfig.readOnly)return;const C=u.from(this._model,this);this._cursors.stopTrackingSelections(),this._isHandling=!0;try{this._cursors.ensureValidState(),o()}catch(w){(0,L.onUnexpectedError)(w)}this._isHandling=!1,this._cursors.startTrackingSelections(),this._validateAutoClosedActions(),this._emitStateChangedIfNecessary(g,h,m,C,!1)&&this.revealPrimary(g,h,!1,0,!0,0)}getAutoClosedCharacters(){return f.getAllAutoClosedCharacters(this._autoClosedActions)}startComposition(o){this._compositionState=new s(this._model,this.getSelections())}endComposition(o,g){const h=this._compositionState?this._compositionState.deduceOutcome(this._model,this.getSelections()):null;this._compositionState=null,this._executeEdit(()=>{g==="keyboard"&&this._executeEditOperation(_.TypeOperations.compositionEndWithInterceptors(this._prevEditOperationType,this.context.cursorConfig,this._model,h,this.getSelections(),this.getAutoClosedCharacters()))},o,g)}type(o,g,h){this._executeEdit(()=>{if(h==="keyboard"){const m=g.length;let C=0;for(;C<m;){const w=k.nextCharLength(g,C),D=g.substr(C,w);this._executeEditOperation(_.TypeOperations.typeWithInterceptors(!!this._compositionState,this._prevEditOperationType,this.context.cursorConfig,this._model,this.getSelections(),this.getAutoClosedCharacters(),D)),C+=w}}else this._executeEditOperation(_.TypeOperations.typeWithoutInterceptors(this._prevEditOperationType,this.context.cursorConfig,this._model,this.getSelections(),g))},o,h)}compositionType(o,g,h,m,C,w){if(g.length===0&&h===0&&m===0){if(C!==0){const D=this.getSelections().map(I=>{const T=I.getPosition();return new b.Selection(T.lineNumber,T.column+C,T.lineNumber,T.column+C)});this.setSelections(o,w,D,0)}return}this._executeEdit(()=>{this._executeEditOperation(_.TypeOperations.compositionType(this._prevEditOperationType,this.context.cursorConfig,this._model,this.getSelections(),g,h,m,C))},o,w)}paste(o,g,h,m,C){this._executeEdit(()=>{this._executeEditOperation(_.TypeOperations.paste(this.context.cursorConfig,this._model,this.getSelections(),g,h,m||[]))},o,C,4)}cut(o,g){this._executeEdit(()=>{this._executeEditOperation(p.DeleteOperations.cut(this.context.cursorConfig,this._model,this.getSelections()))},o,g)}executeCommand(o,g,h){this._executeEdit(()=>{this._cursors.killSecondaryCursors(),this._executeEditOperation(new E.EditOperationResult(0,[g],{shouldPushStackElementBefore:!1,shouldPushStackElementAfter:!1}))},o,h)}executeCommands(o,g,h){this._executeEdit(()=>{this._executeEditOperation(new E.EditOperationResult(0,g,{shouldPushStackElementBefore:!1,shouldPushStackElementAfter:!1}))},o,h)}}e.CursorsController=r;class u{static from(o,g){return new u(o.getVersionId(),g.getCursorStates())}constructor(o,g){this.modelVersionId=o,this.cursorState=g}equals(o){if(!o||this.modelVersionId!==o.modelVersionId||this.cursorState.length!==o.cursorState.length)return!1;for(let g=0,h=this.cursorState.length;g<h;g++)if(!this.cursorState[g].equals(o.cursorState[g]))return!1;return!0}}class f{static getAllAutoClosedCharacters(o){let g=[];for(const h of o)g=g.concat(h.getAutoClosedCharactersRanges());return g}constructor(o,g,h){this._model=o,this._autoClosedCharactersDecorations=g,this._autoClosedEnclosingDecorations=h}dispose(){this._autoClosedCharactersDecorations=this._model.deltaDecorations(this._autoClosedCharactersDecorations,[]),this._autoClosedEnclosingDecorations=this._model.deltaDecorations(this._autoClosedEnclosingDecorations,[])}getAutoClosedCharactersRanges(){const o=[];for(let g=0;g<this._autoClosedCharactersDecorations.length;g++){const h=this._model.getDecorationRange(this._autoClosedCharactersDecorations[g]);h&&o.push(h)}return o}isValid(o){const g=[];for(let h=0;h<this._autoClosedEnclosingDecorations.length;h++){const m=this._model.getDecorationRange(this._autoClosedEnclosingDecorations[h]);if(m&&(g.push(m),m.startLineNumber!==m.endLineNumber))return!1}g.sort(v.Range.compareRangesUsingStarts),o.sort(v.Range.compareRangesUsingStarts);for(let h=0;h<o.length;h++)if(h>=g.length||!g[h].strictContainsRange(o[h]))return!1;return!0}}class c{static executeCommands(o,g,h){const m={model:o,selectionsBefore:g,trackedRanges:[],trackedRangesDirection:[]},C=this._innerExecuteCommands(m,h);for(let w=0,D=m.trackedRanges.length;w<D;w++)m.model._setTrackedRange(m.trackedRanges[w],null,0);return C}static _innerExecuteCommands(o,g){if(this._arrayIsEmpty(g))return null;const h=this._getEditOperations(o,g);if(h.operations.length===0)return null;const m=h.operations,C=this._getLoserCursorMap(m);if(C.hasOwnProperty("0"))return console.warn("Ignoring commands"),null;const w=[];for(let T=0,A=m.length;T<A;T++)C.hasOwnProperty(m[T].identifier.major.toString())||w.push(m[T]);h.hadTrackedEditOperation&&w.length>0&&(w[0]._isTracked=!0);let D=o.model.pushEditOperations(o.selectionsBefore,w,T=>{const A=[];for(let M=0;M<o.selectionsBefore.length;M++)A[M]=[];for(const M of T)M.identifier&&A[M.identifier.major].push(M);const P=(M,R)=>M.identifier.minor-R.identifier.minor,N=[];for(let M=0;M<o.selectionsBefore.length;M++)A[M].length>0?(A[M].sort(P),N[M]=g[M].computeCursorState(o.model,{getInverseEditOperations:()=>A[M],getTrackedSelection:R=>{const x=parseInt(R,10),O=o.model._getTrackedRange(o.trackedRanges[x]);return o.trackedRangesDirection[x]===0?new b.Selection(O.startLineNumber,O.startColumn,O.endLineNumber,O.endColumn):new b.Selection(O.endLineNumber,O.endColumn,O.startLineNumber,O.startColumn)}})):N[M]=o.selectionsBefore[M];return N});D||(D=o.selectionsBefore);const I=[];for(const T in C)C.hasOwnProperty(T)&&I.push(parseInt(T,10));I.sort((T,A)=>A-T);for(const T of I)D.splice(T,1);return D}static _arrayIsEmpty(o){for(let g=0,h=o.length;g<h;g++)if(o[g])return!1;return!0}static _getEditOperations(o,g){let h=[],m=!1;for(let C=0,w=g.length;C<w;C++){const D=g[C];if(D){const I=this._getEditOperationsFromCommand(o,C,D);h=h.concat(I.operations),m=m||I.hadTrackedEditOperation}}return{operations:h,hadTrackedEditOperation:m}}static _getEditOperationsFromCommand(o,g,h){const m=[];let C=0;const w=(P,N,M=!1)=>{v.Range.isEmpty(P)&&N===""||m.push({identifier:{major:g,minor:C++},range:P,text:N,forceMoveMarkers:M,isAutoWhitespaceEdit:h.insertsAutoWhitespace})};let D=!1;const A={addEditOperation:w,addTrackedEditOperation:(P,N,M)=>{D=!0,w(P,N,M)},trackSelection:(P,N)=>{const M=b.Selection.liftSelection(P);let R;if(M.isEmpty())if(typeof N=="boolean")N?R=2:R=3;else{const B=o.model.getLineMaxColumn(M.startLineNumber);M.startColumn===B?R=2:R=3}else R=1;const x=o.trackedRanges.length,O=o.model._setTrackedRange(null,M,R);return o.trackedRanges[x]=O,o.trackedRangesDirection[x]=M.getDirection(),x.toString()}};try{h.getEditOperations(o.model,A)}catch(P){return(0,L.onUnexpectedError)(P),{operations:[],hadTrackedEditOperation:!1}}return{operations:m,hadTrackedEditOperation:D}}static _getLoserCursorMap(o){o=o.slice(0),o.sort((h,m)=>-v.Range.compareRangesUsingEnds(h.range,m.range));const g={};for(let h=1;h<o.length;h++){const m=o[h-1],C=o[h];if(v.Range.getStartPosition(m.range).isBefore(v.Range.getEndPosition(C.range))){let w;m.identifier.major>C.identifier.major?w=m.identifier.major:w=C.identifier.major,g[w.toString()]=!0;for(let D=0;D<o.length;D++)o[D].identifier.major===w&&(o.splice(D,1),D<h&&h--,D--);h>0&&h--}}return g}}class d{constructor(o,g,h){this.text=o,this.startSelection=g,this.endSelection=h}}class s{static _capture(o,g){const h=[];for(const m of g){if(m.startLineNumber!==m.endLineNumber)return null;h.push(new d(o.getLineContent(m.startLineNumber),m.startColumn-1,m.endColumn-1))}return h}constructor(o,g){this._original=s._capture(o,g)}deduceOutcome(o,g){if(!this._original)return null;const h=s._capture(o,g);if(!h||this._original.length!==h.length)return null;const m=[];for(let C=0,w=this._original.length;C<w;C++)m.push(s._deduceOutcome(this._original[C],h[C]));return m}static _deduceOutcome(o,g){const h=Math.min(o.startSelection,g.startSelection,k.commonPrefixLength(o.text,g.text)),m=Math.min(o.text.length-o.endSelection,g.text.length-g.endSelection,k.commonSuffixLength(o.text,g.text)),C=o.text.substring(h,o.text.length-m),w=g.text.substring(h,g.text.length-m);return new _.CompositionOutcome(C,o.startSelection-h,o.endSelection-h,w,g.startSelection-h,g.endSelection-h)}}}),define(se[792],oe([1,0,47,49,80,341]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getIconClasses=void 0;const S=/(?:\/|^)(?:([^\/]+)\/)?([^\/]+)$/;function p(b,a,i,n,t){if(t)return[`codicon-${t.id}`,"predefined-file-icon"];const r=n===E.FileKind.ROOT_FOLDER?["rootfolder-icon"]:n===E.FileKind.FOLDER?["folder-icon"]:["file-icon"];if(i){let u;if(i.scheme===L.Schemas.data)u=k.DataUri.parseMetaData(i).get(k.DataUri.META_DATA_LABEL);else{const f=i.path.match(S);f?(u=v(f[2].toLowerCase()),f[1]&&r.push(`${v(f[1].toLowerCase())}-name-dir-icon`)):u=v(i.authority.toLowerCase())}if(n===E.FileKind.ROOT_FOLDER)r.push(`${u}-root-name-folder-icon`);else if(n===E.FileKind.FOLDER)r.push(`${u}-name-folder-icon`);else{if(u){if(r.push(`${u}-name-file-icon`),r.push("name-file-icon"),u.length<=255){const c=u.split(".");for(let d=1;d<c.length;d++)r.push(`${c.slice(d).join(".")}-ext-file-icon`)}r.push("ext-file-icon")}const f=_(b,a,i);f&&r.push(`${v(f)}-lang-file-icon`)}}return r}e.getIconClasses=p;function _(b,a,i){if(!i)return null;let n=null;if(i.scheme===L.Schemas.data){const r=k.DataUri.parseMetaData(i).get(k.DataUri.META_DATA_MIME);r&&(n=a.getLanguageIdByMimeType(r))}else{const t=b.getModel(i);t&&(n=t.getLanguageId())}return n&&n!==y.PLAINTEXT_LANGUAGE_ID?n:a.guessLanguageIdByFilepathOrFirstLine(i)}function v(b){return b.replace(/[\11\12\14\15\40]/g,"/")}}),define(se[793],oe([1,0,315,109,47,95,49,11,80]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getLanguageIds=e.clearPlatformLanguageAssociations=e.registerPlatformLanguageAssociation=void 0;let v=[],b=[],a=[];function i(s,l=!1){n(s,!1,l)}e.registerPlatformLanguageAssociation=i;function n(s,l,o){const g=t(s,l);v.push(g),g.userConfigured?a.push(g):b.push(g),o&&!g.userConfigured&&v.forEach(h=>{h.mime===g.mime||h.userConfigured||(g.extension&&h.extension===g.extension&&console.warn(`Overwriting extension <<${g.extension}>> to now point to mime <<${g.mime}>>`),g.filename&&h.filename===g.filename&&console.warn(`Overwriting filename <<${g.filename}>> to now point to mime <<${g.mime}>>`),g.filepattern&&h.filepattern===g.filepattern&&console.warn(`Overwriting filepattern <<${g.filepattern}>> to now point to mime <<${g.mime}>>`),g.firstline&&h.firstline===g.firstline&&console.warn(`Overwriting firstline <<${g.firstline}>> to now point to mime <<${g.mime}>>`))})}function t(s,l){return{id:s.id,mime:s.mime,filename:s.filename,extension:s.extension,filepattern:s.filepattern,firstline:s.firstline,userConfigured:l,filenameLowercase:s.filename?s.filename.toLowerCase():void 0,extensionLowercase:s.extension?s.extension.toLowerCase():void 0,filepatternLowercase:s.filepattern?(0,L.parse)(s.filepattern.toLowerCase()):void 0,filepatternOnPath:s.filepattern?s.filepattern.indexOf(E.posix.sep)>=0:!1}}function r(){v=v.filter(s=>s.userConfigured),b=[]}e.clearPlatformLanguageAssociations=r;function u(s,l){return f(s,l).map(o=>o.id)}e.getLanguageIds=u;function f(s,l){let o;if(s)switch(s.scheme){case y.Schemas.file:o=s.fsPath;break;case y.Schemas.data:{o=S.DataUri.parseMetaData(s).get(S.DataUri.META_DATA_LABEL);break}case y.Schemas.vscodeNotebookCell:o=void 0;break;default:o=s.path}if(!o)return[{id:"unknown",mime:k.Mimes.unknown}];o=o.toLowerCase();const g=(0,E.basename)(o),h=c(o,g,a);if(h)return[h,{id:_.PLAINTEXT_LANGUAGE_ID,mime:k.Mimes.text}];const m=c(o,g,b);if(m)return[m,{id:_.PLAINTEXT_LANGUAGE_ID,mime:k.Mimes.text}];if(l){const C=d(l);if(C)return[C,{id:_.PLAINTEXT_LANGUAGE_ID,mime:k.Mimes.text}]}return[{id:"unknown",mime:k.Mimes.unknown}]}function c(s,l,o){var g;let h,m,C;for(let w=o.length-1;w>=0;w--){const D=o[w];if(l===D.filenameLowercase){h=D;break}if(D.filepattern&&(!m||D.filepattern.length>m.filepattern.length)){const I=D.filepatternOnPath?s:l;!((g=D.filepatternLowercase)===null||g===void 0)&&g.call(D,I)&&(m=D)}D.extension&&(!C||D.extension.length>C.extension.length)&&l.endsWith(D.extensionLowercase)&&(C=D)}if(h)return h;if(m)return m;if(C)return C}function d(s){if((0,p.startsWithUTF8BOM)(s)&&(s=s.substr(1)),s.length>0)for(let l=v.length-1;l>=0;l--){const o=v[l];if(!o.firstline)continue;const g=s.match(o.firstline);if(g&&g.length>0)return o}}}),define(se[794],oe([1,0,6,2,11,793,80,98,37]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguagesRegistry=e.LanguageIdCodec=void 0;const v=Object.prototype.hasOwnProperty,b="vs.editor.nullLanguage";class a{constructor(){this._languageIdToLanguage=[],this._languageToLanguageId=new Map,this._register(b,0),this._register(S.PLAINTEXT_LANGUAGE_ID,1),this._nextLanguageId=2}_register(t,r){this._languageIdToLanguage[r]=t,this._languageToLanguageId.set(t,r)}register(t){if(this._languageToLanguageId.has(t))return;const r=this._nextLanguageId++;this._register(t,r)}encodeLanguageId(t){return this._languageToLanguageId.get(t)||0}decodeLanguageId(t){return this._languageIdToLanguage[t]||b}}e.LanguageIdCodec=a;class i extends k.Disposable{constructor(t=!0,r=!1){super(),this._onDidChange=this._register(new L.Emitter),this.onDidChange=this._onDidChange.event,i.instanceCount++,this._warnOnOverwrite=r,this.languageIdCodec=new a,this._dynamicLanguages=[],this._languages={},this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},t&&(this._initializeFromRegistry(),this._register(S.ModesRegistry.onDidChangeLanguages(u=>{this._initializeFromRegistry()})))}dispose(){i.instanceCount--,super.dispose()}_initializeFromRegistry(){this._languages={},this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},(0,E.clearPlatformLanguageAssociations)();const t=[].concat(S.ModesRegistry.getLanguages()).concat(this._dynamicLanguages);this._registerLanguages(t)}_registerLanguages(t){for(const r of t)this._registerLanguage(r);this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},Object.keys(this._languages).forEach(r=>{const u=this._languages[r];u.name&&(this._nameMap[u.name]=u.identifier),u.aliases.forEach(f=>{this._lowercaseNameMap[f.toLowerCase()]=u.identifier}),u.mimetypes.forEach(f=>{this._mimeTypesMap[f]=u.identifier})}),_.Registry.as(p.Extensions.Configuration).registerOverrideIdentifiers(this.getRegisteredLanguageIds()),this._onDidChange.fire()}_registerLanguage(t){const r=t.id;let u;v.call(this._languages,r)?u=this._languages[r]:(this.languageIdCodec.register(r),u={identifier:r,name:null,mimetypes:[],aliases:[],extensions:[],filenames:[],configurationFiles:[],icons:[]},this._languages[r]=u),this._mergeLanguage(u,t)}_mergeLanguage(t,r){const u=r.id;let f=null;if(Array.isArray(r.mimetypes)&&r.mimetypes.length>0&&(t.mimetypes.push(...r.mimetypes),f=r.mimetypes[0]),f||(f=`text/x-${u}`,t.mimetypes.push(f)),Array.isArray(r.extensions)){r.configuration?t.extensions=r.extensions.concat(t.extensions):t.extensions=t.extensions.concat(r.extensions);for(const s of r.extensions)(0,E.registerPlatformLanguageAssociation)({id:u,mime:f,extension:s},this._warnOnOverwrite)}if(Array.isArray(r.filenames))for(const s of r.filenames)(0,E.registerPlatformLanguageAssociation)({id:u,mime:f,filename:s},this._warnOnOverwrite),t.filenames.push(s);if(Array.isArray(r.filenamePatterns))for(const s of r.filenamePatterns)(0,E.registerPlatformLanguageAssociation)({id:u,mime:f,filepattern:s},this._warnOnOverwrite);if(typeof r.firstLine=="string"&&r.firstLine.length>0){let s=r.firstLine;s.charAt(0)!=="^"&&(s="^"+s);try{const l=new RegExp(s);(0,y.regExpLeadsToEndlessLoop)(l)||(0,E.registerPlatformLanguageAssociation)({id:u,mime:f,firstline:l},this._warnOnOverwrite)}catch(l){console.warn(`[${r.id}]: Invalid regular expression \`${s}\`: `,l)}}t.aliases.push(u);let c=null;if(typeof r.aliases<"u"&&Array.isArray(r.aliases)&&(r.aliases.length===0?c=[null]:c=r.aliases),c!==null)for(const s of c)!s||s.length===0||t.aliases.push(s);const d=c!==null&&c.length>0;if(!(d&&c[0]===null)){const s=(d?c[0]:null)||u;(d||!t.name)&&(t.name=s)}r.configuration&&t.configurationFiles.push(r.configuration),r.icon&&t.icons.push(r.icon)}isRegisteredLanguageId(t){return t?v.call(this._languages,t):!1}getRegisteredLanguageIds(){return Object.keys(this._languages)}getLanguageIdByLanguageName(t){const r=t.toLowerCase();return v.call(this._lowercaseNameMap,r)?this._lowercaseNameMap[r]:null}getLanguageIdByMimeType(t){return t&&v.call(this._mimeTypesMap,t)?this._mimeTypesMap[t]:null}guessLanguageIdByFilepathOrFirstLine(t,r){return!t&&!r?[]:(0,E.getLanguageIds)(t,r)}}e.LanguagesRegistry=i,i.instanceCount=0}),define(se[795],oe([1,0,6,2,794,13,31,80]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguageService=void 0;class _ extends k.Disposable{constructor(a=!1){super(),this._onDidRequestBasicLanguageFeatures=this._register(new L.Emitter),this.onDidRequestBasicLanguageFeatures=this._onDidRequestBasicLanguageFeatures.event,this._onDidRequestRichLanguageFeatures=this._register(new L.Emitter),this.onDidRequestRichLanguageFeatures=this._onDidRequestRichLanguageFeatures.event,this._onDidChange=this._register(new L.Emitter({leakWarningThreshold:200})),this.onDidChange=this._onDidChange.event,this._requestedBasicLanguages=new Set,this._requestedRichLanguages=new Set,_.instanceCount++,this._registry=this._register(new y.LanguagesRegistry(!0,a)),this.languageIdCodec=this._registry.languageIdCodec,this._register(this._registry.onDidChange(()=>this._onDidChange.fire()))}dispose(){_.instanceCount--,super.dispose()}isRegisteredLanguageId(a){return this._registry.isRegisteredLanguageId(a)}getLanguageIdByLanguageName(a){return this._registry.getLanguageIdByLanguageName(a)}getLanguageIdByMimeType(a){return this._registry.getLanguageIdByMimeType(a)}guessLanguageIdByFilepathOrFirstLine(a,i){const n=this._registry.guessLanguageIdByFilepathOrFirstLine(a,i);return(0,E.firstOrDefault)(n,null)}createById(a){return new v(this.onDidChange,()=>this._createAndGetLanguageIdentifier(a))}createByFilepathOrFirstLine(a,i){return new v(this.onDidChange,()=>{const n=this.guessLanguageIdByFilepathOrFirstLine(a,i);return this._createAndGetLanguageIdentifier(n)})}_createAndGetLanguageIdentifier(a){return(!a||!this.isRegisteredLanguageId(a))&&(a=p.PLAINTEXT_LANGUAGE_ID),a}requestBasicLanguageFeatures(a){this._requestedBasicLanguages.has(a)||(this._requestedBasicLanguages.add(a),this._onDidRequestBasicLanguageFeatures.fire(a))}requestRichLanguageFeatures(a){this._requestedRichLanguages.has(a)||(this._requestedRichLanguages.add(a),this.requestBasicLanguageFeatures(a),S.TokenizationRegistry.getOrCreate(a),this._onDidRequestRichLanguageFeatures.fire(a))}}e.LanguageService=_,_.instanceCount=0;class v{constructor(a,i){this._onDidChangeLanguages=a,this._selector=i,this._listener=null,this._emitter=null,this.languageId=this._selector()}_dispose(){this._listener&&(this._listener.dispose(),this._listener=null),this._emitter&&(this._emitter.dispose(),this._emitter=null)}get onDidChange(){return this._listener||(this._listener=this._onDidChangeLanguages(()=>this._evaluate())),this._emitter||(this._emitter=new L.Emitter({onDidRemoveLastListener:()=>{this._dispose()}})),this._emitter.event}_evaluate(){var a;const i=this._selector();i!==this.languageId&&(this.languageId=i,(a=this._emitter)===null||a===void 0||a.fire(this.languageId))}}}),define(se[353],oe([1,0,39,247,51,32,2,18,131]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DefaultDocumentColorProvider=void 0;class v{constructor(i,n){this._editorWorkerClient=new k.EditorWorkerClient(i,!1,"editorWorkerService",n)}async provideDocumentColors(i,n){return this._editorWorkerClient.computeDefaultDocumentColors(i.uri)}provideColorPresentations(i,n,t){const r=n.range,u=n.color,f=u.alpha,c=new L.Color(new L.RGBA(Math.round(255*u.red),Math.round(255*u.green),Math.round(255*u.blue),f)),d=f?L.Color.Format.CSS.formatRGB(c):L.Color.Format.CSS.formatRGBA(c),s=f?L.Color.Format.CSS.formatHSL(c):L.Color.Format.CSS.formatHSLA(c),l=f?L.Color.Format.CSS.formatHex(c):L.Color.Format.CSS.formatHexA(c),o=[];return o.push({label:d,textEdit:{range:r,text:d}}),o.push({label:s,textEdit:{range:r,text:s}}),o.push({label:l,textEdit:{range:r,text:l}}),o}}e.DefaultDocumentColorProvider=v;let b=class extends S.Disposable{constructor(i,n,t){super(),this._register(t.colorProvider.register("*",new v(i,n)))}};b=ke([ge(0,y.IModelService),ge(1,E.ILanguageConfigurationService),ge(2,p.ILanguageFeaturesService)],b),(0,_.registerEditorFeature)(b)}),define(se[354],oe([1,0,19,12,22,5,51,25,18,353,27]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getColorPresentations=e.getColors=void 0;async function a(c,d,s,l=!0){return u(new n,c,d,s,l)}e.getColors=a;function i(c,d,s,l){return Promise.resolve(s.provideColorPresentations(c,d,l))}e.getColorPresentations=i;class n{constructor(){}async compute(d,s,l,o){const g=await d.provideDocumentColors(s,l);if(Array.isArray(g))for(const h of g)o.push({colorInfo:h,provider:d});return Array.isArray(g)}}class t{constructor(){}async compute(d,s,l,o){const g=await d.provideDocumentColors(s,l);if(Array.isArray(g))for(const h of g)o.push({range:h.range,color:[h.color.red,h.color.green,h.color.blue,h.color.alpha]});return Array.isArray(g)}}class r{constructor(d){this.colorInfo=d}async compute(d,s,l,o){const g=await d.provideColorPresentations(s,this.colorInfo,L.CancellationToken.None);return Array.isArray(g)&&o.push(...g),Array.isArray(g)}}async function u(c,d,s,l,o){let g=!1,h;const m=[],C=d.ordered(s);for(let w=C.length-1;w>=0;w--){const D=C[w];if(D instanceof v.DefaultDocumentColorProvider)h=D;else try{await c.compute(D,s,l,m)&&(g=!0)}catch(I){(0,k.onUnexpectedExternalError)(I)}}return g?m:h&&o?(await c.compute(h,s,l,m),m):[]}function f(c,d){const{colorProvider:s}=c.get(_.ILanguageFeaturesService),l=c.get(S.IModelService).getModel(d);if(!l)throw(0,k.illegalArgument)();const o=c.get(b.IConfigurationService).getValue("editor.defaultColorDecorators",{resource:d});return{model:l,colorProviderRegistry:s,isDefaultColorDecoratorsEnabled:o}}p.CommandsRegistry.registerCommand("_executeDocumentColorProvider",function(c,...d){const[s]=d;if(!(s instanceof y.URI))throw(0,k.illegalArgument)();const{model:l,colorProviderRegistry:o,isDefaultColorDecoratorsEnabled:g}=f(c,s);return u(new t,o,l,L.CancellationToken.None,g)}),p.CommandsRegistry.registerCommand("_executeColorPresentationProvider",function(c,...d){const[s,l]=d,{uri:o,range:g}=l;if(!(o instanceof y.URI)||!Array.isArray(s)||s.length!==4||!E.Range.isIRange(g))throw(0,k.illegalArgument)();const{model:h,colorProviderRegistry:m,isDefaultColorDecoratorsEnabled:C}=f(c,o),[w,D,I,T]=s;return u(new r({range:g,color:{red:w,green:D,blue:I,alpha:T}}),m,h,L.CancellationToken.None,C)})}),define(se[796],oe([1,0,7,13,58,2,104,332,227,41]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarginHoverWidget=void 0;const b=L.$;class a extends E.Disposable{constructor(t,r,u){super(),this._renderDisposeables=this._register(new E.DisposableStore),this._editor=t,this._isVisible=!1,this._messages=[],this._hover=this._register(new _.HoverWidget),this._hover.containerDomNode.classList.toggle("hidden",!this._isVisible),this._markdownRenderer=this._register(new S.MarkdownRenderer({editor:this._editor},r,u)),this._computer=new i(this._editor),this._hoverOperation=this._register(new p.HoverOperation(this._editor,this._computer)),this._register(this._hoverOperation.onResult(f=>{this._withResult(f.value)})),this._register(this._editor.onDidChangeModelDecorations(()=>this._onModelDecorationsChanged())),this._register(this._editor.onDidChangeConfiguration(f=>{f.hasChanged(50)&&this._updateFont()})),this._editor.addOverlayWidget(this)}dispose(){this._editor.removeOverlayWidget(this),super.dispose()}getId(){return a.ID}getDomNode(){return this._hover.containerDomNode}getPosition(){return null}_updateFont(){Array.prototype.slice.call(this._hover.contentsDomNode.getElementsByClassName("code")).forEach(r=>this._editor.applyFontInfo(r))}_onModelDecorationsChanged(){this._isVisible&&(this._hoverOperation.cancel(),this._hoverOperation.start(0))}startShowingAt(t,r){this._computer.lineNumber===t&&this._computer.lane===r||(this._hoverOperation.cancel(),this.hide(),this._computer.lineNumber=t,this._computer.lane=r,this._hoverOperation.start(0))}hide(){this._computer.lineNumber=-1,this._hoverOperation.cancel(),this._isVisible&&(this._isVisible=!1,this._hover.containerDomNode.classList.toggle("hidden",!this._isVisible))}_withResult(t){this._messages=t,this._messages.length>0?this._renderMessages(this._computer.lineNumber,this._messages):this.hide()}_renderMessages(t,r){this._renderDisposeables.clear();const u=document.createDocumentFragment();for(const f of r){const c=b("div.hover-row.markdown-hover"),d=L.append(c,b("div.hover-contents")),s=this._renderDisposeables.add(this._markdownRenderer.render(f.value));d.appendChild(s.element),u.appendChild(c)}this._updateContents(u),this._showAt(t)}_updateContents(t){this._hover.contentsDomNode.textContent="",this._hover.contentsDomNode.appendChild(t),this._updateFont()}_showAt(t){this._isVisible||(this._isVisible=!0,this._hover.containerDomNode.classList.toggle("hidden",!this._isVisible));const r=this._editor.getLayoutInfo(),u=this._editor.getTopForLineNumber(t),f=this._editor.getScrollTop(),c=this._editor.getOption(66),d=this._hover.containerDomNode.clientHeight,s=u-f-(d-c)/2,l=r.glyphMarginLeft+r.glyphMarginWidth+(this._computer.lane==="lineNo"?r.lineNumbersWidth:0);this._hover.containerDomNode.style.left=`${l}px`,this._hover.containerDomNode.style.top=`${Math.max(Math.round(s),0)}px`}}e.MarginHoverWidget=a,a.ID="editor.contrib.modesGlyphHoverWidget";class i{get lineNumber(){return this._lineNumber}set lineNumber(t){this._lineNumber=t}get lane(){return this._laneOrLine}set lane(t){this._laneOrLine=t}constructor(t){this._editor=t,this._lineNumber=-1,this._laneOrLine=v.GlyphMarginLane.Center}computeSync(){var t,r;const u=s=>({value:s}),f=this._editor.getLineDecorations(this._lineNumber),c=[],d=this._laneOrLine==="lineNo";if(!f)return c;for(const s of f){const l=(r=(t=s.options.glyphMargin)===null||t===void 0?void 0:t.position)!==null&&r!==void 0?r:v.GlyphMarginLane.Center;if(!d&&l!==this._laneOrLine)continue;const o=d?s.options.lineNumberHoverMessage:s.options.glyphMarginHoverMessage;!o||(0,y.isEmptyMarkdownString)(o)||c.push(...(0,k.asArray)(o).map(u))}return c}}}),define(se[797],oe([1,0,19,71,2,35,10,31,32,18,617,307]),function(te,e,L,k,y,E,S,p,_,v,b,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineCompletionWithUpdatedRange=e.UpToDateInlineCompletions=e.InlineCompletionsSource=void 0;let i=class extends y.Disposable{constructor(l,o,g,h,m){super(),this.textModel=l,this.versionId=o,this._debounceValue=g,this.languageFeaturesService=h,this.languageConfigurationService=m,this._updateOperation=this._register(new y.MutableDisposable),this.inlineCompletions=(0,E.disposableObservableValue)("inlineCompletions",void 0),this.suggestWidgetInlineCompletions=(0,E.disposableObservableValue)("suggestWidgetInlineCompletions",void 0),this._register(this.textModel.onDidChangeContent(()=>{this._updateOperation.clear()}))}fetch(l,o,g){var h,m;const C=new t(l,o,this.textModel.getVersionId()),w=o.selectedSuggestionInfo?this.suggestWidgetInlineCompletions:this.inlineCompletions;if(!((h=this._updateOperation.value)===null||h===void 0)&&h.request.satisfies(C))return this._updateOperation.value.promise;if(!((m=w.get())===null||m===void 0)&&m.request.satisfies(C))return Promise.resolve(!0);const D=!!this._updateOperation.value;this._updateOperation.clear();const I=new L.CancellationTokenSource,T=(async()=>{if((D||o.triggerKind===p.InlineCompletionTriggerKind.Automatic)&&await n(this._debounceValue.get(this.textModel)),I.token.isCancellationRequested||this.textModel.getVersionId()!==C.versionId)return!1;const N=new Date,M=await(0,b.provideInlineCompletions)(this.languageFeaturesService.inlineCompletionsProvider,l,this.textModel,o,I.token,this.languageConfigurationService);if(I.token.isCancellationRequested||this.textModel.getVersionId()!==C.versionId)return!1;const R=new Date;this._debounceValue.update(this.textModel,R.getTime()-N.getTime());const x=new f(M,C,this.textModel,this.versionId);if(g){const O=g.toInlineCompletion(void 0);g.canBeReused(this.textModel,l)&&!M.has(O)&&x.prepend(g.inlineCompletion,O.range,!0)}return this._updateOperation.clear(),(0,E.transaction)(O=>{w.set(x,O)}),!0})(),A=new u(C,I,T);return this._updateOperation.value=A,T}clear(l){this._updateOperation.clear(),this.inlineCompletions.set(void 0,l),this.suggestWidgetInlineCompletions.set(void 0,l)}clearSuggestWidgetInlineCompletions(l){var o;!((o=this._updateOperation.value)===null||o===void 0)&&o.request.context.selectedSuggestionInfo&&this._updateOperation.clear(),this.suggestWidgetInlineCompletions.set(void 0,l)}cancelUpdate(){this._updateOperation.clear()}};e.InlineCompletionsSource=i,e.InlineCompletionsSource=i=ke([ge(3,v.ILanguageFeaturesService),ge(4,_.ILanguageConfigurationService)],i);function n(s,l){return new Promise(o=>{let g;const h=setTimeout(()=>{g&&g.dispose(),o()},s);l&&(g=l.onCancellationRequested(()=>{clearTimeout(h),g&&g.dispose(),o()}))})}class t{constructor(l,o,g){this.position=l,this.context=o,this.versionId=g}satisfies(l){return this.position.equals(l.position)&&r(this.context.selectedSuggestionInfo,l.context.selectedSuggestionInfo,(o,g)=>o.equals(g))&&(l.context.triggerKind===p.InlineCompletionTriggerKind.Automatic||this.context.triggerKind===p.InlineCompletionTriggerKind.Explicit)&&this.versionId===l.versionId}}function r(s,l,o){return!s||!l?s===l:o(s,l)}class u{constructor(l,o,g){this.request=l,this.cancellationTokenSource=o,this.promise=g}dispose(){this.cancellationTokenSource.cancel()}}class f{get inlineCompletions(){return this._inlineCompletions}constructor(l,o,g,h){this.inlineCompletionProviderResult=l,this.request=o,this.textModel=g,this.versionId=h,this._refCount=1,this._prependedInlineCompletionItems=[],this._rangeVersionIdValue=0,this._rangeVersionId=(0,E.derived)(this,C=>{this.versionId.read(C);let w=!1;for(const D of this._inlineCompletions)w=w||D._updateRange(this.textModel);return w&&this._rangeVersionIdValue++,this._rangeVersionIdValue});const m=g.deltaDecorations([],l.completions.map(C=>({range:C.range,options:{description:"inline-completion-tracking-range"}})));this._inlineCompletions=l.completions.map((C,w)=>new c(C,m[w],this._rangeVersionId))}clone(){return this._refCount++,this}dispose(){if(this._refCount--,this._refCount===0){setTimeout(()=>{this.textModel.isDisposed()||this.textModel.deltaDecorations(this._inlineCompletions.map(l=>l.decorationId),[])},0),this.inlineCompletionProviderResult.dispose();for(const l of this._prependedInlineCompletionItems)l.source.removeRef()}}prepend(l,o,g){g&&l.source.addRef();const h=this.textModel.deltaDecorations([],[{range:o,options:{description:"inline-completion-tracking-range"}}])[0];this._inlineCompletions.unshift(new c(l,h,this._rangeVersionId,o)),this._prependedInlineCompletionItems.push(l)}}e.UpToDateInlineCompletions=f;class c{get forwardStable(){var l;return(l=this.inlineCompletion.source.inlineCompletions.enableForwardStability)!==null&&l!==void 0?l:!1}constructor(l,o,g,h){this.inlineCompletion=l,this.decorationId=o,this.rangeVersion=g,this.semanticId=JSON.stringify([this.inlineCompletion.filterText,this.inlineCompletion.insertText,this.inlineCompletion.range.getStartPosition().toString()]),this._isValid=!0,this._updatedRange=h??l.range}toInlineCompletion(l){return this.inlineCompletion.withRange(this._getUpdatedRange(l))}toSingleTextEdit(l){return new a.SingleTextEdit(this._getUpdatedRange(l),this.inlineCompletion.insertText)}isVisible(l,o,g){const h=this._toFilterTextReplacement(g).removeCommonPrefix(l);if(!this._isValid||!this.inlineCompletion.range.getStartPosition().equals(this._getUpdatedRange(g).getStartPosition())||o.lineNumber!==h.range.startLineNumber)return!1;const m=l.getValueInRange(h.range,1),C=h.text,w=Math.max(0,o.column-h.range.startColumn);let D=C.substring(0,w),I=C.substring(w),T=m.substring(0,w),A=m.substring(w);const P=l.getLineIndentColumn(h.range.startLineNumber);return h.range.startColumn<=P&&(T=T.trimStart(),T.length===0&&(A=A.trimStart()),D=D.trimStart(),D.length===0&&(I=I.trimStart())),D.startsWith(T)&&!!(0,k.matchesSubString)(A,I)}canBeReused(l,o){return this._isValid&&this._getUpdatedRange(void 0).containsPosition(o)&&this.isVisible(l,o,void 0)&&!this._isSmallerThanOriginal(void 0)}_toFilterTextReplacement(l){return new a.SingleTextEdit(this._getUpdatedRange(l),this.inlineCompletion.filterText)}_isSmallerThanOriginal(l){return d(this._getUpdatedRange(l)).isBefore(d(this.inlineCompletion.range))}_getUpdatedRange(l){return this.rangeVersion.read(l),this._updatedRange}_updateRange(l){const o=l.getDecorationRange(this.decorationId);return o?this._updatedRange.equalsRange(o)?!1:(this._updatedRange=o,!0):(this._isValid=!1,!0)}}e.InlineCompletionWithUpdatedRange=c;function d(s){return s.startLineNumber===s.endLineNumber?new S.Position(1,1+s.endColumn-s.startColumn):new S.Position(1+s.endLineNumber-s.startLineNumber,s.endColumn)}}),define(se[798],oe([1,0,11,250,5,24,113,32,306,248,249]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MoveLinesCommand=void 0;let a=class{constructor(n,t,r,u){this._languageConfigurationService=u,this._selection=n,this._isMovingDown=t,this._autoIndent=r,this._selectionId=null,this._moveEndLineSelectionShrink=!1}getEditOperations(n,t){const r=n.getLineCount();if(this._isMovingDown&&this._selection.endLineNumber===r){this._selectionId=t.trackSelection(this._selection);return}if(!this._isMovingDown&&this._selection.startLineNumber===1){this._selectionId=t.trackSelection(this._selection);return}this._moveEndPositionDown=!1;let u=this._selection;u.startLineNumber<u.endLineNumber&&u.endColumn===1&&(this._moveEndPositionDown=!0,u=u.setEndPosition(u.endLineNumber-1,n.getLineMaxColumn(u.endLineNumber-1)));const{tabSize:f,indentSize:c,insertSpaces:d}=n.getOptions(),s=this.buildIndentConverter(f,c,d),l={tokenization:{getLineTokens:o=>n.tokenization.getLineTokens(o),getLanguageId:()=>n.getLanguageId(),getLanguageIdAtPosition:(o,g)=>n.getLanguageIdAtPosition(o,g)},getLineContent:null};if(u.startLineNumber===u.endLineNumber&&n.getLineMaxColumn(u.startLineNumber)===1){const o=u.startLineNumber,g=this._isMovingDown?o+1:o-1;n.getLineMaxColumn(g)===1?t.addEditOperation(new y.Range(1,1,1,1),null):(t.addEditOperation(new y.Range(o,1,o,1),n.getLineContent(g)),t.addEditOperation(new y.Range(g,1,g,n.getLineMaxColumn(g)),null)),u=new E.Selection(g,1,g,1)}else{let o,g;if(this._isMovingDown){o=u.endLineNumber+1,g=n.getLineContent(o),t.addEditOperation(new y.Range(o-1,n.getLineMaxColumn(o-1),o,n.getLineMaxColumn(o)),null);let h=g;if(this.shouldAutoIndent(n,u)){const m=this.matchEnterRule(n,s,f,o,u.startLineNumber-1);if(m!==null){const w=L.getLeadingWhitespace(n.getLineContent(o)),D=m+_.getSpaceCnt(w,f);h=_.generateIndent(D,f,d)+this.trimStart(g)}else{l.getLineContent=D=>D===u.startLineNumber?n.getLineContent(o):n.getLineContent(D);const w=(0,v.getGoodIndentForLine)(this._autoIndent,l,n.getLanguageIdAtPosition(o,1),u.startLineNumber,s,this._languageConfigurationService);if(w!==null){const D=L.getLeadingWhitespace(n.getLineContent(o)),I=_.getSpaceCnt(w,f),T=_.getSpaceCnt(D,f);I!==T&&(h=_.generateIndent(I,f,d)+this.trimStart(g))}}t.addEditOperation(new y.Range(u.startLineNumber,1,u.startLineNumber,1),h+`
+`);const C=this.matchEnterRuleMovingDown(n,s,f,u.startLineNumber,o,h);if(C!==null)C!==0&&this.getIndentEditsOfMovingBlock(n,t,u,f,d,C);else{l.getLineContent=D=>D===u.startLineNumber?h:D>=u.startLineNumber+1&&D<=u.endLineNumber+1?n.getLineContent(D-1):n.getLineContent(D);const w=(0,v.getGoodIndentForLine)(this._autoIndent,l,n.getLanguageIdAtPosition(o,1),u.startLineNumber+1,s,this._languageConfigurationService);if(w!==null){const D=L.getLeadingWhitespace(n.getLineContent(u.startLineNumber)),I=_.getSpaceCnt(w,f),T=_.getSpaceCnt(D,f);if(I!==T){const A=I-T;this.getIndentEditsOfMovingBlock(n,t,u,f,d,A)}}}}else t.addEditOperation(new y.Range(u.startLineNumber,1,u.startLineNumber,1),h+`
+`)}else if(o=u.startLineNumber-1,g=n.getLineContent(o),t.addEditOperation(new y.Range(o,1,o+1,1),null),t.addEditOperation(new y.Range(u.endLineNumber,n.getLineMaxColumn(u.endLineNumber),u.endLineNumber,n.getLineMaxColumn(u.endLineNumber)),`
+`+g),this.shouldAutoIndent(n,u)){l.getLineContent=m=>m===o?n.getLineContent(u.startLineNumber):n.getLineContent(m);const h=this.matchEnterRule(n,s,f,u.startLineNumber,u.startLineNumber-2);if(h!==null)h!==0&&this.getIndentEditsOfMovingBlock(n,t,u,f,d,h);else{const m=(0,v.getGoodIndentForLine)(this._autoIndent,l,n.getLanguageIdAtPosition(u.startLineNumber,1),o,s,this._languageConfigurationService);if(m!==null){const C=L.getLeadingWhitespace(n.getLineContent(u.startLineNumber)),w=_.getSpaceCnt(m,f),D=_.getSpaceCnt(C,f);if(w!==D){const I=w-D;this.getIndentEditsOfMovingBlock(n,t,u,f,d,I)}}}}}this._selectionId=t.trackSelection(u)}buildIndentConverter(n,t,r){return{shiftIndent:u=>k.ShiftCommand.shiftIndent(u,u.length+1,n,t,r),unshiftIndent:u=>k.ShiftCommand.unshiftIndent(u,u.length+1,n,t,r)}}parseEnterResult(n,t,r,u,f){if(f){let c=f.indentation;f.indentAction===S.IndentAction.None||f.indentAction===S.IndentAction.Indent?c=f.indentation+f.appendText:f.indentAction===S.IndentAction.IndentOutdent?c=f.indentation:f.indentAction===S.IndentAction.Outdent&&(c=t.unshiftIndent(f.indentation)+f.appendText);const d=n.getLineContent(u);if(this.trimStart(d).indexOf(this.trimStart(c))>=0){const s=L.getLeadingWhitespace(n.getLineContent(u));let l=L.getLeadingWhitespace(c);const o=(0,v.getIndentMetadata)(n,u,this._languageConfigurationService);o!==null&&o&2&&(l=t.unshiftIndent(l));const g=_.getSpaceCnt(l,r),h=_.getSpaceCnt(s,r);return g-h}}return null}matchEnterRuleMovingDown(n,t,r,u,f,c){if(L.lastNonWhitespaceIndex(c)>=0){const d=n.getLineMaxColumn(f),s=(0,b.getEnterAction)(this._autoIndent,n,new y.Range(f,d,f,d),this._languageConfigurationService);return this.parseEnterResult(n,t,r,u,s)}else{let d=u-1;for(;d>=1;){const o=n.getLineContent(d);if(L.lastNonWhitespaceIndex(o)>=0)break;d--}if(d<1||u>n.getLineCount())return null;const s=n.getLineMaxColumn(d),l=(0,b.getEnterAction)(this._autoIndent,n,new y.Range(d,s,d,s),this._languageConfigurationService);return this.parseEnterResult(n,t,r,u,l)}}matchEnterRule(n,t,r,u,f,c){let d=f;for(;d>=1;){let o;if(d===f&&c!==void 0?o=c:o=n.getLineContent(d),L.lastNonWhitespaceIndex(o)>=0)break;d--}if(d<1||u>n.getLineCount())return null;const s=n.getLineMaxColumn(d),l=(0,b.getEnterAction)(this._autoIndent,n,new y.Range(d,s,d,s),this._languageConfigurationService);return this.parseEnterResult(n,t,r,u,l)}trimStart(n){return n.replace(/^\s+/,"")}shouldAutoIndent(n,t){if(this._autoIndent<4||!n.tokenization.isCheapToTokenize(t.startLineNumber))return!1;const r=n.getLanguageIdAtPosition(t.startLineNumber,1),u=n.getLanguageIdAtPosition(t.endLineNumber,1);return!(r!==u||this._languageConfigurationService.getLanguageConfiguration(r).indentRulesSupport===null)}getIndentEditsOfMovingBlock(n,t,r,u,f,c){for(let d=r.startLineNumber;d<=r.endLineNumber;d++){const s=n.getLineContent(d),l=L.getLeadingWhitespace(s),g=_.getSpaceCnt(l,u)+c,h=_.generateIndent(g,u,f);h!==l&&(t.addEditOperation(new y.Range(d,1,d,l.length+1),h),d===r.endLineNumber&&r.endColumn<=l.length+1&&h===""&&(this._moveEndLineSelectionShrink=!0))}}computeCursorState(n,t){let r=t.getTrackedSelection(this._selectionId);return this._moveEndPositionDown&&(r=r.setEndPosition(r.endLineNumber+1,1)),this._moveEndLineSelectionShrink&&r.startLineNumber<r.endLineNumber&&(r=r.setEndPosition(r.endLineNumber,2)),r}};e.MoveLinesCommand=a,e.MoveLinesCommand=a=ke([ge(3,p.ILanguageConfigurationService)],a)}),define(se[355],oe([1,0,7,77,26,28,6,58,2,104,225,719,8]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestDetailsOverlay=e.SuggestDetailsWidget=e.canExpandCompletionItem=void 0;function n(u){return!!u&&!!(u.completion.documentation||u.completion.detail&&u.completion.detail!==u.completion.label)}e.canExpandCompletionItem=n;let t=class{constructor(f,c){this._editor=f,this._onDidClose=new S.Emitter,this.onDidClose=this._onDidClose.event,this._onDidChangeContents=new S.Emitter,this.onDidChangeContents=this._onDidChangeContents.event,this._disposables=new _.DisposableStore,this._renderDisposeable=new _.DisposableStore,this._borderWidth=1,this._size=new L.Dimension(330,0),this.domNode=L.$(".suggest-details"),this.domNode.classList.add("no-docs"),this._markdownRenderer=c.createInstance(v.MarkdownRenderer,{editor:f}),this._body=L.$(".body"),this._scrollbar=new k.DomScrollableElement(this._body,{alwaysConsumeMouseWheel:!0}),L.append(this.domNode,this._scrollbar.getDomNode()),this._disposables.add(this._scrollbar),this._header=L.append(this._body,L.$(".header")),this._close=L.append(this._header,L.$("span"+E.ThemeIcon.asCSSSelector(y.Codicon.close))),this._close.title=a.localize(0,null),this._type=L.append(this._header,L.$("p.type")),this._docs=L.append(this._body,L.$("p.docs")),this._configureFont(),this._disposables.add(this._editor.onDidChangeConfiguration(d=>{d.hasChanged(50)&&this._configureFont()}))}dispose(){this._disposables.dispose(),this._renderDisposeable.dispose()}_configureFont(){const f=this._editor.getOptions(),c=f.get(50),d=c.getMassagedFontFamily(),s=f.get(118)||c.fontSize,l=f.get(119)||c.lineHeight,o=c.fontWeight,g=`${s}px`,h=`${l}px`;this.domNode.style.fontSize=g,this.domNode.style.lineHeight=`${l/s}`,this.domNode.style.fontWeight=o,this.domNode.style.fontFeatureSettings=c.fontFeatureSettings,this._type.style.fontFamily=d,this._close.style.height=h,this._close.style.width=h}getLayoutInfo(){const f=this._editor.getOption(119)||this._editor.getOption(50).lineHeight,c=this._borderWidth,d=c*2;return{lineHeight:f,borderWidth:c,borderHeight:d,verticalPadding:22,horizontalPadding:14}}renderLoading(){this._type.textContent=a.localize(1,null),this._docs.textContent="",this.domNode.classList.remove("no-docs","no-type"),this.layout(this.size.width,this.getLayoutInfo().lineHeight*2),this._onDidChangeContents.fire(this)}renderItem(f,c){var d,s;this._renderDisposeable.clear();let{detail:l,documentation:o}=f.completion;if(c){let g="";g+=`score: ${f.score[0]}
+`,g+=`prefix: ${(d=f.word)!==null&&d!==void 0?d:"(no prefix)"}
+`,g+=`word: ${f.completion.filterText?f.completion.filterText+" (filterText)":f.textLabel}
+`,g+=`distance: ${f.distance} (localityBonus-setting)
+`,g+=`index: ${f.idx}, based on ${f.completion.sortText&&`sortText: "${f.completion.sortText}"`||"label"}
+`,g+=`commit_chars: ${(s=f.completion.commitCharacters)===null||s===void 0?void 0:s.join("")}
+`,o=new p.MarkdownString().appendCodeblock("empty",g),l=`Provider: ${f.provider._debugDisplayName}`}if(!c&&!n(f)){this.clearContents();return}if(this.domNode.classList.remove("no-docs","no-type"),l){const g=l.length>1e5?`${l.substr(0,1e5)}\u2026`:l;this._type.textContent=g,this._type.title=g,L.show(this._type),this._type.classList.toggle("auto-wrap",!/\r?\n^\s+/gmi.test(g))}else L.clearNode(this._type),this._type.title="",L.hide(this._type),this.domNode.classList.add("no-type");if(L.clearNode(this._docs),typeof o=="string")this._docs.classList.remove("markdown-docs"),this._docs.textContent=o;else if(o){this._docs.classList.add("markdown-docs"),L.clearNode(this._docs);const g=this._markdownRenderer.render(o);this._docs.appendChild(g.element),this._renderDisposeable.add(g),this._renderDisposeable.add(this._markdownRenderer.onDidRenderAsync(()=>{this.layout(this._size.width,this._type.clientHeight+this._docs.clientHeight),this._onDidChangeContents.fire(this)}))}this.domNode.style.userSelect="text",this.domNode.tabIndex=-1,this._close.onmousedown=g=>{g.preventDefault(),g.stopPropagation()},this._close.onclick=g=>{g.preventDefault(),g.stopPropagation(),this._onDidClose.fire()},this._body.scrollTop=0,this.layout(this._size.width,this._type.clientHeight+this._docs.clientHeight),this._onDidChangeContents.fire(this)}clearContents(){this.domNode.classList.add("no-docs"),this._type.textContent="",this._docs.textContent=""}get isEmpty(){return this.domNode.classList.contains("no-docs")}get size(){return this._size}layout(f,c){const d=new L.Dimension(f,c);L.Dimension.equals(d,this._size)||(this._size=d,L.size(this.domNode,f,c)),this._scrollbar.scanDomNode()}scrollDown(f=8){this._body.scrollTop+=f}scrollUp(f=8){this._body.scrollTop-=f}scrollTop(){this._body.scrollTop=0}scrollBottom(){this._body.scrollTop=this._body.scrollHeight}pageDown(){this.scrollDown(80)}pageUp(){this.scrollUp(80)}set borderWidth(f){this._borderWidth=f}get borderWidth(){return this._borderWidth}};e.SuggestDetailsWidget=t,e.SuggestDetailsWidget=t=ke([ge(1,i.IInstantiationService)],t);class r{constructor(f,c){this.widget=f,this._editor=c,this.allowEditorOverflow=!0,this._disposables=new _.DisposableStore,this._added=!1,this._preferAlignAtTop=!0,this._resizable=new b.ResizableHTMLElement,this._resizable.domNode.classList.add("suggest-details-container"),this._resizable.domNode.appendChild(f.domNode),this._resizable.enableSashes(!1,!0,!0,!1);let d,s,l=0,o=0;this._disposables.add(this._resizable.onDidWillResize(()=>{d=this._topLeft,s=this._resizable.size})),this._disposables.add(this._resizable.onDidResize(g=>{if(d&&s){this.widget.layout(g.dimension.width,g.dimension.height);let h=!1;g.west&&(o=s.width-g.dimension.width,h=!0),g.north&&(l=s.height-g.dimension.height,h=!0),h&&this._applyTopLeft({top:d.top+l,left:d.left+o})}g.done&&(d=void 0,s=void 0,l=0,o=0,this._userSize=g.dimension)})),this._disposables.add(this.widget.onDidChangeContents(()=>{var g;this._anchorBox&&this._placeAtAnchor(this._anchorBox,(g=this._userSize)!==null&&g!==void 0?g:this.widget.size,this._preferAlignAtTop)}))}dispose(){this._resizable.dispose(),this._disposables.dispose(),this.hide()}getId(){return"suggest.details"}getDomNode(){return this._resizable.domNode}getPosition(){return this._topLeft?{preference:this._topLeft}:null}show(){this._added||(this._editor.addOverlayWidget(this),this._added=!0)}hide(f=!1){this._resizable.clearSashHoverState(),this._added&&(this._editor.removeOverlayWidget(this),this._added=!1,this._anchorBox=void 0,this._topLeft=void 0),f&&(this._userSize=void 0,this.widget.clearContents())}placeAtAnchor(f,c){var d;const s=f.getBoundingClientRect();this._anchorBox=s,this._preferAlignAtTop=c,this._placeAtAnchor(this._anchorBox,(d=this._userSize)!==null&&d!==void 0?d:this.widget.size,c)}_placeAtAnchor(f,c,d){var s;const l=L.getClientArea(this.getDomNode().ownerDocument.body),o=this.widget.getLayoutInfo(),g=new L.Dimension(220,2*o.lineHeight),h=f.top,m=function(){const B=l.width-(f.left+f.width+o.borderWidth+o.horizontalPadding),W=-o.borderWidth+f.left+f.width,V=new L.Dimension(B,l.height-f.top-o.borderHeight-o.verticalPadding),K=V.with(void 0,f.top+f.height-o.borderHeight-o.verticalPadding);return{top:h,left:W,fit:B-c.width,maxSizeTop:V,maxSizeBottom:K,minSize:g.with(Math.min(B,g.width))}}(),C=function(){const B=f.left-o.borderWidth-o.horizontalPadding,W=Math.max(o.horizontalPadding,f.left-c.width-o.borderWidth),V=new L.Dimension(B,l.height-f.top-o.borderHeight-o.verticalPadding),K=V.with(void 0,f.top+f.height-o.borderHeight-o.verticalPadding);return{top:h,left:W,fit:B-c.width,maxSizeTop:V,maxSizeBottom:K,minSize:g.with(Math.min(B,g.width))}}(),w=function(){const B=f.left,W=-o.borderWidth+f.top+f.height,V=new L.Dimension(f.width-o.borderHeight,l.height-f.top-f.height-o.verticalPadding);return{top:W,left:B,fit:V.height-c.height,maxSizeBottom:V,maxSizeTop:V,minSize:g.with(V.width)}}(),D=[m,C,w],I=(s=D.find(B=>B.fit>=0))!==null&&s!==void 0?s:D.sort((B,W)=>W.fit-B.fit)[0],T=f.top+f.height-o.borderHeight;let A,P=c.height;const N=Math.max(I.maxSizeTop.height,I.maxSizeBottom.height);P>N&&(P=N);let M;d?P<=I.maxSizeTop.height?(A=!0,M=I.maxSizeTop):(A=!1,M=I.maxSizeBottom):P<=I.maxSizeBottom.height?(A=!1,M=I.maxSizeBottom):(A=!0,M=I.maxSizeTop);let{top:R,left:x}=I;!A&&P>f.height&&(R=T-P);const O=this._editor.getDomNode();if(O){const B=O.getBoundingClientRect();R-=B.top,x-=B.left}this._applyTopLeft({left:x,top:R}),this._resizable.enableSashes(!A,I===m,A,I!==m),this._resizable.minSize=I.minSize,this._resizable.maxSize=M,this._resizable.layout(P,Math.min(M.width,c.width)),this.widget.layout(this._resizable.size.width,this._resizable.size.height)}_applyTopLeft(f){this._topLeft=f,this._editor.layoutOverlayWidget(this)}}e.SuggestDetailsOverlay=r}),define(se[356],oe([1,0,13,53,55,20,22,27,98,37]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ConfigurationChangeEvent=e.Configuration=e.ConfigurationModelParser=e.ConfigurationModel=void 0;function b(u){return Object.isFrozen(u)?u:y.deepFreeze(u)}class a{constructor(f={},c=[],d=[],s){this._contents=f,this._keys=c,this._overrides=d,this.raw=s,this.overrideConfigurations=new Map}get rawConfiguration(){var f;if(!this._rawConfiguration)if(!((f=this.raw)===null||f===void 0)&&f.length){const c=this.raw.map(d=>{if(d instanceof a)return d;const s=new i("");return s.parseRaw(d),s.configurationModel});this._rawConfiguration=c.reduce((d,s)=>s===d?s:d.merge(s),c[0])}else this._rawConfiguration=this;return this._rawConfiguration}get contents(){return this._contents}get overrides(){return this._overrides}get keys(){return this._keys}isEmpty(){return this._keys.length===0&&Object.keys(this._contents).length===0&&this._overrides.length===0}getValue(f){return f?(0,p.getConfigurationValue)(this.contents,f):this.contents}inspect(f,c){const d=this.rawConfiguration.getValue(f),s=c?this.rawConfiguration.getOverrideValue(f,c):void 0,l=c?this.rawConfiguration.override(c).getValue(f):d;return{value:d,override:s,merged:l}}getOverrideValue(f,c){const d=this.getContentsForOverrideIdentifer(c);return d?f?(0,p.getConfigurationValue)(d,f):d:void 0}override(f){let c=this.overrideConfigurations.get(f);return c||(c=this.createOverrideConfigurationModel(f),this.overrideConfigurations.set(f,c)),c}merge(...f){var c,d;const s=y.deepClone(this.contents),l=y.deepClone(this.overrides),o=[...this.keys],g=!((c=this.raw)===null||c===void 0)&&c.length?[...this.raw]:[this];for(const h of f)if(g.push(...!((d=h.raw)===null||d===void 0)&&d.length?h.raw:[h]),!h.isEmpty()){this.mergeContents(s,h.contents);for(const m of h.overrides){const[C]=l.filter(w=>L.equals(w.identifiers,m.identifiers));C?(this.mergeContents(C.contents,m.contents),C.keys.push(...m.keys),C.keys=L.distinct(C.keys)):l.push(y.deepClone(m))}for(const m of h.keys)o.indexOf(m)===-1&&o.push(m)}return new a(s,o,l,g.every(h=>h instanceof a)?void 0:g)}createOverrideConfigurationModel(f){const c=this.getContentsForOverrideIdentifer(f);if(!c||typeof c!="object"||!Object.keys(c).length)return this;const d={};for(const s of L.distinct([...Object.keys(this.contents),...Object.keys(c)])){let l=this.contents[s];const o=c[s];o&&(typeof l=="object"&&typeof o=="object"?(l=y.deepClone(l),this.mergeContents(l,o)):l=o),d[s]=l}return new a(d,this.keys,this.overrides)}mergeContents(f,c){for(const d of Object.keys(c)){if(d in f&&E.isObject(f[d])&&E.isObject(c[d])){this.mergeContents(f[d],c[d]);continue}f[d]=y.deepClone(c[d])}}getContentsForOverrideIdentifer(f){let c=null,d=null;const s=l=>{l&&(d?this.mergeContents(d,l):d=y.deepClone(l))};for(const l of this.overrides)l.identifiers.length===1&&l.identifiers[0]===f?c=l.contents:l.identifiers.includes(f)&&s(l.contents);return s(c),d}toJSON(){return{contents:this.contents,overrides:this.overrides,keys:this.keys}}addValue(f,c){this.updateValue(f,c,!0)}setValue(f,c){this.updateValue(f,c,!1)}removeValue(f){const c=this.keys.indexOf(f);c!==-1&&(this.keys.splice(c,1),(0,p.removeFromValueTree)(this.contents,f),_.OVERRIDE_PROPERTY_REGEX.test(f)&&this.overrides.splice(this.overrides.findIndex(d=>L.equals(d.identifiers,(0,_.overrideIdentifiersFromKey)(f))),1))}updateValue(f,c,d){(0,p.addToValueTree)(this.contents,f,c,s=>console.error(s)),d=d||this.keys.indexOf(f)===-1,d&&this.keys.push(f),_.OVERRIDE_PROPERTY_REGEX.test(f)&&this.overrides.push({identifiers:(0,_.overrideIdentifiersFromKey)(f),keys:Object.keys(this.contents[f]),contents:(0,p.toValuesTree)(this.contents[f],s=>console.error(s))})}}e.ConfigurationModel=a;class i{constructor(f){this._name=f,this._raw=null,this._configurationModel=null,this._restrictedConfigurations=[]}get configurationModel(){return this._configurationModel||new a}parseRaw(f,c){this._raw=f;const{contents:d,keys:s,overrides:l,restricted:o,hasExcludedProperties:g}=this.doParseRaw(f,c);this._configurationModel=new a(d,s,l,g?[f]:void 0),this._restrictedConfigurations=o||[]}doParseRaw(f,c){const d=v.Registry.as(_.Extensions.Configuration).getConfigurationProperties(),s=this.filter(f,d,!0,c);f=s.raw;const l=(0,p.toValuesTree)(f,h=>console.error(`Conflict in settings file ${this._name}: ${h}`)),o=Object.keys(f),g=this.toOverrides(f,h=>console.error(`Conflict in settings file ${this._name}: ${h}`));return{contents:l,keys:o,overrides:g,restricted:s.restricted,hasExcludedProperties:s.hasExcludedProperties}}filter(f,c,d,s){var l,o,g;let h=!1;if(!s?.scopes&&!s?.skipRestricted&&!(!((l=s?.exclude)===null||l===void 0)&&l.length))return{raw:f,restricted:[],hasExcludedProperties:h};const m={},C=[];for(const w in f)if(_.OVERRIDE_PROPERTY_REGEX.test(w)&&d){const D=this.filter(f[w],c,!1,s);m[w]=D.raw,h=h||D.hasExcludedProperties,C.push(...D.restricted)}else{const D=c[w],I=D?typeof D.scope<"u"?D.scope:3:void 0;D?.restricted&&C.push(w),!(!((o=s.exclude)===null||o===void 0)&&o.includes(w))&&(!((g=s.include)===null||g===void 0)&&g.includes(w)||(I===void 0||s.scopes===void 0||s.scopes.includes(I))&&!(s.skipRestricted&&D?.restricted))?m[w]=f[w]:h=!0}return{raw:m,restricted:C,hasExcludedProperties:h}}toOverrides(f,c){const d=[];for(const s of Object.keys(f))if(_.OVERRIDE_PROPERTY_REGEX.test(s)){const l={};for(const o in f[s])l[o]=f[s][o];d.push({identifiers:(0,_.overrideIdentifiersFromKey)(s),keys:Object.keys(l),contents:(0,p.toValuesTree)(l,c)})}return d}}e.ConfigurationModelParser=i;class n{constructor(f,c,d,s,l,o,g,h,m,C,w,D,I){this.key=f,this.overrides=c,this._value=d,this.overrideIdentifiers=s,this.defaultConfiguration=l,this.policyConfiguration=o,this.applicationConfiguration=g,this.userConfiguration=h,this.localUserConfiguration=m,this.remoteUserConfiguration=C,this.workspaceConfiguration=w,this.folderConfigurationModel=D,this.memoryConfigurationModel=I}inspect(f,c,d){const s=f.inspect(c,d);return{get value(){return b(s.value)},get override(){return b(s.override)},get merged(){return b(s.merged)}}}get userInspectValue(){return this._userInspectValue||(this._userInspectValue=this.inspect(this.userConfiguration,this.key,this.overrides.overrideIdentifier)),this._userInspectValue}get user(){return this.userInspectValue.value!==void 0||this.userInspectValue.override!==void 0?{value:this.userInspectValue.value,override:this.userInspectValue.override}:void 0}}class t{constructor(f,c,d,s,l=new a,o=new a,g=new k.ResourceMap,h=new a,m=new k.ResourceMap){this._defaultConfiguration=f,this._policyConfiguration=c,this._applicationConfiguration=d,this._localUserConfiguration=s,this._remoteUserConfiguration=l,this._workspaceConfiguration=o,this._folderConfigurations=g,this._memoryConfiguration=h,this._memoryConfigurationByResource=m,this._workspaceConsolidatedConfiguration=null,this._foldersConsolidatedConfigurations=new k.ResourceMap,this._userConfiguration=null}getValue(f,c,d){return this.getConsolidatedConfigurationModel(f,c,d).getValue(f)}updateValue(f,c,d={}){let s;d.resource?(s=this._memoryConfigurationByResource.get(d.resource),s||(s=new a,this._memoryConfigurationByResource.set(d.resource,s))):s=this._memoryConfiguration,c===void 0?s.removeValue(f):s.setValue(f,c),d.resource||(this._workspaceConsolidatedConfiguration=null)}inspect(f,c,d){const s=this.getConsolidatedConfigurationModel(f,c,d),l=this.getFolderConfigurationModelForResource(c.resource,d),o=c.resource?this._memoryConfigurationByResource.get(c.resource)||this._memoryConfiguration:this._memoryConfiguration,g=new Set;for(const h of s.overrides)for(const m of h.identifiers)s.getOverrideValue(f,m)!==void 0&&g.add(m);return new n(f,c,s.getValue(f),g.size?[...g]:void 0,this._defaultConfiguration,this._policyConfiguration.isEmpty()?void 0:this._policyConfiguration,this.applicationConfiguration.isEmpty()?void 0:this.applicationConfiguration,this.userConfiguration,this.localUserConfiguration,this.remoteUserConfiguration,d?this._workspaceConfiguration:void 0,l||void 0,o)}get applicationConfiguration(){return this._applicationConfiguration}get userConfiguration(){return this._userConfiguration||(this._userConfiguration=this._remoteUserConfiguration.isEmpty()?this._localUserConfiguration:this._localUserConfiguration.merge(this._remoteUserConfiguration)),this._userConfiguration}get localUserConfiguration(){return this._localUserConfiguration}get remoteUserConfiguration(){return this._remoteUserConfiguration}getConsolidatedConfigurationModel(f,c,d){let s=this.getConsolidatedConfigurationModelForResource(c,d);return c.overrideIdentifier&&(s=s.override(c.overrideIdentifier)),!this._policyConfiguration.isEmpty()&&this._policyConfiguration.getValue(f)!==void 0&&(s=s.merge(this._policyConfiguration)),s}getConsolidatedConfigurationModelForResource({resource:f},c){let d=this.getWorkspaceConsolidatedConfiguration();if(c&&f){const s=c.getFolder(f);s&&(d=this.getFolderConsolidatedConfiguration(s.uri)||d);const l=this._memoryConfigurationByResource.get(f);l&&(d=d.merge(l))}return d}getWorkspaceConsolidatedConfiguration(){return this._workspaceConsolidatedConfiguration||(this._workspaceConsolidatedConfiguration=this._defaultConfiguration.merge(this.applicationConfiguration,this.userConfiguration,this._workspaceConfiguration,this._memoryConfiguration)),this._workspaceConsolidatedConfiguration}getFolderConsolidatedConfiguration(f){let c=this._foldersConsolidatedConfigurations.get(f);if(!c){const d=this.getWorkspaceConsolidatedConfiguration(),s=this._folderConfigurations.get(f);s?(c=d.merge(s),this._foldersConsolidatedConfigurations.set(f,c)):c=d}return c}getFolderConfigurationModelForResource(f,c){if(c&&f){const d=c.getFolder(f);if(d)return this._folderConfigurations.get(d.uri)}}toData(){return{defaults:{contents:this._defaultConfiguration.contents,overrides:this._defaultConfiguration.overrides,keys:this._defaultConfiguration.keys},policy:{contents:this._policyConfiguration.contents,overrides:this._policyConfiguration.overrides,keys:this._policyConfiguration.keys},application:{contents:this.applicationConfiguration.contents,overrides:this.applicationConfiguration.overrides,keys:this.applicationConfiguration.keys},user:{contents:this.userConfiguration.contents,overrides:this.userConfiguration.overrides,keys:this.userConfiguration.keys},workspace:{contents:this._workspaceConfiguration.contents,overrides:this._workspaceConfiguration.overrides,keys:this._workspaceConfiguration.keys},folders:[...this._folderConfigurations.keys()].reduce((f,c)=>{const{contents:d,overrides:s,keys:l}=this._folderConfigurations.get(c);return f.push([c,{contents:d,overrides:s,keys:l}]),f},[])}}static parse(f){const c=this.parseConfigurationModel(f.defaults),d=this.parseConfigurationModel(f.policy),s=this.parseConfigurationModel(f.application),l=this.parseConfigurationModel(f.user),o=this.parseConfigurationModel(f.workspace),g=f.folders.reduce((h,m)=>(h.set(S.URI.revive(m[0]),this.parseConfigurationModel(m[1])),h),new k.ResourceMap);return new t(c,d,s,l,new a,o,g,new a,new k.ResourceMap)}static parseConfigurationModel(f){return new a(f.contents,f.keys,f.overrides)}}e.Configuration=t;class r{constructor(f,c,d,s){this.change=f,this.previous=c,this.currentConfiguraiton=d,this.currentWorkspace=s,this._marker=`
+`,this._markerCode1=this._marker.charCodeAt(0),this._markerCode2=".".charCodeAt(0),this.affectedKeys=new Set,this._previousConfiguration=void 0;for(const l of f.keys)this.affectedKeys.add(l);for(const[,l]of f.overrides)for(const o of l)this.affectedKeys.add(o);this._affectsConfigStr=this._marker;for(const l of this.affectedKeys)this._affectsConfigStr+=l+this._marker}get previousConfiguration(){return!this._previousConfiguration&&this.previous&&(this._previousConfiguration=t.parse(this.previous.data)),this._previousConfiguration}affectsConfiguration(f,c){var d;const s=this._marker+f,l=this._affectsConfigStr.indexOf(s);if(l<0)return!1;const o=l+s.length;if(o>=this._affectsConfigStr.length)return!1;const g=this._affectsConfigStr.charCodeAt(o);if(g!==this._markerCode1&&g!==this._markerCode2)return!1;if(c){const h=this.previousConfiguration?this.previousConfiguration.getValue(f,c,(d=this.previous)===null||d===void 0?void 0:d.workspace):void 0,m=this.currentConfiguraiton.getValue(f,c,this.currentWorkspace);return!y.equals(h,m)}return!0}}e.ConfigurationChangeEvent=r}),define(se[799],oe([1,0,2,356,98,37]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DefaultConfiguration=void 0;class S extends L.Disposable{constructor(){super(...arguments),this._configurationModel=new k.ConfigurationModel}get configurationModel(){return this._configurationModel}reload(){return this.resetConfigurationModel(),this.configurationModel}getConfigurationDefaultOverrides(){return{}}resetConfigurationModel(){this._configurationModel=new k.ConfigurationModel;const _=E.Registry.as(y.Extensions.Configuration).getConfigurationProperties();this.updateConfigurationModel(Object.keys(_),_)}updateConfigurationModel(_,v){const b=this.getConfigurationDefaultOverrides();for(const a of _){const i=b[a],n=v[a];i!==void 0?this._configurationModel.addValue(a,i):n?this._configurationModel.addValue(a,n.default):this._configurationModel.removeValue(a)}}}e.DefaultConfiguration=S}),define(se[124],oe([1,0,125,17,25,37,2,66]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Extensions=e.KeybindingsRegistry=void 0;class _{constructor(){this._coreKeybindings=new p.LinkedList,this._extensionKeybindings=[],this._cachedMergedKeybindings=null}static bindToCurrentPlatform(a){if(k.OS===1){if(a&&a.win)return a.win}else if(k.OS===2){if(a&&a.mac)return a.mac}else if(a&&a.linux)return a.linux;return a}registerKeybindingRule(a){const i=_.bindToCurrentPlatform(a),n=new S.DisposableStore;if(i&&i.primary){const t=(0,L.decodeKeybinding)(i.primary,k.OS);t&&n.add(this._registerDefaultKeybinding(t,a.id,a.args,a.weight,0,a.when))}if(i&&Array.isArray(i.secondary))for(let t=0,r=i.secondary.length;t<r;t++){const u=i.secondary[t],f=(0,L.decodeKeybinding)(u,k.OS);f&&n.add(this._registerDefaultKeybinding(f,a.id,a.args,a.weight,-t-1,a.when))}return n}registerCommandAndKeybindingRule(a){return(0,S.combinedDisposable)(this.registerKeybindingRule(a),y.CommandsRegistry.registerCommand(a))}_registerDefaultKeybinding(a,i,n,t,r,u){const f=this._coreKeybindings.push({keybinding:a,command:i,commandArgs:n,when:u,weight1:t,weight2:r,extensionId:null,isBuiltinExtension:!1});return this._cachedMergedKeybindings=null,(0,S.toDisposable)(()=>{f(),this._cachedMergedKeybindings=null})}getDefaultKeybindings(){return this._cachedMergedKeybindings||(this._cachedMergedKeybindings=Array.from(this._coreKeybindings).concat(this._extensionKeybindings),this._cachedMergedKeybindings.sort(v)),this._cachedMergedKeybindings.slice(0)}}e.KeybindingsRegistry=new _,e.Extensions={EditorModes:"platform.keybindingsRegistry"},E.Registry.add(e.Extensions.EditorModes,e.KeybindingsRegistry);function v(b,a){if(b.weight1!==a.weight1)return b.weight1-a.weight1;if(b.command&&a.command){if(b.command<a.command)return-1;if(b.command>a.command)return 1}return b.weight2-a.weight2}}),define(se[30],oe([1,0,42,28,6,2,66,25,15,8,124]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";var a;Object.defineProperty(e,"__esModule",{value:!0}),e.registerAction2=e.Action2=e.MenuItemAction=e.SubmenuItemAction=e.MenuRegistry=e.IMenuService=e.MenuId=e.isISubmenuItem=e.isIMenuItem=void 0;function i(s){return s.command!==void 0}e.isIMenuItem=i;function n(s){return s.submenu!==void 0}e.isISubmenuItem=n;class t{constructor(l){if(t._instances.has(l))throw new TypeError(`MenuId with identifier '${l}' already exists. Use MenuId.for(ident) or a unique identifier`);t._instances.set(l,this),this.id=l}}e.MenuId=t,t._instances=new Map,t.CommandPalette=new t("CommandPalette"),t.DebugBreakpointsContext=new t("DebugBreakpointsContext"),t.DebugCallStackContext=new t("DebugCallStackContext"),t.DebugConsoleContext=new t("DebugConsoleContext"),t.DebugVariablesContext=new t("DebugVariablesContext"),t.DebugHoverContext=new t("DebugHoverContext"),t.DebugWatchContext=new t("DebugWatchContext"),t.DebugToolBar=new t("DebugToolBar"),t.DebugToolBarStop=new t("DebugToolBarStop"),t.EditorContext=new t("EditorContext"),t.SimpleEditorContext=new t("SimpleEditorContext"),t.EditorContent=new t("EditorContent"),t.EditorLineNumberContext=new t("EditorLineNumberContext"),t.EditorContextCopy=new t("EditorContextCopy"),t.EditorContextPeek=new t("EditorContextPeek"),t.EditorContextShare=new t("EditorContextShare"),t.EditorTitle=new t("EditorTitle"),t.EditorTitleRun=new t("EditorTitleRun"),t.EditorTitleContext=new t("EditorTitleContext"),t.EditorTitleContextShare=new t("EditorTitleContextShare"),t.EmptyEditorGroup=new t("EmptyEditorGroup"),t.EmptyEditorGroupContext=new t("EmptyEditorGroupContext"),t.EditorTabsBarContext=new t("EditorTabsBarContext"),t.EditorTabsBarShowTabsSubmenu=new t("EditorTabsBarShowTabsSubmenu"),t.EditorTabsBarShowTabsZenModeSubmenu=new t("EditorTabsBarShowTabsZenModeSubmenu"),t.EditorActionsPositionSubmenu=new t("EditorActionsPositionSubmenu"),t.ExplorerContext=new t("ExplorerContext"),t.ExplorerContextShare=new t("ExplorerContextShare"),t.ExtensionContext=new t("ExtensionContext"),t.GlobalActivity=new t("GlobalActivity"),t.CommandCenter=new t("CommandCenter"),t.CommandCenterCenter=new t("CommandCenterCenter"),t.LayoutControlMenuSubmenu=new t("LayoutControlMenuSubmenu"),t.LayoutControlMenu=new t("LayoutControlMenu"),t.MenubarMainMenu=new t("MenubarMainMenu"),t.MenubarAppearanceMenu=new t("MenubarAppearanceMenu"),t.MenubarDebugMenu=new t("MenubarDebugMenu"),t.MenubarEditMenu=new t("MenubarEditMenu"),t.MenubarCopy=new t("MenubarCopy"),t.MenubarFileMenu=new t("MenubarFileMenu"),t.MenubarGoMenu=new t("MenubarGoMenu"),t.MenubarHelpMenu=new t("MenubarHelpMenu"),t.MenubarLayoutMenu=new t("MenubarLayoutMenu"),t.MenubarNewBreakpointMenu=new t("MenubarNewBreakpointMenu"),t.PanelAlignmentMenu=new t("PanelAlignmentMenu"),t.PanelPositionMenu=new t("PanelPositionMenu"),t.ActivityBarPositionMenu=new t("ActivityBarPositionMenu"),t.MenubarPreferencesMenu=new t("MenubarPreferencesMenu"),t.MenubarRecentMenu=new t("MenubarRecentMenu"),t.MenubarSelectionMenu=new t("MenubarSelectionMenu"),t.MenubarShare=new t("MenubarShare"),t.MenubarSwitchEditorMenu=new t("MenubarSwitchEditorMenu"),t.MenubarSwitchGroupMenu=new t("MenubarSwitchGroupMenu"),t.MenubarTerminalMenu=new t("MenubarTerminalMenu"),t.MenubarViewMenu=new t("MenubarViewMenu"),t.MenubarHomeMenu=new t("MenubarHomeMenu"),t.OpenEditorsContext=new t("OpenEditorsContext"),t.OpenEditorsContextShare=new t("OpenEditorsContextShare"),t.ProblemsPanelContext=new t("ProblemsPanelContext"),t.SCMInputBox=new t("SCMInputBox"),t.SCMIncomingChanges=new t("SCMIncomingChanges"),t.SCMOutgoingChanges=new t("SCMOutgoingChanges"),t.SCMIncomingChangesAllChangesContext=new t("SCMIncomingChangesAllChangesContext"),t.SCMIncomingChangesHistoryItemContext=new t("SCMIncomingChangesHistoryItemContext"),t.SCMOutgoingChangesAllChangesContext=new t("SCMOutgoingChangesAllChangesContext"),t.SCMOutgoingChangesHistoryItemContext=new t("SCMOutgoingChangesHistoryItemContext"),t.SCMChangeContext=new t("SCMChangeContext"),t.SCMResourceContext=new t("SCMResourceContext"),t.SCMResourceContextShare=new t("SCMResourceContextShare"),t.SCMResourceFolderContext=new t("SCMResourceFolderContext"),t.SCMResourceGroupContext=new t("SCMResourceGroupContext"),t.SCMSourceControl=new t("SCMSourceControl"),t.SCMSourceControlInline=new t("SCMSourceControlInline"),t.SCMTitle=new t("SCMTitle"),t.SearchContext=new t("SearchContext"),t.SearchActionMenu=new t("SearchActionContext"),t.StatusBarWindowIndicatorMenu=new t("StatusBarWindowIndicatorMenu"),t.StatusBarRemoteIndicatorMenu=new t("StatusBarRemoteIndicatorMenu"),t.StickyScrollContext=new t("StickyScrollContext"),t.TestItem=new t("TestItem"),t.TestItemGutter=new t("TestItemGutter"),t.TestMessageContext=new t("TestMessageContext"),t.TestMessageContent=new t("TestMessageContent"),t.TestPeekElement=new t("TestPeekElement"),t.TestPeekTitle=new t("TestPeekTitle"),t.TouchBarContext=new t("TouchBarContext"),t.TitleBarContext=new t("TitleBarContext"),t.TitleBarTitleContext=new t("TitleBarTitleContext"),t.TunnelContext=new t("TunnelContext"),t.TunnelPrivacy=new t("TunnelPrivacy"),t.TunnelProtocol=new t("TunnelProtocol"),t.TunnelPortInline=new t("TunnelInline"),t.TunnelTitle=new t("TunnelTitle"),t.TunnelLocalAddressInline=new t("TunnelLocalAddressInline"),t.TunnelOriginInline=new t("TunnelOriginInline"),t.ViewItemContext=new t("ViewItemContext"),t.ViewContainerTitle=new t("ViewContainerTitle"),t.ViewContainerTitleContext=new t("ViewContainerTitleContext"),t.ViewTitle=new t("ViewTitle"),t.ViewTitleContext=new t("ViewTitleContext"),t.CommentEditorActions=new t("CommentEditorActions"),t.CommentThreadTitle=new t("CommentThreadTitle"),t.CommentThreadActions=new t("CommentThreadActions"),t.CommentThreadAdditionalActions=new t("CommentThreadAdditionalActions"),t.CommentThreadTitleContext=new t("CommentThreadTitleContext"),t.CommentThreadCommentContext=new t("CommentThreadCommentContext"),t.CommentTitle=new t("CommentTitle"),t.CommentActions=new t("CommentActions"),t.InteractiveToolbar=new t("InteractiveToolbar"),t.InteractiveCellTitle=new t("InteractiveCellTitle"),t.InteractiveCellDelete=new t("InteractiveCellDelete"),t.InteractiveCellExecute=new t("InteractiveCellExecute"),t.InteractiveInputExecute=new t("InteractiveInputExecute"),t.NotebookToolbar=new t("NotebookToolbar"),t.NotebookStickyScrollContext=new t("NotebookStickyScrollContext"),t.NotebookCellTitle=new t("NotebookCellTitle"),t.NotebookCellDelete=new t("NotebookCellDelete"),t.NotebookCellInsert=new t("NotebookCellInsert"),t.NotebookCellBetween=new t("NotebookCellBetween"),t.NotebookCellListTop=new t("NotebookCellTop"),t.NotebookCellExecute=new t("NotebookCellExecute"),t.NotebookCellExecutePrimary=new t("NotebookCellExecutePrimary"),t.NotebookDiffCellInputTitle=new t("NotebookDiffCellInputTitle"),t.NotebookDiffCellMetadataTitle=new t("NotebookDiffCellMetadataTitle"),t.NotebookDiffCellOutputsTitle=new t("NotebookDiffCellOutputsTitle"),t.NotebookOutputToolbar=new t("NotebookOutputToolbar"),t.NotebookEditorLayoutConfigure=new t("NotebookEditorLayoutConfigure"),t.NotebookKernelSource=new t("NotebookKernelSource"),t.BulkEditTitle=new t("BulkEditTitle"),t.BulkEditContext=new t("BulkEditContext"),t.TimelineItemContext=new t("TimelineItemContext"),t.TimelineTitle=new t("TimelineTitle"),t.TimelineTitleContext=new t("TimelineTitleContext"),t.TimelineFilterSubMenu=new t("TimelineFilterSubMenu"),t.AccountsContext=new t("AccountsContext"),t.SidebarTitle=new t("SidebarTitle"),t.PanelTitle=new t("PanelTitle"),t.AuxiliaryBarTitle=new t("AuxiliaryBarTitle"),t.TerminalInstanceContext=new t("TerminalInstanceContext"),t.TerminalEditorInstanceContext=new t("TerminalEditorInstanceContext"),t.TerminalNewDropdownContext=new t("TerminalNewDropdownContext"),t.TerminalTabContext=new t("TerminalTabContext"),t.TerminalTabEmptyAreaContext=new t("TerminalTabEmptyAreaContext"),t.TerminalStickyScrollContext=new t("TerminalStickyScrollContext"),t.WebviewContext=new t("WebviewContext"),t.InlineCompletionsActions=new t("InlineCompletionsActions"),t.NewFile=new t("NewFile"),t.MergeInput1Toolbar=new t("MergeToolbar1Toolbar"),t.MergeInput2Toolbar=new t("MergeToolbar2Toolbar"),t.MergeBaseToolbar=new t("MergeBaseToolbar"),t.MergeInputResultToolbar=new t("MergeToolbarResultToolbar"),t.InlineSuggestionToolbar=new t("InlineSuggestionToolbar"),t.ChatContext=new t("ChatContext"),t.ChatCodeBlock=new t("ChatCodeblock"),t.ChatMessageTitle=new t("ChatMessageTitle"),t.ChatExecute=new t("ChatExecute"),t.ChatInputSide=new t("ChatInputSide"),t.AccessibleView=new t("AccessibleView"),t.MultiDiffEditorFileToolbar=new t("MultiDiffEditorFileToolbar"),e.IMenuService=(0,v.createDecorator)("menuService");class r{static for(l){let o=this._all.get(l);return o||(o=new r(l),this._all.set(l,o)),o}static merge(l){const o=new Set;for(const g of l)g instanceof r&&o.add(g.id);return o}constructor(l){this.id=l,this.has=o=>o===l}}r._all=new Map,e.MenuRegistry=new class{constructor(){this._commands=new Map,this._menuItems=new Map,this._onDidChangeMenu=new y.MicrotaskEmitter({merge:r.merge}),this.onDidChangeMenu=this._onDidChangeMenu.event}addCommand(s){return this._commands.set(s.id,s),this._onDidChangeMenu.fire(r.for(t.CommandPalette)),(0,E.toDisposable)(()=>{this._commands.delete(s.id)&&this._onDidChangeMenu.fire(r.for(t.CommandPalette))})}getCommand(s){return this._commands.get(s)}getCommands(){const s=new Map;return this._commands.forEach((l,o)=>s.set(o,l)),s}appendMenuItem(s,l){let o=this._menuItems.get(s);o||(o=new S.LinkedList,this._menuItems.set(s,o));const g=o.push(l);return this._onDidChangeMenu.fire(r.for(s)),(0,E.toDisposable)(()=>{g(),this._onDidChangeMenu.fire(r.for(s))})}appendMenuItems(s){const l=new E.DisposableStore;for(const{id:o,item:g}of s)l.add(this.appendMenuItem(o,g));return l}getMenuItems(s){let l;return this._menuItems.has(s)?l=[...this._menuItems.get(s)]:l=[],s===t.CommandPalette&&this._appendImplicitItems(l),l}_appendImplicitItems(s){const l=new Set;for(const o of s)i(o)&&(l.add(o.command.id),o.alt&&l.add(o.alt.id));this._commands.forEach((o,g)=>{l.has(g)||s.push({command:o})})}};class u extends L.SubmenuAction{constructor(l,o,g){super(`submenuitem.${l.submenu.id}`,typeof l.title=="string"?l.title:l.title.value,g,"submenu"),this.item=l,this.hideActions=o}}e.SubmenuItemAction=u;let f=a=class{static label(l,o){return o?.renderShortTitle&&l.shortTitle?typeof l.shortTitle=="string"?l.shortTitle:l.shortTitle.value:typeof l.title=="string"?l.title:l.title.value}constructor(l,o,g,h,m,C){var w,D;this.hideActions=h,this._commandService=C,this.id=l.id,this.label=a.label(l,g),this.tooltip=(D=typeof l.tooltip=="string"?l.tooltip:(w=l.tooltip)===null||w===void 0?void 0:w.value)!==null&&D!==void 0?D:"",this.enabled=!l.precondition||m.contextMatchesRules(l.precondition),this.checked=void 0;let I;if(l.toggled){const T=l.toggled.condition?l.toggled:{condition:l.toggled};this.checked=m.contextMatchesRules(T.condition),this.checked&&T.tooltip&&(this.tooltip=typeof T.tooltip=="string"?T.tooltip:T.tooltip.value),this.checked&&k.ThemeIcon.isThemeIcon(T.icon)&&(I=T.icon),this.checked&&T.title&&(this.label=typeof T.title=="string"?T.title:T.title.value)}I||(I=k.ThemeIcon.isThemeIcon(l.icon)?l.icon:void 0),this.item=l,this.alt=o?new a(o,void 0,g,h,m,C):void 0,this._options=g,this.class=I&&k.ThemeIcon.asClassName(I)}run(...l){var o,g;let h=[];return!((o=this._options)===null||o===void 0)&&o.arg&&(h=[...h,this._options.arg]),!((g=this._options)===null||g===void 0)&&g.shouldForwardArgs&&(h=[...h,...l]),this._commandService.executeCommand(this.id,...h)}};e.MenuItemAction=f,e.MenuItemAction=f=a=ke([ge(4,_.IContextKeyService),ge(5,p.ICommandService)],f);class c{constructor(l){this.desc=l}}e.Action2=c;function d(s){const l=new E.DisposableStore,o=new s,{f1:g,menu:h,keybinding:m,...C}=o.desc;if(p.CommandsRegistry.getCommand(C.id))throw new Error(`Cannot register two commands with the same id: ${C.id}`);if(l.add(p.CommandsRegistry.registerCommand({id:C.id,handler:(w,...D)=>o.run(w,...D),metadata:C.metadata})),Array.isArray(h))for(const w of h)l.add(e.MenuRegistry.appendMenuItem(w.id,{command:{...C,precondition:w.precondition===null?void 0:C.precondition},...w}));else h&&l.add(e.MenuRegistry.appendMenuItem(h.id,{command:{...C,precondition:h.precondition===null?void 0:C.precondition},...h}));if(g&&(l.add(e.MenuRegistry.appendMenuItem(t.CommandPalette,{command:C,when:C.precondition})),l.add(e.MenuRegistry.addCommand(C))),Array.isArray(m))for(const w of m)l.add(b.KeybindingsRegistry.registerKeybindingRule({...w,id:C.id,when:C.precondition?_.ContextKeyExpr.and(C.precondition,w.when):w.when}));else m&&l.add(b.KeybindingsRegistry.registerKeybindingRule({...m,id:C.id,when:C.precondition?_.ContextKeyExpr.and(C.precondition,m.when):m.when}));return l}e.registerAction2=d}),define(se[800],oe([1,0,48,202,723,30]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ToggleTabFocusModeAction=void 0;class S extends E.Action2{constructor(){super({id:S.ID,title:{value:y.localize(0,null),original:"Toggle Tab Key Moves Focus"},precondition:void 0,keybinding:{primary:2091,mac:{primary:1323},weight:100},f1:!0})}run(){const v=!k.TabFocus.getTabFocusMode();k.TabFocus.setTabFocusMode(v),v?(0,L.alert)(y.localize(1,null)):(0,L.alert)(y.localize(2,null))}}e.ToggleTabFocusModeAction=S,S.ID="editor.action.toggleTabFocusMode",(0,E.registerAction2)(S)}),define(se[357],oe([1,0,232,598,15,124,742,2,7]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextScopedReplaceInput=e.ContextScopedFindInput=e.registerAndCreateHistoryNavigationContext=e.historyNavigationVisible=void 0,e.historyNavigationVisible=new y.RawContextKey("suggestWidgetVisible",!1,(0,S.localize)(0,null));const v="historyNavigationWidgetFocus",b="historyNavigationForwardsEnabled",a="historyNavigationBackwardsEnabled";let i;const n=[];function t(f,c){if(n.includes(c))throw new Error("Cannot register the same widget multiple times");n.push(c);const d=new p.DisposableStore,s=new y.RawContextKey(v,!1).bindTo(f),l=new y.RawContextKey(b,!0).bindTo(f),o=new y.RawContextKey(a,!0).bindTo(f),g=()=>{s.set(!0),i=c},h=()=>{s.set(!1),i===c&&(i=void 0)};return(0,_.isActiveElement)(c.element)&&g(),d.add(c.onDidFocus(()=>g())),d.add(c.onDidBlur(()=>h())),d.add((0,p.toDisposable)(()=>{n.splice(n.indexOf(c),1),h()})),{historyNavigationForwardsEnablement:l,historyNavigationBackwardsEnablement:o,dispose(){d.dispose()}}}e.registerAndCreateHistoryNavigationContext=t;let r=class extends L.FindInput{constructor(c,d,s,l){super(c,d,s);const o=this._register(l.createScoped(this.inputBox.element));this._register(t(o,this.inputBox))}};e.ContextScopedFindInput=r,e.ContextScopedFindInput=r=ke([ge(3,y.IContextKeyService)],r);let u=class extends k.ReplaceInput{constructor(c,d,s,l,o=!1){super(c,d,o,s);const g=this._register(l.createScoped(this.inputBox.element));this._register(t(g,this.inputBox))}};e.ContextScopedReplaceInput=u,e.ContextScopedReplaceInput=u=ke([ge(3,y.IContextKeyService)],u),E.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"history.showPrevious",weight:200,when:y.ContextKeyExpr.and(y.ContextKeyExpr.has(v),y.ContextKeyExpr.equals(a,!0),y.ContextKeyExpr.not("isComposing"),e.historyNavigationVisible.isEqualTo(!1)),primary:16,secondary:[528],handler:f=>{i?.showPreviousValue()}}),E.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"history.showNext",weight:200,when:y.ContextKeyExpr.and(y.ContextKeyExpr.has(v),y.ContextKeyExpr.equals(b,!0),y.ContextKeyExpr.not("isComposing"),e.historyNavigationVisible.isEqualTo(!1)),primary:18,secondary:[530],handler:f=>{i?.showNextValue()}})}),define(se[138],oe([1,0,19,12,71,2,61,20,22,10,5,68,117,716,30,25,15,18,357]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickSuggestionsOptions=e.showSimpleSuggestions=e.getSuggestionComparator=e.provideSuggestionItems=e.CompletionItemModel=e.getSnippetSuggestSupport=e.CompletionOptions=e.CompletionItem=e.suggestWidgetStatusbarMenu=e.Context=void 0,e.Context={Visible:c.historyNavigationVisible,HasFocusedSuggestion:new u.RawContextKey("suggestWidgetHasFocusedSuggestion",!1,(0,n.localize)(0,null)),DetailsVisible:new u.RawContextKey("suggestWidgetDetailsVisible",!1,(0,n.localize)(1,null)),MultipleSuggestions:new u.RawContextKey("suggestWidgetMultipleSuggestions",!1,(0,n.localize)(2,null)),MakesTextEdit:new u.RawContextKey("suggestionMakesTextEdit",!0,(0,n.localize)(3,null)),AcceptSuggestionsOnEnter:new u.RawContextKey("acceptSuggestionOnEnter",!0,(0,n.localize)(4,null)),HasInsertAndReplaceRange:new u.RawContextKey("suggestionHasInsertAndReplaceRange",!1,(0,n.localize)(5,null)),InsertMode:new u.RawContextKey("suggestionInsertMode",void 0,{type:"string",description:(0,n.localize)(6,null)}),CanResolve:new u.RawContextKey("suggestionCanResolve",!1,(0,n.localize)(7,null))},e.suggestWidgetStatusbarMenu=new t.MenuId("suggestWidgetStatusBar");class d{constructor(N,M,R,x){var O;this.position=N,this.completion=M,this.container=R,this.provider=x,this.isInvalid=!1,this.score=y.FuzzyScore.Default,this.distance=0,this.textLabel=typeof M.label=="string"?M.label:(O=M.label)===null||O===void 0?void 0:O.label,this.labelLow=this.textLabel.toLowerCase(),this.isInvalid=!this.textLabel,this.sortTextLow=M.sortText&&M.sortText.toLowerCase(),this.filterTextLow=M.filterText&&M.filterText.toLowerCase(),this.extensionId=M.extensionId,b.Range.isIRange(M.range)?(this.editStart=new v.Position(M.range.startLineNumber,M.range.startColumn),this.editInsertEnd=new v.Position(M.range.endLineNumber,M.range.endColumn),this.editReplaceEnd=new v.Position(M.range.endLineNumber,M.range.endColumn),this.isInvalid=this.isInvalid||b.Range.spansMultipleLines(M.range)||M.range.startLineNumber!==N.lineNumber):(this.editStart=new v.Position(M.range.insert.startLineNumber,M.range.insert.startColumn),this.editInsertEnd=new v.Position(M.range.insert.endLineNumber,M.range.insert.endColumn),this.editReplaceEnd=new v.Position(M.range.replace.endLineNumber,M.range.replace.endColumn),this.isInvalid=this.isInvalid||b.Range.spansMultipleLines(M.range.insert)||b.Range.spansMultipleLines(M.range.replace)||M.range.insert.startLineNumber!==N.lineNumber||M.range.replace.startLineNumber!==N.lineNumber||M.range.insert.startColumn!==M.range.replace.startColumn),typeof x.resolveCompletionItem!="function"&&(this._resolveCache=Promise.resolve(),this._resolveDuration=0)}get isResolved(){return this._resolveDuration!==void 0}get resolveDuration(){return this._resolveDuration!==void 0?this._resolveDuration:-1}async resolve(N){if(!this._resolveCache){const M=N.onCancellationRequested(()=>{this._resolveCache=void 0,this._resolveDuration=void 0}),R=new S.StopWatch(!0);this._resolveCache=Promise.resolve(this.provider.resolveCompletionItem(this.completion,N)).then(x=>{Object.assign(this.completion,x),this._resolveDuration=R.elapsed()},x=>{(0,k.isCancellationError)(x)&&(this._resolveCache=void 0,this._resolveDuration=void 0)}).finally(()=>{M.dispose()})}return this._resolveCache}}e.CompletionItem=d;class s{constructor(N=2,M=new Set,R=new Set,x=new Map,O=!0){this.snippetSortOrder=N,this.kindFilter=M,this.providerFilter=R,this.providerItemsToReuse=x,this.showDeprecated=O}}e.CompletionOptions=s,s.default=new s;let l;function o(){return l}e.getSnippetSuggestSupport=o;class g{constructor(N,M,R,x){this.items=N,this.needsClipboard=M,this.durations=R,this.disposable=x}}e.CompletionItemModel=g;async function h(P,N,M,R=s.default,x={triggerKind:0},O=L.CancellationToken.None){const B=new S.StopWatch;M=M.clone();const W=N.getWordAtPosition(M),V=W?new b.Range(M.lineNumber,W.startColumn,M.lineNumber,W.endColumn):b.Range.fromPositions(M),K={replace:V,insert:V.setEndPosition(M.lineNumber,M.column)},F=[],q=new E.DisposableStore,ie=[];let ae=!1;const ne=(J,Q,re)=>{var de,he,me;let X=!1;if(!Q)return X;for(const U of Q.suggestions)if(!R.kindFilter.has(U.kind)){if(!R.showDeprecated&&(!((de=U?.tags)===null||de===void 0)&&de.includes(1)))continue;U.range||(U.range=K),U.sortText||(U.sortText=typeof U.label=="string"?U.label:U.label.label),!ae&&U.insertTextRules&&U.insertTextRules&4&&(ae=i.SnippetParser.guessNeedsClipboard(U.insertText)),F.push(new d(M,U,Q,J)),X=!0}return(0,E.isDisposable)(Q)&&q.add(Q),ie.push({providerName:(he=J._debugDisplayName)!==null&&he!==void 0?he:"unknown_provider",elapsedProvider:(me=Q.duration)!==null&&me!==void 0?me:-1,elapsedOverall:re.elapsed()}),X},$=(async()=>{if(!l||R.kindFilter.has(27))return;const J=R.providerItemsToReuse.get(l);if(J){J.forEach(de=>F.push(de));return}if(R.providerFilter.size>0&&!R.providerFilter.has(l))return;const Q=new S.StopWatch,re=await l.provideCompletionItems(N,M,x,O);ne(l,re,Q)})();for(const J of P.orderedGroups(N)){let Q=!1;if(await Promise.all(J.map(async re=>{if(R.providerItemsToReuse.has(re)){const de=R.providerItemsToReuse.get(re);de.forEach(he=>F.push(he)),Q=Q||de.length>0;return}if(!(R.providerFilter.size>0&&!R.providerFilter.has(re)))try{const de=new S.StopWatch,he=await re.provideCompletionItems(N,M,x,O);Q=ne(re,he,de)||Q}catch(de){(0,k.onUnexpectedExternalError)(de)}})),Q||O.isCancellationRequested)break}return await $,O.isCancellationRequested?(q.dispose(),Promise.reject(new k.CancellationError)):new g(F.sort(I(R.snippetSortOrder)),ae,{entries:ie,elapsed:B.elapsed()},q)}e.provideSuggestionItems=h;function m(P,N){if(P.sortTextLow&&N.sortTextLow){if(P.sortTextLow<N.sortTextLow)return-1;if(P.sortTextLow>N.sortTextLow)return 1}return P.textLabel<N.textLabel?-1:P.textLabel>N.textLabel?1:P.completion.kind-N.completion.kind}function C(P,N){if(P.completion.kind!==N.completion.kind){if(P.completion.kind===27)return-1;if(N.completion.kind===27)return 1}return m(P,N)}function w(P,N){if(P.completion.kind!==N.completion.kind){if(P.completion.kind===27)return 1;if(N.completion.kind===27)return-1}return m(P,N)}const D=new Map;D.set(0,C),D.set(2,w),D.set(1,m);function I(P){return D.get(P)}e.getSuggestionComparator=I,r.CommandsRegistry.registerCommand("_executeCompletionItemProvider",async(P,...N)=>{const[M,R,x,O]=N;(0,p.assertType)(_.URI.isUri(M)),(0,p.assertType)(v.Position.isIPosition(R)),(0,p.assertType)(typeof x=="string"||!x),(0,p.assertType)(typeof O=="number"||!O);const{completionProvider:B}=P.get(f.ILanguageFeaturesService),W=await P.get(a.ITextModelService).createModelReference(M);try{const V={incomplete:!1,suggestions:[]},K=[],F=W.object.textEditorModel.validatePosition(R),q=await h(B,W.object.textEditorModel,F,void 0,{triggerCharacter:x??void 0,triggerKind:x?1:0});for(const ie of q.items)K.length<(O??0)&&K.push(ie.resolve(L.CancellationToken.None)),V.incomplete=V.incomplete||ie.container.incomplete,V.suggestions.push(ie.completion);try{return await Promise.all(K),V}finally{setTimeout(()=>q.disposable.dispose(),100)}}finally{W.dispose()}});function T(P,N){var M;(M=P.getContribution("editor.contrib.suggestController"))===null||M===void 0||M.triggerSuggest(new Set().add(N),void 0,!0)}e.showSimpleSuggestions=T;class A{static isAllOff(N){return N.other==="off"&&N.comments==="off"&&N.strings==="off"}static isAllOn(N){return N.other==="on"&&N.comments==="on"&&N.strings==="on"}static valueFor(N,M){switch(M){case 1:return N.comments;case 2:return N.strings;default:return N.other}}}e.QuickSuggestionsOptions=A}),define(se[139],oe([1,0,13,2,37]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickAccessRegistry=e.Extensions=e.DefaultQuickAccessFilterValue=void 0;var E;(function(p){p[p.PRESERVE=0]="PRESERVE",p[p.LAST=1]="LAST"})(E||(e.DefaultQuickAccessFilterValue=E={})),e.Extensions={Quickaccess:"workbench.contributions.quickaccess"};class S{constructor(){this.providers=[],this.defaultProvider=void 0}registerQuickAccessProvider(_){return _.prefix.length===0?this.defaultProvider=_:this.providers.push(_),this.providers.sort((v,b)=>b.prefix.length-v.prefix.length),(0,k.toDisposable)(()=>{this.providers.splice(this.providers.indexOf(_),1),this.defaultProvider===_&&(this.defaultProvider=void 0)})}getQuickAccessProviders(){return(0,L.coalesce)([this.defaultProvider,...this.providers])}getQuickAccessProvider(_){return _&&this.providers.find(b=>_.startsWith(b.prefix))||void 0||this.defaultProvider}}e.QuickAccessRegistry=S,y.Registry.add(e.Extensions.Quickaccess,new S)}),define(se[801],oe([1,0,747,37,2,34,139,70]),function(te,e,L,k,y,E,S,p){"use strict";var _;Object.defineProperty(e,"__esModule",{value:!0}),e.HelpQuickAccessProvider=void 0;let v=_=class{constructor(a,i){this.quickInputService=a,this.keybindingService=i,this.registry=k.Registry.as(S.Extensions.Quickaccess)}provide(a){const i=new y.DisposableStore;return i.add(a.onDidAccept(()=>{const[n]=a.selectedItems;n&&this.quickInputService.quickAccess.show(n.prefix,{preserveValue:!0})})),i.add(a.onDidChangeValue(n=>{const t=this.registry.getQuickAccessProvider(n.substr(_.PREFIX.length));t&&t.prefix&&t.prefix!==_.PREFIX&&this.quickInputService.quickAccess.show(t.prefix,{preserveValue:!0})})),a.items=this.getQuickAccessProviders().filter(n=>n.prefix!==_.PREFIX),i}getQuickAccessProviders(){return this.registry.getQuickAccessProviders().sort((i,n)=>i.prefix.localeCompare(n.prefix)).flatMap(i=>this.createPicks(i))}createPicks(a){return a.helpEntries.map(i=>{const n=i.prefix||a.prefix,t=n||"\u2026";return{prefix:n,label:t,keybinding:i.commandId?this.keybindingService.lookupKeybinding(i.commandId):void 0,ariaLabel:(0,L.localize)(0,null,t,i.description),description:i.description}})}};e.HelpQuickAccessProvider=v,v.PREFIX="?",e.HelpQuickAccessProvider=v=_=ke([ge(0,p.IQuickInputService),ge(1,E.IKeybindingService)],v)}),define(se[802],oe([1,0,37,139,96,801]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),L.Registry.as(k.Extensions.Quickaccess).registerQuickAccessProvider({ctor:E.HelpQuickAccessProvider,prefix:"",helpEntries:[{description:y.QuickHelpNLS.helpQuickAccessActionLabel}]})}),define(se[803],oe([1,0,14,19,6,2,8,139,70,37]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickAccessController=void 0;let b=class extends E.Disposable{constructor(i,n){super(),this.quickInputService=i,this.instantiationService=n,this.registry=v.Registry.as(p.Extensions.Quickaccess),this.mapProviderToDescriptor=new Map,this.lastAcceptedPickerValues=new Map,this.visibleQuickAccess=void 0}show(i="",n){this.doShowOrPick(i,!1,n)}doShowOrPick(i,n,t){var r;const[u,f]=this.getOrInstantiateProvider(i),c=this.visibleQuickAccess,d=c?.descriptor;if(c&&f&&d===f){i!==f.prefix&&!t?.preserveValue&&(c.picker.value=i),this.adjustValueSelection(c.picker,f,t);return}if(f&&!t?.preserveValue){let h;if(c&&d&&d!==f){const m=c.value.substr(d.prefix.length);m&&(h=`${f.prefix}${m}`)}if(!h){const m=u?.defaultFilterValue;m===p.DefaultQuickAccessFilterValue.LAST?h=this.lastAcceptedPickerValues.get(f):typeof m=="string"&&(h=`${f.prefix}${m}`)}typeof h=="string"&&(i=h)}const s=new E.DisposableStore,l=s.add(this.quickInputService.createQuickPick());l.value=i,this.adjustValueSelection(l,f,t),l.placeholder=f?.placeholder,l.quickNavigate=t?.quickNavigateConfiguration,l.hideInput=!!l.quickNavigate&&!c,(typeof t?.itemActivation=="number"||t?.quickNavigateConfiguration)&&(l.itemActivation=(r=t?.itemActivation)!==null&&r!==void 0?r:_.ItemActivation.SECOND),l.contextKey=f?.contextKey,l.filterValue=h=>h.substring(f?f.prefix.length:0);let o;n&&(o=new L.DeferredPromise,s.add(y.Event.once(l.onWillAccept)(h=>{h.veto(),l.hide()}))),s.add(this.registerPickerListeners(l,u,f,i,t?.providerOptions));const g=s.add(new k.CancellationTokenSource);if(u&&s.add(u.provide(l,g.token,t?.providerOptions)),y.Event.once(l.onDidHide)(()=>{l.selectedItems.length===0&&g.cancel(),s.dispose(),o?.complete(l.selectedItems.slice(0))}),l.show(),n)return o?.p}adjustValueSelection(i,n,t){var r;let u;t?.preserveValue?u=[i.value.length,i.value.length]:u=[(r=n?.prefix.length)!==null&&r!==void 0?r:0,i.value.length],i.valueSelection=u}registerPickerListeners(i,n,t,r,u){const f=new E.DisposableStore,c=this.visibleQuickAccess={picker:i,descriptor:t,value:r};return f.add((0,E.toDisposable)(()=>{c===this.visibleQuickAccess&&(this.visibleQuickAccess=void 0)})),f.add(i.onDidChangeValue(d=>{const[s]=this.getOrInstantiateProvider(d);s!==n?this.show(d,{preserveValue:!0,providerOptions:u}):c.value=d})),t&&f.add(i.onDidAccept(()=>{this.lastAcceptedPickerValues.set(t,i.value)})),f}getOrInstantiateProvider(i){const n=this.registry.getQuickAccessProvider(i);if(!n)return[void 0,void 0];let t=this.mapProviderToDescriptor.get(n);return t||(t=this.instantiationService.createInstance(n.ctor),this.mapProviderToDescriptor.set(n,t)),[t,n]}};e.QuickAccessController=b,e.QuickAccessController=b=ke([ge(0,_.IQuickInputService),ge(1,S.IInstantiationService)],b)}),define(se[804],oe([1,0,26,28,100,490]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SeverityIcon=void 0;var E;(function(S){function p(_){switch(_){case y.default.Ignore:return"severity-ignore "+k.ThemeIcon.asClassName(L.Codicon.info);case y.default.Info:return k.ThemeIcon.asClassName(L.Codicon.info);case y.default.Warning:return k.ThemeIcon.asClassName(L.Codicon.warning);case y.default.Error:return k.ThemeIcon.asClassName(L.Codicon.error);default:return""}}S.className=p})(E||(e.SeverityIcon=E={}))}),define(se[92],oe([1,0,6,2,20,604,8]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InMemoryStorageService=e.AbstractStorageService=e.loadKeyTargets=e.WillSaveStateReason=e.IStorageService=e.TARGET_KEY=void 0,e.TARGET_KEY="__$__targetStorageMarker",e.IStorageService=(0,S.createDecorator)("storageService");var p;(function(a){a[a.NONE=0]="NONE",a[a.SHUTDOWN=1]="SHUTDOWN"})(p||(e.WillSaveStateReason=p={}));function _(a){const i=a.get(e.TARGET_KEY);if(i)try{return JSON.parse(i)}catch{}return Object.create(null)}e.loadKeyTargets=_;class v extends k.Disposable{constructor(i={flushInterval:v.DEFAULT_FLUSH_INTERVAL}){super(),this.options=i,this._onDidChangeValue=this._register(new L.PauseableEmitter),this._onDidChangeTarget=this._register(new L.PauseableEmitter),this._onWillSaveState=this._register(new L.Emitter),this.onWillSaveState=this._onWillSaveState.event,this._workspaceKeyTargets=void 0,this._profileKeyTargets=void 0,this._applicationKeyTargets=void 0}onDidChangeValue(i,n,t){return L.Event.filter(this._onDidChangeValue.event,r=>r.scope===i&&(n===void 0||r.key===n),t)}emitDidChangeValue(i,n){const{key:t,external:r}=n;if(t===e.TARGET_KEY){switch(i){case-1:this._applicationKeyTargets=void 0;break;case 0:this._profileKeyTargets=void 0;break;case 1:this._workspaceKeyTargets=void 0;break}this._onDidChangeTarget.fire({scope:i})}else this._onDidChangeValue.fire({scope:i,key:t,target:this.getKeyTargets(i)[t],external:r})}get(i,n,t){var r;return(r=this.getStorage(n))===null||r===void 0?void 0:r.get(i,t)}getBoolean(i,n,t){var r;return(r=this.getStorage(n))===null||r===void 0?void 0:r.getBoolean(i,t)}getNumber(i,n,t){var r;return(r=this.getStorage(n))===null||r===void 0?void 0:r.getNumber(i,t)}store(i,n,t,r,u=!1){if((0,y.isUndefinedOrNull)(n)){this.remove(i,t,u);return}this.withPausedEmitters(()=>{var f;this.updateKeyTarget(i,t,r),(f=this.getStorage(t))===null||f===void 0||f.set(i,n,u)})}remove(i,n,t=!1){this.withPausedEmitters(()=>{var r;this.updateKeyTarget(i,n,void 0),(r=this.getStorage(n))===null||r===void 0||r.delete(i,t)})}withPausedEmitters(i){this._onDidChangeValue.pause(),this._onDidChangeTarget.pause();try{i()}finally{this._onDidChangeValue.resume(),this._onDidChangeTarget.resume()}}updateKeyTarget(i,n,t,r=!1){var u,f;const c=this.getKeyTargets(n);typeof t=="number"?c[i]!==t&&(c[i]=t,(u=this.getStorage(n))===null||u===void 0||u.set(e.TARGET_KEY,JSON.stringify(c),r)):typeof c[i]=="number"&&(delete c[i],(f=this.getStorage(n))===null||f===void 0||f.set(e.TARGET_KEY,JSON.stringify(c),r))}get workspaceKeyTargets(){return this._workspaceKeyTargets||(this._workspaceKeyTargets=this.loadKeyTargets(1)),this._workspaceKeyTargets}get profileKeyTargets(){return this._profileKeyTargets||(this._profileKeyTargets=this.loadKeyTargets(0)),this._profileKeyTargets}get applicationKeyTargets(){return this._applicationKeyTargets||(this._applicationKeyTargets=this.loadKeyTargets(-1)),this._applicationKeyTargets}getKeyTargets(i){switch(i){case-1:return this.applicationKeyTargets;case 0:return this.profileKeyTargets;default:return this.workspaceKeyTargets}}loadKeyTargets(i){const n=this.getStorage(i);return n?_(n):Object.create(null)}}e.AbstractStorageService=v,v.DEFAULT_FLUSH_INTERVAL=60*1e3;class b extends v{constructor(){super(),this.applicationStorage=this._register(new E.Storage(new E.InMemoryStorageDatabase,{hint:E.StorageHint.STORAGE_IN_MEMORY})),this.profileStorage=this._register(new E.Storage(new E.InMemoryStorageDatabase,{hint:E.StorageHint.STORAGE_IN_MEMORY})),this.workspaceStorage=this._register(new E.Storage(new E.InMemoryStorageDatabase,{hint:E.StorageHint.STORAGE_IN_MEMORY})),this._register(this.workspaceStorage.onDidChangeStorage(i=>this.emitDidChangeValue(1,i))),this._register(this.profileStorage.onDidChangeStorage(i=>this.emitDidChangeValue(0,i))),this._register(this.applicationStorage.onDidChangeStorage(i=>this.emitDidChangeValue(-1,i)))}getStorage(i){switch(i){case-1:return this.applicationStorage;case 0:return this.profileStorage;default:return this.workspaceStorage}}}e.InMemoryStorageService=b}),define(se[805],oe([1,0,6,53,5,343,45,8,92,44,7]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeLensCache=e.ICodeLensCache=void 0,e.ICodeLensCache=(0,p.createDecorator)("ICodeLensCache");class a{constructor(t,r){this.lineCount=t,this.data=r}}let i=class{constructor(t){this._fakeProvider=new class{provideCodeLenses(){throw new Error("not supported")}},this._cache=new k.LRUCache(20,.75);const r="codelens/cache";(0,b.runWhenWindowIdle)(v.mainWindow,()=>t.remove(r,1));const u="codelens/cache2",f=t.get(u,1,"{}");this._deserialize(f),L.Event.once(t.onWillSaveState)(c=>{c.reason===_.WillSaveStateReason.SHUTDOWN&&t.store(u,this._serialize(),1,1)})}put(t,r){const u=r.lenses.map(d=>{var s;return{range:d.symbol.range,command:d.symbol.command&&{id:"",title:(s=d.symbol.command)===null||s===void 0?void 0:s.title}}}),f=new E.CodeLensModel;f.add({lenses:u,dispose:()=>{}},this._fakeProvider);const c=new a(t.getLineCount(),f);this._cache.set(t.uri.toString(),c)}get(t){const r=this._cache.get(t.uri.toString());return r&&r.lineCount===t.getLineCount()?r.data:void 0}delete(t){this._cache.delete(t.uri.toString())}_serialize(){const t=Object.create(null);for(const[r,u]of this._cache){const f=new Set;for(const c of u.data.lenses)f.add(c.symbol.range.startLineNumber);t[r]={lineCount:u.lineCount,lines:[...f.values()]}}return JSON.stringify(t)}_deserialize(t){try{const r=JSON.parse(t);for(const u in r){const f=r[u],c=[];for(const s of f.lines)c.push({range:new y.Range(s,1,s,11)});const d=new E.CodeLensModel;d.add({lenses:c,dispose(){}},this._fakeProvider),this._cache.set(u,new a(f.lineCount,d))}}catch{}}};e.CodeLensCache=i,e.CodeLensCache=i=ke([ge(0,_.IStorageService)],i),(0,S.registerSingleton)(e.ICodeLensCache,i,1)}),define(se[358],oe([1,0,14,2,53,199,31,27,45,8,92]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";var a;Object.defineProperty(e,"__esModule",{value:!0}),e.ISuggestMemoryService=e.SuggestMemoryService=e.PrefixMemory=e.LRUMemory=e.NoMemory=e.Memory=void 0;class i{constructor(c){this.name=c}select(c,d,s){if(s.length===0)return 0;const l=s[0].score[0];for(let o=0;o<s.length;o++){const{score:g,completion:h}=s[o];if(g[0]!==l)break;if(h.preselect)return o}return 0}}e.Memory=i;class n extends i{constructor(){super("first")}memorize(c,d,s){}toJSON(){}fromJSON(){}}e.NoMemory=n;class t extends i{constructor(){super("recentlyUsed"),this._cache=new y.LRUCache(300,.66),this._seq=0}memorize(c,d,s){const l=`${c.getLanguageId()}/${s.textLabel}`;this._cache.set(l,{touch:this._seq++,type:s.completion.kind,insertText:s.completion.insertText})}select(c,d,s){if(s.length===0)return 0;const l=c.getLineContent(d.lineNumber).substr(d.column-10,d.column-1);if(/\s$/.test(l))return super.select(c,d,s);const o=s[0].score[0];let g=-1,h=-1,m=-1;for(let C=0;C<s.length&&s[C].score[0]===o;C++){const w=`${c.getLanguageId()}/${s[C].textLabel}`,D=this._cache.peek(w);if(D&&D.touch>m&&D.type===s[C].completion.kind&&D.insertText===s[C].completion.insertText&&(m=D.touch,h=C),s[C].completion.preselect&&g===-1)return g=C}return h!==-1?h:g!==-1?g:0}toJSON(){return this._cache.toJSON()}fromJSON(c){this._cache.clear();const d=0;for(const[s,l]of c)l.touch=d,l.type=typeof l.type=="number"?l.type:S.CompletionItemKinds.fromString(l.type),this._cache.set(s,l);this._seq=this._cache.size}}e.LRUMemory=t;class r extends i{constructor(){super("recentlyUsedByPrefix"),this._trie=E.TernarySearchTree.forStrings(),this._seq=0}memorize(c,d,s){const{word:l}=c.getWordUntilPosition(d),o=`${c.getLanguageId()}/${l}`;this._trie.set(o,{type:s.completion.kind,insertText:s.completion.insertText,touch:this._seq++})}select(c,d,s){const{word:l}=c.getWordUntilPosition(d);if(!l)return super.select(c,d,s);const o=`${c.getLanguageId()}/${l}`;let g=this._trie.get(o);if(g||(g=this._trie.findSubstr(o)),g)for(let h=0;h<s.length;h++){const{kind:m,insertText:C}=s[h].completion;if(m===g.type&&C===g.insertText)return h}return super.select(c,d,s)}toJSON(){const c=[];return this._trie.forEach((d,s)=>c.push([s,d])),c.sort((d,s)=>-(d[1].touch-s[1].touch)).forEach((d,s)=>d[1].touch=s),c.slice(0,200)}fromJSON(c){if(this._trie.clear(),c.length>0){this._seq=c[0][1].touch+1;for(const[d,s]of c)s.type=typeof s.type=="number"?s.type:S.CompletionItemKinds.fromString(s.type),this._trie.set(d,s)}}}e.PrefixMemory=r;let u=a=class{constructor(c,d){this._storageService=c,this._configService=d,this._disposables=new k.DisposableStore,this._persistSoon=new L.RunOnceScheduler(()=>this._saveState(),500),this._disposables.add(c.onWillSaveState(s=>{s.reason===b.WillSaveStateReason.SHUTDOWN&&this._saveState()}))}dispose(){this._disposables.dispose(),this._persistSoon.dispose()}memorize(c,d,s){this._withStrategy(c,d).memorize(c,d,s),this._persistSoon.schedule()}select(c,d,s){return this._withStrategy(c,d).select(c,d,s)}_withStrategy(c,d){var s;const l=this._configService.getValue("editor.suggestSelection",{overrideIdentifier:c.getLanguageIdAtPosition(d.lineNumber,d.column),resource:c.uri});if(((s=this._strategy)===null||s===void 0?void 0:s.name)!==l){this._saveState();const o=a._strategyCtors.get(l)||n;this._strategy=new o;try{const h=this._configService.getValue("editor.suggest.shareSuggestSelections")?0:1,m=this._storageService.get(`${a._storagePrefix}/${l}`,h);m&&this._strategy.fromJSON(JSON.parse(m))}catch{}}return this._strategy}_saveState(){if(this._strategy){const d=this._configService.getValue("editor.suggest.shareSuggestSelections")?0:1,s=JSON.stringify(this._strategy);this._storageService.store(`${a._storagePrefix}/${this._strategy.name}`,s,d,1)}}};e.SuggestMemoryService=u,u._strategyCtors=new Map([["recentlyUsedByPrefix",r],["recentlyUsed",t],["first",n]]),u._storagePrefix="suggest/memories",e.SuggestMemoryService=u=a=ke([ge(0,b.IStorageService),ge(1,p.IConfigurationService)],u),e.ISuggestMemoryService=(0,v.createDecorator)("ISuggestMemories"),(0,_.registerSingleton)(e.ISuggestMemoryService,u,1)}),define(se[806],oe([1,0,14,6,2,30,25,15,42,92,13,735]),function(te,e,L,k,y,E,S,p,_,v,b,a){"use strict";var i,n;Object.defineProperty(e,"__esModule",{value:!0}),e.MenuService=void 0;let t=class{constructor(s,l){this._commandService=s,this._hiddenStates=new r(l)}createMenu(s,l,o){return new f(s,this._hiddenStates,{emitEventsForSubmenuChanges:!1,eventDebounceDelay:50,...o},this._commandService,l)}resetHiddenStates(s){this._hiddenStates.reset(s)}};e.MenuService=t,e.MenuService=t=ke([ge(0,S.ICommandService),ge(1,v.IStorageService)],t);let r=i=class{constructor(s){this._storageService=s,this._disposables=new y.DisposableStore,this._onDidChange=new k.Emitter,this.onDidChange=this._onDidChange.event,this._ignoreChangeEvent=!1,this._hiddenByDefaultCache=new Map;try{const l=s.get(i._key,0,"{}");this._data=JSON.parse(l)}catch{this._data=Object.create(null)}this._disposables.add(s.onDidChangeValue(0,i._key,this._disposables)(()=>{if(!this._ignoreChangeEvent)try{const l=s.get(i._key,0,"{}");this._data=JSON.parse(l)}catch(l){console.log("FAILED to read storage after UPDATE",l)}this._onDidChange.fire()}))}dispose(){this._onDidChange.dispose(),this._disposables.dispose()}_isHiddenByDefault(s,l){var o;return(o=this._hiddenByDefaultCache.get(`${s.id}/${l}`))!==null&&o!==void 0?o:!1}setDefaultState(s,l,o){this._hiddenByDefaultCache.set(`${s.id}/${l}`,o)}isHidden(s,l){var o,g;const h=this._isHiddenByDefault(s,l),m=(g=(o=this._data[s.id])===null||o===void 0?void 0:o.includes(l))!==null&&g!==void 0?g:!1;return h?!m:m}updateHidden(s,l,o){this._isHiddenByDefault(s,l)&&(o=!o);const h=this._data[s.id];if(o)h?h.indexOf(l)<0&&h.push(l):this._data[s.id]=[l];else if(h){const m=h.indexOf(l);m>=0&&(0,b.removeFastWithoutKeepingOrder)(h,m),h.length===0&&delete this._data[s.id]}this._persist()}reset(s){if(s===void 0)this._data=Object.create(null),this._persist();else{for(const{id:l}of s)this._data[l]&&delete this._data[l];this._persist()}}_persist(){try{this._ignoreChangeEvent=!0;const s=JSON.stringify(this._data);this._storageService.store(i._key,s,0,0)}finally{this._ignoreChangeEvent=!1}}};r._key="menu.hiddenCommands",r=i=ke([ge(0,v.IStorageService)],r);let u=n=class{constructor(s,l,o,g,h){this._id=s,this._hiddenStates=l,this._collectContextKeysForSubmenus=o,this._commandService=g,this._contextKeyService=h,this._menuGroups=[],this._structureContextKeys=new Set,this._preconditionContextKeys=new Set,this._toggledContextKeys=new Set,this.refresh()}get structureContextKeys(){return this._structureContextKeys}get preconditionContextKeys(){return this._preconditionContextKeys}get toggledContextKeys(){return this._toggledContextKeys}refresh(){this._menuGroups.length=0,this._structureContextKeys.clear(),this._preconditionContextKeys.clear(),this._toggledContextKeys.clear();const s=E.MenuRegistry.getMenuItems(this._id);let l;s.sort(n._compareMenuItems);for(const o of s){const g=o.group||"";(!l||l[0]!==g)&&(l=[g,[]],this._menuGroups.push(l)),l[1].push(o),this._collectContextKeys(o)}}_collectContextKeys(s){if(n._fillInKbExprKeys(s.when,this._structureContextKeys),(0,E.isIMenuItem)(s)){if(s.command.precondition&&n._fillInKbExprKeys(s.command.precondition,this._preconditionContextKeys),s.command.toggled){const l=s.command.toggled.condition||s.command.toggled;n._fillInKbExprKeys(l,this._toggledContextKeys)}}else this._collectContextKeysForSubmenus&&E.MenuRegistry.getMenuItems(s.submenu).forEach(this._collectContextKeys,this)}createActionGroups(s){const l=[];for(const o of this._menuGroups){const[g,h]=o,m=[];for(const C of h)if(this._contextKeyService.contextMatchesRules(C.when)){const w=(0,E.isIMenuItem)(C);w&&this._hiddenStates.setDefaultState(this._id,C.command.id,!!C.isHiddenByDefault);const D=c(this._id,w?C.command:C,this._hiddenStates);if(w)m.push(new E.MenuItemAction(C.command,C.alt,s,D,this._contextKeyService,this._commandService));else{const I=new n(C.submenu,this._hiddenStates,this._collectContextKeysForSubmenus,this._commandService,this._contextKeyService).createActionGroups(s),T=_.Separator.join(...I.map(A=>A[1]));T.length>0&&m.push(new E.SubmenuItemAction(C,D,T))}}m.length>0&&l.push([g,m])}return l}static _fillInKbExprKeys(s,l){if(s)for(const o of s.keys())l.add(o)}static _compareMenuItems(s,l){const o=s.group,g=l.group;if(o!==g){if(o){if(!g)return-1}else return 1;if(o==="navigation")return-1;if(g==="navigation")return 1;const C=o.localeCompare(g);if(C!==0)return C}const h=s.order||0,m=l.order||0;return h<m?-1:h>m?1:n._compareTitles((0,E.isIMenuItem)(s)?s.command.title:s.title,(0,E.isIMenuItem)(l)?l.command.title:l.title)}static _compareTitles(s,l){const o=typeof s=="string"?s:s.original,g=typeof l=="string"?l:l.original;return o.localeCompare(g)}};u=n=ke([ge(3,S.ICommandService),ge(4,p.IContextKeyService)],u);let f=class{constructor(s,l,o,g,h){this._disposables=new y.DisposableStore,this._menuInfo=new u(s,l,o.emitEventsForSubmenuChanges,g,h);const m=new L.RunOnceScheduler(()=>{this._menuInfo.refresh(),this._onDidChange.fire({menu:this,isStructuralChange:!0,isEnablementChange:!0,isToggleChange:!0})},o.eventDebounceDelay);this._disposables.add(m),this._disposables.add(E.MenuRegistry.onDidChangeMenu(I=>{I.has(s)&&m.schedule()}));const C=this._disposables.add(new y.DisposableStore),w=I=>{let T=!1,A=!1,P=!1;for(const N of I)if(T=T||N.isStructuralChange,A=A||N.isEnablementChange,P=P||N.isToggleChange,T&&A&&P)break;return{menu:this,isStructuralChange:T,isEnablementChange:A,isToggleChange:P}},D=()=>{C.add(h.onDidChangeContext(I=>{const T=I.affectsSome(this._menuInfo.structureContextKeys),A=I.affectsSome(this._menuInfo.preconditionContextKeys),P=I.affectsSome(this._menuInfo.toggledContextKeys);(T||A||P)&&this._onDidChange.fire({menu:this,isStructuralChange:T,isEnablementChange:A,isToggleChange:P})})),C.add(l.onDidChange(I=>{this._onDidChange.fire({menu:this,isStructuralChange:!0,isEnablementChange:!1,isToggleChange:!1})}))};this._onDidChange=new k.DebounceEmitter({onWillAddFirstListener:D,onDidRemoveLastListener:C.clear.bind(C),delay:o.eventDebounceDelay,merge:w}),this.onDidChange=this._onDidChange.event}getActions(s){return this._menuInfo.createActionGroups(s)}dispose(){this._disposables.dispose(),this._onDidChange.dispose()}};f=ke([ge(3,S.ICommandService),ge(4,p.IContextKeyService)],f);function c(d,s,l){const o=(0,E.isISubmenuItem)(s)?s.submenu.id:s.id,g=typeof s.title=="string"?s.title:s.title.value,h=(0,_.toAction)({id:`hide/${d.id}/${o}`,label:(0,a.localize)(0,null,g),run(){l.updateHidden(d,o,!0)}}),m=(0,_.toAction)({id:`toggle/${d.id}/${o}`,label:g,get checked(){return!l.isHidden(d,o)},run(){l.updateHidden(d,o,!!this.checked)}});return{hide:h,toggle:m,get isHidden(){return!m.checked}}}}),define(se[81],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITelemetryService=void 0,e.ITelemetryService=(0,L.createDecorator)("telemetryService")}),define(se[16],oe([1,0,620,22,33,10,51,68,30,25,15,8,124,37,81,20,64,7]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectAllCommand=e.RedoCommand=e.UndoCommand=e.EditorExtensionsRegistry=e.registerEditorContribution=e.registerInstantiatedEditorAction=e.registerMultiEditorAction=e.registerEditorAction=e.registerEditorCommand=e.registerModelAndPositionCommand=e.EditorAction2=e.MultiEditorAction=e.EditorAction=e.EditorCommand=e.ProxyCommand=e.MultiCommand=e.Command=void 0;class c{constructor(x){this.id=x.id,this.precondition=x.precondition,this._kbOpts=x.kbOpts,this._menuOpts=x.menuOpts,this.metadata=x.metadata}register(){if(Array.isArray(this._menuOpts)?this._menuOpts.forEach(this._registerMenuItem,this):this._menuOpts&&this._registerMenuItem(this._menuOpts),this._kbOpts){const x=Array.isArray(this._kbOpts)?this._kbOpts:[this._kbOpts];for(const O of x){let B=O.kbExpr;this.precondition&&(B?B=b.ContextKeyExpr.and(B,this.precondition):B=this.precondition);const W={id:this.id,weight:O.weight,args:O.args,when:B,primary:O.primary,secondary:O.secondary,win:O.win,linux:O.linux,mac:O.mac};i.KeybindingsRegistry.registerKeybindingRule(W)}}v.CommandsRegistry.registerCommand({id:this.id,handler:(x,O)=>this.runCommand(x,O),metadata:this.metadata})}_registerMenuItem(x){_.MenuRegistry.appendMenuItem(x.menuId,{group:x.group,command:{id:this.id,title:x.title,icon:x.icon,precondition:this.precondition},when:x.when,order:x.order})}}e.Command=c;class d extends c{constructor(){super(...arguments),this._implementations=[]}addImplementation(x,O,B,W){return this._implementations.push({priority:x,name:O,implementation:B,when:W}),this._implementations.sort((V,K)=>K.priority-V.priority),{dispose:()=>{for(let V=0;V<this._implementations.length;V++)if(this._implementations[V].implementation===B){this._implementations.splice(V,1);return}}}}runCommand(x,O){const B=x.get(u.ILogService),W=x.get(b.IContextKeyService);B.trace(`Executing Command '${this.id}' which has ${this._implementations.length} bound.`);for(const V of this._implementations){if(V.when){const F=W.getContext((0,f.getActiveElement)());if(!V.when.evaluate(F))continue}const K=V.implementation(x,O);if(K)return B.trace(`Command '${this.id}' was handled by '${V.name}'.`),typeof K=="boolean"?void 0:K}B.trace(`The Command '${this.id}' was not handled by any implementation.`)}}e.MultiCommand=d;class s extends c{constructor(x,O){super(O),this.command=x}runCommand(x,O){return this.command.runCommand(x,O)}}e.ProxyCommand=s;class l extends c{static bindToContribution(x){return class extends l{constructor(B){super(B),this._callback=B.handler}runEditorCommand(B,W,V){const K=x(W);K&&this._callback(K,V)}}}static runEditorCommand(x,O,B,W){const V=x.get(y.ICodeEditorService),K=V.getFocusedCodeEditor()||V.getActiveCodeEditor();if(K)return K.invokeWithinContext(F=>{if(F.get(b.IContextKeyService).contextMatchesRules(B??void 0))return W(F,K,O)})}runCommand(x,O){return l.runEditorCommand(x,O,this.precondition,(B,W,V)=>this.runEditorCommand(B,W,V))}}e.EditorCommand=l;class o extends l{static convertOptions(x){let O;Array.isArray(x.menuOpts)?O=x.menuOpts:x.menuOpts?O=[x.menuOpts]:O=[];function B(W){return W.menuId||(W.menuId=_.MenuId.EditorContext),W.title||(W.title=x.label),W.when=b.ContextKeyExpr.and(x.precondition,W.when),W}return Array.isArray(x.contextMenuOpts)?O.push(...x.contextMenuOpts.map(B)):x.contextMenuOpts&&O.push(B(x.contextMenuOpts)),x.menuOpts=O,x}constructor(x){super(o.convertOptions(x)),this.label=x.label,this.alias=x.alias}runEditorCommand(x,O,B){return this.reportTelemetry(x,O),this.run(x,O,B||{})}reportTelemetry(x,O){x.get(t.ITelemetryService).publicLog2("editorActionInvoked",{name:this.label,id:this.id})}}e.EditorAction=o;class g extends o{constructor(){super(...arguments),this._implementations=[]}addImplementation(x,O){return this._implementations.push([x,O]),this._implementations.sort((B,W)=>W[0]-B[0]),{dispose:()=>{for(let B=0;B<this._implementations.length;B++)if(this._implementations[B][1]===O){this._implementations.splice(B,1);return}}}}run(x,O,B){for(const W of this._implementations){const V=W[1](x,O,B);if(V)return typeof V=="boolean"?void 0:V}}}e.MultiEditorAction=g;class h extends _.Action2{run(x,...O){const B=x.get(y.ICodeEditorService),W=B.getFocusedCodeEditor()||B.getActiveCodeEditor();if(W)return W.invokeWithinContext(V=>{var K,F;const q=V.get(b.IContextKeyService),ie=V.get(u.ILogService);if(!q.contextMatchesRules((K=this.desc.precondition)!==null&&K!==void 0?K:void 0)){ie.debug("[EditorAction2] NOT running command because its precondition is FALSE",this.desc.id,(F=this.desc.precondition)===null||F===void 0?void 0:F.serialize());return}return this.runEditorCommand(V,W,...O)})}}e.EditorAction2=h;function m(R,x){v.CommandsRegistry.registerCommand(R,function(O,...B){const W=O.get(a.IInstantiationService),[V,K]=B;(0,r.assertType)(k.URI.isUri(V)),(0,r.assertType)(E.Position.isIPosition(K));const F=O.get(S.IModelService).getModel(V);if(F){const q=E.Position.lift(K);return W.invokeFunction(x,F,q,...B.slice(2))}return O.get(p.ITextModelService).createModelReference(V).then(q=>new Promise((ie,ae)=>{try{const ne=W.invokeFunction(x,q.object.textEditorModel,E.Position.lift(K),B.slice(2));ie(ne)}catch(ne){ae(ne)}}).finally(()=>{q.dispose()}))})}e.registerModelAndPositionCommand=m;function C(R){return N.INSTANCE.registerEditorCommand(R),R}e.registerEditorCommand=C;function w(R){const x=new R;return N.INSTANCE.registerEditorAction(x),x}e.registerEditorAction=w;function D(R){return N.INSTANCE.registerEditorAction(R),R}e.registerMultiEditorAction=D;function I(R){N.INSTANCE.registerEditorAction(R)}e.registerInstantiatedEditorAction=I;function T(R,x,O){N.INSTANCE.registerEditorContribution(R,x,O)}e.registerEditorContribution=T;var A;(function(R){function x(K){return N.INSTANCE.getEditorCommand(K)}R.getEditorCommand=x;function O(){return N.INSTANCE.getEditorActions()}R.getEditorActions=O;function B(){return N.INSTANCE.getEditorContributions()}R.getEditorContributions=B;function W(K){return N.INSTANCE.getEditorContributions().filter(F=>K.indexOf(F.id)>=0)}R.getSomeEditorContributions=W;function V(){return N.INSTANCE.getDiffEditorContributions()}R.getDiffEditorContributions=V})(A||(e.EditorExtensionsRegistry=A={}));const P={EditorCommonContributions:"editor.contributions"};class N{constructor(){this.editorContributions=[],this.diffEditorContributions=[],this.editorActions=[],this.editorCommands=Object.create(null)}registerEditorContribution(x,O,B){this.editorContributions.push({id:x,ctor:O,instantiation:B})}getEditorContributions(){return this.editorContributions.slice(0)}getDiffEditorContributions(){return this.diffEditorContributions.slice(0)}registerEditorAction(x){x.register(),this.editorActions.push(x)}getEditorActions(){return this.editorActions}registerEditorCommand(x){x.register(),this.editorCommands[x.id]=x}getEditorCommand(x){return this.editorCommands[x]||null}}N.INSTANCE=new N,n.Registry.add(P.EditorCommonContributions,N.INSTANCE);function M(R){return R.register(),R}e.UndoCommand=M(new d({id:"undo",precondition:void 0,kbOpts:{weight:0,primary:2104},menuOpts:[{menuId:_.MenuId.MenubarEditMenu,group:"1_do",title:L.localize(0,null),order:1},{menuId:_.MenuId.CommandPalette,group:"",title:L.localize(1,null),order:1}]})),M(new s(e.UndoCommand,{id:"default:undo",precondition:void 0})),e.RedoCommand=M(new d({id:"redo",precondition:void 0,kbOpts:{weight:0,primary:2103,secondary:[3128],mac:{primary:3128}},menuOpts:[{menuId:_.MenuId.MenubarEditMenu,group:"1_do",title:L.localize(2,null),order:2},{menuId:_.MenuId.CommandPalette,group:"",title:L.localize(3,null),order:1}]})),M(new s(e.RedoCommand,{id:"default:redo",precondition:void 0})),e.SelectAllCommand=M(new d({id:"editor.action.selectAll",precondition:void 0,kbOpts:{weight:0,kbExpr:null,primary:2079},menuOpts:[{menuId:_.MenuId.MenubarSelectionMenu,group:"1_basic",title:L.localize(4,null),order:1},{menuId:_.MenuId.CommandPalette,group:"",title:L.localize(5,null),order:1}]}))}),define(se[191],oe([1,0,619,54,20,48,16,33,511,75,207,208,251,10,5,21,15,124,7]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CoreEditingCommands=e.CoreNavigationCommands=e.RevealLine_=e.EditorScroll_=e.CoreEditorCommand=void 0;const d=0;class s extends S.EditorCommand{runEditorCommand(P,N,M){const R=N._getViewModel();R&&this.runCoreEditorCommand(R,M||{})}}e.CoreEditorCommand=s;var l;(function(A){const P=function(M){if(!y.isObject(M))return!1;const R=M;return!(!y.isString(R.to)||!y.isUndefined(R.by)&&!y.isString(R.by)||!y.isUndefined(R.value)&&!y.isNumber(R.value)||!y.isUndefined(R.revealCursor)&&!y.isBoolean(R.revealCursor))};A.metadata={description:"Scroll editor in the given direction",args:[{name:"Editor scroll argument object",description:"Property-value pairs that can be passed through this argument:\n					* 'to': A mandatory direction value.\n						```\n						'up', 'down'\n						```\n					* 'by': Unit to move. Default is computed based on 'to' value.\n						```\n						'line', 'wrappedLine', 'page', 'halfPage', 'editor'\n						```\n					* 'value': Number of units to move. Default is '1'.\n					* 'revealCursor': If 'true' reveals the cursor if it is outside view port.\n				",constraint:P,schema:{type:"object",required:["to"],properties:{to:{type:"string",enum:["up","down"]},by:{type:"string",enum:["line","wrappedLine","page","halfPage","editor"]},value:{type:"number",default:1},revealCursor:{type:"boolean"}}}}]},A.RawDirection={Up:"up",Right:"right",Down:"down",Left:"left"},A.RawUnit={Line:"line",WrappedLine:"wrappedLine",Page:"page",HalfPage:"halfPage",Editor:"editor",Column:"column"};function N(M){let R;switch(M.to){case A.RawDirection.Up:R=1;break;case A.RawDirection.Right:R=2;break;case A.RawDirection.Down:R=3;break;case A.RawDirection.Left:R=4;break;default:return null}let x;switch(M.by){case A.RawUnit.Line:x=1;break;case A.RawUnit.WrappedLine:x=2;break;case A.RawUnit.Page:x=3;break;case A.RawUnit.HalfPage:x=4;break;case A.RawUnit.Editor:x=5;break;case A.RawUnit.Column:x=6;break;default:x=2}const O=Math.floor(M.value||1),B=!!M.revealCursor;return{direction:R,unit:x,value:O,revealCursor:B,select:!!M.select}}A.parse=N})(l||(e.EditorScroll_=l={}));var o;(function(A){const P=function(N){if(!y.isObject(N))return!1;const M=N;return!(!y.isNumber(M.lineNumber)&&!y.isString(M.lineNumber)||!y.isUndefined(M.at)&&!y.isString(M.at))};A.metadata={description:"Reveal the given line at the given logical position",args:[{name:"Reveal line argument object",description:"Property-value pairs that can be passed through this argument:\n					* 'lineNumber': A mandatory line number value.\n					* 'at': Logical position at which line has to be revealed.\n						```\n						'top', 'center', 'bottom'\n						```\n				",constraint:P,schema:{type:"object",required:["lineNumber"],properties:{lineNumber:{type:["number","string"]},at:{type:"string",enum:["top","center","bottom"]}}}}]},A.RawAtArgument={Top:"top",Center:"center",Bottom:"bottom"}})(o||(e.RevealLine_=o={}));class g{constructor(P){P.addImplementation(1e4,"code-editor",(N,M)=>{const R=N.get(p.ICodeEditorService).getFocusedCodeEditor();return R&&R.hasTextFocus()?this._runEditorCommand(N,R,M):!1}),P.addImplementation(1e3,"generic-dom-input-textarea",(N,M)=>{const R=(0,c.getActiveElement)();return R&&["input","textarea"].indexOf(R.tagName.toLowerCase())>=0?(this.runDOMCommand(R),!0):!1}),P.addImplementation(0,"generic-dom",(N,M)=>{const R=N.get(p.ICodeEditorService).getActiveCodeEditor();return R?(R.focus(),this._runEditorCommand(N,R,M)):!1})}_runEditorCommand(P,N,M){const R=this.runEditorCommand(P,N,M);return R||!0}}var h;(function(A){class P extends s{constructor(Q){super(Q),this._inSelectionMode=Q.inSelectionMode}runCoreEditorCommand(Q,re){if(!re.position)return;Q.model.pushStackElement(),Q.setCursorStates(re.source,3,[a.CursorMoveCommands.moveTo(Q,Q.getPrimaryCursorState(),this._inSelectionMode,re.position,re.viewPosition)])&&re.revealType!==2&&Q.revealPrimaryCursor(re.source,!0,!0)}}A.MoveTo=(0,S.registerEditorCommand)(new P({id:"_moveTo",inSelectionMode:!1,precondition:void 0})),A.MoveToSelect=(0,S.registerEditorCommand)(new P({id:"_moveToSelect",inSelectionMode:!0,precondition:void 0}));class N extends s{runCoreEditorCommand(Q,re){Q.model.pushStackElement();const de=this._getColumnSelectResult(Q,Q.getPrimaryCursorState(),Q.getCursorColumnSelectData(),re);de!==null&&(Q.setCursorStates(re.source,3,de.viewStates.map(he=>v.CursorState.fromViewState(he))),Q.setCursorColumnSelectData({isReal:!0,fromViewLineNumber:de.fromLineNumber,fromViewVisualColumn:de.fromVisualColumn,toViewLineNumber:de.toLineNumber,toViewVisualColumn:de.toVisualColumn}),de.reversed?Q.revealTopMostCursor(re.source):Q.revealBottomMostCursor(re.source))}}A.ColumnSelect=(0,S.registerEditorCommand)(new class extends N{constructor(){super({id:"columnSelect",precondition:void 0})}_getColumnSelectResult(J,Q,re,de){if(typeof de.position>"u"||typeof de.viewPosition>"u"||typeof de.mouseColumn>"u")return null;const he=J.model.validatePosition(de.position),me=J.coordinatesConverter.validateViewPosition(new n.Position(de.viewPosition.lineNumber,de.viewPosition.column),he),X=de.doColumnSelect?re.fromViewLineNumber:me.lineNumber,U=de.doColumnSelect?re.fromViewVisualColumn:de.mouseColumn-1;return _.ColumnSelection.columnSelect(J.cursorConfig,J,X,U,me.lineNumber,de.mouseColumn-1)}}),A.CursorColumnSelectLeft=(0,S.registerEditorCommand)(new class extends N{constructor(){super({id:"cursorColumnSelectLeft",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:3599,linux:{primary:0}}})}_getColumnSelectResult(J,Q,re,de){return _.ColumnSelection.columnSelectLeft(J.cursorConfig,J,re)}}),A.CursorColumnSelectRight=(0,S.registerEditorCommand)(new class extends N{constructor(){super({id:"cursorColumnSelectRight",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:3601,linux:{primary:0}}})}_getColumnSelectResult(J,Q,re,de){return _.ColumnSelection.columnSelectRight(J.cursorConfig,J,re)}});class M extends N{constructor(Q){super(Q),this._isPaged=Q.isPaged}_getColumnSelectResult(Q,re,de,he){return _.ColumnSelection.columnSelectUp(Q.cursorConfig,Q,de,this._isPaged)}}A.CursorColumnSelectUp=(0,S.registerEditorCommand)(new M({isPaged:!1,id:"cursorColumnSelectUp",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:3600,linux:{primary:0}}})),A.CursorColumnSelectPageUp=(0,S.registerEditorCommand)(new M({isPaged:!0,id:"cursorColumnSelectPageUp",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:3595,linux:{primary:0}}}));class R extends N{constructor(Q){super(Q),this._isPaged=Q.isPaged}_getColumnSelectResult(Q,re,de,he){return _.ColumnSelection.columnSelectDown(Q.cursorConfig,Q,de,this._isPaged)}}A.CursorColumnSelectDown=(0,S.registerEditorCommand)(new R({isPaged:!1,id:"cursorColumnSelectDown",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:3602,linux:{primary:0}}})),A.CursorColumnSelectPageDown=(0,S.registerEditorCommand)(new R({isPaged:!0,id:"cursorColumnSelectPageDown",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:3596,linux:{primary:0}}}));class x extends s{constructor(){super({id:"cursorMove",precondition:void 0,metadata:a.CursorMove.metadata})}runCoreEditorCommand(Q,re){const de=a.CursorMove.parse(re);de&&this._runCursorMove(Q,re.source,de)}_runCursorMove(Q,re,de){Q.model.pushStackElement(),Q.setCursorStates(re,3,x._move(Q,Q.getCursorStates(),de)),Q.revealPrimaryCursor(re,!0)}static _move(Q,re,de){const he=de.select,me=de.value;switch(de.direction){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:return a.CursorMoveCommands.simpleMove(Q,re,de.direction,he,me,de.unit);case 11:case 13:case 12:case 14:return a.CursorMoveCommands.viewportMove(Q,re,de.direction,he,me);default:return null}}}A.CursorMoveImpl=x,A.CursorMove=(0,S.registerEditorCommand)(new x);class O extends s{constructor(Q){super(Q),this._staticArgs=Q.args}runCoreEditorCommand(Q,re){let de=this._staticArgs;this._staticArgs.value===-1&&(de={direction:this._staticArgs.direction,unit:this._staticArgs.unit,select:this._staticArgs.select,value:re.pageSize||Q.cursorConfig.pageSize}),Q.model.pushStackElement(),Q.setCursorStates(re.source,3,a.CursorMoveCommands.simpleMove(Q,Q.getCursorStates(),de.direction,de.select,de.value,de.unit)),Q.revealPrimaryCursor(re.source,!0)}}A.CursorLeft=(0,S.registerEditorCommand)(new O({args:{direction:0,unit:0,select:!1,value:1},id:"cursorLeft",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:15,mac:{primary:15,secondary:[288]}}})),A.CursorLeftSelect=(0,S.registerEditorCommand)(new O({args:{direction:0,unit:0,select:!0,value:1},id:"cursorLeftSelect",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:1039}})),A.CursorRight=(0,S.registerEditorCommand)(new O({args:{direction:1,unit:0,select:!1,value:1},id:"cursorRight",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:17,mac:{primary:17,secondary:[292]}}})),A.CursorRightSelect=(0,S.registerEditorCommand)(new O({args:{direction:1,unit:0,select:!0,value:1},id:"cursorRightSelect",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:1041}})),A.CursorUp=(0,S.registerEditorCommand)(new O({args:{direction:2,unit:2,select:!1,value:1},id:"cursorUp",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:16,mac:{primary:16,secondary:[302]}}})),A.CursorUpSelect=(0,S.registerEditorCommand)(new O({args:{direction:2,unit:2,select:!0,value:1},id:"cursorUpSelect",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:1040,secondary:[3088],mac:{primary:1040},linux:{primary:1040}}})),A.CursorPageUp=(0,S.registerEditorCommand)(new O({args:{direction:2,unit:2,select:!1,value:-1},id:"cursorPageUp",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:11}})),A.CursorPageUpSelect=(0,S.registerEditorCommand)(new O({args:{direction:2,unit:2,select:!0,value:-1},id:"cursorPageUpSelect",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:1035}})),A.CursorDown=(0,S.registerEditorCommand)(new O({args:{direction:3,unit:2,select:!1,value:1},id:"cursorDown",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:18,mac:{primary:18,secondary:[300]}}})),A.CursorDownSelect=(0,S.registerEditorCommand)(new O({args:{direction:3,unit:2,select:!0,value:1},id:"cursorDownSelect",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:1042,secondary:[3090],mac:{primary:1042},linux:{primary:1042}}})),A.CursorPageDown=(0,S.registerEditorCommand)(new O({args:{direction:3,unit:2,select:!1,value:-1},id:"cursorPageDown",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:12}})),A.CursorPageDownSelect=(0,S.registerEditorCommand)(new O({args:{direction:3,unit:2,select:!0,value:-1},id:"cursorPageDownSelect",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:1036}})),A.CreateCursor=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"createCursor",precondition:void 0})}runCoreEditorCommand(J,Q){if(!Q.position)return;let re;Q.wholeLine?re=a.CursorMoveCommands.line(J,J.getPrimaryCursorState(),!1,Q.position,Q.viewPosition):re=a.CursorMoveCommands.moveTo(J,J.getPrimaryCursorState(),!1,Q.position,Q.viewPosition);const de=J.getCursorStates();if(de.length>1){const he=re.modelState?re.modelState.position:null,me=re.viewState?re.viewState.position:null;for(let X=0,U=de.length;X<U;X++){const G=de[X];if(!(he&&!G.modelState.selection.containsPosition(he))&&!(me&&!G.viewState.selection.containsPosition(me))){de.splice(X,1),J.model.pushStackElement(),J.setCursorStates(Q.source,3,de);return}}}de.push(re),J.model.pushStackElement(),J.setCursorStates(Q.source,3,de)}}),A.LastCursorMoveToSelect=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"_lastCursorMoveToSelect",precondition:void 0})}runCoreEditorCommand(J,Q){if(!Q.position)return;const re=J.getLastAddedCursorIndex(),de=J.getCursorStates(),he=de.slice(0);he[re]=a.CursorMoveCommands.moveTo(J,de[re],!0,Q.position,Q.viewPosition),J.model.pushStackElement(),J.setCursorStates(Q.source,3,he)}});class B extends s{constructor(Q){super(Q),this._inSelectionMode=Q.inSelectionMode}runCoreEditorCommand(Q,re){Q.model.pushStackElement(),Q.setCursorStates(re.source,3,a.CursorMoveCommands.moveToBeginningOfLine(Q,Q.getCursorStates(),this._inSelectionMode)),Q.revealPrimaryCursor(re.source,!0)}}A.CursorHome=(0,S.registerEditorCommand)(new B({inSelectionMode:!1,id:"cursorHome",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:14,mac:{primary:14,secondary:[2063]}}})),A.CursorHomeSelect=(0,S.registerEditorCommand)(new B({inSelectionMode:!0,id:"cursorHomeSelect",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:1038,mac:{primary:1038,secondary:[3087]}}}));class W extends s{constructor(Q){super(Q),this._inSelectionMode=Q.inSelectionMode}runCoreEditorCommand(Q,re){Q.model.pushStackElement(),Q.setCursorStates(re.source,3,this._exec(Q.getCursorStates())),Q.revealPrimaryCursor(re.source,!0)}_exec(Q){const re=[];for(let de=0,he=Q.length;de<he;de++){const me=Q[de],X=me.modelState.position.lineNumber;re[de]=v.CursorState.fromModelState(me.modelState.move(this._inSelectionMode,X,1,0))}return re}}A.CursorLineStart=(0,S.registerEditorCommand)(new W({inSelectionMode:!1,id:"cursorLineStart",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:0,mac:{primary:287}}})),A.CursorLineStartSelect=(0,S.registerEditorCommand)(new W({inSelectionMode:!0,id:"cursorLineStartSelect",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:0,mac:{primary:1311}}}));class V extends s{constructor(Q){super(Q),this._inSelectionMode=Q.inSelectionMode}runCoreEditorCommand(Q,re){Q.model.pushStackElement(),Q.setCursorStates(re.source,3,a.CursorMoveCommands.moveToEndOfLine(Q,Q.getCursorStates(),this._inSelectionMode,re.sticky||!1)),Q.revealPrimaryCursor(re.source,!0)}}A.CursorEnd=(0,S.registerEditorCommand)(new V({inSelectionMode:!1,id:"cursorEnd",precondition:void 0,kbOpts:{args:{sticky:!1},weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:13,mac:{primary:13,secondary:[2065]}},metadata:{description:"Go to End",args:[{name:"args",schema:{type:"object",properties:{sticky:{description:L.localize(0,null),type:"boolean",default:!1}}}}]}})),A.CursorEndSelect=(0,S.registerEditorCommand)(new V({inSelectionMode:!0,id:"cursorEndSelect",precondition:void 0,kbOpts:{args:{sticky:!1},weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:1037,mac:{primary:1037,secondary:[3089]}},metadata:{description:"Select to End",args:[{name:"args",schema:{type:"object",properties:{sticky:{description:L.localize(1,null),type:"boolean",default:!1}}}}]}}));class K extends s{constructor(Q){super(Q),this._inSelectionMode=Q.inSelectionMode}runCoreEditorCommand(Q,re){Q.model.pushStackElement(),Q.setCursorStates(re.source,3,this._exec(Q,Q.getCursorStates())),Q.revealPrimaryCursor(re.source,!0)}_exec(Q,re){const de=[];for(let he=0,me=re.length;he<me;he++){const X=re[he],U=X.modelState.position.lineNumber,G=Q.model.getLineMaxColumn(U);de[he]=v.CursorState.fromModelState(X.modelState.move(this._inSelectionMode,U,G,0))}return de}}A.CursorLineEnd=(0,S.registerEditorCommand)(new K({inSelectionMode:!1,id:"cursorLineEnd",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:0,mac:{primary:291}}})),A.CursorLineEndSelect=(0,S.registerEditorCommand)(new K({inSelectionMode:!0,id:"cursorLineEndSelect",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:0,mac:{primary:1315}}}));class F extends s{constructor(Q){super(Q),this._inSelectionMode=Q.inSelectionMode}runCoreEditorCommand(Q,re){Q.model.pushStackElement(),Q.setCursorStates(re.source,3,a.CursorMoveCommands.moveToBeginningOfBuffer(Q,Q.getCursorStates(),this._inSelectionMode)),Q.revealPrimaryCursor(re.source,!0)}}A.CursorTop=(0,S.registerEditorCommand)(new F({inSelectionMode:!1,id:"cursorTop",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:2062,mac:{primary:2064}}})),A.CursorTopSelect=(0,S.registerEditorCommand)(new F({inSelectionMode:!0,id:"cursorTopSelect",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:3086,mac:{primary:3088}}}));class q extends s{constructor(Q){super(Q),this._inSelectionMode=Q.inSelectionMode}runCoreEditorCommand(Q,re){Q.model.pushStackElement(),Q.setCursorStates(re.source,3,a.CursorMoveCommands.moveToEndOfBuffer(Q,Q.getCursorStates(),this._inSelectionMode)),Q.revealPrimaryCursor(re.source,!0)}}A.CursorBottom=(0,S.registerEditorCommand)(new q({inSelectionMode:!1,id:"cursorBottom",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:2061,mac:{primary:2066}}})),A.CursorBottomSelect=(0,S.registerEditorCommand)(new q({inSelectionMode:!0,id:"cursorBottomSelect",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:3085,mac:{primary:3090}}}));class ie extends s{constructor(){super({id:"editorScroll",precondition:void 0,metadata:l.metadata})}determineScrollMethod(Q){const re=[6],de=[1,2,3,4,5,6],he=[4,2],me=[1,3];return re.includes(Q.unit)&&he.includes(Q.direction)?this._runHorizontalEditorScroll.bind(this):de.includes(Q.unit)&&me.includes(Q.direction)?this._runVerticalEditorScroll.bind(this):null}runCoreEditorCommand(Q,re){const de=l.parse(re);if(!de)return;const he=this.determineScrollMethod(de);he&&he(Q,re.source,de)}_runVerticalEditorScroll(Q,re,de){const he=this._computeDesiredScrollTop(Q,de);if(de.revealCursor){const me=Q.getCompletelyVisibleViewRangeAtScrollTop(he);Q.setCursorStates(re,3,[a.CursorMoveCommands.findPositionInViewportIfOutside(Q,Q.getPrimaryCursorState(),me,de.select)])}Q.viewLayout.setScrollPosition({scrollTop:he},0)}_computeDesiredScrollTop(Q,re){if(re.unit===1){const me=Q.viewLayout.getFutureViewport(),X=Q.getCompletelyVisibleViewRangeAtScrollTop(me.top),U=Q.coordinatesConverter.convertViewRangeToModelRange(X);let G;re.direction===1?G=Math.max(1,U.startLineNumber-re.value):G=Math.min(Q.model.getLineCount(),U.startLineNumber+re.value);const z=Q.coordinatesConverter.convertModelPositionToViewPosition(new n.Position(G,1));return Q.viewLayout.getVerticalOffsetForLineNumber(z.lineNumber)}if(re.unit===5){let me=0;return re.direction===3&&(me=Q.model.getLineCount()-Q.cursorConfig.pageSize),Q.viewLayout.getVerticalOffsetForLineNumber(me)}let de;re.unit===3?de=Q.cursorConfig.pageSize*re.value:re.unit===4?de=Math.round(Q.cursorConfig.pageSize/2)*re.value:de=re.value;const he=(re.direction===1?-1:1)*de;return Q.viewLayout.getCurrentScrollTop()+he*Q.cursorConfig.lineHeight}_runHorizontalEditorScroll(Q,re,de){const he=this._computeDesiredScrollLeft(Q,de);Q.viewLayout.setScrollPosition({scrollLeft:he},0)}_computeDesiredScrollLeft(Q,re){const de=(re.direction===4?-1:1)*re.value;return Q.viewLayout.getCurrentScrollLeft()+de*Q.cursorConfig.typicalHalfwidthCharacterWidth}}A.EditorScrollImpl=ie,A.EditorScroll=(0,S.registerEditorCommand)(new ie),A.ScrollLineUp=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"scrollLineUp",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:2064,mac:{primary:267}}})}runCoreEditorCommand(J,Q){A.EditorScroll.runCoreEditorCommand(J,{to:l.RawDirection.Up,by:l.RawUnit.WrappedLine,value:1,revealCursor:!1,select:!1,source:Q.source})}}),A.ScrollPageUp=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"scrollPageUp",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:2059,win:{primary:523},linux:{primary:523}}})}runCoreEditorCommand(J,Q){A.EditorScroll.runCoreEditorCommand(J,{to:l.RawDirection.Up,by:l.RawUnit.Page,value:1,revealCursor:!1,select:!1,source:Q.source})}}),A.ScrollEditorTop=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"scrollEditorTop",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus}})}runCoreEditorCommand(J,Q){A.EditorScroll.runCoreEditorCommand(J,{to:l.RawDirection.Up,by:l.RawUnit.Editor,value:1,revealCursor:!1,select:!1,source:Q.source})}}),A.ScrollLineDown=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"scrollLineDown",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:2066,mac:{primary:268}}})}runCoreEditorCommand(J,Q){A.EditorScroll.runCoreEditorCommand(J,{to:l.RawDirection.Down,by:l.RawUnit.WrappedLine,value:1,revealCursor:!1,select:!1,source:Q.source})}}),A.ScrollPageDown=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"scrollPageDown",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:2060,win:{primary:524},linux:{primary:524}}})}runCoreEditorCommand(J,Q){A.EditorScroll.runCoreEditorCommand(J,{to:l.RawDirection.Down,by:l.RawUnit.Page,value:1,revealCursor:!1,select:!1,source:Q.source})}}),A.ScrollEditorBottom=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"scrollEditorBottom",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus}})}runCoreEditorCommand(J,Q){A.EditorScroll.runCoreEditorCommand(J,{to:l.RawDirection.Down,by:l.RawUnit.Editor,value:1,revealCursor:!1,select:!1,source:Q.source})}}),A.ScrollLeft=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"scrollLeft",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus}})}runCoreEditorCommand(J,Q){A.EditorScroll.runCoreEditorCommand(J,{to:l.RawDirection.Left,by:l.RawUnit.Column,value:2,revealCursor:!1,select:!1,source:Q.source})}}),A.ScrollRight=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"scrollRight",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus}})}runCoreEditorCommand(J,Q){A.EditorScroll.runCoreEditorCommand(J,{to:l.RawDirection.Right,by:l.RawUnit.Column,value:2,revealCursor:!1,select:!1,source:Q.source})}});class ae extends s{constructor(Q){super(Q),this._inSelectionMode=Q.inSelectionMode}runCoreEditorCommand(Q,re){re.position&&(Q.model.pushStackElement(),Q.setCursorStates(re.source,3,[a.CursorMoveCommands.word(Q,Q.getPrimaryCursorState(),this._inSelectionMode,re.position)]),re.revealType!==2&&Q.revealPrimaryCursor(re.source,!0,!0))}}A.WordSelect=(0,S.registerEditorCommand)(new ae({inSelectionMode:!1,id:"_wordSelect",precondition:void 0})),A.WordSelectDrag=(0,S.registerEditorCommand)(new ae({inSelectionMode:!0,id:"_wordSelectDrag",precondition:void 0})),A.LastCursorWordSelect=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"lastCursorWordSelect",precondition:void 0})}runCoreEditorCommand(J,Q){if(!Q.position)return;const re=J.getLastAddedCursorIndex(),de=J.getCursorStates(),he=de.slice(0),me=de[re];he[re]=a.CursorMoveCommands.word(J,me,me.modelState.hasSelection(),Q.position),J.model.pushStackElement(),J.setCursorStates(Q.source,3,he)}});class ne extends s{constructor(Q){super(Q),this._inSelectionMode=Q.inSelectionMode}runCoreEditorCommand(Q,re){re.position&&(Q.model.pushStackElement(),Q.setCursorStates(re.source,3,[a.CursorMoveCommands.line(Q,Q.getPrimaryCursorState(),this._inSelectionMode,re.position,re.viewPosition)]),re.revealType!==2&&Q.revealPrimaryCursor(re.source,!1,!0))}}A.LineSelect=(0,S.registerEditorCommand)(new ne({inSelectionMode:!1,id:"_lineSelect",precondition:void 0})),A.LineSelectDrag=(0,S.registerEditorCommand)(new ne({inSelectionMode:!0,id:"_lineSelectDrag",precondition:void 0}));class $ extends s{constructor(Q){super(Q),this._inSelectionMode=Q.inSelectionMode}runCoreEditorCommand(Q,re){if(!re.position)return;const de=Q.getLastAddedCursorIndex(),he=Q.getCursorStates(),me=he.slice(0);me[de]=a.CursorMoveCommands.line(Q,he[de],this._inSelectionMode,re.position,re.viewPosition),Q.model.pushStackElement(),Q.setCursorStates(re.source,3,me)}}A.LastCursorLineSelect=(0,S.registerEditorCommand)(new $({inSelectionMode:!1,id:"lastCursorLineSelect",precondition:void 0})),A.LastCursorLineSelectDrag=(0,S.registerEditorCommand)(new $({inSelectionMode:!0,id:"lastCursorLineSelectDrag",precondition:void 0})),A.CancelSelection=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"cancelSelection",precondition:r.EditorContextKeys.hasNonEmptySelection,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:9,secondary:[1033]}})}runCoreEditorCommand(J,Q){J.model.pushStackElement(),J.setCursorStates(Q.source,3,[a.CursorMoveCommands.cancelSelection(J,J.getPrimaryCursorState())]),J.revealPrimaryCursor(Q.source,!0)}}),A.RemoveSecondaryCursors=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"removeSecondaryCursors",precondition:r.EditorContextKeys.hasMultipleSelections,kbOpts:{weight:d+1,kbExpr:r.EditorContextKeys.textInputFocus,primary:9,secondary:[1033]}})}runCoreEditorCommand(J,Q){J.model.pushStackElement(),J.setCursorStates(Q.source,3,[J.getPrimaryCursorState()]),J.revealPrimaryCursor(Q.source,!0),(0,E.status)(L.localize(2,null))}}),A.RevealLine=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"revealLine",precondition:void 0,metadata:o.metadata})}runCoreEditorCommand(J,Q){const re=Q,de=re.lineNumber||0;let he=typeof de=="number"?de+1:parseInt(de)+1;he<1&&(he=1);const me=J.model.getLineCount();he>me&&(he=me);const X=new t.Range(he,1,he,J.model.getLineMaxColumn(he));let U=0;if(re.at)switch(re.at){case o.RawAtArgument.Top:U=3;break;case o.RawAtArgument.Center:U=1;break;case o.RawAtArgument.Bottom:U=4;break;default:break}const G=J.coordinatesConverter.convertModelRangeToViewRange(X);J.revealRange(Q.source,!1,G,U,0)}}),A.SelectAll=new class extends g{constructor(){super(S.SelectAllCommand)}runDOMCommand(J){k.isFirefox&&(J.focus(),J.select()),J.ownerDocument.execCommand("selectAll")}runEditorCommand(J,Q,re){const de=Q._getViewModel();de&&this.runCoreEditorCommand(de,re)}runCoreEditorCommand(J,Q){J.model.pushStackElement(),J.setCursorStates("keyboard",3,[a.CursorMoveCommands.selectAll(J,J.getPrimaryCursorState())])}},A.SetSelection=(0,S.registerEditorCommand)(new class extends s{constructor(){super({id:"setSelection",precondition:void 0})}runCoreEditorCommand(J,Q){Q.selection&&(J.model.pushStackElement(),J.setCursorStates(Q.source,3,[v.CursorState.fromModelSelection(Q.selection)]))}})})(h||(e.CoreNavigationCommands=h={}));const m=u.ContextKeyExpr.and(r.EditorContextKeys.textInputFocus,r.EditorContextKeys.columnSelection);function C(A,P){f.KeybindingsRegistry.registerKeybindingRule({id:A,primary:P,when:m,weight:d+1})}C(h.CursorColumnSelectLeft.id,1039),C(h.CursorColumnSelectRight.id,1041),C(h.CursorColumnSelectUp.id,1040),C(h.CursorColumnSelectPageUp.id,1035),C(h.CursorColumnSelectDown.id,1042),C(h.CursorColumnSelectPageDown.id,1036);function w(A){return A.register(),A}var D;(function(A){class P extends S.EditorCommand{runEditorCommand(M,R,x){const O=R._getViewModel();O&&this.runCoreEditingCommand(R,O,x||{})}}A.CoreEditingCommand=P,A.LineBreakInsert=(0,S.registerEditorCommand)(new class extends P{constructor(){super({id:"lineBreakInsert",precondition:r.EditorContextKeys.writable,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:0,mac:{primary:301}}})}runCoreEditingCommand(N,M,R){N.pushUndoStop(),N.executeCommands(this.id,i.TypeOperations.lineBreakInsert(M.cursorConfig,M.model,M.getCursorStates().map(x=>x.modelState.selection)))}}),A.Outdent=(0,S.registerEditorCommand)(new class extends P{constructor(){super({id:"outdent",precondition:r.EditorContextKeys.writable,kbOpts:{weight:d,kbExpr:u.ContextKeyExpr.and(r.EditorContextKeys.editorTextFocus,r.EditorContextKeys.tabDoesNotMoveFocus),primary:1026}})}runCoreEditingCommand(N,M,R){N.pushUndoStop(),N.executeCommands(this.id,i.TypeOperations.outdent(M.cursorConfig,M.model,M.getCursorStates().map(x=>x.modelState.selection))),N.pushUndoStop()}}),A.Tab=(0,S.registerEditorCommand)(new class extends P{constructor(){super({id:"tab",precondition:r.EditorContextKeys.writable,kbOpts:{weight:d,kbExpr:u.ContextKeyExpr.and(r.EditorContextKeys.editorTextFocus,r.EditorContextKeys.tabDoesNotMoveFocus),primary:2}})}runCoreEditingCommand(N,M,R){N.pushUndoStop(),N.executeCommands(this.id,i.TypeOperations.tab(M.cursorConfig,M.model,M.getCursorStates().map(x=>x.modelState.selection))),N.pushUndoStop()}}),A.DeleteLeft=(0,S.registerEditorCommand)(new class extends P{constructor(){super({id:"deleteLeft",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:1,secondary:[1025],mac:{primary:1,secondary:[1025,294,257]}}})}runCoreEditingCommand(N,M,R){const[x,O]=b.DeleteOperations.deleteLeft(M.getPrevEditOperationType(),M.cursorConfig,M.model,M.getCursorStates().map(B=>B.modelState.selection),M.getCursorAutoClosedCharacters());x&&N.pushUndoStop(),N.executeCommands(this.id,O),M.setPrevEditOperationType(2)}}),A.DeleteRight=(0,S.registerEditorCommand)(new class extends P{constructor(){super({id:"deleteRight",precondition:void 0,kbOpts:{weight:d,kbExpr:r.EditorContextKeys.textInputFocus,primary:20,mac:{primary:20,secondary:[290,276]}}})}runCoreEditingCommand(N,M,R){const[x,O]=b.DeleteOperations.deleteRight(M.getPrevEditOperationType(),M.cursorConfig,M.model,M.getCursorStates().map(B=>B.modelState.selection));x&&N.pushUndoStop(),N.executeCommands(this.id,O),M.setPrevEditOperationType(3)}}),A.Undo=new class extends g{constructor(){super(S.UndoCommand)}runDOMCommand(N){N.ownerDocument.execCommand("undo")}runEditorCommand(N,M,R){if(!(!M.hasModel()||M.getOption(90)===!0))return M.getModel().undo()}},A.Redo=new class extends g{constructor(){super(S.RedoCommand)}runDOMCommand(N){N.ownerDocument.execCommand("redo")}runEditorCommand(N,M,R){if(!(!M.hasModel()||M.getOption(90)===!0))return M.getModel().redo()}}})(D||(e.CoreEditingCommands=D={}));class I extends S.Command{constructor(P,N,M){super({id:P,precondition:void 0,metadata:M}),this._handlerId=N}runCommand(P,N){const M=P.get(p.ICodeEditorService).getFocusedCodeEditor();M&&M.trigger("keyboard",this._handlerId,N)}}function T(A,P){w(new I("default:"+A,A)),w(new I(A,A,P))}T("type",{description:"Type",args:[{name:"args",schema:{type:"object",required:["text"],properties:{text:{type:"string"}}}}]}),T("replacePreviousChar"),T("compositionType"),T("compositionStart"),T("compositionEnd"),T("paste"),T("cut")}),define(se[807],oe([1,0,237,16]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerDecorationsContribution=void 0;let y=class{constructor(S,p){}dispose(){}};e.MarkerDecorationsContribution=y,y.ID="editor.contrib.markerDecorations",e.MarkerDecorationsContribution=y=ke([ge(1,L.IMarkerDecorationsService)],y),(0,k.registerEditorContribution)(y.ID,y,0)}),define(se[808],oe([1,0,191,10,17]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewController=void 0;class E{constructor(p,_,v,b){this.configuration=p,this.viewModel=_,this.userInputEvents=v,this.commandDelegate=b}paste(p,_,v,b){this.commandDelegate.paste(p,_,v,b)}type(p){this.commandDelegate.type(p)}compositionType(p,_,v,b){this.commandDelegate.compositionType(p,_,v,b)}compositionStart(){this.commandDelegate.startComposition()}compositionEnd(){this.commandDelegate.endComposition()}cut(){this.commandDelegate.cut()}setSelection(p){L.CoreNavigationCommands.SetSelection.runCoreEditorCommand(this.viewModel,{source:"keyboard",selection:p})}_validateViewColumn(p){const _=this.viewModel.getLineMinColumn(p.lineNumber);return p.column<_?new k.Position(p.lineNumber,_):p}_hasMulticursorModifier(p){switch(this.configuration.options.get(77)){case"altKey":return p.altKey;case"ctrlKey":return p.ctrlKey;case"metaKey":return p.metaKey;default:return!1}}_hasNonMulticursorModifier(p){switch(this.configuration.options.get(77)){case"altKey":return p.ctrlKey||p.metaKey;case"ctrlKey":return p.altKey||p.metaKey;case"metaKey":return p.ctrlKey||p.altKey;default:return!1}}dispatchMouse(p){const _=this.configuration.options,v=y.isLinux&&_.get(106),b=_.get(22);p.middleButton&&!v?this._columnSelect(p.position,p.mouseColumn,p.inSelectionMode):p.startedOnLineNumbers?this._hasMulticursorModifier(p)?p.inSelectionMode?this._lastCursorLineSelect(p.position,p.revealType):this._createCursor(p.position,!0):p.inSelectionMode?this._lineSelectDrag(p.position,p.revealType):this._lineSelect(p.position,p.revealType):p.mouseDownCount>=4?this._selectAll():p.mouseDownCount===3?this._hasMulticursorModifier(p)?p.inSelectionMode?this._lastCursorLineSelectDrag(p.position,p.revealType):this._lastCursorLineSelect(p.position,p.revealType):p.inSelectionMode?this._lineSelectDrag(p.position,p.revealType):this._lineSelect(p.position,p.revealType):p.mouseDownCount===2?p.onInjectedText||(this._hasMulticursorModifier(p)?this._lastCursorWordSelect(p.position,p.revealType):p.inSelectionMode?this._wordSelectDrag(p.position,p.revealType):this._wordSelect(p.position,p.revealType)):this._hasMulticursorModifier(p)?this._hasNonMulticursorModifier(p)||(p.shiftKey?this._columnSelect(p.position,p.mouseColumn,!0):p.inSelectionMode?this._lastCursorMoveToSelect(p.position,p.revealType):this._createCursor(p.position,!1)):p.inSelectionMode?p.altKey?this._columnSelect(p.position,p.mouseColumn,!0):b?this._columnSelect(p.position,p.mouseColumn,!0):this._moveToSelect(p.position,p.revealType):this.moveTo(p.position,p.revealType)}_usualArgs(p,_){return p=this._validateViewColumn(p),{source:"mouse",position:this._convertViewToModelPosition(p),viewPosition:p,revealType:_}}moveTo(p,_){L.CoreNavigationCommands.MoveTo.runCoreEditorCommand(this.viewModel,this._usualArgs(p,_))}_moveToSelect(p,_){L.CoreNavigationCommands.MoveToSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(p,_))}_columnSelect(p,_,v){p=this._validateViewColumn(p),L.CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(this.viewModel,{source:"mouse",position:this._convertViewToModelPosition(p),viewPosition:p,mouseColumn:_,doColumnSelect:v})}_createCursor(p,_){p=this._validateViewColumn(p),L.CoreNavigationCommands.CreateCursor.runCoreEditorCommand(this.viewModel,{source:"mouse",position:this._convertViewToModelPosition(p),viewPosition:p,wholeLine:_})}_lastCursorMoveToSelect(p,_){L.CoreNavigationCommands.LastCursorMoveToSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(p,_))}_wordSelect(p,_){L.CoreNavigationCommands.WordSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(p,_))}_wordSelectDrag(p,_){L.CoreNavigationCommands.WordSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(p,_))}_lastCursorWordSelect(p,_){L.CoreNavigationCommands.LastCursorWordSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(p,_))}_lineSelect(p,_){L.CoreNavigationCommands.LineSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(p,_))}_lineSelectDrag(p,_){L.CoreNavigationCommands.LineSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(p,_))}_lastCursorLineSelect(p,_){L.CoreNavigationCommands.LastCursorLineSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(p,_))}_lastCursorLineSelectDrag(p,_){L.CoreNavigationCommands.LastCursorLineSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(p,_))}_selectAll(){L.CoreNavigationCommands.SelectAll.runCoreEditorCommand(this.viewModel,{source:"mouse"})}_convertViewToModelPosition(p){return this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(p)}emitKeyDown(p){this.userInputEvents.emitKeyDown(p)}emitKeyUp(p){this.userInputEvents.emitKeyUp(p)}emitContextMenu(p){this.userInputEvents.emitContextMenu(p)}emitMouseMove(p){this.userInputEvents.emitMouseMove(p)}emitMouseLeave(p){this.userInputEvents.emitMouseLeave(p)}emitMouseUp(p){this.userInputEvents.emitMouseUp(p)}emitMouseDown(p){this.userInputEvents.emitMouseDown(p)}emitMouseDrag(p){this.userInputEvents.emitMouseDrag(p)}emitMouseDrop(p){this.userInputEvents.emitMouseDrop(p)}emitMouseDropCanceled(){this.userInputEvents.emitMouseDropCanceled()}emitMouseWheel(p){this.userInputEvents.emitMouseWheel(p)}}e.ViewController=E}),define(se[809],oe([1,0,45,8,6,61,62,112,121,81]),function(te,e,L,k,y,E,S,p,_,v){"use strict";var b;Object.defineProperty(e,"__esModule",{value:!0}),e.WorkerBasedDocumentDiffProvider=e.WorkerBasedDiffProviderFactoryService=e.IDiffProviderFactoryService=void 0,e.IDiffProviderFactoryService=(0,k.createDecorator)("diffProviderFactoryService");let a=class{constructor(t){this.instantiationService=t}createDiffProvider(t){return this.instantiationService.createInstance(i,t)}};e.WorkerBasedDiffProviderFactoryService=a,e.WorkerBasedDiffProviderFactoryService=a=ke([ge(0,k.IInstantiationService)],a),(0,L.registerSingleton)(e.IDiffProviderFactoryService,a,1);let i=b=class{constructor(t,r,u){this.editorWorkerService=r,this.telemetryService=u,this.onDidChangeEventEmitter=new y.Emitter,this.onDidChange=this.onDidChangeEventEmitter.event,this.diffAlgorithm="advanced",this.diffAlgorithmOnDidChangeSubscription=void 0,this.setOptions(t)}dispose(){var t;(t=this.diffAlgorithmOnDidChangeSubscription)===null||t===void 0||t.dispose()}async computeDiff(t,r,u,f){var c,d;if(typeof this.diffAlgorithm!="string")return this.diffAlgorithm.computeDiff(t,r,u,f);if(t.getLineCount()===1&&t.getLineMaxColumn(1)===1)return r.getLineCount()===1&&r.getLineMaxColumn(1)===1?{changes:[],identical:!0,quitEarly:!1,moves:[]}:{changes:[new p.DetailedLineRangeMapping(new S.LineRange(1,2),new S.LineRange(1,r.getLineCount()+1),[new p.RangeMapping(t.getFullModelRange(),r.getFullModelRange())])],identical:!1,quitEarly:!1,moves:[]};const s=JSON.stringify([t.uri.toString(),r.uri.toString()]),l=JSON.stringify([t.id,r.id,t.getAlternativeVersionId(),r.getAlternativeVersionId(),JSON.stringify(u)]),o=b.diffCache.get(s);if(o&&o.context===l)return o.result;const g=E.StopWatch.create(),h=await this.editorWorkerService.computeDiff(t.uri,r.uri,u,this.diffAlgorithm),m=g.elapsed();if(this.telemetryService.publicLog2("diffEditor.computeDiff",{timeMs:m,timedOut:(c=h?.quitEarly)!==null&&c!==void 0?c:!0,detectedMoves:u.computeMoves?(d=h?.moves.length)!==null&&d!==void 0?d:0:-1}),f.isCancellationRequested)return{changes:[],identical:!1,quitEarly:!0,moves:[]};if(!h)throw new Error("no diff result available");return b.diffCache.size>10&&b.diffCache.delete(b.diffCache.keys().next().value),b.diffCache.set(s,{result:h,context:l}),h}setOptions(t){var r;let u=!1;t.diffAlgorithm&&this.diffAlgorithm!==t.diffAlgorithm&&((r=this.diffAlgorithmOnDidChangeSubscription)===null||r===void 0||r.dispose(),this.diffAlgorithmOnDidChangeSubscription=void 0,this.diffAlgorithm=t.diffAlgorithm,typeof t.diffAlgorithm!="string"&&(this.diffAlgorithmOnDidChangeSubscription=t.diffAlgorithm.onDidChange(()=>this.onDidChangeEventEmitter.fire())),u=!0),u&&this.onDidChangeEventEmitter.fire()}};e.WorkerBasedDocumentDiffProvider=i,i.diffCache=new Map,e.WorkerBasedDocumentDiffProvider=i=b=ke([ge(1,_.IEditorWorkerService),ge(2,v.ITelemetryService)],i)}),define(se[359],oe([1,0,14,19,2,35,809,87,62,286,112,182,288,284,20,13,90]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UnchangedRegion=e.DiffMapping=e.DiffState=e.DiffEditorViewModel=void 0;let f=class extends y.Disposable{setActiveMovedText(C){this._activeMovedText.set(C,void 0)}constructor(C,w,D){super(),this.model=C,this._options=w,this._diffProviderFactoryService=D,this._isDiffUpToDate=(0,E.observableValue)(this,!1),this.isDiffUpToDate=this._isDiffUpToDate,this._diff=(0,E.observableValue)(this,void 0),this.diff=this._diff,this._unchangedRegions=(0,E.observableValue)(this,void 0),this.unchangedRegions=(0,E.derived)(this,P=>{var N,M;return this._options.hideUnchangedRegions.read(P)?(M=(N=this._unchangedRegions.read(P))===null||N===void 0?void 0:N.regions)!==null&&M!==void 0?M:[]:((0,E.transaction)(R=>{var x;for(const O of((x=this._unchangedRegions.get())===null||x===void 0?void 0:x.regions)||[])O.collapseAll(R)}),[])}),this.movedTextToCompare=(0,E.observableValue)(this,void 0),this._activeMovedText=(0,E.observableValue)(this,void 0),this._hoveredMovedText=(0,E.observableValue)(this,void 0),this.activeMovedText=(0,E.derived)(this,P=>{var N,M;return(M=(N=this.movedTextToCompare.read(P))!==null&&N!==void 0?N:this._hoveredMovedText.read(P))!==null&&M!==void 0?M:this._activeMovedText.read(P)}),this._cancellationTokenSource=new k.CancellationTokenSource,this._diffProvider=(0,E.derived)(this,P=>{const N=this._diffProviderFactoryService.createDiffProvider({diffAlgorithm:this._options.diffAlgorithm.read(P)}),M=(0,E.observableSignalFromEvent)("onDidChange",N.onDidChange);return{diffProvider:N,onChangeSignal:M}}),this._register((0,y.toDisposable)(()=>this._cancellationTokenSource.cancel()));const I=(0,E.observableSignal)("contentChangedSignal"),T=this._register(new L.RunOnceScheduler(()=>I.trigger(void 0),200));this._register((0,E.autorun)(P=>{const N=this._unchangedRegions.read(P);if(!N||N.regions.some(W=>W.isDragged.read(P)))return;const M=N.originalDecorationIds.map(W=>C.original.getDecorationRange(W)).map(W=>W?_.LineRange.fromRangeInclusive(W):void 0),R=N.modifiedDecorationIds.map(W=>C.modified.getDecorationRange(W)).map(W=>W?_.LineRange.fromRangeInclusive(W):void 0),x=N.regions.map((W,V)=>!M[V]||!R[V]?void 0:new o(M[V].startLineNumber,R[V].startLineNumber,M[V].length,W.visibleLineCountTop.read(P),W.visibleLineCountBottom.read(P))).filter(t.isDefined),O=[];let B=!1;for(const W of(0,r.groupAdjacentBy)(x,(V,K)=>V.getHiddenModifiedRange(P).endLineNumberExclusive===K.getHiddenModifiedRange(P).startLineNumber))if(W.length>1){B=!0;const V=W.reduce((F,q)=>F+q.lineCount,0),K=new o(W[0].originalLineNumber,W[0].modifiedLineNumber,V,W[0].visibleLineCountTop.get(),W[W.length-1].visibleLineCountBottom.get());O.push(K)}else O.push(W[0]);if(B){const W=C.original.deltaDecorations(N.originalDecorationIds,O.map(K=>({range:K.originalUnchangedRange.toInclusiveRange(),options:{description:"unchanged"}}))),V=C.modified.deltaDecorations(N.modifiedDecorationIds,O.map(K=>({range:K.modifiedUnchangedRange.toInclusiveRange(),options:{description:"unchanged"}})));(0,E.transaction)(K=>{this._unchangedRegions.set({regions:O,originalDecorationIds:W,modifiedDecorationIds:V},K)})}}));const A=(P,N,M)=>{const R=o.fromDiffs(P.changes,C.original.getLineCount(),C.modified.getLineCount(),this._options.hideUnchangedRegionsMinimumLineCount.read(M),this._options.hideUnchangedRegionsContextLineCount.read(M));let x;const O=this._unchangedRegions.get();if(O){const K=O.originalDecorationIds.map(ae=>C.original.getDecorationRange(ae)).map(ae=>ae?_.LineRange.fromRangeInclusive(ae):void 0),F=O.modifiedDecorationIds.map(ae=>C.modified.getDecorationRange(ae)).map(ae=>ae?_.LineRange.fromRangeInclusive(ae):void 0);let ie=(0,p.filterWithPrevious)(O.regions.map((ae,ne)=>{if(!K[ne]||!F[ne])return;const $=K[ne].length;return new o(K[ne].startLineNumber,F[ne].startLineNumber,$,Math.min(ae.visibleLineCountTop.get(),$),Math.min(ae.visibleLineCountBottom.get(),$-ae.visibleLineCountTop.get()))}).filter(t.isDefined),(ae,ne)=>!ne||ae.modifiedLineNumber>=ne.modifiedLineNumber+ne.lineCount&&ae.originalLineNumber>=ne.originalLineNumber+ne.lineCount).map(ae=>new b.LineRangeMapping(ae.getHiddenOriginalRange(M),ae.getHiddenModifiedRange(M)));ie=b.LineRangeMapping.clip(ie,_.LineRange.ofLength(1,C.original.getLineCount()),_.LineRange.ofLength(1,C.modified.getLineCount())),x=b.LineRangeMapping.inverse(ie,C.original.getLineCount(),C.modified.getLineCount())}const B=[];if(x)for(const K of R){const F=x.filter(q=>q.original.intersectsStrict(K.originalUnchangedRange)&&q.modified.intersectsStrict(K.modifiedUnchangedRange));B.push(...K.setVisibleRanges(F,N))}else B.push(...R);const W=C.original.deltaDecorations(O?.originalDecorationIds||[],B.map(K=>({range:K.originalUnchangedRange.toInclusiveRange(),options:{description:"unchanged"}}))),V=C.modified.deltaDecorations(O?.modifiedDecorationIds||[],B.map(K=>({range:K.modifiedUnchangedRange.toInclusiveRange(),options:{description:"unchanged"}})));this._unchangedRegions.set({regions:B,originalDecorationIds:W,modifiedDecorationIds:V},N)};this._register(C.modified.onDidChangeContent(P=>{if(this._diff.get()){const M=a.TextEditInfo.fromModelContentChanges(P.changes),R=(this._lastDiff,C.original,C.modified,void 0);R&&(this._lastDiff=R,(0,E.transaction)(x=>{this._diff.set(s.fromDiffResult(this._lastDiff),x),A(R,x);const O=this.movedTextToCompare.get();this.movedTextToCompare.set(O?this._lastDiff.moves.find(B=>B.lineRangeMapping.modified.intersect(O.lineRangeMapping.modified)):void 0,x)}))}this._isDiffUpToDate.set(!1,void 0),T.schedule()})),this._register(C.original.onDidChangeContent(P=>{if(this._diff.get()){const M=a.TextEditInfo.fromModelContentChanges(P.changes),R=(this._lastDiff,C.original,C.modified,void 0);R&&(this._lastDiff=R,(0,E.transaction)(x=>{this._diff.set(s.fromDiffResult(this._lastDiff),x),A(R,x);const O=this.movedTextToCompare.get();this.movedTextToCompare.set(O?this._lastDiff.moves.find(B=>B.lineRangeMapping.modified.intersect(O.lineRangeMapping.modified)):void 0,x)}))}this._isDiffUpToDate.set(!1,void 0),T.schedule()})),this._register((0,E.autorunWithStore)(async(P,N)=>{var M,R;this._options.hideUnchangedRegionsMinimumLineCount.read(P),this._options.hideUnchangedRegionsContextLineCount.read(P),T.cancel(),I.read(P);const x=this._diffProvider.read(P);x.onChangeSignal.read(P),(0,p.readHotReloadableExport)(v.DefaultLinesDiffComputer,P),(0,p.readHotReloadableExport)(n.optimizeSequenceDiffs,P),this._isDiffUpToDate.set(!1,void 0);let O=[];N.add(C.original.onDidChangeContent(V=>{const K=a.TextEditInfo.fromModelContentChanges(V.changes);O=(0,i.combineTextEditInfos)(O,K)}));let B=[];N.add(C.modified.onDidChangeContent(V=>{const K=a.TextEditInfo.fromModelContentChanges(V.changes);B=(0,i.combineTextEditInfos)(B,K)}));let W=await x.diffProvider.computeDiff(C.original,C.modified,{ignoreTrimWhitespace:this._options.ignoreTrimWhitespace.read(P),maxComputationTimeMs:this._options.maxComputationTimeMs.read(P),computeMoves:this._options.showMoves.read(P)},this._cancellationTokenSource.token);this._cancellationTokenSource.token.isCancellationRequested||(W=c(W,C.original,C.modified),W=(M=(C.original,C.modified,void 0))!==null&&M!==void 0?M:W,W=(R=(C.original,C.modified,void 0))!==null&&R!==void 0?R:W,(0,E.transaction)(V=>{A(W,V),this._lastDiff=W;const K=s.fromDiffResult(W);this._diff.set(K,V),this._isDiffUpToDate.set(!0,V);const F=this.movedTextToCompare.get();this.movedTextToCompare.set(F?this._lastDiff.moves.find(q=>q.lineRangeMapping.modified.intersect(F.lineRangeMapping.modified)):void 0,V)}))}))}ensureModifiedLineIsVisible(C,w,D){var I,T;if(((I=this.diff.get())===null||I===void 0?void 0:I.mappings.length)===0)return;const A=((T=this._unchangedRegions.get())===null||T===void 0?void 0:T.regions)||[];for(const P of A)if(P.getHiddenModifiedRange(void 0).contains(C)){P.showModifiedLine(C,w,D);return}}ensureOriginalLineIsVisible(C,w,D){var I,T;if(((I=this.diff.get())===null||I===void 0?void 0:I.mappings.length)===0)return;const A=((T=this._unchangedRegions.get())===null||T===void 0?void 0:T.regions)||[];for(const P of A)if(P.getHiddenOriginalRange(void 0).contains(C)){P.showOriginalLine(C,w,D);return}}async waitForDiff(){await(0,E.waitForState)(this.isDiffUpToDate,C=>C)}serializeState(){const C=this._unchangedRegions.get();return{collapsedRegions:C?.regions.map(w=>({range:w.getHiddenModifiedRange(void 0).serialize()}))}}restoreSerializedState(C){var w;const D=(w=C.collapsedRegions)===null||w===void 0?void 0:w.map(T=>_.LineRange.deserialize(T.range)),I=this._unchangedRegions.get();!I||!D||(0,E.transaction)(T=>{for(const A of I.regions)for(const P of D)if(A.modifiedUnchangedRange.intersect(P)){A.setHiddenModifiedRange(P,T);break}})}};e.DiffEditorViewModel=f,e.DiffEditorViewModel=f=ke([ge(2,S.IDiffProviderFactoryService)],f);function c(m,C,w){return{changes:m.changes.map(D=>new b.DetailedLineRangeMapping(D.original,D.modified,D.innerChanges?D.innerChanges.map(I=>d(I,C,w)):void 0)),moves:m.moves,identical:m.identical,quitEarly:m.quitEarly}}function d(m,C,w){let D=m.originalRange,I=m.modifiedRange;return(D.endColumn!==1||I.endColumn!==1)&&D.endColumn===C.getLineMaxColumn(D.endLineNumber)&&I.endColumn===w.getLineMaxColumn(I.endLineNumber)&&D.endLineNumber<C.getLineCount()&&I.endLineNumber<w.getLineCount()&&(D=D.setEndPosition(D.endLineNumber+1,1),I=I.setEndPosition(I.endLineNumber+1,1)),new b.RangeMapping(D,I)}class s{static fromDiffResult(C){return new s(C.changes.map(w=>new l(w)),C.moves||[],C.identical,C.quitEarly)}constructor(C,w,D,I){this.mappings=C,this.movedTexts=w,this.identical=D,this.quitEarly=I}}e.DiffState=s;class l{constructor(C){this.lineRangeMapping=C}}e.DiffMapping=l;class o{static fromDiffs(C,w,D,I,T){const A=b.DetailedLineRangeMapping.inverse(C,w,D),P=[];for(const N of A){let M=N.original.startLineNumber,R=N.modified.startLineNumber,x=N.original.length;const O=M===1&&R===1,B=M+x===w+1&&R+x===D+1;(O||B)&&x>=T+I?(O&&!B&&(x-=T),B&&!O&&(M+=T,R+=T,x-=T),P.push(new o(M,R,x,0,0))):x>=T*2+I&&(M+=T,R+=T,x-=T*2,P.push(new o(M,R,x,0,0)))}return P}get originalUnchangedRange(){return _.LineRange.ofLength(this.originalLineNumber,this.lineCount)}get modifiedUnchangedRange(){return _.LineRange.ofLength(this.modifiedLineNumber,this.lineCount)}constructor(C,w,D,I,T){this.originalLineNumber=C,this.modifiedLineNumber=w,this.lineCount=D,this._visibleLineCountTop=(0,E.observableValue)(this,0),this.visibleLineCountTop=this._visibleLineCountTop,this._visibleLineCountBottom=(0,E.observableValue)(this,0),this.visibleLineCountBottom=this._visibleLineCountBottom,this._shouldHideControls=(0,E.derived)(this,N=>this.visibleLineCountTop.read(N)+this.visibleLineCountBottom.read(N)===this.lineCount&&!this.isDragged.read(N)),this.isDragged=(0,E.observableValue)(this,void 0);const A=Math.max(Math.min(I,this.lineCount),0),P=Math.max(Math.min(T,this.lineCount-I),0);(0,u.softAssert)(I===A),(0,u.softAssert)(T===P),this._visibleLineCountTop.set(A,void 0),this._visibleLineCountBottom.set(P,void 0)}setVisibleRanges(C,w){const D=[],I=new _.LineRangeSet(C.map(N=>N.modified)).subtractFrom(this.modifiedUnchangedRange);let T=this.originalLineNumber,A=this.modifiedLineNumber;const P=this.modifiedLineNumber+this.lineCount;if(I.ranges.length===0)this.showAll(w),D.push(this);else{let N=0;for(const M of I.ranges){const R=N===I.ranges.length-1;N++;const x=(R?P:M.endLineNumberExclusive)-A,O=new o(T,A,x,0,0);O.setHiddenModifiedRange(M,w),D.push(O),T=O.originalUnchangedRange.endLineNumberExclusive,A=O.modifiedUnchangedRange.endLineNumberExclusive}}return D}shouldHideControls(C){return this._shouldHideControls.read(C)}getHiddenOriginalRange(C){return _.LineRange.ofLength(this.originalLineNumber+this._visibleLineCountTop.read(C),this.lineCount-this._visibleLineCountTop.read(C)-this._visibleLineCountBottom.read(C))}getHiddenModifiedRange(C){return _.LineRange.ofLength(this.modifiedLineNumber+this._visibleLineCountTop.read(C),this.lineCount-this._visibleLineCountTop.read(C)-this._visibleLineCountBottom.read(C))}setHiddenModifiedRange(C,w){const D=C.startLineNumber-this.modifiedLineNumber,I=this.modifiedLineNumber+this.lineCount-C.endLineNumberExclusive;this.setState(D,I,w)}getMaxVisibleLineCountTop(){return this.lineCount-this._visibleLineCountBottom.get()}getMaxVisibleLineCountBottom(){return this.lineCount-this._visibleLineCountTop.get()}showMoreAbove(C=10,w){const D=this.getMaxVisibleLineCountTop();this._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get()+C,D),w)}showMoreBelow(C=10,w){const D=this.lineCount-this._visibleLineCountTop.get();this._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get()+C,D),w)}showAll(C){this._visibleLineCountBottom.set(this.lineCount-this._visibleLineCountTop.get(),C)}showModifiedLine(C,w,D){const I=C+1-(this.modifiedLineNumber+this._visibleLineCountTop.get()),T=this.modifiedLineNumber-this._visibleLineCountBottom.get()+this.lineCount-C;w===0&&I<T||w===1?this._visibleLineCountTop.set(this._visibleLineCountTop.get()+I,D):this._visibleLineCountBottom.set(this._visibleLineCountBottom.get()+T,D)}showOriginalLine(C,w,D){const I=C-this.originalLineNumber,T=this.originalLineNumber+this.lineCount-C;w===0&&I<T||w===1?this._visibleLineCountTop.set(Math.min(this._visibleLineCountTop.get()+T-I,this.getMaxVisibleLineCountTop()),D):this._visibleLineCountBottom.set(Math.min(this._visibleLineCountBottom.get()+I-T,this.getMaxVisibleLineCountBottom()),D)}collapseAll(C){this._visibleLineCountTop.set(0,C),this._visibleLineCountBottom.set(0,C)}setState(C,w,D){C=Math.max(Math.min(C,this.lineCount),0),w=Math.max(Math.min(w,this.lineCount-C),0),this._visibleLineCountTop.set(C,D),this._visibleLineCountBottom.set(w,D)}}e.UnchangedRegion=o;function g(m,C,w,D){}function h(m,C,w,D){}}),define(se[810],oe([1,0,48,58,65,16,24,21,649,15,453]),function(te,e,L,k,y,E,S,p,_,v){"use strict";var b;Object.defineProperty(e,"__esModule",{value:!0}),e.SelectionAnchorSet=void 0,e.SelectionAnchorSet=new v.RawContextKey("selectionAnchorSet",!1);let a=b=class{static get(f){return f.getContribution(b.ID)}constructor(f,c){this.editor=f,this.selectionAnchorSetContextKey=e.SelectionAnchorSet.bindTo(c),this.modelChangeListener=f.onDidChangeModel(()=>this.selectionAnchorSetContextKey.reset())}setSelectionAnchor(){if(this.editor.hasModel()){const f=this.editor.getPosition();this.editor.changeDecorations(c=>{this.decorationId&&c.removeDecoration(this.decorationId),this.decorationId=c.addDecoration(S.Selection.fromPositions(f,f),{description:"selection-anchor",stickiness:1,hoverMessage:new k.MarkdownString().appendText((0,_.localize)(0,null)),className:"selection-anchor"})}),this.selectionAnchorSetContextKey.set(!!this.decorationId),(0,L.alert)((0,_.localize)(1,null,f.lineNumber,f.column))}}goToSelectionAnchor(){if(this.editor.hasModel()&&this.decorationId){const f=this.editor.getModel().getDecorationRange(this.decorationId);f&&this.editor.setPosition(f.getStartPosition())}}selectFromAnchorToCursor(){if(this.editor.hasModel()&&this.decorationId){const f=this.editor.getModel().getDecorationRange(this.decorationId);if(f){const c=this.editor.getPosition();this.editor.setSelection(S.Selection.fromPositions(f.getStartPosition(),c)),this.cancelSelectionAnchor()}}}cancelSelectionAnchor(){if(this.decorationId){const f=this.decorationId;this.editor.changeDecorations(c=>{c.removeDecoration(f),this.decorationId=void 0}),this.selectionAnchorSetContextKey.set(!1)}}dispose(){this.cancelSelectionAnchor(),this.modelChangeListener.dispose()}};a.ID="editor.contrib.selectionAnchorController",a=b=ke([ge(1,v.IContextKeyService)],a);class i extends E.EditorAction{constructor(){super({id:"editor.action.setSelectionAnchor",label:(0,_.localize)(2,null),alias:"Set Selection Anchor",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:(0,y.KeyChord)(2089,2080),weight:100}})}async run(f,c){var d;(d=a.get(c))===null||d===void 0||d.setSelectionAnchor()}}class n extends E.EditorAction{constructor(){super({id:"editor.action.goToSelectionAnchor",label:(0,_.localize)(3,null),alias:"Go to Selection Anchor",precondition:e.SelectionAnchorSet})}async run(f,c){var d;(d=a.get(c))===null||d===void 0||d.goToSelectionAnchor()}}class t extends E.EditorAction{constructor(){super({id:"editor.action.selectFromAnchorToCursor",label:(0,_.localize)(4,null),alias:"Select from Anchor to Cursor",precondition:e.SelectionAnchorSet,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:(0,y.KeyChord)(2089,2089),weight:100}})}async run(f,c){var d;(d=a.get(c))===null||d===void 0||d.selectFromAnchorToCursor()}}class r extends E.EditorAction{constructor(){super({id:"editor.action.cancelSelectionAnchor",label:(0,_.localize)(5,null),alias:"Cancel Selection Anchor",precondition:e.SelectionAnchorSet,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:9,weight:100}})}async run(f,c){var d;(d=a.get(c))===null||d===void 0||d.cancelSelectionAnchor()}}(0,E.registerEditorContribution)(a.ID,a,4),(0,E.registerEditorAction)(i),(0,E.registerEditorAction)(n),(0,E.registerEditorAction)(t),(0,E.registerEditorAction)(r)}),define(se[811],oe([1,0,16,21,552,651]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class S extends L.EditorAction{constructor(b,a){super(a),this.left=b}run(b,a){if(!a.hasModel())return;const i=[],n=a.getSelections();for(const t of n)i.push(new y.MoveCaretCommand(t,this.left));a.pushUndoStop(),a.executeCommands(this.id,i),a.pushUndoStop()}}class p extends S{constructor(){super(!0,{id:"editor.action.moveCarretLeftAction",label:E.localize(0,null),alias:"Move Selected Text Left",precondition:k.EditorContextKeys.writable})}}class _ extends S{constructor(){super(!1,{id:"editor.action.moveCarretRightAction",label:E.localize(1,null),alias:"Move Selected Text Right",precondition:k.EditorContextKeys.writable})}}(0,L.registerEditorAction)(p),(0,L.registerEditorAction)(_)}),define(se[812],oe([1,0,16,130,206,5,21,652]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class _ extends L.EditorAction{constructor(){super({id:"editor.action.transposeLetters",label:p.localize(0,null),alias:"Transpose Letters",precondition:S.EditorContextKeys.writable,kbOpts:{kbExpr:S.EditorContextKeys.textInputFocus,primary:0,mac:{primary:306},weight:100}})}run(b,a){if(!a.hasModel())return;const i=a.getModel(),n=[],t=a.getSelections();for(const r of t){if(!r.isEmpty())continue;const u=r.startLineNumber,f=r.startColumn,c=i.getLineMaxColumn(u);if(u===1&&(f===1||f===2&&c===2))continue;const d=f===c?r.getPosition():y.MoveOperations.rightPosition(i,r.getPosition().lineNumber,r.getPosition().column),s=y.MoveOperations.leftPosition(i,d),l=y.MoveOperations.leftPosition(i,s),o=i.getValueInRange(E.Range.fromPositions(l,s)),g=i.getValueInRange(E.Range.fromPositions(s,d)),h=E.Range.fromPositions(l,d);n.push(new k.ReplaceCommand(h,g+o))}n.length>0&&(a.pushUndoStop(),a.executeCommands(this.id,n),a.pushUndoStop())}}(0,L.registerEditorAction)(_)}),define(se[813],oe([1,0,65,16,5,21,32,301,554,663,30]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class a extends k.EditorAction{constructor(f,c){super(c),this._type=f}run(f,c){const d=f.get(S.ILanguageConfigurationService);if(!c.hasModel())return;const s=c.getModel(),l=[],o=s.getOptions(),g=c.getOption(23),h=c.getSelections().map((C,w)=>({selection:C,index:w,ignoreFirstLine:!1}));h.sort((C,w)=>y.Range.compareRangesUsingStarts(C.selection,w.selection));let m=h[0];for(let C=1;C<h.length;C++){const w=h[C];m.selection.endLineNumber===w.selection.startLineNumber&&(m.index<w.index?w.ignoreFirstLine=!0:(m.ignoreFirstLine=!0,m=w))}for(const C of h)l.push(new _.LineCommentCommand(d,C.selection,o.tabSize,this._type,g.insertSpace,g.ignoreEmptyLines,C.ignoreFirstLine));c.pushUndoStop(),c.executeCommands(this.id,l),c.pushUndoStop()}}class i extends a{constructor(){super(0,{id:"editor.action.commentLine",label:v.localize(0,null),alias:"Toggle Line Comment",precondition:E.EditorContextKeys.writable,kbOpts:{kbExpr:E.EditorContextKeys.editorTextFocus,primary:2138,weight:100},menuOpts:{menuId:b.MenuId.MenubarEditMenu,group:"5_insert",title:v.localize(1,null),order:1}})}}class n extends a{constructor(){super(1,{id:"editor.action.addCommentLine",label:v.localize(2,null),alias:"Add Line Comment",precondition:E.EditorContextKeys.writable,kbOpts:{kbExpr:E.EditorContextKeys.editorTextFocus,primary:(0,L.KeyChord)(2089,2081),weight:100}})}}class t extends a{constructor(){super(2,{id:"editor.action.removeCommentLine",label:v.localize(3,null),alias:"Remove Line Comment",precondition:E.EditorContextKeys.writable,kbOpts:{kbExpr:E.EditorContextKeys.editorTextFocus,primary:(0,L.KeyChord)(2089,2099),weight:100}})}}class r extends k.EditorAction{constructor(){super({id:"editor.action.blockComment",label:v.localize(4,null),alias:"Toggle Block Comment",precondition:E.EditorContextKeys.writable,kbOpts:{kbExpr:E.EditorContextKeys.editorTextFocus,primary:1567,linux:{primary:3103},weight:100},menuOpts:{menuId:b.MenuId.MenubarEditMenu,group:"5_insert",title:v.localize(5,null),order:2}})}run(f,c){const d=f.get(S.ILanguageConfigurationService);if(!c.hasModel())return;const s=c.getOption(23),l=[],o=c.getSelections();for(const g of o)l.push(new p.BlockCommentCommand(g,s.insertSpace,d));c.pushUndoStop(),c.executeCommands(this.id,l),c.pushUndoStop()}}(0,k.registerEditorAction)(i),(0,k.registerEditorAction)(n),(0,k.registerEditorAction)(t),(0,k.registerEditorAction)(r)}),define(se[814],oe([1,0,2,16,21,665]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorRedo=e.CursorUndo=e.CursorUndoRedoController=void 0;class S{constructor(i){this.selections=i}equals(i){const n=this.selections.length,t=i.selections.length;if(n!==t)return!1;for(let r=0;r<n;r++)if(!this.selections[r].equalsSelection(i.selections[r]))return!1;return!0}}class p{constructor(i,n,t){this.cursorState=i,this.scrollTop=n,this.scrollLeft=t}}class _ extends L.Disposable{static get(i){return i.getContribution(_.ID)}constructor(i){super(),this._editor=i,this._isCursorUndoRedo=!1,this._undoStack=[],this._redoStack=[],this._register(i.onDidChangeModel(n=>{this._undoStack=[],this._redoStack=[]})),this._register(i.onDidChangeModelContent(n=>{this._undoStack=[],this._redoStack=[]})),this._register(i.onDidChangeCursorSelection(n=>{if(this._isCursorUndoRedo||!n.oldSelections||n.oldModelVersionId!==n.modelVersionId)return;const t=new S(n.oldSelections);this._undoStack.length>0&&this._undoStack[this._undoStack.length-1].cursorState.equals(t)||(this._undoStack.push(new p(t,i.getScrollTop(),i.getScrollLeft())),this._redoStack=[],this._undoStack.length>50&&this._undoStack.shift())}))}cursorUndo(){!this._editor.hasModel()||this._undoStack.length===0||(this._redoStack.push(new p(new S(this._editor.getSelections()),this._editor.getScrollTop(),this._editor.getScrollLeft())),this._applyState(this._undoStack.pop()))}cursorRedo(){!this._editor.hasModel()||this._redoStack.length===0||(this._undoStack.push(new p(new S(this._editor.getSelections()),this._editor.getScrollTop(),this._editor.getScrollLeft())),this._applyState(this._redoStack.pop()))}_applyState(i){this._isCursorUndoRedo=!0,this._editor.setSelections(i.cursorState.selections),this._editor.setScrollPosition({scrollTop:i.scrollTop,scrollLeft:i.scrollLeft}),this._isCursorUndoRedo=!1}}e.CursorUndoRedoController=_,_.ID="editor.contrib.cursorUndoRedoController";class v extends k.EditorAction{constructor(){super({id:"cursorUndo",label:E.localize(0,null),alias:"Cursor Undo",precondition:void 0,kbOpts:{kbExpr:y.EditorContextKeys.textInputFocus,primary:2099,weight:100}})}run(i,n,t){var r;(r=_.get(n))===null||r===void 0||r.cursorUndo()}}e.CursorUndo=v;class b extends k.EditorAction{constructor(){super({id:"cursorRedo",label:E.localize(1,null),alias:"Cursor Redo",precondition:void 0})}run(i,n,t){var r;(r=_.get(n))===null||r===void 0||r.cursorRedo()}}e.CursorRedo=b,(0,k.registerEditorContribution)(_.ID,_,0),(0,k.registerEditorAction)(v),(0,k.registerEditorAction)(b)}),define(se[815],oe([1,0,16,15,19,66,8,45,671]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorKeybindingCancellationTokenSource=void 0;const v=(0,S.createDecorator)("IEditorCancelService"),b=new k.RawContextKey("cancellableOperation",!1,(0,_.localize)(0,null));(0,p.registerSingleton)(v,class{constructor(){this._tokens=new WeakMap}add(i,n){let t=this._tokens.get(i);t||(t=i.invokeWithinContext(u=>{const f=b.bindTo(u.get(k.IContextKeyService)),c=new E.LinkedList;return{key:f,tokens:c}}),this._tokens.set(i,t));let r;return t.key.set(!0),r=t.tokens.push(n),()=>{r&&(r(),t.key.set(!t.tokens.isEmpty()),r=void 0)}}cancel(i){const n=this._tokens.get(i);if(!n)return;const t=n.tokens.pop();t&&(t.cancel(),n.key.set(!n.tokens.isEmpty()))}},1);class a extends y.CancellationTokenSource{constructor(n,t){super(t),this.editor=n,this._unregister=n.invokeWithinContext(r=>r.get(v).add(n,this))}dispose(){this._unregister(),super.dispose()}}e.EditorKeybindingCancellationTokenSource=a,(0,L.registerEditorCommand)(new class extends L.EditorCommand{constructor(){super({id:"editor.cancelOperation",kbOpts:{weight:100,primary:9},precondition:b})}runEditorCommand(i,n){i.get(v).cancel(n)}})}),define(se[105],oe([1,0,11,5,19,2,815]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TextModelCancellationTokenSource=e.EditorStateCancellationTokenSource=e.EditorState=void 0;class p{constructor(a,i){if(this.flags=i,this.flags&1){const n=a.getModel();this.modelVersionId=n?L.format("{0}#{1}",n.uri.toString(),n.getVersionId()):null}else this.modelVersionId=null;this.flags&4?this.position=a.getPosition():this.position=null,this.flags&2?this.selection=a.getSelection():this.selection=null,this.flags&8?(this.scrollLeft=a.getScrollLeft(),this.scrollTop=a.getScrollTop()):(this.scrollLeft=-1,this.scrollTop=-1)}_equals(a){if(!(a instanceof p))return!1;const i=a;return!(this.modelVersionId!==i.modelVersionId||this.scrollLeft!==i.scrollLeft||this.scrollTop!==i.scrollTop||!this.position&&i.position||this.position&&!i.position||this.position&&i.position&&!this.position.equals(i.position)||!this.selection&&i.selection||this.selection&&!i.selection||this.selection&&i.selection&&!this.selection.equalsRange(i.selection))}validate(a){return this._equals(new p(a,this.flags))}}e.EditorState=p;class _ extends S.EditorKeybindingCancellationTokenSource{constructor(a,i,n,t){super(a,t),this._listener=new E.DisposableStore,i&4&&this._listener.add(a.onDidChangeCursorPosition(r=>{(!n||!k.Range.containsPosition(n,r.position))&&this.cancel()})),i&2&&this._listener.add(a.onDidChangeCursorSelection(r=>{(!n||!k.Range.containsRange(n,r.selection))&&this.cancel()})),i&8&&this._listener.add(a.onDidScrollChange(r=>this.cancel())),i&1&&(this._listener.add(a.onDidChangeModel(r=>this.cancel())),this._listener.add(a.onDidChangeModelContent(r=>this.cancel())))}dispose(){this._listener.dispose(),super.dispose()}}e.EditorStateCancellationTokenSource=_;class v extends y.CancellationTokenSource{constructor(a,i){super(i),this._listener=a.onDidChangeContent(()=>this.cancel())}dispose(){this._listener.dispose(),super.dispose()}}e.TextModelCancellationTokenSource=v}),define(se[140],oe([1,0,13,19,12,2,22,136,5,24,18,51,105,654,25,50,88,81,116]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.applyCodeAction=e.ApplyCodeActionReason=e.getCodeActions=e.fixAllCommandId=e.organizeImportsCommandId=e.sourceActionCommandId=e.refactorCommandId=e.autoFixCommandId=e.quickFixCommandId=e.codeActionCommandId=void 0,e.codeActionCommandId="editor.action.codeAction",e.quickFixCommandId="editor.action.quickFix",e.autoFixCommandId="editor.action.autoFix",e.refactorCommandId="editor.action.refactor",e.sourceActionCommandId="editor.action.sourceAction",e.organizeImportsCommandId="editor.action.organizeImports",e.fixAllCommandId="editor.action.fixAll";class d extends E.Disposable{static codeActionsPreferredComparator(I,T){return I.isPreferred&&!T.isPreferred?-1:!I.isPreferred&&T.isPreferred?1:0}static codeActionsComparator({action:I},{action:T}){return I.isAI&&!T.isAI?1:!I.isAI&&T.isAI?-1:(0,L.isNonEmptyArray)(I.diagnostics)?(0,L.isNonEmptyArray)(T.diagnostics)?d.codeActionsPreferredComparator(I,T):-1:(0,L.isNonEmptyArray)(T.diagnostics)?1:d.codeActionsPreferredComparator(I,T)}constructor(I,T,A){super(),this.documentation=T,this._register(A),this.allActions=[...I].sort(d.codeActionsComparator),this.validActions=this.allActions.filter(({action:P})=>!P.disabled)}get hasAutoFix(){return this.validActions.some(({action:I})=>!!I.kind&&c.CodeActionKind.QuickFix.contains(new c.CodeActionKind(I.kind))&&!!I.isPreferred)}get hasAIFix(){return this.validActions.some(({action:I})=>!!I.isAI)}get allAIFixes(){return this.validActions.every(({action:I})=>!!I.isAI)}}const s={actions:[],documentation:void 0};async function l(D,I,T,A,P,N){var M;const R=A.filter||{},x={...R,excludes:[...R.excludes||[],c.CodeActionKind.Notebook]},O={only:(M=R.include)===null||M===void 0?void 0:M.value,trigger:A.type},B=new i.TextModelCancellationTokenSource(I,N),W=A.type===2,V=o(D,I,W?x:R),K=new E.DisposableStore,F=V.map(async ie=>{try{P.report(ie);const ae=await ie.provideCodeActions(I,T,O,B.token);if(ae&&K.add(ae),B.token.isCancellationRequested)return s;const ne=(ae?.actions||[]).filter(J=>J&&(0,c.filtersAction)(R,J)),$=h(ie,ne,R.include);return{actions:ne.map(J=>new c.CodeActionItem(J,ie)),documentation:$}}catch(ae){if((0,y.isCancellationError)(ae))throw ae;return(0,y.onUnexpectedExternalError)(ae),s}}),q=D.onDidChange(()=>{const ie=D.all(I);(0,L.equals)(ie,V)||B.cancel()});try{const ie=await Promise.all(F),ae=ie.map($=>$.actions).flat(),ne=[...(0,L.coalesce)(ie.map($=>$.documentation)),...g(D,I,A,ae)];return new d(ae,ne,K)}finally{q.dispose(),B.dispose()}}e.getCodeActions=l;function o(D,I,T){return D.all(I).filter(A=>A.providedCodeActionKinds?A.providedCodeActionKinds.some(P=>(0,c.mayIncludeActionsOfKind)(T,new c.CodeActionKind(P))):!0)}function*g(D,I,T,A){var P,N,M;if(I&&A.length)for(const R of D.all(I))R._getAdditionalMenuItems&&(yield*(P=R._getAdditionalMenuItems)===null||P===void 0?void 0:P.call(R,{trigger:T.type,only:(M=(N=T.filter)===null||N===void 0?void 0:N.include)===null||M===void 0?void 0:M.value},A.map(x=>x.action)))}function h(D,I,T){if(!D.documentation)return;const A=D.documentation.map(P=>({kind:new c.CodeActionKind(P.kind),command:P.command}));if(T){let P;for(const N of A)N.kind.contains(T)&&(P?P.kind.contains(N.kind)&&(P=N):P=N);if(P)return P?.command}for(const P of I)if(P.kind){for(const N of A)if(N.kind.contains(new c.CodeActionKind(P.kind)))return N.command}}var m;(function(D){D.OnSave="onSave",D.FromProblemsView="fromProblemsView",D.FromCodeActions="fromCodeActions",D.FromAILightbulb="fromAILightbulb"})(m||(e.ApplyCodeActionReason=m={}));async function C(D,I,T,A,P=k.CancellationToken.None){var N;const M=D.get(p.IBulkEditService),R=D.get(t.ICommandService),x=D.get(f.ITelemetryService),O=D.get(r.INotificationService);if(x.publicLog2("codeAction.applyCodeAction",{codeActionTitle:I.action.title,codeActionKind:I.action.kind,codeActionIsPreferred:!!I.action.isPreferred,reason:T}),await I.resolve(P),!P.isCancellationRequested&&!(!((N=I.action.edit)===null||N===void 0)&&N.edits.length&&!(await M.apply(I.action.edit,{editor:A?.editor,label:I.action.title,quotableLabel:I.action.title,code:"undoredo.codeAction",respectAutoSaveConfig:T!==m.OnSave,showPreview:A?.preview})).isApplied)&&I.action.command)try{await R.executeCommand(I.action.command.id,...I.action.command.arguments||[])}catch(B){const W=w(B);O.error(typeof W=="string"?W:n.localize(0,null))}}e.applyCodeAction=C;function w(D){return typeof D=="string"?D:D instanceof Error&&typeof D.message=="string"?D.message:void 0}t.CommandsRegistry.registerCommand("_executeCodeActionProvider",async function(D,I,T,A,P){if(!(I instanceof S.URI))throw(0,y.illegalArgument)();const{codeActionProvider:N}=D.get(b.ILanguageFeaturesService),M=D.get(a.IModelService).getModel(I);if(!M)throw(0,y.illegalArgument)();const R=v.Selection.isISelection(T)?v.Selection.liftSelection(T):_.Range.isIRange(T)?M.validateRange(T):void 0;if(!R)throw(0,y.illegalArgument)();const x=typeof A=="string"?new c.CodeActionKind(A):void 0,O=await l(N,M,R,{type:1,triggerAction:c.CodeActionTriggerSource.Default,filter:{includeSourceActions:!0,include:x}},u.Progress.None,k.CancellationToken.None),B=[],W=Math.min(O.validActions.length,typeof P=="number"?P:0);for(let V=0;V<W;V++)B.push(O.validActions[V].resolve(k.CancellationToken.None));try{return await Promise.all(B),O.validActions.map(V=>V.action)}finally{setTimeout(()=>O.dispose(),100)}})}),define(se[816],oe([1,0,99,140,116,34]),function(te,e,L,k,y,E){"use strict";var S;Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionKeybindingResolver=void 0;let p=S=class{constructor(v){this.keybindingService=v}getResolver(){const v=new L.Lazy(()=>this.keybindingService.getKeybindings().filter(b=>S.codeActionCommands.indexOf(b.command)>=0).filter(b=>b.resolvedKeybinding).map(b=>{let a=b.commandArgs;return b.command===k.organizeImportsCommandId?a={kind:y.CodeActionKind.SourceOrganizeImports.value}:b.command===k.fixAllCommandId&&(a={kind:y.CodeActionKind.SourceFixAll.value}),{resolvedKeybinding:b.resolvedKeybinding,...y.CodeActionCommandArgs.fromUser(a,{kind:y.CodeActionKind.None,apply:"never"})}}));return b=>{if(b.kind){const a=this.bestKeybindingForCodeAction(b,v.value);return a?.resolvedKeybinding}}}bestKeybindingForCodeAction(v,b){if(!v.kind)return;const a=new y.CodeActionKind(v.kind);return b.filter(i=>i.kind.contains(a)).filter(i=>i.preferred?v.isPreferred:!0).reduceRight((i,n)=>i?i.kind.contains(n.kind)?n:i:n,void 0)}};e.CodeActionKeybindingResolver=p,p.codeActionCommands=[k.refactorCommandId,k.codeActionCommandId,k.sourceActionCommandId,k.organizeImportsCommandId,k.fixAllCommandId],e.CodeActionKeybindingResolver=p=S=ke([ge(0,E.IKeybindingService)],p)}),define(se[360],oe([1,0,14,12,6,2,49,36,10,24,15,88,116,140]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionModel=e.CodeActionsState=e.APPLY_FIX_ALL_COMMAND_ID=e.SUPPORTED_CODE_ACTIONS=void 0,e.SUPPORTED_CODE_ACTIONS=new b.RawContextKey("supportedCodeAction",""),e.APPLY_FIX_ALL_COMMAND_ID="_typescript.applyFixAllCodeAction";class t extends E.Disposable{constructor(d,s,l,o=250){super(),this._editor=d,this._markerService=s,this._signalChange=l,this._delay=o,this._autoTriggerTimer=this._register(new L.TimeoutTimer),this._register(this._markerService.onMarkerChanged(g=>this._onMarkerChanges(g))),this._register(this._editor.onDidChangeCursorPosition(()=>this._tryAutoTrigger()))}trigger(d){const s=this._getRangeOfSelectionUnlessWhitespaceEnclosed(d);this._signalChange(s?{trigger:d,selection:s}:void 0)}_onMarkerChanges(d){const s=this._editor.getModel();s&&d.some(l=>(0,S.isEqual)(l,s.uri))&&this._tryAutoTrigger()}_tryAutoTrigger(){this._autoTriggerTimer.cancelAndSet(()=>{this.trigger({type:2,triggerAction:i.CodeActionTriggerSource.Default})},this._delay)}_getRangeOfSelectionUnlessWhitespaceEnclosed(d){if(!this._editor.hasModel())return;const s=this._editor.getSelection();if(d.type===1)return s;const l=this._editor.getOption(64).enabled;if(l!==p.ShowLightbulbIconMode.Off){{if(l===p.ShowLightbulbIconMode.On)return s;if(l===p.ShowLightbulbIconMode.OnCode){if(!s.isEmpty())return s;const g=this._editor.getModel(),{lineNumber:h,column:m}=s.getPosition(),C=g.getLineContent(h);if(C.length===0)return;if(m===1){if(/\s/.test(C[0]))return}else if(m===g.getLineMaxColumn(h)){if(/\s/.test(C[C.length-1]))return}else if(/\s/.test(C[m-2])&&/\s/.test(C[m-1]))return}}return s}}}var r;(function(c){c.Empty={type:0};class d{constructor(l,o,g){this.trigger=l,this.position=o,this._cancellablePromise=g,this.type=1,this.actions=g.catch(h=>{if((0,k.isCancellationError)(h))return u;throw h})}cancel(){this._cancellablePromise.cancel()}}c.Triggered=d})(r||(e.CodeActionsState=r={}));const u=Object.freeze({allActions:[],validActions:[],dispose:()=>{},documentation:[],hasAutoFix:!1,hasAIFix:!1,allAIFixes:!1});class f extends E.Disposable{constructor(d,s,l,o,g,h){super(),this._editor=d,this._registry=s,this._markerService=l,this._progressService=g,this._configurationService=h,this._codeActionOracle=this._register(new E.MutableDisposable),this._state=r.Empty,this._onDidChangeState=this._register(new y.Emitter),this.onDidChangeState=this._onDidChangeState.event,this._disposed=!1,this._supportedCodeActions=e.SUPPORTED_CODE_ACTIONS.bindTo(o),this._register(this._editor.onDidChangeModel(()=>this._update())),this._register(this._editor.onDidChangeModelLanguage(()=>this._update())),this._register(this._registry.onDidChange(()=>this._update())),this._register(this._editor.onDidChangeConfiguration(m=>{m.hasChanged(64)&&this._update()})),this._update()}dispose(){this._disposed||(this._disposed=!0,super.dispose(),this.setState(r.Empty,!0))}_settingEnabledNearbyQuickfixes(){var d;const s=(d=this._editor)===null||d===void 0?void 0:d.getModel();return this._configurationService?this._configurationService.getValue("editor.codeActionWidget.includeNearbyQuickFixes",{resource:s?.uri}):!1}_update(){if(this._disposed)return;this._codeActionOracle.value=void 0,this.setState(r.Empty);const d=this._editor.getModel();if(d&&this._registry.has(d)&&!this._editor.getOption(90)){const s=this._registry.all(d).flatMap(l=>{var o;return(o=l.providedCodeActionKinds)!==null&&o!==void 0?o:[]});this._supportedCodeActions.set(s.join(" ")),this._codeActionOracle.value=new t(this._editor,this._markerService,l=>{var o;if(!l){this.setState(r.Empty);return}const g=l.selection.getStartPosition(),h=(0,L.createCancelablePromise)(async m=>{var C,w,D,I,T,A,P,N,M,R;if(this._settingEnabledNearbyQuickfixes()&&l.trigger.type===1&&(l.trigger.triggerAction===i.CodeActionTriggerSource.QuickFix||!((w=(C=l.trigger.filter)===null||C===void 0?void 0:C.include)===null||w===void 0)&&w.contains(i.CodeActionKind.QuickFix))){const x=await(0,n.getCodeActions)(this._registry,d,l.selection,l.trigger,a.Progress.None,m),O=[...x.allActions];if(m.isCancellationRequested)return u;const B=(D=x.validActions)===null||D===void 0?void 0:D.some(V=>V.action.kind?i.CodeActionKind.QuickFix.contains(new i.CodeActionKind(V.action.kind)):!1),W=this._markerService.read({resource:d.uri});if(B){for(const V of x.validActions)!((T=(I=V.action.command)===null||I===void 0?void 0:I.arguments)===null||T===void 0)&&T.some(K=>typeof K=="string"&&K.includes(e.APPLY_FIX_ALL_COMMAND_ID))&&(V.action.diagnostics=[...W.filter(K=>K.relatedInformation)]);return{validActions:x.validActions,allActions:O,documentation:x.documentation,hasAutoFix:x.hasAutoFix,hasAIFix:x.hasAIFix,allAIFixes:x.allAIFixes,dispose:()=>{x.dispose()}}}else if(!B&&W.length>0){const V=l.selection.getPosition();let K=V,F=Number.MAX_VALUE;const q=[...x.validActions];for(const ae of W){const ne=ae.endColumn,$=ae.endLineNumber,J=ae.startLineNumber;if($===V.lineNumber||J===V.lineNumber){K=new _.Position($,ne);const Q={type:l.trigger.type,triggerAction:l.trigger.triggerAction,filter:{include:!((A=l.trigger.filter)===null||A===void 0)&&A.include?(P=l.trigger.filter)===null||P===void 0?void 0:P.include:i.CodeActionKind.QuickFix},autoApply:l.trigger.autoApply,context:{notAvailableMessage:((N=l.trigger.context)===null||N===void 0?void 0:N.notAvailableMessage)||"",position:K}},re=new v.Selection(K.lineNumber,K.column,K.lineNumber,K.column),de=await(0,n.getCodeActions)(this._registry,d,re,Q,a.Progress.None,m);if(de.validActions.length!==0){for(const he of de.validActions)!((R=(M=he.action.command)===null||M===void 0?void 0:M.arguments)===null||R===void 0)&&R.some(me=>typeof me=="string"&&me.includes(e.APPLY_FIX_ALL_COMMAND_ID))&&(he.action.diagnostics=[...W.filter(me=>me.relatedInformation)]);x.allActions.length===0&&O.push(...de.allActions),Math.abs(V.column-ne)<F?q.unshift(...de.validActions):q.push(...de.validActions)}F=Math.abs(V.column-ne)}}const ie=q.filter((ae,ne,$)=>$.findIndex(J=>J.action.title===ae.action.title)===ne);return ie.sort((ae,ne)=>ae.action.isPreferred&&!ne.action.isPreferred?-1:!ae.action.isPreferred&&ne.action.isPreferred||ae.action.isAI&&!ne.action.isAI?1:!ae.action.isAI&&ne.action.isAI?-1:0),{validActions:ie,allActions:O,documentation:x.documentation,hasAutoFix:x.hasAutoFix,hasAIFix:x.hasAIFix,allAIFixes:x.allAIFixes,dispose:()=>{x.dispose()}}}}return(0,n.getCodeActions)(this._registry,d,l.selection,l.trigger,a.Progress.None,m)});l.trigger.type===1&&((o=this._progressService)===null||o===void 0||o.showWhile(h,250)),this.setState(new r.Triggered(l.trigger,g,h))},void 0),this._codeActionOracle.value.trigger({type:2,triggerAction:i.CodeActionTriggerSource.Default})}else this._supportedCodeActions.reset()}trigger(d){var s;(s=this._codeActionOracle.value)===null||s===void 0||s.trigger(d)}setState(d,s){d!==this._state&&(this._state.type===1&&this._state.cancel(),this._state=d,!s&&!this._disposed&&this._onDidChangeState.fire(d))}}e.CodeActionModel=f}),define(se[361],oe([1,0,7,63,26,6,2,28,210,140,659,25,34,455]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0}),e.LightBulbWidget=void 0;var t;(function(u){u.Hidden={type:0};class f{constructor(d,s,l,o){this.actions=d,this.trigger=s,this.editorPosition=l,this.widgetPosition=o,this.type=1}}u.Showing=f})(t||(t={}));let r=n=class extends S.Disposable{constructor(f,c,d){super(),this._editor=f,this._keybindingService=c,this._onClick=this._register(new E.Emitter),this.onClick=this._onClick.event,this._state=t.Hidden,this._iconClasses=[],this._domNode=L.$("div.lightBulbWidget"),this._register(k.Gesture.ignoreTarget(this._domNode)),this._editor.addContentWidget(this),this._register(this._editor.onDidChangeModelContent(s=>{const l=this._editor.getModel();(this.state.type!==1||!l||this.state.editorPosition.lineNumber>=l.getLineCount())&&this.hide()})),this._register(L.addStandardDisposableGenericMouseDownListener(this._domNode,s=>{if(this.state.type!==1)return;this._editor.focus(),s.preventDefault();const{top:l,height:o}=L.getDomNodePagePosition(this._domNode),g=this._editor.getOption(66);let h=Math.floor(g/3);this.state.widgetPosition.position!==null&&this.state.widgetPosition.position.lineNumber<this.state.editorPosition.lineNumber&&(h+=g),this._onClick.fire({x:s.posx,y:l+o+h,actions:this.state.actions,trigger:this.state.trigger})})),this._register(L.addDisposableListener(this._domNode,"mouseenter",s=>{(s.buttons&1)===1&&this.hide()})),this._register(E.Event.runAndSubscribe(this._keybindingService.onDidUpdateKeybindings,()=>{var s,l,o,g;this._preferredKbLabel=(l=(s=this._keybindingService.lookupKeybinding(v.autoFixCommandId))===null||s===void 0?void 0:s.getLabel())!==null&&l!==void 0?l:void 0,this._quickFixKbLabel=(g=(o=this._keybindingService.lookupKeybinding(v.quickFixCommandId))===null||o===void 0?void 0:o.getLabel())!==null&&g!==void 0?g:void 0,this._updateLightBulbTitleAndIcon()}))}dispose(){super.dispose(),this._editor.removeContentWidget(this)}getId(){return"LightBulbWidget"}getDomNode(){return this._domNode}getPosition(){return this._state.type===1?this._state.widgetPosition:null}update(f,c,d){if(f.validActions.length<=0)return this.hide();if(!this._editor.getOptions().get(64).enabled)return this.hide();const l=this._editor.getModel();if(!l)return this.hide();const{lineNumber:o,column:g}=l.validatePosition(d),h=l.getOptions().tabSize,m=this._editor.getOptions().get(50),C=l.getLineContent(o),w=(0,_.computeIndentLevel)(C,h),D=m.spaceWidth*w>22,I=P=>P>2&&this._editor.getTopForLineNumber(P)===this._editor.getTopForLineNumber(P-1);let T=o,A=1;if(!D){if(o>1&&!I(o-1))T-=1;else if(o<l.getLineCount()&&!I(o+1))T+=1;else if(g*m.spaceWidth<22)return this.hide();A=/^\S\s*$/.test(l.getLineContent(T))?2:1}this.state=new t.Showing(f,c,d,{position:{lineNumber:T,column:A},preference:n._posPref}),this._editor.layoutContentWidget(this)}hide(){this.state!==t.Hidden&&(this.state=t.Hidden,this._editor.layoutContentWidget(this))}get state(){return this._state}set state(f){this._state=f,this._updateLightBulbTitleAndIcon()}_updateLightBulbTitleAndIcon(){if(this._domNode.classList.remove(...this._iconClasses),this._iconClasses=[],this.state.type!==1)return;let f,c=!1;this.state.actions.allAIFixes?(f=y.Codicon.sparkleFilled,this.state.actions.validActions.length===1&&(c=!0)):this.state.actions.hasAutoFix?this.state.actions.hasAIFix?f=y.Codicon.lightbulbSparkleAutofix:f=y.Codicon.lightbulbAutofix:this.state.actions.hasAIFix?f=y.Codicon.lightbulbSparkle:f=y.Codicon.lightBulb,this._updateLightbulbTitle(this.state.actions.hasAutoFix,c),this._iconClasses=p.ThemeIcon.asClassNameArray(f),this._domNode.classList.add(...this._iconClasses)}_updateLightbulbTitle(f,c){this.state.type===1&&(c?this.title=b.localize(0,null,this.state.actions.validActions[0].action.title):f&&this._preferredKbLabel?this.title=b.localize(1,null,this._preferredKbLabel):!f&&this._quickFixKbLabel?this.title=b.localize(2,null,this._quickFixKbLabel):f||(this.title=b.localize(3,null)))}set title(f){this._domNode.title=f}};e.LightBulbWidget=r,r.ID="editor.contrib.lightbulbWidget",r._posPref=[0],e.LightBulbWidget=r=n=ke([ge(1,i.IKeybindingService),ge(2,a.ICommandService)],r)}),define(se[817],oe([1,0,16,149,676]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class E extends L.EditorAction{constructor(){super({id:"editor.action.fontZoomIn",label:y.localize(0,null),alias:"Increase Editor Font Size",precondition:void 0})}run(v,b){k.EditorZoom.setZoomLevel(k.EditorZoom.getZoomLevel()+1)}}class S extends L.EditorAction{constructor(){super({id:"editor.action.fontZoomOut",label:y.localize(1,null),alias:"Decrease Editor Font Size",precondition:void 0})}run(v,b){k.EditorZoom.setZoomLevel(k.EditorZoom.getZoomLevel()-1)}}class p extends L.EditorAction{constructor(){super({id:"editor.action.fontZoomReset",label:y.localize(2,null),alias:"Reset Editor Font Size",precondition:void 0})}run(v,b){k.EditorZoom.setZoomLevel(0)}}(0,L.registerEditorAction)(E),(0,L.registerEditorAction)(S),(0,L.registerEditorAction)(p)}),define(se[362],oe([1,0,13,19,12,52,66,20,22,105,153,10,5,24,121,68,305,25,760,8,18,64,122]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getOnTypeFormattingEdits=e.getDocumentFormattingEditsUntilResult=e.getDocumentRangeFormattingEditsUntilResult=e.formatDocumentWithProvider=e.formatDocumentWithSelectedProvider=e.formatDocumentRangesWithProvider=e.formatDocumentRangesWithSelectedProvider=e.FormattingConflicts=e.getRealAndSyntheticDocumentFormattersOrdered=void 0;function g(P,N,M){const R=[],x=new c.ExtensionIdentifierSet,O=P.ordered(M);for(const W of O)R.push(W),W.extensionId&&x.add(W.extensionId);const B=N.ordered(M);for(const W of B){if(W.extensionId){if(x.has(W.extensionId))continue;x.add(W.extensionId)}R.push({displayName:W.displayName,extensionId:W.extensionId,provideDocumentFormattingEdits(V,K,F){return W.provideDocumentRangeFormattingEdits(V,V.getFullModelRange(),K,F)}})}return R}e.getRealAndSyntheticDocumentFormattersOrdered=g;class h{static setFormatterSelector(N){return{dispose:h._selectors.unshift(N)}}static async select(N,M,R,x){if(N.length===0)return;const O=E.Iterable.first(h._selectors);if(O)return await O(N,M,R,x)}}e.FormattingConflicts=h,h._selectors=new S.LinkedList;async function m(P,N,M,R,x,O,B){const W=P.get(d.IInstantiationService),{documentRangeFormattingEditProvider:V}=P.get(s.ILanguageFeaturesService),K=(0,b.isCodeEditor)(N)?N.getModel():N,F=V.ordered(K),q=await h.select(F,K,R,2);q&&(x.report(q),await W.invokeFunction(C,q,N,M,O,B))}e.formatDocumentRangesWithSelectedProvider=m;async function C(P,N,M,R,x,O){var B,W;const V=P.get(t.IEditorWorkerService),K=P.get(l.ILogService),F=P.get(o.IAudioCueService);let q,ie;(0,b.isCodeEditor)(M)?(q=M.getModel(),ie=new v.EditorStateCancellationTokenSource(M,5,void 0,x)):(q=M,ie=new v.TextModelCancellationTokenSource(M,x));const ae=[];let ne=0;for(const de of(0,L.asArray)(R).sort(i.Range.compareRangesUsingStarts))ne>0&&i.Range.areIntersectingOrTouching(ae[ne-1],de)?ae[ne-1]=i.Range.fromPositions(ae[ne-1].getStartPosition(),de.getEndPosition()):ne=ae.push(de);const $=async de=>{var he,me;K.trace("[format][provideDocumentRangeFormattingEdits] (request)",(he=N.extensionId)===null||he===void 0?void 0:he.value,de);const X=await N.provideDocumentRangeFormattingEdits(q,de,q.getFormattingOptions(),ie.token)||[];return K.trace("[format][provideDocumentRangeFormattingEdits] (response)",(me=N.extensionId)===null||me===void 0?void 0:me.value,X),X},J=(de,he)=>{if(!de.length||!he.length)return!1;const me=de.reduce((X,U)=>i.Range.plusRange(X,U.range),de[0].range);if(!he.some(X=>i.Range.intersectRanges(me,X.range)))return!1;for(const X of de)for(const U of he)if(i.Range.intersectRanges(X.range,U.range))return!0;return!1},Q=[],re=[];try{if(typeof N.provideDocumentRangesFormattingEdits=="function"){K.trace("[format][provideDocumentRangeFormattingEdits] (request)",(B=N.extensionId)===null||B===void 0?void 0:B.value,ae);const de=await N.provideDocumentRangesFormattingEdits(q,ae,q.getFormattingOptions(),ie.token)||[];K.trace("[format][provideDocumentRangeFormattingEdits] (response)",(W=N.extensionId)===null||W===void 0?void 0:W.value,de),re.push(de)}else{for(const de of ae){if(ie.token.isCancellationRequested)return!0;re.push(await $(de))}for(let de=0;de<ae.length;++de)for(let he=de+1;he<ae.length;++he){if(ie.token.isCancellationRequested)return!0;if(J(re[de],re[he])){const me=i.Range.plusRange(ae[de],ae[he]),X=await $(me);ae.splice(he,1),ae.splice(de,1),ae.push(me),re.splice(he,1),re.splice(de,1),re.push(X),de=0,he=0}}}for(const de of re){if(ie.token.isCancellationRequested)return!0;const he=await V.computeMoreMinimalEdits(q.uri,de);he&&Q.push(...he)}}finally{ie.dispose()}if(Q.length===0)return!1;if((0,b.isCodeEditor)(M))u.FormattingEdit.execute(M,Q,!0),M.revealPositionInCenterIfOutsideViewport(M.getPosition(),1);else{const[{range:de}]=Q,he=new n.Selection(de.startLineNumber,de.startColumn,de.endLineNumber,de.endColumn);q.pushEditOperations([he],Q.map(me=>({text:me.text,range:i.Range.lift(me.range),forceMoveMarkers:!0})),me=>{for(const{range:X}of me)if(i.Range.areIntersectingOrTouching(X,he))return[new n.Selection(X.startLineNumber,X.startColumn,X.endLineNumber,X.endColumn)];return null})}return F.playAudioCue(o.AudioCue.format,{userGesture:O}),!0}e.formatDocumentRangesWithProvider=C;async function w(P,N,M,R,x,O){const B=P.get(d.IInstantiationService),W=P.get(s.ILanguageFeaturesService),V=(0,b.isCodeEditor)(N)?N.getModel():N,K=g(W.documentFormattingEditProvider,W.documentRangeFormattingEditProvider,V),F=await h.select(K,V,M,1);F&&(R.report(F),await B.invokeFunction(D,F,N,M,x,O))}e.formatDocumentWithSelectedProvider=w;async function D(P,N,M,R,x,O){const B=P.get(t.IEditorWorkerService),W=P.get(o.IAudioCueService);let V,K;(0,b.isCodeEditor)(M)?(V=M.getModel(),K=new v.EditorStateCancellationTokenSource(M,5,void 0,x)):(V=M,K=new v.TextModelCancellationTokenSource(M,x));let F;try{const q=await N.provideDocumentFormattingEdits(V,V.getFormattingOptions(),K.token);if(F=await B.computeMoreMinimalEdits(V.uri,q),K.token.isCancellationRequested)return!0}finally{K.dispose()}if(!F||F.length===0)return!1;if((0,b.isCodeEditor)(M))u.FormattingEdit.execute(M,F,R!==2),R!==2&&M.revealPositionInCenterIfOutsideViewport(M.getPosition(),1);else{const[{range:q}]=F,ie=new n.Selection(q.startLineNumber,q.startColumn,q.endLineNumber,q.endColumn);V.pushEditOperations([ie],F.map(ae=>({text:ae.text,range:i.Range.lift(ae.range),forceMoveMarkers:!0})),ae=>{for(const{range:ne}of ae)if(i.Range.areIntersectingOrTouching(ne,ie))return[new n.Selection(ne.startLineNumber,ne.startColumn,ne.endLineNumber,ne.endColumn)];return null})}return W.playAudioCue(o.AudioCue.format,{userGesture:O}),!0}e.formatDocumentWithProvider=D;async function I(P,N,M,R,x,O){const B=N.documentRangeFormattingEditProvider.ordered(M);for(const W of B){const V=await Promise.resolve(W.provideDocumentRangeFormattingEdits(M,R,x,O)).catch(y.onUnexpectedExternalError);if((0,L.isNonEmptyArray)(V))return await P.computeMoreMinimalEdits(M.uri,V)}}e.getDocumentRangeFormattingEditsUntilResult=I;async function T(P,N,M,R,x){const O=g(N.documentFormattingEditProvider,N.documentRangeFormattingEditProvider,M);for(const B of O){const W=await Promise.resolve(B.provideDocumentFormattingEdits(M,R,x)).catch(y.onUnexpectedExternalError);if((0,L.isNonEmptyArray)(W))return await P.computeMoreMinimalEdits(M.uri,W)}}e.getDocumentFormattingEditsUntilResult=T;function A(P,N,M,R,x,O,B){const W=N.onTypeFormattingEditProvider.ordered(M);return W.length===0||W[0].autoFormatTriggerCharacters.indexOf(x)<0?Promise.resolve(void 0):Promise.resolve(W[0].provideOnTypeFormattingEdits(M,R,x,O,B)).catch(y.onUnexpectedExternalError).then(V=>P.computeMoreMinimalEdits(M.uri,V))}e.getOnTypeFormattingEdits=A,f.CommandsRegistry.registerCommand("_executeFormatRangeProvider",async function(P,...N){const[M,R,x]=N;(0,p.assertType)(_.URI.isUri(M)),(0,p.assertType)(i.Range.isIRange(R));const O=P.get(r.ITextModelService),B=P.get(t.IEditorWorkerService),W=P.get(s.ILanguageFeaturesService),V=await O.createModelReference(M);try{return I(B,W,V.object.textEditorModel,i.Range.lift(R),x,k.CancellationToken.None)}finally{V.dispose()}}),f.CommandsRegistry.registerCommand("_executeFormatDocumentProvider",async function(P,...N){const[M,R]=N;(0,p.assertType)(_.URI.isUri(M));const x=P.get(r.ITextModelService),O=P.get(t.IEditorWorkerService),B=P.get(s.ILanguageFeaturesService),W=await x.createModelReference(M);try{return T(O,B,W.object.textEditorModel,R,k.CancellationToken.None)}finally{W.dispose()}}),f.CommandsRegistry.registerCommand("_executeFormatOnTypeProvider",async function(P,...N){const[M,R,x,O]=N;(0,p.assertType)(_.URI.isUri(M)),(0,p.assertType)(a.Position.isIPosition(R)),(0,p.assertType)(typeof x=="string");const B=P.get(r.ITextModelService),W=P.get(t.IEditorWorkerService),V=P.get(s.ILanguageFeaturesService),K=await B.createModelReference(M);try{return A(W,V,K.object.textEditorModel,a.Position.lift(R),x,O,k.CancellationToken.None)}finally{K.dispose()}})}),define(se[818],oe([1,0,13,19,12,65,2,16,33,128,5,21,121,18,362,305,677,122,25,15,8,88]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FormatOnType=void 0;let o=class{constructor(w,D,I,T){this._editor=w,this._languageFeaturesService=D,this._workerService=I,this._audioCueService=T,this._disposables=new S.DisposableStore,this._sessionDisposables=new S.DisposableStore,this._disposables.add(D.onTypeFormattingEditProvider.onDidChange(this._update,this)),this._disposables.add(w.onDidChangeModel(()=>this._update())),this._disposables.add(w.onDidChangeModelLanguage(()=>this._update())),this._disposables.add(w.onDidChangeConfiguration(A=>{A.hasChanged(56)&&this._update()})),this._update()}dispose(){this._disposables.dispose(),this._sessionDisposables.dispose()}_update(){if(this._sessionDisposables.clear(),!this._editor.getOption(56)||!this._editor.hasModel())return;const w=this._editor.getModel(),[D]=this._languageFeaturesService.onTypeFormattingEditProvider.ordered(w);if(!D||!D.autoFormatTriggerCharacters)return;const I=new v.CharacterSet;for(const T of D.autoFormatTriggerCharacters)I.add(T.charCodeAt(0));this._sessionDisposables.add(this._editor.onDidType(T=>{const A=T.charCodeAt(T.length-1);I.has(A)&&this._trigger(String.fromCharCode(A))}))}_trigger(w){if(!this._editor.hasModel()||this._editor.getSelections().length>1||!this._editor.getSelection().isEmpty())return;const D=this._editor.getModel(),I=this._editor.getPosition(),T=new k.CancellationTokenSource,A=this._editor.onDidChangeModelContent(P=>{if(P.isFlush){T.cancel(),A.dispose();return}for(let N=0,M=P.changes.length;N<M;N++)if(P.changes[N].range.endLineNumber<=I.lineNumber){T.cancel(),A.dispose();return}});(0,t.getOnTypeFormattingEdits)(this._workerService,this._languageFeaturesService,D,I,w,D.getFormattingOptions(),T.token).then(P=>{T.token.isCancellationRequested||(0,L.isNonEmptyArray)(P)&&(this._audioCueService.playAudioCue(f.AudioCue.format,{userGesture:!1}),r.FormattingEdit.execute(this._editor,P,!0))}).finally(()=>{A.dispose()})}};e.FormatOnType=o,o.ID="editor.contrib.autoFormat",e.FormatOnType=o=ke([ge(1,n.ILanguageFeaturesService),ge(2,i.IEditorWorkerService),ge(3,f.IAudioCueService)],o);let g=class{constructor(w,D,I){this.editor=w,this._languageFeaturesService=D,this._instantiationService=I,this._callOnDispose=new S.DisposableStore,this._callOnModel=new S.DisposableStore,this._callOnDispose.add(w.onDidChangeConfiguration(()=>this._update())),this._callOnDispose.add(w.onDidChangeModel(()=>this._update())),this._callOnDispose.add(w.onDidChangeModelLanguage(()=>this._update())),this._callOnDispose.add(D.documentRangeFormattingEditProvider.onDidChange(this._update,this))}dispose(){this._callOnDispose.dispose(),this._callOnModel.dispose()}_update(){this._callOnModel.clear(),this.editor.getOption(55)&&this.editor.hasModel()&&this._languageFeaturesService.documentRangeFormattingEditProvider.has(this.editor.getModel())&&this._callOnModel.add(this.editor.onDidPaste(({range:w})=>this._trigger(w)))}_trigger(w){this.editor.hasModel()&&(this.editor.getSelections().length>1||this._instantiationService.invokeFunction(t.formatDocumentRangesWithSelectedProvider,this.editor,w,2,l.Progress.None,k.CancellationToken.None,!1).catch(y.onUnexpectedError))}};g.ID="editor.contrib.formatOnPaste",g=ke([ge(1,n.ILanguageFeaturesService),ge(2,s.IInstantiationService)],g);class h extends p.EditorAction{constructor(){super({id:"editor.action.formatDocument",label:u.localize(0,null),alias:"Format Document",precondition:d.ContextKeyExpr.and(a.EditorContextKeys.notInCompositeEditor,a.EditorContextKeys.writable,a.EditorContextKeys.hasDocumentFormattingProvider),kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:1572,linux:{primary:3111},weight:100},contextMenuOpts:{group:"1_modification",order:1.3}})}async run(w,D){if(D.hasModel()){const I=w.get(s.IInstantiationService);await w.get(l.IEditorProgressService).showWhile(I.invokeFunction(t.formatDocumentWithSelectedProvider,D,1,l.Progress.None,k.CancellationToken.None,!0),250)}}}class m extends p.EditorAction{constructor(){super({id:"editor.action.formatSelection",label:u.localize(1,null),alias:"Format Selection",precondition:d.ContextKeyExpr.and(a.EditorContextKeys.writable,a.EditorContextKeys.hasDocumentSelectionFormattingProvider),kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2084),weight:100},contextMenuOpts:{when:a.EditorContextKeys.hasNonEmptySelection,group:"1_modification",order:1.31}})}async run(w,D){if(!D.hasModel())return;const I=w.get(s.IInstantiationService),T=D.getModel(),A=D.getSelections().map(N=>N.isEmpty()?new b.Range(N.startLineNumber,1,N.startLineNumber,T.getLineMaxColumn(N.startLineNumber)):N);await w.get(l.IEditorProgressService).showWhile(I.invokeFunction(t.formatDocumentRangesWithSelectedProvider,D,A,1,l.Progress.None,k.CancellationToken.None,!0),250)}}(0,p.registerEditorContribution)(o.ID,o,2),(0,p.registerEditorContribution)(g.ID,g,2),(0,p.registerEditorAction)(h),(0,p.registerEditorAction)(m),c.CommandsRegistry.registerCommand("editor.action.format",async C=>{const w=C.get(_.ICodeEditorService).getFocusedCodeEditor();if(!w||!w.hasModel())return;const D=C.get(c.ICommandService);w.getSelection().isEmpty()?await D.executeCommand("editor.action.formatDocument"):await D.executeCommand("editor.action.formatSelection")})}),define(se[252],oe([1,0,13,19,12,16,18,161]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getReferencesAtPosition=e.getTypeDefinitionsAtPosition=e.getImplementationsAtPosition=e.getDeclarationsAtPosition=e.getDefinitionsAtPosition=void 0;async function _(r,u,f,c){const s=f.ordered(r).map(o=>Promise.resolve(c(o,r,u)).then(void 0,g=>{(0,y.onUnexpectedExternalError)(g)})),l=await Promise.all(s);return(0,L.coalesce)(l.flat())}function v(r,u,f,c){return _(u,f,r,(d,s,l)=>d.provideDefinition(s,l,c))}e.getDefinitionsAtPosition=v;function b(r,u,f,c){return _(u,f,r,(d,s,l)=>d.provideDeclaration(s,l,c))}e.getDeclarationsAtPosition=b;function a(r,u,f,c){return _(u,f,r,(d,s,l)=>d.provideImplementation(s,l,c))}e.getImplementationsAtPosition=a;function i(r,u,f,c){return _(u,f,r,(d,s,l)=>d.provideTypeDefinition(s,l,c))}e.getTypeDefinitionsAtPosition=i;function n(r,u,f,c,d){return _(u,f,r,async(s,l,o)=>{const g=await s.provideReferences(l,o,{includeDeclaration:!0},d);if(!c||!g||g.length!==2)return g;const h=await s.provideReferences(l,o,{includeDeclaration:!1},d);return h&&h.length===1?h:g})}e.getReferencesAtPosition=n;async function t(r){const u=await r(),f=new p.ReferencesModel(u,""),c=f.references.map(d=>d.link);return f.dispose(),c}(0,E.registerModelAndPositionCommand)("_executeDefinitionProvider",(r,u,f)=>{const c=r.get(S.ILanguageFeaturesService),d=v(c.definitionProvider,u,f,k.CancellationToken.None);return t(()=>d)}),(0,E.registerModelAndPositionCommand)("_executeTypeDefinitionProvider",(r,u,f)=>{const c=r.get(S.ILanguageFeaturesService),d=i(c.typeDefinitionProvider,u,f,k.CancellationToken.None);return t(()=>d)}),(0,E.registerModelAndPositionCommand)("_executeDeclarationProvider",(r,u,f)=>{const c=r.get(S.ILanguageFeaturesService),d=b(c.declarationProvider,u,f,k.CancellationToken.None);return t(()=>d)}),(0,E.registerModelAndPositionCommand)("_executeReferenceProvider",(r,u,f)=>{const c=r.get(S.ILanguageFeaturesService),d=n(c.referenceProvider,u,f,!1,k.CancellationToken.None);return t(()=>d)}),(0,E.registerModelAndPositionCommand)("_executeImplementationProvider",(r,u,f)=>{const c=r.get(S.ILanguageFeaturesService),d=a(c.implementationProvider,u,f,k.CancellationToken.None);return t(()=>d)})}),define(se[819],oe([1,0,6,2,49,16,33,5,686,15,45,8,34,124,50]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ISymbolNavigationService=e.ctxHasSymbols=void 0,e.ctxHasSymbols=new v.RawContextKey("hasSymbols",!1,(0,_.localize)(0,null)),e.ISymbolNavigationService=(0,a.createDecorator)("ISymbolNavigationService");let r=class{constructor(c,d,s,l){this._editorService=d,this._notificationService=s,this._keybindingService=l,this._currentModel=void 0,this._currentIdx=-1,this._ignoreEditorChange=!1,this._ctxHasSymbols=e.ctxHasSymbols.bindTo(c)}reset(){var c,d;this._ctxHasSymbols.reset(),(c=this._currentState)===null||c===void 0||c.dispose(),(d=this._currentMessage)===null||d===void 0||d.dispose(),this._currentModel=void 0,this._currentIdx=-1}put(c){const d=c.parent.parent;if(d.references.length<=1){this.reset();return}this._currentModel=d,this._currentIdx=d.references.indexOf(c),this._ctxHasSymbols.set(!0),this._showMessage();const s=new u(this._editorService),l=s.onDidChange(o=>{if(this._ignoreEditorChange)return;const g=this._editorService.getActiveCodeEditor();if(!g)return;const h=g.getModel(),m=g.getPosition();if(!h||!m)return;let C=!1,w=!1;for(const D of d.references)if((0,y.isEqual)(D.uri,h.uri))C=!0,w=w||p.Range.containsPosition(D.range,m);else if(C)break;(!C||!w)&&this.reset()});this._currentState=(0,k.combinedDisposable)(s,l)}revealNext(c){if(!this._currentModel)return Promise.resolve();this._currentIdx+=1,this._currentIdx%=this._currentModel.references.length;const d=this._currentModel.references[this._currentIdx];return this._showMessage(),this._ignoreEditorChange=!0,this._editorService.openCodeEditor({resource:d.uri,options:{selection:p.Range.collapseToStart(d.range),selectionRevealType:3}},c).finally(()=>{this._ignoreEditorChange=!1})}_showMessage(){var c;(c=this._currentMessage)===null||c===void 0||c.dispose();const d=this._keybindingService.lookupKeybinding("editor.gotoNextSymbolFromResult"),s=d?(0,_.localize)(1,null,this._currentIdx+1,this._currentModel.references.length,d.getLabel()):(0,_.localize)(2,null,this._currentIdx+1,this._currentModel.references.length);this._currentMessage=this._notificationService.status(s)}};r=ke([ge(0,v.IContextKeyService),ge(1,S.ICodeEditorService),ge(2,t.INotificationService),ge(3,i.IKeybindingService)],r),(0,b.registerSingleton)(e.ISymbolNavigationService,r,1),(0,E.registerEditorCommand)(new class extends E.EditorCommand{constructor(){super({id:"editor.gotoNextSymbolFromResult",precondition:e.ctxHasSymbols,kbOpts:{weight:100,primary:70}})}runEditorCommand(f,c){return f.get(e.ISymbolNavigationService).revealNext(c)}}),n.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"editor.gotoNextSymbolFromResult.cancel",weight:100,when:e.ctxHasSymbols,primary:9,handler(f){f.get(e.ISymbolNavigationService).reset()}});let u=class{constructor(c){this._listener=new Map,this._disposables=new k.DisposableStore,this._onDidChange=new L.Emitter,this.onDidChange=this._onDidChange.event,this._disposables.add(c.onCodeEditorRemove(this._onDidRemoveEditor,this)),this._disposables.add(c.onCodeEditorAdd(this._onDidAddEditor,this)),c.listCodeEditors().forEach(this._onDidAddEditor,this)}dispose(){this._disposables.dispose(),this._onDidChange.dispose(),(0,k.dispose)(this._listener.values())}_onDidAddEditor(c){this._listener.set(c,(0,k.combinedDisposable)(c.onDidChangeCursorPosition(d=>this._onDidChange.fire({editor:c})),c.onDidChangeModelContent(d=>this._onDidChange.fire({editor:c}))))}_onDidRemoveEditor(c){var d;(d=this._listener.get(c))===null||d===void 0||d.dispose(),this._listener.delete(c)}};u=ke([ge(0,S.ICodeEditorService)],u)}),define(se[363],oe([1,0,14,19,12,16,18]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getHoverPromise=e.getHover=e.HoverProviderResult=void 0;class p{constructor(n,t,r){this.provider=n,this.hover=t,this.ordinal=r}}e.HoverProviderResult=p;async function _(i,n,t,r,u){try{const f=await Promise.resolve(i.provideHover(t,r,u));if(f&&a(f))return new p(i,f,n)}catch(f){(0,y.onUnexpectedExternalError)(f)}}function v(i,n,t,r){const f=i.ordered(n).map((c,d)=>_(c,d,n,t,r));return L.AsyncIterableObject.fromPromises(f).coalesce()}e.getHover=v;function b(i,n,t,r){return v(i,n,t,r).map(u=>u.hover).toPromise()}e.getHoverPromise=b,(0,E.registerModelAndPositionCommand)("_executeHoverProvider",(i,n,t)=>{const r=i.get(S.ILanguageFeaturesService);return b(r.hoverProvider,n,t,k.CancellationToken.None)});function a(i){const n=typeof i.range<"u",t=typeof i.contents<"u"&&i.contents&&i.contents.length>0;return n&&t}}),define(se[253],oe([1,0,7,13,14,58,2,104,10,5,43,363,688,27,57,18]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.renderMarkdownHovers=e.MarkdownHoverParticipant=e.MarkdownHover=void 0;const u=L.$;class f{constructor(l,o,g,h,m){this.owner=l,this.range=o,this.contents=g,this.isBeforeContent=h,this.ordinal=m}isValidForHoverAnchor(l){return l.type===1&&this.range.startColumn<=l.range.startColumn&&this.range.endColumn>=l.range.endColumn}}e.MarkdownHover=f;let c=class{constructor(l,o,g,h,m){this._editor=l,this._languageService=o,this._openerService=g,this._configurationService=h,this._languageFeaturesService=m,this.hoverOrdinal=3}createLoadingMessage(l){return new f(this,l.range,[new E.MarkdownString().appendText(i.localize(0,null))],!1,2e3)}computeSync(l,o){if(!this._editor.hasModel()||l.type!==1)return[];const g=this._editor.getModel(),h=l.range.startLineNumber,m=g.getLineMaxColumn(h),C=[];let w=1e3;const D=g.getLineLength(h),I=g.getLanguageIdAtPosition(l.range.startLineNumber,l.range.startColumn),T=this._editor.getOption(116),A=this._configurationService.getValue("editor.maxTokenizationLineLength",{overrideIdentifier:I});let P=!1;T>=0&&D>T&&l.range.startColumn>=T&&(P=!0,C.push(new f(this,l.range,[{value:i.localize(1,null)}],!1,w++))),!P&&typeof A=="number"&&D>=A&&C.push(new f(this,l.range,[{value:i.localize(2,null)}],!1,w++));let N=!1;for(const M of o){const R=M.range.startLineNumber===h?M.range.startColumn:1,x=M.range.endLineNumber===h?M.range.endColumn:m,O=M.options.hoverMessage;if(!O||(0,E.isEmptyMarkdownString)(O))continue;M.options.beforeContentClassName&&(N=!0);const B=new v.Range(l.range.startLineNumber,R,l.range.startLineNumber,x);C.push(new f(this,B,(0,k.asArray)(O),N,w++))}return C}computeAsync(l,o,g){if(!this._editor.hasModel()||l.type!==1)return y.AsyncIterableObject.EMPTY;const h=this._editor.getModel();if(!this._languageFeaturesService.hoverProvider.has(h))return y.AsyncIterableObject.EMPTY;const m=new _.Position(l.range.startLineNumber,l.range.startColumn);return(0,a.getHover)(this._languageFeaturesService.hoverProvider,h,m,g).filter(C=>!(0,E.isEmptyMarkdownString)(C.hover.contents)).map(C=>{const w=C.hover.range?v.Range.lift(C.hover.range):l.range;return new f(this,w,C.hover.contents,!1,C.ordinal)})}renderHoverParts(l,o){return d(l,o,this._editor,this._languageService,this._openerService)}};e.MarkdownHoverParticipant=c,e.MarkdownHoverParticipant=c=ke([ge(1,b.ILanguageService),ge(2,t.IOpenerService),ge(3,n.IConfigurationService),ge(4,r.ILanguageFeaturesService)],c);function d(s,l,o,g,h){l.sort((C,w)=>C.ordinal-w.ordinal);const m=new S.DisposableStore;for(const C of l)for(const w of C.contents){if((0,E.isEmptyMarkdownString)(w))continue;const D=u("div.hover-row.markdown-hover"),I=L.append(D,u("div.hover-contents")),T=m.add(new p.MarkdownRenderer({editor:o},g,h));m.add(T.onDidRenderAsync(()=>{I.className="hover-contents code-hover-contents",s.onContentsChanged()}));const A=m.add(T.render(w));I.appendChild(A.element),s.fragment.appendChild(D)}return m}e.renderMarkdownHovers=d}),define(se[820],oe([1,0,2,11,16,250,74,5,24,21,32,51,306,691,70,203,248]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndentationToTabsCommand=e.IndentationToSpacesCommand=e.AutoIndentOnPaste=e.AutoIndentOnPasteCommand=e.ReindentSelectedLinesAction=e.ReindentLinesAction=e.DetectIndentation=e.ChangeTabDisplaySize=e.IndentUsingSpaces=e.IndentUsingTabs=e.ChangeIndentationSizeAction=e.IndentationToTabsAction=e.IndentationToSpacesAction=e.getReindentEditOperations=void 0;function f(P,N,M,R,x){if(P.getLineCount()===1&&P.getLineMaxColumn(1)===1)return[];const O=N.getLanguageConfiguration(P.getLanguageId()).indentationRules;if(!O)return[];for(R=Math.min(R,P.getLineCount());M<=R&&O.unIndentedLinePattern;){const J=P.getLineContent(M);if(!O.unIndentedLinePattern.test(J))break;M++}if(M>R-1)return[];const{tabSize:B,indentSize:W,insertSpaces:V}=P.getOptions(),K=(J,Q)=>(Q=Q||1,E.ShiftCommand.shiftIndent(J,J.length+Q,B,W,V)),F=(J,Q)=>(Q=Q||1,E.ShiftCommand.unshiftIndent(J,J.length+Q,B,W,V)),q=[];let ie;const ae=P.getLineContent(M);let ne=ae;if(x!=null){ie=x;const J=k.getLeadingWhitespace(ae);ne=ie+ae.substring(J.length),O.decreaseIndentPattern&&O.decreaseIndentPattern.test(ne)&&(ie=F(ie),ne=ie+ae.substring(J.length)),ae!==ne&&q.push(S.EditOperation.replaceMove(new _.Selection(M,1,M,J.length+1),(0,r.normalizeIndentation)(ie,W,V)))}else ie=k.getLeadingWhitespace(ae);let $=ie;O.increaseIndentPattern&&O.increaseIndentPattern.test(ne)?($=K($),ie=K(ie)):O.indentNextLinePattern&&O.indentNextLinePattern.test(ne)&&($=K($)),M++;for(let J=M;J<=R;J++){const Q=P.getLineContent(J),re=k.getLeadingWhitespace(Q),de=$+Q.substring(re.length);O.decreaseIndentPattern&&O.decreaseIndentPattern.test(de)&&($=F($),ie=F(ie)),re!==$&&q.push(S.EditOperation.replaceMove(new _.Selection(J,1,J,re.length+1),(0,r.normalizeIndentation)($,W,V))),!(O.unIndentedLinePattern&&O.unIndentedLinePattern.test(Q))&&(O.increaseIndentPattern&&O.increaseIndentPattern.test(de)?(ie=K(ie),$=ie):O.indentNextLinePattern&&O.indentNextLinePattern.test(de)?$=K($):$=ie)}return q}e.getReindentEditOperations=f;class c extends y.EditorAction{constructor(){super({id:c.ID,label:n.localize(0,null),alias:"Convert Indentation to Spaces",precondition:v.EditorContextKeys.writable})}run(N,M){const R=M.getModel();if(!R)return;const x=R.getOptions(),O=M.getSelection();if(!O)return;const B=new T(O,x.tabSize);M.pushUndoStop(),M.executeCommands(this.id,[B]),M.pushUndoStop(),R.updateOptions({insertSpaces:!0})}}e.IndentationToSpacesAction=c,c.ID="editor.action.indentationToSpaces";class d extends y.EditorAction{constructor(){super({id:d.ID,label:n.localize(1,null),alias:"Convert Indentation to Tabs",precondition:v.EditorContextKeys.writable})}run(N,M){const R=M.getModel();if(!R)return;const x=R.getOptions(),O=M.getSelection();if(!O)return;const B=new A(O,x.tabSize);M.pushUndoStop(),M.executeCommands(this.id,[B]),M.pushUndoStop(),R.updateOptions({insertSpaces:!1})}}e.IndentationToTabsAction=d,d.ID="editor.action.indentationToTabs";class s extends y.EditorAction{constructor(N,M,R){super(R),this.insertSpaces=N,this.displaySizeOnly=M}run(N,M){const R=N.get(t.IQuickInputService),x=N.get(a.IModelService),O=M.getModel();if(!O)return;const B=x.getCreationOptions(O.getLanguageId(),O.uri,O.isForSimpleWidget),W=O.getOptions(),V=[1,2,3,4,5,6,7,8].map(F=>({id:F.toString(),label:F.toString(),description:F===B.tabSize&&F===W.tabSize?n.localize(2,null):F===B.tabSize?n.localize(3,null):F===W.tabSize?n.localize(4,null):void 0})),K=Math.min(O.getOptions().tabSize-1,7);setTimeout(()=>{R.pick(V,{placeHolder:n.localize(5,null),activeItem:V[K]}).then(F=>{if(F&&O&&!O.isDisposed()){const q=parseInt(F.label,10);this.displaySizeOnly?O.updateOptions({tabSize:q}):O.updateOptions({tabSize:q,indentSize:q,insertSpaces:this.insertSpaces})}})},50)}}e.ChangeIndentationSizeAction=s;class l extends s{constructor(){super(!1,!1,{id:l.ID,label:n.localize(6,null),alias:"Indent Using Tabs",precondition:void 0})}}e.IndentUsingTabs=l,l.ID="editor.action.indentUsingTabs";class o extends s{constructor(){super(!0,!1,{id:o.ID,label:n.localize(7,null),alias:"Indent Using Spaces",precondition:void 0})}}e.IndentUsingSpaces=o,o.ID="editor.action.indentUsingSpaces";class g extends s{constructor(){super(!0,!0,{id:g.ID,label:n.localize(8,null),alias:"Change Tab Display Size",precondition:void 0})}}e.ChangeTabDisplaySize=g,g.ID="editor.action.changeTabDisplaySize";class h extends y.EditorAction{constructor(){super({id:h.ID,label:n.localize(9,null),alias:"Detect Indentation from Content",precondition:void 0})}run(N,M){const R=N.get(a.IModelService),x=M.getModel();if(!x)return;const O=R.getCreationOptions(x.getLanguageId(),x.uri,x.isForSimpleWidget);x.detectIndentation(O.insertSpaces,O.tabSize)}}e.DetectIndentation=h,h.ID="editor.action.detectIndentation";class m extends y.EditorAction{constructor(){super({id:"editor.action.reindentlines",label:n.localize(10,null),alias:"Reindent Lines",precondition:v.EditorContextKeys.writable})}run(N,M){const R=N.get(b.ILanguageConfigurationService),x=M.getModel();if(!x)return;const O=f(x,R,1,x.getLineCount());O.length>0&&(M.pushUndoStop(),M.executeEdits(this.id,O),M.pushUndoStop())}}e.ReindentLinesAction=m;class C extends y.EditorAction{constructor(){super({id:"editor.action.reindentselectedlines",label:n.localize(11,null),alias:"Reindent Selected Lines",precondition:v.EditorContextKeys.writable})}run(N,M){const R=N.get(b.ILanguageConfigurationService),x=M.getModel();if(!x)return;const O=M.getSelections();if(O===null)return;const B=[];for(const W of O){let V=W.startLineNumber,K=W.endLineNumber;if(V!==K&&W.endColumn===1&&K--,V===1){if(V===K)continue}else V--;const F=f(x,R,V,K);B.push(...F)}B.length>0&&(M.pushUndoStop(),M.executeEdits(this.id,B),M.pushUndoStop())}}e.ReindentSelectedLinesAction=C;class w{constructor(N,M){this._initialSelection=M,this._edits=[],this._selectionId=null;for(const R of N)R.range&&typeof R.text=="string"&&this._edits.push(R)}getEditOperations(N,M){for(const x of this._edits)M.addEditOperation(p.Range.lift(x.range),x.text);let R=!1;Array.isArray(this._edits)&&this._edits.length===1&&this._initialSelection.isEmpty()&&(this._edits[0].range.startColumn===this._initialSelection.endColumn&&this._edits[0].range.startLineNumber===this._initialSelection.endLineNumber?(R=!0,this._selectionId=M.trackSelection(this._initialSelection,!0)):this._edits[0].range.endColumn===this._initialSelection.startColumn&&this._edits[0].range.endLineNumber===this._initialSelection.startLineNumber&&(R=!0,this._selectionId=M.trackSelection(this._initialSelection,!1))),R||(this._selectionId=M.trackSelection(this._initialSelection))}computeCursorState(N,M){return M.getTrackedSelection(this._selectionId)}}e.AutoIndentOnPasteCommand=w;let D=class{constructor(N,M){this.editor=N,this._languageConfigurationService=M,this.callOnDispose=new L.DisposableStore,this.callOnModel=new L.DisposableStore,this.callOnDispose.add(N.onDidChangeConfiguration(()=>this.update())),this.callOnDispose.add(N.onDidChangeModel(()=>this.update())),this.callOnDispose.add(N.onDidChangeModelLanguage(()=>this.update()))}update(){this.callOnModel.clear(),!(this.editor.getOption(12)<4||this.editor.getOption(55))&&this.editor.hasModel()&&this.callOnModel.add(this.editor.onDidPaste(({range:N})=>{this.trigger(N)}))}trigger(N){const M=this.editor.getSelections();if(M===null||M.length>1)return;const R=this.editor.getModel();if(!R||!R.tokenization.isCheapToTokenize(N.getStartPosition().lineNumber))return;const x=this.editor.getOption(12),{tabSize:O,indentSize:B,insertSpaces:W}=R.getOptions(),V=[],K={shiftIndent:ae=>E.ShiftCommand.shiftIndent(ae,ae.length+1,O,B,W),unshiftIndent:ae=>E.ShiftCommand.unshiftIndent(ae,ae.length+1,O,B,W)};let F=N.startLineNumber;for(;F<=N.endLineNumber;){if(this.shouldIgnoreLine(R,F)){F++;continue}break}if(F>N.endLineNumber)return;let q=R.getLineContent(F);if(!/\S/.test(q.substring(0,N.startColumn-1))){const ae=(0,u.getGoodIndentForLine)(x,R,R.getLanguageId(),F,K,this._languageConfigurationService);if(ae!==null){const ne=k.getLeadingWhitespace(q),$=i.getSpaceCnt(ae,O),J=i.getSpaceCnt(ne,O);if($!==J){const Q=i.generateIndent($,O,W);V.push({range:new p.Range(F,1,F,ne.length+1),text:Q}),q=Q+q.substr(ne.length)}else{const Q=(0,u.getIndentMetadata)(R,F,this._languageConfigurationService);if(Q===0||Q===8)return}}}const ie=F;for(;F<N.endLineNumber;){if(!/\S/.test(R.getLineContent(F+1))){F++;continue}break}if(F!==N.endLineNumber){const ae={tokenization:{getLineTokens:$=>R.tokenization.getLineTokens($),getLanguageId:()=>R.getLanguageId(),getLanguageIdAtPosition:($,J)=>R.getLanguageIdAtPosition($,J)},getLineContent:$=>$===ie?q:R.getLineContent($)},ne=(0,u.getGoodIndentForLine)(x,ae,R.getLanguageId(),F+1,K,this._languageConfigurationService);if(ne!==null){const $=i.getSpaceCnt(ne,O),J=i.getSpaceCnt(k.getLeadingWhitespace(R.getLineContent(F+1)),O);if($!==J){const Q=$-J;for(let re=F+1;re<=N.endLineNumber;re++){const de=R.getLineContent(re),he=k.getLeadingWhitespace(de),X=i.getSpaceCnt(he,O)+Q,U=i.generateIndent(X,O,W);U!==he&&V.push({range:new p.Range(re,1,re,he.length+1),text:U})}}}}if(V.length>0){this.editor.pushUndoStop();const ae=new w(V,this.editor.getSelection());this.editor.executeCommand("autoIndentOnPaste",ae),this.editor.pushUndoStop()}}shouldIgnoreLine(N,M){N.tokenization.forceTokenization(M);const R=N.getLineFirstNonWhitespaceColumn(M);if(R===0)return!0;const x=N.tokenization.getLineTokens(M);if(x.getCount()>0){const O=x.findTokenIndexAtOffset(R);if(O>=0&&x.getStandardTokenType(O)===1)return!0}return!1}dispose(){this.callOnDispose.dispose(),this.callOnModel.dispose()}};e.AutoIndentOnPaste=D,D.ID="editor.contrib.autoIndentOnPaste",e.AutoIndentOnPaste=D=ke([ge(1,b.ILanguageConfigurationService)],D);function I(P,N,M,R){if(P.getLineCount()===1&&P.getLineMaxColumn(1)===1)return;let x="";for(let B=0;B<M;B++)x+=" ";const O=new RegExp(x,"gi");for(let B=1,W=P.getLineCount();B<=W;B++){let V=P.getLineFirstNonWhitespaceColumn(B);if(V===0&&(V=P.getLineMaxColumn(B)),V===1)continue;const K=new p.Range(B,1,B,V),F=P.getValueInRange(K),q=R?F.replace(/\t/ig,x):F.replace(O,"	");N.addEditOperation(K,q)}}class T{constructor(N,M){this.selection=N,this.tabSize=M,this.selectionId=null}getEditOperations(N,M){this.selectionId=M.trackSelection(this.selection),I(N,M,this.tabSize,!0)}computeCursorState(N,M){return M.getTrackedSelection(this.selectionId)}}e.IndentationToSpacesCommand=T;class A{constructor(N,M){this.selection=N,this.tabSize=M,this.selectionId=null}getEditOperations(N,M){this.selectionId=M.trackSelection(this.selection),I(N,M,this.tabSize,!1)}computeCursorState(N,M){return M.getTrackedSelection(this.selectionId)}}e.IndentationToTabsCommand=A,(0,y.registerEditorContribution)(D.ID,D,2),(0,y.registerEditorAction)(c),(0,y.registerEditorAction)(d),(0,y.registerEditorAction)(l),(0,y.registerEditorAction)(o),(0,y.registerEditorAction)(g),(0,y.registerEditorAction)(h),(0,y.registerEditorAction)(m),(0,y.registerEditorAction)(C)}),define(se[821],oe([1,0,16,208,21,698]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ExpandLineSelectionAction=void 0;class S extends L.EditorAction{constructor(){super({id:"expandLineSelection",label:E.localize(0,null),alias:"Expand Line Selection",precondition:void 0,kbOpts:{weight:0,kbExpr:y.EditorContextKeys.textInputFocus,primary:2090}})}run(_,v,b){if(b=b||{},!v.hasModel())return;const a=v._getViewModel();a.model.pushStackElement(),a.setCursorStates(b.source,3,k.CursorMoveCommands.expandLineSelection(a,a.getCursorStates())),a.revealPrimaryCursor(b.source,!0)}}e.ExpandLineSelectionAction=S,(0,L.registerEditorAction)(S)}),define(se[822],oe([1,0,65,191,16,130,500,251,74,10,5,24,21,560,798,561,699,30,32]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.KebabCaseAction=e.CamelCaseAction=e.SnakeCaseAction=e.TitleCaseAction=e.LowerCaseAction=e.UpperCaseAction=e.AbstractCaseAction=e.TransposeAction=e.JoinLinesAction=e.DeleteAllRightAction=e.DeleteAllLeftAction=e.AbstractDeleteAllToBoundaryAction=e.InsertLineAfterAction=e.InsertLineBeforeAction=e.IndentLinesAction=e.DeleteLinesAction=e.TrimTrailingWhitespaceAction=e.DeleteDuplicateLinesAction=e.SortLinesDescendingAction=e.SortLinesAscendingAction=e.AbstractSortLinesAction=e.DuplicateSelectionAction=void 0;class d extends y.EditorAction{constructor(re,de){super(de),this.down=re}run(re,de){if(!de.hasModel())return;const he=de.getSelections().map((U,G)=>({selection:U,index:G,ignore:!1}));he.sort((U,G)=>b.Range.compareRangesUsingStarts(U.selection,G.selection));let me=he[0];for(let U=1;U<he.length;U++){const G=he[U];me.selection.endLineNumber===G.selection.startLineNumber&&(me.index<G.index?G.ignore=!0:(me.ignore=!0,me=G))}const X=[];for(const U of he)X.push(new n.CopyLinesCommand(U.selection,this.down,U.ignore));de.pushUndoStop(),de.executeCommands(this.id,X),de.pushUndoStop()}}class s extends d{constructor(){super(!1,{id:"editor.action.copyLinesUpAction",label:u.localize(0,null),alias:"Copy Line Up",precondition:i.EditorContextKeys.writable,kbOpts:{kbExpr:i.EditorContextKeys.editorTextFocus,primary:1552,linux:{primary:3600},weight:100},menuOpts:{menuId:f.MenuId.MenubarSelectionMenu,group:"2_line",title:u.localize(1,null),order:1}})}}class l extends d{constructor(){super(!0,{id:"editor.action.copyLinesDownAction",label:u.localize(2,null),alias:"Copy Line Down",precondition:i.EditorContextKeys.writable,kbOpts:{kbExpr:i.EditorContextKeys.editorTextFocus,primary:1554,linux:{primary:3602},weight:100},menuOpts:{menuId:f.MenuId.MenubarSelectionMenu,group:"2_line",title:u.localize(3,null),order:2}})}}class o extends y.EditorAction{constructor(){super({id:"editor.action.duplicateSelection",label:u.localize(4,null),alias:"Duplicate Selection",precondition:i.EditorContextKeys.writable,menuOpts:{menuId:f.MenuId.MenubarSelectionMenu,group:"2_line",title:u.localize(5,null),order:5}})}run(re,de,he){if(!de.hasModel())return;const me=[],X=de.getSelections(),U=de.getModel();for(const G of X)if(G.isEmpty())me.push(new n.CopyLinesCommand(G,!0));else{const z=new a.Selection(G.endLineNumber,G.endColumn,G.endLineNumber,G.endColumn);me.push(new E.ReplaceCommandThatSelectsText(z,U.getValueInRange(G)))}de.pushUndoStop(),de.executeCommands(this.id,me),de.pushUndoStop()}}e.DuplicateSelectionAction=o;class g extends y.EditorAction{constructor(re,de){super(de),this.down=re}run(re,de){const he=re.get(c.ILanguageConfigurationService),me=[],X=de.getSelections()||[],U=de.getOption(12);for(const G of X)me.push(new t.MoveLinesCommand(G,this.down,U,he));de.pushUndoStop(),de.executeCommands(this.id,me),de.pushUndoStop()}}class h extends g{constructor(){super(!1,{id:"editor.action.moveLinesUpAction",label:u.localize(6,null),alias:"Move Line Up",precondition:i.EditorContextKeys.writable,kbOpts:{kbExpr:i.EditorContextKeys.editorTextFocus,primary:528,linux:{primary:528},weight:100},menuOpts:{menuId:f.MenuId.MenubarSelectionMenu,group:"2_line",title:u.localize(7,null),order:3}})}}class m extends g{constructor(){super(!0,{id:"editor.action.moveLinesDownAction",label:u.localize(8,null),alias:"Move Line Down",precondition:i.EditorContextKeys.writable,kbOpts:{kbExpr:i.EditorContextKeys.editorTextFocus,primary:530,linux:{primary:530},weight:100},menuOpts:{menuId:f.MenuId.MenubarSelectionMenu,group:"2_line",title:u.localize(9,null),order:4}})}}class C extends y.EditorAction{constructor(re,de){super(de),this.descending=re}run(re,de){const he=de.getSelections()||[];for(const X of he)if(!r.SortLinesCommand.canRun(de.getModel(),X,this.descending))return;const me=[];for(let X=0,U=he.length;X<U;X++)me[X]=new r.SortLinesCommand(he[X],this.descending);de.pushUndoStop(),de.executeCommands(this.id,me),de.pushUndoStop()}}e.AbstractSortLinesAction=C;class w extends C{constructor(){super(!1,{id:"editor.action.sortLinesAscending",label:u.localize(10,null),alias:"Sort Lines Ascending",precondition:i.EditorContextKeys.writable})}}e.SortLinesAscendingAction=w;class D extends C{constructor(){super(!0,{id:"editor.action.sortLinesDescending",label:u.localize(11,null),alias:"Sort Lines Descending",precondition:i.EditorContextKeys.writable})}}e.SortLinesDescendingAction=D;class I extends y.EditorAction{constructor(){super({id:"editor.action.removeDuplicateLines",label:u.localize(12,null),alias:"Delete Duplicate Lines",precondition:i.EditorContextKeys.writable})}run(re,de){if(!de.hasModel())return;const he=de.getModel();if(he.getLineCount()===1&&he.getLineMaxColumn(1)===1)return;const me=[],X=[];let U=0;for(const G of de.getSelections()){const z=new Set,H=[];for(let ee=G.startLineNumber;ee<=G.endLineNumber;ee++){const le=he.getLineContent(ee);z.has(le)||(H.push(le),z.add(le))}const Y=new a.Selection(G.startLineNumber,1,G.endLineNumber,he.getLineMaxColumn(G.endLineNumber)),j=G.startLineNumber-U,Z=new a.Selection(j,1,j+H.length-1,H[H.length-1].length);me.push(_.EditOperation.replace(Y,H.join(`
+`))),X.push(Z),U+=G.endLineNumber-G.startLineNumber+1-H.length}de.pushUndoStop(),de.executeEdits(this.id,me,X),de.pushUndoStop()}}e.DeleteDuplicateLinesAction=I;class T extends y.EditorAction{constructor(){super({id:T.ID,label:u.localize(13,null),alias:"Trim Trailing Whitespace",precondition:i.EditorContextKeys.writable,kbOpts:{kbExpr:i.EditorContextKeys.editorTextFocus,primary:(0,L.KeyChord)(2089,2102),weight:100}})}run(re,de,he){let me=[];he.reason==="auto-save"&&(me=(de.getSelections()||[]).map(G=>new v.Position(G.positionLineNumber,G.positionColumn)));const X=de.getSelection();if(X===null)return;const U=new S.TrimTrailingWhitespaceCommand(X,me);de.pushUndoStop(),de.executeCommands(this.id,[U]),de.pushUndoStop()}}e.TrimTrailingWhitespaceAction=T,T.ID="editor.action.trimTrailingWhitespace";class A extends y.EditorAction{constructor(){super({id:"editor.action.deleteLines",label:u.localize(14,null),alias:"Delete Line",precondition:i.EditorContextKeys.writable,kbOpts:{kbExpr:i.EditorContextKeys.textInputFocus,primary:3113,weight:100}})}run(re,de){if(!de.hasModel())return;const he=this._getLinesToRemove(de),me=de.getModel();if(me.getLineCount()===1&&me.getLineMaxColumn(1)===1)return;let X=0;const U=[],G=[];for(let z=0,H=he.length;z<H;z++){const Y=he[z];let j=Y.startLineNumber,Z=Y.endLineNumber,ee=1,le=me.getLineMaxColumn(Z);Z<me.getLineCount()?(Z+=1,le=1):j>1&&(j-=1,ee=me.getLineMaxColumn(j)),U.push(_.EditOperation.replace(new a.Selection(j,ee,Z,le),"")),G.push(new a.Selection(j-X,Y.positionColumn,j-X,Y.positionColumn)),X+=Y.endLineNumber-Y.startLineNumber+1}de.pushUndoStop(),de.executeEdits(this.id,U,G),de.pushUndoStop()}_getLinesToRemove(re){const de=re.getSelections().map(X=>{let U=X.endLineNumber;return X.startLineNumber<X.endLineNumber&&X.endColumn===1&&(U-=1),{startLineNumber:X.startLineNumber,selectionStartColumn:X.selectionStartColumn,endLineNumber:U,positionColumn:X.positionColumn}});de.sort((X,U)=>X.startLineNumber===U.startLineNumber?X.endLineNumber-U.endLineNumber:X.startLineNumber-U.startLineNumber);const he=[];let me=de[0];for(let X=1;X<de.length;X++)me.endLineNumber+1>=de[X].startLineNumber?me.endLineNumber=de[X].endLineNumber:(he.push(me),me=de[X]);return he.push(me),he}}e.DeleteLinesAction=A;class P extends y.EditorAction{constructor(){super({id:"editor.action.indentLines",label:u.localize(15,null),alias:"Indent Line",precondition:i.EditorContextKeys.writable,kbOpts:{kbExpr:i.EditorContextKeys.editorTextFocus,primary:2142,weight:100}})}run(re,de){const he=de._getViewModel();he&&(de.pushUndoStop(),de.executeCommands(this.id,p.TypeOperations.indent(he.cursorConfig,de.getModel(),de.getSelections())),de.pushUndoStop())}}e.IndentLinesAction=P;class N extends y.EditorAction{constructor(){super({id:"editor.action.outdentLines",label:u.localize(16,null),alias:"Outdent Line",precondition:i.EditorContextKeys.writable,kbOpts:{kbExpr:i.EditorContextKeys.editorTextFocus,primary:2140,weight:100}})}run(re,de){k.CoreEditingCommands.Outdent.runEditorCommand(re,de,null)}}class M extends y.EditorAction{constructor(){super({id:"editor.action.insertLineBefore",label:u.localize(17,null),alias:"Insert Line Above",precondition:i.EditorContextKeys.writable,kbOpts:{kbExpr:i.EditorContextKeys.editorTextFocus,primary:3075,weight:100}})}run(re,de){const he=de._getViewModel();he&&(de.pushUndoStop(),de.executeCommands(this.id,p.TypeOperations.lineInsertBefore(he.cursorConfig,de.getModel(),de.getSelections())))}}e.InsertLineBeforeAction=M;class R extends y.EditorAction{constructor(){super({id:"editor.action.insertLineAfter",label:u.localize(18,null),alias:"Insert Line Below",precondition:i.EditorContextKeys.writable,kbOpts:{kbExpr:i.EditorContextKeys.editorTextFocus,primary:2051,weight:100}})}run(re,de){const he=de._getViewModel();he&&(de.pushUndoStop(),de.executeCommands(this.id,p.TypeOperations.lineInsertAfter(he.cursorConfig,de.getModel(),de.getSelections())))}}e.InsertLineAfterAction=R;class x extends y.EditorAction{run(re,de){if(!de.hasModel())return;const he=de.getSelection(),me=this._getRangesToDelete(de),X=[];for(let z=0,H=me.length-1;z<H;z++){const Y=me[z],j=me[z+1];b.Range.intersectRanges(Y,j)===null?X.push(Y):me[z+1]=b.Range.plusRange(Y,j)}X.push(me[me.length-1]);const U=this._getEndCursorState(he,X),G=X.map(z=>_.EditOperation.replace(z,""));de.pushUndoStop(),de.executeEdits(this.id,G,U),de.pushUndoStop()}}e.AbstractDeleteAllToBoundaryAction=x;class O extends x{constructor(){super({id:"deleteAllLeft",label:u.localize(19,null),alias:"Delete All Left",precondition:i.EditorContextKeys.writable,kbOpts:{kbExpr:i.EditorContextKeys.textInputFocus,primary:0,mac:{primary:2049},weight:100}})}_getEndCursorState(re,de){let he=null;const me=[];let X=0;return de.forEach(U=>{let G;if(U.endColumn===1&&X>0){const z=U.startLineNumber-X;G=new a.Selection(z,U.startColumn,z,U.startColumn)}else G=new a.Selection(U.startLineNumber,U.startColumn,U.startLineNumber,U.startColumn);X+=U.endLineNumber-U.startLineNumber,U.intersectRanges(re)?he=G:me.push(G)}),he&&me.unshift(he),me}_getRangesToDelete(re){const de=re.getSelections();if(de===null)return[];let he=de;const me=re.getModel();return me===null?[]:(he.sort(b.Range.compareRangesUsingStarts),he=he.map(X=>{if(X.isEmpty())if(X.startColumn===1){const U=Math.max(1,X.startLineNumber-1),G=X.startLineNumber===1?1:me.getLineLength(U)+1;return new b.Range(U,G,X.startLineNumber,1)}else return new b.Range(X.startLineNumber,1,X.startLineNumber,X.startColumn);else return new b.Range(X.startLineNumber,1,X.endLineNumber,X.endColumn)}),he)}}e.DeleteAllLeftAction=O;class B extends x{constructor(){super({id:"deleteAllRight",label:u.localize(20,null),alias:"Delete All Right",precondition:i.EditorContextKeys.writable,kbOpts:{kbExpr:i.EditorContextKeys.textInputFocus,primary:0,mac:{primary:297,secondary:[2068]},weight:100}})}_getEndCursorState(re,de){let he=null;const me=[];for(let X=0,U=de.length,G=0;X<U;X++){const z=de[X],H=new a.Selection(z.startLineNumber-G,z.startColumn,z.startLineNumber-G,z.startColumn);z.intersectRanges(re)?he=H:me.push(H)}return he&&me.unshift(he),me}_getRangesToDelete(re){const de=re.getModel();if(de===null)return[];const he=re.getSelections();if(he===null)return[];const me=he.map(X=>{if(X.isEmpty()){const U=de.getLineMaxColumn(X.startLineNumber);return X.startColumn===U?new b.Range(X.startLineNumber,X.startColumn,X.startLineNumber+1,1):new b.Range(X.startLineNumber,X.startColumn,X.startLineNumber,U)}return X});return me.sort(b.Range.compareRangesUsingStarts),me}}e.DeleteAllRightAction=B;class W extends y.EditorAction{constructor(){super({id:"editor.action.joinLines",label:u.localize(21,null),alias:"Join Lines",precondition:i.EditorContextKeys.writable,kbOpts:{kbExpr:i.EditorContextKeys.editorTextFocus,primary:0,mac:{primary:296},weight:100}})}run(re,de){const he=de.getSelections();if(he===null)return;let me=de.getSelection();if(me===null)return;he.sort(b.Range.compareRangesUsingStarts);const X=[],U=he.reduce((Z,ee)=>Z.isEmpty()?Z.endLineNumber===ee.startLineNumber?(me.equalsSelection(Z)&&(me=ee),ee):ee.startLineNumber>Z.endLineNumber+1?(X.push(Z),ee):new a.Selection(Z.startLineNumber,Z.startColumn,ee.endLineNumber,ee.endColumn):ee.startLineNumber>Z.endLineNumber?(X.push(Z),ee):new a.Selection(Z.startLineNumber,Z.startColumn,ee.endLineNumber,ee.endColumn));X.push(U);const G=de.getModel();if(G===null)return;const z=[],H=[];let Y=me,j=0;for(let Z=0,ee=X.length;Z<ee;Z++){const le=X[Z],ue=le.startLineNumber,ce=1;let pe=0,ve,Ce;const Se=G.getLineLength(le.endLineNumber)-le.endColumn;if(le.isEmpty()||le.startLineNumber===le.endLineNumber){const Ae=le.getStartPosition();Ae.lineNumber<G.getLineCount()?(ve=ue+1,Ce=G.getLineMaxColumn(ve)):(ve=Ae.lineNumber,Ce=G.getLineMaxColumn(Ae.lineNumber))}else ve=le.endLineNumber,Ce=G.getLineMaxColumn(ve);let _e=G.getLineContent(ue);for(let Ae=ue+1;Ae<=ve;Ae++){const xe=G.getLineContent(Ae),Be=G.getLineFirstNonWhitespaceColumn(Ae);if(Be>=1){let De=!0;_e===""&&(De=!1),De&&(_e.charAt(_e.length-1)===" "||_e.charAt(_e.length-1)==="	")&&(De=!1,_e=_e.replace(/[\s\uFEFF\xA0]+$/g," "));const Ie=xe.substr(Be-1);_e+=(De?" ":"")+Ie,De?pe=Ie.length+1:pe=Ie.length}else pe=0}const Ee=new b.Range(ue,ce,ve,Ce);if(!Ee.isEmpty()){let Ae;le.isEmpty()?(z.push(_.EditOperation.replace(Ee,_e)),Ae=new a.Selection(Ee.startLineNumber-j,_e.length-pe+1,ue-j,_e.length-pe+1)):le.startLineNumber===le.endLineNumber?(z.push(_.EditOperation.replace(Ee,_e)),Ae=new a.Selection(le.startLineNumber-j,le.startColumn,le.endLineNumber-j,le.endColumn)):(z.push(_.EditOperation.replace(Ee,_e)),Ae=new a.Selection(le.startLineNumber-j,le.startColumn,le.startLineNumber-j,_e.length-Se)),b.Range.intersectRanges(Ee,me)!==null?Y=Ae:H.push(Ae)}j+=Ee.endLineNumber-Ee.startLineNumber}H.unshift(Y),de.pushUndoStop(),de.executeEdits(this.id,z,H),de.pushUndoStop()}}e.JoinLinesAction=W;class V extends y.EditorAction{constructor(){super({id:"editor.action.transpose",label:u.localize(22,null),alias:"Transpose Characters around the Cursor",precondition:i.EditorContextKeys.writable})}run(re,de){const he=de.getSelections();if(he===null)return;const me=de.getModel();if(me===null)return;const X=[];for(let U=0,G=he.length;U<G;U++){const z=he[U];if(!z.isEmpty())continue;const H=z.getStartPosition(),Y=me.getLineMaxColumn(H.lineNumber);if(H.column>=Y){if(H.lineNumber===me.getLineCount())continue;const j=new b.Range(H.lineNumber,Math.max(1,H.column-1),H.lineNumber+1,1),Z=me.getValueInRange(j).split("").reverse().join("");X.push(new E.ReplaceCommand(new a.Selection(H.lineNumber,Math.max(1,H.column-1),H.lineNumber+1,1),Z))}else{const j=new b.Range(H.lineNumber,Math.max(1,H.column-1),H.lineNumber,H.column+1),Z=me.getValueInRange(j).split("").reverse().join("");X.push(new E.ReplaceCommandThatPreservesSelection(j,Z,new a.Selection(H.lineNumber,H.column+1,H.lineNumber,H.column+1)))}}de.pushUndoStop(),de.executeCommands(this.id,X),de.pushUndoStop()}}e.TransposeAction=V;class K extends y.EditorAction{run(re,de){const he=de.getSelections();if(he===null)return;const me=de.getModel();if(me===null)return;const X=de.getOption(129),U=[];for(const G of he)if(G.isEmpty()){const z=G.getStartPosition(),H=de.getConfiguredWordAtPosition(z);if(!H)continue;const Y=new b.Range(z.lineNumber,H.startColumn,z.lineNumber,H.endColumn),j=me.getValueInRange(Y);U.push(_.EditOperation.replace(Y,this._modifyText(j,X)))}else{const z=me.getValueInRange(G);U.push(_.EditOperation.replace(G,this._modifyText(z,X)))}de.pushUndoStop(),de.executeEdits(this.id,U),de.pushUndoStop()}}e.AbstractCaseAction=K;class F extends K{constructor(){super({id:"editor.action.transformToUppercase",label:u.localize(23,null),alias:"Transform to Uppercase",precondition:i.EditorContextKeys.writable})}_modifyText(re,de){return re.toLocaleUpperCase()}}e.UpperCaseAction=F;class q extends K{constructor(){super({id:"editor.action.transformToLowercase",label:u.localize(24,null),alias:"Transform to Lowercase",precondition:i.EditorContextKeys.writable})}_modifyText(re,de){return re.toLocaleLowerCase()}}e.LowerCaseAction=q;class ie{constructor(re,de){this._pattern=re,this._flags=de,this._actual=null,this._evaluated=!1}get(){if(!this._evaluated){this._evaluated=!0;try{this._actual=new RegExp(this._pattern,this._flags)}catch{}}return this._actual}isSupported(){return this.get()!==null}}class ae extends K{constructor(){super({id:"editor.action.transformToTitlecase",label:u.localize(25,null),alias:"Transform to Title Case",precondition:i.EditorContextKeys.writable})}_modifyText(re,de){const he=ae.titleBoundary.get();return he?re.toLocaleLowerCase().replace(he,me=>me.toLocaleUpperCase()):re}}e.TitleCaseAction=ae,ae.titleBoundary=new ie("(^|[^\\p{L}\\p{N}']|((^|\\P{L})'))\\p{L}","gmu");class ne extends K{constructor(){super({id:"editor.action.transformToSnakecase",label:u.localize(26,null),alias:"Transform to Snake Case",precondition:i.EditorContextKeys.writable})}_modifyText(re,de){const he=ne.caseBoundary.get(),me=ne.singleLetters.get();return!he||!me?re:re.replace(he,"$1_$2").replace(me,"$1_$2$3").toLocaleLowerCase()}}e.SnakeCaseAction=ne,ne.caseBoundary=new ie("(\\p{Ll})(\\p{Lu})","gmu"),ne.singleLetters=new ie("(\\p{Lu}|\\p{N})(\\p{Lu})(\\p{Ll})","gmu");class $ extends K{constructor(){super({id:"editor.action.transformToCamelcase",label:u.localize(27,null),alias:"Transform to Camel Case",precondition:i.EditorContextKeys.writable})}_modifyText(re,de){const he=$.wordBoundary.get();if(!he)return re;const me=re.split(he);return me.shift()+me.map(U=>U.substring(0,1).toLocaleUpperCase()+U.substring(1)).join("")}}e.CamelCaseAction=$,$.wordBoundary=new ie("[_\\s-]","gm");class J extends K{static isSupported(){return[this.caseBoundary,this.singleLetters,this.underscoreBoundary].every(de=>de.isSupported())}constructor(){super({id:"editor.action.transformToKebabcase",label:u.localize(28,null),alias:"Transform to Kebab Case",precondition:i.EditorContextKeys.writable})}_modifyText(re,de){const he=J.caseBoundary.get(),me=J.singleLetters.get(),X=J.underscoreBoundary.get();return!he||!me||!X?re:re.replace(X,"$1-$3").replace(he,"$1-$2").replace(me,"$1-$2").toLocaleLowerCase()}}e.KebabCaseAction=J,J.caseBoundary=new ie("(\\p{Ll})(\\p{Lu})","gmu"),J.singleLetters=new ie("(\\p{Lu}|\\p{N})(\\p{Lu}\\p{Ll})","gmu"),J.underscoreBoundary=new ie("(\\S)(_)(\\S)","gm"),(0,y.registerEditorAction)(s),(0,y.registerEditorAction)(l),(0,y.registerEditorAction)(o),(0,y.registerEditorAction)(h),(0,y.registerEditorAction)(m),(0,y.registerEditorAction)(w),(0,y.registerEditorAction)(D),(0,y.registerEditorAction)(I),(0,y.registerEditorAction)(T),(0,y.registerEditorAction)(A),(0,y.registerEditorAction)(P),(0,y.registerEditorAction)(N),(0,y.registerEditorAction)(M),(0,y.registerEditorAction)(R),(0,y.registerEditorAction)(O),(0,y.registerEditorAction)(B),(0,y.registerEditorAction)(W),(0,y.registerEditorAction)(V),(0,y.registerEditorAction)(F),(0,y.registerEditorAction)(q),ne.caseBoundary.isSupported()&&ne.singleLetters.isSupported()&&(0,y.registerEditorAction)(ne),$.wordBoundary.isSupported()&&(0,y.registerEditorAction)($),ae.titleBoundary.isSupported()&&(0,y.registerEditorAction)(ae),J.isSupported()&&(0,y.registerEditorAction)(J)}),define(se[823],oe([1,0,2,16]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class y extends L.Disposable{constructor(S){super(),this._editor=S,this._register(this._editor.onMouseDown(p=>{const _=this._editor.getOption(116);_>=0&&p.target.type===6&&p.target.position.column>=_&&this._editor.updateOptions({stopRenderingLineAfter:-1})}))}}y.ID="editor.contrib.longLinesHelper",(0,k.registerEditorContribution)(y.ID,y,2)}),define(se[166],oe([1,0,186,48,6,58,2,16,5,104,702,15,57,7,472]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";var t;Object.defineProperty(e,"__esModule",{value:!0}),e.MessageController=void 0;let r=t=class{static get(d){return d.getContribution(t.ID)}constructor(d,s,l){this._openerService=l,this._messageWidget=new S.MutableDisposable,this._messageListeners=new S.DisposableStore,this._mouseOverMessage=!1,this._editor=d,this._visible=t.MESSAGE_VISIBLE.bindTo(s)}dispose(){var d;(d=this._message)===null||d===void 0||d.dispose(),this._messageListeners.dispose(),this._messageWidget.dispose(),this._visible.reset()}showMessage(d,s){(0,k.alert)((0,E.isMarkdownString)(d)?d.value:d),this._visible.set(!0),this._messageWidget.clear(),this._messageListeners.clear(),this._message=(0,E.isMarkdownString)(d)?(0,L.renderMarkdown)(d,{actionHandler:{callback:o=>{this.closeMessage(),(0,v.openLinkFromMarkdown)(this._openerService,o,(0,E.isMarkdownString)(d)?d.isTrusted:void 0)},disposables:this._messageListeners}}):void 0,this._messageWidget.value=new f(this._editor,s,typeof d=="string"?d:this._message.element),this._messageListeners.add(y.Event.debounce(this._editor.onDidBlurEditorText,(o,g)=>g,0)(()=>{this._mouseOverMessage||this._messageWidget.value&&n.isAncestor(n.getActiveElement(),this._messageWidget.value.getDomNode())||this.closeMessage()})),this._messageListeners.add(this._editor.onDidChangeCursorPosition(()=>this.closeMessage())),this._messageListeners.add(this._editor.onDidDispose(()=>this.closeMessage())),this._messageListeners.add(this._editor.onDidChangeModel(()=>this.closeMessage())),this._messageListeners.add(n.addDisposableListener(this._messageWidget.value.getDomNode(),n.EventType.MOUSE_ENTER,()=>this._mouseOverMessage=!0,!0)),this._messageListeners.add(n.addDisposableListener(this._messageWidget.value.getDomNode(),n.EventType.MOUSE_LEAVE,()=>this._mouseOverMessage=!1,!0));let l;this._messageListeners.add(this._editor.onMouseMove(o=>{o.target.position&&(l?l.containsPosition(o.target.position)||this.closeMessage():l=new _.Range(s.lineNumber-3,1,o.target.position.lineNumber+3,1))}))}closeMessage(){this._visible.reset(),this._messageListeners.clear(),this._messageWidget.value&&this._messageListeners.add(f.fadeOut(this._messageWidget.value))}};e.MessageController=r,r.ID="editor.contrib.messageController",r.MESSAGE_VISIBLE=new a.RawContextKey("messageVisible",!1,b.localize(0,null)),e.MessageController=r=t=ke([ge(1,a.IContextKeyService),ge(2,i.IOpenerService)],r);const u=p.EditorCommand.bindToContribution(r.get);(0,p.registerEditorCommand)(new u({id:"leaveEditorMessage",precondition:r.MESSAGE_VISIBLE,handler:c=>c.closeMessage(),kbOpts:{weight:100+30,primary:9}}));class f{static fadeOut(d){const s=()=>{d.dispose(),clearTimeout(l),d.getDomNode().removeEventListener("animationend",s)},l=setTimeout(s,110);return d.getDomNode().addEventListener("animationend",s),d.getDomNode().classList.add("fadeOut"),{dispose:s}}constructor(d,{lineNumber:s,column:l},o){this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this._editor=d,this._editor.revealLinesInCenterIfOutsideViewport(s,s,0),this._position={lineNumber:s,column:l},this._domNode=document.createElement("div"),this._domNode.classList.add("monaco-editor-overlaymessage"),this._domNode.style.marginLeft="-6px";const g=document.createElement("div");g.classList.add("anchor","top"),this._domNode.appendChild(g);const h=document.createElement("div");typeof o=="string"?(h.classList.add("message"),h.textContent=o):(o.classList.add("message"),h.appendChild(o)),this._domNode.appendChild(h);const m=document.createElement("div");m.classList.add("anchor","below"),this._domNode.appendChild(m),this._editor.addContentWidget(this),this._domNode.classList.add("fadeIn")}dispose(){this._editor.removeContentWidget(this)}getId(){return"messageoverlay"}getDomNode(){return this._domNode}getPosition(){return{position:this._position,preference:[1,2],positionAffinity:1}}afterRender(d){this._domNode.classList.toggle("below",d===2)}}(0,p.registerEditorContribution)(r.ID,r,4)}),define(se[824],oe([1,0,58,2,16,166,709]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReadOnlyMessageController=void 0;class p extends k.Disposable{constructor(v){super(),this.editor=v,this._register(this.editor.onDidAttemptReadOnlyEdit(()=>this._onDidAttemptReadOnlyEdit()))}_onDidAttemptReadOnlyEdit(){const v=E.MessageController.get(this.editor);if(v&&this.editor.hasModel()){let b=this.editor.getOptions().get(91);b||(this.editor.isSimpleWidget?b=new L.MarkdownString(S.localize(0,null)):b=new L.MarkdownString(S.localize(1,null))),v.showMessage(b,this.editor.getPosition())}}}e.ReadOnlyMessageController=p,p.ID="editor.contrib.readOnlyMessageController",(0,y.registerEditorContribution)(p.ID,p,2)}),define(se[825],oe([1,0,13,19,12,16,10,5,24,21,309,562,712,30,25,18,68,20,22]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c){"use strict";var d;Object.defineProperty(e,"__esModule",{value:!0}),e.provideSelectionRanges=e.SmartSelectController=void 0;class s{constructor(w,D){this.index=w,this.ranges=D}mov(w){const D=this.index+(w?1:-1);if(D<0||D>=this.ranges.length)return this;const I=new s(D,this.ranges);return I.ranges[D].equalsRange(this.ranges[this.index])?I.mov(w):I}}let l=d=class{static get(w){return w.getContribution(d.ID)}constructor(w,D){this._editor=w,this._languageFeaturesService=D,this._ignoreSelection=!1}dispose(){var w;(w=this._selectionListener)===null||w===void 0||w.dispose()}async run(w){if(!this._editor.hasModel())return;const D=this._editor.getSelections(),I=this._editor.getModel();if(this._state||await m(this._languageFeaturesService.selectionRangeProvider,I,D.map(A=>A.getPosition()),this._editor.getOption(112),k.CancellationToken.None).then(A=>{var P;if(!(!L.isNonEmptyArray(A)||A.length!==D.length)&&!(!this._editor.hasModel()||!L.equals(this._editor.getSelections(),D,(N,M)=>N.equalsSelection(M)))){for(let N=0;N<A.length;N++)A[N]=A[N].filter(M=>M.containsPosition(D[N].getStartPosition())&&M.containsPosition(D[N].getEndPosition())),A[N].unshift(D[N]);this._state=A.map(N=>new s(0,N)),(P=this._selectionListener)===null||P===void 0||P.dispose(),this._selectionListener=this._editor.onDidChangeCursorPosition(()=>{var N;this._ignoreSelection||((N=this._selectionListener)===null||N===void 0||N.dispose(),this._state=void 0)})}}),!this._state)return;this._state=this._state.map(A=>A.mov(w));const T=this._state.map(A=>_.Selection.fromPositions(A.ranges[A.index].getStartPosition(),A.ranges[A.index].getEndPosition()));this._ignoreSelection=!0;try{this._editor.setSelections(T)}finally{this._ignoreSelection=!1}}};e.SmartSelectController=l,l.ID="editor.contrib.smartSelectController",e.SmartSelectController=l=d=ke([ge(1,r.ILanguageFeaturesService)],l);class o extends E.EditorAction{constructor(w,D){super(D),this._forward=w}async run(w,D){const I=l.get(D);I&&await I.run(this._forward)}}class g extends o{constructor(){super(!0,{id:"editor.action.smartSelect.expand",label:i.localize(0,null),alias:"Expand Selection",precondition:void 0,kbOpts:{kbExpr:v.EditorContextKeys.editorTextFocus,primary:1553,mac:{primary:3345,secondary:[1297]},weight:100},menuOpts:{menuId:n.MenuId.MenubarSelectionMenu,group:"1_basic",title:i.localize(1,null),order:2}})}}t.CommandsRegistry.registerCommandAlias("editor.action.smartSelect.grow","editor.action.smartSelect.expand");class h extends o{constructor(){super(!1,{id:"editor.action.smartSelect.shrink",label:i.localize(2,null),alias:"Shrink Selection",precondition:void 0,kbOpts:{kbExpr:v.EditorContextKeys.editorTextFocus,primary:1551,mac:{primary:3343,secondary:[1295]},weight:100},menuOpts:{menuId:n.MenuId.MenubarSelectionMenu,group:"1_basic",title:i.localize(3,null),order:3}})}}(0,E.registerEditorContribution)(l.ID,l,4),(0,E.registerEditorAction)(g),(0,E.registerEditorAction)(h);async function m(C,w,D,I,T){const A=C.all(w).concat(new a.WordSelectionRangeProvider(I.selectSubwords));A.length===1&&A.unshift(new b.BracketSelectionRangeProvider);const P=[],N=[];for(const M of A)P.push(Promise.resolve(M.provideSelectionRanges(w,D,T)).then(R=>{if(L.isNonEmptyArray(R)&&R.length===D.length)for(let x=0;x<D.length;x++){N[x]||(N[x]=[]);for(const O of R[x])p.Range.isIRange(O.range)&&p.Range.containsPosition(O.range,D[x])&&N[x].push(p.Range.lift(O.range))}},y.onUnexpectedExternalError));return await Promise.all(P),N.map(M=>{if(M.length===0)return[];M.sort((B,W)=>S.Position.isBefore(B.getStartPosition(),W.getStartPosition())?1:S.Position.isBefore(W.getStartPosition(),B.getStartPosition())||S.Position.isBefore(B.getEndPosition(),W.getEndPosition())?-1:S.Position.isBefore(W.getEndPosition(),B.getEndPosition())?1:0);const R=[];let x;for(const B of M)(!x||p.Range.containsRange(B,x)&&!p.Range.equalsRange(B,x))&&(R.push(B),x=B);if(!I.selectLeadingAndTrailingWhitespace)return R;const O=[R[0]];for(let B=1;B<R.length;B++){const W=R[B-1],V=R[B];if(V.startLineNumber!==W.startLineNumber||V.endLineNumber!==W.endLineNumber){const K=new p.Range(W.startLineNumber,w.getLineFirstNonWhitespaceColumn(W.startLineNumber),W.endLineNumber,w.getLineLastNonWhitespaceColumn(W.endLineNumber));K.containsRange(W)&&!K.equalsRange(W)&&V.containsRange(K)&&!V.equalsRange(K)&&O.push(K);const F=new p.Range(W.startLineNumber,1,W.endLineNumber,w.getLineMaxColumn(W.endLineNumber));F.containsRange(W)&&!F.equalsRange(K)&&V.containsRange(F)&&!V.equalsRange(F)&&O.push(F)}O.push(V)}return O})}e.provideSelectionRanges=m,t.CommandsRegistry.registerCommand("_executeSelectionRangeProvider",async function(C,...w){const[D,I]=w;(0,f.assertType)(c.URI.isUri(D));const T=C.get(r.ILanguageFeaturesService).selectionRangeProvider,A=await C.get(u.ITextModelService).createModelReference(D);try{return m(T,A.object.textEditorModel,I,{selectLeadingAndTrailingWhitespace:!0,selectSubwords:!0},k.CancellationToken.None)}finally{A.dispose()}})}),define(se[826],oe([1,0,61,16,724]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class E extends k.EditorAction{constructor(){super({id:"editor.action.forceRetokenize",label:y.localize(0,null),alias:"Developer: Force Retokenize",precondition:void 0})}run(p,_){if(!_.hasModel())return;const v=_.getModel();v.tokenization.resetTokenization();const b=new L.StopWatch;v.tokenization.forceTokenization(v.getLineCount()),b.stop(),console.log(`tokenization took ${b.elapsed()}`)}}(0,k.registerEditorAction)(E)}),define(se[827],oe([1,0,2,49,16,33,726,162]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UnusualLineTerminatorsDetector=void 0;const _="ignoreUnusualLineTerminators";function v(i,n,t){i.setModelProperty(n.uri,_,t)}function b(i,n){return i.getModelProperty(n.uri,_)}let a=class extends L.Disposable{constructor(n,t,r){super(),this._editor=n,this._dialogService=t,this._codeEditorService=r,this._isPresentingDialog=!1,this._config=this._editor.getOption(125),this._register(this._editor.onDidChangeConfiguration(u=>{u.hasChanged(125)&&(this._config=this._editor.getOption(125),this._checkForUnusualLineTerminators())})),this._register(this._editor.onDidChangeModel(()=>{this._checkForUnusualLineTerminators()})),this._register(this._editor.onDidChangeModelContent(u=>{u.isUndoing||this._checkForUnusualLineTerminators()})),this._checkForUnusualLineTerminators()}async _checkForUnusualLineTerminators(){if(this._config==="off"||!this._editor.hasModel())return;const n=this._editor.getModel();if(!n.mightContainUnusualLineTerminators()||b(this._codeEditorService,n)===!0||this._editor.getOption(90))return;if(this._config==="auto"){n.removeUnusualLineTerminators(this._editor.getSelections());return}if(this._isPresentingDialog)return;let r;try{this._isPresentingDialog=!0,r=await this._dialogService.confirm({title:S.localize(0,null),message:S.localize(1,null),detail:S.localize(2,null,(0,k.basename)(n.uri)),primaryButton:S.localize(3,null),cancelButton:S.localize(4,null)})}finally{this._isPresentingDialog=!1}if(!r.confirmed){v(this._codeEditorService,n,!0);return}n.removeUnusualLineTerminators(this._editor.getSelections())}};e.UnusualLineTerminatorsDetector=a,a.ID="editor.contrib.unusualLineTerminatorsDetector",e.UnusualLineTerminatorsDetector=a=ke([ge(1,p.IDialogService),ge(2,E.ICodeEditorService)],a),(0,y.registerEditorContribution)(a.ID,a,1)}),define(se[364],oe([1,0,16,130,36,75,181,150,10,5,24,21,32,729,69,15,242]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DeleteInsideWord=e.DeleteWordRight=e.DeleteWordEndRight=e.DeleteWordStartRight=e.DeleteWordLeft=e.DeleteWordEndLeft=e.DeleteWordStartLeft=e.DeleteWordRightCommand=e.DeleteWordLeftCommand=e.DeleteWordCommand=e.CursorWordAccessibilityRightSelect=e.CursorWordAccessibilityRight=e.CursorWordRightSelect=e.CursorWordEndRightSelect=e.CursorWordStartRightSelect=e.CursorWordRight=e.CursorWordEndRight=e.CursorWordStartRight=e.CursorWordAccessibilityLeftSelect=e.CursorWordAccessibilityLeft=e.CursorWordLeftSelect=e.CursorWordEndLeftSelect=e.CursorWordStartLeftSelect=e.CursorWordLeft=e.CursorWordEndLeft=e.CursorWordStartLeft=e.WordRightCommand=e.WordLeftCommand=e.MoveWordCommand=void 0;class f extends L.EditorCommand{constructor($){super($),this._inSelectionMode=$.inSelectionMode,this._wordNavigationType=$.wordNavigationType}runEditorCommand($,J,Q){if(!J.hasModel())return;const re=(0,p.getMapForWordSeparators)(J.getOption(129)),de=J.getModel(),me=J.getSelections().map(X=>{const U=new _.Position(X.positionLineNumber,X.positionColumn),G=this._move(re,de,U,this._wordNavigationType);return this._moveTo(X,G,this._inSelectionMode)});if(de.pushStackElement(),J._getViewModel().setCursorStates("moveWordCommand",3,me.map(X=>E.CursorState.fromModelSelection(X))),me.length===1){const X=new _.Position(me[0].positionLineNumber,me[0].positionColumn);J.revealPosition(X,0)}}_moveTo($,J,Q){return Q?new b.Selection($.selectionStartLineNumber,$.selectionStartColumn,J.lineNumber,J.column):new b.Selection(J.lineNumber,J.column,J.lineNumber,J.column)}}e.MoveWordCommand=f;class c extends f{_move($,J,Q,re){return S.WordOperations.moveWordLeft($,J,Q,re)}}e.WordLeftCommand=c;class d extends f{_move($,J,Q,re){return S.WordOperations.moveWordRight($,J,Q,re)}}e.WordRightCommand=d;class s extends c{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:"cursorWordStartLeft",precondition:void 0})}}e.CursorWordStartLeft=s;class l extends c{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordEndLeft",precondition:void 0})}}e.CursorWordEndLeft=l;class o extends c{constructor(){var $;super({inSelectionMode:!1,wordNavigationType:1,id:"cursorWordLeft",precondition:void 0,kbOpts:{kbExpr:r.ContextKeyExpr.and(a.EditorContextKeys.textInputFocus,($=r.ContextKeyExpr.and(t.CONTEXT_ACCESSIBILITY_MODE_ENABLED,u.IsWindowsContext))===null||$===void 0?void 0:$.negate()),primary:2063,mac:{primary:527},weight:100}})}}e.CursorWordLeft=o;class g extends c{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:"cursorWordStartLeftSelect",precondition:void 0})}}e.CursorWordStartLeftSelect=g;class h extends c{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordEndLeftSelect",precondition:void 0})}}e.CursorWordEndLeftSelect=h;class m extends c{constructor(){var $;super({inSelectionMode:!0,wordNavigationType:1,id:"cursorWordLeftSelect",precondition:void 0,kbOpts:{kbExpr:r.ContextKeyExpr.and(a.EditorContextKeys.textInputFocus,($=r.ContextKeyExpr.and(t.CONTEXT_ACCESSIBILITY_MODE_ENABLED,u.IsWindowsContext))===null||$===void 0?void 0:$.negate()),primary:3087,mac:{primary:1551},weight:100}})}}e.CursorWordLeftSelect=m;class C extends c{constructor(){super({inSelectionMode:!1,wordNavigationType:3,id:"cursorWordAccessibilityLeft",precondition:void 0})}_move($,J,Q,re){return super._move((0,p.getMapForWordSeparators)(y.EditorOptions.wordSeparators.defaultValue),J,Q,re)}}e.CursorWordAccessibilityLeft=C;class w extends c{constructor(){super({inSelectionMode:!0,wordNavigationType:3,id:"cursorWordAccessibilityLeftSelect",precondition:void 0})}_move($,J,Q,re){return super._move((0,p.getMapForWordSeparators)(y.EditorOptions.wordSeparators.defaultValue),J,Q,re)}}e.CursorWordAccessibilityLeftSelect=w;class D extends d{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:"cursorWordStartRight",precondition:void 0})}}e.CursorWordStartRight=D;class I extends d{constructor(){var $;super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordEndRight",precondition:void 0,kbOpts:{kbExpr:r.ContextKeyExpr.and(a.EditorContextKeys.textInputFocus,($=r.ContextKeyExpr.and(t.CONTEXT_ACCESSIBILITY_MODE_ENABLED,u.IsWindowsContext))===null||$===void 0?void 0:$.negate()),primary:2065,mac:{primary:529},weight:100}})}}e.CursorWordEndRight=I;class T extends d{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordRight",precondition:void 0})}}e.CursorWordRight=T;class A extends d{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:"cursorWordStartRightSelect",precondition:void 0})}}e.CursorWordStartRightSelect=A;class P extends d{constructor(){var $;super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordEndRightSelect",precondition:void 0,kbOpts:{kbExpr:r.ContextKeyExpr.and(a.EditorContextKeys.textInputFocus,($=r.ContextKeyExpr.and(t.CONTEXT_ACCESSIBILITY_MODE_ENABLED,u.IsWindowsContext))===null||$===void 0?void 0:$.negate()),primary:3089,mac:{primary:1553},weight:100}})}}e.CursorWordEndRightSelect=P;class N extends d{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordRightSelect",precondition:void 0})}}e.CursorWordRightSelect=N;class M extends d{constructor(){super({inSelectionMode:!1,wordNavigationType:3,id:"cursorWordAccessibilityRight",precondition:void 0})}_move($,J,Q,re){return super._move((0,p.getMapForWordSeparators)(y.EditorOptions.wordSeparators.defaultValue),J,Q,re)}}e.CursorWordAccessibilityRight=M;class R extends d{constructor(){super({inSelectionMode:!0,wordNavigationType:3,id:"cursorWordAccessibilityRightSelect",precondition:void 0})}_move($,J,Q,re){return super._move((0,p.getMapForWordSeparators)(y.EditorOptions.wordSeparators.defaultValue),J,Q,re)}}e.CursorWordAccessibilityRightSelect=R;class x extends L.EditorCommand{constructor($){super($),this._whitespaceHeuristics=$.whitespaceHeuristics,this._wordNavigationType=$.wordNavigationType}runEditorCommand($,J,Q){const re=$.get(i.ILanguageConfigurationService);if(!J.hasModel())return;const de=(0,p.getMapForWordSeparators)(J.getOption(129)),he=J.getModel(),me=J.getSelections(),X=J.getOption(6),U=J.getOption(11),G=re.getLanguageConfiguration(he.getLanguageId()).getAutoClosingPairs(),z=J._getViewModel(),H=me.map(Y=>{const j=this._delete({wordSeparators:de,model:he,selection:Y,whitespaceHeuristics:this._whitespaceHeuristics,autoClosingDelete:J.getOption(9),autoClosingBrackets:X,autoClosingQuotes:U,autoClosingPairs:G,autoClosedCharacters:z.getCursorAutoClosedCharacters()},this._wordNavigationType);return new k.ReplaceCommand(j,"")});J.pushUndoStop(),J.executeCommands(this.id,H),J.pushUndoStop()}}e.DeleteWordCommand=x;class O extends x{_delete($,J){const Q=S.WordOperations.deleteWordLeft($,J);return Q||new v.Range(1,1,1,1)}}e.DeleteWordLeftCommand=O;class B extends x{_delete($,J){const Q=S.WordOperations.deleteWordRight($,J);if(Q)return Q;const re=$.model.getLineCount(),de=$.model.getLineMaxColumn(re);return new v.Range(re,de,re,de)}}e.DeleteWordRightCommand=B;class W extends O{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:0,id:"deleteWordStartLeft",precondition:a.EditorContextKeys.writable})}}e.DeleteWordStartLeft=W;class V extends O{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:2,id:"deleteWordEndLeft",precondition:a.EditorContextKeys.writable})}}e.DeleteWordEndLeft=V;class K extends O{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:0,id:"deleteWordLeft",precondition:a.EditorContextKeys.writable,kbOpts:{kbExpr:a.EditorContextKeys.textInputFocus,primary:2049,mac:{primary:513},weight:100}})}}e.DeleteWordLeft=K;class F extends B{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:0,id:"deleteWordStartRight",precondition:a.EditorContextKeys.writable})}}e.DeleteWordStartRight=F;class q extends B{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:2,id:"deleteWordEndRight",precondition:a.EditorContextKeys.writable})}}e.DeleteWordEndRight=q;class ie extends B{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:2,id:"deleteWordRight",precondition:a.EditorContextKeys.writable,kbOpts:{kbExpr:a.EditorContextKeys.textInputFocus,primary:2068,mac:{primary:532},weight:100}})}}e.DeleteWordRight=ie;class ae extends L.EditorAction{constructor(){super({id:"deleteInsideWord",precondition:a.EditorContextKeys.writable,label:n.localize(0,null),alias:"Delete Word"})}run($,J,Q){if(!J.hasModel())return;const re=(0,p.getMapForWordSeparators)(J.getOption(129)),de=J.getModel(),me=J.getSelections().map(X=>{const U=S.WordOperations.deleteInsideWord(re,de,X);return new k.ReplaceCommand(U,"")});J.pushUndoStop(),J.executeCommands(this.id,me),J.pushUndoStop()}}e.DeleteInsideWord=ae,(0,L.registerEditorCommand)(new s),(0,L.registerEditorCommand)(new l),(0,L.registerEditorCommand)(new o),(0,L.registerEditorCommand)(new g),(0,L.registerEditorCommand)(new h),(0,L.registerEditorCommand)(new m),(0,L.registerEditorCommand)(new D),(0,L.registerEditorCommand)(new I),(0,L.registerEditorCommand)(new T),(0,L.registerEditorCommand)(new A),(0,L.registerEditorCommand)(new P),(0,L.registerEditorCommand)(new N),(0,L.registerEditorCommand)(new C),(0,L.registerEditorCommand)(new w),(0,L.registerEditorCommand)(new M),(0,L.registerEditorCommand)(new R),(0,L.registerEditorCommand)(new W),(0,L.registerEditorCommand)(new V),(0,L.registerEditorCommand)(new K),(0,L.registerEditorCommand)(new F),(0,L.registerEditorCommand)(new q),(0,L.registerEditorCommand)(new ie),(0,L.registerEditorAction)(ae)}),define(se[828],oe([1,0,16,181,5,21,364,25]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorWordPartRightSelect=e.CursorWordPartRight=e.WordPartRightCommand=e.CursorWordPartLeftSelect=e.CursorWordPartLeft=e.WordPartLeftCommand=e.DeleteWordPartRight=e.DeleteWordPartLeft=void 0;class _ extends S.DeleteWordCommand{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:0,id:"deleteWordPartLeft",precondition:E.EditorContextKeys.writable,kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:0,mac:{primary:769},weight:100}})}_delete(f,c){const d=k.WordPartOperations.deleteWordPartLeft(f);return d||new y.Range(1,1,1,1)}}e.DeleteWordPartLeft=_;class v extends S.DeleteWordCommand{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:2,id:"deleteWordPartRight",precondition:E.EditorContextKeys.writable,kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:0,mac:{primary:788},weight:100}})}_delete(f,c){const d=k.WordPartOperations.deleteWordPartRight(f);if(d)return d;const s=f.model.getLineCount(),l=f.model.getLineMaxColumn(s);return new y.Range(s,l,s,l)}}e.DeleteWordPartRight=v;class b extends S.MoveWordCommand{_move(f,c,d,s){return k.WordPartOperations.moveWordPartLeft(f,c,d)}}e.WordPartLeftCommand=b;class a extends b{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:"cursorWordPartLeft",precondition:void 0,kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:0,mac:{primary:783},weight:100}})}}e.CursorWordPartLeft=a,p.CommandsRegistry.registerCommandAlias("cursorWordPartStartLeft","cursorWordPartLeft");class i extends b{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:"cursorWordPartLeftSelect",precondition:void 0,kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:0,mac:{primary:1807},weight:100}})}}e.CursorWordPartLeftSelect=i,p.CommandsRegistry.registerCommandAlias("cursorWordPartStartLeftSelect","cursorWordPartLeftSelect");class n extends S.MoveWordCommand{_move(f,c,d,s){return k.WordPartOperations.moveWordPartRight(f,c,d)}}e.WordPartRightCommand=n;class t extends n{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordPartRight",precondition:void 0,kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:0,mac:{primary:785},weight:100}})}}e.CursorWordPartRight=t;class r extends n{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordPartRightSelect",precondition:void 0,kbOpts:{kbExpr:E.EditorContextKeys.textInputFocus,primary:0,mac:{primary:1809},weight:100}})}}e.CursorWordPartRightSelect=r,(0,L.registerEditorCommand)(new _),(0,L.registerEditorCommand)(new v),(0,L.registerEditorCommand)(new a),(0,L.registerEditorCommand)(new i),(0,L.registerEditorCommand)(new t),(0,L.registerEditorCommand)(new r)}),define(se[829],oe([1,0,7,2,16,17,484]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IPadShowKeyboard=void 0;class S extends k.Disposable{constructor(v){super(),this.editor=v,this.widget=null,E.isIOS&&(this._register(v.onDidChangeConfiguration(()=>this.update())),this.update())}update(){const v=!this.editor.getOption(90);!this.widget&&v?this.widget=new p(this.editor):this.widget&&!v&&(this.widget.dispose(),this.widget=null)}dispose(){super.dispose(),this.widget&&(this.widget.dispose(),this.widget=null)}}e.IPadShowKeyboard=S,S.ID="editor.contrib.iPadShowKeyboard";class p extends k.Disposable{constructor(v){super(),this.editor=v,this._domNode=document.createElement("textarea"),this._domNode.className="iPadShowKeyboard",this._register(L.addDisposableListener(this._domNode,"touchstart",b=>{this.editor.focus()})),this._register(L.addDisposableListener(this._domNode,"focus",b=>{this.editor.focus()})),this.editor.addOverlayWidget(this)}dispose(){this.editor.removeOverlayWidget(this),super.dispose()}getId(){return p.ID}getDomNode(){return this._domNode}getPosition(){return{preference:1}}}p.ID="editor.contrib.ShowKeyboardWidget",(0,y.registerEditorContribution)(S.ID,S,3)}),define(se[830],oe([1,0,7,39,2,16,31,132,160,43,137,96,485]),function(te,e,L,k,y,E,S,p,_,v,b,a){"use strict";var i;Object.defineProperty(e,"__esModule",{value:!0});let n=i=class extends y.Disposable{static get(d){return d.getContribution(i.ID)}constructor(d,s,l){super(),this._editor=d,this._languageService=l,this._widget=null,this._register(this._editor.onDidChangeModel(o=>this.stop())),this._register(this._editor.onDidChangeModelLanguage(o=>this.stop())),this._register(S.TokenizationRegistry.onDidChange(o=>this.stop())),this._register(this._editor.onKeyUp(o=>o.keyCode===9&&this.stop()))}dispose(){this.stop(),super.dispose()}launch(){this._widget||this._editor.hasModel()&&(this._widget=new f(this._editor,this._languageService))}stop(){this._widget&&(this._widget.dispose(),this._widget=null)}};n.ID="editor.contrib.inspectTokens",n=i=ke([ge(1,b.IStandaloneThemeService),ge(2,v.ILanguageService)],n);class t extends E.EditorAction{constructor(){super({id:"editor.action.inspectTokens",label:a.InspectTokensNLS.inspectTokensAction,alias:"Developer: Inspect Tokens",precondition:void 0})}run(d,s){const l=n.get(s);l?.launch()}}function r(c){let d="";for(let s=0,l=c.length;s<l;s++){const o=c.charCodeAt(s);switch(o){case 9:d+="\u2192";break;case 32:d+="\xB7";break;default:d+=String.fromCharCode(o)}}return d}function u(c,d){const s=S.TokenizationRegistry.get(d);if(s)return s;const l=c.encodeLanguageId(d);return{getInitialState:()=>_.NullState,tokenize:(o,g,h)=>(0,_.nullTokenize)(d,h),tokenizeEncoded:(o,g,h)=>(0,_.nullTokenizeEncoded)(l,h)}}class f extends y.Disposable{constructor(d,s){super(),this.allowEditorOverflow=!0,this._editor=d,this._languageService=s,this._model=this._editor.getModel(),this._domNode=document.createElement("div"),this._domNode.className="tokens-inspect-widget",this._tokenizationSupport=u(this._languageService.languageIdCodec,this._model.getLanguageId()),this._compute(this._editor.getPosition()),this._register(this._editor.onDidChangeCursorPosition(l=>this._compute(this._editor.getPosition()))),this._editor.addContentWidget(this)}dispose(){this._editor.removeContentWidget(this),super.dispose()}getId(){return f._ID}_compute(d){const s=this._getTokensAtLine(d.lineNumber);let l=0;for(let C=s.tokens1.length-1;C>=0;C--){const w=s.tokens1[C];if(d.column-1>=w.offset){l=C;break}}let o=0;for(let C=s.tokens2.length>>>1;C>=0;C--)if(d.column-1>=s.tokens2[C<<1]){o=C;break}const g=this._model.getLineContent(d.lineNumber);let h="";if(l<s.tokens1.length){const C=s.tokens1[l].offset,w=l+1<s.tokens1.length?s.tokens1[l+1].offset:g.length;h=g.substring(C,w)}(0,L.reset)(this._domNode,(0,L.$)("h2.tm-token",void 0,r(h),(0,L.$)("span.tm-token-length",void 0,`${h.length} ${h.length===1?"char":"chars"}`))),(0,L.append)(this._domNode,(0,L.$)("hr.tokens-inspect-separator",{style:"clear:both"}));const m=(o<<1)+1<s.tokens2.length?this._decodeMetadata(s.tokens2[(o<<1)+1]):null;(0,L.append)(this._domNode,(0,L.$)("table.tm-metadata-table",void 0,(0,L.$)("tbody",void 0,(0,L.$)("tr",void 0,(0,L.$)("td.tm-metadata-key",void 0,"language"),(0,L.$)("td.tm-metadata-value",void 0,`${m?m.languageId:"-?-"}`)),(0,L.$)("tr",void 0,(0,L.$)("td.tm-metadata-key",void 0,"token type"),(0,L.$)("td.tm-metadata-value",void 0,`${m?this._tokenTypeToString(m.tokenType):"-?-"}`)),(0,L.$)("tr",void 0,(0,L.$)("td.tm-metadata-key",void 0,"font style"),(0,L.$)("td.tm-metadata-value",void 0,`${m?this._fontStyleToString(m.fontStyle):"-?-"}`)),(0,L.$)("tr",void 0,(0,L.$)("td.tm-metadata-key",void 0,"foreground"),(0,L.$)("td.tm-metadata-value",void 0,`${m?k.Color.Format.CSS.formatHex(m.foreground):"-?-"}`)),(0,L.$)("tr",void 0,(0,L.$)("td.tm-metadata-key",void 0,"background"),(0,L.$)("td.tm-metadata-value",void 0,`${m?k.Color.Format.CSS.formatHex(m.background):"-?-"}`))))),(0,L.append)(this._domNode,(0,L.$)("hr.tokens-inspect-separator")),l<s.tokens1.length&&(0,L.append)(this._domNode,(0,L.$)("span.tm-token-type",void 0,s.tokens1[l].type)),this._editor.layoutContentWidget(this)}_decodeMetadata(d){const s=S.TokenizationRegistry.getColorMap(),l=p.TokenMetadata.getLanguageId(d),o=p.TokenMetadata.getTokenType(d),g=p.TokenMetadata.getFontStyle(d),h=p.TokenMetadata.getForeground(d),m=p.TokenMetadata.getBackground(d);return{languageId:this._languageService.languageIdCodec.decodeLanguageId(l),tokenType:o,fontStyle:g,foreground:s[h],background:s[m]}}_tokenTypeToString(d){switch(d){case 0:return"Other";case 1:return"Comment";case 2:return"String";case 3:return"RegEx";default:return"??"}}_fontStyleToString(d){let s="";return d&1&&(s+="italic "),d&2&&(s+="bold "),d&4&&(s+="underline "),d&8&&(s+="strikethrough "),s.length===0&&(s="---"),s}_getTokensAtLine(d){const s=this._getStateBeforeLine(d),l=this._tokenizationSupport.tokenize(this._model.getLineContent(d),!0,s),o=this._tokenizationSupport.tokenizeEncoded(this._model.getLineContent(d),!0,s);return{startState:s,tokens1:l.tokens,tokens2:o.tokens,endState:l.endState}}_getStateBeforeLine(d){let s=this._tokenizationSupport.getInitialState();for(let l=1;l<d;l++)s=this._tokenizationSupport.tokenize(this._model.getLineContent(l),!0,s).endState;return s}getDomNode(){return this._domNode}getPosition(){return{position:this._editor.getPosition(),preference:[2,1]}}}f._ID="editor.contrib.inspectTokensWidget",(0,E.registerEditorContribution)(n.ID,n,4),(0,E.registerEditorAction)(t)}),define(se[831],oe([1,0,580,12,71,108,2,53,407,746,25,27,162,8,34,787,92,81]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f){"use strict";var c,d;Object.defineProperty(e,"__esModule",{value:!0}),e.CommandsHistory=e.AbstractCommandsQuickAccessProvider=void 0;let s=c=class extends r.PickerQuickAccessProvider{constructor(g,h,m,C,w,D){super(c.PREFIX,g),this.instantiationService=h,this.keybindingService=m,this.commandService=C,this.telemetryService=w,this.dialogService=D,this.commandsHistory=this._register(this.instantiationService.createInstance(l)),this.options=g}async _getPicks(g,h,m,C){var w,D,I,T;const A=await this.getCommandPicks(m);if(m.isCancellationRequested)return[];const P=(0,E.createSingleCallFunction)(()=>{const W=new _.TfIdfCalculator;W.updateDocuments(A.map(K=>({key:K.commandId,textChunks:[this.getTfIdfChunk(K)]})));const V=W.calculateScores(g,m);return(0,_.normalizeTfIdfScores)(V).filter(K=>K.score>c.TFIDF_THRESHOLD).slice(0,c.TFIDF_MAX_RESULTS)}),N=[];for(const W of A){const V=(w=c.WORD_FILTER(g,W.label))!==null&&w!==void 0?w:void 0,K=W.commandAlias&&(D=c.WORD_FILTER(g,W.commandAlias))!==null&&D!==void 0?D:void 0;if(V||K)W.highlights={label:V,detail:this.options.showAlias?K:void 0},N.push(W);else if(g===W.commandId)N.push(W);else if(g.length>=3){const F=P();if(m.isCancellationRequested)return[];const q=F.find(ie=>ie.key===W.commandId);q&&(W.tfIdfScore=q.score,N.push(W))}}const M=new Map;for(const W of N){const V=M.get(W.label);V?(W.description=W.commandId,V.description=V.commandId):M.set(W.label,W)}N.sort((W,V)=>{if(W.tfIdfScore&&V.tfIdfScore)return W.tfIdfScore===V.tfIdfScore?W.label.localeCompare(V.label):V.tfIdfScore-W.tfIdfScore;if(W.tfIdfScore)return 1;if(V.tfIdfScore)return-1;const K=this.commandsHistory.peek(W.commandId),F=this.commandsHistory.peek(V.commandId);if(K&&F)return K>F?-1:1;if(K)return-1;if(F)return 1;if(this.options.suggestedCommandIds){const q=this.options.suggestedCommandIds.has(W.commandId),ie=this.options.suggestedCommandIds.has(V.commandId);if(q&&ie)return 0;if(q)return-1;if(ie)return 1}return W.label.localeCompare(V.label)});const R=[];let x=!1,O=!0,B=!!this.options.suggestedCommandIds;for(let W=0;W<N.length;W++){const V=N[W];W===0&&this.commandsHistory.peek(V.commandId)&&(R.push({type:"separator",label:(0,v.localize)(0,null)}),x=!0),O&&V.tfIdfScore!==void 0&&(R.push({type:"separator",label:(0,v.localize)(1,null)}),O=!1),B&&V.tfIdfScore===void 0&&!this.commandsHistory.peek(V.commandId)&&(!((I=this.options.suggestedCommandIds)===null||I===void 0)&&I.has(V.commandId))&&(R.push({type:"separator",label:(0,v.localize)(2,null)}),x=!0,B=!1),x&&V.tfIdfScore===void 0&&!this.commandsHistory.peek(V.commandId)&&!(!((T=this.options.suggestedCommandIds)===null||T===void 0)&&T.has(V.commandId))&&(R.push({type:"separator",label:(0,v.localize)(3,null)}),x=!1),R.push(this.toCommandPick(V,C))}return this.hasAdditionalCommandPicks(g,m)?{picks:R,additionalPicks:(async()=>{var W;const V=await this.getAdditionalCommandPicks(A,N,g,m);if(m.isCancellationRequested)return[];const K=V.map(F=>this.toCommandPick(F,C));return O&&((W=K[0])===null||W===void 0?void 0:W.type)!=="separator"&&K.unshift({type:"separator",label:(0,v.localize)(4,null)}),K})()}:R}toCommandPick(g,h){if(g.type==="separator")return g;const m=this.keybindingService.lookupKeybinding(g.commandId),C=m?(0,v.localize)(5,null,g.label,m.getAriaLabel()):g.label;return{...g,ariaLabel:C,detail:this.options.showAlias&&g.commandAlias!==g.label?g.commandAlias:void 0,keybinding:m,accept:async()=>{var w,D;this.commandsHistory.push(g.commandId),this.telemetryService.publicLog2("workbenchActionExecuted",{id:g.commandId,from:(w=h?.from)!==null&&w!==void 0?w:"quick open"});try{!((D=g.args)===null||D===void 0)&&D.length?await this.commandService.executeCommand(g.commandId,...g.args):await this.commandService.executeCommand(g.commandId)}catch(I){(0,k.isCancellationError)(I)||this.dialogService.error((0,v.localize)(6,null,g.label),(0,L.toErrorMessage)(I))}}}}getTfIdfChunk({label:g,commandAlias:h,commandDescription:m}){let C=g;return h&&h!==g&&(C+=` - ${h}`),m&&m.value!==g&&(C+=` - ${m.value===m.original?m.value:`${m.value} (${m.original})`}`),C}};e.AbstractCommandsQuickAccessProvider=s,s.PREFIX=">",s.TFIDF_THRESHOLD=.5,s.TFIDF_MAX_RESULTS=5,s.WORD_FILTER=(0,y.or)(y.matchesPrefix,y.matchesWords,y.matchesContiguousSubString),e.AbstractCommandsQuickAccessProvider=s=c=ke([ge(1,n.IInstantiationService),ge(2,t.IKeybindingService),ge(3,b.ICommandService),ge(4,f.ITelemetryService),ge(5,i.IDialogService)],s);let l=d=class extends S.Disposable{constructor(g,h){super(),this.storageService=g,this.configurationService=h,this.configuredCommandsHistoryLength=0,this.updateConfiguration(),this.load(),this.registerListeners()}registerListeners(){this._register(this.configurationService.onDidChangeConfiguration(g=>this.updateConfiguration(g))),this._register(this.storageService.onWillSaveState(g=>{g.reason===u.WillSaveStateReason.SHUTDOWN&&this.saveState()}))}updateConfiguration(g){g&&!g.affectsConfiguration("workbench.commandPalette.history")||(this.configuredCommandsHistoryLength=d.getConfiguredCommandHistoryLength(this.configurationService),d.cache&&d.cache.limit!==this.configuredCommandsHistoryLength&&(d.cache.limit=this.configuredCommandsHistoryLength,d.hasChanges=!0))}load(){const g=this.storageService.get(d.PREF_KEY_CACHE,0);let h;if(g)try{h=JSON.parse(g)}catch{}const m=d.cache=new p.LRUCache(this.configuredCommandsHistoryLength,1);if(h){let C;h.usesLRU?C=h.entries:C=h.entries.sort((w,D)=>w.value-D.value),C.forEach(w=>m.set(w.key,w.value))}d.counter=this.storageService.getNumber(d.PREF_KEY_COUNTER,0,d.counter)}push(g){d.cache&&(d.cache.set(g,d.counter++),d.hasChanges=!0)}peek(g){var h;return(h=d.cache)===null||h===void 0?void 0:h.peek(g)}saveState(){if(!d.cache||!d.hasChanges)return;const g={usesLRU:!0,entries:[]};d.cache.forEach((h,m)=>g.entries.push({key:m,value:h})),this.storageService.store(d.PREF_KEY_CACHE,JSON.stringify(g),0,0),this.storageService.store(d.PREF_KEY_COUNTER,d.counter,0,0),d.hasChanges=!1}static getConfiguredCommandHistoryLength(g){var h,m;const w=(m=(h=g.getValue().workbench)===null||h===void 0?void 0:h.commandPalette)===null||m===void 0?void 0:m.history;return typeof w=="number"?w:d.DEFAULT_COMMANDS_HISTORY_LENGTH}};e.CommandsHistory=l,l.DEFAULT_COMMANDS_HISTORY_LENGTH=50,l.PREF_KEY_CACHE="commandPalette.mru.cache",l.PREF_KEY_COUNTER="commandPalette.mru.counter",l.counter=1,l.hasChanges=!1,e.CommandsHistory=l=d=ke([ge(0,u.IStorageService),ge(1,a.IConfigurationService)],l)}),define(se[832],oe([1,0,126,831]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEditorCommandsQuickAccessProvider=void 0;class y extends k.AbstractCommandsQuickAccessProvider{constructor(S,p,_,v,b,a){super(S,p,_,v,b,a)}getCodeEditorCommandPicks(){const S=this.activeTextEditorControl;if(!S)return[];const p=[];for(const _ of S.getSupportedActions())p.push({commandId:_.id,commandAlias:_.alias,label:(0,L.stripIcons)(_.label)||_.id});return p}}e.AbstractEditorCommandsQuickAccessProvider=y}),define(se[833],oe([1,0,37,139,96,33,832,8,34,25,81,162,16,21,70]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GotoLineAction=e.StandaloneCommandsQuickAccessProvider=void 0;let r=class extends S.AbstractEditorCommandsQuickAccessProvider{get activeTextEditorControl(){var c;return(c=this.codeEditorService.getFocusedCodeEditor())!==null&&c!==void 0?c:void 0}constructor(c,d,s,l,o,g){super({showAlias:!1},c,s,l,o,g),this.codeEditorService=d}async getCommandPicks(){return this.getCodeEditorCommandPicks()}hasAdditionalCommandPicks(){return!1}async getAdditionalCommandPicks(){return[]}};e.StandaloneCommandsQuickAccessProvider=r,e.StandaloneCommandsQuickAccessProvider=r=ke([ge(0,p.IInstantiationService),ge(1,E.ICodeEditorService),ge(2,_.IKeybindingService),ge(3,v.ICommandService),ge(4,b.ITelemetryService),ge(5,a.IDialogService)],r);class u extends i.EditorAction{constructor(){super({id:u.ID,label:y.QuickCommandNLS.quickCommandActionLabel,alias:"Command Palette",precondition:void 0,kbOpts:{kbExpr:n.EditorContextKeys.focus,primary:59,weight:100},contextMenuOpts:{group:"z_commands",order:1}})}run(c){c.get(t.IQuickInputService).quickAccess.show(r.PREFIX)}}e.GotoLineAction=u,u.ID="editor.action.quickCommand",(0,i.registerEditorAction)(u),L.Registry.as(k.Extensions.Quickaccess).registerQuickAccessProvider({ctor:r,prefix:r.PREFIX,helpEntries:[{description:y.QuickCommandNLS.quickCommandHelp,commandId:u.ID}]})}),define(se[29],oe([1,0,90,14,39,6,752,245,37]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.workbenchColorsSchemaId=e.resolveColorValue=e.ifDefinedThenElse=e.oneOf=e.transparent=e.lighten=e.darken=e.executeTransform=e.chartsPurple=e.chartsGreen=e.chartsOrange=e.chartsYellow=e.chartsBlue=e.chartsRed=e.chartsLines=e.chartsForeground=e.problemsInfoIconForeground=e.problemsWarningIconForeground=e.problemsErrorIconForeground=e.minimapSliderActiveBackground=e.minimapSliderHoverBackground=e.minimapSliderBackground=e.minimapForegroundOpacity=e.minimapBackground=e.minimapError=e.minimapWarning=e.minimapInfo=e.minimapSelection=e.minimapSelectionOccurrenceHighlight=e.minimapFindMatch=e.overviewRulerSelectionHighlightForeground=e.overviewRulerFindMatchForeground=e.overviewRulerCommonContentForeground=e.overviewRulerIncomingContentForeground=e.overviewRulerCurrentContentForeground=e.mergeBorder=e.mergeCommonContentBackground=e.mergeCommonHeaderBackground=e.mergeIncomingContentBackground=e.mergeIncomingHeaderBackground=e.mergeCurrentContentBackground=e.mergeCurrentHeaderBackground=e.breadcrumbsPickerBackground=e.breadcrumbsActiveSelectionForeground=e.breadcrumbsFocusForeground=e.breadcrumbsBackground=e.breadcrumbsForeground=e.snippetFinalTabstopHighlightBorder=e.snippetFinalTabstopHighlightBackground=e.snippetTabstopHighlightBorder=e.snippetTabstopHighlightBackground=e.toolbarActiveBackground=e.toolbarHoverOutline=e.toolbarHoverBackground=e.menuSeparatorBackground=e.menuSelectionBorder=e.menuSelectionBackground=e.menuSelectionForeground=e.menuBackground=e.menuForeground=e.menuBorder=e.quickInputListFocusBackground=e.quickInputListFocusIconForeground=e.quickInputListFocusForeground=e._deprecatedQuickInputListFocusBackground=e.checkboxSelectBorder=e.checkboxBorder=e.checkboxForeground=e.checkboxSelectBackground=e.checkboxBackground=e.listDeemphasizedForeground=e.tableOddRowsBackgroundColor=e.tableColumnsBorder=e.treeInactiveIndentGuidesStroke=e.treeIndentGuidesStroke=e.listFilterMatchHighlightBorder=e.listFilterMatchHighlight=e.listFilterWidgetShadow=e.listFilterWidgetNoMatchesOutline=e.listFilterWidgetOutline=e.listFilterWidgetBackground=e.listWarningForeground=e.listErrorForeground=e.listInvalidItemForeground=e.listFocusHighlightForeground=e.listHighlightForeground=e.listDropBetweenBackground=e.listDropOverBackground=e.listHoverForeground=e.listHoverBackground=e.listInactiveFocusOutline=e.listInactiveFocusBackground=e.listInactiveSelectionIconForeground=e.listInactiveSelectionForeground=e.listInactiveSelectionBackground=e.listActiveSelectionIconForeground=e.listActiveSelectionForeground=e.listActiveSelectionBackground=e.listFocusAndSelectionOutline=e.listFocusOutline=e.listFocusForeground=e.listFocusBackground=e.diffUnchangedTextBackground=e.diffUnchangedRegionForeground=e.diffUnchangedRegionBackground=e.diffDiagonalFill=e.diffBorder=e.diffRemovedOutline=e.diffInsertedOutline=e.diffOverviewRulerRemoved=e.diffOverviewRulerInserted=e.diffRemovedLineGutter=e.diffInsertedLineGutter=e.diffRemovedLine=e.diffInsertedLine=e.diffRemoved=e.diffInserted=e.defaultRemoveColor=e.defaultInsertColor=e.editorLightBulbAiForeground=e.editorLightBulbAutoFixForeground=e.editorLightBulbForeground=e.editorInlayHintParameterBackground=e.editorInlayHintParameterForeground=e.editorInlayHintTypeBackground=e.editorInlayHintTypeForeground=e.editorInlayHintBackground=e.editorInlayHintForeground=e.editorActiveLinkForeground=e.editorHoverStatusBarBackground=e.editorHoverBorder=e.editorHoverForeground=e.editorHoverBackground=e.editorHoverHighlight=e.searchResultsInfoForeground=e.searchEditorFindMatchBorder=e.searchEditorFindMatch=e.editorFindRangeHighlightBorder=e.editorFindMatchHighlightBorder=e.editorFindMatchBorder=e.editorFindRangeHighlight=e.editorFindMatchHighlight=e.editorFindMatch=e.editorSelectionHighlightBorder=e.editorSelectionHighlight=e.editorInactiveSelection=e.editorSelectionForeground=e.editorSelectionBackground=e.keybindingLabelBottomBorder=e.keybindingLabelBorder=e.keybindingLabelForeground=e.keybindingLabelBackground=e.pickerGroupBorder=e.pickerGroupForeground=e.quickInputTitleBackground=e.quickInputForeground=e.quickInputBackground=e.editorWidgetResizeBorder=e.editorWidgetBorder=e.editorWidgetForeground=e.editorWidgetBackground=e.editorStickyScrollShadow=e.editorStickyScrollBorder=e.editorStickyScrollHoverBackground=e.editorStickyScrollBackground=e.editorForeground=e.editorBackground=e.sashHoverBorder=e.editorHintBorder=e.editorHintForeground=e.editorInfoBorder=e.editorInfoForeground=e.editorInfoBackground=e.editorWarningBorder=e.editorWarningForeground=e.editorWarningBackground=e.editorErrorBorder=e.editorErrorForeground=e.editorErrorBackground=e.progressBarBackground=e.scrollbarSliderActiveBackground=e.scrollbarSliderHoverBackground=e.scrollbarSliderBackground=e.scrollbarShadow=e.badgeForeground=e.badgeBackground=e.buttonSecondaryHoverBackground=e.buttonSecondaryBackground=e.buttonSecondaryForeground=e.buttonBorder=e.buttonHoverBackground=e.buttonBackground=e.buttonSeparator=e.buttonForeground=e.selectBorder=e.selectForeground=e.selectListBackground=e.selectBackground=e.inputValidationErrorBorder=e.inputValidationErrorForeground=e.inputValidationErrorBackground=e.inputValidationWarningBorder=e.inputValidationWarningForeground=e.inputValidationWarningBackground=e.inputValidationInfoBorder=e.inputValidationInfoForeground=e.inputValidationInfoBackground=e.inputPlaceholderForeground=e.inputActiveOptionForeground=e.inputActiveOptionBackground=e.inputActiveOptionHoverBackground=e.inputActiveOptionBorder=e.inputBorder=e.inputForeground=e.inputBackground=e.widgetBorder=e.widgetShadow=e.textCodeBlockBackground=e.textBlockQuoteBorder=e.textBlockQuoteBackground=e.textPreformatBackground=e.textPreformatForeground=e.textLinkActiveForeground=e.textLinkForeground=e.textSeparatorForeground=e.selectionBackground=e.activeContrastBorder=e.contrastBorder=e.focusBorder=e.iconForeground=e.descriptionForeground=e.errorForeground=e.disabledForeground=e.foreground=e.registerColor=e.Extensions=e.asCssVariableWithDefault=e.asCssVariable=e.asCssVariableName=void 0;function v(A){return`--vscode-${A.replace(/\./g,"-")}`}e.asCssVariableName=v;function b(A){return`var(${v(A)})`}e.asCssVariable=b;function a(A,P){return`var(${v(A)}, ${P})`}e.asCssVariableWithDefault=a,e.Extensions={ColorContribution:"base.contributions.colors"};class i{constructor(){this._onDidChangeSchema=new E.Emitter,this.onDidChangeSchema=this._onDidChangeSchema.event,this.colorSchema={type:"object",properties:{}},this.colorReferenceSchema={type:"string",enum:[],enumDescriptions:[]},this.colorsById={}}registerColor(P,N,M,R=!1,x){const O={id:P,description:M,defaults:N,needsTransparency:R,deprecationMessage:x};this.colorsById[P]=O;const B={type:"string",description:M,format:"color-hex",defaultSnippets:[{body:"${1:#ff0000}"}]};return x&&(B.deprecationMessage=x),R&&(B.pattern="^#(?:(?<rgba>[0-9a-fA-f]{3}[0-9a-eA-E])|(?:[0-9a-fA-F]{6}(?:(?![fF]{2})(?:[0-9a-fA-F]{2}))))?$",B.patternErrorMessage="This color must be transparent or it will obscure content"),this.colorSchema.properties[P]=B,this.colorReferenceSchema.enum.push(P),this.colorReferenceSchema.enumDescriptions.push(M),this._onDidChangeSchema.fire(),P}getColors(){return Object.keys(this.colorsById).map(P=>this.colorsById[P])}resolveDefaultColor(P,N){const M=this.colorsById[P];if(M&&M.defaults){const R=M.defaults[N.type];return D(R,N)}}getColorSchema(){return this.colorSchema}toString(){const P=(N,M)=>{const R=N.indexOf(".")===-1?0:1,x=M.indexOf(".")===-1?0:1;return R!==x?R-x:N.localeCompare(M)};return Object.keys(this.colorsById).sort(P).map(N=>`- \`${N}\`: ${this.colorsById[N].description}`).join(`
+`)}}const n=new i;_.Registry.add(e.Extensions.ColorContribution,n);function t(A,P,N,M,R){return n.registerColor(A,P,N,M,R)}e.registerColor=t,e.foreground=t("foreground",{dark:"#CCCCCC",light:"#616161",hcDark:"#FFFFFF",hcLight:"#292929"},S.localize(0,null)),e.disabledForeground=t("disabledForeground",{dark:"#CCCCCC80",light:"#61616180",hcDark:"#A5A5A5",hcLight:"#7F7F7F"},S.localize(1,null)),e.errorForeground=t("errorForeground",{dark:"#F48771",light:"#A1260D",hcDark:"#F48771",hcLight:"#B5200D"},S.localize(2,null)),e.descriptionForeground=t("descriptionForeground",{light:"#717171",dark:h(e.foreground,.7),hcDark:h(e.foreground,.7),hcLight:h(e.foreground,.7)},S.localize(3,null)),e.iconForeground=t("icon.foreground",{dark:"#C5C5C5",light:"#424242",hcDark:"#FFFFFF",hcLight:"#292929"},S.localize(4,null)),e.focusBorder=t("focusBorder",{dark:"#007FD4",light:"#0090F1",hcDark:"#F38518",hcLight:"#006BBD"},S.localize(5,null)),e.contrastBorder=t("contrastBorder",{light:null,dark:null,hcDark:"#6FC3DF",hcLight:"#0F4A85"},S.localize(6,null)),e.activeContrastBorder=t("contrastActiveBorder",{light:null,dark:null,hcDark:e.focusBorder,hcLight:e.focusBorder},S.localize(7,null)),e.selectionBackground=t("selection.background",{light:null,dark:null,hcDark:null,hcLight:null},S.localize(8,null)),e.textSeparatorForeground=t("textSeparator.foreground",{light:"#0000002e",dark:"#ffffff2e",hcDark:y.Color.black,hcLight:"#292929"},S.localize(9,null)),e.textLinkForeground=t("textLink.foreground",{light:"#006AB1",dark:"#3794FF",hcDark:"#3794FF",hcLight:"#0F4A85"},S.localize(10,null)),e.textLinkActiveForeground=t("textLink.activeForeground",{light:"#006AB1",dark:"#3794FF",hcDark:"#3794FF",hcLight:"#0F4A85"},S.localize(11,null)),e.textPreformatForeground=t("textPreformat.foreground",{light:"#A31515",dark:"#D7BA7D",hcDark:"#000000",hcLight:"#FFFFFF"},S.localize(12,null)),e.textPreformatBackground=t("textPreformat.background",{light:"#0000001A",dark:"#FFFFFF1A",hcDark:"#FFFFFF",hcLight:"#09345f"},S.localize(13,null)),e.textBlockQuoteBackground=t("textBlockQuote.background",{light:"#f2f2f2",dark:"#222222",hcDark:null,hcLight:"#F2F2F2"},S.localize(14,null)),e.textBlockQuoteBorder=t("textBlockQuote.border",{light:"#007acc80",dark:"#007acc80",hcDark:y.Color.white,hcLight:"#292929"},S.localize(15,null)),e.textCodeBlockBackground=t("textCodeBlock.background",{light:"#dcdcdc66",dark:"#0a0a0a66",hcDark:y.Color.black,hcLight:"#F2F2F2"},S.localize(16,null)),e.widgetShadow=t("widget.shadow",{dark:h(y.Color.black,.36),light:h(y.Color.black,.16),hcDark:null,hcLight:null},S.localize(17,null)),e.widgetBorder=t("widget.border",{dark:null,light:null,hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(18,null)),e.inputBackground=t("input.background",{dark:"#3C3C3C",light:y.Color.white,hcDark:y.Color.black,hcLight:y.Color.white},S.localize(19,null)),e.inputForeground=t("input.foreground",{dark:e.foreground,light:e.foreground,hcDark:e.foreground,hcLight:e.foreground},S.localize(20,null)),e.inputBorder=t("input.border",{dark:null,light:null,hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(21,null)),e.inputActiveOptionBorder=t("inputOption.activeBorder",{dark:"#007ACC",light:"#007ACC",hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(22,null)),e.inputActiveOptionHoverBackground=t("inputOption.hoverBackground",{dark:"#5a5d5e80",light:"#b8b8b850",hcDark:null,hcLight:null},S.localize(23,null)),e.inputActiveOptionBackground=t("inputOption.activeBackground",{dark:h(e.focusBorder,.4),light:h(e.focusBorder,.2),hcDark:y.Color.transparent,hcLight:y.Color.transparent},S.localize(24,null)),e.inputActiveOptionForeground=t("inputOption.activeForeground",{dark:y.Color.white,light:y.Color.black,hcDark:e.foreground,hcLight:e.foreground},S.localize(25,null)),e.inputPlaceholderForeground=t("input.placeholderForeground",{light:h(e.foreground,.5),dark:h(e.foreground,.5),hcDark:h(e.foreground,.7),hcLight:h(e.foreground,.7)},S.localize(26,null)),e.inputValidationInfoBackground=t("inputValidation.infoBackground",{dark:"#063B49",light:"#D6ECF2",hcDark:y.Color.black,hcLight:y.Color.white},S.localize(27,null)),e.inputValidationInfoForeground=t("inputValidation.infoForeground",{dark:null,light:null,hcDark:null,hcLight:e.foreground},S.localize(28,null)),e.inputValidationInfoBorder=t("inputValidation.infoBorder",{dark:"#007acc",light:"#007acc",hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(29,null)),e.inputValidationWarningBackground=t("inputValidation.warningBackground",{dark:"#352A05",light:"#F6F5D2",hcDark:y.Color.black,hcLight:y.Color.white},S.localize(30,null)),e.inputValidationWarningForeground=t("inputValidation.warningForeground",{dark:null,light:null,hcDark:null,hcLight:e.foreground},S.localize(31,null)),e.inputValidationWarningBorder=t("inputValidation.warningBorder",{dark:"#B89500",light:"#B89500",hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(32,null)),e.inputValidationErrorBackground=t("inputValidation.errorBackground",{dark:"#5A1D1D",light:"#F2DEDE",hcDark:y.Color.black,hcLight:y.Color.white},S.localize(33,null)),e.inputValidationErrorForeground=t("inputValidation.errorForeground",{dark:null,light:null,hcDark:null,hcLight:e.foreground},S.localize(34,null)),e.inputValidationErrorBorder=t("inputValidation.errorBorder",{dark:"#BE1100",light:"#BE1100",hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(35,null)),e.selectBackground=t("dropdown.background",{dark:"#3C3C3C",light:y.Color.white,hcDark:y.Color.black,hcLight:y.Color.white},S.localize(36,null)),e.selectListBackground=t("dropdown.listBackground",{dark:null,light:null,hcDark:y.Color.black,hcLight:y.Color.white},S.localize(37,null)),e.selectForeground=t("dropdown.foreground",{dark:"#F0F0F0",light:e.foreground,hcDark:y.Color.white,hcLight:e.foreground},S.localize(38,null)),e.selectBorder=t("dropdown.border",{dark:e.selectBackground,light:"#CECECE",hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(39,null)),e.buttonForeground=t("button.foreground",{dark:y.Color.white,light:y.Color.white,hcDark:y.Color.white,hcLight:y.Color.white},S.localize(40,null)),e.buttonSeparator=t("button.separator",{dark:h(e.buttonForeground,.4),light:h(e.buttonForeground,.4),hcDark:h(e.buttonForeground,.4),hcLight:h(e.buttonForeground,.4)},S.localize(41,null)),e.buttonBackground=t("button.background",{dark:"#0E639C",light:"#007ACC",hcDark:null,hcLight:"#0F4A85"},S.localize(42,null)),e.buttonHoverBackground=t("button.hoverBackground",{dark:g(e.buttonBackground,.2),light:o(e.buttonBackground,.2),hcDark:e.buttonBackground,hcLight:e.buttonBackground},S.localize(43,null)),e.buttonBorder=t("button.border",{dark:e.contrastBorder,light:e.contrastBorder,hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(44,null)),e.buttonSecondaryForeground=t("button.secondaryForeground",{dark:y.Color.white,light:y.Color.white,hcDark:y.Color.white,hcLight:e.foreground},S.localize(45,null)),e.buttonSecondaryBackground=t("button.secondaryBackground",{dark:"#3A3D41",light:"#5F6A79",hcDark:null,hcLight:y.Color.white},S.localize(46,null)),e.buttonSecondaryHoverBackground=t("button.secondaryHoverBackground",{dark:g(e.buttonSecondaryBackground,.2),light:o(e.buttonSecondaryBackground,.2),hcDark:null,hcLight:null},S.localize(47,null)),e.badgeBackground=t("badge.background",{dark:"#4D4D4D",light:"#C4C4C4",hcDark:y.Color.black,hcLight:"#0F4A85"},S.localize(48,null)),e.badgeForeground=t("badge.foreground",{dark:y.Color.white,light:"#333",hcDark:y.Color.white,hcLight:y.Color.white},S.localize(49,null)),e.scrollbarShadow=t("scrollbar.shadow",{dark:"#000000",light:"#DDDDDD",hcDark:null,hcLight:null},S.localize(50,null)),e.scrollbarSliderBackground=t("scrollbarSlider.background",{dark:y.Color.fromHex("#797979").transparent(.4),light:y.Color.fromHex("#646464").transparent(.4),hcDark:h(e.contrastBorder,.6),hcLight:h(e.contrastBorder,.4)},S.localize(51,null)),e.scrollbarSliderHoverBackground=t("scrollbarSlider.hoverBackground",{dark:y.Color.fromHex("#646464").transparent(.7),light:y.Color.fromHex("#646464").transparent(.7),hcDark:h(e.contrastBorder,.8),hcLight:h(e.contrastBorder,.8)},S.localize(52,null)),e.scrollbarSliderActiveBackground=t("scrollbarSlider.activeBackground",{dark:y.Color.fromHex("#BFBFBF").transparent(.4),light:y.Color.fromHex("#000000").transparent(.6),hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(53,null)),e.progressBarBackground=t("progressBar.background",{dark:y.Color.fromHex("#0E70C0"),light:y.Color.fromHex("#0E70C0"),hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(54,null)),e.editorErrorBackground=t("editorError.background",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(55,null),!0),e.editorErrorForeground=t("editorError.foreground",{dark:"#F14C4C",light:"#E51400",hcDark:"#F48771",hcLight:"#B5200D"},S.localize(56,null)),e.editorErrorBorder=t("editorError.border",{dark:null,light:null,hcDark:y.Color.fromHex("#E47777").transparent(.8),hcLight:"#B5200D"},S.localize(57,null)),e.editorWarningBackground=t("editorWarning.background",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(58,null),!0),e.editorWarningForeground=t("editorWarning.foreground",{dark:"#CCA700",light:"#BF8803",hcDark:"#FFD370",hcLight:"#895503"},S.localize(59,null)),e.editorWarningBorder=t("editorWarning.border",{dark:null,light:null,hcDark:y.Color.fromHex("#FFCC00").transparent(.8),hcLight:y.Color.fromHex("#FFCC00").transparent(.8)},S.localize(60,null)),e.editorInfoBackground=t("editorInfo.background",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(61,null),!0),e.editorInfoForeground=t("editorInfo.foreground",{dark:"#3794FF",light:"#1a85ff",hcDark:"#3794FF",hcLight:"#1a85ff"},S.localize(62,null)),e.editorInfoBorder=t("editorInfo.border",{dark:null,light:null,hcDark:y.Color.fromHex("#3794FF").transparent(.8),hcLight:"#292929"},S.localize(63,null)),e.editorHintForeground=t("editorHint.foreground",{dark:y.Color.fromHex("#eeeeee").transparent(.7),light:"#6c6c6c",hcDark:null,hcLight:null},S.localize(64,null)),e.editorHintBorder=t("editorHint.border",{dark:null,light:null,hcDark:y.Color.fromHex("#eeeeee").transparent(.8),hcLight:"#292929"},S.localize(65,null)),e.sashHoverBorder=t("sash.hoverBorder",{dark:e.focusBorder,light:e.focusBorder,hcDark:e.focusBorder,hcLight:e.focusBorder},S.localize(66,null)),e.editorBackground=t("editor.background",{light:"#ffffff",dark:"#1E1E1E",hcDark:y.Color.black,hcLight:y.Color.white},S.localize(67,null)),e.editorForeground=t("editor.foreground",{light:"#333333",dark:"#BBBBBB",hcDark:y.Color.white,hcLight:e.foreground},S.localize(68,null)),e.editorStickyScrollBackground=t("editorStickyScroll.background",{light:e.editorBackground,dark:e.editorBackground,hcDark:e.editorBackground,hcLight:e.editorBackground},S.localize(69,null)),e.editorStickyScrollHoverBackground=t("editorStickyScrollHover.background",{dark:"#2A2D2E",light:"#F0F0F0",hcDark:null,hcLight:y.Color.fromHex("#0F4A85").transparent(.1)},S.localize(70,null)),e.editorStickyScrollBorder=t("editorStickyScroll.border",{dark:null,light:null,hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(71,null)),e.editorStickyScrollShadow=t("editorStickyScroll.shadow",{dark:e.scrollbarShadow,light:e.scrollbarShadow,hcDark:e.scrollbarShadow,hcLight:e.scrollbarShadow},S.localize(72,null)),e.editorWidgetBackground=t("editorWidget.background",{dark:"#252526",light:"#F3F3F3",hcDark:"#0C141F",hcLight:y.Color.white},S.localize(73,null)),e.editorWidgetForeground=t("editorWidget.foreground",{dark:e.foreground,light:e.foreground,hcDark:e.foreground,hcLight:e.foreground},S.localize(74,null)),e.editorWidgetBorder=t("editorWidget.border",{dark:"#454545",light:"#C8C8C8",hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(75,null)),e.editorWidgetResizeBorder=t("editorWidget.resizeBorder",{light:null,dark:null,hcDark:null,hcLight:null},S.localize(76,null)),e.quickInputBackground=t("quickInput.background",{dark:e.editorWidgetBackground,light:e.editorWidgetBackground,hcDark:e.editorWidgetBackground,hcLight:e.editorWidgetBackground},S.localize(77,null)),e.quickInputForeground=t("quickInput.foreground",{dark:e.editorWidgetForeground,light:e.editorWidgetForeground,hcDark:e.editorWidgetForeground,hcLight:e.editorWidgetForeground},S.localize(78,null)),e.quickInputTitleBackground=t("quickInputTitle.background",{dark:new y.Color(new y.RGBA(255,255,255,.105)),light:new y.Color(new y.RGBA(0,0,0,.06)),hcDark:"#000000",hcLight:y.Color.white},S.localize(79,null)),e.pickerGroupForeground=t("pickerGroup.foreground",{dark:"#3794FF",light:"#0066BF",hcDark:y.Color.white,hcLight:"#0F4A85"},S.localize(80,null)),e.pickerGroupBorder=t("pickerGroup.border",{dark:"#3F3F46",light:"#CCCEDB",hcDark:y.Color.white,hcLight:"#0F4A85"},S.localize(81,null)),e.keybindingLabelBackground=t("keybindingLabel.background",{dark:new y.Color(new y.RGBA(128,128,128,.17)),light:new y.Color(new y.RGBA(221,221,221,.4)),hcDark:y.Color.transparent,hcLight:y.Color.transparent},S.localize(82,null)),e.keybindingLabelForeground=t("keybindingLabel.foreground",{dark:y.Color.fromHex("#CCCCCC"),light:y.Color.fromHex("#555555"),hcDark:y.Color.white,hcLight:e.foreground},S.localize(83,null)),e.keybindingLabelBorder=t("keybindingLabel.border",{dark:new y.Color(new y.RGBA(51,51,51,.6)),light:new y.Color(new y.RGBA(204,204,204,.4)),hcDark:new y.Color(new y.RGBA(111,195,223)),hcLight:e.contrastBorder},S.localize(84,null)),e.keybindingLabelBottomBorder=t("keybindingLabel.bottomBorder",{dark:new y.Color(new y.RGBA(68,68,68,.6)),light:new y.Color(new y.RGBA(187,187,187,.4)),hcDark:new y.Color(new y.RGBA(111,195,223)),hcLight:e.foreground},S.localize(85,null)),e.editorSelectionBackground=t("editor.selectionBackground",{light:"#ADD6FF",dark:"#264F78",hcDark:"#f3f518",hcLight:"#0F4A85"},S.localize(86,null)),e.editorSelectionForeground=t("editor.selectionForeground",{light:null,dark:null,hcDark:"#000000",hcLight:y.Color.white},S.localize(87,null)),e.editorInactiveSelection=t("editor.inactiveSelectionBackground",{light:h(e.editorSelectionBackground,.5),dark:h(e.editorSelectionBackground,.5),hcDark:h(e.editorSelectionBackground,.7),hcLight:h(e.editorSelectionBackground,.5)},S.localize(88,null),!0),e.editorSelectionHighlight=t("editor.selectionHighlightBackground",{light:w(e.editorSelectionBackground,e.editorBackground,.3,.6),dark:w(e.editorSelectionBackground,e.editorBackground,.3,.6),hcDark:null,hcLight:null},S.localize(89,null),!0),e.editorSelectionHighlightBorder=t("editor.selectionHighlightBorder",{light:null,dark:null,hcDark:e.activeContrastBorder,hcLight:e.activeContrastBorder},S.localize(90,null)),e.editorFindMatch=t("editor.findMatchBackground",{light:"#A8AC94",dark:"#515C6A",hcDark:null,hcLight:null},S.localize(91,null)),e.editorFindMatchHighlight=t("editor.findMatchHighlightBackground",{light:"#EA5C0055",dark:"#EA5C0055",hcDark:null,hcLight:null},S.localize(92,null),!0),e.editorFindRangeHighlight=t("editor.findRangeHighlightBackground",{dark:"#3a3d4166",light:"#b4b4b44d",hcDark:null,hcLight:null},S.localize(93,null),!0),e.editorFindMatchBorder=t("editor.findMatchBorder",{light:null,dark:null,hcDark:e.activeContrastBorder,hcLight:e.activeContrastBorder},S.localize(94,null)),e.editorFindMatchHighlightBorder=t("editor.findMatchHighlightBorder",{light:null,dark:null,hcDark:e.activeContrastBorder,hcLight:e.activeContrastBorder},S.localize(95,null)),e.editorFindRangeHighlightBorder=t("editor.findRangeHighlightBorder",{dark:null,light:null,hcDark:h(e.activeContrastBorder,.4),hcLight:h(e.activeContrastBorder,.4)},S.localize(96,null),!0),e.searchEditorFindMatch=t("searchEditor.findMatchBackground",{light:h(e.editorFindMatchHighlight,.66),dark:h(e.editorFindMatchHighlight,.66),hcDark:e.editorFindMatchHighlight,hcLight:e.editorFindMatchHighlight},S.localize(97,null)),e.searchEditorFindMatchBorder=t("searchEditor.findMatchBorder",{light:h(e.editorFindMatchHighlightBorder,.66),dark:h(e.editorFindMatchHighlightBorder,.66),hcDark:e.editorFindMatchHighlightBorder,hcLight:e.editorFindMatchHighlightBorder},S.localize(98,null)),e.searchResultsInfoForeground=t("search.resultsInfoForeground",{light:e.foreground,dark:h(e.foreground,.65),hcDark:e.foreground,hcLight:e.foreground},S.localize(99,null)),e.editorHoverHighlight=t("editor.hoverHighlightBackground",{light:"#ADD6FF26",dark:"#264f7840",hcDark:"#ADD6FF26",hcLight:null},S.localize(100,null),!0),e.editorHoverBackground=t("editorHoverWidget.background",{light:e.editorWidgetBackground,dark:e.editorWidgetBackground,hcDark:e.editorWidgetBackground,hcLight:e.editorWidgetBackground},S.localize(101,null)),e.editorHoverForeground=t("editorHoverWidget.foreground",{light:e.editorWidgetForeground,dark:e.editorWidgetForeground,hcDark:e.editorWidgetForeground,hcLight:e.editorWidgetForeground},S.localize(102,null)),e.editorHoverBorder=t("editorHoverWidget.border",{light:e.editorWidgetBorder,dark:e.editorWidgetBorder,hcDark:e.editorWidgetBorder,hcLight:e.editorWidgetBorder},S.localize(103,null)),e.editorHoverStatusBarBackground=t("editorHoverWidget.statusBarBackground",{dark:g(e.editorHoverBackground,.2),light:o(e.editorHoverBackground,.05),hcDark:e.editorWidgetBackground,hcLight:e.editorWidgetBackground},S.localize(104,null)),e.editorActiveLinkForeground=t("editorLink.activeForeground",{dark:"#4E94CE",light:y.Color.blue,hcDark:y.Color.cyan,hcLight:"#292929"},S.localize(105,null)),e.editorInlayHintForeground=t("editorInlayHint.foreground",{dark:"#969696",light:"#969696",hcDark:y.Color.white,hcLight:y.Color.black},S.localize(106,null)),e.editorInlayHintBackground=t("editorInlayHint.background",{dark:h(e.badgeBackground,.1),light:h(e.badgeBackground,.1),hcDark:h(y.Color.white,.1),hcLight:h(e.badgeBackground,.1)},S.localize(107,null)),e.editorInlayHintTypeForeground=t("editorInlayHint.typeForeground",{dark:e.editorInlayHintForeground,light:e.editorInlayHintForeground,hcDark:e.editorInlayHintForeground,hcLight:e.editorInlayHintForeground},S.localize(108,null)),e.editorInlayHintTypeBackground=t("editorInlayHint.typeBackground",{dark:e.editorInlayHintBackground,light:e.editorInlayHintBackground,hcDark:e.editorInlayHintBackground,hcLight:e.editorInlayHintBackground},S.localize(109,null)),e.editorInlayHintParameterForeground=t("editorInlayHint.parameterForeground",{dark:e.editorInlayHintForeground,light:e.editorInlayHintForeground,hcDark:e.editorInlayHintForeground,hcLight:e.editorInlayHintForeground},S.localize(110,null)),e.editorInlayHintParameterBackground=t("editorInlayHint.parameterBackground",{dark:e.editorInlayHintBackground,light:e.editorInlayHintBackground,hcDark:e.editorInlayHintBackground,hcLight:e.editorInlayHintBackground},S.localize(111,null)),e.editorLightBulbForeground=t("editorLightBulb.foreground",{dark:"#FFCC00",light:"#DDB100",hcDark:"#FFCC00",hcLight:"#007ACC"},S.localize(112,null)),e.editorLightBulbAutoFixForeground=t("editorLightBulbAutoFix.foreground",{dark:"#75BEFF",light:"#007ACC",hcDark:"#75BEFF",hcLight:"#007ACC"},S.localize(113,null)),e.editorLightBulbAiForeground=t("editorLightBulbAi.foreground",{dark:e.editorLightBulbForeground,light:e.editorLightBulbForeground,hcDark:e.editorLightBulbForeground,hcLight:e.editorLightBulbForeground},S.localize(114,null)),e.defaultInsertColor=new y.Color(new y.RGBA(155,185,85,.2)),e.defaultRemoveColor=new y.Color(new y.RGBA(255,0,0,.2)),e.diffInserted=t("diffEditor.insertedTextBackground",{dark:"#9ccc2c33",light:"#9ccc2c40",hcDark:null,hcLight:null},S.localize(115,null),!0),e.diffRemoved=t("diffEditor.removedTextBackground",{dark:"#ff000033",light:"#ff000033",hcDark:null,hcLight:null},S.localize(116,null),!0),e.diffInsertedLine=t("diffEditor.insertedLineBackground",{dark:e.defaultInsertColor,light:e.defaultInsertColor,hcDark:null,hcLight:null},S.localize(117,null),!0),e.diffRemovedLine=t("diffEditor.removedLineBackground",{dark:e.defaultRemoveColor,light:e.defaultRemoveColor,hcDark:null,hcLight:null},S.localize(118,null),!0),e.diffInsertedLineGutter=t("diffEditorGutter.insertedLineBackground",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(119,null)),e.diffRemovedLineGutter=t("diffEditorGutter.removedLineBackground",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(120,null)),e.diffOverviewRulerInserted=t("diffEditorOverview.insertedForeground",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(121,null)),e.diffOverviewRulerRemoved=t("diffEditorOverview.removedForeground",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(122,null)),e.diffInsertedOutline=t("diffEditor.insertedTextBorder",{dark:null,light:null,hcDark:"#33ff2eff",hcLight:"#374E06"},S.localize(123,null)),e.diffRemovedOutline=t("diffEditor.removedTextBorder",{dark:null,light:null,hcDark:"#FF008F",hcLight:"#AD0707"},S.localize(124,null)),e.diffBorder=t("diffEditor.border",{dark:null,light:null,hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(125,null)),e.diffDiagonalFill=t("diffEditor.diagonalFill",{dark:"#cccccc33",light:"#22222233",hcDark:null,hcLight:null},S.localize(126,null)),e.diffUnchangedRegionBackground=t("diffEditor.unchangedRegionBackground",{dark:"sideBar.background",light:"sideBar.background",hcDark:"sideBar.background",hcLight:"sideBar.background"},S.localize(127,null)),e.diffUnchangedRegionForeground=t("diffEditor.unchangedRegionForeground",{dark:"foreground",light:"foreground",hcDark:"foreground",hcLight:"foreground"},S.localize(128,null)),e.diffUnchangedTextBackground=t("diffEditor.unchangedCodeBackground",{dark:"#74747429",light:"#b8b8b829",hcDark:null,hcLight:null},S.localize(129,null)),e.listFocusBackground=t("list.focusBackground",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(130,null)),e.listFocusForeground=t("list.focusForeground",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(131,null)),e.listFocusOutline=t("list.focusOutline",{dark:e.focusBorder,light:e.focusBorder,hcDark:e.activeContrastBorder,hcLight:e.activeContrastBorder},S.localize(132,null)),e.listFocusAndSelectionOutline=t("list.focusAndSelectionOutline",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(133,null)),e.listActiveSelectionBackground=t("list.activeSelectionBackground",{dark:"#04395E",light:"#0060C0",hcDark:null,hcLight:y.Color.fromHex("#0F4A85").transparent(.1)},S.localize(134,null)),e.listActiveSelectionForeground=t("list.activeSelectionForeground",{dark:y.Color.white,light:y.Color.white,hcDark:null,hcLight:null},S.localize(135,null)),e.listActiveSelectionIconForeground=t("list.activeSelectionIconForeground",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(136,null)),e.listInactiveSelectionBackground=t("list.inactiveSelectionBackground",{dark:"#37373D",light:"#E4E6F1",hcDark:null,hcLight:y.Color.fromHex("#0F4A85").transparent(.1)},S.localize(137,null)),e.listInactiveSelectionForeground=t("list.inactiveSelectionForeground",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(138,null)),e.listInactiveSelectionIconForeground=t("list.inactiveSelectionIconForeground",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(139,null)),e.listInactiveFocusBackground=t("list.inactiveFocusBackground",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(140,null)),e.listInactiveFocusOutline=t("list.inactiveFocusOutline",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(141,null)),e.listHoverBackground=t("list.hoverBackground",{dark:"#2A2D2E",light:"#F0F0F0",hcDark:y.Color.white.transparent(.1),hcLight:y.Color.fromHex("#0F4A85").transparent(.1)},S.localize(142,null)),e.listHoverForeground=t("list.hoverForeground",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(143,null)),e.listDropOverBackground=t("list.dropBackground",{dark:"#062F4A",light:"#D6EBFF",hcDark:null,hcLight:null},S.localize(144,null)),e.listDropBetweenBackground=t("list.dropBetweenBackground",{dark:e.iconForeground,light:e.iconForeground,hcDark:null,hcLight:null},S.localize(145,null)),e.listHighlightForeground=t("list.highlightForeground",{dark:"#2AAAFF",light:"#0066BF",hcDark:e.focusBorder,hcLight:e.focusBorder},S.localize(146,null)),e.listFocusHighlightForeground=t("list.focusHighlightForeground",{dark:e.listHighlightForeground,light:C(e.listActiveSelectionBackground,e.listHighlightForeground,"#BBE7FF"),hcDark:e.listHighlightForeground,hcLight:e.listHighlightForeground},S.localize(147,null)),e.listInvalidItemForeground=t("list.invalidItemForeground",{dark:"#B89500",light:"#B89500",hcDark:"#B89500",hcLight:"#B5200D"},S.localize(148,null)),e.listErrorForeground=t("list.errorForeground",{dark:"#F88070",light:"#B01011",hcDark:null,hcLight:null},S.localize(149,null)),e.listWarningForeground=t("list.warningForeground",{dark:"#CCA700",light:"#855F00",hcDark:null,hcLight:null},S.localize(150,null)),e.listFilterWidgetBackground=t("listFilterWidget.background",{light:o(e.editorWidgetBackground,0),dark:g(e.editorWidgetBackground,0),hcDark:e.editorWidgetBackground,hcLight:e.editorWidgetBackground},S.localize(151,null)),e.listFilterWidgetOutline=t("listFilterWidget.outline",{dark:y.Color.transparent,light:y.Color.transparent,hcDark:"#f38518",hcLight:"#007ACC"},S.localize(152,null)),e.listFilterWidgetNoMatchesOutline=t("listFilterWidget.noMatchesOutline",{dark:"#BE1100",light:"#BE1100",hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(153,null)),e.listFilterWidgetShadow=t("listFilterWidget.shadow",{dark:e.widgetShadow,light:e.widgetShadow,hcDark:e.widgetShadow,hcLight:e.widgetShadow},S.localize(154,null)),e.listFilterMatchHighlight=t("list.filterMatchBackground",{dark:e.editorFindMatchHighlight,light:e.editorFindMatchHighlight,hcDark:null,hcLight:null},S.localize(155,null)),e.listFilterMatchHighlightBorder=t("list.filterMatchBorder",{dark:e.editorFindMatchHighlightBorder,light:e.editorFindMatchHighlightBorder,hcDark:e.contrastBorder,hcLight:e.activeContrastBorder},S.localize(156,null)),e.treeIndentGuidesStroke=t("tree.indentGuidesStroke",{dark:"#585858",light:"#a9a9a9",hcDark:"#a9a9a9",hcLight:"#a5a5a5"},S.localize(157,null)),e.treeInactiveIndentGuidesStroke=t("tree.inactiveIndentGuidesStroke",{dark:h(e.treeIndentGuidesStroke,.4),light:h(e.treeIndentGuidesStroke,.4),hcDark:h(e.treeIndentGuidesStroke,.4),hcLight:h(e.treeIndentGuidesStroke,.4)},S.localize(158,null)),e.tableColumnsBorder=t("tree.tableColumnsBorder",{dark:"#CCCCCC20",light:"#61616120",hcDark:null,hcLight:null},S.localize(159,null)),e.tableOddRowsBackgroundColor=t("tree.tableOddRowsBackground",{dark:h(e.foreground,.04),light:h(e.foreground,.04),hcDark:null,hcLight:null},S.localize(160,null)),e.listDeemphasizedForeground=t("list.deemphasizedForeground",{dark:"#8C8C8C",light:"#8E8E90",hcDark:"#A7A8A9",hcLight:"#666666"},S.localize(161,null)),e.checkboxBackground=t("checkbox.background",{dark:e.selectBackground,light:e.selectBackground,hcDark:e.selectBackground,hcLight:e.selectBackground},S.localize(162,null)),e.checkboxSelectBackground=t("checkbox.selectBackground",{dark:e.editorWidgetBackground,light:e.editorWidgetBackground,hcDark:e.editorWidgetBackground,hcLight:e.editorWidgetBackground},S.localize(163,null)),e.checkboxForeground=t("checkbox.foreground",{dark:e.selectForeground,light:e.selectForeground,hcDark:e.selectForeground,hcLight:e.selectForeground},S.localize(164,null)),e.checkboxBorder=t("checkbox.border",{dark:e.selectBorder,light:e.selectBorder,hcDark:e.selectBorder,hcLight:e.selectBorder},S.localize(165,null)),e.checkboxSelectBorder=t("checkbox.selectBorder",{dark:e.iconForeground,light:e.iconForeground,hcDark:e.iconForeground,hcLight:e.iconForeground},S.localize(166,null)),e._deprecatedQuickInputListFocusBackground=t("quickInput.list.focusBackground",{dark:null,light:null,hcDark:null,hcLight:null},"",void 0,S.localize(167,null)),e.quickInputListFocusForeground=t("quickInputList.focusForeground",{dark:e.listActiveSelectionForeground,light:e.listActiveSelectionForeground,hcDark:e.listActiveSelectionForeground,hcLight:e.listActiveSelectionForeground},S.localize(168,null)),e.quickInputListFocusIconForeground=t("quickInputList.focusIconForeground",{dark:e.listActiveSelectionIconForeground,light:e.listActiveSelectionIconForeground,hcDark:e.listActiveSelectionIconForeground,hcLight:e.listActiveSelectionIconForeground},S.localize(169,null)),e.quickInputListFocusBackground=t("quickInputList.focusBackground",{dark:m(e._deprecatedQuickInputListFocusBackground,e.listActiveSelectionBackground),light:m(e._deprecatedQuickInputListFocusBackground,e.listActiveSelectionBackground),hcDark:null,hcLight:null},S.localize(170,null)),e.menuBorder=t("menu.border",{dark:null,light:null,hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(171,null)),e.menuForeground=t("menu.foreground",{dark:e.selectForeground,light:e.selectForeground,hcDark:e.selectForeground,hcLight:e.selectForeground},S.localize(172,null)),e.menuBackground=t("menu.background",{dark:e.selectBackground,light:e.selectBackground,hcDark:e.selectBackground,hcLight:e.selectBackground},S.localize(173,null)),e.menuSelectionForeground=t("menu.selectionForeground",{dark:e.listActiveSelectionForeground,light:e.listActiveSelectionForeground,hcDark:e.listActiveSelectionForeground,hcLight:e.listActiveSelectionForeground},S.localize(174,null)),e.menuSelectionBackground=t("menu.selectionBackground",{dark:e.listActiveSelectionBackground,light:e.listActiveSelectionBackground,hcDark:e.listActiveSelectionBackground,hcLight:e.listActiveSelectionBackground},S.localize(175,null)),e.menuSelectionBorder=t("menu.selectionBorder",{dark:null,light:null,hcDark:e.activeContrastBorder,hcLight:e.activeContrastBorder},S.localize(176,null)),e.menuSeparatorBackground=t("menu.separatorBackground",{dark:"#606060",light:"#D4D4D4",hcDark:e.contrastBorder,hcLight:e.contrastBorder},S.localize(177,null)),e.toolbarHoverBackground=t("toolbar.hoverBackground",{dark:"#5a5d5e50",light:"#b8b8b850",hcDark:null,hcLight:null},S.localize(178,null)),e.toolbarHoverOutline=t("toolbar.hoverOutline",{dark:null,light:null,hcDark:e.activeContrastBorder,hcLight:e.activeContrastBorder},S.localize(179,null)),e.toolbarActiveBackground=t("toolbar.activeBackground",{dark:g(e.toolbarHoverBackground,.1),light:o(e.toolbarHoverBackground,.1),hcDark:null,hcLight:null},S.localize(180,null)),e.snippetTabstopHighlightBackground=t("editor.snippetTabstopHighlightBackground",{dark:new y.Color(new y.RGBA(124,124,124,.3)),light:new y.Color(new y.RGBA(10,50,100,.2)),hcDark:new y.Color(new y.RGBA(124,124,124,.3)),hcLight:new y.Color(new y.RGBA(10,50,100,.2))},S.localize(181,null)),e.snippetTabstopHighlightBorder=t("editor.snippetTabstopHighlightBorder",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(182,null)),e.snippetFinalTabstopHighlightBackground=t("editor.snippetFinalTabstopHighlightBackground",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(183,null)),e.snippetFinalTabstopHighlightBorder=t("editor.snippetFinalTabstopHighlightBorder",{dark:"#525252",light:new y.Color(new y.RGBA(10,50,100,.5)),hcDark:"#525252",hcLight:"#292929"},S.localize(184,null)),e.breadcrumbsForeground=t("breadcrumb.foreground",{light:h(e.foreground,.8),dark:h(e.foreground,.8),hcDark:h(e.foreground,.8),hcLight:h(e.foreground,.8)},S.localize(185,null)),e.breadcrumbsBackground=t("breadcrumb.background",{light:e.editorBackground,dark:e.editorBackground,hcDark:e.editorBackground,hcLight:e.editorBackground},S.localize(186,null)),e.breadcrumbsFocusForeground=t("breadcrumb.focusForeground",{light:o(e.foreground,.2),dark:g(e.foreground,.1),hcDark:g(e.foreground,.1),hcLight:g(e.foreground,.1)},S.localize(187,null)),e.breadcrumbsActiveSelectionForeground=t("breadcrumb.activeSelectionForeground",{light:o(e.foreground,.2),dark:g(e.foreground,.1),hcDark:g(e.foreground,.1),hcLight:g(e.foreground,.1)},S.localize(188,null)),e.breadcrumbsPickerBackground=t("breadcrumbPicker.background",{light:e.editorWidgetBackground,dark:e.editorWidgetBackground,hcDark:e.editorWidgetBackground,hcLight:e.editorWidgetBackground},S.localize(189,null));const r=.5,u=y.Color.fromHex("#40C8AE").transparent(r),f=y.Color.fromHex("#40A6FF").transparent(r),c=y.Color.fromHex("#606060").transparent(.4),d=.4,s=1;e.mergeCurrentHeaderBackground=t("merge.currentHeaderBackground",{dark:u,light:u,hcDark:null,hcLight:null},S.localize(190,null),!0),e.mergeCurrentContentBackground=t("merge.currentContentBackground",{dark:h(e.mergeCurrentHeaderBackground,d),light:h(e.mergeCurrentHeaderBackground,d),hcDark:h(e.mergeCurrentHeaderBackground,d),hcLight:h(e.mergeCurrentHeaderBackground,d)},S.localize(191,null),!0),e.mergeIncomingHeaderBackground=t("merge.incomingHeaderBackground",{dark:f,light:f,hcDark:null,hcLight:null},S.localize(192,null),!0),e.mergeIncomingContentBackground=t("merge.incomingContentBackground",{dark:h(e.mergeIncomingHeaderBackground,d),light:h(e.mergeIncomingHeaderBackground,d),hcDark:h(e.mergeIncomingHeaderBackground,d),hcLight:h(e.mergeIncomingHeaderBackground,d)},S.localize(193,null),!0),e.mergeCommonHeaderBackground=t("merge.commonHeaderBackground",{dark:c,light:c,hcDark:null,hcLight:null},S.localize(194,null),!0),e.mergeCommonContentBackground=t("merge.commonContentBackground",{dark:h(e.mergeCommonHeaderBackground,d),light:h(e.mergeCommonHeaderBackground,d),hcDark:h(e.mergeCommonHeaderBackground,d),hcLight:h(e.mergeCommonHeaderBackground,d)},S.localize(195,null),!0),e.mergeBorder=t("merge.border",{dark:null,light:null,hcDark:"#C3DF6F",hcLight:"#007ACC"},S.localize(196,null)),e.overviewRulerCurrentContentForeground=t("editorOverviewRuler.currentContentForeground",{dark:h(e.mergeCurrentHeaderBackground,s),light:h(e.mergeCurrentHeaderBackground,s),hcDark:e.mergeBorder,hcLight:e.mergeBorder},S.localize(197,null)),e.overviewRulerIncomingContentForeground=t("editorOverviewRuler.incomingContentForeground",{dark:h(e.mergeIncomingHeaderBackground,s),light:h(e.mergeIncomingHeaderBackground,s),hcDark:e.mergeBorder,hcLight:e.mergeBorder},S.localize(198,null)),e.overviewRulerCommonContentForeground=t("editorOverviewRuler.commonContentForeground",{dark:h(e.mergeCommonHeaderBackground,s),light:h(e.mergeCommonHeaderBackground,s),hcDark:e.mergeBorder,hcLight:e.mergeBorder},S.localize(199,null)),e.overviewRulerFindMatchForeground=t("editorOverviewRuler.findMatchForeground",{dark:"#d186167e",light:"#d186167e",hcDark:"#AB5A00",hcLight:""},S.localize(200,null),!0),e.overviewRulerSelectionHighlightForeground=t("editorOverviewRuler.selectionHighlightForeground",{dark:"#A0A0A0CC",light:"#A0A0A0CC",hcDark:"#A0A0A0CC",hcLight:"#A0A0A0CC"},S.localize(201,null),!0),e.minimapFindMatch=t("minimap.findMatchHighlight",{light:"#d18616",dark:"#d18616",hcDark:"#AB5A00",hcLight:"#0F4A85"},S.localize(202,null),!0),e.minimapSelectionOccurrenceHighlight=t("minimap.selectionOccurrenceHighlight",{light:"#c9c9c9",dark:"#676767",hcDark:"#ffffff",hcLight:"#0F4A85"},S.localize(203,null),!0),e.minimapSelection=t("minimap.selectionHighlight",{light:"#ADD6FF",dark:"#264F78",hcDark:"#ffffff",hcLight:"#0F4A85"},S.localize(204,null),!0),e.minimapInfo=t("minimap.infoHighlight",{dark:e.editorInfoForeground,light:e.editorInfoForeground,hcDark:e.editorInfoBorder,hcLight:e.editorInfoBorder},S.localize(205,null)),e.minimapWarning=t("minimap.warningHighlight",{dark:e.editorWarningForeground,light:e.editorWarningForeground,hcDark:e.editorWarningBorder,hcLight:e.editorWarningBorder},S.localize(206,null)),e.minimapError=t("minimap.errorHighlight",{dark:new y.Color(new y.RGBA(255,18,18,.7)),light:new y.Color(new y.RGBA(255,18,18,.7)),hcDark:new y.Color(new y.RGBA(255,50,50,1)),hcLight:"#B5200D"},S.localize(207,null)),e.minimapBackground=t("minimap.background",{dark:null,light:null,hcDark:null,hcLight:null},S.localize(208,null)),e.minimapForegroundOpacity=t("minimap.foregroundOpacity",{dark:y.Color.fromHex("#000f"),light:y.Color.fromHex("#000f"),hcDark:y.Color.fromHex("#000f"),hcLight:y.Color.fromHex("#000f")},S.localize(209,null)),e.minimapSliderBackground=t("minimapSlider.background",{light:h(e.scrollbarSliderBackground,.5),dark:h(e.scrollbarSliderBackground,.5),hcDark:h(e.scrollbarSliderBackground,.5),hcLight:h(e.scrollbarSliderBackground,.5)},S.localize(210,null)),e.minimapSliderHoverBackground=t("minimapSlider.hoverBackground",{light:h(e.scrollbarSliderHoverBackground,.5),dark:h(e.scrollbarSliderHoverBackground,.5),hcDark:h(e.scrollbarSliderHoverBackground,.5),hcLight:h(e.scrollbarSliderHoverBackground,.5)},S.localize(211,null)),e.minimapSliderActiveBackground=t("minimapSlider.activeBackground",{light:h(e.scrollbarSliderActiveBackground,.5),dark:h(e.scrollbarSliderActiveBackground,.5),hcDark:h(e.scrollbarSliderActiveBackground,.5),hcLight:h(e.scrollbarSliderActiveBackground,.5)},S.localize(212,null)),e.problemsErrorIconForeground=t("problemsErrorIcon.foreground",{dark:e.editorErrorForeground,light:e.editorErrorForeground,hcDark:e.editorErrorForeground,hcLight:e.editorErrorForeground},S.localize(213,null)),e.problemsWarningIconForeground=t("problemsWarningIcon.foreground",{dark:e.editorWarningForeground,light:e.editorWarningForeground,hcDark:e.editorWarningForeground,hcLight:e.editorWarningForeground},S.localize(214,null)),e.problemsInfoIconForeground=t("problemsInfoIcon.foreground",{dark:e.editorInfoForeground,light:e.editorInfoForeground,hcDark:e.editorInfoForeground,hcLight:e.editorInfoForeground},S.localize(215,null)),e.chartsForeground=t("charts.foreground",{dark:e.foreground,light:e.foreground,hcDark:e.foreground,hcLight:e.foreground},S.localize(216,null)),e.chartsLines=t("charts.lines",{dark:h(e.foreground,.5),light:h(e.foreground,.5),hcDark:h(e.foreground,.5),hcLight:h(e.foreground,.5)},S.localize(217,null)),e.chartsRed=t("charts.red",{dark:e.editorErrorForeground,light:e.editorErrorForeground,hcDark:e.editorErrorForeground,hcLight:e.editorErrorForeground},S.localize(218,null)),e.chartsBlue=t("charts.blue",{dark:e.editorInfoForeground,light:e.editorInfoForeground,hcDark:e.editorInfoForeground,hcLight:e.editorInfoForeground},S.localize(219,null)),e.chartsYellow=t("charts.yellow",{dark:e.editorWarningForeground,light:e.editorWarningForeground,hcDark:e.editorWarningForeground,hcLight:e.editorWarningForeground},S.localize(220,null)),e.chartsOrange=t("charts.orange",{dark:e.minimapFindMatch,light:e.minimapFindMatch,hcDark:e.minimapFindMatch,hcLight:e.minimapFindMatch},S.localize(221,null)),e.chartsGreen=t("charts.green",{dark:"#89D185",light:"#388A34",hcDark:"#89D185",hcLight:"#374e06"},S.localize(222,null)),e.chartsPurple=t("charts.purple",{dark:"#B180D7",light:"#652D90",hcDark:"#B180D7",hcLight:"#652D90"},S.localize(223,null));function l(A,P){var N,M,R,x;switch(A.op){case 0:return(N=D(A.value,P))===null||N===void 0?void 0:N.darken(A.factor);case 1:return(M=D(A.value,P))===null||M===void 0?void 0:M.lighten(A.factor);case 2:return(R=D(A.value,P))===null||R===void 0?void 0:R.transparent(A.factor);case 3:{const O=D(A.background,P);return O?(x=D(A.value,P))===null||x===void 0?void 0:x.makeOpaque(O):D(A.value,P)}case 4:for(const O of A.values){const B=D(O,P);if(B)return B}return;case 6:return D(P.defines(A.if)?A.then:A.else,P);case 5:{const O=D(A.value,P);if(!O)return;const B=D(A.background,P);return B?O.isDarkerThan(B)?y.Color.getLighterColor(O,B,A.factor).transparent(A.transparency):y.Color.getDarkerColor(O,B,A.factor).transparent(A.transparency):O.transparent(A.factor*A.transparency)}default:throw(0,L.assertNever)(A)}}e.executeTransform=l;function o(A,P){return{op:0,value:A,factor:P}}e.darken=o;function g(A,P){return{op:1,value:A,factor:P}}e.lighten=g;function h(A,P){return{op:2,value:A,factor:P}}e.transparent=h;function m(...A){return{op:4,values:A}}e.oneOf=m;function C(A,P,N){return{op:6,if:A,then:P,else:N}}e.ifDefinedThenElse=C;function w(A,P,N,M){return{op:5,value:A,background:P,factor:N,transparency:M}}function D(A,P){if(A!==null){if(typeof A=="string")return A[0]==="#"?y.Color.fromHex(A):P.getColor(A);if(A instanceof y.Color)return A;if(typeof A=="object")return l(A,P)}}e.resolveColorValue=D,e.workbenchColorsSchemaId="vscode://schemas/workbench-colors";const I=_.Registry.as(p.Extensions.JSONContribution);I.registerSchema(e.workbenchColorsSchemaId,n.getColorSchema());const T=new k.RunOnceScheduler(()=>I.notifySchemaChanged(e.workbenchColorsSchemaId),200);n.onDidChangeSchema(()=>{T.isScheduled()||T.schedule()})}),define(se[167],oe([1,0,7,157,67,14,2,29]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DynamicCssRules=e.GlobalEditorPointerMoveMonitor=e.EditorPointerEventFactory=e.EditorMouseEventFactory=e.EditorMouseEvent=e.createCoordinatesRelativeToEditor=e.createEditorPagePosition=e.CoordinatesRelativeToEditor=e.EditorPagePosition=e.ClientCoordinates=e.PageCoordinates=void 0;class _{constructor(o,g){this.x=o,this.y=g,this._pageCoordinatesBrand=void 0}toClientCoordinates(o){return new v(this.x-o.scrollX,this.y-o.scrollY)}}e.PageCoordinates=_;class v{constructor(o,g){this.clientX=o,this.clientY=g,this._clientCoordinatesBrand=void 0}toPageCoordinates(o){return new _(this.clientX+o.scrollX,this.clientY+o.scrollY)}}e.ClientCoordinates=v;class b{constructor(o,g,h,m){this.x=o,this.y=g,this.width=h,this.height=m,this._editorPagePositionBrand=void 0}}e.EditorPagePosition=b;class a{constructor(o,g){this.x=o,this.y=g,this._positionRelativeToEditorBrand=void 0}}e.CoordinatesRelativeToEditor=a;function i(l){const o=L.getDomNodePagePosition(l);return new b(o.left,o.top,o.width,o.height)}e.createEditorPagePosition=i;function n(l,o,g){const h=o.width/l.offsetWidth,m=o.height/l.offsetHeight,C=(g.x-o.x)/h,w=(g.y-o.y)/m;return new a(C,w)}e.createCoordinatesRelativeToEditor=n;class t extends y.StandardMouseEvent{constructor(o,g,h){super(L.getWindow(h),o),this._editorMouseEventBrand=void 0,this.isFromPointerCapture=g,this.pos=new _(this.posx,this.posy),this.editorPos=i(h),this.relativePos=n(h,this.editorPos,this.pos)}}e.EditorMouseEvent=t;class r{constructor(o){this._editorViewDomNode=o}_create(o){return new t(o,!1,this._editorViewDomNode)}onContextMenu(o,g){return L.addDisposableListener(o,"contextmenu",h=>{g(this._create(h))})}onMouseUp(o,g){return L.addDisposableListener(o,"mouseup",h=>{g(this._create(h))})}onMouseDown(o,g){return L.addDisposableListener(o,L.EventType.MOUSE_DOWN,h=>{g(this._create(h))})}onPointerDown(o,g){return L.addDisposableListener(o,L.EventType.POINTER_DOWN,h=>{g(this._create(h),h.pointerId)})}onMouseLeave(o,g){return L.addDisposableListener(o,L.EventType.MOUSE_LEAVE,h=>{g(this._create(h))})}onMouseMove(o,g){return L.addDisposableListener(o,"mousemove",h=>g(this._create(h)))}}e.EditorMouseEventFactory=r;class u{constructor(o){this._editorViewDomNode=o}_create(o){return new t(o,!1,this._editorViewDomNode)}onPointerUp(o,g){return L.addDisposableListener(o,"pointerup",h=>{g(this._create(h))})}onPointerDown(o,g){return L.addDisposableListener(o,L.EventType.POINTER_DOWN,h=>{g(this._create(h),h.pointerId)})}onPointerLeave(o,g){return L.addDisposableListener(o,L.EventType.POINTER_LEAVE,h=>{g(this._create(h))})}onPointerMove(o,g){return L.addDisposableListener(o,"pointermove",h=>g(this._create(h)))}}e.EditorPointerEventFactory=u;class f extends S.Disposable{constructor(o){super(),this._editorViewDomNode=o,this._globalPointerMoveMonitor=this._register(new k.GlobalPointerMoveMonitor),this._keydownListener=null}startMonitoring(o,g,h,m,C){this._keydownListener=L.addStandardDisposableListener(o.ownerDocument,"keydown",w=>{w.toKeyCodeChord().isModifierKey()||this._globalPointerMoveMonitor.stopMonitoring(!0,w.browserEvent)},!0),this._globalPointerMoveMonitor.startMonitoring(o,g,h,w=>{m(new t(w,!0,this._editorViewDomNode))},w=>{this._keydownListener.dispose(),C(w)})}stopMonitoring(){this._globalPointerMoveMonitor.stopMonitoring(!0)}}e.GlobalEditorPointerMoveMonitor=f;class c{constructor(o){this._editor=o,this._instanceId=++c._idPool,this._counter=0,this._rules=new Map,this._garbageCollectionScheduler=new E.RunOnceScheduler(()=>this.garbageCollect(),1e3)}createClassNameRef(o){const g=this.getOrCreateRule(o);return g.increaseRefCount(),{className:g.className,dispose:()=>{g.decreaseRefCount(),this._garbageCollectionScheduler.schedule()}}}getOrCreateRule(o){const g=this.computeUniqueKey(o);let h=this._rules.get(g);if(!h){const m=this._counter++;h=new d(g,`dyn-rule-${this._instanceId}-${m}`,L.isInShadowDOM(this._editor.getContainerDomNode())?this._editor.getContainerDomNode():void 0,o),this._rules.set(g,h)}return h}computeUniqueKey(o){return JSON.stringify(o)}garbageCollect(){for(const o of this._rules.values())o.hasReferences()||(this._rules.delete(o.key),o.dispose())}}e.DynamicCssRules=c,c._idPool=0;class d{constructor(o,g,h,m){this.key=o,this.className=g,this.properties=m,this._referenceCount=0,this._styleElementDisposables=new S.DisposableStore,this._styleElement=L.createStyleSheet(h,void 0,this._styleElementDisposables),this._styleElement.textContent=this.getCssText(this.className,this.properties)}getCssText(o,g){let h=`.${o} {`;for(const m in g){const C=g[m];let w;typeof C=="object"?w=(0,p.asCssVariable)(C.id):w=C;const D=s(m);h+=`
+	${D}: ${w};`}return h+=`
+}`,h}dispose(){this._styleElementDisposables.dispose(),this._styleElement=void 0}increaseRefCount(){this._referenceCount++}decreaseRefCount(){this._referenceCount--}hasReferences(){return this._referenceCount>0}}function s(l){return l.replace(/(^[A-Z])/,([o])=>o.toLowerCase()).replace(/([A-Z])/g,([o])=>`-${o.toLowerCase()}`)}}),define(se[834],oe([1,0,7,40,157,2,17,11,233,56,36,5,281,339,86,29,24,63,497,41,108,440]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Minimap=void 0;const l=140,o=2;class g{constructor(N,M,R){const x=N.options,O=x.get(141),B=x.get(143),W=B.minimap,V=x.get(50),K=x.get(72);this.renderMinimap=W.renderMinimap,this.size=K.size,this.minimapHeightIsEditorHeight=W.minimapHeightIsEditorHeight,this.scrollBeyondLastLine=x.get(104),this.paddingTop=x.get(83).top,this.paddingBottom=x.get(83).bottom,this.showSlider=K.showSlider,this.autohide=K.autohide,this.pixelRatio=O,this.typicalHalfwidthCharacterWidth=V.typicalHalfwidthCharacterWidth,this.lineHeight=x.get(66),this.minimapLeft=W.minimapLeft,this.minimapWidth=W.minimapWidth,this.minimapHeight=B.height,this.canvasInnerWidth=W.minimapCanvasInnerWidth,this.canvasInnerHeight=W.minimapCanvasInnerHeight,this.canvasOuterWidth=W.minimapCanvasOuterWidth,this.canvasOuterHeight=W.minimapCanvasOuterHeight,this.isSampling=W.minimapIsSampling,this.editorHeight=B.height,this.fontScale=W.minimapScale,this.minimapLineHeight=W.minimapLineHeight,this.minimapCharWidth=1*this.fontScale,this.charRenderer=(0,s.createSingleCallFunction)(()=>c.MinimapCharRendererFactory.create(this.fontScale,V.fontFamily)),this.defaultBackgroundColor=R.getColor(2),this.backgroundColor=g._getMinimapBackground(M,this.defaultBackgroundColor),this.foregroundAlpha=g._getMinimapForegroundOpacity(M)}static _getMinimapBackground(N,M){const R=N.getColor(r.minimapBackground);return R?new i.RGBA8(R.rgba.r,R.rgba.g,R.rgba.b,Math.round(255*R.rgba.a)):M}static _getMinimapForegroundOpacity(N){const M=N.getColor(r.minimapForegroundOpacity);return M?i.RGBA8._clamp(Math.round(255*M.rgba.a)):255}equals(N){return this.renderMinimap===N.renderMinimap&&this.size===N.size&&this.minimapHeightIsEditorHeight===N.minimapHeightIsEditorHeight&&this.scrollBeyondLastLine===N.scrollBeyondLastLine&&this.paddingTop===N.paddingTop&&this.paddingBottom===N.paddingBottom&&this.showSlider===N.showSlider&&this.autohide===N.autohide&&this.pixelRatio===N.pixelRatio&&this.typicalHalfwidthCharacterWidth===N.typicalHalfwidthCharacterWidth&&this.lineHeight===N.lineHeight&&this.minimapLeft===N.minimapLeft&&this.minimapWidth===N.minimapWidth&&this.minimapHeight===N.minimapHeight&&this.canvasInnerWidth===N.canvasInnerWidth&&this.canvasInnerHeight===N.canvasInnerHeight&&this.canvasOuterWidth===N.canvasOuterWidth&&this.canvasOuterHeight===N.canvasOuterHeight&&this.isSampling===N.isSampling&&this.editorHeight===N.editorHeight&&this.fontScale===N.fontScale&&this.minimapLineHeight===N.minimapLineHeight&&this.minimapCharWidth===N.minimapCharWidth&&this.defaultBackgroundColor&&this.defaultBackgroundColor.equals(N.defaultBackgroundColor)&&this.backgroundColor&&this.backgroundColor.equals(N.backgroundColor)&&this.foregroundAlpha===N.foregroundAlpha}}class h{constructor(N,M,R,x,O,B,W,V,K){this.scrollTop=N,this.scrollHeight=M,this.sliderNeeded=R,this._computedSliderRatio=x,this.sliderTop=O,this.sliderHeight=B,this.topPaddingLineCount=W,this.startLineNumber=V,this.endLineNumber=K}getDesiredScrollTopFromDelta(N){return Math.round(this.scrollTop+N/this._computedSliderRatio)}getDesiredScrollTopFromTouchLocation(N){return Math.round((N-this.sliderHeight/2)/this._computedSliderRatio)}intersectWithViewport(N){const M=Math.max(this.startLineNumber,N.startLineNumber),R=Math.min(this.endLineNumber,N.endLineNumber);return M>R?null:[M,R]}getYForLineNumber(N,M){return+(N-this.startLineNumber+this.topPaddingLineCount)*M}static create(N,M,R,x,O,B,W,V,K,F,q){const ie=N.pixelRatio,ae=N.minimapLineHeight,ne=Math.floor(N.canvasInnerHeight/ae),$=N.lineHeight;if(N.minimapHeightIsEditorHeight){let X=V*N.lineHeight+N.paddingTop+N.paddingBottom;N.scrollBeyondLastLine&&(X+=Math.max(0,O-N.lineHeight-N.paddingBottom));const U=Math.max(1,Math.floor(O*O/X)),G=Math.max(0,N.minimapHeight-U),z=G/(F-O),H=K*z,Y=G>0,j=Math.floor(N.canvasInnerHeight/N.minimapLineHeight),Z=Math.floor(N.paddingTop/N.lineHeight);return new h(K,F,Y,z,H,U,Z,1,Math.min(W,j))}let J;if(B&&R!==W){const X=R-M+1;J=Math.floor(X*ae/ie)}else{const X=O/$;J=Math.floor(X*ae/ie)}const Q=Math.floor(N.paddingTop/$);let re=Math.floor(N.paddingBottom/$);if(N.scrollBeyondLastLine){const X=O/$;re=Math.max(re,X-1)}let de;if(re>0){const X=O/$;de=(Q+W+re-X-1)*ae/ie}else de=Math.max(0,(Q+W)*ae/ie-J);de=Math.min(N.minimapHeight-J,de);const he=de/(F-O),me=K*he;if(ne>=Q+W+re){const X=de>0;return new h(K,F,X,he,me,J,Q,1,W)}else{let X;M>1?X=M+Q:X=Math.max(1,K/$);let U,G=Math.max(1,Math.floor(X-me*ie/ae));G<Q?(U=Q-G+1,G=1):(U=0,G=Math.max(1,G-Q)),q&&q.scrollHeight===F&&(q.scrollTop>K&&(G=Math.min(G,q.startLineNumber),U=Math.max(U,q.topPaddingLineCount)),q.scrollTop<K&&(G=Math.max(G,q.startLineNumber),U=Math.min(U,q.topPaddingLineCount)));const z=Math.min(W,G-U+ne-1),H=(K-x)/$;let Y;return K>=N.paddingTop?Y=(M-G+U+H)*ae/ie:Y=K/N.paddingTop*(U+H)*ae/ie,new h(K,F,!0,he,Y,J,U,G,z)}}}class m{constructor(N){this.dy=N}onContentChanged(){this.dy=-1}onTokensChanged(){this.dy=-1}}m.INVALID=new m(-1);class C{constructor(N,M,R){this.renderedLayout=N,this._imageData=M,this._renderedLines=new _.RenderedLinesCollection(()=>m.INVALID),this._renderedLines._set(N.startLineNumber,R)}linesEquals(N){if(!this.scrollEquals(N))return!1;const R=this._renderedLines._get().lines;for(let x=0,O=R.length;x<O;x++)if(R[x].dy===-1)return!1;return!0}scrollEquals(N){return this.renderedLayout.startLineNumber===N.startLineNumber&&this.renderedLayout.endLineNumber===N.endLineNumber}_get(){const N=this._renderedLines._get();return{imageData:this._imageData,rendLineNumberStart:N.rendLineNumberStart,lines:N.lines}}onLinesChanged(N,M){return this._renderedLines.onLinesChanged(N,M)}onLinesDeleted(N,M){this._renderedLines.onLinesDeleted(N,M)}onLinesInserted(N,M){this._renderedLines.onLinesInserted(N,M)}onTokensChanged(N){return this._renderedLines.onTokensChanged(N)}}class w{constructor(N,M,R,x){this._backgroundFillData=w._createBackgroundFillData(M,R,x),this._buffers=[N.createImageData(M,R),N.createImageData(M,R)],this._lastUsedBuffer=0}getBuffer(){this._lastUsedBuffer=1-this._lastUsedBuffer;const N=this._buffers[this._lastUsedBuffer];return N.data.set(this._backgroundFillData),N}static _createBackgroundFillData(N,M,R){const x=R.r,O=R.g,B=R.b,W=R.a,V=new Uint8ClampedArray(N*M*4);let K=0;for(let F=0;F<M;F++)for(let q=0;q<N;q++)V[K]=x,V[K+1]=O,V[K+2]=B,V[K+3]=W,K+=4;return V}}class D{static compute(N,M,R){if(N.renderMinimap===0||!N.isSampling)return[null,[]];const{minimapLineCount:x}=b.EditorLayoutInfoComputer.computeContainedMinimapLineCount({viewLineCount:M,scrollBeyondLastLine:N.scrollBeyondLastLine,paddingTop:N.paddingTop,paddingBottom:N.paddingBottom,height:N.editorHeight,lineHeight:N.lineHeight,pixelRatio:N.pixelRatio}),O=M/x,B=O/2;if(!R||R.minimapLines.length===0){const J=[];if(J[0]=1,x>1){for(let Q=0,re=x-1;Q<re;Q++)J[Q]=Math.round(Q*O+B);J[x-1]=M}return[new D(O,J),[]]}const W=R.minimapLines,V=W.length,K=[];let F=0,q=0,ie=1;const ae=10;let ne=[],$=null;for(let J=0;J<x;J++){const Q=Math.max(ie,Math.round(J*O)),re=Math.max(Q,Math.round((J+1)*O));for(;F<V&&W[F]<Q;){if(ne.length<ae){const he=F+1+q;$&&$.type==="deleted"&&$._oldIndex===F-1?$.deleteToLineNumber++:($={type:"deleted",_oldIndex:F,deleteFromLineNumber:he,deleteToLineNumber:he},ne.push($)),q--}F++}let de;if(F<V&&W[F]<=re)de=W[F],F++;else if(J===0?de=1:J+1===x?de=M:de=Math.round(J*O+B),ne.length<ae){const he=F+1+q;$&&$.type==="inserted"&&$._i===J-1?$.insertToLineNumber++:($={type:"inserted",_i:J,insertFromLineNumber:he,insertToLineNumber:he},ne.push($)),q++}K[J]=de,ie=de}if(ne.length<ae)for(;F<V;){const J=F+1+q;$&&$.type==="deleted"&&$._oldIndex===F-1?$.deleteToLineNumber++:($={type:"deleted",_oldIndex:F,deleteFromLineNumber:J,deleteToLineNumber:J},ne.push($)),q--,F++}else ne=[{type:"flush"}];return[new D(O,K),ne]}constructor(N,M){this.samplingRatio=N,this.minimapLines=M}modelLineToMinimapLine(N){return Math.min(this.minimapLines.length,Math.max(1,Math.round(N/this.samplingRatio)))}modelLineRangeToMinimapLineRange(N,M){let R=this.modelLineToMinimapLine(N)-1;for(;R>0&&this.minimapLines[R-1]>=N;)R--;let x=this.modelLineToMinimapLine(M)-1;for(;x+1<this.minimapLines.length&&this.minimapLines[x+1]<=M;)x++;if(R===x){const O=this.minimapLines[R];if(O<N||O>M)return null}return[R+1,x+1]}decorationLineRangeToMinimapLineRange(N,M){let R=this.modelLineToMinimapLine(N),x=this.modelLineToMinimapLine(M);return N!==M&&x===R&&(x===this.minimapLines.length?R>1&&R--:x++),[R,x]}onLinesDeleted(N){const M=N.toLineNumber-N.fromLineNumber+1;let R=this.minimapLines.length,x=0;for(let O=this.minimapLines.length-1;O>=0&&!(this.minimapLines[O]<N.fromLineNumber);O--)this.minimapLines[O]<=N.toLineNumber?(this.minimapLines[O]=Math.max(1,N.fromLineNumber-1),R=Math.min(R,O),x=Math.max(x,O)):this.minimapLines[O]-=M;return[R,x]}onLinesInserted(N){const M=N.toLineNumber-N.fromLineNumber+1;for(let R=this.minimapLines.length-1;R>=0&&!(this.minimapLines[R]<N.fromLineNumber);R--)this.minimapLines[R]+=M}}class I extends v.ViewPart{constructor(N){super(N),this.tokensColorTracker=n.MinimapTokensColorTracker.getInstance(),this._selections=[],this._minimapSelections=null,this.options=new g(this._context.configuration,this._context.theme,this.tokensColorTracker);const[M]=D.compute(this.options,this._context.viewModel.getLineCount(),null);this._samplingState=M,this._shouldCheckSampling=!1,this._actual=new T(N.theme,this)}dispose(){this._actual.dispose(),super.dispose()}getDomNode(){return this._actual.getDomNode()}_onOptionsMaybeChanged(){const N=new g(this._context.configuration,this._context.theme,this.tokensColorTracker);return this.options.equals(N)?!1:(this.options=N,this._recreateLineSampling(),this._actual.onDidChangeOptions(),!0)}onConfigurationChanged(N){return this._onOptionsMaybeChanged()}onCursorStateChanged(N){return this._selections=N.selections,this._minimapSelections=null,this._actual.onSelectionChanged()}onDecorationsChanged(N){return N.affectsMinimap?this._actual.onDecorationsChanged():!1}onFlushed(N){return this._samplingState&&(this._shouldCheckSampling=!0),this._actual.onFlushed()}onLinesChanged(N){if(this._samplingState){const M=this._samplingState.modelLineRangeToMinimapLineRange(N.fromLineNumber,N.fromLineNumber+N.count-1);return M?this._actual.onLinesChanged(M[0],M[1]-M[0]+1):!1}else return this._actual.onLinesChanged(N.fromLineNumber,N.count)}onLinesDeleted(N){if(this._samplingState){const[M,R]=this._samplingState.onLinesDeleted(N);return M<=R&&this._actual.onLinesChanged(M+1,R-M+1),this._shouldCheckSampling=!0,!0}else return this._actual.onLinesDeleted(N.fromLineNumber,N.toLineNumber)}onLinesInserted(N){return this._samplingState?(this._samplingState.onLinesInserted(N),this._shouldCheckSampling=!0,!0):this._actual.onLinesInserted(N.fromLineNumber,N.toLineNumber)}onScrollChanged(N){return this._actual.onScrollChanged()}onThemeChanged(N){return this._actual.onThemeChanged(),this._onOptionsMaybeChanged(),!0}onTokensChanged(N){if(this._samplingState){const M=[];for(const R of N.ranges){const x=this._samplingState.modelLineRangeToMinimapLineRange(R.fromLineNumber,R.toLineNumber);x&&M.push({fromLineNumber:x[0],toLineNumber:x[1]})}return M.length?this._actual.onTokensChanged(M):!1}else return this._actual.onTokensChanged(N.ranges)}onTokensColorsChanged(N){return this._onOptionsMaybeChanged(),this._actual.onTokensColorsChanged()}onZonesChanged(N){return this._actual.onZonesChanged()}prepareRender(N){this._shouldCheckSampling&&(this._shouldCheckSampling=!1,this._recreateLineSampling())}render(N){let M=N.visibleRange.startLineNumber,R=N.visibleRange.endLineNumber;this._samplingState&&(M=this._samplingState.modelLineToMinimapLine(M),R=this._samplingState.modelLineToMinimapLine(R));const x={viewportContainsWhitespaceGaps:N.viewportData.whitespaceViewportData.length>0,scrollWidth:N.scrollWidth,scrollHeight:N.scrollHeight,viewportStartLineNumber:M,viewportEndLineNumber:R,viewportStartLineNumberVerticalOffset:N.getVerticalOffsetForLineNumber(M),scrollTop:N.scrollTop,scrollLeft:N.scrollLeft,viewportWidth:N.viewportWidth,viewportHeight:N.viewportHeight};this._actual.render(x)}_recreateLineSampling(){this._minimapSelections=null;const N=!!this._samplingState,[M,R]=D.compute(this.options,this._context.viewModel.getLineCount(),this._samplingState);if(this._samplingState=M,N&&this._samplingState)for(const x of R)switch(x.type){case"deleted":this._actual.onLinesDeleted(x.deleteFromLineNumber,x.deleteToLineNumber);break;case"inserted":this._actual.onLinesInserted(x.insertFromLineNumber,x.insertToLineNumber);break;case"flush":this._actual.onFlushed();break}}getLineCount(){return this._samplingState?this._samplingState.minimapLines.length:this._context.viewModel.getLineCount()}getRealLineCount(){return this._context.viewModel.getLineCount()}getLineContent(N){return this._samplingState?this._context.viewModel.getLineContent(this._samplingState.minimapLines[N-1]):this._context.viewModel.getLineContent(N)}getLineMaxColumn(N){return this._samplingState?this._context.viewModel.getLineMaxColumn(this._samplingState.minimapLines[N-1]):this._context.viewModel.getLineMaxColumn(N)}getMinimapLinesRenderingData(N,M,R){if(this._samplingState){const x=[];for(let O=0,B=M-N+1;O<B;O++)R[O]?x[O]=this._context.viewModel.getViewLineData(this._samplingState.minimapLines[N+O-1]):x[O]=null;return x}return this._context.viewModel.getMinimapLinesRenderingData(N,M,R).data}getSelections(){if(this._minimapSelections===null)if(this._samplingState){this._minimapSelections=[];for(const N of this._selections){const[M,R]=this._samplingState.decorationLineRangeToMinimapLineRange(N.startLineNumber,N.endLineNumber);this._minimapSelections.push(new u.Selection(M,N.startColumn,R,N.endColumn))}}else this._minimapSelections=this._selections;return this._minimapSelections}getMinimapDecorationsInViewport(N,M){let R;if(this._samplingState){const O=this._samplingState.minimapLines[N-1],B=this._samplingState.minimapLines[M-1];R=new a.Range(O,1,B,this._context.viewModel.getLineMaxColumn(B))}else R=new a.Range(N,1,M,this._context.viewModel.getLineMaxColumn(M));const x=this._context.viewModel.getMinimapDecorationsInRange(R);if(this._samplingState){const O=[];for(const B of x){if(!B.options.minimap)continue;const W=B.range,V=this._samplingState.modelLineToMinimapLine(W.startLineNumber),K=this._samplingState.modelLineToMinimapLine(W.endLineNumber);O.push(new t.ViewModelDecoration(new a.Range(V,W.startColumn,K,W.endColumn),B.options))}return O}return x}getOptions(){return this._context.viewModel.model.getOptions()}revealLineNumber(N){this._samplingState&&(N=this._samplingState.minimapLines[N-1]),this._context.viewModel.revealRange("mouse",!1,new a.Range(N,1,N,1),1,0)}setScrollTop(N){this._context.viewModel.viewLayout.setScrollPosition({scrollTop:N},1)}}e.Minimap=I;class T extends E.Disposable{constructor(N,M){super(),this._renderDecorations=!1,this._gestureInProgress=!1,this._theme=N,this._model=M,this._lastRenderData=null,this._buffers=null,this._selectionColor=this._theme.getColor(r.minimapSelection),this._domNode=(0,k.createFastDomNode)(document.createElement("div")),v.PartFingerprints.write(this._domNode,9),this._domNode.setClassName(this._getMinimapDomNodeClassName()),this._domNode.setPosition("absolute"),this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true"),this._shadow=(0,k.createFastDomNode)(document.createElement("div")),this._shadow.setClassName("minimap-shadow-hidden"),this._domNode.appendChild(this._shadow),this._canvas=(0,k.createFastDomNode)(document.createElement("canvas")),this._canvas.setPosition("absolute"),this._canvas.setLeft(0),this._domNode.appendChild(this._canvas),this._decorationsCanvas=(0,k.createFastDomNode)(document.createElement("canvas")),this._decorationsCanvas.setPosition("absolute"),this._decorationsCanvas.setClassName("minimap-decorations-layer"),this._decorationsCanvas.setLeft(0),this._domNode.appendChild(this._decorationsCanvas),this._slider=(0,k.createFastDomNode)(document.createElement("div")),this._slider.setPosition("absolute"),this._slider.setClassName("minimap-slider"),this._slider.setLayerHinting(!0),this._slider.setContain("strict"),this._domNode.appendChild(this._slider),this._sliderHorizontal=(0,k.createFastDomNode)(document.createElement("div")),this._sliderHorizontal.setPosition("absolute"),this._sliderHorizontal.setClassName("minimap-slider-horizontal"),this._slider.appendChild(this._sliderHorizontal),this._applyLayout(),this._pointerDownListener=L.addStandardDisposableListener(this._domNode.domNode,L.EventType.POINTER_DOWN,R=>{if(R.preventDefault(),this._model.options.renderMinimap===0||!this._lastRenderData)return;if(this._model.options.size!=="proportional"){if(R.button===0&&this._lastRenderData){const K=L.getDomNodePagePosition(this._slider.domNode),F=K.top+K.height/2;this._startSliderDragging(R,F,this._lastRenderData.renderedLayout)}return}const O=this._model.options.minimapLineHeight,B=this._model.options.canvasInnerHeight/this._model.options.canvasOuterHeight*R.offsetY;let V=Math.floor(B/O)+this._lastRenderData.renderedLayout.startLineNumber-this._lastRenderData.renderedLayout.topPaddingLineCount;V=Math.min(V,this._model.getLineCount()),this._model.revealLineNumber(V)}),this._sliderPointerMoveMonitor=new y.GlobalPointerMoveMonitor,this._sliderPointerDownListener=L.addStandardDisposableListener(this._slider.domNode,L.EventType.POINTER_DOWN,R=>{R.preventDefault(),R.stopPropagation(),R.button===0&&this._lastRenderData&&this._startSliderDragging(R,R.pageY,this._lastRenderData.renderedLayout)}),this._gestureDisposable=f.Gesture.addTarget(this._domNode.domNode),this._sliderTouchStartListener=L.addDisposableListener(this._domNode.domNode,f.EventType.Start,R=>{R.preventDefault(),R.stopPropagation(),this._lastRenderData&&(this._slider.toggleClassName("active",!0),this._gestureInProgress=!0,this.scrollDueToTouchEvent(R))},{passive:!1}),this._sliderTouchMoveListener=L.addDisposableListener(this._domNode.domNode,f.EventType.Change,R=>{R.preventDefault(),R.stopPropagation(),this._lastRenderData&&this._gestureInProgress&&this.scrollDueToTouchEvent(R)},{passive:!1}),this._sliderTouchEndListener=L.addStandardDisposableListener(this._domNode.domNode,f.EventType.End,R=>{R.preventDefault(),R.stopPropagation(),this._gestureInProgress=!1,this._slider.toggleClassName("active",!1)})}_startSliderDragging(N,M,R){if(!N.target||!(N.target instanceof Element))return;const x=N.pageX;this._slider.toggleClassName("active",!0);const O=(B,W)=>{const V=L.getDomNodePagePosition(this._domNode.domNode),K=Math.min(Math.abs(W-x),Math.abs(W-V.left),Math.abs(W-V.left-V.width));if(S.isWindows&&K>l){this._model.setScrollTop(R.scrollTop);return}const F=B-M;this._model.setScrollTop(R.getDesiredScrollTopFromDelta(F))};N.pageY!==M&&O(N.pageY,x),this._sliderPointerMoveMonitor.startMonitoring(N.target,N.pointerId,N.buttons,B=>O(B.pageY,B.pageX),()=>{this._slider.toggleClassName("active",!1)})}scrollDueToTouchEvent(N){const M=this._domNode.domNode.getBoundingClientRect().top,R=this._lastRenderData.renderedLayout.getDesiredScrollTopFromTouchLocation(N.pageY-M);this._model.setScrollTop(R)}dispose(){this._pointerDownListener.dispose(),this._sliderPointerMoveMonitor.dispose(),this._sliderPointerDownListener.dispose(),this._gestureDisposable.dispose(),this._sliderTouchStartListener.dispose(),this._sliderTouchMoveListener.dispose(),this._sliderTouchEndListener.dispose(),super.dispose()}_getMinimapDomNodeClassName(){const N=["minimap"];return this._model.options.showSlider==="always"?N.push("slider-always"):N.push("slider-mouseover"),this._model.options.autohide&&N.push("autohide"),N.join(" ")}getDomNode(){return this._domNode}_applyLayout(){this._domNode.setLeft(this._model.options.minimapLeft),this._domNode.setWidth(this._model.options.minimapWidth),this._domNode.setHeight(this._model.options.minimapHeight),this._shadow.setHeight(this._model.options.minimapHeight),this._canvas.setWidth(this._model.options.canvasOuterWidth),this._canvas.setHeight(this._model.options.canvasOuterHeight),this._canvas.domNode.width=this._model.options.canvasInnerWidth,this._canvas.domNode.height=this._model.options.canvasInnerHeight,this._decorationsCanvas.setWidth(this._model.options.canvasOuterWidth),this._decorationsCanvas.setHeight(this._model.options.canvasOuterHeight),this._decorationsCanvas.domNode.width=this._model.options.canvasInnerWidth,this._decorationsCanvas.domNode.height=this._model.options.canvasInnerHeight,this._slider.setWidth(this._model.options.minimapWidth)}_getBuffer(){return this._buffers||this._model.options.canvasInnerWidth>0&&this._model.options.canvasInnerHeight>0&&(this._buffers=new w(this._canvas.domNode.getContext("2d"),this._model.options.canvasInnerWidth,this._model.options.canvasInnerHeight,this._model.options.backgroundColor)),this._buffers?this._buffers.getBuffer():null}onDidChangeOptions(){this._lastRenderData=null,this._buffers=null,this._applyLayout(),this._domNode.setClassName(this._getMinimapDomNodeClassName())}onSelectionChanged(){return this._renderDecorations=!0,!0}onDecorationsChanged(){return this._renderDecorations=!0,!0}onFlushed(){return this._lastRenderData=null,!0}onLinesChanged(N,M){return this._lastRenderData?this._lastRenderData.onLinesChanged(N,M):!1}onLinesDeleted(N,M){var R;return(R=this._lastRenderData)===null||R===void 0||R.onLinesDeleted(N,M),!0}onLinesInserted(N,M){var R;return(R=this._lastRenderData)===null||R===void 0||R.onLinesInserted(N,M),!0}onScrollChanged(){return this._renderDecorations=!0,!0}onThemeChanged(){return this._selectionColor=this._theme.getColor(r.minimapSelection),this._renderDecorations=!0,!0}onTokensChanged(N){return this._lastRenderData?this._lastRenderData.onTokensChanged(N):!1}onTokensColorsChanged(){return this._lastRenderData=null,this._buffers=null,!0}onZonesChanged(){return this._lastRenderData=null,!0}render(N){if(this._model.options.renderMinimap===0){this._shadow.setClassName("minimap-shadow-hidden"),this._sliderHorizontal.setWidth(0),this._sliderHorizontal.setHeight(0);return}N.scrollLeft+N.viewportWidth>=N.scrollWidth?this._shadow.setClassName("minimap-shadow-hidden"):this._shadow.setClassName("minimap-shadow-visible");const R=h.create(this._model.options,N.viewportStartLineNumber,N.viewportEndLineNumber,N.viewportStartLineNumberVerticalOffset,N.viewportHeight,N.viewportContainsWhitespaceGaps,this._model.getLineCount(),this._model.getRealLineCount(),N.scrollTop,N.scrollHeight,this._lastRenderData?this._lastRenderData.renderedLayout:null);this._slider.setDisplay(R.sliderNeeded?"block":"none"),this._slider.setTop(R.sliderTop),this._slider.setHeight(R.sliderHeight),this._sliderHorizontal.setLeft(0),this._sliderHorizontal.setWidth(this._model.options.minimapWidth),this._sliderHorizontal.setTop(0),this._sliderHorizontal.setHeight(R.sliderHeight),this.renderDecorations(R),this._lastRenderData=this.renderLines(R)}renderDecorations(N){if(this._renderDecorations){this._renderDecorations=!1;const M=this._model.getSelections();M.sort(a.Range.compareRangesUsingStarts);const R=this._model.getMinimapDecorationsInViewport(N.startLineNumber,N.endLineNumber);R.sort((ie,ae)=>(ie.options.zIndex||0)-(ae.options.zIndex||0));const{canvasInnerWidth:x,canvasInnerHeight:O}=this._model.options,B=this._model.options.minimapLineHeight,W=this._model.options.minimapCharWidth,V=this._model.getOptions().tabSize,K=this._decorationsCanvas.domNode.getContext("2d");K.clearRect(0,0,x,O);const F=new A(N.startLineNumber,N.endLineNumber,!1);this._renderSelectionLineHighlights(K,M,F,N,B),this._renderDecorationsLineHighlights(K,R,F,N,B);const q=new A(N.startLineNumber,N.endLineNumber,null);this._renderSelectionsHighlights(K,M,q,N,B,V,W,x),this._renderDecorationsHighlights(K,R,q,N,B,V,W,x)}}_renderSelectionLineHighlights(N,M,R,x,O){if(!this._selectionColor||this._selectionColor.isTransparent())return;N.fillStyle=this._selectionColor.transparent(.5).toString();let B=0,W=0;for(const V of M){const K=x.intersectWithViewport(V);if(!K)continue;const[F,q]=K;for(let ne=F;ne<=q;ne++)R.set(ne,!0);const ie=x.getYForLineNumber(F,O),ae=x.getYForLineNumber(q,O);W>=ie||(W>B&&N.fillRect(b.MINIMAP_GUTTER_WIDTH,B,N.canvas.width,W-B),B=ie),W=ae}W>B&&N.fillRect(b.MINIMAP_GUTTER_WIDTH,B,N.canvas.width,W-B)}_renderDecorationsLineHighlights(N,M,R,x,O){const B=new Map;for(let W=M.length-1;W>=0;W--){const V=M[W],K=V.options.minimap;if(!K||K.position!==d.MinimapPosition.Inline)continue;const F=x.intersectWithViewport(V.range);if(!F)continue;const[q,ie]=F,ae=K.getColor(this._theme.value);if(!ae||ae.isTransparent())continue;let ne=B.get(ae.toString());ne||(ne=ae.transparent(.5).toString(),B.set(ae.toString(),ne)),N.fillStyle=ne;for(let $=q;$<=ie;$++){if(R.has($))continue;R.set($,!0);const J=x.getYForLineNumber(q,O);N.fillRect(b.MINIMAP_GUTTER_WIDTH,J,N.canvas.width,O)}}}_renderSelectionsHighlights(N,M,R,x,O,B,W,V){if(!(!this._selectionColor||this._selectionColor.isTransparent()))for(const K of M){const F=x.intersectWithViewport(K);if(!F)continue;const[q,ie]=F;for(let ae=q;ae<=ie;ae++)this.renderDecorationOnLine(N,R,K,this._selectionColor,x,ae,O,O,B,W,V)}}_renderDecorationsHighlights(N,M,R,x,O,B,W,V){for(const K of M){const F=K.options.minimap;if(!F)continue;const q=x.intersectWithViewport(K.range);if(!q)continue;const[ie,ae]=q,ne=F.getColor(this._theme.value);if(!(!ne||ne.isTransparent()))for(let $=ie;$<=ae;$++)switch(F.position){case d.MinimapPosition.Inline:this.renderDecorationOnLine(N,R,K.range,ne,x,$,O,O,B,W,V);continue;case d.MinimapPosition.Gutter:{const J=x.getYForLineNumber($,O),Q=2;this.renderDecoration(N,ne,Q,J,o,O);continue}}}}renderDecorationOnLine(N,M,R,x,O,B,W,V,K,F,q){const ie=O.getYForLineNumber(B,V);if(ie+W<0||ie>this._model.options.canvasInnerHeight)return;const{startLineNumber:ae,endLineNumber:ne}=R,$=ae===B?R.startColumn:1,J=ne===B?R.endColumn:this._model.getLineMaxColumn(B),Q=this.getXOffsetForPosition(M,B,$,K,F,q),re=this.getXOffsetForPosition(M,B,J,K,F,q);this.renderDecoration(N,x,Q,ie,re-Q,W)}getXOffsetForPosition(N,M,R,x,O,B){if(R===1)return b.MINIMAP_GUTTER_WIDTH;if((R-1)*O>=B)return B;let V=N.get(M);if(!V){const K=this._model.getLineContent(M);V=[b.MINIMAP_GUTTER_WIDTH];let F=b.MINIMAP_GUTTER_WIDTH;for(let q=1;q<K.length+1;q++){const ie=K.charCodeAt(q-1),ae=ie===9?x*O:p.isFullWidthCharacter(ie)?2*O:O,ne=F+ae;if(ne>=B){V[q]=B;break}V[q]=ne,F=ne}N.set(M,V)}return R-1<V.length?V[R-1]:B}renderDecoration(N,M,R,x,O,B){N.fillStyle=M&&M.toString()||"",N.fillRect(R,x,O,B)}renderLines(N){const M=N.startLineNumber,R=N.endLineNumber,x=this._model.options.minimapLineHeight;if(this._lastRenderData&&this._lastRenderData.linesEquals(N)){const le=this._lastRenderData._get();return new C(N,le.imageData,le.lines)}const O=this._getBuffer();if(!O)return null;const[B,W,V]=T._renderUntouchedLines(O,N.topPaddingLineCount,M,R,x,this._lastRenderData),K=this._model.getMinimapLinesRenderingData(M,R,V),F=this._model.getOptions().tabSize,q=this._model.options.defaultBackgroundColor,ie=this._model.options.backgroundColor,ae=this._model.options.foregroundAlpha,ne=this._model.tokensColorTracker,$=ne.backgroundIsLight(),J=this._model.options.renderMinimap,Q=this._model.options.charRenderer(),re=this._model.options.fontScale,de=this._model.options.minimapCharWidth,me=(J===1?2:2+1)*re,X=x>me?Math.floor((x-me)/2):0,U=ie.a/255,G=new i.RGBA8(Math.round((ie.r-q.r)*U+q.r),Math.round((ie.g-q.g)*U+q.g),Math.round((ie.b-q.b)*U+q.b),255);let z=N.topPaddingLineCount*x;const H=[];for(let le=0,ue=R-M+1;le<ue;le++)V[le]&&T._renderLine(O,G,ie.a,$,J,de,ne,ae,Q,z,X,F,K[le],re,x),H[le]=new m(z),z+=x;const Y=B===-1?0:B,Z=(W===-1?O.height:W)-Y;return this._canvas.domNode.getContext("2d").putImageData(O,0,0,0,Y,O.width,Z),new C(N,O,H)}static _renderUntouchedLines(N,M,R,x,O,B){const W=[];if(!B){for(let z=0,H=x-R+1;z<H;z++)W[z]=!0;return[-1,-1,W]}const V=B._get(),K=V.imageData.data,F=V.rendLineNumberStart,q=V.lines,ie=q.length,ae=N.width,ne=N.data,$=(x-R+1)*O*ae*4;let J=-1,Q=-1,re=-1,de=-1,he=-1,me=-1,X=M*O;for(let z=R;z<=x;z++){const H=z-R,Y=z-F,j=Y>=0&&Y<ie?q[Y].dy:-1;if(j===-1){W[H]=!0,X+=O;continue}const Z=j*ae*4,ee=(j+O)*ae*4,le=X*ae*4,ue=(X+O)*ae*4;de===Z&&me===le?(de=ee,me=ue):(re!==-1&&(ne.set(K.subarray(re,de),he),J===-1&&re===0&&re===he&&(J=de),Q===-1&&de===$&&re===he&&(Q=re)),re=Z,de=ee,he=le,me=ue),W[H]=!1,X+=O}re!==-1&&(ne.set(K.subarray(re,de),he),J===-1&&re===0&&re===he&&(J=de),Q===-1&&de===$&&re===he&&(Q=re));const U=J===-1?-1:J/(ae*4),G=Q===-1?-1:Q/(ae*4);return[U,G,W]}static _renderLine(N,M,R,x,O,B,W,V,K,F,q,ie,ae,ne,$){const J=ae.content,Q=ae.tokens,re=N.width-B,de=$===1;let he=b.MINIMAP_GUTTER_WIDTH,me=0,X=0;for(let U=0,G=Q.getCount();U<G;U++){const z=Q.getEndOffset(U),H=Q.getForeground(U),Y=W.getColor(H);for(;me<z;me++){if(he>re)return;const j=J.charCodeAt(me);if(j===9){const Z=ie-(me+X)%ie;X+=Z-1,he+=Z*B}else if(j===32)he+=B;else{const Z=p.isFullWidthCharacter(j)?2:1;for(let ee=0;ee<Z;ee++)if(O===2?K.blockRenderChar(N,he,F+q,Y,V,M,R,de):K.renderChar(N,he,F+q,j,Y,V,M,R,ne,x,de),he+=B,he>re)return}}}}}class A{constructor(N,M,R){this._startLineNumber=N,this._endLineNumber=M,this._defaultValue=R,this._values=[];for(let x=0,O=this._endLineNumber-this._startLineNumber+1;x<O;x++)this._values[x]=R}has(N){return this.get(N)!==this._defaultValue}set(N,M){N<this._startLineNumber||N>this._endLineNumber||(this._values[N-this._startLineNumber]=M)}get(N){return N<this._startLineNumber||N>this._endLineNumber?this._defaultValue:this._values[N-this._startLineNumber]}}}),define(se[835],oe([1,0,633,29]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.multiDiffEditorBorder=e.multiDiffEditorBackground=e.multiDiffEditorHeaderBackground=void 0,e.multiDiffEditorHeaderBackground=(0,k.registerColor)("multiDiffEditor.headerBackground",{dark:"#808080",light:"#b4b4b4",hcDark:"#808080",hcLight:"#b4b4b4"},(0,L.localize)(0,null)),e.multiDiffEditorBackground=(0,k.registerColor)("multiDiffEditor.background",{dark:"#000000",light:"#e5e5e5",hcDark:"#000000",hcLight:"#e5e5e5"},(0,L.localize)(1,null)),e.multiDiffEditorBorder=(0,k.registerColor)("multiDiffEditor.border",{dark:"sideBarSectionHeader.border",light:"#cccccc",hcDark:"sideBarSectionHeader.border",hcLight:"#cccccc"},(0,L.localize)(2,null))}),define(se[254],oe([1,0,722,29,479]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SYMBOL_ICON_VARIABLE_FOREGROUND=e.SYMBOL_ICON_UNIT_FOREGROUND=e.SYMBOL_ICON_TYPEPARAMETER_FOREGROUND=e.SYMBOL_ICON_TEXT_FOREGROUND=e.SYMBOL_ICON_STRUCT_FOREGROUND=e.SYMBOL_ICON_STRING_FOREGROUND=e.SYMBOL_ICON_SNIPPET_FOREGROUND=e.SYMBOL_ICON_REFERENCE_FOREGROUND=e.SYMBOL_ICON_PROPERTY_FOREGROUND=e.SYMBOL_ICON_PACKAGE_FOREGROUND=e.SYMBOL_ICON_OPERATOR_FOREGROUND=e.SYMBOL_ICON_OBJECT_FOREGROUND=e.SYMBOL_ICON_NUMBER_FOREGROUND=e.SYMBOL_ICON_NULL_FOREGROUND=e.SYMBOL_ICON_NAMESPACE_FOREGROUND=e.SYMBOL_ICON_MODULE_FOREGROUND=e.SYMBOL_ICON_METHOD_FOREGROUND=e.SYMBOL_ICON_KEYWORD_FOREGROUND=e.SYMBOL_ICON_KEY_FOREGROUND=e.SYMBOL_ICON_INTERFACE_FOREGROUND=e.SYMBOL_ICON_FUNCTION_FOREGROUND=e.SYMBOL_ICON_FOLDER_FOREGROUND=e.SYMBOL_ICON_FILE_FOREGROUND=e.SYMBOL_ICON_FIELD_FOREGROUND=e.SYMBOL_ICON_EVENT_FOREGROUND=e.SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND=e.SYMBOL_ICON_ENUMERATOR_FOREGROUND=e.SYMBOL_ICON_CONSTRUCTOR_FOREGROUND=e.SYMBOL_ICON_CONSTANT_FOREGROUND=e.SYMBOL_ICON_COLOR_FOREGROUND=e.SYMBOL_ICON_CLASS_FOREGROUND=e.SYMBOL_ICON_BOOLEAN_FOREGROUND=e.SYMBOL_ICON_ARRAY_FOREGROUND=void 0,e.SYMBOL_ICON_ARRAY_FOREGROUND=(0,k.registerColor)("symbolIcon.arrayForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(0,null)),e.SYMBOL_ICON_BOOLEAN_FOREGROUND=(0,k.registerColor)("symbolIcon.booleanForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(1,null)),e.SYMBOL_ICON_CLASS_FOREGROUND=(0,k.registerColor)("symbolIcon.classForeground",{dark:"#EE9D28",light:"#D67E00",hcDark:"#EE9D28",hcLight:"#D67E00"},(0,L.localize)(2,null)),e.SYMBOL_ICON_COLOR_FOREGROUND=(0,k.registerColor)("symbolIcon.colorForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(3,null)),e.SYMBOL_ICON_CONSTANT_FOREGROUND=(0,k.registerColor)("symbolIcon.constantForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(4,null)),e.SYMBOL_ICON_CONSTRUCTOR_FOREGROUND=(0,k.registerColor)("symbolIcon.constructorForeground",{dark:"#B180D7",light:"#652D90",hcDark:"#B180D7",hcLight:"#652D90"},(0,L.localize)(5,null)),e.SYMBOL_ICON_ENUMERATOR_FOREGROUND=(0,k.registerColor)("symbolIcon.enumeratorForeground",{dark:"#EE9D28",light:"#D67E00",hcDark:"#EE9D28",hcLight:"#D67E00"},(0,L.localize)(6,null)),e.SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND=(0,k.registerColor)("symbolIcon.enumeratorMemberForeground",{dark:"#75BEFF",light:"#007ACC",hcDark:"#75BEFF",hcLight:"#007ACC"},(0,L.localize)(7,null)),e.SYMBOL_ICON_EVENT_FOREGROUND=(0,k.registerColor)("symbolIcon.eventForeground",{dark:"#EE9D28",light:"#D67E00",hcDark:"#EE9D28",hcLight:"#D67E00"},(0,L.localize)(8,null)),e.SYMBOL_ICON_FIELD_FOREGROUND=(0,k.registerColor)("symbolIcon.fieldForeground",{dark:"#75BEFF",light:"#007ACC",hcDark:"#75BEFF",hcLight:"#007ACC"},(0,L.localize)(9,null)),e.SYMBOL_ICON_FILE_FOREGROUND=(0,k.registerColor)("symbolIcon.fileForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(10,null)),e.SYMBOL_ICON_FOLDER_FOREGROUND=(0,k.registerColor)("symbolIcon.folderForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(11,null)),e.SYMBOL_ICON_FUNCTION_FOREGROUND=(0,k.registerColor)("symbolIcon.functionForeground",{dark:"#B180D7",light:"#652D90",hcDark:"#B180D7",hcLight:"#652D90"},(0,L.localize)(12,null)),e.SYMBOL_ICON_INTERFACE_FOREGROUND=(0,k.registerColor)("symbolIcon.interfaceForeground",{dark:"#75BEFF",light:"#007ACC",hcDark:"#75BEFF",hcLight:"#007ACC"},(0,L.localize)(13,null)),e.SYMBOL_ICON_KEY_FOREGROUND=(0,k.registerColor)("symbolIcon.keyForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(14,null)),e.SYMBOL_ICON_KEYWORD_FOREGROUND=(0,k.registerColor)("symbolIcon.keywordForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(15,null)),e.SYMBOL_ICON_METHOD_FOREGROUND=(0,k.registerColor)("symbolIcon.methodForeground",{dark:"#B180D7",light:"#652D90",hcDark:"#B180D7",hcLight:"#652D90"},(0,L.localize)(16,null)),e.SYMBOL_ICON_MODULE_FOREGROUND=(0,k.registerColor)("symbolIcon.moduleForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(17,null)),e.SYMBOL_ICON_NAMESPACE_FOREGROUND=(0,k.registerColor)("symbolIcon.namespaceForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(18,null)),e.SYMBOL_ICON_NULL_FOREGROUND=(0,k.registerColor)("symbolIcon.nullForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(19,null)),e.SYMBOL_ICON_NUMBER_FOREGROUND=(0,k.registerColor)("symbolIcon.numberForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(20,null)),e.SYMBOL_ICON_OBJECT_FOREGROUND=(0,k.registerColor)("symbolIcon.objectForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(21,null)),e.SYMBOL_ICON_OPERATOR_FOREGROUND=(0,k.registerColor)("symbolIcon.operatorForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(22,null)),e.SYMBOL_ICON_PACKAGE_FOREGROUND=(0,k.registerColor)("symbolIcon.packageForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(23,null)),e.SYMBOL_ICON_PROPERTY_FOREGROUND=(0,k.registerColor)("symbolIcon.propertyForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(24,null)),e.SYMBOL_ICON_REFERENCE_FOREGROUND=(0,k.registerColor)("symbolIcon.referenceForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(25,null)),e.SYMBOL_ICON_SNIPPET_FOREGROUND=(0,k.registerColor)("symbolIcon.snippetForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(26,null)),e.SYMBOL_ICON_STRING_FOREGROUND=(0,k.registerColor)("symbolIcon.stringForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(27,null)),e.SYMBOL_ICON_STRUCT_FOREGROUND=(0,k.registerColor)("symbolIcon.structForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(28,null)),e.SYMBOL_ICON_TEXT_FOREGROUND=(0,k.registerColor)("symbolIcon.textForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(29,null)),e.SYMBOL_ICON_TYPEPARAMETER_FOREGROUND=(0,k.registerColor)("symbolIcon.typeParameterForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(30,null)),e.SYMBOL_ICON_UNIT_FOREGROUND=(0,k.registerColor)("symbolIcon.unitForeground",{dark:k.foreground,light:k.foreground,hcDark:k.foreground,hcLight:k.foreground},(0,L.localize)(31,null)),e.SYMBOL_ICON_VARIABLE_FOREGROUND=(0,k.registerColor)("symbolIcon.variableForeground",{dark:"#75BEFF",light:"#007ACC",hcDark:"#75BEFF",hcLight:"#007ACC"},(0,L.localize)(32,null))}),define(se[836],oe([1,0,26,116,658,177,254]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toMenuItems=void 0;const E=Object.freeze({kind:k.CodeActionKind.Empty,title:(0,y.localize)(0,null)}),S=Object.freeze([{kind:k.CodeActionKind.QuickFix,title:(0,y.localize)(1,null)},{kind:k.CodeActionKind.RefactorExtract,title:(0,y.localize)(2,null),icon:L.Codicon.wrench},{kind:k.CodeActionKind.RefactorInline,title:(0,y.localize)(3,null),icon:L.Codicon.wrench},{kind:k.CodeActionKind.RefactorRewrite,title:(0,y.localize)(4,null),icon:L.Codicon.wrench},{kind:k.CodeActionKind.RefactorMove,title:(0,y.localize)(5,null),icon:L.Codicon.wrench},{kind:k.CodeActionKind.SurroundWith,title:(0,y.localize)(6,null),icon:L.Codicon.surroundWith},{kind:k.CodeActionKind.Source,title:(0,y.localize)(7,null),icon:L.Codicon.symbolFile},E]);function p(_,v,b){if(!v)return _.map(n=>{var t;return{kind:"action",item:n,group:E,disabled:!!n.action.disabled,label:n.action.disabled||n.action.title,canPreview:!!(!((t=n.action.edit)===null||t===void 0)&&t.edits.length)}});const a=S.map(n=>({group:n,actions:[]}));for(const n of _){const t=n.action.kind?new k.CodeActionKind(n.action.kind):k.CodeActionKind.None;for(const r of a)if(r.group.kind.contains(t)){r.actions.push(n);break}}const i=[];for(const n of a)if(n.actions.length){i.push({kind:"header",group:n.group});for(const t of n.actions){const r=n.group;i.push({kind:"action",item:t,group:t.action.isAI?{title:r.title,kind:r.kind,icon:L.Codicon.sparkle}:r,label:t.action.title,disabled:!!t.action.disabled,keybinding:b(t.action)})}}return i}e.toMenuItems=p}),define(se[106],oe([1,0,29,39]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.defaultMenuStyles=e.defaultSelectBoxStyles=e.getListStyles=e.defaultListStyles=e.defaultBreadcrumbsWidgetStyles=e.defaultCountBadgeStyles=e.defaultFindWidgetStyles=e.defaultInputBoxStyles=e.defaultDialogStyles=e.defaultCheckboxStyles=e.defaultToggleStyles=e.defaultProgressBarStyles=e.defaultButtonStyles=e.defaultKeybindingLabelStyles=void 0;function y(S,p){const _={...p};for(const v in S){const b=S[v];_[v]=b!==void 0?(0,L.asCssVariable)(b):void 0}return _}e.defaultKeybindingLabelStyles={keybindingLabelBackground:(0,L.asCssVariable)(L.keybindingLabelBackground),keybindingLabelForeground:(0,L.asCssVariable)(L.keybindingLabelForeground),keybindingLabelBorder:(0,L.asCssVariable)(L.keybindingLabelBorder),keybindingLabelBottomBorder:(0,L.asCssVariable)(L.keybindingLabelBottomBorder),keybindingLabelShadow:(0,L.asCssVariable)(L.widgetShadow)},e.defaultButtonStyles={buttonForeground:(0,L.asCssVariable)(L.buttonForeground),buttonSeparator:(0,L.asCssVariable)(L.buttonSeparator),buttonBackground:(0,L.asCssVariable)(L.buttonBackground),buttonHoverBackground:(0,L.asCssVariable)(L.buttonHoverBackground),buttonSecondaryForeground:(0,L.asCssVariable)(L.buttonSecondaryForeground),buttonSecondaryBackground:(0,L.asCssVariable)(L.buttonSecondaryBackground),buttonSecondaryHoverBackground:(0,L.asCssVariable)(L.buttonSecondaryHoverBackground),buttonBorder:(0,L.asCssVariable)(L.buttonBorder)},e.defaultProgressBarStyles={progressBarBackground:(0,L.asCssVariable)(L.progressBarBackground)},e.defaultToggleStyles={inputActiveOptionBorder:(0,L.asCssVariable)(L.inputActiveOptionBorder),inputActiveOptionForeground:(0,L.asCssVariable)(L.inputActiveOptionForeground),inputActiveOptionBackground:(0,L.asCssVariable)(L.inputActiveOptionBackground)},e.defaultCheckboxStyles={checkboxBackground:(0,L.asCssVariable)(L.checkboxBackground),checkboxBorder:(0,L.asCssVariable)(L.checkboxBorder),checkboxForeground:(0,L.asCssVariable)(L.checkboxForeground)},e.defaultDialogStyles={dialogBackground:(0,L.asCssVariable)(L.editorWidgetBackground),dialogForeground:(0,L.asCssVariable)(L.editorWidgetForeground),dialogShadow:(0,L.asCssVariable)(L.widgetShadow),dialogBorder:(0,L.asCssVariable)(L.contrastBorder),errorIconForeground:(0,L.asCssVariable)(L.problemsErrorIconForeground),warningIconForeground:(0,L.asCssVariable)(L.problemsWarningIconForeground),infoIconForeground:(0,L.asCssVariable)(L.problemsInfoIconForeground),textLinkForeground:(0,L.asCssVariable)(L.textLinkForeground)},e.defaultInputBoxStyles={inputBackground:(0,L.asCssVariable)(L.inputBackground),inputForeground:(0,L.asCssVariable)(L.inputForeground),inputBorder:(0,L.asCssVariable)(L.inputBorder),inputValidationInfoBorder:(0,L.asCssVariable)(L.inputValidationInfoBorder),inputValidationInfoBackground:(0,L.asCssVariable)(L.inputValidationInfoBackground),inputValidationInfoForeground:(0,L.asCssVariable)(L.inputValidationInfoForeground),inputValidationWarningBorder:(0,L.asCssVariable)(L.inputValidationWarningBorder),inputValidationWarningBackground:(0,L.asCssVariable)(L.inputValidationWarningBackground),inputValidationWarningForeground:(0,L.asCssVariable)(L.inputValidationWarningForeground),inputValidationErrorBorder:(0,L.asCssVariable)(L.inputValidationErrorBorder),inputValidationErrorBackground:(0,L.asCssVariable)(L.inputValidationErrorBackground),inputValidationErrorForeground:(0,L.asCssVariable)(L.inputValidationErrorForeground)},e.defaultFindWidgetStyles={listFilterWidgetBackground:(0,L.asCssVariable)(L.listFilterWidgetBackground),listFilterWidgetOutline:(0,L.asCssVariable)(L.listFilterWidgetOutline),listFilterWidgetNoMatchesOutline:(0,L.asCssVariable)(L.listFilterWidgetNoMatchesOutline),listFilterWidgetShadow:(0,L.asCssVariable)(L.listFilterWidgetShadow),inputBoxStyles:e.defaultInputBoxStyles,toggleStyles:e.defaultToggleStyles},e.defaultCountBadgeStyles={badgeBackground:(0,L.asCssVariable)(L.badgeBackground),badgeForeground:(0,L.asCssVariable)(L.badgeForeground),badgeBorder:(0,L.asCssVariable)(L.contrastBorder)},e.defaultBreadcrumbsWidgetStyles={breadcrumbsBackground:(0,L.asCssVariable)(L.breadcrumbsBackground),breadcrumbsForeground:(0,L.asCssVariable)(L.breadcrumbsForeground),breadcrumbsHoverForeground:(0,L.asCssVariable)(L.breadcrumbsFocusForeground),breadcrumbsFocusForeground:(0,L.asCssVariable)(L.breadcrumbsFocusForeground),breadcrumbsFocusAndSelectionForeground:(0,L.asCssVariable)(L.breadcrumbsActiveSelectionForeground)},e.defaultListStyles={listBackground:void 0,listInactiveFocusForeground:void 0,listFocusBackground:(0,L.asCssVariable)(L.listFocusBackground),listFocusForeground:(0,L.asCssVariable)(L.listFocusForeground),listFocusOutline:(0,L.asCssVariable)(L.listFocusOutline),listActiveSelectionBackground:(0,L.asCssVariable)(L.listActiveSelectionBackground),listActiveSelectionForeground:(0,L.asCssVariable)(L.listActiveSelectionForeground),listActiveSelectionIconForeground:(0,L.asCssVariable)(L.listActiveSelectionIconForeground),listFocusAndSelectionOutline:(0,L.asCssVariable)(L.listFocusAndSelectionOutline),listFocusAndSelectionBackground:(0,L.asCssVariable)(L.listActiveSelectionBackground),listFocusAndSelectionForeground:(0,L.asCssVariable)(L.listActiveSelectionForeground),listInactiveSelectionBackground:(0,L.asCssVariable)(L.listInactiveSelectionBackground),listInactiveSelectionIconForeground:(0,L.asCssVariable)(L.listInactiveSelectionIconForeground),listInactiveSelectionForeground:(0,L.asCssVariable)(L.listInactiveSelectionForeground),listInactiveFocusBackground:(0,L.asCssVariable)(L.listInactiveFocusBackground),listInactiveFocusOutline:(0,L.asCssVariable)(L.listInactiveFocusOutline),listHoverBackground:(0,L.asCssVariable)(L.listHoverBackground),listHoverForeground:(0,L.asCssVariable)(L.listHoverForeground),listDropOverBackground:(0,L.asCssVariable)(L.listDropOverBackground),listDropBetweenBackground:(0,L.asCssVariable)(L.listDropBetweenBackground),listSelectionOutline:(0,L.asCssVariable)(L.activeContrastBorder),listHoverOutline:(0,L.asCssVariable)(L.activeContrastBorder),treeIndentGuidesStroke:(0,L.asCssVariable)(L.treeIndentGuidesStroke),treeInactiveIndentGuidesStroke:(0,L.asCssVariable)(L.treeInactiveIndentGuidesStroke),tableColumnsBorder:(0,L.asCssVariable)(L.tableColumnsBorder),tableOddRowsBackgroundColor:(0,L.asCssVariable)(L.tableOddRowsBackgroundColor)};function E(S){return y(S,e.defaultListStyles)}e.getListStyles=E,e.defaultSelectBoxStyles={selectBackground:(0,L.asCssVariable)(L.selectBackground),selectListBackground:(0,L.asCssVariable)(L.selectListBackground),selectForeground:(0,L.asCssVariable)(L.selectForeground),decoratorRightForeground:(0,L.asCssVariable)(L.pickerGroupForeground),selectBorder:(0,L.asCssVariable)(L.selectBorder),focusBorder:(0,L.asCssVariable)(L.focusBorder),listFocusBackground:(0,L.asCssVariable)(L.quickInputListFocusBackground),listInactiveSelectionIconForeground:(0,L.asCssVariable)(L.quickInputListFocusIconForeground),listFocusForeground:(0,L.asCssVariable)(L.quickInputListFocusForeground),listFocusOutline:(0,L.asCssVariableWithDefault)(L.activeContrastBorder,k.Color.transparent.toString()),listHoverBackground:(0,L.asCssVariable)(L.listHoverBackground),listHoverForeground:(0,L.asCssVariable)(L.listHoverForeground),listHoverOutline:(0,L.asCssVariable)(L.activeContrastBorder),selectListBorder:(0,L.asCssVariable)(L.editorWidgetBorder),listBackground:void 0,listActiveSelectionBackground:void 0,listActiveSelectionForeground:void 0,listActiveSelectionIconForeground:void 0,listFocusAndSelectionBackground:void 0,listDropOverBackground:void 0,listDropBetweenBackground:void 0,listInactiveSelectionBackground:void 0,listInactiveSelectionForeground:void 0,listInactiveFocusBackground:void 0,listInactiveFocusOutline:void 0,listSelectionOutline:void 0,listFocusAndSelectionForeground:void 0,listFocusAndSelectionOutline:void 0,listInactiveFocusForeground:void 0,tableColumnsBorder:void 0,tableOddRowsBackgroundColor:void 0,treeIndentGuidesStroke:void 0,treeInactiveIndentGuidesStroke:void 0},e.defaultMenuStyles={shadowColor:(0,L.asCssVariable)(L.widgetShadow),borderColor:(0,L.asCssVariable)(L.menuBorder),foregroundColor:(0,L.asCssVariable)(L.menuForeground),backgroundColor:(0,L.asCssVariable)(L.menuBackground),selectionForegroundColor:(0,L.asCssVariable)(L.menuSelectionForeground),selectionBackgroundColor:(0,L.asCssVariable)(L.menuSelectionBackground),selectionBorderColor:(0,L.asCssVariable)(L.menuSelectionBorder),separatorColor:(0,L.asCssVariable)(L.menuSeparatorBackground),scrollbarShadow:(0,L.asCssVariable)(L.scrollbarShadow),scrollbarSliderBackground:(0,L.asCssVariable)(L.scrollbarSliderBackground),scrollbarSliderHoverBackground:(0,L.asCssVariable)(L.scrollbarSliderHoverBackground),scrollbarSliderActiveBackground:(0,L.asCssVariable)(L.scrollbarSliderActiveBackground)}}),define(se[837],oe([1,0,7,319,320,230,71,2,49,68,683,8,34,164,106,161]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";var u;Object.defineProperty(e,"__esModule",{value:!0}),e.AccessibilityProvider=e.OneReferenceRenderer=e.FileReferencesRenderer=e.IdentityProvider=e.StringRepresentationProvider=e.Delegate=e.DataSource=void 0;let f=class{constructor(w){this._resolverService=w}hasChildren(w){return w instanceof r.ReferencesModel||w instanceof r.FileReferences}getChildren(w){if(w instanceof r.ReferencesModel)return w.groups;if(w instanceof r.FileReferences)return w.resolve(this._resolverService).then(D=>D.children);throw new Error("bad tree")}};e.DataSource=f,e.DataSource=f=ke([ge(0,v.ITextModelService)],f);class c{getHeight(){return 23}getTemplateId(w){return w instanceof r.FileReferences?o.id:h.id}}e.Delegate=c;let d=class{constructor(w){this._keybindingService=w}getKeyboardNavigationLabel(w){var D;if(w instanceof r.OneReference){const I=(D=w.parent.getPreview(w))===null||D===void 0?void 0:D.preview(w.range);if(I)return I.value}return(0,_.basename)(w.uri)}};e.StringRepresentationProvider=d,e.StringRepresentationProvider=d=ke([ge(0,i.IKeybindingService)],d);class s{getId(w){return w instanceof r.OneReference?w.id:w.uri}}e.IdentityProvider=s;let l=class extends p.Disposable{constructor(w,D){super(),this._labelService=D;const I=document.createElement("div");I.classList.add("reference-file"),this.file=this._register(new E.IconLabel(I,{supportHighlights:!0})),this.badge=new k.CountBadge(L.append(I,L.$(".count")),{},t.defaultCountBadgeStyles),w.appendChild(I)}set(w,D){const I=(0,_.dirname)(w.uri);this.file.setLabel(this._labelService.getUriBasenameLabel(w.uri),this._labelService.getUriLabel(I,{relative:!0}),{title:this._labelService.getUriLabel(w.uri),matches:D});const T=w.children.length;this.badge.setCount(T),T>1?this.badge.setTitleFormat((0,b.localize)(0,null,T)):this.badge.setTitleFormat((0,b.localize)(1,null,T))}};l=ke([ge(1,n.ILabelService)],l);let o=u=class{constructor(w){this._instantiationService=w,this.templateId=u.id}renderTemplate(w){return this._instantiationService.createInstance(l,w)}renderElement(w,D,I){I.set(w.element,(0,S.createMatches)(w.filterData))}disposeTemplate(w){w.dispose()}};e.FileReferencesRenderer=o,o.id="FileReferencesRenderer",e.FileReferencesRenderer=o=u=ke([ge(0,a.IInstantiationService)],o);class g{constructor(w){this.label=new y.HighlightedLabel(w)}set(w,D){var I;const T=(I=w.parent.getPreview(w))===null||I===void 0?void 0:I.preview(w.range);if(!T||!T.value)this.label.set(`${(0,_.basename)(w.uri)}:${w.range.startLineNumber+1}:${w.range.startColumn+1}`);else{const{value:A,highlight:P}=T;D&&!S.FuzzyScore.isDefault(D)?(this.label.element.classList.toggle("referenceMatch",!1),this.label.set(A,(0,S.createMatches)(D))):(this.label.element.classList.toggle("referenceMatch",!0),this.label.set(A,[P]))}}}class h{constructor(){this.templateId=h.id}renderTemplate(w){return new g(w)}renderElement(w,D,I){I.set(w.element,w.filterData)}disposeTemplate(){}}e.OneReferenceRenderer=h,h.id="OneReferenceRenderer";class m{getWidgetAriaLabel(){return(0,b.localize)(2,null)}getAriaLabel(w){return w.ariaMessage}}e.AccessibilityProvider=m}),define(se[838],oe([1,0,7,224,119,19,26,2,17,28,731,59,34,106,29,276]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ActionList=e.previewSelectedActionCommand=e.acceptSelectedActionCommand=void 0,e.acceptSelectedActionCommand="acceptSelectedCodeAction",e.previewSelectedActionCommand="previewSelectedCodeAction";class r{get templateId(){return"header"}renderTemplate(g){g.classList.add("group-header");const h=document.createElement("span");return g.append(h),{container:g,text:h}}renderElement(g,h,m){var C,w;m.text.textContent=(w=(C=g.group)===null||C===void 0?void 0:C.title)!==null&&w!==void 0?w:""}disposeTemplate(g){}}let u=class{get templateId(){return"action"}constructor(g,h){this._supportsPreview=g,this._keybindingService=h}renderTemplate(g){g.classList.add(this.templateId);const h=document.createElement("div");h.className="icon",g.append(h);const m=document.createElement("span");m.className="title",g.append(m);const C=new k.KeybindingLabel(g,_.OS);return{container:g,icon:h,text:m,keybinding:C}}renderElement(g,h,m){var C,w,D;if(!((C=g.group)===null||C===void 0)&&C.icon?(m.icon.className=v.ThemeIcon.asClassName(g.group.icon),g.group.icon.color&&(m.icon.style.color=(0,t.asCssVariable)(g.group.icon.color.id))):(m.icon.className=v.ThemeIcon.asClassName(S.Codicon.lightBulb),m.icon.style.color="var(--vscode-editorLightBulb-foreground)"),!g.item||!g.label)return;m.text.textContent=l(g.label),m.keybinding.set(g.keybinding),L.setVisibility(!!g.keybinding,m.keybinding.element);const I=(w=this._keybindingService.lookupKeybinding(e.acceptSelectedActionCommand))===null||w===void 0?void 0:w.getLabel(),T=(D=this._keybindingService.lookupKeybinding(e.previewSelectedActionCommand))===null||D===void 0?void 0:D.getLabel();m.container.classList.toggle("option-disabled",g.disabled),g.disabled?m.container.title=g.label:I&&T?this._supportsPreview&&g.canPreview?m.container.title=(0,b.localize)(0,null,I,T):m.container.title=(0,b.localize)(1,null,I):m.container.title=""}disposeTemplate(g){}};u=ke([ge(1,i.IKeybindingService)],u);class f extends UIEvent{constructor(){super("acceptSelectedAction")}}class c extends UIEvent{constructor(){super("previewSelectedAction")}}function d(o){if(o.kind==="action")return o.label}let s=class extends p.Disposable{constructor(g,h,m,C,w,D){super(),this._delegate=C,this._contextViewService=w,this._keybindingService=D,this._actionLineHeight=24,this._headerLineHeight=26,this.cts=this._register(new E.CancellationTokenSource),this.domNode=document.createElement("div"),this.domNode.classList.add("actionList");const I={getHeight:T=>T.kind==="header"?this._headerLineHeight:this._actionLineHeight,getTemplateId:T=>T.kind};this._list=this._register(new y.List(g,this.domNode,I,[new u(h,this._keybindingService),new r],{keyboardSupport:!1,typeNavigationEnabled:!0,keyboardNavigationLabelProvider:{getKeyboardNavigationLabel:d},accessibilityProvider:{getAriaLabel:T=>{if(T.kind==="action"){let A=T.label?l(T?.label):"";return T.disabled&&(A=(0,b.localize)(2,null,A,T.disabled)),A}return null},getWidgetAriaLabel:()=>(0,b.localize)(3,null),getRole:T=>T.kind==="action"?"option":"separator",getWidgetRole:()=>"listbox"}})),this._list.style(n.defaultListStyles),this._register(this._list.onMouseClick(T=>this.onListClick(T))),this._register(this._list.onMouseOver(T=>this.onListHover(T))),this._register(this._list.onDidChangeFocus(()=>this.onFocus())),this._register(this._list.onDidChangeSelection(T=>this.onListSelection(T))),this._allMenuItems=m,this._list.splice(0,this._list.length,this._allMenuItems),this._list.length&&this.focusNext()}focusCondition(g){return!g.disabled&&g.kind==="action"}hide(g){this._delegate.onHide(g),this.cts.cancel(),this._contextViewService.hideContextView()}layout(g){const h=this._allMenuItems.filter(T=>T.kind==="header").length,C=this._allMenuItems.length*this._actionLineHeight+h*this._headerLineHeight-h*this._actionLineHeight;this._list.layout(C);let w=g;if(this._allMenuItems.length>=50)w=380;else{const T=this._allMenuItems.map((A,P)=>{const N=this.domNode.ownerDocument.getElementById(this._list.getElementID(P));if(N){N.style.width="auto";const M=N.getBoundingClientRect().width;return N.style.width="",M}return 0});w=Math.max(...T,g)}const D=.7,I=Math.min(C,this.domNode.ownerDocument.body.clientHeight*D);return this._list.layout(I,w),this.domNode.style.height=`${I}px`,this._list.domFocus(),w}focusPrevious(){this._list.focusPrevious(1,!0,void 0,this.focusCondition)}focusNext(){this._list.focusNext(1,!0,void 0,this.focusCondition)}acceptSelected(g){const h=this._list.getFocus();if(h.length===0)return;const m=h[0],C=this._list.element(m);if(!this.focusCondition(C))return;const w=g?new c:new f;this._list.setSelection([m],w)}onListSelection(g){if(!g.elements.length)return;const h=g.elements[0];h.item&&this.focusCondition(h)?this._delegate.onSelect(h.item,g.browserEvent instanceof c):this._list.setSelection([])}onFocus(){var g,h;const m=this._list.getFocus();if(m.length===0)return;const C=m[0],w=this._list.element(C);(h=(g=this._delegate).onFocus)===null||h===void 0||h.call(g,w.item)}async onListHover(g){const h=g.element;if(h&&h.item&&this.focusCondition(h)){if(this._delegate.onHover&&!h.disabled&&h.kind==="action"){const m=await this._delegate.onHover(h.item,this.cts.token);h.canPreview=m?m.canPreview:void 0}g.index&&this._list.splice(g.index,1,[h])}this._list.setFocus(typeof g.index=="number"?[g.index]:[])}onListClick(g){g.element&&this.focusCondition(g.element)&&this._list.setFocus([])}};e.ActionList=s,e.ActionList=s=ke([ge(4,a.IContextViewService),ge(5,i.IKeybindingService)],s);function l(o){return o.replace(/\r\n|\r|\n/g," ")}}),define(se[839],oe([1,0,7,78,2,732,838,30,15,59,45,8,29,276]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IActionWidgetService=void 0,(0,i.registerColor)("actionBar.toggledBackground",{dark:i.inputActiveOptionBackground,light:i.inputActiveOptionBackground,hcDark:i.inputActiveOptionBackground,hcLight:i.inputActiveOptionBackground},(0,E.localize)(0,null));const n={Visible:new _.RawContextKey("codeActionMenuVisible",!1,(0,E.localize)(1,null))};e.IActionWidgetService=(0,a.createDecorator)("actionWidgetService");let t=class extends y.Disposable{get isVisible(){return n.Visible.getValue(this._contextKeyService)||!1}constructor(f,c,d){super(),this._contextViewService=f,this._contextKeyService=c,this._instantiationService=d,this._list=this._register(new y.MutableDisposable)}show(f,c,d,s,l,o,g){const h=n.Visible.bindTo(this._contextKeyService),m=this._instantiationService.createInstance(S.ActionList,f,c,d,s);this._contextViewService.showContextView({getAnchor:()=>l,render:C=>(h.set(!0),this._renderWidget(C,m,g??[])),onHide:C=>{h.reset(),this._onWidgetClosed(C)}},o,!1)}acceptSelected(f){var c;(c=this._list.value)===null||c===void 0||c.acceptSelected(f)}focusPrevious(){var f,c;(c=(f=this._list)===null||f===void 0?void 0:f.value)===null||c===void 0||c.focusPrevious()}focusNext(){var f,c;(c=(f=this._list)===null||f===void 0?void 0:f.value)===null||c===void 0||c.focusNext()}hide(){var f;(f=this._list.value)===null||f===void 0||f.hide(),this._list.clear()}_renderWidget(f,c,d){var s;const l=document.createElement("div");if(l.classList.add("action-widget"),f.appendChild(l),this._list.value=c,this._list.value)l.appendChild(this._list.value.domNode);else throw new Error("List has no value");const o=new y.DisposableStore,g=document.createElement("div"),h=f.appendChild(g);h.classList.add("context-view-block"),o.add(L.addDisposableListener(h,L.EventType.MOUSE_DOWN,T=>T.stopPropagation()));const m=document.createElement("div"),C=f.appendChild(m);C.classList.add("context-view-pointerBlock"),o.add(L.addDisposableListener(C,L.EventType.POINTER_MOVE,()=>C.remove())),o.add(L.addDisposableListener(C,L.EventType.MOUSE_DOWN,()=>C.remove()));let w=0;if(d.length){const T=this._createActionBar(".action-widget-action-bar",d);T&&(l.appendChild(T.getContainer().parentElement),o.add(T),w=T.getContainer().offsetWidth)}const D=(s=this._list.value)===null||s===void 0?void 0:s.layout(w);l.style.width=`${D}px`;const I=o.add(L.trackFocus(f));return o.add(I.onDidBlur(()=>this.hide())),o}_createActionBar(f,c){if(!c.length)return;const d=L.$(f),s=new k.ActionBar(d);return s.push(c,{icon:!1,label:!0}),s}_onWidgetClosed(f){var c;(c=this._list.value)===null||c===void 0||c.hide(f)}};t=ke([ge(0,v.IContextViewService),ge(1,_.IContextKeyService),ge(2,a.IInstantiationService)],t),(0,b.registerSingleton)(e.IActionWidgetService,t,1);const r=100+1e3;(0,p.registerAction2)(class extends p.Action2{constructor(){super({id:"hideCodeActionWidget",title:{value:(0,E.localize)(2,null),original:"Hide action widget"},precondition:n.Visible,keybinding:{weight:r,primary:9,secondary:[1033]}})}run(u){u.get(e.IActionWidgetService).hide()}}),(0,p.registerAction2)(class extends p.Action2{constructor(){super({id:"selectPrevCodeAction",title:{value:(0,E.localize)(3,null),original:"Select previous action"},precondition:n.Visible,keybinding:{weight:r,primary:16,secondary:[2064],mac:{primary:16,secondary:[2064,302]}}})}run(u){const f=u.get(e.IActionWidgetService);f instanceof t&&f.focusPrevious()}}),(0,p.registerAction2)(class extends p.Action2{constructor(){super({id:"selectNextCodeAction",title:{value:(0,E.localize)(4,null),original:"Select next action"},precondition:n.Visible,keybinding:{weight:r,primary:18,secondary:[2066],mac:{primary:18,secondary:[2066,300]}}})}run(u){const f=u.get(e.IActionWidgetService);f instanceof t&&f.focusNext()}}),(0,p.registerAction2)(class extends p.Action2{constructor(){super({id:S.acceptSelectedActionCommand,title:{value:(0,E.localize)(5,null),original:"Accept selected action"},precondition:n.Visible,keybinding:{weight:r,primary:3,secondary:[2137]}})}run(u){const f=u.get(e.IActionWidgetService);f instanceof t&&f.acceptSelected()}}),(0,p.registerAction2)(class extends p.Action2{constructor(){super({id:S.previewSelectedActionCommand,title:{value:(0,E.localize)(6,null),original:"Preview selected action"},precondition:n.Visible,keybinding:{weight:r,primary:2051}})}run(u){const f=u.get(e.IActionWidgetService);f instanceof t&&f.acceptSelected(!0)}})}),define(se[840],oe([1,0,7,67,599,42,12,2,106]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextMenuHandler=void 0;class v{constructor(a,i,n,t){this.contextViewService=a,this.telemetryService=i,this.notificationService=n,this.keybindingService=t,this.focusToReturn=null,this.lastContainer=null,this.block=null,this.blockDisposable=null,this.options={blockMouse:!0}}configure(a){this.options=a}showContextMenu(a){const i=a.getActions();if(!i.length)return;this.focusToReturn=(0,L.getActiveElement)();let n;const t=a.domForShadowRoot instanceof HTMLElement?a.domForShadowRoot:void 0;this.contextViewService.showContextView({getAnchor:()=>a.getAnchor(),canRelayout:!1,anchorAlignment:a.anchorAlignment,anchorAxisAlignment:a.anchorAxisAlignment,render:r=>{var u;this.lastContainer=r;const f=a.getMenuClassName?a.getMenuClassName():"";f&&(r.className+=" "+f),this.options.blockMouse&&(this.block=r.appendChild((0,L.$)(".context-view-block")),this.block.style.position="fixed",this.block.style.cursor="initial",this.block.style.left="0",this.block.style.top="0",this.block.style.width="100%",this.block.style.height="100%",this.block.style.zIndex="-1",(u=this.blockDisposable)===null||u===void 0||u.dispose(),this.blockDisposable=(0,L.addDisposableListener)(this.block,L.EventType.MOUSE_DOWN,l=>l.stopPropagation()));const c=new p.DisposableStore,d=a.actionRunner||new E.ActionRunner;d.onWillRun(l=>this.onActionRun(l,!a.skipTelemetry),this,c),d.onDidRun(this.onDidActionRun,this,c),n=new y.Menu(r,i,{actionViewItemProvider:a.getActionViewItem,context:a.getActionsContext?a.getActionsContext():null,actionRunner:d,getKeyBinding:a.getKeyBinding?a.getKeyBinding:l=>this.keybindingService.lookupKeybinding(l.id)},_.defaultMenuStyles),n.onDidCancel(()=>this.contextViewService.hideContextView(!0),null,c),n.onDidBlur(()=>this.contextViewService.hideContextView(!0),null,c);const s=(0,L.getWindow)(r);return c.add((0,L.addDisposableListener)(s,L.EventType.BLUR,()=>this.contextViewService.hideContextView(!0))),c.add((0,L.addDisposableListener)(s,L.EventType.MOUSE_DOWN,l=>{if(l.defaultPrevented)return;const o=new k.StandardMouseEvent(s,l);let g=o.target;if(!o.rightButton){for(;g;){if(g===r)return;g=g.parentElement}this.contextViewService.hideContextView(!0)}})),(0,p.combinedDisposable)(c,n)},focus:()=>{n?.focus(!!a.autoSelectFirstItem)},onHide:r=>{var u,f,c;(u=a.onHide)===null||u===void 0||u.call(a,!!r),this.block&&(this.block.remove(),this.block=null),(f=this.blockDisposable)===null||f===void 0||f.dispose(),this.blockDisposable=null,this.lastContainer&&((0,L.getActiveElement)()===this.lastContainer||(0,L.isAncestor)((0,L.getActiveElement)(),this.lastContainer))&&((c=this.focusToReturn)===null||c===void 0||c.focus()),this.lastContainer=null}},t,!!t)}onActionRun(a,i){i&&this.telemetryService.publicLog2("workbenchActionExecuted",{id:a.action.id,from:"contextMenu"}),this.contextViewService.hideContextView(!1)}onDidActionRun(a){a.error&&!(0,S.isCancellationError)(a.error)&&this.notificationService.error(a.error)}}e.ContextMenuHandler=v}),define(se[192],oe([1,0,7,594,119,595,187,602,601,326,6,2,744,27,98,15,242,59,8,34,37,106]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WorkbenchCompressibleAsyncDataTree=e.WorkbenchAsyncDataTree=e.WorkbenchDataTree=e.WorkbenchCompressibleObjectTree=e.WorkbenchObjectTree=e.WorkbenchTable=e.WorkbenchPagedList=e.WorkbenchList=e.WorkbenchTreeFindOpen=e.WorkbenchTreeElementHasChild=e.WorkbenchTreeElementCanExpand=e.WorkbenchTreeElementHasParent=e.WorkbenchTreeElementCanCollapse=e.WorkbenchListSupportsFind=e.WorkbenchListSelectionNavigation=e.WorkbenchListMultiSelection=e.WorkbenchListDoubleSelection=e.WorkbenchListHasSelectionOrFocus=e.WorkbenchListFocusContextKey=e.WorkbenchListSupportsMultiSelectContextKey=e.WorkbenchTreeStickyScrollFocused=e.RawWorkbenchListFocusContextKey=e.WorkbenchListScrollAtBottomContextKey=e.WorkbenchListScrollAtTopContextKey=e.RawWorkbenchListScrollAtBoundaryContextKey=e.ListService=e.IListService=void 0,e.IListService=(0,c.createDecorator)("listService");class o{get lastFocusedList(){return this._lastFocusedWidget}constructor(){this.disposables=new a.DisposableStore,this.lists=[],this._lastFocusedWidget=void 0,this._hasCreatedStyleController=!1}setLastFocusedList(ce){var pe,ve;ce!==this._lastFocusedWidget&&((pe=this._lastFocusedWidget)===null||pe===void 0||pe.getHTMLElement().classList.remove("last-focused"),this._lastFocusedWidget=ce,(ve=this._lastFocusedWidget)===null||ve===void 0||ve.getHTMLElement().classList.add("last-focused"))}register(ce,pe){if(this._hasCreatedStyleController||(this._hasCreatedStyleController=!0,new y.DefaultStyleController((0,L.createStyleSheet)(),"").style(l.defaultListStyles)),this.lists.some(Ce=>Ce.widget===ce))throw new Error("Cannot register the same widget multiple times");const ve={widget:ce,extraContextKeys:pe};return this.lists.push(ve),(0,L.isActiveElement)(ce.getHTMLElement())&&this.setLastFocusedList(ce),(0,a.combinedDisposable)(ce.onDidFocus(()=>this.setLastFocusedList(ce)),(0,a.toDisposable)(()=>this.lists.splice(this.lists.indexOf(ve),1)),ce.onDidDispose(()=>{this.lists=this.lists.filter(Ce=>Ce!==ve),this._lastFocusedWidget===ce&&this.setLastFocusedList(void 0)}))}dispose(){this.disposables.dispose()}}e.ListService=o,e.RawWorkbenchListScrollAtBoundaryContextKey=new r.RawContextKey("listScrollAtBoundary","none"),e.WorkbenchListScrollAtTopContextKey=r.ContextKeyExpr.or(e.RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo("top"),e.RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo("both")),e.WorkbenchListScrollAtBottomContextKey=r.ContextKeyExpr.or(e.RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo("bottom"),e.RawWorkbenchListScrollAtBoundaryContextKey.isEqualTo("both")),e.RawWorkbenchListFocusContextKey=new r.RawContextKey("listFocus",!0),e.WorkbenchTreeStickyScrollFocused=new r.RawContextKey("treestickyScrollFocused",!1),e.WorkbenchListSupportsMultiSelectContextKey=new r.RawContextKey("listSupportsMultiselect",!0),e.WorkbenchListFocusContextKey=r.ContextKeyExpr.and(e.RawWorkbenchListFocusContextKey,r.ContextKeyExpr.not(u.InputFocusedContextKey),e.WorkbenchTreeStickyScrollFocused.negate()),e.WorkbenchListHasSelectionOrFocus=new r.RawContextKey("listHasSelectionOrFocus",!1),e.WorkbenchListDoubleSelection=new r.RawContextKey("listDoubleSelection",!1),e.WorkbenchListMultiSelection=new r.RawContextKey("listMultiSelection",!1),e.WorkbenchListSelectionNavigation=new r.RawContextKey("listSelectionNavigation",!1),e.WorkbenchListSupportsFind=new r.RawContextKey("listSupportsFind",!0),e.WorkbenchTreeElementCanCollapse=new r.RawContextKey("treeElementCanCollapse",!1),e.WorkbenchTreeElementHasParent=new r.RawContextKey("treeElementHasParent",!1),e.WorkbenchTreeElementCanExpand=new r.RawContextKey("treeElementCanExpand",!1),e.WorkbenchTreeElementHasChild=new r.RawContextKey("treeElementHasChild",!1),e.WorkbenchTreeFindOpen=new r.RawContextKey("treeFindOpen",!1);const g="listTypeNavigationMode",h="listAutomaticKeyboardNavigation";function m(ue,ce){const pe=ue.createScoped(ce.getHTMLElement());return e.RawWorkbenchListFocusContextKey.bindTo(pe),pe}function C(ue,ce){const pe=e.RawWorkbenchListScrollAtBoundaryContextKey.bindTo(ue),ve=()=>{const Ce=ce.scrollTop===0,Se=ce.scrollHeight-ce.renderHeight-ce.scrollTop<1;Ce&&Se?pe.set("both"):Ce?pe.set("top"):Se?pe.set("bottom"):pe.set("none")};return ve(),ce.onDidScroll(ve)}const w="workbench.list.multiSelectModifier",D="workbench.list.openMode",I="workbench.list.horizontalScrolling",T="workbench.list.defaultFindMode",A="workbench.list.typeNavigationMode",P="workbench.list.keyboardNavigation",N="workbench.list.scrollByPage",M="workbench.list.defaultFindMatchType",R="workbench.tree.indent",x="workbench.tree.renderIndentGuides",O="workbench.list.smoothScrolling",B="workbench.list.mouseWheelScrollSensitivity",W="workbench.list.fastScrollSensitivity",V="workbench.tree.expandMode",K="workbench.tree.enableStickyScroll",F="workbench.tree.stickyScrollMaxItemCount";function q(ue){return ue.getValue(w)==="alt"}class ie extends a.Disposable{constructor(ce){super(),this.configurationService=ce,this.useAltAsMultipleSelectionModifier=q(ce),this.registerListeners()}registerListeners(){this._register(this.configurationService.onDidChangeConfiguration(ce=>{ce.affectsConfiguration(w)&&(this.useAltAsMultipleSelectionModifier=q(this.configurationService))}))}isSelectionSingleChangeEvent(ce){return this.useAltAsMultipleSelectionModifier?ce.browserEvent.altKey:(0,y.isSelectionSingleChangeEvent)(ce)}isSelectionRangeChangeEvent(ce){return(0,y.isSelectionRangeChangeEvent)(ce)}}function ae(ue,ce){var pe;const ve=ue.get(n.IConfigurationService),Ce=ue.get(d.IKeybindingService),Se=new a.DisposableStore;return[{...ce,keyboardNavigationDelegate:{mightProducePrintableCharacter(Ee){return Ce.mightProducePrintableCharacter(Ee)}},smoothScrolling:!!ve.getValue(O),mouseWheelScrollSensitivity:ve.getValue(B),fastScrollSensitivity:ve.getValue(W),multipleSelectionController:(pe=ce.multipleSelectionController)!==null&&pe!==void 0?pe:Se.add(new ie(ve)),keyboardNavigationEventFilter:me(Ce),scrollByPage:!!ve.getValue(N)},Se]}let ne=class extends y.List{constructor(ce,pe,ve,Ce,Se,_e,Ee,Ae,xe){const Be=typeof Se.horizontalScrolling<"u"?Se.horizontalScrolling:!!Ae.getValue(I),[De,Ie]=xe.invokeFunction(ae,Se);super(ce,pe,ve,Ce,{keyboardSupport:!1,...De,horizontalScrolling:Be}),this.disposables.add(Ie),this.contextKeyService=m(_e,this),this.disposables.add(C(this.contextKeyService,this)),this.listSupportsMultiSelect=e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService),this.listSupportsMultiSelect.set(Se.multipleSelectionSupport!==!1),e.WorkbenchListSelectionNavigation.bindTo(this.contextKeyService).set(!!Se.selectionNavigation),this.listHasSelectionOrFocus=e.WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService),this.listDoubleSelection=e.WorkbenchListDoubleSelection.bindTo(this.contextKeyService),this.listMultiSelection=e.WorkbenchListMultiSelection.bindTo(this.contextKeyService),this.horizontalScrolling=Se.horizontalScrolling,this._useAltAsMultipleSelectionModifier=q(Ae),this.disposables.add(this.contextKeyService),this.disposables.add(Ee.register(this)),this.updateStyles(Se.overrideStyles),this.disposables.add(this.onDidChangeSelection(()=>{const be=this.getSelection(),Ne=this.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.listHasSelectionOrFocus.set(be.length>0||Ne.length>0),this.listMultiSelection.set(be.length>1),this.listDoubleSelection.set(be.length===2)})})),this.disposables.add(this.onDidChangeFocus(()=>{const be=this.getSelection(),Ne=this.getFocus();this.listHasSelectionOrFocus.set(be.length>0||Ne.length>0)})),this.disposables.add(Ae.onDidChangeConfiguration(be=>{be.affectsConfiguration(w)&&(this._useAltAsMultipleSelectionModifier=q(Ae));let Ne={};if(be.affectsConfiguration(I)&&this.horizontalScrolling===void 0){const Pe=!!Ae.getValue(I);Ne={...Ne,horizontalScrolling:Pe}}if(be.affectsConfiguration(N)){const Pe=!!Ae.getValue(N);Ne={...Ne,scrollByPage:Pe}}if(be.affectsConfiguration(O)){const Pe=!!Ae.getValue(O);Ne={...Ne,smoothScrolling:Pe}}if(be.affectsConfiguration(B)){const Pe=Ae.getValue(B);Ne={...Ne,mouseWheelScrollSensitivity:Pe}}if(be.affectsConfiguration(W)){const Pe=Ae.getValue(W);Ne={...Ne,fastScrollSensitivity:Pe}}Object.keys(Ne).length>0&&this.updateOptions(Ne)})),this.navigator=new re(this,{configurationService:Ae,...Se}),this.disposables.add(this.navigator)}updateOptions(ce){super.updateOptions(ce),ce.overrideStyles!==void 0&&this.updateStyles(ce.overrideStyles),ce.multipleSelectionSupport!==void 0&&this.listSupportsMultiSelect.set(!!ce.multipleSelectionSupport)}updateStyles(ce){this.style(ce?(0,l.getListStyles)(ce):l.defaultListStyles)}};e.WorkbenchList=ne,e.WorkbenchList=ne=ke([ge(5,r.IContextKeyService),ge(6,e.IListService),ge(7,n.IConfigurationService),ge(8,c.IInstantiationService)],ne);let $=class extends k.PagedList{constructor(ce,pe,ve,Ce,Se,_e,Ee,Ae,xe){const Be=typeof Se.horizontalScrolling<"u"?Se.horizontalScrolling:!!Ae.getValue(I),[De,Ie]=xe.invokeFunction(ae,Se);super(ce,pe,ve,Ce,{keyboardSupport:!1,...De,horizontalScrolling:Be}),this.disposables=new a.DisposableStore,this.disposables.add(Ie),this.contextKeyService=m(_e,this),this.disposables.add(C(this.contextKeyService,this.widget)),this.horizontalScrolling=Se.horizontalScrolling,this.listSupportsMultiSelect=e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService),this.listSupportsMultiSelect.set(Se.multipleSelectionSupport!==!1),e.WorkbenchListSelectionNavigation.bindTo(this.contextKeyService).set(!!Se.selectionNavigation),this._useAltAsMultipleSelectionModifier=q(Ae),this.disposables.add(this.contextKeyService),this.disposables.add(Ee.register(this)),this.updateStyles(Se.overrideStyles),this.disposables.add(Ae.onDidChangeConfiguration(be=>{be.affectsConfiguration(w)&&(this._useAltAsMultipleSelectionModifier=q(Ae));let Ne={};if(be.affectsConfiguration(I)&&this.horizontalScrolling===void 0){const Pe=!!Ae.getValue(I);Ne={...Ne,horizontalScrolling:Pe}}if(be.affectsConfiguration(N)){const Pe=!!Ae.getValue(N);Ne={...Ne,scrollByPage:Pe}}if(be.affectsConfiguration(O)){const Pe=!!Ae.getValue(O);Ne={...Ne,smoothScrolling:Pe}}if(be.affectsConfiguration(B)){const Pe=Ae.getValue(B);Ne={...Ne,mouseWheelScrollSensitivity:Pe}}if(be.affectsConfiguration(W)){const Pe=Ae.getValue(W);Ne={...Ne,fastScrollSensitivity:Pe}}Object.keys(Ne).length>0&&this.updateOptions(Ne)})),this.navigator=new re(this,{configurationService:Ae,...Se}),this.disposables.add(this.navigator)}updateOptions(ce){super.updateOptions(ce),ce.overrideStyles!==void 0&&this.updateStyles(ce.overrideStyles),ce.multipleSelectionSupport!==void 0&&this.listSupportsMultiSelect.set(!!ce.multipleSelectionSupport)}updateStyles(ce){this.style(ce?(0,l.getListStyles)(ce):l.defaultListStyles)}dispose(){this.disposables.dispose(),super.dispose()}};e.WorkbenchPagedList=$,e.WorkbenchPagedList=$=ke([ge(5,r.IContextKeyService),ge(6,e.IListService),ge(7,n.IConfigurationService),ge(8,c.IInstantiationService)],$);let J=class extends E.Table{constructor(ce,pe,ve,Ce,Se,_e,Ee,Ae,xe,Be){const De=typeof _e.horizontalScrolling<"u"?_e.horizontalScrolling:!!xe.getValue(I),[Ie,fe]=Be.invokeFunction(ae,_e);super(ce,pe,ve,Ce,Se,{keyboardSupport:!1,...Ie,horizontalScrolling:De}),this.disposables.add(fe),this.contextKeyService=m(Ee,this),this.disposables.add(C(this.contextKeyService,this)),this.listSupportsMultiSelect=e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService),this.listSupportsMultiSelect.set(_e.multipleSelectionSupport!==!1),e.WorkbenchListSelectionNavigation.bindTo(this.contextKeyService).set(!!_e.selectionNavigation),this.listHasSelectionOrFocus=e.WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService),this.listDoubleSelection=e.WorkbenchListDoubleSelection.bindTo(this.contextKeyService),this.listMultiSelection=e.WorkbenchListMultiSelection.bindTo(this.contextKeyService),this.horizontalScrolling=_e.horizontalScrolling,this._useAltAsMultipleSelectionModifier=q(xe),this.disposables.add(this.contextKeyService),this.disposables.add(Ae.register(this)),this.updateStyles(_e.overrideStyles),this.disposables.add(this.onDidChangeSelection(()=>{const Ne=this.getSelection(),Pe=this.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.listHasSelectionOrFocus.set(Ne.length>0||Pe.length>0),this.listMultiSelection.set(Ne.length>1),this.listDoubleSelection.set(Ne.length===2)})})),this.disposables.add(this.onDidChangeFocus(()=>{const Ne=this.getSelection(),Pe=this.getFocus();this.listHasSelectionOrFocus.set(Ne.length>0||Pe.length>0)})),this.disposables.add(xe.onDidChangeConfiguration(Ne=>{Ne.affectsConfiguration(w)&&(this._useAltAsMultipleSelectionModifier=q(xe));let Pe={};if(Ne.affectsConfiguration(I)&&this.horizontalScrolling===void 0){const ze=!!xe.getValue(I);Pe={...Pe,horizontalScrolling:ze}}if(Ne.affectsConfiguration(N)){const ze=!!xe.getValue(N);Pe={...Pe,scrollByPage:ze}}if(Ne.affectsConfiguration(O)){const ze=!!xe.getValue(O);Pe={...Pe,smoothScrolling:ze}}if(Ne.affectsConfiguration(B)){const ze=xe.getValue(B);Pe={...Pe,mouseWheelScrollSensitivity:ze}}if(Ne.affectsConfiguration(W)){const ze=xe.getValue(W);Pe={...Pe,fastScrollSensitivity:ze}}Object.keys(Pe).length>0&&this.updateOptions(Pe)})),this.navigator=new de(this,{configurationService:xe,..._e}),this.disposables.add(this.navigator)}updateOptions(ce){super.updateOptions(ce),ce.overrideStyles!==void 0&&this.updateStyles(ce.overrideStyles),ce.multipleSelectionSupport!==void 0&&this.listSupportsMultiSelect.set(!!ce.multipleSelectionSupport)}updateStyles(ce){this.style(ce?(0,l.getListStyles)(ce):l.defaultListStyles)}dispose(){this.disposables.dispose(),super.dispose()}};e.WorkbenchTable=J,e.WorkbenchTable=J=ke([ge(6,r.IContextKeyService),ge(7,e.IListService),ge(8,n.IConfigurationService),ge(9,c.IInstantiationService)],J);class Q extends a.Disposable{constructor(ce,pe){var ve;super(),this.widget=ce,this._onDidOpen=this._register(new b.Emitter),this.onDidOpen=this._onDidOpen.event,this._register(b.Event.filter(this.widget.onDidChangeSelection,Ce=>(0,L.isKeyboardEvent)(Ce.browserEvent))(Ce=>this.onSelectionFromKeyboard(Ce))),this._register(this.widget.onPointer(Ce=>this.onPointer(Ce.element,Ce.browserEvent))),this._register(this.widget.onMouseDblClick(Ce=>this.onMouseDblClick(Ce.element,Ce.browserEvent))),typeof pe?.openOnSingleClick!="boolean"&&pe?.configurationService?(this.openOnSingleClick=pe?.configurationService.getValue(D)!=="doubleClick",this._register(pe?.configurationService.onDidChangeConfiguration(Ce=>{Ce.affectsConfiguration(D)&&(this.openOnSingleClick=pe?.configurationService.getValue(D)!=="doubleClick")}))):this.openOnSingleClick=(ve=pe?.openOnSingleClick)!==null&&ve!==void 0?ve:!0}onSelectionFromKeyboard(ce){if(ce.elements.length!==1)return;const pe=ce.browserEvent,ve=typeof pe.preserveFocus=="boolean"?pe.preserveFocus:!0,Ce=typeof pe.pinned=="boolean"?pe.pinned:!ve,Se=!1;this._open(this.getSelectedElement(),ve,Ce,Se,ce.browserEvent)}onPointer(ce,pe){if(!this.openOnSingleClick||pe.detail===2)return;const Ce=pe.button===1,Se=!0,_e=Ce,Ee=pe.ctrlKey||pe.metaKey||pe.altKey;this._open(ce,Se,_e,Ee,pe)}onMouseDblClick(ce,pe){if(!pe)return;const ve=pe.target;if(ve.classList.contains("monaco-tl-twistie")||ve.classList.contains("monaco-icon-label")&&ve.classList.contains("folder-icon")&&pe.offsetX<16)return;const Se=!1,_e=!0,Ee=pe.ctrlKey||pe.metaKey||pe.altKey;this._open(ce,Se,_e,Ee,pe)}_open(ce,pe,ve,Ce,Se){ce&&this._onDidOpen.fire({editorOptions:{preserveFocus:pe,pinned:ve,revealIfVisible:!0},sideBySide:Ce,element:ce,browserEvent:Se})}}class re extends Q{constructor(ce,pe){super(ce,pe),this.widget=ce}getSelectedElement(){return this.widget.getSelectedElements()[0]}}class de extends Q{constructor(ce,pe){super(ce,pe)}getSelectedElement(){return this.widget.getSelectedElements()[0]}}class he extends Q{constructor(ce,pe){super(ce,pe)}getSelectedElement(){var ce;return(ce=this.widget.getSelection()[0])!==null&&ce!==void 0?ce:void 0}}function me(ue){let ce=!1;return pe=>{if(pe.toKeyCodeChord().isModifierKey())return!1;if(ce)return ce=!1,!1;const ve=ue.softDispatch(pe,pe.target);return ve.kind===1?(ce=!0,!1):(ce=!1,ve.kind===0)}}let X=class extends v.ObjectTree{constructor(ce,pe,ve,Ce,Se,_e,Ee,Ae,xe){const{options:Be,getTypeNavigationMode:De,disposable:Ie}=_e.invokeFunction(Z,Se);super(ce,pe,ve,Ce,Be),this.disposables.add(Ie),this.internals=new ee(this,Se,De,Se.overrideStyles,Ee,Ae,xe),this.disposables.add(this.internals)}updateOptions(ce){super.updateOptions(ce),this.internals.updateOptions(ce)}};e.WorkbenchObjectTree=X,e.WorkbenchObjectTree=X=ke([ge(5,c.IInstantiationService),ge(6,r.IContextKeyService),ge(7,e.IListService),ge(8,n.IConfigurationService)],X);let U=class extends v.CompressibleObjectTree{constructor(ce,pe,ve,Ce,Se,_e,Ee,Ae,xe){const{options:Be,getTypeNavigationMode:De,disposable:Ie}=_e.invokeFunction(Z,Se);super(ce,pe,ve,Ce,Be),this.disposables.add(Ie),this.internals=new ee(this,Se,De,Se.overrideStyles,Ee,Ae,xe),this.disposables.add(this.internals)}updateOptions(ce={}){super.updateOptions(ce),ce.overrideStyles&&this.internals.updateStyleOverrides(ce.overrideStyles),this.internals.updateOptions(ce)}};e.WorkbenchCompressibleObjectTree=U,e.WorkbenchCompressibleObjectTree=U=ke([ge(5,c.IInstantiationService),ge(6,r.IContextKeyService),ge(7,e.IListService),ge(8,n.IConfigurationService)],U);let G=class extends _.DataTree{constructor(ce,pe,ve,Ce,Se,_e,Ee,Ae,xe,Be){const{options:De,getTypeNavigationMode:Ie,disposable:fe}=Ee.invokeFunction(Z,_e);super(ce,pe,ve,Ce,Se,De),this.disposables.add(fe),this.internals=new ee(this,_e,Ie,_e.overrideStyles,Ae,xe,Be),this.disposables.add(this.internals)}updateOptions(ce={}){super.updateOptions(ce),ce.overrideStyles!==void 0&&this.internals.updateStyleOverrides(ce.overrideStyles),this.internals.updateOptions(ce)}};e.WorkbenchDataTree=G,e.WorkbenchDataTree=G=ke([ge(6,c.IInstantiationService),ge(7,r.IContextKeyService),ge(8,e.IListService),ge(9,n.IConfigurationService)],G);let z=class extends p.AsyncDataTree{get onDidOpen(){return this.internals.onDidOpen}constructor(ce,pe,ve,Ce,Se,_e,Ee,Ae,xe,Be){const{options:De,getTypeNavigationMode:Ie,disposable:fe}=Ee.invokeFunction(Z,_e);super(ce,pe,ve,Ce,Se,De),this.disposables.add(fe),this.internals=new ee(this,_e,Ie,_e.overrideStyles,Ae,xe,Be),this.disposables.add(this.internals)}updateOptions(ce={}){super.updateOptions(ce),ce.overrideStyles&&this.internals.updateStyleOverrides(ce.overrideStyles),this.internals.updateOptions(ce)}};e.WorkbenchAsyncDataTree=z,e.WorkbenchAsyncDataTree=z=ke([ge(6,c.IInstantiationService),ge(7,r.IContextKeyService),ge(8,e.IListService),ge(9,n.IConfigurationService)],z);let H=class extends p.CompressibleAsyncDataTree{constructor(ce,pe,ve,Ce,Se,_e,Ee,Ae,xe,Be,De){const{options:Ie,getTypeNavigationMode:fe,disposable:be}=Ae.invokeFunction(Z,Ee);super(ce,pe,ve,Ce,Se,_e,Ie),this.disposables.add(be),this.internals=new ee(this,Ee,fe,Ee.overrideStyles,xe,Be,De),this.disposables.add(this.internals)}updateOptions(ce){super.updateOptions(ce),this.internals.updateOptions(ce)}};e.WorkbenchCompressibleAsyncDataTree=H,e.WorkbenchCompressibleAsyncDataTree=H=ke([ge(7,c.IInstantiationService),ge(8,r.IContextKeyService),ge(9,e.IListService),ge(10,n.IConfigurationService)],H);function Y(ue){const ce=ue.getValue(T);if(ce==="highlight")return S.TreeFindMode.Highlight;if(ce==="filter")return S.TreeFindMode.Filter;const pe=ue.getValue(P);if(pe==="simple"||pe==="highlight")return S.TreeFindMode.Highlight;if(pe==="filter")return S.TreeFindMode.Filter}function j(ue){const ce=ue.getValue(M);if(ce==="fuzzy")return S.TreeFindMatchType.Fuzzy;if(ce==="contiguous")return S.TreeFindMatchType.Contiguous}function Z(ue,ce){var pe;const ve=ue.get(n.IConfigurationService),Ce=ue.get(f.IContextViewService),Se=ue.get(r.IContextKeyService),_e=ue.get(c.IInstantiationService),Ee=()=>{const fe=Se.getContextKeyValue(g);if(fe==="automatic")return y.TypeNavigationMode.Automatic;if(fe==="trigger"||Se.getContextKeyValue(h)===!1)return y.TypeNavigationMode.Trigger;const Ne=ve.getValue(A);if(Ne==="automatic")return y.TypeNavigationMode.Automatic;if(Ne==="trigger")return y.TypeNavigationMode.Trigger},Ae=ce.horizontalScrolling!==void 0?ce.horizontalScrolling:!!ve.getValue(I),[xe,Be]=_e.invokeFunction(ae,ce),De=ce.paddingBottom,Ie=ce.renderIndentGuides!==void 0?ce.renderIndentGuides:ve.getValue(x);return{getTypeNavigationMode:Ee,disposable:Be,options:{keyboardSupport:!1,...xe,indent:typeof ve.getValue(R)=="number"?ve.getValue(R):void 0,renderIndentGuides:Ie,smoothScrolling:!!ve.getValue(O),defaultFindMode:Y(ve),defaultFindMatchType:j(ve),horizontalScrolling:Ae,scrollByPage:!!ve.getValue(N),paddingBottom:De,hideTwistiesOfChildlessElements:ce.hideTwistiesOfChildlessElements,expandOnlyOnTwistieClick:(pe=ce.expandOnlyOnTwistieClick)!==null&&pe!==void 0?pe:ve.getValue(V)==="doubleClick",contextViewProvider:Ce,findWidgetStyles:l.defaultFindWidgetStyles,enableStickyScroll:!!ve.getValue(K),stickyScrollMaxItemCount:Number(ve.getValue(F))}}}let ee=class{get onDidOpen(){return this.navigator.onDidOpen}constructor(ce,pe,ve,Ce,Se,_e,Ee){var Ae;this.tree=ce,this.disposables=[],this.contextKeyService=m(Se,ce),this.disposables.push(C(this.contextKeyService,ce)),this.listSupportsMultiSelect=e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService),this.listSupportsMultiSelect.set(pe.multipleSelectionSupport!==!1),e.WorkbenchListSelectionNavigation.bindTo(this.contextKeyService).set(!!pe.selectionNavigation),this.listSupportFindWidget=e.WorkbenchListSupportsFind.bindTo(this.contextKeyService),this.listSupportFindWidget.set((Ae=pe.findWidgetEnabled)!==null&&Ae!==void 0?Ae:!0),this.hasSelectionOrFocus=e.WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService),this.hasDoubleSelection=e.WorkbenchListDoubleSelection.bindTo(this.contextKeyService),this.hasMultiSelection=e.WorkbenchListMultiSelection.bindTo(this.contextKeyService),this.treeElementCanCollapse=e.WorkbenchTreeElementCanCollapse.bindTo(this.contextKeyService),this.treeElementHasParent=e.WorkbenchTreeElementHasParent.bindTo(this.contextKeyService),this.treeElementCanExpand=e.WorkbenchTreeElementCanExpand.bindTo(this.contextKeyService),this.treeElementHasChild=e.WorkbenchTreeElementHasChild.bindTo(this.contextKeyService),this.treeFindOpen=e.WorkbenchTreeFindOpen.bindTo(this.contextKeyService),this.treeStickyScrollFocused=e.WorkbenchTreeStickyScrollFocused.bindTo(this.contextKeyService),this._useAltAsMultipleSelectionModifier=q(Ee),this.updateStyleOverrides(Ce);const Be=()=>{const Ie=ce.getFocus()[0];if(!Ie)return;const fe=ce.getNode(Ie);this.treeElementCanCollapse.set(fe.collapsible&&!fe.collapsed),this.treeElementHasParent.set(!!ce.getParentElement(Ie)),this.treeElementCanExpand.set(fe.collapsible&&fe.collapsed),this.treeElementHasChild.set(!!ce.getFirstElementChild(Ie))},De=new Set;De.add(g),De.add(h),this.disposables.push(this.contextKeyService,_e.register(ce),ce.onDidChangeSelection(()=>{const Ie=ce.getSelection(),fe=ce.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.hasSelectionOrFocus.set(Ie.length>0||fe.length>0),this.hasMultiSelection.set(Ie.length>1),this.hasDoubleSelection.set(Ie.length===2)})}),ce.onDidChangeFocus(()=>{const Ie=ce.getSelection(),fe=ce.getFocus();this.hasSelectionOrFocus.set(Ie.length>0||fe.length>0),Be()}),ce.onDidChangeCollapseState(Be),ce.onDidChangeModel(Be),ce.onDidChangeFindOpenState(Ie=>this.treeFindOpen.set(Ie)),ce.onDidChangeStickyScrollFocused(Ie=>this.treeStickyScrollFocused.set(Ie)),Ee.onDidChangeConfiguration(Ie=>{let fe={};if(Ie.affectsConfiguration(w)&&(this._useAltAsMultipleSelectionModifier=q(Ee)),Ie.affectsConfiguration(R)){const be=Ee.getValue(R);fe={...fe,indent:be}}if(Ie.affectsConfiguration(x)&&pe.renderIndentGuides===void 0){const be=Ee.getValue(x);fe={...fe,renderIndentGuides:be}}if(Ie.affectsConfiguration(O)){const be=!!Ee.getValue(O);fe={...fe,smoothScrolling:be}}if(Ie.affectsConfiguration(T)||Ie.affectsConfiguration(P)){const be=Y(Ee);fe={...fe,defaultFindMode:be}}if(Ie.affectsConfiguration(A)||Ie.affectsConfiguration(P)){const be=ve();fe={...fe,typeNavigationMode:be}}if(Ie.affectsConfiguration(M)){const be=j(Ee);fe={...fe,defaultFindMatchType:be}}if(Ie.affectsConfiguration(I)&&pe.horizontalScrolling===void 0){const be=!!Ee.getValue(I);fe={...fe,horizontalScrolling:be}}if(Ie.affectsConfiguration(N)){const be=!!Ee.getValue(N);fe={...fe,scrollByPage:be}}if(Ie.affectsConfiguration(V)&&pe.expandOnlyOnTwistieClick===void 0&&(fe={...fe,expandOnlyOnTwistieClick:Ee.getValue(V)==="doubleClick"}),Ie.affectsConfiguration(K)){const be=Ee.getValue(K);fe={...fe,enableStickyScroll:be}}if(Ie.affectsConfiguration(F)){const be=Math.max(1,Ee.getValue(F));fe={...fe,stickyScrollMaxItemCount:be}}if(Ie.affectsConfiguration(B)){const be=Ee.getValue(B);fe={...fe,mouseWheelScrollSensitivity:be}}if(Ie.affectsConfiguration(W)){const be=Ee.getValue(W);fe={...fe,fastScrollSensitivity:be}}Object.keys(fe).length>0&&ce.updateOptions(fe)}),this.contextKeyService.onDidChangeContext(Ie=>{Ie.affectsSome(De)&&ce.updateOptions({typeNavigationMode:ve()})})),this.navigator=new he(ce,{configurationService:Ee,...pe}),this.disposables.push(this.navigator)}updateOptions(ce){ce.multipleSelectionSupport!==void 0&&this.listSupportsMultiSelect.set(!!ce.multipleSelectionSupport)}updateStyleOverrides(ce){this.tree.style(ce?(0,l.getListStyles)(ce):l.defaultListStyles)}dispose(){this.disposables=(0,a.dispose)(this.disposables)}};ee=ke([ge(4,r.IContextKeyService),ge(5,e.IListService),ge(6,n.IConfigurationService)],ee),s.Registry.as(t.Extensions.Configuration).registerConfiguration({id:"workbench",order:7,title:(0,i.localize)(0,null),type:"object",properties:{[w]:{type:"string",enum:["ctrlCmd","alt"],markdownEnumDescriptions:[(0,i.localize)(1,null),(0,i.localize)(2,null)],default:"ctrlCmd",description:(0,i.localize)(3,null)},[D]:{type:"string",enum:["singleClick","doubleClick"],default:"singleClick",description:(0,i.localize)(4,null)},[I]:{type:"boolean",default:!1,description:(0,i.localize)(5,null)},[N]:{type:"boolean",default:!1,description:(0,i.localize)(6,null)},[R]:{type:"number",default:8,minimum:4,maximum:40,description:(0,i.localize)(7,null)},[x]:{type:"string",enum:["none","onHover","always"],default:"onHover",description:(0,i.localize)(8,null)},[O]:{type:"boolean",default:!1,description:(0,i.localize)(9,null)},[B]:{type:"number",default:1,markdownDescription:(0,i.localize)(10,null)},[W]:{type:"number",default:5,markdownDescription:(0,i.localize)(11,null)},[T]:{type:"string",enum:["highlight","filter"],enumDescriptions:[(0,i.localize)(12,null),(0,i.localize)(13,null)],default:"highlight",description:(0,i.localize)(14,null)},[P]:{type:"string",enum:["simple","highlight","filter"],enumDescriptions:[(0,i.localize)(15,null),(0,i.localize)(16,null),(0,i.localize)(17,null)],default:"highlight",description:(0,i.localize)(18,null),deprecated:!0,deprecationMessage:(0,i.localize)(19,null)},[M]:{type:"string",enum:["fuzzy","contiguous"],enumDescriptions:[(0,i.localize)(20,null),(0,i.localize)(21,null)],default:"fuzzy",description:(0,i.localize)(22,null)},[V]:{type:"string",enum:["singleClick","doubleClick"],default:"singleClick",description:(0,i.localize)(23,null)},[K]:{type:"boolean",default:!0,description:(0,i.localize)(24,null)},[F]:{type:"number",minimum:1,default:7,markdownDescription:(0,i.localize)(25,null)},[A]:{type:"string",enum:["automatic","trigger"],default:"automatic",markdownDescription:(0,i.localize)(26,null)}}})}),define(se[82],oe([1,0,14,26,28,6,20,22,753,245,37]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.spinningLoading=e.syncing=e.gotoNextLocation=e.gotoPreviousLocation=e.widgetClose=e.iconsSchemaId=e.getIconRegistry=e.registerIcon=e.IconFontDefinition=e.IconContribution=e.Extensions=void 0,e.Extensions={IconContribution:"base.contributions.icons"};var a;(function(s){function l(o,g){let h=o.defaults;for(;y.ThemeIcon.isThemeIcon(h);){const m=t.getIcon(h.id);if(!m)return;h=m.defaults}return h}s.getDefinition=l})(a||(e.IconContribution=a={}));var i;(function(s){function l(g){return{weight:g.weight,style:g.style,src:g.src.map(h=>({format:h.format,location:h.location.toString()}))}}s.toJSONObject=l;function o(g){const h=m=>(0,S.isString)(m)?m:void 0;if(g&&Array.isArray(g.src)&&g.src.every(m=>(0,S.isString)(m.format)&&(0,S.isString)(m.location)))return{weight:h(g.weight),style:h(g.style),src:g.src.map(m=>({format:m.format,location:p.URI.parse(m.location)}))}}s.fromJSONObject=o})(i||(e.IconFontDefinition=i={}));class n{constructor(){this._onDidChange=new E.Emitter,this.onDidChange=this._onDidChange.event,this.iconSchema={definitions:{icons:{type:"object",properties:{fontId:{type:"string",description:(0,_.localize)(0,null)},fontCharacter:{type:"string",description:(0,_.localize)(1,null)}},additionalProperties:!1,defaultSnippets:[{body:{fontCharacter:"\\\\e030"}}]}},type:"object",properties:{}},this.iconReferenceSchema={type:"string",pattern:`^${y.ThemeIcon.iconNameExpression}$`,enum:[],enumDescriptions:[]},this.iconsById={},this.iconFontsById={}}registerIcon(l,o,g,h){const m=this.iconsById[l];if(m){if(g&&!m.description){m.description=g,this.iconSchema.properties[l].markdownDescription=`${g} $(${l})`;const D=this.iconReferenceSchema.enum.indexOf(l);D!==-1&&(this.iconReferenceSchema.enumDescriptions[D]=g),this._onDidChange.fire()}return m}const C={id:l,description:g,defaults:o,deprecationMessage:h};this.iconsById[l]=C;const w={$ref:"#/definitions/icons"};return h&&(w.deprecationMessage=h),g&&(w.markdownDescription=`${g}: $(${l})`),this.iconSchema.properties[l]=w,this.iconReferenceSchema.enum.push(l),this.iconReferenceSchema.enumDescriptions.push(g||""),this._onDidChange.fire(),{id:l}}getIcons(){return Object.keys(this.iconsById).map(l=>this.iconsById[l])}getIcon(l){return this.iconsById[l]}getIconSchema(){return this.iconSchema}toString(){const l=(m,C)=>m.id.localeCompare(C.id),o=m=>{for(;y.ThemeIcon.isThemeIcon(m.defaults);)m=this.iconsById[m.defaults.id];return`codicon codicon-${m?m.id:""}`},g=[];g.push("| preview     | identifier                        | default codicon ID                | description"),g.push("| ----------- | --------------------------------- | --------------------------------- | --------------------------------- |");const h=Object.keys(this.iconsById).map(m=>this.iconsById[m]);for(const m of h.filter(C=>!!C.description).sort(l))g.push(`|<i class="${o(m)}"></i>|${m.id}|${y.ThemeIcon.isThemeIcon(m.defaults)?m.defaults.id:m.id}|${m.description||""}|`);g.push("| preview     | identifier                        "),g.push("| ----------- | --------------------------------- |");for(const m of h.filter(C=>!y.ThemeIcon.isThemeIcon(C.defaults)).sort(l))g.push(`|<i class="${o(m)}"></i>|${m.id}|`);return g.join(`
+`)}}const t=new n;b.Registry.add(e.Extensions.IconContribution,t);function r(s,l,o,g){return t.registerIcon(s,l,o,g)}e.registerIcon=r;function u(){return t}e.getIconRegistry=u;function f(){const s=(0,k.getCodiconFontCharacters)();for(const l in s){const o="\\"+s[l].toString(16);t.registerIcon(l,{fontCharacter:o})}}f(),e.iconsSchemaId="vscode://schemas/icons";const c=b.Registry.as(v.Extensions.JSONContribution);c.registerSchema(e.iconsSchemaId,t.getIconSchema());const d=new L.RunOnceScheduler(()=>c.notifySchemaChanged(e.iconsSchemaId),200);t.onDidChange(()=>{d.isScheduled()||d.schedule()}),e.widgetClose=r("widget-close",k.Codicon.close,(0,_.localize)(2,null)),e.gotoPreviousLocation=r("goto-previous-location",k.Codicon.arrowUp,(0,_.localize)(3,null)),e.gotoNextLocation=r("goto-next-location",k.Codicon.arrowDown,(0,_.localize)(4,null)),e.syncing=y.ThemeIcon.modify(k.Codicon.sync,"spin"),e.spinningLoading=y.ThemeIcon.modify(k.Codicon.loading,"spin")}),define(se[841],oe([1,0,7,93,78,77,42,13,26,2,35,28,72,87,36,62,73,10,5,112,43,94,120,86,622,122,8,82,447]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AccessibleDiffViewer=void 0;const D=(0,w.registerIcon)("diff-review-insert",_.Codicon.add,(0,h.localize)(0,null)),I=(0,w.registerIcon)("diff-review-remove",_.Codicon.remove,(0,h.localize)(1,null)),T=(0,w.registerIcon)("diff-review-close",_.Codicon.close,(0,h.localize)(2,null));let A=class extends v.Disposable{constructor(q,ie,ae,ne,$,J,Q,re,de){super(),this._parentNode=q,this._visible=ie,this._setVisible=ae,this._canClose=ne,this._width=$,this._height=J,this._diffs=Q,this._editors=re,this._instantiationService=de,this._state=(0,b.derivedWithStore)(this,(he,me)=>{const X=this._visible.read(he);if(this._parentNode.style.visibility=X?"visible":"hidden",!X)return null;const U=me.add(this._instantiationService.createInstance(P,this._diffs,this._editors,this._setVisible,this._canClose)),G=me.add(this._instantiationService.createInstance(K,this._parentNode,U,this._width,this._height,this._editors));return{model:U,view:G}}).recomputeInitiallyAndOnChange(this._store)}next(){(0,b.transaction)(q=>{const ie=this._visible.get();this._setVisible(!0,q),ie&&this._state.get().model.nextGroup(q)})}prev(){(0,b.transaction)(q=>{this._setVisible(!0,q),this._state.get().model.previousGroup(q)})}close(){(0,b.transaction)(q=>{this._setVisible(!1,q)})}};e.AccessibleDiffViewer=A,A._ttPolicy=(0,k.createTrustedTypesPolicy)("diffReview",{createHTML:F=>F}),e.AccessibleDiffViewer=A=ke([ge(8,C.IInstantiationService)],A);let P=class extends v.Disposable{constructor(q,ie,ae,ne,$){super(),this._diffs=q,this._editors=ie,this._setVisible=ae,this.canClose=ne,this._audioCueService=$,this._groups=(0,b.observableValue)(this,[]),this._currentGroupIdx=(0,b.observableValue)(this,0),this._currentElementIdx=(0,b.observableValue)(this,0),this.groups=this._groups,this.currentGroup=this._currentGroupIdx.map((J,Q)=>this._groups.read(Q)[J]),this.currentGroupIndex=this._currentGroupIdx,this.currentElement=this._currentElementIdx.map((J,Q)=>{var re;return(re=this.currentGroup.read(Q))===null||re===void 0?void 0:re.lines[J]}),this._register((0,b.autorun)(J=>{const Q=this._diffs.read(J);if(!Q){this._groups.set([],void 0);return}const re=M(Q,this._editors.original.getModel().getLineCount(),this._editors.modified.getModel().getLineCount());(0,b.transaction)(de=>{const he=this._editors.modified.getPosition();if(he){const me=re.findIndex(X=>he?.lineNumber<X.range.modified.endLineNumberExclusive);me!==-1&&this._currentGroupIdx.set(me,de)}this._groups.set(re,de)})})),this._register((0,b.autorun)(J=>{const Q=this.currentElement.read(J);Q?.type===R.Deleted?this._audioCueService.playAudioCue(m.AudioCue.diffLineDeleted,{source:"accessibleDiffViewer.currentElementChanged"}):Q?.type===R.Added&&this._audioCueService.playAudioCue(m.AudioCue.diffLineInserted,{source:"accessibleDiffViewer.currentElementChanged"})})),this._register((0,b.autorun)(J=>{var Q;const re=this.currentElement.read(J);if(re&&re.type!==R.Header){const de=(Q=re.modifiedLineNumber)!==null&&Q!==void 0?Q:re.diff.modified.startLineNumber;this._editors.modified.setSelection(c.Range.fromPositions(new f.Position(de,1)))}}))}_goToGroupDelta(q,ie){const ae=this.groups.get();!ae||ae.length<=1||(0,b.subtransaction)(ie,ne=>{this._currentGroupIdx.set(u.OffsetRange.ofLength(ae.length).clipCyclic(this._currentGroupIdx.get()+q),ne),this._currentElementIdx.set(0,ne)})}nextGroup(q){this._goToGroupDelta(1,q)}previousGroup(q){this._goToGroupDelta(-1,q)}_goToLineDelta(q){const ie=this.currentGroup.get();!ie||ie.lines.length<=1||(0,b.transaction)(ae=>{this._currentElementIdx.set(u.OffsetRange.ofLength(ie.lines.length).clip(this._currentElementIdx.get()+q),ae)})}goToNextLine(){this._goToLineDelta(1)}goToPreviousLine(){this._goToLineDelta(-1)}goToLine(q){const ie=this.currentGroup.get();if(!ie)return;const ae=ie.lines.indexOf(q);ae!==-1&&(0,b.transaction)(ne=>{this._currentElementIdx.set(ae,ne)})}revealCurrentElementInEditor(){this._setVisible(!1,void 0);const q=this.currentElement.get();q&&(q.type===R.Deleted?(this._editors.original.setSelection(c.Range.fromPositions(new f.Position(q.originalLineNumber,1))),this._editors.original.revealLine(q.originalLineNumber),this._editors.original.focus()):(q.type!==R.Header&&(this._editors.modified.setSelection(c.Range.fromPositions(new f.Position(q.modifiedLineNumber,1))),this._editors.modified.revealLine(q.modifiedLineNumber)),this._editors.modified.focus()))}close(){this._setVisible(!1,void 0),this._editors.modified.focus()}};P=ke([ge(4,m.IAudioCueService)],P);const N=3;function M(F,q,ie){const ae=[];for(const ne of(0,p.groupAdjacentBy)(F,($,J)=>J.modified.startLineNumber-$.modified.endLineNumberExclusive<2*N)){const $=[];$.push(new O);const J=new r.LineRange(Math.max(1,ne[0].original.startLineNumber-N),Math.min(ne[ne.length-1].original.endLineNumberExclusive+N,q+1)),Q=new r.LineRange(Math.max(1,ne[0].modified.startLineNumber-N),Math.min(ne[ne.length-1].modified.endLineNumberExclusive+N,ie+1));(0,p.forEachAdjacent)(ne,(he,me)=>{const X=new r.LineRange(he?he.original.endLineNumberExclusive:J.startLineNumber,me?me.original.startLineNumber:J.endLineNumberExclusive),U=new r.LineRange(he?he.modified.endLineNumberExclusive:Q.startLineNumber,me?me.modified.startLineNumber:Q.endLineNumberExclusive);X.forEach(G=>{$.push(new V(G,U.startLineNumber+(G-X.startLineNumber)))}),me&&(me.original.forEach(G=>{$.push(new B(me,G))}),me.modified.forEach(G=>{$.push(new W(me,G))}))});const re=ne[0].modified.join(ne[ne.length-1].modified),de=ne[0].original.join(ne[ne.length-1].original);ae.push(new x(new d.LineRangeMapping(re,de),$))}return ae}var R;(function(F){F[F.Header=0]="Header",F[F.Unchanged=1]="Unchanged",F[F.Deleted=2]="Deleted",F[F.Added=3]="Added"})(R||(R={}));class x{constructor(q,ie){this.range=q,this.lines=ie}}class O{constructor(){this.type=R.Header}}class B{constructor(q,ie){this.diff=q,this.originalLineNumber=ie,this.type=R.Deleted,this.modifiedLineNumber=void 0}}class W{constructor(q,ie){this.diff=q,this.modifiedLineNumber=ie,this.type=R.Added,this.originalLineNumber=void 0}}class V{constructor(q,ie){this.originalLineNumber=q,this.modifiedLineNumber=ie,this.type=R.Unchanged}}let K=class extends v.Disposable{constructor(q,ie,ae,ne,$,J){super(),this._element=q,this._model=ie,this._width=ae,this._height=ne,this._editors=$,this._languageService=J,this.domNode=this._element,this.domNode.className="diff-review monaco-editor-background";const Q=document.createElement("div");Q.className="diff-review-actions",this._actionBar=this._register(new y.ActionBar(Q)),this._register((0,b.autorun)(re=>{this._actionBar.clear(),this._model.canClose.read(re)&&this._actionBar.push(new S.Action("diffreview.close",(0,h.localize)(3,null),"close-diff-review "+a.ThemeIcon.asClassName(T),!0,async()=>ie.close()),{label:!1,icon:!0})})),this._content=document.createElement("div"),this._content.className="diff-review-content",this._content.setAttribute("role","code"),this._scrollbar=this._register(new E.DomScrollableElement(this._content,{})),(0,L.reset)(this.domNode,this._scrollbar.getDomNode(),Q),this._register((0,v.toDisposable)(()=>{(0,L.reset)(this.domNode)})),this._register((0,n.applyStyle)(this.domNode,{width:this._width,height:this._height})),this._register((0,n.applyStyle)(this._content,{width:this._width,height:this._height})),this._register((0,b.autorunWithStore)((re,de)=>{this._model.currentGroup.read(re),this._render(de)})),this._register((0,L.addStandardDisposableListener)(this.domNode,"keydown",re=>{(re.equals(18)||re.equals(2066)||re.equals(530))&&(re.preventDefault(),this._model.goToNextLine()),(re.equals(16)||re.equals(2064)||re.equals(528))&&(re.preventDefault(),this._model.goToPreviousLine()),(re.equals(9)||re.equals(2057)||re.equals(521)||re.equals(1033))&&(re.preventDefault(),this._model.close()),(re.equals(10)||re.equals(3))&&(re.preventDefault(),this._model.revealCurrentElementInEditor())}))}_render(q){const ie=this._editors.original.getOptions(),ae=this._editors.modified.getOptions(),ne=document.createElement("div");ne.className="diff-review-table",ne.setAttribute("role","list"),ne.setAttribute("aria-label",(0,h.localize)(4,null)),(0,i.applyFontInfo)(ne,ae.get(50)),(0,L.reset)(this._content,ne);const $=this._editors.original.getModel(),J=this._editors.modified.getModel();if(!$||!J)return;const Q=$.getOptions(),re=J.getOptions(),de=ae.get(66),he=this._model.currentGroup.get();for(const me of he?.lines||[]){if(!he)break;let X;if(me.type===R.Header){const G=document.createElement("div");G.className="diff-review-row",G.setAttribute("role","listitem");const z=he.range,H=this._model.currentGroupIndex.get(),Y=this._model.groups.get().length,j=ue=>ue===0?(0,h.localize)(5,null):ue===1?(0,h.localize)(6,null):(0,h.localize)(7,null,ue),Z=j(z.original.length),ee=j(z.modified.length);G.setAttribute("aria-label",(0,h.localize)(8,null,H+1,Y,z.original.startLineNumber,Z,z.modified.startLineNumber,ee));const le=document.createElement("div");le.className="diff-review-cell diff-review-summary",le.appendChild(document.createTextNode(`${H+1}/${Y}: @@ -${z.original.startLineNumber},${z.original.length} +${z.modified.startLineNumber},${z.modified.length} @@`)),G.appendChild(le),X=G}else X=this._createRow(me,de,this._width.get(),ie,$,Q,ae,J,re);ne.appendChild(X);const U=(0,b.derived)(G=>this._model.currentElement.read(G)===me);q.add((0,b.autorun)(G=>{const z=U.read(G);X.tabIndex=z?0:-1,z&&X.focus()})),q.add((0,L.addDisposableListener)(X,"focus",()=>{this._model.goToLine(me)}))}this._scrollbar.scanDomNode()}_createRow(q,ie,ae,ne,$,J,Q,re,de){const he=ne.get(143),me=he.glyphMarginWidth+he.lineNumbersWidth,X=Q.get(143),U=10+X.glyphMarginWidth+X.lineNumbersWidth;let G="diff-review-row",z="";const H="diff-review-spacer";let Y=null;switch(q.type){case R.Added:G="diff-review-row line-insert",z=" char-insert",Y=D;break;case R.Deleted:G="diff-review-row line-delete",z=" char-delete",Y=I;break}const j=document.createElement("div");j.style.minWidth=ae+"px",j.className=G,j.setAttribute("role","listitem"),j.ariaLevel="";const Z=document.createElement("div");Z.className="diff-review-cell",Z.style.height=`${ie}px`,j.appendChild(Z);const ee=document.createElement("span");ee.style.width=me+"px",ee.style.minWidth=me+"px",ee.className="diff-review-line-number"+z,q.originalLineNumber!==void 0?ee.appendChild(document.createTextNode(String(q.originalLineNumber))):ee.innerText="\xA0",Z.appendChild(ee);const le=document.createElement("span");le.style.width=U+"px",le.style.minWidth=U+"px",le.style.paddingRight="10px",le.className="diff-review-line-number"+z,q.modifiedLineNumber!==void 0?le.appendChild(document.createTextNode(String(q.modifiedLineNumber))):le.innerText="\xA0",Z.appendChild(le);const ue=document.createElement("span");if(ue.className=H,Y){const ve=document.createElement("span");ve.className=a.ThemeIcon.asClassName(Y),ve.innerText="\xA0\xA0",ue.appendChild(ve)}else ue.innerText="\xA0\xA0";Z.appendChild(ue);let ce;if(q.modifiedLineNumber!==void 0){let ve=this._getLineHtml(re,Q,de.tabSize,q.modifiedLineNumber,this._languageService.languageIdCodec);A._ttPolicy&&(ve=A._ttPolicy.createHTML(ve)),Z.insertAdjacentHTML("beforeend",ve),ce=re.getLineContent(q.modifiedLineNumber)}else{let ve=this._getLineHtml($,ne,J.tabSize,q.originalLineNumber,this._languageService.languageIdCodec);A._ttPolicy&&(ve=A._ttPolicy.createHTML(ve)),Z.insertAdjacentHTML("beforeend",ve),ce=$.getLineContent(q.originalLineNumber)}ce.length===0&&(ce=(0,h.localize)(9,null));let pe="";switch(q.type){case R.Unchanged:q.originalLineNumber===q.modifiedLineNumber?pe=(0,h.localize)(10,null,ce,q.originalLineNumber):pe=(0,h.localize)(11,null,ce,q.originalLineNumber,q.modifiedLineNumber);break;case R.Added:pe=(0,h.localize)(12,null,ce,q.modifiedLineNumber);break;case R.Deleted:pe=(0,h.localize)(13,null,ce,q.originalLineNumber);break}return j.setAttribute("aria-label",pe),j}_getLineHtml(q,ie,ae,ne,$){const J=q.getLineContent(ne),Q=ie.get(50),re=l.LineTokens.createEmpty(J,$),de=g.ViewLineRenderingData.isBasicASCII(J,q.mightContainNonBasicASCII()),he=g.ViewLineRenderingData.containsRTL(J,de,q.mightContainRTL());return(0,o.renderViewLine2)(new o.RenderLineInput(Q.isMonospace&&!ie.get(33),Q.canUseHalfwidthRightwardsArrow,J,!1,de,he,0,re,[],ae,0,Q.spaceWidth,Q.middotWidth,Q.wsmiddotWidth,ie.get(116),ie.get(98),ie.get(93),ie.get(51)!==t.EditorFontLigatures.OFF,null)).html}};K=ke([ge(5,s.ILanguageService)],K)}),define(se[842],oe([1,0,54,7,157,76,26,39,6,2,28,661,29,82,201]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorPickerWidget=e.InsertButton=e.ColorPickerBody=e.ColorPickerHeader=void 0;const t=k.$;class r extends v.Disposable{constructor(m,C,w,D=!1){super(),this.model=C,this.showingStandaloneColorPicker=D,this._closeButton=null,this._domNode=t(".colorpicker-header"),k.append(m,this._domNode),this._pickedColorNode=k.append(this._domNode,t(".picked-color")),k.append(this._pickedColorNode,t("span.codicon.codicon-color-mode")),this._pickedColorPresentation=k.append(this._pickedColorNode,document.createElement("span")),this._pickedColorPresentation.classList.add("picked-color-presentation");const I=(0,a.localize)(0,null);this._pickedColorNode.setAttribute("title",I),this._originalColorNode=k.append(this._domNode,t(".original-color")),this._originalColorNode.style.backgroundColor=p.Color.Format.CSS.format(this.model.originalColor)||"",this.backgroundColor=w.getColorTheme().getColor(i.editorHoverBackground)||p.Color.white,this._register(w.onDidColorThemeChange(T=>{this.backgroundColor=T.getColor(i.editorHoverBackground)||p.Color.white})),this._register(k.addDisposableListener(this._pickedColorNode,k.EventType.CLICK,()=>this.model.selectNextColorPresentation())),this._register(k.addDisposableListener(this._originalColorNode,k.EventType.CLICK,()=>{this.model.color=this.model.originalColor,this.model.flushColor()})),this._register(C.onDidChangeColor(this.onDidChangeColor,this)),this._register(C.onDidChangePresentation(this.onDidChangePresentation,this)),this._pickedColorNode.style.backgroundColor=p.Color.Format.CSS.format(C.color)||"",this._pickedColorNode.classList.toggle("light",C.color.rgba.a<.5?this.backgroundColor.isLighter():C.color.isLighter()),this.onDidChangeColor(this.model.color),this.showingStandaloneColorPicker&&(this._domNode.classList.add("standalone-colorpicker"),this._closeButton=this._register(new u(this._domNode)))}get closeButton(){return this._closeButton}get pickedColorNode(){return this._pickedColorNode}get originalColorNode(){return this._originalColorNode}onDidChangeColor(m){this._pickedColorNode.style.backgroundColor=p.Color.Format.CSS.format(m)||"",this._pickedColorNode.classList.toggle("light",m.rgba.a<.5?this.backgroundColor.isLighter():m.isLighter()),this.onDidChangePresentation()}onDidChangePresentation(){this._pickedColorPresentation.textContent=this.model.presentation?this.model.presentation.label:""}}e.ColorPickerHeader=r;class u extends v.Disposable{constructor(m){super(),this._onClicked=this._register(new _.Emitter),this.onClicked=this._onClicked.event,this._button=document.createElement("div"),this._button.classList.add("close-button"),k.append(m,this._button);const C=document.createElement("div");C.classList.add("close-button-inner-div"),k.append(this._button,C),k.append(C,t(".button"+b.ThemeIcon.asCSSSelector((0,n.registerIcon)("color-picker-close",S.Codicon.close,(0,a.localize)(1,null))))).classList.add("close-icon"),this._register(k.addDisposableListener(this._button,k.EventType.CLICK,()=>{this._onClicked.fire()}))}}class f extends v.Disposable{constructor(m,C,w,D=!1){super(),this.model=C,this.pixelRatio=w,this._insertButton=null,this._domNode=t(".colorpicker-body"),k.append(m,this._domNode),this._saturationBox=new c(this._domNode,this.model,this.pixelRatio),this._register(this._saturationBox),this._register(this._saturationBox.onDidChange(this.onDidSaturationValueChange,this)),this._register(this._saturationBox.onColorFlushed(this.flushColor,this)),this._opacityStrip=new s(this._domNode,this.model,D),this._register(this._opacityStrip),this._register(this._opacityStrip.onDidChange(this.onDidOpacityChange,this)),this._register(this._opacityStrip.onColorFlushed(this.flushColor,this)),this._hueStrip=new l(this._domNode,this.model,D),this._register(this._hueStrip),this._register(this._hueStrip.onDidChange(this.onDidHueChange,this)),this._register(this._hueStrip.onColorFlushed(this.flushColor,this)),D&&(this._insertButton=this._register(new o(this._domNode)),this._domNode.classList.add("standalone-colorpicker"))}flushColor(){this.model.flushColor()}onDidSaturationValueChange({s:m,v:C}){const w=this.model.color.hsva;this.model.color=new p.Color(new p.HSVA(w.h,m,C,w.a))}onDidOpacityChange(m){const C=this.model.color.hsva;this.model.color=new p.Color(new p.HSVA(C.h,C.s,C.v,m))}onDidHueChange(m){const C=this.model.color.hsva,w=(1-m)*360;this.model.color=new p.Color(new p.HSVA(w===360?0:w,C.s,C.v,C.a))}get domNode(){return this._domNode}get saturationBox(){return this._saturationBox}get enterButton(){return this._insertButton}layout(){this._saturationBox.layout(),this._opacityStrip.layout(),this._hueStrip.layout()}}e.ColorPickerBody=f;class c extends v.Disposable{constructor(m,C,w){super(),this.model=C,this.pixelRatio=w,this._onDidChange=new _.Emitter,this.onDidChange=this._onDidChange.event,this._onColorFlushed=new _.Emitter,this.onColorFlushed=this._onColorFlushed.event,this._domNode=t(".saturation-wrap"),k.append(m,this._domNode),this._canvas=document.createElement("canvas"),this._canvas.className="saturation-box",k.append(this._domNode,this._canvas),this.selection=t(".saturation-selection"),k.append(this._domNode,this.selection),this.layout(),this._register(k.addDisposableListener(this._domNode,k.EventType.POINTER_DOWN,D=>this.onPointerDown(D))),this._register(this.model.onDidChangeColor(this.onDidChangeColor,this)),this.monitor=null}get domNode(){return this._domNode}onPointerDown(m){if(!m.target||!(m.target instanceof Element))return;this.monitor=this._register(new y.GlobalPointerMoveMonitor);const C=k.getDomNodePagePosition(this._domNode);m.target!==this.selection&&this.onDidChangePosition(m.offsetX,m.offsetY),this.monitor.startMonitoring(m.target,m.pointerId,m.buttons,D=>this.onDidChangePosition(D.pageX-C.left,D.pageY-C.top),()=>null);const w=k.addDisposableListener(m.target.ownerDocument,k.EventType.POINTER_UP,()=>{this._onColorFlushed.fire(),w.dispose(),this.monitor&&(this.monitor.stopMonitoring(!0),this.monitor=null)},!0)}onDidChangePosition(m,C){const w=Math.max(0,Math.min(1,m/this.width)),D=Math.max(0,Math.min(1,1-C/this.height));this.paintSelection(w,D),this._onDidChange.fire({s:w,v:D})}layout(){this.width=this._domNode.offsetWidth,this.height=this._domNode.offsetHeight,this._canvas.width=this.width*this.pixelRatio,this._canvas.height=this.height*this.pixelRatio,this.paint();const m=this.model.color.hsva;this.paintSelection(m.s,m.v)}paint(){const m=this.model.color.hsva,C=new p.Color(new p.HSVA(m.h,1,1,1)),w=this._canvas.getContext("2d"),D=w.createLinearGradient(0,0,this._canvas.width,0);D.addColorStop(0,"rgba(255, 255, 255, 1)"),D.addColorStop(.5,"rgba(255, 255, 255, 0.5)"),D.addColorStop(1,"rgba(255, 255, 255, 0)");const I=w.createLinearGradient(0,0,0,this._canvas.height);I.addColorStop(0,"rgba(0, 0, 0, 0)"),I.addColorStop(1,"rgba(0, 0, 0, 1)"),w.rect(0,0,this._canvas.width,this._canvas.height),w.fillStyle=p.Color.Format.CSS.format(C),w.fill(),w.fillStyle=D,w.fill(),w.fillStyle=I,w.fill()}paintSelection(m,C){this.selection.style.left=`${m*this.width}px`,this.selection.style.top=`${this.height-C*this.height}px`}onDidChangeColor(m){if(this.monitor&&this.monitor.isMonitoring())return;this.paint();const C=m.hsva;this.paintSelection(C.s,C.v)}}class d extends v.Disposable{constructor(m,C,w=!1){super(),this.model=C,this._onDidChange=new _.Emitter,this.onDidChange=this._onDidChange.event,this._onColorFlushed=new _.Emitter,this.onColorFlushed=this._onColorFlushed.event,w?(this.domNode=k.append(m,t(".standalone-strip")),this.overlay=k.append(this.domNode,t(".standalone-overlay"))):(this.domNode=k.append(m,t(".strip")),this.overlay=k.append(this.domNode,t(".overlay"))),this.slider=k.append(this.domNode,t(".slider")),this.slider.style.top="0px",this._register(k.addDisposableListener(this.domNode,k.EventType.POINTER_DOWN,D=>this.onPointerDown(D))),this._register(C.onDidChangeColor(this.onDidChangeColor,this)),this.layout()}layout(){this.height=this.domNode.offsetHeight-this.slider.offsetHeight;const m=this.getValue(this.model.color);this.updateSliderPosition(m)}onDidChangeColor(m){const C=this.getValue(m);this.updateSliderPosition(C)}onPointerDown(m){if(!m.target||!(m.target instanceof Element))return;const C=this._register(new y.GlobalPointerMoveMonitor),w=k.getDomNodePagePosition(this.domNode);this.domNode.classList.add("grabbing"),m.target!==this.slider&&this.onDidChangeTop(m.offsetY),C.startMonitoring(m.target,m.pointerId,m.buttons,I=>this.onDidChangeTop(I.pageY-w.top),()=>null);const D=k.addDisposableListener(m.target.ownerDocument,k.EventType.POINTER_UP,()=>{this._onColorFlushed.fire(),D.dispose(),C.stopMonitoring(!0),this.domNode.classList.remove("grabbing")},!0)}onDidChangeTop(m){const C=Math.max(0,Math.min(1,1-m/this.height));this.updateSliderPosition(C),this._onDidChange.fire(C)}updateSliderPosition(m){this.slider.style.top=`${(1-m)*this.height}px`}}class s extends d{constructor(m,C,w=!1){super(m,C,w),this.domNode.classList.add("opacity-strip"),this.onDidChangeColor(this.model.color)}onDidChangeColor(m){super.onDidChangeColor(m);const{r:C,g:w,b:D}=m.rgba,I=new p.Color(new p.RGBA(C,w,D,1)),T=new p.Color(new p.RGBA(C,w,D,0));this.overlay.style.background=`linear-gradient(to bottom, ${I} 0%, ${T} 100%)`}getValue(m){return m.hsva.a}}class l extends d{constructor(m,C,w=!1){super(m,C,w),this.domNode.classList.add("hue-strip")}getValue(m){return 1-m.hsva.h/360}}class o extends v.Disposable{constructor(m){super(),this._onClicked=this._register(new _.Emitter),this.onClicked=this._onClicked.event,this._button=k.append(m,document.createElement("button")),this._button.classList.add("insert-button"),this._button.textContent="Insert",this._register(k.addDisposableListener(this._button,k.EventType.CLICK,()=>{this._onClicked.fire()}))}get button(){return this._button}}e.InsertButton=o;class g extends E.Widget{constructor(m,C,w,D,I=!1){super(),this.model=C,this.pixelRatio=w,this._register(L.PixelRatio.onDidChange(()=>this.layout()));const T=t(".colorpicker-widget");m.appendChild(T),this.header=this._register(new r(T,this.model,D,I)),this.body=this._register(new f(T,this.model,this.pixelRatio,I))}layout(){this.body.layout()}}e.ColorPickerWidget=g}),define(se[843],oe([1,0,7,48,77,26,6,2,11,20,43,104,241,705,15,57,29,82,28,473]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c){"use strict";var d;Object.defineProperty(e,"__esModule",{value:!0}),e.ParameterHintsWidget=void 0;const s=L.$,l=(0,f.registerIcon)("parameter-hints-next",E.Codicon.chevronDown,n.localize(0,null)),o=(0,f.registerIcon)("parameter-hints-previous",E.Codicon.chevronUp,n.localize(1,null));let g=d=class extends p.Disposable{constructor(m,C,w,D,I){super(),this.editor=m,this.model=C,this.renderDisposeables=this._register(new p.DisposableStore),this.visible=!1,this.announcedLabel=null,this.allowEditorOverflow=!0,this.markdownRenderer=this._register(new a.MarkdownRenderer({editor:m},I,D)),this.keyVisible=i.Context.Visible.bindTo(w),this.keyMultipleSignatures=i.Context.MultipleSignatures.bindTo(w)}createParameterHintDOMNodes(){const m=s(".editor-widget.parameter-hints-widget"),C=L.append(m,s(".phwrapper"));C.tabIndex=-1;const w=L.append(C,s(".controls")),D=L.append(w,s(".button"+c.ThemeIcon.asCSSSelector(o))),I=L.append(w,s(".overloads")),T=L.append(w,s(".button"+c.ThemeIcon.asCSSSelector(l)));this._register(L.addDisposableListener(D,"click",x=>{L.EventHelper.stop(x),this.previous()})),this._register(L.addDisposableListener(T,"click",x=>{L.EventHelper.stop(x),this.next()}));const A=s(".body"),P=new y.DomScrollableElement(A,{alwaysConsumeMouseWheel:!0});this._register(P),C.appendChild(P.getDomNode());const N=L.append(A,s(".signature")),M=L.append(A,s(".docs"));m.style.userSelect="text",this.domNodes={element:m,signature:N,overloads:I,docs:M,scrollbar:P},this.editor.addContentWidget(this),this.hide(),this._register(this.editor.onDidChangeCursorSelection(x=>{this.visible&&this.editor.layoutContentWidget(this)}));const R=()=>{if(!this.domNodes)return;const x=this.editor.getOption(50);this.domNodes.element.style.fontSize=`${x.fontSize}px`,this.domNodes.element.style.lineHeight=`${x.lineHeight/x.fontSize}`};R(),this._register(S.Event.chain(this.editor.onDidChangeConfiguration.bind(this.editor),x=>x.filter(O=>O.hasChanged(50)))(R)),this._register(this.editor.onDidLayoutChange(x=>this.updateMaxHeight())),this.updateMaxHeight()}show(){this.visible||(this.domNodes||this.createParameterHintDOMNodes(),this.keyVisible.set(!0),this.visible=!0,setTimeout(()=>{var m;(m=this.domNodes)===null||m===void 0||m.element.classList.add("visible")},100),this.editor.layoutContentWidget(this))}hide(){var m;this.renderDisposeables.clear(),this.visible&&(this.keyVisible.reset(),this.visible=!1,this.announcedLabel=null,(m=this.domNodes)===null||m===void 0||m.element.classList.remove("visible"),this.editor.layoutContentWidget(this))}getPosition(){return this.visible?{position:this.editor.getPosition(),preference:[1,2]}:null}render(m){var C;if(this.renderDisposeables.clear(),!this.domNodes)return;const w=m.signatures.length>1;this.domNodes.element.classList.toggle("multiple",w),this.keyMultipleSignatures.set(w),this.domNodes.signature.innerText="",this.domNodes.docs.innerText="";const D=m.signatures[m.activeSignature];if(!D)return;const I=L.append(this.domNodes.signature,s(".code")),T=this.editor.getOption(50);I.style.fontSize=`${T.fontSize}px`,I.style.fontFamily=T.fontFamily;const A=D.parameters.length>0,P=(C=D.activeParameter)!==null&&C!==void 0?C:m.activeParameter;if(A)this.renderParameters(I,D,P);else{const R=L.append(I,s("span"));R.textContent=D.label}const N=D.parameters[P];if(N?.documentation){const R=s("span.documentation");if(typeof N.documentation=="string")R.textContent=N.documentation;else{const x=this.renderMarkdownDocs(N.documentation);R.appendChild(x.element)}L.append(this.domNodes.docs,s("p",{},R))}if(D.documentation!==void 0)if(typeof D.documentation=="string")L.append(this.domNodes.docs,s("p",{},D.documentation));else{const R=this.renderMarkdownDocs(D.documentation);L.append(this.domNodes.docs,R.element)}const M=this.hasDocs(D,N);if(this.domNodes.signature.classList.toggle("has-docs",M),this.domNodes.docs.classList.toggle("empty",!M),this.domNodes.overloads.textContent=String(m.activeSignature+1).padStart(m.signatures.length.toString().length,"0")+"/"+m.signatures.length,N){let R="";const x=D.parameters[P];Array.isArray(x.label)?R=D.label.substring(x.label[0],x.label[1]):R=x.label,x.documentation&&(R+=typeof x.documentation=="string"?`, ${x.documentation}`:`, ${x.documentation.value}`),D.documentation&&(R+=typeof D.documentation=="string"?`, ${D.documentation}`:`, ${D.documentation.value}`),this.announcedLabel!==R&&(k.alert(n.localize(2,null,R)),this.announcedLabel=R)}this.editor.layoutContentWidget(this),this.domNodes.scrollbar.scanDomNode()}renderMarkdownDocs(m){const C=this.renderDisposeables.add(this.markdownRenderer.render(m,{asyncRenderCallback:()=>{var w;(w=this.domNodes)===null||w===void 0||w.scrollbar.scanDomNode()}}));return C.element.classList.add("markdown-docs"),C}hasDocs(m,C){return!!(C&&typeof C.documentation=="string"&&(0,v.assertIsDefined)(C.documentation).length>0||C&&typeof C.documentation=="object"&&(0,v.assertIsDefined)(C.documentation).value.length>0||m.documentation&&typeof m.documentation=="string"&&(0,v.assertIsDefined)(m.documentation).length>0||m.documentation&&typeof m.documentation=="object"&&(0,v.assertIsDefined)(m.documentation.value).length>0)}renderParameters(m,C,w){const[D,I]=this.getParameterLabelOffsets(C,w),T=document.createElement("span");T.textContent=C.label.substring(0,D);const A=document.createElement("span");A.textContent=C.label.substring(D,I),A.className="parameter active";const P=document.createElement("span");P.textContent=C.label.substring(I),L.append(m,T,A,P)}getParameterLabelOffsets(m,C){const w=m.parameters[C];if(w){if(Array.isArray(w.label))return w.label;if(w.label.length){const D=new RegExp(`(\\W|^)${(0,_.escapeRegExpCharacters)(w.label)}(?=\\W|$)`,"g");D.test(m.label);const I=D.lastIndex-w.label.length;return I>=0?[I,D.lastIndex]:[0,0]}else return[0,0]}else return[0,0]}next(){this.editor.focus(),this.model.next()}previous(){this.editor.focus(),this.model.previous()}getDomNode(){return this.domNodes||this.createParameterHintDOMNodes(),this.domNodes.element}getId(){return d.ID}updateMaxHeight(){if(!this.domNodes)return;const C=`${Math.max(this.editor.getLayoutInfo().height/4,250)}px`;this.domNodes.element.style.maxHeight=C;const w=this.domNodes.element.getElementsByClassName("phwrapper");w.length&&(w[0].style.maxHeight=C)}};e.ParameterHintsWidget=g,g.ID="editor.widget.parameterHintsWidget",e.ParameterHintsWidget=g=d=ke([ge(2,t.IContextKeyService),ge(3,r.IOpenerService),ge(4,b.ILanguageService)],g),(0,u.registerColor)("editorHoverWidget.highlightForeground",{dark:u.listHighlightForeground,light:u.listHighlightForeground,hcDark:u.listHighlightForeground,hcLight:u.listHighlightForeground},n.localize(3,null))}),define(se[844],oe([1,0,99,2,16,21,31,18,768,241,704,15,8,843]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";var t;Object.defineProperty(e,"__esModule",{value:!0}),e.TriggerParameterHintsAction=e.ParameterHintsController=void 0;let r=t=class extends k.Disposable{static get(s){return s.getContribution(t.ID)}constructor(s,l,o){super(),this.editor=s,this.model=this._register(new _.ParameterHintsModel(s,o.signatureHelpProvider)),this._register(this.model.onChangedHints(g=>{var h;g?(this.widget.value.show(),this.widget.value.render(g)):(h=this.widget.rawValue)===null||h===void 0||h.hide()})),this.widget=new L.Lazy(()=>this._register(l.createInstance(n.ParameterHintsWidget,this.editor,this.model)))}cancel(){this.model.cancel()}previous(){var s;(s=this.widget.rawValue)===null||s===void 0||s.previous()}next(){var s;(s=this.widget.rawValue)===null||s===void 0||s.next()}trigger(s){this.model.trigger(s,0)}};e.ParameterHintsController=r,r.ID="editor.controller.parameterHints",e.ParameterHintsController=r=t=ke([ge(1,i.IInstantiationService),ge(2,p.ILanguageFeaturesService)],r);class u extends y.EditorAction{constructor(){super({id:"editor.action.triggerParameterHints",label:b.localize(0,null),alias:"Trigger Parameter Hints",precondition:E.EditorContextKeys.hasSignatureHelpProvider,kbOpts:{kbExpr:E.EditorContextKeys.editorTextFocus,primary:3082,weight:100}})}run(s,l){const o=r.get(l);o?.trigger({triggerKind:S.SignatureHelpTriggerKind.Invoke})}}e.TriggerParameterHintsAction=u,(0,y.registerEditorContribution)(r.ID,r,2),(0,y.registerEditorAction)(u);const f=100+75,c=y.EditorCommand.bindToContribution(r.get);(0,y.registerEditorCommand)(new c({id:"closeParameterHints",precondition:v.Context.Visible,handler:d=>d.cancel(),kbOpts:{weight:f,kbExpr:E.EditorContextKeys.focus,primary:9,secondary:[1033]}})),(0,y.registerEditorCommand)(new c({id:"showPrevParameterHint",precondition:a.ContextKeyExpr.and(v.Context.Visible,v.Context.MultipleSignatures),handler:d=>d.previous(),kbOpts:{weight:f,kbExpr:E.EditorContextKeys.focus,primary:16,secondary:[528],mac:{primary:16,secondary:[528,302]}}})),(0,y.registerEditorCommand)(new c({id:"showNextParameterHint",precondition:a.ContextKeyExpr.and(v.Context.Visible,v.Context.MultipleSignatures),handler:d=>d.next(),kbOpts:{weight:f,kbExpr:E.EditorContextKeys.focus,primary:18,secondary:[530],mac:{primary:18,secondary:[530,300]}}}))}),define(se[845],oe([1,0,7,78,42,2,104,8,786,82,28,480]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BannerController=void 0;const a=26;let i=class extends E.Disposable{constructor(r,u){super(),this._editor=r,this.instantiationService=u,this.banner=this._register(this.instantiationService.createInstance(n))}hide(){this._editor.setBanner(null,0),this.banner.clear()}show(r){this.banner.show({...r,onClose:()=>{var u;this.hide(),(u=r.onClose)===null||u===void 0||u.call(r)}}),this._editor.setBanner(this.banner.element,a)}};e.BannerController=i,e.BannerController=i=ke([ge(1,p.IInstantiationService)],i);let n=class extends E.Disposable{constructor(r){super(),this.instantiationService=r,this.markdownRenderer=this.instantiationService.createInstance(S.MarkdownRenderer,{}),this.element=(0,L.$)("div.editor-banner"),this.element.tabIndex=0}getAriaLabel(r){if(r.ariaLabel)return r.ariaLabel;if(typeof r.message=="string")return r.message}getBannerMessage(r){if(typeof r=="string"){const u=(0,L.$)("span");return u.innerText=r,u}return this.markdownRenderer.render(r).element}clear(){(0,L.clearNode)(this.element)}show(r){(0,L.clearNode)(this.element);const u=this.getAriaLabel(r);u&&this.element.setAttribute("aria-label",u);const f=(0,L.append)(this.element,(0,L.$)("div.icon-container"));f.setAttribute("aria-hidden","true"),r.icon&&f.appendChild((0,L.$)(`div${b.ThemeIcon.asCSSSelector(r.icon)}`));const c=(0,L.append)(this.element,(0,L.$)("div.message-container"));if(c.setAttribute("aria-hidden","true"),c.appendChild(this.getBannerMessage(r.message)),this.messageActionsContainer=(0,L.append)(this.element,(0,L.$)("div.message-actions-container")),r.actions)for(const s of r.actions)this._register(this.instantiationService.createInstance(_.Link,this.messageActionsContainer,{...s,tabIndex:-1},{}));const d=(0,L.append)(this.element,(0,L.$)("div.action-container"));this.actionBar=this._register(new k.ActionBar(d)),this.actionBar.push(this._register(new y.Action("banner.close","Close Banner",b.ThemeIcon.asClassName(v.widgetClose),!0,()=>{typeof r.onClose=="function"&&r.onClose()})),{icon:!0,label:!1}),this.actionBar.setFocusable(!1)}};n=ke([ge(0,p.IInstantiationService)],n)}),define(se[846],oe([1,0,7,6,2,28,82]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UnthemedProductIconTheme=e.getIconsStyleSheet=void 0;function p(v){const b=new y.DisposableStore,a=b.add(new k.Emitter),i=(0,S.getIconRegistry)();return b.add(i.onDidChange(()=>a.fire())),v&&b.add(v.onDidProductIconThemeChange(()=>a.fire())),{dispose:()=>b.dispose(),onDidChange:a.event,getCSS(){const n=v?v.getProductIconTheme():new _,t={},r=f=>{const c=n.getIcon(f);if(!c)return;const d=c.font;return d?(t[d.id]=d.definition,`.codicon-${f.id}:before { content: '${c.fontCharacter}'; font-family: ${(0,L.asCSSPropertyValue)(d.id)}; }`):`.codicon-${f.id}:before { content: '${c.fontCharacter}'; }`},u=[];for(const f of i.getIcons()){const c=r(f);c&&u.push(c)}for(const f in t){const c=t[f],d=c.weight?`font-weight: ${c.weight};`:"",s=c.style?`font-style: ${c.style};`:"",l=c.src.map(o=>`${(0,L.asCSSUrl)(o.location)} format('${o.format}')`).join(", ");u.push(`@font-face { src: ${l}; font-family: ${(0,L.asCSSPropertyValue)(f)};${d}${s} font-display: block; }`)}return u.join(`
+`)}}}e.getIconsStyleSheet=p;class _{getIcon(b){const a=(0,S.getIconRegistry)();let i=b.defaults;for(;E.ThemeIcon.isThemeIcon(i);){const n=a.getIcon(i.id);if(!n)return;i=n.defaults}return i}}e.UnthemedProductIconTheme=_}),define(se[89],oe([1,0]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isDark=e.isHighContrast=e.ColorScheme=void 0;var L;(function(E){E.DARK="dark",E.LIGHT="light",E.HIGH_CONTRAST_DARK="hcDark",E.HIGH_CONTRAST_LIGHT="hcLight"})(L||(e.ColorScheme=L={}));function k(E){return E===L.HIGH_CONTRAST_DARK||E===L.HIGH_CONTRAST_LIGHT}e.isHighContrast=k;function y(E){return E===L.DARK||E===L.HIGH_CONTRAST_DARK}e.isDark=y}),define(se[255],oe([1,0,54,40,17,494,148,155,120,89,36]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getColumnOfNodeOffset=e.ViewLine=e.ViewLineOptions=void 0;const a=function(){return y.isNative?!0:!(y.isLinux||L.isFirefox||L.isSafari)}();let i=!0;class n{constructor(g,h){this.themeType=h;const m=g.options,C=m.get(50);m.get(38)==="off"?this.renderWhitespace=m.get(98):this.renderWhitespace="none",this.renderControlCharacters=m.get(93),this.spaceWidth=C.spaceWidth,this.middotWidth=C.middotWidth,this.wsmiddotWidth=C.wsmiddotWidth,this.useMonospaceOptimizations=C.isMonospace&&!m.get(33),this.canUseHalfwidthRightwardsArrow=C.canUseHalfwidthRightwardsArrow,this.lineHeight=m.get(66),this.stopRenderingLineAfter=m.get(116),this.fontLigatures=m.get(51)}equals(g){return this.themeType===g.themeType&&this.renderWhitespace===g.renderWhitespace&&this.renderControlCharacters===g.renderControlCharacters&&this.spaceWidth===g.spaceWidth&&this.middotWidth===g.middotWidth&&this.wsmiddotWidth===g.wsmiddotWidth&&this.useMonospaceOptimizations===g.useMonospaceOptimizations&&this.canUseHalfwidthRightwardsArrow===g.canUseHalfwidthRightwardsArrow&&this.lineHeight===g.lineHeight&&this.stopRenderingLineAfter===g.stopRenderingLineAfter&&this.fontLigatures===g.fontLigatures}}e.ViewLineOptions=n;class t{constructor(g){this._options=g,this._isMaybeInvalid=!0,this._renderedViewLine=null}getDomNode(){return this._renderedViewLine&&this._renderedViewLine.domNode?this._renderedViewLine.domNode.domNode:null}setDomNode(g){if(this._renderedViewLine)this._renderedViewLine.domNode=(0,k.createFastDomNode)(g);else throw new Error("I have no rendered view line to set the dom node to...")}onContentChanged(){this._isMaybeInvalid=!0}onTokensChanged(){this._isMaybeInvalid=!0}onDecorationsChanged(){this._isMaybeInvalid=!0}onOptionsChanged(g){this._isMaybeInvalid=!0,this._options=g}onSelectionChanged(){return(0,v.isHighContrast)(this._options.themeType)||this._options.renderWhitespace==="selection"?(this._isMaybeInvalid=!0,!0):!1}renderLine(g,h,m,C){if(this._isMaybeInvalid===!1)return!1;this._isMaybeInvalid=!1;const w=m.getViewLineRenderingData(g),D=this._options,I=p.LineDecoration.filter(w.inlineDecorations,g,w.minColumn,w.maxColumn);let T=null;if((0,v.isHighContrast)(D.themeType)||this._options.renderWhitespace==="selection"){const M=m.selections;for(const R of M){if(R.endLineNumber<g||R.startLineNumber>g)continue;const x=R.startLineNumber===g?R.startColumn:w.minColumn,O=R.endLineNumber===g?R.endColumn:w.maxColumn;x<O&&((0,v.isHighContrast)(D.themeType)&&I.push(new p.LineDecoration(x,O,"inline-selected-text",0)),this._options.renderWhitespace==="selection"&&(T||(T=[]),T.push(new _.LineRange(x-1,O-1))))}}const A=new _.RenderLineInput(D.useMonospaceOptimizations,D.canUseHalfwidthRightwardsArrow,w.content,w.continuesWithWrappedLine,w.isBasicASCII,w.containsRTL,w.minColumn-1,w.tokens,I,w.tabSize,w.startVisibleColumn,D.spaceWidth,D.middotWidth,D.wsmiddotWidth,D.stopRenderingLineAfter,D.renderWhitespace,D.renderControlCharacters,D.fontLigatures!==b.EditorFontLigatures.OFF,T);if(this._renderedViewLine&&this._renderedViewLine.input.equals(A))return!1;C.appendString('<div style="top:'),C.appendString(String(h)),C.appendString("px;height:"),C.appendString(String(this._options.lineHeight)),C.appendString('px;" class="'),C.appendString(t.CLASS_NAME),C.appendString('">');const P=(0,_.renderViewLine)(A,C);C.appendString("</div>");let N=null;return i&&a&&w.isBasicASCII&&D.useMonospaceOptimizations&&P.containsForeignElements===0&&(N=new r(this._renderedViewLine?this._renderedViewLine.domNode:null,A,P.characterMapping)),N||(N=c(this._renderedViewLine?this._renderedViewLine.domNode:null,A,P.characterMapping,P.containsRTL,P.containsForeignElements)),this._renderedViewLine=N,!0}layoutLine(g,h){this._renderedViewLine&&this._renderedViewLine.domNode&&(this._renderedViewLine.domNode.setTop(h),this._renderedViewLine.domNode.setHeight(this._options.lineHeight))}getWidth(g){return this._renderedViewLine?this._renderedViewLine.getWidth(g):0}getWidthIsFast(){return this._renderedViewLine?this._renderedViewLine.getWidthIsFast():!0}needsMonospaceFontCheck(){return this._renderedViewLine?this._renderedViewLine instanceof r:!1}monospaceAssumptionsAreValid(){return this._renderedViewLine&&this._renderedViewLine instanceof r?this._renderedViewLine.monospaceAssumptionsAreValid():i}onMonospaceAssumptionsInvalidated(){this._renderedViewLine&&this._renderedViewLine instanceof r&&(this._renderedViewLine=this._renderedViewLine.toSlowRenderedLine())}getVisibleRangesForRange(g,h,m,C){if(!this._renderedViewLine)return null;h=Math.min(this._renderedViewLine.input.lineContent.length+1,Math.max(1,h)),m=Math.min(this._renderedViewLine.input.lineContent.length+1,Math.max(1,m));const w=this._renderedViewLine.input.stopRenderingLineAfter;if(w!==-1&&h>w+1&&m>w+1)return new S.VisibleRanges(!0,[new S.FloatHorizontalRange(this.getWidth(C),0)]);w!==-1&&h>w+1&&(h=w+1),w!==-1&&m>w+1&&(m=w+1);const D=this._renderedViewLine.getVisibleRangesForRange(g,h,m,C);return D&&D.length>0?new S.VisibleRanges(!1,D):null}getColumnOfNodeOffset(g,h){return this._renderedViewLine?this._renderedViewLine.getColumnOfNodeOffset(g,h):1}}e.ViewLine=t,t.CLASS_NAME="view-line";class r{constructor(g,h,m){this._cachedWidth=-1,this.domNode=g,this.input=h;const C=Math.floor(h.lineContent.length/300);if(C>0){this._keyColumnPixelOffsetCache=new Float32Array(C);for(let w=0;w<C;w++)this._keyColumnPixelOffsetCache[w]=-1}else this._keyColumnPixelOffsetCache=null;this._characterMapping=m,this._charWidth=h.spaceWidth}getWidth(g){if(!this.domNode||this.input.lineContent.length<300){const h=this._characterMapping.getHorizontalOffset(this._characterMapping.length);return Math.round(this._charWidth*h)}return this._cachedWidth===-1&&(this._cachedWidth=this._getReadingTarget(this.domNode).offsetWidth,g?.markDidDomLayout()),this._cachedWidth}getWidthIsFast(){return this.input.lineContent.length<300||this._cachedWidth!==-1}monospaceAssumptionsAreValid(){if(!this.domNode)return i;if(this.input.lineContent.length<300){const g=this.getWidth(null),h=this.domNode.domNode.firstChild.offsetWidth;Math.abs(g-h)>=2&&(console.warn("monospace assumptions have been violated, therefore disabling monospace optimizations!"),i=!1)}return i}toSlowRenderedLine(){return c(this.domNode,this.input,this._characterMapping,!1,0)}getVisibleRangesForRange(g,h,m,C){const w=this._getColumnPixelOffset(g,h,C),D=this._getColumnPixelOffset(g,m,C);return[new S.FloatHorizontalRange(w,D-w)]}_getColumnPixelOffset(g,h,m){if(h<=300){const A=this._characterMapping.getHorizontalOffset(h);return this._charWidth*A}const C=Math.floor((h-1)/300)-1,w=(C+1)*300+1;let D=-1;if(this._keyColumnPixelOffsetCache&&(D=this._keyColumnPixelOffsetCache[C],D===-1&&(D=this._actualReadPixelOffset(g,w,m),this._keyColumnPixelOffsetCache[C]=D)),D===-1){const A=this._characterMapping.getHorizontalOffset(h);return this._charWidth*A}const I=this._characterMapping.getHorizontalOffset(w),T=this._characterMapping.getHorizontalOffset(h);return D+this._charWidth*(T-I)}_getReadingTarget(g){return g.domNode.firstChild}_actualReadPixelOffset(g,h,m){if(!this.domNode)return-1;const C=this._characterMapping.getDomPosition(h),w=E.RangeUtil.readHorizontalRanges(this._getReadingTarget(this.domNode),C.partIndex,C.charIndex,C.partIndex,C.charIndex,m);return!w||w.length===0?-1:w[0].left}getColumnOfNodeOffset(g,h){return l(this._characterMapping,g,h)}}class u{constructor(g,h,m,C,w){if(this.domNode=g,this.input=h,this._characterMapping=m,this._isWhitespaceOnly=/^\s*$/.test(h.lineContent),this._containsForeignElements=w,this._cachedWidth=-1,this._pixelOffsetCache=null,!C||this._characterMapping.length===0){this._pixelOffsetCache=new Float32Array(Math.max(2,this._characterMapping.length+1));for(let D=0,I=this._characterMapping.length;D<=I;D++)this._pixelOffsetCache[D]=-1}}_getReadingTarget(g){return g.domNode.firstChild}getWidth(g){return this.domNode?(this._cachedWidth===-1&&(this._cachedWidth=this._getReadingTarget(this.domNode).offsetWidth,g?.markDidDomLayout()),this._cachedWidth):0}getWidthIsFast(){return this._cachedWidth!==-1}getVisibleRangesForRange(g,h,m,C){if(!this.domNode)return null;if(this._pixelOffsetCache!==null){const w=this._readPixelOffset(this.domNode,g,h,C);if(w===-1)return null;const D=this._readPixelOffset(this.domNode,g,m,C);return D===-1?null:[new S.FloatHorizontalRange(w,D-w)]}return this._readVisibleRangesForRange(this.domNode,g,h,m,C)}_readVisibleRangesForRange(g,h,m,C,w){if(m===C){const D=this._readPixelOffset(g,h,m,w);return D===-1?null:[new S.FloatHorizontalRange(D,0)]}else return this._readRawVisibleRangesForRange(g,m,C,w)}_readPixelOffset(g,h,m,C){if(this._characterMapping.length===0){if(this._containsForeignElements===0||this._containsForeignElements===2)return 0;if(this._containsForeignElements===1)return this.getWidth(C);const w=this._getReadingTarget(g);return w.firstChild?(C.markDidDomLayout(),w.firstChild.offsetWidth):0}if(this._pixelOffsetCache!==null){const w=this._pixelOffsetCache[m];if(w!==-1)return w;const D=this._actualReadPixelOffset(g,h,m,C);return this._pixelOffsetCache[m]=D,D}return this._actualReadPixelOffset(g,h,m,C)}_actualReadPixelOffset(g,h,m,C){if(this._characterMapping.length===0){const T=E.RangeUtil.readHorizontalRanges(this._getReadingTarget(g),0,0,0,0,C);return!T||T.length===0?-1:T[0].left}if(m===this._characterMapping.length&&this._isWhitespaceOnly&&this._containsForeignElements===0)return this.getWidth(C);const w=this._characterMapping.getDomPosition(m),D=E.RangeUtil.readHorizontalRanges(this._getReadingTarget(g),w.partIndex,w.charIndex,w.partIndex,w.charIndex,C);if(!D||D.length===0)return-1;const I=D[0].left;if(this.input.isBasicASCII){const T=this._characterMapping.getHorizontalOffset(m),A=Math.round(this.input.spaceWidth*T);if(Math.abs(A-I)<=1)return A}return I}_readRawVisibleRangesForRange(g,h,m,C){if(h===1&&m===this._characterMapping.length)return[new S.FloatHorizontalRange(0,this.getWidth(C))];const w=this._characterMapping.getDomPosition(h),D=this._characterMapping.getDomPosition(m);return E.RangeUtil.readHorizontalRanges(this._getReadingTarget(g),w.partIndex,w.charIndex,D.partIndex,D.charIndex,C)}getColumnOfNodeOffset(g,h){return l(this._characterMapping,g,h)}}class f extends u{_readVisibleRangesForRange(g,h,m,C,w){const D=super._readVisibleRangesForRange(g,h,m,C,w);if(!D||D.length===0||m===C||m===1&&C===this._characterMapping.length)return D;if(!this.input.containsRTL){const I=this._readPixelOffset(g,h,C,w);if(I!==-1){const T=D[D.length-1];T.left<I&&(T.width=I-T.left)}}return D}}const c=function(){return L.isWebKit?d:s}();function d(o,g,h,m,C){return new f(o,g,h,m,C)}function s(o,g,h,m,C){return new u(o,g,h,m,C)}function l(o,g,h){const m=g.textContent.length;let C=-1;for(;g;)g=g.previousSibling,C++;return o.getColumn(new _.DomPosition(C,h),m)}e.getColumnOfNodeOffset=l}),define(se[365],oe([1,0,167,56,255,10,5,85,7,282]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MouseTargetFactory=e.HitTestContext=e.MouseTarget=e.PointerHandlerLastRenderData=void 0;class b{constructor(m=null){this.hitTarget=m,this.type=0}}class a{constructor(m,C,w){this.position=m,this.spanNode=C,this.injectedText=w,this.type=1}}var i;(function(h){function m(C,w,D){const I=C.getPositionFromDOMInfo(w,D);return I?new a(I,w,null):new b(w)}h.createFromDOMInfo=m})(i||(i={}));class n{constructor(m,C){this.lastViewCursorsRenderData=m,this.lastTextareaPosition=C}}e.PointerHandlerLastRenderData=n;class t{static _deduceRage(m,C=null){return!C&&m?new S.Range(m.lineNumber,m.column,m.lineNumber,m.column):C??null}static createUnknown(m,C,w){return{type:0,element:m,mouseColumn:C,position:w,range:this._deduceRage(w)}}static createTextarea(m,C){return{type:1,element:m,mouseColumn:C,position:null,range:null}}static createMargin(m,C,w,D,I,T){return{type:m,element:C,mouseColumn:w,position:D,range:I,detail:T}}static createViewZone(m,C,w,D,I){return{type:m,element:C,mouseColumn:w,position:D,range:this._deduceRage(D),detail:I}}static createContentText(m,C,w,D,I){return{type:6,element:m,mouseColumn:C,position:w,range:this._deduceRage(w,D),detail:I}}static createContentEmpty(m,C,w,D){return{type:7,element:m,mouseColumn:C,position:w,range:this._deduceRage(w),detail:D}}static createContentWidget(m,C,w){return{type:9,element:m,mouseColumn:C,position:null,range:null,detail:w}}static createScrollbar(m,C,w){return{type:11,element:m,mouseColumn:C,position:w,range:this._deduceRage(w)}}static createOverlayWidget(m,C,w){return{type:12,element:m,mouseColumn:C,position:null,range:null,detail:w}}static createOutsideEditor(m,C,w,D){return{type:13,element:null,mouseColumn:m,position:C,range:this._deduceRage(C),outsidePosition:w,outsideDistance:D}}static _typeToString(m){return m===1?"TEXTAREA":m===2?"GUTTER_GLYPH_MARGIN":m===3?"GUTTER_LINE_NUMBERS":m===4?"GUTTER_LINE_DECORATIONS":m===5?"GUTTER_VIEW_ZONE":m===6?"CONTENT_TEXT":m===7?"CONTENT_EMPTY":m===8?"CONTENT_VIEW_ZONE":m===9?"CONTENT_WIDGET":m===10?"OVERVIEW_RULER":m===11?"SCROLLBAR":m===12?"OVERLAY_WIDGET":"UNKNOWN"}static toString(m){return this._typeToString(m.type)+": "+m.position+" - "+m.range+" - "+JSON.stringify(m.detail)}}e.MouseTarget=t;class r{static isTextArea(m){return m.length===2&&m[0]===3&&m[1]===7}static isChildOfViewLines(m){return m.length>=4&&m[0]===3&&m[3]===8}static isStrictChildOfViewLines(m){return m.length>4&&m[0]===3&&m[3]===8}static isChildOfScrollableElement(m){return m.length>=2&&m[0]===3&&m[1]===6}static isChildOfMinimap(m){return m.length>=2&&m[0]===3&&m[1]===9}static isChildOfContentWidgets(m){return m.length>=4&&m[0]===3&&m[3]===1}static isChildOfOverflowGuard(m){return m.length>=1&&m[0]===3}static isChildOfOverflowingContentWidgets(m){return m.length>=1&&m[0]===2}static isChildOfOverlayWidgets(m){return m.length>=2&&m[0]===3&&m[1]===4}static isChildOfOverflowingOverlayWidgets(m){return m.length>=1&&m[0]===5}}class u{constructor(m,C,w){this.viewModel=m.viewModel;const D=m.configuration.options;this.layoutInfo=D.get(143),this.viewDomNode=C.viewDomNode,this.lineHeight=D.get(66),this.stickyTabStops=D.get(115),this.typicalHalfwidthCharacterWidth=D.get(50).typicalHalfwidthCharacterWidth,this.lastRenderData=w,this._context=m,this._viewHelper=C}getZoneAtCoord(m){return u.getZoneAtCoord(this._context,m)}static getZoneAtCoord(m,C){const w=m.viewLayout.getWhitespaceAtVerticalOffset(C);if(w){const D=w.verticalOffset+w.height/2,I=m.viewModel.getLineCount();let T=null,A,P=null;return w.afterLineNumber!==I&&(P=new E.Position(w.afterLineNumber+1,1)),w.afterLineNumber>0&&(T=new E.Position(w.afterLineNumber,m.viewModel.getLineMaxColumn(w.afterLineNumber))),P===null?A=T:T===null?A=P:C<D?A=T:A=P,{viewZoneId:w.id,afterLineNumber:w.afterLineNumber,positionBefore:T,positionAfter:P,position:A}}return null}getFullLineRangeAtCoord(m){if(this._context.viewLayout.isAfterLines(m)){const D=this._context.viewModel.getLineCount(),I=this._context.viewModel.getLineMaxColumn(D);return{range:new S.Range(D,I,D,I),isAfterLines:!0}}const C=this._context.viewLayout.getLineNumberAtVerticalOffset(m),w=this._context.viewModel.getLineMaxColumn(C);return{range:new S.Range(C,1,C,w),isAfterLines:!1}}getLineNumberAtVerticalOffset(m){return this._context.viewLayout.getLineNumberAtVerticalOffset(m)}isAfterLines(m){return this._context.viewLayout.isAfterLines(m)}isInTopPadding(m){return this._context.viewLayout.isInTopPadding(m)}isInBottomPadding(m){return this._context.viewLayout.isInBottomPadding(m)}getVerticalOffsetForLineNumber(m){return this._context.viewLayout.getVerticalOffsetForLineNumber(m)}findAttribute(m,C){return u._findAttribute(m,C,this._viewHelper.viewDomNode)}static _findAttribute(m,C,w){for(;m&&m!==m.ownerDocument.body;){if(m.hasAttribute&&m.hasAttribute(C))return m.getAttribute(C);if(m===w)return null;m=m.parentNode}return null}getLineWidth(m){return this._viewHelper.getLineWidth(m)}visibleRangeForPosition(m,C){return this._viewHelper.visibleRangeForPosition(m,C)}getPositionFromDOMInfo(m,C){return this._viewHelper.getPositionFromDOMInfo(m,C)}getCurrentScrollTop(){return this._context.viewLayout.getCurrentScrollTop()}getCurrentScrollLeft(){return this._context.viewLayout.getCurrentScrollLeft()}}e.HitTestContext=u;class f{constructor(m,C,w,D){this.editorPos=C,this.pos=w,this.relativePos=D,this.mouseVerticalOffset=Math.max(0,m.getCurrentScrollTop()+this.relativePos.y),this.mouseContentHorizontalOffset=m.getCurrentScrollLeft()+this.relativePos.x-m.layoutInfo.contentLeft,this.isInMarginArea=this.relativePos.x<m.layoutInfo.contentLeft&&this.relativePos.x>=m.layoutInfo.glyphMarginLeft,this.isInContentArea=!this.isInMarginArea,this.mouseColumn=Math.max(0,l._getMouseColumn(this.mouseContentHorizontalOffset,m.typicalHalfwidthCharacterWidth))}}class c extends f{constructor(m,C,w,D,I){super(m,C,w,D),this._ctx=m,I?(this.target=I,this.targetPath=k.PartFingerprints.collect(I,m.viewDomNode)):(this.target=null,this.targetPath=new Uint8Array(0))}toString(){return`pos(${this.pos.x},${this.pos.y}), editorPos(${this.editorPos.x},${this.editorPos.y}), relativePos(${this.relativePos.x},${this.relativePos.y}), mouseVerticalOffset: ${this.mouseVerticalOffset}, mouseContentHorizontalOffset: ${this.mouseContentHorizontalOffset}
+	target: ${this.target?this.target.outerHTML:null}`}_getMouseColumn(m=null){return m&&m.column<this._ctx.viewModel.getLineMaxColumn(m.lineNumber)?p.CursorColumns.visibleColumnFromColumn(this._ctx.viewModel.getLineContent(m.lineNumber),m.column,this._ctx.viewModel.model.getOptions().tabSize)+1:this.mouseColumn}fulfillUnknown(m=null){return t.createUnknown(this.target,this._getMouseColumn(m),m)}fulfillTextarea(){return t.createTextarea(this.target,this._getMouseColumn())}fulfillMargin(m,C,w,D){return t.createMargin(m,this.target,this._getMouseColumn(C),C,w,D)}fulfillViewZone(m,C,w){return t.createViewZone(m,this.target,this._getMouseColumn(C),C,w)}fulfillContentText(m,C,w){return t.createContentText(this.target,this._getMouseColumn(m),m,C,w)}fulfillContentEmpty(m,C){return t.createContentEmpty(this.target,this._getMouseColumn(m),m,C)}fulfillContentWidget(m){return t.createContentWidget(this.target,this._getMouseColumn(),m)}fulfillScrollbar(m){return t.createScrollbar(this.target,this._getMouseColumn(m),m)}fulfillOverlayWidget(m){return t.createOverlayWidget(this.target,this._getMouseColumn(),m)}withTarget(m){return new c(this._ctx,this.editorPos,this.pos,this.relativePos,m)}}const d={isAfterLines:!0};function s(h){return{isAfterLines:!1,horizontalDistanceToText:h}}class l{constructor(m,C){this._context=m,this._viewHelper=C}mouseTargetIsWidget(m){const C=m.target,w=k.PartFingerprints.collect(C,this._viewHelper.viewDomNode);return!!(r.isChildOfContentWidgets(w)||r.isChildOfOverflowingContentWidgets(w)||r.isChildOfOverlayWidgets(w)||r.isChildOfOverflowingOverlayWidgets(w))}createMouseTarget(m,C,w,D,I){const T=new u(this._context,this._viewHelper,m),A=new c(T,C,w,D,I);try{const P=l._createMouseTarget(T,A,!1);if(P.type===6&&T.stickyTabStops&&P.position!==null){const N=l._snapToSoftTabBoundary(P.position,T.viewModel),M=S.Range.fromPositions(N,N).plusRange(P.range);return A.fulfillContentText(N,M,P.detail)}return P}catch{return A.fulfillUnknown()}}static _createMouseTarget(m,C,w){if(C.target===null){if(w)return C.fulfillUnknown();const T=l._doHitTest(m,C);return T.type===1?l.createMouseTargetFromHitTestPosition(m,C,T.spanNode,T.position,T.injectedText):this._createMouseTarget(m,C.withTarget(T.hitTarget),!0)}const D=C;let I=null;return!r.isChildOfOverflowGuard(C.targetPath)&&!r.isChildOfOverflowingContentWidgets(C.targetPath)&&!r.isChildOfOverflowingOverlayWidgets(C.targetPath)&&(I=I||C.fulfillUnknown()),I=I||l._hitTestContentWidget(m,D),I=I||l._hitTestOverlayWidget(m,D),I=I||l._hitTestMinimap(m,D),I=I||l._hitTestScrollbarSlider(m,D),I=I||l._hitTestViewZone(m,D),I=I||l._hitTestMargin(m,D),I=I||l._hitTestViewCursor(m,D),I=I||l._hitTestTextArea(m,D),I=I||l._hitTestViewLines(m,D,w),I=I||l._hitTestScrollbar(m,D),I||C.fulfillUnknown()}static _hitTestContentWidget(m,C){if(r.isChildOfContentWidgets(C.targetPath)||r.isChildOfOverflowingContentWidgets(C.targetPath)){const w=m.findAttribute(C.target,"widgetId");return w?C.fulfillContentWidget(w):C.fulfillUnknown()}return null}static _hitTestOverlayWidget(m,C){if(r.isChildOfOverlayWidgets(C.targetPath)||r.isChildOfOverflowingOverlayWidgets(C.targetPath)){const w=m.findAttribute(C.target,"widgetId");return w?C.fulfillOverlayWidget(w):C.fulfillUnknown()}return null}static _hitTestViewCursor(m,C){if(C.target){const w=m.lastRenderData.lastViewCursorsRenderData;for(const D of w)if(C.target===D.domNode)return C.fulfillContentText(D.position,null,{mightBeForeignElement:!1,injectedText:null})}if(C.isInContentArea){const w=m.lastRenderData.lastViewCursorsRenderData,D=C.mouseContentHorizontalOffset,I=C.mouseVerticalOffset;for(const T of w){if(D<T.contentLeft||D>T.contentLeft+T.width)continue;const A=m.getVerticalOffsetForLineNumber(T.position.lineNumber);if(A<=I&&I<=A+T.height)return C.fulfillContentText(T.position,null,{mightBeForeignElement:!1,injectedText:null})}}return null}static _hitTestViewZone(m,C){const w=m.getZoneAtCoord(C.mouseVerticalOffset);if(w){const D=C.isInContentArea?8:5;return C.fulfillViewZone(D,w.position,w)}return null}static _hitTestTextArea(m,C){return r.isTextArea(C.targetPath)?m.lastRenderData.lastTextareaPosition?C.fulfillContentText(m.lastRenderData.lastTextareaPosition,null,{mightBeForeignElement:!1,injectedText:null}):C.fulfillTextarea():null}static _hitTestMargin(m,C){if(C.isInMarginArea){const w=m.getFullLineRangeAtCoord(C.mouseVerticalOffset),D=w.range.getStartPosition();let I=Math.abs(C.relativePos.x);const T={isAfterLines:w.isAfterLines,glyphMarginLeft:m.layoutInfo.glyphMarginLeft,glyphMarginWidth:m.layoutInfo.glyphMarginWidth,lineNumbersWidth:m.layoutInfo.lineNumbersWidth,offsetX:I};if(I-=m.layoutInfo.glyphMarginLeft,I<=m.layoutInfo.glyphMarginWidth){const A=m.viewModel.coordinatesConverter.convertViewPositionToModelPosition(w.range.getStartPosition()),P=m.viewModel.glyphLanes.getLanesAtLine(A.lineNumber);return T.glyphMarginLane=P[Math.floor(I/m.lineHeight)],C.fulfillMargin(2,D,w.range,T)}return I-=m.layoutInfo.glyphMarginWidth,I<=m.layoutInfo.lineNumbersWidth?C.fulfillMargin(3,D,w.range,T):(I-=m.layoutInfo.lineNumbersWidth,C.fulfillMargin(4,D,w.range,T))}return null}static _hitTestViewLines(m,C,w){if(!r.isChildOfViewLines(C.targetPath))return null;if(m.isInTopPadding(C.mouseVerticalOffset))return C.fulfillContentEmpty(new E.Position(1,1),d);if(m.isAfterLines(C.mouseVerticalOffset)||m.isInBottomPadding(C.mouseVerticalOffset)){const I=m.viewModel.getLineCount(),T=m.viewModel.getLineMaxColumn(I);return C.fulfillContentEmpty(new E.Position(I,T),d)}if(w){if(r.isStrictChildOfViewLines(C.targetPath)){const I=m.getLineNumberAtVerticalOffset(C.mouseVerticalOffset);if(m.viewModel.getLineLength(I)===0){const A=m.getLineWidth(I),P=s(C.mouseContentHorizontalOffset-A);return C.fulfillContentEmpty(new E.Position(I,1),P)}const T=m.getLineWidth(I);if(C.mouseContentHorizontalOffset>=T){const A=s(C.mouseContentHorizontalOffset-T),P=new E.Position(I,m.viewModel.getLineMaxColumn(I));return C.fulfillContentEmpty(P,A)}}return C.fulfillUnknown()}const D=l._doHitTest(m,C);return D.type===1?l.createMouseTargetFromHitTestPosition(m,C,D.spanNode,D.position,D.injectedText):this._createMouseTarget(m,C.withTarget(D.hitTarget),!0)}static _hitTestMinimap(m,C){if(r.isChildOfMinimap(C.targetPath)){const w=m.getLineNumberAtVerticalOffset(C.mouseVerticalOffset),D=m.viewModel.getLineMaxColumn(w);return C.fulfillScrollbar(new E.Position(w,D))}return null}static _hitTestScrollbarSlider(m,C){if(r.isChildOfScrollableElement(C.targetPath)&&C.target&&C.target.nodeType===1){const w=C.target.className;if(w&&/\b(slider|scrollbar)\b/.test(w)){const D=m.getLineNumberAtVerticalOffset(C.mouseVerticalOffset),I=m.viewModel.getLineMaxColumn(D);return C.fulfillScrollbar(new E.Position(D,I))}}return null}static _hitTestScrollbar(m,C){if(r.isChildOfScrollableElement(C.targetPath)){const w=m.getLineNumberAtVerticalOffset(C.mouseVerticalOffset),D=m.viewModel.getLineMaxColumn(w);return C.fulfillScrollbar(new E.Position(w,D))}return null}getMouseColumn(m){const C=this._context.configuration.options,w=C.get(143),D=this._context.viewLayout.getCurrentScrollLeft()+m.x-w.contentLeft;return l._getMouseColumn(D,C.get(50).typicalHalfwidthCharacterWidth)}static _getMouseColumn(m,C){return m<0?1:Math.round(m/C)+1}static createMouseTargetFromHitTestPosition(m,C,w,D,I){const T=D.lineNumber,A=D.column,P=m.getLineWidth(T);if(C.mouseContentHorizontalOffset>P){const K=s(C.mouseContentHorizontalOffset-P);return C.fulfillContentEmpty(D,K)}const N=m.visibleRangeForPosition(T,A);if(!N)return C.fulfillUnknown(D);const M=N.left;if(Math.abs(C.mouseContentHorizontalOffset-M)<1)return C.fulfillContentText(D,null,{mightBeForeignElement:!!I,injectedText:I});const R=[];if(R.push({offset:N.left,column:A}),A>1){const K=m.visibleRangeForPosition(T,A-1);K&&R.push({offset:K.left,column:A-1})}const x=m.viewModel.getLineMaxColumn(T);if(A<x){const K=m.visibleRangeForPosition(T,A+1);K&&R.push({offset:K.left,column:A+1})}R.sort((K,F)=>K.offset-F.offset);const O=C.pos.toClientCoordinates(_.getWindow(m.viewDomNode)),B=w.getBoundingClientRect(),W=B.left<=O.clientX&&O.clientX<=B.right;let V=null;for(let K=1;K<R.length;K++){const F=R[K-1],q=R[K];if(F.offset<=C.mouseContentHorizontalOffset&&C.mouseContentHorizontalOffset<=q.offset){V=new S.Range(T,F.column,T,q.column);const ie=Math.abs(F.offset-C.mouseContentHorizontalOffset),ae=Math.abs(q.offset-C.mouseContentHorizontalOffset);D=ie<ae?new E.Position(T,F.column):new E.Position(T,q.column);break}}return C.fulfillContentText(D,V,{mightBeForeignElement:!W||!!I,injectedText:I})}static _doHitTestWithCaretRangeFromPoint(m,C){const w=m.getLineNumberAtVerticalOffset(C.mouseVerticalOffset),D=m.getVerticalOffsetForLineNumber(w),I=D+m.lineHeight;if(!(w===m.viewModel.getLineCount()&&C.mouseVerticalOffset>I)){const A=Math.floor((D+I)/2);let P=C.pos.y+(A-C.mouseVerticalOffset);P<=C.editorPos.y&&(P=C.editorPos.y+1),P>=C.editorPos.y+C.editorPos.height&&(P=C.editorPos.y+C.editorPos.height-1);const N=new L.PageCoordinates(C.pos.x,P),M=this._actualDoHitTestWithCaretRangeFromPoint(m,N.toClientCoordinates(_.getWindow(m.viewDomNode)));if(M.type===1)return M}return this._actualDoHitTestWithCaretRangeFromPoint(m,C.pos.toClientCoordinates(_.getWindow(m.viewDomNode)))}static _actualDoHitTestWithCaretRangeFromPoint(m,C){const w=_.getShadowRoot(m.viewDomNode);let D;if(w?typeof w.caretRangeFromPoint>"u"?D=o(w,C.clientX,C.clientY):D=w.caretRangeFromPoint(C.clientX,C.clientY):D=m.viewDomNode.ownerDocument.caretRangeFromPoint(C.clientX,C.clientY),!D||!D.startContainer)return new b;const I=D.startContainer;if(I.nodeType===I.TEXT_NODE){const T=I.parentNode,A=T?T.parentNode:null,P=A?A.parentNode:null;return(P&&P.nodeType===P.ELEMENT_NODE?P.className:null)===y.ViewLine.CLASS_NAME?i.createFromDOMInfo(m,T,D.startOffset):new b(I.parentNode)}else if(I.nodeType===I.ELEMENT_NODE){const T=I.parentNode,A=T?T.parentNode:null;return(A&&A.nodeType===A.ELEMENT_NODE?A.className:null)===y.ViewLine.CLASS_NAME?i.createFromDOMInfo(m,I,I.textContent.length):new b(I)}return new b}static _doHitTestWithCaretPositionFromPoint(m,C){const w=m.viewDomNode.ownerDocument.caretPositionFromPoint(C.clientX,C.clientY);if(w.offsetNode.nodeType===w.offsetNode.TEXT_NODE){const D=w.offsetNode.parentNode,I=D?D.parentNode:null,T=I?I.parentNode:null;return(T&&T.nodeType===T.ELEMENT_NODE?T.className:null)===y.ViewLine.CLASS_NAME?i.createFromDOMInfo(m,w.offsetNode.parentNode,w.offset):new b(w.offsetNode.parentNode)}if(w.offsetNode.nodeType===w.offsetNode.ELEMENT_NODE){const D=w.offsetNode.parentNode,I=D&&D.nodeType===D.ELEMENT_NODE?D.className:null,T=D?D.parentNode:null,A=T&&T.nodeType===T.ELEMENT_NODE?T.className:null;if(I===y.ViewLine.CLASS_NAME){const P=w.offsetNode.childNodes[Math.min(w.offset,w.offsetNode.childNodes.length-1)];if(P)return i.createFromDOMInfo(m,P,0)}else if(A===y.ViewLine.CLASS_NAME)return i.createFromDOMInfo(m,w.offsetNode,0)}return new b(w.offsetNode)}static _snapToSoftTabBoundary(m,C){const w=C.getLineContent(m.lineNumber),{tabSize:D}=C.model.getOptions(),I=v.AtomicTabMoveOperations.atomicPosition(w,m.column-1,D,2);return I!==-1?new E.Position(m.lineNumber,I+1):m}static _doHitTest(m,C){let w=new b;if(typeof m.viewDomNode.ownerDocument.caretRangeFromPoint=="function"?w=this._doHitTestWithCaretRangeFromPoint(m,C):m.viewDomNode.ownerDocument.caretPositionFromPoint&&(w=this._doHitTestWithCaretPositionFromPoint(m,C.pos.toClientCoordinates(_.getWindow(m.viewDomNode)))),w.type===1){const D=m.viewModel.getInjectedTextAt(w.position),I=m.viewModel.normalizePosition(w.position,2);(D||!I.equals(w.position))&&(w=new a(I,w.spanNode,D))}return w}}e.MouseTargetFactory=l;function o(h,m,C){const w=document.createRange();let D=h.elementFromPoint(m,C);if(D!==null){for(;D&&D.firstChild&&D.firstChild.nodeType!==D.firstChild.TEXT_NODE&&D.lastChild&&D.lastChild.firstChild;)D=D.lastChild;const I=D.getBoundingClientRect(),T=_.getWindow(D),A=T.getComputedStyle(D,null).getPropertyValue("font-style"),P=T.getComputedStyle(D,null).getPropertyValue("font-variant"),N=T.getComputedStyle(D,null).getPropertyValue("font-weight"),M=T.getComputedStyle(D,null).getPropertyValue("font-size"),R=T.getComputedStyle(D,null).getPropertyValue("line-height"),x=T.getComputedStyle(D,null).getPropertyValue("font-family"),O=`${A} ${P} ${N} ${M}/${R} ${x}`,B=D.innerText;let W=I.left,V=0,K;if(m>I.left+I.width)V=B.length;else{const F=g.getInstance();for(let q=0;q<B.length+1;q++){if(K=F.getCharWidth(B.charAt(q),O)/2,W+=K,m<W){V=q;break}W+=K}}w.setStart(D.firstChild,V),w.setEnd(D.firstChild,V)}return w}class g{static getInstance(){return g._INSTANCE||(g._INSTANCE=new g),g._INSTANCE}constructor(){this._cache={},this._canvas=document.createElement("canvas")}getCharWidth(m,C){const w=m+C;if(this._cache[w])return this._cache[w];const D=this._canvas.getContext("2d");D.font=C;const T=D.measureText(m).width;return this._cache[w]=T,T}}g._INSTANCE=null}),define(se[847],oe([1,0,7,67,2,17,365,167,149,10,24,154,77]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MouseHandler=void 0;class n extends a.ViewEventHandler{constructor(d,s,l){super(),this._mouseLeaveMonitor=null,this._context=d,this.viewController=s,this.viewHelper=l,this.mouseTargetFactory=new S.MouseTargetFactory(this._context,l),this._mouseDownOperation=this._register(new t(this._context,this.viewController,this.viewHelper,this.mouseTargetFactory,(h,m)=>this._createMouseTarget(h,m),h=>this._getMouseColumn(h))),this.lastMouseLeaveTime=-1,this._height=this._context.configuration.options.get(143).height;const o=new p.EditorMouseEventFactory(this.viewHelper.viewDomNode);this._register(o.onContextMenu(this.viewHelper.viewDomNode,h=>this._onContextMenu(h,!0))),this._register(o.onMouseMove(this.viewHelper.viewDomNode,h=>{this._onMouseMove(h),this._mouseLeaveMonitor||(this._mouseLeaveMonitor=L.addDisposableListener(this.viewHelper.viewDomNode.ownerDocument,"mousemove",m=>{this.viewHelper.viewDomNode.contains(m.target)||this._onMouseLeave(new p.EditorMouseEvent(m,!1,this.viewHelper.viewDomNode))}))})),this._register(o.onMouseUp(this.viewHelper.viewDomNode,h=>this._onMouseUp(h))),this._register(o.onMouseLeave(this.viewHelper.viewDomNode,h=>this._onMouseLeave(h)));let g=0;this._register(o.onPointerDown(this.viewHelper.viewDomNode,(h,m)=>{g=m})),this._register(L.addDisposableListener(this.viewHelper.viewDomNode,L.EventType.POINTER_UP,h=>{this._mouseDownOperation.onPointerUp()})),this._register(o.onMouseDown(this.viewHelper.viewDomNode,h=>this._onMouseDown(h,g))),this._setupMouseWheelZoomListener(),this._context.addEventHandler(this)}_setupMouseWheelZoomListener(){const d=i.MouseWheelClassifier.INSTANCE;let s=0,l=_.EditorZoom.getZoomLevel(),o=!1,g=0;const h=C=>{if(this.viewController.emitMouseWheel(C),!this._context.configuration.options.get(75))return;const w=new k.StandardWheelEvent(C);if(d.acceptStandardWheelEvent(w),d.isPhysicalMouseWheel()){if(m(C)){const D=_.EditorZoom.getZoomLevel(),I=w.deltaY>0?1:-1;_.EditorZoom.setZoomLevel(D+I),w.preventDefault(),w.stopPropagation()}}else Date.now()-s>50&&(l=_.EditorZoom.getZoomLevel(),o=m(C),g=0),s=Date.now(),g+=w.deltaY,o&&(_.EditorZoom.setZoomLevel(l+g/5),w.preventDefault(),w.stopPropagation())};this._register(L.addDisposableListener(this.viewHelper.viewDomNode,L.EventType.MOUSE_WHEEL,h,{capture:!0,passive:!1}));function m(C){return E.isMacintosh?(C.metaKey||C.ctrlKey)&&!C.shiftKey&&!C.altKey:C.ctrlKey&&!C.metaKey&&!C.shiftKey&&!C.altKey}}dispose(){this._context.removeEventHandler(this),this._mouseLeaveMonitor&&(this._mouseLeaveMonitor.dispose(),this._mouseLeaveMonitor=null),super.dispose()}onConfigurationChanged(d){if(d.hasChanged(143)){const s=this._context.configuration.options.get(143).height;this._height!==s&&(this._height=s,this._mouseDownOperation.onHeightChanged())}return!1}onCursorStateChanged(d){return this._mouseDownOperation.onCursorStateChanged(d),!1}onFocusChanged(d){return!1}getTargetAtClientPoint(d,s){const o=new p.ClientCoordinates(d,s).toPageCoordinates(L.getWindow(this.viewHelper.viewDomNode)),g=(0,p.createEditorPagePosition)(this.viewHelper.viewDomNode);if(o.y<g.y||o.y>g.y+g.height||o.x<g.x||o.x>g.x+g.width)return null;const h=(0,p.createCoordinatesRelativeToEditor)(this.viewHelper.viewDomNode,g,o);return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(),g,o,h,null)}_createMouseTarget(d,s){let l=d.target;if(!this.viewHelper.viewDomNode.contains(l)){const o=L.getShadowRoot(this.viewHelper.viewDomNode);o&&(l=o.elementsFromPoint(d.posx,d.posy).find(g=>this.viewHelper.viewDomNode.contains(g)))}return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(),d.editorPos,d.pos,d.relativePos,s?l:null)}_getMouseColumn(d){return this.mouseTargetFactory.getMouseColumn(d.relativePos)}_onContextMenu(d,s){this.viewController.emitContextMenu({event:d,target:this._createMouseTarget(d,s)})}_onMouseMove(d){this.mouseTargetFactory.mouseTargetIsWidget(d)||d.preventDefault(),!(this._mouseDownOperation.isActive()||d.timestamp<this.lastMouseLeaveTime)&&this.viewController.emitMouseMove({event:d,target:this._createMouseTarget(d,!0)})}_onMouseLeave(d){this._mouseLeaveMonitor&&(this._mouseLeaveMonitor.dispose(),this._mouseLeaveMonitor=null),this.lastMouseLeaveTime=new Date().getTime(),this.viewController.emitMouseLeave({event:d,target:null})}_onMouseUp(d){this.viewController.emitMouseUp({event:d,target:this._createMouseTarget(d,!0)})}_onMouseDown(d,s){const l=this._createMouseTarget(d,!0),o=l.type===6||l.type===7,g=l.type===2||l.type===3||l.type===4,h=l.type===3,m=this._context.configuration.options.get(108),C=l.type===8||l.type===5,w=l.type===9;let D=d.leftButton||d.middleButton;E.isMacintosh&&d.leftButton&&d.ctrlKey&&(D=!1);const I=()=>{d.preventDefault(),this.viewHelper.focusTextArea()};if(D&&(o||h&&m))I(),this._mouseDownOperation.start(l.type,d,s);else if(g)d.preventDefault();else if(C){const T=l.detail;D&&this.viewHelper.shouldSuppressMouseDownOnViewZone(T.viewZoneId)&&(I(),this._mouseDownOperation.start(l.type,d,s),d.preventDefault())}else w&&this.viewHelper.shouldSuppressMouseDownOnWidget(l.detail)&&(I(),d.preventDefault());this.viewController.emitMouseDown({event:d,target:l})}}e.MouseHandler=n;class t extends y.Disposable{constructor(d,s,l,o,g,h){super(),this._context=d,this._viewController=s,this._viewHelper=l,this._mouseTargetFactory=o,this._createMouseTarget=g,this._getMouseColumn=h,this._mouseMoveMonitor=this._register(new p.GlobalEditorPointerMoveMonitor(this._viewHelper.viewDomNode)),this._topBottomDragScrolling=this._register(new r(this._context,this._viewHelper,this._mouseTargetFactory,(m,C,w)=>this._dispatchMouse(m,C,w))),this._mouseState=new f,this._currentSelection=new b.Selection(1,1,1,1),this._isActive=!1,this._lastMouseEvent=null}dispose(){super.dispose()}isActive(){return this._isActive}_onMouseDownThenMove(d){this._lastMouseEvent=d,this._mouseState.setModifiers(d);const s=this._findMousePosition(d,!1);s&&(this._mouseState.isDragAndDrop?this._viewController.emitMouseDrag({event:d,target:s}):s.type===13&&(s.outsidePosition==="above"||s.outsidePosition==="below")?this._topBottomDragScrolling.start(s,d):(this._topBottomDragScrolling.stop(),this._dispatchMouse(s,!0,1)))}start(d,s,l){this._lastMouseEvent=s,this._mouseState.setStartedOnLineNumbers(d===3),this._mouseState.setStartButtons(s),this._mouseState.setModifiers(s);const o=this._findMousePosition(s,!0);if(!o||!o.position)return;this._mouseState.trySetCount(s.detail,o.position),s.detail=this._mouseState.count;const g=this._context.configuration.options;if(!g.get(90)&&g.get(35)&&!g.get(22)&&!this._mouseState.altKey&&s.detail<2&&!this._isActive&&!this._currentSelection.isEmpty()&&o.type===6&&o.position&&this._currentSelection.containsPosition(o.position)){this._mouseState.isDragAndDrop=!0,this._isActive=!0,this._mouseMoveMonitor.startMonitoring(this._viewHelper.viewLinesDomNode,l,s.buttons,h=>this._onMouseDownThenMove(h),h=>{const m=this._findMousePosition(this._lastMouseEvent,!1);L.isKeyboardEvent(h)?this._viewController.emitMouseDropCanceled():this._viewController.emitMouseDrop({event:this._lastMouseEvent,target:m?this._createMouseTarget(this._lastMouseEvent,!0):null}),this._stop()});return}this._mouseState.isDragAndDrop=!1,this._dispatchMouse(o,s.shiftKey,1),this._isActive||(this._isActive=!0,this._mouseMoveMonitor.startMonitoring(this._viewHelper.viewLinesDomNode,l,s.buttons,h=>this._onMouseDownThenMove(h),()=>this._stop()))}_stop(){this._isActive=!1,this._topBottomDragScrolling.stop()}onHeightChanged(){this._mouseMoveMonitor.stopMonitoring()}onPointerUp(){this._mouseMoveMonitor.stopMonitoring()}onCursorStateChanged(d){this._currentSelection=d.selections[0]}_getPositionOutsideEditor(d){const s=d.editorPos,l=this._context.viewModel,o=this._context.viewLayout,g=this._getMouseColumn(d);if(d.posy<s.y){const m=s.y-d.posy,C=Math.max(o.getCurrentScrollTop()-m,0),w=S.HitTestContext.getZoneAtCoord(this._context,C);if(w){const I=this._helpPositionJumpOverViewZone(w);if(I)return S.MouseTarget.createOutsideEditor(g,I,"above",m)}const D=o.getLineNumberAtVerticalOffset(C);return S.MouseTarget.createOutsideEditor(g,new v.Position(D,1),"above",m)}if(d.posy>s.y+s.height){const m=d.posy-s.y-s.height,C=o.getCurrentScrollTop()+d.relativePos.y,w=S.HitTestContext.getZoneAtCoord(this._context,C);if(w){const I=this._helpPositionJumpOverViewZone(w);if(I)return S.MouseTarget.createOutsideEditor(g,I,"below",m)}const D=o.getLineNumberAtVerticalOffset(C);return S.MouseTarget.createOutsideEditor(g,new v.Position(D,l.getLineMaxColumn(D)),"below",m)}const h=o.getLineNumberAtVerticalOffset(o.getCurrentScrollTop()+d.relativePos.y);if(d.posx<s.x){const m=s.x-d.posx;return S.MouseTarget.createOutsideEditor(g,new v.Position(h,1),"left",m)}if(d.posx>s.x+s.width){const m=d.posx-s.x-s.width;return S.MouseTarget.createOutsideEditor(g,new v.Position(h,l.getLineMaxColumn(h)),"right",m)}return null}_findMousePosition(d,s){const l=this._getPositionOutsideEditor(d);if(l)return l;const o=this._createMouseTarget(d,s);if(!o.position)return null;if(o.type===8||o.type===5){const h=this._helpPositionJumpOverViewZone(o.detail);if(h)return S.MouseTarget.createViewZone(o.type,o.element,o.mouseColumn,h,o.detail)}return o}_helpPositionJumpOverViewZone(d){const s=new v.Position(this._currentSelection.selectionStartLineNumber,this._currentSelection.selectionStartColumn),l=d.positionBefore,o=d.positionAfter;return l&&o?l.isBefore(s)?l:o:null}_dispatchMouse(d,s,l){d.position&&this._viewController.dispatchMouse({position:d.position,mouseColumn:d.mouseColumn,startedOnLineNumbers:this._mouseState.startedOnLineNumbers,revealType:l,inSelectionMode:s,mouseDownCount:this._mouseState.count,altKey:this._mouseState.altKey,ctrlKey:this._mouseState.ctrlKey,metaKey:this._mouseState.metaKey,shiftKey:this._mouseState.shiftKey,leftButton:this._mouseState.leftButton,middleButton:this._mouseState.middleButton,onInjectedText:d.type===6&&d.detail.injectedText!==null})}}class r extends y.Disposable{constructor(d,s,l,o){super(),this._context=d,this._viewHelper=s,this._mouseTargetFactory=l,this._dispatchMouse=o,this._operation=null}dispose(){super.dispose(),this.stop()}start(d,s){this._operation?this._operation.setPosition(d,s):this._operation=new u(this._context,this._viewHelper,this._mouseTargetFactory,this._dispatchMouse,d,s)}stop(){this._operation&&(this._operation.dispose(),this._operation=null)}}class u extends y.Disposable{constructor(d,s,l,o,g,h){super(),this._context=d,this._viewHelper=s,this._mouseTargetFactory=l,this._dispatchMouse=o,this._position=g,this._mouseEvent=h,this._lastTime=Date.now(),this._animationFrameDisposable=L.scheduleAtNextAnimationFrame(L.getWindow(h.browserEvent),()=>this._execute())}dispose(){this._animationFrameDisposable.dispose(),super.dispose()}setPosition(d,s){this._position=d,this._mouseEvent=s}_tick(){const d=Date.now(),s=d-this._lastTime;return this._lastTime=d,s}_getScrollSpeed(){const d=this._context.configuration.options.get(66),s=this._context.configuration.options.get(143).height/d,l=this._position.outsideDistance/d;return l<=1.5?Math.max(30,s*(1+l)):l<=3?Math.max(60,s*(2+l)):Math.max(200,s*(7+l))}_execute(){const d=this._context.configuration.options.get(66),s=this._getScrollSpeed(),l=this._tick(),o=s*(l/1e3)*d,g=this._position.outsidePosition==="above"?-o:o;this._context.viewModel.viewLayout.deltaScrollNow(0,g),this._viewHelper.renderNow();const h=this._context.viewLayout.getLinesViewportData(),m=this._position.outsidePosition==="above"?h.startLineNumber:h.endLineNumber;let C;{const w=(0,p.createEditorPagePosition)(this._viewHelper.viewDomNode),D=this._context.configuration.options.get(143).horizontalScrollbarHeight,I=new p.PageCoordinates(this._mouseEvent.pos.x,w.y+w.height-D-.1),T=(0,p.createCoordinatesRelativeToEditor)(this._viewHelper.viewDomNode,w,I);C=this._mouseTargetFactory.createMouseTarget(this._viewHelper.getLastRenderData(),w,I,T,null)}(!C.position||C.position.lineNumber!==m)&&(this._position.outsidePosition==="above"?C=S.MouseTarget.createOutsideEditor(this._position.mouseColumn,new v.Position(m,1),"above",this._position.outsideDistance):C=S.MouseTarget.createOutsideEditor(this._position.mouseColumn,new v.Position(m,this._context.viewModel.getLineMaxColumn(m)),"below",this._position.outsideDistance)),this._dispatchMouse(C,!0,2),this._animationFrameDisposable=L.scheduleAtNextAnimationFrame(L.getWindow(C.element),()=>this._execute())}}class f{get altKey(){return this._altKey}get ctrlKey(){return this._ctrlKey}get metaKey(){return this._metaKey}get shiftKey(){return this._shiftKey}get leftButton(){return this._leftButton}get middleButton(){return this._middleButton}get startedOnLineNumbers(){return this._startedOnLineNumbers}constructor(){this._altKey=!1,this._ctrlKey=!1,this._metaKey=!1,this._shiftKey=!1,this._leftButton=!1,this._middleButton=!1,this._startedOnLineNumbers=!1,this._lastMouseDownPosition=null,this._lastMouseDownPositionEqualCount=0,this._lastMouseDownCount=0,this._lastSetMouseDownCountTime=0,this.isDragAndDrop=!1}get count(){return this._lastMouseDownCount}setModifiers(d){this._altKey=d.altKey,this._ctrlKey=d.ctrlKey,this._metaKey=d.metaKey,this._shiftKey=d.shiftKey}setStartButtons(d){this._leftButton=d.leftButton,this._middleButton=d.middleButton}setStartedOnLineNumbers(d){this._startedOnLineNumbers=d}trySetCount(d,s){const l=new Date().getTime();l-this._lastSetMouseDownCountTime>f.CLEAR_MOUSE_DOWN_COUNT_TIME&&(d=1),this._lastSetMouseDownCountTime=l,d>this._lastMouseDownCount+1&&(d=this._lastMouseDownCount+1),this._lastMouseDownPosition&&this._lastMouseDownPosition.equals(s)?this._lastMouseDownPositionEqualCount++:this._lastMouseDownPositionEqualCount=1,this._lastMouseDownPosition=s,this._lastMouseDownCount=Math.min(d,this._lastMouseDownPositionEqualCount)}}f.CLEAR_MOUSE_DOWN_COUNT_TIME=400}),define(se[848],oe([1,0,219,7,63,44,2,17,847,190,167]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PointerHandler=e.PointerEventHandler=void 0;class a extends _.MouseHandler{constructor(r,u,f){super(r,u,f),this._register(y.Gesture.addTarget(this.viewHelper.linesContentDomNode)),this._register(k.addDisposableListener(this.viewHelper.linesContentDomNode,y.EventType.Tap,d=>this.onTap(d))),this._register(k.addDisposableListener(this.viewHelper.linesContentDomNode,y.EventType.Change,d=>this.onChange(d))),this._register(k.addDisposableListener(this.viewHelper.linesContentDomNode,y.EventType.Contextmenu,d=>this._onContextMenu(new b.EditorMouseEvent(d,!1,this.viewHelper.viewDomNode),!1))),this._lastPointerType="mouse",this._register(k.addDisposableListener(this.viewHelper.linesContentDomNode,"pointerdown",d=>{const s=d.pointerType;if(s==="mouse"){this._lastPointerType="mouse";return}else s==="touch"?this._lastPointerType="touch":this._lastPointerType="pen"}));const c=new b.EditorPointerEventFactory(this.viewHelper.viewDomNode);this._register(c.onPointerMove(this.viewHelper.viewDomNode,d=>this._onMouseMove(d))),this._register(c.onPointerUp(this.viewHelper.viewDomNode,d=>this._onMouseUp(d))),this._register(c.onPointerLeave(this.viewHelper.viewDomNode,d=>this._onMouseLeave(d))),this._register(c.onPointerDown(this.viewHelper.viewDomNode,(d,s)=>this._onMouseDown(d,s)))}onTap(r){!r.initialTarget||!this.viewHelper.linesContentDomNode.contains(r.initialTarget)||(r.preventDefault(),this.viewHelper.focusTextArea(),this._dispatchGesture(r,!1))}onChange(r){this._lastPointerType==="touch"&&this._context.viewModel.viewLayout.deltaScrollNow(-r.translationX,-r.translationY),this._lastPointerType==="pen"&&this._dispatchGesture(r,!0)}_dispatchGesture(r,u){const f=this._createMouseTarget(new b.EditorMouseEvent(r,!1,this.viewHelper.viewDomNode),!1);f.position&&this.viewController.dispatchMouse({position:f.position,mouseColumn:f.position.column,startedOnLineNumbers:!1,revealType:1,mouseDownCount:r.tapCount,inSelectionMode:u,altKey:!1,ctrlKey:!1,metaKey:!1,shiftKey:!1,leftButton:!1,middleButton:!1,onInjectedText:f.type===6&&f.detail.injectedText!==null})}_onMouseDown(r,u){r.browserEvent.pointerType!=="touch"&&super._onMouseDown(r,u)}}e.PointerEventHandler=a;class i extends _.MouseHandler{constructor(r,u,f){super(r,u,f),this._register(y.Gesture.addTarget(this.viewHelper.linesContentDomNode)),this._register(k.addDisposableListener(this.viewHelper.linesContentDomNode,y.EventType.Tap,c=>this.onTap(c))),this._register(k.addDisposableListener(this.viewHelper.linesContentDomNode,y.EventType.Change,c=>this.onChange(c))),this._register(k.addDisposableListener(this.viewHelper.linesContentDomNode,y.EventType.Contextmenu,c=>this._onContextMenu(new b.EditorMouseEvent(c,!1,this.viewHelper.viewDomNode),!1)))}onTap(r){r.preventDefault(),this.viewHelper.focusTextArea();const u=this._createMouseTarget(new b.EditorMouseEvent(r,!1,this.viewHelper.viewDomNode),!1);if(u.position){const f=document.createEvent("CustomEvent");f.initEvent(v.TextAreaSyntethicEvents.Tap,!1,!0),this.viewHelper.dispatchTextAreaEvent(f),this.viewController.moveTo(u.position,1)}}onChange(r){this._context.viewModel.viewLayout.deltaScrollNow(-r.translationX,-r.translationY)}}class n extends S.Disposable{constructor(r,u,f){super(),(p.isIOS||p.isAndroid&&p.isMobile)&&L.BrowserFeatures.pointerEvents?this.handler=this._register(new a(r,u,f)):E.mainWindow.TouchEvent?this.handler=this._register(new i(r,u,f)):this.handler=this._register(new _.MouseHandler(r,u,f))}getTargetAtClientPoint(r,u){return this.handler.getTargetAtClientPoint(r,u)}}e.PointerHandler=n}),define(se[849],oe([1,0,200,14,17,72,148,233,56,493,255,10,5,436]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewLines=void 0;class n{constructor(){this._currentVisibleRange=new i.Range(1,1,1,1)}getCurrentVisibleRange(){return this._currentVisibleRange}setCurrentVisibleRange(c){this._currentVisibleRange=c}}class t{constructor(c,d,s,l,o,g,h){this.minimalReveal=c,this.lineNumber=d,this.startColumn=s,this.endColumn=l,this.startScrollTop=o,this.stopScrollTop=g,this.scrollType=h,this.type="range",this.minLineNumber=d,this.maxLineNumber=d}}class r{constructor(c,d,s,l,o){this.minimalReveal=c,this.selections=d,this.startScrollTop=s,this.stopScrollTop=l,this.scrollType=o,this.type="selections";let g=d[0].startLineNumber,h=d[0].endLineNumber;for(let m=1,C=d.length;m<C;m++){const w=d[m];g=Math.min(g,w.startLineNumber),h=Math.max(h,w.endLineNumber)}this.minLineNumber=g,this.maxLineNumber=h}}class u extends _.ViewPart{constructor(c,d){super(c),this._linesContent=d,this._textRangeRestingSpot=document.createElement("div"),this._visibleLines=new p.VisibleLinesCollection(this),this.domNode=this._visibleLines.domNode;const s=this._context.configuration,l=this._context.configuration.options,o=l.get(50),g=l.get(144);this._lineHeight=l.get(66),this._typicalHalfwidthCharacterWidth=o.typicalHalfwidthCharacterWidth,this._isViewportWrapping=g.isViewportWrapping,this._revealHorizontalRightPadding=l.get(99),this._cursorSurroundingLines=l.get(29),this._cursorSurroundingLinesStyle=l.get(30),this._canUseLayerHinting=!l.get(32),this._viewLineOptions=new b.ViewLineOptions(s,this._context.theme.type),_.PartFingerprints.write(this.domNode,8),this.domNode.setClassName(`view-lines ${L.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`),(0,E.applyFontInfo)(this.domNode,o),this._maxLineWidth=0,this._asyncUpdateLineWidths=new k.RunOnceScheduler(()=>{this._updateLineWidthsSlow()},200),this._asyncCheckMonospaceFontAssumptions=new k.RunOnceScheduler(()=>{this._checkMonospaceFontAssumptions()},2e3),this._lastRenderedData=new n,this._horizontalRevealRequest=null,this._stickyScrollEnabled=l.get(114).enabled,this._maxNumberStickyLines=l.get(114).maxLineCount}dispose(){this._asyncUpdateLineWidths.dispose(),this._asyncCheckMonospaceFontAssumptions.dispose(),super.dispose()}getDomNode(){return this.domNode}createVisibleLine(){return new b.ViewLine(this._viewLineOptions)}onConfigurationChanged(c){this._visibleLines.onConfigurationChanged(c),c.hasChanged(144)&&(this._maxLineWidth=0);const d=this._context.configuration.options,s=d.get(50),l=d.get(144);return this._lineHeight=d.get(66),this._typicalHalfwidthCharacterWidth=s.typicalHalfwidthCharacterWidth,this._isViewportWrapping=l.isViewportWrapping,this._revealHorizontalRightPadding=d.get(99),this._cursorSurroundingLines=d.get(29),this._cursorSurroundingLinesStyle=d.get(30),this._canUseLayerHinting=!d.get(32),this._stickyScrollEnabled=d.get(114).enabled,this._maxNumberStickyLines=d.get(114).maxLineCount,(0,E.applyFontInfo)(this.domNode,s),this._onOptionsMaybeChanged(),c.hasChanged(143)&&(this._maxLineWidth=0),!0}_onOptionsMaybeChanged(){const c=this._context.configuration,d=new b.ViewLineOptions(c,this._context.theme.type);if(!this._viewLineOptions.equals(d)){this._viewLineOptions=d;const s=this._visibleLines.getStartLineNumber(),l=this._visibleLines.getEndLineNumber();for(let o=s;o<=l;o++)this._visibleLines.getVisibleLine(o).onOptionsChanged(this._viewLineOptions);return!0}return!1}onCursorStateChanged(c){const d=this._visibleLines.getStartLineNumber(),s=this._visibleLines.getEndLineNumber();let l=!1;for(let o=d;o<=s;o++)l=this._visibleLines.getVisibleLine(o).onSelectionChanged()||l;return l}onDecorationsChanged(c){{const d=this._visibleLines.getStartLineNumber(),s=this._visibleLines.getEndLineNumber();for(let l=d;l<=s;l++)this._visibleLines.getVisibleLine(l).onDecorationsChanged()}return!0}onFlushed(c){const d=this._visibleLines.onFlushed(c);return this._maxLineWidth=0,d}onLinesChanged(c){return this._visibleLines.onLinesChanged(c)}onLinesDeleted(c){return this._visibleLines.onLinesDeleted(c)}onLinesInserted(c){return this._visibleLines.onLinesInserted(c)}onRevealRangeRequest(c){const d=this._computeScrollTopToRevealRange(this._context.viewLayout.getFutureViewport(),c.source,c.minimalReveal,c.range,c.selections,c.verticalType);if(d===-1)return!1;let s=this._context.viewLayout.validateScrollPosition({scrollTop:d});c.revealHorizontal?c.range&&c.range.startLineNumber!==c.range.endLineNumber?s={scrollTop:s.scrollTop,scrollLeft:0}:c.range?this._horizontalRevealRequest=new t(c.minimalReveal,c.range.startLineNumber,c.range.startColumn,c.range.endColumn,this._context.viewLayout.getCurrentScrollTop(),s.scrollTop,c.scrollType):c.selections&&c.selections.length>0&&(this._horizontalRevealRequest=new r(c.minimalReveal,c.selections,this._context.viewLayout.getCurrentScrollTop(),s.scrollTop,c.scrollType)):this._horizontalRevealRequest=null;const o=Math.abs(this._context.viewLayout.getCurrentScrollTop()-s.scrollTop)<=this._lineHeight?1:c.scrollType;return this._context.viewModel.viewLayout.setScrollPosition(s,o),!0}onScrollChanged(c){if(this._horizontalRevealRequest&&c.scrollLeftChanged&&(this._horizontalRevealRequest=null),this._horizontalRevealRequest&&c.scrollTopChanged){const d=Math.min(this._horizontalRevealRequest.startScrollTop,this._horizontalRevealRequest.stopScrollTop),s=Math.max(this._horizontalRevealRequest.startScrollTop,this._horizontalRevealRequest.stopScrollTop);(c.scrollTop<d||c.scrollTop>s)&&(this._horizontalRevealRequest=null)}return this.domNode.setWidth(c.scrollWidth),this._visibleLines.onScrollChanged(c)||!0}onTokensChanged(c){return this._visibleLines.onTokensChanged(c)}onZonesChanged(c){return this._context.viewModel.viewLayout.setMaxLineWidth(this._maxLineWidth),this._visibleLines.onZonesChanged(c)}onThemeChanged(c){return this._onOptionsMaybeChanged()}getPositionFromDOMInfo(c,d){const s=this._getViewLineDomNode(c);if(s===null)return null;const l=this._getLineNumberFor(s);if(l===-1||l<1||l>this._context.viewModel.getLineCount())return null;if(this._context.viewModel.getLineMaxColumn(l)===1)return new a.Position(l,1);const o=this._visibleLines.getStartLineNumber(),g=this._visibleLines.getEndLineNumber();if(l<o||l>g)return null;let h=this._visibleLines.getVisibleLine(l).getColumnOfNodeOffset(c,d);const m=this._context.viewModel.getLineMinColumn(l);return h<m&&(h=m),new a.Position(l,h)}_getViewLineDomNode(c){for(;c&&c.nodeType===1;){if(c.className===b.ViewLine.CLASS_NAME)return c;c=c.parentElement}return null}_getLineNumberFor(c){const d=this._visibleLines.getStartLineNumber(),s=this._visibleLines.getEndLineNumber();for(let l=d;l<=s;l++){const o=this._visibleLines.getVisibleLine(l);if(c===o.getDomNode())return l}return-1}getLineWidth(c){const d=this._visibleLines.getStartLineNumber(),s=this._visibleLines.getEndLineNumber();if(c<d||c>s)return-1;const l=new v.DomReadingContext(this.domNode.domNode,this._textRangeRestingSpot),o=this._visibleLines.getVisibleLine(c).getWidth(l);return this._updateLineWidthsSlowIfDomDidLayout(l),o}linesVisibleRangesForRange(c,d){if(this.shouldRender())return null;const s=c.endLineNumber,l=i.Range.intersectRanges(c,this._lastRenderedData.getCurrentVisibleRange());if(!l)return null;const o=[];let g=0;const h=new v.DomReadingContext(this.domNode.domNode,this._textRangeRestingSpot);let m=0;d&&(m=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new a.Position(l.startLineNumber,1)).lineNumber);const C=this._visibleLines.getStartLineNumber(),w=this._visibleLines.getEndLineNumber();for(let D=l.startLineNumber;D<=l.endLineNumber;D++){if(D<C||D>w)continue;const I=D===l.startLineNumber?l.startColumn:1,T=D!==l.endLineNumber,A=T?this._context.viewModel.getLineMaxColumn(D):l.endColumn,P=this._visibleLines.getVisibleLine(D).getVisibleRangesForRange(D,I,A,h);if(P){if(d&&D<s){const N=m;m=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new a.Position(D+1,1)).lineNumber,N!==m&&(P.ranges[P.ranges.length-1].width+=this._typicalHalfwidthCharacterWidth)}o[g++]=new S.LineVisibleRanges(P.outsideRenderedLine,D,S.HorizontalRange.from(P.ranges),T)}}return this._updateLineWidthsSlowIfDomDidLayout(h),g===0?null:o}_visibleRangesForLineRange(c,d,s){if(this.shouldRender()||c<this._visibleLines.getStartLineNumber()||c>this._visibleLines.getEndLineNumber())return null;const l=new v.DomReadingContext(this.domNode.domNode,this._textRangeRestingSpot),o=this._visibleLines.getVisibleLine(c).getVisibleRangesForRange(c,d,s,l);return this._updateLineWidthsSlowIfDomDidLayout(l),o}visibleRangeForPosition(c){const d=this._visibleRangesForLineRange(c.lineNumber,c.column,c.column);return d?new S.HorizontalPosition(d.outsideRenderedLine,d.ranges[0].left):null}_updateLineWidthsFast(){return this._updateLineWidths(!0)}_updateLineWidthsSlow(){this._updateLineWidths(!1)}_updateLineWidthsSlowIfDomDidLayout(c){c.didDomLayout&&(this._asyncUpdateLineWidths.isScheduled()||(this._asyncUpdateLineWidths.cancel(),this._updateLineWidthsSlow()))}_updateLineWidths(c){const d=this._visibleLines.getStartLineNumber(),s=this._visibleLines.getEndLineNumber();let l=1,o=!0;for(let g=d;g<=s;g++){const h=this._visibleLines.getVisibleLine(g);if(c&&!h.getWidthIsFast()){o=!1;continue}l=Math.max(l,h.getWidth(null))}return o&&d===1&&s===this._context.viewModel.getLineCount()&&(this._maxLineWidth=0),this._ensureMaxLineWidth(l),o}_checkMonospaceFontAssumptions(){let c=-1,d=-1;const s=this._visibleLines.getStartLineNumber(),l=this._visibleLines.getEndLineNumber();for(let o=s;o<=l;o++){const g=this._visibleLines.getVisibleLine(o);if(g.needsMonospaceFontCheck()){const h=g.getWidth(null);h>d&&(d=h,c=o)}}if(c!==-1&&!this._visibleLines.getVisibleLine(c).monospaceAssumptionsAreValid())for(let o=s;o<=l;o++)this._visibleLines.getVisibleLine(o).onMonospaceAssumptionsInvalidated()}prepareRender(){throw new Error("Not supported")}render(){throw new Error("Not supported")}renderText(c){if(this._visibleLines.renderLines(c),this._lastRenderedData.setCurrentVisibleRange(c.visibleRange),this.domNode.setWidth(this._context.viewLayout.getScrollWidth()),this.domNode.setHeight(Math.min(this._context.viewLayout.getScrollHeight(),1e6)),this._horizontalRevealRequest){const s=this._horizontalRevealRequest;if(c.startLineNumber<=s.minLineNumber&&s.maxLineNumber<=c.endLineNumber){this._horizontalRevealRequest=null,this.onDidRender();const l=this._computeScrollLeftToReveal(s);l&&(this._isViewportWrapping||this._ensureMaxLineWidth(l.maxHorizontalOffset),this._context.viewModel.viewLayout.setScrollPosition({scrollLeft:l.scrollLeft},s.scrollType))}}if(this._updateLineWidthsFast()?this._asyncUpdateLineWidths.cancel():this._asyncUpdateLineWidths.schedule(),y.isLinux&&!this._asyncCheckMonospaceFontAssumptions.isScheduled()){const s=this._visibleLines.getStartLineNumber(),l=this._visibleLines.getEndLineNumber();for(let o=s;o<=l;o++)if(this._visibleLines.getVisibleLine(o).needsMonospaceFontCheck()){this._asyncCheckMonospaceFontAssumptions.schedule();break}}this._linesContent.setLayerHinting(this._canUseLayerHinting),this._linesContent.setContain("strict");const d=this._context.viewLayout.getCurrentScrollTop()-c.bigNumbersDelta;this._linesContent.setTop(-d),this._linesContent.setLeft(-this._context.viewLayout.getCurrentScrollLeft())}_ensureMaxLineWidth(c){const d=Math.ceil(c);this._maxLineWidth<d&&(this._maxLineWidth=d,this._context.viewModel.viewLayout.setMaxLineWidth(this._maxLineWidth))}_computeScrollTopToRevealRange(c,d,s,l,o,g){const h=c.top,m=c.height,C=h+m;let w,D,I;if(o&&o.length>0){let M=o[0].startLineNumber,R=o[0].endLineNumber;for(let x=1,O=o.length;x<O;x++){const B=o[x];M=Math.min(M,B.startLineNumber),R=Math.max(R,B.endLineNumber)}w=!1,D=this._context.viewLayout.getVerticalOffsetForLineNumber(M),I=this._context.viewLayout.getVerticalOffsetForLineNumber(R)+this._lineHeight}else if(l)w=!0,D=this._context.viewLayout.getVerticalOffsetForLineNumber(l.startLineNumber),I=this._context.viewLayout.getVerticalOffsetForLineNumber(l.endLineNumber)+this._lineHeight;else return-1;const T=(d==="mouse"||s)&&this._cursorSurroundingLinesStyle==="default";let A=0,P=0;if(T)s||(A=this._lineHeight);else{const M=Math.min(m/this._lineHeight/2,this._cursorSurroundingLines);this._stickyScrollEnabled?A=Math.max(M,this._maxNumberStickyLines)*this._lineHeight:A=M*this._lineHeight,P=Math.max(0,M-1)*this._lineHeight}s||(g===0||g===4)&&(P+=this._lineHeight),D-=A,I+=P;let N;if(I-D>m){if(!w)return-1;N=D}else if(g===5||g===6)if(g===6&&h<=D&&I<=C)N=h;else{const M=Math.max(5*this._lineHeight,m*.2),R=D-M,x=I-m;N=Math.max(x,R)}else if(g===1||g===2)if(g===2&&h<=D&&I<=C)N=h;else{const M=(D+I)/2;N=Math.max(0,M-m/2)}else N=this._computeMinimumScrolling(h,C,D,I,g===3,g===4);return N}_computeScrollLeftToReveal(c){const d=this._context.viewLayout.getCurrentViewport(),s=this._context.configuration.options.get(143),l=d.left,o=l+d.width-s.verticalScrollbarWidth;let g=1073741824,h=0;if(c.type==="range"){const C=this._visibleRangesForLineRange(c.lineNumber,c.startColumn,c.endColumn);if(!C)return null;for(const w of C.ranges)g=Math.min(g,Math.round(w.left)),h=Math.max(h,Math.round(w.left+w.width))}else for(const C of c.selections){if(C.startLineNumber!==C.endLineNumber)return null;const w=this._visibleRangesForLineRange(C.startLineNumber,C.startColumn,C.endColumn);if(!w)return null;for(const D of w.ranges)g=Math.min(g,Math.round(D.left)),h=Math.max(h,Math.round(D.left+D.width))}return c.minimalReveal||(g=Math.max(0,g-u.HORIZONTAL_EXTRA_PX),h+=this._revealHorizontalRightPadding),c.type==="selections"&&h-g>d.width?null:{scrollLeft:this._computeMinimumScrolling(l,o,g,h),maxHorizontalOffset:h}}_computeMinimumScrolling(c,d,s,l,o,g){c=c|0,d=d|0,s=s|0,l=l|0,o=!!o,g=!!g;const h=d-c;if(l-s<h){if(o)return s;if(g)return Math.max(0,l-h);if(s<c)return s;if(l>d)return Math.max(0,l-h)}else return s;return c}}e.ViewLines=u,u.HORIZONTAL_EXTRA_PX=30}),define(se[366],oe([1,0,7,46,78,230,224,13,14,398,107,12,6,126,2,17,11,750,350,99,22,89,178]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputList=e.QuickInputListFocus=void 0;const o=L.$;class g{constructor(N,M,R,x,O,B,W){var V,K,F;this._checked=!1,this._hidden=!1,this.hasCheckbox=x,this.index=R,this.fireButtonTriggered=O,this.fireSeparatorButtonTriggered=B,this._onChecked=W,this.onChecked=x?i.Event.map(i.Event.filter(this._onChecked.event,q=>q.listElement===this),q=>q.checked):i.Event.None,N.type==="separator"?this._separator=N:(this.item=N,M&&M.type==="separator"&&!M.buttons&&(this._separator=M),this.saneDescription=this.item.description,this.saneDetail=this.item.detail,this._labelHighlights=(V=this.item.highlights)===null||V===void 0?void 0:V.label,this._descriptionHighlights=(K=this.item.highlights)===null||K===void 0?void 0:K.description,this._detailHighlights=(F=this.item.highlights)===null||F===void 0?void 0:F.detail,this.saneTooltip=this.item.tooltip),this._init=new d.Lazy(()=>{var q;const ie=(q=N.label)!==null&&q!==void 0?q:"",ae=(0,n.parseLabelWithIcons)(ie).text.trim(),ne=N.ariaLabel||[ie,this.saneDescription,this.saneDetail].map($=>(0,n.getCodiconAriaLabel)($)).filter($=>!!$).join(", ");return{saneLabel:ie,saneSortLabel:ae,saneAriaLabel:ne}})}get saneLabel(){return this._init.value.saneLabel}get saneSortLabel(){return this._init.value.saneSortLabel}get saneAriaLabel(){return this._init.value.saneAriaLabel}get element(){return this._element}set element(N){this._element=N}get hidden(){return this._hidden}set hidden(N){this._hidden=N}get checked(){return this._checked}set checked(N){N!==this._checked&&(this._checked=N,this._onChecked.fire({listElement:this,checked:N}))}get separator(){return this._separator}set separator(N){this._separator=N}get labelHighlights(){return this._labelHighlights}set labelHighlights(N){this._labelHighlights=N}get descriptionHighlights(){return this._descriptionHighlights}set descriptionHighlights(N){this._descriptionHighlights=N}get detailHighlights(){return this._detailHighlights}set detailHighlights(N){this._detailHighlights=N}}class h{constructor(N,M){this.themeService=N,this.hoverDelegate=M}get templateId(){return h.ID}renderTemplate(N){const M=Object.create(null);M.toDisposeElement=[],M.toDisposeTemplate=[],M.entry=L.append(N,o(".quick-input-list-entry"));const R=L.append(M.entry,o("label.quick-input-list-label"));M.toDisposeTemplate.push(L.addStandardDisposableListener(R,L.EventType.CLICK,K=>{M.checkbox.offsetParent||K.preventDefault()})),M.checkbox=L.append(R,o("input.quick-input-list-checkbox")),M.checkbox.type="checkbox",M.toDisposeTemplate.push(L.addStandardDisposableListener(M.checkbox,L.EventType.CHANGE,K=>{M.element.checked=M.checkbox.checked}));const x=L.append(R,o(".quick-input-list-rows")),O=L.append(x,o(".quick-input-list-row")),B=L.append(x,o(".quick-input-list-row"));M.label=new E.IconLabel(O,{supportHighlights:!0,supportDescriptionHighlights:!0,supportIcons:!0,hoverDelegate:this.hoverDelegate}),M.toDisposeTemplate.push(M.label),M.icon=L.prepend(M.label.element,o(".quick-input-list-icon"));const W=L.append(O,o(".quick-input-list-entry-keybinding"));M.keybinding=new S.KeybindingLabel(W,r.OS);const V=L.append(B,o(".quick-input-list-label-meta"));return M.detail=new E.IconLabel(V,{supportHighlights:!0,supportIcons:!0,hoverDelegate:this.hoverDelegate}),M.toDisposeTemplate.push(M.detail),M.separator=L.append(M.entry,o(".quick-input-list-separator")),M.actionBar=new y.ActionBar(M.entry,this.hoverDelegate?{hoverDelegate:this.hoverDelegate}:void 0),M.actionBar.domNode.classList.add("quick-input-list-entry-action-bar"),M.toDisposeTemplate.push(M.actionBar),M}renderElement(N,M,R){var x,O,B,W;R.element=N,N.element=(x=R.entry)!==null&&x!==void 0?x:void 0;const V=N.item?N.item:N.separator;R.checkbox.checked=N.checked,R.toDisposeElement.push(N.onChecked(ne=>R.checkbox.checked=ne));const{labelHighlights:K,descriptionHighlights:F,detailHighlights:q}=N;if(!((O=N.item)===null||O===void 0)&&O.iconPath){const ne=(0,l.isDark)(this.themeService.getColorTheme().type)?N.item.iconPath.dark:(B=N.item.iconPath.light)!==null&&B!==void 0?B:N.item.iconPath.dark,$=s.URI.revive(ne);R.icon.className="quick-input-list-icon",R.icon.style.backgroundImage=L.asCSSUrl($)}else R.icon.style.backgroundImage="",R.icon.className=!((W=N.item)===null||W===void 0)&&W.iconClass?`quick-input-list-icon ${N.item.iconClass}`:"";const ie={matches:K||[],descriptionTitle:N.saneTooltip?void 0:N.saneDescription,descriptionMatches:F||[],labelEscapeNewLines:!0};V.type!=="separator"?(ie.extraClasses=V.iconClasses,ie.italic=V.italic,ie.strikethrough=V.strikethrough,R.entry.classList.remove("quick-input-list-separator-as-item")):R.entry.classList.add("quick-input-list-separator-as-item"),R.label.setLabel(N.saneLabel,N.saneDescription,ie),R.keybinding.set(V.type==="separator"?void 0:V.keybinding),N.saneDetail?(R.detail.element.style.display="",R.detail.setLabel(N.saneDetail,void 0,{matches:q,title:N.saneTooltip?void 0:N.saneDetail,labelEscapeNewLines:!0})):R.detail.element.style.display="none",N.item&&N.separator&&N.separator.label?(R.separator.textContent=N.separator.label,R.separator.style.display=""):R.separator.style.display="none",R.entry.classList.toggle("quick-input-list-separator-border",!!N.separator);const ae=V.buttons;ae&&ae.length?(R.actionBar.push(ae.map((ne,$)=>(0,c.quickInputButtonToAction)(ne,`id-${$}`,()=>V.type!=="separator"?N.fireButtonTriggered({button:ne,item:V}):N.fireSeparatorButtonTriggered({button:ne,separator:V}))),{icon:!0,label:!1}),R.entry.classList.add("has-actions")):R.entry.classList.remove("has-actions")}disposeElement(N,M,R){R.toDisposeElement=(0,t.dispose)(R.toDisposeElement),R.actionBar.clear()}disposeTemplate(N){N.toDisposeElement=(0,t.dispose)(N.toDisposeElement),N.toDisposeTemplate=(0,t.dispose)(N.toDisposeTemplate)}}h.ID="listelement";class m{getHeight(N){return N.item?N.saneDetail?44:22:24}getTemplateId(N){return h.ID}}var C;(function(P){P[P.First=1]="First",P[P.Second=2]="Second",P[P.Last=3]="Last",P[P.Next=4]="Next",P[P.Previous=5]="Previous",P[P.NextPage=6]="NextPage",P[P.PreviousPage=7]="PreviousPage"})(C||(e.QuickInputListFocus=C={}));class w{constructor(N,M,R,x){this.parent=N,this.options=R,this.inputElements=[],this.elements=[],this.elementsToIndexes=new Map,this.matchOnDescription=!1,this.matchOnDetail=!1,this.matchOnLabel=!0,this.matchOnLabelMode="fuzzy",this.sortByLabel=!0,this._onChangedAllVisibleChecked=new i.Emitter,this.onChangedAllVisibleChecked=this._onChangedAllVisibleChecked.event,this._onChangedCheckedCount=new i.Emitter,this.onChangedCheckedCount=this._onChangedCheckedCount.event,this._onChangedVisibleCount=new i.Emitter,this.onChangedVisibleCount=this._onChangedVisibleCount.event,this._onChangedCheckedElements=new i.Emitter,this.onChangedCheckedElements=this._onChangedCheckedElements.event,this._onButtonTriggered=new i.Emitter,this.onButtonTriggered=this._onButtonTriggered.event,this._onSeparatorButtonTriggered=new i.Emitter,this.onSeparatorButtonTriggered=this._onSeparatorButtonTriggered.event,this._onKeyDown=new i.Emitter,this.onKeyDown=this._onKeyDown.event,this._onLeave=new i.Emitter,this.onLeave=this._onLeave.event,this._listElementChecked=new i.Emitter,this._fireCheckedEvents=!0,this.elementDisposables=[],this.disposables=[],this.id=M,this.container=L.append(this.parent,o(".quick-input-list"));const O=new m,B=new A;this.list=R.createList("QuickInput",this.container,O,[new h(x,R.hoverDelegate)],{identityProvider:{getId:V=>{var K,F,q,ie,ae,ne,$,J;return(J=(ne=(ie=(F=(K=V.item)===null||K===void 0?void 0:K.id)!==null&&F!==void 0?F:(q=V.item)===null||q===void 0?void 0:q.label)!==null&&ie!==void 0?ie:(ae=V.separator)===null||ae===void 0?void 0:ae.id)!==null&&ne!==void 0?ne:($=V.separator)===null||$===void 0?void 0:$.label)!==null&&J!==void 0?J:""}},setRowLineHeight:!1,multipleSelectionSupport:!1,horizontalScrolling:!1,accessibilityProvider:B}),this.list.getHTMLElement().id=M,this.disposables.push(this.list),this.disposables.push(this.list.onKeyDown(V=>{const K=new k.StandardKeyboardEvent(V);switch(K.keyCode){case 10:this.toggleCheckbox();break;case 31:(r.isMacintosh?V.metaKey:V.ctrlKey)&&this.list.setFocus((0,p.range)(this.list.length));break;case 16:{const F=this.list.getFocus();F.length===1&&F[0]===0&&this._onLeave.fire();break}case 18:{const F=this.list.getFocus();F.length===1&&F[0]===this.list.length-1&&this._onLeave.fire();break}}this._onKeyDown.fire(K)})),this.disposables.push(this.list.onMouseDown(V=>{V.browserEvent.button!==2&&V.browserEvent.preventDefault()})),this.disposables.push(L.addDisposableListener(this.container,L.EventType.CLICK,V=>{(V.x||V.y)&&this._onLeave.fire()})),this.disposables.push(this.list.onMouseMiddleClick(V=>{this._onLeave.fire()})),this.disposables.push(this.list.onContextMenu(V=>{typeof V.index=="number"&&(V.browserEvent.preventDefault(),this.list.setSelection([V.index]))}));const W=new _.ThrottledDelayer(R.hoverDelegate.delay);this.disposables.push(this.list.onMouseOver(async V=>{var K;if(V.browserEvent.target instanceof HTMLAnchorElement){W.cancel();return}if(!(!(V.browserEvent.relatedTarget instanceof HTMLAnchorElement)&&L.isAncestor(V.browserEvent.relatedTarget,(K=V.element)===null||K===void 0?void 0:K.element)))try{await W.trigger(async()=>{V.element&&this.showHover(V.element)})}catch(F){if(!(0,a.isCancellationError)(F))throw F}})),this.disposables.push(this.list.onMouseOut(V=>{var K;L.isAncestor(V.browserEvent.relatedTarget,(K=V.element)===null||K===void 0?void 0:K.element)||W.cancel()})),this.disposables.push(W),this.disposables.push(this._listElementChecked.event(V=>this.fireCheckedEvents())),this.disposables.push(this._onChangedAllVisibleChecked,this._onChangedCheckedCount,this._onChangedVisibleCount,this._onChangedCheckedElements,this._onButtonTriggered,this._onSeparatorButtonTriggered,this._onLeave,this._onKeyDown)}get onDidChangeFocus(){return i.Event.map(this.list.onDidChangeFocus,N=>N.elements.map(M=>M.item))}get onDidChangeSelection(){return i.Event.map(this.list.onDidChangeSelection,N=>({items:N.elements.map(M=>M.item),event:N.browserEvent}))}get scrollTop(){return this.list.scrollTop}set scrollTop(N){this.list.scrollTop=N}get ariaLabel(){return this.list.getHTMLElement().ariaLabel}set ariaLabel(N){this.list.getHTMLElement().ariaLabel=N}getAllVisibleChecked(){return this.allVisibleChecked(this.elements,!1)}allVisibleChecked(N,M=!0){for(let R=0,x=N.length;R<x;R++){const O=N[R];if(!O.hidden)if(O.checked)M=!0;else return!1}return M}getCheckedCount(){let N=0;const M=this.elements;for(let R=0,x=M.length;R<x;R++)M[R].checked&&N++;return N}getVisibleCount(){let N=0;const M=this.elements;for(let R=0,x=M.length;R<x;R++)M[R].hidden||N++;return N}setAllVisibleChecked(N){try{this._fireCheckedEvents=!1,this.elements.forEach(M=>{M.hidden||(M.checked=N)})}finally{this._fireCheckedEvents=!0,this.fireCheckedEvents()}}setElements(N){this.elementDisposables=(0,t.dispose)(this.elementDisposables);const M=B=>this.fireButtonTriggered(B),R=B=>this.fireSeparatorButtonTriggered(B);this.inputElements=N;const x=new Map,O=this.parent.classList.contains("show-checkboxes");this.elements=N.reduce((B,W,V)=>{var K;const F=V>0?N[V-1]:void 0;if(W.type==="separator"&&!W.buttons)return B;const q=new g(W,F,V,O,M,R,this._listElementChecked),ie=B.length;return B.push(q),x.set((K=q.item)!==null&&K!==void 0?K:q.separator,ie),B},[]),this.elementsToIndexes=x,this.list.splice(0,this.list.length),this.list.splice(0,this.list.length,this.elements),this._onChangedVisibleCount.fire(this.elements.length)}getFocusedElements(){return this.list.getFocusedElements().map(N=>N.item)}setFocusedElements(N){if(this.list.setFocus(N.filter(M=>this.elementsToIndexes.has(M)).map(M=>this.elementsToIndexes.get(M))),N.length>0){const M=this.list.getFocus()[0];typeof M=="number"&&this.list.reveal(M)}}getActiveDescendant(){return this.list.getHTMLElement().getAttribute("aria-activedescendant")}setSelectedElements(N){this.list.setSelection(N.filter(M=>this.elementsToIndexes.has(M)).map(M=>this.elementsToIndexes.get(M)))}getCheckedElements(){return this.elements.filter(N=>N.checked).map(N=>N.item).filter(N=>!!N)}setCheckedElements(N){try{this._fireCheckedEvents=!1;const M=new Set;for(const R of N)M.add(R);for(const R of this.elements)R.checked=M.has(R.item)}finally{this._fireCheckedEvents=!0,this.fireCheckedEvents()}}set enabled(N){this.list.getHTMLElement().style.pointerEvents=N?"":"none"}focus(N){if(!this.list.length)return;switch(N===C.Second&&this.list.length<2&&(N=C.First),N){case C.First:this.list.scrollTop=0,this.list.focusFirst(void 0,R=>!!R.item);break;case C.Second:this.list.scrollTop=0,this.list.focusNth(1,void 0,R=>!!R.item);break;case C.Last:this.list.scrollTop=this.list.scrollHeight,this.list.focusLast(void 0,R=>!!R.item);break;case C.Next:{this.list.focusNext(void 0,!0,void 0,x=>!!x.item);const R=this.list.getFocus()[0];R!==0&&!this.elements[R-1].item&&this.list.firstVisibleIndex>R-1&&this.list.reveal(R-1);break}case C.Previous:{this.list.focusPrevious(void 0,!0,void 0,x=>!!x.item);const R=this.list.getFocus()[0];R!==0&&!this.elements[R-1].item&&this.list.firstVisibleIndex>R-1&&this.list.reveal(R-1);break}case C.NextPage:this.list.focusNextPage(void 0,R=>!!R.item);break;case C.PreviousPage:this.list.focusPreviousPage(void 0,R=>!!R.item);break}const M=this.list.getFocus()[0];typeof M=="number"&&this.list.reveal(M)}clearFocus(){this.list.setFocus([])}domFocus(){this.list.domFocus()}showHover(N){var M,R,x;this._lastHover&&!this._lastHover.isDisposed&&((R=(M=this.options.hoverDelegate).onDidHideHover)===null||R===void 0||R.call(M),(x=this._lastHover)===null||x===void 0||x.dispose()),!(!N.element||!N.saneTooltip)&&(this._lastHover=this.options.hoverDelegate.showHover({content:N.saneTooltip,target:N.element,linkHandler:O=>{this.options.linkOpenerDelegate(O)},appearance:{showPointer:!0},container:this.container,position:{hoverPosition:1}},!1))}layout(N){this.list.getHTMLElement().style.maxHeight=N?`${Math.floor(N/44)*44+6}px`:"",this.list.layout()}filter(N){if(!(this.sortByLabel||this.matchOnLabel||this.matchOnDescription||this.matchOnDetail))return this.list.layout(),!1;const M=N;if(N=N.trim(),!N||!(this.matchOnLabel||this.matchOnDescription||this.matchOnDetail))this.elements.forEach(x=>{x.labelHighlights=void 0,x.descriptionHighlights=void 0,x.detailHighlights=void 0,x.hidden=!1;const O=x.index&&this.inputElements[x.index-1];x.item&&(x.separator=O&&O.type==="separator"&&!O.buttons?O:void 0)});else{let x;this.elements.forEach(O=>{var B,W,V,K;let F;this.matchOnLabelMode==="fuzzy"?F=this.matchOnLabel&&(B=(0,n.matchesFuzzyIconAware)(N,(0,n.parseLabelWithIcons)(O.saneLabel)))!==null&&B!==void 0?B:void 0:F=this.matchOnLabel&&(W=D(M,(0,n.parseLabelWithIcons)(O.saneLabel)))!==null&&W!==void 0?W:void 0;const q=this.matchOnDescription&&(V=(0,n.matchesFuzzyIconAware)(N,(0,n.parseLabelWithIcons)(O.saneDescription||"")))!==null&&V!==void 0?V:void 0,ie=this.matchOnDetail&&(K=(0,n.matchesFuzzyIconAware)(N,(0,n.parseLabelWithIcons)(O.saneDetail||"")))!==null&&K!==void 0?K:void 0;if(F||q||ie?(O.labelHighlights=F,O.descriptionHighlights=q,O.detailHighlights=ie,O.hidden=!1):(O.labelHighlights=void 0,O.descriptionHighlights=void 0,O.detailHighlights=void 0,O.hidden=O.item?!O.item.alwaysShow:!0),O.item?O.separator=void 0:O.separator&&(O.hidden=!0),!this.sortByLabel){const ae=O.index&&this.inputElements[O.index-1];x=ae&&ae.type==="separator"?ae:x,x&&!O.hidden&&(O.separator=x,x=void 0)}})}const R=this.elements.filter(x=>!x.hidden);if(this.sortByLabel&&N){const x=N.toLowerCase();R.sort((O,B)=>T(O,B,x))}return this.elementsToIndexes=R.reduce((x,O,B)=>{var W;return x.set((W=O.item)!==null&&W!==void 0?W:O.separator,B),x},new Map),this.list.splice(0,this.list.length,R),this.list.setFocus([]),this.list.layout(),this._onChangedAllVisibleChecked.fire(this.getAllVisibleChecked()),this._onChangedVisibleCount.fire(R.length),!0}toggleCheckbox(){try{this._fireCheckedEvents=!1;const N=this.list.getFocusedElements(),M=this.allVisibleChecked(N);for(const R of N)R.checked=!M}finally{this._fireCheckedEvents=!0,this.fireCheckedEvents()}}display(N){this.container.style.display=N?"":"none"}isDisplayed(){return this.container.style.display!=="none"}dispose(){this.elementDisposables=(0,t.dispose)(this.elementDisposables),this.disposables=(0,t.dispose)(this.disposables)}fireCheckedEvents(){this._fireCheckedEvents&&(this._onChangedAllVisibleChecked.fire(this.getAllVisibleChecked()),this._onChangedCheckedCount.fire(this.getCheckedCount()),this._onChangedCheckedElements.fire(this.getCheckedElements()))}fireButtonTriggered(N){this._onButtonTriggered.fire(N)}fireSeparatorButtonTriggered(N){this._onSeparatorButtonTriggered.fire(N)}style(N){this.list.style(N)}toggleHover(){const N=this.list.getFocusedElements()[0];if(!N?.saneTooltip)return;if(this._lastHover&&!this._lastHover.isDisposed){this._lastHover.dispose();return}const M=this.list.getFocusedElements()[0];if(!M)return;this.showHover(M);const R=new t.DisposableStore;R.add(this.list.onDidChangeFocus(x=>{x.indexes.length&&this.showHover(x.elements[0])})),this._lastHover&&R.add(this._lastHover),this._toggleHover=R,this.elementDisposables.push(this._toggleHover)}}e.QuickInputList=w,ke([b.memoize],w.prototype,"onDidChangeFocus",null),ke([b.memoize],w.prototype,"onDidChangeSelection",null);function D(P,N){const{text:M,iconOffsets:R}=N;if(!R||R.length===0)return I(P,M);const x=(0,u.ltrim)(M," "),O=M.length-x.length,B=I(P,x);if(B)for(const W of B){const V=R[W.start+O]+O;W.start+=V,W.end+=V}return B}function I(P,N){const M=N.toLowerCase().indexOf(P.toLowerCase());return M!==-1?[{start:M,end:M+P.length}]:null}function T(P,N,M){const R=P.labelHighlights||[],x=N.labelHighlights||[];return R.length&&!x.length?-1:!R.length&&x.length?1:R.length===0&&x.length===0?0:(0,v.compareAnything)(P.saneSortLabel,N.saneSortLabel,M)}class A{getWidgetAriaLabel(){return(0,f.localize)(0,null)}getAriaLabel(N){var M;return!((M=N.separator)===null||M===void 0)&&M.label?`${N.saneAriaLabel}, ${N.separator.label}`:N.saneAriaLabel}getWidgetRole(){return"listbox"}getRole(N){return N.hasCheckbox?"checkbox":"option"}isChecked(N){if(N.hasCheckbox)return{value:N.checked,onDidChange:N.onChecked}}}}),define(se[367],oe([1,0,7,46,159,13,14,26,6,2,17,100,28,748,70,366,350,178]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputHoverDelegate=e.InputBox=e.QuickPick=e.backButton=void 0,e.backButton={iconClass:i.ThemeIcon.asClassName(p.Codicon.quickInputBack),tooltip:(0,n.localize)(0,null),handle:-1};class f extends v.Disposable{constructor(o){super(),this.ui=o,this._widgetUpdated=!1,this.visible=!1,this._enabled=!0,this._busy=!1,this._ignoreFocusOut=!1,this._buttons=[],this.buttonsUpdated=!1,this._toggles=[],this.togglesUpdated=!1,this.noValidationMessage=f.noPromptMessage,this._severity=a.default.Ignore,this.onDidTriggerButtonEmitter=this._register(new _.Emitter),this.onDidHideEmitter=this._register(new _.Emitter),this.onDisposeEmitter=this._register(new _.Emitter),this.visibleDisposables=this._register(new v.DisposableStore),this.onDidHide=this.onDidHideEmitter.event}get title(){return this._title}set title(o){this._title=o,this.update()}get description(){return this._description}set description(o){this._description=o,this.update()}get step(){return this._steps}set step(o){this._steps=o,this.update()}get totalSteps(){return this._totalSteps}set totalSteps(o){this._totalSteps=o,this.update()}get enabled(){return this._enabled}set enabled(o){this._enabled=o,this.update()}get contextKey(){return this._contextKey}set contextKey(o){this._contextKey=o,this.update()}get busy(){return this._busy}set busy(o){this._busy=o,this.update()}get ignoreFocusOut(){return this._ignoreFocusOut}set ignoreFocusOut(o){const g=this._ignoreFocusOut!==o&&!b.isIOS;this._ignoreFocusOut=o&&!b.isIOS,g&&this.update()}get buttons(){return this._buttons}set buttons(o){this._buttons=o,this.buttonsUpdated=!0,this.update()}get toggles(){return this._toggles}set toggles(o){this._toggles=o??[],this.togglesUpdated=!0,this.update()}get validationMessage(){return this._validationMessage}set validationMessage(o){this._validationMessage=o,this.update()}get severity(){return this._severity}set severity(o){this._severity=o,this.update()}show(){this.visible||(this.visibleDisposables.add(this.ui.onDidTriggerButton(o=>{this.buttons.indexOf(o)!==-1&&this.onDidTriggerButtonEmitter.fire(o)})),this.ui.show(this),this.visible=!0,this._lastValidationMessage=void 0,this._lastSeverity=void 0,this.buttons.length&&(this.buttonsUpdated=!0),this.toggles.length&&(this.togglesUpdated=!0),this.update())}hide(){this.visible&&this.ui.hide()}didHide(o=t.QuickInputHideReason.Other){this.visible=!1,this.visibleDisposables.clear(),this.onDidHideEmitter.fire({reason:o})}update(){var o,g;if(!this.visible)return;const h=this.getTitle();h&&this.ui.title.textContent!==h?this.ui.title.textContent=h:!h&&this.ui.title.innerHTML!=="&nbsp;"&&(this.ui.title.innerText="\xA0");const m=this.getDescription();if(this.ui.description1.textContent!==m&&(this.ui.description1.textContent=m),this.ui.description2.textContent!==m&&(this.ui.description2.textContent=m),this._widgetUpdated&&(this._widgetUpdated=!1,this._widget?L.reset(this.ui.widget,this._widget):L.reset(this.ui.widget)),this.busy&&!this.busyDelay&&(this.busyDelay=new S.TimeoutTimer,this.busyDelay.setIfNotSet(()=>{this.visible&&this.ui.progressBar.infinite()},800)),!this.busy&&this.busyDelay&&(this.ui.progressBar.stop(),this.busyDelay.cancel(),this.busyDelay=void 0),this.buttonsUpdated){this.buttonsUpdated=!1,this.ui.leftActionBar.clear();const w=this.buttons.filter(I=>I===e.backButton).map((I,T)=>(0,u.quickInputButtonToAction)(I,`id-${T}`,async()=>this.onDidTriggerButtonEmitter.fire(I)));this.ui.leftActionBar.push(w,{icon:!0,label:!1}),this.ui.rightActionBar.clear();const D=this.buttons.filter(I=>I!==e.backButton).map((I,T)=>(0,u.quickInputButtonToAction)(I,`id-${T}`,async()=>this.onDidTriggerButtonEmitter.fire(I)));this.ui.rightActionBar.push(D,{icon:!0,label:!1})}if(this.togglesUpdated){this.togglesUpdated=!1;const w=(g=(o=this.toggles)===null||o===void 0?void 0:o.filter(D=>D instanceof y.Toggle))!==null&&g!==void 0?g:[];this.ui.inputBox.toggles=w}this.ui.ignoreFocusOut=this.ignoreFocusOut,this.ui.setEnabled(this.enabled),this.ui.setContextKey(this.contextKey);const C=this.validationMessage||this.noValidationMessage;this._lastValidationMessage!==C&&(this._lastValidationMessage=C,L.reset(this.ui.message),(0,u.renderQuickInputDescription)(C,this.ui.message,{callback:w=>{this.ui.linkOpenerDelegate(w)},disposables:this.visibleDisposables})),this._lastSeverity!==this.severity&&(this._lastSeverity=this.severity,this.showMessageDecoration(this.severity))}getTitle(){return this.title&&this.step?`${this.title} (${this.getSteps()})`:this.title?this.title:this.step?this.getSteps():""}getDescription(){return this.description||""}getSteps(){return this.step&&this.totalSteps?(0,n.localize)(2,null,this.step,this.totalSteps):this.step?String(this.step):""}showMessageDecoration(o){if(this.ui.inputBox.showDecoration(o),o!==a.default.Ignore){const g=this.ui.inputBox.stylesForType(o);this.ui.message.style.color=g.foreground?`${g.foreground}`:"",this.ui.message.style.backgroundColor=g.background?`${g.background}`:"",this.ui.message.style.border=g.border?`1px solid ${g.border}`:"",this.ui.message.style.marginBottom="-2px"}else this.ui.message.style.color="",this.ui.message.style.backgroundColor="",this.ui.message.style.border="",this.ui.message.style.marginBottom=""}dispose(){this.hide(),this.onDisposeEmitter.fire(),super.dispose()}}f.noPromptMessage=(0,n.localize)(1,null);class c extends f{constructor(){super(...arguments),this._value="",this.onDidChangeValueEmitter=this._register(new _.Emitter),this.onWillAcceptEmitter=this._register(new _.Emitter),this.onDidAcceptEmitter=this._register(new _.Emitter),this.onDidCustomEmitter=this._register(new _.Emitter),this._items=[],this.itemsUpdated=!1,this._canSelectMany=!1,this._canAcceptInBackground=!1,this._matchOnDescription=!1,this._matchOnDetail=!1,this._matchOnLabel=!0,this._matchOnLabelMode="fuzzy",this._sortByLabel=!0,this._keepScrollPosition=!1,this._itemActivation=t.ItemActivation.FIRST,this._activeItems=[],this.activeItemsUpdated=!1,this.activeItemsToConfirm=[],this.onDidChangeActiveEmitter=this._register(new _.Emitter),this._selectedItems=[],this.selectedItemsUpdated=!1,this.selectedItemsToConfirm=[],this.onDidChangeSelectionEmitter=this._register(new _.Emitter),this.onDidTriggerItemButtonEmitter=this._register(new _.Emitter),this.onDidTriggerSeparatorButtonEmitter=this._register(new _.Emitter),this.valueSelectionUpdated=!0,this._ok="default",this._customButton=!1,this.filterValue=o=>o,this.onDidChangeValue=this.onDidChangeValueEmitter.event,this.onWillAccept=this.onWillAcceptEmitter.event,this.onDidAccept=this.onDidAcceptEmitter.event,this.onDidChangeActive=this.onDidChangeActiveEmitter.event,this.onDidChangeSelection=this.onDidChangeSelectionEmitter.event,this.onDidTriggerItemButton=this.onDidTriggerItemButtonEmitter.event,this.onDidTriggerSeparatorButton=this.onDidTriggerSeparatorButtonEmitter.event}get quickNavigate(){return this._quickNavigate}set quickNavigate(o){this._quickNavigate=o,this.update()}get value(){return this._value}set value(o){this.doSetValue(o)}doSetValue(o,g){this._value!==o&&(this._value=o,g||this.update(),this.visible&&this.ui.list.filter(this.filterValue(this._value))&&this.trySelectFirst(),this.onDidChangeValueEmitter.fire(this._value))}set ariaLabel(o){this._ariaLabel=o,this.update()}get ariaLabel(){return this._ariaLabel}get placeholder(){return this._placeholder}set placeholder(o){this._placeholder=o,this.update()}get items(){return this._items}get scrollTop(){return this.ui.list.scrollTop}set scrollTop(o){this.ui.list.scrollTop=o}set items(o){this._items=o,this.itemsUpdated=!0,this.update()}get canSelectMany(){return this._canSelectMany}set canSelectMany(o){this._canSelectMany=o,this.update()}get canAcceptInBackground(){return this._canAcceptInBackground}set canAcceptInBackground(o){this._canAcceptInBackground=o}get matchOnDescription(){return this._matchOnDescription}set matchOnDescription(o){this._matchOnDescription=o,this.update()}get matchOnDetail(){return this._matchOnDetail}set matchOnDetail(o){this._matchOnDetail=o,this.update()}get matchOnLabel(){return this._matchOnLabel}set matchOnLabel(o){this._matchOnLabel=o,this.update()}get matchOnLabelMode(){return this._matchOnLabelMode}set matchOnLabelMode(o){this._matchOnLabelMode=o,this.update()}get sortByLabel(){return this._sortByLabel}set sortByLabel(o){this._sortByLabel=o,this.update()}get keepScrollPosition(){return this._keepScrollPosition}set keepScrollPosition(o){this._keepScrollPosition=o}get itemActivation(){return this._itemActivation}set itemActivation(o){this._itemActivation=o}get activeItems(){return this._activeItems}set activeItems(o){this._activeItems=o,this.activeItemsUpdated=!0,this.update()}get selectedItems(){return this._selectedItems}set selectedItems(o){this._selectedItems=o,this.selectedItemsUpdated=!0,this.update()}get keyMods(){return this._quickNavigate?t.NO_KEY_MODS:this.ui.keyMods}set valueSelection(o){this._valueSelection=o,this.valueSelectionUpdated=!0,this.update()}get customButton(){return this._customButton}set customButton(o){this._customButton=o,this.update()}get customLabel(){return this._customButtonLabel}set customLabel(o){this._customButtonLabel=o,this.update()}get customHover(){return this._customButtonHover}set customHover(o){this._customButtonHover=o,this.update()}get ok(){return this._ok}set ok(o){this._ok=o,this.update()}get hideInput(){return!!this._hideInput}set hideInput(o){this._hideInput=o,this.update()}trySelectFirst(){this.canSelectMany||this.ui.list.focus(r.QuickInputListFocus.First)}show(){this.visible||(this.visibleDisposables.add(this.ui.inputBox.onDidChange(o=>{this.doSetValue(o,!0)})),this.visibleDisposables.add((this._hideInput?this.ui.list:this.ui.inputBox).onKeyDown(o=>{switch(o.keyCode){case 18:this.ui.list.focus(r.QuickInputListFocus.Next),this.canSelectMany&&this.ui.list.domFocus(),L.EventHelper.stop(o,!0);break;case 16:this.ui.list.getFocusedElements().length?this.ui.list.focus(r.QuickInputListFocus.Previous):this.ui.list.focus(r.QuickInputListFocus.Last),this.canSelectMany&&this.ui.list.domFocus(),L.EventHelper.stop(o,!0);break;case 12:this.ui.list.focus(r.QuickInputListFocus.NextPage),this.canSelectMany&&this.ui.list.domFocus(),L.EventHelper.stop(o,!0);break;case 11:this.ui.list.focus(r.QuickInputListFocus.PreviousPage),this.canSelectMany&&this.ui.list.domFocus(),L.EventHelper.stop(o,!0);break;case 17:if(!this._canAcceptInBackground||!this.ui.inputBox.isSelectionAtEnd())return;this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems),this.handleAccept(!0));break;case 14:(o.ctrlKey||o.metaKey)&&!o.shiftKey&&!o.altKey&&(this.ui.list.focus(r.QuickInputListFocus.First),L.EventHelper.stop(o,!0));break;case 13:(o.ctrlKey||o.metaKey)&&!o.shiftKey&&!o.altKey&&(this.ui.list.focus(r.QuickInputListFocus.Last),L.EventHelper.stop(o,!0));break}})),this.visibleDisposables.add(this.ui.onDidAccept(()=>{this.canSelectMany?this.ui.list.getCheckedElements().length||(this._selectedItems=[],this.onDidChangeSelectionEmitter.fire(this.selectedItems)):this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems)),this.handleAccept(!1)})),this.visibleDisposables.add(this.ui.onDidCustom(()=>{this.onDidCustomEmitter.fire()})),this.visibleDisposables.add(this.ui.list.onDidChangeFocus(o=>{this.activeItemsUpdated||this.activeItemsToConfirm!==this._activeItems&&(0,E.equals)(o,this._activeItems,(g,h)=>g===h)||(this._activeItems=o,this.onDidChangeActiveEmitter.fire(o))})),this.visibleDisposables.add(this.ui.list.onDidChangeSelection(({items:o,event:g})=>{if(this.canSelectMany){o.length&&this.ui.list.setSelectedElements([]);return}this.selectedItemsToConfirm!==this._selectedItems&&(0,E.equals)(o,this._selectedItems,(h,m)=>h===m)||(this._selectedItems=o,this.onDidChangeSelectionEmitter.fire(o),o.length&&this.handleAccept(L.isMouseEvent(g)&&g.button===1))})),this.visibleDisposables.add(this.ui.list.onChangedCheckedElements(o=>{this.canSelectMany&&(this.selectedItemsToConfirm!==this._selectedItems&&(0,E.equals)(o,this._selectedItems,(g,h)=>g===h)||(this._selectedItems=o,this.onDidChangeSelectionEmitter.fire(o)))})),this.visibleDisposables.add(this.ui.list.onButtonTriggered(o=>this.onDidTriggerItemButtonEmitter.fire(o))),this.visibleDisposables.add(this.ui.list.onSeparatorButtonTriggered(o=>this.onDidTriggerSeparatorButtonEmitter.fire(o))),this.visibleDisposables.add(this.registerQuickNavigation()),this.valueSelectionUpdated=!0),super.show()}handleAccept(o){let g=!1;this.onWillAcceptEmitter.fire({veto:()=>g=!0}),g||this.onDidAcceptEmitter.fire({inBackground:o})}registerQuickNavigation(){return L.addDisposableListener(this.ui.container,L.EventType.KEY_UP,o=>{if(this.canSelectMany||!this._quickNavigate)return;const g=new k.StandardKeyboardEvent(o),h=g.keyCode;this._quickNavigate.keybindings.some(w=>{const D=w.getChords();return D.length>1?!1:D[0].shiftKey&&h===4?!(g.ctrlKey||g.altKey||g.metaKey):!!(D[0].altKey&&h===6||D[0].ctrlKey&&h===5||D[0].metaKey&&h===57)})&&(this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems),this.handleAccept(!1)),this._quickNavigate=void 0)})}update(){if(!this.visible)return;const o=this.keepScrollPosition?this.scrollTop:0,g=!!this.description,h={title:!!this.title||!!this.step||!!this.buttons.length,description:g,checkAll:this.canSelectMany&&!this._hideCheckAll,checkBox:this.canSelectMany,inputBox:!this._hideInput,progressBar:!this._hideInput||g,visibleCount:!0,count:this.canSelectMany&&!this._hideCountBadge,ok:this.ok==="default"?this.canSelectMany:this.ok,list:!0,message:!!this.validationMessage,customButton:this.customButton};this.ui.setVisibilities(h),super.update(),this.ui.inputBox.value!==this.value&&(this.ui.inputBox.value=this.value),this.valueSelectionUpdated&&(this.valueSelectionUpdated=!1,this.ui.inputBox.select(this._valueSelection&&{start:this._valueSelection[0],end:this._valueSelection[1]})),this.ui.inputBox.placeholder!==(this.placeholder||"")&&(this.ui.inputBox.placeholder=this.placeholder||"");let m=this.ariaLabel;if(!m&&h.inputBox&&(m=this.placeholder||c.DEFAULT_ARIA_LABEL,this.title&&(m+=` - ${this.title}`)),this.ui.list.ariaLabel!==m&&(this.ui.list.ariaLabel=m??null),this.ui.list.matchOnDescription=this.matchOnDescription,this.ui.list.matchOnDetail=this.matchOnDetail,this.ui.list.matchOnLabel=this.matchOnLabel,this.ui.list.matchOnLabelMode=this.matchOnLabelMode,this.ui.list.sortByLabel=this.sortByLabel,this.itemsUpdated)switch(this.itemsUpdated=!1,this.ui.list.setElements(this.items),this.ui.list.filter(this.filterValue(this.ui.inputBox.value)),this.ui.checkAll.checked=this.ui.list.getAllVisibleChecked(),this.ui.visibleCount.setCount(this.ui.list.getVisibleCount()),this.ui.count.setCount(this.ui.list.getCheckedCount()),this._itemActivation){case t.ItemActivation.NONE:this._itemActivation=t.ItemActivation.FIRST;break;case t.ItemActivation.SECOND:this.ui.list.focus(r.QuickInputListFocus.Second),this._itemActivation=t.ItemActivation.FIRST;break;case t.ItemActivation.LAST:this.ui.list.focus(r.QuickInputListFocus.Last),this._itemActivation=t.ItemActivation.FIRST;break;default:this.trySelectFirst();break}this.ui.container.classList.contains("show-checkboxes")!==!!this.canSelectMany&&(this.canSelectMany?this.ui.list.clearFocus():this.trySelectFirst()),this.activeItemsUpdated&&(this.activeItemsUpdated=!1,this.activeItemsToConfirm=this._activeItems,this.ui.list.setFocusedElements(this.activeItems),this.activeItemsToConfirm===this._activeItems&&(this.activeItemsToConfirm=null)),this.selectedItemsUpdated&&(this.selectedItemsUpdated=!1,this.selectedItemsToConfirm=this._selectedItems,this.canSelectMany?this.ui.list.setCheckedElements(this.selectedItems):this.ui.list.setSelectedElements(this.selectedItems),this.selectedItemsToConfirm===this._selectedItems&&(this.selectedItemsToConfirm=null)),this.ui.customButton.label=this.customLabel||"",this.ui.customButton.element.title=this.customHover||"",h.inputBox||(this.ui.list.domFocus(),this.canSelectMany&&this.ui.list.focus(r.QuickInputListFocus.First)),this.keepScrollPosition&&(this.scrollTop=o)}}e.QuickPick=c,c.DEFAULT_ARIA_LABEL=(0,n.localize)(3,null);class d extends f{constructor(){super(...arguments),this._value="",this.valueSelectionUpdated=!0,this._password=!1,this.onDidValueChangeEmitter=this._register(new _.Emitter),this.onDidAcceptEmitter=this._register(new _.Emitter),this.onDidChangeValue=this.onDidValueChangeEmitter.event,this.onDidAccept=this.onDidAcceptEmitter.event}get value(){return this._value}set value(o){this._value=o||"",this.update()}get placeholder(){return this._placeholder}set placeholder(o){this._placeholder=o,this.update()}get password(){return this._password}set password(o){this._password=o,this.update()}show(){this.visible||(this.visibleDisposables.add(this.ui.inputBox.onDidChange(o=>{o!==this.value&&(this._value=o,this.onDidValueChangeEmitter.fire(o))})),this.visibleDisposables.add(this.ui.onDidAccept(()=>this.onDidAcceptEmitter.fire())),this.valueSelectionUpdated=!0),super.show()}update(){if(!this.visible)return;this.ui.container.classList.remove("hidden-input");const o={title:!!this.title||!!this.step||!!this.buttons.length,description:!!this.description||!!this.step,inputBox:!0,message:!0,progressBar:!0};this.ui.setVisibilities(o),super.update(),this.ui.inputBox.value!==this.value&&(this.ui.inputBox.value=this.value),this.valueSelectionUpdated&&(this.valueSelectionUpdated=!1,this.ui.inputBox.select(this._valueSelection&&{start:this._valueSelection[0],end:this._valueSelection[1]})),this.ui.inputBox.placeholder!==(this.placeholder||"")&&(this.ui.inputBox.placeholder=this.placeholder||""),this.ui.inputBox.password!==this.password&&(this.ui.inputBox.password=this.password)}}e.InputBox=d;class s{get delay(){return Date.now()-this.lastHoverHideTime<200?0:this.configurationService.getValue("workbench.hover.delay")}constructor(o,g){this.configurationService=o,this.hoverService=g,this.lastHoverHideTime=0,this.placement="element"}showHover(o,g){var h;const m=(o.content instanceof HTMLElement?(h=o.content.textContent)!==null&&h!==void 0?h:"":typeof o.content=="string"?o.content:o.content.value).length>20;return this.hoverService.showHover({...o,persistence:{hideOnKeyDown:!1},appearance:{showHoverHint:m,skipFadeInAnimation:!0}},g)}onDidHideHover(){this.lastHoverHideTime=Date.now()}}e.QuickInputHoverDelegate=s}),define(se[850],oe([1,0,7,78,229,319,590,19,6,2,100,749,70,788,366,367,44]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputController=void 0;const f=L.$;class c extends v.Disposable{constructor(s,l,o){super(),this.options=s,this.themeService=l,this.layoutService=o,this.enabled=!0,this.onDidAcceptEmitter=this._register(new _.Emitter),this.onDidCustomEmitter=this._register(new _.Emitter),this.onDidTriggerButtonEmitter=this._register(new _.Emitter),this.keyMods={ctrlCmd:!1,alt:!1},this.controller=null,this.onShowEmitter=this._register(new _.Emitter),this.onShow=this.onShowEmitter.event,this.onHideEmitter=this._register(new _.Emitter),this.onHide=this.onHideEmitter.event,this.idPrefix=s.idPrefix,this.parentElement=s.container,this.styles=s.styles,this._register(_.Event.runAndSubscribe(L.onDidRegisterWindow,({window:g,disposables:h})=>this.registerKeyModsListeners(g,h),{window:u.mainWindow,disposables:this._store})),this._register(L.onWillUnregisterWindow(g=>{this.ui&&L.getWindow(this.ui.container)===g&&this.reparentUI(this.layoutService.mainContainer)}))}registerKeyModsListeners(s,l){const o=g=>{this.keyMods.ctrlCmd=g.ctrlKey||g.metaKey,this.keyMods.alt=g.altKey};for(const g of[L.EventType.KEY_DOWN,L.EventType.KEY_UP,L.EventType.MOUSE_DOWN])l.add(L.addDisposableListener(s,g,o,!0))}getUI(s){if(this.ui)return s&&this.parentElement.ownerDocument!==this.layoutService.activeContainer.ownerDocument&&this.reparentUI(this.layoutService.activeContainer),this.ui;const l=L.append(this.parentElement,f(".quick-input-widget.show-file-icons"));l.tabIndex=-1,l.style.display="none";const o=L.createStyleSheet(l),g=L.append(l,f(".quick-input-titlebar")),h=this._register(new k.ActionBar(g,{hoverDelegate:this.options.hoverDelegate}));h.domNode.classList.add("quick-input-left-action-bar");const m=L.append(g,f(".quick-input-title")),C=this._register(new k.ActionBar(g,{hoverDelegate:this.options.hoverDelegate}));C.domNode.classList.add("quick-input-right-action-bar");const w=L.append(l,f(".quick-input-header")),D=L.append(w,f("input.quick-input-check-all"));D.type="checkbox",D.setAttribute("aria-label",(0,a.localize)(0,null)),this._register(L.addStandardDisposableListener(D,L.EventType.CHANGE,J=>{const Q=D.checked;ne.setAllVisibleChecked(Q)})),this._register(L.addDisposableListener(D,L.EventType.CLICK,J=>{(J.x||J.y)&&P.setFocus()}));const I=L.append(w,f(".quick-input-description")),T=L.append(w,f(".quick-input-and-message")),A=L.append(T,f(".quick-input-filter")),P=this._register(new n.QuickInputBox(A,this.styles.inputBox,this.styles.toggle));P.setAttribute("aria-describedby",`${this.idPrefix}message`);const N=L.append(A,f(".quick-input-visible-count"));N.setAttribute("aria-live","polite"),N.setAttribute("aria-atomic","true");const M=new E.CountBadge(N,{countFormat:(0,a.localize)(1,null)},this.styles.countBadge),R=L.append(A,f(".quick-input-count"));R.setAttribute("aria-live","polite");const x=new E.CountBadge(R,{countFormat:(0,a.localize)(2,null)},this.styles.countBadge),O=L.append(w,f(".quick-input-action")),B=this._register(new y.Button(O,this.styles.button));B.label=(0,a.localize)(3,null),this._register(B.onDidClick(J=>{this.onDidAcceptEmitter.fire()}));const W=L.append(w,f(".quick-input-action")),V=this._register(new y.Button(W,{...this.styles.button,supportIcons:!0}));V.label=(0,a.localize)(4,null),this._register(V.onDidClick(J=>{this.onDidCustomEmitter.fire()}));const K=L.append(T,f(`#${this.idPrefix}message.quick-input-message`)),F=this._register(new S.ProgressBar(l,this.styles.progressBar));F.getContainer().classList.add("quick-input-progress");const q=L.append(l,f(".quick-input-html-widget"));q.tabIndex=-1;const ie=L.append(l,f(".quick-input-description")),ae=this.idPrefix+"list",ne=this._register(new t.QuickInputList(l,ae,this.options,this.themeService));P.setAttribute("aria-controls",ae),this._register(ne.onDidChangeFocus(()=>{var J;P.setAttribute("aria-activedescendant",(J=ne.getActiveDescendant())!==null&&J!==void 0?J:"")})),this._register(ne.onChangedAllVisibleChecked(J=>{D.checked=J})),this._register(ne.onChangedVisibleCount(J=>{M.setCount(J)})),this._register(ne.onChangedCheckedCount(J=>{x.setCount(J)})),this._register(ne.onLeave(()=>{setTimeout(()=>{P.setFocus(),this.controller instanceof r.QuickPick&&this.controller.canSelectMany&&ne.clearFocus()},0)}));const $=L.trackFocus(l);return this._register($),this._register(L.addDisposableListener(l,L.EventType.FOCUS,J=>{L.isAncestor(J.relatedTarget,l)||(this.previousFocusElement=J.relatedTarget instanceof HTMLElement?J.relatedTarget:void 0)},!0)),this._register($.onDidBlur(()=>{!this.getUI().ignoreFocusOut&&!this.options.ignoreFocusOut()&&this.hide(i.QuickInputHideReason.Blur),this.previousFocusElement=void 0})),this._register(L.addDisposableListener(l,L.EventType.FOCUS,J=>{P.setFocus()})),this._register(L.addStandardDisposableListener(l,L.EventType.KEY_DOWN,J=>{if(!L.isAncestor(J.target,q))switch(J.keyCode){case 3:L.EventHelper.stop(J,!0),this.enabled&&this.onDidAcceptEmitter.fire();break;case 9:L.EventHelper.stop(J,!0),this.hide(i.QuickInputHideReason.Gesture);break;case 2:if(!J.altKey&&!J.ctrlKey&&!J.metaKey){const Q=[".quick-input-list .monaco-action-bar .always-visible",".quick-input-list-entry:hover .monaco-action-bar",".monaco-list-row.focused .monaco-action-bar"];if(l.classList.contains("show-checkboxes")?Q.push("input"):Q.push("input[type=text]"),this.getUI().list.isDisplayed()&&Q.push(".monaco-list"),this.getUI().message&&Q.push(".quick-input-message a"),this.getUI().widget){if(L.isAncestor(J.target,this.getUI().widget))break;Q.push(".quick-input-html-widget")}const re=l.querySelectorAll(Q.join(", "));J.shiftKey&&J.target===re[0]?(L.EventHelper.stop(J,!0),ne.clearFocus()):!J.shiftKey&&L.isAncestor(J.target,re[re.length-1])&&(L.EventHelper.stop(J,!0),re[0].focus())}break;case 10:J.ctrlKey&&(L.EventHelper.stop(J,!0),this.getUI().list.toggleHover());break}})),this.ui={container:l,styleSheet:o,leftActionBar:h,titleBar:g,title:m,description1:ie,description2:I,widget:q,rightActionBar:C,checkAll:D,inputContainer:T,filterContainer:A,inputBox:P,visibleCountContainer:N,visibleCount:M,countContainer:R,count:x,okContainer:O,ok:B,message:K,customButtonContainer:W,customButton:V,list:ne,progressBar:F,onDidAccept:this.onDidAcceptEmitter.event,onDidCustom:this.onDidCustomEmitter.event,onDidTriggerButton:this.onDidTriggerButtonEmitter.event,ignoreFocusOut:!1,keyMods:this.keyMods,show:J=>this.show(J),hide:()=>this.hide(),setVisibilities:J=>this.setVisibilities(J),setEnabled:J=>this.setEnabled(J),setContextKey:J=>this.options.setContextKey(J),linkOpenerDelegate:J=>this.options.linkOpenerDelegate(J)},this.updateStyles(),this.ui}reparentUI(s){this.ui&&(this.parentElement=s,L.append(this.parentElement,this.ui.container))}pick(s,l={},o=p.CancellationToken.None){return new Promise((g,h)=>{let m=I=>{var T;m=g,(T=l.onKeyMods)===null||T===void 0||T.call(l,C.keyMods),g(I)};if(o.isCancellationRequested){m(void 0);return}const C=this.createQuickPick();let w;const D=[C,C.onDidAccept(()=>{if(C.canSelectMany)m(C.selectedItems.slice()),C.hide();else{const I=C.activeItems[0];I&&(m(I),C.hide())}}),C.onDidChangeActive(I=>{const T=I[0];T&&l.onDidFocus&&l.onDidFocus(T)}),C.onDidChangeSelection(I=>{if(!C.canSelectMany){const T=I[0];T&&(m(T),C.hide())}}),C.onDidTriggerItemButton(I=>l.onDidTriggerItemButton&&l.onDidTriggerItemButton({...I,removeItem:()=>{const T=C.items.indexOf(I.item);if(T!==-1){const A=C.items.slice(),P=A.splice(T,1),N=C.activeItems.filter(R=>R!==P[0]),M=C.keepScrollPosition;C.keepScrollPosition=!0,C.items=A,N&&(C.activeItems=N),C.keepScrollPosition=M}}})),C.onDidTriggerSeparatorButton(I=>{var T;return(T=l.onDidTriggerSeparatorButton)===null||T===void 0?void 0:T.call(l,I)}),C.onDidChangeValue(I=>{w&&!I&&(C.activeItems.length!==1||C.activeItems[0]!==w)&&(C.activeItems=[w])}),o.onCancellationRequested(()=>{C.hide()}),C.onDidHide(()=>{(0,v.dispose)(D),m(void 0)})];C.title=l.title,C.canSelectMany=!!l.canPickMany,C.placeholder=l.placeHolder,C.ignoreFocusOut=!!l.ignoreFocusLost,C.matchOnDescription=!!l.matchOnDescription,C.matchOnDetail=!!l.matchOnDetail,C.matchOnLabel=l.matchOnLabel===void 0||l.matchOnLabel,C.quickNavigate=l.quickNavigate,C.hideInput=!!l.hideInput,C.contextKey=l.contextKey,C.busy=!0,Promise.all([s,l.activeItem]).then(([I,T])=>{w=T,C.busy=!1,C.items=I,C.canSelectMany&&(C.selectedItems=I.filter(A=>A.type!=="separator"&&A.picked)),w&&(C.activeItems=[w])}),C.show(),Promise.resolve(s).then(void 0,I=>{h(I),C.hide()})})}createQuickPick(){const s=this.getUI(!0);return new r.QuickPick(s)}createInputBox(){const s=this.getUI(!0);return new r.InputBox(s)}show(s){const l=this.getUI(!0);this.onShowEmitter.fire();const o=this.controller;this.controller=s,o?.didHide(),this.setEnabled(!0),l.leftActionBar.clear(),l.title.textContent="",l.description1.textContent="",l.description2.textContent="",L.reset(l.widget),l.rightActionBar.clear(),l.checkAll.checked=!1,l.inputBox.placeholder="",l.inputBox.password=!1,l.inputBox.showDecoration(b.default.Ignore),l.visibleCount.setCount(0),l.count.setCount(0),L.reset(l.message),l.progressBar.stop(),l.list.setElements([]),l.list.matchOnDescription=!1,l.list.matchOnDetail=!1,l.list.matchOnLabel=!0,l.list.sortByLabel=!0,l.ignoreFocusOut=!1,l.inputBox.toggles=void 0;const g=this.options.backKeybindingLabel();r.backButton.tooltip=g?(0,a.localize)(5,null,g):(0,a.localize)(6,null),l.container.style.display="",this.updateLayout(),l.inputBox.setFocus()}isVisible(){return!!this.ui&&this.ui.container.style.display!=="none"}setVisibilities(s){const l=this.getUI();l.title.style.display=s.title?"":"none",l.description1.style.display=s.description&&(s.inputBox||s.checkAll)?"":"none",l.description2.style.display=s.description&&!(s.inputBox||s.checkAll)?"":"none",l.checkAll.style.display=s.checkAll?"":"none",l.inputContainer.style.display=s.inputBox?"":"none",l.filterContainer.style.display=s.inputBox?"":"none",l.visibleCountContainer.style.display=s.visibleCount?"":"none",l.countContainer.style.display=s.count?"":"none",l.okContainer.style.display=s.ok?"":"none",l.customButtonContainer.style.display=s.customButton?"":"none",l.message.style.display=s.message?"":"none",l.progressBar.getContainer().style.display=s.progressBar?"":"none",l.list.display(!!s.list),l.container.classList.toggle("show-checkboxes",!!s.checkBox),l.container.classList.toggle("hidden-input",!s.inputBox&&!s.description),this.updateLayout()}setEnabled(s){if(s!==this.enabled){this.enabled=s;for(const l of this.getUI().leftActionBar.viewItems)l.action.enabled=s;for(const l of this.getUI().rightActionBar.viewItems)l.action.enabled=s;this.getUI().checkAll.disabled=!s,this.getUI().inputBox.enabled=s,this.getUI().ok.enabled=s,this.getUI().list.enabled=s}}hide(s){var l,o;const g=this.controller;if(!g)return;const h=(l=this.ui)===null||l===void 0?void 0:l.container,m=h&&!L.isAncestorOfActiveElement(h);if(this.controller=null,this.onHideEmitter.fire(),h&&(h.style.display="none"),!m){let C=this.previousFocusElement;for(;C&&!C.offsetParent;)C=(o=C.parentElement)!==null&&o!==void 0?o:void 0;C?.offsetParent?(C.focus(),this.previousFocusElement=void 0):this.options.returnFocus()}g.didHide(s)}layout(s,l){this.dimension=s,this.titleBarOffset=l,this.updateLayout()}updateLayout(){if(this.ui&&this.isVisible()){this.ui.container.style.top=`${this.titleBarOffset}px`;const s=this.ui.container.style,l=Math.min(this.dimension.width*.62,c.MAX_WIDTH);s.width=l+"px",s.marginLeft="-"+l/2+"px",this.ui.inputBox.layout(),this.ui.list.layout(this.dimension&&this.dimension.height*.4)}}applyStyles(s){this.styles=s,this.updateStyles()}updateStyles(){if(this.ui){const{quickInputTitleBackground:s,quickInputBackground:l,quickInputForeground:o,widgetBorder:g,widgetShadow:h}=this.styles.widget;this.ui.titleBar.style.backgroundColor=s??"",this.ui.container.style.backgroundColor=l??"",this.ui.container.style.color=o??"",this.ui.container.style.border=g?`1px solid ${g}`:"",this.ui.container.style.boxShadow=h?`0 0 8px 2px ${h}`:"",this.ui.list.style(this.styles.list);const m=[];this.styles.pickerGroup.pickerGroupBorder&&m.push(`.quick-input-list .quick-input-list-entry { border-top-color:  ${this.styles.pickerGroup.pickerGroupBorder}; }`),this.styles.pickerGroup.pickerGroupForeground&&m.push(`.quick-input-list .quick-input-list-separator { color:  ${this.styles.pickerGroup.pickerGroupForeground}; }`),this.styles.pickerGroup.pickerGroupForeground&&m.push(".quick-input-list .quick-input-list-separator-as-item { color: var(--vscode-descriptionForeground); }"),(this.styles.keybindingLabel.keybindingLabelBackground||this.styles.keybindingLabel.keybindingLabelBorder||this.styles.keybindingLabel.keybindingLabelBottomBorder||this.styles.keybindingLabel.keybindingLabelShadow||this.styles.keybindingLabel.keybindingLabelForeground)&&(m.push(".quick-input-list .monaco-keybinding > .monaco-keybinding-key {"),this.styles.keybindingLabel.keybindingLabelBackground&&m.push(`background-color: ${this.styles.keybindingLabel.keybindingLabelBackground};`),this.styles.keybindingLabel.keybindingLabelBorder&&m.push(`border-color: ${this.styles.keybindingLabel.keybindingLabelBorder};`),this.styles.keybindingLabel.keybindingLabelBottomBorder&&m.push(`border-bottom-color: ${this.styles.keybindingLabel.keybindingLabelBottomBorder};`),this.styles.keybindingLabel.keybindingLabelShadow&&m.push(`box-shadow: inset 0 -1px 0 ${this.styles.keybindingLabel.keybindingLabelShadow};`),this.styles.keybindingLabel.keybindingLabelForeground&&m.push(`color: ${this.styles.keybindingLabel.keybindingLabelForeground};`),m.push("}"));const C=m.join(`
+`);C!==this.ui.styleSheet.textContent&&(this.ui.styleSheet.textContent=C)}}}e.QuickInputController=c,c.MAX_WIDTH=600}),define(se[23],oe([1,0,6,2,8,37,89]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Themable=e.registerThemingParticipant=e.Extensions=e.getThemeTypeSelector=e.themeColorFromId=e.IThemeService=void 0,e.IThemeService=(0,y.createDecorator)("themeService");function p(n){return{id:n}}e.themeColorFromId=p;function _(n){switch(n){case S.ColorScheme.DARK:return"vs-dark";case S.ColorScheme.HIGH_CONTRAST_DARK:return"hc-black";case S.ColorScheme.HIGH_CONTRAST_LIGHT:return"hc-light";default:return"vs"}}e.getThemeTypeSelector=_,e.Extensions={ThemingContribution:"base.contributions.theming"};class v{constructor(){this.themingParticipants=[],this.themingParticipants=[],this.onThemingParticipantAddedEmitter=new L.Emitter}onColorThemeChange(t){return this.themingParticipants.push(t),this.onThemingParticipantAddedEmitter.fire(t),(0,k.toDisposable)(()=>{const r=this.themingParticipants.indexOf(t);this.themingParticipants.splice(r,1)})}getThemingParticipants(){return this.themingParticipants}}const b=new v;E.Registry.add(e.Extensions.ThemingContribution,b);function a(n){return b.onColorThemeChange(n)}e.registerThemingParticipant=a;class i extends k.Disposable{constructor(t){super(),this.themeService=t,this.theme=t.getColorTheme(),this._register(this.themeService.onDidColorThemeChange(r=>this.onThemeChange(r)))}onThemeChange(t){this.theme=t,this.updateStyles()}updateStyles(){}}e.Themable=i}),define(se[851],oe([1,0,6,2,66,23]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlobalStyleSheet=e.AbstractCodeEditorService=void 0;let S=class extends k.Disposable{constructor(v){super(),this._themeService=v,this._onWillCreateCodeEditor=this._register(new L.Emitter),this._onCodeEditorAdd=this._register(new L.Emitter),this.onCodeEditorAdd=this._onCodeEditorAdd.event,this._onCodeEditorRemove=this._register(new L.Emitter),this.onCodeEditorRemove=this._onCodeEditorRemove.event,this._onWillCreateDiffEditor=this._register(new L.Emitter),this._onDiffEditorAdd=this._register(new L.Emitter),this.onDiffEditorAdd=this._onDiffEditorAdd.event,this._onDiffEditorRemove=this._register(new L.Emitter),this.onDiffEditorRemove=this._onDiffEditorRemove.event,this._decorationOptionProviders=new Map,this._codeEditorOpenHandlers=new y.LinkedList,this._modelProperties=new Map,this._codeEditors=Object.create(null),this._diffEditors=Object.create(null),this._globalStyleSheet=null}willCreateCodeEditor(){this._onWillCreateCodeEditor.fire()}addCodeEditor(v){this._codeEditors[v.getId()]=v,this._onCodeEditorAdd.fire(v)}removeCodeEditor(v){delete this._codeEditors[v.getId()]&&this._onCodeEditorRemove.fire(v)}listCodeEditors(){return Object.keys(this._codeEditors).map(v=>this._codeEditors[v])}willCreateDiffEditor(){this._onWillCreateDiffEditor.fire()}addDiffEditor(v){this._diffEditors[v.getId()]=v,this._onDiffEditorAdd.fire(v)}listDiffEditors(){return Object.keys(this._diffEditors).map(v=>this._diffEditors[v])}getFocusedCodeEditor(){let v=null;const b=this.listCodeEditors();for(const a of b){if(a.hasTextFocus())return a;a.hasWidgetFocus()&&(v=a)}return v}removeDecorationType(v){const b=this._decorationOptionProviders.get(v);b&&(b.refCount--,b.refCount<=0&&(this._decorationOptionProviders.delete(v),b.dispose(),this.listCodeEditors().forEach(a=>a.removeDecorationsByType(v))))}setModelProperty(v,b,a){const i=v.toString();let n;this._modelProperties.has(i)?n=this._modelProperties.get(i):(n=new Map,this._modelProperties.set(i,n)),n.set(b,a)}getModelProperty(v,b){const a=v.toString();if(this._modelProperties.has(a))return this._modelProperties.get(a).get(b)}async openCodeEditor(v,b,a){for(const i of this._codeEditorOpenHandlers){const n=await i(v,b,a);if(n!==null)return n}return null}registerCodeEditorOpenHandler(v){const b=this._codeEditorOpenHandlers.unshift(v);return(0,k.toDisposable)(b)}};e.AbstractCodeEditorService=S,e.AbstractCodeEditorService=S=ke([ge(0,E.IThemeService)],S);class p{constructor(v){this._styleSheet=v}}e.GlobalStyleSheet=p}),define(se[852],oe([1,0,45,23,29,244,59,8,789,2,7,34,46,69,123,44]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HoverService=void 0;let u=class{constructor(s,l,o,g,h,m){this._instantiationService=s,this._contextViewService=l,this._keybindingService=g,this._layoutService=h,this._accessibilityService=m,o.onDidShowContextMenu(()=>this.hideHover())}showHover(s,l,o){var g,h,m,C;if(f(this._currentHoverOptions)===f(s)||this._currentHover&&(!((h=(g=this._currentHoverOptions)===null||g===void 0?void 0:g.persistence)===null||h===void 0)&&h.sticky))return;this._currentHoverOptions=s,this._lastHoverOptions=s;const w=s.trapFocus||this._accessibilityService.isScreenReaderOptimized(),D=(0,b.getActiveElement)();o||(w&&D?this._lastFocusedElementBeforeOpen=D:this._lastFocusedElementBeforeOpen=void 0);const I=new v.DisposableStore,T=this._instantiationService.createInstance(_.HoverWidget,s);if(!((m=s.persistence)===null||m===void 0)&&m.sticky&&(T.isLocked=!0),T.onDispose(()=>{var P,N;((P=this._currentHover)===null||P===void 0?void 0:P.domNode)&&(0,b.isAncestorOfActiveElement)(this._currentHover.domNode)&&((N=this._lastFocusedElementBeforeOpen)===null||N===void 0||N.focus()),this._currentHoverOptions===s&&(this._currentHoverOptions=void 0),I.dispose()}),!s.container){const P=s.target instanceof HTMLElement?s.target:s.target.targetElements[0];s.container=this._layoutService.getContainer((0,b.getWindow)(P))}const A=this._contextViewService;if(A.showContextView(new c(T,l),s.container),T.onRequestLayout(()=>A.layout()),!((C=s.persistence)===null||C===void 0)&&C.sticky)I.add((0,b.addDisposableListener)((0,b.getWindow)(s.container).document,b.EventType.MOUSE_DOWN,P=>{(0,b.isAncestor)(P.target,T.domNode)||this.doHideHover()}));else{if("targetElements"in s.target)for(const N of s.target.targetElements)I.add((0,b.addDisposableListener)(N,b.EventType.CLICK,()=>this.hideHover()));else I.add((0,b.addDisposableListener)(s.target,b.EventType.CLICK,()=>this.hideHover()));const P=(0,b.getActiveElement)();if(P){const N=(0,b.getWindow)(P).document;I.add((0,b.addDisposableListener)(P,b.EventType.KEY_DOWN,M=>{var R;return this._keyDown(M,T,!!(!((R=s.persistence)===null||R===void 0)&&R.hideOnKeyDown))})),I.add((0,b.addDisposableListener)(N,b.EventType.KEY_DOWN,M=>{var R;return this._keyDown(M,T,!!(!((R=s.persistence)===null||R===void 0)&&R.hideOnKeyDown))})),I.add((0,b.addDisposableListener)(P,b.EventType.KEY_UP,M=>this._keyUp(M,T))),I.add((0,b.addDisposableListener)(N,b.EventType.KEY_UP,M=>this._keyUp(M,T)))}}if("IntersectionObserver"in r.mainWindow){const P=new IntersectionObserver(M=>this._intersectionChange(M,T),{threshold:0}),N="targetElements"in s.target?s.target.targetElements[0]:s.target;P.observe(N),I.add((0,v.toDisposable)(()=>P.disconnect()))}return this._currentHover=T,T}hideHover(){var s;!((s=this._currentHover)===null||s===void 0)&&s.isLocked||!this._currentHoverOptions||this.doHideHover()}doHideHover(){this._currentHover=void 0,this._currentHoverOptions=void 0,this._contextViewService.hideContextView()}_intersectionChange(s,l){s[s.length-1].isIntersecting||l.dispose()}_keyDown(s,l,o){var g,h;if(s.key==="Alt"){l.isLocked=!0;return}const m=new i.StandardKeyboardEvent(s);this._keybindingService.resolveKeyboardEvent(m).getSingleModifierDispatchChords().some(w=>!!w)||this._keybindingService.softDispatch(m,m.target).kind!==0||o&&(!(!((g=this._currentHoverOptions)===null||g===void 0)&&g.trapFocus)||s.key!=="Tab")&&(this.hideHover(),(h=this._lastFocusedElementBeforeOpen)===null||h===void 0||h.focus())}_keyUp(s,l){var o;s.key==="Alt"&&(l.isLocked=!1,l.isMouseIn||(this.hideHover(),(o=this._lastFocusedElementBeforeOpen)===null||o===void 0||o.focus()))}};e.HoverService=u,e.HoverService=u=ke([ge(0,p.IInstantiationService),ge(1,S.IContextViewService),ge(2,S.IContextMenuService),ge(3,a.IKeybindingService),ge(4,t.ILayoutService),ge(5,n.IAccessibilityService)],u);function f(d){var s;if(d!==void 0)return(s=d?.id)!==null&&s!==void 0?s:d}class c{get anchorPosition(){return this._hover.anchor}constructor(s,l=!1){this._hover=s,this._focus=l}render(s){return this._hover.render(s),this._focus&&this._hover.focus(),this._hover}getAnchor(){return{x:this._hover.x,y:this._hover.y}}layout(){this._hover.layout()}}(0,L.registerSingleton)(E.IHoverService,u,1),(0,k.registerThemingParticipant)((d,s)=>{const l=d.getColor(y.editorHoverBorder);l&&(s.addRule(`.monaco-workbench .workbench-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${l.transparent(.5)}; }`),s.addRule(`.monaco-workbench .workbench-hover hr { border-top: 1px solid ${l.transparent(.5)}; }`))})}),define(se[853],oe([1,0,7,40,77,56,23]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorScrollbar=void 0;class p extends E.ViewPart{constructor(v,b,a,i){super(v);const n=this._context.configuration.options,t=n.get(102),r=n.get(74),u=n.get(40),f=n.get(105),c={listenOnDomNode:a.domNode,className:"editor-scrollable "+(0,S.getThemeTypeSelector)(v.theme.type),useShadows:!1,lazyRender:!0,vertical:t.vertical,horizontal:t.horizontal,verticalHasArrows:t.verticalHasArrows,horizontalHasArrows:t.horizontalHasArrows,verticalScrollbarSize:t.verticalScrollbarSize,verticalSliderSize:t.verticalSliderSize,horizontalScrollbarSize:t.horizontalScrollbarSize,horizontalSliderSize:t.horizontalSliderSize,handleMouseWheel:t.handleMouseWheel,alwaysConsumeMouseWheel:t.alwaysConsumeMouseWheel,arrowSize:t.arrowSize,mouseWheelScrollSensitivity:r,fastScrollSensitivity:u,scrollPredominantAxis:f,scrollByPage:t.scrollByPage};this.scrollbar=this._register(new y.SmoothScrollableElement(b.domNode,c,this._context.viewLayout.getScrollable())),E.PartFingerprints.write(this.scrollbar.getDomNode(),6),this.scrollbarDomNode=(0,k.createFastDomNode)(this.scrollbar.getDomNode()),this.scrollbarDomNode.setPosition("absolute"),this._setLayout();const d=(s,l,o)=>{const g={};if(l){const h=s.scrollTop;h&&(g.scrollTop=this._context.viewLayout.getCurrentScrollTop()+h,s.scrollTop=0)}if(o){const h=s.scrollLeft;h&&(g.scrollLeft=this._context.viewLayout.getCurrentScrollLeft()+h,s.scrollLeft=0)}this._context.viewModel.viewLayout.setScrollPosition(g,1)};this._register(L.addDisposableListener(a.domNode,"scroll",s=>d(a.domNode,!0,!0))),this._register(L.addDisposableListener(b.domNode,"scroll",s=>d(b.domNode,!0,!1))),this._register(L.addDisposableListener(i.domNode,"scroll",s=>d(i.domNode,!0,!1))),this._register(L.addDisposableListener(this.scrollbarDomNode.domNode,"scroll",s=>d(this.scrollbarDomNode.domNode,!0,!1)))}dispose(){super.dispose()}_setLayout(){const v=this._context.configuration.options,b=v.get(143);this.scrollbarDomNode.setLeft(b.contentLeft),v.get(72).side==="right"?this.scrollbarDomNode.setWidth(b.contentWidth+b.minimap.minimapWidth):this.scrollbarDomNode.setWidth(b.contentWidth),this.scrollbarDomNode.setHeight(b.height)}getOverviewRulerLayoutInfo(){return this.scrollbar.getOverviewRulerLayoutInfo()}getDomNode(){return this.scrollbarDomNode}delegateVerticalScrollbarPointerDown(v){this.scrollbar.delegateVerticalScrollbarPointerDown(v)}delegateScrollFromMouseWheelEvent(v){this.scrollbar.delegateScrollFromMouseWheelEvent(v)}onConfigurationChanged(v){if(v.hasChanged(102)||v.hasChanged(74)||v.hasChanged(40)){const b=this._context.configuration.options,a=b.get(102),i=b.get(74),n=b.get(40),t=b.get(105),r={vertical:a.vertical,horizontal:a.horizontal,verticalScrollbarSize:a.verticalScrollbarSize,horizontalScrollbarSize:a.horizontalScrollbarSize,scrollByPage:a.scrollByPage,handleMouseWheel:a.handleMouseWheel,mouseWheelScrollSensitivity:i,fastScrollSensitivity:n,scrollPredominantAxis:t};this.scrollbar.updateOptions(r)}return v.hasChanged(143)&&this._setLayout(),!0}onScrollChanged(v){return!0}onThemeChanged(v){return this.scrollbar.updateClassName("editor-scrollable "+(0,S.getThemeTypeSelector)(this._context.theme.type)),!0}prepareRender(v){}render(v){this.scrollbar.renderNow()}}e.EditorScrollbar=p}),define(se[854],oe([1,0,115,29,23,444]),function(te,e,L,k,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectionsOverlay=void 0;class E{constructor(i){this.left=i.left,this.width=i.width,this.startStyle=null,this.endStyle=null}}class S{constructor(i,n){this.lineNumber=i,this.ranges=n}}function p(a){return new E(a)}function _(a){return new S(a.lineNumber,a.ranges.map(p))}class v extends L.DynamicViewOverlay{constructor(i){super(),this._previousFrameVisibleRangesWithStyle=[],this._context=i;const n=this._context.configuration.options;this._lineHeight=n.get(66),this._roundedSelection=n.get(100),this._typicalHalfwidthCharacterWidth=n.get(50).typicalHalfwidthCharacterWidth,this._selections=[],this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(i){const n=this._context.configuration.options;return this._lineHeight=n.get(66),this._roundedSelection=n.get(100),this._typicalHalfwidthCharacterWidth=n.get(50).typicalHalfwidthCharacterWidth,!0}onCursorStateChanged(i){return this._selections=i.selections.slice(0),!0}onDecorationsChanged(i){return!0}onFlushed(i){return!0}onLinesChanged(i){return!0}onLinesDeleted(i){return!0}onLinesInserted(i){return!0}onScrollChanged(i){return i.scrollTopChanged}onZonesChanged(i){return!0}_visibleRangesHaveGaps(i){for(let n=0,t=i.length;n<t;n++)if(i[n].ranges.length>1)return!0;return!1}_enrichVisibleRangesWithStyle(i,n,t){const r=this._typicalHalfwidthCharacterWidth/4;let u=null,f=null;if(t&&t.length>0&&n.length>0){const c=n[0].lineNumber;if(c===i.startLineNumber)for(let s=0;!u&&s<t.length;s++)t[s].lineNumber===c&&(u=t[s].ranges[0]);const d=n[n.length-1].lineNumber;if(d===i.endLineNumber)for(let s=t.length-1;!f&&s>=0;s--)t[s].lineNumber===d&&(f=t[s].ranges[0]);u&&!u.startStyle&&(u=null),f&&!f.startStyle&&(f=null)}for(let c=0,d=n.length;c<d;c++){const s=n[c].ranges[0],l=s.left,o=s.left+s.width,g={top:0,bottom:0},h={top:0,bottom:0};if(c>0){const m=n[c-1].ranges[0].left,C=n[c-1].ranges[0].left+n[c-1].ranges[0].width;b(l-m)<r?g.top=2:l>m&&(g.top=1),b(o-C)<r?h.top=2:m<o&&o<C&&(h.top=1)}else u&&(g.top=u.startStyle.top,h.top=u.endStyle.top);if(c+1<d){const m=n[c+1].ranges[0].left,C=n[c+1].ranges[0].left+n[c+1].ranges[0].width;b(l-m)<r?g.bottom=2:m<l&&l<C&&(g.bottom=1),b(o-C)<r?h.bottom=2:o<C&&(h.bottom=1)}else f&&(g.bottom=f.startStyle.bottom,h.bottom=f.endStyle.bottom);s.startStyle=g,s.endStyle=h}}_getVisibleRangesWithStyle(i,n,t){const u=(n.linesVisibleRangesForRange(i,!0)||[]).map(_);return!this._visibleRangesHaveGaps(u)&&this._roundedSelection&&this._enrichVisibleRangesWithStyle(n.visibleRange,u,t),u}_createSelectionPiece(i,n,t,r,u){return'<div class="cslr '+t+'" style="top:'+i.toString()+"px;left:"+r.toString()+"px;width:"+u.toString()+"px;height:"+n+'px;"></div>'}_actualRenderOneSelection(i,n,t,r){if(r.length===0)return;const u=!!r[0].ranges[0].startStyle,f=this._lineHeight.toString(),c=(this._lineHeight-1).toString(),d=r[0].lineNumber,s=r[r.length-1].lineNumber;for(let l=0,o=r.length;l<o;l++){const g=r[l],h=g.lineNumber,m=h-n,C=t&&(h===s||h===d)?c:f,w=t&&h===d?1:0;let D="",I="";for(let T=0,A=g.ranges.length;T<A;T++){const P=g.ranges[T];if(u){const M=P.startStyle,R=P.endStyle;if(M.top===1||M.bottom===1){D+=this._createSelectionPiece(w,C,v.SELECTION_CLASS_NAME,P.left-v.ROUNDED_PIECE_WIDTH,v.ROUNDED_PIECE_WIDTH);let x=v.EDITOR_BACKGROUND_CLASS_NAME;M.top===1&&(x+=" "+v.SELECTION_TOP_RIGHT),M.bottom===1&&(x+=" "+v.SELECTION_BOTTOM_RIGHT),D+=this._createSelectionPiece(w,C,x,P.left-v.ROUNDED_PIECE_WIDTH,v.ROUNDED_PIECE_WIDTH)}if(R.top===1||R.bottom===1){D+=this._createSelectionPiece(w,C,v.SELECTION_CLASS_NAME,P.left+P.width,v.ROUNDED_PIECE_WIDTH);let x=v.EDITOR_BACKGROUND_CLASS_NAME;R.top===1&&(x+=" "+v.SELECTION_TOP_LEFT),R.bottom===1&&(x+=" "+v.SELECTION_BOTTOM_LEFT),D+=this._createSelectionPiece(w,C,x,P.left+P.width,v.ROUNDED_PIECE_WIDTH)}}let N=v.SELECTION_CLASS_NAME;if(u){const M=P.startStyle,R=P.endStyle;M.top===0&&(N+=" "+v.SELECTION_TOP_LEFT),M.bottom===0&&(N+=" "+v.SELECTION_BOTTOM_LEFT),R.top===0&&(N+=" "+v.SELECTION_TOP_RIGHT),R.bottom===0&&(N+=" "+v.SELECTION_BOTTOM_RIGHT)}I+=this._createSelectionPiece(w,C,N,P.left,P.width)}i[m][0]+=D,i[m][1]+=I}}prepareRender(i){const n=[],t=i.visibleRange.startLineNumber,r=i.visibleRange.endLineNumber;for(let f=t;f<=r;f++){const c=f-t;n[c]=["",""]}const u=[];for(let f=0,c=this._selections.length;f<c;f++){const d=this._selections[f];if(d.isEmpty()){u[f]=null;continue}const s=this._getVisibleRangesWithStyle(d,i,this._previousFrameVisibleRangesWithStyle[f]);u[f]=s,this._actualRenderOneSelection(n,t,this._selections.length>1,s)}this._previousFrameVisibleRangesWithStyle=u,this._renderResult=n.map(([f,c])=>f+c)}render(i,n){if(!this._renderResult)return"";const t=n-i;return t<0||t>=this._renderResult.length?"":this._renderResult[t]}}e.SelectionsOverlay=v,v.SELECTION_CLASS_NAME="selected-text",v.SELECTION_TOP_LEFT="top-left-radius",v.SELECTION_BOTTOM_LEFT="bottom-left-radius",v.SELECTION_TOP_RIGHT="top-right-radius",v.SELECTION_BOTTOM_RIGHT="bottom-right-radius",v.EDITOR_BACKGROUND_CLASS_NAME="monaco-editor-background",v.ROUNDED_PIECE_WIDTH=10,(0,y.registerThemingParticipant)((a,i)=>{const n=a.getColor(k.editorSelectionForeground);n&&!n.isTransparent()&&i.addRule(`.monaco-editor .view-line span.inline-selected-text { color: ${n}; }`)});function b(a){return a<0?-a:a}}),define(se[368],oe([1,0,7,40,197,2,35,87,10,300,29,23]),function(te,e,L,k,y,E,S,p,_,v,b,a){"use strict";var i;Object.defineProperty(e,"__esModule",{value:!0}),e.OverviewRulerFeature=void 0;let n=i=class extends E.Disposable{constructor(r,u,f,c,d,s,l){super(),this._editors=r,this._rootElement=u,this._diffModel=f,this._rootWidth=c,this._rootHeight=d,this._modifiedEditorLayoutInfo=s,this._themeService=l,this.width=i.ENTIRE_DIFF_OVERVIEW_WIDTH;const o=(0,S.observableFromEvent)(this._themeService.onDidColorThemeChange,()=>this._themeService.getColorTheme()),g=(0,S.derived)(C=>{const w=o.read(C),D=w.getColor(b.diffOverviewRulerInserted)||(w.getColor(b.diffInserted)||b.defaultInsertColor).transparent(2),I=w.getColor(b.diffOverviewRulerRemoved)||(w.getColor(b.diffRemoved)||b.defaultRemoveColor).transparent(2);return{insertColor:D,removeColor:I}}),h=(0,k.createFastDomNode)(document.createElement("div"));h.setClassName("diffViewport"),h.setPosition("absolute");const m=(0,L.h)("div.diffOverview",{style:{position:"absolute",top:"0px",width:i.ENTIRE_DIFF_OVERVIEW_WIDTH+"px"}}).root;this._register((0,p.appendRemoveOnDispose)(m,h.domNode)),this._register((0,L.addStandardDisposableListener)(m,L.EventType.POINTER_DOWN,C=>{this._editors.modified.delegateVerticalScrollbarPointerDown(C)})),this._register((0,L.addDisposableListener)(m,L.EventType.MOUSE_WHEEL,C=>{this._editors.modified.delegateScrollFromMouseWheelEvent(C)},{passive:!1})),this._register((0,p.appendRemoveOnDispose)(this._rootElement,m)),this._register((0,S.autorunWithStore)((C,w)=>{const D=this._diffModel.read(C),I=this._editors.original.createOverviewRuler("original diffOverviewRuler");I&&(w.add(I),w.add((0,p.appendRemoveOnDispose)(m,I.getDomNode())));const T=this._editors.modified.createOverviewRuler("modified diffOverviewRuler");if(T&&(w.add(T),w.add((0,p.appendRemoveOnDispose)(m,T.getDomNode()))),!I||!T)return;const A=(0,S.observableSignalFromEvent)("viewZoneChanged",this._editors.original.onDidChangeViewZones),P=(0,S.observableSignalFromEvent)("viewZoneChanged",this._editors.modified.onDidChangeViewZones),N=(0,S.observableSignalFromEvent)("hiddenRangesChanged",this._editors.original.onDidChangeHiddenAreas),M=(0,S.observableSignalFromEvent)("hiddenRangesChanged",this._editors.modified.onDidChangeHiddenAreas);w.add((0,S.autorun)(R=>{var x;A.read(R),P.read(R),N.read(R),M.read(R);const O=g.read(R),B=(x=D?.diff.read(R))===null||x===void 0?void 0:x.mappings;function W(F,q,ie){const ae=ie._getViewModel();return ae?F.filter(ne=>ne.length>0).map(ne=>{const $=ae.coordinatesConverter.convertModelPositionToViewPosition(new _.Position(ne.startLineNumber,1)),J=ae.coordinatesConverter.convertModelPositionToViewPosition(new _.Position(ne.endLineNumberExclusive,1)),Q=J.lineNumber-$.lineNumber;return new v.OverviewRulerZone($.lineNumber,J.lineNumber,Q,q.toString())}):[]}const V=W((B||[]).map(F=>F.lineRangeMapping.original),O.removeColor,this._editors.original),K=W((B||[]).map(F=>F.lineRangeMapping.modified),O.insertColor,this._editors.modified);I?.setZones(V),T?.setZones(K)})),w.add((0,S.autorun)(R=>{const x=this._rootHeight.read(R),O=this._rootWidth.read(R),B=this._modifiedEditorLayoutInfo.read(R);if(B){const W=i.ENTIRE_DIFF_OVERVIEW_WIDTH-2*i.ONE_OVERVIEW_WIDTH;I.setLayout({top:0,height:x,right:W+i.ONE_OVERVIEW_WIDTH,width:i.ONE_OVERVIEW_WIDTH}),T.setLayout({top:0,height:x,right:0,width:i.ONE_OVERVIEW_WIDTH});const V=this._editors.modifiedScrollTop.read(R),K=this._editors.modifiedScrollHeight.read(R),F=this._editors.modified.getOption(102),q=new y.ScrollbarState(F.verticalHasArrows?F.arrowSize:0,F.verticalScrollbarSize,0,B.height,K,V);h.setTop(q.getSliderPosition()),h.setHeight(q.getSliderSize())}else h.setTop(0),h.setHeight(0);m.style.height=x+"px",m.style.left=O-i.ENTIRE_DIFF_OVERVIEW_WIDTH+"px",h.setWidth(i.ENTIRE_DIFF_OVERVIEW_WIDTH)}))}))}};e.OverviewRulerFeature=n,n.ONE_OVERVIEW_WIDTH=15,n.ENTIRE_DIFF_OVERVIEW_WIDTH=i.ONE_OVERVIEW_WIDTH*2,e.OverviewRulerFeature=n=i=ke([ge(6,a.IThemeService)],n)}),define(se[855],oe([1,0,6,2,35,368,36,623,8,34,10]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorEditors=void 0;let a=class extends k.Disposable{get onDidContentSizeChange(){return this._onDidContentSizeChange.event}constructor(n,t,r,u,f,c,d){super(),this.originalEditorElement=n,this.modifiedEditorElement=t,this._options=r,this._createInnerEditor=f,this._instantiationService=c,this._keybindingService=d,this._onDidContentSizeChange=this._register(new L.Emitter),this.original=this._register(this._createLeftHandSideEditor(r.editorOptions.get(),u.originalEditor||{})),this.modified=this._register(this._createRightHandSideEditor(r.editorOptions.get(),u.modifiedEditor||{})),this.modifiedModel=(0,y.observableFromEvent)(this.modified.onDidChangeModel,()=>this.modified.getModel()),this.modifiedScrollTop=(0,y.observableFromEvent)(this.modified.onDidScrollChange,()=>this.modified.getScrollTop()),this.modifiedScrollHeight=(0,y.observableFromEvent)(this.modified.onDidScrollChange,()=>this.modified.getScrollHeight()),this.modifiedSelections=(0,y.observableFromEvent)(this.modified.onDidChangeCursorSelection,()=>{var s;return(s=this.modified.getSelections())!==null&&s!==void 0?s:[]}),this.modifiedCursor=(0,y.observableFromEvent)(this.modified.onDidChangeCursorPosition,()=>{var s;return(s=this.modified.getPosition())!==null&&s!==void 0?s:new b.Position(1,1)}),this._register((0,y.autorunHandleChanges)({createEmptyChangeSummary:()=>({}),handleChange:(s,l)=>(s.didChange(r.editorOptions)&&Object.assign(l,s.change.changedOptions),!0)},(s,l)=>{r.editorOptions.read(s),this._options.renderSideBySide.read(s),this.modified.updateOptions(this._adjustOptionsForRightHandSide(s,l)),this.original.updateOptions(this._adjustOptionsForLeftHandSide(s,l))}))}_createLeftHandSideEditor(n,t){const r=this._adjustOptionsForLeftHandSide(void 0,n),u=this._constructInnerEditor(this._instantiationService,this.originalEditorElement,r,t);return u.setContextValue("isInDiffLeftEditor",!0),u}_createRightHandSideEditor(n,t){const r=this._adjustOptionsForRightHandSide(void 0,n),u=this._constructInnerEditor(this._instantiationService,this.modifiedEditorElement,r,t);return u.setContextValue("isInDiffRightEditor",!0),u}_constructInnerEditor(n,t,r,u){const f=this._createInnerEditor(n,t,r,u);return this._register(f.onDidContentSizeChange(c=>{const d=this.original.getContentWidth()+this.modified.getContentWidth()+E.OverviewRulerFeature.ENTIRE_DIFF_OVERVIEW_WIDTH,s=Math.max(this.modified.getContentHeight(),this.original.getContentHeight());this._onDidContentSizeChange.fire({contentHeight:s,contentWidth:d,contentHeightChanged:c.contentHeightChanged,contentWidthChanged:c.contentWidthChanged})})),f}_adjustOptionsForLeftHandSide(n,t){const r=this._adjustOptionsForSubEditor(t);return this._options.renderSideBySide.get()?(r.unicodeHighlight=this._options.editorOptions.get().unicodeHighlight||{},r.wordWrapOverride1=this._options.diffWordWrap.get()):(r.wordWrapOverride1="off",r.wordWrapOverride2="off",r.stickyScroll={enabled:!1},r.unicodeHighlight={nonBasicASCII:!1,ambiguousCharacters:!1,invisibleCharacters:!1}),r.glyphMargin=this._options.renderSideBySide.get(),t.originalAriaLabel&&(r.ariaLabel=t.originalAriaLabel),r.ariaLabel=this._updateAriaLabel(r.ariaLabel),r.readOnly=!this._options.originalEditable.get(),r.dropIntoEditor={enabled:!r.readOnly},r.extraEditorClassName="original-in-monaco-diff-editor",r}_adjustOptionsForRightHandSide(n,t){const r=this._adjustOptionsForSubEditor(t);return t.modifiedAriaLabel&&(r.ariaLabel=t.modifiedAriaLabel),r.ariaLabel=this._updateAriaLabel(r.ariaLabel),r.wordWrapOverride1=this._options.diffWordWrap.get(),r.revealHorizontalRightPadding=S.EditorOptions.revealHorizontalRightPadding.defaultValue+E.OverviewRulerFeature.ENTIRE_DIFF_OVERVIEW_WIDTH,r.scrollbar.verticalHasArrows=!1,r.extraEditorClassName="modified-in-monaco-diff-editor",r}_adjustOptionsForSubEditor(n){const t={...n,dimension:{height:0,width:0}};return t.inDiffEditor=!0,t.automaticLayout=!1,t.scrollbar={...t.scrollbar||{}},t.folding=!1,t.codeLens=this._options.diffCodeLens.get(),t.fixedOverflowWidgets=!0,t.minimap={...t.minimap||{}},t.minimap.enabled=!1,this._options.hideUnchangedRegions.get()?t.stickyScroll={enabled:!1}:t.stickyScroll=this._options.editorOptions.get().stickyScroll,t}_updateAriaLabel(n){var t;n||(n="");const r=(0,p.localize)(0,null,(t=this._keybindingService.lookupKeybinding("editor.action.accessibilityHelp"))===null||t===void 0?void 0:t.getAriaLabel());return this._options.accessibilityVerbose.get()?n+r:n?n.replaceAll(r,""):""}};e.DiffEditorEditors=a,e.DiffEditorEditors=a=ke([ge(5,_.IInstantiationService),ge(6,v.IKeybindingService)],a)}),define(se[83],oe([1,0,638,39,29,23]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.editorUnicodeHighlightBackground=e.editorUnicodeHighlightBorder=e.editorBracketPairGuideActiveBackground6=e.editorBracketPairGuideActiveBackground5=e.editorBracketPairGuideActiveBackground4=e.editorBracketPairGuideActiveBackground3=e.editorBracketPairGuideActiveBackground2=e.editorBracketPairGuideActiveBackground1=e.editorBracketPairGuideBackground6=e.editorBracketPairGuideBackground5=e.editorBracketPairGuideBackground4=e.editorBracketPairGuideBackground3=e.editorBracketPairGuideBackground2=e.editorBracketPairGuideBackground1=e.editorBracketHighlightingUnexpectedBracketForeground=e.editorBracketHighlightingForeground6=e.editorBracketHighlightingForeground5=e.editorBracketHighlightingForeground4=e.editorBracketHighlightingForeground3=e.editorBracketHighlightingForeground2=e.editorBracketHighlightingForeground1=e.overviewRulerInfo=e.overviewRulerWarning=e.overviewRulerError=e.overviewRulerRangeHighlight=e.ghostTextBackground=e.ghostTextForeground=e.ghostTextBorder=e.editorUnnecessaryCodeOpacity=e.editorUnnecessaryCodeBorder=e.editorGutter=e.editorOverviewRulerBackground=e.editorOverviewRulerBorder=e.editorBracketMatchBorder=e.editorBracketMatchBackground=e.editorCodeLensForeground=e.editorRuler=e.editorDimmedLineNumber=e.editorActiveLineNumber=e.editorActiveIndentGuide6=e.editorActiveIndentGuide5=e.editorActiveIndentGuide4=e.editorActiveIndentGuide3=e.editorActiveIndentGuide2=e.editorActiveIndentGuide1=e.editorIndentGuide6=e.editorIndentGuide5=e.editorIndentGuide4=e.editorIndentGuide3=e.editorIndentGuide2=e.editorIndentGuide1=e.deprecatedEditorActiveIndentGuides=e.deprecatedEditorIndentGuides=e.editorLineNumbers=e.editorWhitespaces=e.editorCursorBackground=e.editorCursorForeground=e.editorSymbolHighlightBorder=e.editorSymbolHighlight=e.editorRangeHighlightBorder=e.editorRangeHighlight=e.editorLineHighlightBorder=e.editorLineHighlight=void 0,e.editorLineHighlight=(0,y.registerColor)("editor.lineHighlightBackground",{dark:null,light:null,hcDark:null,hcLight:null},L.localize(0,null)),e.editorLineHighlightBorder=(0,y.registerColor)("editor.lineHighlightBorder",{dark:"#282828",light:"#eeeeee",hcDark:"#f38518",hcLight:y.contrastBorder},L.localize(1,null)),e.editorRangeHighlight=(0,y.registerColor)("editor.rangeHighlightBackground",{dark:"#ffffff0b",light:"#fdff0033",hcDark:null,hcLight:null},L.localize(2,null),!0),e.editorRangeHighlightBorder=(0,y.registerColor)("editor.rangeHighlightBorder",{dark:null,light:null,hcDark:y.activeContrastBorder,hcLight:y.activeContrastBorder},L.localize(3,null),!0),e.editorSymbolHighlight=(0,y.registerColor)("editor.symbolHighlightBackground",{dark:y.editorFindMatchHighlight,light:y.editorFindMatchHighlight,hcDark:null,hcLight:null},L.localize(4,null),!0),e.editorSymbolHighlightBorder=(0,y.registerColor)("editor.symbolHighlightBorder",{dark:null,light:null,hcDark:y.activeContrastBorder,hcLight:y.activeContrastBorder},L.localize(5,null),!0),e.editorCursorForeground=(0,y.registerColor)("editorCursor.foreground",{dark:"#AEAFAD",light:k.Color.black,hcDark:k.Color.white,hcLight:"#0F4A85"},L.localize(6,null)),e.editorCursorBackground=(0,y.registerColor)("editorCursor.background",null,L.localize(7,null)),e.editorWhitespaces=(0,y.registerColor)("editorWhitespace.foreground",{dark:"#e3e4e229",light:"#33333333",hcDark:"#e3e4e229",hcLight:"#CCCCCC"},L.localize(8,null)),e.editorLineNumbers=(0,y.registerColor)("editorLineNumber.foreground",{dark:"#858585",light:"#237893",hcDark:k.Color.white,hcLight:"#292929"},L.localize(9,null)),e.deprecatedEditorIndentGuides=(0,y.registerColor)("editorIndentGuide.background",{dark:e.editorWhitespaces,light:e.editorWhitespaces,hcDark:e.editorWhitespaces,hcLight:e.editorWhitespaces},L.localize(10,null),!1,L.localize(11,null)),e.deprecatedEditorActiveIndentGuides=(0,y.registerColor)("editorIndentGuide.activeBackground",{dark:e.editorWhitespaces,light:e.editorWhitespaces,hcDark:e.editorWhitespaces,hcLight:e.editorWhitespaces},L.localize(12,null),!1,L.localize(13,null)),e.editorIndentGuide1=(0,y.registerColor)("editorIndentGuide.background1",{dark:e.deprecatedEditorIndentGuides,light:e.deprecatedEditorIndentGuides,hcDark:e.deprecatedEditorIndentGuides,hcLight:e.deprecatedEditorIndentGuides},L.localize(14,null)),e.editorIndentGuide2=(0,y.registerColor)("editorIndentGuide.background2",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(15,null)),e.editorIndentGuide3=(0,y.registerColor)("editorIndentGuide.background3",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(16,null)),e.editorIndentGuide4=(0,y.registerColor)("editorIndentGuide.background4",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(17,null)),e.editorIndentGuide5=(0,y.registerColor)("editorIndentGuide.background5",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(18,null)),e.editorIndentGuide6=(0,y.registerColor)("editorIndentGuide.background6",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(19,null)),e.editorActiveIndentGuide1=(0,y.registerColor)("editorIndentGuide.activeBackground1",{dark:e.deprecatedEditorActiveIndentGuides,light:e.deprecatedEditorActiveIndentGuides,hcDark:e.deprecatedEditorActiveIndentGuides,hcLight:e.deprecatedEditorActiveIndentGuides},L.localize(20,null)),e.editorActiveIndentGuide2=(0,y.registerColor)("editorIndentGuide.activeBackground2",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(21,null)),e.editorActiveIndentGuide3=(0,y.registerColor)("editorIndentGuide.activeBackground3",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(22,null)),e.editorActiveIndentGuide4=(0,y.registerColor)("editorIndentGuide.activeBackground4",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(23,null)),e.editorActiveIndentGuide5=(0,y.registerColor)("editorIndentGuide.activeBackground5",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(24,null)),e.editorActiveIndentGuide6=(0,y.registerColor)("editorIndentGuide.activeBackground6",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(25,null));const S=(0,y.registerColor)("editorActiveLineNumber.foreground",{dark:"#c6c6c6",light:"#0B216F",hcDark:y.activeContrastBorder,hcLight:y.activeContrastBorder},L.localize(26,null),!1,L.localize(27,null));e.editorActiveLineNumber=(0,y.registerColor)("editorLineNumber.activeForeground",{dark:S,light:S,hcDark:S,hcLight:S},L.localize(28,null)),e.editorDimmedLineNumber=(0,y.registerColor)("editorLineNumber.dimmedForeground",{dark:null,light:null,hcDark:null,hcLight:null},L.localize(29,null)),e.editorRuler=(0,y.registerColor)("editorRuler.foreground",{dark:"#5A5A5A",light:k.Color.lightgrey,hcDark:k.Color.white,hcLight:"#292929"},L.localize(30,null)),e.editorCodeLensForeground=(0,y.registerColor)("editorCodeLens.foreground",{dark:"#999999",light:"#919191",hcDark:"#999999",hcLight:"#292929"},L.localize(31,null)),e.editorBracketMatchBackground=(0,y.registerColor)("editorBracketMatch.background",{dark:"#0064001a",light:"#0064001a",hcDark:"#0064001a",hcLight:"#0000"},L.localize(32,null)),e.editorBracketMatchBorder=(0,y.registerColor)("editorBracketMatch.border",{dark:"#888",light:"#B9B9B9",hcDark:y.contrastBorder,hcLight:y.contrastBorder},L.localize(33,null)),e.editorOverviewRulerBorder=(0,y.registerColor)("editorOverviewRuler.border",{dark:"#7f7f7f4d",light:"#7f7f7f4d",hcDark:"#7f7f7f4d",hcLight:"#666666"},L.localize(34,null)),e.editorOverviewRulerBackground=(0,y.registerColor)("editorOverviewRuler.background",null,L.localize(35,null)),e.editorGutter=(0,y.registerColor)("editorGutter.background",{dark:y.editorBackground,light:y.editorBackground,hcDark:y.editorBackground,hcLight:y.editorBackground},L.localize(36,null)),e.editorUnnecessaryCodeBorder=(0,y.registerColor)("editorUnnecessaryCode.border",{dark:null,light:null,hcDark:k.Color.fromHex("#fff").transparent(.8),hcLight:y.contrastBorder},L.localize(37,null)),e.editorUnnecessaryCodeOpacity=(0,y.registerColor)("editorUnnecessaryCode.opacity",{dark:k.Color.fromHex("#000a"),light:k.Color.fromHex("#0007"),hcDark:null,hcLight:null},L.localize(38,null)),e.ghostTextBorder=(0,y.registerColor)("editorGhostText.border",{dark:null,light:null,hcDark:k.Color.fromHex("#fff").transparent(.8),hcLight:k.Color.fromHex("#292929").transparent(.8)},L.localize(39,null)),e.ghostTextForeground=(0,y.registerColor)("editorGhostText.foreground",{dark:k.Color.fromHex("#ffffff56"),light:k.Color.fromHex("#0007"),hcDark:null,hcLight:null},L.localize(40,null)),e.ghostTextBackground=(0,y.registerColor)("editorGhostText.background",{dark:null,light:null,hcDark:null,hcLight:null},L.localize(41,null));const p=new k.Color(new k.RGBA(0,122,204,.6));e.overviewRulerRangeHighlight=(0,y.registerColor)("editorOverviewRuler.rangeHighlightForeground",{dark:p,light:p,hcDark:p,hcLight:p},L.localize(42,null),!0),e.overviewRulerError=(0,y.registerColor)("editorOverviewRuler.errorForeground",{dark:new k.Color(new k.RGBA(255,18,18,.7)),light:new k.Color(new k.RGBA(255,18,18,.7)),hcDark:new k.Color(new k.RGBA(255,50,50,1)),hcLight:"#B5200D"},L.localize(43,null)),e.overviewRulerWarning=(0,y.registerColor)("editorOverviewRuler.warningForeground",{dark:y.editorWarningForeground,light:y.editorWarningForeground,hcDark:y.editorWarningBorder,hcLight:y.editorWarningBorder},L.localize(44,null)),e.overviewRulerInfo=(0,y.registerColor)("editorOverviewRuler.infoForeground",{dark:y.editorInfoForeground,light:y.editorInfoForeground,hcDark:y.editorInfoBorder,hcLight:y.editorInfoBorder},L.localize(45,null)),e.editorBracketHighlightingForeground1=(0,y.registerColor)("editorBracketHighlight.foreground1",{dark:"#FFD700",light:"#0431FAFF",hcDark:"#FFD700",hcLight:"#0431FAFF"},L.localize(46,null)),e.editorBracketHighlightingForeground2=(0,y.registerColor)("editorBracketHighlight.foreground2",{dark:"#DA70D6",light:"#319331FF",hcDark:"#DA70D6",hcLight:"#319331FF"},L.localize(47,null)),e.editorBracketHighlightingForeground3=(0,y.registerColor)("editorBracketHighlight.foreground3",{dark:"#179FFF",light:"#7B3814FF",hcDark:"#87CEFA",hcLight:"#7B3814FF"},L.localize(48,null)),e.editorBracketHighlightingForeground4=(0,y.registerColor)("editorBracketHighlight.foreground4",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(49,null)),e.editorBracketHighlightingForeground5=(0,y.registerColor)("editorBracketHighlight.foreground5",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(50,null)),e.editorBracketHighlightingForeground6=(0,y.registerColor)("editorBracketHighlight.foreground6",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(51,null)),e.editorBracketHighlightingUnexpectedBracketForeground=(0,y.registerColor)("editorBracketHighlight.unexpectedBracket.foreground",{dark:new k.Color(new k.RGBA(255,18,18,.8)),light:new k.Color(new k.RGBA(255,18,18,.8)),hcDark:new k.Color(new k.RGBA(255,50,50,1)),hcLight:""},L.localize(52,null)),e.editorBracketPairGuideBackground1=(0,y.registerColor)("editorBracketPairGuide.background1",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(53,null)),e.editorBracketPairGuideBackground2=(0,y.registerColor)("editorBracketPairGuide.background2",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(54,null)),e.editorBracketPairGuideBackground3=(0,y.registerColor)("editorBracketPairGuide.background3",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(55,null)),e.editorBracketPairGuideBackground4=(0,y.registerColor)("editorBracketPairGuide.background4",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(56,null)),e.editorBracketPairGuideBackground5=(0,y.registerColor)("editorBracketPairGuide.background5",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(57,null)),e.editorBracketPairGuideBackground6=(0,y.registerColor)("editorBracketPairGuide.background6",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(58,null)),e.editorBracketPairGuideActiveBackground1=(0,y.registerColor)("editorBracketPairGuide.activeBackground1",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(59,null)),e.editorBracketPairGuideActiveBackground2=(0,y.registerColor)("editorBracketPairGuide.activeBackground2",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(60,null)),e.editorBracketPairGuideActiveBackground3=(0,y.registerColor)("editorBracketPairGuide.activeBackground3",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(61,null)),e.editorBracketPairGuideActiveBackground4=(0,y.registerColor)("editorBracketPairGuide.activeBackground4",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(62,null)),e.editorBracketPairGuideActiveBackground5=(0,y.registerColor)("editorBracketPairGuide.activeBackground5",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(63,null)),e.editorBracketPairGuideActiveBackground6=(0,y.registerColor)("editorBracketPairGuide.activeBackground6",{dark:"#00000000",light:"#00000000",hcDark:"#00000000",hcLight:"#00000000"},L.localize(64,null)),e.editorUnicodeHighlightBorder=(0,y.registerColor)("editorUnicodeHighlight.border",{dark:y.editorWarningForeground,light:y.editorWarningForeground,hcDark:y.editorWarningForeground,hcLight:y.editorWarningForeground},L.localize(65,null)),e.editorUnicodeHighlightBackground=(0,y.registerColor)("editorUnicodeHighlight.background",{dark:y.editorWarningBackground,light:y.editorWarningBackground,hcDark:y.editorWarningBackground,hcLight:y.editorWarningBackground},L.localize(66,null)),(0,E.registerThemingParticipant)((_,v)=>{const b=_.getColor(y.editorBackground),a=_.getColor(e.editorLineHighlight),i=a&&!a.isTransparent()?a:b;i&&v.addRule(`.monaco-editor .inputarea.ime-input { background-color: ${i}; }`)})}),define(se[856],oe([1,0,115,83,13,23,24,89,10,431]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CurrentLineMarginHighlightOverlay=e.CurrentLineHighlightOverlay=e.AbstractLineHighlightOverlay=void 0;class v extends L.DynamicViewOverlay{constructor(n){super(),this._context=n;const t=this._context.configuration.options,r=t.get(143);this._lineHeight=t.get(66),this._renderLineHighlight=t.get(95),this._renderLineHighlightOnlyWhenFocus=t.get(96),this._wordWrap=r.isViewportWrapping,this._contentLeft=r.contentLeft,this._contentWidth=r.contentWidth,this._selectionIsEmpty=!0,this._focused=!1,this._cursorLineNumbers=[1],this._selections=[new S.Selection(1,1,1,1)],this._renderData=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}_readFromSelections(){let n=!1;const t=new Set;for(const f of this._selections)t.add(f.positionLineNumber);const r=Array.from(t);r.sort((f,c)=>f-c),y.equals(this._cursorLineNumbers,r)||(this._cursorLineNumbers=r,n=!0);const u=this._selections.every(f=>f.isEmpty());return this._selectionIsEmpty!==u&&(this._selectionIsEmpty=u,n=!0),n}onThemeChanged(n){return this._readFromSelections()}onConfigurationChanged(n){const t=this._context.configuration.options,r=t.get(143);return this._lineHeight=t.get(66),this._renderLineHighlight=t.get(95),this._renderLineHighlightOnlyWhenFocus=t.get(96),this._wordWrap=r.isViewportWrapping,this._contentLeft=r.contentLeft,this._contentWidth=r.contentWidth,!0}onCursorStateChanged(n){return this._selections=n.selections,this._readFromSelections()}onFlushed(n){return!0}onLinesDeleted(n){return!0}onLinesInserted(n){return!0}onScrollChanged(n){return n.scrollWidthChanged||n.scrollTopChanged}onZonesChanged(n){return!0}onFocusChanged(n){return this._renderLineHighlightOnlyWhenFocus?(this._focused=n.isFocused,!0):!1}prepareRender(n){if(!this._shouldRenderThis()){this._renderData=null;return}const t=n.visibleRange.startLineNumber,r=n.visibleRange.endLineNumber,u=[];for(let c=t;c<=r;c++){const d=c-t;u[d]=""}if(this._wordWrap){const c=this._renderOne(n,!1);for(const d of this._cursorLineNumbers){const s=this._context.viewModel.coordinatesConverter,l=s.convertViewPositionToModelPosition(new _.Position(d,1)).lineNumber,o=s.convertModelPositionToViewPosition(new _.Position(l,1)).lineNumber,g=s.convertModelPositionToViewPosition(new _.Position(l,this._context.viewModel.model.getLineMaxColumn(l))).lineNumber,h=Math.max(o,t),m=Math.min(g,r);for(let C=h;C<=m;C++){const w=C-t;u[w]=c}}}const f=this._renderOne(n,!0);for(const c of this._cursorLineNumbers){if(c<t||c>r)continue;const d=c-t;u[d]=f}this._renderData=u}render(n,t){if(!this._renderData)return"";const r=t-n;return r>=this._renderData.length?"":this._renderData[r]}_shouldRenderInMargin(){return(this._renderLineHighlight==="gutter"||this._renderLineHighlight==="all")&&(!this._renderLineHighlightOnlyWhenFocus||this._focused)}_shouldRenderInContent(){return(this._renderLineHighlight==="line"||this._renderLineHighlight==="all")&&this._selectionIsEmpty&&(!this._renderLineHighlightOnlyWhenFocus||this._focused)}}e.AbstractLineHighlightOverlay=v;class b extends v{_renderOne(n,t){return`<div class="${"current-line"+(this._shouldRenderInMargin()?" current-line-both":"")+(t?" current-line-exact":"")}" style="width:${Math.max(n.scrollWidth,this._contentWidth)}px; height:${this._lineHeight}px;"></div>`}_shouldRenderThis(){return this._shouldRenderInContent()}_shouldRenderOther(){return this._shouldRenderInMargin()}}e.CurrentLineHighlightOverlay=b;class a extends v{_renderOne(n,t){return`<div class="${"current-line"+(this._shouldRenderInMargin()?" current-line-margin":"")+(this._shouldRenderOther()?" current-line-margin-both":"")+(this._shouldRenderInMargin()&&t?" current-line-exact-margin":"")}" style="width:${this._contentLeft}px; height:${this._lineHeight}px;"></div>`}_shouldRenderThis(){return!0}_shouldRenderOther(){return this._shouldRenderInContent()}}e.CurrentLineMarginHighlightOverlay=a,(0,E.registerThemingParticipant)((i,n)=>{const t=i.getColor(k.editorLineHighlight);if(t&&(n.addRule(`.monaco-editor .view-overlays .current-line { background-color: ${t}; }`),n.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { background-color: ${t}; border: none; }`)),!t||t.isTransparent()||i.defines(k.editorLineHighlightBorder)){const r=i.getColor(k.editorLineHighlightBorder);r&&(n.addRule(`.monaco-editor .view-overlays .current-line-exact { border: 2px solid ${r}; }`),n.addRule(`.monaco-editor .margin-view-overlays .current-line-exact-margin { border: 2px solid ${r}; }`),(0,p.isHighContrast)(i.type)&&(n.addRule(".monaco-editor .view-overlays .current-line-exact { border-width: 1px; }"),n.addRule(".monaco-editor .margin-view-overlays .current-line-exact-margin { border-width: 1px; }")))}})}),define(se[857],oe([1,0,115,83,23,10,13,20,297,212,434]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndentGuidesOverlay=void 0;class b extends L.DynamicViewOverlay{constructor(n){super(),this._context=n,this._primaryPosition=null;const t=this._context.configuration.options,r=t.get(144),u=t.get(50);this._lineHeight=t.get(66),this._spaceWidth=u.spaceWidth,this._maxIndentLeft=r.wrappingColumn===-1?-1:r.wrappingColumn*u.typicalHalfwidthCharacterWidth,this._bracketPairGuideOptions=t.get(16),this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(n){const t=this._context.configuration.options,r=t.get(144),u=t.get(50);return this._lineHeight=t.get(66),this._spaceWidth=u.spaceWidth,this._maxIndentLeft=r.wrappingColumn===-1?-1:r.wrappingColumn*u.typicalHalfwidthCharacterWidth,this._bracketPairGuideOptions=t.get(16),!0}onCursorStateChanged(n){var t;const u=n.selections[0].getPosition();return!((t=this._primaryPosition)===null||t===void 0)&&t.equals(u)?!1:(this._primaryPosition=u,!0)}onDecorationsChanged(n){return!0}onFlushed(n){return!0}onLinesChanged(n){return!0}onLinesDeleted(n){return!0}onLinesInserted(n){return!0}onScrollChanged(n){return n.scrollTopChanged}onZonesChanged(n){return!0}onLanguageConfigurationChanged(n){return!0}prepareRender(n){var t,r,u,f;if(!this._bracketPairGuideOptions.indentation&&this._bracketPairGuideOptions.bracketPairs===!1){this._renderResult=null;return}const c=n.visibleRange.startLineNumber,d=n.visibleRange.endLineNumber,s=n.scrollWidth,l=this._lineHeight,o=this._primaryPosition,g=this.getGuidesByLine(c,Math.min(d+1,this._context.viewModel.getLineCount()),o),h=[];for(let m=c;m<=d;m++){const C=m-c,w=g[C];let D="";const I=(r=(t=n.visibleRangeForPosition(new E.Position(m,1)))===null||t===void 0?void 0:t.left)!==null&&r!==void 0?r:0;for(const T of w){const A=T.column===-1?I+(T.visibleColumn-1)*this._spaceWidth:n.visibleRangeForPosition(new E.Position(m,T.column)).left;if(A>s||this._maxIndentLeft>0&&A>this._maxIndentLeft)break;const P=T.horizontalLine?T.horizontalLine.top?"horizontal-top":"horizontal-bottom":"vertical",N=T.horizontalLine?((f=(u=n.visibleRangeForPosition(new E.Position(m,T.horizontalLine.endColumn)))===null||u===void 0?void 0:u.left)!==null&&f!==void 0?f:A+this._spaceWidth)-A:this._spaceWidth;D+=`<div class="core-guide ${T.className} ${P}" style="left:${A}px;height:${l}px;width:${N}px"></div>`}h[C]=D}this._renderResult=h}getGuidesByLine(n,t,r){const u=this._bracketPairGuideOptions.bracketPairs!==!1?this._context.viewModel.getBracketGuidesInRangeByLine(n,t,r,{highlightActive:this._bracketPairGuideOptions.highlightActiveBracketPair,horizontalGuides:this._bracketPairGuideOptions.bracketPairsHorizontal===!0?v.HorizontalGuidesState.Enabled:this._bracketPairGuideOptions.bracketPairsHorizontal==="active"?v.HorizontalGuidesState.EnabledForActive:v.HorizontalGuidesState.Disabled,includeInactive:this._bracketPairGuideOptions.bracketPairs===!0}):null,f=this._bracketPairGuideOptions.indentation?this._context.viewModel.getLinesIndentGuides(n,t):null;let c=0,d=0,s=0;if(this._bracketPairGuideOptions.highlightActiveIndentation!==!1&&r){const g=this._context.viewModel.getActiveIndentGuide(r.lineNumber,n,t);c=g.startLineNumber,d=g.endLineNumber,s=g.indent}const{indentSize:l}=this._context.viewModel.model.getOptions(),o=[];for(let g=n;g<=t;g++){const h=new Array;o.push(h);const m=u?u[g-n]:[],C=new S.ArrayQueue(m),w=f?f[g-n]:0;for(let D=1;D<=w;D++){const I=(D-1)*l+1,T=(this._bracketPairGuideOptions.highlightActiveIndentation==="always"||m.length===0)&&c<=g&&g<=d&&D===s;h.push(...C.takeWhile(P=>P.visibleColumn<I)||[]);const A=C.peek();(!A||A.visibleColumn!==I||A.horizontalLine)&&h.push(new v.IndentGuide(I,-1,`core-guide-indent lvl-${(D-1)%30}`+(T?" indent-active":""),null,-1,-1))}h.push(...C.takeWhile(D=>!0)||[])}return o}render(n,t){if(!this._renderResult)return"";const r=t-n;return r<0||r>=this._renderResult.length?"":this._renderResult[r]}}e.IndentGuidesOverlay=b;function a(i){if(!(i&&i.isTransparent()))return i}(0,y.registerThemingParticipant)((i,n)=>{const t=[{bracketColor:k.editorBracketHighlightingForeground1,guideColor:k.editorBracketPairGuideBackground1,guideColorActive:k.editorBracketPairGuideActiveBackground1},{bracketColor:k.editorBracketHighlightingForeground2,guideColor:k.editorBracketPairGuideBackground2,guideColorActive:k.editorBracketPairGuideActiveBackground2},{bracketColor:k.editorBracketHighlightingForeground3,guideColor:k.editorBracketPairGuideBackground3,guideColorActive:k.editorBracketPairGuideActiveBackground3},{bracketColor:k.editorBracketHighlightingForeground4,guideColor:k.editorBracketPairGuideBackground4,guideColorActive:k.editorBracketPairGuideActiveBackground4},{bracketColor:k.editorBracketHighlightingForeground5,guideColor:k.editorBracketPairGuideBackground5,guideColorActive:k.editorBracketPairGuideActiveBackground5},{bracketColor:k.editorBracketHighlightingForeground6,guideColor:k.editorBracketPairGuideBackground6,guideColorActive:k.editorBracketPairGuideActiveBackground6}],r=new _.BracketPairGuidesClassNames,u=[{indentColor:k.editorIndentGuide1,indentColorActive:k.editorActiveIndentGuide1},{indentColor:k.editorIndentGuide2,indentColorActive:k.editorActiveIndentGuide2},{indentColor:k.editorIndentGuide3,indentColorActive:k.editorActiveIndentGuide3},{indentColor:k.editorIndentGuide4,indentColorActive:k.editorActiveIndentGuide4},{indentColor:k.editorIndentGuide5,indentColorActive:k.editorActiveIndentGuide5},{indentColor:k.editorIndentGuide6,indentColorActive:k.editorActiveIndentGuide6}],f=t.map(d=>{var s,l;const o=i.getColor(d.bracketColor),g=i.getColor(d.guideColor),h=i.getColor(d.guideColorActive),m=a((s=a(g))!==null&&s!==void 0?s:o?.transparent(.3)),C=a((l=a(h))!==null&&l!==void 0?l:o);if(!(!m||!C))return{guideColor:m,guideColorActive:C}}).filter(p.isDefined),c=u.map(d=>{const s=i.getColor(d.indentColor),l=i.getColor(d.indentColorActive),o=a(s),g=a(l);if(!(!o||!g))return{indentColor:o,indentColorActive:g}}).filter(p.isDefined);if(f.length>0){for(let d=0;d<30;d++){const s=f[d%f.length];n.addRule(`.monaco-editor .${r.getInlineClassNameOfLevel(d).replace(/ /g,".")} { --guide-color: ${s.guideColor}; --guide-color-active: ${s.guideColorActive}; }`)}n.addRule(".monaco-editor .vertical { box-shadow: 1px 0 0 0 var(--guide-color) inset; }"),n.addRule(".monaco-editor .horizontal-top { border-top: 1px solid var(--guide-color); }"),n.addRule(".monaco-editor .horizontal-bottom { border-bottom: 1px solid var(--guide-color); }"),n.addRule(`.monaco-editor .vertical.${r.activeClassName} { box-shadow: 1px 0 0 0 var(--guide-color-active) inset; }`),n.addRule(`.monaco-editor .horizontal-top.${r.activeClassName} { border-top: 1px solid var(--guide-color-active); }`),n.addRule(`.monaco-editor .horizontal-bottom.${r.activeClassName} { border-bottom: 1px solid var(--guide-color-active); }`)}if(c.length>0){for(let d=0;d<30;d++){const s=c[d%c.length];n.addRule(`.monaco-editor .lines-content .core-guide-indent.lvl-${d} { --indent-color: ${s.indentColor}; --indent-color-active: ${s.indentColorActive}; }`)}n.addRule(".monaco-editor .lines-content .core-guide-indent { box-shadow: 1px 0 0 0 var(--indent-color) inset; }"),n.addRule(".monaco-editor .lines-content .core-guide-indent.indent-active { box-shadow: 1px 0 0 0 var(--indent-color-active) inset; }")}})}),define(se[369],oe([1,0,17,115,10,5,23,83,435]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineNumbersOverlay=void 0;class _ extends k.DynamicViewOverlay{constructor(b){super(),this._context=b,this._readConfig(),this._lastCursorModelPosition=new y.Position(1,1),this._renderResult=null,this._activeLineNumber=1,this._context.addEventHandler(this)}_readConfig(){const b=this._context.configuration.options;this._lineHeight=b.get(66);const a=b.get(67);this._renderLineNumbers=a.renderType,this._renderCustomLineNumbers=a.renderFn,this._renderFinalNewline=b.get(94);const i=b.get(143);this._lineNumbersLeft=i.lineNumbersLeft,this._lineNumbersWidth=i.lineNumbersWidth}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(b){return this._readConfig(),!0}onCursorStateChanged(b){const a=b.selections[0].getPosition();this._lastCursorModelPosition=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(a);let i=!1;return this._activeLineNumber!==a.lineNumber&&(this._activeLineNumber=a.lineNumber,i=!0),(this._renderLineNumbers===2||this._renderLineNumbers===3)&&(i=!0),i}onFlushed(b){return!0}onLinesChanged(b){return!0}onLinesDeleted(b){return!0}onLinesInserted(b){return!0}onScrollChanged(b){return b.scrollTopChanged}onZonesChanged(b){return!0}onDecorationsChanged(b){return b.affectsLineNumber}_getLineRenderLineNumber(b){const a=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new y.Position(b,1));if(a.column!==1)return"";const i=a.lineNumber;if(this._renderCustomLineNumbers)return this._renderCustomLineNumbers(i);if(this._renderLineNumbers===2){const n=Math.abs(this._lastCursorModelPosition.lineNumber-i);return n===0?'<span class="relative-current-line-number">'+i+"</span>":String(n)}return this._renderLineNumbers===3?this._lastCursorModelPosition.lineNumber===i||i%10===0?String(i):"":String(i)}prepareRender(b){if(this._renderLineNumbers===0){this._renderResult=null;return}const a=L.isLinux?this._lineHeight%2===0?" lh-even":" lh-odd":"",i=b.visibleRange.startLineNumber,n=b.visibleRange.endLineNumber,t=this._context.viewModel.getDecorationsInViewport(b.visibleRange).filter(c=>!!c.options.lineNumberClassName);t.sort((c,d)=>E.Range.compareRangesUsingEnds(c.range,d.range));let r=0;const u=this._context.viewModel.getLineCount(),f=[];for(let c=i;c<=n;c++){const d=c-i;let s=this._getLineRenderLineNumber(c),l="";for(;r<t.length&&t[r].range.endLineNumber<c;)r++;for(let o=r;o<t.length;o++){const{range:g,options:h}=t[o];g.startLineNumber<=c&&(l+=" "+h.lineNumberClassName)}if(!s&&!l){f[d]="";continue}c===u&&this._context.viewModel.getLineLength(c)===0&&(this._renderFinalNewline==="off"&&(s=""),this._renderFinalNewline==="dimmed"&&(l+=" dimmed-line-number")),c===this._activeLineNumber&&(l+=" active-line-number"),f[d]=`<div class="${_.CLASS_NAME}${a}${l}" style="left:${this._lineNumbersLeft}px;width:${this._lineNumbersWidth}px;">${s}</div>`}this._renderResult=f}render(b,a){if(!this._renderResult)return"";const i=a-b;return i<0||i>=this._renderResult.length?"":this._renderResult[i]}}e.LineNumbersOverlay=_,_.CLASS_NAME="line-numbers",(0,S.registerThemingParticipant)((v,b)=>{const a=v.getColor(p.editorLineNumbers),i=v.getColor(p.editorDimmedLineNumber);i?b.addRule(`.monaco-editor .line-numbers.dimmed-line-number { color: ${i}; }`):a&&b.addRule(`.monaco-editor .line-numbers.dimmed-line-number { color: ${a.transparent(.4)}; }`)})}),define(se[858],oe([1,0,618,54,40,17,11,72,190,280,56,369,299,36,150,10,5,24,200,31,39,270,34,8,429]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TextAreaHandler=void 0;class h{constructor(I,T,A,P,N){this._context=I,this.modelLineNumber=T,this.distanceToModelLineStart=A,this.widthOfHiddenLineTextBefore=P,this.distanceToModelLineEnd=N,this._visibleTextAreaBrand=void 0,this.startPosition=null,this.endPosition=null,this.visibleTextareaStart=null,this.visibleTextareaEnd=null,this._previousPresentation=null}prepareRender(I){const T=new r.Position(this.modelLineNumber,this.distanceToModelLineStart+1),A=new r.Position(this.modelLineNumber,this._context.viewModel.model.getLineMaxColumn(this.modelLineNumber)-this.distanceToModelLineEnd);this.startPosition=this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(T),this.endPosition=this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(A),this.startPosition.lineNumber===this.endPosition.lineNumber?(this.visibleTextareaStart=I.visibleRangeForPosition(this.startPosition),this.visibleTextareaEnd=I.visibleRangeForPosition(this.endPosition)):(this.visibleTextareaStart=null,this.visibleTextareaEnd=null)}definePresentation(I){return this._previousPresentation||(I?this._previousPresentation=I:this._previousPresentation={foreground:1,italic:!1,bold:!1,underline:!1,strikethrough:!1}),this._previousPresentation}}const m=k.isFirefox;let C=class extends b.ViewPart{constructor(I,T,A,P,N){super(I),this._keybindingService=P,this._instantiationService=N,this._primaryCursorPosition=new r.Position(1,1),this._primaryCursorVisibleRange=null,this._viewController=T,this._visibleRangeProvider=A,this._scrollLeft=0,this._scrollTop=0;const M=this._context.configuration.options,R=M.get(143);this._setAccessibilityOptions(M),this._contentLeft=R.contentLeft,this._contentWidth=R.contentWidth,this._contentHeight=R.height,this._fontInfo=M.get(50),this._lineHeight=M.get(66),this._emptySelectionClipboard=M.get(37),this._copyWithSyntaxHighlighting=M.get(25),this._visibleTextArea=null,this._selections=[new f.Selection(1,1,1,1)],this._modelSelections=[new f.Selection(1,1,1,1)],this._lastRenderPosition=null,this.textArea=(0,y.createFastDomNode)(document.createElement("textarea")),b.PartFingerprints.write(this.textArea,7),this.textArea.setClassName(`inputarea ${c.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`),this.textArea.setAttribute("wrap",this._textAreaWrapping&&!this._visibleTextArea?"on":"off");const{tabSize:x}=this._context.viewModel.model.getOptions();this.textArea.domNode.style.tabSize=`${x*this._fontInfo.spaceWidth}px`,this.textArea.setAttribute("autocorrect","off"),this.textArea.setAttribute("autocapitalize","off"),this.textArea.setAttribute("autocomplete","off"),this.textArea.setAttribute("spellcheck","false"),this.textArea.setAttribute("aria-label",this._getAriaLabel(M)),this.textArea.setAttribute("aria-required",M.get(5)?"true":"false"),this.textArea.setAttribute("tabindex",String(M.get(123))),this.textArea.setAttribute("role","textbox"),this.textArea.setAttribute("aria-roledescription",L.localize(0,null)),this.textArea.setAttribute("aria-multiline","true"),this.textArea.setAttribute("aria-autocomplete",M.get(90)?"none":"both"),this._ensureReadOnlyAttribute(),this.textAreaCover=(0,y.createFastDomNode)(document.createElement("div")),this.textAreaCover.setPosition("absolute");const O={getLineCount:()=>this._context.viewModel.getLineCount(),getLineMaxColumn:V=>this._context.viewModel.getLineMaxColumn(V),getValueInRange:(V,K)=>this._context.viewModel.getValueInRange(V,K),getValueLengthInRange:(V,K)=>this._context.viewModel.getValueLengthInRange(V,K),modifyPosition:(V,K)=>this._context.viewModel.modifyPosition(V,K)},B={getDataToCopy:()=>{const V=this._context.viewModel.getPlainTextToCopy(this._modelSelections,this._emptySelectionClipboard,E.isWindows),K=this._context.viewModel.model.getEOL(),F=this._emptySelectionClipboard&&this._modelSelections.length===1&&this._modelSelections[0].isEmpty(),q=Array.isArray(V)?V:null,ie=Array.isArray(V)?V.join(K):V;let ae,ne=null;if(_.CopyOptions.forceCopyWithSyntaxHighlighting||this._copyWithSyntaxHighlighting&&ie.length<65536){const $=this._context.viewModel.getRichTextToCopy(this._modelSelections,this._emptySelectionClipboard);$&&(ae=$.html,ne=$.mode)}return{isFromEmptySelection:F,multicursorText:q,text:ie,html:ae,mode:ne}},getScreenReaderContent:()=>{if(this._accessibilitySupport===1){const V=this._selections[0];if(E.isMacintosh&&V.isEmpty()){const F=V.getStartPosition();let q=this._getWordBeforePosition(F);if(q.length===0&&(q=this._getCharacterBeforePosition(F)),q.length>0)return new v.TextAreaState(q,q.length,q.length,u.Range.fromPositions(F),0)}const K=500;if(E.isMacintosh&&!V.isEmpty()&&O.getValueLengthInRange(V,0)<K){const F=O.getValueInRange(V,0);return new v.TextAreaState(F,0,F.length,V,0)}if(k.isSafari&&!V.isEmpty()){const F="vscode-placeholder";return new v.TextAreaState(F,0,F.length,null,void 0)}return v.TextAreaState.EMPTY}if(k.isAndroid){const V=this._selections[0];if(V.isEmpty()){const K=V.getStartPosition(),[F,q]=this._getAndroidWordAtPosition(K);if(F.length>0)return new v.TextAreaState(F,q,q,u.Range.fromPositions(K),0)}return v.TextAreaState.EMPTY}return v.PagedScreenReaderStrategy.fromEditorSelection(O,this._selections[0],this._accessibilityPageSize,this._accessibilitySupport===0)},deduceModelPosition:(V,K,F)=>this._context.viewModel.deduceModelPositionRelativeToViewPosition(V,K,F)},W=this._register(new _.TextAreaWrapper(this.textArea.domNode));this._textAreaInput=this._register(this._instantiationService.createInstance(_.TextAreaInput,B,W,E.OS,{isAndroid:k.isAndroid,isChrome:k.isChrome,isFirefox:k.isFirefox,isSafari:k.isSafari})),this._register(this._textAreaInput.onKeyDown(V=>{this._viewController.emitKeyDown(V)})),this._register(this._textAreaInput.onKeyUp(V=>{this._viewController.emitKeyUp(V)})),this._register(this._textAreaInput.onPaste(V=>{let K=!1,F=null,q=null;V.metadata&&(K=this._emptySelectionClipboard&&!!V.metadata.isFromEmptySelection,F=typeof V.metadata.multicursorText<"u"?V.metadata.multicursorText:null,q=V.metadata.mode),this._viewController.paste(V.text,K,F,q)})),this._register(this._textAreaInput.onCut(()=>{this._viewController.cut()})),this._register(this._textAreaInput.onType(V=>{V.replacePrevCharCnt||V.replaceNextCharCnt||V.positionDelta?(v._debugComposition&&console.log(` => compositionType: <<${V.text}>>, ${V.replacePrevCharCnt}, ${V.replaceNextCharCnt}, ${V.positionDelta}`),this._viewController.compositionType(V.text,V.replacePrevCharCnt,V.replaceNextCharCnt,V.positionDelta)):(v._debugComposition&&console.log(` => type: <<${V.text}>>`),this._viewController.type(V.text))})),this._register(this._textAreaInput.onSelectionChangeRequest(V=>{this._viewController.setSelection(V)})),this._register(this._textAreaInput.onCompositionStart(V=>{const K=this.textArea.domNode,F=this._modelSelections[0],{distanceToModelLineStart:q,widthOfHiddenTextBefore:ie}=(()=>{const ne=K.value.substring(0,Math.min(K.selectionStart,K.selectionEnd)),$=ne.lastIndexOf(`
+`),J=ne.substring($+1),Q=J.lastIndexOf("	"),re=J.length-Q-1,de=F.getStartPosition(),he=Math.min(de.column-1,re),me=de.column-1-he,X=J.substring(0,J.length-he),{tabSize:U}=this._context.viewModel.model.getOptions(),G=w(this.textArea.domNode.ownerDocument,X,this._fontInfo,U);return{distanceToModelLineStart:me,widthOfHiddenTextBefore:G}})(),{distanceToModelLineEnd:ae}=(()=>{const ne=K.value.substring(Math.max(K.selectionStart,K.selectionEnd)),$=ne.indexOf(`
+`),J=$===-1?ne:ne.substring(0,$),Q=J.indexOf("	"),re=Q===-1?J.length:J.length-Q-1,de=F.getEndPosition(),he=Math.min(this._context.viewModel.model.getLineMaxColumn(de.lineNumber)-de.column,re);return{distanceToModelLineEnd:this._context.viewModel.model.getLineMaxColumn(de.lineNumber)-de.column-he}})();this._context.viewModel.revealRange("keyboard",!0,u.Range.fromPositions(this._selections[0].getStartPosition()),0,1),this._visibleTextArea=new h(this._context,F.startLineNumber,q,ie,ae),this.textArea.setAttribute("wrap",this._textAreaWrapping&&!this._visibleTextArea?"on":"off"),this._visibleTextArea.prepareRender(this._visibleRangeProvider),this._render(),this.textArea.setClassName(`inputarea ${c.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME} ime-input`),this._viewController.compositionStart(),this._context.viewModel.onCompositionStart()})),this._register(this._textAreaInput.onCompositionUpdate(V=>{this._visibleTextArea&&(this._visibleTextArea.prepareRender(this._visibleRangeProvider),this._render())})),this._register(this._textAreaInput.onCompositionEnd(()=>{this._visibleTextArea=null,this.textArea.setAttribute("wrap",this._textAreaWrapping&&!this._visibleTextArea?"on":"off"),this._render(),this.textArea.setClassName(`inputarea ${c.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`),this._viewController.compositionEnd(),this._context.viewModel.onCompositionEnd()})),this._register(this._textAreaInput.onFocus(()=>{this._context.viewModel.setHasFocus(!0)})),this._register(this._textAreaInput.onBlur(()=>{this._context.viewModel.setHasFocus(!1)})),this._register(l.IME.onDidChange(()=>{this._ensureReadOnlyAttribute()}))}writeScreenReaderContent(I){this._textAreaInput.writeNativeTextAreaContent(I)}dispose(){super.dispose()}_getAndroidWordAtPosition(I){const T='`~!@#$%^&*()-=+[{]}\\|;:",.<>/?',A=this._context.viewModel.getLineContent(I.lineNumber),P=(0,t.getMapForWordSeparators)(T);let N=!0,M=I.column,R=!0,x=I.column,O=0;for(;O<50&&(N||R);){if(N&&M<=1&&(N=!1),N){const B=A.charCodeAt(M-2);P.get(B)!==0?N=!1:M--}if(R&&x>A.length&&(R=!1),R){const B=A.charCodeAt(x-1);P.get(B)!==0?R=!1:x++}O++}return[A.substring(M-1,x-1),I.column-M]}_getWordBeforePosition(I){const T=this._context.viewModel.getLineContent(I.lineNumber),A=(0,t.getMapForWordSeparators)(this._context.configuration.options.get(129));let P=I.column,N=0;for(;P>1;){const M=T.charCodeAt(P-2);if(A.get(M)!==0||N>50)return T.substring(P-1,I.column-1);N++,P--}return T.substring(0,I.column-1)}_getCharacterBeforePosition(I){if(I.column>1){const A=this._context.viewModel.getLineContent(I.lineNumber).charAt(I.column-2);if(!S.isHighSurrogate(A.charCodeAt(0)))return A}return""}_getAriaLabel(I){var T,A,P;if(I.get(2)===1){const M=(T=this._keybindingService.lookupKeybinding("editor.action.toggleScreenReaderAccessibilityMode"))===null||T===void 0?void 0:T.getAriaLabel(),R=(A=this._keybindingService.lookupKeybinding("workbench.action.showCommands"))===null||A===void 0?void 0:A.getAriaLabel(),x=(P=this._keybindingService.lookupKeybinding("workbench.action.openGlobalKeybindings"))===null||P===void 0?void 0:P.getAriaLabel(),O=L.localize(1,null);return M?L.localize(2,null,O,M):R?L.localize(3,null,O,R):x?L.localize(4,null,O,x):O}return I.get(4)}_setAccessibilityOptions(I){this._accessibilitySupport=I.get(2);const T=I.get(3);this._accessibilitySupport===2&&T===n.EditorOptions.accessibilityPageSize.defaultValue?this._accessibilityPageSize=500:this._accessibilityPageSize=T;const P=I.get(143).wrappingColumn;if(P!==-1&&this._accessibilitySupport!==1){const N=I.get(50);this._textAreaWrapping=!0,this._textAreaWidth=Math.round(P*N.typicalHalfwidthCharacterWidth)}else this._textAreaWrapping=!1,this._textAreaWidth=m?0:1}onConfigurationChanged(I){const T=this._context.configuration.options,A=T.get(143);this._setAccessibilityOptions(T),this._contentLeft=A.contentLeft,this._contentWidth=A.contentWidth,this._contentHeight=A.height,this._fontInfo=T.get(50),this._lineHeight=T.get(66),this._emptySelectionClipboard=T.get(37),this._copyWithSyntaxHighlighting=T.get(25),this.textArea.setAttribute("wrap",this._textAreaWrapping&&!this._visibleTextArea?"on":"off");const{tabSize:P}=this._context.viewModel.model.getOptions();return this.textArea.domNode.style.tabSize=`${P*this._fontInfo.spaceWidth}px`,this.textArea.setAttribute("aria-label",this._getAriaLabel(T)),this.textArea.setAttribute("aria-required",T.get(5)?"true":"false"),this.textArea.setAttribute("tabindex",String(T.get(123))),(I.hasChanged(34)||I.hasChanged(90))&&this._ensureReadOnlyAttribute(),I.hasChanged(2)&&this._textAreaInput.writeNativeTextAreaContent("strategy changed"),!0}onCursorStateChanged(I){return this._selections=I.selections.slice(0),this._modelSelections=I.modelSelections.slice(0),this._textAreaInput.writeNativeTextAreaContent("selection changed"),!0}onDecorationsChanged(I){return!0}onFlushed(I){return!0}onLinesChanged(I){return!0}onLinesDeleted(I){return!0}onLinesInserted(I){return!0}onScrollChanged(I){return this._scrollLeft=I.scrollLeft,this._scrollTop=I.scrollTop,!0}onZonesChanged(I){return!0}isFocused(){return this._textAreaInput.isFocused()}focusTextArea(){this._textAreaInput.focusTextArea()}getLastRenderData(){return this._lastRenderPosition}setAriaOptions(I){I.activeDescendant?(this.textArea.setAttribute("aria-haspopup","true"),this.textArea.setAttribute("aria-autocomplete","list"),this.textArea.setAttribute("aria-activedescendant",I.activeDescendant)):(this.textArea.setAttribute("aria-haspopup","false"),this.textArea.setAttribute("aria-autocomplete","both"),this.textArea.removeAttribute("aria-activedescendant")),I.role&&this.textArea.setAttribute("role",I.role)}_ensureReadOnlyAttribute(){const I=this._context.configuration.options;!l.IME.enabled||I.get(34)&&I.get(90)?this.textArea.setAttribute("readonly","true"):this.textArea.removeAttribute("readonly")}prepareRender(I){var T;this._primaryCursorPosition=new r.Position(this._selections[0].positionLineNumber,this._selections[0].positionColumn),this._primaryCursorVisibleRange=I.visibleRangeForPosition(this._primaryCursorPosition),(T=this._visibleTextArea)===null||T===void 0||T.prepareRender(I)}render(I){this._textAreaInput.writeNativeTextAreaContent("render"),this._render()}_render(){var I;if(this._visibleTextArea){const P=this._visibleTextArea.visibleTextareaStart,N=this._visibleTextArea.visibleTextareaEnd,M=this._visibleTextArea.startPosition,R=this._visibleTextArea.endPosition;if(M&&R&&P&&N&&N.left>=this._scrollLeft&&P.left<=this._scrollLeft+this._contentWidth){const x=this._context.viewLayout.getVerticalOffsetForLineNumber(this._primaryCursorPosition.lineNumber)-this._scrollTop,O=this._newlinecount(this.textArea.domNode.value.substr(0,this.textArea.domNode.selectionStart));let B=this._visibleTextArea.widthOfHiddenLineTextBefore,W=this._contentLeft+P.left-this._scrollLeft,V=N.left-P.left+1;if(W<this._contentLeft){const ne=this._contentLeft-W;W+=ne,B+=ne,V-=ne}V>this._contentWidth&&(V=this._contentWidth);const K=this._context.viewModel.getViewLineData(M.lineNumber),F=K.tokens.findTokenIndexAtOffset(M.column-1),q=K.tokens.findTokenIndexAtOffset(R.column-1),ie=F===q,ae=this._visibleTextArea.definePresentation(ie?K.tokens.getPresentation(F):null);this.textArea.domNode.scrollTop=O*this._lineHeight,this.textArea.domNode.scrollLeft=B,this._doRender({lastRenderPosition:null,top:x,left:W,width:V,height:this._lineHeight,useCover:!1,color:(d.TokenizationRegistry.getColorMap()||[])[ae.foreground],italic:ae.italic,bold:ae.bold,underline:ae.underline,strikethrough:ae.strikethrough})}return}if(!this._primaryCursorVisibleRange){this._renderAtTopLeft();return}const T=this._contentLeft+this._primaryCursorVisibleRange.left-this._scrollLeft;if(T<this._contentLeft||T>this._contentLeft+this._contentWidth){this._renderAtTopLeft();return}const A=this._context.viewLayout.getVerticalOffsetForLineNumber(this._selections[0].positionLineNumber)-this._scrollTop;if(A<0||A>this._contentHeight){this._renderAtTopLeft();return}if(E.isMacintosh||this._accessibilitySupport===2){this._doRender({lastRenderPosition:this._primaryCursorPosition,top:A,left:this._textAreaWrapping?this._contentLeft:T,width:this._textAreaWidth,height:this._lineHeight,useCover:!1}),this.textArea.domNode.scrollLeft=this._primaryCursorVisibleRange.left;const P=(I=this._textAreaInput.textAreaState.newlineCountBeforeSelection)!==null&&I!==void 0?I:this._newlinecount(this.textArea.domNode.value.substr(0,this.textArea.domNode.selectionStart));this.textArea.domNode.scrollTop=P*this._lineHeight;return}this._doRender({lastRenderPosition:this._primaryCursorPosition,top:A,left:this._textAreaWrapping?this._contentLeft:T,width:this._textAreaWidth,height:m?0:1,useCover:!1})}_newlinecount(I){let T=0,A=-1;do{if(A=I.indexOf(`
+`,A+1),A===-1)break;T++}while(!0);return T}_renderAtTopLeft(){this._doRender({lastRenderPosition:null,top:0,left:0,width:this._textAreaWidth,height:m?0:1,useCover:!0})}_doRender(I){this._lastRenderPosition=I.lastRenderPosition;const T=this.textArea,A=this.textAreaCover;(0,p.applyFontInfo)(T,this._fontInfo),T.setTop(I.top),T.setLeft(I.left),T.setWidth(I.width),T.setHeight(I.height),T.setColor(I.color?s.Color.Format.CSS.formatHex(I.color):""),T.setFontStyle(I.italic?"italic":""),I.bold&&T.setFontWeight("bold"),T.setTextDecoration(`${I.underline?" underline":""}${I.strikethrough?" line-through":""}`),A.setTop(I.useCover?I.top:0),A.setLeft(I.useCover?I.left:0),A.setWidth(I.useCover?I.width:0),A.setHeight(I.useCover?I.height:0);const P=this._context.configuration.options;P.get(57)?A.setClassName("monaco-editor-background textAreaCover "+i.Margin.OUTER_CLASS_NAME):P.get(67).renderType!==0?A.setClassName("monaco-editor-background textAreaCover "+a.LineNumbersOverlay.CLASS_NAME):A.setClassName("monaco-editor-background textAreaCover")}};e.TextAreaHandler=C,e.TextAreaHandler=C=ke([ge(3,o.IKeybindingService),ge(4,g.IInstantiationService)],C);function w(D,I,T,A){if(I.length===0)return 0;const P=D.createElement("div");P.style.position="absolute",P.style.top="-50000px",P.style.width="50000px";const N=D.createElement("span");(0,p.applyFontInfo)(N,T),N.style.whiteSpace="pre",N.style.tabSize=`${A*T.spaceWidth}px`,N.append(I),P.appendChild(N),D.body.appendChild(P);const M=N.offsetWidth;return D.body.removeChild(P),M}}),define(se[859],oe([1,0,40,39,56,10,31,83,86,13]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DecorationsOverviewRuler=void 0;class b{constructor(n,t){const r=n.options;this.lineHeight=r.get(66),this.pixelRatio=r.get(141),this.overviewRulerLanes=r.get(82),this.renderBorder=r.get(81);const u=t.getColor(p.editorOverviewRulerBorder);this.borderColor=u?u.toString():null,this.hideCursor=r.get(59);const f=t.getColor(p.editorCursorForeground);this.cursorColor=f?f.transparent(.7).toString():null,this.themeType=t.type;const c=r.get(72),d=c.enabled,s=c.side,l=t.getColor(p.editorOverviewRulerBackground),o=S.TokenizationRegistry.getDefaultBackground();l?this.backgroundColor=l:d&&s==="right"?this.backgroundColor=o:this.backgroundColor=null;const h=r.get(143).overviewRuler;this.top=h.top,this.right=h.right,this.domWidth=h.width,this.domHeight=h.height,this.overviewRulerLanes===0?(this.canvasWidth=0,this.canvasHeight=0):(this.canvasWidth=this.domWidth*this.pixelRatio|0,this.canvasHeight=this.domHeight*this.pixelRatio|0);const[m,C]=this._initLanes(1,this.canvasWidth,this.overviewRulerLanes);this.x=m,this.w=C}_initLanes(n,t,r){const u=t-n;if(r>=3){const f=Math.floor(u/3),c=Math.floor(u/3),d=u-f-c,s=n,l=s+f,o=s+f+d;return[[0,s,l,s,o,s,l,s],[0,f,d,f+d,c,f+d+c,d+c,f+d+c]]}else if(r===2){const f=Math.floor(u/2),c=u-f,d=n,s=d+f;return[[0,d,d,d,s,d,d,d],[0,f,f,f,c,f+c,f+c,f+c]]}else{const f=n,c=u;return[[0,f,f,f,f,f,f,f],[0,c,c,c,c,c,c,c]]}}equals(n){return this.lineHeight===n.lineHeight&&this.pixelRatio===n.pixelRatio&&this.overviewRulerLanes===n.overviewRulerLanes&&this.renderBorder===n.renderBorder&&this.borderColor===n.borderColor&&this.hideCursor===n.hideCursor&&this.cursorColor===n.cursorColor&&this.themeType===n.themeType&&k.Color.equals(this.backgroundColor,n.backgroundColor)&&this.top===n.top&&this.right===n.right&&this.domWidth===n.domWidth&&this.domHeight===n.domHeight&&this.canvasWidth===n.canvasWidth&&this.canvasHeight===n.canvasHeight}}class a extends y.ViewPart{constructor(n){super(n),this._actualShouldRender=0,this._renderedDecorations=[],this._renderedCursorPositions=[],this._domNode=(0,L.createFastDomNode)(document.createElement("canvas")),this._domNode.setClassName("decorationsOverviewRuler"),this._domNode.setPosition("absolute"),this._domNode.setLayerHinting(!0),this._domNode.setContain("strict"),this._domNode.setAttribute("aria-hidden","true"),this._updateSettings(!1),this._tokensColorTrackerListener=S.TokenizationRegistry.onDidChange(t=>{t.changedColorMap&&this._updateSettings(!0)}),this._cursorPositions=[]}dispose(){super.dispose(),this._tokensColorTrackerListener.dispose()}_updateSettings(n){const t=new b(this._context.configuration,this._context.theme);return this._settings&&this._settings.equals(t)?!1:(this._settings=t,this._domNode.setTop(this._settings.top),this._domNode.setRight(this._settings.right),this._domNode.setWidth(this._settings.domWidth),this._domNode.setHeight(this._settings.domHeight),this._domNode.domNode.width=this._settings.canvasWidth,this._domNode.domNode.height=this._settings.canvasHeight,n&&this._render(),!0)}_markRenderingIsNeeded(){return this._actualShouldRender=2,!0}_markRenderingIsMaybeNeeded(){return this._actualShouldRender=1,!0}onConfigurationChanged(n){return this._updateSettings(!1)?this._markRenderingIsNeeded():!1}onCursorStateChanged(n){this._cursorPositions=[];for(let t=0,r=n.selections.length;t<r;t++)this._cursorPositions[t]=n.selections[t].getPosition();return this._cursorPositions.sort(E.Position.compare),this._markRenderingIsMaybeNeeded()}onDecorationsChanged(n){return n.affectsOverviewRuler?this._markRenderingIsMaybeNeeded():!1}onFlushed(n){return this._markRenderingIsNeeded()}onScrollChanged(n){return n.scrollHeightChanged?this._markRenderingIsNeeded():!1}onZonesChanged(n){return this._markRenderingIsNeeded()}onThemeChanged(n){return this._updateSettings(!1)?this._markRenderingIsNeeded():!1}getDomNode(){return this._domNode.domNode}prepareRender(n){}render(n){this._render(),this._actualShouldRender=0}_render(){const n=this._settings.backgroundColor;if(this._settings.overviewRulerLanes===0){this._domNode.setBackgroundColor(n?k.Color.Format.CSS.formatHexA(n):""),this._domNode.setDisplay("none");return}const t=this._context.viewModel.getAllOverviewRulerDecorations(this._context.theme);if(t.sort(_.OverviewRulerDecorationsGroup.compareByRenderingProps),this._actualShouldRender===1&&!_.OverviewRulerDecorationsGroup.equalsArr(this._renderedDecorations,t)&&(this._actualShouldRender=2),this._actualShouldRender===1&&!(0,v.equals)(this._renderedCursorPositions,this._cursorPositions,(C,w)=>C.lineNumber===w.lineNumber)&&(this._actualShouldRender=2),this._actualShouldRender===1)return;this._renderedDecorations=t,this._renderedCursorPositions=this._cursorPositions,this._domNode.setDisplay("block");const r=this._settings.canvasWidth,u=this._settings.canvasHeight,f=this._settings.lineHeight,c=this._context.viewLayout,d=this._context.viewLayout.getScrollHeight(),s=u/d,l=6*this._settings.pixelRatio|0,o=l/2|0,g=this._domNode.domNode.getContext("2d");n?n.isOpaque()?(g.fillStyle=k.Color.Format.CSS.formatHexA(n),g.fillRect(0,0,r,u)):(g.clearRect(0,0,r,u),g.fillStyle=k.Color.Format.CSS.formatHexA(n),g.fillRect(0,0,r,u)):g.clearRect(0,0,r,u);const h=this._settings.x,m=this._settings.w;for(const C of t){const w=C.color,D=C.data;g.fillStyle=w;let I=0,T=0,A=0;for(let P=0,N=D.length/3;P<N;P++){const M=D[3*P],R=D[3*P+1],x=D[3*P+2];let O=c.getVerticalOffsetForLineNumber(R)*s|0,B=(c.getVerticalOffsetForLineNumber(x)+f)*s|0;if(B-O<l){let V=(O+B)/2|0;V<o?V=o:V+o>u&&(V=u-o),O=V-o,B=V+o}O>A+1||M!==I?(P!==0&&g.fillRect(h[I],T,m[I],A-T),I=M,T=O,A=B):B>A&&(A=B)}g.fillRect(h[I],T,m[I],A-T)}if(!this._settings.hideCursor&&this._settings.cursorColor){const C=2*this._settings.pixelRatio|0,w=C/2|0,D=this._settings.x[7],I=this._settings.w[7];g.fillStyle=this._settings.cursorColor;let T=-100,A=-100;for(let P=0,N=this._cursorPositions.length;P<N;P++){const M=this._cursorPositions[P];let R=c.getVerticalOffsetForLineNumber(M.lineNumber)*s|0;R<w?R=w:R+w>u&&(R=u-w);const x=R-w,O=x+C;x>A+1?(P!==0&&g.fillRect(D,T,I,A-T),T=x,A=O):O>A&&(A=O)}g.fillRect(D,T,I,A-T)}this._settings.renderBorder&&this._settings.borderColor&&this._settings.overviewRulerLanes>0&&(g.beginPath(),g.lineWidth=1,g.strokeStyle=this._settings.borderColor,g.moveTo(0,0),g.lineTo(0,u),g.stroke(),g.moveTo(0,0),g.lineTo(r,0),g.stroke())}}e.DecorationsOverviewRuler=a}),define(se[860],oe([1,0,40,14,56,636,36,83,23,89,7,445]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewCursors=void 0;class a extends y.ViewPart{constructor(n){super(n);const t=this._context.configuration.options;this._readOnly=t.get(90),this._cursorBlinking=t.get(26),this._cursorStyle=t.get(28),this._cursorSmoothCaretAnimation=t.get(27),this._selectionIsEmpty=!0,this._isComposingInput=!1,this._isVisible=!1,this._primaryCursor=new E.ViewCursor(this._context),this._secondaryCursors=[],this._renderData=[],this._domNode=(0,L.createFastDomNode)(document.createElement("div")),this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true"),this._updateDomClassName(),this._domNode.appendChild(this._primaryCursor.getDomNode()),this._startCursorBlinkAnimation=new k.TimeoutTimer,this._cursorFlatBlinkInterval=new b.WindowIntervalTimer,this._blinkingEnabled=!1,this._editorHasFocus=!1,this._updateBlinking()}dispose(){super.dispose(),this._startCursorBlinkAnimation.dispose(),this._cursorFlatBlinkInterval.dispose()}getDomNode(){return this._domNode}onCompositionStart(n){return this._isComposingInput=!0,this._updateBlinking(),!0}onCompositionEnd(n){return this._isComposingInput=!1,this._updateBlinking(),!0}onConfigurationChanged(n){const t=this._context.configuration.options;this._readOnly=t.get(90),this._cursorBlinking=t.get(26),this._cursorStyle=t.get(28),this._cursorSmoothCaretAnimation=t.get(27),this._updateBlinking(),this._updateDomClassName(),this._primaryCursor.onConfigurationChanged(n);for(let r=0,u=this._secondaryCursors.length;r<u;r++)this._secondaryCursors[r].onConfigurationChanged(n);return!0}_onCursorPositionChanged(n,t,r){const u=this._secondaryCursors.length!==t.length||this._cursorSmoothCaretAnimation==="explicit"&&r!==3;if(this._primaryCursor.onCursorPositionChanged(n,u),this._updateBlinking(),this._secondaryCursors.length<t.length){const f=t.length-this._secondaryCursors.length;for(let c=0;c<f;c++){const d=new E.ViewCursor(this._context);this._domNode.domNode.insertBefore(d.getDomNode().domNode,this._primaryCursor.getDomNode().domNode.nextSibling),this._secondaryCursors.push(d)}}else if(this._secondaryCursors.length>t.length){const f=this._secondaryCursors.length-t.length;for(let c=0;c<f;c++)this._domNode.removeChild(this._secondaryCursors[0].getDomNode()),this._secondaryCursors.splice(0,1)}for(let f=0;f<t.length;f++)this._secondaryCursors[f].onCursorPositionChanged(t[f],u)}onCursorStateChanged(n){const t=[];for(let u=0,f=n.selections.length;u<f;u++)t[u]=n.selections[u].getPosition();this._onCursorPositionChanged(t[0],t.slice(1),n.reason);const r=n.selections[0].isEmpty();return this._selectionIsEmpty!==r&&(this._selectionIsEmpty=r,this._updateDomClassName()),!0}onDecorationsChanged(n){return!0}onFlushed(n){return!0}onFocusChanged(n){return this._editorHasFocus=n.isFocused,this._updateBlinking(),!1}onLinesChanged(n){return!0}onLinesDeleted(n){return!0}onLinesInserted(n){return!0}onScrollChanged(n){return!0}onTokensChanged(n){const t=r=>{for(let u=0,f=n.ranges.length;u<f;u++)if(n.ranges[u].fromLineNumber<=r.lineNumber&&r.lineNumber<=n.ranges[u].toLineNumber)return!0;return!1};if(t(this._primaryCursor.getPosition()))return!0;for(const r of this._secondaryCursors)if(t(r.getPosition()))return!0;return!1}onZonesChanged(n){return!0}_getCursorBlinking(){return this._isComposingInput||!this._editorHasFocus?0:this._readOnly?5:this._cursorBlinking}_updateBlinking(){this._startCursorBlinkAnimation.cancel(),this._cursorFlatBlinkInterval.cancel();const n=this._getCursorBlinking(),t=n===0,r=n===5;t?this._hide():this._show(),this._blinkingEnabled=!1,this._updateDomClassName(),!t&&!r&&(n===1?this._cursorFlatBlinkInterval.cancelAndSet(()=>{this._isVisible?this._hide():this._show()},a.BLINK_INTERVAL,(0,b.getWindow)(this._domNode.domNode)):this._startCursorBlinkAnimation.setIfNotSet(()=>{this._blinkingEnabled=!0,this._updateDomClassName()},a.BLINK_INTERVAL))}_updateDomClassName(){this._domNode.setClassName(this._getClassName())}_getClassName(){let n="cursors-layer";switch(this._selectionIsEmpty||(n+=" has-selection"),this._cursorStyle){case S.TextEditorCursorStyle.Line:n+=" cursor-line-style";break;case S.TextEditorCursorStyle.Block:n+=" cursor-block-style";break;case S.TextEditorCursorStyle.Underline:n+=" cursor-underline-style";break;case S.TextEditorCursorStyle.LineThin:n+=" cursor-line-thin-style";break;case S.TextEditorCursorStyle.BlockOutline:n+=" cursor-block-outline-style";break;case S.TextEditorCursorStyle.UnderlineThin:n+=" cursor-underline-thin-style";break;default:n+=" cursor-line-style"}if(this._blinkingEnabled)switch(this._getCursorBlinking()){case 1:n+=" cursor-blink";break;case 2:n+=" cursor-smooth";break;case 3:n+=" cursor-phase";break;case 4:n+=" cursor-expand";break;case 5:n+=" cursor-solid";break;default:n+=" cursor-solid"}else n+=" cursor-solid";return(this._cursorSmoothCaretAnimation==="on"||this._cursorSmoothCaretAnimation==="explicit")&&(n+=" cursor-smooth-caret-animation"),n}_show(){this._primaryCursor.show();for(let n=0,t=this._secondaryCursors.length;n<t;n++)this._secondaryCursors[n].show();this._isVisible=!0}_hide(){this._primaryCursor.hide();for(let n=0,t=this._secondaryCursors.length;n<t;n++)this._secondaryCursors[n].hide();this._isVisible=!1}prepareRender(n){this._primaryCursor.prepareRender(n);for(let t=0,r=this._secondaryCursors.length;t<r;t++)this._secondaryCursors[t].prepareRender(n)}render(n){const t=[];let r=0;const u=this._primaryCursor.render(n);u&&(t[r++]=u);for(let f=0,c=this._secondaryCursors.length;f<c;f++){const d=this._secondaryCursors[f].render(n);d&&(t[r++]=d)}this._renderData=t}getLastRenderData(){return this._renderData}}e.ViewCursors=a,a.BLINK_INTERVAL=500,(0,_.registerThemingParticipant)((i,n)=>{const t=i.getColor(p.editorCursorForeground);if(t){let r=i.getColor(p.editorCursorBackground);r||(r=t.opposite()),n.addRule(`.monaco-editor .cursors-layer .cursor { background-color: ${t}; border-color: ${t}; color: ${r}; }`),(0,v.isHighContrast)(i.type)&&n.addRule(`.monaco-editor .cursors-layer.has-selection .cursor { border-left: 1px solid ${r}; border-right: 1px solid ${r}; }`)}})}),define(se[861],oe([1,0,115,11,120,10,83,446]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WhitespaceOverlay=void 0;class p extends L.DynamicViewOverlay{constructor(b){super(),this._context=b,this._options=new _(this._context.configuration),this._selection=[],this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(b){const a=new _(this._context.configuration);return this._options.equals(a)?b.hasChanged(143):(this._options=a,!0)}onCursorStateChanged(b){return this._selection=b.selections,this._options.renderWhitespace==="selection"}onDecorationsChanged(b){return!0}onFlushed(b){return!0}onLinesChanged(b){return!0}onLinesDeleted(b){return!0}onLinesInserted(b){return!0}onScrollChanged(b){return b.scrollTopChanged}onZonesChanged(b){return!0}prepareRender(b){if(this._options.renderWhitespace==="none"){this._renderResult=null;return}const a=b.visibleRange.startLineNumber,n=b.visibleRange.endLineNumber-a+1,t=new Array(n);for(let u=0;u<n;u++)t[u]=!0;const r=this._context.viewModel.getMinimapLinesRenderingData(b.viewportData.startLineNumber,b.viewportData.endLineNumber,t);this._renderResult=[];for(let u=b.viewportData.startLineNumber;u<=b.viewportData.endLineNumber;u++){const f=u-b.viewportData.startLineNumber,c=r.data[f];let d=null;if(this._options.renderWhitespace==="selection"){const s=this._selection;for(const l of s){if(l.endLineNumber<u||l.startLineNumber>u)continue;const o=l.startLineNumber===u?l.startColumn:c.minColumn,g=l.endLineNumber===u?l.endColumn:c.maxColumn;o<g&&(d||(d=[]),d.push(new y.LineRange(o-1,g-1)))}}this._renderResult[f]=this._applyRenderWhitespace(b,u,d,c)}}_applyRenderWhitespace(b,a,i,n){if(this._options.renderWhitespace==="selection"&&!i||this._options.renderWhitespace==="trailing"&&n.continuesWithWrappedLine)return"";const t=this._context.theme.getColor(S.editorWhitespaces),r=this._options.renderWithSVG,u=n.content,f=this._options.stopRenderingLineAfter===-1?u.length:Math.min(this._options.stopRenderingLineAfter,u.length),c=n.continuesWithWrappedLine,d=n.minColumn-1,s=this._options.renderWhitespace==="boundary",l=this._options.renderWhitespace==="trailing",o=this._options.lineHeight,g=this._options.middotWidth,h=this._options.wsmiddotWidth,m=this._options.spaceWidth,C=Math.abs(h-m),w=Math.abs(g-m),D=C<w?11825:183,I=this._options.canUseHalfwidthRightwardsArrow;let T="",A=!1,P=k.firstNonWhitespaceIndex(u),N;P===-1?(A=!0,P=f,N=f):N=k.lastNonWhitespaceIndex(u);let M=0,R=i&&i[M],x=0;for(let O=d;O<f;O++){const B=u.charCodeAt(O);if(R&&O>=R.endOffset&&(M++,R=i&&i[M]),B!==9&&B!==32||l&&!A&&O<=N)continue;if(s&&O>=P&&O<=N&&B===32){const V=O-1>=0?u.charCodeAt(O-1):0,K=O+1<f?u.charCodeAt(O+1):0;if(V!==32&&K!==32)continue}if(s&&c&&O===f-1){const V=O-1>=0?u.charCodeAt(O-1):0;if(B===32&&V!==32&&V!==9)continue}if(i&&(!R||R.startOffset>O||R.endOffset<=O))continue;const W=b.visibleRangeForPosition(new E.Position(a,O+1));W&&(r?(x=Math.max(x,W.left),B===9?T+=this._renderArrow(o,m,W.left):T+=`<circle cx="${(W.left+m/2).toFixed(2)}" cy="${(o/2).toFixed(2)}" r="${(m/7).toFixed(2)}" />`):B===9?T+=`<div class="mwh" style="left:${W.left}px;height:${o}px;">${I?String.fromCharCode(65515):String.fromCharCode(8594)}</div>`:T+=`<div class="mwh" style="left:${W.left}px;height:${o}px;">${String.fromCharCode(D)}</div>`)}return r?(x=Math.round(x+m),`<svg style="position:absolute;width:${x}px;height:${o}px" viewBox="0 0 ${x} ${o}" xmlns="http://www.w3.org/2000/svg" fill="${t}">`+T+"</svg>"):T}_renderArrow(b,a,i){const n=a/7,t=a,r=b/2,u=i,f={x:0,y:n/2},c={x:100/125*t,y:f.y},d={x:c.x-.2*c.x,y:c.y+.2*c.x},s={x:d.x+.1*c.x,y:d.y+.1*c.x},l={x:s.x+.35*c.x,y:s.y-.35*c.x},o={x:l.x,y:-l.y},g={x:s.x,y:-s.y},h={x:d.x,y:-d.y},m={x:c.x,y:-c.y},C={x:f.x,y:-f.y};return`<path d="M ${[f,c,d,s,l,o,g,h,m,C].map(I=>`${(u+I.x).toFixed(2)} ${(r+I.y).toFixed(2)}`).join(" L ")}" />`}render(b,a){if(!this._renderResult)return"";const i=a-b;return i<0||i>=this._renderResult.length?"":this._renderResult[i]}}e.WhitespaceOverlay=p;class _{constructor(b){const a=b.options,i=a.get(50),n=a.get(38);n==="off"?(this.renderWhitespace="none",this.renderWithSVG=!1):n==="svg"?(this.renderWhitespace=a.get(98),this.renderWithSVG=!0):(this.renderWhitespace=a.get(98),this.renderWithSVG=!1),this.spaceWidth=i.spaceWidth,this.middotWidth=i.middotWidth,this.wsmiddotWidth=i.wsmiddotWidth,this.canUseHalfwidthRightwardsArrow=i.canUseHalfwidthRightwardsArrow,this.lineHeight=a.get(66),this.stopRenderingLineAfter=a.get(116)}equals(b){return this.renderWhitespace===b.renderWhitespace&&this.renderWithSVG===b.renderWithSVG&&this.spaceWidth===b.spaceWidth&&this.middotWidth===b.middotWidth&&this.wsmiddotWidth===b.wsmiddotWidth&&this.canUseHalfwidthRightwardsArrow===b.canUseHalfwidthRightwardsArrow&&this.lineHeight===b.lineHeight&&this.stopRenderingLineAfter===b.stopRenderingLineAfter}}}),define(se[862],oe([1,0,7,40,266,12,365,848,858,148,808,610,56,279,536,605,856,537,853,213,857,369,849,538,299,539,834,606,859,549,540,541,854,860,542,861,10,5,24,41,154,545,550,8,23]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w,D,I,T,A,P,N,M,R,x,O,B,W,V,K,F,q,ie){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.View=void 0;let ae=class extends V.ViewEventHandler{constructor(Q,re,de,he,me,X,U){super(),this._instantiationService=U,this._shouldRecomputeGlyphMarginLanes=!1,this._selections=[new B.Selection(1,1,1,1)],this._renderAnimationFrame=null;const G=new b.ViewController(re,he,me,Q);this._context=new F.ViewContext(re,de,he),this._context.addEventHandler(this),this._viewParts=[],this._textAreaHandler=this._instantiationService.createInstance(_.TextAreaHandler,this._context,G,this._createTextAreaHandlerHelper()),this._viewParts.push(this._textAreaHandler),this._linesContent=(0,k.createFastDomNode)(document.createElement("div")),this._linesContent.setClassName("lines-content monaco-editor-background"),this._linesContent.setPosition("absolute"),this.domNode=(0,k.createFastDomNode)(document.createElement("div")),this.domNode.setClassName(this._getEditorClassName()),this.domNode.setAttribute("role","code"),this._overflowGuardContainer=(0,k.createFastDomNode)(document.createElement("div")),i.PartFingerprints.write(this._overflowGuardContainer,3),this._overflowGuardContainer.setClassName("overflow-guard"),this._scrollbar=new c.EditorScrollbar(this._context,this._linesContent,this.domNode,this._overflowGuardContainer),this._viewParts.push(this._scrollbar),this._viewLines=new o.ViewLines(this._context,this._linesContent),this._viewZones=new M.ViewZones(this._context),this._viewParts.push(this._viewZones);const z=new D.DecorationsOverviewRuler(this._context);this._viewParts.push(z);const H=new A.ScrollDecorationViewPart(this._context);this._viewParts.push(H);const Y=new a.ContentViewOverlays(this._context);this._viewParts.push(Y),Y.addDynamicOverlay(new u.CurrentLineHighlightOverlay(this._context)),Y.addDynamicOverlay(new P.SelectionsOverlay(this._context)),Y.addDynamicOverlay(new s.IndentGuidesOverlay(this._context)),Y.addDynamicOverlay(new f.DecorationsOverlay(this._context)),Y.addDynamicOverlay(new R.WhitespaceOverlay(this._context));const j=new a.MarginViewOverlays(this._context);this._viewParts.push(j),j.addDynamicOverlay(new u.CurrentLineMarginHighlightOverlay(this._context)),j.addDynamicOverlay(new m.MarginViewLineDecorationsOverlay(this._context)),j.addDynamicOverlay(new g.LinesDecorationsOverlay(this._context)),j.addDynamicOverlay(new l.LineNumbersOverlay(this._context)),this._glyphMarginWidgets=new d.GlyphMarginWidgets(this._context),this._viewParts.push(this._glyphMarginWidgets);const Z=new h.Margin(this._context);Z.getDomNode().appendChild(this._viewZones.marginDomNode),Z.getDomNode().appendChild(j.getDomNode()),Z.getDomNode().appendChild(this._glyphMarginWidgets.domNode),this._viewParts.push(Z),this._contentWidgets=new r.ViewContentWidgets(this._context,this.domNode),this._viewParts.push(this._contentWidgets),this._viewCursors=new N.ViewCursors(this._context),this._viewParts.push(this._viewCursors),this._overlayWidgets=new w.ViewOverlayWidgets(this._context,this.domNode),this._viewParts.push(this._overlayWidgets);const ee=new T.Rulers(this._context);this._viewParts.push(ee);const le=new t.BlockDecorations(this._context);this._viewParts.push(le);const ue=new C.Minimap(this._context);if(this._viewParts.push(ue),z){const ce=this._scrollbar.getOverviewRulerLayoutInfo();ce.parent.insertBefore(z.getDomNode(),ce.insertBefore)}this._linesContent.appendChild(Y.getDomNode()),this._linesContent.appendChild(ee.domNode),this._linesContent.appendChild(this._viewZones.domNode),this._linesContent.appendChild(this._viewLines.getDomNode()),this._linesContent.appendChild(this._contentWidgets.domNode),this._linesContent.appendChild(this._viewCursors.getDomNode()),this._overflowGuardContainer.appendChild(Z.getDomNode()),this._overflowGuardContainer.appendChild(this._scrollbar.getDomNode()),this._overflowGuardContainer.appendChild(H.getDomNode()),this._overflowGuardContainer.appendChild(this._textAreaHandler.textArea),this._overflowGuardContainer.appendChild(this._textAreaHandler.textAreaCover),this._overflowGuardContainer.appendChild(this._overlayWidgets.getDomNode()),this._overflowGuardContainer.appendChild(ue.getDomNode()),this._overflowGuardContainer.appendChild(le.domNode),this.domNode.appendChild(this._overflowGuardContainer),X?(X.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode.domNode),X.appendChild(this._overlayWidgets.overflowingOverlayWidgetsDomNode.domNode)):(this.domNode.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode),this.domNode.appendChild(this._overlayWidgets.overflowingOverlayWidgetsDomNode)),this._applyLayout(),this._pointerHandler=this._register(new p.PointerHandler(this._context,G,this._createPointerHandlerHelper()))}_computeGlyphMarginLanes(){const Q=this._context.viewModel.model,re=this._context.viewModel.glyphLanes;let de=[],he=0;de=de.concat(Q.getAllMarginDecorations().map(me=>{var X,U,G;const z=(U=(X=me.options.glyphMargin)===null||X===void 0?void 0:X.position)!==null&&U!==void 0?U:W.GlyphMarginLane.Center;return he=Math.max(he,me.range.endLineNumber),{range:me.range,lane:z,persist:(G=me.options.glyphMargin)===null||G===void 0?void 0:G.persistLane}})),de=de.concat(this._glyphMarginWidgets.getWidgets().map(me=>{const X=Q.validateRange(me.preference.range);return he=Math.max(he,X.endLineNumber),{range:X,lane:me.preference.lane}})),de.sort((me,X)=>O.Range.compareRangesUsingStarts(me.range,X.range)),re.reset(he);for(const me of de)re.push(me.lane,me.range,me.persist);return re}_createPointerHandlerHelper(){return{viewDomNode:this.domNode.domNode,linesContentDomNode:this._linesContent.domNode,viewLinesDomNode:this._viewLines.getDomNode().domNode,focusTextArea:()=>{this.focus()},dispatchTextAreaEvent:Q=>{this._textAreaHandler.textArea.domNode.dispatchEvent(Q)},getLastRenderData:()=>{const Q=this._viewCursors.getLastRenderData()||[],re=this._textAreaHandler.getLastRenderData();return new S.PointerHandlerLastRenderData(Q,re)},renderNow:()=>{this.render(!0,!1)},shouldSuppressMouseDownOnViewZone:Q=>this._viewZones.shouldSuppressMouseDownOnViewZone(Q),shouldSuppressMouseDownOnWidget:Q=>this._contentWidgets.shouldSuppressMouseDownOnWidget(Q),getPositionFromDOMInfo:(Q,re)=>(this._flushAccumulatedAndRenderNow(),this._viewLines.getPositionFromDOMInfo(Q,re)),visibleRangeForPosition:(Q,re)=>(this._flushAccumulatedAndRenderNow(),this._viewLines.visibleRangeForPosition(new x.Position(Q,re))),getLineWidth:Q=>(this._flushAccumulatedAndRenderNow(),this._viewLines.getLineWidth(Q))}}_createTextAreaHandlerHelper(){return{visibleRangeForPosition:Q=>(this._flushAccumulatedAndRenderNow(),this._viewLines.visibleRangeForPosition(Q))}}_applyLayout(){const re=this._context.configuration.options.get(143);this.domNode.setWidth(re.width),this.domNode.setHeight(re.height),this._overflowGuardContainer.setWidth(re.width),this._overflowGuardContainer.setHeight(re.height),this._linesContent.setWidth(1e6),this._linesContent.setHeight(1e6)}_getEditorClassName(){const Q=this._textAreaHandler.isFocused()?" focused":"";return this._context.configuration.options.get(140)+" "+(0,ie.getThemeTypeSelector)(this._context.theme.type)+Q}handleEvents(Q){super.handleEvents(Q),this._scheduleRender()}onConfigurationChanged(Q){return this.domNode.setClassName(this._getEditorClassName()),this._applyLayout(),!1}onCursorStateChanged(Q){return this._selections=Q.selections,!1}onDecorationsChanged(Q){return Q.affectsGlyphMargin&&(this._shouldRecomputeGlyphMarginLanes=!0),!1}onFocusChanged(Q){return this.domNode.setClassName(this._getEditorClassName()),!1}onThemeChanged(Q){return this._context.theme.update(Q.theme),this.domNode.setClassName(this._getEditorClassName()),!1}dispose(){this._renderAnimationFrame!==null&&(this._renderAnimationFrame.dispose(),this._renderAnimationFrame=null),this._contentWidgets.overflowingContentWidgetsDomNode.domNode.remove(),this._context.removeEventHandler(this),this._viewLines.dispose();for(const Q of this._viewParts)Q.dispose();super.dispose()}_scheduleRender(){if(this._store.isDisposed)throw new E.BugIndicatingError;if(this._renderAnimationFrame===null){const Q=this._createCoordinatedRendering();this._renderAnimationFrame=$.INSTANCE.scheduleCoordinatedRendering({window:L.getWindow(this.domNode.domNode),prepareRenderText:()=>{if(this._store.isDisposed)throw new E.BugIndicatingError;try{return Q.prepareRenderText()}finally{this._renderAnimationFrame=null}},renderText:()=>{if(this._store.isDisposed)throw new E.BugIndicatingError;return Q.renderText()},prepareRender:(re,de)=>{if(this._store.isDisposed)throw new E.BugIndicatingError;return Q.prepareRender(re,de)},render:(re,de)=>{if(this._store.isDisposed)throw new E.BugIndicatingError;return Q.render(re,de)}})}}_flushAccumulatedAndRenderNow(){const Q=this._createCoordinatedRendering();ne(()=>Q.prepareRenderText());const re=ne(()=>Q.renderText());if(re){const[de,he]=re;ne(()=>Q.prepareRender(de,he)),ne(()=>Q.render(de,he))}}_getViewPartsToRender(){const Q=[];let re=0;for(const de of this._viewParts)de.shouldRender()&&(Q[re++]=de);return Q}_createCoordinatedRendering(){return{prepareRenderText:()=>{if(this._shouldRecomputeGlyphMarginLanes){this._shouldRecomputeGlyphMarginLanes=!1;const Q=this._computeGlyphMarginLanes();this._context.configuration.setGlyphMarginDecorationLaneCount(Q.requiredLanes)}y.inputLatency.onRenderStart()},renderText:()=>{if(!this.domNode.domNode.isConnected)return null;let Q=this._getViewPartsToRender();if(!this._viewLines.shouldRender()&&Q.length===0)return null;const re=this._context.viewLayout.getLinesViewportData();this._context.viewModel.setViewport(re.startLineNumber,re.endLineNumber,re.centeredLineNumber);const de=new K.ViewportData(this._selections,re,this._context.viewLayout.getWhitespaceViewportData(),this._context.viewModel);return this._contentWidgets.shouldRender()&&this._contentWidgets.onBeforeRender(de),this._viewLines.shouldRender()&&(this._viewLines.renderText(de),this._viewLines.onDidRender(),Q=this._getViewPartsToRender()),[Q,new v.RenderingContext(this._context.viewLayout,de,this._viewLines)]},prepareRender:(Q,re)=>{for(const de of Q)de.prepareRender(re)},render:(Q,re)=>{for(const de of Q)de.render(re),de.onDidRender()}}}delegateVerticalScrollbarPointerDown(Q){this._scrollbar.delegateVerticalScrollbarPointerDown(Q)}delegateScrollFromMouseWheelEvent(Q){this._scrollbar.delegateScrollFromMouseWheelEvent(Q)}restoreState(Q){this._context.viewModel.viewLayout.setScrollPosition({scrollTop:Q.scrollTop,scrollLeft:Q.scrollLeft},1),this._context.viewModel.visibleLinesStabilized()}getOffsetForColumn(Q,re){const de=this._context.viewModel.model.validatePosition({lineNumber:Q,column:re}),he=this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(de);this._flushAccumulatedAndRenderNow();const me=this._viewLines.visibleRangeForPosition(new x.Position(he.lineNumber,he.column));return me?me.left:-1}getTargetAtClientPoint(Q,re){const de=this._pointerHandler.getTargetAtClientPoint(Q,re);return de?n.ViewUserInputEvents.convertViewToModelMouseTarget(de,this._context.viewModel.coordinatesConverter):null}createOverviewRuler(Q){return new I.OverviewRuler(this._context,Q)}change(Q){this._viewZones.changeViewZones(Q),this._scheduleRender()}render(Q,re){if(re){this._viewLines.forceShouldRender();for(const de of this._viewParts)de.forceShouldRender()}Q?this._flushAccumulatedAndRenderNow():this._scheduleRender()}writeScreenReaderContent(Q){this._textAreaHandler.writeScreenReaderContent(Q)}focus(){this._textAreaHandler.focusTextArea()}isFocused(){return this._textAreaHandler.isFocused()}setAriaOptions(Q){this._textAreaHandler.setAriaOptions(Q)}addContentWidget(Q){this._contentWidgets.addWidget(Q.widget),this.layoutContentWidget(Q),this._scheduleRender()}layoutContentWidget(Q){var re,de,he,me,X,U,G,z;this._contentWidgets.setWidgetPosition(Q.widget,(de=(re=Q.position)===null||re===void 0?void 0:re.position)!==null&&de!==void 0?de:null,(me=(he=Q.position)===null||he===void 0?void 0:he.secondaryPosition)!==null&&me!==void 0?me:null,(U=(X=Q.position)===null||X===void 0?void 0:X.preference)!==null&&U!==void 0?U:null,(z=(G=Q.position)===null||G===void 0?void 0:G.positionAffinity)!==null&&z!==void 0?z:null),this._scheduleRender()}removeContentWidget(Q){this._contentWidgets.removeWidget(Q.widget),this._scheduleRender()}addOverlayWidget(Q){this._overlayWidgets.addWidget(Q.widget),this.layoutOverlayWidget(Q),this._scheduleRender()}layoutOverlayWidget(Q){const re=Q.position?Q.position.preference:null;this._overlayWidgets.setWidgetPosition(Q.widget,re)&&this._scheduleRender()}removeOverlayWidget(Q){this._overlayWidgets.removeWidget(Q.widget),this._scheduleRender()}addGlyphMarginWidget(Q){this._glyphMarginWidgets.addWidget(Q.widget),this._shouldRecomputeGlyphMarginLanes=!0,this._scheduleRender()}layoutGlyphMarginWidget(Q){const re=Q.position;this._glyphMarginWidgets.setWidgetPosition(Q.widget,re)&&(this._shouldRecomputeGlyphMarginLanes=!0,this._scheduleRender())}removeGlyphMarginWidget(Q){this._glyphMarginWidgets.removeWidget(Q.widget),this._shouldRecomputeGlyphMarginLanes=!0,this._scheduleRender()}};e.View=ae,e.View=ae=ke([ge(6,q.IInstantiationService)],ae);function ne(J){try{return J()}catch(Q){return(0,E.onUnexpectedError)(Q),null}}class ${constructor(){this._coordinatedRenderings=[],this._animationFrameRunners=new Map}scheduleCoordinatedRendering(Q){return this._coordinatedRenderings.push(Q),this._scheduleRender(Q.window),{dispose:()=>{const re=this._coordinatedRenderings.indexOf(Q);if(re!==-1&&(this._coordinatedRenderings.splice(re,1),this._coordinatedRenderings.length===0)){for(const[de,he]of this._animationFrameRunners)he.dispose();this._animationFrameRunners.clear()}}}}_scheduleRender(Q){if(!this._animationFrameRunners.has(Q)){const re=()=>{this._animationFrameRunners.delete(Q),this._onRenderScheduled()};this._animationFrameRunners.set(Q,L.runAtThisOrScheduleAtNextAnimationFrame(Q,re,100))}}_onRenderScheduled(){const Q=this._coordinatedRenderings.slice(0);this._coordinatedRenderings=[];for(const de of Q)ne(()=>de.prepareRenderText());const re=[];for(let de=0,he=Q.length;de<he;de++){const me=Q[de];re[de]=ne(()=>me.renderText())}for(let de=0,he=Q.length;de<he;de++){const me=Q[de],X=re[de];if(!X)continue;const[U,G]=X;ne(()=>me.prepareRender(U,G))}for(let de=0,he=Q.length;de<he;de++){const me=Q[de],X=re[de];if(!X)continue;const[U,G]=X;ne(()=>me.render(U,G))}}}$.INSTANCE=new $}),define(se[863],oe([1,0,6,2,5,83,23]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorizedBracketPairsDecorationProvider=void 0;class p extends k.Disposable{constructor(b){super(),this.textModel=b,this.colorProvider=new _,this.onDidChangeEmitter=new L.Emitter,this.onDidChange=this.onDidChangeEmitter.event,this.colorizationOptions=b.getOptions().bracketPairColorizationOptions,this._register(b.bracketPairs.onDidChange(a=>{this.onDidChangeEmitter.fire()}))}handleDidChangeOptions(b){this.colorizationOptions=this.textModel.getOptions().bracketPairColorizationOptions}getDecorationsInRange(b,a,i,n){return n?[]:a===void 0?[]:this.colorizationOptions.enabled?this.textModel.bracketPairs.getBracketsInRange(b,!0).map(r=>({id:`bracket${r.range.toString()}-${r.nestingLevel}`,options:{description:"BracketPairColorization",inlineClassName:this.colorProvider.getInlineClassName(r,this.colorizationOptions.independentColorPoolPerBracketType)},ownerId:0,range:r.range})).toArray():[]}getAllDecorations(b,a){return b===void 0?[]:this.colorizationOptions.enabled?this.getDecorationsInRange(new y.Range(1,1,this.textModel.getLineCount(),1),b,a):[]}}e.ColorizedBracketPairsDecorationProvider=p;class _{constructor(){this.unexpectedClosingBracketClassName="unexpected-closing-bracket"}getInlineClassName(b,a){return b.isInvalid?this.unexpectedClosingBracketClassName:this.getInlineClassNameOfLevel(a?b.nestingLevelOfEqualBracketType:b.nestingLevel)}getInlineClassNameOfLevel(b){return`bracket-highlighting-${b%30}`}}(0,S.registerThemingParticipant)((v,b)=>{const a=[E.editorBracketHighlightingForeground1,E.editorBracketHighlightingForeground2,E.editorBracketHighlightingForeground3,E.editorBracketHighlightingForeground4,E.editorBracketHighlightingForeground5,E.editorBracketHighlightingForeground6],i=new _;b.addRule(`.monaco-editor .${i.unexpectedClosingBracketClassName} { color: ${v.getColor(E.editorBracketHighlightingUnexpectedBracketForeground)}; }`);const n=a.map(t=>v.getColor(t)).filter(t=>!!t).filter(t=>!t.isTransparent());for(let t=0;t<30;t++){const r=n[t%n.length];b.addRule(`.monaco-editor .${i.getInlineClassNameOfLevel(t)} { color: ${r}; }`)}})}),define(se[864],oe([1,0,97,2,41,23,83,51,5,47,6,29,53,268]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerDecorationsService=void 0;let t=class extends k.Disposable{constructor(f,c){super(),this._markerService=c,this._onDidChangeMarker=this._register(new b.Emitter),this._markerDecorations=new i.ResourceMap,f.getModels().forEach(d=>this._onModelAdded(d)),this._register(f.onModelAdded(this._onModelAdded,this)),this._register(f.onModelRemoved(this._onModelRemoved,this)),this._register(this._markerService.onMarkerChanged(this._handleMarkerChange,this))}dispose(){super.dispose(),this._markerDecorations.forEach(f=>f.dispose()),this._markerDecorations.clear()}getMarker(f,c){const d=this._markerDecorations.get(f);return d&&d.getMarker(c)||null}_handleMarkerChange(f){f.forEach(c=>{const d=this._markerDecorations.get(c);d&&this._updateDecorations(d)})}_onModelAdded(f){const c=new r(f);this._markerDecorations.set(f.uri,c),this._updateDecorations(c)}_onModelRemoved(f){var c;const d=this._markerDecorations.get(f.uri);d&&(d.dispose(),this._markerDecorations.delete(f.uri)),(f.uri.scheme===v.Schemas.inMemory||f.uri.scheme===v.Schemas.internal||f.uri.scheme===v.Schemas.vscode)&&((c=this._markerService)===null||c===void 0||c.read({resource:f.uri}).map(s=>s.owner).forEach(s=>this._markerService.remove(s,[f.uri])))}_updateDecorations(f){const c=this._markerService.read({resource:f.model.uri,take:500});f.update(c)&&this._onDidChangeMarker.fire(f.model)}};e.MarkerDecorationsService=t,e.MarkerDecorationsService=t=ke([ge(0,p.IModelService),ge(1,L.IMarkerService)],t);class r extends k.Disposable{constructor(f){super(),this.model=f,this._map=new i.BidirectionalMap,this._register((0,k.toDisposable)(()=>{this.model.deltaDecorations([...this._map.values()],[]),this._map.clear()}))}update(f){const{added:c,removed:d}=(0,n.diffSets)(new Set(this._map.keys()),new Set(f));if(c.length===0&&d.length===0)return!1;const s=d.map(g=>this._map.get(g)),l=c.map(g=>({range:this._createDecorationRange(this.model,g),options:this._createDecorationOption(g)})),o=this.model.deltaDecorations(s,l);for(const g of d)this._map.delete(g);for(let g=0;g<o.length;g++)this._map.set(c[g],o[g]);return!0}getMarker(f){return this._map.getKey(f.id)}_createDecorationRange(f,c){let d=_.Range.lift(c);if(c.severity===L.MarkerSeverity.Hint&&!this._hasMarkerTag(c,1)&&!this._hasMarkerTag(c,2)&&(d=d.setEndPosition(d.startLineNumber,d.startColumn+2)),d=f.validateRange(d),d.isEmpty()){const s=f.getLineLastNonWhitespaceColumn(d.startLineNumber)||f.getLineMaxColumn(d.startLineNumber);if(s===1||d.endColumn>=s)return d;const l=f.getWordAtPosition(d.getStartPosition());l&&(d=new _.Range(d.startLineNumber,l.startColumn,d.endLineNumber,l.endColumn))}else if(c.endColumn===Number.MAX_VALUE&&c.startColumn===1&&d.startLineNumber===d.endLineNumber){const s=f.getLineFirstNonWhitespaceColumn(c.startLineNumber);s<d.endColumn&&(d=new _.Range(d.startLineNumber,s,d.endLineNumber,d.endColumn),c.startColumn=s)}return d}_createDecorationOption(f){let c,d,s,l,o;switch(f.severity){case L.MarkerSeverity.Hint:this._hasMarkerTag(f,2)?c=void 0:this._hasMarkerTag(f,1)?c="squiggly-unnecessary":c="squiggly-hint",s=0;break;case L.MarkerSeverity.Info:c="squiggly-info",d=(0,E.themeColorFromId)(S.overviewRulerInfo),s=10,o={color:(0,E.themeColorFromId)(a.minimapInfo),position:y.MinimapPosition.Inline};break;case L.MarkerSeverity.Warning:c="squiggly-warning",d=(0,E.themeColorFromId)(S.overviewRulerWarning),s=20,o={color:(0,E.themeColorFromId)(a.minimapWarning),position:y.MinimapPosition.Inline};break;case L.MarkerSeverity.Error:default:c="squiggly-error",d=(0,E.themeColorFromId)(S.overviewRulerError),s=30,o={color:(0,E.themeColorFromId)(a.minimapError),position:y.MinimapPosition.Inline};break}return f.tags&&(f.tags.indexOf(1)!==-1&&(l="squiggly-inline-unnecessary"),f.tags.indexOf(2)!==-1&&(l="squiggly-inline-deprecated")),{description:"marker-decoration",stickiness:1,className:c,showIfCollapsed:!0,overviewRuler:{color:d,position:y.OverviewRulerLane.Right},minimap:o,zIndex:s,inlineClassName:l}}_hasMarkerTag(f,c){return f.tags?f.tags.indexOf(c)>=0:!1}}}),define(se[256],oe([1,0,132,23,64,534,43]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toMultilineTokens2=e.SemanticTokensProviderStyling=void 0;let p=class{constructor(i,n,t,r){this._legend=i,this._themeService=n,this._languageService=t,this._logService=r,this._hasWarnedOverlappingTokens=!1,this._hasWarnedInvalidLengthTokens=!1,this._hasWarnedInvalidEditStart=!1,this._hashTable=new b}getMetadata(i,n,t){const r=this._languageService.languageIdCodec.encodeLanguageId(t),u=this._hashTable.get(i,n,r);let f;if(u)f=u.metadata,this._logService.getLevel()===y.LogLevel.Trace&&this._logService.trace(`SemanticTokensProviderStyling [CACHED] ${i} / ${n}: foreground ${L.TokenMetadata.getForeground(f)}, fontStyle ${L.TokenMetadata.getFontStyle(f).toString(2)}`);else{let c=this._legend.tokenTypes[i];const d=[];if(c){let s=n;for(let o=0;s>0&&o<this._legend.tokenModifiers.length;o++)s&1&&d.push(this._legend.tokenModifiers[o]),s=s>>1;s>0&&this._logService.getLevel()===y.LogLevel.Trace&&(this._logService.trace(`SemanticTokensProviderStyling: unknown token modifier index: ${n.toString(2)} for legend: ${JSON.stringify(this._legend.tokenModifiers)}`),d.push("not-in-legend"));const l=this._themeService.getColorTheme().getTokenStyleMetadata(c,d,t);if(typeof l>"u")f=2147483647;else{if(f=0,typeof l.italic<"u"){const o=(l.italic?1:0)<<11;f|=o|1}if(typeof l.bold<"u"){const o=(l.bold?2:0)<<11;f|=o|2}if(typeof l.underline<"u"){const o=(l.underline?4:0)<<11;f|=o|4}if(typeof l.strikethrough<"u"){const o=(l.strikethrough?8:0)<<11;f|=o|8}if(l.foreground){const o=l.foreground<<15;f|=o|16}f===0&&(f=2147483647)}}else this._logService.getLevel()===y.LogLevel.Trace&&this._logService.trace(`SemanticTokensProviderStyling: unknown token type index: ${i} for legend: ${JSON.stringify(this._legend.tokenTypes)}`),f=2147483647,c="not-in-legend";this._hashTable.add(i,n,r,f),this._logService.getLevel()===y.LogLevel.Trace&&this._logService.trace(`SemanticTokensProviderStyling ${i} (${c}) / ${n} (${d.join(" ")}): foreground ${L.TokenMetadata.getForeground(f)}, fontStyle ${L.TokenMetadata.getFontStyle(f).toString(2)}`)}return f}warnOverlappingSemanticTokens(i,n){this._hasWarnedOverlappingTokens||(this._hasWarnedOverlappingTokens=!0,this._logService.warn(`Overlapping semantic tokens detected at lineNumber ${i}, column ${n}`))}warnInvalidLengthSemanticTokens(i,n){this._hasWarnedInvalidLengthTokens||(this._hasWarnedInvalidLengthTokens=!0,this._logService.warn(`Semantic token with invalid length detected at lineNumber ${i}, column ${n}`))}warnInvalidEditStart(i,n,t,r,u){this._hasWarnedInvalidEditStart||(this._hasWarnedInvalidEditStart=!0,this._logService.warn(`Invalid semantic tokens edit detected (previousResultId: ${i}, resultId: ${n}) at edit #${t}: The provided start offset ${r} is outside the previous data (length ${u}).`))}};e.SemanticTokensProviderStyling=p,e.SemanticTokensProviderStyling=p=ke([ge(1,k.IThemeService),ge(2,S.ILanguageService),ge(3,y.ILogService)],p);function _(a,i,n){const t=a.data,r=a.data.length/5|0,u=Math.max(Math.ceil(r/1024),400),f=[];let c=0,d=1,s=0;for(;c<r;){const l=c;let o=Math.min(l+u,r);if(o<r){let I=o;for(;I-1>l&&t[5*I]===0;)I--;if(I-1===l){let T=o;for(;T+1<r&&t[5*T]===0;)T++;o=T}else o=I}let g=new Uint32Array((o-l)*4),h=0,m=0,C=0,w=0;for(;c<o;){const I=5*c,T=t[I],A=t[I+1],P=d+T|0,N=T===0?s+A|0:A,M=t[I+2],R=N+M|0,x=t[I+3],O=t[I+4];if(R<=N)i.warnInvalidLengthSemanticTokens(P,N+1);else if(C===P&&w>N)i.warnOverlappingSemanticTokens(P,N+1);else{const B=i.getMetadata(x,O,n);B!==2147483647&&(m===0&&(m=P),g[h]=P-m,g[h+1]=N,g[h+2]=R,g[h+3]=B,h+=4,C=P,w=R)}d=P,s=N,c++}h!==g.length&&(g=g.subarray(0,h));const D=E.SparseMultilineTokens.create(m,g);f.push(D)}return f}e.toMultilineTokens2=_;class v{constructor(i,n,t,r){this.tokenTypeIndex=i,this.tokenModifierSet=n,this.languageId=t,this.metadata=r,this.next=null}}class b{constructor(){this._elementsCount=0,this._currentLengthIndex=0,this._currentLength=b._SIZES[this._currentLengthIndex],this._growCount=Math.round(this._currentLengthIndex+1<b._SIZES.length?2/3*this._currentLength:0),this._elements=[],b._nullOutEntries(this._elements,this._currentLength)}static _nullOutEntries(i,n){for(let t=0;t<n;t++)i[t]=null}_hash2(i,n){return(i<<5)-i+n|0}_hashFunc(i,n,t){return this._hash2(this._hash2(i,n),t)%this._currentLength}get(i,n,t){const r=this._hashFunc(i,n,t);let u=this._elements[r];for(;u;){if(u.tokenTypeIndex===i&&u.tokenModifierSet===n&&u.languageId===t)return u;u=u.next}return null}add(i,n,t,r){if(this._elementsCount++,this._growCount!==0&&this._elementsCount>=this._growCount){const u=this._elements;this._currentLengthIndex++,this._currentLength=b._SIZES[this._currentLengthIndex],this._growCount=Math.round(this._currentLengthIndex+1<b._SIZES.length?2/3*this._currentLength:0),this._elements=[],b._nullOutEntries(this._elements,this._currentLength);for(const f of u){let c=f;for(;c;){const d=c.next;c.next=null,this._add(c),c=d}}}this._add(new v(i,n,t,r))}_add(i){const n=this._hashFunc(i.tokenTypeIndex,i.tokenModifierSet,i.languageId);i.next=this._elements[n],this._elements[n]=i}}b._SIZES=[3,7,13,31,61,127,251,509,1021,2039,4093,8191,16381,32749,65521,131071,262139,524287,1048573,2097143]}),define(se[865],oe([1,0,2,43,23,64,256,238,45]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticTokensStylingService=void 0;let v=class extends L.Disposable{constructor(a,i,n){super(),this._themeService=a,this._logService=i,this._languageService=n,this._caches=new WeakMap,this._register(this._themeService.onDidColorThemeChange(()=>{this._caches=new WeakMap}))}getStyling(a){return this._caches.has(a)||this._caches.set(a,new S.SemanticTokensProviderStyling(a.getLegend(),this._themeService,this._languageService,this._logService)),this._caches.get(a)}};e.SemanticTokensStylingService=v,e.SemanticTokensStylingService=v=ke([ge(0,y.IThemeService),ge(1,E.ILogService),ge(2,k.ILanguageService)],v),(0,_.registerSingleton)(p.ISemanticTokensStylingService,v,1)}),define(se[370],oe([1,0,108,2,153,41,83,23,48]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEditorNavigationQuickAccessProvider=void 0;class v{constructor(a){this.options=a,this.rangeHighlightDecorationId=void 0}provide(a,i){var n;const t=new k.DisposableStore;a.canAcceptInBackground=!!(!((n=this.options)===null||n===void 0)&&n.canAcceptInBackground),a.matchOnLabel=a.matchOnDescription=a.matchOnDetail=a.sortByLabel=!1;const r=t.add(new k.MutableDisposable);return r.value=this.doProvide(a,i),t.add(this.onDidActiveTextEditorControlChange(()=>{r.value=void 0,r.value=this.doProvide(a,i)})),t}doProvide(a,i){var n;const t=new k.DisposableStore,r=this.activeTextEditorControl;if(r&&this.canProvideWithTextEditor(r)){const u={editor:r},f=(0,y.getCodeEditor)(r);if(f){let c=(n=r.saveViewState())!==null&&n!==void 0?n:void 0;t.add(f.onDidChangeCursorPosition(()=>{var d;c=(d=r.saveViewState())!==null&&d!==void 0?d:void 0})),u.restoreViewState=()=>{c&&r===this.activeTextEditorControl&&r.restoreViewState(c)},t.add((0,L.createSingleCallFunction)(i.onCancellationRequested)(()=>{var d;return(d=u.restoreViewState)===null||d===void 0?void 0:d.call(u)}))}t.add((0,k.toDisposable)(()=>this.clearDecorations(r))),t.add(this.provideWithTextEditor(u,a,i))}else t.add(this.provideWithoutTextEditor(a,i));return t}canProvideWithTextEditor(a){return!0}gotoLocation({editor:a},i){a.setSelection(i.range),a.revealRangeInCenter(i.range,0),i.preserveFocus||a.focus();const n=a.getModel();n&&"getLineContent"in n&&(0,_.status)(`${n.getLineContent(i.range.startLineNumber)}`)}getModel(a){var i;return(0,y.isDiffEditor)(a)?(i=a.getModel())===null||i===void 0?void 0:i.modified:a.getModel()}addDecorations(a,i){a.changeDecorations(n=>{const t=[];this.rangeHighlightDecorationId&&(t.push(this.rangeHighlightDecorationId.overviewRulerDecorationId),t.push(this.rangeHighlightDecorationId.rangeHighlightId),this.rangeHighlightDecorationId=void 0);const r=[{range:i,options:{description:"quick-access-range-highlight",className:"rangeHighlight",isWholeLine:!0}},{range:i,options:{description:"quick-access-range-highlight-overview",overviewRuler:{color:(0,p.themeColorFromId)(S.overviewRulerRangeHighlight),position:E.OverviewRulerLane.Full}}}],[u,f]=n.deltaDecorations(t,r);this.rangeHighlightDecorationId={rangeHighlightId:u,overviewRulerDecorationId:f}})}clearDecorations(a){const i=this.rangeHighlightDecorationId;i&&(a.changeDecorations(n=>{n.deltaDecorations([i.overviewRulerDecorationId,i.rangeHighlightId],[])}),this.rangeHighlightDecorationId=void 0)}}e.AbstractEditorNavigationQuickAccessProvider=v}),define(se[866],oe([1,0,2,153,370,707]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractGotoLineQuickAccessProvider=void 0;class S extends y.AbstractEditorNavigationQuickAccessProvider{constructor(){super({canAcceptInBackground:!0})}provideWithoutTextEditor(_){const v=(0,E.localize)(0,null);return _.items=[{label:v}],_.ariaLabel=v,L.Disposable.None}provideWithTextEditor(_,v,b){const a=_.editor,i=new L.DisposableStore;i.add(v.onDidAccept(r=>{const[u]=v.selectedItems;if(u){if(!this.isValidLineNumber(a,u.lineNumber))return;this.gotoLocation(_,{range:this.toRange(u.lineNumber,u.column),keyMods:v.keyMods,preserveFocus:r.inBackground}),r.inBackground||v.hide()}}));const n=()=>{const r=this.parsePosition(a,v.value.trim().substr(S.PREFIX.length)),u=this.getPickLabel(a,r.lineNumber,r.column);if(v.items=[{lineNumber:r.lineNumber,column:r.column,label:u}],v.ariaLabel=u,!this.isValidLineNumber(a,r.lineNumber)){this.clearDecorations(a);return}const f=this.toRange(r.lineNumber,r.column);a.revealRangeInCenter(f,0),this.addDecorations(a,f)};n(),i.add(v.onDidChangeValue(()=>n()));const t=(0,k.getCodeEditor)(a);return t&&t.getOptions().get(67).renderType===2&&(t.updateOptions({lineNumbers:"on"}),i.add((0,L.toDisposable)(()=>t.updateOptions({lineNumbers:"relative"})))),i}toRange(_=1,v=1){return{startLineNumber:_,startColumn:v,endLineNumber:_,endColumn:v}}parsePosition(_,v){const b=v.split(/,|:|#/).map(i=>parseInt(i,10)).filter(i=>!isNaN(i)),a=this.lineCount(_)+1;return{lineNumber:b[0]>0?b[0]:a+b[0],column:b[1]}}getPickLabel(_,v,b){if(this.isValidLineNumber(_,v))return this.isValidColumn(_,v,b)?(0,E.localize)(1,null,v,b):(0,E.localize)(2,null,v);const a=_.getPosition()||{lineNumber:1,column:1},i=this.lineCount(_);return i>1?(0,E.localize)(3,null,a.lineNumber,a.column,i):(0,E.localize)(4,null,a.lineNumber,a.column)}isValidLineNumber(_,v){return!v||typeof v!="number"?!1:v>0&&v<=this.lineCount(_)}isValidColumn(_,v,b){if(!b||typeof b!="number")return!1;const a=this.getModel(_);if(!a)return!1;const i={lineNumber:v,column:b};return a.validatePosition(i).equals(i)}lineCount(_){var v,b;return(b=(v=this.getModel(_))===null||v===void 0?void 0:v.getLineCount())!==null&&b!==void 0?b:0}}e.AbstractGotoLineQuickAccessProvider=S,S.PREFIX=":"}),define(se[867],oe([1,0,14,19,26,28,586,2,11,5,31,165,370,708,18,60]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";var u;Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractGotoSymbolQuickAccessProvider=void 0;let f=u=class extends i.AbstractEditorNavigationQuickAccessProvider{constructor(l,o,g=Object.create(null)){super(g),this._languageFeaturesService=l,this._outlineModelService=o,this.options=g,this.options.canAcceptInBackground=!0}provideWithoutTextEditor(l){return this.provideLabelPick(l,(0,n.localize)(0,null)),p.Disposable.None}provideWithTextEditor(l,o,g){const h=l.editor,m=this.getModel(h);return m?this._languageFeaturesService.documentSymbolProvider.has(m)?this.doProvideWithEditorSymbols(l,m,o,g):this.doProvideWithoutEditorSymbols(l,m,o,g):p.Disposable.None}doProvideWithoutEditorSymbols(l,o,g,h){const m=new p.DisposableStore;return this.provideLabelPick(g,(0,n.localize)(1,null)),(async()=>!await this.waitForLanguageSymbolRegistry(o,m)||h.isCancellationRequested||m.add(this.doProvideWithEditorSymbols(l,o,g,h)))(),m}provideLabelPick(l,o){l.items=[{label:o,index:0,kind:14}],l.ariaLabel=o}async waitForLanguageSymbolRegistry(l,o){if(this._languageFeaturesService.documentSymbolProvider.has(l))return!0;const g=new L.DeferredPromise,h=o.add(this._languageFeaturesService.documentSymbolProvider.onDidChange(()=>{this._languageFeaturesService.documentSymbolProvider.has(l)&&(h.dispose(),g.complete(!0))}));return o.add((0,p.toDisposable)(()=>g.complete(!1))),g.p}doProvideWithEditorSymbols(l,o,g,h){var m;const C=l.editor,w=new p.DisposableStore;w.add(g.onDidAccept(A=>{const[P]=g.selectedItems;P&&P.range&&(this.gotoLocation(l,{range:P.range.selection,keyMods:g.keyMods,preserveFocus:A.inBackground}),A.inBackground||g.hide())})),w.add(g.onDidTriggerItemButton(({item:A})=>{A&&A.range&&(this.gotoLocation(l,{range:A.range.selection,keyMods:g.keyMods,forceSideBySide:!0}),g.hide())}));const D=this.getDocumentSymbols(o,h);let I;const T=async A=>{I?.dispose(!0),g.busy=!1,I=new k.CancellationTokenSource(h),g.busy=!0;try{const P=(0,S.prepareQuery)(g.value.substr(u.PREFIX.length).trim()),N=await this.doGetSymbolPicks(D,P,void 0,I.token);if(h.isCancellationRequested)return;if(N.length>0){if(g.items=N,A&&P.original.length===0){const M=(0,r.findLast)(N,R=>!!(R.type!=="separator"&&R.range&&v.Range.containsPosition(R.range.decoration,A)));M&&(g.activeItems=[M])}}else P.original.length>0?this.provideLabelPick(g,(0,n.localize)(2,null)):this.provideLabelPick(g,(0,n.localize)(3,null))}finally{h.isCancellationRequested||(g.busy=!1)}};return w.add(g.onDidChangeValue(()=>T(void 0))),T((m=C.getSelection())===null||m===void 0?void 0:m.getPosition()),w.add(g.onDidChangeActive(()=>{const[A]=g.activeItems;A&&A.range&&(C.revealRangeInCenter(A.range.selection,0),this.addDecorations(C,A.range.decoration))})),w}async doGetSymbolPicks(l,o,g,h){var m,C;const w=await l;if(h.isCancellationRequested)return[];const D=o.original.indexOf(u.SCOPE_PREFIX)===0,I=D?1:0;let T,A;o.values&&o.values.length>1?(T=(0,S.pieceToQuery)(o.values[0]),A=(0,S.pieceToQuery)(o.values.slice(1))):T=o;let P;const N=(C=(m=this.options)===null||m===void 0?void 0:m.openSideBySideDirection)===null||C===void 0?void 0:C.call(m);N&&(P=[{iconClass:N==="right"?E.ThemeIcon.asClassName(y.Codicon.splitHorizontal):E.ThemeIcon.asClassName(y.Codicon.splitVertical),tooltip:N==="right"?(0,n.localize)(4,null):(0,n.localize)(5,null)}]);const M=[];for(let O=0;O<w.length;O++){const B=w[O],W=(0,_.trim)(B.name),V=`$(${b.SymbolKinds.toIcon(B.kind).id}) ${W}`,K=V.length-W.length;let F=B.containerName;g?.extraContainerLabel&&(F?F=`${g.extraContainerLabel} \u2022 ${F}`:F=g.extraContainerLabel);let q,ie,ae,ne;if(o.original.length>I){let J=!1;if(T!==o&&([q,ie]=(0,S.scoreFuzzy2)(V,{...o,values:void 0},I,K),typeof q=="number"&&(J=!0)),typeof q!="number"&&([q,ie]=(0,S.scoreFuzzy2)(V,T,I,K),typeof q!="number"))continue;if(!J&&A){if(F&&A.original.length>0&&([ae,ne]=(0,S.scoreFuzzy2)(F,A)),typeof ae!="number")continue;typeof q=="number"&&(q+=ae)}}const $=B.tags&&B.tags.indexOf(1)>=0;M.push({index:O,kind:B.kind,score:q,label:V,ariaLabel:(0,b.getAriaLabelForSymbol)(B.name,B.kind),description:F,highlights:$?void 0:{label:ie,description:ne},range:{selection:v.Range.collapseToStart(B.selectionRange),decoration:B.range},strikethrough:$,buttons:P})}const R=M.sort((O,B)=>D?this.compareByKindAndScore(O,B):this.compareByScore(O,B));let x=[];if(D){let V=function(){B&&typeof O=="number"&&W>0&&(B.label=(0,_.format)(d[O]||c,W))},O,B,W=0;for(const K of R)O!==K.kind?(V(),O=K.kind,W=1,B={type:"separator"},x.push(B)):W++,x.push(K);V()}else R.length>0&&(x=[{label:(0,n.localize)(6,null,M.length),type:"separator"},...R]);return x}compareByScore(l,o){if(typeof l.score!="number"&&typeof o.score=="number")return 1;if(typeof l.score=="number"&&typeof o.score!="number")return-1;if(typeof l.score=="number"&&typeof o.score=="number"){if(l.score>o.score)return-1;if(l.score<o.score)return 1}return l.index<o.index?-1:l.index>o.index?1:0}compareByKindAndScore(l,o){const g=d[l.kind]||c,h=d[o.kind]||c,m=g.localeCompare(h);return m===0?this.compareByScore(l,o):m}async getDocumentSymbols(l,o){const g=await this._outlineModelService.getOrCreate(l,o);return o.isCancellationRequested?[]:g.asListOfDocumentSymbols()}};e.AbstractGotoSymbolQuickAccessProvider=f,f.PREFIX="@",f.SCOPE_PREFIX=":",f.PREFIX_BY_CATEGORY=`${u.PREFIX}${u.SCOPE_PREFIX}`,e.AbstractGotoSymbolQuickAccessProvider=f=u=ke([ge(0,t.ILanguageFeaturesService),ge(1,a.IOutlineModelService)],f);const c=(0,n.localize)(7,null),d={[5]:(0,n.localize)(8,null),[11]:(0,n.localize)(9,null),[8]:(0,n.localize)(10,null),[12]:(0,n.localize)(11,null),[4]:(0,n.localize)(12,null),[22]:(0,n.localize)(13,null),[23]:(0,n.localize)(14,null),[24]:(0,n.localize)(15,null),[10]:(0,n.localize)(16,null),[2]:(0,n.localize)(17,null),[3]:(0,n.localize)(18,null),[25]:(0,n.localize)(19,null),[1]:(0,n.localize)(20,null),[6]:(0,n.localize)(21,null),[9]:(0,n.localize)(22,null),[21]:(0,n.localize)(23,null),[14]:(0,n.localize)(24,null),[0]:(0,n.localize)(25,null),[17]:(0,n.localize)(26,null),[15]:(0,n.localize)(27,null),[16]:(0,n.localize)(28,null),[18]:(0,n.localize)(29,null),[19]:(0,n.localize)(30,null),[7]:(0,n.localize)(31,null),[13]:(0,n.localize)(32,null)}}),define(se[868],oe([1,0,2,10,711,15,34,29,23,475]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RenameInputField=e.CONTEXT_RENAME_INPUT_VISIBLE=void 0,e.CONTEXT_RENAME_INPUT_VISIBLE=new E.RawContextKey("renameInputVisible",!1,(0,y.localize)(0,null));let v=class{constructor(a,i,n,t,r){this._editor=a,this._acceptKeybindings=i,this._themeService=n,this._keybindingService=t,this._disposables=new L.DisposableStore,this.allowEditorOverflow=!0,this._visibleContextKey=e.CONTEXT_RENAME_INPUT_VISIBLE.bindTo(r),this._editor.addContentWidget(this),this._disposables.add(this._editor.onDidChangeConfiguration(u=>{u.hasChanged(50)&&this._updateFont()})),this._disposables.add(n.onDidColorThemeChange(this._updateStyles,this))}dispose(){this._disposables.dispose(),this._editor.removeContentWidget(this)}getId(){return"__renameInputWidget"}getDomNode(){return this._domNode||(this._domNode=document.createElement("div"),this._domNode.className="monaco-editor rename-box",this._input=document.createElement("input"),this._input.className="rename-input",this._input.type="text",this._input.setAttribute("aria-label",(0,y.localize)(1,null)),this._domNode.appendChild(this._input),this._label=document.createElement("div"),this._label.className="rename-label",this._domNode.appendChild(this._label),this._updateFont(),this._updateStyles(this._themeService.getColorTheme())),this._domNode}_updateStyles(a){var i,n,t,r;if(!this._input||!this._domNode)return;const u=a.getColor(p.widgetShadow),f=a.getColor(p.widgetBorder);this._domNode.style.backgroundColor=String((i=a.getColor(p.editorWidgetBackground))!==null&&i!==void 0?i:""),this._domNode.style.boxShadow=u?` 0 0 8px 2px ${u}`:"",this._domNode.style.border=f?`1px solid ${f}`:"",this._domNode.style.color=String((n=a.getColor(p.inputForeground))!==null&&n!==void 0?n:""),this._input.style.backgroundColor=String((t=a.getColor(p.inputBackground))!==null&&t!==void 0?t:"");const c=a.getColor(p.inputBorder);this._input.style.borderWidth=c?"1px":"0px",this._input.style.borderStyle=c?"solid":"none",this._input.style.borderColor=(r=c?.toString())!==null&&r!==void 0?r:"none"}_updateFont(){if(!this._input||!this._label)return;const a=this._editor.getOption(50);this._input.style.fontFamily=a.fontFamily,this._input.style.fontWeight=a.fontWeight,this._input.style.fontSize=`${a.fontSize}px`,this._label.style.fontSize=`${a.fontSize*.8}px`}getPosition(){return this._visible?{position:this._position,preference:[2,1]}:null}beforeRender(){var a,i;const[n,t]=this._acceptKeybindings;return this._label.innerText=(0,y.localize)(2,null,(a=this._keybindingService.lookupKeybinding(n))===null||a===void 0?void 0:a.getLabel(),(i=this._keybindingService.lookupKeybinding(t))===null||i===void 0?void 0:i.getLabel()),null}afterRender(a){a||this.cancelInput(!0)}acceptInput(a){var i;(i=this._currentAcceptInput)===null||i===void 0||i.call(this,a)}cancelInput(a){var i;(i=this._currentCancelInput)===null||i===void 0||i.call(this,a)}getInput(a,i,n,t,r,u){this._domNode.classList.toggle("preview",r),this._position=new k.Position(a.startLineNumber,a.startColumn),this._input.value=i,this._input.setAttribute("selectionStart",n.toString()),this._input.setAttribute("selectionEnd",t.toString()),this._input.size=Math.max((a.endColumn-a.startColumn)*1.1,20);const f=new L.DisposableStore;return new Promise(c=>{this._currentCancelInput=d=>(this._currentAcceptInput=void 0,this._currentCancelInput=void 0,c(d),!0),this._currentAcceptInput=d=>{if(this._input.value.trim().length===0||this._input.value===i){this.cancelInput(!0);return}this._currentAcceptInput=void 0,this._currentCancelInput=void 0,c({newName:this._input.value,wantsPreview:r&&d})},f.add(u.onCancellationRequested(()=>this.cancelInput(!0))),f.add(this._editor.onDidBlurEditorWidget(()=>{var d;return this.cancelInput(!(!((d=this._domNode)===null||d===void 0)&&d.ownerDocument.hasFocus()))})),this._show()}).finally(()=>{f.dispose(),this._hide()})}_show(){this._editor.revealLineInCenterIfOutsideViewport(this._position.lineNumber,0),this._visible=!0,this._visibleContextKey.set(!0),this._editor.layoutContentWidget(this),setTimeout(()=>{this._input.focus(),this._input.setSelectionRange(parseInt(this._input.getAttribute("selectionStart")),parseInt(this._input.getAttribute("selectionEnd")))},100)}_hide(){this._visible=!1,this._visibleContextKey.reset(),this._editor.layoutContentWidget(this)}};e.RenameInputField=v,e.RenameInputField=v=ke([ge(2,_.IThemeService),ge(3,S.IKeybindingService),ge(4,E.IContextKeyService)],v)}),define(se[869],oe([1,0,48,14,19,12,2,20,22,105,16,136,33,10,5,21,189,166,710,98,15,8,64,50,88,37,868,18]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w){"use strict";var D;Object.defineProperty(e,"__esModule",{value:!0}),e.RenameAction=e.rename=void 0;class I{constructor(R,x,O){this.model=R,this.position=x,this._providerRenameIdx=0,this._providers=O.ordered(R)}hasProvider(){return this._providers.length>0}async resolveRenameLocation(R){const x=[];for(this._providerRenameIdx=0;this._providerRenameIdx<this._providers.length;this._providerRenameIdx++){const B=this._providers[this._providerRenameIdx];if(!B.resolveRenameLocation)break;const W=await B.resolveRenameLocation(this.model,this.position,R);if(W){if(W.rejectReason){x.push(W.rejectReason);continue}return W}}this._providerRenameIdx=0;const O=this.model.getWordAtPosition(this.position);return O?{range:new t.Range(this.position.lineNumber,O.startColumn,this.position.lineNumber,O.endColumn),text:O.word,rejectReason:x.length>0?x.join(`
+`):void 0}:{range:t.Range.fromPositions(this.position),text:"",rejectReason:x.length>0?x.join(`
+`):void 0}}async provideRenameEdits(R,x){return this._provideRenameEdits(R,this._providerRenameIdx,[],x)}async _provideRenameEdits(R,x,O,B){const W=this._providers[x];if(!W)return{edits:[],rejectReason:O.join(`
+`)};const V=await W.provideRenameEdits(this.model,this.position,R,B);if(V){if(V.rejectReason)return this._provideRenameEdits(R,x+1,O.concat(V.rejectReason),B)}else return this._provideRenameEdits(R,x+1,O.concat(c.localize(0,null)),B);return V}}async function T(M,R,x,O){const B=new I(R,x,M),W=await B.resolveRenameLocation(y.CancellationToken.None);return W?.rejectReason?{edits:[],rejectReason:W.rejectReason}:B.provideRenameEdits(O,y.CancellationToken.None)}e.rename=T;let A=D=class{static get(R){return R.getContribution(D.ID)}constructor(R,x,O,B,W,V,K,F){this.editor=R,this._instaService=x,this._notificationService=O,this._bulkEditService=B,this._progressService=W,this._logService=V,this._configService=K,this._languageFeaturesService=F,this._disposableStore=new S.DisposableStore,this._cts=new y.CancellationTokenSource,this._renameInputField=this._disposableStore.add(this._instaService.createInstance(C.RenameInputField,this.editor,["acceptRenameInput","acceptRenameInputWithPreview"]))}dispose(){this._disposableStore.dispose(),this._cts.dispose(!0)}async run(){var R,x;if(this._cts.dispose(!0),this._cts=new y.CancellationTokenSource,!this.editor.hasModel())return;const O=this.editor.getPosition(),B=new I(this.editor.getModel(),O,this._languageFeaturesService.renameProvider);if(!B.hasProvider())return;const W=new v.EditorStateCancellationTokenSource(this.editor,5,void 0,this._cts.token);let V;try{const J=B.resolveRenameLocation(W.token);this._progressService.showWhile(J,250),V=await J}catch(J){(R=f.MessageController.get(this.editor))===null||R===void 0||R.showMessage(J||c.localize(1,null),O);return}finally{W.dispose()}if(!V)return;if(V.rejectReason){(x=f.MessageController.get(this.editor))===null||x===void 0||x.showMessage(V.rejectReason,O);return}if(W.token.isCancellationRequested)return;const K=new v.EditorStateCancellationTokenSource(this.editor,5,V.range,this._cts.token),F=this.editor.getSelection();let q=0,ie=V.text.length;!t.Range.isEmpty(F)&&!t.Range.spansMultipleLines(F)&&t.Range.containsRange(V.range,F)&&(q=Math.max(0,F.startColumn-V.range.startColumn),ie=Math.min(V.range.endColumn,F.endColumn)-V.range.startColumn);const ae=this._bulkEditService.hasPreviewHandler()&&this._configService.getValue(this.editor.getModel().uri,"editor.rename.enablePreview"),ne=await this._renameInputField.getInput(V.range,V.text,q,ie,ae,K.token);if(typeof ne=="boolean"){ne&&this.editor.focus(),K.dispose();return}this.editor.focus();const $=(0,k.raceCancellation)(B.provideRenameEdits(ne.newName,K.token),K.token).then(async J=>{if(!(!J||!this.editor.hasModel())){if(J.rejectReason){this._notificationService.info(J.rejectReason);return}this.editor.setSelection(t.Range.fromPositions(this.editor.getSelection().getPosition())),this._bulkEditService.apply(J,{editor:this.editor,showPreview:ne.wantsPreview,label:c.localize(2,null,V?.text,ne.newName),code:"undoredo.rename",quotableLabel:c.localize(3,null,V?.text,ne.newName),respectAutoSaveConfig:!0}).then(Q=>{Q.ariaSummary&&(0,L.alert)(c.localize(4,null,V.text,ne.newName,Q.ariaSummary))}).catch(Q=>{this._notificationService.error(c.localize(5,null)),this._logService.error(Q)})}},J=>{this._notificationService.error(c.localize(6,null)),this._logService.error(J)}).finally(()=>{K.dispose()});return this._progressService.showWhile($,250),$}acceptRenameInput(R){this._renameInputField.acceptInput(R)}cancelRenameInput(){this._renameInputField.cancelInput(!0)}};A.ID="editor.contrib.renameController",A=D=ke([ge(1,l.IInstantiationService),ge(2,g.INotificationService),ge(3,a.IBulkEditService),ge(4,h.IEditorProgressService),ge(5,o.ILogService),ge(6,u.ITextResourceConfigurationService),ge(7,w.ILanguageFeaturesService)],A);class P extends b.EditorAction{constructor(){super({id:"editor.action.rename",label:c.localize(7,null),alias:"Rename Symbol",precondition:s.ContextKeyExpr.and(r.EditorContextKeys.writable,r.EditorContextKeys.hasRenameProvider),kbOpts:{kbExpr:r.EditorContextKeys.editorTextFocus,primary:60,weight:100},contextMenuOpts:{group:"1_modification",order:1.1}})}runCommand(R,x){const O=R.get(i.ICodeEditorService),[B,W]=Array.isArray(x)&&x||[void 0,void 0];return _.URI.isUri(B)&&n.Position.isIPosition(W)?O.openCodeEditor({resource:B},O.getActiveCodeEditor()).then(V=>{V&&(V.setPosition(W),V.invokeWithinContext(K=>(this.reportTelemetry(K,V),this.run(K,V))))},E.onUnexpectedError):super.runCommand(R,x)}run(R,x){const O=A.get(x);return O?O.run():Promise.resolve()}}e.RenameAction=P,(0,b.registerEditorContribution)(A.ID,A,4),(0,b.registerEditorAction)(P);const N=b.EditorCommand.bindToContribution(A.get);(0,b.registerEditorCommand)(new N({id:"acceptRenameInput",precondition:C.CONTEXT_RENAME_INPUT_VISIBLE,handler:M=>M.acceptRenameInput(!1),kbOpts:{weight:100+99,kbExpr:s.ContextKeyExpr.and(r.EditorContextKeys.focus,s.ContextKeyExpr.not("isComposing")),primary:3}})),(0,b.registerEditorCommand)(new N({id:"acceptRenameInputWithPreview",precondition:s.ContextKeyExpr.and(C.CONTEXT_RENAME_INPUT_VISIBLE,s.ContextKeyExpr.has("config.editor.rename.enablePreview")),handler:M=>M.acceptRenameInput(!0),kbOpts:{weight:100+99,kbExpr:s.ContextKeyExpr.and(r.EditorContextKeys.focus,s.ContextKeyExpr.not("isComposing")),primary:1024+3}})),(0,b.registerEditorCommand)(new N({id:"cancelRenameInput",precondition:C.CONTEXT_RENAME_INPUT_VISIBLE,handler:M=>M.cancelRenameInput(),kbOpts:{weight:100+99,kbExpr:r.EditorContextKeys.focus,primary:9,secondary:[1033]}})),(0,b.registerModelAndPositionCommand)("_executeDocumentRenameProvider",function(M,R,x,...O){const[B]=O;(0,p.assertType)(typeof B=="string");const{renameProvider:W}=M.get(w.ILanguageFeaturesService);return T(W,R,x,B)}),(0,b.registerModelAndPositionCommand)("_executePrepareRename",async function(M,R,x){const{renameProvider:O}=M.get(w.ILanguageFeaturesService),W=await new I(R,x,O).resolveRenameLocation(y.CancellationToken.None);if(W?.rejectReason)throw new Error(W.rejectReason);return W}),m.Registry.as(d.Extensions.Configuration).registerConfiguration({id:"editor",properties:{"editor.rename.enablePreview":{scope:5,description:c.localize(8,null),default:!0,type:"boolean"}}})}),define(se[870],oe([1,0,2,12,51,27,14,19,23,256,344,79,61,18,238,131,308]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u){"use strict";var f;Object.defineProperty(e,"__esModule",{value:!0}),e.DocumentSemanticTokensFeature=void 0;let c=class extends L.Disposable{constructor(o,g,h,m,C,w){super(),this._watchers=Object.create(null);const D=A=>{this._watchers[A.uri.toString()]=new d(A,o,h,C,w)},I=(A,P)=>{P.dispose(),delete this._watchers[A.uri.toString()]},T=()=>{for(const A of g.getModels()){const P=this._watchers[A.uri.toString()];(0,u.isSemanticColoringEnabled)(A,h,m)?P||D(A):P&&I(A,P)}};g.getModels().forEach(A=>{(0,u.isSemanticColoringEnabled)(A,h,m)&&D(A)}),this._register(g.onModelAdded(A=>{(0,u.isSemanticColoringEnabled)(A,h,m)&&D(A)})),this._register(g.onModelRemoved(A=>{const P=this._watchers[A.uri.toString()];P&&I(A,P)})),this._register(m.onDidChangeConfiguration(A=>{A.affectsConfiguration(u.SEMANTIC_HIGHLIGHTING_SETTING_ID)&&T()})),this._register(h.onDidColorThemeChange(T))}dispose(){for(const o of Object.values(this._watchers))o.dispose();super.dispose()}};e.DocumentSemanticTokensFeature=c,e.DocumentSemanticTokensFeature=c=ke([ge(0,t.ISemanticTokensStylingService),ge(1,y.IModelService),ge(2,_.IThemeService),ge(3,E.IConfigurationService),ge(4,a.ILanguageFeatureDebounceService),ge(5,n.ILanguageFeaturesService)],c);let d=f=class extends L.Disposable{constructor(o,g,h,m,C){super(),this._semanticTokensStylingService=g,this._isDisposed=!1,this._model=o,this._provider=C.documentSemanticTokensProvider,this._debounceInformation=m.for(this._provider,"DocumentSemanticTokens",{min:f.REQUEST_MIN_DELAY,max:f.REQUEST_MAX_DELAY}),this._fetchDocumentSemanticTokens=this._register(new S.RunOnceScheduler(()=>this._fetchDocumentSemanticTokensNow(),f.REQUEST_MIN_DELAY)),this._currentDocumentResponse=null,this._currentDocumentRequestCancellationTokenSource=null,this._documentProvidersChangeListeners=[],this._providersChangedDuringRequest=!1,this._register(this._model.onDidChangeContent(()=>{this._fetchDocumentSemanticTokens.isScheduled()||this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))})),this._register(this._model.onDidChangeAttached(()=>{this._fetchDocumentSemanticTokens.isScheduled()||this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))})),this._register(this._model.onDidChangeLanguage(()=>{this._currentDocumentResponse&&(this._currentDocumentResponse.dispose(),this._currentDocumentResponse=null),this._currentDocumentRequestCancellationTokenSource&&(this._currentDocumentRequestCancellationTokenSource.cancel(),this._currentDocumentRequestCancellationTokenSource=null),this._setDocumentSemanticTokens(null,null,null,[]),this._fetchDocumentSemanticTokens.schedule(0)}));const w=()=>{(0,L.dispose)(this._documentProvidersChangeListeners),this._documentProvidersChangeListeners=[];for(const D of this._provider.all(o))typeof D.onDidChange=="function"&&this._documentProvidersChangeListeners.push(D.onDidChange(()=>{if(this._currentDocumentRequestCancellationTokenSource){this._providersChangedDuringRequest=!0;return}this._fetchDocumentSemanticTokens.schedule(0)}))};w(),this._register(this._provider.onDidChange(()=>{w(),this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))})),this._register(h.onDidColorThemeChange(D=>{this._setDocumentSemanticTokens(null,null,null,[]),this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))})),this._fetchDocumentSemanticTokens.schedule(0)}dispose(){this._currentDocumentResponse&&(this._currentDocumentResponse.dispose(),this._currentDocumentResponse=null),this._currentDocumentRequestCancellationTokenSource&&(this._currentDocumentRequestCancellationTokenSource.cancel(),this._currentDocumentRequestCancellationTokenSource=null),(0,L.dispose)(this._documentProvidersChangeListeners),this._documentProvidersChangeListeners=[],this._setDocumentSemanticTokens(null,null,null,[]),this._isDisposed=!0,super.dispose()}_fetchDocumentSemanticTokensNow(){if(this._currentDocumentRequestCancellationTokenSource)return;if(!(0,b.hasDocumentSemanticTokensProvider)(this._provider,this._model)){this._currentDocumentResponse&&this._model.tokenization.setSemanticTokens(null,!1);return}if(!this._model.isAttachedToEditor())return;const o=new p.CancellationTokenSource,g=this._currentDocumentResponse?this._currentDocumentResponse.provider:null,h=this._currentDocumentResponse&&this._currentDocumentResponse.resultId||null,m=(0,b.getDocumentSemanticTokens)(this._provider,this._model,g,h,o.token);this._currentDocumentRequestCancellationTokenSource=o,this._providersChangedDuringRequest=!1;const C=[],w=this._model.onDidChangeContent(I=>{C.push(I)}),D=new i.StopWatch(!1);m.then(I=>{if(this._debounceInformation.update(this._model,D.elapsed()),this._currentDocumentRequestCancellationTokenSource=null,w.dispose(),!I)this._setDocumentSemanticTokens(null,null,null,C);else{const{provider:T,tokens:A}=I,P=this._semanticTokensStylingService.getStyling(T);this._setDocumentSemanticTokens(T,A||null,P,C)}},I=>{I&&(k.isCancellationError(I)||typeof I.message=="string"&&I.message.indexOf("busy")!==-1)||k.onUnexpectedError(I),this._currentDocumentRequestCancellationTokenSource=null,w.dispose(),(C.length>0||this._providersChangedDuringRequest)&&(this._fetchDocumentSemanticTokens.isScheduled()||this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model)))})}static _copy(o,g,h,m,C){C=Math.min(C,h.length-m,o.length-g);for(let w=0;w<C;w++)h[m+w]=o[g+w]}_setDocumentSemanticTokens(o,g,h,m){const C=this._currentDocumentResponse,w=()=>{(m.length>0||this._providersChangedDuringRequest)&&!this._fetchDocumentSemanticTokens.isScheduled()&&this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))};if(this._currentDocumentResponse&&(this._currentDocumentResponse.dispose(),this._currentDocumentResponse=null),this._isDisposed){o&&g&&o.releaseDocumentSemanticTokens(g.resultId);return}if(!o||!h){this._model.tokenization.setSemanticTokens(null,!1);return}if(!g){this._model.tokenization.setSemanticTokens(null,!0),w();return}if((0,b.isSemanticTokensEdits)(g)){if(!C){this._model.tokenization.setSemanticTokens(null,!0);return}if(g.edits.length===0)g={resultId:g.resultId,data:C.data};else{let D=0;for(const N of g.edits)D+=(N.data?N.data.length:0)-N.deleteCount;const I=C.data,T=new Uint32Array(I.length+D);let A=I.length,P=T.length;for(let N=g.edits.length-1;N>=0;N--){const M=g.edits[N];if(M.start>I.length){h.warnInvalidEditStart(C.resultId,g.resultId,N,M.start,I.length),this._model.tokenization.setSemanticTokens(null,!0);return}const R=A-(M.start+M.deleteCount);R>0&&(f._copy(I,A-R,T,P-R,R),P-=R),M.data&&(f._copy(M.data,0,T,P-M.data.length,M.data.length),P-=M.data.length),A=M.start}A>0&&f._copy(I,0,T,0,A),g={resultId:g.resultId,data:T}}}if((0,b.isSemanticTokens)(g)){this._currentDocumentResponse=new s(o,g.resultId,g.data);const D=(0,v.toMultilineTokens2)(g,h,this._model.getLanguageId());if(m.length>0)for(const I of m)for(const T of D)for(const A of I.changes)T.applyEdit(A.range,A.text);this._model.tokenization.setSemanticTokens(D,!0)}else this._model.tokenization.setSemanticTokens(null,!0);w()}};d.REQUEST_MIN_DELAY=300,d.REQUEST_MAX_DELAY=2e3,d=f=ke([ge(1,t.ISemanticTokensStylingService),ge(2,_.IThemeService),ge(3,a.ILanguageFeatureDebounceService),ge(4,n.ILanguageFeaturesService)],d);class s{constructor(o,g,h){this.provider=o,this.resultId=g,this.data=h}dispose(){this.provider.releaseDocumentSemanticTokens(this.resultId)}}(0,r.registerEditorFeature)(c)}),define(se[871],oe([1,0,14,2,16,344,308,256,27,23,79,61,18,238]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewportSemanticTokensContribution=void 0;let t=class extends k.Disposable{constructor(u,f,c,d,s,l){super(),this._semanticTokensStylingService=f,this._themeService=c,this._configurationService=d,this._editor=u,this._provider=l.documentRangeSemanticTokensProvider,this._debounceInformation=s.for(this._provider,"DocumentRangeSemanticTokens",{min:100,max:500}),this._tokenizeViewport=this._register(new L.RunOnceScheduler(()=>this._tokenizeViewportNow(),100)),this._outstandingRequests=[];const o=()=>{this._editor.hasModel()&&this._tokenizeViewport.schedule(this._debounceInformation.get(this._editor.getModel()))};this._register(this._editor.onDidScrollChange(()=>{o()})),this._register(this._editor.onDidChangeModel(()=>{this._cancelAll(),o()})),this._register(this._editor.onDidChangeModelContent(g=>{this._cancelAll(),o()})),this._register(this._provider.onDidChange(()=>{this._cancelAll(),o()})),this._register(this._configurationService.onDidChangeConfiguration(g=>{g.affectsConfiguration(S.SEMANTIC_HIGHLIGHTING_SETTING_ID)&&(this._cancelAll(),o())})),this._register(this._themeService.onDidColorThemeChange(()=>{this._cancelAll(),o()})),o()}_cancelAll(){for(const u of this._outstandingRequests)u.cancel();this._outstandingRequests=[]}_removeOutstandingRequest(u){for(let f=0,c=this._outstandingRequests.length;f<c;f++)if(this._outstandingRequests[f]===u){this._outstandingRequests.splice(f,1);return}}_tokenizeViewportNow(){if(!this._editor.hasModel())return;const u=this._editor.getModel();if(u.tokenization.hasCompleteSemanticTokens())return;if(!(0,S.isSemanticColoringEnabled)(u,this._themeService,this._configurationService)){u.tokenization.hasSomeSemanticTokens()&&u.tokenization.setSemanticTokens(null,!1);return}if(!(0,E.hasDocumentRangeSemanticTokensProvider)(this._provider,u)){u.tokenization.hasSomeSemanticTokens()&&u.tokenization.setSemanticTokens(null,!1);return}const f=this._editor.getVisibleRangesPlusViewportAboveBelow();this._outstandingRequests=this._outstandingRequests.concat(f.map(c=>this._requestRange(u,c)))}_requestRange(u,f){const c=u.getVersionId(),d=(0,L.createCancelablePromise)(l=>Promise.resolve((0,E.getDocumentRangeSemanticTokens)(this._provider,u,f,l))),s=new a.StopWatch(!1);return d.then(l=>{if(this._debounceInformation.update(u,s.elapsed()),!l||!l.tokens||u.isDisposed()||u.getVersionId()!==c)return;const{provider:o,tokens:g}=l,h=this._semanticTokensStylingService.getStyling(o);u.tokenization.setPartialSemanticTokens(f,(0,p.toMultilineTokens2)(g,h,u.getLanguageId()))}).then(()=>this._removeOutstandingRequest(d),()=>this._removeOutstandingRequest(d)),d}};e.ViewportSemanticTokensContribution=t,t.ID="editor.contrib.viewportSemanticTokens",e.ViewportSemanticTokensContribution=t=ke([ge(1,n.ISemanticTokensStylingService),ge(2,v.IThemeService),ge(3,_.IConfigurationService),ge(4,b.ILanguageFeatureDebounceService),ge(5,i.ILanguageFeaturesService)],t),(0,y.registerEditorContribution)(t.ID,t,1)}),define(se[872],oe([1,0,7,230,26,28,6,71,2,22,31,792,51,43,720,341,82,23,355]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c){"use strict";var d;Object.defineProperty(e,"__esModule",{value:!0}),e.ItemRenderer=e.getAriaId=void 0;function s(m){return`suggest-aria-id:${m}`}e.getAriaId=s;const l=(0,u.registerIcon)("suggest-more-info",y.Codicon.chevronRight,t.localize(0,null)),o=new(d=class{extract(C,w){if(C.textLabel.match(d._regexStrict))return w[0]=C.textLabel,!0;if(C.completion.detail&&C.completion.detail.match(d._regexStrict))return w[0]=C.completion.detail,!0;if(C.completion.documentation){const D=typeof C.completion.documentation=="string"?C.completion.documentation:C.completion.documentation.value,I=d._regexRelaxed.exec(D);if(I&&(I.index===0||I.index+I[0].length===D.length))return w[0]=I[0],!0}return!1}},d._regexRelaxed=/(#([\da-fA-F]{3}){1,2}|(rgb|hsl)a\(\s*(\d{1,3}%?\s*,\s*){3}(1|0?\.\d+)\)|(rgb|hsl)\(\s*\d{1,3}%?(\s*,\s*\d{1,3}%?){2}\s*\))/,d._regexStrict=new RegExp(`^${d._regexRelaxed.source}$`,"i"),d);let g=class{constructor(C,w,D,I){this._editor=C,this._modelService=w,this._languageService=D,this._themeService=I,this._onDidToggleDetails=new S.Emitter,this.onDidToggleDetails=this._onDidToggleDetails.event,this.templateId="suggestion"}dispose(){this._onDidToggleDetails.dispose()}renderTemplate(C){const w=new _.DisposableStore,D=C;D.classList.add("show-file-icons");const I=(0,L.append)(C,(0,L.$)(".icon")),T=(0,L.append)(I,(0,L.$)("span.colorspan")),A=(0,L.append)(C,(0,L.$)(".contents")),P=(0,L.append)(A,(0,L.$)(".main")),N=(0,L.append)(P,(0,L.$)(".icon-label.codicon")),M=(0,L.append)(P,(0,L.$)("span.left")),R=(0,L.append)(P,(0,L.$)("span.right")),x=new k.IconLabel(M,{supportHighlights:!0,supportIcons:!0});w.add(x);const O=(0,L.append)(M,(0,L.$)("span.signature-label")),B=(0,L.append)(M,(0,L.$)("span.qualifier-label")),W=(0,L.append)(R,(0,L.$)("span.details-label")),V=(0,L.append)(R,(0,L.$)("span.readMore"+E.ThemeIcon.asCSSSelector(l)));return V.title=t.localize(1,null),{root:D,left:M,right:R,icon:I,colorspan:T,iconLabel:x,iconContainer:N,parametersLabel:O,qualifierLabel:B,detailsLabel:W,readMore:V,disposables:w,configureFont:()=>{const F=this._editor.getOptions(),q=F.get(50),ie=q.getMassagedFontFamily(),ae=q.fontFeatureSettings,ne=F.get(118)||q.fontSize,$=F.get(119)||q.lineHeight,J=q.fontWeight,Q=q.letterSpacing,re=`${ne}px`,de=`${$}px`,he=`${Q}px`;D.style.fontSize=re,D.style.fontWeight=J,D.style.letterSpacing=he,P.style.fontFamily=ie,P.style.fontFeatureSettings=ae,P.style.lineHeight=de,I.style.height=de,I.style.width=de,V.style.height=de,V.style.width=de}}}renderElement(C,w,D){D.configureFont();const{completion:I}=C;D.root.id=s(w),D.colorspan.style.backgroundColor="";const T={labelEscapeNewLines:!0,matches:(0,p.createMatches)(C.score)},A=[];if(I.kind===19&&o.extract(C,A))D.icon.className="icon customcolor",D.iconContainer.className="icon hide",D.colorspan.style.backgroundColor=A[0];else if(I.kind===20&&this._themeService.getFileIconTheme().hasFileIcons){D.icon.className="icon hide",D.iconContainer.className="icon hide";const P=(0,a.getIconClasses)(this._modelService,this._languageService,v.URI.from({scheme:"fake",path:C.textLabel}),r.FileKind.FILE),N=(0,a.getIconClasses)(this._modelService,this._languageService,v.URI.from({scheme:"fake",path:I.detail}),r.FileKind.FILE);T.extraClasses=P.length>N.length?P:N}else I.kind===23&&this._themeService.getFileIconTheme().hasFolderIcons?(D.icon.className="icon hide",D.iconContainer.className="icon hide",T.extraClasses=[(0,a.getIconClasses)(this._modelService,this._languageService,v.URI.from({scheme:"fake",path:C.textLabel}),r.FileKind.FOLDER),(0,a.getIconClasses)(this._modelService,this._languageService,v.URI.from({scheme:"fake",path:I.detail}),r.FileKind.FOLDER)].flat()):(D.icon.className="icon hide",D.iconContainer.className="",D.iconContainer.classList.add("suggest-icon",...E.ThemeIcon.asClassNameArray(b.CompletionItemKinds.toIcon(I.kind))));I.tags&&I.tags.indexOf(1)>=0&&(T.extraClasses=(T.extraClasses||[]).concat(["deprecated"]),T.matches=[]),D.iconLabel.setLabel(C.textLabel,void 0,T),typeof I.label=="string"?(D.parametersLabel.textContent="",D.detailsLabel.textContent=h(I.detail||""),D.root.classList.add("string-label")):(D.parametersLabel.textContent=h(I.label.detail||""),D.detailsLabel.textContent=h(I.label.description||""),D.root.classList.remove("string-label")),this._editor.getOption(117).showInlineDetails?(0,L.show)(D.detailsLabel):(0,L.hide)(D.detailsLabel),(0,c.canExpandCompletionItem)(C)?(D.right.classList.add("can-expand-details"),(0,L.show)(D.readMore),D.readMore.onmousedown=P=>{P.stopPropagation(),P.preventDefault()},D.readMore.onclick=P=>{P.stopPropagation(),P.preventDefault(),this._onDidToggleDetails.fire()}):(D.right.classList.remove("can-expand-details"),(0,L.hide)(D.readMore),D.readMore.onmousedown=null,D.readMore.onclick=null)}disposeTemplate(C){C.disposables.dispose()}};e.ItemRenderer=g,e.ItemRenderer=g=ke([ge(1,i.IModelService),ge(2,n.ILanguageService),ge(3,f.IThemeService)],g);function h(m){return m.replace(/\r\n|\r|\n/g,"")}}),define(se[873],oe([1,0,866,37,139,33,96,6,16,21,70]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GotoLineAction=e.StandaloneGotoLineQuickAccessProvider=void 0;let a=class extends L.AbstractGotoLineQuickAccessProvider{constructor(t){super(),this.editorService=t,this.onDidActiveTextEditorControlChange=p.Event.None}get activeTextEditorControl(){var t;return(t=this.editorService.getFocusedCodeEditor())!==null&&t!==void 0?t:void 0}};e.StandaloneGotoLineQuickAccessProvider=a,e.StandaloneGotoLineQuickAccessProvider=a=ke([ge(0,E.ICodeEditorService)],a);class i extends _.EditorAction{constructor(){super({id:i.ID,label:S.GoToLineNLS.gotoLineActionLabel,alias:"Go to Line/Column...",precondition:void 0,kbOpts:{kbExpr:v.EditorContextKeys.focus,primary:2085,mac:{primary:293},weight:100}})}run(t){t.get(b.IQuickInputService).quickAccess.show(a.PREFIX)}}e.GotoLineAction=i,i.ID="editor.action.gotoLine",(0,_.registerEditorAction)(i),k.Registry.as(y.Extensions.Quickaccess).registerQuickAccessProvider({ctor:a,prefix:a.PREFIX,helpEntries:[{description:S.GoToLineNLS.gotoLineActionLabel,commandId:i.ID}]})}),define(se[874],oe([1,0,867,37,139,33,96,6,16,21,70,165,18,177,254]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GotoSymbolAction=e.StandaloneGotoSymbolQuickAccessProvider=void 0;let n=class extends L.AbstractGotoSymbolQuickAccessProvider{constructor(u,f,c){super(f,c),this.editorService=u,this.onDidActiveTextEditorControlChange=p.Event.None}get activeTextEditorControl(){var u;return(u=this.editorService.getFocusedCodeEditor())!==null&&u!==void 0?u:void 0}};e.StandaloneGotoSymbolQuickAccessProvider=n,e.StandaloneGotoSymbolQuickAccessProvider=n=ke([ge(0,E.ICodeEditorService),ge(1,i.ILanguageFeaturesService),ge(2,a.IOutlineModelService)],n);class t extends _.EditorAction{constructor(){super({id:t.ID,label:S.QuickOutlineNLS.quickOutlineActionLabel,alias:"Go to Symbol...",precondition:v.EditorContextKeys.hasDocumentSymbolProvider,kbOpts:{kbExpr:v.EditorContextKeys.focus,primary:3117,weight:100},contextMenuOpts:{group:"navigation",order:3}})}run(u){u.get(b.IQuickInputService).quickAccess.show(L.AbstractGotoSymbolQuickAccessProvider.PREFIX,{itemActivation:b.ItemActivation.NONE})}}e.GotoSymbolAction=t,t.ID="editor.action.quickOutline",(0,_.registerEditorAction)(t),k.Registry.as(y.Extensions.Quickaccess).registerQuickAccessProvider({ctor:n,prefix:L.AbstractGotoSymbolQuickAccessProvider.PREFIX,helpEntries:[{description:S.QuickOutlineNLS.quickOutlineActionLabel,prefix:L.AbstractGotoSymbolQuickAccessProvider.PREFIX,commandId:t.ID},{description:S.QuickOutlineNLS.quickOutlineByCategoryActionLabel,prefix:L.AbstractGotoSymbolQuickAccessProvider.PREFIX_BY_CATEGORY}]})}),define(se[371],oe([1,0,7,47,851,33,15,45,23]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneCodeEditorService=void 0;let v=class extends y.AbstractCodeEditorService{constructor(a,i){super(i),this._register(this.onCodeEditorAdd(()=>this._checkContextKey())),this._register(this.onCodeEditorRemove(()=>this._checkContextKey())),this._editorIsOpen=a.createKey("editorIsOpen",!1),this._activeCodeEditor=null,this._register(this.registerCodeEditorOpenHandler(async(n,t,r)=>t?this.doOpenEditor(t,n):null))}_checkContextKey(){let a=!1;for(const i of this.listCodeEditors())if(!i.isSimpleWidget){a=!0;break}this._editorIsOpen.set(a)}setActiveCodeEditor(a){this._activeCodeEditor=a}getActiveCodeEditor(){return this._activeCodeEditor}doOpenEditor(a,i){if(!this.findModel(a,i.resource)){if(i.resource){const r=i.resource.scheme;if(r===k.Schemas.http||r===k.Schemas.https)return(0,L.windowOpenNoOpener)(i.resource.toString()),a}return null}const t=i.options?i.options.selection:null;if(t)if(typeof t.endLineNumber=="number"&&typeof t.endColumn=="number")a.setSelection(t),a.revealRangeInCenter(t,1);else{const r={lineNumber:t.startLineNumber,column:t.startColumn};a.setPosition(r),a.revealPositionInCenter(r,1)}return a}findModel(a,i){const n=a.getModel();return n&&n.uri.toString()!==i.toString()?null:n}};e.StandaloneCodeEditorService=v,e.StandaloneCodeEditorService=v=ke([ge(0,S.IContextKeyService),ge(1,_.IThemeService)],v),(0,p.registerSingleton)(E.ICodeEditorService,v,0)}),define(se[875],oe([1,0,83,29]),function(te,e,L,k){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.hc_light=e.hc_black=e.vs_dark=e.vs=void 0,e.vs={base:"vs",inherit:!1,rules:[{token:"",foreground:"000000",background:"fffffe"},{token:"invalid",foreground:"cd3131"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"001188"},{token:"variable.predefined",foreground:"4864AA"},{token:"constant",foreground:"dd0000"},{token:"comment",foreground:"008000"},{token:"number",foreground:"098658"},{token:"number.hex",foreground:"3030c0"},{token:"regexp",foreground:"800000"},{token:"annotation",foreground:"808080"},{token:"type",foreground:"008080"},{token:"delimiter",foreground:"000000"},{token:"delimiter.html",foreground:"383838"},{token:"delimiter.xml",foreground:"0000FF"},{token:"tag",foreground:"800000"},{token:"tag.id.pug",foreground:"4F76AC"},{token:"tag.class.pug",foreground:"4F76AC"},{token:"meta.scss",foreground:"800000"},{token:"metatag",foreground:"e00000"},{token:"metatag.content.html",foreground:"FF0000"},{token:"metatag.html",foreground:"808080"},{token:"metatag.xml",foreground:"808080"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"863B00"},{token:"string.key.json",foreground:"A31515"},{token:"string.value.json",foreground:"0451A5"},{token:"attribute.name",foreground:"FF0000"},{token:"attribute.value",foreground:"0451A5"},{token:"attribute.value.number",foreground:"098658"},{token:"attribute.value.unit",foreground:"098658"},{token:"attribute.value.html",foreground:"0000FF"},{token:"attribute.value.xml",foreground:"0000FF"},{token:"string",foreground:"A31515"},{token:"string.html",foreground:"0000FF"},{token:"string.sql",foreground:"FF0000"},{token:"string.yaml",foreground:"0451A5"},{token:"keyword",foreground:"0000FF"},{token:"keyword.json",foreground:"0451A5"},{token:"keyword.flow",foreground:"AF00DB"},{token:"keyword.flow.scss",foreground:"0000FF"},{token:"operator.scss",foreground:"666666"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"666666"},{token:"predefined.sql",foreground:"C700C7"}],colors:{[k.editorBackground]:"#FFFFFE",[k.editorForeground]:"#000000",[k.editorInactiveSelection]:"#E5EBF1",[L.editorIndentGuide1]:"#D3D3D3",[L.editorActiveIndentGuide1]:"#939393",[k.editorSelectionHighlight]:"#ADD6FF4D"}},e.vs_dark={base:"vs-dark",inherit:!1,rules:[{token:"",foreground:"D4D4D4",background:"1E1E1E"},{token:"invalid",foreground:"f44747"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"74B0DF"},{token:"variable.predefined",foreground:"4864AA"},{token:"variable.parameter",foreground:"9CDCFE"},{token:"constant",foreground:"569CD6"},{token:"comment",foreground:"608B4E"},{token:"number",foreground:"B5CEA8"},{token:"number.hex",foreground:"5BB498"},{token:"regexp",foreground:"B46695"},{token:"annotation",foreground:"cc6666"},{token:"type",foreground:"3DC9B0"},{token:"delimiter",foreground:"DCDCDC"},{token:"delimiter.html",foreground:"808080"},{token:"delimiter.xml",foreground:"808080"},{token:"tag",foreground:"569CD6"},{token:"tag.id.pug",foreground:"4F76AC"},{token:"tag.class.pug",foreground:"4F76AC"},{token:"meta.scss",foreground:"A79873"},{token:"meta.tag",foreground:"CE9178"},{token:"metatag",foreground:"DD6A6F"},{token:"metatag.content.html",foreground:"9CDCFE"},{token:"metatag.html",foreground:"569CD6"},{token:"metatag.xml",foreground:"569CD6"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"9CDCFE"},{token:"string.key.json",foreground:"9CDCFE"},{token:"string.value.json",foreground:"CE9178"},{token:"attribute.name",foreground:"9CDCFE"},{token:"attribute.value",foreground:"CE9178"},{token:"attribute.value.number.css",foreground:"B5CEA8"},{token:"attribute.value.unit.css",foreground:"B5CEA8"},{token:"attribute.value.hex.css",foreground:"D4D4D4"},{token:"string",foreground:"CE9178"},{token:"string.sql",foreground:"FF0000"},{token:"keyword",foreground:"569CD6"},{token:"keyword.flow",foreground:"C586C0"},{token:"keyword.json",foreground:"CE9178"},{token:"keyword.flow.scss",foreground:"569CD6"},{token:"operator.scss",foreground:"909090"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"909090"},{token:"predefined.sql",foreground:"FF00FF"}],colors:{[k.editorBackground]:"#1E1E1E",[k.editorForeground]:"#D4D4D4",[k.editorInactiveSelection]:"#3A3D41",[L.editorIndentGuide1]:"#404040",[L.editorActiveIndentGuide1]:"#707070",[k.editorSelectionHighlight]:"#ADD6FF26"}},e.hc_black={base:"hc-black",inherit:!1,rules:[{token:"",foreground:"FFFFFF",background:"000000"},{token:"invalid",foreground:"f44747"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"1AEBFF"},{token:"variable.parameter",foreground:"9CDCFE"},{token:"constant",foreground:"569CD6"},{token:"comment",foreground:"608B4E"},{token:"number",foreground:"FFFFFF"},{token:"regexp",foreground:"C0C0C0"},{token:"annotation",foreground:"569CD6"},{token:"type",foreground:"3DC9B0"},{token:"delimiter",foreground:"FFFF00"},{token:"delimiter.html",foreground:"FFFF00"},{token:"tag",foreground:"569CD6"},{token:"tag.id.pug",foreground:"4F76AC"},{token:"tag.class.pug",foreground:"4F76AC"},{token:"meta",foreground:"D4D4D4"},{token:"meta.tag",foreground:"CE9178"},{token:"metatag",foreground:"569CD6"},{token:"metatag.content.html",foreground:"1AEBFF"},{token:"metatag.html",foreground:"569CD6"},{token:"metatag.xml",foreground:"569CD6"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"9CDCFE"},{token:"string.key",foreground:"9CDCFE"},{token:"string.value",foreground:"CE9178"},{token:"attribute.name",foreground:"569CD6"},{token:"attribute.value",foreground:"3FF23F"},{token:"string",foreground:"CE9178"},{token:"string.sql",foreground:"FF0000"},{token:"keyword",foreground:"569CD6"},{token:"keyword.flow",foreground:"C586C0"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"909090"},{token:"predefined.sql",foreground:"FF00FF"}],colors:{[k.editorBackground]:"#000000",[k.editorForeground]:"#FFFFFF",[L.editorIndentGuide1]:"#FFFFFF",[L.editorActiveIndentGuide1]:"#FFFFFF"}},e.hc_light={base:"hc-light",inherit:!1,rules:[{token:"",foreground:"292929",background:"FFFFFF"},{token:"invalid",foreground:"B5200D"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"264F70"},{token:"variable.predefined",foreground:"4864AA"},{token:"constant",foreground:"dd0000"},{token:"comment",foreground:"008000"},{token:"number",foreground:"098658"},{token:"number.hex",foreground:"3030c0"},{token:"regexp",foreground:"800000"},{token:"annotation",foreground:"808080"},{token:"type",foreground:"008080"},{token:"delimiter",foreground:"000000"},{token:"delimiter.html",foreground:"383838"},{token:"tag",foreground:"800000"},{token:"tag.id.pug",foreground:"4F76AC"},{token:"tag.class.pug",foreground:"4F76AC"},{token:"meta.scss",foreground:"800000"},{token:"metatag",foreground:"e00000"},{token:"metatag.content.html",foreground:"B5200D"},{token:"metatag.html",foreground:"808080"},{token:"metatag.xml",foreground:"808080"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"863B00"},{token:"string.key.json",foreground:"A31515"},{token:"string.value.json",foreground:"0451A5"},{token:"attribute.name",foreground:"264F78"},{token:"attribute.value",foreground:"0451A5"},{token:"string",foreground:"A31515"},{token:"string.sql",foreground:"B5200D"},{token:"keyword",foreground:"0000FF"},{token:"keyword.flow",foreground:"AF00DB"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"666666"},{token:"predefined.sql",foreground:"C700C7"}],colors:{[k.editorBackground]:"#FFFFFF",[k.editorForeground]:"#292929",[L.editorIndentGuide1]:"#292929",[L.editorActiveIndentGuide1]:"#292929"}}}),define(se[372],oe([1,0,7,54,39,6,31,132,519,875,37,29,23,2,89,846,44]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneThemeService=e.HC_LIGHT_THEME_NAME=e.HC_BLACK_THEME_NAME=e.VS_DARK_THEME_NAME=e.VS_LIGHT_THEME_NAME=void 0,e.VS_LIGHT_THEME_NAME="vs",e.VS_DARK_THEME_NAME="vs-dark",e.HC_BLACK_THEME_NAME="hc-black",e.HC_LIGHT_THEME_NAME="hc-light";const f=b.Registry.as(a.Extensions.ColorContribution),c=b.Registry.as(i.Extensions.ThemingContribution);class d{constructor(m,C){this.semanticHighlighting=!1,this.themeData=C;const w=C.base;m.length>0?(s(m)?this.id=m:this.id=w+" "+m,this.themeName=m):(this.id=w,this.themeName=w),this.colors=null,this.defaultColors=Object.create(null),this._tokenTheme=null}get base(){return this.themeData.base}notifyBaseUpdated(){this.themeData.inherit&&(this.colors=null,this._tokenTheme=null)}getColors(){if(!this.colors){const m=new Map;for(const C in this.themeData.colors)m.set(C,y.Color.fromHex(this.themeData.colors[C]));if(this.themeData.inherit){const C=l(this.themeData.base);for(const w in C.colors)m.has(w)||m.set(w,y.Color.fromHex(C.colors[w]))}this.colors=m}return this.colors}getColor(m,C){const w=this.getColors().get(m);if(w)return w;if(C!==!1)return this.getDefault(m)}getDefault(m){let C=this.defaultColors[m];return C||(C=f.resolveDefaultColor(m,this),this.defaultColors[m]=C,C)}defines(m){return this.getColors().has(m)}get type(){switch(this.base){case e.VS_LIGHT_THEME_NAME:return t.ColorScheme.LIGHT;case e.HC_BLACK_THEME_NAME:return t.ColorScheme.HIGH_CONTRAST_DARK;case e.HC_LIGHT_THEME_NAME:return t.ColorScheme.HIGH_CONTRAST_LIGHT;default:return t.ColorScheme.DARK}}get tokenTheme(){if(!this._tokenTheme){let m=[],C=[];if(this.themeData.inherit){const I=l(this.themeData.base);m=I.rules,I.encodedTokensColors&&(C=I.encodedTokensColors)}const w=this.themeData.colors["editor.foreground"],D=this.themeData.colors["editor.background"];if(w||D){const I={token:""};w&&(I.foreground=w),D&&(I.background=D),m.push(I)}m=m.concat(this.themeData.rules),this.themeData.encodedTokensColors&&(C=this.themeData.encodedTokensColors),this._tokenTheme=_.TokenTheme.createFromRawTokenTheme(m,C)}return this._tokenTheme}getTokenStyleMetadata(m,C,w){const I=this.tokenTheme._match([m].concat(C).join(".")).metadata,T=p.TokenMetadata.getForeground(I),A=p.TokenMetadata.getFontStyle(I);return{foreground:T,italic:!!(A&1),bold:!!(A&2),underline:!!(A&4),strikethrough:!!(A&8)}}}function s(h){return h===e.VS_LIGHT_THEME_NAME||h===e.VS_DARK_THEME_NAME||h===e.HC_BLACK_THEME_NAME||h===e.HC_LIGHT_THEME_NAME}function l(h){switch(h){case e.VS_LIGHT_THEME_NAME:return v.vs;case e.VS_DARK_THEME_NAME:return v.vs_dark;case e.HC_BLACK_THEME_NAME:return v.hc_black;case e.HC_LIGHT_THEME_NAME:return v.hc_light}}function o(h){const m=l(h);return new d(h,m)}class g extends n.Disposable{constructor(){super(),this._onColorThemeChange=this._register(new E.Emitter),this.onDidColorThemeChange=this._onColorThemeChange.event,this._onProductIconThemeChange=this._register(new E.Emitter),this.onDidProductIconThemeChange=this._onProductIconThemeChange.event,this._environment=Object.create(null),this._builtInProductIconTheme=new r.UnthemedProductIconTheme,this._autoDetectHighContrast=!0,this._knownThemes=new Map,this._knownThemes.set(e.VS_LIGHT_THEME_NAME,o(e.VS_LIGHT_THEME_NAME)),this._knownThemes.set(e.VS_DARK_THEME_NAME,o(e.VS_DARK_THEME_NAME)),this._knownThemes.set(e.HC_BLACK_THEME_NAME,o(e.HC_BLACK_THEME_NAME)),this._knownThemes.set(e.HC_LIGHT_THEME_NAME,o(e.HC_LIGHT_THEME_NAME));const m=this._register((0,r.getIconsStyleSheet)(this));this._codiconCSS=m.getCSS(),this._themeCSS="",this._allCSS=`${this._codiconCSS}
+${this._themeCSS}`,this._globalStyleElement=null,this._styleElements=[],this._colorMapOverride=null,this.setTheme(e.VS_LIGHT_THEME_NAME),this._onOSSchemeChanged(),this._register(m.onDidChange(()=>{this._codiconCSS=m.getCSS(),this._updateCSS()})),(0,k.addMatchMediaChangeListener)(u.mainWindow,"(forced-colors: active)",()=>{this._onOSSchemeChanged()})}registerEditorContainer(m){return L.isInShadowDOM(m)?this._registerShadowDomContainer(m):this._registerRegularEditorContainer()}_registerRegularEditorContainer(){return this._globalStyleElement||(this._globalStyleElement=L.createStyleSheet(void 0,m=>{m.className="monaco-colors",m.textContent=this._allCSS}),this._styleElements.push(this._globalStyleElement)),n.Disposable.None}_registerShadowDomContainer(m){const C=L.createStyleSheet(m,w=>{w.className="monaco-colors",w.textContent=this._allCSS});return this._styleElements.push(C),{dispose:()=>{for(let w=0;w<this._styleElements.length;w++)if(this._styleElements[w]===C){this._styleElements.splice(w,1);return}}}}defineTheme(m,C){if(!/^[a-z0-9\-]+$/i.test(m))throw new Error("Illegal theme name!");if(!s(C.base)&&!s(m))throw new Error("Illegal theme base!");this._knownThemes.set(m,new d(m,C)),s(m)&&this._knownThemes.forEach(w=>{w.base===m&&w.notifyBaseUpdated()}),this._theme.themeName===m&&this.setTheme(m)}getColorTheme(){return this._theme}setColorMapOverride(m){this._colorMapOverride=m,this._updateThemeOrColorMap()}setTheme(m){let C;this._knownThemes.has(m)?C=this._knownThemes.get(m):C=this._knownThemes.get(e.VS_LIGHT_THEME_NAME),this._updateActualTheme(C)}_updateActualTheme(m){!m||this._theme===m||(this._theme=m,this._updateThemeOrColorMap())}_onOSSchemeChanged(){if(this._autoDetectHighContrast){const m=u.mainWindow.matchMedia("(forced-colors: active)").matches;if(m!==(0,t.isHighContrast)(this._theme.type)){let C;(0,t.isDark)(this._theme.type)?C=m?e.HC_BLACK_THEME_NAME:e.VS_DARK_THEME_NAME:C=m?e.HC_LIGHT_THEME_NAME:e.VS_LIGHT_THEME_NAME,this._updateActualTheme(this._knownThemes.get(C))}}}setAutoDetectHighContrast(m){this._autoDetectHighContrast=m,this._onOSSchemeChanged()}_updateThemeOrColorMap(){const m=[],C={},w={addRule:T=>{C[T]||(m.push(T),C[T]=!0)}};c.getThemingParticipants().forEach(T=>T(this._theme,w,this._environment));const D=[];for(const T of f.getColors()){const A=this._theme.getColor(T.id,!0);A&&D.push(`${(0,a.asCssVariableName)(T.id)}: ${A.toString()};`)}w.addRule(`.monaco-editor, .monaco-diff-editor, .monaco-component { ${D.join(`
+`)} }`);const I=this._colorMapOverride||this._theme.tokenTheme.getColorMap();w.addRule((0,_.generateTokensCSSForColorMap)(I)),this._themeCSS=m.join(`
+`),this._updateCSS(),S.TokenizationRegistry.setColorMap(I),this._onColorThemeChange.fire(this._theme)}_updateCSS(){this._allCSS=`${this._codiconCSS}
+${this._themeCSS}`,this._styleElements.forEach(m=>m.textContent=this._allCSS)}getFileIconTheme(){return{hasFileIcons:!1,hasFolderIcons:!1,hidesExplorerArrows:!1}}getProductIconTheme(){return this._builtInProductIconTheme}}e.StandaloneThemeService=g}),define(se[876],oe([1,0,16,137,96,89,372]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class p extends L.EditorAction{constructor(){super({id:"editor.action.toggleHighContrast",label:y.ToggleHighContrastNLS.toggleHighContrast,alias:"Toggle High Contrast Theme",precondition:void 0}),this._originalThemeName=null}run(v,b){const a=v.get(k.IStandaloneThemeService),i=a.getColorTheme();(0,E.isHighContrast)(i.type)?(a.setTheme(this._originalThemeName||((0,E.isDark)(i.type)?S.VS_DARK_THEME_NAME:S.VS_LIGHT_THEME_NAME)),this._originalThemeName=null):(a.setTheme((0,E.isDark)(i.type)?S.HC_BLACK_THEME_NAME:S.HC_LIGHT_THEME_NAME),this._originalThemeName=i.themeName)}}(0,L.registerEditorAction)(p)}),define(se[141],oe([1,0,7,46,135,325,42,218,2,17,733,30,756,15,59,8,34,50,92,23,28,89,20,29,106,69,488]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createActionViewItem=e.DropdownWithDefaultActionViewItem=e.SubmenuEntryActionViewItem=e.MenuEntryActionViewItem=e.createAndFillInActionBarActions=e.createAndFillInContextMenuActions=void 0;function C(M,R,x,O){const B=M.getActions(R),W=L.ModifierKeyEmitter.getInstance(),V=W.keyStatus.altKey||(v.isWindows||v.isLinux)&&W.keyStatus.shiftKey;D(B,x,V,O?K=>K===O:K=>K==="navigation")}e.createAndFillInContextMenuActions=C;function w(M,R,x,O,B,W){const V=M.getActions(R);D(V,x,!1,typeof O=="string"?F=>F===O:O,B,W)}e.createAndFillInActionBarActions=w;function D(M,R,x,O=V=>V==="navigation",B=()=>!1,W=!1){let V,K;Array.isArray(R)?(V=R,K=R):(V=R.primary,K=R.secondary);const F=new Set;for(const[q,ie]of M){let ae;O(q)?(ae=V,ae.length>0&&W&&ae.push(new S.Separator)):(ae=K,ae.length>0&&ae.push(new S.Separator));for(let ne of ie){x&&(ne=ne instanceof a.MenuItemAction&&ne.alt?ne.alt:ne);const $=ae.push(ne);ne instanceof S.SubmenuAction&&F.add({group:q,action:ne,index:$-1})}}for(const{group:q,action:ie,index:ae}of F){const ne=O(q)?V:K,$=ie.actions;B(ie,q,ne.length)&&ne.splice(ae,1,...$)}}let I=class extends y.ActionViewItem{constructor(R,x,O,B,W,V,K,F){super(void 0,R,{icon:!!(R.class||R.item.icon),label:!R.class&&!R.item.icon,draggable:x?.draggable,keybinding:x?.keybinding,hoverDelegate:x?.hoverDelegate}),this._keybindingService=O,this._notificationService=B,this._contextKeyService=W,this._themeService=V,this._contextMenuService=K,this._accessibilityService=F,this._wantsAltCommand=!1,this._itemClassDispose=this._register(new _.MutableDisposable),this._altKey=L.ModifierKeyEmitter.getInstance()}get _menuItemAction(){return this._action}get _commandAction(){return this._wantsAltCommand&&this._menuItemAction.alt||this._menuItemAction}async onClick(R){R.preventDefault(),R.stopPropagation();try{await this.actionRunner.run(this._commandAction,this._context)}catch(x){this._notificationService.error(x)}}render(R){if(super.render(R),R.classList.add("menu-entry"),this.options.icon&&this._updateItemClass(this._menuItemAction.item),this._menuItemAction.alt){let x=!1;const O=()=>{var B;const W=!!(!((B=this._menuItemAction.alt)===null||B===void 0)&&B.enabled)&&(!this._accessibilityService.isMotionReduced()||x)&&(this._altKey.keyStatus.altKey||this._altKey.keyStatus.shiftKey&&x);W!==this._wantsAltCommand&&(this._wantsAltCommand=W,this.updateLabel(),this.updateTooltip(),this.updateClass())};this._register(this._altKey.event(O)),this._register((0,L.addDisposableListener)(R,"mouseleave",B=>{x=!1,O()})),this._register((0,L.addDisposableListener)(R,"mouseenter",B=>{x=!0,O()})),O()}}updateLabel(){this.options.label&&this.label&&(this.label.textContent=this._commandAction.label)}getTooltip(){var R;const x=this._keybindingService.lookupKeybinding(this._commandAction.id,this._contextKeyService),O=x&&x.getLabel(),B=this._commandAction.tooltip||this._commandAction.label;let W=O?(0,b.localize)(0,null,B,O):B;if(!this._wantsAltCommand&&(!((R=this._menuItemAction.alt)===null||R===void 0)&&R.enabled)){const V=this._menuItemAction.alt.tooltip||this._menuItemAction.alt.label,K=this._keybindingService.lookupKeybinding(this._menuItemAction.alt.id,this._contextKeyService),F=K&&K.getLabel(),q=F?(0,b.localize)(1,null,V,F):V;W=(0,b.localize)(2,null,W,p.UILabelProvider.modifierLabels[v.OS].altKey,q)}return W}updateClass(){this.options.icon&&(this._commandAction!==this._menuItemAction?this._menuItemAction.alt&&this._updateItemClass(this._menuItemAction.alt.item):this._updateItemClass(this._menuItemAction.item))}_updateItemClass(R){this._itemClassDispose.value=void 0;const{element:x,label:O}=this;if(!x||!O)return;const B=this._commandAction.checked&&(0,i.isICommandActionToggleInfo)(R.toggled)&&R.toggled.icon?R.toggled.icon:R.icon;if(B)if(s.ThemeIcon.isThemeIcon(B)){const W=s.ThemeIcon.asClassNameArray(B);O.classList.add(...W),this._itemClassDispose.value=(0,_.toDisposable)(()=>{O.classList.remove(...W)})}else O.style.backgroundImage=(0,l.isDark)(this._themeService.getColorTheme().type)?(0,L.asCSSUrl)(B.dark):(0,L.asCSSUrl)(B.light),O.classList.add("icon"),this._itemClassDispose.value=(0,_.combinedDisposable)((0,_.toDisposable)(()=>{O.style.backgroundImage="",O.classList.remove("icon")}),this._themeService.onDidColorThemeChange(()=>{this.updateClass()}))}};e.MenuEntryActionViewItem=I,e.MenuEntryActionViewItem=I=ke([ge(2,u.IKeybindingService),ge(3,f.INotificationService),ge(4,n.IContextKeyService),ge(5,d.IThemeService),ge(6,t.IContextMenuService),ge(7,m.IAccessibilityService)],I);let T=class extends E.DropdownMenuActionViewItem{constructor(R,x,O,B,W){var V,K,F;const q={...x,menuAsChild:(V=x?.menuAsChild)!==null&&V!==void 0?V:!1,classNames:(K=x?.classNames)!==null&&K!==void 0?K:s.ThemeIcon.isThemeIcon(R.item.icon)?s.ThemeIcon.asClassName(R.item.icon):void 0,keybindingProvider:(F=x?.keybindingProvider)!==null&&F!==void 0?F:ie=>O.lookupKeybinding(ie.id)};super(R,{getActions:()=>R.actions},B,q),this._keybindingService=O,this._contextMenuService=B,this._themeService=W}render(R){super.render(R),(0,o.assertType)(this.element),R.classList.add("menu-entry");const x=this._action,{icon:O}=x.item;if(O&&!s.ThemeIcon.isThemeIcon(O)){this.element.classList.add("icon");const B=()=>{this.element&&(this.element.style.backgroundImage=(0,l.isDark)(this._themeService.getColorTheme().type)?(0,L.asCSSUrl)(O.dark):(0,L.asCSSUrl)(O.light))};B(),this._register(this._themeService.onDidColorThemeChange(()=>{B()}))}}};e.SubmenuEntryActionViewItem=T,e.SubmenuEntryActionViewItem=T=ke([ge(2,u.IKeybindingService),ge(3,t.IContextMenuService),ge(4,d.IThemeService)],T);let A=class extends y.BaseActionViewItem{constructor(R,x,O,B,W,V,K,F){var q,ie,ae;super(null,R),this._keybindingService=O,this._notificationService=B,this._contextMenuService=W,this._menuService=V,this._instaService=K,this._storageService=F,this._container=null,this._options=x,this._storageKey=`${R.item.submenu.id}_lastActionId`;let ne;const $=x?.persistLastActionId?F.get(this._storageKey,1):void 0;$&&(ne=R.actions.find(Q=>$===Q.id)),ne||(ne=R.actions[0]),this._defaultAction=this._instaService.createInstance(I,ne,{keybinding:this._getDefaultActionKeybindingLabel(ne)});const J={keybindingProvider:Q=>this._keybindingService.lookupKeybinding(Q.id),...x,menuAsChild:(q=x?.menuAsChild)!==null&&q!==void 0?q:!0,classNames:(ie=x?.classNames)!==null&&ie!==void 0?ie:["codicon","codicon-chevron-down"],actionRunner:(ae=x?.actionRunner)!==null&&ae!==void 0?ae:new S.ActionRunner};this._dropdown=new E.DropdownMenuActionViewItem(R,R.actions,this._contextMenuService,J),this._register(this._dropdown.actionRunner.onDidRun(Q=>{Q.action instanceof a.MenuItemAction&&this.update(Q.action)}))}update(R){var x;!((x=this._options)===null||x===void 0)&&x.persistLastActionId&&this._storageService.store(this._storageKey,R.id,1,1),this._defaultAction.dispose(),this._defaultAction=this._instaService.createInstance(I,R,{keybinding:this._getDefaultActionKeybindingLabel(R)}),this._defaultAction.actionRunner=new class extends S.ActionRunner{async runAction(O,B){await O.run(void 0)}},this._container&&this._defaultAction.render((0,L.prepend)(this._container,(0,L.$)(".action-container")))}_getDefaultActionKeybindingLabel(R){var x;let O;if(!((x=this._options)===null||x===void 0)&&x.renderKeybindingWithDefaultActionLabel){const B=this._keybindingService.lookupKeybinding(R.id);B&&(O=`(${B.getLabel()})`)}return O}setActionContext(R){super.setActionContext(R),this._defaultAction.setActionContext(R),this._dropdown.setActionContext(R)}render(R){this._container=R,super.render(this._container),this._container.classList.add("monaco-dropdown-with-default");const x=(0,L.$)(".action-container");this._defaultAction.render((0,L.append)(this._container,x)),this._register((0,L.addDisposableListener)(x,L.EventType.KEY_DOWN,B=>{const W=new k.StandardKeyboardEvent(B);W.equals(17)&&(this._defaultAction.element.tabIndex=-1,this._dropdown.focus(),W.stopPropagation())}));const O=(0,L.$)(".dropdown-action-container");this._dropdown.render((0,L.append)(this._container,O)),this._register((0,L.addDisposableListener)(O,L.EventType.KEY_DOWN,B=>{var W;const V=new k.StandardKeyboardEvent(B);V.equals(15)&&(this._defaultAction.element.tabIndex=0,this._dropdown.setFocusable(!1),(W=this._defaultAction.element)===null||W===void 0||W.focus(),V.stopPropagation())}))}focus(R){R?this._dropdown.focus():(this._defaultAction.element.tabIndex=0,this._defaultAction.element.focus())}blur(){this._defaultAction.element.tabIndex=-1,this._dropdown.blur(),this._container.blur()}setFocusable(R){R?this._defaultAction.element.tabIndex=0:(this._defaultAction.element.tabIndex=-1,this._dropdown.setFocusable(!1))}dispose(){this._defaultAction.dispose(),this._dropdown.dispose(),super.dispose()}};e.DropdownWithDefaultActionViewItem=A,e.DropdownWithDefaultActionViewItem=A=ke([ge(2,u.IKeybindingService),ge(3,f.INotificationService),ge(4,t.IContextMenuService),ge(5,a.IMenuService),ge(6,r.IInstantiationService),ge(7,c.IStorageService)],A);let P=class extends y.SelectActionViewItem{constructor(R,x){super(null,R,R.actions.map(O=>({text:O.id===S.Separator.ID?"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500":O.label,isDisabled:!O.enabled})),0,x,h.defaultSelectBoxStyles,{ariaLabel:R.tooltip,optionsAsChildren:!0}),this.select(Math.max(0,R.actions.findIndex(O=>O.checked)))}render(R){super.render(R),R.style.borderColor=(0,g.asCssVariable)(g.selectBorder)}runAction(R,x){const O=this.action.actions[x];O&&this.actionRunner.run(O)}};P=ke([ge(1,t.IContextViewService)],P);function N(M,R,x){return R instanceof a.MenuItemAction?M.createInstance(I,R,x):R instanceof a.SubmenuItemAction?R.item.isSelection?M.createInstance(P,R):R.item.rememberDefaultAction?M.createInstance(A,R,{...x,persistLastActionId:!0}):M.createInstance(T,R,x):void 0}e.createActionViewItem=N}),define(se[877],oe([1,0,7,78,2,721,141,30,15,8]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestWidgetStatus=void 0;class b extends S.MenuEntryActionViewItem{updateLabel(){const n=this._keybindingService.lookupKeybinding(this._action.id,this._contextKeyService);if(!n)return super.updateLabel();this.label&&(this.label.textContent=(0,E.localize)(0,null,this._action.label,b.symbolPrintEnter(n)))}static symbolPrintEnter(n){var t;return(t=n.getLabel())===null||t===void 0?void 0:t.replace(/\benter\b/gi,"\u23CE")}}let a=class{constructor(n,t,r,u,f){this._menuId=t,this._menuService=u,this._contextKeyService=f,this._menuDisposables=new y.DisposableStore,this.element=L.append(n,L.$(".suggest-status-bar"));const c=d=>d instanceof p.MenuItemAction?r.createInstance(b,d,void 0):void 0;this._leftActions=new k.ActionBar(this.element,{actionViewItemProvider:c}),this._rightActions=new k.ActionBar(this.element,{actionViewItemProvider:c}),this._leftActions.domNode.classList.add("left"),this._rightActions.domNode.classList.add("right")}dispose(){this._menuDisposables.dispose(),this._leftActions.dispose(),this._rightActions.dispose(),this.element.remove()}show(){const n=this._menuService.createMenu(this._menuId,this._contextKeyService),t=()=>{const r=[],u=[];for(const[f,c]of n.getActions())f==="left"?r.push(...c):u.push(...c);this._leftActions.clear(),this._leftActions.push(r),this._rightActions.clear(),this._rightActions.push(u)};this._menuDisposables.add(n.onDidChange(()=>t())),this._menuDisposables.add(n)}hide(){this._menuDisposables.clear()}};e.SuggestWidgetStatus=a,e.SuggestWidgetStatus=a=ke([ge(2,v.IInstantiationService),ge(3,p.IMenuService),ge(4,_.IContextKeyService)],a)}),define(se[373],oe([1,0,7,67,600,42,13,268,12,6,52,2,734,141,30,15,59,34,81]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MenuWorkbenchToolBar=e.WorkbenchToolBar=void 0;let d=class extends y.ToolBar{constructor(o,g,h,m,C,w,D){super(o,C,{getKeyBinding:T=>{var A;return(A=w.lookupKeybinding(T.id))!==null&&A!==void 0?A:void 0},...g,allowContextMenu:!0,skipTelemetry:typeof g?.telemetrySource=="string"}),this._options=g,this._menuService=h,this._contextKeyService=m,this._contextMenuService=C,this._sessionDisposables=this._store.add(new a.DisposableStore);const I=g?.telemetrySource;I&&this._store.add(this.actionBar.onDidRun(T=>D.publicLog2("workbenchActionExecuted",{id:T.action.id,from:I})))}setActions(o,g=[],h){var m,C,w;this._sessionDisposables.clear();const D=o.slice(),I=g.slice(),T=[];let A=0;const P=[];let N=!1;if(((m=this._options)===null||m===void 0?void 0:m.hiddenItemStrategy)!==-1)for(let M=0;M<D.length;M++){const R=D[M];!(R instanceof t.MenuItemAction)&&!(R instanceof t.SubmenuItemAction)||R.hideActions&&(T.push(R.hideActions.toggle),R.hideActions.toggle.checked&&A++,R.hideActions.isHidden&&(N=!0,D[M]=void 0,((C=this._options)===null||C===void 0?void 0:C.hiddenItemStrategy)!==0&&(P[M]=R)))}if(((w=this._options)===null||w===void 0?void 0:w.overflowBehavior)!==void 0){const M=(0,p.intersection)(new Set(this._options.overflowBehavior.exempted),b.Iterable.map(D,O=>O?.id)),R=this._options.overflowBehavior.maxItems-M.size;let x=0;for(let O=0;O<D.length;O++){const B=D[O];B&&(x++,!M.has(B.id)&&x>=R&&(D[O]=void 0,P[O]=B))}}(0,S.coalesceInPlace)(D),(0,S.coalesceInPlace)(P),super.setActions(D,E.Separator.join(P,I)),T.length>0&&this._sessionDisposables.add((0,L.addDisposableListener)(this.getElement(),"contextmenu",M=>{var R,x,O,B,W;const V=new k.StandardMouseEvent((0,L.getWindow)(this.getElement()),M),K=this.getItemAction(V.target);if(!K)return;V.preventDefault(),V.stopPropagation();let F=!1;if(A===1&&((R=this._options)===null||R===void 0?void 0:R.hiddenItemStrategy)===0){F=!0;for(let ae=0;ae<T.length;ae++)if(T[ae].checked){T[ae]=(0,E.toAction)({id:K.id,label:K.label,checked:!0,enabled:!1,run(){}});break}}let q;if(!F&&(K instanceof t.MenuItemAction||K instanceof t.SubmenuItemAction)){if(!K.hideActions)return;q=K.hideActions.hide}else q=(0,E.toAction)({id:"label",label:(0,i.localize)(0,null),enabled:!1,run(){}});const ie=E.Separator.join([q],T);!((x=this._options)===null||x===void 0)&&x.resetMenu&&!h&&(h=[this._options.resetMenu]),N&&h&&(ie.push(new E.Separator),ie.push((0,E.toAction)({id:"resetThisMenu",label:(0,i.localize)(1,null),run:()=>this._menuService.resetHiddenStates(h)}))),this._contextMenuService.showContextMenu({getAnchor:()=>V,getActions:()=>ie,menuId:(O=this._options)===null||O===void 0?void 0:O.contextMenu,menuActionOptions:{renderShortTitle:!0,...(B=this._options)===null||B===void 0?void 0:B.menuOptions},skipTelemetry:typeof((W=this._options)===null||W===void 0?void 0:W.telemetrySource)=="string",contextKeyService:this._contextKeyService})}))}};e.WorkbenchToolBar=d,e.WorkbenchToolBar=d=ke([ge(2,t.IMenuService),ge(3,r.IContextKeyService),ge(4,u.IContextMenuService),ge(5,f.IKeybindingService),ge(6,c.ITelemetryService)],d);let s=class extends d{constructor(o,g,h,m,C,w,D,I){super(o,{resetMenu:g,...h},m,C,w,D,I),this._onDidChangeMenuItems=this._store.add(new v.Emitter);const T=this._store.add(m.createMenu(g,C,{emitEventsForSubmenuChanges:!0})),A=()=>{var P,N,M;const R=[],x=[];(0,n.createAndFillInActionBarActions)(T,h?.menuOptions,{primary:R,secondary:x},(P=h?.toolbarOptions)===null||P===void 0?void 0:P.primaryGroup,(N=h?.toolbarOptions)===null||N===void 0?void 0:N.shouldInlineSubmenu,(M=h?.toolbarOptions)===null||M===void 0?void 0:M.useSeparatorsInPrimaryActions),o.classList.toggle("has-no-actions",R.length===0&&x.length===0),super.setActions(R,x)};this._store.add(T.onDidChange(()=>{A(),this._onDidChangeMenuItems.fire(this)})),A()}setActions(){throw new _.BugIndicatingError("This toolbar is populated from a menu.")}};e.MenuWorkbenchToolBar=s,e.MenuWorkbenchToolBar=s=ke([ge(3,t.IMenuService),ge(4,r.IContextKeyService),ge(5,u.IContextMenuService),ge(6,f.IKeybindingService),ge(7,c.ITelemetryService)],s)}),define(se[257],oe([1,0,7,135,224,42,13,14,26,2,35,17,28,10,31,216,697,141,373,30,25,15,59,8,34,81,82,468]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C){"use strict";var w;Object.defineProperty(e,"__esModule",{value:!0}),e.CustomizedMenuWorkbenchToolBar=e.InlineSuggestionHintsContentWidget=e.InlineCompletionsHintsWidget=void 0;let D=class extends v.Disposable{constructor(x,O,B){super(),this.editor=x,this.model=O,this.instantiationService=B,this.alwaysShowToolbar=(0,b.observableFromEvent)(this.editor.onDidChangeConfiguration,()=>this.editor.getOption(62).showToolbar==="always"),this.sessionPosition=void 0,this.position=(0,b.derived)(this,W=>{var V,K,F;const q=(V=this.model.read(W))===null||V===void 0?void 0:V.ghostText.read(W);if(!this.alwaysShowToolbar.read(W)||!q||q.parts.length===0)return this.sessionPosition=void 0,null;const ie=q.parts[0].column;this.sessionPosition&&this.sessionPosition.lineNumber!==q.lineNumber&&(this.sessionPosition=void 0);const ae=new n.Position(q.lineNumber,Math.min(ie,(F=(K=this.sessionPosition)===null||K===void 0?void 0:K.column)!==null&&F!==void 0?F:Number.MAX_SAFE_INTEGER));return this.sessionPosition=ae,ae}),this._register((0,b.autorunWithStore)((W,V)=>{const K=this.model.read(W);if(!K||!this.alwaysShowToolbar.read(W))return;const F=V.add(this.instantiationService.createInstance(A,this.editor,!0,this.position,K.selectedInlineCompletionIndex,K.inlineCompletionsCount,K.selectedInlineCompletion.map(q=>{var ie;return(ie=q?.inlineCompletion.source.inlineCompletions.commands)!==null&&ie!==void 0?ie:[]})));x.addContentWidget(F),V.add((0,v.toDisposable)(()=>x.removeContentWidget(F))),V.add((0,b.autorun)(q=>{this.position.read(q)&&K.lastTriggerKind.read(q)!==t.InlineCompletionTriggerKind.Explicit&&K.triggerExplicitly()}))}))}};e.InlineCompletionsHintsWidget=D,e.InlineCompletionsHintsWidget=D=ke([ge(2,g.IInstantiationService)],D);const I=(0,C.registerIcon)("inline-suggestion-hints-next",_.Codicon.chevronRight,(0,u.localize)(0,null)),T=(0,C.registerIcon)("inline-suggestion-hints-previous",_.Codicon.chevronLeft,(0,u.localize)(1,null));let A=w=class extends v.Disposable{static get dropDownVisible(){return this._dropDownVisible}createCommandAction(x,O,B){const W=new E.Action(x,O,B,!0,()=>this._commandService.executeCommand(x)),V=this.keybindingService.lookupKeybinding(x,this._contextKeyService);let K=O;return V&&(K=(0,u.localize)(2,null,O,V.getLabel())),W.tooltip=K,W}constructor(x,O,B,W,V,K,F,q,ie,ae,ne){super(),this.editor=x,this.withBorder=O,this._position=B,this._currentSuggestionIdx=W,this._suggestionCount=V,this._extraCommands=K,this._commandService=F,this.keybindingService=ie,this._contextKeyService=ae,this._menuService=ne,this.id=`InlineSuggestionHintsContentWidget${w.id++}`,this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this.nodes=(0,L.h)("div.inlineSuggestionsHints",{className:this.withBorder?".withBorder":""},[(0,L.h)("div@toolBar")]),this.previousAction=this.createCommandAction(r.showPreviousInlineSuggestionActionId,(0,u.localize)(3,null),i.ThemeIcon.asClassName(T)),this.availableSuggestionCountAction=new E.Action("inlineSuggestionHints.availableSuggestionCount","",void 0,!1),this.nextAction=this.createCommandAction(r.showNextInlineSuggestionActionId,(0,u.localize)(4,null),i.ThemeIcon.asClassName(I)),this.inlineCompletionsActionsMenus=this._register(this._menuService.createMenu(d.MenuId.InlineCompletionsActions,this._contextKeyService)),this.clearAvailableSuggestionCountLabelDebounced=this._register(new p.RunOnceScheduler(()=>{this.availableSuggestionCountAction.label=""},100)),this.disableButtonsDebounced=this._register(new p.RunOnceScheduler(()=>{this.previousAction.enabled=this.nextAction.enabled=!1},100)),this.lastCommands=[],this.toolBar=this._register(q.createInstance(M,this.nodes.toolBar,d.MenuId.InlineSuggestionToolbar,{menuOptions:{renderShortTitle:!0},toolbarOptions:{primaryGroup:$=>$.startsWith("primary")},actionViewItemProvider:($,J)=>{if($ instanceof d.MenuItemAction)return q.createInstance(N,$,void 0);if($===this.availableSuggestionCountAction){const Q=new P(void 0,$,{label:!0,icon:!1});return Q.setClass("availableSuggestionCount"),Q}},telemetrySource:"InlineSuggestionToolbar"})),this.toolBar.setPrependedPrimaryActions([this.previousAction,this.availableSuggestionCountAction,this.nextAction]),this._register(this.toolBar.onDidChangeDropdownVisibility($=>{w._dropDownVisible=$})),this._register((0,b.autorun)($=>{this._position.read($),this.editor.layoutContentWidget(this)})),this._register((0,b.autorun)($=>{const J=this._suggestionCount.read($),Q=this._currentSuggestionIdx.read($);J!==void 0?(this.clearAvailableSuggestionCountLabelDebounced.cancel(),this.availableSuggestionCountAction.label=`${Q+1}/${J}`):this.clearAvailableSuggestionCountLabelDebounced.schedule(),J!==void 0&&J>1?(this.disableButtonsDebounced.cancel(),this.previousAction.enabled=this.nextAction.enabled=!0):this.disableButtonsDebounced.schedule()})),this._register((0,b.autorun)($=>{const J=this._extraCommands.read($);if((0,S.equals)(this.lastCommands,J))return;this.lastCommands=J;const Q=J.map(re=>({class:void 0,id:re.id,enabled:!0,tooltip:re.tooltip||"",label:re.title,run:de=>this._commandService.executeCommand(re.id)}));for(const[re,de]of this.inlineCompletionsActionsMenus.getActions())for(const he of de)he instanceof d.MenuItemAction&&Q.push(he);Q.length>0&&Q.unshift(new E.Separator),this.toolBar.setAdditionalSecondaryActions(Q)}))}getId(){return this.id}getDomNode(){return this.nodes.root}getPosition(){return{position:this._position.get(),preference:[1,2],positionAffinity:3}}};e.InlineSuggestionHintsContentWidget=A,A._dropDownVisible=!1,A.id=0,e.InlineSuggestionHintsContentWidget=A=w=ke([ge(6,s.ICommandService),ge(7,g.IInstantiationService),ge(8,h.IKeybindingService),ge(9,l.IContextKeyService),ge(10,d.IMenuService)],A);class P extends k.ActionViewItem{constructor(){super(...arguments),this._className=void 0}setClass(x){this._className=x}render(x){super.render(x),this._className&&x.classList.add(this._className)}updateTooltip(){}}class N extends f.MenuEntryActionViewItem{updateLabel(){const x=this._keybindingService.lookupKeybinding(this._action.id,this._contextKeyService);if(!x)return super.updateLabel();if(this.label){const O=(0,L.h)("div.keybinding").root;new y.KeybindingLabel(O,a.OS,{disableTitle:!0,...y.unthemedKeybindingLabelOptions}).set(x),this.label.textContent=this._action.label,this.label.appendChild(O),this.label.classList.add("inlineSuggestionStatusBarItemLabel")}}updateTooltip(){}}let M=class extends c.WorkbenchToolBar{constructor(x,O,B,W,V,K,F,q){super(x,{resetMenu:O,...B},W,V,K,F,q),this.menuId=O,this.options2=B,this.menuService=W,this.contextKeyService=V,this.menu=this._store.add(this.menuService.createMenu(this.menuId,this.contextKeyService,{emitEventsForSubmenuChanges:!0})),this.additionalActions=[],this.prependedPrimaryActions=[],this._store.add(this.menu.onDidChange(()=>this.updateToolbar())),this.updateToolbar()}updateToolbar(){var x,O,B,W,V,K,F;const q=[],ie=[];(0,f.createAndFillInActionBarActions)(this.menu,(x=this.options2)===null||x===void 0?void 0:x.menuOptions,{primary:q,secondary:ie},(B=(O=this.options2)===null||O===void 0?void 0:O.toolbarOptions)===null||B===void 0?void 0:B.primaryGroup,(V=(W=this.options2)===null||W===void 0?void 0:W.toolbarOptions)===null||V===void 0?void 0:V.shouldInlineSubmenu,(F=(K=this.options2)===null||K===void 0?void 0:K.toolbarOptions)===null||F===void 0?void 0:F.useSeparatorsInPrimaryActions),ie.push(...this.additionalActions),q.unshift(...this.prependedPrimaryActions),this.setActions(q,ie)}setPrependedPrimaryActions(x){(0,S.equals)(this.prependedPrimaryActions,x,(O,B)=>O===B)||(this.prependedPrimaryActions=x,this.updateToolbar())}setAdditionalSecondaryActions(x){(0,S.equals)(this.additionalActions,x,(O,B)=>O===B)||(this.additionalActions=x,this.updateToolbar())}};e.CustomizedMenuWorkbenchToolBar=M,e.CustomizedMenuWorkbenchToolBar=M=ke([ge(3,d.IMenuService),ge(4,l.IContextKeyService),ge(5,o.IContextMenuService),ge(6,h.IKeybindingService),ge(7,m.ITelemetryService)],M)}),define(se[878],oe([1,0,7,42,6,2,141,30,15,34,50,81,840,59]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextMenuMenuDelegate=e.ContextMenuService=void 0;let t=class extends E.Disposable{get contextMenuHandler(){return this._contextMenuHandler||(this._contextMenuHandler=new i.ContextMenuHandler(this.contextViewService,this.telemetryService,this.notificationService,this.keybindingService)),this._contextMenuHandler}constructor(f,c,d,s,l,o){super(),this.telemetryService=f,this.notificationService=c,this.contextViewService=d,this.keybindingService=s,this.menuService=l,this.contextKeyService=o,this._contextMenuHandler=void 0,this._onDidShowContextMenu=this._store.add(new y.Emitter),this.onDidShowContextMenu=this._onDidShowContextMenu.event,this._onDidHideContextMenu=this._store.add(new y.Emitter)}configure(f){this.contextMenuHandler.configure(f)}showContextMenu(f){f=r.transform(f,this.menuService,this.contextKeyService),this.contextMenuHandler.showContextMenu({...f,onHide:c=>{var d;(d=f.onHide)===null||d===void 0||d.call(f,c),this._onDidHideContextMenu.fire()}}),L.ModifierKeyEmitter.getInstance().resetKeyStatus(),this._onDidShowContextMenu.fire()}};e.ContextMenuService=t,e.ContextMenuService=t=ke([ge(0,a.ITelemetryService),ge(1,b.INotificationService),ge(2,n.IContextViewService),ge(3,v.IKeybindingService),ge(4,p.IMenuService),ge(5,_.IContextKeyService)],t);var r;(function(u){function f(d){return d&&d.menuId instanceof p.MenuId}function c(d,s,l){if(!f(d))return d;const{menuId:o,menuActionOptions:g,contextKeyService:h}=d;return{...d,getActions:()=>{const m=[];if(o){const C=s.createMenu(o,h??l);(0,S.createAndFillInContextMenuActions)(C,g,m),C.dispose()}return d.getActions?k.Separator.join(d.getActions(),m):m}}}u.transform=c})(r||(e.ContextMenuMenuDelegate=r={}))}),define(se[879],oe([1,0,19,6,15,8,123,192,57,803,106,29,23,367,850,27,244]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputService=void 0;let f=class extends i.Themable{get controller(){return this._controller||(this._controller=this._register(this.createController())),this._controller}get hasController(){return!!this._controller}get quickAccess(){return this._quickAccess||(this._quickAccess=this._register(this.instantiationService.createInstance(v.QuickAccessController))),this._quickAccess}constructor(d,s,l,o,g,h){super(l),this.instantiationService=d,this.contextKeyService=s,this.layoutService=o,this.configurationService=g,this.hoverService=h,this._onShow=this._register(new k.Emitter),this._onHide=this._register(new k.Emitter),this.contexts=new Map}createController(d=this.layoutService,s){const l={idPrefix:"quickInput_",container:d.activeContainer,ignoreFocusOut:()=>!1,backKeybindingLabel:()=>{},setContextKey:g=>this.setContextKey(g),linkOpenerDelegate:g=>{this.instantiationService.invokeFunction(h=>{h.get(_.IOpenerService).open(g,{allowCommands:!0,fromUserGesture:!0})})},returnFocus:()=>d.focus(),createList:(g,h,m,C,w)=>this.instantiationService.createInstance(p.WorkbenchList,g,h,m,C,w),styles:this.computeStyles(),hoverDelegate:new n.QuickInputHoverDelegate(this.configurationService,this.hoverService)},o=this._register(new t.QuickInputController({...l,...s},this.themeService,this.layoutService));return o.layout(d.activeContainerDimension,d.activeContainerOffset.quickPickTop),this._register(d.onDidLayoutActiveContainer(g=>o.layout(g,d.activeContainerOffset.quickPickTop))),this._register(d.onDidChangeActiveContainer(()=>{o.isVisible()||o.layout(d.activeContainerDimension,d.activeContainerOffset.quickPickTop)})),this._register(o.onShow(()=>{this.resetContextKeys(),this._onShow.fire()})),this._register(o.onHide(()=>{this.resetContextKeys(),this._onHide.fire()})),o}setContextKey(d){let s;d&&(s=this.contexts.get(d),s||(s=new y.RawContextKey(d,!1).bindTo(this.contextKeyService),this.contexts.set(d,s))),!(s&&s.get())&&(this.resetContextKeys(),s?.set(!0))}resetContextKeys(){this.contexts.forEach(d=>{d.get()&&d.reset()})}pick(d,s={},l=L.CancellationToken.None){return this.controller.pick(d,s,l)}createQuickPick(){return this.controller.createQuickPick()}createInputBox(){return this.controller.createInputBox()}updateStyles(){this.hasController&&this.controller.applyStyles(this.computeStyles())}computeStyles(){return{widget:{quickInputBackground:(0,a.asCssVariable)(a.quickInputBackground),quickInputForeground:(0,a.asCssVariable)(a.quickInputForeground),quickInputTitleBackground:(0,a.asCssVariable)(a.quickInputTitleBackground),widgetBorder:(0,a.asCssVariable)(a.widgetBorder),widgetShadow:(0,a.asCssVariable)(a.widgetShadow)},inputBox:b.defaultInputBoxStyles,toggle:b.defaultToggleStyles,countBadge:b.defaultCountBadgeStyles,button:b.defaultButtonStyles,progressBar:b.defaultProgressBarStyles,keybindingLabel:b.defaultKeybindingLabelStyles,list:(0,b.getListStyles)({listBackground:a.quickInputBackground,listFocusBackground:a.quickInputListFocusBackground,listFocusForeground:a.quickInputListFocusForeground,listInactiveFocusForeground:a.quickInputListFocusForeground,listInactiveSelectionIconForeground:a.quickInputListFocusIconForeground,listInactiveFocusBackground:a.quickInputListFocusBackground,listFocusOutline:a.activeContrastBorder,listInactiveFocusOutline:a.activeContrastBorder}),pickerGroup:{pickerGroupBorder:(0,a.asCssVariable)(a.pickerGroupBorder),pickerGroupForeground:(0,a.asCssVariable)(a.pickerGroupForeground)}}}};e.QuickInputService=f,e.QuickInputService=f=ke([ge(0,E.IInstantiationService),ge(1,y.IContextKeyService),ge(2,i.IThemeService),ge(3,S.ILayoutService),ge(4,r.IConfigurationService),ge(5,u.IHoverService)],f)}),define(se[880],oe([1,0,6,16,23,19,8,15,349,33,879,108,27,244,486]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputEditorWidget=e.QuickInputEditorContribution=e.StandaloneQuickInputService=void 0;let t=class extends b.QuickInputService{constructor(d,s,l,o,g,h,m){super(s,l,o,new _.EditorScopedLayoutService(d.getContainerDomNode(),g),h,m),this.host=void 0;const C=u.get(d);if(C){const w=C.widget;this.host={_serviceBrand:void 0,get mainContainer(){return w.getDomNode()},getContainer(){return w.getDomNode()},get containers(){return[w.getDomNode()]},get activeContainer(){return w.getDomNode()},get mainContainerDimension(){return d.getLayoutInfo()},get activeContainerDimension(){return d.getLayoutInfo()},get onDidLayoutMainContainer(){return d.onDidLayoutChange},get onDidLayoutActiveContainer(){return d.onDidLayoutChange},get onDidLayoutContainer(){return L.Event.map(d.onDidLayoutChange,D=>({container:w.getDomNode(),dimension:D}))},get onDidChangeActiveContainer(){return L.Event.None},get onDidAddContainer(){return L.Event.None},get whenActiveContainerStylesLoaded(){return Promise.resolve()},get mainContainerOffset(){return{top:0,quickPickTop:0}},get activeContainerOffset(){return{top:0,quickPickTop:0}},focus:()=>d.focus()}}else this.host=void 0}createController(){return super.createController(this.host)}};t=ke([ge(1,S.IInstantiationService),ge(2,p.IContextKeyService),ge(3,y.IThemeService),ge(4,v.ICodeEditorService),ge(5,i.IConfigurationService),ge(6,n.IHoverService)],t);let r=class{get activeService(){const d=this.codeEditorService.getFocusedCodeEditor();if(!d)throw new Error("Quick input service needs a focused editor to work.");let s=this.mapEditorToService.get(d);if(!s){const l=s=this.instantiationService.createInstance(t,d);this.mapEditorToService.set(d,s),(0,a.createSingleCallFunction)(d.onDidDispose)(()=>{l.dispose(),this.mapEditorToService.delete(d)})}return s}get quickAccess(){return this.activeService.quickAccess}constructor(d,s){this.instantiationService=d,this.codeEditorService=s,this.mapEditorToService=new Map}pick(d,s={},l=E.CancellationToken.None){return this.activeService.pick(d,s,l)}createQuickPick(){return this.activeService.createQuickPick()}createInputBox(){return this.activeService.createInputBox()}};e.StandaloneQuickInputService=r,e.StandaloneQuickInputService=r=ke([ge(0,S.IInstantiationService),ge(1,v.ICodeEditorService)],r);class u{static get(d){return d.getContribution(u.ID)}constructor(d){this.editor=d,this.widget=new f(this.editor)}dispose(){this.widget.dispose()}}e.QuickInputEditorContribution=u,u.ID="editor.controller.quickInput";class f{constructor(d){this.codeEditor=d,this.domNode=document.createElement("div"),this.codeEditor.addOverlayWidget(this)}getId(){return f.ID}getDomNode(){return this.domNode}getPosition(){return{preference:2}}dispose(){this.codeEditor.removeOverlayWidget(this)}}e.QuickInputEditorWidget=f,f.ID="editor.contrib.quickInputWidget",(0,k.registerEditorContribution)(u.ID,u,4)}),define(se[193],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UndoRedoSource=e.UndoRedoGroup=e.ResourceEditStackSnapshot=e.IUndoRedoService=void 0,e.IUndoRedoService=(0,L.createDecorator)("undoRedoService");class k{constructor(p,_){this.resource=p,this.elements=_}}e.ResourceEditStackSnapshot=k;class y{constructor(){this.id=y._ID++,this.order=1}nextOrder(){return this.id===0?0:this.order++}}e.UndoRedoGroup=y,y._ID=0,y.None=new y;class E{constructor(){this.id=E._ID++,this.order=1}nextOrder(){return this.id===0?0:this.order++}}e.UndoRedoSource=E,E._ID=0,E.None=new E}),define(se[38],oe([1,0,13,39,12,6,2,11,22,129,203,62,10,5,24,179,43,32,41,613,863,340,297,524,525,331,614,184,642,114,193]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w,D,I,T){"use strict";var A;Object.defineProperty(e,"__esModule",{value:!0}),e.AttachedViews=e.ModelDecorationOptions=e.ModelDecorationInjectedTextOptions=e.ModelDecorationMinimapOptions=e.ModelDecorationGlyphMarginOptions=e.ModelDecorationOverviewRulerOptions=e.TextModel=e.createTextBuffer=e.createTextBufferFactoryFromSnapshot=e.createTextBufferFactory=void 0;function P(Y){const j=new C.PieceTreeTextBufferBuilder;return j.acceptChunk(Y),j.finish()}e.createTextBufferFactory=P;function N(Y){const j=new C.PieceTreeTextBufferBuilder;let Z;for(;typeof(Z=Y.read())=="string";)j.acceptChunk(Z);return j.finish()}e.createTextBufferFactoryFromSnapshot=N;function M(Y,j){let Z;return typeof Y=="string"?Z=P(Y):c.isITextSnapshot(Y)?Z=N(Y):Z=Y,Z.create(j)}e.createTextBuffer=M;let R=0;const x=999,O=1e4;class B{constructor(j){this._source=j,this._eos=!1}read(){if(this._eos)return null;const j=[];let Z=0,ee=0;do{const le=this._source.read();if(le===null)return this._eos=!0,Z===0?null:j.join("");if(le.length>0&&(j[Z++]=le,ee+=le.length),ee>=64*1024)return j.join("")}while(!0)}}const W=()=>{throw new Error("Invalid change accessor")};let V=A=class extends S.Disposable{static resolveOptions(j,Z){if(Z.detectIndentation){const ee=(0,g.guessIndentation)(j,Z.tabSize,Z.insertSpaces);return new c.TextModelResolvedOptions({tabSize:ee.tabSize,indentSize:"tabSize",insertSpaces:ee.insertSpaces,trimAutoWhitespace:Z.trimAutoWhitespace,defaultEOL:Z.defaultEOL,bracketPairColorizationOptions:Z.bracketPairColorizationOptions})}return new c.TextModelResolvedOptions(Z)}get onDidChangeLanguage(){return this._tokenizationTextModelPart.onDidChangeLanguage}get onDidChangeLanguageConfiguration(){return this._tokenizationTextModelPart.onDidChangeLanguageConfiguration}get onDidChangeTokens(){return this._tokenizationTextModelPart.onDidChangeTokens}onDidChangeContent(j){return this._eventEmitter.slowEvent(Z=>j(Z.contentChangedEvent))}onDidChangeContentOrInjectedText(j){return(0,S.combinedDisposable)(this._eventEmitter.fastEvent(Z=>j(Z)),this._onDidChangeInjectedText.event(Z=>j(Z)))}_isDisposing(){return this.__isDisposing}get tokenization(){return this._tokenizationTextModelPart}get bracketPairs(){return this._bracketPairs}get guides(){return this._guidesTextModelPart}constructor(j,Z,ee,le=null,ue,ce,pe){super(),this._undoRedoService=ue,this._languageService=ce,this._languageConfigurationService=pe,this._onWillDispose=this._register(new E.Emitter),this.onWillDispose=this._onWillDispose.event,this._onDidChangeDecorations=this._register(new U(Ae=>this.handleBeforeFireDecorationsChangedEvent(Ae))),this.onDidChangeDecorations=this._onDidChangeDecorations.event,this._onDidChangeOptions=this._register(new E.Emitter),this.onDidChangeOptions=this._onDidChangeOptions.event,this._onDidChangeAttached=this._register(new E.Emitter),this.onDidChangeAttached=this._onDidChangeAttached.event,this._onDidChangeInjectedText=this._register(new E.Emitter),this._eventEmitter=this._register(new G),this._languageSelectionListener=this._register(new S.MutableDisposable),this._deltaDecorationCallCnt=0,this._attachedViews=new z,R++,this.id="$model"+R,this.isForSimpleWidget=ee.isForSimpleWidget,typeof le>"u"||le===null?this._associatedResource=_.URI.parse("inmemory://model/"+R):this._associatedResource=le,this._attachedEditorCount=0;const{textBuffer:ve,disposable:Ce}=M(j,ee.defaultEOL);this._buffer=ve,this._bufferDisposable=Ce,this._options=A.resolveOptions(this._buffer,ee);const Se=typeof Z=="string"?Z:Z.languageId;typeof Z!="string"&&(this._languageSelectionListener.value=Z.onDidChange(()=>this._setLanguage(Z.languageId))),this._bracketPairs=this._register(new d.BracketPairsTextModelPart(this,this._languageConfigurationService)),this._guidesTextModelPart=this._register(new o.GuidesTextModelPart(this,this._languageConfigurationService)),this._decorationProvider=this._register(new s.ColorizedBracketPairsDecorationProvider(this)),this._tokenizationTextModelPart=new D.TokenizationTextModelPart(this._languageService,this._languageConfigurationService,this,this._bracketPairs,Se,this._attachedViews);const _e=this._buffer.getLineCount(),Ee=this._buffer.getValueLengthInRange(new n.Range(1,1,_e,this._buffer.getLineLength(_e)+1),0);ee.largeFileOptimizations?(this._isTooLargeForTokenization=Ee>A.LARGE_FILE_SIZE_THRESHOLD||_e>A.LARGE_FILE_LINE_COUNT_THRESHOLD,this._isTooLargeForHeapOperation=Ee>A.LARGE_FILE_HEAP_OPERATION_THRESHOLD):(this._isTooLargeForTokenization=!1,this._isTooLargeForHeapOperation=!1),this._isTooLargeForSyncing=Ee>A._MODEL_SYNC_LIMIT,this._versionId=1,this._alternativeVersionId=1,this._initialUndoRedoSnapshot=null,this._isDisposed=!1,this.__isDisposing=!1,this._instanceId=p.singleLetterHash(R),this._lastDecorationId=0,this._decorations=Object.create(null),this._decorationsTree=new ae,this._commandManager=new l.EditStack(this,this._undoRedoService),this._isUndoing=!1,this._isRedoing=!1,this._trimAutoWhitespaceLines=null,this._register(this._decorationProvider.onDidChange(()=>{this._onDidChangeDecorations.beginDeferredEmit(),this._onDidChangeDecorations.fire(),this._onDidChangeDecorations.endDeferredEmit()})),this._languageService.requestRichLanguageFeatures(Se)}dispose(){this.__isDisposing=!0,this._onWillDispose.fire(),this._tokenizationTextModelPart.dispose(),this._isDisposed=!0,super.dispose(),this._bufferDisposable.dispose(),this.__isDisposing=!1;const j=new m.PieceTreeTextBuffer([],"",`
+`,!1,!1,!0,!0);j.dispose(),this._buffer=j,this._bufferDisposable=S.Disposable.None}_assertNotDisposed(){if(this._isDisposed)throw new Error("Model is disposed!")}_emitContentChangedEvent(j,Z){this.__isDisposing||(this._tokenizationTextModelPart.handleDidChangeContent(Z),this._bracketPairs.handleDidChangeContent(Z),this._eventEmitter.fire(new I.InternalModelContentChangeEvent(j,Z)))}setValue(j){if(this._assertNotDisposed(),j==null)throw(0,y.illegalArgument)();const{textBuffer:Z,disposable:ee}=M(j,this._options.defaultEOL);this._setValueFromTextBuffer(Z,ee)}_createContentChanged2(j,Z,ee,le,ue,ce,pe,ve){return{changes:[{range:j,rangeOffset:Z,rangeLength:ee,text:le}],eol:this._buffer.getEOL(),isEolChange:ve,versionId:this.getVersionId(),isUndoing:ue,isRedoing:ce,isFlush:pe}}_setValueFromTextBuffer(j,Z){this._assertNotDisposed();const ee=this.getFullModelRange(),le=this.getValueLengthInRange(ee),ue=this.getLineCount(),ce=this.getLineMaxColumn(ue);this._buffer=j,this._bufferDisposable.dispose(),this._bufferDisposable=Z,this._increaseVersionId(),this._decorations=Object.create(null),this._decorationsTree=new ae,this._commandManager.clear(),this._trimAutoWhitespaceLines=null,this._emitContentChangedEvent(new I.ModelRawContentChangedEvent([new I.ModelRawFlush],this._versionId,!1,!1),this._createContentChanged2(new n.Range(1,1,ue,ce),0,le,this.getValue(),!1,!1,!0,!1))}setEOL(j){this._assertNotDisposed();const Z=j===1?`\r
+`:`
+`;if(this._buffer.getEOL()===Z)return;const ee=this.getFullModelRange(),le=this.getValueLengthInRange(ee),ue=this.getLineCount(),ce=this.getLineMaxColumn(ue);this._onBeforeEOLChange(),this._buffer.setEOL(Z),this._increaseVersionId(),this._onAfterEOLChange(),this._emitContentChangedEvent(new I.ModelRawContentChangedEvent([new I.ModelRawEOLChanged],this._versionId,!1,!1),this._createContentChanged2(new n.Range(1,1,ue,ce),0,le,this.getValue(),!1,!1,!1,!0))}_onBeforeEOLChange(){this._decorationsTree.ensureAllNodesHaveRanges(this)}_onAfterEOLChange(){const j=this.getVersionId(),Z=this._decorationsTree.collectNodesPostOrder();for(let ee=0,le=Z.length;ee<le;ee++){const ue=Z[ee],ce=ue.range,pe=ue.cachedAbsoluteStart-ue.start,ve=this._buffer.getOffsetAt(ce.startLineNumber,ce.startColumn),Ce=this._buffer.getOffsetAt(ce.endLineNumber,ce.endColumn);ue.cachedAbsoluteStart=ve,ue.cachedAbsoluteEnd=Ce,ue.cachedVersionId=j,ue.start=ve-pe,ue.end=Ce-pe,(0,h.recomputeMaxEnd)(ue)}}onBeforeAttached(){return this._attachedEditorCount++,this._attachedEditorCount===1&&(this._tokenizationTextModelPart.handleDidChangeAttached(),this._onDidChangeAttached.fire(void 0)),this._attachedViews.attachView()}onBeforeDetached(j){this._attachedEditorCount--,this._attachedEditorCount===0&&(this._tokenizationTextModelPart.handleDidChangeAttached(),this._onDidChangeAttached.fire(void 0)),this._attachedViews.detachView(j)}isAttachedToEditor(){return this._attachedEditorCount>0}getAttachedEditorCount(){return this._attachedEditorCount}isTooLargeForSyncing(){return this._isTooLargeForSyncing}isTooLargeForTokenization(){return this._isTooLargeForTokenization}isTooLargeForHeapOperation(){return this._isTooLargeForHeapOperation}isDisposed(){return this._isDisposed}isDominatedByLongLines(){if(this._assertNotDisposed(),this.isTooLargeForTokenization())return!1;let j=0,Z=0;const ee=this._buffer.getLineCount();for(let le=1;le<=ee;le++){const ue=this._buffer.getLineLength(le);ue>=O?Z+=ue:j+=ue}return Z>j}get uri(){return this._associatedResource}getOptions(){return this._assertNotDisposed(),this._options}getFormattingOptions(){return{tabSize:this._options.indentSize,insertSpaces:this._options.insertSpaces}}updateOptions(j){this._assertNotDisposed();const Z=typeof j.tabSize<"u"?j.tabSize:this._options.tabSize,ee=typeof j.indentSize<"u"?j.indentSize:this._options.originalIndentSize,le=typeof j.insertSpaces<"u"?j.insertSpaces:this._options.insertSpaces,ue=typeof j.trimAutoWhitespace<"u"?j.trimAutoWhitespace:this._options.trimAutoWhitespace,ce=typeof j.bracketColorizationOptions<"u"?j.bracketColorizationOptions:this._options.bracketPairColorizationOptions,pe=new c.TextModelResolvedOptions({tabSize:Z,indentSize:ee,insertSpaces:le,defaultEOL:this._options.defaultEOL,trimAutoWhitespace:ue,bracketPairColorizationOptions:ce});if(this._options.equals(pe))return;const ve=this._options.createChangeEvent(pe);this._options=pe,this._bracketPairs.handleDidChangeOptions(ve),this._decorationProvider.handleDidChangeOptions(ve),this._onDidChangeOptions.fire(ve)}detectIndentation(j,Z){this._assertNotDisposed();const ee=(0,g.guessIndentation)(this._buffer,Z,j);this.updateOptions({insertSpaces:ee.insertSpaces,tabSize:ee.tabSize,indentSize:ee.tabSize})}normalizeIndentation(j){return this._assertNotDisposed(),(0,b.normalizeIndentation)(j,this._options.indentSize,this._options.insertSpaces)}getVersionId(){return this._assertNotDisposed(),this._versionId}mightContainRTL(){return this._buffer.mightContainRTL()}mightContainUnusualLineTerminators(){return this._buffer.mightContainUnusualLineTerminators()}removeUnusualLineTerminators(j=null){const Z=this.findMatches(p.UNUSUAL_LINE_TERMINATORS.source,!1,!0,!1,null,!1,1073741824);this._buffer.resetMightContainUnusualLineTerminators(),this.pushEditOperations(j,Z.map(ee=>({range:ee.range,text:null})),()=>null)}mightContainNonBasicASCII(){return this._buffer.mightContainNonBasicASCII()}getAlternativeVersionId(){return this._assertNotDisposed(),this._alternativeVersionId}getInitialUndoRedoSnapshot(){return this._assertNotDisposed(),this._initialUndoRedoSnapshot}getOffsetAt(j){this._assertNotDisposed();const Z=this._validatePosition(j.lineNumber,j.column,0);return this._buffer.getOffsetAt(Z.lineNumber,Z.column)}getPositionAt(j){this._assertNotDisposed();const Z=Math.min(this._buffer.getLength(),Math.max(0,j));return this._buffer.getPositionAt(Z)}_increaseVersionId(){this._versionId=this._versionId+1,this._alternativeVersionId=this._versionId}_overwriteVersionId(j){this._versionId=j}_overwriteAlternativeVersionId(j){this._alternativeVersionId=j}_overwriteInitialUndoRedoSnapshot(j){this._initialUndoRedoSnapshot=j}getValue(j,Z=!1){if(this._assertNotDisposed(),this.isTooLargeForHeapOperation())throw new y.BugIndicatingError("Operation would exceed heap memory limits");const ee=this.getFullModelRange(),le=this.getValueInRange(ee,j);return Z?this._buffer.getBOM()+le:le}createSnapshot(j=!1){return new B(this._buffer.createSnapshot(j))}getValueLength(j,Z=!1){this._assertNotDisposed();const ee=this.getFullModelRange(),le=this.getValueLengthInRange(ee,j);return Z?this._buffer.getBOM().length+le:le}getValueInRange(j,Z=0){return this._assertNotDisposed(),this._buffer.getValueInRange(this.validateRange(j),Z)}getValueLengthInRange(j,Z=0){return this._assertNotDisposed(),this._buffer.getValueLengthInRange(this.validateRange(j),Z)}getCharacterCountInRange(j,Z=0){return this._assertNotDisposed(),this._buffer.getCharacterCountInRange(this.validateRange(j),Z)}getLineCount(){return this._assertNotDisposed(),this._buffer.getLineCount()}getLineContent(j){if(this._assertNotDisposed(),j<1||j>this.getLineCount())throw new y.BugIndicatingError("Illegal value for lineNumber");return this._buffer.getLineContent(j)}getLineLength(j){if(this._assertNotDisposed(),j<1||j>this.getLineCount())throw new y.BugIndicatingError("Illegal value for lineNumber");return this._buffer.getLineLength(j)}getLinesContent(){if(this._assertNotDisposed(),this.isTooLargeForHeapOperation())throw new y.BugIndicatingError("Operation would exceed heap memory limits");return this._buffer.getLinesContent()}getEOL(){return this._assertNotDisposed(),this._buffer.getEOL()}getEndOfLineSequence(){return this._assertNotDisposed(),this._buffer.getEOL()===`
+`?0:1}getLineMinColumn(j){return this._assertNotDisposed(),1}getLineMaxColumn(j){if(this._assertNotDisposed(),j<1||j>this.getLineCount())throw new y.BugIndicatingError("Illegal value for lineNumber");return this._buffer.getLineLength(j)+1}getLineFirstNonWhitespaceColumn(j){if(this._assertNotDisposed(),j<1||j>this.getLineCount())throw new y.BugIndicatingError("Illegal value for lineNumber");return this._buffer.getLineFirstNonWhitespaceColumn(j)}getLineLastNonWhitespaceColumn(j){if(this._assertNotDisposed(),j<1||j>this.getLineCount())throw new y.BugIndicatingError("Illegal value for lineNumber");return this._buffer.getLineLastNonWhitespaceColumn(j)}_validateRangeRelaxedNoAllocations(j){const Z=this._buffer.getLineCount(),ee=j.startLineNumber,le=j.startColumn;let ue=Math.floor(typeof ee=="number"&&!isNaN(ee)?ee:1),ce=Math.floor(typeof le=="number"&&!isNaN(le)?le:1);if(ue<1)ue=1,ce=1;else if(ue>Z)ue=Z,ce=this.getLineMaxColumn(ue);else if(ce<=1)ce=1;else{const _e=this.getLineMaxColumn(ue);ce>=_e&&(ce=_e)}const pe=j.endLineNumber,ve=j.endColumn;let Ce=Math.floor(typeof pe=="number"&&!isNaN(pe)?pe:1),Se=Math.floor(typeof ve=="number"&&!isNaN(ve)?ve:1);if(Ce<1)Ce=1,Se=1;else if(Ce>Z)Ce=Z,Se=this.getLineMaxColumn(Ce);else if(Se<=1)Se=1;else{const _e=this.getLineMaxColumn(Ce);Se>=_e&&(Se=_e)}return ee===ue&&le===ce&&pe===Ce&&ve===Se&&j instanceof n.Range&&!(j instanceof t.Selection)?j:new n.Range(ue,ce,Ce,Se)}_isValidPosition(j,Z,ee){if(typeof j!="number"||typeof Z!="number"||isNaN(j)||isNaN(Z)||j<1||Z<1||(j|0)!==j||(Z|0)!==Z)return!1;const le=this._buffer.getLineCount();if(j>le)return!1;if(Z===1)return!0;const ue=this.getLineMaxColumn(j);if(Z>ue)return!1;if(ee===1){const ce=this._buffer.getLineCharCode(j,Z-2);if(p.isHighSurrogate(ce))return!1}return!0}_validatePosition(j,Z,ee){const le=Math.floor(typeof j=="number"&&!isNaN(j)?j:1),ue=Math.floor(typeof Z=="number"&&!isNaN(Z)?Z:1),ce=this._buffer.getLineCount();if(le<1)return new i.Position(1,1);if(le>ce)return new i.Position(ce,this.getLineMaxColumn(ce));if(ue<=1)return new i.Position(le,1);const pe=this.getLineMaxColumn(le);if(ue>=pe)return new i.Position(le,pe);if(ee===1){const ve=this._buffer.getLineCharCode(le,ue-2);if(p.isHighSurrogate(ve))return new i.Position(le,ue-1)}return new i.Position(le,ue)}validatePosition(j){return this._assertNotDisposed(),j instanceof i.Position&&this._isValidPosition(j.lineNumber,j.column,1)?j:this._validatePosition(j.lineNumber,j.column,1)}_isValidRange(j,Z){const ee=j.startLineNumber,le=j.startColumn,ue=j.endLineNumber,ce=j.endColumn;if(!this._isValidPosition(ee,le,0)||!this._isValidPosition(ue,ce,0))return!1;if(Z===1){const pe=le>1?this._buffer.getLineCharCode(ee,le-2):0,ve=ce>1&&ce<=this._buffer.getLineLength(ue)?this._buffer.getLineCharCode(ue,ce-2):0,Ce=p.isHighSurrogate(pe),Se=p.isHighSurrogate(ve);return!Ce&&!Se}return!0}validateRange(j){if(this._assertNotDisposed(),j instanceof n.Range&&!(j instanceof t.Selection)&&this._isValidRange(j,1))return j;const ee=this._validatePosition(j.startLineNumber,j.startColumn,0),le=this._validatePosition(j.endLineNumber,j.endColumn,0),ue=ee.lineNumber,ce=ee.column,pe=le.lineNumber,ve=le.column;{const Ce=ce>1?this._buffer.getLineCharCode(ue,ce-2):0,Se=ve>1&&ve<=this._buffer.getLineLength(pe)?this._buffer.getLineCharCode(pe,ve-2):0,_e=p.isHighSurrogate(Ce),Ee=p.isHighSurrogate(Se);return!_e&&!Ee?new n.Range(ue,ce,pe,ve):ue===pe&&ce===ve?new n.Range(ue,ce-1,pe,ve-1):_e&&Ee?new n.Range(ue,ce-1,pe,ve+1):_e?new n.Range(ue,ce-1,pe,ve):new n.Range(ue,ce,pe,ve+1)}return new n.Range(ue,ce,pe,ve)}modifyPosition(j,Z){this._assertNotDisposed();const ee=this.getOffsetAt(j)+Z;return this.getPositionAt(Math.min(this._buffer.getLength(),Math.max(0,ee)))}getFullModelRange(){this._assertNotDisposed();const j=this.getLineCount();return new n.Range(1,1,j,this.getLineMaxColumn(j))}findMatchesLineByLine(j,Z,ee,le){return this._buffer.findMatchesLineByLine(j,Z,ee,le)}findMatches(j,Z,ee,le,ue,ce,pe=x){this._assertNotDisposed();let ve=null;Z!==null&&(Array.isArray(Z)||(Z=[Z]),Z.every(_e=>n.Range.isIRange(_e))&&(ve=Z.map(_e=>this.validateRange(_e)))),ve===null&&(ve=[this.getFullModelRange()]),ve=ve.sort((_e,Ee)=>_e.startLineNumber-Ee.startLineNumber||_e.startColumn-Ee.startColumn);const Ce=[];Ce.push(ve.reduce((_e,Ee)=>n.Range.areIntersecting(_e,Ee)?_e.plusRange(Ee):(Ce.push(_e),Ee)));let Se;if(!ee&&j.indexOf(`
+`)<0){const Ee=new w.SearchParams(j,ee,le,ue).parseSearchRequest();if(!Ee)return[];Se=Ae=>this.findMatchesLineByLine(Ae,Ee,ce,pe)}else Se=_e=>w.TextModelSearch.findMatches(this,new w.SearchParams(j,ee,le,ue),_e,ce,pe);return Ce.map(Se).reduce((_e,Ee)=>_e.concat(Ee),[])}findNextMatch(j,Z,ee,le,ue,ce){this._assertNotDisposed();const pe=this.validatePosition(Z);if(!ee&&j.indexOf(`
+`)<0){const Ce=new w.SearchParams(j,ee,le,ue).parseSearchRequest();if(!Ce)return null;const Se=this.getLineCount();let _e=new n.Range(pe.lineNumber,pe.column,Se,this.getLineMaxColumn(Se)),Ee=this.findMatchesLineByLine(_e,Ce,ce,1);return w.TextModelSearch.findNextMatch(this,new w.SearchParams(j,ee,le,ue),pe,ce),Ee.length>0||(_e=new n.Range(1,1,pe.lineNumber,this.getLineMaxColumn(pe.lineNumber)),Ee=this.findMatchesLineByLine(_e,Ce,ce,1),Ee.length>0)?Ee[0]:null}return w.TextModelSearch.findNextMatch(this,new w.SearchParams(j,ee,le,ue),pe,ce)}findPreviousMatch(j,Z,ee,le,ue,ce){this._assertNotDisposed();const pe=this.validatePosition(Z);return w.TextModelSearch.findPreviousMatch(this,new w.SearchParams(j,ee,le,ue),pe,ce)}pushStackElement(){this._commandManager.pushStackElement()}popStackElement(){this._commandManager.popStackElement()}pushEOL(j){if((this.getEOL()===`
+`?0:1)!==j)try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit(),this._initialUndoRedoSnapshot===null&&(this._initialUndoRedoSnapshot=this._undoRedoService.createSnapshot(this.uri)),this._commandManager.pushEOL(j)}finally{this._eventEmitter.endDeferredEmit(),this._onDidChangeDecorations.endDeferredEmit()}}_validateEditOperation(j){return j instanceof c.ValidAnnotatedEditOperation?j:new c.ValidAnnotatedEditOperation(j.identifier||null,this.validateRange(j.range),j.text,j.forceMoveMarkers||!1,j.isAutoWhitespaceEdit||!1,j._isTracked||!1)}_validateEditOperations(j){const Z=[];for(let ee=0,le=j.length;ee<le;ee++)Z[ee]=this._validateEditOperation(j[ee]);return Z}pushEditOperations(j,Z,ee,le){try{return this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit(),this._pushEditOperations(j,this._validateEditOperations(Z),ee,le)}finally{this._eventEmitter.endDeferredEmit(),this._onDidChangeDecorations.endDeferredEmit()}}_pushEditOperations(j,Z,ee,le){if(this._options.trimAutoWhitespace&&this._trimAutoWhitespaceLines){const ue=Z.map(pe=>({range:this.validateRange(pe.range),text:pe.text}));let ce=!0;if(j)for(let pe=0,ve=j.length;pe<ve;pe++){const Ce=j[pe];let Se=!1;for(let _e=0,Ee=ue.length;_e<Ee;_e++){const Ae=ue[_e].range,xe=Ae.startLineNumber>Ce.endLineNumber,Be=Ce.startLineNumber>Ae.endLineNumber;if(!xe&&!Be){Se=!0;break}}if(!Se){ce=!1;break}}if(ce)for(let pe=0,ve=this._trimAutoWhitespaceLines.length;pe<ve;pe++){const Ce=this._trimAutoWhitespaceLines[pe],Se=this.getLineMaxColumn(Ce);let _e=!0;for(let Ee=0,Ae=ue.length;Ee<Ae;Ee++){const xe=ue[Ee].range,Be=ue[Ee].text;if(!(Ce<xe.startLineNumber||Ce>xe.endLineNumber)&&!(Ce===xe.startLineNumber&&xe.startColumn===Se&&xe.isEmpty()&&Be&&Be.length>0&&Be.charAt(0)===`
+`)&&!(Ce===xe.startLineNumber&&xe.startColumn===1&&xe.isEmpty()&&Be&&Be.length>0&&Be.charAt(Be.length-1)===`
+`)){_e=!1;break}}if(_e){const Ee=new n.Range(Ce,1,Ce,Se);Z.push(new c.ValidAnnotatedEditOperation(null,Ee,null,!1,!1,!1))}}this._trimAutoWhitespaceLines=null}return this._initialUndoRedoSnapshot===null&&(this._initialUndoRedoSnapshot=this._undoRedoService.createSnapshot(this.uri)),this._commandManager.pushEditOperation(j,Z,ee,le)}_applyUndo(j,Z,ee,le){const ue=j.map(ce=>{const pe=this.getPositionAt(ce.newPosition),ve=this.getPositionAt(ce.newEnd);return{range:new n.Range(pe.lineNumber,pe.column,ve.lineNumber,ve.column),text:ce.oldText}});this._applyUndoRedoEdits(ue,Z,!0,!1,ee,le)}_applyRedo(j,Z,ee,le){const ue=j.map(ce=>{const pe=this.getPositionAt(ce.oldPosition),ve=this.getPositionAt(ce.oldEnd);return{range:new n.Range(pe.lineNumber,pe.column,ve.lineNumber,ve.column),text:ce.newText}});this._applyUndoRedoEdits(ue,Z,!1,!0,ee,le)}_applyUndoRedoEdits(j,Z,ee,le,ue,ce){try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit(),this._isUndoing=ee,this._isRedoing=le,this.applyEdits(j,!1),this.setEOL(Z),this._overwriteAlternativeVersionId(ue)}finally{this._isUndoing=!1,this._isRedoing=!1,this._eventEmitter.endDeferredEmit(ce),this._onDidChangeDecorations.endDeferredEmit()}}applyEdits(j,Z=!1){try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit();const ee=this._validateEditOperations(j);return this._doApplyEdits(ee,Z)}finally{this._eventEmitter.endDeferredEmit(),this._onDidChangeDecorations.endDeferredEmit()}}_doApplyEdits(j,Z){const ee=this._buffer.getLineCount(),le=this._buffer.applyEdits(j,this._options.trimAutoWhitespace,Z),ue=this._buffer.getLineCount(),ce=le.changes;if(this._trimAutoWhitespaceLines=le.trimAutoWhitespaceLineNumbers,ce.length!==0){for(let Ce=0,Se=ce.length;Ce<Se;Ce++){const _e=ce[Ce];this._decorationsTree.acceptReplace(_e.rangeOffset,_e.rangeLength,_e.text.length,_e.forceMoveMarkers)}const pe=[];this._increaseVersionId();let ve=ee;for(let Ce=0,Se=ce.length;Ce<Se;Ce++){const _e=ce[Ce],[Ee]=(0,v.countEOL)(_e.text);this._onDidChangeDecorations.fire();const Ae=_e.range.startLineNumber,xe=_e.range.endLineNumber,Be=xe-Ae,De=Ee,Ie=Math.min(Be,De),fe=De-Be,be=ue-ve-fe+Ae,Ne=be,Pe=be+De,ze=this._decorationsTree.getInjectedTextInInterval(this,this.getOffsetAt(new i.Position(Ne,1)),this.getOffsetAt(new i.Position(Pe,this.getLineMaxColumn(Pe))),0),Ke=I.LineInjectedText.fromDecorations(ze),je=new L.ArrayQueue(Ke);for(let Je=Ie;Je>=0;Je--){const rt=Ae+Je,et=be+Je;je.takeFromEndWhile(Qe=>Qe.lineNumber>et);const st=je.takeFromEndWhile(Qe=>Qe.lineNumber===et);pe.push(new I.ModelRawLineChanged(rt,this.getLineContent(et),st))}if(Ie<Be){const Je=Ae+Ie;pe.push(new I.ModelRawLinesDeleted(Je+1,xe))}if(Ie<De){const Je=new L.ArrayQueue(Ke),rt=Ae+Ie,et=De-Ie,st=ue-ve-et+rt+1,Qe=[],ft=[];for(let at=0;at<et;at++){const ct=st+at;ft[at]=this.getLineContent(ct),Je.takeWhile(lt=>lt.lineNumber<ct),Qe[at]=Je.takeWhile(lt=>lt.lineNumber===ct)}pe.push(new I.ModelRawLinesInserted(rt+1,Ae+De,ft,Qe))}ve+=fe}this._emitContentChangedEvent(new I.ModelRawContentChangedEvent(pe,this.getVersionId(),this._isUndoing,this._isRedoing),{changes:ce,eol:this._buffer.getEOL(),isEolChange:!1,versionId:this.getVersionId(),isUndoing:this._isUndoing,isRedoing:this._isRedoing,isFlush:!1})}return le.reverseEdits===null?void 0:le.reverseEdits}undo(){return this._undoRedoService.undo(this.uri)}canUndo(){return this._undoRedoService.canUndo(this.uri)}redo(){return this._undoRedoService.redo(this.uri)}canRedo(){return this._undoRedoService.canRedo(this.uri)}handleBeforeFireDecorationsChangedEvent(j){if(j===null||j.size===0)return;const ee=Array.from(j).map(le=>new I.ModelRawLineChanged(le,this.getLineContent(le),this._getInjectedTextInLine(le)));this._onDidChangeInjectedText.fire(new I.ModelInjectedTextChangedEvent(ee))}changeDecorations(j,Z=0){this._assertNotDisposed();try{return this._onDidChangeDecorations.beginDeferredEmit(),this._changeDecorations(Z,j)}finally{this._onDidChangeDecorations.endDeferredEmit()}}_changeDecorations(j,Z){const ee={addDecoration:(ue,ce)=>this._deltaDecorationsImpl(j,[],[{range:ue,options:ce}])[0],changeDecoration:(ue,ce)=>{this._changeDecorationImpl(ue,ce)},changeDecorationOptions:(ue,ce)=>{this._changeDecorationOptionsImpl(ue,X(ce))},removeDecoration:ue=>{this._deltaDecorationsImpl(j,[ue],[])},deltaDecorations:(ue,ce)=>ue.length===0&&ce.length===0?[]:this._deltaDecorationsImpl(j,ue,ce)};let le=null;try{le=Z(ee)}catch(ue){(0,y.onUnexpectedError)(ue)}return ee.addDecoration=W,ee.changeDecoration=W,ee.changeDecorationOptions=W,ee.removeDecoration=W,ee.deltaDecorations=W,le}deltaDecorations(j,Z,ee=0){if(this._assertNotDisposed(),j||(j=[]),j.length===0&&Z.length===0)return[];try{return this._deltaDecorationCallCnt++,this._deltaDecorationCallCnt>1&&(console.warn("Invoking deltaDecorations recursively could lead to leaking decorations."),(0,y.onUnexpectedError)(new Error("Invoking deltaDecorations recursively could lead to leaking decorations."))),this._onDidChangeDecorations.beginDeferredEmit(),this._deltaDecorationsImpl(ee,j,Z)}finally{this._onDidChangeDecorations.endDeferredEmit(),this._deltaDecorationCallCnt--}}_getTrackedRange(j){return this.getDecorationRange(j)}_setTrackedRange(j,Z,ee){const le=j?this._decorations[j]:null;if(!le)return Z?this._deltaDecorationsImpl(0,[],[{range:Z,options:me[ee]}],!0)[0]:null;if(!Z)return this._decorationsTree.delete(le),delete this._decorations[le.id],null;const ue=this._validateRangeRelaxedNoAllocations(Z),ce=this._buffer.getOffsetAt(ue.startLineNumber,ue.startColumn),pe=this._buffer.getOffsetAt(ue.endLineNumber,ue.endColumn);return this._decorationsTree.delete(le),le.reset(this.getVersionId(),ce,pe,ue),le.setOptions(me[ee]),this._decorationsTree.insert(le),le.id}removeAllDecorationsWithOwnerId(j){if(this._isDisposed)return;const Z=this._decorationsTree.collectNodesFromOwner(j);for(let ee=0,le=Z.length;ee<le;ee++){const ue=Z[ee];this._decorationsTree.delete(ue),delete this._decorations[ue.id]}}getDecorationOptions(j){const Z=this._decorations[j];return Z?Z.options:null}getDecorationRange(j){const Z=this._decorations[j];return Z?this._decorationsTree.getNodeRange(this,Z):null}getLineDecorations(j,Z=0,ee=!1){return j<1||j>this.getLineCount()?[]:this.getLinesDecorations(j,j,Z,ee)}getLinesDecorations(j,Z,ee=0,le=!1,ue=!1){const ce=this.getLineCount(),pe=Math.min(ce,Math.max(1,j)),ve=Math.min(ce,Math.max(1,Z)),Ce=this.getLineMaxColumn(ve),Se=new n.Range(pe,1,ve,Ce),_e=this._getDecorationsInRange(Se,ee,le,ue);return(0,L.pushMany)(_e,this._decorationProvider.getDecorationsInRange(Se,ee,le)),_e}getDecorationsInRange(j,Z=0,ee=!1,le=!1,ue=!1){const ce=this.validateRange(j),pe=this._getDecorationsInRange(ce,Z,ee,ue);return(0,L.pushMany)(pe,this._decorationProvider.getDecorationsInRange(ce,Z,ee,le)),pe}getOverviewRulerDecorations(j=0,Z=!1){return this._decorationsTree.getAll(this,j,Z,!0,!1)}getInjectedTextDecorations(j=0){return this._decorationsTree.getAllInjectedText(this,j)}_getInjectedTextInLine(j){const Z=this._buffer.getOffsetAt(j,1),ee=Z+this._buffer.getLineLength(j),le=this._decorationsTree.getInjectedTextInInterval(this,Z,ee,0);return I.LineInjectedText.fromDecorations(le).filter(ue=>ue.lineNumber===j)}getAllDecorations(j=0,Z=!1){let ee=this._decorationsTree.getAll(this,j,Z,!1,!1);return ee=ee.concat(this._decorationProvider.getAllDecorations(j,Z)),ee}getAllMarginDecorations(j=0){return this._decorationsTree.getAll(this,j,!1,!1,!0)}_getDecorationsInRange(j,Z,ee,le){const ue=this._buffer.getOffsetAt(j.startLineNumber,j.startColumn),ce=this._buffer.getOffsetAt(j.endLineNumber,j.endColumn);return this._decorationsTree.getAllInInterval(this,ue,ce,Z,ee,le)}getRangeAt(j,Z){return this._buffer.getRangeAt(j,Z-j)}_changeDecorationImpl(j,Z){const ee=this._decorations[j];if(!ee)return;if(ee.options.after){const pe=this.getDecorationRange(j);this._onDidChangeDecorations.recordLineAffectedByInjectedText(pe.endLineNumber)}if(ee.options.before){const pe=this.getDecorationRange(j);this._onDidChangeDecorations.recordLineAffectedByInjectedText(pe.startLineNumber)}const le=this._validateRangeRelaxedNoAllocations(Z),ue=this._buffer.getOffsetAt(le.startLineNumber,le.startColumn),ce=this._buffer.getOffsetAt(le.endLineNumber,le.endColumn);this._decorationsTree.delete(ee),ee.reset(this.getVersionId(),ue,ce,le),this._decorationsTree.insert(ee),this._onDidChangeDecorations.checkAffectedAndFire(ee.options),ee.options.after&&this._onDidChangeDecorations.recordLineAffectedByInjectedText(le.endLineNumber),ee.options.before&&this._onDidChangeDecorations.recordLineAffectedByInjectedText(le.startLineNumber)}_changeDecorationOptionsImpl(j,Z){const ee=this._decorations[j];if(!ee)return;const le=!!(ee.options.overviewRuler&&ee.options.overviewRuler.color),ue=!!(Z.overviewRuler&&Z.overviewRuler.color);if(this._onDidChangeDecorations.checkAffectedAndFire(ee.options),this._onDidChangeDecorations.checkAffectedAndFire(Z),ee.options.after||Z.after){const ve=this._decorationsTree.getNodeRange(this,ee);this._onDidChangeDecorations.recordLineAffectedByInjectedText(ve.endLineNumber)}if(ee.options.before||Z.before){const ve=this._decorationsTree.getNodeRange(this,ee);this._onDidChangeDecorations.recordLineAffectedByInjectedText(ve.startLineNumber)}const ce=le!==ue,pe=q(Z)!==ie(ee);ce||pe?(this._decorationsTree.delete(ee),ee.setOptions(Z),this._decorationsTree.insert(ee)):ee.setOptions(Z)}_deltaDecorationsImpl(j,Z,ee,le=!1){const ue=this.getVersionId(),ce=Z.length;let pe=0;const ve=ee.length;let Ce=0;this._onDidChangeDecorations.beginDeferredEmit();try{const Se=new Array(ve);for(;pe<ce||Ce<ve;){let _e=null;if(pe<ce){do _e=this._decorations[Z[pe++]];while(!_e&&pe<ce);if(_e){if(_e.options.after){const Ee=this._decorationsTree.getNodeRange(this,_e);this._onDidChangeDecorations.recordLineAffectedByInjectedText(Ee.endLineNumber)}if(_e.options.before){const Ee=this._decorationsTree.getNodeRange(this,_e);this._onDidChangeDecorations.recordLineAffectedByInjectedText(Ee.startLineNumber)}this._decorationsTree.delete(_e),le||this._onDidChangeDecorations.checkAffectedAndFire(_e.options)}}if(Ce<ve){if(!_e){const Ie=++this._lastDecorationId,fe=`${this._instanceId};${Ie}`;_e=new h.IntervalNode(fe,0,0),this._decorations[fe]=_e}const Ee=ee[Ce],Ae=this._validateRangeRelaxedNoAllocations(Ee.range),xe=X(Ee.options),Be=this._buffer.getOffsetAt(Ae.startLineNumber,Ae.startColumn),De=this._buffer.getOffsetAt(Ae.endLineNumber,Ae.endColumn);_e.ownerId=j,_e.reset(ue,Be,De,Ae),_e.setOptions(xe),_e.options.after&&this._onDidChangeDecorations.recordLineAffectedByInjectedText(Ae.endLineNumber),_e.options.before&&this._onDidChangeDecorations.recordLineAffectedByInjectedText(Ae.startLineNumber),le||this._onDidChangeDecorations.checkAffectedAndFire(xe),this._decorationsTree.insert(_e),Se[Ce]=_e.id,Ce++}else _e&&delete this._decorations[_e.id]}return Se}finally{this._onDidChangeDecorations.endDeferredEmit()}}getLanguageId(){return this.tokenization.getLanguageId()}setLanguage(j,Z){typeof j=="string"?(this._languageSelectionListener.clear(),this._setLanguage(j,Z)):(this._languageSelectionListener.value=j.onDidChange(()=>this._setLanguage(j.languageId,Z)),this._setLanguage(j.languageId,Z))}_setLanguage(j,Z){this.tokenization.setLanguageId(j,Z),this._languageService.requestRichLanguageFeatures(j)}getLanguageIdAtPosition(j,Z){return this.tokenization.getLanguageIdAtPosition(j,Z)}getWordAtPosition(j){return this._tokenizationTextModelPart.getWordAtPosition(j)}getWordUntilPosition(j){return this._tokenizationTextModelPart.getWordUntilPosition(j)}normalizePosition(j,Z){return j}getLineIndentColumn(j){return K(this.getLineContent(j))+1}};e.TextModel=V,V._MODEL_SYNC_LIMIT=50*1024*1024,V.LARGE_FILE_SIZE_THRESHOLD=20*1024*1024,V.LARGE_FILE_LINE_COUNT_THRESHOLD=300*1e3,V.LARGE_FILE_HEAP_OPERATION_THRESHOLD=256*1024*1024,V.DEFAULT_CREATION_OPTIONS={isForSimpleWidget:!1,tabSize:r.EDITOR_MODEL_DEFAULTS.tabSize,indentSize:r.EDITOR_MODEL_DEFAULTS.indentSize,insertSpaces:r.EDITOR_MODEL_DEFAULTS.insertSpaces,detectIndentation:!1,defaultEOL:1,trimAutoWhitespace:r.EDITOR_MODEL_DEFAULTS.trimAutoWhitespace,largeFileOptimizations:r.EDITOR_MODEL_DEFAULTS.largeFileOptimizations,bracketPairColorizationOptions:r.EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions},e.TextModel=V=A=ke([ge(4,T.IUndoRedoService),ge(5,u.ILanguageService),ge(6,f.ILanguageConfigurationService)],V);function K(Y){let j=0;for(const Z of Y)if(Z===" "||Z==="	")j++;else break;return j}function F(Y){return!!(Y.options.overviewRuler&&Y.options.overviewRuler.color)}function q(Y){return!!Y.after||!!Y.before}function ie(Y){return!!Y.options.after||!!Y.options.before}class ae{constructor(){this._decorationsTree0=new h.IntervalTree,this._decorationsTree1=new h.IntervalTree,this._injectedTextDecorationsTree=new h.IntervalTree}ensureAllNodesHaveRanges(j){this.getAll(j,0,!1,!1,!1)}_ensureNodesHaveRanges(j,Z){for(const ee of Z)ee.range===null&&(ee.range=j.getRangeAt(ee.cachedAbsoluteStart,ee.cachedAbsoluteEnd));return Z}getAllInInterval(j,Z,ee,le,ue,ce){const pe=j.getVersionId(),ve=this._intervalSearch(Z,ee,le,ue,pe,ce);return this._ensureNodesHaveRanges(j,ve)}_intervalSearch(j,Z,ee,le,ue,ce){const pe=this._decorationsTree0.intervalSearch(j,Z,ee,le,ue,ce),ve=this._decorationsTree1.intervalSearch(j,Z,ee,le,ue,ce),Ce=this._injectedTextDecorationsTree.intervalSearch(j,Z,ee,le,ue,ce);return pe.concat(ve).concat(Ce)}getInjectedTextInInterval(j,Z,ee,le){const ue=j.getVersionId(),ce=this._injectedTextDecorationsTree.intervalSearch(Z,ee,le,!1,ue,!1);return this._ensureNodesHaveRanges(j,ce).filter(pe=>pe.options.showIfCollapsed||!pe.range.isEmpty())}getAllInjectedText(j,Z){const ee=j.getVersionId(),le=this._injectedTextDecorationsTree.search(Z,!1,ee,!1);return this._ensureNodesHaveRanges(j,le).filter(ue=>ue.options.showIfCollapsed||!ue.range.isEmpty())}getAll(j,Z,ee,le,ue){const ce=j.getVersionId(),pe=this._search(Z,ee,le,ce,ue);return this._ensureNodesHaveRanges(j,pe)}_search(j,Z,ee,le,ue){if(ee)return this._decorationsTree1.search(j,Z,le,ue);{const ce=this._decorationsTree0.search(j,Z,le,ue),pe=this._decorationsTree1.search(j,Z,le,ue),ve=this._injectedTextDecorationsTree.search(j,Z,le,ue);return ce.concat(pe).concat(ve)}}collectNodesFromOwner(j){const Z=this._decorationsTree0.collectNodesFromOwner(j),ee=this._decorationsTree1.collectNodesFromOwner(j),le=this._injectedTextDecorationsTree.collectNodesFromOwner(j);return Z.concat(ee).concat(le)}collectNodesPostOrder(){const j=this._decorationsTree0.collectNodesPostOrder(),Z=this._decorationsTree1.collectNodesPostOrder(),ee=this._injectedTextDecorationsTree.collectNodesPostOrder();return j.concat(Z).concat(ee)}insert(j){ie(j)?this._injectedTextDecorationsTree.insert(j):F(j)?this._decorationsTree1.insert(j):this._decorationsTree0.insert(j)}delete(j){ie(j)?this._injectedTextDecorationsTree.delete(j):F(j)?this._decorationsTree1.delete(j):this._decorationsTree0.delete(j)}getNodeRange(j,Z){const ee=j.getVersionId();return Z.cachedVersionId!==ee&&this._resolveNode(Z,ee),Z.range===null&&(Z.range=j.getRangeAt(Z.cachedAbsoluteStart,Z.cachedAbsoluteEnd)),Z.range}_resolveNode(j,Z){ie(j)?this._injectedTextDecorationsTree.resolveNode(j,Z):F(j)?this._decorationsTree1.resolveNode(j,Z):this._decorationsTree0.resolveNode(j,Z)}acceptReplace(j,Z,ee,le){this._decorationsTree0.acceptReplace(j,Z,ee,le),this._decorationsTree1.acceptReplace(j,Z,ee,le),this._injectedTextDecorationsTree.acceptReplace(j,Z,ee,le)}}function ne(Y){return Y.replace(/[^a-z0-9\-_]/gi," ")}class ${constructor(j){this.color=j.color||"",this.darkColor=j.darkColor||""}}class J extends ${constructor(j){super(j),this._resolvedColor=null,this.position=typeof j.position=="number"?j.position:c.OverviewRulerLane.Center}getColor(j){return this._resolvedColor||(j.type!=="light"&&this.darkColor?this._resolvedColor=this._resolveColor(this.darkColor,j):this._resolvedColor=this._resolveColor(this.color,j)),this._resolvedColor}invalidateCachedColor(){this._resolvedColor=null}_resolveColor(j,Z){if(typeof j=="string")return j;const ee=j?Z.getColor(j.id):null;return ee?ee.toString():""}}e.ModelDecorationOverviewRulerOptions=J;class Q{constructor(j){var Z;this.position=(Z=j?.position)!==null&&Z!==void 0?Z:c.GlyphMarginLane.Center,this.persistLane=j?.persistLane}}e.ModelDecorationGlyphMarginOptions=Q;class re extends ${constructor(j){super(j),this.position=j.position}getColor(j){return this._resolvedColor||(j.type!=="light"&&this.darkColor?this._resolvedColor=this._resolveColor(this.darkColor,j):this._resolvedColor=this._resolveColor(this.color,j)),this._resolvedColor}invalidateCachedColor(){this._resolvedColor=void 0}_resolveColor(j,Z){return typeof j=="string"?k.Color.fromHex(j):Z.getColor(j.id)}}e.ModelDecorationMinimapOptions=re;class de{static from(j){return j instanceof de?j:new de(j)}constructor(j){this.content=j.content||"",this.inlineClassName=j.inlineClassName||null,this.inlineClassNameAffectsLetterSpacing=j.inlineClassNameAffectsLetterSpacing||!1,this.attachedData=j.attachedData||null,this.cursorStops=j.cursorStops||null}}e.ModelDecorationInjectedTextOptions=de;class he{static register(j){return new he(j)}static createDynamic(j){return new he(j)}constructor(j){var Z,ee,le,ue,ce,pe;this.description=j.description,this.blockClassName=j.blockClassName?ne(j.blockClassName):null,this.blockDoesNotCollapse=(Z=j.blockDoesNotCollapse)!==null&&Z!==void 0?Z:null,this.blockIsAfterEnd=(ee=j.blockIsAfterEnd)!==null&&ee!==void 0?ee:null,this.blockPadding=(le=j.blockPadding)!==null&&le!==void 0?le:null,this.stickiness=j.stickiness||0,this.zIndex=j.zIndex||0,this.className=j.className?ne(j.className):null,this.shouldFillLineOnLineBreak=(ue=j.shouldFillLineOnLineBreak)!==null&&ue!==void 0?ue:null,this.hoverMessage=j.hoverMessage||null,this.glyphMarginHoverMessage=j.glyphMarginHoverMessage||null,this.lineNumberHoverMessage=j.lineNumberHoverMessage||null,this.isWholeLine=j.isWholeLine||!1,this.showIfCollapsed=j.showIfCollapsed||!1,this.collapseOnReplaceEdit=j.collapseOnReplaceEdit||!1,this.overviewRuler=j.overviewRuler?new J(j.overviewRuler):null,this.minimap=j.minimap?new re(j.minimap):null,this.glyphMargin=j.glyphMarginClassName?new Q(j.glyphMargin):null,this.glyphMarginClassName=j.glyphMarginClassName?ne(j.glyphMarginClassName):null,this.linesDecorationsClassName=j.linesDecorationsClassName?ne(j.linesDecorationsClassName):null,this.lineNumberClassName=j.lineNumberClassName?ne(j.lineNumberClassName):null,this.linesDecorationsTooltip=j.linesDecorationsTooltip?p.htmlAttributeEncodeValue(j.linesDecorationsTooltip):null,this.firstLineDecorationClassName=j.firstLineDecorationClassName?ne(j.firstLineDecorationClassName):null,this.marginClassName=j.marginClassName?ne(j.marginClassName):null,this.inlineClassName=j.inlineClassName?ne(j.inlineClassName):null,this.inlineClassNameAffectsLetterSpacing=j.inlineClassNameAffectsLetterSpacing||!1,this.beforeContentClassName=j.beforeContentClassName?ne(j.beforeContentClassName):null,this.afterContentClassName=j.afterContentClassName?ne(j.afterContentClassName):null,this.after=j.after?de.from(j.after):null,this.before=j.before?de.from(j.before):null,this.hideInCommentTokens=(ce=j.hideInCommentTokens)!==null&&ce!==void 0?ce:!1,this.hideInStringTokens=(pe=j.hideInStringTokens)!==null&&pe!==void 0?pe:!1}}e.ModelDecorationOptions=he,he.EMPTY=he.register({description:"empty"});const me=[he.register({description:"tracked-range-always-grows-when-typing-at-edges",stickiness:0}),he.register({description:"tracked-range-never-grows-when-typing-at-edges",stickiness:1}),he.register({description:"tracked-range-grows-only-when-typing-before",stickiness:2}),he.register({description:"tracked-range-grows-only-when-typing-after",stickiness:3})];function X(Y){return Y instanceof he?Y:he.createDynamic(Y)}class U extends S.Disposable{constructor(j){super(),this.handleBeforeFire=j,this._actual=this._register(new E.Emitter),this.event=this._actual.event,this._affectedInjectedTextLines=null,this._deferredCnt=0,this._shouldFireDeferred=!1,this._affectsMinimap=!1,this._affectsOverviewRuler=!1,this._affectsGlyphMargin=!1,this._affectsLineNumber=!1}beginDeferredEmit(){this._deferredCnt++}endDeferredEmit(){var j;this._deferredCnt--,this._deferredCnt===0&&(this._shouldFireDeferred&&this.doFire(),(j=this._affectedInjectedTextLines)===null||j===void 0||j.clear(),this._affectedInjectedTextLines=null)}recordLineAffectedByInjectedText(j){this._affectedInjectedTextLines||(this._affectedInjectedTextLines=new Set),this._affectedInjectedTextLines.add(j)}checkAffectedAndFire(j){var Z,ee;this._affectsMinimap||(this._affectsMinimap=!!(!((Z=j.minimap)===null||Z===void 0)&&Z.position)),this._affectsOverviewRuler||(this._affectsOverviewRuler=!!(!((ee=j.overviewRuler)===null||ee===void 0)&&ee.color)),this._affectsGlyphMargin||(this._affectsGlyphMargin=!!j.glyphMarginClassName),this._affectsLineNumber||(this._affectsLineNumber=!!j.lineNumberClassName),this.tryFire()}fire(){this._affectsMinimap=!0,this._affectsOverviewRuler=!0,this._affectsGlyphMargin=!0,this.tryFire()}tryFire(){this._deferredCnt===0?this.doFire():this._shouldFireDeferred=!0}doFire(){this.handleBeforeFire(this._affectedInjectedTextLines);const j={affectsMinimap:this._affectsMinimap,affectsOverviewRuler:this._affectsOverviewRuler,affectsGlyphMargin:this._affectsGlyphMargin,affectsLineNumber:this._affectsLineNumber};this._shouldFireDeferred=!1,this._affectsMinimap=!1,this._affectsOverviewRuler=!1,this._affectsGlyphMargin=!1,this._actual.fire(j)}}class G extends S.Disposable{constructor(){super(),this._fastEmitter=this._register(new E.Emitter),this.fastEvent=this._fastEmitter.event,this._slowEmitter=this._register(new E.Emitter),this.slowEvent=this._slowEmitter.event,this._deferredCnt=0,this._deferredEvent=null}beginDeferredEmit(){this._deferredCnt++}endDeferredEmit(j=null){if(this._deferredCnt--,this._deferredCnt===0&&this._deferredEvent!==null){this._deferredEvent.rawContentChangedEvent.resultingSelection=j;const Z=this._deferredEvent;this._deferredEvent=null,this._fastEmitter.fire(Z),this._slowEmitter.fire(Z)}}fire(j){if(this._deferredCnt>0){this._deferredEvent?this._deferredEvent=this._deferredEvent.merge(j):this._deferredEvent=j;return}this._fastEmitter.fire(j),this._slowEmitter.fire(j)}}class z{constructor(){this._onDidChangeVisibleRanges=new E.Emitter,this.onDidChangeVisibleRanges=this._onDidChangeVisibleRanges.event,this._views=new Set}attachView(){const j=new H(Z=>{this._onDidChangeVisibleRanges.fire({view:j,state:Z})});return this._views.add(j),j}detachView(j){this._views.delete(j),this._onDidChangeVisibleRanges.fire({view:j,state:void 0})}}e.AttachedViews=z;class H{constructor(j){this.handleStateChange=j}setVisibleLines(j,Z){const ee=j.map(le=>new a.LineRange(le.startLineNumber,le.endLineNumber+1));this.handleStateChange({visibleLineRanges:ee,stabilized:Z})}}}),define(se[258],oe([1,0,26,28,38,631,29,82]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.diffDeleteDecorationEmpty=e.diffWholeLineDeleteDecoration=e.diffDeleteDecoration=e.diffAddDecorationEmpty=e.diffWholeLineAddDecoration=e.diffAddDecoration=e.diffLineDeleteDecorationBackground=e.diffLineAddDecorationBackground=e.diffLineDeleteDecorationBackgroundWithIndicator=e.diffLineAddDecorationBackgroundWithIndicator=e.diffRemoveIcon=e.diffInsertIcon=e.diffEditorUnchangedRegionShadow=e.diffMoveBorderActive=e.diffMoveBorder=void 0,e.diffMoveBorder=(0,S.registerColor)("diffEditor.move.border",{dark:"#8b8b8b9c",light:"#8b8b8b9c",hcDark:"#8b8b8b9c",hcLight:"#8b8b8b9c"},(0,E.localize)(0,null)),e.diffMoveBorderActive=(0,S.registerColor)("diffEditor.moveActive.border",{dark:"#FFA500",light:"#FFA500",hcDark:"#FFA500",hcLight:"#FFA500"},(0,E.localize)(1,null)),e.diffEditorUnchangedRegionShadow=(0,S.registerColor)("diffEditor.unchangedRegionShadow",{dark:"#000000",light:"#737373BF",hcDark:"#000000",hcLight:"#737373BF"},(0,E.localize)(2,null)),e.diffInsertIcon=(0,p.registerIcon)("diff-insert",L.Codicon.add,(0,E.localize)(3,null)),e.diffRemoveIcon=(0,p.registerIcon)("diff-remove",L.Codicon.remove,(0,E.localize)(4,null)),e.diffLineAddDecorationBackgroundWithIndicator=y.ModelDecorationOptions.register({className:"line-insert",description:"line-insert",isWholeLine:!0,linesDecorationsClassName:"insert-sign "+k.ThemeIcon.asClassName(e.diffInsertIcon),marginClassName:"gutter-insert"}),e.diffLineDeleteDecorationBackgroundWithIndicator=y.ModelDecorationOptions.register({className:"line-delete",description:"line-delete",isWholeLine:!0,linesDecorationsClassName:"delete-sign "+k.ThemeIcon.asClassName(e.diffRemoveIcon),marginClassName:"gutter-delete"}),e.diffLineAddDecorationBackground=y.ModelDecorationOptions.register({className:"line-insert",description:"line-insert",isWholeLine:!0,marginClassName:"gutter-insert"}),e.diffLineDeleteDecorationBackground=y.ModelDecorationOptions.register({className:"line-delete",description:"line-delete",isWholeLine:!0,marginClassName:"gutter-delete"}),e.diffAddDecoration=y.ModelDecorationOptions.register({className:"char-insert",description:"char-insert",shouldFillLineOnLineBreak:!0}),e.diffWholeLineAddDecoration=y.ModelDecorationOptions.register({className:"char-insert",description:"char-insert",isWholeLine:!0}),e.diffAddDecorationEmpty=y.ModelDecorationOptions.register({className:"char-insert diff-range-empty",description:"char-insert diff-range-empty"}),e.diffDeleteDecoration=y.ModelDecorationOptions.register({className:"char-delete",description:"char-delete",shouldFillLineOnLineBreak:!0}),e.diffWholeLineDeleteDecoration=y.ModelDecorationOptions.register({className:"char-delete",description:"char-delete",isWholeLine:!0}),e.diffDeleteDecorationEmpty=y.ModelDecorationOptions.register({className:"char-delete diff-range-empty",description:"char-delete diff-range-empty"})}),define(se[881],oe([1,0,2,35,334,258,87]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorDecorations=void 0;class p extends L.Disposable{constructor(v,b,a,i){super(),this._editors=v,this._diffModel=b,this._options=a,this._decorations=(0,k.derived)(this,n=>{var t;const r=(t=this._diffModel.read(n))===null||t===void 0?void 0:t.diff.read(n);if(!r)return null;const u=this._diffModel.read(n).movedTextToCompare.read(n),f=this._options.renderIndicators.read(n),c=this._options.showEmptyDecorations.read(n),d=[],s=[];if(!u)for(const o of r.mappings)if(o.lineRangeMapping.original.isEmpty||d.push({range:o.lineRangeMapping.original.toInclusiveRange(),options:f?E.diffLineDeleteDecorationBackgroundWithIndicator:E.diffLineDeleteDecorationBackground}),o.lineRangeMapping.modified.isEmpty||s.push({range:o.lineRangeMapping.modified.toInclusiveRange(),options:f?E.diffLineAddDecorationBackgroundWithIndicator:E.diffLineAddDecorationBackground}),o.lineRangeMapping.modified.isEmpty||o.lineRangeMapping.original.isEmpty)o.lineRangeMapping.original.isEmpty||d.push({range:o.lineRangeMapping.original.toInclusiveRange(),options:E.diffWholeLineDeleteDecoration}),o.lineRangeMapping.modified.isEmpty||s.push({range:o.lineRangeMapping.modified.toInclusiveRange(),options:E.diffWholeLineAddDecoration});else for(const g of o.lineRangeMapping.innerChanges||[])o.lineRangeMapping.original.contains(g.originalRange.startLineNumber)&&d.push({range:g.originalRange,options:g.originalRange.isEmpty()&&c?E.diffDeleteDecorationEmpty:E.diffDeleteDecoration}),o.lineRangeMapping.modified.contains(g.modifiedRange.startLineNumber)&&s.push({range:g.modifiedRange,options:g.modifiedRange.isEmpty()&&c?E.diffAddDecorationEmpty:E.diffAddDecoration});if(u)for(const o of u.changes){const g=o.original.toInclusiveRange();g&&d.push({range:g,options:f?E.diffLineDeleteDecorationBackgroundWithIndicator:E.diffLineDeleteDecorationBackground});const h=o.modified.toInclusiveRange();h&&s.push({range:h,options:f?E.diffLineAddDecorationBackgroundWithIndicator:E.diffLineAddDecorationBackground});for(const m of o.innerChanges||[])d.push({range:m.originalRange,options:E.diffDeleteDecoration}),s.push({range:m.modifiedRange,options:E.diffAddDecoration})}const l=this._diffModel.read(n).activeMovedText.read(n);for(const o of r.movedTexts)d.push({range:o.lineRangeMapping.original.toInclusiveRange(),options:{description:"moved",blockClassName:"movedOriginal"+(o===l?" currentMove":""),blockPadding:[y.MovedBlocksLinesFeature.movedCodeBlockPadding,0,y.MovedBlocksLinesFeature.movedCodeBlockPadding,y.MovedBlocksLinesFeature.movedCodeBlockPadding]}}),s.push({range:o.lineRangeMapping.modified.toInclusiveRange(),options:{description:"moved",blockClassName:"movedModified"+(o===l?" currentMove":""),blockPadding:[4,0,4,4]}});return{originalDecorations:d,modifiedDecorations:s}}),this._register((0,S.applyObservableDecorations)(this._editors.original,this._decorations.map(n=>n?.originalDecorations||[]))),this._register((0,S.applyObservableDecorations)(this._editors.modified,this._decorations.map(n=>n?.modifiedDecorations||[])))}}e.DiffEditorDecorations=p}),define(se[882],oe([1,0,7,13,14,26,2,35,28,20,72,258,359,625,648,87,62,10,86,103,59]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorViewZones=void 0;let l=class extends S.Disposable{constructor(m,C,w,D,I,T,A,P,N,M){super(),this._targetWindow=m,this._editors=C,this._diffModel=w,this._options=D,this._diffEditorWidget=I,this._canIgnoreViewZoneUpdateEvent=T,this._origViewZonesToIgnore=A,this._modViewZonesToIgnore=P,this._clipboardService=N,this._contextMenuService=M,this._originalTopPadding=(0,p.observableValue)(this,0),this._originalScrollOffset=(0,p.observableValue)(this,0),this._originalScrollOffsetAnimated=(0,r.animatedObservable)(this._targetWindow,this._originalScrollOffset,this._store),this._modifiedTopPadding=(0,p.observableValue)(this,0),this._modifiedScrollOffset=(0,p.observableValue)(this,0),this._modifiedScrollOffsetAnimated=(0,r.animatedObservable)(this._targetWindow,this._modifiedScrollOffset,this._store);const R=(0,p.observableValue)("invalidateAlignmentsState",0),x=this._register(new y.RunOnceScheduler(()=>{R.set(R.get()+1,void 0)},0));this._register(this._editors.original.onDidChangeViewZones(q=>{this._canIgnoreViewZoneUpdateEvent()||x.schedule()})),this._register(this._editors.modified.onDidChangeViewZones(q=>{this._canIgnoreViewZoneUpdateEvent()||x.schedule()})),this._register(this._editors.original.onDidChangeConfiguration(q=>{(q.hasChanged(144)||q.hasChanged(66))&&x.schedule()})),this._register(this._editors.modified.onDidChangeConfiguration(q=>{(q.hasChanged(144)||q.hasChanged(66))&&x.schedule()}));const O=this._diffModel.map(q=>q?(0,p.observableFromEvent)(q.model.original.onDidChangeTokens,()=>q.model.original.tokenization.backgroundTokenizationState===2):void 0).map((q,ie)=>q?.read(ie)),B=(0,p.derived)(q=>{const ie=this._diffModel.read(q),ae=ie?.diff.read(q);if(!ie||!ae)return null;R.read(q);const $=this._options.renderSideBySide.read(q);return o(this._editors.original,this._editors.modified,ae.mappings,this._origViewZonesToIgnore,this._modViewZonesToIgnore,$)}),W=(0,p.derived)(q=>{var ie;const ae=(ie=this._diffModel.read(q))===null||ie===void 0?void 0:ie.movedTextToCompare.read(q);if(!ae)return null;R.read(q);const ne=ae.changes.map($=>new i.DiffMapping($));return o(this._editors.original,this._editors.modified,ne,this._origViewZonesToIgnore,this._modViewZonesToIgnore,!0)});function V(){const q=document.createElement("div");return q.className="diagonal-fill",q}const K=this._register(new S.DisposableStore);this.viewZones=(0,p.derivedWithStore)(this,(q,ie)=>{var ae,ne,$,J,Q,re,de,he;K.clear();const me=B.read(q)||[],X=[],U=[],G=this._modifiedTopPadding.read(q);G>0&&U.push({afterLineNumber:0,domNode:document.createElement("div"),heightInPx:G,showInHiddenAreas:!0,suppressMouseDown:!0});const z=this._originalTopPadding.read(q);z>0&&X.push({afterLineNumber:0,domNode:document.createElement("div"),heightInPx:z,showInHiddenAreas:!0,suppressMouseDown:!0});const H=this._options.renderSideBySide.read(q),Y=H||(ae=this._editors.modified._getViewModel())===null||ae===void 0?void 0:ae.createLineBreaksComputer();if(Y){const ve=this._editors.original.getModel();for(const Ce of me)if(Ce.diff)for(let Se=Ce.originalRange.startLineNumber;Se<Ce.originalRange.endLineNumberExclusive;Se++){if(Se>ve.getLineCount())return{orig:X,mod:U};Y?.addRequest(ve.getLineContent(Se),null,null)}}const j=(ne=Y?.finalize())!==null&&ne!==void 0?ne:[];let Z=0;const ee=this._editors.modified.getOption(66),le=($=this._diffModel.read(q))===null||$===void 0?void 0:$.movedTextToCompare.read(q),ue=(Q=(J=this._editors.original.getModel())===null||J===void 0?void 0:J.mightContainNonBasicASCII())!==null&&Q!==void 0?Q:!1,ce=(de=(re=this._editors.original.getModel())===null||re===void 0?void 0:re.mightContainRTL())!==null&&de!==void 0?de:!1,pe=t.RenderOptions.fromEditor(this._editors.modified);for(const ve of me)if(ve.diff&&!H){if(!ve.originalRange.isEmpty){O.read(q);const Se=document.createElement("div");Se.classList.add("view-lines","line-delete","monaco-mouse-cursor-text");const _e=this._editors.original.getModel();if(ve.originalRange.endLineNumberExclusive-1>_e.getLineCount())return{orig:X,mod:U};const Ee=new t.LineSource(ve.originalRange.mapToLineArray(Ie=>_e.tokenization.getLineTokens(Ie)),ve.originalRange.mapToLineArray(Ie=>j[Z++]),ue,ce),Ae=[];for(const Ie of ve.diff.innerChanges||[])Ae.push(new c.InlineDecoration(Ie.originalRange.delta(-(ve.diff.original.startLineNumber-1)),a.diffDeleteDecoration.className,0));const xe=(0,t.renderLines)(Ee,pe,Ae,Se),Be=document.createElement("div");if(Be.className="inline-deleted-margin-view-zone",(0,b.applyFontInfo)(Be,pe.fontInfo),this._options.renderIndicators.read(q))for(let Ie=0;Ie<xe.heightInLines;Ie++){const fe=document.createElement("div");fe.className=`delete-sign ${_.ThemeIcon.asClassName(a.diffRemoveIcon)}`,fe.setAttribute("style",`position:absolute;top:${Ie*ee}px;width:${pe.lineDecorationsWidth}px;height:${ee}px;right:0;`),Be.appendChild(fe)}let De;K.add(new n.InlineDiffDeletedCodeMargin(()=>(0,v.assertIsDefined)(De),Be,this._editors.modified,ve.diff,this._diffEditorWidget,xe.viewLineCounts,this._editors.original.getModel(),this._contextMenuService,this._clipboardService));for(let Ie=0;Ie<xe.viewLineCounts.length;Ie++){const fe=xe.viewLineCounts[Ie];fe>1&&X.push({afterLineNumber:ve.originalRange.startLineNumber+Ie,domNode:V(),heightInPx:(fe-1)*ee,showInHiddenAreas:!0,suppressMouseDown:!0})}U.push({afterLineNumber:ve.modifiedRange.startLineNumber-1,domNode:Se,heightInPx:xe.heightInLines*ee,minWidthInPx:xe.minWidthInPx,marginDomNode:Be,setZoneId(Ie){De=Ie},showInHiddenAreas:!0,suppressMouseDown:!0})}const Ce=document.createElement("div");Ce.className="gutter-delete",X.push({afterLineNumber:ve.originalRange.endLineNumberExclusive-1,domNode:V(),heightInPx:ve.modifiedHeightInPx,marginDomNode:Ce,showInHiddenAreas:!0,suppressMouseDown:!0})}else{const Ce=ve.modifiedHeightInPx-ve.originalHeightInPx;if(Ce>0){if(le?.lineRangeMapping.original.delta(-1).deltaLength(2).contains(ve.originalRange.endLineNumberExclusive-1))continue;X.push({afterLineNumber:ve.originalRange.endLineNumberExclusive-1,domNode:V(),heightInPx:Ce,showInHiddenAreas:!0,suppressMouseDown:!0})}else{let Se=function(){const Ee=document.createElement("div");return Ee.className="arrow-revert-change "+_.ThemeIcon.asClassName(E.Codicon.arrowRight),ie.add((0,L.addDisposableListener)(Ee,"mousedown",Ae=>Ae.stopPropagation())),ie.add((0,L.addDisposableListener)(Ee,"click",Ae=>{Ae.stopPropagation(),I.revert(ve.diff)})),(0,L.$)("div",{},Ee)};if(le?.lineRangeMapping.modified.delta(-1).deltaLength(2).contains(ve.modifiedRange.endLineNumberExclusive-1))continue;let _e;ve.diff&&ve.diff.modified.isEmpty&&this._options.shouldRenderRevertArrows.read(q)&&(_e=Se()),U.push({afterLineNumber:ve.modifiedRange.endLineNumberExclusive-1,domNode:V(),heightInPx:-Ce,marginDomNode:_e,showInHiddenAreas:!0,suppressMouseDown:!0})}}for(const ve of(he=W.read(q))!==null&&he!==void 0?he:[]){if(!le?.lineRangeMapping.original.intersect(ve.originalRange)||!le?.lineRangeMapping.modified.intersect(ve.modifiedRange))continue;const Ce=ve.modifiedHeightInPx-ve.originalHeightInPx;Ce>0?X.push({afterLineNumber:ve.originalRange.endLineNumberExclusive-1,domNode:V(),heightInPx:Ce,showInHiddenAreas:!0,suppressMouseDown:!0}):U.push({afterLineNumber:ve.modifiedRange.endLineNumberExclusive-1,domNode:V(),heightInPx:-Ce,showInHiddenAreas:!0,suppressMouseDown:!0})}return{orig:X,mod:U}});let F=!1;this._register(this._editors.original.onDidScrollChange(q=>{q.scrollLeftChanged&&!F&&(F=!0,this._editors.modified.setScrollLeft(q.scrollLeft),F=!1)})),this._register(this._editors.modified.onDidScrollChange(q=>{q.scrollLeftChanged&&!F&&(F=!0,this._editors.original.setScrollLeft(q.scrollLeft),F=!1)})),this._originalScrollTop=(0,p.observableFromEvent)(this._editors.original.onDidScrollChange,()=>this._editors.original.getScrollTop()),this._modifiedScrollTop=(0,p.observableFromEvent)(this._editors.modified.onDidScrollChange,()=>this._editors.modified.getScrollTop()),this._register((0,p.autorun)(q=>{const ie=this._originalScrollTop.read(q)-(this._originalScrollOffsetAnimated.get()-this._modifiedScrollOffsetAnimated.read(q))-(this._originalTopPadding.get()-this._modifiedTopPadding.read(q));ie!==this._editors.modified.getScrollTop()&&this._editors.modified.setScrollTop(ie,1)})),this._register((0,p.autorun)(q=>{const ie=this._modifiedScrollTop.read(q)-(this._modifiedScrollOffsetAnimated.get()-this._originalScrollOffsetAnimated.read(q))-(this._modifiedTopPadding.get()-this._originalTopPadding.read(q));ie!==this._editors.original.getScrollTop()&&this._editors.original.setScrollTop(ie,1)})),this._register((0,p.autorun)(q=>{var ie;const ae=(ie=this._diffModel.read(q))===null||ie===void 0?void 0:ie.movedTextToCompare.read(q);let ne=0;if(ae){const $=this._editors.original.getTopForLineNumber(ae.lineRangeMapping.original.startLineNumber,!0)-this._originalTopPadding.get();ne=this._editors.modified.getTopForLineNumber(ae.lineRangeMapping.modified.startLineNumber,!0)-this._modifiedTopPadding.get()-$}ne>0?(this._modifiedTopPadding.set(0,void 0),this._originalTopPadding.set(ne,void 0)):ne<0?(this._modifiedTopPadding.set(-ne,void 0),this._originalTopPadding.set(0,void 0)):setTimeout(()=>{this._modifiedTopPadding.set(0,void 0),this._originalTopPadding.set(0,void 0)},400),this._editors.modified.hasTextFocus()?this._originalScrollOffset.set(this._modifiedScrollOffset.get()-ne,void 0,!0):this._modifiedScrollOffset.set(this._originalScrollOffset.get()+ne,void 0,!0)}))}};e.DiffEditorViewZones=l,e.DiffEditorViewZones=l=ke([ge(8,d.IClipboardService),ge(9,s.IContextMenuService)],l);function o(h,m,C,w,D,I){const T=new k.ArrayQueue(g(h,w)),A=new k.ArrayQueue(g(m,D)),P=h.getOption(66),N=m.getOption(66),M=[];let R=0,x=0;function O(B,W){for(;;){let V=T.peek(),K=A.peek();if(V&&V.lineNumber>=B&&(V=void 0),K&&K.lineNumber>=W&&(K=void 0),!V&&!K)break;const F=V?V.lineNumber-R:Number.MAX_VALUE,q=K?K.lineNumber-x:Number.MAX_VALUE;F<q?(T.dequeue(),K={lineNumber:V.lineNumber-R+x,heightInPx:0}):F>q?(A.dequeue(),V={lineNumber:K.lineNumber-x+R,heightInPx:0}):(T.dequeue(),A.dequeue()),M.push({originalRange:u.LineRange.ofLength(V.lineNumber,1),modifiedRange:u.LineRange.ofLength(K.lineNumber,1),originalHeightInPx:P+V.heightInPx,modifiedHeightInPx:N+K.heightInPx,diff:void 0})}}for(const B of C){let q=function(ie,ae){var ne,$,J,Q;if(ie<F||ae<K)return;if(V)V=!1;else if(ie===F||ae===K)return;const re=new u.LineRange(F,ie),de=new u.LineRange(K,ae);if(re.isEmpty&&de.isEmpty)return;const he=($=(ne=T.takeWhile(X=>X.lineNumber<ie))===null||ne===void 0?void 0:ne.reduce((X,U)=>X+U.heightInPx,0))!==null&&$!==void 0?$:0,me=(Q=(J=A.takeWhile(X=>X.lineNumber<ae))===null||J===void 0?void 0:J.reduce((X,U)=>X+U.heightInPx,0))!==null&&Q!==void 0?Q:0;M.push({originalRange:re,modifiedRange:de,originalHeightInPx:re.length*P+he,modifiedHeightInPx:de.length*N+me,diff:B.lineRangeMapping}),F=ie,K=ae};const W=B.lineRangeMapping;O(W.original.startLineNumber,W.modified.startLineNumber);let V=!0,K=W.modified.startLineNumber,F=W.original.startLineNumber;if(I)for(const ie of W.innerChanges||[]){ie.originalRange.startColumn>1&&ie.modifiedRange.startColumn>1&&q(ie.originalRange.startLineNumber,ie.modifiedRange.startLineNumber);const ae=h.getModel(),ne=ie.originalRange.endLineNumber<=ae.getLineCount()?ae.getLineMaxColumn(ie.originalRange.endLineNumber):Number.MAX_SAFE_INTEGER;ie.originalRange.endColumn<ne&&q(ie.originalRange.endLineNumber,ie.modifiedRange.endLineNumber)}q(W.original.endLineNumberExclusive,W.modified.endLineNumberExclusive),R=W.original.endLineNumberExclusive,x=W.modified.endLineNumberExclusive}return O(Number.MAX_VALUE,Number.MAX_VALUE),M}function g(h,m){const C=[],w=[],D=h.getOption(144).wrappingColumn!==-1,I=h._getViewModel().coordinatesConverter,T=h.getOption(66);if(D)for(let P=1;P<=h.getModel().getLineCount();P++){const N=I.getModelLineViewLineCount(P);N>1&&w.push({lineNumber:P,heightInPx:T*(N-1)})}for(const P of h.getWhitespaces()){if(m.has(P.id))continue;const N=P.afterLineNumber===0?0:I.convertViewPositionToModelPosition(new f.Position(P.afterLineNumber,1)).lineNumber;C.push({lineNumber:N,heightInPx:P.height})}return(0,r.joinCombine)(C,w,P=>P.lineNumber,(P,N)=>({lineNumber:P.lineNumber,heightInPx:P.heightInPx+N.heightInPx}))}}),define(se[883],oe([1,0,6,2,17,38,179,80,43,189,27,193,111,340,47,55,32]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u){"use strict";var f;Object.defineProperty(e,"__esModule",{value:!0}),e.DefaultModelSHA1Computer=e.ModelService=void 0;function c(h){return h.toString()}class d{constructor(m,C,w){this.model=m,this._modelEventListeners=new k.DisposableStore,this.model=m,this._modelEventListeners.add(m.onWillDispose(()=>C(m))),this._modelEventListeners.add(m.onDidChangeLanguage(D=>w(m,D)))}dispose(){this._modelEventListeners.dispose()}}const s=y.isLinux||y.isMacintosh?1:2;class l{constructor(m,C,w,D,I,T,A,P){this.uri=m,this.initialUndoRedoSnapshot=C,this.time=w,this.sharesUndoRedoStack=D,this.heapSize=I,this.sha1=T,this.versionId=A,this.alternativeVersionId=P}}let o=f=class extends k.Disposable{constructor(m,C,w,D,I){super(),this._configurationService=m,this._resourcePropertiesService=C,this._undoRedoService=w,this._languageService=D,this._languageConfigurationService=I,this._onModelAdded=this._register(new L.Emitter),this.onModelAdded=this._onModelAdded.event,this._onModelRemoved=this._register(new L.Emitter),this.onModelRemoved=this._onModelRemoved.event,this._onModelModeChanged=this._register(new L.Emitter),this.onModelLanguageChanged=this._onModelModeChanged.event,this._modelCreationOptionsByLanguageAndResource=Object.create(null),this._models={},this._disposedModels=new Map,this._disposedModelsHeapSize=0,this._register(this._configurationService.onDidChangeConfiguration(T=>this._updateModelOptions(T))),this._updateModelOptions(void 0)}static _readModelOptions(m,C){var w;let D=S.EDITOR_MODEL_DEFAULTS.tabSize;if(m.editor&&typeof m.editor.tabSize<"u"){const O=parseInt(m.editor.tabSize,10);isNaN(O)||(D=O),D<1&&(D=1)}let I="tabSize";if(m.editor&&typeof m.editor.indentSize<"u"&&m.editor.indentSize!=="tabSize"){const O=parseInt(m.editor.indentSize,10);isNaN(O)||(I=Math.max(O,1))}let T=S.EDITOR_MODEL_DEFAULTS.insertSpaces;m.editor&&typeof m.editor.insertSpaces<"u"&&(T=m.editor.insertSpaces==="false"?!1:!!m.editor.insertSpaces);let A=s;const P=m.eol;P===`\r
+`?A=2:P===`
+`&&(A=1);let N=S.EDITOR_MODEL_DEFAULTS.trimAutoWhitespace;m.editor&&typeof m.editor.trimAutoWhitespace<"u"&&(N=m.editor.trimAutoWhitespace==="false"?!1:!!m.editor.trimAutoWhitespace);let M=S.EDITOR_MODEL_DEFAULTS.detectIndentation;m.editor&&typeof m.editor.detectIndentation<"u"&&(M=m.editor.detectIndentation==="false"?!1:!!m.editor.detectIndentation);let R=S.EDITOR_MODEL_DEFAULTS.largeFileOptimizations;m.editor&&typeof m.editor.largeFileOptimizations<"u"&&(R=m.editor.largeFileOptimizations==="false"?!1:!!m.editor.largeFileOptimizations);let x=S.EDITOR_MODEL_DEFAULTS.bracketPairColorizationOptions;return!((w=m.editor)===null||w===void 0)&&w.bracketPairColorization&&typeof m.editor.bracketPairColorization=="object"&&(x={enabled:!!m.editor.bracketPairColorization.enabled,independentColorPoolPerBracketType:!!m.editor.bracketPairColorization.independentColorPoolPerBracketType}),{isForSimpleWidget:C,tabSize:D,indentSize:I,insertSpaces:T,detectIndentation:M,defaultEOL:A,trimAutoWhitespace:N,largeFileOptimizations:R,bracketPairColorizationOptions:x}}_getEOL(m,C){if(m)return this._resourcePropertiesService.getEOL(m,C);const w=this._configurationService.getValue("files.eol",{overrideIdentifier:C});return w&&typeof w=="string"&&w!=="auto"?w:y.OS===3||y.OS===2?`
+`:`\r
+`}_shouldRestoreUndoStack(){const m=this._configurationService.getValue("files.restoreUndoStack");return typeof m=="boolean"?m:!0}getCreationOptions(m,C,w){const D=typeof m=="string"?m:m.languageId;let I=this._modelCreationOptionsByLanguageAndResource[D+C];if(!I){const T=this._configurationService.getValue("editor",{overrideIdentifier:D,resource:C}),A=this._getEOL(C,D);I=f._readModelOptions({editor:T,eol:A},w),this._modelCreationOptionsByLanguageAndResource[D+C]=I}return I}_updateModelOptions(m){const C=this._modelCreationOptionsByLanguageAndResource;this._modelCreationOptionsByLanguageAndResource=Object.create(null);const w=Object.keys(this._models);for(let D=0,I=w.length;D<I;D++){const T=w[D],A=this._models[T],P=A.model.getLanguageId(),N=A.model.uri;if(m&&!m.affectsConfiguration("editor",{overrideIdentifier:P,resource:N})&&!m.affectsConfiguration("files.eol",{overrideIdentifier:P,resource:N}))continue;const M=C[P+N],R=this.getCreationOptions(P,N,A.model.isForSimpleWidget);f._setModelOptionsForModel(A.model,R,M)}}static _setModelOptionsForModel(m,C,w){w&&w.defaultEOL!==C.defaultEOL&&m.getLineCount()===1&&m.setEOL(C.defaultEOL===1?0:1),!(w&&w.detectIndentation===C.detectIndentation&&w.insertSpaces===C.insertSpaces&&w.tabSize===C.tabSize&&w.indentSize===C.indentSize&&w.trimAutoWhitespace===C.trimAutoWhitespace&&(0,r.equals)(w.bracketPairColorizationOptions,C.bracketPairColorizationOptions))&&(C.detectIndentation?(m.detectIndentation(C.insertSpaces,C.tabSize),m.updateOptions({trimAutoWhitespace:C.trimAutoWhitespace,bracketColorizationOptions:C.bracketPairColorizationOptions})):m.updateOptions({insertSpaces:C.insertSpaces,tabSize:C.tabSize,indentSize:C.indentSize,trimAutoWhitespace:C.trimAutoWhitespace,bracketColorizationOptions:C.bracketPairColorizationOptions}))}_insertDisposedModel(m){this._disposedModels.set(c(m.uri),m),this._disposedModelsHeapSize+=m.heapSize}_removeDisposedModel(m){const C=this._disposedModels.get(c(m));return C&&(this._disposedModelsHeapSize-=C.heapSize),this._disposedModels.delete(c(m)),C}_ensureDisposedModelsHeapSize(m){if(this._disposedModelsHeapSize>m){const C=[];for(this._disposedModels.forEach(w=>{w.sharesUndoRedoStack||C.push(w)}),C.sort((w,D)=>w.time-D.time);C.length>0&&this._disposedModelsHeapSize>m;){const w=C.shift();this._removeDisposedModel(w.uri),w.initialUndoRedoSnapshot!==null&&this._undoRedoService.restoreSnapshot(w.initialUndoRedoSnapshot)}}}_createModelData(m,C,w,D){const I=this.getCreationOptions(C,w,D),T=new E.TextModel(m,C,I,w,this._undoRedoService,this._languageService,this._languageConfigurationService);if(w&&this._disposedModels.has(c(w))){const N=this._removeDisposedModel(w),M=this._undoRedoService.getElements(w),R=this._getSHA1Computer(),x=R.canComputeSHA1(T)?R.computeSHA1(T)===N.sha1:!1;if(x||N.sharesUndoRedoStack){for(const O of M.past)(0,n.isEditStackElement)(O)&&O.matchesResource(w)&&O.setModel(T);for(const O of M.future)(0,n.isEditStackElement)(O)&&O.matchesResource(w)&&O.setModel(T);this._undoRedoService.setElementsValidFlag(w,!0,O=>(0,n.isEditStackElement)(O)&&O.matchesResource(w)),x&&(T._overwriteVersionId(N.versionId),T._overwriteAlternativeVersionId(N.alternativeVersionId),T._overwriteInitialUndoRedoSnapshot(N.initialUndoRedoSnapshot))}else N.initialUndoRedoSnapshot!==null&&this._undoRedoService.restoreSnapshot(N.initialUndoRedoSnapshot)}const A=c(T.uri);if(this._models[A])throw new Error("ModelService: Cannot add model because it already exists!");const P=new d(T,N=>this._onWillDispose(N),(N,M)=>this._onDidChangeLanguage(N,M));return this._models[A]=P,P}createModel(m,C,w,D=!1){let I;return C?I=this._createModelData(m,C,w,D):I=this._createModelData(m,p.PLAINTEXT_LANGUAGE_ID,w,D),this._onModelAdded.fire(I.model),I.model}getModels(){const m=[],C=Object.keys(this._models);for(let w=0,D=C.length;w<D;w++){const I=C[w];m.push(this._models[I].model)}return m}getModel(m){const C=c(m),w=this._models[C];return w?w.model:null}_schemaShouldMaintainUndoRedoElements(m){return m.scheme===t.Schemas.file||m.scheme===t.Schemas.vscodeRemote||m.scheme===t.Schemas.vscodeUserData||m.scheme===t.Schemas.vscodeNotebookCell||m.scheme==="fake-fs"}_onWillDispose(m){const C=c(m.uri),w=this._models[C],D=this._undoRedoService.getUriComparisonKey(m.uri)!==m.uri.toString();let I=!1,T=0;if(D||this._shouldRestoreUndoStack()&&this._schemaShouldMaintainUndoRedoElements(m.uri)){const N=this._undoRedoService.getElements(m.uri);if(N.past.length>0||N.future.length>0){for(const M of N.past)(0,n.isEditStackElement)(M)&&M.matchesResource(m.uri)&&(I=!0,T+=M.heapSize(m.uri),M.setModel(m.uri));for(const M of N.future)(0,n.isEditStackElement)(M)&&M.matchesResource(m.uri)&&(I=!0,T+=M.heapSize(m.uri),M.setModel(m.uri))}}const A=f.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK,P=this._getSHA1Computer();if(I)if(!D&&(T>A||!P.canComputeSHA1(m))){const N=w.model.getInitialUndoRedoSnapshot();N!==null&&this._undoRedoService.restoreSnapshot(N)}else this._ensureDisposedModelsHeapSize(A-T),this._undoRedoService.setElementsValidFlag(m.uri,!1,N=>(0,n.isEditStackElement)(N)&&N.matchesResource(m.uri)),this._insertDisposedModel(new l(m.uri,w.model.getInitialUndoRedoSnapshot(),Date.now(),D,T,P.computeSHA1(m),m.getVersionId(),m.getAlternativeVersionId()));else if(!D){const N=w.model.getInitialUndoRedoSnapshot();N!==null&&this._undoRedoService.restoreSnapshot(N)}delete this._models[C],w.dispose(),delete this._modelCreationOptionsByLanguageAndResource[m.getLanguageId()+m.uri],this._onModelRemoved.fire(m)}_onDidChangeLanguage(m,C){const w=C.oldLanguage,D=m.getLanguageId(),I=this.getCreationOptions(w,m.uri,m.isForSimpleWidget),T=this.getCreationOptions(D,m.uri,m.isForSimpleWidget);f._setModelOptionsForModel(m,T,I),this._onModelModeChanged.fire({model:m,oldLanguageId:w})}_getSHA1Computer(){return new g}};e.ModelService=o,o.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK=20*1024*1024,e.ModelService=o=f=ke([ge(0,b.IConfigurationService),ge(1,v.ITextResourcePropertiesService),ge(2,a.IUndoRedoService),ge(3,_.ILanguageService),ge(4,u.ILanguageConfigurationService)],o);class g{canComputeSHA1(m){return m.getValueLength()<=g.MAX_MODEL_SIZE}computeSHA1(m){const C=new i.StringSHA1,w=m.createSnapshot();let D;for(;D=w.read();)C.update(D);return C.digest()}}e.DefaultModelSHA1Computer=g,g.MAX_MODEL_SIZE=10*1024*1024}),define(se[884],oe([1,0,13,10,5,212,38,114,214,547,291,86]),function(te,e,L,k,y,E,S,p,_,v,b,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewModelLinesFromModelAsIs=e.ViewModelLinesFromProjectedModel=void 0;class i{constructor(s,l,o,g,h,m,C,w,D,I){this._editorId=s,this.model=l,this._validModelVersionId=-1,this._domLineBreaksComputerFactory=o,this._monospaceLineBreaksComputerFactory=g,this.fontInfo=h,this.tabSize=m,this.wrappingStrategy=C,this.wrappingColumn=w,this.wrappingIndent=D,this.wordBreak=I,this._constructLines(!0,null)}dispose(){this.hiddenAreasDecorationIds=this.model.deltaDecorations(this.hiddenAreasDecorationIds,[])}createCoordinatesConverter(){return new u(this)}_constructLines(s,l){this.modelLineProjections=[],s&&(this.hiddenAreasDecorationIds=this.model.deltaDecorations(this.hiddenAreasDecorationIds,[]));const o=this.model.getLinesContent(),g=this.model.getInjectedTextDecorations(this._editorId),h=o.length,m=this.createLineBreaksComputer(),C=new L.ArrayQueue(p.LineInjectedText.fromDecorations(g));for(let M=0;M<h;M++){const R=C.takeWhile(x=>x.lineNumber===M+1);m.addRequest(o[M],R,l?l[M]:null)}const w=m.finalize(),D=[],I=this.hiddenAreasDecorationIds.map(M=>this.model.getDecorationRange(M)).sort(y.Range.compareRangesUsingStarts);let T=1,A=0,P=-1,N=P+1<I.length?A+1:h+2;for(let M=0;M<h;M++){const R=M+1;R===N&&(P++,T=I[P].startLineNumber,A=I[P].endLineNumber,N=P+1<I.length?A+1:h+2);const x=R>=T&&R<=A,O=(0,v.createModelLineProjection)(w[M],!x);D[M]=O.getViewLineCount(),this.modelLineProjections[M]=O}this._validModelVersionId=this.model.getVersionId(),this.projectedModelLineLineCounts=new b.ConstantTimePrefixSumComputer(D)}getHiddenAreas(){return this.hiddenAreasDecorationIds.map(s=>this.model.getDecorationRange(s))}setHiddenAreas(s){const l=s.map(A=>this.model.validateRange(A)),o=n(l),g=this.hiddenAreasDecorationIds.map(A=>this.model.getDecorationRange(A)).sort(y.Range.compareRangesUsingStarts);if(o.length===g.length){let A=!1;for(let P=0;P<o.length;P++)if(!o[P].equalsRange(g[P])){A=!0;break}if(!A)return!1}const h=o.map(A=>({range:A,options:S.ModelDecorationOptions.EMPTY}));this.hiddenAreasDecorationIds=this.model.deltaDecorations(this.hiddenAreasDecorationIds,h);const m=o;let C=1,w=0,D=-1,I=D+1<m.length?w+1:this.modelLineProjections.length+2,T=!1;for(let A=0;A<this.modelLineProjections.length;A++){const P=A+1;P===I&&(D++,C=m[D].startLineNumber,w=m[D].endLineNumber,I=D+1<m.length?w+1:this.modelLineProjections.length+2);let N=!1;if(P>=C&&P<=w?this.modelLineProjections[A].isVisible()&&(this.modelLineProjections[A]=this.modelLineProjections[A].setVisible(!1),N=!0):(T=!0,this.modelLineProjections[A].isVisible()||(this.modelLineProjections[A]=this.modelLineProjections[A].setVisible(!0),N=!0)),N){const M=this.modelLineProjections[A].getViewLineCount();this.projectedModelLineLineCounts.setValue(A,M)}}return T||this.setHiddenAreas([]),!0}modelPositionIsVisible(s,l){return s<1||s>this.modelLineProjections.length?!1:this.modelLineProjections[s-1].isVisible()}getModelLineViewLineCount(s){return s<1||s>this.modelLineProjections.length?1:this.modelLineProjections[s-1].getViewLineCount()}setTabSize(s){return this.tabSize===s?!1:(this.tabSize=s,this._constructLines(!1,null),!0)}setWrappingSettings(s,l,o,g,h){const m=this.fontInfo.equals(s),C=this.wrappingStrategy===l,w=this.wrappingColumn===o,D=this.wrappingIndent===g,I=this.wordBreak===h;if(m&&C&&w&&D&&I)return!1;const T=m&&C&&!w&&D&&I;this.fontInfo=s,this.wrappingStrategy=l,this.wrappingColumn=o,this.wrappingIndent=g,this.wordBreak=h;let A=null;if(T){A=[];for(let P=0,N=this.modelLineProjections.length;P<N;P++)A[P]=this.modelLineProjections[P].getProjectionData()}return this._constructLines(!1,A),!0}createLineBreaksComputer(){return(this.wrappingStrategy==="advanced"?this._domLineBreaksComputerFactory:this._monospaceLineBreaksComputerFactory).createLineBreaksComputer(this.fontInfo,this.tabSize,this.wrappingColumn,this.wrappingIndent,this.wordBreak)}onModelFlushed(){this._constructLines(!0,null)}onModelLinesDeleted(s,l,o){if(!s||s<=this._validModelVersionId)return null;const g=l===1?1:this.projectedModelLineLineCounts.getPrefixSum(l-1)+1,h=this.projectedModelLineLineCounts.getPrefixSum(o);return this.modelLineProjections.splice(l-1,o-l+1),this.projectedModelLineLineCounts.removeValues(l-1,o-l+1),new _.ViewLinesDeletedEvent(g,h)}onModelLinesInserted(s,l,o,g){if(!s||s<=this._validModelVersionId)return null;const h=l>2&&!this.modelLineProjections[l-2].isVisible(),m=l===1?1:this.projectedModelLineLineCounts.getPrefixSum(l-1)+1;let C=0;const w=[],D=[];for(let I=0,T=g.length;I<T;I++){const A=(0,v.createModelLineProjection)(g[I],!h);w.push(A);const P=A.getViewLineCount();C+=P,D[I]=P}return this.modelLineProjections=this.modelLineProjections.slice(0,l-1).concat(w).concat(this.modelLineProjections.slice(l-1)),this.projectedModelLineLineCounts.insertValues(l-1,D),new _.ViewLinesInsertedEvent(m,m+C-1)}onModelLineChanged(s,l,o){if(s!==null&&s<=this._validModelVersionId)return[!1,null,null,null];const g=l-1,h=this.modelLineProjections[g].getViewLineCount(),m=this.modelLineProjections[g].isVisible(),C=(0,v.createModelLineProjection)(o,m);this.modelLineProjections[g]=C;const w=this.modelLineProjections[g].getViewLineCount();let D=!1,I=0,T=-1,A=0,P=-1,N=0,M=-1;h>w?(I=this.projectedModelLineLineCounts.getPrefixSum(l-1)+1,T=I+w-1,N=T+1,M=N+(h-w)-1,D=!0):h<w?(I=this.projectedModelLineLineCounts.getPrefixSum(l-1)+1,T=I+h-1,A=T+1,P=A+(w-h)-1,D=!0):(I=this.projectedModelLineLineCounts.getPrefixSum(l-1)+1,T=I+w-1),this.projectedModelLineLineCounts.setValue(g,w);const R=I<=T?new _.ViewLinesChangedEvent(I,T-I+1):null,x=A<=P?new _.ViewLinesInsertedEvent(A,P):null,O=N<=M?new _.ViewLinesDeletedEvent(N,M):null;return[D,R,x,O]}acceptVersionId(s){this._validModelVersionId=s,this.modelLineProjections.length===1&&!this.modelLineProjections[0].isVisible()&&this.setHiddenAreas([])}getViewLineCount(){return this.projectedModelLineLineCounts.getTotalSum()}_toValidViewLineNumber(s){if(s<1)return 1;const l=this.getViewLineCount();return s>l?l:s|0}getActiveIndentGuide(s,l,o){s=this._toValidViewLineNumber(s),l=this._toValidViewLineNumber(l),o=this._toValidViewLineNumber(o);const g=this.convertViewPositionToModelPosition(s,this.getViewLineMinColumn(s)),h=this.convertViewPositionToModelPosition(l,this.getViewLineMinColumn(l)),m=this.convertViewPositionToModelPosition(o,this.getViewLineMinColumn(o)),C=this.model.guides.getActiveIndentGuide(g.lineNumber,h.lineNumber,m.lineNumber),w=this.convertModelPositionToViewPosition(C.startLineNumber,1),D=this.convertModelPositionToViewPosition(C.endLineNumber,this.model.getLineMaxColumn(C.endLineNumber));return{startLineNumber:w.lineNumber,endLineNumber:D.lineNumber,indent:C.indent}}getViewLineInfo(s){s=this._toValidViewLineNumber(s);const l=this.projectedModelLineLineCounts.getIndexOf(s-1),o=l.index,g=l.remainder;return new t(o+1,g)}getMinColumnOfViewLine(s){return this.modelLineProjections[s.modelLineNumber-1].getViewLineMinColumn(this.model,s.modelLineNumber,s.modelLineWrappedLineIdx)}getMaxColumnOfViewLine(s){return this.modelLineProjections[s.modelLineNumber-1].getViewLineMaxColumn(this.model,s.modelLineNumber,s.modelLineWrappedLineIdx)}getModelStartPositionOfViewLine(s){const l=this.modelLineProjections[s.modelLineNumber-1],o=l.getViewLineMinColumn(this.model,s.modelLineNumber,s.modelLineWrappedLineIdx),g=l.getModelColumnOfViewPosition(s.modelLineWrappedLineIdx,o);return new k.Position(s.modelLineNumber,g)}getModelEndPositionOfViewLine(s){const l=this.modelLineProjections[s.modelLineNumber-1],o=l.getViewLineMaxColumn(this.model,s.modelLineNumber,s.modelLineWrappedLineIdx),g=l.getModelColumnOfViewPosition(s.modelLineWrappedLineIdx,o);return new k.Position(s.modelLineNumber,g)}getViewLineInfosGroupedByModelRanges(s,l){const o=this.getViewLineInfo(s),g=this.getViewLineInfo(l),h=new Array;let m=this.getModelStartPositionOfViewLine(o),C=new Array;for(let w=o.modelLineNumber;w<=g.modelLineNumber;w++){const D=this.modelLineProjections[w-1];if(D.isVisible()){const I=w===o.modelLineNumber?o.modelLineWrappedLineIdx:0,T=w===g.modelLineNumber?g.modelLineWrappedLineIdx+1:D.getViewLineCount();for(let A=I;A<T;A++)C.push(new t(w,A))}if(!D.isVisible()&&m){const I=new k.Position(w-1,this.model.getLineMaxColumn(w-1)+1),T=y.Range.fromPositions(m,I);h.push(new r(T,C)),C=[],m=null}else D.isVisible()&&!m&&(m=new k.Position(w,1))}if(m){const w=y.Range.fromPositions(m,this.getModelEndPositionOfViewLine(g));h.push(new r(w,C))}return h}getViewLinesBracketGuides(s,l,o,g){const h=o?this.convertViewPositionToModelPosition(o.lineNumber,o.column):null,m=[];for(const C of this.getViewLineInfosGroupedByModelRanges(s,l)){const w=C.modelRange.startLineNumber,D=this.model.guides.getLinesBracketGuides(w,C.modelRange.endLineNumber,h,g);for(const I of C.viewLines){const A=D[I.modelLineNumber-w].map(P=>{if(P.forWrappedLinesAfterColumn!==-1&&this.modelLineProjections[I.modelLineNumber-1].getViewPositionOfModelPosition(0,P.forWrappedLinesAfterColumn).lineNumber>=I.modelLineWrappedLineIdx||P.forWrappedLinesBeforeOrAtColumn!==-1&&this.modelLineProjections[I.modelLineNumber-1].getViewPositionOfModelPosition(0,P.forWrappedLinesBeforeOrAtColumn).lineNumber<I.modelLineWrappedLineIdx)return;if(!P.horizontalLine)return P;let N=-1;if(P.column!==-1){const x=this.modelLineProjections[I.modelLineNumber-1].getViewPositionOfModelPosition(0,P.column);if(x.lineNumber===I.modelLineWrappedLineIdx)N=x.column;else if(x.lineNumber<I.modelLineWrappedLineIdx)N=this.getMinColumnOfViewLine(I);else if(x.lineNumber>I.modelLineWrappedLineIdx)return}const M=this.convertModelPositionToViewPosition(I.modelLineNumber,P.horizontalLine.endColumn),R=this.modelLineProjections[I.modelLineNumber-1].getViewPositionOfModelPosition(0,P.horizontalLine.endColumn);return R.lineNumber===I.modelLineWrappedLineIdx?new E.IndentGuide(P.visibleColumn,N,P.className,new E.IndentGuideHorizontalLine(P.horizontalLine.top,M.column),-1,-1):R.lineNumber<I.modelLineWrappedLineIdx||P.visibleColumn!==-1?void 0:new E.IndentGuide(P.visibleColumn,N,P.className,new E.IndentGuideHorizontalLine(P.horizontalLine.top,this.getMaxColumnOfViewLine(I)),-1,-1)});m.push(A.filter(P=>!!P))}}return m}getViewLinesIndentGuides(s,l){s=this._toValidViewLineNumber(s),l=this._toValidViewLineNumber(l);const o=this.convertViewPositionToModelPosition(s,this.getViewLineMinColumn(s)),g=this.convertViewPositionToModelPosition(l,this.getViewLineMaxColumn(l));let h=[];const m=[],C=[],w=o.lineNumber-1,D=g.lineNumber-1;let I=null;for(let N=w;N<=D;N++){const M=this.modelLineProjections[N];if(M.isVisible()){const R=M.getViewLineNumberOfModelPosition(0,N===w?o.column:1),x=M.getViewLineNumberOfModelPosition(0,this.model.getLineMaxColumn(N+1)),O=x-R+1;let B=0;O>1&&M.getViewLineMinColumn(this.model,N+1,x)===1&&(B=R===0?1:2),m.push(O),C.push(B),I===null&&(I=new k.Position(N+1,0))}else I!==null&&(h=h.concat(this.model.guides.getLinesIndentGuides(I.lineNumber,N)),I=null)}I!==null&&(h=h.concat(this.model.guides.getLinesIndentGuides(I.lineNumber,g.lineNumber)),I=null);const T=l-s+1,A=new Array(T);let P=0;for(let N=0,M=h.length;N<M;N++){let R=h[N];const x=Math.min(T-P,m[N]),O=C[N];let B;O===2?B=0:O===1?B=1:B=x;for(let W=0;W<x;W++)W===B&&(R=0),A[P++]=R}return A}getViewLineContent(s){const l=this.getViewLineInfo(s);return this.modelLineProjections[l.modelLineNumber-1].getViewLineContent(this.model,l.modelLineNumber,l.modelLineWrappedLineIdx)}getViewLineLength(s){const l=this.getViewLineInfo(s);return this.modelLineProjections[l.modelLineNumber-1].getViewLineLength(this.model,l.modelLineNumber,l.modelLineWrappedLineIdx)}getViewLineMinColumn(s){const l=this.getViewLineInfo(s);return this.modelLineProjections[l.modelLineNumber-1].getViewLineMinColumn(this.model,l.modelLineNumber,l.modelLineWrappedLineIdx)}getViewLineMaxColumn(s){const l=this.getViewLineInfo(s);return this.modelLineProjections[l.modelLineNumber-1].getViewLineMaxColumn(this.model,l.modelLineNumber,l.modelLineWrappedLineIdx)}getViewLineData(s){const l=this.getViewLineInfo(s);return this.modelLineProjections[l.modelLineNumber-1].getViewLineData(this.model,l.modelLineNumber,l.modelLineWrappedLineIdx)}getViewLinesData(s,l,o){s=this._toValidViewLineNumber(s),l=this._toValidViewLineNumber(l);const g=this.projectedModelLineLineCounts.getIndexOf(s-1);let h=s;const m=g.index,C=g.remainder,w=[];for(let D=m,I=this.model.getLineCount();D<I;D++){const T=this.modelLineProjections[D];if(!T.isVisible())continue;const A=D===m?C:0;let P=T.getViewLineCount()-A,N=!1;if(h+P>l&&(N=!0,P=l-h+1),T.getViewLinesData(this.model,D+1,A,P,h-s,o,w),h+=P,N)break}return w}validateViewPosition(s,l,o){s=this._toValidViewLineNumber(s);const g=this.projectedModelLineLineCounts.getIndexOf(s-1),h=g.index,m=g.remainder,C=this.modelLineProjections[h],w=C.getViewLineMinColumn(this.model,h+1,m),D=C.getViewLineMaxColumn(this.model,h+1,m);l<w&&(l=w),l>D&&(l=D);const I=C.getModelColumnOfViewPosition(m,l);return this.model.validatePosition(new k.Position(h+1,I)).equals(o)?new k.Position(s,l):this.convertModelPositionToViewPosition(o.lineNumber,o.column)}validateViewRange(s,l){const o=this.validateViewPosition(s.startLineNumber,s.startColumn,l.getStartPosition()),g=this.validateViewPosition(s.endLineNumber,s.endColumn,l.getEndPosition());return new y.Range(o.lineNumber,o.column,g.lineNumber,g.column)}convertViewPositionToModelPosition(s,l){const o=this.getViewLineInfo(s),g=this.modelLineProjections[o.modelLineNumber-1].getModelColumnOfViewPosition(o.modelLineWrappedLineIdx,l);return this.model.validatePosition(new k.Position(o.modelLineNumber,g))}convertViewRangeToModelRange(s){const l=this.convertViewPositionToModelPosition(s.startLineNumber,s.startColumn),o=this.convertViewPositionToModelPosition(s.endLineNumber,s.endColumn);return new y.Range(l.lineNumber,l.column,o.lineNumber,o.column)}convertModelPositionToViewPosition(s,l,o=2,g=!1,h=!1){const m=this.model.validatePosition(new k.Position(s,l)),C=m.lineNumber,w=m.column;let D=C-1,I=!1;if(h)for(;D<this.modelLineProjections.length&&!this.modelLineProjections[D].isVisible();)D++,I=!0;else for(;D>0&&!this.modelLineProjections[D].isVisible();)D--,I=!0;if(D===0&&!this.modelLineProjections[D].isVisible())return new k.Position(g?0:1,1);const T=1+this.projectedModelLineLineCounts.getPrefixSum(D);let A;return I?h?A=this.modelLineProjections[D].getViewPositionOfModelPosition(T,1,o):A=this.modelLineProjections[D].getViewPositionOfModelPosition(T,this.model.getLineMaxColumn(D+1),o):A=this.modelLineProjections[C-1].getViewPositionOfModelPosition(T,w,o),A}convertModelRangeToViewRange(s,l=0){if(s.isEmpty()){const o=this.convertModelPositionToViewPosition(s.startLineNumber,s.startColumn,l);return y.Range.fromPositions(o)}else{const o=this.convertModelPositionToViewPosition(s.startLineNumber,s.startColumn,1),g=this.convertModelPositionToViewPosition(s.endLineNumber,s.endColumn,0);return new y.Range(o.lineNumber,o.column,g.lineNumber,g.column)}}getViewLineNumberOfModelPosition(s,l){let o=s-1;if(this.modelLineProjections[o].isVisible()){const h=1+this.projectedModelLineLineCounts.getPrefixSum(o);return this.modelLineProjections[o].getViewLineNumberOfModelPosition(h,l)}for(;o>0&&!this.modelLineProjections[o].isVisible();)o--;if(o===0&&!this.modelLineProjections[o].isVisible())return 1;const g=1+this.projectedModelLineLineCounts.getPrefixSum(o);return this.modelLineProjections[o].getViewLineNumberOfModelPosition(g,this.model.getLineMaxColumn(o+1))}getDecorationsInRange(s,l,o,g,h){const m=this.convertViewPositionToModelPosition(s.startLineNumber,s.startColumn),C=this.convertViewPositionToModelPosition(s.endLineNumber,s.endColumn);if(C.lineNumber-m.lineNumber<=s.endLineNumber-s.startLineNumber)return this.model.getDecorationsInRange(new y.Range(m.lineNumber,1,C.lineNumber,C.column),l,o,g,h);let w=[];const D=m.lineNumber-1,I=C.lineNumber-1;let T=null;for(let M=D;M<=I;M++)if(this.modelLineProjections[M].isVisible())T===null&&(T=new k.Position(M+1,M===D?m.column:1));else if(T!==null){const x=this.model.getLineMaxColumn(M);w=w.concat(this.model.getDecorationsInRange(new y.Range(T.lineNumber,T.column,M,x),l,o,g)),T=null}T!==null&&(w=w.concat(this.model.getDecorationsInRange(new y.Range(T.lineNumber,T.column,C.lineNumber,C.column),l,o,g)),T=null),w.sort((M,R)=>{const x=y.Range.compareRangesUsingStarts(M.range,R.range);return x===0?M.id<R.id?-1:M.id>R.id?1:0:x});const A=[];let P=0,N=null;for(const M of w){const R=M.id;N!==R&&(N=R,A[P++]=M)}return A}getInjectedTextAt(s){const l=this.getViewLineInfo(s.lineNumber);return this.modelLineProjections[l.modelLineNumber-1].getInjectedTextAt(l.modelLineWrappedLineIdx,s.column)}normalizePosition(s,l){const o=this.getViewLineInfo(s.lineNumber);return this.modelLineProjections[o.modelLineNumber-1].normalizePosition(o.modelLineWrappedLineIdx,s,l)}getLineIndentColumn(s){const l=this.getViewLineInfo(s);return l.modelLineWrappedLineIdx===0?this.model.getLineIndentColumn(l.modelLineNumber):0}}e.ViewModelLinesFromProjectedModel=i;function n(d){if(d.length===0)return[];const s=d.slice();s.sort(y.Range.compareRangesUsingStarts);const l=[];let o=s[0].startLineNumber,g=s[0].endLineNumber;for(let h=1,m=s.length;h<m;h++){const C=s[h];C.startLineNumber>g+1?(l.push(new y.Range(o,1,g,1)),o=C.startLineNumber,g=C.endLineNumber):C.endLineNumber>g&&(g=C.endLineNumber)}return l.push(new y.Range(o,1,g,1)),l}class t{constructor(s,l){this.modelLineNumber=s,this.modelLineWrappedLineIdx=l}}class r{constructor(s,l){this.modelRange=s,this.viewLines=l}}class u{constructor(s){this._lines=s}convertViewPositionToModelPosition(s){return this._lines.convertViewPositionToModelPosition(s.lineNumber,s.column)}convertViewRangeToModelRange(s){return this._lines.convertViewRangeToModelRange(s)}validateViewPosition(s,l){return this._lines.validateViewPosition(s.lineNumber,s.column,l)}validateViewRange(s,l){return this._lines.validateViewRange(s,l)}convertModelPositionToViewPosition(s,l,o,g){return this._lines.convertModelPositionToViewPosition(s.lineNumber,s.column,l,o,g)}convertModelRangeToViewRange(s,l){return this._lines.convertModelRangeToViewRange(s,l)}modelPositionIsVisible(s){return this._lines.modelPositionIsVisible(s.lineNumber,s.column)}getModelLineViewLineCount(s){return this._lines.getModelLineViewLineCount(s)}getViewLineNumberOfModelPosition(s,l){return this._lines.getViewLineNumberOfModelPosition(s,l)}}class f{constructor(s){this.model=s}dispose(){}createCoordinatesConverter(){return new c(this)}getHiddenAreas(){return[]}setHiddenAreas(s){return!1}setTabSize(s){return!1}setWrappingSettings(s,l,o,g){return!1}createLineBreaksComputer(){const s=[];return{addRequest:(l,o,g)=>{s.push(null)},finalize:()=>s}}onModelFlushed(){}onModelLinesDeleted(s,l,o){return new _.ViewLinesDeletedEvent(l,o)}onModelLinesInserted(s,l,o,g){return new _.ViewLinesInsertedEvent(l,o)}onModelLineChanged(s,l,o){return[!1,new _.ViewLinesChangedEvent(l,1),null,null]}acceptVersionId(s){}getViewLineCount(){return this.model.getLineCount()}getActiveIndentGuide(s,l,o){return{startLineNumber:s,endLineNumber:s,indent:0}}getViewLinesBracketGuides(s,l,o){return new Array(l-s+1).fill([])}getViewLinesIndentGuides(s,l){const o=l-s+1,g=new Array(o);for(let h=0;h<o;h++)g[h]=0;return g}getViewLineContent(s){return this.model.getLineContent(s)}getViewLineLength(s){return this.model.getLineLength(s)}getViewLineMinColumn(s){return this.model.getLineMinColumn(s)}getViewLineMaxColumn(s){return this.model.getLineMaxColumn(s)}getViewLineData(s){const l=this.model.tokenization.getLineTokens(s),o=l.getLineContent();return new a.ViewLineData(o,!1,1,o.length+1,0,l.inflate(),null)}getViewLinesData(s,l,o){const g=this.model.getLineCount();s=Math.min(Math.max(1,s),g),l=Math.min(Math.max(1,l),g);const h=[];for(let m=s;m<=l;m++){const C=m-s;h[C]=o[C]?this.getViewLineData(m):null}return h}getDecorationsInRange(s,l,o,g,h){return this.model.getDecorationsInRange(s,l,o,g,h)}normalizePosition(s,l){return this.model.normalizePosition(s,l)}getLineIndentColumn(s){return this.model.getLineIndentColumn(s)}getInjectedTextAt(s){return null}}e.ViewModelLinesFromModelAsIs=f;class c{constructor(s){this._lines=s}_validPosition(s){return this._lines.model.validatePosition(s)}_validRange(s){return this._lines.model.validateRange(s)}convertViewPositionToModelPosition(s){return this._validPosition(s)}convertViewRangeToModelRange(s){return this._validRange(s)}validateViewPosition(s,l){return this._validPosition(l)}validateViewRange(s,l){return this._validRange(l)}convertModelPositionToViewPosition(s){return this._validPosition(s)}convertModelRangeToViewRange(s){return this._validRange(s)}modelPositionIsVisible(s){const l=this._lines.model.getLineCount();return!(s.lineNumber<1||s.lineNumber>l)}getModelLineViewLineCount(s){return 1}getViewLineNumberOfModelPosition(s,l){return s}}}),define(se[885],oe([1,0,13,14,39,2,17,11,36,791,75,10,5,114,31,80,337,214,551,339,86,336,215,884,546]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewModel=void 0;const m=!0;class C extends E.Disposable{constructor(M,R,x,O,B,W,V,K,F){if(super(),this.languageConfigurationService=V,this._themeService=K,this._attachedView=F,this.hiddenAreasModel=new I,this.previousHiddenAreas=[],this._editorId=M,this._configuration=R,this.model=x,this._eventDispatcher=new o.ViewModelEventDispatcher,this.onEvent=this._eventDispatcher.onEvent,this.cursorConfig=new b.CursorConfiguration(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._updateConfigurationViewLineCount=this._register(new k.RunOnceScheduler(()=>this._updateConfigurationViewLineCountNow(),0)),this._hasFocus=!1,this._viewportStart=w.create(this.model),this.glyphLanes=new h.GlyphMarginLanesModel(0),m&&this.model.isTooLargeForTokenization())this._lines=new g.ViewModelLinesFromModelAsIs(this.model);else{const q=this._configuration.options,ie=q.get(50),ae=q.get(137),ne=q.get(144),$=q.get(136),J=q.get(128);this._lines=new g.ViewModelLinesFromProjectedModel(this._editorId,this.model,O,B,ie,this.model.getOptions().tabSize,ae,ne.wrappingColumn,$,J)}this.coordinatesConverter=this._lines.createCoordinatesConverter(),this._cursor=this._register(new v.CursorsController(x,this,this.coordinatesConverter,this.cursorConfig)),this.viewLayout=this._register(new c.ViewLayout(this._configuration,this.getLineCount(),W)),this._register(this.viewLayout.onDidScroll(q=>{q.scrollTopChanged&&this._handleVisibleLinesChanged(),q.scrollTopChanged&&this._viewportStart.invalidate(),this._eventDispatcher.emitSingleViewEvent(new f.ViewScrollChangedEvent(q)),this._eventDispatcher.emitOutgoingEvent(new o.ScrollChangedEvent(q.oldScrollWidth,q.oldScrollLeft,q.oldScrollHeight,q.oldScrollTop,q.scrollWidth,q.scrollLeft,q.scrollHeight,q.scrollTop))})),this._register(this.viewLayout.onDidContentSizeChange(q=>{this._eventDispatcher.emitOutgoingEvent(q)})),this._decorations=new l.ViewModelDecorations(this._editorId,this.model,this._configuration,this._lines,this.coordinatesConverter),this._registerModelEvents(),this._register(this._configuration.onDidChangeFast(q=>{try{const ie=this._eventDispatcher.beginEmitViewEvents();this._onConfigurationChanged(ie,q)}finally{this._eventDispatcher.endEmitViewEvents()}})),this._register(d.MinimapTokensColorTracker.getInstance().onDidChange(()=>{this._eventDispatcher.emitSingleViewEvent(new f.ViewTokensColorsChangedEvent)})),this._register(this._themeService.onDidColorThemeChange(q=>{this._invalidateDecorationsColorCache(),this._eventDispatcher.emitSingleViewEvent(new f.ViewThemeChangedEvent(q))})),this._updateConfigurationViewLineCountNow()}dispose(){super.dispose(),this._decorations.dispose(),this._lines.dispose(),this._viewportStart.dispose(),this._eventDispatcher.dispose()}createLineBreaksComputer(){return this._lines.createLineBreaksComputer()}addViewEventHandler(M){this._eventDispatcher.addViewEventHandler(M)}removeViewEventHandler(M){this._eventDispatcher.removeViewEventHandler(M)}_updateConfigurationViewLineCountNow(){this._configuration.setViewLineCount(this._lines.getViewLineCount())}getModelVisibleRanges(){const M=this.viewLayout.getLinesViewportData(),R=new i.Range(M.startLineNumber,this.getLineMinColumn(M.startLineNumber),M.endLineNumber,this.getLineMaxColumn(M.endLineNumber));return this._toModelVisibleRanges(R)}visibleLinesStabilized(){const M=this.getModelVisibleRanges();this._attachedView.setVisibleLines(M,!0)}_handleVisibleLinesChanged(){const M=this.getModelVisibleRanges();this._attachedView.setVisibleLines(M,!1)}setHasFocus(M){this._hasFocus=M,this._cursor.setHasFocus(M),this._eventDispatcher.emitSingleViewEvent(new f.ViewFocusChangedEvent(M)),this._eventDispatcher.emitOutgoingEvent(new o.FocusChangedEvent(!M,M))}onCompositionStart(){this._eventDispatcher.emitSingleViewEvent(new f.ViewCompositionStartEvent)}onCompositionEnd(){this._eventDispatcher.emitSingleViewEvent(new f.ViewCompositionEndEvent)}_captureStableViewport(){if(this._viewportStart.isValid&&this.viewLayout.getCurrentScrollTop()>0){const M=new a.Position(this._viewportStart.viewLineNumber,this.getLineMinColumn(this._viewportStart.viewLineNumber)),R=this.coordinatesConverter.convertViewPositionToModelPosition(M);return new P(R,this._viewportStart.startLineDelta)}return new P(null,0)}_onConfigurationChanged(M,R){const x=this._captureStableViewport(),O=this._configuration.options,B=O.get(50),W=O.get(137),V=O.get(144),K=O.get(136),F=O.get(128);this._lines.setWrappingSettings(B,W,V.wrappingColumn,K,F)&&(M.emitViewEvent(new f.ViewFlushedEvent),M.emitViewEvent(new f.ViewLineMappingChangedEvent),M.emitViewEvent(new f.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(M),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount()),this._updateConfigurationViewLineCount.schedule()),R.hasChanged(90)&&(this._decorations.reset(),M.emitViewEvent(new f.ViewDecorationsChangedEvent(null))),R.hasChanged(97)&&(this._decorations.reset(),M.emitViewEvent(new f.ViewDecorationsChangedEvent(null))),M.emitViewEvent(new f.ViewConfigurationChangedEvent(R)),this.viewLayout.onConfigurationChanged(R),x.recoverViewportStart(this.coordinatesConverter,this.viewLayout),b.CursorConfiguration.shouldRecreate(R)&&(this.cursorConfig=new b.CursorConfiguration(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._cursor.updateConfiguration(this.cursorConfig))}_registerModelEvents(){this._register(this.model.onDidChangeContentOrInjectedText(M=>{try{const x=this._eventDispatcher.beginEmitViewEvents();let O=!1,B=!1;const W=M instanceof n.InternalModelContentChangeEvent?M.rawContentChangedEvent.changes:M.changes,V=M instanceof n.InternalModelContentChangeEvent?M.rawContentChangedEvent.versionId:null,K=this._lines.createLineBreaksComputer();for(const ie of W)switch(ie.changeType){case 4:{for(let ae=0;ae<ie.detail.length;ae++){const ne=ie.detail[ae];let $=ie.injectedTexts[ae];$&&($=$.filter(J=>!J.ownerId||J.ownerId===this._editorId)),K.addRequest(ne,$,null)}break}case 2:{let ae=null;ie.injectedText&&(ae=ie.injectedText.filter(ne=>!ne.ownerId||ne.ownerId===this._editorId)),K.addRequest(ie.detail,ae,null);break}}const F=K.finalize(),q=new L.ArrayQueue(F);for(const ie of W)switch(ie.changeType){case 1:{this._lines.onModelFlushed(),x.emitViewEvent(new f.ViewFlushedEvent),this._decorations.reset(),this.viewLayout.onFlushed(this.getLineCount()),O=!0;break}case 3:{const ae=this._lines.onModelLinesDeleted(V,ie.fromLineNumber,ie.toLineNumber);ae!==null&&(x.emitViewEvent(ae),this.viewLayout.onLinesDeleted(ae.fromLineNumber,ae.toLineNumber)),O=!0;break}case 4:{const ae=q.takeCount(ie.detail.length),ne=this._lines.onModelLinesInserted(V,ie.fromLineNumber,ie.toLineNumber,ae);ne!==null&&(x.emitViewEvent(ne),this.viewLayout.onLinesInserted(ne.fromLineNumber,ne.toLineNumber)),O=!0;break}case 2:{const ae=q.dequeue(),[ne,$,J,Q]=this._lines.onModelLineChanged(V,ie.lineNumber,ae);B=ne,$&&x.emitViewEvent($),J&&(x.emitViewEvent(J),this.viewLayout.onLinesInserted(J.fromLineNumber,J.toLineNumber)),Q&&(x.emitViewEvent(Q),this.viewLayout.onLinesDeleted(Q.fromLineNumber,Q.toLineNumber));break}case 5:break}V!==null&&this._lines.acceptVersionId(V),this.viewLayout.onHeightMaybeChanged(),!O&&B&&(x.emitViewEvent(new f.ViewLineMappingChangedEvent),x.emitViewEvent(new f.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(x),this._decorations.onLineMappingChanged())}finally{this._eventDispatcher.endEmitViewEvents()}const R=this._viewportStart.isValid;if(this._viewportStart.invalidate(),this._configuration.setModelLineCount(this.model.getLineCount()),this._updateConfigurationViewLineCountNow(),!this._hasFocus&&this.model.getAttachedEditorCount()>=2&&R){const x=this.model._getTrackedRange(this._viewportStart.modelTrackedRange);if(x){const O=this.coordinatesConverter.convertModelPositionToViewPosition(x.getStartPosition()),B=this.viewLayout.getVerticalOffsetForLineNumber(O.lineNumber);this.viewLayout.setScrollPosition({scrollTop:B+this._viewportStart.startLineDelta},1)}}try{const x=this._eventDispatcher.beginEmitViewEvents();M instanceof n.InternalModelContentChangeEvent&&x.emitOutgoingEvent(new o.ModelContentChangedEvent(M.contentChangedEvent)),this._cursor.onModelContentChanged(x,M)}finally{this._eventDispatcher.endEmitViewEvents()}this._handleVisibleLinesChanged()})),this._register(this.model.onDidChangeTokens(M=>{const R=[];for(let x=0,O=M.ranges.length;x<O;x++){const B=M.ranges[x],W=this.coordinatesConverter.convertModelPositionToViewPosition(new a.Position(B.fromLineNumber,1)).lineNumber,V=this.coordinatesConverter.convertModelPositionToViewPosition(new a.Position(B.toLineNumber,this.model.getLineMaxColumn(B.toLineNumber))).lineNumber;R[x]={fromLineNumber:W,toLineNumber:V}}this._eventDispatcher.emitSingleViewEvent(new f.ViewTokensChangedEvent(R)),this._eventDispatcher.emitOutgoingEvent(new o.ModelTokensChangedEvent(M))})),this._register(this.model.onDidChangeLanguageConfiguration(M=>{this._eventDispatcher.emitSingleViewEvent(new f.ViewLanguageConfigurationEvent),this.cursorConfig=new b.CursorConfiguration(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._cursor.updateConfiguration(this.cursorConfig),this._eventDispatcher.emitOutgoingEvent(new o.ModelLanguageConfigurationChangedEvent(M))})),this._register(this.model.onDidChangeLanguage(M=>{this.cursorConfig=new b.CursorConfiguration(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._cursor.updateConfiguration(this.cursorConfig),this._eventDispatcher.emitOutgoingEvent(new o.ModelLanguageChangedEvent(M))})),this._register(this.model.onDidChangeOptions(M=>{if(this._lines.setTabSize(this.model.getOptions().tabSize)){try{const R=this._eventDispatcher.beginEmitViewEvents();R.emitViewEvent(new f.ViewFlushedEvent),R.emitViewEvent(new f.ViewLineMappingChangedEvent),R.emitViewEvent(new f.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(R),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount())}finally{this._eventDispatcher.endEmitViewEvents()}this._updateConfigurationViewLineCount.schedule()}this.cursorConfig=new b.CursorConfiguration(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._cursor.updateConfiguration(this.cursorConfig),this._eventDispatcher.emitOutgoingEvent(new o.ModelOptionsChangedEvent(M))})),this._register(this.model.onDidChangeDecorations(M=>{this._decorations.onModelDecorationsChanged(),this._eventDispatcher.emitSingleViewEvent(new f.ViewDecorationsChangedEvent(M)),this._eventDispatcher.emitOutgoingEvent(new o.ModelDecorationsChangedEvent(M))}))}setHiddenAreas(M,R){var x;this.hiddenAreasModel.setHiddenAreas(R,M);const O=this.hiddenAreasModel.getMergedRanges();if(O===this.previousHiddenAreas)return;this.previousHiddenAreas=O;const B=this._captureStableViewport();let W=!1;try{const V=this._eventDispatcher.beginEmitViewEvents();W=this._lines.setHiddenAreas(O),W&&(V.emitViewEvent(new f.ViewFlushedEvent),V.emitViewEvent(new f.ViewLineMappingChangedEvent),V.emitViewEvent(new f.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(V),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount()),this.viewLayout.onHeightMaybeChanged());const K=(x=B.viewportStartModelPosition)===null||x===void 0?void 0:x.lineNumber;K&&O.some(q=>q.startLineNumber<=K&&K<=q.endLineNumber)||B.recoverViewportStart(this.coordinatesConverter,this.viewLayout)}finally{this._eventDispatcher.endEmitViewEvents()}this._updateConfigurationViewLineCount.schedule(),W&&this._eventDispatcher.emitOutgoingEvent(new o.HiddenAreasChangedEvent)}getVisibleRangesPlusViewportAboveBelow(){const M=this._configuration.options.get(143),R=this._configuration.options.get(66),x=Math.max(20,Math.round(M.height/R)),O=this.viewLayout.getLinesViewportData(),B=Math.max(1,O.completelyVisibleStartLineNumber-x),W=Math.min(this.getLineCount(),O.completelyVisibleEndLineNumber+x);return this._toModelVisibleRanges(new i.Range(B,this.getLineMinColumn(B),W,this.getLineMaxColumn(W)))}getVisibleRanges(){const M=this.getCompletelyVisibleViewRange();return this._toModelVisibleRanges(M)}getHiddenAreas(){return this._lines.getHiddenAreas()}_toModelVisibleRanges(M){const R=this.coordinatesConverter.convertViewRangeToModelRange(M),x=this._lines.getHiddenAreas();if(x.length===0)return[R];const O=[];let B=0,W=R.startLineNumber,V=R.startColumn;const K=R.endLineNumber,F=R.endColumn;for(let q=0,ie=x.length;q<ie;q++){const ae=x[q].startLineNumber,ne=x[q].endLineNumber;ne<W||ae>K||(W<ae&&(O[B++]=new i.Range(W,V,ae-1,this.model.getLineMaxColumn(ae-1))),W=ne+1,V=1)}return(W<K||W===K&&V<F)&&(O[B++]=new i.Range(W,V,K,F)),O}getCompletelyVisibleViewRange(){const M=this.viewLayout.getLinesViewportData(),R=M.completelyVisibleStartLineNumber,x=M.completelyVisibleEndLineNumber;return new i.Range(R,this.getLineMinColumn(R),x,this.getLineMaxColumn(x))}getCompletelyVisibleViewRangeAtScrollTop(M){const R=this.viewLayout.getLinesViewportDataAtScrollTop(M),x=R.completelyVisibleStartLineNumber,O=R.completelyVisibleEndLineNumber;return new i.Range(x,this.getLineMinColumn(x),O,this.getLineMaxColumn(O))}saveState(){const M=this.viewLayout.saveState(),R=M.scrollTop,x=this.viewLayout.getLineNumberAtVerticalOffset(R),O=this.coordinatesConverter.convertViewPositionToModelPosition(new a.Position(x,this.getLineMinColumn(x))),B=this.viewLayout.getVerticalOffsetForLineNumber(x)-R;return{scrollLeft:M.scrollLeft,firstPosition:O,firstPositionDeltaTop:B}}reduceRestoreState(M){if(typeof M.firstPosition>"u")return this._reduceRestoreStateCompatibility(M);const R=this.model.validatePosition(M.firstPosition),x=this.coordinatesConverter.convertModelPositionToViewPosition(R),O=this.viewLayout.getVerticalOffsetForLineNumber(x.lineNumber)-M.firstPositionDeltaTop;return{scrollLeft:M.scrollLeft,scrollTop:O}}_reduceRestoreStateCompatibility(M){return{scrollLeft:M.scrollLeft,scrollTop:M.scrollTopWithoutViewZones}}getTabSize(){return this.model.getOptions().tabSize}getLineCount(){return this._lines.getViewLineCount()}setViewport(M,R,x){this._viewportStart.update(this,M)}getActiveIndentGuide(M,R,x){return this._lines.getActiveIndentGuide(M,R,x)}getLinesIndentGuides(M,R){return this._lines.getViewLinesIndentGuides(M,R)}getBracketGuidesInRangeByLine(M,R,x,O){return this._lines.getViewLinesBracketGuides(M,R,x,O)}getLineContent(M){return this._lines.getViewLineContent(M)}getLineLength(M){return this._lines.getViewLineLength(M)}getLineMinColumn(M){return this._lines.getViewLineMinColumn(M)}getLineMaxColumn(M){return this._lines.getViewLineMaxColumn(M)}getLineFirstNonWhitespaceColumn(M){const R=p.firstNonWhitespaceIndex(this.getLineContent(M));return R===-1?0:R+1}getLineLastNonWhitespaceColumn(M){const R=p.lastNonWhitespaceIndex(this.getLineContent(M));return R===-1?0:R+2}getMinimapDecorationsInRange(M){return this._decorations.getMinimapDecorationsInRange(M)}getDecorationsInViewport(M){return this._decorations.getDecorationsViewportData(M).decorations}getInjectedTextAt(M){return this._lines.getInjectedTextAt(M)}getViewportViewLineRenderingData(M,R){const O=this._decorations.getDecorationsViewportData(M).inlineDecorations[R-M.startLineNumber];return this._getViewLineRenderingData(R,O)}getViewLineRenderingData(M){const R=this._decorations.getInlineDecorationsOnLine(M);return this._getViewLineRenderingData(M,R)}_getViewLineRenderingData(M,R){const x=this.model.mightContainRTL(),O=this.model.mightContainNonBasicASCII(),B=this.getTabSize(),W=this._lines.getViewLineData(M);return W.inlineDecorations&&(R=[...R,...W.inlineDecorations.map(V=>V.toInlineDecoration(M))]),new s.ViewLineRenderingData(W.minColumn,W.maxColumn,W.content,W.continuesWithWrappedLine,x,O,W.tokens,R,B,W.startVisibleColumn)}getViewLineData(M){return this._lines.getViewLineData(M)}getMinimapLinesRenderingData(M,R,x){const O=this._lines.getViewLinesData(M,R,x);return new s.MinimapLinesRenderingData(this.getTabSize(),O)}getAllOverviewRulerDecorations(M){const R=this.model.getOverviewRulerDecorations(this._editorId,(0,_.filterValidationDecorations)(this._configuration.options)),x=new D;for(const O of R){const B=O.options,W=B.overviewRuler;if(!W)continue;const V=W.position;if(V===0)continue;const K=W.getColor(M.value),F=this.coordinatesConverter.getViewLineNumberOfModelPosition(O.range.startLineNumber,O.range.startColumn),q=this.coordinatesConverter.getViewLineNumberOfModelPosition(O.range.endLineNumber,O.range.endColumn);x.accept(K,B.zIndex,F,q,V)}return x.asArray}_invalidateDecorationsColorCache(){const M=this.model.getOverviewRulerDecorations();for(const R of M){const x=R.options.overviewRuler;x?.invalidateCachedColor();const O=R.options.minimap;O?.invalidateCachedColor()}}getValueInRange(M,R){const x=this.coordinatesConverter.convertViewRangeToModelRange(M);return this.model.getValueInRange(x,R)}getValueLengthInRange(M,R){const x=this.coordinatesConverter.convertViewRangeToModelRange(M);return this.model.getValueLengthInRange(x,R)}modifyPosition(M,R){const x=this.coordinatesConverter.convertViewPositionToModelPosition(M),O=this.model.modifyPosition(x,R);return this.coordinatesConverter.convertModelPositionToViewPosition(O)}deduceModelPositionRelativeToViewPosition(M,R,x){const O=this.coordinatesConverter.convertViewPositionToModelPosition(M);this.model.getEOL().length===2&&(R<0?R-=x:R+=x);const W=this.model.getOffsetAt(O)+R;return this.model.getPositionAt(W)}getPlainTextToCopy(M,R,x){const O=x?`\r
+`:this.model.getEOL();M=M.slice(0),M.sort(i.Range.compareRangesUsingStarts);let B=!1,W=!1;for(const K of M)K.isEmpty()?B=!0:W=!0;if(!W){if(!R)return"";const K=M.map(q=>q.startLineNumber);let F="";for(let q=0;q<K.length;q++)q>0&&K[q-1]===K[q]||(F+=this.model.getLineContent(K[q])+O);return F}if(B&&R){const K=[];let F=0;for(const q of M){const ie=q.startLineNumber;q.isEmpty()?ie!==F&&K.push(this.model.getLineContent(ie)):K.push(this.model.getValueInRange(q,x?2:0)),F=ie}return K.length===1?K[0]:K}const V=[];for(const K of M)K.isEmpty()||V.push(this.model.getValueInRange(K,x?2:0));return V.length===1?V[0]:V}getRichTextToCopy(M,R){const x=this.model.getLanguageId();if(x===r.PLAINTEXT_LANGUAGE_ID||M.length!==1)return null;let O=M[0];if(O.isEmpty()){if(!R)return null;const q=O.startLineNumber;O=new i.Range(q,this.model.getLineMinColumn(q),q,this.model.getLineMaxColumn(q))}const B=this._configuration.options.get(50),W=this._getColorMap(),K=/[:;\\\/<>]/.test(B.fontFamily)||B.fontFamily===_.EDITOR_FONT_DEFAULTS.fontFamily;let F;return K?F=_.EDITOR_FONT_DEFAULTS.fontFamily:(F=B.fontFamily,F=F.replace(/"/g,"'"),/[,']/.test(F)||/[+ ]/.test(F)&&(F=`'${F}'`),F=`${F}, ${_.EDITOR_FONT_DEFAULTS.fontFamily}`),{mode:x,html:`<div style="color: ${W[1]};background-color: ${W[2]};font-family: ${F};font-weight: ${B.fontWeight};font-size: ${B.fontSize}px;line-height: ${B.lineHeight}px;white-space: pre;">`+this._getHTMLToCopy(O,W)+"</div>"}}_getHTMLToCopy(M,R){const x=M.startLineNumber,O=M.startColumn,B=M.endLineNumber,W=M.endColumn,V=this.getTabSize();let K="";for(let F=x;F<=B;F++){const q=this.model.tokenization.getLineTokens(F),ie=q.getLineContent(),ae=F===x?O-1:0,ne=F===B?W-1:ie.length;ie===""?K+="<br>":K+=(0,u.tokenizeLineToHTML)(ie,q.inflate(),R,ae,ne,V,S.isWindows)}return K}_getColorMap(){const M=t.TokenizationRegistry.getColorMap(),R=["#000000"];if(M)for(let x=1,O=M.length;x<O;x++)R[x]=y.Color.Format.CSS.formatHex(M[x]);return R}getPrimaryCursorState(){return this._cursor.getPrimaryCursorState()}getLastAddedCursorIndex(){return this._cursor.getLastAddedCursorIndex()}getCursorStates(){return this._cursor.getCursorStates()}setCursorStates(M,R,x){return this._withViewEventsCollector(O=>this._cursor.setStates(O,M,R,x))}getCursorColumnSelectData(){return this._cursor.getCursorColumnSelectData()}getCursorAutoClosedCharacters(){return this._cursor.getAutoClosedCharacters()}setCursorColumnSelectData(M){this._cursor.setCursorColumnSelectData(M)}getPrevEditOperationType(){return this._cursor.getPrevEditOperationType()}setPrevEditOperationType(M){this._cursor.setPrevEditOperationType(M)}getSelection(){return this._cursor.getSelection()}getSelections(){return this._cursor.getSelections()}getPosition(){return this._cursor.getPrimaryCursorState().modelState.position}setSelections(M,R,x=0){this._withViewEventsCollector(O=>this._cursor.setSelections(O,M,R,x))}saveCursorState(){return this._cursor.saveState()}restoreCursorState(M){this._withViewEventsCollector(R=>this._cursor.restoreState(R,M))}_executeCursorEdit(M){if(this._cursor.context.cursorConfig.readOnly){this._eventDispatcher.emitOutgoingEvent(new o.ReadOnlyEditAttemptEvent);return}this._withViewEventsCollector(M)}executeEdits(M,R,x){this._executeCursorEdit(O=>this._cursor.executeEdits(O,M,R,x))}startComposition(){this._executeCursorEdit(M=>this._cursor.startComposition(M))}endComposition(M){this._executeCursorEdit(R=>this._cursor.endComposition(R,M))}type(M,R){this._executeCursorEdit(x=>this._cursor.type(x,M,R))}compositionType(M,R,x,O,B){this._executeCursorEdit(W=>this._cursor.compositionType(W,M,R,x,O,B))}paste(M,R,x,O){this._executeCursorEdit(B=>this._cursor.paste(B,M,R,x,O))}cut(M){this._executeCursorEdit(R=>this._cursor.cut(R,M))}executeCommand(M,R){this._executeCursorEdit(x=>this._cursor.executeCommand(x,M,R))}executeCommands(M,R){this._executeCursorEdit(x=>this._cursor.executeCommands(x,M,R))}revealPrimaryCursor(M,R,x=!1){this._withViewEventsCollector(O=>this._cursor.revealPrimary(O,M,x,0,R,0))}revealTopMostCursor(M){const R=this._cursor.getTopMostViewPosition(),x=new i.Range(R.lineNumber,R.column,R.lineNumber,R.column);this._withViewEventsCollector(O=>O.emitViewEvent(new f.ViewRevealRangeRequestEvent(M,!1,x,null,0,!0,0)))}revealBottomMostCursor(M){const R=this._cursor.getBottomMostViewPosition(),x=new i.Range(R.lineNumber,R.column,R.lineNumber,R.column);this._withViewEventsCollector(O=>O.emitViewEvent(new f.ViewRevealRangeRequestEvent(M,!1,x,null,0,!0,0)))}revealRange(M,R,x,O,B){this._withViewEventsCollector(W=>W.emitViewEvent(new f.ViewRevealRangeRequestEvent(M,!1,x,null,O,R,B)))}changeWhitespace(M){this.viewLayout.changeWhitespace(M)&&(this._eventDispatcher.emitSingleViewEvent(new f.ViewZonesChangedEvent),this._eventDispatcher.emitOutgoingEvent(new o.ViewZonesChangedEvent))}_withViewEventsCollector(M){try{const R=this._eventDispatcher.beginEmitViewEvents();return M(R)}finally{this._eventDispatcher.endEmitViewEvents()}}normalizePosition(M,R){return this._lines.normalizePosition(M,R)}getLineIndentColumn(M){return this._lines.getLineIndentColumn(M)}}e.ViewModel=C;class w{static create(M){const R=M._setTrackedRange(null,new i.Range(1,1,1,1),1);return new w(M,1,!1,R,0)}get viewLineNumber(){return this._viewLineNumber}get isValid(){return this._isValid}get modelTrackedRange(){return this._modelTrackedRange}get startLineDelta(){return this._startLineDelta}constructor(M,R,x,O,B){this._model=M,this._viewLineNumber=R,this._isValid=x,this._modelTrackedRange=O,this._startLineDelta=B}dispose(){this._model._setTrackedRange(this._modelTrackedRange,null,1)}update(M,R){const x=M.coordinatesConverter.convertViewPositionToModelPosition(new a.Position(R,M.getLineMinColumn(R))),O=M.model._setTrackedRange(this._modelTrackedRange,new i.Range(x.lineNumber,x.column,x.lineNumber,x.column),1),B=M.viewLayout.getVerticalOffsetForLineNumber(R),W=M.viewLayout.getCurrentScrollTop();this._viewLineNumber=R,this._isValid=!0,this._modelTrackedRange=O,this._startLineDelta=W-B}invalidate(){this._isValid=!1}}class D{constructor(){this._asMap=Object.create(null),this.asArray=[]}accept(M,R,x,O,B){const W=this._asMap[M];if(W){const V=W.data,K=V[V.length-3],F=V[V.length-1];if(K===B&&F+1>=x){O>F&&(V[V.length-1]=O);return}V.push(B,x,O)}else{const V=new s.OverviewRulerDecorationsGroup(M,R,[B,x,O]);this._asMap[M]=V,this.asArray.push(V)}}}class I{constructor(){this.hiddenAreas=new Map,this.shouldRecompute=!1,this.ranges=[]}setHiddenAreas(M,R){const x=this.hiddenAreas.get(M);x&&A(x,R)||(this.hiddenAreas.set(M,R),this.shouldRecompute=!0)}getMergedRanges(){if(!this.shouldRecompute)return this.ranges;this.shouldRecompute=!1;const M=Array.from(this.hiddenAreas.values()).reduce((R,x)=>T(R,x),[]);return A(this.ranges,M)?this.ranges:(this.ranges=M,this.ranges)}}function T(N,M){const R=[];let x=0,O=0;for(;x<N.length&&O<M.length;){const B=N[x],W=M[O];if(B.endLineNumber<W.startLineNumber-1)R.push(N[x++]);else if(W.endLineNumber<B.startLineNumber-1)R.push(M[O++]);else{const V=Math.min(B.startLineNumber,W.startLineNumber),K=Math.max(B.endLineNumber,W.endLineNumber);R.push(new i.Range(V,1,K,1)),x++,O++}}for(;x<N.length;)R.push(N[x++]);for(;O<M.length;)R.push(M[O++]);return R}function A(N,M){if(N.length!==M.length)return!1;for(let R=0;R<N.length;R++)if(!N[R].equalsRange(M[R]))return!1;return!0}class P{constructor(M,R){this.viewportStartModelPosition=M,this.startLineDelta=R}recoverViewportStart(M,R){if(!this.viewportStartModelPosition)return;const x=M.convertModelPositionToViewPosition(this.viewportStartModelPosition),O=R.getVerticalOffsetForLineNumber(x.lineNumber);R.setScrollPosition({scrollTop:O+this.startLineDelta},1)}}}),define(se[194],oe([1,0,621,7,12,6,2,47,771,16,33,862,279,36,85,10,5,24,287,180,21,38,83,29,885,25,15,8,163,50,23,69,548,609,181,32,72,18,607,202,807,451]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w,D,I,T,A,P,N,M,R,x,O,B,W){"use strict";var V;Object.defineProperty(e,"__esModule",{value:!0}),e.EditorModeContext=e.BooleanEventEmitter=e.CodeEditorWidget=void 0;let K=0;class F{constructor(z,H,Y,j,Z,ee){this.model=z,this.viewModel=H,this.view=Y,this.hasRealView=j,this.listenersToRemove=Z,this.attachedView=ee}dispose(){(0,S.dispose)(this.listenersToRemove),this.model.onBeforeDetached(this.attachedView),this.hasRealView&&this.view.dispose(),this.viewModel.dispose()}}let q=V=class extends S.Disposable{get isSimpleWidget(){return this._configuration.isSimpleWidget}constructor(z,H,Y,j,Z,ee,le,ue,ce,pe,ve,Ce){var Se;super(),this.languageConfigurationService=ve,this._deliveryQueue=(0,E.createEventDeliveryQueue)(),this._contributions=this._register(new B.CodeEditorContributions),this._onDidDispose=this._register(new E.Emitter),this.onDidDispose=this._onDidDispose.event,this._onDidChangeModelContent=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidChangeModelContent=this._onDidChangeModelContent.event,this._onDidChangeModelLanguage=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidChangeModelLanguage=this._onDidChangeModelLanguage.event,this._onDidChangeModelLanguageConfiguration=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidChangeModelLanguageConfiguration=this._onDidChangeModelLanguageConfiguration.event,this._onDidChangeModelOptions=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidChangeModelOptions=this._onDidChangeModelOptions.event,this._onDidChangeModelDecorations=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidChangeModelDecorations=this._onDidChangeModelDecorations.event,this._onDidChangeModelTokens=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidChangeModelTokens=this._onDidChangeModelTokens.event,this._onDidChangeConfiguration=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidChangeConfiguration=this._onDidChangeConfiguration.event,this._onWillChangeModel=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onWillChangeModel=this._onWillChangeModel.event,this._onDidChangeModel=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidChangeModel=this._onDidChangeModel.event,this._onDidChangeCursorPosition=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidChangeCursorPosition=this._onDidChangeCursorPosition.event,this._onDidChangeCursorSelection=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidChangeCursorSelection=this._onDidChangeCursorSelection.event,this._onDidAttemptReadOnlyEdit=this._register(new ae(this._contributions,this._deliveryQueue)),this.onDidAttemptReadOnlyEdit=this._onDidAttemptReadOnlyEdit.event,this._onDidLayoutChange=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidLayoutChange=this._onDidLayoutChange.event,this._editorTextFocus=this._register(new ie({deliveryQueue:this._deliveryQueue})),this.onDidFocusEditorText=this._editorTextFocus.onDidChangeToTrue,this.onDidBlurEditorText=this._editorTextFocus.onDidChangeToFalse,this._editorWidgetFocus=this._register(new ie({deliveryQueue:this._deliveryQueue})),this.onDidFocusEditorWidget=this._editorWidgetFocus.onDidChangeToTrue,this.onDidBlurEditorWidget=this._editorWidgetFocus.onDidChangeToFalse,this._onWillType=this._register(new ae(this._contributions,this._deliveryQueue)),this.onWillType=this._onWillType.event,this._onDidType=this._register(new ae(this._contributions,this._deliveryQueue)),this.onDidType=this._onDidType.event,this._onDidCompositionStart=this._register(new ae(this._contributions,this._deliveryQueue)),this.onDidCompositionStart=this._onDidCompositionStart.event,this._onDidCompositionEnd=this._register(new ae(this._contributions,this._deliveryQueue)),this.onDidCompositionEnd=this._onDidCompositionEnd.event,this._onDidPaste=this._register(new ae(this._contributions,this._deliveryQueue)),this.onDidPaste=this._onDidPaste.event,this._onMouseUp=this._register(new ae(this._contributions,this._deliveryQueue)),this.onMouseUp=this._onMouseUp.event,this._onMouseDown=this._register(new ae(this._contributions,this._deliveryQueue)),this.onMouseDown=this._onMouseDown.event,this._onMouseDrag=this._register(new ae(this._contributions,this._deliveryQueue)),this.onMouseDrag=this._onMouseDrag.event,this._onMouseDrop=this._register(new ae(this._contributions,this._deliveryQueue)),this.onMouseDrop=this._onMouseDrop.event,this._onMouseDropCanceled=this._register(new ae(this._contributions,this._deliveryQueue)),this.onMouseDropCanceled=this._onMouseDropCanceled.event,this._onDropIntoEditor=this._register(new ae(this._contributions,this._deliveryQueue)),this.onDropIntoEditor=this._onDropIntoEditor.event,this._onContextMenu=this._register(new ae(this._contributions,this._deliveryQueue)),this.onContextMenu=this._onContextMenu.event,this._onMouseMove=this._register(new ae(this._contributions,this._deliveryQueue)),this.onMouseMove=this._onMouseMove.event,this._onMouseLeave=this._register(new ae(this._contributions,this._deliveryQueue)),this.onMouseLeave=this._onMouseLeave.event,this._onMouseWheel=this._register(new ae(this._contributions,this._deliveryQueue)),this.onMouseWheel=this._onMouseWheel.event,this._onKeyUp=this._register(new ae(this._contributions,this._deliveryQueue)),this.onKeyUp=this._onKeyUp.event,this._onKeyDown=this._register(new ae(this._contributions,this._deliveryQueue)),this.onKeyDown=this._onKeyDown.event,this._onDidContentSizeChange=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidContentSizeChange=this._onDidContentSizeChange.event,this._onDidScrollChange=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidScrollChange=this._onDidScrollChange.event,this._onDidChangeViewZones=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidChangeViewZones=this._onDidChangeViewZones.event,this._onDidChangeHiddenAreas=this._register(new E.Emitter({deliveryQueue:this._deliveryQueue})),this.onDidChangeHiddenAreas=this._onDidChangeHiddenAreas.event,this._actions=new Map,this._bannerDomNode=null,this._dropIntoEditorDecorations=this.createDecorationsCollection(),Z.willCreateCodeEditor();const _e={...H};this._domElement=z,this._overflowWidgetsDomNode=_e.overflowWidgetsDomNode,delete _e.overflowWidgetsDomNode,this._id=++K,this._decorationTypeKeysToIds={},this._decorationTypeSubtypes={},this._telemetryData=Y.telemetryData,this._configuration=this._register(this._createConfiguration(Y.isSimpleWidget||!1,_e,pe)),this._register(this._configuration.onDidChange(xe=>{this._onDidChangeConfiguration.fire(xe);const Be=this._configuration.options;if(xe.hasChanged(143)){const De=Be.get(143);this._onDidLayoutChange.fire(De)}})),this._contextKeyService=this._register(le.createScoped(this._domElement)),this._notificationService=ce,this._codeEditorService=Z,this._commandService=ee,this._themeService=ue,this._register(new ne(this,this._contextKeyService)),this._register(new $(this,this._contextKeyService,Ce)),this._instantiationService=j.createChild(new D.ServiceCollection([C.IContextKeyService,this._contextKeyService])),this._modelData=null,this._focusTracker=new J(z,this._overflowWidgetsDomNode),this._register(this._focusTracker.onChange(()=>{this._editorWidgetFocus.setValue(this._focusTracker.hasFocus())})),this._contentWidgets={},this._overlayWidgets={},this._glyphMarginWidgets={};let Ee;Array.isArray(Y.contributions)?Ee=Y.contributions:Ee=v.EditorExtensionsRegistry.getEditorContributions(),this._contributions.initialize(this,Ee,this._instantiationService);for(const xe of v.EditorExtensionsRegistry.getEditorActions()){if(this._actions.has(xe.id)){(0,y.onUnexpectedError)(new Error(`Cannot have two actions with the same id ${xe.id}`));continue}const Be=new c.InternalEditorAction(xe.id,xe.label,xe.alias,xe.metadata,(Se=xe.precondition)!==null&&Se!==void 0?Se:void 0,De=>this._instantiationService.invokeFunction(Ie=>Promise.resolve(xe.runEditorCommand(Ie,this,De))),this._contextKeyService);this._actions.set(Be.id,Be)}const Ae=()=>!this._configuration.options.get(90)&&this._configuration.options.get(36).enabled;this._register(new k.DragAndDropObserver(this._domElement,{onDragOver:xe=>{if(!Ae())return;const Be=this.getTargetAtClientPoint(xe.clientX,xe.clientY);Be?.position&&this.showDropIndicatorAt(Be.position)},onDrop:async xe=>{if(!Ae()||(this.removeDropIndicator(),!xe.dataTransfer))return;const Be=this.getTargetAtClientPoint(xe.clientX,xe.clientY);Be?.position&&this._onDropIntoEditor.fire({position:Be.position,event:xe})},onDragLeave:()=>{this.removeDropIndicator()},onDragEnd:()=>{this.removeDropIndicator()}})),this._codeEditorService.addCodeEditor(this)}writeScreenReaderContent(z){var H;(H=this._modelData)===null||H===void 0||H.view.writeScreenReaderContent(z)}_createConfiguration(z,H,Y){return new _.EditorConfiguration(z,H,this._domElement,Y)}getId(){return this.getEditorType()+":"+this._id}getEditorType(){return d.EditorType.ICodeEditor}dispose(){this._codeEditorService.removeCodeEditor(this),this._focusTracker.dispose(),this._actions.clear(),this._contentWidgets={},this._overlayWidgets={},this._removeDecorationTypes(),this._postDetachModelCleanup(this._detachModel()),this._onDidDispose.fire(),super.dispose()}invokeWithinContext(z){return this._instantiationService.invokeFunction(z)}updateOptions(z){this._configuration.updateOptions(z||{})}getOptions(){return this._configuration.options}getOption(z){return this._configuration.options.get(z)}getRawOptions(){return this._configuration.getRawOptions()}getOverflowWidgetsDomNode(){return this._overflowWidgetsDomNode}getConfiguredWordAtPosition(z){return this._modelData?M.WordOperations.getWordAtPosition(this._modelData.model,this._configuration.options.get(129),z):null}getValue(z=null){if(!this._modelData)return"";const H=!!(z&&z.preserveBOM);let Y=0;return z&&z.lineEnding&&z.lineEnding===`
+`?Y=1:z&&z.lineEnding&&z.lineEnding===`\r
+`&&(Y=2),this._modelData.model.getValue(Y,H)}setValue(z){this._modelData&&this._modelData.model.setValue(z)}getModel(){return this._modelData?this._modelData.model:null}setModel(z=null){var H;const Y=z;if(this._modelData===null&&Y===null||this._modelData&&this._modelData.model===Y)return;const j={oldModelUrl:((H=this._modelData)===null||H===void 0?void 0:H.model.uri)||null,newModelUrl:Y?.uri||null};this._onWillChangeModel.fire(j);const Z=this.hasTextFocus(),ee=this._detachModel();this._attachModel(Y),Z&&this.hasModel()&&this.focus(),this._removeDecorationTypes(),this._onDidChangeModel.fire(j),this._postDetachModelCleanup(ee),this._contributions.onAfterModelAttached()}_removeDecorationTypes(){if(this._decorationTypeKeysToIds={},this._decorationTypeSubtypes){for(const z in this._decorationTypeSubtypes){const H=this._decorationTypeSubtypes[z];for(const Y in H)this._removeDecorationType(z+"-"+Y)}this._decorationTypeSubtypes={}}}getVisibleRanges(){return this._modelData?this._modelData.viewModel.getVisibleRanges():[]}getVisibleRangesPlusViewportAboveBelow(){return this._modelData?this._modelData.viewModel.getVisibleRangesPlusViewportAboveBelow():[]}getWhitespaces(){return this._modelData?this._modelData.viewModel.viewLayout.getWhitespaces():[]}static _getVerticalOffsetAfterPosition(z,H,Y,j){const Z=z.model.validatePosition({lineNumber:H,column:Y}),ee=z.viewModel.coordinatesConverter.convertModelPositionToViewPosition(Z);return z.viewModel.viewLayout.getVerticalOffsetAfterLineNumber(ee.lineNumber,j)}getTopForLineNumber(z,H=!1){return this._modelData?V._getVerticalOffsetForPosition(this._modelData,z,1,H):-1}getTopForPosition(z,H){return this._modelData?V._getVerticalOffsetForPosition(this._modelData,z,H,!1):-1}static _getVerticalOffsetForPosition(z,H,Y,j=!1){const Z=z.model.validatePosition({lineNumber:H,column:Y}),ee=z.viewModel.coordinatesConverter.convertModelPositionToViewPosition(Z);return z.viewModel.viewLayout.getVerticalOffsetForLineNumber(ee.lineNumber,j)}getBottomForLineNumber(z,H=!1){return this._modelData?V._getVerticalOffsetAfterPosition(this._modelData,z,1,H):-1}setHiddenAreas(z,H){var Y;(Y=this._modelData)===null||Y===void 0||Y.viewModel.setHiddenAreas(z.map(j=>u.Range.lift(j)),H)}getVisibleColumnFromPosition(z){if(!this._modelData)return z.column;const H=this._modelData.model.validatePosition(z),Y=this._modelData.model.getOptions().tabSize;return t.CursorColumns.visibleColumnFromColumn(this._modelData.model.getLineContent(H.lineNumber),H.column,Y)+1}getPosition(){return this._modelData?this._modelData.viewModel.getPosition():null}setPosition(z,H="api"){if(this._modelData){if(!r.Position.isIPosition(z))throw new Error("Invalid arguments");this._modelData.viewModel.setSelections(H,[{selectionStartLineNumber:z.lineNumber,selectionStartColumn:z.column,positionLineNumber:z.lineNumber,positionColumn:z.column}])}}_sendRevealRange(z,H,Y,j){if(!this._modelData)return;if(!u.Range.isIRange(z))throw new Error("Invalid arguments");const Z=this._modelData.model.validateRange(z),ee=this._modelData.viewModel.coordinatesConverter.convertModelRangeToViewRange(Z);this._modelData.viewModel.revealRange("api",Y,ee,H,j)}revealLine(z,H=0){this._revealLine(z,0,H)}revealLineInCenter(z,H=0){this._revealLine(z,1,H)}revealLineInCenterIfOutsideViewport(z,H=0){this._revealLine(z,2,H)}revealLineNearTop(z,H=0){this._revealLine(z,5,H)}_revealLine(z,H,Y){if(typeof z!="number")throw new Error("Invalid arguments");this._sendRevealRange(new u.Range(z,1,z,1),H,!1,Y)}revealPosition(z,H=0){this._revealPosition(z,0,!0,H)}revealPositionInCenter(z,H=0){this._revealPosition(z,1,!0,H)}revealPositionInCenterIfOutsideViewport(z,H=0){this._revealPosition(z,2,!0,H)}revealPositionNearTop(z,H=0){this._revealPosition(z,5,!0,H)}_revealPosition(z,H,Y,j){if(!r.Position.isIPosition(z))throw new Error("Invalid arguments");this._sendRevealRange(new u.Range(z.lineNumber,z.column,z.lineNumber,z.column),H,Y,j)}getSelection(){return this._modelData?this._modelData.viewModel.getSelection():null}getSelections(){return this._modelData?this._modelData.viewModel.getSelections():null}setSelection(z,H="api"){const Y=f.Selection.isISelection(z),j=u.Range.isIRange(z);if(!Y&&!j)throw new Error("Invalid arguments");if(Y)this._setSelectionImpl(z,H);else if(j){const Z={selectionStartLineNumber:z.startLineNumber,selectionStartColumn:z.startColumn,positionLineNumber:z.endLineNumber,positionColumn:z.endColumn};this._setSelectionImpl(Z,H)}}_setSelectionImpl(z,H){if(!this._modelData)return;const Y=new f.Selection(z.selectionStartLineNumber,z.selectionStartColumn,z.positionLineNumber,z.positionColumn);this._modelData.viewModel.setSelections(H,[Y])}revealLines(z,H,Y=0){this._revealLines(z,H,0,Y)}revealLinesInCenter(z,H,Y=0){this._revealLines(z,H,1,Y)}revealLinesInCenterIfOutsideViewport(z,H,Y=0){this._revealLines(z,H,2,Y)}revealLinesNearTop(z,H,Y=0){this._revealLines(z,H,5,Y)}_revealLines(z,H,Y,j){if(typeof z!="number"||typeof H!="number")throw new Error("Invalid arguments");this._sendRevealRange(new u.Range(z,1,H,1),Y,!1,j)}revealRange(z,H=0,Y=!1,j=!0){this._revealRange(z,Y?1:0,j,H)}revealRangeInCenter(z,H=0){this._revealRange(z,1,!0,H)}revealRangeInCenterIfOutsideViewport(z,H=0){this._revealRange(z,2,!0,H)}revealRangeNearTop(z,H=0){this._revealRange(z,5,!0,H)}revealRangeNearTopIfOutsideViewport(z,H=0){this._revealRange(z,6,!0,H)}revealRangeAtTop(z,H=0){this._revealRange(z,3,!0,H)}_revealRange(z,H,Y,j){if(!u.Range.isIRange(z))throw new Error("Invalid arguments");this._sendRevealRange(u.Range.lift(z),H,Y,j)}setSelections(z,H="api",Y=0){if(this._modelData){if(!z||z.length===0)throw new Error("Invalid arguments");for(let j=0,Z=z.length;j<Z;j++)if(!f.Selection.isISelection(z[j]))throw new Error("Invalid arguments");this._modelData.viewModel.setSelections(H,z,Y)}}getContentWidth(){return this._modelData?this._modelData.viewModel.viewLayout.getContentWidth():-1}getScrollWidth(){return this._modelData?this._modelData.viewModel.viewLayout.getScrollWidth():-1}getScrollLeft(){return this._modelData?this._modelData.viewModel.viewLayout.getCurrentScrollLeft():-1}getContentHeight(){return this._modelData?this._modelData.viewModel.viewLayout.getContentHeight():-1}getScrollHeight(){return this._modelData?this._modelData.viewModel.viewLayout.getScrollHeight():-1}getScrollTop(){return this._modelData?this._modelData.viewModel.viewLayout.getCurrentScrollTop():-1}setScrollLeft(z,H=1){if(this._modelData){if(typeof z!="number")throw new Error("Invalid arguments");this._modelData.viewModel.viewLayout.setScrollPosition({scrollLeft:z},H)}}setScrollTop(z,H=1){if(this._modelData){if(typeof z!="number")throw new Error("Invalid arguments");this._modelData.viewModel.viewLayout.setScrollPosition({scrollTop:z},H)}}setScrollPosition(z,H=1){this._modelData&&this._modelData.viewModel.viewLayout.setScrollPosition(z,H)}hasPendingScrollAnimation(){return this._modelData?this._modelData.viewModel.viewLayout.hasPendingScrollAnimation():!1}saveViewState(){if(!this._modelData)return null;const z=this._contributions.saveViewState(),H=this._modelData.viewModel.saveCursorState(),Y=this._modelData.viewModel.saveState();return{cursorState:H,viewState:Y,contributionsState:z}}restoreViewState(z){if(!this._modelData||!this._modelData.hasRealView)return;const H=z;if(H&&H.cursorState&&H.viewState){const Y=H.cursorState;Array.isArray(Y)?Y.length>0&&this._modelData.viewModel.restoreCursorState(Y):this._modelData.viewModel.restoreCursorState([Y]),this._contributions.restoreViewState(H.contributionsState||{});const j=this._modelData.viewModel.reduceRestoreState(H.viewState);this._modelData.view.restoreState(j)}}handleInitialized(){var z;(z=this._getViewModel())===null||z===void 0||z.visibleLinesStabilized()}getContribution(z){return this._contributions.get(z)}getActions(){return Array.from(this._actions.values())}getSupportedActions(){let z=this.getActions();return z=z.filter(H=>H.isSupported()),z}getAction(z){return this._actions.get(z)||null}trigger(z,H,Y){switch(Y=Y||{},H){case"compositionStart":this._startComposition();return;case"compositionEnd":this._endComposition(z);return;case"type":{const Z=Y;this._type(z,Z.text||"");return}case"replacePreviousChar":{const Z=Y;this._compositionType(z,Z.text||"",Z.replaceCharCnt||0,0,0);return}case"compositionType":{const Z=Y;this._compositionType(z,Z.text||"",Z.replacePrevCharCnt||0,Z.replaceNextCharCnt||0,Z.positionDelta||0);return}case"paste":{const Z=Y;this._paste(z,Z.text||"",Z.pasteOnNewLine||!1,Z.multicursorText||null,Z.mode||null);return}case"cut":this._cut(z);return}const j=this.getAction(H);if(j){Promise.resolve(j.run(Y)).then(void 0,y.onUnexpectedError);return}this._modelData&&(this._triggerEditorCommand(z,H,Y)||this._triggerCommand(H,Y))}_triggerCommand(z,H){this._commandService.executeCommand(z,H)}_startComposition(){this._modelData&&(this._modelData.viewModel.startComposition(),this._onDidCompositionStart.fire())}_endComposition(z){this._modelData&&(this._modelData.viewModel.endComposition(z),this._onDidCompositionEnd.fire())}_type(z,H){!this._modelData||H.length===0||(z==="keyboard"&&this._onWillType.fire(H),this._modelData.viewModel.type(H,z),z==="keyboard"&&this._onDidType.fire(H))}_compositionType(z,H,Y,j,Z){this._modelData&&this._modelData.viewModel.compositionType(H,Y,j,Z,z)}_paste(z,H,Y,j,Z){if(!this._modelData||H.length===0)return;const ee=this._modelData.viewModel,le=ee.getSelection().getStartPosition();ee.paste(H,Y,j,z);const ue=ee.getSelection().getStartPosition();z==="keyboard"&&this._onDidPaste.fire({range:new u.Range(le.lineNumber,le.column,ue.lineNumber,ue.column),languageId:Z})}_cut(z){this._modelData&&this._modelData.viewModel.cut(z)}_triggerEditorCommand(z,H,Y){const j=v.EditorExtensionsRegistry.getEditorCommand(H);return j?(Y=Y||{},Y.source=z,this._instantiationService.invokeFunction(Z=>{Promise.resolve(j.runEditorCommand(Z,this,Y)).then(void 0,y.onUnexpectedError)}),!0):!1}_getViewModel(){return this._modelData?this._modelData.viewModel:null}pushUndoStop(){return!this._modelData||this._configuration.options.get(90)?!1:(this._modelData.model.pushStackElement(),!0)}popUndoStop(){return!this._modelData||this._configuration.options.get(90)?!1:(this._modelData.model.popStackElement(),!0)}executeEdits(z,H,Y){if(!this._modelData||this._configuration.options.get(90))return!1;let j;return Y?Array.isArray(Y)?j=()=>Y:j=Y:j=()=>null,this._modelData.viewModel.executeEdits(z,H,j),!0}executeCommand(z,H){this._modelData&&this._modelData.viewModel.executeCommand(H,z)}executeCommands(z,H){this._modelData&&this._modelData.viewModel.executeCommands(H,z)}createDecorationsCollection(z){return new Q(this,z)}changeDecorations(z){return this._modelData?this._modelData.model.changeDecorations(z,this._id):null}getLineDecorations(z){return this._modelData?this._modelData.model.getLineDecorations(z,this._id,(0,n.filterValidationDecorations)(this._configuration.options)):null}getDecorationsInRange(z){return this._modelData?this._modelData.model.getDecorationsInRange(z,this._id,(0,n.filterValidationDecorations)(this._configuration.options)):null}deltaDecorations(z,H){return this._modelData?z.length===0&&H.length===0?z:this._modelData.model.deltaDecorations(z,H,this._id):[]}removeDecorations(z){!this._modelData||z.length===0||this._modelData.model.changeDecorations(H=>{H.deltaDecorations(z,[])})}removeDecorationsByType(z){const H=this._decorationTypeKeysToIds[z];H&&this.deltaDecorations(H,[]),this._decorationTypeKeysToIds.hasOwnProperty(z)&&delete this._decorationTypeKeysToIds[z],this._decorationTypeSubtypes.hasOwnProperty(z)&&delete this._decorationTypeSubtypes[z]}getLayoutInfo(){return this._configuration.options.get(143)}createOverviewRuler(z){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.createOverviewRuler(z)}getContainerDomNode(){return this._domElement}getDomNode(){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.domNode.domNode}delegateVerticalScrollbarPointerDown(z){!this._modelData||!this._modelData.hasRealView||this._modelData.view.delegateVerticalScrollbarPointerDown(z)}delegateScrollFromMouseWheelEvent(z){!this._modelData||!this._modelData.hasRealView||this._modelData.view.delegateScrollFromMouseWheelEvent(z)}layout(z,H=!1){this._configuration.observeContainer(z),H||this.render()}focus(){!this._modelData||!this._modelData.hasRealView||this._modelData.view.focus()}hasTextFocus(){return!this._modelData||!this._modelData.hasRealView?!1:this._modelData.view.isFocused()}hasWidgetFocus(){return this._focusTracker&&this._focusTracker.hasFocus()}addContentWidget(z){const H={widget:z,position:z.getPosition()};this._contentWidgets.hasOwnProperty(z.getId())&&console.warn("Overwriting a content widget with the same id:"+z.getId()),this._contentWidgets[z.getId()]=H,this._modelData&&this._modelData.hasRealView&&this._modelData.view.addContentWidget(H)}layoutContentWidget(z){const H=z.getId();if(this._contentWidgets.hasOwnProperty(H)){const Y=this._contentWidgets[H];Y.position=z.getPosition(),this._modelData&&this._modelData.hasRealView&&this._modelData.view.layoutContentWidget(Y)}}removeContentWidget(z){const H=z.getId();if(this._contentWidgets.hasOwnProperty(H)){const Y=this._contentWidgets[H];delete this._contentWidgets[H],this._modelData&&this._modelData.hasRealView&&this._modelData.view.removeContentWidget(Y)}}addOverlayWidget(z){const H={widget:z,position:z.getPosition()};this._overlayWidgets.hasOwnProperty(z.getId())&&console.warn("Overwriting an overlay widget with the same id."),this._overlayWidgets[z.getId()]=H,this._modelData&&this._modelData.hasRealView&&this._modelData.view.addOverlayWidget(H)}layoutOverlayWidget(z){const H=z.getId();if(this._overlayWidgets.hasOwnProperty(H)){const Y=this._overlayWidgets[H];Y.position=z.getPosition(),this._modelData&&this._modelData.hasRealView&&this._modelData.view.layoutOverlayWidget(Y)}}removeOverlayWidget(z){const H=z.getId();if(this._overlayWidgets.hasOwnProperty(H)){const Y=this._overlayWidgets[H];delete this._overlayWidgets[H],this._modelData&&this._modelData.hasRealView&&this._modelData.view.removeOverlayWidget(Y)}}addGlyphMarginWidget(z){const H={widget:z,position:z.getPosition()};this._glyphMarginWidgets.hasOwnProperty(z.getId())&&console.warn("Overwriting a glyph margin widget with the same id."),this._glyphMarginWidgets[z.getId()]=H,this._modelData&&this._modelData.hasRealView&&this._modelData.view.addGlyphMarginWidget(H)}layoutGlyphMarginWidget(z){const H=z.getId();if(this._glyphMarginWidgets.hasOwnProperty(H)){const Y=this._glyphMarginWidgets[H];Y.position=z.getPosition(),this._modelData&&this._modelData.hasRealView&&this._modelData.view.layoutGlyphMarginWidget(Y)}}removeGlyphMarginWidget(z){const H=z.getId();if(this._glyphMarginWidgets.hasOwnProperty(H)){const Y=this._glyphMarginWidgets[H];delete this._glyphMarginWidgets[H],this._modelData&&this._modelData.hasRealView&&this._modelData.view.removeGlyphMarginWidget(Y)}}changeViewZones(z){!this._modelData||!this._modelData.hasRealView||this._modelData.view.change(z)}getTargetAtClientPoint(z,H){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.getTargetAtClientPoint(z,H)}getScrolledVisiblePosition(z){if(!this._modelData||!this._modelData.hasRealView)return null;const H=this._modelData.model.validatePosition(z),Y=this._configuration.options,j=Y.get(143),Z=V._getVerticalOffsetForPosition(this._modelData,H.lineNumber,H.column)-this.getScrollTop(),ee=this._modelData.view.getOffsetForColumn(H.lineNumber,H.column)+j.glyphMarginWidth+j.lineNumbersWidth+j.decorationsWidth-this.getScrollLeft();return{top:Z,left:ee,height:Y.get(66)}}getOffsetForColumn(z,H){return!this._modelData||!this._modelData.hasRealView?-1:this._modelData.view.getOffsetForColumn(z,H)}render(z=!1){!this._modelData||!this._modelData.hasRealView||this._modelData.view.render(!0,z)}setAriaOptions(z){!this._modelData||!this._modelData.hasRealView||this._modelData.view.setAriaOptions(z)}applyFontInfo(z){(0,x.applyFontInfo)(z,this._configuration.options.get(50))}setBanner(z,H){this._bannerDomNode&&this._domElement.contains(this._bannerDomNode)&&this._domElement.removeChild(this._bannerDomNode),this._bannerDomNode=z,this._configuration.setReservedHeight(z?H:0),this._bannerDomNode&&this._domElement.prepend(this._bannerDomNode)}_attachModel(z){if(!z){this._modelData=null;return}const H=[];this._domElement.setAttribute("data-mode-id",z.getLanguageId()),this._configuration.setIsDominatedByLongLines(z.isDominatedByLongLines()),this._configuration.setModelLineCount(z.getLineCount());const Y=z.onBeforeAttached(),j=new h.ViewModel(this._id,this._configuration,z,N.DOMLineBreaksComputerFactory.create(k.getWindow(this._domElement)),P.MonospaceLineBreaksComputerFactory.create(this._configuration.options),le=>k.scheduleAtNextAnimationFrame(k.getWindow(this._domElement),le),this.languageConfigurationService,this._themeService,Y);H.push(z.onWillDispose(()=>this.setModel(null))),H.push(j.onEvent(le=>{switch(le.kind){case 0:this._onDidContentSizeChange.fire(le);break;case 1:this._editorTextFocus.setValue(le.hasFocus);break;case 2:this._onDidScrollChange.fire(le);break;case 3:this._onDidChangeViewZones.fire();break;case 4:this._onDidChangeHiddenAreas.fire();break;case 5:this._onDidAttemptReadOnlyEdit.fire();break;case 6:{if(le.reachedMaxCursorCount){const ve=this.getOption(79),Ce=L.localize(0,null,ve);this._notificationService.prompt(I.Severity.Warning,Ce,[{label:"Find and Replace",run:()=>{this._commandService.executeCommand("editor.action.startFindReplaceAction")}},{label:L.localize(1,null),run:()=>{this._commandService.executeCommand("workbench.action.openSettings2",{query:"editor.multiCursorLimit"})}}])}const ue=[];for(let ve=0,Ce=le.selections.length;ve<Ce;ve++)ue[ve]=le.selections[ve].getPosition();const ce={position:ue[0],secondaryPositions:ue.slice(1),reason:le.reason,source:le.source};this._onDidChangeCursorPosition.fire(ce);const pe={selection:le.selections[0],secondarySelections:le.selections.slice(1),modelVersionId:le.modelVersionId,oldSelections:le.oldSelections,oldModelVersionId:le.oldModelVersionId,source:le.source,reason:le.reason};this._onDidChangeCursorSelection.fire(pe);break}case 7:this._onDidChangeModelDecorations.fire(le.event);break;case 8:this._domElement.setAttribute("data-mode-id",z.getLanguageId()),this._onDidChangeModelLanguage.fire(le.event);break;case 9:this._onDidChangeModelLanguageConfiguration.fire(le.event);break;case 10:this._onDidChangeModelContent.fire(le.event);break;case 11:this._onDidChangeModelOptions.fire(le.event);break;case 12:this._onDidChangeModelTokens.fire(le.event);break}}));const[Z,ee]=this._createView(j);if(ee){this._domElement.appendChild(Z.domNode.domNode);let le=Object.keys(this._contentWidgets);for(let ue=0,ce=le.length;ue<ce;ue++){const pe=le[ue];Z.addContentWidget(this._contentWidgets[pe])}le=Object.keys(this._overlayWidgets);for(let ue=0,ce=le.length;ue<ce;ue++){const pe=le[ue];Z.addOverlayWidget(this._overlayWidgets[pe])}le=Object.keys(this._glyphMarginWidgets);for(let ue=0,ce=le.length;ue<ce;ue++){const pe=le[ue];Z.addGlyphMarginWidget(this._glyphMarginWidgets[pe])}Z.render(!1,!0),Z.domNode.domNode.setAttribute("data-uri",z.uri.toString())}this._modelData=new F(z,j,Z,ee,H,Y)}_createView(z){let H;this.isSimpleWidget?H={paste:(Z,ee,le,ue)=>{this._paste("keyboard",Z,ee,le,ue)},type:Z=>{this._type("keyboard",Z)},compositionType:(Z,ee,le,ue)=>{this._compositionType("keyboard",Z,ee,le,ue)},startComposition:()=>{this._startComposition()},endComposition:()=>{this._endComposition("keyboard")},cut:()=>{this._cut("keyboard")}}:H={paste:(Z,ee,le,ue)=>{const ce={text:Z,pasteOnNewLine:ee,multicursorText:le,mode:ue};this._commandService.executeCommand("paste",ce)},type:Z=>{const ee={text:Z};this._commandService.executeCommand("type",ee)},compositionType:(Z,ee,le,ue)=>{if(le||ue){const ce={text:Z,replacePrevCharCnt:ee,replaceNextCharCnt:le,positionDelta:ue};this._commandService.executeCommand("compositionType",ce)}else{const ce={text:Z,replaceCharCnt:ee};this._commandService.executeCommand("replacePreviousChar",ce)}},startComposition:()=>{this._commandService.executeCommand("compositionStart",{})},endComposition:()=>{this._commandService.executeCommand("compositionEnd",{})},cut:()=>{this._commandService.executeCommand("cut",{})}};const Y=new i.ViewUserInputEvents(z.coordinatesConverter);return Y.onKeyDown=Z=>this._onKeyDown.fire(Z),Y.onKeyUp=Z=>this._onKeyUp.fire(Z),Y.onContextMenu=Z=>this._onContextMenu.fire(Z),Y.onMouseMove=Z=>this._onMouseMove.fire(Z),Y.onMouseLeave=Z=>this._onMouseLeave.fire(Z),Y.onMouseDown=Z=>this._onMouseDown.fire(Z),Y.onMouseUp=Z=>this._onMouseUp.fire(Z),Y.onMouseDrag=Z=>this._onMouseDrag.fire(Z),Y.onMouseDrop=Z=>this._onMouseDrop.fire(Z),Y.onMouseDropCanceled=Z=>this._onMouseDropCanceled.fire(Z),Y.onMouseWheel=Z=>this._onMouseWheel.fire(Z),[new a.View(H,this._configuration,this._themeService.getColorTheme(),z,Y,this._overflowWidgetsDomNode,this._instantiationService),!0]}_postDetachModelCleanup(z){z?.removeAllDecorationsWithOwnerId(this._id)}_detachModel(){if(!this._modelData)return null;const z=this._modelData.model,H=this._modelData.hasRealView?this._modelData.view.domNode.domNode:null;return this._modelData.dispose(),this._modelData=null,this._domElement.removeAttribute("data-mode-id"),H&&this._domElement.contains(H)&&this._domElement.removeChild(H),this._bannerDomNode&&this._domElement.contains(this._bannerDomNode)&&this._domElement.removeChild(this._bannerDomNode),z}_removeDecorationType(z){this._codeEditorService.removeDecorationType(z)}hasModel(){return this._modelData!==null}showDropIndicatorAt(z){const H=[{range:new u.Range(z.lineNumber,z.column,z.lineNumber,z.column),options:V.dropIntoEditorDecorationOptions}];this._dropIntoEditorDecorations.set(H),this.revealPosition(z,1)}removeDropIndicator(){this._dropIntoEditorDecorations.clear()}setContextValue(z,H){this._contextKeyService.createKey(z,H)}};e.CodeEditorWidget=q,q.dropIntoEditorDecorationOptions=l.ModelDecorationOptions.register({description:"workbench-dnd-target",className:"dnd-target"}),e.CodeEditorWidget=q=V=ke([ge(3,w.IInstantiationService),ge(4,b.ICodeEditorService),ge(5,m.ICommandService),ge(6,C.IContextKeyService),ge(7,T.IThemeService),ge(8,I.INotificationService),ge(9,A.IAccessibilityService),ge(10,R.ILanguageConfigurationService),ge(11,O.ILanguageFeaturesService)],q);class ie extends S.Disposable{constructor(z){super(),this._emitterOptions=z,this._onDidChangeToTrue=this._register(new E.Emitter(this._emitterOptions)),this.onDidChangeToTrue=this._onDidChangeToTrue.event,this._onDidChangeToFalse=this._register(new E.Emitter(this._emitterOptions)),this.onDidChangeToFalse=this._onDidChangeToFalse.event,this._value=0}setValue(z){const H=z?2:1;this._value!==H&&(this._value=H,this._value===2?this._onDidChangeToTrue.fire():this._value===1&&this._onDidChangeToFalse.fire())}}e.BooleanEventEmitter=ie;class ae extends E.Emitter{constructor(z,H){super({deliveryQueue:H}),this._contributions=z}fire(z){this._contributions.onBeforeInteractionEvent(),super.fire(z)}}class ne extends S.Disposable{constructor(z,H){super(),this._editor=z,H.createKey("editorId",z.getId()),this._editorSimpleInput=s.EditorContextKeys.editorSimpleInput.bindTo(H),this._editorFocus=s.EditorContextKeys.focus.bindTo(H),this._textInputFocus=s.EditorContextKeys.textInputFocus.bindTo(H),this._editorTextFocus=s.EditorContextKeys.editorTextFocus.bindTo(H),this._tabMovesFocus=s.EditorContextKeys.tabMovesFocus.bindTo(H),this._editorReadonly=s.EditorContextKeys.readOnly.bindTo(H),this._inDiffEditor=s.EditorContextKeys.inDiffEditor.bindTo(H),this._editorColumnSelection=s.EditorContextKeys.columnSelection.bindTo(H),this._hasMultipleSelections=s.EditorContextKeys.hasMultipleSelections.bindTo(H),this._hasNonEmptySelection=s.EditorContextKeys.hasNonEmptySelection.bindTo(H),this._canUndo=s.EditorContextKeys.canUndo.bindTo(H),this._canRedo=s.EditorContextKeys.canRedo.bindTo(H),this._register(this._editor.onDidChangeConfiguration(()=>this._updateFromConfig())),this._register(this._editor.onDidChangeCursorSelection(()=>this._updateFromSelection())),this._register(this._editor.onDidFocusEditorWidget(()=>this._updateFromFocus())),this._register(this._editor.onDidBlurEditorWidget(()=>this._updateFromFocus())),this._register(this._editor.onDidFocusEditorText(()=>this._updateFromFocus())),this._register(this._editor.onDidBlurEditorText(()=>this._updateFromFocus())),this._register(this._editor.onDidChangeModel(()=>this._updateFromModel())),this._register(this._editor.onDidChangeConfiguration(()=>this._updateFromModel())),this._register(W.TabFocus.onDidChangeTabFocus(Y=>this._tabMovesFocus.set(Y))),this._updateFromConfig(),this._updateFromSelection(),this._updateFromFocus(),this._updateFromModel(),this._editorSimpleInput.set(this._editor.isSimpleWidget)}_updateFromConfig(){const z=this._editor.getOptions();this._tabMovesFocus.set(W.TabFocus.getTabFocusMode()),this._editorReadonly.set(z.get(90)),this._inDiffEditor.set(z.get(61)),this._editorColumnSelection.set(z.get(22))}_updateFromSelection(){const z=this._editor.getSelections();z?(this._hasMultipleSelections.set(z.length>1),this._hasNonEmptySelection.set(z.some(H=>!H.isEmpty()))):(this._hasMultipleSelections.reset(),this._hasNonEmptySelection.reset())}_updateFromFocus(){this._editorFocus.set(this._editor.hasWidgetFocus()&&!this._editor.isSimpleWidget),this._editorTextFocus.set(this._editor.hasTextFocus()&&!this._editor.isSimpleWidget),this._textInputFocus.set(this._editor.hasTextFocus())}_updateFromModel(){const z=this._editor.getModel();this._canUndo.set(!!(z&&z.canUndo())),this._canRedo.set(!!(z&&z.canRedo()))}}class $ extends S.Disposable{constructor(z,H,Y){super(),this._editor=z,this._contextKeyService=H,this._languageFeaturesService=Y,this._langId=s.EditorContextKeys.languageId.bindTo(H),this._hasCompletionItemProvider=s.EditorContextKeys.hasCompletionItemProvider.bindTo(H),this._hasCodeActionsProvider=s.EditorContextKeys.hasCodeActionsProvider.bindTo(H),this._hasCodeLensProvider=s.EditorContextKeys.hasCodeLensProvider.bindTo(H),this._hasDefinitionProvider=s.EditorContextKeys.hasDefinitionProvider.bindTo(H),this._hasDeclarationProvider=s.EditorContextKeys.hasDeclarationProvider.bindTo(H),this._hasImplementationProvider=s.EditorContextKeys.hasImplementationProvider.bindTo(H),this._hasTypeDefinitionProvider=s.EditorContextKeys.hasTypeDefinitionProvider.bindTo(H),this._hasHoverProvider=s.EditorContextKeys.hasHoverProvider.bindTo(H),this._hasDocumentHighlightProvider=s.EditorContextKeys.hasDocumentHighlightProvider.bindTo(H),this._hasDocumentSymbolProvider=s.EditorContextKeys.hasDocumentSymbolProvider.bindTo(H),this._hasReferenceProvider=s.EditorContextKeys.hasReferenceProvider.bindTo(H),this._hasRenameProvider=s.EditorContextKeys.hasRenameProvider.bindTo(H),this._hasSignatureHelpProvider=s.EditorContextKeys.hasSignatureHelpProvider.bindTo(H),this._hasInlayHintsProvider=s.EditorContextKeys.hasInlayHintsProvider.bindTo(H),this._hasDocumentFormattingProvider=s.EditorContextKeys.hasDocumentFormattingProvider.bindTo(H),this._hasDocumentSelectionFormattingProvider=s.EditorContextKeys.hasDocumentSelectionFormattingProvider.bindTo(H),this._hasMultipleDocumentFormattingProvider=s.EditorContextKeys.hasMultipleDocumentFormattingProvider.bindTo(H),this._hasMultipleDocumentSelectionFormattingProvider=s.EditorContextKeys.hasMultipleDocumentSelectionFormattingProvider.bindTo(H),this._isInWalkThrough=s.EditorContextKeys.isInWalkThroughSnippet.bindTo(H);const j=()=>this._update();this._register(z.onDidChangeModel(j)),this._register(z.onDidChangeModelLanguage(j)),this._register(Y.completionProvider.onDidChange(j)),this._register(Y.codeActionProvider.onDidChange(j)),this._register(Y.codeLensProvider.onDidChange(j)),this._register(Y.definitionProvider.onDidChange(j)),this._register(Y.declarationProvider.onDidChange(j)),this._register(Y.implementationProvider.onDidChange(j)),this._register(Y.typeDefinitionProvider.onDidChange(j)),this._register(Y.hoverProvider.onDidChange(j)),this._register(Y.documentHighlightProvider.onDidChange(j)),this._register(Y.documentSymbolProvider.onDidChange(j)),this._register(Y.referenceProvider.onDidChange(j)),this._register(Y.renameProvider.onDidChange(j)),this._register(Y.documentFormattingEditProvider.onDidChange(j)),this._register(Y.documentRangeFormattingEditProvider.onDidChange(j)),this._register(Y.signatureHelpProvider.onDidChange(j)),this._register(Y.inlayHintsProvider.onDidChange(j)),j()}dispose(){super.dispose()}reset(){this._contextKeyService.bufferChangeEvents(()=>{this._langId.reset(),this._hasCompletionItemProvider.reset(),this._hasCodeActionsProvider.reset(),this._hasCodeLensProvider.reset(),this._hasDefinitionProvider.reset(),this._hasDeclarationProvider.reset(),this._hasImplementationProvider.reset(),this._hasTypeDefinitionProvider.reset(),this._hasHoverProvider.reset(),this._hasDocumentHighlightProvider.reset(),this._hasDocumentSymbolProvider.reset(),this._hasReferenceProvider.reset(),this._hasRenameProvider.reset(),this._hasDocumentFormattingProvider.reset(),this._hasDocumentSelectionFormattingProvider.reset(),this._hasSignatureHelpProvider.reset(),this._isInWalkThrough.reset()})}_update(){const z=this._editor.getModel();if(!z){this.reset();return}this._contextKeyService.bufferChangeEvents(()=>{this._langId.set(z.getLanguageId()),this._hasCompletionItemProvider.set(this._languageFeaturesService.completionProvider.has(z)),this._hasCodeActionsProvider.set(this._languageFeaturesService.codeActionProvider.has(z)),this._hasCodeLensProvider.set(this._languageFeaturesService.codeLensProvider.has(z)),this._hasDefinitionProvider.set(this._languageFeaturesService.definitionProvider.has(z)),this._hasDeclarationProvider.set(this._languageFeaturesService.declarationProvider.has(z)),this._hasImplementationProvider.set(this._languageFeaturesService.implementationProvider.has(z)),this._hasTypeDefinitionProvider.set(this._languageFeaturesService.typeDefinitionProvider.has(z)),this._hasHoverProvider.set(this._languageFeaturesService.hoverProvider.has(z)),this._hasDocumentHighlightProvider.set(this._languageFeaturesService.documentHighlightProvider.has(z)),this._hasDocumentSymbolProvider.set(this._languageFeaturesService.documentSymbolProvider.has(z)),this._hasReferenceProvider.set(this._languageFeaturesService.referenceProvider.has(z)),this._hasRenameProvider.set(this._languageFeaturesService.renameProvider.has(z)),this._hasSignatureHelpProvider.set(this._languageFeaturesService.signatureHelpProvider.has(z)),this._hasInlayHintsProvider.set(this._languageFeaturesService.inlayHintsProvider.has(z)),this._hasDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.has(z)||this._languageFeaturesService.documentRangeFormattingEditProvider.has(z)),this._hasDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.has(z)),this._hasMultipleDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.all(z).length+this._languageFeaturesService.documentRangeFormattingEditProvider.all(z).length>1),this._hasMultipleDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.all(z).length>1),this._isInWalkThrough.set(z.uri.scheme===p.Schemas.walkThroughSnippet)})}}e.EditorModeContext=$;class J extends S.Disposable{constructor(z,H){super(),this._onChange=this._register(new E.Emitter),this.onChange=this._onChange.event,this._hadFocus=void 0,this._hasDomElementFocus=!1,this._domFocusTracker=this._register(k.trackFocus(z)),this._overflowWidgetsDomNodeHasFocus=!1,this._register(this._domFocusTracker.onDidFocus(()=>{this._hasDomElementFocus=!0,this._update()})),this._register(this._domFocusTracker.onDidBlur(()=>{this._hasDomElementFocus=!1,this._update()})),H&&(this._overflowWidgetsDomNode=this._register(k.trackFocus(H)),this._register(this._overflowWidgetsDomNode.onDidFocus(()=>{this._overflowWidgetsDomNodeHasFocus=!0,this._update()})),this._register(this._overflowWidgetsDomNode.onDidBlur(()=>{this._overflowWidgetsDomNodeHasFocus=!1,this._update()})))}_update(){const z=this._hasDomElementFocus||this._overflowWidgetsDomNodeHasFocus;this._hadFocus!==z&&(this._hadFocus=z,this._onChange.fire(void 0))}hasFocus(){var z;return(z=this._hadFocus)!==null&&z!==void 0?z:!1}}class Q{get length(){return this._decorationIds.length}constructor(z,H){this._editor=z,this._decorationIds=[],this._isChangingDecorations=!1,Array.isArray(H)&&H.length>0&&this.set(H)}onDidChange(z,H,Y){return this._editor.onDidChangeModelDecorations(j=>{this._isChangingDecorations||z.call(H,j)},Y)}getRange(z){return!this._editor.hasModel()||z>=this._decorationIds.length?null:this._editor.getModel().getDecorationRange(this._decorationIds[z])}getRanges(){if(!this._editor.hasModel())return[];const z=this._editor.getModel(),H=[];for(const Y of this._decorationIds){const j=z.getDecorationRange(Y);j&&H.push(j)}return H}has(z){return this._decorationIds.includes(z.id)}clear(){this._decorationIds.length!==0&&this.set([])}set(z){try{this._isChangingDecorations=!0,this._editor.changeDecorations(H=>{this._decorationIds=H.deltaDecorations(this._decorationIds,z)})}finally{this._isChangingDecorations=!1}return this._decorationIds}append(z){let H=[];try{this._isChangingDecorations=!0,this._editor.changeDecorations(Y=>{H=Y.deltaDecorations([],z),this._decorationIds=this._decorationIds.concat(H)})}finally{this._isChangingDecorations=!1}return H}}const re=encodeURIComponent("<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 3' enable-background='new 0 0 6 3' height='3' width='6'><g fill='"),de=encodeURIComponent("'><polygon points='5.5,0 2.5,3 1.1,3 4.1,0'/><polygon points='4,0 6,2 6,0.6 5.4,0'/><polygon points='0,2 1,3 2.4,3 0,0.6'/></g></svg>");function he(G){return re+encodeURIComponent(G.toString())+de}const me=encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" height="3" width="12"><g fill="'),X=encodeURIComponent('"><circle cx="1" cy="1" r="1"/><circle cx="5" cy="1" r="1"/><circle cx="9" cy="1" r="1"/></g></svg>');function U(G){return me+encodeURIComponent(G.toString())+X}(0,T.registerThemingParticipant)((G,z)=>{const H=G.getColor(g.editorErrorForeground);H&&z.addRule(`.monaco-editor .squiggly-error { background: url("data:image/svg+xml,${he(H)}") repeat-x bottom left; }`);const Y=G.getColor(g.editorWarningForeground);Y&&z.addRule(`.monaco-editor .squiggly-warning { background: url("data:image/svg+xml,${he(Y)}") repeat-x bottom left; }`);const j=G.getColor(g.editorInfoForeground);j&&z.addRule(`.monaco-editor .squiggly-info { background: url("data:image/svg+xml,${he(j)}") repeat-x bottom left; }`);const Z=G.getColor(g.editorHintForeground);Z&&z.addRule(`.monaco-editor .squiggly-hint { background: url("data:image/svg+xml,${U(Z)}") no-repeat bottom left; }`);const ee=G.getColor(o.editorUnnecessaryCodeOpacity);ee&&z.addRule(`.monaco-editor.showUnused .squiggly-inline-unnecessary { opacity: ${ee.rgba.a}; }`)})}),define(se[259],oe([1,0,7,60,12,6,2,35,171,16,33,127,194,841,881,608,342,882,334,368,87,10,5,180,21,122,15,8,163,88,498,855,637,359,630,448]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w,D,I,T,A,P,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorWidget=void 0;let R=class extends T.DelegatingEditor{get onDidContentSizeChange(){return this._editors.onDidContentSizeChange}constructor(B,W,V,K,F,q,ie,ae){var ne;super(),this._domElement=B,this._parentContextKeyService=K,this._parentInstantiationService=F,this._audioCueService=ie,this._editorProgressService=ae,this.elements=(0,L.h)("div.monaco-diff-editor.side-by-side",{style:{position:"relative",height:"100%"}},[(0,L.h)("div.noModificationsOverlay@overlay",{style:{position:"absolute",height:"100%",visibility:"hidden"}},[(0,L.$)("span",{},"No Changes")]),(0,L.h)("div.editor.original@original",{style:{position:"absolute",height:"100%"}}),(0,L.h)("div.editor.modified@modified",{style:{position:"absolute",height:"100%"}}),(0,L.h)("div.accessibleDiffViewer@accessibleDiffViewer",{style:{position:"absolute",height:"100%"}})]),this._diffModel=(0,p.observableValue)(this,void 0),this._shouldDisposeDiffModel=!1,this.onDidChangeModel=E.Event.fromObservableLight(this._diffModel),this._contextKeyService=this._register(this._parentContextKeyService.createScoped(this._domElement)),this._instantiationService=this._parentInstantiationService.createChild(new D.ServiceCollection([C.IContextKeyService,this._contextKeyService])),this._boundarySashes=(0,p.observableValue)(this,void 0),this._accessibleDiffViewerShouldBeVisible=(0,p.observableValue)(this,!1),this._accessibleDiffViewerVisible=(0,p.derived)(this,z=>this._options.onlyShowAccessibleDiffViewer.read(z)?!0:this._accessibleDiffViewerShouldBeVisible.read(z)),this._movedBlocksLinesPart=(0,p.observableValue)(this,void 0),this._layoutInfo=(0,p.derived)(this,z=>{var H,Y,j,Z,ee;const le=this._rootSizeObserver.width.read(z),ue=this._rootSizeObserver.height.read(z),ce=(H=this._sash.read(z))===null||H===void 0?void 0:H.sashLeft.read(z),pe=ce??Math.max(5,this._editors.original.getLayoutInfo().decorationsLeft),ve=le-pe-((j=(Y=this._overviewRulerPart.read(z))===null||Y===void 0?void 0:Y.width)!==null&&j!==void 0?j:0),Ce=(ee=(Z=this._movedBlocksLinesPart.read(z))===null||Z===void 0?void 0:Z.width.read(z))!==null&&ee!==void 0?ee:0,Se=pe-Ce;return this.elements.original.style.width=Se+"px",this.elements.original.style.left="0px",this.elements.modified.style.width=ve+"px",this.elements.modified.style.left=pe+"px",this._editors.original.layout({width:Se,height:ue},!0),this._editors.modified.layout({width:ve,height:ue},!0),{modifiedEditor:this._editors.modified.getLayoutInfo(),originalEditor:this._editors.original.getLayoutInfo()}}),this._diffValue=this._diffModel.map((z,H)=>z?.diff.read(H)),this.onDidUpdateDiff=E.Event.fromObservableLight(this._diffValue),q.willCreateDiffEditor(),this._contextKeyService.createKey("isInDiffEditor",!0),this._domElement.appendChild(this.elements.root),this._register((0,S.toDisposable)(()=>this._domElement.removeChild(this.elements.root))),this._rootSizeObserver=this._register(new s.ObservableElementSizeObserver(this.elements.root,W.dimension)),this._rootSizeObserver.setAutomaticLayout((ne=W.automaticLayout)!==null&&ne!==void 0?ne:!1),this._options=new P.DiffEditorOptions(W),this._register((0,p.autorun)(z=>{this._options.setWidth(this._rootSizeObserver.width.read(z))})),this._contextKeyService.createKey(h.EditorContextKeys.isEmbeddedDiffEditor.key,!1),this._register((0,s.bindContextKey)(h.EditorContextKeys.isEmbeddedDiffEditor,this._contextKeyService,z=>this._options.isInEmbeddedEditor.read(z))),this._register((0,s.bindContextKey)(h.EditorContextKeys.comparingMovedCode,this._contextKeyService,z=>{var H;return!!(!((H=this._diffModel.read(z))===null||H===void 0)&&H.movedTextToCompare.read(z))})),this._register((0,s.bindContextKey)(h.EditorContextKeys.diffEditorRenderSideBySideInlineBreakpointReached,this._contextKeyService,z=>this._options.couldShowInlineViewBecauseOfSize.read(z))),this._register((0,s.bindContextKey)(h.EditorContextKeys.hasChanges,this._contextKeyService,z=>{var H,Y,j;return((j=(Y=(H=this._diffModel.read(z))===null||H===void 0?void 0:H.diff.read(z))===null||Y===void 0?void 0:Y.mappings.length)!==null&&j!==void 0?j:0)>0})),this._editors=this._register(this._instantiationService.createInstance(A.DiffEditorEditors,this.elements.original,this.elements.modified,this._options,V,(z,H,Y,j)=>this._createInnerEditor(z,H,Y,j))),this._overviewRulerPart=(0,_.derivedDisposable)(this,z=>this._options.renderOverviewRuler.read(z)?this._instantiationService.createInstance((0,s.readHotReloadableExport)(d.OverviewRulerFeature,z),this._editors,this.elements.root,this._diffModel,this._rootSizeObserver.width,this._rootSizeObserver.height,this._layoutInfo.map(H=>H.modifiedEditor)):void 0).recomputeInitiallyAndOnChange(this._store),this._sash=(0,_.derivedDisposable)(this,z=>{const H=this._options.renderSideBySide.read(z);return this.elements.root.classList.toggle("side-by-side",H),H?new r.DiffEditorSash(this._options,this.elements.root,{height:this._rootSizeObserver.height,width:this._rootSizeObserver.width.map((Y,j)=>{var Z,ee;return Y-((ee=(Z=this._overviewRulerPart.read(j))===null||Z===void 0?void 0:Z.width)!==null&&ee!==void 0?ee:0)})},this._boundarySashes):void 0}).recomputeInitiallyAndOnChange(this._store);const $=(0,_.derivedDisposable)(this,z=>this._instantiationService.createInstance((0,s.readHotReloadableExport)(u.HideUnchangedRegionsFeature,z),this._editors,this._diffModel,this._options)).recomputeInitiallyAndOnChange(this._store);(0,_.derivedDisposable)(this,z=>this._instantiationService.createInstance((0,s.readHotReloadableExport)(t.DiffEditorDecorations,z),this._editors,this._diffModel,this._options,this)).recomputeInitiallyAndOnChange(this._store);const J=new Set,Q=new Set;let re=!1;const de=(0,_.derivedDisposable)(this,z=>this._instantiationService.createInstance((0,s.readHotReloadableExport)(f.DiffEditorViewZones,z),(0,L.getWindow)(this._domElement),this._editors,this._diffModel,this._options,this,()=>re||$.get().isUpdatingHiddenAreas,J,Q)).recomputeInitiallyAndOnChange(this._store),he=(0,p.derived)(this,z=>{const H=de.read(z).viewZones.read(z).orig,Y=$.read(z).viewZones.read(z).origViewZones;return H.concat(Y)}),me=(0,p.derived)(this,z=>{const H=de.read(z).viewZones.read(z).mod,Y=$.read(z).viewZones.read(z).modViewZones;return H.concat(Y)});this._register((0,s.applyViewZones)(this._editors.original,he,z=>{re=z},J));let X;this._register((0,s.applyViewZones)(this._editors.modified,me,z=>{re=z,re?X=a.StableEditorScrollState.capture(this._editors.modified):(X?.restore(this._editors.modified),X=void 0)},Q)),this._accessibleDiffViewer=(0,_.derivedDisposable)(this,z=>this._instantiationService.createInstance((0,s.readHotReloadableExport)(n.AccessibleDiffViewer,z),this.elements.accessibleDiffViewer,this._accessibleDiffViewerVisible,(H,Y)=>this._accessibleDiffViewerShouldBeVisible.set(H,Y),this._options.onlyShowAccessibleDiffViewer.map(H=>!H),this._rootSizeObserver.width,this._rootSizeObserver.height,this._diffModel.map((H,Y)=>{var j;return(j=H?.diff.read(Y))===null||j===void 0?void 0:j.mappings.map(Z=>Z.lineRangeMapping)}),this._editors)).recomputeInitiallyAndOnChange(this._store);const U=this._accessibleDiffViewerVisible.map(z=>z?"hidden":"visible");this._register((0,s.applyStyle)(this.elements.modified,{visibility:U})),this._register((0,s.applyStyle)(this.elements.original,{visibility:U})),this._createDiffEditorContributions(),q.addDiffEditor(this),this._register((0,p.recomputeInitiallyAndOnChange)(this._layoutInfo)),(0,_.derivedDisposable)(this,z=>new((0,s.readHotReloadableExport)(c.MovedBlocksLinesFeature,z))(this.elements.root,this._diffModel,this._layoutInfo.map(H=>H.originalEditor),this._layoutInfo.map(H=>H.modifiedEditor),this._editors)).recomputeInitiallyAndOnChange(this._store,z=>{this._movedBlocksLinesPart.set(z,void 0)}),this._register((0,s.applyStyle)(this.elements.overlay,{width:this._layoutInfo.map((z,H)=>z.originalEditor.width+(this._options.renderSideBySide.read(H)?0:z.modifiedEditor.width)),visibility:(0,p.derived)(z=>{var H,Y;return this._options.hideUnchangedRegions.read(z)&&((Y=(H=this._diffModel.read(z))===null||H===void 0?void 0:H.diff.read(z))===null||Y===void 0?void 0:Y.mappings.length)===0?"visible":"hidden"})})),this._register(E.Event.runAndSubscribe(this._editors.modified.onDidChangeCursorPosition,z=>{var H,Y;if(z?.reason===3){const j=(Y=(H=this._diffModel.get())===null||H===void 0?void 0:H.diff.get())===null||Y===void 0?void 0:Y.mappings.find(Z=>Z.lineRangeMapping.modified.contains(z.position.lineNumber));j?.lineRangeMapping.modified.isEmpty?this._audioCueService.playAudioCue(m.AudioCue.diffLineDeleted,{source:"diffEditor.cursorPositionChanged"}):j?.lineRangeMapping.original.isEmpty?this._audioCueService.playAudioCue(m.AudioCue.diffLineInserted,{source:"diffEditor.cursorPositionChanged"}):j&&this._audioCueService.playAudioCue(m.AudioCue.diffLineModified,{source:"diffEditor.cursorPositionChanged"})}}));const G=this._diffModel.map(this,(z,H)=>{if(z)return z.diff.read(H)===void 0&&!z.isDiffUpToDate.read(H)});this._register((0,p.autorunWithStore)((z,H)=>{if(G.read(z)===!0){const Y=this._editorProgressService.show(!0,1e3);H.add((0,S.toDisposable)(()=>Y.done()))}})),this._register((0,S.toDisposable)(()=>{var z;this._shouldDisposeDiffModel&&((z=this._diffModel.get())===null||z===void 0||z.dispose())})),this._register(new M.RevertButtonsFeature(this._editors,this._diffModel,this._options,this))}_createInnerEditor(B,W,V,K){return B.createInstance(i.CodeEditorWidget,W,V,K)}_createDiffEditorContributions(){const B=v.EditorExtensionsRegistry.getDiffEditorContributions();for(const W of B)try{this._register(this._instantiationService.createInstance(W.ctor,this))}catch(V){(0,y.onUnexpectedError)(V)}}get _targetEditor(){return this._editors.modified}getEditorType(){return g.EditorType.IDiffEditor}layout(B){this._rootSizeObserver.observe(B)}hasTextFocus(){return this._editors.original.hasTextFocus()||this._editors.modified.hasTextFocus()}saveViewState(){var B;const W=this._editors.original.saveViewState(),V=this._editors.modified.saveViewState();return{original:W,modified:V,modelState:(B=this._diffModel.get())===null||B===void 0?void 0:B.serializeState()}}restoreViewState(B){var W;if(B&&B.original&&B.modified){const V=B;this._editors.original.restoreViewState(V.original),this._editors.modified.restoreViewState(V.modified),V.modelState&&((W=this._diffModel.get())===null||W===void 0||W.restoreSerializedState(V.modelState))}}handleInitialized(){this._editors.original.handleInitialized(),this._editors.modified.handleInitialized()}createViewModel(B){return this._instantiationService.createInstance(N.DiffEditorViewModel,B,this._options)}getModel(){var B,W;return(W=(B=this._diffModel.get())===null||B===void 0?void 0:B.model)!==null&&W!==void 0?W:null}setModel(B,W){!B&&this._diffModel.get()&&this._accessibleDiffViewer.get().close();const V=B?"model"in B?{model:B,shouldDispose:!1}:{model:this.createViewModel(B),shouldDispose:!0}:void 0;this._diffModel.get()!==V?.model&&(0,p.subtransaction)(W,K=>{var F;p.observableFromEvent.batchEventsGlobally(K,()=>{this._editors.original.setModel(V?V.model.model.original:null),this._editors.modified.setModel(V?V.model.model.modified:null)});const q=this._diffModel.get(),ie=this._shouldDisposeDiffModel;this._shouldDisposeDiffModel=(F=V?.shouldDispose)!==null&&F!==void 0?F:!1,this._diffModel.set(V?.model,K),ie&&q?.dispose()})}updateOptions(B){this._options.updateOptions(B)}getContainerDomNode(){return this._domElement}getOriginalEditor(){return this._editors.original}getModifiedEditor(){return this._editors.modified}getLineChanges(){var B;const W=(B=this._diffModel.get())===null||B===void 0?void 0:B.diff.get();return W?x(W):null}revert(B){if(B.innerChanges){this.revertRangeMappings(B.innerChanges);return}const W=this._diffModel.get();!W||!W.isDiffUpToDate.get()||this._editors.modified.executeEdits("diffEditor",[{range:B.modified.toExclusiveRange(),text:W.model.original.getValueInRange(B.original.toExclusiveRange())}])}revertRangeMappings(B){const W=this._diffModel.get();if(!W||!W.isDiffUpToDate.get())return;const V=B.map(K=>({range:K.modifiedRange,text:W.model.original.getValueInRange(K.originalRange)}));this._editors.modified.executeEdits("diffEditor",V)}_goTo(B){this._editors.modified.setPosition(new l.Position(B.lineRangeMapping.modified.startLineNumber,1)),this._editors.modified.revealRangeInCenter(B.lineRangeMapping.modified.toExclusiveRange())}goToDiff(B){var W,V,K,F;const q=(V=(W=this._diffModel.get())===null||W===void 0?void 0:W.diff.get())===null||V===void 0?void 0:V.mappings;if(!q||q.length===0)return;const ie=this._editors.modified.getPosition().lineNumber;let ae;B==="next"?ae=(K=q.find(ne=>ne.lineRangeMapping.modified.startLineNumber>ie))!==null&&K!==void 0?K:q[0]:ae=(F=(0,k.findLast)(q,ne=>ne.lineRangeMapping.modified.startLineNumber<ie))!==null&&F!==void 0?F:q[q.length-1],this._goTo(ae),ae.lineRangeMapping.modified.isEmpty?this._audioCueService.playAudioCue(m.AudioCue.diffLineDeleted,{source:"diffEditor.goToDiff"}):ae.lineRangeMapping.original.isEmpty?this._audioCueService.playAudioCue(m.AudioCue.diffLineInserted,{source:"diffEditor.goToDiff"}):ae&&this._audioCueService.playAudioCue(m.AudioCue.diffLineModified,{source:"diffEditor.goToDiff"})}revealFirstDiff(){const B=this._diffModel.get();B&&this.waitForDiff().then(()=>{var W;const V=(W=B.diff.get())===null||W===void 0?void 0:W.mappings;!V||V.length===0||this._goTo(V[0])})}accessibleDiffViewerNext(){this._accessibleDiffViewer.get().next()}accessibleDiffViewerPrev(){this._accessibleDiffViewer.get().prev()}async waitForDiff(){const B=this._diffModel.get();B&&await B.waitForDiff()}mapToOtherSide(){var B,W;const V=this._editors.modified.hasWidgetFocus(),K=V?this._editors.modified:this._editors.original,F=V?this._editors.original:this._editors.modified;let q;const ie=K.getSelection();if(ie){const ae=(W=(B=this._diffModel.get())===null||B===void 0?void 0:B.diff.get())===null||W===void 0?void 0:W.mappings.map(ne=>V?ne.lineRangeMapping.flip():ne.lineRangeMapping);if(ae){const ne=(0,s.translatePosition)(ie.getStartPosition(),ae),$=(0,s.translatePosition)(ie.getEndPosition(),ae);q=o.Range.plusRange(ne,$)}}return{destination:F,destinationSelection:q}}switchSide(){const{destination:B,destinationSelection:W}=this.mapToOtherSide();B.focus(),W&&B.setSelection(W)}exitCompareMove(){const B=this._diffModel.get();B&&B.movedTextToCompare.set(void 0,void 0)}collapseAllUnchangedRegions(){var B;const W=(B=this._diffModel.get())===null||B===void 0?void 0:B.unchangedRegions.get();W&&(0,p.transaction)(V=>{for(const K of W)K.collapseAll(V)})}showAllUnchangedRegions(){var B;const W=(B=this._diffModel.get())===null||B===void 0?void 0:B.unchangedRegions.get();W&&(0,p.transaction)(V=>{for(const K of W)K.showAll(V)})}};e.DiffEditorWidget=R,e.DiffEditorWidget=R=ke([ge(3,C.IContextKeyService),ge(4,w.IInstantiationService),ge(5,b.ICodeEditorService),ge(6,m.IAudioCueService),ge(7,I.IEditorProgressService)],R);function x(O){return O.mappings.map(B=>{const W=B.lineRangeMapping;let V,K,F,q,ie=W.innerChanges;return W.original.isEmpty?(V=W.original.startLineNumber-1,K=0,ie=void 0):(V=W.original.startLineNumber,K=W.original.endLineNumberExclusive-1),W.modified.isEmpty?(F=W.modified.startLineNumber-1,q=0,ie=void 0):(F=W.modified.startLineNumber,q=W.modified.endLineNumberExclusive-1),{originalStartLineNumber:V,originalEndLineNumber:K,modifiedStartLineNumber:F,modifiedEndLineNumber:q,charChanges:ie?.map(ae=>({originalStartLineNumber:ae.originalRange.startLineNumber,originalStartColumn:ae.originalRange.startColumn,originalEndLineNumber:ae.originalRange.endLineNumber,originalEndColumn:ae.originalRange.endColumn,modifiedStartLineNumber:ae.modifiedRange.startLineNumber,modifiedStartColumn:ae.modifiedRange.startColumn,modifiedEndLineNumber:ae.modifiedRange.endLineNumber,modifiedEndColumn:ae.modifiedRange.endColumn}))}})}}),define(se[886],oe([1,0,7,26,16,33,259,21,626,30,25,27,15,258]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.findFocusedDiffEditor=e.AccessibleDiffViewerPrev=e.AccessibleDiffViewerNext=e.ShowAllUnchangedRegions=e.CollapseAllUnchangedRegions=e.ExitCompareMove=e.SwitchSide=e.ToggleUseInlineViewWhenSpaceIsLimited=e.ToggleShowMovedCodeBlocks=e.ToggleCollapseUnchangedRegions=void 0;class n extends v.Action2{constructor(){super({id:"diffEditor.toggleCollapseUnchangedRegions",title:(0,_.localize2)(5,"Toggle Collapse Unchanged Regions"),icon:k.Codicon.map,toggled:i.ContextKeyExpr.has("config.diffEditor.hideUnchangedRegions.enabled"),precondition:i.ContextKeyExpr.has("isInDiffEditor"),menu:{when:i.ContextKeyExpr.has("isInDiffEditor"),id:v.MenuId.EditorTitle,order:22,group:"navigation"}})}run(w,...D){const I=w.get(a.IConfigurationService),T=!I.getValue("diffEditor.hideUnchangedRegions.enabled");I.updateValue("diffEditor.hideUnchangedRegions.enabled",T)}}e.ToggleCollapseUnchangedRegions=n,(0,v.registerAction2)(n);class t extends v.Action2{constructor(){super({id:"diffEditor.toggleShowMovedCodeBlocks",title:(0,_.localize2)(6,"Toggle Show Moved Code Blocks"),precondition:i.ContextKeyExpr.has("isInDiffEditor")})}run(w,...D){const I=w.get(a.IConfigurationService),T=!I.getValue("diffEditor.experimental.showMoves");I.updateValue("diffEditor.experimental.showMoves",T)}}e.ToggleShowMovedCodeBlocks=t,(0,v.registerAction2)(t);class r extends v.Action2{constructor(){super({id:"diffEditor.toggleUseInlineViewWhenSpaceIsLimited",title:(0,_.localize2)(7,"Toggle Use Inline View When Space Is Limited"),precondition:i.ContextKeyExpr.has("isInDiffEditor")})}run(w,...D){const I=w.get(a.IConfigurationService),T=!I.getValue("diffEditor.useInlineViewWhenSpaceIsLimited");I.updateValue("diffEditor.useInlineViewWhenSpaceIsLimited",T)}}e.ToggleUseInlineViewWhenSpaceIsLimited=r,(0,v.registerAction2)(r),v.MenuRegistry.appendMenuItem(v.MenuId.EditorTitle,{command:{id:new r().desc.id,title:(0,_.localize)(0,null),toggled:i.ContextKeyExpr.has("config.diffEditor.useInlineViewWhenSpaceIsLimited"),precondition:i.ContextKeyExpr.has("isInDiffEditor")},order:11,group:"1_diff",when:i.ContextKeyExpr.and(p.EditorContextKeys.diffEditorRenderSideBySideInlineBreakpointReached,i.ContextKeyExpr.has("isInDiffEditor"))}),v.MenuRegistry.appendMenuItem(v.MenuId.EditorTitle,{command:{id:new t().desc.id,title:(0,_.localize)(1,null),icon:k.Codicon.move,toggled:i.ContextKeyEqualsExpr.create("config.diffEditor.experimental.showMoves",!0),precondition:i.ContextKeyExpr.has("isInDiffEditor")},order:10,group:"1_diff",when:i.ContextKeyExpr.has("isInDiffEditor")});const u={value:(0,_.localize)(2,null),original:"Diff Editor"};class f extends y.EditorAction2{constructor(){super({id:"diffEditor.switchSide",title:(0,_.localize2)(8,"Switch Side"),icon:k.Codicon.arrowSwap,precondition:i.ContextKeyExpr.has("isInDiffEditor"),f1:!0,category:u})}runEditorCommand(w,D,I){const T=h(w);if(T instanceof S.DiffEditorWidget){if(I&&I.dryRun)return{destinationSelection:T.mapToOtherSide().destinationSelection};T.switchSide()}}}e.SwitchSide=f,(0,v.registerAction2)(f);class c extends y.EditorAction2{constructor(){super({id:"diffEditor.exitCompareMove",title:(0,_.localize2)(9,"Exit Compare Move"),icon:k.Codicon.close,precondition:p.EditorContextKeys.comparingMovedCode,f1:!1,category:u,keybinding:{weight:1e4,primary:9}})}runEditorCommand(w,D,...I){const T=h(w);T instanceof S.DiffEditorWidget&&T.exitCompareMove()}}e.ExitCompareMove=c,(0,v.registerAction2)(c);class d extends y.EditorAction2{constructor(){super({id:"diffEditor.collapseAllUnchangedRegions",title:(0,_.localize2)(10,"Collapse All Unchanged Regions"),icon:k.Codicon.fold,precondition:i.ContextKeyExpr.has("isInDiffEditor"),f1:!0,category:u})}runEditorCommand(w,D,...I){const T=h(w);T instanceof S.DiffEditorWidget&&T.collapseAllUnchangedRegions()}}e.CollapseAllUnchangedRegions=d,(0,v.registerAction2)(d);class s extends y.EditorAction2{constructor(){super({id:"diffEditor.showAllUnchangedRegions",title:(0,_.localize2)(11,"Show All Unchanged Regions"),icon:k.Codicon.unfold,precondition:i.ContextKeyExpr.has("isInDiffEditor"),f1:!0,category:u})}runEditorCommand(w,D,...I){const T=h(w);T instanceof S.DiffEditorWidget&&T.showAllUnchangedRegions()}}e.ShowAllUnchangedRegions=s,(0,v.registerAction2)(s);const l={value:(0,_.localize)(3,null),original:"Accessible Diff Viewer"};class o extends v.Action2{constructor(){super({id:o.id,title:(0,_.localize2)(12,"Go to Next Difference"),category:l,precondition:i.ContextKeyExpr.has("isInDiffEditor"),keybinding:{primary:65,weight:100},f1:!0})}run(w){const D=h(w);D?.accessibleDiffViewerNext()}}e.AccessibleDiffViewerNext=o,o.id="editor.action.accessibleDiffViewer.next",v.MenuRegistry.appendMenuItem(v.MenuId.EditorTitle,{command:{id:o.id,title:(0,_.localize)(4,null),precondition:i.ContextKeyExpr.has("isInDiffEditor")},order:10,group:"2_diff",when:i.ContextKeyExpr.and(p.EditorContextKeys.accessibleDiffViewerVisible.negate(),i.ContextKeyExpr.has("isInDiffEditor"))});class g extends v.Action2{constructor(){super({id:g.id,title:(0,_.localize2)(13,"Go to Previous Difference"),category:l,precondition:i.ContextKeyExpr.has("isInDiffEditor"),keybinding:{primary:1089,weight:100},f1:!0})}run(w){const D=h(w);D?.accessibleDiffViewerPrev()}}e.AccessibleDiffViewerPrev=g,g.id="editor.action.accessibleDiffViewer.prev";function h(C){const D=C.get(E.ICodeEditorService).listDiffEditors(),I=(0,L.getActiveElement)();if(I)for(const T of D){const A=T.getContainerDomNode();if(m(A,I))return T}return null}e.findFocusedDiffEditor=h;function m(C,w){let D=w;for(;D;){if(D===C)return!0;D=D.parentElement}return!1}b.CommandsRegistry.registerCommandAlias("editor.action.diffReview.next",o.id),(0,v.registerAction2)(o),b.CommandsRegistry.registerCommandAlias("editor.action.diffReview.prev",g.id),(0,v.registerAction2)(g)}),define(se[168],oe([1,0,55,33,194,32,18,69,25,15,8,50,23]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EmbeddedCodeEditorWidget=void 0;let n=class extends y.CodeEditorWidget{constructor(r,u,f,c,d,s,l,o,g,h,m,C,w){super(r,{...c.getRawOptions(),overflowWidgetsDomNode:c.getOverflowWidgetsDomNode()},f,d,s,l,o,g,h,m,C,w),this._parentEditor=c,this._overwriteOptions=u,super.updateOptions(this._overwriteOptions),this._register(c.onDidChangeConfiguration(D=>this._onParentConfigurationChanged(D)))}getParentEditor(){return this._parentEditor}_onParentConfigurationChanged(r){super.updateOptions(this._parentEditor.getRawOptions()),super.updateOptions(this._overwriteOptions)}updateOptions(r){L.mixin(this._overwriteOptions,r,!0),super.updateOptions(this._overwriteOptions)}};e.EmbeddedCodeEditorWidget=n,e.EmbeddedCodeEditorWidget=n=ke([ge(4,b.IInstantiationService),ge(5,k.ICodeEditorService),ge(6,_.ICommandService),ge(7,v.IContextKeyService),ge(8,i.IThemeService),ge(9,a.INotificationService),ge(10,p.IAccessibilityService),ge(11,E.ILanguageConfigurationService),ge(12,S.ILanguageFeaturesService)],n)}),define(se[374],oe([1,0,7,229,26,2,35,110,259,373,30,8,578]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffEditorItemTemplate=e.TemplateData=void 0;class n{constructor(f){this.viewModel=f}getId(){return this.viewModel}}e.TemplateData=n;let t=class extends E.Disposable{constructor(f,c,d,s){super(),this._container=f,this._overflowWidgetsDomNode=c,this._workbenchUIElementFactory=d,this._instantiationService=s,this._viewModel=(0,p.observableValue)(this,void 0),this._collapsed=(0,S.derived)(this,o=>{var g;return(g=this._viewModel.read(o))===null||g===void 0?void 0:g.collapsed.read(o)}),this._editorContentHeight=(0,p.observableValue)(this,500),this.contentHeight=(0,S.derived)(this,o=>(this._collapsed.read(o)?0:this._editorContentHeight.read(o))+this._outerEditorHeight),this._modifiedContentWidth=(0,p.observableValue)(this,0),this._modifiedWidth=(0,p.observableValue)(this,0),this._originalContentWidth=(0,p.observableValue)(this,0),this._originalWidth=(0,p.observableValue)(this,0),this.maxScroll=(0,S.derived)(this,o=>{const g=this._modifiedContentWidth.read(o)-this._modifiedWidth.read(o),h=this._originalContentWidth.read(o)-this._originalWidth.read(o);return g>h?{maxScroll:g,width:this._modifiedWidth.read(o)}:{maxScroll:h,width:this._originalWidth.read(o)}}),this._elements=(0,L.h)("div.multiDiffEntry",[(0,L.h)("div.header@header",[(0,L.h)("div.collapse-button@collapseButton"),(0,L.h)("div.file-path",[(0,L.h)("div.title.modified.show-file-icons@primaryPath",[]),(0,L.h)("div.status.deleted@status",["R"]),(0,L.h)("div.title.original.show-file-icons@secondaryPath",[])]),(0,L.h)("div.actions@actions")]),(0,L.h)("div.editorParent",[(0,L.h)("div.editorContainer@editor")])]),this.editor=this._register(this._instantiationService.createInstance(_.DiffEditorWidget,this._elements.editor,{overflowWidgetsDomNode:this._overflowWidgetsDomNode},{})),this.isModifedFocused=r(this.editor.getModifiedEditor()),this.isOriginalFocused=r(this.editor.getOriginalEditor()),this.isFocused=(0,S.derived)(this,o=>this.isModifedFocused.read(o)||this.isOriginalFocused.read(o)),this._resourceLabel=this._workbenchUIElementFactory.createResourceLabel?this._register(this._workbenchUIElementFactory.createResourceLabel(this._elements.primaryPath)):void 0,this._resourceLabel2=this._workbenchUIElementFactory.createResourceLabel?this._register(this._workbenchUIElementFactory.createResourceLabel(this._elements.secondaryPath)):void 0,this._dataStore=new E.DisposableStore,this._headerHeight=38;const l=new k.Button(this._elements.collapseButton,{});this._register((0,S.autorun)(o=>{l.element.className="",l.icon=this._collapsed.read(o)?y.Codicon.chevronRight:y.Codicon.chevronDown})),this._register(l.onDidClick(()=>{var o;(o=this._viewModel.get())===null||o===void 0||o.collapsed.set(!this._collapsed.get(),void 0)})),this._register((0,S.autorun)(o=>{this._elements.editor.style.display=this._collapsed.read(o)?"none":"block"})),this.editor.getModifiedEditor().onDidLayoutChange(o=>{const g=this.editor.getModifiedEditor().getLayoutInfo().contentWidth;this._modifiedWidth.set(g,void 0)}),this.editor.getOriginalEditor().onDidLayoutChange(o=>{const g=this.editor.getOriginalEditor().getLayoutInfo().contentWidth;this._originalWidth.set(g,void 0)}),this._register(this.editor.onDidContentSizeChange(o=>{(0,p.globalTransaction)(g=>{this._editorContentHeight.set(o.contentHeight,g),this._modifiedContentWidth.set(this.editor.getModifiedEditor().getContentWidth(),g),this._originalContentWidth.set(this.editor.getOriginalEditor().getContentWidth(),g)})})),this._register((0,S.autorun)(o=>{const g=this.isFocused.read(o);this._elements.root.classList.toggle("focused",g)})),this._container.appendChild(this._elements.root),this._outerEditorHeight=38,this._register(this._instantiationService.createInstance(v.MenuWorkbenchToolBar,this._elements.actions,b.MenuId.MultiDiffEditorFileToolbar,{actionRunner:this._register(new i.ActionRunnerWithContext(()=>{var o;return(o=this._viewModel.get())===null||o===void 0?void 0:o.modifiedUri})),menuOptions:{shouldForwardArgs:!0},toolbarOptions:{primaryGroup:o=>o.startsWith("navigation")}}))}setScrollLeft(f){this._modifiedContentWidth.get()-this._modifiedWidth.get()>this._originalContentWidth.get()-this._originalWidth.get()?this.editor.getModifiedEditor().setScrollLeft(f):this.editor.getOriginalEditor().setScrollLeft(f)}setData(f){function c(s){return{...s,scrollBeyondLastLine:!1,hideUnchangedRegions:{enabled:!0},scrollbar:{vertical:"hidden",horizontal:"hidden",handleMouseWheel:!1,useShadows:!1},renderOverviewRuler:!1,fixedOverflowWidgets:!0,overviewRulerBorder:!1}}const d=f.viewModel.entry.value;d.onOptionsDidChange&&this._dataStore.add(d.onOptionsDidChange(()=>{var s;this.editor.updateOptions(c((s=d.options)!==null&&s!==void 0?s:{}))})),(0,p.globalTransaction)(s=>{var l,o,g,h;(l=this._resourceLabel)===null||l===void 0||l.setUri((o=f.viewModel.modifiedUri)!==null&&o!==void 0?o:f.viewModel.originalUri,{strikethrough:f.viewModel.modifiedUri===void 0});let m=!1,C=!1,w=!1,D="";f.viewModel.modifiedUri&&f.viewModel.originalUri&&f.viewModel.modifiedUri.path!==f.viewModel.originalUri.path?(D="R",m=!0):f.viewModel.modifiedUri?f.viewModel.originalUri||(D="A",w=!0):(D="D",C=!0),this._elements.status.classList.toggle("renamed",m),this._elements.status.classList.toggle("deleted",C),this._elements.status.classList.toggle("added",w),this._elements.status.innerText=D,(g=this._resourceLabel2)===null||g===void 0||g.setUri(m?f.viewModel.originalUri:void 0,{strikethrough:!0}),this._dataStore.clear(),this._viewModel.set(f.viewModel,s),this.editor.setModel(f.viewModel.diffEditorViewModel,s),this.editor.updateOptions(c((h=d.options)!==null&&h!==void 0?h:{}))})}render(f,c,d,s){this._elements.root.style.visibility="visible",this._elements.root.style.top=`${f.start}px`,this._elements.root.style.height=`${f.length}px`,this._elements.root.style.width=`${c}px`,this._elements.root.style.position="absolute";const l=Math.max(0,Math.min(f.length-this._headerHeight,s.start-f.start));this._elements.header.style.transform=`translateY(${l}px)`,(0,p.globalTransaction)(o=>{this.editor.layout({width:c,height:f.length-this._outerEditorHeight})}),this.editor.getOriginalEditor().setScrollTop(d),this._elements.header.classList.toggle("shadow",l>0||d>0)}hide(){this._elements.root.style.top="-100000px",this._elements.root.style.visibility="hidden"}};e.DiffEditorItemTemplate=t,e.DiffEditorItemTemplate=t=ke([ge(3,a.IInstantiationService)],t);function r(u){return(0,S.observableFromEvent)(f=>{const c=new E.DisposableStore;return c.add(u.onDidFocusEditorWidget(()=>f(!0))),c.add(u.onDidBlurEditorWidget(()=>f(!1))),c},()=>u.hasWidgetFocus())}}),define(se[887],oe([1,0,7,77,60,2,35,110,147,87,73,8,374,499,15,163,21,24,452]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MultiDiffEditorWidgetImpl=void 0;let c=class extends E.Disposable{constructor(l,o,g,h,m,C){super(),this._element=l,this._dimension=o,this._viewModel=g,this._workbenchUIElementFactory=h,this._parentContextKeyService=m,this._parentInstantiationService=C,this._elements=(0,L.h)("div.monaco-component.multiDiffEditor",[(0,L.h)("div@content",{style:{overflow:"hidden"}}),(0,L.h)("div.monaco-editor@overflowWidgetsDomNode",{})]),this._sizeObserver=this._register(new v.ObservableElementSizeObserver(this._element,void 0)),this._objectPool=this._register(new n.ObjectPool(D=>{const I=this._instantiationService.createInstance(i.DiffEditorItemTemplate,this._elements.content,this._elements.overflowWidgetsDomNode,this._workbenchUIElementFactory);return I.setData(D),I})),this._scrollable=this._register(new _.Scrollable({forceIntegerValues:!1,scheduleAtNextAnimationFrame:D=>(0,L.scheduleAtNextAnimationFrame)((0,L.getWindow)(this._element),D),smoothScrollDuration:100})),this._scrollableElement=this._register(new k.SmoothScrollableElement(this._elements.root,{vertical:1,horizontal:1,useShadows:!1},this._scrollable)),this.scrollTop=(0,S.observableFromEvent)(this._scrollableElement.onScroll,()=>this._scrollableElement.getScrollPosition().scrollTop),this.scrollLeft=(0,S.observableFromEvent)(this._scrollableElement.onScroll,()=>this._scrollableElement.getScrollPosition().scrollLeft),this._viewItems=(0,S.derivedWithStore)(this,(D,I)=>{const T=this._viewModel.read(D);return T?T.items.read(D).map(P=>{var N;const M=I.add(new d(P,this._objectPool,this.scrollLeft)),R=(N=this._lastDocStates)===null||N===void 0?void 0:N[M.getKey()];return R&&(0,p.transaction)(x=>{M.setViewState(R,x)}),M}):[]}),this._spaceBetweenPx=10,this._totalHeight=this._viewItems.map(this,(D,I)=>D.reduce((T,A)=>T+A.contentHeight.read(I)+this._spaceBetweenPx,0)),this.activeDiffItem=(0,S.derived)(this,D=>this._viewItems.read(D).find(I=>{var T;return(T=I.template.read(D))===null||T===void 0?void 0:T.isFocused.read(D)})),this.lastActiveDiffItem=(0,S.derivedObservableWithCache)((D,I)=>{var T;return(T=this.activeDiffItem.read(D))!==null&&T!==void 0?T:I}),this._contextKeyService=this._register(this._parentContextKeyService.createScoped(this._element)),this._instantiationService=this._parentInstantiationService.createChild(new r.ServiceCollection([t.IContextKeyService,this._contextKeyService])),this._lastDocStates={},this._contextKeyService.createKey(u.EditorContextKeys.inMultiDiffEditor.key,!0),this._register((0,S.autorunWithStore)((D,I)=>{const T=this._viewModel.read(D);if(T&&T.contextKeys)for(const[A,P]of Object.entries(T.contextKeys)){const N=this._contextKeyService.createKey(A,void 0);N.set(P),I.add((0,E.toDisposable)(()=>N.reset()))}}));const w=this._parentContextKeyService.createKey(u.EditorContextKeys.multiDiffEditorAllCollapsed.key,!1);this._register((0,S.autorun)(D=>{const I=this._viewModel.read(D);if(I){const T=I.items.read(D).every(A=>A.collapsed.read(D));w.set(T)}})),this._register((0,S.autorun)(D=>{const I=this.lastActiveDiffItem.read(D);(0,p.transaction)(T=>{var A;(A=this._viewModel.read(D))===null||A===void 0||A.activeDiffItem.set(I?.viewModel,T)})})),this._register((0,S.autorun)(D=>{const I=this._dimension.read(D);this._sizeObserver.observe(I)})),this._elements.content.style.position="relative",this._register((0,S.autorun)(D=>{const I=this._sizeObserver.height.read(D);this._elements.root.style.height=`${I}px`;const T=this._totalHeight.read(D);this._elements.content.style.height=`${T}px`;const A=this._sizeObserver.width.read(D);let P=A;const N=this._viewItems.read(D),M=(0,y.findFirstMaxBy)(N,R=>R.maxScroll.read(D).maxScroll);if(M){const R=M.maxScroll.read(D);P=A+R.maxScroll}this._scrollableElement.setScrollDimensions({width:A,height:I,scrollHeight:T,scrollWidth:P})})),l.replaceChildren(this._scrollableElement.getDomNode()),this._register((0,E.toDisposable)(()=>{l.replaceChildren()})),this._register(this._register((0,S.autorun)(D=>{(0,p.globalTransaction)(I=>{this.render(D)})})))}render(l){const o=this.scrollTop.read(l);let g=0,h=0,m=0;const C=this._sizeObserver.height.read(l),w=b.OffsetRange.ofStartAndLength(o,C),D=this._sizeObserver.width.read(l);for(const I of this._viewItems.read(l)){const T=I.contentHeight.read(l),A=Math.min(T,C),P=b.OffsetRange.ofStartAndLength(h,A),N=b.OffsetRange.ofStartAndLength(m,T);if(N.isBefore(w))g-=T-A,I.hide();else if(N.isAfter(w))I.hide();else{const M=Math.max(0,Math.min(w.start-N.start,T-A));g-=M;const R=b.OffsetRange.ofStartAndLength(o+g,C);I.render(P,M,D,R)}h+=A+this._spaceBetweenPx,m+=T+this._spaceBetweenPx}this._elements.content.style.transform=`translateY(${-(o+g)}px)`}};e.MultiDiffEditorWidgetImpl=c,e.MultiDiffEditorWidgetImpl=c=ke([ge(4,t.IContextKeyService),ge(5,a.IInstantiationService)],c);class d extends E.Disposable{constructor(l,o,g){super(),this.viewModel=l,this._objectPool=o,this._scrollLeft=g,this._templateRef=this._register((0,p.disposableObservableValue)(this,void 0)),this.contentHeight=(0,S.derived)(this,h=>{var m,C,w;return(w=(C=(m=this._templateRef.read(h))===null||m===void 0?void 0:m.object.contentHeight)===null||C===void 0?void 0:C.read(h))!==null&&w!==void 0?w:this.viewModel.lastTemplateData.read(h).contentHeight}),this.maxScroll=(0,S.derived)(this,h=>{var m,C;return(C=(m=this._templateRef.read(h))===null||m===void 0?void 0:m.object.maxScroll.read(h))!==null&&C!==void 0?C:{maxScroll:0,scrollWidth:0}}),this.template=(0,S.derived)(this,h=>{var m;return(m=this._templateRef.read(h))===null||m===void 0?void 0:m.object}),this._isHidden=(0,S.observableValue)(this,!1),this._register((0,S.autorun)(h=>{var m;const C=this._scrollLeft.read(h);(m=this._templateRef.read(h))===null||m===void 0||m.object.setScrollLeft(C)})),this._register((0,S.autorun)(h=>{const m=this._templateRef.read(h);!m||!this._isHidden.read(h)||m.object.isFocused.read(h)||this._clear()}))}dispose(){this._clear(),super.dispose()}toString(){var l;return`VirtualViewItem(${(l=this.viewModel.entry.value.modified)===null||l===void 0?void 0:l.uri.toString()})`}getKey(){return this.viewModel.getKey()}setViewState(l,o){var g;this.viewModel.collapsed.set(l.collapsed,o),this._updateTemplateData(o);const h=this.viewModel.lastTemplateData.get(),m=(g=l.selections)===null||g===void 0?void 0:g.map(f.Selection.liftSelection);this.viewModel.lastTemplateData.set({...h,selections:m},o);const C=this._templateRef.get();C&&m&&C.object.editor.setSelections(m)}_updateTemplateData(l){var o;const g=this._templateRef.get();g&&this.viewModel.lastTemplateData.set({contentHeight:g.object.contentHeight.get(),selections:(o=g.object.editor.getSelections())!==null&&o!==void 0?o:void 0},l)}_clear(){const l=this._templateRef.get();l&&(0,p.transaction)(o=>{this._updateTemplateData(o),l.object.hide(),this._templateRef.set(void 0,o)})}hide(){this._isHidden.set(!0,void 0)}render(l,o,g,h){this._isHidden.set(!1,void 0);let m=this._templateRef.get();if(!m){m=this._objectPool.getUnusedObj(new i.TemplateData(this.viewModel)),this._templateRef.set(m,void 0);const C=this.viewModel.lastTemplateData.get().selections;C&&m.object.editor.setSelections(C)}m.object.render(l,g,o,h)}}}),define(se[888],oe([1,0,2,35,87,887,8,374,835]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MultiDiffEditorWidget=void 0;let _=class extends L.Disposable{constructor(b,a,i){super(),this._element=b,this._workbenchUIElementFactory=a,this._instantiationService=i,this._dimension=(0,k.observableValue)(this,void 0),this._viewModel=(0,k.observableValue)(this,void 0),this._widgetImpl=(0,k.derivedWithStore)(this,(n,t)=>((0,y.readHotReloadableExport)(p.DiffEditorItemTemplate,n),t.add(this._instantiationService.createInstance((0,y.readHotReloadableExport)(E.MultiDiffEditorWidgetImpl,n),this._element,this._dimension,this._viewModel,this._workbenchUIElementFactory)))),this._register((0,k.recomputeInitiallyAndOnChange)(this._widgetImpl))}};e.MultiDiffEditorWidget=_,e.MultiDiffEditorWidget=_=ke([ge(2,S.IInstantiationService)],_)}),define(se[889],oe([1,0,14,2,16,10,5,24,21,41,38,650,30,29,23,454]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketMatchingController=void 0;const r=(0,n.registerColor)("editorOverviewRuler.bracketMatchForeground",{dark:"#A0A0A0",light:"#A0A0A0",hcDark:"#A0A0A0",hcLight:"#A0A0A0"},a.localize(0,null));class u extends y.EditorAction{constructor(){super({id:"editor.action.jumpToBracket",label:a.localize(1,null),alias:"Go to Bracket",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.editorTextFocus,primary:3165,weight:100}})}run(o,g){var h;(h=s.get(g))===null||h===void 0||h.jumpToBracket()}}class f extends y.EditorAction{constructor(){super({id:"editor.action.selectToBracket",label:a.localize(2,null),alias:"Select to Bracket",precondition:void 0,metadata:{description:a.localize2(5,"Select the text inside and including the brackets or curly braces"),args:[{name:"args",schema:{type:"object",properties:{selectBrackets:{type:"boolean",default:!0}}}}]}})}run(o,g,h){var m;let C=!0;h&&h.selectBrackets===!1&&(C=!1),(m=s.get(g))===null||m===void 0||m.selectToBracket(C)}}class c extends y.EditorAction{constructor(){super({id:"editor.action.removeBrackets",label:a.localize(3,null),alias:"Remove Brackets",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.editorTextFocus,primary:2561,weight:100}})}run(o,g){var h;(h=s.get(g))===null||h===void 0||h.removeBrackets(this.id)}}class d{constructor(o,g,h){this.position=o,this.brackets=g,this.options=h}}class s extends k.Disposable{static get(o){return o.getContribution(s.ID)}constructor(o){super(),this._editor=o,this._lastBracketsData=[],this._lastVersionId=0,this._decorations=this._editor.createDecorationsCollection(),this._updateBracketsSoon=this._register(new L.RunOnceScheduler(()=>this._updateBrackets(),50)),this._matchBrackets=this._editor.getOption(71),this._updateBracketsSoon.schedule(),this._register(o.onDidChangeCursorPosition(g=>{this._matchBrackets!=="never"&&this._updateBracketsSoon.schedule()})),this._register(o.onDidChangeModelContent(g=>{this._updateBracketsSoon.schedule()})),this._register(o.onDidChangeModel(g=>{this._lastBracketsData=[],this._updateBracketsSoon.schedule()})),this._register(o.onDidChangeModelLanguageConfiguration(g=>{this._lastBracketsData=[],this._updateBracketsSoon.schedule()})),this._register(o.onDidChangeConfiguration(g=>{g.hasChanged(71)&&(this._matchBrackets=this._editor.getOption(71),this._decorations.clear(),this._lastBracketsData=[],this._lastVersionId=0,this._updateBracketsSoon.schedule())})),this._register(o.onDidBlurEditorWidget(()=>{this._updateBracketsSoon.schedule()})),this._register(o.onDidFocusEditorWidget(()=>{this._updateBracketsSoon.schedule()}))}jumpToBracket(){if(!this._editor.hasModel())return;const o=this._editor.getModel(),g=this._editor.getSelections().map(h=>{const m=h.getStartPosition(),C=o.bracketPairs.matchBracket(m);let w=null;if(C)C[0].containsPosition(m)&&!C[1].containsPosition(m)?w=C[1].getStartPosition():C[1].containsPosition(m)&&(w=C[0].getStartPosition());else{const D=o.bracketPairs.findEnclosingBrackets(m);if(D)w=D[1].getStartPosition();else{const I=o.bracketPairs.findNextBracket(m);I&&I.range&&(w=I.range.getStartPosition())}}return w?new p.Selection(w.lineNumber,w.column,w.lineNumber,w.column):new p.Selection(m.lineNumber,m.column,m.lineNumber,m.column)});this._editor.setSelections(g),this._editor.revealRange(g[0])}selectToBracket(o){if(!this._editor.hasModel())return;const g=this._editor.getModel(),h=[];this._editor.getSelections().forEach(m=>{const C=m.getStartPosition();let w=g.bracketPairs.matchBracket(C);if(!w&&(w=g.bracketPairs.findEnclosingBrackets(C),!w)){const T=g.bracketPairs.findNextBracket(C);T&&T.range&&(w=g.bracketPairs.matchBracket(T.range.getStartPosition()))}let D=null,I=null;if(w){w.sort(S.Range.compareRangesUsingStarts);const[T,A]=w;if(D=o?T.getStartPosition():T.getEndPosition(),I=o?A.getEndPosition():A.getStartPosition(),A.containsPosition(C)){const P=D;D=I,I=P}}D&&I&&h.push(new p.Selection(D.lineNumber,D.column,I.lineNumber,I.column))}),h.length>0&&(this._editor.setSelections(h),this._editor.revealRange(h[0]))}removeBrackets(o){if(!this._editor.hasModel())return;const g=this._editor.getModel();this._editor.getSelections().forEach(h=>{const m=h.getPosition();let C=g.bracketPairs.matchBracket(m);C||(C=g.bracketPairs.findEnclosingBrackets(m)),C&&(this._editor.pushUndoStop(),this._editor.executeEdits(o,[{range:C[0],text:""},{range:C[1],text:""}]),this._editor.pushUndoStop())})}_updateBrackets(){if(this._matchBrackets==="never")return;this._recomputeBrackets();const o=[];let g=0;for(const h of this._lastBracketsData){const m=h.brackets;m&&(o[g++]={range:m[0],options:h.options},o[g++]={range:m[1],options:h.options})}this._decorations.set(o)}_recomputeBrackets(){if(!this._editor.hasModel()||!this._editor.hasWidgetFocus()){this._lastBracketsData=[],this._lastVersionId=0;return}const o=this._editor.getSelections();if(o.length>100){this._lastBracketsData=[],this._lastVersionId=0;return}const g=this._editor.getModel(),h=g.getVersionId();let m=[];this._lastVersionId===h&&(m=this._lastBracketsData);const C=[];let w=0;for(let P=0,N=o.length;P<N;P++){const M=o[P];M.isEmpty()&&(C[w++]=M.getStartPosition())}C.length>1&&C.sort(E.Position.compare);const D=[];let I=0,T=0;const A=m.length;for(let P=0,N=C.length;P<N;P++){const M=C[P];for(;T<A&&m[T].position.isBefore(M);)T++;if(T<A&&m[T].position.equals(M))D[I++]=m[T];else{let R=g.bracketPairs.matchBracket(M,20),x=s._DECORATION_OPTIONS_WITH_OVERVIEW_RULER;!R&&this._matchBrackets==="always"&&(R=g.bracketPairs.findEnclosingBrackets(M,20),x=s._DECORATION_OPTIONS_WITHOUT_OVERVIEW_RULER),D[I++]=new d(M,R,x)}}this._lastBracketsData=D,this._lastVersionId=h}}e.BracketMatchingController=s,s.ID="editor.contrib.bracketMatchingController",s._DECORATION_OPTIONS_WITH_OVERVIEW_RULER=b.ModelDecorationOptions.register({description:"bracket-match-overview",stickiness:1,className:"bracket-match",overviewRuler:{color:(0,t.themeColorFromId)(r),position:v.OverviewRulerLane.Center}}),s._DECORATION_OPTIONS_WITHOUT_OVERVIEW_RULER=b.ModelDecorationOptions.register({description:"bracket-match-no-overview",stickiness:1,className:"bracket-match"}),(0,y.registerEditorContribution)(s.ID,s,1),(0,y.registerEditorAction)(f),(0,y.registerEditorAction)(u),(0,y.registerEditorAction)(c),i.MenuRegistry.appendMenuItem(i.MenuId.MenubarGoMenu,{group:"5_infile_nav",command:{id:"editor.action.jumpToBracket",title:a.localize(4,null)},order:2})}),define(se[260],oe([1,0,7,48,12,99,2,10,38,18,140,816,836,361,166,657,839,25,27,15,8,97,88,29,89,23,116,360]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w){"use strict";var D;Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionController=void 0;const I="quickfix-edit-highlight";let T=D=class extends S.Disposable{static get(P){return P.getContribution(D.ID)}constructor(P,N,M,R,x,O,B,W,V,K){super(),this._commandService=B,this._configurationService=W,this._actionWidgetService=V,this._instantiationService=K,this._activeCodeActions=this._register(new S.MutableDisposable),this._showDisabled=!1,this._disposed=!1,this._editor=P,this._model=this._register(new w.CodeActionModel(this._editor,x.codeActionProvider,N,M,O,W)),this._register(this._model.onDidChangeState(F=>this.update(F))),this._lightBulbWidget=new E.Lazy(()=>{const F=this._editor.getContribution(n.LightBulbWidget.ID);return F&&this._register(F.onClick(q=>this.showCodeActionsFromLightbulb(q.actions,q))),F}),this._resolver=R.createInstance(a.CodeActionKeybindingResolver),this._register(this._editor.onDidLayoutChange(()=>this._actionWidgetService.hide()))}dispose(){this._disposed=!0,super.dispose()}async showCodeActionsFromLightbulb(P,N){if(P.allAIFixes&&P.validActions.length===1){const M=P.validActions[0],R=M.action.command;R&&R.id==="inlineChat.start"&&R.arguments&&R.arguments.length>=1&&(R.arguments[0]={...R.arguments[0],autoSend:!1}),await this._applyCodeAction(M,!1,!1,b.ApplyCodeActionReason.FromAILightbulb);return}await this.showCodeActionList(P,N,{includeDisabledActions:!1,fromLightbulb:!0})}showCodeActions(P,N,M){return this.showCodeActionList(N,M,{includeDisabledActions:!1,fromLightbulb:!1})}manualTriggerAtCurrentPosition(P,N,M,R){var x;if(!this._editor.hasModel())return;(x=t.MessageController.get(this._editor))===null||x===void 0||x.closeMessage();const O=this._editor.getPosition();this._trigger({type:1,triggerAction:N,filter:M,autoApply:R,context:{notAvailableMessage:P,position:O}})}_trigger(P){return this._model.trigger(P)}async _applyCodeAction(P,N,M,R){try{await this._instantiationService.invokeFunction(b.applyCodeAction,P,R,{preview:M,editor:this._editor})}finally{N&&this._trigger({type:2,triggerAction:C.CodeActionTriggerSource.QuickFix,filter:{}})}}async update(P){var N,M,R,x,O,B,W;if(P.type!==1){(N=this._lightBulbWidget.rawValue)===null||N===void 0||N.hide();return}let V;try{V=await P.actions}catch(K){(0,y.onUnexpectedError)(K);return}if(!this._disposed)if((M=this._lightBulbWidget.value)===null||M===void 0||M.update(V,P.trigger,P.position),P.trigger.type===1){if(!((R=P.trigger.filter)===null||R===void 0)&&R.include){const F=this.tryGetValidActionToApply(P.trigger,V);if(F){try{(x=this._lightBulbWidget.value)===null||x===void 0||x.hide(),await this._applyCodeAction(F,!1,!1,b.ApplyCodeActionReason.FromCodeActions)}finally{V.dispose()}return}if(P.trigger.context){const q=this.getInvalidActionThatWouldHaveBeenApplied(P.trigger,V);if(q&&q.action.disabled){(O=t.MessageController.get(this._editor))===null||O===void 0||O.showMessage(q.action.disabled,P.trigger.context.position),V.dispose();return}}}const K=!!(!((B=P.trigger.filter)===null||B===void 0)&&B.include);if(P.trigger.context&&(!V.allActions.length||!K&&!V.validActions.length)){(W=t.MessageController.get(this._editor))===null||W===void 0||W.showMessage(P.trigger.context.notAvailableMessage,P.trigger.context.position),this._activeCodeActions.value=V,V.dispose();return}this._activeCodeActions.value=V,this.showCodeActionList(V,this.toCoords(P.position),{includeDisabledActions:K,fromLightbulb:!1})}else this._actionWidgetService.isVisible?V.dispose():this._activeCodeActions.value=V}getInvalidActionThatWouldHaveBeenApplied(P,N){if(N.allActions.length&&(P.autoApply==="first"&&N.validActions.length===0||P.autoApply==="ifSingle"&&N.allActions.length===1))return N.allActions.find(({action:M})=>M.disabled)}tryGetValidActionToApply(P,N){if(N.validActions.length&&(P.autoApply==="first"&&N.validActions.length>0||P.autoApply==="ifSingle"&&N.validActions.length===1))return N.validActions[0]}async showCodeActionList(P,N,M){const R=this._editor.createDecorationsCollection(),x=this._editor.getDomNode();if(!x)return;const O=M.includeDisabledActions&&(this._showDisabled||P.validActions.length===0)?P.allActions:P.validActions;if(!O.length)return;const B=p.Position.isIPosition(N)?this.toCoords(N):N,W={onSelect:async(V,K)=>{this._applyCodeAction(V,!0,!!K,b.ApplyCodeActionReason.FromCodeActions),this._actionWidgetService.hide(),R.clear()},onHide:()=>{var V;(V=this._editor)===null||V===void 0||V.focus(),R.clear()},onHover:async(V,K)=>{var F;if(!K.isCancellationRequested)return{canPreview:!!(!((F=V.action.edit)===null||F===void 0)&&F.edits.length)}},onFocus:V=>{var K,F;if(V&&V.action){const q=V.action.ranges,ie=V.action.diagnostics;if(R.clear(),q&&q.length>0){const ae=q.map(ne=>({range:ne,options:D.DECORATION}));R.set(ae)}else if(ie&&ie.length>0){const ae=ie.map($=>({range:$,options:D.DECORATION}));R.set(ae);const ne=ie[0];if(ne.startLineNumber&&ne.startColumn){const $=(F=(K=this._editor.getModel())===null||K===void 0?void 0:K.getWordAtPosition({lineNumber:ne.startLineNumber,column:ne.startColumn}))===null||F===void 0?void 0:F.word;k.status((0,r.localize)(0,null,$,ne.startLineNumber,ne.startColumn))}}}else R.clear()}};this._actionWidgetService.show("codeActionWidget",!0,(0,i.toMenuItems)(O,this._shouldShowHeaders(),this._resolver.getResolver()),W,B,x,this._getActionBarActions(P,N,M))}toCoords(P){if(!this._editor.hasModel())return{x:0,y:0};this._editor.revealPosition(P,1),this._editor.render();const N=this._editor.getScrolledVisiblePosition(P),M=(0,L.getDomNodePagePosition)(this._editor.getDomNode()),R=M.left+N.left,x=M.top+N.top+N.height;return{x:R,y:x}}_shouldShowHeaders(){var P;const N=(P=this._editor)===null||P===void 0?void 0:P.getModel();return this._configurationService.getValue("editor.codeActionWidget.showHeaders",{resource:N?.uri})}_getActionBarActions(P,N,M){if(M.fromLightbulb)return[];const R=P.documentation.map(x=>{var O;return{id:x.id,label:x.title,tooltip:(O=x.tooltip)!==null&&O!==void 0?O:"",class:void 0,enabled:!0,run:()=>{var B;return this._commandService.executeCommand(x.id,...(B=x.arguments)!==null&&B!==void 0?B:[])}}});return M.includeDisabledActions&&P.validActions.length>0&&P.allActions.length!==P.validActions.length&&R.push(this._showDisabled?{id:"hideMoreActions",label:(0,r.localize)(1,null),enabled:!0,tooltip:"",class:void 0,run:()=>(this._showDisabled=!1,this.showCodeActionList(P,N,M))}:{id:"showMoreActions",label:(0,r.localize)(2,null),enabled:!0,tooltip:"",class:void 0,run:()=>(this._showDisabled=!0,this.showCodeActionList(P,N,M))}),R}};e.CodeActionController=T,T.ID="editor.contrib.codeActionController",T.DECORATION=_.ModelDecorationOptions.register({description:"quickfix-highlight",className:I}),e.CodeActionController=T=D=ke([ge(1,l.IMarkerService),ge(2,d.IContextKeyService),ge(3,s.IInstantiationService),ge(4,v.ILanguageFeaturesService),ge(5,o.IEditorProgressService),ge(6,f.ICommandService),ge(7,c.IConfigurationService),ge(8,u.IActionWidgetService),ge(9,s.IInstantiationService)],T),(0,m.registerThemingParticipant)((A,P)=>{((R,x)=>{x&&P.addRule(`.monaco-editor ${R} { background-color: ${x}; }`)})(".quickfix-edit-highlight",A.getColor(g.editorFindMatchHighlight));const M=A.getColor(g.editorFindMatchHighlightBorder);M&&P.addRule(`.monaco-editor .quickfix-edit-highlight { border: 1px ${(0,h.isHighContrast)(A.type)?"dotted":"solid"} ${M}; box-sizing: border-box; }`)})}),define(se[890],oe([1,0,11,16,21,140,655,15,116,260,360]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AutoFixAction=e.FixAllAction=e.OrganizeImportsAction=e.SourceAction=e.RefactorAction=e.CodeActionCommand=e.QuickFixAction=void 0;function a(l){return p.ContextKeyExpr.regex(b.SUPPORTED_CODE_ACTIONS.keys()[0],new RegExp("(\\s|^)"+(0,L.escapeRegExpCharacters)(l.value)+"\\b"))}const i={type:"object",defaultSnippets:[{body:{kind:""}}],properties:{kind:{type:"string",description:S.localize(0,null)},apply:{type:"string",description:S.localize(1,null),default:"ifSingle",enum:["first","ifSingle","never"],enumDescriptions:[S.localize(2,null),S.localize(3,null),S.localize(4,null)]},preferred:{type:"boolean",default:!1,description:S.localize(5,null)}}};function n(l,o,g,h,m=_.CodeActionTriggerSource.Default){if(l.hasModel()){const C=v.CodeActionController.get(l);C?.manualTriggerAtCurrentPosition(o,m,g,h)}}class t extends k.EditorAction{constructor(){super({id:E.quickFixCommandId,label:S.localize(6,null),alias:"Quick Fix...",precondition:p.ContextKeyExpr.and(y.EditorContextKeys.writable,y.EditorContextKeys.hasCodeActionsProvider),kbOpts:{kbExpr:y.EditorContextKeys.textInputFocus,primary:2137,weight:100}})}run(o,g){return n(g,S.localize(7,null),void 0,void 0,_.CodeActionTriggerSource.QuickFix)}}e.QuickFixAction=t;class r extends k.EditorCommand{constructor(){super({id:E.codeActionCommandId,precondition:p.ContextKeyExpr.and(y.EditorContextKeys.writable,y.EditorContextKeys.hasCodeActionsProvider),metadata:{description:"Trigger a code action",args:[{name:"args",schema:i}]}})}runEditorCommand(o,g,h){const m=_.CodeActionCommandArgs.fromUser(h,{kind:_.CodeActionKind.Empty,apply:"ifSingle"});return n(g,typeof h?.kind=="string"?m.preferred?S.localize(8,null,h.kind):S.localize(9,null,h.kind):m.preferred?S.localize(10,null):S.localize(11,null),{include:m.kind,includeSourceActions:!0,onlyIncludePreferredActions:m.preferred},m.apply)}}e.CodeActionCommand=r;class u extends k.EditorAction{constructor(){super({id:E.refactorCommandId,label:S.localize(12,null),alias:"Refactor...",precondition:p.ContextKeyExpr.and(y.EditorContextKeys.writable,y.EditorContextKeys.hasCodeActionsProvider),kbOpts:{kbExpr:y.EditorContextKeys.textInputFocus,primary:3120,mac:{primary:1328},weight:100},contextMenuOpts:{group:"1_modification",order:2,when:p.ContextKeyExpr.and(y.EditorContextKeys.writable,a(_.CodeActionKind.Refactor))},metadata:{description:"Refactor...",args:[{name:"args",schema:i}]}})}run(o,g,h){const m=_.CodeActionCommandArgs.fromUser(h,{kind:_.CodeActionKind.Refactor,apply:"never"});return n(g,typeof h?.kind=="string"?m.preferred?S.localize(13,null,h.kind):S.localize(14,null,h.kind):m.preferred?S.localize(15,null):S.localize(16,null),{include:_.CodeActionKind.Refactor.contains(m.kind)?m.kind:_.CodeActionKind.None,onlyIncludePreferredActions:m.preferred},m.apply,_.CodeActionTriggerSource.Refactor)}}e.RefactorAction=u;class f extends k.EditorAction{constructor(){super({id:E.sourceActionCommandId,label:S.localize(17,null),alias:"Source Action...",precondition:p.ContextKeyExpr.and(y.EditorContextKeys.writable,y.EditorContextKeys.hasCodeActionsProvider),contextMenuOpts:{group:"1_modification",order:2.1,when:p.ContextKeyExpr.and(y.EditorContextKeys.writable,a(_.CodeActionKind.Source))},metadata:{description:"Source Action...",args:[{name:"args",schema:i}]}})}run(o,g,h){const m=_.CodeActionCommandArgs.fromUser(h,{kind:_.CodeActionKind.Source,apply:"never"});return n(g,typeof h?.kind=="string"?m.preferred?S.localize(18,null,h.kind):S.localize(19,null,h.kind):m.preferred?S.localize(20,null):S.localize(21,null),{include:_.CodeActionKind.Source.contains(m.kind)?m.kind:_.CodeActionKind.None,includeSourceActions:!0,onlyIncludePreferredActions:m.preferred},m.apply,_.CodeActionTriggerSource.SourceAction)}}e.SourceAction=f;class c extends k.EditorAction{constructor(){super({id:E.organizeImportsCommandId,label:S.localize(22,null),alias:"Organize Imports",precondition:p.ContextKeyExpr.and(y.EditorContextKeys.writable,a(_.CodeActionKind.SourceOrganizeImports)),kbOpts:{kbExpr:y.EditorContextKeys.textInputFocus,primary:1581,weight:100}})}run(o,g){return n(g,S.localize(23,null),{include:_.CodeActionKind.SourceOrganizeImports,includeSourceActions:!0},"ifSingle",_.CodeActionTriggerSource.OrganizeImports)}}e.OrganizeImportsAction=c;class d extends k.EditorAction{constructor(){super({id:E.fixAllCommandId,label:S.localize(24,null),alias:"Fix All",precondition:p.ContextKeyExpr.and(y.EditorContextKeys.writable,a(_.CodeActionKind.SourceFixAll))})}run(o,g){return n(g,S.localize(25,null),{include:_.CodeActionKind.SourceFixAll,includeSourceActions:!0},"ifSingle",_.CodeActionTriggerSource.FixAll)}}e.FixAllAction=d;class s extends k.EditorAction{constructor(){super({id:E.autoFixCommandId,label:S.localize(26,null),alias:"Auto Fix...",precondition:p.ContextKeyExpr.and(y.EditorContextKeys.writable,a(_.CodeActionKind.QuickFix)),kbOpts:{kbExpr:y.EditorContextKeys.textInputFocus,primary:1625,mac:{primary:2649},weight:100}})}run(o,g){return n(g,S.localize(27,null),{include:_.CodeActionKind.QuickFix,onlyIncludePreferredActions:!0},"ifSingle",_.CodeActionTriggerSource.AutoFix)}}e.AutoFixAction=s}),define(se[891],oe([1,0,16,246,890,260,361,656,98,37]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,L.registerEditorContribution)(E.CodeActionController.ID,E.CodeActionController,3),(0,L.registerEditorContribution)(S.LightBulbWidget.ID,S.LightBulbWidget,4),(0,L.registerEditorAction)(y.QuickFixAction),(0,L.registerEditorAction)(y.RefactorAction),(0,L.registerEditorAction)(y.SourceAction),(0,L.registerEditorAction)(y.OrganizeImportsAction),(0,L.registerEditorAction)(y.AutoFixAction),(0,L.registerEditorAction)(y.FixAllAction),(0,L.registerEditorCommand)(new y.CodeActionCommand),v.Registry.as(_.Extensions.Configuration).registerConfiguration({...k.editorConfigurationBaseNode,properties:{"editor.codeActionWidget.showHeaders":{type:"boolean",scope:5,description:p.localize(0,null),default:!0}}}),v.Registry.as(_.Extensions.Configuration).registerConfiguration({...k.editorConfigurationBaseNode,properties:{"editor.codeActionWidget.includeNearbyQuickFixes":{type:"boolean",scope:5,description:p.localize(1,null),default:!0}}})}),define(se[892],oe([1,0,7,118,5,38,456]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeLensWidget=e.CodeLensHelper=void 0;class S{constructor(i,n,t){this.afterColumn=1073741824,this.afterLineNumber=i,this.heightInPx=n,this._onHeight=t,this.suppressMouseDown=!0,this.domNode=document.createElement("div")}onComputedHeight(i){this._lastHeight===void 0?this._lastHeight=i:this._lastHeight!==i&&(this._lastHeight=i,this._onHeight())}isVisible(){return this._lastHeight!==0&&this.domNode.hasAttribute("monaco-visible-view-zone")}}class p{constructor(i,n){this.allowEditorOverflow=!1,this.suppressMouseDown=!0,this._commands=new Map,this._isEmpty=!0,this._editor=i,this._id=`codelens.widget-${p._idPool++}`,this.updatePosition(n),this._domNode=document.createElement("span"),this._domNode.className="codelens-decoration"}withCommands(i,n){this._commands.clear();const t=[];let r=!1;for(let u=0;u<i.length;u++){const f=i[u];if(f&&(r=!0,f.command)){const c=(0,k.renderLabelWithIcons)(f.command.title.trim());if(f.command.id){const d=`c${p._idPool++}`;t.push(L.$("a",{id:d,title:f.command.tooltip,role:"button"},...c)),this._commands.set(d,f.command)}else t.push(L.$("span",{title:f.command.tooltip},...c));u+1<i.length&&t.push(L.$("span",void 0,"\xA0|\xA0"))}}r?(L.reset(this._domNode,...t),this._isEmpty&&n&&this._domNode.classList.add("fadein"),this._isEmpty=!1):L.reset(this._domNode,L.$("span",void 0,"no commands"))}getCommand(i){return i.parentElement===this._domNode?this._commands.get(i.id):void 0}getId(){return this._id}getDomNode(){return this._domNode}updatePosition(i){const n=this._editor.getModel().getLineFirstNonWhitespaceColumn(i);this._widgetPosition={position:{lineNumber:i,column:n},preference:[1]}}getPosition(){return this._widgetPosition||null}}p._idPool=0;class _{constructor(){this._removeDecorations=[],this._addDecorations=[],this._addDecorationsCallbacks=[]}addDecoration(i,n){this._addDecorations.push(i),this._addDecorationsCallbacks.push(n)}removeDecoration(i){this._removeDecorations.push(i)}commit(i){const n=i.deltaDecorations(this._removeDecorations,this._addDecorations);for(let t=0,r=n.length;t<r;t++)this._addDecorationsCallbacks[t](n[t])}}e.CodeLensHelper=_;const v=E.ModelDecorationOptions.register({collapseOnReplaceEdit:!0,description:"codelens"});class b{constructor(i,n,t,r,u,f){this._isDisposed=!1,this._editor=n,this._data=i,this._decorationIds=[];let c;const d=[];this._data.forEach((s,l)=>{s.symbol.command&&d.push(s.symbol),t.addDecoration({range:s.symbol.range,options:v},o=>this._decorationIds[l]=o),c?c=y.Range.plusRange(c,s.symbol.range):c=y.Range.lift(s.symbol.range)}),this._viewZone=new S(c.startLineNumber-1,u,f),this._viewZoneId=r.addZone(this._viewZone),d.length>0&&(this._createContentWidgetIfNecessary(),this._contentWidget.withCommands(d,!1))}_createContentWidgetIfNecessary(){this._contentWidget?this._editor.layoutContentWidget(this._contentWidget):(this._contentWidget=new p(this._editor,this._viewZone.afterLineNumber+1),this._editor.addContentWidget(this._contentWidget))}dispose(i,n){this._decorationIds.forEach(i.removeDecoration,i),this._decorationIds=[],n?.removeZone(this._viewZoneId),this._contentWidget&&(this._editor.removeContentWidget(this._contentWidget),this._contentWidget=void 0),this._isDisposed=!0}isDisposed(){return this._isDisposed}isValid(){return this._decorationIds.some((i,n)=>{const t=this._editor.getModel().getDecorationRange(i),r=this._data[n].symbol;return!!(t&&y.Range.isEmpty(r.range)===t.isEmpty())})}updateCodeLensSymbols(i,n){this._decorationIds.forEach(n.removeDecoration,n),this._decorationIds=[],this._data=i,this._data.forEach((t,r)=>{n.addDecoration({range:t.symbol.range,options:v},u=>this._decorationIds[r]=u)})}updateHeight(i,n){this._viewZone.heightInPx=i,n.layoutZone(this._viewZoneId),this._contentWidget&&this._editor.layoutContentWidget(this._contentWidget)}computeIfNecessary(i){if(!this._viewZone.isVisible())return null;for(let n=0;n<this._decorationIds.length;n++){const t=i.getDecorationRange(this._decorationIds[n]);t&&(this._data[n].symbol.range=t)}return this._data}updateCommands(i){this._createContentWidgetIfNecessary(),this._contentWidget.withCommands(i,!0);for(let n=0;n<this._data.length;n++){const t=i[n];if(t){const{symbol:r}=this._data[n];r.command=t.command||r.command}}}getCommand(i){var n;return(n=this._contentWidget)===null||n===void 0?void 0:n.getCommand(i)}getLineNumber(){const i=this._editor.getModel().getDecorationRange(this._decorationIds[0]);return i?i.startLineNumber:-1}update(i){if(this.isValid()){const n=this._editor.getModel().getDecorationRange(this._decorationIds[0]);n&&(this._viewZone.afterLineNumber=n.startLineNumber-1,i.layoutZone(this._viewZoneId),this._contentWidget&&(this._contentWidget.updatePosition(n.startLineNumber),this._editor.layoutContentWidget(this._contentWidget)))}}}e.CodeLensWidget=b}),define(se[893],oe([1,0,14,12,2,127,16,36,21,343,805,892,660,25,50,70,79,18]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeLensContribution=void 0;let c=class{constructor(s,l,o,g,h,m){this._editor=s,this._languageFeaturesService=l,this._commandService=g,this._notificationService=h,this._codeLensCache=m,this._disposables=new y.DisposableStore,this._localToDispose=new y.DisposableStore,this._lenses=[],this._oldCodeLensModels=new y.DisposableStore,this._provideCodeLensDebounce=o.for(l.codeLensProvider,"CodeLensProvide",{min:250}),this._resolveCodeLensesDebounce=o.for(l.codeLensProvider,"CodeLensResolve",{min:250,salt:"resolve"}),this._resolveCodeLensesScheduler=new L.RunOnceScheduler(()=>this._resolveCodeLensesInViewport(),this._resolveCodeLensesDebounce.default()),this._disposables.add(this._editor.onDidChangeModel(()=>this._onModelChange())),this._disposables.add(this._editor.onDidChangeModelLanguage(()=>this._onModelChange())),this._disposables.add(this._editor.onDidChangeConfiguration(C=>{(C.hasChanged(50)||C.hasChanged(19)||C.hasChanged(18))&&this._updateLensStyle(),C.hasChanged(17)&&this._onModelChange()})),this._disposables.add(l.codeLensProvider.onDidChange(this._onModelChange,this)),this._onModelChange(),this._updateLensStyle()}dispose(){var s;this._localDispose(),this._disposables.dispose(),this._oldCodeLensModels.dispose(),(s=this._currentCodeLensModel)===null||s===void 0||s.dispose()}_getLayoutInfo(){const s=Math.max(1.3,this._editor.getOption(66)/this._editor.getOption(52));let l=this._editor.getOption(19);return(!l||l<5)&&(l=this._editor.getOption(52)*.9|0),{fontSize:l,codeLensHeight:l*s|0}}_updateLensStyle(){const{codeLensHeight:s,fontSize:l}=this._getLayoutInfo(),o=this._editor.getOption(18),g=this._editor.getOption(50),{style:h}=this._editor.getContainerDomNode();h.setProperty("--vscode-editorCodeLens-lineHeight",`${s}px`),h.setProperty("--vscode-editorCodeLens-fontSize",`${l}px`),h.setProperty("--vscode-editorCodeLens-fontFeatureSettings",g.fontFeatureSettings),o&&(h.setProperty("--vscode-editorCodeLens-fontFamily",o),h.setProperty("--vscode-editorCodeLens-fontFamilyDefault",p.EDITOR_FONT_DEFAULTS.fontFamily)),this._editor.changeViewZones(m=>{for(const C of this._lenses)C.updateHeight(s,m)})}_localDispose(){var s,l,o;(s=this._getCodeLensModelPromise)===null||s===void 0||s.cancel(),this._getCodeLensModelPromise=void 0,(l=this._resolveCodeLensesPromise)===null||l===void 0||l.cancel(),this._resolveCodeLensesPromise=void 0,this._localToDispose.clear(),this._oldCodeLensModels.clear(),(o=this._currentCodeLensModel)===null||o===void 0||o.dispose()}_onModelChange(){this._localDispose();const s=this._editor.getModel();if(!s||!this._editor.getOption(17)||s.isTooLargeForTokenization())return;const l=this._codeLensCache.get(s);if(l&&this._renderCodeLensSymbols(l),!this._languageFeaturesService.codeLensProvider.has(s)){l&&(0,L.disposableTimeout)(()=>{const g=this._codeLensCache.get(s);l===g&&(this._codeLensCache.delete(s),this._onModelChange())},30*1e3,this._localToDispose);return}for(const g of this._languageFeaturesService.codeLensProvider.all(s))if(typeof g.onDidChange=="function"){const h=g.onDidChange(()=>o.schedule());this._localToDispose.add(h)}const o=new L.RunOnceScheduler(()=>{var g;const h=Date.now();(g=this._getCodeLensModelPromise)===null||g===void 0||g.cancel(),this._getCodeLensModelPromise=(0,L.createCancelablePromise)(m=>(0,v.getCodeLensModel)(this._languageFeaturesService.codeLensProvider,s,m)),this._getCodeLensModelPromise.then(m=>{this._currentCodeLensModel&&this._oldCodeLensModels.add(this._currentCodeLensModel),this._currentCodeLensModel=m,this._codeLensCache.put(s,m);const C=this._provideCodeLensDebounce.update(s,Date.now()-h);o.delay=C,this._renderCodeLensSymbols(m),this._resolveCodeLensesInViewportSoon()},k.onUnexpectedError)},this._provideCodeLensDebounce.get(s));this._localToDispose.add(o),this._localToDispose.add((0,y.toDisposable)(()=>this._resolveCodeLensesScheduler.cancel())),this._localToDispose.add(this._editor.onDidChangeModelContent(()=>{var g;this._editor.changeDecorations(h=>{this._editor.changeViewZones(m=>{const C=[];let w=-1;this._lenses.forEach(I=>{!I.isValid()||w===I.getLineNumber()?C.push(I):(I.update(m),w=I.getLineNumber())});const D=new a.CodeLensHelper;C.forEach(I=>{I.dispose(D,m),this._lenses.splice(this._lenses.indexOf(I),1)}),D.commit(h)})}),o.schedule(),this._resolveCodeLensesScheduler.cancel(),(g=this._resolveCodeLensesPromise)===null||g===void 0||g.cancel(),this._resolveCodeLensesPromise=void 0})),this._localToDispose.add(this._editor.onDidFocusEditorWidget(()=>{o.schedule()})),this._localToDispose.add(this._editor.onDidBlurEditorText(()=>{o.cancel()})),this._localToDispose.add(this._editor.onDidScrollChange(g=>{g.scrollTopChanged&&this._lenses.length>0&&this._resolveCodeLensesInViewportSoon()})),this._localToDispose.add(this._editor.onDidLayoutChange(()=>{this._resolveCodeLensesInViewportSoon()})),this._localToDispose.add((0,y.toDisposable)(()=>{if(this._editor.getModel()){const g=E.StableEditorScrollState.capture(this._editor);this._editor.changeDecorations(h=>{this._editor.changeViewZones(m=>{this._disposeAllLenses(h,m)})}),g.restore(this._editor)}else this._disposeAllLenses(void 0,void 0)})),this._localToDispose.add(this._editor.onMouseDown(g=>{if(g.target.type!==9)return;let h=g.target.element;if(h?.tagName==="SPAN"&&(h=h.parentElement),h?.tagName==="A")for(const m of this._lenses){const C=m.getCommand(h);if(C){this._commandService.executeCommand(C.id,...C.arguments||[]).catch(w=>this._notificationService.error(w));break}}})),o.schedule()}_disposeAllLenses(s,l){const o=new a.CodeLensHelper;for(const g of this._lenses)g.dispose(o,l);s&&o.commit(s),this._lenses.length=0}_renderCodeLensSymbols(s){if(!this._editor.hasModel())return;const l=this._editor.getModel().getLineCount(),o=[];let g;for(const C of s.lenses){const w=C.symbol.range.startLineNumber;w<1||w>l||(g&&g[g.length-1].symbol.range.startLineNumber===w?g.push(C):(g=[C],o.push(g)))}if(!o.length&&!this._lenses.length)return;const h=E.StableEditorScrollState.capture(this._editor),m=this._getLayoutInfo();this._editor.changeDecorations(C=>{this._editor.changeViewZones(w=>{const D=new a.CodeLensHelper;let I=0,T=0;for(;T<o.length&&I<this._lenses.length;){const A=o[T][0].symbol.range.startLineNumber,P=this._lenses[I].getLineNumber();P<A?(this._lenses[I].dispose(D,w),this._lenses.splice(I,1)):P===A?(this._lenses[I].updateCodeLensSymbols(o[T],D),T++,I++):(this._lenses.splice(I,0,new a.CodeLensWidget(o[T],this._editor,D,w,m.codeLensHeight,()=>this._resolveCodeLensesInViewportSoon())),I++,T++)}for(;I<this._lenses.length;)this._lenses[I].dispose(D,w),this._lenses.splice(I,1);for(;T<o.length;)this._lenses.push(new a.CodeLensWidget(o[T],this._editor,D,w,m.codeLensHeight,()=>this._resolveCodeLensesInViewportSoon())),T++;D.commit(C)})}),h.restore(this._editor)}_resolveCodeLensesInViewportSoon(){this._editor.getModel()&&this._resolveCodeLensesScheduler.schedule()}_resolveCodeLensesInViewport(){var s;(s=this._resolveCodeLensesPromise)===null||s===void 0||s.cancel(),this._resolveCodeLensesPromise=void 0;const l=this._editor.getModel();if(!l)return;const o=[],g=[];if(this._lenses.forEach(C=>{const w=C.computeIfNecessary(l);w&&(o.push(w),g.push(C))}),o.length===0)return;const h=Date.now(),m=(0,L.createCancelablePromise)(C=>{const w=o.map((D,I)=>{const T=new Array(D.length),A=D.map((P,N)=>!P.symbol.command&&typeof P.provider.resolveCodeLens=="function"?Promise.resolve(P.provider.resolveCodeLens(l,P.symbol,C)).then(M=>{T[N]=M},k.onUnexpectedExternalError):(T[N]=P.symbol,Promise.resolve(void 0)));return Promise.all(A).then(()=>{!C.isCancellationRequested&&!g[I].isDisposed()&&g[I].updateCommands(T)})});return Promise.all(w)});this._resolveCodeLensesPromise=m,this._resolveCodeLensesPromise.then(()=>{const C=this._resolveCodeLensesDebounce.update(l,Date.now()-h);this._resolveCodeLensesScheduler.delay=C,this._currentCodeLensModel&&this._codeLensCache.put(l,this._currentCodeLensModel),this._oldCodeLensModels.clear(),m===this._resolveCodeLensesPromise&&(this._resolveCodeLensesPromise=void 0)},C=>{(0,k.onUnexpectedError)(C),m===this._resolveCodeLensesPromise&&(this._resolveCodeLensesPromise=void 0)})}async getModel(){var s;return await this._getCodeLensModelPromise,await this._resolveCodeLensesPromise,!((s=this._currentCodeLensModel)===null||s===void 0)&&s.isDisposed?void 0:this._currentCodeLensModel}};e.CodeLensContribution=c,c.ID="css.editor.codeLens",e.CodeLensContribution=c=ke([ge(1,f.ILanguageFeaturesService),ge(2,u.ILanguageFeatureDebounceService),ge(3,n.ICommandService),ge(4,t.INotificationService),ge(5,b.ICodeLensCache)],c),(0,S.registerEditorContribution)(c.ID,c,1),(0,S.registerEditorAction)(class extends S.EditorAction{constructor(){super({id:"codelens.showLensesInCurrentLine",precondition:_.EditorContextKeys.hasCodeLensProvider,label:(0,i.localize)(0,null),alias:"Show CodeLens Commands For Current Line"})}async run(s,l){if(!l.hasModel())return;const o=s.get(r.IQuickInputService),g=s.get(n.ICommandService),h=s.get(t.INotificationService),m=l.getSelection().positionLineNumber,C=l.getContribution(c.ID);if(!C)return;const w=await C.getModel();if(!w)return;const D=[];for(const A of w.lenses)A.symbol.command&&A.symbol.range.startLineNumber===m&&D.push({label:A.symbol.command.title,command:A.symbol.command});if(D.length===0)return;const I=await o.pick(D,{canPickMany:!1,placeHolder:(0,i.localize)(1,null)});if(!I)return;let T=I.command;if(w.isDisposed){const A=await C.getModel(),P=A?.lenses.find(N=>{var M;return N.symbol.range.startLineNumber===m&&((M=N.symbol.command)===null||M===void 0?void 0:M.title)===T.title});if(!P||!P.symbol.command)return;T=P.symbol.command}try{await g.executeCommand(T.id,...T.arguments||[])}catch(A){h.error(A)}}})}),define(se[375],oe([1,0,14,39,12,6,2,61,11,167,16,5,38,79,18,354,27]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u){"use strict";var f;Object.defineProperty(e,"__esModule",{value:!0}),e.DecoratorLimitReporter=e.ColorDetector=e.ColorDecorationInjectedTextMarker=void 0,e.ColorDecorationInjectedTextMarker=Object.create({});let c=f=class extends S.Disposable{constructor(l,o,g,h){super(),this._editor=l,this._configurationService=o,this._languageFeaturesService=g,this._localToDispose=this._register(new S.DisposableStore),this._decorationsIds=[],this._colorDatas=new Map,this._colorDecoratorIds=this._editor.createDecorationsCollection(),this._ruleFactory=new v.DynamicCssRules(this._editor),this._decoratorLimitReporter=new d,this._colorDecorationClassRefs=this._register(new S.DisposableStore),this._debounceInformation=h.for(g.colorProvider,"Document Colors",{min:f.RECOMPUTE_TIME}),this._register(l.onDidChangeModel(()=>{this._isColorDecoratorsEnabled=this.isEnabled(),this.updateColors()})),this._register(l.onDidChangeModelLanguage(()=>this.updateColors())),this._register(g.colorProvider.onDidChange(()=>this.updateColors())),this._register(l.onDidChangeConfiguration(m=>{const C=this._isColorDecoratorsEnabled;this._isColorDecoratorsEnabled=this.isEnabled(),this._isDefaultColorDecoratorsEnabled=this._editor.getOption(145);const w=C!==this._isColorDecoratorsEnabled||m.hasChanged(21),D=m.hasChanged(145);(w||D)&&(this._isColorDecoratorsEnabled?this.updateColors():this.removeAllDecorations())})),this._timeoutTimer=null,this._computePromise=null,this._isColorDecoratorsEnabled=this.isEnabled(),this._isDefaultColorDecoratorsEnabled=this._editor.getOption(145),this.updateColors()}isEnabled(){const l=this._editor.getModel();if(!l)return!1;const o=l.getLanguageId(),g=this._configurationService.getValue(o);if(g&&typeof g=="object"){const h=g.colorDecorators;if(h&&h.enable!==void 0&&!h.enable)return h.enable}return this._editor.getOption(20)}static get(l){return l.getContribution(this.ID)}dispose(){this.stop(),this.removeAllDecorations(),super.dispose()}updateColors(){if(this.stop(),!this._isColorDecoratorsEnabled)return;const l=this._editor.getModel();!l||!this._languageFeaturesService.colorProvider.has(l)||(this._localToDispose.add(this._editor.onDidChangeModelContent(()=>{this._timeoutTimer||(this._timeoutTimer=new L.TimeoutTimer,this._timeoutTimer.cancelAndSet(()=>{this._timeoutTimer=null,this.beginCompute()},this._debounceInformation.get(l)))})),this.beginCompute())}async beginCompute(){this._computePromise=(0,L.createCancelablePromise)(async l=>{const o=this._editor.getModel();if(!o)return[];const g=new p.StopWatch(!1),h=await(0,r.getColors)(this._languageFeaturesService.colorProvider,o,l,this._isDefaultColorDecoratorsEnabled);return this._debounceInformation.update(o,g.elapsed()),h});try{const l=await this._computePromise;this.updateDecorations(l),this.updateColorDecorators(l),this._computePromise=null}catch(l){(0,y.onUnexpectedError)(l)}}stop(){this._timeoutTimer&&(this._timeoutTimer.cancel(),this._timeoutTimer=null),this._computePromise&&(this._computePromise.cancel(),this._computePromise=null),this._localToDispose.clear()}updateDecorations(l){const o=l.map(g=>({range:{startLineNumber:g.colorInfo.range.startLineNumber,startColumn:g.colorInfo.range.startColumn,endLineNumber:g.colorInfo.range.endLineNumber,endColumn:g.colorInfo.range.endColumn},options:i.ModelDecorationOptions.EMPTY}));this._editor.changeDecorations(g=>{this._decorationsIds=g.deltaDecorations(this._decorationsIds,o),this._colorDatas=new Map,this._decorationsIds.forEach((h,m)=>this._colorDatas.set(h,l[m]))})}updateColorDecorators(l){this._colorDecorationClassRefs.clear();const o=[],g=this._editor.getOption(21);for(let m=0;m<l.length&&o.length<g;m++){const{red:C,green:w,blue:D,alpha:I}=l[m].colorInfo.color,T=new k.RGBA(Math.round(C*255),Math.round(w*255),Math.round(D*255),I),A=`rgba(${T.r}, ${T.g}, ${T.b}, ${T.a})`,P=this._colorDecorationClassRefs.add(this._ruleFactory.createClassNameRef({backgroundColor:A}));o.push({range:{startLineNumber:l[m].colorInfo.range.startLineNumber,startColumn:l[m].colorInfo.range.startColumn,endLineNumber:l[m].colorInfo.range.endLineNumber,endColumn:l[m].colorInfo.range.endColumn},options:{description:"colorDetector",before:{content:_.noBreakWhitespace,inlineClassName:`${P.className} colorpicker-color-decoration`,inlineClassNameAffectsLetterSpacing:!0,attachedData:e.ColorDecorationInjectedTextMarker}}})}const h=g<l.length?g:!1;this._decoratorLimitReporter.update(l.length,h),this._colorDecoratorIds.set(o)}removeAllDecorations(){this._editor.removeDecorations(this._decorationsIds),this._decorationsIds=[],this._colorDecoratorIds.clear(),this._colorDecorationClassRefs.clear()}getColorData(l){const o=this._editor.getModel();if(!o)return null;const g=o.getDecorationsInRange(a.Range.fromPositions(l,l)).filter(h=>this._colorDatas.has(h.id));return g.length===0?null:this._colorDatas.get(g[0].id)}isColorDecoration(l){return this._colorDecoratorIds.has(l)}};e.ColorDetector=c,c.ID="editor.contrib.colorDetector",c.RECOMPUTE_TIME=1e3,e.ColorDetector=c=f=ke([ge(1,u.IConfigurationService),ge(2,t.ILanguageFeaturesService),ge(3,n.ILanguageFeatureDebounceService)],c);class d{constructor(){this._onDidChange=new E.Emitter,this._computed=0,this._limited=!1}update(l,o){(l!==this._computed||o!==this._limited)&&(this._computed=l,this._limited=o,this._onDidChange.fire())}}e.DecoratorLimitReporter=d,(0,b.registerEditorContribution)(c.ID,c,1)}),define(se[376],oe([1,0,14,19,39,2,5,354,375,553,842,23,7]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneColorPickerParticipant=e.StandaloneColorPickerHover=e.ColorHoverParticipant=e.ColorHover=void 0;class n{constructor(o,g,h,m){this.owner=o,this.range=g,this.model=h,this.provider=m,this.forceShowAtRange=!0}isValidForHoverAnchor(o){return o.type===1&&this.range.startColumn<=o.range.startColumn&&this.range.endColumn>=o.range.endColumn}}e.ColorHover=n;let t=class{constructor(o,g){this._editor=o,this._themeService=g,this.hoverOrdinal=2}computeSync(o,g){return[]}computeAsync(o,g,h){return L.AsyncIterableObject.fromPromise(this._computeAsync(o,g,h))}async _computeAsync(o,g,h){if(!this._editor.hasModel())return[];const m=_.ColorDetector.get(this._editor);if(!m)return[];for(const C of g){if(!m.isColorDecoration(C))continue;const w=m.getColorData(C.range.getStartPosition());if(w)return[await f(this,this._editor.getModel(),w.colorInfo,w.provider)]}return[]}renderHoverParts(o,g){return c(this,this._editor,this._themeService,g,o)}};e.ColorHoverParticipant=t,e.ColorHoverParticipant=t=ke([ge(1,a.IThemeService)],t);class r{constructor(o,g,h,m){this.owner=o,this.range=g,this.model=h,this.provider=m}}e.StandaloneColorPickerHover=r;let u=class{constructor(o,g){this._editor=o,this._themeService=g,this._color=null}async createColorHover(o,g,h){if(!this._editor.hasModel()||!_.ColorDetector.get(this._editor))return null;const C=await(0,p.getColors)(h,this._editor.getModel(),k.CancellationToken.None);let w=null,D=null;for(const P of C){const N=P.colorInfo;S.Range.containsRange(N.range,o.range)&&(w=N,D=P.provider)}const I=w??o,T=D??g,A=!!w;return{colorHover:await f(this,this._editor.getModel(),I,T),foundInEditor:A}}async updateEditorModel(o){if(!this._editor.hasModel())return;const g=o.model;let h=new S.Range(o.range.startLineNumber,o.range.startColumn,o.range.endLineNumber,o.range.endColumn);this._color&&(await s(this._editor.getModel(),g,this._color,h,o),h=d(this._editor,h,g))}renderHoverParts(o,g){return c(this,this._editor,this._themeService,g,o)}set color(o){this._color=o}get color(){return this._color}};e.StandaloneColorPickerParticipant=u,e.StandaloneColorPickerParticipant=u=ke([ge(1,a.IThemeService)],u);async function f(l,o,g,h){const m=o.getValueInRange(g.range),{red:C,green:w,blue:D,alpha:I}=g.color,T=new y.RGBA(Math.round(C*255),Math.round(w*255),Math.round(D*255),I),A=new y.Color(T),P=await(0,p.getColorPresentations)(o,g,h,k.CancellationToken.None),N=new v.ColorPickerModel(A,[],0);return N.colorPresentations=P||[],N.guessColorPresentation(A,m),l instanceof t?new n(l,S.Range.lift(g.range),N,h):new r(l,S.Range.lift(g.range),N,h)}function c(l,o,g,h,m){if(h.length===0||!o.hasModel())return E.Disposable.None;if(m.setMinimumDimensions){const N=o.getOption(66)+8;m.setMinimumDimensions(new i.Dimension(302,N))}const C=new E.DisposableStore,w=h[0],D=o.getModel(),I=w.model,T=C.add(new b.ColorPickerWidget(m.fragment,I,o.getOption(141),g,l instanceof u));m.setColorPicker(T);let A=!1,P=new S.Range(w.range.startLineNumber,w.range.startColumn,w.range.endLineNumber,w.range.endColumn);if(l instanceof u){const N=h[0].model.color;l.color=N,s(D,I,N,P,w),C.add(I.onColorFlushed(M=>{l.color=M}))}else C.add(I.onColorFlushed(async N=>{await s(D,I,N,P,w),A=!0,P=d(o,P,I)}));return C.add(I.onDidChangeColor(N=>{s(D,I,N,P,w)})),C.add(o.onDidChangeModelContent(N=>{A?A=!1:(m.hide(),o.focus())})),C}function d(l,o,g){var h,m;const C=[],w=(h=g.presentation.textEdit)!==null&&h!==void 0?h:{range:o,text:g.presentation.label,forceMoveMarkers:!1};C.push(w),g.presentation.additionalTextEdits&&C.push(...g.presentation.additionalTextEdits);const D=S.Range.lift(w.range),I=l.getModel()._setTrackedRange(null,D,3);return l.executeEdits("colorpicker",C),l.pushUndoStop(),(m=l.getModel()._getTrackedRange(I))!==null&&m!==void 0?m:D}async function s(l,o,g,h,m){const C=await(0,p.getColorPresentations)(l,{range:h,color:{red:g.rgba.r/255,green:g.rgba.g/255,blue:g.rgba.b/255,alpha:g.rgba.a}},m.provider,k.CancellationToken.None);o.colorPresentations=C||[]}}),define(se[894],oe([1,0,2,17,16,10,5,24,38,555,457]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DragAndDropController=void 0;function b(i){return k.isMacintosh?i.altKey:i.ctrlKey}class a extends L.Disposable{constructor(n){super(),this._editor=n,this._dndDecorationIds=this._editor.createDecorationsCollection(),this._register(this._editor.onMouseDown(t=>this._onEditorMouseDown(t))),this._register(this._editor.onMouseUp(t=>this._onEditorMouseUp(t))),this._register(this._editor.onMouseDrag(t=>this._onEditorMouseDrag(t))),this._register(this._editor.onMouseDrop(t=>this._onEditorMouseDrop(t))),this._register(this._editor.onMouseDropCanceled(()=>this._onEditorMouseDropCanceled())),this._register(this._editor.onKeyDown(t=>this.onEditorKeyDown(t))),this._register(this._editor.onKeyUp(t=>this.onEditorKeyUp(t))),this._register(this._editor.onDidBlurEditorWidget(()=>this.onEditorBlur())),this._register(this._editor.onDidBlurEditorText(()=>this.onEditorBlur())),this._mouseDown=!1,this._modifierPressed=!1,this._dragSelection=null}onEditorBlur(){this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1,this._modifierPressed=!1}onEditorKeyDown(n){!this._editor.getOption(35)||this._editor.getOption(22)||(b(n)&&(this._modifierPressed=!0),this._mouseDown&&b(n)&&this._editor.updateOptions({mouseStyle:"copy"}))}onEditorKeyUp(n){!this._editor.getOption(35)||this._editor.getOption(22)||(b(n)&&(this._modifierPressed=!1),this._mouseDown&&n.keyCode===a.TRIGGER_KEY_VALUE&&this._editor.updateOptions({mouseStyle:"default"}))}_onEditorMouseDown(n){this._mouseDown=!0}_onEditorMouseUp(n){this._mouseDown=!1,this._editor.updateOptions({mouseStyle:"text"})}_onEditorMouseDrag(n){const t=n.target;if(this._dragSelection===null){const u=(this._editor.getSelections()||[]).filter(f=>t.position&&f.containsPosition(t.position));if(u.length===1)this._dragSelection=u[0];else return}b(n.event)?this._editor.updateOptions({mouseStyle:"copy"}):this._editor.updateOptions({mouseStyle:"default"}),t.position&&(this._dragSelection.containsPosition(t.position)?this._removeDecoration():this.showAt(t.position))}_onEditorMouseDropCanceled(){this._editor.updateOptions({mouseStyle:"text"}),this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1}_onEditorMouseDrop(n){if(n.target&&(this._hitContent(n.target)||this._hitMargin(n.target))&&n.target.position){const t=new E.Position(n.target.position.lineNumber,n.target.position.column);if(this._dragSelection===null){let r=null;if(n.event.shiftKey){const u=this._editor.getSelection();if(u){const{selectionStartLineNumber:f,selectionStartColumn:c}=u;r=[new p.Selection(f,c,t.lineNumber,t.column)]}}else r=(this._editor.getSelections()||[]).map(u=>u.containsPosition(t)?new p.Selection(t.lineNumber,t.column,t.lineNumber,t.column):u);this._editor.setSelections(r||[],"mouse",3)}else(!this._dragSelection.containsPosition(t)||(b(n.event)||this._modifierPressed)&&(this._dragSelection.getEndPosition().equals(t)||this._dragSelection.getStartPosition().equals(t)))&&(this._editor.pushUndoStop(),this._editor.executeCommand(a.ID,new v.DragAndDropCommand(this._dragSelection,t,b(n.event)||this._modifierPressed)),this._editor.pushUndoStop())}this._editor.updateOptions({mouseStyle:"text"}),this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1}showAt(n){this._dndDecorationIds.set([{range:new S.Range(n.lineNumber,n.column,n.lineNumber,n.column),options:a._DECORATION_OPTIONS}]),this._editor.revealPosition(n,1)}_removeDecoration(){this._dndDecorationIds.clear()}_hitContent(n){return n.type===6||n.type===7}_hitMargin(n){return n.type===2||n.type===3||n.type===4}dispose(){this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1,this._modifierPressed=!1,super.dispose()}}e.DragAndDropController=a,a.ID="editor.contrib.dragAndDrop",a.TRIGGER_KEY_VALUE=k.isMacintosh?6:5,a._DECORATION_OPTIONS=_.ModelDecorationOptions.register({description:"dnd-target",className:"dnd-target"}),(0,y.registerEditorContribution)(a.ID,a,2)}),define(se[895],oe([1,0,5,41,38,29,23]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FindDecorations=void 0;class p{constructor(v){this._editor=v,this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null,this._startPosition=this._editor.getPosition()}dispose(){this._editor.removeDecorations(this._allDecorations()),this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null}reset(){this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null}getCount(){return this._decorations.length}getFindScope(){return this._findScopeDecorationIds[0]?this._editor.getModel().getDecorationRange(this._findScopeDecorationIds[0]):null}getFindScopes(){if(this._findScopeDecorationIds.length){const v=this._findScopeDecorationIds.map(b=>this._editor.getModel().getDecorationRange(b)).filter(b=>!!b);if(v.length)return v}return null}getStartPosition(){return this._startPosition}setStartPosition(v){this._startPosition=v,this.setCurrentFindMatch(null)}_getDecorationIndex(v){const b=this._decorations.indexOf(v);return b>=0?b+1:1}getDecorationRangeAt(v){const b=v<this._decorations.length?this._decorations[v]:null;return b?this._editor.getModel().getDecorationRange(b):null}getCurrentMatchesPosition(v){const b=this._editor.getModel().getDecorationsInRange(v);for(const a of b){const i=a.options;if(i===p._FIND_MATCH_DECORATION||i===p._CURRENT_FIND_MATCH_DECORATION)return this._getDecorationIndex(a.id)}return 0}setCurrentFindMatch(v){let b=null,a=0;if(v)for(let i=0,n=this._decorations.length;i<n;i++){const t=this._editor.getModel().getDecorationRange(this._decorations[i]);if(v.equalsRange(t)){b=this._decorations[i],a=i+1;break}}return(this._highlightedDecorationId!==null||b!==null)&&this._editor.changeDecorations(i=>{if(this._highlightedDecorationId!==null&&(i.changeDecorationOptions(this._highlightedDecorationId,p._FIND_MATCH_DECORATION),this._highlightedDecorationId=null),b!==null&&(this._highlightedDecorationId=b,i.changeDecorationOptions(this._highlightedDecorationId,p._CURRENT_FIND_MATCH_DECORATION)),this._rangeHighlightDecorationId!==null&&(i.removeDecoration(this._rangeHighlightDecorationId),this._rangeHighlightDecorationId=null),b!==null){let n=this._editor.getModel().getDecorationRange(b);if(n.startLineNumber!==n.endLineNumber&&n.endColumn===1){const t=n.endLineNumber-1,r=this._editor.getModel().getLineMaxColumn(t);n=new L.Range(n.startLineNumber,n.startColumn,t,r)}this._rangeHighlightDecorationId=i.addDecoration(n,p._RANGE_HIGHLIGHT_DECORATION)}}),a}set(v,b){this._editor.changeDecorations(a=>{let i=p._FIND_MATCH_DECORATION;const n=[];if(v.length>1e3){i=p._FIND_MATCH_NO_OVERVIEW_DECORATION;const r=this._editor.getModel().getLineCount(),f=this._editor.getLayoutInfo().height/r,c=Math.max(2,Math.ceil(3/f));let d=v[0].range.startLineNumber,s=v[0].range.endLineNumber;for(let l=1,o=v.length;l<o;l++){const g=v[l].range;s+c>=g.startLineNumber?g.endLineNumber>s&&(s=g.endLineNumber):(n.push({range:new L.Range(d,1,s,1),options:p._FIND_MATCH_ONLY_OVERVIEW_DECORATION}),d=g.startLineNumber,s=g.endLineNumber)}n.push({range:new L.Range(d,1,s,1),options:p._FIND_MATCH_ONLY_OVERVIEW_DECORATION})}const t=new Array(v.length);for(let r=0,u=v.length;r<u;r++)t[r]={range:v[r].range,options:i};this._decorations=a.deltaDecorations(this._decorations,t),this._overviewRulerApproximateDecorations=a.deltaDecorations(this._overviewRulerApproximateDecorations,n),this._rangeHighlightDecorationId&&(a.removeDecoration(this._rangeHighlightDecorationId),this._rangeHighlightDecorationId=null),this._findScopeDecorationIds.length&&(this._findScopeDecorationIds.forEach(r=>a.removeDecoration(r)),this._findScopeDecorationIds=[]),b?.length&&(this._findScopeDecorationIds=b.map(r=>a.addDecoration(r,p._FIND_SCOPE_DECORATION)))})}matchBeforePosition(v){if(this._decorations.length===0)return null;for(let b=this._decorations.length-1;b>=0;b--){const a=this._decorations[b],i=this._editor.getModel().getDecorationRange(a);if(!(!i||i.endLineNumber>v.lineNumber)){if(i.endLineNumber<v.lineNumber)return i;if(!(i.endColumn>v.column))return i}}return this._editor.getModel().getDecorationRange(this._decorations[this._decorations.length-1])}matchAfterPosition(v){if(this._decorations.length===0)return null;for(let b=0,a=this._decorations.length;b<a;b++){const i=this._decorations[b],n=this._editor.getModel().getDecorationRange(i);if(!(!n||n.startLineNumber<v.lineNumber)){if(n.startLineNumber>v.lineNumber)return n;if(!(n.startColumn<v.column))return n}}return this._editor.getModel().getDecorationRange(this._decorations[0])}_allDecorations(){let v=[];return v=v.concat(this._decorations),v=v.concat(this._overviewRulerApproximateDecorations),this._findScopeDecorationIds.length&&v.push(...this._findScopeDecorationIds),this._rangeHighlightDecorationId&&v.push(this._rangeHighlightDecorationId),v}}e.FindDecorations=p,p._CURRENT_FIND_MATCH_DECORATION=y.ModelDecorationOptions.register({description:"current-find-match",stickiness:1,zIndex:13,className:"currentFindMatch",showIfCollapsed:!0,overviewRuler:{color:(0,S.themeColorFromId)(E.overviewRulerFindMatchForeground),position:k.OverviewRulerLane.Center},minimap:{color:(0,S.themeColorFromId)(E.minimapFindMatch),position:k.MinimapPosition.Inline}}),p._FIND_MATCH_DECORATION=y.ModelDecorationOptions.register({description:"find-match",stickiness:1,zIndex:10,className:"findMatch",showIfCollapsed:!0,overviewRuler:{color:(0,S.themeColorFromId)(E.overviewRulerFindMatchForeground),position:k.OverviewRulerLane.Center},minimap:{color:(0,S.themeColorFromId)(E.minimapFindMatch),position:k.MinimapPosition.Inline}}),p._FIND_MATCH_NO_OVERVIEW_DECORATION=y.ModelDecorationOptions.register({description:"find-match-no-overview",stickiness:1,className:"findMatch",showIfCollapsed:!0}),p._FIND_MATCH_ONLY_OVERVIEW_DECORATION=y.ModelDecorationOptions.register({description:"find-match-only-overview",stickiness:1,overviewRuler:{color:(0,S.themeColorFromId)(E.overviewRulerFindMatchForeground),position:k.OverviewRulerLane.Center}}),p._RANGE_HIGHLIGHT_DECORATION=y.ModelDecorationOptions.register({description:"find-range-highlight",stickiness:1,className:"rangeHighlight",isWholeLine:!0}),p._FIND_SCOPE_DECORATION=y.ModelDecorationOptions.register({description:"find-scope",className:"findScope",isWholeLine:!0})}),define(se[195],oe([1,0,60,14,2,130,10,5,24,184,895,556,557,15]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FindModelBoundToEditorModel=e.MATCHES_LIMIT=e.FIND_IDS=e.TogglePreserveCaseKeybinding=e.ToggleSearchScopeKeybinding=e.ToggleRegexKeybinding=e.ToggleWholeWordKeybinding=e.ToggleCaseSensitiveKeybinding=e.CONTEXT_REPLACE_INPUT_FOCUSED=e.CONTEXT_FIND_INPUT_FOCUSED=e.CONTEXT_FIND_WIDGET_NOT_VISIBLE=e.CONTEXT_FIND_WIDGET_VISIBLE=void 0,e.CONTEXT_FIND_WIDGET_VISIBLE=new n.RawContextKey("findWidgetVisible",!1),e.CONTEXT_FIND_WIDGET_NOT_VISIBLE=e.CONTEXT_FIND_WIDGET_VISIBLE.toNegated(),e.CONTEXT_FIND_INPUT_FOCUSED=new n.RawContextKey("findInputFocussed",!1),e.CONTEXT_REPLACE_INPUT_FOCUSED=new n.RawContextKey("replaceInputFocussed",!1),e.ToggleCaseSensitiveKeybinding={primary:545,mac:{primary:2593}},e.ToggleWholeWordKeybinding={primary:565,mac:{primary:2613}},e.ToggleRegexKeybinding={primary:560,mac:{primary:2608}},e.ToggleSearchScopeKeybinding={primary:554,mac:{primary:2602}},e.TogglePreserveCaseKeybinding={primary:558,mac:{primary:2606}},e.FIND_IDS={StartFindAction:"actions.find",StartFindWithSelection:"actions.findWithSelection",StartFindWithArgs:"editor.actions.findWithArgs",NextMatchFindAction:"editor.action.nextMatchFindAction",PreviousMatchFindAction:"editor.action.previousMatchFindAction",GoToMatchFindAction:"editor.action.goToMatchFindAction",NextSelectionMatchFindAction:"editor.action.nextSelectionMatchFindAction",PreviousSelectionMatchFindAction:"editor.action.previousSelectionMatchFindAction",StartFindReplaceAction:"editor.action.startFindReplaceAction",CloseFindWidgetCommand:"closeFindWidget",ToggleCaseSensitiveCommand:"toggleFindCaseSensitive",ToggleWholeWordCommand:"toggleFindWholeWord",ToggleRegexCommand:"toggleFindRegex",ToggleSearchScopeCommand:"toggleFindInSelection",TogglePreserveCaseCommand:"togglePreserveCase",ReplaceOneAction:"editor.action.replaceOne",ReplaceAllAction:"editor.action.replaceAll",SelectAllMatchesAction:"editor.action.selectAllMatches"},e.MATCHES_LIMIT=19999;const t=240;class r{constructor(f,c){this._toDispose=new y.DisposableStore,this._editor=f,this._state=c,this._isDisposed=!1,this._startSearchingTimer=new k.TimeoutTimer,this._decorations=new b.FindDecorations(f),this._toDispose.add(this._decorations),this._updateDecorationsScheduler=new k.RunOnceScheduler(()=>this.research(!1),100),this._toDispose.add(this._updateDecorationsScheduler),this._toDispose.add(this._editor.onDidChangeCursorPosition(d=>{(d.reason===3||d.reason===5||d.reason===6)&&this._decorations.setStartPosition(this._editor.getPosition())})),this._ignoreModelContentChanged=!1,this._toDispose.add(this._editor.onDidChangeModelContent(d=>{this._ignoreModelContentChanged||(d.isFlush&&this._decorations.reset(),this._decorations.setStartPosition(this._editor.getPosition()),this._updateDecorationsScheduler.schedule())})),this._toDispose.add(this._state.onFindReplaceStateChange(d=>this._onStateChanged(d))),this.research(!1,this._state.searchScope)}dispose(){this._isDisposed=!0,(0,y.dispose)(this._startSearchingTimer),this._toDispose.dispose()}_onStateChanged(f){this._isDisposed||this._editor.hasModel()&&(f.searchString||f.isReplaceRevealed||f.isRegex||f.wholeWord||f.matchCase||f.searchScope)&&(this._editor.getModel().isTooLargeForSyncing()?(this._startSearchingTimer.cancel(),this._startSearchingTimer.setIfNotSet(()=>{f.searchScope?this.research(f.moveCursor,this._state.searchScope):this.research(f.moveCursor)},t)):f.searchScope?this.research(f.moveCursor,this._state.searchScope):this.research(f.moveCursor))}static _getSearchRange(f,c){return c||f.getFullModelRange()}research(f,c){let d=null;typeof c<"u"?c!==null&&(Array.isArray(c)?d=c:d=[c]):d=this._decorations.getFindScopes(),d!==null&&(d=d.map(g=>{if(g.startLineNumber!==g.endLineNumber){let h=g.endLineNumber;return g.endColumn===1&&(h=h-1),new p.Range(g.startLineNumber,1,h,this._editor.getModel().getLineMaxColumn(h))}return g}));const s=this._findMatches(d,!1,e.MATCHES_LIMIT);this._decorations.set(s,d);const l=this._editor.getSelection();let o=this._decorations.getCurrentMatchesPosition(l);if(o===0&&s.length>0){const g=(0,L.findFirstIdxMonotonousOrArrLen)(s.map(h=>h.range),h=>p.Range.compareRangesUsingStarts(h,l)>=0);o=g>0?g-1+1:o}this._state.changeMatchInfo(o,this._decorations.getCount(),void 0),f&&this._editor.getOption(41).cursorMoveOnType&&this._moveToNextMatch(this._decorations.getStartPosition())}_hasMatches(){return this._state.matchesCount>0}_cannotFind(){if(!this._hasMatches()){const f=this._decorations.getFindScope();return f&&this._editor.revealRangeInCenterIfOutsideViewport(f,0),!0}return!1}_setCurrentFindMatch(f){const c=this._decorations.setCurrentFindMatch(f);this._state.changeMatchInfo(c,this._decorations.getCount(),f),this._editor.setSelection(f),this._editor.revealRangeInCenterIfOutsideViewport(f,0)}_prevSearchPosition(f){const c=this._state.isRegex&&(this._state.searchString.indexOf("^")>=0||this._state.searchString.indexOf("$")>=0);let{lineNumber:d,column:s}=f;const l=this._editor.getModel();return c||s===1?(d===1?d=l.getLineCount():d--,s=l.getLineMaxColumn(d)):s--,new S.Position(d,s)}_moveToPrevMatch(f,c=!1){if(!this._state.canNavigateBack()){const C=this._decorations.matchAfterPosition(f);C&&this._setCurrentFindMatch(C);return}if(this._decorations.getCount()<e.MATCHES_LIMIT){let C=this._decorations.matchBeforePosition(f);C&&C.isEmpty()&&C.getStartPosition().equals(f)&&(f=this._prevSearchPosition(f),C=this._decorations.matchBeforePosition(f)),C&&this._setCurrentFindMatch(C);return}if(this._cannotFind())return;const d=this._decorations.getFindScope(),s=r._getSearchRange(this._editor.getModel(),d);s.getEndPosition().isBefore(f)&&(f=s.getEndPosition()),f.isBefore(s.getStartPosition())&&(f=s.getEndPosition());const{lineNumber:l,column:o}=f,g=this._editor.getModel();let h=new S.Position(l,o),m=g.findPreviousMatch(this._state.searchString,h,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(129):null,!1);if(m&&m.range.isEmpty()&&m.range.getStartPosition().equals(h)&&(h=this._prevSearchPosition(h),m=g.findPreviousMatch(this._state.searchString,h,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(129):null,!1)),!!m){if(!c&&!s.containsRange(m.range))return this._moveToPrevMatch(m.range.getStartPosition(),!0);this._setCurrentFindMatch(m.range)}}moveToPrevMatch(){this._moveToPrevMatch(this._editor.getSelection().getStartPosition())}_nextSearchPosition(f){const c=this._state.isRegex&&(this._state.searchString.indexOf("^")>=0||this._state.searchString.indexOf("$")>=0);let{lineNumber:d,column:s}=f;const l=this._editor.getModel();return c||s===l.getLineMaxColumn(d)?(d===l.getLineCount()?d=1:d++,s=1):s++,new S.Position(d,s)}_moveToNextMatch(f){if(!this._state.canNavigateForward()){const d=this._decorations.matchBeforePosition(f);d&&this._setCurrentFindMatch(d);return}if(this._decorations.getCount()<e.MATCHES_LIMIT){let d=this._decorations.matchAfterPosition(f);d&&d.isEmpty()&&d.getStartPosition().equals(f)&&(f=this._nextSearchPosition(f),d=this._decorations.matchAfterPosition(f)),d&&this._setCurrentFindMatch(d);return}const c=this._getNextMatch(f,!1,!0);c&&this._setCurrentFindMatch(c.range)}_getNextMatch(f,c,d,s=!1){if(this._cannotFind())return null;const l=this._decorations.getFindScope(),o=r._getSearchRange(this._editor.getModel(),l);o.getEndPosition().isBefore(f)&&(f=o.getStartPosition()),f.isBefore(o.getStartPosition())&&(f=o.getStartPosition());const{lineNumber:g,column:h}=f,m=this._editor.getModel();let C=new S.Position(g,h),w=m.findNextMatch(this._state.searchString,C,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(129):null,c);return d&&w&&w.range.isEmpty()&&w.range.getStartPosition().equals(C)&&(C=this._nextSearchPosition(C),w=m.findNextMatch(this._state.searchString,C,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(129):null,c)),w?!s&&!o.containsRange(w.range)?this._getNextMatch(w.range.getEndPosition(),c,d,!0):w:null}moveToNextMatch(){this._moveToNextMatch(this._editor.getSelection().getEndPosition())}_moveToMatch(f){const c=this._decorations.getDecorationRangeAt(f);c&&this._setCurrentFindMatch(c)}moveToMatch(f){this._moveToMatch(f)}_getReplacePattern(){return this._state.isRegex?(0,i.parseReplaceString)(this._state.replaceString):i.ReplacePattern.fromStaticValue(this._state.replaceString)}replace(){if(!this._hasMatches())return;const f=this._getReplacePattern(),c=this._editor.getSelection(),d=this._getNextMatch(c.getStartPosition(),!0,!1);if(d)if(c.equalsRange(d.range)){const s=f.buildReplaceString(d.matches,this._state.preserveCase),l=new E.ReplaceCommand(c,s);this._executeEditorCommand("replace",l),this._decorations.setStartPosition(new S.Position(c.startLineNumber,c.startColumn+s.length)),this.research(!0)}else this._decorations.setStartPosition(this._editor.getPosition()),this._setCurrentFindMatch(d.range)}_findMatches(f,c,d){const s=(f||[null]).map(l=>r._getSearchRange(this._editor.getModel(),l));return this._editor.getModel().findMatches(this._state.searchString,s,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(129):null,c,d)}replaceAll(){if(!this._hasMatches())return;const f=this._decorations.getFindScopes();f===null&&this._state.matchesCount>=e.MATCHES_LIMIT?this._largeReplaceAll():this._regularReplaceAll(f),this.research(!1)}_largeReplaceAll(){const c=new v.SearchParams(this._state.searchString,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(129):null).parseSearchRequest();if(!c)return;let d=c.regex;if(!d.multiline){let w="mu";d.ignoreCase&&(w+="i"),d.global&&(w+="g"),d=new RegExp(d.source,w)}const s=this._editor.getModel(),l=s.getValue(1),o=s.getFullModelRange(),g=this._getReplacePattern();let h;const m=this._state.preserveCase;g.hasReplacementPatterns||m?h=l.replace(d,function(){return g.buildReplaceString(arguments,m)}):h=l.replace(d,g.buildReplaceString(null,m));const C=new E.ReplaceCommandThatPreservesSelection(o,h,this._editor.getSelection());this._executeEditorCommand("replaceAll",C)}_regularReplaceAll(f){const c=this._getReplacePattern(),d=this._findMatches(f,c.hasReplacementPatterns||this._state.preserveCase,1073741824),s=[];for(let o=0,g=d.length;o<g;o++)s[o]=c.buildReplaceString(d[o].matches,this._state.preserveCase);const l=new a.ReplaceAllCommand(this._editor.getSelection(),d.map(o=>o.range),s);this._executeEditorCommand("replaceAll",l)}selectAllMatches(){if(!this._hasMatches())return;const f=this._decorations.getFindScopes();let d=this._findMatches(f,!1,1073741824).map(l=>new _.Selection(l.range.startLineNumber,l.range.startColumn,l.range.endLineNumber,l.range.endColumn));const s=this._editor.getSelection();for(let l=0,o=d.length;l<o;l++)if(d[l].equalsRange(s)){d=[s].concat(d.slice(0,l)).concat(d.slice(l+1));break}this._editor.setSelections(d)}_executeEditorCommand(f,c){try{this._ignoreModelContentChanged=!0,this._editor.pushUndoStop(),this._editor.executeCommand(f,c),this._editor.pushUndoStop()}finally{this._ignoreModelContentChanged=!1}}}e.FindModelBoundToEditorModel=r}),define(se[896],oe([1,0,7,323,76,14,195,29,459]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FindOptionsWidget=void 0;class _ extends y.Widget{constructor(b,a,i){super(),this._hideSoon=this._register(new E.RunOnceScheduler(()=>this._hide(),2e3)),this._isVisible=!1,this._editor=b,this._state=a,this._keybindingService=i,this._domNode=document.createElement("div"),this._domNode.className="findOptionsWidget",this._domNode.style.display="none",this._domNode.style.top="10px",this._domNode.style.zIndex="12",this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true");const n={inputActiveOptionBorder:(0,p.asCssVariable)(p.inputActiveOptionBorder),inputActiveOptionForeground:(0,p.asCssVariable)(p.inputActiveOptionForeground),inputActiveOptionBackground:(0,p.asCssVariable)(p.inputActiveOptionBackground)};this.caseSensitive=this._register(new k.CaseSensitiveToggle({appendTitle:this._keybindingLabelFor(S.FIND_IDS.ToggleCaseSensitiveCommand),isChecked:this._state.matchCase,...n})),this._domNode.appendChild(this.caseSensitive.domNode),this._register(this.caseSensitive.onChange(()=>{this._state.change({matchCase:this.caseSensitive.checked},!1)})),this.wholeWords=this._register(new k.WholeWordsToggle({appendTitle:this._keybindingLabelFor(S.FIND_IDS.ToggleWholeWordCommand),isChecked:this._state.wholeWord,...n})),this._domNode.appendChild(this.wholeWords.domNode),this._register(this.wholeWords.onChange(()=>{this._state.change({wholeWord:this.wholeWords.checked},!1)})),this.regex=this._register(new k.RegexToggle({appendTitle:this._keybindingLabelFor(S.FIND_IDS.ToggleRegexCommand),isChecked:this._state.isRegex,...n})),this._domNode.appendChild(this.regex.domNode),this._register(this.regex.onChange(()=>{this._state.change({isRegex:this.regex.checked},!1)})),this._editor.addOverlayWidget(this),this._register(this._state.onFindReplaceStateChange(t=>{let r=!1;t.isRegex&&(this.regex.checked=this._state.isRegex,r=!0),t.wholeWord&&(this.wholeWords.checked=this._state.wholeWord,r=!0),t.matchCase&&(this.caseSensitive.checked=this._state.matchCase,r=!0),!this._state.isRevealed&&r&&this._revealTemporarily()})),this._register(L.addDisposableListener(this._domNode,L.EventType.MOUSE_LEAVE,t=>this._onMouseLeave())),this._register(L.addDisposableListener(this._domNode,"mouseover",t=>this._onMouseOver()))}_keybindingLabelFor(b){const a=this._keybindingService.lookupKeybinding(b);return a?` (${a.getLabel()})`:""}dispose(){this._editor.removeOverlayWidget(this),super.dispose()}getId(){return _.ID}getDomNode(){return this._domNode}getPosition(){return{preference:0}}highlightFindOptions(){this._revealTemporarily()}_revealTemporarily(){this._show(),this._hideSoon.schedule()}_onMouseLeave(){this._hideSoon.schedule()}_onMouseOver(){this._hideSoon.cancel()}_show(){this._isVisible||(this._isVisible=!0,this._domNode.style.display="block")}_hide(){this._isVisible&&(this._isVisible=!1,this._domNode.style.display="none")}}e.FindOptionsWidget=_,_.ID="editor.contrib.findOptionsWidget"}),define(se[897],oe([1,0,6,2,5,195]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FindReplaceState=void 0;function S(_,v){return _===1?!0:_===2?!1:v}class p extends k.Disposable{get searchString(){return this._searchString}get replaceString(){return this._replaceString}get isRevealed(){return this._isRevealed}get isReplaceRevealed(){return this._isReplaceRevealed}get isRegex(){return S(this._isRegexOverride,this._isRegex)}get wholeWord(){return S(this._wholeWordOverride,this._wholeWord)}get matchCase(){return S(this._matchCaseOverride,this._matchCase)}get preserveCase(){return S(this._preserveCaseOverride,this._preserveCase)}get actualIsRegex(){return this._isRegex}get actualWholeWord(){return this._wholeWord}get actualMatchCase(){return this._matchCase}get actualPreserveCase(){return this._preserveCase}get searchScope(){return this._searchScope}get matchesPosition(){return this._matchesPosition}get matchesCount(){return this._matchesCount}get currentMatch(){return this._currentMatch}constructor(){super(),this._onFindReplaceStateChange=this._register(new L.Emitter),this.onFindReplaceStateChange=this._onFindReplaceStateChange.event,this._searchString="",this._replaceString="",this._isRevealed=!1,this._isReplaceRevealed=!1,this._isRegex=!1,this._isRegexOverride=0,this._wholeWord=!1,this._wholeWordOverride=0,this._matchCase=!1,this._matchCaseOverride=0,this._preserveCase=!1,this._preserveCaseOverride=0,this._searchScope=null,this._matchesPosition=0,this._matchesCount=0,this._currentMatch=null,this._loop=!0,this._isSearching=!1,this._filters=null}changeMatchInfo(v,b,a){const i={moveCursor:!1,updateHistory:!1,searchString:!1,replaceString:!1,isRevealed:!1,isReplaceRevealed:!1,isRegex:!1,wholeWord:!1,matchCase:!1,preserveCase:!1,searchScope:!1,matchesPosition:!1,matchesCount:!1,currentMatch:!1,loop:!1,isSearching:!1,filters:!1};let n=!1;b===0&&(v=0),v>b&&(v=b),this._matchesPosition!==v&&(this._matchesPosition=v,i.matchesPosition=!0,n=!0),this._matchesCount!==b&&(this._matchesCount=b,i.matchesCount=!0,n=!0),typeof a<"u"&&(y.Range.equalsRange(this._currentMatch,a)||(this._currentMatch=a,i.currentMatch=!0,n=!0)),n&&this._onFindReplaceStateChange.fire(i)}change(v,b,a=!0){var i;const n={moveCursor:b,updateHistory:a,searchString:!1,replaceString:!1,isRevealed:!1,isReplaceRevealed:!1,isRegex:!1,wholeWord:!1,matchCase:!1,preserveCase:!1,searchScope:!1,matchesPosition:!1,matchesCount:!1,currentMatch:!1,loop:!1,isSearching:!1,filters:!1};let t=!1;const r=this.isRegex,u=this.wholeWord,f=this.matchCase,c=this.preserveCase;typeof v.searchString<"u"&&this._searchString!==v.searchString&&(this._searchString=v.searchString,n.searchString=!0,t=!0),typeof v.replaceString<"u"&&this._replaceString!==v.replaceString&&(this._replaceString=v.replaceString,n.replaceString=!0,t=!0),typeof v.isRevealed<"u"&&this._isRevealed!==v.isRevealed&&(this._isRevealed=v.isRevealed,n.isRevealed=!0,t=!0),typeof v.isReplaceRevealed<"u"&&this._isReplaceRevealed!==v.isReplaceRevealed&&(this._isReplaceRevealed=v.isReplaceRevealed,n.isReplaceRevealed=!0,t=!0),typeof v.isRegex<"u"&&(this._isRegex=v.isRegex),typeof v.wholeWord<"u"&&(this._wholeWord=v.wholeWord),typeof v.matchCase<"u"&&(this._matchCase=v.matchCase),typeof v.preserveCase<"u"&&(this._preserveCase=v.preserveCase),typeof v.searchScope<"u"&&(!((i=v.searchScope)===null||i===void 0)&&i.every(d=>{var s;return(s=this._searchScope)===null||s===void 0?void 0:s.some(l=>!y.Range.equalsRange(l,d))})||(this._searchScope=v.searchScope,n.searchScope=!0,t=!0)),typeof v.loop<"u"&&this._loop!==v.loop&&(this._loop=v.loop,n.loop=!0,t=!0),typeof v.isSearching<"u"&&this._isSearching!==v.isSearching&&(this._isSearching=v.isSearching,n.isSearching=!0,t=!0),typeof v.filters<"u"&&(this._filters?this._filters.update(v.filters):this._filters=v.filters,n.filters=!0,t=!0),this._isRegexOverride=typeof v.isRegexOverride<"u"?v.isRegexOverride:0,this._wholeWordOverride=typeof v.wholeWordOverride<"u"?v.wholeWordOverride:0,this._matchCaseOverride=typeof v.matchCaseOverride<"u"?v.matchCaseOverride:0,this._preserveCaseOverride=typeof v.preserveCaseOverride<"u"?v.preserveCaseOverride:0,r!==this.isRegex&&(t=!0,n.isRegex=!0),u!==this.wholeWord&&(t=!0,n.wholeWord=!0),f!==this.matchCase&&(t=!0,n.matchCase=!0),c!==this.preserveCase&&(t=!0,n.preserveCase=!0),t&&this._onFindReplaceStateChange.fire(n)}canNavigateBack(){return this.canNavigateInLoop()||this.matchesPosition!==1}canNavigateForward(){return this.canNavigateInLoop()||this.matchesPosition<this.matchesCount}canNavigateInLoop(){return this._loop||this.matchesCount>=E.MATCHES_LIMIT}}e.FindReplaceState=p}),define(se[898],oe([1,0,7,48,159,158,76,14,26,12,2,17,11,5,195,673,357,761,29,82,23,28,89,20,106,460]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SimpleButton=e.FindWidget=e.FindWidgetViewZone=e.NLS_NO_RESULTS=e.NLS_MATCHES_LOCATION=e.findNextMatchIcon=e.findPreviousMatchIcon=e.findReplaceAllIcon=e.findReplaceIcon=void 0;const m=(0,d.registerIcon)("find-selection",_.Codicon.selection,r.localize(0,null)),C=(0,d.registerIcon)("find-collapsed",_.Codicon.chevronRight,r.localize(1,null)),w=(0,d.registerIcon)("find-expanded",_.Codicon.chevronDown,r.localize(2,null));e.findReplaceIcon=(0,d.registerIcon)("find-replace",_.Codicon.replace,r.localize(3,null)),e.findReplaceAllIcon=(0,d.registerIcon)("find-replace-all",_.Codicon.replaceAll,r.localize(4,null)),e.findPreviousMatchIcon=(0,d.registerIcon)("find-previous-match",_.Codicon.arrowUp,r.localize(5,null)),e.findNextMatchIcon=(0,d.registerIcon)("find-next-match",_.Codicon.arrowDown,r.localize(6,null));const D=r.localize(7,null),I=r.localize(8,null),T=r.localize(9,null),A=r.localize(10,null),P=r.localize(11,null),N=r.localize(12,null),M=r.localize(13,null),R=r.localize(14,null),x=r.localize(15,null),O=r.localize(16,null),B=r.localize(17,null),W=r.localize(18,null),V=r.localize(19,null,t.MATCHES_LIMIT);e.NLS_MATCHES_LOCATION=r.localize(20,null),e.NLS_NO_RESULTS=r.localize(21,null);const K=419,q=275-54;let ie=69;const ae=33,ne="ctrlEnterReplaceAll.windows.donotask",$=a.isMacintosh?256:2048;class J{constructor(X){this.afterLineNumber=X,this.heightInPx=ae,this.suppressMouseDown=!1,this.domNode=document.createElement("div"),this.domNode.className="dock-find-viewzone"}}e.FindWidgetViewZone=J;function Q(me,X,U){const G=!!X.match(/\n/);if(U&&G&&U.selectionStart>0){me.stopPropagation();return}}function re(me,X,U){const G=!!X.match(/\n/);if(U&&G&&U.selectionEnd<U.value.length){me.stopPropagation();return}}class de extends S.Widget{constructor(X,U,G,z,H,Y,j,Z,ee){super(),this._cachedHeight=null,this._revealTimeouts=[],this._codeEditor=X,this._controller=U,this._state=G,this._contextViewProvider=z,this._keybindingService=H,this._contextKeyService=Y,this._storageService=Z,this._notificationService=ee,this._ctrlEnterReplaceAllWarningPrompted=!!Z.getBoolean(ne,0),this._isVisible=!1,this._isReplaceVisible=!1,this._ignoreChangeEvent=!1,this._updateHistoryDelayer=new p.Delayer(500),this._register((0,b.toDisposable)(()=>this._updateHistoryDelayer.cancel())),this._register(this._state.onFindReplaceStateChange(le=>this._onStateChanged(le))),this._buildDomNode(),this._updateButtons(),this._tryUpdateWidgetWidth(),this._findInput.inputBox.layout(),this._register(this._codeEditor.onDidChangeConfiguration(le=>{if(le.hasChanged(90)&&(this._codeEditor.getOption(90)&&this._state.change({isReplaceRevealed:!1},!1),this._updateButtons()),le.hasChanged(143)&&this._tryUpdateWidgetWidth(),le.hasChanged(2)&&this.updateAccessibilitySupport(),le.hasChanged(41)){const ue=this._codeEditor.getOption(41).loop;this._state.change({loop:ue},!1);const ce=this._codeEditor.getOption(41).addExtraSpaceOnTop;ce&&!this._viewZone&&(this._viewZone=new J(0),this._showViewZone()),!ce&&this._viewZone&&this._removeViewZone()}})),this.updateAccessibilitySupport(),this._register(this._codeEditor.onDidChangeCursorSelection(()=>{this._isVisible&&this._updateToggleSelectionFindButton()})),this._register(this._codeEditor.onDidFocusEditorWidget(async()=>{if(this._isVisible){const le=await this._controller.getGlobalBufferTerm();le&&le!==this._state.searchString&&(this._state.change({searchString:le},!1),this._findInput.select())}})),this._findInputFocused=t.CONTEXT_FIND_INPUT_FOCUSED.bindTo(Y),this._findFocusTracker=this._register(L.trackFocus(this._findInput.inputBox.inputElement)),this._register(this._findFocusTracker.onDidFocus(()=>{this._findInputFocused.set(!0),this._updateSearchScope()})),this._register(this._findFocusTracker.onDidBlur(()=>{this._findInputFocused.set(!1)})),this._replaceInputFocused=t.CONTEXT_REPLACE_INPUT_FOCUSED.bindTo(Y),this._replaceFocusTracker=this._register(L.trackFocus(this._replaceInput.inputBox.inputElement)),this._register(this._replaceFocusTracker.onDidFocus(()=>{this._replaceInputFocused.set(!0),this._updateSearchScope()})),this._register(this._replaceFocusTracker.onDidBlur(()=>{this._replaceInputFocused.set(!1)})),this._codeEditor.addOverlayWidget(this),this._codeEditor.getOption(41).addExtraSpaceOnTop&&(this._viewZone=new J(0)),this._register(this._codeEditor.onDidChangeModel(()=>{this._isVisible&&(this._viewZoneId=void 0)})),this._register(this._codeEditor.onDidScrollChange(le=>{if(le.scrollTopChanged){this._layoutViewZone();return}setTimeout(()=>{this._layoutViewZone()},0)}))}getId(){return de.ID}getDomNode(){return this._domNode}getPosition(){return this._isVisible?{preference:0}:null}_onStateChanged(X){if(X.searchString){try{this._ignoreChangeEvent=!0,this._findInput.setValue(this._state.searchString)}finally{this._ignoreChangeEvent=!1}this._updateButtons()}if(X.replaceString&&(this._replaceInput.inputBox.value=this._state.replaceString),X.isRevealed&&(this._state.isRevealed?this._reveal():this._hide(!0)),X.isReplaceRevealed&&(this._state.isReplaceRevealed?!this._codeEditor.getOption(90)&&!this._isReplaceVisible&&(this._isReplaceVisible=!0,this._replaceInput.width=L.getTotalWidth(this._findInput.domNode),this._updateButtons(),this._replaceInput.inputBox.layout()):this._isReplaceVisible&&(this._isReplaceVisible=!1,this._updateButtons())),(X.isRevealed||X.isReplaceRevealed)&&(this._state.isRevealed||this._state.isReplaceRevealed)&&this._tryUpdateHeight()&&this._showViewZone(),X.isRegex&&this._findInput.setRegex(this._state.isRegex),X.wholeWord&&this._findInput.setWholeWords(this._state.wholeWord),X.matchCase&&this._findInput.setCaseSensitive(this._state.matchCase),X.preserveCase&&this._replaceInput.setPreserveCase(this._state.preserveCase),X.searchScope&&(this._state.searchScope?this._toggleSelectionFind.checked=!0:this._toggleSelectionFind.checked=!1,this._updateToggleSelectionFindButton()),X.searchString||X.matchesCount||X.matchesPosition){const U=this._state.searchString.length>0&&this._state.matchesCount===0;this._domNode.classList.toggle("no-results",U),this._updateMatchesCount(),this._updateButtons()}(X.searchString||X.currentMatch)&&this._layoutViewZone(),X.updateHistory&&this._delayedUpdateHistory(),X.loop&&this._updateButtons()}_delayedUpdateHistory(){this._updateHistoryDelayer.trigger(this._updateHistory.bind(this)).then(void 0,v.onUnexpectedError)}_updateHistory(){this._state.searchString&&this._findInput.inputBox.addToHistory(),this._state.replaceString&&this._replaceInput.inputBox.addToHistory()}_updateMatchesCount(){this._matchesCount.style.minWidth=ie+"px",this._state.matchesCount>=t.MATCHES_LIMIT?this._matchesCount.title=V:this._matchesCount.title="",this._matchesCount.firstChild&&this._matchesCount.removeChild(this._matchesCount.firstChild);let X;if(this._state.matchesCount>0){let U=String(this._state.matchesCount);this._state.matchesCount>=t.MATCHES_LIMIT&&(U+="+");let G=String(this._state.matchesPosition);G==="0"&&(G="?"),X=i.format(e.NLS_MATCHES_LOCATION,G,U)}else X=e.NLS_NO_RESULTS;this._matchesCount.appendChild(document.createTextNode(X)),(0,k.alert)(this._getAriaLabel(X,this._state.currentMatch,this._state.searchString)),ie=Math.max(ie,this._matchesCount.clientWidth)}_getAriaLabel(X,U,G){if(X===e.NLS_NO_RESULTS)return G===""?r.localize(22,null,X):r.localize(23,null,X,G);if(U){const z=r.localize(24,null,X,G,U.startLineNumber+":"+U.startColumn),H=this._codeEditor.getModel();return H&&U.startLineNumber<=H.getLineCount()&&U.startLineNumber>=1?`${H.getLineContent(U.startLineNumber)}, ${z}`:z}return r.localize(25,null,X,G)}_updateToggleSelectionFindButton(){const X=this._codeEditor.getSelection(),U=X?X.startLineNumber!==X.endLineNumber||X.startColumn!==X.endColumn:!1,G=this._toggleSelectionFind.checked;this._isVisible&&(G||U)?this._toggleSelectionFind.enable():this._toggleSelectionFind.disable()}_updateButtons(){this._findInput.setEnabled(this._isVisible),this._replaceInput.setEnabled(this._isVisible&&this._isReplaceVisible),this._updateToggleSelectionFindButton(),this._closeBtn.setEnabled(this._isVisible);const X=this._state.searchString.length>0,U=!!this._state.matchesCount;this._prevBtn.setEnabled(this._isVisible&&X&&U&&this._state.canNavigateBack()),this._nextBtn.setEnabled(this._isVisible&&X&&U&&this._state.canNavigateForward()),this._replaceBtn.setEnabled(this._isVisible&&this._isReplaceVisible&&X),this._replaceAllBtn.setEnabled(this._isVisible&&this._isReplaceVisible&&X),this._domNode.classList.toggle("replaceToggled",this._isReplaceVisible),this._toggleReplaceBtn.setExpanded(this._isReplaceVisible);const G=!this._codeEditor.getOption(90);this._toggleReplaceBtn.setEnabled(this._isVisible&&G)}_reveal(){if(this._revealTimeouts.forEach(X=>{clearTimeout(X)}),this._revealTimeouts=[],!this._isVisible){this._isVisible=!0;const X=this._codeEditor.getSelection();switch(this._codeEditor.getOption(41).autoFindInSelection){case"always":this._toggleSelectionFind.checked=!0;break;case"never":this._toggleSelectionFind.checked=!1;break;case"multiline":{const G=!!X&&X.startLineNumber!==X.endLineNumber;this._toggleSelectionFind.checked=G;break}default:break}this._tryUpdateWidgetWidth(),this._updateButtons(),this._revealTimeouts.push(setTimeout(()=>{this._domNode.classList.add("visible"),this._domNode.setAttribute("aria-hidden","false")},0)),this._revealTimeouts.push(setTimeout(()=>{this._findInput.validate()},200)),this._codeEditor.layoutOverlayWidget(this);let U=!0;if(this._codeEditor.getOption(41).seedSearchStringFromSelection&&X){const G=this._codeEditor.getDomNode();if(G){const z=L.getDomNodePagePosition(G),H=this._codeEditor.getScrolledVisiblePosition(X.getStartPosition()),Y=z.left+(H?H.left:0),j=H?H.top:0;if(this._viewZone&&j<this._viewZone.heightInPx){X.endLineNumber>X.startLineNumber&&(U=!1);const Z=L.getTopLeftOffset(this._domNode).left;Y>Z&&(U=!1);const ee=this._codeEditor.getScrolledVisiblePosition(X.getEndPosition());z.left+(ee?ee.left:0)>Z&&(U=!1)}}}this._showViewZone(U)}}_hide(X){this._revealTimeouts.forEach(U=>{clearTimeout(U)}),this._revealTimeouts=[],this._isVisible&&(this._isVisible=!1,this._updateButtons(),this._domNode.classList.remove("visible"),this._domNode.setAttribute("aria-hidden","true"),this._findInput.clearMessage(),X&&this._codeEditor.focus(),this._codeEditor.layoutOverlayWidget(this),this._removeViewZone())}_layoutViewZone(X){if(!this._codeEditor.getOption(41).addExtraSpaceOnTop){this._removeViewZone();return}if(!this._isVisible)return;const G=this._viewZone;this._viewZoneId!==void 0||!G||this._codeEditor.changeViewZones(z=>{G.heightInPx=this._getHeight(),this._viewZoneId=z.addZone(G),this._codeEditor.setScrollTop(X||this._codeEditor.getScrollTop()+G.heightInPx)})}_showViewZone(X=!0){if(!this._isVisible||!this._codeEditor.getOption(41).addExtraSpaceOnTop)return;this._viewZone===void 0&&(this._viewZone=new J(0));const G=this._viewZone;this._codeEditor.changeViewZones(z=>{if(this._viewZoneId!==void 0){const H=this._getHeight();if(H===G.heightInPx)return;const Y=H-G.heightInPx;G.heightInPx=H,z.layoutZone(this._viewZoneId),X&&this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()+Y);return}else{let H=this._getHeight();if(H-=this._codeEditor.getOption(83).top,H<=0)return;G.heightInPx=H,this._viewZoneId=z.addZone(G),X&&this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()+H)}})}_removeViewZone(){this._codeEditor.changeViewZones(X=>{this._viewZoneId!==void 0&&(X.removeZone(this._viewZoneId),this._viewZoneId=void 0,this._viewZone&&(this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()-this._viewZone.heightInPx),this._viewZone=void 0))})}_tryUpdateWidgetWidth(){if(!this._isVisible||!this._domNode.isConnected)return;const X=this._codeEditor.getLayoutInfo();if(X.contentWidth<=0){this._domNode.classList.add("hiddenEditor");return}else this._domNode.classList.contains("hiddenEditor")&&this._domNode.classList.remove("hiddenEditor");const G=X.width,z=X.minimap.minimapWidth;let H=!1,Y=!1,j=!1;if(this._resized&&L.getTotalWidth(this._domNode)>K){this._domNode.style.maxWidth=`${G-28-z-15}px`,this._replaceInput.width=L.getTotalWidth(this._findInput.domNode);return}if(K+28+z>=G&&(Y=!0),K+28+z-ie>=G&&(j=!0),K+28+z-ie>=G+50&&(H=!0),this._domNode.classList.toggle("collapsed-find-widget",H),this._domNode.classList.toggle("narrow-find-widget",j),this._domNode.classList.toggle("reduced-find-widget",Y),!j&&!H&&(this._domNode.style.maxWidth=`${G-28-z-15}px`),this._findInput.layout({collapsedFindWidget:H,narrowFindWidget:j,reducedFindWidget:Y}),this._resized){const Z=this._findInput.inputBox.element.clientWidth;Z>0&&(this._replaceInput.width=Z)}else this._isReplaceVisible&&(this._replaceInput.width=L.getTotalWidth(this._findInput.domNode))}_getHeight(){let X=0;return X+=4,X+=this._findInput.inputBox.height+2,this._isReplaceVisible&&(X+=4,X+=this._replaceInput.inputBox.height+2),X+=4,X}_tryUpdateHeight(){const X=this._getHeight();return this._cachedHeight!==null&&this._cachedHeight===X?!1:(this._cachedHeight=X,this._domNode.style.height=`${X}px`,!0)}focusFindInput(){this._findInput.select(),this._findInput.focus()}focusReplaceInput(){this._replaceInput.select(),this._replaceInput.focus()}highlightFindOptions(){this._findInput.highlightFindOptions()}_updateSearchScope(){if(this._codeEditor.hasModel()&&this._toggleSelectionFind.checked){const X=this._codeEditor.getSelections();X.map(U=>{U.endColumn===1&&U.endLineNumber>U.startLineNumber&&(U=U.setEndPosition(U.endLineNumber-1,this._codeEditor.getModel().getLineMaxColumn(U.endLineNumber-1)));const G=this._state.currentMatch;return U.startLineNumber!==U.endLineNumber&&!n.Range.equalsRange(U,G)?U:null}).filter(U=>!!U),X.length&&this._state.change({searchScope:X},!0)}}_onFindInputMouseDown(X){X.middleButton&&X.stopPropagation()}_onFindInputKeyDown(X){if(X.equals($|3))if(this._keybindingService.dispatchEvent(X,X.target)){X.preventDefault();return}else{this._findInput.inputBox.insertAtCursor(`
+`),X.preventDefault();return}if(X.equals(2)){this._isReplaceVisible?this._replaceInput.focus():this._findInput.focusOnCaseSensitive(),X.preventDefault();return}if(X.equals(2066)){this._codeEditor.focus(),X.preventDefault();return}if(X.equals(16))return Q(X,this._findInput.getValue(),this._findInput.domNode.querySelector("textarea"));if(X.equals(18))return re(X,this._findInput.getValue(),this._findInput.domNode.querySelector("textarea"))}_onReplaceInputKeyDown(X){if(X.equals($|3))if(this._keybindingService.dispatchEvent(X,X.target)){X.preventDefault();return}else{a.isWindows&&a.isNative&&!this._ctrlEnterReplaceAllWarningPrompted&&(this._notificationService.info(r.localize(26,null)),this._ctrlEnterReplaceAllWarningPrompted=!0,this._storageService.store(ne,!0,0,0)),this._replaceInput.inputBox.insertAtCursor(`
+`),X.preventDefault();return}if(X.equals(2)){this._findInput.focusOnCaseSensitive(),X.preventDefault();return}if(X.equals(1026)){this._findInput.focus(),X.preventDefault();return}if(X.equals(2066)){this._codeEditor.focus(),X.preventDefault();return}if(X.equals(16))return Q(X,this._replaceInput.inputBox.value,this._replaceInput.inputBox.element.querySelector("textarea"));if(X.equals(18))return re(X,this._replaceInput.inputBox.value,this._replaceInput.inputBox.element.querySelector("textarea"))}getVerticalSashLeft(X){return 0}_keybindingLabelFor(X){const U=this._keybindingService.lookupKeybinding(X);return U?` (${U.getLabel()})`:""}_buildDomNode(){this._findInput=this._register(new u.ContextScopedFindInput(null,this._contextViewProvider,{width:q,label:I,placeholder:T,appendCaseSensitiveLabel:this._keybindingLabelFor(t.FIND_IDS.ToggleCaseSensitiveCommand),appendWholeWordsLabel:this._keybindingLabelFor(t.FIND_IDS.ToggleWholeWordCommand),appendRegexLabel:this._keybindingLabelFor(t.FIND_IDS.ToggleRegexCommand),validation:Z=>{if(Z.length===0||!this._findInput.getRegex())return null;try{return new RegExp(Z,"gu"),null}catch(ee){return{content:ee.message}}},flexibleHeight:!0,flexibleWidth:!0,flexibleMaxHeight:118,showCommonFindToggles:!0,showHistoryHint:()=>(0,f.showHistoryKeybindingHint)(this._keybindingService),inputBoxStyles:h.defaultInputBoxStyles,toggleStyles:h.defaultToggleStyles},this._contextKeyService)),this._findInput.setRegex(!!this._state.isRegex),this._findInput.setCaseSensitive(!!this._state.matchCase),this._findInput.setWholeWords(!!this._state.wholeWord),this._register(this._findInput.onKeyDown(Z=>this._onFindInputKeyDown(Z))),this._register(this._findInput.inputBox.onDidChange(()=>{this._ignoreChangeEvent||this._state.change({searchString:this._findInput.getValue()},!0)})),this._register(this._findInput.onDidOptionChange(()=>{this._state.change({isRegex:this._findInput.getRegex(),wholeWord:this._findInput.getWholeWords(),matchCase:this._findInput.getCaseSensitive()},!0)})),this._register(this._findInput.onCaseSensitiveKeyDown(Z=>{Z.equals(1026)&&this._isReplaceVisible&&(this._replaceInput.focus(),Z.preventDefault())})),this._register(this._findInput.onRegexKeyDown(Z=>{Z.equals(2)&&this._isReplaceVisible&&(this._replaceInput.focusOnPreserve(),Z.preventDefault())})),this._register(this._findInput.inputBox.onDidHeightChange(Z=>{this._tryUpdateHeight()&&this._showViewZone()})),a.isLinux&&this._register(this._findInput.onMouseDown(Z=>this._onFindInputMouseDown(Z))),this._matchesCount=document.createElement("div"),this._matchesCount.className="matchesCount",this._updateMatchesCount(),this._prevBtn=this._register(new he({label:A+this._keybindingLabelFor(t.FIND_IDS.PreviousMatchFindAction),icon:e.findPreviousMatchIcon,onTrigger:()=>{(0,g.assertIsDefined)(this._codeEditor.getAction(t.FIND_IDS.PreviousMatchFindAction)).run().then(void 0,v.onUnexpectedError)}})),this._nextBtn=this._register(new he({label:P+this._keybindingLabelFor(t.FIND_IDS.NextMatchFindAction),icon:e.findNextMatchIcon,onTrigger:()=>{(0,g.assertIsDefined)(this._codeEditor.getAction(t.FIND_IDS.NextMatchFindAction)).run().then(void 0,v.onUnexpectedError)}}));const G=document.createElement("div");G.className="find-part",G.appendChild(this._findInput.domNode);const z=document.createElement("div");z.className="find-actions",G.appendChild(z),z.appendChild(this._matchesCount),z.appendChild(this._prevBtn.domNode),z.appendChild(this._nextBtn.domNode),this._toggleSelectionFind=this._register(new y.Toggle({icon:m,title:N+this._keybindingLabelFor(t.FIND_IDS.ToggleSearchScopeCommand),isChecked:!1,inputActiveOptionBackground:(0,c.asCssVariable)(c.inputActiveOptionBackground),inputActiveOptionBorder:(0,c.asCssVariable)(c.inputActiveOptionBorder),inputActiveOptionForeground:(0,c.asCssVariable)(c.inputActiveOptionForeground)})),this._register(this._toggleSelectionFind.onChange(()=>{if(this._toggleSelectionFind.checked){if(this._codeEditor.hasModel()){const Z=this._codeEditor.getSelections();Z.map(ee=>(ee.endColumn===1&&ee.endLineNumber>ee.startLineNumber&&(ee=ee.setEndPosition(ee.endLineNumber-1,this._codeEditor.getModel().getLineMaxColumn(ee.endLineNumber-1))),ee.isEmpty()?null:ee)).filter(ee=>!!ee),Z.length&&this._state.change({searchScope:Z},!0)}}else this._state.change({searchScope:null},!0)})),z.appendChild(this._toggleSelectionFind.domNode),this._closeBtn=this._register(new he({label:M+this._keybindingLabelFor(t.FIND_IDS.CloseFindWidgetCommand),icon:d.widgetClose,onTrigger:()=>{this._state.change({isRevealed:!1,searchScope:null},!1)},onKeyDown:Z=>{Z.equals(2)&&this._isReplaceVisible&&(this._replaceBtn.isEnabled()?this._replaceBtn.focus():this._codeEditor.focus(),Z.preventDefault())}})),this._replaceInput=this._register(new u.ContextScopedReplaceInput(null,void 0,{label:R,placeholder:x,appendPreserveCaseLabel:this._keybindingLabelFor(t.FIND_IDS.TogglePreserveCaseCommand),history:[],flexibleHeight:!0,flexibleWidth:!0,flexibleMaxHeight:118,showHistoryHint:()=>(0,f.showHistoryKeybindingHint)(this._keybindingService),inputBoxStyles:h.defaultInputBoxStyles,toggleStyles:h.defaultToggleStyles},this._contextKeyService,!0)),this._replaceInput.setPreserveCase(!!this._state.preserveCase),this._register(this._replaceInput.onKeyDown(Z=>this._onReplaceInputKeyDown(Z))),this._register(this._replaceInput.inputBox.onDidChange(()=>{this._state.change({replaceString:this._replaceInput.inputBox.value},!1)})),this._register(this._replaceInput.inputBox.onDidHeightChange(Z=>{this._isReplaceVisible&&this._tryUpdateHeight()&&this._showViewZone()})),this._register(this._replaceInput.onDidOptionChange(()=>{this._state.change({preserveCase:this._replaceInput.getPreserveCase()},!0)})),this._register(this._replaceInput.onPreserveCaseKeyDown(Z=>{Z.equals(2)&&(this._prevBtn.isEnabled()?this._prevBtn.focus():this._nextBtn.isEnabled()?this._nextBtn.focus():this._toggleSelectionFind.enabled?this._toggleSelectionFind.focus():this._closeBtn.isEnabled()&&this._closeBtn.focus(),Z.preventDefault())})),this._replaceBtn=this._register(new he({label:O+this._keybindingLabelFor(t.FIND_IDS.ReplaceOneAction),icon:e.findReplaceIcon,onTrigger:()=>{this._controller.replace()},onKeyDown:Z=>{Z.equals(1026)&&(this._closeBtn.focus(),Z.preventDefault())}})),this._replaceAllBtn=this._register(new he({label:B+this._keybindingLabelFor(t.FIND_IDS.ReplaceAllAction),icon:e.findReplaceAllIcon,onTrigger:()=>{this._controller.replaceAll()}}));const H=document.createElement("div");H.className="replace-part",H.appendChild(this._replaceInput.domNode);const Y=document.createElement("div");Y.className="replace-actions",H.appendChild(Y),Y.appendChild(this._replaceBtn.domNode),Y.appendChild(this._replaceAllBtn.domNode),this._toggleReplaceBtn=this._register(new he({label:W,className:"codicon toggle left",onTrigger:()=>{this._state.change({isReplaceRevealed:!this._isReplaceVisible},!1),this._isReplaceVisible&&(this._replaceInput.width=L.getTotalWidth(this._findInput.domNode),this._replaceInput.inputBox.layout()),this._showViewZone()}})),this._toggleReplaceBtn.setExpanded(this._isReplaceVisible),this._domNode=document.createElement("div"),this._domNode.className="editor-widget find-widget",this._domNode.setAttribute("aria-hidden","true"),this._domNode.ariaLabel=D,this._domNode.role="dialog",this._domNode.style.width=`${K}px`,this._domNode.appendChild(this._toggleReplaceBtn.domNode),this._domNode.appendChild(G),this._domNode.appendChild(this._closeBtn.domNode),this._domNode.appendChild(H),this._resizeSash=new E.Sash(this._domNode,this,{orientation:0,size:2}),this._resized=!1;let j=K;this._register(this._resizeSash.onDidStart(()=>{j=L.getTotalWidth(this._domNode)})),this._register(this._resizeSash.onDidChange(Z=>{this._resized=!0;const ee=j+Z.startX-Z.currentX;if(ee<K)return;const le=parseFloat(L.getComputedStyle(this._domNode).maxWidth)||0;ee>le||(this._domNode.style.width=`${ee}px`,this._isReplaceVisible&&(this._replaceInput.width=L.getTotalWidth(this._findInput.domNode)),this._findInput.inputBox.layout(),this._tryUpdateHeight())})),this._register(this._resizeSash.onDidReset(()=>{const Z=L.getTotalWidth(this._domNode);if(Z<K)return;let ee=K;if(!this._resized||Z===K){const le=this._codeEditor.getLayoutInfo();ee=le.width-28-le.minimap.minimapWidth-15,this._resized=!0}this._domNode.style.width=`${ee}px`,this._isReplaceVisible&&(this._replaceInput.width=L.getTotalWidth(this._findInput.domNode)),this._findInput.inputBox.layout()}))}updateAccessibilitySupport(){const X=this._codeEditor.getOption(2);this._findInput.setFocusInputOnOptionClick(X!==2)}}e.FindWidget=de,de.ID="editor.contrib.findWidget";class he extends S.Widget{constructor(X){super(),this._opts=X;let U="button";this._opts.className&&(U=U+" "+this._opts.className),this._opts.icon&&(U=U+" "+l.ThemeIcon.asClassName(this._opts.icon)),this._domNode=document.createElement("div"),this._domNode.title=this._opts.label,this._domNode.tabIndex=0,this._domNode.className=U,this._domNode.setAttribute("role","button"),this._domNode.setAttribute("aria-label",this._opts.label),this.onclick(this._domNode,G=>{this._opts.onTrigger(),G.preventDefault()}),this.onkeydown(this._domNode,G=>{var z,H;if(G.equals(10)||G.equals(3)){this._opts.onTrigger(),G.preventDefault();return}(H=(z=this._opts).onKeyDown)===null||H===void 0||H.call(z,G)})}get domNode(){return this._domNode}isEnabled(){return this._domNode.tabIndex>=0}focus(){this._domNode.focus()}setEnabled(X){this._domNode.classList.toggle("disabled",!X),this._domNode.setAttribute("aria-disabled",String(!X)),this._domNode.tabIndex=X?0:-1}setExpanded(X){this._domNode.setAttribute("aria-expanded",String(!!X)),X?(this._domNode.classList.remove(...l.ThemeIcon.asClassNameArray(C)),this._domNode.classList.add(...l.ThemeIcon.asClassNameArray(w))):(this._domNode.classList.remove(...l.ThemeIcon.asClassNameArray(w)),this._domNode.classList.add(...l.ThemeIcon.asClassNameArray(C)))}}e.SimpleButton=he,(0,s.registerThemingParticipant)((me,X)=>{const U=(Ce,Se)=>{Se&&X.addRule(`.monaco-editor ${Ce} { background-color: ${Se}; }`)};U(".findMatch",me.getColor(c.editorFindMatchHighlight)),U(".currentFindMatch",me.getColor(c.editorFindMatch)),U(".findScope",me.getColor(c.editorFindRangeHighlight));const G=me.getColor(c.editorWidgetBackground);U(".find-widget",G);const z=me.getColor(c.widgetShadow);z&&X.addRule(`.monaco-editor .find-widget { box-shadow: 0 0 8px 2px ${z}; }`);const H=me.getColor(c.widgetBorder);H&&X.addRule(`.monaco-editor .find-widget { border-left: 1px solid ${H}; border-right: 1px solid ${H}; border-bottom: 1px solid ${H}; }`);const Y=me.getColor(c.editorFindMatchHighlightBorder);Y&&X.addRule(`.monaco-editor .findMatch { border: 1px ${(0,o.isHighContrast)(me.type)?"dotted":"solid"} ${Y}; box-sizing: border-box; }`);const j=me.getColor(c.editorFindMatchBorder);j&&X.addRule(`.monaco-editor .currentFindMatch { border: 2px solid ${j}; padding: 1px; box-sizing: border-box; }`);const Z=me.getColor(c.editorFindRangeHighlightBorder);Z&&X.addRule(`.monaco-editor .findScope { border: 1px ${(0,o.isHighContrast)(me.type)?"dashed":"solid"} ${Z}; }`);const ee=me.getColor(c.contrastBorder);ee&&X.addRule(`.monaco-editor .find-widget { border: 1px solid ${ee}; }`);const le=me.getColor(c.editorWidgetForeground);le&&X.addRule(`.monaco-editor .find-widget { color: ${le}; }`);const ue=me.getColor(c.errorForeground);ue&&X.addRule(`.monaco-editor .find-widget.no-results .matchesCount { color: ${ue}; }`);const ce=me.getColor(c.editorWidgetResizeBorder);if(ce)X.addRule(`.monaco-editor .find-widget .monaco-sash { background-color: ${ce}; }`);else{const Ce=me.getColor(c.editorWidgetBorder);Ce&&X.addRule(`.monaco-editor .find-widget .monaco-sash { background-color: ${Ce}; }`)}const pe=me.getColor(c.toolbarHoverBackground);pe&&X.addRule(`
+		.monaco-editor .find-widget .button:not(.disabled):hover,
+		.monaco-editor .find-widget .codicon-find-selection:hover {
+			background-color: ${pe} !important;
+		}
+	`);const ve=me.getColor(c.focusBorder);ve&&X.addRule(`.monaco-editor .find-widget .monaco-inputbox.synthetic-focus { outline-color: ${ve}; }`)})}),define(se[377],oe([1,0,14,2,11,16,83,21,41,195,896,897,898,672,30,103,15,59,34,50,70,92,23]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o){"use strict";var g;Object.defineProperty(e,"__esModule",{value:!0}),e.StartFindReplaceAction=e.PreviousSelectionMatchFindAction=e.NextSelectionMatchFindAction=e.SelectionMatchFindAction=e.MoveToMatchFindAction=e.PreviousMatchFindAction=e.NextMatchFindAction=e.MatchFindAction=e.StartFindWithSelectionAction=e.StartFindWithArgsAction=e.StartFindAction=e.FindController=e.CommonFindController=e.getSelectionSearchString=void 0;const h=524288;function m(W,V="single",K=!1){if(!W.hasModel())return null;const F=W.getSelection();if(V==="single"&&F.startLineNumber===F.endLineNumber||V==="multiple"){if(F.isEmpty()){const q=W.getConfiguredWordAtPosition(F.getStartPosition());if(q&&K===!1)return q.word}else if(W.getModel().getValueLengthInRange(F)<h)return W.getModel().getValueInRange(F)}return null}e.getSelectionSearchString=m;let C=g=class extends k.Disposable{get editor(){return this._editor}static get(V){return V.getContribution(g.ID)}constructor(V,K,F,q,ie){super(),this._editor=V,this._findWidgetVisible=v.CONTEXT_FIND_WIDGET_VISIBLE.bindTo(K),this._contextKeyService=K,this._storageService=F,this._clipboardService=q,this._notificationService=ie,this._updateHistoryDelayer=new L.Delayer(500),this._state=this._register(new a.FindReplaceState),this.loadQueryState(),this._register(this._state.onFindReplaceStateChange(ae=>this._onStateChanged(ae))),this._model=null,this._register(this._editor.onDidChangeModel(()=>{const ae=this._editor.getModel()&&this._state.isRevealed;this.disposeModel(),this._state.change({searchScope:null,matchCase:this._storageService.getBoolean("editor.matchCase",1,!1),wholeWord:this._storageService.getBoolean("editor.wholeWord",1,!1),isRegex:this._storageService.getBoolean("editor.isRegex",1,!1),preserveCase:this._storageService.getBoolean("editor.preserveCase",1,!1)},!1),ae&&this._start({forceRevealReplace:!1,seedSearchStringFromSelection:"none",seedSearchStringFromNonEmptySelection:!1,seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!1,updateSearchScope:!1,loop:this._editor.getOption(41).loop})}))}dispose(){this.disposeModel(),super.dispose()}disposeModel(){this._model&&(this._model.dispose(),this._model=null)}_onStateChanged(V){this.saveQueryState(V),V.isRevealed&&(this._state.isRevealed?this._findWidgetVisible.set(!0):(this._findWidgetVisible.reset(),this.disposeModel())),V.searchString&&this.setGlobalBufferTerm(this._state.searchString)}saveQueryState(V){V.isRegex&&this._storageService.store("editor.isRegex",this._state.actualIsRegex,1,1),V.wholeWord&&this._storageService.store("editor.wholeWord",this._state.actualWholeWord,1,1),V.matchCase&&this._storageService.store("editor.matchCase",this._state.actualMatchCase,1,1),V.preserveCase&&this._storageService.store("editor.preserveCase",this._state.actualPreserveCase,1,1)}loadQueryState(){this._state.change({matchCase:this._storageService.getBoolean("editor.matchCase",1,this._state.matchCase),wholeWord:this._storageService.getBoolean("editor.wholeWord",1,this._state.wholeWord),isRegex:this._storageService.getBoolean("editor.isRegex",1,this._state.isRegex),preserveCase:this._storageService.getBoolean("editor.preserveCase",1,this._state.preserveCase)},!1)}isFindInputFocused(){return!!v.CONTEXT_FIND_INPUT_FOCUSED.getValue(this._contextKeyService)}getState(){return this._state}closeFindWidget(){this._state.change({isRevealed:!1,searchScope:null},!1),this._editor.focus()}toggleCaseSensitive(){this._state.change({matchCase:!this._state.matchCase},!1),this._state.isRevealed||this.highlightFindOptions()}toggleWholeWords(){this._state.change({wholeWord:!this._state.wholeWord},!1),this._state.isRevealed||this.highlightFindOptions()}toggleRegex(){this._state.change({isRegex:!this._state.isRegex},!1),this._state.isRevealed||this.highlightFindOptions()}togglePreserveCase(){this._state.change({preserveCase:!this._state.preserveCase},!1),this._state.isRevealed||this.highlightFindOptions()}toggleSearchScope(){if(this._state.searchScope)this._state.change({searchScope:null},!0);else if(this._editor.hasModel()){const V=this._editor.getSelections();V.map(K=>(K.endColumn===1&&K.endLineNumber>K.startLineNumber&&(K=K.setEndPosition(K.endLineNumber-1,this._editor.getModel().getLineMaxColumn(K.endLineNumber-1))),K.isEmpty()?null:K)).filter(K=>!!K),V.length&&this._state.change({searchScope:V},!0)}}setSearchString(V){this._state.isRegex&&(V=y.escapeRegExpCharacters(V)),this._state.change({searchString:V},!1)}highlightFindOptions(V=!1){}async _start(V,K){if(this.disposeModel(),!this._editor.hasModel())return;const F={...K,isRevealed:!0};if(V.seedSearchStringFromSelection==="single"){const q=m(this._editor,V.seedSearchStringFromSelection,V.seedSearchStringFromNonEmptySelection);q&&(this._state.isRegex?F.searchString=y.escapeRegExpCharacters(q):F.searchString=q)}else if(V.seedSearchStringFromSelection==="multiple"&&!V.updateSearchScope){const q=m(this._editor,V.seedSearchStringFromSelection);q&&(F.searchString=q)}if(!F.searchString&&V.seedSearchStringFromGlobalClipboard){const q=await this.getGlobalBufferTerm();if(!this._editor.hasModel())return;q&&(F.searchString=q)}if(V.forceRevealReplace||F.isReplaceRevealed?F.isReplaceRevealed=!0:this._findWidgetVisible.get()||(F.isReplaceRevealed=!1),V.updateSearchScope){const q=this._editor.getSelections();q.some(ie=>!ie.isEmpty())&&(F.searchScope=q)}F.loop=V.loop,this._state.change(F,!1),this._model||(this._model=new v.FindModelBoundToEditorModel(this._editor,this._state))}start(V,K){return this._start(V,K)}moveToNextMatch(){return this._model?(this._model.moveToNextMatch(),!0):!1}moveToPrevMatch(){return this._model?(this._model.moveToPrevMatch(),!0):!1}goToMatch(V){return this._model?(this._model.moveToMatch(V),!0):!1}replace(){return this._model?(this._model.replace(),!0):!1}replaceAll(){var V;return this._model?!((V=this._editor.getModel())===null||V===void 0)&&V.isTooLargeForHeapOperation()?(this._notificationService.warn(n.localize(0,null)),!1):(this._model.replaceAll(),!0):!1}selectAllMatches(){return this._model?(this._model.selectAllMatches(),this._editor.focus(),!0):!1}async getGlobalBufferTerm(){return this._editor.getOption(41).globalFindClipboard&&this._editor.hasModel()&&!this._editor.getModel().isTooLargeForSyncing()?this._clipboardService.readFindText():""}setGlobalBufferTerm(V){this._editor.getOption(41).globalFindClipboard&&this._editor.hasModel()&&!this._editor.getModel().isTooLargeForSyncing()&&this._clipboardService.writeFindText(V)}};e.CommonFindController=C,C.ID="editor.contrib.findController",e.CommonFindController=C=g=ke([ge(1,u.IContextKeyService),ge(2,l.IStorageService),ge(3,r.IClipboardService),ge(4,d.INotificationService)],C);let w=class extends C{constructor(V,K,F,q,ie,ae,ne,$){super(V,F,ne,$,ae),this._contextViewService=K,this._keybindingService=q,this._themeService=ie,this._widget=null,this._findOptionsWidget=null}async _start(V,K){this._widget||this._createFindWidget();const F=this._editor.getSelection();let q=!1;switch(this._editor.getOption(41).autoFindInSelection){case"always":q=!0;break;case"never":q=!1;break;case"multiline":{q=!!F&&F.startLineNumber!==F.endLineNumber;break}default:break}V.updateSearchScope=V.updateSearchScope||q,await super._start(V,K),this._widget&&(V.shouldFocus===2?this._widget.focusReplaceInput():V.shouldFocus===1&&this._widget.focusFindInput())}highlightFindOptions(V=!1){this._widget||this._createFindWidget(),this._state.isRevealed&&!V?this._widget.highlightFindOptions():this._findOptionsWidget.highlightFindOptions()}_createFindWidget(){this._widget=this._register(new i.FindWidget(this._editor,this,this._state,this._contextViewService,this._keybindingService,this._contextKeyService,this._themeService,this._storageService,this._notificationService)),this._findOptionsWidget=this._register(new b.FindOptionsWidget(this._editor,this._state,this._keybindingService))}};e.FindController=w,e.FindController=w=ke([ge(1,f.IContextViewService),ge(2,u.IContextKeyService),ge(3,c.IKeybindingService),ge(4,o.IThemeService),ge(5,d.INotificationService),ge(6,l.IStorageService),ge(7,r.IClipboardService)],w),e.StartFindAction=(0,E.registerMultiEditorAction)(new E.MultiEditorAction({id:v.FIND_IDS.StartFindAction,label:n.localize(1,null),alias:"Find",precondition:u.ContextKeyExpr.or(p.EditorContextKeys.focus,u.ContextKeyExpr.has("editorIsOpen")),kbOpts:{kbExpr:null,primary:2084,weight:100},menuOpts:{menuId:t.MenuId.MenubarEditMenu,group:"3_find",title:n.localize(2,null),order:1}})),e.StartFindAction.addImplementation(0,(W,V,K)=>{const F=C.get(V);return F?F.start({forceRevealReplace:!1,seedSearchStringFromSelection:V.getOption(41).seedSearchStringFromSelection!=="never"?"single":"none",seedSearchStringFromNonEmptySelection:V.getOption(41).seedSearchStringFromSelection==="selection",seedSearchStringFromGlobalClipboard:V.getOption(41).globalFindClipboard,shouldFocus:1,shouldAnimate:!0,updateSearchScope:!1,loop:V.getOption(41).loop}):!1});const D={description:"Open a new In-Editor Find Widget.",args:[{name:"Open a new In-Editor Find Widget args",schema:{properties:{searchString:{type:"string"},replaceString:{type:"string"},isRegex:{type:"boolean"},matchWholeWord:{type:"boolean"},isCaseSensitive:{type:"boolean"},preserveCase:{type:"boolean"},findInSelection:{type:"boolean"}}}}]};class I extends E.EditorAction{constructor(){super({id:v.FIND_IDS.StartFindWithArgs,label:n.localize(3,null),alias:"Find With Arguments",precondition:void 0,kbOpts:{kbExpr:null,primary:0,weight:100},metadata:D})}async run(V,K,F){const q=C.get(K);if(q){const ie=F?{searchString:F.searchString,replaceString:F.replaceString,isReplaceRevealed:F.replaceString!==void 0,isRegex:F.isRegex,wholeWord:F.matchWholeWord,matchCase:F.isCaseSensitive,preserveCase:F.preserveCase}:{};await q.start({forceRevealReplace:!1,seedSearchStringFromSelection:q.getState().searchString.length===0&&K.getOption(41).seedSearchStringFromSelection!=="never"?"single":"none",seedSearchStringFromNonEmptySelection:K.getOption(41).seedSearchStringFromSelection==="selection",seedSearchStringFromGlobalClipboard:!0,shouldFocus:1,shouldAnimate:!0,updateSearchScope:F?.findInSelection||!1,loop:K.getOption(41).loop},ie),q.setGlobalBufferTerm(q.getState().searchString)}}}e.StartFindWithArgsAction=I;class T extends E.EditorAction{constructor(){super({id:v.FIND_IDS.StartFindWithSelection,label:n.localize(4,null),alias:"Find With Selection",precondition:void 0,kbOpts:{kbExpr:null,primary:0,mac:{primary:2083},weight:100}})}async run(V,K){const F=C.get(K);F&&(await F.start({forceRevealReplace:!1,seedSearchStringFromSelection:"multiple",seedSearchStringFromNonEmptySelection:!1,seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:K.getOption(41).loop}),F.setGlobalBufferTerm(F.getState().searchString))}}e.StartFindWithSelectionAction=T;class A extends E.EditorAction{async run(V,K){const F=C.get(K);F&&!this._run(F)&&(await F.start({forceRevealReplace:!1,seedSearchStringFromSelection:F.getState().searchString.length===0&&K.getOption(41).seedSearchStringFromSelection!=="never"?"single":"none",seedSearchStringFromNonEmptySelection:K.getOption(41).seedSearchStringFromSelection==="selection",seedSearchStringFromGlobalClipboard:!0,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:K.getOption(41).loop}),this._run(F))}}e.MatchFindAction=A;class P extends A{constructor(){super({id:v.FIND_IDS.NextMatchFindAction,label:n.localize(5,null),alias:"Find Next",precondition:void 0,kbOpts:[{kbExpr:p.EditorContextKeys.focus,primary:61,mac:{primary:2085,secondary:[61]},weight:100},{kbExpr:u.ContextKeyExpr.and(p.EditorContextKeys.focus,v.CONTEXT_FIND_INPUT_FOCUSED),primary:3,weight:100}]})}_run(V){return V.moveToNextMatch()?(V.editor.pushUndoStop(),!0):!1}}e.NextMatchFindAction=P;class N extends A{constructor(){super({id:v.FIND_IDS.PreviousMatchFindAction,label:n.localize(6,null),alias:"Find Previous",precondition:void 0,kbOpts:[{kbExpr:p.EditorContextKeys.focus,primary:1085,mac:{primary:3109,secondary:[1085]},weight:100},{kbExpr:u.ContextKeyExpr.and(p.EditorContextKeys.focus,v.CONTEXT_FIND_INPUT_FOCUSED),primary:1027,weight:100}]})}_run(V){return V.moveToPrevMatch()}}e.PreviousMatchFindAction=N;class M extends E.EditorAction{constructor(){super({id:v.FIND_IDS.GoToMatchFindAction,label:n.localize(7,null),alias:"Go to Match...",precondition:v.CONTEXT_FIND_WIDGET_VISIBLE}),this._highlightDecorations=[]}run(V,K,F){const q=C.get(K);if(!q)return;const ie=q.getState().matchesCount;if(ie<1){V.get(d.INotificationService).notify({severity:d.Severity.Warning,message:n.localize(8,null)});return}const ne=V.get(s.IQuickInputService).createInputBox();ne.placeholder=n.localize(9,null,ie);const $=Q=>{const re=parseInt(Q);if(isNaN(re))return;const de=q.getState().matchesCount;if(re>0&&re<=de)return re-1;if(re<0&&re>=-de)return de+re},J=Q=>{const re=$(Q);if(typeof re=="number"){ne.validationMessage=void 0,q.goToMatch(re);const de=q.getState().currentMatch;de&&this.addDecorations(K,de)}else ne.validationMessage=n.localize(10,null,q.getState().matchesCount),this.clearDecorations(K)};ne.onDidChangeValue(Q=>{J(Q)}),ne.onDidAccept(()=>{const Q=$(ne.value);typeof Q=="number"?(q.goToMatch(Q),ne.hide()):ne.validationMessage=n.localize(11,null,q.getState().matchesCount)}),ne.onDidHide(()=>{this.clearDecorations(K),ne.dispose()}),ne.show()}clearDecorations(V){V.changeDecorations(K=>{this._highlightDecorations=K.deltaDecorations(this._highlightDecorations,[])})}addDecorations(V,K){V.changeDecorations(F=>{this._highlightDecorations=F.deltaDecorations(this._highlightDecorations,[{range:K,options:{description:"find-match-quick-access-range-highlight",className:"rangeHighlight",isWholeLine:!0}},{range:K,options:{description:"find-match-quick-access-range-highlight-overview",overviewRuler:{color:(0,o.themeColorFromId)(S.overviewRulerRangeHighlight),position:_.OverviewRulerLane.Full}}}])})}}e.MoveToMatchFindAction=M;class R extends E.EditorAction{async run(V,K){const F=C.get(K);if(!F)return;const q=m(K,"single",!1);q&&F.setSearchString(q),this._run(F)||(await F.start({forceRevealReplace:!1,seedSearchStringFromSelection:"none",seedSearchStringFromNonEmptySelection:!1,seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:K.getOption(41).loop}),this._run(F))}}e.SelectionMatchFindAction=R;class x extends R{constructor(){super({id:v.FIND_IDS.NextSelectionMatchFindAction,label:n.localize(12,null),alias:"Find Next Selection",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:2109,weight:100}})}_run(V){return V.moveToNextMatch()}}e.NextSelectionMatchFindAction=x;class O extends R{constructor(){super({id:v.FIND_IDS.PreviousSelectionMatchFindAction,label:n.localize(13,null),alias:"Find Previous Selection",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:3133,weight:100}})}_run(V){return V.moveToPrevMatch()}}e.PreviousSelectionMatchFindAction=O,e.StartFindReplaceAction=(0,E.registerMultiEditorAction)(new E.MultiEditorAction({id:v.FIND_IDS.StartFindReplaceAction,label:n.localize(14,null),alias:"Replace",precondition:u.ContextKeyExpr.or(p.EditorContextKeys.focus,u.ContextKeyExpr.has("editorIsOpen")),kbOpts:{kbExpr:null,primary:2086,mac:{primary:2596},weight:100},menuOpts:{menuId:t.MenuId.MenubarEditMenu,group:"3_find",title:n.localize(15,null),order:2}})),e.StartFindReplaceAction.addImplementation(0,(W,V,K)=>{if(!V.hasModel()||V.getOption(90))return!1;const F=C.get(V);if(!F)return!1;const q=V.getSelection(),ie=F.isFindInputFocused(),ae=!q.isEmpty()&&q.startLineNumber===q.endLineNumber&&V.getOption(41).seedSearchStringFromSelection!=="never"&&!ie,ne=ie||ae?2:1;return F.start({forceRevealReplace:!0,seedSearchStringFromSelection:ae?"single":"none",seedSearchStringFromNonEmptySelection:V.getOption(41).seedSearchStringFromSelection==="selection",seedSearchStringFromGlobalClipboard:V.getOption(41).seedSearchStringFromSelection!=="never",shouldFocus:ne,shouldAnimate:!0,updateSearchScope:!1,loop:V.getOption(41).loop})}),(0,E.registerEditorContribution)(C.ID,w,0),(0,E.registerEditorAction)(I),(0,E.registerEditorAction)(T),(0,E.registerEditorAction)(P),(0,E.registerEditorAction)(N),(0,E.registerEditorAction)(M),(0,E.registerEditorAction)(x),(0,E.registerEditorAction)(O);const B=E.EditorCommand.bindToContribution(C.get);(0,E.registerEditorCommand)(new B({id:v.FIND_IDS.CloseFindWidgetCommand,precondition:v.CONTEXT_FIND_WIDGET_VISIBLE,handler:W=>W.closeFindWidget(),kbOpts:{weight:100+5,kbExpr:u.ContextKeyExpr.and(p.EditorContextKeys.focus,u.ContextKeyExpr.not("isComposing")),primary:9,secondary:[1033]}})),(0,E.registerEditorCommand)(new B({id:v.FIND_IDS.ToggleCaseSensitiveCommand,precondition:void 0,handler:W=>W.toggleCaseSensitive(),kbOpts:{weight:100+5,kbExpr:p.EditorContextKeys.focus,primary:v.ToggleCaseSensitiveKeybinding.primary,mac:v.ToggleCaseSensitiveKeybinding.mac,win:v.ToggleCaseSensitiveKeybinding.win,linux:v.ToggleCaseSensitiveKeybinding.linux}})),(0,E.registerEditorCommand)(new B({id:v.FIND_IDS.ToggleWholeWordCommand,precondition:void 0,handler:W=>W.toggleWholeWords(),kbOpts:{weight:100+5,kbExpr:p.EditorContextKeys.focus,primary:v.ToggleWholeWordKeybinding.primary,mac:v.ToggleWholeWordKeybinding.mac,win:v.ToggleWholeWordKeybinding.win,linux:v.ToggleWholeWordKeybinding.linux}})),(0,E.registerEditorCommand)(new B({id:v.FIND_IDS.ToggleRegexCommand,precondition:void 0,handler:W=>W.toggleRegex(),kbOpts:{weight:100+5,kbExpr:p.EditorContextKeys.focus,primary:v.ToggleRegexKeybinding.primary,mac:v.ToggleRegexKeybinding.mac,win:v.ToggleRegexKeybinding.win,linux:v.ToggleRegexKeybinding.linux}})),(0,E.registerEditorCommand)(new B({id:v.FIND_IDS.ToggleSearchScopeCommand,precondition:void 0,handler:W=>W.toggleSearchScope(),kbOpts:{weight:100+5,kbExpr:p.EditorContextKeys.focus,primary:v.ToggleSearchScopeKeybinding.primary,mac:v.ToggleSearchScopeKeybinding.mac,win:v.ToggleSearchScopeKeybinding.win,linux:v.ToggleSearchScopeKeybinding.linux}})),(0,E.registerEditorCommand)(new B({id:v.FIND_IDS.TogglePreserveCaseCommand,precondition:void 0,handler:W=>W.togglePreserveCase(),kbOpts:{weight:100+5,kbExpr:p.EditorContextKeys.focus,primary:v.TogglePreserveCaseKeybinding.primary,mac:v.TogglePreserveCaseKeybinding.mac,win:v.TogglePreserveCaseKeybinding.win,linux:v.TogglePreserveCaseKeybinding.linux}})),(0,E.registerEditorCommand)(new B({id:v.FIND_IDS.ReplaceOneAction,precondition:v.CONTEXT_FIND_WIDGET_VISIBLE,handler:W=>W.replace(),kbOpts:{weight:100+5,kbExpr:p.EditorContextKeys.focus,primary:3094}})),(0,E.registerEditorCommand)(new B({id:v.FIND_IDS.ReplaceOneAction,precondition:v.CONTEXT_FIND_WIDGET_VISIBLE,handler:W=>W.replace(),kbOpts:{weight:100+5,kbExpr:u.ContextKeyExpr.and(p.EditorContextKeys.focus,v.CONTEXT_REPLACE_INPUT_FOCUSED),primary:3}})),(0,E.registerEditorCommand)(new B({id:v.FIND_IDS.ReplaceAllAction,precondition:v.CONTEXT_FIND_WIDGET_VISIBLE,handler:W=>W.replaceAll(),kbOpts:{weight:100+5,kbExpr:p.EditorContextKeys.focus,primary:2563}})),(0,E.registerEditorCommand)(new B({id:v.FIND_IDS.ReplaceAllAction,precondition:v.CONTEXT_FIND_WIDGET_VISIBLE,handler:W=>W.replaceAll(),kbOpts:{weight:100+5,kbExpr:u.ContextKeyExpr.and(p.EditorContextKeys.focus,v.CONTEXT_REPLACE_INPUT_FOCUSED),primary:void 0,mac:{primary:2051}}})),(0,E.registerEditorCommand)(new B({id:v.FIND_IDS.SelectAllMatchesAction,precondition:v.CONTEXT_FIND_WIDGET_VISIBLE,handler:W=>W.selectAllMatches(),kbOpts:{weight:100+5,kbExpr:p.EditorContextKeys.focus,primary:515}}))}),define(se[378],oe([1,0,26,41,38,675,29,82,23,28]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FoldingDecorationProvider=e.foldingManualExpandedIcon=e.foldingManualCollapsedIcon=e.foldingCollapsedIcon=e.foldingExpandedIcon=void 0;const b=(0,S.registerColor)("editor.foldBackground",{light:(0,S.transparent)(S.editorSelectionBackground,.3),dark:(0,S.transparent)(S.editorSelectionBackground,.3),hcDark:null,hcLight:null},(0,E.localize)(0,null),!0);(0,S.registerColor)("editorGutter.foldingControlForeground",{dark:S.iconForeground,light:S.iconForeground,hcDark:S.iconForeground,hcLight:S.iconForeground},(0,E.localize)(1,null)),e.foldingExpandedIcon=(0,p.registerIcon)("folding-expanded",L.Codicon.chevronDown,(0,E.localize)(2,null)),e.foldingCollapsedIcon=(0,p.registerIcon)("folding-collapsed",L.Codicon.chevronRight,(0,E.localize)(3,null)),e.foldingManualCollapsedIcon=(0,p.registerIcon)("folding-manual-collapsed",e.foldingCollapsedIcon,(0,E.localize)(4,null)),e.foldingManualExpandedIcon=(0,p.registerIcon)("folding-manual-expanded",e.foldingExpandedIcon,(0,E.localize)(5,null));const a={color:(0,_.themeColorFromId)(b),position:k.MinimapPosition.Inline},i=(0,E.localize)(6,null),n=(0,E.localize)(7,null);class t{constructor(u){this.editor=u,this.showFoldingControls="mouseover",this.showFoldingHighlights=!0}getDecorationOption(u,f,c){return f?t.HIDDEN_RANGE_DECORATION:this.showFoldingControls==="never"?u?this.showFoldingHighlights?t.NO_CONTROLS_COLLAPSED_HIGHLIGHTED_RANGE_DECORATION:t.NO_CONTROLS_COLLAPSED_RANGE_DECORATION:t.NO_CONTROLS_EXPANDED_RANGE_DECORATION:u?c?this.showFoldingHighlights?t.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION:t.MANUALLY_COLLAPSED_VISUAL_DECORATION:this.showFoldingHighlights?t.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION:t.COLLAPSED_VISUAL_DECORATION:this.showFoldingControls==="mouseover"?c?t.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION:t.EXPANDED_AUTO_HIDE_VISUAL_DECORATION:c?t.MANUALLY_EXPANDED_VISUAL_DECORATION:t.EXPANDED_VISUAL_DECORATION}changeDecorations(u){return this.editor.changeDecorations(u)}removeDecorations(u){this.editor.removeDecorations(u)}}e.FoldingDecorationProvider=t,t.COLLAPSED_VISUAL_DECORATION=y.ModelDecorationOptions.register({description:"folding-collapsed-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",isWholeLine:!0,linesDecorationsTooltip:i,firstLineDecorationClassName:v.ThemeIcon.asClassName(e.foldingCollapsedIcon)}),t.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION=y.ModelDecorationOptions.register({description:"folding-collapsed-highlighted-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",className:"folded-background",minimap:a,isWholeLine:!0,linesDecorationsTooltip:i,firstLineDecorationClassName:v.ThemeIcon.asClassName(e.foldingCollapsedIcon)}),t.MANUALLY_COLLAPSED_VISUAL_DECORATION=y.ModelDecorationOptions.register({description:"folding-manually-collapsed-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",isWholeLine:!0,linesDecorationsTooltip:i,firstLineDecorationClassName:v.ThemeIcon.asClassName(e.foldingManualCollapsedIcon)}),t.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION=y.ModelDecorationOptions.register({description:"folding-manually-collapsed-highlighted-visual-decoration",stickiness:0,afterContentClassName:"inline-folded",className:"folded-background",minimap:a,isWholeLine:!0,linesDecorationsTooltip:i,firstLineDecorationClassName:v.ThemeIcon.asClassName(e.foldingManualCollapsedIcon)}),t.NO_CONTROLS_COLLAPSED_RANGE_DECORATION=y.ModelDecorationOptions.register({description:"folding-no-controls-range-decoration",stickiness:0,afterContentClassName:"inline-folded",isWholeLine:!0,linesDecorationsTooltip:i}),t.NO_CONTROLS_COLLAPSED_HIGHLIGHTED_RANGE_DECORATION=y.ModelDecorationOptions.register({description:"folding-no-controls-range-decoration",stickiness:0,afterContentClassName:"inline-folded",className:"folded-background",minimap:a,isWholeLine:!0,linesDecorationsTooltip:i}),t.EXPANDED_VISUAL_DECORATION=y.ModelDecorationOptions.register({description:"folding-expanded-visual-decoration",stickiness:1,isWholeLine:!0,firstLineDecorationClassName:"alwaysShowFoldIcons "+v.ThemeIcon.asClassName(e.foldingExpandedIcon),linesDecorationsTooltip:n}),t.EXPANDED_AUTO_HIDE_VISUAL_DECORATION=y.ModelDecorationOptions.register({description:"folding-expanded-auto-hide-visual-decoration",stickiness:1,isWholeLine:!0,firstLineDecorationClassName:v.ThemeIcon.asClassName(e.foldingExpandedIcon),linesDecorationsTooltip:n}),t.MANUALLY_EXPANDED_VISUAL_DECORATION=y.ModelDecorationOptions.register({description:"folding-manually-expanded-visual-decoration",stickiness:0,isWholeLine:!0,firstLineDecorationClassName:"alwaysShowFoldIcons "+v.ThemeIcon.asClassName(e.foldingManualExpandedIcon),linesDecorationsTooltip:n}),t.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION=y.ModelDecorationOptions.register({description:"folding-manually-expanded-auto-hide-visual-decoration",stickiness:0,isWholeLine:!0,firstLineDecorationClassName:v.ThemeIcon.asClassName(e.foldingManualExpandedIcon),linesDecorationsTooltip:n}),t.NO_CONTROLS_EXPANDED_RANGE_DECORATION=y.ModelDecorationOptions.register({description:"folding-no-controls-range-decoration",stickiness:0,isWholeLine:!0}),t.HIDDEN_RANGE_DECORATION=y.ModelDecorationOptions.register({description:"folding-hidden-range-decoration",stickiness:1})}),define(se[261],oe([1,0,14,19,12,65,2,11,20,127,16,21,31,32,302,558,303,674,15,378,185,304,50,79,61,18,6,25,22,51,27,461]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w,D,I,T){"use strict";var A;Object.defineProperty(e,"__esModule",{value:!0}),e.RangesLimitReporter=e.FoldingController=void 0;const P=new c.RawContextKey("foldingEnabled",!1);let N=A=class extends S.Disposable{static get(G){return G.getContribution(A.ID)}static getFoldingRangeProviders(G,z){var H,Y;const j=G.foldingRangeProvider.ordered(z);return(Y=(H=A._foldingRangeSelector)===null||H===void 0?void 0:H.call(A,j,z))!==null&&Y!==void 0?Y:j}constructor(G,z,H,Y,j,Z){super(),this.contextKeyService=z,this.languageConfigurationService=H,this.languageFeaturesService=Z,this.localToDispose=this._register(new S.DisposableStore),this.editor=G,this._foldingLimitReporter=new M(G);const ee=this.editor.getOptions();this._isEnabled=ee.get(43),this._useFoldingProviders=ee.get(44)!=="indentation",this._unfoldOnClickAfterEndOfLine=ee.get(48),this._restoringViewState=!1,this._currentModelHasFoldedImports=!1,this._foldingImportsByDefault=ee.get(46),this.updateDebounceInfo=j.for(Z.foldingRangeProvider,"Folding",{min:200}),this.foldingModel=null,this.hiddenRangeModel=null,this.rangeProvider=null,this.foldingRegionPromise=null,this.foldingModelPromise=null,this.updateScheduler=null,this.cursorChangedScheduler=null,this.mouseDownInfo=null,this.foldingDecorationProvider=new d.FoldingDecorationProvider(G),this.foldingDecorationProvider.showFoldingControls=ee.get(109),this.foldingDecorationProvider.showFoldingHighlights=ee.get(45),this.foldingEnabled=P.bindTo(this.contextKeyService),this.foldingEnabled.set(this._isEnabled),this._register(this.editor.onDidChangeModel(()=>this.onModelChanged())),this._register(this.editor.onDidChangeConfiguration(le=>{if(le.hasChanged(43)&&(this._isEnabled=this.editor.getOptions().get(43),this.foldingEnabled.set(this._isEnabled),this.onModelChanged()),le.hasChanged(47)&&this.onModelChanged(),le.hasChanged(109)||le.hasChanged(45)){const ue=this.editor.getOptions();this.foldingDecorationProvider.showFoldingControls=ue.get(109),this.foldingDecorationProvider.showFoldingHighlights=ue.get(45),this.triggerFoldingModelChanged()}le.hasChanged(44)&&(this._useFoldingProviders=this.editor.getOptions().get(44)!=="indentation",this.onFoldingStrategyChanged()),le.hasChanged(48)&&(this._unfoldOnClickAfterEndOfLine=this.editor.getOptions().get(48)),le.hasChanged(46)&&(this._foldingImportsByDefault=this.editor.getOptions().get(46))})),this.onModelChanged()}saveViewState(){const G=this.editor.getModel();if(!G||!this._isEnabled||G.isTooLargeForTokenization())return{};if(this.foldingModel){const z=this.foldingModel.getMemento(),H=this.rangeProvider?this.rangeProvider.id:void 0;return{collapsedRegions:z,lineCount:G.getLineCount(),provider:H,foldedImports:this._currentModelHasFoldedImports}}}restoreViewState(G){const z=this.editor.getModel();if(!(!z||!this._isEnabled||z.isTooLargeForTokenization()||!this.hiddenRangeModel)&&G&&(this._currentModelHasFoldedImports=!!G.foldedImports,G.collapsedRegions&&G.collapsedRegions.length>0&&this.foldingModel)){this._restoringViewState=!0;try{this.foldingModel.applyMemento(G.collapsedRegions)}finally{this._restoringViewState=!1}}}onModelChanged(){this.localToDispose.clear();const G=this.editor.getModel();!this._isEnabled||!G||G.isTooLargeForTokenization()||(this._currentModelHasFoldedImports=!1,this.foldingModel=new t.FoldingModel(G,this.foldingDecorationProvider),this.localToDispose.add(this.foldingModel),this.hiddenRangeModel=new r.HiddenRangeModel(this.foldingModel),this.localToDispose.add(this.hiddenRangeModel),this.localToDispose.add(this.hiddenRangeModel.onDidChange(z=>this.onHiddenRangesChanges(z))),this.updateScheduler=new L.Delayer(this.updateDebounceInfo.get(G)),this.cursorChangedScheduler=new L.RunOnceScheduler(()=>this.revealCursor(),200),this.localToDispose.add(this.cursorChangedScheduler),this.localToDispose.add(this.languageFeaturesService.foldingRangeProvider.onDidChange(()=>this.onFoldingStrategyChanged())),this.localToDispose.add(this.editor.onDidChangeModelLanguageConfiguration(()=>this.onFoldingStrategyChanged())),this.localToDispose.add(this.editor.onDidChangeModelContent(z=>this.onDidChangeModelContent(z))),this.localToDispose.add(this.editor.onDidChangeCursorPosition(()=>this.onCursorPositionChanged())),this.localToDispose.add(this.editor.onMouseDown(z=>this.onEditorMouseDown(z))),this.localToDispose.add(this.editor.onMouseUp(z=>this.onEditorMouseUp(z))),this.localToDispose.add({dispose:()=>{var z,H;this.foldingRegionPromise&&(this.foldingRegionPromise.cancel(),this.foldingRegionPromise=null),(z=this.updateScheduler)===null||z===void 0||z.cancel(),this.updateScheduler=null,this.foldingModel=null,this.foldingModelPromise=null,this.hiddenRangeModel=null,this.cursorChangedScheduler=null,(H=this.rangeProvider)===null||H===void 0||H.dispose(),this.rangeProvider=null}}),this.triggerFoldingModelChanged())}onFoldingStrategyChanged(){var G;(G=this.rangeProvider)===null||G===void 0||G.dispose(),this.rangeProvider=null,this.triggerFoldingModelChanged()}getRangeProvider(G){if(this.rangeProvider)return this.rangeProvider;const z=new u.IndentRangeProvider(G,this.languageConfigurationService,this._foldingLimitReporter);if(this.rangeProvider=z,this._useFoldingProviders&&this.foldingModel){const H=A.getFoldingRangeProviders(this.languageFeaturesService,G);H.length>0&&(this.rangeProvider=new l.SyntaxRangeProvider(G,H,()=>this.triggerFoldingModelChanged(),this._foldingLimitReporter,z))}return this.rangeProvider}getFoldingModel(){return this.foldingModelPromise}onDidChangeModelContent(G){var z;(z=this.hiddenRangeModel)===null||z===void 0||z.notifyChangeModelContent(G),this.triggerFoldingModelChanged()}triggerFoldingModelChanged(){this.updateScheduler&&(this.foldingRegionPromise&&(this.foldingRegionPromise.cancel(),this.foldingRegionPromise=null),this.foldingModelPromise=this.updateScheduler.trigger(()=>{const G=this.foldingModel;if(!G)return null;const z=new h.StopWatch,H=this.getRangeProvider(G.textModel),Y=this.foldingRegionPromise=(0,L.createCancelablePromise)(j=>H.compute(j));return Y.then(j=>{if(j&&Y===this.foldingRegionPromise){let Z;if(this._foldingImportsByDefault&&!this._currentModelHasFoldedImports){const ce=j.setCollapsedAllOfType(i.FoldingRangeKind.Imports.value,!0);ce&&(Z=v.StableEditorScrollState.capture(this.editor),this._currentModelHasFoldedImports=ce)}const ee=this.editor.getSelections(),le=ee?ee.map(ce=>ce.startLineNumber):[];G.update(j,le),Z?.restore(this.editor);const ue=this.updateDebounceInfo.update(G.textModel,z.elapsed());this.updateScheduler&&(this.updateScheduler.defaultDelay=ue)}return G})}).then(void 0,G=>((0,y.onUnexpectedError)(G),null)))}onHiddenRangesChanges(G){if(this.hiddenRangeModel&&G.length&&!this._restoringViewState){const z=this.editor.getSelections();z&&this.hiddenRangeModel.adjustSelections(z)&&this.editor.setSelections(z)}this.editor.setHiddenAreas(G,this)}onCursorPositionChanged(){this.hiddenRangeModel&&this.hiddenRangeModel.hasRanges()&&this.cursorChangedScheduler.schedule()}revealCursor(){const G=this.getFoldingModel();G&&G.then(z=>{if(z){const H=this.editor.getSelections();if(H&&H.length>0){const Y=[];for(const j of H){const Z=j.selectionStartLineNumber;this.hiddenRangeModel&&this.hiddenRangeModel.isHidden(Z)&&Y.push(...z.getAllRegionsAtLine(Z,ee=>ee.isCollapsed&&Z>ee.startLineNumber))}Y.length&&(z.toggleCollapseState(Y),this.reveal(H[0].getPosition()))}}}).then(void 0,y.onUnexpectedError)}onEditorMouseDown(G){if(this.mouseDownInfo=null,!this.hiddenRangeModel||!G.target||!G.target.range||!G.event.leftButton&&!G.event.middleButton)return;const z=G.target.range;let H=!1;switch(G.target.type){case 4:{const Y=G.target.detail,j=G.target.element.offsetLeft;if(Y.offsetX-j<4)return;H=!0;break}case 7:{if(this._unfoldOnClickAfterEndOfLine&&this.hiddenRangeModel.hasRanges()&&!G.target.detail.isAfterLines)break;return}case 6:{if(this.hiddenRangeModel.hasRanges()){const Y=this.editor.getModel();if(Y&&z.startColumn===Y.getLineMaxColumn(z.startLineNumber))break}return}default:return}this.mouseDownInfo={lineNumber:z.startLineNumber,iconClicked:H}}onEditorMouseUp(G){const z=this.foldingModel;if(!z||!this.mouseDownInfo||!G.target)return;const H=this.mouseDownInfo.lineNumber,Y=this.mouseDownInfo.iconClicked,j=G.target.range;if(!j||j.startLineNumber!==H)return;if(Y){if(G.target.type!==4)return}else{const ee=this.editor.getModel();if(!ee||j.startColumn!==ee.getLineMaxColumn(H))return}const Z=z.getRegionAtLine(H);if(Z&&Z.startLineNumber===H){const ee=Z.isCollapsed;if(Y||ee){const le=G.event.altKey;let ue=[];if(le){const ce=ve=>!ve.containedBy(Z)&&!Z.containedBy(ve),pe=z.getRegionsInside(null,ce);for(const ve of pe)ve.isCollapsed&&ue.push(ve);ue.length===0&&(ue=pe)}else{const ce=G.event.middleButton||G.event.shiftKey;if(ce)for(const pe of z.getRegionsInside(Z))pe.isCollapsed===ee&&ue.push(pe);(ee||!ce||ue.length===0)&&ue.push(Z)}z.toggleCollapseState(ue),this.reveal({lineNumber:H,column:1})}}}reveal(G){this.editor.revealPositionInCenterIfOutsideViewport(G,0)}};e.FoldingController=N,N.ID="editor.contrib.folding",e.FoldingController=N=A=ke([ge(1,c.IContextKeyService),ge(2,n.ILanguageConfigurationService),ge(3,o.INotificationService),ge(4,g.ILanguageFeatureDebounceService),ge(5,m.ILanguageFeaturesService)],N);class M{constructor(G){this.editor=G,this._onDidChange=new C.Emitter,this._computed=0,this._limited=!1}get limit(){return this.editor.getOptions().get(47)}update(G,z){(G!==this._computed||z!==this._limited)&&(this._computed=G,this._limited=z,this._onDidChange.fire())}}e.RangesLimitReporter=M;class R extends b.EditorAction{runEditorCommand(G,z,H){const Y=G.get(n.ILanguageConfigurationService),j=N.get(z);if(!j)return;const Z=j.getFoldingModel();if(Z)return this.reportTelemetry(G,z),Z.then(ee=>{if(ee){this.invoke(j,ee,z,H,Y);const le=z.getSelection();le&&j.reveal(le.getStartPosition())}})}getSelectedLines(G){const z=G.getSelections();return z?z.map(H=>H.startLineNumber):[]}getLineNumbers(G,z){return G&&G.selectionLines?G.selectionLines.map(H=>H+1):this.getSelectedLines(z)}run(G,z){}}function x(U){if(!_.isUndefined(U)){if(!_.isObject(U))return!1;const G=U;if(!_.isUndefined(G.levels)&&!_.isNumber(G.levels)||!_.isUndefined(G.direction)&&!_.isString(G.direction)||!_.isUndefined(G.selectionLines)&&(!Array.isArray(G.selectionLines)||!G.selectionLines.every(_.isNumber)))return!1}return!0}class O extends R{constructor(){super({id:"editor.unfold",label:f.localize(0,null),alias:"Unfold",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:3166,mac:{primary:2654},weight:100},metadata:{description:"Unfold the content in the editor",args:[{name:"Unfold editor argument",description:`Property-value pairs that can be passed through this argument:
+						* 'levels': Number of levels to unfold. If not set, defaults to 1.
+						* 'direction': If 'up', unfold given number of levels up otherwise unfolds down.
+						* 'selectionLines': Array of the start lines (0-based) of the editor selections to apply the unfold action to. If not set, the active selection(s) will be used.
+						`,constraint:x,schema:{type:"object",properties:{levels:{type:"number",default:1},direction:{type:"string",enum:["up","down"],default:"down"},selectionLines:{type:"array",items:{type:"number"}}}}}]}})}invoke(G,z,H,Y){const j=Y&&Y.levels||1,Z=this.getLineNumbers(Y,H);Y&&Y.direction==="up"?(0,t.setCollapseStateLevelsUp)(z,!1,j,Z):(0,t.setCollapseStateLevelsDown)(z,!1,j,Z)}}class B extends R{constructor(){super({id:"editor.unfoldRecursively",label:f.localize(1,null),alias:"Unfold Recursively",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2142),weight:100}})}invoke(G,z,H,Y){(0,t.setCollapseStateLevelsDown)(z,!1,Number.MAX_VALUE,this.getSelectedLines(H))}}class W extends R{constructor(){super({id:"editor.fold",label:f.localize(2,null),alias:"Fold",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:3164,mac:{primary:2652},weight:100},metadata:{description:"Fold the content in the editor",args:[{name:"Fold editor argument",description:`Property-value pairs that can be passed through this argument:
+							* 'levels': Number of levels to fold.
+							* 'direction': If 'up', folds given number of levels up otherwise folds down.
+							* 'selectionLines': Array of the start lines (0-based) of the editor selections to apply the fold action to. If not set, the active selection(s) will be used.
+							If no levels or direction is set, folds the region at the locations or if already collapsed, the first uncollapsed parent instead.
+						`,constraint:x,schema:{type:"object",properties:{levels:{type:"number"},direction:{type:"string",enum:["up","down"]},selectionLines:{type:"array",items:{type:"number"}}}}}]}})}invoke(G,z,H,Y){const j=this.getLineNumbers(Y,H),Z=Y&&Y.levels,ee=Y&&Y.direction;typeof Z!="number"&&typeof ee!="string"?(0,t.setCollapseStateUp)(z,!0,j):ee==="up"?(0,t.setCollapseStateLevelsUp)(z,!0,Z||1,j):(0,t.setCollapseStateLevelsDown)(z,!0,Z||1,j)}}class V extends R{constructor(){super({id:"editor.toggleFold",label:f.localize(3,null),alias:"Toggle Fold",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2090),weight:100}})}invoke(G,z,H){const Y=this.getSelectedLines(H);(0,t.toggleCollapseState)(z,1,Y)}}class K extends R{constructor(){super({id:"editor.foldRecursively",label:f.localize(4,null),alias:"Fold Recursively",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2140),weight:100}})}invoke(G,z,H){const Y=this.getSelectedLines(H);(0,t.setCollapseStateLevelsDown)(z,!0,Number.MAX_VALUE,Y)}}class F extends R{constructor(){super({id:"editor.foldAllBlockComments",label:f.localize(5,null),alias:"Fold All Block Comments",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2138),weight:100}})}invoke(G,z,H,Y,j){if(z.regions.hasTypes())(0,t.setCollapseStateForType)(z,i.FoldingRangeKind.Comment.value,!0);else{const Z=H.getModel();if(!Z)return;const ee=j.getLanguageConfiguration(Z.getLanguageId()).comments;if(ee&&ee.blockCommentStartToken){const le=new RegExp("^\\s*"+(0,p.escapeRegExpCharacters)(ee.blockCommentStartToken));(0,t.setCollapseStateForMatchingLines)(z,le,!0)}}}}class q extends R{constructor(){super({id:"editor.foldAllMarkerRegions",label:f.localize(6,null),alias:"Fold All Regions",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2077),weight:100}})}invoke(G,z,H,Y,j){if(z.regions.hasTypes())(0,t.setCollapseStateForType)(z,i.FoldingRangeKind.Region.value,!0);else{const Z=H.getModel();if(!Z)return;const ee=j.getLanguageConfiguration(Z.getLanguageId()).foldingRules;if(ee&&ee.markers&&ee.markers.start){const le=new RegExp(ee.markers.start);(0,t.setCollapseStateForMatchingLines)(z,le,!0)}}}}class ie extends R{constructor(){super({id:"editor.unfoldAllMarkerRegions",label:f.localize(7,null),alias:"Unfold All Regions",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2078),weight:100}})}invoke(G,z,H,Y,j){if(z.regions.hasTypes())(0,t.setCollapseStateForType)(z,i.FoldingRangeKind.Region.value,!1);else{const Z=H.getModel();if(!Z)return;const ee=j.getLanguageConfiguration(Z.getLanguageId()).foldingRules;if(ee&&ee.markers&&ee.markers.start){const le=new RegExp(ee.markers.start);(0,t.setCollapseStateForMatchingLines)(z,le,!1)}}}}class ae extends R{constructor(){super({id:"editor.foldAllExcept",label:f.localize(8,null),alias:"Fold All Except Selected",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2136),weight:100}})}invoke(G,z,H){const Y=this.getSelectedLines(H);(0,t.setCollapseStateForRest)(z,!0,Y)}}class ne extends R{constructor(){super({id:"editor.unfoldAllExcept",label:f.localize(9,null),alias:"Unfold All Except Selected",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2134),weight:100}})}invoke(G,z,H){const Y=this.getSelectedLines(H);(0,t.setCollapseStateForRest)(z,!1,Y)}}class $ extends R{constructor(){super({id:"editor.foldAll",label:f.localize(10,null),alias:"Fold All",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2069),weight:100}})}invoke(G,z,H){(0,t.setCollapseStateLevelsDown)(z,!0)}}class J extends R{constructor(){super({id:"editor.unfoldAll",label:f.localize(11,null),alias:"Unfold All",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2088),weight:100}})}invoke(G,z,H){(0,t.setCollapseStateLevelsDown)(z,!1)}}class Q extends R{getFoldingLevel(){return parseInt(this.id.substr(Q.ID_PREFIX.length))}invoke(G,z,H){(0,t.setCollapseStateAtLevel)(z,this.getFoldingLevel(),!0,this.getSelectedLines(H))}}Q.ID_PREFIX="editor.foldLevel",Q.ID=U=>Q.ID_PREFIX+U;class re extends R{constructor(){super({id:"editor.gotoParentFold",label:f.localize(12,null),alias:"Go to Parent Fold",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,weight:100}})}invoke(G,z,H){const Y=this.getSelectedLines(H);if(Y.length>0){const j=(0,t.getParentFoldLine)(Y[0],z);j!==null&&H.setSelection({startLineNumber:j,startColumn:1,endLineNumber:j,endColumn:1})}}}class de extends R{constructor(){super({id:"editor.gotoPreviousFold",label:f.localize(13,null),alias:"Go to Previous Folding Range",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,weight:100}})}invoke(G,z,H){const Y=this.getSelectedLines(H);if(Y.length>0){const j=(0,t.getPreviousFoldLine)(Y[0],z);j!==null&&H.setSelection({startLineNumber:j,startColumn:1,endLineNumber:j,endColumn:1})}}}class he extends R{constructor(){super({id:"editor.gotoNextFold",label:f.localize(14,null),alias:"Go to Next Folding Range",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,weight:100}})}invoke(G,z,H){const Y=this.getSelectedLines(H);if(Y.length>0){const j=(0,t.getNextFoldLine)(Y[0],z);j!==null&&H.setSelection({startLineNumber:j,startColumn:1,endLineNumber:j,endColumn:1})}}}class me extends R{constructor(){super({id:"editor.createFoldingRangeFromSelection",label:f.localize(15,null),alias:"Create Folding Range from Selection",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2135),weight:100}})}invoke(G,z,H){var Y;const j=[],Z=H.getSelections();if(Z){for(const ee of Z){let le=ee.endLineNumber;ee.endColumn===1&&--le,le>ee.startLineNumber&&(j.push({startLineNumber:ee.startLineNumber,endLineNumber:le,type:void 0,isCollapsed:!0,source:1}),H.setSelection({startLineNumber:ee.startLineNumber,startColumn:1,endLineNumber:ee.startLineNumber,endColumn:1}))}if(j.length>0){j.sort((le,ue)=>le.startLineNumber-ue.startLineNumber);const ee=s.FoldingRegions.sanitizeAndMerge(z.regions,j,(Y=H.getModel())===null||Y===void 0?void 0:Y.getLineCount());z.updatePost(s.FoldingRegions.fromFoldRanges(ee))}}}}class X extends R{constructor(){super({id:"editor.removeManualFoldingRanges",label:f.localize(16,null),alias:"Remove Manual Folding Ranges",precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2137),weight:100}})}invoke(G,z,H){const Y=H.getSelections();if(Y){const j=[];for(const Z of Y){const{startLineNumber:ee,endLineNumber:le}=Z;j.push(le>=ee?{startLineNumber:ee,endLineNumber:le}:{endLineNumber:le,startLineNumber:ee})}z.removeManualRanges(j),G.triggerFoldingModelChanged()}}}(0,b.registerEditorContribution)(N.ID,N,0),(0,b.registerEditorAction)(O),(0,b.registerEditorAction)(B),(0,b.registerEditorAction)(W),(0,b.registerEditorAction)(K),(0,b.registerEditorAction)($),(0,b.registerEditorAction)(J),(0,b.registerEditorAction)(F),(0,b.registerEditorAction)(q),(0,b.registerEditorAction)(ie),(0,b.registerEditorAction)(ae),(0,b.registerEditorAction)(ne),(0,b.registerEditorAction)(V),(0,b.registerEditorAction)(re),(0,b.registerEditorAction)(de),(0,b.registerEditorAction)(he),(0,b.registerEditorAction)(me),(0,b.registerEditorAction)(X);for(let U=1;U<=7;U++)(0,b.registerInstantiatedEditorAction)(new Q({id:Q.ID(U),label:f.localize(17,null,U),alias:`Fold Level ${U}`,precondition:P,kbOpts:{kbExpr:a.EditorContextKeys.editorTextFocus,primary:(0,E.KeyChord)(2089,2048|21+U),weight:100}}));w.CommandsRegistry.registerCommand("_executeFoldingRangeProvider",async function(U,...G){const[z]=G;if(!(z instanceof D.URI))throw(0,y.illegalArgument)();const H=U.get(m.ILanguageFeaturesService),Y=U.get(I.IModelService).getModel(z);if(!Y)throw(0,y.illegalArgument)();const j=U.get(T.IConfigurationService);if(!j.getValue("editor.folding",{resource:z}))return[];const Z=U.get(n.ILanguageConfigurationService),ee=j.getValue("editor.foldingStrategy",{resource:z}),le={get limit(){return j.getValue("editor.foldingMaximumRegions",{resource:z})},update:(Ce,Se)=>{}},ue=new u.IndentRangeProvider(Y,Z,le);let ce=ue;if(ee!=="indentation"){const Ce=N.getFoldingRangeProviders(H,Y);Ce.length&&(ce=new l.SyntaxRangeProvider(Y,Ce,()=>{},le,ue))}const pe=await ce.compute(k.CancellationToken.None),ve=[];try{if(pe)for(let Ce=0;Ce<pe.length;Ce++){const Se=pe.getType(Ce);ve.push({start:pe.getStartLineNumber(Ce),end:pe.getEndLineNumber(Ce),kind:Se?i.FoldingRangeKind.fromValue(Se):void 0})}return ve}finally{ce.dispose()}})}),define(se[379],oe([1,0,7,227,13,2,10,5,38,31,332,101,8,34,14,21,15,616,27,69]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d){"use strict";var s,l;Object.defineProperty(e,"__esModule",{value:!0}),e.EditorHoverStatusBar=e.ContentHoverWidget=e.ContentHoverController=void 0;const o=L.$;let g=s=class extends E.Disposable{constructor(R,x,O){super(),this._editor=R,this._instantiationService=x,this._keybindingService=O,this._currentResult=null,this._widget=this._register(this._instantiationService.createInstance(T,this._editor)),this._participants=[];for(const B of a.HoverParticipantRegistry.getAll())this._participants.push(this._instantiationService.createInstance(B,this._editor));this._participants.sort((B,W)=>B.hoverOrdinal-W.hoverOrdinal),this._computer=new P(this._editor,this._participants),this._hoverOperation=this._register(new b.HoverOperation(this._editor,this._computer)),this._register(this._hoverOperation.onResult(B=>{if(!this._computer.anchor)return;const W=B.hasLoadingMessage?this._addLoadingMessage(B.value):B.value;this._withResult(new h(this._computer.anchor,W,B.isComplete))})),this._register(L.addStandardDisposableListener(this._widget.getDomNode(),"keydown",B=>{B.equals(9)&&this.hide()})),this._register(v.TokenizationRegistry.onDidChange(()=>{this._widget.position&&this._currentResult&&this._setCurrentResult(this._currentResult)}))}_startShowingOrUpdateHover(R,x,O,B,W){return!this._widget.position||!this._currentResult?R?(this._startHoverOperationIfNecessary(R,x,O,B,!1),!0):!1:this._editor.getOption(60).sticky&&W&&this._widget.isMouseGettingCloser(W.event.posx,W.event.posy)?(R&&this._startHoverOperationIfNecessary(R,x,O,B,!0),!0):R?R&&this._currentResult.anchor.equals(R)?!0:R.canAdoptVisibleHover(this._currentResult.anchor,this._widget.position)?(this._setCurrentResult(this._currentResult.filter(R)),this._startHoverOperationIfNecessary(R,x,O,B,!1),!0):(this._setCurrentResult(null),this._startHoverOperationIfNecessary(R,x,O,B,!1),!0):(this._setCurrentResult(null),!1)}_startHoverOperationIfNecessary(R,x,O,B,W){this._computer.anchor&&this._computer.anchor.equals(R)||(this._hoverOperation.cancel(),this._computer.anchor=R,this._computer.shouldFocus=B,this._computer.source=O,this._computer.insistOnKeepingHoverVisible=W,this._hoverOperation.start(x))}_setCurrentResult(R){this._currentResult!==R&&(R&&R.messages.length===0&&(R=null),this._currentResult=R,this._currentResult?this._renderMessages(this._currentResult.anchor,this._currentResult.messages):this._widget.hide())}_addLoadingMessage(R){if(this._computer.anchor){for(const x of this._participants)if(x.createLoadingMessage){const O=x.createLoadingMessage(this._computer.anchor);if(O)return R.slice(0).concat([O])}}return R}_withResult(R){this._widget.position&&this._currentResult&&this._currentResult.isComplete&&(!R.isComplete||this._computer.insistOnKeepingHoverVisible&&R.messages.length===0)||this._setCurrentResult(R)}_renderMessages(R,x){const{showAtPosition:O,showAtSecondaryPosition:B,highlightRange:W}=s.computeHoverRanges(this._editor,R.range,x),V=new E.DisposableStore,K=V.add(new A(this._keybindingService)),F=document.createDocumentFragment();let q=null;const ie={fragment:F,statusBar:K,setColorPicker:ne=>q=ne,onContentsChanged:()=>this._widget.onContentsChanged(),setMinimumDimensions:ne=>this._widget.setMinimumDimensions(ne),hide:()=>this.hide()};for(const ne of this._participants){const $=x.filter(J=>J.owner===ne);$.length>0&&V.add(ne.renderHoverParts(ie,$))}const ae=x.some(ne=>ne.isBeforeContent);if(K.hasContent&&F.appendChild(K.hoverElement),F.hasChildNodes()){if(W){const ne=this._editor.createDecorationsCollection();ne.set([{range:W,options:s._DECORATION_OPTIONS}]),V.add((0,E.toDisposable)(()=>{ne.clear()}))}this._widget.showAt(F,new C(R.initialMousePosX,R.initialMousePosY,q,O,B,this._editor.getOption(60).above,this._computer.shouldFocus,this._computer.source,ae,V))}else V.dispose()}static computeHoverRanges(R,x,O){let B=1;if(R.hasModel()){const ae=R._getViewModel(),ne=ae.coordinatesConverter,$=ne.convertModelRangeToViewRange(x),J=new S.Position($.startLineNumber,ae.getLineMinColumn($.startLineNumber));B=ne.convertViewPositionToModelPosition(J).column}const W=x.startLineNumber;let V=x.startColumn,K=O[0].range,F=null;for(const ae of O)K=p.Range.plusRange(K,ae.range),ae.range.startLineNumber===W&&ae.range.endLineNumber===W&&(V=Math.max(Math.min(V,ae.range.startColumn),B)),ae.forceShowAtRange&&(F=ae.range);const q=F?F.getStartPosition():new S.Position(W,x.startColumn),ie=F?F.getStartPosition():new S.Position(W,V);return{showAtPosition:q,showAtSecondaryPosition:ie,highlightRange:K}}showsOrWillShow(R){if(this._widget.isResizing)return!0;const x=[];for(const B of this._participants)if(B.suggestHoverAnchor){const W=B.suggestHoverAnchor(R);W&&x.push(W)}const O=R.target;if(O.type===6&&x.push(new a.HoverRangeAnchor(0,O.range,R.event.posx,R.event.posy)),O.type===7){const B=this._editor.getOption(50).typicalHalfwidthCharacterWidth/2;!O.detail.isAfterLines&&typeof O.detail.horizontalDistanceToText=="number"&&O.detail.horizontalDistanceToText<B&&x.push(new a.HoverRangeAnchor(0,O.range,R.event.posx,R.event.posy))}return x.length===0?this._startShowingOrUpdateHover(null,0,0,!1,R):(x.sort((B,W)=>W.priority-B.priority),this._startShowingOrUpdateHover(x[0],0,0,!1,R))}startShowingAtRange(R,x,O,B){this._startShowingOrUpdateHover(new a.HoverRangeAnchor(0,R,void 0,void 0),x,O,B,null)}containsNode(R){return R?this._widget.getDomNode().contains(R):!1}focus(){this._widget.focus()}scrollUp(){this._widget.scrollUp()}scrollDown(){this._widget.scrollDown()}scrollLeft(){this._widget.scrollLeft()}scrollRight(){this._widget.scrollRight()}pageUp(){this._widget.pageUp()}pageDown(){this._widget.pageDown()}goToTop(){this._widget.goToTop()}goToBottom(){this._widget.goToBottom()}hide(){this._computer.anchor=null,this._hoverOperation.cancel(),this._setCurrentResult(null)}get isColorPickerVisible(){return this._widget.isColorPickerVisible}get isVisibleFromKeyboard(){return this._widget.isVisibleFromKeyboard}get isVisible(){return this._widget.isVisible}get isFocused(){return this._widget.isFocused}get isResizing(){return this._widget.isResizing}get widget(){return this._widget}};e.ContentHoverController=g,g._DECORATION_OPTIONS=_.ModelDecorationOptions.register({description:"content-hover-highlight",className:"hoverHighlight"}),e.ContentHoverController=g=s=ke([ge(1,i.IInstantiationService),ge(2,n.IKeybindingService)],g);class h{constructor(R,x,O){this.anchor=R,this.messages=x,this.isComplete=O}filter(R){const x=this.messages.filter(O=>O.isValidForHoverAnchor(R));return x.length===this.messages.length?this:new m(this,this.anchor,x,this.isComplete)}}class m extends h{constructor(R,x,O,B){super(x,O,B),this.original=R}filter(R){return this.original.filter(R)}}class C{constructor(R,x,O,B,W,V,K,F,q,ie){this.initialMousePosX=R,this.initialMousePosY=x,this.colorPicker=O,this.showAtPosition=B,this.showAtSecondaryPosition=W,this.preferAbove=V,this.stoleFocus=K,this.source=F,this.isBeforeContent=q,this.disposables=ie,this.closestMouseDistance=void 0}}const w=30,D=10,I=6;let T=l=class extends f.ResizableContentWidget{get isColorPickerVisible(){var R;return!!(!((R=this._visibleData)===null||R===void 0)&&R.colorPicker)}get isVisibleFromKeyboard(){var R;return((R=this._visibleData)===null||R===void 0?void 0:R.source)===1}get isVisible(){var R;return(R=this._hoverVisibleKey.get())!==null&&R!==void 0?R:!1}get isFocused(){var R;return(R=this._hoverFocusedKey.get())!==null&&R!==void 0?R:!1}constructor(R,x,O,B,W){const V=R.getOption(66)+8,K=150,F=new L.Dimension(K,V);super(R,F),this._configurationService=O,this._accessibilityService=B,this._keybindingService=W,this._hover=this._register(new k.HoverWidget),this._minimumSize=F,this._hoverVisibleKey=r.EditorContextKeys.hoverVisible.bindTo(x),this._hoverFocusedKey=r.EditorContextKeys.hoverFocused.bindTo(x),L.append(this._resizableNode.domNode,this._hover.containerDomNode),this._resizableNode.domNode.style.zIndex="50",this._register(this._editor.onDidLayoutChange(()=>{this.isVisible&&this._updateMaxDimensions()})),this._register(this._editor.onDidChangeConfiguration(ie=>{ie.hasChanged(50)&&this._updateFont()}));const q=this._register(L.trackFocus(this._resizableNode.domNode));this._register(q.onDidFocus(()=>{this._hoverFocusedKey.set(!0)})),this._register(q.onDidBlur(()=>{this._hoverFocusedKey.set(!1)})),this._setHoverData(void 0),this._editor.addContentWidget(this)}dispose(){var R;super.dispose(),(R=this._visibleData)===null||R===void 0||R.disposables.dispose(),this._editor.removeContentWidget(this)}getId(){return l.ID}static _applyDimensions(R,x,O){const B=typeof x=="number"?`${x}px`:x,W=typeof O=="number"?`${O}px`:O;R.style.width=B,R.style.height=W}_setContentsDomNodeDimensions(R,x){const O=this._hover.contentsDomNode;return l._applyDimensions(O,R,x)}_setContainerDomNodeDimensions(R,x){const O=this._hover.containerDomNode;return l._applyDimensions(O,R,x)}_setHoverWidgetDimensions(R,x){this._setContentsDomNodeDimensions(R,x),this._setContainerDomNodeDimensions(R,x),this._layoutContentWidget()}static _applyMaxDimensions(R,x,O){const B=typeof x=="number"?`${x}px`:x,W=typeof O=="number"?`${O}px`:O;R.style.maxWidth=B,R.style.maxHeight=W}_setHoverWidgetMaxDimensions(R,x){l._applyMaxDimensions(this._hover.contentsDomNode,R,x),l._applyMaxDimensions(this._hover.containerDomNode,R,x),this._hover.containerDomNode.style.setProperty("--vscode-hover-maxWidth",typeof R=="number"?`${R}px`:R),this._layoutContentWidget()}_hasHorizontalScrollbar(){const R=this._hover.scrollbar.getScrollDimensions();return R.scrollWidth>R.width}_adjustContentsBottomPadding(){const R=this._hover.contentsDomNode,x=`${this._hover.scrollbar.options.horizontalScrollbarSize}px`;R.style.paddingBottom!==x&&(R.style.paddingBottom=x)}_setAdjustedHoverWidgetDimensions(R){this._setHoverWidgetMaxDimensions("none","none");const x=R.width,O=R.height;this._setHoverWidgetDimensions(x,O),this._hasHorizontalScrollbar()&&(this._adjustContentsBottomPadding(),this._setContentsDomNodeDimensions(x,O-D))}_updateResizableNodeMaxDimensions(){var R,x;const O=(R=this._findMaximumRenderingWidth())!==null&&R!==void 0?R:1/0,B=(x=this._findMaximumRenderingHeight())!==null&&x!==void 0?x:1/0;this._resizableNode.maxSize=new L.Dimension(O,B),this._setHoverWidgetMaxDimensions(O,B)}_resize(R){var x,O;l._lastDimensions=new L.Dimension(R.width,R.height),this._setAdjustedHoverWidgetDimensions(R),this._resizableNode.layout(R.height,R.width),this._updateResizableNodeMaxDimensions(),this._hover.scrollbar.scanDomNode(),this._editor.layoutContentWidget(this),(O=(x=this._visibleData)===null||x===void 0?void 0:x.colorPicker)===null||O===void 0||O.layout()}_findAvailableSpaceVertically(){var R;const x=(R=this._visibleData)===null||R===void 0?void 0:R.showAtPosition;if(x)return this._positionPreference===1?this._availableVerticalSpaceAbove(x):this._availableVerticalSpaceBelow(x)}_findMaximumRenderingHeight(){const R=this._findAvailableSpaceVertically();if(!R)return;let x=I;return Array.from(this._hover.contentsDomNode.children).forEach(O=>{x+=O.clientHeight}),this._hasHorizontalScrollbar()&&(x+=D),Math.min(R,x)}_isHoverTextOverflowing(){this._hover.containerDomNode.style.setProperty("--vscode-hover-whiteSpace","nowrap"),this._hover.containerDomNode.style.setProperty("--vscode-hover-sourceWhiteSpace","nowrap");const R=Array.from(this._hover.contentsDomNode.children).some(x=>x.scrollWidth>x.clientWidth);return this._hover.containerDomNode.style.removeProperty("--vscode-hover-whiteSpace"),this._hover.containerDomNode.style.removeProperty("--vscode-hover-sourceWhiteSpace"),R}_findMaximumRenderingWidth(){if(!this._editor||!this._editor.hasModel())return;const R=this._isHoverTextOverflowing(),x=typeof this._contentWidth>"u"?0:this._contentWidth-2;return R||this._hover.containerDomNode.clientWidth<x?L.getClientArea(this._hover.containerDomNode.ownerDocument.body).width-14:this._hover.containerDomNode.clientWidth+2}isMouseGettingCloser(R,x){if(!this._visibleData)return!1;if(typeof this._visibleData.initialMousePosX>"u"||typeof this._visibleData.initialMousePosY>"u")return this._visibleData.initialMousePosX=R,this._visibleData.initialMousePosY=x,!1;const O=L.getDomNodePagePosition(this.getDomNode());typeof this._visibleData.closestMouseDistance>"u"&&(this._visibleData.closestMouseDistance=N(this._visibleData.initialMousePosX,this._visibleData.initialMousePosY,O.left,O.top,O.width,O.height));const B=N(R,x,O.left,O.top,O.width,O.height);return B>this._visibleData.closestMouseDistance+4?!1:(this._visibleData.closestMouseDistance=Math.min(this._visibleData.closestMouseDistance,B),!0)}_setHoverData(R){var x;(x=this._visibleData)===null||x===void 0||x.disposables.dispose(),this._visibleData=R,this._hoverVisibleKey.set(!!R),this._hover.containerDomNode.classList.toggle("hidden",!R)}_updateFont(){const{fontSize:R,lineHeight:x}=this._editor.getOption(50),O=this._hover.contentsDomNode;O.style.fontSize=`${R}px`,O.style.lineHeight=`${x/R}`,Array.prototype.slice.call(this._hover.contentsDomNode.getElementsByClassName("code")).forEach(W=>this._editor.applyFontInfo(W))}_updateContent(R){const x=this._hover.contentsDomNode;x.style.paddingBottom="",x.textContent="",x.appendChild(R)}_layoutContentWidget(){this._editor.layoutContentWidget(this),this._hover.onContentsChanged()}_updateMaxDimensions(){const R=Math.max(this._editor.getLayoutInfo().height/4,250,l._lastDimensions.height),x=Math.max(this._editor.getLayoutInfo().width*.66,500,l._lastDimensions.width);this._setHoverWidgetMaxDimensions(x,R)}_render(R,x){this._setHoverData(x),this._updateFont(),this._updateContent(R),this._updateMaxDimensions(),this.onContentsChanged(),this._editor.render()}getPosition(){var R;return this._visibleData?{position:this._visibleData.showAtPosition,secondaryPosition:this._visibleData.showAtSecondaryPosition,positionAffinity:this._visibleData.isBeforeContent?3:void 0,preference:[(R=this._positionPreference)!==null&&R!==void 0?R:1]}:null}showAt(R,x){var O,B,W,V;if(!this._editor||!this._editor.hasModel())return;this._render(R,x);const K=L.getTotalHeight(this._hover.containerDomNode),F=x.showAtPosition;this._positionPreference=(O=this._findPositionPreference(K,F))!==null&&O!==void 0?O:1,this.onContentsChanged(),x.stoleFocus&&this._hover.containerDomNode.focus(),(B=x.colorPicker)===null||B===void 0||B.layout();const ie=this._hover.containerDomNode.ownerDocument.activeElement===this._hover.containerDomNode&&(0,k.getHoverAccessibleViewHint)(this._configurationService.getValue("accessibility.verbosity.hover")===!0&&this._accessibilityService.isScreenReaderOptimized(),(V=(W=this._keybindingService.lookupKeybinding("editor.action.accessibleView"))===null||W===void 0?void 0:W.getAriaLabel())!==null&&V!==void 0?V:"");ie&&(this._hover.contentsDomNode.ariaLabel=this._hover.contentsDomNode.textContent+", "+ie)}hide(){if(!this._visibleData)return;const R=this._visibleData.stoleFocus||this._hoverFocusedKey.get();this._setHoverData(void 0),this._resizableNode.maxSize=new L.Dimension(1/0,1/0),this._resizableNode.clearSashHoverState(),this._hoverFocusedKey.set(!1),this._editor.layoutContentWidget(this),R&&this._editor.focus()}_removeConstraintsRenderNormally(){const R=this._editor.getLayoutInfo();this._resizableNode.layout(R.height,R.width),this._setHoverWidgetDimensions("auto","auto")}_adjustHoverHeightForScrollbar(R){var x;const O=this._hover.containerDomNode,B=this._hover.contentsDomNode,W=(x=this._findMaximumRenderingHeight())!==null&&x!==void 0?x:1/0;this._setContainerDomNodeDimensions(L.getTotalWidth(O),Math.min(W,R)),this._setContentsDomNodeDimensions(L.getTotalWidth(B),Math.min(W,R-D))}setMinimumDimensions(R){this._minimumSize=new L.Dimension(Math.max(this._minimumSize.width,R.width),Math.max(this._minimumSize.height,R.height)),this._updateMinimumWidth()}_updateMinimumWidth(){const R=typeof this._contentWidth>"u"?this._minimumSize.width:Math.min(this._contentWidth,this._minimumSize.width);this._resizableNode.minSize=new L.Dimension(R,this._minimumSize.height)}onContentsChanged(){var R;this._removeConstraintsRenderNormally();const x=this._hover.containerDomNode;let O=L.getTotalHeight(x),B=L.getTotalWidth(x);if(this._resizableNode.layout(O,B),this._setHoverWidgetDimensions(B,O),O=L.getTotalHeight(x),B=L.getTotalWidth(x),this._contentWidth=B,this._updateMinimumWidth(),this._resizableNode.layout(O,B),this._hasHorizontalScrollbar()&&(this._adjustContentsBottomPadding(),this._adjustHoverHeightForScrollbar(O)),!((R=this._visibleData)===null||R===void 0)&&R.showAtPosition){const W=L.getTotalHeight(this._hover.containerDomNode);this._positionPreference=this._findPositionPreference(W,this._visibleData.showAtPosition)}this._layoutContentWidget()}focus(){this._hover.containerDomNode.focus()}scrollUp(){const R=this._hover.scrollbar.getScrollPosition().scrollTop,x=this._editor.getOption(50);this._hover.scrollbar.setScrollPosition({scrollTop:R-x.lineHeight})}scrollDown(){const R=this._hover.scrollbar.getScrollPosition().scrollTop,x=this._editor.getOption(50);this._hover.scrollbar.setScrollPosition({scrollTop:R+x.lineHeight})}scrollLeft(){const R=this._hover.scrollbar.getScrollPosition().scrollLeft;this._hover.scrollbar.setScrollPosition({scrollLeft:R-w})}scrollRight(){const R=this._hover.scrollbar.getScrollPosition().scrollLeft;this._hover.scrollbar.setScrollPosition({scrollLeft:R+w})}pageUp(){const R=this._hover.scrollbar.getScrollPosition().scrollTop,x=this._hover.scrollbar.getScrollDimensions().height;this._hover.scrollbar.setScrollPosition({scrollTop:R-x})}pageDown(){const R=this._hover.scrollbar.getScrollPosition().scrollTop,x=this._hover.scrollbar.getScrollDimensions().height;this._hover.scrollbar.setScrollPosition({scrollTop:R+x})}goToTop(){this._hover.scrollbar.setScrollPosition({scrollTop:0})}goToBottom(){this._hover.scrollbar.setScrollPosition({scrollTop:this._hover.scrollbar.getScrollDimensions().scrollHeight})}};e.ContentHoverWidget=T,T.ID="editor.contrib.resizableContentHoverWidget",T._lastDimensions=new L.Dimension(0,0),e.ContentHoverWidget=T=l=ke([ge(1,u.IContextKeyService),ge(2,c.IConfigurationService),ge(3,d.IAccessibilityService),ge(4,n.IKeybindingService)],T);let A=class extends E.Disposable{get hasContent(){return this._hasContent}constructor(R){super(),this._keybindingService=R,this._hasContent=!1,this.hoverElement=o("div.hover-row.status-bar"),this.actionsElement=L.append(this.hoverElement,o("div.actions"))}addAction(R){const x=this._keybindingService.lookupKeybinding(R.commandId),O=x?x.getLabel():null;return this._hasContent=!0,this._register(k.HoverAction.render(this.actionsElement,R,O))}append(R){const x=L.append(this.actionsElement,R);return this._hasContent=!0,x}};e.EditorHoverStatusBar=A,e.EditorHoverStatusBar=A=ke([ge(0,n.IKeybindingService)],A);class P{get anchor(){return this._anchor}set anchor(R){this._anchor=R}get shouldFocus(){return this._shouldFocus}set shouldFocus(R){this._shouldFocus=R}get source(){return this._source}set source(R){this._source=R}get insistOnKeepingHoverVisible(){return this._insistOnKeepingHoverVisible}set insistOnKeepingHoverVisible(R){this._insistOnKeepingHoverVisible=R}constructor(R,x){this._editor=R,this._participants=x,this._anchor=null,this._shouldFocus=!1,this._source=0,this._insistOnKeepingHoverVisible=!1}static _getLineDecorations(R,x){if(x.type!==1&&!x.supportsMarkerHover)return[];const O=R.getModel(),B=x.range.startLineNumber;if(B>O.getLineCount())return[];const W=O.getLineMaxColumn(B);return R.getLineDecorations(B).filter(V=>{if(V.options.isWholeLine)return!0;const K=V.range.startLineNumber===B?V.range.startColumn:1,F=V.range.endLineNumber===B?V.range.endColumn:W;if(V.options.showIfCollapsed){if(K>x.range.startColumn+1||x.range.endColumn-1>F)return!1}else if(K>x.range.startColumn||x.range.endColumn>F)return!1;return!0})}computeAsync(R){const x=this._anchor;if(!this._editor.hasModel()||!x)return t.AsyncIterableObject.EMPTY;const O=P._getLineDecorations(this._editor,x);return t.AsyncIterableObject.merge(this._participants.map(B=>B.computeAsync?B.computeAsync(x,O,R):t.AsyncIterableObject.EMPTY))}computeSync(){if(!this._editor.hasModel()||!this._anchor)return[];const R=P._getLineDecorations(this._editor,this._anchor);let x=[];for(const O of this._participants)x=x.concat(O.computeSync(this._anchor,R));return(0,y.coalesce)(x)}}function N(M,R,x,O,B,W){const V=x+B/2,K=O+W/2,F=Math.max(Math.abs(M-V)-B/2,0),q=Math.max(Math.abs(R-K)-W/2,0);return Math.sqrt(F*F+q*q)}}),define(se[899],oe([1,0,2,376,8,379,34,6,18,16,21,15,51,32,353,7,201]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";var u,f;Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneColorPickerWidget=e.StandaloneColorPickerController=void 0;let c=u=class extends L.Disposable{constructor(h,m,C,w,D,I,T){super(),this._editor=h,this._modelService=C,this._keybindingService=w,this._instantiationService=D,this._languageFeatureService=I,this._languageConfigurationService=T,this._standaloneColorPickerWidget=null,this._standaloneColorPickerVisible=b.EditorContextKeys.standaloneColorPickerVisible.bindTo(m),this._standaloneColorPickerFocused=b.EditorContextKeys.standaloneColorPickerFocused.bindTo(m)}showOrFocus(){var h;this._editor.hasModel()&&(this._standaloneColorPickerVisible.get()?this._standaloneColorPickerFocused.get()||(h=this._standaloneColorPickerWidget)===null||h===void 0||h.focus():this._standaloneColorPickerWidget=new l(this._editor,this._standaloneColorPickerVisible,this._standaloneColorPickerFocused,this._instantiationService,this._modelService,this._keybindingService,this._languageFeatureService,this._languageConfigurationService))}hide(){var h;this._standaloneColorPickerFocused.set(!1),this._standaloneColorPickerVisible.set(!1),(h=this._standaloneColorPickerWidget)===null||h===void 0||h.hide(),this._editor.focus()}insertColor(){var h;(h=this._standaloneColorPickerWidget)===null||h===void 0||h.updateEditor(),this.hide()}static get(h){return h.getContribution(u.ID)}};e.StandaloneColorPickerController=c,c.ID="editor.contrib.standaloneColorPickerController",e.StandaloneColorPickerController=c=u=ke([ge(1,a.IContextKeyService),ge(2,i.IModelService),ge(3,S.IKeybindingService),ge(4,y.IInstantiationService),ge(5,_.ILanguageFeaturesService),ge(6,n.ILanguageConfigurationService)],c),(0,v.registerEditorContribution)(c.ID,c,1);const d=8,s=22;let l=f=class extends L.Disposable{constructor(h,m,C,w,D,I,T,A){var P;super(),this._editor=h,this._standaloneColorPickerVisible=m,this._standaloneColorPickerFocused=C,this._modelService=D,this._keybindingService=I,this._languageFeaturesService=T,this._languageConfigurationService=A,this.allowEditorOverflow=!0,this._position=void 0,this._body=document.createElement("div"),this._colorHover=null,this._selectionSetInEditor=!1,this._onResult=this._register(new p.Emitter),this.onResult=this._onResult.event,this._standaloneColorPickerVisible.set(!0),this._standaloneColorPickerParticipant=w.createInstance(k.StandaloneColorPickerParticipant,this._editor),this._position=(P=this._editor._getViewModel())===null||P===void 0?void 0:P.getPrimaryCursorState().modelState.position;const N=this._editor.getSelection(),M=N?{startLineNumber:N.startLineNumber,startColumn:N.startColumn,endLineNumber:N.endLineNumber,endColumn:N.endColumn}:{startLineNumber:0,endLineNumber:0,endColumn:0,startColumn:0},R=this._register(r.trackFocus(this._body));this._register(R.onDidBlur(x=>{this.hide()})),this._register(R.onDidFocus(x=>{this.focus()})),this._register(this._editor.onDidChangeCursorPosition(()=>{this._selectionSetInEditor?this._selectionSetInEditor=!1:this.hide()})),this._register(this._editor.onMouseMove(x=>{var O;const B=(O=x.target.element)===null||O===void 0?void 0:O.classList;B&&B.contains("colorpicker-color-decoration")&&this.hide()})),this._register(this.onResult(x=>{this._render(x.value,x.foundInEditor)})),this._start(M),this._body.style.zIndex="50",this._editor.addContentWidget(this)}updateEditor(){this._colorHover&&this._standaloneColorPickerParticipant.updateEditorModel(this._colorHover)}getId(){return f.ID}getDomNode(){return this._body}getPosition(){if(!this._position)return null;const h=this._editor.getOption(60).above;return{position:this._position,secondaryPosition:this._position,preference:h?[1,2]:[2,1],positionAffinity:2}}hide(){this.dispose(),this._standaloneColorPickerVisible.set(!1),this._standaloneColorPickerFocused.set(!1),this._editor.removeContentWidget(this),this._editor.focus()}focus(){this._standaloneColorPickerFocused.set(!0),this._body.focus()}async _start(h){const m=await this._computeAsync(h);m&&this._onResult.fire(new o(m.result,m.foundInEditor))}async _computeAsync(h){if(!this._editor.hasModel())return null;const m={range:h,color:{red:0,green:0,blue:0,alpha:1}},C=await this._standaloneColorPickerParticipant.createColorHover(m,new t.DefaultDocumentColorProvider(this._modelService,this._languageConfigurationService),this._languageFeaturesService.colorProvider);return C?{result:C.colorHover,foundInEditor:C.foundInEditor}:null}_render(h,m){const C=document.createDocumentFragment(),w=this._register(new E.EditorHoverStatusBar(this._keybindingService));let D;const I={fragment:C,statusBar:w,setColorPicker:B=>D=B,onContentsChanged:()=>{},hide:()=>this.hide()};if(this._colorHover=h,this._register(this._standaloneColorPickerParticipant.renderHoverParts(I,[h])),D===void 0)return;this._body.classList.add("standalone-colorpicker-body"),this._body.style.maxHeight=Math.max(this._editor.getLayoutInfo().height/4,250)+"px",this._body.style.maxWidth=Math.max(this._editor.getLayoutInfo().width*.66,500)+"px",this._body.tabIndex=0,this._body.appendChild(C),D.layout();const T=D.body,A=T.saturationBox.domNode.clientWidth,P=T.domNode.clientWidth-A-s-d,N=D.body.enterButton;N?.onClicked(()=>{this.updateEditor(),this.hide()});const M=D.header,R=M.pickedColorNode;R.style.width=A+d+"px";const x=M.originalColorNode;x.style.width=P+"px";const O=D.header.closeButton;O?.onClicked(()=>{this.hide()}),m&&(N&&(N.button.textContent="Replace"),this._selectionSetInEditor=!0,this._editor.setSelection(h.range)),this._editor.layoutContentWidget(this)}};e.StandaloneColorPickerWidget=l,l.ID="editor.contrib.standaloneColorPickerWidget",e.StandaloneColorPickerWidget=l=f=ke([ge(3,y.IInstantiationService),ge(4,i.IModelService),ge(5,S.IKeybindingService),ge(6,_.ILanguageFeaturesService),ge(7,n.ILanguageConfigurationService)],l);class o{constructor(h,m){this.value=h,this.foundInEditor=m}}}),define(se[900],oe([1,0,16,662,899,21,30,201]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ShowOrFocusStandaloneColorPicker=void 0;class p extends L.EditorAction2{constructor(){super({id:"editor.action.showOrFocusStandaloneColorPicker",title:{value:(0,k.localize)(0,null),mnemonicTitle:(0,k.localize)(1,null),original:"Show or Focus Standalone Color Picker"},precondition:void 0,menu:[{id:S.MenuId.CommandPalette}]})}runEditorCommand(a,i){var n;(n=y.StandaloneColorPickerController.get(i))===null||n===void 0||n.showOrFocus()}}e.ShowOrFocusStandaloneColorPicker=p;class _ extends L.EditorAction{constructor(){super({id:"editor.action.hideColorPicker",label:(0,k.localize)(2,null),alias:"Hide the Color Picker",precondition:E.EditorContextKeys.standaloneColorPickerVisible.isEqualTo(!0),kbOpts:{primary:9,weight:100}})}run(a,i){var n;(n=y.StandaloneColorPickerController.get(i))===null||n===void 0||n.hide()}}class v extends L.EditorAction{constructor(){super({id:"editor.action.insertColorWithStandaloneColorPicker",label:(0,k.localize)(3,null),alias:"Insert Color with Standalone Color Picker",precondition:E.EditorContextKeys.standaloneColorPickerFocused.isEqualTo(!0),kbOpts:{primary:3,weight:100}})}run(a,i){var n;(n=y.StandaloneColorPickerController.get(i))===null||n===void 0||n.insertColor()}}(0,L.registerEditorAction)(_),(0,L.registerEditorAction)(v),(0,S.registerAction2)(p)}),define(se[901],oe([1,0,14,12,105,16,5,24,21,38,121,690,559,466]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";var n;Object.defineProperty(e,"__esModule",{value:!0});let t=n=class{static get(c){return c.getContribution(n.ID)}constructor(c,d){this.editor=c,this.editorWorkerService=d,this.decorations=this.editor.createDecorationsCollection()}dispose(){}run(c,d){var s;(s=this.currentRequest)===null||s===void 0||s.cancel();const l=this.editor.getSelection(),o=this.editor.getModel();if(!o||!l)return;let g=l;if(g.startLineNumber!==g.endLineNumber)return;const h=new y.EditorState(this.editor,5),m=o.uri;return this.editorWorkerService.canNavigateValueSet(m)?(this.currentRequest=(0,L.createCancelablePromise)(C=>this.editorWorkerService.navigateValueSet(m,g,d)),this.currentRequest.then(C=>{var w;if(!C||!C.range||!C.value||!h.validate(this.editor))return;const D=S.Range.lift(C.range);let I=C.range;const T=C.value.length-(g.endColumn-g.startColumn);I={startLineNumber:I.startLineNumber,startColumn:I.startColumn,endLineNumber:I.endLineNumber,endColumn:I.startColumn+C.value.length},T>1&&(g=new p.Selection(g.startLineNumber,g.startColumn,g.endLineNumber,g.endColumn+T-1));const A=new i.InPlaceReplaceCommand(D,g,C.value);this.editor.pushUndoStop(),this.editor.executeCommand(c,A),this.editor.pushUndoStop(),this.decorations.set([{range:I,options:n.DECORATION}]),(w=this.decorationRemover)===null||w===void 0||w.cancel(),this.decorationRemover=(0,L.timeout)(350),this.decorationRemover.then(()=>this.decorations.clear()).catch(k.onUnexpectedError)}).catch(k.onUnexpectedError)):Promise.resolve(void 0)}};t.ID="editor.contrib.inPlaceReplaceController",t.DECORATION=v.ModelDecorationOptions.register({description:"in-place-replace",className:"valueSetReplacement"}),t=n=ke([ge(1,b.IEditorWorkerService)],t);class r extends E.EditorAction{constructor(){super({id:"editor.action.inPlaceReplace.up",label:a.localize(0,null),alias:"Replace with Previous Value",precondition:_.EditorContextKeys.writable,kbOpts:{kbExpr:_.EditorContextKeys.editorTextFocus,primary:3159,weight:100}})}run(c,d){const s=t.get(d);return s?s.run(this.id,!1):Promise.resolve(void 0)}}class u extends E.EditorAction{constructor(){super({id:"editor.action.inPlaceReplace.down",label:a.localize(1,null),alias:"Replace with Next Value",precondition:_.EditorContextKeys.writable,kbOpts:{kbExpr:_.EditorContextKeys.editorTextFocus,primary:3161,weight:100}})}run(c,d){const s=t.get(d);return s?s.run(this.id,!0):Promise.resolve(void 0)}}(0,E.registerEditorContribution)(t.ID,t,4),(0,E.registerEditorAction)(r),(0,E.registerEditorAction)(u)}),define(se[262],oe([1,0,7,14,26,2,11,28,5,38,8,469]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineProgressManager=void 0;const a=v.ModelDecorationOptions.register({description:"inline-progress-widget",stickiness:1,showIfCollapsed:!0,after:{content:S.noBreakWhitespace,inlineClassName:"inline-editor-progress-decoration",inlineClassNameAffectsLetterSpacing:!0}});class i extends E.Disposable{constructor(r,u,f,c,d){super(),this.typeId=r,this.editor=u,this.range=f,this.delegate=d,this.allowEditorOverflow=!1,this.suppressMouseDown=!0,this.create(c),this.editor.addContentWidget(this),this.editor.layoutContentWidget(this)}create(r){this.domNode=L.$(".inline-progress-widget"),this.domNode.role="button",this.domNode.title=r;const u=L.$("span.icon");this.domNode.append(u),u.classList.add(...p.ThemeIcon.asClassNameArray(y.Codicon.loading),"codicon-modifier-spin");const f=()=>{const c=this.editor.getOption(66);this.domNode.style.height=`${c}px`,this.domNode.style.width=`${Math.ceil(.8*c)}px`};f(),this._register(this.editor.onDidChangeConfiguration(c=>{(c.hasChanged(52)||c.hasChanged(66))&&f()})),this._register(L.addDisposableListener(this.domNode,L.EventType.CLICK,c=>{this.delegate.cancel()}))}getId(){return i.baseId+"."+this.typeId}getDomNode(){return this.domNode}getPosition(){return{position:{lineNumber:this.range.startLineNumber,column:this.range.startColumn},preference:[0]}}dispose(){super.dispose(),this.editor.removeContentWidget(this)}}i.baseId="editor.widget.inlineProgressWidget";let n=class extends E.Disposable{constructor(r,u,f){super(),this.id=r,this._editor=u,this._instantiationService=f,this._showDelay=500,this._showPromise=this._register(new E.MutableDisposable),this._currentWidget=new E.MutableDisposable,this._operationIdPool=0,this._currentDecorations=u.createDecorationsCollection()}async showWhile(r,u,f){const c=this._operationIdPool++;this._currentOperation=c,this.clear(),this._showPromise.value=(0,k.disposableTimeout)(()=>{const d=_.Range.fromPositions(r);this._currentDecorations.set([{range:d,options:a}]).length>0&&(this._currentWidget.value=this._instantiationService.createInstance(i,this.id,this._editor,d,u,f))},this._showDelay);try{return await f}finally{this._currentOperation===c&&(this.clear(),this._currentOperation=void 0)}}clear(){this._showPromise.clear(),this._currentDecorations.clear(),this._currentWidget.clear()}};e.InlineProgressManager=n,e.InlineProgressManager=n=ke([ge(2,b.IInstantiationService)],n)}),define(se[380],oe([1,0,7,13,14,176,2,109,17,175,190,352,136,5,18,239,105,262,667,103,15,8,88,70,346,166]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m){"use strict";var C;Object.defineProperty(e,"__esModule",{value:!0}),e.CopyPasteController=e.pasteWidgetVisibleCtx=e.changePasteTypeCommandId=void 0,e.changePasteTypeCommandId="editor.changePasteType",e.pasteWidgetVisibleCtx=new s.RawContextKey("pasteWidgetVisible",!1,(0,c.localize)(0,null));const w="application/vnd.code.copyMetadata";let D=C=class extends S.Disposable{static get(A){return A.getContribution(C.ID)}constructor(A,P,N,M,R,x,O){super(),this._bulkEditService=N,this._clipboardService=M,this._languageFeaturesService=R,this._quickInputService=x,this._progressService=O,this._editor=A;const B=A.getContainerDomNode();this._register((0,L.addDisposableListener)(B,"copy",W=>this.handleCopy(W))),this._register((0,L.addDisposableListener)(B,"cut",W=>this.handleCopy(W))),this._register((0,L.addDisposableListener)(B,"paste",W=>this.handlePaste(W),!0)),this._pasteProgressManager=this._register(new f.InlineProgressManager("pasteIntoEditor",A,P)),this._postPasteWidgetManager=this._register(P.createInstance(h.PostEditWidgetManager,"pasteIntoEditor",A,e.pasteWidgetVisibleCtx,{id:e.changePasteTypeCommandId,label:(0,c.localize)(1,null)}))}changePasteType(){this._postPasteWidgetManager.tryShowSelector()}pasteAs(A){this._editor.focus();try{this._pasteAsActionContext={preferredId:A},(0,L.getActiveDocument)().execCommand("paste")}finally{this._pasteAsActionContext=void 0}}isPasteAsEnabled(){return this._editor.getOption(84).enabled&&!this._editor.getOption(90)}async finishedPaste(){await this._currentPasteOperation}handleCopy(A){var P,N;if(!this._editor.hasTextFocus()||(_.isWeb&&this._clipboardService.writeResources([]),!A.clipboardData||!this.isPasteAsEnabled()))return;const M=this._editor.getModel(),R=this._editor.getSelections();if(!M||!R?.length)return;const x=this._editor.getOption(37);let O=R;const B=R.length===1&&R[0].isEmpty();if(B){if(!x)return;O=[new n.Range(O[0].startLineNumber,1,O[0].startLineNumber,1+M.getLineLength(O[0].startLineNumber))]}const W=(P=this._editor._getViewModel())===null||P===void 0?void 0:P.getPlainTextToCopy(R,x,_.isWindows),K={multicursorText:Array.isArray(W)?W:null,pasteOnNewLine:B,mode:null},F=this._languageFeaturesService.documentPasteEditProvider.ordered(M).filter($=>!!$.prepareDocumentPaste);if(!F.length){this.setCopyMetadata(A.clipboardData,{defaultPastePayload:K});return}const q=(0,a.toVSDataTransfer)(A.clipboardData),ie=F.flatMap($=>{var J;return(J=$.copyMimeTypes)!==null&&J!==void 0?J:[]}),ae=(0,v.generateUuid)();this.setCopyMetadata(A.clipboardData,{id:ae,providerCopyMimeTypes:ie,defaultPastePayload:K});const ne=(0,y.createCancelablePromise)(async $=>{const J=(0,k.coalesce)(await Promise.all(F.map(async Q=>{try{return await Q.prepareDocumentPaste(M,O,q,$)}catch(re){console.error(re);return}})));J.reverse();for(const Q of J)for(const[re,de]of Q)q.replace(re,de);return q});(N=this._currentCopyOperation)===null||N===void 0||N.dataTransferPromise.cancel(),this._currentCopyOperation={handle:ae,dataTransferPromise:ne}}async handlePaste(A){var P,N,M,R,x;if(!A.clipboardData||!this._editor.hasTextFocus())return;(P=m.MessageController.get(this._editor))===null||P===void 0||P.closeMessage(),(N=this._currentPasteOperation)===null||N===void 0||N.cancel(),this._currentPasteOperation=void 0;const O=this._editor.getModel(),B=this._editor.getSelections();if(!B?.length||!O||!this.isPasteAsEnabled()&&!this._pasteAsActionContext)return;const W=this.fetchCopyMetadata(A),V=(0,a.toExternalVSDataTransfer)(A.clipboardData);V.delete(w);const K=[...A.clipboardData.types,...(M=W?.providerCopyMimeTypes)!==null&&M!==void 0?M:[],p.Mimes.uriList],F=this._languageFeaturesService.documentPasteEditProvider.ordered(O).filter(q=>{var ie,ae;return!((ie=this._pasteAsActionContext)===null||ie===void 0)&&ie.preferredId&&this._pasteAsActionContext.preferredId!==q.id?!1:(ae=q.pasteMimeTypes)===null||ae===void 0?void 0:ae.some(ne=>(0,E.matchesMimeType)(ne,K))});if(!F.length){!((R=this._pasteAsActionContext)===null||R===void 0)&&R.preferredId&&this.showPasteAsNoEditMessage(B,(x=this._pasteAsActionContext)===null||x===void 0?void 0:x.preferredId);return}A.preventDefault(),A.stopImmediatePropagation(),this._pasteAsActionContext?this.showPasteAsPick(this._pasteAsActionContext.preferredId,F,B,V,W,{trigger:"explicit",only:this._pasteAsActionContext.preferredId}):this.doPasteInline(F,B,V,W,{trigger:"implicit"})}showPasteAsNoEditMessage(A,P){var N;(N=m.MessageController.get(this._editor))===null||N===void 0||N.showMessage((0,c.localize)(2,null,P),A[0].getStartPosition())}doPasteInline(A,P,N,M,R){const x=(0,y.createCancelablePromise)(async O=>{const B=this._editor;if(!B.hasModel())return;const W=B.getModel(),V=new u.EditorStateCancellationTokenSource(B,3,void 0,O);try{if(await this.mergeInDataFromCopy(N,M,V.token),V.token.isCancellationRequested)return;const K=A.filter(q=>I(q,N));if(!K.length||K.length===1&&K[0].id==="text"){await this.applyDefaultPasteHandler(N,M,V.token);return}const F=await this.getPasteEdits(K,N,W,P,R,V.token);if(V.token.isCancellationRequested)return;if(F.length===1&&F[0].providerId==="text"){await this.applyDefaultPasteHandler(N,M,V.token);return}if(F.length){const q=B.getOption(84).showPasteSelector==="afterPaste";return this._postPasteWidgetManager.applyEditAndShowIfNeeded(P,{activeEditIndex:0,allEdits:F},q,V.token)}await this.applyDefaultPasteHandler(N,M,V.token)}finally{V.dispose(),this._currentPasteOperation===x&&(this._currentPasteOperation=void 0)}});this._pasteProgressManager.showWhile(P[0].getEndPosition(),(0,c.localize)(3,null),x),this._currentPasteOperation=x}showPasteAsPick(A,P,N,M,R,x){const O=(0,y.createCancelablePromise)(async B=>{const W=this._editor;if(!W.hasModel())return;const V=W.getModel(),K=new u.EditorStateCancellationTokenSource(W,3,void 0,B);try{if(await this.mergeInDataFromCopy(M,R,K.token),K.token.isCancellationRequested)return;let F=P.filter(ne=>I(ne,M));A&&(F=F.filter(ne=>ne.id===A));const q=await this.getPasteEdits(F,M,V,N,x,K.token);if(K.token.isCancellationRequested)return;if(!q.length){x.only&&this.showPasteAsNoEditMessage(N,x.only);return}let ie;if(A)ie=q.at(0);else{const ne=await this._quickInputService.pick(q.map($=>({label:$.label,description:$.providerId,detail:$.detail,edit:$})),{placeHolder:(0,c.localize)(4,null)});ie=ne?.edit}if(!ie)return;const ae=(0,r.createCombinedWorkspaceEdit)(V.uri,N,ie);await this._bulkEditService.apply(ae,{editor:this._editor})}finally{K.dispose(),this._currentPasteOperation===O&&(this._currentPasteOperation=void 0)}});this._progressService.withProgress({location:10,title:(0,c.localize)(5,null)},()=>O)}setCopyMetadata(A,P){A.setData(w,JSON.stringify(P))}fetchCopyMetadata(A){var P;if(!A.clipboardData)return;const N=A.clipboardData.getData(w);if(N)try{return JSON.parse(N)}catch{return}const[M,R]=b.ClipboardEventUtils.getTextData(A.clipboardData);if(R)return{defaultPastePayload:{mode:R.mode,multicursorText:(P=R.multicursorText)!==null&&P!==void 0?P:null,pasteOnNewLine:!!R.isFromEmptySelection}}}async mergeInDataFromCopy(A,P,N){var M;if(P?.id&&((M=this._currentCopyOperation)===null||M===void 0?void 0:M.handle)===P.id){const R=await this._currentCopyOperation.dataTransferPromise;if(N.isCancellationRequested)return;for(const[x,O]of R)A.replace(x,O)}if(!A.has(p.Mimes.uriList)){const R=await this._clipboardService.readResources();if(N.isCancellationRequested)return;R.length&&A.append(p.Mimes.uriList,(0,E.createStringDataTransferItem)(E.UriList.create(R)))}}async getPasteEdits(A,P,N,M,R,x){const O=await(0,y.raceCancellation)(Promise.all(A.map(async W=>{var V;try{const K=await((V=W.provideDocumentPasteEdits)===null||V===void 0?void 0:V.call(W,N,M,P,R,x));if(K)return{...K,providerId:W.id}}catch(K){console.error(K)}})),x),B=(0,k.coalesce)(O??[]);return(0,r.sortEditsByYieldTo)(B)}async applyDefaultPasteHandler(A,P,N){var M,R,x;const O=(M=A.get(p.Mimes.text))!==null&&M!==void 0?M:A.get("text");if(!O)return;const B=await O.asString();if(N.isCancellationRequested)return;const W={text:B,pasteOnNewLine:(R=P?.defaultPastePayload.pasteOnNewLine)!==null&&R!==void 0?R:!1,multicursorText:(x=P?.defaultPastePayload.multicursorText)!==null&&x!==void 0?x:null,mode:null};this._editor.trigger("keyboard","paste",W)}};e.CopyPasteController=D,D.ID="editor.contrib.copyPasteActionController",e.CopyPasteController=D=C=ke([ge(1,l.IInstantiationService),ge(2,i.IBulkEditService),ge(3,d.IClipboardService),ge(4,t.ILanguageFeaturesService),ge(5,g.IQuickInputService),ge(6,o.IProgressService)],D);function I(T,A){var P;return!!(!((P=T.pasteMimeTypes)===null||P===void 0)&&P.some(N=>A.matches(N)))}}),define(se[902],oe([1,0,54,7,17,190,16,33,21,380,653,30,103,15]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PasteAction=e.CopyAction=e.CutAction=void 0;const t="9_cutcopypaste",r=y.isNative||document.queryCommandSupported("cut"),u=y.isNative||document.queryCommandSupported("copy"),f=typeof navigator.clipboard>"u"||L.isFirefox?document.queryCommandSupported("paste"):!0;function c(l){return l.register(),l}e.CutAction=r?c(new S.MultiCommand({id:"editor.action.clipboardCutAction",precondition:void 0,kbOpts:y.isNative?{primary:2102,win:{primary:2102,secondary:[1044]},weight:100}:void 0,menuOpts:[{menuId:a.MenuId.MenubarEditMenu,group:"2_ccp",title:b.localize(0,null),order:1},{menuId:a.MenuId.EditorContext,group:t,title:b.localize(1,null),when:_.EditorContextKeys.writable,order:1},{menuId:a.MenuId.CommandPalette,group:"",title:b.localize(2,null),order:1},{menuId:a.MenuId.SimpleEditorContext,group:t,title:b.localize(3,null),when:_.EditorContextKeys.writable,order:1}]})):void 0,e.CopyAction=u?c(new S.MultiCommand({id:"editor.action.clipboardCopyAction",precondition:void 0,kbOpts:y.isNative?{primary:2081,win:{primary:2081,secondary:[2067]},weight:100}:void 0,menuOpts:[{menuId:a.MenuId.MenubarEditMenu,group:"2_ccp",title:b.localize(4,null),order:2},{menuId:a.MenuId.EditorContext,group:t,title:b.localize(5,null),order:2},{menuId:a.MenuId.CommandPalette,group:"",title:b.localize(6,null),order:1},{menuId:a.MenuId.SimpleEditorContext,group:t,title:b.localize(7,null),order:2}]})):void 0,a.MenuRegistry.appendMenuItem(a.MenuId.MenubarEditMenu,{submenu:a.MenuId.MenubarCopy,title:{value:b.localize(8,null),original:"Copy As"},group:"2_ccp",order:3}),a.MenuRegistry.appendMenuItem(a.MenuId.EditorContext,{submenu:a.MenuId.EditorContextCopy,title:{value:b.localize(9,null),original:"Copy As"},group:t,order:3}),a.MenuRegistry.appendMenuItem(a.MenuId.EditorContext,{submenu:a.MenuId.EditorContextShare,title:{value:b.localize(10,null),original:"Share"},group:"11_share",order:-1,when:n.ContextKeyExpr.and(n.ContextKeyExpr.notEquals("resourceScheme","output"),_.EditorContextKeys.editorTextFocus)}),a.MenuRegistry.appendMenuItem(a.MenuId.EditorTitleContext,{submenu:a.MenuId.EditorTitleContextShare,title:{value:b.localize(11,null),original:"Share"},group:"11_share",order:-1}),a.MenuRegistry.appendMenuItem(a.MenuId.ExplorerContext,{submenu:a.MenuId.ExplorerContextShare,title:{value:b.localize(12,null),original:"Share"},group:"11_share",order:-1}),e.PasteAction=f?c(new S.MultiCommand({id:"editor.action.clipboardPasteAction",precondition:void 0,kbOpts:y.isNative?{primary:2100,win:{primary:2100,secondary:[1043]},linux:{primary:2100,secondary:[1043]},weight:100}:void 0,menuOpts:[{menuId:a.MenuId.MenubarEditMenu,group:"2_ccp",title:b.localize(13,null),order:4},{menuId:a.MenuId.EditorContext,group:t,title:b.localize(14,null),when:_.EditorContextKeys.writable,order:4},{menuId:a.MenuId.CommandPalette,group:"",title:b.localize(15,null),order:1},{menuId:a.MenuId.SimpleEditorContext,group:t,title:b.localize(16,null),when:_.EditorContextKeys.writable,order:4}]})):void 0;class d extends S.EditorAction{constructor(){super({id:"editor.action.clipboardCopyWithSyntaxHighlightingAction",label:b.localize(17,null),alias:"Copy With Syntax Highlighting",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.textInputFocus,primary:0,weight:100}})}run(o,g){!g.hasModel()||!g.getOption(37)&&g.getSelection().isEmpty()||(E.CopyOptions.forceCopyWithSyntaxHighlighting=!0,g.focus(),g.getContainerDomNode().ownerDocument.execCommand("copy"),E.CopyOptions.forceCopyWithSyntaxHighlighting=!1)}}function s(l,o){l&&(l.addImplementation(1e4,"code-editor",(g,h)=>{const m=g.get(p.ICodeEditorService).getFocusedCodeEditor();if(m&&m.hasTextFocus()){const C=m.getOption(37),w=m.getSelection();return w&&w.isEmpty()&&!C||m.getContainerDomNode().ownerDocument.execCommand(o),!0}return!1}),l.addImplementation(0,"generic-dom",(g,h)=>((0,k.getActiveDocument)().execCommand(o),!0)))}s(e.CutAction,"cut"),s(e.CopyAction,"copy"),e.PasteAction&&(e.PasteAction.addImplementation(1e4,"code-editor",(l,o)=>{var g,h;const m=l.get(p.ICodeEditorService),C=l.get(i.IClipboardService),w=m.getFocusedCodeEditor();return w&&w.hasTextFocus()?w.getContainerDomNode().ownerDocument.execCommand("paste")?(h=(g=v.CopyPasteController.get(w))===null||g===void 0?void 0:g.finishedPaste())!==null&&h!==void 0?h:Promise.resolve():y.isWeb?(async()=>{const I=await C.readText();if(I!==""){const T=E.InMemoryClipboardMetadataManager.INSTANCE.get(I);let A=!1,P=null,N=null;T&&(A=w.getOption(37)&&!!T.isFromEmptySelection,P=typeof T.multicursorText<"u"?T.multicursorText:null,N=T.mode),w.trigger("keyboard","paste",{text:I,pasteOnNewLine:A,multicursorText:P,mode:N})}})():!0:!1}),e.PasteAction.addImplementation(0,"generic-dom",(l,o)=>((0,k.getActiveDocument)().execCommand("paste"),!0))),u&&(0,S.registerEditorAction)(d)}),define(se[903],oe([1,0,13,14,176,2,352,5,18,295,764,105,262,670,27,15,351,8,239,346]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d){"use strict";var s;Object.defineProperty(e,"__esModule",{value:!0}),e.DropIntoEditorController=e.dropWidgetVisibleCtx=e.changeDropTypeCommandId=e.defaultProviderConfig=void 0,e.defaultProviderConfig="editor.experimental.dropIntoEditor.defaultProvider",e.changeDropTypeCommandId="editor.changeDropType",e.dropWidgetVisibleCtx=new r.RawContextKey("dropWidgetVisible",!1,(0,n.localize)(0,null));let l=s=class extends E.Disposable{static get(g){return g.getContribution(s.ID)}constructor(g,h,m,C,w){super(),this._configService=m,this._languageFeaturesService=C,this._treeViewsDragAndDropService=w,this.treeItemsTransfer=u.LocalSelectionTransfer.getInstance(),this._dropProgressManager=this._register(h.createInstance(i.InlineProgressManager,"dropIntoEditor",g)),this._postDropWidgetManager=this._register(h.createInstance(d.PostEditWidgetManager,"dropIntoEditor",g,e.dropWidgetVisibleCtx,{id:e.changeDropTypeCommandId,label:(0,n.localize)(1,null)})),this._register(g.onDropIntoEditor(D=>this.onDropIntoEditor(g,D.position,D.event)))}changeDropType(){this._postDropWidgetManager.tryShowSelector()}async onDropIntoEditor(g,h,m){var C;if(!m.dataTransfer||!g.hasModel())return;(C=this._currentOperation)===null||C===void 0||C.cancel(),g.focus(),g.setPosition(h);const w=(0,k.createCancelablePromise)(async D=>{const I=new a.EditorStateCancellationTokenSource(g,1,void 0,D);try{const T=await this.extractDataTransferData(m);if(T.size===0||I.token.isCancellationRequested)return;const A=g.getModel();if(!A)return;const P=this._languageFeaturesService.documentOnDropEditProvider.ordered(A).filter(M=>M.dropMimeTypes?M.dropMimeTypes.some(R=>T.matches(R)):!0),N=await this.getDropEdits(P,A,h,T,I);if(I.token.isCancellationRequested)return;if(N.length){const M=this.getInitialActiveEditIndex(A,N),R=g.getOption(36).showDropSelector==="afterDrop";await this._postDropWidgetManager.applyEditAndShowIfNeeded([p.Range.fromPositions(h)],{activeEditIndex:M,allEdits:N},R,D)}}finally{I.dispose(),this._currentOperation===w&&(this._currentOperation=void 0)}});this._dropProgressManager.showWhile(h,(0,n.localize)(2,null),w),this._currentOperation=w}async getDropEdits(g,h,m,C,w){const D=await(0,k.raceCancellation)(Promise.all(g.map(async T=>{try{const A=await T.provideDocumentOnDropEdits(h,m,C,w.token);if(A)return{...A,providerId:T.id}}catch(A){console.error(A)}})),w.token),I=(0,L.coalesce)(D??[]);return(0,c.sortEditsByYieldTo)(I)}getInitialActiveEditIndex(g,h){const m=this._configService.getValue(e.defaultProviderConfig,{resource:g.uri});for(const[C,w]of Object.entries(m)){const D=h.findIndex(I=>w===I.providerId&&I.handledMimeType&&(0,y.matchesMimeType)(C,[I.handledMimeType]));if(D>=0)return D}return 0}async extractDataTransferData(g){if(!g.dataTransfer)return new y.VSDataTransfer;const h=(0,S.toExternalVSDataTransfer)(g.dataTransfer);if(this.treeItemsTransfer.hasData(v.DraggedTreeItemsIdentifier.prototype)){const m=this.treeItemsTransfer.getData(v.DraggedTreeItemsIdentifier.prototype);if(Array.isArray(m))for(const C of m){const w=await this._treeViewsDragAndDropService.removeDragOperationTransfer(C.identifier);if(w)for(const[D,I]of w)h.replace(D,I)}}return h}};e.DropIntoEditorController=l,l.ID="editor.contrib.dropIntoEditorController",e.DropIntoEditorController=l=s=ke([ge(1,f.IInstantiationService),ge(2,t.IConfigurationService),ge(3,_.ILanguageFeaturesService),ge(4,b.ITreeViewsDnDService)],l)}),define(se[904],oe([1,0,13,14,19,39,12,6,2,11,22,16,33,10,5,21,38,32,700,15,18,29,79,61,470]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g){"use strict";var h;Object.defineProperty(e,"__esModule",{value:!0}),e.editorLinkedEditingBackground=e.LinkedEditingAction=e.LinkedEditingContribution=e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE=void 0,e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE=new d.RawContextKey("LinkedEditingInputVisible",!1);const m="linked-editing-decoration";let C=h=class extends _.Disposable{static get(A){return A.getContribution(h.ID)}constructor(A,P,N,M,R){super(),this.languageConfigurationService=M,this._syncRangesToken=0,this._localToDispose=this._register(new _.DisposableStore),this._editor=A,this._providers=N.linkedEditingRangeProvider,this._enabled=!1,this._visibleContextKey=e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE.bindTo(P),this._debounceInformation=R.for(this._providers,"Linked Editing",{max:200}),this._currentDecorations=this._editor.createDecorationsCollection(),this._languageWordPattern=null,this._currentWordPattern=null,this._ignoreChangeEvent=!1,this._localToDispose=this._register(new _.DisposableStore),this._rangeUpdateTriggerPromise=null,this._rangeSyncTriggerPromise=null,this._currentRequestCts=null,this._currentRequestPosition=null,this._currentRequestModelVersion=null,this._register(this._editor.onDidChangeModel(()=>this.reinitialize(!0))),this._register(this._editor.onDidChangeConfiguration(x=>{(x.hasChanged(69)||x.hasChanged(92))&&this.reinitialize(!1)})),this._register(this._providers.onDidChange(()=>this.reinitialize(!1))),this._register(this._editor.onDidChangeModelLanguage(()=>this.reinitialize(!0))),this.reinitialize(!0)}reinitialize(A){const P=this._editor.getModel(),N=P!==null&&(this._editor.getOption(69)||this._editor.getOption(92))&&this._providers.has(P);if(N===this._enabled&&!A||(this._enabled=N,this.clearRanges(),this._localToDispose.clear(),!N||P===null))return;this._localToDispose.add(p.Event.runAndSubscribe(P.onDidChangeLanguageConfiguration,()=>{this._languageWordPattern=this.languageConfigurationService.getLanguageConfiguration(P.getLanguageId()).getWordDefinition()}));const M=new k.Delayer(this._debounceInformation.get(P)),R=()=>{var B;this._rangeUpdateTriggerPromise=M.trigger(()=>this.updateRanges(),(B=this._debounceDuration)!==null&&B!==void 0?B:this._debounceInformation.get(P))},x=new k.Delayer(0),O=B=>{this._rangeSyncTriggerPromise=x.trigger(()=>this._syncRanges(B))};this._localToDispose.add(this._editor.onDidChangeCursorPosition(()=>{R()})),this._localToDispose.add(this._editor.onDidChangeModelContent(B=>{if(!this._ignoreChangeEvent&&this._currentDecorations.length>0){const W=this._currentDecorations.getRange(0);if(W&&B.changes.every(V=>W.intersectRanges(V.range))){O(this._syncRangesToken);return}}R()})),this._localToDispose.add({dispose:()=>{M.dispose(),x.dispose()}}),this.updateRanges()}_syncRanges(A){if(!this._editor.hasModel()||A!==this._syncRangesToken||this._currentDecorations.length===0)return;const P=this._editor.getModel(),N=this._currentDecorations.getRange(0);if(!N||N.startLineNumber!==N.endLineNumber)return this.clearRanges();const M=P.getValueInRange(N);if(this._currentWordPattern){const x=M.match(this._currentWordPattern);if((x?x[0].length:0)!==M.length)return this.clearRanges()}const R=[];for(let x=1,O=this._currentDecorations.length;x<O;x++){const B=this._currentDecorations.getRange(x);if(B)if(B.startLineNumber!==B.endLineNumber)R.push({range:B,text:M});else{let W=P.getValueInRange(B),V=M,K=B.startColumn,F=B.endColumn;const q=v.commonPrefixLength(W,V);K+=q,W=W.substr(q),V=V.substr(q);const ie=v.commonSuffixLength(W,V);F-=ie,W=W.substr(0,W.length-ie),V=V.substr(0,V.length-ie),(K!==F||V.length!==0)&&R.push({range:new t.Range(B.startLineNumber,K,B.endLineNumber,F),text:V})}}if(R.length!==0)try{this._editor.popUndoStop(),this._ignoreChangeEvent=!0;const x=this._editor._getViewModel().getPrevEditOperationType();this._editor.executeEdits("linkedEditing",R),this._editor._getViewModel().setPrevEditOperationType(x)}finally{this._ignoreChangeEvent=!1}}dispose(){this.clearRanges(),super.dispose()}clearRanges(){this._visibleContextKey.set(!1),this._currentDecorations.clear(),this._currentRequestCts&&(this._currentRequestCts.cancel(),this._currentRequestCts=null,this._currentRequestPosition=null)}async updateRanges(A=!1){if(!this._editor.hasModel()){this.clearRanges();return}const P=this._editor.getPosition();if(!this._enabled&&!A||this._editor.getSelections().length>1){this.clearRanges();return}const N=this._editor.getModel(),M=N.getVersionId();if(this._currentRequestPosition&&this._currentRequestModelVersion===M){if(P.equals(this._currentRequestPosition))return;if(this._currentDecorations.length>0){const x=this._currentDecorations.getRange(0);if(x&&x.containsPosition(P))return}}this.clearRanges(),this._currentRequestPosition=P,this._currentRequestModelVersion=M;const R=this._currentRequestCts=new y.CancellationTokenSource;try{const x=new g.StopWatch(!1),O=await I(this._providers,N,P,R.token);if(this._debounceInformation.update(N,x.elapsed()),R!==this._currentRequestCts||(this._currentRequestCts=null,M!==N.getVersionId()))return;let B=[];O?.ranges&&(B=O.ranges),this._currentWordPattern=O?.wordPattern||this._languageWordPattern;let W=!1;for(let K=0,F=B.length;K<F;K++)if(t.Range.containsPosition(B[K],P)){if(W=!0,K!==0){const q=B[K];B.splice(K,1),B.unshift(q)}break}if(!W){this.clearRanges();return}const V=B.map(K=>({range:K,options:h.DECORATION}));this._visibleContextKey.set(!0),this._currentDecorations.set(V),this._syncRangesToken++}catch(x){(0,S.isCancellationError)(x)||(0,S.onUnexpectedError)(x),(this._currentRequestCts===R||!this._currentRequestCts)&&this.clearRanges()}}};e.LinkedEditingContribution=C,C.ID="editor.contrib.linkedEditing",C.DECORATION=u.ModelDecorationOptions.register({description:"linked-editing",stickiness:0,className:m}),e.LinkedEditingContribution=C=h=ke([ge(1,d.IContextKeyService),ge(2,s.ILanguageFeaturesService),ge(3,f.ILanguageConfigurationService),ge(4,o.ILanguageFeatureDebounceService)],C);class w extends a.EditorAction{constructor(){super({id:"editor.action.linkedEditing",label:c.localize(0,null),alias:"Start Linked Editing",precondition:d.ContextKeyExpr.and(r.EditorContextKeys.writable,r.EditorContextKeys.hasRenameProvider),kbOpts:{kbExpr:r.EditorContextKeys.editorTextFocus,primary:3132,weight:100}})}runCommand(A,P){const N=A.get(i.ICodeEditorService),[M,R]=Array.isArray(P)&&P||[void 0,void 0];return b.URI.isUri(M)&&n.Position.isIPosition(R)?N.openCodeEditor({resource:M},N.getActiveCodeEditor()).then(x=>{x&&(x.setPosition(R),x.invokeWithinContext(O=>(this.reportTelemetry(O,x),this.run(O,x))))},S.onUnexpectedError):super.runCommand(A,P)}run(A,P){const N=C.get(P);return N?Promise.resolve(N.updateRanges(!0)):Promise.resolve()}}e.LinkedEditingAction=w;const D=a.EditorCommand.bindToContribution(C.get);(0,a.registerEditorCommand)(new D({id:"cancelLinkedEditingInput",precondition:e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE,handler:T=>T.clearRanges(),kbOpts:{kbExpr:r.EditorContextKeys.editorTextFocus,weight:100+99,primary:9,secondary:[1033]}}));function I(T,A,P,N){const M=T.ordered(A);return(0,k.first)(M.map(R=>async()=>{try{return await R.provideLinkedEditingRanges(A,P,N)}catch(x){(0,S.onUnexpectedExternalError)(x);return}}),R=>!!R&&L.isNonEmptyArray(R?.ranges))}e.editorLinkedEditingBackground=(0,l.registerColor)("editor.linkedEditingBackground",{dark:E.Color.fromHex("#f00").transparent(.3),light:E.Color.fromHex("#f00").transparent(.3),hcDark:E.Color.fromHex("#f00").transparent(.3),hcLight:E.Color.white},c.localize(1,null)),(0,a.registerModelAndPositionCommand)("_executeLinkedEditingProvider",(T,A,P)=>{const{linkedEditingRangeProvider:N}=T.get(s.ILanguageFeaturesService);return I(N,A,P,y.CancellationToken.None)}),(0,a.registerEditorContribution)(C.ID,C,1),(0,a.registerEditorAction)(w)}),define(se[905],oe([1,0,14,19,12,58,2,47,17,49,61,22,16,38,79,18,188,766,701,50,57,471]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s){"use strict";var l;Object.defineProperty(e,"__esModule",{value:!0}),e.LinkDetector=void 0;let o=l=class extends S.Disposable{static get(D){return D.getContribution(l.ID)}constructor(D,I,T,A,P){super(),this.editor=D,this.openerService=I,this.notificationService=T,this.languageFeaturesService=A,this.providers=this.languageFeaturesService.linkProvider,this.debounceInformation=P.for(this.providers,"Links",{min:1e3,max:4e3}),this.computeLinks=this._register(new L.RunOnceScheduler(()=>this.computeLinksNow(),1e3)),this.computePromise=null,this.activeLinksList=null,this.currentOccurrences={},this.activeLinkDecorationId=null;const N=this._register(new u.ClickLinkGesture(D));this._register(N.onMouseMoveOrRelevantKeyDown(([M,R])=>{this._onEditorMouseMove(M,R)})),this._register(N.onExecute(M=>{this.onEditorMouseUp(M)})),this._register(N.onCancel(M=>{this.cleanUpActiveLinkDecoration()})),this._register(D.onDidChangeConfiguration(M=>{M.hasChanged(70)&&(this.updateDecorations([]),this.stop(),this.computeLinks.schedule(0))})),this._register(D.onDidChangeModelContent(M=>{this.editor.hasModel()&&this.computeLinks.schedule(this.debounceInformation.get(this.editor.getModel()))})),this._register(D.onDidChangeModel(M=>{this.currentOccurrences={},this.activeLinkDecorationId=null,this.stop(),this.computeLinks.schedule(0)})),this._register(D.onDidChangeModelLanguage(M=>{this.stop(),this.computeLinks.schedule(0)})),this._register(this.providers.onDidChange(M=>{this.stop(),this.computeLinks.schedule(0)})),this.computeLinks.schedule(0)}async computeLinksNow(){if(!this.editor.hasModel()||!this.editor.getOption(70))return;const D=this.editor.getModel();if(!D.isTooLargeForSyncing()&&this.providers.has(D)){this.activeLinksList&&(this.activeLinksList.dispose(),this.activeLinksList=null),this.computePromise=(0,L.createCancelablePromise)(I=>(0,f.getLinks)(this.providers,D,I));try{const I=new b.StopWatch(!1);if(this.activeLinksList=await this.computePromise,this.debounceInformation.update(D,I.elapsed()),D.isDisposed())return;this.updateDecorations(this.activeLinksList.links)}catch(I){(0,y.onUnexpectedError)(I)}finally{this.computePromise=null}}}updateDecorations(D){const I=this.editor.getOption(77)==="altKey",T=[],A=Object.keys(this.currentOccurrences);for(const N of A){const M=this.currentOccurrences[N];T.push(M.decorationId)}const P=[];if(D)for(const N of D)P.push(h.decoration(N,I));this.editor.changeDecorations(N=>{const M=N.deltaDecorations(T,P);this.currentOccurrences={},this.activeLinkDecorationId=null;for(let R=0,x=M.length;R<x;R++){const O=new h(D[R],M[R]);this.currentOccurrences[O.decorationId]=O}})}_onEditorMouseMove(D,I){const T=this.editor.getOption(77)==="altKey";if(this.isEnabled(D,I)){this.cleanUpActiveLinkDecoration();const A=this.getLinkOccurrence(D.target.position);A&&this.editor.changeDecorations(P=>{A.activate(P,T),this.activeLinkDecorationId=A.decorationId})}else this.cleanUpActiveLinkDecoration()}cleanUpActiveLinkDecoration(){const D=this.editor.getOption(77)==="altKey";if(this.activeLinkDecorationId){const I=this.currentOccurrences[this.activeLinkDecorationId];I&&this.editor.changeDecorations(T=>{I.deactivate(T,D)}),this.activeLinkDecorationId=null}}onEditorMouseUp(D){if(!this.isEnabled(D))return;const I=this.getLinkOccurrence(D.target.position);I&&this.openLinkOccurrence(I,D.hasSideBySideModifier,!0)}openLinkOccurrence(D,I,T=!1){if(!this.openerService)return;const{link:A}=D;A.resolve(k.CancellationToken.None).then(P=>{if(typeof P=="string"&&this.editor.hasModel()){const N=this.editor.getModel().uri;if(N.scheme===p.Schemas.file&&P.startsWith(`${p.Schemas.file}:`)){const M=a.URI.parse(P);if(M.scheme===p.Schemas.file){const R=v.originalFSPath(M);let x=null;R.startsWith("/./")?x=`.${R.substr(1)}`:R.startsWith("//./")&&(x=`.${R.substr(2)}`),x&&(P=v.joinPath(N,x))}}}return this.openerService.open(P,{openToSide:I,fromUserGesture:T,allowContributedOpeners:!0,allowCommands:!0,fromWorkspace:!0})},P=>{const N=P instanceof Error?P.message:P;N==="invalid"?this.notificationService.warn(c.localize(0,null,A.url.toString())):N==="missing"?this.notificationService.warn(c.localize(1,null)):(0,y.onUnexpectedError)(P)})}getLinkOccurrence(D){if(!this.editor.hasModel()||!D)return null;const I=this.editor.getModel().getDecorationsInRange({startLineNumber:D.lineNumber,startColumn:D.column,endLineNumber:D.lineNumber,endColumn:D.column},0,!0);for(const T of I){const A=this.currentOccurrences[T.id];if(A)return A}return null}isEnabled(D,I){return!!(D.target.type===6&&(D.hasTriggerModifier||I&&I.keyCodeIsTriggerKey))}stop(){var D;this.computeLinks.cancel(),this.activeLinksList&&((D=this.activeLinksList)===null||D===void 0||D.dispose(),this.activeLinksList=null),this.computePromise&&(this.computePromise.cancel(),this.computePromise=null)}dispose(){super.dispose(),this.stop()}};e.LinkDetector=o,o.ID="editor.linkDetector",e.LinkDetector=o=l=ke([ge(1,s.IOpenerService),ge(2,d.INotificationService),ge(3,r.ILanguageFeaturesService),ge(4,t.ILanguageFeatureDebounceService)],o);const g={general:n.ModelDecorationOptions.register({description:"detected-link",stickiness:1,collapseOnReplaceEdit:!0,inlineClassName:"detected-link"}),active:n.ModelDecorationOptions.register({description:"detected-link-active",stickiness:1,collapseOnReplaceEdit:!0,inlineClassName:"detected-link-active"})};class h{static decoration(D,I){return{range:D.range,options:h._getOptions(D,I,!1)}}static _getOptions(D,I,T){const A={...T?g.active:g.general};return A.hoverMessage=m(D,I),A}constructor(D,I){this.link=D,this.decorationId=I}activate(D,I){D.changeDecorationOptions(this.decorationId,h._getOptions(this.link,I,!0))}deactivate(D,I){D.changeDecorationOptions(this.decorationId,h._getOptions(this.link,I,!1))}}function m(w,D){const I=w.url&&/^command:/i.test(w.url.toString()),T=w.tooltip?w.tooltip:I?c.localize(2,null):c.localize(3,null),A=D?_.isMacintosh?c.localize(4,null):c.localize(5,null):_.isMacintosh?c.localize(6,null):c.localize(7,null);if(w.url){let P="";if(/^command:/i.test(w.url.toString())){const M=w.url.toString().match(/^command:([^?#]+)/);if(M){const R=M[1];P=c.localize(8,null,R)}}return new E.MarkdownString("",!0).appendLink(w.url.toString(!0).replace(/ /g,"%20"),T,P).appendMarkdown(` (${A})`)}else return new E.MarkdownString().appendText(`${T} (${A})`)}class C extends i.EditorAction{constructor(){super({id:"editor.action.openLink",label:c.localize(9,null),alias:"Open Link",precondition:void 0})}run(D,I){const T=o.get(I);if(!T||!I.hasModel())return;const A=I.getSelections();for(const P of A){const N=T.getLinkOccurrence(P.getEndPosition());N&&T.openLinkOccurrence(N,!1)}}}(0,i.registerEditorContribution)(o.ID,o,1),(0,i.registerEditorAction)(C)}),define(se[906],oe([1,0,2,18,165,14,261,304,303,32,12,310,52]),function(te,e,L,k,y,E,S,p,_,v,b,a,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StickyModelProvider=void 0;var n;(function(l){l.OUTLINE_MODEL="outlineModel",l.FOLDING_PROVIDER_MODEL="foldingProviderModel",l.INDENTATION_MODEL="indentationModel"})(n||(n={}));var t;(function(l){l[l.VALID=0]="VALID",l[l.INVALID=1]="INVALID",l[l.CANCELED=2]="CANCELED"})(t||(t={}));let r=class extends L.Disposable{constructor(o,g,h,m){super(),this._editor=o,this._languageConfigurationService=g,this._languageFeaturesService=h,this._modelProviders=[],this._modelPromise=null,this._updateScheduler=this._register(new E.Delayer(300)),this._updateOperation=this._register(new L.DisposableStore);const C=new f(h),w=new s(this._editor,h),D=new d(this._editor,g);switch(m){case n.OUTLINE_MODEL:this._modelProviders.push(C),this._modelProviders.push(w),this._modelProviders.push(D);break;case n.FOLDING_PROVIDER_MODEL:this._modelProviders.push(w),this._modelProviders.push(D);break;case n.INDENTATION_MODEL:this._modelProviders.push(D);break}}_cancelModelPromise(){this._modelPromise&&(this._modelPromise.cancel(),this._modelPromise=null)}async update(o,g,h){return this._updateOperation.clear(),this._updateOperation.add({dispose:()=>{this._cancelModelPromise(),this._updateScheduler.cancel()}}),this._cancelModelPromise(),await this._updateScheduler.trigger(async()=>{for(const m of this._modelProviders){const{statusPromise:C,modelPromise:w}=m.computeStickyModel(o,g,h);this._modelPromise=w;const D=await C;if(this._modelPromise!==w)return null;switch(D){case t.CANCELED:return this._updateOperation.clear(),null;case t.VALID:return m.stickyModel}}return null}).catch(m=>((0,b.onUnexpectedError)(m),null))}};e.StickyModelProvider=r,e.StickyModelProvider=r=ke([ge(1,v.ILanguageConfigurationService),ge(2,k.ILanguageFeaturesService)],r);class u{constructor(){this._stickyModel=null}get stickyModel(){return this._stickyModel}_invalid(){return this._stickyModel=null,t.INVALID}computeStickyModel(o,g,h){if(h.isCancellationRequested||!this.isProviderValid(o))return{statusPromise:this._invalid(),modelPromise:null};const m=(0,E.createCancelablePromise)(C=>this.createModelFromProvider(o,g,C));return{statusPromise:m.then(C=>this.isModelValid(C)?h.isCancellationRequested?t.CANCELED:(this._stickyModel=this.createStickyModel(o,g,h,C),t.VALID):this._invalid()).then(void 0,C=>((0,b.onUnexpectedError)(C),t.CANCELED)),modelPromise:m}}isModelValid(o){return!0}isProviderValid(o){return!0}}let f=class extends u{constructor(o){super(),this._languageFeaturesService=o}createModelFromProvider(o,g,h){return y.OutlineModel.create(this._languageFeaturesService.documentSymbolProvider,o,h)}createStickyModel(o,g,h,m){var C;const{stickyOutlineElement:w,providerID:D}=this._stickyModelFromOutlineModel(m,(C=this._stickyModel)===null||C===void 0?void 0:C.outlineProviderId);return new a.StickyModel(o.uri,g,w,D)}isModelValid(o){return o&&o.children.size>0}_stickyModelFromOutlineModel(o,g){let h;if(i.Iterable.first(o.children.values())instanceof y.OutlineGroup){const D=i.Iterable.find(o.children.values(),I=>I.id===g);if(D)h=D.children;else{let I="",T=-1,A;for(const[P,N]of o.children.entries()){const M=this._findSumOfRangesOfGroup(N);M>T&&(A=N,T=M,I=N.id)}g=I,h=A.children}}else h=o.children;const m=[],C=Array.from(h.values()).sort((D,I)=>{const T=new a.StickyRange(D.symbol.range.startLineNumber,D.symbol.range.endLineNumber),A=new a.StickyRange(I.symbol.range.startLineNumber,I.symbol.range.endLineNumber);return this._comparator(T,A)});for(const D of C)m.push(this._stickyModelFromOutlineElement(D,D.symbol.selectionRange.startLineNumber));return{stickyOutlineElement:new a.StickyElement(void 0,m,void 0),providerID:g}}_stickyModelFromOutlineElement(o,g){const h=[];for(const C of o.children.values())if(C.symbol.selectionRange.startLineNumber!==C.symbol.range.endLineNumber)if(C.symbol.selectionRange.startLineNumber!==g)h.push(this._stickyModelFromOutlineElement(C,C.symbol.selectionRange.startLineNumber));else for(const w of C.children.values())h.push(this._stickyModelFromOutlineElement(w,C.symbol.selectionRange.startLineNumber));h.sort((C,w)=>this._comparator(C.range,w.range));const m=new a.StickyRange(o.symbol.selectionRange.startLineNumber,o.symbol.range.endLineNumber);return new a.StickyElement(m,h,void 0)}_comparator(o,g){return o.startLineNumber!==g.startLineNumber?o.startLineNumber-g.startLineNumber:g.endLineNumber-o.endLineNumber}_findSumOfRangesOfGroup(o){let g=0;for(const h of o.children.values())g+=this._findSumOfRangesOfGroup(h);return o instanceof y.OutlineElement?g+o.symbol.range.endLineNumber-o.symbol.selectionRange.startLineNumber:g}};f=ke([ge(0,k.ILanguageFeaturesService)],f);class c extends u{constructor(o){super(),this._foldingLimitReporter=new S.RangesLimitReporter(o)}createStickyModel(o,g,h,m){const C=this._fromFoldingRegions(m);return new a.StickyModel(o.uri,g,C,void 0)}isModelValid(o){return o!==null}_fromFoldingRegions(o){const g=o.length,h=[],m=new a.StickyElement(void 0,[],void 0);for(let C=0;C<g;C++){const w=o.getParentIndex(C);let D;w!==-1?D=h[w]:D=m;const I=new a.StickyElement(new a.StickyRange(o.getStartLineNumber(C),o.getEndLineNumber(C)+1),[],D);D.children.push(I),h.push(I)}return m}}let d=class extends c{constructor(o,g){super(o),this._languageConfigurationService=g}createModelFromProvider(o,g,h){return new _.IndentRangeProvider(o,this._languageConfigurationService,this._foldingLimitReporter).compute(h)}};d=ke([ge(1,v.ILanguageConfigurationService)],d);let s=class extends c{constructor(o,g){super(o),this._languageFeaturesService=g}isProviderValid(o){return S.FoldingController.getFoldingRangeProviders(this._languageFeaturesService,o).length>0}createModelFromProvider(o,g,h){const m=S.FoldingController.getFoldingRangeProviders(this._languageFeaturesService,o);return new p.SyntaxRangeProvider(o,m,()=>this.createModelFromProvider(o,g,h),this._foldingLimitReporter,void 0).compute(h)}};s=ke([ge(1,k.ILanguageFeaturesService)],s)}),define(se[907],oe([1,0,2,18,19,14,13,6,32,906]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StickyLineCandidateProvider=e.StickyLineCandidate=void 0;class b{constructor(n,t,r){this.startLineNumber=n,this.endLineNumber=t,this.nestingDepth=r}}e.StickyLineCandidate=b;let a=class extends L.Disposable{constructor(n,t,r){super(),this._languageFeaturesService=t,this._languageConfigurationService=r,this._onDidChangeStickyScroll=this._register(new p.Emitter),this.onDidChangeStickyScroll=this._onDidChangeStickyScroll.event,this._options=null,this._model=null,this._cts=null,this._stickyModelProvider=null,this._editor=n,this._sessionStore=this._register(new L.DisposableStore),this._updateSoon=this._register(new E.RunOnceScheduler(()=>this.update(),50)),this._register(this._editor.onDidChangeConfiguration(u=>{u.hasChanged(114)&&this.readConfiguration()})),this.readConfiguration()}readConfiguration(){this._stickyModelProvider=null,this._sessionStore.clear(),this._options=this._editor.getOption(114),this._options.enabled&&(this._stickyModelProvider=this._sessionStore.add(new v.StickyModelProvider(this._editor,this._languageConfigurationService,this._languageFeaturesService,this._options.defaultModel)),this._sessionStore.add(this._editor.onDidChangeModel(()=>{this._model=null,this._onDidChangeStickyScroll.fire(),this.update()})),this._sessionStore.add(this._editor.onDidChangeHiddenAreas(()=>this.update())),this._sessionStore.add(this._editor.onDidChangeModelContent(()=>this._updateSoon.schedule())),this._sessionStore.add(this._languageFeaturesService.documentSymbolProvider.onDidChange(()=>this.update())),this.update())}getVersionId(){var n;return(n=this._model)===null||n===void 0?void 0:n.version}async update(){var n;(n=this._cts)===null||n===void 0||n.dispose(!0),this._cts=new y.CancellationTokenSource,await this.updateStickyModel(this._cts.token),this._onDidChangeStickyScroll.fire()}async updateStickyModel(n){if(!this._editor.hasModel()||!this._stickyModelProvider||this._editor.getModel().isTooLargeForTokenization()){this._model=null;return}const t=this._editor.getModel(),r=t.getVersionId(),u=await this._stickyModelProvider.update(t,r,n);n.isCancellationRequested||(this._model=u)}updateIndex(n){return n===-1?n=0:n<0&&(n=-n-2),n}getCandidateStickyLinesIntersectingFromStickyModel(n,t,r,u,f){if(t.children.length===0)return;let c=f;const d=[];for(let o=0;o<t.children.length;o++){const g=t.children[o];g.range&&d.push(g.range.startLineNumber)}const s=this.updateIndex((0,S.binarySearch)(d,n.startLineNumber,(o,g)=>o-g)),l=this.updateIndex((0,S.binarySearch)(d,n.startLineNumber+u,(o,g)=>o-g));for(let o=s;o<=l;o++){const g=t.children[o];if(!g)return;if(g.range){const h=g.range.startLineNumber,m=g.range.endLineNumber;n.startLineNumber<=m+1&&h-1<=n.endLineNumber&&h!==c&&(c=h,r.push(new b(h,m-1,u+1)),this.getCandidateStickyLinesIntersectingFromStickyModel(n,g,r,u+1,h))}else this.getCandidateStickyLinesIntersectingFromStickyModel(n,g,r,u,f)}}getCandidateStickyLinesIntersecting(n){var t,r;if(!(!((t=this._model)===null||t===void 0)&&t.element))return[];let u=[];this.getCandidateStickyLinesIntersectingFromStickyModel(n,this._model.element,u,0,-1);const f=(r=this._editor._getViewModel())===null||r===void 0?void 0:r.getHiddenAreas();if(f)for(const c of f)u=u.filter(d=>!(d.startLineNumber>=c.startLineNumber&&d.endLineNumber<=c.endLineNumber+1));return u}};e.StickyLineCandidateProvider=a,e.StickyLineCandidateProvider=a=ke([ge(1,k.ILanguageFeaturesService),ge(2,_.ILanguageConfigurationService)],a)}),define(se[908],oe([1,0,7,93,13,2,28,255,168,10,102,155,120,378,477]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StickyScrollWidget=e.StickyScrollWidgetState=void 0;class t{constructor(h,m,C,w=null){this.startLineNumbers=h,this.endLineNumbers=m,this.lastLineRelativePosition=C,this.showEndForLine=w}equals(h){return!!h&&this.lastLineRelativePosition===h.lastLineRelativePosition&&this.showEndForLine===h.showEndForLine&&(0,y.equals)(this.startLineNumbers,h.startLineNumbers)&&(0,y.equals)(this.endLineNumbers,h.endLineNumbers)}}e.StickyScrollWidgetState=t;const r=(0,k.createTrustedTypesPolicy)("stickyScrollViewLayer",{createHTML:g=>g}),u="data-sticky-line-index",f="data-sticky-is-line",c="data-sticky-is-line-number",d="data-sticky-is-folding-icon";class s extends E.Disposable{constructor(h){super(),this._editor=h,this._foldingIconStore=new E.DisposableStore,this._rootDomNode=document.createElement("div"),this._lineNumbersDomNode=document.createElement("div"),this._linesDomNodeScrollable=document.createElement("div"),this._linesDomNode=document.createElement("div"),this._lineHeight=this._editor.getOption(66),this._renderedStickyLines=[],this._lineNumbers=[],this._lastLineRelativePosition=0,this._minContentWidthInPx=0,this._isOnGlyphMargin=!1,this._lineNumbersDomNode.className="sticky-widget-line-numbers",this._lineNumbersDomNode.setAttribute("role","none"),this._linesDomNode.className="sticky-widget-lines",this._linesDomNode.setAttribute("role","list"),this._linesDomNodeScrollable.className="sticky-widget-lines-scrollable",this._linesDomNodeScrollable.appendChild(this._linesDomNode),this._rootDomNode.className="sticky-widget",this._rootDomNode.classList.toggle("peek",h instanceof _.EmbeddedCodeEditorWidget),this._rootDomNode.appendChild(this._lineNumbersDomNode),this._rootDomNode.appendChild(this._linesDomNodeScrollable);const m=()=>{this._linesDomNode.style.left=this._editor.getOption(114).scrollWithEditor?`-${this._editor.getScrollLeft()}px`:"0px"};this._register(this._editor.onDidChangeConfiguration(C=>{C.hasChanged(114)&&m(),C.hasChanged(66)&&(this._lineHeight=this._editor.getOption(66))})),this._register(this._editor.onDidScrollChange(C=>{C.scrollLeftChanged&&m(),C.scrollWidthChanged&&this._updateWidgetWidth()})),this._register(this._editor.onDidChangeModel(()=>{m(),this._updateWidgetWidth()})),this._register(this._foldingIconStore),m(),this._register(this._editor.onDidLayoutChange(C=>{this._updateWidgetWidth()})),this._updateWidgetWidth()}get lineNumbers(){return this._lineNumbers}get lineNumberCount(){return this._lineNumbers.length}getRenderedStickyLine(h){return this._renderedStickyLines.find(m=>m.lineNumber===h)}getCurrentLines(){return this._lineNumbers}setState(h,m,C){if(C===void 0&&(!this._previousState&&!h||this._previousState&&this._previousState.equals(h)))return;const w=this._isWidgetHeightZero(h),D=w?void 0:h,I=w?0:this._findLineToRebuildWidgetFrom(h,C);this._renderRootNode(D,m,I),this._previousState=h}_isWidgetHeightZero(h){if(!h)return!0;const m=h.startLineNumbers.length*this._lineHeight+h.lastLineRelativePosition;if(m>0){this._lastLineRelativePosition=h.lastLineRelativePosition;const C=[...h.startLineNumbers];h.showEndForLine!==null&&(C[h.showEndForLine]=h.endLineNumbers[h.showEndForLine]),this._lineNumbers=C}else this._lastLineRelativePosition=0,this._lineNumbers=[];return m===0}_findLineToRebuildWidgetFrom(h,m){if(!h||!this._previousState)return 0;if(m!==void 0)return m;const C=this._previousState,w=h.startLineNumbers.findIndex(D=>!C.startLineNumbers.includes(D));return w===-1?0:w}_updateWidgetWidth(){const h=this._editor.getLayoutInfo(),m=h.contentLeft;this._lineNumbersDomNode.style.width=`${m}px`,this._linesDomNodeScrollable.style.setProperty("--vscode-editorStickyScroll-scrollableWidth",`${this._editor.getScrollWidth()-h.verticalScrollbarWidth}px`),this._rootDomNode.style.width=`${h.width-h.verticalScrollbarWidth}px`}_clearStickyLinesFromLine(h){this._foldingIconStore.clear();for(let m=h;m<this._renderedStickyLines.length;m++){const C=this._renderedStickyLines[m];C.lineNumberDomNode.remove(),C.lineDomNode.remove()}this._renderedStickyLines=this._renderedStickyLines.slice(0,h),this._rootDomNode.style.display="none"}_useFoldingOpacityTransition(h){this._lineNumbersDomNode.style.setProperty("--vscode-editorStickyScroll-foldingOpacityTransition",`opacity ${h?.5:0}s`)}_setFoldingIconsVisibility(h){for(const m of this._renderedStickyLines){const C=m.foldingIcon;C&&C.setVisible(h?!0:C.isCollapsed)}}async _renderRootNode(h,m,C){if(this._clearStickyLinesFromLine(C),!h)return;for(const T of this._renderedStickyLines)this._updateTopAndZIndexOfStickyLine(T);const w=this._editor.getLayoutInfo(),D=this._lineNumbers.slice(C);for(const[T,A]of D.entries()){const P=this._renderChildNode(T+C,A,m,w);P&&(this._linesDomNode.appendChild(P.lineDomNode),this._lineNumbersDomNode.appendChild(P.lineNumberDomNode),this._renderedStickyLines.push(P))}m&&(this._setFoldingHoverListeners(),this._useFoldingOpacityTransition(!this._isOnGlyphMargin));const I=this._lineNumbers.length*this._lineHeight+this._lastLineRelativePosition;this._rootDomNode.style.display="block",this._lineNumbersDomNode.style.height=`${I}px`,this._linesDomNodeScrollable.style.height=`${I}px`,this._rootDomNode.style.height=`${I}px`,this._rootDomNode.style.marginLeft="0px",this._minContentWidthInPx=Math.max(...this._renderedStickyLines.map(T=>T.scrollWidth))+w.verticalScrollbarWidth,this._editor.layoutOverlayWidget(this)}_setFoldingHoverListeners(){this._editor.getOption(109)==="mouseover"&&(this._foldingIconStore.add(L.addDisposableListener(this._lineNumbersDomNode,L.EventType.MOUSE_ENTER,()=>{this._isOnGlyphMargin=!0,this._setFoldingIconsVisibility(!0)})),this._foldingIconStore.add(L.addDisposableListener(this._lineNumbersDomNode,L.EventType.MOUSE_LEAVE,()=>{this._isOnGlyphMargin=!1,this._useFoldingOpacityTransition(!0),this._setFoldingIconsVisibility(!1)})))}_renderChildNode(h,m,C,w){const D=this._editor._getViewModel();if(!D)return;const I=D.coordinatesConverter.convertModelPositionToViewPosition(new v.Position(m,1)).lineNumber,T=D.getViewLineRenderingData(I),A=this._editor.getOption(67);let P;try{P=a.LineDecoration.filter(T.inlineDecorations,I,T.minColumn,T.maxColumn)}catch{P=[]}const N=new i.RenderLineInput(!0,!0,T.content,T.continuesWithWrappedLine,T.isBasicASCII,T.containsRTL,0,T.tokens,P,T.tabSize,T.startVisibleColumn,1,1,1,500,"none",!0,!0,null),M=new b.StringBuilder(2e3),R=(0,i.renderViewLine)(N,M);let x;r?x=r.createHTML(M.build()):x=M.build();const O=document.createElement("span");O.setAttribute(u,String(h)),O.setAttribute(f,""),O.setAttribute("role","listitem"),O.tabIndex=0,O.className="sticky-line-content",O.classList.add(`stickyLine${m}`),O.style.lineHeight=`${this._lineHeight}px`,O.innerHTML=x;const B=document.createElement("span");B.setAttribute(u,String(h)),B.setAttribute(c,""),B.className="sticky-line-number",B.style.lineHeight=`${this._lineHeight}px`;const W=w.contentLeft;B.style.width=`${W}px`;const V=document.createElement("span");A.renderType===1||A.renderType===3&&m%10===0?V.innerText=m.toString():A.renderType===2&&(V.innerText=Math.abs(m-this._editor.getPosition().lineNumber).toString()),V.className="sticky-line-number-inner",V.style.lineHeight=`${this._lineHeight}px`,V.style.width=`${w.lineNumbersWidth}px`,V.style.paddingLeft=`${w.lineNumbersLeft}px`,B.appendChild(V);const K=this._renderFoldingIconForLine(C,m);K&&B.appendChild(K.domNode),this._editor.applyFontInfo(O),this._editor.applyFontInfo(V),B.style.lineHeight=`${this._lineHeight}px`,O.style.lineHeight=`${this._lineHeight}px`,B.style.height=`${this._lineHeight}px`,O.style.height=`${this._lineHeight}px`;const F=new l(h,m,O,B,K,R.characterMapping,O.scrollWidth);return this._updateTopAndZIndexOfStickyLine(F)}_updateTopAndZIndexOfStickyLine(h){var m;const C=h.index,w=h.lineDomNode,D=h.lineNumberDomNode,I=C===this._lineNumbers.length-1,T="0",A="1";w.style.zIndex=I?T:A,D.style.zIndex=I?T:A;const P=`${C*this._lineHeight+this._lastLineRelativePosition+(!((m=h.foldingIcon)===null||m===void 0)&&m.isCollapsed?1:0)}px`,N=`${C*this._lineHeight}px`;return w.style.top=I?P:N,D.style.top=I?P:N,h}_renderFoldingIconForLine(h,m){const C=this._editor.getOption(109);if(!h||C==="never")return;const w=h.regions,D=w.findRange(m),I=w.getStartLineNumber(D);if(!(m===I))return;const A=w.isCollapsed(D),P=new o(A,I,w.getEndLineNumber(D),this._lineHeight);return P.setVisible(this._isOnGlyphMargin?!0:A||C==="always"),P.domNode.setAttribute(d,""),P}getId(){return"editor.contrib.stickyScrollWidget"}getDomNode(){return this._rootDomNode}getPosition(){return{preference:null}}getMinContentWidthInPx(){return this._minContentWidthInPx}focusLineWithIndex(h){0<=h&&h<this._renderedStickyLines.length&&this._renderedStickyLines[h].lineDomNode.focus()}getEditorPositionFromNode(h){if(!h||h.children.length>0)return null;const m=this._getRenderedStickyLineFromChildDomNode(h);if(!m)return null;const C=(0,p.getColumnOfNodeOffset)(m.characterMapping,h,0);return new v.Position(m.lineNumber,C)}getLineNumberFromChildDomNode(h){var m,C;return(C=(m=this._getRenderedStickyLineFromChildDomNode(h))===null||m===void 0?void 0:m.lineNumber)!==null&&C!==void 0?C:null}_getRenderedStickyLineFromChildDomNode(h){const m=this.getLineIndexFromChildDomNode(h);return m===null||m<0||m>=this._renderedStickyLines.length?null:this._renderedStickyLines[m]}getLineIndexFromChildDomNode(h){const m=this._getAttributeValue(h,u);return m?parseInt(m,10):null}isInStickyLine(h){return this._getAttributeValue(h,f)!==void 0}isInFoldingIconDomNode(h){return this._getAttributeValue(h,d)!==void 0}_getAttributeValue(h,m){for(;h&&h!==this._rootDomNode;){const C=h.getAttribute(m);if(C!==null)return C;h=h.parentElement}}}e.StickyScrollWidget=s;class l{constructor(h,m,C,w,D,I,T){this.index=h,this.lineNumber=m,this.lineDomNode=C,this.lineNumberDomNode=w,this.foldingIcon=D,this.characterMapping=I,this.scrollWidth=T}}class o{constructor(h,m,C,w){this.isCollapsed=h,this.foldingStartLine=m,this.foldingEndLine=C,this.dimension=w,this.domNode=document.createElement("div"),this.domNode.style.width=`${w}px`,this.domNode.style.height=`${w}px`,this.domNode.className=S.ThemeIcon.asClassName(h?n.foldingCollapsedIcon:n.foldingExpandedIcon)}setVisible(h){this.domNode.style.cursor=h?"pointer":"default",this.domNode.style.opacity=h?"1":"0"}}}),define(se[909],oe([1,0,7,119,14,12,6,2,145,11,168,877,718,15,8,92,29,89,23,225,138,355,872,106,48,177,478,254]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h){"use strict";var m;Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestContentWidget=e.SuggestWidget=e.editorSuggestWidgetSelectedBackground=void 0,(0,u.registerColor)("editorSuggestWidget.background",{dark:u.editorWidgetBackground,light:u.editorWidgetBackground,hcDark:u.editorWidgetBackground,hcLight:u.editorWidgetBackground},i.localize(0,null)),(0,u.registerColor)("editorSuggestWidget.border",{dark:u.editorWidgetBorder,light:u.editorWidgetBorder,hcDark:u.editorWidgetBorder,hcLight:u.editorWidgetBorder},i.localize(1,null));const C=(0,u.registerColor)("editorSuggestWidget.foreground",{dark:u.editorForeground,light:u.editorForeground,hcDark:u.editorForeground,hcLight:u.editorForeground},i.localize(2,null));(0,u.registerColor)("editorSuggestWidget.selectedForeground",{dark:u.quickInputListFocusForeground,light:u.quickInputListFocusForeground,hcDark:u.quickInputListFocusForeground,hcLight:u.quickInputListFocusForeground},i.localize(3,null)),(0,u.registerColor)("editorSuggestWidget.selectedIconForeground",{dark:u.quickInputListFocusIconForeground,light:u.quickInputListFocusIconForeground,hcDark:u.quickInputListFocusIconForeground,hcLight:u.quickInputListFocusIconForeground},i.localize(4,null)),e.editorSuggestWidgetSelectedBackground=(0,u.registerColor)("editorSuggestWidget.selectedBackground",{dark:u.quickInputListFocusBackground,light:u.quickInputListFocusBackground,hcDark:u.quickInputListFocusBackground,hcLight:u.quickInputListFocusBackground},i.localize(5,null)),(0,u.registerColor)("editorSuggestWidget.highlightForeground",{dark:u.listHighlightForeground,light:u.listHighlightForeground,hcDark:u.listHighlightForeground,hcLight:u.listHighlightForeground},i.localize(6,null)),(0,u.registerColor)("editorSuggestWidget.focusHighlightForeground",{dark:u.listFocusHighlightForeground,light:u.listFocusHighlightForeground,hcDark:u.listFocusHighlightForeground,hcLight:u.listFocusHighlightForeground},i.localize(7,null)),(0,u.registerColor)("editorSuggestWidgetStatus.foreground",{dark:(0,u.transparent)(C,.5),light:(0,u.transparent)(C,.5),hcDark:(0,u.transparent)(C,.5),hcLight:(0,u.transparent)(C,.5)},i.localize(8,null));class w{constructor(A,P){this._service=A,this._key=`suggestWidget.size/${P.getEditorType()}/${P instanceof b.EmbeddedCodeEditorWidget}`}restore(){var A;const P=(A=this._service.get(this._key,0))!==null&&A!==void 0?A:"";try{const N=JSON.parse(P);if(L.Dimension.is(N))return L.Dimension.lift(N)}catch{}}store(A){this._service.store(this._key,JSON.stringify(A),0,1)}reset(){this._service.remove(this._key,0)}}let D=m=class{constructor(A,P,N,M,R){this.editor=A,this._storageService=P,this._state=0,this._isAuto=!1,this._pendingLayout=new p.MutableDisposable,this._pendingShowDetails=new p.MutableDisposable,this._ignoreFocusEvents=!1,this._forceRenderingAbove=!1,this._explainMode=!1,this._showTimeout=new y.TimeoutTimer,this._disposables=new p.DisposableStore,this._onDidSelect=new S.PauseableEmitter,this._onDidFocus=new S.PauseableEmitter,this._onDidHide=new S.Emitter,this._onDidShow=new S.Emitter,this.onDidSelect=this._onDidSelect.event,this.onDidFocus=this._onDidFocus.event,this.onDidHide=this._onDidHide.event,this.onDidShow=this._onDidShow.event,this._onDetailsKeydown=new S.Emitter,this.onDetailsKeyDown=this._onDetailsKeydown.event,this.element=new d.ResizableHTMLElement,this.element.domNode.classList.add("editor-widget","suggest-widget"),this._contentWidget=new I(this,A),this._persistedSize=new w(P,A);class x{constructor(q,ie,ae=!1,ne=!1){this.persistedSize=q,this.currentSize=ie,this.persistHeight=ae,this.persistWidth=ne}}let O;this._disposables.add(this.element.onDidWillResize(()=>{this._contentWidget.lockPreference(),O=new x(this._persistedSize.restore(),this.element.size)})),this._disposables.add(this.element.onDidResize(F=>{var q,ie,ae,ne;if(this._resize(F.dimension.width,F.dimension.height),O&&(O.persistHeight=O.persistHeight||!!F.north||!!F.south,O.persistWidth=O.persistWidth||!!F.east||!!F.west),!!F.done){if(O){const{itemHeight:$,defaultSize:J}=this.getLayoutInfo(),Q=Math.round($/2);let{width:re,height:de}=this.element.size;(!O.persistHeight||Math.abs(O.currentSize.height-de)<=Q)&&(de=(ie=(q=O.persistedSize)===null||q===void 0?void 0:q.height)!==null&&ie!==void 0?ie:J.height),(!O.persistWidth||Math.abs(O.currentSize.width-re)<=Q)&&(re=(ne=(ae=O.persistedSize)===null||ae===void 0?void 0:ae.width)!==null&&ne!==void 0?ne:J.width),this._persistedSize.store(new L.Dimension(re,de))}this._contentWidget.unlockPreference(),O=void 0}})),this._messageElement=L.append(this.element.domNode,L.$(".message")),this._listElement=L.append(this.element.domNode,L.$(".tree"));const B=this._disposables.add(R.createInstance(l.SuggestDetailsWidget,this.editor));B.onDidClose(this.toggleDetails,this,this._disposables),this._details=new l.SuggestDetailsOverlay(B,this.editor);const W=()=>this.element.domNode.classList.toggle("no-icons",!this.editor.getOption(117).showIcons);W();const V=R.createInstance(o.ItemRenderer,this.editor);this._disposables.add(V),this._disposables.add(V.onDidToggleDetails(()=>this.toggleDetails())),this._list=new k.List("SuggestWidget",this._listElement,{getHeight:F=>this.getLayoutInfo().itemHeight,getTemplateId:F=>"suggestion"},[V],{alwaysConsumeMouseWheel:!0,useShadows:!1,mouseSupport:!1,multipleSelectionSupport:!1,accessibilityProvider:{getRole:()=>"option",getWidgetAriaLabel:()=>i.localize(11,null),getWidgetRole:()=>"listbox",getAriaLabel:F=>{let q=F.textLabel;if(typeof F.completion.label!="string"){const{detail:$,description:J}=F.completion.label;$&&J?q=i.localize(12,null,q,$,J):$?q=i.localize(13,null,q,$):J&&(q=i.localize(14,null,q,J))}if(!F.isResolved||!this._isDetailsVisible())return q;const{documentation:ie,detail:ae}=F.completion,ne=v.format("{0}{1}",ae||"",ie?typeof ie=="string"?ie:ie.value:"");return i.localize(15,null,q,ne)}}}),this._list.style((0,g.getListStyles)({listInactiveFocusBackground:e.editorSuggestWidgetSelectedBackground,listInactiveFocusOutline:u.activeContrastBorder})),this._status=R.createInstance(a.SuggestWidgetStatus,this.element.domNode,s.suggestWidgetStatusbarMenu);const K=()=>this.element.domNode.classList.toggle("with-status-bar",this.editor.getOption(117).showStatusBar);K(),this._disposables.add(M.onDidColorThemeChange(F=>this._onThemeChange(F))),this._onThemeChange(M.getColorTheme()),this._disposables.add(this._list.onMouseDown(F=>this._onListMouseDownOrTap(F))),this._disposables.add(this._list.onTap(F=>this._onListMouseDownOrTap(F))),this._disposables.add(this._list.onDidChangeSelection(F=>this._onListSelection(F))),this._disposables.add(this._list.onDidChangeFocus(F=>this._onListFocus(F))),this._disposables.add(this.editor.onDidChangeCursorSelection(()=>this._onCursorSelectionChanged())),this._disposables.add(this.editor.onDidChangeConfiguration(F=>{F.hasChanged(117)&&(K(),W()),this._completionModel&&(F.hasChanged(50)||F.hasChanged(118)||F.hasChanged(119))&&this._list.splice(0,this._list.length,this._completionModel.items)})),this._ctxSuggestWidgetVisible=s.Context.Visible.bindTo(N),this._ctxSuggestWidgetDetailsVisible=s.Context.DetailsVisible.bindTo(N),this._ctxSuggestWidgetMultipleSuggestions=s.Context.MultipleSuggestions.bindTo(N),this._ctxSuggestWidgetHasFocusedSuggestion=s.Context.HasFocusedSuggestion.bindTo(N),this._disposables.add(L.addStandardDisposableListener(this._details.widget.domNode,"keydown",F=>{this._onDetailsKeydown.fire(F)})),this._disposables.add(this.editor.onMouseDown(F=>this._onEditorMouseDown(F)))}dispose(){var A;this._details.widget.dispose(),this._details.dispose(),this._list.dispose(),this._status.dispose(),this._disposables.dispose(),(A=this._loadingTimeout)===null||A===void 0||A.dispose(),this._pendingLayout.dispose(),this._pendingShowDetails.dispose(),this._showTimeout.dispose(),this._contentWidget.dispose(),this.element.dispose()}_onEditorMouseDown(A){this._details.widget.domNode.contains(A.target.element)?this._details.widget.domNode.focus():this.element.domNode.contains(A.target.element)&&this.editor.focus()}_onCursorSelectionChanged(){this._state!==0&&this._contentWidget.layout()}_onListMouseDownOrTap(A){typeof A.element>"u"||typeof A.index>"u"||(A.browserEvent.preventDefault(),A.browserEvent.stopPropagation(),this._select(A.element,A.index))}_onListSelection(A){A.elements.length&&this._select(A.elements[0],A.indexes[0])}_select(A,P){const N=this._completionModel;N&&(this._onDidSelect.fire({item:A,index:P,model:N}),this.editor.focus())}_onThemeChange(A){this._details.widget.borderWidth=(0,f.isHighContrast)(A.type)?2:1}_onListFocus(A){var P;if(this._ignoreFocusEvents)return;if(!A.elements.length){this._currentSuggestionDetails&&(this._currentSuggestionDetails.cancel(),this._currentSuggestionDetails=void 0,this._focusedItem=void 0),this.editor.setAriaOptions({activeDescendant:void 0}),this._ctxSuggestWidgetHasFocusedSuggestion.set(!1);return}if(!this._completionModel)return;this._ctxSuggestWidgetHasFocusedSuggestion.set(!0);const N=A.elements[0],M=A.indexes[0];N!==this._focusedItem&&((P=this._currentSuggestionDetails)===null||P===void 0||P.cancel(),this._currentSuggestionDetails=void 0,this._focusedItem=N,this._list.reveal(M),this._currentSuggestionDetails=(0,y.createCancelablePromise)(async R=>{const x=(0,y.disposableTimeout)(()=>{this._isDetailsVisible()&&this.showDetails(!0)},250),O=R.onCancellationRequested(()=>x.dispose());try{return await N.resolve(R)}finally{x.dispose(),O.dispose()}}),this._currentSuggestionDetails.then(()=>{M>=this._list.length||N!==this._list.element(M)||(this._ignoreFocusEvents=!0,this._list.splice(M,1,[N]),this._list.setFocus([M]),this._ignoreFocusEvents=!1,this._isDetailsVisible()?this.showDetails(!1):this.element.domNode.classList.remove("docs-side"),this.editor.setAriaOptions({activeDescendant:(0,o.getAriaId)(M)}))}).catch(E.onUnexpectedError)),this._onDidFocus.fire({item:N,index:M,model:this._completionModel})}_setState(A){if(this._state!==A)switch(this._state=A,this.element.domNode.classList.toggle("frozen",A===4),this.element.domNode.classList.remove("message"),A){case 0:L.hide(this._messageElement,this._listElement,this._status.element),this._details.hide(!0),this._status.hide(),this._contentWidget.hide(),this._ctxSuggestWidgetVisible.reset(),this._ctxSuggestWidgetMultipleSuggestions.reset(),this._ctxSuggestWidgetHasFocusedSuggestion.reset(),this._showTimeout.cancel(),this.element.domNode.classList.remove("visible"),this._list.splice(0,this._list.length),this._focusedItem=void 0,this._cappedHeight=void 0,this._explainMode=!1;break;case 1:this.element.domNode.classList.add("message"),this._messageElement.textContent=m.LOADING_MESSAGE,L.hide(this._listElement,this._status.element),L.show(this._messageElement),this._details.hide(),this._show(),this._focusedItem=void 0,(0,h.status)(m.LOADING_MESSAGE);break;case 2:this.element.domNode.classList.add("message"),this._messageElement.textContent=m.NO_SUGGESTIONS_MESSAGE,L.hide(this._listElement,this._status.element),L.show(this._messageElement),this._details.hide(),this._show(),this._focusedItem=void 0,(0,h.status)(m.NO_SUGGESTIONS_MESSAGE);break;case 3:L.hide(this._messageElement),L.show(this._listElement,this._status.element),this._show();break;case 4:L.hide(this._messageElement),L.show(this._listElement,this._status.element),this._show();break;case 5:L.hide(this._messageElement),L.show(this._listElement,this._status.element),this._details.show(),this._show();break}}_show(){this._status.show(),this._contentWidget.show(),this._layout(this._persistedSize.restore()),this._ctxSuggestWidgetVisible.set(!0),this._showTimeout.cancelAndSet(()=>{this.element.domNode.classList.add("visible"),this._onDidShow.fire(this)},100)}showTriggered(A,P){this._state===0&&(this._contentWidget.setPosition(this.editor.getPosition()),this._isAuto=!!A,this._isAuto||(this._loadingTimeout=(0,y.disposableTimeout)(()=>this._setState(1),P)))}showSuggestions(A,P,N,M,R){var x,O;if(this._contentWidget.setPosition(this.editor.getPosition()),(x=this._loadingTimeout)===null||x===void 0||x.dispose(),(O=this._currentSuggestionDetails)===null||O===void 0||O.cancel(),this._currentSuggestionDetails=void 0,this._completionModel!==A&&(this._completionModel=A),N&&this._state!==2&&this._state!==0){this._setState(4);return}const B=this._completionModel.items.length,W=B===0;if(this._ctxSuggestWidgetMultipleSuggestions.set(B>1),W){this._setState(M?0:2),this._completionModel=void 0;return}this._focusedItem=void 0,this._onDidFocus.pause(),this._onDidSelect.pause();try{this._list.splice(0,this._list.length,this._completionModel.items),this._setState(N?4:3),this._list.reveal(P,0),this._list.setFocus(R?[]:[P])}finally{this._onDidFocus.resume(),this._onDidSelect.resume()}this._pendingLayout.value=L.runAtThisOrScheduleAtNextAnimationFrame(L.getWindow(this.element.domNode),()=>{this._pendingLayout.clear(),this._layout(this.element.size),this._details.widget.domNode.classList.remove("focused")})}focusSelected(){this._list.length>0&&this._list.setFocus([0])}selectNextPage(){switch(this._state){case 0:return!1;case 5:return this._details.widget.pageDown(),!0;case 1:return!this._isAuto;default:return this._list.focusNextPage(),!0}}selectNext(){switch(this._state){case 0:return!1;case 1:return!this._isAuto;default:return this._list.focusNext(1,!0),!0}}selectLast(){switch(this._state){case 0:return!1;case 5:return this._details.widget.scrollBottom(),!0;case 1:return!this._isAuto;default:return this._list.focusLast(),!0}}selectPreviousPage(){switch(this._state){case 0:return!1;case 5:return this._details.widget.pageUp(),!0;case 1:return!this._isAuto;default:return this._list.focusPreviousPage(),!0}}selectPrevious(){switch(this._state){case 0:return!1;case 1:return!this._isAuto;default:return this._list.focusPrevious(1,!0),!1}}selectFirst(){switch(this._state){case 0:return!1;case 5:return this._details.widget.scrollTop(),!0;case 1:return!this._isAuto;default:return this._list.focusFirst(),!0}}getFocusedItem(){if(this._state!==0&&this._state!==2&&this._state!==1&&this._completionModel&&this._list.getFocus().length>0)return{item:this._list.getFocusedElements()[0],index:this._list.getFocus()[0],model:this._completionModel}}toggleDetailsFocus(){this._state===5?(this._setState(3),this._details.widget.domNode.classList.remove("focused")):this._state===3&&this._isDetailsVisible()&&(this._setState(5),this._details.widget.domNode.classList.add("focused"))}toggleDetails(){this._isDetailsVisible()?(this._pendingShowDetails.clear(),this._ctxSuggestWidgetDetailsVisible.set(!1),this._setDetailsVisible(!1),this._details.hide(),this.element.domNode.classList.remove("shows-details")):((0,l.canExpandCompletionItem)(this._list.getFocusedElements()[0])||this._explainMode)&&(this._state===3||this._state===5||this._state===4)&&(this._ctxSuggestWidgetDetailsVisible.set(!0),this._setDetailsVisible(!0),this.showDetails(!1))}showDetails(A){this._pendingShowDetails.value=L.runAtThisOrScheduleAtNextAnimationFrame(L.getWindow(this.element.domNode),()=>{this._pendingShowDetails.clear(),this._details.show(),A?this._details.widget.renderLoading():this._details.widget.renderItem(this._list.getFocusedElements()[0],this._explainMode),this._details.widget.isEmpty?this._details.hide():(this._positionDetails(),this.element.domNode.classList.add("shows-details")),this.editor.focus()})}toggleExplainMode(){this._list.getFocusedElements()[0]&&(this._explainMode=!this._explainMode,this._isDetailsVisible()?this.showDetails(!1):this.toggleDetails())}resetPersistedSize(){this._persistedSize.reset()}hideWidget(){var A;this._pendingLayout.clear(),this._pendingShowDetails.clear(),(A=this._loadingTimeout)===null||A===void 0||A.dispose(),this._setState(0),this._onDidHide.fire(this),this.element.clearSashHoverState();const P=this._persistedSize.restore(),N=Math.ceil(this.getLayoutInfo().itemHeight*4.3);P&&P.height<N&&this._persistedSize.store(P.with(void 0,N))}isFrozen(){return this._state===4}_afterRender(A){if(A===null){this._isDetailsVisible()&&this._details.hide();return}this._state===2||this._state===1||(this._isDetailsVisible()&&!this._details.widget.isEmpty&&this._details.show(),this._positionDetails())}_layout(A){var P,N,M;if(!this.editor.hasModel()||!this.editor.getDomNode())return;const R=L.getClientArea(this.element.domNode.ownerDocument.body),x=this.getLayoutInfo();A||(A=x.defaultSize);let O=A.height,B=A.width;if(this._status.element.style.height=`${x.itemHeight}px`,this._state===2||this._state===1)O=x.itemHeight+x.borderHeight,B=x.defaultSize.width/2,this.element.enableSashes(!1,!1,!1,!1),this.element.minSize=this.element.maxSize=new L.Dimension(B,O),this._contentWidget.setPreference(2);else{const W=R.width-x.borderHeight-2*x.horizontalPadding;B>W&&(B=W);const V=this._completionModel?this._completionModel.stats.pLabelLen*x.typicalHalfwidthCharacterWidth:B,K=x.statusBarHeight+this._list.contentHeight+x.borderHeight,F=x.itemHeight+x.statusBarHeight,q=L.getDomNodePagePosition(this.editor.getDomNode()),ie=this.editor.getScrolledVisiblePosition(this.editor.getPosition()),ae=q.top+ie.top+ie.height,ne=Math.min(R.height-ae-x.verticalPadding,K),$=q.top+ie.top-x.verticalPadding,J=Math.min($,K);let Q=Math.min(Math.max(J,ne)+x.borderHeight,K);O===((P=this._cappedHeight)===null||P===void 0?void 0:P.capped)&&(O=this._cappedHeight.wanted),O<F&&(O=F),O>Q&&(O=Q);const re=150;O>ne||this._forceRenderingAbove&&$>re?(this._contentWidget.setPreference(1),this.element.enableSashes(!0,!0,!1,!1),Q=J):(this._contentWidget.setPreference(2),this.element.enableSashes(!1,!0,!0,!1),Q=ne),this.element.preferredSize=new L.Dimension(V,x.defaultSize.height),this.element.maxSize=new L.Dimension(W,Q),this.element.minSize=new L.Dimension(220,F),this._cappedHeight=O===K?{wanted:(M=(N=this._cappedHeight)===null||N===void 0?void 0:N.wanted)!==null&&M!==void 0?M:A.height,capped:O}:void 0}this._resize(B,O)}_resize(A,P){const{width:N,height:M}=this.element.maxSize;A=Math.min(N,A),P=Math.min(M,P);const{statusBarHeight:R}=this.getLayoutInfo();this._list.layout(P-R,A),this._listElement.style.height=`${P-R}px`,this.element.layout(P,A),this._contentWidget.layout(),this._positionDetails()}_positionDetails(){var A;this._isDetailsVisible()&&this._details.placeAtAnchor(this.element.domNode,((A=this._contentWidget.getPosition())===null||A===void 0?void 0:A.preference[0])===2)}getLayoutInfo(){const A=this.editor.getOption(50),P=(0,_.clamp)(this.editor.getOption(119)||A.lineHeight,8,1e3),N=!this.editor.getOption(117).showStatusBar||this._state===2||this._state===1?0:P,M=this._details.widget.borderWidth,R=2*M;return{itemHeight:P,statusBarHeight:N,borderWidth:M,borderHeight:R,typicalHalfwidthCharacterWidth:A.typicalHalfwidthCharacterWidth,verticalPadding:22,horizontalPadding:14,defaultSize:new L.Dimension(430,N+12*P+R)}}_isDetailsVisible(){return this._storageService.getBoolean("expandSuggestionDocs",0,!1)}_setDetailsVisible(A){this._storageService.store("expandSuggestionDocs",A,0,0)}forceRenderingAbove(){this._forceRenderingAbove||(this._forceRenderingAbove=!0,this._layout(this._persistedSize.restore()))}stopForceRenderingAbove(){this._forceRenderingAbove=!1}};e.SuggestWidget=D,D.LOADING_MESSAGE=i.localize(9,null),D.NO_SUGGESTIONS_MESSAGE=i.localize(10,null),e.SuggestWidget=D=m=ke([ge(1,r.IStorageService),ge(2,n.IContextKeyService),ge(3,c.IThemeService),ge(4,t.IInstantiationService)],D);class I{constructor(A,P){this._widget=A,this._editor=P,this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this._preferenceLocked=!1,this._added=!1,this._hidden=!1}dispose(){this._added&&(this._added=!1,this._editor.removeContentWidget(this))}getId(){return"editor.widget.suggestWidget"}getDomNode(){return this._widget.element.domNode}show(){this._hidden=!1,this._added||(this._added=!0,this._editor.addContentWidget(this))}hide(){this._hidden||(this._hidden=!0,this.layout())}layout(){this._editor.layoutContentWidget(this)}getPosition(){return this._hidden||!this._position||!this._preference?null:{position:this._position,preference:[this._preference]}}beforeRender(){const{height:A,width:P}=this._widget.element.size,{borderWidth:N,horizontalPadding:M}=this._widget.getLayoutInfo();return new L.Dimension(P+2*N+M,A+2*N)}afterRender(A){this._widget._afterRender(A)}setPreference(A){this._preferenceLocked||(this._preference=A)}lockPreference(){this._preferenceLocked=!0}unlockPreference(){this._preferenceLocked=!1}setPosition(A){this._position=A}}e.SuggestContentWidget=I}),define(se[381],oe([1,0,41,38,31,727,29,23,482]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getSelectionHighlightDecorationOptions=e.getHighlightDecorationOptions=void 0;const _=(0,S.registerColor)("editor.wordHighlightBackground",{dark:"#575757B8",light:"#57575740",hcDark:null,hcLight:null},E.localize(0,null),!0);(0,S.registerColor)("editor.wordHighlightStrongBackground",{dark:"#004972B8",light:"#0e639c40",hcDark:null,hcLight:null},E.localize(1,null),!0),(0,S.registerColor)("editor.wordHighlightTextBackground",{light:_,dark:_,hcDark:_,hcLight:_},E.localize(2,null),!0);const v=(0,S.registerColor)("editor.wordHighlightBorder",{light:null,dark:null,hcDark:S.activeContrastBorder,hcLight:S.activeContrastBorder},E.localize(3,null));(0,S.registerColor)("editor.wordHighlightStrongBorder",{light:null,dark:null,hcDark:S.activeContrastBorder,hcLight:S.activeContrastBorder},E.localize(4,null)),(0,S.registerColor)("editor.wordHighlightTextBorder",{light:v,dark:v,hcDark:v,hcLight:v},E.localize(5,null));const b=(0,S.registerColor)("editorOverviewRuler.wordHighlightForeground",{dark:"#A0A0A0CC",light:"#A0A0A0CC",hcDark:"#A0A0A0CC",hcLight:"#A0A0A0CC"},E.localize(6,null),!0),a=(0,S.registerColor)("editorOverviewRuler.wordHighlightStrongForeground",{dark:"#C0A0C0CC",light:"#C0A0C0CC",hcDark:"#C0A0C0CC",hcLight:"#C0A0C0CC"},E.localize(7,null),!0),i=(0,S.registerColor)("editorOverviewRuler.wordHighlightTextForeground",{dark:S.overviewRulerSelectionHighlightForeground,light:S.overviewRulerSelectionHighlightForeground,hcDark:S.overviewRulerSelectionHighlightForeground,hcLight:S.overviewRulerSelectionHighlightForeground},E.localize(8,null),!0),n=k.ModelDecorationOptions.register({description:"word-highlight-strong",stickiness:1,className:"wordHighlightStrong",overviewRuler:{color:(0,p.themeColorFromId)(a),position:L.OverviewRulerLane.Center},minimap:{color:(0,p.themeColorFromId)(S.minimapSelectionOccurrenceHighlight),position:L.MinimapPosition.Inline}}),t=k.ModelDecorationOptions.register({description:"word-highlight-text",stickiness:1,className:"wordHighlightText",overviewRuler:{color:(0,p.themeColorFromId)(i),position:L.OverviewRulerLane.Center},minimap:{color:(0,p.themeColorFromId)(S.minimapSelectionOccurrenceHighlight),position:L.MinimapPosition.Inline}}),r=k.ModelDecorationOptions.register({description:"selection-highlight-overview",stickiness:1,className:"selectionHighlight",overviewRuler:{color:(0,p.themeColorFromId)(S.overviewRulerSelectionHighlightForeground),position:L.OverviewRulerLane.Center},minimap:{color:(0,p.themeColorFromId)(S.minimapSelectionOccurrenceHighlight),position:L.MinimapPosition.Inline}}),u=k.ModelDecorationOptions.register({description:"selection-highlight",stickiness:1,className:"selectionHighlight"}),f=k.ModelDecorationOptions.register({description:"word-highlight",stickiness:1,className:"wordHighlight",overviewRuler:{color:(0,p.themeColorFromId)(b),position:L.OverviewRulerLane.Center},minimap:{color:(0,p.themeColorFromId)(S.minimapSelectionOccurrenceHighlight),position:L.MinimapPosition.Inline}});function c(s){return s===y.DocumentHighlightKind.Write?n:s===y.DocumentHighlightKind.Text?t:f}e.getHighlightDecorationOptions=c;function d(s){return s?u:r}e.getSelectionHighlightDecorationOptions=d,(0,p.registerThemingParticipant)((s,l)=>{const o=s.getColor(S.editorSelectionHighlight);o&&l.addRule(`.monaco-editor .selectionHighlight { background-color: ${o.transparent(.5)}; }`)})}),define(se[910],oe([1,0,48,14,65,2,16,208,5,24,21,377,703,30,15,18,381,8]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f){"use strict";var c;Object.defineProperty(e,"__esModule",{value:!0}),e.FocusPreviousCursor=e.FocusNextCursor=e.SelectionHighlighter=e.CompatChangeAll=e.SelectHighlightsAction=e.MoveSelectionToPreviousFindMatchAction=e.MoveSelectionToNextFindMatchAction=e.AddSelectionToPreviousFindMatchAction=e.AddSelectionToNextFindMatchAction=e.MultiCursorSelectionControllerAction=e.MultiCursorSelectionController=e.MultiCursorSession=e.MultiCursorSessionResult=e.InsertCursorBelow=e.InsertCursorAbove=void 0;function d(K,F){const q=F.filter(ie=>!K.find(ae=>ae.equals(ie)));if(q.length>=1){const ie=q.map(ne=>`line ${ne.viewState.position.lineNumber} column ${ne.viewState.position.column}`).join(", "),ae=q.length===1?i.localize(0,null,ie):i.localize(1,null,ie);(0,L.status)(ae)}}class s extends S.EditorAction{constructor(){super({id:"editor.action.insertCursorAbove",label:i.localize(2,null),alias:"Add Cursor Above",precondition:void 0,kbOpts:{kbExpr:b.EditorContextKeys.editorTextFocus,primary:2576,linux:{primary:1552,secondary:[3088]},weight:100},menuOpts:{menuId:n.MenuId.MenubarSelectionMenu,group:"3_multi",title:i.localize(3,null),order:2}})}run(F,q,ie){if(!q.hasModel())return;let ae=!0;ie&&ie.logicalLine===!1&&(ae=!1);const ne=q._getViewModel();if(ne.cursorConfig.readOnly)return;ne.model.pushStackElement();const $=ne.getCursorStates();ne.setCursorStates(ie.source,3,p.CursorMoveCommands.addCursorUp(ne,$,ae)),ne.revealTopMostCursor(ie.source),d($,ne.getCursorStates())}}e.InsertCursorAbove=s;class l extends S.EditorAction{constructor(){super({id:"editor.action.insertCursorBelow",label:i.localize(4,null),alias:"Add Cursor Below",precondition:void 0,kbOpts:{kbExpr:b.EditorContextKeys.editorTextFocus,primary:2578,linux:{primary:1554,secondary:[3090]},weight:100},menuOpts:{menuId:n.MenuId.MenubarSelectionMenu,group:"3_multi",title:i.localize(5,null),order:3}})}run(F,q,ie){if(!q.hasModel())return;let ae=!0;ie&&ie.logicalLine===!1&&(ae=!1);const ne=q._getViewModel();if(ne.cursorConfig.readOnly)return;ne.model.pushStackElement();const $=ne.getCursorStates();ne.setCursorStates(ie.source,3,p.CursorMoveCommands.addCursorDown(ne,$,ae)),ne.revealBottomMostCursor(ie.source),d($,ne.getCursorStates())}}e.InsertCursorBelow=l;class o extends S.EditorAction{constructor(){super({id:"editor.action.insertCursorAtEndOfEachLineSelected",label:i.localize(6,null),alias:"Add Cursors to Line Ends",precondition:void 0,kbOpts:{kbExpr:b.EditorContextKeys.editorTextFocus,primary:1575,weight:100},menuOpts:{menuId:n.MenuId.MenubarSelectionMenu,group:"3_multi",title:i.localize(7,null),order:4}})}getCursorsForSelection(F,q,ie){if(!F.isEmpty()){for(let ae=F.startLineNumber;ae<F.endLineNumber;ae++){const ne=q.getLineMaxColumn(ae);ie.push(new v.Selection(ae,ne,ae,ne))}F.endColumn>1&&ie.push(new v.Selection(F.endLineNumber,F.endColumn,F.endLineNumber,F.endColumn))}}run(F,q){if(!q.hasModel())return;const ie=q.getModel(),ae=q.getSelections(),ne=q._getViewModel(),$=ne.getCursorStates(),J=[];ae.forEach(Q=>this.getCursorsForSelection(Q,ie,J)),J.length>0&&q.setSelections(J),d($,ne.getCursorStates())}}class g extends S.EditorAction{constructor(){super({id:"editor.action.addCursorsToBottom",label:i.localize(8,null),alias:"Add Cursors To Bottom",precondition:void 0})}run(F,q){if(!q.hasModel())return;const ie=q.getSelections(),ae=q.getModel().getLineCount(),ne=[];for(let Q=ie[0].startLineNumber;Q<=ae;Q++)ne.push(new v.Selection(Q,ie[0].startColumn,Q,ie[0].endColumn));const $=q._getViewModel(),J=$.getCursorStates();ne.length>0&&q.setSelections(ne),d(J,$.getCursorStates())}}class h extends S.EditorAction{constructor(){super({id:"editor.action.addCursorsToTop",label:i.localize(9,null),alias:"Add Cursors To Top",precondition:void 0})}run(F,q){if(!q.hasModel())return;const ie=q.getSelections(),ae=[];for(let J=ie[0].startLineNumber;J>=1;J--)ae.push(new v.Selection(J,ie[0].startColumn,J,ie[0].endColumn));const ne=q._getViewModel(),$=ne.getCursorStates();ae.length>0&&q.setSelections(ae),d($,ne.getCursorStates())}}class m{constructor(F,q,ie){this.selections=F,this.revealRange=q,this.revealScrollType=ie}}e.MultiCursorSessionResult=m;class C{static create(F,q){if(!F.hasModel())return null;const ie=q.getState();if(!F.hasTextFocus()&&ie.isRevealed&&ie.searchString.length>0)return new C(F,q,!1,ie.searchString,ie.wholeWord,ie.matchCase,null);let ae=!1,ne,$;const J=F.getSelections();J.length===1&&J[0].isEmpty()?(ae=!0,ne=!0,$=!0):(ne=ie.wholeWord,$=ie.matchCase);const Q=F.getSelection();let re,de=null;if(Q.isEmpty()){const he=F.getConfiguredWordAtPosition(Q.getStartPosition());if(!he)return null;re=he.word,de=new v.Selection(Q.startLineNumber,he.startColumn,Q.startLineNumber,he.endColumn)}else re=F.getModel().getValueInRange(Q).replace(/\r\n/g,`
+`);return new C(F,q,ae,re,ne,$,de)}constructor(F,q,ie,ae,ne,$,J){this._editor=F,this.findController=q,this.isDisconnectedFromFindController=ie,this.searchText=ae,this.wholeWord=ne,this.matchCase=$,this.currentMatch=J}addSelectionToNextFindMatch(){if(!this._editor.hasModel())return null;const F=this._getNextMatch();if(!F)return null;const q=this._editor.getSelections();return new m(q.concat(F),F,0)}moveSelectionToNextFindMatch(){if(!this._editor.hasModel())return null;const F=this._getNextMatch();if(!F)return null;const q=this._editor.getSelections();return new m(q.slice(0,q.length-1).concat(F),F,0)}_getNextMatch(){if(!this._editor.hasModel())return null;if(this.currentMatch){const ae=this.currentMatch;return this.currentMatch=null,ae}this.findController.highlightFindOptions();const F=this._editor.getSelections(),q=F[F.length-1],ie=this._editor.getModel().findNextMatch(this.searchText,q.getEndPosition(),!1,this.matchCase,this.wholeWord?this._editor.getOption(129):null,!1);return ie?new v.Selection(ie.range.startLineNumber,ie.range.startColumn,ie.range.endLineNumber,ie.range.endColumn):null}addSelectionToPreviousFindMatch(){if(!this._editor.hasModel())return null;const F=this._getPreviousMatch();if(!F)return null;const q=this._editor.getSelections();return new m(q.concat(F),F,0)}moveSelectionToPreviousFindMatch(){if(!this._editor.hasModel())return null;const F=this._getPreviousMatch();if(!F)return null;const q=this._editor.getSelections();return new m(q.slice(0,q.length-1).concat(F),F,0)}_getPreviousMatch(){if(!this._editor.hasModel())return null;if(this.currentMatch){const ae=this.currentMatch;return this.currentMatch=null,ae}this.findController.highlightFindOptions();const F=this._editor.getSelections(),q=F[F.length-1],ie=this._editor.getModel().findPreviousMatch(this.searchText,q.getStartPosition(),!1,this.matchCase,this.wholeWord?this._editor.getOption(129):null,!1);return ie?new v.Selection(ie.range.startLineNumber,ie.range.startColumn,ie.range.endLineNumber,ie.range.endColumn):null}selectAll(F){if(!this._editor.hasModel())return[];this.findController.highlightFindOptions();const q=this._editor.getModel();return F?q.findMatches(this.searchText,F,!1,this.matchCase,this.wholeWord?this._editor.getOption(129):null,!1,1073741824):q.findMatches(this.searchText,!0,!1,this.matchCase,this.wholeWord?this._editor.getOption(129):null,!1,1073741824)}}e.MultiCursorSession=C;class w extends E.Disposable{static get(F){return F.getContribution(w.ID)}constructor(F){super(),this._sessionDispose=this._register(new E.DisposableStore),this._editor=F,this._ignoreSelectionChange=!1,this._session=null}dispose(){this._endSession(),super.dispose()}_beginSessionIfNeeded(F){if(!this._session){const q=C.create(this._editor,F);if(!q)return;this._session=q;const ie={searchString:this._session.searchText};this._session.isDisconnectedFromFindController&&(ie.wholeWordOverride=1,ie.matchCaseOverride=1,ie.isRegexOverride=2),F.getState().change(ie,!1),this._sessionDispose.add(this._editor.onDidChangeCursorSelection(ae=>{this._ignoreSelectionChange||this._endSession()})),this._sessionDispose.add(this._editor.onDidBlurEditorText(()=>{this._endSession()})),this._sessionDispose.add(F.getState().onFindReplaceStateChange(ae=>{(ae.matchCase||ae.wholeWord)&&this._endSession()}))}}_endSession(){if(this._sessionDispose.clear(),this._session&&this._session.isDisconnectedFromFindController){const F={wholeWordOverride:0,matchCaseOverride:0,isRegexOverride:0};this._session.findController.getState().change(F,!1)}this._session=null}_setSelections(F){this._ignoreSelectionChange=!0,this._editor.setSelections(F),this._ignoreSelectionChange=!1}_expandEmptyToWord(F,q){if(!q.isEmpty())return q;const ie=this._editor.getConfiguredWordAtPosition(q.getStartPosition());return ie?new v.Selection(q.startLineNumber,ie.startColumn,q.startLineNumber,ie.endColumn):q}_applySessionResult(F){F&&(this._setSelections(F.selections),F.revealRange&&this._editor.revealRangeInCenterIfOutsideViewport(F.revealRange,F.revealScrollType))}getSession(F){return this._session}addSelectionToNextFindMatch(F){if(this._editor.hasModel()){if(!this._session){const q=this._editor.getSelections();if(q.length>1){const ae=F.getState().matchCase;if(!O(this._editor.getModel(),q,ae)){const $=this._editor.getModel(),J=[];for(let Q=0,re=q.length;Q<re;Q++)J[Q]=this._expandEmptyToWord($,q[Q]);this._editor.setSelections(J);return}}}this._beginSessionIfNeeded(F),this._session&&this._applySessionResult(this._session.addSelectionToNextFindMatch())}}addSelectionToPreviousFindMatch(F){this._beginSessionIfNeeded(F),this._session&&this._applySessionResult(this._session.addSelectionToPreviousFindMatch())}moveSelectionToNextFindMatch(F){this._beginSessionIfNeeded(F),this._session&&this._applySessionResult(this._session.moveSelectionToNextFindMatch())}moveSelectionToPreviousFindMatch(F){this._beginSessionIfNeeded(F),this._session&&this._applySessionResult(this._session.moveSelectionToPreviousFindMatch())}selectAll(F){if(!this._editor.hasModel())return;let q=null;const ie=F.getState();if(ie.isRevealed&&ie.searchString.length>0&&ie.isRegex){const ae=this._editor.getModel();ie.searchScope?q=ae.findMatches(ie.searchString,ie.searchScope,ie.isRegex,ie.matchCase,ie.wholeWord?this._editor.getOption(129):null,!1,1073741824):q=ae.findMatches(ie.searchString,!0,ie.isRegex,ie.matchCase,ie.wholeWord?this._editor.getOption(129):null,!1,1073741824)}else{if(this._beginSessionIfNeeded(F),!this._session)return;q=this._session.selectAll(ie.searchScope)}if(q.length>0){const ae=this._editor.getSelection();for(let ne=0,$=q.length;ne<$;ne++){const J=q[ne];if(J.range.intersectRanges(ae)){q[ne]=q[0],q[0]=J;break}}this._setSelections(q.map(ne=>new v.Selection(ne.range.startLineNumber,ne.range.startColumn,ne.range.endLineNumber,ne.range.endColumn)))}}}e.MultiCursorSelectionController=w,w.ID="editor.contrib.multiCursorController";class D extends S.EditorAction{run(F,q){const ie=w.get(q);if(!ie)return;const ae=q._getViewModel();if(ae){const ne=ae.getCursorStates(),$=a.CommonFindController.get(q);if($)this._run(ie,$);else{const J=F.get(f.IInstantiationService).createInstance(a.CommonFindController,q);this._run(ie,J),J.dispose()}d(ne,ae.getCursorStates())}}}e.MultiCursorSelectionControllerAction=D;class I extends D{constructor(){super({id:"editor.action.addSelectionToNextFindMatch",label:i.localize(10,null),alias:"Add Selection To Next Find Match",precondition:void 0,kbOpts:{kbExpr:b.EditorContextKeys.focus,primary:2082,weight:100},menuOpts:{menuId:n.MenuId.MenubarSelectionMenu,group:"3_multi",title:i.localize(11,null),order:5}})}_run(F,q){F.addSelectionToNextFindMatch(q)}}e.AddSelectionToNextFindMatchAction=I;class T extends D{constructor(){super({id:"editor.action.addSelectionToPreviousFindMatch",label:i.localize(12,null),alias:"Add Selection To Previous Find Match",precondition:void 0,menuOpts:{menuId:n.MenuId.MenubarSelectionMenu,group:"3_multi",title:i.localize(13,null),order:6}})}_run(F,q){F.addSelectionToPreviousFindMatch(q)}}e.AddSelectionToPreviousFindMatchAction=T;class A extends D{constructor(){super({id:"editor.action.moveSelectionToNextFindMatch",label:i.localize(14,null),alias:"Move Last Selection To Next Find Match",precondition:void 0,kbOpts:{kbExpr:b.EditorContextKeys.focus,primary:(0,y.KeyChord)(2089,2082),weight:100}})}_run(F,q){F.moveSelectionToNextFindMatch(q)}}e.MoveSelectionToNextFindMatchAction=A;class P extends D{constructor(){super({id:"editor.action.moveSelectionToPreviousFindMatch",label:i.localize(15,null),alias:"Move Last Selection To Previous Find Match",precondition:void 0})}_run(F,q){F.moveSelectionToPreviousFindMatch(q)}}e.MoveSelectionToPreviousFindMatchAction=P;class N extends D{constructor(){super({id:"editor.action.selectHighlights",label:i.localize(16,null),alias:"Select All Occurrences of Find Match",precondition:void 0,kbOpts:{kbExpr:b.EditorContextKeys.focus,primary:3114,weight:100},menuOpts:{menuId:n.MenuId.MenubarSelectionMenu,group:"3_multi",title:i.localize(17,null),order:7}})}_run(F,q){F.selectAll(q)}}e.SelectHighlightsAction=N;class M extends D{constructor(){super({id:"editor.action.changeAll",label:i.localize(18,null),alias:"Change All Occurrences",precondition:t.ContextKeyExpr.and(b.EditorContextKeys.writable,b.EditorContextKeys.editorTextFocus),kbOpts:{kbExpr:b.EditorContextKeys.editorTextFocus,primary:2108,weight:100},contextMenuOpts:{group:"1_modification",order:1.2}})}_run(F,q){F.selectAll(q)}}e.CompatChangeAll=M;class R{constructor(F,q,ie,ae,ne){this._model=F,this._searchText=q,this._matchCase=ie,this._wordSeparators=ae,this._modelVersionId=this._model.getVersionId(),this._cachedFindMatches=null,ne&&this._model===ne._model&&this._searchText===ne._searchText&&this._matchCase===ne._matchCase&&this._wordSeparators===ne._wordSeparators&&this._modelVersionId===ne._modelVersionId&&(this._cachedFindMatches=ne._cachedFindMatches)}findMatches(){return this._cachedFindMatches===null&&(this._cachedFindMatches=this._model.findMatches(this._searchText,!0,!1,this._matchCase,this._wordSeparators,!1).map(F=>F.range),this._cachedFindMatches.sort(_.Range.compareRangesUsingStarts)),this._cachedFindMatches}}let x=c=class extends E.Disposable{constructor(F,q){super(),this._languageFeaturesService=q,this.editor=F,this._isEnabled=F.getOption(107),this._decorations=F.createDecorationsCollection(),this.updateSoon=this._register(new k.RunOnceScheduler(()=>this._update(),300)),this.state=null,this._register(F.onDidChangeConfiguration(ae=>{this._isEnabled=F.getOption(107)})),this._register(F.onDidChangeCursorSelection(ae=>{this._isEnabled&&(ae.selection.isEmpty()?ae.reason===3?(this.state&&this._setState(null),this.updateSoon.schedule()):this._setState(null):this._update())})),this._register(F.onDidChangeModel(ae=>{this._setState(null)})),this._register(F.onDidChangeModelContent(ae=>{this._isEnabled&&this.updateSoon.schedule()}));const ie=a.CommonFindController.get(F);ie&&this._register(ie.getState().onFindReplaceStateChange(ae=>{this._update()})),this.updateSoon.schedule()}_update(){this._setState(c._createState(this.state,this._isEnabled,this.editor))}static _createState(F,q,ie){if(!q||!ie.hasModel())return null;const ae=ie.getSelection();if(ae.startLineNumber!==ae.endLineNumber)return null;const ne=w.get(ie);if(!ne)return null;const $=a.CommonFindController.get(ie);if(!$)return null;let J=ne.getSession($);if(!J){const de=ie.getSelections();if(de.length>1){const me=$.getState().matchCase;if(!O(ie.getModel(),de,me))return null}J=C.create(ie,$)}if(!J||J.currentMatch||/^[ \t]+$/.test(J.searchText)||J.searchText.length>200)return null;const Q=$.getState(),re=Q.matchCase;if(Q.isRevealed){let de=Q.searchString;re||(de=de.toLowerCase());let he=J.searchText;if(re||(he=he.toLowerCase()),de===he&&J.matchCase===Q.matchCase&&J.wholeWord===Q.wholeWord&&!Q.isRegex)return null}return new R(ie.getModel(),J.searchText,J.matchCase,J.wholeWord?ie.getOption(129):null,F)}_setState(F){if(this.state=F,!this.state){this._decorations.clear();return}if(!this.editor.hasModel())return;const q=this.editor.getModel();if(q.isTooLargeForTokenization())return;const ie=this.state.findMatches(),ae=this.editor.getSelections();ae.sort(_.Range.compareRangesUsingStarts);const ne=[];for(let re=0,de=0,he=ie.length,me=ae.length;re<he;){const X=ie[re];if(de>=me)ne.push(X),re++;else{const U=_.Range.compareRangesUsingStarts(X,ae[de]);U<0?((ae[de].isEmpty()||!_.Range.areIntersecting(X,ae[de]))&&ne.push(X),re++):(U>0||re++,de++)}}const $=this.editor.getOption(80)!=="off",J=this._languageFeaturesService.documentHighlightProvider.has(q)&&$,Q=ne.map(re=>({range:re,options:(0,u.getSelectionHighlightDecorationOptions)(J)}));this._decorations.set(Q)}dispose(){this._setState(null),super.dispose()}};e.SelectionHighlighter=x,x.ID="editor.contrib.selectionHighlighter",e.SelectionHighlighter=x=c=ke([ge(1,r.ILanguageFeaturesService)],x);function O(K,F,q){const ie=B(K,F[0],!q);for(let ae=1,ne=F.length;ae<ne;ae++){const $=F[ae];if($.isEmpty())return!1;const J=B(K,$,!q);if(ie!==J)return!1}return!0}function B(K,F,q){const ie=K.getValueInRange(F);return q?ie.toLowerCase():ie}class W extends S.EditorAction{constructor(){super({id:"editor.action.focusNextCursor",label:i.localize(19,null),metadata:{description:i.localize(20,null),args:[]},alias:"Focus Next Cursor",precondition:void 0})}run(F,q,ie){if(!q.hasModel())return;const ae=q._getViewModel();if(ae.cursorConfig.readOnly)return;ae.model.pushStackElement();const ne=Array.from(ae.getCursorStates()),$=ne.shift();$&&(ne.push($),ae.setCursorStates(ie.source,3,ne),ae.revealPrimaryCursor(ie.source,!0),d(ne,ae.getCursorStates()))}}e.FocusNextCursor=W;class V extends S.EditorAction{constructor(){super({id:"editor.action.focusPreviousCursor",label:i.localize(21,null),metadata:{description:i.localize(22,null),args:[]},alias:"Focus Previous Cursor",precondition:void 0})}run(F,q,ie){if(!q.hasModel())return;const ae=q._getViewModel();if(ae.cursorConfig.readOnly)return;ae.model.pushStackElement();const ne=Array.from(ae.getCursorStates()),$=ne.pop();$&&(ne.unshift($),ae.setCursorStates(ie.source,3,ne),ae.revealPrimaryCursor(ie.source,!0),d(ne,ae.getCursorStates()))}}e.FocusPreviousCursor=V,(0,S.registerEditorContribution)(w.ID,w,4),(0,S.registerEditorContribution)(x.ID,x,1),(0,S.registerEditorAction)(s),(0,S.registerEditorAction)(l),(0,S.registerEditorAction)(o),(0,S.registerEditorAction)(I),(0,S.registerEditorAction)(T),(0,S.registerEditorAction)(A),(0,S.registerEditorAction)(P),(0,S.registerEditorAction)(N),(0,S.registerEditorAction)(M),(0,S.registerEditorAction)(g),(0,S.registerEditorAction)(h),(0,S.registerEditorAction)(W),(0,S.registerEditorAction)(V)}),define(se[911],oe([1,0,728,13,48,14,19,12,2,153,16,33,5,21,31,41,18,381,15,47,53,330]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l){"use strict";var o,g;Object.defineProperty(e,"__esModule",{value:!0}),e.WordHighlighterContribution=e.getOccurrencesAcrossMultipleModels=e.getOccurrencesAtPosition=void 0;const h=new c.RawContextKey("hasWordHighlights",!1);function m(W,V,K,F){const q=W.ordered(V);return(0,E.first)(q.map(ie=>()=>Promise.resolve(ie.provideDocumentHighlights(V,K,F)).then(void 0,p.onUnexpectedExternalError)),k.isNonEmptyArray).then(ie=>{if(ie){const ae=new s.ResourceMap;return ae.set(V.uri,ie),ae}return new s.ResourceMap})}e.getOccurrencesAtPosition=m;function C(W,V,K,F,q,ie){const ae=W.ordered(V);return(0,E.first)(ae.map(ne=>()=>{const $=ie.filter(J=>(0,r.shouldSynchronizeModel)(J)).filter(J=>(0,l.score)(ne.selector,J.uri,J.getLanguageId(),!0,void 0,void 0)>0);return Promise.resolve(ne.provideMultiDocumentHighlights(V,K,$,q)).then(void 0,p.onUnexpectedExternalError)}),ne=>ne instanceof s.ResourceMap&&ne.size>0)}e.getOccurrencesAcrossMultipleModels=C;class w{constructor(V,K,F){this._model=V,this._selection=K,this._wordSeparators=F,this._wordRange=this._getCurrentWordRange(V,K),this._result=null}get result(){return this._result||(this._result=(0,E.createCancelablePromise)(V=>this._compute(this._model,this._selection,this._wordSeparators,V))),this._result}_getCurrentWordRange(V,K){const F=V.getWordAtPosition(K.getPosition());return F?new i.Range(K.startLineNumber,F.startColumn,K.startLineNumber,F.endColumn):null}isValid(V,K,F){const q=K.startLineNumber,ie=K.startColumn,ae=K.endColumn,ne=this._getCurrentWordRange(V,K);let $=!!(this._wordRange&&this._wordRange.equalsRange(ne));for(let J=0,Q=F.length;!$&&J<Q;J++){const re=F.getRange(J);re&&re.startLineNumber===q&&re.startColumn<=ie&&re.endColumn>=ae&&($=!0)}return $}cancel(){this.result.cancel()}}class D extends w{constructor(V,K,F,q){super(V,K,F),this._providers=q}_compute(V,K,F,q){return m(this._providers,V,K.getPosition(),q).then(ie=>ie||new s.ResourceMap)}}class I extends w{constructor(V,K,F,q,ie){super(V,K,F),this._providers=q,this._otherModels=ie}_compute(V,K,F,q){return C(this._providers,V,K.getPosition(),F,q,this._otherModels).then(ie=>ie||new s.ResourceMap)}}class T extends w{constructor(V,K,F,q,ie){super(V,K,q),this._otherModels=ie,this._selectionIsEmpty=K.isEmpty(),this._word=F}_compute(V,K,F,q){return(0,E.timeout)(250,q).then(()=>{const ie=new s.ResourceMap;let ae;if(this._word?ae=this._word:ae=V.getWordAtPosition(K.getPosition()),!ae)return new s.ResourceMap;const ne=[V,...this._otherModels];for(const $ of ne){if($.isDisposed())continue;const Q=$.findMatches(ae.word,!0,!1,!0,F,!1).map(re=>({range:re.range,kind:t.DocumentHighlightKind.Text}));Q&&ie.set($.uri,Q)}return ie})}isValid(V,K,F){const q=K.isEmpty();return this._selectionIsEmpty!==q?!1:super.isValid(V,K,F)}}function A(W,V,K,F,q){return W.has(V)?new D(V,K,q,W):new T(V,K,F,q,[])}function P(W,V,K,F,q,ie){return W.has(V)?new I(V,K,q,W,ie):new T(V,K,F,q,ie)}(0,b.registerModelAndPositionCommand)("_executeDocumentHighlights",async(W,V,K)=>{const F=W.get(u.ILanguageFeaturesService),q=await m(F.documentHighlightProvider,V,K,S.CancellationToken.None);return q?.get(V.uri)});let N=o=class{constructor(V,K,F,q,ie){this.toUnhook=new _.DisposableStore,this.workerRequestTokenId=0,this.workerRequestCompleted=!1,this.workerRequestValue=new s.ResourceMap,this.lastCursorPositionChangeTime=0,this.renderDecorationsTimer=-1,this.editor=V,this.providers=K,this.multiDocumentProviders=F,this.codeEditorService=ie,this._hasWordHighlights=h.bindTo(q),this._ignorePositionChangeEvent=!1,this.occurrencesHighlight=this.editor.getOption(80),this.model=this.editor.getModel(),this.toUnhook.add(V.onDidChangeCursorPosition(ae=>{this._ignorePositionChangeEvent||this.occurrencesHighlight!=="off"&&this._onPositionChanged(ae)})),this.toUnhook.add(V.onDidChangeModelContent(ae=>{this._stopAll()})),this.toUnhook.add(V.onDidChangeModel(ae=>{!ae.newModelUrl&&ae.oldModelUrl?this._stopSingular():o.query&&this._run()})),this.toUnhook.add(V.onDidChangeConfiguration(ae=>{const ne=this.editor.getOption(80);this.occurrencesHighlight!==ne&&(this.occurrencesHighlight=ne,this._stopAll())})),this.decorations=this.editor.createDecorationsCollection(),this.workerRequestTokenId=0,this.workerRequest=null,this.workerRequestCompleted=!1,this.lastCursorPositionChangeTime=0,this.renderDecorationsTimer=-1,o.query&&this._run()}hasDecorations(){return this.decorations.length>0}restore(){this.occurrencesHighlight!=="off"&&this._run()}_getSortedHighlights(){return this.decorations.getRanges().sort(i.Range.compareRangesUsingStarts)}moveNext(){const V=this._getSortedHighlights(),F=(V.findIndex(ie=>ie.containsPosition(this.editor.getPosition()))+1)%V.length,q=V[F];try{this._ignorePositionChangeEvent=!0,this.editor.setPosition(q.getStartPosition()),this.editor.revealRangeInCenterIfOutsideViewport(q);const ie=this._getWord();if(ie){const ae=this.editor.getModel().getLineContent(q.startLineNumber);(0,y.alert)(`${ae}, ${F+1} of ${V.length} for '${ie.word}'`)}}finally{this._ignorePositionChangeEvent=!1}}moveBack(){const V=this._getSortedHighlights(),F=(V.findIndex(ie=>ie.containsPosition(this.editor.getPosition()))-1+V.length)%V.length,q=V[F];try{this._ignorePositionChangeEvent=!0,this.editor.setPosition(q.getStartPosition()),this.editor.revealRangeInCenterIfOutsideViewport(q);const ie=this._getWord();if(ie){const ae=this.editor.getModel().getLineContent(q.startLineNumber);(0,y.alert)(`${ae}, ${F+1} of ${V.length} for '${ie.word}'`)}}finally{this._ignorePositionChangeEvent=!1}}_removeSingleDecorations(){if(!this.editor.hasModel())return;const V=o.storedDecorations.get(this.editor.getModel().uri);V&&(this.editor.removeDecorations(V),o.storedDecorations.delete(this.editor.getModel().uri),this.decorations.length>0&&(this.decorations.clear(),this._hasWordHighlights.set(!1)))}_removeAllDecorations(){const V=this.codeEditorService.listCodeEditors();for(const K of V){if(!K.hasModel())continue;const F=o.storedDecorations.get(K.getModel().uri);if(!F)continue;K.removeDecorations(F),o.storedDecorations.delete(K.getModel().uri);const q=M.get(K);q?.wordHighlighter&&q.wordHighlighter.decorations.length>0&&(q.wordHighlighter.decorations.clear(),q.wordHighlighter._hasWordHighlights.set(!1))}}_stopSingular(){var V,K,F,q;this._removeSingleDecorations(),this.editor.hasWidgetFocus()&&(((V=this.editor.getModel())===null||V===void 0?void 0:V.uri.scheme)!==d.Schemas.vscodeNotebookCell&&((F=(K=o.query)===null||K===void 0?void 0:K.modelInfo)===null||F===void 0?void 0:F.model.uri.scheme)!==d.Schemas.vscodeNotebookCell?(o.query=null,this._run()):!((q=o.query)===null||q===void 0)&&q.modelInfo&&(o.query.modelInfo=null)),this.renderDecorationsTimer!==-1&&(clearTimeout(this.renderDecorationsTimer),this.renderDecorationsTimer=-1),this.workerRequest!==null&&(this.workerRequest.cancel(),this.workerRequest=null),this.workerRequestCompleted||(this.workerRequestTokenId++,this.workerRequestCompleted=!0)}_stopAll(){this._removeAllDecorations(),this.renderDecorationsTimer!==-1&&(clearTimeout(this.renderDecorationsTimer),this.renderDecorationsTimer=-1),this.workerRequest!==null&&(this.workerRequest.cancel(),this.workerRequest=null),this.workerRequestCompleted||(this.workerRequestTokenId++,this.workerRequestCompleted=!0)}_onPositionChanged(V){var K;if(this.occurrencesHighlight==="off"){this._stopAll();return}if(V.reason!==3&&((K=this.editor.getModel())===null||K===void 0?void 0:K.uri.scheme)!==d.Schemas.vscodeNotebookCell){this._stopAll();return}this._run()}_getWord(){const V=this.editor.getSelection(),K=V.startLineNumber,F=V.startColumn;return this.model.isDisposed()?null:this.model.getWordAtPosition({lineNumber:K,column:F})}getOtherModelsToHighlight(V){if(!V)return[];if(V.uri.scheme===d.Schemas.vscodeNotebookCell){const ie=[],ae=this.codeEditorService.listCodeEditors();for(const ne of ae){const $=ne.getModel();$&&$!==V&&$.uri.scheme===d.Schemas.vscodeNotebookCell&&ie.push($)}return ie}const F=[],q=this.codeEditorService.listCodeEditors();for(const ie of q){if(!(0,v.isDiffEditor)(ie))continue;const ae=ie.getModel();ae&&V===ae.modified&&F.push(ae.modified)}if(F.length)return F;if(this.occurrencesHighlight==="singleFile")return[];for(const ie of q){const ae=ie.getModel();ae&&ae!==V&&F.push(ae)}return F}_run(){var V,K;let F;if(this.editor.hasWidgetFocus()){const q=this.editor.getSelection();if(!q||q.startLineNumber!==q.endLineNumber){this._stopAll();return}const ie=q.startColumn,ae=q.endColumn,ne=this._getWord();if(!ne||ne.startColumn>ie||ne.endColumn<ae){o.query=null,this._stopAll();return}F=this.workerRequest&&this.workerRequest.isValid(this.model,q,this.decorations),o.query={modelInfo:{model:this.model,selection:q},word:ne}}else if(o.query===null)return;if(this.lastCursorPositionChangeTime=new Date().getTime(),F)this.workerRequestCompleted&&this.renderDecorationsTimer!==-1&&(clearTimeout(this.renderDecorationsTimer),this.renderDecorationsTimer=-1,this._beginRenderDecorations());else{this._stopAll();const q=++this.workerRequestTokenId;this.workerRequestCompleted=!1;const ie=this.getOtherModelsToHighlight(this.editor.getModel()),ae=!!(!o.query.modelInfo&&o.query.word||((V=o.query.modelInfo)===null||V===void 0?void 0:V.model.uri)!==this.model.uri);!o.query.modelInfo||o.query.modelInfo.model.uri!==this.model.uri?this.workerRequest=this.computeWithModel(this.model,this.editor.getSelection(),ae?o.query.word:null,ie):this.workerRequest=this.computeWithModel(o.query.modelInfo.model,o.query.modelInfo.selection,o.query.word,ie),(K=this.workerRequest)===null||K===void 0||K.result.then(ne=>{q===this.workerRequestTokenId&&(this.workerRequestCompleted=!0,this.workerRequestValue=ne||[],this._beginRenderDecorations())},p.onUnexpectedError)}}computeWithModel(V,K,F,q){return q.length?P(this.multiDocumentProviders,V,K,F,this.editor.getOption(129),q):A(this.providers,V,K,F,this.editor.getOption(129))}_beginRenderDecorations(){const V=new Date().getTime(),K=this.lastCursorPositionChangeTime+250;V>=K?(this.renderDecorationsTimer=-1,this.renderDecorations()):this.renderDecorationsTimer=setTimeout(()=>{this.renderDecorations()},K-V)}renderDecorations(){var V,K,F;this.renderDecorationsTimer=-1;const q=this.codeEditorService.listCodeEditors();for(const ie of q){const ae=M.get(ie);if(!ae)continue;const ne=[],$=(V=ie.getModel())===null||V===void 0?void 0:V.uri;if($&&this.workerRequestValue.has($)){const J=o.storedDecorations.get($),Q=this.workerRequestValue.get($);if(Q)for(const de of Q)ne.push({range:de.range,options:(0,f.getHighlightDecorationOptions)(de.kind)});let re=[];ie.changeDecorations(de=>{re=de.deltaDecorations(J??[],ne)}),o.storedDecorations=o.storedDecorations.set($,re),ne.length>0&&((K=ae.wordHighlighter)===null||K===void 0||K.decorations.set(ne),(F=ae.wordHighlighter)===null||F===void 0||F._hasWordHighlights.set(!0))}}}dispose(){this._stopSingular(),this.toUnhook.dispose()}};N.storedDecorations=new s.ResourceMap,N.query=null,N=o=ke([ge(4,a.ICodeEditorService)],N);let M=g=class extends _.Disposable{static get(V){return V.getContribution(g.ID)}constructor(V,K,F,q){super(),this._wordHighlighter=null;const ie=()=>{V.hasModel()&&!V.getModel().isTooLargeForTokenization()&&(this._wordHighlighter=new N(V,F.documentHighlightProvider,F.multiDocumentHighlightProvider,K,q))};this._register(V.onDidChangeModel(ae=>{this._wordHighlighter&&(this._wordHighlighter.dispose(),this._wordHighlighter=null),ie()})),ie()}get wordHighlighter(){return this._wordHighlighter}saveViewState(){return!!(this._wordHighlighter&&this._wordHighlighter.hasDecorations())}moveNext(){var V;(V=this._wordHighlighter)===null||V===void 0||V.moveNext()}moveBack(){var V;(V=this._wordHighlighter)===null||V===void 0||V.moveBack()}restoreViewState(V){this._wordHighlighter&&V&&this._wordHighlighter.restore()}dispose(){this._wordHighlighter&&(this._wordHighlighter.dispose(),this._wordHighlighter=null),super.dispose()}};e.WordHighlighterContribution=M,M.ID="editor.contrib.wordHighlighter",e.WordHighlighterContribution=M=g=ke([ge(1,c.IContextKeyService),ge(2,u.ILanguageFeaturesService),ge(3,a.ICodeEditorService)],M);class R extends b.EditorAction{constructor(V,K){super(K),this._isNext=V}run(V,K){const F=M.get(K);F&&(this._isNext?F.moveNext():F.moveBack())}}class x extends R{constructor(){super(!0,{id:"editor.action.wordHighlight.next",label:L.localize(0,null),alias:"Go to Next Symbol Highlight",precondition:h,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:65,weight:100}})}}class O extends R{constructor(){super(!1,{id:"editor.action.wordHighlight.prev",label:L.localize(1,null),alias:"Go to Previous Symbol Highlight",precondition:h,kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:1089,weight:100}})}}class B extends b.EditorAction{constructor(){super({id:"editor.action.wordHighlight.trigger",label:L.localize(2,null),alias:"Trigger Symbol Highlight",precondition:h.toNegated(),kbOpts:{kbExpr:n.EditorContextKeys.editorTextFocus,primary:0,weight:100}})}run(V,K,F){const q=M.get(K);q&&q.restoreViewState(!0)}}(0,b.registerEditorContribution)(M.ID,M,0),(0,b.registerEditorAction)(x),(0,b.registerEditorAction)(O),(0,b.registerEditorAction)(B)}),define(se[912],oe([1,0,7,158,39,170,2,55,5,38,483]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ZoneWidget=e.OverlayWidgetDelegate=void 0;const b=new y.Color(new y.RGBA(0,122,204)),a={showArrow:!0,showFrame:!0,className:"",frameColor:b,arrowColor:b,keepEditorSelection:!1},i="vs.editor.contrib.zoneWidget";class n{constructor(c,d,s,l,o,g,h,m){this.id="",this.domNode=c,this.afterLineNumber=d,this.afterColumn=s,this.heightInLines=l,this.showInHiddenAreas=h,this.ordinal=m,this._onDomNodeTop=o,this._onComputedHeight=g}onDomNodeTop(c){this._onDomNodeTop(c)}onComputedHeight(c){this._onComputedHeight(c)}}class t{constructor(c,d){this._id=c,this._domNode=d}getId(){return this._id}getDomNode(){return this._domNode}getPosition(){return null}}e.OverlayWidgetDelegate=t;class r{constructor(c){this._editor=c,this._ruleName=r._IdGenerator.nextId(),this._decorations=this._editor.createDecorationsCollection(),this._color=null,this._height=-1}dispose(){this.hide(),L.removeCSSRulesContainingSelector(this._ruleName)}set color(c){this._color!==c&&(this._color=c,this._updateStyle())}set height(c){this._height!==c&&(this._height=c,this._updateStyle())}_updateStyle(){L.removeCSSRulesContainingSelector(this._ruleName),L.createCSSRule(`.monaco-editor ${this._ruleName}`,`border-style: solid; border-color: transparent; border-bottom-color: ${this._color}; border-width: ${this._height}px; bottom: -${this._height}px; margin-left: -${this._height}px; `)}show(c){c.column===1&&(c={lineNumber:c.lineNumber,column:2}),this._decorations.set([{range:_.Range.fromPositions(c),options:{description:"zone-widget-arrow",className:this._ruleName,stickiness:1}}])}hide(){this._decorations.clear()}}r._IdGenerator=new E.IdGenerator(".arrow-decoration-");class u{constructor(c,d={}){this._arrow=null,this._overlayWidget=null,this._resizeSash=null,this._viewZone=null,this._disposables=new S.DisposableStore,this.container=null,this._isShowing=!1,this.editor=c,this._positionMarkerId=this.editor.createDecorationsCollection(),this.options=p.deepClone(d),p.mixin(this.options,a,!1),this.domNode=document.createElement("div"),this.options.isAccessible||(this.domNode.setAttribute("aria-hidden","true"),this.domNode.setAttribute("role","presentation")),this._disposables.add(this.editor.onDidLayoutChange(s=>{const l=this._getWidth(s);this.domNode.style.width=l+"px",this.domNode.style.left=this._getLeft(s)+"px",this._onWidth(l)}))}dispose(){this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),this._viewZone&&this.editor.changeViewZones(c=>{this._viewZone&&c.removeZone(this._viewZone.id),this._viewZone=null}),this._positionMarkerId.clear(),this._disposables.dispose()}create(){this.domNode.classList.add("zone-widget"),this.options.className&&this.domNode.classList.add(this.options.className),this.container=document.createElement("div"),this.container.classList.add("zone-widget-container"),this.domNode.appendChild(this.container),this.options.showArrow&&(this._arrow=new r(this.editor),this._disposables.add(this._arrow)),this._fillContainer(this.container),this._initSash(),this._applyStyles()}style(c){c.frameColor&&(this.options.frameColor=c.frameColor),c.arrowColor&&(this.options.arrowColor=c.arrowColor),this._applyStyles()}_applyStyles(){if(this.container&&this.options.frameColor){const c=this.options.frameColor.toString();this.container.style.borderTopColor=c,this.container.style.borderBottomColor=c}if(this._arrow&&this.options.arrowColor){const c=this.options.arrowColor.toString();this._arrow.color=c}}_getWidth(c){return c.width-c.minimap.minimapWidth-c.verticalScrollbarWidth}_getLeft(c){return c.minimap.minimapWidth>0&&c.minimap.minimapLeft===0?c.minimap.minimapWidth:0}_onViewZoneTop(c){this.domNode.style.top=c+"px"}_onViewZoneHeight(c){var d;if(this.domNode.style.height=`${c}px`,this.container){const s=c-this._decoratingElementsHeight();this.container.style.height=`${s}px`;const l=this.editor.getLayoutInfo();this._doLayout(s,this._getWidth(l))}(d=this._resizeSash)===null||d===void 0||d.layout()}get position(){const c=this._positionMarkerId.getRange(0);if(c)return c.getStartPosition()}show(c,d){const s=_.Range.isIRange(c)?_.Range.lift(c):_.Range.fromPositions(c);this._isShowing=!0,this._showImpl(s,d),this._isShowing=!1,this._positionMarkerId.set([{range:s,options:v.ModelDecorationOptions.EMPTY}])}hide(){var c;this._viewZone&&(this.editor.changeViewZones(d=>{this._viewZone&&d.removeZone(this._viewZone.id)}),this._viewZone=null),this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),(c=this._arrow)===null||c===void 0||c.hide(),this._positionMarkerId.clear()}_decoratingElementsHeight(){const c=this.editor.getOption(66);let d=0;if(this.options.showArrow){const s=Math.round(c/3);d+=2*s}if(this.options.showFrame){const s=Math.round(c/9);d+=2*s}return d}_showImpl(c,d){const s=c.getStartPosition(),l=this.editor.getLayoutInfo(),o=this._getWidth(l);this.domNode.style.width=`${o}px`,this.domNode.style.left=this._getLeft(l)+"px";const g=document.createElement("div");g.style.overflow="hidden";const h=this.editor.getOption(66);if(!this.options.allowUnlimitedHeight){const I=Math.max(12,this.editor.getLayoutInfo().height/h*.8);d=Math.min(d,I)}let m=0,C=0;if(this._arrow&&this.options.showArrow&&(m=Math.round(h/3),this._arrow.height=m,this._arrow.show(s)),this.options.showFrame&&(C=Math.round(h/9)),this.editor.changeViewZones(I=>{this._viewZone&&I.removeZone(this._viewZone.id),this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),this.domNode.style.top="-1000px",this._viewZone=new n(g,s.lineNumber,s.column,d,T=>this._onViewZoneTop(T),T=>this._onViewZoneHeight(T),this.options.showInHiddenAreas,this.options.ordinal),this._viewZone.id=I.addZone(this._viewZone),this._overlayWidget=new t(i+this._viewZone.id,this.domNode),this.editor.addOverlayWidget(this._overlayWidget)}),this.container&&this.options.showFrame){const I=this.options.frameWidth?this.options.frameWidth:C;this.container.style.borderTopWidth=I+"px",this.container.style.borderBottomWidth=I+"px"}const w=d*h-this._decoratingElementsHeight();this.container&&(this.container.style.top=m+"px",this.container.style.height=w+"px",this.container.style.overflow="hidden"),this._doLayout(w,o),this.options.keepEditorSelection||this.editor.setSelection(c);const D=this.editor.getModel();if(D){const I=D.validateRange(new _.Range(c.startLineNumber,1,c.endLineNumber+1,1));this.revealRange(I,I.startLineNumber===D.getLineCount())}}revealRange(c,d){d?this.editor.revealLineNearTop(c.endLineNumber,0):this.editor.revealRange(c,0)}setCssClass(c,d){this.container&&(d&&this.container.classList.remove(d),this.container.classList.add(c))}_onWidth(c){}_doLayout(c,d){}_relayout(c){this._viewZone&&this._viewZone.heightInLines!==c&&this.editor.changeViewZones(d=>{this._viewZone&&(this._viewZone.heightInLines=c,d.layoutZone(this._viewZone.id))})}_initSash(){if(this._resizeSash)return;this._resizeSash=this._disposables.add(new k.Sash(this.domNode,this,{orientation:1})),this.options.isResizeable||(this._resizeSash.state=0);let c;this._disposables.add(this._resizeSash.onDidStart(d=>{this._viewZone&&(c={startY:d.startY,heightInLines:this._viewZone.heightInLines})})),this._disposables.add(this._resizeSash.onDidEnd(()=>{c=void 0})),this._disposables.add(this._resizeSash.onDidChange(d=>{if(c){const s=(d.currentY-c.startY)/this.editor.getOption(66),l=s<0?Math.ceil(s):Math.floor(s),o=c.heightInLines+l;o>5&&o<35&&this._relayout(o)}}))}getHorizontalSashLeft(){return 0}getHorizontalSashTop(){return(this.domNode.style.height===null?0:parseInt(this.domNode.style.height))-this._decoratingElementsHeight()/2}getHorizontalSashWidth(){const c=this.editor.getLayoutInfo();return c.width-c.minimap.minimapWidth}}e.ZoneWidget=u}),define(se[142],oe([1,0,7,78,42,26,28,39,6,55,16,33,168,912,706,141,15,45,8,29,474]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.peekViewEditorMatchHighlightBorder=e.peekViewEditorMatchHighlight=e.peekViewResultsMatchHighlight=e.peekViewEditorStickyScrollBackground=e.peekViewEditorGutterBackground=e.peekViewEditorBackground=e.peekViewResultsSelectionForeground=e.peekViewResultsSelectionBackground=e.peekViewResultsFileForeground=e.peekViewResultsMatchForeground=e.peekViewResultsBackground=e.peekViewBorder=e.peekViewTitleInfoForeground=e.peekViewTitleForeground=e.peekViewTitleBackground=e.PeekViewWidget=e.getOuterEditor=e.PeekContext=e.IPeekViewService=void 0,e.IPeekViewService=(0,c.createDecorator)("IPeekViewService"),(0,f.registerSingleton)(e.IPeekViewService,class{constructor(){this._widgets=new Map}addExclusiveWidget(m,C){const w=this._widgets.get(m);w&&(w.listener.dispose(),w.widget.dispose());const D=()=>{const I=this._widgets.get(m);I&&I.widget===C&&(I.listener.dispose(),this._widgets.delete(m))};this._widgets.set(m,{widget:C,listener:C.onDidClose(D)})}},1);var s;(function(m){m.inPeekEditor=new u.RawContextKey("inReferenceSearchEditor",!0,t.localize(0,null)),m.notInPeekEditor=m.inPeekEditor.toNegated()})(s||(e.PeekContext=s={}));let l=class{constructor(C,w){C instanceof i.EmbeddedCodeEditorWidget&&s.inPeekEditor.bindTo(w)}dispose(){}};l.ID="editor.contrib.referenceController",l=ke([ge(1,u.IContextKeyService)],l),(0,b.registerEditorContribution)(l.ID,l,0);function o(m){const C=m.get(a.ICodeEditorService).getFocusedCodeEditor();return C instanceof i.EmbeddedCodeEditorWidget?C.getParentEditor():C}e.getOuterEditor=o;const g={headerBackgroundColor:p.Color.white,primaryHeadingColor:p.Color.fromHex("#333333"),secondaryHeadingColor:p.Color.fromHex("#6c6c6cb3")};let h=class extends n.ZoneWidget{constructor(C,w,D){super(C,w),this.instantiationService=D,this._onDidClose=new _.Emitter,this.onDidClose=this._onDidClose.event,v.mixin(this.options,g,!1)}dispose(){this.disposed||(this.disposed=!0,super.dispose(),this._onDidClose.fire(this))}style(C){const w=this.options;C.headerBackgroundColor&&(w.headerBackgroundColor=C.headerBackgroundColor),C.primaryHeadingColor&&(w.primaryHeadingColor=C.primaryHeadingColor),C.secondaryHeadingColor&&(w.secondaryHeadingColor=C.secondaryHeadingColor),super.style(C)}_applyStyles(){super._applyStyles();const C=this.options;this._headElement&&C.headerBackgroundColor&&(this._headElement.style.backgroundColor=C.headerBackgroundColor.toString()),this._primaryHeading&&C.primaryHeadingColor&&(this._primaryHeading.style.color=C.primaryHeadingColor.toString()),this._secondaryHeading&&C.secondaryHeadingColor&&(this._secondaryHeading.style.color=C.secondaryHeadingColor.toString()),this._bodyElement&&C.frameColor&&(this._bodyElement.style.borderColor=C.frameColor.toString())}_fillContainer(C){this.setCssClass("peekview-widget"),this._headElement=L.$(".head"),this._bodyElement=L.$(".body"),this._fillHead(this._headElement),this._fillBody(this._bodyElement),C.appendChild(this._headElement),C.appendChild(this._bodyElement)}_fillHead(C,w){this._titleElement=L.$(".peekview-title"),this.options.supportOnTitleClick&&(this._titleElement.classList.add("clickable"),L.addStandardDisposableListener(this._titleElement,"click",T=>this._onTitleClick(T))),L.append(this._headElement,this._titleElement),this._fillTitleIcon(this._titleElement),this._primaryHeading=L.$("span.filename"),this._secondaryHeading=L.$("span.dirname"),this._metaHeading=L.$("span.meta"),L.append(this._titleElement,this._primaryHeading,this._secondaryHeading,this._metaHeading);const D=L.$(".peekview-actions");L.append(this._headElement,D);const I=this._getActionBarOptions();this._actionbarWidget=new k.ActionBar(D,I),this._disposables.add(this._actionbarWidget),w||this._actionbarWidget.push(new y.Action("peekview.close",t.localize(1,null),S.ThemeIcon.asClassName(E.Codicon.close),!0,()=>(this.dispose(),Promise.resolve())),{label:!1,icon:!0})}_fillTitleIcon(C){}_getActionBarOptions(){return{actionViewItemProvider:r.createActionViewItem.bind(void 0,this.instantiationService),orientation:0}}_onTitleClick(C){}setTitle(C,w){this._primaryHeading&&this._secondaryHeading&&(this._primaryHeading.innerText=C,this._primaryHeading.setAttribute("title",C),w?this._secondaryHeading.innerText=w:L.clearNode(this._secondaryHeading))}setMetaTitle(C){this._metaHeading&&(C?(this._metaHeading.innerText=C,L.show(this._metaHeading)):L.hide(this._metaHeading))}_doLayout(C,w){if(!this._isShowing&&C<0){this.dispose();return}const D=Math.ceil(this.editor.getOption(66)*1.2),I=Math.round(C-(D+2));this._doLayoutHead(D,w),this._doLayoutBody(I,w)}_doLayoutHead(C,w){this._headElement&&(this._headElement.style.height=`${C}px`,this._headElement.style.lineHeight=this._headElement.style.height)}_doLayoutBody(C,w){this._bodyElement&&(this._bodyElement.style.height=`${C}px`)}};e.PeekViewWidget=h,e.PeekViewWidget=h=ke([ge(2,c.IInstantiationService)],h),e.peekViewTitleBackground=(0,d.registerColor)("peekViewTitle.background",{dark:"#252526",light:"#F3F3F3",hcDark:p.Color.black,hcLight:p.Color.white},t.localize(2,null)),e.peekViewTitleForeground=(0,d.registerColor)("peekViewTitleLabel.foreground",{dark:p.Color.white,light:p.Color.black,hcDark:p.Color.white,hcLight:d.editorForeground},t.localize(3,null)),e.peekViewTitleInfoForeground=(0,d.registerColor)("peekViewTitleDescription.foreground",{dark:"#ccccccb3",light:"#616161",hcDark:"#FFFFFF99",hcLight:"#292929"},t.localize(4,null)),e.peekViewBorder=(0,d.registerColor)("peekView.border",{dark:d.editorInfoForeground,light:d.editorInfoForeground,hcDark:d.contrastBorder,hcLight:d.contrastBorder},t.localize(5,null)),e.peekViewResultsBackground=(0,d.registerColor)("peekViewResult.background",{dark:"#252526",light:"#F3F3F3",hcDark:p.Color.black,hcLight:p.Color.white},t.localize(6,null)),e.peekViewResultsMatchForeground=(0,d.registerColor)("peekViewResult.lineForeground",{dark:"#bbbbbb",light:"#646465",hcDark:p.Color.white,hcLight:d.editorForeground},t.localize(7,null)),e.peekViewResultsFileForeground=(0,d.registerColor)("peekViewResult.fileForeground",{dark:p.Color.white,light:"#1E1E1E",hcDark:p.Color.white,hcLight:d.editorForeground},t.localize(8,null)),e.peekViewResultsSelectionBackground=(0,d.registerColor)("peekViewResult.selectionBackground",{dark:"#3399ff33",light:"#3399ff33",hcDark:null,hcLight:null},t.localize(9,null)),e.peekViewResultsSelectionForeground=(0,d.registerColor)("peekViewResult.selectionForeground",{dark:p.Color.white,light:"#6C6C6C",hcDark:p.Color.white,hcLight:d.editorForeground},t.localize(10,null)),e.peekViewEditorBackground=(0,d.registerColor)("peekViewEditor.background",{dark:"#001F33",light:"#F2F8FC",hcDark:p.Color.black,hcLight:p.Color.white},t.localize(11,null)),e.peekViewEditorGutterBackground=(0,d.registerColor)("peekViewEditorGutter.background",{dark:e.peekViewEditorBackground,light:e.peekViewEditorBackground,hcDark:e.peekViewEditorBackground,hcLight:e.peekViewEditorBackground},t.localize(12,null)),e.peekViewEditorStickyScrollBackground=(0,d.registerColor)("peekViewEditorStickyScroll.background",{dark:e.peekViewEditorBackground,light:e.peekViewEditorBackground,hcDark:e.peekViewEditorBackground,hcLight:e.peekViewEditorBackground},t.localize(13,null)),e.peekViewResultsMatchHighlight=(0,d.registerColor)("peekViewResult.matchHighlightBackground",{dark:"#ea5c004d",light:"#ea5c004d",hcDark:null,hcLight:null},t.localize(14,null)),e.peekViewEditorMatchHighlight=(0,d.registerColor)("peekViewEditor.matchHighlightBackground",{dark:"#ff8f0099",light:"#f5d802de",hcDark:null,hcLight:null},t.localize(15,null)),e.peekViewEditorMatchHighlightBorder=(0,d.registerColor)("peekViewEditor.matchHighlightBorder",{dark:null,light:null,hcDark:d.activeContrastBorder,hcLight:d.activeContrastBorder},t.localize(16,null))}),define(se[913],oe([1,0,7,77,13,39,6,2,49,11,5,142,679,141,30,15,8,164,97,57,804,29,23,462]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o){"use strict";var g;Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerNavigationWidget=void 0;class h{constructor(O,B,W,V,K){this._openerService=V,this._labelService=K,this._lines=0,this._longestLineLength=0,this._relatedDiagnostics=new WeakMap,this._disposables=new p.DisposableStore,this._editor=B;const F=document.createElement("div");F.className="descriptioncontainer",this._messageBlock=document.createElement("div"),this._messageBlock.classList.add("message"),this._messageBlock.setAttribute("aria-live","assertive"),this._messageBlock.setAttribute("role","alert"),F.appendChild(this._messageBlock),this._relatedBlock=document.createElement("div"),F.appendChild(this._relatedBlock),this._disposables.add(L.addStandardDisposableListener(this._relatedBlock,"click",q=>{q.preventDefault();const ie=this._relatedDiagnostics.get(q.target);ie&&W(ie)})),this._scrollable=new k.ScrollableElement(F,{horizontal:1,vertical:1,useShadows:!1,horizontalScrollbarSize:6,verticalScrollbarSize:6}),O.appendChild(this._scrollable.getDomNode()),this._disposables.add(this._scrollable.onScroll(q=>{F.style.left=`-${q.scrollLeft}px`,F.style.top=`-${q.scrollTop}px`})),this._disposables.add(this._scrollable)}dispose(){(0,p.dispose)(this._disposables)}update(O){const{source:B,message:W,relatedInformation:V,code:K}=O;let F=(B?.length||0)+2;K&&(typeof K=="string"?F+=K.length:F+=K.value.length);const q=(0,v.splitLines)(W);this._lines=q.length,this._longestLineLength=0;for(const J of q)this._longestLineLength=Math.max(J.length+F,this._longestLineLength);L.clearNode(this._messageBlock),this._messageBlock.setAttribute("aria-label",this.getAriaLabel(O)),this._editor.applyFontInfo(this._messageBlock);let ie=this._messageBlock;for(const J of q)ie=document.createElement("div"),ie.innerText=J,J===""&&(ie.style.height=this._messageBlock.style.lineHeight),this._messageBlock.appendChild(ie);if(B||K){const J=document.createElement("span");if(J.classList.add("details"),ie.appendChild(J),B){const Q=document.createElement("span");Q.innerText=B,Q.classList.add("source"),J.appendChild(Q)}if(K)if(typeof K=="string"){const Q=document.createElement("span");Q.innerText=`(${K})`,Q.classList.add("code"),J.appendChild(Q)}else{this._codeLink=L.$("a.code-link"),this._codeLink.setAttribute("href",`${K.target.toString()}`),this._codeLink.onclick=re=>{this._openerService.open(K.target,{allowCommands:!0}),re.preventDefault(),re.stopPropagation()};const Q=L.append(this._codeLink,L.$("span"));Q.innerText=K.value,J.appendChild(this._codeLink)}}if(L.clearNode(this._relatedBlock),this._editor.applyFontInfo(this._relatedBlock),(0,y.isNonEmptyArray)(V)){const J=this._relatedBlock.appendChild(document.createElement("div"));J.style.paddingTop=`${Math.floor(this._editor.getOption(66)*.66)}px`,this._lines+=1;for(const Q of V){const re=document.createElement("div"),de=document.createElement("a");de.classList.add("filename"),de.innerText=`${this._labelService.getUriBasenameLabel(Q.resource)}(${Q.startLineNumber}, ${Q.startColumn}): `,de.title=this._labelService.getUriLabel(Q.resource),this._relatedDiagnostics.set(de,Q);const he=document.createElement("span");he.innerText=Q.message,re.appendChild(de),re.appendChild(he),this._lines+=1,J.appendChild(re)}}const ae=this._editor.getOption(50),ne=Math.ceil(ae.typicalFullwidthCharacterWidth*this._longestLineLength*.75),$=ae.lineHeight*this._lines;this._scrollable.setScrollDimensions({scrollWidth:ne,scrollHeight:$})}layout(O,B){this._scrollable.getDomNode().style.height=`${O}px`,this._scrollable.getDomNode().style.width=`${B}px`,this._scrollable.setScrollDimensions({width:B,height:O})}getHeightInLines(){return Math.min(17,this._lines)}getAriaLabel(O){let B="";switch(O.severity){case c.MarkerSeverity.Error:B=i.localize(0,null);break;case c.MarkerSeverity.Warning:B=i.localize(1,null);break;case c.MarkerSeverity.Info:B=i.localize(2,null);break;case c.MarkerSeverity.Hint:B=i.localize(3,null);break}let W=i.localize(4,null,B,O.startLineNumber+":"+O.startColumn);const V=this._editor.getModel();return V&&O.startLineNumber<=V.getLineCount()&&O.startLineNumber>=1&&(W=`${V.getLineContent(O.startLineNumber)}, ${W}`),W}}let m=g=class extends a.PeekViewWidget{constructor(O,B,W,V,K,F,q){super(O,{showArrow:!0,showFrame:!0,isAccessible:!0,frameWidth:1},K),this._themeService=B,this._openerService=W,this._menuService=V,this._contextKeyService=F,this._labelService=q,this._callOnDispose=new p.DisposableStore,this._onDidSelectRelatedInformation=new S.Emitter,this.onDidSelectRelatedInformation=this._onDidSelectRelatedInformation.event,this._severity=c.MarkerSeverity.Warning,this._backgroundColor=E.Color.white,this._applyTheme(B.getColorTheme()),this._callOnDispose.add(B.onDidColorThemeChange(this._applyTheme.bind(this))),this.create()}_applyTheme(O){this._backgroundColor=O.getColor(R);let B=I,W=T;this._severity===c.MarkerSeverity.Warning?(B=A,W=P):this._severity===c.MarkerSeverity.Info&&(B=N,W=M);const V=O.getColor(B),K=O.getColor(W);this.style({arrowColor:V,frameColor:V,headerBackgroundColor:K,primaryHeadingColor:O.getColor(a.peekViewTitleForeground),secondaryHeadingColor:O.getColor(a.peekViewTitleInfoForeground)})}_applyStyles(){this._parentContainer&&(this._parentContainer.style.backgroundColor=this._backgroundColor?this._backgroundColor.toString():""),super._applyStyles()}dispose(){this._callOnDispose.dispose(),super.dispose()}_fillHead(O){super._fillHead(O),this._disposables.add(this._actionbarWidget.actionRunner.onWillRun(V=>this.editor.focus()));const B=[],W=this._menuService.createMenu(g.TitleMenu,this._contextKeyService);(0,n.createAndFillInActionBarActions)(W,void 0,B),this._actionbarWidget.push(B,{label:!1,icon:!0,index:0}),W.dispose()}_fillTitleIcon(O){this._icon=L.append(O,L.$(""))}_fillBody(O){this._parentContainer=O,O.classList.add("marker-widget"),this._parentContainer.tabIndex=0,this._parentContainer.setAttribute("role","tooltip"),this._container=document.createElement("div"),O.appendChild(this._container),this._message=new h(this._container,this.editor,B=>this._onDidSelectRelatedInformation.fire(B),this._openerService,this._labelService),this._disposables.add(this._message)}show(){throw new Error("call showAtMarker")}showAtMarker(O,B,W){this._container.classList.remove("stale"),this._message.update(O),this._severity=O.severity,this._applyTheme(this._themeService.getColorTheme());const V=b.Range.lift(O),K=this.editor.getPosition(),F=K&&V.containsPosition(K)?K:V.getStartPosition();super.show(F,this.computeRequiredHeight());const q=this.editor.getModel();if(q){const ie=W>1?i.localize(5,null,B,W):i.localize(6,null,B,W);this.setTitle((0,_.basename)(q.uri),ie)}this._icon.className=`codicon ${s.SeverityIcon.className(c.MarkerSeverity.toSeverity(this._severity))}`,this.editor.revealPositionNearTop(F,0),this.editor.focus()}updateMarker(O){this._container.classList.remove("stale"),this._message.update(O)}showStale(){this._container.classList.add("stale"),this._relayout()}_doLayoutBody(O,B){super._doLayoutBody(O,B),this._heightInPixel=O,this._message.layout(O,B),this._container.style.height=`${O}px`}_onWidth(O){this._message.layout(this._heightInPixel,O)}_relayout(){super._relayout(this.computeRequiredHeight())}computeRequiredHeight(){return 3+this._message.getHeightInLines()}};e.MarkerNavigationWidget=m,m.TitleMenu=new t.MenuId("gotoErrorTitleMenu"),e.MarkerNavigationWidget=m=g=ke([ge(1,o.IThemeService),ge(2,d.IOpenerService),ge(3,t.IMenuService),ge(4,u.IInstantiationService),ge(5,r.IContextKeyService),ge(6,f.ILabelService)],m);const C=(0,l.oneOf)(l.editorErrorForeground,l.editorErrorBorder),w=(0,l.oneOf)(l.editorWarningForeground,l.editorWarningBorder),D=(0,l.oneOf)(l.editorInfoForeground,l.editorInfoBorder),I=(0,l.registerColor)("editorMarkerNavigationError.background",{dark:C,light:C,hcDark:l.contrastBorder,hcLight:l.contrastBorder},i.localize(7,null)),T=(0,l.registerColor)("editorMarkerNavigationError.headerBackground",{dark:(0,l.transparent)(I,.1),light:(0,l.transparent)(I,.1),hcDark:null,hcLight:null},i.localize(8,null)),A=(0,l.registerColor)("editorMarkerNavigationWarning.background",{dark:w,light:w,hcDark:l.contrastBorder,hcLight:l.contrastBorder},i.localize(9,null)),P=(0,l.registerColor)("editorMarkerNavigationWarning.headerBackground",{dark:(0,l.transparent)(A,.1),light:(0,l.transparent)(A,.1),hcDark:"#0C141F",hcLight:(0,l.transparent)(A,.2)},i.localize(10,null)),N=(0,l.registerColor)("editorMarkerNavigationInfo.background",{dark:D,light:D,hcDark:l.contrastBorder,hcLight:l.contrastBorder},i.localize(11,null)),M=(0,l.registerColor)("editorMarkerNavigationInfo.headerBackground",{dark:(0,l.transparent)(N,.1),light:(0,l.transparent)(N,.1),hcDark:null,hcLight:null},i.localize(12,null)),R=(0,l.registerColor)("editorMarkerNavigation.background",{dark:l.editorBackground,light:l.editorBackground,hcDark:l.editorBackground,hcLight:l.editorBackground},i.localize(13,null))}),define(se[382],oe([1,0,26,2,16,33,10,5,21,783,678,30,15,8,82,913]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";var u;Object.defineProperty(e,"__esModule",{value:!0}),e.NextMarkerAction=e.MarkerController=void 0;let f=u=class{static get(C){return C.getContribution(u.ID)}constructor(C,w,D,I,T){this._markerNavigationService=w,this._contextKeyService=D,this._editorService=I,this._instantiationService=T,this._sessionDispoables=new k.DisposableStore,this._editor=C,this._widgetVisible=g.bindTo(this._contextKeyService)}dispose(){this._cleanUp(),this._sessionDispoables.dispose()}_cleanUp(){this._widgetVisible.reset(),this._sessionDispoables.clear(),this._widget=void 0,this._model=void 0}_getOrCreateModel(C){if(this._model&&this._model.matches(C))return this._model;let w=!1;return this._model&&(w=!0,this._cleanUp()),this._model=this._markerNavigationService.getMarkerList(C),w&&this._model.move(!0,this._editor.getModel(),this._editor.getPosition()),this._widget=this._instantiationService.createInstance(r.MarkerNavigationWidget,this._editor),this._widget.onDidClose(()=>this.close(),this,this._sessionDispoables),this._widgetVisible.set(!0),this._sessionDispoables.add(this._model),this._sessionDispoables.add(this._widget),this._sessionDispoables.add(this._editor.onDidChangeCursorPosition(D=>{var I,T,A;(!(!((I=this._model)===null||I===void 0)&&I.selected)||!p.Range.containsPosition((T=this._model)===null||T===void 0?void 0:T.selected.marker,D.position))&&((A=this._model)===null||A===void 0||A.resetIndex())})),this._sessionDispoables.add(this._model.onDidChange(()=>{if(!this._widget||!this._widget.position||!this._model)return;const D=this._model.find(this._editor.getModel().uri,this._widget.position);D?this._widget.updateMarker(D.marker):this._widget.showStale()})),this._sessionDispoables.add(this._widget.onDidSelectRelatedInformation(D=>{this._editorService.openCodeEditor({resource:D.resource,options:{pinned:!0,revealIfOpened:!0,selection:p.Range.lift(D).collapseToStart()}},this._editor),this.close(!1)})),this._sessionDispoables.add(this._editor.onDidChangeModel(()=>this._cleanUp())),this._model}close(C=!0){this._cleanUp(),C&&this._editor.focus()}showAtMarker(C){if(this._editor.hasModel()){const w=this._getOrCreateModel(this._editor.getModel().uri);w.resetIndex(),w.move(!0,this._editor.getModel(),new S.Position(C.startLineNumber,C.startColumn)),w.selected&&this._widget.showAtMarker(w.selected.marker,w.selected.index,w.selected.total)}}async nagivate(C,w){var D,I;if(this._editor.hasModel()){const T=this._getOrCreateModel(w?void 0:this._editor.getModel().uri);if(T.move(C,this._editor.getModel(),this._editor.getPosition()),!T.selected)return;if(T.selected.marker.resource.toString()!==this._editor.getModel().uri.toString()){this._cleanUp();const A=await this._editorService.openCodeEditor({resource:T.selected.marker.resource,options:{pinned:!1,revealIfOpened:!0,selectionRevealType:2,selection:T.selected.marker}},this._editor);A&&((D=u.get(A))===null||D===void 0||D.close(),(I=u.get(A))===null||I===void 0||I.nagivate(C,w))}else this._widget.showAtMarker(T.selected.marker,T.selected.index,T.selected.total)}}};e.MarkerController=f,f.ID="editor.contrib.markerController",e.MarkerController=f=u=ke([ge(1,v.IMarkerNavigationService),ge(2,i.IContextKeyService),ge(3,E.ICodeEditorService),ge(4,n.IInstantiationService)],f);class c extends y.EditorAction{constructor(C,w,D){super(D),this._next=C,this._multiFile=w}async run(C,w){var D;w.hasModel()&&((D=f.get(w))===null||D===void 0||D.nagivate(this._next,this._multiFile))}}class d extends c{constructor(){super(!0,!1,{id:d.ID,label:d.LABEL,alias:"Go to Next Problem (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.focus,primary:578,weight:100},menuOpts:{menuId:r.MarkerNavigationWidget.TitleMenu,title:d.LABEL,icon:(0,t.registerIcon)("marker-navigation-next",L.Codicon.arrowDown,b.localize(1,null)),group:"navigation",order:1}})}}e.NextMarkerAction=d,d.ID="editor.action.marker.next",d.LABEL=b.localize(0,null);class s extends c{constructor(){super(!1,!1,{id:s.ID,label:s.LABEL,alias:"Go to Previous Problem (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.focus,primary:1602,weight:100},menuOpts:{menuId:r.MarkerNavigationWidget.TitleMenu,title:s.LABEL,icon:(0,t.registerIcon)("marker-navigation-previous",L.Codicon.arrowUp,b.localize(3,null)),group:"navigation",order:2}})}}s.ID="editor.action.marker.prev",s.LABEL=b.localize(2,null);class l extends c{constructor(){super(!0,!0,{id:"editor.action.marker.nextInFiles",label:b.localize(4,null),alias:"Go to Next Problem in Files (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.focus,primary:66,weight:100},menuOpts:{menuId:a.MenuId.MenubarGoMenu,title:b.localize(5,null),group:"6_problem_nav",order:1}})}}class o extends c{constructor(){super(!1,!0,{id:"editor.action.marker.prevInFiles",label:b.localize(6,null),alias:"Go to Previous Problem in Files (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.focus,primary:1090,weight:100},menuOpts:{menuId:a.MenuId.MenubarGoMenu,title:b.localize(7,null),group:"6_problem_nav",order:2}})}}(0,y.registerEditorContribution)(f.ID,f,4),(0,y.registerEditorAction)(d),(0,y.registerEditorAction)(s),(0,y.registerEditorAction)(l),(0,y.registerEditorAction)(o);const g=new i.RawContextKey("markersNavigationVisible",!1),h=y.EditorCommand.bindToContribution(f.get);(0,y.registerEditorCommand)(new h({id:"closeMarkersNavigation",precondition:g,handler:m=>m.close(),kbOpts:{weight:100+50,kbExpr:_.EditorContextKeys.focus,primary:9,secondary:[1033]}}))}),define(se[914],oe([1,0,7,322,39,6,2,47,49,168,5,38,32,80,43,68,837,142,684,8,34,164,192,23,193,161,464]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReferenceWidget=e.LayoutData=void 0;class C{constructor(A,P){this._editor=A,this._model=P,this._decorations=new Map,this._decorationIgnoreSet=new Set,this._callOnDispose=new S.DisposableStore,this._callOnModelChange=new S.DisposableStore,this._callOnDispose.add(this._editor.onDidChangeModel(()=>this._onModelChanged())),this._onModelChanged()}dispose(){this._callOnModelChange.dispose(),this._callOnDispose.dispose(),this.removeDecorations()}_onModelChanged(){this._callOnModelChange.clear();const A=this._editor.getModel();if(A){for(const P of this._model.references)if(P.uri.toString()===A.uri.toString()){this._addDecorations(P.parent);return}}}_addDecorations(A){if(!this._editor.hasModel())return;this._callOnModelChange.add(this._editor.getModel().onDidChangeDecorations(()=>this._onDecorationChanged()));const P=[],N=[];for(let M=0,R=A.children.length;M<R;M++){const x=A.children[M];this._decorationIgnoreSet.has(x.id)||x.uri.toString()===this._editor.getModel().uri.toString()&&(P.push({range:x.range,options:C.DecorationOptions}),N.push(M))}this._editor.changeDecorations(M=>{const R=M.deltaDecorations([],P);for(let x=0;x<R.length;x++)this._decorations.set(R[x],A.children[N[x]])})}_onDecorationChanged(){const A=[],P=this._editor.getModel();if(P){for(const[N,M]of this._decorations){const R=P.getDecorationRange(N);if(!R)continue;let x=!1;if(!b.Range.equalsRange(R,M.range)){if(b.Range.spansMultipleLines(R))x=!0;else{const O=M.range.endColumn-M.range.startColumn,B=R.endColumn-R.startColumn;O!==B&&(x=!0)}x?(this._decorationIgnoreSet.add(M.id),A.push(N)):M.range=R}}for(let N=0,M=A.length;N<M;N++)this._decorations.delete(A[N]);this._editor.removeDecorations(A)}}removeDecorations(){this._editor.removeDecorations([...this._decorations.keys()]),this._decorations.clear()}}C.DecorationOptions=a.ModelDecorationOptions.register({description:"reference-decoration",stickiness:1,className:"reference-decoration"});class w{constructor(){this.ratio=.7,this.heightInLines=18}static fromJSON(A){let P,N;try{const M=JSON.parse(A);P=M.ratio,N=M.heightInLines}catch{}return{ratio:P||.7,heightInLines:N||18}}}e.LayoutData=w;class D extends o.WorkbenchAsyncDataTree{}let I=class extends f.PeekViewWidget{constructor(A,P,N,M,R,x,O,B,W,V,K,F){super(A,{showFrame:!1,showArrow:!0,isResizeable:!0,isAccessible:!0,supportOnTitleClick:!0},x),this._defaultTreeKeyboardSupport=P,this.layoutData=N,this._textModelResolverService=R,this._instantiationService=x,this._peekViewService=O,this._uriLabel=B,this._undoRedoService=W,this._keybindingService=V,this._languageService=K,this._languageConfigurationService=F,this._disposeOnNewModel=new S.DisposableStore,this._callOnDispose=new S.DisposableStore,this._onDidSelectReference=new E.Emitter,this.onDidSelectReference=this._onDidSelectReference.event,this._dim=new L.Dimension(0,0),this._applyTheme(M.getColorTheme()),this._callOnDispose.add(M.onDidColorThemeChange(this._applyTheme.bind(this))),this._peekViewService.addExclusiveWidget(A,this),this.create()}dispose(){this.setModel(void 0),this._callOnDispose.dispose(),this._disposeOnNewModel.dispose(),(0,S.dispose)(this._preview),(0,S.dispose)(this._previewNotAvailableMessage),(0,S.dispose)(this._tree),(0,S.dispose)(this._previewModelReference),this._splitView.dispose(),super.dispose()}_applyTheme(A){const P=A.getColor(f.peekViewBorder)||y.Color.transparent;this.style({arrowColor:P,frameColor:P,headerBackgroundColor:A.getColor(f.peekViewTitleBackground)||y.Color.transparent,primaryHeadingColor:A.getColor(f.peekViewTitleForeground),secondaryHeadingColor:A.getColor(f.peekViewTitleInfoForeground)})}show(A){super.show(A,this.layoutData.heightInLines||18)}focusOnReferenceTree(){this._tree.domFocus()}focusOnPreviewEditor(){this._preview.focus()}isPreviewEditorFocused(){return this._preview.hasTextFocus()}_onTitleClick(A){this._preview&&this._preview.getModel()&&this._onDidSelectReference.fire({element:this._getFocusedReference(),kind:A.ctrlKey||A.metaKey||A.altKey?"side":"open",source:"title"})}_fillBody(A){this.setCssClass("reference-zone-widget"),this._messageContainer=L.append(A,L.$("div.messages")),L.hide(this._messageContainer),this._splitView=new k.SplitView(A,{orientation:1}),this._previewContainer=L.append(A,L.$("div.preview.inline"));const P={scrollBeyondLastLine:!1,scrollbar:{verticalScrollbarSize:14,horizontal:"auto",useShadows:!0,verticalHasArrows:!1,horizontalHasArrows:!1,alwaysConsumeMouseWheel:!0},overviewRulerLanes:2,fixedOverflowWidgets:!0,minimap:{enabled:!1}};this._preview=this._instantiationService.createInstance(v.EmbeddedCodeEditorWidget,this._previewContainer,P,{},this.editor),L.hide(this._previewContainer),this._previewNotAvailableMessage=new a.TextModel(c.localize(0,null),n.PLAINTEXT_LANGUAGE_ID,a.TextModel.DEFAULT_CREATION_OPTIONS,null,this._undoRedoService,this._languageService,this._languageConfigurationService),this._treeContainer=L.append(A,L.$("div.ref-tree.inline"));const N={keyboardSupport:this._defaultTreeKeyboardSupport,accessibilityProvider:new u.AccessibilityProvider,keyboardNavigationLabelProvider:this._instantiationService.createInstance(u.StringRepresentationProvider),identityProvider:new u.IdentityProvider,openOnSingleClick:!0,selectionNavigation:!0,overrideStyles:{listBackground:f.peekViewResultsBackground}};this._defaultTreeKeyboardSupport&&this._callOnDispose.add(L.addStandardDisposableListener(this._treeContainer,"keydown",R=>{R.equals(9)&&(this._keybindingService.dispatchEvent(R,R.target),R.stopPropagation())},!0)),this._tree=this._instantiationService.createInstance(D,"ReferencesWidget",this._treeContainer,new u.Delegate,[this._instantiationService.createInstance(u.FileReferencesRenderer),this._instantiationService.createInstance(u.OneReferenceRenderer)],this._instantiationService.createInstance(u.DataSource),N),this._splitView.addView({onDidChange:E.Event.None,element:this._previewContainer,minimumSize:200,maximumSize:Number.MAX_VALUE,layout:R=>{this._preview.layout({height:this._dim.height,width:R})}},k.Sizing.Distribute),this._splitView.addView({onDidChange:E.Event.None,element:this._treeContainer,minimumSize:100,maximumSize:Number.MAX_VALUE,layout:R=>{this._treeContainer.style.height=`${this._dim.height}px`,this._treeContainer.style.width=`${R}px`,this._tree.layout(this._dim.height,R)}},k.Sizing.Distribute),this._disposables.add(this._splitView.onDidSashChange(()=>{this._dim.width&&(this.layoutData.ratio=this._splitView.getViewSize(0)/this._dim.width)},void 0));const M=(R,x)=>{R instanceof m.OneReference&&(x==="show"&&this._revealReference(R,!1),this._onDidSelectReference.fire({element:R,kind:x,source:"tree"}))};this._tree.onDidOpen(R=>{R.sideBySide?M(R.element,"side"):R.editorOptions.pinned?M(R.element,"goto"):M(R.element,"show")}),L.hide(this._treeContainer)}_onWidth(A){this._dim&&this._doLayoutBody(this._dim.height,A)}_doLayoutBody(A,P){super._doLayoutBody(A,P),this._dim=new L.Dimension(P,A),this.layoutData.heightInLines=this._viewZone?this._viewZone.heightInLines:this.layoutData.heightInLines,this._splitView.layout(P),this._splitView.resizeView(0,P*this.layoutData.ratio)}setSelection(A){return this._revealReference(A,!0).then(()=>{this._model&&(this._tree.setSelection([A]),this._tree.setFocus([A]))})}setModel(A){return this._disposeOnNewModel.clear(),this._model=A,this._model?this._onNewModel():Promise.resolve()}_onNewModel(){return this._model?this._model.isEmpty?(this.setTitle(""),this._messageContainer.innerText=c.localize(1,null),L.show(this._messageContainer),Promise.resolve(void 0)):(L.hide(this._messageContainer),this._decorationsManager=new C(this._preview,this._model),this._disposeOnNewModel.add(this._decorationsManager),this._disposeOnNewModel.add(this._model.onDidChangeReferenceRange(A=>this._tree.rerender(A))),this._disposeOnNewModel.add(this._preview.onMouseDown(A=>{const{event:P,target:N}=A;if(P.detail!==2)return;const M=this._getFocusedReference();M&&this._onDidSelectReference.fire({element:{uri:M.uri,range:N.range},kind:P.ctrlKey||P.metaKey||P.altKey?"side":"open",source:"editor"})})),this.container.classList.add("results-loaded"),L.show(this._treeContainer),L.show(this._previewContainer),this._splitView.layout(this._dim.width),this.focusOnReferenceTree(),this._tree.setInput(this._model.groups.length===1?this._model.groups[0]:this._model)):Promise.resolve(void 0)}_getFocusedReference(){const[A]=this._tree.getFocus();if(A instanceof m.OneReference)return A;if(A instanceof m.FileReferences&&A.children.length>0)return A.children[0]}async revealReference(A){await this._revealReference(A,!1),this._onDidSelectReference.fire({element:A,kind:"goto",source:"tree"})}async _revealReference(A,P){if(this._revealedReference===A)return;this._revealedReference=A,A.uri.scheme!==p.Schemas.inMemory?this.setTitle((0,_.basenameOrAuthority)(A.uri),this._uriLabel.getUriLabel((0,_.dirname)(A.uri))):this.setTitle(c.localize(2,null));const N=this._textModelResolverService.createModelReference(A.uri);this._tree.getInput()===A.parent?this._tree.reveal(A):(P&&this._tree.reveal(A.parent),await this._tree.expand(A.parent),this._tree.reveal(A));const M=await N;if(!this._model){M.dispose();return}(0,S.dispose)(this._previewModelReference);const R=M.object;if(R){const x=this._preview.getModel()===R.textEditorModel?0:1,O=b.Range.lift(A.range).collapseToStart();this._previewModelReference=M,this._preview.setModel(R.textEditorModel),this._preview.setSelection(O),this._preview.revealRangeInCenter(O,x)}else this._preview.setModel(this._previewNotAvailableMessage),M.dispose()}};e.ReferenceWidget=I,e.ReferenceWidget=I=ke([ge(3,g.IThemeService),ge(4,r.ITextModelService),ge(5,d.IInstantiationService),ge(6,f.IPeekViewService),ge(7,l.ILabelService),ge(8,h.IUndoRedoService),ge(9,s.IKeybindingService),ge(10,t.ILanguageService),ge(11,i.ILanguageConfigurationService)],I)}),define(se[383],oe([1,0,14,12,65,2,33,10,5,142,682,25,27,15,8,124,192,50,92,161,914]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s){"use strict";var l;Object.defineProperty(e,"__esModule",{value:!0}),e.ReferencesController=e.ctxReferenceSearchVisible=void 0,e.ctxReferenceSearchVisible=new n.RawContextKey("referenceSearchVisible",!1,b.localize(0,null));let o=l=class{static get(m){return m.getContribution(l.ID)}constructor(m,C,w,D,I,T,A,P){this._defaultTreeKeyboardSupport=m,this._editor=C,this._editorService=D,this._notificationService=I,this._instantiationService=T,this._storageService=A,this._configurationService=P,this._disposables=new E.DisposableStore,this._requestIdPool=0,this._ignoreModelChangeEvent=!1,this._referenceSearchVisible=e.ctxReferenceSearchVisible.bindTo(w)}dispose(){var m,C;this._referenceSearchVisible.reset(),this._disposables.dispose(),(m=this._widget)===null||m===void 0||m.dispose(),(C=this._model)===null||C===void 0||C.dispose(),this._widget=void 0,this._model=void 0}toggleWidget(m,C,w){let D;if(this._widget&&(D=this._widget.position),this.closeWidget(),D&&m.containsPosition(D))return;this._peekMode=w,this._referenceSearchVisible.set(!0),this._disposables.add(this._editor.onDidChangeModelLanguage(()=>{this.closeWidget()})),this._disposables.add(this._editor.onDidChangeModel(()=>{this._ignoreModelChangeEvent||this.closeWidget()}));const I="peekViewLayout",T=s.LayoutData.fromJSON(this._storageService.get(I,0,"{}"));this._widget=this._instantiationService.createInstance(s.ReferenceWidget,this._editor,this._defaultTreeKeyboardSupport,T),this._widget.setTitle(b.localize(1,null)),this._widget.show(m),this._disposables.add(this._widget.onDidClose(()=>{C.cancel(),this._widget&&(this._storageService.store(I,JSON.stringify(this._widget.layoutData),0,1),this._widget=void 0),this.closeWidget()})),this._disposables.add(this._widget.onDidSelectReference(P=>{const{element:N,kind:M}=P;if(N)switch(M){case"open":(P.source!=="editor"||!this._configurationService.getValue("editor.stablePeek"))&&this.openReference(N,!1,!1);break;case"side":this.openReference(N,!0,!1);break;case"goto":w?this._gotoReference(N,!0):this.openReference(N,!1,!0);break}}));const A=++this._requestIdPool;C.then(P=>{var N;if(A!==this._requestIdPool||!this._widget){P.dispose();return}return(N=this._model)===null||N===void 0||N.dispose(),this._model=P,this._widget.setModel(this._model).then(()=>{if(this._widget&&this._model&&this._editor.hasModel()){this._model.isEmpty?this._widget.setMetaTitle(""):this._widget.setMetaTitle(b.localize(2,null,this._model.title,this._model.references.length));const M=this._editor.getModel().uri,R=new p.Position(m.startLineNumber,m.startColumn),x=this._model.nearestReference(M,R);if(x)return this._widget.setSelection(x).then(()=>{this._widget&&this._editor.getOption(86)==="editor"&&this._widget.focusOnPreviewEditor()})}})},P=>{this._notificationService.error(P)})}changeFocusBetweenPreviewAndReferences(){this._widget&&(this._widget.isPreviewEditorFocused()?this._widget.focusOnReferenceTree():this._widget.focusOnPreviewEditor())}async goToNextOrPreviousReference(m){if(!this._editor.hasModel()||!this._model||!this._widget)return;const C=this._widget.position;if(!C)return;const w=this._model.nearestReference(this._editor.getModel().uri,C);if(!w)return;const D=this._model.nextOrPreviousReference(w,m),I=this._editor.hasTextFocus(),T=this._widget.isPreviewEditorFocused();await this._widget.setSelection(D),await this._gotoReference(D,!1),I?this._editor.focus():this._widget&&T&&this._widget.focusOnPreviewEditor()}async revealReference(m){!this._editor.hasModel()||!this._model||!this._widget||await this._widget.revealReference(m)}closeWidget(m=!0){var C,w;(C=this._widget)===null||C===void 0||C.dispose(),(w=this._model)===null||w===void 0||w.dispose(),this._referenceSearchVisible.reset(),this._disposables.clear(),this._widget=void 0,this._model=void 0,m&&this._editor.focus(),this._requestIdPool+=1}_gotoReference(m,C){var w;(w=this._widget)===null||w===void 0||w.hide(),this._ignoreModelChangeEvent=!0;const D=_.Range.lift(m.range).collapseToStart();return this._editorService.openCodeEditor({resource:m.uri,options:{selection:D,selectionSource:"code.jump",pinned:C}},this._editor).then(I=>{var T;if(this._ignoreModelChangeEvent=!1,!I||!this._widget){this.closeWidget();return}if(this._editor===I)this._widget.show(D),this._widget.focusOnReferenceTree();else{const A=l.get(I),P=this._model.clone();this.closeWidget(),I.focus(),A?.toggleWidget(D,(0,L.createCancelablePromise)(N=>Promise.resolve(P)),(T=this._peekMode)!==null&&T!==void 0?T:!1)}},I=>{this._ignoreModelChangeEvent=!1,(0,k.onUnexpectedError)(I)})}openReference(m,C,w){C||this.closeWidget();const{uri:D,range:I}=m;this._editorService.openCodeEditor({resource:D,options:{selection:I,selectionSource:"code.jump",pinned:w}},this._editor,C)}};e.ReferencesController=o,o.ID="editor.contrib.referencesController",e.ReferencesController=o=l=ke([ge(2,n.IContextKeyService),ge(3,S.ICodeEditorService),ge(4,f.INotificationService),ge(5,t.IInstantiationService),ge(6,c.IStorageService),ge(7,i.IConfigurationService)],o);function g(h,m){const C=(0,v.getOuterEditor)(h);if(!C)return;const w=o.get(C);w&&m(w)}r.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"togglePeekWidgetFocus",weight:100,primary:(0,y.KeyChord)(2089,60),when:n.ContextKeyExpr.or(e.ctxReferenceSearchVisible,v.PeekContext.inPeekEditor),handler(h){g(h,m=>{m.changeFocusBetweenPreviewAndReferences()})}}),r.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"goToNextReference",weight:100-10,primary:62,secondary:[70],when:n.ContextKeyExpr.or(e.ctxReferenceSearchVisible,v.PeekContext.inPeekEditor),handler(h){g(h,m=>{m.goToNextOrPreviousReference(!0)})}}),r.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"goToPreviousReference",weight:100-10,primary:1086,secondary:[1094],when:n.ContextKeyExpr.or(e.ctxReferenceSearchVisible,v.PeekContext.inPeekEditor),handler(h){g(h,m=>{m.goToNextOrPreviousReference(!1)})}}),a.CommandsRegistry.registerCommandAlias("goToNextReferenceFromEmbeddedEditor","goToNextReference"),a.CommandsRegistry.registerCommandAlias("goToPreviousReferenceFromEmbeddedEditor","goToPreviousReference"),a.CommandsRegistry.registerCommandAlias("closeReferenceSearchEditor","closeReferenceSearch"),a.CommandsRegistry.registerCommand("closeReferenceSearch",h=>g(h,m=>m.closeWidget())),r.KeybindingsRegistry.registerKeybindingRule({id:"closeReferenceSearch",weight:100-101,primary:9,secondary:[1033],when:n.ContextKeyExpr.and(v.PeekContext.inPeekEditor,n.ContextKeyExpr.not("config.editor.stablePeek"))}),r.KeybindingsRegistry.registerKeybindingRule({id:"closeReferenceSearch",weight:200+50,primary:9,secondary:[1033],when:n.ContextKeyExpr.and(e.ctxReferenceSearchVisible,n.ContextKeyExpr.not("config.editor.stablePeek"))}),r.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"revealReference",weight:200,primary:3,mac:{primary:3,secondary:[2066]},when:n.ContextKeyExpr.and(e.ctxReferenceSearchVisible,u.WorkbenchListFocusContextKey,u.WorkbenchTreeElementCanCollapse.negate(),u.WorkbenchTreeElementCanExpand.negate()),handler(h){var m;const w=(m=h.get(u.IListService).lastFocusedList)===null||m===void 0?void 0:m.getFocus();Array.isArray(w)&&w[0]instanceof d.OneReference&&g(h,D=>D.revealReference(w[0]))}}),r.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"openReferenceToSide",weight:100,primary:2051,mac:{primary:259},when:n.ContextKeyExpr.and(e.ctxReferenceSearchVisible,u.WorkbenchListFocusContextKey,u.WorkbenchTreeElementCanCollapse.negate(),u.WorkbenchTreeElementCanExpand.negate()),handler(h){var m;const w=(m=h.get(u.IListService).lastFocusedList)===null||m===void 0?void 0:m.getFocus();Array.isArray(w)&&w[0]instanceof d.OneReference&&g(h,D=>D.openReference(w[0],!0,!0))}}),a.CommandsRegistry.registerCommand("openReference",h=>{var m;const w=(m=h.get(u.IListService).lastFocusedList)===null||m===void 0?void 0:m.getFocus();Array.isArray(w)&&w[0]instanceof d.OneReference&&g(h,D=>D.openReference(w[0],!1,!0))})}),define(se[263],oe([1,0,48,14,65,20,22,105,153,16,33,168,10,5,21,31,383,161,819,166,142,680,30,25,15,8,50,88,252,18,52,242]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w,D,I,T,A){"use strict";var P,N,M,R,x,O,B,W;Object.defineProperty(e,"__esModule",{value:!0}),e.DefinitionAction=e.SymbolNavigationAction=e.SymbolNavigationAnchor=void 0,o.MenuRegistry.appendMenuItem(o.MenuId.EditorContext,{submenu:o.MenuId.EditorContextPeek,title:l.localize(0,null),group:"navigation",order:100});class V{static is(Q){return!Q||typeof Q!="object"?!1:!!(Q instanceof V||i.Position.isIPosition(Q.position)&&Q.model)}constructor(Q,re){this.model=Q,this.position=re}}e.SymbolNavigationAnchor=V;class K extends v.EditorAction2{static all(){return K._allSymbolNavigationCommands.values()}static _patchConfig(Q){const re={...Q,f1:!0};if(re.menu)for(const de of T.Iterable.wrap(re.menu))(de.id===o.MenuId.EditorContext||de.id===o.MenuId.EditorContextPeek)&&(de.when=h.ContextKeyExpr.and(Q.precondition,de.when));return re}constructor(Q,re){super(K._patchConfig(re)),this.configuration=Q,K._allSymbolNavigationCommands.set(re.id,this)}runEditorCommand(Q,re,de,he){if(!re.hasModel())return Promise.resolve(void 0);const me=Q.get(C.INotificationService),X=Q.get(b.ICodeEditorService),U=Q.get(w.IEditorProgressService),G=Q.get(c.ISymbolNavigationService),z=Q.get(I.ILanguageFeaturesService),H=Q.get(m.IInstantiationService),Y=re.getModel(),j=re.getPosition(),Z=V.is(de)?de:new V(Y,j),ee=new p.EditorStateCancellationTokenSource(re,5),le=(0,k.raceCancellation)(this._getLocationModel(z,Z.model,Z.position,ee.token),ee.token).then(async ue=>{var ce;if(!ue||ee.token.isCancellationRequested)return;(0,L.alert)(ue.ariaMessage);let pe;if(ue.referenceAt(Y.uri,j)){const Ce=this._getAlternativeCommand(re);!K._activeAlternativeCommands.has(Ce)&&K._allSymbolNavigationCommands.has(Ce)&&(pe=K._allSymbolNavigationCommands.get(Ce))}const ve=ue.references.length;if(ve===0){if(!this.configuration.muteMessage){const Ce=Y.getWordAtPosition(j);(ce=d.MessageController.get(re))===null||ce===void 0||ce.showMessage(this._getNoResultFoundMessage(Ce),j)}}else if(ve===1&&pe)K._activeAlternativeCommands.add(this.desc.id),H.invokeFunction(Ce=>pe.runEditorCommand(Ce,re,de,he).finally(()=>{K._activeAlternativeCommands.delete(this.desc.id)}));else return this._onResult(X,G,re,ue,he)},ue=>{me.error(ue)}).finally(()=>{ee.dispose()});return U.showWhile(le,250),le}async _onResult(Q,re,de,he,me){const X=this._getGoToPreference(de);if(!(de instanceof a.EmbeddedCodeEditorWidget)&&(this.configuration.openInPeek||X==="peek"&&he.references.length>1))this._openInPeek(de,he,me);else{const U=he.firstReference(),G=he.references.length>1&&X==="gotoAndPeek",z=await this._openReference(de,Q,U,this.configuration.openToSide,!G);G&&z?this._openInPeek(z,he,me):he.dispose(),X==="goto"&&re.put(U)}}async _openReference(Q,re,de,he,me){let X;if((0,r.isLocationLink)(de)&&(X=de.targetSelectionRange),X||(X=de.range),!X)return;const U=await re.openCodeEditor({resource:de.uri,options:{selection:n.Range.collapseToStart(X),selectionRevealType:3,selectionSource:"code.jump"}},Q,he);if(U){if(me){const G=U.getModel(),z=U.createDecorationsCollection([{range:X,options:{description:"symbol-navigate-action-highlight",className:"symbolHighlight"}}]);setTimeout(()=>{U.getModel()===G&&z.clear()},350)}return U}}_openInPeek(Q,re,de){const he=u.ReferencesController.get(Q);he&&Q.hasModel()?he.toggleWidget(de??Q.getSelection(),(0,k.createCancelablePromise)(me=>Promise.resolve(re)),this.configuration.openInPeek):re.dispose()}}e.SymbolNavigationAction=K,K._allSymbolNavigationCommands=new Map,K._activeAlternativeCommands=new Set;class F extends K{async _getLocationModel(Q,re,de,he){return new f.ReferencesModel(await(0,D.getDefinitionsAtPosition)(Q.definitionProvider,re,de,he),l.localize(1,null))}_getNoResultFoundMessage(Q){return Q&&Q.word?l.localize(2,null,Q.word):l.localize(3,null)}_getAlternativeCommand(Q){return Q.getOption(58).alternativeDefinitionCommand}_getGoToPreference(Q){return Q.getOption(58).multipleDefinitions}}e.DefinitionAction=F,(0,o.registerAction2)((P=class extends F{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:P.id,title:{value:l.localize(4,null),original:"Go to Definition",mnemonicTitle:l.localize(5,null)},precondition:h.ContextKeyExpr.and(t.EditorContextKeys.hasDefinitionProvider,t.EditorContextKeys.isInWalkThroughSnippet.toNegated()),keybinding:[{when:t.EditorContextKeys.editorTextFocus,primary:70,weight:100},{when:h.ContextKeyExpr.and(t.EditorContextKeys.editorTextFocus,A.IsWebContext),primary:2118,weight:100}],menu:[{id:o.MenuId.EditorContext,group:"navigation",order:1.1},{id:o.MenuId.MenubarGoMenu,precondition:null,group:"4_symbol_nav",order:2}]}),g.CommandsRegistry.registerCommandAlias("editor.action.goToDeclaration",P.id)}},P.id="editor.action.revealDefinition",P)),(0,o.registerAction2)((N=class extends F{constructor(){super({openToSide:!0,openInPeek:!1,muteMessage:!1},{id:N.id,title:{value:l.localize(6,null),original:"Open Definition to the Side"},precondition:h.ContextKeyExpr.and(t.EditorContextKeys.hasDefinitionProvider,t.EditorContextKeys.isInWalkThroughSnippet.toNegated()),keybinding:[{when:t.EditorContextKeys.editorTextFocus,primary:(0,y.KeyChord)(2089,70),weight:100},{when:h.ContextKeyExpr.and(t.EditorContextKeys.editorTextFocus,A.IsWebContext),primary:(0,y.KeyChord)(2089,2118),weight:100}]}),g.CommandsRegistry.registerCommandAlias("editor.action.openDeclarationToTheSide",N.id)}},N.id="editor.action.revealDefinitionAside",N)),(0,o.registerAction2)((M=class extends F{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:M.id,title:{value:l.localize(7,null),original:"Peek Definition"},precondition:h.ContextKeyExpr.and(t.EditorContextKeys.hasDefinitionProvider,s.PeekContext.notInPeekEditor,t.EditorContextKeys.isInWalkThroughSnippet.toNegated()),keybinding:{when:t.EditorContextKeys.editorTextFocus,primary:582,linux:{primary:3140},weight:100},menu:{id:o.MenuId.EditorContextPeek,group:"peek",order:2}}),g.CommandsRegistry.registerCommandAlias("editor.action.previewDeclaration",M.id)}},M.id="editor.action.peekDefinition",M));class q extends K{async _getLocationModel(Q,re,de,he){return new f.ReferencesModel(await(0,D.getDeclarationsAtPosition)(Q.declarationProvider,re,de,he),l.localize(8,null))}_getNoResultFoundMessage(Q){return Q&&Q.word?l.localize(9,null,Q.word):l.localize(10,null)}_getAlternativeCommand(Q){return Q.getOption(58).alternativeDeclarationCommand}_getGoToPreference(Q){return Q.getOption(58).multipleDeclarations}}(0,o.registerAction2)((R=class extends q{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:R.id,title:{value:l.localize(11,null),original:"Go to Declaration",mnemonicTitle:l.localize(12,null)},precondition:h.ContextKeyExpr.and(t.EditorContextKeys.hasDeclarationProvider,t.EditorContextKeys.isInWalkThroughSnippet.toNegated()),menu:[{id:o.MenuId.EditorContext,group:"navigation",order:1.3},{id:o.MenuId.MenubarGoMenu,precondition:null,group:"4_symbol_nav",order:3}]})}_getNoResultFoundMessage(Q){return Q&&Q.word?l.localize(13,null,Q.word):l.localize(14,null)}},R.id="editor.action.revealDeclaration",R)),(0,o.registerAction2)(class extends q{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:"editor.action.peekDeclaration",title:{value:l.localize(15,null),original:"Peek Declaration"},precondition:h.ContextKeyExpr.and(t.EditorContextKeys.hasDeclarationProvider,s.PeekContext.notInPeekEditor,t.EditorContextKeys.isInWalkThroughSnippet.toNegated()),menu:{id:o.MenuId.EditorContextPeek,group:"peek",order:3}})}});class ie extends K{async _getLocationModel(Q,re,de,he){return new f.ReferencesModel(await(0,D.getTypeDefinitionsAtPosition)(Q.typeDefinitionProvider,re,de,he),l.localize(16,null))}_getNoResultFoundMessage(Q){return Q&&Q.word?l.localize(17,null,Q.word):l.localize(18,null)}_getAlternativeCommand(Q){return Q.getOption(58).alternativeTypeDefinitionCommand}_getGoToPreference(Q){return Q.getOption(58).multipleTypeDefinitions}}(0,o.registerAction2)((x=class extends ie{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:x.ID,title:{value:l.localize(19,null),original:"Go to Type Definition",mnemonicTitle:l.localize(20,null)},precondition:h.ContextKeyExpr.and(t.EditorContextKeys.hasTypeDefinitionProvider,t.EditorContextKeys.isInWalkThroughSnippet.toNegated()),keybinding:{when:t.EditorContextKeys.editorTextFocus,primary:0,weight:100},menu:[{id:o.MenuId.EditorContext,group:"navigation",order:1.4},{id:o.MenuId.MenubarGoMenu,precondition:null,group:"4_symbol_nav",order:3}]})}},x.ID="editor.action.goToTypeDefinition",x)),(0,o.registerAction2)((O=class extends ie{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:O.ID,title:{value:l.localize(21,null),original:"Peek Type Definition"},precondition:h.ContextKeyExpr.and(t.EditorContextKeys.hasTypeDefinitionProvider,s.PeekContext.notInPeekEditor,t.EditorContextKeys.isInWalkThroughSnippet.toNegated()),menu:{id:o.MenuId.EditorContextPeek,group:"peek",order:4}})}},O.ID="editor.action.peekTypeDefinition",O));class ae extends K{async _getLocationModel(Q,re,de,he){return new f.ReferencesModel(await(0,D.getImplementationsAtPosition)(Q.implementationProvider,re,de,he),l.localize(22,null))}_getNoResultFoundMessage(Q){return Q&&Q.word?l.localize(23,null,Q.word):l.localize(24,null)}_getAlternativeCommand(Q){return Q.getOption(58).alternativeImplementationCommand}_getGoToPreference(Q){return Q.getOption(58).multipleImplementations}}(0,o.registerAction2)((B=class extends ae{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:B.ID,title:{value:l.localize(25,null),original:"Go to Implementations",mnemonicTitle:l.localize(26,null)},precondition:h.ContextKeyExpr.and(t.EditorContextKeys.hasImplementationProvider,t.EditorContextKeys.isInWalkThroughSnippet.toNegated()),keybinding:{when:t.EditorContextKeys.editorTextFocus,primary:2118,weight:100},menu:[{id:o.MenuId.EditorContext,group:"navigation",order:1.45},{id:o.MenuId.MenubarGoMenu,precondition:null,group:"4_symbol_nav",order:4}]})}},B.ID="editor.action.goToImplementation",B)),(0,o.registerAction2)((W=class extends ae{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:W.ID,title:{value:l.localize(27,null),original:"Peek Implementations"},precondition:h.ContextKeyExpr.and(t.EditorContextKeys.hasImplementationProvider,s.PeekContext.notInPeekEditor,t.EditorContextKeys.isInWalkThroughSnippet.toNegated()),keybinding:{when:t.EditorContextKeys.editorTextFocus,primary:3142,weight:100},menu:{id:o.MenuId.EditorContextPeek,group:"peek",order:5}})}},W.ID="editor.action.peekImplementation",W));class ne extends K{_getNoResultFoundMessage(Q){return Q?l.localize(28,null,Q.word):l.localize(29,null)}_getAlternativeCommand(Q){return Q.getOption(58).alternativeReferenceCommand}_getGoToPreference(Q){return Q.getOption(58).multipleReferences}}(0,o.registerAction2)(class extends ne{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:"editor.action.goToReferences",title:{value:l.localize(30,null),original:"Go to References",mnemonicTitle:l.localize(31,null)},precondition:h.ContextKeyExpr.and(t.EditorContextKeys.hasReferenceProvider,s.PeekContext.notInPeekEditor,t.EditorContextKeys.isInWalkThroughSnippet.toNegated()),keybinding:{when:t.EditorContextKeys.editorTextFocus,primary:1094,weight:100},menu:[{id:o.MenuId.EditorContext,group:"navigation",order:1.45},{id:o.MenuId.MenubarGoMenu,precondition:null,group:"4_symbol_nav",order:5}]})}async _getLocationModel(Q,re,de,he){return new f.ReferencesModel(await(0,D.getReferencesAtPosition)(Q.referenceProvider,re,de,!0,he),l.localize(32,null))}}),(0,o.registerAction2)(class extends ne{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:"editor.action.referenceSearch.trigger",title:{value:l.localize(33,null),original:"Peek References"},precondition:h.ContextKeyExpr.and(t.EditorContextKeys.hasReferenceProvider,s.PeekContext.notInPeekEditor,t.EditorContextKeys.isInWalkThroughSnippet.toNegated()),menu:{id:o.MenuId.EditorContextPeek,group:"peek",order:6}})}async _getLocationModel(Q,re,de,he){return new f.ReferencesModel(await(0,D.getReferencesAtPosition)(Q.referenceProvider,re,de,!1,he),l.localize(34,null))}});class $ extends K{constructor(Q,re,de){super(Q,{id:"editor.action.goToLocation",title:{value:l.localize(35,null),original:"Go to Any Symbol"},precondition:h.ContextKeyExpr.and(s.PeekContext.notInPeekEditor,t.EditorContextKeys.isInWalkThroughSnippet.toNegated())}),this._references=re,this._gotoMultipleBehaviour=de}async _getLocationModel(Q,re,de,he){return new f.ReferencesModel(this._references,l.localize(36,null))}_getNoResultFoundMessage(Q){return Q&&l.localize(37,null,Q.word)||""}_getGoToPreference(Q){var re;return(re=this._gotoMultipleBehaviour)!==null&&re!==void 0?re:Q.getOption(58).multipleReferences}_getAlternativeCommand(){return""}}g.CommandsRegistry.registerCommand({id:"editor.action.goToLocations",metadata:{description:"Go to locations from a position in a file",args:[{name:"uri",description:"The text document in which to start",constraint:S.URI},{name:"position",description:"The position at which to start",constraint:i.Position.isIPosition},{name:"locations",description:"An array of locations.",constraint:Array},{name:"multiple",description:"Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto`"},{name:"noResultsMessage",description:"Human readable message that shows when locations is empty."}]},handler:async(J,Q,re,de,he,me,X)=>{(0,E.assertType)(S.URI.isUri(Q)),(0,E.assertType)(i.Position.isIPosition(re)),(0,E.assertType)(Array.isArray(de)),(0,E.assertType)(typeof he>"u"||typeof he=="string"),(0,E.assertType)(typeof X>"u"||typeof X=="boolean");const U=J.get(b.ICodeEditorService),G=await U.openCodeEditor({resource:Q},U.getFocusedCodeEditor());if((0,_.isCodeEditor)(G))return G.setPosition(re),G.revealPositionInCenterIfOutsideViewport(re,0),G.invokeWithinContext(z=>{const H=new class extends ${_getNoResultFoundMessage(Y){return me||super._getNoResultFoundMessage(Y)}}({muteMessage:!me,openInPeek:!!X,openToSide:!1},de,he);z.get(m.IInstantiationService).invokeFunction(H.run.bind(H),G)})}}),g.CommandsRegistry.registerCommand({id:"editor.action.peekLocations",metadata:{description:"Peek locations from a position in a file",args:[{name:"uri",description:"The text document in which to start",constraint:S.URI},{name:"position",description:"The position at which to start",constraint:i.Position.isIPosition},{name:"locations",description:"An array of locations.",constraint:Array},{name:"multiple",description:"Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto`"}]},handler:async(J,Q,re,de,he)=>{J.get(g.ICommandService).executeCommand("editor.action.goToLocations",Q,re,de,he,void 0,!0)}}),g.CommandsRegistry.registerCommand({id:"editor.action.findReferences",handler:(J,Q,re)=>{(0,E.assertType)(S.URI.isUri(Q)),(0,E.assertType)(i.Position.isIPosition(re));const de=J.get(I.ILanguageFeaturesService),he=J.get(b.ICodeEditorService);return he.openCodeEditor({resource:Q},he.getFocusedCodeEditor()).then(me=>{if(!(0,_.isCodeEditor)(me)||!me.hasModel())return;const X=u.ReferencesController.get(me);if(!X)return;const U=(0,k.createCancelablePromise)(z=>(0,D.getReferencesAtPosition)(de.referenceProvider,me.getModel(),i.Position.lift(re),!1,z).then(H=>new f.ReferencesModel(H,l.localize(38,null)))),G=new n.Range(re.lineNumber,re.column,re.lineNumber,re.column);return Promise.resolve(X.toggleWidget(G,U,!1))})}}),g.CommandsRegistry.registerCommandAlias("editor.action.showReferences","editor.action.peekLocations")}),define(se[384],oe([1,0,14,12,58,2,105,16,5,43,68,188,142,681,15,263,252,18,38,463]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c){"use strict";var d;Object.defineProperty(e,"__esModule",{value:!0}),e.GotoDefinitionAtPositionEditorContribution=void 0;let s=d=class{constructor(o,g,h,m){this.textModelResolverService=g,this.languageService=h,this.languageFeaturesService=m,this.toUnhook=new E.DisposableStore,this.toUnhookForKeyboard=new E.DisposableStore,this.currentWordAtPosition=null,this.previousPromise=null,this.editor=o,this.linkDecorations=this.editor.createDecorationsCollection();const C=new a.ClickLinkGesture(o);this.toUnhook.add(C),this.toUnhook.add(C.onMouseMoveOrRelevantKeyDown(([w,D])=>{this.startFindDefinitionFromMouse(w,D??void 0)})),this.toUnhook.add(C.onExecute(w=>{this.isEnabled(w)&&this.gotoDefinition(w.target.position,w.hasSideBySideModifier).catch(D=>{(0,k.onUnexpectedError)(D)}).finally(()=>{this.removeLinkDecorations()})})),this.toUnhook.add(C.onCancel(()=>{this.removeLinkDecorations(),this.currentWordAtPosition=null}))}static get(o){return o.getContribution(d.ID)}async startFindDefinitionFromCursor(o){await this.startFindDefinition(o),this.toUnhookForKeyboard.add(this.editor.onDidChangeCursorPosition(()=>{this.currentWordAtPosition=null,this.removeLinkDecorations(),this.toUnhookForKeyboard.clear()})),this.toUnhookForKeyboard.add(this.editor.onKeyDown(g=>{g&&(this.currentWordAtPosition=null,this.removeLinkDecorations(),this.toUnhookForKeyboard.clear())}))}startFindDefinitionFromMouse(o,g){if(o.target.type===9&&this.linkDecorations.length>0)return;if(!this.editor.hasModel()||!this.isEnabled(o,g)){this.currentWordAtPosition=null,this.removeLinkDecorations();return}const h=o.target.position;this.startFindDefinition(h)}async startFindDefinition(o){var g;this.toUnhookForKeyboard.clear();const h=o?(g=this.editor.getModel())===null||g===void 0?void 0:g.getWordAtPosition(o):null;if(!h){this.currentWordAtPosition=null,this.removeLinkDecorations();return}if(this.currentWordAtPosition&&this.currentWordAtPosition.startColumn===h.startColumn&&this.currentWordAtPosition.endColumn===h.endColumn&&this.currentWordAtPosition.word===h.word)return;this.currentWordAtPosition=h;const m=new S.EditorState(this.editor,15);this.previousPromise&&(this.previousPromise.cancel(),this.previousPromise=null),this.previousPromise=(0,L.createCancelablePromise)(D=>this.findDefinition(o,D));let C;try{C=await this.previousPromise}catch(D){(0,k.onUnexpectedError)(D);return}if(!C||!C.length||!m.validate(this.editor)){this.removeLinkDecorations();return}const w=C[0].originSelectionRange?_.Range.lift(C[0].originSelectionRange):new _.Range(o.lineNumber,h.startColumn,o.lineNumber,h.endColumn);if(C.length>1){let D=w;for(const{originSelectionRange:I}of C)I&&(D=_.Range.plusRange(D,I));this.addDecoration(D,new y.MarkdownString().appendText(n.localize(0,null,C.length)))}else{const D=C[0];if(!D.uri)return;this.textModelResolverService.createModelReference(D.uri).then(I=>{if(!I.object||!I.object.textEditorModel){I.dispose();return}const{object:{textEditorModel:T}}=I,{startLineNumber:A}=D.range;if(A<1||A>T.getLineCount()){I.dispose();return}const P=this.getPreviewValue(T,A,D),N=this.languageService.guessLanguageIdByFilepathOrFirstLine(T.uri);this.addDecoration(w,P?new y.MarkdownString().appendCodeblock(N||"",P):void 0),I.dispose()})}}getPreviewValue(o,g,h){let m=h.range;return m.endLineNumber-m.startLineNumber>=d.MAX_SOURCE_PREVIEW_LINES&&(m=this.getPreviewRangeBasedOnIndentation(o,g)),this.stripIndentationFromPreviewRange(o,g,m)}stripIndentationFromPreviewRange(o,g,h){let C=o.getLineFirstNonWhitespaceColumn(g);for(let D=g+1;D<h.endLineNumber;D++){const I=o.getLineFirstNonWhitespaceColumn(D);C=Math.min(C,I)}return o.getValueInRange(h).replace(new RegExp(`^\\s{${C-1}}`,"gm"),"").trim()}getPreviewRangeBasedOnIndentation(o,g){const h=o.getLineFirstNonWhitespaceColumn(g),m=Math.min(o.getLineCount(),g+d.MAX_SOURCE_PREVIEW_LINES);let C=g+1;for(;C<m;C++){const w=o.getLineFirstNonWhitespaceColumn(C);if(h===w)break}return new _.Range(g,1,C+1,1)}addDecoration(o,g){const h={range:o,options:{description:"goto-definition-link",inlineClassName:"goto-definition-link",hoverMessage:g}};this.linkDecorations.set([h])}removeLinkDecorations(){this.linkDecorations.clear()}isEnabled(o,g){var h;return this.editor.hasModel()&&o.isLeftClick&&o.isNoneOrSingleMouseDown&&o.target.type===6&&!(((h=o.target.detail.injectedText)===null||h===void 0?void 0:h.options)instanceof c.ModelDecorationInjectedTextOptions)&&(o.hasTriggerModifier||(g?g.keyCodeIsTriggerKey:!1))&&this.languageFeaturesService.definitionProvider.has(this.editor.getModel())}findDefinition(o,g){const h=this.editor.getModel();return h?(0,u.getDefinitionsAtPosition)(this.languageFeaturesService.definitionProvider,h,o,g):Promise.resolve(null)}gotoDefinition(o,g){return this.editor.setPosition(o),this.editor.invokeWithinContext(h=>{const m=!g&&this.editor.getOption(87)&&!this.isInPeekEditor(h);return new r.DefinitionAction({openToSide:g,openInPeek:m,muteMessage:!0},{title:{value:"",original:""},id:"",precondition:void 0}).run(h)})}isInPeekEditor(o){const g=o.get(t.IContextKeyService);return i.PeekContext.inPeekEditor.getValue(g)}dispose(){this.toUnhook.dispose(),this.toUnhookForKeyboard.dispose()}};e.GotoDefinitionAtPositionEditorContribution=s,s.ID="editor.contrib.gotodefinitionatposition",s.MAX_SOURCE_PREVIEW_LINES=8,e.GotoDefinitionAtPositionEditorContribution=s=d=ke([ge(1,b.ITextModelService),ge(2,v.ILanguageService),ge(3,f.ILanguageFeaturesService)],s),(0,p.registerEditorContribution)(s.ID,s,2)}),define(se[915],oe([1,0,7,13,14,12,2,49,5,18,237,140,260,116,382,689,97,57,88]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerHoverParticipant=e.MarkerHover=void 0;const d=L.$;class s{constructor(h,m,C){this.owner=h,this.range=m,this.marker=C}isValidForHoverAnchor(h){return h.type===1&&this.range.startColumn<=h.range.startColumn&&this.range.endColumn>=h.range.endColumn}}e.MarkerHover=s;const l={type:1,filter:{include:n.CodeActionKind.QuickFix},triggerAction:n.CodeActionTriggerSource.QuickFixHover};let o=class{constructor(h,m,C,w){this._editor=h,this._markerDecorationsService=m,this._openerService=C,this._languageFeaturesService=w,this.hoverOrdinal=1,this.recentMarkerCodeActionsInfo=void 0}computeSync(h,m){if(!this._editor.hasModel()||h.type!==1&&!h.supportsMarkerHover)return[];const C=this._editor.getModel(),w=h.range.startLineNumber,D=C.getLineMaxColumn(w),I=[];for(const T of m){const A=T.range.startLineNumber===w?T.range.startColumn:1,P=T.range.endLineNumber===w?T.range.endColumn:D,N=this._markerDecorationsService.getMarker(C.uri,T);if(!N)continue;const M=new _.Range(h.range.startLineNumber,A,h.range.startLineNumber,P);I.push(new s(this,M,N))}return I}renderHoverParts(h,m){if(!m.length)return S.Disposable.None;const C=new S.DisposableStore;m.forEach(D=>h.fragment.appendChild(this.renderMarkerHover(D,C)));const w=m.length===1?m[0]:m.sort((D,I)=>u.MarkerSeverity.compare(D.marker.severity,I.marker.severity))[0];return this.renderMarkerStatusbar(h,w,C),C}renderMarkerHover(h,m){const C=d("div.hover-row"),w=L.append(C,d("div.marker.hover-contents")),{source:D,message:I,code:T,relatedInformation:A}=h.marker;this._editor.applyFontInfo(w);const P=L.append(w,d("span"));if(P.style.whiteSpace="pre-wrap",P.innerText=I,D||T)if(T&&typeof T!="string"){const N=d("span");if(D){const O=L.append(N,d("span"));O.innerText=D}const M=L.append(N,d("a.code-link"));M.setAttribute("href",T.target.toString()),m.add(L.addDisposableListener(M,"click",O=>{this._openerService.open(T.target,{allowCommands:!0}),O.preventDefault(),O.stopPropagation()}));const R=L.append(M,d("span"));R.innerText=T.value;const x=L.append(w,N);x.style.opacity="0.6",x.style.paddingLeft="6px"}else{const N=L.append(w,d("span"));N.style.opacity="0.6",N.style.paddingLeft="6px",N.innerText=D&&T?`${D}(${T})`:D||`(${T})`}if((0,k.isNonEmptyArray)(A))for(const{message:N,resource:M,startLineNumber:R,startColumn:x}of A){const O=L.append(w,d("div"));O.style.marginTop="8px";const B=L.append(O,d("a"));B.innerText=`${(0,p.basename)(M)}(${R}, ${x}): `,B.style.cursor="pointer",m.add(L.addDisposableListener(B,"click",V=>{V.stopPropagation(),V.preventDefault(),this._openerService&&this._openerService.open(M,{fromUserGesture:!0,editorOptions:{selection:{startLineNumber:R,startColumn:x}}}).catch(E.onUnexpectedError)}));const W=L.append(O,d("span"));W.innerText=N,this._editor.applyFontInfo(W)}return C}renderMarkerStatusbar(h,m,C){if((m.marker.severity===u.MarkerSeverity.Error||m.marker.severity===u.MarkerSeverity.Warning||m.marker.severity===u.MarkerSeverity.Info)&&h.statusBar.addAction({label:r.localize(0,null),commandId:t.NextMarkerAction.ID,run:()=>{var w;h.hide(),(w=t.MarkerController.get(this._editor))===null||w===void 0||w.showAtMarker(m.marker),this._editor.focus()}}),!this._editor.getOption(90)){const w=h.statusBar.append(d("div"));this.recentMarkerCodeActionsInfo&&(u.IMarkerData.makeKey(this.recentMarkerCodeActionsInfo.marker)===u.IMarkerData.makeKey(m.marker)?this.recentMarkerCodeActionsInfo.hasCodeActions||(w.textContent=r.localize(1,null)):this.recentMarkerCodeActionsInfo=void 0);const D=this.recentMarkerCodeActionsInfo&&!this.recentMarkerCodeActionsInfo.hasCodeActions?S.Disposable.None:(0,y.disposableTimeout)(()=>w.textContent=r.localize(2,null),200,C);w.textContent||(w.textContent=String.fromCharCode(160));const I=this.getCodeActions(m.marker);C.add((0,S.toDisposable)(()=>I.cancel())),I.then(T=>{if(D.dispose(),this.recentMarkerCodeActionsInfo={marker:m.marker,hasCodeActions:T.validActions.length>0},!this.recentMarkerCodeActionsInfo.hasCodeActions){T.dispose(),w.textContent=r.localize(3,null);return}w.style.display="none";let A=!1;C.add((0,S.toDisposable)(()=>{A||T.dispose()})),h.statusBar.addAction({label:r.localize(4,null),commandId:a.quickFixCommandId,run:P=>{A=!0;const N=i.CodeActionController.get(this._editor),M=L.getDomNodePagePosition(P);h.hide(),N?.showCodeActions(l,T,{x:M.left,y:M.top,width:M.width,height:M.height})}})},E.onUnexpectedError)}}getCodeActions(h){return(0,y.createCancelablePromise)(m=>(0,a.getCodeActions)(this._languageFeaturesService.codeActionProvider,this._editor.getModel(),new _.Range(h.startLineNumber,h.startColumn,h.endLineNumber,h.endColumn),l,c.Progress.None,m))}};e.MarkerHoverParticipant=o,e.MarkerHoverParticipant=o=ke([ge(1,b.IMarkerDecorationsService),ge(2,f.IOpenerService),ge(3,v.ILanguageFeaturesService)],o)}),define(se[385],oe([1,0,65,2,16,5,21,43,384,379,796,8,57,29,23,101,253,915,257,34,14,687,465]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l){"use strict";var o;Object.defineProperty(e,"__esModule",{value:!0}),e.HoverController=void 0;const g=!1;let h=o=class extends k.Disposable{constructor(O,B,W,V,K){super(),this._editor=O,this._instantiationService=B,this._openerService=W,this._languageService=V,this._keybindingService=K,this._listenersStore=new k.DisposableStore,this._hoverState={mouseDown:!1,contentHoverFocused:!1,activatedByDecoratorClick:!1},this._reactToEditorMouseMoveRunner=this._register(new s.RunOnceScheduler(()=>this._reactToEditorMouseMove(this._mouseMoveEvent),0)),this._hookListeners(),this._register(this._editor.onDidChangeConfiguration(F=>{F.hasChanged(60)&&(this._unhookListeners(),this._hookListeners())}))}static get(O){return O.getContribution(o.ID)}_hookListeners(){const O=this._editor.getOption(60);this._hoverSettings={enabled:O.enabled,sticky:O.sticky,hidingDelay:O.delay},O.enabled?(this._listenersStore.add(this._editor.onMouseDown(B=>this._onEditorMouseDown(B))),this._listenersStore.add(this._editor.onMouseUp(()=>this._onEditorMouseUp())),this._listenersStore.add(this._editor.onMouseMove(B=>this._onEditorMouseMove(B))),this._listenersStore.add(this._editor.onKeyDown(B=>this._onKeyDown(B)))):(this._listenersStore.add(this._editor.onMouseMove(B=>this._onEditorMouseMove(B))),this._listenersStore.add(this._editor.onKeyDown(B=>this._onKeyDown(B)))),this._listenersStore.add(this._editor.onMouseLeave(B=>this._onEditorMouseLeave(B))),this._listenersStore.add(this._editor.onDidChangeModel(()=>{this._cancelScheduler(),this._hideWidgets()})),this._listenersStore.add(this._editor.onDidChangeModelContent(()=>this._cancelScheduler())),this._listenersStore.add(this._editor.onDidScrollChange(B=>this._onEditorScrollChanged(B)))}_unhookListeners(){this._listenersStore.clear()}_cancelScheduler(){this._mouseMoveEvent=void 0,this._reactToEditorMouseMoveRunner.cancel()}_onEditorScrollChanged(O){(O.scrollTopChanged||O.scrollLeftChanged)&&this._hideWidgets()}_onEditorMouseDown(O){var B;this._hoverState.mouseDown=!0;const W=O.target;if(W.type===9&&W.detail===v.ContentHoverWidget.ID){this._hoverState.contentHoverFocused=!0;return}W.type===12&&W.detail===b.MarginHoverWidget.ID||(W.type!==12&&(this._hoverState.contentHoverFocused=!1),!(!((B=this._contentWidget)===null||B===void 0)&&B.widget.isResizing)&&this._hideWidgets())}_onEditorMouseUp(){this._hoverState.mouseDown=!1}_onEditorMouseLeave(O){var B,W;this._cancelScheduler();const V=O.event.browserEvent.relatedTarget;!((B=this._contentWidget)===null||B===void 0)&&B.widget.isResizing||!((W=this._contentWidget)===null||W===void 0)&&W.containsNode(V)||g||this._hideWidgets()}_isMouseOverWidget(O){var B,W,V,K,F;const q=O.target,ie=this._hoverSettings.sticky;return!!(ie&&q.type===9&&q.detail===v.ContentHoverWidget.ID||ie&&(!((B=this._contentWidget)===null||B===void 0)&&B.containsNode((W=O.event.browserEvent.view)===null||W===void 0?void 0:W.document.activeElement))&&!(!((K=(V=O.event.browserEvent.view)===null||V===void 0?void 0:V.getSelection())===null||K===void 0)&&K.isCollapsed)||!ie&&q.type===9&&q.detail===v.ContentHoverWidget.ID&&(!((F=this._contentWidget)===null||F===void 0)&&F.isColorPickerVisible)||ie&&q.type===12&&q.detail===b.MarginHoverWidget.ID)}_onEditorMouseMove(O){var B,W,V,K;if(this._mouseMoveEvent=O,!((B=this._contentWidget)===null||B===void 0)&&B.isFocused||!((W=this._contentWidget)===null||W===void 0)&&W.isResizing||this._hoverState.mouseDown&&this._hoverState.contentHoverFocused)return;const F=this._hoverSettings.sticky;if(F&&(!((V=this._contentWidget)===null||V===void 0)&&V.isVisibleFromKeyboard))return;if(this._isMouseOverWidget(O)){this._reactToEditorMouseMoveRunner.cancel();return}const ie=this._hoverSettings.hidingDelay;if(!((K=this._contentWidget)===null||K===void 0)&&K.isVisible&&F&&ie>0){this._reactToEditorMouseMoveRunner.isScheduled()||this._reactToEditorMouseMoveRunner.schedule(ie);return}this._reactToEditorMouseMove(O)}_reactToEditorMouseMove(O){var B,W,V,K;if(!O)return;const F=O.target,q=(B=F.element)===null||B===void 0?void 0:B.classList.contains("colorpicker-color-decoration"),ie=this._editor.getOption(146),ae=this._hoverSettings.enabled,ne=this._hoverState.activatedByDecoratorClick;if(q&&(ie==="click"&&!ne||ie==="hover"&&!ae&&!g||ie==="clickAndHover"&&!ae&&!ne)||!q&&!ae&&!ne){this._hideWidgets();return}if(this._getOrCreateContentWidget().showsOrWillShow(O)){(W=this._glyphWidget)===null||W===void 0||W.hide();return}if(F.type===2&&F.position&&F.detail.glyphMarginLane){(V=this._contentWidget)===null||V===void 0||V.hide(),this._getOrCreateGlyphWidget().startShowingAt(F.position.lineNumber,F.detail.glyphMarginLane);return}if(F.type===3&&F.position){(K=this._contentWidget)===null||K===void 0||K.hide(),this._getOrCreateGlyphWidget().startShowingAt(F.position.lineNumber,"lineNo");return}g||this._hideWidgets()}_onKeyDown(O){var B;if(!this._editor.hasModel())return;const W=this._keybindingService.softDispatch(O,this._editor.getDomNode()),V=W.kind===1||W.kind===2&&W.commandId==="editor.action.showHover"&&((B=this._contentWidget)===null||B===void 0?void 0:B.isVisible);O.keyCode===5||O.keyCode===6||O.keyCode===57||O.keyCode===4||V||this._hideWidgets()}_hideWidgets(){var O,B,W;g||this._hoverState.mouseDown&&this._hoverState.contentHoverFocused&&(!((O=this._contentWidget)===null||O===void 0)&&O.isColorPickerVisible)||c.InlineSuggestionHintsContentWidget.dropDownVisible||(this._hoverState.activatedByDecoratorClick=!1,this._hoverState.contentHoverFocused=!1,(B=this._glyphWidget)===null||B===void 0||B.hide(),(W=this._contentWidget)===null||W===void 0||W.hide())}_getOrCreateContentWidget(){return this._contentWidget||(this._contentWidget=this._instantiationService.createInstance(v.ContentHoverController,this._editor)),this._contentWidget}_getOrCreateGlyphWidget(){return this._glyphWidget||(this._glyphWidget=new b.MarginHoverWidget(this._editor,this._languageService,this._openerService)),this._glyphWidget}showContentHover(O,B,W,V,K=!1){this._hoverState.activatedByDecoratorClick=K,this._getOrCreateContentWidget().startShowingAtRange(O,B,W,V)}focus(){var O;(O=this._contentWidget)===null||O===void 0||O.focus()}scrollUp(){var O;(O=this._contentWidget)===null||O===void 0||O.scrollUp()}scrollDown(){var O;(O=this._contentWidget)===null||O===void 0||O.scrollDown()}scrollLeft(){var O;(O=this._contentWidget)===null||O===void 0||O.scrollLeft()}scrollRight(){var O;(O=this._contentWidget)===null||O===void 0||O.scrollRight()}pageUp(){var O;(O=this._contentWidget)===null||O===void 0||O.pageUp()}pageDown(){var O;(O=this._contentWidget)===null||O===void 0||O.pageDown()}goToTop(){var O;(O=this._contentWidget)===null||O===void 0||O.goToTop()}goToBottom(){var O;(O=this._contentWidget)===null||O===void 0||O.goToBottom()}get isColorPickerVisible(){var O;return(O=this._contentWidget)===null||O===void 0?void 0:O.isColorPickerVisible}get isHoverVisible(){var O;return(O=this._contentWidget)===null||O===void 0?void 0:O.isVisible}dispose(){var O,B;super.dispose(),this._unhookListeners(),this._listenersStore.dispose(),(O=this._glyphWidget)===null||O===void 0||O.dispose(),(B=this._contentWidget)===null||B===void 0||B.dispose()}};e.HoverController=h,h.ID="editor.contrib.hover",e.HoverController=h=o=ke([ge(1,a.IInstantiationService),ge(2,i.IOpenerService),ge(3,p.ILanguageService),ge(4,d.IKeybindingService)],h);var m;(function(x){x.NoAutoFocus="noAutoFocus",x.FocusIfVisible="focusIfVisible",x.AutoFocusImmediately="autoFocusImmediately"})(m||(m={}));class C extends y.EditorAction{constructor(){super({id:"editor.action.showHover",label:l.localize(0,null),metadata:{description:"Show or Focus Hover",args:[{name:"args",schema:{type:"object",properties:{focus:{description:"Controls if and when the hover should take focus upon being triggered by this action.",enum:[m.NoAutoFocus,m.FocusIfVisible,m.AutoFocusImmediately],enumDescriptions:[l.localize(1,null),l.localize(2,null),l.localize(3,null)],default:m.FocusIfVisible}}}}]},alias:"Show or Focus Hover",precondition:void 0,kbOpts:{kbExpr:S.EditorContextKeys.editorTextFocus,primary:(0,L.KeyChord)(2089,2087),weight:100}})}run(O,B,W){if(!B.hasModel())return;const V=h.get(B);if(!V)return;const K=W?.focus;let F=m.FocusIfVisible;Object.values(m).includes(K)?F=K:typeof K=="boolean"&&K&&(F=m.AutoFocusImmediately);const q=ae=>{const ne=B.getPosition(),$=new E.Range(ne.lineNumber,ne.column,ne.lineNumber,ne.column);V.showContentHover($,1,1,ae)},ie=B.getOption(2)===2;V.isHoverVisible?F!==m.NoAutoFocus?V.focus():q(ie):q(ie||F===m.AutoFocusImmediately)}}class w extends y.EditorAction{constructor(){super({id:"editor.action.showDefinitionPreviewHover",label:l.localize(4,null),alias:"Show Definition Preview Hover",precondition:void 0})}run(O,B){const W=h.get(B);if(!W)return;const V=B.getPosition();if(!V)return;const K=new E.Range(V.lineNumber,V.column,V.lineNumber,V.column),F=_.GotoDefinitionAtPositionEditorContribution.get(B);if(!F)return;F.startFindDefinitionFromCursor(V).then(()=>{W.showContentHover(K,1,1,!0)})}}class D extends y.EditorAction{constructor(){super({id:"editor.action.scrollUpHover",label:l.localize(5,null),alias:"Scroll Up Hover",precondition:S.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:S.EditorContextKeys.hoverFocused,primary:16,weight:100}})}run(O,B){const W=h.get(B);W&&W.scrollUp()}}class I extends y.EditorAction{constructor(){super({id:"editor.action.scrollDownHover",label:l.localize(6,null),alias:"Scroll Down Hover",precondition:S.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:S.EditorContextKeys.hoverFocused,primary:18,weight:100}})}run(O,B){const W=h.get(B);W&&W.scrollDown()}}class T extends y.EditorAction{constructor(){super({id:"editor.action.scrollLeftHover",label:l.localize(7,null),alias:"Scroll Left Hover",precondition:S.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:S.EditorContextKeys.hoverFocused,primary:15,weight:100}})}run(O,B){const W=h.get(B);W&&W.scrollLeft()}}class A extends y.EditorAction{constructor(){super({id:"editor.action.scrollRightHover",label:l.localize(8,null),alias:"Scroll Right Hover",precondition:S.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:S.EditorContextKeys.hoverFocused,primary:17,weight:100}})}run(O,B){const W=h.get(B);W&&W.scrollRight()}}class P extends y.EditorAction{constructor(){super({id:"editor.action.pageUpHover",label:l.localize(9,null),alias:"Page Up Hover",precondition:S.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:S.EditorContextKeys.hoverFocused,primary:11,secondary:[528],weight:100}})}run(O,B){const W=h.get(B);W&&W.pageUp()}}class N extends y.EditorAction{constructor(){super({id:"editor.action.pageDownHover",label:l.localize(10,null),alias:"Page Down Hover",precondition:S.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:S.EditorContextKeys.hoverFocused,primary:12,secondary:[530],weight:100}})}run(O,B){const W=h.get(B);W&&W.pageDown()}}class M extends y.EditorAction{constructor(){super({id:"editor.action.goToTopHover",label:l.localize(11,null),alias:"Go To Bottom Hover",precondition:S.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:S.EditorContextKeys.hoverFocused,primary:14,secondary:[2064],weight:100}})}run(O,B){const W=h.get(B);W&&W.goToTop()}}class R extends y.EditorAction{constructor(){super({id:"editor.action.goToBottomHover",label:l.localize(12,null),alias:"Go To Bottom Hover",precondition:S.EditorContextKeys.hoverFocused,kbOpts:{kbExpr:S.EditorContextKeys.hoverFocused,primary:13,secondary:[2066],weight:100}})}run(O,B){const W=h.get(B);W&&W.goToBottom()}}(0,y.registerEditorContribution)(h.ID,h,2),(0,y.registerEditorAction)(C),(0,y.registerEditorAction)(w),(0,y.registerEditorAction)(D),(0,y.registerEditorAction)(I),(0,y.registerEditorAction)(T),(0,y.registerEditorAction)(A),(0,y.registerEditorAction)(P),(0,y.registerEditorAction)(N),(0,y.registerEditorAction)(M),(0,y.registerEditorAction)(R),r.HoverParticipantRegistry.register(u.MarkdownHoverParticipant),r.HoverParticipantRegistry.register(f.MarkerHoverParticipant),(0,t.registerThemingParticipant)((x,O)=>{const B=x.getColor(n.editorHoverBorder);B&&(O.addRule(`.monaco-editor .monaco-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${B.transparent(.5)}; }`),O.addRule(`.monaco-editor .monaco-hover hr { border-top: 1px solid ${B.transparent(.5)}; }`),O.addRule(`.monaco-editor .monaco-hover hr { border-bottom: 0px solid ${B.transparent(.5)}; }`))})}),define(se[916],oe([1,0,2,16,5,375,376,385,101]),function(te,e,L,k,y,E,S,p,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorContribution=void 0;class v extends L.Disposable{constructor(a){super(),this._editor=a,this._register(a.onMouseDown(i=>this.onMouseDown(i)))}dispose(){super.dispose()}onMouseDown(a){const i=this._editor.getOption(146);if(i!=="click"&&i!=="clickAndHover")return;const n=a.target;if(n.type!==6||!n.detail.injectedText||n.detail.injectedText.options.attachedData!==E.ColorDecorationInjectedTextMarker||!n.range)return;const t=this._editor.getContribution(p.HoverController.ID);if(t&&!t.isColorPickerVisible){const r=new y.Range(n.range.startLineNumber,n.range.startColumn+1,n.range.endLineNumber,n.range.endColumn+1);t.showContentHover(r,1,0,!1,!0)}}}e.ColorContribution=v,v.ID="editor.contrib.colorContribution",(0,k.registerEditorContribution)(v.ID,v,2),_.HoverParticipantRegistry.register(S.ColorHoverParticipant)}),define(se[386],oe([1,0,7,42,19,175,5,68,263,142,30,25,15,59,8,50]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.goToDefinitionWithLocation=e.showGoToContextMenu=void 0;async function u(c,d,s,l){var o;const g=c.get(p.ITextModelService),h=c.get(n.IContextMenuService),m=c.get(a.ICommandService),C=c.get(t.IInstantiationService),w=c.get(r.INotificationService);if(await l.item.resolve(y.CancellationToken.None),!l.part.location)return;const D=l.part.location,I=[],T=new Set(b.MenuRegistry.getMenuItems(b.MenuId.EditorContext).map(P=>(0,b.isIMenuItem)(P)?P.command.id:(0,E.generateUuid)()));for(const P of _.SymbolNavigationAction.all())T.has(P.desc.id)&&I.push(new k.Action(P.desc.id,b.MenuItemAction.label(P.desc,{renderShortTitle:!0}),void 0,!0,async()=>{const N=await g.createModelReference(D.uri);try{const M=new _.SymbolNavigationAnchor(N.object.textEditorModel,S.Range.getStartPosition(D.range)),R=l.item.anchor.range;await C.invokeFunction(P.runEditorCommand.bind(P),d,M,R)}finally{N.dispose()}}));if(l.part.command){const{command:P}=l.part;I.push(new k.Separator),I.push(new k.Action(P.id,P.title,void 0,!0,async()=>{var N;try{await m.executeCommand(P.id,...(N=P.arguments)!==null&&N!==void 0?N:[])}catch(M){w.notify({severity:r.Severity.Error,source:l.item.provider.displayName,message:M})}}))}const A=d.getOption(126);h.showContextMenu({domForShadowRoot:A&&(o=d.getDomNode())!==null&&o!==void 0?o:void 0,getAnchor:()=>{const P=L.getDomNodePagePosition(s);return{x:P.left,y:P.top+P.height+8}},getActions:()=>I,onHide:()=>{d.focus()},autoSelectFirstItem:!0})}e.showGoToContextMenu=u;async function f(c,d,s,l){const g=await c.get(p.ITextModelService).createModelReference(l.uri);await s.invokeWithinContext(async h=>{const m=d.hasSideBySideModifier,C=h.get(i.IContextKeyService),w=v.PeekContext.inPeekEditor.getValue(C),D=!m&&s.getOption(87)&&!w;return new _.DefinitionAction({openToSide:m,openInPeek:D,muteMessage:!0},{title:{value:"",original:""},id:"",precondition:void 0}).run(h,new _.SymbolNavigationAnchor(g.object.textEditorModel,S.Range.getStartPosition(l.range)),S.Range.lift(l.range))}),g.dispose()}e.goToDefinitionWithLocation=f}),define(se[387],oe([1,0,7,13,14,19,12,2,53,20,22,167,127,36,74,5,31,41,38,79,18,68,188,333,386,25,45,8,50,29,23]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w,D,I,T){"use strict";var A;Object.defineProperty(e,"__esModule",{value:!0}),e.InlayHintsController=e.RenderedInlayHintLabelPart=void 0;class P{constructor(){this._entries=new _.LRUCache(50)}get(W){const V=P._key(W);return this._entries.get(V)}set(W,V){const K=P._key(W);this._entries.set(K,V)}static _key(W){return`${W.uri.toString()}/${W.getVersionId()}`}}const N=(0,w.createDecorator)("IInlayHintsCache");(0,C.registerSingleton)(N,P,1);class M{constructor(W,V){this.item=W,this.index=V}get part(){const W=this.item.hint.label;return typeof W=="string"?{label:W}:W[this.index]}}e.RenderedInlayHintLabelPart=M;class R{constructor(W,V){this.part=W,this.hasTriggerModifier=V}}let x=A=class{static get(W){var V;return(V=W.getContribution(A.ID))!==null&&V!==void 0?V:void 0}constructor(W,V,K,F,q,ie,ae){this._editor=W,this._languageFeaturesService=V,this._inlayHintsCache=F,this._commandService=q,this._notificationService=ie,this._instaService=ae,this._disposables=new p.DisposableStore,this._sessionDisposables=new p.DisposableStore,this._decorationsMetadata=new Map,this._ruleFactory=new a.DynamicCssRules(this._editor),this._activeRenderMode=0,this._debounceInfo=K.for(V.inlayHintsProvider,"InlayHint",{min:25}),this._disposables.add(V.inlayHintsProvider.onDidChange(()=>this._update())),this._disposables.add(W.onDidChangeModel(()=>this._update())),this._disposables.add(W.onDidChangeModelLanguage(()=>this._update())),this._disposables.add(W.onDidChangeConfiguration(ne=>{ne.hasChanged(139)&&this._update()})),this._update()}dispose(){this._sessionDisposables.dispose(),this._removeAllDecorations(),this._disposables.dispose()}_update(){this._sessionDisposables.clear(),this._removeAllDecorations();const W=this._editor.getOption(139);if(W.enabled==="off")return;const V=this._editor.getModel();if(!V||!this._languageFeaturesService.inlayHintsProvider.has(V))return;if(W.enabled==="on")this._activeRenderMode=0;else{let ae,ne;W.enabled==="onUnlessPressed"?(ae=0,ne=1):(ae=1,ne=0),this._activeRenderMode=ae,this._sessionDisposables.add(L.ModifierKeyEmitter.getInstance().event($=>{if(!this._editor.hasModel())return;const J=$.altKey&&$.ctrlKey&&!($.shiftKey||$.metaKey)?ne:ae;if(J!==this._activeRenderMode){this._activeRenderMode=J;const Q=this._editor.getModel(),re=this._copyInlayHintsWithCurrentAnchor(Q);this._updateHintsDecorators([Q.getFullModelRange()],re),ie.schedule(0)}}))}const K=this._inlayHintsCache.get(V);K&&this._updateHintsDecorators([V.getFullModelRange()],K),this._sessionDisposables.add((0,p.toDisposable)(()=>{V.isDisposed()||this._cacheHintsForFastRestore(V)}));let F;const q=new Set,ie=new y.RunOnceScheduler(async()=>{const ae=Date.now();F?.dispose(!0),F=new E.CancellationTokenSource;const ne=V.onWillDispose(()=>F?.cancel());try{const $=F.token,J=await g.InlayHintsFragments.create(this._languageFeaturesService.inlayHintsProvider,V,this._getHintsRanges(),$);if(ie.delay=this._debounceInfo.update(V,Date.now()-ae),$.isCancellationRequested){J.dispose();return}for(const Q of J.provider)typeof Q.onDidChangeInlayHints=="function"&&!q.has(Q)&&(q.add(Q),this._sessionDisposables.add(Q.onDidChangeInlayHints(()=>{ie.isScheduled()||ie.schedule()})));this._sessionDisposables.add(J),this._updateHintsDecorators(J.ranges,J.items),this._cacheHintsForFastRestore(V)}catch($){(0,S.onUnexpectedError)($)}finally{F.dispose(),ne.dispose()}},this._debounceInfo.get(V));this._sessionDisposables.add(ie),this._sessionDisposables.add((0,p.toDisposable)(()=>F?.dispose(!0))),ie.schedule(0),this._sessionDisposables.add(this._editor.onDidScrollChange(ae=>{(ae.scrollTopChanged||!ie.isScheduled())&&ie.schedule()})),this._sessionDisposables.add(this._editor.onDidChangeModelContent(ae=>{F?.cancel();const ne=Math.max(ie.delay,1250);ie.schedule(ne)})),this._sessionDisposables.add(this._installDblClickGesture(()=>ie.schedule(0))),this._sessionDisposables.add(this._installLinkGesture()),this._sessionDisposables.add(this._installContextMenu())}_installLinkGesture(){const W=new p.DisposableStore,V=W.add(new o.ClickLinkGesture(this._editor)),K=new p.DisposableStore;return W.add(K),W.add(V.onMouseMoveOrRelevantKeyDown(F=>{const[q]=F,ie=this._getInlayHintLabelPart(q),ae=this._editor.getModel();if(!ie||!ae){K.clear();return}const ne=new E.CancellationTokenSource;K.add((0,p.toDisposable)(()=>ne.dispose(!0))),ie.item.resolve(ne.token),this._activeInlayHintPart=ie.part.command||ie.part.location?new R(ie,q.hasTriggerModifier):void 0;const $=ae.validatePosition(ie.item.hint.position).lineNumber,J=new r.Range($,1,$,ae.getLineMaxColumn($)),Q=this._getInlineHintsForRange(J);this._updateHintsDecorators([J],Q),K.add((0,p.toDisposable)(()=>{this._activeInlayHintPart=void 0,this._updateHintsDecorators([J],Q)}))})),W.add(V.onCancel(()=>K.clear())),W.add(V.onExecute(async F=>{const q=this._getInlayHintLabelPart(F);if(q){const ie=q.part;ie.location?this._instaService.invokeFunction(h.goToDefinitionWithLocation,F,this._editor,ie.location):u.Command.is(ie.command)&&await this._invokeCommand(ie.command,q.item)}})),W}_getInlineHintsForRange(W){const V=new Set;for(const K of this._decorationsMetadata.values())W.containsRange(K.item.anchor.range)&&V.add(K.item);return Array.from(V)}_installDblClickGesture(W){return this._editor.onMouseUp(async V=>{if(V.event.detail!==2)return;const K=this._getInlayHintLabelPart(V);if(K&&(V.event.preventDefault(),await K.item.resolve(E.CancellationToken.None),(0,k.isNonEmptyArray)(K.item.hint.textEdits))){const F=K.item.hint.textEdits.map(q=>t.EditOperation.replace(r.Range.lift(q.range),q.text));this._editor.executeEdits("inlayHint.default",F),W()}})}_installContextMenu(){return this._editor.onContextMenu(async W=>{if(!(W.event.target instanceof HTMLElement))return;const V=this._getInlayHintLabelPart(W);V&&await this._instaService.invokeFunction(h.showGoToContextMenu,this._editor,W.event.target,V)})}_getInlayHintLabelPart(W){var V;if(W.target.type!==6)return;const K=(V=W.target.detail.injectedText)===null||V===void 0?void 0:V.options;if(K instanceof c.ModelDecorationInjectedTextOptions&&K?.attachedData instanceof M)return K.attachedData}async _invokeCommand(W,V){var K;try{await this._commandService.executeCommand(W.id,...(K=W.arguments)!==null&&K!==void 0?K:[])}catch(F){this._notificationService.notify({severity:D.Severity.Error,source:V.provider.displayName,message:F})}}_cacheHintsForFastRestore(W){const V=this._copyInlayHintsWithCurrentAnchor(W);this._inlayHintsCache.set(W,V)}_copyInlayHintsWithCurrentAnchor(W){const V=new Map;for(const[K,F]of this._decorationsMetadata){if(V.has(F.item))continue;const q=W.getDecorationRange(K);if(q){const ie=new g.InlayHintAnchor(q,F.item.anchor.direction),ae=F.item.with({anchor:ie});V.set(F.item,ae)}}return Array.from(V.values())}_getHintsRanges(){const V=this._editor.getModel(),K=this._editor.getVisibleRangesPlusViewportAboveBelow(),F=[];for(const q of K.sort(r.Range.compareRangesUsingStarts)){const ie=V.validateRange(new r.Range(q.startLineNumber-30,q.startColumn,q.endLineNumber+30,q.endColumn));F.length===0||!r.Range.areIntersectingOrTouching(F[F.length-1],ie)?F.push(ie):F[F.length-1]=r.Range.plusRange(F[F.length-1],ie)}return F}_updateHintsDecorators(W,V){var K,F;const q=[],ie=(X,U,G,z,H)=>{const Y={content:G,inlineClassNameAffectsLetterSpacing:!0,inlineClassName:U.className,cursorStops:z,attachedData:H};q.push({item:X,classNameRef:U,decoration:{range:X.anchor.range,options:{description:"InlayHint",showIfCollapsed:X.anchor.range.isEmpty(),collapseOnReplaceEdit:!X.anchor.range.isEmpty(),stickiness:0,[X.anchor.direction]:this._activeRenderMode===0?Y:void 0}}})},ae=(X,U)=>{const G=this._ruleFactory.createClassNameRef({width:`${ne/3|0}px`,display:"inline-block"});ie(X,G,"\u200A",U?f.InjectedTextCursorStops.Right:f.InjectedTextCursorStops.None)},{fontSize:ne,fontFamily:$,padding:J,isUniform:Q}=this._getLayoutInfo(),re="--code-editorInlayHintsFontFamily";this._editor.getContainerDomNode().style.setProperty(re,$);let de={line:0,totalLen:0};for(const X of V){if(de.line!==X.anchor.range.startLineNumber&&(de={line:X.anchor.range.startLineNumber,totalLen:0}),de.totalLen>A._MAX_LABEL_LEN)continue;X.hint.paddingLeft&&ae(X,!1);const U=typeof X.hint.label=="string"?[{label:X.hint.label}]:X.hint.label;for(let G=0;G<U.length;G++){const z=U[G],H=G===0,Y=G===U.length-1,j={fontSize:`${ne}px`,fontFamily:`var(${re}), ${n.EDITOR_FONT_DEFAULTS.fontFamily}`,verticalAlign:Q?"baseline":"middle",unicodeBidi:"isolate"};(0,k.isNonEmptyArray)(X.hint.textEdits)&&(j.cursor="default"),this._fillInColors(j,X.hint),(z.command||z.location)&&((K=this._activeInlayHintPart)===null||K===void 0?void 0:K.part.item)===X&&this._activeInlayHintPart.part.index===G&&(j.textDecoration="underline",this._activeInlayHintPart.hasTriggerModifier&&(j.color=(0,T.themeColorFromId)(I.editorActiveLinkForeground),j.cursor="pointer")),J&&(H&&Y?(j.padding=`1px ${Math.max(1,ne/4)|0}px`,j.borderRadius=`${ne/4|0}px`):H?(j.padding=`1px 0 1px ${Math.max(1,ne/4)|0}px`,j.borderRadius=`${ne/4|0}px 0 0 ${ne/4|0}px`):Y?(j.padding=`1px ${Math.max(1,ne/4)|0}px 1px 0`,j.borderRadius=`0 ${ne/4|0}px ${ne/4|0}px 0`):j.padding="1px 0 1px 0");let Z=z.label;de.totalLen+=Z.length;let ee=!1;const le=de.totalLen-A._MAX_LABEL_LEN;if(le>0&&(Z=Z.slice(0,-le)+"\u2026",ee=!0),ie(X,this._ruleFactory.createClassNameRef(j),O(Z),Y&&!X.hint.paddingRight?f.InjectedTextCursorStops.Right:f.InjectedTextCursorStops.None,new M(X,G)),ee)break}if(X.hint.paddingRight&&ae(X,!0),q.length>A._MAX_DECORATORS)break}const he=[];for(const[X,U]of this._decorationsMetadata){const G=(F=this._editor.getModel())===null||F===void 0?void 0:F.getDecorationRange(X);G&&W.some(z=>z.containsRange(G))&&(he.push(X),U.classNameRef.dispose(),this._decorationsMetadata.delete(X))}const me=i.StableEditorScrollState.capture(this._editor);this._editor.changeDecorations(X=>{const U=X.deltaDecorations(he,q.map(G=>G.decoration));for(let G=0;G<U.length;G++){const z=q[G];this._decorationsMetadata.set(U[G],z)}}),me.restore(this._editor)}_fillInColors(W,V){V.kind===u.InlayHintKind.Parameter?(W.backgroundColor=(0,T.themeColorFromId)(I.editorInlayHintParameterBackground),W.color=(0,T.themeColorFromId)(I.editorInlayHintParameterForeground)):V.kind===u.InlayHintKind.Type?(W.backgroundColor=(0,T.themeColorFromId)(I.editorInlayHintTypeBackground),W.color=(0,T.themeColorFromId)(I.editorInlayHintTypeForeground)):(W.backgroundColor=(0,T.themeColorFromId)(I.editorInlayHintBackground),W.color=(0,T.themeColorFromId)(I.editorInlayHintForeground))}_getLayoutInfo(){const W=this._editor.getOption(139),V=W.padding,K=this._editor.getOption(52),F=this._editor.getOption(49);let q=W.fontSize;(!q||q<5||q>K)&&(q=K);const ie=W.fontFamily||F;return{fontSize:q,fontFamily:ie,padding:V,isUniform:!V&&ie===F&&q===K}}_removeAllDecorations(){this._editor.removeDecorations(Array.from(this._decorationsMetadata.keys()));for(const W of this._decorationsMetadata.values())W.classNameRef.dispose();this._decorationsMetadata.clear()}};e.InlayHintsController=x,x.ID="editor.contrib.InlayHints",x._MAX_DECORATORS=1500,x._MAX_LABEL_LEN=43,e.InlayHintsController=x=A=ke([ge(1,s.ILanguageFeaturesService),ge(2,d.ILanguageFeatureDebounceService),ge(3,N),ge(4,m.ICommandService),ge(5,D.INotificationService),ge(6,w.IInstantiationService)],x);function O(B){const W="\xA0";return B.replace(/[ \t]/g,W)}m.CommandsRegistry.registerCommand("_executeInlayHintProvider",async(B,...W)=>{const[V,K]=W;(0,v.assertType)(b.URI.isUri(V)),(0,v.assertType)(r.Range.isIRange(K));const{inlayHintsProvider:F}=B.get(s.ILanguageFeaturesService),q=await B.get(l.ITextModelService).createModelReference(V);try{const ie=await g.InlayHintsFragments.create(F,q.object.textEditorModel,[r.Range.lift(K)],E.CancellationToken.None),ae=ie.items.map(ne=>ne.hint);return setTimeout(()=>ie.dispose(),0),ae}finally{q.dispose()}})}),define(se[917],oe([1,0,14,58,10,38,101,43,68,363,253,387,27,57,18,692,17,333,13]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlayHintsHover=void 0;class d extends S.HoverForeignElementAnchor{constructor(o,g,h,m){super(10,g,o.item.anchor.range,h,m,!0),this.part=o}}let s=class extends b.MarkdownHoverParticipant{constructor(o,g,h,m,C,w){super(o,g,h,m,w),this._resolverService=C,this.hoverOrdinal=6}suggestHoverAnchor(o){var g;if(!a.InlayHintsController.get(this._editor)||o.target.type!==6)return null;const m=(g=o.target.detail.injectedText)===null||g===void 0?void 0:g.options;return m instanceof E.ModelDecorationInjectedTextOptions&&m.attachedData instanceof a.RenderedInlayHintLabelPart?new d(m.attachedData,this,o.event.posx,o.event.posy):null}computeSync(){return[]}computeAsync(o,g,h){return o instanceof d?new L.AsyncIterableObject(async m=>{const{part:C}=o;if(await C.item.resolve(h),h.isCancellationRequested)return;let w;typeof C.item.hint.tooltip=="string"?w=new k.MarkdownString().appendText(C.item.hint.tooltip):C.item.hint.tooltip&&(w=C.item.hint.tooltip),w&&m.emitOne(new b.MarkdownHover(this,o.range,[w],!1,0)),(0,c.isNonEmptyArray)(C.item.hint.textEdits)&&m.emitOne(new b.MarkdownHover(this,o.range,[new k.MarkdownString().appendText((0,r.localize)(0,null))],!1,10001));let D;if(typeof C.part.tooltip=="string"?D=new k.MarkdownString().appendText(C.part.tooltip):C.part.tooltip&&(D=C.part.tooltip),D&&m.emitOne(new b.MarkdownHover(this,o.range,[D],!1,1)),C.part.location||C.part.command){let T;const P=this._editor.getOption(77)==="altKey"?u.isMacintosh?(0,r.localize)(1,null):(0,r.localize)(2,null):u.isMacintosh?(0,r.localize)(3,null):(0,r.localize)(4,null);C.part.location&&C.part.command?T=new k.MarkdownString().appendText((0,r.localize)(5,null,P)):C.part.location?T=new k.MarkdownString().appendText((0,r.localize)(6,null,P)):C.part.command&&(T=new k.MarkdownString(`[${(0,r.localize)(7,null)}](${(0,f.asCommandLink)(C.part.command)} "${C.part.command.title}") (${P})`,{isTrusted:!0})),T&&m.emitOne(new b.MarkdownHover(this,o.range,[T],!1,1e4))}const I=await this._resolveInlayHintLabelPartHover(C,h);for await(const T of I)m.emitOne(T)}):L.AsyncIterableObject.EMPTY}async _resolveInlayHintLabelPartHover(o,g){if(!o.part.location)return L.AsyncIterableObject.EMPTY;const{uri:h,range:m}=o.part.location,C=await this._resolverService.createModelReference(h);try{const w=C.object.textEditorModel;return this._languageFeaturesService.hoverProvider.has(w)?(0,v.getHover)(this._languageFeaturesService.hoverProvider,w,new y.Position(m.startLineNumber,m.startColumn),g).filter(D=>!(0,k.isEmptyMarkdownString)(D.hover.contents)).map(D=>new b.MarkdownHover(this,o.item.anchor.range,D.hover.contents,!1,2+D.ordinal)):L.AsyncIterableObject.EMPTY}finally{C.dispose()}}};e.InlayHintsHover=s,e.InlayHintsHover=s=ke([ge(1,p.ILanguageService),ge(2,n.IOpenerService),ge(3,i.IConfigurationService),ge(4,_.ITextModelService),ge(5,t.ILanguageFeaturesService)],s)}),define(se[918],oe([1,0,16,101,387,917]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,L.registerEditorContribution)(y.InlayHintsController.ID,y.InlayHintsController,1),k.HoverParticipantRegistry.register(E.InlayHintsHover)}),define(se[388],oe([1,0,2,18,908,907,8,59,30,15,21,188,5,252,386,10,19,32,79,7,310,67,261,302]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g){"use strict";var h;Object.defineProperty(e,"__esModule",{value:!0}),e.StickyScrollController=void 0;let m=h=class extends L.Disposable{constructor(w,D,I,T,A,P,N){super(),this._editor=w,this._contextMenuService=D,this._languageFeaturesService=I,this._instaService=T,this._contextKeyService=N,this._sessionStore=new L.DisposableStore,this._foldingModel=null,this._maxStickyLines=Number.MAX_SAFE_INTEGER,this._candidateDefinitionsLength=-1,this._focusedStickyElementIndex=-1,this._enabled=!1,this._focused=!1,this._positionRevealed=!1,this._onMouseDown=!1,this._endLineNumbers=[],this._showEndForLine=null,this._stickyScrollWidget=new y.StickyScrollWidget(this._editor),this._stickyLineCandidateProvider=new E.StickyLineCandidateProvider(this._editor,I,A),this._register(this._stickyScrollWidget),this._register(this._stickyLineCandidateProvider),this._widgetState=new y.StickyScrollWidgetState([],[],0),this._readConfiguration();const M=this._stickyScrollWidget.getDomNode();this._register(this._editor.onDidChangeConfiguration(x=>{(x.hasChanged(114)||x.hasChanged(72)||x.hasChanged(66)||x.hasChanged(109))&&this._readConfiguration()})),this._register(d.addDisposableListener(M,d.EventType.CONTEXT_MENU,async x=>{this._onContextMenu(d.getWindow(M),x)})),this._stickyScrollFocusedContextKey=b.EditorContextKeys.stickyScrollFocused.bindTo(this._contextKeyService),this._stickyScrollVisibleContextKey=b.EditorContextKeys.stickyScrollVisible.bindTo(this._contextKeyService);const R=this._register(d.trackFocus(M));this._register(R.onDidBlur(x=>{this._positionRevealed===!1&&M.clientHeight===0?(this._focusedStickyElementIndex=-1,this.focus()):this._disposeFocusStickyScrollStore()})),this._register(R.onDidFocus(x=>{this.focus()})),this._registerMouseListeners(),this._register(d.addDisposableListener(M,d.EventType.MOUSE_DOWN,x=>{this._onMouseDown=!0}))}static get(w){return w.getContribution(h.ID)}_disposeFocusStickyScrollStore(){var w;this._stickyScrollFocusedContextKey.set(!1),(w=this._focusDisposableStore)===null||w===void 0||w.dispose(),this._focused=!1,this._positionRevealed=!1,this._onMouseDown=!1}focus(){if(this._onMouseDown){this._onMouseDown=!1,this._editor.focus();return}this._stickyScrollFocusedContextKey.get()!==!0&&(this._focused=!0,this._focusDisposableStore=new L.DisposableStore,this._stickyScrollFocusedContextKey.set(!0),this._focusedStickyElementIndex=this._stickyScrollWidget.lineNumbers.length-1,this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex))}focusNext(){this._focusedStickyElementIndex<this._stickyScrollWidget.lineNumberCount-1&&this._focusNav(!0)}focusPrevious(){this._focusedStickyElementIndex>0&&this._focusNav(!1)}selectEditor(){this._editor.focus()}_focusNav(w){this._focusedStickyElementIndex=w?this._focusedStickyElementIndex+1:this._focusedStickyElementIndex-1,this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex)}goToFocused(){const w=this._stickyScrollWidget.lineNumbers;this._disposeFocusStickyScrollStore(),this._revealPosition({lineNumber:w[this._focusedStickyElementIndex],column:1})}_revealPosition(w){this._reveaInEditor(w,()=>this._editor.revealPosition(w))}_revealLineInCenterIfOutsideViewport(w){this._reveaInEditor(w,()=>this._editor.revealLineInCenterIfOutsideViewport(w.lineNumber,0))}_reveaInEditor(w,D){this._focused&&this._disposeFocusStickyScrollStore(),this._positionRevealed=!0,D(),this._editor.setSelection(i.Range.fromPositions(w)),this._editor.focus()}_registerMouseListeners(){const w=this._register(new L.DisposableStore),D=this._register(new a.ClickLinkGesture(this._editor,{extractLineNumberFromMouseEvent:A=>{const P=this._stickyScrollWidget.getEditorPositionFromNode(A.target.element);return P?P.lineNumber:0}})),I=A=>{if(!this._editor.hasModel()||A.target.type!==12||A.target.detail!==this._stickyScrollWidget.getId())return null;const P=A.target.element;if(!P||P.innerText!==P.innerHTML)return null;const N=this._stickyScrollWidget.getEditorPositionFromNode(P);return N?{range:new i.Range(N.lineNumber,N.column,N.lineNumber,N.column+P.innerText.length),textElement:P}:null},T=this._stickyScrollWidget.getDomNode();this._register(d.addStandardDisposableListener(T,d.EventType.CLICK,A=>{if(A.ctrlKey||A.altKey||A.metaKey||!A.leftButton)return;if(A.shiftKey){const R=this._stickyScrollWidget.getLineIndexFromChildDomNode(A.target);if(R===null)return;const x=new r.Position(this._endLineNumbers[R],1);this._revealLineInCenterIfOutsideViewport(x);return}if(this._stickyScrollWidget.isInFoldingIconDomNode(A.target)){const R=this._stickyScrollWidget.getLineNumberFromChildDomNode(A.target);this._toggleFoldingRegionForLine(R);return}if(!this._stickyScrollWidget.isInStickyLine(A.target))return;let M=this._stickyScrollWidget.getEditorPositionFromNode(A.target);if(!M){const R=this._stickyScrollWidget.getLineNumberFromChildDomNode(A.target);if(R===null)return;M=new r.Position(R,1)}this._revealPosition(M)})),this._register(d.addStandardDisposableListener(T,d.EventType.MOUSE_MOVE,A=>{if(A.shiftKey){const P=this._stickyScrollWidget.getLineIndexFromChildDomNode(A.target);if(P===null||this._showEndForLine!==null&&this._showEndForLine===P)return;this._showEndForLine=P,this._renderStickyScroll();return}this._showEndForLine!==null&&(this._showEndForLine=null,this._renderStickyScroll())})),this._register(d.addDisposableListener(T,d.EventType.MOUSE_LEAVE,A=>{this._showEndForLine!==null&&(this._showEndForLine=null,this._renderStickyScroll())})),this._register(D.onMouseMoveOrRelevantKeyDown(([A,P])=>{const N=I(A);if(!N||!A.hasTriggerModifier||!this._editor.hasModel()){w.clear();return}const{range:M,textElement:R}=N;if(!M.equalsRange(this._stickyRangeProjectedOnEditor))this._stickyRangeProjectedOnEditor=M,w.clear();else if(R.style.textDecoration==="underline")return;const x=new u.CancellationTokenSource;w.add((0,L.toDisposable)(()=>x.dispose(!0)));let O;(0,n.getDefinitionsAtPosition)(this._languageFeaturesService.definitionProvider,this._editor.getModel(),new r.Position(M.startLineNumber,M.startColumn+1),x.token).then(B=>{if(!x.token.isCancellationRequested)if(B.length!==0){this._candidateDefinitionsLength=B.length;const W=R;O!==W?(w.clear(),O=W,O.style.textDecoration="underline",w.add((0,L.toDisposable)(()=>{O.style.textDecoration="none"}))):O||(O=W,O.style.textDecoration="underline",w.add((0,L.toDisposable)(()=>{O.style.textDecoration="none"})))}else w.clear()})})),this._register(D.onCancel(()=>{w.clear()})),this._register(D.onExecute(async A=>{if(A.target.type!==12||A.target.detail!==this._stickyScrollWidget.getId())return;const P=this._stickyScrollWidget.getEditorPositionFromNode(A.target.element);P&&(!this._editor.hasModel()||!this._stickyRangeProjectedOnEditor||(this._candidateDefinitionsLength>1&&(this._focused&&this._disposeFocusStickyScrollStore(),this._revealPosition({lineNumber:P.lineNumber,column:1})),this._instaService.invokeFunction(t.goToDefinitionWithLocation,A,this._editor,{uri:this._editor.getModel().uri,range:this._stickyRangeProjectedOnEditor})))}))}_onContextMenu(w,D){const I=new l.StandardMouseEvent(w,D);this._contextMenuService.showContextMenu({menuId:_.MenuId.StickyScrollContext,getAnchor:()=>I})}_toggleFoldingRegionForLine(w){if(!this._foldingModel||w===null)return;const D=this._stickyScrollWidget.getRenderedStickyLine(w),I=D?.foldingIcon;if(!I)return;(0,g.toggleCollapseState)(this._foldingModel,Number.MAX_VALUE,[w]),I.isCollapsed=!I.isCollapsed;const T=(I.isCollapsed?this._editor.getTopForLineNumber(I.foldingEndLine):this._editor.getTopForLineNumber(I.foldingStartLine))-this._editor.getOption(66)*D.index+1;this._editor.setScrollTop(T),this._renderStickyScroll(w)}_readConfiguration(){const w=this._editor.getOption(114);if(w.enabled===!1){this._editor.removeOverlayWidget(this._stickyScrollWidget),this._sessionStore.clear(),this._enabled=!1;return}else w.enabled&&!this._enabled&&(this._editor.addOverlayWidget(this._stickyScrollWidget),this._sessionStore.add(this._editor.onDidScrollChange(I=>{I.scrollTopChanged&&(this._showEndForLine=null,this._renderStickyScroll())})),this._sessionStore.add(this._editor.onDidLayoutChange(()=>this._onDidResize())),this._sessionStore.add(this._editor.onDidChangeModelTokens(I=>this._onTokensChange(I))),this._sessionStore.add(this._stickyLineCandidateProvider.onDidChangeStickyScroll(()=>{this._showEndForLine=null,this._renderStickyScroll()})),this._enabled=!0);this._editor.getOption(67).renderType===2&&this._sessionStore.add(this._editor.onDidChangeCursorPosition(()=>{this._showEndForLine=null,this._renderStickyScroll(0)}))}_needsUpdate(w){const D=this._stickyScrollWidget.getCurrentLines();for(const I of D)for(const T of w.ranges)if(I>=T.fromLineNumber&&I<=T.toLineNumber)return!0;return!1}_onTokensChange(w){this._needsUpdate(w)&&this._renderStickyScroll(0)}_onDidResize(){const D=this._editor.getLayoutInfo().height/this._editor.getOption(66);this._maxStickyLines=Math.round(D*.25)}async _renderStickyScroll(w){var D,I;const T=this._editor.getModel();if(!T||T.isTooLargeForTokenization()){this._foldingModel=null,this._stickyScrollWidget.setState(void 0,null);return}const A=this._stickyLineCandidateProvider.getVersionId();if(A===void 0||A===T.getVersionId())if(this._foldingModel=(I=await((D=o.FoldingController.get(this._editor))===null||D===void 0?void 0:D.getFoldingModel()))!==null&&I!==void 0?I:null,this._widgetState=this.findScrollWidgetState(),this._stickyScrollVisibleContextKey.set(this._widgetState.startLineNumbers.length!==0),!this._focused)this._stickyScrollWidget.setState(this._widgetState,this._foldingModel,w);else if(this._focusedStickyElementIndex===-1)this._stickyScrollWidget.setState(this._widgetState,this._foldingModel,w),this._focusedStickyElementIndex=this._stickyScrollWidget.lineNumberCount-1,this._focusedStickyElementIndex!==-1&&this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);else{const P=this._stickyScrollWidget.lineNumbers[this._focusedStickyElementIndex];this._stickyScrollWidget.setState(this._widgetState,this._foldingModel,w),this._stickyScrollWidget.lineNumberCount===0?this._focusedStickyElementIndex=-1:(this._stickyScrollWidget.lineNumbers.includes(P)||(this._focusedStickyElementIndex=this._stickyScrollWidget.lineNumberCount-1),this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex))}}findScrollWidgetState(){const w=this._editor.getOption(66),D=Math.min(this._maxStickyLines,this._editor.getOption(114).maxLineCount),I=this._editor.getScrollTop();let T=0;const A=[],P=[],N=this._editor.getVisibleRanges();if(N.length!==0){const M=new s.StickyRange(N[0].startLineNumber,N[N.length-1].endLineNumber),R=this._stickyLineCandidateProvider.getCandidateStickyLinesIntersecting(M);for(const x of R){const O=x.startLineNumber,B=x.endLineNumber,W=x.nestingDepth;if(B-O>0){const V=(W-1)*w,K=W*w,F=this._editor.getBottomForLineNumber(O)-I,q=this._editor.getTopForLineNumber(B)-I,ie=this._editor.getBottomForLineNumber(B)-I;if(V>q&&V<=ie){A.push(O),P.push(B+1),T=ie-K;break}else K>F&&K<=ie&&(A.push(O),P.push(B+1));if(A.length===D)break}}}return this._endLineNumbers=P,new y.StickyScrollWidgetState(A,P,T,this._showEndForLine)}dispose(){super.dispose(),this._sessionStore.dispose()}};e.StickyScrollController=m,m.ID="store.contrib.stickyScrollController",e.StickyScrollController=m=h=ke([ge(1,p.IContextMenuService),ge(2,k.ILanguageFeaturesService),ge(3,S.IInstantiationService),ge(4,f.ILanguageConfigurationService),ge(5,c.ILanguageFeatureDebounceService),ge(6,v.IContextKeyService)],m)}),define(se[919],oe([1,0,16,715,757,30,27,15,21,388]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectEditor=e.GoToStickyScrollLine=e.SelectPreviousStickyScrollLine=e.SelectNextStickyScrollLine=e.FocusStickyScroll=e.ToggleStickyScroll=void 0;class b extends E.Action2{constructor(){super({id:"editor.action.toggleStickyScroll",title:{value:(0,k.localize)(0,null),mnemonicTitle:(0,k.localize)(1,null),original:"Toggle Editor Sticky Scroll"},category:y.Categories.View,toggled:{condition:p.ContextKeyExpr.equals("config.editor.stickyScroll.enabled",!0),title:(0,k.localize)(2,null),mnemonicTitle:(0,k.localize)(3,null)},menu:[{id:E.MenuId.CommandPalette},{id:E.MenuId.MenubarAppearanceMenu,group:"4_editor",order:3},{id:E.MenuId.StickyScrollContext}]})}async run(c){const d=c.get(S.IConfigurationService),s=!d.getValue("editor.stickyScroll.enabled");return d.updateValue("editor.stickyScroll.enabled",s)}}e.ToggleStickyScroll=b;const a=100;class i extends L.EditorAction2{constructor(){super({id:"editor.action.focusStickyScroll",title:{value:(0,k.localize)(4,null),mnemonicTitle:(0,k.localize)(5,null),original:"Focus Sticky Scroll"},precondition:p.ContextKeyExpr.and(p.ContextKeyExpr.has("config.editor.stickyScroll.enabled"),_.EditorContextKeys.stickyScrollVisible),menu:[{id:E.MenuId.CommandPalette}]})}runEditorCommand(c,d){var s;(s=v.StickyScrollController.get(d))===null||s===void 0||s.focus()}}e.FocusStickyScroll=i;class n extends L.EditorAction2{constructor(){super({id:"editor.action.selectNextStickyScrollLine",title:{value:(0,k.localize)(6,null),original:"Select next sticky scroll line"},precondition:_.EditorContextKeys.stickyScrollFocused.isEqualTo(!0),keybinding:{weight:a,primary:18}})}runEditorCommand(c,d){var s;(s=v.StickyScrollController.get(d))===null||s===void 0||s.focusNext()}}e.SelectNextStickyScrollLine=n;class t extends L.EditorAction2{constructor(){super({id:"editor.action.selectPreviousStickyScrollLine",title:{value:(0,k.localize)(7,null),original:"Select previous sticky scroll line"},precondition:_.EditorContextKeys.stickyScrollFocused.isEqualTo(!0),keybinding:{weight:a,primary:16}})}runEditorCommand(c,d){var s;(s=v.StickyScrollController.get(d))===null||s===void 0||s.focusPrevious()}}e.SelectPreviousStickyScrollLine=t;class r extends L.EditorAction2{constructor(){super({id:"editor.action.goToFocusedStickyScrollLine",title:{value:(0,k.localize)(8,null),original:"Go to focused sticky scroll line"},precondition:_.EditorContextKeys.stickyScrollFocused.isEqualTo(!0),keybinding:{weight:a,primary:3}})}runEditorCommand(c,d){var s;(s=v.StickyScrollController.get(d))===null||s===void 0||s.goToFocused()}}e.GoToStickyScrollLine=r;class u extends L.EditorAction2{constructor(){super({id:"editor.action.selectEditor",title:{value:(0,k.localize)(9,null),original:"Select Editor"},precondition:_.EditorContextKeys.stickyScrollFocused.isEqualTo(!0),keybinding:{weight:a,primary:9}})}runEditorCommand(c,d){var s;(s=v.StickyScrollController.get(d))===null||s===void 0||s.selectEditor()}}e.SelectEditor=u}),define(se[920],oe([1,0,16,919,388,30]),function(te,e,L,k,y,E){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,L.registerEditorContribution)(y.StickyScrollController.ID,y.StickyScrollController,1),(0,E.registerAction2)(k.ToggleStickyScroll),(0,E.registerAction2)(k.FocusStickyScroll),(0,E.registerAction2)(k.SelectPreviousStickyScrollLine),(0,E.registerAction2)(k.SelectNextStickyScrollLine),(0,E.registerAction2)(k.GoToStickyScrollLine),(0,E.registerAction2)(k.SelectEditor)}),define(se[921],oe([1,0,16,33,383,27,15,8,50,92]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneReferencesController=void 0;let b=class extends y.ReferencesController{constructor(i,n,t,r,u,f,c){super(!0,i,n,t,r,u,f,c)}};e.StandaloneReferencesController=b,e.StandaloneReferencesController=b=ke([ge(1,S.IContextKeyService),ge(2,k.ICodeEditorService),ge(3,_.INotificationService),ge(4,p.IInstantiationService),ge(5,v.IStorageService),ge(6,E.IConfigurationService)],b),(0,L.registerEditorContribution)(y.ReferencesController.ID,b,4)}),define(se[922],oe([1,0,12,2,47,100,754,162,45,50,193]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UndoRedoService=void 0;const a=!1;function i(g){return g.scheme===y.Schemas.file?g.fsPath:g.path}let n=0;class t{constructor(h,m,C,w,D,I,T){this.id=++n,this.type=0,this.actual=h,this.label=h.label,this.confirmBeforeUndo=h.confirmBeforeUndo||!1,this.resourceLabel=m,this.strResource=C,this.resourceLabels=[this.resourceLabel],this.strResources=[this.strResource],this.groupId=w,this.groupOrder=D,this.sourceId=I,this.sourceOrder=T,this.isValid=!0}setValid(h){this.isValid=h}toString(){return`[id:${this.id}] [group:${this.groupId}] [${this.isValid?"  VALID":"INVALID"}] ${this.actual.constructor.name} - ${this.actual}`}}class r{constructor(h,m){this.resourceLabel=h,this.reason=m}}class u{constructor(){this.elements=new Map}createMessage(){const h=[],m=[];for(const[,w]of this.elements)(w.reason===0?h:m).push(w.resourceLabel);const C=[];return h.length>0&&C.push(S.localize(0,null,h.join(", "))),m.length>0&&C.push(S.localize(1,null,m.join(", "))),C.join(`
+`)}get size(){return this.elements.size}has(h){return this.elements.has(h)}set(h,m){this.elements.set(h,m)}delete(h){return this.elements.delete(h)}}class f{constructor(h,m,C,w,D,I,T){this.id=++n,this.type=1,this.actual=h,this.label=h.label,this.confirmBeforeUndo=h.confirmBeforeUndo||!1,this.resourceLabels=m,this.strResources=C,this.groupId=w,this.groupOrder=D,this.sourceId=I,this.sourceOrder=T,this.removedResources=null,this.invalidatedResources=null}canSplit(){return typeof this.actual.split=="function"}removeResource(h,m,C){this.removedResources||(this.removedResources=new u),this.removedResources.has(m)||this.removedResources.set(m,new r(h,C))}setValid(h,m,C){C?this.invalidatedResources&&(this.invalidatedResources.delete(m),this.invalidatedResources.size===0&&(this.invalidatedResources=null)):(this.invalidatedResources||(this.invalidatedResources=new u),this.invalidatedResources.has(m)||this.invalidatedResources.set(m,new r(h,0)))}toString(){return`[id:${this.id}] [group:${this.groupId}] [${this.invalidatedResources?"INVALID":"  VALID"}] ${this.actual.constructor.name} - ${this.actual}`}}class c{constructor(h,m){this.resourceLabel=h,this.strResource=m,this._past=[],this._future=[],this.locked=!1,this.versionId=1}dispose(){for(const h of this._past)h.type===1&&h.removeResource(this.resourceLabel,this.strResource,0);for(const h of this._future)h.type===1&&h.removeResource(this.resourceLabel,this.strResource,0);this.versionId++}toString(){const h=[];h.push(`* ${this.strResource}:`);for(let m=0;m<this._past.length;m++)h.push(`   * [UNDO] ${this._past[m]}`);for(let m=this._future.length-1;m>=0;m--)h.push(`   * [REDO] ${this._future[m]}`);return h.join(`
+`)}flushAllElements(){this._past=[],this._future=[],this.versionId++}_setElementValidFlag(h,m){h.type===1?h.setValid(this.resourceLabel,this.strResource,m):h.setValid(m)}setElementsValidFlag(h,m){for(const C of this._past)m(C.actual)&&this._setElementValidFlag(C,h);for(const C of this._future)m(C.actual)&&this._setElementValidFlag(C,h)}pushElement(h){for(const m of this._future)m.type===1&&m.removeResource(this.resourceLabel,this.strResource,1);this._future=[],this._past.push(h),this.versionId++}createSnapshot(h){const m=[];for(let C=0,w=this._past.length;C<w;C++)m.push(this._past[C].id);for(let C=this._future.length-1;C>=0;C--)m.push(this._future[C].id);return new b.ResourceEditStackSnapshot(h,m)}restoreSnapshot(h){const m=h.elements.length;let C=!0,w=0,D=-1;for(let T=0,A=this._past.length;T<A;T++,w++){const P=this._past[T];C&&(w>=m||P.id!==h.elements[w])&&(C=!1,D=0),!C&&P.type===1&&P.removeResource(this.resourceLabel,this.strResource,0)}let I=-1;for(let T=this._future.length-1;T>=0;T--,w++){const A=this._future[T];C&&(w>=m||A.id!==h.elements[w])&&(C=!1,I=T),!C&&A.type===1&&A.removeResource(this.resourceLabel,this.strResource,0)}D!==-1&&(this._past=this._past.slice(0,D)),I!==-1&&(this._future=this._future.slice(I+1)),this.versionId++}getElements(){const h=[],m=[];for(const C of this._past)h.push(C.actual);for(const C of this._future)m.push(C.actual);return{past:h,future:m}}getClosestPastElement(){return this._past.length===0?null:this._past[this._past.length-1]}getSecondClosestPastElement(){return this._past.length<2?null:this._past[this._past.length-2]}getClosestFutureElement(){return this._future.length===0?null:this._future[this._future.length-1]}hasPastElements(){return this._past.length>0}hasFutureElements(){return this._future.length>0}splitPastWorkspaceElement(h,m){for(let C=this._past.length-1;C>=0;C--)if(this._past[C]===h){m.has(this.strResource)?this._past[C]=m.get(this.strResource):this._past.splice(C,1);break}this.versionId++}splitFutureWorkspaceElement(h,m){for(let C=this._future.length-1;C>=0;C--)if(this._future[C]===h){m.has(this.strResource)?this._future[C]=m.get(this.strResource):this._future.splice(C,1);break}this.versionId++}moveBackward(h){this._past.pop(),this._future.push(h),this.versionId++}moveForward(h){this._future.pop(),this._past.push(h),this.versionId++}}class d{constructor(h){this.editStacks=h,this._versionIds=[];for(let m=0,C=this.editStacks.length;m<C;m++)this._versionIds[m]=this.editStacks[m].versionId}isValid(){for(let h=0,m=this.editStacks.length;h<m;h++)if(this._versionIds[h]!==this.editStacks[h].versionId)return!1;return!0}}const s=new c("","");s.locked=!0;let l=class{constructor(h,m){this._dialogService=h,this._notificationService=m,this._editStacks=new Map,this._uriComparisonKeyComputers=[]}getUriComparisonKey(h){for(const m of this._uriComparisonKeyComputers)if(m[0]===h.scheme)return m[1].getComparisonKey(h);return h.toString()}_print(h){console.log("------------------------------------"),console.log(`AFTER ${h}: `);const m=[];for(const C of this._editStacks)m.push(C[1].toString());console.log(m.join(`
+`))}pushElement(h,m=b.UndoRedoGroup.None,C=b.UndoRedoSource.None){if(h.type===0){const w=i(h.resource),D=this.getUriComparisonKey(h.resource);this._pushElement(new t(h,w,D,m.id,m.nextOrder(),C.id,C.nextOrder()))}else{const w=new Set,D=[],I=[];for(const T of h.resources){const A=i(T),P=this.getUriComparisonKey(T);w.has(P)||(w.add(P),D.push(A),I.push(P))}D.length===1?this._pushElement(new t(h,D[0],I[0],m.id,m.nextOrder(),C.id,C.nextOrder())):this._pushElement(new f(h,D,I,m.id,m.nextOrder(),C.id,C.nextOrder()))}a&&this._print("pushElement")}_pushElement(h){for(let m=0,C=h.strResources.length;m<C;m++){const w=h.resourceLabels[m],D=h.strResources[m];let I;this._editStacks.has(D)?I=this._editStacks.get(D):(I=new c(w,D),this._editStacks.set(D,I)),I.pushElement(h)}}getLastElement(h){const m=this.getUriComparisonKey(h);if(this._editStacks.has(m)){const C=this._editStacks.get(m);if(C.hasFutureElements())return null;const w=C.getClosestPastElement();return w?w.actual:null}return null}_splitPastWorkspaceElement(h,m){const C=h.actual.split(),w=new Map;for(const D of C){const I=i(D.resource),T=this.getUriComparisonKey(D.resource),A=new t(D,I,T,0,0,0,0);w.set(A.strResource,A)}for(const D of h.strResources){if(m&&m.has(D))continue;this._editStacks.get(D).splitPastWorkspaceElement(h,w)}}_splitFutureWorkspaceElement(h,m){const C=h.actual.split(),w=new Map;for(const D of C){const I=i(D.resource),T=this.getUriComparisonKey(D.resource),A=new t(D,I,T,0,0,0,0);w.set(A.strResource,A)}for(const D of h.strResources){if(m&&m.has(D))continue;this._editStacks.get(D).splitFutureWorkspaceElement(h,w)}}removeElements(h){const m=typeof h=="string"?h:this.getUriComparisonKey(h);this._editStacks.has(m)&&(this._editStacks.get(m).dispose(),this._editStacks.delete(m)),a&&this._print("removeElements")}setElementsValidFlag(h,m,C){const w=this.getUriComparisonKey(h);this._editStacks.has(w)&&this._editStacks.get(w).setElementsValidFlag(m,C),a&&this._print("setElementsValidFlag")}createSnapshot(h){const m=this.getUriComparisonKey(h);return this._editStacks.has(m)?this._editStacks.get(m).createSnapshot(h):new b.ResourceEditStackSnapshot(h,[])}restoreSnapshot(h){const m=this.getUriComparisonKey(h.resource);if(this._editStacks.has(m)){const C=this._editStacks.get(m);C.restoreSnapshot(h),!C.hasPastElements()&&!C.hasFutureElements()&&(C.dispose(),this._editStacks.delete(m))}a&&this._print("restoreSnapshot")}getElements(h){const m=this.getUriComparisonKey(h);return this._editStacks.has(m)?this._editStacks.get(m).getElements():{past:[],future:[]}}_findClosestUndoElementWithSource(h){if(!h)return[null,null];let m=null,C=null;for(const[w,D]of this._editStacks){const I=D.getClosestPastElement();I&&I.sourceId===h&&(!m||I.sourceOrder>m.sourceOrder)&&(m=I,C=w)}return[m,C]}canUndo(h){if(h instanceof b.UndoRedoSource){const[,C]=this._findClosestUndoElementWithSource(h.id);return!!C}const m=this.getUriComparisonKey(h);return this._editStacks.has(m)?this._editStacks.get(m).hasPastElements():!1}_onError(h,m){(0,L.onUnexpectedError)(h);for(const C of m.strResources)this.removeElements(C);this._notificationService.error(h)}_acquireLocks(h){for(const m of h.editStacks)if(m.locked)throw new Error("Cannot acquire edit stack lock");for(const m of h.editStacks)m.locked=!0;return()=>{for(const m of h.editStacks)m.locked=!1}}_safeInvokeWithLocks(h,m,C,w,D){const I=this._acquireLocks(C);let T;try{T=m()}catch(A){return I(),w.dispose(),this._onError(A,h)}return T?T.then(()=>(I(),w.dispose(),D()),A=>(I(),w.dispose(),this._onError(A,h))):(I(),w.dispose(),D())}async _invokeWorkspacePrepare(h){if(typeof h.actual.prepareUndoRedo>"u")return k.Disposable.None;const m=h.actual.prepareUndoRedo();return typeof m>"u"?k.Disposable.None:m}_invokeResourcePrepare(h,m){if(h.actual.type!==1||typeof h.actual.prepareUndoRedo>"u")return m(k.Disposable.None);const C=h.actual.prepareUndoRedo();return C?(0,k.isDisposable)(C)?m(C):C.then(w=>m(w)):m(k.Disposable.None)}_getAffectedEditStacks(h){const m=[];for(const C of h.strResources)m.push(this._editStacks.get(C)||s);return new d(m)}_tryToSplitAndUndo(h,m,C,w){if(m.canSplit())return this._splitPastWorkspaceElement(m,C),this._notificationService.warn(w),new o(this._undo(h,0,!0));for(const D of m.strResources)this.removeElements(D);return this._notificationService.warn(w),new o}_checkWorkspaceUndo(h,m,C,w){if(m.removedResources)return this._tryToSplitAndUndo(h,m,m.removedResources,S.localize(2,null,m.label,m.removedResources.createMessage()));if(w&&m.invalidatedResources)return this._tryToSplitAndUndo(h,m,m.invalidatedResources,S.localize(3,null,m.label,m.invalidatedResources.createMessage()));const D=[];for(const T of C.editStacks)T.getClosestPastElement()!==m&&D.push(T.resourceLabel);if(D.length>0)return this._tryToSplitAndUndo(h,m,null,S.localize(4,null,m.label,D.join(", ")));const I=[];for(const T of C.editStacks)T.locked&&I.push(T.resourceLabel);return I.length>0?this._tryToSplitAndUndo(h,m,null,S.localize(5,null,m.label,I.join(", "))):C.isValid()?null:this._tryToSplitAndUndo(h,m,null,S.localize(6,null,m.label))}_workspaceUndo(h,m,C){const w=this._getAffectedEditStacks(m),D=this._checkWorkspaceUndo(h,m,w,!1);return D?D.returnValue:this._confirmAndExecuteWorkspaceUndo(h,m,w,C)}_isPartOfUndoGroup(h){if(!h.groupId)return!1;for(const[,m]of this._editStacks){const C=m.getClosestPastElement();if(C){if(C===h){const w=m.getSecondClosestPastElement();if(w&&w.groupId===h.groupId)return!0}if(C.groupId===h.groupId)return!0}}return!1}async _confirmAndExecuteWorkspaceUndo(h,m,C,w){if(m.canSplit()&&!this._isPartOfUndoGroup(m)){let T;(function(N){N[N.All=0]="All",N[N.This=1]="This",N[N.Cancel=2]="Cancel"})(T||(T={}));const{result:A}=await this._dialogService.prompt({type:E.default.Info,message:S.localize(7,null,m.label),buttons:[{label:S.localize(8,null,C.editStacks.length),run:()=>T.All},{label:S.localize(9,null),run:()=>T.This}],cancelButton:{run:()=>T.Cancel}});if(A===T.Cancel)return;if(A===T.This)return this._splitPastWorkspaceElement(m,null),this._undo(h,0,!0);const P=this._checkWorkspaceUndo(h,m,C,!1);if(P)return P.returnValue;w=!0}let D;try{D=await this._invokeWorkspacePrepare(m)}catch(T){return this._onError(T,m)}const I=this._checkWorkspaceUndo(h,m,C,!0);if(I)return D.dispose(),I.returnValue;for(const T of C.editStacks)T.moveBackward(m);return this._safeInvokeWithLocks(m,()=>m.actual.undo(),C,D,()=>this._continueUndoInGroup(m.groupId,w))}_resourceUndo(h,m,C){if(!m.isValid){h.flushAllElements();return}if(h.locked){const w=S.localize(10,null,m.label);this._notificationService.warn(w);return}return this._invokeResourcePrepare(m,w=>(h.moveBackward(m),this._safeInvokeWithLocks(m,()=>m.actual.undo(),new d([h]),w,()=>this._continueUndoInGroup(m.groupId,C))))}_findClosestUndoElementInGroup(h){if(!h)return[null,null];let m=null,C=null;for(const[w,D]of this._editStacks){const I=D.getClosestPastElement();I&&I.groupId===h&&(!m||I.groupOrder>m.groupOrder)&&(m=I,C=w)}return[m,C]}_continueUndoInGroup(h,m){if(!h)return;const[,C]=this._findClosestUndoElementInGroup(h);if(C)return this._undo(C,0,m)}undo(h){if(h instanceof b.UndoRedoSource){const[,m]=this._findClosestUndoElementWithSource(h.id);return m?this._undo(m,h.id,!1):void 0}return typeof h=="string"?this._undo(h,0,!1):this._undo(this.getUriComparisonKey(h),0,!1)}_undo(h,m=0,C){if(!this._editStacks.has(h))return;const w=this._editStacks.get(h),D=w.getClosestPastElement();if(!D)return;if(D.groupId){const[T,A]=this._findClosestUndoElementInGroup(D.groupId);if(D!==T&&A)return this._undo(A,m,C)}if((D.sourceId!==m||D.confirmBeforeUndo)&&!C)return this._confirmAndContinueUndo(h,m,D);try{return D.type===1?this._workspaceUndo(h,D,C):this._resourceUndo(w,D,C)}finally{a&&this._print("undo")}}async _confirmAndContinueUndo(h,m,C){if((await this._dialogService.confirm({message:S.localize(11,null,C.label),primaryButton:S.localize(12,null),cancelButton:S.localize(13,null)})).confirmed)return this._undo(h,m,!0)}_findClosestRedoElementWithSource(h){if(!h)return[null,null];let m=null,C=null;for(const[w,D]of this._editStacks){const I=D.getClosestFutureElement();I&&I.sourceId===h&&(!m||I.sourceOrder<m.sourceOrder)&&(m=I,C=w)}return[m,C]}canRedo(h){if(h instanceof b.UndoRedoSource){const[,C]=this._findClosestRedoElementWithSource(h.id);return!!C}const m=this.getUriComparisonKey(h);return this._editStacks.has(m)?this._editStacks.get(m).hasFutureElements():!1}_tryToSplitAndRedo(h,m,C,w){if(m.canSplit())return this._splitFutureWorkspaceElement(m,C),this._notificationService.warn(w),new o(this._redo(h));for(const D of m.strResources)this.removeElements(D);return this._notificationService.warn(w),new o}_checkWorkspaceRedo(h,m,C,w){if(m.removedResources)return this._tryToSplitAndRedo(h,m,m.removedResources,S.localize(14,null,m.label,m.removedResources.createMessage()));if(w&&m.invalidatedResources)return this._tryToSplitAndRedo(h,m,m.invalidatedResources,S.localize(15,null,m.label,m.invalidatedResources.createMessage()));const D=[];for(const T of C.editStacks)T.getClosestFutureElement()!==m&&D.push(T.resourceLabel);if(D.length>0)return this._tryToSplitAndRedo(h,m,null,S.localize(16,null,m.label,D.join(", ")));const I=[];for(const T of C.editStacks)T.locked&&I.push(T.resourceLabel);return I.length>0?this._tryToSplitAndRedo(h,m,null,S.localize(17,null,m.label,I.join(", "))):C.isValid()?null:this._tryToSplitAndRedo(h,m,null,S.localize(18,null,m.label))}_workspaceRedo(h,m){const C=this._getAffectedEditStacks(m),w=this._checkWorkspaceRedo(h,m,C,!1);return w?w.returnValue:this._executeWorkspaceRedo(h,m,C)}async _executeWorkspaceRedo(h,m,C){let w;try{w=await this._invokeWorkspacePrepare(m)}catch(I){return this._onError(I,m)}const D=this._checkWorkspaceRedo(h,m,C,!0);if(D)return w.dispose(),D.returnValue;for(const I of C.editStacks)I.moveForward(m);return this._safeInvokeWithLocks(m,()=>m.actual.redo(),C,w,()=>this._continueRedoInGroup(m.groupId))}_resourceRedo(h,m){if(!m.isValid){h.flushAllElements();return}if(h.locked){const C=S.localize(19,null,m.label);this._notificationService.warn(C);return}return this._invokeResourcePrepare(m,C=>(h.moveForward(m),this._safeInvokeWithLocks(m,()=>m.actual.redo(),new d([h]),C,()=>this._continueRedoInGroup(m.groupId))))}_findClosestRedoElementInGroup(h){if(!h)return[null,null];let m=null,C=null;for(const[w,D]of this._editStacks){const I=D.getClosestFutureElement();I&&I.groupId===h&&(!m||I.groupOrder<m.groupOrder)&&(m=I,C=w)}return[m,C]}_continueRedoInGroup(h){if(!h)return;const[,m]=this._findClosestRedoElementInGroup(h);if(m)return this._redo(m)}redo(h){if(h instanceof b.UndoRedoSource){const[,m]=this._findClosestRedoElementWithSource(h.id);return m?this._redo(m):void 0}return typeof h=="string"?this._redo(h):this._redo(this.getUriComparisonKey(h))}_redo(h){if(!this._editStacks.has(h))return;const m=this._editStacks.get(h),C=m.getClosestFutureElement();if(C){if(C.groupId){const[w,D]=this._findClosestRedoElementInGroup(C.groupId);if(C!==w&&D)return this._redo(D)}try{return C.type===1?this._workspaceRedo(h,C):this._resourceRedo(m,C)}finally{a&&this._print("redo")}}}};e.UndoRedoService=l,e.UndoRedoService=l=ke([ge(0,p.IDialogService),ge(1,v.INotificationService)],l);class o{constructor(h){this.returnValue=h}}(0,_.registerSingleton)(b.IUndoRedoService,l,1)}),define(se[169],oe([1,0,755,95,199,22,8]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isStandaloneEditorWorkspace=e.STANDALONE_EDITOR_WORKSPACE_ID=e.WORKSPACE_FILTER=e.WORKSPACE_EXTENSION=e.WorkspaceFolder=e.Workspace=e.isWorkspaceIdentifier=e.toWorkspaceIdentifier=e.UNKNOWN_EMPTY_WINDOW_WORKSPACE=e.EXTENSION_DEVELOPMENT_EMPTY_WINDOW_WORKSPACE=e.isEmptyWorkspaceIdentifier=e.isSingleFolderWorkspaceIdentifier=e.IWorkspaceContextService=void 0,e.IWorkspaceContextService=(0,S.createDecorator)("contextService");function p(t){const r=t;return typeof r?.id=="string"&&E.URI.isUri(r.uri)}e.isSingleFolderWorkspaceIdentifier=p;function _(t){const r=t;return typeof r?.id=="string"&&!p(t)&&!b(t)}e.isEmptyWorkspaceIdentifier=_,e.EXTENSION_DEVELOPMENT_EMPTY_WINDOW_WORKSPACE={id:"ext-dev"},e.UNKNOWN_EMPTY_WINDOW_WORKSPACE={id:"empty-window"};function v(t,r){if(typeof t=="string"||typeof t>"u")return typeof t=="string"?{id:(0,k.basename)(t)}:r?e.EXTENSION_DEVELOPMENT_EMPTY_WINDOW_WORKSPACE:e.UNKNOWN_EMPTY_WINDOW_WORKSPACE;const u=t;return u.configuration?{id:u.id,configPath:u.configuration}:u.folders.length===1?{id:u.id,uri:u.folders[0].uri}:{id:u.id}}e.toWorkspaceIdentifier=v;function b(t){const r=t;return typeof r?.id=="string"&&E.URI.isUri(r.configPath)}e.isWorkspaceIdentifier=b;class a{constructor(r,u,f,c,d){this._id=r,this._transient=f,this._configuration=c,this._ignorePathCasing=d,this._foldersMap=y.TernarySearchTree.forUris(this._ignorePathCasing,()=>!0),this.folders=u}get folders(){return this._folders}set folders(r){this._folders=r,this.updateFoldersMap()}get id(){return this._id}get transient(){return this._transient}get configuration(){return this._configuration}set configuration(r){this._configuration=r}getFolder(r){return r&&this._foldersMap.findSubstr(r)||null}updateFoldersMap(){this._foldersMap=y.TernarySearchTree.forUris(this._ignorePathCasing,()=>!0);for(const r of this.folders)this._foldersMap.set(r.uri,r)}toJSON(){return{id:this.id,folders:this.folders,transient:this.transient,configuration:this.configuration}}}e.Workspace=a;class i{constructor(r,u){this.raw=u,this.uri=r.uri,this.index=r.index,this.name=r.name}toJSON(){return{uri:this.uri,name:this.name,index:this.index}}}e.WorkspaceFolder=i,e.WORKSPACE_EXTENSION="code-workspace",e.WORKSPACE_FILTER=[{name:(0,L.localize)(0,null),extensions:[e.WORKSPACE_EXTENSION]}],e.STANDALONE_EDITOR_WORKSPACE_ID="4064f6ec-cb38-4ad0-af64-ee6467e63c82";function n(t){return t.id===e.STANDALONE_EDITOR_WORKSPACE_ID}e.isStandaloneEditorWorkspace=n}),define(se[923],oe([1,0,7,135,42,2,17,16,21,664,30,15,59,34,27,169]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";var u;Object.defineProperty(e,"__esModule",{value:!0}),e.ContextMenuController=void 0;let f=u=class{static get(s){return s.getContribution(u.ID)}constructor(s,l,o,g,h,m,C,w){this._contextMenuService=l,this._contextViewService=o,this._contextKeyService=g,this._keybindingService=h,this._menuService=m,this._configurationService=C,this._workspaceContextService=w,this._toDispose=new E.DisposableStore,this._contextMenuIsBeingShownCount=0,this._editor=s,this._toDispose.add(this._editor.onContextMenu(D=>this._onContextMenu(D))),this._toDispose.add(this._editor.onMouseWheel(D=>{if(this._contextMenuIsBeingShownCount>0){const I=this._contextViewService.getContextViewElement(),T=D.srcElement;T.shadowRoot&&L.getShadowRoot(I)===T.shadowRoot||this._contextViewService.hideContextView()}})),this._toDispose.add(this._editor.onKeyDown(D=>{this._editor.getOption(24)&&D.keyCode===58&&(D.preventDefault(),D.stopPropagation(),this.showContextMenu())}))}_onContextMenu(s){if(!this._editor.hasModel())return;if(!this._editor.getOption(24)){this._editor.focus(),s.target.position&&!this._editor.getSelection().containsPosition(s.target.position)&&this._editor.setPosition(s.target.position);return}if(s.target.type===12||s.target.type===6&&s.target.detail.injectedText)return;if(s.event.preventDefault(),s.event.stopPropagation(),s.target.type===11)return this._showScrollbarContextMenu(s.event);if(s.target.type!==6&&s.target.type!==7&&s.target.type!==1)return;if(this._editor.focus(),s.target.position){let o=!1;for(const g of this._editor.getSelections())if(g.containsPosition(s.target.position)){o=!0;break}o||this._editor.setPosition(s.target.position)}let l=null;s.target.type!==1&&(l=s.event),this.showContextMenu(l)}showContextMenu(s){if(!this._editor.getOption(24)||!this._editor.hasModel())return;const l=this._getMenuActions(this._editor.getModel(),this._editor.isSimpleWidget?b.MenuId.SimpleEditorContext:b.MenuId.EditorContext);l.length>0&&this._doShowContextMenu(l,s)}_getMenuActions(s,l){const o=[],g=this._menuService.createMenu(l,this._contextKeyService),h=g.getActions({arg:s.uri});g.dispose();for(const m of h){const[,C]=m;let w=0;for(const D of C)if(D instanceof b.SubmenuItemAction){const I=this._getMenuActions(s,D.item.submenu);I.length>0&&(o.push(new y.SubmenuAction(D.id,D.label,I)),w++)}else o.push(D),w++;w&&o.push(new y.Separator)}return o.length&&o.pop(),o}_doShowContextMenu(s,l=null){if(!this._editor.hasModel())return;const o=this._editor.getOption(60);this._editor.updateOptions({hover:{enabled:!1}});let g=l;if(!g){this._editor.revealPosition(this._editor.getPosition(),1),this._editor.render();const m=this._editor.getScrolledVisiblePosition(this._editor.getPosition()),C=L.getDomNodePagePosition(this._editor.getDomNode()),w=C.left+m.left,D=C.top+m.top+m.height;g={x:w,y:D}}const h=this._editor.getOption(126)&&!S.isIOS;this._contextMenuIsBeingShownCount++,this._contextMenuService.showContextMenu({domForShadowRoot:h?this._editor.getDomNode():void 0,getAnchor:()=>g,getActions:()=>s,getActionViewItem:m=>{const C=this._keybindingFor(m);if(C)return new k.ActionViewItem(m,m,{label:!0,keybinding:C.getLabel(),isMenu:!0});const w=m;return typeof w.getActionViewItem=="function"?w.getActionViewItem():new k.ActionViewItem(m,m,{icon:!0,label:!0,isMenu:!0})},getKeyBinding:m=>this._keybindingFor(m),onHide:m=>{this._contextMenuIsBeingShownCount--,this._editor.updateOptions({hover:o})}})}_showScrollbarContextMenu(s){if(!this._editor.hasModel()||(0,r.isStandaloneEditorWorkspace)(this._workspaceContextService.getWorkspace()))return;const l=this._editor.getOption(72);let o=0;const g=D=>({id:`menu-action-${++o}`,label:D.label,tooltip:"",class:void 0,enabled:typeof D.enabled>"u"?!0:D.enabled,checked:D.checked,run:D.run}),h=(D,I)=>new y.SubmenuAction(`menu-action-${++o}`,D,I,void 0),m=(D,I,T,A,P)=>{if(!I)return g({label:D,enabled:I,run:()=>{}});const N=R=>()=>{this._configurationService.updateValue(T,R)},M=[];for(const R of P)M.push(g({label:R.label,checked:A===R.value,run:N(R.value)}));return h(D,M)},C=[];C.push(g({label:v.localize(0,null),checked:l.enabled,run:()=>{this._configurationService.updateValue("editor.minimap.enabled",!l.enabled)}})),C.push(new y.Separator),C.push(g({label:v.localize(1,null),enabled:l.enabled,checked:l.renderCharacters,run:()=>{this._configurationService.updateValue("editor.minimap.renderCharacters",!l.renderCharacters)}})),C.push(m(v.localize(2,null),l.enabled,"editor.minimap.size",l.size,[{label:v.localize(3,null),value:"proportional"},{label:v.localize(4,null),value:"fill"},{label:v.localize(5,null),value:"fit"}])),C.push(m(v.localize(6,null),l.enabled,"editor.minimap.showSlider",l.showSlider,[{label:v.localize(7,null),value:"mouseover"},{label:v.localize(8,null),value:"always"}]));const w=this._editor.getOption(126)&&!S.isIOS;this._contextMenuIsBeingShownCount++,this._contextMenuService.showContextMenu({domForShadowRoot:w?this._editor.getDomNode():void 0,getAnchor:()=>s,getActions:()=>C,onHide:D=>{this._contextMenuIsBeingShownCount--,this._editor.focus()}})}_keybindingFor(s){return this._keybindingService.lookupKeybinding(s.id)}dispose(){this._contextMenuIsBeingShownCount>0&&this._contextViewService.hideContextView(),this._toDispose.dispose()}};e.ContextMenuController=f,f.ID="editor.contrib.contextmenu",e.ContextMenuController=f=u=ke([ge(1,i.IContextMenuService),ge(2,i.IContextViewService),ge(3,a.IContextKeyService),ge(4,n.IKeybindingService),ge(5,b.IMenuService),ge(6,t.IConfigurationService),ge(7,r.IWorkspaceContextService)],f);class c extends p.EditorAction{constructor(){super({id:"editor.action.showContextMenu",label:v.localize(9,null),alias:"Show Editor Context Menu",precondition:void 0,kbOpts:{kbExpr:_.EditorContextKeys.textInputFocus,primary:1092,weight:100}})}run(s,l){var o;(o=f.get(l))===null||o===void 0||o.showContextMenu()}}(0,p.registerEditorContribution)(f.ID,f,2),(0,p.registerEditorAction)(c)}),define(se[389],oe([1,0,13,176,2,109,47,49,22,18,668,169]),function(te,e,L,k,y,E,S,p,_,v,b,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DefaultPasteProvidersFeature=e.DefaultDropProvidersFeature=void 0;const i=(0,b.localize)(0,null);class n{async provideDocumentPasteEdits(o,g,h,m,C){const w=await this.getEdit(h,C);return w?{insertText:w.insertText,label:w.label,detail:w.detail,handledMimeType:w.handledMimeType,yieldTo:w.yieldTo}:void 0}async provideDocumentOnDropEdits(o,g,h,m){const C=await this.getEdit(h,m);return C?{insertText:C.insertText,label:C.label,handledMimeType:C.handledMimeType,yieldTo:C.yieldTo}:void 0}}class t extends n{constructor(){super(...arguments),this.id="text",this.dropMimeTypes=[E.Mimes.text],this.pasteMimeTypes=[E.Mimes.text]}async getEdit(o,g){const h=o.get(E.Mimes.text);if(!h||o.has(E.Mimes.uriList))return;const m=await h.asString();return{handledMimeType:E.Mimes.text,label:(0,b.localize)(1,null),detail:i,insertText:m}}}class r extends n{constructor(){super(...arguments),this.id="uri",this.dropMimeTypes=[E.Mimes.uriList],this.pasteMimeTypes=[E.Mimes.uriList]}async getEdit(o,g){const h=await c(o);if(!h.length||g.isCancellationRequested)return;let m=0;const C=h.map(({uri:D,originalText:I})=>D.scheme===S.Schemas.file?D.fsPath:(m++,I)).join(" ");let w;return m>0?w=h.length>1?(0,b.localize)(2,null):(0,b.localize)(3,null):w=h.length>1?(0,b.localize)(4,null):(0,b.localize)(5,null),{handledMimeType:E.Mimes.uriList,insertText:C,label:w,detail:i}}}let u=class extends n{constructor(o){super(),this._workspaceContextService=o,this.id="relativePath",this.dropMimeTypes=[E.Mimes.uriList],this.pasteMimeTypes=[E.Mimes.uriList]}async getEdit(o,g){const h=await c(o);if(!h.length||g.isCancellationRequested)return;const m=(0,L.coalesce)(h.map(({uri:C})=>{const w=this._workspaceContextService.getWorkspaceFolder(C);return w?(0,p.relativePath)(w.uri,C):void 0}));if(m.length)return{handledMimeType:E.Mimes.uriList,insertText:m.join(" "),label:h.length>1?(0,b.localize)(6,null):(0,b.localize)(7,null),detail:i}}};u=ke([ge(0,a.IWorkspaceContextService)],u);class f{constructor(){this.id="html",this.pasteMimeTypes=["text/html"],this._yieldTo=[{mimeType:E.Mimes.text}]}async provideDocumentPasteEdits(o,g,h,m,C){if(m.trigger!=="explicit"&&m.only!==this.id)return;const w=h.get("text/html"),D=await w?.asString();if(!(!D||C.isCancellationRequested))return{insertText:D,yieldTo:this._yieldTo,label:(0,b.localize)(8,null),detail:i}}}async function c(l){const o=l.get(E.Mimes.uriList);if(!o)return[];const g=await o.asString(),h=[];for(const m of k.UriList.parse(g))try{h.push({uri:_.URI.parse(m),originalText:m})}catch{}return h}let d=class extends y.Disposable{constructor(o,g){super(),this._register(o.documentOnDropEditProvider.register("*",new t)),this._register(o.documentOnDropEditProvider.register("*",new r)),this._register(o.documentOnDropEditProvider.register("*",new u(g)))}};e.DefaultDropProvidersFeature=d,e.DefaultDropProvidersFeature=d=ke([ge(0,v.ILanguageFeaturesService),ge(1,a.IWorkspaceContextService)],d);let s=class extends y.Disposable{constructor(o,g){super(),this._register(o.documentPasteEditProvider.register("*",new t)),this._register(o.documentPasteEditProvider.register("*",new r)),this._register(o.documentPasteEditProvider.register("*",new u(g))),this._register(o.documentPasteEditProvider.register("*",new f))}};e.DefaultPasteProvidersFeature=s,e.DefaultPasteProvidersFeature=s=ke([ge(0,v.ILanguageFeaturesService),ge(1,a.IWorkspaceContextService)],s)}),define(se[924],oe([1,0,16,21,131,380,389,666]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,L.registerEditorContribution)(E.CopyPasteController.ID,E.CopyPasteController,0),(0,y.registerEditorFeature)(S.DefaultPasteProvidersFeature),(0,L.registerEditorCommand)(new class extends L.EditorCommand{constructor(){super({id:E.changePasteTypeCommandId,precondition:E.pasteWidgetVisibleCtx,kbOpts:{weight:100,primary:2137}})}runEditorCommand(_,v,b){var a;return(a=E.CopyPasteController.get(v))===null||a===void 0?void 0:a.changePasteType()}}),(0,L.registerEditorAction)(class extends L.EditorAction{constructor(){super({id:"editor.action.pasteAs",label:p.localize(0,null),alias:"Paste As...",precondition:k.EditorContextKeys.writable,metadata:{description:"Paste as",args:[{name:"args",schema:{type:"object",properties:{id:{type:"string",description:p.localize(1,null)}}}}]}})}run(_,v,b){var a;const i=typeof b?.id=="string"?b.id:void 0;return(a=E.CopyPasteController.get(v))===null||a===void 0?void 0:a.pasteAs(i)}}),(0,L.registerEditorAction)(class extends L.EditorAction{constructor(){super({id:"editor.action.pasteAsText",label:p.localize(2,null),alias:"Paste as Text",precondition:k.EditorContextKeys.writable})}run(_,v,b){var a;return(a=E.CopyPasteController.get(v))===null||a===void 0?void 0:a.pasteAs("text")}})}),define(se[925],oe([1,0,16,246,131,389,669,98,37,903]),function(te,e,L,k,y,E,S,p,_,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,L.registerEditorContribution)(v.DropIntoEditorController.ID,v.DropIntoEditorController,2),(0,L.registerEditorCommand)(new class extends L.EditorCommand{constructor(){super({id:v.changeDropTypeCommandId,precondition:v.dropWidgetVisibleCtx,kbOpts:{weight:100,primary:2137}})}runEditorCommand(b,a,i){var n;(n=v.DropIntoEditorController.get(a))===null||n===void 0||n.changeDropType()}}),(0,y.registerEditorFeature)(E.DefaultDropProvidersFeature),_.Registry.as(p.Extensions.Configuration).registerConfiguration({...k.editorConfigurationBaseNode,properties:{[v.defaultProviderConfig]:{type:"object",scope:5,description:S.localize(0,null),default:{},additionalProperties:{type:"string"}}}})}),define(se[926],oe([1,0,587,95,49,11,175,32,117,714,169]),function(te,e,L,k,y,E,S,p,_,v,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RandomBasedVariableResolver=e.WorkspaceBasedVariableResolver=e.TimeBasedVariableResolver=e.CommentBasedVariableResolver=e.ClipboardBasedVariableResolver=e.ModelBasedVariableResolver=e.SelectionBasedVariableResolver=e.CompositeSnippetVariableResolver=e.KnownSnippetVariableNames=void 0,e.KnownSnippetVariableNames=Object.freeze({CURRENT_YEAR:!0,CURRENT_YEAR_SHORT:!0,CURRENT_MONTH:!0,CURRENT_DATE:!0,CURRENT_HOUR:!0,CURRENT_MINUTE:!0,CURRENT_SECOND:!0,CURRENT_DAY_NAME:!0,CURRENT_DAY_NAME_SHORT:!0,CURRENT_MONTH_NAME:!0,CURRENT_MONTH_NAME_SHORT:!0,CURRENT_SECONDS_UNIX:!0,CURRENT_TIMEZONE_OFFSET:!0,SELECTION:!0,CLIPBOARD:!0,TM_SELECTED_TEXT:!0,TM_CURRENT_LINE:!0,TM_CURRENT_WORD:!0,TM_LINE_INDEX:!0,TM_LINE_NUMBER:!0,TM_FILENAME:!0,TM_FILENAME_BASE:!0,TM_DIRECTORY:!0,TM_FILEPATH:!0,CURSOR_INDEX:!0,CURSOR_NUMBER:!0,RELATIVE_FILEPATH:!0,BLOCK_COMMENT_START:!0,BLOCK_COMMENT_END:!0,LINE_COMMENT:!0,WORKSPACE_NAME:!0,WORKSPACE_FOLDER:!0,RANDOM:!0,RANDOM_HEX:!0,UUID:!0});class a{constructor(s){this._delegates=s}resolve(s){for(const l of this._delegates){const o=l.resolve(s);if(o!==void 0)return o}}}e.CompositeSnippetVariableResolver=a;class i{constructor(s,l,o,g){this._model=s,this._selection=l,this._selectionIdx=o,this._overtypingCapturer=g}resolve(s){const{name:l}=s;if(l==="SELECTION"||l==="TM_SELECTED_TEXT"){let o=this._model.getValueInRange(this._selection)||void 0,g=this._selection.startLineNumber!==this._selection.endLineNumber;if(!o&&this._overtypingCapturer){const h=this._overtypingCapturer.getLastOvertypedInfo(this._selectionIdx);h&&(o=h.value,g=h.multiline)}if(o&&g&&s.snippet){const h=this._model.getLineContent(this._selection.startLineNumber),m=(0,E.getLeadingWhitespace)(h,0,this._selection.startColumn-1);let C=m;s.snippet.walk(D=>D===s?!1:(D instanceof _.Text&&(C=(0,E.getLeadingWhitespace)((0,E.splitLines)(D.value).pop())),!0));const w=(0,E.commonPrefixLength)(C,m);o=o.replace(/(\r\n|\r|\n)(.*)/g,(D,I,T)=>`${I}${C.substr(w)}${T}`)}return o}else{if(l==="TM_CURRENT_LINE")return this._model.getLineContent(this._selection.positionLineNumber);if(l==="TM_CURRENT_WORD"){const o=this._model.getWordAtPosition({lineNumber:this._selection.positionLineNumber,column:this._selection.positionColumn});return o&&o.word||void 0}else{if(l==="TM_LINE_INDEX")return String(this._selection.positionLineNumber-1);if(l==="TM_LINE_NUMBER")return String(this._selection.positionLineNumber);if(l==="CURSOR_INDEX")return String(this._selectionIdx);if(l==="CURSOR_NUMBER")return String(this._selectionIdx+1)}}}}e.SelectionBasedVariableResolver=i;class n{constructor(s,l){this._labelService=s,this._model=l}resolve(s){const{name:l}=s;if(l==="TM_FILENAME")return k.basename(this._model.uri.fsPath);if(l==="TM_FILENAME_BASE"){const o=k.basename(this._model.uri.fsPath),g=o.lastIndexOf(".");return g<=0?o:o.slice(0,g)}else{if(l==="TM_DIRECTORY")return k.dirname(this._model.uri.fsPath)==="."?"":this._labelService.getUriLabel((0,y.dirname)(this._model.uri));if(l==="TM_FILEPATH")return this._labelService.getUriLabel(this._model.uri);if(l==="RELATIVE_FILEPATH")return this._labelService.getUriLabel(this._model.uri,{relative:!0,noPrefix:!0})}}}e.ModelBasedVariableResolver=n;class t{constructor(s,l,o,g){this._readClipboardText=s,this._selectionIdx=l,this._selectionCount=o,this._spread=g}resolve(s){if(s.name!=="CLIPBOARD")return;const l=this._readClipboardText();if(l){if(this._spread){const o=l.split(/\r\n|\n|\r/).filter(g=>!(0,E.isFalsyOrWhitespace)(g));if(o.length===this._selectionCount)return o[this._selectionIdx]}return l}}}e.ClipboardBasedVariableResolver=t;let r=class{constructor(s,l,o){this._model=s,this._selection=l,this._languageConfigurationService=o}resolve(s){const{name:l}=s,o=this._model.getLanguageIdAtPosition(this._selection.selectionStartLineNumber,this._selection.selectionStartColumn),g=this._languageConfigurationService.getLanguageConfiguration(o).comments;if(g){if(l==="LINE_COMMENT")return g.lineCommentToken||void 0;if(l==="BLOCK_COMMENT_START")return g.blockCommentStartToken||void 0;if(l==="BLOCK_COMMENT_END")return g.blockCommentEndToken||void 0}}};e.CommentBasedVariableResolver=r,e.CommentBasedVariableResolver=r=ke([ge(2,p.ILanguageConfigurationService)],r);class u{constructor(){this._date=new Date}resolve(s){const{name:l}=s;if(l==="CURRENT_YEAR")return String(this._date.getFullYear());if(l==="CURRENT_YEAR_SHORT")return String(this._date.getFullYear()).slice(-2);if(l==="CURRENT_MONTH")return String(this._date.getMonth().valueOf()+1).padStart(2,"0");if(l==="CURRENT_DATE")return String(this._date.getDate().valueOf()).padStart(2,"0");if(l==="CURRENT_HOUR")return String(this._date.getHours().valueOf()).padStart(2,"0");if(l==="CURRENT_MINUTE")return String(this._date.getMinutes().valueOf()).padStart(2,"0");if(l==="CURRENT_SECOND")return String(this._date.getSeconds().valueOf()).padStart(2,"0");if(l==="CURRENT_DAY_NAME")return u.dayNames[this._date.getDay()];if(l==="CURRENT_DAY_NAME_SHORT")return u.dayNamesShort[this._date.getDay()];if(l==="CURRENT_MONTH_NAME")return u.monthNames[this._date.getMonth()];if(l==="CURRENT_MONTH_NAME_SHORT")return u.monthNamesShort[this._date.getMonth()];if(l==="CURRENT_SECONDS_UNIX")return String(Math.floor(this._date.getTime()/1e3));if(l==="CURRENT_TIMEZONE_OFFSET"){const o=this._date.getTimezoneOffset(),g=o>0?"-":"+",h=Math.trunc(Math.abs(o/60)),m=h<10?"0"+h:h,C=Math.abs(o)-h*60,w=C<10?"0"+C:C;return g+m+":"+w}}}e.TimeBasedVariableResolver=u,u.dayNames=[v.localize(0,null),v.localize(1,null),v.localize(2,null),v.localize(3,null),v.localize(4,null),v.localize(5,null),v.localize(6,null)],u.dayNamesShort=[v.localize(7,null),v.localize(8,null),v.localize(9,null),v.localize(10,null),v.localize(11,null),v.localize(12,null),v.localize(13,null)],u.monthNames=[v.localize(14,null),v.localize(15,null),v.localize(16,null),v.localize(17,null),v.localize(18,null),v.localize(19,null),v.localize(20,null),v.localize(21,null),v.localize(22,null),v.localize(23,null),v.localize(24,null),v.localize(25,null)],u.monthNamesShort=[v.localize(26,null),v.localize(27,null),v.localize(28,null),v.localize(29,null),v.localize(30,null),v.localize(31,null),v.localize(32,null),v.localize(33,null),v.localize(34,null),v.localize(35,null),v.localize(36,null),v.localize(37,null)];class f{constructor(s){this._workspaceService=s}resolve(s){if(!this._workspaceService)return;const l=(0,b.toWorkspaceIdentifier)(this._workspaceService.getWorkspace());if(!(0,b.isEmptyWorkspaceIdentifier)(l)){if(s.name==="WORKSPACE_NAME")return this._resolveWorkspaceName(l);if(s.name==="WORKSPACE_FOLDER")return this._resoveWorkspacePath(l)}}_resolveWorkspaceName(s){if((0,b.isSingleFolderWorkspaceIdentifier)(s))return k.basename(s.uri.path);let l=k.basename(s.configPath.path);return l.endsWith(b.WORKSPACE_EXTENSION)&&(l=l.substr(0,l.length-b.WORKSPACE_EXTENSION.length-1)),l}_resoveWorkspacePath(s){if((0,b.isSingleFolderWorkspaceIdentifier)(s))return(0,L.normalizeDriveLetter)(s.uri.fsPath);const l=k.basename(s.configPath.path);let o=s.configPath.fsPath;return o.endsWith(l)&&(o=o.substr(0,o.length-l.length-1)),o?(0,L.normalizeDriveLetter)(o):"/"}}e.WorkspaceBasedVariableResolver=f;class c{resolve(s){const{name:l}=s;if(l==="RANDOM")return Math.random().toString().slice(-6);if(l==="RANDOM_HEX")return Math.random().toString(16).slice(-6);if(l==="UUID")return(0,S.generateUuid)()}}e.RandomBasedVariableResolver=c}),define(se[390],oe([1,0,13,2,11,74,5,24,32,38,164,169,117,926,476]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";var t;Object.defineProperty(e,"__esModule",{value:!0}),e.SnippetSession=e.OneSnippet=void 0;class r{constructor(d,s,l){this._editor=d,this._snippet=s,this._snippetLineLeadingWhitespace=l,this._offset=-1,this._nestingLevel=1,this._placeholderGroups=(0,L.groupBy)(s.placeholders,i.Placeholder.compareByIndex),this._placeholderGroupsIdx=-1}initialize(d){this._offset=d.newPosition}dispose(){this._placeholderDecorations&&this._editor.removeDecorations([...this._placeholderDecorations.values()]),this._placeholderGroups.length=0}_initDecorations(){if(this._offset===-1)throw new Error("Snippet not initialized!");if(this._placeholderDecorations)return;this._placeholderDecorations=new Map;const d=this._editor.getModel();this._editor.changeDecorations(s=>{for(const l of this._snippet.placeholders){const o=this._snippet.offset(l),g=this._snippet.fullLen(l),h=S.Range.fromPositions(d.getPositionAt(this._offset+o),d.getPositionAt(this._offset+o+g)),m=l.isFinalTabstop?r._decor.inactiveFinal:r._decor.inactive,C=s.addDecoration(h,m);this._placeholderDecorations.set(l,C)}})}move(d){if(!this._editor.hasModel())return[];if(this._initDecorations(),this._placeholderGroupsIdx>=0){const o=[];for(const g of this._placeholderGroups[this._placeholderGroupsIdx])if(g.transform){const h=this._placeholderDecorations.get(g),m=this._editor.getModel().getDecorationRange(h),C=this._editor.getModel().getValueInRange(m),w=g.transform.resolve(C).split(/\r\n|\r|\n/);for(let D=1;D<w.length;D++)w[D]=this._editor.getModel().normalizeIndentation(this._snippetLineLeadingWhitespace+w[D]);o.push(E.EditOperation.replace(m,w.join(this._editor.getModel().getEOL())))}o.length>0&&this._editor.executeEdits("snippet.placeholderTransform",o)}let s=!1;d===!0&&this._placeholderGroupsIdx<this._placeholderGroups.length-1?(this._placeholderGroupsIdx+=1,s=!0):d===!1&&this._placeholderGroupsIdx>0&&(this._placeholderGroupsIdx-=1,s=!0);const l=this._editor.getModel().changeDecorations(o=>{const g=new Set,h=[];for(const m of this._placeholderGroups[this._placeholderGroupsIdx]){const C=this._placeholderDecorations.get(m),w=this._editor.getModel().getDecorationRange(C);h.push(new p.Selection(w.startLineNumber,w.startColumn,w.endLineNumber,w.endColumn)),s=s&&this._hasPlaceholderBeenCollapsed(m),o.changeDecorationOptions(C,m.isFinalTabstop?r._decor.activeFinal:r._decor.active),g.add(m);for(const D of this._snippet.enclosingPlaceholders(m)){const I=this._placeholderDecorations.get(D);o.changeDecorationOptions(I,D.isFinalTabstop?r._decor.activeFinal:r._decor.active),g.add(D)}}for(const[m,C]of this._placeholderDecorations)g.has(m)||o.changeDecorationOptions(C,m.isFinalTabstop?r._decor.inactiveFinal:r._decor.inactive);return h});return s?this.move(d):l??[]}_hasPlaceholderBeenCollapsed(d){let s=d;for(;s;){if(s instanceof i.Placeholder){const l=this._placeholderDecorations.get(s);if(this._editor.getModel().getDecorationRange(l).isEmpty()&&s.toString().length>0)return!0}s=s.parent}return!1}get isAtFirstPlaceholder(){return this._placeholderGroupsIdx<=0||this._placeholderGroups.length===0}get isAtLastPlaceholder(){return this._placeholderGroupsIdx===this._placeholderGroups.length-1}get hasPlaceholder(){return this._snippet.placeholders.length>0}get isTrivialSnippet(){if(this._snippet.placeholders.length===0)return!0;if(this._snippet.placeholders.length===1){const[d]=this._snippet.placeholders;if(d.isFinalTabstop&&this._snippet.rightMostDescendant===d)return!0}return!1}computePossibleSelections(){const d=new Map;for(const s of this._placeholderGroups){let l;for(const o of s){if(o.isFinalTabstop)break;l||(l=[],d.set(o.index,l));const g=this._placeholderDecorations.get(o),h=this._editor.getModel().getDecorationRange(g);if(!h){d.delete(o.index);break}l.push(h)}}return d}get activeChoice(){if(!this._placeholderDecorations)return;const d=this._placeholderGroups[this._placeholderGroupsIdx][0];if(!d?.choice)return;const s=this._placeholderDecorations.get(d);if(!s)return;const l=this._editor.getModel().getDecorationRange(s);if(l)return{range:l,choice:d.choice}}get hasChoice(){let d=!1;return this._snippet.walk(s=>(d=s instanceof i.Choice,!d)),d}merge(d){const s=this._editor.getModel();this._nestingLevel*=10,this._editor.changeDecorations(l=>{for(const o of this._placeholderGroups[this._placeholderGroupsIdx]){const g=d.shift();console.assert(g._offset!==-1),console.assert(!g._placeholderDecorations);const h=g._snippet.placeholderInfo.last.index;for(const C of g._snippet.placeholderInfo.all)C.isFinalTabstop?C.index=o.index+(h+1)/this._nestingLevel:C.index=o.index+C.index/this._nestingLevel;this._snippet.replace(o,g._snippet.children);const m=this._placeholderDecorations.get(o);l.removeDecoration(m),this._placeholderDecorations.delete(o);for(const C of g._snippet.placeholders){const w=g._snippet.offset(C),D=g._snippet.fullLen(C),I=S.Range.fromPositions(s.getPositionAt(g._offset+w),s.getPositionAt(g._offset+w+D)),T=l.addDecoration(I,r._decor.inactive);this._placeholderDecorations.set(C,T)}}this._placeholderGroups=(0,L.groupBy)(this._snippet.placeholders,i.Placeholder.compareByIndex)})}}e.OneSnippet=r,r._decor={active:v.ModelDecorationOptions.register({description:"snippet-placeholder-1",stickiness:0,className:"snippet-placeholder"}),inactive:v.ModelDecorationOptions.register({description:"snippet-placeholder-2",stickiness:1,className:"snippet-placeholder"}),activeFinal:v.ModelDecorationOptions.register({description:"snippet-placeholder-3",stickiness:1,className:"finish-snippet-placeholder"}),inactiveFinal:v.ModelDecorationOptions.register({description:"snippet-placeholder-4",stickiness:1,className:"finish-snippet-placeholder"})};const u={overwriteBefore:0,overwriteAfter:0,adjustWhitespace:!0,clipboardText:void 0,overtypingCapturer:void 0};let f=t=class{static adjustWhitespace(d,s,l,o,g){const h=d.getLineContent(s.lineNumber),m=(0,y.getLeadingWhitespace)(h,0,s.column-1);let C;return o.walk(w=>{if(!(w instanceof i.Text)||w.parent instanceof i.Choice||g&&!g.has(w))return!0;const D=w.value.split(/\r\n|\r|\n/);if(l){const T=o.offset(w);if(T===0)D[0]=d.normalizeIndentation(D[0]);else{C=C??o.toString();const A=C.charCodeAt(T-1);(A===10||A===13)&&(D[0]=d.normalizeIndentation(m+D[0]))}for(let A=1;A<D.length;A++)D[A]=d.normalizeIndentation(m+D[A])}const I=D.join(d.getEOL());return I!==w.value&&(w.parent.replace(w,[new i.Text(I)]),C=void 0),!0}),m}static adjustSelection(d,s,l,o){if(l!==0||o!==0){const{positionLineNumber:g,positionColumn:h}=s,m=h-l,C=h+o,w=d.validateRange({startLineNumber:g,startColumn:m,endLineNumber:g,endColumn:C});s=p.Selection.createWithDirection(w.startLineNumber,w.startColumn,w.endLineNumber,w.endColumn,s.getDirection())}return s}static createEditsAndSnippetsFromSelections(d,s,l,o,g,h,m,C,w){const D=[],I=[];if(!d.hasModel())return{edits:D,snippets:I};const T=d.getModel(),A=d.invokeWithinContext(B=>B.get(a.IWorkspaceContextService)),P=d.invokeWithinContext(B=>new n.ModelBasedVariableResolver(B.get(b.ILabelService),T)),N=()=>m,M=T.getValueInRange(t.adjustSelection(T,d.getSelection(),l,0)),R=T.getValueInRange(t.adjustSelection(T,d.getSelection(),0,o)),x=T.getLineFirstNonWhitespaceColumn(d.getSelection().positionLineNumber),O=d.getSelections().map((B,W)=>({selection:B,idx:W})).sort((B,W)=>S.Range.compareRangesUsingStarts(B.selection,W.selection));for(const{selection:B,idx:W}of O){let V=t.adjustSelection(T,B,l,0),K=t.adjustSelection(T,B,0,o);M!==T.getValueInRange(V)&&(V=B),R!==T.getValueInRange(K)&&(K=B);const F=B.setStartPosition(V.startLineNumber,V.startColumn).setEndPosition(K.endLineNumber,K.endColumn),q=new i.SnippetParser().parse(s,!0,g),ie=F.getStartPosition(),ae=t.adjustWhitespace(T,ie,h||W>0&&x!==T.getLineFirstNonWhitespaceColumn(B.positionLineNumber),q);q.resolveVariables(new n.CompositeSnippetVariableResolver([P,new n.ClipboardBasedVariableResolver(N,W,O.length,d.getOption(78)==="spread"),new n.SelectionBasedVariableResolver(T,B,W,C),new n.CommentBasedVariableResolver(T,B,w),new n.TimeBasedVariableResolver,new n.WorkspaceBasedVariableResolver(A),new n.RandomBasedVariableResolver])),D[W]=E.EditOperation.replace(F,q.toString()),D[W].identifier={major:W,minor:0},D[W]._isTracked=!0,I[W]=new r(d,q,ae)}return{edits:D,snippets:I}}static createEditsAndSnippetsFromEdits(d,s,l,o,g,h,m){if(!d.hasModel()||s.length===0)return{edits:[],snippets:[]};const C=[],w=d.getModel(),D=new i.SnippetParser,I=new i.TextmateSnippet,T=new n.CompositeSnippetVariableResolver([d.invokeWithinContext(P=>new n.ModelBasedVariableResolver(P.get(b.ILabelService),w)),new n.ClipboardBasedVariableResolver(()=>g,0,d.getSelections().length,d.getOption(78)==="spread"),new n.SelectionBasedVariableResolver(w,d.getSelection(),0,h),new n.CommentBasedVariableResolver(w,d.getSelection(),m),new n.TimeBasedVariableResolver,new n.WorkspaceBasedVariableResolver(d.invokeWithinContext(P=>P.get(a.IWorkspaceContextService))),new n.RandomBasedVariableResolver]);s=s.sort((P,N)=>S.Range.compareRangesUsingStarts(P.range,N.range));let A=0;for(let P=0;P<s.length;P++){const{range:N,template:M}=s[P];if(P>0){const W=s[P-1].range,V=S.Range.fromPositions(W.getEndPosition(),N.getStartPosition()),K=new i.Text(w.getValueInRange(V));I.appendChild(K),A+=K.value.length}const R=D.parseFragment(M,I);t.adjustWhitespace(w,N.getStartPosition(),!0,I,new Set(R)),I.resolveVariables(T);const x=I.toString(),O=x.slice(A);A=x.length;const B=E.EditOperation.replace(N,O);B.identifier={major:P,minor:0},B._isTracked=!0,C.push(B)}return D.ensureFinalTabstop(I,l,!0),{edits:C,snippets:[new r(d,I,"")]}}constructor(d,s,l=u,o){this._editor=d,this._template=s,this._options=l,this._languageConfigurationService=o,this._templateMerges=[],this._snippets=[]}dispose(){(0,k.dispose)(this._snippets)}_logInfo(){return`template="${this._template}", merged_templates="${this._templateMerges.join(" -> ")}"`}insert(){if(!this._editor.hasModel())return;const{edits:d,snippets:s}=typeof this._template=="string"?t.createEditsAndSnippetsFromSelections(this._editor,this._template,this._options.overwriteBefore,this._options.overwriteAfter,!1,this._options.adjustWhitespace,this._options.clipboardText,this._options.overtypingCapturer,this._languageConfigurationService):t.createEditsAndSnippetsFromEdits(this._editor,this._template,!1,this._options.adjustWhitespace,this._options.clipboardText,this._options.overtypingCapturer,this._languageConfigurationService);this._snippets=s,this._editor.executeEdits("snippet",d,l=>{const o=l.filter(g=>!!g.identifier);for(let g=0;g<s.length;g++)s[g].initialize(o[g].textChange);return this._snippets[0].hasPlaceholder?this._move(!0):o.map(g=>p.Selection.fromPositions(g.range.getEndPosition()))}),this._editor.revealRange(this._editor.getSelections()[0])}merge(d,s=u){if(!this._editor.hasModel())return;this._templateMerges.push([this._snippets[0]._nestingLevel,this._snippets[0]._placeholderGroupsIdx,d]);const{edits:l,snippets:o}=t.createEditsAndSnippetsFromSelections(this._editor,d,s.overwriteBefore,s.overwriteAfter,!0,s.adjustWhitespace,s.clipboardText,s.overtypingCapturer,this._languageConfigurationService);this._editor.executeEdits("snippet",l,g=>{const h=g.filter(C=>!!C.identifier);for(let C=0;C<o.length;C++)o[C].initialize(h[C].textChange);const m=o[0].isTrivialSnippet;if(!m){for(const C of this._snippets)C.merge(o);console.assert(o.length===0)}return this._snippets[0].hasPlaceholder&&!m?this._move(void 0):h.map(C=>p.Selection.fromPositions(C.range.getEndPosition()))})}next(){const d=this._move(!0);this._editor.setSelections(d),this._editor.revealPositionInCenterIfOutsideViewport(d[0].getPosition())}prev(){const d=this._move(!1);this._editor.setSelections(d),this._editor.revealPositionInCenterIfOutsideViewport(d[0].getPosition())}_move(d){const s=[];for(const l of this._snippets){const o=l.move(d);s.push(...o)}return s}get isAtFirstPlaceholder(){return this._snippets[0].isAtFirstPlaceholder}get isAtLastPlaceholder(){return this._snippets[0].isAtLastPlaceholder}get hasPlaceholder(){return this._snippets[0].hasPlaceholder}get hasChoice(){return this._snippets[0].hasChoice}get activeChoice(){return this._snippets[0].activeChoice}isSelectionWithinPlaceholders(){if(!this.hasPlaceholder)return!1;const d=this._editor.getSelections();if(d.length<this._snippets.length)return!1;const s=new Map;for(const l of this._snippets){const o=l.computePossibleSelections();if(s.size===0)for(const[g,h]of o){h.sort(S.Range.compareRangesUsingStarts);for(const m of d)if(h[0].containsRange(m)){s.set(g,[]);break}}if(s.size===0)return!1;s.forEach((g,h)=>{g.push(...o.get(h))})}d.sort(S.Range.compareRangesUsingStarts);for(const[l,o]of s){if(o.length!==d.length){s.delete(l);continue}o.sort(S.Range.compareRangesUsingStarts);for(let g=0;g<o.length;g++)if(!o[g].containsRange(d[g])){s.delete(l);continue}}return s.size>0}};e.SnippetSession=f,e.SnippetSession=f=t=ke([ge(3,_.ILanguageConfigurationService)],f)}),define(se[196],oe([1,0,2,20,16,10,21,32,18,138,713,15,64,390]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";var t;Object.defineProperty(e,"__esModule",{value:!0}),e.SnippetController2=void 0;const r={overwriteBefore:0,overwriteAfter:0,undoStopBefore:!0,undoStopAfter:!0,adjustWhitespace:!0,clipboardText:void 0,overtypingCapturer:void 0};let u=t=class{static get(d){return d.getContribution(t.ID)}constructor(d,s,l,o,g){this._editor=d,this._logService=s,this._languageFeaturesService=l,this._languageConfigurationService=g,this._snippetListener=new L.DisposableStore,this._modelVersionId=-1,this._inSnippet=t.InSnippetMode.bindTo(o),this._hasNextTabstop=t.HasNextTabstop.bindTo(o),this._hasPrevTabstop=t.HasPrevTabstop.bindTo(o)}dispose(){var d;this._inSnippet.reset(),this._hasPrevTabstop.reset(),this._hasNextTabstop.reset(),(d=this._session)===null||d===void 0||d.dispose(),this._snippetListener.dispose()}insert(d,s){try{this._doInsert(d,typeof s>"u"?r:{...r,...s})}catch(l){this.cancel(),this._logService.error(l),this._logService.error("snippet_error"),this._logService.error("insert_template=",d),this._logService.error("existing_template=",this._session?this._session._logInfo():"<no_session>")}}_doInsert(d,s){var l;if(this._editor.hasModel()){if(this._snippetListener.clear(),s.undoStopBefore&&this._editor.getModel().pushStackElement(),this._session&&typeof d!="string"&&this.cancel(),this._session?((0,k.assertType)(typeof d=="string"),this._session.merge(d,s)):(this._modelVersionId=this._editor.getModel().getAlternativeVersionId(),this._session=new n.SnippetSession(this._editor,d,s,this._languageConfigurationService),this._session.insert()),s.undoStopAfter&&this._editor.getModel().pushStackElement(),!((l=this._session)===null||l===void 0)&&l.hasChoice){const o={_debugDisplayName:"snippetChoiceCompletions",provideCompletionItems:(D,I)=>{if(!this._session||D!==this._editor.getModel()||!E.Position.equals(this._editor.getPosition(),I))return;const{activeChoice:T}=this._session;if(!T||T.choice.options.length===0)return;const A=D.getValueInRange(T.range),P=!!T.choice.options.find(M=>M.value===A),N=[];for(let M=0;M<T.choice.options.length;M++){const R=T.choice.options[M];N.push({kind:13,label:R.value,insertText:R.value,sortText:"a".repeat(M+1),range:T.range,filterText:P?`${A}_${R.value}`:void 0,command:{id:"jumpToNextSnippetPlaceholder",title:(0,b.localize)(3,null)}})}return{suggestions:N}}},g=this._editor.getModel();let h,m=!1;const C=()=>{h?.dispose(),m=!1},w=()=>{m||(h=this._languageFeaturesService.completionProvider.register({language:g.getLanguageId(),pattern:g.uri.fsPath,scheme:g.uri.scheme,exclusive:!0},o),this._snippetListener.add(h),m=!0)};this._choiceCompletions={provider:o,enable:w,disable:C}}this._updateState(),this._snippetListener.add(this._editor.onDidChangeModelContent(o=>o.isFlush&&this.cancel())),this._snippetListener.add(this._editor.onDidChangeModel(()=>this.cancel())),this._snippetListener.add(this._editor.onDidChangeCursorSelection(()=>this._updateState()))}}_updateState(){if(!(!this._session||!this._editor.hasModel())){if(this._modelVersionId===this._editor.getModel().getAlternativeVersionId())return this.cancel();if(!this._session.hasPlaceholder)return this.cancel();if(this._session.isAtLastPlaceholder||!this._session.isSelectionWithinPlaceholders())return this._editor.getModel().pushStackElement(),this.cancel();this._inSnippet.set(!0),this._hasPrevTabstop.set(!this._session.isAtFirstPlaceholder),this._hasNextTabstop.set(!this._session.isAtLastPlaceholder),this._handleChoice()}}_handleChoice(){var d;if(!this._session||!this._editor.hasModel()){this._currentChoice=void 0;return}const{activeChoice:s}=this._session;if(!s||!this._choiceCompletions){(d=this._choiceCompletions)===null||d===void 0||d.disable(),this._currentChoice=void 0;return}this._currentChoice!==s.choice&&(this._currentChoice=s.choice,this._choiceCompletions.enable(),queueMicrotask(()=>{(0,v.showSimpleSuggestions)(this._editor,this._choiceCompletions.provider)}))}finish(){for(;this._inSnippet.get();)this.next()}cancel(d=!1){var s;this._inSnippet.reset(),this._hasPrevTabstop.reset(),this._hasNextTabstop.reset(),this._snippetListener.clear(),this._currentChoice=void 0,(s=this._session)===null||s===void 0||s.dispose(),this._session=void 0,this._modelVersionId=-1,d&&this._editor.setSelections([this._editor.getSelection()])}prev(){var d;(d=this._session)===null||d===void 0||d.prev(),this._updateState()}next(){var d;(d=this._session)===null||d===void 0||d.next(),this._updateState()}isInSnippet(){return!!this._inSnippet.get()}};e.SnippetController2=u,u.ID="snippetController2",u.InSnippetMode=new a.RawContextKey("inSnippetMode",!1,(0,b.localize)(0,null)),u.HasNextTabstop=new a.RawContextKey("hasNextTabstop",!1,(0,b.localize)(1,null)),u.HasPrevTabstop=new a.RawContextKey("hasPrevTabstop",!1,(0,b.localize)(2,null)),e.SnippetController2=u=t=ke([ge(1,i.ILogService),ge(2,_.ILanguageFeaturesService),ge(3,a.IContextKeyService),ge(4,p.ILanguageConfigurationService)],u),(0,y.registerEditorContribution)(u.ID,u,4);const f=y.EditorCommand.bindToContribution(u.get);(0,y.registerEditorCommand)(new f({id:"jumpToNextSnippetPlaceholder",precondition:a.ContextKeyExpr.and(u.InSnippetMode,u.HasNextTabstop),handler:c=>c.next(),kbOpts:{weight:100+30,kbExpr:S.EditorContextKeys.editorTextFocus,primary:2}})),(0,y.registerEditorCommand)(new f({id:"jumpToPrevSnippetPlaceholder",precondition:a.ContextKeyExpr.and(u.InSnippetMode,u.HasPrevTabstop),handler:c=>c.prev(),kbOpts:{weight:100+30,kbExpr:S.EditorContextKeys.editorTextFocus,primary:1026}})),(0,y.registerEditorCommand)(new f({id:"leaveSnippet",precondition:u.InSnippetMode,handler:c=>c.cancel(!0),kbOpts:{weight:100+30,kbExpr:S.EditorContextKeys.editorTextFocus,primary:9,secondary:[1033]}})),(0,y.registerEditorCommand)(new f({id:"acceptSnippet",precondition:u.InSnippetMode,handler:c=>c.finish()}))}),define(se[927],oe([1,0,60,12,2,35,20,74,10,5,31,32,217,797,156,196,25,8]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineCompletionsModel=e.VersionIdChangeReason=void 0;var c;(function(s){s[s.Undo=0]="Undo",s[s.Redo=1]="Redo",s[s.AcceptWord=2]="AcceptWord",s[s.Other=3]="Other"})(c||(e.VersionIdChangeReason=c={}));let d=class extends y.Disposable{get isAcceptingPartially(){return this._isAcceptingPartially}constructor(l,o,g,h,m,C,w,D,I,T,A,P){super(),this.textModel=l,this.selectedSuggestItem=o,this.cursorPosition=g,this.textModelVersionId=h,this._debounceValue=m,this._suggestPreviewEnabled=C,this._suggestPreviewMode=w,this._inlineSuggestMode=D,this._enabled=I,this._instantiationService=T,this._commandService=A,this._languageConfigurationService=P,this._source=this._register(this._instantiationService.createInstance(n.InlineCompletionsSource,this.textModel,this.textModelVersionId,this._debounceValue)),this._isActive=(0,E.observableValue)(this,!1),this._forceUpdateSignal=(0,E.observableSignal)("forceUpdate"),this._selectedInlineCompletionId=(0,E.observableValue)(this,void 0),this._isAcceptingPartially=!1,this._preserveCurrentCompletionReasons=new Set([c.Redo,c.Undo,c.AcceptWord]),this._fetchInlineCompletions=(0,E.derivedHandleChanges)({owner:this,createEmptyChangeSummary:()=>({preserveCurrentCompletion:!1,inlineCompletionTriggerKind:b.InlineCompletionTriggerKind.Automatic}),handleChange:(M,R)=>(M.didChange(this.textModelVersionId)&&this._preserveCurrentCompletionReasons.has(M.change)?R.preserveCurrentCompletion=!0:M.didChange(this._forceUpdateSignal)&&(R.inlineCompletionTriggerKind=M.change),!0)},(M,R)=>{if(this._forceUpdateSignal.read(M),!(this._enabled.read(M)&&this.selectedSuggestItem.read(M)||this._isActive.read(M))){this._source.cancelUpdate();return}this.textModelVersionId.read(M);const O=this.selectedInlineCompletion.get(),B=R.preserveCurrentCompletion||O?.forwardStable?O:void 0,W=this._source.suggestWidgetInlineCompletions.get(),V=this.selectedSuggestItem.read(M);if(W&&!V){const q=this._source.inlineCompletions.get();(0,E.transaction)(ie=>{(!q||W.request.versionId>q.request.versionId)&&this._source.inlineCompletions.set(W.clone(),ie),this._source.clearSuggestWidgetInlineCompletions(ie)})}const K=this.cursorPosition.read(M),F={triggerKind:R.inlineCompletionTriggerKind,selectedSuggestionInfo:V?.toSelectedSuggestionInfo()};return this._source.fetch(K,F,B)}),this._filteredInlineCompletionItems=(0,E.derived)(this,M=>{const R=this._source.inlineCompletions.read(M);if(!R)return[];const x=this.cursorPosition.read(M);return R.inlineCompletions.filter(B=>B.isVisible(this.textModel,x,M))}),this.selectedInlineCompletionIndex=(0,E.derived)(this,M=>{const R=this._selectedInlineCompletionId.read(M),x=this._filteredInlineCompletionItems.read(M),O=this._selectedInlineCompletionId===void 0?-1:x.findIndex(B=>B.semanticId===R);return O===-1?(this._selectedInlineCompletionId.set(void 0,void 0),0):O}),this.selectedInlineCompletion=(0,E.derived)(this,M=>{const R=this._filteredInlineCompletionItems.read(M),x=this.selectedInlineCompletionIndex.read(M);return R[x]}),this.lastTriggerKind=this._source.inlineCompletions.map(this,M=>M?.request.context.triggerKind),this.inlineCompletionsCount=(0,E.derived)(this,M=>{if(this.lastTriggerKind.read(M)===b.InlineCompletionTriggerKind.Explicit)return this._filteredInlineCompletionItems.read(M).length}),this.state=(0,E.derivedOpts)({owner:this,equalityComparer:(M,R)=>!M||!R?M===R:(0,i.ghostTextOrReplacementEquals)(M.ghostText,R.ghostText)&&M.inlineCompletion===R.inlineCompletion&&M.suggestItem===R.suggestItem},M=>{var R;const x=this.textModel,O=this.selectedSuggestItem.read(M);if(O){const B=O.toSingleTextEdit().removeCommonPrefix(x),W=this._computeAugmentedCompletion(B,M);if(!this._suggestPreviewEnabled.read(M)&&!W)return;const K=(R=W?.edit)!==null&&R!==void 0?R:B,F=W?W.edit.text.length-B.text.length:0,q=this._suggestPreviewMode.read(M),ie=this.cursorPosition.read(M),ae=K.computeGhostText(x,q,ie,F);return{ghostText:ae??new i.GhostText(K.range.endLineNumber,[]),inlineCompletion:W?.completion,suggestItem:O}}else{if(!this._isActive.read(M))return;const B=this.selectedInlineCompletion.read(M);if(!B)return;const W=B.toSingleTextEdit(M),V=this._inlineSuggestMode.read(M),K=this.cursorPosition.read(M),F=W.computeGhostText(x,V,K);return F?{ghostText:F,inlineCompletion:B,suggestItem:void 0}:void 0}}),this.ghostText=(0,E.derivedOpts)({owner:this,equalityComparer:i.ghostTextOrReplacementEquals},M=>{const R=this.state.read(M);if(R)return R.ghostText}),this._register((0,E.recomputeInitiallyAndOnChange)(this._fetchInlineCompletions));let N;this._register((0,E.autorun)(M=>{var R,x;const O=this.state.read(M),B=O?.inlineCompletion;if(B?.semanticId!==N?.semanticId&&(N=B,B)){const W=B.inlineCompletion,V=W.source;(x=(R=V.provider).handleItemDidShow)===null||x===void 0||x.call(R,V.inlineCompletions,W.sourceInlineCompletion,W.insertText)}}))}async trigger(l){this._isActive.set(!0,l),await this._fetchInlineCompletions.get()}async triggerExplicitly(l){(0,E.subtransaction)(l,o=>{this._isActive.set(!0,o),this._forceUpdateSignal.trigger(o,b.InlineCompletionTriggerKind.Explicit)}),await this._fetchInlineCompletions.get()}stop(l){(0,E.subtransaction)(l,o=>{this._isActive.set(!1,o),this._source.clear(o)})}_computeAugmentedCompletion(l,o){const g=this.textModel,h=this._source.suggestWidgetInlineCompletions.read(o),m=h?h.inlineCompletions:[this.selectedInlineCompletion.read(o)].filter(S.isDefined);return(0,L.mapFindFirst)(m,w=>{let D=w.toSingleTextEdit(o);return D=D.removeCommonPrefix(g,v.Range.fromPositions(D.range.getStartPosition(),l.range.getEndPosition())),D.augments(l)?{edit:D,completion:w}:void 0})}async _deltaSelectedInlineCompletionIndex(l){await this.triggerExplicitly();const o=this._filteredInlineCompletionItems.get()||[];if(o.length>0){const g=(this.selectedInlineCompletionIndex.get()+l+o.length)%o.length;this._selectedInlineCompletionId.set(o[g].semanticId,void 0)}else this._selectedInlineCompletionId.set(void 0,void 0)}async next(){await this._deltaSelectedInlineCompletionIndex(1)}async previous(){await this._deltaSelectedInlineCompletionIndex(-1)}async accept(l){var o;if(l.getModel()!==this.textModel)throw new k.BugIndicatingError;const g=this.state.get();if(!g||g.ghostText.isEmpty()||!g.inlineCompletion)return;const h=g.inlineCompletion.toInlineCompletion(void 0);l.pushUndoStop(),h.snippetInfo?(l.executeEdits("inlineSuggestion.accept",[p.EditOperation.replaceMove(h.range,""),...h.additionalTextEdits]),l.setPosition(h.snippetInfo.range.getStartPosition(),"inlineCompletionAccept"),(o=r.SnippetController2.get(l))===null||o===void 0||o.insert(h.snippetInfo.snippet,{undoStopBefore:!1})):l.executeEdits("inlineSuggestion.accept",[p.EditOperation.replaceMove(h.range,h.insertText),...h.additionalTextEdits]),h.command&&h.source.addRef(),(0,E.transaction)(m=>{this._source.clear(m),this._isActive.set(!1,m)}),h.command&&(await this._commandService.executeCommand(h.command.id,...h.command.arguments||[]).then(void 0,k.onUnexpectedExternalError),h.source.removeRef())}async acceptNextWord(l){await this._acceptNext(l,(o,g)=>{const h=this.textModel.getLanguageIdAtPosition(o.lineNumber,o.column),m=this._languageConfigurationService.getLanguageConfiguration(h),C=new RegExp(m.wordDefinition.source,m.wordDefinition.flags.replace("g","")),w=g.match(C);let D=0;w&&w.index!==void 0?w.index===0?D=w[0].length:D=w.index:D=g.length;const T=/\s+/g.exec(g);return T&&T.index!==void 0&&T.index+T[0].length<D&&(D=T.index+T[0].length),D})}async acceptNextLine(l){await this._acceptNext(l,(o,g)=>{const h=g.match(/\n/);return h&&h.index!==void 0?h.index+1:g.length})}async _acceptNext(l,o){if(l.getModel()!==this.textModel)throw new k.BugIndicatingError;const g=this.state.get();if(!g||g.ghostText.isEmpty()||!g.inlineCompletion)return;const h=g.ghostText,m=g.inlineCompletion.toInlineCompletion(void 0);if(m.snippetInfo||m.filterText!==m.insertText){await this.accept(l);return}const C=h.parts[0],w=new _.Position(h.lineNumber,C.column),D=C.lines.join(`
+`),I=o(w,D);if(I===D.length&&h.parts.length===1){this.accept(l);return}const T=D.substring(0,I);m.source.addRef();try{this._isAcceptingPartially=!0;try{l.pushUndoStop(),l.executeEdits("inlineSuggestion.accept",[p.EditOperation.replace(v.Range.fromPositions(w),T)]);const A=(0,t.lengthOfText)(T);l.setPosition((0,t.addPositions)(w,A),"inlineCompletionPartialAccept")}finally{this._isAcceptingPartially=!1}if(m.source.provider.handlePartialAccept){const A=v.Range.fromPositions(m.range.getStartPosition(),(0,t.addPositions)(w,(0,t.lengthOfText)(T))),P=l.getModel().getValueInRange(A,1);m.source.provider.handlePartialAccept(m.source.inlineCompletions,m.sourceInlineCompletion,P.length)}}finally{m.source.removeRef()}}handleSuggestAccepted(l){var o,g;const h=l.toSingleTextEdit().removeCommonPrefix(this.textModel),m=this._computeAugmentedCompletion(h,void 0);if(!m)return;const C=m.completion.inlineCompletion;(g=(o=C.source.provider).handlePartialAccept)===null||g===void 0||g.call(o,C.source.inlineCompletions,C.sourceInlineCompletion,h.text.length)}};e.InlineCompletionsModel=d,e.InlineCompletionsModel=d=ke([ge(9,f.IInstantiationService),ge(10,u.ICommandService),ge(11,a.ILanguageConfigurationService)],d)}),define(se[391],oe([1,0,14,19,12,6,2,11,24,121,312,103,27,15,64,81,311,138,18,71,20,240,196,243]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g){"use strict";var h;Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestModel=e.LineContext=void 0;class m{static shouldAutoTrigger(T){if(!T.hasModel())return!1;const A=T.getModel(),P=T.getPosition();A.tokenization.tokenizeIfCheap(P.lineNumber);const N=A.getWordAtPosition(P);return!(!N||N.endColumn!==P.column&&N.startColumn+1!==P.column||!isNaN(Number(N.word)))}constructor(T,A,P){this.leadingLineContent=T.getLineContent(A.lineNumber).substr(0,A.column-1),this.leadingWord=T.getWordUntilPosition(A),this.lineNumber=A.lineNumber,this.column=A.column,this.triggerOptions=P}}e.LineContext=m;function C(I,T,A){if(!T.getContextKeyValue(l.InlineCompletionContextKeys.inlineSuggestionVisible.key))return!0;const P=T.getContextKeyValue(l.InlineCompletionContextKeys.suppressSuggestions.key);return P!==void 0?!P:!I.getOption(62).suppressSuggestions}function w(I,T,A){if(!T.getContextKeyValue("inlineSuggestionVisible"))return!0;const P=T.getContextKeyValue(l.InlineCompletionContextKeys.suppressSuggestions.key);return P!==void 0?!P:!I.getOption(62).suppressSuggestions}let D=h=class{constructor(T,A,P,N,M,R,x,O,B){this._editor=T,this._editorWorkerService=A,this._clipboardService=P,this._telemetryService=N,this._logService=M,this._contextKeyService=R,this._configurationService=x,this._languageFeaturesService=O,this._envService=B,this._toDispose=new S.DisposableStore,this._triggerCharacterListener=new S.DisposableStore,this._triggerQuickSuggest=new L.TimeoutTimer,this._triggerState=void 0,this._completionDisposables=new S.DisposableStore,this._onDidCancel=new E.Emitter,this._onDidTrigger=new E.Emitter,this._onDidSuggest=new E.Emitter,this.onDidCancel=this._onDidCancel.event,this.onDidTrigger=this._onDidTrigger.event,this.onDidSuggest=this._onDidSuggest.event,this._telemetryGate=0,this._currentSelection=this._editor.getSelection()||new _.Selection(1,1,1,1),this._toDispose.add(this._editor.onDidChangeModel(()=>{this._updateTriggerCharacters(),this.cancel()})),this._toDispose.add(this._editor.onDidChangeModelLanguage(()=>{this._updateTriggerCharacters(),this.cancel()})),this._toDispose.add(this._editor.onDidChangeConfiguration(()=>{this._updateTriggerCharacters()})),this._toDispose.add(this._languageFeaturesService.completionProvider.onDidChange(()=>{this._updateTriggerCharacters(),this._updateActiveSuggestSession()}));let W=!1;this._toDispose.add(this._editor.onDidCompositionStart(()=>{W=!0})),this._toDispose.add(this._editor.onDidCompositionEnd(()=>{W=!1,this._onCompositionEnd()})),this._toDispose.add(this._editor.onDidChangeCursorSelection(V=>{W||this._onCursorChange(V)})),this._toDispose.add(this._editor.onDidChangeModelContent(()=>{!W&&this._triggerState!==void 0&&this._refilterCompletionItems()})),this._updateTriggerCharacters()}dispose(){(0,S.dispose)(this._triggerCharacterListener),(0,S.dispose)([this._onDidCancel,this._onDidSuggest,this._onDidTrigger,this._triggerQuickSuggest]),this._toDispose.dispose(),this._completionDisposables.dispose(),this.cancel()}_updateTriggerCharacters(){if(this._triggerCharacterListener.clear(),this._editor.getOption(90)||!this._editor.hasModel()||!this._editor.getOption(120))return;const T=new Map;for(const P of this._languageFeaturesService.completionProvider.all(this._editor.getModel()))for(const N of P.triggerCharacters||[]){let M=T.get(N);M||(M=new Set,M.add((0,f.getSnippetSuggestSupport)()),T.set(N,M)),M.add(P)}const A=P=>{var N;if(!w(this._editor,this._contextKeyService,this._configurationService)||m.shouldAutoTrigger(this._editor))return;if(!P){const x=this._editor.getPosition();P=this._editor.getModel().getLineContent(x.lineNumber).substr(0,x.column-1)}let M="";(0,p.isLowSurrogate)(P.charCodeAt(P.length-1))?(0,p.isHighSurrogate)(P.charCodeAt(P.length-2))&&(M=P.substr(P.length-2)):M=P.charAt(P.length-1);const R=T.get(M);if(R){const x=new Map;if(this._completionModel)for(const[O,B]of this._completionModel.getItemsByProvider())R.has(O)||x.set(O,B);this.trigger({auto:!0,triggerKind:1,triggerCharacter:M,retrigger:!!this._completionModel,clipboardText:(N=this._completionModel)===null||N===void 0?void 0:N.clipboardText,completionOptions:{providerFilter:R,providerItemsToReuse:x}})}};this._triggerCharacterListener.add(this._editor.onDidType(A)),this._triggerCharacterListener.add(this._editor.onDidCompositionEnd(()=>A()))}get state(){return this._triggerState?this._triggerState.auto?2:1:0}cancel(T=!1){var A;this._triggerState!==void 0&&(this._triggerQuickSuggest.cancel(),(A=this._requestToken)===null||A===void 0||A.cancel(),this._requestToken=void 0,this._triggerState=void 0,this._completionModel=void 0,this._context=void 0,this._onDidCancel.fire({retrigger:T}))}clear(){this._completionDisposables.clear()}_updateActiveSuggestSession(){this._triggerState!==void 0&&(!this._editor.hasModel()||!this._languageFeaturesService.completionProvider.has(this._editor.getModel())?this.cancel():this.trigger({auto:this._triggerState.auto,retrigger:!0}))}_onCursorChange(T){if(!this._editor.hasModel())return;const A=this._currentSelection;if(this._currentSelection=this._editor.getSelection(),!T.selection.isEmpty()||T.reason!==0&&T.reason!==3||T.source!=="keyboard"&&T.source!=="deleteLeft"){this.cancel();return}this._triggerState===void 0&&T.reason===0?(A.containsRange(this._currentSelection)||A.getEndPosition().isBeforeOrEqual(this._currentSelection.getPosition()))&&this._doTriggerQuickSuggest():this._triggerState!==void 0&&T.reason===3&&this._refilterCompletionItems()}_onCompositionEnd(){this._triggerState===void 0?this._doTriggerQuickSuggest():this._refilterCompletionItems()}_doTriggerQuickSuggest(){var T;f.QuickSuggestionsOptions.isAllOff(this._editor.getOption(88))||this._editor.getOption(117).snippetsPreventQuickSuggestions&&(!((T=o.SnippetController2.get(this._editor))===null||T===void 0)&&T.isInSnippet())||(this.cancel(),this._triggerQuickSuggest.cancelAndSet(()=>{if(this._triggerState!==void 0||!m.shouldAutoTrigger(this._editor)||!this._editor.hasModel()||!this._editor.hasWidgetFocus())return;const A=this._editor.getModel(),P=this._editor.getPosition(),N=this._editor.getOption(88);if(!f.QuickSuggestionsOptions.isAllOff(N)){if(!f.QuickSuggestionsOptions.isAllOn(N)){A.tokenization.tokenizeIfCheap(P.lineNumber);const M=A.tokenization.getLineTokens(P.lineNumber),R=M.getStandardTokenType(M.findTokenIndexAtOffset(Math.max(P.column-1-1,0)));if(f.QuickSuggestionsOptions.valueFor(N,R)!=="on")return}C(this._editor,this._contextKeyService,this._configurationService)&&this._languageFeaturesService.completionProvider.has(A)&&this.trigger({auto:!0})}},this._editor.getOption(89)))}_refilterCompletionItems(){(0,s.assertType)(this._editor.hasModel()),(0,s.assertType)(this._triggerState!==void 0);const T=this._editor.getModel(),A=this._editor.getPosition(),P=new m(T,A,{...this._triggerState,refilter:!0});this._onNewContext(P)}trigger(T){var A,P,N,M,R,x;if(!this._editor.hasModel())return;const O=this._editor.getModel(),B=new m(O,this._editor.getPosition(),T);this.cancel(T.retrigger),this._triggerState=T,this._onDidTrigger.fire({auto:T.auto,shy:(A=T.shy)!==null&&A!==void 0?A:!1,position:this._editor.getPosition()}),this._context=B;let W={triggerKind:(P=T.triggerKind)!==null&&P!==void 0?P:0};T.triggerCharacter&&(W={triggerKind:1,triggerCharacter:T.triggerCharacter}),this._requestToken=new k.CancellationTokenSource;const V=this._editor.getOption(111);let K=1;switch(V){case"top":K=0;break;case"bottom":K=2;break}const{itemKind:F,showDeprecated:q}=h.createSuggestFilter(this._editor),ie=new f.CompletionOptions(K,(M=(N=T.completionOptions)===null||N===void 0?void 0:N.kindFilter)!==null&&M!==void 0?M:F,(R=T.completionOptions)===null||R===void 0?void 0:R.providerFilter,(x=T.completionOptions)===null||x===void 0?void 0:x.providerItemsToReuse,q),ae=b.WordDistance.create(this._editorWorkerService,this._editor),ne=(0,f.provideSuggestionItems)(this._languageFeaturesService.completionProvider,O,this._editor.getPosition(),ie,W,this._requestToken.token);Promise.all([ne,ae]).then(async([$,J])=>{var Q;if((Q=this._requestToken)===null||Q===void 0||Q.dispose(),!this._editor.hasModel())return;let re=T?.clipboardText;if(!re&&$.needsClipboard&&(re=await this._clipboardService.readText()),this._triggerState===void 0)return;const de=this._editor.getModel(),he=new m(de,this._editor.getPosition(),T),me={...d.FuzzyScoreOptions.default,firstMatchCanBeWeak:!this._editor.getOption(117).matchOnWordStartOnly};if(this._completionModel=new u.CompletionModel($.items,this._context.column,{leadingLineContent:he.leadingLineContent,characterCountDelta:he.column-this._context.column},J,this._editor.getOption(117),this._editor.getOption(111),me,re),this._completionDisposables.add($.disposable),this._onNewContext(he),this._reportDurationsTelemetry($.durations),!this._envService.isBuilt||this._envService.isExtensionDevelopment)for(const X of $.items)X.isInvalid&&this._logService.warn(`[suggest] did IGNORE invalid completion item from ${X.provider._debugDisplayName}`,X.completion)}).catch(y.onUnexpectedError)}_reportDurationsTelemetry(T){this._telemetryGate++%230===0&&setTimeout(()=>{this._telemetryService.publicLog2("suggest.durations.json",{data:JSON.stringify(T)}),this._logService.debug("suggest.durations.json",T)})}static createSuggestFilter(T){const A=new Set;T.getOption(111)==="none"&&A.add(27);const N=T.getOption(117);return N.showMethods||A.add(0),N.showFunctions||A.add(1),N.showConstructors||A.add(2),N.showFields||A.add(3),N.showVariables||A.add(4),N.showClasses||A.add(5),N.showStructs||A.add(6),N.showInterfaces||A.add(7),N.showModules||A.add(8),N.showProperties||A.add(9),N.showEvents||A.add(10),N.showOperators||A.add(11),N.showUnits||A.add(12),N.showValues||A.add(13),N.showConstants||A.add(14),N.showEnums||A.add(15),N.showEnumMembers||A.add(16),N.showKeywords||A.add(17),N.showWords||A.add(18),N.showColors||A.add(19),N.showFiles||A.add(20),N.showReferences||A.add(21),N.showColors||A.add(22),N.showFolders||A.add(23),N.showTypeParameters||A.add(24),N.showSnippets||A.add(27),N.showUsers||A.add(25),N.showIssues||A.add(26),{itemKind:A,showDeprecated:N.showDeprecated}}_onNewContext(T){if(this._context){if(T.lineNumber!==this._context.lineNumber){this.cancel();return}if((0,p.getLeadingWhitespace)(T.leadingLineContent)!==(0,p.getLeadingWhitespace)(this._context.leadingLineContent)){this.cancel();return}if(T.column<this._context.column){T.leadingWord.word?this.trigger({auto:this._context.triggerOptions.auto,retrigger:!0}):this.cancel();return}if(this._completionModel){if(T.leadingWord.word.length!==0&&T.leadingWord.startColumn>this._context.leadingWord.startColumn){if(m.shouldAutoTrigger(this._editor)&&this._context){const P=this._completionModel.getItemsByProvider();this.trigger({auto:this._context.triggerOptions.auto,retrigger:!0,clipboardText:this._completionModel.clipboardText,completionOptions:{providerItemsToReuse:P}})}return}if(T.column>this._context.column&&this._completionModel.getIncompleteProvider().size>0&&T.leadingWord.word.length!==0){const A=new Map,P=new Set;for(const[N,M]of this._completionModel.getItemsByProvider())M.length>0&&M[0].container.incomplete?P.add(N):A.set(N,M);this.trigger({auto:this._context.triggerOptions.auto,triggerKind:2,retrigger:!0,clipboardText:this._completionModel.clipboardText,completionOptions:{providerFilter:P,providerItemsToReuse:A}})}else{const A=this._completionModel.lineContext;let P=!1;if(this._completionModel.lineContext={leadingLineContent:T.leadingLineContent,characterCountDelta:T.column-this._context.column},this._completionModel.items.length===0){const N=m.shouldAutoTrigger(this._editor);if(!this._context){this.cancel();return}if(N&&this._context.leadingWord.endColumn<T.leadingWord.startColumn){this.trigger({auto:this._context.triggerOptions.auto,retrigger:!0});return}if(this._context.triggerOptions.auto){this.cancel();return}else if(this._completionModel.lineContext=A,P=this._completionModel.items.length>0,P&&T.leadingWord.word.length===0){this.cancel();return}}this._onDidSuggest.fire({completionModel:this._completionModel,triggerOptions:T.triggerOptions,isFrozen:P})}}}}};e.SuggestModel=D,e.SuggestModel=D=h=ke([ge(1,v.IEditorWorkerService),ge(2,a.IClipboardService),ge(3,r.ITelemetryService),ge(4,t.ILogService),ge(5,n.IContextKeyService),ge(6,i.IConfigurationService),ge(7,c.ILanguageFeaturesService),ge(8,g.IEnvironmentService)],D)}),define(se[392],oe([1,0,48,13,19,12,6,125,2,17,61,20,127,16,74,10,5,21,196,117,358,770,717,25,15,8,64,138,769,563,391,564,909,81,49,111,7,38]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w,D,I,T,A,P,N,M,R,x,O){"use strict";var B;Object.defineProperty(e,"__esModule",{value:!0}),e.TriggerSuggestAction=e.SuggestController=void 0;const W=!1;class V{constructor($,J){if(this._model=$,this._position=J,this._decorationOptions=O.ModelDecorationOptions.register({description:"suggest-line-suffix",stickiness:1}),$.getLineMaxColumn(J.lineNumber)!==J.column){const re=$.getOffsetAt(J),de=$.getPositionAt(re+1);$.changeDecorations(he=>{this._marker&&he.removeDecoration(this._marker),this._marker=he.addDecoration(u.Range.fromPositions(J,de),this._decorationOptions)})}}dispose(){this._marker&&!this._model.isDisposed()&&this._model.changeDecorations($=>{$.removeDecoration(this._marker),this._marker=void 0})}delta($){if(this._model.isDisposed()||this._position.lineNumber!==$.lineNumber)return 0;if(this._marker){const J=this._model.getDecorationRange(this._marker);return this._model.getOffsetAt(J.getStartPosition())-this._model.getOffsetAt($)}else return this._model.getLineMaxColumn($.lineNumber)-$.column}}let K=B=class{static get($){return $.getContribution(B.ID)}constructor($,J,Q,re,de,he,me){this._memoryService=J,this._commandService=Q,this._contextKeyService=re,this._instantiationService=de,this._logService=he,this._telemetryService=me,this._lineSuffix=new _.MutableDisposable,this._toDispose=new _.DisposableStore,this._selectors=new F(z=>z.priority),this._onWillInsertSuggestItem=new S.Emitter,this.onWillInsertSuggestItem=this._onWillInsertSuggestItem.event,this.editor=$,this.model=de.createInstance(T.SuggestModel,this.editor),this._selectors.register({priority:0,select:(z,H,Y)=>this._memoryService.select(z,H,Y)});const X=w.Context.InsertMode.bindTo(re);X.set($.getOption(117).insertMode),this._toDispose.add(this.model.onDidTrigger(()=>X.set($.getOption(117).insertMode))),this.widget=this._toDispose.add(new x.WindowIdleValue((0,x.getWindow)($.getDomNode()),()=>{const z=this._instantiationService.createInstance(P.SuggestWidget,this.editor);this._toDispose.add(z),this._toDispose.add(z.onDidSelect(ee=>this._insertSuggestion(ee,0),this));const H=new I.CommitCharacterController(this.editor,z,this.model,ee=>this._insertSuggestion(ee,2));this._toDispose.add(H);const Y=w.Context.MakesTextEdit.bindTo(this._contextKeyService),j=w.Context.HasInsertAndReplaceRange.bindTo(this._contextKeyService),Z=w.Context.CanResolve.bindTo(this._contextKeyService);return this._toDispose.add((0,_.toDisposable)(()=>{Y.reset(),j.reset(),Z.reset()})),this._toDispose.add(z.onDidFocus(({item:ee})=>{const le=this.editor.getPosition(),ue=ee.editStart.column,ce=le.column;let pe=!0;this.editor.getOption(1)==="smart"&&this.model.state===2&&!ee.completion.additionalTextEdits&&!(ee.completion.insertTextRules&4)&&ce-ue===ee.completion.insertText.length&&(pe=this.editor.getModel().getValueInRange({startLineNumber:le.lineNumber,startColumn:ue,endLineNumber:le.lineNumber,endColumn:ce})!==ee.completion.insertText),Y.set(pe),j.set(!r.Position.equals(ee.editInsertEnd,ee.editReplaceEnd)),Z.set(!!ee.provider.resolveCompletionItem||!!ee.completion.documentation||ee.completion.detail!==ee.completion.label)})),this._toDispose.add(z.onDetailsKeyDown(ee=>{if(ee.toKeyCodeChord().equals(new p.KeyCodeChord(!0,!1,!1,!1,33))||v.isMacintosh&&ee.toKeyCodeChord().equals(new p.KeyCodeChord(!1,!1,!1,!0,33))){ee.stopPropagation();return}ee.toKeyCodeChord().isModifierKey()||this.editor.focus()})),z})),this._overtypingCapturer=this._toDispose.add(new x.WindowIdleValue((0,x.getWindow)($.getDomNode()),()=>this._toDispose.add(new A.OvertypingCapturer(this.editor,this.model)))),this._alternatives=this._toDispose.add(new x.WindowIdleValue((0,x.getWindow)($.getDomNode()),()=>this._toDispose.add(new D.SuggestAlternatives(this.editor,this._contextKeyService)))),this._toDispose.add(de.createInstance(l.WordContextKey,$)),this._toDispose.add(this.model.onDidTrigger(z=>{this.widget.value.showTriggered(z.auto,z.shy?250:50),this._lineSuffix.value=new V(this.editor.getModel(),z.position)})),this._toDispose.add(this.model.onDidSuggest(z=>{if(z.triggerOptions.shy)return;let H=-1;for(const j of this._selectors.itemsOrderedByPriorityDesc)if(H=j.select(this.editor.getModel(),this.editor.getPosition(),z.completionModel.items),H!==-1)break;if(H===-1&&(H=0),this.model.state===0)return;let Y=!1;if(z.triggerOptions.auto){const j=this.editor.getOption(117);j.selectionMode==="never"||j.selectionMode==="always"?Y=j.selectionMode==="never":j.selectionMode==="whenTriggerCharacter"?Y=z.triggerOptions.triggerKind!==1:j.selectionMode==="whenQuickSuggestion"&&(Y=z.triggerOptions.triggerKind===1&&!z.triggerOptions.refilter)}this.widget.value.showSuggestions(z.completionModel,H,z.isFrozen,z.triggerOptions.auto,Y)})),this._toDispose.add(this.model.onDidCancel(z=>{z.retrigger||this.widget.value.hideWidget()})),this._toDispose.add(this.editor.onDidBlurEditorWidget(()=>{W||(this.model.cancel(),this.model.clear())}));const U=w.Context.AcceptSuggestionsOnEnter.bindTo(re),G=()=>{const z=this.editor.getOption(1);U.set(z==="on"||z==="smart")};this._toDispose.add(this.editor.onDidChangeConfiguration(()=>G())),G()}dispose(){this._alternatives.dispose(),this._toDispose.dispose(),this.widget.dispose(),this.model.dispose(),this._lineSuffix.dispose(),this._onWillInsertSuggestItem.dispose()}_insertSuggestion($,J){if(!$||!$.item){this._alternatives.value.reset(),this.model.cancel(),this.model.clear();return}if(!this.editor.hasModel())return;const Q=c.SnippetController2.get(this.editor);if(!Q)return;this._onWillInsertSuggestItem.fire({item:$.item});const re=this.editor.getModel(),de=re.getAlternativeVersionId(),{item:he}=$,me=[],X=new y.CancellationTokenSource;J&1||this.editor.pushUndoStop();const U=this.getOverwriteInfo(he,!!(J&8));this._memoryService.memorize(re,this.editor.getPosition(),he);const G=he.isResolved;let z=-1,H=-1;if(Array.isArray(he.completion.additionalTextEdits)){this.model.cancel();const j=i.StableEditorScrollState.capture(this.editor);this.editor.executeEdits("suggestController.additionalTextEdits.sync",he.completion.additionalTextEdits.map(Z=>{let ee=u.Range.lift(Z.range);if(ee.startLineNumber===he.position.lineNumber&&ee.startColumn>he.position.column){const le=this.editor.getPosition().column-he.position.column,ue=le,ce=u.Range.spansMultipleLines(ee)?0:le;ee=new u.Range(ee.startLineNumber,ee.startColumn+ue,ee.endLineNumber,ee.endColumn+ce)}return t.EditOperation.replaceMove(ee,Z.text)})),j.restoreRelativeVerticalPositionOfCursor(this.editor)}else if(!G){const j=new b.StopWatch;let Z;const ee=re.onDidChangeContent(pe=>{if(pe.isFlush){X.cancel(),ee.dispose();return}for(const ve of pe.changes){const Ce=u.Range.getEndPosition(ve.range);(!Z||r.Position.isBefore(Ce,Z))&&(Z=Ce)}}),le=J;J|=2;let ue=!1;const ce=this.editor.onWillType(()=>{ce.dispose(),ue=!0,le&2||this.editor.pushUndoStop()});me.push(he.resolve(X.token).then(()=>{if(!he.completion.additionalTextEdits||X.token.isCancellationRequested)return;if(Z&&he.completion.additionalTextEdits.some(ve=>r.Position.isBefore(Z,u.Range.getStartPosition(ve.range))))return!1;ue&&this.editor.pushUndoStop();const pe=i.StableEditorScrollState.capture(this.editor);return this.editor.executeEdits("suggestController.additionalTextEdits.async",he.completion.additionalTextEdits.map(ve=>t.EditOperation.replaceMove(u.Range.lift(ve.range),ve.text))),pe.restoreRelativeVerticalPositionOfCursor(this.editor),(ue||!(le&2))&&this.editor.pushUndoStop(),!0}).then(pe=>{this._logService.trace("[suggest] async resolving of edits DONE (ms, applied?)",j.elapsed(),pe),H=pe===!0?1:pe===!1?0:-2}).finally(()=>{ee.dispose(),ce.dispose()}))}let{insertText:Y}=he.completion;if(he.completion.insertTextRules&4||(Y=d.SnippetParser.escape(Y)),this.model.cancel(),Q.insert(Y,{overwriteBefore:U.overwriteBefore,overwriteAfter:U.overwriteAfter,undoStopBefore:!1,undoStopAfter:!1,adjustWhitespace:!(he.completion.insertTextRules&1),clipboardText:$.model.clipboardText,overtypingCapturer:this._overtypingCapturer.value}),J&2||this.editor.pushUndoStop(),he.completion.command)if(he.completion.command.id===q.id)this.model.trigger({auto:!0,retrigger:!0});else{const j=new b.StopWatch;me.push(this._commandService.executeCommand(he.completion.command.id,...he.completion.command.arguments?[...he.completion.command.arguments]:[]).catch(Z=>{he.completion.extensionId?(0,E.onUnexpectedExternalError)(Z):(0,E.onUnexpectedError)(Z)}).finally(()=>{z=j.elapsed()}))}J&4&&this._alternatives.value.set($,j=>{for(X.cancel();re.canUndo();){de!==re.getAlternativeVersionId()&&re.undo(),this._insertSuggestion(j,3|(J&8?8:0));break}}),this._alertCompletionItem(he),Promise.all(me).finally(()=>{this._reportSuggestionAcceptedTelemetry(he,re,G,z,H),this.model.clear(),X.dispose()})}_reportSuggestionAcceptedTelemetry($,J,Q,re,de){var he,me,X;Math.floor(Math.random()*100)!==0&&this._telemetryService.publicLog2("suggest.acceptedSuggestion",{extensionId:(me=(he=$.extensionId)===null||he===void 0?void 0:he.value)!==null&&me!==void 0?me:"unknown",providerId:(X=$.provider._debugDisplayName)!==null&&X!==void 0?X:"unknown",kind:$.completion.kind,basenameHash:(0,R.hash)((0,M.basename)(J.uri)).toString(16),languageId:J.getLanguageId(),fileExtension:(0,M.extname)(J.uri),resolveInfo:$.provider.resolveCompletionItem?Q?1:0:-1,resolveDuration:$.resolveDuration,commandDuration:re,additionalEditsAsync:de})}getOverwriteInfo($,J){(0,a.assertType)(this.editor.hasModel());let Q=this.editor.getOption(117).insertMode==="replace";J&&(Q=!Q);const re=$.position.column-$.editStart.column,de=(Q?$.editReplaceEnd.column:$.editInsertEnd.column)-$.position.column,he=this.editor.getPosition().column-$.position.column,me=this._lineSuffix.value?this._lineSuffix.value.delta(this.editor.getPosition()):0;return{overwriteBefore:re+he,overwriteAfter:de+me}}_alertCompletionItem($){if((0,k.isNonEmptyArray)($.completion.additionalTextEdits)){const J=o.localize(0,null,$.textLabel,$.completion.additionalTextEdits.length);(0,L.alert)(J)}}triggerSuggest($,J,Q){this.editor.hasModel()&&(this.model.trigger({auto:J??!1,completionOptions:{providerFilter:$,kindFilter:Q?new Set:void 0}}),this.editor.revealPosition(this.editor.getPosition(),0),this.editor.focus())}triggerSuggestAndAcceptBest($){if(!this.editor.hasModel())return;const J=this.editor.getPosition(),Q=()=>{J.equals(this.editor.getPosition())&&this._commandService.executeCommand($.fallback)},re=de=>{if(de.completion.insertTextRules&4||de.completion.additionalTextEdits)return!0;const he=this.editor.getPosition(),me=de.editStart.column,X=he.column;return X-me!==de.completion.insertText.length?!0:this.editor.getModel().getValueInRange({startLineNumber:he.lineNumber,startColumn:me,endLineNumber:he.lineNumber,endColumn:X})!==de.completion.insertText};S.Event.once(this.model.onDidTrigger)(de=>{const he=[];S.Event.any(this.model.onDidTrigger,this.model.onDidCancel)(()=>{(0,_.dispose)(he),Q()},void 0,he),this.model.onDidSuggest(({completionModel:me})=>{if((0,_.dispose)(he),me.items.length===0){Q();return}const X=this._memoryService.select(this.editor.getModel(),this.editor.getPosition(),me.items),U=me.items[X];if(!re(U)){Q();return}this.editor.pushUndoStop(),this._insertSuggestion({index:X,item:U,model:me},7)},void 0,he)}),this.model.trigger({auto:!1,shy:!0}),this.editor.revealPosition(J,0),this.editor.focus()}acceptSelectedSuggestion($,J){const Q=this.widget.value.getFocusedItem();let re=0;$&&(re|=4),J&&(re|=8),this._insertSuggestion(Q,re)}acceptNextSuggestion(){this._alternatives.value.next()}acceptPrevSuggestion(){this._alternatives.value.prev()}cancelSuggestWidget(){this.model.cancel(),this.model.clear(),this.widget.value.hideWidget()}focusSuggestion(){this.widget.value.focusSelected()}selectNextSuggestion(){this.widget.value.selectNext()}selectNextPageSuggestion(){this.widget.value.selectNextPage()}selectLastSuggestion(){this.widget.value.selectLast()}selectPrevSuggestion(){this.widget.value.selectPrevious()}selectPrevPageSuggestion(){this.widget.value.selectPreviousPage()}selectFirstSuggestion(){this.widget.value.selectFirst()}toggleSuggestionDetails(){this.widget.value.toggleDetails()}toggleExplainMode(){this.widget.value.toggleExplainMode()}toggleSuggestionFocus(){this.widget.value.toggleDetailsFocus()}resetWidgetSize(){this.widget.value.resetPersistedSize()}forceRenderingAbove(){this.widget.value.forceRenderingAbove()}stopForceRenderingAbove(){this.widget.isInitialized&&this.widget.value.stopForceRenderingAbove()}registerSelector($){return this._selectors.register($)}};e.SuggestController=K,K.ID="editor.contrib.suggestController",e.SuggestController=K=B=ke([ge(1,s.ISuggestMemoryService),ge(2,g.ICommandService),ge(3,h.IContextKeyService),ge(4,m.IInstantiationService),ge(5,C.ILogService),ge(6,N.ITelemetryService)],K);class F{constructor($){this.prioritySelector=$,this._items=new Array}register($){if(this._items.indexOf($)!==-1)throw new Error("Value is already registered");return this._items.push($),this._items.sort((J,Q)=>this.prioritySelector(Q)-this.prioritySelector(J)),{dispose:()=>{const J=this._items.indexOf($);J>=0&&this._items.splice(J,1)}}}get itemsOrderedByPriorityDesc(){return this._items}}class q extends n.EditorAction{constructor(){super({id:q.id,label:o.localize(1,null),alias:"Trigger Suggest",precondition:h.ContextKeyExpr.and(f.EditorContextKeys.writable,f.EditorContextKeys.hasCompletionItemProvider,w.Context.Visible.toNegated()),kbOpts:{kbExpr:f.EditorContextKeys.textInputFocus,primary:2058,secondary:[2087],mac:{primary:266,secondary:[521,2087]},weight:100}})}run($,J,Q){const re=K.get(J);if(!re)return;let de;Q&&typeof Q=="object"&&Q.auto===!0&&(de=!0),re.triggerSuggest(void 0,de,void 0)}}e.TriggerSuggestAction=q,q.id="editor.action.triggerSuggest",(0,n.registerEditorContribution)(K.ID,K,2),(0,n.registerEditorAction)(q);const ie=100+90,ae=n.EditorCommand.bindToContribution(K.get);(0,n.registerEditorCommand)(new ae({id:"acceptSelectedSuggestion",precondition:h.ContextKeyExpr.and(w.Context.Visible,w.Context.HasFocusedSuggestion),handler(ne){ne.acceptSelectedSuggestion(!0,!1)},kbOpts:[{primary:2,kbExpr:h.ContextKeyExpr.and(w.Context.Visible,f.EditorContextKeys.textInputFocus),weight:ie},{primary:3,kbExpr:h.ContextKeyExpr.and(w.Context.Visible,f.EditorContextKeys.textInputFocus,w.Context.AcceptSuggestionsOnEnter,w.Context.MakesTextEdit),weight:ie}],menuOpts:[{menuId:w.suggestWidgetStatusbarMenu,title:o.localize(2,null),group:"left",order:1,when:w.Context.HasInsertAndReplaceRange.toNegated()},{menuId:w.suggestWidgetStatusbarMenu,title:o.localize(3,null),group:"left",order:1,when:h.ContextKeyExpr.and(w.Context.HasInsertAndReplaceRange,w.Context.InsertMode.isEqualTo("insert"))},{menuId:w.suggestWidgetStatusbarMenu,title:o.localize(4,null),group:"left",order:1,when:h.ContextKeyExpr.and(w.Context.HasInsertAndReplaceRange,w.Context.InsertMode.isEqualTo("replace"))}]})),(0,n.registerEditorCommand)(new ae({id:"acceptAlternativeSelectedSuggestion",precondition:h.ContextKeyExpr.and(w.Context.Visible,f.EditorContextKeys.textInputFocus,w.Context.HasFocusedSuggestion),kbOpts:{weight:ie,kbExpr:f.EditorContextKeys.textInputFocus,primary:1027,secondary:[1026]},handler(ne){ne.acceptSelectedSuggestion(!1,!0)},menuOpts:[{menuId:w.suggestWidgetStatusbarMenu,group:"left",order:2,when:h.ContextKeyExpr.and(w.Context.HasInsertAndReplaceRange,w.Context.InsertMode.isEqualTo("insert")),title:o.localize(5,null)},{menuId:w.suggestWidgetStatusbarMenu,group:"left",order:2,when:h.ContextKeyExpr.and(w.Context.HasInsertAndReplaceRange,w.Context.InsertMode.isEqualTo("replace")),title:o.localize(6,null)}]})),g.CommandsRegistry.registerCommandAlias("acceptSelectedSuggestionOnEnter","acceptSelectedSuggestion"),(0,n.registerEditorCommand)(new ae({id:"hideSuggestWidget",precondition:w.Context.Visible,handler:ne=>ne.cancelSuggestWidget(),kbOpts:{weight:ie,kbExpr:f.EditorContextKeys.textInputFocus,primary:9,secondary:[1033]}})),(0,n.registerEditorCommand)(new ae({id:"selectNextSuggestion",precondition:h.ContextKeyExpr.and(w.Context.Visible,h.ContextKeyExpr.or(w.Context.MultipleSuggestions,w.Context.HasFocusedSuggestion.negate())),handler:ne=>ne.selectNextSuggestion(),kbOpts:{weight:ie,kbExpr:f.EditorContextKeys.textInputFocus,primary:18,secondary:[2066],mac:{primary:18,secondary:[2066,300]}}})),(0,n.registerEditorCommand)(new ae({id:"selectNextPageSuggestion",precondition:h.ContextKeyExpr.and(w.Context.Visible,h.ContextKeyExpr.or(w.Context.MultipleSuggestions,w.Context.HasFocusedSuggestion.negate())),handler:ne=>ne.selectNextPageSuggestion(),kbOpts:{weight:ie,kbExpr:f.EditorContextKeys.textInputFocus,primary:12,secondary:[2060]}})),(0,n.registerEditorCommand)(new ae({id:"selectLastSuggestion",precondition:h.ContextKeyExpr.and(w.Context.Visible,h.ContextKeyExpr.or(w.Context.MultipleSuggestions,w.Context.HasFocusedSuggestion.negate())),handler:ne=>ne.selectLastSuggestion()})),(0,n.registerEditorCommand)(new ae({id:"selectPrevSuggestion",precondition:h.ContextKeyExpr.and(w.Context.Visible,h.ContextKeyExpr.or(w.Context.MultipleSuggestions,w.Context.HasFocusedSuggestion.negate())),handler:ne=>ne.selectPrevSuggestion(),kbOpts:{weight:ie,kbExpr:f.EditorContextKeys.textInputFocus,primary:16,secondary:[2064],mac:{primary:16,secondary:[2064,302]}}})),(0,n.registerEditorCommand)(new ae({id:"selectPrevPageSuggestion",precondition:h.ContextKeyExpr.and(w.Context.Visible,h.ContextKeyExpr.or(w.Context.MultipleSuggestions,w.Context.HasFocusedSuggestion.negate())),handler:ne=>ne.selectPrevPageSuggestion(),kbOpts:{weight:ie,kbExpr:f.EditorContextKeys.textInputFocus,primary:11,secondary:[2059]}})),(0,n.registerEditorCommand)(new ae({id:"selectFirstSuggestion",precondition:h.ContextKeyExpr.and(w.Context.Visible,h.ContextKeyExpr.or(w.Context.MultipleSuggestions,w.Context.HasFocusedSuggestion.negate())),handler:ne=>ne.selectFirstSuggestion()})),(0,n.registerEditorCommand)(new ae({id:"focusSuggestion",precondition:h.ContextKeyExpr.and(w.Context.Visible,w.Context.HasFocusedSuggestion.negate()),handler:ne=>ne.focusSuggestion(),kbOpts:{weight:ie,kbExpr:f.EditorContextKeys.textInputFocus,primary:2058,secondary:[2087],mac:{primary:266,secondary:[2087]}}})),(0,n.registerEditorCommand)(new ae({id:"focusAndAcceptSuggestion",precondition:h.ContextKeyExpr.and(w.Context.Visible,w.Context.HasFocusedSuggestion.negate()),handler:ne=>{ne.focusSuggestion(),ne.acceptSelectedSuggestion(!0,!1)}})),(0,n.registerEditorCommand)(new ae({id:"toggleSuggestionDetails",precondition:h.ContextKeyExpr.and(w.Context.Visible,w.Context.HasFocusedSuggestion),handler:ne=>ne.toggleSuggestionDetails(),kbOpts:{weight:ie,kbExpr:f.EditorContextKeys.textInputFocus,primary:2058,secondary:[2087],mac:{primary:266,secondary:[2087]}},menuOpts:[{menuId:w.suggestWidgetStatusbarMenu,group:"right",order:1,when:h.ContextKeyExpr.and(w.Context.DetailsVisible,w.Context.CanResolve),title:o.localize(7,null)},{menuId:w.suggestWidgetStatusbarMenu,group:"right",order:1,when:h.ContextKeyExpr.and(w.Context.DetailsVisible.toNegated(),w.Context.CanResolve),title:o.localize(8,null)}]})),(0,n.registerEditorCommand)(new ae({id:"toggleExplainMode",precondition:w.Context.Visible,handler:ne=>ne.toggleExplainMode(),kbOpts:{weight:100,primary:2138}})),(0,n.registerEditorCommand)(new ae({id:"toggleSuggestionFocus",precondition:w.Context.Visible,handler:ne=>ne.toggleSuggestionFocus(),kbOpts:{weight:ie,kbExpr:f.EditorContextKeys.textInputFocus,primary:2570,mac:{primary:778}}})),(0,n.registerEditorCommand)(new ae({id:"insertBestCompletion",precondition:h.ContextKeyExpr.and(f.EditorContextKeys.textInputFocus,h.ContextKeyExpr.equals("config.editor.tabCompletion","on"),l.WordContextKey.AtEnd,w.Context.Visible.toNegated(),D.SuggestAlternatives.OtherSuggestions.toNegated(),c.SnippetController2.InSnippetMode.toNegated()),handler:(ne,$)=>{ne.triggerSuggestAndAcceptBest((0,a.isObject)($)?{fallback:"tab",...$}:{fallback:"tab"})},kbOpts:{weight:ie,primary:2}})),(0,n.registerEditorCommand)(new ae({id:"insertNextSuggestion",precondition:h.ContextKeyExpr.and(f.EditorContextKeys.textInputFocus,h.ContextKeyExpr.equals("config.editor.tabCompletion","on"),D.SuggestAlternatives.OtherSuggestions,w.Context.Visible.toNegated(),c.SnippetController2.InSnippetMode.toNegated()),handler:ne=>ne.acceptNextSuggestion(),kbOpts:{weight:ie,kbExpr:f.EditorContextKeys.textInputFocus,primary:2}})),(0,n.registerEditorCommand)(new ae({id:"insertPrevSuggestion",precondition:h.ContextKeyExpr.and(f.EditorContextKeys.textInputFocus,h.ContextKeyExpr.equals("config.editor.tabCompletion","on"),D.SuggestAlternatives.OtherSuggestions,w.Context.Visible.toNegated(),c.SnippetController2.InSnippetMode.toNegated()),handler:ne=>ne.acceptPrevSuggestion(),kbOpts:{weight:ie,kbExpr:f.EditorContextKeys.textInputFocus,primary:1026}})),(0,n.registerEditorAction)(class extends n.EditorAction{constructor(){super({id:"editor.action.resetSuggestSize",label:o.localize(9,null),alias:"Reset Suggest Widget Size",precondition:void 0})}run(ne,$){var J;(J=K.get($))===null||J===void 0||J.resetWidgetSize()}})}),define(se[928],oe([1,0,6,2,10,5,31,117,390,392,35,307,13,60]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestItemInfo=e.SuggestWidgetAdaptor=void 0;class t extends k.Disposable{get selectedItem(){return this._selectedItem}constructor(c,d,s,l){super(),this.editor=c,this.suggestControllerPreselector=d,this.checkModelVersion=s,this.onWillAccept=l,this.isSuggestWidgetVisible=!1,this.isShiftKeyPressed=!1,this._isActive=!1,this._currentSuggestItemInfo=void 0,this._selectedItem=(0,b.observableValue)(this,void 0),this._register(c.onKeyDown(g=>{g.shiftKey&&!this.isShiftKeyPressed&&(this.isShiftKeyPressed=!0,this.update(this._isActive))})),this._register(c.onKeyUp(g=>{g.shiftKey&&this.isShiftKeyPressed&&(this.isShiftKeyPressed=!1,this.update(this._isActive))}));const o=v.SuggestController.get(this.editor);if(o){this._register(o.registerSelector({priority:100,select:(m,C,w)=>{var D;(0,b.transaction)(M=>this.checkModelVersion(M));const I=this.editor.getModel();if(!I)return-1;const T=(D=this.suggestControllerPreselector())===null||D===void 0?void 0:D.removeCommonPrefix(I);if(!T)return-1;const A=y.Position.lift(C),P=w.map((M,R)=>{const O=r.fromSuggestion(o,I,A,M,this.isShiftKeyPressed).toSingleTextEdit().removeCommonPrefix(I),B=T.augments(O);return{index:R,valid:B,prefixLength:O.text.length,suggestItem:M}}).filter(M=>M&&M.valid&&M.prefixLength>0),N=(0,n.findFirstMaxBy)(P,(0,i.compareBy)(M=>M.prefixLength,i.numberComparator));return N?N.index:-1}}));let g=!1;const h=()=>{g||(g=!0,this._register(o.widget.value.onDidShow(()=>{this.isSuggestWidgetVisible=!0,this.update(!0)})),this._register(o.widget.value.onDidHide(()=>{this.isSuggestWidgetVisible=!1,this.update(!1)})),this._register(o.widget.value.onDidFocus(()=>{this.isSuggestWidgetVisible=!0,this.update(!0)})))};this._register(L.Event.once(o.model.onDidTrigger)(m=>{h()})),this._register(o.onWillInsertSuggestItem(m=>{const C=this.editor.getPosition(),w=this.editor.getModel();if(!C||!w)return;const D=r.fromSuggestion(o,w,C,m.item,this.isShiftKeyPressed);this.onWillAccept(D)}))}this.update(this._isActive)}update(c){const d=this.getSuggestItemInfo();(this._isActive!==c||!u(this._currentSuggestItemInfo,d))&&(this._isActive=c,this._currentSuggestItemInfo=d,(0,b.transaction)(s=>{this.checkModelVersion(s),this._selectedItem.set(this._isActive?this._currentSuggestItemInfo:void 0,s)}))}getSuggestItemInfo(){const c=v.SuggestController.get(this.editor);if(!c||!this.isSuggestWidgetVisible)return;const d=c.widget.value.getFocusedItem(),s=this.editor.getPosition(),l=this.editor.getModel();if(!(!d||!s||!l))return r.fromSuggestion(c,l,s,d.item,this.isShiftKeyPressed)}stopForceRenderingAbove(){const c=v.SuggestController.get(this.editor);c?.stopForceRenderingAbove()}forceRenderingAbove(){const c=v.SuggestController.get(this.editor);c?.forceRenderingAbove()}}e.SuggestWidgetAdaptor=t;class r{static fromSuggestion(c,d,s,l,o){let{insertText:g}=l.completion,h=!1;if(l.completion.insertTextRules&4){const C=new p.SnippetParser().parse(g);C.children.length<100&&_.SnippetSession.adjustWhitespace(d,s,!0,C),g=C.toString(),h=!0}const m=c.getOverwriteInfo(l,o);return new r(E.Range.fromPositions(s.delta(0,-m.overwriteBefore),s.delta(0,Math.max(m.overwriteAfter,0))),g,l.completion.kind,h)}constructor(c,d,s,l){this.range=c,this.insertText=d,this.completionItemKind=s,this.isSnippetText=l}equals(c){return this.range.equalsRange(c.range)&&this.insertText===c.insertText&&this.completionItemKind===c.completionItemKind&&this.isSnippetText===c.isSnippetText}toSelectedSuggestionInfo(){return new S.SelectedSuggestionInfo(this.range,this.insertText,this.completionItemKind,this.isSnippetText)}toSingleTextEdit(){return new a.SingleTextEdit(this.range,this.insertText)}}e.SuggestItemInfo=r;function u(f,c){return f===c?!0:!f||!c?!1:f.equals(c)}}),define(se[264],oe([1,0,7,48,2,35,191,10,79,18,216,765,240,257,927,928,696,122,25,27,15,8,34]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o){"use strict";var g;Object.defineProperty(e,"__esModule",{value:!0}),e.InlineCompletionsController=void 0;let h=g=class extends y.Disposable{static get(C){return C.getContribution(g.ID)}constructor(C,w,D,I,T,A,P,N,M){super(),this.editor=C,this._instantiationService=w,this._contextKeyService=D,this._configurationService=I,this._commandService=T,this._debounceService=A,this._languageFeaturesService=P,this._audioCueService=N,this._keybindingService=M,this.model=(0,E.disposableObservableValue)("inlineCompletionModel",void 0),this._textModelVersionId=(0,E.observableValue)(this,-1),this._cursorPosition=(0,E.observableValue)(this,new p.Position(1,1)),this._suggestWidgetAdaptor=this._register(new r.SuggestWidgetAdaptor(this.editor,()=>{var B,W;return(W=(B=this.model.get())===null||B===void 0?void 0:B.selectedInlineCompletion.get())===null||W===void 0?void 0:W.toSingleTextEdit(void 0)},B=>this.updateObservables(B,t.VersionIdChangeReason.Other),B=>{(0,E.transaction)(W=>{var V;this.updateObservables(W,t.VersionIdChangeReason.Other),(V=this.model.get())===null||V===void 0||V.handleSuggestAccepted(B)})})),this._enabled=(0,E.observableFromEvent)(this.editor.onDidChangeConfiguration,()=>this.editor.getOption(62).enabled),this._fontFamily=(0,E.observableFromEvent)(this.editor.onDidChangeConfiguration,()=>this.editor.getOption(62).fontFamily),this._ghostTextWidget=this._register(this._instantiationService.createInstance(a.GhostTextWidget,this.editor,{ghostText:this.model.map((B,W)=>B?.ghostText.read(W)),minReservedLineCount:(0,E.constObservable)(0),targetTextModel:this.model.map(B=>B?.textModel)})),this._debounceValue=this._debounceService.for(this._languageFeaturesService.inlineCompletionsProvider,"InlineCompletionsDebounce",{min:50,max:50}),this._playAudioCueSignal=(0,E.observableSignal)(this),this._isReadonly=(0,E.observableFromEvent)(this.editor.onDidChangeConfiguration,()=>this.editor.getOption(90)),this._textModel=(0,E.observableFromEvent)(this.editor.onDidChangeModel,()=>this.editor.getModel()),this._textModelIfWritable=(0,E.derived)(B=>this._isReadonly.read(B)?void 0:this._textModel.read(B)),this._register(new i.InlineCompletionContextKeys(this._contextKeyService,this.model)),this._register((0,E.autorun)(B=>{const W=this._textModelIfWritable.read(B);(0,E.transaction)(V=>{if(this.model.set(void 0,V),this.updateObservables(V,t.VersionIdChangeReason.Other),W){const K=w.createInstance(t.InlineCompletionsModel,W,this._suggestWidgetAdaptor.selectedItem,this._cursorPosition,this._textModelVersionId,this._debounceValue,(0,E.observableFromEvent)(C.onDidChangeConfiguration,()=>C.getOption(117).preview),(0,E.observableFromEvent)(C.onDidChangeConfiguration,()=>C.getOption(117).previewMode),(0,E.observableFromEvent)(C.onDidChangeConfiguration,()=>C.getOption(62).mode),this._enabled);this.model.set(K,V)}})}));const R=this._register((0,L.createStyleSheet2)());this._register((0,E.autorun)(B=>{const W=this._fontFamily.read(B);R.setStyle(W===""||W==="default"?"":`
+.monaco-editor .ghost-text-decoration,
+.monaco-editor .ghost-text-decoration-preview,
+.monaco-editor .ghost-text {
+	font-family: ${W};
+}`)}));const x=B=>{var W;return B.isUndoing?t.VersionIdChangeReason.Undo:B.isRedoing?t.VersionIdChangeReason.Redo:!((W=this.model.get())===null||W===void 0)&&W.isAcceptingPartially?t.VersionIdChangeReason.AcceptWord:t.VersionIdChangeReason.Other};this._register(C.onDidChangeModelContent(B=>(0,E.transaction)(W=>this.updateObservables(W,x(B))))),this._register(C.onDidChangeCursorPosition(B=>(0,E.transaction)(W=>{var V;this.updateObservables(W,t.VersionIdChangeReason.Other),(B.reason===3||B.source==="api")&&((V=this.model.get())===null||V===void 0||V.stop(W))}))),this._register(C.onDidType(()=>(0,E.transaction)(B=>{var W;this.updateObservables(B,t.VersionIdChangeReason.Other),this._enabled.get()&&((W=this.model.get())===null||W===void 0||W.trigger(B))}))),this._register(this._commandService.onDidExecuteCommand(B=>{new Set([S.CoreEditingCommands.Tab.id,S.CoreEditingCommands.DeleteLeft.id,S.CoreEditingCommands.DeleteRight.id,b.inlineSuggestCommitId,"acceptSelectedSuggestion"]).has(B.commandId)&&C.hasTextFocus()&&this._enabled.get()&&(0,E.transaction)(V=>{var K;(K=this.model.get())===null||K===void 0||K.trigger(V)})})),this._register(this.editor.onDidBlurEditorWidget(()=>{this._contextKeyService.getContextKeyValue("accessibleViewIsShown")||this._configurationService.getValue("editor.inlineSuggest.keepOnBlur")||C.getOption(62).keepOnBlur||n.InlineSuggestionHintsContentWidget.dropDownVisible||(0,E.transaction)(B=>{var W;(W=this.model.get())===null||W===void 0||W.stop(B)})})),this._register((0,E.autorun)(B=>{var W;const V=(W=this.model.read(B))===null||W===void 0?void 0:W.state.read(B);V?.suggestItem?V.ghostText.lineCount>=2&&this._suggestWidgetAdaptor.forceRenderingAbove():this._suggestWidgetAdaptor.stopForceRenderingAbove()})),this._register((0,y.toDisposable)(()=>{this._suggestWidgetAdaptor.stopForceRenderingAbove()}));let O;this._register((0,E.autorunHandleChanges)({handleChange:(B,W)=>(B.didChange(this._playAudioCueSignal)&&(O=void 0),!0)},async B=>{this._playAudioCueSignal.read(B);const W=this.model.read(B),V=W?.state.read(B);if(!W||!V||!V.inlineCompletion){O=void 0;return}if(V.inlineCompletion.semanticId!==O){O=V.inlineCompletion.semanticId;const K=W.textModel.getLineContent(V.ghostText.lineNumber);this._audioCueService.playAudioCue(f.AudioCue.inlineSuggestion).then(()=>{this.editor.getOption(8)&&this.provideScreenReaderUpdate(V.ghostText.renderForScreenReader(K))})}})),this._register(new n.InlineCompletionsHintsWidget(this.editor,this.model,this._instantiationService)),this._register(this._configurationService.onDidChangeConfiguration(B=>{B.affectsConfiguration("accessibility.verbosity.inlineCompletions")&&this.editor.updateOptions({inlineCompletionsAccessibilityVerbose:this._configurationService.getValue("accessibility.verbosity.inlineCompletions")})})),this.editor.updateOptions({inlineCompletionsAccessibilityVerbose:this._configurationService.getValue("accessibility.verbosity.inlineCompletions")})}playAudioCue(C){this._playAudioCueSignal.trigger(C)}provideScreenReaderUpdate(C){const w=this._contextKeyService.getContextKeyValue("accessibleViewIsShown"),D=this._keybindingService.lookupKeybinding("editor.action.accessibleView");let I;!w&&D&&this.editor.getOption(147)&&(I=(0,u.localize)(0,null,D.getAriaLabel())),I?(0,k.alert)(C+", "+I):(0,k.alert)(C)}updateObservables(C,w){var D,I;const T=this.editor.getModel();this._textModelVersionId.set((D=T?.getVersionId())!==null&&D!==void 0?D:-1,C,w),this._cursorPosition.set((I=this.editor.getPosition())!==null&&I!==void 0?I:new p.Position(1,1),C)}shouldShowHoverAt(C){var w;const D=(w=this.model.get())===null||w===void 0?void 0:w.ghostText.get();return D?D.parts.some(I=>C.containsPosition(new p.Position(D.lineNumber,I.column))):!1}shouldShowHoverAtViewZone(C){return this._ghostTextWidget.ownsViewZone(C)}};e.InlineCompletionsController=h,h.ID="editor.contrib.inlineCompletionsController",e.InlineCompletionsController=h=g=ke([ge(1,l.IInstantiationService),ge(2,s.IContextKeyService),ge(3,d.IConfigurationService),ge(4,c.ICommandService),ge(5,_.ILanguageFeatureDebounceService),ge(6,v.ILanguageFeaturesService),ge(7,f.IAudioCueService),ge(8,o.IKeybindingService)],h)}),define(se[929],oe([1,0,35,110,16,21,216,240,264,138,693,30,27,15]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ToggleAlwaysShowInlineSuggestionToolbar=e.HideInlineCompletion=e.AcceptInlineCompletion=e.AcceptNextLineOfInlineCompletion=e.AcceptNextWordOfInlineCompletion=e.TriggerInlineSuggestionAction=e.ShowPreviousInlineSuggestionAction=e.ShowNextInlineSuggestionAction=void 0;class t extends y.EditorAction{constructor(){super({id:t.ID,label:b.localize(0,null),alias:"Show Next Inline Suggestion",precondition:n.ContextKeyExpr.and(E.EditorContextKeys.writable,p.InlineCompletionContextKeys.inlineSuggestionVisible),kbOpts:{weight:100,primary:606}})}async run(g,h){var m;const C=_.InlineCompletionsController.get(h);(m=C?.model.get())===null||m===void 0||m.next()}}e.ShowNextInlineSuggestionAction=t,t.ID=S.showNextInlineSuggestionActionId;class r extends y.EditorAction{constructor(){super({id:r.ID,label:b.localize(1,null),alias:"Show Previous Inline Suggestion",precondition:n.ContextKeyExpr.and(E.EditorContextKeys.writable,p.InlineCompletionContextKeys.inlineSuggestionVisible),kbOpts:{weight:100,primary:604}})}async run(g,h){var m;const C=_.InlineCompletionsController.get(h);(m=C?.model.get())===null||m===void 0||m.previous()}}e.ShowPreviousInlineSuggestionAction=r,r.ID=S.showPreviousInlineSuggestionActionId;class u extends y.EditorAction{constructor(){super({id:"editor.action.inlineSuggest.trigger",label:b.localize(2,null),alias:"Trigger Inline Suggestion",precondition:E.EditorContextKeys.writable})}async run(g,h){const m=_.InlineCompletionsController.get(h);await(0,k.asyncTransaction)(async C=>{var w;await((w=m?.model.get())===null||w===void 0?void 0:w.triggerExplicitly(C)),m?.playAudioCue(C)})}}e.TriggerInlineSuggestionAction=u;class f extends y.EditorAction{constructor(){super({id:"editor.action.inlineSuggest.acceptNextWord",label:b.localize(3,null),alias:"Accept Next Word Of Inline Suggestion",precondition:n.ContextKeyExpr.and(E.EditorContextKeys.writable,p.InlineCompletionContextKeys.inlineSuggestionVisible),kbOpts:{weight:100+1,primary:2065,kbExpr:n.ContextKeyExpr.and(E.EditorContextKeys.writable,p.InlineCompletionContextKeys.inlineSuggestionVisible)},menuOpts:[{menuId:a.MenuId.InlineSuggestionToolbar,title:b.localize(4,null),group:"primary",order:2}]})}async run(g,h){var m;const C=_.InlineCompletionsController.get(h);await((m=C?.model.get())===null||m===void 0?void 0:m.acceptNextWord(C.editor))}}e.AcceptNextWordOfInlineCompletion=f;class c extends y.EditorAction{constructor(){super({id:"editor.action.inlineSuggest.acceptNextLine",label:b.localize(5,null),alias:"Accept Next Line Of Inline Suggestion",precondition:n.ContextKeyExpr.and(E.EditorContextKeys.writable,p.InlineCompletionContextKeys.inlineSuggestionVisible),kbOpts:{weight:100+1},menuOpts:[{menuId:a.MenuId.InlineSuggestionToolbar,title:b.localize(6,null),group:"secondary",order:2}]})}async run(g,h){var m;const C=_.InlineCompletionsController.get(h);await((m=C?.model.get())===null||m===void 0?void 0:m.acceptNextLine(C.editor))}}e.AcceptNextLineOfInlineCompletion=c;class d extends y.EditorAction{constructor(){super({id:S.inlineSuggestCommitId,label:b.localize(7,null),alias:"Accept Inline Suggestion",precondition:p.InlineCompletionContextKeys.inlineSuggestionVisible,menuOpts:[{menuId:a.MenuId.InlineSuggestionToolbar,title:b.localize(8,null),group:"primary",order:1}],kbOpts:{primary:2,weight:200,kbExpr:n.ContextKeyExpr.and(p.InlineCompletionContextKeys.inlineSuggestionVisible,E.EditorContextKeys.tabMovesFocus.toNegated(),p.InlineCompletionContextKeys.inlineSuggestionHasIndentationLessThanTabSize,v.Context.Visible.toNegated(),E.EditorContextKeys.hoverFocused.toNegated())}})}async run(g,h){var m;const C=_.InlineCompletionsController.get(h);C&&((m=C.model.get())===null||m===void 0||m.accept(C.editor),C.editor.focus())}}e.AcceptInlineCompletion=d;class s extends y.EditorAction{constructor(){super({id:s.ID,label:b.localize(9,null),alias:"Hide Inline Suggestion",precondition:p.InlineCompletionContextKeys.inlineSuggestionVisible,kbOpts:{weight:100,primary:9}})}async run(g,h){const m=_.InlineCompletionsController.get(h);(0,L.transaction)(C=>{var w;(w=m?.model.get())===null||w===void 0||w.stop(C)})}}e.HideInlineCompletion=s,s.ID="editor.action.inlineSuggest.hide";class l extends a.Action2{constructor(){super({id:l.ID,title:b.localize(10,null),f1:!1,precondition:void 0,menu:[{id:a.MenuId.InlineSuggestionToolbar,group:"secondary",order:10}],toggled:n.ContextKeyExpr.equals("config.editor.inlineSuggest.showToolbar","always")})}async run(g,h){const m=g.get(i.IConfigurationService),w=m.getValue("editor.inlineSuggest.showToolbar")==="always"?"onHover":"always";m.updateValue("editor.inlineSuggest.showToolbar",w)}}e.ToggleAlwaysShowInlineSuggestionToolbar=l,l.ID="editor.action.inlineSuggest.toggleAlwaysShowToolbar"}),define(se[930],oe([1,0,7,58,2,35,5,43,101,264,257,104,694,69,8,57,81]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineCompletionsHoverParticipant=e.InlineCompletionsHover=void 0;class f{constructor(s,l,o){this.owner=s,this.range=l,this.controller=o}isValidForHoverAnchor(s){return s.type===1&&this.range.startColumn<=s.range.startColumn&&this.range.endColumn>=s.range.endColumn}}e.InlineCompletionsHover=f;let c=class{constructor(s,l,o,g,h,m){this._editor=s,this._languageService=l,this._openerService=o,this.accessibilityService=g,this._instantiationService=h,this._telemetryService=m,this.hoverOrdinal=4}suggestHoverAnchor(s){const l=v.InlineCompletionsController.get(this._editor);if(!l)return null;const o=s.target;if(o.type===8){const g=o.detail;if(l.shouldShowHoverAtViewZone(g.viewZoneId))return new _.HoverForeignElementAnchor(1e3,this,S.Range.fromPositions(this._editor.getModel().validatePosition(g.positionBefore||g.position)),s.event.posx,s.event.posy,!1)}return o.type===7&&l.shouldShowHoverAt(o.range)?new _.HoverForeignElementAnchor(1e3,this,o.range,s.event.posx,s.event.posy,!1):o.type===6&&o.detail.mightBeForeignElement&&l.shouldShowHoverAt(o.range)?new _.HoverForeignElementAnchor(1e3,this,o.range,s.event.posx,s.event.posy,!1):null}computeSync(s,l){if(this._editor.getOption(62).showToolbar!=="onHover")return[];const o=v.InlineCompletionsController.get(this._editor);return o&&o.shouldShowHoverAt(s.range)?[new f(this,s.range,o)]:[]}renderHoverParts(s,l){const o=new y.DisposableStore,g=l[0];this._telemetryService.publicLog2("inlineCompletionHover.shown"),this.accessibilityService.isScreenReaderOptimized()&&!this._editor.getOption(8)&&this.renderScreenReaderText(s,g,o);const h=g.controller.model.get(),m=this._instantiationService.createInstance(b.InlineSuggestionHintsContentWidget,this._editor,!1,(0,E.constObservable)(null),h.selectedInlineCompletionIndex,h.inlineCompletionsCount,h.selectedInlineCompletion.map(C=>{var w;return(w=C?.inlineCompletion.source.inlineCompletions.commands)!==null&&w!==void 0?w:[]}));return s.fragment.appendChild(m.getDomNode()),h.triggerExplicitly(),o.add(m),o}renderScreenReaderText(s,l,o){const g=L.$,h=g("div.hover-row.markdown-hover"),m=L.append(h,g("div.hover-contents",{["aria-live"]:"assertive"})),C=o.add(new a.MarkdownRenderer({editor:this._editor},this._languageService,this._openerService)),w=D=>{o.add(C.onDidRenderAsync(()=>{m.className="hover-contents code-hover-contents",s.onContentsChanged()}));const I=i.localize(0,null),T=o.add(C.render(new k.MarkdownString().appendText(I).appendCodeblock("text",D)));m.replaceChildren(T.element)};o.add((0,E.autorun)(D=>{var I;const T=(I=l.controller.model.read(D))===null||I===void 0?void 0:I.ghostText.read(D);if(T){const A=this._editor.getModel().getLineContent(T.lineNumber);w(T.renderForScreenReader(A))}else L.reset(m)})),s.fragment.appendChild(h)}};e.InlineCompletionsHoverParticipant=c,e.InlineCompletionsHoverParticipant=c=ke([ge(1,p.ILanguageService),ge(2,r.IOpenerService),ge(3,n.IAccessibilityService),ge(4,t.IInstantiationService),ge(5,u.ITelemetryService)],c)}),define(se[931],oe([1,0,16,101,929,930,264,30]),function(te,e,L,k,y,E,S,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),(0,L.registerEditorContribution)(S.InlineCompletionsController.ID,S.InlineCompletionsController,3),(0,L.registerEditorAction)(y.TriggerInlineSuggestionAction),(0,L.registerEditorAction)(y.ShowNextInlineSuggestionAction),(0,L.registerEditorAction)(y.ShowPreviousInlineSuggestionAction),(0,L.registerEditorAction)(y.AcceptNextWordOfInlineCompletion),(0,L.registerEditorAction)(y.AcceptNextLineOfInlineCompletion),(0,L.registerEditorAction)(y.AcceptInlineCompletion),(0,L.registerEditorAction)(y.HideInlineCompletion),(0,p.registerAction2)(y.ToggleAlwaysShowInlineSuggestionToolbar),k.HoverParticipantRegistry.register(E.InlineCompletionsHoverParticipant)}),define(se[932],oe([1,0,19,71,52,2,33,5,131,18,311,138,358,391,312,103]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestInlineCompletions=void 0;class u{constructor(s,l,o,g,h,m){this.range=s,this.insertText=l,this.filterText=o,this.additionalTextEdits=g,this.command=h,this.completion=m}}let f=class extends E.RefCountedDisposable{constructor(s,l,o,g,h,m){super(h.disposable),this.model=s,this.line=l,this.word=o,this.completionModel=g,this._suggestMemoryService=m}canBeReused(s,l,o){return this.model===s&&this.line===l&&this.word.word.length>0&&this.word.startColumn===o.startColumn&&this.word.endColumn<o.endColumn&&this.completionModel.getIncompleteProvider().size===0}get items(){var s;const l=[],{items:o}=this.completionModel,g=this._suggestMemoryService.select(this.model,{lineNumber:this.line,column:this.word.endColumn+this.completionModel.lineContext.characterCountDelta},o),h=y.Iterable.slice(o,g),m=y.Iterable.slice(o,0,g);let C=5;for(const w of y.Iterable.concat(h,m)){if(w.score===k.FuzzyScore.Default)continue;const D=new p.Range(w.editStart.lineNumber,w.editStart.column,w.editInsertEnd.lineNumber,w.editInsertEnd.column+this.completionModel.lineContext.characterCountDelta),I=w.completion.insertTextRules&&w.completion.insertTextRules&4?{snippet:w.completion.insertText}:w.completion.insertText;l.push(new u(D,I,(s=w.filterTextLow)!==null&&s!==void 0?s:w.labelLow,w.completion.additionalTextEdits,w.completion.command,w)),C-->=0&&w.resolve(L.CancellationToken.None)}return l}};f=ke([ge(5,i.ISuggestMemoryService)],f);let c=class extends E.Disposable{constructor(s,l,o,g){super(),this._languageFeatureService=s,this._clipboardService=l,this._suggestMemoryService=o,this._editorService=g,this._store.add(s.inlineCompletionsProvider.register("*",this))}async provideInlineCompletions(s,l,o,g){var h;if(o.selectedSuggestionInfo)return;let m;for(const N of this._editorService.listCodeEditors())if(N.getModel()===s){m=N;break}if(!m)return;const C=m.getOption(88);if(a.QuickSuggestionsOptions.isAllOff(C))return;s.tokenization.tokenizeIfCheap(l.lineNumber);const w=s.tokenization.getLineTokens(l.lineNumber),D=w.getStandardTokenType(w.findTokenIndexAtOffset(Math.max(l.column-1-1,0)));if(a.QuickSuggestionsOptions.valueFor(C,D)!=="inline")return;let I=s.getWordAtPosition(l),T;if(I?.word||(T=this._getTriggerCharacterInfo(s,l)),!I?.word&&!T||(I||(I=s.getWordUntilPosition(l)),I.endColumn!==l.column))return;let A;const P=s.getValueInRange(new p.Range(l.lineNumber,1,l.lineNumber,l.column));if(!T&&(!((h=this._lastResult)===null||h===void 0)&&h.canBeReused(s,l.lineNumber,I))){const N=new b.LineContext(P,l.column-this._lastResult.word.endColumn);this._lastResult.completionModel.lineContext=N,this._lastResult.acquire(),A=this._lastResult}else{const N=await(0,a.provideSuggestionItems)(this._languageFeatureService.completionProvider,s,l,new a.CompletionOptions(void 0,n.SuggestModel.createSuggestFilter(m).itemKind,T?.providers),T&&{triggerKind:1,triggerCharacter:T.ch},g);let M;N.needsClipboard&&(M=await this._clipboardService.readText());const R=new b.CompletionModel(N.items,l.column,new b.LineContext(P,0),t.WordDistance.None,m.getOption(117),m.getOption(111),{boostFullMatch:!1,firstMatchCanBeWeak:!1},M);A=new f(s,l.lineNumber,I,R,N,this._suggestMemoryService)}return this._lastResult=A,A}handleItemDidShow(s,l){l.completion.resolve(L.CancellationToken.None)}freeInlineCompletions(s){s.release()}_getTriggerCharacterInfo(s,l){var o;const g=s.getValueInRange(p.Range.fromPositions({lineNumber:l.lineNumber,column:l.column-1},l)),h=new Set;for(const m of this._languageFeatureService.completionProvider.all(s))!((o=m.triggerCharacters)===null||o===void 0)&&o.includes(g)&&h.add(m);if(h.size!==0)return{providers:h,ch:g}}};e.SuggestInlineCompletions=c,e.SuggestInlineCompletions=c=ke([ge(0,v.ILanguageFeaturesService),ge(1,r.IClipboardService),ge(2,i.ISuggestMemoryService),ge(3,S.ICodeEditorService)],c),(0,_.registerEditorFeature)(c)}),define(se[393],oe([1,0,8]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IWorkspaceTrustManagementService=void 0,e.IWorkspaceTrustManagementService=(0,L.createDecorator)("workspaceTrustManagementService")}),define(se[933],oe([1,0,14,26,58,2,17,11,16,36,38,296,121,43,336,101,253,845,725,27,8,57,70,82,393,481]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ShowExcludeOptions=e.DisableHighlightingOfNonBasicAsciiCharactersAction=e.DisableHighlightingOfInvisibleCharactersAction=e.DisableHighlightingOfAmbiguousCharactersAction=e.DisableHighlightingInStringsAction=e.DisableHighlightingInCommentsAction=e.UnicodeHighlighterHoverParticipant=e.UnicodeHighlighter=e.warningIcon=void 0,e.warningIcon=(0,g.registerIcon)("extensions-warning-message",k.Codicon.warning,c.localize(0,null));let m=class extends E.Disposable{constructor(ne,$,J,Q){super(),this._editor=ne,this._editorWorkerService=$,this._workspaceTrustService=J,this._highlighter=null,this._bannerClosed=!1,this._updateState=re=>{if(re&&re.hasMore){if(this._bannerClosed)return;const de=Math.max(re.ambiguousCharacterCount,re.nonBasicAsciiCharacterCount,re.invisibleCharacterCount);let he;if(re.nonBasicAsciiCharacterCount>=de)he={message:c.localize(1,null),command:new V};else if(re.ambiguousCharacterCount>=de)he={message:c.localize(2,null),command:new B};else if(re.invisibleCharacterCount>=de)he={message:c.localize(3,null),command:new W};else throw new Error("Unreachable");this._bannerController.show({id:"unicodeHighlightBanner",message:he.message,icon:e.warningIcon,actions:[{label:he.command.shortLabel,href:`command:${he.command.id}`}],onClose:()=>{this._bannerClosed=!0}})}else this._bannerController.hide()},this._bannerController=this._register(Q.createInstance(f.BannerController,ne)),this._register(this._editor.onDidChangeModel(()=>{this._bannerClosed=!1,this._updateHighlighter()})),this._options=ne.getOption(124),this._register(J.onDidChangeTrust(re=>{this._updateHighlighter()})),this._register(ne.onDidChangeConfiguration(re=>{re.hasChanged(124)&&(this._options=ne.getOption(124),this._updateHighlighter())})),this._updateHighlighter()}dispose(){this._highlighter&&(this._highlighter.dispose(),this._highlighter=null),super.dispose()}_updateHighlighter(){if(this._updateState(null),this._highlighter&&(this._highlighter.dispose(),this._highlighter=null),!this._editor.hasModel())return;const ne=C(this._workspaceTrustService.isWorkspaceTrusted(),this._options);if([ne.nonBasicASCII,ne.ambiguousCharacters,ne.invisibleCharacters].every(J=>J===!1))return;const $={nonBasicASCII:ne.nonBasicASCII,ambiguousCharacters:ne.ambiguousCharacters,invisibleCharacters:ne.invisibleCharacters,includeComments:ne.includeComments,includeStrings:ne.includeStrings,allowedCodePoints:Object.keys(ne.allowedCharacters).map(J=>J.codePointAt(0)),allowedLocales:Object.keys(ne.allowedLocales).map(J=>J==="_os"?new Intl.NumberFormat().resolvedOptions().locale:J==="_vscode"?S.language:J)};this._editorWorkerService.canComputeUnicodeHighlights(this._editor.getModel().uri)?this._highlighter=new w(this._editor,$,this._updateState,this._editorWorkerService):this._highlighter=new D(this._editor,$,this._updateState)}getDecorationInfo(ne){return this._highlighter?this._highlighter.getDecorationInfo(ne):null}};e.UnicodeHighlighter=m,m.ID="editor.contrib.unicodeHighlighter",e.UnicodeHighlighter=m=ke([ge(1,i.IEditorWorkerService),ge(2,h.IWorkspaceTrustManagementService),ge(3,s.IInstantiationService)],m);function C(ae,ne){return{nonBasicASCII:ne.nonBasicASCII===v.inUntrustedWorkspace?!ae:ne.nonBasicASCII,ambiguousCharacters:ne.ambiguousCharacters,invisibleCharacters:ne.invisibleCharacters,includeComments:ne.includeComments===v.inUntrustedWorkspace?!ae:ne.includeComments,includeStrings:ne.includeStrings===v.inUntrustedWorkspace?!ae:ne.includeStrings,allowedCharacters:ne.allowedCharacters,allowedLocales:ne.allowedLocales}}let w=class extends E.Disposable{constructor(ne,$,J,Q){super(),this._editor=ne,this._options=$,this._updateState=J,this._editorWorkerService=Q,this._model=this._editor.getModel(),this._decorations=this._editor.createDecorationsCollection(),this._updateSoon=this._register(new L.RunOnceScheduler(()=>this._update(),250)),this._register(this._editor.onDidChangeModelContent(()=>{this._updateSoon.schedule()})),this._updateSoon.schedule()}dispose(){this._decorations.clear(),super.dispose()}_update(){if(this._model.isDisposed())return;if(!this._model.mightContainNonBasicASCII()){this._decorations.clear();return}const ne=this._model.getVersionId();this._editorWorkerService.computedUnicodeHighlights(this._model.uri,this._options).then($=>{if(this._model.isDisposed()||this._model.getVersionId()!==ne)return;this._updateState($);const J=[];if(!$.hasMore)for(const Q of $.ranges)J.push({range:Q,options:R.instance.getDecorationFromOptions(this._options)});this._decorations.set(J)})}getDecorationInfo(ne){if(!this._decorations.has(ne))return null;const $=this._editor.getModel();if(!(0,t.isModelDecorationVisible)($,ne))return null;const J=$.getValueInRange(ne.range);return{reason:M(J,this._options),inComment:(0,t.isModelDecorationInComment)($,ne),inString:(0,t.isModelDecorationInString)($,ne)}}};w=ke([ge(3,i.IEditorWorkerService)],w);class D extends E.Disposable{constructor(ne,$,J){super(),this._editor=ne,this._options=$,this._updateState=J,this._model=this._editor.getModel(),this._decorations=this._editor.createDecorationsCollection(),this._updateSoon=this._register(new L.RunOnceScheduler(()=>this._update(),250)),this._register(this._editor.onDidLayoutChange(()=>{this._updateSoon.schedule()})),this._register(this._editor.onDidScrollChange(()=>{this._updateSoon.schedule()})),this._register(this._editor.onDidChangeHiddenAreas(()=>{this._updateSoon.schedule()})),this._register(this._editor.onDidChangeModelContent(()=>{this._updateSoon.schedule()})),this._updateSoon.schedule()}dispose(){this._decorations.clear(),super.dispose()}_update(){if(this._model.isDisposed())return;if(!this._model.mightContainNonBasicASCII()){this._decorations.clear();return}const ne=this._editor.getVisibleRanges(),$=[],J={ranges:[],ambiguousCharacterCount:0,invisibleCharacterCount:0,nonBasicAsciiCharacterCount:0,hasMore:!1};for(const Q of ne){const re=a.UnicodeTextModelHighlighter.computeUnicodeHighlights(this._model,this._options,Q);for(const de of re.ranges)J.ranges.push(de);J.ambiguousCharacterCount+=J.ambiguousCharacterCount,J.invisibleCharacterCount+=J.invisibleCharacterCount,J.nonBasicAsciiCharacterCount+=J.nonBasicAsciiCharacterCount,J.hasMore=J.hasMore||re.hasMore}if(!J.hasMore)for(const Q of J.ranges)$.push({range:Q,options:R.instance.getDecorationFromOptions(this._options)});this._updateState(J),this._decorations.set($)}getDecorationInfo(ne){if(!this._decorations.has(ne))return null;const $=this._editor.getModel(),J=$.getValueInRange(ne.range);return(0,t.isModelDecorationVisible)($,ne)?{reason:M(J,this._options),inComment:(0,t.isModelDecorationInComment)($,ne),inString:(0,t.isModelDecorationInString)($,ne)}:null}}const I=c.localize(4,null);let T=class{constructor(ne,$,J){this._editor=ne,this._languageService=$,this._openerService=J,this.hoverOrdinal=5}computeSync(ne,$){if(!this._editor.hasModel()||ne.type!==1)return[];const J=this._editor.getModel(),Q=this._editor.getContribution(m.ID);if(!Q)return[];const re=[],de=new Set;let he=300;for(const me of $){const X=Q.getDecorationInfo(me);if(!X)continue;const G=J.getValueInRange(me.range).codePointAt(0),z=P(G);let H;switch(X.reason.kind){case 0:{(0,p.isBasicASCII)(X.reason.confusableWith)?H=c.localize(5,null,z,P(X.reason.confusableWith.codePointAt(0))):H=c.localize(6,null,z,P(X.reason.confusableWith.codePointAt(0)));break}case 1:H=c.localize(7,null,z);break;case 2:H=c.localize(8,null,z);break}if(de.has(H))continue;de.add(H);const Y={codePoint:G,reason:X.reason,inComment:X.inComment,inString:X.inString},j=c.localize(9,null),Z=`command:${K.ID}?${encodeURIComponent(JSON.stringify(Y))}`,ee=new y.MarkdownString("",!0).appendMarkdown(H).appendText(" ").appendLink(Z,j,I);re.push(new u.MarkdownHover(this,me.range,[ee],!1,he++))}return re}renderHoverParts(ne,$){return(0,u.renderMarkdownHovers)(ne,$,this._editor,this._languageService,this._openerService)}};e.UnicodeHighlighterHoverParticipant=T,e.UnicodeHighlighterHoverParticipant=T=ke([ge(1,n.ILanguageService),ge(2,l.IOpenerService)],T);function A(ae){return`U+${ae.toString(16).padStart(4,"0")}`}function P(ae){let ne=`\`${A(ae)}\``;return p.InvisibleCharacters.isInvisibleCharacter(ae)||(ne+=` "${`${N(ae)}`}"`),ne}function N(ae){return ae===96?"`` ` ``":"`"+String.fromCodePoint(ae)+"`"}function M(ae,ne){return a.UnicodeTextModelHighlighter.computeUnicodeHighlightReason(ae,ne)}class R{constructor(){this.map=new Map}getDecorationFromOptions(ne){return this.getDecoration(!ne.includeComments,!ne.includeStrings)}getDecoration(ne,$){const J=`${ne}${$}`;let Q=this.map.get(J);return Q||(Q=b.ModelDecorationOptions.createDynamic({description:"unicode-highlight",stickiness:1,className:"unicode-highlight",showIfCollapsed:!0,overviewRuler:null,minimap:null,hideInCommentTokens:ne,hideInStringTokens:$}),this.map.set(J,Q)),Q}}R.instance=new R;class x extends _.EditorAction{constructor(){super({id:B.ID,label:c.localize(11,null),alias:"Disable highlighting of characters in comments",precondition:void 0}),this.shortLabel=c.localize(10,null)}async run(ne,$,J){const Q=ne?.get(d.IConfigurationService);Q&&this.runAction(Q)}async runAction(ne){await ne.updateValue(v.unicodeHighlightConfigKeys.includeComments,!1,2)}}e.DisableHighlightingInCommentsAction=x;class O extends _.EditorAction{constructor(){super({id:B.ID,label:c.localize(13,null),alias:"Disable highlighting of characters in strings",precondition:void 0}),this.shortLabel=c.localize(12,null)}async run(ne,$,J){const Q=ne?.get(d.IConfigurationService);Q&&this.runAction(Q)}async runAction(ne){await ne.updateValue(v.unicodeHighlightConfigKeys.includeStrings,!1,2)}}e.DisableHighlightingInStringsAction=O;class B extends _.EditorAction{constructor(){super({id:B.ID,label:c.localize(15,null),alias:"Disable highlighting of ambiguous characters",precondition:void 0}),this.shortLabel=c.localize(14,null)}async run(ne,$,J){const Q=ne?.get(d.IConfigurationService);Q&&this.runAction(Q)}async runAction(ne){await ne.updateValue(v.unicodeHighlightConfigKeys.ambiguousCharacters,!1,2)}}e.DisableHighlightingOfAmbiguousCharactersAction=B,B.ID="editor.action.unicodeHighlight.disableHighlightingOfAmbiguousCharacters";class W extends _.EditorAction{constructor(){super({id:W.ID,label:c.localize(17,null),alias:"Disable highlighting of invisible characters",precondition:void 0}),this.shortLabel=c.localize(16,null)}async run(ne,$,J){const Q=ne?.get(d.IConfigurationService);Q&&this.runAction(Q)}async runAction(ne){await ne.updateValue(v.unicodeHighlightConfigKeys.invisibleCharacters,!1,2)}}e.DisableHighlightingOfInvisibleCharactersAction=W,W.ID="editor.action.unicodeHighlight.disableHighlightingOfInvisibleCharacters";class V extends _.EditorAction{constructor(){super({id:V.ID,label:c.localize(19,null),alias:"Disable highlighting of non basic ASCII characters",precondition:void 0}),this.shortLabel=c.localize(18,null)}async run(ne,$,J){const Q=ne?.get(d.IConfigurationService);Q&&this.runAction(Q)}async runAction(ne){await ne.updateValue(v.unicodeHighlightConfigKeys.nonBasicASCII,!1,2)}}e.DisableHighlightingOfNonBasicAsciiCharactersAction=V,V.ID="editor.action.unicodeHighlight.disableHighlightingOfNonBasicAsciiCharacters";class K extends _.EditorAction{constructor(){super({id:K.ID,label:c.localize(20,null),alias:"Show Exclude Options",precondition:void 0})}async run(ne,$,J){const{codePoint:Q,reason:re,inString:de,inComment:he}=J,me=String.fromCodePoint(Q),X=ne.get(o.IQuickInputService),U=ne.get(d.IConfigurationService);function G(Y){return p.InvisibleCharacters.isInvisibleCharacter(Y)?c.localize(21,null,A(Y)):c.localize(22,null,`${A(Y)} "${me}"`)}const z=[];if(re.kind===0)for(const Y of re.notAmbiguousInLocales)z.push({label:c.localize(23,null,Y),run:async()=>{q(U,[Y])}});if(z.push({label:G(Q),run:()=>F(U,[Q])}),he){const Y=new x;z.push({label:Y.label,run:async()=>Y.runAction(U)})}else if(de){const Y=new O;z.push({label:Y.label,run:async()=>Y.runAction(U)})}if(re.kind===0){const Y=new B;z.push({label:Y.label,run:async()=>Y.runAction(U)})}else if(re.kind===1){const Y=new W;z.push({label:Y.label,run:async()=>Y.runAction(U)})}else if(re.kind===2){const Y=new V;z.push({label:Y.label,run:async()=>Y.runAction(U)})}else ie(re);const H=await X.pick(z,{title:I});H&&await H.run()}}e.ShowExcludeOptions=K,K.ID="editor.action.unicodeHighlight.showExcludeOptions";async function F(ae,ne){const $=ae.getValue(v.unicodeHighlightConfigKeys.allowedCharacters);let J;typeof $=="object"&&$?J=$:J={};for(const Q of ne)J[String.fromCodePoint(Q)]=!0;await ae.updateValue(v.unicodeHighlightConfigKeys.allowedCharacters,J,2)}async function q(ae,ne){var $;const J=($=ae.inspect(v.unicodeHighlightConfigKeys.allowedLocales).user)===null||$===void 0?void 0:$.value;let Q;typeof J=="object"&&J?Q=Object.assign({},J):Q={};for(const re of ne)Q[re]=!0;await ae.updateValue(v.unicodeHighlightConfigKeys.allowedLocales,Q,2)}function ie(ae){throw new Error(`Unexpected value: ${ae}`)}(0,_.registerEditorAction)(B),(0,_.registerEditorAction)(W),(0,_.registerEditorAction)(V),(0,_.registerEditorAction)(K),(0,_.registerEditorContribution)(m.ID,m,1),r.HoverParticipantRegistry.register(T)}),define(se[934],oe([1,0,191,194,886,810,889,811,812,902,891,893,916,900,813,923,814,894,924,925,377,261,817,818,780,931,262,263,384,382,385,820,918,901,821,822,904,905,823,910,844,869,870,871,825,196,920,392,932,826,800,933,827,911,364,828,824,779,96,177]),function(te,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0})}),define(se[265],oe([1,0,11,7,46,6,125,2,17,100,22,136,246,74,10,5,51,68,189,25,27,356,15,162,8,775,34,347,124,348,776,164,50,88,81,169,123,96,49,33,64,393,59,778,795,878,45,785,121,247,43,864,237,883,880,372,137,777,69,30,806,781,103,772,236,773,163,192,97,784,57,70,92,799,122,782,131,12,243,44,32,371,349,922,79,865,763,852]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w,D,I,T,A,P,N,M,R,x,O,B,W,V,K,F,q,ie,ae,ne,$,J,Q,re,de,he,me,X,U,G,z,H,Y,j,Z,ee,le,ue,ce,pe,ve,Ce,Se,_e,Ee,Ae,xe,Be,De,Ie,fe,be,Ne){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneServices=e.updateConfigurationService=e.StandaloneConfigurationService=e.StandaloneKeybindingService=e.StandaloneCommandService=e.StandaloneNotificationService=void 0;class Pe{constructor(Fe){this.disposed=!1,this.model=Fe,this._onWillDispose=new E.Emitter}get textEditorModel(){return this.model}dispose(){this.disposed=!0,this._onWillDispose.fire()}}let ze=class{constructor(Fe){this.modelService=Fe}createModelReference(Fe){const We=this.modelService.getModel(Fe);return We?Promise.resolve(new p.ImmortalReference(new Pe(We))):Promise.reject(new Error("Model not found"))}};ze=ke([ge(0,u.IModelService)],ze);class Ke{show(){return Ke.NULL_PROGRESS_RUNNER}async showWhile(Fe,We){await Fe}}Ke.NULL_PROGRESS_RUNNER={done:()=>{},total:()=>{},worked:()=>{}};class je{withProgress(Fe,We,He){return We({report:()=>{}})}}class Je{constructor(){this.isExtensionDevelopment=!1,this.isBuilt=!1}}class rt{async confirm(Fe){return{confirmed:this.doConfirm(Fe.message,Fe.detail),checkboxChecked:!1}}doConfirm(Fe,We){let He=Fe;return We&&(He=He+`
+
+`+We),Ne.mainWindow.confirm(He)}async prompt(Fe){var We,He;let Ue;if(this.doConfirm(Fe.message,Fe.detail)){const Xe=[...(We=Fe.buttons)!==null&&We!==void 0?We:[]];Fe.cancelButton&&typeof Fe.cancelButton!="string"&&typeof Fe.cancelButton!="boolean"&&Xe.push(Fe.cancelButton),Ue=await((He=Xe[0])===null||He===void 0?void 0:He.run({checkboxChecked:!1}))}return{result:Ue}}async error(Fe,We){await this.prompt({type:v.default.Error,message:Fe,detail:We})}}class et{info(Fe){return this.notify({severity:v.default.Info,message:Fe})}warn(Fe){return this.notify({severity:v.default.Warning,message:Fe})}error(Fe){return this.notify({severity:v.default.Error,message:Fe})}notify(Fe){switch(Fe.severity){case v.default.Error:console.error(Fe.message);break;case v.default.Warning:console.warn(Fe.message);break;default:console.log(Fe.message);break}return et.NO_OP}prompt(Fe,We,He,Ue){return et.NO_OP}status(Fe,We){return p.Disposable.None}}e.StandaloneNotificationService=et,et.NO_OP=new P.NoOpNotification;let st=class{constructor(Fe){this._onWillExecuteCommand=new E.Emitter,this._onDidExecuteCommand=new E.Emitter,this.onDidExecuteCommand=this._onDidExecuteCommand.event,this._instantiationService=Fe}executeCommand(Fe,...We){const He=d.CommandsRegistry.getCommand(Fe);if(!He)return Promise.reject(new Error(`command '${Fe}' not found`));try{this._onWillExecuteCommand.fire({commandId:Fe,args:We});const Ue=this._instantiationService.invokeFunction.apply(this._instantiationService,[He.handler,...We]);return this._onDidExecuteCommand.fire({commandId:Fe,args:We}),Promise.resolve(Ue)}catch(Ue){return Promise.reject(Ue)}}};e.StandaloneCommandService=st,e.StandaloneCommandService=st=ke([ge(0,h.IInstantiationService)],st);let Qe=class extends m.AbstractKeybindingService{constructor(Fe,We,He,Ue,tt,Xe){super(Fe,We,He,Ue,tt),this._cachedResolver=null,this._dynamicKeybindings=[],this._domNodeListeners=[];const dt=ut=>{const wt=new p.DisposableStore;wt.add(k.addDisposableListener(ut,k.EventType.KEY_DOWN,Dt=>{const yt=new y.StandardKeyboardEvent(Dt);this._dispatch(yt,yt.target)&&(yt.preventDefault(),yt.stopPropagation())})),wt.add(k.addDisposableListener(ut,k.EventType.KEY_UP,Dt=>{const yt=new y.StandardKeyboardEvent(Dt);this._singleModifierDispatch(yt,yt.target)&&yt.preventDefault()})),this._domNodeListeners.push(new ft(ut,wt))},it=ut=>{for(let wt=0;wt<this._domNodeListeners.length;wt++){const Dt=this._domNodeListeners[wt];Dt.domNode===ut&&(this._domNodeListeners.splice(wt,1),Dt.dispose())}},nt=ut=>{ut.getOption(61)||dt(ut.getContainerDomNode())},ot=ut=>{ut.getOption(61)||it(ut.getContainerDomNode())};this._register(Xe.onCodeEditorAdd(nt)),this._register(Xe.onCodeEditorRemove(ot)),Xe.listCodeEditors().forEach(nt);const ht=ut=>{dt(ut.getContainerDomNode())},St=ut=>{it(ut.getContainerDomNode())};this._register(Xe.onDiffEditorAdd(ht)),this._register(Xe.onDiffEditorRemove(St)),Xe.listDiffEditors().forEach(ht)}addDynamicKeybinding(Fe,We,He,Ue){return(0,p.combinedDisposable)(d.CommandsRegistry.registerCommand(Fe,He),this.addDynamicKeybindings([{keybinding:We,command:Fe,when:Ue}]))}addDynamicKeybindings(Fe){const We=Fe.map(He=>{var Ue;return{keybinding:(0,S.decodeKeybinding)(He.keybinding,_.OS),command:(Ue=He.command)!==null&&Ue!==void 0?Ue:null,commandArgs:He.commandArgs,when:He.when,weight1:1e3,weight2:0,extensionId:null,isBuiltinExtension:!1}});return this._dynamicKeybindings=this._dynamicKeybindings.concat(We),this.updateResolver(),(0,p.toDisposable)(()=>{for(let He=0;He<this._dynamicKeybindings.length;He++)if(this._dynamicKeybindings[He]===We[0]){this._dynamicKeybindings.splice(He,We.length),this.updateResolver();return}})}updateResolver(){this._cachedResolver=null,this._onDidUpdateKeybindings.fire()}_getResolver(){if(!this._cachedResolver){const Fe=this._toNormalizedKeybindingItems(D.KeybindingsRegistry.getDefaultKeybindings(),!0),We=this._toNormalizedKeybindingItems(this._dynamicKeybindings,!1);this._cachedResolver=new w.KeybindingResolver(Fe,We,He=>this._log(He))}return this._cachedResolver}_documentHasFocus(){return Ne.mainWindow.document.hasFocus()}_toNormalizedKeybindingItems(Fe,We){const He=[];let Ue=0;for(const tt of Fe){const Xe=tt.when||void 0,dt=tt.keybinding;if(!dt)He[Ue++]=new I.ResolvedKeybindingItem(void 0,tt.command,tt.commandArgs,Xe,We,null,!1);else{const it=T.USLayoutResolvedKeybinding.resolveKeybinding(dt,_.OS);for(const nt of it)He[Ue++]=new I.ResolvedKeybindingItem(nt,tt.command,tt.commandArgs,Xe,We,null,!1)}}return He}resolveKeyboardEvent(Fe){const We=new S.KeyCodeChord(Fe.ctrlKey,Fe.shiftKey,Fe.altKey,Fe.metaKey,Fe.keyCode);return new T.USLayoutResolvedKeybinding([We],_.OS)}};e.StandaloneKeybindingService=Qe,e.StandaloneKeybindingService=Qe=ke([ge(0,o.IContextKeyService),ge(1,d.ICommandService),ge(2,M.ITelemetryService),ge(3,P.INotificationService),ge(4,V.ILogService),ge(5,W.ICodeEditorService)],Qe);class ft extends p.Disposable{constructor(Fe,We){super(),this.domNode=Fe,this._register(We)}}function at(qe){return qe&&typeof qe=="object"&&(!qe.overrideIdentifier||typeof qe.overrideIdentifier=="string")&&(!qe.resource||qe.resource instanceof b.URI)}class ct{constructor(){this._onDidChangeConfiguration=new E.Emitter,this.onDidChangeConfiguration=this._onDidChangeConfiguration.event;const Fe=new xe.DefaultConfiguration;this._configuration=new l.Configuration(Fe.reload(),new l.ConfigurationModel,new l.ConfigurationModel,new l.ConfigurationModel),Fe.dispose()}getValue(Fe,We){const He=typeof Fe=="string"?Fe:void 0,Ue=at(Fe)?Fe:at(We)?We:{};return this._configuration.getValue(He,Ue,void 0)}updateValues(Fe){const We={data:this._configuration.toData()},He=[];for(const Ue of Fe){const[tt,Xe]=Ue;this.getValue(tt)!==Xe&&(this._configuration.updateValue(tt,Xe),He.push(tt))}if(He.length>0){const Ue=new l.ConfigurationChangeEvent({keys:He,overrides:[]},We,this._configuration);Ue.source=8,this._onDidChangeConfiguration.fire(Ue)}return Promise.resolve()}updateValue(Fe,We,He,Ue){return this.updateValues([[Fe,We]])}inspect(Fe,We={}){return this._configuration.inspect(Fe,We,void 0)}}e.StandaloneConfigurationService=ct;let lt=class{constructor(Fe,We,He){this.configurationService=Fe,this.modelService=We,this.languageService=He,this._onDidChangeConfiguration=new E.Emitter,this.configurationService.onDidChangeConfiguration(Ue=>{this._onDidChangeConfiguration.fire({affectedKeys:Ue.affectedKeys,affectsConfiguration:(tt,Xe)=>Ue.affectsConfiguration(Xe)})})}getValue(Fe,We,He){const Ue=t.Position.isIPosition(We)?We:null,tt=Ue?typeof He=="string"?He:void 0:typeof We=="string"?We:void 0,Xe=Fe?this.getLanguage(Fe,Ue):void 0;return typeof tt>"u"?this.configurationService.getValue({resource:Fe,overrideIdentifier:Xe}):this.configurationService.getValue(tt,{resource:Fe,overrideIdentifier:Xe})}getLanguage(Fe,We){const He=this.modelService.getModel(Fe);return He?We?He.getLanguageIdAtPosition(We.lineNumber,We.column):He.getLanguageId():this.languageService.guessLanguageIdByFilepathOrFirstLine(Fe)}};lt=ke([ge(0,s.IConfigurationService),ge(1,u.IModelService),ge(2,re.ILanguageService)],lt);let mt=class{constructor(Fe){this.configurationService=Fe}getEOL(Fe,We){const He=this.configurationService.getValue("files.eol",{overrideIdentifier:We,resource:Fe});return He&&typeof He=="string"&&He!=="auto"?He:_.isLinux||_.isMacintosh?`
+`:`\r
+`}};mt=ke([ge(0,s.IConfigurationService)],mt);class pt{publicLog2(){}}class Le{constructor(){const Fe=b.URI.from({scheme:Le.SCHEME,authority:"model",path:"/"});this.workspace={id:R.STANDALONE_EDITOR_WORKSPACE_ID,folders:[new R.WorkspaceFolder({uri:Fe,name:"",index:0})]}}getWorkspace(){return this.workspace}getWorkspaceFolder(Fe){return Fe&&Fe.scheme===Le.SCHEME?this.workspace.folders[0]:null}}Le.SCHEME="inmemory";function ye(qe,Fe,We){if(!Fe||!(qe instanceof ct))return;const He=[];Object.keys(Fe).forEach(Ue=>{(0,i.isEditorConfigurationKey)(Ue)&&He.push([`editor.${Ue}`,Fe[Ue]]),We&&(0,i.isDiffEditorConfigurationKey)(Ue)&&He.push([`diffEditor.${Ue}`,Fe[Ue]])}),He.length>0&&qe.updateValues(He)}e.updateConfigurationService=ye;let Me=class{constructor(Fe){this._modelService=Fe}hasPreviewHandler(){return!1}async apply(Fe,We){const He=Array.isArray(Fe)?Fe:a.ResourceEdit.convert(Fe),Ue=new Map;for(const dt of He){if(!(dt instanceof a.ResourceTextEdit))throw new Error("bad edit - only text edits are supported");const it=this._modelService.getModel(dt.resource);if(!it)throw new Error("bad edit - model not found");if(typeof dt.versionId=="number"&&it.getVersionId()!==dt.versionId)throw new Error("bad state - model changed in the meantime");let nt=Ue.get(it);nt||(nt=[],Ue.set(it,nt)),nt.push(n.EditOperation.replaceMove(r.Range.lift(dt.textEdit.range),dt.textEdit.text))}let tt=0,Xe=0;for(const[dt,it]of Ue)dt.pushStackElement(),dt.pushEditOperations([],it,()=>[]),dt.pushStackElement(),Xe+=1,tt+=it.length;return{ariaSummary:L.format(O.StandaloneServicesNLS.bulkEditServiceSummary,tt,Xe),isApplied:tt>0}}};Me=ke([ge(0,u.IModelService)],Me);class Te{getUriLabel(Fe,We){return Fe.scheme==="file"?Fe.fsPath:Fe.path}getUriBasenameLabel(Fe){return(0,B.basename)(Fe)}}let we=class extends q.ContextViewService{constructor(Fe,We){super(Fe),this._codeEditorService=We}showContextView(Fe,We,He){if(!We){const Ue=this._codeEditorService.getFocusedCodeEditor()||this._codeEditorService.getActiveCodeEditor();Ue&&(We=Ue.getContainerDomNode())}return super.showContextView(Fe,We,He)}};we=ke([ge(0,x.ILayoutService),ge(1,W.ICodeEditorService)],we);class Re{constructor(){this._neverEmitter=new E.Emitter,this.onDidChangeTrust=this._neverEmitter.event}isWorkspaceTrusted(){return!0}}class Oe extends ie.LanguageService{constructor(){super()}}class Ve extends De.LogService{constructor(){super(new V.ConsoleLogger)}}let $e=class extends ae.ContextMenuService{constructor(Fe,We,He,Ue,tt,Xe){super(Fe,We,He,Ue,tt,Xe),this.configure({blockMouse:!1})}};$e=ke([ge(0,M.ITelemetryService),ge(1,P.INotificationService),ge(2,F.IContextViewService),ge(3,C.IKeybindingService),ge(4,Y.IMenuService),ge(5,o.IContextKeyService)],$e);class Ze{async playAudioCue(Fe,We){}}(0,ne.registerSingleton)(s.IConfigurationService,ct,0),(0,ne.registerSingleton)(c.ITextResourceConfigurationService,lt,0),(0,ne.registerSingleton)(c.ITextResourcePropertiesService,mt,0),(0,ne.registerSingleton)(R.IWorkspaceContextService,Le,0),(0,ne.registerSingleton)(A.ILabelService,Te,0),(0,ne.registerSingleton)(M.ITelemetryService,pt,0),(0,ne.registerSingleton)(g.IDialogService,rt,0),(0,ne.registerSingleton)(be.IEnvironmentService,Je,0),(0,ne.registerSingleton)(P.INotificationService,et,0),(0,ne.registerSingleton)(Ce.IMarkerService,Se.MarkerService,0),(0,ne.registerSingleton)(re.ILanguageService,Oe,0),(0,ne.registerSingleton)(G.IStandaloneThemeService,U.StandaloneThemeService,0),(0,ne.registerSingleton)(V.ILogService,Ve,0),(0,ne.registerSingleton)(u.IModelService,me.ModelService,0),(0,ne.registerSingleton)(he.IMarkerDecorationsService,de.MarkerDecorationsService,0),(0,ne.registerSingleton)(o.IContextKeyService,le.ContextKeyService,0),(0,ne.registerSingleton)(N.IProgressService,je,0),(0,ne.registerSingleton)(N.IEditorProgressService,Ke,0),(0,ne.registerSingleton)(Ae.IStorageService,Ae.InMemoryStorageService,0),(0,ne.registerSingleton)(J.IEditorWorkerService,Q.EditorWorkerService,0),(0,ne.registerSingleton)(a.IBulkEditService,Me,0),(0,ne.registerSingleton)(K.IWorkspaceTrustManagementService,Re,0),(0,ne.registerSingleton)(f.ITextModelService,ze,0),(0,ne.registerSingleton)(H.IAccessibilityService,z.AccessibilityService,0),(0,ne.registerSingleton)(ve.IListService,ve.ListService,0),(0,ne.registerSingleton)(d.ICommandService,st,0),(0,ne.registerSingleton)(C.IKeybindingService,Qe,0),(0,ne.registerSingleton)(Ee.IQuickInputService,X.StandaloneQuickInputService,0),(0,ne.registerSingleton)(F.IContextViewService,we,0),(0,ne.registerSingleton)(_e.IOpenerService,$.OpenerService,0),(0,ne.registerSingleton)(ee.IClipboardService,Z.BrowserClipboardService,0),(0,ne.registerSingleton)(F.IContextMenuService,$e,0),(0,ne.registerSingleton)(Y.IMenuService,j.MenuService,0),(0,ne.registerSingleton)(Be.IAudioCueService,Ze,0);var Ge;(function(qe){const Fe=new pe.ServiceCollection;for(const[it,nt]of(0,ne.getSingletonServiceDescriptors)())Fe.set(it,nt);const We=new ce.InstantiationService(Fe,!0);Fe.set(h.IInstantiationService,We);function He(it){Ue||Xe({});const nt=Fe.get(it);if(!nt)throw new Error("Missing service "+it);return nt instanceof ue.SyncDescriptor?We.invokeFunction(ot=>ot.get(it)):nt}qe.get=He;let Ue=!1;const tt=new E.Emitter;function Xe(it){if(Ue)return We;Ue=!0;for(const[ot,ht]of(0,ne.getSingletonServiceDescriptors)())Fe.get(ot)||Fe.set(ot,ht);for(const ot in it)if(it.hasOwnProperty(ot)){const ht=(0,h.createDecorator)(ot);Fe.get(ht)instanceof ue.SyncDescriptor&&Fe.set(ht,it[ot])}const nt=(0,Ie.getEditorFeatures)();for(const ot of nt)try{We.createInstance(ot)}catch(ht){(0,fe.onUnexpectedError)(ht)}return tt.fire(),We}qe.initialize=Xe;function dt(it){if(Ue)return it();const nt=new p.DisposableStore,ot=nt.add(tt.event(()=>{ot.dispose(),nt.add(it())}));return nt}qe.withServices=dt})(Ge||(e.StandaloneServices=Ge={}))}),define(se[935],oe([1,0,48,2,33,194,287,265,137,30,25,27,15,59,8,34,50,23,69,96,103,88,51,43,371,80,32,18,259,122,44]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w,D,I,T){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createTextModel=e.StandaloneDiffEditor2=e.StandaloneEditor=e.StandaloneCodeEditor=void 0;let A=0,P=!1;function N(W){if(!W){if(P)return;P=!0}L.setARIAContainer(W||T.mainWindow.document.body)}let M=class extends E.CodeEditorWidget{constructor(V,K,F,q,ie,ae,ne,$,J,Q,re,de){const he={...K};he.ariaLabel=he.ariaLabel||d.StandaloneCodeEditorNLS.editorViewAccessibleLabel,he.ariaLabel=he.ariaLabel+";"+d.StandaloneCodeEditorNLS.accessibilityHelpMessage,super(V,he,{},F,q,ie,ae,$,J,Q,re,de),ne instanceof p.StandaloneKeybindingService?this._standaloneKeybindingService=ne:this._standaloneKeybindingService=null,N(he.ariaContainerElement)}addCommand(V,K,F){if(!this._standaloneKeybindingService)return console.warn("Cannot add command because the editor is configured with an unrecognized KeybindingService"),null;const q="DYNAMIC_"+ ++A,ie=i.ContextKeyExpr.deserialize(F);return this._standaloneKeybindingService.addDynamicKeybinding(q,V,K,ie),q}createContextKey(V,K){return this._contextKeyService.createKey(V,K)}addAction(V){if(typeof V.id!="string"||typeof V.label!="string"||typeof V.run!="function")throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!");if(!this._standaloneKeybindingService)return console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"),k.Disposable.None;const K=V.id,F=V.label,q=i.ContextKeyExpr.and(i.ContextKeyExpr.equals("editorId",this.getId()),i.ContextKeyExpr.deserialize(V.precondition)),ie=V.keybindings,ae=i.ContextKeyExpr.and(q,i.ContextKeyExpr.deserialize(V.keybindingContext)),ne=V.contextMenuGroupId||null,$=V.contextMenuOrder||0,J=(he,...me)=>Promise.resolve(V.run(this,...me)),Q=new k.DisposableStore,re=this.getId()+":"+K;if(Q.add(b.CommandsRegistry.registerCommand(re,J)),ne){const he={command:{id:re,title:F},when:q,group:ne,order:$};Q.add(v.MenuRegistry.appendMenuItem(v.MenuId.EditorContext,he))}if(Array.isArray(ie))for(const he of ie)Q.add(this._standaloneKeybindingService.addDynamicKeybinding(re,he,J,ae));const de=new S.InternalEditorAction(re,F,F,void 0,q,(...he)=>Promise.resolve(V.run(this,...he)),this._contextKeyService);return this._actions.set(K,de),Q.add((0,k.toDisposable)(()=>{this._actions.delete(K)})),Q}_triggerCommand(V,K){if(this._codeEditorService instanceof h.StandaloneCodeEditorService)try{this._codeEditorService.setActiveCodeEditor(this),super._triggerCommand(V,K)}finally{this._codeEditorService.setActiveCodeEditor(null)}else super._triggerCommand(V,K)}};e.StandaloneCodeEditor=M,e.StandaloneCodeEditor=M=ke([ge(2,t.IInstantiationService),ge(3,y.ICodeEditorService),ge(4,b.ICommandService),ge(5,i.IContextKeyService),ge(6,r.IKeybindingService),ge(7,f.IThemeService),ge(8,u.INotificationService),ge(9,c.IAccessibilityService),ge(10,C.ILanguageConfigurationService),ge(11,w.ILanguageFeaturesService)],M);let R=class extends M{constructor(V,K,F,q,ie,ae,ne,$,J,Q,re,de,he,me,X){const U={...K};(0,p.updateConfigurationService)(Q,U,!1);const G=$.registerEditorContainer(V);typeof U.theme=="string"&&$.setTheme(U.theme),typeof U.autoDetectHighContrast<"u"&&$.setAutoDetectHighContrast(!!U.autoDetectHighContrast);const z=U.model;delete U.model,super(V,U,F,q,ie,ae,ne,$,J,re,me,X),this._configurationService=Q,this._standaloneThemeService=$,this._register(G);let H;if(typeof z>"u"){const Y=he.getLanguageIdByMimeType(U.language)||U.language||m.PLAINTEXT_LANGUAGE_ID;H=O(de,he,U.value||"",Y,void 0),this._ownsModel=!0}else H=z,this._ownsModel=!1;if(this._attachModel(H),H){const Y={oldModelUrl:null,newModelUrl:H.uri};this._onDidChangeModel.fire(Y)}}dispose(){super.dispose()}updateOptions(V){(0,p.updateConfigurationService)(this._configurationService,V,!1),typeof V.theme=="string"&&this._standaloneThemeService.setTheme(V.theme),typeof V.autoDetectHighContrast<"u"&&this._standaloneThemeService.setAutoDetectHighContrast(!!V.autoDetectHighContrast),super.updateOptions(V)}_postDetachModelCleanup(V){super._postDetachModelCleanup(V),V&&this._ownsModel&&(V.dispose(),this._ownsModel=!1)}};e.StandaloneEditor=R,e.StandaloneEditor=R=ke([ge(2,t.IInstantiationService),ge(3,y.ICodeEditorService),ge(4,b.ICommandService),ge(5,i.IContextKeyService),ge(6,r.IKeybindingService),ge(7,_.IStandaloneThemeService),ge(8,u.INotificationService),ge(9,a.IConfigurationService),ge(10,c.IAccessibilityService),ge(11,o.IModelService),ge(12,g.ILanguageService),ge(13,C.ILanguageConfigurationService),ge(14,w.ILanguageFeaturesService)],R);let x=class extends D.DiffEditorWidget{constructor(V,K,F,q,ie,ae,ne,$,J,Q,re,de){const he={...K};(0,p.updateConfigurationService)($,he,!0);const me=ae.registerEditorContainer(V);typeof he.theme=="string"&&ae.setTheme(he.theme),typeof he.autoDetectHighContrast<"u"&&ae.setAutoDetectHighContrast(!!he.autoDetectHighContrast),super(V,he,{},q,F,ie,de,Q),this._configurationService=$,this._standaloneThemeService=ae,this._register(me)}dispose(){super.dispose()}updateOptions(V){(0,p.updateConfigurationService)(this._configurationService,V,!0),typeof V.theme=="string"&&this._standaloneThemeService.setTheme(V.theme),typeof V.autoDetectHighContrast<"u"&&this._standaloneThemeService.setAutoDetectHighContrast(!!V.autoDetectHighContrast),super.updateOptions(V)}_createInnerEditor(V,K,F){return V.createInstance(M,K,F)}getOriginalEditor(){return super.getOriginalEditor()}getModifiedEditor(){return super.getModifiedEditor()}addCommand(V,K,F){return this.getModifiedEditor().addCommand(V,K,F)}createContextKey(V,K){return this.getModifiedEditor().createContextKey(V,K)}addAction(V){return this.getModifiedEditor().addAction(V)}};e.StandaloneDiffEditor2=x,e.StandaloneDiffEditor2=x=ke([ge(2,t.IInstantiationService),ge(3,i.IContextKeyService),ge(4,y.ICodeEditorService),ge(5,_.IStandaloneThemeService),ge(6,u.INotificationService),ge(7,a.IConfigurationService),ge(8,n.IContextMenuService),ge(9,l.IEditorProgressService),ge(10,s.IClipboardService),ge(11,I.IAudioCueService)],x);function O(W,V,K,F,q){if(K=K||"",!F){const ie=K.indexOf(`
+`);let ae=K;return ie!==-1&&(ae=K.substring(0,ie)),B(W,K,V.createByFilepathOrFirstLine(q||null,ae),q)}return B(W,K,V.createById(F),q)}e.createTextModel=O;function B(W,V,K,F){return W.createModel(V,K,F)}}),define(se[936],oe([1,0,44,2,11,22,335,16,33,790,36,149,235,180,31,43,32,80,160,41,51,211,767,935,265,137,30,25,15,34,97,57,888,487]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r,u,f,c,d,s,l,o,g,h,m,C,w,D,I,T,A,P){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createMonacoEditorAPI=e.registerEditorOpener=e.registerLinkOpener=e.registerCommand=e.remeasureFonts=e.setTheme=e.defineTheme=e.tokenize=e.colorizeModelLine=e.colorize=e.colorizeElement=e.createWebWorker=e.onDidChangeModelLanguage=e.onWillDisposeModel=e.onDidCreateModel=e.getModels=e.getModel=e.onDidChangeMarkers=e.getModelMarkers=e.removeAllMarkers=e.setModelMarkers=e.setModelLanguage=e.createModel=e.addKeybindingRules=e.addKeybindingRule=e.addEditorAction=e.addCommand=e.createMultiFileDiffEditor=e.createDiffEditor=e.getDiffEditors=e.getEditors=e.onDidCreateDiffEditor=e.onDidCreateEditor=e.create=void 0;function N(Ce,Se,_e){return h.StandaloneServices.initialize(_e||{}).createInstance(g.StandaloneEditor,Ce,Se)}e.create=N;function M(Ce){return h.StandaloneServices.get(_.ICodeEditorService).onCodeEditorAdd(_e=>{Ce(_e)})}e.onDidCreateEditor=M;function R(Ce){return h.StandaloneServices.get(_.ICodeEditorService).onDiffEditorAdd(_e=>{Ce(_e)})}e.onDidCreateDiffEditor=R;function x(){return h.StandaloneServices.get(_.ICodeEditorService).listCodeEditors()}e.getEditors=x;function O(){return h.StandaloneServices.get(_.ICodeEditorService).listDiffEditors()}e.getDiffEditors=O;function B(Ce,Se,_e){return h.StandaloneServices.initialize(_e||{}).createInstance(g.StandaloneDiffEditor2,Ce,Se)}e.createDiffEditor=B;function W(Ce,Se){const _e=h.StandaloneServices.initialize(Se||{});return new P.MultiDiffEditorWidget(Ce,{},_e)}e.createMultiFileDiffEditor=W;function V(Ce){if(typeof Ce.id!="string"||typeof Ce.run!="function")throw new Error("Invalid command descriptor, `id` and `run` are required properties!");return w.CommandsRegistry.registerCommand(Ce.id,Ce.run)}e.addCommand=V;function K(Ce){if(typeof Ce.id!="string"||typeof Ce.label!="string"||typeof Ce.run!="function")throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!");const Se=D.ContextKeyExpr.deserialize(Ce.precondition),_e=(Ae,...xe)=>p.EditorCommand.runEditorCommand(Ae,xe,Se,(Be,De,Ie)=>Promise.resolve(Ce.run(De,...Ie))),Ee=new k.DisposableStore;if(Ee.add(w.CommandsRegistry.registerCommand(Ce.id,_e)),Ce.contextMenuGroupId){const Ae={command:{id:Ce.id,title:Ce.label},when:Se,group:Ce.contextMenuGroupId,order:Ce.contextMenuOrder||0};Ee.add(C.MenuRegistry.appendMenuItem(C.MenuId.EditorContext,Ae))}if(Array.isArray(Ce.keybindings)){const Ae=h.StandaloneServices.get(I.IKeybindingService);if(!(Ae instanceof h.StandaloneKeybindingService))console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService");else{const xe=D.ContextKeyExpr.and(Se,D.ContextKeyExpr.deserialize(Ce.keybindingContext));Ee.add(Ae.addDynamicKeybindings(Ce.keybindings.map(Be=>({keybinding:Be,command:Ce.id,when:xe}))))}}return Ee}e.addEditorAction=K;function F(Ce){return q([Ce])}e.addKeybindingRule=F;function q(Ce){const Se=h.StandaloneServices.get(I.IKeybindingService);return Se instanceof h.StandaloneKeybindingService?Se.addDynamicKeybindings(Ce.map(_e=>({keybinding:_e.keybinding,command:_e.command,commandArgs:_e.commandArgs,when:D.ContextKeyExpr.deserialize(_e.when)}))):(console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"),k.Disposable.None)}e.addKeybindingRules=q;function ie(Ce,Se,_e){const Ee=h.StandaloneServices.get(r.ILanguageService),Ae=Ee.getLanguageIdByMimeType(Se)||Se;return(0,g.createTextModel)(h.StandaloneServices.get(s.IModelService),Ee,Ce,Ae,_e)}e.createModel=ie;function ae(Ce,Se){const _e=h.StandaloneServices.get(r.ILanguageService),Ee=_e.getLanguageIdByMimeType(Se)||Se||f.PLAINTEXT_LANGUAGE_ID;Ce.setLanguage(_e.createById(Ee))}e.setModelLanguage=ae;function ne(Ce,Se,_e){Ce&&h.StandaloneServices.get(T.IMarkerService).changeOne(Se,Ce.uri,_e)}e.setModelMarkers=ne;function $(Ce){h.StandaloneServices.get(T.IMarkerService).changeAll(Ce,[])}e.removeAllMarkers=$;function J(Ce){return h.StandaloneServices.get(T.IMarkerService).read(Ce)}e.getModelMarkers=J;function Q(Ce){return h.StandaloneServices.get(T.IMarkerService).onMarkerChanged(Ce)}e.onDidChangeMarkers=Q;function re(Ce){return h.StandaloneServices.get(s.IModelService).getModel(Ce)}e.getModel=re;function de(){return h.StandaloneServices.get(s.IModelService).getModels()}e.getModels=de;function he(Ce){return h.StandaloneServices.get(s.IModelService).onModelAdded(Ce)}e.onDidCreateModel=he;function me(Ce){return h.StandaloneServices.get(s.IModelService).onModelRemoved(Ce)}e.onWillDisposeModel=me;function X(Ce){return h.StandaloneServices.get(s.IModelService).onModelLanguageChanged(_e=>{Ce({model:_e.model,oldLanguage:_e.oldLanguageId})})}e.onDidChangeModelLanguage=X;function U(Ce){return(0,v.createWebWorker)(h.StandaloneServices.get(s.IModelService),h.StandaloneServices.get(u.ILanguageConfigurationService),Ce)}e.createWebWorker=U;function G(Ce,Se){const _e=h.StandaloneServices.get(r.ILanguageService),Ee=h.StandaloneServices.get(m.IStandaloneThemeService);return o.Colorizer.colorizeElement(Ee,_e,Ce,Se).then(()=>{Ee.registerEditorContainer(Ce)})}e.colorizeElement=G;function z(Ce,Se,_e){const Ee=h.StandaloneServices.get(r.ILanguageService);return h.StandaloneServices.get(m.IStandaloneThemeService).registerEditorContainer(L.mainWindow.document.body),o.Colorizer.colorize(Ee,Ce,Se,_e)}e.colorize=z;function H(Ce,Se,_e=4){return h.StandaloneServices.get(m.IStandaloneThemeService).registerEditorContainer(L.mainWindow.document.body),o.Colorizer.colorizeModelLine(Ce,Se,_e)}e.colorizeModelLine=H;function Y(Ce){const Se=t.TokenizationRegistry.get(Ce);return Se||{getInitialState:()=>c.NullState,tokenize:(_e,Ee,Ae)=>(0,c.nullTokenize)(Ce,Ae)}}function j(Ce,Se){t.TokenizationRegistry.getOrCreate(Se);const _e=Y(Se),Ee=(0,y.splitLines)(Ce),Ae=[];let xe=_e.getInitialState();for(let Be=0,De=Ee.length;Be<De;Be++){const Ie=Ee[Be],fe=_e.tokenize(Ie,!0,xe);Ae[Be]=fe.tokens,xe=fe.endState}return Ae}e.tokenize=j;function Z(Ce,Se){h.StandaloneServices.get(m.IStandaloneThemeService).defineTheme(Ce,Se)}e.defineTheme=Z;function ee(Ce){h.StandaloneServices.get(m.IStandaloneThemeService).setTheme(Ce)}e.setTheme=ee;function le(){S.FontMeasurements.clearAllFontInfos()}e.remeasureFonts=le;function ue(Ce,Se){return w.CommandsRegistry.registerCommand({id:Ce,handler:Se})}e.registerCommand=ue;function ce(Ce){return h.StandaloneServices.get(A.IOpenerService).registerOpener({async open(_e){return typeof _e=="string"&&(_e=E.URI.parse(_e)),Ce.open(_e)}})}e.registerLinkOpener=ce;function pe(Ce){return h.StandaloneServices.get(_.ICodeEditorService).registerCodeEditorOpenHandler(async(_e,Ee,Ae)=>{var xe;if(!Ee)return null;const Be=(xe=_e.options)===null||xe===void 0?void 0:xe.selection;let De;return Be&&typeof Be.endLineNumber=="number"&&typeof Be.endColumn=="number"?De=Be:Be&&(De={lineNumber:Be.startLineNumber,column:Be.startColumn}),await Ce.openCodeEditor(Ee,_e.resource,De)?Ee:null})}e.registerEditorOpener=pe;function ve(){return{create:N,getEditors:x,getDiffEditors:O,onDidCreateEditor:M,onDidCreateDiffEditor:R,createDiffEditor:B,addCommand:V,addEditorAction:K,addKeybindingRule:F,addKeybindingRules:q,createModel:ie,setModelLanguage:ae,setModelMarkers:ne,getModelMarkers:J,removeAllMarkers:$,onDidChangeMarkers:Q,getModels:de,getModel:re,onDidCreateModel:he,onWillDisposeModel:me,onDidChangeModelLanguage:X,createWebWorker:U,colorizeElement:G,colorize:z,colorizeModelLine:H,tokenize:j,defineTheme:Z,setTheme:ee,remeasureFonts:le,registerCommand:ue,registerLinkOpener:ce,registerEditorOpener:pe,AccessibilitySupport:l.AccessibilitySupport,ContentWidgetPositionPreference:l.ContentWidgetPositionPreference,CursorChangeReason:l.CursorChangeReason,DefaultEndOfLine:l.DefaultEndOfLine,EditorAutoIndentStrategy:l.EditorAutoIndentStrategy,EditorOption:l.EditorOption,EndOfLinePreference:l.EndOfLinePreference,EndOfLineSequence:l.EndOfLineSequence,MinimapPosition:l.MinimapPosition,MouseTargetType:l.MouseTargetType,OverlayWidgetPositionPreference:l.OverlayWidgetPositionPreference,OverviewRulerLane:l.OverviewRulerLane,GlyphMarginLane:l.GlyphMarginLane,RenderLineNumbersType:l.RenderLineNumbersType,RenderMinimap:l.RenderMinimap,ScrollbarVisibility:l.ScrollbarVisibility,ScrollType:l.ScrollType,TextEditorCursorBlinkingStyle:l.TextEditorCursorBlinkingStyle,TextEditorCursorStyle:l.TextEditorCursorStyle,TrackedRangeStickiness:l.TrackedRangeStickiness,WrappingIndent:l.WrappingIndent,InjectedTextCursorStops:l.InjectedTextCursorStops,PositionAffinity:l.PositionAffinity,ShowLightbulbIconMode:l.ShowLightbulbIconMode,ConfigurationChangedEvent:b.ConfigurationChangedEvent,BareFontInfo:i.BareFontInfo,FontInfo:i.FontInfo,TextModelResolvedOptions:d.TextModelResolvedOptions,FindMatch:d.FindMatch,ApplyUpdateResult:b.ApplyUpdateResult,EditorZoom:a.EditorZoom,createMultiFileDiffEditor:W,EditorType:n.EditorType,EditorOptions:b.EditorOptions}}e.createMonacoEditorAPI=ve}),define(se[937],oe([1,0,39,5,31,32,80,43,211,265,565,345,137,97,18,27]),function(te,e,L,k,y,E,S,p,_,v,b,a,i,n,t,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createMonacoLanguagesAPI=e.registerInlayHintsProvider=e.registerInlineCompletionsProvider=e.registerDocumentRangeSemanticTokensProvider=e.registerDocumentSemanticTokensProvider=e.registerSelectionRangeProvider=e.registerDeclarationProvider=e.registerFoldingRangeProvider=e.registerColorProvider=e.registerCompletionItemProvider=e.registerLinkProvider=e.registerOnTypeFormattingEditProvider=e.registerDocumentRangeFormattingEditProvider=e.registerDocumentFormattingEditProvider=e.registerCodeActionProvider=e.registerCodeLensProvider=e.registerTypeDefinitionProvider=e.registerImplementationProvider=e.registerDefinitionProvider=e.registerLinkedEditingRangeProvider=e.registerDocumentHighlightProvider=e.registerDocumentSymbolProvider=e.registerHoverProvider=e.registerSignatureHelpProvider=e.registerRenameProvider=e.registerReferenceProvider=e.setMonarchTokensProvider=e.setTokensProvider=e.registerTokensProviderFactory=e.setColorMap=e.TokenizationSupportAdapter=e.EncodedTokenizationSupportAdapter=e.setLanguageConfiguration=e.onLanguageEncountered=e.onLanguage=e.getEncodedLanguageId=e.getLanguages=e.register=void 0;function u(H){S.ModesRegistry.registerLanguage(H)}e.register=u;function f(){let H=[];return H=H.concat(S.ModesRegistry.getLanguages()),H}e.getLanguages=f;function c(H){return v.StandaloneServices.get(p.ILanguageService).languageIdCodec.encodeLanguageId(H)}e.getEncodedLanguageId=c;function d(H,Y){return v.StandaloneServices.withServices(()=>{const Z=v.StandaloneServices.get(p.ILanguageService).onDidRequestRichLanguageFeatures(ee=>{ee===H&&(Z.dispose(),Y())});return Z})}e.onLanguage=d;function s(H,Y){return v.StandaloneServices.withServices(()=>{const Z=v.StandaloneServices.get(p.ILanguageService).onDidRequestBasicLanguageFeatures(ee=>{ee===H&&(Z.dispose(),Y())});return Z})}e.onLanguageEncountered=s;function l(H,Y){if(!v.StandaloneServices.get(p.ILanguageService).isRegisteredLanguageId(H))throw new Error(`Cannot set configuration for unknown language ${H}`);return v.StandaloneServices.get(E.ILanguageConfigurationService).register(H,Y,100)}e.setLanguageConfiguration=l;class o{constructor(Y,j){this._languageId=Y,this._actual=j}dispose(){}getInitialState(){return this._actual.getInitialState()}tokenize(Y,j,Z){if(typeof this._actual.tokenize=="function")return g.adaptTokenize(this._languageId,this._actual,Y,Z);throw new Error("Not supported!")}tokenizeEncoded(Y,j,Z){const ee=this._actual.tokenizeEncoded(Y,Z);return new y.EncodedTokenizationResult(ee.tokens,ee.endState)}}e.EncodedTokenizationSupportAdapter=o;class g{constructor(Y,j,Z,ee){this._languageId=Y,this._actual=j,this._languageService=Z,this._standaloneThemeService=ee}dispose(){}getInitialState(){return this._actual.getInitialState()}static _toClassicTokens(Y,j){const Z=[];let ee=0;for(let le=0,ue=Y.length;le<ue;le++){const ce=Y[le];let pe=ce.startIndex;le===0?pe=0:pe<ee&&(pe=ee),Z[le]=new y.Token(pe,ce.scopes,j),ee=pe}return Z}static adaptTokenize(Y,j,Z,ee){const le=j.tokenize(Z,ee),ue=g._toClassicTokens(le.tokens,Y);let ce;return le.endState.equals(ee)?ce=ee:ce=le.endState,new y.TokenizationResult(ue,ce)}tokenize(Y,j,Z){return g.adaptTokenize(this._languageId,this._actual,Y,Z)}_toBinaryTokens(Y,j){const Z=Y.encodeLanguageId(this._languageId),ee=this._standaloneThemeService.getColorTheme().tokenTheme,le=[];let ue=0,ce=0;for(let ve=0,Ce=j.length;ve<Ce;ve++){const Se=j[ve],_e=ee.match(Z,Se.scopes)|1024;if(ue>0&&le[ue-1]===_e)continue;let Ee=Se.startIndex;ve===0?Ee=0:Ee<ce&&(Ee=ce),le[ue++]=Ee,le[ue++]=_e,ce=Ee}const pe=new Uint32Array(ue);for(let ve=0;ve<ue;ve++)pe[ve]=le[ve];return pe}tokenizeEncoded(Y,j,Z){const ee=this._actual.tokenize(Y,Z),le=this._toBinaryTokens(this._languageService.languageIdCodec,ee.tokens);let ue;return ee.endState.equals(Z)?ue=Z:ue=ee.endState,new y.EncodedTokenizationResult(le,ue)}}e.TokenizationSupportAdapter=g;function h(H){return typeof H.getInitialState=="function"}function m(H){return"tokenizeEncoded"in H}function C(H){return H&&typeof H.then=="function"}function w(H){const Y=v.StandaloneServices.get(i.IStandaloneThemeService);if(H){const j=[null];for(let Z=1,ee=H.length;Z<ee;Z++)j[Z]=L.Color.fromHex(H[Z]);Y.setColorMapOverride(j)}else Y.setColorMapOverride(null)}e.setColorMap=w;function D(H,Y){return m(Y)?new o(H,Y):new g(H,Y,v.StandaloneServices.get(p.ILanguageService),v.StandaloneServices.get(i.IStandaloneThemeService))}function I(H,Y){const j=new y.LazyTokenizationSupport(async()=>{const Z=await Promise.resolve(Y.create());return Z?h(Z)?D(H,Z):new a.MonarchTokenizer(v.StandaloneServices.get(p.ILanguageService),v.StandaloneServices.get(i.IStandaloneThemeService),H,(0,b.compile)(H,Z),v.StandaloneServices.get(r.IConfigurationService)):null});return y.TokenizationRegistry.registerFactory(H,j)}e.registerTokensProviderFactory=I;function T(H,Y){if(!v.StandaloneServices.get(p.ILanguageService).isRegisteredLanguageId(H))throw new Error(`Cannot set tokens provider for unknown language ${H}`);return C(Y)?I(H,{create:()=>Y}):y.TokenizationRegistry.register(H,D(H,Y))}e.setTokensProvider=T;function A(H,Y){const j=Z=>new a.MonarchTokenizer(v.StandaloneServices.get(p.ILanguageService),v.StandaloneServices.get(i.IStandaloneThemeService),H,(0,b.compile)(H,Z),v.StandaloneServices.get(r.IConfigurationService));return C(Y)?I(H,{create:()=>Y}):y.TokenizationRegistry.register(H,j(Y))}e.setMonarchTokensProvider=A;function P(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).referenceProvider.register(H,Y)}e.registerReferenceProvider=P;function N(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).renameProvider.register(H,Y)}e.registerRenameProvider=N;function M(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).signatureHelpProvider.register(H,Y)}e.registerSignatureHelpProvider=M;function R(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).hoverProvider.register(H,{provideHover:(Z,ee,le)=>{const ue=Z.getWordAtPosition(ee);return Promise.resolve(Y.provideHover(Z,ee,le)).then(ce=>{if(ce)return!ce.range&&ue&&(ce.range=new k.Range(ee.lineNumber,ue.startColumn,ee.lineNumber,ue.endColumn)),ce.range||(ce.range=new k.Range(ee.lineNumber,ee.column,ee.lineNumber,ee.column)),ce})}})}e.registerHoverProvider=R;function x(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).documentSymbolProvider.register(H,Y)}e.registerDocumentSymbolProvider=x;function O(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).documentHighlightProvider.register(H,Y)}e.registerDocumentHighlightProvider=O;function B(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).linkedEditingRangeProvider.register(H,Y)}e.registerLinkedEditingRangeProvider=B;function W(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).definitionProvider.register(H,Y)}e.registerDefinitionProvider=W;function V(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).implementationProvider.register(H,Y)}e.registerImplementationProvider=V;function K(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).typeDefinitionProvider.register(H,Y)}e.registerTypeDefinitionProvider=K;function F(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).codeLensProvider.register(H,Y)}e.registerCodeLensProvider=F;function q(H,Y,j){return v.StandaloneServices.get(t.ILanguageFeaturesService).codeActionProvider.register(H,{providedCodeActionKinds:j?.providedCodeActionKinds,documentation:j?.documentation,provideCodeActions:(ee,le,ue,ce)=>{const ve=v.StandaloneServices.get(n.IMarkerService).read({resource:ee.uri}).filter(Ce=>k.Range.areIntersectingOrTouching(Ce,le));return Y.provideCodeActions(ee,le,{markers:ve,only:ue.only,trigger:ue.trigger},ce)},resolveCodeAction:Y.resolveCodeAction})}e.registerCodeActionProvider=q;function ie(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).documentFormattingEditProvider.register(H,Y)}e.registerDocumentFormattingEditProvider=ie;function ae(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).documentRangeFormattingEditProvider.register(H,Y)}e.registerDocumentRangeFormattingEditProvider=ae;function ne(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).onTypeFormattingEditProvider.register(H,Y)}e.registerOnTypeFormattingEditProvider=ne;function $(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).linkProvider.register(H,Y)}e.registerLinkProvider=$;function J(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).completionProvider.register(H,Y)}e.registerCompletionItemProvider=J;function Q(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).colorProvider.register(H,Y)}e.registerColorProvider=Q;function re(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).foldingRangeProvider.register(H,Y)}e.registerFoldingRangeProvider=re;function de(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).declarationProvider.register(H,Y)}e.registerDeclarationProvider=de;function he(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).selectionRangeProvider.register(H,Y)}e.registerSelectionRangeProvider=he;function me(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).documentSemanticTokensProvider.register(H,Y)}e.registerDocumentSemanticTokensProvider=me;function X(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).documentRangeSemanticTokensProvider.register(H,Y)}e.registerDocumentRangeSemanticTokensProvider=X;function U(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).inlineCompletionsProvider.register(H,Y)}e.registerInlineCompletionsProvider=U;function G(H,Y){return v.StandaloneServices.get(t.ILanguageFeaturesService).inlayHintsProvider.register(H,Y)}e.registerInlayHintsProvider=G;function z(){return{register:u,getLanguages:f,onLanguage:d,onLanguageEncountered:s,getEncodedLanguageId:c,setLanguageConfiguration:l,setColorMap:w,registerTokensProviderFactory:I,setTokensProvider:T,setMonarchTokensProvider:A,registerReferenceProvider:P,registerRenameProvider:N,registerCompletionItemProvider:J,registerSignatureHelpProvider:M,registerHoverProvider:R,registerDocumentSymbolProvider:x,registerDocumentHighlightProvider:O,registerLinkedEditingRangeProvider:B,registerDefinitionProvider:W,registerImplementationProvider:V,registerTypeDefinitionProvider:K,registerCodeLensProvider:F,registerCodeActionProvider:q,registerDocumentFormattingEditProvider:ie,registerDocumentRangeFormattingEditProvider:ae,registerOnTypeFormattingEditProvider:ne,registerLinkProvider:$,registerColorProvider:Q,registerFoldingRangeProvider:re,registerDeclarationProvider:de,registerSelectionRangeProvider:he,registerDocumentSemanticTokensProvider:me,registerDocumentRangeSemanticTokensProvider:X,registerInlineCompletionsProvider:U,registerInlayHintsProvider:G,DocumentHighlightKind:_.DocumentHighlightKind,CompletionItemKind:_.CompletionItemKind,CompletionItemTag:_.CompletionItemTag,CompletionItemInsertTextRule:_.CompletionItemInsertTextRule,SymbolKind:_.SymbolKind,SymbolTag:_.SymbolTag,IndentAction:_.IndentAction,CompletionTriggerKind:_.CompletionTriggerKind,SignatureHelpTriggerKind:_.SignatureHelpTriggerKind,InlayHintKind:_.InlayHintKind,InlineCompletionTriggerKind:_.InlineCompletionTriggerKind,CodeActionTriggerType:_.CodeActionTriggerType,FoldingRangeKind:y.FoldingRangeKind,SelectedSuggestionInfo:y.SelectedSuggestionInfo}}e.createMonacoLanguagesAPI=z}),define(se[938],oe([1,0,36,338,936,937,362]),function(te,e,L,k,y,E,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.languages=e.editor=e.Token=e.Uri=e.MarkerTag=e.MarkerSeverity=e.SelectionDirection=e.Selection=e.Range=e.Position=e.KeyMod=e.KeyCode=e.Emitter=e.CancellationTokenSource=void 0,L.EditorOptions.wrappingIndent.defaultValue=0,L.EditorOptions.glyphMargin.defaultValue=!1,L.EditorOptions.autoIndent.defaultValue=3,L.EditorOptions.overviewRulerLanes.defaultValue=2,S.FormattingConflicts.setFormatterSelector((v,b,a)=>Promise.resolve(v[0]));const p=(0,k.createMonacoBaseAPI)();p.editor=(0,y.createMonacoEditorAPI)(),p.languages=(0,E.createMonacoLanguagesAPI)(),e.CancellationTokenSource=p.CancellationTokenSource,e.Emitter=p.Emitter,e.KeyCode=p.KeyCode,e.KeyMod=p.KeyMod,e.Position=p.Position,e.Range=p.Range,e.Selection=p.Selection,e.SelectionDirection=p.SelectionDirection,e.MarkerSeverity=p.MarkerSeverity,e.MarkerTag=p.MarkerTag,e.Uri=p.Uri,e.Token=p.Token,e.editor=p.editor,e.languages=p.languages;const _=globalThis.MonacoEnvironment;(_?.globalAPI||typeof define=="function"&&define.amd)&&(globalThis.monaco=p),typeof globalThis.require<"u"&&typeof globalThis.require.config=="function"&&globalThis.require.config({ignoreDuplicateModules:["vscode-languageserver-types","vscode-languageserver-types/main","vscode-languageserver-textdocument","vscode-languageserver-textdocument/main","vscode-nls","vscode-nls/vscode-nls","jsonc-parser","jsonc-parser/main","vscode-uri","vscode-uri/index","vs/basic-languages/typescript/typescript"]})});var pi=this&&this.__createBinding||(Object.create?function(te,e,L,k){k===void 0&&(k=L);var y=Object.getOwnPropertyDescriptor(e,L);(!y||("get"in y?!e.__esModule:y.writable||y.configurable))&&(y={enumerable:!0,get:function(){return e[L]}}),Object.defineProperty(te,k,y)}:function(te,e,L,k){k===void 0&&(k=L),te[k]=e[L]}),vi=this&&this.__exportStar||function(te,e){for(var L in te)L!=="default"&&!Object.prototype.hasOwnProperty.call(e,L)&&pi(e,te,L)};define(se[940],oe([1,0,938,934,829,830,802,873,874,833,921,876]),function(te,e,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),vi(L,e)})}).call(this);
+
+
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/basic-languages/monaco.contribution", ["require","require","vs/editor/editor.api"],(require)=>{
+"use strict";var moduleExports=(()=>{var y=Object.create;var g=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var A=Object.getPrototypeOf,M=Object.prototype.hasOwnProperty;var a=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(r,s)=>(typeof require<"u"?require:r)[s]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var D=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports);var l=(e,r,s,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of q(r))!M.call(e,o)&&o!==s&&g(e,o,{get:()=>r[o],enumerable:!(n=x(r,o))||n.enumerable});return e},p=(e,r,s)=>(l(e,r,"default"),s&&l(s,r,"default")),c=(e,r,s)=>(s=e!=null?y(A(e)):{},l(r||!e||!e.__esModule?g(s,"default",{value:e,enumerable:!0}):s,e));var v=D((w,d)=>{var b=c(a("vs/editor/editor.api"));d.exports=b});var t={};p(t,c(v()));var f={},m={},u=class e{static getOrCreate(r){return m[r]||(m[r]=new e(r)),m[r]}constructor(r){this._languageId=r,this._loadingTriggered=!1,this._lazyLoadPromise=new Promise((s,n)=>{this._lazyLoadPromiseResolve=s,this._lazyLoadPromiseReject=n})}load(){return this._loadingTriggered||(this._loadingTriggered=!0,f[this._languageId].loader().then(r=>this._lazyLoadPromiseResolve(r),r=>this._lazyLoadPromiseReject(r))),this._lazyLoadPromise}};function i(e){let r=e.id;f[r]=e,t.languages.register(e);let s=u.getOrCreate(r);t.languages.registerTokensProviderFactory(r,{create:async()=>(await s.load()).language}),t.languages.onLanguageEncountered(r,async()=>{let n=await s.load();t.languages.setLanguageConfiguration(r,n.conf)})}i({id:"abap",extensions:[".abap"],aliases:["abap","ABAP"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/abap/abap"],e,r)})});i({id:"apex",extensions:[".cls"],aliases:["Apex","apex"],mimetypes:["text/x-apex-source","text/x-apex"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/apex/apex"],e,r)})});i({id:"azcli",extensions:[".azcli"],aliases:["Azure CLI","azcli"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/azcli/azcli"],e,r)})});i({id:"bat",extensions:[".bat",".cmd"],aliases:["Batch","bat"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/bat/bat"],e,r)})});i({id:"bicep",extensions:[".bicep"],aliases:["Bicep"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/bicep/bicep"],e,r)})});i({id:"cameligo",extensions:[".mligo"],aliases:["Cameligo"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/cameligo/cameligo"],e,r)})});i({id:"clojure",extensions:[".clj",".cljs",".cljc",".edn"],aliases:["clojure","Clojure"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/clojure/clojure"],e,r)})});i({id:"coffeescript",extensions:[".coffee"],aliases:["CoffeeScript","coffeescript","coffee"],mimetypes:["text/x-coffeescript","text/coffeescript"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/coffee/coffee"],e,r)})});i({id:"c",extensions:[".c",".h"],aliases:["C","c"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/cpp/cpp"],e,r)})});i({id:"cpp",extensions:[".cpp",".cc",".cxx",".hpp",".hh",".hxx"],aliases:["C++","Cpp","cpp"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/cpp/cpp"],e,r)})});i({id:"csharp",extensions:[".cs",".csx",".cake"],aliases:["C#","csharp"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/csharp/csharp"],e,r)})});i({id:"csp",extensions:[],aliases:["CSP","csp"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/csp/csp"],e,r)})});i({id:"css",extensions:[".css"],aliases:["CSS","css"],mimetypes:["text/css"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/css/css"],e,r)})});i({id:"cypher",extensions:[".cypher",".cyp"],aliases:["Cypher","OpenCypher"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/cypher/cypher"],e,r)})});i({id:"dart",extensions:[".dart"],aliases:["Dart","dart"],mimetypes:["text/x-dart-source","text/x-dart"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/dart/dart"],e,r)})});i({id:"dockerfile",extensions:[".dockerfile"],filenames:["Dockerfile"],aliases:["Dockerfile"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/dockerfile/dockerfile"],e,r)})});i({id:"ecl",extensions:[".ecl"],aliases:["ECL","Ecl","ecl"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/ecl/ecl"],e,r)})});i({id:"elixir",extensions:[".ex",".exs"],aliases:["Elixir","elixir","ex"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/elixir/elixir"],e,r)})});i({id:"flow9",extensions:[".flow"],aliases:["Flow9","Flow","flow9","flow"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/flow9/flow9"],e,r)})});i({id:"fsharp",extensions:[".fs",".fsi",".ml",".mli",".fsx",".fsscript"],aliases:["F#","FSharp","fsharp"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/fsharp/fsharp"],e,r)})});i({id:"freemarker2",extensions:[".ftl",".ftlh",".ftlx"],aliases:["FreeMarker2","Apache FreeMarker2"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/freemarker2/freemarker2"],e,r)}).then(e=>e.TagAngleInterpolationDollar)});i({id:"freemarker2.tag-angle.interpolation-dollar",aliases:["FreeMarker2 (Angle/Dollar)","Apache FreeMarker2 (Angle/Dollar)"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/freemarker2/freemarker2"],e,r)}).then(e=>e.TagAngleInterpolationDollar)});i({id:"freemarker2.tag-bracket.interpolation-dollar",aliases:["FreeMarker2 (Bracket/Dollar)","Apache FreeMarker2 (Bracket/Dollar)"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/freemarker2/freemarker2"],e,r)}).then(e=>e.TagBracketInterpolationDollar)});i({id:"freemarker2.tag-angle.interpolation-bracket",aliases:["FreeMarker2 (Angle/Bracket)","Apache FreeMarker2 (Angle/Bracket)"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/freemarker2/freemarker2"],e,r)}).then(e=>e.TagAngleInterpolationBracket)});i({id:"freemarker2.tag-bracket.interpolation-bracket",aliases:["FreeMarker2 (Bracket/Bracket)","Apache FreeMarker2 (Bracket/Bracket)"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/freemarker2/freemarker2"],e,r)}).then(e=>e.TagBracketInterpolationBracket)});i({id:"freemarker2.tag-auto.interpolation-dollar",aliases:["FreeMarker2 (Auto/Dollar)","Apache FreeMarker2 (Auto/Dollar)"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/freemarker2/freemarker2"],e,r)}).then(e=>e.TagAutoInterpolationDollar)});i({id:"freemarker2.tag-auto.interpolation-bracket",aliases:["FreeMarker2 (Auto/Bracket)","Apache FreeMarker2 (Auto/Bracket)"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/freemarker2/freemarker2"],e,r)}).then(e=>e.TagAutoInterpolationBracket)});i({id:"go",extensions:[".go"],aliases:["Go"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/go/go"],e,r)})});i({id:"graphql",extensions:[".graphql",".gql"],aliases:["GraphQL","graphql","gql"],mimetypes:["application/graphql"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/graphql/graphql"],e,r)})});i({id:"handlebars",extensions:[".handlebars",".hbs"],aliases:["Handlebars","handlebars","hbs"],mimetypes:["text/x-handlebars-template"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/handlebars/handlebars"],e,r)})});i({id:"hcl",extensions:[".tf",".tfvars",".hcl"],aliases:["Terraform","tf","HCL","hcl"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/hcl/hcl"],e,r)})});i({id:"html",extensions:[".html",".htm",".shtml",".xhtml",".mdoc",".jsp",".asp",".aspx",".jshtm"],aliases:["HTML","htm","html","xhtml"],mimetypes:["text/html","text/x-jshtm","text/template","text/ng-template"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/html/html"],e,r)})});i({id:"ini",extensions:[".ini",".properties",".gitconfig"],filenames:["config",".gitattributes",".gitconfig",".editorconfig"],aliases:["Ini","ini"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/ini/ini"],e,r)})});i({id:"java",extensions:[".java",".jav"],aliases:["Java","java"],mimetypes:["text/x-java-source","text/x-java"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/java/java"],e,r)})});i({id:"javascript",extensions:[".js",".es6",".jsx",".mjs",".cjs"],firstLine:"^#!.*\\bnode",filenames:["jakefile"],aliases:["JavaScript","javascript","js"],mimetypes:["text/javascript"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/javascript/javascript"],e,r)})});i({id:"julia",extensions:[".jl"],aliases:["julia","Julia"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/julia/julia"],e,r)})});i({id:"kotlin",extensions:[".kt",".kts"],aliases:["Kotlin","kotlin"],mimetypes:["text/x-kotlin-source","text/x-kotlin"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/kotlin/kotlin"],e,r)})});i({id:"less",extensions:[".less"],aliases:["Less","less"],mimetypes:["text/x-less","text/less"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/less/less"],e,r)})});i({id:"lexon",extensions:[".lex"],aliases:["Lexon"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/lexon/lexon"],e,r)})});i({id:"lua",extensions:[".lua"],aliases:["Lua","lua"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/lua/lua"],e,r)})});i({id:"liquid",extensions:[".liquid",".html.liquid"],aliases:["Liquid","liquid"],mimetypes:["application/liquid"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/liquid/liquid"],e,r)})});i({id:"m3",extensions:[".m3",".i3",".mg",".ig"],aliases:["Modula-3","Modula3","modula3","m3"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/m3/m3"],e,r)})});i({id:"markdown",extensions:[".md",".markdown",".mdown",".mkdn",".mkd",".mdwn",".mdtxt",".mdtext"],aliases:["Markdown","markdown"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/markdown/markdown"],e,r)})});i({id:"mdx",extensions:[".mdx"],aliases:["MDX","mdx"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/mdx/mdx"],e,r)})});i({id:"mips",extensions:[".s"],aliases:["MIPS","MIPS-V"],mimetypes:["text/x-mips","text/mips","text/plaintext"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/mips/mips"],e,r)})});i({id:"msdax",extensions:[".dax",".msdax"],aliases:["DAX","MSDAX"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/msdax/msdax"],e,r)})});i({id:"mysql",extensions:[],aliases:["MySQL","mysql"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/mysql/mysql"],e,r)})});i({id:"objective-c",extensions:[".m"],aliases:["Objective-C"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/objective-c/objective-c"],e,r)})});i({id:"pascal",extensions:[".pas",".p",".pp"],aliases:["Pascal","pas"],mimetypes:["text/x-pascal-source","text/x-pascal"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/pascal/pascal"],e,r)})});i({id:"pascaligo",extensions:[".ligo"],aliases:["Pascaligo","ligo"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/pascaligo/pascaligo"],e,r)})});i({id:"perl",extensions:[".pl",".pm"],aliases:["Perl","pl"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/perl/perl"],e,r)})});i({id:"pgsql",extensions:[],aliases:["PostgreSQL","postgres","pg","postgre"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/pgsql/pgsql"],e,r)})});i({id:"php",extensions:[".php",".php4",".php5",".phtml",".ctp"],aliases:["PHP","php"],mimetypes:["application/x-php"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/php/php"],e,r)})});i({id:"pla",extensions:[".pla"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/pla/pla"],e,r)})});i({id:"postiats",extensions:[".dats",".sats",".hats"],aliases:["ATS","ATS/Postiats"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/postiats/postiats"],e,r)})});i({id:"powerquery",extensions:[".pq",".pqm"],aliases:["PQ","M","Power Query","Power Query M"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/powerquery/powerquery"],e,r)})});i({id:"powershell",extensions:[".ps1",".psm1",".psd1"],aliases:["PowerShell","powershell","ps","ps1"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/powershell/powershell"],e,r)})});i({id:"proto",extensions:[".proto"],aliases:["protobuf","Protocol Buffers"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/protobuf/protobuf"],e,r)})});i({id:"pug",extensions:[".jade",".pug"],aliases:["Pug","Jade","jade"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/pug/pug"],e,r)})});i({id:"python",extensions:[".py",".rpy",".pyw",".cpy",".gyp",".gypi"],aliases:["Python","py"],firstLine:"^#!/.*\\bpython[0-9.-]*\\b",loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/python/python"],e,r)})});i({id:"qsharp",extensions:[".qs"],aliases:["Q#","qsharp"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/qsharp/qsharp"],e,r)})});i({id:"r",extensions:[".r",".rhistory",".rmd",".rprofile",".rt"],aliases:["R","r"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/r/r"],e,r)})});i({id:"razor",extensions:[".cshtml"],aliases:["Razor","razor"],mimetypes:["text/x-cshtml"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/razor/razor"],e,r)})});i({id:"redis",extensions:[".redis"],aliases:["redis"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/redis/redis"],e,r)})});i({id:"redshift",extensions:[],aliases:["Redshift","redshift"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/redshift/redshift"],e,r)})});i({id:"restructuredtext",extensions:[".rst"],aliases:["reStructuredText","restructuredtext"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/restructuredtext/restructuredtext"],e,r)})});i({id:"ruby",extensions:[".rb",".rbx",".rjs",".gemspec",".pp"],filenames:["rakefile","Gemfile"],aliases:["Ruby","rb"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/ruby/ruby"],e,r)})});i({id:"rust",extensions:[".rs",".rlib"],aliases:["Rust","rust"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/rust/rust"],e,r)})});i({id:"sb",extensions:[".sb"],aliases:["Small Basic","sb"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/sb/sb"],e,r)})});i({id:"scala",extensions:[".scala",".sc",".sbt"],aliases:["Scala","scala","SBT","Sbt","sbt","Dotty","dotty"],mimetypes:["text/x-scala-source","text/x-scala","text/x-sbt","text/x-dotty"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/scala/scala"],e,r)})});i({id:"scheme",extensions:[".scm",".ss",".sch",".rkt"],aliases:["scheme","Scheme"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/scheme/scheme"],e,r)})});i({id:"scss",extensions:[".scss"],aliases:["Sass","sass","scss"],mimetypes:["text/x-scss","text/scss"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/scss/scss"],e,r)})});i({id:"shell",extensions:[".sh",".bash"],aliases:["Shell","sh"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/shell/shell"],e,r)})});i({id:"sol",extensions:[".sol"],aliases:["sol","solidity","Solidity"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/solidity/solidity"],e,r)})});i({id:"aes",extensions:[".aes"],aliases:["aes","sophia","Sophia"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/sophia/sophia"],e,r)})});i({id:"sparql",extensions:[".rq"],aliases:["sparql","SPARQL"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/sparql/sparql"],e,r)})});i({id:"sql",extensions:[".sql"],aliases:["SQL"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/sql/sql"],e,r)})});i({id:"st",extensions:[".st",".iecst",".iecplc",".lc3lib",".TcPOU",".TcDUT",".TcGVL",".TcIO"],aliases:["StructuredText","scl","stl"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/st/st"],e,r)})});i({id:"swift",aliases:["Swift","swift"],extensions:[".swift"],mimetypes:["text/swift"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/swift/swift"],e,r)})});i({id:"systemverilog",extensions:[".sv",".svh"],aliases:["SV","sv","SystemVerilog","systemverilog"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/systemverilog/systemverilog"],e,r)})});i({id:"verilog",extensions:[".v",".vh"],aliases:["V","v","Verilog","verilog"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/systemverilog/systemverilog"],e,r)})});i({id:"tcl",extensions:[".tcl"],aliases:["tcl","Tcl","tcltk","TclTk","tcl/tk","Tcl/Tk"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/tcl/tcl"],e,r)})});i({id:"twig",extensions:[".twig"],aliases:["Twig","twig"],mimetypes:["text/x-twig"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/twig/twig"],e,r)})});i({id:"typescript",extensions:[".ts",".tsx",".cts",".mts"],aliases:["TypeScript","ts","typescript"],mimetypes:["text/typescript"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/typescript/typescript"],e,r)})});i({id:"vb",extensions:[".vb"],aliases:["Visual Basic","vb"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/vb/vb"],e,r)})});i({id:"wgsl",extensions:[".wgsl"],aliases:["WebGPU Shading Language","WGSL","wgsl"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/wgsl/wgsl"],e,r)})});i({id:"xml",extensions:[".xml",".xsd",".dtd",".ascx",".csproj",".config",".props",".targets",".wxi",".wxl",".wxs",".xaml",".svg",".svgz",".opf",".xslt",".xsl"],firstLine:"(\\<\\?xml.*)|(\\<svg)|(\\<\\!doctype\\s+svg)",aliases:["XML","xml"],mimetypes:["text/xml","application/xml","application/xaml+xml","application/xml-dtd"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/xml/xml"],e,r)})});i({id:"yaml",extensions:[".yaml",".yml"],aliases:["YAML","yaml","YML","yml"],mimetypes:["application/x-yaml","text/x-yaml"],loader:()=>new Promise((e,r)=>{a(["vs/basic-languages/yaml/yaml"],e,r)})});})();
+return moduleExports;
+});
+
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/language/css/monaco.contribution", ["require","require","vs/editor/editor.api"],(require)=>{
+"use strict";var moduleExports=(()=>{var C=Object.create;var g=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty;var l=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,r)=>(typeof require<"u"?require:n)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var I=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports),M=(e,n)=>{for(var r in n)g(e,r,{get:n[r],enumerable:!0})},s=(e,n,r,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of b(n))!h.call(e,t)&&t!==r&&g(e,t,{get:()=>n[t],enumerable:!(a=S(n,t))||a.enumerable});return e},y=(e,n,r)=>(s(e,n,"default"),r&&s(r,n,"default")),w=(e,n,r)=>(r=e!=null?C(x(e)):{},s(n||!e||!e.__esModule?g(r,"default",{value:e,enumerable:!0}):r,e)),P=e=>s(g({},"__esModule",{value:!0}),e);var v=I((k,D)=>{var O=w(l("vs/editor/editor.api"));D.exports=O});var R={};M(R,{cssDefaults:()=>p,lessDefaults:()=>f,scssDefaults:()=>c});var o={};y(o,w(v()));var i=class{constructor(n,r,a){this._onDidChange=new o.Emitter;this._languageId=n,this.setOptions(r),this.setModeConfiguration(a)}get onDidChange(){return this._onDidChange.event}get languageId(){return this._languageId}get modeConfiguration(){return this._modeConfiguration}get diagnosticsOptions(){return this.options}get options(){return this._options}setOptions(n){this._options=n||Object.create(null),this._onDidChange.fire(this)}setDiagnosticsOptions(n){this.setOptions(n)}setModeConfiguration(n){this._modeConfiguration=n||Object.create(null),this._onDidChange.fire(this)}},d={validate:!0,lint:{compatibleVendorPrefixes:"ignore",vendorPrefix:"warning",duplicateProperties:"warning",emptyRules:"warning",importStatement:"ignore",boxModel:"ignore",universalSelector:"ignore",zeroUnits:"ignore",fontFaceProperties:"warning",hexColorLength:"error",argumentsInColorFunction:"error",unknownProperties:"warning",ieHack:"ignore",unknownVendorSpecificProperties:"ignore",propertyIgnoredDueToDisplay:"warning",important:"ignore",float:"ignore",idSelector:"ignore"},data:{useDefaultDataProvider:!0},format:{newlineBetweenSelectors:!0,newlineBetweenRules:!0,spaceAroundSelectorSeparator:!1,braceStyle:"collapse",maxPreserveNewLines:void 0,preserveNewLines:!0}},u={completionItems:!0,hovers:!0,documentSymbols:!0,definitions:!0,references:!0,documentHighlights:!0,rename:!0,colors:!0,foldingRanges:!0,diagnostics:!0,selectionRanges:!0,documentFormattingEdits:!0,documentRangeFormattingEdits:!0},p=new i("css",d,u),c=new i("scss",d,u),f=new i("less",d,u);o.languages.css={cssDefaults:p,lessDefaults:f,scssDefaults:c};function m(){return new Promise((e,n)=>{l(["vs/language/css/cssMode"],e,n)})}o.languages.onLanguage("less",()=>{m().then(e=>e.setupMode(f))});o.languages.onLanguage("scss",()=>{m().then(e=>e.setupMode(c))});o.languages.onLanguage("css",()=>{m().then(e=>e.setupMode(p))});return P(R);})();
+return moduleExports;
+});
+
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/language/html/monaco.contribution", ["require","require","vs/editor/editor.api"],(require)=>{
+"use strict";var moduleExports=(()=>{var w=Object.create;var l=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,_=Object.prototype.hasOwnProperty;var f=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,t)=>(typeof require<"u"?require:n)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var k=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports),T=(e,n)=>{for(var t in n)l(e,t,{get:n[t],enumerable:!0})},d=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of H(n))!_.call(e,o)&&o!==t&&l(e,o,{get:()=>n[o],enumerable:!(r=R(n,o))||r.enumerable});return e},b=(e,n,t)=>(d(e,n,"default"),t&&d(t,n,"default")),v=(e,n,t)=>(t=e!=null?w(O(e)):{},d(n||!e||!e.__esModule?l(t,"default",{value:e,enumerable:!0}):t,e)),A=e=>d(l({},"__esModule",{value:!0}),e);var C=k((z,h)=>{var E=v(f("vs/editor/editor.api"));h.exports=E});var V={};T(V,{handlebarDefaults:()=>M,handlebarLanguageService:()=>m,htmlDefaults:()=>x,htmlLanguageService:()=>c,razorDefaults:()=>I,razorLanguageService:()=>y,registerHTMLLanguageService:()=>s});var a={};b(a,v(C()));var p=class{constructor(n,t,r){this._onDidChange=new a.Emitter;this._languageId=n,this.setOptions(t),this.setModeConfiguration(r)}get onDidChange(){return this._onDidChange.event}get languageId(){return this._languageId}get options(){return this._options}get modeConfiguration(){return this._modeConfiguration}setOptions(n){this._options=n||Object.create(null),this._onDidChange.fire(this)}setModeConfiguration(n){this._modeConfiguration=n||Object.create(null),this._onDidChange.fire(this)}},F={tabSize:4,insertSpaces:!1,wrapLineLength:120,unformatted:'default": "a, abbr, acronym, b, bdo, big, br, button, cite, code, dfn, em, i, img, input, kbd, label, map, object, q, samp, select, small, span, strong, sub, sup, textarea, tt, var',contentUnformatted:"pre",indentInnerHtml:!1,preserveNewLines:!0,maxPreserveNewLines:void 0,indentHandlebars:!1,endWithNewline:!1,extraLiners:"head, body, /html",wrapAttributes:"auto"},u={format:F,suggest:{},data:{useDefaultDataProvider:!0}};function g(e){return{completionItems:!0,hovers:!0,documentSymbols:!0,links:!0,documentHighlights:!0,rename:!0,colors:!0,foldingRanges:!0,selectionRanges:!0,diagnostics:e===i,documentFormattingEdits:e===i,documentRangeFormattingEdits:e===i}}var i="html",D="handlebars",L="razor",c=s(i,u,g(i)),x=c.defaults,m=s(D,u,g(D)),M=m.defaults,y=s(L,u,g(L)),I=y.defaults;a.languages.html={htmlDefaults:x,razorDefaults:I,handlebarDefaults:M,htmlLanguageService:c,handlebarLanguageService:m,razorLanguageService:y,registerHTMLLanguageService:s};function P(){return new Promise((e,n)=>{f(["vs/language/html/htmlMode"],e,n)})}function s(e,n=u,t=g(e)){let r=new p(e,n,t),o,S=a.languages.onLanguage(e,async()=>{o=(await P()).setupMode(r)});return{defaults:r,dispose(){S.dispose(),o?.dispose(),o=void 0}}}return A(V);})();
+return moduleExports;
+});
+
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/language/json/monaco.contribution", ["require","require","vs/editor/editor.api"],(require)=>{
+"use strict";var moduleExports=(()=>{var y=Object.create;var i=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var N=Object.getPrototypeOf,b=Object.prototype.hasOwnProperty;var s=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,o)=>(typeof require<"u"?require:n)[o]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var O=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports),v=(e,n)=>{for(var o in n)i(e,o,{get:n[o],enumerable:!0})},g=(e,n,o,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of h(n))!b.call(e,r)&&r!==o&&i(e,r,{get:()=>n[r],enumerable:!(a=f(n,r))||a.enumerable});return e};var m=(e,n,o)=>(o=e!=null?y(N(e)):{},g(n||!e||!e.__esModule?i(o,"default",{value:e,enumerable:!0}):o,e)),x=e=>g(i({},"__esModule",{value:!0}),e);var u=O((J,c)=>{var A=m(s("vs/editor/editor.api"));c.exports=A});var C={};v(C,{getWorker:()=>S,jsonDefaults:()=>l});var t=m(u());var d=class{constructor(n,o,a){this._onDidChange=new t.Emitter;this._languageId=n,this.setDiagnosticsOptions(o),this.setModeConfiguration(a)}get onDidChange(){return this._onDidChange.event}get languageId(){return this._languageId}get modeConfiguration(){return this._modeConfiguration}get diagnosticsOptions(){return this._diagnosticsOptions}setDiagnosticsOptions(n){this._diagnosticsOptions=n||Object.create(null),this._onDidChange.fire(this)}setModeConfiguration(n){this._modeConfiguration=n||Object.create(null),this._onDidChange.fire(this)}},T={validate:!0,allowComments:!0,schemas:[],enableSchemaRequest:!1,schemaRequest:"warning",schemaValidation:"warning",comments:"error",trailingCommas:"error"},D={documentFormattingEdits:!0,documentRangeFormattingEdits:!0,completionItems:!0,hovers:!0,documentSymbols:!0,tokens:!0,colors:!0,foldingRanges:!0,diagnostics:!0,selectionRanges:!0},l=new d("json",T,D),S=()=>p().then(e=>e.getWorker());t.languages.json={jsonDefaults:l,getWorker:S};function p(){return new Promise((e,n)=>{s(["vs/language/json/jsonMode"],e,n)})}t.languages.register({id:"json",extensions:[".json",".bowerrc",".jshintrc",".jscsrc",".eslintrc",".babelrc",".har"],aliases:["JSON","json"],mimetypes:["application/json"]});t.languages.onLanguage("json",()=>{p().then(e=>e.setupMode(l))});return x(C);})();
+return moduleExports;
+});
+
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/language/typescript/monaco.contribution", ["require","require","vs/editor/editor.api"],(require)=>{
+"use strict";var moduleExports=(()=>{var N=Object.create;var d=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var R=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var c=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var w=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),A=(n,e)=>{for(var t in e)d(n,t,{get:e[t],enumerable:!0})},g=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of M(e))!F.call(n,r)&&r!==t&&d(n,r,{get:()=>e[r],enumerable:!(i=H(e,r))||i.enumerable});return n},D=(n,e,t)=>(g(n,e,"default"),t&&g(t,e,"default")),C=(n,e,t)=>(t=n!=null?N(R(n)):{},g(e||!n||!n.__esModule?d(t,"default",{value:n,enumerable:!0}):t,n)),W=n=>g(d({},"__esModule",{value:!0}),n);var _=w((B,E)=>{var V=C(c("vs/editor/editor.api"));E.exports=V});var T={};A(T,{JsxEmit:()=>f,ModuleKind:()=>b,ModuleResolutionKind:()=>O,NewLineKind:()=>y,ScriptTarget:()=>h,getJavaScriptWorker:()=>k,getTypeScriptWorker:()=>P,javascriptDefaults:()=>v,typescriptDefaults:()=>x,typescriptVersion:()=>I});var L="5.0.2";var l={};D(l,C(_()));var b=(s=>(s[s.None=0]="None",s[s.CommonJS=1]="CommonJS",s[s.AMD=2]="AMD",s[s.UMD=3]="UMD",s[s.System=4]="System",s[s.ES2015=5]="ES2015",s[s.ESNext=99]="ESNext",s))(b||{}),f=(a=>(a[a.None=0]="None",a[a.Preserve=1]="Preserve",a[a.React=2]="React",a[a.ReactNative=3]="ReactNative",a[a.ReactJSX=4]="ReactJSX",a[a.ReactJSXDev=5]="ReactJSXDev",a))(f||{}),y=(t=>(t[t.CarriageReturnLineFeed=0]="CarriageReturnLineFeed",t[t.LineFeed=1]="LineFeed",t))(y||{}),h=(o=>(o[o.ES3=0]="ES3",o[o.ES5=1]="ES5",o[o.ES2015=2]="ES2015",o[o.ES2016=3]="ES2016",o[o.ES2017=4]="ES2017",o[o.ES2018=5]="ES2018",o[o.ES2019=6]="ES2019",o[o.ES2020=7]="ES2020",o[o.ESNext=99]="ESNext",o[o.JSON=100]="JSON",o[o.Latest=99]="Latest",o))(h||{}),O=(t=>(t[t.Classic=1]="Classic",t[t.NodeJs=2]="NodeJs",t))(O||{}),m=class{constructor(e,t,i,r,p){this._onDidChange=new l.Emitter;this._onDidExtraLibsChange=new l.Emitter;this._extraLibs=Object.create(null),this._removedExtraLibs=Object.create(null),this._eagerModelSync=!1,this.setCompilerOptions(e),this.setDiagnosticsOptions(t),this.setWorkerOptions(i),this.setInlayHintsOptions(r),this.setModeConfiguration(p),this._onDidExtraLibsChangeTimeout=-1}get onDidChange(){return this._onDidChange.event}get onDidExtraLibsChange(){return this._onDidExtraLibsChange.event}get modeConfiguration(){return this._modeConfiguration}get workerOptions(){return this._workerOptions}get inlayHintsOptions(){return this._inlayHintsOptions}getExtraLibs(){return this._extraLibs}addExtraLib(e,t){let i;if(typeof t>"u"?i=`ts:extralib-${Math.random().toString(36).substring(2,15)}`:i=t,this._extraLibs[i]&&this._extraLibs[i].content===e)return{dispose:()=>{}};let r=1;return this._removedExtraLibs[i]&&(r=this._removedExtraLibs[i]+1),this._extraLibs[i]&&(r=this._extraLibs[i].version+1),this._extraLibs[i]={content:e,version:r},this._fireOnDidExtraLibsChangeSoon(),{dispose:()=>{let p=this._extraLibs[i];p&&p.version===r&&(delete this._extraLibs[i],this._removedExtraLibs[i]=r,this._fireOnDidExtraLibsChangeSoon())}}}setExtraLibs(e){for(let t in this._extraLibs)this._removedExtraLibs[t]=this._extraLibs[t].version;if(this._extraLibs=Object.create(null),e&&e.length>0)for(let t of e){let i=t.filePath||`ts:extralib-${Math.random().toString(36).substring(2,15)}`,r=t.content,p=1;this._removedExtraLibs[i]&&(p=this._removedExtraLibs[i]+1),this._extraLibs[i]={content:r,version:p}}this._fireOnDidExtraLibsChangeSoon()}_fireOnDidExtraLibsChangeSoon(){this._onDidExtraLibsChangeTimeout===-1&&(this._onDidExtraLibsChangeTimeout=window.setTimeout(()=>{this._onDidExtraLibsChangeTimeout=-1,this._onDidExtraLibsChange.fire(void 0)},0))}getCompilerOptions(){return this._compilerOptions}setCompilerOptions(e){this._compilerOptions=e||Object.create(null),this._onDidChange.fire(void 0)}getDiagnosticsOptions(){return this._diagnosticsOptions}setDiagnosticsOptions(e){this._diagnosticsOptions=e||Object.create(null),this._onDidChange.fire(void 0)}setWorkerOptions(e){this._workerOptions=e||Object.create(null),this._onDidChange.fire(void 0)}setInlayHintsOptions(e){this._inlayHintsOptions=e||Object.create(null),this._onDidChange.fire(void 0)}setMaximumWorkerIdleTime(e){}setEagerModelSync(e){this._eagerModelSync=e}getEagerModelSync(){return this._eagerModelSync}setModeConfiguration(e){this._modeConfiguration=e||Object.create(null),this._onDidChange.fire(void 0)}},I=L,S={completionItems:!0,hovers:!0,documentSymbols:!0,definitions:!0,references:!0,documentHighlights:!0,rename:!0,diagnostics:!0,documentRangeFormattingEdits:!0,signatureHelp:!0,onTypeFormattingEdits:!0,codeActions:!0,inlayHints:!0},x=new m({allowNonTsExtensions:!0,target:99},{noSemanticValidation:!1,noSyntaxValidation:!1,onlyVisible:!1},{},{},S),v=new m({allowNonTsExtensions:!0,allowJs:!0,target:99},{noSemanticValidation:!0,noSyntaxValidation:!1,onlyVisible:!1},{},{},S),P=()=>u().then(n=>n.getTypeScriptWorker()),k=()=>u().then(n=>n.getJavaScriptWorker());l.languages.typescript={ModuleKind:b,JsxEmit:f,NewLineKind:y,ScriptTarget:h,ModuleResolutionKind:O,typescriptVersion:I,typescriptDefaults:x,javascriptDefaults:v,getTypeScriptWorker:P,getJavaScriptWorker:k};function u(){return new Promise((n,e)=>{c(["vs/language/typescript/tsMode"],n,e)})}l.languages.onLanguage("typescript",()=>u().then(n=>n.setupTypeScript(x)));l.languages.onLanguage("javascript",()=>u().then(n=>n.setupJavaScript(v)));return W(T);})();
+return moduleExports;
+});
+
+define("vs/editor/editor.main", ["vs/editor/edcore.main","vs/basic-languages/monaco.contribution","vs/language/css/monaco.contribution","vs/language/html/monaco.contribution","vs/language/json/monaco.contribution","vs/language/typescript/monaco.contribution"], function(api) { return api; });
+//# sourceMappingURL=../../../min-maps/vs/editor/editor.main.js.map
\ No newline at end of file
diff --git a/public/vs/editor/editor.main.nls.de.js b/public/vs/editor/editor.main.nls.de.js
new file mode 100644
index 0000000..04e2587
--- /dev/null
+++ b/public/vs/editor/editor.main.nls.de.js
@@ -0,0 +1,15 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.de",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["Eingabe"],"vs/base/browser/ui/findinput/findInputToggles":["Gro\xDF-/Kleinschreibung beachten","Nur ganzes Wort suchen","Regul\xE4ren Ausdruck verwenden"],"vs/base/browser/ui/findinput/replaceInput":["Eingabe","Gro\xDF-/Kleinschreibung beibehalten"],"vs/base/browser/ui/hover/hoverWidget":['\xDCberpr\xFCfen Sie dies in der barrierefreien Ansicht mit "{0}".','\xDCberpr\xFCfen Sie dies in der barrierefreien Ansicht \xFCber den Befehl "Barrierefreie Ansicht \xF6ffnen", der zurzeit nicht \xFCber eine Tastenzuordnung ausgel\xF6st werden kann.'],"vs/base/browser/ui/iconLabel/iconLabelHover":["Wird geladen..."],"vs/base/browser/ui/inputbox/inputBox":["Fehler: {0}","Warnung: {0}","Info: {0}"," oder {0} f\xFCr Verlauf"," ({0} f\xFCr Verlauf)","Gel\xF6schte Eingabe"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["Ungebunden"],"vs/base/browser/ui/selectBox/selectBoxCustom":["Auswahlfeld"],"vs/base/browser/ui/toolbar/toolbar":["Weitere Aktionen..."],"vs/base/browser/ui/tree/abstractTree":["Filter","Fuzzy\xFCbereinstimmung","Zum Filtern Text eingeben","Zum Suchen eingeben","Zum Suchen eingeben","Schlie\xDFen","Kein Element gefunden."],"vs/base/common/actions":["(leer)"],"vs/base/common/errorMessage":["{0}: {1}","Ein Systemfehler ist aufgetreten ({0}).","Ein unbekannter Fehler ist aufgetreten. Weitere Details dazu finden Sie im Protokoll.","Ein unbekannter Fehler ist aufgetreten. Weitere Details dazu finden Sie im Protokoll.","{0} ({1} Fehler gesamt)","Ein unbekannter Fehler ist aufgetreten. Weitere Details dazu finden Sie im Protokoll."],"vs/base/common/keybindingLabels":["STRG","UMSCHALTTASTE","ALT","Windows","STRG","UMSCHALTTASTE","ALT","Super","Steuern","UMSCHALTTASTE","Option","Befehl","Steuern","UMSCHALTTASTE","ALT","Windows","Steuern","UMSCHALTTASTE","ALT","Super"],"vs/base/common/platform":["_"],"vs/editor/browser/controller/textAreaHandler":["Editor","Auf den Editor kann zurzeit nicht zugegriffen werden.","{0} Um den f\xFCr die Sprachausgabe optimierten Modus zu aktivieren, verwenden Sie {1}",'{0} Um den f\xFCr die Sprachausgabe optimierten Modus zu aktivieren, \xF6ffnen Sie die Schnellauswahl mit {1}, und f\xFChren Sie den Befehl "Barrierefreiheitsmodus der Bildschirmsprachausgabe umschalten" aus, der derzeit nicht \xFCber die Tastatur ausgel\xF6st werden kann.','{0} Weisen Sie eine Tastenzuordnung f\xFCr den Befehl "Barrierefreiheitsmodus der Sprachausgabe umschalten" zu, indem Sie mit auf den Editor f\xFCr Tastenzuordnungen zugreifen {1} und ihn ausf\xFChren.'],"vs/editor/browser/coreCommands":["Auch bei l\xE4ngeren Zeilen am Ende bleiben","Auch bei l\xE4ngeren Zeilen am Ende bleiben","Sekund\xE4re Cursor entfernt"],"vs/editor/browser/editorExtensions":["&&R\xFCckg\xE4ngig","R\xFCckg\xE4ngig","&&Wiederholen","Wiederholen","&&Alles ausw\xE4hlen","Alle ausw\xE4hlen"],"vs/editor/browser/widget/codeEditorWidget":["Die Anzahl der Cursor wurde auf {0} beschr\xE4nkt. Erw\xE4gen Sie die Verwendung von [Suchen und Ersetzen](https://code.visualstudio.com/docs/editor/codebasics#_find-und-ersetzen) f\xFCr gr\xF6\xDFere \xC4nderungen, oder erh\xF6hen Sie die Multicursorbegrenzungseinstellung des Editors.","Erh\xF6hen des Grenzwerts f\xFCr mehrere Cursor"],"vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer":['Symbol f\xFCr "Einf\xFCgen" im barrierefreien Diff-Viewer.','Symbol f\xFCr "Entfernen" im barrierefreien Diff-Viewer.','Symbol f\xFCr "Schlie\xDFen" im barrierefreien Diff-Viewer.',"Schlie\xDFen","Barrierefreier Diff-Viewer. Verwenden Sie den Pfeil nach oben und unten, um zu navigieren.","keine ge\xE4nderten Zeilen","1 Zeile ge\xE4ndert","{0} Zeilen ge\xE4ndert","Unterschied {0} von {1}: urspr\xFCngliche Zeile {2}, {3}, ge\xE4nderte Zeile {4}, {5}","leer","{0}: unver\xE4nderte Zeile {1}","{0} urspr\xFCngliche Zeile {1} ge\xE4nderte Zeile {2}","+ {0} ge\xE4nderte Zeile(n) {1}","\u2013 {0} Originalzeile {1}"],"vs/editor/browser/widget/diffEditor/components/diffEditorEditors":[" verwenden Sie {0}, um die Hilfe zur Barrierefreiheit zu \xF6ffnen."],"vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin":["Gel\xF6schte Zeilen kopieren","Gel\xF6schte Zeile kopieren","Ge\xE4nderte Zeilen kopieren","Ge\xE4nderte Zeile kopieren","Gel\xF6schte Zeile kopieren ({0})","Ge\xE4nderte Zeile ({0}) kopieren","Diese \xC4nderung r\xFCckg\xE4ngig machen"],"vs/editor/browser/widget/diffEditor/diffEditor.contribution":["Bei eingeschr\xE4nktem Speicherplatz Inlineansicht verwenden","Verschobene Codebl\xF6cke anzeigen","Diff-Editor","Barrierefreier Diff-Viewer","Barrierefreien Diff-Viewer \xF6ffnen",'"Unver\xE4nderte Bereiche reduzieren" umschalten','"Verschobene Codebl\xF6cke anzeigen" umschalten','"Bei eingeschr\xE4nktem Speicherplatz Inlineansicht verwenden" umschalten',"Seite wechseln","Vergleichsmodus beenden","Alle unver\xE4nderten Regionen reduzieren","Alle unver\xE4nderten Regionen anzeigen","Zum n\xE4chsten Unterschied wechseln","Zum vorherigen Unterschied wechseln"],"vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature":["Unver\xE4nderten Bereich falten","Klicken oder ziehen Sie, um oben mehr anzuzeigen.","Unver\xE4nderte Regionen anzeigen","Klicken oder ziehen Sie, um unten mehr anzuzeigen.","{0} ausgeblendete Linien","Zum Auffalten doppelklicken"],"vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature":["Code mit \xC4nderungen in Zeile {0}-{1} verschoben","Code mit \xC4nderungen aus Zeile {0}-{1} verschoben","Code in Zeile {0}-{1} verschoben","Code aus Zeile {0}-{1} verschoben"],"vs/editor/browser/widget/diffEditor/features/revertButtonsFeature":["Ausgew\xE4hlte \xC4nderungen zur\xFCcksetzen","\xC4nderung zur\xFCcksetzen"],"vs/editor/browser/widget/diffEditor/registrations.contribution":["Die Rahmenfarbe f\xFCr Text, der im Diff-Editor verschoben wurde.","Die aktive Rahmenfarbe f\xFCr Text, der im Diff-Editor verschoben wurde.","Die Farbe des Schattens um unver\xE4nderte Regionswidgets.","Zeilenformatierung f\xFCr Einf\xFCgungen im Diff-Editor","Zeilenformatierung f\xFCr Entfernungen im Diff-Editor"],"vs/editor/browser/widget/hoverWidget/hoverWidget":["Halten Sie die {0}-Taste gedr\xFCckt, um mit der Maus darauf zu zeigen."],"vs/editor/browser/widget/multiDiffEditorWidget/colors":["Die Hintergrundfarbe des Diff-Editor-Headers","Die Hintergrundfarbe des Diff-Editors f\xFCr mehrere Dateien","Die Rahmenfarbe des Diff-Editors f\xFCr mehrere Dateien"],"vs/editor/common/config/editorConfigurationSchema":["Editor","Die Anzahl der Leerzeichen, denen ein Tabstopp entspricht. Diese Einstellung wird basierend auf dem Inhalt der Datei \xFCberschrieben, wenn {0} aktiviert ist.","Die Anzahl von Leerzeichen, die f\xFCr den Einzug oder \u201EtabSize\u201C verwendet werden, um den Wert aus \u201E#editor.tabSize#\u201C zu verwenden. Diese Einstellung wird basierend auf dem Dateiinhalt \xFCberschrieben, wenn \u201E#editor.detectIndentation#\u201C aktiviert ist.","F\xFCgt beim Dr\xFCcken der TAB-Taste Leerzeichen ein. Diese Einstellung wird basierend auf dem Inhalt der Datei \xFCberschrieben, wenn {0} aktiviert ist.","Steuert, ob {0} und {1} automatisch erkannt werden, wenn eine Datei basierend auf dem Dateiinhalt ge\xF6ffnet wird.","Nachfolgende automatisch eingef\xFCgte Leerzeichen entfernen","Spezielle Behandlung f\xFCr gro\xDFe Dateien zum Deaktivieren bestimmter speicherintensiver Funktionen.","Deaktivieren Sie Word-basierte Vorschl\xE4ge.","Nur W\xF6rter aus dem aktiven Dokument vorschlagen","W\xF6rter aus allen ge\xF6ffneten Dokumenten derselben Sprache vorschlagen","W\xF6rter aus allen ge\xF6ffneten Dokumenten vorschlagen","Steuert, ob Vervollst\xE4ndigungen auf Grundlage der W\xF6rter im Dokument berechnet werden sollen, und aus welchen Dokumenten sie berechnet werden sollen.","Die semantische Hervorhebung ist f\xFCr alle Farbdesigns aktiviert.","Die semantische Hervorhebung ist f\xFCr alle Farbdesigns deaktiviert.",'Die semantische Hervorhebung wird durch die Einstellung "semanticHighlighting" des aktuellen Farbdesigns konfiguriert.',"Steuert, ob die semantische Hervorhebung f\xFCr die Sprachen angezeigt wird, die sie unterst\xFCtzen.","Lassen Sie Peek-Editoren ge\xF6ffnet, auch wenn Sie auf ihren Inhalt doppelklicken oder auf die ESCAPETASTE klicken.","Zeilen, die diese L\xE4nge \xFCberschreiten, werden aus Leistungsgr\xFCnden nicht tokenisiert","Steuert, ob die Tokenisierung asynchron auf einem Webworker erfolgen soll.","Steuert, ob die asynchrone Tokenisierung protokolliert werden soll. Nur zum Debuggen.","Steuert, ob die asynchrone Tokenisierung anhand der Legacy-Hintergrundtokenisierung \xFCberpr\xFCft werden soll. Die Tokenisierung kann verlangsamt werden. Nur zum Debuggen.","Definiert die Klammersymbole, die den Einzug vergr\xF6\xDFern oder verkleinern.","Das \xF6ffnende Klammerzeichen oder die Zeichenfolgensequenz.","Das schlie\xDFende Klammerzeichen oder die Zeichenfolgensequenz.","Definiert die Klammerpaare, die durch ihre Schachtelungsebene farbig formatiert werden, wenn die Farbgebung f\xFCr das Klammerpaar aktiviert ist.","Das \xF6ffnende Klammerzeichen oder die Zeichenfolgensequenz.","Das schlie\xDFende Klammerzeichen oder die Zeichenfolgensequenz.","Timeout in Millisekunden, nach dem die Diff-Berechnung abgebrochen wird. Bei 0 wird kein Timeout verwendet.","Maximale Dateigr\xF6\xDFe in MB, f\xFCr die Diffs berechnet werden sollen. Verwenden Sie 0, um keinen Grenzwert zu setzen.","Steuert, ob der Diff-Editor die Unterschiede nebeneinander oder im Text anzeigt.","Wenn die Breite des Diff-Editors unter diesem Wert liegt, wird die Inlineansicht verwendet.","Wenn diese Option aktiviert ist und die Breite des Editors nicht ausreicht, wird die Inlineansicht verwendet.","Wenn diese Option aktiviert ist, zeigt der Diff-Editor Pfeile in seinem Glyphenrand an, um \xC4nderungen r\xFCckg\xE4ngig zu machen.","Wenn aktiviert, ignoriert der Diff-Editor \xC4nderungen an voran- oder nachgestellten Leerzeichen.",'Steuert, ob der Diff-Editor die Indikatoren "+" und "-" f\xFCr hinzugef\xFCgte/entfernte \xC4nderungen anzeigt.',"Steuert, ob der Editor CodeLens anzeigt.","Zeilenumbr\xFCche erfolgen nie.","Der Zeilenumbruch erfolgt an der Breite des Anzeigebereichs.","Zeilen werden gem\xE4\xDF der Einstellung \u201E{0}\u201C umbrochen.","Verwendet den Legacyvergleichsalgorithmus.","Verwendet den erweiterten Vergleichsalgorithmus.","Steuert, ob der Diff-Editor unver\xE4nderte Regionen anzeigt.","Steuert, wie viele Zeilen f\xFCr unver\xE4nderte Regionen verwendet werden.","Steuert, wie viele Zeilen als Mindestwert f\xFCr unver\xE4nderte Regionen verwendet werden.","Steuert, wie viele Zeilen beim Vergleich unver\xE4nderter Regionen als Kontext verwendet werden.","Steuert, ob der Diff-Editor erkannte Codeverschiebevorg\xE4nge anzeigen soll.","Steuert, ob der diff-Editor leere Dekorationen anzeigt, um anzuzeigen, wo Zeichen eingef\xFCgt oder gel\xF6scht wurden."],"vs/editor/common/config/editorOptions":["Verwenden Sie Plattform-APIs, um zu erkennen, wenn eine Sprachausgabe angef\xFCgt ist.","Optimieren Sie diese Option f\xFCr die Verwendung mit einer Sprachausgabe.","Hiermit wird angenommen, dass keine Sprachausgabe angef\xFCgt ist.","Steuert, ob die Benutzeroberfl\xE4che in einem Modus ausgef\xFChrt werden soll, in dem sie f\xFCr Sprachausgaben optimiert ist.","Steuert, ob beim Kommentieren ein Leerzeichen eingef\xFCgt wird.","Steuert, ob leere Zeilen bei Umschalt-, Hinzuf\xFCgungs- oder Entfernungsaktionen f\xFCr Zeilenkommentare ignoriert werden sollen.","Steuert, ob ein Kopiervorgang ohne Auswahl die aktuelle Zeile kopiert.","Steuert, ob der Cursor bei der Suche nach \xDCbereinstimmungen w\xE4hrend der Eingabe springt.","Suchzeichenfolge niemals aus der Editorauswahl seeden.","Suchzeichenfolge immer aus der Editorauswahl seeden, einschlie\xDFlich Wort an Cursorposition.","Suchzeichenfolge nur aus der Editorauswahl seeden.",'Steuert, ob f\xFCr die Suchzeichenfolge im Widget "Suche" ein Seeding aus der Auswahl des Editors ausgef\xFChrt wird.','"In Auswahl suchen" niemals automatisch aktivieren (Standard).','"In Auswahl suchen" immer automatisch aktivieren.','"In Auswahl suchen" automatisch aktivieren, wenn mehrere Inhaltszeilen ausgew\xE4hlt sind.','Steuert die Bedingung zum automatischen Aktivieren von "In Auswahl suchen".','Steuert, ob das Widget "Suche" die freigegebene Suchzwischenablage unter macOS lesen oder bearbeiten soll.','Steuert, ob das Suchwidget zus\xE4tzliche Zeilen im oberen Bereich des Editors hinzuf\xFCgen soll. Wenn die Option auf "true" festgelegt ist, k\xF6nnen Sie \xFCber die erste Zeile hinaus scrollen, wenn das Suchwidget angezeigt wird.',"Steuert, ob die Suche automatisch am Anfang (oder am Ende) neu gestartet wird, wenn keine weiteren \xDCbereinstimmungen gefunden werden.",'Hiermit werden Schriftligaturen (Schriftartfeatures "calt" und "liga") aktiviert/deaktiviert. \xC4ndern Sie diesen Wert in eine Zeichenfolge, um die CSS-Eigenschaft "font-feature-settings" detailliert zu steuern.','Explizite CSS-Eigenschaft "font-feature-settings". Stattdessen kann ein boolescher Wert \xFCbergeben werden, wenn nur Ligaturen aktiviert/deaktiviert werden m\xFCssen.','Hiermit werden Schriftligaturen oder Schriftartfeatures konfiguriert. Hierbei kann es sich entweder um einen booleschen Wert zum Aktivieren oder Deaktivieren von Ligaturen oder um eine Zeichenfolge f\xFCr den Wert der CSS-Eigenschaft "font-feature-settings" handeln.',"Aktiviert/deaktiviert die \xDCbersetzung von \u201Efont-weight\u201C in \u201Efont-variation-settings\u201C. \xC4ndern Sie dies in eine Zeichenfolge f\xFCr eine differenzierte Steuerung der CSS-Eigenschaft \u201Efont-variation-settings\u201C.","Explizite CSS-Eigenschaft \u201Efont-variation-settings\u201C. Stattdessen kann ein boolescher Wert eingeben werden, wenn nur \u201Efont-weight\u201C in \u201Efont-variation-settings\u201C \xFCbersetzt werden muss.","Konfiguriert Variationen der Schriftart. Kann entweder ein boolescher Wert zum Aktivieren/Deaktivieren der \xDCbersetzung von \u201Efont-weight\u201C in \u201Efont-variation-settings\u201C oder eine Zeichenfolge f\xFCr den Wert der CSS-Eigenschaft \u201Efont-variation-settings\u201C sein.","Legt die Schriftgr\xF6\xDFe in Pixeln fest.",'Es sind nur die Schl\xFCsselw\xF6rter "normal" und "bold" sowie Zahlen zwischen 1 und 1000 zul\xE4ssig.','Steuert die Schriftbreite. Akzeptiert die Schl\xFCsselw\xF6rter "normal" und "bold" sowie Zahlen zwischen 1 und 1000.',"Vorschauansicht der Ergebnisse anzeigen (Standardeinstellung)","Zum Hauptergebnis gehen und Vorschauansicht anzeigen","Wechseln Sie zum prim\xE4ren Ergebnis, und aktivieren Sie die Navigation ohne Vorschau zu anderen Ergebnissen.",'Diese Einstellung ist veraltet. Verwenden Sie stattdessen separate Einstellungen wie "editor.editor.gotoLocation.multipleDefinitions" oder "editor.editor.gotoLocation.multipleImplementations".','Legt das Verhalten des Befehls "Gehe zu Definition" fest, wenn mehrere Zielpositionen vorhanden sind','Legt das Verhalten des Befehls "Gehe zur Typdefinition" fest, wenn mehrere Zielpositionen vorhanden sind.','Legt das Verhalten des Befehls "Gehe zu Deklaration" fest, wenn mehrere Zielpositionen vorhanden sind.','Legt das Verhalten des Befehls "Gehe zu Implementierungen", wenn mehrere Zielspeicherorte vorhanden sind','Legt das Verhalten des Befehls "Gehe zu Verweisen" fest, wenn mehrere Zielpositionen vorhanden sind','Die alternative Befehls-ID, die ausgef\xFChrt wird, wenn das Ergebnis von "Gehe zu Definition" die aktuelle Position ist.','Die alternative Befehls-ID, die ausgef\xFChrt wird, wenn das Ergebnis von "Gehe zu Typdefinition" die aktuelle Position ist.','Die alternative Befehls-ID, die ausgef\xFChrt wird, wenn das Ergebnis von "Gehe zu Deklaration" der aktuelle Speicherort ist.','Die alternative Befehls-ID, die ausgef\xFChrt wird, wenn das Ergebnis von "Gehe zu Implementatierung" der aktuelle Speicherort ist.','Die alternative Befehls-ID, die ausgef\xFChrt wird, wenn das Ergebnis von "Gehe zu Verweis" die aktuelle Position ist.',"Steuert, ob die Hovermarkierung angezeigt wird.","Steuert die Verz\xF6gerung in Millisekunden, nach der die Hovermarkierung angezeigt wird.","Steuert, ob die Hovermarkierung sichtbar bleiben soll, wenn der Mauszeiger dar\xFCber bewegt wird.",'Steuert die Verz\xF6gerung in Millisekunden, nach der die Hovermarkierung ausgeblendet wird. Erfordert die Aktivierung von "editor.hover.sticky".',"Zeigen Sie den Mauszeiger lieber \xFCber der Linie an, wenn Platz vorhanden ist.","Es wird angenommen, dass alle Zeichen gleich breit sind. Dies ist ein schneller Algorithmus, der f\xFCr Festbreitenschriftarten und bestimmte Alphabete (wie dem lateinischen), bei denen die Glyphen gleich breit sind, korrekt funktioniert.","Delegiert die Berechnung von Umbruchpunkten an den Browser. Dies ist ein langsamer Algorithmus, der bei gro\xDFen Dateien Code Freezes verursachen kann, aber in allen F\xE4llen korrekt funktioniert.",'Steuert den Algorithmus, der Umbruchpunkte berechnet. Beachten Sie, dass "advanced" im Barrierefreiheitsmodus f\xFCr eine optimale Benutzererfahrung verwendet wird.',"Codeaktionsmen\xFC deaktivieren.","Zeigt das Codeaktionsmen\xFC an, wenn sich der Cursor in Zeilen mit Code befindet.","Zeigt das Codeaktionsmen\xFC an, wenn sich der Cursor in Zeilen mit Code oder in leeren Zeilen befindet.","Aktiviert das Gl\xFChlampensymbol f\xFCr Codeaktionen im Editor.","Zeigt die geschachtelten aktuellen Bereiche w\xE4hrend des Bildlaufs am oberen Rand des Editors an.","Definiert die maximale Anzahl fixierter Zeilen, die angezeigt werden sollen.","Legt das Modell fest, das zur Bestimmung der zu fixierenden Zeilen verwendet wird. Existiert das Gliederungsmodell nicht, wird auf das Modell des Folding Providers zur\xFCckgegriffen, der wiederum auf das Einr\xFCckungsmodell zur\xFCckgreift. Diese Reihenfolge wird in allen drei F\xE4llen beachtet.","Hiermit aktivieren Sie das Scrollen mit fixiertem Bildlauf mit der horizontalen Scrollleiste des Editors.","Aktiviert die Inlay-Hinweise im Editor.","Inlay-Hinweise sind aktiviert","Inlay-Hinweise werden standardm\xE4\xDFig angezeigt und ausgeblendet, wenn Sie {0} gedr\xFCckt halten","Inlayhinweise sind standardm\xE4\xDFig ausgeblendet. Sie werden angezeigt, wenn {0} gedr\xFCckt gehalten wird.","Inlay-Hinweise sind deaktiviert","Steuert den Schriftgrad von Einlapphinweisen im Editor. Standardm\xE4\xDFig wird die {0} verwendet, wenn der konfigurierte Wert kleiner als {1} oder gr\xF6\xDFer als der Schriftgrad des Editors ist.",'Steuert die Schriftartfamilie von Einlapphinweisen im Editor. Bei Festlegung auf "leer" wird die {0} verwendet.',"Aktiviert den Abstand um die Inlay-Hinweise im Editor.",`Steuert die Zeilenh\xF6he. \r
+ \u2013 Verwenden Sie 0, um die Zeilenh\xF6he automatisch anhand des Schriftgrads zu berechnen.\r
+ \u2013 Werte zwischen 0 und 8 werden als Multiplikator mit dem Schriftgrad verwendet.\r
+ \u2013 Werte gr\xF6\xDFer oder gleich 8 werden als effektive Werte verwendet.`,"Steuert, ob die Minimap angezeigt wird.","Steuert, ob die Minimap automatisch ausgeblendet wird.","Die Minimap hat die gleiche Gr\xF6\xDFe wie der Editor-Inhalt (und kann scrollen).","Die Minimap wird bei Bedarf vergr\xF6\xDFert oder verkleinert, um die H\xF6he des Editors zu f\xFCllen (kein Scrollen).","Die Minimap wird bei Bedarf verkleinert, damit sie nicht gr\xF6\xDFer als der Editor ist (kein Scrollen).","Legt die Gr\xF6\xDFe der Minimap fest.","Steuert die Seite, wo die Minimap gerendert wird.","Steuert, wann der Schieberegler f\xFCr die Minimap angezeigt wird.","Ma\xDFstab des in der Minimap gezeichneten Inhalts: 1, 2 oder 3.","Die tats\xE4chlichen Zeichen in einer Zeile rendern im Gegensatz zu Farbbl\xF6cken.","Begrenzen Sie die Breite der Minimap, um nur eine bestimmte Anzahl von Spalten zu rendern.","Steuert den Abstand zwischen dem oberen Rand des Editors und der ersten Zeile.","Steuert den Abstand zwischen dem unteren Rand des Editors und der letzten Zeile.","Aktiviert ein Pop-up, das Dokumentation und Typ eines Parameters anzeigt w\xE4hrend Sie tippen.","Steuert, ob das Men\xFC mit Parameterhinweisen zyklisch ist oder sich am Ende der Liste schlie\xDFt.","Schnelle Vorschl\xE4ge werden im Vorschlagswidget angezeigt","Schnelle Vorschl\xE4ge werden als inaktiver Text angezeigt","Schnelle Vorschl\xE4ge sind deaktiviert","Schnellvorschl\xE4ge innerhalb von Zeichenfolgen aktivieren.","Schnellvorschl\xE4ge innerhalb von Kommentaren aktivieren.","Schnellvorschl\xE4ge au\xDFerhalb von Zeichenfolgen und Kommentaren aktivieren.","Steuert, ob Vorschl\xE4ge w\xE4hrend des Tippens automatisch angezeigt werden sollen. Dies kann bei der Eingabe von Kommentaren, Zeichenketten und anderem Code kontrolliert werden. Schnellvorschl\xE4ge k\xF6nnen so konfiguriert werden, dass sie als Geistertext oder mit dem Vorschlags-Widget angezeigt werden. Beachten Sie auch die '{0}'-Einstellung, die steuert, ob Vorschl\xE4ge durch Sonderzeichen ausgel\xF6st werden.","Zeilennummern werden nicht dargestellt.","Zeilennummern werden als absolute Zahl dargestellt.","Zeilennummern werden als Abstand in Zeilen an Cursorposition dargestellt.","Zeilennummern werden alle 10 Zeilen dargestellt.","Steuert die Anzeige von Zeilennummern.","Anzahl der Zeichen aus Festbreitenschriftarten, ab der dieses Editor-Lineal gerendert wird.","Farbe dieses Editor-Lineals.","Vertikale Linien nach einer bestimmten Anzahl von Monospacezeichen rendern. Verwenden Sie mehrere Werte f\xFCr mehrere Linien. Wenn das Array leer ist, werden keine Linien gerendert.","Die vertikale Bildlaufleiste wird nur bei Bedarf angezeigt.","Die vertikale Bildlaufleiste ist immer sichtbar.","Die vertikale Bildlaufleiste wird immer ausgeblendet.","Steuert die Sichtbarkeit der vertikalen Bildlaufleiste.","Die horizontale Bildlaufleiste wird nur bei Bedarf angezeigt.","Die horizontale Bildlaufleiste ist immer sichtbar.","Die horizontale Bildlaufleiste wird immer ausgeblendet.","Steuert die Sichtbarkeit der horizontalen Bildlaufleiste.","Die Breite der vertikalen Bildlaufleiste.","Die H\xF6he der horizontalen Bildlaufleiste.","Steuert, ob Klicks nach Seite scrollen oder zur Klickposition springen.","Wenn diese Option festgelegt ist, wird die Gr\xF6\xDFe des Editorinhalts nicht durch die horizontale Scrollleiste vergr\xF6\xDFert.","Legt fest, ob alle nicht einfachen ASCII-Zeichen hervorgehoben werden. Nur Zeichen zwischen U+0020 und U+007E, Tabulator, Zeilenvorschub und Wagenr\xFCcklauf gelten als einfache ASCII-Zeichen.","Legt fest, ob Zeichen, die nur als Platzhalter dienen oder \xFCberhaupt keine Breite haben, hervorgehoben werden.","Legt fest, ob Zeichen hervorgehoben werden, die mit einfachen ASCII-Zeichen verwechselt werden k\xF6nnen, mit Ausnahme derjenigen, die im aktuellen Gebietsschema des Benutzers \xFCblich sind.","Steuert, ob Zeichen in Kommentaren auch mit Unicode-Hervorhebung versehen werden sollen.","Steuert, ob Zeichen in Zeichenfolgen auch mit Unicode-Hervorhebung versehen werden sollen.","Definiert zul\xE4ssige Zeichen, die nicht hervorgehoben werden.","Unicodezeichen, die in zul\xE4ssigen Gebietsschemas \xFCblich sind, werden nicht hervorgehoben.","Steuert, ob Inline-Vorschl\xE4ge automatisch im Editor angezeigt werden.","Die Symbolleiste \u201EInline-Vorschlag\u201C anzeigen, wenn ein Inline-Vorschlag angezeigt wird.","Die Symbolleiste \u201EInline-Vorschlag\u201C anzeigen, wenn Sie mit dem Mauszeiger auf einen Inline-Vorschlag zeigen.","Die Inlinevorschlagssymbolleiste nie anzeigen.","Steuert, wann die Inlinevorschlagssymbolleiste angezeigt werden soll.","Steuert, wie Inlinevorschl\xE4ge mit dem Vorschlagswidget interagieren. Wenn diese Option aktiviert ist, wird das Vorschlagswidget nicht automatisch angezeigt, wenn Inlinevorschl\xE4ge verf\xFCgbar sind.","Steuert die Schriftfamilie der Inlinevorschl\xE4ge.","Steuert, ob die Klammerpaar-Farbgebung aktiviert ist oder nicht. Verwenden Sie {0}, um die Hervorhebungsfarben der Klammer zu \xFCberschreiben.","Steuert, ob jeder Klammertyp \xFCber einen eigenen unabh\xE4ngigen Farbpool verf\xFCgt.","Aktiviert Klammernpaarf\xFChrungslinien.","Aktiviert Klammernpaarf\xFChrungslinien nur f\xFCr das aktive Klammerpaar.","Deaktiviert Klammernpaarf\xFChrungslinien.","Steuert, ob F\xFChrungslinien f\xFCr Klammerpaare aktiviert sind oder nicht.","Aktiviert horizontale F\xFChrungslinien als Erg\xE4nzung zu vertikalen Klammernpaarf\xFChrungslinien.","Aktiviert horizontale F\xFChrungslinien nur f\xFCr das aktive Klammerpaar.","Deaktiviert horizontale F\xFChrungslinien f\xFCr Klammernpaare.","Steuert, ob horizontale F\xFChrungslinien f\xFCr Klammernpaare aktiviert sind oder nicht.","Steuert, ob der Editor das aktive Klammerpaar hervorheben soll.","Steuert, ob der Editor Einzugsf\xFChrungslinien rendern soll.","Hebt die aktive Einzugsf\xFChrung hervor.","Hebt die aktive Einzugshilfslinie hervor, selbst wenn Klammerhilfslinien hervorgehoben sind.","Heben Sie die aktive Einzugshilfslinie nicht hervor.","Steuert, ob der Editor die aktive Einzugsf\xFChrungslinie hevorheben soll.","Vorschlag einf\xFCgen, ohne den Text auf der rechten Seite des Cursors zu \xFCberschreiben","Vorschlag einf\xFCgen und Text auf der rechten Seite des Cursors \xFCberschreiben","Legt fest, ob W\xF6rter beim Akzeptieren von Vervollst\xE4ndigungen \xFCberschrieben werden. Beachten Sie, dass dies von Erweiterungen abh\xE4ngt, die f\xFCr dieses Features aktiviert sind.","Steuert, ob Filter- und Suchvorschl\xE4ge geringf\xFCgige Tippfehler ber\xFCcksichtigen.","Steuert, ob bei der Sortierung W\xF6rter priorisiert werden, die in der N\xE4he des Cursors stehen.",'Steuert, ob gespeicherte Vorschlagauswahlen in verschiedenen Arbeitsbereichen und Fenstern gemeinsam verwendet werden (daf\xFCr ist "#editor.suggestSelection#" erforderlich).',"W\xE4hlen Sie immer einen Vorschlag aus, wenn IntelliSense automatisch ausgel\xF6st wird.","W\xE4hlen Sie niemals einen Vorschlag aus, wenn IntelliSense automatisch ausgel\xF6st wird.","W\xE4hlen Sie einen Vorschlag nur aus, wenn IntelliSense aus einem Triggerzeichen ausgel\xF6st wird.","W\xE4hlen Sie einen Vorschlag nur aus, wenn Sie IntelliSense w\xE4hrend der Eingabe ausl\xF6sen.",'Steuert, ob ein Vorschlag ausgew\xE4hlt wird, wenn das Widget angezeigt wird. Beachten Sie, dass dies nur f\xFCr automatisch ausgel\xF6ste Vorschl\xE4ge gilt ("#editor.quickSuggestions#" und "#editor.suggestOnTriggerCharacters#"), und dass ein Vorschlag immer ausgew\xE4hlt wird, wenn er explizit aufgerufen wird, z. B. \xFCber STRG+LEERTASTE.','Steuert, ob ein aktiver Schnipsel verhindert, dass der Bereich "Schnelle Vorschl\xE4ge" angezeigt wird.',"Steuert, ob Symbole in Vorschl\xE4gen ein- oder ausgeblendet werden.","Steuert die Sichtbarkeit der Statusleiste unten im Vorschlagswidget.","Steuert, ob das Ergebnis des Vorschlags im Editor in der Vorschau angezeigt werden soll.","Steuert, ob Vorschlagsdetails inline mit der Bezeichnung oder nur im Detailwidget angezeigt werden.","Diese Einstellung ist veraltet. Die Gr\xF6\xDFe des Vorschlagswidgets kann jetzt ge\xE4ndert werden.",'Diese Einstellung ist veraltet. Verwenden Sie stattdessen separate Einstellungen wie "editor.suggest.showKeywords" oder "editor.suggest.showSnippets".','Wenn aktiviert, zeigt IntelliSense "method"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "funktions"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "constructor"-Vorschl\xE4ge an.',"Wenn IntelliSense aktiviert ist, werden \u201Everaltete\u201C Vorschl\xE4ge angezeigt.","Wenn dies aktiviert ist, erfordert die IntelliSense-Filterung, dass das erste Zeichen mit einem Wortanfang \xFCbereinstimmt, z.\xA0B. \u201Ec\u201C in \u201EConsole\u201C oder \u201EWebContext\u201C, aber _nicht_ bei \u201Edescription\u201C. Wenn diese Option deaktiviert ist, zeigt IntelliSense mehr Ergebnisse an, sortiert sie aber weiterhin nach der \xDCbereinstimmungsqualit\xE4t.",'Wenn aktiviert, zeigt IntelliSense "field"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "variable"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "class"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "struct"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "interface"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "module"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "property"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "event"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "operator"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "unit"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "value"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "constant"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "enum"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "enumMember"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "keyword"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "text"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "color"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "file"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "reference"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "customcolor"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "folder"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "typeParameter"-Vorschl\xE4ge an.','Wenn aktiviert, zeigt IntelliSense "snippet"-Vorschl\xE4ge an.',"Wenn aktiviert, zeigt IntelliSense user-Vorschl\xE4ge an.","Wenn aktiviert, zeigt IntelliSense issues-Vorschl\xE4ge an.","Gibt an, ob f\xFChrende und nachstehende Leerzeichen immer ausgew\xE4hlt werden sollen.",'Gibt an, ob Unterw\xF6rter (z.\xA0B. "foo" in "fooBar" oder "foo_bar") ausgew\xE4hlt werden sollen.',"Kein Einzug. Umbrochene Zeilen beginnen bei Spalte 1.","Umbrochene Zeilen erhalten den gleichen Einzug wie das \xFCbergeordnete Element.","Umbrochene Zeilen erhalten + 1 Einzug auf das \xFCbergeordnete Element.","Umgebrochene Zeilen werden im Vergleich zum \xFCbergeordneten Element +2 einger\xFCckt.","Steuert die Einr\xFCckung der umbrochenen Zeilen.","Steuert, ob Sie eine Datei per Drag & Drop in einen Text-Editor ziehen k\xF6nnen, indem Sie die UMSCHALTTASTE gedr\xFCckt halten (anstatt die Datei in einem Editor zu \xF6ffnen).","Steuert, ob beim Ablegen von Dateien im Editor ein Widget angezeigt wird. Mit diesem Widget k\xF6nnen Sie steuern, wie die Datei ablegt wird.","Zeigt das Widget f\xFCr die Dropdownauswahl an, nachdem eine Datei im Editor abgelegt wurde.","Das Widget f\xFCr die Ablageauswahl wird nie angezeigt. Stattdessen wird immer der Standardablageanbieter verwendet.","Steuert, ob Sie Inhalte auf unterschiedliche Weise einf\xFCgen k\xF6nnen.","Steuert, ob beim Einf\xFCgen von Inhalt im Editor ein Widget angezeigt wird. Mit diesem Widget k\xF6nnen Sie steuern, wie die Datei eingef\xFCgt wird.","Das Widget f\xFCr die Einf\xFCgeauswahl anzeigen, nachdem der Inhalt in den Editor eingef\xFCgt wurde.","Das Widget f\xFCr die Einf\xFCgeauswahl wird nie angezeigt. Stattdessen wird immer das Standardeinf\xFCgeverhalten verwendet.",'Steuert, ob Vorschl\xE4ge \xFCber Commitzeichen angenommen werden sollen. In JavaScript kann ein Semikolon (";") beispielsweise ein Commitzeichen sein, das einen Vorschlag annimmt und dieses Zeichen eingibt.',"Einen Vorschlag nur mit der EINGABETASTE akzeptieren, wenn dieser eine \xC4nderung am Text vornimmt.","Steuert, ob Vorschl\xE4ge mit der EINGABETASTE (zus\xE4tzlich zur TAB-Taste) akzeptiert werden sollen. Vermeidet Mehrdeutigkeit zwischen dem Einf\xFCgen neuer Zeilen oder dem Annehmen von Vorschl\xE4gen.","Steuert die Anzahl von Zeilen im Editor, die von einer Sprachausgabe in einem Arbeitsschritt gelesen werden k\xF6nnen. Wenn eine Sprachausgabe erkannt wird, wird der Standardwert automatisch auf 500 festgelegt. Warnung: Ein Wert h\xF6her als der Standardwert, kann sich auf die Leistung auswirken.","Editor-Inhalt","Steuern Sie, ob Inlinevorschl\xE4ge von einer Sprachausgabe angek\xFCndigt werden.","Verwenden Sie Sprachkonfigurationen, um zu bestimmen, wann Klammern automatisch geschlossen werden sollen.","Schlie\xDFe Klammern nur automatisch, wenn der Cursor sich links von einem Leerzeichen befindet.","Steuert, ob der Editor automatisch Klammern schlie\xDFen soll, nachdem der Benutzer eine \xF6ffnende Klammer hinzugef\xFCgt hat.","Verwenden Sie Sprachkonfigurationen, um festzulegen, wann Kommentare automatisch geschlossen werden sollen.","Kommentare werden nur dann automatisch geschlossen, wenn sich der Cursor links von einem Leerraum befindet.","Steuert, ob der Editor Kommentare automatisch schlie\xDFen soll, nachdem die Benutzer*innen einen ersten Kommentar hinzugef\xFCgt haben.","Angrenzende schlie\xDFende Anf\xFChrungszeichen oder Klammern werden nur \xFCberschrieben, wenn sie automatisch eingef\xFCgt wurden.","Steuert, ob der Editor angrenzende schlie\xDFende Anf\xFChrungszeichen oder Klammern beim L\xF6schen entfernen soll.","Schlie\xDFende Anf\xFChrungszeichen oder Klammern werden nur \xFCberschrieben, wenn sie automatisch eingef\xFCgt wurden.","Steuert, ob der Editor schlie\xDFende Anf\xFChrungszeichen oder Klammern \xFCberschreiben soll.","Verwende die Sprachkonfiguration, um zu ermitteln, wann Anf\xFChrungsstriche automatisch geschlossen werden.","Schlie\xDFende Anf\xFChrungszeichen nur dann automatisch erg\xE4nzen, wenn der Cursor sich links von einem Leerzeichen befindet.","Steuert, ob der Editor Anf\xFChrungszeichen automatisch schlie\xDFen soll, nachdem der Benutzer ein \xF6ffnendes Anf\xFChrungszeichen hinzugef\xFCgt hat.","Der Editor f\xFCgt den Einzug nicht automatisch ein.","Der Editor beh\xE4lt den Einzug der aktuellen Zeile bei.","Der Editor beh\xE4lt den in der aktuellen Zeile definierten Einzug bei und beachtet f\xFCr Sprachen definierte Klammern.","Der Editor beh\xE4lt den Einzug der aktuellen Zeile bei, beachtet von Sprachen definierte Klammern und ruft spezielle onEnterRules-Regeln auf, die von Sprachen definiert wurden.","Der Editor beh\xE4lt den Einzug der aktuellen Zeile bei, beachtet die von Sprachen definierten Klammern, ruft von Sprachen definierte spezielle onEnterRules-Regeln auf und beachtet von Sprachen definierte indentationRules-Regeln.","Legt fest, ob der Editor den Einzug automatisch anpassen soll, wenn Benutzer Zeilen eingeben, einf\xFCgen, verschieben oder einr\xFCcken","Sprachkonfigurationen verwenden, um zu bestimmen, wann eine Auswahl automatisch umschlossen werden soll.","Mit Anf\xFChrungszeichen, nicht mit Klammern umschlie\xDFen.","Mit Klammern, nicht mit Anf\xFChrungszeichen umschlie\xDFen.","Steuert, ob der Editor die Auswahl beim Eingeben von Anf\xFChrungszeichen oder Klammern automatisch umschlie\xDFt.","Emuliert das Auswahlverhalten von Tabstoppzeichen, wenn Leerzeichen f\xFCr den Einzug verwendet werden. Die Auswahl wird an Tabstopps ausgerichtet.","Steuert, ob der Editor CodeLens anzeigt.","Steuert die Schriftfamilie f\xFCr CodeLens.","Steuert den Schriftgrad in Pixeln f\xFCr CodeLens. Bei Festlegung auf \u201E0, 90\xA0% von \u201E#editor.fontSize#\u201C verwendet.","Steuert, ob der Editor die Inline-Farbdecorators und die Farbauswahl rendern soll.","Farbauswahl sowohl beim Klicken als auch beim Daraufzeigen des Farbdekorators anzeigen","Farbauswahl beim Draufzeigen auf den Farbdekorator anzeigen","Farbauswahl beim Klicken auf den Farbdekorator anzeigen","Steuert die Bedingung, damit eine Farbauswahl aus einem Farbdekorator angezeigt wird.","Steuert die maximale Anzahl von Farb-Decorators, die in einem Editor gleichzeitig gerendert werden k\xF6nnen.","Zulassen, dass die Auswahl per Maus und Tasten die Spaltenauswahl durchf\xFChrt.","Steuert, ob Syntax-Highlighting in die Zwischenablage kopiert wird.","Steuert den Cursoranimationsstil.","Die Smooth Caret-Animation ist deaktiviert.","Die Smooth Caret-Animation ist nur aktiviert, wenn der Benutzer den Cursor mit einer expliziten Geste bewegt.","Die Smooth Caret-Animation ist immer aktiviert.","Steuert, ob die weiche Cursoranimation aktiviert werden soll.","Steuert den Cursor-Stil.","Steuert die Mindestanzahl sichtbarer f\xFChrender Zeilen\xA0(mindestens\xA00) und nachfolgender Zeilen\xA0(mindestens\xA01) um den Cursor. Dies wird in einigen anderen Editoren als \u201EscrollOff\u201C oder \u201EscrollOffset\u201C bezeichnet.",'"cursorSurroundingLines" wird nur erzwungen, wenn die Ausl\xF6sung \xFCber die Tastatur oder API erfolgt.','"cursorSurroundingLines" wird immer erzwungen.','Steuert, wann "#cursorSurroundingLines#" erzwungen werden soll.',"Steuert die Breite des Cursors, wenn `#editor.cursorStyle#` auf `line` festgelegt ist.","Steuert, ob der Editor das Verschieben einer Auswahl per Drag and Drop zul\xE4sst.","Verwenden Sie eine neue Rendering-Methode mit SVGs.","Verwenden Sie eine neue Rendering-Methode mit Schriftartzeichen.","Verwenden Sie die stabile Rendering-Methode.","Steuert, ob Leerzeichen mit einer neuen experimentellen Methode gerendert werden.","Multiplikator f\xFCr Scrollgeschwindigkeit bei Dr\xFCcken von ALT.","Steuert, ob Codefaltung im Editor aktiviert ist.","Verwenden Sie eine sprachspezifische Faltstrategie, falls verf\xFCgbar. Andernfalls wird eine einzugsbasierte verwendet.","Einzugsbasierte Faltstrategie verwenden.","Steuert die Strategie f\xFCr die Berechnung von Faltbereichen.","Steuert, ob der Editor eingefaltete Bereiche hervorheben soll.","Steuert, ob der Editor Importbereiche automatisch reduziert.","Die maximale Anzahl von faltbaren Regionen. Eine Erh\xF6hung dieses Werts kann dazu f\xFChren, dass der Editor weniger reaktionsf\xE4hig wird, wenn die aktuelle Quelle eine gro\xDFe Anzahl von faltbaren Regionen aufweist.","Steuert, ob eine Zeile aufgefaltet wird, wenn nach einer gefalteten Zeile auf den leeren Inhalt geklickt wird.","Steuert die Schriftfamilie.","Steuert, ob der Editor den eingef\xFCgten Inhalt automatisch formatieren soll. Es muss ein Formatierer vorhanden sein, der in der Lage ist, auch Dokumentbereiche zu formatieren.","Steuert, ob der Editor die Zeile nach der Eingabe automatisch formatieren soll.","Steuert, ob der Editor den vertikalen Glyphenrand rendert. Der Glyphenrand wird haupts\xE4chlich zum Debuggen verwendet.","Steuert, ob der Cursor im \xDCbersichtslineal ausgeblendet werden soll.","Legt den Abstand der Buchstaben in Pixeln fest.","Steuert, ob die verkn\xFCpfte Bearbeitung im Editor aktiviert ist. Abh\xE4ngig von der Sprache werden zugeh\xF6rige Symbole, z.\xA0B. HTML-Tags, w\xE4hrend der Bearbeitung aktualisiert.","Steuert, ob der Editor Links erkennen und anklickbar machen soll.","Passende Klammern hervorheben",'Ein Multiplikator, der f\xFCr die Mausrad-Bildlaufereignisse "deltaX" und "deltaY" verwendet werden soll.',"Schriftart des Editors vergr\xF6\xDFern, wenn das Mausrad verwendet und \u201ECmd\u201C gedr\xFCckt wird.","Schriftart des Editors vergr\xF6\xDFern, wenn das Mausrad verwendet und die STRG-TASTE gedr\xFCckt wird.","Mehrere Cursor zusammenf\xFChren, wenn sie sich \xFCberlappen.","Ist unter Windows und Linux der STRG-Taste und unter macOS der Befehlstaste zugeordnet.","Ist unter Windows und Linux der ALT-Taste und unter macOS der Wahltaste zugeordnet.",'Der Modifizierer, der zum Hinzuf\xFCgen mehrerer Cursor mit der Maus verwendet werden soll. Die Mausgesten "Gehe zu Definition" und "Link \xF6ffnen" werden so angepasst, dass sie nicht mit dem [Multicursormodifizierer](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-Modifizierer) in Konflikt stehen.',"Jeder Cursor f\xFCgt eine Textzeile ein.","Jeder Cursor f\xFCgt den vollst\xE4ndigen Text ein.","Steuert das Einf\xFCgen, wenn die Zeilenanzahl des Einf\xFCgetexts der Cursor-Anzahl entspricht.","Steuert die maximale Anzahl von Cursorn, die sich gleichzeitig in einem aktiven Editor befindet.","Hebt keine Vorkommen hervor.","Hebt Vorkommen nur in der aktuellen Datei hervor.","Experimentell: Hebt Vorkommen in allen g\xFCltigen ge\xF6ffneten Dateien hervor.","Steuert, ob Vorkommen in ge\xF6ffneten Dateien hervorgehoben werden sollen.","Steuert, ob um das \xDCbersichtslineal ein Rahmen gezeichnet werden soll.","Struktur beim \xD6ffnen des Peek-Editors fokussieren","Editor fokussieren, wenn Sie den Peek-Editor \xF6ffnen","Steuert, ob der Inline-Editor oder die Struktur im Peek-Widget fokussiert werden soll.",'Steuert, ob die Mausgeste "Gehe zu Definition" immer das Vorschauwidget \xF6ffnet.',"Steuert die Verz\xF6gerung in Millisekunden nach der Schnellvorschl\xE4ge angezeigt werden.","Steuert, ob der Editor bei Eingabe automatisch eine Umbenennung vornimmt.",'Veraltet. Verwenden Sie stattdessen "editor.linkedEditing".',"Steuert, ob der Editor Steuerzeichen rendern soll.","Letzte Zeilennummer rendern, wenn die Datei mit einem Zeilenumbruch endet.","Hebt den Bundsteg und die aktuelle Zeile hervor.","Steuert, wie der Editor die aktuelle Zeilenhervorhebung rendern soll.","Steuert, ob der Editor die aktuelle Zeilenhervorhebung nur dann rendern soll, wenn der Fokus auf dem Editor liegt.","Leerraumzeichen werden gerendert mit Ausnahme der einzelnen Leerzeichen zwischen W\xF6rtern.","Hiermit werden Leerraumzeichen nur f\xFCr ausgew\xE4hlten Text gerendert.","Nur nachstehende Leerzeichen rendern","Steuert, wie der Editor Leerzeichen rendern soll.","Steuert, ob eine Auswahl abgerundete Ecken aufweisen soll.","Steuert die Anzahl der zus\xE4tzlichen Zeichen, nach denen der Editor horizontal scrollt.","Steuert, ob der Editor jenseits der letzten Zeile scrollen wird.","Nur entlang der vorherrschenden Achse scrollen, wenn gleichzeitig vertikal und horizontal gescrollt wird. Dadurch wird ein horizontaler Versatz beim vertikalen Scrollen auf einem Trackpad verhindert.","Steuert, ob die prim\xE4re Linux-Zwischenablage unterst\xFCtzt werden soll.","Steuert, ob der Editor \xDCbereinstimmungen hervorheben soll, die der Auswahl \xE4hneln.","Steuerelemente f\xFCr die Codefaltung immer anzeigen.","Zeigen Sie niemals die Faltungssteuerelemente an, und verringern Sie die Gr\xF6\xDFe des Bundstegs.","Steuerelemente f\xFCr die Codefaltung nur anzeigen, wenn sich die Maus \xFCber dem Bundsteg befindet.","Steuert, wann die Steuerungselemente f\xFCr die Codefaltung am Bundsteg angezeigt werden.","Steuert das Ausblenden von nicht verwendetem Code.","Steuert durchgestrichene veraltete Variablen.","Zeige Schnipselvorschl\xE4ge \xFCber den anderen Vorschl\xE4gen.","Schnipselvorschl\xE4ge unter anderen Vorschl\xE4gen anzeigen.","Zeige Schnipselvorschl\xE4ge mit anderen Vorschl\xE4gen.","Keine Schnipselvorschl\xE4ge anzeigen.","Steuert, ob Codeschnipsel mit anderen Vorschl\xE4gen angezeigt und wie diese sortiert werden.","Legt fest, ob der Editor Bildl\xE4ufe animiert ausf\xFChrt.","Steuert, ob f\xFCr Benutzer*innen, die eine Sprachausgabe nutzen, bei Anzeige einer Inlinevervollst\xE4ndigung ein Hinweis zur Barrierefreiheit angezeigt werden soll.","Schriftgrad f\xFCr das Vorschlagswidget. Bei Festlegung auf {0} wird der Wert von {1} verwendet.","Zeilenh\xF6he f\xFCr das Vorschlagswidget. Bei Festlegung auf {0} wird der Wert von {1} verwendet. Der Mindestwert ist 8.","Steuert, ob Vorschl\xE4ge automatisch angezeigt werden sollen, wenn Triggerzeichen eingegeben werden.","Immer den ersten Vorschlag ausw\xE4hlen.",'W\xE4hlen Sie die aktuellsten Vorschl\xE4ge aus, es sei denn, es wird ein Vorschlag durch eine weitere Eingabe ausgew\xE4hlt, z.B. "console.| -> console.log", weil "log" vor Kurzem abgeschlossen wurde.','W\xE4hlen Sie Vorschl\xE4ge basierend auf fr\xFCheren Pr\xE4fixen aus, die diese Vorschl\xE4ge abgeschlossen haben, z.B. "co -> console" und "con ->" const".',"Steuert, wie Vorschl\xE4ge bei Anzeige der Vorschlagsliste vorab ausgew\xE4hlt werden.","Die Tab-Vervollst\xE4ndigung f\xFCgt den passendsten Vorschlag ein, wenn auf Tab gedr\xFCckt wird.","Tab-Vervollst\xE4ndigungen deaktivieren.",'Codeschnipsel per Tab vervollst\xE4ndigen, wenn die Pr\xE4fixe \xFCbereinstimmen. Funktioniert am besten, wenn "quickSuggestions" deaktiviert sind.',"Tab-Vervollst\xE4ndigungen aktivieren.","Ungew\xF6hnliche Zeilenabschlusszeichen werden automatisch entfernt.","Ungew\xF6hnliche Zeilenabschlusszeichen werden ignoriert.","Zum Entfernen ungew\xF6hnlicher Zeilenabschlusszeichen wird eine Eingabeaufforderung angezeigt.","Entfernen Sie un\xFCbliche Zeilenabschlusszeichen, die Probleme verursachen k\xF6nnen.","Das Einf\xFCgen und L\xF6schen von Leerzeichen erfolgt nach Tabstopps.","Verwenden Sie die Standardregel f\xFCr Zeilenumbr\xFCche.","Trennstellen d\xFCrfen nicht f\xFCr Texte in Chinesisch/Japanisch/Koreanisch (CJK) verwendet werden. Das Verhalten von Nicht-CJK-Texten ist mit dem f\xFCr normales Verhalten identisch.","Steuert die Regeln f\xFCr Trennstellen, die f\xFCr Texte in Chinesisch/Japanisch/Koreanisch (CJK) verwendet werden.","Zeichen, die als Worttrennzeichen verwendet werden, wenn wortbezogene Navigationen oder Vorg\xE4nge ausgef\xFChrt werden.","Zeilenumbr\xFCche erfolgen nie.","Der Zeilenumbruch erfolgt an der Breite des Anzeigebereichs.",'Der Zeilenumbruch erfolgt bei "#editor.wordWrapColumn#".','Der Zeilenumbruch erfolgt beim Mindestanzeigebereich und "#editor.wordWrapColumn".',"Steuert, wie der Zeilenumbruch durchgef\xFChrt werden soll.",'Steuert die umschlie\xDFende Spalte des Editors, wenn "#editor.wordWrap#" den Wert "wordWrapColumn" oder "bounded" aufweist.',"Steuert, ob Inlinefarbdekorationen mithilfe des Standard-Dokumentfarbanbieters angezeigt werden sollen.","Steuert, ob der Editor Registerkarten empf\xE4ngt oder zur Navigation zur Workbench zur\xFCckgibt."],"vs/editor/common/core/editorColorRegistry":["Hintergrundfarbe zur Hervorhebung der Zeile an der Cursorposition.","Hintergrundfarbe f\xFCr den Rahmen um die Zeile an der Cursorposition.","Hintergrundfarbe der markierten Bereiche, wie z.B. Quick Open oder die Suche. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hintergrundfarbe f\xFCr den Rahmen um hervorgehobene Bereiche.",'Hintergrundfarbe des hervorgehobenen Symbols, z. B. "Gehe zu Definition" oder "Gehe zu n\xE4chster/vorheriger". Die Farbe darf nicht undurchsichtig sein, um zugrunde liegende Dekorationen nicht zu verbergen.',"Hintergrundfarbe des Rahmens um hervorgehobene Symbole","Farbe des Cursors im Editor.","Hintergrundfarbe vom Editor-Cursor. Erlaubt die Anpassung der Farbe von einem Zeichen, welches von einem Block-Cursor \xFCberdeckt wird.","Farbe der Leerzeichen im Editor.","Zeilennummernfarbe im Editor.","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im Editor.",'"editorIndentGuide.background" ist veraltet. Verwenden Sie stattdessen "editorIndentGuide.background1".',"Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im aktiven Editor.",'"editorIndentGuide.activeBackground" ist veraltet. Verwenden Sie stattdessen "editorIndentGuide.activeBackground1".',"Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im Editor (1).","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im Editor (2).","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im Editor (3).","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im Editor (4).","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im Editor (5).","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im Editor (6).","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im aktiven Editor (1).","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im aktiven Editor (2).","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im aktiven Editor (3).","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im aktiven Editor (4).","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im aktiven Editor (5).","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im aktiven Editor (6).","Zeilennummernfarbe der aktiven Editorzeile.",'Die ID ist veraltet. Verwenden Sie stattdessen "editorLineNumber.activeForeground".',"Zeilennummernfarbe der aktiven Editorzeile.","Die Farbe der letzten Editor-Zeile, wenn \u201Eeditor.renderFinalNewline\u201C auf \u201Eabgeblendet\u201C festgelegt ist.","Farbe des Editor-Lineals.","Vordergrundfarbe der CodeLens-Links im Editor","Hintergrundfarbe f\xFCr zusammengeh\xF6rige Klammern","Farbe f\xFCr zusammengeh\xF6rige Klammern","Farbe des Rahmens f\xFCr das \xDCbersicht-Lineal.","Hintergrundfarbe des Editor-\xDCbersichtslineals.","Hintergrundfarbe der Editorleiste. Die Leiste enth\xE4lt die Glyphenr\xE4nder und die Zeilennummern.","Rahmenfarbe unn\xF6tigen (nicht genutzten) Quellcodes im Editor.",'Deckkraft des unn\xF6tigen (nicht genutzten) Quellcodes im Editor. "#000000c0" rendert z.B. den Code mit einer Deckkraft von 75%. Verwenden Sie f\xFCr Designs mit hohem Kontrast das Farbdesign "editorUnnecessaryCode.border", um unn\xF6tigen Code zu unterstreichen statt ihn abzublenden.',"Rahmenfarbe des Ghost-Texts im Editor.","Vordergrundfarbe des Ghost-Texts im Editor.","Hintergrundfarbe des Ghost-Texts im Editor.","\xDCbersichtslinealmarkerfarbe f\xFCr das Hervorheben von Bereichen. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","\xDCbersichtslineal-Markierungsfarbe f\xFCr Fehler.","\xDCbersichtslineal-Markierungsfarbe f\xFCr Warnungen.","\xDCbersichtslineal-Markierungsfarbe f\xFCr Informationen.","Vordergrundfarbe der Klammern (1). Erfordert die Aktivierung der Farbgebung des Klammerpaars.","Vordergrundfarbe der Klammern (2). Erfordert die Aktivierung der Farbgebung des Klammerpaars.","Vordergrundfarbe der Klammern (3). Erfordert die Aktivierung der Farbgebung des Klammerpaars.","Vordergrundfarbe der Klammern (4). Erfordert die Aktivierung der Farbgebung des Klammerpaars.","Vordergrundfarbe der Klammern (5). Erfordert die Aktivierung der Farbgebung des Klammerpaars.","Vordergrundfarbe der Klammern (6). Erfordert die Aktivierung der Farbgebung des Klammerpaars.","Vordergrundfarbe der unerwarteten Klammern.","Hintergrundfarbe der inaktiven Klammerpaar-Hilfslinien (1). Erfordert das Aktivieren von Klammerpaar-Hilfslinien.","Hintergrundfarbe der inaktiven Klammerpaar-Hilfslinien (2). Erfordert das Aktivieren von Klammerpaar-Hilfslinien.","Hintergrundfarbe der inaktiven Klammerpaar-Hilfslinien (3). Erfordert das Aktivieren von Klammerpaar-Hilfslinien.","Hintergrundfarbe der inaktiven Klammerpaar-Hilfslinien (4). Erfordert das Aktivieren von Klammerpaar-Hilfslinien.","Hintergrundfarbe der inaktiven Klammerpaar-Hilfslinien (5). Erfordert das Aktivieren von Klammerpaar-Hilfslinien.","Hintergrundfarbe der inaktiven Klammerpaar-Hilfslinien (6). Erfordert das Aktivieren von Klammerpaar-Hilfslinien.","Hintergrundfarbe der aktiven Klammerpaar-Hilfslinien (1). Erfordert das Aktivieren von Klammerpaar-Hilfslinien.","Hintergrundfarbe der aktiven Klammerpaar-Hilfslinien (2). Erfordert das Aktivieren von Klammerpaar-Hilfslinien.","Hintergrundfarbe der aktiven Klammerpaar-Hilfslinien (3). Erfordert das Aktivieren von Klammerpaar-Hilfslinien.","Hintergrundfarbe der aktiven Klammerpaar-Hilfslinien (4). Erfordert das Aktivieren von Klammerpaar-Hilfslinien.","Hintergrundfarbe der aktiven Klammerpaar-Hilfslinien (5). Erfordert das Aktivieren von Klammerpaar-Hilfslinien.","Hintergrundfarbe der aktiven Klammerpaar-Hilfslinien (6). Erfordert das Aktivieren von Klammerpaar-Hilfslinien.","Rahmenfarbe, die zum Hervorheben von Unicode-Zeichen verwendet wird.","Hintergrundfarbe, die zum Hervorheben von Unicode-Zeichen verwendet wird."],"vs/editor/common/editorContextKeys":["Gibt an, ob der Editor-Text den Fokus besitzt (Cursor blinkt).","Gibt an, ob der Editor oder ein Editor-Widget den Fokus besitzt (z.\xA0B. ob der Fokus sich im Suchwidget befindet).","Gibt an, ob ein Editor oder eine Rich-Text-Eingabe den Fokus besitzt (Cursor blinkt).","Gibt an, ob der Editor schreibgesch\xFCtzt ist","Gibt an, ob der Kontext ein Diff-Editor ist.","Gibt an, ob der Kontext ein eingebetteter Diff-Editor ist.","Gibt an, ob der Kontext ein Multi-Diff-Editor ist.","Gibt an, ob alle Dateien im Multi-Diff-Editor reduziert sind","Gibt an, ob der Diff-Editor \xC4nderungen aufweist.","Gibt an, ob ein verschobener Codeblock f\xFCr den Vergleich ausgew\xE4hlt wird.","Gibt an, ob der barrierefreie Diff-Viewer sichtbar ist.",'Gibt an, ob f\xFCr den Diff-Editor der Breakpoint f\xFCr das Rendern im Modus "Parallel" oder "Inline" erreicht wurde.','Gibt an, ob "editor.columnSelection" aktiviert ist.',"Gibt an, ob im Editor Text ausgew\xE4hlt ist.","Gibt an, ob der Editor \xFCber Mehrfachauswahl verf\xFCgt.","Gibt an, ob die TAB-TASTE den Fokus aus dem Editor verschiebt.","Gibt an, ob Hover im Editor sichtbar ist.","Gibt an, ob Daraufzeigen im Editor fokussiert ist.","Gibt an, ob der Fokus auf dem Fixierten Bildlauf liegt.","Gibt an, ob der Fixierte Bildlauf sichtbar ist.","Gibt an, ob der eigenst\xE4ndige Farbw\xE4hler sichtbar ist.","Gibt an, ob der eigenst\xE4ndige Farbw\xE4hler fokussiert ist.","Gibt an, ob der Editor Bestandteil eines gr\xF6\xDFeren Editors ist (z.\xA0B. Notebooks).","Der Sprachbezeichner des Editors.","Gibt an, ob der Editor \xFCber einen Vervollst\xE4ndigungselementanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Codeaktionsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen CodeLens-Anbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Definitionsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Deklarationsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Implementierungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Typdefinitionsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Hoveranbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Dokumenthervorhebungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Dokumentsymbolanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Verweisanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Umbenennungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Signaturhilfeanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Inlinehinweisanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Dokumentformatierungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Anbieter f\xFCr Dokumentauswahlformatierung verf\xFCgt.","Gibt an, ob der Editor \xFCber mehrere Dokumentformatierungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber mehrere Anbieter f\xFCr Dokumentauswahlformatierung verf\xFCgt."],"vs/editor/common/languages":["Array","Boolescher Wert","Klasse","Konstante","Konstruktor","Enumeration","Enumerationsmember","Ereignis","Feld","Datei","Funktion","Schnittstelle","Schl\xFCssel","Methode","Modul","Namespace","NULL","Zahl","Objekt","Operator","Paket","Eigenschaft","Zeichenfolge","Struktur","Typparameter","Variable","{0} ({1})"],"vs/editor/common/languages/modesRegistry":["Nur-Text"],"vs/editor/common/model/editStack":["Eingabe"],"vs/editor/common/standaloneStrings":["Entwickler: Token \xFCberpr\xFCfen","Gehe zu Zeile/Spalte...","Alle Anbieter f\xFCr den Schnellzugriff anzeigen","Befehlspalette","Befehle anzeigen und ausf\xFChren","Gehe zu Symbol...","Gehe zu Symbol nach Kategorie...","Editor-Inhalt","Dr\xFCcken Sie ALT + F1, um die Barrierefreiheitsoptionen aufzurufen.","Zu Design mit hohem Kontrast umschalten","{0} Bearbeitungen in {1} Dateien durchgef\xFChrt"],"vs/editor/common/viewLayout/viewLineRenderer":["Mehr anzeigen ({0})","{0} Zeichen"],"vs/editor/contrib/anchorSelect/browser/anchorSelect":["Auswahlanker",'Anker festgelegt bei "{0}:{1}"',"Auswahlanker festlegen","Zu Auswahlanker wechseln","Auswahl von Anker zu Cursor","Auswahlanker abbrechen"],"vs/editor/contrib/bracketMatching/browser/bracketMatching":["\xDCbersichtslineal-Markierungsfarbe f\xFCr zusammengeh\xF6rige Klammern.","Gehe zu Klammer","Ausw\xE4hlen bis Klammer","Klammern entfernen","Gehe zu &&Klammer","Text ausw\xE4hlen und Klammern oder geschweifte Klammern einschlie\xDFen"],"vs/editor/contrib/caretOperations/browser/caretOperations":["Ausgew\xE4hlten Text nach links verschieben","Ausgew\xE4hlten Text nach rechts verschieben"],"vs/editor/contrib/caretOperations/browser/transpose":["Buchstaben austauschen"],"vs/editor/contrib/clipboard/browser/clipboard":["&&Ausschneiden","Ausschneiden","Ausschneiden","Ausschneiden","&&Kopieren","Kopieren","Kopieren","Kopieren","Kopieren als","Kopieren als","Freigeben","Freigeben","Freigeben","&&Einf\xFCgen","Einf\xFCgen","Einf\xFCgen","Einf\xFCgen","Mit Syntaxhervorhebung kopieren"],"vs/editor/contrib/codeAction/browser/codeAction":["Beim Anwenden der Code-Aktion ist ein unbekannter Fehler aufgetreten"],"vs/editor/contrib/codeAction/browser/codeActionCommands":["Art der auszuf\xFChrenden Codeaktion","Legt fest, wann die zur\xFCckgegebenen Aktionen angewendet werden","Die erste zur\xFCckgegebene Codeaktion immer anwenden","Die erste zur\xFCckgegebene Codeaktion anwenden, wenn nur eine vorhanden ist","Zur\xFCckgegebene Codeaktionen nicht anwenden","Legt fest, ob nur bevorzugte Codeaktionen zur\xFCckgegeben werden sollen","Schnelle Problembehebung ...","Keine Codeaktionen verf\xFCgbar",'Keine bevorzugten Codeaktionen f\xFCr "{0}" verf\xFCgbar','Keine Codeaktionen f\xFCr "{0}" verf\xFCgbar',"Keine bevorzugten Codeaktionen verf\xFCgbar","Keine Codeaktionen verf\xFCgbar","Refactoring durchf\xFChren...",'Keine bevorzugten Refactorings f\xFCr "{0}" verf\xFCgbar','Keine Refactorings f\xFCr "{0}" verf\xFCgbar',"Keine bevorzugten Refactorings verf\xFCgbar","Keine Refactorings verf\xFCgbar","Quellaktion...",'Keine bevorzugten Quellaktionen f\xFCr "{0}" verf\xFCgbar','Keine Quellaktionen f\xFCr "{0}" verf\xFCgbar',"Keine bevorzugten Quellaktionen verf\xFCgbar","Keine Quellaktionen verf\xFCgbar","Importe organisieren","Keine Aktion zum Organisieren von Importen verf\xFCgbar","Alle korrigieren",'Aktion "Alle korrigieren" nicht verf\xFCgbar',"Automatisch korrigieren...","Keine automatischen Korrekturen verf\xFCgbar"],"vs/editor/contrib/codeAction/browser/codeActionContributions":["Aktivieren/Deaktivieren Sie die Anzeige von Gruppenheadern im Codeaktionsmen\xFC.","Hiermit aktivieren/deaktivieren Sie die Anzeige der n\xE4chstgelegenen schnellen Problembehebung innerhalb einer Zeile, wenn derzeit keine Diagnose durchgef\xFChrt wird."],"vs/editor/contrib/codeAction/browser/codeActionController":["Kontext: {0} in Zeile {1} und Spalte {2}.","Deaktivierte Elemente ausblenden","Deaktivierte Elemente anzeigen"],"vs/editor/contrib/codeAction/browser/codeActionMenu":["Weitere Aktionen...","Schnelle Problembehebung","Extrahieren","Inline","Erneut generieren","Verschieben","Umgeben mit","Quellaktion"],"vs/editor/contrib/codeAction/browser/lightBulbWidget":["Ausf\xFChren: {0}","Zeigt Codeaktionen an. Bevorzugte Schnellkorrektur verf\xFCgbar ({0})","Codeaktionen anzeigen ({0})","Codeaktionen anzeigen"],"vs/editor/contrib/codelens/browser/codelensController":["CodeLens-Befehle f\xFCr aktuelle Zeile anzeigen","Befehl ausw\xE4hlen"],"vs/editor/contrib/colorPicker/browser/colorPickerWidget":["Zum Umschalten zwischen Farboptionen (rgb/hsl/hex) klicken","Symbol zum Schlie\xDFen des Farbw\xE4hlers"],"vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions":["Eigenst\xE4ndige Farbw\xE4hler anzeigen oder konzentrieren","&&Eigenst\xE4ndige Farbw\xE4hler anzeigen oder fokussieren","Farbw\xE4hler ausblenden","Farbe mit eigenst\xE4ndigem Farbw\xE4hler einf\xFCgen"],"vs/editor/contrib/comment/browser/comment":["Zeilenkommentar umschalten","Zeilenkommen&&tar umschalten","Zeilenkommentar hinzuf\xFCgen","Zeilenkommentar entfernen","Blockkommentar umschalten","&&Blockkommentar umschalten"],"vs/editor/contrib/contextmenu/browser/contextmenu":["Minimap","Zeichen rendern","Vertikale Gr\xF6\xDFe","Proportional","Ausf\xFCllen","Anpassen","Schieberegler","Maus \xFCber","Immer","Editor-Kontextmen\xFC anzeigen"],"vs/editor/contrib/cursorUndo/browser/cursorUndo":["Mit Cursor r\xFCckg\xE4ngig machen","Wiederholen mit Cursor"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution":["Einf\xFCgen als...","Die ID der Einf\xFCgebearbeitung, die angewendet werden soll. Wenn keine Angabe erfolgt, zeigt der Editor eine Auswahl an.","Als Text einf\xFCgen"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteController":["Gibt an, ob das Einf\xFCgewidget angezeigt wird.","Einf\xFCgeoptionen anzeigen...","Es wurden keine Einf\xFCgebearbeitungen f\xFCr \u201E{0}\u201C gefunden.","Einf\xFCgehandler werden ausgef\xFChrt. Klicken Sie hier, um den Vorgang abzubrechen.","Einf\xFCgeaktion ausw\xE4hlen","Einf\xFCgehandler werden ausgef\xFChrt"],"vs/editor/contrib/dropOrPasteInto/browser/defaultProviders":["Integriert","Nur-Text einf\xFCgen","URI einf\xFCgen","URI einf\xFCgen","Pfade einf\xFCgen","Pfad einf\xFCgen","Relative Pfade einf\xFCgen","Relativen Pfad einf\xFCgen","HTML einf\xFCgen"],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution":["Konfiguriert den Standardablageanbieter f\xFCr den Inhalt eines vorgegebenen MIME-Typs."],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController":["Gibt an, ob das Ablagewidget angezeigt wird.","Ablageoptionen anzeigen...","Drophandler werden ausgef\xFChrt. Klicken Sie hier, um den Vorgang abzubrechen."],"vs/editor/contrib/editorState/browser/keybindingCancellation":['Gibt an, ob der Editor einen abbrechbaren Vorgang ausf\xFChrt, z.\xA0B. "Verweisvorschau".'],"vs/editor/contrib/find/browser/findController":["Die Datei ist zu gro\xDF, um einen Vorgang zum Ersetzen aller Elemente auszuf\xFChren.","Suchen","&&Suchen","Mit Argumenten suchen","Mit Auswahl suchen","Weitersuchen","Vorheriges Element suchen","Zu \xDCbereinstimmung wechseln\xA0...","Keine \xDCbereinstimmungen. Versuchen Sie, nach etwas anderem zu suchen.","Geben Sie eine Zahl ein, um zu einer bestimmten \xDCbereinstimmung zu wechseln (zwischen\xA01 und {0}).","Zahl zwischen\xA01 und {0} eingeben","Zahl zwischen\xA01 und {0} eingeben","N\xE4chste Auswahl suchen","Vorherige Auswahl suchen","Ersetzen","&&Ersetzen"],"vs/editor/contrib/find/browser/findWidget":['Symbol f\xFCr "In Auswahl suchen" im Editor-Such-Widget.',"Symbol f\xFCr die Anzeige, dass das Editor-Such-Widget zugeklappt wurde.","Symbol f\xFCr die Anzeige, dass das Editor-Such-Widget aufgeklappt wurde.",'Symbol f\xFCr "Ersetzen" im Editor-Such-Widget.','Symbol f\xFCr "Alle ersetzen" im Editor-Such-Widget.','Symbol f\xFCr "Vorheriges Element suchen" im Editor-Such-Widget.','Symbol f\xFCr "N\xE4chstes Element suchen" im Editor-Such-Widget.',"Suchen/Ersetzen","Suchen","Suchen","Vorherige \xDCbereinstimmung","N\xE4chste \xDCbereinstimmung","In Auswahl suchen","Schlie\xDFen","Ersetzen","Ersetzen","Ersetzen","Alle ersetzen","Ersetzen umschalten","Nur die ersten {0} Ergebnisse wurden hervorgehoben, aber alle Suchoperationen werden auf dem gesamten Text durchgef\xFChrt.","{0} von {1}","Keine Ergebnisse","{0} gefunden",'{0} f\xFCr "{1}" gefunden','{0} f\xFCr "{1}" gefunden, bei {2}','{0} f\xFCr "{1}" gefunden','STRG+EINGABE f\xFCgt jetzt einen Zeilenumbruch ein, statt alles zu ersetzen. Sie k\xF6nnen die Tastenzuordnung f\xFCr "editor.action.replaceAll" \xE4ndern, um dieses Verhalten au\xDFer Kraft zu setzen.'],"vs/editor/contrib/folding/browser/folding":["Auffalten","Faltung rekursiv aufheben","Falten","Einklappung umschalten","Rekursiv falten","Alle Blockkommentare falten","Alle Regionen falten","Alle Regionen auffalten","Alle bis auf ausgew\xE4hlte falten","Alle bis auf ausgew\xE4hlte auffalten","Alle falten","Alle auffalten","Zur \xFCbergeordneten Reduzierung wechseln","Zum vorherigen Faltbereich wechseln","Zum n\xE4chsten Faltbereich wechseln","Faltungsbereich aus Auswahl erstellen","Manuelle Faltbereiche entfernen","Faltebene {0}"],"vs/editor/contrib/folding/browser/foldingDecorations":["Hintergrundfarbe hinter gefalteten Bereichen. Die Farbe darf nicht deckend sein, sodass zugrunde liegende Dekorationen nicht ausgeblendet werden.","Farbe des Faltsteuerelements im Editor-Bundsteg.","Symbol f\xFCr aufgeklappte Bereiche im Editor-Glyphenrand.","Symbol f\xFCr zugeklappte Bereiche im Editor-Glyphenrand.","Symbol f\xFCr manuell reduzierte Bereiche im Glyphenrand des Editors.","Symbol f\xFCr manuell erweiterte Bereiche im Glyphenrand des Editors.","Klicken Sie hier, um den Bereich zu erweitern.","Klicken Sie hier, um den Bereich zu reduzieren."],"vs/editor/contrib/fontZoom/browser/fontZoom":["Schriftgrad des Editors erh\xF6hen","Schriftgrad des Editors verringern","Editor-Schriftgrad zur\xFCcksetzen"],"vs/editor/contrib/format/browser/formatActions":["Dokument formatieren","Auswahl formatieren"],"vs/editor/contrib/gotoError/browser/gotoError":["Gehe zu n\xE4chstem Problem (Fehler, Warnung, Information)","Symbol f\xFCr den Marker zum Wechseln zum n\xE4chsten Element.","Gehe zu vorigem Problem (Fehler, Warnung, Information)","Symbol f\xFCr den Marker zum Wechseln zum vorherigen Element.","Gehe zu dem n\xE4chsten Problem in den Dateien (Fehler, Warnung, Info)","N\xE4chstes &&Problem","Gehe zu dem vorherigen Problem in den Dateien (Fehler, Warnung, Info)","Vorheriges &&Problem"],"vs/editor/contrib/gotoError/browser/gotoErrorWidget":["Fehler","Warnung","Info","Hinweis","{0} bei {1}. ","{0} von {1} Problemen","{0} von {1} Problemen","Editormarkierung: Farbe bei Fehler des Navigationswidgets.","Hintergrund der Fehler\xFCberschrift des Markernavigationswidgets im Editor.","Editormarkierung: Farbe bei Warnung des Navigationswidgets.","Hintergrund der Warnungs\xFCberschrift des Markernavigationswidgets im Editor.","Editormarkierung: Farbe bei Information des Navigationswidgets.","Hintergrund der Informations\xFCberschrift des Markernavigationswidgets im Editor.","Editormarkierung: Hintergrund des Navigationswidgets."],"vs/editor/contrib/gotoSymbol/browser/goToCommands":["Vorschau","Definitionen",'Keine Definition gefunden f\xFCr "{0}".',"Keine Definition gefunden","Gehe zu Definition","Gehe &&zu Definition","Definition an der Seite \xF6ffnen","Definition einsehen","Deklarationen",'Keine Deklaration f\xFCr "{0}" gefunden.',"Keine Deklaration gefunden.","Zur Deklaration wechseln","Gehe zu &&Deklaration",'Keine Deklaration f\xFCr "{0}" gefunden.',"Keine Deklaration gefunden.","Vorschau f\xFCr Deklaration anzeigen","Typdefinitionen",'Keine Typendefinition gefunden f\xFCr "{0}"',"Keine Typendefinition gefunden","Zur Typdefinition wechseln","Zur &&Typdefinition wechseln","Vorschau der Typdefinition anzeigen","Implementierungen",'Keine Implementierung gefunden f\xFCr "{0}"',"Keine Implementierung gefunden","Gehe zu Implementierungen","Gehe zu &&Implementierungen","Vorschau f\xFCr Implementierungen anzeigen",'F\xFCr "{0}" wurden keine Verweise gefunden.',"Keine Referenzen gefunden","Gehe zu Verweisen","Gehe zu &&Verweisen","Verweise","Vorschau f\xFCr Verweise anzeigen","Verweise","Zum beliebigem Symbol wechseln","Speicherorte",'Keine Ergebnisse f\xFCr "{0}"',"Verweise"],"vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition":["Klicken Sie, um {0} Definitionen anzuzeigen."],"vs/editor/contrib/gotoSymbol/browser/peek/referencesController":['Gibt an, ob die Verweisvorschau sichtbar ist, z.\xA0B. "Verweisvorschau" oder "Definition einsehen".',"Wird geladen...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesTree":["{0} Verweise","{0} Verweis","Verweise"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget":["Keine Vorschau verf\xFCgbar.","Keine Ergebnisse","Verweise"],"vs/editor/contrib/gotoSymbol/browser/referencesModel":["in {0} in Zeile {1} in Spalte {2}","{0} in {1} in Zeile {2} in Spalte {3}","1 Symbol in {0}, vollst\xE4ndiger Pfad {1}","{0} Symbole in {1}, vollst\xE4ndiger Pfad {2}","Es wurden keine Ergebnisse gefunden.","1 Symbol in {0} gefunden","{0} Symbole in {1} gefunden","{0} Symbole in {1} Dateien gefunden"],"vs/editor/contrib/gotoSymbol/browser/symbolNavigation":["Gibt an, ob Symbolpositionen vorliegen, bei denen die Navigation nur \xFCber die Tastatur m\xF6glich ist.","Symbol {0} von {1}, {2} f\xFCr n\xE4chstes","Symbol {0} von {1}"],"vs/editor/contrib/hover/browser/hover":["Anzeigen oder Fokus beim Daraufzeigen","Beim Daraufzeigen wird der Fokus nicht automatisch verwendet.","Beim Daraufzeigen wird nur dann den Fokus erhalten, wenn er bereits sichtbar ist.","Beim Daraufzeigen wird automatisch der Fokus erhalten, wenn er angezeigt wird.","Definitionsvorschauhover anzeigen","Bildlauf nach oben beim Daraufzeigen","Bildlauf nach unten beim Daraufzeigen","Bildlauf nach links beim Daraufzeigen","Bildlauf nach rechts beim Daraufzeigen","Eine Seite nach oben beim Daraufzeigen","Eine Seite nach unten beim Daraufzeigen","Gehe nach oben beim Daraufzeigen","Gehe nach unten beim Daraufzeigen"],"vs/editor/contrib/hover/browser/markdownHoverParticipant":["Wird geladen...","Das Rendering langer Zeilen wurde aus Leistungsgr\xFCnden angehalten. Dies kann \xFCber \u201Eeditor.stopRenderingLineAfter\u201C konfiguriert werden.","Die Tokenisierung wird bei langen Zeilen aus Leistungsgr\xFCnden \xFCbersprungen. Dies kann \xFCber \u201Eeditor.maxTokenizationLineLength\u201C konfiguriert werden."],"vs/editor/contrib/hover/browser/markerHoverParticipant":["Problem anzeigen","Keine Schnellkorrekturen verf\xFCgbar","Es wird nach Schnellkorrekturen gesucht...","Keine Schnellkorrekturen verf\xFCgbar","Schnelle Problembehebung ..."],"vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace":["Durch vorherigen Wert ersetzen","Durch n\xE4chsten Wert ersetzen"],"vs/editor/contrib/indentation/browser/indentation":["Einzug in Leerzeichen konvertieren","Einzug in Tabstopps konvertieren","Konfigurierte Tabulatorgr\xF6\xDFe","Standardregisterkartengr\xF6\xDFe","Aktuelle Registerkartengr\xF6\xDFe","Tabulatorgr\xF6\xDFe f\xFCr aktuelle Datei ausw\xE4hlen","Einzug mithilfe von Tabstopps","Einzug mithilfe von Leerzeichen","Anzeigegr\xF6\xDFe der Registerkarte \xE4ndern","Einzug aus Inhalt erkennen","Neuen Einzug f\xFCr Zeilen festlegen","Gew\xE4hlte Zeilen zur\xFCckziehen"],"vs/editor/contrib/inlayHints/browser/inlayHintsHover":["Zum Einf\xFCgen doppelklicken","BEFEHL + Klicken","STRG + Klicken","OPTION + Klicken","ALT + Klicken","Wechseln Sie zu Definition ({0}), klicken Sie mit der rechten Maustaste, um weitere Informationen zu finden.","Gehe zu Definition ({0})","Befehl ausf\xFChren"],"vs/editor/contrib/inlineCompletions/browser/commands":["N\xE4chsten Inline-Vorschlag anzeigen","Vorherigen Inline-Vorschlag anzeigen","Inline-Vorschlag ausl\xF6sen","N\xE4chstes Wort des Inline-Vorschlags annehmen","Wort annehmen","N\xE4chste Zeile des Inlinevorschlags akzeptieren","Zeile annehmen","Inline-Vorschlag annehmen","Annehmen","Inlinevorschlag ausblenden","Symbolleiste immer anzeigen"],"vs/editor/contrib/inlineCompletions/browser/hoverParticipant":["Vorschlag:"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys":["Gibt an, ob ein Inline-Vorschlag sichtbar ist.","Gibt an, ob der Inline-Vorschlag mit Leerzeichen beginnt.","Ob der Inline-Vorschlag mit Leerzeichen beginnt, das kleiner ist als das, was durch die Tabulatortaste eingef\xFCgt werden w\xFCrde","Gibt an, ob Vorschl\xE4ge f\xFCr den aktuellen Vorschlag unterdr\xFCckt werden sollen"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController":["\xDCberpr\xFCfen Sie dies in der barrierefreien Ansicht ({0})."],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget":["Symbol f\xFCr die Anzeige des n\xE4chsten Parameterhinweises.","Symbol f\xFCr die Anzeige des vorherigen Parameterhinweises.","{0} ({1})","Zur\xFCck","Weiter"],"vs/editor/contrib/lineSelection/browser/lineSelection":["Zeilenauswahl erweitern"],"vs/editor/contrib/linesOperations/browser/linesOperations":["Zeile nach oben kopieren","Zeile nach oben &&kopieren","Zeile nach unten kopieren","Zeile nach unten ko&&pieren","Auswahl duplizieren","&&Auswahl duplizieren","Zeile nach oben verschieben","Zeile nach oben &&verschieben","Zeile nach unten verschieben","Zeile nach &&unten verschieben","Zeilen aufsteigend sortieren","Zeilen absteigend sortieren","Doppelte Zeilen l\xF6schen","Nachgestelltes Leerzeichen k\xFCrzen","Zeile l\xF6schen","Zeileneinzug","Zeile ausr\xFCcken","Zeile oben einf\xFCgen","Zeile unten einf\xFCgen","Alle \xFCbrigen l\xF6schen","Alle rechts l\xF6schen","Zeilen verkn\xFCpfen","Zeichen um den Cursor herum transponieren","In Gro\xDFbuchstaben umwandeln","In Kleinbuchstaben umwandeln","In gro\xDFe Anfangsbuchstaben umwandeln","In Snake Case umwandeln","In Camel-Fall transformieren","Verwandle dich in eine Kebab-H\xFClle"],"vs/editor/contrib/linkedEditing/browser/linkedEditing":["Verkn\xFCpfte Bearbeitung starten","Hintergrundfarbe, wenn der Editor automatisch nach Typ umbenennt."],"vs/editor/contrib/links/browser/links":["Fehler beim \xD6ffnen dieses Links, weil er nicht wohlgeformt ist: {0}","Fehler beim \xD6ffnen dieses Links, weil das Ziel fehlt.","Befehl ausf\xFChren","Link folgen","BEFEHL + Klicken","STRG + Klicken","OPTION + Klicken","alt + klicken",'F\xFChren Sie den Befehl "{0}" aus.',"Link \xF6ffnen"],"vs/editor/contrib/message/browser/messageController":["Gibt an, ob der Editor zurzeit eine Inlinenachricht anzeigt."],"vs/editor/contrib/multicursor/browser/multicursor":["Hinzugef\xFCgter Cursor: {0}","Hinzugef\xFCgte Cursor: {0}","Cursor oberhalb hinzuf\xFCgen","Cursor oberh&&alb hinzuf\xFCgen","Cursor unterhalb hinzuf\xFCgen","Cursor unterhal&&b hinzuf\xFCgen","Cursor an Zeilenenden hinzuf\xFCgen","C&&ursor an Zeilenenden hinzuf\xFCgen","Cursor am Ende hinzuf\xFCgen","Cursor am Anfang hinzuf\xFCgen","Auswahl zur n\xE4chsten \xDCbereinstimmungssuche hinzuf\xFCgen","&&N\xE4chstes Vorkommen hinzuf\xFCgen","Letzte Auswahl zu vorheriger \xDCbereinstimmungssuche hinzuf\xFCgen","Vo&&rheriges Vorkommen hinzuf\xFCgen","Letzte Auswahl in n\xE4chste \xDCbereinstimmungssuche verschieben","Letzte Auswahl in vorherige \xDCbereinstimmungssuche verschieben","Alle Vorkommen ausw\xE4hlen und \xDCbereinstimmung suchen","Alle V&&orkommen ausw\xE4hlen","Alle Vorkommen \xE4ndern","Fokus auf n\xE4chsten Cursor","Fokussiert den n\xE4chsten Cursor","Fokus auf vorherigen Cursor","Fokussiert den vorherigen Cursor"],"vs/editor/contrib/parameterHints/browser/parameterHints":["Parameterhinweise ausl\xF6sen"],"vs/editor/contrib/parameterHints/browser/parameterHintsWidget":["Symbol f\xFCr die Anzeige des n\xE4chsten Parameterhinweises.","Symbol f\xFCr die Anzeige des vorherigen Parameterhinweises.","{0}, Hinweis","Vordergrundfarbe des aktiven Elements im Parameterhinweis."],"vs/editor/contrib/peekView/browser/peekView":["Gibt an, ob der aktuelle Code-Editor in der Vorschau eingebettet ist.","Schlie\xDFen","Hintergrundfarbe des Titelbereichs der Peek-Ansicht.","Farbe des Titels in der Peek-Ansicht.","Farbe der Titelinformationen in der Peek-Ansicht.","Farbe der Peek-Ansichtsr\xE4nder und des Pfeils.","Hintergrundfarbe der Ergebnisliste in der Peek-Ansicht.","Vordergrundfarbe f\xFCr Zeilenknoten in der Ergebnisliste der Peek-Ansicht.","Vordergrundfarbe f\xFCr Dateiknoten in der Ergebnisliste der Peek-Ansicht.","Hintergrundfarbe des ausgew\xE4hlten Eintrags in der Ergebnisliste der Peek-Ansicht.","Vordergrundfarbe des ausgew\xE4hlten Eintrags in der Ergebnisliste der Peek-Ansicht.","Hintergrundfarbe des Peek-Editors.","Hintergrundfarbe der Leiste im Peek-Editor.","Die Hintergrundfarbe f\xFCr den \u201ESticky\u201C-Bildlaufeffekt im Editor f\xFCr die \u201EPeek\u201C-Ansicht.","Farbe f\xFCr \xDCbereinstimmungsmarkierungen in der Ergebnisliste der Peek-Ansicht.","Farbe f\xFCr \xDCbereinstimmungsmarkierungen im Peek-Editor.","Rahmen f\xFCr \xDCbereinstimmungsmarkierungen im Peek-Editor."],"vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess":["\xD6ffnen Sie zuerst einen Text-Editor, um zu einer Zeile zu wechseln.","Wechseln Sie zu Zeile {0} und Zeichen {1}.","Zu Zeile {0} wechseln.","Aktuelle Zeile: {0}, Zeichen: {1}. Geben Sie eine Zeilennummer zwischen 1 und {2} ein, zu der Sie navigieren m\xF6chten.","Aktuelle Zeile: {0}, Zeichen: {1}. Geben Sie eine Zeilennummer ein, zu der Sie navigieren m\xF6chten."],"vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess":["\xD6ffnen Sie zun\xE4chst einen Text-Editor mit Symbolinformationen, um zu einem Symbol zu navigieren.","Der aktive Text-Editor stellt keine Symbolinformationen bereit.","Keine \xFCbereinstimmenden Editorsymbole.","Keine Editorsymbole.","An der Seite \xF6ffnen","Unten \xF6ffnen","Symbole ({0})","Eigenschaften ({0})","Methoden ({0})","Funktionen ({0})","Konstruktoren ({0})","Variablen ({0})","Klassen ({0})","Strukturen ({0})","Ereignisse ({0})","Operatoren ({0})","Schnittstellen ({0})","Namespaces ({0})","Pakete ({0})","Typparameter ({0})","Module ({0})","Eigenschaften ({0})","Enumerationen ({0})","Enumerationsmember ({0})","Zeichenfolgen ({0})","Dateien ({0})","Arrays ({0})","Zahlen ({0})","Boolesche Werte ({0})","Objekte ({0})","Schl\xFCssel ({0})","Felder ({0})","Konstanten ({0})"],"vs/editor/contrib/readOnlyMessage/browser/contribution":["Bearbeitung von schreibgesch\xFCtzter Eingabe nicht m\xF6glich","Ein Bearbeiten ist im schreibgesch\xFCtzten Editor nicht m\xF6glich"],"vs/editor/contrib/rename/browser/rename":["Kein Ergebnis.","Ein unbekannter Fehler ist beim Aufl\xF6sen der Umbenennung eines Ortes aufgetreten.","'{0}' wird in '{1}' umbenannt","{0} wird in {1} umbenannt.",'"{0}" erfolgreich in "{1}" umbenannt. Zusammenfassung: {2}',"Die rename-Funktion konnte die \xC4nderungen nicht anwenden.","Die rename-Funktion konnte die \xC4nderungen nicht berechnen.","Symbol umbenennen","M\xF6glichkeit aktivieren/deaktivieren, \xC4nderungen vor dem Umbenennen als Vorschau anzeigen zu lassen"],"vs/editor/contrib/rename/browser/renameInputField":["Gibt an, ob das Widget zum Umbenennen der Eingabe sichtbar ist.","Benennen Sie die Eingabe um. Geben Sie einen neuen Namen ein, und dr\xFCcken Sie die EINGABETASTE, um den Commit auszuf\xFChren.","{0} zur Umbenennung, {1} zur Vorschau"],"vs/editor/contrib/smartSelect/browser/smartSelect":["Auswahl aufklappen","Auswahl &&erweitern","Markierung verkleinern","Au&&swahl verkleinern"],"vs/editor/contrib/snippet/browser/snippetController2":["Gibt an, ob der Editor sich zurzeit im Schnipselmodus befindet.","Gibt an, ob ein n\xE4chster Tabstopp im Schnipselmodus vorhanden ist.","Gibt an, ob ein vorheriger Tabstopp im Schnipselmodus vorhanden ist.","Zum n\xE4chsten Platzhalter wechseln..."],"vs/editor/contrib/snippet/browser/snippetVariables":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","So","Mo","Di","Mi","Do","Fr","Sa","Januar","Februar","M\xE4rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember","Jan","Feb","M\xE4r","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"vs/editor/contrib/stickyScroll/browser/stickyScrollActions":["Fixierten Bildlauf f\xFCr Editor umschalten","Fixierten Bildlauf des Editors &&umschalten","Fixierter Bildlauf","&&Fixierter Bildlauf","Fokus auf Fixierten Bildlauf","&&Fokus fixierter Bildlauf","N\xE4chste fixierte Zeile ausw\xE4hlen","Zuletzt gew\xE4hlte fixierte Zeile ausw\xE4hlen","Gehe zur fokussierten fixierten Zeile","Editor ausw\xE4hlen"],"vs/editor/contrib/suggest/browser/suggest":["Gibt an, ob ein Vorschlag fokussiert ist","Gibt an, ob Vorschlagsdetails sichtbar sind.","Gibt an, ob mehrere Vorschl\xE4ge zur Auswahl stehen.","Gibt an, ob das Einf\xFCgen des aktuellen Vorschlags zu einer \xC4nderung f\xFChrt oder ob bereits alles eingegeben wurde.","Gibt an, ob Vorschl\xE4ge durch Dr\xFCcken der EINGABETASTE eingef\xFCgt werden.","Gibt an, ob der aktuelle Vorschlag Verhalten zum Einf\xFCgen und Ersetzen aufweist.","Gibt an, ob Einf\xFCgen oder Ersetzen als Standardverhalten verwendet wird.","Gibt an, ob der aktuelle Vorschlag die Aufl\xF6sung weiterer Details unterst\xFCtzt."],"vs/editor/contrib/suggest/browser/suggestController":['Das Akzeptieren von "{0}" ergab {1} zus\xE4tzliche Bearbeitungen.',"Vorschlag ausl\xF6sen","Einf\xFCgen","Einf\xFCgen","Ersetzen","Ersetzen","Einf\xFCgen","weniger anzeigen","mehr anzeigen","Gr\xF6\xDFe des Vorschlagswidgets zur\xFCcksetzen"],"vs/editor/contrib/suggest/browser/suggestWidget":["Hintergrundfarbe des Vorschlagswidgets.","Rahmenfarbe des Vorschlagswidgets.","Vordergrundfarbe des Vorschlagswidgets.","Die Vordergrundfarbe des ausgew\xE4hlten Eintrags im Vorschlagswidget.","Die Vordergrundfarbe des Symbols des ausgew\xE4hlten Eintrags im Vorschlagswidget.","Hintergrundfarbe des ausgew\xE4hlten Eintrags im Vorschlagswidget.","Farbe der Trefferhervorhebung im Vorschlagswidget.","Die Farbe des Treffers wird im Vorschlagswidget hervorgehoben, wenn ein Element fokussiert wird.","Vordergrundfarbe des Status des Vorschlagswidgets.","Wird geladen...","Keine Vorschl\xE4ge.","Vorschlagen","{0} {1}, {2}","{0} {1}","{0}, {1}","{0}, Dokumente: {1}"],"vs/editor/contrib/suggest/browser/suggestWidgetDetails":["Schlie\xDFen","Wird geladen..."],"vs/editor/contrib/suggest/browser/suggestWidgetRenderer":["Symbol f\xFCr weitere Informationen im Vorschlags-Widget.","Weitere Informationen"],"vs/editor/contrib/suggest/browser/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/browser/symbolIcons":["Die Vordergrundfarbe f\xFCr Arraysymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr boolesche Symbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Klassensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Farbsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr konstante Symbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Konstruktorsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Enumeratorsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Enumeratormembersymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Ereignissymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Feldsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Dateisymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Ordnersymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Funktionssymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Schnittstellensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Schl\xFCsselsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Schl\xFCsselwortsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Methodensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Modulsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Namespacesymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr NULL-Symbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Zahlensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Objektsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Operatorsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Paketsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Eigenschaftensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Referenzsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Codeschnipselsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Zeichenfolgensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Struktursymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Textsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Typparametersymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Einheitensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr variable Symbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt."],"vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode":["TAB-Umschalttaste verschiebt Fokus","Beim Dr\xFCcken auf Tab wird der Fokus jetzt auf das n\xE4chste fokussierbare Element verschoben","Beim Dr\xFCcken von Tab wird jetzt das Tabulator-Zeichen eingef\xFCgt"],"vs/editor/contrib/tokenization/browser/tokenization":["Entwickler: Force Retokenize"],"vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter":["Symbol, das mit einer Warnmeldung im Erweiterungs-Editor angezeigt wird.","Dieses Dokument enth\xE4lt viele nicht einfache ASCII-Unicode-Zeichen.","Dieses Dokument enth\xE4lt viele mehrdeutige Unicode-Zeichen.","Dieses Dokument enth\xE4lt viele unsichtbare Unicode-Zeichen.","Konfigurieren der Optionen f\xFCr die Unicode-Hervorhebung","Das Zeichen {0} kann mit dem Zeichen {1} verwechselt werden, was im Quellcode h\xE4ufiger vorkommt.","Das Zeichen {0} kann mit dem Zeichen {1} verwechselt werden, was im Quellcode h\xE4ufiger vorkommt.","Das Zeichen {0} ist nicht sichtbar.","Das Zeichen {0} ist kein einfaches ASCII-Zeichen.","Einstellungen anpassen","Hervorhebung in Kommentaren deaktivieren","Deaktivieren der Hervorhebung von Zeichen in Kommentaren","Hervorhebung in Zeichenfolgen deaktivieren","Deaktivieren der Hervorhebung von Zeichen in Zeichenfolgen","Mehrdeutige Hervorhebung deaktivieren","Deaktivieren der Hervorhebung von mehrdeutigen Zeichen","Unsichtbare Hervorhebung deaktivieren","Deaktivieren der Hervorhebung unsichtbarer Zeichen","Nicht-ASCII-Hervorhebung deaktivieren","Deaktivieren der Hervorhebung von nicht einfachen ASCII-Zeichen","Ausschlussoptionen anzeigen","{0} (unsichtbares Zeichen) von der Hervorhebung ausschlie\xDFen","{0} nicht hervorheben","Unicodezeichen zulassen, die in der Sprache \u201E{0}\u201C h\xE4ufiger vorkommen."],"vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators":["Ungew\xF6hnliche Zeilentrennzeichen","Ungew\xF6hnliche Zeilentrennzeichen erkannt",`Die Datei "{0}" enth\xE4lt mindestens ein ungew\xF6hnliches Zeilenabschlusszeichen, z. B. Zeilentrennzeichen (LS) oder Absatztrennzeichen (PS).\r
+\r
+Es wird empfohlen, sie aus der Datei zu entfernen. Dies kann \xFCber "editor.unusualLineTerminators" konfiguriert werden.`,"&&Ungew\xF6hnliche Zeilenabschlusszeichen entfernen","Ignorieren"],"vs/editor/contrib/wordHighlighter/browser/highlightDecorations":["Hintergrundfarbe eines Symbols beim Lesezugriff, z.B. beim Lesen einer Variablen. Die Farbe darf nicht deckend sein, damit sie nicht die zugrunde liegenden Dekorationen verdeckt.","Hintergrundfarbe eines Symbols bei Schreibzugriff, z.B. beim Schreiben in eine Variable. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Die Hintergrundfarbe eines Textteils f\xFCr ein Symbol. Die Farbe darf nicht deckend sein, um zugrunde liegende Dekorationen nicht auszublenden.","Randfarbe eines Symbols beim Lesezugriff, wie etwa beim Lesen einer Variablen.","Randfarbe eines Symbols beim Schreibzugriff, wie etwa beim Schreiben einer Variablen.","Die Rahmenfarbe eines Textteils f\xFCr ein Symbol.","\xDCbersichtslinealmarkerfarbd f\xFCr das Hervorheben von Symbolen. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","\xDCbersichtslinealmarkerfarbe f\xFCr Symbolhervorhebungen bei Schreibzugriff. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Die Markierungsfarbe des \xDCbersichtslineals eines Textteils f\xFCr ein Symbol. Die Farbe darf nicht deckend sein, um zugrunde liegende Dekorationen nicht auszublenden."],"vs/editor/contrib/wordHighlighter/browser/wordHighlighter":["Gehe zur n\xE4chsten Symbolhervorhebungen","Gehe zur vorherigen Symbolhervorhebungen","Symbol-Hervorhebung ein-/ausschalten"],"vs/editor/contrib/wordOperations/browser/wordOperations":["Wort l\xF6schen"],"vs/platform/action/common/actionCommonCategories":["Entwickler","Ansehen","Hilfe","Test","Datei","Einstellungen"],"vs/platform/actionWidget/browser/actionList":["{0} zum Anwenden, {1} f\xFCr die Vorschau","{0} zum Anwenden","{0} deaktiviert, Grund: {1}","Aktionswidget"],"vs/platform/actionWidget/browser/actionWidget":["Hintergrundfarbe f\xFCr umgeschaltete Aktionselemente in der Aktionsleiste.","Gibt an, ob die Aktionswidgetliste sichtbar ist.","Codeaktionswidget ausblenden","Vorherige Aktion ausw\xE4hlen","N\xE4chste Aktion ausw\xE4hlen","Ausgew\xE4hlte Aktion akzeptieren","Vorschau f\xFCr ausgew\xE4hlte Elemente anzeigen"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})","{0} ({1})",`{0}\r
+[{1}] {2}`],"vs/platform/actions/browser/toolbar":["Ausblenden","Men\xFC zur\xFCcksetzen"],"vs/platform/actions/common/menuService":['"{0}" ausblenden'],"vs/platform/audioCues/browser/audioCueService":["Fehler in der Zeile","Fehler","Warnung in der Zeile","Warnung","Gefalteter Bereich in der Zeile","Gefaltet","Haltepunkt in der Zeile","Haltepunkt","Inlinevorschlag in der Zeile","Terminale schnelle Problembehebung","Schnelle Problembehebung","Debugger auf Haltepunkt beendet","Haltepunkt","Keine Inlay-Hinweise in der Zeile","Keine Inlay-Hinweise","Aufgabe abgeschlossen","Aufgabe abgeschlossen","Aufgabe fehlgeschlagen","Fehler bei Aufgabe","Terminalbefehl fehlgeschlagen","Befehl fehlgeschlagen","Terminalglocke","Terminalglocke","Notebookzelle abgeschlossen","Notebookzelle abgeschlossen","Notebookzelle fehlgeschlagen","Notebookzelle fehlgeschlagen","Vergleichslinie eingef\xFCgt","Vergleichslinie gel\xF6scht","Vergleichslinie ge\xE4ndert","Chatanfrage gesendet","Chatanfrage gesendet","Chatantwort empfangen","Chatantwort ausstehend","Chatantwort ausstehend","L\xF6schen","L\xF6schen","Speichern","Speichern","Formatieren","Format"],"vs/platform/configuration/common/configurationRegistry":["Au\xDFerkraftsetzungen f\xFCr die Standardsprachkonfiguration","Konfigurieren Sie Einstellungen, die f\xFCr die Sprache {0} \xFCberschrieben werden sollen.","Zu \xFCberschreibende Editor-Einstellungen f\xFCr eine Sprache konfigurieren.","Diese Einstellung unterst\xFCtzt keine sprachspezifische Konfiguration.","Zu \xFCberschreibende Editor-Einstellungen f\xFCr eine Sprache konfigurieren.","Diese Einstellung unterst\xFCtzt keine sprachspezifische Konfiguration.","Eine leere Eigenschaft kann nicht registriert werden.",'"{0}" kann nicht registriert werden. Stimmt mit dem Eigenschaftsmuster "\\\\[.*\\\\]$" zum Beschreiben sprachspezifischer Editor-Einstellungen \xFCberein. Verwenden Sie den Beitrag "configurationDefaults".','{0}" kann nicht registriert werden. Diese Eigenschaft ist bereits registriert.','"{0}" kann nicht registriert werden. Die zugeordnete Richtlinie {1} ist bereits bei {2} registriert.'],"vs/platform/contextkey/browser/contextKeyService":["Ein Befehl, der Informationen zu Kontextschl\xFCsseln zur\xFCckgibt"],"vs/platform/contextkey/common/contextkey":["Leerer Kontextschl\xFCsselausdruck","Haben Sie vergessen, einen Ausdruck zu schreiben? Sie k\xF6nnen auch \u201Efalse\u201C oder \u201Etrue\u201C festlegen, um immer auf \u201Efalse\u201C oder \u201Etrue\u201C auszuwerten.","\u201Ein\u201C nach \u201Enot\u201C.","schlie\xDFende Klammer \u201E)\u201C","Unerwartetes Token","Haben Sie vergessen, && oder || vor dem Token einzuf\xFCgen?","Unerwartetes Ende des Ausdrucks.","Haben Sie vergessen, einen Kontextschl\xFCssel zu setzen?",`Erwartet: {0}\r
+Empfangen: \u201E{1}\u201C.`],"vs/platform/contextkey/common/contextkeys":["Gibt an, ob macOS als Betriebssystem verwendet wird.","Gibt an, ob Linux als Betriebssystem verwendet wird.","Gibt an, ob Windows als Betriebssystem verwendet wird.","Gibt an, ob es sich bei der Plattform um einen Webbrowser handelt.","Gibt an, ob macOS auf einer Nicht-Browser-Plattform als Betriebssystem verwendet wird.","Gibt an, ob iOS als Betriebssystem verwendet wird.","Gibt an, ob es sich bei der Plattform um einen mobilen Webbrowser handelt.","Qualit\xE4tstyp des VS Codes","Gibt an, ob sich der Tastaturfokus in einem Eingabefeld befindet."],"vs/platform/contextkey/common/scanner":["Meinten Sie {0}?","Meinten Sie {0} oder {1}?","Meinten Sie {0}, {1} oder {2}?","Haben Sie vergessen, das Anf\xFChrungszeichen zu \xF6ffnen oder zu schlie\xDFen?","Haben Sie vergessen, das Zeichen \u201E/\u201C (Schr\xE4gstrich) zu escapen? Setzen Sie zwei Backslashes davor, um es zu escapen, z. B. \u201E\\\\/\u201C."],"vs/platform/history/browser/contextScopedHistoryWidget":["Gibt an, ob Vorschl\xE4ge sichtbar sind."],"vs/platform/keybinding/common/abstractKeybindingService":["({0}) wurde gedr\xFCckt. Es wird auf die zweite Taste in der Kombination gewartet...","({0}) wurde gedr\xFCckt. Es wird auf die zweite Taste in der Kombination gewartet...","Die Tastenkombination ({0}, {1}) ist kein Befehl.","Die Tastenkombination ({0}, {1}) ist kein Befehl."],"vs/platform/list/browser/listService":["Workbench","Ist unter Windows und Linux der STRG-Taste und unter macOS der Befehlstaste zugeordnet.","Ist unter Windows und Linux der ALT-Taste und unter macOS der Wahltaste zugeordnet.",'Der Modifizierer zum Hinzuf\xFCgen eines Elements in B\xE4umen und Listen zu einer Mehrfachauswahl mit der Maus (zum Beispiel im Explorer, in ge\xF6ffneten Editoren und in der SCM-Ansicht). Die Mausbewegung "Seitlich \xF6ffnen" wird \u2013 sofern unterst\xFCtzt \u2013 so angepasst, dass kein Konflikt mit dem Modifizierer f\xFCr Mehrfachauswahl entsteht.',"Steuert, wie Elemente in Strukturen und Listen mithilfe der Maus ge\xF6ffnet werden (sofern unterst\xFCtzt). Bei \xFCbergeordneten Elementen, deren untergeordnete Elemente sich in Strukturen befinden, steuert diese Einstellung, ob ein Einfachklick oder ein Doppelklick das \xFCbergeordnete Elemente erweitert. Beachten Sie, dass einige Strukturen und Listen diese Einstellung ggf. ignorieren, wenn sie nicht zutrifft.","Steuert, ob Listen und Strukturen ein horizontales Scrollen in der Workbench unterst\xFCtzen. Warnung: Das Aktivieren dieser Einstellung kann sich auf die Leistung auswirken.","Steuert, ob Klicks in der Bildlaufleiste Seite f\xFCr Seite scrollen.","Steuert den Struktureinzug in Pixeln.","Steuert, ob die Struktur Einzugsf\xFChrungslinien rendern soll.","Steuert, ob Listen und Strukturen einen optimierten Bildlauf verwenden.",'Ein Multiplikator, der f\xFCr die Mausrad-Bildlaufereignisse "deltaX" und "deltaY" verwendet werden soll.',"Multiplikator f\xFCr Scrollgeschwindigkeit bei Dr\xFCcken von ALT.","Elemente beim Suchen hervorheben. Die Navigation nach oben und unten durchl\xE4uft dann nur die markierten Elemente.","Filterelemente bei der Suche.","Steuert den Standardsuchmodus f\xFCr Listen und Strukturen in der Workbench.","Bei der einfachen Tastaturnavigation werden Elemente in den Fokus genommen, die mit der Tastatureingabe \xFCbereinstimmen. Die \xDCbereinstimmungen gelten nur f\xFCr Pr\xE4fixe.","Hervorheben von Tastaturnavigationshervorgebungselemente, die mit der Tastatureingabe \xFCbereinstimmen. Beim nach oben und nach unten Navigieren werden nur die hervorgehobenen Elemente durchlaufen.","Durch das Filtern der Tastaturnavigation werden alle Elemente herausgefiltert und ausgeblendet, die nicht mit der Tastatureingabe \xFCbereinstimmen.",'Steuert die Tastaturnavigation in Listen und Strukturen in der Workbench. Kann "simple" (einfach), "highlight" (hervorheben) und "filter" (filtern) sein.',"Bitte verwenden Sie stattdessen \u201Eworkbench.list.defaultFindMode\u201C und \u201Eworkbench.list.typeNavigationMode\u201C.","Verwenden Sie bei der Suche eine Fuzzy\xFCbereinstimmung.","Verwenden Sie bei der Suche eine zusammenh\xE4ngende \xDCbereinstimmung.","Steuert den Typ der \xDCbereinstimmung, der beim Durchsuchen von Listen und Strukturen in der Workbench verwendet wird.","Steuert, wie Strukturordner beim Klicken auf die Ordnernamen erweitert werden. Beachten Sie, dass einige Strukturen und Listen diese Einstellung ggf. ignorieren, wenn sie nicht zutrifft.","Steuert, ob fester Bildlauf in Strukturen aktiviert ist.",'Steuert die Anzahl der festen Elemente, die in der Struktur angezeigt werden, wenn "#workbench.tree.enableStickyScroll#" aktiviert ist.','Steuert die Funktionsweise der Typnavigation in Listen und Strukturen in der Workbench. Bei einer Festlegung auf "trigger" beginnt die Typnavigation, sobald der Befehl "list.triggerTypeNavigation" ausgef\xFChrt wird.'],"vs/platform/markers/common/markers":["Fehler","Warnung","Info"],"vs/platform/quickinput/browser/commandsQuickAccess":["zuletzt verwendet","\xE4hnliche Befehle","h\xE4ufig verwendet","andere Befehle","\xE4hnliche Befehle","{0}, {1}",'Der Befehl "{0}" hat zu einem Fehler gef\xFChrt.'],"vs/platform/quickinput/browser/helpQuickAccess":["{0}, {1}"],"vs/platform/quickinput/browser/quickInput":["Zur\xFCck","Dr\xFCcken Sie die EINGABETASTE, um Ihre Eingabe zu best\xE4tigen, oder ESC, um den Vorgang abzubrechen.","{0}/{1}","Nehmen Sie eine Eingabe vor, um die Ergebnisse einzugrenzen."],"vs/platform/quickinput/browser/quickInputController":["Aktivieren Sie alle Kontrollk\xE4stchen","{0} Ergebnisse","{0} ausgew\xE4hlt","OK","Benutzerdefiniert","Zur\xFCck ({0})","Zur\xFCck"],"vs/platform/quickinput/browser/quickInputList":["Schnelleingabe"],"vs/platform/quickinput/browser/quickInputUtils":['Klicken, um den Befehl "{0}" auszuf\xFChren'],"vs/platform/theme/common/colorRegistry":["Allgemeine Vordergrundfarbe. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente \xFCberschrieben wird.","Allgemeine Vordergrundfarbe. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente \xFCberschrieben wird.","Allgemeine Vordergrundfarbe f\xFCr Fehlermeldungen. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente \xFCberschrieben wird.","Vordergrundfarbe f\xFCr Beschreibungstexte, die weitere Informationen anzeigen, z.B. f\xFCr eine Beschriftung.","Die f\xFCr Symbole in der Workbench verwendete Standardfarbe.","Allgemeine Rahmenfarbe f\xFCr fokussierte Elemente. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente \xFCberschrieben wird.","Ein zus\xE4tzlicher Rahmen um Elemente, mit dem diese von anderen getrennt werden, um einen gr\xF6\xDFeren Kontrast zu erreichen.","Ein zus\xE4tzlicher Rahmen um aktive Elemente, mit dem diese von anderen getrennt werden, um einen gr\xF6\xDFeren Kontrast zu erreichen.","Hintergrundfarbe der Textauswahl in der Workbench (z.B. f\xFCr Eingabefelder oder Textbereiche). Diese Farbe gilt nicht f\xFCr die Auswahl im Editor.","Farbe f\xFCr Text-Trennzeichen.","Vordergrundfarbe f\xFCr Links im Text.","Vordergrundfarbe f\xFCr angeklickte Links im Text und beim Zeigen darauf mit der Maus.","Vordergrundfarbe f\xFCr vorformatierte Textsegmente.","Hintergrundfarbe f\xFCr vorformatierte Textsegmente.","Hintergrundfarbe f\xFCr Blockzitate im Text.","Rahmenfarbe f\xFCr blockquote-Elemente im Text.","Hintergrundfarbe f\xFCr Codebl\xF6cke im Text.","Schattenfarbe von Widgets wie zum Beispiel Suchen/Ersetzen innerhalb des Editors.","Die Rahmenfarbe von Widgets, z.\xA0B. Suchen/Ersetzen im Editor.","Hintergrund f\xFCr Eingabefeld.","Vordergrund f\xFCr Eingabefeld.","Rahmen f\xFCr Eingabefeld.","Rahmenfarbe f\xFCr aktivierte Optionen in Eingabefeldern.","Hintergrundfarbe f\xFCr aktivierte Optionen in Eingabefeldern.","Hintergrundfarbe beim Daraufzeigen f\xFCr Optionen in Eingabefeldern.","Vordergrundfarbe f\xFCr aktivierte Optionen in Eingabefeldern.","Eingabefeld-Vordergrundfarbe f\xFCr Platzhaltertext.","Hintergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Information.","Vordergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Information.","Rahmenfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Information.","Hintergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Warnung.","Vordergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Warnung.","Rahmenfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Warnung.","Hintergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad des Fehlers.","Vordergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad des Fehlers.","Rahmenfarbe bei der Eingabevalidierung f\xFCr den Schweregrad des Fehlers.","Hintergrund f\xFCr Dropdown.","Hintergrund f\xFCr Dropdownliste.","Vordergrund f\xFCr Dropdown.","Rahmen f\xFCr Dropdown.","Vordergrundfarbe der Schaltfl\xE4che.","Farbe des Schaltfl\xE4chentrennzeichens.","Hintergrundfarbe der Schaltfl\xE4che.","Hintergrundfarbe der Schaltfl\xE4che, wenn darauf gezeigt wird.","Rahmenfarbe der Schaltfl\xE4che.","Sekund\xE4re Vordergrundfarbe der Schaltfl\xE4che.","Hintergrundfarbe der sekund\xE4ren Schaltfl\xE4che.","Hintergrundfarbe der sekund\xE4ren Schaltfl\xE4che beim Daraufzeigen.","Hintergrundfarbe f\xFCr Badge. Badges sind kurze Info-Texte, z.B. f\xFCr Anzahl Suchergebnisse.","Vordergrundfarbe f\xFCr Badge. Badges sind kurze Info-Texte, z.B. f\xFCr Anzahl Suchergebnisse.","Schatten der Scrollleiste, um anzuzeigen, dass die Ansicht gescrollt wird.","Hintergrundfarbe vom Scrollbar-Schieber","Hintergrundfarbe des Schiebereglers, wenn darauf gezeigt wird.","Hintergrundfarbe des Schiebereglers, wenn darauf geklickt wird.","Hintergrundfarbe des Fortschrittbalkens, der f\xFCr zeitintensive Vorg\xE4nge angezeigt werden kann.","Hintergrundfarbe f\xFCr Fehlertext im Editor. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Vordergrundfarbe von Fehlerunterstreichungen im Editor.","Wenn festgelegt, wird die Farbe doppelter Unterstreichungen f\xFCr Fehler im Editor angezeigt.","Hintergrundfarbe f\xFCr Warnungstext im Editor. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Vordergrundfarbe von Warnungsunterstreichungen im Editor.","Wenn festgelegt, wird die Farbe doppelter Unterstreichungen f\xFCr Warnungen im Editor angezeigt.","Hintergrundfarbe f\xFCr Infotext im Editor. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Vordergrundfarbe von Informationsunterstreichungen im Editor.","Wenn festgelegt, wird die Farbe doppelter Unterstreichungen f\xFCr Infos im Editor angezeigt.","Vordergrundfarbe der Hinweisunterstreichungen im Editor.","Wenn festgelegt, wird die Farbe doppelter Unterstreichungen f\xFCr Hinweise im Editor angezeigt.","Rahmenfarbe aktiver Trennleisten.","Hintergrundfarbe des Editors.","Standardvordergrundfarbe des Editors.","Hintergrundfarbe des fixierten Bildlaufs im Editor","Hintergrundfarbe des fixierten Bildlaufs beim Daraufzeigen im Editor","Rahmenfarbe des fixierten Bildlaufs im Editor"," Schattenfarbe des fixierten Bildlaufs im Editor","Hintergrundfarbe von Editor-Widgets wie zum Beispiel Suchen/Ersetzen.","Vordergrundfarbe f\xFCr Editorwidgets wie Suchen/Ersetzen.","Rahmenfarbe von Editorwigdets. Die Farbe wird nur verwendet, wenn f\xFCr das Widget ein Rahmen verwendet wird und die Farbe nicht von einem Widget \xFCberschrieben wird.","Rahmenfarbe der Gr\xF6\xDFenanpassungsleiste von Editorwigdets. Die Farbe wird nur verwendet, wenn f\xFCr das Widget ein Gr\xF6\xDFenanpassungsrahmen verwendet wird und die Farbe nicht von einem Widget au\xDFer Kraft gesetzt wird.","Schnellauswahl der Hintergrundfarbe. Im Widget f\xFCr die Schnellauswahl sind Auswahlelemente wie die Befehlspalette enthalten.","Vordergrundfarbe der Schnellauswahl. Im Widget f\xFCr die Schnellauswahl sind Auswahlelemente wie die Befehlspalette enthalten.","Hintergrundfarbe f\xFCr den Titel der Schnellauswahl. Im Widget f\xFCr die Schnellauswahl sind Auswahlelemente wie die Befehlspalette enthalten.","Schnellauswahlfarbe f\xFCr das Gruppieren von Bezeichnungen.","Schnellauswahlfarbe f\xFCr das Gruppieren von Rahmen.","Die Hintergrundfarbe der Tastenbindungsbeschriftung. Die Tastenbindungsbeschriftung wird verwendet, um eine Tastenkombination darzustellen.","Die Vordergrundfarbe der Tastenbindungsbeschriftung. Die Tastenbindungsbeschriftung wird verwendet, um eine Tastenkombination darzustellen.","Die Rahmenfarbe der Tastenbindungsbeschriftung. Die Tastenbindungsbeschriftung wird verwendet, um eine Tastenkombination darzustellen.","Die Rahmenfarbe der Schaltfl\xE4che der Tastenbindungsbeschriftung. Die Tastenbindungsbeschriftung wird verwendet, um eine Tastenkombination darzustellen.","Farbe der Editor-Auswahl.","Farbe des gew\xE4hlten Text f\xFCr einen hohen Kontrast","Die Farbe der Auswahl befindet sich in einem inaktiven Editor. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegende Dekorationen verdeckt.","Farbe f\xFCr Bereiche mit dem gleichen Inhalt wie die Auswahl. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Randfarbe f\xFCr Bereiche, deren Inhalt der Auswahl entspricht.","Farbe des aktuellen Suchergebnisses.","Farbe der anderen Suchergebnisse. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Farbe des Bereichs, der die Suche eingrenzt. Die Farbe darf nicht deckend sein, damit sie nicht die zugrunde liegenden Dekorationen verdeckt.","Randfarbe des aktuellen Suchergebnisses.","Randfarbe der anderen Suchtreffer.","Rahmenfarbe des Bereichs, der die Suche eingrenzt. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Farbe der Abfrage\xFCbereinstimmungen des Such-Editors","Rahmenfarbe der Abfrage\xFCbereinstimmungen des Such-Editors","Farbe des Texts in der Abschlussmeldung des Such-Viewlets.","Hervorhebung unterhalb des Worts, f\xFCr das ein Hoverelement angezeigt wird. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hintergrundfarbe des Editor-Mauszeigers.","Vordergrundfarbe des Editor-Mauszeigers","Rahmenfarbe des Editor-Mauszeigers.","Hintergrundfarbe der Hoverstatusleiste des Editors.","Farbe der aktiven Links.","Vordergrundfarbe f\xFCr Inlinehinweise","Hintergrundfarbe f\xFCr Inlinehinweise","Vordergrundfarbe von Inlinehinweisen f\xFCr Typen","Hintergrundfarbe von Inlinehinweisen f\xFCr Typen","Vordergrundfarbe von Inlinehinweisen f\xFCr Parameter","Hintergrundfarbe von Inlinehinweisen f\xFCr Parameter",'Die f\xFCr das Aktionssymbol "Gl\xFChbirne" verwendete Farbe.','Die f\xFCr das Aktionssymbol "Automatische Gl\xFChbirnenkorrektur" verwendete Farbe.',"Die Farbe, die f\xFCr das KI-Symbol der Gl\xFChbirne verwendet wird.","Hintergrundfarbe f\xFCr eingef\xFCgten Text. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hintergrundfarbe f\xFCr Text, der entfernt wurde. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hintergrundfarbe f\xFCr eingef\xFCgte Zeilen. Die Farbe darf nicht deckend sein, um zugrunde liegende Dekorationen nicht auszublenden.","Hintergrundfarbe f\xFCr Zeilen, die entfernt wurden. Die Farbe darf nicht deckend sein, um zugrunde liegende Dekorationen nicht auszublenden.","Hintergrundfarbe f\xFCr den Rand, an dem Zeilen eingef\xFCgt wurden.","Hintergrundfarbe f\xFCr den Rand, an dem die Zeilen entfernt wurden.","Vordergrund des Diff-\xDCbersichtslineals f\xFCr eingef\xFCgten Inhalt.","Vordergrund des Diff-\xDCbersichtslineals f\xFCr entfernten Inhalt.","Konturfarbe f\xFCr eingef\xFCgten Text.","Konturfarbe f\xFCr entfernten Text.","Die Rahmenfarbe zwischen zwei Text-Editoren.","Farbe der diagonalen F\xFCllung des Vergleichs-Editors. Die diagonale F\xFCllung wird in Ansichten mit parallelem Vergleich verwendet.","Die Hintergrundfarbe von unver\xE4nderten Bl\xF6cken im Diff-Editor.","Die Vordergrundfarbe von unver\xE4nderten Bl\xF6cken im Diff-Editor.","Die Hintergrundfarbe des unver\xE4nderten Codes im Diff-Editor.","Hintergrundfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Vordergrundfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Konturfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Umrissfarbe der Liste/des Baums f\xFCr das fokussierte Element, wenn die Liste/der Baum aktiv und ausgew\xE4hlt ist. Eine aktive Liste/Baum hat Tastaturfokus, eine inaktive nicht.","Hintergrundfarbe der Liste/Struktur f\xFCr das ausgew\xE4hlte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Vordergrundfarbe der Liste/Struktur f\xFCr das ausgew\xE4hlte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Vordergrundfarbe des Symbols der Liste/Struktur f\xFCr das ausgew\xE4hlte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Hintergrundfarbe der Liste/Struktur f\xFCr das ausgew\xE4hlte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Vordergrundfarbe der Liste/Struktur f\xFCr das ausgew\xE4hlte Element, wenn die Liste/Baumstruktur inaktiv ist. Eine aktive Liste/Baumstruktur hat Tastaturfokus, eine inaktive hingegen nicht.","Vordergrundfarbe des Symbols der Liste/Struktur f\xFCr das ausgew\xE4hlte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Hintergrundfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Konturfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Hintergrund der Liste/Struktur, wenn mit der Maus auf Elemente gezeigt wird.","Vordergrund der Liste/Struktur, wenn mit der Maus auf Elemente gezeigt wird.","Hintergrund f\xFCr Drag & Drop auflisten/strukturieren, wenn Elemente bei Verwendung der Maus \xFCber Elemente verschoben werden.","Rahmenfarbe f\xFCr Drag & Drop auflisten/strukturieren, wenn Elemente bei Verwendung der Maus zwischen Elementen verschoben werden.","Vordergrundfarbe der Liste/Struktur zur Trefferhervorhebung beim Suchen innerhalb der Liste/Struktur.","Die Vordergrundfarbe der Liste/Struktur des Treffers hebt aktiv fokussierte Elemente hervor, wenn innerhalb der Liste / der Struktur gesucht wird.","Vordergrundfarbe einer Liste/Struktur f\xFCr ung\xFCltige Elemente, z.B. ein nicht ausgel\xF6ster Stamm im Explorer.","Vordergrundfarbe f\xFCr Listenelemente, die Fehler enthalten.","Vordergrundfarbe f\xFCr Listenelemente, die Warnungen enthalten.","Hintergrundfarbe des Typfilterwidgets in Listen und Strukturen.","Konturfarbe des Typfilterwidgets in Listen und Strukturen.","Konturfarbe des Typfilterwidgets in Listen und Strukturen, wenn es keine \xDCbereinstimmungen gibt.","Schattenfarbe des Typfilterwidgets in Listen und Strukturen.","Hintergrundfarbe der gefilterten \xDCbereinstimmung","Rahmenfarbe der gefilterten \xDCbereinstimmung","Strukturstrichfarbe f\xFCr die Einzugsf\xFChrungslinien.","Strukturstrichfarbe f\xFCr die Einzugslinien, die nicht aktiv sind.","Tabellenrahmenfarbe zwischen Spalten.","Hintergrundfarbe f\xFCr ungerade Tabellenzeilen.","Hintergrundfarbe f\xFCr nicht hervorgehobene Listen-/Strukturelemente.","Hintergrundfarbe von Kontrollk\xE4stchenwidget.","Hintergrundfarbe des Kontrollk\xE4stchenwidgets, wenn das Element ausgew\xE4hlt ist, in dem es sich befindet.","Vordergrundfarbe von Kontrollk\xE4stchenwidget.","Rahmenfarbe von Kontrollk\xE4stchenwidget.","Rahmenfarbe des Kontrollk\xE4stchenwidgets, wenn das Element ausgew\xE4hlt ist, in dem es sich befindet.",'Verwenden Sie stattdessen "quickInputList.focusBackground".',"Die Hintergrundfarbe der Schnellauswahl f\xFCr das fokussierte Element.","Die Vordergrundfarbe des Symbols der Schnellauswahl f\xFCr das fokussierte Element.","Die Hintergrundfarbe der Schnellauswahl f\xFCr das fokussierte Element.","Rahmenfarbe von Men\xFCs.","Vordergrundfarbe von Men\xFCelementen.","Hintergrundfarbe von Men\xFCelementen.","Vordergrundfarbe des ausgew\xE4hlten Men\xFCelements im Men\xFC.","Hintergrundfarbe des ausgew\xE4hlten Men\xFCelements im Men\xFC.","Rahmenfarbe des ausgew\xE4hlten Men\xFCelements im Men\xFC.","Farbe eines Trenner-Men\xFCelements in Men\xFCs.","Symbolleistenhintergrund beim Bewegen der Maus \xFCber Aktionen","Symbolleistengliederung beim Bewegen der Maus \xFCber Aktionen","Symbolleistenhintergrund beim Halten der Maus \xFCber Aktionen","Hervorhebungs-Hintergrundfarbe eines Codeschnipsel-Tabstopps.","Hervorhebungs-Rahmenfarbe eines Codeschnipsel-Tabstopps.","Hervorhebungs-Hintergrundfarbe des letzten Tabstopps eines Codeschnipsels.","Rahmenfarbe zur Hervorhebung des letzten Tabstopps eines Codeschnipsels.","Farbe der Breadcrumb-Elemente, die den Fokus haben.","Hintergrundfarbe der Breadcrumb-Elemente.","Farbe der Breadcrumb-Elemente, die den Fokus haben.","Die Farbe der ausgew\xE4hlten Breadcrumb-Elemente.","Hintergrundfarbe des Breadcrumb-Auswahltools.","Hintergrund des aktuellen Headers in Inlinezusammenf\xFChrungskonflikten. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hintergrund f\xFCr den aktuellen Inhalt in Inlinezusammenf\xFChrungskonflikten. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hintergrund f\xFCr eingehende Header in Inlinezusammenf\xFChrungskonflikten. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hintergrund f\xFCr eingehenden Inhalt in Inlinezusammenf\xFChrungskonflikten. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Headerhintergrund f\xFCr gemeinsame Vorg\xE4ngerelemente in Inlinezusammenf\xFChrungskonflikten. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hintergrund des Inhalts gemeinsamer Vorg\xE4ngerelemente in Inlinezusammenf\xFChrungskonflikt. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Rahmenfarbe f\xFCr Kopfzeilen und die Aufteilung in Inline-Mergingkonflikten.","Aktueller \xDCbersichtslineal-Vordergrund f\xFCr Inline-Mergingkonflikte.","Eingehender \xDCbersichtslineal-Vordergrund f\xFCr Inline-Mergingkonflikte.","Hintergrund des \xDCbersichtslineals des gemeinsamen \xFCbergeordneten Elements bei Inlinezusammenf\xFChrungskonflikten.","\xDCbersichtslinealmarkerfarbe f\xFCr das Suchen von \xDCbereinstimmungen. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","\xDCbersichtslinealmarkerfarbe f\xFCr das Hervorheben der Auswahl. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Minimap-Markerfarbe f\xFCr gefundene \xDCbereinstimmungen.","Minimap-Markerfarbe f\xFCr wiederholte Editorauswahlen.","Minimap-Markerfarbe f\xFCr die Editorauswahl.","Minimapmarkerfarbe f\xFCr Informationen.","Minimapmarkerfarbe f\xFCr Warnungen","Minimapmarkerfarbe f\xFCr Fehler","Hintergrundfarbe der Minimap.","Deckkraft von Vordergrundelementen, die in der Minimap gerendert werden. Beispiel: \u201E#000000c0\u201C wird die Elemente mit einer Deckkraft von 75 % rendern.","Hintergrundfarbe des Minimap-Schiebereglers.","Hintergrundfarbe des Minimap-Schiebereglers beim Daraufzeigen.","Hintergrundfarbe des Minimap-Schiebereglers, wenn darauf geklickt wird.","Die Farbe, die f\xFCr das Problemfehlersymbol verwendet wird.","Die Farbe, die f\xFCr das Problemwarnsymbol verwendet wird.","Die Farbe, die f\xFCr das Probleminfosymbol verwendet wird.","Die in Diagrammen verwendete Vordergrundfarbe.","Die f\xFCr horizontale Linien in Diagrammen verwendete Farbe.","Die in Diagrammvisualisierungen verwendete Farbe Rot.","Die in Diagrammvisualisierungen verwendete Farbe Blau.","Die in Diagrammvisualisierungen verwendete Farbe Gelb.","Die in Diagrammvisualisierungen verwendete Farbe Orange.","Die in Diagrammvisualisierungen verwendete Farbe Gr\xFCn.","Die in Diagrammvisualisierungen verwendete Farbe Violett."],"vs/platform/theme/common/iconRegistry":["Die ID der zu verwendenden Schriftart. Sofern nicht festgelegt, wird die zuerst definierte Schriftart verwendet.","Das der Symboldefinition zugeordnete Schriftzeichen.","Symbol f\xFCr Aktion zum Schlie\xDFen in Widgets","Symbol f\xFCr den Wechsel zur vorherigen Editor-Position.","Symbol f\xFCr den Wechsel zur n\xE4chsten Editor-Position."],"vs/platform/undoRedo/common/undoRedoService":["Die folgenden Dateien wurden geschlossen und auf dem Datentr\xE4ger ge\xE4ndert: {0}.","Die folgenden Dateien wurden auf inkompatible Weise ge\xE4ndert: {0}.",'"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden. {1}','"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden. {1}','"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden, da \xC4nderungen an {1} vorgenommen wurden.','"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden, weil bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen f\xFCr "{1}" durchgef\xFChrt wird.','"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden, weil in der Zwischenzeit bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen durchgef\xFChrt wurde.','M\xF6chten Sie "{0}" f\xFCr alle Dateien r\xFCckg\xE4ngig machen?',"&&In {0} Dateien r\xFCckg\xE4ngig machen","&&Datei r\xFCckg\xE4ngig machen",'"{0}" konnte nicht r\xFCckg\xE4ngig gemacht werden, weil bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen durchgef\xFChrt wird.','M\xF6chten Sie "{0}" r\xFCckg\xE4ngig machen?',"&&Ja","Nein",'"{0}" konnte nicht in allen Dateien wiederholt werden. {1}','"{0}" konnte nicht in allen Dateien wiederholt werden. {1}','"{0}" konnte nicht in allen Dateien wiederholt werden, da \xC4nderungen an {1} vorgenommen wurden.','"{0}" konnte nicht f\xFCr alle Dateien wiederholt werden, weil bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen f\xFCr "{1}" durchgef\xFChrt wird.','"{0}" konnte nicht f\xFCr alle Dateien wiederholt werden, weil in der Zwischenzeit bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen durchgef\xFChrt wurde.','"{0}" konnte nicht wiederholt werden, weil bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen durchgef\xFChrt wird.'],"vs/platform/workspace/common/workspace":["Codearbeitsbereich"]});
+
+//# sourceMappingURL=../../../min-maps/vs/editor/editor.main.nls.de.js.map
\ No newline at end of file
diff --git a/public/vs/editor/editor.main.nls.es.js b/public/vs/editor/editor.main.nls.es.js
new file mode 100644
index 0000000..98447bc
--- /dev/null
+++ b/public/vs/editor/editor.main.nls.es.js
@@ -0,0 +1,15 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.es",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["entrada"],"vs/base/browser/ui/findinput/findInputToggles":["Coincidir may\xFAsculas y min\xFAsculas","Solo palabras completas","Usar expresi\xF3n regular"],"vs/base/browser/ui/findinput/replaceInput":["entrada","Conservar may/min"],"vs/base/browser/ui/hover/hoverWidget":["Inspeccione esto en la vista accesible con {0}.","Inspeccione esto en la vista accesible mediante el comando Abrir vista accesible, que actualmente no se puede desencadenar mediante el enlace de teclado."],"vs/base/browser/ui/iconLabel/iconLabelHover":["Cargando..."],"vs/base/browser/ui/inputbox/inputBox":["Error: {0}","Advertencia: {0}","Informaci\xF3n: {0}"," o {0} para el historial"," ({0} para el historial)","Entrada borrada"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["Sin enlazar"],"vs/base/browser/ui/selectBox/selectBoxCustom":["Seleccionar cuadro"],"vs/base/browser/ui/toolbar/toolbar":["M\xE1s Acciones..."],"vs/base/browser/ui/tree/abstractTree":["Filtrar","Coincidencia aproximada","Escriba texto para filtrar","Escriba texto para buscar","Escriba texto para buscar","Cerrar","No se encontraron elementos."],"vs/base/common/actions":["(vac\xEDo)"],"vs/base/common/errorMessage":["{0}: {1}","Error del sistema ({0})","Se ha producido un error desconocido. Consulte el registro para obtener m\xE1s detalles.","Se ha producido un error desconocido. Consulte el registro para obtener m\xE1s detalles.","{0} ({1} errores en total)","Se ha producido un error desconocido. Consulte el registro para obtener m\xE1s detalles."],"vs/base/common/keybindingLabels":["Ctrl","May\xFAs","Alt","Windows","Ctrl","May\xFAs","Alt","Super","Control","May\xFAs","Opci\xF3n","Comando","Control","May\xFAs","Alt","Windows","Control","May\xFAs","Alt","Super"],"vs/base/common/platform":["_"],"vs/editor/browser/controller/textAreaHandler":["editor","No se puede acceder al editor en este momento.","{0} Para habilitar el modo optimizado para lectores de pantalla, use {1}","{0} Para habilitar el modo optimizado para lector de pantalla, abra la selecci\xF3n r\xE1pida con {1} y ejecute el comando Alternar modo de accesibilidad del lector de pantalla, que actualmente no se puede desencadenar mediante el teclado.","{0} Para asignar un enlace de teclado para el comando Alternar modo de accesibilidad del lector de pantalla, acceda al editor de enlaces de teclado con {1} y ejec\xFAtelo."],"vs/editor/browser/coreCommands":["Anclar al final incluso cuando se vayan a l\xEDneas m\xE1s largas","Anclar al final incluso cuando se vayan a l\xEDneas m\xE1s largas","Cursores secundarios quitados"],"vs/editor/browser/editorExtensions":["&&Deshacer","Deshacer","&&Rehacer","Rehacer","&&Seleccionar todo","Seleccionar todo"],"vs/editor/browser/widget/codeEditorWidget":["El n\xFAmero de cursores se ha limitado a {0}. Considere la posibilidad de usar [buscar y reemplazar](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) para realizar cambios mayores o aumentar la configuraci\xF3n del l\xEDmite de varios cursores del editor.","Aumentar el l\xEDmite de varios cursores"],"vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer":['Icono de "Insertar" en el visor de diferencias accesible.','Icono de "Quitar" en el visor de diferencias accesible.','Icono de "Cerrar" en el visor de diferencias accesible.',"Cerrar","Visor de diferencias accesible. Utilice la flecha hacia arriba y hacia abajo para navegar.","no se han cambiado l\xEDneas","1 l\xEDnea cambiada","{0} l\xEDneas cambiadas","Diferencia {0} de {1}: l\xEDnea original {2}, {3}, l\xEDnea modificada {4}, {5}","vac\xEDo","{0} l\xEDnea sin cambios {1}","{0} l\xEDnea original {1} l\xEDnea modificada {2}","+ {0} l\xEDnea modificada {1}","- {0} l\xEDnea original {1}"],"vs/editor/browser/widget/diffEditor/components/diffEditorEditors":[" use {0} para abrir la ayuda de accesibilidad."],"vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin":["Copiar l\xEDneas eliminadas","Copiar l\xEDnea eliminada","Copiar l\xEDneas cambiadas","Copiar l\xEDnea cambiada","Copiar la l\xEDnea eliminada ({0})","Copiar l\xEDnea cambiada ({0})","Revertir este cambio"],"vs/editor/browser/widget/diffEditor/diffEditor.contribution":["Uso de la vista insertada cuando el espacio es limitado","Mostrar bloques de c\xF3digo movidos","Editor de diferencias","Visor de diferencias accesibles","Abrir visor de diferencias accesibles","Alternar contraer regiones sin cambios","Alternar Mostrar bloques de c\xF3digo movidos","Alternar el uso de la vista insertada cuando el espacio es limitado","Lado del conmutador","Salir de la comparaci\xF3n de movimientos","Contraer todas las regiones sin cambios","Mostrar todas las regiones sin cambios","Ir a la siguiente diferencia","Ir a la diferencia anterior"],"vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature":["Plegar la regi\xF3n sin cambios","Haga clic o arrastre para mostrar m\xE1s arriba","Mostrar regi\xF3n sin cambios","Hacer clic o arrastrar para mostrar m\xE1s abajo","{0} l\xEDneas ocultas","Doble clic para desplegar"],"vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature":["C\xF3digo movido con cambios en la l\xEDnea {0}-{1}","C\xF3digo movido con cambios de la l\xEDnea {0}-{1}","C\xF3digo movido a la l\xEDnea {0}-{1}","C\xF3digo movido de la l\xEDnea {0}-{1}"],"vs/editor/browser/widget/diffEditor/features/revertButtonsFeature":["Revertir los cambios seleccionados","Revertir el cambio"],"vs/editor/browser/widget/diffEditor/registrations.contribution":["Color del borde del texto que se movi\xF3 en el editor de diferencias.","Color del borde de texto activo que se movi\xF3 en el editor de diferencias.","Color de la sombra paralela en torno a los widgets de regi\xF3n sin cambios.","Decoraci\xF3n de l\xEDnea para las inserciones en el editor de diferencias.","Decoraci\xF3n de l\xEDnea para las eliminaciones en el editor de diferencias."],"vs/editor/browser/widget/hoverWidget/hoverWidget":["Mantenga presionada la tecla {0} para pasar el mouse"],"vs/editor/browser/widget/multiDiffEditorWidget/colors":["Color de fondo del encabezado del editor de diferencias","Color de fondo del editor de diferencias de varios archivos","Color de borde del editor de diferencias de varios archivos"],"vs/editor/common/config/editorConfigurationSchema":["Editor","El n\xFAmero de espacios a los que equivale una tabulaci\xF3n. Este valor se invalida en funci\xF3n del contenido del archivo cuando {0} est\xE1 activado.",'N\xFAmero de espacios usados para la sangr\xEDa o "tabSize" para usar el valor de "#editor.tabSize#". Esta configuraci\xF3n se invalida en funci\xF3n del contenido del archivo cuando "#editor.detectIndentation#" est\xE1 activado.','Insertar espacios al presionar "TAB". Este valor se invalida en funci\xF3n del contenido del archivo cuando {0} est\xE1 activado.',"Controla si {0} y {1} se detectan autom\xE1ticamente al abrir un archivo en funci\xF3n del contenido de este.","Quitar el espacio en blanco final autoinsertado.","Manejo especial para archivos grandes para desactivar ciertas funciones de memoria intensiva.","Desactivar sugerencias basadas en Word.","Sugerir palabras solo del documento activo.","Sugerir palabras de todos los documentos abiertos del mismo idioma.","Sugerir palabras de todos los documentos abiertos.","Controla si las finalizaciones se deben calcular en funci\xF3n de las palabras del documento y desde qu\xE9 documentos se calculan.","El resaltado sem\xE1ntico est\xE1 habilitado para todos los temas de color.","El resaltado sem\xE1ntico est\xE1 deshabilitado para todos los temas de color.",'El resaltado sem\xE1ntico est\xE1 configurado con el valor "semanticHighlighting" del tema de color actual.',"Controla si se muestra semanticHighlighting para los idiomas que lo admiten.",'Mantiene abiertos los editores interactivos, incluso al hacer doble clic en su contenido o presionar "Escape".',"Las lineas por encima de esta longitud no se tokenizar\xE1n por razones de rendimiento.","Controla si la tokenizaci\xF3n debe producirse de forma asincr\xF3nica en un rol de trabajo.","Controla si se debe registrar la tokenizaci\xF3n asincr\xF3nica. Solo para depuraci\xF3n.","Controla si se debe comprobar la tokenizaci\xF3n asincr\xF3nica con la tokenizaci\xF3n en segundo plano heredada. Puede ralentizar la tokenizaci\xF3n. Solo para depuraci\xF3n.","Define los corchetes que aumentan o reducen la sangr\xEDa.","Secuencia de cadena o corchete de apertura.","Secuencia de cadena o corchete de cierre.","Define los pares de corchetes coloreados por su nivel de anidamiento si est\xE1 habilitada la coloraci\xF3n de par de corchetes.","Secuencia de cadena o corchete de apertura.","Secuencia de cadena o corchete de cierre.","Tiempo de espera en milisegundos despu\xE9s del cual se cancela el c\xE1lculo de diferencias. Utilice 0 para no usar tiempo de espera.","Tama\xF1o m\xE1ximo de archivo en MB para el que calcular diferencias. Use 0 para no limitar.","Controla si el editor de diferencias muestra las diferencias en paralelo o alineadas.","Si el ancho del editor de diferencias es menor que este valor, se usa la vista insertada.","Si est\xE1 habilitada y el ancho del editor es demasiado peque\xF1o, se usa la vista en l\xEDnea.","Cuando est\xE1 habilitado, el editor de diferencias muestra flechas en su margen de glifo para revertir los cambios.","Cuando est\xE1 habilitado, el editor de diferencias omite los cambios en los espacios en blanco iniciales o finales.","Controla si el editor de diferencias muestra los indicadores +/- para los cambios agregados o quitados.","Controla si el editor muestra CodeLens.","Las l\xEDneas no se ajustar\xE1n nunca.","Las l\xEDneas se ajustar\xE1n en el ancho de la ventanilla.","Las l\xEDneas se ajustar\xE1n en funci\xF3n de la configuraci\xF3n de {0}.","Usa el algoritmo de diferenciaci\xF3n heredado.","Usa el algoritmo de diferenciaci\xF3n avanzada.","Controla si el editor de diferencias muestra las regiones sin cambios.","Controla cu\xE1ntas l\xEDneas se usan para las regiones sin cambios.","Controla cu\xE1ntas l\xEDneas se usan como m\xEDnimo para las regiones sin cambios.","Controla cu\xE1ntas l\xEDneas se usan como contexto al comparar regiones sin cambios.","Controlar si el editor de diferencias debe mostrar los movimientos de c\xF3digo detectados.","Controla si el editor de diferencias muestra decoraciones vac\xEDas para ver d\xF3nde se insertan o eliminan los caracteres."],"vs/editor/common/config/editorOptions":["Usar las API de la plataforma para detectar cu\xE1ndo se conecta un lector de pantalla.","Optimizar para usar con un lector de pantalla.","Supongamos que no hay un lector de pantalla conectado.","Controla si la interfaz de usuario debe ejecutarse en un modo en el que est\xE9 optimizada para lectores de pantalla.","Controla si se inserta un car\xE1cter de espacio al comentar.","Controla si las l\xEDneas vac\xEDas deben ignorarse con la opci\xF3n de alternar, agregar o quitar acciones para los comentarios de l\xEDnea.","Controla si al copiar sin selecci\xF3n se copia la l\xEDnea actual.","Controla si el cursor debe saltar para buscar coincidencias mientras se escribe.","Nunca inicializar la cadena de b\xFAsqueda desde la selecci\xF3n del editor.","Siempre inicializar la cadena de b\xFAsqueda desde la selecci\xF3n del editor, incluida la palabra en la posici\xF3n del cursor.","Solo inicializar la cadena de b\xFAsqueda desde la selecci\xF3n del editor.","Controla si la cadena de b\xFAsqueda del widget de b\xFAsqueda se inicializa desde la selecci\xF3n del editor.","No activar nunca Buscar en selecci\xF3n autom\xE1ticamente (predeterminado).","Activar siempre Buscar en selecci\xF3n autom\xE1ticamente.","Activar Buscar en la selecci\xF3n autom\xE1ticamente cuando se seleccionen varias l\xEDneas de contenido.","Controla la condici\xF3n para activar la b\xFAsqueda en la selecci\xF3n de forma autom\xE1tica.","Controla si el widget de b\xFAsqueda debe leer o modificar el Portapapeles de b\xFAsqueda compartido en macOS.","Controla si Encontrar widget debe agregar m\xE1s l\xEDneas en la parte superior del editor. Si es true, puede desplazarse m\xE1s all\xE1 de la primera l\xEDnea cuando Encontrar widget est\xE1 visible.","Controla si la b\xFAsqueda se reinicia autom\xE1ticamente desde el principio (o el final) cuando no se encuentran m\xE1s coincidencias.",'Habilita o deshabilita las ligaduras tipogr\xE1ficas (caracter\xEDsticas de fuente "calt" y "liga"). C\xE1mbielo a una cadena para el control espec\xEDfico de la propiedad de CSS "font-feature-settings".','Propiedad de CSS "font-feature-settings" expl\xEDcita. En su lugar, puede pasarse un valor booleano si solo es necesario activar o desactivar las ligaduras.','Configura las ligaduras tipogr\xE1ficas o las caracter\xEDsticas de fuente. Puede ser un valor booleano para habilitar o deshabilitar las ligaduras o bien una cadena para el valor de la propiedad "font-feature-settings" de CSS.',"Habilita o deshabilita la traducci\xF3n del grosor de font-weight a font-variation-settings. Cambie esto a una cadena para el control espec\xEDfico de la propiedad CSS 'font-variation-settings'.","Propiedad CSS expl\xEDcita 'font-variation-settings'. En su lugar, se puede pasar un valor booleano si solo es necesario traducir font-weight a font-variation-settings.","Configura variaciones de fuente. Puede ser un booleano para habilitar o deshabilitar la traducci\xF3n de font-weight a font-variation-settings o una cadena para el valor de la propiedad CSS 'font-variation-settings'.","Controla el tama\xF1o de fuente en p\xEDxeles.",'Solo se permiten las palabras clave "normal" y "negrita" o los n\xFAmeros entre 1 y 1000.','Controla el grosor de la fuente. Acepta las palabras clave "normal" y "negrita" o los n\xFAmeros entre 1 y 1000.',"Mostrar vista de inspecci\xF3n de los resultados (predeterminado)","Ir al resultado principal y mostrar una vista de inspecci\xF3n","Vaya al resultado principal y habilite la navegaci\xF3n sin peek para otros",'Esta configuraci\xF3n est\xE1 en desuso. Use configuraciones separadas como "editor.editor.gotoLocation.multipleDefinitions" o "editor.editor.gotoLocation.multipleImplementations" en su lugar.','Controla el comportamiento del comando "Ir a definici\xF3n" cuando existen varias ubicaciones de destino.','Controla el comportamiento del comando "Ir a definici\xF3n de tipo" cuando existen varias ubicaciones de destino.','Controla el comportamiento del comando "Ir a declaraci\xF3n" cuando existen varias ubicaciones de destino.','Controla el comportamiento del comando "Ir a implementaciones" cuando existen varias ubicaciones de destino.','Controla el comportamiento del comando "Ir a referencias" cuando existen varias ubicaciones de destino.','Identificador de comando alternativo que se ejecuta cuando el resultado de "Ir a definici\xF3n" es la ubicaci\xF3n actual.','Id. de comando alternativo que se est\xE1 ejecutando cuando el resultado de "Ir a definici\xF3n de tipo" es la ubicaci\xF3n actual.','Id. de comando alternativo que se est\xE1 ejecutando cuando el resultado de "Ir a declaraci\xF3n" es la ubicaci\xF3n actual.','Id. de comando alternativo que se est\xE1 ejecutando cuando el resultado de "Ir a implementaci\xF3n" es la ubicaci\xF3n actual.','Identificador de comando alternativo que se ejecuta cuando el resultado de "Ir a referencia" es la ubicaci\xF3n actual.',"Controla si se muestra la informaci\xF3n al mantener el puntero sobre un elemento.","Controla el retardo en milisegundos despu\xE9s del cual se muestra la informaci\xF3n al mantener el puntero sobre un elemento.","Controla si la informaci\xF3n que aparece al mantener el puntero sobre un elemento permanece visible al mover el mouse sobre este.","Controla el retraso en milisegundos despu\xE9s del cual se oculta el desplazamiento. Requiere que se habilite `editor.hover.sticky`.","Preferir mostrar los desplazamientos por encima de la l\xEDnea, si hay espacio.","Se supone que todos los caracteres son del mismo ancho. Este es un algoritmo r\xE1pido que funciona correctamente para fuentes monoespaciales y ciertos scripts (como caracteres latinos) donde los glifos tienen el mismo ancho.","Delega el c\xE1lculo de puntos de ajuste en el explorador. Es un algoritmo lento, que podr\xEDa causar bloqueos para archivos grandes, pero funciona correctamente en todos los casos.","Controla el algoritmo que calcula los puntos de ajuste. Tenga en cuenta que, en el modo de accesibilidad, se usar\xE1 el modo avanzado para obtener la mejor experiencia.","Deshabilite el men\xFA de acci\xF3n de c\xF3digo.","Muestra el men\xFA de acci\xF3n del c\xF3digo cuando el cursor est\xE1 en l\xEDneas con c\xF3digo.","Muestra el men\xFA de acci\xF3n de c\xF3digo cuando el cursor est\xE1 en l\xEDneas con c\xF3digo o en l\xEDneas vac\xEDas.","Habilita la bombilla de acci\xF3n de c\xF3digo en el editor.","Muestra los \xE1mbitos actuales anidados durante el desplazamiento en la parte superior del editor.","Define el n\xFAmero m\xE1ximo de l\xEDneas r\xE1pidas que se mostrar\xE1n.","Define el modelo que se va a usar para determinar qu\xE9 l\xEDneas se van a pegar. Si el modelo de esquema no existe, recurrir\xE1 al modelo del proveedor de plegado que recurre al modelo de sangr\xEDa. Este orden se respeta en los tres casos.","Habilite el desplazamiento de desplazamiento r\xE1pido con la barra de desplazamiento horizontal del editor.","Habilita las sugerencias de incrustaci\xF3n en el editor.","Las sugerencias de incrustaci\xF3n est\xE1n habilitadas","Las sugerencias de incrustaci\xF3n se muestran de forma predeterminada y se ocultan cuando se mantiene presionado {0}","Las sugerencias de incrustaci\xF3n est\xE1n ocultas de forma predeterminada y se muestran al mantener presionado {0}","Las sugerencias de incrustaci\xF3n est\xE1n deshabilitadas","Controla el tama\xF1o de fuente de las sugerencias de incrustaci\xF3n en el editor. Como valor predeterminado, se usa {0} cuando el valor configurado es menor que {1} o mayor que el tama\xF1o de fuente del editor.","Controla la familia de fuentes de sugerencias de incrustaci\xF3n en el editor. Cuando se establece en vac\xEDo, se usa el {0}.","Habilita el relleno alrededor de las sugerencias de incrustaci\xF3n en el editor.",`Controla el alto de l\xEDnea. \r
+ - Use 0 para calcular autom\xE1ticamente el alto de l\xEDnea a partir del tama\xF1o de la fuente.\r
+ - Los valores entre 0 y 8 se usar\xE1n como multiplicador con el tama\xF1o de fuente.\r
+ - Los valores mayores o igual que 8 se usar\xE1n como valores efectivos.`,"Controla si se muestra el minimapa.","Controla si el minimapa se oculta autom\xE1ticamente.","El minimapa tiene el mismo tama\xF1o que el contenido del editor (y podr\xEDa desplazarse).","El minimapa se estirar\xE1 o reducir\xE1 seg\xFAn sea necesario para ocupar la altura del editor (sin desplazamiento).","El minimapa se reducir\xE1 seg\xFAn sea necesario para no ser nunca m\xE1s grande que el editor (sin desplazamiento).","Controla el tama\xF1o del minimapa.","Controla en qu\xE9 lado se muestra el minimapa.","Controla cu\xE1ndo se muestra el control deslizante del minimapa.","Escala del contenido dibujado en el minimapa: 1, 2 o 3.","Represente los caracteres reales en una l\xEDnea, por oposici\xF3n a los bloques de color.","Limite el ancho del minimapa para representar como mucho un n\xFAmero de columnas determinado.","Controla la cantidad de espacio entre el borde superior del editor y la primera l\xEDnea.","Controla el espacio entre el borde inferior del editor y la \xFAltima l\xEDnea.","Habilita un elemento emergente que muestra documentaci\xF3n de los par\xE1metros e informaci\xF3n de los tipos mientras escribe.","Controla si el men\xFA de sugerencias de par\xE1metros se cicla o se cierra al llegar al final de la lista.","Las sugerencias r\xE1pidas se muestran dentro del widget de sugerencias","Las sugerencias r\xE1pidas se muestran como texto fantasma","Las sugerencias r\xE1pidas est\xE1n deshabilitadas","Habilita sugerencias r\xE1pidas en las cadenas.","Habilita sugerencias r\xE1pidas en los comentarios.","Habilita sugerencias r\xE1pidas fuera de las cadenas y los comentarios.","Controla si las sugerencias deben mostrarse autom\xE1ticamente al escribir. Puede controlarse para la escritura en comentarios, cadenas y otro c\xF3digo. Las sugerencias r\xE1pidas pueden configurarse para mostrarse como texto fantasma o con el widget de sugerencias. Tenga tambi\xE9n en cuenta la configuraci\xF3n '{0}' que controla si las sugerencias son desencadenadas por caracteres especiales.","Los n\xFAmeros de l\xEDnea no se muestran.","Los n\xFAmeros de l\xEDnea se muestran como un n\xFAmero absoluto.","Los n\xFAmeros de l\xEDnea se muestran como distancia en l\xEDneas a la posici\xF3n del cursor.","Los n\xFAmeros de l\xEDnea se muestran cada 10 l\xEDneas.","Controla la visualizaci\xF3n de los n\xFAmeros de l\xEDnea.","N\xFAmero de caracteres monoespaciales en los que se representar\xE1 esta regla del editor.","Color de esta regla del editor.","Muestra reglas verticales despu\xE9s de un cierto n\xFAmero de caracteres monoespaciados. Usa m\xFAltiples valores para mostrar m\xFAltiples reglas. Si la matriz est\xE1 vac\xEDa, no se muestran reglas.","La barra de desplazamiento vertical estar\xE1 visible solo cuando sea necesario.","La barra de desplazamiento vertical estar\xE1 siempre visible.","La barra de desplazamiento vertical estar\xE1 siempre oculta.","Controla la visibilidad de la barra de desplazamiento vertical.","La barra de desplazamiento horizontal estar\xE1 visible solo cuando sea necesario.","La barra de desplazamiento horizontal estar\xE1 siempre visible.","La barra de desplazamiento horizontal estar\xE1 siempre oculta.","Controla la visibilidad de la barra de desplazamiento horizontal.","Ancho de la barra de desplazamiento vertical.","Altura de la barra de desplazamiento horizontal.","Controla si al hacer clic se desplaza por p\xE1gina o salta a la posici\xF3n donde se hace clic.","Cuando se establece, la barra de desplazamiento horizontal no aumentar\xE1 el tama\xF1o del contenido del editor.","Controla si se resaltan todos los caracteres ASCII no b\xE1sicos. Solo los caracteres entre U+0020 y U+007E, tabulaci\xF3n, avance de l\xEDnea y retorno de carro se consideran ASCII b\xE1sicos.","Controla si se resaltan los caracteres que solo reservan espacio o que no tienen ancho.","Controla si se resaltan caracteres que se pueden confundir con caracteres ASCII b\xE1sicos, excepto los que son comunes en la configuraci\xF3n regional del usuario actual.","Controla si los caracteres de los comentarios tambi\xE9n deben estar sujetos al resaltado Unicode.","Controla si los caracteres de las cadenas tambi\xE9n deben estar sujetos al resaltado Unicode.","Define los caracteres permitidos que no se resaltan.","Los caracteres Unicode que son comunes en las configuraciones regionales permitidas no se resaltan.","Controla si se deben mostrar autom\xE1ticamente las sugerencias alineadas en el editor.","Muestra la barra de herramientas de sugerencias insertadas cada vez que se muestra una sugerencia insertada.","Muestra la barra de herramientas de sugerencias insertadas al mantener el puntero sobre una sugerencia insertada.","No mostrar nunca la barra de herramientas de sugerencias insertadas.","Controla cu\xE1ndo mostrar la barra de herramientas de sugerencias insertadas.","Controla c\xF3mo interact\xFAan las sugerencias insertadas con el widget de sugerencias. Si se habilita, el widget de sugerencias no se muestra autom\xE1ticamente cuando hay sugerencias insertadas disponibles.","Controla la familia de fuentes de las sugerencias insertadas.","Controla si est\xE1 habilitada o no la coloraci\xF3n de pares de corchetes. Use {0} para invalidar los colores de resaltado de corchete.","Controla si cada tipo de corchete tiene su propio grupo de colores independiente.","Habilita gu\xEDas de par de corchetes.","Habilita gu\xEDas de par de corchetes solo para el par de corchetes activo.","Deshabilita las gu\xEDas de par de corchetes.","Controla si est\xE1n habilitadas las gu\xEDas de pares de corchetes.","Habilita gu\xEDas horizontales como adici\xF3n a gu\xEDas de par de corchetes verticales.","Habilita gu\xEDas horizontales solo para el par de corchetes activo.","Deshabilita las gu\xEDas de par de corchetes horizontales.","Controla si est\xE1n habilitadas las gu\xEDas de pares de corchetes horizontales.","Controla si el editor debe resaltar el par de corchetes activo.","Controla si el editor debe representar gu\xEDas de sangr\xEDa.","Resalta la gu\xEDa de sangr\xEDa activa.","Resalta la gu\xEDa de sangr\xEDa activa incluso si se resaltan las gu\xEDas de corchetes.","No resalta la gu\xEDa de sangr\xEDa activa.","Controla si el editor debe resaltar la gu\xEDa de sangr\xEDa activa.","Inserte la sugerencia sin sobrescribir el texto a la derecha del cursor.","Inserte la sugerencia y sobrescriba el texto a la derecha del cursor.","Controla si las palabras se sobrescriben al aceptar la finalizaci\xF3n. Tenga en cuenta que esto depende de las extensiones que participan en esta caracter\xEDstica.","Controla si el filtrado y la ordenaci\xF3n de sugerencias se tienen en cuenta para los errores ortogr\xE1ficos peque\xF1os.","Controla si la ordenaci\xF3n mejora las palabras que aparecen cerca del cursor.",'Controla si las selecciones de sugerencias recordadas se comparten entre m\xFAltiples \xE1reas de trabajo y ventanas (necesita "#editor.suggestSelection#").',"Seleccione siempre una sugerencia cuando se desencadene IntelliSense autom\xE1ticamente.","Nunca seleccione una sugerencia cuando desencadene IntelliSense autom\xE1ticamente.","Seleccione una sugerencia solo cuando desencadene IntelliSense desde un car\xE1cter de desencadenador.","Seleccione una sugerencia solo cuando desencadene IntelliSense mientras escribe.","Controla si se selecciona una sugerencia cuando se muestra el widget. Tenga en cuenta que esto solo se aplica a las sugerencias desencadenadas autom\xE1ticamente (`#editor.quickSuggestions#` y `#editor.suggestOnTriggerCharacters#`) y que siempre se selecciona una sugerencia cuando se invoca expl\xEDcitamente, por ejemplo, a trav\xE9s de 'Ctrl+Espacio'.","Controla si un fragmento de c\xF3digo activo impide sugerencias r\xE1pidas.","Controla si mostrar u ocultar iconos en sugerencias.","Controla la visibilidad de la barra de estado en la parte inferior del widget de sugerencias.","Controla si se puede obtener una vista previa del resultado de la sugerencia en el editor.","Controla si los detalles de sugerencia se muestran incorporados con la etiqueta o solo en el widget de detalles.","La configuraci\xF3n est\xE1 en desuso. Ahora puede cambiarse el tama\xF1o del widget de sugerencias.",'Esta configuraci\xF3n est\xE1 en desuso. Use configuraciones separadas como "editor.suggest.showKeyword" o "editor.suggest.showSnippets" en su lugar.','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "method".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de "funci\xF3n".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "constructor".','Cuando se activa IntelliSense muestra sugerencias "obsoletas".','Cuando se activa el filtro IntelliSense se requiere que el primer car\xE1cter coincida con el inicio de una palabra. Por ejemplo, "c" en "Consola" o "WebContext" but _not_ on "descripci\xF3n". Si se desactiva, IntelliSense mostrar\xE1 m\xE1s resultados, pero los ordenar\xE1 seg\xFAn la calidad de la coincidencia.','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "field".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "variable".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "class".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "struct".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "interface".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "module".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "property".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "event".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "operator".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "unit".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de "value".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "constant".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "enum".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "enumMember".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "keyword".','Si est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "text".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de "color".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "file".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "reference".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "customcolor".','Si est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "folder".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "typeParameter".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "snippet".',"Cuando est\xE1 habilitado, IntelliSense muestra sugerencias del usuario.","Cuando est\xE1 habilitado IntelliSense muestra sugerencias para problemas.","Indica si los espacios en blanco iniciales y finales deben seleccionarse siempre.",'Indica si se deben seleccionar las subpalabras (como "foo" en "fooBar" o "foo_bar").',"No hay sangr\xEDa. Las l\xEDneas ajustadas comienzan en la columna 1.","A las l\xEDneas ajustadas se les aplica la misma sangr\xEDa que al elemento primario.","A las l\xEDneas ajustadas se les aplica una sangr\xEDa de +1 respecto al elemento primario.","A las l\xEDneas ajustadas se les aplica una sangr\xEDa de +2 respecto al elemento primario.","Controla la sangr\xEDa de las l\xEDneas ajustadas.",'Controla si puede arrastrar y colocar un archivo en un editor de texto manteniendo presionada la tecla "May\xFAs" (en lugar de abrir el archivo en un editor).',"Controla si se muestra un widget al colocar archivos en el editor. Este widget le permite controlar c\xF3mo se coloca el archivo.","Muestra el widget del selector de colocaci\xF3n despu\xE9s de colocar un archivo en el editor.","No mostrar nunca el widget del selector de colocaci\xF3n. En su lugar, siempre se usa el proveedor de colocaci\xF3n predeterminado.","Controla si se puede pegar contenido de distintas formas.","Controla si se muestra un widget al pegar contenido en el editor. Este widget le permite controlar c\xF3mo se pega el archivo.","Muestra el widget del selector de pegado despu\xE9s de pegar contenido en el editor.","No mostrar nunca el widget del selector de pegado. En su lugar, siempre se usa el comportamiento de pegado predeterminado.",'Controla si se deben aceptar sugerencias en los caracteres de confirmaci\xF3n. Por ejemplo, en Javascript, el punto y coma (";") puede ser un car\xE1cter de confirmaci\xF3n que acepta una sugerencia y escribe ese car\xE1cter.','Aceptar solo una sugerencia con "Entrar" cuando realiza un cambio textual.','Controla si las sugerencias deben aceptarse con "Entrar", adem\xE1s de "TAB". Ayuda a evitar la ambig\xFCedad entre insertar nuevas l\xEDneas o aceptar sugerencias.',"Controla el n\xFAmero de l\xEDneas del editor que pueden ser le\xEDdas por un lector de pantalla a la vez. Cuando detectamos un lector de pantalla, fijamos autom\xE1ticamente el valor por defecto en 500. Advertencia: esto tiene una implicaci\xF3n de rendimiento para n\xFAmeros mayores que el predeterminado.","Contenido del editor","Controlar si un lector de pantalla anuncia sugerencias insertadas.","Utilizar las configuraciones del lenguaje para determinar cu\xE1ndo cerrar los corchetes autom\xE1ticamente.","Cerrar autom\xE1ticamente los corchetes cuando el cursor est\xE9 a la izquierda de un espacio en blanco.","Controla si el editor debe cerrar autom\xE1ticamente los corchetes despu\xE9s de que el usuario agregue un corchete de apertura.","Utilice las configuraciones de idioma para determinar cu\xE1ndo cerrar los comentarios autom\xE1ticamente.","Cerrar autom\xE1ticamente los comentarios solo cuando el cursor est\xE9 a la izquierda de un espacio en blanco.","Controla si el editor debe cerrar autom\xE1ticamente los comentarios despu\xE9s de que el usuario agregue un comentario de apertura.","Quite los corchetes o las comillas de cierre adyacentes solo si se insertaron autom\xE1ticamente.","Controla si el editor debe quitar los corchetes o las comillas de cierre adyacentes al eliminar.","Escriba en las comillas o los corchetes solo si se insertaron autom\xE1ticamente.","Controla si el editor debe escribir entre comillas o corchetes.","Utilizar las configuraciones del lenguaje para determinar cu\xE1ndo cerrar las comillas autom\xE1ticamente. ","Cerrar autom\xE1ticamente las comillas cuando el cursor est\xE9 a la izquierda de un espacio en blanco. ","Controla si el editor debe cerrar autom\xE1ticamente las comillas despu\xE9s de que el usuario agrega uma comilla de apertura.","El editor no insertar\xE1 la sangr\xEDa autom\xE1ticamente.","El editor mantendr\xE1 la sangr\xEDa de la l\xEDnea actual.","El editor respetar\xE1 la sangr\xEDa de la l\xEDnea actual y los corchetes definidos por el idioma.","El editor mantendr\xE1 la sangr\xEDa de la l\xEDnea actual, respetar\xE1 los corchetes definidos por el idioma e invocar\xE1 onEnterRules especiales definidos por idiomas.","El editor respetar\xE1 la sangr\xEDa de la l\xEDnea actual, los corchetes definidos por idiomas y las reglas indentationRules definidas por idiomas, adem\xE1s de invocar reglas onEnterRules especiales.","Controla si el editor debe ajustar autom\xE1ticamente la sangr\xEDa mientras los usuarios escriben, pegan, mueven o sangran l\xEDneas.","Use las configuraciones de idioma para determinar cu\xE1ndo delimitar las selecciones autom\xE1ticamente.","Envolver con comillas, pero no con corchetes.","Envolver con corchetes, pero no con comillas.","Controla si el editor debe rodear autom\xE1ticamente las selecciones al escribir comillas o corchetes.","Emula el comportamiento de selecci\xF3n de los caracteres de tabulaci\xF3n al usar espacios para la sangr\xEDa. La selecci\xF3n se aplicar\xE1 a las tabulaciones.","Controla si el editor muestra CodeLens.","Controla la familia de fuentes para CodeLens.",'Controla el tama\xF1o de fuente de CodeLens en p\xEDxeles. Cuando se establece en 0, se usa el 90\xA0% de "#editor.fontSize#".',"Controla si el editor debe representar el Selector de colores y los elementos Decorator de color en l\xEDnea.","Hacer que el selector de colores aparezca tanto al hacer clic como al mantener el puntero sobre el decorador de color","Hacer que el selector de colores aparezca al pasar el puntero sobre el decorador de color","Hacer que el selector de colores aparezca al hacer clic en el decorador de color","Controla la condici\xF3n para que un selector de colores aparezca de un decorador de color","Controla el n\xFAmero m\xE1ximo de decoradores de color que se pueden representar en un editor a la vez.","Habilite que la selecci\xF3n con el mouse y las teclas est\xE9 realizando la selecci\xF3n de columnas.","Controla si el resaltado de sintaxis debe ser copiado al portapapeles.","Controla el estilo de animaci\xF3n del cursor.","La animaci\xF3n del s\xEDmbolo de intercalaci\xF3n suave est\xE1 deshabilitada.","La animaci\xF3n de s\xEDmbolo de intercalaci\xF3n suave solo se habilita cuando el usuario mueve el cursor con un gesto expl\xEDcito.","La animaci\xF3n de s\xEDmbolo de intercalaci\xF3n suave siempre est\xE1 habilitada.","Controla si la animaci\xF3n suave del cursor debe estar habilitada.","Controla el estilo del cursor.",'Controla el n\xFAmero m\xEDnimo de l\xEDneas iniciales visibles (m\xEDnimo 0) y l\xEDneas finales (m\xEDnimo 1) que rodean el cursor. Se conoce como "scrollOff" o "scrollOffset" en otros editores.','Solo se aplica "cursorSurroundingLines" cuando se desencadena mediante el teclado o la API.','"cursorSurroundingLines" se aplica siempre.','Controla cuando se debe aplicar "#cursorSurroundingLines#".','Controla el ancho del cursor cuando "#editor.cursorStyle#" se establece en "line".',"Controla si el editor debe permitir mover las selecciones mediante arrastrar y colocar.","Use un nuevo m\xE9todo de representaci\xF3n con svgs.","Use un nuevo m\xE9todo de representaci\xF3n con caracteres de fuente.","Use el m\xE9todo de representaci\xF3n estable.","Controla si los espacios en blanco se representan con un nuevo m\xE9todo experimental.",'Multiplicador de la velocidad de desplazamiento al presionar "Alt".',"Controla si el editor tiene el plegado de c\xF3digo habilitado.","Utilice una estrategia de plegado espec\xEDfica del idioma, si est\xE1 disponible, de lo contrario la basada en sangr\xEDa.","Utilice la estrategia de plegado basada en sangr\xEDa.","Controla la estrategia para calcular rangos de plegado.","Controla si el editor debe destacar los rangos plegados.","Permite controlar si el editor contrae autom\xE1ticamente los rangos de importaci\xF3n.","N\xFAmero m\xE1ximo de regiones plegables. Si aumenta este valor, es posible que el editor tenga menos capacidad de respuesta cuando el origen actual tiene un gran n\xFAmero de regiones plegables.","Controla si al hacer clic en el contenido vac\xEDo despu\xE9s de una l\xEDnea plegada se desplegar\xE1 la l\xEDnea.","Controla la familia de fuentes.","Controla si el editor debe dar formato autom\xE1ticamente al contenido pegado. Debe haber disponible un formateador capaz de aplicar formato a un rango dentro de un documento. ","Controla si el editor debe dar formato a la l\xEDnea autom\xE1ticamente despu\xE9s de escribirla.","Controla si el editor debe representar el margen de glifo vertical. El margen de glifo se usa, principalmente, para depuraci\xF3n.","Controla si el cursor debe ocultarse en la regla de informaci\xF3n general.","Controla el espacio entre letras en p\xEDxeles.","Controla si el editor tiene habilitada la edici\xF3n vinculada. Dependiendo del lenguaje, los s\xEDmbolos relacionados (por ejemplo, las etiquetas HTML) se actualizan durante la edici\xF3n.","Controla si el editor debe detectar v\xEDnculos y hacerlos interactivos.","Resaltar par\xE9ntesis coincidentes.",'Se usar\xE1 un multiplicador en los eventos de desplazamiento de la rueda del mouse "deltaX" y "deltaY". ',"Acercar la fuente del editor al usar la rueda del mouse y mantener pulsado 'Cmd'.",'Ampliar la fuente del editor cuando se use la rueda del mouse mientras se presiona "Ctrl".',"Combinar varios cursores cuando se solapan.",'Se asigna a "Control" en Windows y Linux y a "Comando" en macOS.','Se asigna a "Alt" en Windows y Linux y a "Opci\xF3n" en macOS.',"El modificador que se usar\xE1 para agregar varios cursores con el mouse. Los gestos del mouse Ir a definici\xF3n y Abrir v\xEDnculo se adaptar\xE1n de modo que no entren en conflicto con el [modificador multicursor](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).","Cada cursor pega una \xFAnica l\xEDnea del texto.","Cada cursor pega el texto completo.","Controla el pegado cuando el recuento de l\xEDneas del texto pegado coincide con el recuento de cursores.","Controla el n\xFAmero m\xE1ximo de cursores que puede haber en un editor activo a la vez.","No resalta las repeticiones.","Resalta las repeticiones solo en el archivo actual.","Experimental: Resalta las repeticiones en todos los archivos abiertos v\xE1lidos.","Controla si las repeticiones deben resaltarse en los archivos abiertos.","Controla si debe dibujarse un borde alrededor de la regla de informaci\xF3n general.","Enfocar el \xE1rbol al abrir la inspecci\xF3n","Enfocar el editor al abrir la inspecci\xF3n","Controla si se debe enfocar el editor en l\xEDnea o el \xE1rbol en el widget de vista.","Controla si el gesto del mouse Ir a definici\xF3n siempre abre el widget interactivo.","Controla el retraso, en milisegundos, tras el cual aparecer\xE1n sugerencias r\xE1pidas.","Controla si el editor cambia el nombre autom\xE1ticamente en el tipo.",'En desuso. Utilice "editor.linkedEditing" en su lugar.',"Controla si el editor debe representar caracteres de control.","Representar el n\xFAmero de la \xFAltima l\xEDnea cuando el archivo termina con un salto de l\xEDnea.","Resalta el medianil y la l\xEDnea actual.","Controla c\xF3mo debe representar el editor el resaltado de l\xEDnea actual.","Controla si el editor debe representar el resaltado de la l\xEDnea actual solo cuando el editor est\xE1 enfocado.","Representa caracteres de espacio en blanco, excepto los espacios individuales entre palabras.","Represente los caracteres de espacio en blanco solo en el texto seleccionado.","Representa solo los caracteres de espacio en blanco al final.","Controla la forma en que el editor debe representar los caracteres de espacio en blanco.","Controla si las selecciones deber\xEDan tener las esquinas redondeadas.","Controla el n\xFAmero de caracteres adicionales a partir del cual el editor se desplazar\xE1 horizontalmente.","Controla si el editor seguir\xE1 haciendo scroll despu\xE9s de la \xFAltima l\xEDnea.","Despl\xE1cese solo a lo largo del eje predominante cuando se desplace vertical y horizontalmente al mismo tiempo. Evita la deriva horizontal cuando se desplaza verticalmente en un trackpad.","Controla si el portapapeles principal de Linux debe admitirse.","Controla si el editor debe destacar las coincidencias similares a la selecci\xF3n.","Mostrar siempre los controles de plegado.","No mostrar nunca los controles de plegado y reducir el tama\xF1o del medianil.","Mostrar solo los controles de plegado cuando el mouse est\xE1 sobre el medianil.","Controla cu\xE1ndo se muestran los controles de plegado en el medianil.","Controla el fundido de salida del c\xF3digo no usado.","Controla las variables en desuso tachadas.","Mostrar sugerencias de fragmentos de c\xF3digo por encima de otras sugerencias.","Mostrar sugerencias de fragmentos de c\xF3digo por debajo de otras sugerencias.","Mostrar sugerencias de fragmentos de c\xF3digo con otras sugerencias.","No mostrar sugerencias de fragmentos de c\xF3digo.","Controla si se muestran los fragmentos de c\xF3digo con otras sugerencias y c\xF3mo se ordenan.","Controla si el editor se desplazar\xE1 con una animaci\xF3n.","Controla si se debe proporcionar la sugerencia de accesibilidad a los usuarios del lector de pantalla cuando se muestra una finalizaci\xF3n insertada.","Tama\xF1o de fuente del widget de sugerencias. Cuando se establece en {0}, se usa el valor de {1}.","Alto de l\xEDnea para el widget de sugerencias. Cuando se establece en {0}, se usa el valor de {1}. El valor m\xEDnimo es 8.","Controla si deben aparecer sugerencias de forma autom\xE1tica al escribir caracteres desencadenadores.","Seleccionar siempre la primera sugerencia.",'Seleccione sugerencias recientes a menos que al escribir m\xE1s se seleccione una, por ejemplo, "console.| -> console.log" porque "log" se ha completado recientemente.','Seleccione sugerencias basadas en prefijos anteriores que han completado esas sugerencias, por ejemplo, "co -> console" y "con -> const".',"Controla c\xF3mo se preseleccionan las sugerencias cuando se muestra la lista,","La pesta\xF1a se completar\xE1 insertando la mejor sugerencia de coincidencia encontrada al presionar la pesta\xF1a","Deshabilitar los complementos para pesta\xF1as.","La pesta\xF1a se completa con fragmentos de c\xF3digo cuando su prefijo coincide. Funciona mejor cuando las 'quickSuggestions' no est\xE1n habilitadas.","Habilita completar pesta\xF1as.","Los terminadores de l\xEDnea no habituales se quitan autom\xE1ticamente.","Los terminadores de l\xEDnea no habituales se omiten.","Advertencia de terminadores de l\xEDnea inusuales que se quitar\xE1n.","Quite los terminadores de l\xEDnea inusuales que podr\xEDan provocar problemas.","La inserci\xF3n y eliminaci\xF3n del espacio en blanco sigue a las tabulaciones.","Use la regla de salto de l\xEDnea predeterminada.","Los saltos de palabra no deben usarse para texto chino, japon\xE9s o coreano (CJK). El comportamiento del texto distinto a CJK es el mismo que el normal.","Controla las reglas de salto de palabra usadas para texto chino, japon\xE9s o coreano (CJK).","Caracteres que se usar\xE1n como separadores de palabras al realizar operaciones o navegaciones relacionadas con palabras.","Las l\xEDneas no se ajustar\xE1n nunca.","Las l\xEDneas se ajustar\xE1n en el ancho de la ventanilla.",'Las l\xEDneas se ajustar\xE1n al valor de "#editor.wordWrapColumn#". ','Las l\xEDneas se ajustar\xE1n al valor que sea inferior: el tama\xF1o de la ventanilla o el valor de "#editor.wordWrapColumn#".',"Controla c\xF3mo deben ajustarse las l\xEDneas.",'Controla la columna de ajuste del editor cuando "#editor.wordWrap#" es "wordWrapColumn" o "bounded".',"Controla si las decoraciones de color en l\xEDnea deben mostrarse con el proveedor de colores del documento predeterminado.","Controla si el editor recibe las pesta\xF1as o las aplaza al \xE1rea de trabajo para la navegaci\xF3n."],"vs/editor/common/core/editorColorRegistry":["Color de fondo para la l\xEDnea resaltada en la posici\xF3n del cursor.","Color de fondo del borde alrededor de la l\xEDnea en la posici\xF3n del cursor.","Color de fondo de rangos resaltados, como en abrir r\xE1pido y encontrar caracter\xEDsticas. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de fondo del borde alrededor de los intervalos resaltados.","Color de fondo del s\xEDmbolo destacado, como Ir a definici\xF3n o Ir al siguiente/anterior s\xEDmbolo. El color no debe ser opaco para no ocultar la decoraci\xF3n subyacente.","Color de fondo del borde alrededor de los s\xEDmbolos resaltados.","Color del cursor del editor.","Color de fondo del cursor de edici\xF3n. Permite personalizar el color del caracter solapado por el bloque del cursor.","Color de los caracteres de espacio en blanco del editor.","Color de n\xFAmeros de l\xEDnea del editor.","Color de las gu\xEDas de sangr\xEDa del editor.",'"editorIndentGuide.background" est\xE1 en desuso. Use "editorIndentGuide.background1" en su lugar.',"Color de las gu\xEDas de sangr\xEDa activas del editor.",'"editorIndentGuide.activeBackground" est\xE1 en desuso. Use "editorIndentGuide.activeBackground1" en su lugar.',"Color de las gu\xEDas de sangr\xEDa del editor (1).","Color de las gu\xEDas de sangr\xEDa del editor (2).","Color de las gu\xEDas de sangr\xEDa del editor (3).","Color de las gu\xEDas de sangr\xEDa del editor (4).","Color de las gu\xEDas de sangr\xEDa del editor (5).","Color de las gu\xEDas de sangr\xEDa del editor (6).","Color de las gu\xEDas de sangr\xEDa del editor activo (1).","Color de las gu\xEDas de sangr\xEDa del editor activo (2).","Color de las gu\xEDas de sangr\xEDa del editor activo (3).","Color de las gu\xEDas de sangr\xEDa del editor activo (4).","Color de las gu\xEDas de sangr\xEDa del editor activo (5).","Color de las gu\xEDas de sangr\xEDa del editor activo (6).","Color del n\xFAmero de l\xEDnea activa en el editor","ID es obsoleto. Usar en lugar 'editorLineNumber.activeForeground'. ","Color del n\xFAmero de l\xEDnea activa en el editor","Color de la l\xEDnea final del editor cuando editor.renderFinalNewline se establece en atenuado.","Color de las reglas del editor","Color principal de lentes de c\xF3digo en el editor","Color de fondo tras corchetes coincidentes","Color de bloques con corchetes coincidentes","Color del borde de la regla de visi\xF3n general.","Color de fondo de la regla de informaci\xF3n general del editor.","Color de fondo del margen del editor. Este espacio contiene los m\xE1rgenes de glifos y los n\xFAmeros de l\xEDnea.","Color del borde de c\xF3digo fuente innecesario (sin usar) en el editor.",`Opacidad de c\xF3digo fuente innecesario (sin usar) en el editor. Por ejemplo, "#000000c0" representar\xE1 el c\xF3digo con un 75 % de opacidad. Para temas de alto contraste, utilice el color del tema 'editorUnnecessaryCode.border' para resaltar el c\xF3digo innecesario en vez de atenuarlo.`,"Color del borde del texto fantasma en el editor.","Color de primer plano del texto fantasma en el editor.","Color de fondo del texto fantasma en el editor.","Color de marcador de regla general para los destacados de rango. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de marcador de regla de informaci\xF3n general para errores. ","Color de marcador de regla de informaci\xF3n general para advertencias.","Color de marcador de regla de informaci\xF3n general para mensajes informativos. ","Color de primer plano de los corchetes (1). Requiere que se habilite la coloraci\xF3n del par de corchetes.","Color de primer plano de los corchetes (2). Requiere que se habilite la coloraci\xF3n del par de corchetes.","Color de primer plano de los corchetes (3). Requiere que se habilite la coloraci\xF3n del par de corchetes.","Color de primer plano de los corchetes (4). Requiere que se habilite la coloraci\xF3n del par de corchetes.","Color de primer plano de los corchetes (5). Requiere que se habilite la coloraci\xF3n del par de corchetes.","Color de primer plano de los corchetes (6). Requiere que se habilite la coloraci\xF3n del par de corchetes.","Color de primer plano de corchetes inesperados.","Color de fondo de las gu\xEDas de par de corchetes inactivos (1). Requiere habilitar gu\xEDas de par de corchetes.","Color de fondo de las gu\xEDas de par de corchetes inactivos (2). Requiere habilitar gu\xEDas de par de corchetes.","Color de fondo de las gu\xEDas de par de corchetes inactivos (3). Requiere habilitar gu\xEDas de par de corchetes.","Color de fondo de las gu\xEDas de par de corchetes inactivos (4). Requiere habilitar gu\xEDas de par de corchetes.","Color de fondo de las gu\xEDas de par de corchetes inactivos (5). Requiere habilitar gu\xEDas de par de corchetes.","Color de fondo de las gu\xEDas de par de corchetes inactivos (6). Requiere habilitar gu\xEDas de par de corchetes.","Color de fondo de las gu\xEDas de pares de corchetes activos (1). Requiere habilitar gu\xEDas de par de corchetes.","Color de fondo de las gu\xEDas de par de corchetes activos (2). Requiere habilitar gu\xEDas de par de corchetes.","Color de fondo de las gu\xEDas de pares de corchetes activos (3). Requiere habilitar gu\xEDas de par de corchetes.","Color de fondo de las gu\xEDas de par de corchetes activos (4). Requiere habilitar gu\xEDas de par de corchetes.","Color de fondo de las gu\xEDas de par de corchetes activos (5). Requiere habilitar gu\xEDas de par de corchetes.","Color de fondo de las gu\xEDas de par de corchetes activos (6). Requiere habilitar gu\xEDas de par de corchetes.","Color de borde usado para resaltar caracteres Unicode.","Color de borde usado para resaltar caracteres unicode."],"vs/editor/common/editorContextKeys":["Si el texto del editor tiene el foco (el cursor parpadea)","Si el editor o un widget del editor tiene el foco (por ejemplo, el foco est\xE1 en el widget de b\xFAsqueda)","Si un editor o una entrada de texto enriquecido tienen el foco (el cursor parpadea)","Si el editor es de solo lectura","Si el contexto es un editor de diferencias","Si el contexto es un editor de diferencias incrustado","Si el contexto es un editor de diferencias m\xFAltiples","Si todos los archivos del editor de diferencias m\xFAltiples est\xE1n contra\xEDdos","Si el editor de diferencias tiene cambios","Indica si se selecciona un bloque de c\xF3digo movido para la comparaci\xF3n","Si el visor de diferencias accesible est\xE1 visible","Indica si se alcanza el punto de interrupci\xF3n insertado en paralelo del editor de diferencias",'Si "editor.columnSelection" se ha habilitado',"Si el editor tiene texto seleccionado","Si el editor tiene varias selecciones",'Si "Tabulaci\xF3n" mover\xE1 el foco fuera del editor',"Si el mantenimiento del puntero del editor es visible","Si se centra el desplazamiento del editor","Si el desplazamiento permanente est\xE1 centrado","Si el desplazamiento permanente est\xE1 visible","Si el selector de colores independiente est\xE1 visible","Si el selector de colores independiente est\xE1 centrado","Si el editor forma parte de otro m\xE1s grande (por ejemplo, blocs de notas)","Identificador de idioma del editor","Si el editor tiene un proveedor de elementos de finalizaci\xF3n","Si el editor tiene un proveedor de acciones de c\xF3digo","Si el editor tiene un proveedor de CodeLens","Si el editor tiene un proveedor de definiciones","Si el editor tiene un proveedor de declaraciones","Si el editor tiene un proveedor de implementaci\xF3n","Si el editor tiene un proveedor de definiciones de tipo","Si el editor tiene un proveedor de contenido con mantenimiento del puntero","Si el editor tiene un proveedor de resaltado de documentos","Si el editor tiene un proveedor de s\xEDmbolos de documentos","Si el editor tiene un proveedor de referencia","Si el editor tiene un proveedor de cambio de nombre","Si el editor tiene un proveedor de ayuda de signatura","Si el editor tiene un proveedor de sugerencias insertadas","Si el editor tiene un proveedor de formatos de documento","Si el editor tiene un proveedor de formatos de selecci\xF3n de documentos","Si el editor tiene varios proveedores de formatos del documento","Si el editor tiene varios proveedores de formato de la selecci\xF3n de documentos"],"vs/editor/common/languages":["matriz","booleano","clase","constante","constructor","enumeraci\xF3n","miembro de la enumeraci\xF3n","evento","campo","archivo","funci\xF3n","interfaz","clave","m\xE9todo","m\xF3dulo","espacio de nombres","NULL","n\xFAmero","objeto","operador","paquete","propiedad","cadena","estructura","par\xE1metro de tipo","variable","{0} ({1})"],"vs/editor/common/languages/modesRegistry":["Texto sin formato"],"vs/editor/common/model/editStack":["Escribiendo"],"vs/editor/common/standaloneStrings":["Desarrollador: inspeccionar tokens","Vaya a L\xEDnea/Columna...","Mostrar todos los proveedores de acceso r\xE1pido","Paleta de comandos","Mostrar y ejecutar comandos","Ir a s\xEDmbolo...","Ir a s\xEDmbolo por categor\xEDa...","Contenido del editor","Presione Alt+F1 para ver las opciones de accesibilidad.","Alternar tema de contraste alto","{0} ediciones realizadas en {1} archivos"],"vs/editor/common/viewLayout/viewLineRenderer":["Mostrar m\xE1s ({0})","{0} caracteres"],"vs/editor/contrib/anchorSelect/browser/anchorSelect":["Delimitador de la selecci\xF3n","Delimitador establecido en {0}:{1}","Establecer el delimitador de la selecci\xF3n","Ir al delimitador de la selecci\xF3n","Seleccionar desde el delimitador hasta el cursor","Cancelar el delimitador de la selecci\xF3n"],"vs/editor/contrib/bracketMatching/browser/bracketMatching":["Resumen color de marcador de regla para corchetes.","Ir al corchete","Seleccionar para corchete","Quitar corchetes","Ir al &&corchete","Se selecciona el texto que est\xE1 dentro, incluyendo los corchetes o las llaves"],"vs/editor/contrib/caretOperations/browser/caretOperations":["Mover el texto seleccionado a la izquierda","Mover el texto seleccionado a la derecha"],"vs/editor/contrib/caretOperations/browser/transpose":["Transponer letras"],"vs/editor/contrib/clipboard/browser/clipboard":["Cor&&tar","Cortar","Cortar","Cortar","&&Copiar","Copiar","Copiar","Copiar","Copiar como","Copiar como","Compartir","Compartir","Compartir","&&Pegar","Pegar","Pegar","Pegar","Copiar con resaltado de sintaxis"],"vs/editor/contrib/codeAction/browser/codeAction":["Se ha producido un error desconocido al aplicar la acci\xF3n de c\xF3digo"],"vs/editor/contrib/codeAction/browser/codeActionCommands":["Tipo de la acci\xF3n de c\xF3digo que se va a ejecutar.","Controla cu\xE1ndo se aplican las acciones devueltas.","Aplicar siempre la primera acci\xF3n de c\xF3digo devuelto.","Aplicar la primera acci\xF3n de c\xF3digo devuelta si solo hay una.","No aplique las acciones de c\xF3digo devuelto.","Controla si solo se deben devolver las acciones de c\xF3digo preferidas.","Correcci\xF3n R\xE1pida","No hay acciones de c\xF3digo disponibles",'No hay acciones de c\xF3digo preferidas para "{0}" disponibles','No hay ninguna acci\xF3n de c\xF3digo para "{0}" disponible.',"No hay acciones de c\xF3digo preferidas disponibles","No hay acciones de c\xF3digo disponibles","Refactorizar...",'No hay refactorizaciones preferidas de "{0}" disponibles','No hay refactorizaciones de "{0}" disponibles',"No hay ninguna refactorizaci\xF3n favorita disponible.","No hay refactorizaciones disponibles","Acci\xF3n de c\xF3digo fuente...",'No hay acciones de origen preferidas para "{0}" disponibles','No hay ninguna acci\xF3n de c\xF3digo fuente para "{0}" disponible.',"No hay ninguna acci\xF3n de c\xF3digo fuente favorita disponible.","No hay acciones de origen disponibles","Organizar Importaciones","No hay acciones de importaci\xF3n disponibles","Corregir todo","No est\xE1 disponible la acci\xF3n de corregir todo","Corregir autom\xE1ticamente...","No hay autocorrecciones disponibles"],"vs/editor/contrib/codeAction/browser/codeActionContributions":["Activar/desactivar la visualizaci\xF3n de los encabezados de los grupos en el men\xFA de Acci\xF3n de c\xF3digo.","Habilita o deshabilita la visualizaci\xF3n de la correcci\xF3n r\xE1pida m\xE1s cercana dentro de una l\xEDnea cuando no est\xE1 actualmente en un diagn\xF3stico."],"vs/editor/contrib/codeAction/browser/codeActionController":["Contexto: {0} en la l\xEDnea {1} y columna {2}.","Ocultar deshabilitado","Mostrar elementos deshabilitados"],"vs/editor/contrib/codeAction/browser/codeActionMenu":["M\xE1s Acciones...","Correcci\xF3n r\xE1pida","Extraer","Insertado","Reescribir","Mover","Delimitar con","Acci\xF3n de origen"],"vs/editor/contrib/codeAction/browser/lightBulbWidget":["Ejecutar: {0}","Mostrar acciones de c\xF3digo. Correcci\xF3n r\xE1pida preferida disponible ({0})","Mostrar acciones de c\xF3digo ({0})","Mostrar acciones de c\xF3digo"],"vs/editor/contrib/codelens/browser/codelensController":["Mostrar comandos de lente de c\xF3digo para la l\xEDnea actual","Seleccionar un comando"],"vs/editor/contrib/colorPicker/browser/colorPickerWidget":["Haga clic para alternar las opciones de color (rgb/hsl/hex)","Icono para cerrar el selector de colores"],"vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions":["Mostrar o centrar Selector de colores independientes","&Mostrar o centrar Selector de colores independientes","Ocultar la Selector de colores","Insertar color con Selector de colores independiente"],"vs/editor/contrib/comment/browser/comment":["Alternar comentario de l\xEDnea","&&Alternar comentario de l\xEDnea","Agregar comentario de l\xEDnea","Quitar comentario de l\xEDnea","Alternar comentario de bloque","Alternar &&bloque de comentario"],"vs/editor/contrib/contextmenu/browser/contextmenu":["Minimapa","Representar caracteres","Tama\xF1o vertical","Proporcional","Relleno","Ajustar","Control deslizante","Pasar el mouse","Siempre","Mostrar men\xFA contextual del editor"],"vs/editor/contrib/cursorUndo/browser/cursorUndo":["Cursor Deshacer","Cursor Rehacer"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution":["Pegar como...","Id. de la edici\xF3n pegada que se intenta aplicar. Si no se proporciona, el editor mostrar\xE1 un selector.","Pegar como texto"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteController":["Si se muestra el widget de pegado","Mostrar opciones de pegado...","No se encontraron ediciones de pegado para '{0}'","Ejecutando controladores de pegado. Haga clic para cancelar.","Seleccionar acci\xF3n pegar","Ejecutando controladores de pegado"],"vs/editor/contrib/dropOrPasteInto/browser/defaultProviders":["Integrado","Insertar texto sin formato","Insertar URIs","Insertar URI","Insertar rutas de acceso","Insertar ruta de acceso","Insertar rutas de acceso relativas","Insertar ruta de acceso relativa","Insertar HTML"],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution":["Configura el proveedor de colocaci\xF3n predeterminado que se usar\xE1 para el contenido de un tipo MIME determinado."],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController":["Si se muestra el widget de colocaci\xF3n","Mostrar opciones de colocaci\xF3n...","Ejecutando controladores de colocaci\xF3n. Haga clic para cancelar."],"vs/editor/contrib/editorState/browser/keybindingCancellation":['Indica si el editor ejecuta una operaci\xF3n que se puede cancelar como, por ejemplo, "Inspeccionar referencias"'],"vs/editor/contrib/find/browser/findController":["El archivo es demasiado grande para realizar una operaci\xF3n de reemplazar todo.","Buscar","&&Buscar","B\xFAsqueda con argumentos","Buscar con selecci\xF3n","Buscar siguiente","Buscar anterior","Ir a Coincidencia...","No hay coincidencias. Intente buscar otra cosa.","Escriba un n\xFAmero para ir a una coincidencia espec\xEDfica (entre 1 y {0})","Escriba un n\xFAmero entre 1 y {0}","Escriba un n\xFAmero entre 1 y {0}","Buscar selecci\xF3n siguiente","Buscar selecci\xF3n anterior","Reemplazar","&&Reemplazar"],"vs/editor/contrib/find/browser/findWidget":['Icono para "Buscar en selecci\xF3n" en el widget de b\xFAsqueda del editor.',"Icono para indicar que el widget de b\xFAsqueda del editor est\xE1 contra\xEDdo.","Icono para indicar que el widget de b\xFAsqueda del editor est\xE1 expandido.",'Icono para "Reemplazar" en el widget de b\xFAsqueda del editor.','Icono para "Reemplazar todo" en el widget de b\xFAsqueda del editor.','Icono para "Buscar anterior" en el widget de b\xFAsqueda del editor.','Icono para "Buscar siguiente" en el widget de b\xFAsqueda del editor.',"Buscar y reemplazar","Buscar","Buscar","Coincidencia anterior","Coincidencia siguiente","Buscar en selecci\xF3n","Cerrar","Reemplazar","Reemplazar","Reemplazar","Reemplazar todo","Alternar reemplazar","S\xF3lo los primeros {0} resultados son resaltados, pero todas las operaciones de b\xFAsqueda trabajan en todo el texto.","{0} de {1}","No hay resultados","Encontrados: {0}",'{0} encontrado para "{1}"','{0} encontrado para "{1}", en {2}','{0} encontrado para "{1}"',"Ctrl+Entrar ahora inserta un salto de l\xEDnea en lugar de reemplazar todo. Puede modificar el enlace de claves para editor.action.replaceAll para invalidar este comportamiento."],"vs/editor/contrib/folding/browser/folding":["Desplegar","Desplegar de forma recursiva","Plegar","Alternar plegado","Plegar de forma recursiva","Cerrar todos los comentarios de bloque","Plegar todas las regiones","Desplegar Todas las Regiones","Plegar todas excepto las seleccionadas","Desplegar todas excepto las seleccionadas","Plegar todo","Desplegar todo","Ir al plegado primario","Ir al rango de plegado anterior","Ir al rango de plegado siguiente","Crear rango de plegado a partir de la selecci\xF3n","Quitar rangos de plegado manuales","Nivel de plegamiento {0}"],"vs/editor/contrib/folding/browser/foldingDecorations":["Color de fondo detr\xE1s de los rangos plegados. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color del control plegable en el medianil del editor.","Icono de rangos expandidos en el margen de glifo del editor.","Icono de rangos contra\xEDdos en el margen de glifo del editor.","Icono de intervalos contra\xEDdos manualmente en el margen del glifo del editor.","Icono de intervalos expandidos manualmente en el margen del glifo del editor.","Haga clic para expandir el rango.","Haga clic para contraer el intervalo."],"vs/editor/contrib/fontZoom/browser/fontZoom":["Aumentar el tama\xF1o de fuente del editor","Disminuir el tama\xF1o de fuente del editor","Restablecer tama\xF1o de fuente del editor"],"vs/editor/contrib/format/browser/formatActions":["Dar formato al documento","Dar formato a la selecci\xF3n"],"vs/editor/contrib/gotoError/browser/gotoError":["Ir al siguiente problema (Error, Advertencia, Informaci\xF3n)","Icono para ir al marcador siguiente.","Ir al problema anterior (Error, Advertencia, Informaci\xF3n)","Icono para ir al marcador anterior.","Ir al siguiente problema en Archivos (Error, Advertencia, Informaci\xF3n)","Siguiente &&problema","Ir al problema anterior en Archivos (Error, Advertencia, Informaci\xF3n)","Anterior &&problema"],"vs/editor/contrib/gotoError/browser/gotoErrorWidget":["Error","Advertencia","Informaci\xF3n","Sugerencia","{0} en {1}. ","{0} de {1} problemas","{0} de {1} problema","Color de los errores del widget de navegaci\xF3n de marcadores del editor.","Fondo del encabezado del error del widget de navegaci\xF3n del marcador de editor.","Color de las advertencias del widget de navegaci\xF3n de marcadores del editor.","Fondo del encabezado de la advertencia del widget de navegaci\xF3n del marcador de editor.","Color del widget informativo marcador de navegaci\xF3n en el editor.","Fondo del encabezado de informaci\xF3n del widget de navegaci\xF3n del marcador de editor.","Fondo del widget de navegaci\xF3n de marcadores del editor."],"vs/editor/contrib/gotoSymbol/browser/goToCommands":["Ver","Definiciones",'No se encontr\xF3 ninguna definici\xF3n para "{0}"',"No se encontr\xF3 ninguna definici\xF3n","Ir a definici\xF3n","Ir a &&definici\xF3n","Abrir definici\xF3n en el lateral","Ver la definici\xF3n sin salir","Declaraciones","No se encontr\xF3 ninguna definici\xF3n para '{0}'","No se encontr\xF3 ninguna declaraci\xF3n","Ir a Definici\xF3n","Ir a &&declaraci\xF3n","No se encontr\xF3 ninguna definici\xF3n para '{0}'","No se encontr\xF3 ninguna declaraci\xF3n","Inspeccionar Definici\xF3n","Definiciones de tipo",'No se encontr\xF3 ninguna definici\xF3n de tipo para "{0}"',"No se encontr\xF3 ninguna definici\xF3n de tipo","Ir a la definici\xF3n de tipo","Ir a la definici\xF3n de &&tipo","Inspeccionar definici\xF3n de tipo","Implementaciones",'No se encontr\xF3 ninguna implementaci\xF3n para "{0}"',"No se encontr\xF3 ninguna implementaci\xF3n","Ir a Implementaciones","Ir a &&implementaciones","Inspeccionar implementaciones",'No se ha encontrado ninguna referencia para "{0}".',"No se encontraron referencias","Ir a Referencias","Ir a &&referencias","Referencias","Inspeccionar Referencias","Referencias","Ir a cualquier s\xEDmbolo","Ubicaciones",'No hay resultados para "{0}"',"Referencias"],"vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition":["Haga clic para mostrar {0} definiciones."],"vs/editor/contrib/gotoSymbol/browser/peek/referencesController":['Indica si est\xE1 visible la inspecci\xF3n de referencias, como "Inspecci\xF3n de referencias" o "Ver la definici\xF3n sin salir".',"Cargando...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesTree":["{0} referencias","{0} referencia","Referencias"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget":["vista previa no disponible","No hay resultados","Referencias"],"vs/editor/contrib/gotoSymbol/browser/referencesModel":["en {0} en la l\xEDnea {1} en la columna {2}","{0} en {1} en la l\xEDnea {2} en la columna {3}","1 s\xEDmbolo en {0}, ruta de acceso completa {1}","{0} s\xEDmbolos en {1}, ruta de acceso completa {2}","No se encontraron resultados","Encontr\xF3 1 s\xEDmbolo en {0}","Encontr\xF3 {0} s\xEDmbolos en {1}","Encontr\xF3 {0} s\xEDmbolos en {1} archivos"],"vs/editor/contrib/gotoSymbol/browser/symbolNavigation":["Indica si hay ubicaciones de s\xEDmbolos a las que se pueda navegar solo con el teclado.","S\xEDmbolo {0} de {1}, {2} para el siguiente","S\xEDmbolo {0} de {1}"],"vs/editor/contrib/hover/browser/hover":["Mostrar o centrarse al mantener el puntero","El cuadro del elemento sobre el que se ha pasado el rat\xF3n se enfocar\xE1 autom\xE1ticamente.","El cuadro del elemento sobre el que se ha pasado el rat\xF3n se enfocar\xE1 solo si ya est\xE1 visible.","Se enfocar\xE1 el cuadro que aparece cuando se pasa el rat\xF3n por encima de un elemento.","Mostrar vista previa de la definici\xF3n que aparece al mover el puntero","Desplazar hacia arriba al mantener el puntero","Desplazar hacia abajo al mantener el puntero","Desplazar al mantener el puntero a la izquierda","Desplazar al mantener el puntero a la derecha","Desplazamiento de p\xE1gina hacia arriba","Desplazamiento de p\xE1gina hacia abajo","Ir al puntero superior","Ir a la parte inferior al mantener el puntero"],"vs/editor/contrib/hover/browser/markdownHoverParticipant":["Cargando...",'Representaci\xF3n en pausa durante una l\xEDnea larga por motivos de rendimiento. Esto se puede configurar mediante "editor.stopRenderingLineAfter".','Por motivos de rendimiento, la tokenizaci\xF3n se omite con filas largas. Esta opci\xF3n se puede configurar con "editor.maxTokenizationLineLength".'],"vs/editor/contrib/hover/browser/markerHoverParticipant":["Ver el problema","No hay correcciones r\xE1pidas disponibles","Buscando correcciones r\xE1pidas...","No hay correcciones r\xE1pidas disponibles","Correcci\xF3n R\xE1pida"],"vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace":["Reemplazar con el valor anterior","Reemplazar con el valor siguiente"],"vs/editor/contrib/indentation/browser/indentation":["Convertir sangr\xEDa en espacios","Convertir sangr\xEDa en tabulaciones","Tama\xF1o de tabulaci\xF3n configurado","Tama\xF1o de tabulaci\xF3n predeterminado","Tama\xF1o de tabulaci\xF3n actual","Seleccionar tama\xF1o de tabulaci\xF3n para el archivo actual","Aplicar sangr\xEDa con tabulaciones","Aplicar sangr\xEDa con espacios","Cambiar tama\xF1o de visualizaci\xF3n de tabulaci\xF3n","Detectar sangr\xEDa del contenido","Volver a aplicar sangr\xEDa a l\xEDneas","Volver a aplicar sangr\xEDa a l\xEDneas seleccionadas"],"vs/editor/contrib/inlayHints/browser/inlayHintsHover":["Haga doble clic para insertar","cmd + clic","ctrl + clic","opci\xF3n + clic","alt + clic","Ir a Definici\xF3n ({0}), haga clic con el bot\xF3n derecho para obtener m\xE1s informaci\xF3n","Ir a Definici\xF3n ({0})","Ejecutar comando"],"vs/editor/contrib/inlineCompletions/browser/commands":["Mostrar sugerencia alineada siguiente","Mostrar sugerencia alineada anterior","Desencadenar sugerencia alineada","Aceptar la siguiente palabra de sugerencia insertada","Aceptar palabra","Aceptar la siguiente l\xEDnea de sugerencia insertada","Aceptar l\xEDnea","Aceptar la sugerencia insertada","Aceptar","Ocultar la sugerencia insertada","Mostrar siempre la barra de herramientas"],"vs/editor/contrib/inlineCompletions/browser/hoverParticipant":["Sugerencia:"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys":["Si una sugerencia alineada est\xE1 visible","Si la sugerencia alineada comienza con un espacio en blanco","Si la sugerencia insertada comienza con un espacio en blanco menor que lo que se insertar\xEDa mediante tabulaci\xF3n","Si las sugerencias deben suprimirse para la sugerencia actual"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController":["Inspeccionar esto en la vista accesible ({0})"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget":["Icono para mostrar la sugerencia de par\xE1metro siguiente.","Icono para mostrar la sugerencia de par\xE1metro anterior.","{0} ({1})","Anterior","Siguiente"],"vs/editor/contrib/lineSelection/browser/lineSelection":["Expandir selecci\xF3n de l\xEDnea"],"vs/editor/contrib/linesOperations/browser/linesOperations":["Copiar l\xEDnea arriba","&&Copiar l\xEDnea arriba","Copiar l\xEDnea abajo","Co&&piar l\xEDnea abajo","Selecci\xF3n duplicada","&&Duplicar selecci\xF3n","Mover l\xEDnea hacia arriba","Mo&&ver l\xEDnea arriba","Mover l\xEDnea hacia abajo","Mover &&l\xEDnea abajo","Ordenar l\xEDneas en orden ascendente","Ordenar l\xEDneas en orden descendente","Eliminar l\xEDneas duplicadas","Recortar espacio final","Eliminar l\xEDnea","Sangr\xEDa de l\xEDnea","Anular sangr\xEDa de l\xEDnea","Insertar l\xEDnea arriba","Insertar l\xEDnea debajo","Eliminar todo a la izquierda","Eliminar todo lo que est\xE1 a la derecha","Unir l\xEDneas","Transponer caracteres alrededor del cursor","Transformar a may\xFAsculas","Transformar a min\xFAsculas","Transformar en Title Case","Transformar en Snake Case","Transformar a may\xFAsculas y min\xFAsculas Camel","Transformar en caso Kebab"],"vs/editor/contrib/linkedEditing/browser/linkedEditing":["Iniciar edici\xF3n vinculada","Color de fondo cuando el editor cambia el nombre autom\xE1ticamente al escribir."],"vs/editor/contrib/links/browser/links":["No se pudo abrir este v\xEDnculo porque no tiene un formato correcto: {0}","No se pudo abrir este v\xEDnculo porque falta el destino.","Ejecutar comando","Seguir v\xEDnculo","cmd + clic","ctrl + clic","opci\xF3n + clic","alt + clic","Ejecutar el comando {0}","Abrir v\xEDnculo"],"vs/editor/contrib/message/browser/messageController":["Indica si el editor muestra actualmente un mensaje insertado"],"vs/editor/contrib/multicursor/browser/multicursor":["Cursor agregado: {0}","Cursores agregados: {0}","Agregar cursor arriba","&&Agregar cursor arriba","Agregar cursor debajo","A&&gregar cursor abajo","A\xF1adir cursores a finales de l\xEDnea","Agregar c&&ursores a extremos de l\xEDnea","A\xF1adir cursores a la parte inferior","A\xF1adir cursores a la parte superior","Agregar selecci\xF3n hasta la siguiente coincidencia de b\xFAsqueda","Agregar &&siguiente repetici\xF3n","Agregar selecci\xF3n hasta la anterior coincidencia de b\xFAsqueda","Agregar r&&epetici\xF3n anterior","Mover \xFAltima selecci\xF3n hasta la siguiente coincidencia de b\xFAsqueda","Mover \xFAltima selecci\xF3n hasta la anterior coincidencia de b\xFAsqueda","Seleccionar todas las repeticiones de coincidencia de b\xFAsqueda","Seleccionar todas las &&repeticiones","Cambiar todas las ocurrencias","Enfocar el siguiente cursor","Centra el cursor siguiente","Enfocar cursor anterior","Centra el cursor anterior"],"vs/editor/contrib/parameterHints/browser/parameterHints":["Sugerencias para par\xE1metros Trigger"],"vs/editor/contrib/parameterHints/browser/parameterHintsWidget":["Icono para mostrar la sugerencia de par\xE1metro siguiente.","Icono para mostrar la sugerencia de par\xE1metro anterior.","{0}, sugerencia","Color de primer plano del elemento activo en la sugerencia de par\xE1metro."],"vs/editor/contrib/peekView/browser/peekView":["Indica si el editor de c\xF3digo actual est\xE1 incrustado en la inspecci\xF3n.","Cerrar","Color de fondo del \xE1rea de t\xEDtulo de la vista de inspecci\xF3n.","Color del t\xEDtulo de la vista de inpecci\xF3n.","Color de la informaci\xF3n del t\xEDtulo de la vista de inspecci\xF3n.","Color de los bordes y la flecha de la vista de inspecci\xF3n.","Color de fondo de la lista de resultados de vista de inspecci\xF3n.","Color de primer plano de los nodos de inspecci\xF3n en la lista de resultados.","Color de primer plano de los archivos de inspecci\xF3n en la lista de resultados.","Color de fondo de la entrada seleccionada en la lista de resultados de vista de inspecci\xF3n.","Color de primer plano de la entrada seleccionada en la lista de resultados de vista de inspecci\xF3n.","Color de fondo del editor de vista de inspecci\xF3n.","Color de fondo del margen en el editor de vista de inspecci\xF3n.","Color de fondo del desplazamiento permanente en el editor de vista de inspecci\xF3n.","Buscar coincidencia con el color de resaltado de la lista de resultados de vista de inspecci\xF3n.","Buscar coincidencia del color de resultado del editor de vista de inspecci\xF3n.","Hacer coincidir el borde resaltado en el editor de vista previa."],"vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess":["Abra primero un editor de texto para ir a una l\xEDnea.","Vaya a la l\xEDnea {0} y al car\xE1cter {1}.","Ir a la l\xEDnea {0}.","L\xEDnea actual: {0}, Car\xE1cter: {1}. Escriba un n\xFAmero de l\xEDnea entre 1 y {2} a los que navegar.","L\xEDnea actual: {0}, Car\xE1cter: {1}. Escriba un n\xFAmero de l\xEDnea al que navegar."],"vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess":["Para ir a un s\xEDmbolo, primero abra un editor de texto con informaci\xF3n de s\xEDmbolo.","El editor de texto activo no proporciona informaci\xF3n de s\xEDmbolos.","No hay ning\xFAn s\xEDmbolo del editor coincidente.","No hay s\xEDmbolos del editor.","Abrir en el lateral","Abrir en la parte inferior","s\xEDmbolos ({0})","propiedades ({0})","m\xE9todos ({0})","funciones ({0})","constructores ({0})","variables ({0})","clases ({0})","estructuras ({0})","eventos ({0})","operadores ({0})","interfaces ({0})","espacios de nombres ({0})","paquetes ({0})","par\xE1metros de tipo ({0})","m\xF3dulos ({0})","propiedades ({0})","enumeraciones ({0})","miembros de enumeraci\xF3n ({0})","cadenas ({0})","archivos ({0})","matrices ({0})","n\xFAmeros ({0})","booleanos ({0})","objetos ({0})","claves ({0})","campos ({0})","constantes ({0})"],"vs/editor/contrib/readOnlyMessage/browser/contribution":["No se puede editar en la entrada de solo lectura","No se puede editar en un editor de s\xF3lo lectura"],"vs/editor/contrib/rename/browser/rename":["No hay ning\xFAn resultado.","Error desconocido al resolver el cambio de nombre de la ubicaci\xF3n","Cambiando el nombre de '{0}' a '{1}'","Cambiar el nombre de {0} a {1}","Nombre cambiado correctamente de '{0}' a '{1}'. Resumen: {2}","No se pudo cambiar el nombre a las ediciones de aplicaci\xF3n","No se pudo cambiar el nombre de las ediciones de c\xE1lculo","Cambiar el nombre del s\xEDmbolo","Activar/desactivar la capacidad de previsualizar los cambios antes de cambiar el nombre"],"vs/editor/contrib/rename/browser/renameInputField":["Indica si el widget de cambio de nombre de entrada est\xE1 visible.","Cambie el nombre de la entrada. Escriba el nuevo nombre y presione Entrar para confirmar.","{0} para cambiar de nombre, {1} para obtener una vista previa"],"vs/editor/contrib/smartSelect/browser/smartSelect":["Expandir selecci\xF3n","&&Expandir selecci\xF3n","Reducir la selecci\xF3n","&&Reducir selecci\xF3n"],"vs/editor/contrib/snippet/browser/snippetController2":["Indica si el editor actual est\xE1 en modo de fragmentos de c\xF3digo.","Indica si hay una tabulaci\xF3n siguiente cuando se est\xE1 en modo de fragmentos de c\xF3digo.","Si hay una tabulaci\xF3n anterior cuando se est\xE1 en modo de fragmentos de c\xF3digo.","Ir al marcador de posici\xF3n siguiente..."],"vs/editor/contrib/snippet/browser/snippetVariables":["Domingo","Lunes","Martes","Mi\xE9rcoles","Jueves","Viernes","S\xE1bado","Dom","Lun","Mar","Mi\xE9","Jue","Vie","S\xE1b","Enero","Febrero","Marzo","Abril","May","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre","Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],"vs/editor/contrib/stickyScroll/browser/stickyScrollActions":["Alternar desplazamiento Sticky del editor","&&Alternar desplazamiento permanente del editor","Desplazamiento permanente","&&Desplazamiento permanente","Desplazamiento permanente de foco","&&Desplazamiento permanente de foco","Seleccionar la siguiente l\xEDnea de desplazamiento r\xE1pida","Seleccionar la l\xEDnea de desplazamiento r\xE1pida anterior","Ir a la l\xEDnea de desplazamiento r\xE1pida con foco","Seleccionar el Editor"],"vs/editor/contrib/suggest/browser/suggest":["Si alguna sugerencia tiene el foco","Indica si los detalles de las sugerencias est\xE1n visibles.","Indica si hay varias sugerencias para elegir.","Indica si la inserci\xF3n de la sugerencia actual genera un cambio o si ya se ha escrito todo.","Indica si se insertan sugerencias al presionar Entrar.","Indica si la sugerencia actual tiene el comportamiento de inserci\xF3n y reemplazo.","Indica si el comportamiento predeterminado es insertar o reemplazar.","Indica si la sugerencia actual admite la resoluci\xF3n de m\xE1s detalles."],"vs/editor/contrib/suggest/browser/suggestController":['Aceptando "{0}" ediciones adicionales de {1} realizadas',"Sugerencias para Trigger","Insertar","Insertar","Reemplazar","Reemplazar","Insertar","mostrar menos","mostrar m\xE1s","Restablecer tama\xF1o del widget de sugerencias"],"vs/editor/contrib/suggest/browser/suggestWidget":["Color de fondo del widget sugerido.","Color de borde del widget sugerido.","Color de primer plano del widget sugerido.","Color de primer plano de le entrada seleccionada del widget de sugerencias.","Color de primer plano del icono de la entrada seleccionada en el widget de sugerencias.","Color de fondo de la entrada seleccionada del widget sugerido.","Color del resaltado coincidido en el widget sugerido.","Color de los resaltados de coincidencia en el widget de sugerencias cuando se enfoca un elemento.","Color de primer plano del estado del widget sugerido.","Cargando...","No hay sugerencias.","Sugerir","{0} {1}, {2}","{0} {1}","{0}, {1}","{0}, documentos: {1}"],"vs/editor/contrib/suggest/browser/suggestWidgetDetails":["Cerrar","Cargando..."],"vs/editor/contrib/suggest/browser/suggestWidgetRenderer":["Icono para obtener m\xE1s informaci\xF3n en el widget de sugerencias.","Leer m\xE1s"],"vs/editor/contrib/suggest/browser/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/browser/symbolIcons":["Color de primer plano de los s\xEDmbolos de matriz. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos booleanos. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de clase. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de color. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos constantes. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de constructor. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de enumerador. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de miembro del enumerador. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de evento. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de campo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de archivo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de carpeta. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de funci\xF3n. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de interfaz. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de claves. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de palabra clave. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de m\xE9todo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de m\xF3dulo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de espacio de nombres. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos nulos. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano para los s\xEDmbolos num\xE9ricos. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de objeto. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano para los s\xEDmbolos del operador. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de paquete. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de propiedad. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de referencia. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de fragmento de c\xF3digo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de cadena. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de estructura. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de texto. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano para los s\xEDmbolos de par\xE1metro de tipo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de unidad. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos variables. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias."],"vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode":["Alternar tecla de tabulaci\xF3n para mover el punto de atenci\xF3n","Presionando la pesta\xF1a ahora mover\xE1 el foco al siguiente elemento enfocable.","Presionando la pesta\xF1a ahora insertar\xE1 el car\xE1cter de tabulaci\xF3n"],"vs/editor/contrib/tokenization/browser/tokenization":["Desarrollador: forzar nueva aplicaci\xF3n de token"],"vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter":["Icono que se muestra con un mensaje de advertencia en el editor de extensiones.","Este documento contiene muchos caracteres Unicode ASCII no b\xE1sicos","Este documento contiene muchos caracteres Unicode ambiguos","Este documento contiene muchos caracteres Unicode invisibles","Configurar opciones de resaltado Unicode","El car\xE1cter {0} podr\xEDa confundirse con el car\xE1cter ASCII {1}, que es m\xE1s com\xFAn en el c\xF3digo fuente.","El car\xE1cter {0} podr\xEDa confundirse con el car\xE1cter {1}, que es m\xE1s com\xFAn en el c\xF3digo fuente.","El car\xE1cter {0} es invisible.","El car\xE1cter {0} no es un car\xE1cter ASCII b\xE1sico.","Ajustar la configuraci\xF3n","Deshabilitar resaltado en comentarios","Deshabilitar resaltado de caracteres en comentarios","Deshabilitar resaltado en cadenas","Deshabilitar resaltado de caracteres en cadenas","Deshabilitar resaltado ambiguo","Deshabilitar el resaltado de caracteres ambiguos","Deshabilitar resaltado invisible","Deshabilitar el resaltado de caracteres invisibles","Deshabilitar resaltado que no es ASCII","Deshabilitar el resaltado de caracteres ASCII no b\xE1sicos","Mostrar opciones de exclusi\xF3n","Excluir {0} (car\xE1cter invisible) de que se resalte","Excluir {0} de ser resaltado",'Permite caracteres Unicode m\xE1s comunes en el idioma "{0}".'],"vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators":["Terminadores de l\xEDnea inusuales","Se han detectado terminadores de l\xEDnea inusuales",`Este archivo "{0}" contiene uno o m\xE1s caracteres de terminaci\xF3n de l\xEDnea inusuales, como el separador de l\xEDnea (LS) o el separador de p\xE1rrafo (PS).\r
+\r
+Se recomienda eliminarlos del archivo. Esto puede configurarse mediante "editor.unusualLineTerminators".`,"&&Quitar terminadores de l\xEDnea inusuales","Omitir"],"vs/editor/contrib/wordHighlighter/browser/highlightDecorations":["Color de fondo de un s\xEDmbolo durante el acceso de lectura, como la lectura de una variable. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de fondo de un s\xEDmbolo durante el acceso de escritura, como escribir en una variable. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de fondo de la presencia textual para un s\xEDmbolo. Para evitar ocultar cualquier decoraci\xF3n subyacente, el color no debe ser opaco.","Color de fondo de un s\xEDmbolo durante el acceso de lectura; por ejemplo, cuando se lee una variable.","Color de fondo de un s\xEDmbolo durante el acceso de escritura; por ejemplo, cuando se escribe una variable.","Color de borde de una repetici\xF3n textual de un s\xEDmbolo.","Color del marcador de regla general para destacados de s\xEDmbolos. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de marcador de regla general para destacados de s\xEDmbolos de acceso de escritura. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color del marcador de regla de informaci\xF3n general de una repetici\xF3n textual de un s\xEDmbolo. El color no debe ser opaco para no ocultar las decoraciones subyacentes."],"vs/editor/contrib/wordHighlighter/browser/wordHighlighter":["Ir al siguiente s\xEDmbolo destacado","Ir al s\xEDmbolo destacado anterior","Desencadenar los s\xEDmbolos destacados"],"vs/editor/contrib/wordOperations/browser/wordOperations":["Eliminar palabra"],"vs/platform/action/common/actionCommonCategories":["Desarrollador","Ver","Ayuda","Probar","archivo","Preferencias"],"vs/platform/actionWidget/browser/actionList":["{0} para aplicar, {1} para previsualizar","{0} para aplicar","{0}, Motivo de deshabilitaci\xF3n: {1}","Widget de acci\xF3n"],"vs/platform/actionWidget/browser/actionWidget":["Color de fondo de los elementos de acci\xF3n alternados en la barra de acciones.","Si la lista de widgets de acci\xF3n es visible","Ocultar el widget de acci\xF3n","Seleccione la acci\xF3n anterior","Seleccione la siguiente acci\xF3n","Aceptar la acci\xF3n seleccionada","Vista previa de la acci\xF3n seleccionada"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})","{0} ({1})",`{0}\r
+[{1}] {2}`],"vs/platform/actions/browser/toolbar":["Ocultar","Men\xFA Restablecer"],"vs/platform/actions/common/menuService":['Ocultar "{0}"'],"vs/platform/audioCues/browser/audioCueService":["Error en la l\xEDnea","Error","Advertencia en la l\xEDnea","Advertencia","\xC1rea doblada en la l\xEDnea","Contra\xEDda","Punto de interrupci\xF3n en la l\xEDnea","Punto de interrupci\xF3n","Sugerencia insertada en la l\xEDnea","Correcci\xF3n r\xE1pida del terminal","Correcci\xF3n r\xE1pida","Depurador detenido en el punto de interrupci\xF3n","Punto de interrupci\xF3n","No hay sugerencias de incrustaci\xF3n en la l\xEDnea","No hay sugerencias de incrustaci\xF3n","Tarea completada.","Tarea completada.","Error en la tarea","Error en la tarea","Error del comando de terminal","Error del comando","Campana de terminal","Campana de terminal","Celda del bloc de notas completada","Celda del bloc de notas completada","Error en la celda del bloc de notas","Error en la celda del bloc de notas","L\xEDnea de diferencia insertada","L\xEDnea de diferencia eliminada","L\xEDnea de diferencia modificada","Se envi\xF3 una solicitud de chat","Se envi\xF3 una solicitud de chat","Respuesta de chat recibida","Respuesta de chat pendiente","Respuesta de chat pendiente","Borrar","Borrar","Guardar","Guardar","Formato","Formato"],"vs/platform/configuration/common/configurationRegistry":["La configuraci\xF3n del lenguaje predeterminada se reemplaza","Configure los valores que se invalidar\xE1n para el idioma {0}.","Establecer los valores de configuraci\xF3n que se reemplazar\xE1n para un lenguaje.","Esta configuraci\xF3n no admite la configuraci\xF3n por idioma.","Establecer los valores de configuraci\xF3n que se reemplazar\xE1n para un lenguaje.","Esta configuraci\xF3n no admite la configuraci\xF3n por idioma.","No se puede registrar una propiedad vac\xEDa.",`No se puede registrar "{0}". Coincide con el patr\xF3n de propiedad '\\\\[.*\\\\]$' para describir la configuraci\xF3n del editor espec\xEDfica del lenguaje. Utilice la contribuci\xF3n "configurationDefaults".`,'No se puede registrar "{0}". Esta propiedad ya est\xE1 registrada.','No se puede registrar "{0}". La directiva asociada {1} ya est\xE1 registrada con {2}.'],"vs/platform/contextkey/browser/contextKeyService":["Comando que devuelve informaci\xF3n sobre las claves de contexto"],"vs/platform/contextkey/common/contextkey":["Expresi\xF3n de clave de contexto vac\xEDa",'\xBFHa olvidado escribir una expresi\xF3n? tambi\xE9n puede poner "false" o "true" para evaluar siempre como false o true, respectivamente.',"'in' despu\xE9s de 'not'.","par\xE9ntesis de cierre ')'","Token inesperado","\xBFHa olvidado poner && o || antes del token?","Final de expresi\xF3n inesperado","\xBFHa olvidado poner una clave de contexto?",`Esperado: {0}\r
+recibido: '{1}'.`],"vs/platform/contextkey/common/contextkeys":["Si el sistema operativo es macOS","Si el sistema operativo es Linux","Si el sistema operativo es Windows","Si la plataforma es un explorador web","Si el sistema operativo es macOS en una plataforma que no es de explorador","Si el sistema operativo es IOS","Si la plataforma es un explorador web m\xF3vil","Tipo de calidad de VS Code","Si el foco del teclado est\xE1 dentro de un cuadro de entrada"],"vs/platform/contextkey/common/scanner":["\xBFQuiso decir {0}?","\xBFQuiso decir {0} o {1}?","\xBFQuiso decir {0}, {1} o {2}?","\xBFHa olvidado abrir o cerrar la cita?",`\xBFHa olvidado escapar el car\xE1cter "/" (barra diagonal)?Coloque dos barras diagonales inversas antes de que escape, por ejemplo, '\\\\/'.`],"vs/platform/history/browser/contextScopedHistoryWidget":["Indica si las sugerencias est\xE1n visibles."],"vs/platform/keybinding/common/abstractKeybindingService":["Se presion\xF3 ({0}). Esperando la siguiente tecla...","Se ha presionado ({0}). Esperando la siguiente tecla...","La combinaci\xF3n de claves ({0}, {1}) no es un comando.","La combinaci\xF3n de claves ({0}, {1}) no es un comando."],"vs/platform/list/browser/listService":["\xC1rea de trabajo",'Se asigna a "Control" en Windows y Linux y a "Comando" en macOS.','Se asigna a "Alt" en Windows y Linux y a "Opci\xF3n" en macOS.',"El modificador que se utilizar\xE1 para agregar un elemento en los \xE1rboles y listas para una selecci\xF3n m\xFAltiple con el rat\xF3n (por ejemplo en el explorador, abiertos editores y vista de scm). Los gestos de rat\xF3n 'Abrir hacia' - si est\xE1n soportados - se adaptar\xE1n de forma tal que no tenga conflicto con el modificador m\xFAltiple.","Controla c\xF3mo abrir elementos en los \xE1rboles y las listas mediante el mouse (si se admite). Tenga en cuenta que algunos \xE1rboles y listas pueden optar por ignorar esta configuraci\xF3n si no es aplicable.","Controla si las listas y los \xE1rboles admiten el desplazamiento horizontal en el \xE1rea de trabajo. Advertencia: La activaci\xF3n de esta configuraci\xF3n repercute en el rendimiento.","Controla si los clics en la barra de desplazamiento se desplazan p\xE1gina por p\xE1gina.","Controla la sangr\xEDa de \xE1rbol en p\xEDxeles.","Controla si el \xE1rbol debe representar gu\xEDas de sangr\xEDa.","Controla si las listas y los \xE1rboles tienen un desplazamiento suave.",'Se usar\xE1 un multiplicador en los eventos de desplazamiento de la rueda del mouse "deltaX" y "deltaY". ','Multiplicador de la velocidad de desplazamiento al presionar "Alt".',"Resalta elementos al buscar. Navegar m\xE1s arriba o abajo pasar\xE1 solo por los elementos resaltados.","Filtre elementos al buscar.","Controla el modo de b\xFAsqueda predeterminado para listas y \xE1rboles en el \xE1rea de trabajo.","La navegaci\xF3n simple del teclado se centra en elementos que coinciden con la entrada del teclado. El emparejamiento se hace solo en prefijos.","Destacar la navegaci\xF3n del teclado resalta los elementos que coinciden con la entrada del teclado. M\xE1s arriba y abajo la navegaci\xF3n atravesar\xE1 solo los elementos destacados.","La navegaci\xF3n mediante el teclado de filtro filtrar\xE1 y ocultar\xE1 todos los elementos que no coincidan con la entrada del teclado.","Controla el estilo de navegaci\xF3n del teclado para listas y \xE1rboles en el \xE1rea de trabajo. Puede ser simple, resaltar y filtrar.",'Use "workbench.list.defaultFindMode" y "workbench.list.typeNavigationMode" en su lugar.',"Usar coincidencias aproximadas al buscar.","Use coincidencias contiguas al buscar.","Controla el tipo de coincidencia que se usa al buscar listas y \xE1rboles en el \xE1rea de trabajo.","Controla c\xF3mo se expanden las carpetas de \xE1rbol al hacer clic en sus nombres. Tenga en cuenta que algunos \xE1rboles y listas pueden optar por omitir esta configuraci\xF3n si no es aplicable.","Controla si el desplazamiento permanente est\xE1 habilitado en los \xE1rboles.","Controla el n\xFAmero de elementos permanentes que se muestran en el \xE1rbol cuando '#workbench.tree.enableStickyScroll#' est\xE1 habilitado.",'Controla el funcionamiento de la navegaci\xF3n por tipos en listas y \xE1rboles del \xE1rea de trabajo. Cuando se establece en "trigger", la navegaci\xF3n por tipos comienza una vez que se ejecuta el comando "list.triggerTypeNavigation".'],"vs/platform/markers/common/markers":["Error","Advertencia","Informaci\xF3n"],"vs/platform/quickinput/browser/commandsQuickAccess":["usado recientemente","comandos similares","usados habitualmente","otros comandos","comandos similares","{0}, {1}",'El comando "{0}" ha dado lugar a un error'],"vs/platform/quickinput/browser/helpQuickAccess":["{0}, {1}"],"vs/platform/quickinput/browser/quickInput":["Atr\xE1s",'Presione "Entrar" para confirmar su entrada o "Esc" para cancelar',"{0}/{1}","Escriba para restringir los resultados."],"vs/platform/quickinput/browser/quickInputController":["Activar o desactivar todas las casillas","{0} resultados","{0} seleccionados","Aceptar","Personalizado","Atr\xE1s ({0})","Atr\xE1s"],"vs/platform/quickinput/browser/quickInputList":["Entrada r\xE1pida"],"vs/platform/quickinput/browser/quickInputUtils":['Haga clic en para ejecutar el comando "{0}"'],"vs/platform/theme/common/colorRegistry":["Color de primer plano general. Este color solo se usa si un componente no lo invalida.","Primer plano general de los elementos deshabilitados. Este color solo se usa si un componente no lo reemplaza.","Color de primer plano general para los mensajes de erroe. Este color solo se usa si un componente no lo invalida.","Color de primer plano para el texto descriptivo que proporciona informaci\xF3n adicional, por ejemplo para una etiqueta.","El color predeterminado para los iconos en el \xE1rea de trabajo.","Color de borde de los elementos con foco. Este color solo se usa si un componente no lo invalida.","Un borde adicional alrededor de los elementos para separarlos unos de otros y as\xED mejorar el contraste.","Un borde adicional alrededor de los elementos activos para separarlos unos de otros y as\xED mejorar el contraste.","El color de fondo del texto seleccionado en el \xE1rea de trabajo (por ejemplo, campos de entrada o \xE1reas de texto). Esto no se aplica a las selecciones dentro del editor.","Color para los separadores de texto.","Color de primer plano para los v\xEDnculos en el texto.","Color de primer plano para los enlaces de texto, al hacer clic o pasar el mouse sobre ellos.","Color de primer plano para los segmentos de texto con formato previo.","Color de fondo para segmentos de texto con formato previo.","Color de fondo para los bloques en texto.","Color de borde para los bloques en texto.","Color de fondo para los bloques de c\xF3digo en el texto.","Color de sombra de los widgets dentro del editor, como buscar/reemplazar","Color de borde de los widgets dentro del editor, como buscar/reemplazar","Fondo de cuadro de entrada.","Primer plano de cuadro de entrada.","Borde de cuadro de entrada.","Color de borde de opciones activadas en campos de entrada.","Color de fondo de las opciones activadas en los campos de entrada.","Color de fondo al pasar por encima de las opciones en los campos de entrada.","Color de primer plano de las opciones activadas en los campos de entrada.","Color de primer plano para el marcador de posici\xF3n de texto","Color de fondo de validaci\xF3n de entrada para gravedad de informaci\xF3n.","Color de primer plano de validaci\xF3n de entrada para informaci\xF3n de gravedad.","Color de borde de validaci\xF3n de entrada para gravedad de informaci\xF3n.","Color de fondo de validaci\xF3n de entrada para gravedad de advertencia.","Color de primer plano de validaci\xF3n de entrada para informaci\xF3n de advertencia.","Color de borde de validaci\xF3n de entrada para gravedad de advertencia.","Color de fondo de validaci\xF3n de entrada para gravedad de error.","Color de primer plano de validaci\xF3n de entrada para informaci\xF3n de error.","Color de borde de valdaci\xF3n de entrada para gravedad de error.","Fondo de lista desplegable.","Fondo de la lista desplegable.","Primer plano de lista desplegable.","Borde de lista desplegable.","Color de primer plano del bot\xF3n.","Color del separador de botones.","Color de fondo del bot\xF3n.","Color de fondo del bot\xF3n al mantener el puntero.","Color del borde del bot\xF3n","Color de primer plano del bot\xF3n secundario.","Color de fondo del bot\xF3n secundario.","Color de fondo del bot\xF3n secundario al mantener el mouse.","Color de fondo de la insignia. Las insignias son peque\xF1as etiquetas de informaci\xF3n, por ejemplo los resultados de un n\xFAmero de resultados.","Color de primer plano de la insignia. Las insignias son peque\xF1as etiquetas de informaci\xF3n, por ejemplo los resultados de un n\xFAmero de resultados.","Sombra de la barra de desplazamiento indica que la vista se ha despazado.","Color de fondo de control deslizante de barra de desplazamiento.","Color de fondo de barra de desplazamiento cursor cuando se pasar sobre el control.","Color de fondo de la barra de desplazamiento al hacer clic.","Color de fondo para la barra de progreso que se puede mostrar para las operaciones de larga duraci\xF3n.","Color de fondo del texto de error del editor. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de primer plano de squigglies de error en el editor.","Si se establece, color de subrayados dobles para errores en el editor.","Color de fondo del texto de advertencia del editor. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de primer plano de squigglies de advertencia en el editor.","Si se establece, color de subrayados dobles para advertencias en el editor.","Color de fondo del texto de informaci\xF3n del editor. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de primer plano de los subrayados ondulados informativos en el editor.","Si se establece, color de subrayados dobles para informaciones en el editor.","Color de primer plano de pista squigglies en el editor.","Si se establece, color de subrayados dobles para sugerencias en el editor.","Color de borde de los marcos activos.","Color de fondo del editor.","Color de primer plano predeterminado del editor.","Color de fondo del desplazamiento permanente en el editor","Color de fondo del desplazamiento permanente al mantener el mouse en el editor","Color de borde del desplazamiento permanente en el editor"," Color de sombra del desplazamiento permanente en el editor","Color de fondo del editor de widgets como buscar/reemplazar","Color de primer plano de los widgets del editor, como buscar y reemplazar.","Color de borde de los widgets del editor. El color solo se usa si el widget elige tener un borde y no invalida el color.","Color del borde de la barra de cambio de tama\xF1o de los widgets del editor. El color se utiliza solo si el widget elige tener un borde de cambio de tama\xF1o y si un widget no invalida el color.","Color de fondo del selector r\xE1pido. El widget del selector r\xE1pido es el contenedor para selectores como la paleta de comandos.","Color de primer plano del selector r\xE1pido. El widget del selector r\xE1pido es el contenedor para selectores como la paleta de comandos.","Color de fondo del t\xEDtulo del selector r\xE1pido. El widget del selector r\xE1pido es el contenedor para selectores como la paleta de comandos.","Selector de color r\xE1pido para la agrupaci\xF3n de etiquetas.","Selector de color r\xE1pido para la agrupaci\xF3n de bordes.","Color de fondo de etiqueta de enlace de teclado. La etiqueta enlace de teclado se usa para representar un m\xE9todo abreviado de teclado.","Color de primer plano de etiqueta de enlace de teclado. La etiqueta enlace de teclado se usa para representar un m\xE9todo abreviado de teclado.","Color del borde de la etiqueta de enlace de teclado. La etiqueta enlace de teclado se usa para representar un m\xE9todo abreviado de teclado.","Color del borde inferior de la etiqueta de enlace de teclado. La etiqueta enlace de teclado se usa para representar un m\xE9todo abreviado de teclado.","Color de la selecci\xF3n del editor.","Color del texto seleccionado para alto contraste.","Color de la selecci\xF3n en un editor inactivo. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color en las regiones con el mismo contenido que la selecci\xF3n. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de borde de las regiones con el mismo contenido que la selecci\xF3n.","Color de la coincidencia de b\xFAsqueda actual.","Color de los otros resultados de la b\xFAsqueda. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de la gama que limita la b\xFAsqueda. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de borde de la coincidencia de b\xFAsqueda actual.","Color de borde de otra b\xFAsqueda que coincide.","Color del borde de la gama que limita la b\xFAsqueda. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de las consultas coincidentes del Editor de b\xFAsqueda.","Color de borde de las consultas coincidentes del Editor de b\xFAsqueda.","Color del texto en el mensaje de finalizaci\xF3n del viewlet de b\xFAsqueda.","Destacar debajo de la palabra para la que se muestra un mensaje al mantener el mouse. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de fondo al mantener el puntero en el editor.","Color de primer plano al mantener el puntero en el editor.","Color del borde al mantener el puntero en el editor.","Color de fondo de la barra de estado al mantener el puntero en el editor.","Color de los v\xEDnculos activos.","Color de primer plano de las sugerencias insertadas","Color de fondo de las sugerencias insertadas","Color de primer plano de las sugerencias insertadas para los tipos de letra","Color de fondo de las sugerencias insertadas para los tipos de letra","Color de primer plano de las sugerencias insertadas para los par\xE1metros","Color de fondo de las sugerencias insertadas para los par\xE1metros","El color utilizado para el icono de bombilla de acciones.","El color utilizado para el icono de la bombilla de acciones de correcci\xF3n autom\xE1tica.","El color utilizado para el icono de bombilla de inteligencia artificial.","Color de fondo para el texto que se insert\xF3. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de fondo para el texto que se elimin\xF3. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de fondo de las l\xEDneas insertadas. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de fondo de las l\xEDneas que se quitaron. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de fondo del margen donde se insertaron las l\xEDneas.","Color de fondo del margen donde se quitaron las l\xEDneas.","Primer plano de la regla de informaci\xF3n general de diferencias para el contenido insertado.","Primer plano de la regla de informaci\xF3n general de diferencias para el contenido quitado.","Color de contorno para el texto insertado.","Color de contorno para el texto quitado.","Color del borde entre ambos editores de texto.","Color de relleno diagonal del editor de diferencias. El relleno diagonal se usa en las vistas de diferencias en paralelo.","Color de fondo de los bloques sin modificar en el editor de diferencias.","Color de primer plano de los bloques sin modificar en el editor de diferencias.","Color de fondo del c\xF3digo sin modificar en el editor de diferencias.","Color de fondo de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de primer plano de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de contorno de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, pero no cuando est\xE1n inactivos.","Color de contorno de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n activos y seleccionados. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, pero no cuando est\xE1n inactivos.","Color de fondo de la lista o el \xE1rbol del elemento seleccionado cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de primer plano de la lista o el \xE1rbol del elemento seleccionado cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de primer plano del icono de lista o \xE1rbol del elemento seleccionado cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de fondo de la lista o el \xE1rbol del elemento seleccionado cuando la lista o el \xE1rbol est\xE1n inactivos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de primer plano de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol esta inactiva. Una lista o un \xE1rbol tiene el foco del teclado cuando est\xE1 activo, cuando esta inactiva no.","Color de primer plano del icono de lista o \xE1rbol del elemento seleccionado cuando la lista o el \xE1rbol est\xE1n inactivos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de fondo de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n inactivos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, pero no cuando est\xE1n inactivos.","Color de contorno de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n inactivos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, pero no cuando est\xE1n inactivos.","Fondo de la lista o el \xE1rbol al mantener el mouse sobre los elementos.","Color de primer plano de la lista o el \xE1rbol al pasar por encima de los elementos con el rat\xF3n.","Fondo de lista/\xE1rbol al arrastrar y colocar cuando se mueven elementos sobre otros elementos al usar el mouse.","Color del borde de lista o \xE1rbol al arrastrar y colocar cuando se mueven elementos entre otros elementos mediante el mouse.","Color de primer plano de la lista o el \xE1rbol de las coincidencias resaltadas al buscar dentro de la lista o el \xE1bol.","Color de primer plano de la lista o \xE1rbol de los elementos coincidentes en los elementos enfocados activamente cuando se busca dentro de la lista o \xE1rbol.","Color de primer plano de una lista o \xE1rbol para los elementos inv\xE1lidos, por ejemplo una raiz sin resolver en el explorador.","Color del primer plano de elementos de lista que contienen errores.","Color del primer plano de elementos de lista que contienen advertencias.","Color de fondo del widget de filtro de tipo en listas y \xE1rboles.","Color de contorno del widget de filtro de tipo en listas y \xE1rboles.","Color de contorno del widget de filtro de tipo en listas y \xE1rboles, cuando no hay coincidencias.","Color de sombra del widget de filtrado de escritura en listas y \xE1rboles.","Color de fondo de la coincidencia filtrada.","Color de borde de la coincidencia filtrada.","Color de trazo de \xE1rbol para las gu\xEDas de sangr\xEDa.","Color de trazo de \xE1rbol para las gu\xEDas de sangr\xEDa que no est\xE1n activas.","Color de borde de la tabla entre columnas.","Color de fondo para las filas de tabla impares.","Color de primer plano de lista/\xE1rbol para los elementos no enfatizados.","Color de fondo de la casilla de verificaci\xF3n del widget.","Color de fondo del widget de la casilla cuando se selecciona el elemento en el que se encuentra.","Color de primer plano del widget de la casilla de verificaci\xF3n.","Color del borde del widget de la casilla de verificaci\xF3n.","Color de borde del widget de la casilla cuando se selecciona el elemento en el que se encuentra.","Use quickInputList.focusBackground en su lugar.","Selector r\xE1pido del color de primer plano para el elemento con el foco.","Color de primer plano del icono del selector r\xE1pido para el elemento con el foco.","Color de fondo del selector r\xE1pido para el elemento con el foco.","Color del borde de los men\xFAs.","Color de primer plano de los elementos de men\xFA.","Color de fondo de los elementos de men\xFA.","Color de primer plano del menu para el elemento del men\xFA seleccionado.","Color de fondo del menu para el elemento del men\xFA seleccionado.","Color del borde del elemento seleccionado en los men\xFAs.","Color del separador del menu para un elemento del men\xFA.","El fondo de la barra de herramientas se perfila al pasar por encima de las acciones con el mouse.","La barra de herramientas se perfila al pasar por encima de las acciones con el mouse.","Fondo de la barra de herramientas al mantener el mouse sobre las acciones","Resaltado del color de fondo para una ficha de un fragmento de c\xF3digo.","Resaltado del color del borde para una ficha de un fragmento de c\xF3digo.","Resaltado del color de fondo para la \xFAltima ficha de un fragmento de c\xF3digo.","Resaltado del color del borde para la \xFAltima tabulaci\xF3n de un fragmento de c\xF3digo.","Color de los elementos de ruta de navegaci\xF3n que reciben el foco.","Color de fondo de los elementos de ruta de navegaci\xF3n","Color de los elementos de ruta de navegaci\xF3n que reciben el foco.","Color de los elementos de ruta de navegaci\xF3n seleccionados.","Color de fondo del selector de elementos de ruta de navegaci\xF3n.","Fondo del encabezado actual en los conflictos de combinaci\xF3n en l\xEDnea. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Fondo de contenido actual en los conflictos de combinaci\xF3n en l\xEDnea. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Fondo de encabezado entrante en los conflictos de combinaci\xF3n en l\xEDnea. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Fondo de contenido entrante en los conflictos de combinaci\xF3n en l\xEDnea. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Fondo de cabecera de elemento antecesor com\xFAn en conflictos de fusi\xF3n en l\xEDnea. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Fondo de contenido antecesor com\xFAn en conflictos de combinaci\xF3n en l\xEDnea. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color del borde en los encabezados y el divisor en conflictos de combinaci\xF3n alineados.","Primer plano de la regla de visi\xF3n general actual para conflictos de combinaci\xF3n alineados.","Primer plano de regla de visi\xF3n general de entrada para conflictos de combinaci\xF3n alineados.","Primer plano de la regla de visi\xF3n general de ancestros comunes para conflictos de combinaci\xF3n alineados.","Color del marcador de regla general para buscar actualizaciones. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color del marcador de la regla general para los destacados de la selecci\xF3n. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de marcador de minimapa para coincidencias de b\xFAsqueda.","Color de marcador de minimapa para las selecciones del editor que se repiten.","Color del marcador de minimapa para la selecci\xF3n del editor.","Color del marcador de minimapa para informaci\xF3n.","Color del marcador de minimapa para advertencias.","Color del marcador de minimapa para errores.","Color de fondo del minimapa.",'Opacidad de los elementos de primer plano representados en el minimapa. Por ejemplo, "#000000c0" representar\xE1 los elementos con 75% de opacidad.',"Color de fondo del deslizador del minimapa.","Color de fondo del deslizador del minimapa al pasar el puntero.","Color de fondo del deslizador de minimapa al hacer clic en \xE9l.","Color utilizado para el icono de error de problemas.","Color utilizado para el icono de advertencia de problemas.","Color utilizado para el icono de informaci\xF3n de problemas.","Color de primer plano que se usa en los gr\xE1ficos.","Color que se usa para las l\xEDneas horizontales en los gr\xE1ficos.","Color rojo que se usa en las visualizaciones de gr\xE1ficos.","Color azul que se usa en las visualizaciones de gr\xE1ficos.","Color amarillo que se usa en las visualizaciones de gr\xE1ficos.","Color naranja que se usa en las visualizaciones de gr\xE1ficos.","Color verde que se usa en las visualizaciones de gr\xE1ficos.","Color p\xFArpura que se usa en las visualizaciones de gr\xE1ficos."],"vs/platform/theme/common/iconRegistry":["Identificador de la fuente que se va a usar. Si no se establece, se usa la fuente definida en primer lugar.","Car\xE1cter de fuente asociado a la definici\xF3n del icono.","Icono de la acci\xF3n de cierre en los widgets.","Icono para ir a la ubicaci\xF3n del editor anterior.","Icono para ir a la ubicaci\xF3n del editor siguiente."],"vs/platform/undoRedo/common/undoRedoService":["Se han cerrado los siguientes archivos y se han modificado en el disco: {0}.","Los siguientes archivos se han modificado de forma incompatible: {0}.",'No se pudo deshacer "{0}" en todos los archivos. {1}','No se pudo deshacer "{0}" en todos los archivos. {1}','No se pudo deshacer "{0}" en todos los archivos porque se realizaron cambios en {1}','No se pudo deshacer "{0}" en todos los archivos porque ya hay una operaci\xF3n de deshacer o rehacer en ejecuci\xF3n en {1}','No se pudo deshacer "{0}" en todos los archivos porque se produjo una operaci\xF3n de deshacer o rehacer mientras tanto','\xBFDesea deshacer "{0}" en todos los archivos?',"&&Deshacer en {0} archivos","Deshacer este &&archivo",'No se pudo deshacer "{0}" porque ya hay una operaci\xF3n de deshacer o rehacer en ejecuci\xF3n.','\xBFQuiere deshacer "{0}"?',"&&S\xED","No",'No se pudo rehacer "{0}" en todos los archivos. {1}','No se pudo rehacer "{0}" en todos los archivos. {1}','No se pudo volver a hacer "{0}" en todos los archivos porque se realizaron cambios en {1}','No se pudo rehacer "{0}" en todos los archivos porque ya hay una operaci\xF3n de deshacer o rehacer en ejecuci\xF3n en {1}','No se pudo rehacer "{0}" en todos los archivos porque se produjo una operaci\xF3n de deshacer o rehacer mientras tanto','No se pudo rehacer "{0}" porque ya hay una operaci\xF3n de deshacer o rehacer en ejecuci\xF3n.'],"vs/platform/workspace/common/workspace":["\xC1rea de trabajo de c\xF3digo"]});
+
+//# sourceMappingURL=../../../min-maps/vs/editor/editor.main.nls.es.js.map
\ No newline at end of file
diff --git a/public/vs/editor/editor.main.nls.fr.js b/public/vs/editor/editor.main.nls.fr.js
new file mode 100644
index 0000000..dd0f310
--- /dev/null
+++ b/public/vs/editor/editor.main.nls.fr.js
@@ -0,0 +1,13 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.fr",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["entr\xE9e"],"vs/base/browser/ui/findinput/findInputToggles":["Respecter la casse","Mot entier","Utiliser une expression r\xE9guli\xE8re"],"vs/base/browser/ui/findinput/replaceInput":["entr\xE9e","Pr\xE9server la casse"],"vs/base/browser/ui/hover/hoverWidget":["Inspectez ceci dans l\u2019affichage accessible avec {0}.","Inspectez ceci dans l\u2019affichage accessible via la commande Open Accessible View qui ne peut pas \xEAtre d\xE9clench\xE9e via une combinaison de touches pour l\u2019instant."],"vs/base/browser/ui/iconLabel/iconLabelHover":["Chargement..."],"vs/base/browser/ui/inputbox/inputBox":["Erreur\xA0: {0}","Avertissement\xA0: {0}","Info\xA0: {0}"," ou {0} pour l'histoire"," ({0} pour l'histoire)","Entr\xE9e effac\xE9e"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["Ind\xE9pendant"],"vs/base/browser/ui/selectBox/selectBoxCustom":["Zone de s\xE9lection"],"vs/base/browser/ui/toolbar/toolbar":["Plus d'actions..."],"vs/base/browser/ui/tree/abstractTree":["Filtrer","Correspondance approximative","Type \xE0 filtrer","Entrer le texte \xE0 rechercher","Entrer le texte \xE0 rechercher","Fermer","Aucun \xE9l\xE9ment trouv\xE9."],"vs/base/common/actions":["(vide)"],"vs/base/common/errorMessage":["{0}: {1}","Une erreur syst\xE8me s'est produite ({0})","Une erreur inconnue s\u2019est produite. Veuillez consulter le journal pour plus de d\xE9tails.","Une erreur inconnue s\u2019est produite. Veuillez consulter le journal pour plus de d\xE9tails.","{0} ({1}\xA0erreurs au total)","Une erreur inconnue s\u2019est produite. Veuillez consulter le journal pour plus de d\xE9tails."],"vs/base/common/keybindingLabels":["Ctrl","Maj","Alt","Windows","Ctrl","Maj","Alt","Super","Contr\xF4le","Maj","Option","Commande","Contr\xF4le","Maj","Alt","Windows","Contr\xF4le","Maj","Alt","Super"],"vs/base/common/platform":["_"],"vs/editor/browser/controller/textAreaHandler":["\xE9diteur","L\u2019\xE9diteur n\u2019est pas accessible pour le moment.","{0} Pour activer le mode optimis\xE9 du lecteur d\u2019\xE9cran, utilisez {1}","{0} Pour activer le mode optimis\xE9 du lecteur d\u2019\xE9cran, ouvrez la s\xE9lection rapide avec {1} et ex\xE9cutez la commande Activer/D\xE9sactiver le mode d\u2019accessibilit\xE9 du lecteur d\u2019\xE9cran, qui n\u2019est pas d\xE9clenchable via le clavier pour le moment.","{0} Attribuez une combinaison de touches \xE0 la commande Activer/D\xE9sactiver le mode d\u2019accessibilit\xE9 du lecteur d\u2019\xE9cran en acc\xE9dant \xE0 l\u2019\xE9diteur de combinaisons de touches avec {1} et ex\xE9cutez-la."],"vs/editor/browser/coreCommands":["Aligner par rapport \xE0 la fin m\xEAme en cas de passage \xE0 des lignes plus longues","Aligner par rapport \xE0 la fin m\xEAme en cas de passage \xE0 des lignes plus longues","Curseurs secondaires supprim\xE9s"],"vs/editor/browser/editorExtensions":["Ann&&uler","Annuler","&&R\xE9tablir","R\xE9tablir","&&S\xE9lectionner tout","Tout s\xE9lectionner"],"vs/editor/browser/widget/codeEditorWidget":["Le nombre de curseurs a \xE9t\xE9 limit\xE9 \xE0 {0}. Envisagez d\u2019utiliser [rechercher et remplacer](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) pour les modifications plus importantes ou augmentez la limite du nombre de curseurs multiples du param\xE8tre.","Augmenter la limite de curseurs multiples"],"vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer":["Ic\xF4ne \xAB Ins\xE9rer \xBB dans la visionneuse diff accessible.","Ic\xF4ne \xAB Supprimer \xBB dans la visionneuse diff accessible.","Ic\xF4ne de \xAB Fermer \xBB dans la visionneuse diff accessible.","Fermer","Visionneuse diff accessible. Utilisez les fl\xE8ches haut et bas pour naviguer.","aucune ligne chang\xE9e","1\xA0ligne chang\xE9e","{0}\xA0lignes chang\xE9es","Diff\xE9rence\xA0{0} sur\xA0{1}\xA0: ligne d'origine {2}, {3}, ligne modifi\xE9e {4}, {5}","vide","{0} ligne inchang\xE9e {1}","{0}\xA0ligne d'origine {1}\xA0ligne modifi\xE9e {2}","+ {0}\xA0ligne modifi\xE9e {1}","- {0} ligne d'origine {1}"],"vs/editor/browser/widget/diffEditor/components/diffEditorEditors":[" utilisez {0} pour ouvrir l\u2019aide sur l\u2019accessibilit\xE9."],"vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin":["Copier les lignes supprim\xE9es","Copier la ligne supprim\xE9e","Copier les lignes modifi\xE9es","Copier la ligne modifi\xE9e","Copier la ligne supprim\xE9e ({0})","Copier la ligne modifi\xE9e ({0})","Annuler la modification"],"vs/editor/browser/widget/diffEditor/diffEditor.contribution":["Utiliser la vue inline lorsque l'espace est limit\xE9","Afficher les blocs de code d\xE9plac\xE9s","\xC9diteur de diff\xE9rences","Visionneuse Diff accessible","Ouvrir la visionneuse diff accessible","Activer/d\xE9sactiver r\xE9duire les r\xE9gions inchang\xE9es","Activer/d\xE9sactiver l\u2019affichage des blocs de code d\xE9plac\xE9s","Activer/d\xE9sactiver Utiliser la vue inline lorsque l'espace est limit\xE9","Changer de c\xF4t\xE9","Quitter Comparer le d\xE9placement","R\xE9duire toutes les r\xE9gions inchang\xE9es","Afficher toutes les r\xE9gions inchang\xE9es","Acc\xE9der \xE0 la diff\xE9rence suivante","Acc\xE9der la diff\xE9rence pr\xE9c\xE9dente"],"vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature":["Replier la r\xE9gion inchang\xE9e","Cliquez ou faites glisser pour afficher plus d'\xE9l\xE9ments au-dessus","Afficher la r\xE9gion inchang\xE9e","Cliquez ou faites glisser pour afficher plus d'\xE9l\xE9ments en dessous","{0} lignes masqu\xE9es","Double-cliquer pour d\xE9plier"],"vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature":["Code d\xE9plac\xE9 avec des modifications vers la ligne {0}-{1}","Code d\xE9plac\xE9 avec des modifications \xE0 partir de la ligne {0}-{1}","Code d\xE9plac\xE9 vers la ligne {0}-{1}","Code d\xE9plac\xE9 \xE0 partir de la ligne {0}-{1}"],"vs/editor/browser/widget/diffEditor/features/revertButtonsFeature":["R\xE9tablir les modifications s\xE9lectionn\xE9es","R\xE9tablir la modification"],"vs/editor/browser/widget/diffEditor/registrations.contribution":["Couleur de bordure du texte d\xE9plac\xE9 dans l\u2019\xE9diteur de diff.","Couleur de bordure active du texte d\xE9plac\xE9 dans l\u2019\xE9diteur de diff\xE9rences.","Couleur de l\u2019ombre autour des widgets de r\xE9gion inchang\xE9s.","\xC9l\xE9ment d\xE9coratif de ligne pour les insertions dans l'\xE9diteur de diff\xE9rences.","\xC9l\xE9ment d\xE9coratif de ligne pour les suppressions dans l'\xE9diteur de diff\xE9rences."],"vs/editor/browser/widget/hoverWidget/hoverWidget":["Maintenez la touche {0} enfonc\xE9e pour pointer avec la souris"],"vs/editor/browser/widget/multiDiffEditorWidget/colors":["Couleur d\u2019arri\xE8re-plan de l\u2019en-t\xEAte de l\u2019\xE9diteur de diff\xE9rences","Couleur d\u2019arri\xE8re-plan de l\u2019\xE9diteur de diff\xE9rences de fichiers multiples","Couleur de bordure de l\u2019\xE9diteur de diff\xE9rences de fichiers multiples"],"vs/editor/common/config/editorConfigurationSchema":["\xC9diteur","Le nombre d\u2019espaces auxquels une tabulation est \xE9gale. Ce param\xE8tre est substitu\xE9 bas\xE9 sur le contenu du fichier lorsque {0} est activ\xE9.",'Nombre d\u2019espaces utilis\xE9s pour la mise en retrait ou `"tabSize"` pour utiliser la valeur de `#editor.tabSize#`. Ce param\xE8tre est remplac\xE9 en fonction du contenu du fichier quand `#editor.detectIndentation#` est activ\xE9.',"Espaces ins\xE9r\xE9s quand vous appuyez sur la touche Tab. Ce param\xE8tre est remplac\xE9 en fonction du contenu du fichier quand {0} est activ\xE9.","Contr\xF4le si {0} et {1} sont automatiquement d\xE9tect\xE9s lors de l\u2019ouverture d\u2019un fichier en fonction de son contenu.","Supprimer l'espace blanc de fin ins\xE9r\xE9 automatiquement.","Traitement sp\xE9cial des fichiers volumineux pour d\xE9sactiver certaines fonctionnalit\xE9s utilisant beaucoup de m\xE9moire.","D\xE9sactivez les suggestions bas\xE9es sur Word.","Sugg\xE8re uniquement des mots dans le document actif.","Sugg\xE8re des mots dans tous les documents ouverts du m\xEAme langage.","Sugg\xE8re des mots dans tous les documents ouverts.","Contr\xF4le si les compl\xE9tions doivent \xEAtre calcul\xE9es en fonction des mots du document et \xE0 partir de quels documents elles sont calcul\xE9es.","Coloration s\xE9mantique activ\xE9e pour tous les th\xE8mes de couleur.","Coloration s\xE9mantique d\xE9sactiv\xE9e pour tous les th\xE8mes de couleur.","La coloration s\xE9mantique est configur\xE9e par le param\xE8tre 'semanticHighlighting' du th\xE8me de couleur actuel.","Contr\xF4le si semanticHighlighting est affich\xE9 pour les langages qui le prennent en charge.","Maintenir les \xE9diteurs d'aper\xE7u ouverts m\xEAme si l'utilisateur double-clique sur son contenu ou appuie sur la touche \xC9chap.","Les lignes plus longues que cette valeur ne sont pas tokenis\xE9es pour des raisons de performances","Contr\xF4le si la cr\xE9ation de jetons doit se produire de mani\xE8re asynchrone sur un worker web.","Contr\xF4le si la cr\xE9ation de jetons asynchrones doit \xEAtre journalis\xE9e. Pour le d\xE9bogage uniquement.","Contr\xF4le si la segmentation du texte en unit\xE9s lexicales asynchrones doit \xEAtre v\xE9rifi\xE9e par rapport \xE0 la segmentation du texte en unit\xE9s lexicales en arri\xE8re-plan h\xE9rit\xE9e. Peut ralentir la segmentation du texte en unit\xE9s lexicales. Pour le d\xE9bogage uniquement.","D\xE9finit les symboles de type crochet qui augmentent ou diminuent le retrait.","S\xE9quence de cha\xEEnes ou de caract\xE8res de crochets ouvrants.","S\xE9quence de cha\xEEnes ou de caract\xE8res de crochets fermants.","D\xE9finit les paires de crochets qui sont coloris\xE9es par leur niveau d\u2019imbrication si la colorisation des paires de crochets est activ\xE9e.","S\xE9quence de cha\xEEnes ou de caract\xE8res de crochets ouvrants.","S\xE9quence de cha\xEEnes ou de caract\xE8res de crochets fermants.","D\xE9lai d'expiration en millisecondes avant annulation du calcul de diff. Utilisez\xA00 pour supprimer le d\xE9lai d'expiration.","Taille de fichier maximale en Mo pour laquelle calculer les diff\xE9rences. Utilisez 0 pour ne pas avoir de limite.","Contr\xF4le si l'\xE9diteur de diff\xE9rences affiche les diff\xE9rences en mode c\xF4te \xE0 c\xF4te ou inline.","Si l'\xE9diteur de diff\xE9rences est moins large que cette valeur, la vue inline est utilis\xE9e.","Si cette option est activ\xE9e et que la largeur de l'\xE9diteur est trop \xE9troite, la vue inline est utilis\xE9e.","Lorsqu\u2019il est activ\xE9, l\u2019\xE9diteur de diff\xE9rences affiche des fl\xE8ches dans sa marge de glyphe pour r\xE9tablir les modifications.","Quand il est activ\xE9, l'\xE9diteur de diff\xE9rences ignore les changements d'espace blanc de d\xE9but ou de fin.","Contr\xF4le si l'\xE9diteur de diff\xE9rences affiche les indicateurs +/- pour les changements ajout\xE9s/supprim\xE9s .","Contr\xF4le si l'\xE9diteur affiche CodeLens.","Le retour automatique \xE0 la ligne n'est jamais effectu\xE9.","Le retour automatique \xE0 la ligne s'effectue en fonction de la largeur de la fen\xEAtre d'affichage.","Le retour automatique \xE0 la ligne d\xE9pend du param\xE8tre {0}.","Utilise l\u2019algorithme de comparaison h\xE9rit\xE9.","Utilise l\u2019algorithme de comparaison avanc\xE9.","Contr\xF4le si l'\xE9diteur de diff\xE9rences affiche les r\xE9gions inchang\xE9es.","Contr\xF4le le nombre de lignes utilis\xE9es pour les r\xE9gions inchang\xE9es.","Contr\xF4le le nombre de lignes utilis\xE9es comme minimum pour les r\xE9gions inchang\xE9es.","Contr\xF4le le nombre de lignes utilis\xE9es comme contexte lors de la comparaison des r\xE9gions inchang\xE9es.","Contr\xF4le si l\u2019\xE9diteur de diff\xE9rences doit afficher les d\xE9placements de code d\xE9tect\xE9s.","Contr\xF4le si l\u2019\xE9diteur de diff\xE9rences affiche des d\xE9corations vides pour voir o\xF9 les caract\xE8res ont \xE9t\xE9 ins\xE9r\xE9s ou supprim\xE9s."],"vs/editor/common/config/editorOptions":["Utilisez les API de la plateforme pour d\xE9tecter lorsqu'un lecteur d'\xE9cran est connect\xE9.","Optimiser pour une utilisation avec un lecteur d'\xE9cran.","Supposons qu\u2019aucun lecteur d\u2019\xE9cran ne soit connect\xE9.","Contr\xF4le si l\u2019interface utilisateur doit s\u2019ex\xE9cuter dans un mode o\xF9 elle est optimis\xE9e pour les lecteurs d\u2019\xE9cran.","Contr\xF4le si un espace est ins\xE9r\xE9 pour les commentaires.","Contr\xF4le si les lignes vides doivent \xEAtre ignor\xE9es avec des actions d'activation/de d\xE9sactivation, d'ajout ou de suppression des commentaires de ligne.","Contr\xF4le si la copie sans s\xE9lection permet de copier la ligne actuelle.","Contr\xF4le si le curseur doit sauter pour rechercher les correspondances lors de la saisie.","Ne lancez jamais la cha\xEEne de recherche dans la s\xE9lection de l\u2019\xE9diteur.","Toujours amorcer la cha\xEEne de recherche \xE0 partir de la s\xE9lection de l\u2019\xE9diteur, y compris le mot \xE0 la position du curseur.","Cha\xEEne de recherche initiale uniquement dans la s\xE9lection de l\u2019\xE9diteur.","D\xE9termine si la cha\xEEne de recherche dans le Widget Recherche est initialis\xE9e avec la s\xE9lection de l\u2019\xE9diteur.","Ne jamais activer automatiquement la recherche dans la s\xE9lection (par d\xE9faut).","Toujours activer automatiquement la recherche dans la s\xE9lection.","Activez Rechercher automatiquement dans la s\xE9lection quand plusieurs lignes de contenu sont s\xE9lectionn\xE9es.","Contr\xF4le la condition d'activation automatique de la recherche dans la s\xE9lection.","D\xE9termine si le Widget Recherche devrait lire ou modifier le presse-papiers de recherche partag\xE9 sur macOS.","Contr\xF4le si le widget Recherche doit ajouter des lignes suppl\xE9mentaires en haut de l'\xE9diteur. Quand la valeur est true, vous pouvez faire d\xE9filer au-del\xE0 de la premi\xE8re ligne si le widget Recherche est visible.","Contr\xF4le si la recherche red\xE9marre automatiquement depuis le d\xE9but (ou la fin) quand il n'existe aucune autre correspondance.","Active/d\xE9sactive les ligatures de police (fonctionnalit\xE9s de police 'calt' et 'liga'). Remplacez ceci par une cha\xEEne pour contr\xF4ler de mani\xE8re pr\xE9cise la propri\xE9t\xE9 CSS 'font-feature-settings'.","Propri\xE9t\xE9 CSS 'font-feature-settings' explicite. Vous pouvez passer une valeur bool\xE9enne \xE0 la place si vous devez uniquement activer/d\xE9sactiver les ligatures.","Configure les ligatures de police ou les fonctionnalit\xE9s de police. Il peut s'agir d'une valeur bool\xE9enne permettant d'activer/de d\xE9sactiver les ligatures, ou d'une cha\xEEne correspondant \xE0 la valeur de la propri\xE9t\xE9 CSS 'font-feature-settings'.","Active/d\xE9sactive la traduction de font-weight en font-variation-settings. Remplacez ce param\xE8tre par une cha\xEEne pour un contr\xF4le affin\xE9 de la propri\xE9t\xE9 CSS 'font-variation-settings'.","Propri\xE9t\xE9 CSS 'font-variation-settings' explicite. Une valeur bool\xE9enne peut \xEAtre pass\xE9e \xE0 la place si une seule valeur doit traduire font-weight en font-variation-settings.","Configure les variations de la police. Il peut s\u2019agir d\u2019une valeur bool\xE9enne pour activer/d\xE9sactiver la traduction de font-weight en font-variation-settings ou d\u2019une cha\xEEne pour la valeur de la propri\xE9t\xE9 CSS 'font-variation-settings'.","Contr\xF4le la taille de police en pixels.",'Seuls les mots cl\xE9s "normal" et "bold", ou les nombres compris entre\xA01 et\xA01\xA0000 sont autoris\xE9s.',`Contr\xF4le l'\xE9paisseur de police. Accepte les mots cl\xE9s "normal" et "bold", ou les nombres compris entre\xA01 et\xA01\xA0000.`,"Montrer l\u2019aper\xE7u des r\xE9sultats (par d\xE9faut)","Acc\xE9der au r\xE9sultat principal et montrer un aper\xE7u","Acc\xE9der au r\xE9sultat principal et activer l\u2019acc\xE8s sans aper\xE7u pour les autres","Ce param\xE8tre est d\xE9pr\xE9ci\xE9, utilisez des param\xE8tres distincts comme 'editor.editor.gotoLocation.multipleDefinitions' ou 'editor.editor.gotoLocation.multipleImplementations' \xE0 la place.","Contr\xF4le le comportement de la commande 'Atteindre la d\xE9finition' quand plusieurs emplacements cibles existent.","Contr\xF4le le comportement de la commande 'Atteindre la d\xE9finition de type' quand plusieurs emplacements cibles existent.","Contr\xF4le le comportement de la commande 'Atteindre la d\xE9claration' quand plusieurs emplacements cibles existent.","Contr\xF4le le comportement de la commande 'Atteindre les impl\xE9mentations' quand plusieurs emplacements cibles existent.","Contr\xF4le le comportement de la commande 'Atteindre les r\xE9f\xE9rences' quand plusieurs emplacements cibles existent.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre la d\xE9finition' est l'emplacement actuel.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre la d\xE9finition de type' est l'emplacement actuel.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre la d\xE9claration' est l'emplacement actuel.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre l'impl\xE9mentation' est l'emplacement actuel.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre la r\xE9f\xE9rence' est l'emplacement actuel.","Contr\xF4le si le pointage est affich\xE9.","Contr\xF4le le d\xE9lai en millisecondes, apr\xE8s lequel le survol est affich\xE9.","Contr\xF4le si le pointage doit rester visible quand la souris est d\xE9plac\xE9e au-dessus.","Contr\xF4le le d\xE9lai en millisecondes apr\xE8s lequel le survol est masqu\xE9. N\xE9cessite que \xAB editor.hover.sticky \xBB soit activ\xE9.","Pr\xE9f\xE9rez afficher les points au-dessus de la ligne, s\u2019il y a de l\u2019espace.","Suppose que tous les caract\xE8res ont la m\xEAme largeur. Il s'agit d'un algorithme rapide qui fonctionne correctement pour les polices \xE0 espacement fixe et certains scripts (comme les caract\xE8res latins) o\xF9 les glyphes ont la m\xEAme largeur.","D\xE9l\xE8gue le calcul des points de wrapping au navigateur. Il s'agit d'un algorithme lent qui peut provoquer le gel des grands fichiers, mais qui fonctionne correctement dans tous les cas.","Contr\xF4le l\u2019algorithme qui calcule les points d\u2019habillage. Notez qu\u2019en mode d\u2019accessibilit\xE9, les options avanc\xE9es sont utilis\xE9es pour une exp\xE9rience optimale.","D\xE9sactiver le menu d\u2019action du code.","Afficher le menu d\u2019action du code lorsque le curseur se trouve sur des lignes avec du code.","Afficher le menu d\u2019action du code lorsque le curseur se trouve sur des lignes avec du code ou sur des lignes vides.","Active l\u2019ampoule d\u2019action de code dans l\u2019\xE9diteur.","Affiche les \xE9tendues actives imbriqu\xE9s pendant le d\xE9filement en haut de l\u2019\xE9diteur.","D\xE9finit le nombre maximal de lignes r\xE9manentes \xE0 afficher.","D\xE9finit le mod\xE8le \xE0 utiliser pour d\xE9terminer les lignes \xE0 coller. Si le mod\xE8le hi\xE9rarchique n\u2019existe pas, il revient au mod\xE8le de fournisseur de pliage qui revient au mod\xE8le de mise en retrait. Cette demande est respect\xE9e dans les trois cas.","Activez le d\xE9filement de Sticky Scroll avec la barre de d\xE9filement horizontale de l'\xE9diteur.","Active les indicateurs inlay dans l\u2019\xE9diteur.","Les indicateurs d\u2019inlay sont activ\xE9s.","Les indicateurs d\u2019inlay sont affich\xE9s par d\xE9faut et masqu\xE9s lors de la conservation {0}","Les indicateurs d\u2019inlay sont masqu\xE9s par d\xE9faut et s\u2019affichent lorsque vous maintenez {0}","Les indicateurs d\u2019inlay sont d\xE9sactiv\xE9s.","Contr\xF4le la taille de police des indicateurs d\u2019inlay dans l\u2019\xE9diteur. Par d\xE9faut, le {0} est utilis\xE9 lorsque la valeur configur\xE9e est inf\xE9rieure \xE0 {1} ou sup\xE9rieure \xE0 la taille de police de l\u2019\xE9diteur.","Contr\xF4le la famille de polices des indicateurs d\u2019inlay dans l\u2019\xE9diteur. Lorsqu\u2019il est d\xE9fini sur vide, le {0} est utilis\xE9.","Active le remplissage autour des indicateurs d\u2019inlay dans l\u2019\xE9diteur.",`Contr\xF4le la hauteur de ligne. \r
+ - Utilisez 0 pour calculer automatiquement la hauteur de ligne \xE0 partir de la taille de police.\r
+ : les valeurs comprises entre 0 et 8 sont utilis\xE9es comme multiplicateur avec la taille de police.\r
+ : les valeurs sup\xE9rieures ou \xE9gales \xE0 8 seront utilis\xE9es comme valeurs effectives.`,"Contr\xF4le si la minimap est affich\xE9e.","Contr\xF4le si la minimap est masqu\xE9e automatiquement.","Le minimap a la m\xEAme taille que le contenu de l'\xE9diteur (d\xE9filement possible).","Le minimap s'agrandit ou se r\xE9duit selon les besoins pour remplir la hauteur de l'\xE9diteur (pas de d\xE9filement).","Le minimap est r\xE9duit si n\xE9cessaire pour ne jamais d\xE9passer la taille de l'\xE9diteur (pas de d\xE9filement).","Contr\xF4le la taille du minimap.","Contr\xF4le le c\xF4t\xE9 o\xF9 afficher la minimap.","Contr\xF4le quand afficher le curseur du minimap.","\xC9chelle du contenu dessin\xE9 dans le minimap\xA0: 1, 2\xA0ou\xA03.","Afficher les caract\xE8res r\xE9els sur une ligne par opposition aux blocs de couleur.","Limiter la largeur de la minimap pour afficher au plus un certain nombre de colonnes.","Contr\xF4le la quantit\xE9 d\u2019espace entre le bord sup\xE9rieur de l\u2019\xE9diteur et la premi\xE8re ligne.","Contr\xF4le la quantit\xE9 d'espace entre le bord inf\xE9rieur de l'\xE9diteur et la derni\xE8re ligne.","Active une fen\xEAtre contextuelle qui affiche de la documentation sur les param\xE8tres et des informations sur les types \xE0 mesure que vous tapez.","D\xE9termine si le menu de suggestions de param\xE8tres se ferme ou reviens au d\xE9but lorsque la fin de la liste est atteinte.","Des suggestions rapides s\u2019affichent dans le widget de suggestion","Les suggestions rapides s\u2019affichent sous forme de texte fant\xF4me","Les suggestions rapides sont d\xE9sactiv\xE9es","Activez les suggestions rapides dans les cha\xEEnes.","Activez les suggestions rapides dans les commentaires.","Activez les suggestions rapides en dehors des cha\xEEnes et des commentaires.","Contr\xF4le si les suggestions doivent s\u2019afficher automatiquement lors de la saisie. Cela peut \xEAtre contr\xF4l\xE9 pour la saisie dans des commentaires, des cha\xEEnes et d\u2019autres codes. Vous pouvez configurer la suggestion rapide pour qu\u2019elle s\u2019affiche sous forme de texte fant\xF4me ou avec le widget de suggestion. Tenez \xE9galement compte du param\xE8tre '{0}' qui contr\xF4le si des suggestions sont d\xE9clench\xE9es par des caract\xE8res sp\xE9ciaux.","Les num\xE9ros de ligne ne sont pas affich\xE9s.","Les num\xE9ros de ligne sont affich\xE9s en nombre absolu.","Les num\xE9ros de ligne sont affich\xE9s sous la forme de distance en lignes \xE0 la position du curseur.","Les num\xE9ros de ligne sont affich\xE9s toutes les 10 lignes.","Contr\xF4le l'affichage des num\xE9ros de ligne.","Nombre de caract\xE8res monospace auxquels cette r\xE8gle d'\xE9diteur effectue le rendu.","Couleur de cette r\xE8gle d'\xE9diteur.","Rendre les r\xE8gles verticales apr\xE8s un certain nombre de caract\xE8res \xE0 espacement fixe. Utiliser plusieurs valeurs pour plusieurs r\xE8gles. Aucune r\xE8gle n'est dessin\xE9e si le tableau est vide.","La barre de d\xE9filement verticale sera visible uniquement lorsque cela est n\xE9cessaire.","La barre de d\xE9filement verticale est toujours visible.","La barre de d\xE9filement verticale est toujours masqu\xE9e.","Contr\xF4le la visibilit\xE9 de la barre de d\xE9filement verticale.","La barre de d\xE9filement horizontale sera visible uniquement lorsque cela est n\xE9cessaire.","La barre de d\xE9filement horizontale est toujours visible.","La barre de d\xE9filement horizontale est toujours masqu\xE9e.","Contr\xF4le la visibilit\xE9 de la barre de d\xE9filement horizontale.","Largeur de la barre de d\xE9filement verticale.","Hauteur de la barre de d\xE9filement horizontale.","Contr\xF4le si les clics permettent de faire d\xE9filer par page ou d\u2019acc\xE9der \xE0 la position de clic.","Lorsqu'elle est d\xE9finie, la barre de d\xE9filement horizontale n'augmentera pas la taille du contenu de l'\xE9diteur.","Contr\xF4le si tous les caract\xE8res ASCII non basiques sont mis en surbrillance. Seuls les caract\xE8res compris entre U+0020 et U+007E, tabulation, saut de ligne et retour chariot sont consid\xE9r\xE9s comme des ASCII de base.","Contr\xF4le si les caract\xE8res qui r\xE9servent de l\u2019espace ou qui n\u2019ont pas de largeur sont mis en surbrillance.","Contr\xF4le si les caract\xE8res mis en surbrillance peuvent \xEAtre d\xE9concert\xE9s avec des caract\xE8res ASCII de base, \xE0 l\u2019exception de ceux qui sont courants dans les param\xE8tres r\xE9gionaux utilisateur actuels.","Contr\xF4le si les caract\xE8res des commentaires doivent \xE9galement faire l\u2019objet d\u2019une mise en surbrillance Unicode.","Contr\xF4le si les caract\xE8res des cha\xEEnes de texte doivent \xE9galement faire l\u2019objet d\u2019une mise en surbrillance Unicode.","D\xE9finit les caract\xE8res autoris\xE9s qui ne sont pas mis en surbrillance.","Les caract\xE8res Unicode communs aux param\xE8tres r\xE9gionaux autoris\xE9s ne sont pas mis en surbrillance.","Contr\xF4le si les suggestions en ligne doivent \xEAtre affich\xE9es automatiquement dans l\u2019\xE9diteur.","Afficher la barre d\u2019outils de suggestion en ligne chaque fois qu\u2019une suggestion inline est affich\xE9e.","Afficher la barre d\u2019outils de suggestion en ligne lorsque vous pointez sur une suggestion incluse.","N\u2019affichez jamais la barre d\u2019outils de suggestion en ligne.","Contr\xF4le quand afficher la barre d\u2019outils de suggestion incluse.","Contr\xF4le la fa\xE7on dont les suggestions inline interagissent avec le widget de suggestion. Si cette option est activ\xE9e, le widget de suggestion n\u2019est pas affich\xE9 automatiquement lorsque des suggestions inline sont disponibles.","Contr\xF4le la famille de polices des suggestions inlined.","Contr\xF4le si la colorisation des paires de crochets est activ\xE9e ou non. Utilisez {0} pour remplacer les couleurs de surbrillance des crochets.","Contr\xF4le si chaque type de crochet poss\xE8de son propre pool de couleurs ind\xE9pendant.","D\xE9sactive les rep\xE8res de paire de crochets.","Active les rep\xE8res de paire de crochets uniquement pour la paire de crochets actifs.","D\xE9sactive les rep\xE8res de paire de crochets.","Contr\xF4le si les guides de la paire de crochets sont activ\xE9s ou non.","Active les rep\xE8res horizontaux en plus des rep\xE8res de paire de crochets verticaux.","Active les rep\xE8res horizontaux uniquement pour la paire de crochets actifs.","D\xE9sactive les rep\xE8res de paire de crochets horizontaux.","Contr\xF4le si les guides de la paire de crochets horizontaux sont activ\xE9s ou non.","Contr\xF4le si l\u2019\xE9diteur doit mettre en surbrillance la paire de crochets actifs.","Contr\xF4le si l\u2019\xE9diteur doit afficher les guides de mise en retrait.","Met en surbrillance le guide de retrait actif.","Met en surbrillance le rep\xE8re de retrait actif m\xEAme si les rep\xE8res de crochet sont mis en surbrillance.","Ne mettez pas en surbrillance le rep\xE8re de retrait actif.","Contr\xF4le si l\u2019\xE9diteur doit mettre en surbrillance le guide de mise en retrait actif.","Ins\xE9rez une suggestion sans remplacer le texte \xE0 droite du curseur.","Ins\xE9rez une suggestion et remplacez le texte \xE0 droite du curseur.","Contr\xF4le si les mots sont remplac\xE9s en cas d'acceptation de la saisie semi-automatique. Notez que cela d\xE9pend des extensions adh\xE9rant \xE0 cette fonctionnalit\xE9.","D\xE9termine si le filtre et le tri des suggestions doivent prendre en compte les fautes de frappes mineures.","Contr\xF4le si le tri favorise les mots qui apparaissent \xE0 proximit\xE9 du curseur.","Contr\xF4le si les s\xE9lections de suggestion m\xE9moris\xE9es sont partag\xE9es entre plusieurs espaces de travail et fen\xEAtres (n\xE9cessite '#editor.suggestSelection#').","Toujours s\xE9lectionner une suggestion lors du d\xE9clenchement automatique d\u2019IntelliSense.","Ne jamais s\xE9lectionner une suggestion lors du d\xE9clenchement automatique d\u2019IntelliSense.","S\xE9lectionnez une suggestion uniquement lors du d\xE9clenchement d\u2019IntelliSense \xE0 partir d\u2019un caract\xE8re d\xE9clencheur.","S\xE9lectionnez une suggestion uniquement lors du d\xE9clenchement d\u2019IntelliSense au cours de la frappe.","Contr\xF4le si une suggestion est s\xE9lectionn\xE9e lorsque le widget s\u2019affiche. Notez que cela s\u2019applique uniquement aux suggestions d\xE9clench\xE9es automatiquement ('#editor.quickSuggestions#' et '#editor.suggestOnTriggerCharacters#') et qu\u2019une suggestion est toujours s\xE9lectionn\xE9e lorsqu\u2019elle est appel\xE9e explicitement, par exemple via 'Ctrl+Espace'.","Contr\xF4le si un extrait de code actif emp\xEAche les suggestions rapides.","Contr\xF4le s'il faut montrer ou masquer les ic\xF4nes dans les suggestions.","Contr\xF4le la visibilit\xE9 de la barre d'\xE9tat en bas du widget de suggestion.","Contr\xF4le si la sortie de la suggestion doit \xEAtre affich\xE9e en aper\xE7u dans l\u2019\xE9diteur.","D\xE9termine si les d\xE9tails du widget de suggestion sont inclus dans l\u2019\xE9tiquette ou uniquement dans le widget de d\xE9tails.","Ce param\xE8tre est d\xE9pr\xE9ci\xE9. Le widget de suggestion peut d\xE9sormais \xEAtre redimensionn\xE9.","Ce param\xE8tre est d\xE9pr\xE9ci\xE9, veuillez utiliser des param\xE8tres distincts comme 'editor.suggest.showKeywords' ou 'editor.suggest.showSnippets' \xE0 la place.","Si activ\xE9, IntelliSense montre des suggestions de type 'method'.","Si activ\xE9, IntelliSense montre des suggestions de type 'function'.","Si activ\xE9, IntelliSense montre des suggestions de type 'constructor'.","Si cette option est activ\xE9e, IntelliSense montre des suggestions `d\xE9pr\xE9ci\xE9es`.","Quand le filtrage IntelliSense est activ\xE9, le premier caract\xE8re correspond \xE0 un d\xE9but de mot, par exemple 'c' sur 'Console' ou 'WebContext', mais _not_ sur 'description'. Si d\xE9sactiv\xE9, IntelliSense affiche plus de r\xE9sultats, mais les trie toujours par qualit\xE9 de correspondance.","Si activ\xE9, IntelliSense montre des suggestions de type 'field'.","Si activ\xE9, IntelliSense montre des suggestions de type 'variable'.","Si activ\xE9, IntelliSense montre des suggestions de type 'class'.","Si activ\xE9, IntelliSense montre des suggestions de type 'struct'.","Si activ\xE9, IntelliSense montre des suggestions de type 'interface'.","Si activ\xE9, IntelliSense montre des suggestions de type 'module'.","Si activ\xE9, IntelliSense montre des suggestions de type 'property'.","Si activ\xE9, IntelliSense montre des suggestions de type 'event'.","Si activ\xE9, IntelliSense montre des suggestions de type 'operator'.","Si activ\xE9, IntelliSense montre des suggestions de type 'unit'.","Si activ\xE9, IntelliSense montre des suggestions de type 'value'.","Si activ\xE9, IntelliSense montre des suggestions de type 'constant'.","Si activ\xE9, IntelliSense montre des suggestions de type 'enum'.","Si activ\xE9, IntelliSense montre des suggestions de type 'enumMember'.","Si activ\xE9, IntelliSense montre des suggestions de type 'keyword'.","Si activ\xE9, IntelliSense montre des suggestions de type 'text'.","Si activ\xE9, IntelliSense montre des suggestions de type 'color'.","Si activ\xE9, IntelliSense montre des suggestions de type 'file'.","Si activ\xE9, IntelliSense montre des suggestions de type 'reference'.","Si activ\xE9, IntelliSense montre des suggestions de type 'customcolor'.","Si activ\xE9, IntelliSense montre des suggestions de type 'folder'.","Si activ\xE9, IntelliSense montre des suggestions de type 'typeParameter'.","Si activ\xE9, IntelliSense montre des suggestions de type 'snippet'.","Si activ\xE9, IntelliSense montre des suggestions de type 'utilisateur'.","Si activ\xE9, IntelliSense montre des suggestions de type 'probl\xE8mes'.","Indique si les espaces blancs de d\xE9but et de fin doivent toujours \xEAtre s\xE9lectionn\xE9s.","Indique si les sous-mots (tels que \xAB foo \xBB dans \xAB fooBar \xBB ou \xAB foo_bar \xBB) doivent \xEAtre s\xE9lectionn\xE9s.","Aucune mise en retrait. Les lignes envelopp\xE9es commencent \xE0 la colonne 1.","Les lignes envelopp\xE9es obtiennent la m\xEAme mise en retrait que le parent.","Les lignes justifi\xE9es obtiennent une mise en retrait +1 vers le parent.","Les lignes justifi\xE9es obtiennent une mise en retrait +2 vers le parent. ","Contr\xF4le la mise en retrait des lignes justifi\xE9es.","Contr\xF4le si vous pouvez glisser et d\xE9poser un fichier dans un \xE9diteur de texte en maintenant la touche \xAB\xA0Maj\xA0\xBB enfonc\xE9e (au lieu d\u2019ouvrir le fichier dans un \xE9diteur).","Contr\xF4le si un widget est affich\xE9 lors de l\u2019annulation de fichiers dans l\u2019\xE9diteur. Ce widget vous permet de contr\xF4ler la fa\xE7on dont le fichier est annul\xE9.","Afficher le widget du s\xE9lecteur de d\xE9p\xF4t apr\xE8s la suppression d\u2019un fichier dans l\u2019\xE9diteur.","Ne jamais afficher le widget du s\xE9lecteur de d\xE9p\xF4t. \xC0 la place, le fournisseur de d\xE9p\xF4t par d\xE9faut est toujours utilis\xE9.","Contr\xF4le si vous pouvez coller le contenu de diff\xE9rentes mani\xE8res.","Contr\xF4le l\u2019affichage d\u2019un widget lors du collage de contenu dans l\u2019\xE9diteur. Ce widget vous permet de contr\xF4ler la mani\xE8re dont le fichier est coll\xE9.","Afficher le widget du s\xE9lecteur de collage une fois le contenu coll\xE9 dans l\u2019\xE9diteur.","Ne jamais afficher le widget de s\xE9lection de collage. Au lieu de cela, le comportement de collage par d\xE9faut est toujours utilis\xE9.","Contr\xF4le si les suggestions doivent \xEAtre accept\xE9es sur les caract\xE8res de validation. Par exemple, en JavaScript, le point-virgule (`;`) peut \xEAtre un caract\xE8re de validation qui accepte une suggestion et tape ce caract\xE8re.","Accepter uniquement une suggestion avec 'Entr\xE9e' quand elle effectue une modification textuelle.","Contr\xF4le si les suggestions sont accept\xE9es apr\xE8s appui sur 'Entr\xE9e', en plus de 'Tab'. Permet d\u2019\xE9viter toute ambigu\xEFt\xE9 entre l\u2019insertion de nouvelles lignes et l'acceptation de suggestions.","Contr\xF4le le nombre de lignes de l\u2019\xE9diteur qu\u2019un lecteur d\u2019\xE9cran peut lire en une seule fois. Quand nous d\xE9tectons un lecteur d\u2019\xE9cran, nous d\xE9finissons automatiquement la valeur par d\xE9faut \xE0 500. Attention\xA0: Les valeurs sup\xE9rieures \xE0 la valeur par d\xE9faut peuvent avoir un impact important sur les performances.","Contenu de l'\xE9diteur","Contr\xF4lez si les suggestions incluses sont annonc\xE9es par un lecteur d\u2019\xE9cran.","Utilisez les configurations de langage pour d\xE9terminer quand fermer automatiquement les parenth\xE8ses.","Fermer automatiquement les parenth\xE8ses uniquement lorsque le curseur est \xE0 gauche de l\u2019espace.","Contr\xF4le si l\u2019\xE9diteur doit fermer automatiquement les parenth\xE8ses quand l\u2019utilisateur ajoute une parenth\xE8se ouvrante.","Utilisez les configurations de langage pour d\xE9terminer quand fermer automatiquement les commentaires.","Fermez automatiquement les commentaires seulement si le curseur est \xE0 gauche de l'espace.","Contr\xF4le si l'\xE9diteur doit fermer automatiquement les commentaires quand l'utilisateur ajoute un commentaire ouvrant.","Supprimez les guillemets ou crochets fermants adjacents uniquement s'ils ont \xE9t\xE9 ins\xE9r\xE9s automatiquement.","Contr\xF4le si l'\xE9diteur doit supprimer les guillemets ou crochets fermants adjacents au moment de la suppression.","Tapez avant les guillemets ou les crochets fermants uniquement s'ils sont automatiquement ins\xE9r\xE9s.","Contr\xF4le si l'\xE9diteur doit taper avant les guillemets ou crochets fermants.","Utilisez les configurations de langage pour d\xE9terminer quand fermer automatiquement les guillemets.","Fermer automatiquement les guillemets uniquement lorsque le curseur est \xE0 gauche de l\u2019espace.","Contr\xF4le si l\u2019\xE9diteur doit fermer automatiquement les guillemets apr\xE8s que l\u2019utilisateur ajoute un guillemet ouvrant.","L'\xE9diteur n'ins\xE8re pas de retrait automatiquement.","L'\xE9diteur conserve le retrait de la ligne actuelle.","L'\xE9diteur conserve le retrait de la ligne actuelle et honore les crochets d\xE9finis par le langage.","L'\xE9diteur conserve le retrait de la ligne actuelle, honore les crochets d\xE9finis par le langage et appelle des objets onEnterRules sp\xE9ciaux d\xE9finis par les langages.","L'\xE9diteur conserve le retrait de la ligne actuelle, honore les crochets d\xE9finis par le langage, appelle des objets onEnterRules sp\xE9ciaux d\xE9finis par les langages et honore les objets indentationRules d\xE9finis par les langages.","Contr\xF4le si l'\xE9diteur doit ajuster automatiquement le retrait quand les utilisateurs tapent, collent, d\xE9placent ou mettent en retrait des lignes.","Utilisez les configurations de langage pour d\xE9terminer quand entourer automatiquement les s\xE9lections.","Entourez avec des guillemets et non des crochets.","Entourez avec des crochets et non des guillemets.","Contr\xF4le si l'\xE9diteur doit automatiquement entourer les s\xE9lections quand l'utilisateur tape des guillemets ou des crochets.","\xC9mule le comportement des tabulations pour la s\xE9lection quand des espaces sont utilis\xE9s \xE0 des fins de mise en retrait. La s\xE9lection respecte les taquets de tabulation.","Contr\xF4le si l'\xE9diteur affiche CodeLens.","Contr\xF4le la famille de polices pour CodeLens.","Contr\xF4le la taille de police en pixels pour CodeLens. Quand la valeur est 0, 90\xA0% de '#editor.fontSize#' est utilis\xE9.","Contr\xF4le si l'\xE9diteur doit afficher les \xE9l\xE9ments d\xE9coratifs de couleurs inline et le s\xE9lecteur de couleurs.","Faire appara\xEEtre le s\xE9lecteur de couleurs au clic et au pointage de l\u2019\xE9l\xE9ment d\xE9coratif de couleurs","Faire appara\xEEtre le s\xE9lecteur de couleurs en survolant l\u2019\xE9l\xE9ment d\xE9coratif de couleurs","Faire appara\xEEtre le s\xE9lecteur de couleurs en cliquant sur l\u2019\xE9l\xE9ment d\xE9coratif de couleurs","Contr\xF4le la condition pour faire appara\xEEtre un s\xE9lecteur de couleurs \xE0 partir d\u2019un \xE9l\xE9ment d\xE9coratif de couleurs","Contr\xF4le le nombre maximal d\u2019\xE9l\xE9ments d\xE9coratifs de couleur qui peuvent \xEAtre rendus simultan\xE9ment dans un \xE9diteur.","Autoriser l'utilisation de la souris et des touches pour s\xE9lectionner des colonnes.","Contr\xF4le si la coloration syntaxique doit \xEAtre copi\xE9e dans le presse-papiers.","Contr\xF4ler le style d\u2019animation du curseur.","L\u2019animation de caret fluide est d\xE9sactiv\xE9e.","L\u2019animation de caret fluide est activ\xE9e uniquement lorsque l\u2019utilisateur d\xE9place le curseur avec un mouvement explicite.","L\u2019animation de caret fluide est toujours activ\xE9e.","Contr\xF4le si l'animation du point d'insertion doit \xEAtre activ\xE9e.","Contr\xF4le le style du curseur.","Contr\xF4le le nombre minimal de lignes de d\xE9but (0 minimum) et de fin (1 minimum) visibles autour du curseur. \xC9galement appel\xE9 \xAB\xA0scrollOff\xA0\xBB ou \xAB\xA0scrollOffset\xA0\xBB dans d'autres \xE9diteurs.","'cursorSurroundingLines' est appliqu\xE9 seulement s'il est d\xE9clench\xE9 via le clavier ou une API.","'cursorSurroundingLines' est toujours appliqu\xE9.","Contr\xF4le le moment o\xF9 #cursorSurroundingLines# doit \xEAtre appliqu\xE9.","D\xE9termine la largeur du curseur lorsque `#editor.cursorStyle#` est \xE0 `line`.","Contr\xF4le si l\u2019\xE9diteur autorise le d\xE9placement de s\xE9lections par glisser-d\xE9placer.","Utilisez une nouvelle m\xE9thode de rendu avec des SVG.","Utilisez une nouvelle m\xE9thode de rendu avec des caract\xE8res de police.","Utilisez la m\xE9thode de rendu stable.","Contr\xF4le si les espaces blancs sont rendus avec une nouvelle m\xE9thode exp\xE9rimentale.","Multiplicateur de vitesse de d\xE9filement quand vous appuyez sur 'Alt'.","Contr\xF4le si l'\xE9diteur a le pliage de code activ\xE9.","Utilisez une strat\xE9gie de pliage propre au langage, si disponible, sinon utilisez la strat\xE9gie bas\xE9e sur le retrait.","Utilisez la strat\xE9gie de pliage bas\xE9e sur le retrait.","Contr\xF4le la strat\xE9gie de calcul des plages de pliage.","Contr\xF4le si l'\xE9diteur doit mettre en \xE9vidence les plages pli\xE9es.","Contr\xF4le si l\u2019\xE9diteur r\xE9duit automatiquement les plages d\u2019importation.","Nombre maximal de r\xE9gions pliables. L\u2019augmentation de cette valeur peut r\xE9duire la r\xE9activit\xE9 de l\u2019\xE9diteur lorsque la source actuelle comprend un grand nombre de r\xE9gions pliables.","Contr\xF4le si le fait de cliquer sur le contenu vide apr\xE8s une ligne pli\xE9e d\xE9plie la ligne.","Contr\xF4le la famille de polices.","D\xE9termine si l\u2019\xE9diteur doit automatiquement mettre en forme le contenu coll\xE9. Un formateur doit \xEAtre disponible et \xEAtre capable de mettre en forme une plage dans un document.","Contr\xF4le si l\u2019\xE9diteur doit mettre automatiquement en forme la ligne apr\xE8s la saisie.","Contr\xF4le si l'\xE9diteur doit afficher la marge de glyphes verticale. La marge de glyphes sert principalement au d\xE9bogage.","Contr\xF4le si le curseur doit \xEAtre masqu\xE9 dans la r\xE8gle de la vue d\u2019ensemble.","Contr\xF4le l'espacement des lettres en pixels.","Contr\xF4le si la modification li\xE9e est activ\xE9e dans l\u2019\xE9diteur. En fonction du langage, les symboles associ\xE9s, par exemple les balises HTML, sont mis \xE0 jour durant le processus de modification.","Contr\xF4le si l\u2019\xE9diteur doit d\xE9tecter les liens et les rendre cliquables.","Mettez en surbrillance les crochets correspondants.","Un multiplicateur \xE0 utiliser sur les `deltaX` et `deltaY` des \xE9v\xE9nements de d\xE9filement de roulette de souris.","Faites un zoom sur la police de l\u2019\xE9diteur quand l\u2019utilisateur fait tourner la roulette de la souris tout en maintenant la touche \xAB\xA0Cmd\xA0\xBB enfonc\xE9e.","Faire un zoom sur la police de l'\xE9diteur quand l'utilisateur fait tourner la roulette de la souris tout en maintenant la touche 'Ctrl' enfonc\xE9e.","Fusionnez plusieurs curseurs quand ils se chevauchent.","Mappe vers 'Contr\xF4le' dans Windows et Linux, et vers 'Commande' dans macOS.","Mappe vers 'Alt' dans Windows et Linux, et vers 'Option' dans macOS.","Modificateur \xE0 utiliser pour ajouter plusieurs curseurs avec la souris. Les mouvements de la souris Atteindre la d\xE9finition et Ouvrir le lien s\u2019adaptent afin qu\u2019ils ne soient pas en conflit avec le [modificateur multicurseur](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modificateur).","Chaque curseur colle une seule ligne de texte.","Chaque curseur colle le texte en entier.","Contr\xF4le le collage quand le nombre de lignes du texte coll\xE9 correspond au nombre de curseurs.","Contr\xF4le le nombre maximal de curseurs pouvant se trouver dans un \xE9diteur actif \xE0 la fois.","Ne met pas en surbrillance les occurrences.","Met en surbrillance les occurrences uniquement dans le fichier actif.","Exp\xE9rimental : met en \xE9vidence les occurrences dans tous les fichiers ouverts valides.","Contr\xF4le si les occurrences doivent \xEAtre mises en \xE9vidence dans les fichiers ouverts.","Contr\xF4le si une bordure doit \xEAtre dessin\xE9e autour de la r\xE8gle de la vue d'ensemble.","Focus sur l'arborescence \xE0 l'ouverture de l'aper\xE7u","Placer le focus sur l'\xE9diteur \xE0 l'ouverture de l'aper\xE7u","Contr\xF4le s'il faut mettre le focus sur l'\xE9diteur inline ou sur l'arborescence dans le widget d'aper\xE7u.","Contr\xF4le si le geste de souris Acc\xE9der \xE0 la d\xE9finition ouvre toujours le widget d'aper\xE7u.","Contr\xF4le le d\xE9lai en millisecondes apr\xE8s lequel des suggestions rapides sont affich\xE9es.","Contr\xF4le si l'\xE9diteur renomme automatiquement selon le type.","D\xE9pr\xE9ci\xE9. Utilisez 'editor.linkedEditing' \xE0 la place.","Contr\xF4le si l\u2019\xE9diteur doit afficher les caract\xE8res de contr\xF4le.","Affichez le dernier num\xE9ro de ligne quand le fichier se termine par un saut de ligne.","Met en surbrillance la goutti\xE8re et la ligne actuelle.","Contr\xF4le la fa\xE7on dont l\u2019\xE9diteur doit afficher la mise en surbrillance de la ligne actuelle.","Contr\xF4le si l'\xE9diteur doit afficher la mise en surbrillance de la ligne actuelle uniquement quand il a le focus.","Affiche les espaces blancs \xE0 l'exception des espaces uniques entre les mots.","Afficher les espaces blancs uniquement sur le texte s\xE9lectionn\xE9.","Affiche uniquement les caract\xE8res correspondant aux espaces blancs de fin.","Contr\xF4le la fa\xE7on dont l\u2019\xE9diteur doit restituer les caract\xE8res espaces.","Contr\xF4le si les s\xE9lections doivent avoir des angles arrondis.","Contr\xF4le le nombre de caract\xE8res suppl\xE9mentaires, au-del\xE0 duquel l\u2019\xE9diteur d\xE9file horizontalement.","Contr\xF4le si l\u2019\xE9diteur d\xE9file au-del\xE0 de la derni\xE8re ligne.","Faites d\xE9filer uniquement le long de l'axe pr\xE9dominant quand le d\xE9filement est \xE0 la fois vertical et horizontal. Emp\xEAche la d\xE9rive horizontale en cas de d\xE9filement vertical sur un pav\xE9 tactile.","Contr\xF4le si le presse-papiers principal Linux doit \xEAtre pris en charge.","Contr\xF4le si l'\xE9diteur doit mettre en surbrillance les correspondances similaires \xE0 la s\xE9lection.","Affichez toujours les contr\xF4les de pliage.","N\u2019affichez jamais les contr\xF4les de pliage et r\xE9duisez la taille de la marge.","Affichez uniquement les contr\xF4les de pliage quand la souris est au-dessus de la reliure.","Contr\xF4le quand afficher les contr\xF4les de pliage sur la reliure.","Contr\xF4le la disparition du code inutile.","Contr\xF4le les variables d\xE9pr\xE9ci\xE9es barr\xE9es.","Afficher des suggestions d\u2019extraits au-dessus d\u2019autres suggestions.","Afficher des suggestions d\u2019extraits en-dessous d\u2019autres suggestions.","Afficher des suggestions d\u2019extraits avec d\u2019autres suggestions.","Ne pas afficher de suggestions d\u2019extrait de code.","Contr\xF4le si les extraits de code s'affichent en m\xEAme temps que d'autres suggestions, ainsi que leur mode de tri.","Contr\xF4le si l'\xE9diteur d\xE9file en utilisant une animation.","Contr\xF4le si l'indicateur d'accessibilit\xE9 doit \xEAtre fourni aux utilisateurs du lecteur d'\xE9cran lorsqu'une compl\xE9tion inline est affich\xE9e.","Taille de police pour le widget suggest. Lorsqu\u2019elle est d\xE9finie sur {0}, la valeur de {1} est utilis\xE9e.","Hauteur de ligne pour le widget suggest. Lorsqu\u2019elle est d\xE9finie sur {0}, la valeur de {1} est utilis\xE9e. La valeur minimale est 8.","Contr\xF4le si les suggestions devraient automatiquement s\u2019afficher lorsque vous tapez les caract\xE8res de d\xE9clencheur.","S\xE9lectionnez toujours la premi\xE8re suggestion.","S\xE9lectionnez les suggestions r\xE9centes sauf si une entr\xE9e ult\xE9rieure en a s\xE9lectionn\xE9 une, par ex., 'console.| -> console.log', car 'log' a \xE9t\xE9 effectu\xE9 r\xE9cemment.","S\xE9lectionnez des suggestions en fonction des pr\xE9fixes pr\xE9c\xE9dents qui ont compl\xE9t\xE9 ces suggestions, par ex., 'co -> console' et 'con -> const'.","Contr\xF4le comment les suggestions sont pr\xE9-s\xE9lectionn\xE9s lors de l\u2019affichage de la liste de suggestion.","La compl\xE9tion par tabulation ins\xE9rera la meilleure suggestion lorsque vous appuyez sur tab.","D\xE9sactiver les compl\xE9tions par tabulation.","Compl\xE9ter les extraits de code par tabulation lorsque leur pr\xE9fixe correspond. Fonctionne mieux quand les 'quickSuggestions' ne sont pas activ\xE9es.","Active les compl\xE9tions par tabulation","Les marques de fin de ligne inhabituelles sont automatiquement supprim\xE9es.","Les marques de fin de ligne inhabituelles sont ignor\xE9es.","Les marques de fin de ligne inhabituelles demandent \xE0 \xEAtre supprim\xE9es.","Supprimez les marques de fin de ligne inhabituelles susceptibles de causer des probl\xE8mes.","L'insertion et la suppression des espaces blancs suit les taquets de tabulation.","Utilisez la r\xE8gle de saut de ligne par d\xE9faut.","Les sauts de mots ne doivent pas \xEAtre utilis\xE9s pour le texte chinois/japonais/cor\xE9en (CJC). Le comportement du texte non CJC est identique \xE0 celui du texte normal.","Contr\xF4le les r\xE8gles de s\xE9parateur de mots utilis\xE9es pour le texte chinois/japonais/cor\xE9en (CJC).","Caract\xE8res utilis\xE9s comme s\xE9parateurs de mots durant la navigation ou les op\xE9rations bas\xE9es sur les mots","Le retour automatique \xE0 la ligne n'est jamais effectu\xE9.","Le retour automatique \xE0 la ligne s'effectue en fonction de la largeur de la fen\xEAtre d'affichage.","Les lignes seront termin\xE9es \xE0 `#editor.wordWrapColumn#`.","Les lignes seront termin\xE9es au minimum du viewport et `#editor.wordWrapColumn#`.","Contr\xF4le comment les lignes doivent \xEAtre limit\xE9es.","Contr\xF4le la colonne de terminaison de l\u2019\xE9diteur lorsque `#editor.wordWrap#` est \xE0 `wordWrapColumn` ou `bounded`.","Contr\xF4le si les d\xE9corations de couleur inline doivent \xEAtre affich\xE9es \xE0 l\u2019aide du fournisseur de couleurs de document par d\xE9faut","Contr\xF4le si l\u2019\xE9diteur re\xE7oit des onglets ou les reporte au banc d\u2019essai pour la navigation."],"vs/editor/common/core/editorColorRegistry":["Couleur d'arri\xE8re-plan de la mise en surbrillance de la ligne \xE0 la position du curseur.","Couleur d'arri\xE8re-plan de la bordure autour de la ligne \xE0 la position du curseur.","Couleur d'arri\xE8re-plan des plages mises en surbrillance, comme par les fonctionnalit\xE9s de recherche et Quick Open. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d'arri\xE8re-plan de la bordure autour des plages mises en surbrillance.","Couleur d'arri\xE8re-plan du symbole mis en surbrillance, comme le symbole Atteindre la d\xE9finition ou Suivant/Pr\xE9c\xE9dent. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les d\xE9corations sous-jacentes.","Couleur d'arri\xE8re-plan de la bordure autour des symboles mis en surbrillance.","Couleur du curseur de l'\xE9diteur.","La couleur de fond du curseur de l'\xE9diteur. Permet de personnaliser la couleur d'un caract\xE8re survol\xE9 par un curseur de bloc.","Couleur des espaces blancs dans l'\xE9diteur.","Couleur des num\xE9ros de ligne de l'\xE9diteur.","Couleur des rep\xE8res de retrait de l'\xE9diteur.","'editorIndentGuide.background' est d\xE9conseill\xE9. Utilisez 'editorIndentGuide.background1' \xE0 la place.","Couleur des guides d'indentation de l'\xE9diteur actif","'editorIndentGuide.activeBackground' est d\xE9conseill\xE9. Utilisez 'editorIndentGuide.activeBackground1' \xE0 la place.","Couleur des rep\xE8res de retrait de l'\xE9diteur (1).","Couleur des rep\xE8res de retrait de l'\xE9diteur (2).","Couleur des rep\xE8res de retrait de l'\xE9diteur (3).","Couleur des rep\xE8res de retrait de l'\xE9diteur (4).","Couleur des rep\xE8res de retrait de l'\xE9diteur (5).","Couleur des rep\xE8res de retrait de l'\xE9diteur (6).","Couleur des repaires de retrait de l'\xE9diteur actifs (1).","Couleur des repaires de retrait de l'\xE9diteur actifs (2).","Couleur des repaires de retrait de l'\xE9diteur actifs (3).","Couleur des repaires de retrait de l'\xE9diteur actifs (4).","Couleur des repaires de retrait de l'\xE9diteur actifs (5).","Couleur des repaires de retrait de l'\xE9diteur actifs (6).","Couleur des num\xE9ros de lignes actives de l'\xE9diteur","L\u2019ID est d\xE9pr\xE9ci\xE9. Utilisez \xE0 la place 'editorLineNumber.activeForeground'.","Couleur des num\xE9ros de lignes actives de l'\xE9diteur","Couleur de la ligne finale de l\u2019\xE9diteur lorsque editor.renderFinalNewline est d\xE9fini sur gris\xE9.","Couleur des r\xE8gles de l'\xE9diteur","Couleur pour les indicateurs CodeLens","Couleur d'arri\xE8re-plan pour les accolades associ\xE9es","Couleur pour le contour des accolades associ\xE9es","Couleur de la bordure de la r\xE8gle d'aper\xE7u.","Couleur d\u2019arri\xE8re-plan de la r\xE8gle de vue d\u2019ensemble de l\u2019\xE9diteur.","Couleur de fond pour la bordure de l'\xE9diteur. La bordure contient les marges pour les symboles et les num\xE9ros de ligne.","Couleur de bordure du code source inutile (non utilis\xE9) dans l'\xE9diteur.","Opacit\xE9 du code source inutile (non utilis\xE9) dans l'\xE9diteur. Par exemple, '#000000c0' affiche le code avec une opacit\xE9 de 75\xA0%. Pour les th\xE8mes \xE0 fort contraste, utilisez la couleur de th\xE8me 'editorUnnecessaryCode.border' pour souligner le code inutile au lieu d'utiliser la transparence.","Couleur de bordure du texte fant\xF4me dans l\u2019\xE9diteur.","Couleur de premier plan du texte fant\xF4me dans l\u2019\xE9diteur.","Couleur de l\u2019arri\xE8re-plan du texte fant\xF4me dans l\u2019\xE9diteur","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour la mise en surbrillance des plages. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur du marqueur de la r\xE8gle d'aper\xE7u pour les erreurs.","Couleur du marqueur de la r\xE8gle d'aper\xE7u pour les avertissements.","Couleur du marqueur de la r\xE8gle d'aper\xE7u pour les informations.","Couleur de premier plan des crochets (1). N\xE9cessite l\u2019activation de la coloration de la paire de crochets.","Couleur de premier plan des crochets (2). N\xE9cessite l\u2019activation de la coloration de la paire de crochets.","Couleur de premier plan des crochets (3). N\xE9cessite l\u2019activation de la coloration de la paire de crochets.","Couleur de premier plan des crochets (4). N\xE9cessite l\u2019activation de la coloration de la paire de crochets.","Couleur de premier plan des crochets (5). N\xE9cessite l\u2019activation de la coloration de la paire de crochets.","Couleur de premier plan des crochets (6). N\xE9cessite l\u2019activation de la coloration de la paire de crochets.","Couleur de premier plan des parenth\xE8ses inattendues","Couleur d\u2019arri\xE8re-plan des rep\xE8res de paire de crochets inactifs (1). N\xE9cessite l\u2019activation des rep\xE8res de paire de crochets.","Couleur d\u2019arri\xE8re-plan des rep\xE8res de paire de crochets inactifs (2). N\xE9cessite l\u2019activation des rep\xE8res de paire de crochets.","Couleur d\u2019arri\xE8re-plan des rep\xE8res de paire de crochets inactifs (3). N\xE9cessite l\u2019activation des rep\xE8res de paire de crochets.","Couleur d\u2019arri\xE8re-plan des rep\xE8res de paire de crochets inactifs (4). N\xE9cessite l\u2019activation des rep\xE8res de paire de crochets.","Couleur d\u2019arri\xE8re-plan des rep\xE8res de paire de crochets inactifs (5). N\xE9cessite l\u2019activation des rep\xE8res de paire de crochets.","Couleur d\u2019arri\xE8re-plan des rep\xE8res de paire de crochets inactifs (6). N\xE9cessite l\u2019activation des rep\xE8res de paire de crochets.","Couleur d\u2019arri\xE8re-plan des rep\xE8res de paire de crochets actifs (1). N\xE9cessite l\u2019activation des rep\xE8res de paire de crochets.","Couleur d\u2019arri\xE8re-plan des rep\xE8res de paire de crochets actifs (2). N\xE9cessite l\u2019activation des rep\xE8res de paire de crochets.","Couleur d\u2019arri\xE8re-plan des rep\xE8res de paire de crochets actifs (3). N\xE9cessite l\u2019activation des rep\xE8res de paire de crochets.","Couleur d\u2019arri\xE8re-plan des rep\xE8res de paire de crochets actifs (4). N\xE9cessite l\u2019activation des rep\xE8res de paire de crochets.","Couleur d\u2019arri\xE8re-plan des rep\xE8res de paire de crochets actifs (5). N\xE9cessite l\u2019activation des rep\xE8res de paire de crochets.","Couleur d\u2019arri\xE8re-plan des rep\xE8res de paire de crochets actifs (6). N\xE9cessite l\u2019activation des rep\xE8res de paire de crochets.","Couleur de bordure utilis\xE9e pour mettre en surbrillance les caract\xE8res Unicode","Couleur de fond utilis\xE9e pour mettre en \xE9vidence les caract\xE8res unicode"],"vs/editor/common/editorContextKeys":["Indique si le texte de l'\xE9diteur a le focus (le curseur clignote)","Indique si l'\xE9diteur ou un widget de l'\xE9diteur a le focus (par exemple, le focus se trouve sur le widget de recherche)","Indique si un \xE9diteur ou une entr\xE9e de texte mis en forme a le focus (le curseur clignote)","Indique si l\u2019\xE9diteur est en lecture seule","Indique si le contexte est celui d'un \xE9diteur de diff\xE9rences","Indique si le contexte est celui d\u2019un \xE9diteur de diff\xE9rences int\xE9gr\xE9","Indique si le contexte est celui d'un \xE9diteur de diff\xE9rences multiples","Indique si tous les fichiers de l\u2019\xE9diteur de diff\xE9rences sont r\xE9duits","Indique si l\u2019\xE9diteur de diff\xE9rences a des modifications","Indique si un bloc de code d\xE9plac\xE9 est s\xE9lectionn\xE9 pour \xEAtre compar\xE9","Indique si la visionneuse diff accessible est visible","Indique si le point d'arr\xEAt Render Side by Side ou inline de l'\xE9diteur de diff\xE9rences est atteint","Indique si 'editor.columnSelection' est activ\xE9","Indique si du texte est s\xE9lectionn\xE9 dans l'\xE9diteur","Indique si l'\xE9diteur a plusieurs s\xE9lections","Indique si la touche Tab permet de d\xE9placer le focus hors de l'\xE9diteur","Indique si le pointage de l'\xE9diteur est visible","Indique si le pointage de l\u2019\xE9diteur est cibl\xE9","Indique si le d\xE9filement du pense-b\xEAte a le focus","Indique si le d\xE9filement du pense-b\xEAte est visible","Indique si le s\xE9lecteur de couleurs autonome est visible","Indique si le s\xE9lecteur de couleurs autonome est prioritaire","Indique si l'\xE9diteur fait partie d'un \xE9diteur plus important (par exemple Notebooks)","Identificateur de langage de l'\xE9diteur","Indique si l'\xE9diteur a un fournisseur d'\xE9l\xE9ments de compl\xE9tion","Indique si l'\xE9diteur a un fournisseur d'actions de code","Indique si l'\xE9diteur a un fournisseur d'informations CodeLens","Indique si l'\xE9diteur a un fournisseur de d\xE9finitions","Indique si l'\xE9diteur a un fournisseur de d\xE9clarations","Indique si l'\xE9diteur a un fournisseur d'impl\xE9mentation","Indique si l'\xE9diteur a un fournisseur de d\xE9finitions de type","Indique si l'\xE9diteur a un fournisseur de pointage","Indique si l'\xE9diteur a un fournisseur de mise en surbrillance pour les documents","Indique si l'\xE9diteur a un fournisseur de symboles pour les documents","Indique si l'\xE9diteur a un fournisseur de r\xE9f\xE9rence","Indique si l'\xE9diteur a un fournisseur de renommage","Indique si l'\xE9diteur a un fournisseur d'aide sur les signatures","Indique si l'\xE9diteur a un fournisseur d'indicateurs inline","Indique si l'\xE9diteur a un fournisseur de mise en forme pour les documents","Indique si l'\xE9diteur a un fournisseur de mise en forme de s\xE9lection pour les documents","Indique si l'\xE9diteur a plusieurs fournisseurs de mise en forme pour les documents","Indique si l'\xE9diteur a plusieurs fournisseurs de mise en forme de s\xE9lection pour les documents"],"vs/editor/common/languages":["tableau","bool\xE9en","classe","constante","constructeur","\xE9num\xE9ration","membre d'\xE9num\xE9ration","\xE9v\xE9nement","champ","fichier","fonction","interface","cl\xE9","m\xE9thode","module","espace de noms","NULL","nombre","objet","op\xE9rateur","package","propri\xE9t\xE9","cha\xEEne","struct","param\xE8tre de type","variable","{0} ({1})"],"vs/editor/common/languages/modesRegistry":["Texte brut"],"vs/editor/common/model/editStack":["Frappe en cours"],"vs/editor/common/standaloneStrings":["D\xE9veloppeur\xA0: Inspecter les jetons","Acc\xE9der \xE0 la ligne/colonne...","Afficher tous les fournisseurs d'acc\xE8s rapide","Palette de commandes","Commandes d'affichage et d'ex\xE9cution","Acc\xE9der au symbole...","Acc\xE9der au symbole par cat\xE9gorie...","Contenu de l'\xE9diteur","Appuyez sur Alt+F1 pour voir les options d'accessibilit\xE9.","Activer/d\xE9sactiver le th\xE8me \xE0 contraste \xE9lev\xE9","{0} modifications dans {1} fichiers"],"vs/editor/common/viewLayout/viewLineRenderer":["Afficher plus\xA0({0})","{0}\xA0caract\xE8res"],"vs/editor/contrib/anchorSelect/browser/anchorSelect":["Ancre de s\xE9lection","Ancre d\xE9finie sur {0}:{1}","D\xE9finir l'ancre de s\xE9lection","Atteindre l'ancre de s\xE9lection","S\xE9lectionner de l'ancre au curseur","Annuler l'ancre de s\xE9lection"],"vs/editor/contrib/bracketMatching/browser/bracketMatching":["Couleur du marqueur de la r\xE8gle d'aper\xE7u pour rechercher des parenth\xE8ses.","Atteindre le crochet","S\xE9lectionner jusqu'au crochet","Supprimer les crochets","Acc\xE9der au &&crochet","S\xE9lectionner le texte \xE0 l\u2019int\xE9rieur et inclure les crochets ou accolades"],"vs/editor/contrib/caretOperations/browser/caretOperations":["D\xE9placer le texte s\xE9lectionn\xE9 \xE0 gauche","D\xE9placer le texte s\xE9lectionn\xE9 \xE0 droite"],"vs/editor/contrib/caretOperations/browser/transpose":["Transposer les lettres"],"vs/editor/contrib/clipboard/browser/clipboard":["Co&&uper","Couper","Couper","Couper","&&Copier","Copier","Copier","Copier","Copier en tant que","Copier en tant que","Partager","Partager","Partager","Co&&ller","Coller","Coller","Coller","Copier avec la coloration syntaxique"],"vs/editor/contrib/codeAction/browser/codeAction":["Une erreur inconnue s'est produite \xE0 l'application de l'action du code"],"vs/editor/contrib/codeAction/browser/codeActionCommands":["Type d'action de code \xE0 ex\xE9cuter.","Contr\xF4le quand les actions retourn\xE9es sont appliqu\xE9es.","Appliquez toujours la premi\xE8re action de code retourn\xE9e.","Appliquez la premi\xE8re action de code retourn\xE9e si elle est la seule.","N'appliquez pas les actions de code retourn\xE9es.","Contr\xF4le si seules les actions de code par d\xE9faut doivent \xEAtre retourn\xE9es.","Correction rapide...","Aucune action de code disponible","Aucune action de code pr\xE9f\xE9r\xE9e n'est disponible pour '{0}'","Aucune action de code disponible pour '{0}'","Aucune action de code par d\xE9faut disponible","Aucune action de code disponible","Remanier...","Aucune refactorisation par d\xE9faut disponible pour '{0}'","Aucune refactorisation disponible pour '{0}'","Aucune refactorisation par d\xE9faut disponible","Aucune refactorisation disponible","Action de la source","Aucune action source par d\xE9faut disponible pour '{0}'","Aucune action source disponible pour '{0}'","Aucune action source par d\xE9faut disponible","Aucune action n'est disponible","Organiser les importations","Aucune action organiser les imports disponible","Tout corriger","Aucune action Tout corriger disponible","Corriger automatiquement...","Aucun correctif automatique disponible"],"vs/editor/contrib/codeAction/browser/codeActionContributions":["Activez/d\xE9sactivez l\u2019affichage des en-t\xEAtes de groupe dans le menu d\u2019action du code.","Activer/d\xE9sactiver l'affichage du correctif rapide le plus proche dans une ligne lorsque vous n'\xEAtes pas actuellement en cours de diagnostic."],"vs/editor/contrib/codeAction/browser/codeActionController":["Contexte\xA0: {0} \xE0 la ligne {1} et \xE0 la colonne {2}.","Masquer d\xE9sactiv\xE9","Afficher les \xE9l\xE9ments d\xE9sactiv\xE9s"],"vs/editor/contrib/codeAction/browser/codeActionMenu":["Plus d\u2019actions...","Correctif rapide","Extraire","Inline","R\xE9\xE9crire","D\xE9placer","Entourer de","Action source"],"vs/editor/contrib/codeAction/browser/lightBulbWidget":["Ex\xE9cuter\xA0: {0}","Afficher les actions de code. Correctif rapide disponible par d\xE9faut ({0})","Afficher les actions de code ({0})","Afficher les actions de code"],"vs/editor/contrib/codelens/browser/codelensController":["Afficher les commandes Code Lens de la ligne actuelle","S\xE9lectionner une commande"],"vs/editor/contrib/colorPicker/browser/colorPickerWidget":["Cliquez pour activer/d\xE9sactiver les options de couleur (rgb/hsl/hexad\xE9cimal).","Ic\xF4ne pour fermer le s\xE9lecteur de couleurs"],"vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions":["Afficher ou mettre le focus sur le s\xE9lecteur de couleurs autonome","&&Afficher ou mettre le focus sur le s\xE9lecteur de couleurs autonome","Masquer le s\xE9lecteur de couleurs","Ins\xE9rer une couleur avec un s\xE9lecteur de couleurs autonome"],"vs/editor/contrib/comment/browser/comment":["Activer/d\xE9sactiver le commentaire de ligne","Afficher/masquer le commen&&taire de ligne","Ajouter le commentaire de ligne","Supprimer le commentaire de ligne","Activer/d\xE9sactiver le commentaire de bloc","Afficher/masquer le commentaire de &&bloc"],"vs/editor/contrib/contextmenu/browser/contextmenu":["Minimap","Afficher les caract\xE8res","Taille verticale","Proportionnel","Remplissage","Ajuster","Curseur","Pointer la souris","Toujours","Afficher le menu contextuel de l'\xE9diteur"],"vs/editor/contrib/cursorUndo/browser/cursorUndo":["Annulation du curseur","Restauration du curseur"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution":["Coller en tant que...","ID de la modification de collage \xE0 appliquer. S\u2019il n\u2019est pas fourni, l\u2019\xE9diteur affiche un s\xE9lecteur.","Coller au format texte"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteController":["Si le widget de collage est affich\xE9","Afficher les options de collage...","Nous n\u2019avons trouv\xE9 aucune modification de collage n\u2019a \xE9t\xE9 trouv\xE9e pour \xAB\xA0{0}\xA0\xBB","Ex\xE9cution des gestionnaires de collage. Cliquez pour annuler","S\xE9lectionner l\u2019action Coller","Ex\xE9cution des gestionnaires de collage"],"vs/editor/contrib/dropOrPasteInto/browser/defaultProviders":["Int\xE9gr\xE9","Ins\xE9rer du texte brut","Ins\xE9rer des URI","Ins\xE9rer un URI","Ins\xE9rer des chemins d\u2019acc\xE8s","Ins\xE9rer un chemin d\u2019acc\xE8s","Ins\xE9rer des chemins d\u2019acc\xE8s relatifs","Ins\xE9rer un chemin d\u2019acc\xE8s relatif","Ins\xE9rer du code HTML"],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution":["Configure le fournisseur de d\xE9p\xF4t par d\xE9faut \xE0 utiliser pour le contenu d\u2019un type MIME donn\xE9."],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController":["Indique si le widget de suppression s\u2019affiche","Afficher les options de suppression...","Ex\xE9cution des gestionnaires de d\xE9p\xF4t. Cliquez pour annuler"],"vs/editor/contrib/editorState/browser/keybindingCancellation":["Indique si l'\xE9diteur ex\xE9cute une op\xE9ration annulable, par exemple 'Avoir un aper\xE7u des r\xE9f\xE9rences'"],"vs/editor/contrib/find/browser/findController":["Le fichier est trop volumineux pour effectuer une op\xE9ration Tout remplacer.","Rechercher","&&Rechercher","Trouver avec des arguments","Rechercher dans la s\xE9lection","Rechercher suivant","Rechercher pr\xE9c\xE9dent","Acc\xE9der \xE0 la correspondance...","Aucune correspondance. Essayez de rechercher autre chose.","Tapez un nombre pour acc\xE9der \xE0 une correspondance sp\xE9cifique (entre 1 et {0})","Veuillez entrer un nombre compris entre 1 et {0}","Veuillez entrer un nombre compris entre 1 et {0}","S\xE9lection suivante","S\xE9lection pr\xE9c\xE9dente","Remplacer","&&Remplacer"],"vs/editor/contrib/find/browser/findWidget":["Ic\xF4ne de l'option Rechercher dans la s\xE9lection dans le widget de recherche de l'\xE9diteur.","Ic\xF4ne permettant d'indiquer que le widget de recherche de l'\xE9diteur est r\xE9duit.","Ic\xF4ne permettant d'indiquer que le widget de recherche de l'\xE9diteur est d\xE9velopp\xE9.","Ic\xF4ne de l'option Remplacer dans le widget de recherche de l'\xE9diteur.","Ic\xF4ne de l'option Tout remplacer dans le widget de recherche de l'\xE9diteur.","Ic\xF4ne de l'option Rechercher pr\xE9c\xE9dent dans le widget de recherche de l'\xE9diteur.","Ic\xF4ne de l'option Rechercher suivant dans le widget de recherche de l'\xE9diteur.","Rechercher/remplacer","Rechercher","Rechercher","Correspondance pr\xE9c\xE9dente","Correspondance suivante","Rechercher dans la s\xE9lection","Fermer","Remplacer","Remplacer","Remplacer","Tout remplacer","Activer/d\xE9sactiver le remplacement","Seuls les {0} premiers r\xE9sultats sont mis en \xE9vidence, mais toutes les op\xE9rations de recherche fonctionnent sur l\u2019ensemble du texte.","{0} sur {1}","Aucun r\xE9sultat","{0} trouv\xE9(s)","{0} trouv\xE9 pour '{1}'","{0} trouv\xE9 pour '{1}', sur {2}","{0} trouv\xE9 pour '{1}'","La combinaison Ctrl+Entr\xE9e permet d\xE9sormais d'ajouter un saut de ligne au lieu de tout remplacer. Vous pouvez modifier le raccourci clavier de editor.action.replaceAll pour red\xE9finir le comportement."],"vs/editor/contrib/folding/browser/folding":["D\xE9plier","D\xE9plier de mani\xE8re r\xE9cursive","Plier","Activer/d\xE9sactiver le pliage","Plier de mani\xE8re r\xE9cursive","Replier tous les commentaires de bloc","Replier toutes les r\xE9gions","D\xE9plier toutes les r\xE9gions","Plier tout, sauf les \xE9l\xE9ments s\xE9lectionn\xE9s","D\xE9plier tout, sauf les \xE9l\xE9ments s\xE9lectionn\xE9s","Plier tout","D\xE9plier tout","Atteindre le pli parent","Acc\xE9der \xE0 la plage de pliage pr\xE9c\xE9dente","Acc\xE9der \xE0 la plage de pliage suivante","Cr\xE9er une plage de pliage \xE0 partir de la s\xE9lection","Supprimer les plages de pliage manuelles","Niveau de pliage {0}"],"vs/editor/contrib/folding/browser/foldingDecorations":["Couleur d'arri\xE8re-plan des gammes pli\xE9es. La couleur ne doit pas \xEAtre opaque pour ne pas cacher les d\xE9corations sous-jacentes.","Couleur du contr\xF4le de pliage dans la marge de l'\xE9diteur.","Ic\xF4ne des plages d\xE9velopp\xE9es dans la marge de glyphes de l'\xE9diteur.","Ic\xF4ne des plages r\xE9duites dans la marge de glyphes de l'\xE9diteur.","Ic\xF4ne pour les plages r\xE9duites manuellement dans la marge de glyphe de l\u2019\xE9diteur.","Ic\xF4ne pour les plages d\xE9velopp\xE9es manuellement dans la marge de glyphe de l\u2019\xE9diteur.","Cliquez pour d\xE9velopper la plage.","Cliquez pour r\xE9duire la plage."],"vs/editor/contrib/fontZoom/browser/fontZoom":["Augmenter la taille de police de l\u2019\xE9diteur","Diminuer la taille de police de l\u2019\xE9diteur","R\xE9initialiser la taille de police de l\u2019\xE9diteur"],"vs/editor/contrib/format/browser/formatActions":["Mettre le document en forme","Mettre la s\xE9lection en forme"],"vs/editor/contrib/gotoError/browser/gotoError":["Aller au probl\xE8me suivant (Erreur, Avertissement, Info)","Ic\xF4ne du prochain marqueur goto.","Aller au probl\xE8me pr\xE9c\xE9dent (Erreur, Avertissement, Info)","Ic\xF4ne du pr\xE9c\xE9dent marqueur goto.","Aller au probl\xE8me suivant dans Fichiers (Erreur, Avertissement, Info)","&&Probl\xE8me suivant","Aller au probl\xE8me pr\xE9c\xE9dent dans Fichiers (Erreur, Avertissement, Info)","&&Probl\xE8me pr\xE9c\xE9dent"],"vs/editor/contrib/gotoError/browser/gotoErrorWidget":["Erreur","Avertissement","Info","Conseil","{0} \xE0 {1}. ","{0}\xA0probl\xE8mes sur\xA0{1}","{0}\xA0probl\xE8me(s) sur {1}","Couleur d'erreur du widget de navigation dans les marqueurs de l'\xE9diteur.","Arri\xE8re-plan du titre d\u2019erreur du widget de navigation dans les marqueurs de l\u2019\xE9diteur.","Couleur d'avertissement du widget de navigation dans les marqueurs de l'\xE9diteur.","Arri\xE8re-plan du titre d\u2019erreur du widget de navigation dans les marqueurs de l\u2019\xE9diteur.","Couleur d\u2019information du widget de navigation du marqueur de l'\xE9diteur.","Arri\xE8re-plan du titre des informations du widget de navigation dans les marqueurs de l\u2019\xE9diteur.","Arri\xE8re-plan du widget de navigation dans les marqueurs de l'\xE9diteur."],"vs/editor/contrib/gotoSymbol/browser/goToCommands":["Aper\xE7u","D\xE9finitions","D\xE9finition introuvable pour '{0}'","D\xE9finition introuvable","Atteindre la d\xE9finition","Atteindre la &&d\xE9finition","Ouvrir la d\xE9finition sur le c\xF4t\xE9","Aper\xE7u de la d\xE9finition","D\xE9clarations","Aucune d\xE9claration pour '{0}'","Aucune d\xE9claration","Acc\xE9der \xE0 la d\xE9claration","Atteindre la &&d\xE9claration","Aucune d\xE9claration pour '{0}'","Aucune d\xE9claration","Aper\xE7u de la d\xE9claration","D\xE9finitions de type","D\xE9finition de type introuvable pour '{0}'","D\xE9finition de type introuvable","Atteindre la d\xE9finition du type","Acc\xE9der \xE0 la d\xE9finition de &&type","Aper\xE7u de la d\xE9finition du type","Impl\xE9mentations","Impl\xE9mentation introuvable pour '{0}'","Impl\xE9mentation introuvable","Atteindre les impl\xE9mentations","Atteindre les &&impl\xE9mentations","Aper\xE7u des impl\xE9mentations","Aucune r\xE9f\xE9rence pour '{0}'","Aucune r\xE9f\xE9rence","Atteindre les r\xE9f\xE9rences","Atteindre les &&r\xE9f\xE9rences","R\xE9f\xE9rences","Aper\xE7u des r\xE9f\xE9rences","R\xE9f\xE9rences","Atteindre un symbole","Emplacements","Aucun r\xE9sultat pour \xAB\xA0{0}\xA0\xBB","R\xE9f\xE9rences"],"vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition":["Cliquez pour afficher {0}\xA0d\xE9finitions."],"vs/editor/contrib/gotoSymbol/browser/peek/referencesController":["Indique si l'aper\xE7u des r\xE9f\xE9rences est visible, par exemple via 'Avoir un aper\xE7u des r\xE9f\xE9rences' ou 'Faire un peek de la d\xE9finition'","Chargement en cours...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesTree":["{0} r\xE9f\xE9rences","{0} r\xE9f\xE9rence","R\xE9f\xE9rences"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget":["aper\xE7u non disponible","Aucun r\xE9sultat","R\xE9f\xE9rences"],"vs/editor/contrib/gotoSymbol/browser/referencesModel":["dans {0} \xE0 la ligne {1} \xE0 la colonne {2}","{0}dans {1} \xE0 la ligne {2} \xE0 la colonne {3}","1 symbole dans {0}, chemin complet {1}","{0} symboles dans {1}, chemin complet {2}","R\xE9sultats introuvables","1\xA0symbole dans {0}","{0}\xA0symboles dans {1}","{0}\xA0symboles dans {1} fichiers"],"vs/editor/contrib/gotoSymbol/browser/symbolNavigation":["Indique s'il existe des emplacements de symboles que vous pouvez parcourir \xE0 l'aide du clavier uniquement.","Symbole {0} sur {1}, {2} pour le suivant","Symbole {0} sur {1}"],"vs/editor/contrib/hover/browser/hover":["Afficher ou focus sur pointer","Le pointage ne prend pas automatiquement le focus.","Le pointage prend le focus uniquement s\u2019il est d\xE9j\xE0 visible.","Le pointage prend automatiquement le focus lorsqu\u2019il appara\xEEt.","Afficher le pointeur de l'aper\xE7u de d\xE9finition","Faire d\xE9filer le pointage vers le haut","Faire d\xE9filer le pointage vers le bas","Faire d\xE9filer vers la gauche au pointage","Faire d\xE9filer le pointage vers la droite","Pointer vers le haut de la page","Pointer vers le bas de la page","Atteindre le pointage sup\xE9rieur","Pointer vers le bas"],"vs/editor/contrib/hover/browser/markdownHoverParticipant":["Chargement en cours...","Rendu suspendu pour une longue ligne pour des raisons de performances. Cela peut \xEAtre configur\xE9 via 'editor.stopRenderingLineAfter'.","La tokenisation des lignes longues est ignor\xE9e pour des raisons de performances. Cela peut \xEAtre configur\xE9e via 'editor.maxTokenizationLineLength'."],"vs/editor/contrib/hover/browser/markerHoverParticipant":["Voir le probl\xE8me","Aucune solution disponible dans l'imm\xE9diat","Recherche de correctifs rapides...","Aucune solution disponible dans l'imm\xE9diat","Correction rapide..."],"vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace":["Remplacer par la valeur pr\xE9c\xE9dente","Remplacer par la valeur suivante"],"vs/editor/contrib/indentation/browser/indentation":["Convertir les retraits en espaces","Convertir les retraits en tabulations","Taille des tabulations configur\xE9e","Taille d\u2019onglet par d\xE9faut","Taille actuelle de l\u2019onglet","S\xE9lectionner la taille des tabulations pour le fichier actuel","Mettre en retrait avec des tabulations","Mettre en retrait avec des espaces","Modifier la taille d\u2019affichage de l\u2019onglet","D\xE9tecter la mise en retrait \xE0 partir du contenu","Remettre en retrait les lignes","R\xE9indenter les lignes s\xE9lectionn\xE9es"],"vs/editor/contrib/inlayHints/browser/inlayHintsHover":["Double-cliquer pour ins\xE9rer","cmd + clic","ctrl + clic","option + clic","alt + clic","Acc\xE9dez \xE0 D\xE9finition ({0}), cliquez avec le bouton droit pour en savoir plus.","Acc\xE9der \xE0 D\xE9finition ({0})","Ex\xE9cuter la commande"],"vs/editor/contrib/inlineCompletions/browser/commands":["Afficher la suggestion en ligne suivante","Afficher la suggestion en ligne pr\xE9c\xE9dente","D\xE9clencher la suggestion en ligne","Accepter le mot suivant de la suggestion inline","Accepter le mot","Accepter la ligne suivante d\u2019une suggestion en ligne","Accepter la ligne","Accepter la suggestion inline","Accepter","Masquer la suggestion inlined","Toujours afficher la barre d\u2019outils"],"vs/editor/contrib/inlineCompletions/browser/hoverParticipant":["Suggestion :"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys":["Indique si une suggestion en ligne est visible","Indique si la suggestion en ligne commence par un espace blanc","Indique si la suggestion incluse commence par un espace blanc inf\xE9rieur \xE0 ce qui serait ins\xE9r\xE9 par l\u2019onglet.","Indique si les suggestions doivent \xEAtre supprim\xE9es pour la suggestion actuelle"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController":["Inspecter ceci dans l\u2019affichage accessible ({0})"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget":["Ic\xF4ne d'affichage du prochain conseil de param\xE8tre.","Ic\xF4ne d'affichage du pr\xE9c\xE9dent conseil de param\xE8tre.","{0} ({1})","Pr\xE9c\xE9dent","Suivant"],"vs/editor/contrib/lineSelection/browser/lineSelection":["D\xE9velopper la s\xE9lection de ligne"],"vs/editor/contrib/linesOperations/browser/linesOperations":["Copier la ligne en haut","&&Copier la ligne en haut","Copier la ligne en bas","Co&&pier la ligne en bas","Dupliquer la s\xE9lection","&&Dupliquer la s\xE9lection","D\xE9placer la ligne vers le haut","D\xE9placer la ligne &&vers le haut","D\xE9placer la ligne vers le bas","D\xE9placer la &&ligne vers le bas","Trier les lignes dans l'ordre croissant","Trier les lignes dans l'ordre d\xE9croissant","Supprimer les lignes dupliqu\xE9es","D\xE9couper l'espace blanc de fin","Supprimer la ligne","Mettre en retrait la ligne","Ajouter un retrait n\xE9gatif \xE0 la ligne","Ins\xE9rer une ligne au-dessus","Ins\xE9rer une ligne sous","Supprimer tout ce qui est \xE0 gauche","Supprimer tout ce qui est \xE0 droite","Joindre les lignes","Transposer des caract\xE8res autour du curseur","Transformer en majuscule","Transformer en minuscule",'Appliquer la casse "1re lettre des mots en majuscule"',"Transformer en snake case","Transformer en casse mixte","Transformer en kebab case"],"vs/editor/contrib/linkedEditing/browser/linkedEditing":["D\xE9marrer la modification li\xE9e","Couleur d'arri\xE8re-plan quand l'\xE9diteur renomme automatiquement le type."],"vs/editor/contrib/links/browser/links":["\xC9chec de l'ouverture de ce lien, car il n'est pas bien form\xE9\xA0: {0}","\xC9chec de l'ouverture de ce lien, car sa cible est manquante.","Ex\xE9cuter la commande","suivre le lien","cmd + clic","ctrl + clic","option + clic","alt + clic","Ex\xE9cuter la commande {0}","Ouvrir le lien"],"vs/editor/contrib/message/browser/messageController":["Indique si l'\xE9diteur affiche un message inline"],"vs/editor/contrib/multicursor/browser/multicursor":["Curseur ajout\xE9\xA0: {0}","Curseurs ajout\xE9s\xA0: {0}","Ajouter un curseur au-dessus","&&Ajouter un curseur au-dessus","Ajouter un curseur en dessous","Aj&&outer un curseur en dessous","Ajouter des curseurs \xE0 la fin des lignes","Ajouter des c&&urseurs \xE0 la fin des lignes","Ajouter des curseurs en bas","Ajouter des curseurs en haut","Ajouter la s\xE9lection \xE0 la correspondance de recherche suivante","Ajouter l'occurrence suiva&&nte","Ajouter la s\xE9lection \xE0 la correspondance de recherche pr\xE9c\xE9dente","Ajouter l'occurrence p&&r\xE9c\xE9dente","D\xE9placer la derni\xE8re s\xE9lection vers la correspondance de recherche suivante","D\xE9placer la derni\xE8re s\xE9lection \xE0 la correspondance de recherche pr\xE9c\xE9dente","S\xE9lectionner toutes les occurrences des correspondances de la recherche","S\xE9lectionner toutes les &&occurrences","Modifier toutes les occurrences","Focus sur le curseur suivant","Concentre le curseur suivant","Focus sur le curseur pr\xE9c\xE9dent","Concentre le curseur pr\xE9c\xE9dent"],"vs/editor/contrib/parameterHints/browser/parameterHints":["Indicateurs des param\xE8tres Trigger"],"vs/editor/contrib/parameterHints/browser/parameterHintsWidget":["Ic\xF4ne d'affichage du prochain conseil de param\xE8tre.","Ic\xF4ne d'affichage du pr\xE9c\xE9dent conseil de param\xE8tre.","{0}, conseil","Couleur de premier plan de l\u2019\xE9l\xE9ment actif dans l\u2019indicateur de param\xE8tre."],"vs/editor/contrib/peekView/browser/peekView":["Indique si l'\xE9diteur de code actuel est int\xE9gr\xE9 \xE0 l'aper\xE7u","Fermer","Couleur d'arri\xE8re-plan de la zone de titre de l'affichage d'aper\xE7u.","Couleur du titre de l'affichage d'aper\xE7u.","Couleur des informations sur le titre de l'affichage d'aper\xE7u.","Couleur des bordures et de la fl\xE8che de l'affichage d'aper\xE7u.","Couleur d'arri\xE8re-plan de la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur de premier plan des noeuds de lignes dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur de premier plan des noeuds de fichiers dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur d'arri\xE8re-plan de l'entr\xE9e s\xE9lectionn\xE9e dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur de premier plan de l'entr\xE9e s\xE9lectionn\xE9e dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur d'arri\xE8re-plan de l'\xE9diteur d'affichage d'aper\xE7u.","Couleur d'arri\xE8re-plan de la bordure de l'\xE9diteur d'affichage d'aper\xE7u.","Couleur d\u2019arri\xE8re-plan du d\xE9filement r\xE9manent dans l\u2019\xE9diteur d\u2019affichage d\u2019aper\xE7u.","Couleur de mise en surbrillance d'une correspondance dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur de mise en surbrillance d'une correspondance dans l'\xE9diteur de l'affichage d'aper\xE7u.","Bordure de mise en surbrillance d'une correspondance dans l'\xE9diteur de l'affichage d'aper\xE7u."],"vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess":["Ouvrez d'abord un \xE9diteur de texte pour acc\xE9der \xE0 une ligne.","Atteindre la ligne {0} et le caract\xE8re {1}.","Acc\xE9dez \xE0 la ligne {0}.","Ligne actuelle\xA0: {0}, caract\xE8re\xA0: {1}. Tapez un num\xE9ro de ligne entre\xA01 et\xA0{2} auquel acc\xE9der.","Ligne actuelle\xA0: {0}, caract\xE8re\xA0: {1}. Tapez un num\xE9ro de ligne auquel acc\xE9der."],"vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess":["Pour acc\xE9der \xE0 un symbole, ouvrez d'abord un \xE9diteur de texte avec des informations de symbole.","L'\xE9diteur de texte actif ne fournit pas les informations de symbole.","Aucun symbole d'\xE9diteur correspondant","Aucun symbole d'\xE9diteur","Ouvrir sur le c\xF4t\xE9","Ouvrir en bas","symboles ({0})","propri\xE9t\xE9s ({0})","m\xE9thodes ({0})","fonctions ({0})","constructeurs ({0})","variables ({0})","classes ({0})","structs ({0})","\xE9v\xE9nements ({0})","op\xE9rateurs ({0})","interfaces ({0})","espaces de noms ({0})","packages ({0})","param\xE8tres de type ({0})","modules ({0})","propri\xE9t\xE9s ({0})","\xE9num\xE9rations ({0})","membres d'\xE9num\xE9ration ({0})","cha\xEEnes ({0})","fichiers ({0})","tableaux ({0})","nombres ({0})","bool\xE9ens ({0})","objets ({0})","cl\xE9s ({0})","champs ({0})","constantes ({0})"],"vs/editor/contrib/readOnlyMessage/browser/contribution":["Impossible de modifier dans l\u2019entr\xE9e en lecture seule","Impossible de modifier dans l\u2019\xE9diteur en lecture seule"],"vs/editor/contrib/rename/browser/rename":["Aucun r\xE9sultat.","Une erreur inconnue s'est produite lors de la r\xE9solution de l'emplacement de renommage","Renommage de '{0}' en '{1}'","Changement du nom de {0} en {1}","'{0}' renomm\xE9 en '{1}'. R\xE9capitulatif : {2}","Le renommage n'a pas pu appliquer les modifications","Le renommage n'a pas pu calculer les modifications","Renommer le symbole","Activer/d\xE9sactiver la possibilit\xE9 d'afficher un aper\xE7u des changements avant le renommage"],"vs/editor/contrib/rename/browser/renameInputField":["Indique si le widget de renommage d'entr\xE9e est visible","Renommez l'entr\xE9e. Tapez le nouveau nom et appuyez sur Entr\xE9e pour valider.","{0} pour renommer, {1} pour afficher un aper\xE7u"],"vs/editor/contrib/smartSelect/browser/smartSelect":["\xC9tendre la s\xE9lection","D\xE9v&&elopper la s\xE9lection","R\xE9duire la s\xE9lection","&&R\xE9duire la s\xE9lection"],"vs/editor/contrib/snippet/browser/snippetController2":["Indique si l'\xE9diteur est actualis\xE9 en mode extrait","Indique s'il existe un taquet de tabulation suivant en mode extrait","Indique s'il existe un taquet de tabulation pr\xE9c\xE9dent en mode extrait","Acc\xE9der \xE0 l\u2019espace r\xE9serv\xE9 suivant..."],"vs/editor/contrib/snippet/browser/snippetVariables":["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dim","Lun","Mar","Mer","Jeu","Ven","Sam","Janvier","F\xE9vrier","Mars","Avril","Mai","Juin","Juillet","Ao\xFBt","Septembre","Octobre","Novembre","D\xE9cembre","Jan","F\xE9v","Mar","Avr","Mai","Juin","Jul","Ao\xFB","Sept","Oct","Nov","D\xE9c"],"vs/editor/contrib/stickyScroll/browser/stickyScrollActions":["Activer/d\xE9sactiver le d\xE9filement \xE9pingl\xE9 de l\u2019\xE9diteur","&&Activer/d\xE9sactiver le d\xE9filement \xE9pingl\xE9 de l\u2019\xE9diteur","D\xE9filement \xE9pingl\xE9","&&D\xE9filement \xE9pingl\xE9","Focus sur le d\xE9filement du pense-b\xEAte","&&Focus sur le d\xE9filement du pense-b\xEAte","S\xE9lectionner la ligne de d\xE9filement du pense-b\xEAte suivante","S\xE9lectionner la ligne de d\xE9filement du pense-b\xEAte pr\xE9c\xE9dente","Atteindre la ligne de d\xE9filement pense-b\xEAte prioritaire","S\xE9lectionner l'\xE9diteur"],"vs/editor/contrib/suggest/browser/suggest":["Indique si une suggestion a le focus","Indique si les d\xE9tails des suggestions sont visibles","Indique s'il existe plusieurs suggestions au choix","Indique si l'insertion de la suggestion actuelle entra\xEEne un changement ou si tout a d\xE9j\xE0 \xE9t\xE9 tap\xE9","Indique si les suggestions sont ins\xE9r\xE9es quand vous appuyez sur Entr\xE9e","Indique si la suggestion actuelle a un comportement d'insertion et de remplacement","Indique si le comportement par d\xE9faut consiste \xE0 ins\xE9rer ou \xE0 remplacer","Indique si la suggestion actuelle prend en charge la r\xE9solution des d\xE9tails suppl\xE9mentaires"],"vs/editor/contrib/suggest/browser/suggestController":["L'acceptation de '{0}' a entra\xEEn\xE9 {1}\xA0modifications suppl\xE9mentaires","Suggestions pour Trigger","Ins\xE9rer","Ins\xE9rer","Remplacer","Remplacer","Ins\xE9rer","afficher moins","afficher plus","R\xE9initialiser la taille du widget de suggestion"],"vs/editor/contrib/suggest/browser/suggestWidget":["Couleur d'arri\xE8re-plan du widget de suggestion.","Couleur de bordure du widget de suggestion.","Couleur de premier plan du widget de suggestion.","Couleur de premier plan de l\u2019entr\xE9e s\xE9lectionn\xE9e dans le widget de suggestion.","Couleur de premier plan de l\u2019ic\xF4ne de l\u2019entr\xE9e s\xE9lectionn\xE9e dans le widget de suggestion.","Couleur d'arri\xE8re-plan de l'entr\xE9e s\xE9lectionn\xE9e dans le widget de suggestion.","Couleur de la surbrillance des correspondances dans le widget de suggestion.","Couleur des mises en surbrillance dans le widget de suggestion lorsqu\u2019un \xE9l\xE9ment a le focus.","Couleur de premier plan du statut du widget de suggestion.","Chargement en cours...","Pas de suggestions.","Sugg\xE9rer","{0} {1}, {2}","{0} {1}","{0}, {1}","{0}, documents\xA0: {1}"],"vs/editor/contrib/suggest/browser/suggestWidgetDetails":["Fermer","Chargement en cours..."],"vs/editor/contrib/suggest/browser/suggestWidgetRenderer":["Ic\xF4ne d'affichage d'informations suppl\xE9mentaires dans le widget de suggestion.","Lire la suite"],"vs/editor/contrib/suggest/browser/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/browser/symbolIcons":["Couleur de premier plan des symboles de tableau. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles bool\xE9ens. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de classe. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de couleur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan pour les symboles de constante. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de constructeur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'\xE9num\xE9rateur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de membre d'\xE9num\xE9rateur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'\xE9v\xE9nement. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de champ. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de fichier. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de dossier. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de fonction. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'interface. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de cl\xE9. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de mot cl\xE9. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de m\xE9thode. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de module. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'espace de noms. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles null. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de nombre. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'objet. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'op\xE9rateur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de package. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de propri\xE9t\xE9. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de r\xE9f\xE9rence. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'extrait de code. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de cha\xEEne. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de struct. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de texte. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de param\xE8tre de type. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'unit\xE9. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de variable. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion."],"vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode":["Activer/d\xE9sactiver l'utilisation de la touche Tab pour d\xE9placer le focus","Appuyer sur Tab d\xE9placera le focus vers le prochain \xE9l\xE9ment pouvant \xEAtre d\xE9sign\xE9 comme \xE9l\xE9ment actif","Appuyer sur Tab ins\xE9rera le caract\xE8re de tabulation"],"vs/editor/contrib/tokenization/browser/tokenization":["D\xE9veloppeur\xA0: forcer la retokenisation"],"vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter":["Ic\xF4ne affich\xE9e avec un message d'avertissement dans l'\xE9diteur d'extensions.","Ce document contient de nombreux caract\xE8res Unicode ASCII non basiques.","Ce document contient de nombreux caract\xE8res Unicode ambigus.","Ce document contient de nombreux caract\xE8res Unicode invisibles.","Configurer les options de surlignage Unicode","Le caract\xE8re {0} peut \xEAtre confondu avec le caract\xE8re ASCII {1}, qui est plus courant dans le code source.","Le caract\xE8re {0} peut \xEAtre confus avec le caract\xE8re {1}, ce qui est plus courant dans le code source.","Le caract\xE8re {0} est invisible.","Le caract\xE8re {0} n\u2019est pas un caract\xE8re ASCII de base.","Ajuster les param\xE8tres","D\xE9sactiver la mise en surbrillance dans les commentaires","D\xE9sactiver la mise en surbrillance des caract\xE8res dans les commentaires","D\xE9sactiver la mise en surbrillance dans les cha\xEEnes","D\xE9sactiver la mise en surbrillance des caract\xE8res dans les cha\xEEnes","D\xE9sactiver la mise en surbrillance ambigu\xEB","D\xE9sactiver la mise en surbrillance des caract\xE8res ambigus","D\xE9sactiver le surlignage invisible","D\xE9sactiver la mise en surbrillance des caract\xE8res invisibles","D\xE9sactiver la mise en surbrillance non ASCII","D\xE9sactiver la mise en surbrillance des caract\xE8res ASCII non de base","Afficher les options d\u2019exclusion","Exclure la mise en surbrillance des {0} (caract\xE8re invisible)","Exclure {0} de la mise en surbrillance",'Autoriser les caract\xE8res Unicode plus courants dans le langage "{0}"'],"vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators":["Marques de fin de ligne inhabituelles","Marques de fin de ligne inhabituelles d\xE9tect\xE9es","Le fichier \xAB\xA0{0}\xA0\xBBcontient un ou plusieurs caract\xE8res de fin de ligne inhabituels, par exemple le s\xE9parateur de ligne (LS) ou le s\xE9parateur de paragraphe (PS).\r\n\r\nIl est recommand\xE9 de les supprimer du fichier. Vous pouvez configurer ce comportement par le biais de `editor.unusualLineTerminators`.","&&Supprimer les marques de fin de ligne inhabituelles","Ignorer"],"vs/editor/contrib/wordHighlighter/browser/highlightDecorations":["Couleur d'arri\xE8re-plan d'un symbole pendant l'acc\xE8s en lecture, comme la lecture d'une variable. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d'arri\xE8re-plan d'un symbole pendant l'acc\xE8s en \xE9criture, comme l'\xE9criture d'une variable. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d\u2019arri\xE8re-plan d\u2019une occurrence textuelle d\u2019un symbole. La couleur ne doit pas \xEAtre opaque afin de ne pas masquer les d\xE9corations sous-jacentes.","Couleur de bordure d'un symbole durant l'acc\xE8s en lecture, par exemple la lecture d'une variable.","Couleur de bordure d'un symbole durant l'acc\xE8s en \xE9criture, par exemple l'\xE9criture dans une variable.","Couleur de bordure d\u2019une occurrence textuelle pour un symbole.","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour la mise en surbrillance des symboles. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour la mise en surbrillance des symboles d'acc\xE8s en \xE9criture. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de marqueur de r\xE8gle d\u2019aper\xE7u d\u2019une occurrence textuelle pour un symbole. La couleur ne doit pas \xEAtre opaque afin de ne pas masquer les d\xE9corations sous-jacentes."],"vs/editor/contrib/wordHighlighter/browser/wordHighlighter":["Aller \xE0 la prochaine mise en \xE9vidence de symbole","Aller \xE0 la mise en \xE9vidence de symbole pr\xE9c\xE9dente","D\xE9clencher la mise en \xE9vidence de symbole"],"vs/editor/contrib/wordOperations/browser/wordOperations":["Supprimer le mot"],"vs/platform/action/common/actionCommonCategories":["D\xE9veloppeur","Afficher","Aide","Test","fichier","Pr\xE9f\xE9rences"],"vs/platform/actionWidget/browser/actionList":["{0} \xE0 appliquer, {1} \xE0 afficher un aper\xE7u","{0} pour appliquer","{0}, raison d\xE9sactiv\xE9e : {1}","Widget d\u2019action"],"vs/platform/actionWidget/browser/actionWidget":["Couleur d'arri\xE8re-plan des \xE9l\xE9ments d'action activ\xE9s dans la barre d'action.","Indique si la liste des widgets d\u2019action est visible","Masquer le widget d\u2019action","S\xE9lectionner l\u2019action pr\xE9c\xE9dente","S\xE9lectionner l\u2019action suivante","Accepter l\u2019action s\xE9lectionn\xE9e","Aper\xE7u de l\u2019action s\xE9lectionn\xE9e"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})","{0} ({1})",`{0}\r
+[{1}] {2}`],"vs/platform/actions/browser/toolbar":["Masquer","R\xE9initialiser le menu"],"vs/platform/actions/common/menuService":["Masquer \xAB{0}\xBB"],"vs/platform/audioCues/browser/audioCueService":["Erreur sur la ligne","Erreur","Avertissement sur la ligne","Avertissement","Zone pli\xE9e sur la ligne","Repli\xE9","Point d\u2019arr\xEAt sur ligne","Point d\u2019arr\xEAt","Suggestion inline sur la ligne","Correctif rapide de terminal","Correctif rapide","D\xE9bogueur arr\xEAt\xE9 sur le point d\u2019arr\xEAt","Point d\u2019arr\xEAt","Aucun indicateur d\u2019inlay sur la ligne","Aucun conseil Inlay","T\xE2che termin\xE9e","T\xE2che termin\xE9e","\xC9chec de la t\xE2che","\xC9chec de la t\xE2che","\xC9chec de la commande de terminal","\xC9chec de la commande","Cloche de terminal","Cloche de terminal","Cellule de bloc-notes termin\xE9e","Cellule de bloc-notes termin\xE9e","\xC9chec de la cellule de bloc-notes","\xC9chec de la cellule de bloc-notes","Ligne de diffusion ins\xE9r\xE9e","Ligne de diffusion supprim\xE9e","Ligne diff modifi\xE9e","Demande de conversation envoy\xE9e","Requ\xEAte de conversation envoy\xE9e","R\xE9ponse de conversation re\xE7ue","R\xE9ponse de conversation en attente","R\xE9ponse de conversation en attente","Effacer","Effacer","Enregistrer","Enregistrer","Format","Format"],"vs/platform/configuration/common/configurationRegistry":["Substitutions de configuration du langage par d\xE9faut","Configurez les param\xE8tres \xE0 remplacer pour le langage {0}.","Configurez les param\xE8tres d'\xE9diteur \xE0 remplacer pour un langage.","Ce param\xE8tre ne prend pas en charge la configuration par langage.","Configurez les param\xE8tres d'\xE9diteur \xE0 remplacer pour un langage.","Ce param\xE8tre ne prend pas en charge la configuration par langage.","Impossible d'inscrire une propri\xE9t\xE9 vide","Impossible d'inscrire '{0}'. Ceci correspond au mod\xE8le de propri\xE9t\xE9 '\\\\[.*\\\\]$' permettant de d\xE9crire les param\xE8tres d'\xE9diteur sp\xE9cifiques \xE0 un langage. Utilisez la contribution 'configurationDefaults'.","Impossible d'inscrire '{0}'. Cette propri\xE9t\xE9 est d\xE9j\xE0 inscrite.","Impossible d\u2019inscrire '{0}'. Le {1} de strat\xE9gie associ\xE9 est d\xE9j\xE0 inscrit aupr\xE8s de {2}."],"vs/platform/contextkey/browser/contextKeyService":["Commande qui retourne des informations sur les cl\xE9s de contexte"],"vs/platform/contextkey/common/contextkey":["Expression de cl\xE9 de contexte vide","Avez-vous oubli\xE9 d\u2019\xE9crire une expression ? Vous pouvez \xE9galement placer 'false' ou 'true' pour toujours donner la valeur false ou true, respectivement.","'in' apr\xE8s 'not'.","parenth\xE8se fermante ')'","Jeton inattendu","Avez-vous oubli\xE9 de placer && ou || avant le jeton ?","Fin d\u2019expression inattendue","Avez-vous oubli\xE9 de placer une cl\xE9 de contexte ?",`Attendu : {0}\r
+Re\xE7u : '{1}'.`],"vs/platform/contextkey/common/contextkeys":["Indique si le syst\xE8me d'exploitation est macOS","Indique si le syst\xE8me d'exploitation est Linux","Indique si le syst\xE8me d'exploitation est Windows","Indique si la plateforme est un navigateur web","Indique si le syst\xE8me d'exploitation est macOS sur une plateforme qui n'est pas un navigateur","Indique si le syst\xE8me d\u2019exploitation est Linux","Indique si la plateforme est un navigateur web mobile","Type de qualit\xE9 de VS Code","Indique si le focus clavier se trouve dans une zone d'entr\xE9e"],"vs/platform/contextkey/common/scanner":["Voulez-vous dire {0}?","Voulez-vous dire {0} ou {1}?","Voulez-vous dire {0}, {1} ou {2}?","Avez-vous oubli\xE9 d\u2019ouvrir ou de fermer le devis ?","Avez-vous oubli\xE9 d\u2019\xE9chapper le caract\xE8re \xAB / \xBB (barre oblique) ? Placez deux barre obliques inverses avant d\u2019y \xE9chapper, par ex., \xAB \\\\/ \xBB."],"vs/platform/history/browser/contextScopedHistoryWidget":["Indique si les suggestions sont visibles"],"vs/platform/keybinding/common/abstractKeybindingService":["Touche ({0}) utilis\xE9e. En attente d'une seconde touche...","({0}) a \xE9t\xE9 enfonc\xE9. En attente de la touche suivante de la pression...","La combinaison de touches ({0}, {1}) n\u2019est pas une commande.","La combinaison de touches ({0}, {1}) n\u2019est pas une commande."],"vs/platform/list/browser/listService":["Banc d'essai","Mappe vers 'Contr\xF4le' dans Windows et Linux, et vers 'Commande' dans macOS.","Mappe vers 'Alt' dans Windows et Linux, et vers 'Option' dans macOS.","Le modificateur \xE0 utiliser pour ajouter un \xE9l\xE9ment dans les arbres et listes pour une s\xE9lection multiple avec la souris (par exemple dans l\u2019Explorateur, les \xE9diteurs ouverts et la vue scm). Les mouvements de la souris 'Ouvrir \xE0 c\xF4t\xE9' (si pris en charge) s'adapteront tels qu\u2019ils n'entrent pas en conflit avec le modificateur multiselect.","Contr\xF4le l'ouverture des \xE9l\xE9ments dans les arborescences et les listes \xE0 l'aide de la souris (si cela est pris en charge). Notez que certaines arborescences et listes peuvent choisir d'ignorer ce param\xE8tre, s'il est non applicable.","Contr\xF4le si les listes et les arborescences prennent en charge le d\xE9filement horizontal dans le banc d'essai. Avertissement : L'activation de ce param\xE8tre a un impact sur les performances.","Contr\xF4le si les clics dans la barre de d\xE9filement page par page.","Contr\xF4le la mise en retrait de l'arborescence, en pixels.","Contr\xF4le si l'arborescence doit afficher les rep\xE8res de mise en retrait.","D\xE9termine si les listes et les arborescences ont un d\xE9filement fluide.","Un multiplicateur \xE0 utiliser sur les `deltaX` et `deltaY` des \xE9v\xE9nements de d\xE9filement de roulette de souris.","Multiplicateur de vitesse de d\xE9filement quand vous appuyez sur 'Alt'.","Mettez en surbrillance les \xE9l\xE9ments lors de la recherche. La navigation vers le haut et le bas traverse uniquement les \xE9l\xE9ments en surbrillance.","Filtrez des \xE9l\xE9ments lors de la recherche.","Contr\xF4le le mode de recherche par d\xE9faut pour les listes et les arborescences dans Workbench.","La navigation au clavier Simple place le focus sur les \xE9l\xE9ments qui correspondent \xE0 l'entr\xE9e de clavier. La mise en correspondance est effectu\xE9e sur les pr\xE9fixes uniquement.","La navigation de mise en surbrillance au clavier met en surbrillance les \xE9l\xE9ments qui correspondent \xE0 l'entr\xE9e de clavier. La navigation ult\xE9rieure vers le haut ou vers le bas parcourt uniquement les \xE9l\xE9ments mis en surbrillance.","La navigation au clavier Filtrer filtre et masque tous les \xE9l\xE9ments qui ne correspondent pas \xE0 l'entr\xE9e de clavier.","Contr\xF4le le style de navigation au clavier pour les listes et les arborescences dans le banc d'essai. Les options sont Simple, Mise en surbrillance et Filtrer.","Utilisez 'workbench.list.defaultFindMode' et 'workbench.list.typeNavigationMode' \xE0 la place.","Utilisez la correspondance approximative lors de la recherche.","Utilisez des correspondances contigu\xEBs lors de la recherche.","Contr\xF4le le type de correspondance utilis\xE9 lors de la recherche de listes et d\u2019arborescences dans le banc d\u2019essai.","Contr\xF4le la fa\xE7on dont les dossiers de l'arborescence sont d\xE9velopp\xE9s quand vous cliquez sur les noms de dossiers. Notez que certaines arborescences et listes peuvent choisir d'ignorer ce param\xE8tre, s'il est non applicable.","Contr\xF4le si le d\xE9filement r\xE9manent est activ\xE9 dans les arborescences.","Contr\xF4le le nombre d\u2019\xE9l\xE9ments r\xE9manents affich\xE9s dans l\u2019arborescence lorsque \xAB #workbench.tree.enableStickyScroll# \xBB est activ\xE9.","Contr\xF4le le fonctionnement de la navigation de type dans les listes et les arborescences du banc d'essai. Quand la valeur est 'trigger', la navigation de type commence une fois que la commande 'list.triggerTypeNavigation' est ex\xE9cut\xE9e."],"vs/platform/markers/common/markers":["Erreur","Avertissement","Info"],"vs/platform/quickinput/browser/commandsQuickAccess":["r\xE9cemment utilis\xE9es","commandes similaires","utilis\xE9s le plus souvent","autres commandes","commandes similaires","{0}, {1}","La commande \xAB\xA0{0}\xA0\xBB a entra\xEEn\xE9 une erreur"],"vs/platform/quickinput/browser/helpQuickAccess":["{0}, {1}"],"vs/platform/quickinput/browser/quickInput":["Pr\xE9c\xE9dent","Appuyez sur 'Entr\xE9e' pour confirmer votre saisie, ou sur '\xC9chap' pour l'annuler","{0}/{1}","Taper pour affiner les r\xE9sultats."],"vs/platform/quickinput/browser/quickInputController":["Activer/d\xE9sactiver toutes les cases \xE0 cocher","{0}\xA0r\xE9sultats","{0} S\xE9lectionn\xE9s","OK","Personnalis\xE9","Pr\xE9c\xE9dent ({0})","Retour"],"vs/platform/quickinput/browser/quickInputList":["Entr\xE9e rapide"],"vs/platform/quickinput/browser/quickInputUtils":["Cliquer pour ex\xE9cuter la commande '{0}'"],"vs/platform/theme/common/colorRegistry":["Couleur de premier plan globale. Cette couleur est utilis\xE9e si elle n'est pas remplac\xE9e par un composant.","Premier plan globale pour les \xE9l\xE9ments d\xE9sactiv\xE9s. Cette couleur est utilis\xE9e si elle n'est pas remplac\xE9e par un composant.","Couleur principale de premier plan pour les messages d'erreur. Cette couleur est utilis\xE9e uniquement si elle n'est pas red\xE9finie par un composant.","Couleur de premier plan du texte descriptif fournissant des informations suppl\xE9mentaires, par exemple pour un label.","Couleur par d\xE9faut des ic\xF4nes du banc d'essai.","Couleur de bordure globale des \xE9l\xE9ments ayant le focus. Cette couleur est utilis\xE9e si elle n'est pas remplac\xE9e par un composant.","Bordure suppl\xE9mentaire autour des \xE9l\xE9ments pour les s\xE9parer des autres et obtenir un meilleur contraste.","Bordure suppl\xE9mentaire autour des \xE9l\xE9ments actifs pour les s\xE9parer des autres et obtenir un meilleur contraste.","La couleur d'arri\xE8re-plan des s\xE9lections de texte dans le banc d'essai (par ex., pour les champs d'entr\xE9e ou les zones de texte). Notez que cette couleur ne s'applique pas aux s\xE9lections dans l'\xE9diteur et le terminal.","Couleur pour les s\xE9parateurs de texte.","Couleur des liens dans le texte.","Couleur de premier plan pour les liens dans le texte lorsqu'ils sont cliqu\xE9s ou survol\xE9s.","Couleur des segments de texte pr\xE9format\xE9s.","Couleur d'arri\xE8re-plan pour les segments de texte pr\xE9format\xE9s.","Couleur d'arri\xE8re-plan des citations dans le texte.","Couleur de bordure des citations dans le texte.","Couleur d'arri\xE8re-plan des blocs de code dans le texte.","Couleur de l'ombre des widgets, comme rechercher/remplacer, au sein de l'\xE9diteur.","Couleur de bordure des widgets, comme rechercher/remplacer au sein de l'\xE9diteur.","Arri\xE8re-plan de la zone d'entr\xE9e.","Premier plan de la zone d'entr\xE9e.","Bordure de la zone d'entr\xE9e.","Couleur de la bordure des options activ\xE9es dans les champs d'entr\xE9e.","Couleur d'arri\xE8re-plan des options activ\xE9es dans les champs d'entr\xE9e.","Couleur de pointage d\u2019arri\xE8re-plan des options dans les champs d\u2019entr\xE9e.","Couleur de premier plan des options activ\xE9es dans les champs d'entr\xE9e.","Couleur de premier plan de la zone d'entr\xE9e pour le texte d'espace r\xE9serv\xE9.","Couleur d'arri\xE8re-plan de la validation d'entr\xE9e pour la gravit\xE9 des informations.","Couleur de premier plan de validation de saisie pour la s\xE9v\xE9rit\xE9 Information.","Couleur de bordure de la validation d'entr\xE9e pour la gravit\xE9 des informations.","Couleur d'arri\xE8re-plan de la validation d'entr\xE9e pour la gravit\xE9 de l'avertissement.","Couleur de premier plan de la validation de la saisie pour la s\xE9v\xE9rit\xE9 Avertissement.","Couleur de bordure de la validation d'entr\xE9e pour la gravit\xE9 de l'avertissement.","Couleur d'arri\xE8re-plan de la validation d'entr\xE9e pour la gravit\xE9 de l'erreur.","Couleur de premier plan de la validation de saisie pour la s\xE9v\xE9rit\xE9 Erreur.","Couleur de bordure de la validation d'entr\xE9e pour la gravit\xE9 de l'erreur. ","Arri\xE8re-plan de la liste d\xE9roulante.","Arri\xE8re-plan de la liste d\xE9roulante.","Premier plan de la liste d\xE9roulante.","Bordure de la liste d\xE9roulante.","Couleur de premier plan du bouton.","Couleur du s\xE9parateur de boutons.","Couleur d'arri\xE8re-plan du bouton.","Couleur d'arri\xE8re-plan du bouton pendant le pointage.","Couleur de bordure du bouton.","Couleur de premier plan du bouton secondaire.","Couleur d'arri\xE8re-plan du bouton secondaire.","Couleur d'arri\xE8re-plan du bouton secondaire au moment du pointage.","Couleur de fond des badges. Les badges sont de courts libell\xE9s d'information, ex. le nombre de r\xE9sultats de recherche.","Couleur des badges. Les badges sont de courts libell\xE9s d'information, ex. le nombre de r\xE9sultats de recherche.","Ombre de la barre de d\xE9filement pour indiquer que la vue d\xE9file.","Couleur de fond du curseur de la barre de d\xE9filement.","Couleur de fond du curseur de la barre de d\xE9filement lors du survol.","Couleur d\u2019arri\xE8re-plan de la barre de d\xE9filement lorsqu'on clique dessus.","Couleur de fond pour la barre de progression qui peut s'afficher lors d'op\xE9rations longues.","Couleur d'arri\xE8re-plan du texte d'erreur dans l'\xE9diteur. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les d\xE9corations sous-jacentes.","Couleur de premier plan de la ligne ondul\xE9e marquant les erreurs dans l'\xE9diteur.","Si cette option est d\xE9finie, couleur des doubles soulignements pour les erreurs dans l\u2019\xE9diteur.","Couleur d'arri\xE8re-plan du texte d'avertissement dans l'\xE9diteur. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les d\xE9corations sous-jacentes.","Couleur de premier plan de la ligne ondul\xE9e marquant les avertissements dans l'\xE9diteur.","Si cette option est d\xE9finie, couleur des doubles soulignements pour les avertissements dans l\u2019\xE9diteur.","Couleur d'arri\xE8re-plan du texte d'information dans l'\xE9diteur. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les d\xE9corations sous-jacentes.","Couleur de premier plan de la ligne ondul\xE9e marquant les informations dans l'\xE9diteur.","Si cette option est d\xE9finie, couleur des doubles soulignements pour les informations dans l\u2019\xE9diteur.","Couleur de premier plan de la ligne ondul\xE9e d'indication dans l'\xE9diteur.","Si cette option est d\xE9finie, couleur des doubles soulignements pour les conseils dans l\u2019\xE9diteur.","Couleur de bordure des fen\xEAtres coulissantes.","Couleur d'arri\xE8re-plan de l'\xE9diteur.","Couleur de premier plan par d\xE9faut de l'\xE9diteur.","Couleur d\u2019arri\xE8re-plan du d\xE9filement \xE9pingl\xE9 dans l\u2019\xE9diteur","Couleur d\u2019arri\xE8re-plan du d\xE9filement \xE9pingl\xE9 lors du pointage pour l\u2019\xE9diteur","Couleur de bordure du d\xE9filement \xE9pingl\xE9 dans l\u2019\xE9diteur"," Couleur d\u2019ombre du d\xE9filement \xE9pingl\xE9 dans l\u2019\xE9diteur","Couleur d'arri\xE8re-plan des gadgets de l'\xE9diteur tels que rechercher/remplacer.","Couleur de premier plan des widgets de l'\xE9diteur, notamment Rechercher/remplacer.","Couleur de bordure des widgets de l'\xE9diteur. La couleur est utilis\xE9e uniquement si le widget choisit d'avoir une bordure et si la couleur n'est pas remplac\xE9e par un widget.","Couleur de bordure de la barre de redimensionnement des widgets de l'\xE9diteur. La couleur est utilis\xE9e uniquement si le widget choisit une bordure de redimensionnement et si la couleur n'est pas remplac\xE9e par un widget.","Couleur d'arri\xE8re-plan du s\xE9lecteur rapide. Le widget de s\xE9lecteur rapide est le conteneur de s\xE9lecteurs comme la palette de commandes.","Couleur de premier plan du s\xE9lecteur rapide. Le widget de s\xE9lecteur rapide est le conteneur de s\xE9lecteurs comme la palette de commandes.","Couleur d'arri\xE8re-plan du titre du s\xE9lecteur rapide. Le widget de s\xE9lecteur rapide est le conteneur de s\xE9lecteurs comme la palette de commandes.","Couleur du s\xE9lecteur rapide pour les \xE9tiquettes de regroupement.","Couleur du s\xE9lecteur rapide pour les bordures de regroupement.","Couleur d\u2019arri\xE8re-plan d\u2019\xE9tiquette de combinaison de touches. L\u2019\xE9tiquette est utilis\xE9e pour repr\xE9senter un raccourci clavier.","Couleur de premier plan d\u2019\xE9tiquette de combinaison de touches. L\u2019\xE9tiquette est utilis\xE9e pour repr\xE9senter un raccourci clavier.","Couleur de bordure de la combinaison de touches. L\u2019\xE9tiquette est utilis\xE9e pour repr\xE9senter un raccourci clavier.","Couleur de bordure du bas d\u2019\xE9tiquette de combinaison de touches. L\u2019\xE9tiquette est utilis\xE9e pour repr\xE9senter un raccourci clavier.","Couleur de la s\xE9lection de l'\xE9diteur.","Couleur du texte s\xE9lectionn\xE9 pour le contraste \xE9lev\xE9.","Couleur de la s\xE9lection dans un \xE9diteur inactif. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur des r\xE9gions dont le contenu est le m\xEAme que celui de la s\xE9lection. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de bordure des r\xE9gions dont le contenu est identique \xE0 la s\xE9lection.","Couleur du r\xE9sultat de recherche actif.","Couleur des autres correspondances de recherche. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de la plage limitant la recherche. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de bordure du r\xE9sultat de recherche actif.","Couleur de bordure des autres r\xE9sultats de recherche.","Couleur de bordure de la plage limitant la recherche. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur des correspondances de requ\xEAte de l'\xE9diteur de recherche.","Couleur de bordure des correspondances de requ\xEAte de l'\xE9diteur de recherche.","Couleur du texte dans le message d\u2019ach\xE8vement de la viewlet de recherche.","Surlignage sous le mot s\xE9lectionn\xE9 par pointage. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d'arri\xE8re-plan du pointage de l'\xE9diteur.","Couleur de premier plan du pointage de l'\xE9diteur.","Couleur de bordure du pointage de l'\xE9diteur.","Couleur d'arri\xE8re-plan de la barre d'\xE9tat du pointage de l'\xE9diteur.","Couleur des liens actifs.","Couleur de premier plan des indicateurs inline","Couleur d'arri\xE8re-plan des indicateurs inline","Couleur de premier plan des indicateurs inline pour les types","Couleur d'arri\xE8re-plan des indicateurs inline pour les types","Couleur de premier plan des indicateurs inline pour les param\xE8tres","Couleur d'arri\xE8re-plan des indicateurs inline pour les param\xE8tres","Couleur utilis\xE9e pour l'ic\xF4ne d'ampoule sugg\xE9rant des actions.","Couleur utilis\xE9e pour l'ic\xF4ne d'ampoule sugg\xE9rant des actions de correction automatique.","La couleur utilis\xE9e pour l\u2019ic\xF4ne AI de l\u2019ampoule.","Couleur d'arri\xE8re-plan du texte ins\xE9r\xE9. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d'arri\xE8re-plan du texte supprim\xE9. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d'arri\xE8re-plan des lignes ins\xE9r\xE9es. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d'arri\xE8re-plan des lignes supprim\xE9es. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d\u2019arri\xE8re-plan de la marge o\xF9 les lignes ont \xE9t\xE9 ins\xE9r\xE9es","Couleur d\u2019arri\xE8re-plan de la marge o\xF9 les lignes ont \xE9t\xE9 supprim\xE9es","Premier plan de la r\xE8gle de vue d\u2019ensemble des diff\xE9rences pour le contenu ins\xE9r\xE9","Premier plan de la r\xE8gle de vue d\u2019ensemble des diff\xE9rences pour le contenu supprim\xE9","Couleur de contour du texte ins\xE9r\xE9.","Couleur de contour du texte supprim\xE9.","Couleur de bordure entre les deux \xE9diteurs de texte.","Couleur du remplissage diagonal de l'\xE9diteur de diff\xE9rences. Le remplissage diagonal est utilis\xE9 dans les vues de diff\xE9rences c\xF4te \xE0 c\xF4te.","Couleur d\u2019arri\xE8re-plan des blocs inchang\xE9s dans l\u2019\xE9diteur de diff\xE9rences.","Couleur de premier plan des blocs inchang\xE9s dans l\u2019\xE9diteur de diff\xE9rences.","Couleur d\u2019arri\xE8re-plan du code inchang\xE9 dans l\u2019\xE9diteur de diff\xE9rences.","Couleur d'arri\xE8re-plan de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur de premier plan de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur de contour de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est active. Une liste/arborescence active a le focus clavier, contrairement \xE0 une liste/arborescence inactive.","Couleur de contour de liste/arborescence pour l\u2019\xE9l\xE9ment cibl\xE9 lorsque la liste/l\u2019arborescence est active et s\xE9lectionn\xE9e. Une liste/arborescence active dispose d\u2019un focus clavier, ce qui n\u2019est pas le cas d\u2019une arborescence inactive.","Couleur d'arri\xE8re-plan de la liste/l'arborescence de l'\xE9l\xE9ment s\xE9lectionn\xE9 quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur de premier plan de la liste/l'arborescence pour l'\xE9l\xE9ment s\xE9lectionn\xE9 quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur de premier plan de l\u2019ic\xF4ne Liste/l'arborescence pour l'\xE9l\xE9ment s\xE9lectionn\xE9 quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur d'arri\xE8re-plan de la liste/l'arborescence pour l'\xE9l\xE9ment s\xE9lectionn\xE9 quand la liste/l'arborescence est inactive. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur de premier plan de la liste/l'arborescence pour l'\xE9l\xE9ment s\xE9lectionn\xE9 quand la liste/l'arborescence est inactive. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur de premier plan de l\u2019ic\xF4ne Liste/l'arborescence pour l'\xE9l\xE9ment s\xE9lectionn\xE9 quand la liste/l'arborescence est inactive. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur d'arri\xE8re-plan de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier (elle ne l'est pas quand elle est inactive).","Couleur de contour de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est inactive. Une liste/arborescence active a le focus clavier, contrairement \xE0 une liste/arborescence inactive.","Arri\xE8re-plan de la liste/l'arborescence pendant le pointage sur des \xE9l\xE9ments avec la souris.","Premier plan de la liste/l'arborescence pendant le pointage sur des \xE9l\xE9ments avec la souris.","Arri\xE8re-plan de l'op\xE9ration de glisser-d\xE9placer dans une liste/arborescence pendant le d\xE9placement d\u2019\xE9l\xE9ments sur d\u2019autres \xE9l\xE9ments avec la souris.","Couleur de bordure glisser-d\xE9placer de la liste/de l\u2019arborescence lors du d\xE9placement d\u2019\xE9l\xE9ments entre des \xE9l\xE9ments lors de l\u2019utilisation de la souris.","Couleur de premier plan dans la liste/l'arborescence pour la surbrillance des correspondances pendant la recherche dans une liste/arborescence.","Couleur de premier plan de la liste ou l\u2019arborescence pour la surbrillance des correspondances sur les \xE9l\xE9ments ayant le focus pendant la recherche dans une liste/arborescence.","Couleur de premier plan de liste/arbre pour les \xE9l\xE9ments non valides, par exemple une racine non r\xE9solue dans l\u2019Explorateur.","Couleur de premier plan des \xE9l\xE9ments de la liste contenant des erreurs.","Couleur de premier plan des \xE9l\xE9ments de liste contenant des avertissements.","Couleur d'arri\xE8re-plan du widget de filtre de type dans les listes et les arborescences.","Couleur de contour du widget de filtre de type dans les listes et les arborescences.","Couleur de contour du widget de filtre de type dans les listes et les arborescences, en l'absence de correspondance.","Appliquez une ombre \xE0 la couleur du widget filtre de type dans les listes et les arborescences.","Couleur d'arri\xE8re-plan de la correspondance filtr\xE9e.","Couleur de bordure de la correspondance filtr\xE9e.","Couleur de trait de l'arborescence pour les rep\xE8res de mise en retrait.","Couleur de trait d\u2019arborescence pour les rep\xE8res de mise en retrait qui ne sont pas actifs.","Couleur de la bordure du tableau entre les colonnes.","Couleur d'arri\xE8re-plan pour les lignes de tableau impaires.","Couleur de premier plan de la liste/l'arborescence des \xE9l\xE9ments att\xE9nu\xE9s.","Couleur de fond du widget Case \xE0 cocher.","Couleur d\u2019arri\xE8re-plan du widget de case \xE0 cocher lorsque l\u2019\xE9l\xE9ment dans lequel il se trouve est s\xE9lectionn\xE9.","Couleur de premier plan du widget Case \xE0 cocher.","Couleur de bordure du widget Case \xE0 cocher.","Couleur de bordure du widget de case \xE0 cocher lorsque l\u2019\xE9l\xE9ment dans lequel il se trouve est s\xE9lectionn\xE9.","Utilisez quickInputList.focusBackground \xE0 la place","Couleur de premier plan du s\xE9lecteur rapide pour l\u2019\xE9l\xE9ment ayant le focus.","Couleur de premier plan de l\u2019ic\xF4ne du s\xE9lecteur rapide pour l\u2019\xE9l\xE9ment ayant le focus.","Couleur d'arri\xE8re-plan du s\xE9lecteur rapide pour l'\xE9l\xE9ment ayant le focus.","Couleur de bordure des menus.","Couleur de premier plan des \xE9l\xE9ments de menu.","Couleur d'arri\xE8re-plan des \xE9l\xE9ments de menu.","Couleur de premier plan de l'\xE9l\xE9ment de menu s\xE9lectionn\xE9 dans les menus.","Couleur d'arri\xE8re-plan de l'\xE9l\xE9ment de menu s\xE9lectionn\xE9 dans les menus.","Couleur de bordure de l'\xE9l\xE9ment de menu s\xE9lectionn\xE9 dans les menus.","Couleur d'un \xE9l\xE9ment de menu s\xE9parateur dans les menus.","Arri\xE8re-plan de la barre d\u2019outils lors du survol des actions \xE0 l\u2019aide de la souris","Contour de la barre d\u2019outils lors du survol des actions \xE0 l\u2019aide de la souris","Arri\xE8re-plan de la barre d\u2019outils quand la souris est maintenue sur des actions","Couleur d\u2019arri\xE8re-plan de mise en surbrillance d\u2019un extrait tabstop.","Couleur de bordure de mise en surbrillance d\u2019un extrait tabstop.","Couleur d\u2019arri\xE8re-plan de mise en surbrillance du tabstop final d\u2019un extrait.","Mettez en surbrillance la couleur de bordure du dernier taquet de tabulation d'un extrait de code.","Couleur des \xE9l\xE9ments de navigation avec le focus.","Couleur de fond des \xE9l\xE9ments de navigation.","Couleur des \xE9l\xE9ments de navigation avec le focus.","Couleur des \xE9l\xE9ments de navigation s\xE9lectionn\xE9s.","Couleur de fond du s\xE9lecteur d\u2019\xE9l\xE9ment de navigation.","Arri\xE8re-plan d'en-t\xEAte actuel dans les conflits de fusion inline. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Arri\xE8re-plan de contenu actuel dans les conflits de fusion inline. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Arri\xE8re-plan d'en-t\xEAte entrant dans les conflits de fusion inline. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Arri\xE8re-plan de contenu entrant dans les conflits de fusion inline. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Arri\xE8re-plan d'en-t\xEAte de l'anc\xEAtre commun dans les conflits de fusion inline. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Arri\xE8re-plan de contenu de l'anc\xEAtre commun dans les conflits de fusion inline. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de bordure des en-t\xEAtes et du s\xE9parateur dans les conflits de fusion inline.","Premier plan de la r\xE8gle d'aper\xE7u actuelle pour les conflits de fusion inline.","Premier plan de la r\xE8gle d'aper\xE7u entrante pour les conflits de fusion inline.","Arri\xE8re-plan de la r\xE8gle d'aper\xE7u de l'anc\xEAtre commun dans les conflits de fusion inline.","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour rechercher les correspondances. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour la mise en surbrillance des s\xE9lections. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de marqueur de la minimap pour les correspondances.","Couleur de marqueur minimap pour les s\xE9lections r\xE9p\xE9t\xE9es de l\u2019\xE9diteur.","Couleur de marqueur du minimap pour la s\xE9lection de l'\xE9diteur.","Couleur de marqueur de minimap pour les informations.","Couleur de marqueur de minimap pour les avertissements.","Couleur de marqueur de minimap pour les erreurs.","Couleur d'arri\xE8re-plan du minimap.","Opacit\xE9 des \xE9l\xE9ments de premier plan rendus dans la minimap. Par exemple, \xAB #000000c0 \xBB affiche les \xE9l\xE9ments avec une opacit\xE9 de 75 %.","Couleur d'arri\xE8re-plan du curseur de minimap.","Couleur d'arri\xE8re-plan du curseur de minimap pendant le survol.","Couleur d'arri\xE8re-plan du curseur de minimap pendant un clic.","Couleur utilis\xE9e pour l'ic\xF4ne d'erreur des probl\xE8mes.","Couleur utilis\xE9e pour l'ic\xF4ne d'avertissement des probl\xE8mes.","Couleur utilis\xE9e pour l'ic\xF4ne d'informations des probl\xE8mes.","Couleur de premier plan utilis\xE9e dans les graphiques.","Couleur utilis\xE9e pour les lignes horizontales dans les graphiques.","Couleur rouge utilis\xE9e dans les visualisations de graphiques.","Couleur bleue utilis\xE9e dans les visualisations de graphiques.","Couleur jaune utilis\xE9e dans les visualisations de graphiques.","Couleur orange utilis\xE9e dans les visualisations de graphiques.","Couleur verte utilis\xE9e dans les visualisations de graphiques.","Couleur violette utilis\xE9e dans les visualisations de graphiques."],"vs/platform/theme/common/iconRegistry":["ID de la police \xE0 utiliser. Si aucune valeur n'est d\xE9finie, la police d\xE9finie en premier est utilis\xE9e.","Caract\xE8re de police associ\xE9 \xE0 la d\xE9finition d'ic\xF4ne.","Ic\xF4ne de l'action de fermeture dans les widgets.","Ic\xF4ne d'acc\xE8s \xE0 l'emplacement pr\xE9c\xE9dent de l'\xE9diteur.","Ic\xF4ne d'acc\xE8s \xE0 l'emplacement suivant de l'\xE9diteur."],"vs/platform/undoRedo/common/undoRedoService":["Les fichiers suivants ont \xE9t\xE9 ferm\xE9s et modifi\xE9s sur le disque\xA0: {0}.","Les fichiers suivants ont \xE9t\xE9 modifi\xE9s de mani\xE8re incompatible : {0}.","Impossible d'annuler '{0}' dans tous les fichiers. {1}","Impossible d'annuler '{0}' dans tous les fichiers. {1}","Impossible d'annuler '{0}' dans tous les fichiers, car des modifications ont \xE9t\xE9 apport\xE9es \xE0 {1}","Impossible d'annuler '{0}' dans tous les fichiers, car une op\xE9ration d'annulation ou de r\xE9tablissement est d\xE9j\xE0 en cours d'ex\xE9cution sur {1}","Impossible d'annuler '{0}' dans tous les fichiers, car une op\xE9ration d'annulation ou de r\xE9tablissement s'est produite dans l'intervalle","Souhaitez-vous annuler '{0}' dans tous les fichiers\xA0?","&&Annuler dans {0} fichiers","Annuler ce &&fichier","Impossible d'annuler '{0}', car une op\xE9ration d'annulation ou de r\xE9tablissement est d\xE9j\xE0 en cours d'ex\xE9cution.","Voulez-vous annuler '{0}'\xA0?","&&Oui","Non","Impossible de r\xE9p\xE9ter '{0}' dans tous les fichiers. {1}","Impossible de r\xE9p\xE9ter '{0}' dans tous les fichiers. {1}","Impossible de r\xE9p\xE9ter '{0}' dans tous les fichiers, car des modifications ont \xE9t\xE9 apport\xE9es \xE0 {1}","Impossible de r\xE9tablir '{0}' dans tous les fichiers, car une op\xE9ration d'annulation ou de r\xE9tablissement est d\xE9j\xE0 en cours d'ex\xE9cution pour {1}","Impossible de r\xE9tablir '{0}' dans tous les fichiers, car une op\xE9ration d'annulation ou de r\xE9tablissement s'est produite dans l'intervalle","Impossible de r\xE9tablir '{0}', car une op\xE9ration d'annulation ou de r\xE9tablissement est d\xE9j\xE0 en cours d'ex\xE9cution."],"vs/platform/workspace/common/workspace":["Espace de travail de code"]});
+
+//# sourceMappingURL=../../../min-maps/vs/editor/editor.main.nls.fr.js.map
\ No newline at end of file
diff --git a/public/vs/editor/editor.main.nls.it.js b/public/vs/editor/editor.main.nls.it.js
new file mode 100644
index 0000000..c287368
--- /dev/null
+++ b/public/vs/editor/editor.main.nls.it.js
@@ -0,0 +1,13 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.it",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["input"],"vs/base/browser/ui/findinput/findInputToggles":["Maiuscole/minuscole","Parola intera","Usa espressione regolare"],"vs/base/browser/ui/findinput/replaceInput":["input","Mantieni maiuscole/minuscole"],"vs/base/browser/ui/hover/hoverWidget":["Ispezionarlo nella visualizzazione accessibile con {0}.","Ispezionarlo nella visualizzazione accessibile tramite il comando Apri visualizzazione accessibile che attualmente non \xE8 attivabile tramite il tasto di scelta rapida."],"vs/base/browser/ui/iconLabel/iconLabelHover":["Caricamento..."],"vs/base/browser/ui/inputbox/inputBox":["Errore: {0}","Avviso: {0}","Info: {0}"," o {0} per la cronologia"," ({0} per la cronologia)","Input cancellato"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["Non associato"],"vs/base/browser/ui/selectBox/selectBoxCustom":["Casella di selezione"],"vs/base/browser/ui/toolbar/toolbar":["Altre azioni..."],"vs/base/browser/ui/tree/abstractTree":["Filtro","Corrispondenza fuzzy","Digitare per filtrare","Digitare per la ricerca","Digitare per la ricerca","Chiudi","Non sono stati trovati elementi."],"vs/base/common/actions":["(vuoto)"],"vs/base/common/errorMessage":["{0}: {1}","Si \xE8 verificato un errore di sistema ({0})","Si \xE8 verificato un errore sconosciuto. Per altri dettagli, vedere il log.","Si \xE8 verificato un errore sconosciuto. Per altri dettagli, vedere il log.","{0} ({1} errori in totale)","Si \xE8 verificato un errore sconosciuto. Per altri dettagli, vedere il log."],"vs/base/common/keybindingLabels":["CTRL","MAIUSC","ALT","Windows","CTRL","MAIUSC","ALT","Super","CTRL","MAIUSC","Opzione","Comando","CTRL","MAIUSC","ALT","Windows","CTRL","MAIUSC","ALT","Super"],"vs/base/common/platform":["_"],"vs/editor/browser/controller/textAreaHandler":["editor","L'editor non \xE8 accessibile in questo momento.","{0} Per abilitare la modalit\xE0 ottimizzata per l'utilit\xE0 per la lettura dello schermo usare {1}","{0} Per abilitare la modalit\xE0 ottimizzata per l'utilit\xE0 per la lettura dello schermo, aprire la selezione rapida con {1} ed eseguire il comando Attiva/Disattiva modalit\xE0 di accessibilit\xE0 dell'utilit\xE0 per la lettura dello schermo, attualmente non attivabile tramite tastiera.","{0} Assegnare un tasto di scelta rapida per il comando Attiva/Disattiva modalit\xE0 di accessibilit\xE0 dell'utilit\xE0 per la lettura dello schermo accedendo all'editor dei tasti di scelta rapida con {1} ed eseguirlo."],"vs/editor/browser/coreCommands":["Si attiene alla fine anche quando si passa a righe pi\xF9 lunghe","Si attiene alla fine anche quando si passa a righe pi\xF9 lunghe","Cursori secondari rimossi"],"vs/editor/browser/editorExtensions":["&&Annulla","Annulla azione","&&Ripeti","Ripeti","&&Seleziona tutto","Seleziona tutto"],"vs/editor/browser/widget/codeEditorWidget":["Il numero di cursori \xE8 stato limitato a {0}. Provare a usare [Trova e sostituisci](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) per modifiche di dimensioni maggiori o aumentare l'impostazione del limite di pi\xF9 cursori dell'editor.","Aumentare limite multi-cursore"],"vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer":['Icona per "Inserisci" nel visualizzatore differenze accessibile.','Icona per "Rimuovi" nel visualizzatore differenze accessibile.','Icona per "Chiudi" nel visualizzatore differenze accessibile.',"Chiudi","Visualizzatore differenze accessibile. Usare le frecce SU e GI\xD9 per spostarsi.","nessuna riga modificata","1 riga modificata","{0} righe modificate","Differenza {0} di {1}: riga originale {2}, {3}, riga modificata {4}, {5}","vuota","{0} riga non modificata {1}","{0} riga originale {1} riga modificata {2}","+ {0} riga modificata {1}","- {0} riga originale {1}"],"vs/editor/browser/widget/diffEditor/components/diffEditorEditors":[" utilizzare {0} per aprire la Guida all'accessibilit\xE0."],"vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin":["Copia le righe eliminate","Copia la riga eliminata","Copia righe modificate","Copia riga modificata","Copia la riga eliminata ({0})","Copia riga modificata ({0})","Ripristina questa modifica"],"vs/editor/browser/widget/diffEditor/diffEditor.contribution":["Usa la visualizzazione inline quando lo spazio \xE8 limitato","Mostra blocchi di codice spostati","Editor diff","Visualizzatore differenze accessibile","Apri Visualizzatore differenze accessibile","Attiva/Disattiva comprimi aree non modificate","Attiva/Disattiva mostra blocchi di codice spostati","Attiva/disattiva la visualizzazione inline quando lo spazio \xE8 limitato","Interruttore laterale","Esci da Sposta confronto","Comprimi tutte le aree non modificate","Mostra tutte le aree non modificate","Vai alla differenza successiva","Vai alla differenza precedente"],"vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature":["Ridurre area non modificata","Fai clic o trascina per visualizzare altri elementi sopra","Mostra area non modificata","Fai clic o trascina per visualizzare altri elementi sotto","{0} righe nascoste","Fare doppio clic per espandere"],"vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature":["Codice spostato con modifiche alla riga {0}-{1}","Codice spostato con modifiche dalla riga {0}-{1}","Codice spostato alla riga {0}-{1}","Codice spostato dalla riga {0}-{1}"],"vs/editor/browser/widget/diffEditor/features/revertButtonsFeature":["Ripristina modifiche selezionate","Annulla modifica"],"vs/editor/browser/widget/diffEditor/registrations.contribution":["Colore del bordo per il testo spostato nell'editor diff.","Colore del bordo attivo per il testo spostato nell'editor diff.","Colore dell'ombreggiatura intorno ai widget dell'area non modificata.","Effetto di riga per gli inserimenti nell'editor diff.","Effetto di riga per le rimozioni nell'editor diff."],"vs/editor/browser/widget/hoverWidget/hoverWidget":["Tieni premuto il tasto {0} per passare il mouse"],"vs/editor/browser/widget/multiDiffEditorWidget/colors":["Colore di sfondo dell'intestazione dell'editor diff","Colore di sfondo dell'editor diff a pi\xF9 file","Colore del bordo dell\u2019editor diff multi file"],"vs/editor/common/config/editorConfigurationSchema":["Editor","Numero di spazi a cui \xE8 uguale una scheda. Questa impostazione viene sottoposta a override in base al contenuto del file quando {0} \xE8 attivo.",'Numero di spazi utilizzati per il rientro o `"tabSize"` per usare il valore di `#editor.tabSize#`. Questa impostazione viene sostituita in base al contenuto del file quando `#editor.detectIndentation#` \xE8 attivo.',"Inserire spazi quando si preme 'TAB'. Questa impostazione viene sottoposta a override in base al contenuto del file quando {0} \xE8 attivo.","Controlla se {0} e {1} verranno rilevati automaticamente quando un file viene aperto in base al contenuto del file.","Rimuovi gli spazi finali inseriti automaticamente.","Gestione speciale dei file di grandi dimensioni per disabilitare alcune funzionalit\xE0 che fanno un uso intensivo della memoria.","Disattivare i suggerimenti basati su Word.","Suggerisci parole solo dal documento attivo.","Suggerisci parole da tutti i documenti aperti della stessa lingua.","Suggerisci parole da tutti i documenti aperti.","Controlla se i completamenti devono essere calcolati in base alle parole nel documento e dai documenti da cui vengono calcolati.","L'evidenziazione semantica \xE8 abilitata per tutti i temi colore.","L'evidenziazione semantica \xE8 disabilitata per tutti i temi colore.","La configurazione dell'evidenziazione semantica \xE8 gestita tramite l'impostazione `semanticHighlighting` del tema colori corrente.","Controlla se l'evidenziazione semanticHighlighting \xE8 visualizzata per i linguaggi che la supportano.","Consente di mantenere aperti gli editor rapidi anche quando si fa doppio clic sul contenuto o si preme 'ESC'.","Per motivi di prestazioni le righe di lunghezza superiore non verranno tokenizzate","Controlla se la tokenizzazione deve essere eseguita in modo asincrono in un web worker.","Controlla se deve essere registrata la tokenizzazione asincrona. Solo per il debug.","Controlla se la tokenizzazione asincrona deve essere verificata rispetto alla tokenizzazione legacy in background. Potrebbe rallentare la tokenizzazione. Solo per il debug.","Definisce i simboli di parentesi quadra che aumentano o riducono il rientro.","Sequenza di stringa o carattere parentesi quadra di apertura.","Sequenza di stringa o carattere parentesi quadra di chiusura.","Definisce le coppie di bracket colorate in base al livello di annidamento se \xE8 abilitata la colorazione delle coppie di bracket.","Sequenza di stringa o carattere parentesi quadra di apertura.","Sequenza di stringa o carattere parentesi quadra di chiusura.","Timeout in millisecondi dopo il quale il calcolo delle differenze viene annullato. Usare 0 per indicare nessun timeout.","Dimensioni massime del file in MB per cui calcolare le differenze. Usare 0 per nessun limite.","Controlla se l'editor diff mostra le differenze affiancate o incorporate.","Se la larghezza dell'editor diff \xE8 inferiore a questo valore, verr\xE0 utilizzata la visualizzazione inline.","Se questa opzione \xE8 abilitata e la larghezza dell'editor \xE8 troppo piccola, verr\xE0 usata la visualizzazione inline.","Se questa opzione \xE8 abilitata, l'editor diff mostra le frecce nel margine del glifo per ripristinare le modifiche.","Se abilitato, l'editor differenze ignora le modifiche relative a spazi vuoti iniziali e finali.","Controlla se l'editor diff mostra gli indicatori +/- per le modifiche aggiunte/rimosse.","Controlla se l'editor visualizza CodeLens.","Il ritorno a capo automatico delle righe non viene mai applicato.","Il ritorno a capo automatico delle righe viene applicato in corrispondenza della larghezza del viewport.","Le righe andranno a capo in base all'impostazione {0}.","Usare l'algoritmo diffing legacy.","Usare l'algoritmo diffing avanzato.","Controlla se l'editor diff mostra aree non modificate.","Controlla il numero di righe usate per le aree non modificate.","Controlla il numero minimo di righe usate per le aree non modificate.","Controlla il numero di righe usate come contesto durante il confronto delle aree non modificate.","Controlla se l'editor diff deve mostrare gli spostamenti di codice rilevati.","Controlla se l'editor diff mostra decorazioni vuote per vedere dove sono stati inseriti o eliminati caratteri."],"vs/editor/common/config/editorOptions":["Usare le API della piattaforma per rilevare quando viene collegata un'utilit\xE0 per la lettura dello schermo.","Ottimizzare l'utilizzo con un'utilit\xE0 per la lettura dello schermo.","Si presuppone che un'utilit\xE0 per la lettura dello schermo non sia collegata.","Controllare se l'interfaccia utente deve essere eseguito in una modalit\xE0 ottimizzata per le utilit\xE0 per la lettura dello schermo.","Consente di controllare se viene inserito uno spazio quando si aggiungono commenti.","Controlla se ignorare le righe vuote con le opzioni per attivare/disattivare, aggiungere o rimuovere relative ai commenti di riga.","Controlla se, quando si copia senza aver effettuato una selezione, viene copiata la riga corrente.","Controlla se il cursore deve passare direttamente alla ricerca delle corrispondenze durante la digitazione.","Non fornire mai la stringa di ricerca dalla selezione dell'editor.","Fornisci sempre la stringa di ricerca dalla selezione dell'editor, inclusa la parola alla posizione del cursore.","Fornisci la stringa di ricerca solo dalla selezione dell'editor.","Controlla se inizializzare la stringa di ricerca nel Widget Trova con il testo selezionato nell'editor.","Non attivare mai automaticamente la funzione Trova nella selezione (impostazione predefinita).","Attiva sempre automaticamente la funzione Trova nella selezione.","Attiva automaticamente la funzione Trova nella selezione quando sono selezionate pi\xF9 righe di contenuto.","Controlla la condizione per attivare automaticamente la funzione Trova nella selezione.","Controlla se il widget Trova deve leggere o modificare gli appunti di ricerca condivisi in macOS.","Controlla se il widget Trova deve aggiungere altre righe nella parte superiore dell'editor. Quando \xE8 true, \xE8 possibile scorrere oltre la prima riga quando il widget Trova \xE8 visibile.","Controlla se la ricerca viene riavviata automaticamente dall'inizio o dalla fine quando non \xE8 possibile trovare ulteriori corrispondenze.","Abilita/Disabilita i caratteri legatura (funzionalit\xE0 dei tipi di carattere 'calt' e 'liga'). Impostare su una stringa per un controllo pi\xF9 specifico sulla propriet\xE0 CSS 'font-feature-settings'.","Propriet\xE0 CSS 'font-feature-settings' esplicita. Se \xE8 necessario solo attivare/disattivare le legature, \xE8 possibile passare un valore booleano.","Consente di configurare i caratteri legatura o le funzionalit\xE0 dei tipi di carattere. Pu\xF2 essere un valore booleano per abilitare/disabilitare le legature o una stringa per il valore della propriet\xE0 CSS 'font-feature-settings'.","Abilita/disabilita la conversione dada font-weight a font-variation-settings. Modificare questa impostazione in una stringa per il controllo con granularit\xE0 fine della propriet\xE0 CSS Font-variation.","Propriet\xE0 CSS esplicita 'font-variation-settings'. \xC8 invece possibile passare un valore booleano se \xE8 sufficiente convertire font-weight in font-variation-settings.","Configura le varianti di carattere. Pu\xF2 essere un valore booleano per abilitare/disabilitare la conversione da font-weight a font-variation-settings o una stringa per il valore della propriet\xE0 'font-variation-settings' CSS.","Controlla le dimensioni del carattere in pixel.",'Sono consentiti solo le parole chiave "normal" e "bold" o i numeri compresi tra 1 e 1000.','Controlla lo spessore del carattere. Accetta le parole chiave "normal" e "bold" o i numeri compresi tra 1 e 1000.',"Mostra la visualizzazione in anteprima dei risultati (impostazione predefinita)","Passa al risultato principale e mostra una visualizzazione in anteprima","Passa al risultato principale e abilita l'esplorazione senza anteprima per gli altri","Questa impostazione \xE8 deprecata. In alternativa, usare impostazioni diverse, come 'editor.editor.gotoLocation.multipleDefinitions' o 'editor.editor.gotoLocation.multipleImplementations'.","Controlla il comportamento del comando 'Vai alla definizione' quando esistono pi\xF9 posizioni di destinazione.","Controlla il comportamento del comando 'Vai alla definizione di tipo' quando esistono pi\xF9 posizioni di destinazione.","Controlla il comportamento del comando 'Vai a dichiarazione' quando esistono pi\xF9 posizioni di destinazione.","Controlla il comportamento del comando 'Vai a implementazioni' quando esistono pi\xF9 posizioni di destinazione.","Controlla il comportamento del comando 'Vai a riferimenti' quando esistono pi\xF9 posizioni di destinazione.","ID comando alternativo eseguito quando il risultato di 'Vai alla definizione' \xE8 la posizione corrente.","ID comando alternativo eseguito quando il risultato di 'Vai alla definizione di tipo' \xE8 la posizione corrente.","ID comando alternativo eseguito quando il risultato di 'Vai a dichiarazione' \xE8 la posizione corrente.","ID comando alternativo eseguito quando il risultato di 'Vai a implementazione' \xE8 la posizione corrente.","ID comando alternativo eseguito quando il risultato di 'Vai a riferimento' \xE8 la posizione corrente.","Controlla se mostrare l'area sensibile al passaggio del mouse.","Controlla il ritardo in millisecondi dopo il quale viene mostrato il passaggio del mouse.","Controlla se l'area sensibile al passaggio del mouse deve rimanere visibile quando vi si passa sopra con il puntatore del mouse.","Controlla il ritardo in millisecondi dopo il quale viene nascosto il passaggio del mouse. Richiede l'abilitazione di `editor.hover.sticky`.","Preferisci la visualizzazione al passaggio del mouse sopra la riga, se c'\xE8 spazio.","Presuppone che la larghezza sia identica per tutti caratteri. Si tratta di un algoritmo veloce che funziona correttamente per i tipi di carattere a spaziatura fissa e determinati script (come i caratteri latini) in cui i glifi hanno larghezza identica.","Delega il calcolo dei punti di ritorno a capo al browser. Si tratta di un algoritmo lento che potrebbe causare blocchi con file di grandi dimensioni, ma funziona correttamente in tutti gli altri casi.","Controlla l'algoritmo che calcola i punti di wrapping. Si noti che quando \xE8 attiva la modalit\xE0 di accessibilit\xE0, la modalit\xE0 avanzata verr\xE0 usata per un'esperienza ottimale.","Disabilita il menu azione codice.","Visualizza il menu azione codice quando il cursore \xE8 su righe di codice.","Mostra il menu azione codice quando il cursore \xE8 su righe con codice o su righe vuote.","Abilita la lampadina delle azioni codice nell'editor.","Mostra gli ambiti correnti annidati durante lo scorrimento nella parte superiore dell'editor.","Definisce il numero massimo di righe permanenti da mostrare.","Definisce il modello da utilizzare per determinare quali linee applicare. Se il modello di struttura non esiste, verr\xE0 eseguito il fallback sul modello del provider di riduzione che rientra nel modello di rientro. Questo ordine viene rispettato in tutti e tre i casi.","Abilitare lo scorrimento di scorrimento permanente con la barra di scorrimento orizzontale dell'editor.","Abilita i suggerimenti incorporati nell'Editor.","Gli hint di inlay sono abilitati","Gli hint di inlay vengono visualizzati per impostazione predefinita e vengono nascosti quando si tiene premuto {0}","Gli hint di inlay sono nascosti per impostazione predefinita e vengono visualizzati solo quando si tiene premuto {0}","Gli hint di inlay sono disabilitati","Controlla le dimensioni del carattere dei suggerimenti di inlay nell'editor. Per impostazione predefinita, {0} viene usato quando il valore configurato \xE8 minore di {1} o maggiore delle dimensioni del carattere dell'editor.","Controlla la famiglia di caratteri dei suggerimenti inlay nell'editor. Se impostato su vuoto, viene usato {0}.","Abilita il riempimento attorno ai suggerimenti incorporati nell'editor.",`Controlla l'altezza della riga. \r
+ - Usare 0 per calcolare automaticamente l'altezza della riga dalle dimensioni del carattere.\r
+ - I valori compresi tra 0 e 8 verranno usati come moltiplicatore con le dimensioni del carattere.\r
+ - I valori maggiori o uguali a 8 verranno usati come valori effettivi.`,"Controlla se la minimappa \xE8 visualizzata.","Controlla se la minimappa viene nascosta automaticamente.","La minimappa ha le stesse dimensioni del contenuto dell'editor (e potrebbe supportare lo scorrimento).","Se necessario, la minimappa si ridurr\xE0 o si ingrandir\xE0 in modo da adattarsi all'altezza dell'editor (nessuno scorrimento).","Se necessario, la minimappa si ridurr\xE0 in modo che la larghezza non superi mai quella dell'editor (nessuno scorrimento).","Controlla le dimensioni della minimappa.","Definisce il lato in cui eseguire il rendering della minimappa.","Controlla se il dispositivo di scorrimento della minimappa \xE8 visualizzato.","Scala del contenuto disegnato nella minimappa: 1, 2 o 3.","Esegue il rendering dei caratteri effettivi di una riga in contrapposizione ai blocchi colore.","Limita la larghezza della minimappa in modo da eseguire il rendering al massimo di un certo numero di colonne.","Controlla la quantit\xE0 di spazio tra il bordo superiore dell'editor e la prima riga.","Controlla la quantit\xE0 di spazio tra il bordo inferiore dell'editor e l'ultima riga.","Abilita un popup che mostra documentazione sui parametri e informazioni sui tipi mentre si digita.","Controlla se il menu dei suggerimenti per i parametri esegue un ciclo o si chiude quando viene raggiunta la fine dell'elenco.","I suggerimenti rapidi vengono visualizzati all'interno del widget dei suggerimenti","I suggerimenti rapidi vengono visualizzati come testo fantasma","I suggerimenti rapidi sono disabilitati","Abilita i suggerimenti rapidi all'interno di stringhe.","Abilita i suggerimenti rapidi all'interno di commenti.","Abilita i suggerimenti rapidi all'esterno di stringhe e commenti.","Controlla se i suggerimenti devono essere visualizzati automaticamente durante la digitazione. Pu\xF2 essere controllato per la digitazione in commenti, stringhe e altro codice. Il suggerimento rapido pu\xF2 essere configurato per essere visualizzato come testo fantasma o con il widget dei suggerimenti. Tenere anche conto dell'impostazione '{0}' che controlla se i suggerimenti vengono attivati dai caratteri speciali.","I numeri di riga non vengono visualizzati.","I numeri di riga vengono visualizzati come numeri assoluti.","I numeri di riga vengono visualizzati come distanza in linee alla posizione del cursore.","I numeri di riga vengono visualizzati ogni 10 righe.","Controlla la visualizzazione dei numeri di riga.","Numero di caratteri a spaziatura fissa in corrispondenza del quale verr\xE0 eseguito il rendering di questo righello dell'editor.","Colore di questo righello dell'editor.","Esegue il rendering dei righelli verticali dopo un certo numero di caratteri a spaziatura fissa. Usare pi\xF9 valori per pi\xF9 righelli. Se la matrice \xE8 vuota, non viene disegnato alcun righello.","La barra di scorrimento verticale sar\xE0 visibile solo quando necessario.","La barra di scorrimento verticale sar\xE0 sempre visibile.","La barra di scorrimento verticale sar\xE0 sempre nascosta.","Controlla la visibilit\xE0 della barra di scorrimento verticale.","La barra di scorrimento orizzontale sar\xE0 visibile solo quando necessario.","La barra di scorrimento orizzontale sar\xE0 sempre visibile.","La barra di scorrimento orizzontale sar\xE0 sempre nascosta.","Controlla la visibilit\xE0 della barra di scorrimento orizzontale.","Larghezza della barra di scorrimento verticale.","Altezza della barra di scorrimento orizzontale.","Controlla se i clic consentono di attivare lo scorrimento per pagina o di passare direttamente alla posizione di clic.","Se impostata, la barra di scorrimento orizzontale non aumenter\xE0 le dimensioni del contenuto dell'editor.","Controlla se tutti i caratteri ASCII non di base sono evidenziati. Solo i caratteri compresi tra U+0020 e U+007E, tabulazione, avanzamento riga e ritorno a capo sono considerati ASCII di base.","Controlla se i caratteri che riservano spazio o non hanno larghezza sono evidenziati.","Controlla se i caratteri che possono essere confusi con i caratteri ASCII di base sono evidenziati, ad eccezione di quelli comuni nelle impostazioni locali dell'utente corrente.","Controlla se anche i caratteri nei commenti devono essere soggetti a evidenziazione Unicode.","Controlla se anche i caratteri nelle stringhe devono essere soggetti all'evidenziazione Unicode.","Definisce i caratteri consentiti che non vengono evidenziati.","I caratteri Unicode comuni nelle impostazioni locali consentite non vengono evidenziati.","Controlla se visualizzare automaticamente i suggerimenti inline nell'Editor.","Mostra la barra degli strumenti dei suggerimenti in linea ogni volta che viene visualizzato un suggerimento in linea.","Mostra la barra degli strumenti dei suggerimenti in linea quando al passaggio del mouse su un suggerimento in linea.","Non mostrare mai la barra dei suggerimenti in linea.","Controlla quando mostrare la barra dei suggerimenti in linea.","Controlla la modalit\xE0 di interazione dei suggerimenti inline con il widget dei suggerimenti. Se questa opzione \xE8 abilitata, il widget dei suggerimenti non viene visualizzato automaticamente quando sono disponibili suggerimenti inline.","Controlla la famiglia di caratteri dei suggerimenti inline.","Controlla se la colorazione delle coppie di parentesi \xE8 abilitata. Usare {0} per eseguire l'override dei colori di evidenziazione delle parentesi.","Controlla se ogni tipo di parentesi ha un pool di colori indipendente.","Abilita le guide per coppie di parentesi quadre.","Abilita le guide delle coppie di parentesi solo per la coppia di parentesi attive.","Disabilita le guide per coppie di parentesi quadre.","Controlla se le guide delle coppie di parentesi sono abilitate o meno.","Abilita le guide orizzontali come aggiunta alle guide per coppie di parentesi verticali.","Abilita le guide orizzontali solo per la coppia di parentesi attive.","Disabilita le guide per coppie di parentesi orizzontali.","Controlla se le guide orizzontali delle coppie di parentesi sono abilitate o meno.","Controlla se l'editor debba evidenziare la coppia di parentesi attive.","Controlla se l'editor deve eseguire il rendering delle guide con rientro.","Evidenzia la guida di rientro attiva.","Evidenzia la guida di rientro attiva anche se le guide delle parentesi quadre sono evidenziate.","Non evidenziare la guida di rientro attiva.","Controlla se l'editor deve evidenziare la guida con rientro attiva.","Inserisce il suggerimento senza sovrascrivere il testo a destra del cursore.","Inserisce il suggerimento e sovrascrive il testo a destra del cursore.","Controlla se le parole vengono sovrascritte quando si accettano i completamenti. Tenere presente che questa opzione dipende dalle estensioni che accettano esplicitamente questa funzionalit\xE0.","Controlla se i suggerimenti di filtro e ordinamento valgono per piccoli errori di battitura.","Controlla se l'ordinamento privilegia le parole che appaiono pi\xF9 vicine al cursore.","Controlla se condividere le selezioni dei suggerimenti memorizzati tra aree di lavoro e finestre (richiede `#editor.suggestSelection#`).","Selezionare sempre un suggerimento quando si attiva automaticamente IntelliSense.","Non selezionare mai un suggerimento quando si attiva automaticamente IntelliSense.","Selezionare un suggerimento solo quando si attiva IntelliSense da un carattere di trigger.","Selezionare un suggerimento solo quando si attiva IntelliSense durante la digitazione.","Controlla se viene selezionato un suggerimento quando viene visualizzato il widget. Si noti che questo si applica solo ai suggerimenti attivati automaticamente ('#editor.quickSuggestions#' e '#editor.suggestOnTriggerCharacters#') e che un suggerimento viene sempre selezionato quando viene richiamato in modo esplicito, ad esempio tramite 'CTRL+BARRA SPAZIATRICE'.","Controlla se un frammento attivo impedisce i suggerimenti rapidi.","Controlla se mostrare o nascondere le icone nei suggerimenti.","Controlla la visibilit\xE0 della barra di stato nella parte inferiore del widget dei suggerimenti.","Controlla se visualizzare in anteprima il risultato del suggerimento nell'Editor.","Controlla se i dettagli del suggerimento vengono visualizzati inline con l'etichetta o solo nel widget dei dettagli.","Questa impostazione \xE8 deprecata. Il widget dei suggerimenti pu\xF2 ora essere ridimensionato.","Questa impostazione \xE8 deprecata. In alternativa, usare impostazioni diverse, come 'editor.suggest.showKeywords' o 'editor.suggest.showSnippets'.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `method`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `function`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `constructor`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `deprecated`.","Quando \xE8 abilitato, il filtro IntelliSense richiede che il primo carattere corrisponda all'inizio di una parola, ad esempio 'c' per 'Console' o 'WebContext' ma _non_ per 'description'. Quando \xE8 disabilitato, IntelliSense mostra pi\xF9 risultati, ma li ordina comunque in base alla qualit\xE0 della corrispondenza.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `field`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `variable`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `class`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `struct`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `interface`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `module`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `property`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `event`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `operator`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `unit`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `value`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `constant`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `enum`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `enumMember`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `keyword`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `text`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `color`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `file`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `reference`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `customcolor`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `folder`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `typeParameter`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `snippet`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `user`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `issues`.","Indica se gli spazi vuoti iniziali e finali devono essere sempre selezionati.","Indica se \xE8 necessario selezionare le sottoparole ( come 'foo' in 'fooBar' o 'foo_bar').","Nessun rientro. Le righe con ritorno a capo iniziano dalla colonna 1. ","Le righe con ritorno a capo hanno lo stesso rientro della riga padre.","Le righe con ritorno a capo hanno un rientro di +1 rispetto alla riga padre.","Le righe con ritorno a capo hanno un rientro di +2 rispetto alla riga padre.","Controlla il rientro delle righe con ritorno a capo.","Controlla se \xE8 possibile trascinare un file in un editor di testo tenendo premuto il tasto \u201CMAIUSC\u201D (invece di aprire il file in un editor).","Controlla se viene visualizzato un widget quando si rilasciano file nell'editor. Questo widget consente di controllare la modalit\xE0 di rilascio del file.","Mostra il widget del selettore di rilascio dopo il rilascio di un file nell'editor.","Non visualizzare mai il widget del selettore di rilascio. Usare sempre il provider di rilascio predefinito.","Controlla se \xE8 possibile incollare il contenuto in modi diversi.","Controlla se viene visualizzato un widget quando si incolla il contenuto nell'editor. Questo widget consente di controllare il modo in cui il file viene incollato.","Mostra il widget del selettore dell'operazione Incolla dopo che il contenuto \xE8 stato incollato nell'editor.","Non visualizzare mai il widget del selettore dell'operazione Incolla. Usare sempre il comportamento dell'operazione Incolla predefinito.","Controlla se accettare i suggerimenti con i caratteri di commit. Ad esempio, in JavaScript il punto e virgola (';') pu\xF2 essere un carattere di commit che accetta un suggerimento e digita tale carattere.","Accetta un suggerimento con 'Invio' solo quando si apporta una modifica al testo.","Controlla se i suggerimenti devono essere accettati con 'INVIO' in aggiunta a 'TAB'. In questo modo \xE8 possibile evitare ambiguit\xE0 tra l'inserimento di nuove righe e l'accettazione di suggerimenti.","Controlla il numero di righe nell'Editor che possono essere lette alla volta da un utilit\xE0 per la lettura dello schermo. Quando viene rilevata un'utilit\xE0 per la lettura dello schermo, questo valore viene impostato su 500 per impostazione predefinita. Avviso: questa opzione pu\xF2 influire sulle prestazioni se il numero di righe \xE8 superiore a quello predefinito.","Contenuto editor","Controllare se i suggerimenti inline vengono annunciati da un'utilit\xE0 per la lettura dello schermo.","Usa le configurazioni del linguaggio per determinare la chiusura automatica delle parentesi.","Chiudi automaticamente le parentesi solo quando il cursore si trova alla sinistra di uno spazio vuoto.","Controlla se l'editor deve chiudere automaticamente le parentesi quadre dopo che sono state aperte.","Usare le configurazioni del linguaggio per determinare la chiusura automatica dei commenti.","Chiudere automaticamente i commenti solo quando il cursore si trova alla sinistra di uno spazio vuoto.","Controlla se l'editor deve chiudere automaticamente i commenti dopo che sono stati aperti.","Rimuove le virgolette o le parentesi quadre di chiusura adiacenti solo se sono state inserite automaticamente.","Controlla se l'editor deve rimuovere le virgolette o le parentesi quadre di chiusura adiacenti durante l'eliminazione.","Digita sopra le virgolette o le parentesi quadre di chiusura solo se sono state inserite automaticamente.","Controlla se l'editor deve digitare su virgolette o parentesi quadre.","Usa le configurazioni del linguaggio per determinare la chiusura automatica delle virgolette.","Chiudi automaticamente le virgolette solo quando il cursore si trova alla sinistra di uno spazio vuoto.","Controlla se l'editor deve chiudere automaticamente le citazioni dopo che sono state aperte.","L'editor non inserir\xE0 automaticamente il rientro.","L'editor manterr\xE0 il rientro della riga corrente.","L'editor manterr\xE0 il rientro della riga corrente e rispetter\xE0 le parentesi definite dalla lingua.","L'editor manterr\xE0 il rientro della riga corrente, rispetter\xE0 le parentesi definite dalla lingua e richiamer\xE0 le regole onEnterRules speciali definite dalle lingue.","L'editor manterr\xE0 il rientro della riga corrente, rispetter\xE0 le parentesi definite dalla lingua, richiamer\xE0 le regole onEnterRules speciali definite dalle lingue e rispetter\xE0 le regole indentationRules definite dalle lingue.","Controlla se l'editor deve regolare automaticamente il rientro quando gli utenti digitano, incollano, spostano le righe o applicano il rientro.","Usa le configurazioni del linguaggio per determinare quando racchiudere automaticamente le selezioni tra parentesi quadre o virgolette.","Racchiude la selezione tra virgolette ma non tra parentesi quadre.","Racchiude la selezione tra parentesi quadre ma non tra virgolette.","Controlla se l'editor deve racchiudere automaticamente le selezioni quando si digitano virgolette o parentesi quadre.","Emula il comportamento di selezione dei caratteri di tabulazione quando si usano gli spazi per il rientro. La selezione verr\xE0 applicata alle tabulazioni.","Controlla se l'editor visualizza CodeLens.","Controlla la famiglia di caratteri per CodeLens.","Controlla le dimensioni del carattere in pixel per CodeLens. Quando \xE8 impostata su 0, viene usato il 90% del valore di '#editor.fontSize#'.","Controlla se l'editor deve eseguire il rendering della selezione colori e degli elementi Decorator di tipo colore inline.","Fare in modo che la selezione colori venga visualizzata sia al clic che al passaggio del mouse sull\u2019elemento Decorator colore","Fare in modo che la selezione colori venga visualizzata al passaggio del mouse sull'elemento Decorator colore","Fare in modo che la selezione colori venga visualizzata quando si fa clic sull'elemento Decorator colore","Controlla la condizione in modo che venga visualizzata la selezione colori da un elemento Decorator colore.","Controlla il numero massimo di elementi Decorator a colori di cui \xE8 possibile eseguire il rendering in un editor contemporaneamente.","Abilita l'uso di mouse e tasti per la selezione delle colonne.","Controlla se l'evidenziazione della sintassi deve essere copiata negli Appunti.","Controllo dello stile di animazione del cursore.","L'animazione con cursore arrotondato \xE8 disabilitata.","L'animazione con cursore uniforme \xE8 abilitata solo quando l'utente sposta il cursore con un movimento esplicito.","L'animazione con cursore uniforme \xE8 sempre abilitata.","Controlla se l'animazione del cursore con anti-aliasing deve essere abilitata.","Controlla lo stile del cursore.","Controllare il numero minimo di linee iniziali visibili (minimo 0) e finali (minimo 1) visibili che circondano il cursore. Noto come 'scrollOff' o 'scrollOffset' in altri editor.","`cursorSurroundingLines` viene applicato solo quando \xE8 attivato tramite la tastiera o l'API.","`cursorSurroundingLines` viene sempre applicato.","Controlla quando deve essere applicato `cursorSurroundingLines`.","Controlla la larghezza del cursore quando `#editor.cursorStyle#` \xE8 impostato su `line`.","Controlla se l'editor deve consentire lo spostamento di selezioni tramite trascinamento della selezione.","Usare un nuovo metodo di rendering con svgs.","Usare un nuovo metodo di rendering con tipi di caratteri.","Usare il metodo di rendering stabile.","Controlla se viene eseguito il rendering degli spazi vuoti con un nuovo metodo sperimentale.","Moltiplicatore della velocit\xE0 di scorrimento quando si preme `Alt`.","Controlla se per l'editor \xE8 abilitata la riduzione del codice.","Usa una strategia di riduzione specifica della lingua, se disponibile; altrimenti ne usa una basata sui rientri.","Usa la strategia di riduzione basata sui rientri.","Controlla la strategia per il calcolo degli intervalli di riduzione.","Controlla se l'editor deve evidenziare gli intervalli con riduzione del codice.","Controlla se l'editor comprime automaticamente gli intervalli di importazione.","Numero massimo di aree riducibili. Se si aumenta questo valore, l'editor potrebbe diventare meno reattivo quando l'origine corrente contiene un numero elevato di aree riducibili.","Controlla se, facendo clic sul contenuto vuoto dopo una riga ridotta, la riga viene espansa.","Controlla la famiglia di caratteri.","Controlla se l'editor deve formattare automaticamente il contenuto incollato. Deve essere disponibile un formattatore che deve essere in grado di formattare un intervallo in un documento.","Controlla se l'editor deve formattare automaticamente la riga dopo la digitazione.","Controlla se l'editor deve eseguire il rendering del margine verticale del glifo. Il margine del glifo viene usato principalmente per il debug.","Controlla se il cursore deve essere nascosto nel righello delle annotazioni.","Controlla la spaziatura tra le lettere in pixel.","Controlla se la modifica collegata \xE8 abilitata per l'editor. A seconda del linguaggio, i simboli correlati, ad esempio i tag HTML, vengono aggiornati durante la modifica.","Controlla se l'editor deve individuare i collegamenti e renderli selezionabili.","Evidenzia le parentesi graffe corrispondenti.","Moltiplicatore da usare sui valori `deltaX` e `deltaY` degli eventi di scorrimento della rotellina del mouse.","Ingrandisce il carattere dell\u2019editor quando si usa la rotella del mouse e si tiene premuto `Cmd`.","Ingrandisce il carattere dell'editor quando si usa la rotellina del mouse e si tiene premuto 'CTRL'.","Unire i cursori multipli se sovrapposti.","Rappresenta il tasto 'Control' in Windows e Linux e il tasto 'Comando' in macOS.","Rappresenta il tasto 'Alt' in Windows e Linux e il tasto 'Opzione' in macOS.","Modificatore da usare per aggiungere pi\xF9 cursori con il mouse. I movimenti del mouse Vai alla definizione e Apri collegamento si adatteranno in modo da non entrare in conflitto con il [modificatore di selezione multipla](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).","Ogni cursore incolla una singola riga del testo.","Ogni cursore incolla il testo completo.","Controlla l'operazione Incolla quando il conteggio delle righe del testo incollato corrisponde al conteggio dei cursori.","Controlla il numero massimo di cursori che possono essere presenti in un editor attivo contemporaneamente.","Non evidenzia le occorrenze.","Evidenzia le occorrenze solo nel file corrente.","Sperimentale: evidenzia le occorrenze in tutti i file aperti validi.","Controlla se le occorrenze devono essere evidenziate nei file aperti.","Controlla se deve essere disegnato un bordo intorno al righello delle annotazioni.","Sposta lo stato attivo sull'albero quando si apre l'anteprima","Sposta lo stato attivo sull'editor quando si apre l'anteprima","Controlla se spostare lo stato attivo sull'editor inline o sull'albero nel widget di anteprima.","Controlla se il movimento del mouse Vai alla definizione consente sempre di aprire il widget di anteprima.","Controlla il ritardo in millisecondi dopo il quale verranno visualizzati i suggerimenti rapidi.","Controlla se l'editor viene rinominato automaticamente in base al tipo.","Deprecata. In alternativa, usare `editor.linkedEditing`.","Controlla se l'editor deve eseguire il rendering dei caratteri di controllo.","Esegue il rendering dell'ultimo numero di riga quando il file termina con un carattere di nuova riga.","Mette in evidenza sia la barra di navigazione sia la riga corrente.","Controlla in che modo l'editor deve eseguire il rendering dell'evidenziazione di riga corrente.","Controlla se l'editor deve eseguire il rendering dell'evidenziazione della riga corrente solo quando l'editor ha lo stato attivo.","Esegue il rendering dei caratteri di spazio vuoto ad eccezione dei singoli spazi tra le parole.","Esegui il rendering dei caratteri di spazio vuoto solo nel testo selezionato.","Esegui il rendering solo dei caratteri di spazio vuoto finali.","Controlla in che modo l'editor deve eseguire il rendering dei caratteri di spazio vuoto.","Controlla se le selezioni devono avere gli angoli arrotondati.","Controlla il numero di caratteri aggiuntivi oltre i quali l'editor scorrer\xE0 orizzontalmente.","Controlla se l'editor scorrer\xE0 oltre l'ultima riga.","Scorre solo lungo l'asse predominante durante lo scorrimento verticale e orizzontale simultaneo. Impedisce la deviazione orizzontale quando si scorre in verticale su un trackpad.","Controlla se gli appunti primari di Linux devono essere supportati.","Controlla se l'editor deve evidenziare gli elementi corrispondenti simili alla selezione.","Mostra sempre i comandi di riduzione.","Non visualizzare mai i controlli di riduzione e diminuire le dimensioni della barra di navigazione.","Mostra i comandi di riduzione solo quando il mouse \xE8 posizionato sul margine della barra di scorrimento.","Controlla se i controlli di riduzione sul margine della barra di scorrimento vengono visualizzati.","Controllo dissolvenza del codice inutilizzato.","Controlla le variabili deprecate barrate.","Visualizza i suggerimenti del frammento prima degli altri suggerimenti.","Visualizza i suggerimenti del frammento dopo gli altri suggerimenti.","Visualizza i suggerimenti del frammento insieme agli altri suggerimenti.","Non mostrare i suggerimenti del frammento.","Controlla se i frammenti di codice sono visualizzati con altri suggerimenti e il modo in cui sono ordinati.","Controlla se per lo scorrimento dell'editor verr\xE0 usata un'animazione.","Controlla se l'hint di accessibilit\xE0 deve essere fornito agli utenti dell'utilit\xE0 per la lettura dello schermo quando viene visualizzato un completamento inline.","Dimensioni del carattere per il widget dei suggerimenti. Se impostato su {0}, viene usato il valore di {1}.","Altezza della riga per il widget dei suggerimenti. Se impostato su {0}, viene usato il valore {1}. Il valore minimo \xE8 8.","Controlla se i suggerimenti devono essere visualizzati automaticamente durante la digitazione dei caratteri trigger.","Consente di selezionare sempre il primo suggerimento.","Consente di selezionare suggerimenti recenti a meno che continuando a digitare non ne venga selezionato uno, ad esempio `console.| ->; console.log` perch\xE9 `log` \xE8 stato completato di recente.","Consente di selezionare i suggerimenti in base a prefissi precedenti che hanno completato tali suggerimenti, ad esempio `co ->; console` e `con -> const`.","Controlla la modalit\xE0 di preselezione dei suggerimenti durante la visualizzazione dell'elenco dei suggerimenti.","La funzionalit\xE0 di completamento con tasto TAB inserir\xE0 il migliore suggerimento alla pressione del tasto TAB.","Disabilita le funzionalit\xE0 di completamento con tasto TAB.","Completa i frammenti con il tasto TAB quando i rispettivi prefissi corrispondono. Funziona in modo ottimale quando 'quickSuggestions' non \xE8 abilitato.","Abilit\xE0 la funzionalit\xE0 di completamento con tasto TAB.","I caratteri di terminazione di riga insoliti vengono rimossi automaticamente.","I caratteri di terminazione di riga insoliti vengono ignorati.","Prompt per i caratteri di terminazione di riga insoliti da rimuovere.","Rimuovi caratteri di terminazione di riga insoliti che potrebbero causare problemi.","Inserimento ed eliminazione dello spazio vuoto dopo le tabulazioni.","Usare la regola di interruzione di riga predefinita.","Le interruzioni di parola non devono essere usate per il testo cinese/giapponese/coreano (CJK). Il comportamento del testo non CJK \xE8 uguale a quello normale.","Controlla le regole di interruzione delle parole usate per il testo cinese/giapponese/coreano (CJK).","Caratteri che verranno usati come separatori di parola quando si eseguono operazioni o spostamenti correlati a parole.","Il ritorno a capo automatico delle righe non viene mai applicato.","Il ritorno a capo automatico delle righe viene applicato in corrispondenza della larghezza del viewport.","Il ritorno a capo automatico delle righe viene applicato in corrispondenza di `#editor.wordWrapColumn#`.","Il ritorno a capo automatico delle righe viene applicato in corrispondenza della larghezza minima del viewport e di `#editor.wordWrapColumn#`.","Controlla il ritorno a capo automatico delle righe.","Controlla la colonna per il ritorno a capo automatico dell'editor quando il valore di `#editor.wordWrap#` \xE8 `wordWrapColumn` o `bounded`.","Controllare se visualizzare le decorazioni colori incorporate usando il provider colori predefinito del documento","Controlla se l'editor riceve le schede o le rinvia al workbench per lo spostamento."],"vs/editor/common/core/editorColorRegistry":["Colore di sfondo per l'evidenziazione della riga alla posizione del cursore.","Colore di sfondo per il bordo intorno alla riga alla posizione del cursore.","Colore di sfondo degli intervalli evidenziati, ad esempio dalle funzionalit\xE0 Quick Open e Trova. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo del bordo intorno agli intervalli selezionati.","Colore di sfondo del simbolo evidenziato, ad esempio per passare alla definizione o al simbolo successivo/precedente. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo del bordo intorno ai simboli selezionati.","Colore del cursore dell'editor.","Colore di sfondo del cursore editor. Permette di personalizzare il colore di un carattere quando sovrapposto da un blocco cursore.","Colore dei caratteri di spazio vuoto nell'editor.","Colore dei numeri di riga dell'editor.","Colore delle guide per i rientri dell'editor.","'editorIndentGuide.background' \xE8 deprecato. Usare 'editorIndentGuide.background1'.","Colore delle guide di indentazione dell'editor attivo","'editorIndentGuide.activeBackground' \xE8 deprecato. Usare 'editorIndentGuide.activeBackground1'.","Colore delle guide per i rientri dell'editor (1).","Colore delle guide per i rientri dell'editor (2).","Colore delle guide per i rientri dell'editor (3).","Colore delle guide per i rientri dell'editor (4).","Colore delle guide per i rientri dell'editor (5).","Colore delle guide per i rientri dell'editor (6).","Colore delle guide di indentazione dell'editor attivo (1).","Colore delle guide di indentazione dell'editor attivo (2).","Colore delle guide di indentazione dell'editor attivo (3).","Colore delle guide di indentazione dell'editor attivo (4).","Colore delle guide di indentazione dell'editor attivo (5).","Colore delle guide di indentazione dell'editor attivo (6).","Colore del numero di riga attivo dell'editor","Id \xE8 deprecato. In alternativa usare 'editorLineNumber.activeForeground'.","Colore del numero di riga attivo dell'editor","Colore della riga dell'editor finale quando editor.renderFinalNewline \xE8 impostato su in grigio.","Colore dei righelli dell'editor.","Colore primo piano delle finestre di CodeLens dell'editor","Colore di sfondo delle parentesi corrispondenti","Colore delle caselle di parentesi corrispondenti","Colore del bordo del righello delle annotazioni.","Colore di sfondo del righello delle annotazioni dell'editor.","Colore di sfondo della barra di navigazione dell'editor. La barra contiene i margini di glifo e i numeri di riga.","Colore del bordo del codice sorgente non necessario (non usato) nell'editor.",`Opacit\xE0 del codice sorgente non necessario (non usato) nell'editor. Ad esempio, con "#000000c0" il rendering del codice verr\xE0 eseguito con il 75% di opacit\xE0. Per i temi a contrasto elevato, usare il colore del tema 'editorUnnecessaryCode.border' per sottolineare il codice non necessario invece di opacizzarlo.`,"Colore del bordo del testo fantasma nell'Editor.","Colore primo piano del testo fantasma nell'Editor.","Colore di sfondo del testo fantasma nell'editor.","Colore del marcatore del righello delle annotazioni per le evidenziazioni degli intervalli. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del marcatore del righello delle annotazioni per gli errori.","Colore del marcatore del righello delle annotazioni per gli avvisi.","Colore del marcatore del righello delle annotazioni per i messaggi di tipo informativo.","Colore primo piano delle parentesi quadre (1). Richiede l'abilitazione della colorazione delle coppie di parentesi quadre.","Colore primo piano delle parentesi quadre (2). Richiede l'abilitazione della colorazione delle coppie di parentesi quadre.","Colore primo piano delle parentesi quadre (3). Richiede l'abilitazione della colorazione delle coppie di parentesi quadre.","Colore primo piano delle parentesi quadre (4). Richiede l'abilitazione della colorazione delle coppie di parentesi quadre.","Colore primo piano delle parentesi quadre (5). Richiede l'abilitazione della colorazione delle coppie di parentesi quadre.","Colore primo piano delle parentesi quadre (6). Richiede l'abilitazione della colorazione delle coppie di parentesi quadre.","Colore di primo piano delle parentesi impreviste.","Colore di sfondo delle guide per coppie di parentesi inattive (1). Richiede l'abilitazione delle guide per coppie di parentesi.","Colore di sfondo delle guide per coppie di parentesi inattive (2). Richiede l'abilitazione delle guide per coppie di parentesi.","Colore di sfondo delle guide per coppie di parentesi inattive (3). Richiede l'abilitazione delle guide per coppie di parentesi.","Colore di sfondo delle guide per coppie di parentesi inattive (4). Richiede l'abilitazione delle guide per coppie di parentesi.","Colore di sfondo delle guide per coppie di parentesi inattive (5). Richiede l'abilitazione delle guide per coppie di parentesi.","Colore di sfondo delle guide per coppie di parentesi inattive (6). Richiede l'abilitazione delle guide per coppie di parentesi.","Colore di sfondo delle guide per coppie di parentesi attive (1). Richiede l'abilitazione delle guide per coppie di parentesi.","Colore di sfondo delle guide per coppie di parentesi attive (2). Richiede l'abilitazione delle guide per coppie di parentesi.","Colore di sfondo delle guide per coppie di parentesi attive (3). Richiede l'abilitazione delle guide per coppie di parentesi.","Colore di sfondo delle guide per coppie di parentesi attive (4). Richiede l'abilitazione delle guide per coppie di parentesi.","Colore di sfondo delle guide per coppie di parentesi attive (5). Richiede l'abilitazione delle guide per coppie di parentesi.","Colore di sfondo delle guide per coppie di parentesi attive (6). Richiede l'abilitazione delle guide per coppie di parentesi.","Colore del bordo utilizzato per evidenziare i caratteri Unicode.","Colore di sfondo usato per evidenziare i caratteri Unicode."],"vs/editor/common/editorContextKeys":["Indica se il testo dell'editor ha lo stato attivo (il cursore lampeggia)","Indica se l'editor o un widget dell'editor ha lo stato attivo (ad esempio, lo stato attivo si trova nel widget di ricerca)","Indica se un editor o un input RTF ha lo stato attivo (il cursore lampeggia)","Indica se l'editor \xE8 di sola lettura","Indica se il contesto \xE8 un editor diff","Indica se il contesto \xE8 un editor diff incorporato","Indica se il contesto \xE8 un editor con pi\xF9 differenze","Indica se tutti i file nell'editor con pi\xF9 differenze sono compressi","Indica se l'editor diff ha delle modifiche","Indica se un blocco di codice spostato \xE8 selezionato per il confronto","Indica se il visualizzatore differenze accessibile \xE8 visibile","Indica se viene raggiunto il punto di interruzione inline side-by-side per il rendering dell'editor diff","Indica se `editor.columnSelection` \xE8 abilitato","Indica se per l'editor esiste testo selezionato","Indica se per l'editor esistono pi\xF9 selezioni","Indica se premendo `TAB`, lo stato attivo verr\xE0 spostato all'esterno dell'editor","Indica se il passaggio del puntatore nell'editor \xE8 visibile","Indica se l'area sensibile al passaggio del mouse dell'edito \xE8 attivata","Indica se lo scorrimento permanente \xE8 attivo","Indica se lo scorrimento permanente \xE8 visibile","Indicare se la selezione colori autonoma \xE8 visibile","Indicare se la selezione colori autonoma \xE8 evidenziata","Indica se l'editor fa parte di un editor pi\xF9 esteso (ad esempio notebook)","Identificatore lingua dell'editor","Indica se per l'editor esiste un provider di voci di completamento","Indica se per l'editor esiste un provider di azioni codice","Indica se per l'editor esiste un provider di CodeLens","Indica se per l'editor esiste un provider di definizioni","Indica se per l'editor esiste un provider di dichiarazioni","Indica se per l'editor esiste un provider di implementazioni","Indica se per l'editor esiste un provider di definizioni di tipo","Indica se per l'editor esiste un provider di passaggi del mouse","Indica se per l'editor esiste un provider di evidenziazione documenti","Indica se per l'editor esiste un provider di simboli di documenti","Indica se per l'editor esiste un provider di riferimenti","Indica se per l'editor esiste un provider di ridenominazione","Indica se per l'editor esiste un provider della guida per la firma","Indica se per l'editor esiste un provider di suggerimenti inline","Indica se per l'editor esiste un provider di formattazione documenti","Indica se per l'editor esiste un provider di formattazione di selezioni documento","Indica se per l'editor esistono pi\xF9 provider di formattazione documenti","Indica se per l'editor esistono pi\xF9 provider di formattazione di selezioni documento"],"vs/editor/common/languages":["matrice","valore booleano","classe","costante","costruttore","enumerazione","membro di enumerazione","evento","campo","file","funzione","interfaccia","chiave","metodo","modulo","spazio dei nomi","Null","numero","oggetto","operatore","pacchetto","propriet\xE0","stringa","struct","parametro di tipo","variabile","{0} ({1})"],"vs/editor/common/languages/modesRegistry":["Testo normale"],"vs/editor/common/model/editStack":["Digitazione"],"vs/editor/common/standaloneStrings":["Sviluppatore: Controlla token","Vai a Riga/Colonna...","Mostra tutti i provider di accesso rapido","Riquadro comandi","Mostra ed esegui comandi","Vai al simbolo...","Vai al simbolo per categoria...","Contenuto editor","Premere ALT+F1 per le opzioni di accessibilit\xE0.","Attiva/disattiva tema a contrasto elevato","Effettuate {0} modifiche in {1} file"],"vs/editor/common/viewLayout/viewLineRenderer":["Mostra di pi\xF9 ({0})","{0} caratteri"],"vs/editor/contrib/anchorSelect/browser/anchorSelect":["Ancoraggio della selezione","Ancoraggio impostato alla posizione {0}:{1}","Imposta ancoraggio della selezione","Vai ad ancoraggio della selezione","Seleziona da ancoraggio a cursore","Annulla ancoraggio della selezione"],"vs/editor/contrib/bracketMatching/browser/bracketMatching":["Colore del marcatore del righello delle annotazioni per la corrispondenza delle parentesi.","Vai alla parentesi quadra","Seleziona fino alla parentesi","Rimuovi parentesi quadre","Vai alla parentesi &&quadra","Selezionare il testo all'interno includendo le parentesi o le parentesi graffe"],"vs/editor/contrib/caretOperations/browser/caretOperations":["Sposta testo selezionato a sinistra","Sposta testo selezionato a destra"],"vs/editor/contrib/caretOperations/browser/transpose":["Trasponi lettere"],"vs/editor/contrib/clipboard/browser/clipboard":["&&Taglia","Taglia","Taglia","Taglia","&&Copia","Copia","Copia","Copia","Copia con nome","Copia con nome","Condividi","Condividi","Condividi","&&Incolla","Incolla","Incolla","Incolla","Copia con evidenziazione sintassi"],"vs/editor/contrib/codeAction/browser/codeAction":["Si \xE8 verificato un errore sconosciuto durante l'applicazione dell'azione del codice"],"vs/editor/contrib/codeAction/browser/codeActionCommands":["Tipo dell'azione codice da eseguire.","Controlla quando vengono applicate le azioni restituite.","Applica sempre la prima azione codice restituita.","Applica la prima azione codice restituita se \xE8 l'unica.","Non applicare le azioni codice restituite.","Controlla se devono essere restituite solo le azioni codice preferite.","Correzione rapida...","Azioni codice non disponibili","Non sono disponibili azioni codice preferite per '{0}'","Non sono disponibili azioni codice per '{0}'","Non sono disponibili azioni codice preferite","Azioni codice non disponibili","Effettua refactoring...","Non sono disponibili refactoring preferiti per '{0}'","Non sono disponibili refactoring per '{0}'","Non sono disponibili refactoring preferiti","Refactoring non disponibili","Azione origine...","Non sono disponibili azioni origine preferite per '{0}'","Non sono disponibili azioni origine per '{0}'","Non sono disponibili azioni origine preferite","Azioni origine non disponibili","Organizza import","Azioni di organizzazione Imports non disponibili","Correggi tutto","Non \xE8 disponibile alcuna azione Correggi tutto","Correzione automatica...","Non sono disponibili correzioni automatiche"],"vs/editor/contrib/codeAction/browser/codeActionContributions":["Abilita/disabilita la visualizzazione delle intestazioni gruppo nel menu Azione codice.","Abilita/disabilita la visualizzazione della correzione rapida pi\xF9 vicino all'interno di una riga quando non \xE8 attualmente in una diagnostica."],"vs/editor/contrib/codeAction/browser/codeActionController":["Contesto: {0} alla riga {1} e alla colonna {2}.","Nascondi elementi disabilitati","Mostra elementi disabilitati"],"vs/editor/contrib/codeAction/browser/codeActionMenu":["Altre azioni...","Correzione rapida","Estrai","Inline","Riscrivi","Sposta","Racchiudi tra","Azione di origine"],"vs/editor/contrib/codeAction/browser/lightBulbWidget":["Esegui: {0}","Mostra azioni codice. Correzione rapida preferita disponibile ({0})","Mostra Azioni codice ({0})","Mostra Azioni codice"],"vs/editor/contrib/codelens/browser/codelensController":["Mostra comandi di CodeLens per la riga corrente","Selezionare un comando"],"vs/editor/contrib/colorPicker/browser/colorPickerWidget":["Fare clic per attivare/disattivare le opzioni di colore (rgb/hsl/hex)","Icona per chiudere la selezione colori"],"vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions":["Mostra o sposta lo stato attivo su Selezione colori autonomo","&&Mostra o sposta lo stato attivo su Selezione colori autonomo","Nascondere la Selezione colori","Inserire colore con Selezione colori autonomo"],"vs/editor/contrib/comment/browser/comment":["Attiva/disattiva commento per la riga","Attiva/Disattiva commento per la &&riga","Aggiungi commento per la riga","Rimuovi commento per la riga","Attiva/Disattiva commento per il blocco","Attiva/Disattiva commento per il &&blocco"],"vs/editor/contrib/contextmenu/browser/contextmenu":["Minimappa","Esegui rendering dei caratteri","Dimensioni verticali","Proporzionale","Riempimento","Adatta","Dispositivo di scorrimento","Passaggio del mouse","Sempre","Mostra il menu di scelta rapida editor"],"vs/editor/contrib/cursorUndo/browser/cursorUndo":["Cursore - Annulla","Cursore - Ripeti"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution":["Incolla come...","ID della modifica dell'operazione Incolla da provare ad applicare. Se non viene specificato, l'editor mostrer\xE0 un controllo di selezione.","Incolla come testo"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteController":["Indica se il widget dell'operazione Incolla viene visualizzato","Mostra opzioni operazione Incolla...","Non \xE8 stata trovata alcuna modifica incolla per '{0}'","Esecuzione dei gestori del comando Incolla. Fare clic per annullare","Seleziona azione Incolla","Esecuzione dei gestori Incolla in corso"],"vs/editor/contrib/dropOrPasteInto/browser/defaultProviders":["Predefinita","Inserire testo normale","Inserire l'URL","Inserire l'Uri","Inserire percorsi","Inserire percorso","Inserire percorsi relativi","Inserire percorso relativo","Inserisci HTML"],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution":["Configura il provider di eliminazione predefinito da usare per il contenuto di un tipo MIME specifico."],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController":["Indica se il widget di rilascio viene visualizzato","Mostra opzioni di rilascio...","Esecuzione dei gestori di rilascio. Fare clic per annullare"],"vs/editor/contrib/editorState/browser/keybindingCancellation":["Indica se l'editor esegue un'operazione annullabile, ad esempio 'Anteprima riferimenti'"],"vs/editor/contrib/find/browser/findController":["Il file \xE8 troppo grande per eseguire un'operazione di sostituzione.","Trova","&&Trova","Trova con gli argomenti","Trova con selezione","Trova successivo","Trova precedente","Andare a Corrispondenza...","Nessuna corrispondenza. Provare a cercare qualcos'altro.","Digitare un numero per passare a una corrispondenza specifica (tra 1 e {0})","Digitare un numero compreso tra 1 e {0}","Digitare un numero compreso tra 1 e {0}","Trova selezione successiva","Trova selezione precedente","Sostituisci","&&Sostituisci"],"vs/editor/contrib/find/browser/findWidget":["Icona per 'Trova nella selezione' nel widget di ricerca dell'editor.","Icona per indicare che il widget di ricerca dell'editor \xE8 compresso.","Icona per indicare che il widget di ricerca dell'editor \xE8 espanso.","Icona per 'Sostituisci' nel widget di ricerca dell'editor.","Icona per 'Sostituisci tutto' nel widget di ricerca dell'editor.","Icona per 'Trova precedente' nel widget di ricerca dell'editor.","Icona per 'Trova successivo' nel widget di ricerca dell'editor.","Trova/Sostituisci","Trova","Trova","Risultato precedente","Risultato successivo","Trova nella selezione","Chiudi","Sostituisci","Sostituisci","Sostituisci","Sostituisci tutto","Attiva/Disattiva sostituzione","Solo i primi {0} risultati vengono evidenziati, ma tutte le operazioni di ricerca funzionano su tutto il testo.","{0} di {1}","Nessun risultato","{0} trovato","{0} trovati per '{1}'","{0} trovati per '{1}' alla posizione {2}","{0} trovati per '{1}'","Il tasto di scelta rapida CTRL+INVIO ora consente di inserire l'interruzione di linea invece di sostituire tutto. Per eseguire l'override di questo comportamento, \xE8 possibile modificare il tasto di scelta rapida per editor.action.replaceAll."],"vs/editor/contrib/folding/browser/folding":["Espandi","Espandi in modo ricorsivo","Riduci","Attiva/Disattiva riduzione","Riduci in modo ricorsivo","Riduci tutti i blocchi commento","Riduci tutte le regioni","Espandi tutte le regioni","Riduci tutto tranne selezionato","Espandi tutto tranne selezionato","Riduci tutto","Espandi tutto","Vai alla cartella principale","Passa all'intervallo di riduzione precedente","Passa all'intervallo di riduzione successivo","Creare intervallo di riduzione dalla selezione","Rimuovi intervalli di riduzione manuale","Livello riduzione {0}"],"vs/editor/contrib/folding/browser/foldingDecorations":["Colore di sfondo degli intervalli con riduzione. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del controllo di riduzione nella barra di navigazione dell'editor.","Icona per gli intervalli espansi nel margine del glifo dell'editor.","Icona per gli intervalli compressi nel margine del glifo dell'editor.","Icona per gli intervalli compressi nel margine del glifo dell'editor.","Icona per gli intervalli espansi manualmente nel margine del glifo dell'editor.","Fare clic per espandere l\u2019intervallo.","Fare clic per comprimere l'intervallo."],"vs/editor/contrib/fontZoom/browser/fontZoom":["Aumenta le dimensioni del carattere dell'editor","Riduci le dimensioni del carattere dell'editor","Reimposta dimensioni carattere editor"],"vs/editor/contrib/format/browser/formatActions":["Formatta documento","Formatta selezione"],"vs/editor/contrib/gotoError/browser/gotoError":["Vai al problema successivo (Errore, Avviso, Informazioni)","Icona per il marcatore Vai a successivo.","Vai al problema precedente (Errore, Avviso, Informazioni)","Icona per il marcatore Vai a precedente.","Vai al problema successivo nei file (Errore, Avviso, Informazioni)","&&Problema successivo","Vai al problema precedente nei file (Errore, Avviso, Informazioni)","&&Problema precedente"],"vs/editor/contrib/gotoError/browser/gotoErrorWidget":["Errore","Avviso","Info","Suggerimento","{0} a {1}. ","{0} di {1} problemi","{0} di {1} problema","Colore per gli errori del widget di spostamento tra marcatori dell'editor.","Intestazione errore per lo sfondo del widget di spostamento tra marcatori dell'editor.","Colore per gli avvisi del widget di spostamento tra marcatori dell'editor.","Intestazione avviso per lo sfondo del widget di spostamento tra marcatori dell'editor.","Colore delle informazioni del widget di navigazione marcatori dell'editor.","Intestazione informativa per lo sfondo del widget di spostamento tra marcatori dell'editor.","Sfondo del widget di spostamento tra marcatori dell'editor."],"vs/editor/contrib/gotoSymbol/browser/goToCommands":["Anteprima","Definizioni","Non \xE8 stata trovata alcuna definizione per '{0}'","Non \xE8 stata trovata alcuna definizione","Vai alla definizione","Vai alla &&definizione","Apri definizione lateralmente","Visualizza in anteprima la definizione","Dichiarazioni","Non \xE8 stata trovata alcuna dichiarazione per '{0}'","Dichiarazione non trovata","Vai a dichiarazione","Vai a &&dichiarazione","Non \xE8 stata trovata alcuna dichiarazione per '{0}'","Dichiarazione non trovata","Anteprima dichiarazione","Definizioni di tipo","Non sono state trovate definizioni di tipi per '{0}'","Non sono state trovate definizioni di tipi","Vai alla definizione di tipo","Vai alla &&definizione di tipo","Anteprima definizione di tipo","Implementazioni","Non sono state trovate implementazioni per '{0}'","Non sono state trovate implementazioni","Vai a implementazioni","Vai a &&Implementazioni","Visualizza implementazioni","Non sono stati trovati riferimenti per '{0}'","Non sono stati trovati riferimenti","Vai a Riferimenti","Vai a &&riferimenti","Riferimenti","Anteprima riferimenti","Riferimenti","Vai a qualsiasi simbolo","Posizioni","Nessun risultato per '{0}'","Riferimenti"],"vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition":["Fare clic per visualizzare {0} definizioni."],"vs/editor/contrib/gotoSymbol/browser/peek/referencesController":["Indica se l'anteprima riferimenti \xE8 visibile, come 'Visualizza in anteprima riferimenti' o 'Visualizza in anteprima la definizione'","Caricamento...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesTree":["{0} riferimenti","{0} riferimento","Riferimenti"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget":["anteprima non disponibile","Nessun risultato","Riferimenti"],"vs/editor/contrib/gotoSymbol/browser/referencesModel":["in {0} alla riga {1} della colonna {2}","{0} in {1} alla riga {2} della colonna {3}","1 simbolo in {0}, percorso completo {1}","{0} simboli in {1}, percorso completo {2}","Non sono stati trovati risultati","Trovato 1 simbolo in {0}","Trovati {0} simboli in {1}","Trovati {0} simboli in {1} file"],"vs/editor/contrib/gotoSymbol/browser/symbolNavigation":["Indica se sono presenti posizioni dei simboli a cui \xE8 possibile passare solo tramite la tastiera.","Simbolo {0} di {1}, {2} per il successivo","Simbolo {0} di {1}"],"vs/editor/contrib/hover/browser/hover":["Mostra o sposta lo stato attivo al passaggio del mouse","Il passaggio del mouse non attiver\xE0 automaticamente lo stato attivo.","Il passaggio del mouse attiver\xE0 lo stato attivo solo se \xE8 gi\xE0 visibile.","Il passaggio del mouse assume automaticamente lo stato attivo quando viene visualizzato.","Mostra anteprima definizione al passaggio del mouse","Scorri verso l'alto al passaggio del mouse","Scorri verso il basso al passaggio del mouse","Scorri a sinistra al passaggio del mouse","Scorri a destra al passaggio del mouse","Vai alla pagina precedente al passaggio del mouse","Vai alla pagina successiva al passaggio del mouse","Vai in alto al passaggio del mouse","Vai in basso al passaggio del mouse"],"vs/editor/contrib/hover/browser/markdownHoverParticipant":["Caricamento...","Rendering sospeso per una linea lunga per motivi di prestazioni. Pu\xF2 essere configurato tramite 'editor.stopRenderingLineAfter'.","Per motivi di prestazioni la tokenizzazione viene ignorata per le righe lunghe. \xC8 possibile effettuare questa configurazione tramite `editor.maxTokenizationLineLength`."],"vs/editor/contrib/hover/browser/markerHoverParticipant":["Visualizza problema","Non sono disponibili correzioni rapide","Verifica disponibilit\xE0 correzioni rapide...","Non sono disponibili correzioni rapide","Correzione rapida..."],"vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace":["Sostituisci con il valore precedente","Sostituisci con il valore successivo"],"vs/editor/contrib/indentation/browser/indentation":["Converti rientro in spazi","Converti rientro in tabulazioni","Dimensione tabulazione configurata","Dimensioni predefinite della scheda","Dimensioni della scheda corrente","Seleziona dimensione tabulazione per il file corrente","Imposta rientro con tabulazioni","Imposta rientro con spazi","Modifica dimensioni visualizzazione scheda","Rileva rientro dal contenuto","Imposta nuovo rientro per righe","Re-Indenta le Linee Selezionate"],"vs/editor/contrib/inlayHints/browser/inlayHintsHover":["Fare doppio clic per inserire","CMD+clic","CTRL+clic","Opzione+clic","ALT+clic","Vai alla definizione ({0}), fai clic con il pulsante destro del mouse per altre informazioni","Vai alla definizione ({0})","Esegui il comando"],"vs/editor/contrib/inlineCompletions/browser/commands":["Mostrare suggerimento inline successivo","Mostrare suggerimento inline precedente","Trigger del suggerimento inline","Accettare suggerimento inline per la parola successiva","Accetta parola","Accetta la riga successiva del suggerimento in linea","Accetta riga","Accetta il suggerimento in linea","Accetta","Nascondi suggerimento inline","Mostra sempre la barra degli strumenti"],"vs/editor/contrib/inlineCompletions/browser/hoverParticipant":["Suggerimento:"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys":["Se \xE8 visibile un suggerimento inline","Se il suggerimento in linea inizia con spazi vuoti","Indica se il suggerimento inline inizia con uno spazio vuoto minore di quello che verrebbe inserito dalla tabulazione","Indica se i suggerimenti devono essere eliminati per il suggerimento corrente"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController":["Ispezionarlo nella visualizzazione accessibile ({0})"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget":["Icona per visualizzare il suggerimento del parametro successivo.","Icona per visualizzare il suggerimento del parametro precedente.","{0} ({1})","Indietro","Avanti"],"vs/editor/contrib/lineSelection/browser/lineSelection":["Espandere selezione riga"],"vs/editor/contrib/linesOperations/browser/linesOperations":["Copia la riga in alto","&&Copia la riga in alto","Copia la riga in basso","Co&&pia la riga in basso","Duplica selezione","&&Duplica selezione","Sposta la riga in alto","Sposta la riga in &&alto","Sposta la riga in basso","Sposta la riga in &&basso","Ordinamento righe crescente","Ordinamento righe decrescente","Elimina righe duplicate","Taglia spazio vuoto finale","Elimina riga","Imposta un rientro per la riga","Riduci il rientro per la riga","Inserisci la riga sopra","Inserisci la riga sotto","Elimina tutto a sinistra","Elimina tutto a destra","Unisci righe","Trasponi caratteri intorno al cursore","Converti in maiuscolo","Converti in minuscolo","Trasforma in Tutte Iniziali Maiuscole","Trasforma in snake case","Trasforma in caso Camel","Trasformare in caso Kebab"],"vs/editor/contrib/linkedEditing/browser/linkedEditing":["Avvia modifica collegata","Colore di sfondo quando l'editor viene rinominato automaticamente in base al tipo."],"vs/editor/contrib/links/browser/links":["Non \xE8 stato possibile aprire questo collegamento perch\xE9 il formato non \xE8 valido: {0}","Non \xE8 stato possibile aprire questo collegamento perch\xE9 manca la destinazione.","Esegui il comando","Visita il collegamento","CMD+clic","CTRL+clic","Opzione+clic","ALT+clic","Esegue il comando {0}","Apri collegamento"],"vs/editor/contrib/message/browser/messageController":["Indica se l'editor visualizza attualmente un messaggio inline"],"vs/editor/contrib/multicursor/browser/multicursor":["Cursore aggiunto: {0}","Cursori aggiunti: {0}","Aggiungi cursore sopra","&&Aggiungi cursore sopra","Aggiungi cursore sotto","A&&ggiungi cursore sotto","Aggiungi cursori a fine riga","Aggiungi c&&ursori a fine riga","Aggiungi cursori alla fine","Aggiungi cursori all'inizio","Aggiungi selezione a risultato ricerca successivo","Aggiungi &&occorrenza successiva","Aggiungi selezione a risultato ricerca precedente","Aggiungi occorrenza &&precedente","Sposta ultima selezione a risultato ricerca successivo","Sposta ultima selezione a risultato ricerca precedente","Seleziona tutte le occorrenze del risultato ricerca","Seleziona &&tutte le occorrenze","Cambia tutte le occorrenze","Attival cursore successivo","Attiva il cursore successivo","Cursore precedente stato attivo","Imposta lo stato attivo sul cursore precedente"],"vs/editor/contrib/parameterHints/browser/parameterHints":["Attiva i suggerimenti per i parametri"],"vs/editor/contrib/parameterHints/browser/parameterHintsWidget":["Icona per visualizzare il suggerimento del parametro successivo.","Icona per visualizzare il suggerimento del parametro precedente.","{0}, suggerimento","Colore di primo piano dell\u2019articolo attivo nel suggerimento di parametro."],"vs/editor/contrib/peekView/browser/peekView":["Indica se l'editor di codice corrente \xE8 incorporato nell'anteprima","Chiudi","Colore di sfondo dell'area del titolo della visualizzazione rapida.","Colore del titolo della visualizzazione rapida.","Colore delle informazioni del titolo della visualizzazione rapida.","Colore dei bordi e della freccia della visualizzazione rapida.","Colore di sfondo dell'elenco risultati della visualizzazione rapida.","Colore primo piano dei nodi riga nell'elenco risultati della visualizzazione rapida.","Colore primo piano dei nodi file nell'elenco risultati della visualizzazione rapida.","Colore di sfondo della voce selezionata nell'elenco risultati della visualizzazione rapida.","Colore primo piano della voce selezionata nell'elenco risultati della visualizzazione rapida.","Colore di sfondo dell'editor di visualizzazioni rapide.","Colore di sfondo della barra di navigazione nell'editor visualizzazione rapida.","Colore di sfondo della barra di scorrimento permanente nell'editor visualizzazione rapida.","Colore dell'evidenziazione delle corrispondenze nell'elenco risultati della visualizzazione rapida.","Colore dell'evidenziazione delle corrispondenze nell'editor di visualizzazioni rapide.","Bordo dell'evidenziazione delle corrispondenze nell'editor di visualizzazioni rapide."],"vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess":["Aprire prima un editor di testo per passare a una riga.","Vai a riga {0} e carattere {1}.","Vai alla riga {0}.","Riga corrente: {0}, carattere: {1}. Digitare un numero di riga a cui passare compreso tra 1 e {2}.","Riga corrente: {0}, Carattere: {1}. Digitare un numero di riga a cui passare."],"vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess":["Per passare a un simbolo, aprire prima un editor di testo con informazioni sui simboli.","L'editor di testo attivo non fornisce informazioni sui simboli.","Non ci sono simboli dell'editor corrispondenti","Non ci sono simboli dell'editor","Apri lateralmente","Apri in basso","simboli ({0})","propriet\xE0 ({0})","metodi ({0})","funzioni ({0})","costruttori ({0})","variabili ({0})","classi ({0})","struct ({0})","eventi ({0})","operatori ({0})","interfacce ({0})","spazi dei nomi ({0})","pacchetti ({0})","parametri di tipo ({0})","moduli ({0})","propriet\xE0 ({0})","enumerazioni ({0})","membri di enumerazione ({0})","stringhe ({0})","file ({0})","matrici ({0})","numeri ({0})","valori booleani ({0})","oggetti ({0})","chiavi ({0})","campi ({0})","costanti ({0})"],"vs/editor/contrib/readOnlyMessage/browser/contribution":["Non \xE8 possibile modificare nell'input di sola lettura","Non \xE8 possibile modificare nell'editor di sola lettura"],"vs/editor/contrib/rename/browser/rename":["Nessun risultato.","Si \xE8 verificato un errore sconosciuto durante la risoluzione del percorso di ridenominazione","Ridenominazione di '{0}' in '{1}'","Ridenominazione di {0} in {1}","Correttamente rinominato '{0}' in '{1}'. Sommario: {2}","La ridenominazione non \xE8 riuscita ad applicare le modifiche","La ridenominazione non \xE8 riuscita a calcolare le modifiche","Rinomina simbolo","Abilita/Disabilita l'opzione per visualizzare le modifiche in anteprima prima della ridenominazione"],"vs/editor/contrib/rename/browser/renameInputField":["Indica se il widget di ridenominazione input \xE8 visibile","Consente di rinominare l'input. Digitare il nuovo nome e premere INVIO per eseguire il commit.","{0} per rinominare, {1} per visualizzare in anteprima"],"vs/editor/contrib/smartSelect/browser/smartSelect":["Espandi selezione","Espan&&di selezione","Riduci selezione","&&Riduci selezione"],"vs/editor/contrib/snippet/browser/snippetController2":["Indica se l'editor \xE8 quello corrente nella modalit\xE0 frammenti","Indica se \xE8 presente una tabulazione successiva in modalit\xE0 frammenti","Indica se \xE8 presente una tabulazione precedente in modalit\xE0 frammenti","Vai al segnaposto successivo..."],"vs/editor/contrib/snippet/browser/snippetVariables":["Domenica","Luned\xEC","Marted\xEC","Mercoled\xEC","Gioved\xEC","Venerd\xEC","Sabato","Dom","Lun","Mar","Mer","Gio","Ven","Sab","Gennaio","Febbraio","Marzo","Aprile","Mag","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre","Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],"vs/editor/contrib/stickyScroll/browser/stickyScrollActions":["Attiva/disattiva scorrimento permanente dell'editor","&&Attiva/disattiva scorrimento permanente dell'editor","Scorrimento permanente","&&Scorrimento permanente","Sposta stato attivo su Scorrimento permanente","&&Sposta stato attivo su Scorrimento permanente","Seleziona la riga di scorrimento permanente successiva","Seleziona riga di scorrimento permanente precedente","Vai alla linea di scorrimento permanente attiva","Selezionare l'editor"],"vs/editor/contrib/suggest/browser/suggest":["Indica se i suggerimenti sono evidenziati","Indica se i dettagli dei suggerimenti sono visibili","Indica se sono presenti pi\xF9 suggerimenti da cui scegliere","Indica se l'inserimento del suggerimento corrente comporta una modifica oppure se completa gi\xE0 l'input","Indica se i suggerimenti vengono inseriti quando si preme INVIO","Indica se il suggerimento corrente include il comportamento di inserimento e sostituzione","Indica se il comportamento predefinito \xE8 quello di inserimento o sostituzione","Indica se il suggerimento corrente supporta la risoluzione di ulteriori dettagli"],"vs/editor/contrib/suggest/browser/suggestController":["In seguito all'accettazione di '{0}' sono state apportate altre {1} modifiche","Attiva suggerimento","Inserisci","Inserisci","Sostituisci","Sostituisci","Inserisci","nascondi dettagli","mostra dettagli","Reimposta le dimensioni del widget dei suggerimenti"],"vs/editor/contrib/suggest/browser/suggestWidget":["Colore di sfondo del widget dei suggerimenti.","Colore del bordo del widget dei suggerimenti.","Colore primo piano del widget dei suggerimenti.","Colore primo piano della voce selezionata del widget dei suggerimenti.","Colore primo piano dell\u2019icona della voce selezionata del widget dei suggerimenti.","Colore di sfondo della voce selezionata del widget dei suggerimenti.","Colore delle evidenziazioni corrispondenze nel widget dei suggerimenti.","Colore delle evidenziazioni corrispondenze nel widget dei suggerimenti quando lo stato attivo si trova su un elemento.","Colore primo piano dello stato del widget dei suggerimenti.","Caricamento...","Non ci sono suggerimenti.","Suggerisci","{0} {1}, {2}","{0} {1}","{0}, {1}","{0}, documenti: {1}"],"vs/editor/contrib/suggest/browser/suggestWidgetDetails":["Chiudi","Caricamento..."],"vs/editor/contrib/suggest/browser/suggestWidgetRenderer":["Icona per visualizzare altre informazioni nel widget dei suggerimenti.","Altre informazioni"],"vs/editor/contrib/suggest/browser/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/browser/symbolIcons":["Colore primo piano per i simboli di matrice. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli booleani. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di classe. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di colore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di costante. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di costruttore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di enumeratore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di membro di enumeratore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di evento. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di campo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di file. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di cartella. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di funzione. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di interfaccia. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di chiave. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di parola chiave. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di metodo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di modulo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di spazio dei nomi. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli Null. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli numerici. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di oggetto. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di operatore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di pacchetto. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di propriet\xE0. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di riferimento. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di frammento. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di stringa. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di struct. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di testo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di parametro di tipo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di unit\xE0. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di variabile. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti."],"vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode":["Attiva/Disattiva l'uso di TAB per spostare lo stato attivo","Se si preme TAB, lo stato attivo verr\xE0 spostato sull'elemento con stato attivabile successivo.","Se si preme TAB, verr\xE0 inserito il carattere di tabulazione"],"vs/editor/contrib/tokenization/browser/tokenization":["Sviluppatore: Forza retokenizzazione"],"vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter":["Icona visualizzata con un messaggio di avviso nell'editor delle estensioni.","Questo documento contiene molti caratteri Unicode ASCII non di base","Il documento contiene molti caratteri Unicode ambigui","Questo documento contiene molti caratteri Unicode invisibili","Configurare opzioni evidenziazione Unicode","Il carattere {0} potrebbe essere confuso con il carattere ASCII {1}, che \xE8 pi\xF9 comune nel codice sorgente.","Il carattere {0} potrebbe essere confuso con il carattere {1}, che \xE8 pi\xF9 comune nel codice sorgente.","Il carattere {0} \xE8 invisibile.","Il carattere {0} non \xE8 un carattere ASCII di base.","Modificare impostazioni","Disabilita evidenziazione nei commenti","Disabilita l'evidenziazione dei caratteri nei commenti","Disabilita evidenziazione nelle stringhe","Disabilita l'evidenziazione dei caratteri nelle stringhe","Disabilitare evidenziazione ambigua","Disabilitare l'evidenziazione dei caratteri ambigui","Disabilitare evidenziazione invisibile","Disabilitare l'evidenziazione dei caratteri invisibili","Disabilitare evidenziazione non ASCII","Disabilitare l'evidenziazione di caratteri ASCII non di base","Mostrare opzioni di esclusione","Escludere {0} (carattere invisibile) dall'evidenziazione","Escludere {0} dall\u2019essere evidenziata",'Consentire i caratteri Unicode pi\xF9 comuni nel linguaggio "{0}".'],"vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators":["Caratteri di terminazione di riga insoliti","Sono stati rilevati caratteri di terminazione di riga insoliti",'Il file "\r\n" contiene uno o pi\xF9 caratteri di terminazione di riga insoliti, ad esempio separatore di riga (LS) o separatore di paragrafo (PS).{0}\r\n\xC8 consigliabile rimuoverli dal file. \xC8 possibile configurare questa opzione tramite `editor.unusualLineTerminators`.',"&&Rimuovi i caratteri di terminazione di riga insoliti","Ignora"],"vs/editor/contrib/wordHighlighter/browser/highlightDecorations":["Colore di sfondo di un simbolo durante l'accesso in lettura, ad esempio durante la lettura di una variabile. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo di un simbolo durante l'accesso in scrittura, ad esempio durante la scrittura in una variabile. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo di un'occorrenza testuale per un simbolo. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del bordo di un simbolo durante l'accesso in lettura, ad esempio durante la lettura di una variabile.","Colore del bordo di un simbolo durante l'accesso in scrittura, ad esempio durante la scrittura in una variabile.","Colore del bordo di un'occorrenza testuale per un simbolo.","Colore del marcatore del righello delle annotazioni per le evidenziazioni dei simboli. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del marcatore del righello delle annotazioni per le evidenziazioni dei simboli di accesso in scrittura. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del marcatore del righello delle annotazioni di un'occorrenza testuale per un simbolo. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti."],"vs/editor/contrib/wordHighlighter/browser/wordHighlighter":["Vai al prossimo simbolo evidenziato","Vai al precedente simbolo evidenziato","Attiva/disattiva evidenziazione simbolo"],"vs/editor/contrib/wordOperations/browser/wordOperations":["Elimina parola"],"vs/platform/action/common/actionCommonCategories":["Sviluppatore","Visualizza","Guida","Test","FILE","Preferenze"],"vs/platform/actionWidget/browser/actionList":["{0} per Applica, {1} per Anteprima","{0} da applicare","{0}, Motivo disabilitato: {1}","Widget azione"],"vs/platform/actionWidget/browser/actionWidget":["Colore di sfondo per le azioni attivate o disattivate nella barra delle azioni.","Indica se l'elenco di widget azione \xE8 visibile","Nascondi widget azione","Seleziona azione precedente","Seleziona azione successiva","Accetta l'azione selezionata","Anteprima azione selezionata"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})","{0} ({1})",`{0}\r
+[{1}] {2}`],"vs/platform/actions/browser/toolbar":["Nascondi","Reimposta menu"],"vs/platform/actions/common/menuService":["Nascondi '{0}'"],"vs/platform/audioCues/browser/audioCueService":["Errore sulla riga","Errore","Avviso sulla riga","Avviso","Area piegata sulla linea","Ridotto","Punto di interruzione sulla riga","Punto di interruzione","Suggerimento inline sulla riga","Correzione rapida terminale","Correzione rapida","Debugger arrestato sul punto di interruzione","Punto di interruzione","Nessun suggerimento per l'inlay nella riga","Nessun suggerimento di inlay","Attivit\xE0 completata","Attivit\xE0 completata","Attivit\xE0 non riuscita","Attivit\xE0 non riuscita","Comando terminale non riuscito","Comando non riuscito","Campanello terminale","Campanello terminale","Cella del notebook completata","Cella del notebook completata","La cella del notebook ha avuto esito negativo","La cella del notebook ha avuto esito negativo","Riga diff inserita","Riga diff eliminata","Riga diff modificata","Richiesta chat inviata","Richiesta di chat inviata","Risposta chat ricevuta","Risposta chat in sospeso","Risposta chat in sospeso","Cancella","Cancella","Salva","Salva","Formato","Formato"],"vs/platform/configuration/common/configurationRegistry":["Override configurazione predefinita del linguaggio","Consente di configurare le impostazioni di cui eseguire l'override per il linguaggio {0}.","Consente di configurare le impostazioni dell'editor di cui eseguire l'override per un linguaggio.","Questa impostazione non supporta la configurazione per lingua.","Consente di configurare le impostazioni dell'editor di cui eseguire l'override per un linguaggio.","Questa impostazione non supporta la configurazione per lingua.","Non \xE8 possibile registrare una propriet\xE0 vuota","Non \xE8 possibile registrare '{0}'. Corrisponde al criterio di propriet\xE0 '\\\\[.*\\\\]$' per la descrizione delle impostazioni dell'editor specifiche del linguaggio. Usare il contributo 'configurationDefaults'.","Non \xE8 possibile registrare '{0}'. Questa propriet\xE0 \xE8 gi\xE0 registrata.","Impossibile registrare '{0}'. Il {1} dei criteri associato \xE8 gi\xE0 registrato con {2}."],"vs/platform/contextkey/browser/contextKeyService":["Comando che restituisce informazioni sulle chiavi di contesto"],"vs/platform/contextkey/common/contextkey":["Espressione chiave di contesto vuota","Si \xE8 dimenticato di scrivere un'espressione? \xC8 anche possibile inserire 'false' o 'true' per restituire sempre rispettivamente false o true.","'in' dopo 'not'.","Parentesi chiusa ')'","Token imprevisto","Si \xE8 dimenticato di inserire && o || prima del token?","Fine imprevista dell'espressione","Si \xE8 dimenticato di inserire una chiave di contesto?",`Previsto: {0}\r
+Ricevuto: '{1}'.`],"vs/platform/contextkey/common/contextkeys":["Indica se il sistema operativo \xE8 macOS","Indica se il sistema operativo \xE8 Linux","Indica se il sistema operativo \xE8 Windows","Indica se la piattaforma \xE8 un Web browser","Indica se il sistema operativo \xE8 macOS in una piattaforma non basata su browser","Indica se il sistema operativo \xE8 iOS","Indica se la piattaforma \xE8 un Web browser per dispositivi mobili","Tipo di qualit\xE0 del VS Code","Indica se lo stato attivo della tastiera si trova all'interno di una casella di input"],"vs/platform/contextkey/common/scanner":["Si intendeva {0}?","Si intendeva {0} o {1}?","Si intendeva {0}, {1} o {2}?","Si \xE8 dimenticato di aprire o chiudere la citazione?","Si \xE8 dimenticato di eseguire il carattere di escape '/' (slash)? Inserire due barre rovesciate prima del carattere di escape, ad esempio '\\\\/'."],"vs/platform/history/browser/contextScopedHistoryWidget":["Indica se i suggerimenti sono visibili"],"vs/platform/keybinding/common/abstractKeybindingService":["\xC8 stato premuto ({0}). In attesa del secondo tasto...","\xC8 stato premuto ({0}). In attesa del prossimo tasto...","La combinazione di tasti ({0}, {1}) non \xE8 un comando.","La combinazione di tasti ({0}, {1}) non \xE8 un comando."],"vs/platform/list/browser/listService":["Workbench","Rappresenta il tasto 'Control' in Windows e Linux e il tasto 'Comando' in macOS.","Rappresenta il tasto 'Alt' in Windows e Linux e il tasto 'Opzione' in macOS.","Il modificatore da utilizzare per aggiungere un elemento di alberi e liste ad una selezione multipla con il mouse (ad esempio in Esplora Risorse, apre gli editor e le viste scm). Le gesture del mouse 'Apri a lato' - se supportate - si adatteranno in modo da non creare conflitti con il modificatore di selezione multipla.","Controlla l'apertura degli elementi di alberi ed elenchi tramite il mouse (se supportato). Tenere presente che alcuni alberi ed elenchi potrebbero scegliere di ignorare questa impostazione se non \xE8 applicabile.","Controlla se elenchi e alberi supportano lo scorrimento orizzontale nell'area di lavoro. Avviso: l'attivazione di questa impostazione pu\xF2 influire sulle prestazioni.","Controlla se i clic nella barra di scorrimento scorrono pagina per pagina.","Controlla il rientro dell'albero in pixel.","Controlla se l'albero deve eseguire il rendering delle guide per i rientri.","Controlla se elenchi e alberi prevedono lo scorrimento uniforme.","Moltiplicatore da usare sui valori `deltaX` e `deltaY` degli eventi di scorrimento della rotellina del mouse.","Moltiplicatore della velocit\xE0 di scorrimento quando si preme `Alt`.","Evidenziare gli elementi durante la ricerca. L'ulteriore spostamento verso l'alto e verso il basso attraverser\xE0 solo gli elementi evidenziati.","Filtra gli elementi durante la ricerca.","Controlla la modalit\xE0 di ricerca predefinita per elenchi e alberi nel workbench.","Con lo stile di spostamento da tastiera simple lo stato attivo si trova sugli elementi che corrispondono all'input da tastiera. L'abbinamento viene effettuato solo in base ai prefissi.","Con lo stile di spostamento da tastiera highlight vengono evidenziati gli elementi corrispondenti all'input da tastiera. Spostandosi ulteriormente verso l'alto o verso il basso ci si sposter\xE0 solo negli elementi evidenziati.","Con lo stile di spostamento da tastiera filter verranno filtrati e nascosti tutti gli elementi che non corrispondono all'input da tastiera.","Controlla lo stile di spostamento da tastiera per elenchi e alberi nel workbench. Le opzioni sono: simple, highlight e filter.","In alternativa, usare 'workbench.list.defaultFindMode' e 'workbench.list.typeNavigationMode'.","Usa la corrispondenza fuzzy durante la ricerca.","Usa corrispondenza contigua durante la ricerca.","Controlla il tipo di corrispondenza usato per la ricerca di elenchi e alberi nel workbench.","Controlla l'espansione delle cartelle di alberi quando si fa clic sui nomi delle cartelle. Tenere presente che alcuni alberi ed elenchi potrebbero scegliere di ignorare questa impostazione se non \xE8 applicabile.","Controlla se lo scorrimento permanente \xE8 abilitato negli alberi.","Controlla il numero di elementi permanenti visualizzati nell'albero quando '#workbench.tree.enableStickyScroll#' \xE8 abilitato.","Controlla il funzionamento dello spostamento dei tipi in elenchi e alberi nel workbench. Se impostato su 'trigger', l'esplorazione del tipo inizia dopo l'esecuzione del comando 'list.triggerTypeNavigation'."],"vs/platform/markers/common/markers":["Errore","Avviso","Info"],"vs/platform/quickinput/browser/commandsQuickAccess":["usate di recente","comandi simili","pi\xF9 usato","altri comandi","comandi simili","{0}, {1}","Il comando '{0}' ha restituito un errore"],"vs/platform/quickinput/browser/helpQuickAccess":["{0}, {1}"],"vs/platform/quickinput/browser/quickInput":["Indietro","Premere 'INVIO' per confermare l'input oppure 'ESC' per annullare","{0}/{1}","Digitare per ridurre il numero di risultati."],"vs/platform/quickinput/browser/quickInputController":["Attivare/Disattivare tutte le caselle di controllo","{0} risultati","{0} selezionati","OK","Personalizzato","Indietro ({0})","Indietro"],"vs/platform/quickinput/browser/quickInputList":["Input rapido"],"vs/platform/quickinput/browser/quickInputUtils":["Fare clic per eseguire il comando '{0}'"],"vs/platform/theme/common/colorRegistry":["Colore primo piano generale. Questo colore viene usato solo se non \xE8 sostituito da quello di un componente.","Primo piano generale per gli elementi disabilitati. Questo colore viene usato solo e non \xE8 sostituito da quello di un componente.","Colore primo piano globale per i messaggi di errore. Questo colore viene usato solo se non \xE8 sostituito da quello di un componente.","Colore primo piano del testo che fornisce informazioni aggiuntive, ad esempio per un'etichetta di testo.","Colore predefinito per le icone nel workbench.","Colore del bordo globale per gli elementi evidenziati. Questo colore viene usato solo se non \xE8 sostituito da quello di un componente.","Un bordo supplementare attorno agli elementi per contrastarli maggiormente rispetto agli altri.","Un bordo supplementare intorno agli elementi attivi per contrastarli maggiormente rispetto agli altri.","Il colore di sfondo delle selezioni di testo in workbench (ad esempio per i campi di input o aree di testo). Si noti che questo non si applica alle selezioni all'interno dell'editor.","Colore dei separatori di testo.","Colore primo piano dei link nel testo.","Colore primo piano per i collegamenti nel testo quando vengono selezionati o al passaggio del mouse.","Colore primo piano dei segmenti di testo preformattato.","Colore di sfondo dei segmenti di testo preformattato.","Colore di sfondo per le citazioni nel testo.","Colore del bordo per le citazioni nel testo.","Colore di sfondo per i blocchi di codice nel testo.","Colore ombreggiatura dei widget, ad es. Trova/Sostituisci all'interno dell'editor.","Colore del bordo dei widget, ad es. Trova/Sostituisci all'interno dell'editor.","Sfondo della casella di input.","Primo piano della casella di input.","Bordo della casella di input.","Colore del bordo di opzioni attivate nei campi di input.","Colore di sfondo di opzioni attivate nei campi di input.","Colore di sfondo al passaggio del mouse delle opzioni nei campi di input.","Colore primo piano di opzioni attivate nei campi di input.","Colore primo piano di casella di input per il testo segnaposto.","Colore di sfondo di convalida dell'input di tipo Informazione.","Colore primo piano di convalida dell'input di tipo Informazione.","Colore del bordo della convalida dell'input di tipo Informazione.","Colore di sfondo di convalida dell'input di tipo Avviso.","Colore primo piano di convalida dell'input di tipo Avviso.","Colore del bordo della convalida dell'input di tipo Avviso.","Colore di sfondo di convalida dell'input di tipo Errore.","Colore primo piano di convalida dell'input di tipo Errore.","Colore del bordo della convalida dell'input di tipo Errore.","Sfondo dell'elenco a discesa.","Sfondo dell'elenco a discesa.","Primo piano dell'elenco a discesa.","Bordo dell'elenco a discesa.","Colore primo piano del pulsante.","Colore del separatore pulsante.","Colore di sfondo del pulsante.","Colore di sfondo del pulsante al passaggio del mouse.","Colore del bordo del pulsante.","Colore primo piano secondario del pulsante.","Colore di sfondo secondario del pulsante.","Colore di sfondo secondario del pulsante al passaggio del mouse.","Colore di sfondo del badge. I badge sono piccole etichette informative, ad esempio per mostrare il conteggio dei risultati della ricerca.","Colore primo piano del badge. I badge sono piccole etichette informative, ad esempio per mostrare il conteggio dei risultati di una ricerca.","Ombra della barra di scorrimento per indicare lo scorrimento della visualizzazione.","Colore di sfondo del cursore della barra di scorrimento.","Colore di sfondo del cursore della barra di scorrimento al passaggio del mouse.","Colore di sfondo del cursore della barra di scorrimento quando si fa clic con il mouse.","Colore di sfondo dell'indicatore di stato che pu\xF2 essere mostrato per operazioni a esecuzione prolungata.","Colore di sfondo del testo dell'errore nell'editor. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore primo piano degli indicatori di errore nell'editor.","Se impostato, colore delle doppie sottolineature per gli errori nell'editor.","Colore di sfondo del testo dell'avviso nell'editor. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore primo piano degli indicatori di avviso nell'editor.","Se impostato, colore delle doppie sottolineature per gli avvisi nell'editor.","Colore di sfondo del testo delle informazioni nell'editor. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore primo piano degli indicatori di informazioni nell'editor.","Se impostato, colore delle doppie sottolineature per i messaggi informativi nell'editor.","Colore primo piano degli indicatori di suggerimento nell'editor.","Se impostato, colore delle doppie sottolineature per i suggerimenti nell'editor.","Colore dei bordi di ridimensionamento attivi.","Colore di sfondo dell'editor.","Colore primo piano predefinito dell'editor.","Colore di sfondo della barra di scorrimento permanente nell'editor.","Colore di sfondo dello scorrimento permanente al passaggio del mouse nell'editor","Colore del bordo dello scorrimento permanente nell\u2019editor"," Colore ombreggiatura dello scorrimento permanente nell\u2019editor","Colore di sfondo dei widget dell'editor, ad esempio Trova/Sostituisci.","Colore primo piano dei widget dell'editor, ad esempio Trova/Sostituisci.","Colore del bordo dei widget dell'editor. Il colore viene usato solo se il widget sceglie di avere un bordo e se il colore non \xE8 sottoposto a override da un widget.","Colore del bordo della barra di ridimensionamento dei widget dell'editor. Il colore viene usato solo se il widget sceglie di avere un bordo di ridimensionamento e se il colore non \xE8 sostituito da quello di un widget.","Colore di sfondo di Selezione rapida. Il widget Selezione rapida \xE8 il contenitore di selezioni quali il riquadro comandi.","Colore primo piano di Selezione rapida. Il widget Selezione rapida \xE8 il contenitore di selezioni quali il riquadro comandi.","Colore di sfondo del titolo di Selezione rapida. Il widget Selezione rapida \xE8 il contenitore di selezioni quali il riquadro comandi.","Colore di selezione rapida per il raggruppamento delle etichette.","Colore di selezione rapida per il raggruppamento dei bordi.","Colore di sfondo dell'etichetta del tasto di scelta rapida. L'etichetta del tasto di scelta rapida viene usata per rappresentare una scelta rapida da tastiera.","Colore primo piano dell'etichetta del tasto di scelta rapida. L'etichetta del tasto di scelta rapida viene usata per rappresentare una scelta rapida da tastiera.","Colore del bordo dell'etichetta del tasto di scelta rapida. L'etichetta del tasto di scelta rapida viene usata per rappresentare una scelta rapida da tastiera.","Colore inferiore del bordo dell'etichetta del tasto di scelta rapida. L'etichetta del tasto di scelta rapida viene usata per rappresentare una scelta rapida da tastiera.","Colore della selezione dell'editor.","Colore del testo selezionato per il contrasto elevato.","Colore della selezione in un editor inattivo. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore delle aree con lo stesso contenuto della selezione. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del bordo delle regioni con lo stesso contenuto della selezione.","Colore della corrispondenza di ricerca corrente.","Colore degli altri risultati della ricerca. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore dell'intervallo di limite della ricerca. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del bordo della corrispondenza della ricerca corrente.","Colore del bordo delle altre corrispondenze della ricerca.","Colore del bordo dell'intervallo che limita la ricerca. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore delle corrispondenze query dell'editor della ricerca.","Colore del bordo delle corrispondenze query dell'editor della ricerca.","Colore del testo nel messaggio di completamento del viewlet di ricerca.","Evidenziazione sotto la parola per cui \xE8 visualizzata un'area sensibile al passaggio del mouse. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo dell'area sensibile al passaggio del mouse dell'editor.","Colore primo piano dell'area sensibile al passaggio del mouse dell'editor.","Colore del bordo dell'area sensibile al passaggio del mouse dell'editor.","Colore di sfondo della barra di stato sensibile al passaggio del mouse dell'editor.","Colore dei collegamenti attivi.","Colore primo piano dei suggerimenti inline","Colore di sfondo dei suggerimenti inline","Colore primo piano dei suggerimenti inline per i tipi","Colore di sfondo dei suggerimenti inline per i tipi","Colore primo piano dei suggerimenti inline per i parametri","Colore di sfondo dei suggerimenti inline per i parametri","Colore usato per l'icona delle azioni con lampadina.","Colore usato per l'icona delle azioni di correzione automatica con lampadina.","Colore usato per l'icona dell'intelligenza artificiale con lampadina.","Colore di sfondo per il testo che \xE8 stato inserito. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo per il testo che \xE8 stato rimosso. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo per le righe che sono state inserite. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo per le righe che sono state rimosse. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo per il margine in cui sono state inserite le righe.","Colore di sfondo per il margine in cui sono state rimosse le righe.","Primo piano del righello delle annotazioni delle differenze per il contenuto inserito.","Primo piano del righello delle annotazioni delle differenze per il contenuto rimosso.","Colore del contorno del testo che \xE8 stato inserito.","Colore del contorno del testo che \xE8 stato rimosso.","Colore del bordo tra due editor di testo.","Colore del riempimento diagonale dell'editor diff. Il riempimento diagonale viene usato nelle visualizzazioni diff affiancate.","Colore di sfondo dei blocchi non modificati nell'editor diff.","Colore di primo piano dei blocchi non modificati nell'editor diff.","Colore di sfondo del codice non modificato nell'editor diff.","Colore di sfondo dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore primo piano dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore del contorno dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore del contorno dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 attivo e selezionato. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore di sfondo dell'elenco/albero per l'elemento selezionato quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore primo piano dell'elenco/albero per l'elemento selezionato quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore primo piano dell\u2019icona dell'elenco/albero per l'elemento selezionato quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore di sfondo dell'elenco/albero per l'elemento selezionato quando l'elenco/albero \xE8 inattivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore primo piano dell'elenco/albero per l'elemento selezionato quando l'elenco/albero \xE8 inattivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore primo piano dell\u2019icona dell'elenco/albero per l'elemento selezionato quando l'elenco/albero \xE8 inattivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore di sfondo dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 inattivo. Un elenco/albero attivo ha lo stato attivo della tastiera, uno inattivo no.","Colore del contorno dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 inattivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Sfondo dell'elenco/albero al passaggio del mouse sugli elementi.","Primo piano dell'elenco/albero al passaggio del mouse sugli elementi.","Sfondo dell'elenco/albero durante il trascinamento degli elementi su altri elementi quando si usa il mouse.","Il colore del bordo del trascinamento dell\u2019elenco/albero durante lo spostamento di elementi quando si usa il mouse.","Colore primo piano Elenco/Struttura ad albero delle occorrenze trovate durante la ricerca nell'Elenco/Struttura ad albero.","Colore primo piano Elenco/Struttura ad albero delle occorrenze trovate in elementi con lo stato attivo durante la ricerca nell'Elenco/Struttura ad albero.","Colore primo piano dell'elenco/albero delle occorrenze trovate durante la ricerca nell'elenco/albero.","Colore primo piano delle voci di elenco contenenti errori.","Colore primo piano delle voci di elenco contenenti avvisi.","Colore di sfondo del widget del filtro per tipo in elenchi e alberi.","Colore del contorno del widget del filtro per tipo in elenchi e alberi.","Colore del contorno del widget del filtro per tipo in elenchi e alberi quando non sono presenti corrispondenze.","Colore ombreggiatura del widget del filtro sul tipo negli elenchi e alberi.","Colore di sfondo della corrispondenza filtrata.","Colore del bordo della corrispondenza filtrata.","Colore del tratto dell'albero per le guide per i rientri.","Colore del tratto dell'albero per le guide di rientro non attive.","Colore del bordo della tabella tra le colonne.","Colore di sfondo per le righe di tabella dispari.","Colore primo piano dell'elenco/albero per gli elementi non evidenziati.","Colore di sfondo del widget della casella di controllo.","Colore di sfondo del widget della casella di controllo quando \xE8 selezionato l'elemento in cui si trova.","Colore primo piano del widget della casella di controllo.","Colore del bordo del widget della casella di controllo.","Colore del bordo del widget della casella di controllo quando \xE8 selezionato l'elemento in cui si trova.","In alternativa, usare quickInputList.focusBackground","Colore primo piano di Selezione rapida per l'elemento con lo stato attivo.","Colore primo piano dell\u2019icona di Selezione rapida per l'elemento con lo stato attivo.","Colore di sfondo di Selezione rapida per l'elemento con lo stato attivo.","Colore del bordo del menu.","Colore primo piano delle voci di menu.","Colore di sfondo delle voci di menu.","Colore primo piano della voce di menu selezionata nei menu.","Colore di sfondo della voce di menu selezionata nei menu.","Colore del bordo della voce di menu selezionata nei menu.","Colore di un elemento separatore delle voci di menu.","Sfondo della barra degli strumenti al passaggio del mouse sulle azioni","Contorno della barra degli strumenti al passaggio del mouse sulle azioni","Sfondo della barra degli strumenti quando si tiene premuto il mouse sulle azioni","Colore di sfondo dell'evidenziazione della tabulazione di un frammento.","Colore del bordo dell'evidenziazione della tabulazione di un frammento.","Colore di sfondo dell'evidenziazione della tabulazione finale di un frammento.","Colore del bordo dell'evidenziazione della tabulazione finale di un frammento.","Colore degli elementi di navigazione in evidenza.","Colore di sfondo degli elementi di navigazione.","Colore degli elementi di navigazione in evidenza.","Colore degli elementi di navigazione selezionati.","Colore di sfondo del controllo di selezione elementi di navigazione.","Sfondo dell'intestazione delle modifiche correnti nei conflitti di merge inline. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Sfondo del contenuto delle modifiche correnti nei conflitti di merge inline. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Sfondo dell'intestazione delle modifiche in ingresso nei conflitti di merge inline. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Sfondo del contenuto delle modifiche in ingresso nei conflitti di merge inline. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Sfondo dell'intestazione del predecessore comune nei conflitti di merge inline. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Sfondo del contenuto del predecessore comune nei conflitti di merge inline. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del bordo nelle intestazioni e sulla barra di divisione di conflitti di merge in linea.","Colore primo piano del righello delle annotazioni delle modifiche correnti per i conflitti di merge inline.","Colore primo piano del righello delle annotazioni delle modifiche in ingresso per i conflitti di merge inline.","Colore primo piano del righello delle annotazioni del predecessore comune per i conflitti di merge inline.","Colore del marcatore del righello delle annotazioni per la ricerca di corrispondenze. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del marcatore del righello delle annotazioni per le evidenziazioni delle selezioni. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del marcatore della minimappa per la ricerca delle corrispondenze.","Colore del marcatore della minimappa per le selezioni ripetute dell'editor.","Colore del marcatore della minimappa per la selezione dell'editor.","Colore del marcatore della minimappa per le informazioni.","Colore del marcatore della minimappa per gli avvisi.","Colore del marcatore della minimappa per gli errori.","Colore di sfondo della minimappa.",'Opacit\xE0 degli elementi in primo piano di cui \xE8 stato eseguito il rendering nella minimappa. Ad esempio, con "#000000c0" il rendering degli elementi verr\xE0 eseguito con il 75% di opacit\xE0.',"Colore di sfondo del dispositivo di scorrimento della minimappa.","Colore di sfondo del dispositivo di scorrimento della minimappa al passaggio del mouse.","Colore di sfondo del dispositivo di scorrimento della minimappa quando si fa clic con il mouse.","Colore usato per l'icona di errore dei problemi.","Colore usato per l'icona di avviso dei problemi.","Colore usato per l'icona informazioni dei problemi.","Colore primo piano usato nei grafici.","Colore usato per le linee orizzontali nei grafici.","Colore rosso usato nelle visualizzazioni grafico.","Colore blu usato nelle visualizzazioni grafico.","Colore giallo usato nelle visualizzazioni grafico.","Colore arancione usato nelle visualizzazioni grafico.","Colore verde usato nelle visualizzazioni grafico.","Colore viola usato nelle visualizzazioni grafico."],"vs/platform/theme/common/iconRegistry":["ID del tipo di carattere da usare. Se non \xE8 impostato, viene usato il tipo di carattere definito per primo.","Tipo di carattere associato alla definizione di icona.","Icona dell'azione di chiusura nei widget.","Icona per la posizione di Vai a editor precedente.","Icona per la posizione di Vai a editor successivo."],"vs/platform/undoRedo/common/undoRedoService":["I file seguenti sono stati chiusi e modificati nel disco: {0}.","I file seguenti sono stati modificati in modo incompatibile: {0}.","Non \xE8 stato possibile annullare '{0}' in tutti i file. {1}","Non \xE8 stato possibile annullare '{0}' in tutti i file. {1}","Non \xE8 stato possibile annullare '{0}' in tutti i file perch\xE9 sono state apportate modifiche a {1}","Non \xE8 stato possibile annullare '{0}' su tutti i file perch\xE9 \xE8 gi\xE0 in esecuzione un'operazione di annullamento o ripetizione su {1}","Non \xE8 stato possibile annullare '{0}' su tutti i file perch\xE9 nel frattempo \xE8 stata eseguita un'operazione di annullamento o ripetizione","Annullare '{0}' in tutti i file?","&&Annulla in {0} file","Annulla questo &&file","Non \xE8 stato possibile annullare '{0}' perch\xE9 \xE8 gi\xE0 in esecuzione un'operazione di annullamento o ripetizione.","Annullare '{0}'?","&&S\xEC","No","Non \xE8 stato possibile ripetere '{0}' in tutti i file. {1}","Non \xE8 stato possibile ripetere '{0}' in tutti i file. {1}","Non \xE8 stato possibile ripetere '{0}' in tutti i file perch\xE9 sono state apportate modifiche a {1}","Non \xE8 stato possibile ripetere l'operazione '{0}' su tutti i file perch\xE9 \xE8 gi\xE0 in esecuzione un'operazione di annullamento o ripetizione sull'elenco di file {1}","Non \xE8 stato possibile ripetere '{0}' su tutti i file perch\xE9 nel frattempo \xE8 stata eseguita un'operazione di annullamento o ripetizione","Non \xE8 stato possibile ripetere '{0}' perch\xE9 \xE8 gi\xE0 in esecuzione un'operazione di annullamento o ripetizione."],"vs/platform/workspace/common/workspace":["Area di lavoro del codice"]});
+
+//# sourceMappingURL=../../../min-maps/vs/editor/editor.main.nls.it.js.map
\ No newline at end of file
diff --git a/public/vs/editor/editor.main.nls.ja.js b/public/vs/editor/editor.main.nls.ja.js
new file mode 100644
index 0000000..79ddaf0
--- /dev/null
+++ b/public/vs/editor/editor.main.nls.ja.js
@@ -0,0 +1,15 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.ja",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["\u5165\u529B"],"vs/base/browser/ui/findinput/findInputToggles":["\u5927\u6587\u5B57\u3068\u5C0F\u6587\u5B57\u3092\u533A\u5225\u3059\u308B","\u5358\u8A9E\u5358\u4F4D\u3067\u691C\u7D22\u3059\u308B","\u6B63\u898F\u8868\u73FE\u3092\u4F7F\u7528\u3059\u308B"],"vs/base/browser/ui/findinput/replaceInput":["\u5165\u529B","\u4FDD\u6301\u3059\u308B"],"vs/base/browser/ui/hover/hoverWidget":["{0} \u3092\u4F7F\u7528\u3057\u3066\u3001\u30E6\u30FC\u30B6\u30FC\u88DC\u52A9\u5BFE\u5FDC\u306E\u30D3\u30E5\u30FC\u3067\u3053\u308C\u3092\u691C\u67FB\u3057\u307E\u3059\u3002","\u30AD\u30FC \u30D0\u30A4\u30F3\u30C9\u3092\u4ECB\u3057\u3066\u73FE\u5728\u30C8\u30EA\u30AC\u30FC\u3067\u304D\u306A\u3044 [\u30E6\u30FC\u30B6\u30FC\u88DC\u52A9\u5BFE\u5FDC\u306E\u30D3\u30E5\u30FC\u3092\u958B\u304F] \u30B3\u30DE\u30F3\u30C9\u3092\u4F7F\u7528\u3057\u3066\u3001\u30E6\u30FC\u30B6\u30FC\u88DC\u52A9\u5BFE\u5FDC\u306E\u30D3\u30E5\u30FC\u3067\u3053\u308C\u3092\u691C\u67FB\u3057\u307E\u3059\u3002"],"vs/base/browser/ui/iconLabel/iconLabelHover":["\u8AAD\u307F\u8FBC\u307F\u4E2D..."],"vs/base/browser/ui/inputbox/inputBox":["\u30A8\u30E9\u30FC: {0}","\u8B66\u544A: {0}","\u60C5\u5831: {0}"," \u307E\u305F\u306F\u5C65\u6B74\u306E {0}"," (\u5C65\u6B74\u306E {0})","\u30AF\u30EA\u30A2\u3055\u308C\u305F\u5165\u529B"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\u30D0\u30A4\u30F3\u30C9\u306A\u3057"],"vs/base/browser/ui/selectBox/selectBoxCustom":["\u30DC\u30C3\u30AF\u30B9\u3092\u9078\u629E"],"vs/base/browser/ui/toolbar/toolbar":["\u305D\u306E\u4ED6\u306E\u64CD\u4F5C..."],"vs/base/browser/ui/tree/abstractTree":["\u30D5\u30A3\u30EB\u30BF\u30FC","\u3042\u3044\u307E\u3044\u4E00\u81F4","\u5165\u529B\u3057\u3066\u30D5\u30A3\u30EB\u30BF\u30FC","\u5165\u529B\u3057\u3066\u691C\u7D22","\u5165\u529B\u3057\u3066\u691C\u7D22","\u9589\u3058\u308B","\u8981\u7D20\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002"],"vs/base/common/actions":["(\u7A7A)"],"vs/base/common/errorMessage":["{0}: {1}","\u30B7\u30B9\u30C6\u30E0 \u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F ({0})","\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30ED\u30B0\u3067\u8A73\u7D30\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30ED\u30B0\u3067\u8A73\u7D30\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","{0} (\u5408\u8A08 {1} \u30A8\u30E9\u30FC)","\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30ED\u30B0\u3067\u8A73\u7D30\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002"],"vs/base/common/keybindingLabels":["Ctrl","Shift","Alt","Windows","Ctrl","Shift","Alt","Super","Control","Shift","\u30AA\u30D7\u30B7\u30E7\u30F3","\u30B3\u30DE\u30F3\u30C9","Control","Shift","Alt","Windows","Control","Shift","Alt","Super"],"vs/base/common/platform":["_"],"vs/editor/browser/controller/textAreaHandler":["\u30A8\u30C7\u30A3\u30BF\u30FC","\u3053\u306E\u6642\u70B9\u3067\u306F\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30A2\u30AF\u30BB\u30B9\u3067\u304D\u307E\u305B\u3093\u3002","{0} \u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u6700\u9069\u5316\u30E2\u30FC\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u306B\u306F\u3001{1} \u3092\u4F7F\u7528\u3057\u307E\u3059","{0} \u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u6700\u9069\u5316\u30E2\u30FC\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u306B\u306F\u3001{1} \u3067\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AF\u3092\u958B\u304D\u3001[\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC \u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3 \u30E2\u30FC\u30C9\u306E\u5207\u308A\u66FF\u3048] \u30B3\u30DE\u30F3\u30C9\u3092\u5B9F\u884C\u3057\u307E\u3059\u3002\u3053\u308C\u306F\u73FE\u5728\u30AD\u30FC\u30DC\u30FC\u30C9\u304B\u3089\u30C8\u30EA\u30AC\u30FC\u3067\u304D\u307E\u305B\u3093\u3002","{0} {1} \u3067\u30AD\u30FC\u30D0\u30A4\u30F3\u30C9 \u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30A2\u30AF\u30BB\u30B9\u3057\u3001\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC \u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3 \u30E2\u30FC\u30C9\u306E\u5207\u308A\u66FF\u3048\u30B3\u30DE\u30F3\u30C9\u306B\u30AD\u30FC\u30D0\u30A4\u30F3\u30C9\u3092\u5272\u308A\u5F53\u3066\u3066\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002"],"vs/editor/browser/coreCommands":["\u9577\u3044\u884C\u306B\u79FB\u52D5\u3057\u3066\u3082\u884C\u672B\u306B\u4F4D\u7F6E\u3057\u307E\u3059","\u9577\u3044\u884C\u306B\u79FB\u52D5\u3057\u3066\u3082\u884C\u672B\u306B\u4F4D\u7F6E\u3057\u307E\u3059","\u30BB\u30AB\u30F3\u30C0\u30EA \u30AB\u30FC\u30BD\u30EB\u304C\u524A\u9664\u3055\u308C\u307E\u3057\u305F"],"vs/editor/browser/editorExtensions":["\u5143\u306B\u623B\u3059(&&U)","\u5143\u306B\u623B\u3059","\u3084\u308A\u76F4\u3057(&&R)","\u3084\u308A\u76F4\u3057","\u3059\u3079\u3066\u9078\u629E(&&S)","\u3059\u3079\u3066\u3092\u9078\u629E"],"vs/editor/browser/widget/codeEditorWidget":["\u30AB\u30FC\u30BD\u30EB\u306E\u6570\u306F {0} \u306B\u5236\u9650\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u5927\u304D\u306A\u5909\u66F4\u3092\u884C\u3046\u5834\u5408\u306F\u3001[\u691C\u7D22\u3068\u7F6E\u63DB](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) \u3092\u4F7F\u7528\u3059\u308B\u3053\u3068\u3092\u691C\u8A0E\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30DE\u30EB\u30C1 \u30AB\u30FC\u30BD\u30EB\u306E\u4E0A\u9650\u3092\u5897\u3084\u3059"],"vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer":["\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306E\u9AD8\u3044\u5DEE\u5206\u30D3\u30E5\u30FC\u30A2\u30FC\u306E [\u633F\u5165] \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306E\u9AD8\u3044\u5DEE\u5206\u30D3\u30E5\u30FC\u30A2\u30FC\u306E [\u524A\u9664] \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306E\u9AD8\u3044\u5DEE\u5206\u30D3\u30E5\u30FC\u30A2\u30FC\u306E [\u9589\u3058\u308B] \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u9589\u3058\u308B","\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A Diff Viewer\u3002\u4E0A\u4E0B\u65B9\u5411\u30AD\u30FC\u3092\u4F7F\u7528\u3057\u3066\u79FB\u52D5\u3057\u307E\u3059\u3002","\u5909\u66F4\u3055\u308C\u305F\u884C\u306F\u3042\u308A\u307E\u305B\u3093","1 \u884C\u304C\u5909\u66F4\u3055\u308C\u307E\u3057\u305F","{0} \u884C\u304C\u5909\u66F4\u3055\u308C\u307E\u3057\u305F","\u76F8\u9055 {0}/{1}: \u5143\u306E\u884C {2}\u3001{3}\u3002\u5909\u66F4\u3055\u308C\u305F\u884C {4}\u3001{5}","\u7A7A\u767D","{0} \u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u884C {1}","{0} \u5143\u306E\u884C {1} \u5909\u66F4\u3055\u308C\u305F\u884C {2}","+ {0} \u5909\u66F4\u3055\u308C\u305F\u884C {1}","- {0} \u5143\u306E\u884C {1}"],"vs/editor/browser/widget/diffEditor/components/diffEditorEditors":[" {0}\u3092\u4F7F\u7528\u3057\u3066\u3001\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306E\u30D8\u30EB\u30D7\u3092\u958B\u304D\u307E\u3059\u3002"],"vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin":["\u524A\u9664\u3055\u308C\u305F\u884C\u306E\u30B3\u30D4\u30FC","\u524A\u9664\u3055\u308C\u305F\u884C\u306E\u30B3\u30D4\u30FC","\u5909\u66F4\u3055\u308C\u305F\u884C\u306E\u30B3\u30D4\u30FC","\u5909\u66F4\u3055\u308C\u305F\u884C\u306E\u30B3\u30D4\u30FC","\u524A\u9664\u3055\u308C\u305F\u884C\u306E\u30B3\u30D4\u30FC ({0})","\u5909\u66F4\u3055\u308C\u305F\u884C\u306E\u30B3\u30D4\u30FC ({0})","\u3053\u306E\u5909\u66F4\u3092\u5143\u306B\u623B\u3059"],"vs/editor/browser/widget/diffEditor/diffEditor.contribution":["\u30B9\u30DA\u30FC\u30B9\u304C\u5236\u9650\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306F\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D3\u30E5\u30FC\u3092\u4F7F\u7528\u3059\u308B","\u79FB\u52D5\u3055\u308C\u305F\u30B3\u30FC\u30C9 \u30D6\u30ED\u30C3\u30AF\u306E\u8868\u793A","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC","\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306E\u9AD8\u3044\u5DEE\u5206\u30D3\u30E5\u30FC\u30A2\u30FC","\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306E\u9AD8\u3044\u5DEE\u5206\u30D3\u30E5\u30FC\u30A2\u30FC\u3092\u958B\u304F","\u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u9818\u57DF\u306E\u6298\u308A\u305F\u305F\u307F\u306E\u5207\u308A\u66FF\u3048","\u79FB\u52D5\u3057\u305F\u30B3\u30FC\u30C9 \u30D6\u30ED\u30C3\u30AF\u306E\u8868\u793A\u306E\u5207\u308A\u66FF\u3048","\u30B9\u30DA\u30FC\u30B9\u304C\u5236\u9650\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306B [\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D3\u30E5\u30FC\u306E\u4F7F\u7528] \u3092\u5207\u308A\u66FF\u3048\u308B","\u30B5\u30A4\u30C9\u306E\u5207\u308A\u66FF\u3048","\u6BD4\u8F03\u79FB\u52D5\u306E\u7D42\u4E86","\u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u3059\u3079\u3066\u306E\u30EA\u30FC\u30B8\u30E7\u30F3\u3092\u6298\u308A\u305F\u305F\u3080","\u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u3059\u3079\u3066\u306E\u30EA\u30FC\u30B8\u30E7\u30F3\u3092\u8868\u793A\u3059\u308B","\u6B21\u306E\u5DEE\u5206\u306B\u79FB\u52D5","\u524D\u306E\u5DEE\u5206\u306B\u79FB\u52D5"],"vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature":["\u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u9818\u57DF\u3092\u6298\u308A\u305F\u305F\u3080","\u30AF\u30EA\u30C3\u30AF\u307E\u305F\u306F\u30C9\u30E9\u30C3\u30B0\u3057\u3066\u4E0A\u306B\u3082\u3063\u3068\u8868\u793A\u3059\u308B","\u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u9818\u57DF\u306E\u8868\u793A","\u30AF\u30EA\u30C3\u30AF\u307E\u305F\u306F\u30C9\u30E9\u30C3\u30B0\u3057\u3066\u4E0B\u306B\u3082\u3063\u3068\u8868\u793A\u3059\u308B","\u975E\u8868\u793A {0} \u884C","\u30C0\u30D6\u30EB\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u5C55\u958B\u3059\u308B"],"vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature":["\u884C {0}-{1} \u306B\u5909\u66F4\u3092\u52A0\u3048\u3066\u30B3\u30FC\u30C9\u3092\u79FB\u52D5\u3057\u307E\u3057\u305F","\u884C {0}-{1} \u304B\u3089\u5909\u66F4\u3092\u52A0\u3048\u3066\u30B3\u30FC\u30C9\u304C\u79FB\u52D5\u3055\u308C\u307E\u3057\u305F","\u30B3\u30FC\u30C9\u3092\u884C {0}-{1} \u306B\u79FB\u52D5\u3057\u307E\u3057\u305F","\u884C {0}-{1} \u304B\u3089\u79FB\u52D5\u3055\u308C\u305F\u30B3\u30FC\u30C9"],"vs/editor/browser/widget/diffEditor/features/revertButtonsFeature":["\u9078\u629E\u3057\u305F\u5909\u66F4\u3092\u5143\u306B\u623B\u3059","\u5909\u66F4\u3092\u5143\u306B\u623B\u3059"],"vs/editor/browser/widget/diffEditor/registrations.contribution":["\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u79FB\u52D5\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u79FB\u52D5\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u5883\u754C\u7DDA\u306E\u8272\u3002","\u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u30EA\u30FC\u30B8\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u5468\u308A\u306E\u5F71\u306E\u8272\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u633F\u5165\u3092\u793A\u3059\u884C\u306E\u88C5\u98FE\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u524A\u9664\u3092\u793A\u3059\u884C\u306E\u88C5\u98FE\u3002"],"vs/editor/browser/widget/hoverWidget/hoverWidget":["{0} \u30AD\u30FC\u3092\u62BC\u3057\u306A\u304C\u3089\u30DE\u30A6\u30B9 \u30DD\u30A4\u30F3\u30BF\u30FC\u3092\u5408\u308F\u305B\u307E\u3059"],"vs/editor/browser/widget/multiDiffEditorWidget/colors":["diff \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D8\u30C3\u30C0\u30FC\u306E\u80CC\u666F\u8272","\u30DE\u30EB\u30C1 \u30D5\u30A1\u30A4\u30EB\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u80CC\u666F\u8272","\u30DE\u30EB\u30C1 \u30D5\u30A1\u30A4\u30EB\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u5883\u754C\u7DDA\u306E\u8272"],"vs/editor/common/config/editorConfigurationSchema":["\u30A8\u30C7\u30A3\u30BF\u30FC","1 \u3064\u306E\u30BF\u30D6\u306B\u76F8\u5F53\u3059\u308B\u30B9\u30DA\u30FC\u30B9\u306E\u6570\u3002{0} \u304C\u30AA\u30F3\u306E\u5834\u5408\u3001\u3053\u306E\u8A2D\u5B9A\u306F\u30D5\u30A1\u30A4\u30EB \u30B3\u30F3\u30C6\u30F3\u30C4\u306B\u57FA\u3065\u3044\u3066\u4E0A\u66F8\u304D\u3055\u308C\u307E\u3059\u3002",'\u30A4\u30F3\u30C7\u30F3\u30C8\u307E\u305F\u306F `"tabSize"` \u3067 `#editor.tabSize#` \u306E\u5024\u3092\u4F7F\u7528\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u308B\u30B9\u30DA\u30FC\u30B9\u306E\u6570\u3002\u3053\u306E\u8A2D\u5B9A\u306F\u3001 `#editor.detectIndentation#` \u304C\u30AA\u30F3\u306E\u5834\u5408\u3001\u30D5\u30A1\u30A4\u30EB\u306E\u5185\u5BB9\u306B\u57FA\u3065\u3044\u3066\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3055\u308C\u307E\u3059\u3002',"`Tab` \u30AD\u30FC\u3092\u62BC\u3059\u3068\u30B9\u30DA\u30FC\u30B9\u304C\u633F\u5165\u3055\u308C\u307E\u3059\u3002{0} \u304C\u30AA\u30F3\u306E\u5834\u5408\u3001\u3053\u306E\u8A2D\u5B9A\u306F\u30D5\u30A1\u30A4\u30EB \u30B3\u30F3\u30C6\u30F3\u30C4\u306B\u57FA\u3065\u3044\u3066\u4E0A\u66F8\u304D\u3055\u308C\u307E\u3059\u3002","\u30D5\u30A1\u30A4\u30EB\u304C\u30D5\u30A1\u30A4\u30EB\u306E\u5185\u5BB9\u306B\u57FA\u3065\u3044\u3066\u958B\u304B\u308C\u308B\u5834\u5408\u3001{0} \u3068 {1} \u3092\u81EA\u52D5\u7684\u306B\u691C\u51FA\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u81EA\u52D5\u633F\u5165\u3055\u308C\u305F\u672B\u5C3E\u306E\u7A7A\u767D\u3092\u524A\u9664\u3057\u307E\u3059\u3002","\u5927\u304D\u306A\u30D5\u30A1\u30A4\u30EB\u3067\u30E1\u30E2\u30EA\u304C\u96C6\u4E2D\u3059\u308B\u7279\u5B9A\u306E\u6A5F\u80FD\u3092\u7121\u52B9\u306B\u3059\u308B\u305F\u3081\u306E\u7279\u5225\u306A\u51E6\u7406\u3002","\u5358\u8A9E\u30D9\u30FC\u30B9\u306E\u5019\u88DC\u3092\u30AA\u30D5\u306B\u3057\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u304B\u3089\u306E\u307F\u5358\u8A9E\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u540C\u3058\u8A00\u8A9E\u306E\u958B\u3044\u3066\u3044\u308B\u3059\u3079\u3066\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u304B\u3089\u5358\u8A9E\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u958B\u3044\u3066\u3044\u308B\u3059\u3079\u3066\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u304B\u3089\u5358\u8A9E\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u5358\u8A9E\u306B\u57FA\u3065\u3044\u3066\u5165\u529B\u5019\u88DC\u3092\u8A08\u7B97\u3059\u308B\u304B\u3069\u3046\u304B\u3001\u307E\u305F\u3069\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u304B\u3089\u5165\u529B\u5019\u88DC\u3092\u8A08\u7B97\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u306E\u5F37\u8ABF\u8868\u793A\u304C\u3059\u3079\u3066\u306E\u914D\u8272\u30C6\u30FC\u30DE\u306B\u3064\u3044\u3066\u6709\u52B9\u306B\u306A\u308A\u307E\u3057\u305F\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u306E\u5F37\u8ABF\u8868\u793A\u304C\u3059\u3079\u3066\u306E\u914D\u8272\u30C6\u30FC\u30DE\u306B\u3064\u3044\u3066\u7121\u52B9\u306B\u306A\u308A\u307E\u3057\u305F\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u306E\u5F37\u8ABF\u8868\u793A\u306F\u3001\u73FE\u5728\u306E\u914D\u8272\u30C6\u30FC\u30DE\u306E 'semanticHighlighting' \u8A2D\u5B9A\u306B\u3088\u3063\u3066\u69CB\u6210\u3055\u308C\u3066\u3044\u307E\u3059\u3002","semanticHighlighting \u3092\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u308B\u8A00\u8A9E\u3067\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u30C0\u30D6\u30EB\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u304B\u3001`Escape` \u30AD\u30FC\u3092\u62BC\u3057\u3066\u3082\u3001\u30D4\u30FC\u30AF \u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u958B\u3044\u305F\u307E\u307E\u306B\u3057\u307E\u3059\u3002","\u3053\u306E\u9577\u3055\u3092\u8D8A\u3048\u308B\u884C\u306F\u3001\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u4E0A\u306E\u7406\u7531\u306B\u3088\u308A\u30C8\u30FC\u30AF\u30F3\u5316\u3055\u308C\u307E\u305B\u3093\u3002","Web \u30EF\u30FC\u30AB\u30FC\u3067\u30C8\u30FC\u30AF\u30F3\u5316\u3092\u975E\u540C\u671F\u7684\u306B\u884C\u3046\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u975E\u540C\u671F\u30C8\u30FC\u30AF\u30F3\u5316\u3092\u30ED\u30B0\u306B\u8A18\u9332\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u30C7\u30D0\u30C3\u30B0\u7528\u306E\u307F\u3002","\u5F93\u6765\u306E\u30D0\u30C3\u30AF\u30B0\u30E9\u30A6\u30F3\u30C9 \u30C8\u30FC\u30AF\u30F3\u5316\u306B\u5BFE\u3057\u3066\u975E\u540C\u671F\u30C8\u30FC\u30AF\u30F3\u5316\u3092\u691C\u8A3C\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u30C8\u30FC\u30AF\u30F3\u5316\u304C\u9045\u304F\u306A\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u30C7\u30D0\u30C3\u30B0\u5C02\u7528\u3067\u3059\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u5897\u6E1B\u3059\u308B\u89D2\u304B\u3063\u3053\u3092\u5B9A\u7FA9\u3057\u307E\u3059\u3002","\u5DE6\u89D2\u304B\u3063\u3053\u307E\u305F\u306F\u6587\u5B57\u5217\u30B7\u30FC\u30B1\u30F3\u30B9\u3002","\u53F3\u89D2\u304B\u3063\u3053\u307E\u305F\u306F\u6587\u5B57\u5217\u30B7\u30FC\u30B1\u30F3\u30B9\u3002","\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2\u306E\u8272\u4ED8\u3051\u304C\u6709\u52B9\u306B\u306A\u3063\u3066\u3044\u308B\u5834\u5408\u3001\u5165\u308C\u5B50\u306E\u30EC\u30D9\u30EB\u306B\u3088\u3063\u3066\u8272\u4ED8\u3051\u3055\u308C\u308B\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2\u3092\u5B9A\u7FA9\u3057\u307E\u3059\u3002","\u5DE6\u89D2\u304B\u3063\u3053\u307E\u305F\u306F\u6587\u5B57\u5217\u30B7\u30FC\u30B1\u30F3\u30B9\u3002","\u53F3\u89D2\u304B\u3063\u3053\u307E\u305F\u306F\u6587\u5B57\u5217\u30B7\u30FC\u30B1\u30F3\u30B9\u3002","\u5DEE\u5206\u8A08\u7B97\u304C\u53D6\u308A\u6D88\u3055\u308C\u305F\u5F8C\u306E\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8 (\u30DF\u30EA\u79D2\u5358\u4F4D)\u3002\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u306A\u3057\u306B\u306F 0 \u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u5DEE\u5206\u3092\u8A08\u7B97\u3059\u308B\u5834\u5408\u306E\u6700\u5927\u30D5\u30A1\u30A4\u30EB \u30B5\u30A4\u30BA (MB)\u3002\u5236\u9650\u306A\u3057\u306E\u5834\u5408\u306F 0 \u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u5DEE\u5206\u3092\u6A2A\u306B\u4E26\u3079\u3066\u8868\u793A\u3059\u308B\u304B\u3001\u884C\u5185\u306B\u8868\u793A\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u5E45\u304C\u3053\u306E\u5024\u3088\u308A\u5C0F\u3055\u3044\u5834\u5408\u306F\u3001\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D3\u30E5\u30FC\u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u306A\u3063\u3066\u3044\u308B\u3068\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u5E45\u304C\u5C0F\u3055\u3059\u304E\u308B\u5834\u5408\u306F\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D3\u30E5\u30FC\u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30B0\u30EA\u30D5\u4F59\u767D\u306B\u3001\u5909\u66F4\u3092\u5143\u306B\u623B\u3059\u305F\u3081\u306E\u77E2\u5370\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u5148\u982D\u307E\u305F\u306F\u672B\u5C3E\u306E\u7A7A\u767D\u6587\u5B57\u306E\u5909\u66F4\u3092\u7121\u8996\u3057\u307E\u3059\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u8FFD\u52A0/\u524A\u9664\u3055\u308C\u305F\u5909\u66F4\u306B +/- \u30A4\u30F3\u30B8\u30B1\u30FC\u30BF\u30FC\u3092\u793A\u3059\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067 CodeLens \u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u884C\u3092\u6298\u308A\u8FD4\u3057\u307E\u305B\u3093\u3002","\u884C\u3092\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u306E\u5E45\u3067\u6298\u308A\u8FD4\u3057\u307E\u3059\u3002","\u884C\u306F\u3001{0} \u306E\u8A2D\u5B9A\u306B\u5F93\u3063\u3066\u6298\u308A\u8FD4\u3055\u308C\u307E\u3059\u3002","\u5F93\u6765\u306E\u5DEE\u5206\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u9AD8\u5EA6\u306A\u5DEE\u5206\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u9818\u57DF\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u672A\u5909\u66F4\u306E\u9818\u57DF\u306B\u4F7F\u7528\u3055\u308C\u308B\u7DDA\u306E\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u9818\u57DF\u306E\u6700\u5C0F\u5024\u3068\u3057\u3066\u4F7F\u7528\u3055\u308C\u308B\u7DDA\u306E\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u9818\u57DF\u3092\u6BD4\u8F03\u3059\u308B\u3068\u304D\u306B\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3068\u3057\u3066\u4F7F\u7528\u3055\u308C\u308B\u884C\u306E\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u691C\u51FA\u3055\u308C\u305F\u30B3\u30FC\u30C9\u306E\u79FB\u52D5\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6587\u5B57\u304C\u633F\u5165\u307E\u305F\u306F\u524A\u9664\u3055\u308C\u305F\u5834\u6240\u3092\u78BA\u8A8D\u3059\u308B\u305F\u3081\u306B\u3001\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u7A7A\u306E\u88C5\u98FE\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002"],"vs/editor/common/config/editorOptions":["\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0 API \u3092\u4F7F\u7528\u3057\u3066\u3001\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u304C\u3044\u3064\u63A5\u7D9A\u3055\u308C\u305F\u304B\u3092\u691C\u51FA\u3057\u307E\u3059\u3002","\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u3067\u306E\u4F7F\u7528\u3092\u6700\u9069\u5316\u3057\u307E\u3059\u3002","\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u304C\u63A5\u7D9A\u3055\u308C\u3066\u3044\u306A\u3044\u3068\u3057\u307E\u3059\u3002","\u3053\u306E UI \u3092\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u306B\u6700\u9069\u5316\u3055\u308C\u305F\u30E2\u30FC\u30C9\u3067\u5B9F\u884C\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30B3\u30E1\u30F3\u30C8\u6642\u306B\u7A7A\u767D\u6587\u5B57\u3092\u633F\u5165\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u8FFD\u52A0\u307E\u305F\u306F\u524A\u9664\u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u5207\u308A\u66FF\u3048\u3067\u3001\u7A7A\u306E\u884C\u3092\u7121\u8996\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u9078\u629E\u7BC4\u56F2\u3092\u6307\u5B9A\u3057\u306A\u3044\u3067\u30B3\u30D4\u30FC\u3059\u308B\u5834\u5408\u306B\u73FE\u5728\u306E\u884C\u3092\u30B3\u30D4\u30FC\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5165\u529B\u4E2D\u306B\u4E00\u81F4\u3092\u691C\u7D22\u3059\u308B\u305F\u3081\u306B\u30AB\u30FC\u30BD\u30EB\u3092\u30B8\u30E3\u30F3\u30D7\u3055\u305B\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u304B\u3089\u691C\u7D22\u6587\u5B57\u5217\u3092\u30B7\u30FC\u30C9\u3057\u307E\u305B\u3093\u3002","\u30AB\u30FC\u30BD\u30EB\u4F4D\u7F6E\u306B\u3042\u308B\u5358\u8A9E\u3092\u542B\u3081\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u304B\u3089\u691C\u7D22\u6587\u5B57\u5217\u3092\u5E38\u306B\u30B7\u30FC\u30C9\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u304B\u3089\u691C\u7D22\u6587\u5B57\u5217\u306E\u307F\u3092\u30B7\u30FC\u30C9\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u304B\u3089\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E\u691C\u7D22\u6587\u5B57\u5217\u3092\u4E0E\u3048\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","[\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22] \u3092\u81EA\u52D5\u7684\u306B\u30AA\u30F3\u306B\u3057\u307E\u305B\u3093 (\u65E2\u5B9A)\u3002","[\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22] \u3092\u5E38\u306B\u81EA\u52D5\u7684\u306B\u30AA\u30F3\u306B\u3057\u307E\u3059\u3002","\u8907\u6570\u884C\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306F\u3001[\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22] \u3092\u81EA\u52D5\u7684\u306B\u30AA\u30F3\u306B\u3057\u307E\u3059\u3002","[\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22] \u3092\u81EA\u52D5\u7684\u306B\u30AA\u30F3\u306B\u3059\u308B\u6761\u4EF6\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","macOS \u3067\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u5171\u6709\u306E\u691C\u7D22\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u3092\u8AAD\u307F\u53D6\u308A\u307E\u305F\u306F\u5909\u66F4\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E0A\u306B\u884C\u3092\u3055\u3089\u306B\u8FFD\u52A0\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002true \u306E\u5834\u5408\u3001\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u3068\u304D\u306B\u6700\u521D\u306E\u884C\u3092\u8D85\u3048\u3066\u30B9\u30AF\u30ED\u30FC\u30EB\u3067\u304D\u307E\u3059\u3002","\u4EE5\u964D\u3067\u4E00\u81F4\u304C\u898B\u3064\u304B\u3089\u306A\u3044\u5834\u5408\u306B\u3001\u691C\u7D22\u3092\u5148\u982D\u304B\u3089 (\u307E\u305F\u306F\u672B\u5C3E\u304B\u3089) \u81EA\u52D5\u7684\u306B\u518D\u5B9F\u884C\u3059\u308B\u304B\u3069\u3046\u304B\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D5\u30A9\u30F3\u30C8\u306E\u5408\u5B57 ('calt' \u304A\u3088\u3073 'liga' \u30D5\u30A9\u30F3\u30C8\u306E\u6A5F\u80FD) \u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3057\u307E\u3059\u3002'font-feature-settings' CSS \u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u8A73\u7D30\u306B\u5236\u5FA1\u3059\u308B\u306B\u306F\u3001\u3053\u308C\u3092\u6587\u5B57\u5217\u306B\u5909\u66F4\u3057\u307E\u3059\u3002","\u660E\u793A\u7684\u306A 'font-feature-settings' CSS \u30D7\u30ED\u30D1\u30C6\u30A3\u3002\u5408\u5B57\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u306E\u304C 1 \u3064\u3060\u3051\u3067\u3042\u308B\u5834\u5408\u306F\u3001\u4EE3\u308F\u308A\u306B\u30D6\u30FC\u30EB\u5024\u3092\u6E21\u3059\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002","\u30D5\u30A9\u30F3\u30C8\u306E\u5408\u5B57\u3084\u30D5\u30A9\u30F3\u30C8\u306E\u6A5F\u80FD\u3092\u69CB\u6210\u3057\u307E\u3059\u3002\u5408\u5B57\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3059\u308B\u30D6\u30FC\u30EB\u5024\u307E\u305F\u306F CSS 'font-feature-settings' \u30D7\u30ED\u30D1\u30C6\u30A3\u306E\u5024\u306E\u6587\u5B57\u5217\u3092\u6307\u5B9A\u3067\u304D\u307E\u3059\u3002","font-weight \u304B\u3089 font-variation-settings \u3078\u306E\u5909\u63DB\u3092\u6709\u52B9/\u7121\u52B9\u306B\u3057\u307E\u3059\u3002'font-variation-settings' CSS \u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u7D30\u304B\u304F\u5236\u5FA1\u3059\u308B\u305F\u3081\u306B\u3001\u3053\u308C\u3092\u6587\u5B57\u5217\u306B\u5909\u66F4\u3057\u307E\u3059\u3002","\u660E\u793A\u7684\u306A 'font-variation-settings' CSS \u30D7\u30ED\u30D1\u30C6\u30A3\u3002font-weight \u3092 font-variation-settings \u306B\u5909\u63DB\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u3060\u3051\u3067\u3042\u308C\u3070\u3001\u4EE3\u308F\u308A\u306B\u30D6\u30FC\u30EB\u5024\u3092\u6E21\u3059\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002","\u30D5\u30A9\u30F3\u30C8\u306E\u30D0\u30EA\u30A8\u30FC\u30B7\u30E7\u30F3\u3092\u69CB\u6210\u3057\u307E\u3059\u3002font-weight \u304B\u3089 font-variation-settings \u3078\u306E\u5909\u63DB\u3092\u6709\u52B9/\u7121\u52B9\u306B\u3059\u308B\u30D6\u30FC\u30EB\u5024\u3001\u307E\u305F\u306F CSS 'font-variation-settings' \u30D7\u30ED\u30D1\u30C6\u30A3\u306E\u5024\u306E\u6587\u5B57\u5217\u306E\u3044\u305A\u308C\u304B\u3067\u3059\u3002","\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA (\u30D4\u30AF\u30BB\u30EB\u5358\u4F4D) \u3092\u5236\u5FA1\u3057\u307E\u3059\u3002",'\u4F7F\u7528\u3067\u304D\u308B\u306E\u306F "\u6A19\u6E96" \u304A\u3088\u3073 "\u592A\u5B57" \u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u307E\u305F\u306F 1 \uFF5E 1000 \u306E\u6570\u5B57\u306E\u307F\u3067\u3059\u3002','\u30D5\u30A9\u30F3\u30C8\u306E\u592A\u3055\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002"\u6A19\u6E96" \u304A\u3088\u3073 "\u592A\u5B57" \u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u307E\u305F\u306F 1 \uFF5E 1000 \u306E\u6570\u5B57\u3092\u53D7\u3051\u5165\u308C\u307E\u3059\u3002',"\u7D50\u679C\u306E\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u3092\u8868\u793A (\u65E2\u5B9A)","\u4E3B\u306A\u7D50\u679C\u306B\u79FB\u52D5\u3057\u3001\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u3092\u8868\u793A\u3057\u307E\u3059","\u30D7\u30E9\u30A4\u30DE\u30EA\u7D50\u679C\u306B\u79FB\u52D5\u3057\u3001\u4ED6\u306E\u30E6\u30FC\u30B6\u30FC\u3078\u306E\u30D4\u30FC\u30AF\u30EC\u30B9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u306B\u3057\u307E\u3059","\u3053\u306E\u8A2D\u5B9A\u306F\u975E\u63A8\u5968\u3067\u3059\u3002\u4EE3\u308F\u308A\u306B\u3001'editor.editor.gotoLocation.multipleDefinitions' \u3084 'editor.editor.gotoLocation.multipleImplementations' \u306A\u3069\u306E\u500B\u5225\u306E\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u8907\u6570\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u3042\u308B\u3068\u304D\u306E '\u5B9A\u7FA9\u3078\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8907\u6570\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u3042\u308B\u3068\u304D\u306E '\u578B\u5B9A\u7FA9\u3078\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8907\u6570\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u3042\u308B\u3068\u304D\u306E '\u5BA3\u8A00\u3078\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8907\u6570\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u3042\u308B\u3068\u304D\u306E '\u5B9F\u88C5\u306B\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u8907\u6570\u5B58\u5728\u3059\u308B\u5834\u5408\u306E '\u53C2\u7167\u3078\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","'\u5B9A\u7FA9\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","'\u578B\u5B9A\u7FA9\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","'\u5BA3\u8A00\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","'\u5B9F\u88C5\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","'\u53C2\u7167\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","\u30DB\u30D0\u30FC\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DB\u30D0\u30FC\u3092\u8868\u793A\u5F8C\u306E\u5F85\u3061\u6642\u9593 (\u30DF\u30EA\u79D2) \u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DB\u30D0\u30FC\u306B\u30DE\u30A6\u30B9\u3092\u79FB\u52D5\u3057\u305F\u3068\u304D\u306B\u3001\u30DB\u30D0\u30FC\u3092\u8868\u793A\u3057\u7D9A\u3051\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DB\u30D0\u30FC\u304C\u975E\u8868\u793A\u306B\u306A\u308B\u307E\u3067\u306E\u9045\u5EF6\u3092\u30DF\u30EA\u79D2\u5358\u4F4D\u3067\u5236\u5FA1\u3057\u307E\u3059\u3002`editor.hover.sticky` \u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u30B9\u30DA\u30FC\u30B9\u304C\u3042\u308B\u5834\u5408\u306F\u3001\u884C\u306E\u4E0A\u306B\u30DE\u30A6\u30B9 \u30AB\u30FC\u30BD\u30EB\u3092\u88AB\u305B\u3066\u8868\u793A\u3059\u308B\u3002","\u3059\u3079\u3066\u306E\u6587\u5B57\u306E\u5E45\u304C\u540C\u3058\u3067\u3042\u308B\u3068\u4EEE\u5B9A\u3057\u307E\u3059\u3002\u3053\u308C\u306F\u3001\u30E2\u30CE\u30B9\u30DA\u30FC\u30B9 \u30D5\u30A9\u30F3\u30C8\u3084\u3001\u30B0\u30EA\u30D5\u306E\u5E45\u304C\u7B49\u3057\u3044\u7279\u5B9A\u306E\u30B9\u30AF\u30EA\u30D7\u30C8 (\u30E9\u30C6\u30F3\u6587\u5B57\u306A\u3069) \u3067\u6B63\u3057\u304F\u52D5\u4F5C\u3059\u308B\u9AD8\u901F\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u3067\u3059\u3002","\u6298\u308A\u8FD4\u3057\u30DD\u30A4\u30F3\u30C8\u306E\u8A08\u7B97\u3092\u30D6\u30E9\u30A6\u30B6\u30FC\u306B\u30C7\u30EA\u30B2\u30FC\u30C8\u3057\u307E\u3059\u3002\u3053\u308C\u306F\u3001\u5927\u304D\u306A\u30D5\u30A1\u30A4\u30EB\u306E\u30D5\u30EA\u30FC\u30BA\u3092\u5F15\u304D\u8D77\u3053\u3059\u53EF\u80FD\u6027\u304C\u3042\u308B\u3082\u306E\u306E\u3001\u3059\u3079\u3066\u306E\u30B1\u30FC\u30B9\u3067\u6B63\u3057\u304F\u52D5\u4F5C\u3059\u308B\u4F4E\u901F\u306A\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u3067\u3059\u3002","\u6298\u308A\u8FD4\u3057\u30DD\u30A4\u30F3\u30C8\u3092\u8A08\u7B97\u3059\u308B\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3 \u30E2\u30FC\u30C9\u3067\u306F\u3001\u6700\u9AD8\u306E\u30A8\u30AF\u30B9\u30DA\u30EA\u30A8\u30F3\u30B9\u3092\u5B9F\u73FE\u3059\u308B\u305F\u3081\u306B\u8A73\u7D30\u8A2D\u5B9A\u304C\u4F7F\u7528\u3055\u308C\u308B\u3053\u3068\u306B\u3054\u6CE8\u610F\u304F\u3060\u3055\u3044\u3002","\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3 \u30E1\u30CB\u30E5\u30FC\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u304C\u30B3\u30FC\u30C9\u304C\u5B58\u5728\u3059\u308B\u884C\u306B\u3042\u308B\u3068\u304D\u306B\u3001\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3 \u30E1\u30CB\u30E5\u30FC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u304C\u30B3\u30FC\u30C9\u306E\u3042\u308B\u884C\u307E\u305F\u306F\u7A7A\u306E\u884C\u306B\u3042\u308B\u3068\u304D\u306B\u3001\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3 \u30E1\u30CB\u30E5\u30FC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u96FB\u7403\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30B9\u30AF\u30ED\u30FC\u30EB\u4E2D\u306B\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E0A\u90E8\u306B\u5165\u308C\u5B50\u306B\u306A\u3063\u305F\u73FE\u5728\u306E\u30B9\u30B3\u30FC\u30D7\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u8868\u793A\u3059\u308B\u8FFD\u5F93\u884C\u306E\u6700\u5927\u6570\u3092\u5B9A\u7FA9\u3057\u307E\u3059\u3002","\u56FA\u5B9A\u3059\u308B\u884C\u3092\u6C7A\u5B9A\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3059\u308B\u30E2\u30C7\u30EB\u3092\u5B9A\u7FA9\u3057\u307E\u3059\u3002\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3 \u30E2\u30C7\u30EB\u304C\u5B58\u5728\u3057\u306A\u3044\u5834\u5408\u3001\u30A4\u30F3\u30C7\u30F3\u30C8 \u30E2\u30C7\u30EB\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u3059\u308B\u6298\u308A\u305F\u305F\u307F\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC \u30E2\u30C7\u30EB\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u3057\u307E\u3059\u3002\u3053\u306E\u9806\u5E8F\u306F\u30013 \u3064\u306E\u30B1\u30FC\u30B9\u3059\u3079\u3066\u3067\u512A\u5148\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u6C34\u5E73\u30B9\u30AF\u30ED\u30FC\u30EB \u30D0\u30FC\u3067\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u306E\u30B9\u30AF\u30ED\u30FC\u30EB\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30EC\u30FC \u30D2\u30F3\u30C8\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30EC\u30A4 \u30D2\u30F3\u30C8\u304C\u6709\u52B9\u306B\u306A\u3063\u3066\u3044\u307E\u3059","\u30A4\u30F3\u30EC\u30A4 \u30D2\u30F3\u30C8\u306F\u65E2\u5B9A\u3067\u8868\u793A\u3055\u308C\u3001{0} \u3092\u62BC\u3057\u305F\u307E\u307E\u306B\u3059\u308B\u3068\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059","\u30A4\u30F3\u30EC\u30A4 \u30D2\u30F3\u30C8\u306F\u65E2\u5B9A\u3067\u306F\u975E\u8868\u793A\u306B\u306A\u308A\u3001{0} \u3092\u62BC\u3057\u305F\u307E\u307E\u306B\u3059\u308B\u3068\u8868\u793A\u3055\u308C\u307E\u3059","\u30A4\u30F3\u30EC\u30A4 \u30D2\u30F3\u30C8\u304C\u7121\u52B9\u306B\u306A\u3063\u3066\u3044\u307E\u3059","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306E\u89E3\u8AAC\u30D2\u30F3\u30C8\u306E\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u65E2\u5B9A\u3067\u306F\u3001{0} \u306F\u3001\u69CB\u6210\u3055\u308C\u305F\u5024\u304C {1} \u3088\u308A\u5C0F\u3055\u3044\u304B\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u3088\u308A\u5927\u304D\u3044\u5834\u5408\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u89E3\u8AAC\u30D2\u30F3\u30C8\u306E\u30D5\u30A9\u30F3\u30C8 \u30D5\u30A1\u30DF\u30EA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u7A7A\u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001 {0} \u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306E\u30A4\u30F3\u30EC\u30A4 \u30D2\u30F3\u30C8\u306B\u95A2\u3059\u308B\u30D1\u30C7\u30A3\u30F3\u30B0\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002",`\u884C\u306E\u9AD8\u3055\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\r
+ - 0 \u3092\u4F7F\u7528\u3057\u3066\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u304B\u3089\u884C\u306E\u9AD8\u3055\u3092\u81EA\u52D5\u7684\u306B\u8A08\u7B97\u3057\u307E\u3059\u3002\r
+ - 0 \u304B\u3089 8 \u307E\u3067\u306E\u5024\u306F\u3001\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u306E\u4E57\u6570\u3068\u3057\u3066\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002\r
+ - 8 \u4EE5\u4E0A\u306E\u5024\u306F\u6709\u52B9\u5024\u3068\u3057\u3066\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002`,"\u30DF\u30CB\u30DE\u30C3\u30D7\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u3092\u81EA\u52D5\u7684\u306B\u975E\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306E\u30B5\u30A4\u30BA\u306F\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u3068\u540C\u3058\u3067\u3059 (\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059)\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306F\u3001\u5FC5\u8981\u306B\u5FDC\u3058\u3066\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9AD8\u3055\u3092\u57CB\u3081\u308B\u305F\u3081\u3001\u62E1\u5927\u307E\u305F\u306F\u7E2E\u5C0F\u3057\u307E\u3059 (\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u307E\u305B\u3093)\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306F\u5FC5\u8981\u306B\u5FDC\u3058\u3066\u7E2E\u5C0F\u3057\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u3088\u308A\u5927\u304D\u304F\u306A\u308B\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093 (\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u307E\u305B\u3093)\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306E\u30B5\u30A4\u30BA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u3092\u8868\u793A\u3059\u308B\u5834\u6240\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7 \u30B9\u30E9\u30A4\u30C0\u30FC\u3092\u8868\u793A\u3059\u308B\u30BF\u30A4\u30DF\u30F3\u30B0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306B\u63CF\u753B\u3055\u308C\u308B\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u30B9\u30B1\u30FC\u30EB: 1\u30012\u3001\u307E\u305F\u306F 3\u3002","\u884C\u306B\u30AB\u30E9\u30FC \u30D6\u30ED\u30C3\u30AF\u3067\u306F\u306A\u304F\u5B9F\u969B\u306E\u6587\u5B57\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u8868\u793A\u3059\u308B\u30DF\u30CB\u30DE\u30C3\u30D7\u306E\u6700\u5927\u5E45\u3092\u7279\u5B9A\u306E\u5217\u6570\u306B\u5236\u9650\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E0A\u7AEF\u3068\u6700\u521D\u306E\u884C\u306E\u9593\u306E\u4F59\u767D\u306E\u5927\u304D\u3055\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E0B\u7AEF\u3068\u6700\u5F8C\u306E\u884C\u306E\u9593\u306E\u4F59\u767D\u306E\u5927\u304D\u3055\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5165\u529B\u6642\u306B\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3068\u578B\u60C5\u5831\u3092\u8868\u793A\u3059\u308B\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8 \u30E1\u30CB\u30E5\u30FC\u3092\u5468\u56DE\u3059\u308B\u304B\u3001\u30EA\u30B9\u30C8\u306E\u6700\u5F8C\u3067\u9589\u3058\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u63D0\u6848\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306B\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u308B","\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u304C\u30B4\u30FC\u30B9\u30C8 \u30C6\u30AD\u30B9\u30C8\u3068\u3057\u3066\u8868\u793A\u3055\u308C\u308B","\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u304C\u7121\u52B9\u306B\u306A\u3063\u3066\u3044\u307E\u3059","\u6587\u5B57\u5217\u5185\u3067\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30B3\u30E1\u30F3\u30C8\u5185\u3067\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u6587\u5B57\u5217\u304A\u3088\u3073\u30B3\u30E1\u30F3\u30C8\u5916\u3067\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u5165\u529B\u4E2D\u306B\u5019\u88DC\u3092\u81EA\u52D5\u7684\u306B\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u3053\u308C\u306F\u3001\u30B3\u30E1\u30F3\u30C8\u3001\u6587\u5B57\u5217\u3001\u305D\u306E\u4ED6\u30B3\u30FC\u30C9\u306E\u5165\u529B\u7528\u306B\u8A2D\u5B9A\u3067\u304D\u307E\u3059\u3002\u30AF\u30A4\u30C3\u30AF\u63D0\u6848\u306F\u3001\u30B4\u30FC\u30B9\u30C8 \u30C6\u30AD\u30B9\u30C8\u3068\u3057\u3066\u8868\u793A\u3059\u308B\u304B\u3001\u63D0\u6848\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3067\u8868\u793A\u3059\u308B\u3088\u3046\u306B\u69CB\u6210\u3067\u304D\u307E\u3059\u3002\u307E\u305F\u3001'{0}' \u306B\u6CE8\u610F\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u3053\u308C\u306F\u3001\u63D0\u6848\u304C\u7279\u6B8A\u6587\u5B57\u306B\u3088\u3063\u3066\u30C8\u30EA\u30AC\u30FC\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3059\u308B\u8A2D\u5B9A\u3067\u3059\u3002","\u884C\u756A\u53F7\u306F\u8868\u793A\u3055\u308C\u307E\u305B\u3093\u3002","\u884C\u756A\u53F7\u306F\u3001\u7D76\u5BFE\u5024\u3068\u3057\u3066\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u884C\u756A\u53F7\u306F\u3001\u30AB\u30FC\u30BD\u30EB\u4F4D\u7F6E\u307E\u3067\u306E\u884C\u6570\u3068\u3057\u3066\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u884C\u756A\u53F7\u306F 10 \u884C\u3054\u3068\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u884C\u756A\u53F7\u306E\u8868\u793A\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u3053\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30EB\u30FC\u30E9\u30FC\u304C\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\u3059\u308B\u5358\u4E00\u9818\u57DF\u306E\u6587\u5B57\u6570\u3002","\u3053\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30EB\u30FC\u30E9\u30FC\u306E\u8272\u3067\u3059\u3002","\u7279\u5B9A\u306E\u7B49\u5E45\u6587\u5B57\u6570\u306E\u5F8C\u306B\u5782\u76F4\u30EB\u30FC\u30E9\u30FC\u3092\u8868\u793A\u3057\u307E\u3059\u3002\u8907\u6570\u306E\u30EB\u30FC\u30E9\u30FC\u306B\u306F\u8907\u6570\u306E\u5024\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002\u914D\u5217\u304C\u7A7A\u306E\u5834\u5408\u306F\u30EB\u30FC\u30E9\u30FC\u3092\u8868\u793A\u3057\u307E\u305B\u3093\u3002","\u5782\u76F4\u30B9\u30AF\u30ED\u30FC\u30EB\u30D0\u30FC\u306F\u3001\u5FC5\u8981\u306A\u5834\u5408\u306B\u306E\u307F\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5782\u76F4\u30B9\u30AF\u30ED\u30FC\u30EB\u30D0\u30FC\u306F\u5E38\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5782\u76F4\u30B9\u30AF\u30ED\u30FC\u30EB\u30D0\u30FC\u306F\u5E38\u306B\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002","\u5782\u76F4\u30B9\u30AF\u30ED\u30FC\u30EB\u30D0\u30FC\u306E\u8868\u793A\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6C34\u5E73\u30B9\u30AF\u30ED\u30FC\u30EB\u30D0\u30FC\u306F\u3001\u5FC5\u8981\u306A\u5834\u5408\u306B\u306E\u307F\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6C34\u5E73\u30B9\u30AF\u30ED\u30FC\u30EB\u30D0\u30FC\u306F\u5E38\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6C34\u5E73\u30B9\u30AF\u30ED\u30FC\u30EB\u30D0\u30FC\u306F\u5E38\u306B\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002","\u6C34\u5E73\u30B9\u30AF\u30ED\u30FC\u30EB\u30D0\u30FC\u306E\u8868\u793A\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5782\u76F4\u30B9\u30AF\u30ED\u30FC\u30EB\u30D0\u30FC\u306E\u5E45\u3002","\u6C34\u5E73\u30B9\u30AF\u30ED\u30FC\u30EB\u30D0\u30FC\u306E\u9AD8\u3055\u3002","\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u3068\u30DA\u30FC\u30B8\u5358\u4F4D\u3067\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u304B\u3001\u30AF\u30EA\u30C3\u30AF\u4F4D\u7F6E\u306B\u30B8\u30E3\u30F3\u30D7\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8A2D\u5B9A\u3059\u308B\u3068\u3001\u6C34\u5E73\u30B9\u30AF\u30ED\u30FC\u30EB \u30D0\u30FC\u306F\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u30B5\u30A4\u30BA\u3092\u5927\u304D\u304F\u3057\u307E\u305B\u3093\u3002","\u57FA\u672C ASCII \u4EE5\u5916\u306E\u3059\u3079\u3066\u306E\u6587\u5B57\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002U+0020 \u304B\u3089 U+007E \u306E\u9593\u306E\u6587\u5B57\u3001\u30BF\u30D6\u3001\u6539\u884C (LF)\u3001\u884C\u982D\u5FA9\u5E30\u306E\u307F\u304C\u57FA\u672C ASCII \u3068\u898B\u306A\u3055\u308C\u307E\u3059\u3002","\u7A7A\u767D\u3092\u5360\u3081\u308B\u3060\u3051\u306E\u6587\u5B57\u3084\u5E45\u304C\u307E\u3063\u305F\u304F\u306A\u3044\u6587\u5B57\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u73FE\u5728\u306E\u30E6\u30FC\u30B6\u30FC \u30ED\u30B1\u30FC\u30EB\u3067\u4E00\u822C\u7684\u306A\u6587\u5B57\u3092\u9664\u304D\u3001\u57FA\u672C\u7684\u306A ASCII \u6587\u5B57\u3068\u6DF7\u540C\u3055\u308C\u308B\u53EF\u80FD\u6027\u306E\u3042\u308B\u6587\u5B57\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30B3\u30E1\u30F3\u30C8\u5185\u306E\u6587\u5B57\u3092 Unicode \u5F37\u8ABF\u8868\u793A\u306E\u5BFE\u8C61\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6587\u5B57\u5217\u5185\u306E\u6587\u5B57\u3092 Unicode \u5F37\u8ABF\u8868\u793A\u306E\u5BFE\u8C61\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5F37\u8ABF\u8868\u793A\u305B\u305A\u8A31\u53EF\u3055\u308C\u308B\u6587\u5B57\u3092\u5B9A\u7FA9\u3057\u307E\u3059\u3002","\u8A31\u53EF\u3055\u308C\u3066\u3044\u308B\u30ED\u30B1\u30FC\u30EB\u3067\u4E00\u822C\u7684\u306A Unicode \u6587\u5B57\u306F\u5F37\u8ABF\u8868\u793A\u3055\u308C\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u3092\u81EA\u52D5\u7684\u306B\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u308B\u305F\u3073\u306B\u3001\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u30C4\u30FC\u30EB \u30D0\u30FC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u306B\u30AB\u30FC\u30BD\u30EB\u3092\u5408\u308F\u305B\u308B\u305F\u3073\u306B\u3001\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u30C4\u30FC\u30EB \u30D0\u30FC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u30C4\u30FC\u30EB \u30D0\u30FC\u3092\u4ECA\u5F8C\u306F\u8868\u793A\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u30C4\u30FC\u30EB \u30D0\u30FC\u3092\u8868\u793A\u3059\u308B\u30BF\u30A4\u30DF\u30F3\u30B0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3\u63D0\u6848\u3068\u63D0\u6848\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u76F8\u4E92\u4F5C\u7528\u306E\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u6709\u52B9\u3059\u308B\u3068\u3001\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u304C\u4F7F\u7528\u53EF\u80FD\u306A\u5834\u5408\u306F\u3001\u63D0\u6848\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u81EA\u52D5\u7684\u306B\u8868\u793A\u3055\u308C\u307E\u305B\u3093\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3\u63D0\u6848\u306E\u30D5\u30A9\u30F3\u30C8 \u30D5\u30A1\u30DF\u30EA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D6\u30E9\u30B1\u30C3\u30C8\u306E\u30DA\u30A2\u306E\u8272\u4ED8\u3051\u304C\u6709\u52B9\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002 {0} \u3092\u4F7F\u7528\u3057\u3066\u3001\u30D6\u30E9\u30B1\u30C3\u30C8\u306E\u5F37\u8ABF\u8868\u793A\u306E\u8272\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3057\u307E\u3059\u3002","\u62EC\u5F27\u306E\u5404\u7A2E\u5225\u304C\u3001\u500B\u5225\u306E\u30AB\u30E9\u30FC \u30D7\u30FC\u30EB\u3092\u4FDD\u6301\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D6\u30E9\u30B1\u30C3\u30C8 \u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30D6\u30E9\u30B1\u30C3\u30C8 \u30DA\u30A2\u306B\u5BFE\u3057\u3066\u306E\u307F\u30D6\u30E9\u30B1\u30C3\u30C8 \u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30D6\u30E9\u30B1\u30C3\u30C8 \u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\u3002","\u30D6\u30E9\u30B1\u30C3\u30C8 \u30DA\u30A2\u306E\u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u7E26\u306E\u30D6\u30E9\u30B1\u30C3\u30C8 \u30DA\u30A2\u306E\u30AC\u30A4\u30C9\u306B\u52A0\u3048\u3066\u3001\u540C\u3058\u304F\u6C34\u5E73\u306E\u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30D6\u30E9\u30B1\u30C3\u30C8 \u30DA\u30A2\u306B\u5BFE\u3057\u3066\u306E\u307F\u3001\u6C34\u5E73\u306E\u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u6C34\u5E73\u30D6\u30E9\u30B1\u30C3\u30C8 \u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\u3002","\u6C34\u5E73\u65B9\u5411\u306E\u30D6\u30E9\u30B1\u30C3\u30C8 \u30DA\u30A2\u306E\u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u89D2\u304B\u3063\u3053\u30AC\u30A4\u30C9\u304C\u5F37\u8ABF\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3067\u3082\u3001\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u3092\u5F37\u8ABF\u8868\u793A\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A4\u30F3\u30C7\u30F3\u30C8\u306E\u30AC\u30A4\u30C9\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u306E\u53F3\u306E\u30C6\u30AD\u30B9\u30C8\u3092\u4E0A\u66F8\u304D\u305B\u305A\u306B\u5019\u88DC\u3092\u633F\u5165\u3057\u307E\u3059\u3002","\u5019\u88DC\u3092\u633F\u5165\u3057\u3001\u30AB\u30FC\u30BD\u30EB\u306E\u53F3\u306E\u30C6\u30AD\u30B9\u30C8\u3092\u4E0A\u66F8\u304D\u3057\u307E\u3059\u3002","\u5165\u529B\u5019\u88DC\u3092\u53D7\u3051\u5165\u308C\u308B\u3068\u304D\u306B\u5358\u8A9E\u3092\u4E0A\u66F8\u304D\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u3053\u308C\u306F\u3001\u3053\u306E\u6A5F\u80FD\u306E\u5229\u7528\u3092\u9078\u629E\u3059\u308B\u62E1\u5F35\u6A5F\u80FD\u306B\u4F9D\u5B58\u3059\u308B\u3053\u3068\u306B\u3054\u6CE8\u610F\u304F\u3060\u3055\u3044\u3002","\u5019\u88DC\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u51E6\u7406\u3068\u4E26\u3073\u66FF\u3048\u3067\u3055\u3055\u3044\u306A\u5165\u529B\u30DF\u30B9\u3092\u8003\u616E\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u4E26\u3079\u66FF\u3048\u304C\u30AB\u30FC\u30BD\u30EB\u4ED8\u8FD1\u306B\u8868\u793A\u3055\u308C\u308B\u5358\u8A9E\u3092\u512A\u5148\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u4FDD\u5B58\u3055\u308C\u305F\u5019\u88DC\u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u8907\u6570\u306E\u30EF\u30FC\u30AF\u30D7\u30EC\u30FC\u30B9\u3068\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u5171\u6709\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059 (`#editor.suggestSelection#` \u304C\u5FC5\u8981)\u3002","IntelliSense \u3092\u81EA\u52D5\u3067\u30C8\u30EA\u30AC\u30FC\u3059\u308B\u5834\u5408\u306B\u3001\u5E38\u306B\u5019\u88DC\u3092\u9078\u629E\u3057\u307E\u3059\u3002","IntelliSense \u3092\u81EA\u52D5\u3067\u30C8\u30EA\u30AC\u30FC\u3059\u308B\u5834\u5408\u306B\u3001\u5019\u88DC\u3092\u9078\u629E\u3057\u307E\u305B\u3093\u3002","\u30C8\u30EA\u30AC\u30FC\u6587\u5B57\u304B\u3089 IntelliSense \u3092\u30C8\u30EA\u30AC\u30FC\u3059\u308B\u5834\u5408\u306B\u306E\u307F\u3001\u5019\u88DC\u3092\u9078\u629E\u3057\u307E\u3059\u3002","\u5165\u529B\u6642\u306B IntelliSense \u3092\u30C8\u30EA\u30AC\u30FC\u3059\u308B\u5834\u5408\u306B\u306E\u307F\u3001\u5019\u88DC\u3092\u9078\u629E\u3057\u307E\u3059\u3002","\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3092\u8868\u793A\u3059\u308B\u969B\u306B\u5019\u88DC\u3092\u9078\u629E\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u3053\u3061\u3089\u306F\u81EA\u52D5\u7684\u306B\u30C8\u30EA\u30AC\u30FC\u3055\u308C\u308B\u5019\u88DC ('#editor.quickSuggestions#' \u3068 '#editor.suggestOnTriggerCharacters#') \u306B\u306E\u307F\u9069\u7528\u3055\u308C\u3001('Ctrl+Space' \u306A\u3069\u3092\u901A\u3058\u3066) \u660E\u793A\u7684\u306B\u547C\u3073\u51FA\u3055\u308C\u308B\u969B\u306B\u306F\u5E38\u306B\u5019\u88DC\u304C\u9078\u629E\u3055\u308C\u308B\u3053\u3068\u306B\u3054\u6CE8\u610F\u304F\u3060\u3055\u3044\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6 \u30B9\u30CB\u30DA\u30C3\u30C8\u304C\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u3092\u9632\u6B62\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u63D0\u6848\u306E\u30A2\u30A4\u30B3\u30F3\u3092\u8868\u793A\u3059\u308B\u304B\u3001\u975E\u8868\u793A\u306B\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u4E0B\u90E8\u306B\u3042\u308B\u30B9\u30C6\u30FC\u30BF\u30B9 \u30D0\u30FC\u306E\u8868\u793A\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u63D0\u6848\u306E\u7D50\u679C\u3092\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30D7\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5019\u88DC\u306E\u8A73\u7D30\u3092\u30E9\u30D9\u30EB\u4ED8\u304D\u306E\u30A4\u30F3\u30E9\u30A4\u30F3\u3067\u8868\u793A\u3059\u308B\u304B\u3001\u8A73\u7D30\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u306E\u307F\u8868\u793A\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u3053\u306E\u8A2D\u5B9A\u306F\u975E\u63A8\u5968\u3067\u3059\u3002\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30B5\u30A4\u30BA\u5909\u66F4\u304C\u3067\u304D\u308B\u3088\u3046\u306B\u306A\u308A\u307E\u3057\u305F\u3002","\u3053\u306E\u8A2D\u5B9A\u306F\u975E\u63A8\u5968\u3067\u3059\u3002\u4EE3\u308F\u308A\u306B\u3001'editor.suggest.showKeywords' \u3084 'editor.suggest.showSnippets' \u306A\u3069\u306E\u500B\u5225\u306E\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30E1\u30BD\u30C3\u30C9` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u95A2\u6570` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u30FC` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u975E\u63A8\u5968` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u51E6\u7406\u3067\u306F\u3001\u5358\u8A9E\u306E\u5148\u982D\u3067\u6700\u521D\u306E\u6587\u5B57\u304C\u4E00\u81F4\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u305F\u3068\u3048\u3070\u3001`Console` \u3084 `WebContext` \u306E\u5834\u5408\u306F `c`\u3001`description` \u306E\u5834\u5408\u306F _not_ \u3067\u3059\u3002\u7121\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306F\u3088\u308A\u591A\u304F\u306E\u7D50\u679C\u3092\u8868\u793A\u3057\u307E\u3059\u304C\u3001\u4E00\u81F4\u54C1\u8CEA\u3067\u4E26\u3079\u66FF\u3048\u3089\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30D5\u30A3\u30FC\u30EB\u30C9` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u5909\u6570` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B '\u30AF\u30E9\u30B9' \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u69CB\u9020\u4F53` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30E2\u30B8\u30E5\u30FC\u30EB` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30D7\u30ED\u30D1\u30C6\u30A3` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30A4\u30D9\u30F3\u30C8` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u6F14\u7B97\u5B50` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30E6\u30CB\u30C3\u30C8` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u5024` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u5B9A\u6570` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u5217\u6319\u578B` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `enumMember` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30AD\u30FC\u30EF\u30FC\u30C9` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B '\u30C6\u30AD\u30B9\u30C8' -\u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u8272` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B '\u30D5\u30A1\u30A4\u30EB' \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u53C2\u7167` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `customcolor` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30D5\u30A9\u30EB\u30C0\u30FC` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `typeParameter` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30B9\u30CB\u30DA\u30C3\u30C8` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306A\u5834\u5408\u3001IntelliSense \u306B\u3088\u3063\u3066 '\u30E6\u30FC\u30B6\u30FC' \u5019\u88DC\u304C\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B\u3088\u3063\u3066 '\u554F\u984C' \u5019\u88DC\u304C\u793A\u3055\u308C\u307E\u3059\u3002","\u5148\u982D\u3068\u672B\u5C3E\u306E\u7A7A\u767D\u3092\u5E38\u306B\u9078\u629E\u3059\u308B\u304B\u3069\u3046\u304B\u3002","\u30B5\u30D6\u30EF\u30FC\u30C9 ('fooBar' \u306E 'foo' \u307E\u305F\u306F 'foo_bar' \u306A\u3069) \u3092\u9078\u629E\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u304B\u3069\u3046\u304B\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8\u3057\u307E\u305B\u3093\u3002 \u6298\u308A\u8FD4\u3057\u884C\u306F\u5217 1 \u304B\u3089\u59CB\u307E\u308A\u307E\u3059\u3002","\u6298\u308A\u8FD4\u3057\u884C\u306F\u3001\u89AA\u3068\u540C\u3058\u30A4\u30F3\u30C7\u30F3\u30C8\u306B\u306A\u308A\u307E\u3059\u3002","\u6298\u308A\u8FD4\u3057\u884C\u306F\u3001\u89AA +1 \u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u306B\u306A\u308A\u307E\u3059\u3002","\u6298\u308A\u8FD4\u3057\u884C\u306F\u3001\u89AA +2 \u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u306B\u306A\u308A\u307E\u3059\u3002","\u6298\u308A\u8FD4\u3057\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","(\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u304F\u4EE3\u308F\u308A\u306B) `Shift` \u30AD\u30FC\u3092\u62BC\u3057\u306A\u304C\u3089\u30C6\u30AD\u30B9\u30C8 \u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30D5\u30A1\u30A4\u30EB\u3092\u30C9\u30E9\u30C3\u30B0 \u30A2\u30F3\u30C9 \u30C9\u30ED\u30C3\u30D7\u3067\u304D\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30D5\u30A1\u30A4\u30EB\u3092\u30C9\u30ED\u30C3\u30D7\u3059\u308B\u3068\u304D\u306B\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u3053\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3067\u306F\u3001\u30D5\u30A1\u30A4\u30EB\u306E\u30C9\u30ED\u30C3\u30D7\u65B9\u6CD5\u3092\u5236\u5FA1\u3067\u304D\u307E\u3059\u3002","\u30D5\u30A1\u30A4\u30EB\u304C\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30C9\u30ED\u30C3\u30D7\u3055\u308C\u305F\u5F8C\u306B\u3001\u30C9\u30ED\u30C3\u30D7 \u30BB\u30EC\u30AF\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u30C9\u30ED\u30C3\u30D7 \u30BB\u30EC\u30AF\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3092\u8868\u793A\u3057\u307E\u305B\u3093\u3002\u4EE3\u308F\u308A\u306B\u3001\u65E2\u5B9A\u306E\u30C9\u30ED\u30C3\u30D7 \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u5E38\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u3055\u307E\u3056\u307E\u306A\u65B9\u6CD5\u3067\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u8CBC\u308A\u4ED8\u3051\u308B\u3053\u3068\u304C\u3067\u304D\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u8CBC\u308A\u4ED8\u3051\u308B\u3068\u304D\u306B\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u3053\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3092\u4F7F\u7528\u3059\u308B\u3068\u3001\u30D5\u30A1\u30A4\u30EB\u306E\u8CBC\u308A\u4ED8\u3051\u65B9\u6CD5\u3092\u5236\u5FA1\u3067\u304D\u307E\u3059\u3002","\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u8CBC\u308A\u4ED8\u3051\u305F\u5F8C\u3001\u8CBC\u308A\u4ED8\u3051\u30BB\u30EC\u30AF\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u8CBC\u308A\u4ED8\u3051\u30BB\u30EC\u30AF\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3092\u8868\u793A\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002\u4EE3\u308F\u308A\u306B\u3001\u65E2\u5B9A\u306E\u8CBC\u308A\u4ED8\u3051\u52D5\u4F5C\u304C\u5E38\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30B3\u30DF\u30C3\u30C8\u6587\u5B57\u3067\u5019\u88DC\u3092\u53D7\u3051\u5165\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u305F\u3068\u3048\u3070\u3001JavaScript \u3067\u306F\u30BB\u30DF\u30B3\u30ED\u30F3 (`;`) \u3092\u30B3\u30DF\u30C3\u30C8\u6587\u5B57\u306B\u3057\u3066\u3001\u5019\u88DC\u3092\u53D7\u3051\u5165\u308C\u3066\u305D\u306E\u6587\u5B57\u3092\u5165\u529B\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002","\u30C6\u30AD\u30B9\u30C8\u306E\u5909\u66F4\u3092\u884C\u3046\u3068\u304D\u3001`Enter` \u3092\u4F7F\u7528\u3059\u308B\u5834\u5408\u306B\u306E\u307F\u5019\u88DC\u3092\u53D7\u3051\u4ED8\u3051\u307E\u3059\u3002","`Tab` \u30AD\u30FC\u306B\u52A0\u3048\u3066 `Enter` \u30AD\u30FC\u3067\u5019\u88DC\u3092\u53D7\u3051\u5165\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u6539\u884C\u306E\u633F\u5165\u3084\u5019\u88DC\u306E\u53CD\u6620\u306E\u9593\u3067\u3042\u3044\u307E\u3044\u3055\u3092\u89E3\u6D88\u3059\u308B\u306E\u306B\u5F79\u7ACB\u3061\u307E\u3059\u3002","\u4E00\u5EA6\u306B\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u306B\u3088\u3063\u3066\u8AAD\u307F\u4E0A\u3052\u308B\u3053\u3068\u304C\u3067\u304D\u308B\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u884C\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u304C\u691C\u51FA\u3055\u308C\u308B\u3068\u3001\u65E2\u5B9A\u5024\u304C 500 \u306B\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059\u3002\u8B66\u544A: \u65E2\u5B9A\u5024\u3088\u308A\u5927\u304D\u3044\u6570\u5024\u306E\u5834\u5408\u306F\u3001\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u306B\u5F71\u97FF\u304C\u3042\u308A\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30F3\u30C4","\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u306B\u3088\u3063\u3066\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u304C\u8AAD\u307F\u4E0A\u3052\u3089\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8A00\u8A9E\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u3001\u3044\u3064\u304B\u3063\u3053\u3092\u81EA\u52D5\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u304B\u6C7A\u5B9A\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u304C\u7A7A\u767D\u6587\u5B57\u306E\u5DE6\u306B\u3042\u308B\u3068\u304D\u3060\u3051\u3001\u304B\u3063\u3053\u3092\u81EA\u52D5\u30AF\u30ED\u30FC\u30BA\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u5DE6\u89D2\u304B\u3063\u3053\u3092\u8FFD\u52A0\u3057\u305F\u5F8C\u306B\u81EA\u52D5\u7684\u306B\u53F3\u89D2\u304B\u3063\u3053\u3092\u633F\u5165\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8A00\u8A9E\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u3001\u3044\u3064\u304B\u3063\u3053\u3092\u81EA\u52D5\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u304B\u6C7A\u5B9A\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u304C\u7A7A\u767D\u6587\u5B57\u306E\u5DE6\u306B\u3042\u308B\u3068\u304D\u3060\u3051\u3001\u30B3\u30E1\u30F3\u30C8\u3092\u81EA\u52D5\u30AF\u30ED\u30FC\u30BA\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u5DE6\u89D2\u304B\u3063\u3053\u3092\u8FFD\u52A0\u3057\u305F\u5F8C\u306B\u81EA\u52D5\u7684\u306B\u53F3\u89D2\u304B\u3063\u3053\u3092\u633F\u5165\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u96A3\u63A5\u3059\u308B\u7D42\u308F\u308A\u5F15\u7528\u7B26\u307E\u305F\u306F\u62EC\u5F27\u304C\u81EA\u52D5\u7684\u306B\u633F\u5165\u3055\u308C\u305F\u5834\u5408\u306B\u306E\u307F\u3001\u305D\u308C\u3089\u3092\u524A\u9664\u3057\u307E\u3059\u3002","\u524A\u9664\u6642\u306B\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u96A3\u63A5\u3059\u308B\u7D42\u308F\u308A\u5F15\u7528\u7B26\u307E\u305F\u306F\u62EC\u5F27\u3092\u524A\u9664\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u7D42\u308F\u308A\u5F15\u7528\u7B26\u307E\u305F\u306F\u62EC\u5F27\u304C\u81EA\u52D5\u7684\u306B\u633F\u5165\u3055\u308C\u305F\u5834\u5408\u306B\u306E\u307F\u3001\u305D\u308C\u3089\u3092\u4E0A\u66F8\u304D\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u7D42\u308F\u308A\u5F15\u7528\u7B26\u307E\u305F\u306F\u62EC\u5F27\u3092\u4E0A\u66F8\u304D\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8A00\u8A9E\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u3001\u3044\u3064\u5F15\u7528\u7B26\u3092\u81EA\u52D5\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u304B\u6C7A\u5B9A\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u304C\u7A7A\u767D\u6587\u5B57\u306E\u5DE6\u306B\u3042\u308B\u3068\u304D\u3060\u3051\u3001\u5F15\u7528\u7B26\u3092\u81EA\u52D5\u30AF\u30ED\u30FC\u30BA\u3057\u307E\u3059\u3002","\u30E6\u30FC\u30B6\u30FC\u304C\u958B\u59CB\u5F15\u7528\u7B26\u3092\u8FFD\u52A0\u3057\u305F\u5F8C\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u81EA\u52D5\u7684\u306B\u5F15\u7528\u7B26\u3092\u9589\u3058\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u81EA\u52D5\u7684\u306B\u633F\u5165\u3057\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u73FE\u5728\u306E\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u4FDD\u6301\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u73FE\u5728\u306E\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u4FDD\u6301\u3057\u3001\u8A00\u8A9E\u304C\u5B9A\u7FA9\u3055\u308C\u305F\u304B\u3063\u3053\u3092\u512A\u5148\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u73FE\u5728\u306E\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u4FDD\u6301\u3057\u3001\u8A00\u8A9E\u304C\u5B9A\u7FA9\u3055\u308C\u305F\u304B\u3063\u3053\u3092\u512A\u5148\u3057\u3001\u8A00\u8A9E\u3067\u5B9A\u7FA9\u3055\u308C\u305F\u7279\u5225\u306A onEnterRules \u3092\u547C\u3073\u51FA\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u73FE\u5728\u306E\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u4FDD\u6301\u3057\u3001\u8A00\u8A9E\u304C\u5B9A\u7FA9\u3055\u308C\u305F\u304B\u3063\u3053\u3092\u512A\u5148\u3057\u3001\u8A00\u8A9E\u3067\u5B9A\u7FA9\u3055\u308C\u305F\u7279\u5225\u306A onEnterRules \u3092\u547C\u3073\u51FA\u3057\u3001\u8A00\u8A9E\u3067\u5B9A\u7FA9\u3055\u308C\u305F indentationRules \u3092\u512A\u5148\u3057\u307E\u3059\u3002","\u30E6\u30FC\u30B6\u30FC\u304C\u884C\u3092\u5165\u529B\u3001\u8CBC\u308A\u4ED8\u3051\u3001\u79FB\u52D5\u3001\u307E\u305F\u306F\u30A4\u30F3\u30C7\u30F3\u30C8\u3059\u308B\u3068\u304D\u306B\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u81EA\u52D5\u7684\u306B\u8ABF\u6574\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8A00\u8A9E\u69CB\u6210\u3092\u4F7F\u7528\u3057\u3066\u3001\u9078\u629E\u7BC4\u56F2\u3092\u3044\u3064\u81EA\u52D5\u7684\u306B\u56F2\u3080\u304B\u3092\u5224\u65AD\u3057\u307E\u3059\u3002","\u89D2\u304B\u3063\u3053\u3067\u306F\u306A\u304F\u3001\u5F15\u7528\u7B26\u3067\u56F2\u307F\u307E\u3059\u3002","\u5F15\u7528\u7B26\u3067\u306F\u306A\u304F\u3001\u89D2\u304B\u3063\u3053\u3067\u56F2\u307F\u307E\u3059\u3002","\u5F15\u7528\u7B26\u307E\u305F\u306F\u89D2\u304B\u3063\u3053\u3092\u5165\u529B\u3059\u308B\u3068\u304D\u306B\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u9078\u629E\u7BC4\u56F2\u3092\u81EA\u52D5\u7684\u306B\u56F2\u3080\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8\u306B\u30B9\u30DA\u30FC\u30B9\u3092\u4F7F\u7528\u3059\u308B\u3068\u304D\u306F\u3001\u30BF\u30D6\u6587\u5B57\u306E\u9078\u629E\u52D5\u4F5C\u3092\u30A8\u30DF\u30E5\u30EC\u30FC\u30C8\u3057\u307E\u3059\u3002\u9078\u629E\u7BC4\u56F2\u306F\u30BF\u30D6\u4F4D\u7F6E\u306B\u7559\u307E\u308A\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067 CodeLens \u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","CodeLens \u306E\u30D5\u30A9\u30F3\u30C8 \u30D5\u30A1\u30DF\u30EA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","CodeLens \u306E\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u3092\u30D4\u30AF\u30BB\u30EB\u5358\u4F4D\u3067\u5236\u5FA1\u3057\u307E\u3059\u30020 \u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001`#editor.fontSize#` \u306E 90% \u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30E9\u30A4\u30F3 \u30AB\u30E9\u30FC \u30C7\u30B3\u30EC\u30FC\u30BF\u30FC\u3068\u8272\u306E\u9078\u629E\u3092\u8868\u793A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AB\u30E9\u30FC \u30C7\u30B3\u30EC\u30FC\u30BF\u30FC\u306E\u30AF\u30EA\u30C3\u30AF\u6642\u3068\u30DD\u30A4\u30F3\u30C8\u6642\u306E\u4E21\u65B9\u306B\u30AB\u30E9\u30FC \u30D4\u30C3\u30AB\u30FC\u3092\u8868\u793A\u3059\u308B","\u30AB\u30E9\u30FC \u30C7\u30B3\u30EC\u30FC\u30BF\u30FC\u306E\u30DD\u30A4\u30F3\u30C8\u6642\u306B\u30AB\u30E9\u30FC \u30D4\u30C3\u30AB\u30FC\u3092\u8868\u793A\u3059\u308B","\u30AB\u30E9\u30FC \u30C7\u30B3\u30EC\u30FC\u30BF\u30FC\u306E\u30AF\u30EA\u30C3\u30AF\u6642\u306B\u30AB\u30E9\u30FC \u30D4\u30C3\u30AB\u30FC\u3092\u8868\u793A\u3059\u308B","\u30AB\u30E9\u30FC \u30C7\u30B3\u30EC\u30FC\u30BF\u30FC\u304B\u3089\u30AB\u30E9\u30FC \u30D4\u30C3\u30AB\u30FC\u3092\u8868\u793A\u3059\u308B\u6761\u4EF6\u3092\u5236\u5FA1\u3057\u307E\u3059","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u4E00\u5EA6\u306B\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\u3067\u304D\u308B\u30AB\u30E9\u30FC \u30C7\u30B3\u30EC\u30FC\u30BF\u30FC\u306E\u6700\u5927\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u3068\u30AD\u30FC\u3067\u306E\u9078\u629E\u306B\u3088\u308A\u5217\u306E\u9078\u629E\u3092\u5B9F\u884C\u3067\u304D\u308B\u3088\u3046\u306B\u3057\u307E\u3059\u3002","\u69CB\u6587\u30CF\u30A4\u30E9\u30A4\u30C8\u3092\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u30B3\u30D4\u30FC\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u306E\u30A2\u30CB\u30E1\u30FC\u30B7\u30E7\u30F3\u65B9\u5F0F\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30B9\u30E0\u30FC\u30BA \u30AD\u30E3\u30EC\u30C3\u30C8 \u30A2\u30CB\u30E1\u30FC\u30B7\u30E7\u30F3\u304C\u7121\u52B9\u306B\u306A\u3063\u3066\u3044\u307E\u3059\u3002","\u30B9\u30E0\u30FC\u30BA \u30AD\u30E3\u30EC\u30C3\u30C8 \u30A2\u30CB\u30E1\u30FC\u30B7\u30E7\u30F3\u306F\u3001\u30E6\u30FC\u30B6\u30FC\u304C\u660E\u793A\u7684\u306A\u30B8\u30A7\u30B9\u30C1\u30E3\u3067\u30AB\u30FC\u30BD\u30EB\u3092\u79FB\u52D5\u3057\u305F\u5834\u5408\u306B\u306E\u307F\u6709\u52B9\u306B\u306A\u308A\u307E\u3059\u3002","\u30B9\u30E0\u30FC\u30BA \u30AD\u30E3\u30EC\u30C3\u30C8 \u30A2\u30CB\u30E1\u30FC\u30B7\u30E7\u30F3\u306F\u5E38\u306B\u6709\u52B9\u3067\u3059\u3002","\u6ED1\u3089\u304B\u306A\u30AD\u30E3\u30EC\u30C3\u30C8\u30A2\u30CB\u30E1\u30FC\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u306E\u30B9\u30BF\u30A4\u30EB\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u524D\u5F8C\u306E\u8868\u793A\u53EF\u80FD\u306A\u5148\u982D\u306E\u884C (\u6700\u5C0F 0) \u3068\u672B\u5C3E\u306E\u884C (\u6700\u5C0F 1) \u306E\u6700\u5C0F\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u4ED6\u306E\u4E00\u90E8\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306F 'scrollOff' \u307E\u305F\u306F 'scrollOffset' \u3068\u547C\u3070\u308C\u307E\u3059\u3002","`cursorSurroundingLines` \u306F\u3001\u30AD\u30FC\u30DC\u30FC\u30C9\u307E\u305F\u306F API \u3067\u30C8\u30EA\u30AC\u30FC\u3055\u308C\u305F\u5834\u5408\u306B\u306E\u307F\u5F37\u5236\u3055\u308C\u307E\u3059\u3002","`cursorSurroundingLines` \u306F\u5E38\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002","`#cursorSurroundingLines#` \u3092\u9069\u7528\u3059\u308B\u30BF\u30A4\u30DF\u30F3\u30B0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","`#editor.cursorStyle#` \u304C `line` \u306B\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3001\u30AB\u30FC\u30BD\u30EB\u306E\u5E45\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30C9\u30E9\u30C3\u30B0 \u30A2\u30F3\u30C9 \u30C9\u30ED\u30C3\u30D7\u306B\u3088\u308B\u9078\u629E\u7BC4\u56F2\u306E\u79FB\u52D5\u3092\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u8A31\u53EF\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","SVGS \u3067\u65B0\u3057\u3044\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\u65B9\u6CD5\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u30D5\u30A9\u30F3\u30C8\u6587\u5B57\u306B\u65B0\u3057\u3044\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\u65B9\u6CD5\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u5B89\u5B9A\u3057\u305F\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\u65B9\u6CD5\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u65B0\u3057\u3044\u8A66\u9A13\u7684\u306A\u30E1\u30BD\u30C3\u30C9\u3092\u4F7F\u7528\u3057\u3066\u7A7A\u767D\u3092\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","`Alt` \u3092\u62BC\u3059\u3068\u3001\u30B9\u30AF\u30ED\u30FC\u30EB\u901F\u5EA6\u304C\u500D\u5897\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30B3\u30FC\u30C9\u306E\u6298\u308A\u305F\u305F\u307F\u3092\u6709\u52B9\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5229\u7528\u53EF\u80FD\u306A\u5834\u5408\u306F\u8A00\u8A9E\u56FA\u6709\u306E\u6298\u308A\u305F\u305F\u307F\u65B9\u6CD5\u3092\u4F7F\u7528\u3057\u3001\u5229\u7528\u53EF\u80FD\u3067\u306F\u306A\u3044\u5834\u5408\u306F\u30A4\u30F3\u30C7\u30F3\u30C8\u30D9\u30FC\u30B9\u306E\u65B9\u6CD5\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8\u30D9\u30FC\u30B9\u306E\u6298\u308A\u305F\u305F\u307F\u65B9\u6CD5\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u6298\u308A\u305F\u305F\u307F\u7BC4\u56F2\u306E\u8A08\u7B97\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u6298\u308A\u305F\u305F\u307E\u308C\u305F\u7BC4\u56F2\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u30A4\u30F3\u30DD\u30FC\u30C8\u7BC4\u56F2\u3092\u81EA\u52D5\u7684\u306B\u6298\u308A\u305F\u305F\u3080\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6298\u308A\u305F\u305F\u307F\u53EF\u80FD\u306A\u9818\u57DF\u306E\u6700\u5927\u6570\u3067\u3059\u3002\u3053\u306E\u5024\u3092\u5927\u304D\u304F\u3059\u308B\u3068\u3001\u73FE\u5728\u306E\u30BD\u30FC\u30B9\u306B\u591A\u6570\u306E\u6298\u308A\u305F\u305F\u307F\u53EF\u80FD\u306A\u9818\u57DF\u304C\u3042\u308B\u5834\u5408\u306B\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u5FDC\u7B54\u6027\u304C\u4F4E\u4E0B\u3059\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002","\u6298\u308A\u305F\u305F\u307E\u308C\u305F\u884C\u306E\u5F8C\u306E\u7A7A\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u3068\u884C\u304C\u5C55\u958B\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D5\u30A9\u30F3\u30C8 \u30D5\u30A1\u30DF\u30EA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8CBC\u308A\u4ED8\u3051\u305F\u5185\u5BB9\u304C\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u3088\u308A\u81EA\u52D5\u7684\u306B\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u30D5\u30A9\u30FC\u30DE\u30C3\u30BF\u3092\u4F7F\u7528\u53EF\u80FD\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u307E\u305F\u3001\u30D5\u30A9\u30FC\u30DE\u30C3\u30BF\u304C\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5185\u306E\u7BC4\u56F2\u3092\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3067\u304D\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u5165\u529B\u5F8C\u306B\u81EA\u52D5\u7684\u306B\u884C\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3092\u884C\u3046\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u7E26\u306E\u30B0\u30EA\u30D5\u4F59\u767D\u304C\u8868\u793A\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u307B\u3068\u3093\u3069\u306E\u5834\u5408\u3001\u30B0\u30EA\u30D5\u4F59\u767D\u306F\u30C7\u30D0\u30C3\u30B0\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u3067\u30AB\u30FC\u30BD\u30EB\u3092\u975E\u8868\u793A\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6587\u5B57\u9593\u9694 (\u30D4\u30AF\u30BB\u30EB\u5358\u4F4D) \u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30EA\u30F3\u30AF\u3055\u308C\u305F\u7DE8\u96C6\u304C\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u6709\u52B9\u306B\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u8A00\u8A9E\u306B\u3088\u3063\u3066\u306F\u3001\u7DE8\u96C6\u4E2D\u306B HTML \u30BF\u30B0\u306A\u3069\u306E\u95A2\u9023\u3059\u308B\u8A18\u53F7\u304C\u66F4\u65B0\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u30EA\u30F3\u30AF\u3092\u691C\u51FA\u3057\u3066\u30AF\u30EA\u30C3\u30AF\u53EF\u80FD\u306A\u72B6\u614B\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5BFE\u5FDC\u3059\u308B\u304B\u3063\u3053\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30DE\u30A6\u30B9 \u30DB\u30A4\u30FC\u30EB \u30B9\u30AF\u30ED\u30FC\u30EB \u30A4\u30D9\u30F3\u30C8\u306E `deltaX` \u3068 `deltaY` \u3067\u4F7F\u7528\u3055\u308C\u308B\u4E57\u6570\u3002","`Cmd` \u30AD\u30FC\u3092\u62BC\u3057\u306A\u304C\u3089\u30DE\u30A6\u30B9 \u30DB\u30A4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D5\u30A9\u30F3\u30C8\u3092\u30BA\u30FC\u30E0\u3057\u307E\u3059\u3002","`Ctrl` \u30AD\u30FC\u3092\u62BC\u3057\u306A\u304C\u3089\u30DE\u30A6\u30B9 \u30DB\u30A4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D5\u30A9\u30F3\u30C8\u3092\u30BA\u30FC\u30E0\u3057\u307E\u3059\u3002","\u8907\u6570\u306E\u30AB\u30FC\u30BD\u30EB\u304C\u91CD\u306A\u3063\u3066\u3044\u308B\u3068\u304D\u306F\u3001\u30DE\u30FC\u30B8\u3057\u307E\u3059\u3002","Windows \u304A\u3088\u3073 Linux \u4E0A\u306E `Control` \u30AD\u30FC\u3068 macOS \u4E0A\u306E `Command` \u30AD\u30FC\u306B\u5272\u308A\u5F53\u3066\u307E\u3059\u3002","Windows \u304A\u3088\u3073 Linux \u4E0A\u306E `Alt` \u30AD\u30FC\u3068 macOS \u4E0A\u306E `Option` \u30AD\u30FC\u306B\u5272\u308A\u5F53\u3066\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u3092\u4F7F\u7528\u3057\u3066\u8907\u6570\u306E\u30AB\u30FC\u30BD\u30EB\u3092\u8FFD\u52A0\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3059\u308B\u4FEE\u98FE\u5B50\u3002[\u5B9A\u7FA9\u306B\u79FB\u52D5] \u304A\u3088\u3073 [\u30EA\u30F3\u30AF\u3092\u958B\u304F] \u30DE\u30A6\u30B9 \u30B8\u30A7\u30B9\u30C1\u30E3\u306F\u3001[multicursor \u4FEE\u98FE\u5B50](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier) \u3068\u7AF6\u5408\u3057\u306A\u3044\u3088\u3046\u306B\u8ABF\u6574\u3055\u308C\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u3054\u3068\u306B\u30C6\u30AD\u30B9\u30C8\u3092 1 \u884C\u305A\u3064\u8CBC\u308A\u4ED8\u3051\u307E\u3059\u3002","\u5404\u30AB\u30FC\u30BD\u30EB\u306F\u5168\u6587\u3092\u8CBC\u308A\u4ED8\u3051\u307E\u3059\u3002","\u8CBC\u308A\u4ED8\u3051\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u884C\u6570\u304C\u30AB\u30FC\u30BD\u30EB\u6570\u3068\u4E00\u81F4\u3059\u308B\u5834\u5408\u306E\u8CBC\u308A\u4ED8\u3051\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u4E00\u5EA6\u306B\u914D\u7F6E\u3067\u304D\u308B\u30AB\u30FC\u30BD\u30EB\u306E\u6700\u5927\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u767A\u751F\u56DE\u6570\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u305B\u3093\u3002","\u73FE\u5728\u306E\u30D5\u30A1\u30A4\u30EB\u5185\u306E\u767A\u751F\u56DE\u6570\u306E\u307F\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u8A66\u9A13\u6BB5\u968E: \u3059\u3079\u3066\u306E\u6709\u52B9\u306A\u958B\u3044\u3066\u3044\u308B\u30D5\u30A1\u30A4\u30EB\u306E\u767A\u751F\u56DE\u6570\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u958B\u3044\u3066\u3044\u308B\u30D5\u30A1\u30A4\u30EB\u9593\u3067\u767A\u751F\u56DE\u6570\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u5468\u56F2\u306B\u5883\u754C\u7DDA\u304C\u63CF\u753B\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D4\u30FC\u30AF\u3092\u958B\u304F\u3068\u304D\u306B\u30C4\u30EA\u30FC\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3059\u308B","\u30D4\u30FC\u30AF\u3092\u958B\u304F\u3068\u304D\u306B\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3059\u308B","\u30D4\u30FC\u30AF \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30A4\u30F3\u30E9\u30A4\u30F3 \u30A8\u30C7\u30A3\u30BF\u30FC\u307E\u305F\u306F\u30C4\u30EA\u30FC\u3092\u30D5\u30A9\u30FC\u30AB\u30B9\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","[\u5B9A\u7FA9\u3078\u79FB\u52D5] \u30DE\u30A6\u30B9 \u30B8\u30A7\u30B9\u30C1\u30E3\u30FC\u3067\u3001\u5E38\u306B\u30D4\u30FC\u30AF \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3092\u958B\u304F\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u308B\u307E\u3067\u306E\u30DF\u30EA\u79D2\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306E\u578B\u306E\u81EA\u52D5\u540D\u524D\u5909\u66F4\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u975E\u63A8\u5968\u3067\u3059\u3002\u4EE3\u308F\u308A\u306B\u3001`editor.linkedEditing` \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u5236\u5FA1\u6587\u5B57\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D5\u30A1\u30A4\u30EB\u306E\u672B\u5C3E\u304C\u6539\u884C\u306E\u5834\u5408\u306F\u3001\u6700\u5F8C\u306E\u884C\u756A\u53F7\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u4F59\u767D\u3068\u73FE\u5728\u306E\u884C\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u73FE\u5728\u306E\u884C\u3092\u3069\u306E\u3088\u3046\u306B\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308B\u5834\u5408\u306B\u306E\u307F\u73FE\u5728\u306E\u884C\u3092\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u5F37\u8ABF\u8868\u793A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5358\u8A9E\u9593\u306E\u5358\u4E00\u30B9\u30DA\u30FC\u30B9\u4EE5\u5916\u306E\u7A7A\u767D\u6587\u5B57\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u9078\u629E\u3057\u305F\u30C6\u30AD\u30B9\u30C8\u306B\u306E\u307F\u7A7A\u767D\u6587\u5B57\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u672B\u5C3E\u306E\u7A7A\u767D\u6587\u5B57\u306E\u307F\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u7A7A\u767D\u6587\u5B57\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u9078\u629E\u7BC4\u56F2\u306E\u89D2\u3092\u4E38\u304F\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u6C34\u5E73\u65B9\u5411\u306B\u4F59\u5206\u306B\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u6587\u5B57\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u6700\u5F8C\u306E\u884C\u3092\u8D8A\u3048\u3066\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5782\u76F4\u304A\u3088\u3073\u6C34\u5E73\u65B9\u5411\u306E\u4E21\u65B9\u306B\u540C\u6642\u306B\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u5834\u5408\u306F\u3001\u4E3B\u8981\u306A\u8EF8\u306B\u6CBF\u3063\u3066\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u307E\u3059\u3002\u30C8\u30E9\u30C3\u30AF\u30D1\u30C3\u30C9\u4E0A\u3067\u5782\u76F4\u65B9\u5411\u306B\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u5834\u5408\u306F\u3001\u6C34\u5E73\u30C9\u30EA\u30D5\u30C8\u3092\u9632\u6B62\u3057\u307E\u3059\u3002","Linux \u306E PRIMARY \u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u3092\u30B5\u30DD\u30FC\u30C8\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u9078\u629E\u9805\u76EE\u3068\u985E\u4F3C\u306E\u4E00\u81F4\u9805\u76EE\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5E38\u306B\u6298\u308A\u305F\u305F\u307F\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u6298\u308A\u305F\u305F\u307F\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u3092\u8868\u793A\u305B\u305A\u3001\u4F59\u767D\u306E\u30B5\u30A4\u30BA\u3092\u5C0F\u3055\u304F\u3057\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u304C\u3068\u3058\u3057\u308D\u306E\u4E0A\u306B\u3042\u308B\u3068\u304D\u306B\u306E\u307F\u3001\u6298\u308A\u305F\u305F\u307F\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u3068\u3058\u3057\u308D\u306E\u6298\u308A\u305F\u305F\u307F\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u3092\u8868\u793A\u3059\u308B\u30BF\u30A4\u30DF\u30F3\u30B0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u4F7F\u7528\u3055\u308C\u3066\u3044\u306A\u3044\u30B3\u30FC\u30C9\u306E\u30D5\u30A7\u30FC\u30C9\u30A2\u30A6\u30C8\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u975E\u63A8\u5968\u306E\u5909\u6570\u306E\u53D6\u308A\u6D88\u3057\u7DDA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u4ED6\u306E\u5019\u88DC\u306E\u4E0A\u306B\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u4ED6\u306E\u5019\u88DC\u306E\u4E0B\u306B\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u4ED6\u306E\u5019\u88DC\u3068\u4E00\u7DD2\u306B\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u305B\u3093\u3002","\u4ED6\u306E\u4FEE\u6B63\u5019\u88DC\u3068\u4E00\u7DD2\u306B\u30B9\u30CB\u30DA\u30C3\u30C8\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3001\u304A\u3088\u3073\u305D\u306E\u4E26\u3073\u66FF\u3048\u306E\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A2\u30CB\u30E1\u30FC\u30B7\u30E7\u30F3\u3067\u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3\u5165\u529B\u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u305F\u3068\u304D\u306B\u3001\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC \u30E6\u30FC\u30B6\u30FC\u306B\u30E6\u30FC\u30B6\u30FC\u88DC\u52A9\u30D2\u30F3\u30C8\u3092\u63D0\u4F9B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u3002{0} \u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001\u5024 {1} \u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u884C\u306E\u9AD8\u3055\u3002{0} \u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001{1} \u306E\u5024\u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002\u6700\u5C0F\u5024\u306F 8 \u3067\u3059\u3002","\u30C8\u30EA\u30AC\u30FC\u6587\u5B57\u306E\u5165\u529B\u6642\u306B\u5019\u88DC\u304C\u81EA\u52D5\u7684\u306B\u8868\u793A\u3055\u308C\u308B\u3088\u3046\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5E38\u306B\u6700\u521D\u306E\u5019\u88DC\u3092\u9078\u629E\u3057\u307E\u3059\u3002","`console.| -> console.log` \u306A\u3069\u3068\u9078\u629E\u5BFE\u8C61\u306B\u95A2\u3057\u3066\u5165\u529B\u3057\u306A\u3044\u9650\u308A\u306F\u3001\u6700\u8FD1\u306E\u5019\u88DC\u3092\u9078\u629E\u3057\u307E\u3059\u3002`log` \u306F\u6700\u8FD1\u5B8C\u4E86\u3057\u305F\u305F\u3081\u3067\u3059\u3002","\u3053\u308C\u3089\u306E\u5019\u88DC\u3092\u5B8C\u4E86\u3057\u305F\u4EE5\u524D\u306E\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306B\u57FA\u3065\u3044\u3066\u5019\u88DC\u3092\u9078\u629E\u3057\u307E\u3059\u3002\u4F8B: `co -> console` \u304A\u3088\u3073 `con -> const`\u3002","\u5019\u88DC\u30EA\u30B9\u30C8\u3092\u8868\u793A\u3059\u308B\u3068\u304D\u306B\u5019\u88DC\u3092\u4E8B\u524D\u306B\u9078\u629E\u3059\u308B\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30BF\u30D6\u88DC\u5B8C\u306F\u3001tab \u30AD\u30FC\u3092\u62BC\u3057\u305F\u3068\u304D\u306B\u6700\u9069\u306A\u5019\u88DC\u3092\u633F\u5165\u3057\u307E\u3059\u3002","\u30BF\u30D6\u88DC\u5B8C\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\u3002","\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u304C\u4E00\u81F4\u3059\u308B\u5834\u5408\u306B\u3001\u30BF\u30D6\u3067\u30B9\u30CB\u30DA\u30C3\u30C8\u3092\u88DC\u5B8C\u3057\u307E\u3059\u3002'quickSuggestions' \u304C\u7121\u52B9\u306A\u5834\u5408\u306B\u6700\u9069\u3067\u3059\u3002","\u30BF\u30D6\u88DC\u5B8C\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u901A\u5E38\u3068\u306F\u7570\u306A\u308B\u884C\u306E\u7D42\u7AEF\u6587\u5B57\u306F\u81EA\u52D5\u7684\u306B\u524A\u9664\u3055\u308C\u308B\u3002","\u901A\u5E38\u3068\u306F\u7570\u306A\u308B\u884C\u306E\u7D42\u7AEF\u6587\u5B57\u306F\u7121\u8996\u3055\u308C\u308B\u3002","\u901A\u5E38\u3068\u306F\u7570\u306A\u308B\u884C\u306E\u7D42\u7AEF\u6587\u5B57\u306E\u524A\u9664\u30D7\u30ED\u30F3\u30D7\u30C8\u304C\u8868\u793A\u3055\u308C\u308B\u3002","\u554F\u984C\u3092\u8D77\u3053\u3059\u53EF\u80FD\u6027\u304C\u3042\u308B\u3001\u666E\u901A\u3067\u306F\u306A\u3044\u884C\u7D42\u7AEF\u8A18\u53F7\u306F\u524A\u9664\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u7A7A\u767D\u306E\u633F\u5165\u3084\u524A\u9664\u306F\u30BF\u30D6\u4F4D\u7F6E\u306B\u5F93\u3063\u3066\u884C\u308F\u308C\u307E\u3059\u3002","\u65E2\u5B9A\u306E\u6539\u884C\u30EB\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u4E2D\u56FD\u8A9E/\u65E5\u672C\u8A9E/\u97D3\u56FD\u8A9E (CJK) \u306E\u30C6\u30AD\u30B9\u30C8\u306B\u306F\u5358\u8A9E\u533A\u5207\u308A\u3092\u4F7F\u7528\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002CJK \u4EE5\u5916\u306E\u30C6\u30AD\u30B9\u30C8\u306E\u52D5\u4F5C\u306F\u3001\u901A\u5E38\u306E\u5834\u5408\u3068\u540C\u3058\u3067\u3059\u3002","\u4E2D\u56FD\u8A9E/\u65E5\u672C\u8A9E/\u97D3\u56FD\u8A9E (CJK) \u30C6\u30AD\u30B9\u30C8\u306B\u4F7F\u7528\u3055\u308C\u308B\u5358\u8A9E\u533A\u5207\u308A\u898F\u5247\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5358\u8A9E\u306B\u95A2\u9023\u3057\u305F\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u307E\u305F\u306F\u64CD\u4F5C\u3092\u5B9F\u884C\u3059\u308B\u3068\u304D\u306B\u3001\u5358\u8A9E\u306E\u533A\u5207\u308A\u6587\u5B57\u3068\u3057\u3066\u4F7F\u7528\u3055\u308C\u308B\u6587\u5B57\u3002","\u884C\u3092\u6298\u308A\u8FD4\u3057\u307E\u305B\u3093\u3002","\u884C\u3092\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u306E\u5E45\u3067\u6298\u308A\u8FD4\u3057\u307E\u3059\u3002","`#editor.wordWrapColumn#` \u3067\u884C\u3092\u6298\u308A\u8FD4\u3057\u307E\u3059\u3002","\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u3068 `#editor.wordWrapColumn#` \u306E\u6700\u5C0F\u5024\u3067\u884C\u3092\u6298\u308A\u8FD4\u3057\u307E\u3059\u3002","\u884C\u306E\u6298\u308A\u8FD4\u3057\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","`#editor.wordWrap#` \u304C `wordWrapColumn` \u307E\u305F\u306F `bounded` \u306E\u5834\u5408\u306B\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u6298\u308A\u8FD4\u3057\u6841\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u65E2\u5B9A\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 \u30AB\u30E9\u30FC \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3092\u4F7F\u7528\u3057\u3066\u30A4\u30F3\u30E9\u30A4\u30F3\u306E\u8272\u306E\u88C5\u98FE\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u30BF\u30D6\u3092\u53D7\u3051\u53D6\u308B\u304B\u3001\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1\u306B\u59D4\u306D\u3066\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002"],"vs/editor/common/core/editorColorRegistry":["\u30AB\u30FC\u30BD\u30EB\u4F4D\u7F6E\u306E\u884C\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u80CC\u666F\u8272\u3002","\u30AB\u30FC\u30BD\u30EB\u4F4D\u7F6E\u306E\u884C\u306E\u5883\u754C\u7DDA\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u80CC\u666F\u8272\u3002","(Quick Open \u3084\u691C\u51FA\u6A5F\u80FD\u306A\u3069\u306B\u3088\u308A) \u5F37\u8ABF\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u7BC4\u56F2\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u5F37\u8ABF\u8868\u793A\u3055\u308C\u305F\u7BC4\u56F2\u306E\u5883\u754C\u7DDA\u306E\u80CC\u666F\u8272\u3002","\u5F37\u8ABF\u8868\u793A\u3055\u308C\u305F\u8A18\u53F7\u306E\u80CC\u666F\u8272 (\u5B9A\u7FA9\u3078\u79FB\u52D5\u3001\u6B21\u307E\u305F\u306F\u524D\u306E\u8A18\u53F7\u3078\u79FB\u52D5\u306A\u3069)\u3002\u57FA\u306B\u306A\u308B\u88C5\u98FE\u304C\u8986\u308F\u308C\u306A\u3044\u3088\u3046\u306B\u3059\u308B\u305F\u3081\u3001\u8272\u3092\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u5F37\u8ABF\u8868\u793A\u3055\u308C\u305F\u8A18\u53F7\u306E\u5468\u308A\u306E\u5883\u754C\u7DDA\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30AB\u30FC\u30BD\u30EB\u306E\u8272\u3002","\u9078\u629E\u3055\u308C\u305F\u6587\u5B57\u5217\u306E\u80CC\u666F\u8272\u3067\u3059\u3002\u9078\u629E\u3055\u308C\u305F\u6587\u5B57\u5217\u306E\u80CC\u666F\u8272\u3092\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA\u51FA\u6765\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B9\u30DA\u30FC\u30B9\u6587\u5B57\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u884C\u756A\u53F7\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272\u3002","'editorIndentGuide.background' \u306F\u975E\u63A8\u5968\u3067\u3059\u3002\u4EE3\u308F\u308A\u306B 'editorIndentGuide.background1' \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272\u3002","'editorIndentGuide.activeBackground' \u306F\u975E\u63A8\u5968\u3067\u3059\u3002\u4EE3\u308F\u308A\u306B 'editorIndentGuide.activeBackground1' \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272 (1)\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272 (2)\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272 (3)\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272 (4)\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272 (5)\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272 (6)\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272 (1)\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272 (2)\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272 (3)\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272 (4)\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272 (5)\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272 (6)\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A2\u30AF\u30C6\u30A3\u30D6\u884C\u756A\u53F7\u306E\u8272","id \u306F\u4F7F\u7528\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002\u4EE3\u308F\u308A\u306B 'EditorLineNumber.activeForeground' \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A2\u30AF\u30C6\u30A3\u30D6\u884C\u756A\u53F7\u306E\u8272","editor.renderFinalNewline \u304C dimmed \u306B\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u6700\u7D42\u884C\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30EB\u30FC\u30E9\u30FC\u306E\u8272\u3002","CodeLens \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u524D\u666F\u8272\u3002","\u4E00\u81F4\u3059\u308B\u304B\u3063\u3053\u306E\u80CC\u666F\u8272","\u4E00\u81F4\u3059\u308B\u304B\u3063\u3053\u5185\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u8272","\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u5883\u754C\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4F59\u767D\u306E\u80CC\u666F\u8272\u3002\u4F59\u767D\u306B\u306F\u30B0\u30EA\u30D5 \u30DE\u30FC\u30B8\u30F3\u3068\u884C\u756A\u53F7\u304C\u542B\u307E\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306E\u4E0D\u8981\u306A (\u672A\u4F7F\u7528\u306E) \u30BD\u30FC\u30B9 \u30B3\u30FC\u30C9\u306E\u7F6B\u7DDA\u306E\u8272\u3002",`\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u4E0D\u8981\u306A (\u672A\u4F7F\u7528\u306E) \u30BD\u30FC\u30B9 \u30B3\u30FC\u30C9\u306E\u4E0D\u900F\u660E\u5EA6\u3002\u305F\u3068\u3048\u3070\u3001"#000000c0" \u306F\u4E0D\u900F\u660E\u5EA6 75% \u3067\u30B3\u30FC\u30C9\u3092\u8868\u793A\u3057\u307E\u3059\u3002\u30CF\u30A4 \u30B3\u30F3\u30C8\u30E9\u30B9\u30C8\u306E\u30C6\u30FC\u30DE\u306E\u5834\u5408\u3001'editorUnnecessaryCode.border' \u30C6\u30FC\u30DE\u8272\u3092\u4F7F\u7528\u3057\u3066\u3001\u4E0D\u8981\u306A\u30B3\u30FC\u30C9\u3092\u30D5\u30A7\u30FC\u30C9\u30A2\u30A6\u30C8\u3059\u308B\u306E\u3067\u306F\u306A\u304F\u4E0B\u7DDA\u3092\u4ED8\u3051\u307E\u3059\u3002`,"\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u900F\u304B\u3057\u6587\u5B57\u306E\u5883\u754C\u7DDA\u306E\u8272\u3067\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u900F\u304B\u3057\u6587\u5B57\u306E\u524D\u666F\u8272\u3067\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B4\u30FC\u30B9\u30C8 \u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002","\u7BC4\u56F2\u5F37\u8ABF\u8868\u793A\u306E\u305F\u3081\u306E\u6982\u8981\u30EB\u30FC\u30E9\u30FC \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30E9\u30FC\u3092\u793A\u3059\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002","\u8B66\u544A\u3092\u793A\u3059\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002","\u60C5\u5831\u3092\u793A\u3059\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002","\u89D2\u304B\u3063\u3053 (1) \u306E\u524D\u666F\u8272\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2\u306E\u8272\u4ED8\u3051\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u89D2\u304B\u3063\u3053 (2) \u306E\u524D\u666F\u8272\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2\u306E\u8272\u4ED8\u3051\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u89D2\u304B\u3063\u3053 (3) \u306E\u524D\u666F\u8272\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2\u306E\u8272\u4ED8\u3051\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u89D2\u304B\u3063\u3053 (4) \u306E\u524D\u666F\u8272\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2\u306E\u8272\u4ED8\u3051\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u89D2\u304B\u3063\u3053 (5) \u306E\u524D\u666F\u8272\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2\u306E\u8272\u4ED8\u3051\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u89D2\u304B\u3063\u3053 (6) \u306E\u524D\u666F\u8272\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2\u306E\u8272\u4ED8\u3051\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u4E88\u671F\u3057\u306A\u3044\u30D6\u30E9\u30B1\u30C3\u30C8\u306E\u524D\u666F\u8272\u3002","\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u306E\u80CC\u666F\u8272 (1)\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u306E\u80CC\u666F\u8272 (2)\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u306E\u80CC\u666F\u8272 (3)\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u306E\u80CC\u666F\u8272 (4)\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u306E\u80CC\u666F\u8272 (5)\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u306E\u80CC\u666F\u8272 (6)\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u306E\u80CC\u666F\u8272 (1)\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u306E\u80CC\u666F\u8272 (2)\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u306E\u80CC\u666F\u8272 (3)\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u306E\u80CC\u666F\u8272 (4)\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u306E\u80CC\u666F\u8272 (5)\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u306E\u80CC\u666F\u8272 (6)\u3002\u89D2\u304B\u3063\u3053\u306E\u30DA\u30A2 \u30AC\u30A4\u30C9\u3092\u6709\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002","Unicode \u6587\u5B57\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u308B\u5883\u754C\u7DDA\u306E\u8272\u3002","Unicode \u6587\u5B57\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u308B\u80CC\u666F\u8272\u3002"],"vs/editor/common/editorContextKeys":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30C6\u30AD\u30B9\u30C8\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308B (\u30AB\u30FC\u30BD\u30EB\u304C\u70B9\u6EC5\u3057\u3066\u3044\u308B) \u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u307E\u305F\u306F\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308B (\u4F8B: \u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308B) \u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u307E\u305F\u306F\u30EA\u30C3\u30C1 \u30C6\u30AD\u30B9\u30C8\u5165\u529B\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308B (\u30AB\u30FC\u30BD\u30EB\u304C\u70B9\u6EC5\u3057\u3066\u3044\u308B) \u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u304B\u3069\u3046\u304B","\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u304C\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u3042\u308B\u304B\u3069\u3046\u304B","\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u304C\u57CB\u3081\u8FBC\u307F\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u3042\u308B\u304B\u3069\u3046\u304B","\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u304C\u30DE\u30EB\u30C1\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u3042\u308B\u304B\u3069\u3046\u304B","\u30DE\u30EB\u30C1\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u6298\u308A\u305F\u305F\u3080\u304B\u3069\u3046\u304B","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u5909\u66F4\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u79FB\u52D5\u3055\u308C\u305F\u30B3\u30FC\u30C9 \u30D6\u30ED\u30C3\u30AF\u304C\u6BD4\u8F03\u5BFE\u8C61\u3068\u3057\u3066\u9078\u629E\u3055\u308C\u3066\u3044\u308B\u304B\u3069\u3046\u304B","\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306E\u9AD8\u3044\u5DEE\u5206\u30D3\u30E5\u30FC\u30A2\u30FC\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u304B\u3069\u3046\u304B","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D6\u30EC\u30FC\u30AF\u30DD\u30A4\u30F3\u30C8\u3092\u4E26\u3079\u3066\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\u3059\u308B\u304B\u3069\u3046\u304B","`editor.columnSelection` \u304C\u6709\u52B9\u306B\u306A\u3063\u3066\u3044\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30C6\u30AD\u30B9\u30C8\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u8907\u6570\u306E\u9078\u629E\u7BC4\u56F2\u304C\u3042\u308B\u304B\u3069\u3046\u304B","`Tab` \u306B\u3088\u3063\u3066\u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u5916\u306B\u79FB\u52D5\u3059\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DB\u30D0\u30FC\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DB\u30D0\u30FC\u304C\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u3066\u3044\u308B\u304B\u3069\u3046\u304B","\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u304C\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u3066\u3044\u308B\u304B\u3069\u3046\u304B","\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u304B\u3069\u3046\u304B","\u30B9\u30BF\u30F3\u30C9\u30A2\u30ED\u30F3 \u30AB\u30E9\u30FC \u30D4\u30C3\u30AB\u30FC\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B","\u30B9\u30BF\u30F3\u30C9\u30A2\u30ED\u30F3 \u30AB\u30E9\u30FC \u30D4\u30C3\u30AB\u30FC\u304C\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u3066\u3044\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u3088\u308A\u5927\u304D\u306A\u30A8\u30C7\u30A3\u30BF\u30FC (\u4F8B: Notebooks) \u306E\u4E00\u90E8\u3067\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u8A00\u8A9E\u8B58\u5225\u5B50","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u5165\u529B\u5019\u88DC\u9805\u76EE\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3 \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30B3\u30FC\u30C9 \u30EC\u30F3\u30BA \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u5B9A\u7FA9\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u5BA3\u8A00\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u5B9F\u88C5\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u578B\u5B9A\u7FA9\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30DB\u30D0\u30FC \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5F37\u8ABF\u8868\u793A\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 \u30B7\u30F3\u30DC\u30EB \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u53C2\u7167\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u540D\u524D\u5909\u66F4\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30B7\u30B0\u30CD\u30C1\u30E3 \u30D8\u30EB\u30D7 \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8 \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u66F8\u5F0F\u8A2D\u5B9A\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u9078\u629E\u66F8\u5F0F\u8A2D\u5B9A\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u8907\u6570\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u66F8\u5F0F\u8A2D\u5B9A\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u8907\u6570\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u9078\u629E\u66F8\u5F0F\u8A2D\u5B9A\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u304C\u3042\u308B\u304B\u3069\u3046\u304B"],"vs/editor/common/languages":["\u914D\u5217","\u30D6\u30FC\u30EB\u5024","\u30AF\u30E9\u30B9","\u5B9A\u6570","\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u30FC","\u5217\u6319\u578B","\u5217\u6319\u578B\u30E1\u30F3\u30D0\u30FC","\u30A4\u30D9\u30F3\u30C8","\u30D5\u30A3\u30FC\u30EB\u30C9","\u30D5\u30A1\u30A4\u30EB","\u95A2\u6570","\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9","\u30AD\u30FC","\u30E1\u30BD\u30C3\u30C9","\u30E2\u30B8\u30E5\u30FC\u30EB","\u540D\u524D\u7A7A\u9593","NULL","\u6570\u5024","\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8","\u6F14\u7B97\u5B50","\u30D1\u30C3\u30B1\u30FC\u30B8","\u30D7\u30ED\u30D1\u30C6\u30A3","\u6587\u5B57\u5217","\u69CB\u9020\u4F53","\u578B\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC","\u5909\u6570","{0} ({1})"],"vs/editor/common/languages/modesRegistry":["\u30D7\u30EC\u30FC\u30F3\u30C6\u30AD\u30B9\u30C8"],"vs/editor/common/model/editStack":["\u5165\u529B\u3057\u3066\u3044\u307E\u3059"],"vs/editor/common/standaloneStrings":["\u958B\u767A\u8005: \u30C8\u30FC\u30AF\u30F3\u306E\u691C\u67FB","\u884C/\u5217\u306B\u79FB\u52D5\u3059\u308B...","\u3059\u3079\u3066\u306E\u30AF\u30A4\u30C3\u30AF \u30A2\u30AF\u30BB\u30B9 \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3092\u8868\u793A","\u30B3\u30DE\u30F3\u30C9 \u30D1\u30EC\u30C3\u30C8","\u30B3\u30DE\u30F3\u30C9\u306E\u8868\u793A\u3068\u5B9F\u884C","\u30B7\u30F3\u30DC\u30EB\u306B\u79FB\u52D5...","\u30AB\u30C6\u30B4\u30EA\u5225\u306E\u30B7\u30F3\u30DC\u30EB\u3078\u79FB\u52D5...","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30F3\u30C4","\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3 \u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u8868\u793A\u3059\u308B\u306B\u306F\u3001Alt+F1 \u30AD\u30FC\u3092\u62BC\u3057\u307E\u3059\u3002","\u30CF\u30A4 \u30B3\u30F3\u30C8\u30E9\u30B9\u30C8 \u30C6\u30FC\u30DE\u306E\u5207\u308A\u66FF\u3048","{1} \u500B\u306E\u30D5\u30A1\u30A4\u30EB\u306B {0} \u500B\u306E\u7DE8\u96C6\u304C\u884C\u308F\u308C\u307E\u3057\u305F"],"vs/editor/common/viewLayout/viewLineRenderer":["\u8868\u793A\u6570\u3092\u5897\u3084\u3059 ({0})","{0} \u6587\u5B57"],"vs/editor/contrib/anchorSelect/browser/anchorSelect":["\u9078\u629E\u30A2\u30F3\u30AB\u30FC","\u30A2\u30F3\u30AB\u30FC\u304C {0}:{1} \u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3057\u305F","\u9078\u629E\u30A2\u30F3\u30AB\u30FC\u306E\u8A2D\u5B9A","\u9078\u629E\u30A2\u30F3\u30AB\u30FC\u3078\u79FB\u52D5","\u30A2\u30F3\u30AB\u30FC\u304B\u3089\u30AB\u30FC\u30BD\u30EB\u3078\u9078\u629E","\u9078\u629E\u30A2\u30F3\u30AB\u30FC\u306E\u53D6\u308A\u6D88\u3057"],"vs/editor/contrib/bracketMatching/browser/bracketMatching":["\u4E00\u81F4\u3059\u308B\u30D6\u30E9\u30B1\u30C3\u30C8\u3092\u793A\u3059\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002","\u30D6\u30E9\u30B1\u30C3\u30C8\u3078\u79FB\u52D5","\u30D6\u30E9\u30B1\u30C3\u30C8\u306B\u9078\u629E","\u304B\u3063\u3053\u3092\u5916\u3059","\u30D6\u30E9\u30B1\u30C3\u30C8\u306B\u79FB\u52D5(&&B)","\u4E2D\u304B\u3063\u3053\u307E\u305F\u306F\u6CE2\u304B\u3063\u3053\u3092\u542B\u3080\u30C6\u30AD\u30B9\u30C8\u3092\u9078\u629E\u3057\u307E\u3059"],"vs/editor/contrib/caretOperations/browser/caretOperations":["\u9078\u629E\u3057\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u5DE6\u306B\u79FB\u52D5","\u9078\u629E\u3057\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u53F3\u306B\u79FB\u52D5"],"vs/editor/contrib/caretOperations/browser/transpose":["\u6587\u5B57\u306E\u5165\u308C\u66FF\u3048"],"vs/editor/contrib/clipboard/browser/clipboard":["\u5207\u308A\u53D6\u308A(&&T)","\u5207\u308A\u53D6\u308A","\u5207\u308A\u53D6\u308A","\u5207\u308A\u53D6\u308A","\u30B3\u30D4\u30FC(&&C)","\u30B3\u30D4\u30FC","\u30B3\u30D4\u30FC","\u30B3\u30D4\u30FC","\u5F62\u5F0F\u3092\u6307\u5B9A\u3057\u3066\u30B3\u30D4\u30FC","\u5F62\u5F0F\u3092\u6307\u5B9A\u3057\u3066\u30B3\u30D4\u30FC","\u5171\u6709","\u5171\u6709","\u5171\u6709","\u8CBC\u308A\u4ED8\u3051(&&P)","\u8CBC\u308A\u4ED8\u3051","\u8CBC\u308A\u4ED8\u3051","\u8CBC\u308A\u4ED8\u3051","\u69CB\u6587\u3092\u5F37\u8ABF\u8868\u793A\u3057\u3066\u30B3\u30D4\u30FC"],"vs/editor/contrib/codeAction/browser/codeAction":["\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u9069\u7528\u4E2D\u306B\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"],"vs/editor/contrib/codeAction/browser/codeActionCommands":["\u5B9F\u884C\u3059\u308B\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u7A2E\u985E\u3002","\u8FD4\u3055\u308C\u305F\u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u9069\u7528\u3055\u308C\u308B\u30BF\u30A4\u30DF\u30F3\u30B0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6700\u521D\u306B\u8FD4\u3055\u308C\u305F\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u5E38\u306B\u9069\u7528\u3057\u307E\u3059\u3002","\u6700\u521D\u306B\u8FD4\u3055\u308C\u305F\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u4EE5\u5916\u306B\u8FD4\u3055\u308C\u305F\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u306A\u3044\u5834\u5408\u306F\u3001\u305D\u306E\u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u9069\u7528\u3057\u307E\u3059\u3002","\u8FD4\u3055\u308C\u305F\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u9069\u7528\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002","\u512A\u5148\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u307F\u3092\u8FD4\u3059\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AF\u30A4\u30C3\u30AF \u30D5\u30A3\u30C3\u30AF\u30B9...","\u5229\u7528\u53EF\u80FD\u306A\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","\u5229\u7528\u53EF\u80FD\u306A\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093","\u30EA\u30D5\u30A1\u30AF\u30BF\u30FC...","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30EA\u30D5\u30A1\u30AF\u30BF\u30EA\u30F3\u30B0\u304C\u3042\u308A\u307E\u305B\u3093","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u30EA\u30D5\u30A1\u30AF\u30BF\u30EA\u30F3\u30B0\u304C\u3042\u308A\u307E\u305B\u3093","\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30EA\u30D5\u30A1\u30AF\u30BF\u30EA\u30F3\u30B0\u304C\u3042\u308A\u307E\u305B\u3093","\u5229\u7528\u53EF\u80FD\u306A\u30EA\u30D5\u30A1\u30AF\u30BF\u30EA\u30F3\u30B0\u306F\u3042\u308A\u307E\u305B\u3093","\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3...","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","\u5229\u7528\u53EF\u80FD\u306A\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093","\u30A4\u30F3\u30DD\u30FC\u30C8\u3092\u6574\u7406","\u5229\u7528\u53EF\u80FD\u306A\u30A4\u30F3\u30DD\u30FC\u30C8\u306E\u6574\u7406\u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093","\u3059\u3079\u3066\u4FEE\u6B63","\u3059\u3079\u3066\u3092\u4FEE\u6B63\u3059\u308B\u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093","\u81EA\u52D5\u4FEE\u6B63...","\u5229\u7528\u53EF\u80FD\u306A\u81EA\u52D5\u4FEE\u6B63\u306F\u3042\u308A\u307E\u305B\u3093"],"vs/editor/contrib/codeAction/browser/codeActionContributions":["\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3 \u30E1\u30CB\u30E5\u30FC\u3067\u306E\u30B0\u30EB\u30FC\u30D7 \u30D8\u30C3\u30C0\u30FC\u306E\u8868\u793A\u306E\u6709\u52B9/\u7121\u52B9\u3092\u5207\u308A\u66FF\u3048\u307E\u3059\u3002","\u73FE\u5728\u8A3A\u65AD\u3092\u884C\u3063\u3066\u3044\u306A\u3044\u3068\u304D\u306B\u3001\u884C\u5185\u306E\u6700\u3082\u8FD1\u3044 \u30AF\u30A4\u30C3\u30AF\u4FEE\u6B63 \u3092\u8868\u793A\u3059\u308B\u6A5F\u80FD\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3057\u307E\u3059\u3002"],"vs/editor/contrib/codeAction/browser/codeActionController":["\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8: {1} \u884C {2} \u5217 \u306E {0}\u3002","\u7121\u52B9\u306A\u3082\u306E\u3092\u975E\u8868\u793A","\u7121\u52B9\u3092\u8868\u793A"],"vs/editor/contrib/codeAction/browser/codeActionMenu":["\u305D\u306E\u4ED6\u306E\u64CD\u4F5C...","\u30AF\u30A4\u30C3\u30AF\u4FEE\u6B63","\u62BD\u51FA","\u30A4\u30F3\u30E9\u30A4\u30F3","\u518D\u66F8\u304D\u8FBC\u307F\u3059\u308B","\u79FB\u52D5","\u30D6\u30ED\u30C3\u30AF\u306E\u633F\u5165","\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3..."],"vs/editor/contrib/codeAction/browser/lightBulbWidget":["\u5B9F\u884C: {0}","\u30B3\u30FC\u30C9\u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u8868\u793A\u3057\u307E\u3059\u3002\u4F7F\u7528\u53EF\u80FD\u306A\u512A\u5148\u306E\u30AF\u30A4\u30C3\u30AF\u4FEE\u6B63 ({0})","\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u8868\u793A ({0})","\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u8868\u793A"],"vs/editor/contrib/codelens/browser/codelensController":["\u73FE\u5728\u306E\u884C\u306E\u30B3\u30FC\u30C9 \u30EC\u30F3\u30BA \u30B3\u30DE\u30F3\u30C9\u3092\u8868\u793A","\u30B3\u30DE\u30F3\u30C9\u306E\u9078\u629E"],"vs/editor/contrib/colorPicker/browser/colorPickerWidget":["\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u8272\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u5207\u308A\u66FF\u3048\u307E\u3059 (rgb/hsl/hex)","\u30AB\u30E9\u30FC \u30D4\u30C3\u30AB\u30FC\u3092\u9589\u3058\u308B\u30A2\u30A4\u30B3\u30F3"],"vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions":["\u30B9\u30BF\u30F3\u30C9\u30A2\u30ED\u30F3 \u30AB\u30E9\u30FC \u30D4\u30C3\u30AB\u30FC\u306E\u8868\u793A\u307E\u305F\u306F\u30D5\u30A9\u30FC\u30AB\u30B9","\u30B9\u30BF\u30F3\u30C9\u30A2\u30ED\u30F3 \u30AB\u30E9\u30FC \u30D4\u30C3\u30AB\u30FC\u306E\u8868\u793A\u307E\u305F\u306F\u30D5\u30A9\u30FC\u30AB\u30B9(&S)","\u30AB\u30E9\u30FC \u30D4\u30C3\u30AB\u30FC\u3092\u975E\u8868\u793A\u306B\u3059\u308B","\u30B9\u30BF\u30F3\u30C9\u30A2\u30ED\u30F3 \u30AB\u30E9\u30FC \u30D4\u30C3\u30AB\u30FC\u3067\u8272\u3092\u633F\u5165"],"vs/editor/contrib/comment/browser/comment":["\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u5207\u308A\u66FF\u3048","\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u5207\u308A\u66FF\u3048(&&T)","\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u8FFD\u52A0","\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u524A\u9664","\u30D6\u30ED\u30C3\u30AF \u30B3\u30E1\u30F3\u30C8\u306E\u5207\u308A\u66FF\u3048","\u30D6\u30ED\u30C3\u30AF \u30B3\u30E1\u30F3\u30C8\u306E\u5207\u308A\u66FF\u3048(&&B)"],"vs/editor/contrib/contextmenu/browser/contextmenu":["\u30DF\u30CB\u30DE\u30C3\u30D7","\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\u6587\u5B57","\u5782\u76F4\u65B9\u5411\u306E\u30B5\u30A4\u30BA","\u5747\u7B49","\u5857\u308A\u3064\u3076\u3057","\u30B5\u30A4\u30BA\u306B\u5408\u308F\u305B\u3066\u8ABF\u6574","\u30B9\u30E9\u30A4\u30C0\u30FC","\u30DE\u30A6\u30B9 \u30AA\u30FC\u30D0\u30FC","\u5E38\u306B","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8 \u30E1\u30CB\u30E5\u30FC\u306E\u8868\u793A"],"vs/editor/contrib/cursorUndo/browser/cursorUndo":["\u30AB\u30FC\u30BD\u30EB\u3092\u5143\u306B\u623B\u3059","\u30AB\u30FC\u30BD\u30EB\u306E\u3084\u308A\u76F4\u3057"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution":["\u8CBC\u308A\u4ED8\u3051\u306E\u30AA\u30D7\u30B7\u30E7\u30F3...","\u9069\u7528\u3057\u3088\u3046\u3068\u3059\u308B\u8CBC\u308A\u4ED8\u3051\u7DE8\u96C6\u306E ID\u3002\u6307\u5B9A\u3057\u306A\u3044\u5834\u5408\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30D4\u30C3\u30AB\u30FC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30C6\u30AD\u30B9\u30C8\u3068\u3057\u3066\u8CBC\u308A\u4ED8\u3051"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteController":["\u8CBC\u308A\u4ED8\u3051\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u304B\u3069\u3046\u304B","\u8CBC\u308A\u4ED8\u3051\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u8868\u793A...","'{0}' \u306E\u8CBC\u308A\u4ED8\u3051\u306E\u7DE8\u96C6\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F","\u8CBC\u308A\u4ED8\u3051\u30CF\u30F3\u30C9\u30E9\u30FC\u3092\u5B9F\u884C\u3057\u3066\u3044\u307E\u3059\u3002\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3059","\u8CBC\u308A\u4ED8\u3051\u64CD\u4F5C\u306E\u9078\u629E","\u8CBC\u308A\u4ED8\u3051\u30CF\u30F3\u30C9\u30E9\u30FC\u3092\u5B9F\u884C\u3057\u3066\u3044\u307E\u3059..."],"vs/editor/contrib/dropOrPasteInto/browser/defaultProviders":["\u30D3\u30EB\u30C8\u30A4\u30F3","\u30D7\u30EC\u30FC\u30F3\u30C6\u30AD\u30B9\u30C8\u306E\u633F\u5165","URI \u306E\u633F\u5165","URI \u306E\u633F\u5165","\u30D1\u30B9\u306E\u633F\u5165","\u30D1\u30B9\u306E\u633F\u5165","\u76F8\u5BFE\u30D1\u30B9\u306E\u633F\u5165","\u76F8\u5BFE\u30D1\u30B9\u306E\u633F\u5165","HTML \u306E\u633F\u5165"],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution":["\u7279\u5B9A\u306E MIME \u30BF\u30A4\u30D7\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u306B\u4F7F\u7528\u3059\u308B\u65E2\u5B9A\u306E\u30C9\u30ED\u30C3\u30D7 \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3092\u69CB\u6210\u3057\u307E\u3059\u3002"],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController":["\u30C9\u30ED\u30C3\u30D7 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u304B\u3069\u3046\u304B","\u30C9\u30ED\u30C3\u30D7 \u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u8868\u793A...","\u30C9\u30ED\u30C3\u30D7 \u30CF\u30F3\u30C9\u30E9\u30FC\u3092\u5B9F\u884C\u3057\u3066\u3044\u307E\u3059\u3002\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3059"],"vs/editor/contrib/editorState/browser/keybindingCancellation":["\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u53D6\u308A\u6D88\u3057\u53EF\u80FD\u306A\u64CD\u4F5C ('\u53C2\u7167\u3092\u3053\u3053\u306B\u8868\u793A' \u306A\u3069) \u3092\u5B9F\u884C\u3059\u308B\u304B\u3069\u3046\u304B"],"vs/editor/contrib/find/browser/findController":["\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u308B\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u7F6E\u63DB\u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3002","\u691C\u7D22","\u691C\u7D22(&&F)","\u5F15\u6570\u3092\u4F7F\u7528\u3057\u305F\u691C\u7D22","\u9078\u629E\u7BC4\u56F2\u3067\u691C\u7D22","\u6B21\u3092\u691C\u7D22","\u524D\u3092\u691C\u7D22","[\u4E00\u81F4] \u306B\u79FB\u52D5...","\u4E00\u81F4\u3057\u307E\u305B\u3093\u3002\u4ED6\u306E\u9805\u76EE\u3092\u691C\u7D22\u3057\u3066\u307F\u3066\u304F\u3060\u3055\u3044\u3002","\u7279\u5B9A\u306E\u4E00\u81F4\u306B\u79FB\u52D5\u3059\u308B\u6570\u5024\u3092\u5165\u529B\u3057\u307E\u3059 (1 \u304B\u3089 {0})","1 ~ {0} \u306E\u6570\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002","1 ~ {0} \u306E\u6570\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u6B21\u306E\u9078\u629E\u9805\u76EE\u3092\u691C\u7D22","\u524D\u306E\u9078\u629E\u9805\u76EE\u3092\u691C\u7D22","\u7F6E\u63DB","\u7F6E\u63DB(&&R)"],"vs/editor/contrib/find/browser/findWidget":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u6298\u308A\u305F\u305F\u307E\u308C\u3066\u3044\u308B\u3053\u3068\u3092\u793A\u3059\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u5C55\u958B\u3055\u308C\u3066\u3044\u308B\u3053\u3068\u3092\u793A\u3059\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u7F6E\u63DB' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u3059\u3079\u3066\u7F6E\u63DB' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u524D\u3092\u691C\u7D22' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u6B21\u3092\u691C\u7D22' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u691C\u7D22/\u7F6E\u63DB","\u691C\u7D22","\u691C\u7D22","\u524D\u306E\u4E00\u81F4\u9805\u76EE","\u6B21\u306E\u4E00\u81F4\u9805\u76EE","\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22","\u9589\u3058\u308B","\u7F6E\u63DB","\u7F6E\u63DB","\u7F6E\u63DB","\u3059\u3079\u3066\u7F6E\u63DB","\u7F6E\u63DB\u306E\u5207\u308A\u66FF\u3048","\u6700\u521D\u306E {0} \u4EF6\u306E\u7D50\u679C\u3060\u3051\u304C\u5F37\u8ABF\u8868\u793A\u3055\u308C\u307E\u3059\u304C\u3001\u3059\u3079\u3066\u306E\u691C\u7D22\u64CD\u4F5C\u306F\u30C6\u30AD\u30B9\u30C8\u5168\u4F53\u3067\u6A5F\u80FD\u3057\u307E\u3059\u3002","{0} / {1} \u4EF6","\u7D50\u679C\u306F\u3042\u308A\u307E\u305B\u3093\u3002","{0} \u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{0} \u304C '{1}' \u3067\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{0} \u306F '{1}' \u3067 {2} \u306B\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{0} \u304C '{1}' \u3067\u898B\u3064\u304B\u308A\u307E\u3057\u305F","Ctrl + Enter \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u3059\u3079\u3066\u7F6E\u63DB\u3059\u308B\u306E\u3067\u306F\u306A\u304F\u3001\u6539\u884C\u304C\u633F\u5165\u3055\u308C\u308B\u3088\u3046\u306B\u306A\u308A\u307E\u3057\u305F\u3002editor.action.replaceAll \u306E\u30AD\u30FC\u30D0\u30A4\u30F3\u30C9\u3092\u5909\u66F4\u3057\u3066\u3001\u3053\u306E\u52D5\u4F5C\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3067\u304D\u307E\u3059\u3002"],"vs/editor/contrib/folding/browser/folding":["\u5C55\u958B","\u518D\u5E30\u7684\u306B\u5C55\u958B\u3059\u308B","\u6298\u308A\u305F\u305F\u307F","\u6298\u308A\u305F\u305F\u307F\u306E\u5207\u308A\u66FF\u3048","\u518D\u5E30\u7684\u306B\u6298\u308A\u305F\u305F\u3080","\u3059\u3079\u3066\u306E\u30D6\u30ED\u30C3\u30AF \u30B3\u30E1\u30F3\u30C8\u306E\u6298\u308A\u305F\u305F\u307F","\u3059\u3079\u3066\u306E\u9818\u57DF\u3092\u6298\u308A\u305F\u305F\u3080","\u3059\u3079\u3066\u306E\u9818\u57DF\u3092\u5C55\u958B","\u9078\u629E\u3057\u305F\u9805\u76EE\u3092\u9664\u304F\u3059\u3079\u3066\u6298\u308A\u305F\u305F\u307F","\u9078\u629E\u3057\u305F\u9805\u76EE\u3092\u9664\u304F\u3059\u3079\u3066\u5C55\u958B","\u3059\u3079\u3066\u6298\u308A\u305F\u305F\u307F","\u3059\u3079\u3066\u5C55\u958B","\u89AA\u30D5\u30A9\u30FC\u30EB\u30C9\u306B\u79FB\u52D5\u3059\u308B","\u524D\u306E\u30D5\u30A9\u30FC\u30EB\u30C7\u30A3\u30F3\u30B0\u7BC4\u56F2\u306B\u79FB\u52D5\u3059\u308B","\u6B21\u306E\u30D5\u30A9\u30FC\u30EB\u30C7\u30A3\u30F3\u30B0\u7BC4\u56F2\u306B\u79FB\u52D5\u3059\u308B","\u9078\u629E\u7BC4\u56F2\u304B\u3089\u6298\u308A\u305F\u305F\u307F\u7BC4\u56F2\u3092\u4F5C\u6210\u3059\u308B","\u624B\u52D5\u6298\u308A\u305F\u305F\u307F\u7BC4\u56F2\u3092\u524A\u9664\u3059\u308B","\u30EC\u30D9\u30EB {0} \u3067\u6298\u308A\u305F\u305F\u3080"],"vs/editor/contrib/folding/browser/foldingDecorations":["\u6298\u308A\u66F2\u3052\u308B\u7BC4\u56F2\u306E\u80CC\u666F\u8272\u3002\u57FA\u306E\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u3088\u3046\u306B\u3001\u8272\u306F\u4E0D\u900F\u660E\u3067\u3042\u3063\u3066\u306F\u306A\u308A\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4F59\u767D\u306B\u3042\u308B\u6298\u308A\u305F\u305F\u307F\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B0\u30EA\u30D5\u4F59\u767D\u5185\u306E\u5C55\u958B\u3055\u308C\u305F\u7BC4\u56F2\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B0\u30EA\u30D5\u4F59\u767D\u5185\u306E\u6298\u308A\u305F\u305F\u307E\u308C\u305F\u7BC4\u56F2\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B0\u30EA\u30D5\u4F59\u767D\u5185\u306E\u6298\u308A\u305F\u305F\u307E\u308C\u305F\u7BC4\u56F2\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B0\u30EA\u30D5\u4F59\u767D\u5185\u3067\u624B\u52D5\u3067\u5C55\u958B\u3055\u308C\u305F\u7BC4\u56F2\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u7BC4\u56F2\u3092\u5C55\u958B\u3057\u307E\u3059\u3002","\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u7BC4\u56F2\u3092\u6298\u308A\u305F\u305F\u307F\u307E\u3059\u3002"],"vs/editor/contrib/fontZoom/browser/fontZoom":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u3092\u62E1\u5927","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u3092\u7E2E\u5C0F","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u3092\u30EA\u30BB\u30C3\u30C8"],"vs/editor/contrib/format/browser/formatActions":["\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8","\u9078\u629E\u7BC4\u56F2\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8"],"vs/editor/contrib/gotoError/browser/gotoError":["\u6B21\u306E\u554F\u984C (\u30A8\u30E9\u30FC\u3001\u8B66\u544A\u3001\u60C5\u5831) \u3078\u79FB\u52D5","\u6B21\u306E\u30DE\u30FC\u30AB\u30FC\u3078\u79FB\u52D5\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u524D\u306E\u554F\u984C (\u30A8\u30E9\u30FC\u3001\u8B66\u544A\u3001\u60C5\u5831) \u3078\u79FB\u52D5","\u524D\u306E\u30DE\u30FC\u30AB\u30FC\u3078\u79FB\u52D5\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30D5\u30A1\u30A4\u30EB\u5185\u306E\u6B21\u306E\u554F\u984C (\u30A8\u30E9\u30FC\u3001\u8B66\u544A\u3001\u60C5\u5831) \u3078\u79FB\u52D5","\u6B21\u306E\u554F\u984C\u7B87\u6240(&&P)","\u30D5\u30A1\u30A4\u30EB\u5185\u306E\u524D\u306E\u554F\u984C (\u30A8\u30E9\u30FC\u3001\u8B66\u544A\u3001\u60C5\u5831) \u3078\u79FB\u52D5","\u524D\u306E\u554F\u984C\u7B87\u6240(&&P)"],"vs/editor/contrib/gotoError/browser/gotoErrorWidget":["\u30A8\u30E9\u30FC","\u8B66\u544A","\u60C5\u5831","\u30D2\u30F3\u30C8","{0} ({1})\u3002","{1} \u4EF6\u4E2D {0} \u4EF6\u306E\u554F\u984C","\u554F\u984C {0} / {1}","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30A8\u30E9\u30FC\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8 \u30A8\u30E9\u30FC\u306E\u898B\u51FA\u3057\u306E\u80CC\u666F\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u8B66\u544A\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u8B66\u544A\u306E\u898B\u51FA\u3057\u306E\u80CC\u666F\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u60C5\u5831\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u60C5\u5831\u306E\u898B\u51FA\u3057\u306E\u80CC\u666F\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u80CC\u666F\u3002"],"vs/editor/contrib/gotoSymbol/browser/goToCommands":["\u30D4\u30FC\u30AF","\u5B9A\u7FA9","'{0}' \u306E\u5B9A\u7FA9\u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5B9A\u7FA9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5B9A\u7FA9\u3078\u79FB\u52D5","\u5B9A\u7FA9\u306B\u79FB\u52D5(&&D)","\u5B9A\u7FA9\u3092\u6A2A\u306B\u958B\u304F","\u5B9A\u7FA9\u3092\u3053\u3053\u306B\u8868\u793A","\u5BA3\u8A00","'{0}' \u306E\u5BA3\u8A00\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5BA3\u8A00\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5BA3\u8A00\u3078\u79FB\u52D5","\u5BA3\u8A00\u3078\u79FB\u52D5(&&D)","'{0}' \u306E\u5BA3\u8A00\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5BA3\u8A00\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5BA3\u8A00\u3092\u3053\u3053\u306B\u8868\u793A","\u578B\u5B9A\u7FA9","'{0}' \u306E\u578B\u5B9A\u7FA9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u578B\u5B9A\u7FA9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u578B\u5B9A\u7FA9\u3078\u79FB\u52D5","\u578B\u5B9A\u7FA9\u306B\u79FB\u52D5(&&T)","\u578B\u5B9A\u7FA9\u3092\u8868\u793A","\u5B9F\u88C5","'{0}' \u306E\u5B9F\u88C5\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5B9F\u88C5\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5B9F\u88C5\u3078\u79FB\u52D5","\u5B9F\u88C5\u7B87\u6240\u306B\u79FB\u52D5(&&I)","\u5B9F\u88C5\u306E\u30D4\u30FC\u30AF","'{0}' \u306E\u53C2\u7167\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u53C2\u7167\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u53C2\u7167\u3078\u79FB\u52D5","\u53C2\u7167\u3078\u79FB\u52D5(&&R)","\u53C2\u7167","\u53C2\u7167\u3092\u3053\u3053\u306B\u8868\u793A","\u53C2\u7167","\u4EFB\u610F\u306E\u30B7\u30F3\u30DC\u30EB\u3078\u79FB\u52D5","\u5834\u6240","'{0}' \u306B\u4E00\u81F4\u3059\u308B\u7D50\u679C\u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F","\u53C2\u7167"],"vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition":["\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u3001{0} \u306E\u5B9A\u7FA9\u3092\u8868\u793A\u3057\u307E\u3059\u3002"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesController":["\u53C2\u7167\u306E\u30D7\u30EC\u30D3\u30E5\u30FC\u304C\u8868\u793A\u3055\u308C\u308B\u304B\u3069\u3046\u304B ('\u53C2\u7167\u306E\u30D7\u30EC\u30D3\u30E5\u30FC' \u307E\u305F\u306F '\u5B9A\u7FA9\u3092\u3053\u3053\u306B\u8868\u793A' \u306A\u3069)","\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesTree":["{0} \u500B\u306E\u53C2\u7167","{0} \u500B\u306E\u53C2\u7167","\u53C2\u7167\u8A2D\u5B9A"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget":["\u30D7\u30EC\u30D3\u30E5\u30FC\u3092\u8868\u793A\u3067\u304D\u307E\u305B\u3093","\u7D50\u679C\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u53C2\u7167\u8A2D\u5B9A"],"vs/editor/contrib/gotoSymbol/browser/referencesModel":["\u5217 {2} \u306E\u884C {1} \u306E {0}","\u5217 {3} \u306E\u884C {2} \u306E {1} \u306B {0}","{0} \u306B 1 \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u3001\u5B8C\u5168\u306A\u30D1\u30B9 {1}","{1} \u306B {0} \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u3001\u5B8C\u5168\u306A\u30D1\u30B9 {2}","\u4E00\u81F4\u3059\u308B\u9805\u76EE\u306F\u3042\u308A\u307E\u305B\u3093","{0} \u306B 1 \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{1} \u306B {0} \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{1} \u500B\u306E\u30D5\u30A1\u30A4\u30EB\u306B {0} \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F"],"vs/editor/contrib/gotoSymbol/browser/symbolNavigation":["\u30AD\u30FC\u30DC\u30FC\u30C9\u306E\u307F\u3067\u79FB\u52D5\u3067\u304D\u308B\u30B7\u30F3\u30DC\u30EB\u306E\u5834\u6240\u304C\u3042\u308B\u304B\u3069\u3046\u304B\u3002","{1} \u306E\u30B7\u30F3\u30DC\u30EB {0}\u3001\u6B21\u306B {2}","\u30B7\u30F3\u30DC\u30EB {0}/{1}"],"vs/editor/contrib/hover/browser/hover":["[\u8868\u793A\u307E\u305F\u306F\u30D5\u30A9\u30FC\u30AB\u30B9] \u30DB\u30D0\u30FC","\u30DB\u30D0\u30FC\u306F\u81EA\u52D5\u7684\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3092\u53D6\u5F97\u3057\u307E\u305B\u3093\u3002","\u30DB\u30D0\u30FC\u306F\u3001\u305D\u308C\u304C\u65E2\u306B\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306B\u306E\u307F\u30D5\u30A9\u30FC\u30AB\u30B9\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002","\u30DB\u30D0\u30FC\u304C\u8868\u793A\u3055\u308C\u308B\u3068\u3001\u81EA\u52D5\u7684\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002","\u5B9A\u7FA9\u30D7\u30EC\u30D3\u30E5\u30FC\u306E\u30DB\u30D0\u30FC\u3092\u8868\u793A\u3059\u308B","[\u4E0A\u306B\u30B9\u30AF\u30ED\u30FC\u30EB] \u30DB\u30D0\u30FC","[\u4E0B\u306B\u30B9\u30AF\u30ED\u30FC\u30EB] \u30DB\u30D0\u30FC","[\u5DE6\u306B\u30B9\u30AF\u30ED\u30FC\u30EB] \u30DB\u30D0\u30FC","[\u53F3\u306B\u30B9\u30AF\u30ED\u30FC\u30EB] \u30DB\u30D0\u30FC","[\u30DA\u30FC\u30B8\u3092\u4E0A\u306B] \u30DB\u30D0\u30FC","[\u30DA\u30FC\u30B8\u3092\u4E0B\u306B] \u30DB\u30D0\u30FC","[\u4E0A\u306B\u79FB\u52D5] \u30DB\u30D0\u30FC","[\u4E0B\u306B\u79FB\u52D5] \u30DB\u30D0\u30FC"],"vs/editor/contrib/hover/browser/markdownHoverParticipant":["\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059...","\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u4E0A\u306E\u7406\u7531\u304B\u3089\u3001\u9577\u3044\u884C\u306E\u305F\u3081\u306B\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\u304C\u4E00\u6642\u505C\u6B62\u3055\u308C\u307E\u3057\u305F\u3002\u3053\u308C\u306F `editor.stopRenderingLineAfter` \u3067\u8A2D\u5B9A\u3067\u304D\u307E\u3059\u3002","\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u4E0A\u306E\u7406\u7531\u304B\u3089\u30C8\u30FC\u30AF\u30F3\u5316\u306F\u30B9\u30AD\u30C3\u30D7\u3055\u308C\u307E\u3059\u3002\u305D\u306E\u9577\u3044\u884C\u306E\u9577\u3055\u306F `editor.maxTokenizationLineLength` \u3067\u69CB\u6210\u3067\u304D\u307E\u3059\u3002"],"vs/editor/contrib/hover/browser/markerHoverParticipant":["\u554F\u984C\u306E\u8868\u793A","\u5229\u7528\u3067\u304D\u308B\u30AF\u30A4\u30C3\u30AF\u30D5\u30A3\u30C3\u30AF\u30B9\u306F\u3042\u308A\u307E\u305B\u3093","\u30AF\u30A4\u30C3\u30AF\u30D5\u30A3\u30C3\u30AF\u30B9\u3092\u78BA\u8A8D\u3057\u3066\u3044\u307E\u3059...","\u5229\u7528\u3067\u304D\u308B\u30AF\u30A4\u30C3\u30AF\u30D5\u30A3\u30C3\u30AF\u30B9\u306F\u3042\u308A\u307E\u305B\u3093","\u30AF\u30A4\u30C3\u30AF \u30D5\u30A3\u30C3\u30AF\u30B9..."],"vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace":["\u524D\u306E\u5024\u306B\u7F6E\u63DB","\u6B21\u306E\u5024\u306B\u7F6E\u63DB"],"vs/editor/contrib/indentation/browser/indentation":["\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u30B9\u30DA\u30FC\u30B9\u306B\u5909\u63DB","\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u30BF\u30D6\u306B\u5909\u63DB","\u69CB\u6210\u3055\u308C\u305F\u30BF\u30D6\u306E\u30B5\u30A4\u30BA","\u65E2\u5B9A\u306E\u30BF\u30D6 \u30B5\u30A4\u30BA","\u73FE\u5728\u306E\u30BF\u30D6 \u30B5\u30A4\u30BA","\u73FE\u5728\u306E\u30D5\u30A1\u30A4\u30EB\u306E\u30BF\u30D6\u306E\u30B5\u30A4\u30BA\u3092\u9078\u629E","\u30BF\u30D6\u306B\u3088\u308B\u30A4\u30F3\u30C7\u30F3\u30C8","\u30B9\u30DA\u30FC\u30B9\u306B\u3088\u308B\u30A4\u30F3\u30C7\u30F3\u30C8","\u30BF\u30D6\u306E\u8868\u793A\u30B5\u30A4\u30BA\u306E\u5909\u66F4","\u5185\u5BB9\u304B\u3089\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u691C\u51FA","\u884C\u306E\u518D\u30A4\u30F3\u30C7\u30F3\u30C8","\u9078\u629E\u884C\u3092\u518D\u30A4\u30F3\u30C7\u30F3\u30C8"],"vs/editor/contrib/inlayHints/browser/inlayHintsHover":["\u30C0\u30D6\u30EB\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u633F\u5165\u3059\u308B","cmd \u30AD\u30FC\u3092\u62BC\u3057\u306A\u304C\u3089\u30AF\u30EA\u30C3\u30AF","ctrl \u30AD\u30FC\u3092\u62BC\u3057\u306A\u304C\u3089 \u30AF\u30EA\u30C3\u30AF","option \u30AD\u30FC\u3092\u62BC\u3057\u306A\u304C\u3089\u30AF\u30EA\u30C3\u30AF","alt \u30AD\u30FC\u3092\u62BC\u3057\u306A\u304C\u3089\u30AF\u30EA\u30C3\u30AF","[\u5B9A\u7FA9] ({0}) \u306B\u79FB\u52D5\u3057\u3001\u53F3\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u8A73\u7D30\u3092\u8868\u793A\u3057\u307E\u3059","\u5B9A\u7FA9\u306B\u79FB\u52D5 ({0})","\u30B3\u30DE\u30F3\u30C9\u306E\u5B9F\u884C"],"vs/editor/contrib/inlineCompletions/browser/commands":["\u6B21\u306E\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u3092\u8868\u793A\u3059\u308B","\u524D\u306E\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u3092\u8868\u793A\u3059\u308B","\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u3092\u30C8\u30EA\u30AC\u30FC\u3059\u308B","\u30A4\u30F3\u30E9\u30A4\u30F3\u63D0\u6848\u306E\u6B21\u306E\u5358\u8A9E\u3092\u627F\u8AFE\u3059\u308B","\u30EF\u30FC\u30C9\u3092\u627F\u8AFE\u3059\u308B","\u30A4\u30F3\u30E9\u30A4\u30F3\u63D0\u6848\u306E\u6B21\u306E\u884C\u3092\u627F\u8AFE\u3059\u308B","\u884C\u3092\u627F\u8AFE\u3059\u308B","\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u3092\u627F\u8AFE\u3059\u308B","\u627F\u8AFE\u3059\u308B","\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u3092\u975E\u8868\u793A\u306B\u3059\u308B","\u5E38\u306B\u30C4\u30FC\u30EB \u30D0\u30FC\u3092\u8868\u793A\u3059\u308B"],"vs/editor/contrib/inlineCompletions/browser/hoverParticipant":["\u304A\u3059\u3059\u3081:"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys":["\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B","\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u304C\u30B9\u30DA\u30FC\u30B9\u3067\u59CB\u307E\u308B\u304B\u3069\u3046\u304B","\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC\u304C\u3001\u30BF\u30D6\u3067\u633F\u5165\u3055\u308C\u308B\u3082\u306E\u3088\u308A\u3082\u5C0F\u3055\u3044\u30B9\u30DA\u30FC\u30B9\u3067\u59CB\u307E\u308B\u304B\u3069\u3046\u304B","\u73FE\u5728\u306E\u5019\u88DC\u306B\u3064\u3044\u3066\u5019\u88DC\u8868\u793A\u3092\u6B62\u3081\u308B\u304B\u3069\u3046\u304B"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController":["\u30E6\u30FC\u30B6\u30FC\u88DC\u52A9\u5BFE\u5FDC\u306E\u30D3\u30E5\u30FC\u3067\u3053\u308C\u3092\u691C\u67FB\u3057\u307E\u3059 ({0})"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget":["\u6B21\u306E\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8\u3092\u8868\u793A\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u524D\u306E\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8\u3092\u8868\u793A\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","{0} ({1})","\u524D\u3078","\u6B21\u3078"],"vs/editor/contrib/lineSelection/browser/lineSelection":["\u884C\u5168\u4F53\u3092\u9078\u629E\u3059\u308B"],"vs/editor/contrib/linesOperations/browser/linesOperations":["\u884C\u3092\u4E0A\u3078\u30B3\u30D4\u30FC","\u884C\u3092\u4E0A\u3078\u30B3\u30D4\u30FC(&&C)","\u884C\u3092\u4E0B\u3078\u30B3\u30D4\u30FC","\u884C\u3092\u4E0B\u3078\u30B3\u30D4\u30FC(&&P)","\u9078\u629E\u7BC4\u56F2\u306E\u8907\u88FD","\u9078\u629E\u7BC4\u56F2\u306E\u8907\u88FD(&&D)","\u884C\u3092\u4E0A\u3078\u79FB\u52D5","\u884C\u3092\u4E0A\u3078\u79FB\u52D5(&&V)","\u884C\u3092\u4E0B\u3078\u79FB\u52D5","\u884C\u3092\u4E0B\u3078\u79FB\u52D5(&&L)","\u884C\u3092\u6607\u9806\u306B\u4E26\u3079\u66FF\u3048","\u884C\u3092\u964D\u9806\u306B\u4E26\u3079\u66FF\u3048","\u91CD\u8907\u3059\u308B\u884C\u3092\u524A\u9664","\u672B\u5C3E\u306E\u7A7A\u767D\u306E\u30C8\u30EA\u30DF\u30F3\u30B0","\u884C\u306E\u524A\u9664","\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8","\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u89E3\u9664","\u884C\u3092\u4E0A\u306B\u633F\u5165","\u884C\u3092\u4E0B\u306B\u633F\u5165","\u5DE6\u5074\u3092\u3059\u3079\u3066\u524A\u9664","\u53F3\u5074\u3092\u3059\u3079\u3066\u524A\u9664","\u884C\u3092\u3064\u306A\u3052\u308B","\u30AB\u30FC\u30BD\u30EB\u306E\u5468\u56F2\u306E\u6587\u5B57\u3092\u5165\u308C\u66FF\u3048\u308B","\u5927\u6587\u5B57\u306B\u5909\u63DB","\u5C0F\u6587\u5B57\u306B\u5909\u63DB","\u5148\u982D\u6587\u5B57\u3092\u5927\u6587\u5B57\u306B\u5909\u63DB\u3059\u308B","\u30B9\u30CD\u30FC\u30AF \u30B1\u30FC\u30B9\u306B\u5909\u63DB\u3059\u308B","\u30AD\u30E3\u30E1\u30EB \u30B1\u30FC\u30B9\u306B\u5909\u63DB\u3059\u308B","Kebab \u30B1\u30FC\u30B9\u3078\u306E\u5909\u63DB"],"vs/editor/contrib/linkedEditing/browser/linkedEditing":["\u30EA\u30F3\u30AF\u3055\u308C\u305F\u7DE8\u96C6\u306E\u958B\u59CB","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u578B\u306E\u540D\u524D\u306E\u81EA\u52D5\u5909\u66F4\u3092\u884C\u3046\u3068\u304D\u306E\u80CC\u666F\u8272\u3067\u3059\u3002"],"vs/editor/contrib/links/browser/links":["\u3053\u306E\u30EA\u30F3\u30AF\u306F\u5F62\u5F0F\u304C\u6B63\u3057\u304F\u306A\u3044\u305F\u3081\u958B\u304F\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F: {0}","\u3053\u306E\u30EA\u30F3\u30AF\u306F\u30BF\u30FC\u30B2\u30C3\u30C8\u304C\u5B58\u5728\u3057\u306A\u3044\u305F\u3081\u958B\u304F\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30B3\u30DE\u30F3\u30C9\u306E\u5B9F\u884C","\u30EA\u30F3\u30AF\u5148\u3092\u8868\u793A","cmd + \u30AF\u30EA\u30C3\u30AF","ctrl + \u30AF\u30EA\u30C3\u30AF","option + \u30AF\u30EA\u30C3\u30AF","alt + \u30AF\u30EA\u30C3\u30AF","\u30B3\u30DE\u30F3\u30C9 {0} \u306E\u5B9F\u884C","\u30EA\u30F3\u30AF\u3092\u958B\u304F"],"vs/editor/contrib/message/browser/messageController":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u73FE\u5728\u30A4\u30F3\u30E9\u30A4\u30F3 \u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u304B\u3069\u3046\u304B"],"vs/editor/contrib/multicursor/browser/multicursor":["\u8FFD\u52A0\u3055\u308C\u305F\u30AB\u30FC\u30BD\u30EB: {0}","\u8FFD\u52A0\u3055\u308C\u305F\u30AB\u30FC\u30BD\u30EB: {0}","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0A\u306B\u633F\u5165","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0A\u306B\u633F\u5165(&&A)","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0B\u306B\u633F\u5165","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0B\u306B\u633F\u5165(&&D)","\u30AB\u30FC\u30BD\u30EB\u3092\u884C\u672B\u306B\u633F\u5165","\u30AB\u30FC\u30BD\u30EB\u3092\u884C\u672B\u306B\u633F\u5165(&&U)","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0B\u306B\u633F\u5165","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0A\u306B\u633F\u5165","\u9078\u629E\u3057\u305F\u9805\u76EE\u3092\u6B21\u306E\u4E00\u81F4\u9805\u76EE\u306B\u8FFD\u52A0","\u6B21\u306E\u51FA\u73FE\u500B\u6240\u3092\u8FFD\u52A0(&&N)","\u9078\u629E\u9805\u76EE\u3092\u6B21\u306E\u4E00\u81F4\u9805\u76EE\u306B\u8FFD\u52A0","\u524D\u306E\u51FA\u73FE\u7B87\u6240\u3092\u8FFD\u52A0(&&R)","\u6700\u5F8C\u306B\u9078\u629E\u3057\u305F\u9805\u76EE\u3092\u6B21\u306E\u4E00\u81F4\u9805\u76EE\u306B\u79FB\u52D5","\u6700\u5F8C\u306B\u9078\u3093\u3060\u9805\u76EE\u3092\u524D\u306E\u4E00\u81F4\u9805\u76EE\u306B\u79FB\u52D5\u3059\u308B","\u4E00\u81F4\u3059\u308B\u3059\u3079\u3066\u306E\u51FA\u73FE\u7B87\u6240\u3092\u9078\u629E\u3057\u307E\u3059","\u3059\u3079\u3066\u306E\u51FA\u73FE\u7B87\u6240\u3092\u9078\u629E(&&O)","\u3059\u3079\u3066\u306E\u51FA\u73FE\u7B87\u6240\u3092\u5909\u66F4","\u6B21\u306E\u30AB\u30FC\u30BD\u30EB\u306B\u30D5\u30A9\u30FC\u30AB\u30B9","\u6B21\u306E\u30AB\u30FC\u30BD\u30EB\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3092\u5408\u308F\u305B\u308B","\u524D\u306E\u30AB\u30FC\u30BD\u30EB\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3059\u308B","\u524D\u306E\u30AB\u30FC\u30BD\u30EB\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3092\u5408\u308F\u305B\u308B"],"vs/editor/contrib/parameterHints/browser/parameterHints":["\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8\u3092\u30C8\u30EA\u30AC\u30FC"],"vs/editor/contrib/parameterHints/browser/parameterHintsWidget":["\u6B21\u306E\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8\u3092\u8868\u793A\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u524D\u306E\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8\u3092\u8868\u793A\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","{0}\u3001\u30D2\u30F3\u30C8","\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8\u5185\u306E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u9805\u76EE\u306E\u524D\u666F\u8272\u3002"],"vs/editor/contrib/peekView/browser/peekView":["\u73FE\u5728\u306E\u30B3\u30FC\u30C9 \u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u30D7\u30EC\u30D3\u30E5\u30FC\u5185\u306B\u57CB\u3081\u8FBC\u307E\u308C\u308B\u304B\u3069\u3046\u304B","\u9589\u3058\u308B","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u306E\u30BF\u30A4\u30C8\u30EB\u9818\u57DF\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30BF\u30A4\u30C8\u30EB\u306E\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u306E\u30BF\u30A4\u30C8\u30EB\u60C5\u5831\u306E\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u306E\u5883\u754C\u3068\u77E2\u5370\u306E\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u30E9\u30A4\u30F3 \u30CE\u30FC\u30C9\u306E\u524D\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u30D5\u30A1\u30A4\u30EB \u30CE\u30FC\u30C9\u306E\u524D\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u9078\u629E\u6E08\u307F\u30A8\u30F3\u30C8\u30EA\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u9078\u629E\u6E08\u307F\u30A8\u30F3\u30C8\u30EA\u306E\u524D\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4F59\u767D\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306E\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u4E00\u81F4\u3057\u305F\u5F37\u8ABF\u8868\u793A\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E00\u81F4\u3057\u305F\u5F37\u8ABF\u8868\u793A\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E00\u81F4\u3057\u305F\u5F37\u8ABF\u5883\u754C\u8272\u3002"],"vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess":["\u6700\u521D\u306B\u30C6\u30AD\u30B9\u30C8 \u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u958B\u3044\u3066\u3001\u884C\u306B\u79FB\u52D5\u3057\u307E\u3059\u3002","\u884C {0}\u3001\u6587\u5B57 {1} \u306B\u79FB\u52D5\u3057\u307E\u3059\u3002","{0} \u884C\u306B\u79FB\u52D5\u3057\u307E\u3059\u3002","\u73FE\u5728\u306E\u884C: {0}\u3001\u6587\u5B57: {1}\u3002\u79FB\u52D5\u5148\u3068\u306A\u308B\u30011 \u304B\u3089 {2} \u307E\u3067\u306E\u884C\u756A\u53F7\u3092\u5165\u529B\u3057\u307E\u3059\u3002","\u73FE\u5728\u306E\u884C: {0}\u3001\u6587\u5B57: {1}\u3002\u79FB\u52D5\u5148\u306E\u884C\u756A\u53F7\u3092\u5165\u529B\u3057\u307E\u3059\u3002"],"vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess":["\u30B7\u30F3\u30DC\u30EB\u306B\u79FB\u52D5\u3059\u308B\u306B\u306F\u3001\u307E\u305A\u30B7\u30F3\u30DC\u30EB\u60C5\u5831\u3092\u542B\u3080\u30C6\u30AD\u30B9\u30C8 \u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u958B\u304D\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C6\u30AD\u30B9\u30C8 \u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306F\u3001\u30B7\u30F3\u30DC\u30EB\u60C5\u5831\u306F\u8868\u793A\u3055\u308C\u307E\u305B\u3093\u3002","\u4E00\u81F4\u3059\u308B\u30A8\u30C7\u30A3\u30BF\u30FC \u30B7\u30F3\u30DC\u30EB\u304C\u3042\u308A\u307E\u305B\u3093","\u30A8\u30C7\u30A3\u30BF\u30FC \u30B7\u30F3\u30DC\u30EB\u304C\u3042\u308A\u307E\u305B\u3093","\u6A2A\u306B\u4E26\u3079\u3066\u958B\u304F","\u4E00\u756A\u4E0B\u3067\u958B\u304F","\u30B7\u30F3\u30DC\u30EB ({0})","\u30D7\u30ED\u30D1\u30C6\u30A3 ({0})","\u30E1\u30BD\u30C3\u30C9 ({0})","\u95A2\u6570 ({0})","\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u30FC ({0})","\u5909\u6570 ({0})","\u30AF\u30E9\u30B9 ({0})","\u69CB\u9020\u4F53 ({0})","\u30A4\u30D9\u30F3\u30C8 ({0})","\u6F14\u7B97\u5B50 ({0})","\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9 ({0})","\u540D\u524D\u7A7A\u9593 ({0})","\u30D1\u30C3\u30B1\u30FC\u30B8 ({0})","\u578B\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC ({0})","\u30E2\u30B8\u30E5\u30FC\u30EB ({0})","\u30D7\u30ED\u30D1\u30C6\u30A3 ({0})","\u5217\u6319\u578B ({0})","\u5217\u6319\u578B\u30E1\u30F3\u30D0\u30FC ({0})","\u6587\u5B57\u5217 ({0})","\u30D5\u30A1\u30A4\u30EB ({0})","\u914D\u5217 ({0})","\u6570\u5024 ({0})","\u30D6\u30FC\u30EB\u5024 ({0})","\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8 ({0})","\u30AD\u30FC ({0})","\u30D5\u30A3\u30FC\u30EB\u30C9 ({0})","\u5B9A\u6570 ({0})"],"vs/editor/contrib/readOnlyMessage/browser/contribution":["\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u306E\u5165\u529B\u3067\u306F\u7DE8\u96C6\u3067\u304D\u307E\u305B\u3093","\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u7DE8\u96C6\u3067\u304D\u307E\u305B\u3093"],"vs/editor/contrib/rename/browser/rename":["\u7D50\u679C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u540D\u524D\u5909\u66F4\u306E\u5834\u6240\u3092\u89E3\u6C7A\u3057\u3088\u3046\u3068\u3057\u3066\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F","\u540D\u524D\u3092 '{0}' \u304B\u3089 '{1}' \u306B\u5909\u66F4\u3057\u3066\u3044\u307E\u3059","{0} \u306E\u540D\u524D\u3092 {1} \u306B\u5909\u66F4\u3057\u3066\u3044\u307E\u3059","'{0}' \u304B\u3089 '{1}' \u3078\u306E\u540D\u524D\u5909\u66F4\u304C\u6B63\u5E38\u306B\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002\u6982\u8981: {2}","\u540D\u524D\u306E\u5909\u66F4\u3067\u7DE8\u96C6\u3092\u9069\u7528\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u540D\u524D\u306E\u5909\u66F4\u306B\u3088\u3063\u3066\u7DE8\u96C6\u306E\u8A08\u7B97\u306B\u5931\u6557\u3057\u307E\u3057\u305F","\u30B7\u30F3\u30DC\u30EB\u306E\u540D\u524D\u5909\u66F4","\u540D\u524D\u3092\u5909\u66F4\u3059\u308B\u524D\u306B\u5909\u66F4\u3092\u30D7\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u6A5F\u80FD\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3059\u308B"],"vs/editor/contrib/rename/browser/renameInputField":["\u540D\u524D\u306E\u5909\u66F4\u5165\u529B\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u8868\u793A\u3055\u308C\u308B\u304B\u3069\u3046\u304B","\u540D\u524D\u5909\u66F4\u5165\u529B\u3002\u65B0\u3057\u3044\u540D\u524D\u3092\u5165\u529B\u3057\u3001Enter \u30AD\u30FC\u3092\u62BC\u3057\u3066\u30B3\u30DF\u30C3\u30C8\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u540D\u524D\u3092\u5909\u66F4\u3059\u308B\u306B\u306F {0}\u3001\u30D7\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u306B\u306F {1}"],"vs/editor/contrib/smartSelect/browser/smartSelect":["\u9078\u629E\u7BC4\u56F2\u3092\u62E1\u5F35","\u9078\u629E\u7BC4\u56F2\u306E\u5C55\u958B(&&E)","\u9078\u629E\u7BC4\u56F2\u3092\u7E2E\u5C0F","\u9078\u629E\u7BC4\u56F2\u306E\u7E2E\u5C0F(&&S)"],"vs/editor/contrib/snippet/browser/snippetController2":["\u73FE\u5728\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u30B9\u30CB\u30DA\u30C3\u30C8 \u30E2\u30FC\u30C9\u3067\u3042\u308B\u304B\u3069\u3046\u304B","\u30B9\u30CB\u30DA\u30C3\u30C8 \u30E2\u30FC\u30C9\u306E\u3068\u304D\u306B\u3001\u6B21\u306E\u30BF\u30D6\u4F4D\u7F6E\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u30B9\u30CB\u30DA\u30C3\u30C8 \u30E2\u30FC\u30C9\u306E\u3068\u304D\u306B\u3001\u524D\u306E\u30BF\u30D6\u4F4D\u7F6E\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u6B21\u306E\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC\u306B\u79FB\u52D5..."],"vs/editor/contrib/snippet/browser/snippetVariables":["\u65E5\u66DC\u65E5","\u6708\u66DC\u65E5","\u706B\u66DC\u65E5","\u6C34\u66DC\u65E5","\u6728\u66DC\u65E5","\u91D1\u66DC\u65E5","\u571F\u66DC\u65E5","\u65E5","\u6708","\u706B","\u6C34","\u6728","\u91D1","\u571F","1 \u6708","2 \u6708","3 \u6708","4 \u6708","5 \u6708","6 \u6708","7 \u6708","8 \u6708","9 \u6708","10 \u6708","11 \u6708","12 \u6708","1 \u6708","2 \u6708","3 \u6708","4 \u6708","5 \u6708","6 \u6708","7 \u6708","8 \u6708","9 \u6708","10 \u6708","11 \u6708","12 \u6708"],"vs/editor/contrib/stickyScroll/browser/stickyScrollActions":["\u30A8\u30C7\u30A3\u30BF\u30FC\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u306E\u5207\u308A\u66FF\u3048","\u30A8\u30C7\u30A3\u30BF\u30FC\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u306E\u5207\u308A\u66FF\u3048(&T)","\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB","\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB(&&S)","\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u3078\u306E\u30D5\u30A9\u30FC\u30AB\u30B9","\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u3078\u306E\u30D5\u30A9\u30FC\u30AB\u30B9(&F)","\u6B21\u306E\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u884C\u3092\u9078\u629E","\u524D\u306E\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u884C\u3092\u9078\u629E","\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u884C\u306B\u79FB\u52D5","\u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u9078\u629E"],"vs/editor/contrib/suggest/browser/suggest":["\u5019\u88DC\u304C\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u3066\u3044\u308B\u304B\u3069\u3046\u304B","\u5019\u88DC\u306E\u8A73\u7D30\u304C\u8868\u793A\u3055\u308C\u308B\u304B\u3069\u3046\u304B","\u9078\u629E\u3059\u308B\u8907\u6570\u306E\u5019\u88DC\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u73FE\u5728\u306E\u5019\u88DC\u3092\u633F\u5165\u3057\u305F\u3068\u304D\u3001\u5909\u66F4\u3092\u884C\u3046\u304B\u3001\u307E\u305F\u306F\u65E2\u306B\u5165\u529B\u3057\u305F\u5185\u5BB9\u3092\u3059\u3079\u3066\u5165\u529B\u3059\u308B\u304B\u3069\u3046\u304B","Enter \u30AD\u30FC\u3092\u62BC\u3057\u305F\u3068\u304D\u306B\u5019\u88DC\u3092\u633F\u5165\u3059\u308B\u304B\u3069\u3046\u304B","\u73FE\u5728\u306E\u5019\u88DC\u306B\u633F\u5165\u3068\u7F6E\u63DB\u306E\u52D5\u4F5C\u304C\u3042\u308B\u304B\u3069\u3046\u304B","\u65E2\u5B9A\u306E\u52D5\u4F5C\u304C\u633F\u5165\u307E\u305F\u306F\u7F6E\u63DB\u3067\u3042\u308B\u304B\u3069\u3046\u304B","\u73FE\u5728\u306E\u5019\u88DC\u304B\u3089\u306E\u8A73\u7D30\u306E\u89E3\u6C7A\u3092\u30B5\u30DD\u30FC\u30C8\u3059\u308B\u304B\u3069\u3046\u304B"],"vs/editor/contrib/suggest/browser/suggestController":["{1} \u304C\u8FFD\u52A0\u7DE8\u96C6\u3057\u305F '{0}' \u3092\u53D7\u3051\u5165\u308C\u308B","\u5019\u88DC\u3092\u30C8\u30EA\u30AC\u30FC","\u633F\u5165","\u633F\u5165","\u7F6E\u63DB","\u7F6E\u63DB","\u633F\u5165","\u8868\u793A\u3092\u6E1B\u3089\u3059","\u3055\u3089\u306B\u8868\u793A","\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30B5\u30A4\u30BA\u3092\u30EA\u30BB\u30C3\u30C8"],"vs/editor/contrib/suggest/browser/suggestWidget":["\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u80CC\u666F\u8272\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u5883\u754C\u7DDA\u8272\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u524D\u666F\u8272\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u3067\u9078\u629E\u6E08\u307F\u5165\u529B\u306E\u524D\u666F\u8272\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u3067\u9078\u629E\u6E08\u307F\u5165\u529B\u306E\u30A2\u30A4\u30B3\u30F3\u524D\u666F\u8272\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u3067\u9078\u629E\u6E08\u307F\u30A8\u30F3\u30C8\u30EA\u306E\u80CC\u666F\u8272\u3002","\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u3067\u4E00\u81F4\u3057\u305F\u30CF\u30A4\u30E9\u30A4\u30C8\u306E\u8272\u3002","\u9805\u76EE\u304C\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306B\u3001\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3067\u306E\u4E00\u81F4\u306E\u5F37\u8ABF\u8868\u793A\u306E\u8272\u3067\u3059\u3002","\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u72B6\u614B\u306E\u63D0\u6848\u306E\u524D\u666F\u8272\u3002","\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059...","\u5019\u88DC\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u63D0\u6848","{0} {1}\u3001{2}","{0} {1}","{0}\u3001 {1}","{0}\u3001\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8: {1}"],"vs/editor/contrib/suggest/browser/suggestWidgetDetails":["\u9589\u3058\u308B","\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059..."],"vs/editor/contrib/suggest/browser/suggestWidgetRenderer":["\u63D0\u6848\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u8A73\u7D30\u60C5\u5831\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u8A73\u7D30\u3092\u53C2\u7167"],"vs/editor/contrib/suggest/browser/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/browser/symbolIcons":["\u914D\u5217\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D6\u30FC\u30EB\u5024\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30AF\u30E9\u30B9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u8272\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5B9A\u6570\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5217\u6319\u5B50\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5217\u6319\u5B50\u30E1\u30F3\u30D0\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30A4\u30D9\u30F3\u30C8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D5\u30A3\u30FC\u30EB\u30C9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D5\u30A1\u30A4\u30EB\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D5\u30A9\u30EB\u30C0\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u95A2\u6570\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30AD\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30AD\u30FC\u30EF\u30FC\u30C9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30E1\u30BD\u30C3\u30C9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30E2\u30B8\u30E5\u30FC\u30EB\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u540D\u524D\u7A7A\u9593\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","Null \u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6570\u5024\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6F14\u7B97\u5B50\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D1\u30C3\u30B1\u30FC\u30B8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D7\u30ED\u30D1\u30C6\u30A3\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u53C2\u7167\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6587\u5B57\u5217\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u69CB\u9020\u4F53\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30C6\u30AD\u30B9\u30C8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5358\u4F4D\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5909\u6570\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002"],"vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode":["Tab \u30AD\u30FC\u3092\u5207\u308A\u66FF\u3048\u308B\u3068\u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u79FB\u52D5\u3057\u307E\u3059","Tab \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u6B21\u306E\u30D5\u30A9\u30FC\u30AB\u30B9\u53EF\u80FD\u306A\u8981\u7D20\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3092\u79FB\u52D5\u3057\u307E\u3059","Tab \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u30BF\u30D6\u6587\u5B57\u304C\u633F\u5165\u3055\u308C\u307E\u3059"],"vs/editor/contrib/tokenization/browser/tokenization":["\u958B\u767A\u8005: \u30C8\u30FC\u30AF\u30F3\u518D\u4F5C\u6210\u306E\u5F37\u5236"],"vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter":["\u62E1\u5F35\u6A5F\u80FD\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u8B66\u544A\u30E1\u30C3\u30BB\u30FC\u30B8\u3068\u5171\u306B\u8868\u793A\u3055\u308C\u308B\u30A2\u30A4\u30B3\u30F3\u3002","\u3053\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306B\u306F\u3001\u57FA\u672C ASCII \u5916\u306E Unicode \u6587\u5B57\u304C\u591A\u6570\u542B\u307E\u308C\u3066\u3044\u307E\u3059","\u3053\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306B\u306F\u307E\u304E\u3089\u308F\u3057\u3044 Unicode \u6587\u5B57\u304C\u591A\u6570\u542B\u307E\u308C\u3066\u3044\u307E\u3059","\u3053\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306B\u306F\u4E0D\u53EF\u8996\u306E Unicode \u6587\u5B57\u304C\u591A\u6570\u542B\u307E\u308C\u3066\u3044\u307E\u3059","Unicode \u306E\u5F37\u8ABF\u8868\u793A\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u69CB\u6210\u3059\u308B","\u6587\u5B57 {0} \u306F\u3001\u30BD\u30FC\u30B9 \u30B3\u30FC\u30C9\u3067\u3088\u308A\u4E00\u822C\u7684\u306A ASCII \u6587\u5B57 {1} \u3068\u6DF7\u540C\u3055\u308C\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002","\u6587\u5B57 {0}\u306F\u3001\u30BD\u30FC\u30B9 \u30B3\u30FC\u30C9\u3067\u3088\u308A\u4E00\u822C\u7684\u306A\u6587\u5B57{1}\u3068\u6DF7\u540C\u3055\u308C\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002","\u6587\u5B57 {0}\u306F\u975E\u8868\u793A\u3067\u3059\u3002","\u6587\u5B57 {0} \u306F\u57FA\u672C ASCII \u6587\u5B57\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u8A2D\u5B9A\u306E\u8ABF\u6574","\u30B3\u30E1\u30F3\u30C8\u306E\u5F37\u8ABF\u8868\u793A\u3092\u7121\u52B9\u306B\u3059\u308B","\u30B3\u30E1\u30F3\u30C8\u306E\u6587\u5B57\u306E\u5F37\u8ABF\u8868\u793A\u3092\u7121\u52B9\u306B\u3059\u308B","\u6587\u5B57\u5217\u306E\u5F37\u8ABF\u8868\u793A\u3092\u7121\u52B9\u306B\u3059\u308B","\u6587\u5B57\u5217\u306E\u6587\u5B57\u306E\u5F37\u8ABF\u8868\u793A\u3092\u7121\u52B9\u306B\u3059\u308B","\u307E\u304E\u3089\u308F\u3057\u3044\u6587\u5B57\u306E\u5F37\u8ABF\u8868\u793A\u3092\u7121\u52B9\u306B\u3059\u308B","\u307E\u304E\u3089\u308F\u3057\u3044\u6587\u5B57\u306E\u5F37\u8ABF\u8868\u793A\u3092\u7121\u52B9\u306B\u3059\u308B","\u4E0D\u53EF\u8996\u6587\u5B57\u306E\u5F37\u8ABF\u8868\u793A\u3092\u7121\u52B9\u306B\u3059\u308B","\u4E0D\u53EF\u8996\u306E\u6587\u5B57\u306E\u5F37\u8ABF\u8868\u793A\u3092\u7121\u52B9\u306B\u3059\u308B","\u975E ASCII \u6587\u5B57\u306E\u5F37\u8ABF\u8868\u793A\u3092\u7121\u52B9\u306B\u3059\u308B","\u57FA\u672C ASCII \u4EE5\u5916\u306E\u6587\u5B57\u306E\u5F37\u8ABF\u8868\u793A\u3092\u7121\u52B9\u306B\u3059\u308B","\u9664\u5916\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u8868\u793A","{0} (\u4E0D\u53EF\u8996\u306E\u6587\u5B57) \u3092\u5F37\u8ABF\u8868\u793A\u304B\u3089\u9664\u5916\u3059\u308B","\u5F37\u8ABF\u8868\u793A\u304B\u3089 {0} \u3092\u9664\u5916\u3057\u307E\u3059",'\u8A00\u8A9E "{0}" \u3067\u3088\u308A\u4E00\u822C\u7684\u306A Unicode \u6587\u5B57\u3092\u8A31\u53EF\u3057\u307E\u3059\u3002'],"vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators":["\u666E\u901A\u3067\u306F\u306A\u3044\u884C\u7D42\u7AEF\u8A18\u53F7","\u666E\u901A\u3067\u306F\u306A\u3044\u884C\u7D42\u7AEF\u8A18\u53F7\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F",`\u3053\u306E\u30D5\u30A1\u30A4\u30EB '{0}' \u306B\u306F\u3001\u884C\u533A\u5207\u308A\u6587\u5B57 (LS) \u3084\u6BB5\u843D\u533A\u5207\u308A\u8A18\u53F7 (PS) \u306A\u3069\u306E\u7279\u6B8A\u306A\u884C\u306E\u7D42\u7AEF\u6587\u5B57\u304C 1 \u3064\u4EE5\u4E0A\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\r
+\r
+\u305D\u308C\u3089\u3092\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u524A\u9664\u3059\u308B\u3053\u3068\u3092\u304A\u52E7\u3081\u3057\u307E\u3059\u3002\u3053\u308C\u306F 'editor.unusualLineTerminators' \u3092\u4F7F\u7528\u3057\u3066\u69CB\u6210\u3067\u304D\u307E\u3059\u3002`,"\u7279\u6B8A\u306A\u884C\u306E\u7D42\u7AEF\u8A18\u53F7\u3092\u524A\u9664\u3059\u308B(&&R)","\u7121\u8996\u3059\u308B"],"vs/editor/contrib/wordHighlighter/browser/highlightDecorations":["\u5909\u6570\u306E\u8AAD\u307F\u53D6\u308A\u306A\u3069\u3001\u8AAD\u307F\u53D6\u308A\u30A2\u30AF\u30BB\u30B9\u4E2D\u306E\u30B7\u30F3\u30DC\u30EB\u306E\u80CC\u666F\u8272\u3002\u4E0B\u306B\u3042\u308B\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u305F\u3081\u306B\u3001\u8272\u306F\u4E0D\u900F\u904E\u3067\u3042\u3063\u3066\u306F\u306A\u308A\u307E\u305B\u3093\u3002","\u5909\u6570\u3078\u306E\u66F8\u304D\u8FBC\u307F\u306A\u3069\u3001\u66F8\u304D\u8FBC\u307F\u30A2\u30AF\u30BB\u30B9\u4E2D\u306E\u30B7\u30F3\u30DC\u30EB\u80CC\u666F\u8272\u3002\u4E0B\u306B\u3042\u308B\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u305F\u3081\u306B\u3001\u8272\u306F\u4E0D\u900F\u904E\u3067\u3042\u3063\u3066\u306F\u306A\u308A\u307E\u305B\u3093\u3002","\u8A18\u53F7\u306E\u30C6\u30AD\u30B9\u30C8\u51FA\u73FE\u306E\u80CC\u666F\u8272\u3002\u57FA\u306B\u306A\u308B\u88C5\u98FE\u304C\u975E\u8868\u793A\u306A\u3089\u306A\u3044\u3088\u3046\u306B\u3001\u3053\u306E\u8272\u3092\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u5909\u6570\u306E\u8AAD\u307F\u53D6\u308A\u306A\u3069\u8AAD\u307F\u53D6\u308A\u30A2\u30AF\u30BB\u30B9\u4E2D\u306E\u30B7\u30F3\u30DC\u30EB\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u5909\u6570\u3078\u306E\u66F8\u304D\u8FBC\u307F\u306A\u3069\u66F8\u304D\u8FBC\u307F\u30A2\u30AF\u30BB\u30B9\u4E2D\u306E\u30B7\u30F3\u30DC\u30EB\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u8A18\u53F7\u306E\u30C6\u30AD\u30B9\u30C8\u51FA\u73FE\u7B87\u6240\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u30B7\u30F3\u30DC\u30EB\u306B\u3088\u3063\u3066\u5F37\u8ABF\u8868\u793A\u3055\u308C\u308B\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002\u30DE\u30FC\u30AB\u30FC\u306E\u8272\u306F\u3001\u57FA\u306B\u306A\u308B\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u3088\u3046\u306B\u4E0D\u900F\u660E\u4EE5\u5916\u306B\u3057\u307E\u3059\u3002","\u66F8\u304D\u8FBC\u307F\u30A2\u30AF\u30BB\u30B9 \u30B7\u30F3\u30DC\u30EB\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002\u4E0B\u306B\u3042\u308B\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u305F\u3081\u306B\u3001\u8272\u306F\u4E0D\u900F\u904E\u3067\u3042\u3063\u3066\u306F\u306A\u308A\u307E\u305B\u3093\u3002","\u8A18\u53F7\u306E\u30C6\u30AD\u30B9\u30C8\u51FA\u73FE\u306E\u6982\u8981\u30EB\u30FC\u30EB \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002\u57FA\u306B\u306A\u308B\u88C5\u98FE\u304C\u975E\u8868\u793A\u306A\u3089\u306A\u3044\u3088\u3046\u306B\u3001\u3053\u306E\u8272\u3092\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002"],"vs/editor/contrib/wordHighlighter/browser/wordHighlighter":["\u6B21\u306E\u30B7\u30F3\u30DC\u30EB \u30CF\u30A4\u30E9\u30A4\u30C8\u306B\u79FB\u52D5","\u524D\u306E\u30B7\u30F3\u30DC\u30EB \u30CF\u30A4\u30E9\u30A4\u30C8\u306B\u79FB\u52D5","\u30B7\u30F3\u30DC\u30EB \u30CF\u30A4\u30E9\u30A4\u30C8\u3092\u30C8\u30EA\u30AC\u30FC"],"vs/editor/contrib/wordOperations/browser/wordOperations":["\u5358\u8A9E\u306E\u524A\u9664"],"vs/platform/action/common/actionCommonCategories":["\u958B\u767A\u8005","\u8868\u793A","\u30D8\u30EB\u30D7","\u30C6\u30B9\u30C8","\u30D5\u30A1\u30A4\u30EB","\u57FA\u672C\u8A2D\u5B9A"],"vs/platform/actionWidget/browser/actionList":["{0} \u3067\u9069\u7528\u3059\u308B\u3001{1} \u3067\u30D7\u30EC\u30D3\u30E5\u30FC\u3059\u308B","\u9069\u7528\u3059\u308B\u306B\u306F {0}","{0}\u3001\u7121\u52B9\u306B\u306A\u3063\u305F\u7406\u7531: {1}","\u30A2\u30AF\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8"],"vs/platform/actionWidget/browser/actionWidget":["\u30A2\u30AF\u30B7\u30E7\u30F3 \u30D0\u30FC\u306E\u5207\u308A\u66FF\u3048\u6E08\u307F\u30A2\u30AF\u30B7\u30E7\u30F3\u9805\u76EE\u306E\u80CC\u666F\u8272\u3002","\u30A2\u30AF\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u4E00\u89A7\u304C\u8868\u793A\u3055\u308C\u308B\u304B\u3069\u3046\u304B","\u30A2\u30AF\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3092\u975E\u8868\u793A\u306B\u3059\u308B","\u524D\u306E\u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u9078\u629E","\u6B21\u306E\u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u9078\u629E","\u9078\u629E\u3057\u305F\u64CD\u4F5C\u3092\u627F\u8AFE","\u9078\u629E\u3057\u305F\u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u30D7\u30EC\u30D3\u30E5\u30FC"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})","{0} ({1})",`{0}\r
+[{1}] {2}`],"vs/platform/actions/browser/toolbar":["\u975E\u8868\u793A","\u30E1\u30CB\u30E5\u30FC\u306E\u30EA\u30BB\u30C3\u30C8"],"vs/platform/actions/common/menuService":["'{0}' \u306E\u975E\u8868\u793A"],"vs/platform/audioCues/browser/audioCueService":["\u884C\u306E\u30A8\u30E9\u30FC","\u30A8\u30E9\u30FC","\u884C\u306E\u8B66\u544A","\u8B66\u544A","\u884C\u306E\u6298\u308A\u305F\u305F\u307E\u308C\u305F\u9762","\u6298\u308A\u305F\u305F\u307F\u6E08\u307F","\u884C\u306E\u30D6\u30EC\u30FC\u30AF\u30DD\u30A4\u30F3\u30C8","\u30D6\u30EC\u30FC\u30AF\u30DD\u30A4\u30F3\u30C8","\u884C\u306E\u30A4\u30F3\u30E9\u30A4\u30F3\u5019\u88DC","\u30BF\u30FC\u30DF\u30CA\u30EB \u30AF\u30A4\u30C3\u30AF\u4FEE\u6B63","\u30AF\u30A4\u30C3\u30AF\u4FEE\u6B63","\u30D6\u30EC\u30FC\u30AF\u30DD\u30A4\u30F3\u30C8\u3067\u30C7\u30D0\u30C3\u30AC\u30FC\u304C\u505C\u6B62\u3057\u307E\u3057\u305F","\u30D6\u30EC\u30FC\u30AF\u30DD\u30A4\u30F3\u30C8","\u884C\u306B\u30A4\u30F3\u30EC\u30A4 \u30D2\u30F3\u30C8\u304C\u3042\u308A\u307E\u305B\u3093","\u30A4\u30F3\u30EC\u30A4 \u30D2\u30F3\u30C8\u304C\u3042\u308A\u307E\u305B\u3093","\u30BF\u30B9\u30AF\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F","\u30BF\u30B9\u30AF\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F","\u30BF\u30B9\u30AF\u304C\u5931\u6557\u3057\u307E\u3057\u305F","\u30BF\u30B9\u30AF\u304C\u5931\u6557\u3057\u307E\u3057\u305F","\u30BF\u30FC\u30DF\u30CA\u30EB \u30B3\u30DE\u30F3\u30C9\u304C\u5931\u6557\u3057\u307E\u3057\u305F","\u30B3\u30DE\u30F3\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F","\u30BF\u30FC\u30DF\u30CA\u30EB \u30D9\u30EB","\u30BF\u30FC\u30DF\u30CA\u30EB \u30D9\u30EB","\u30CE\u30FC\u30C8\u30D6\u30C3\u30AF \u30BB\u30EB\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F","\u30CE\u30FC\u30C8\u30D6\u30C3\u30AF \u30BB\u30EB\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F","\u30CE\u30FC\u30C8\u30D6\u30C3\u30AF \u30BB\u30EB\u304C\u5931\u6557\u3057\u307E\u3057\u305F","\u30CE\u30FC\u30C8\u30D6\u30C3\u30AF \u30BB\u30EB\u304C\u5931\u6557\u3057\u307E\u3057\u305F","\u5DEE\u5206\u884C\u304C\u633F\u5165\u3055\u308C\u307E\u3057\u305F","\u5DEE\u5206\u884C\u304C\u524A\u9664\u3055\u308C\u307E\u3057\u305F","\u5909\u66F4\u3055\u308C\u305F\u5DEE\u5206\u884C","\u30C1\u30E3\u30C3\u30C8\u8981\u6C42\u304C\u9001\u4FE1\u3055\u308C\u307E\u3057\u305F","\u30C1\u30E3\u30C3\u30C8\u8981\u6C42\u304C\u9001\u4FE1\u3055\u308C\u307E\u3057\u305F","\u30C1\u30E3\u30C3\u30C8\u5FDC\u7B54\u3092\u53D7\u4FE1\u3057\u307E\u3057\u305F","\u30C1\u30E3\u30C3\u30C8\u306E\u5FDC\u7B54\u3092\u4FDD\u7559\u4E2D","\u30C1\u30E3\u30C3\u30C8\u306E\u5FDC\u7B54\u3092\u4FDD\u7559\u4E2D","\u30AF\u30EA\u30A2","\u30AF\u30EA\u30A2","\u4FDD\u5B58","\u4FDD\u5B58","\u5F62\u5F0F","\u5F62\u5F0F"],"vs/platform/configuration/common/configurationRegistry":["\u65E2\u5B9A\u306E\u8A00\u8A9E\u69CB\u6210\u306E\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9","{0} \u8A00\u8A9E\u304C\u512A\u5148\u3055\u308C\u308B\u8A2D\u5B9A\u3092\u69CB\u6210\u3057\u307E\u3059\u3002","\u8A00\u8A9E\u306B\u5BFE\u3057\u3066\u4E0A\u66F8\u304D\u3055\u308C\u308B\u30A8\u30C7\u30A3\u30BF\u30FC\u8A2D\u5B9A\u3092\u69CB\u6210\u3057\u307E\u3059\u3002","\u3053\u306E\u8A2D\u5B9A\u3067\u306F\u3001\u8A00\u8A9E\u3054\u3068\u306E\u69CB\u6210\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002","\u8A00\u8A9E\u306B\u5BFE\u3057\u3066\u4E0A\u66F8\u304D\u3055\u308C\u308B\u30A8\u30C7\u30A3\u30BF\u30FC\u8A2D\u5B9A\u3092\u69CB\u6210\u3057\u307E\u3059\u3002","\u3053\u306E\u8A2D\u5B9A\u3067\u306F\u3001\u8A00\u8A9E\u3054\u3068\u306E\u69CB\u6210\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002","\u7A7A\u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u306F\u767B\u9332\u3067\u304D\u307E\u305B\u3093","'{0}' \u3092\u767B\u9332\u3067\u304D\u307E\u305B\u3093\u3002\u3053\u308C\u306F\u3001\u8A00\u8A9E\u56FA\u6709\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u8A2D\u5B9A\u3092\u8A18\u8FF0\u3059\u308B\u30D7\u30ED\u30D1\u30C6\u30A3 \u30D1\u30BF\u30FC\u30F3 '\\\\[.*\\\\]$' \u306B\u4E00\u81F4\u3057\u3066\u3044\u307E\u3059\u3002'configurationDefaults' \u30B3\u30F3\u30C8\u30EA\u30D3\u30E5\u30FC\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","'{0}' \u3092\u767B\u9332\u3067\u304D\u307E\u305B\u3093\u3002\u3053\u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u306F\u65E2\u306B\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u3059\u3002","'{0}' \u3092\u767B\u9332\u3067\u304D\u307E\u305B\u3093\u3002\u95A2\u9023\u4ED8\u3051\u3089\u308C\u305F\u30DD\u30EA\u30B7\u30FC {1} \u306F\u65E2\u306B {2} \u306B\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u3059\u3002"],"vs/platform/contextkey/browser/contextKeyService":["\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8 \u30AD\u30FC\u306B\u95A2\u3059\u308B\u60C5\u5831\u3092\u8FD4\u3059\u30B3\u30DE\u30F3\u30C9"],"vs/platform/contextkey/common/contextkey":["\u7A7A\u306E\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8 \u30AD\u30FC\u5F0F","\u5F0F\u3092\u66F8\u304D\u5FD8\u308C\u307E\u3057\u305F\u304B? 'false' \u307E\u305F\u306F 'true' \u3092\u6307\u5B9A\u3059\u308B\u3068\u3001\u305D\u308C\u305E\u308C\u5E38\u306B false \u307E\u305F\u306F true \u3068\u8A55\u4FA1\u3067\u304D\u307E\u3059\u3002","'not' \u306E\u5F8C\u306B 'in' \u304C\u3042\u308A\u307E\u3059\u3002","\u7D42\u308F\u308A\u304B\u3063\u3053 ')'","\u4E88\u671F\u3057\u306A\u3044\u30C8\u30FC\u30AF\u30F3","\u30C8\u30FC\u30AF\u30F3\u306E\u524D\u306B && \u307E\u305F\u306F || \u3092\u6307\u5B9A\u3057\u5FD8\u308C\u307E\u3057\u305F\u304B?","\u4E88\u671F\u3057\u306A\u3044\u5F0F\u306E\u7D42\u308F\u308A","\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8 \u30AD\u30FC\u3092\u6307\u5B9A\u3057\u5FD8\u308C\u307E\u3057\u305F\u304B?",`\u671F\u5F85\u5024: {0}\r
+\u53D7\u53D6\u6E08\u307F: '{1}'\u3002`],"vs/platform/contextkey/common/contextkeys":["\u30AA\u30DA\u30EC\u30FC\u30C6\u30A3\u30F3\u30B0 \u30B7\u30B9\u30C6\u30E0\u304C macOS \u3067\u3042\u308B\u304B\u3069\u3046\u304B","\u30AA\u30DA\u30EC\u30FC\u30C6\u30A3\u30F3\u30B0 \u30B7\u30B9\u30C6\u30E0\u304C Linux \u3067\u3042\u308B\u304B\u3069\u3046\u304B","\u30AA\u30DA\u30EC\u30FC\u30C6\u30A3\u30F3\u30B0 \u30B7\u30B9\u30C6\u30E0\u304C Windows \u3067\u3042\u308B\u304B\u3069\u3046\u304B","\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u304C Web \u30D6\u30E9\u30A6\u30B6\u30FC\u3067\u3042\u308B\u304B\u3069\u3046\u304B","\u30AA\u30DA\u30EC\u30FC\u30C6\u30A3\u30F3\u30B0 \u30B7\u30B9\u30C6\u30E0\u304C\u975E\u30D6\u30E9\u30A6\u30B6\u30FC \u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u4E0A\u306E macOS \u3067\u3042\u308B\u304B\u3069\u3046\u304B","\u30AA\u30DA\u30EC\u30FC\u30C6\u30A3\u30F3\u30B0 \u30B7\u30B9\u30C6\u30E0\u304C iOS \u3067\u3042\u308B\u304B\u3069\u3046\u304B","\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u304C\u30E2\u30D0\u30A4\u30EB Web \u30D6\u30E9\u30A6\u30B6\u30FC\u3067\u3042\u308B\u304B\u3069\u3046\u304B","VS Code \u306E\u54C1\u8CEA\u306E\u7A2E\u985E","\u30AD\u30FC\u30DC\u30FC\u30C9\u306E\u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u5165\u529B\u30DC\u30C3\u30AF\u30B9\u5185\u306B\u3042\u308B\u304B\u3069\u3046\u304B"],"vs/platform/contextkey/common/scanner":["{0} \u3092\u610F\u56F3\u3057\u3066\u3044\u307E\u3057\u305F\u304B?","{0} \u307E\u305F\u306F {1} \u3092\u610F\u56F3\u3057\u3066\u3044\u307E\u3057\u305F\u304B?","{0}\u3001{1}\u3001\u307E\u305F\u306F {2} \u3092\u610F\u56F3\u3057\u3066\u3044\u307E\u3057\u305F\u304B?","\u898B\u7A4D\u3082\u308A\u3092\u958B\u3044\u305F\u308A\u9589\u3058\u305F\u308A\u3057\u5FD8\u308C\u307E\u3057\u305F\u304B?","'/' (\u30B9\u30E9\u30C3\u30B7\u30E5) \u6587\u5B57\u3092\u30A8\u30B9\u30B1\u30FC\u30D7\u3057\u5FD8\u308C\u307E\u3057\u305F\u304B? \u30A8\u30B9\u30B1\u30FC\u30D7\u3059\u308B\u524D\u306B '\\\\/' \u306A\u3069\u306E 2 \u3064\u306E\u5186\u8A18\u53F7\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002"],"vs/platform/history/browser/contextScopedHistoryWidget":["\u5019\u88DC\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B"],"vs/platform/keybinding/common/abstractKeybindingService":["({0}) \u304C\u6E21\u3055\u308C\u307E\u3057\u305F\u30022 \u756A\u76EE\u306E\u30AD\u30FC\u3092\u5F85\u3063\u3066\u3044\u307E\u3059...","({0}) \u304C\u6E21\u3055\u308C\u307E\u3057\u305F\u3002\u6B21\u306E\u30AD\u30FC\u3092\u5F85\u3063\u3066\u3044\u307E\u3059...","\u30AD\u30FC\u306E\u7D44\u307F\u5408\u308F\u305B ({0}\u3001{1}) \u306F\u30B3\u30DE\u30F3\u30C9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u30AD\u30FC\u306E\u7D44\u307F\u5408\u308F\u305B ({0}\u3001{1}) \u306F\u30B3\u30DE\u30F3\u30C9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002"],"vs/platform/list/browser/listService":["\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1","Windows \u304A\u3088\u3073 Linux \u4E0A\u306E `Control` \u30AD\u30FC\u3068 macOS \u4E0A\u306E `Command` \u30AD\u30FC\u306B\u5272\u308A\u5F53\u3066\u307E\u3059\u3002","Windows \u304A\u3088\u3073 Linux \u4E0A\u306E `Alt` \u30AD\u30FC\u3068 macOS \u4E0A\u306E `Option` \u30AD\u30FC\u306B\u5272\u308A\u5F53\u3066\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u3092\u4F7F\u7528\u3057\u3066\u9805\u76EE\u3092\u8907\u6570\u9078\u629E\u3059\u308B\u3068\u304D\u306B\u4F7F\u7528\u3059\u308B\u4FEE\u98FE\u30AD\u30FC\u3067\u3059 (\u305F\u3068\u3048\u3070\u3001\u30A8\u30AF\u30B9\u30D7\u30ED\u30FC\u30E9\u30FC\u3067\u30A8\u30C7\u30A3\u30BF\u30FC\u3068 scm \u30D3\u30E5\u30FC\u3092\u958B\u304F\u306A\u3069)\u3002'\u6A2A\u306B\u4E26\u3079\u3066\u958B\u304F' \u30DE\u30A6\u30B9 \u30B8\u30A7\u30B9\u30C1\u30E3\u30FC (\u304C\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u308B\u5834\u5408) \u306F\u3001\u8907\u6570\u9078\u629E\u306E\u4FEE\u98FE\u30AD\u30FC\u3068\u7AF6\u5408\u3057\u306A\u3044\u3088\u3046\u306B\u8ABF\u6574\u3055\u308C\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u3092\u4F7F\u7528\u3057\u3066\u3001\u30C4\u30EA\u30FC\u3068\u30EA\u30B9\u30C8\u5185\u306E\u9805\u76EE\u3092\u958B\u304F\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059 (\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u308B\u5834\u5408)\u3002\u9069\u7528\u3067\u304D\u306A\u3044\u5834\u5408\u3001\u4E00\u90E8\u306E\u30C4\u30EA\u30FC\u3084\u30EA\u30B9\u30C8\u3067\u306F\u3053\u306E\u8A2D\u5B9A\u304C\u7121\u8996\u3055\u308C\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002","\u30EA\u30B9\u30C8\u3068\u30C4\u30EA\u30FC\u304C\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1\u3067\u6C34\u5E73\u30B9\u30AF\u30ED\u30FC\u30EB\u3092\u30B5\u30DD\u30FC\u30C8\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u8B66\u544A: \u3053\u306E\u8A2D\u5B9A\u3092\u30AA\u30F3\u306B\u3059\u308B\u3068\u3001\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u306B\u5F71\u97FF\u304C\u3042\u308A\u307E\u3059\u3002","\u30B9\u30AF\u30ED\u30FC\u30EB\u30D0\u30FC\u306E\u30AF\u30EA\u30C3\u30AF\u3067\u30DA\u30FC\u30B8\u3054\u3068\u306B\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30C4\u30EA\u30FC\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u30D4\u30AF\u30BB\u30EB\u5358\u4F4D\u3067\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30C4\u30EA\u30FC\u3067\u30A4\u30F3\u30C7\u30F3\u30C8\u306E\u30AC\u30A4\u30C9\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30EA\u30B9\u30C8\u3068\u30C4\u30EA\u30FC\u3067\u30B9\u30E0\u30FC\u30BA \u30B9\u30AF\u30ED\u30FC\u30EB\u3092\u4F7F\u7528\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DE\u30A6\u30B9 \u30DB\u30A4\u30FC\u30EB \u30B9\u30AF\u30ED\u30FC\u30EB \u30A4\u30D9\u30F3\u30C8\u306E `deltaX` \u3068 `deltaY` \u3067\u4F7F\u7528\u3055\u308C\u308B\u4E57\u6570\u3002","`Alt` \u3092\u62BC\u3059\u3068\u3001\u30B9\u30AF\u30ED\u30FC\u30EB\u901F\u5EA6\u304C\u500D\u5897\u3057\u307E\u3059\u3002","\u691C\u7D22\u6642\u306B\u8981\u7D20\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002\u3055\u3089\u306B\u4E0A\u4E0B\u306E\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u3067\u306F\u3001\u5F37\u8ABF\u8868\u793A\u3055\u308C\u305F\u8981\u7D20\u306E\u307F\u304C\u30B9\u30AD\u30E3\u30F3\u3055\u308C\u307E\u3059\u3002","\u691C\u7D22\u6642\u306B\u8981\u7D20\u3092\u30D5\u30A3\u30EB\u30BF\u30FC\u51E6\u7406\u3057\u307E\u3059\u3002","\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1\u306E\u30EA\u30B9\u30C8\u3068\u30C4\u30EA\u30FC\u306E\u65E2\u5B9A\u306E\u691C\u7D22\u30E2\u30FC\u30C9\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u7C21\u5358\u306A\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u306F\u3001\u30AD\u30FC\u30DC\u30FC\u30C9\u5165\u529B\u306B\u4E00\u81F4\u3059\u308B\u8981\u7D20\u306B\u7126\u70B9\u3092\u5F53\u3066\u307E\u3059\u3002\u4E00\u81F4\u51E6\u7406\u306F\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u3067\u306E\u307F\u5B9F\u884C\u3055\u308C\u307E\u3059\u3002","\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u306E\u5F37\u8ABF\u8868\u793A\u3092\u4F7F\u7528\u3059\u308B\u3068\u3001\u30AD\u30FC\u30DC\u30FC\u30C9\u5165\u529B\u306B\u4E00\u81F4\u3059\u308B\u8981\u7D20\u304C\u5F37\u8ABF\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u4E0A\u304A\u3088\u3073\u4E0B\u3078\u306E\u79FB\u52D5\u306F\u3001\u5F37\u8ABF\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u8981\u7D20\u306E\u307F\u3092\u79FB\u52D5\u3057\u307E\u3059\u3002","\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u3067\u306F\u3001\u30AD\u30FC\u30DC\u30FC\u30C9\u5165\u529B\u306B\u4E00\u81F4\u3057\u306A\u3044\u3059\u3079\u3066\u306E\u8981\u7D20\u304C\u30D5\u30A3\u30EB\u30BF\u30FC\u51E6\u7406\u3055\u308C\u3001\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002","\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1\u306E\u30EA\u30B9\u30C8\u304A\u3088\u3073\u30C4\u30EA\u30FC\u306E\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30B9\u30BF\u30A4\u30EB\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u5358\u7D14\u3001\u5F37\u8ABF\u8868\u793A\u3001\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u6307\u5B9A\u3067\u304D\u307E\u3059\u3002","\u4EE3\u308F\u308A\u306B 'workbench.list.defaultFindMode' \u3068 'workbench.list.typeNavigationMode' \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u691C\u7D22\u6642\u306B\u3042\u3044\u307E\u3044\u4E00\u81F4\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u691C\u7D22\u6642\u306B\u9023\u7D9A\u4E00\u81F4\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1\u3067\u30EA\u30B9\u30C8\u3068\u30C4\u30EA\u30FC\u3092\u691C\u7D22\u3059\u308B\u3068\u304D\u306B\u4F7F\u7528\u3055\u308C\u308B\u4E00\u81F4\u306E\u7A2E\u985E\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D5\u30A9\u30EB\u30C0\u30FC\u540D\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u305F\u3068\u304D\u306B\u30C4\u30EA\u30FC \u30D5\u30A9\u30EB\u30C0\u30FC\u304C\u5C55\u958B\u3055\u308C\u308B\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u9069\u7528\u3067\u304D\u306A\u3044\u5834\u5408\u3001\u4E00\u90E8\u306E\u30C4\u30EA\u30FC\u3084\u30EA\u30B9\u30C8\u3067\u306F\u3053\u306E\u8A2D\u5B9A\u304C\u7121\u8996\u3055\u308C\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002","\u30C4\u30EA\u30FC\u3067\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u3092\u6709\u52B9\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","'#workbench.tree.enableStickyScroll#' \u304C\u6709\u52B9\u306A\u5834\u5408\u306B\u3001\u30C4\u30EA\u30FC\u306B\u8868\u793A\u3055\u308C\u308B\u56FA\u5B9A\u8981\u7D20\u306E\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1\u306E\u30EA\u30B9\u30C8\u3068\u30C4\u30EA\u30FC\u3067\u578B\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u304C\u3069\u306E\u3088\u3046\u306B\u6A5F\u80FD\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002`trigger` \u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001`list.triggerTypeNavigation` \u30B3\u30DE\u30F3\u30C9\u306E\u5B9F\u884C\u5F8C\u306B\u578B\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u304C\u958B\u59CB\u3055\u308C\u307E\u3059\u3002"],"vs/platform/markers/common/markers":["\u30A8\u30E9\u30FC","\u8B66\u544A","\u60C5\u5831"],"vs/platform/quickinput/browser/commandsQuickAccess":["\u6700\u8FD1\u4F7F\u7528\u3057\u305F\u3082\u306E","\u540C\u69D8\u306E\u30B3\u30DE\u30F3\u30C9","\u3088\u304F\u4F7F\u7528\u3059\u308B\u3082\u306E","\u305D\u306E\u4ED6\u306E\u30B3\u30DE\u30F3\u30C9","\u540C\u69D8\u306E\u30B3\u30DE\u30F3\u30C9","{0}, {1}","\u30B3\u30DE\u30F3\u30C9 '{0}' \u3067\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"],"vs/platform/quickinput/browser/helpQuickAccess":["{0}, {1}"],"vs/platform/quickinput/browser/quickInput":["\u623B\u308B","'Enter' \u3092\u62BC\u3057\u3066\u5165\u529B\u3092\u78BA\u8A8D\u3059\u308B\u304B 'Escape' \u3092\u62BC\u3057\u3066\u53D6\u308A\u6D88\u3057\u307E\u3059","{0}/{1}","\u5165\u529B\u3059\u308B\u3068\u7D50\u679C\u304C\u7D5E\u308A\u8FBC\u307E\u308C\u307E\u3059\u3002"],"vs/platform/quickinput/browser/quickInputController":["\u3059\u3079\u3066\u306E\u30C1\u30A7\u30C3\u30AF \u30DC\u30C3\u30AF\u30B9\u3092\u5207\u308A\u66FF\u3048\u308B","{0} \u4EF6\u306E\u7D50\u679C","{0} \u500B\u9078\u629E\u6E08\u307F","OK","\u30AB\u30B9\u30BF\u30E0","\u623B\u308B ({0})","\u623B\u308B"],"vs/platform/quickinput/browser/quickInputList":["\u30AF\u30A4\u30C3\u30AF\u5165\u529B"],"vs/platform/quickinput/browser/quickInputUtils":["\u30AF\u30EA\u30C3\u30AF\u3057\u3066 '{0}' \u30B3\u30DE\u30F3\u30C9\u3092\u5B9F\u884C"],"vs/platform/theme/common/colorRegistry":["\u5168\u4F53\u306E\u524D\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306B\u3088\u3063\u3066\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u306B\u306E\u307F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u7121\u52B9\u306A\u8981\u7D20\u306E\u5168\u4F53\u7684\u306A\u524D\u666F\u3002\u3053\u306E\u8272\u306F\u3001\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306B\u3088\u3063\u3066\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3055\u308C\u306A\u3044\u5834\u5408\u306B\u306E\u307F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A8\u30E9\u30FC \u30E1\u30C3\u30BB\u30FC\u30B8\u5168\u4F53\u306E\u524D\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306B\u3088\u3063\u3066\u4E0A\u66F8\u304D\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u306B\u306E\u307F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u8FFD\u52A0\u60C5\u5831\u3092\u63D0\u4F9B\u3059\u308B\u8AAC\u660E\u6587\u306E\u524D\u666F\u8272\u3001\u4F8B:\u30E9\u30D9\u30EB\u3002","\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1\u306E\u30A2\u30A4\u30B3\u30F3\u306E\u65E2\u5B9A\u306E\u8272\u3002","\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u8981\u7D20\u306E\u5883\u754C\u7DDA\u5168\u4F53\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306B\u3088\u3063\u3066\u4E0A\u66F8\u304D\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u306B\u306E\u307F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30B3\u30F3\u30C8\u30E9\u30B9\u30C8\u3092\u5F37\u3081\u308B\u305F\u3081\u306B\u3001\u4ED6\u306E\u8981\u7D20\u3068\u9694\u3066\u308B\u8FFD\u52A0\u306E\u5883\u754C\u7DDA\u3002","\u30B3\u30F3\u30C8\u30E9\u30B9\u30C8\u3092\u5F37\u3081\u308B\u305F\u3081\u306B\u3001\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u4ED6\u8981\u7D20\u3068\u9694\u3066\u308B\u8FFD\u52A0\u306E\u5883\u754C\u7DDA\u3002","\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1\u5185\u306E\u30C6\u30AD\u30B9\u30C8\u9078\u629E\u306E\u80CC\u666F\u8272 (\u4F8B: \u5165\u529B\u30D5\u30A3\u30FC\u30EB\u30C9\u3084\u30C6\u30AD\u30B9\u30C8\u30A8\u30EA\u30A2)\u3002\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u9078\u629E\u306B\u306F\u9069\u7528\u3055\u308C\u306A\u3044\u3053\u3068\u306B\u6CE8\u610F\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30C6\u30AD\u30B9\u30C8\u306E\u533A\u5207\u308A\u6587\u5B57\u306E\u8272\u3002","\u30C6\u30AD\u30B9\u30C8\u5185\u306E\u30EA\u30F3\u30AF\u306E\u524D\u666F\u8272\u3002","\u30AF\u30EA\u30C3\u30AF\u3055\u308C\u305F\u3068\u304D\u3068\u30DE\u30A6\u30B9\u3092\u30DB\u30D0\u30FC\u3057\u305F\u3068\u304D\u306E\u30C6\u30AD\u30B9\u30C8\u5185\u306E\u30EA\u30F3\u30AF\u306E\u524D\u666F\u8272\u3002","\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u6E08\u307F\u30C6\u30AD\u30B9\u30C8 \u30BB\u30B0\u30E1\u30F3\u30C8\u306E\u524D\u666F\u8272\u3002","\u66F8\u5F0F\u8A2D\u5B9A\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8 \u30BB\u30B0\u30E1\u30F3\u30C8\u306E\u80CC\u666F\u8272\u3002","\u30C6\u30AD\u30B9\u30C8\u5185\u306E\u30D6\u30ED\u30C3\u30AF\u5F15\u7528\u306E\u80CC\u666F\u8272\u3002","\u30C6\u30AD\u30B9\u30C8\u5185\u306E\u30D6\u30ED\u30C3\u30AF\u5F15\u7528\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30C6\u30AD\u30B9\u30C8\u5185\u306E\u30B3\u30FC\u30C9 \u30D6\u30ED\u30C3\u30AF\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u691C\u7D22/\u7F6E\u63DB\u7A93\u306A\u3069\u3001\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u5F71\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u691C\u7D22/\u7F6E\u63DB\u7A93\u306A\u3069\u3001\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u5165\u529B\u30DC\u30C3\u30AF\u30B9\u306E\u80CC\u666F\u3002","\u5165\u529B\u30DC\u30C3\u30AF\u30B9\u306E\u524D\u666F\u3002","\u5165\u529B\u30DC\u30C3\u30AF\u30B9\u306E\u5883\u754C\u7DDA\u3002","\u5165\u529B\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u30A2\u30AF\u30C6\u30A3\u30D6 \u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u5165\u529B\u30D5\u30A3\u30FC\u30EB\u30C9\u3067\u30A2\u30AF\u30C6\u30A3\u30D6\u5316\u3055\u308C\u305F\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u80CC\u666F\u8272\u3002","\u5165\u529B\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u80CC\u666F\u306E\u30DB\u30D0\u30FC\u8272\u3002","\u5165\u529B\u30D5\u30A3\u30FC\u30EB\u30C9\u3067\u30A2\u30AF\u30C6\u30A3\u30D6\u5316\u3055\u308C\u305F\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u524D\u666F\u8272\u3002","\u5165\u529B\u30DC\u30C3\u30AF\u30B9\u306E\u30D7\u30EC\u30FC\u30B9\u30DB\u30EB\u30C0\u30FC \u30C6\u30AD\u30B9\u30C8\u306E\u524D\u666F\u8272\u3002","\u60C5\u5831\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u80CC\u666F\u8272\u3002","\u60C5\u5831\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u524D\u666F\u8272\u3002","\u60C5\u5831\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u5883\u754C\u7DDA\u8272\u3002","\u8B66\u544A\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u80CC\u666F\u8272\u3002","\u8B66\u544A\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u524D\u666F\u8272\u3002","\u8B66\u544A\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30A8\u30E9\u30FC\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30E9\u30FC\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u524D\u666F\u8272\u3002","\u30A8\u30E9\u30FC\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u306E\u80CC\u666F\u3002","\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3 \u30EA\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002","\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u306E\u524D\u666F\u3002","\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u306E\u5883\u754C\u7DDA\u3002","\u30DC\u30BF\u30F3\u306E\u524D\u666F\u8272\u3002","\u30DC\u30BF\u30F3\u306E\u533A\u5207\u308A\u8A18\u53F7\u306E\u8272\u3002","\u30DC\u30BF\u30F3\u306E\u80CC\u666F\u8272\u3002","\u30DB\u30D0\u30FC\u6642\u306E\u30DC\u30BF\u30F3\u80CC\u666F\u8272\u3002","\u30DC\u30BF\u30F3\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u30DC\u30BF\u30F3\u306E 2 \u6B21\u7684\u306A\u524D\u666F\u8272\u3002","\u30DC\u30BF\u30F3\u306E 2 \u6B21\u7684\u306A\u80CC\u666F\u8272\u3002","\u30DB\u30D0\u30FC\u6642\u306E\u30DC\u30BF\u30F3\u306E 2 \u6B21\u7684\u306A\u80CC\u666F\u8272\u3002","\u30D0\u30C3\u30B8\u306E\u80CC\u666F\u8272\u3002\u30D0\u30C3\u30B8\u3068\u306F\u5C0F\u3055\u306A\u60C5\u5831\u30E9\u30D9\u30EB\u306E\u3053\u3068\u3067\u3059\u3002\u4F8B:\u691C\u7D22\u7D50\u679C\u306E\u6570","\u30D0\u30C3\u30B8\u306E\u524D\u666F\u8272\u3002\u30D0\u30C3\u30B8\u3068\u306F\u5C0F\u3055\u306A\u60C5\u5831\u30E9\u30D9\u30EB\u306E\u3053\u3068\u3067\u3059\u3002\u4F8B:\u691C\u7D22\u7D50\u679C\u306E\u6570","\u30D3\u30E5\u30FC\u304C\u30B9\u30AF\u30ED\u30FC\u30EB\u3055\u308C\u305F\u3053\u3068\u3092\u793A\u3059\u30B9\u30AF\u30ED\u30FC\u30EB \u30D0\u30FC\u306E\u5F71\u3002","\u30B9\u30AF\u30ED\u30FC\u30EB \u30D0\u30FC\u306E\u30B9\u30E9\u30A4\u30C0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30DB\u30D0\u30FC\u6642\u306E\u30B9\u30AF\u30ED\u30FC\u30EB \u30D0\u30FC \u30B9\u30E9\u30A4\u30C0\u30FC\u80CC\u666F\u8272\u3002","\u30AF\u30EA\u30C3\u30AF\u6642\u306E\u30B9\u30AF\u30ED\u30FC\u30EB \u30D0\u30FC \u30B9\u30E9\u30A4\u30C0\u30FC\u80CC\u666F\u8272\u3002","\u6642\u9593\u306E\u304B\u304B\u308B\u64CD\u4F5C\u3067\u8868\u793A\u3059\u308B\u30D7\u30ED\u30B0\u30EC\u30B9 \u30D0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u30A8\u30E9\u30FC \u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A8\u30E9\u30FC\u3092\u793A\u3059\u6CE2\u7DDA\u306E\u524D\u666F\u8272\u3002","\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u30A8\u30E9\u30FC\u306E\u4E8C\u91CD\u4E0B\u7DDA\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u8B66\u544A\u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u8B66\u544A\u3092\u793A\u3059\u6CE2\u7DDA\u306E\u524D\u666F\u8272\u3002","\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u8B66\u544A\u306E\u4E8C\u91CD\u4E0B\u7DDA\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u60C5\u5831\u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u60C5\u5831\u3092\u793A\u3059\u6CE2\u7DDA\u306E\u524D\u666F\u8272\u3002","\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u60C5\u5831\u306E\u4E8C\u91CD\u4E0B\u7DDA\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30D2\u30F3\u30C8\u3092\u793A\u3059\u6CE2\u7DDA\u306E\u524D\u666F\u8272\u3002","\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u30D2\u30F3\u30C8\u306E\u4E8C\u91CD\u4E0B\u7DDA\u306E\u8272\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u67A0\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u65E2\u5B9A\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306E\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u306E\u80CC\u666F\u8272","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306E\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u306E\u30DB\u30D0\u30FC\u6642\u306E\u80CC\u666F\u8272","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u3067\u306E\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u306E\u5883\u754C\u7DDA\u306E\u8272"," \u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u3067\u306E\u56FA\u5B9A\u30B9\u30AF\u30ED\u30FC\u30EB\u306E\u5F71\u306E\u8272","\u691C\u7D22/\u7F6E\u63DB\u7A93\u306A\u3069\u3001\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u80CC\u666F\u8272\u3002","\u691C\u7D22/\u7F6E\u63DB\u306A\u3069\u3092\u884C\u3046\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u5883\u754C\u7DDA\u8272\u3002\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u5883\u754C\u7DDA\u304C\u3042\u308A\u3001\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u3088\u3063\u3066\u914D\u8272\u3092\u4E0A\u66F8\u304D\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u3067\u306E\u307F\u3053\u306E\u914D\u8272\u306F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30B5\u30A4\u30BA\u5909\u66F4\u30D0\u30FC\u306E\u5883\u754C\u7DDA\u8272\u3002\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u30B5\u30A4\u30BA\u5909\u66F4\u306E\u5883\u754C\u7DDA\u304C\u3042\u308A\u3001\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u3088\u3063\u3066\u914D\u8272\u3092\u4E0A\u66F8\u304D\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u3067\u306E\u307F\u3053\u306E\u914D\u8272\u306F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC\u306E\u80CC\u666F\u8272\u3002\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306F\u3001\u30B3\u30DE\u30F3\u30C9 \u30D1\u30EC\u30C3\u30C8\u306E\u3088\u3046\u306A\u30D4\u30C3\u30AB\u30FC\u306E\u30B3\u30F3\u30C6\u30CA\u30FC\u3067\u3059\u3002","\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC\u306E\u524D\u666F\u8272\u3002\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306F\u3001\u30B3\u30DE\u30F3\u30C9 \u30D1\u30EC\u30C3\u30C8\u306E\u3088\u3046\u306A\u30D4\u30C3\u30AB\u30FC\u306E\u30B3\u30F3\u30C6\u30CA\u30FC\u3067\u3059\u3002","\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC \u306E\u30BF\u30A4\u30C8\u30EB\u306E\u80CC\u666F\u8272\u3002\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306F\u3001\u30B3\u30DE\u30F3\u30C9 \u30D1\u30EC\u30C3\u30C8\u306E\u3088\u3046\u306A\u30D4\u30C3\u30AB\u30FC\u306E\u30B3\u30F3\u30C6\u30CA\u30FC\u3067\u3059\u3002","\u30E9\u30D9\u30EB\u3092\u30B0\u30EB\u30FC\u30D7\u5316\u3059\u308B\u305F\u3081\u306E\u30AF\u30EA\u30C3\u30AF\u9078\u629E\u306E\u8272\u3002","\u5883\u754C\u7DDA\u3092\u30B0\u30EB\u30FC\u30D7\u5316\u3059\u308B\u305F\u3081\u306E\u30AF\u30A4\u30C3\u30AF\u9078\u629E\u306E\u8272\u3002","\u30AD\u30FC \u30D0\u30A4\u30F3\u30C9 \u30E9\u30D9\u30EB\u306E\u80CC\u666F\u8272\u3067\u3059\u3002\u30AD\u30FC \u30D0\u30A4\u30F3\u30C9 \u30E9\u30D9\u30EB\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8\u3092\u8868\u3059\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30AD\u30FC \u30D0\u30A4\u30F3\u30C9 \u30E9\u30D9\u30EB\u306E\u524D\u666F\u8272\u3067\u3059\u3002\u30AD\u30FC \u30D0\u30A4\u30F3\u30C9 \u30E9\u30D9\u30EB\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8\u3092\u8868\u3059\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30AD\u30FC \u30D0\u30A4\u30F3\u30C9 \u30E9\u30D9\u30EB\u306E\u5883\u754C\u7DDA\u306E\u8272\u3067\u3059\u3002\u30AD\u30FC \u30D0\u30A4\u30F3\u30C9 \u30E9\u30D9\u30EB\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8\u3092\u8868\u3059\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30AD\u30FC \u30D0\u30A4\u30F3\u30C9 \u30E9\u30D9\u30EB\u306E\u4E0B\u306E\u5883\u754C\u7DDA\u306E\u8272\u3067\u3059\u3002\u30AD\u30FC \u30D0\u30A4\u30F3\u30C9 \u30E9\u30D9\u30EB\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8\u3092\u8868\u3059\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u306E\u8272\u3002","\u30CF\u30A4 \u30B3\u30F3\u30C8\u30E9\u30B9\u30C8\u306E\u9078\u629E\u6E08\u307F\u30C6\u30AD\u30B9\u30C8\u306E\u8272\u3002","\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u9078\u629E\u7BC4\u56F2\u306E\u540C\u3058\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u9818\u57DF\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u9078\u629E\u7BC4\u56F2\u3068\u540C\u3058\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u73FE\u5728\u306E\u691C\u7D22\u4E00\u81F4\u9805\u76EE\u306E\u8272\u3002","\u305D\u306E\u4ED6\u306E\u691C\u7D22\u6761\u4EF6\u306B\u4E00\u81F4\u3059\u308B\u9805\u76EE\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u691C\u7D22\u3092\u5236\u9650\u3059\u308B\u7BC4\u56F2\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u73FE\u5728\u306E\u691C\u7D22\u4E00\u81F4\u9805\u76EE\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u4ED6\u306E\u691C\u7D22\u4E00\u81F4\u9805\u76EE\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u691C\u7D22\u3092\u5236\u9650\u3059\u308B\u7BC4\u56F2\u306E\u5883\u754C\u7DDA\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u691C\u7D22\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30AF\u30A8\u30EA\u306E\u8272\u304C\u4E00\u81F4\u3057\u307E\u3059\u3002","\u691C\u7D22\u30A8\u30C7\u30A3\u30BF\u30FC \u30AF\u30A8\u30EA\u306E\u5883\u754C\u7DDA\u306E\u8272\u304C\u4E00\u81F4\u3057\u307E\u3059\u3002","\u691C\u7D22\u30D3\u30E5\u30FC\u30EC\u30C3\u30C8\u306E\u5B8C\u4E86\u30E1\u30C3\u30BB\u30FC\u30B8\u5185\u306E\u30C6\u30AD\u30B9\u30C8\u306E\u8272\u3002","\u30DB\u30D0\u30FC\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u8A9E\u306E\u4E0B\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30DB\u30D0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30DB\u30D0\u30FC\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30DB\u30D0\u30FC\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DB\u30D0\u30FC\u306E\u30B9\u30C6\u30FC\u30BF\u30B9 \u30D0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30EA\u30F3\u30AF\u306E\u8272\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u306E\u524D\u666F\u8272","\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u306E\u80CC\u666F\u8272","\u7A2E\u985E\u306E\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u306E\u524D\u666F\u8272","\u7A2E\u985E\u306E\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u306E\u80CC\u666F\u8272","\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC\u306E\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u306E\u524D\u666F\u8272","\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC\u306E\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u306E\u80CC\u666F\u8272","\u96FB\u7403\u30A2\u30AF\u30B7\u30E7\u30F3 \u30A2\u30A4\u30B3\u30F3\u306B\u4F7F\u7528\u3059\u308B\u8272\u3002","\u81EA\u52D5\u4FEE\u6B63\u306E\u96FB\u7403\u30A2\u30AF\u30B7\u30E7\u30F3 \u30A2\u30A4\u30B3\u30F3\u3068\u3057\u3066\u4F7F\u7528\u3055\u308C\u308B\u8272\u3002","\u96FB\u7403 AI \u30A2\u30A4\u30B3\u30F3\u306B\u4F7F\u7528\u3059\u308B\u8272\u3002","\u633F\u5165\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u524A\u9664\u3057\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u633F\u5165\u3055\u308C\u305F\u884C\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u524A\u9664\u3057\u305F\u884C\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u633F\u5165\u3055\u308C\u305F\u884C\u306E\u4F59\u767D\u306E\u80CC\u666F\u8272\u3002","\u524A\u9664\u3055\u308C\u305F\u884C\u306E\u4F59\u767D\u306E\u80CC\u666F\u8272\u3002","\u633F\u5165\u3055\u308C\u305F\u30B3\u30F3\u30C6\u30F3\u30C4\u306B\u3064\u3044\u3066\u3001\u5DEE\u5206\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u3092\u524D\u9762\u306B\u7F6E\u304D\u307E\u3059\u3002","\u524A\u9664\u3055\u308C\u305F\u30B3\u30F3\u30C6\u30F3\u30C4\u306B\u3064\u3044\u3066\u3001\u5DEE\u5206\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u3092\u524D\u9762\u306B\u7F6E\u304D\u307E\u3059\u3002","\u633F\u5165\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u8F2A\u90ED\u306E\u8272\u3002","\u524A\u9664\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u8F2A\u90ED\u306E\u8272\u3002","2 \u3064\u306E\u30C6\u30AD\u30B9\u30C8 \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9593\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u5BFE\u89D2\u7DDA\u306E\u5857\u308A\u3064\u3076\u3057\u8272\u3002\u5BFE\u89D2\u7DDA\u306E\u5857\u308A\u3064\u3076\u3057\u306F\u3001\u6A2A\u306B\u4E26\u3079\u3066\u6BD4\u8F03\u3059\u308B\u30D3\u30E5\u30FC\u3067\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u30D6\u30ED\u30C3\u30AF\u306E\u80CC\u666F\u8272\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u30D6\u30ED\u30C3\u30AF\u306E\u524D\u666F\u8272\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u30B3\u30FC\u30C9\u306E\u80CC\u666F\u8272\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u304C\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u5834\u5408\u306E\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u306E\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u306B\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306B\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30EA\u30B9\u30C8/\u30C4\u30EA\u30FC\u304C\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u9078\u629E\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306E\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u30A2\u30A4\u30C6\u30E0\u306E\u30EA\u30B9\u30C8/\u30C4\u30EA\u30FC \u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u306E\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30EA\u30B9\u30C8/\u30C4\u30EA\u30FC\u306B\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u5834\u5408\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306E\u30A2\u30A4\u30B3\u30F3\u524D\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306E\u30A2\u30A4\u30B3\u30F3\u524D\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u5834\u5408\u306E\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u306E\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u306B\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306B\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30DE\u30A6\u30B9\u64CD\u4F5C\u3067\u9805\u76EE\u3092\u30DB\u30D0\u30FC\u3059\u308B\u3068\u304D\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u3002","\u30DE\u30A6\u30B9\u64CD\u4F5C\u3067\u9805\u76EE\u3092\u30DB\u30D0\u30FC\u3059\u308B\u3068\u304D\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u3002","\u30DE\u30A6\u30B9\u64CD\u4F5C\u3067\u9805\u76EE\u3092\u4ED6\u306E\u9805\u76EE\u306E\u4E0A\u306B\u79FB\u52D5\u3059\u308B\u3068\u304D\u306E\u30EA\u30B9\u30C8/\u30C4\u30EA\u30FC\u306E\u30C9\u30E9\u30C3\u30B0 \u30A2\u30F3\u30C9 \u30C9\u30ED\u30C3\u30D7\u306E\u80CC\u666F\u3002","\u30DE\u30A6\u30B9\u3092\u4F7F\u7528\u3057\u3066\u30A2\u30A4\u30C6\u30E0\u3092\u30A2\u30A4\u30C6\u30E0\u9593\u3067\u79FB\u52D5\u3059\u308B\u3068\u304D\u306E\u30EA\u30B9\u30C8/\u30C4\u30EA\u30FC\u306E\u30C9\u30E9\u30C3\u30B0 \u30A2\u30F3\u30C9 \u30C9\u30ED\u30C3\u30D7\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u5185\u3092\u691C\u7D22\u3057\u3066\u3044\u308B\u3068\u304D\u3001\u4E00\u81F4\u3057\u305F\u5F37\u8ABF\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u8272\u3002","\u30C4\u30EA\u30FC/\u30EA\u30B9\u30C8\u5185\u3092\u691C\u7D22\u3057\u3066\u3044\u308B\u3068\u304D\u3001\u4E00\u81F4\u3057\u305F\u5F37\u8ABF\u306E\u30C4\u30EA\u30FC/\u30EA\u30B9\u30C8\u306E\u524D\u666F\u8272\u3002","\u7121\u52B9\u306A\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306E\u524D\u666F\u8272\u3002\u305F\u3068\u3048\u3070\u30A8\u30AF\u30B9\u30D7\u30ED\u30FC\u30E9\u30FC\u306E\u672A\u89E3\u6C7A\u306A\u30EB\u30FC\u30C8\u3002","\u30A8\u30E9\u30FC\u3092\u542B\u3080\u30EA\u30B9\u30C8\u9805\u76EE\u306E\u524D\u666F\u8272\u3002","\u8B66\u544A\u304C\u542B\u307E\u308C\u308B\u30EA\u30B9\u30C8\u9805\u76EE\u306E\u524D\u666F\u8272\u3002","\u30EA\u30B9\u30C8\u304A\u3088\u3073\u30C4\u30EA\u30FC\u306E\u578B\u30D5\u30A3\u30EB\u30BF\u30FC \u30A6\u30A7\u30B8\u30A7\u30C3\u30C8\u306E\u80CC\u666F\u8272\u3002","\u30EA\u30B9\u30C8\u304A\u3088\u3073\u30C4\u30EA\u30FC\u306E\u578B\u30D5\u30A3\u30EB\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u8272\u3002","\u4E00\u81F4\u9805\u76EE\u304C\u306A\u3044\u5834\u5408\u306E\u3001\u30EA\u30B9\u30C8\u304A\u3088\u3073\u30C4\u30EA\u30FC\u306E\u578B\u30D5\u30A3\u30EB\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u8272\u3002","\u30EA\u30B9\u30C8\u304A\u3088\u3073\u30C4\u30EA\u30FC\u306E\u578B\u30D5\u30A3\u30EB\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u5F71\u306E\u8272\u3002","\u30D5\u30A3\u30EB\u30BF\u30EA\u30F3\u30B0\u3055\u308C\u305F\u4E00\u81F4\u306E\u80CC\u666F\u8272\u3002","\u30D5\u30A3\u30EB\u30BF\u30EA\u30F3\u30B0\u3055\u308C\u305F\u4E00\u81F4\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u30C4\u30EA\u30FC \u30B9\u30C8\u30ED\u30FC\u30AF\u306E\u8272\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306A\u3044\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u30C4\u30EA\u30FC \u30B9\u30C8\u30ED\u30FC\u30AF\u306E\u8272\u3002","\u5217\u9593\u306E\u8868\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u5947\u6570\u30C6\u30FC\u30D6\u30EB\u884C\u306E\u80CC\u666F\u8272\u3002","\u5F37\u8ABF\u8868\u793A\u3055\u308C\u3066\u3044\u306A\u3044\u9805\u76EE\u306E\u30EA\u30B9\u30C8/\u30C4\u30EA\u30FC\u524D\u666F\u8272\u3002 ","\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u80CC\u666F\u8272\u3002","\u8981\u7D20\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306E\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u80CC\u666F\u8272\u3002","\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u524D\u666F\u8272\u3002","\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u8981\u7D20\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306E\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u4EE3\u308F\u308A\u306B quickInputList.focusBackground \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044","\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30AF\u30A4\u30C3\u30AF\u9078\u629E\u306E\u524D\u666F\u8272\u3002","\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30AF\u30A4\u30C3\u30AF\u9078\u629E\u306E\u30A2\u30A4\u30B3\u30F3\u524D\u666F\u8272\u3002","\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30AF\u30A4\u30C3\u30AF\u9078\u629E\u306E\u80CC\u666F\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u524D\u666F\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u80CC\u666F\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u3067\u9078\u629E\u3055\u308C\u305F\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u524D\u666F\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u3067\u9078\u629E\u3055\u308C\u305F\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u80CC\u666F\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u3067\u9078\u629E\u3055\u308C\u305F\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u5185\u306E\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u4E0A\u306B\u30DE\u30A6\u30B9 \u30DD\u30A4\u30F3\u30BF\u30FC\u3092\u5408\u308F\u305B\u305F\u3068\u304D\u306E\u30C4\u30FC\u30EB \u30D0\u30FC\u306E\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3","\u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u4E0A\u306B\u30DE\u30A6\u30B9 \u30DD\u30A4\u30F3\u30BF\u30FC\u3092\u5408\u308F\u305B\u305F\u3068\u304D\u306E\u30C4\u30FC\u30EB \u30D0\u30FC\u306E\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3","\u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u4E0A\u306B\u30DE\u30A6\u30B9 \u30DD\u30A4\u30F3\u30BF\u30FC\u3092\u5408\u308F\u305B\u308B\u3068\u30C4\u30FC\u30EB \u30D0\u30FC\u306E\u80CC\u666F\u304C\u8868\u793A\u3055\u308C\u308B","\u30B9\u30CB\u30DA\u30C3\u30C8 tabstop \u306E\u80CC\u666F\u8272\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8 tabstop \u306E\u5883\u754C\u7DDA\u306E\u8272\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u6700\u5F8C\u306E tabstop \u306E\u80CC\u666F\u8272\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u6700\u5F8C\u306E\u30BF\u30D6\u30B9\u30C8\u30C3\u30D7\u3067\u5883\u754C\u7DDA\u306E\u8272\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u968E\u5C64\u30EA\u30F3\u30AF\u306E\u9805\u76EE\u306E\u8272\u3002","\u968E\u5C64\u30EA\u30F3\u30AF\u306E\u9805\u76EE\u306E\u80CC\u666F\u8272\u3002","\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u968E\u5C64\u30EA\u30F3\u30AF\u306E\u9805\u76EE\u306E\u8272\u3002","\u9078\u629E\u3055\u308C\u305F\u968E\u5C64\u30EA\u30F3\u30AF\u306E\u9805\u76EE\u306E\u8272\u3002","\u968E\u5C64\u9805\u76EE\u30D4\u30C3\u30AB\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3 \u30DE\u30FC\u30B8\u7AF6\u5408\u306E\u73FE\u5728\u306E\u30D8\u30C3\u30C0\u30FC\u306E\u80CC\u666F\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3 \u30DE\u30FC\u30B8\u7AF6\u5408\u306E\u73FE\u5728\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u80CC\u666F\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3 \u30DE\u30FC\u30B8\u7AF6\u5408\u306E\u7740\u4FE1\u30D8\u30C3\u30C0\u30FC\u306E\u80CC\u666F\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3 \u30DE\u30FC\u30B8\u7AF6\u5408\u306E\u7740\u4FE1\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u80CC\u666F\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3 \u30DE\u30FC\u30B8\u7AF6\u5408\u306E\u5171\u901A\u306E\u5148\u7956\u306E\u30D8\u30C3\u30C0\u30FC\u80CC\u666F\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3 \u30DE\u30FC\u30B8\u7AF6\u5408\u306E\u5171\u901A\u306E\u5148\u7956\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u80CC\u666F\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u884C\u5185\u30DE\u30FC\u30B8\u7AF6\u5408\u306E\u30D8\u30C3\u30C0\u30FC\u3068\u30B9\u30D7\u30EA\u30C3\u30BF\u30FC\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u884C\u5185\u30DE\u30FC\u30B8\u7AF6\u5408\u306E\u73FE\u5728\u306E\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u524D\u666F\u8272\u3002","\u884C\u5185\u30DE\u30FC\u30B8\u7AF6\u5408\u306E\u5165\u529B\u5074\u306E\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u524D\u666F\u8272\u3002","\u884C\u5185\u30DE\u30FC\u30B8\u7AF6\u5408\u306E\u5171\u901A\u306E\u7956\u5148\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u524D\u666F\u8272\u3002","\u691C\u51FA\u3055\u308C\u305F\u4E00\u81F4\u9805\u76EE\u306E\u6982\u8981\u30EB\u30FC\u30E9\u30FC \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u9078\u629E\u7BC4\u56F2\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u305F\u3081\u306E\u6982\u8981\u30EB\u30FC\u30E9\u30FC \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u4E00\u81F4\u3092\u691C\u7D22\u3059\u308B\u305F\u3081\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u7E70\u308A\u8FD4\u3057\u9078\u629E\u3059\u308B\u7BC4\u56F2\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002","\u60C5\u5831\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002","\u8B66\u544A\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002","\u30A8\u30E9\u30FC\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306E\u80CC\u666F\u8272\u3002",'\u30DF\u30CB\u30DE\u30C3\u30D7\u306B\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\u3055\u308C\u308B\u524D\u666F\u8981\u7D20\u306E\u4E0D\u900F\u660E\u5EA6\u3002\u305F\u3068\u3048\u3070\u3001"#000000c0" \u3067\u306F\u300175% \u306E\u4E0D\u900F\u660E\u5EA6\u3067\u8981\u7D20\u3092\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\u3057\u307E\u3059\u3002',"\u30DF\u30CB\u30DE\u30C3\u30D7 \u30B9\u30E9\u30A4\u30C0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30DB\u30D0\u30FC\u30EA\u30F3\u30B0\u6642\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30B9\u30E9\u30A4\u30C0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30AF\u30EA\u30C3\u30AF\u3057\u305F\u3068\u304D\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30B9\u30E9\u30A4\u30C0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u554F\u984C\u306E\u30A8\u30E9\u30FC \u30A2\u30A4\u30B3\u30F3\u306B\u4F7F\u7528\u3055\u308C\u308B\u8272\u3002","\u554F\u984C\u306E\u8B66\u544A\u30A2\u30A4\u30B3\u30F3\u306B\u4F7F\u7528\u3055\u308C\u308B\u8272\u3002","\u554F\u984C\u60C5\u5831\u30A2\u30A4\u30B3\u30F3\u306B\u4F7F\u7528\u3055\u308C\u308B\u8272\u3002","\u30B0\u30E9\u30D5\u3067\u4F7F\u7528\u3055\u308C\u308B\u524D\u666F\u8272\u3002","\u30B0\u30E9\u30D5\u306E\u6C34\u5E73\u7DDA\u306B\u4F7F\u7528\u3055\u308C\u308B\u8272\u3002","\u30B0\u30E9\u30D5\u306E\u8996\u899A\u5316\u306B\u4F7F\u7528\u3055\u308C\u308B\u8D64\u8272\u3002","\u30B0\u30E9\u30D5\u306E\u8996\u899A\u5316\u306B\u4F7F\u7528\u3055\u308C\u308B\u9752\u8272\u3002","\u30B0\u30E9\u30D5\u306E\u8996\u899A\u5316\u306B\u4F7F\u7528\u3055\u308C\u308B\u9EC4\u8272\u3002","\u30B0\u30E9\u30D5\u306E\u8996\u899A\u5316\u306B\u4F7F\u7528\u3055\u308C\u308B\u30AA\u30EC\u30F3\u30B8\u8272\u3002","\u30B0\u30E9\u30D5\u306E\u8996\u899A\u5316\u306B\u4F7F\u7528\u3055\u308C\u308B\u7DD1\u8272\u3002","\u30B0\u30E9\u30D5\u306E\u8996\u899A\u5316\u306B\u4F7F\u7528\u3055\u308C\u308B\u7D2B\u8272\u3002"],"vs/platform/theme/common/iconRegistry":["\u4F7F\u7528\u3059\u308B\u30D5\u30A9\u30F3\u30C8\u306E ID\u3002\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u306F\u3001\u6700\u521D\u306B\u5B9A\u7FA9\u3055\u308C\u3066\u3044\u308B\u30D5\u30A9\u30F3\u30C8\u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A2\u30A4\u30B3\u30F3\u5B9A\u7FA9\u306B\u95A2\u9023\u4ED8\u3051\u3089\u308C\u305F\u30D5\u30A9\u30F3\u30C8\u6587\u5B57\u3002","\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u3042\u308B\u9589\u3058\u308B\u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u524D\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u5834\u6240\u306B\u79FB\u52D5\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u6B21\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u5834\u6240\u306B\u79FB\u52D5\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002"],"vs/platform/undoRedo/common/undoRedoService":["\u6B21\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u9589\u3058\u3089\u308C\u3001\u30C7\u30A3\u30B9\u30AF\u4E0A\u3067\u5909\u66F4\u3055\u308C\u307E\u3057\u305F: {0}\u3002","\u4EE5\u4E0B\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u4E92\u63DB\u6027\u306E\u306A\u3044\u65B9\u6CD5\u3067\u5909\u66F4\u3055\u308C\u307E\u3057\u305F: {0}\u3002","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002{1}","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002{1}","{1} \u306B\u5909\u66F4\u304C\u52A0\u3048\u3089\u308C\u305F\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F","{1} \u3067\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u65E2\u306B\u5B9F\u884C\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3057\u3066 '{0}' \u3092\u5143\u306B\u623B\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u305D\u306E\u671F\u9593\u306B\u5B9F\u884C\u4E2D\u3067\u3042\u3063\u305F\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3057\u3066 '{0}' \u3092\u5143\u306B\u623B\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u5143\u306B\u623B\u3057\u307E\u3059\u304B?","{0} \u500B\u306E\u30D5\u30A1\u30A4\u30EB\u3067\u5143\u306B\u623B\u3059(&&U)","\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u5143\u306B\u623B\u3059","\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u65E2\u306B\u5B9F\u884C\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001'{0}' \u3092\u5143\u306B\u623B\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","'{0}' \u3092\u5143\u306B\u623B\u3057\u307E\u3059\u304B?","\u306F\u3044(&&Y)","\u3044\u3044\u3048","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u3084\u308A\u76F4\u3057\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002{1}","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u3084\u308A\u76F4\u3057\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002{1}","{1} \u306B\u5909\u66F4\u304C\u52A0\u3048\u3089\u308C\u305F\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u518D\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","{1} \u3067\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u65E2\u306B\u5B9F\u884C\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3057\u3066 '{0}' \u3092\u3084\u308A\u76F4\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u305D\u306E\u671F\u9593\u306B\u5B9F\u884C\u4E2D\u3067\u3042\u3063\u305F\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3057\u3066 '{0}' \u3092\u3084\u308A\u76F4\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u65E2\u306B\u5B9F\u884C\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001'{0}' \u3092\u3084\u308A\u76F4\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002"],"vs/platform/workspace/common/workspace":["\u30B3\u30FC\u30C9 \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9"]});
+
+//# sourceMappingURL=../../../min-maps/vs/editor/editor.main.nls.ja.js.map
\ No newline at end of file
diff --git a/public/vs/editor/editor.main.nls.js b/public/vs/editor/editor.main.nls.js
new file mode 100644
index 0000000..79070e8
--- /dev/null
+++ b/public/vs/editor/editor.main.nls.js
@@ -0,0 +1,13 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/editor/editor.main.nls",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["input"],"vs/base/browser/ui/findinput/findInputToggles":["Match Case","Match Whole Word","Use Regular Expression"],"vs/base/browser/ui/findinput/replaceInput":["input","Preserve Case"],"vs/base/browser/ui/hover/hoverWidget":["Inspect this in the accessible view with {0}.","Inspect this in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding."],"vs/base/browser/ui/iconLabel/iconLabelHover":["Loading..."],"vs/base/browser/ui/inputbox/inputBox":["Error: {0}","Warning: {0}","Info: {0}"," or {0} for history"," ({0} for history)","Cleared Input"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["Unbound"],"vs/base/browser/ui/selectBox/selectBoxCustom":["Select Box"],"vs/base/browser/ui/toolbar/toolbar":["More Actions..."],"vs/base/browser/ui/tree/abstractTree":["Filter","Fuzzy Match","Type to filter","Type to search","Type to search","Close","No elements found."],"vs/base/common/actions":["(empty)"],"vs/base/common/errorMessage":["{0}: {1}","A system error occurred ({0})","An unknown error occurred. Please consult the log for more details.","An unknown error occurred. Please consult the log for more details.","{0} ({1} errors in total)","An unknown error occurred. Please consult the log for more details."],"vs/base/common/keybindingLabels":["Ctrl","Shift","Alt","Windows","Ctrl","Shift","Alt","Super","Control","Shift","Option","Command","Control","Shift","Alt","Windows","Control","Shift","Alt","Super"],"vs/base/common/platform":["_"],"vs/editor/browser/controller/textAreaHandler":["editor","The editor is not accessible at this time.","{0} To enable screen reader optimized mode, use {1}","{0} To enable screen reader optimized mode, open the quick pick with {1} and run the command Toggle Screen Reader Accessibility Mode, which is currently not triggerable via keyboard.","{0} Please assign a keybinding for the command Toggle Screen Reader Accessibility Mode by accessing the keybindings editor with {1} and run it."],"vs/editor/browser/coreCommands":["Stick to the end even when going to longer lines","Stick to the end even when going to longer lines","Removed secondary cursors"],"vs/editor/browser/editorExtensions":["&&Undo","Undo","&&Redo","Redo","&&Select All","Select All"],"vs/editor/browser/widget/codeEditorWidget":["The number of cursors has been limited to {0}. Consider using [find and replace](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) for larger changes or increase the editor multi cursor limit setting.","Increase Multi Cursor Limit"],"vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer":["Icon for 'Insert' in accessible diff viewer.","Icon for 'Remove' in accessible diff viewer.","Icon for 'Close' in accessible diff viewer.","Close","Accessible Diff Viewer. Use arrow up and down to navigate.","no lines changed","1 line changed","{0} lines changed","Difference {0} of {1}: original line {2}, {3}, modified line {4}, {5}","blank","{0} unchanged line {1}","{0} original line {1} modified line {2}","+ {0} modified line {1}","- {0} original line {1}"],"vs/editor/browser/widget/diffEditor/components/diffEditorEditors":[" use {0} to open the accessibility help."],"vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin":["Copy deleted lines","Copy deleted line","Copy changed lines","Copy changed line","Copy deleted line ({0})","Copy changed line ({0})","Revert this change"],"vs/editor/browser/widget/diffEditor/diffEditor.contribution":["Use Inline View When Space Is Limited","Show Moved Code Blocks","Diff Editor","Accessible Diff Viewer","Open Accessible Diff Viewer","Toggle Collapse Unchanged Regions","Toggle Show Moved Code Blocks","Toggle Use Inline View When Space Is Limited","Switch Side","Exit Compare Move","Collapse All Unchanged Regions","Show All Unchanged Regions","Go to Next Difference","Go to Previous Difference"],"vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature":["Fold Unchanged Region","Click or drag to show more above","Show Unchanged Region","Click or drag to show more below","{0} hidden lines","Double click to unfold"],"vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature":["Code moved with changes to line {0}-{1}","Code moved with changes from line {0}-{1}","Code moved to line {0}-{1}","Code moved from line {0}-{1}"],"vs/editor/browser/widget/diffEditor/features/revertButtonsFeature":["Revert Selected Changes","Revert Change"],"vs/editor/browser/widget/diffEditor/registrations.contribution":["The border color for text that got moved in the diff editor.","The active border color for text that got moved in the diff editor.","The color of the shadow around unchanged region widgets.","Line decoration for inserts in the diff editor.","Line decoration for removals in the diff editor."],"vs/editor/browser/widget/hoverWidget/hoverWidget":["Hold {0} key to mouse over"],"vs/editor/browser/widget/multiDiffEditorWidget/colors":["The background color of the diff editor's header","The background color of the multi file diff editor","The border color of the multi file diff editor"],"vs/editor/common/config/editorConfigurationSchema":["Editor","The number of spaces a tab is equal to. This setting is overridden based on the file contents when {0} is on.",'The number of spaces used for indentation or `"tabSize"` to use the value from `#editor.tabSize#`. This setting is overridden based on the file contents when `#editor.detectIndentation#` is on.',"Insert spaces when pressing `Tab`. This setting is overridden based on the file contents when {0} is on.","Controls whether {0} and {1} will be automatically detected when a file is opened based on the file contents.","Remove trailing auto inserted whitespace.","Special handling for large files to disable certain memory intensive features.","Turn off Word Based Suggestions.","Only suggest words from the active document.","Suggest words from all open documents of the same language.","Suggest words from all open documents.","Controls whether completions should be computed based on words in the document and from which documents they are computed.","Semantic highlighting enabled for all color themes.","Semantic highlighting disabled for all color themes.","Semantic highlighting is configured by the current color theme's `semanticHighlighting` setting.","Controls whether the semanticHighlighting is shown for the languages that support it.","Keep peek editors open even when double-clicking their content or when hitting `Escape`.","Lines above this length will not be tokenized for performance reasons","Controls whether the tokenization should happen asynchronously on a web worker.","Controls whether async tokenization should be logged. For debugging only.","Controls whether async tokenization should be verified against legacy background tokenization. Might slow down tokenization. For debugging only.","Defines the bracket symbols that increase or decrease the indentation.","The opening bracket character or string sequence.","The closing bracket character or string sequence.","Defines the bracket pairs that are colorized by their nesting level if bracket pair colorization is enabled.","The opening bracket character or string sequence.","The closing bracket character or string sequence.","Timeout in milliseconds after which diff computation is cancelled. Use 0 for no timeout.","Maximum file size in MB for which to compute diffs. Use 0 for no limit.","Controls whether the diff editor shows the diff side by side or inline.","If the diff editor width is smaller than this value, the inline view is used.","If enabled and the editor width is too small, the inline view is used.","When enabled, the diff editor shows arrows in its glyph margin to revert changes.","When enabled, the diff editor ignores changes in leading or trailing whitespace.","Controls whether the diff editor shows +/- indicators for added/removed changes.","Controls whether the editor shows CodeLens.","Lines will never wrap.","Lines will wrap at the viewport width.","Lines will wrap according to the {0} setting.","Uses the legacy diffing algorithm.","Uses the advanced diffing algorithm.","Controls whether the diff editor shows unchanged regions.","Controls how many lines are used for unchanged regions.","Controls how many lines are used as a minimum for unchanged regions.","Controls how many lines are used as context when comparing unchanged regions.","Controls whether the diff editor should show detected code moves.","Controls whether the diff editor shows empty decorations to see where characters got inserted or deleted."],"vs/editor/common/config/editorOptions":["Use platform APIs to detect when a Screen Reader is attached.","Optimize for usage with a Screen Reader.","Assume a screen reader is not attached.","Controls if the UI should run in a mode where it is optimized for screen readers.","Controls whether a space character is inserted when commenting.","Controls if empty lines should be ignored with toggle, add or remove actions for line comments.","Controls whether copying without a selection copies the current line.","Controls whether the cursor should jump to find matches while typing.","Never seed search string from the editor selection.","Always seed search string from the editor selection, including word at cursor position.","Only seed search string from the editor selection.","Controls whether the search string in the Find Widget is seeded from the editor selection.","Never turn on Find in Selection automatically (default).","Always turn on Find in Selection automatically.","Turn on Find in Selection automatically when multiple lines of content are selected.","Controls the condition for turning on Find in Selection automatically.","Controls whether the Find Widget should read or modify the shared find clipboard on macOS.","Controls whether the Find Widget should add extra lines on top of the editor. When true, you can scroll beyond the first line when the Find Widget is visible.","Controls whether the search automatically restarts from the beginning (or the end) when no further matches can be found.","Enables/Disables font ligatures ('calt' and 'liga' font features). Change this to a string for fine-grained control of the 'font-feature-settings' CSS property.","Explicit 'font-feature-settings' CSS property. A boolean can be passed instead if one only needs to turn on/off ligatures.","Configures font ligatures or font features. Can be either a boolean to enable/disable ligatures or a string for the value of the CSS 'font-feature-settings' property.","Enables/Disables the translation from font-weight to font-variation-settings. Change this to a string for fine-grained control of the 'font-variation-settings' CSS property.","Explicit 'font-variation-settings' CSS property. A boolean can be passed instead if one only needs to translate font-weight to font-variation-settings.","Configures font variations. Can be either a boolean to enable/disable the translation from font-weight to font-variation-settings or a string for the value of the CSS 'font-variation-settings' property.","Controls the font size in pixels.",'Only "normal" and "bold" keywords or numbers between 1 and 1000 are allowed.','Controls the font weight. Accepts "normal" and "bold" keywords or numbers between 1 and 1000.',"Show Peek view of the results (default)","Go to the primary result and show a Peek view","Go to the primary result and enable Peek-less navigation to others","This setting is deprecated, please use separate settings like 'editor.editor.gotoLocation.multipleDefinitions' or 'editor.editor.gotoLocation.multipleImplementations' instead.","Controls the behavior the 'Go to Definition'-command when multiple target locations exist.","Controls the behavior the 'Go to Type Definition'-command when multiple target locations exist.","Controls the behavior the 'Go to Declaration'-command when multiple target locations exist.","Controls the behavior the 'Go to Implementations'-command when multiple target locations exist.","Controls the behavior the 'Go to References'-command when multiple target locations exist.","Alternative command id that is being executed when the result of 'Go to Definition' is the current location.","Alternative command id that is being executed when the result of 'Go to Type Definition' is the current location.","Alternative command id that is being executed when the result of 'Go to Declaration' is the current location.","Alternative command id that is being executed when the result of 'Go to Implementation' is the current location.","Alternative command id that is being executed when the result of 'Go to Reference' is the current location.","Controls whether the hover is shown.","Controls the delay in milliseconds after which the hover is shown.","Controls whether the hover should remain visible when mouse is moved over it.","Controls the delay in milliseconds after which the hover is hidden. Requires `editor.hover.sticky` to be enabled.","Prefer showing hovers above the line, if there's space.","Assumes that all characters are of the same width. This is a fast algorithm that works correctly for monospace fonts and certain scripts (like Latin characters) where glyphs are of equal width.","Delegates wrapping points computation to the browser. This is a slow algorithm, that might cause freezes for large files, but it works correctly in all cases.","Controls the algorithm that computes wrapping points. Note that when in accessibility mode, advanced will be used for the best experience.","Disable the code action menu.","Show the code action menu when the cursor is on lines with code.","Show the code action menu when the cursor is on lines with code or on empty lines.","Enables the Code Action lightbulb in the editor.","Shows the nested current scopes during the scroll at the top of the editor.","Defines the maximum number of sticky lines to show.","Defines the model to use for determining which lines to stick. If the outline model does not exist, it will fall back on the folding provider model which falls back on the indentation model. This order is respected in all three cases.","Enable scrolling of Sticky Scroll with the editor's horizontal scrollbar.","Enables the inlay hints in the editor.","Inlay hints are enabled","Inlay hints are showing by default and hide when holding {0}","Inlay hints are hidden by default and show when holding {0}","Inlay hints are disabled","Controls font size of inlay hints in the editor. As default the {0} is used when the configured value is less than {1} or greater than the editor font size.","Controls font family of inlay hints in the editor. When set to empty, the {0} is used.","Enables the padding around the inlay hints in the editor.",`Controls the line height. 
+ - Use 0 to automatically compute the line height from the font size.
+ - Values between 0 and 8 will be used as a multiplier with the font size.
+ - Values greater than or equal to 8 will be used as effective values.`,"Controls whether the minimap is shown.","Controls whether the minimap is hidden automatically.","The minimap has the same size as the editor contents (and might scroll).","The minimap will stretch or shrink as necessary to fill the height of the editor (no scrolling).","The minimap will shrink as necessary to never be larger than the editor (no scrolling).","Controls the size of the minimap.","Controls the side where to render the minimap.","Controls when the minimap slider is shown.","Scale of content drawn in the minimap: 1, 2 or 3.","Render the actual characters on a line as opposed to color blocks.","Limit the width of the minimap to render at most a certain number of columns.","Controls the amount of space between the top edge of the editor and the first line.","Controls the amount of space between the bottom edge of the editor and the last line.","Enables a pop-up that shows parameter documentation and type information as you type.","Controls whether the parameter hints menu cycles or closes when reaching the end of the list.","Quick suggestions show inside the suggest widget","Quick suggestions show as ghost text","Quick suggestions are disabled","Enable quick suggestions inside strings.","Enable quick suggestions inside comments.","Enable quick suggestions outside of strings and comments.","Controls whether suggestions should automatically show up while typing. This can be controlled for typing in comments, strings, and other code. Quick suggestion can be configured to show as ghost text or with the suggest widget. Also be aware of the '{0}'-setting which controls if suggestions are triggered by special characters.","Line numbers are not rendered.","Line numbers are rendered as absolute number.","Line numbers are rendered as distance in lines to cursor position.","Line numbers are rendered every 10 lines.","Controls the display of line numbers.","Number of monospace characters at which this editor ruler will render.","Color of this editor ruler.","Render vertical rulers after a certain number of monospace characters. Use multiple values for multiple rulers. No rulers are drawn if array is empty.","The vertical scrollbar will be visible only when necessary.","The vertical scrollbar will always be visible.","The vertical scrollbar will always be hidden.","Controls the visibility of the vertical scrollbar.","The horizontal scrollbar will be visible only when necessary.","The horizontal scrollbar will always be visible.","The horizontal scrollbar will always be hidden.","Controls the visibility of the horizontal scrollbar.","The width of the vertical scrollbar.","The height of the horizontal scrollbar.","Controls whether clicks scroll by page or jump to click position.","When set, the horizontal scrollbar will not increase the size of the editor's content.","Controls whether all non-basic ASCII characters are highlighted. Only characters between U+0020 and U+007E, tab, line-feed and carriage-return are considered basic ASCII.","Controls whether characters that just reserve space or have no width at all are highlighted.","Controls whether characters are highlighted that can be confused with basic ASCII characters, except those that are common in the current user locale.","Controls whether characters in comments should also be subject to Unicode highlighting.","Controls whether characters in strings should also be subject to Unicode highlighting.","Defines allowed characters that are not being highlighted.","Unicode characters that are common in allowed locales are not being highlighted.","Controls whether to automatically show inline suggestions in the editor.","Show the inline suggestion toolbar whenever an inline suggestion is shown.","Show the inline suggestion toolbar when hovering over an inline suggestion.","Never show the inline suggestion toolbar.","Controls when to show the inline suggestion toolbar.","Controls how inline suggestions interact with the suggest widget. If enabled, the suggest widget is not shown automatically when inline suggestions are available.","Controls the font family of the inline suggestions.","Controls whether bracket pair colorization is enabled or not. Use {0} to override the bracket highlight colors.","Controls whether each bracket type has its own independent color pool.","Enables bracket pair guides.","Enables bracket pair guides only for the active bracket pair.","Disables bracket pair guides.","Controls whether bracket pair guides are enabled or not.","Enables horizontal guides as addition to vertical bracket pair guides.","Enables horizontal guides only for the active bracket pair.","Disables horizontal bracket pair guides.","Controls whether horizontal bracket pair guides are enabled or not.","Controls whether the editor should highlight the active bracket pair.","Controls whether the editor should render indent guides.","Highlights the active indent guide.","Highlights the active indent guide even if bracket guides are highlighted.","Do not highlight the active indent guide.","Controls whether the editor should highlight the active indent guide.","Insert suggestion without overwriting text right of the cursor.","Insert suggestion and overwrite text right of the cursor.","Controls whether words are overwritten when accepting completions. Note that this depends on extensions opting into this feature.","Controls whether filtering and sorting suggestions accounts for small typos.","Controls whether sorting favors words that appear close to the cursor.","Controls whether remembered suggestion selections are shared between multiple workspaces and windows (needs `#editor.suggestSelection#`).","Always select a suggestion when automatically triggering IntelliSense.","Never select a suggestion when automatically triggering IntelliSense.","Select a suggestion only when triggering IntelliSense from a trigger character.","Select a suggestion only when triggering IntelliSense as you type.","Controls whether a suggestion is selected when the widget shows. Note that this only applies to automatically triggered suggestions (`#editor.quickSuggestions#` and `#editor.suggestOnTriggerCharacters#`) and that a suggestion is always selected when explicitly invoked, e.g via `Ctrl+Space`.","Controls whether an active snippet prevents quick suggestions.","Controls whether to show or hide icons in suggestions.","Controls the visibility of the status bar at the bottom of the suggest widget.","Controls whether to preview the suggestion outcome in the editor.","Controls whether suggest details show inline with the label or only in the details widget.","This setting is deprecated. The suggest widget can now be resized.","This setting is deprecated, please use separate settings like 'editor.suggest.showKeywords' or 'editor.suggest.showSnippets' instead.","When enabled IntelliSense shows `method`-suggestions.","When enabled IntelliSense shows `function`-suggestions.","When enabled IntelliSense shows `constructor`-suggestions.","When enabled IntelliSense shows `deprecated`-suggestions.","When enabled IntelliSense filtering requires that the first character matches on a word start. For example, `c` on `Console` or `WebContext` but _not_ on `description`. When disabled IntelliSense will show more results but still sorts them by match quality.","When enabled IntelliSense shows `field`-suggestions.","When enabled IntelliSense shows `variable`-suggestions.","When enabled IntelliSense shows `class`-suggestions.","When enabled IntelliSense shows `struct`-suggestions.","When enabled IntelliSense shows `interface`-suggestions.","When enabled IntelliSense shows `module`-suggestions.","When enabled IntelliSense shows `property`-suggestions.","When enabled IntelliSense shows `event`-suggestions.","When enabled IntelliSense shows `operator`-suggestions.","When enabled IntelliSense shows `unit`-suggestions.","When enabled IntelliSense shows `value`-suggestions.","When enabled IntelliSense shows `constant`-suggestions.","When enabled IntelliSense shows `enum`-suggestions.","When enabled IntelliSense shows `enumMember`-suggestions.","When enabled IntelliSense shows `keyword`-suggestions.","When enabled IntelliSense shows `text`-suggestions.","When enabled IntelliSense shows `color`-suggestions.","When enabled IntelliSense shows `file`-suggestions.","When enabled IntelliSense shows `reference`-suggestions.","When enabled IntelliSense shows `customcolor`-suggestions.","When enabled IntelliSense shows `folder`-suggestions.","When enabled IntelliSense shows `typeParameter`-suggestions.","When enabled IntelliSense shows `snippet`-suggestions.","When enabled IntelliSense shows `user`-suggestions.","When enabled IntelliSense shows `issues`-suggestions.","Whether leading and trailing whitespace should always be selected.","Whether subwords (like 'foo' in 'fooBar' or 'foo_bar') should be selected.","No indentation. Wrapped lines begin at column 1.","Wrapped lines get the same indentation as the parent.","Wrapped lines get +1 indentation toward the parent.","Wrapped lines get +2 indentation toward the parent.","Controls the indentation of wrapped lines.","Controls whether you can drag and drop a file into a text editor by holding down the `Shift` key (instead of opening the file in an editor).","Controls if a widget is shown when dropping files into the editor. This widget lets you control how the file is dropped.","Show the drop selector widget after a file is dropped into the editor.","Never show the drop selector widget. Instead the default drop provider is always used.","Controls whether you can paste content in different ways.","Controls if a widget is shown when pasting content in to the editor. This widget lets you control how the file is pasted.","Show the paste selector widget after content is pasted into the editor.","Never show the paste selector widget. Instead the default pasting behavior is always used.","Controls whether suggestions should be accepted on commit characters. For example, in JavaScript, the semi-colon (`;`) can be a commit character that accepts a suggestion and types that character.","Only accept a suggestion with `Enter` when it makes a textual change.","Controls whether suggestions should be accepted on `Enter`, in addition to `Tab`. Helps to avoid ambiguity between inserting new lines or accepting suggestions.","Controls the number of lines in the editor that can be read out by a screen reader at once. When we detect a screen reader we automatically set the default to be 500. Warning: this has a performance implication for numbers larger than the default.","Editor content","Control whether inline suggestions are announced by a screen reader.","Use language configurations to determine when to autoclose brackets.","Autoclose brackets only when the cursor is to the left of whitespace.","Controls whether the editor should automatically close brackets after the user adds an opening bracket.","Use language configurations to determine when to autoclose comments.","Autoclose comments only when the cursor is to the left of whitespace.","Controls whether the editor should automatically close comments after the user adds an opening comment.","Remove adjacent closing quotes or brackets only if they were automatically inserted.","Controls whether the editor should remove adjacent closing quotes or brackets when deleting.","Type over closing quotes or brackets only if they were automatically inserted.","Controls whether the editor should type over closing quotes or brackets.","Use language configurations to determine when to autoclose quotes.","Autoclose quotes only when the cursor is to the left of whitespace.","Controls whether the editor should automatically close quotes after the user adds an opening quote.","The editor will not insert indentation automatically.","The editor will keep the current line's indentation.","The editor will keep the current line's indentation and honor language defined brackets.","The editor will keep the current line's indentation, honor language defined brackets and invoke special onEnterRules defined by languages.","The editor will keep the current line's indentation, honor language defined brackets, invoke special onEnterRules defined by languages, and honor indentationRules defined by languages.","Controls whether the editor should automatically adjust the indentation when users type, paste, move or indent lines.","Use language configurations to determine when to automatically surround selections.","Surround with quotes but not brackets.","Surround with brackets but not quotes.","Controls whether the editor should automatically surround selections when typing quotes or brackets.","Emulate selection behavior of tab characters when using spaces for indentation. Selection will stick to tab stops.","Controls whether the editor shows CodeLens.","Controls the font family for CodeLens.","Controls the font size in pixels for CodeLens. When set to 0, 90% of `#editor.fontSize#` is used.","Controls whether the editor should render the inline color decorators and color picker.","Make the color picker appear both on click and hover of the color decorator","Make the color picker appear on hover of the color decorator","Make the color picker appear on click of the color decorator","Controls the condition to make a color picker appear from a color decorator","Controls the max number of color decorators that can be rendered in an editor at once.","Enable that the selection with the mouse and keys is doing column selection.","Controls whether syntax highlighting should be copied into the clipboard.","Control the cursor animation style.","Smooth caret animation is disabled.","Smooth caret animation is enabled only when the user moves the cursor with an explicit gesture.","Smooth caret animation is always enabled.","Controls whether the smooth caret animation should be enabled.","Controls the cursor style.","Controls the minimal number of visible leading lines (minimum 0) and trailing lines (minimum 1) surrounding the cursor. Known as 'scrollOff' or 'scrollOffset' in some other editors.","`cursorSurroundingLines` is enforced only when triggered via the keyboard or API.","`cursorSurroundingLines` is enforced always.","Controls when `#cursorSurroundingLines#` should be enforced.","Controls the width of the cursor when `#editor.cursorStyle#` is set to `line`.","Controls whether the editor should allow moving selections via drag and drop.","Use a new rendering method with svgs.","Use a new rendering method with font characters.","Use the stable rendering method.","Controls whether whitespace is rendered with a new, experimental method.","Scrolling speed multiplier when pressing `Alt`.","Controls whether the editor has code folding enabled.","Use a language-specific folding strategy if available, else the indentation-based one.","Use the indentation-based folding strategy.","Controls the strategy for computing folding ranges.","Controls whether the editor should highlight folded ranges.","Controls whether the editor automatically collapses import ranges.","The maximum number of foldable regions. Increasing this value may result in the editor becoming less responsive when the current source has a large number of foldable regions.","Controls whether clicking on the empty content after a folded line will unfold the line.","Controls the font family.","Controls whether the editor should automatically format the pasted content. A formatter must be available and the formatter should be able to format a range in a document.","Controls whether the editor should automatically format the line after typing.","Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.","Controls whether the cursor should be hidden in the overview ruler.","Controls the letter spacing in pixels.","Controls whether the editor has linked editing enabled. Depending on the language, related symbols such as HTML tags, are updated while editing.","Controls whether the editor should detect links and make them clickable.","Highlight matching brackets.","A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.","Zoom the font of the editor when using mouse wheel and holding `Cmd`.","Zoom the font of the editor when using mouse wheel and holding `Ctrl`.","Merge multiple cursors when they are overlapping.","Maps to `Control` on Windows and Linux and to `Command` on macOS.","Maps to `Alt` on Windows and Linux and to `Option` on macOS.","The modifier to be used to add multiple cursors with the mouse. The Go to Definition and Open Link mouse gestures will adapt such that they do not conflict with the [multicursor modifier](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).","Each cursor pastes a single line of the text.","Each cursor pastes the full text.","Controls pasting when the line count of the pasted text matches the cursor count.","Controls the max number of cursors that can be in an active editor at once.","Does not highlight occurrences.","Highlights occurrences only in the current file.","Experimental: Highlights occurrences across all valid open files.","Controls whether occurrences should be highlighted across open files.","Controls whether a border should be drawn around the overview ruler.","Focus the tree when opening peek","Focus the editor when opening peek","Controls whether to focus the inline editor or the tree in the peek widget.","Controls whether the Go to Definition mouse gesture always opens the peek widget.","Controls the delay in milliseconds after which quick suggestions will show up.","Controls whether the editor auto renames on type.","Deprecated, use `editor.linkedEditing` instead.","Controls whether the editor should render control characters.","Render last line number when the file ends with a newline.","Highlights both the gutter and the current line.","Controls how the editor should render the current line highlight.","Controls if the editor should render the current line highlight only when the editor is focused.","Render whitespace characters except for single spaces between words.","Render whitespace characters only on selected text.","Render only trailing whitespace characters.","Controls how the editor should render whitespace characters.","Controls whether selections should have rounded corners.","Controls the number of extra characters beyond which the editor will scroll horizontally.","Controls whether the editor will scroll beyond the last line.","Scroll only along the predominant axis when scrolling both vertically and horizontally at the same time. Prevents horizontal drift when scrolling vertically on a trackpad.","Controls whether the Linux primary clipboard should be supported.","Controls whether the editor should highlight matches similar to the selection.","Always show the folding controls.","Never show the folding controls and reduce the gutter size.","Only show the folding controls when the mouse is over the gutter.","Controls when the folding controls on the gutter are shown.","Controls fading out of unused code.","Controls strikethrough deprecated variables.","Show snippet suggestions on top of other suggestions.","Show snippet suggestions below other suggestions.","Show snippets suggestions with other suggestions.","Do not show snippet suggestions.","Controls whether snippets are shown with other suggestions and how they are sorted.","Controls whether the editor will scroll using an animation.","Controls whether the accessibility hint should be provided to screen reader users when an inline completion is shown.","Font size for the suggest widget. When set to {0}, the value of {1} is used.","Line height for the suggest widget. When set to {0}, the value of {1} is used. The minimum value is 8.","Controls whether suggestions should automatically show up when typing trigger characters.","Always select the first suggestion.","Select recent suggestions unless further typing selects one, e.g. `console.| -> console.log` because `log` has been completed recently.","Select suggestions based on previous prefixes that have completed those suggestions, e.g. `co -> console` and `con -> const`.","Controls how suggestions are pre-selected when showing the suggest list.","Tab complete will insert the best matching suggestion when pressing tab.","Disable tab completions.","Tab complete snippets when their prefix match. Works best when 'quickSuggestions' aren't enabled.","Enables tab completions.","Unusual line terminators are automatically removed.","Unusual line terminators are ignored.","Unusual line terminators prompt to be removed.","Remove unusual line terminators that might cause problems.","Inserting and deleting whitespace follows tab stops.","Use the default line break rule.","Word breaks should not be used for Chinese/Japanese/Korean (CJK) text. Non-CJK text behavior is the same as for normal.","Controls the word break rules used for Chinese/Japanese/Korean (CJK) text.","Characters that will be used as word separators when doing word related navigations or operations.","Lines will never wrap.","Lines will wrap at the viewport width.","Lines will wrap at `#editor.wordWrapColumn#`.","Lines will wrap at the minimum of viewport and `#editor.wordWrapColumn#`.","Controls how lines should wrap.","Controls the wrapping column of the editor when `#editor.wordWrap#` is `wordWrapColumn` or `bounded`.","Controls whether inline color decorations should be shown using the default document color provider","Controls whether the editor receives tabs or defers them to the workbench for navigation."],"vs/editor/common/core/editorColorRegistry":["Background color for the highlight of line at the cursor position.","Background color for the border around the line at the cursor position.","Background color of highlighted ranges, like by quick open and find features. The color must not be opaque so as not to hide underlying decorations.","Background color of the border around highlighted ranges.","Background color of highlighted symbol, like for go to definition or go next/previous symbol. The color must not be opaque so as not to hide underlying decorations.","Background color of the border around highlighted symbols.","Color of the editor cursor.","The background color of the editor cursor. Allows customizing the color of a character overlapped by a block cursor.","Color of whitespace characters in the editor.","Color of editor line numbers.","Color of the editor indentation guides.","'editorIndentGuide.background' is deprecated. Use 'editorIndentGuide.background1' instead.","Color of the active editor indentation guides.","'editorIndentGuide.activeBackground' is deprecated. Use 'editorIndentGuide.activeBackground1' instead.","Color of the editor indentation guides (1).","Color of the editor indentation guides (2).","Color of the editor indentation guides (3).","Color of the editor indentation guides (4).","Color of the editor indentation guides (5).","Color of the editor indentation guides (6).","Color of the active editor indentation guides (1).","Color of the active editor indentation guides (2).","Color of the active editor indentation guides (3).","Color of the active editor indentation guides (4).","Color of the active editor indentation guides (5).","Color of the active editor indentation guides (6).","Color of editor active line number","Id is deprecated. Use 'editorLineNumber.activeForeground' instead.","Color of editor active line number","Color of the final editor line when editor.renderFinalNewline is set to dimmed.","Color of the editor rulers.","Foreground color of editor CodeLens","Background color behind matching brackets","Color for matching brackets boxes","Color of the overview ruler border.","Background color of the editor overview ruler.","Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.","Border color of unnecessary (unused) source code in the editor.",`Opacity of unnecessary (unused) source code in the editor. For example, "#000000c0" will render the code with 75% opacity. For high contrast themes, use the  'editorUnnecessaryCode.border' theme color to underline unnecessary code instead of fading it out.`,"Border color of ghost text in the editor.","Foreground color of the ghost text in the editor.","Background color of the ghost text in the editor.","Overview ruler marker color for range highlights. The color must not be opaque so as not to hide underlying decorations.","Overview ruler marker color for errors.","Overview ruler marker color for warnings.","Overview ruler marker color for infos.","Foreground color of brackets (1). Requires enabling bracket pair colorization.","Foreground color of brackets (2). Requires enabling bracket pair colorization.","Foreground color of brackets (3). Requires enabling bracket pair colorization.","Foreground color of brackets (4). Requires enabling bracket pair colorization.","Foreground color of brackets (5). Requires enabling bracket pair colorization.","Foreground color of brackets (6). Requires enabling bracket pair colorization.","Foreground color of unexpected brackets.","Background color of inactive bracket pair guides (1). Requires enabling bracket pair guides.","Background color of inactive bracket pair guides (2). Requires enabling bracket pair guides.","Background color of inactive bracket pair guides (3). Requires enabling bracket pair guides.","Background color of inactive bracket pair guides (4). Requires enabling bracket pair guides.","Background color of inactive bracket pair guides (5). Requires enabling bracket pair guides.","Background color of inactive bracket pair guides (6). Requires enabling bracket pair guides.","Background color of active bracket pair guides (1). Requires enabling bracket pair guides.","Background color of active bracket pair guides (2). Requires enabling bracket pair guides.","Background color of active bracket pair guides (3). Requires enabling bracket pair guides.","Background color of active bracket pair guides (4). Requires enabling bracket pair guides.","Background color of active bracket pair guides (5). Requires enabling bracket pair guides.","Background color of active bracket pair guides (6). Requires enabling bracket pair guides.","Border color used to highlight unicode characters.","Background color used to highlight unicode characters."],"vs/editor/common/editorContextKeys":["Whether the editor text has focus (cursor is blinking)","Whether the editor or an editor widget has focus (e.g. focus is in the find widget)","Whether an editor or a rich text input has focus (cursor is blinking)","Whether the editor is read-only","Whether the context is a diff editor","Whether the context is an embedded diff editor","Whether the context is a multi diff editor","Whether all files in multi diff editor are collapsed","Whether the diff editor has changes","Whether a moved code block is selected for comparison","Whether the accessible diff viewer is visible","Whether the diff editor render side by side inline breakpoint is reached","Whether `editor.columnSelection` is enabled","Whether the editor has text selected","Whether the editor has multiple selections","Whether `Tab` will move focus out of the editor","Whether the editor hover is visible","Whether the editor hover is focused","Whether the sticky scroll is focused","Whether the sticky scroll is visible","Whether the standalone color picker is visible","Whether the standalone color picker is focused","Whether the editor is part of a larger editor (e.g. notebooks)","The language identifier of the editor","Whether the editor has a completion item provider","Whether the editor has a code actions provider","Whether the editor has a code lens provider","Whether the editor has a definition provider","Whether the editor has a declaration provider","Whether the editor has an implementation provider","Whether the editor has a type definition provider","Whether the editor has a hover provider","Whether the editor has a document highlight provider","Whether the editor has a document symbol provider","Whether the editor has a reference provider","Whether the editor has a rename provider","Whether the editor has a signature help provider","Whether the editor has an inline hints provider","Whether the editor has a document formatting provider","Whether the editor has a document selection formatting provider","Whether the editor has multiple document formatting providers","Whether the editor has multiple document selection formatting providers"],"vs/editor/common/languages":["array","boolean","class","constant","constructor","enumeration","enumeration member","event","field","file","function","interface","key","method","module","namespace","null","number","object","operator","package","property","string","struct","type parameter","variable","{0} ({1})"],"vs/editor/common/languages/modesRegistry":["Plain Text"],"vs/editor/common/model/editStack":["Typing"],"vs/editor/common/standaloneStrings":["Developer: Inspect Tokens","Go to Line/Column...","Show all Quick Access Providers","Command Palette","Show And Run Commands","Go to Symbol...","Go to Symbol by Category...","Editor content","Press Alt+F1 for Accessibility Options.","Toggle High Contrast Theme","Made {0} edits in {1} files"],"vs/editor/common/viewLayout/viewLineRenderer":["Show more ({0})","{0} chars"],"vs/editor/contrib/anchorSelect/browser/anchorSelect":["Selection Anchor","Anchor set at {0}:{1}","Set Selection Anchor","Go to Selection Anchor","Select from Anchor to Cursor","Cancel Selection Anchor"],"vs/editor/contrib/bracketMatching/browser/bracketMatching":["Overview ruler marker color for matching brackets.","Go to Bracket","Select to Bracket","Remove Brackets","Go to &&Bracket","Select the text inside and including the brackets or curly braces"],"vs/editor/contrib/caretOperations/browser/caretOperations":["Move Selected Text Left","Move Selected Text Right"],"vs/editor/contrib/caretOperations/browser/transpose":["Transpose Letters"],"vs/editor/contrib/clipboard/browser/clipboard":["Cu&&t","Cut","Cut","Cut","&&Copy","Copy","Copy","Copy","Copy As","Copy As","Share","Share","Share","&&Paste","Paste","Paste","Paste","Copy With Syntax Highlighting"],"vs/editor/contrib/codeAction/browser/codeAction":["An unknown error occurred while applying the code action"],"vs/editor/contrib/codeAction/browser/codeActionCommands":["Kind of the code action to run.","Controls when the returned actions are applied.","Always apply the first returned code action.","Apply the first returned code action if it is the only one.","Do not apply the returned code actions.","Controls if only preferred code actions should be returned.","Quick Fix...","No code actions available","No preferred code actions for '{0}' available","No code actions for '{0}' available","No preferred code actions available","No code actions available","Refactor...","No preferred refactorings for '{0}' available","No refactorings for '{0}' available","No preferred refactorings available","No refactorings available","Source Action...","No preferred source actions for '{0}' available","No source actions for '{0}' available","No preferred source actions available","No source actions available","Organize Imports","No organize imports action available","Fix All","No fix all action available","Auto Fix...","No auto fixes available"],"vs/editor/contrib/codeAction/browser/codeActionContributions":["Enable/disable showing group headers in the Code Action menu.","Enable/disable showing nearest Quick Fix within a line when not currently on a diagnostic."],"vs/editor/contrib/codeAction/browser/codeActionController":["Context: {0} at line {1} and column {2}.","Hide Disabled","Show Disabled"],"vs/editor/contrib/codeAction/browser/codeActionMenu":["More Actions...","Quick Fix","Extract","Inline","Rewrite","Move","Surround With","Source Action"],"vs/editor/contrib/codeAction/browser/lightBulbWidget":["Run: {0}","Show Code Actions. Preferred Quick Fix Available ({0})","Show Code Actions ({0})","Show Code Actions"],"vs/editor/contrib/codelens/browser/codelensController":["Show CodeLens Commands For Current Line","Select a command"],"vs/editor/contrib/colorPicker/browser/colorPickerWidget":["Click to toggle color options (rgb/hsl/hex)","Icon to close the color picker"],"vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions":["Show or Focus Standalone Color Picker","&&Show or Focus Standalone Color Picker","Hide the Color Picker","Insert Color with Standalone Color Picker"],"vs/editor/contrib/comment/browser/comment":["Toggle Line Comment","&&Toggle Line Comment","Add Line Comment","Remove Line Comment","Toggle Block Comment","Toggle &&Block Comment"],"vs/editor/contrib/contextmenu/browser/contextmenu":["Minimap","Render Characters","Vertical size","Proportional","Fill","Fit","Slider","Mouse Over","Always","Show Editor Context Menu"],"vs/editor/contrib/cursorUndo/browser/cursorUndo":["Cursor Undo","Cursor Redo"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution":["Paste As...","The id of the paste edit to try applying. If not provided, the editor will show a picker.","Paste as Text"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteController":["Whether the paste widget is showing","Show paste options...","No paste edits for '{0}' found","Running paste handlers. Click to cancel","Select Paste Action","Running paste handlers"],"vs/editor/contrib/dropOrPasteInto/browser/defaultProviders":["Built-in","Insert Plain Text","Insert Uris","Insert Uri","Insert Paths","Insert Path","Insert Relative Paths","Insert Relative Path","Insert HTML"],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution":["Configures the default drop provider to use for content of a given mime type."],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController":["Whether the drop widget is showing","Show drop options...","Running drop handlers. Click to cancel"],"vs/editor/contrib/editorState/browser/keybindingCancellation":["Whether the editor runs a cancellable operation, e.g. like 'Peek References'"],"vs/editor/contrib/find/browser/findController":["The file is too large to perform a replace all operation.","Find","&&Find","Find With Arguments","Find With Selection","Find Next","Find Previous","Go to Match...","No matches. Try searching for something else.","Type a number to go to a specific match (between 1 and {0})","Please type a number between 1 and {0}","Please type a number between 1 and {0}","Find Next Selection","Find Previous Selection","Replace","&&Replace"],"vs/editor/contrib/find/browser/findWidget":["Icon for 'Find in Selection' in the editor find widget.","Icon to indicate that the editor find widget is collapsed.","Icon to indicate that the editor find widget is expanded.","Icon for 'Replace' in the editor find widget.","Icon for 'Replace All' in the editor find widget.","Icon for 'Find Previous' in the editor find widget.","Icon for 'Find Next' in the editor find widget.","Find / Replace","Find","Find","Previous Match","Next Match","Find in Selection","Close","Replace","Replace","Replace","Replace All","Toggle Replace","Only the first {0} results are highlighted, but all find operations work on the entire text.","{0} of {1}","No results","{0} found","{0} found for '{1}'","{0} found for '{1}', at {2}","{0} found for '{1}'","Ctrl+Enter now inserts line break instead of replacing all. You can modify the keybinding for editor.action.replaceAll to override this behavior."],"vs/editor/contrib/folding/browser/folding":["Unfold","Unfold Recursively","Fold","Toggle Fold","Fold Recursively","Fold All Block Comments","Fold All Regions","Unfold All Regions","Fold All Except Selected","Unfold All Except Selected","Fold All","Unfold All","Go to Parent Fold","Go to Previous Folding Range","Go to Next Folding Range","Create Folding Range from Selection","Remove Manual Folding Ranges","Fold Level {0}"],"vs/editor/contrib/folding/browser/foldingDecorations":["Background color behind folded ranges. The color must not be opaque so as not to hide underlying decorations.","Color of the folding control in the editor gutter.","Icon for expanded ranges in the editor glyph margin.","Icon for collapsed ranges in the editor glyph margin.","Icon for manually collapsed ranges in the editor glyph margin.","Icon for manually expanded ranges in the editor glyph margin.","Click to expand the range.","Click to collapse the range."],"vs/editor/contrib/fontZoom/browser/fontZoom":["Increase Editor Font Size","Decrease Editor Font Size","Reset Editor Font Size"],"vs/editor/contrib/format/browser/formatActions":["Format Document","Format Selection"],"vs/editor/contrib/gotoError/browser/gotoError":["Go to Next Problem (Error, Warning, Info)","Icon for goto next marker.","Go to Previous Problem (Error, Warning, Info)","Icon for goto previous marker.","Go to Next Problem in Files (Error, Warning, Info)","Next &&Problem","Go to Previous Problem in Files (Error, Warning, Info)","Previous &&Problem"],"vs/editor/contrib/gotoError/browser/gotoErrorWidget":["Error","Warning","Info","Hint","{0} at {1}. ","{0} of {1} problems","{0} of {1} problem","Editor marker navigation widget error color.","Editor marker navigation widget error heading background.","Editor marker navigation widget warning color.","Editor marker navigation widget warning heading background.","Editor marker navigation widget info color.","Editor marker navigation widget info heading background.","Editor marker navigation widget background."],"vs/editor/contrib/gotoSymbol/browser/goToCommands":["Peek","Definitions","No definition found for '{0}'","No definition found","Go to Definition","Go to &&Definition","Open Definition to the Side","Peek Definition","Declarations","No declaration found for '{0}'","No declaration found","Go to Declaration","Go to &&Declaration","No declaration found for '{0}'","No declaration found","Peek Declaration","Type Definitions","No type definition found for '{0}'","No type definition found","Go to Type Definition","Go to &&Type Definition","Peek Type Definition","Implementations","No implementation found for '{0}'","No implementation found","Go to Implementations","Go to &&Implementations","Peek Implementations","No references found for '{0}'","No references found","Go to References","Go to &&References","References","Peek References","References","Go to Any Symbol","Locations","No results for '{0}'","References"],"vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition":["Click to show {0} definitions."],"vs/editor/contrib/gotoSymbol/browser/peek/referencesController":["Whether reference peek is visible, like 'Peek References' or 'Peek Definition'","Loading...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesTree":["{0} references","{0} reference","References"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget":["no preview available","No results","References"],"vs/editor/contrib/gotoSymbol/browser/referencesModel":["in {0} on line {1} at column {2}","{0} in {1} on line {2} at column {3}","1 symbol in {0}, full path {1}","{0} symbols in {1}, full path {2}","No results found","Found 1 symbol in {0}","Found {0} symbols in {1}","Found {0} symbols in {1} files"],"vs/editor/contrib/gotoSymbol/browser/symbolNavigation":["Whether there are symbol locations that can be navigated via keyboard-only.","Symbol {0} of {1}, {2} for next","Symbol {0} of {1}"],"vs/editor/contrib/hover/browser/hover":["Show or Focus Hover","The hover will not automatically take focus.","The hover will take focus only if it is already visible.","The hover will automatically take focus when it appears.","Show Definition Preview Hover","Scroll Up Hover","Scroll Down Hover","Scroll Left Hover","Scroll Right Hover","Page Up Hover","Page Down Hover","Go To Top Hover","Go To Bottom Hover"],"vs/editor/contrib/hover/browser/markdownHoverParticipant":["Loading...","Rendering paused for long line for performance reasons. This can be configured via `editor.stopRenderingLineAfter`.","Tokenization is skipped for long lines for performance reasons. This can be configured via `editor.maxTokenizationLineLength`."],"vs/editor/contrib/hover/browser/markerHoverParticipant":["View Problem","No quick fixes available","Checking for quick fixes...","No quick fixes available","Quick Fix..."],"vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace":["Replace with Previous Value","Replace with Next Value"],"vs/editor/contrib/indentation/browser/indentation":["Convert Indentation to Spaces","Convert Indentation to Tabs","Configured Tab Size","Default Tab Size","Current Tab Size","Select Tab Size for Current File","Indent Using Tabs","Indent Using Spaces","Change Tab Display Size","Detect Indentation from Content","Reindent Lines","Reindent Selected Lines"],"vs/editor/contrib/inlayHints/browser/inlayHintsHover":["Double-click to insert","cmd + click","ctrl + click","option + click","alt + click","Go to Definition ({0}), right click for more","Go to Definition ({0})","Execute Command"],"vs/editor/contrib/inlineCompletions/browser/commands":["Show Next Inline Suggestion","Show Previous Inline Suggestion","Trigger Inline Suggestion","Accept Next Word Of Inline Suggestion","Accept Word","Accept Next Line Of Inline Suggestion","Accept Line","Accept Inline Suggestion","Accept","Hide Inline Suggestion","Always Show Toolbar"],"vs/editor/contrib/inlineCompletions/browser/hoverParticipant":["Suggestion:"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys":["Whether an inline suggestion is visible","Whether the inline suggestion starts with whitespace","Whether the inline suggestion starts with whitespace that is less than what would be inserted by tab","Whether suggestions should be suppressed for the current suggestion"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController":["Inspect this in the accessible view ({0})"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget":["Icon for show next parameter hint.","Icon for show previous parameter hint.","{0} ({1})","Previous","Next"],"vs/editor/contrib/lineSelection/browser/lineSelection":["Expand Line Selection"],"vs/editor/contrib/linesOperations/browser/linesOperations":["Copy Line Up","&&Copy Line Up","Copy Line Down","Co&&py Line Down","Duplicate Selection","&&Duplicate Selection","Move Line Up","Mo&&ve Line Up","Move Line Down","Move &&Line Down","Sort Lines Ascending","Sort Lines Descending","Delete Duplicate Lines","Trim Trailing Whitespace","Delete Line","Indent Line","Outdent Line","Insert Line Above","Insert Line Below","Delete All Left","Delete All Right","Join Lines","Transpose Characters around the Cursor","Transform to Uppercase","Transform to Lowercase","Transform to Title Case","Transform to Snake Case","Transform to Camel Case","Transform to Kebab Case"],"vs/editor/contrib/linkedEditing/browser/linkedEditing":["Start Linked Editing","Background color when the editor auto renames on type."],"vs/editor/contrib/links/browser/links":["Failed to open this link because it is not well-formed: {0}","Failed to open this link because its target is missing.","Execute command","Follow link","cmd + click","ctrl + click","option + click","alt + click","Execute command {0}","Open Link"],"vs/editor/contrib/message/browser/messageController":["Whether the editor is currently showing an inline message"],"vs/editor/contrib/multicursor/browser/multicursor":["Cursor added: {0}","Cursors added: {0}","Add Cursor Above","&&Add Cursor Above","Add Cursor Below","A&&dd Cursor Below","Add Cursors to Line Ends","Add C&&ursors to Line Ends","Add Cursors To Bottom","Add Cursors To Top","Add Selection To Next Find Match","Add &&Next Occurrence","Add Selection To Previous Find Match","Add P&&revious Occurrence","Move Last Selection To Next Find Match","Move Last Selection To Previous Find Match","Select All Occurrences of Find Match","Select All &&Occurrences","Change All Occurrences","Focus Next Cursor","Focuses the next cursor","Focus Previous Cursor","Focuses the previous cursor"],"vs/editor/contrib/parameterHints/browser/parameterHints":["Trigger Parameter Hints"],"vs/editor/contrib/parameterHints/browser/parameterHintsWidget":["Icon for show next parameter hint.","Icon for show previous parameter hint.","{0}, hint","Foreground color of the active item in the parameter hint."],"vs/editor/contrib/peekView/browser/peekView":["Whether the current code editor is embedded inside peek","Close","Background color of the peek view title area.","Color of the peek view title.","Color of the peek view title info.","Color of the peek view borders and arrow.","Background color of the peek view result list.","Foreground color for line nodes in the peek view result list.","Foreground color for file nodes in the peek view result list.","Background color of the selected entry in the peek view result list.","Foreground color of the selected entry in the peek view result list.","Background color of the peek view editor.","Background color of the gutter in the peek view editor.","Background color of sticky scroll in the peek view editor.","Match highlight color in the peek view result list.","Match highlight color in the peek view editor.","Match highlight border in the peek view editor."],"vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess":["Open a text editor first to go to a line.","Go to line {0} and character {1}.","Go to line {0}.","Current Line: {0}, Character: {1}. Type a line number between 1 and {2} to navigate to.","Current Line: {0}, Character: {1}. Type a line number to navigate to."],"vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess":["To go to a symbol, first open a text editor with symbol information.","The active text editor does not provide symbol information.","No matching editor symbols","No editor symbols","Open to the Side","Open to the Bottom","symbols ({0})","properties ({0})","methods ({0})","functions ({0})","constructors ({0})","variables ({0})","classes ({0})","structs ({0})","events ({0})","operators ({0})","interfaces ({0})","namespaces ({0})","packages ({0})","type parameters ({0})","modules ({0})","properties ({0})","enumerations ({0})","enumeration members ({0})","strings ({0})","files ({0})","arrays ({0})","numbers ({0})","booleans ({0})","objects ({0})","keys ({0})","fields ({0})","constants ({0})"],"vs/editor/contrib/readOnlyMessage/browser/contribution":["Cannot edit in read-only input","Cannot edit in read-only editor"],"vs/editor/contrib/rename/browser/rename":["No result.","An unknown error occurred while resolving rename location","Renaming '{0}' to '{1}'","Renaming {0} to {1}","Successfully renamed '{0}' to '{1}'. Summary: {2}","Rename failed to apply edits","Rename failed to compute edits","Rename Symbol","Enable/disable the ability to preview changes before renaming"],"vs/editor/contrib/rename/browser/renameInputField":["Whether the rename input widget is visible","Rename input. Type new name and press Enter to commit.","{0} to Rename, {1} to Preview"],"vs/editor/contrib/smartSelect/browser/smartSelect":["Expand Selection","&&Expand Selection","Shrink Selection","&&Shrink Selection"],"vs/editor/contrib/snippet/browser/snippetController2":["Whether the editor in current in snippet mode","Whether there is a next tab stop when in snippet mode","Whether there is a previous tab stop when in snippet mode","Go to next placeholder..."],"vs/editor/contrib/snippet/browser/snippetVariables":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sun","Mon","Tue","Wed","Thu","Fri","Sat","January","February","March","April","May","June","July","August","September","October","November","December","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"vs/editor/contrib/stickyScroll/browser/stickyScrollActions":["Toggle Editor Sticky Scroll","&&Toggle Editor Sticky Scroll","Sticky Scroll","&&Sticky Scroll","Focus Sticky Scroll","&&Focus Sticky Scroll","Select next sticky scroll line","Select previous sticky scroll line","Go to focused sticky scroll line","Select Editor"],"vs/editor/contrib/suggest/browser/suggest":["Whether any suggestion is focused","Whether suggestion details are visible","Whether there are multiple suggestions to pick from","Whether inserting the current suggestion yields in a change or has everything already been typed","Whether suggestions are inserted when pressing Enter","Whether the current suggestion has insert and replace behaviour","Whether the default behaviour is to insert or replace","Whether the current suggestion supports to resolve further details"],"vs/editor/contrib/suggest/browser/suggestController":["Accepting '{0}' made {1} additional edits","Trigger Suggest","Insert","Insert","Replace","Replace","Insert","show less","show more","Reset Suggest Widget Size"],"vs/editor/contrib/suggest/browser/suggestWidget":["Background color of the suggest widget.","Border color of the suggest widget.","Foreground color of the suggest widget.","Foreground color of the selected entry in the suggest widget.","Icon foreground color of the selected entry in the suggest widget.","Background color of the selected entry in the suggest widget.","Color of the match highlights in the suggest widget.","Color of the match highlights in the suggest widget when an item is focused.","Foreground color of the suggest widget status.","Loading...","No suggestions.","Suggest","{0} {1}, {2}","{0} {1}","{0}, {1}","{0}, docs: {1}"],"vs/editor/contrib/suggest/browser/suggestWidgetDetails":["Close","Loading..."],"vs/editor/contrib/suggest/browser/suggestWidgetRenderer":["Icon for more information in the suggest widget.","Read More"],"vs/editor/contrib/suggest/browser/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/browser/symbolIcons":["The foreground color for array symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for boolean symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for class symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for color symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for constant symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for constructor symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for enumerator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for enumerator member symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for event symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for field symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for file symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for folder symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for function symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for interface symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for key symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for keyword symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for method symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for module symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for namespace symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for null symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for number symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for object symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for operator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for package symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for property symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for reference symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for snippet symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for string symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for struct symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for text symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for type parameter symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for unit symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for variable symbols. These symbols appear in the outline, breadcrumb, and suggest widget."],"vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode":["Toggle Tab Key Moves Focus","Pressing Tab will now move focus to the next focusable element","Pressing Tab will now insert the tab character"],"vs/editor/contrib/tokenization/browser/tokenization":["Developer: Force Retokenize"],"vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter":["Icon shown with a warning message in the extensions editor.","This document contains many non-basic ASCII unicode characters","This document contains many ambiguous unicode characters","This document contains many invisible unicode characters","Configure Unicode Highlight Options","The character {0} could be confused with the ASCII character {1}, which is more common in source code.","The character {0} could be confused with the character {1}, which is more common in source code.","The character {0} is invisible.","The character {0} is not a basic ASCII character.","Adjust settings","Disable Highlight In Comments","Disable highlighting of characters in comments","Disable Highlight In Strings","Disable highlighting of characters in strings","Disable Ambiguous Highlight","Disable highlighting of ambiguous characters","Disable Invisible Highlight","Disable highlighting of invisible characters","Disable Non ASCII Highlight","Disable highlighting of non basic ASCII characters","Show Exclude Options","Exclude {0} (invisible character) from being highlighted","Exclude {0} from being highlighted",'Allow unicode characters that are more common in the language "{0}".'],"vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators":["Unusual Line Terminators","Detected unusual line terminators","The file '{0}' contains one or more unusual line terminator characters, like Line Separator (LS) or Paragraph Separator (PS).\n\nIt is recommended to remove them from the file. This can be configured via `editor.unusualLineTerminators`.","&&Remove Unusual Line Terminators","Ignore"],"vs/editor/contrib/wordHighlighter/browser/highlightDecorations":["Background color of a symbol during read-access, like reading a variable. The color must not be opaque so as not to hide underlying decorations.","Background color of a symbol during write-access, like writing to a variable. The color must not be opaque so as not to hide underlying decorations.","Background color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations.","Border color of a symbol during read-access, like reading a variable.","Border color of a symbol during write-access, like writing to a variable.","Border color of a textual occurrence for a symbol.","Overview ruler marker color for symbol highlights. The color must not be opaque so as not to hide underlying decorations.","Overview ruler marker color for write-access symbol highlights. The color must not be opaque so as not to hide underlying decorations.","Overview ruler marker color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations."],"vs/editor/contrib/wordHighlighter/browser/wordHighlighter":["Go to Next Symbol Highlight","Go to Previous Symbol Highlight","Trigger Symbol Highlight"],"vs/editor/contrib/wordOperations/browser/wordOperations":["Delete Word"],"vs/platform/action/common/actionCommonCategories":["Developer","View","Help","Test","File","Preferences"],"vs/platform/actionWidget/browser/actionList":["{0} to apply, {1} to preview","{0} to apply","{0}, Disabled Reason: {1}","Action Widget"],"vs/platform/actionWidget/browser/actionWidget":["Background color for toggled action items in action bar.","Whether the action widget list is visible","Hide action widget","Select previous action","Select next action","Accept selected action","Preview selected action"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})","{0} ({1})",`{0}
+[{1}] {2}`],"vs/platform/actions/browser/toolbar":["Hide","Reset Menu"],"vs/platform/actions/common/menuService":["Hide '{0}'"],"vs/platform/audioCues/browser/audioCueService":["Error on Line","Error","Warning on Line","Warning","Folded Area on Line","Folded","Breakpoint on Line","Breakpoint","Inline Suggestion on Line","Terminal Quick Fix","Quick Fix","Debugger Stopped on Breakpoint","Breakpoint","No Inlay Hints on Line","No Inlay Hints","Task Completed","Task Completed","Task Failed","Task Failed","Terminal Command Failed","Command Failed","Terminal Bell","Terminal Bell","Notebook Cell Completed","Notebook Cell Completed","Notebook Cell Failed","Notebook Cell Failed","Diff Line Inserted","Diff Line Deleted","Diff Line Modified","Chat Request Sent","Chat Request Sent","Chat Response Received","Chat Response Pending","Chat Response Pending","Clear","Clear","Save","Save","Format","Format"],"vs/platform/configuration/common/configurationRegistry":["Default Language Configuration Overrides","Configure settings to be overridden for the {0} language.","Configure editor settings to be overridden for a language.","This setting does not support per-language configuration.","Configure editor settings to be overridden for a language.","This setting does not support per-language configuration.","Cannot register an empty property","Cannot register '{0}'. This matches property pattern '\\\\[.*\\\\]$' for describing language specific editor settings. Use 'configurationDefaults' contribution.","Cannot register '{0}'. This property is already registered.","Cannot register '{0}'. The associated policy {1} is already registered with {2}."],"vs/platform/contextkey/browser/contextKeyService":["A command that returns information about context keys"],"vs/platform/contextkey/common/contextkey":["Empty context key expression","Did you forget to write an expression? You can also put 'false' or 'true' to always evaluate to false or true, respectively.","'in' after 'not'.","closing parenthesis ')'","Unexpected token","Did you forget to put && or || before the token?","Unexpected end of expression","Did you forget to put a context key?",`Expected: {0}
+Received: '{1}'.`],"vs/platform/contextkey/common/contextkeys":["Whether the operating system is macOS","Whether the operating system is Linux","Whether the operating system is Windows","Whether the platform is a web browser","Whether the operating system is macOS on a non-browser platform","Whether the operating system is iOS","Whether the platform is a mobile web browser","Quality type of VS Code","Whether keyboard focus is inside an input box"],"vs/platform/contextkey/common/scanner":["Did you mean {0}?","Did you mean {0} or {1}?","Did you mean {0}, {1} or {2}?","Did you forget to open or close the quote?","Did you forget to escape the '/' (slash) character? Put two backslashes before it to escape, e.g., '\\\\/'."],"vs/platform/history/browser/contextScopedHistoryWidget":["Whether suggestion are visible"],"vs/platform/keybinding/common/abstractKeybindingService":["({0}) was pressed. Waiting for second key of chord...","({0}) was pressed. Waiting for next key of chord...","The key combination ({0}, {1}) is not a command.","The key combination ({0}, {1}) is not a command."],"vs/platform/list/browser/listService":["Workbench","Maps to `Control` on Windows and Linux and to `Command` on macOS.","Maps to `Alt` on Windows and Linux and to `Option` on macOS.","The modifier to be used to add an item in trees and lists to a multi-selection with the mouse (for example in the explorer, open editors and scm view). The 'Open to Side' mouse gestures - if supported - will adapt such that they do not conflict with the multiselect modifier.","Controls how to open items in trees and lists using the mouse (if supported). Note that some trees and lists might choose to ignore this setting if it is not applicable.","Controls whether lists and trees support horizontal scrolling in the workbench. Warning: turning on this setting has a performance implication.","Controls whether clicks in the scrollbar scroll page by page.","Controls tree indentation in pixels.","Controls whether the tree should render indent guides.","Controls whether lists and trees have smooth scrolling.","A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.","Scrolling speed multiplier when pressing `Alt`.","Highlight elements when searching. Further up and down navigation will traverse only the highlighted elements.","Filter elements when searching.","Controls the default find mode for lists and trees in the workbench.","Simple keyboard navigation focuses elements which match the keyboard input. Matching is done only on prefixes.","Highlight keyboard navigation highlights elements which match the keyboard input. Further up and down navigation will traverse only the highlighted elements.","Filter keyboard navigation will filter out and hide all the elements which do not match the keyboard input.","Controls the keyboard navigation style for lists and trees in the workbench. Can be simple, highlight and filter.","Please use 'workbench.list.defaultFindMode' and	'workbench.list.typeNavigationMode' instead.","Use fuzzy matching when searching.","Use contiguous matching when searching.","Controls the type of matching used when searching lists and trees in the workbench.","Controls how tree folders are expanded when clicking the folder names. Note that some trees and lists might choose to ignore this setting if it is not applicable.","Controls whether sticky scrolling is enabled in trees.","Controls the number of sticky elements displayed in the tree when `#workbench.tree.enableStickyScroll#` is enabled.","Controls how type navigation works in lists and trees in the workbench. When set to `trigger`, type navigation begins once the `list.triggerTypeNavigation` command is run."],"vs/platform/markers/common/markers":["Error","Warning","Info"],"vs/platform/quickinput/browser/commandsQuickAccess":["recently used","similar commands","commonly used","other commands","similar commands","{0}, {1}","Command '{0}' resulted in an error"],"vs/platform/quickinput/browser/helpQuickAccess":["{0}, {1}"],"vs/platform/quickinput/browser/quickInput":["Back","Press 'Enter' to confirm your input or 'Escape' to cancel","{0}/{1}","Type to narrow down results."],"vs/platform/quickinput/browser/quickInputController":["Toggle all checkboxes","{0} Results","{0} Selected","OK","Custom","Back ({0})","Back"],"vs/platform/quickinput/browser/quickInputList":["Quick Input"],"vs/platform/quickinput/browser/quickInputUtils":["Click to execute command '{0}'"],"vs/platform/theme/common/colorRegistry":["Overall foreground color. This color is only used if not overridden by a component.","Overall foreground for disabled elements. This color is only used if not overridden by a component.","Overall foreground color for error messages. This color is only used if not overridden by a component.","Foreground color for description text providing additional information, for example for a label.","The default color for icons in the workbench.","Overall border color for focused elements. This color is only used if not overridden by a component.","An extra border around elements to separate them from others for greater contrast.","An extra border around active elements to separate them from others for greater contrast.","The background color of text selections in the workbench (e.g. for input fields or text areas). Note that this does not apply to selections within the editor.","Color for text separators.","Foreground color for links in text.","Foreground color for links in text when clicked on and on mouse hover.","Foreground color for preformatted text segments.","Background color for preformatted text segments.","Background color for block quotes in text.","Border color for block quotes in text.","Background color for code blocks in text.","Shadow color of widgets such as find/replace inside the editor.","Border color of widgets such as find/replace inside the editor.","Input box background.","Input box foreground.","Input box border.","Border color of activated options in input fields.","Background color of activated options in input fields.","Background hover color of options in input fields.","Foreground color of activated options in input fields.","Input box foreground color for placeholder text.","Input validation background color for information severity.","Input validation foreground color for information severity.","Input validation border color for information severity.","Input validation background color for warning severity.","Input validation foreground color for warning severity.","Input validation border color for warning severity.","Input validation background color for error severity.","Input validation foreground color for error severity.","Input validation border color for error severity.","Dropdown background.","Dropdown list background.","Dropdown foreground.","Dropdown border.","Button foreground color.","Button separator color.","Button background color.","Button background color when hovering.","Button border color.","Secondary button foreground color.","Secondary button background color.","Secondary button background color when hovering.","Badge background color. Badges are small information labels, e.g. for search results count.","Badge foreground color. Badges are small information labels, e.g. for search results count.","Scrollbar shadow to indicate that the view is scrolled.","Scrollbar slider background color.","Scrollbar slider background color when hovering.","Scrollbar slider background color when clicked on.","Background color of the progress bar that can show for long running operations.","Background color of error text in the editor. The color must not be opaque so as not to hide underlying decorations.","Foreground color of error squigglies in the editor.","If set, color of double underlines for errors in the editor.","Background color of warning text in the editor. The color must not be opaque so as not to hide underlying decorations.","Foreground color of warning squigglies in the editor.","If set, color of double underlines for warnings in the editor.","Background color of info text in the editor. The color must not be opaque so as not to hide underlying decorations.","Foreground color of info squigglies in the editor.","If set, color of double underlines for infos in the editor.","Foreground color of hint squigglies in the editor.","If set, color of double underlines for hints in the editor.","Border color of active sashes.","Editor background color.","Editor default foreground color.","Background color of sticky scroll in the editor","Background color of sticky scroll on hover in the editor","Border color of sticky scroll in the editor"," Shadow color of sticky scroll in the editor","Background color of editor widgets, such as find/replace.","Foreground color of editor widgets, such as find/replace.","Border color of editor widgets. The color is only used if the widget chooses to have a border and if the color is not overridden by a widget.","Border color of the resize bar of editor widgets. The color is only used if the widget chooses to have a resize border and if the color is not overridden by a widget.","Quick picker background color. The quick picker widget is the container for pickers like the command palette.","Quick picker foreground color. The quick picker widget is the container for pickers like the command palette.","Quick picker title background color. The quick picker widget is the container for pickers like the command palette.","Quick picker color for grouping labels.","Quick picker color for grouping borders.","Keybinding label background color. The keybinding label is used to represent a keyboard shortcut.","Keybinding label foreground color. The keybinding label is used to represent a keyboard shortcut.","Keybinding label border color. The keybinding label is used to represent a keyboard shortcut.","Keybinding label border bottom color. The keybinding label is used to represent a keyboard shortcut.","Color of the editor selection.","Color of the selected text for high contrast.","Color of the selection in an inactive editor. The color must not be opaque so as not to hide underlying decorations.","Color for regions with the same content as the selection. The color must not be opaque so as not to hide underlying decorations.","Border color for regions with the same content as the selection.","Color of the current search match.","Color of the other search matches. The color must not be opaque so as not to hide underlying decorations.","Color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations.","Border color of the current search match.","Border color of the other search matches.","Border color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations.","Color of the Search Editor query matches.","Border color of the Search Editor query matches.","Color of the text in the search viewlet's completion message.","Highlight below the word for which a hover is shown. The color must not be opaque so as not to hide underlying decorations.","Background color of the editor hover.","Foreground color of the editor hover.","Border color of the editor hover.","Background color of the editor hover status bar.","Color of active links.","Foreground color of inline hints","Background color of inline hints","Foreground color of inline hints for types","Background color of inline hints for types","Foreground color of inline hints for parameters","Background color of inline hints for parameters","The color used for the lightbulb actions icon.","The color used for the lightbulb auto fix actions icon.","The color used for the lightbulb AI icon.","Background color for text that got inserted. The color must not be opaque so as not to hide underlying decorations.","Background color for text that got removed. The color must not be opaque so as not to hide underlying decorations.","Background color for lines that got inserted. The color must not be opaque so as not to hide underlying decorations.","Background color for lines that got removed. The color must not be opaque so as not to hide underlying decorations.","Background color for the margin where lines got inserted.","Background color for the margin where lines got removed.","Diff overview ruler foreground for inserted content.","Diff overview ruler foreground for removed content.","Outline color for the text that got inserted.","Outline color for text that got removed.","Border color between the two text editors.","Color of the diff editor's diagonal fill. The diagonal fill is used in side-by-side diff views.","The background color of unchanged blocks in the diff editor.","The foreground color of unchanged blocks in the diff editor.","The background color of unchanged code in the diff editor.","List/Tree background color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree foreground color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree outline color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree outline color for the focused item when the list/tree is active and selected. An active list/tree has keyboard focus, an inactive does not.","List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree icon foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","List/Tree icon foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","List/Tree background color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","List/Tree outline color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","List/Tree background when hovering over items using the mouse.","List/Tree foreground when hovering over items using the mouse.","List/Tree drag and drop background when moving items over other items when using the mouse.","List/Tree drag and drop border color when moving items between items when using the mouse.","List/Tree foreground color of the match highlights when searching inside the list/tree.","List/Tree foreground color of the match highlights on actively focused items when searching inside the list/tree.","List/Tree foreground color for invalid items, for example an unresolved root in explorer.","Foreground color of list items containing errors.","Foreground color of list items containing warnings.","Background color of the type filter widget in lists and trees.","Outline color of the type filter widget in lists and trees.","Outline color of the type filter widget in lists and trees, when there are no matches.","Shadow color of the type filter widget in lists and trees.","Background color of the filtered match.","Border color of the filtered match.","Tree stroke color for the indentation guides.","Tree stroke color for the indentation guides that are not active.","Table border color between columns.","Background color for odd table rows.","List/Tree foreground color for items that are deemphasized. ","Background color of checkbox widget.","Background color of checkbox widget when the element it's in is selected.","Foreground color of checkbox widget.","Border color of checkbox widget.","Border color of checkbox widget when the element it's in is selected.","Please use quickInputList.focusBackground instead","Quick picker foreground color for the focused item.","Quick picker icon foreground color for the focused item.","Quick picker background color for the focused item.","Border color of menus.","Foreground color of menu items.","Background color of menu items.","Foreground color of the selected menu item in menus.","Background color of the selected menu item in menus.","Border color of the selected menu item in menus.","Color of a separator menu item in menus.","Toolbar background when hovering over actions using the mouse","Toolbar outline when hovering over actions using the mouse","Toolbar background when holding the mouse over actions","Highlight background color of a snippet tabstop.","Highlight border color of a snippet tabstop.","Highlight background color of the final tabstop of a snippet.","Highlight border color of the final tabstop of a snippet.","Color of focused breadcrumb items.","Background color of breadcrumb items.","Color of focused breadcrumb items.","Color of selected breadcrumb items.","Background color of breadcrumb item picker.","Current header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.","Current content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.","Incoming header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.","Incoming content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.","Common ancestor header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.","Common ancestor content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.","Border color on headers and the splitter in inline merge-conflicts.","Current overview ruler foreground for inline merge-conflicts.","Incoming overview ruler foreground for inline merge-conflicts.","Common ancestor overview ruler foreground for inline merge-conflicts.","Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations.","Overview ruler marker color for selection highlights. The color must not be opaque so as not to hide underlying decorations.","Minimap marker color for find matches.","Minimap marker color for repeating editor selections.","Minimap marker color for the editor selection.","Minimap marker color for infos.","Minimap marker color for warnings.","Minimap marker color for errors.","Minimap background color.",'Opacity of foreground elements rendered in the minimap. For example, "#000000c0" will render the elements with 75% opacity.',"Minimap slider background color.","Minimap slider background color when hovering.","Minimap slider background color when clicked on.","The color used for the problems error icon.","The color used for the problems warning icon.","The color used for the problems info icon.","The foreground color used in charts.","The color used for horizontal lines in charts.","The red color used in chart visualizations.","The blue color used in chart visualizations.","The yellow color used in chart visualizations.","The orange color used in chart visualizations.","The green color used in chart visualizations.","The purple color used in chart visualizations."],"vs/platform/theme/common/iconRegistry":["The id of the font to use. If not set, the font that is defined first is used.","The font character associated with the icon definition.","Icon for the close action in widgets.","Icon for goto previous editor location.","Icon for goto next editor location."],"vs/platform/undoRedo/common/undoRedoService":["The following files have been closed and modified on disk: {0}.","The following files have been modified in an incompatible way: {0}.","Could not undo '{0}' across all files. {1}","Could not undo '{0}' across all files. {1}","Could not undo '{0}' across all files because changes were made to {1}","Could not undo '{0}' across all files because there is already an undo or redo operation running on {1}","Could not undo '{0}' across all files because an undo or redo operation occurred in the meantime","Would you like to undo '{0}' across all files?","&&Undo in {0} Files","Undo this &&File","Could not undo '{0}' because there is already an undo or redo operation running.","Would you like to undo '{0}'?","&&Yes","No","Could not redo '{0}' across all files. {1}","Could not redo '{0}' across all files. {1}","Could not redo '{0}' across all files because changes were made to {1}","Could not redo '{0}' across all files because there is already an undo or redo operation running on {1}","Could not redo '{0}' across all files because an undo or redo operation occurred in the meantime","Could not redo '{0}' because there is already an undo or redo operation running."],"vs/platform/workspace/common/workspace":["Code Workspace"]});
+
+//# sourceMappingURL=../../../min-maps/vs/editor/editor.main.nls.js.map
\ No newline at end of file
diff --git a/public/vs/editor/editor.main.nls.ko.js b/public/vs/editor/editor.main.nls.ko.js
new file mode 100644
index 0000000..f9e2757
--- /dev/null
+++ b/public/vs/editor/editor.main.nls.ko.js
@@ -0,0 +1,13 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.ko",{"vs/base/browser/ui/actionbar/actionViewItems":["{0}({1})"],"vs/base/browser/ui/findinput/findInput":["\uC785\uB825"],"vs/base/browser/ui/findinput/findInputToggles":["\uB300/\uC18C\uBB38\uC790 \uAD6C\uBD84","\uB2E8\uC5B4 \uB2E8\uC704\uB85C","\uC815\uADDC\uC2DD \uC0AC\uC6A9"],"vs/base/browser/ui/findinput/replaceInput":["\uC785\uB825","\uB300/\uC18C\uBB38\uC790 \uBCF4\uC874"],"vs/base/browser/ui/hover/hoverWidget":["{0}\uC744(\uB97C) \uC0AC\uC6A9\uD558\uC5EC \uC811\uADFC\uC131 \uBCF4\uAE30\uC5D0\uC11C \uC774\uB97C \uAC80\uC0AC\uD569\uB2C8\uB2E4.","\uD604\uC7AC \uD0A4 \uBC14\uC778\uB529\uC744 \uD1B5\uD574 \uD2B8\uB9AC\uAC70\uD560 \uC218 \uC5C6\uB294 \uC811\uADFC\uC131 \uBCF4\uAE30 \uC5F4\uAE30 \uBA85\uB839\uC744 \uD1B5\uD574 \uC811\uADFC\uC131 \uBCF4\uAE30\uC5D0\uC11C \uC774\uB97C \uAC80\uC0AC\uD569\uB2C8\uB2E4."],"vs/base/browser/ui/iconLabel/iconLabelHover":["\uB85C\uB4DC \uC911..."],"vs/base/browser/ui/inputbox/inputBox":["\uC624\uB958: {0}","\uACBD\uACE0: {0}","\uC815\uBCF4: {0}"," \uB610\uB294 {0} \uAE30\uB85D\uC758 \uACBD\uC6B0"," ({0} \uAE30\uB85D\uC6A9)","\uC785\uB825\uC774 \uC9C0\uC6CC\uC9D0"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\uBC14\uC778\uB529 \uC548 \uB428"],"vs/base/browser/ui/selectBox/selectBoxCustom":["Box \uC120\uD0DD"],"vs/base/browser/ui/toolbar/toolbar":["\uAE30\uD0C0 \uC791\uC5C5..."],"vs/base/browser/ui/tree/abstractTree":["\uD544\uD130","\uC720\uC0AC \uD56D\uBAA9 \uC77C\uCE58","\uD544\uD130\uB9C1\uD560 \uD615\uC2DD","\uC785\uB825\uD558\uC5EC \uAC80\uC0C9","\uC785\uB825\uD558\uC5EC \uAC80\uC0C9","\uB2EB\uAE30","\uCC3E\uC740 \uC694\uC18C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."],"vs/base/common/actions":["(\uBE44\uC5B4 \uC788\uC74C)"],"vs/base/common/errorMessage":["{0}: {1}","\uC2DC\uC2A4\uD15C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4({0}).","\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uB0B4\uC6A9\uC740 \uB85C\uADF8\uB97C \uCC38\uC870\uD558\uC138\uC694.","\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uB0B4\uC6A9\uC740 \uB85C\uADF8\uB97C \uCC38\uC870\uD558\uC138\uC694.","{0}(\uCD1D {1}\uAC1C\uC758 \uC624\uB958)","\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uB0B4\uC6A9\uC740 \uB85C\uADF8\uB97C \uCC38\uC870\uD558\uC138\uC694."],"vs/base/common/keybindingLabels":["Ctrl","Shift","<Alt>","Windows","Ctrl","Shift","<Alt>","\uC288\uD37C","Ctrl","Shift","\uC635\uC158","\uBA85\uB839","Ctrl","Shift","<Alt>","Windows","Ctrl","Shift","<Alt>","\uC288\uD37C"],"vs/base/common/platform":["_"],"vs/editor/browser/controller/textAreaHandler":["\uD3B8\uC9D1\uAE30","\uD604\uC7AC \uD3B8\uC9D1\uAE30\uC5D0 \uC561\uC138\uC2A4\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","{0} \uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8 \uCD5C\uC801\uD654 \uBAA8\uB4DC\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD558\uB824\uBA74 {1}","{0} \uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8 \uCD5C\uC801\uD654 \uBAA8\uB4DC\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD558\uB824\uBA74 {1}\uC744(\uB97C) \uC0AC\uC6A9\uD558\uC5EC \uBE60\uB978 \uC120\uD0DD\uC744 \uC5F4\uACE0 \uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8 \uC811\uADFC\uC131 \uBAA8\uB4DC \uD1A0\uAE00 \uBA85\uB839\uC744 \uC2E4\uD589\uD569\uB2C8\uB2E4(\uC774 \uBA85\uB839\uC740 \uD604\uC7AC \uD0A4\uBCF4\uB4DC\uB97C \uD1B5\uD574 \uD2B8\uB9AC\uAC70\uD560 \uC218 \uC5C6\uC74C).","{0} {1}\uC744(\uB97C) \uC0AC\uC6A9\uD558\uC5EC \uD0A4 \uBC14\uC778\uB529 \uD3B8\uC9D1\uAE30\uC5D0 \uC561\uC138\uC2A4\uD558\uC5EC \uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8 \uC811\uADFC\uC131 \uBAA8\uB4DC \uD1A0\uAE00 \uBA85\uB839\uC5D0 \uB300\uD55C \uD0A4 \uBC14\uC778\uB529\uC744 \uD560\uB2F9\uD558\uACE0 \uC2E4\uD589\uD558\uC138\uC694."],"vs/editor/browser/coreCommands":["\uB354 \uAE34 \uC904\uB85C \uC774\uB3D9\uD558\uB294 \uACBD\uC6B0\uC5D0\uB3C4 \uB05D\uC5D0 \uACE0\uC815","\uB354 \uAE34 \uC904\uB85C \uC774\uB3D9\uD558\uB294 \uACBD\uC6B0\uC5D0\uB3C4 \uB05D\uC5D0 \uACE0\uC815","\uBCF4\uC870 \uCEE4\uC11C\uAC00 \uC81C\uAC70\uB428"],"vs/editor/browser/editorExtensions":["\uC2E4\uD589 \uCDE8\uC18C(&&U)","\uC2E4\uD589 \uCDE8\uC18C","\uB2E4\uC2DC \uC2E4\uD589(&&R)","\uB2E4\uC2DC \uC2E4\uD589","\uBAA8\uB450 \uC120\uD0DD(&&S)","\uBAA8\uB450 \uC120\uD0DD"],"vs/editor/browser/widget/codeEditorWidget":["\uCEE4\uC11C \uC218\uB97C {0}\uAC1C\uB85C \uC81C\uD55C\uD588\uC2B5\uB2C8\uB2E4. \uB354 \uD070 \uBCC0\uACBD \uB0B4\uC6A9\uC744 \uC704\uD574\uC11C\uB294 [\uCC3E\uC544\uC11C \uAD50\uCCB4](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace)\uB97C \uC0AC\uC6A9\uD558\uAC70\uB098 \uD3B8\uC9D1\uAE30 \uB2E4\uC911 \uCEE4\uC11C \uC81C\uD55C \uC124\uC815\uC744 \uB298\uB9AC\uB294 \uAC83\uC774 \uC88B\uC2B5\uB2C8\uB2E4.","\uB2E4\uC911 \uCEE4\uC11C \uC81C\uD55C \uB298\uB9AC\uAE30"],"vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer":["\uC561\uC138\uC2A4 \uAC00\uB2A5\uD55C Diff \uBDF0\uC5B4\uC758 '\uC0BD\uC785' \uC544\uC774\uCF58.","\uC561\uC138\uC2A4 \uAC00\uB2A5\uD55C Diff \uBDF0\uC5B4\uC758 '\uC81C\uAC70' \uC544\uC774\uCF58.","\uC811\uADFC \uAC00\uB2A5\uD55C Diff \uBDF0\uC5B4\uC758 '\uB2EB\uAE30' \uC544\uC774\uCF58.","\uB2EB\uAE30","\uC561\uC138\uC2A4 \uAC00\uB2A5\uD55C Diff \uBDF0\uC5B4\uC785\uB2C8\uB2E4. \uD0D0\uC0C9\uD558\uB824\uBA74 \uC704\uCABD \uBC0F \uC544\uB798\uCABD \uD654\uC0B4\uD45C\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uBCC0\uACBD\uB41C \uC904 \uC5C6\uC74C","\uC120 1\uAC1C \uBCC0\uACBD\uB428","\uC904 {0}\uAC1C \uBCC0\uACBD\uB428","\uCC28\uC774 {0}/{1}: \uC6D0\uB798 \uC904 {2}, {3}, \uC218\uC815\uB41C \uC904 {4}, {5}","\uBE44\uC5B4 \uC788\uC74C","{0} \uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uC904 {1}","{0} \uC6D0\uB798 \uC904 {1} \uC218\uC815\uB41C \uC904 {2}","+ {0} \uC218\uC815\uB41C \uC904 {1}","- {0} \uC6D0\uB798 \uC904 {1}"],"vs/editor/browser/widget/diffEditor/components/diffEditorEditors":[" {0}\uC744(\uB97C) \uC0AC\uC6A9\uD558\uC5EC \uC811\uADFC\uC131 \uB3C4\uC6C0\uB9D0\uC744 \uC5FD\uB2C8\uB2E4."],"vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin":["\uC0AD\uC81C\uB41C \uC904 \uBCF5\uC0AC","\uC0AD\uC81C\uB41C \uC904 \uBCF5\uC0AC","\uBCC0\uACBD\uB41C \uC904 \uBCF5\uC0AC","\uBCC0\uACBD\uB41C \uC904 \uBCF5\uC0AC","\uC0AD\uC81C\uB41C \uC904 \uBCF5\uC0AC({0})","\uBCC0\uACBD\uB41C \uC904({0}) \uBCF5\uC0AC","\uC774 \uBCC0\uACBD \uB0B4\uC6A9 \uB418\uB3CC\uB9AC\uAE30"],"vs/editor/browser/widget/diffEditor/diffEditor.contribution":["\uACF5\uAC04\uC774 \uC81C\uD55C\uB41C \uACBD\uC6B0 \uC778\uB77C\uC778 \uBCF4\uAE30 \uC0AC\uC6A9","\uC774\uB3D9\uB41C \uCF54\uB4DC \uBE14\uB85D \uD45C\uC2DC","diff \uD3B8\uC9D1\uAE30","\uC561\uC138\uC2A4 \uAC00\uB2A5\uD55C Diff \uBDF0\uC5B4","\uC561\uC138\uC2A4 \uAC00\uB2A5\uD55C Diff \uBDF0\uC5B4 \uC5F4\uAE30","\uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uC601\uC5ED \uCD95\uC18C \uD1A0\uAE00","\uC774\uB3D9\uB41C \uCF54\uB4DC \uBE14\uB85D \uD45C\uC2DC \uD1A0\uAE00","\uACF5\uAC04\uC774 \uC81C\uD55C\uB41C \uACBD\uC6B0 \uC778\uB77C\uC778 \uBCF4\uAE30 \uC0AC\uC6A9 \uC124\uC815/\uD574\uC81C","\uC2A4\uC704\uCE58 \uCABD","\uBE44\uAD50 \uC774\uB3D9 \uC885\uB8CC","\uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uBAA8\uB4E0 \uC601\uC5ED \uCD95\uC18C","\uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uBAA8\uB4E0 \uC601\uC5ED \uD45C\uC2DC","\uB2E4\uC74C \uB2E4\uB978 \uD56D\uBAA9\uC73C\uB85C \uC774\uB3D9","\uB2E4\uC74C \uB2E4\uB978 \uD56D\uBAA9\uC73C\uB85C \uC774\uB3D9"],"vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature":["\uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uC601\uC5ED \uC811\uAE30","\uC704\uC5D0 \uC790\uC138\uD788 \uD45C\uC2DC\uD558\uB824\uBA74 \uD074\uB9AD\uD558\uAC70\uB098 \uB04C\uC5B4\uB2E4 \uB193\uAE30","\uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uC601\uC5ED \uD45C\uC2DC","\uC544\uB798\uC5D0 \uC790\uC138\uD788 \uD45C\uC2DC\uD558\uB824\uBA74 \uD074\uB9AD\uD558\uAC70\uB098 \uB04C\uC5B4\uB2E4 \uB193\uAE30","\uC228\uACA8\uC9C4 \uC120 {0}\uAC1C","\uB450 \uBC88 \uD074\uB9AD\uD558\uC5EC \uD3BC\uCE58\uAE30"],"vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature":["\uBCC0\uACBD \uC0AC\uD56D\uACFC \uD568\uAED8 \uCF54\uB4DC\uAC00 {0} - {1}\uC904\uB85C \uC774\uB3D9\uB428","\uBCC0\uACBD \uC0AC\uD56D\uACFC \uD568\uAED8 \uCF54\uB4DC\uAC00 {0} - {1}\uC904\uC5D0\uC11C \uC774\uB3D9\uB428","\uCF54\uB4DC\uAC00 {0} - {1}\uC904\uB85C \uC774\uB3D9\uB428","\uCF54\uB4DC\uAC00 {0} - {1}\uC904\uC5D0\uC11C \uC774\uB3D9\uB428"],"vs/editor/browser/widget/diffEditor/features/revertButtonsFeature":["\uC120\uD0DD\uD55C \uBCC0\uACBD \uB0B4\uC6A9 \uB418\uB3CC\uB9AC\uAE30","\uBCC0\uACBD \uB0B4\uC6A9 \uB418\uB3CC\uB9AC\uAE30"],"vs/editor/browser/widget/diffEditor/registrations.contribution":["diff \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC774\uB3D9\uB41C \uD14D\uC2A4\uD2B8\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC774\uB3D9\uB41C \uD14D\uC2A4\uD2B8\uC758 \uD65C\uC131 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uC601\uC5ED \uC704\uC82F \uC8FC\uC704\uC758 \uADF8\uB9BC\uC790 \uC0C9\uC785\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC758 \uC0BD\uC785\uC5D0 \uB300\uD55C \uC904 \uB370\uCF54\uB808\uC774\uC158\uC785\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC758 \uC81C\uAC70\uC5D0 \uB300\uD55C \uC904 \uB370\uCF54\uB808\uC774\uC158\uC785\uB2C8\uB2E4."],"vs/editor/browser/widget/hoverWidget/hoverWidget":["{0} \uD0A4\uB97C \uB20C\uB7EC \uB9C8\uC6B0\uC2A4\uB97C \uC704\uC5D0 \uB193\uAE30"],"vs/editor/browser/widget/multiDiffEditorWidget/colors":["diff \uD3B8\uC9D1\uAE30 \uD5E4\uB354\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB2E4\uC911 \uD30C\uC77C diff \uD3B8\uC9D1\uAE30 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB2E4\uC911 \uD30C\uC77C \uCC28\uC774 \uD3B8\uC9D1\uAE30\uC758 \uD14C\uB450\uB9AC \uC0C9"],"vs/editor/common/config/editorConfigurationSchema":["\uD3B8\uC9D1\uAE30","\uD0ED\uC774 \uAC19\uC740 \uACF5\uBC31\uC758 \uC218\uC785\uB2C8\uB2E4. \uC774 \uC124\uC815\uC740 {0}\uC774(\uAC00) \uCF1C\uC838 \uC788\uC744 \uB54C \uD30C\uC77C \uB0B4\uC6A9\uC744 \uAE30\uBC18\uC73C\uB85C \uC7AC\uC815\uC758\uB429\uB2C8\uB2E4.",`\uB4E4\uC5EC\uC4F0\uAE30 \uB610\uB294 \`"tabSize"\uC5D0\uC11C '#editor.tabSize#'\uC758 \uAC12\uC744 \uC0AC\uC6A9\uD558\uB294 \uB370 \uC0AC\uC6A9\uB418\uB294 \uACF5\uBC31 \uC218\uC785\uB2C8\uB2E4. \uC774 \uC124\uC815\uC740 '#editor.detectIndentation#'\uC774 \uCF1C\uC838 \uC788\uB294 \uACBD\uC6B0 \uD30C\uC77C \uB0B4\uC6A9\uC5D0 \uB530\uB77C \uC7AC\uC815\uC758\uB429\uB2C8\uB2E4.`,"`Tab`\uC744 \uB204\uB97C \uB54C \uACF5\uBC31\uC744 \uC0BD\uC785\uD558\uC138\uC694. \uC774 \uC124\uC815\uC740 {0}\uC774(\uAC00) \uCF1C\uC838 \uC788\uC744 \uB54C \uD30C\uC77C \uB0B4\uC6A9\uC744 \uAE30\uBC18\uC73C\uB85C \uC7AC\uC815\uC758\uB429\uB2C8\uB2E4.","\uD30C\uC77C \uB0B4\uC6A9\uC744 \uAE30\uBC18\uC73C\uB85C \uD30C\uC77C\uC744 \uC5F4 \uB54C {0} \uBC0F {1}\uC744(\uB97C) \uC790\uB3D9\uC73C\uB85C \uAC10\uC9C0\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB05D\uC5D0 \uC790\uB3D9 \uC0BD\uC785\uB41C \uACF5\uBC31\uC744 \uC81C\uAC70\uD569\uB2C8\uB2E4.","\uD070 \uD30C\uC77C\uC5D0 \uB300\uD55C \uD2B9\uC218 \uCC98\uB9AC\uB85C, \uBA54\uBAA8\uB9AC\uB97C \uB9CE\uC774 \uC0AC\uC6A9\uD558\uB294 \uD2B9\uC815 \uAE30\uB2A5\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uB2E8\uC5B4 \uAE30\uBC18 \uCD94\uCC9C\uC744 \uB055\uB2C8\uB2E4.","\uD65C\uC131 \uBB38\uC11C\uC5D0\uC11C\uB9CC \uB2E8\uC5B4\uB97C \uC81C\uC548\uD569\uB2C8\uB2E4.","\uAC19\uC740 \uC5B8\uC5B4\uC758 \uBAA8\uB4E0 \uC5F4\uB9B0 \uBB38\uC11C\uC5D0\uC11C \uB2E8\uC5B4\uB97C \uC81C\uC548\uD569\uB2C8\uB2E4.","\uBAA8\uB4E0 \uC5F4\uB9B0 \uBB38\uC11C\uC5D0\uC11C \uB2E8\uC5B4\uB97C \uC81C\uC548\uD569\uB2C8\uB2E4.","\uBB38\uC11C\uC758 \uB2E8\uC5B4\uB97C \uAE30\uC900\uC73C\uB85C \uC644\uC131\uB3C4\uB97C \uACC4\uC0B0\uD574\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80 \uBC0F \uC644\uC131\uB3C4\uAC00 \uACC4\uC0B0\uB418\uB294 \uBB38\uC11C\uB97C \uAE30\uC900\uC73C\uB85C \uACC4\uC0B0\uB418\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBAA8\uB4E0 \uC0C9 \uD14C\uB9C8\uC5D0 \uB300\uD574 \uC758\uBBF8 \uCCB4\uACC4 \uAC15\uC870 \uD45C\uC2DC\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uBAA8\uB4E0 \uC0C9 \uD14C\uB9C8\uC5D0 \uB300\uD574 \uC758\uBBF8 \uCCB4\uACC4 \uAC15\uC870 \uD45C\uC2DC\uB97C \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC758\uBBF8 \uCCB4\uACC4 \uAC15\uC870 \uD45C\uC2DC\uB294 \uD604\uC7AC \uC0C9 \uD14C\uB9C8\uC758 `semanticHighlighting` \uC124\uC815\uC5D0 \uB530\uB77C \uAD6C\uC131\uB429\uB2C8\uB2E4.","semanticHighlighting\uC774 \uC9C0\uC6D0\uD558\uB294 \uC5B8\uC5B4\uC5D0 \uB300\uD574 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD574\uB2F9 \uCF58\uD150\uCE20\uB97C \uB450 \uBC88 \uD074\uB9AD\uD558\uAC70\uB098 'Esc' \uD0A4\uB97C \uB204\uB974\uB354\uB77C\uB3C4 Peek \uD3B8\uC9D1\uAE30\uB97C \uC5F4\uB9B0 \uC0C1\uD0DC\uB85C \uC720\uC9C0\uD569\uB2C8\uB2E4.","\uC774 \uAE38\uC774\uB97C \uCD08\uACFC\uD558\uB294 \uC904\uC740 \uC131\uB2A5\uC0C1\uC758 \uC774\uC720\uB85C \uD1A0\uD070\uD654\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC6F9 \uC791\uC5C5\uC790\uC5D0\uC11C \uD1A0\uD070\uD654\uAC00 \uBE44\uB3D9\uAE30\uC801\uC73C\uB85C \uC218\uD589\uB418\uC5B4\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBE44\uB3D9\uAE30 \uD1A0\uD070\uD654\uAC00 \uAE30\uB85D\uB418\uC5B4\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uB514\uBC84\uAE45 \uC804\uC6A9\uC785\uB2C8\uB2E4.","\uB808\uAC70\uC2DC \uBC31\uADF8\uB77C\uC6B4\uB4DC \uD1A0\uD070\uD654\uC5D0 \uB300\uD574 \uBE44\uB3D9\uAE30 \uD1A0\uD070\uD654\uB97C \uD655\uC778\uD574\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uD1A0\uD070\uD654 \uC18D\uB3C4\uAC00 \uB290\uB824\uC9C8 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uB514\uBC84\uAE45 \uC804\uC6A9\uC785\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30\uB97C \uB298\uB9AC\uAC70\uB098 \uC904\uC774\uB294 \uB300\uAD04\uD638 \uAE30\uD638\uB97C \uC815\uC758\uD569\uB2C8\uB2E4.","\uC5EC\uB294 \uB300\uAD04\uD638 \uBB38\uC790 \uB610\uB294 \uBB38\uC790\uC5F4 \uC2DC\uD000\uC2A4\uC785\uB2C8\uB2E4.","\uB2EB\uB294 \uB300\uAD04\uD638 \uBB38\uC790 \uB610\uB294 \uBB38\uC790\uC5F4 \uC2DC\uD000\uC2A4\uC785\uB2C8\uB2E4.","\uB300\uAD04\uD638 \uC30D \uC0C9 \uC9C0\uC815\uC744 \uC0AC\uC6A9\uD558\uB294 \uACBD\uC6B0 \uC911\uCCA9 \uC218\uC900\uC5D0 \uB530\uB77C \uC0C9\uC774 \uC9C0\uC815\uB41C \uB300\uAD04\uD638 \uC30D\uC744 \uC815\uC758\uD569\uB2C8\uB2E4.","\uC5EC\uB294 \uB300\uAD04\uD638 \uBB38\uC790 \uB610\uB294 \uBB38\uC790\uC5F4 \uC2DC\uD000\uC2A4\uC785\uB2C8\uB2E4.","\uB2EB\uB294 \uB300\uAD04\uD638 \uBB38\uC790 \uB610\uB294 \uBB38\uC790\uC5F4 \uC2DC\uD000\uC2A4\uC785\uB2C8\uB2E4.","diff \uACC4\uC0B0\uC774 \uCDE8\uC18C\uB41C \uD6C4 \uBC00\uB9AC\uCD08 \uB2E8\uC704\uB85C \uC2DC\uAC04\uC744 \uC81C\uD55C\uD569\uB2C8\uB2E4. \uC81C\uD55C \uC2DC\uAC04\uC774 \uC5C6\uB294 \uACBD\uC6B0 0\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uCC28\uC774\uB97C \uACC4\uC0B0\uD560 \uCD5C\uB300 \uD30C\uC77C \uD06C\uAE30(MB)\uC785\uB2C8\uB2E4. \uC81C\uD55C\uC774 \uC5C6\uC73C\uBA74 0\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC5D0\uC11C diff\uB97C \uB098\uB780\uD788 \uD45C\uC2DC\uD560\uC9C0 \uC778\uB77C\uC778\uC73C\uB85C \uD45C\uC2DC\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30 \uB108\uBE44\uAC00 \uC774 \uAC12\uBCF4\uB2E4 \uC791\uC73C\uBA74 \uC778\uB77C\uC778 \uBDF0\uAC00 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD558\uACE0 \uD3B8\uC9D1\uAE30 \uB108\uBE44\uAC00 \uB108\uBB34 \uC791\uC744 \uACBD\uC6B0 \uC778\uB77C\uC778 \uBCF4\uAE30\uAC00 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD65C\uC131\uD654\uB418\uBA74 diff \uD3B8\uC9D1\uAE30\uB294 \uBCC0\uACBD \uB0B4\uC6A9\uC744 \uB418\uB3CC\uB9AC\uAE30 \uC704\uD574 \uAE00\uB9AC\uD504 \uC5EC\uBC31\uC5D0 \uD654\uC0B4\uD45C\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD558\uBA74 Diff \uD3B8\uC9D1\uAE30\uAC00 \uC120\uD589 \uB610\uB294 \uD6C4\uD589 \uACF5\uBC31\uC758 \uBCC0\uACBD \uB0B4\uC6A9\uC744 \uBB34\uC2DC\uD569\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uCD94\uAC00/\uC81C\uAC70\uB41C \uBCC0\uACBD \uB0B4\uC6A9\uC5D0 \uB300\uD574 +/- \uD45C\uC2DC\uAE30\uB97C \uD45C\uC2DC\uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C CodeLens\uB97C \uD45C\uC2DC\uD560 \uAC83\uC778\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC904\uC774 \uBC14\uB00C\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uBDF0\uD3EC\uD2B8 \uB108\uBE44\uC5D0\uC11C \uC904\uC774 \uBC14\uB01D\uB2C8\uB2E4.","\uC904\uC740 {0} \uC124\uC815\uC5D0 \uB530\uB77C \uC904 \uBC14\uAFC8\uB429\uB2C8\uB2E4.","\uB808\uAC70\uC2DC \uBE44\uAD50 \uC54C\uACE0\uB9AC\uC998\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uACE0\uAE09 \uBE44\uAD50 \uC54C\uACE0\uB9AC\uC998\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC5D0 \uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uC601\uC5ED\uC774 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uC601\uC5ED\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC904 \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uC601\uC5ED\uC758 \uCD5C\uC18C\uAC12\uC73C\uB85C \uC0AC\uC6A9\uB418\uB294 \uC904 \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uC601\uC5ED\uC744 \uBE44\uAD50\uD560 \uB54C \uCEE8\uD14D\uC2A4\uD2B8\uB85C \uC0AC\uC6A9\uB418\uB294 \uC904 \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uAC10\uC9C0\uB41C \uCF54\uB4DC \uC774\uB3D9\uC744 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBB38\uC790\uAC00 \uC0BD\uC785\uB418\uAC70\uB098 \uC0AD\uC81C\uB41C \uC704\uCE58\uB97C \uBCFC \uC218 \uC788\uB3C4\uB85D diff \uD3B8\uC9D1\uAE30\uC5D0 \uBE48 \uC7A5\uC2DD\uC801 \uC694\uC18C\uB97C \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4."],"vs/editor/common/config/editorOptions":["\uD50C\uB7AB\uD3FC API\uB97C \uC0AC\uC6A9\uD558\uC5EC \uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8\uC774 \uC5F0\uACB0\uB41C \uC2DC\uAE30\uB97C \uAC10\uC9C0\uD569\uB2C8\uB2E4.","\uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC0AC\uC6A9\uC744 \uCD5C\uC801\uD654\uD569\uB2C8\uB2E4.","\uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8\uC774 \uC5F0\uACB0\uB418\uC5B4 \uC788\uC9C0 \uC54A\uB2E4\uACE0 \uAC00\uC815\uD569\uB2C8\uB2E4.","\uD654\uBA74 \uD310\uB3C5\uAE30\uC5D0 \uCD5C\uC801\uD654\uB41C \uBAA8\uB4DC\uC5D0\uC11C UI\uB97C \uC2E4\uD589\uD574\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC8FC\uC11D\uC744 \uB2EC \uB54C \uACF5\uBC31 \uBB38\uC790\uB97C \uC0BD\uC785\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBE48 \uC904\uC744 \uC904 \uC8FC\uC11D\uC5D0 \uB300\uD55C \uD1A0\uAE00, \uCD94\uAC00 \uB610\uB294 \uC81C\uAC70 \uC791\uC5C5\uC73C\uB85C \uBB34\uC2DC\uD574\uC57C \uD558\uB294\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC120\uD0DD \uC601\uC5ED \uC5C6\uC774 \uD604\uC7AC \uC904 \uBCF5\uC0AC \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC785\uB825\uD558\uB294 \uB3D9\uC548 \uC77C\uCE58 \uD56D\uBAA9\uC744 \uCC3E\uAE30 \uC704\uD55C \uCEE4\uC11C \uC774\uB3D9 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C \uAC80\uC0C9 \uBB38\uC790\uC5F4\uC744 \uC2DC\uB4DC\uD558\uC9C0 \uB9C8\uC138\uC694.","\uCEE4\uC11C \uC704\uCE58\uC758 \uB2E8\uC5B4\uB97C \uD3EC\uD568\uD558\uC5EC \uD56D\uC0C1 \uD3B8\uC9D1\uAE30 \uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C \uAC80\uC0C9 \uBB38\uC790\uC5F4\uC744 \uC2DC\uB4DC\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C\uB9CC \uAC80\uC0C9 \uBB38\uC790\uC5F4\uC744 \uC2DC\uB4DC\uD558\uC138\uC694.","\uD3B8\uC9D1\uAE30 \uC120\uD0DD\uC5D0\uC11C Find Widget\uC758 \uAC80\uC0C9 \uBB38\uC790\uC5F4\uC744 \uC2DC\uB529\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C \uCC3E\uAE30\uB97C \uC790\uB3D9\uC73C\uB85C \uCF1C\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4(\uAE30\uBCF8\uAC12).","\uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C \uCC3E\uAE30\uB97C \uD56D\uC0C1 \uC790\uB3D9\uC73C\uB85C \uCF2D\uB2C8\uB2E4.","\uC5EC\uB7EC \uC904\uC758 \uCF58\uD150\uCE20\uB97C \uC120\uD0DD\uD558\uBA74 \uC120\uD0DD \uD56D\uBAA9\uC5D0\uC11C \uCC3E\uAE30\uAC00 \uC790\uB3D9\uC73C\uB85C \uCF1C\uC9D1\uB2C8\uB2E4.","\uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C \uCC3E\uAE30\uB97C \uC790\uB3D9\uC73C\uB85C \uC124\uC815\uD558\uB294 \uC870\uAC74\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","macOS\uC5D0\uC11C Find Widget\uC774 \uACF5\uC720 \uD074\uB9BD\uBCF4\uB4DC \uCC3E\uAE30\uB97C \uC77D\uC744\uC9C0 \uC218\uC815\uD560\uC9C0 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC704\uC82F \uCC3E\uAE30\uC5D0\uC11C \uD3B8\uC9D1\uAE30 \uB9E8 \uC704\uC5D0 \uC904\uC744 \uCD94\uAC00\uD574\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. true\uC778 \uACBD\uC6B0 \uC704\uC82F \uCC3E\uAE30\uAC00 \uD45C\uC2DC\uB418\uBA74 \uCCAB \uBC88\uC9F8 \uC904 \uC704\uB85C \uC2A4\uD06C\uB864\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uB354 \uC774\uC0C1 \uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC774 \uC5C6\uC744 \uB54C \uAC80\uC0C9\uC744 \uCC98\uC74C\uC774\uB098 \uB05D\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uB2E4\uC2DC \uC2DC\uC791\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAE00\uAF34 \uD569\uC790('calt' \uBC0F 'liga' \uAE00\uAF34 \uAE30\uB2A5)\uB97C \uC0AC\uC6A9\uD558\uAC70\uB098 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4. 'font-feature-settings' CSS \uC18D\uC131\uC758 \uC138\uBD84\uD654\uB41C \uC81C\uC5B4\uB97C \uC704\uD574 \uBB38\uC790\uC5F4\uB85C \uBCC0\uACBD\uD569\uB2C8\uB2E4.","\uBA85\uC2DC\uC801 'font-feature-settings' CSS \uC18D\uC131\uC785\uB2C8\uB2E4. \uD569\uC790\uB97C \uCF1C\uAC70\uB098 \uAEBC\uC57C \uD558\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uBD80\uC6B8\uC744 \uB300\uC2E0 \uC804\uB2EC\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uAE00\uAF34 \uD569\uC790 \uB610\uB294 \uAE00\uAF34 \uAE30\uB2A5\uC744 \uAD6C\uC131\uD569\uB2C8\uB2E4. CSS 'font-feature-settings' \uC18D\uC131\uC758 \uAC12\uC5D0 \uB300\uD574 \uD569\uC790 \uB610\uB294 \uBB38\uC790\uC5F4\uC744 \uC0AC\uC6A9\uD558\uAC70\uB098 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uD558\uAE30 \uC704\uD55C \uBD80\uC6B8\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4.","font-weight\uC5D0\uC11C font-variation-settings\uB85C \uBCC0\uD658\uC744 \uC0AC\uC6A9/\uC0AC\uC6A9\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. 'font-variation-settings' CSS \uC18D\uC131\uC758 \uC138\uBD84\uD654\uB41C \uCEE8\uD2B8\uB864\uC744 \uC704\uD574 \uC774\uB97C \uBB38\uC790\uC5F4\uB85C \uBCC0\uACBD\uD569\uB2C8\uB2E4.","\uBA85\uC2DC\uC801 'font-variation-settings' CSS \uC18D\uC131\uC785\uB2C8\uB2E4. font-weight\uB9CC font-variation-settings\uB85C \uBCC0\uD658\uD574\uC57C \uD558\uB294 \uACBD\uC6B0 \uBD80\uC6B8\uC744 \uB300\uC2E0 \uC804\uB2EC\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uAE00\uAF34 \uBCC0\uD615\uC744 \uAD6C\uC131\uD569\uB2C8\uB2E4. font-weight\uC5D0\uC11C font-variation-settings\uB85C \uBCC0\uD658\uC744 \uC0AC\uC6A9/\uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uD558\uB294 \uBD80\uC6B8\uC774\uAC70\uB098 CSS 'font-variation-settings' \uC18D\uC131 \uAC12\uC5D0 \uB300\uD55C \uBB38\uC790\uC5F4\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uAE00\uAF34 \uD06C\uAE30(\uD53D\uC140)\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.",'"\uD45C\uC900" \uBC0F "\uAD75\uAC8C" \uD0A4\uC6CC\uB4DC \uB610\uB294 1~1000 \uC0AC\uC774\uC758 \uC22B\uC790\uB9CC \uD5C8\uC6A9\uB429\uB2C8\uB2E4.','\uAE00\uAF34 \uB450\uAED8\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. "\uD45C\uC900" \uBC0F "\uAD75\uAC8C" \uD0A4\uC6CC\uB4DC \uB610\uB294 1~1000 \uC0AC\uC774\uC758 \uC22B\uC790\uB97C \uD5C8\uC6A9\uD569\uB2C8\uB2E4.',"\uACB0\uACFC\uC758 Peek \uBCF4\uAE30 \uD45C\uC2DC(\uAE30\uBCF8\uAC12)","\uAE30\uBCF8 \uACB0\uACFC\uB85C \uC774\uB3D9\uD558\uC5EC Peek \uBCF4\uAE30\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uAE30\uBCF8 \uACB0\uACFC\uB85C \uC774\uB3D9\uD558\uC5EC \uB2E4\uB978 \uD56D\uBAA9\uC5D0 \uB300\uD574 Peek \uC5C6\uB294 \uD0D0\uC0C9\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uC774 \uC124\uC815\uC740 \uB354 \uC774\uC0C1 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 'editor.editor.gotoLocation.multipleDefinitions' \uB610\uB294 'editor.editor.gotoLocation.multipleImplementations'\uC640 \uAC19\uC740 \uBCC4\uB3C4\uC758 \uC124\uC815\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 '\uC815\uC758\uB85C \uC774\uB3D9' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 '\uC720\uD615 \uC815\uC758\uB85C \uC774\uB3D9' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 'Go to Declaration' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 '\uAD6C\uD604\uC73C\uB85C \uC774\uB3D9' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 '\uCC38\uC870\uB85C \uC774\uB3D9' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","'\uC815\uC758\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","'\uD615\uC2DD \uC815\uC758\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","'\uC120\uC5B8\uC73C\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","'\uAD6C\uD604\uC73C\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","'\uCC38\uC870\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","\uD638\uBC84 \uD45C\uC2DC \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD638\uBC84\uAC00 \uD45C\uC2DC\uB418\uAE30 \uC804\uAE4C\uC9C0\uC758 \uC9C0\uC5F0 \uC2DC\uAC04(\uBC00\uB9AC\uCD08)\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB97C \uD574\uB2F9 \uD56D\uBAA9 \uC704\uB85C \uC774\uB3D9\uD560 \uB54C \uD638\uBC84\uB97C \uACC4\uC18D \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD638\uBC84\uAC00 \uC228\uACA8\uC9C0\uAE30 \uC804\uAE4C\uC9C0\uC758 \uC9C0\uC5F0 \uC2DC\uAC04(\uBC00\uB9AC\uCD08)\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4. 'editor.hover.sticky'\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uACF5\uBC31\uC774 \uC788\uB294 \uACBD\uC6B0 \uC120 \uC704\uC5D0 \uB9C8\uC6B0\uC2A4\uB97C \uAC00\uC838\uAC00\uB294 \uAC83\uC744 \uD45C\uC2DC\uD558\uB294 \uAC83\uC744 \uC120\uD638\uD569\uB2C8\uB2E4.","\uBAA8\uB4E0 \uBB38\uC790\uAC00 \uB3D9\uC77C\uD55C \uB108\uBE44\uB77C\uACE0 \uAC00\uC815\uD569\uB2C8\uB2E4. \uC774 \uC54C\uACE0\uB9AC\uC998\uC740 \uACE0\uC815 \uD3ED \uAE00\uAF34\uACFC \uBB38\uC790 \uBAA8\uC591\uC758 \uB108\uBE44\uAC00 \uAC19\uC740 \uD2B9\uC815 \uC2A4\uD06C\uB9BD\uD2B8(\uC608: \uB77C\uD2F4 \uBB38\uC790)\uC5D0 \uC801\uC808\uD788 \uC791\uB3D9\uD558\uB294 \uBE60\uB978 \uC54C\uACE0\uB9AC\uC998\uC785\uB2C8\uB2E4.","\uB798\uD551 \uC810 \uACC4\uC0B0\uC744 \uBE0C\uB77C\uC6B0\uC800\uC5D0 \uC704\uC784\uD569\uB2C8\uB2E4. \uC774 \uC54C\uACE0\uB9AC\uC998\uC740 \uB9E4\uC6B0 \uB290\uB824\uC11C \uB300\uC6A9\uB7C9 \uD30C\uC77C\uC758 \uACBD\uC6B0 \uC911\uB2E8\uB420 \uC218 \uC788\uC9C0\uB9CC \uBAA8\uB4E0 \uACBD\uC6B0\uC5D0 \uC801\uC808\uD788 \uC791\uB3D9\uD569\uB2C8\uB2E4.","\uB798\uD551 \uC9C0\uC810\uC744 \uACC4\uC0B0\uD558\uB294 \uC54C\uACE0\uB9AC\uC998\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC811\uADFC\uC131 \uBAA8\uB4DC\uC5D0\uC11C\uB294 \uCD5C\uC0C1\uC758 \uD658\uACBD\uC744 \uC704\uD574 \uACE0\uAE09 \uAE30\uB2A5\uC774 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uCF54\uB4DC \uC791\uC5C5 \uBA54\uB274\uB97C \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uCEE4\uC11C\uAC00 \uCF54\uB4DC\uAC00 \uC788\uB294 \uC904\uC5D0 \uC788\uC744 \uB54C \uCF54\uB4DC \uB3D9\uC791 \uBA54\uB274\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uCEE4\uC11C\uAC00 \uCF54\uB4DC\uAC00 \uC788\uB294 \uC904 \uB610\uB294 \uBE48 \uC904\uC5D0 \uC788\uB294 \uACBD\uC6B0 \uCF54\uB4DC \uB3D9\uC791 \uBA54\uB274\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uCF54\uB4DC \uB3D9\uC791 \uC804\uAD6C\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC704\uCABD\uC5D0\uC11C \uC2A4\uD06C\uB864\uD558\uB294 \uB3D9\uC548 \uC911\uCCA9\uB41C \uD604\uC7AC \uBC94\uC704\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uD45C\uC2DC\uD560 \uCD5C\uB300 \uACE0\uC815 \uC120 \uC218\uB97C \uC815\uC758\uD569\uB2C8\uB2E4.","\uACE0\uC815\uD560 \uC904\uC744 \uACB0\uC815\uD558\uB294 \uB370 \uC0AC\uC6A9\uD560 \uBAA8\uB378\uC744 \uC815\uC758\uD569\uB2C8\uB2E4. \uAC1C\uC694 \uBAA8\uB378\uC774 \uC5C6\uC73C\uBA74 \uB4E4\uC5EC\uC4F0\uAE30 \uBAA8\uB378\uC5D0 \uD574\uB2F9\uD558\uB294 \uC811\uAE30 \uACF5\uAE09\uC790 \uBAA8\uB378\uC5D0\uC11C \uB300\uCCB4\uB429\uB2C8\uB2E4. \uC774 \uC21C\uC11C\uB294 \uC138 \uAC00\uC9C0 \uACBD\uC6B0 \uBAA8\uB450 \uC801\uC6A9\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uAC00\uB85C \uC2A4\uD06C\uB864 \uB9C9\uB300\uB97C \uC0AC\uC6A9\uD558\uC5EC \uACE0\uC815 \uC2A4\uD06C\uB864 \uC2A4\uD06C\uB864\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uB808\uC774 \uD78C\uD2B8\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uC778\uB808\uC774 \uD78C\uD2B8\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC788\uC74C","\uC778\uB808\uC774 \uD78C\uD2B8\uB294 \uAE30\uBCF8\uC801\uC73C\uB85C \uD45C\uC2DC\uB418\uACE0 {0}\uC744(\uB97C) \uAE38\uAC8C \uB204\uB97C \uB54C \uC228\uACA8\uC9D1\uB2C8\uB2E4.","\uC778\uB808\uC774 \uD78C\uD2B8\uB294 \uAE30\uBCF8\uAC12\uC73C\uB85C \uC228\uACA8\uC838 \uC788\uC73C\uBA70 {0}\uC744(\uB97C) \uAE38\uAC8C \uB204\uB974\uBA74 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC778\uB808\uC774 \uD78C\uD2B8\uB294 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uB808\uC774 \uD78C\uD2B8\uC758 \uAE00\uAF34 \uD06C\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uAE30\uBCF8\uC801\uC73C\uB85C {0}\uC740(\uB294) \uAD6C\uC131\uB41C \uAC12\uC774 {1}\uBCF4\uB2E4 \uC791\uAC70\uB098 \uD3B8\uC9D1\uAE30 \uAE00\uAF34 \uD06C\uAE30\uBCF4\uB2E4 \uD070 \uACBD\uC6B0\uC5D0 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uB808\uC774 \uD78C\uD2B8\uC758 \uAE00\uAF34 \uD328\uBC00\uB9AC\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uBE44\uC6CC \uB450\uBA74 {0}\uC774(\uAC00) \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uB808\uC774 \uD78C\uD2B8 \uC8FC\uC704\uC758 \uD328\uB529\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.",`\uC120 \uB192\uC774\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \r
+ - 0\uC744 \uC0AC\uC6A9\uD558\uC5EC \uAE00\uAF34 \uD06C\uAE30\uC5D0\uC11C \uC904 \uB192\uC774\uB97C \uC790\uB3D9\uC73C\uB85C \uACC4\uC0B0\uD569\uB2C8\uB2E4.\r
+ - 0\uC5D0\uC11C 8 \uC0AC\uC774\uC758 \uAC12\uC740 \uAE00\uAF34 \uD06C\uAE30\uC758 \uC2B9\uC218\uB85C \uC0AC\uC6A9\uB429\uB2C8\uB2E4.\r
+ - 8\uBCF4\uB2E4 \uD06C\uAC70\uB098 \uAC19\uC740 \uAC12\uC774 \uC720\uD6A8 \uAC12\uC73C\uB85C \uC0AC\uC6A9\uB429\uB2C8\uB2E4.`,"\uBBF8\uB2C8\uB9F5 \uD45C\uC2DC \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5\uC744 \uC790\uB3D9\uC73C\uB85C \uC228\uAE38\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5\uC758 \uD06C\uAE30\uB294 \uD3B8\uC9D1\uAE30 \uB0B4\uC6A9\uACFC \uB3D9\uC77C\uD558\uBA70 \uC2A4\uD06C\uB864\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uB192\uC774\uB97C \uB9DE\uCD94\uAE30 \uC704\uD574 \uD544\uC694\uC5D0 \uB530\uB77C \uBBF8\uB2C8\uB9F5\uC774 \uD655\uC7A5\uB418\uAC70\uB098 \uCD95\uC18C\uB429\uB2C8\uB2E4(\uC2A4\uD06C\uB864 \uC5C6\uC74C).","\uBBF8\uB2C8\uB9F5\uC744 \uD3B8\uC9D1\uAE30\uBCF4\uB2E4 \uC791\uAC8C \uC720\uC9C0\uD560 \uC218 \uC788\uB3C4\uB85D \uD544\uC694\uC5D0 \uB530\uB77C \uBBF8\uB2C8\uB9F5\uC774 \uCD95\uC18C\uB429\uB2C8\uB2E4(\uC2A4\uD06C\uB864 \uC5C6\uC74C).","\uBBF8\uB2C8\uB9F5\uC758 \uD06C\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5\uC744 \uB80C\uB354\uB9C1\uD560 \uCE21\uBA74\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5 \uC2AC\uB77C\uC774\uB354\uAC00 \uD45C\uC2DC\uB418\uB294 \uC2DC\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5\uC5D0 \uADF8\uB824\uC9C4 \uCF58\uD150\uCE20\uC758 \uBC30\uC728: 1, 2 \uB610\uB294 3.","\uC904\uC758 \uC2E4\uC81C \uBB38\uC790(\uC0C9 \uBE14\uB85D \uC544\uB2D8)\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4.","\uCD5C\uB300 \uD2B9\uC815 \uC218\uC758 \uC5F4\uC744 \uB80C\uB354\uB9C1\uD558\uB3C4\uB85D \uBBF8\uB2C8\uB9F5\uC758 \uB108\uBE44\uB97C \uC81C\uD55C\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uC704\uCABD \uAC00\uC7A5\uC790\uB9AC\uC640 \uCCAB \uBC88\uC9F8 \uC904 \uC0AC\uC774\uC758 \uACF5\uBC31\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uC544\uB798\uCABD \uAC00\uC7A5\uC790\uB9AC\uC640 \uB9C8\uC9C0\uB9C9 \uC904 \uC0AC\uC774\uC758 \uACF5\uBC31\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC785\uB825\uACFC \uB3D9\uC2DC\uC5D0 \uB9E4\uAC1C\uBCC0\uC218 \uBB38\uC11C\uC640 \uC720\uD615 \uC815\uBCF4\uB97C \uD45C\uC2DC\uD558\uB294 \uD31D\uC5C5\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uB9E4\uAC1C\uBCC0\uC218 \uD78C\uD2B8 \uBA54\uB274\uC758 \uC8FC\uAE30 \uD639\uC740 \uBAA9\uB85D\uC758 \uB05D\uC5D0 \uB3C4\uB2EC\uD558\uC600\uC744\uB54C \uC885\uB8CC\uD560 \uAC83\uC778\uC9C0 \uC5EC\uBD80\uB97C \uACB0\uC815\uD569\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F \uB0B4\uBD80\uC5D0 \uBE60\uB978 \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uBE60\uB978 \uC81C\uC548\uC774 \uC720\uB839 \uD14D\uC2A4\uD2B8\uB85C \uD45C\uC2DC\uB428","\uBE60\uB978 \uC81C\uC548\uC774 \uC0AC\uC6A9 \uC911\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uBB38\uC790\uC5F4 \uB0B4\uC5D0\uC11C \uBE60\uB978 \uC81C\uC548\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uC8FC\uC11D \uB0B4\uC5D0\uC11C \uBE60\uB978 \uC81C\uC548\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uBB38\uC790\uC5F4 \uBC0F \uC8FC\uC11D \uC678\uBD80\uC5D0\uC11C \uBE60\uB978 \uC81C\uC548\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uC785\uB825\uD558\uB294 \uB3D9\uC548 \uC81C\uC548\uC744 \uC790\uB3D9\uC73C\uB85C \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC774\uAC83\uC740 \uC8FC\uC11D, \uBB38\uC790\uC5F4 \uBC0F \uAE30\uD0C0 \uCF54\uB4DC\uB97C \uC785\uB825\uD558\uAE30 \uC704\uD574 \uC81C\uC5B4\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uBE60\uB978 \uC81C\uC548\uC740 \uACE0\uC2A4\uD2B8 \uD14D\uC2A4\uD2B8 \uB610\uB294 \uC81C\uC548 \uC704\uC82F\uC73C\uB85C \uD45C\uC2DC\uD558\uB3C4\uB85D \uAD6C\uC131\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uB610\uD55C \uC81C\uC548\uC774 \uD2B9\uC218 \uBB38\uC790\uC5D0 \uC758\uD574 \uC2E4\uD589\uB418\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD558\uB294 '{0}'-\uC124\uC815\uC5D0 \uC720\uC758\uD558\uC138\uC694.","\uC904 \uBC88\uD638\uB294 \uB80C\uB354\uB9C1\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC904 \uBC88\uD638\uB294 \uC808\uB300\uAC12\uC73C\uB85C \uB80C\uB354\uB9C1 \uB429\uB2C8\uB2E4.","\uC904 \uBC88\uD638\uB294 \uCEE4\uC11C \uC704\uCE58\uC5D0\uC11C \uC904 \uAC04\uACA9 \uAC70\uB9AC\uB85C \uB80C\uB354\uB9C1 \uB429\uB2C8\uB2E4.","\uC904 \uBC88\uD638\uB294 \uB9E4 10 \uC904\uB9C8\uB2E4 \uB80C\uB354\uB9C1\uC774 \uC774\uB8E8\uC5B4\uC9D1\uB2C8\uB2E4.","\uC904 \uBC88\uD638\uC758 \uD45C\uC2DC \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC774 \uD3B8\uC9D1\uAE30 \uB208\uAE08\uC790\uC5D0\uC11C \uB80C\uB354\uB9C1\uD560 \uACE0\uC815 \uD3ED \uBB38\uC790 \uC218\uC785\uB2C8\uB2E4.","\uC774 \uD3B8\uC9D1\uAE30 \uB208\uAE08\uC790\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uD2B9\uC815 \uC218\uC758 \uACE0\uC815 \uD3ED \uBB38\uC790 \uB4A4\uC5D0 \uC138\uB85C \uB208\uAE08\uC790\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4. \uC5EC\uB7EC \uB208\uAE08\uC790\uC758 \uACBD\uC6B0 \uC5EC\uB7EC \uAC12\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4. \uBC30\uC5F4\uC774 \uBE44\uC5B4 \uC788\uB294 \uACBD\uC6B0 \uB208\uAE08\uC790\uAC00 \uADF8\uB824\uC9C0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC138\uB85C \uC2A4\uD06C\uB864 \uB9C9\uB300\uB294 \uD544\uC694\uD55C \uACBD\uC6B0\uC5D0\uB9CC \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC138\uB85C \uC2A4\uD06C\uB864 \uB9C9\uB300\uAC00 \uD56D\uC0C1 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC138\uB85C \uC2A4\uD06C\uB864 \uB9C9\uB300\uB97C \uD56D\uC0C1 \uC228\uAE41\uB2C8\uB2E4.","\uC138\uB85C \uC2A4\uD06C\uB864 \uB9C9\uB300\uC758 \uD45C\uC2DC \uC720\uD615\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAC00\uB85C \uC2A4\uD06C\uB864 \uB9C9\uB300\uB294 \uD544\uC694\uD55C \uACBD\uC6B0\uC5D0\uB9CC \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uAC00\uB85C \uC2A4\uD06C\uB864 \uB9C9\uB300\uAC00 \uD56D\uC0C1 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uAC00\uB85C \uC2A4\uD06C\uB864 \uB9C9\uB300\uB97C \uD56D\uC0C1 \uC228\uAE41\uB2C8\uB2E4.","\uAC00\uB85C \uC2A4\uD06C\uB864 \uB9C9\uB300\uC758 \uD45C\uC2DC \uC720\uD615\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC138\uB85C \uC2A4\uD06C\uB864 \uB9C9\uB300\uC758 \uB108\uBE44\uC785\uB2C8\uB2E4.","\uAC00\uB85C \uC2A4\uD06C\uB864 \uB9C9\uB300\uC758 \uB192\uC774\uC785\uB2C8\uB2E4.","\uD074\uB9AD\uC774 \uD398\uC774\uC9C0\uBCC4\uB85C \uC2A4\uD06C\uB864\uB418\uB294\uC9C0 \uB610\uB294 \uD074\uB9AD \uC704\uCE58\uB85C \uC774\uB3D9\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC124\uC815\uD558\uBA74 \uAC00\uB85C \uC2A4\uD06C\uB864 \uB9C9\uB300\uAC00 \uD3B8\uC9D1\uAE30 \uCF58\uD150\uCE20\uC758 \uD06C\uAE30\uB97C \uB298\uB9AC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uAE30\uBCF8\uC774 \uC544\uB2CC \uBAA8\uB4E0 ASCII \uBB38\uC790\uB97C \uAC15\uC870 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. U+0020\uACFC U+007E \uC0AC\uC774\uC758 \uBB38\uC790, \uD0ED, \uC904 \uBC14\uAFC8 \uBC0F \uCE90\uB9AC\uC9C0 \uB9AC\uD134\uB9CC \uAE30\uBCF8 ASCII\uB85C \uAC04\uC8FC\uB429\uB2C8\uB2E4.","\uACF5\uBC31\uB9CC \uC608\uC57D\uD558\uAC70\uB098 \uB108\uBE44\uAC00 \uC804\uD600 \uC5C6\uB294 \uBB38\uC790\uB97C \uAC15\uC870 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD604\uC7AC \uC0AC\uC6A9\uC790 \uB85C\uCE98\uC5D0\uC11C \uACF5\uD1B5\uB418\uB294 \uBB38\uC790\uB97C \uC81C\uC678\uD55C \uAE30\uBCF8 ASCII \uBB38\uC790\uC640 \uD63C\uB3D9\uD560 \uC218 \uC788\uB294 \uBB38\uC790\uB97C \uAC15\uC870 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC8FC\uC11D\uC758 \uBB38\uC790\uC5D0\uB3C4 \uC720\uB2C8\uCF54\uB4DC \uAC15\uC870 \uD45C\uC2DC\uB97C \uC801\uC6A9\uD574\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBB38\uC790\uC5F4\uC758 \uBB38\uC790\uC5D0\uB3C4 \uC720\uB2C8\uCF54\uB4DC \uAC15\uC870 \uD45C\uC2DC\uB97C \uC801\uC6A9\uD574\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAC15\uC870 \uD45C\uC2DC\uB418\uC9C0 \uC54A\uB294 \uD5C8\uC6A9\uB41C \uBB38\uC790\uB97C \uC815\uC758\uD569\uB2C8\uB2E4.","\uD5C8\uC6A9\uB41C \uB85C\uCE98\uC5D0\uC11C \uACF5\uD1B5\uC801\uC778 \uC720\uB2C8\uCF54\uB4DC \uBB38\uC790\uB294 \uAC15\uC870 \uD45C\uC2DC\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uB77C\uC778 \uC81C\uC548\uC744 \uC790\uB3D9\uC73C\uB85C \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uCD94\uCC9C\uC744 \uD45C\uC2DC\uD790 \uB54C\uB9C8\uB2E4 \uC778\uB77C\uC778 \uCD94\uCC9C \uB3C4\uAD6C \uBAA8\uC74C\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uCD94\uCC9C\uC744 \uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0A4\uBA74 \uC778\uB77C\uC778 \uCD94\uCC9C \uB3C4\uAD6C \uBAA8\uC74C\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uCD94\uCC9C \uB3C4\uAD6C \uBAA8\uC74C\uC744 \uD45C\uC2DC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uCD94\uCC9C \uB3C4\uAD6C \uBAA8\uC74C\uC744 \uD45C\uC2DC\uD560 \uC2DC\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uC81C\uC548\uC774 \uC81C\uC548 \uC704\uC82F\uACFC \uC0C1\uD638 \uC791\uC6A9\uD558\uB294 \uBC29\uBC95\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD558\uBA74 \uC778\uB77C\uC778 \uC81C\uC548\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC788\uC744 \uB54C \uC81C\uC548 \uC704\uC82F\uC774 \uC790\uB3D9\uC73C\uB85C \uD45C\uC2DC\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uC81C\uC548\uC758 \uAE00\uAF34 \uD328\uBC00\uB9AC\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638 \uC30D \uC0C9 \uC9C0\uC815\uC744 \uC0AC\uC6A9\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. {0}\uC744(\uB97C) \uC0AC\uC6A9\uD558\uC5EC \uB300\uAD04\uD638 \uAC15\uC870 \uC0C9\uC744 \uC7AC\uC815\uC758\uD569\uB2C8\uB2E4.","\uAC01 \uB300\uAD04\uD638 \uD615\uC2DD\uC5D0 \uACE0\uC720\uD55C \uB3C5\uB9BD\uC801\uC778 \uC0C9 \uD480\uC774 \uC788\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638 \uC30D \uAC00\uC774\uB4DC\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uD65C\uC131 \uB300\uAD04\uD638 \uC30D\uC5D0 \uB300\uD574\uC11C\uB9CC \uB300\uAD04\uD638 \uC30D \uAC00\uC774\uB4DC\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638 \uC30D \uAC00\uC774\uB4DC\uB97C \uBE44\uD65C\uC131\uD654\uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC758 \uC0AC\uC6A9 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC218\uC9C1 \uB300\uAD04\uD638 \uC30D \uAC00\uC774\uB4DC\uC5D0 \uCD94\uAC00\uD558\uC5EC \uC218\uD3C9 \uAC00\uC774\uB4DC\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uD65C\uC131 \uB300\uAD04\uD638 \uC30D\uC5D0 \uB300\uD574\uC11C\uB9CC \uC218\uD3C9 \uAC00\uC774\uB4DC\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uC218\uD3C9 \uB300\uAD04\uD638 \uC30D \uAC00\uC774\uB4DC\uB97C \uBE44\uD65C\uC131\uD654\uD569\uB2C8\uB2E4.","\uAC00\uB85C \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC758 \uC0AC\uC6A9 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uAC00 \uD65C\uC131 \uBE0C\uB798\uD0B7 \uC30D\uC744 \uAC15\uC870 \uD45C\uC2DC\uD574\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB4E4\uC5EC\uC4F0\uAE30 \uAC00\uC774\uB4DC\uB97C \uB80C\uB354\uB9C1\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD65C\uC131 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120\uC744 \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uBE0C\uB798\uD0B7 \uC548\uB0B4\uC120\uC774 \uAC15\uC870 \uD45C\uC2DC\uB41C \uACBD\uC6B0\uC5D0\uB3C4 \uD65C\uC131 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120\uC744 \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uD65C\uC131 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120\uC744 \uAC15\uC870 \uD45C\uC2DC\uD558\uC9C0 \uB9C8\uC138\uC694.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD65C\uC131 \uB4E4\uC5EC\uC4F0\uAE30 \uAC00\uC774\uB4DC\uB97C \uAC15\uC870 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCEE4\uC11C\uC758 \uD14D\uC2A4\uD2B8 \uC624\uB978\uCABD\uC744 \uB36E\uC5B4 \uC4F0\uC9C0\uC54A\uACE0 \uC81C\uC548\uC744 \uC0BD\uC785\uD569\uB2C8\uB2E4.","\uC81C\uC548\uC744 \uC0BD\uC785\uD558\uACE0 \uCEE4\uC11C\uC758 \uC624\uB978\uCABD \uD14D\uC2A4\uD2B8\uB97C \uB36E\uC5B4\uC501\uB2C8\uB2E4.","\uC644\uB8CC\uB97C \uC218\uB77D\uD560 \uB54C \uB2E8\uC5B4\uB97C \uB36E\uC5B4\uC4F8\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC774\uAC83\uC740 \uC774 \uAE30\uB2A5\uC744 \uC120\uD0DD\uD558\uB294 \uD655\uC7A5\uC5D0 \uB530\uB77C \uB2E4\uB985\uB2C8\uB2E4.","\uC81C\uC548 \uD544\uD130\uB9C1 \uBC0F \uC815\uB82C\uC5D0\uC11C \uC791\uC740 \uC624\uD0C0\uB97C \uC124\uBA85\uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC815\uB82C\uD560 \uB54C \uCEE4\uC11C \uADFC\uCC98\uC5D0 \uD45C\uC2DC\uB418\uB294 \uB2E8\uC5B4\uB97C \uC6B0\uC120\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC800\uC7A5\uB41C \uC81C\uC548 \uC0AC\uD56D \uC120\uD0DD \uD56D\uBAA9\uC744 \uC5EC\uB7EC \uC791\uC5C5 \uC601\uC5ED \uBC0F \uCC3D\uC5D0\uC11C \uACF5\uC720\uD560 \uAC83\uC778\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4(`#editor.suggestSelection#` \uD544\uC694).","IntelliSense\uB97C \uC790\uB3D9\uC73C\uB85C \uD2B8\uB9AC\uAC70\uD560 \uB54C \uD56D\uC0C1 \uC81C\uC548\uC744 \uC120\uD0DD\uD569\uB2C8\uB2E4.","IntelliSense\uB97C \uC790\uB3D9\uC73C\uB85C \uD2B8\uB9AC\uAC70\uD560 \uB54C \uC81C\uC548\uC744 \uC120\uD0DD\uD558\uC9C0 \uB9C8\uC138\uC694.","\uD2B8\uB9AC\uAC70 \uBB38\uC790\uC5D0\uC11C IntelliSense\uB97C \uD2B8\uB9AC\uAC70\uD560 \uB54C\uB9CC \uC81C\uC548\uC744 \uC120\uD0DD\uD569\uB2C8\uB2E4.","\uC785\uB825\uD560 \uB54C IntelliSense\uB97C \uD2B8\uB9AC\uAC70\uD560 \uB54C\uB9CC \uC81C\uC548\uC744 \uC120\uD0DD\uD569\uB2C8\uB2E4.","\uC704\uC82F\uC774 \uD45C\uC2DC\uB420 \uB54C \uC81C\uC548\uC744 \uC120\uD0DD\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC774\uB294 \uC790\uB3D9\uC73C\uB85C \uD2B8\uB9AC\uAC70\uB41C \uC81C\uC548('#editor.quickSuggestions#' \uBC0F '#editor.suggestOnTriggerCharacters#')\uC5D0\uB9CC \uC801\uC6A9\uB418\uBA70, \uC81C\uC548\uC774 \uBA85\uC2DC\uC801\uC73C\uB85C \uD638\uCD9C\uB420 \uB54C \uD56D\uC0C1 \uC120\uD0DD\uB429\uB2C8\uB2E4(\uC608: 'Ctrl+Space'\uB97C \uD1B5\uD574).","\uD65C\uC131 \uCF54\uB4DC \uC870\uAC01\uC774 \uBE60\uB978 \uC81C\uC548\uC744 \uBC29\uC9C0\uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC81C\uC548\uC758 \uC544\uC774\uCF58\uC744 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F \uD558\uB2E8\uC758 \uC0C1\uD0DC \uD45C\uC2DC\uC904 \uAC00\uC2DC\uC131\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC81C\uC548 \uACB0\uACFC\uB97C \uBBF8\uB9AC\uBCFC\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC81C\uC548 \uC138\uBD80 \uC815\uBCF4\uAC00 \uB808\uC774\uBE14\uACFC \uD568\uAED8 \uC778\uB77C\uC778\uC5D0 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC544\uB2C8\uBA74 \uC138\uBD80 \uC815\uBCF4 \uC704\uC82F\uC5D0\uB9CC \uD45C\uC2DC\uB418\uB294\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC774 \uC124\uC815\uC740 \uB354 \uC774\uC0C1 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC774\uC81C \uC81C\uC548 \uC704\uC82F\uC758 \uD06C\uAE30\uB97C \uC870\uC815\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC774 \uC124\uC815\uC740 \uB354 \uC774\uC0C1 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 'editor.suggest.showKeywords'\uB610\uB294 'editor.suggest.showSnippets'\uC640 \uAC19\uC740 \uBCC4\uB3C4\uC758 \uC124\uC815\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 `\uBA54\uC11C\uB4DC` \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD568\uC218' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC0DD\uC131\uC790' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC74C' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","IntelliSense \uD544\uD130\uB9C1\uC744 \uD65C\uC131\uD654\uD558\uBA74 \uCCAB \uBC88\uC9F8 \uBB38\uC790\uAC00 \uB2E8\uC5B4 \uC2DC\uC791 \uBD80\uBD84\uACFC \uC77C\uCE58\uD574\uC57C \uD569\uB2C8\uB2E4(\uC608: `c`\uC758 \uACBD\uC6B0 `Console` \uB610\uB294 `WebContext`\uAC00 \uB420 \uC218 \uC788\uC73C\uBA70 `description`\uC740 _\uC548 \uB428_). \uBE44\uD65C\uC131\uD654\uD558\uBA74 IntelliSense\uAC00 \uB354 \uB9CE\uC740 \uACB0\uACFC\uB97C \uD45C\uC2DC\uD558\uC9C0\uB9CC \uC5EC\uC804\uD788 \uC77C\uCE58 \uD488\uC9C8\uC744 \uAE30\uC900\uC73C\uB85C \uC815\uB82C\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD544\uB4DC' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uBCC0\uC218' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD074\uB798\uC2A4' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uAD6C\uC870' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC778\uD130\uD398\uC774\uC2A4' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uBAA8\uB4C8' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC18D\uC131' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC774\uBCA4\uD2B8' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 `\uC5F0\uC0B0\uC790` \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uB2E8\uC704' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uAC12' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC0C1\uC218' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC5F4\uAC70\uD615' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 `enumMember` \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD0A4\uC6CC\uB4DC' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD14D\uC2A4\uD2B8' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC0C9' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 `\uD30C\uC77C` \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uCC38\uC870' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC0AC\uC6A9\uC790 \uC9C0\uC815 \uC0C9' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD3F4\uB354' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB41C \uACBD\uC6B0 IntelliSense\uC5D0 'typeParameter' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uCF54\uB4DC \uC870\uAC01' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","IntelliSense\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD558\uBA74 `user`-\uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","IntelliSense\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD55C \uACBD\uC6B0 `issues`-\uC81C\uC548\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC120\uD589 \uBC0F \uD6C4\uD589 \uACF5\uBC31\uC744 \uD56D\uC0C1 \uC120\uD0DD\uD574\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uC785\uB2C8\uB2E4.","\uD558\uC704 \uB2E8\uC5B4(\uC608: 'fooBar'\uC758 'foo' \uB610\uB294 'foo_bar')\uB97C \uC120\uD0DD\uD574\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uC785\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC904 \uBC14\uAFC8 \uD589\uC774 \uC5F4 1\uC5D0\uC11C \uC2DC\uC791\uB429\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uD589\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uAC00 \uBD80\uBAA8\uC640 \uB3D9\uC77C\uD569\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uD589\uC774 \uBD80\uBAA8 \uCABD\uC73C\uB85C +1\uB9CC\uD07C \uB4E4\uC5EC\uC4F0\uAE30\uB429\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uD589\uC774 \uBD80\uBAA8 \uCABD\uC73C\uB85C +2\uB9CC\uD07C \uB4E4\uC5EC\uC4F0\uAE30\uB429\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uD589\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD30C\uC77C\uC744 \uC5EC\uB294 \uB300\uC2E0 `shift`\uB97C \uB204\uB978 \uCC44 \uD30C\uC77C\uC744 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30\uB85C \uB04C\uC5B4\uC11C \uB193\uC744 \uC218 \uC788\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0 \uD30C\uC77C\uC744 \uB04C\uC5B4 \uB193\uC744 \uB54C \uC704\uC82F\uC744 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC774 \uC704\uC82F\uC744 \uC0AC\uC6A9\uD558\uBA74 \uD30C\uC77C\uC744 \uB4DC\uB86D\uD558\uB294 \uBC29\uBC95\uC744 \uC81C\uC5B4\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD30C\uC77C\uC774 \uD3B8\uC9D1\uAE30\uC5D0 \uB4DC\uB86D\uB41C \uD6C4 \uB4DC\uB86D \uC120\uD0DD\uAE30 \uC704\uC82F\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB4DC\uB86D \uC120\uD0DD\uAE30 \uC704\uC82F\uC744 \uD45C\uC2DC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 \uAE30\uBCF8 \uB4DC\uB86D \uACF5\uAE09\uC790\uAC00 \uD56D\uC0C1 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uCF58\uD150\uCE20\uB97C \uB2E4\uB978 \uBC29\uBC95\uC73C\uB85C \uBD99\uC5EC\uB123\uC744 \uC218 \uC788\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCF58\uD150\uCE20\uB97C \uD3B8\uC9D1\uAE30\uC5D0 \uBD99\uC5EC\uB123\uC744 \uB54C \uC704\uC82F\uC744 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC774 \uC704\uC82F\uC744 \uC0AC\uC6A9\uD558\uC5EC \uD30C\uC77C\uC744 \uBD99\uC5EC\uB123\uB294 \uBC29\uBC95\uC744 \uC81C\uC5B4\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uCF58\uD150\uCE20\uB97C \uD3B8\uC9D1\uAE30\uC5D0 \uBD99\uC5EC\uB123\uC740 \uD6C4 \uBD99\uC5EC\uB123\uAE30 \uC120\uD0DD\uAE30 \uC704\uC82F\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uBD99\uC5EC\uB123\uAE30 \uC120\uD0DD\uAE30 \uC704\uC82F\uC744 \uD45C\uC2DC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 \uAE30\uBCF8 \uBD99\uC5EC\uB123\uAE30 \uB3D9\uC791\uC774 \uD56D\uC0C1 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uCEE4\uBC0B \uBB38\uC790\uC5D0 \uB300\uD55C \uC81C\uC548\uC744 \uD5C8\uC6A9\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC608\uB97C \uB4E4\uC5B4 JavaScript\uC5D0\uC11C\uB294 \uC138\uBBF8\uCF5C\uB860(';')\uC774 \uC81C\uC548\uC744 \uD5C8\uC6A9\uD558\uACE0 \uD574\uB2F9 \uBB38\uC790\uB97C \uC785\uB825\uD558\uB294 \uCEE4\uBC0B \uBB38\uC790\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8\uB97C \uBCC0\uACBD\uD560 \uB54C `Enter` \uD0A4\uB97C \uC0AC\uC6A9\uD55C \uC81C\uC548\uB9CC \uD5C8\uC6A9\uD569\uB2C8\uB2E4.","'Tab' \uD0A4 \uC678\uC5D0 'Enter' \uD0A4\uC5D0 \uB300\uD55C \uC81C\uC548\uB3C4 \uD5C8\uC6A9\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC0C8 \uC904\uC744 \uC0BD\uC785\uD558\uB294 \uB3D9\uC791\uACFC \uC81C\uC548\uC744 \uD5C8\uC6A9\uD558\uB294 \uB3D9\uC791 \uAC04\uC758 \uBAA8\uD638\uD568\uC744 \uC5C6\uC568 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8\uC5D0\uC11C \uD55C \uBC88\uC5D0 \uC77D\uC744 \uC218 \uC788\uB294 \uD3B8\uC9D1\uAE30 \uC904 \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8\uC744 \uAC80\uC0C9\uD558\uBA74 \uAE30\uBCF8\uAC12\uC774 500\uC73C\uB85C \uC790\uB3D9 \uC124\uC815\uB429\uB2C8\uB2E4. \uACBD\uACE0: \uAE30\uBCF8\uAC12\uBCF4\uB2E4 \uD070 \uC218\uC758 \uACBD\uC6B0 \uC131\uB2A5\uC5D0 \uC601\uD5A5\uC744 \uBBF8\uCE69\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCF58\uD150\uCE20","\uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8\uC5D0\uC11C \uC778\uB77C\uC778 \uC81C\uC548\uC744 \uBC1C\uD45C\uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5B8\uC5B4 \uAD6C\uC131\uC744 \uC0AC\uC6A9\uD558\uC5EC \uB300\uAD04\uD638\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC744 \uACBD\uC6B0\uB97C \uACB0\uC815\uD569\uB2C8\uB2E4.","\uCEE4\uC11C\uAC00 \uACF5\uBC31\uC758 \uC67C\uCABD\uC5D0 \uC788\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uB300\uAD04\uD638\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC2B5\uB2C8\uB2E4.","\uC0AC\uC6A9\uC790\uAC00 \uC5EC\uB294 \uAD04\uD638\uB97C \uCD94\uAC00\uD55C \uD6C4 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uAD04\uD638\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC744\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5B8\uC5B4 \uAD6C\uC131\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC8FC\uC11D\uC744 \uC790\uB3D9\uC73C\uB85C \uB2EB\uC744 \uACBD\uC6B0\uB97C \uACB0\uC815\uD569\uB2C8\uB2E4.","\uCEE4\uC11C\uAC00 \uACF5\uBC31\uC758 \uC67C\uCABD\uC5D0 \uC788\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uC8FC\uC11D\uC744 \uC790\uB3D9\uC73C\uB85C \uB2EB\uC2B5\uB2C8\uB2E4.","\uC0AC\uC6A9\uC790\uAC00 \uC5EC\uB294 \uC8FC\uC11D\uC744 \uCD94\uAC00\uD55C \uD6C4 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC8FC\uC11D\uC744 \uC790\uB3D9\uC73C\uB85C \uB2EB\uC744\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC778\uC811\uD55C \uB2EB\uB294 \uB530\uC634\uD45C \uB610\uB294 \uB300\uAD04\uD638\uAC00 \uC790\uB3D9\uC73C\uB85C \uC0BD\uC785\uB41C \uACBD\uC6B0\uC5D0\uB9CC \uC81C\uAC70\uD569\uB2C8\uB2E4.","\uC0AD\uC81C\uD560 \uB54C \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uC811\uD55C \uB2EB\uB294 \uB530\uC634\uD45C \uB610\uB294 \uB300\uAD04\uD638\uB97C \uC81C\uAC70\uD574\uC57C \uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB2EB\uAE30 \uB530\uC634\uD45C \uB610\uB294 \uB300\uAD04\uD638\uAC00 \uC790\uB3D9\uC73C\uB85C \uC0BD\uC785\uB41C \uACBD\uC6B0\uC5D0\uB9CC \uD574\uB2F9 \uD56D\uBAA9 \uC704\uC5D0 \uC785\uB825\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uC790\uAC00 \uB2EB\uB294 \uB530\uC634\uD45C \uB610\uB294 \uB300\uAD04\uD638 \uC704\uC5D0 \uC785\uB825\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5B8\uC5B4 \uAD6C\uC131\uC744 \uC0AC\uC6A9\uD558\uC5EC \uB530\uC634\uD45C\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC744 \uACBD\uC6B0\uB97C \uACB0\uC815\uD569\uB2C8\uB2E4.","\uCEE4\uC11C\uAC00 \uACF5\uBC31\uC758 \uC67C\uCABD\uC5D0 \uC788\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uB530\uC634\uD45C\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC2B5\uB2C8\uB2E4.","\uC0AC\uC6A9\uC790\uAC00 \uC5EC\uB294 \uB530\uC634\uD45C\uB97C \uCD94\uAC00\uD55C \uD6C4 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB530\uC634\uD45C\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC744\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC790\uB3D9\uC73C\uB85C \uC0BD\uC785\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uD604\uC7AC \uC904\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC720\uC9C0\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uD604\uC7AC \uC904\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC720\uC9C0\uD558\uACE0 \uC5B8\uC5B4 \uC815\uC758 \uB300\uAD04\uD638\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uD604\uC7AC \uC904\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC720\uC9C0\uD558\uACE0 \uC5B8\uC5B4 \uC815\uC758 \uB300\uAD04\uD638\uB97C \uC874\uC911\uD558\uBA70 \uC5B8\uC5B4\uBCC4\uB85C \uC815\uC758\uB41C \uD2B9\uBCC4 EnterRules\uB97C \uD638\uCD9C\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uD604\uC7AC \uC904\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC720\uC9C0\uD558\uACE0, \uC5B8\uC5B4 \uC815\uC758 \uB300\uAD04\uD638\uB97C \uC874\uC911\uD558\uACE0, \uC5B8\uC5B4\uC5D0 \uC758\uD574 \uC815\uC758\uB41C \uD2B9\uBCC4 EnterRules\uB97C \uD638\uCD9C\uD558\uACE0, \uC5B8\uC5B4\uC5D0 \uC758\uD574 \uC815\uC758\uB41C \uB4E4\uC5EC\uC4F0\uAE30 \uADDC\uCE59\uC744 \uC874\uC911\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9\uC790\uAC00 \uC904\uC744 \uC785\uB825, \uBD99\uC5EC\uB123\uAE30, \uC774\uB3D9 \uB610\uB294 \uB4E4\uC5EC\uC4F0\uAE30 \uD560 \uB54C \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC790\uB3D9\uC73C\uB85C \uC870\uC815\uD558\uB3C4\uB85D \uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5B8\uC5B4 \uAD6C\uC131\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC120\uD0DD \uD56D\uBAA9\uC744 \uC790\uB3D9\uC73C\uB85C \uB458\uB7EC\uC300 \uACBD\uC6B0\uB97C \uACB0\uC815\uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638\uAC00 \uC544\uB2CC \uB530\uC634\uD45C\uB85C \uB458\uB7EC\uC309\uB2C8\uB2E4.","\uB530\uC634\uD45C\uAC00 \uC544\uB2CC \uB300\uAD04\uD638\uB85C \uB458\uB7EC\uC309\uB2C8\uB2E4.","\uB530\uC634\uD45C \uB610\uB294 \uB300\uAD04\uD638 \uC785\uB825 \uC2DC \uD3B8\uC9D1\uAE30\uAC00 \uC790\uB3D9\uC73C\uB85C \uC120\uD0DD \uC601\uC5ED\uC744 \uB458\uB7EC\uC300\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30\uC5D0 \uACF5\uBC31\uC744 \uC0AC\uC6A9\uD560 \uB54C \uD0ED \uBB38\uC790\uC758 \uC120\uD0DD \uB3D9\uC791\uC744 \uC5D0\uBBAC\uB808\uC774\uD2B8\uD569\uB2C8\uB2E4. \uC120\uD0DD \uC601\uC5ED\uC774 \uD0ED \uC815\uC9C0\uC5D0 \uACE0\uC815\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C CodeLens\uB97C \uD45C\uC2DC\uD560 \uAC83\uC778\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","CodeLens\uC758 \uAE00\uAF34 \uD328\uBC00\uB9AC\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","CodeLens\uC758 \uAE00\uAF34 \uD06C\uAE30(\uD53D\uC140)\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. 0\uC73C\uB85C \uC124\uC815\uD558\uBA74 `#editor.fontSize#`\uC758 90%\uAC00 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uB77C\uC778 \uC0C9 \uB370\uCF54\uB808\uC774\uD130 \uBC0F \uC0C9 \uC120\uD0DD\uC744 \uB80C\uB354\uB9C1\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC0C9 \uB370\uCF54\uB808\uC774\uD130\uB97C \uD074\uB9AD\uD558\uACE0 \uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0AC \uB54C \uC0C9 \uC120\uD0DD\uAE30\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC0C9 \uB370\uCF54\uB808\uC774\uD130\uB97C \uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0A4\uBA74 \uC0C9 \uC120\uD0DD\uAE30\uAC00 \uD45C\uC2DC\uB418\uB3C4\uB85D \uC124\uC815","\uC0C9 \uB370\uCF54\uB808\uC774\uD130\uB97C \uD074\uB9AD\uD560 \uB54C \uC0C9 \uC120\uD0DD\uAE30\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC0C9 \uB370\uCF54\uB808\uC774\uD130\uC5D0\uC11C \uC0C9 \uC120\uD0DD\uAE30\uB97C \uD45C\uC2DC\uD558\uB3C4\uB85D \uC870\uAC74\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD55C \uBC88\uC5D0 \uB80C\uB354\uB9C1\uD560 \uC218 \uC788\uB294 \uCD5C\uB300 \uC0C9 \uB370\uCF54\uB808\uC774\uD130 \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uC640 \uD0A4\uB85C \uC120\uD0DD\uD55C \uC601\uC5ED\uC5D0\uC11C \uC5F4\uC744 \uC120\uD0DD\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uAD6C\uBB38 \uAC15\uC870 \uD45C\uC2DC\uB97C \uD074\uB9BD\uBCF4\uB4DC\uB85C \uBCF5\uC0AC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCEE4\uC11C \uC560\uB2C8\uBA54\uC774\uC158 \uC2A4\uD0C0\uC77C\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBD80\uB4DC\uB7EC\uC6B4 \uCE90\uB7FF \uC560\uB2C8\uBA54\uC774\uC158\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBD80\uB4DC\uB7EC\uC6B4 \uCE90\uB7FF \uC560\uB2C8\uBA54\uC774\uC158\uC740 \uC0AC\uC6A9\uC790\uAC00 \uBA85\uC2DC\uC801 \uC81C\uC2A4\uCC98\uB97C \uC0AC\uC6A9\uD558\uC5EC \uCEE4\uC11C\uB97C \uC774\uB3D9\uD560 \uB54C\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uBD80\uB4DC\uB7EC\uC6B4 \uCE90\uB7FF \uC560\uB2C8\uBA54\uC774\uC158\uC740 \uD56D\uC0C1 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uB9E4\uB044\uB7EC\uC6B4 \uCE90\uB7FF \uC560\uB2C8\uBA54\uC774\uC158\uC758 \uC0AC\uC6A9 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCEE4\uC11C \uC2A4\uD0C0\uC77C\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCEE4\uC11C \uC8FC\uBCC0\uC5D0 \uD45C\uC2DC\uB418\uB294 \uC120\uD589 \uC904(\uCD5C\uC18C 0)\uACFC \uD6C4\uD589 \uC904(\uCD5C\uC18C 1)\uC758 \uCD5C\uC18C \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC77C\uBD80 \uB2E4\uB978 \uD3B8\uC9D1\uAE30\uC5D0\uC11C\uB294 'scrollOff' \uB610\uB294 'scrollOffset'\uC73C\uB85C \uC54C\uB824\uC838 \uC788\uC2B5\uB2C8\uB2E4.","'cursorSurroundingLines'\uB294 \uD0A4\uBCF4\uB4DC \uB098 API\uB97C \uD1B5\uD574 \uD2B8\uB9AC\uAC70\uB420 \uB54C\uB9CC \uC801\uC6A9\uB429\uB2C8\uB2E4.","`cursorSurroundingLines`\uB294 \uD56D\uC0C1 \uC801\uC6A9\uB429\uB2C8\uB2E4.","'#cursorSurroundingLines#'\uB97C \uC801\uC6A9\uD574\uC57C \uD558\uB294 \uACBD\uC6B0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","`#editor.cursorStyle#` \uC124\uC815\uC774 'line'\uC73C\uB85C \uC124\uC815\uB418\uC5B4 \uC788\uC744 \uB54C \uCEE4\uC11C\uC758 \uB113\uC774\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB04C\uC5B4\uC11C \uB193\uAE30\uB85C \uC120\uD0DD \uC601\uC5ED\uC744 \uC774\uB3D9\uD560 \uC218 \uC788\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","svgs\uC640 \uD568\uAED8 \uC0C8 \uB80C\uB354\uB9C1 \uBA54\uC11C\uB4DC\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uAE00\uAF34 \uBB38\uC790\uC640 \uD568\uAED8 \uC0C8 \uB80C\uB354\uB9C1 \uBC29\uBC95\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uC548\uC815\uC801\uC778 \uB80C\uB354\uB9C1 \uBC29\uBC95\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uACF5\uBC31\uC774 \uC0C8\uB85C\uC6B4 \uC2E4\uD5D8\uC801 \uBA54\uC11C\uB4DC\uB85C \uB80C\uB354\uB9C1\uB418\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","'Alt' \uD0A4\uB97C \uB204\uB97C \uB54C \uC2A4\uD06C\uB864 \uC18D\uB3C4 \uC2B9\uC218\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0 \uCF54\uB4DC \uC811\uAE30\uAC00 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uACBD\uC6B0 \uC5B8\uC5B4\uBCC4 \uC811\uAE30 \uC804\uB7B5\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4. \uADF8\uB807\uC9C0 \uC54A\uC740 \uACBD\uC6B0 \uB4E4\uC5EC\uC4F0\uAE30 \uAE30\uBC18 \uC804\uB7B5\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30 \uAE30\uBC18 \uC811\uAE30 \uC804\uB7B5\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uC811\uAE30 \uBC94\uC704\uB97C \uACC4\uC0B0\uD558\uAE30 \uC704\uD55C \uC804\uB7B5\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC811\uD78C \uBC94\uC704\uB97C \uAC15\uC870 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uAC00\uC838\uC624\uAE30 \uBC94\uC704\uB97C \uC790\uB3D9\uC73C\uB85C \uCD95\uC18C\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3F4\uB354\uBE14 \uC601\uC5ED\uC758 \uCD5C\uB300 \uC218\uC785\uB2C8\uB2E4. \uD604\uC7AC \uC6D0\uBCF8\uC5D0 \uD3F4\uB354\uBE14 \uC601\uC5ED\uC774 \uB9CE\uC744 \uB54C \uC774 \uAC12\uC744 \uB298\uB9AC\uBA74 \uD3B8\uC9D1\uAE30\uC758 \uBC18\uC751\uC774 \uB5A8\uC5B4\uC9C8 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC811\uD78C \uC904\uC774 \uC904\uC744 \uD3BC\uCE5C \uD6C4 \uBE48 \uCF58\uD150\uCE20\uB97C \uD074\uB9AD\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAE00\uAF34 \uD328\uBC00\uB9AC\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBD99\uC5EC\uB123\uC740 \uCF58\uD150\uCE20\uC758 \uC11C\uC2DD\uC744 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uC9C0\uC815\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uD3EC\uB9F7\uD130\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC788\uC5B4\uC57C \uD558\uBA70 \uD3EC\uB9F7\uD130\uAC00 \uBB38\uC11C\uC5D0\uC11C \uBC94\uC704\uC758 \uC11C\uC2DD\uC744 \uC9C0\uC815\uD560 \uC218 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4.","\uC785\uB825 \uD6C4 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uC904\uC758 \uC11C\uC2DD\uC744 \uC9C0\uC815\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC138\uB85C \uBB38\uC790 \uBAA8\uC591 \uC5EC\uBC31\uC744 \uB80C\uB354\uB9C1\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uBB38\uC790 \uBAA8\uC591 \uC5EC\uBC31\uC740 \uC8FC\uB85C \uB514\uBC84\uAE45\uC5D0 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uCEE4\uC11C\uAC00 \uAC1C\uC694 \uB208\uAE08\uC790\uC5D0\uC11C \uAC00\uB824\uC838\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBB38\uC790 \uAC04\uACA9(\uD53D\uC140)\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC5F0\uACB0\uB41C \uD3B8\uC9D1\uC774 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uC5C8\uB294\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC5B8\uC5B4\uC5D0 \uB530\uB77C \uAD00\uB828 \uAE30\uD638(\uC608: HTML \uD0DC\uADF8)\uAC00 \uD3B8\uC9D1 \uC911\uC5D0 \uC5C5\uB370\uC774\uD2B8\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB9C1\uD06C\uB97C \uAC10\uC9C0\uD558\uACE0 \uD074\uB9AD\uD560 \uC218 \uC788\uAC8C \uB9CC\uB4E4\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uB300\uAD04\uD638\uB97C \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4 \uD720 \uC2A4\uD06C\uB864 \uC774\uBCA4\uD2B8\uC758 `deltaX` \uBC0F `deltaY`\uC5D0\uC11C \uC0AC\uC6A9\uD560 \uC2B9\uC218\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4 \uD720\uC744 \uC0AC\uC6A9\uD560 \uB54C 'Cmd` \uD0A4\uB97C \uB204\uB974\uACE0 \uC788\uC73C\uBA74 \uD3B8\uC9D1\uAE30\uC758 \uAE00\uAF34\uC744 \uD655\uB300/\uCD95\uC18C\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4 \uD720\uC744 \uC0AC\uC6A9\uD560 \uB54C 'Ctrl' \uD0A4\uB97C \uB204\uB974\uACE0 \uC788\uC73C\uBA74 \uD3B8\uC9D1\uAE30\uC758 \uAE00\uAF34\uC744 \uD655\uB300/\uCD95\uC18C\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uCEE4\uC11C\uAC00 \uACB9\uCE58\uB294 \uACBD\uC6B0 \uCEE4\uC11C\uB97C \uBCD1\uD569\uD569\uB2C8\uB2E4.","Windows\uC640 Linux\uC758 'Control'\uC744 macOS\uC758 'Command'\uB85C \uB9E4\uD551\uD569\uB2C8\uB2E4.","Windows\uC640 Linux\uC758 'Alt'\uB97C macOS\uC758 'Option'\uC73C\uB85C \uB9E4\uD551\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uC5EC\uB7EC \uCEE4\uC11C\uB97C \uCD94\uAC00\uD560 \uB54C \uC0AC\uC6A9\uD560 \uC218\uC815\uC790\uC785\uB2C8\uB2E4. [\uC815\uC758\uB85C \uC774\uB3D9] \uBC0F [\uB9C1\uD06C \uC5F4\uAE30] \uB9C8\uC6B0\uC2A4 \uC81C\uC2A4\uCC98\uAC00 [\uBA40\uD2F0\uCEE4\uC11C \uC218\uC815\uC790\uC640](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier) \uCDA9\uB3CC\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC870\uC815\uB429\uB2C8\uB2E4.","\uAC01 \uCEE4\uC11C\uB294 \uD14D\uC2A4\uD2B8 \uD55C \uC904\uC744 \uBD99\uC5EC\uB123\uC2B5\uB2C8\uB2E4.","\uAC01 \uCEE4\uC11C\uB294 \uC804\uCCB4 \uD14D\uC2A4\uD2B8\uB97C \uBD99\uC5EC\uB123\uC2B5\uB2C8\uB2E4.","\uBD99\uC5EC\uB123\uC740 \uD14D\uC2A4\uD2B8\uC758 \uC904 \uC218\uAC00 \uCEE4\uC11C \uC218\uC640 \uC77C\uCE58\uD558\uB294 \uACBD\uC6B0 \uBD99\uC5EC\uB123\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD55C \uBC88\uC5D0 \uD65C\uC131 \uD3B8\uC9D1\uAE30\uC5D0 \uC788\uC744 \uC218 \uC788\uB294 \uCD5C\uB300 \uCEE4\uC11C \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBC1C\uC0DD \uD56D\uBAA9\uC744 \uAC15\uC870 \uD45C\uC2DC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uD604\uC7AC \uD30C\uC77C\uC758 \uBC1C\uC0DD \uD56D\uBAA9\uB9CC \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC2E4\uD5D8\uC801: \uBAA8\uB4E0 \uC720\uD6A8\uD55C \uC5F4\uB9B0 \uD30C\uC77C\uC5D0\uC11C \uBC1C\uC0DD \uD56D\uBAA9\uC744 \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC5F4\uB9B0 \uD30C\uC77C \uC804\uCCB4\uC5D0\uC11C \uBC1C\uC0DD \uC218\uB97C \uAC15\uC870 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAC1C\uC694 \uB208\uAE08\uC790 \uC8FC\uC704\uC5D0 \uD14C\uB450\uB9AC\uB97C \uADF8\uB9B4\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","Peek\uB97C \uC5EC\uB294 \uB3D9\uC548 \uD2B8\uB9AC\uC5D0 \uD3EC\uCEE4\uC2A4","\uBBF8\uB9AC \uBCF4\uAE30\uB97C \uC5F4 \uB54C \uD3B8\uC9D1\uAE30\uC5D0 \uD3EC\uCEE4\uC2A4","\uBBF8\uB9AC \uBCF4\uAE30 \uC704\uC82F\uC5D0\uC11C \uC778\uB77C\uC778 \uD3B8\uC9D1\uAE30\uC5D0 \uD3EC\uCEE4\uC2A4\uB97C \uB458\uC9C0 \uB610\uB294 \uD2B8\uB9AC\uC5D0 \uD3EC\uCEE4\uC2A4\uB97C \uB458\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC774\uB3D9 \uC815\uC758 \uB9C8\uC6B0\uC2A4 \uC81C\uC2A4\uCC98\uAC00 \uD56D\uC0C1 \uBBF8\uB9AC \uBCF4\uAE30 \uC704\uC82F\uC744 \uC5F4\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBE60\uB978 \uC81C\uC548\uC744 \uD45C\uC2DC\uD558\uAE30 \uC804\uAE4C\uC9C0\uC758 \uC9C0\uC5F0 \uC2DC\uAC04(\uBC00\uB9AC\uCD08)\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uAC00 \uC720\uD615\uC5D0 \uB530\uB77C \uC790\uB3D9\uC73C\uB85C \uC774\uB984\uC744 \uBC14\uAFC0\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 `editor.linkedEditing`\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC81C\uC5B4 \uBB38\uC790\uB97C \uB80C\uB354\uB9C1\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD30C\uC77C\uC774 \uC904 \uBC14\uAFC8\uC73C\uB85C \uB05D\uB098\uBA74 \uB9C8\uC9C0\uB9C9 \uC904 \uBC88\uD638\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4.","\uC81C\uBCF8\uC6A9 \uC5EC\uBC31\uACFC \uD604\uC7AC \uC904\uC744 \uBAA8\uB450 \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uAC00 \uD604\uC7AC \uC904 \uAC15\uC870 \uD45C\uC2DC\uB97C \uB80C\uB354\uB9C1\uD558\uB294 \uBC29\uC2DD\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD604\uC7AC \uC904 \uAC15\uC870 \uD45C\uC2DC\uB97C \uB80C\uB354\uB9C1\uD574\uC57C \uD558\uB294\uC9C0 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB2E8\uC5B4 \uC0AC\uC774\uC758 \uACF5\uBC31 \uD558\uB098\uB97C \uC81C\uC678\uD55C \uACF5\uBC31 \uBB38\uC790\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4.","\uC120\uD0DD\uD55C \uD14D\uC2A4\uD2B8\uC5D0\uC11C\uB9CC \uACF5\uBC31 \uBB38\uC790\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4.","\uD6C4\uD589 \uACF5\uBC31 \uBB38\uC790\uB9CC \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACF5\uBC31 \uBB38\uC790\uB97C \uB80C\uB354\uB9C1\uD560 \uBC29\uBC95\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC120\uD0DD \uD56D\uBAA9\uC758 \uBAA8\uC11C\uB9AC\uB97C \uB465\uAE00\uAC8C \uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uAC00\uB85C\uB85C \uC2A4\uD06C\uB864\uB418\uB294 \uBC94\uC704\uB97C \uBC97\uC5B4\uB098\uB294 \uCD94\uAC00 \uBB38\uC790\uC758 \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB9C8\uC9C0\uB9C9 \uC904 \uC774\uD6C4\uB85C \uC2A4\uD06C\uB864\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC138\uB85C\uC640 \uAC00\uB85C\uB85C \uB3D9\uC2DC\uC5D0 \uC2A4\uD06C\uB864\uD560 \uB54C\uC5D0\uB9CC \uC8FC\uCD95\uC744 \uB530\uB77C\uC11C \uC2A4\uD06C\uB864\uD569\uB2C8\uB2E4. \uD2B8\uB799\uD328\uB4DC\uC5D0\uC11C \uC138\uB85C\uB85C \uC2A4\uD06C\uB864\uD560 \uB54C \uAC00\uB85C \uB4DC\uB9AC\uD504\uD2B8\uB97C \uBC29\uC9C0\uD569\uB2C8\uB2E4.","Linux \uC8FC \uD074\uB9BD\uBCF4\uB4DC\uC758 \uC9C0\uC6D0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uAC00 \uC120\uD0DD \uD56D\uBAA9\uACFC \uC720\uC0AC\uD55C \uC77C\uCE58 \uD56D\uBAA9\uC744 \uAC15\uC870 \uD45C\uC2DC\uD574\uC57C\uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC811\uAE30 \uCEE8\uD2B8\uB864\uC744 \uD56D\uC0C1 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC811\uAE30 \uCEE8\uD2B8\uB864\uC744 \uD45C\uC2DC\uD558\uC9C0 \uC54A\uACE0 \uC5EC\uBC31 \uD06C\uAE30\uB97C \uC904\uC774\uC138\uC694.","\uB9C8\uC6B0\uC2A4\uAC00 \uC5EC\uBC31 \uC704\uC5D0 \uC788\uC744 \uB54C\uC5D0\uB9CC \uC811\uAE30 \uCEE8\uD2B8\uB864\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC5EC\uBC31\uC758 \uC811\uAE30 \uCEE8\uD2B8\uB864\uC774 \uD45C\uC2DC\uB418\uB294 \uC2DC\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294 \uCF54\uB4DC\uC758 \uD398\uC774\uB4DC \uC544\uC6C3\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCDE8\uC18C\uC120 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uB294 \uBCC0\uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB2E4\uB978 \uC81C\uC548 \uC704\uC5D0 \uC870\uAC01 \uC81C\uC548\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB2E4\uB978 \uC81C\uC548 \uC544\uB798\uC5D0 \uC870\uAC01 \uC81C\uC548\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB2E4\uB978 \uC81C\uC548\uACFC \uD568\uAED8 \uC870\uAC01 \uC81C\uC548\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uC81C\uC548\uC744 \uD45C\uC2DC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01\uC774 \uB2E4\uB978 \uCD94\uCC9C\uACFC \uD568\uAED8 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80 \uBC0F \uC815\uB82C \uBC29\uBC95\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC560\uB2C8\uBA54\uC774\uC158\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC2A4\uD06C\uB864\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uC644\uC131\uC774 \uD45C\uC2DC\uB420 \uB54C \uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC811\uADFC\uC131 \uD78C\uD2B8\uB97C \uC81C\uACF5\uD574\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uAE00\uAF34 \uD06C\uAE30\uC785\uB2C8\uB2E4. {0}(\uC73C)\uB85C \uC124\uC815\uD558\uBA74 {1} \uAC12\uC774 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uC904 \uB192\uC774\uC785\uB2C8\uB2E4. {0}(\uC73C)\uB85C \uC124\uC815\uD558\uBA74 {1} \uAC12\uC774 \uC0AC\uC6A9\uB429\uB2C8\uB2E4. \uCD5C\uC18C\uAC12\uC740 8\uC785\uB2C8\uB2E4.","\uD2B8\uB9AC\uAC70 \uBB38\uC790\uB97C \uC785\uB825\uD560 \uB54C \uC81C\uC548\uC744 \uC790\uB3D9\uC73C\uB85C \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD56D\uC0C1 \uCCAB \uBC88\uC9F8 \uC81C\uC548\uC744 \uC120\uD0DD\uD569\uB2C8\uB2E4.","`log`\uAC00 \uCD5C\uADFC\uC5D0 \uC644\uB8CC\uB418\uC5C8\uC73C\uBBC0\uB85C \uCD94\uAC00 \uC785\uB825\uC5D0\uC11C \uC81C\uC548\uC744 \uC120\uD0DD\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0 \uCD5C\uADFC \uC81C\uC548\uC744 \uC120\uD0DD\uD558\uC138\uC694(\uC608: `console.| -> console.log`).","\uD574\uB2F9 \uC81C\uC548\uC744 \uC644\uB8CC\uD55C \uC774\uC804 \uC811\uB450\uC0AC\uC5D0 \uB530\uB77C \uC81C\uC548\uC744 \uC120\uD0DD\uD569\uB2C8\uB2E4(\uC608: `co -> console` \uBC0F `con -> const`).","\uC81C\uC548 \uBAA9\uB85D\uC744 \uD45C\uC2DC\uD560 \uB54C \uC81C\uD55C\uC774 \uBBF8\uB9AC \uC120\uD0DD\uB418\uB294 \uBC29\uC2DD\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD0ED \uC644\uB8CC\uB294 \uD0ED\uC744 \uB204\uB97C \uB54C \uAC00\uC7A5 \uC77C\uCE58\uD558\uB294 \uC81C\uC548\uC744 \uC0BD\uC785\uD569\uB2C8\uB2E4.","\uD0ED \uC644\uC131\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uC811\uB450\uC0AC\uAC00 \uC77C\uCE58\uD558\uB294 \uACBD\uC6B0 \uCF54\uB4DC \uC870\uAC01\uC744 \uD0ED \uC644\uB8CC\uD569\uB2C8\uB2E4. 'quickSuggestions'\uB97C \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uC744 \uB54C \uAC00\uC7A5 \uC798 \uC791\uB3D9\uD569\uB2C8\uB2E4.","\uD0ED \uC644\uC131\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790\uAC00 \uC790\uB3D9\uC73C\uB85C \uC81C\uAC70\uB429\uB2C8\uB2E4.","\uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790\uAC00 \uBB34\uC2DC\uB429\uB2C8\uB2E4.","\uC81C\uAC70\uD560 \uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790 \uD504\uB86C\uD504\uD2B8\uC785\uB2C8\uB2E4.","\uBB38\uC81C\uB97C \uC77C\uC73C\uD0AC \uC218 \uC788\uB294 \uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790\uB97C \uC81C\uAC70\uD569\uB2C8\uB2E4.","\uD0ED \uC815\uC9C0 \uB4A4\uC5D0 \uACF5\uBC31\uC744 \uC0BD\uC785 \uBC0F \uC0AD\uC81C\uD569\uB2C8\uB2E4.","\uAE30\uBCF8 \uC904 \uBC14\uAFC8 \uADDC\uCE59\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uB2E8\uC5B4 \uBD84\uB9AC\uB294 \uC911\uAD6D\uC5B4/\uC77C\uBCF8\uC5B4/\uD55C\uAD6D\uC5B4(CJK) \uD14D\uC2A4\uD2B8\uC5D0 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. CJK\uAC00 \uC544\uB2CC \uD14D\uC2A4\uD2B8 \uB3D9\uC791\uC740 \uC77C\uBC18 \uD14D\uC2A4\uD2B8 \uB3D9\uC791\uACFC \uAC19\uC2B5\uB2C8\uB2E4.","\uC911\uAD6D\uC5B4/\uC77C\uBCF8\uC5B4/\uD55C\uAD6D\uC5B4(CJK) \uD14D\uC2A4\uD2B8\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uB2E8\uC5B4 \uBD84\uB9AC \uADDC\uCE59\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB2E8\uC5B4 \uAD00\uB828 \uD0D0\uC0C9 \uB610\uB294 \uC791\uC5C5\uC744 \uC218\uD589\uD560 \uB54C \uB2E8\uC5B4 \uAD6C\uBD84 \uAE30\uD638\uB85C \uC0AC\uC6A9\uD560 \uBB38\uC790\uC785\uB2C8\uB2E4.","\uC904\uC774 \uBC14\uB00C\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uBDF0\uD3EC\uD2B8 \uB108\uBE44\uC5D0\uC11C \uC904\uC774 \uBC14\uB01D\uB2C8\uB2E4.","`#editor.wordWrapColumn#`\uC5D0\uC11C \uC904\uC774 \uBC14\uB01D\uB2C8\uB2E4.","\uBDF0\uD3EC\uD2B8\uC758 \uCD5C\uC18C\uAC12 \uBC0F `#editor.wordWrapColumn#`\uC5D0\uC11C \uC904\uC774 \uBC14\uB01D\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","`#editor.wordWrap#`\uC774 `wordWrapColumn` \uB610\uB294 'bounded'\uC778 \uACBD\uC6B0 \uD3B8\uC9D1\uAE30\uC758 \uC5F4 \uC904 \uBC14\uAFC8\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAE30\uBCF8 \uBB38\uC11C \uC0C9 \uACF5\uAE09\uC790\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC778\uB77C\uC778 \uC0C9 \uC7A5\uC2DD\uC744 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD0ED\uC744 \uBC1B\uC744\uC9C0 \uB610\uB294 \uD0D0\uC0C9\uC744 \uC704\uD574 \uC6CC\uD06C\uBCA4\uCE58\uB85C \uBBF8\uB8F0\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4."],"vs/editor/common/core/editorColorRegistry":["\uCEE4\uC11C \uC704\uCE58\uC758 \uC904 \uAC15\uC870 \uD45C\uC2DC\uC5D0 \uB300\uD55C \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCEE4\uC11C \uC704\uCE58\uC758 \uC904 \uD14C\uB450\uB9AC\uC5D0 \uB300\uD55C \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBE60\uB978 \uC5F4\uAE30 \uBC0F \uCC3E\uAE30 \uAE30\uB2A5 \uB4F1\uC744 \uD1B5\uD574 \uAC15\uC870 \uD45C\uC2DC\uB41C \uC601\uC5ED\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uAC15\uC870 \uC601\uC5ED \uC8FC\uBCC0\uC758 \uD14C\uB450\uB9AC\uC5D0 \uB300\uD55C \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4","\uAC15\uC870 \uD45C\uC2DC\uB41C \uAE30\uD638(\uC608: \uC815\uC758\uB85C \uC774\uB3D9 \uB610\uB294 \uB2E4\uC74C/\uC774\uC804 \uAE30\uD638\uB85C \uC774\uB3D9)\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC0C1\uC740 \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uAC15\uC870 \uD45C\uC2DC\uB41C \uAE30\uD638 \uC8FC\uC704\uC758 \uD14C\uB450\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCEE4\uC11C \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCEE4\uC11C\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBE14\uB85D \uCEE4\uC11C\uC640 \uACB9\uCE58\uB294 \uAE00\uC790\uC758 \uC0C9\uC0C1\uC744 \uC0AC\uC6A9\uC790 \uC815\uC758\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uACF5\uBC31 \uBB38\uC790 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC904 \uBC88\uD638 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9\uC785\uB2C8\uB2E4.","'editorIndentGuide.background'\uB294 \uB354 \uC774\uC0C1 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 'editorIndentGuide.background1'\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.","\uD65C\uC131 \uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9\uC785\uB2C8\uB2E4.","'editorIndentGuide.activeBackground'\uB294 \uB354 \uC774\uC0C1 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 'editorIndentGuide.activeBackground1'\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.","\uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9(1).","\uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9(2).","\uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9(3).","\uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9(4).","\uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9(5).","\uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9(6).","\uD65C\uC131 \uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9(1).","\uD65C\uC131 \uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9(2).","\uD65C\uC131 \uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9(3).","\uD65C\uC131 \uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9(4).","\uD65C\uC131 \uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9(5).","\uD65C\uC131 \uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9(6).","\uD3B8\uC9D1\uAE30 \uD65C\uC131 \uC601\uC5ED \uC904\uBC88\uD638 \uC0C9\uC0C1","ID\uB294 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 'editorLineNumber.activeForeground'\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.","\uD3B8\uC9D1\uAE30 \uD65C\uC131 \uC601\uC5ED \uC904\uBC88\uD638 \uC0C9\uC0C1","editor.renderFinalNewline\uC774 \uD750\uB9AC\uAC8C \uC124\uC815\uB41C \uACBD\uC6B0 \uCD5C\uC885 \uD3B8\uC9D1\uAE30 \uC904\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB208\uAE08\uC758 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCF54\uB4DC \uB80C\uC988\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uAD04\uD638 \uB4A4\uC758 \uBC30\uACBD\uC0C9","\uC77C\uCE58\uD558\uB294 \uBE0C\uB798\uD0B7 \uBC15\uC2A4\uC758 \uC0C9\uC0C1","\uAC1C\uC694 \uB208\uAE08 \uACBD\uACC4\uC758 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uAC1C\uC694 \uB208\uAE08\uC790\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uAC70\uD130\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAC70\uD130\uC5D0\uB294 \uAE00\uB9AC\uD504 \uC5EC\uBC31\uACFC \uD589 \uC218\uAC00 \uC788\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uBD88\uD544\uC694\uD55C(\uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294) \uC18C\uC2A4 \uCF54\uB4DC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.",`\uD3B8\uC9D1\uAE30\uC758 \uBD88\uD544\uC694\uD55C(\uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294) \uC18C\uC2A4 \uCF54\uB4DC \uBD88\uD22C\uBA85\uB3C4\uC785\uB2C8\uB2E4. \uC608\uB97C \uB4E4\uC5B4 "#000000c0"\uC740 75% \uBD88\uD22C\uBA85\uB3C4\uB85C \uCF54\uB4DC\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4. \uACE0\uB300\uBE44 \uD14C\uB9C8\uC758 \uACBD\uC6B0 \uD398\uC774\uB4DC \uC544\uC6C3\uD558\uC9C0 \uC54A\uACE0 'editorUnnecessaryCode.border' \uD14C\uB9C8 \uC0C9\uC744 \uC0AC\uC6A9\uD558\uC5EC \uBD88\uD544\uC694\uD55C \uCF54\uB4DC\uC5D0 \uBC11\uC904\uC744 \uADF8\uC73C\uC138\uC694.`,"\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACE0\uC2A4\uD2B8 \uD14D\uC2A4\uD2B8\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACE0\uC2A4\uD2B8 \uD14D\uC2A4\uD2B8\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACE0\uC2A4\uD2B8 \uD14D\uC2A4\uD2B8\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBC94\uC704\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC774 \uAC15\uC870 \uD45C\uC2DC\uB429\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC624\uB958\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uB9C8\uCEE4 \uC0C9\uC785\uB2C8\uB2E4.","\uACBD\uACE0\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uB9C8\uCEE4 \uC0C9\uC785\uB2C8\uB2E4.","\uC815\uBCF4\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uB9C8\uCEE4 \uC0C9\uC785\uB2C8\uB2E4.","\uB300\uAD04\uD638\uC758 \uC804\uACBD\uC0C9(1)\uC785\uB2C8\uB2E4. \uB300\uAD04\uD638 \uC30D \uC0C9 \uC9C0\uC815\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638\uC758 \uC804\uACBD\uC0C9(2)\uC785\uB2C8\uB2E4. \uB300\uAD04\uD638 \uC30D \uC0C9 \uC9C0\uC815\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638\uC758 \uC804\uACBD\uC0C9(3)\uC785\uB2C8\uB2E4. \uB300\uAD04\uD638 \uC30D \uC0C9 \uC9C0\uC815\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638\uC758 \uC804\uACBD\uC0C9(4)\uC785\uB2C8\uB2E4. \uB300\uAD04\uD638 \uC30D \uC0C9 \uC9C0\uC815\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638\uC758 \uC804\uACBD\uC0C9(5)\uC785\uB2C8\uB2E4. \uB300\uAD04\uD638 \uC30D \uC0C9 \uC9C0\uC815\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638\uC758 \uC804\uACBD\uC0C9(6)\uC785\uB2C8\uB2E4. \uB300\uAD04\uD638 \uC30D \uC0C9 \uC9C0\uC815\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uC608\uAE30\uCE58 \uC54A\uC740 \uB300\uAD04\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBE44\uD65C\uC131 \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4(1). \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uBE44\uD65C\uC131 \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4(2). \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uBE44\uD65C\uC131 \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4(3). \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uBE44\uD65C\uC131 \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4(4). \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uBE44\uD65C\uC131 \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4(5). \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uBE44\uD65C\uC131 \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4(6). \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uD65C\uC131 \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4(1). \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uD65C\uC131 \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4(2). \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uD65C\uC131 \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4(3). \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uD65C\uC131 \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4(4). \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uD65C\uC131 \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4(5). \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uD65C\uC131 \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4(6). \uB300\uAD04\uD638 \uC30D \uC548\uB0B4\uC120\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.","\uC720\uB2C8\uCF54\uB4DC \uBB38\uC790\uB97C \uAC15\uC870 \uD45C\uC2DC\uD558\uB294 \uB370 \uC0AC\uC6A9\uB418\uB294 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uC720\uB2C8\uCF54\uB4DC \uBB38\uC790\uB97C \uAC15\uC870 \uD45C\uC2DC\uD558\uB294 \uB370 \uC0AC\uC6A9\uB418\uB294 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4."],"vs/editor/common/editorContextKeys":["\uD3B8\uC9D1\uAE30 \uD14D\uC2A4\uD2B8\uC5D0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80(\uCEE4\uC11C\uAC00 \uAE5C\uBC15\uC784)","\uD3B8\uC9D1\uAE30 \uB610\uB294 \uD3B8\uC9D1\uAE30 \uC704\uC82F\uC5D0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80(\uC608: \uD3EC\uCEE4\uC2A4\uAC00 \uCC3E\uAE30 \uC704\uC82F\uC5D0 \uC788\uC74C)","\uD3B8\uC9D1\uAE30 \uB610\uB294 \uC11C\uC2DD \uC788\uB294 \uD14D\uC2A4\uD2B8 \uC785\uB825\uC5D0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80(\uCEE4\uC11C\uAC00 \uAE5C\uBC15\uC784)","\uD3B8\uC9D1\uAE30\uAC00 \uC77D\uAE30 \uC804\uC6A9\uC778\uC9C0 \uC5EC\uBD80","\uCEE8\uD14D\uC2A4\uD2B8\uAC00 diff \uD3B8\uC9D1\uAE30\uC778\uC9C0 \uC5EC\uBD80","\uCEE8\uD14D\uC2A4\uD2B8\uAC00 \uD3EC\uD568\uB41C diff \uD3B8\uC9D1\uAE30\uC778\uC9C0 \uC5EC\uBD80","\uCEE8\uD14D\uC2A4\uD2B8\uAC00 \uB2E4\uC911 diff \uD3B8\uC9D1\uAE30\uC778\uC9C0 \uC5EC\uBD80","\uB2E4\uC911 diff \uD3B8\uC9D1\uAE30\uC758 \uBAA8\uB4E0 \uD30C\uC77C\uC774 \uCD95\uC18C\uB418\uB294\uC9C0 \uC5EC\uBD80","diff \uD3B8\uC9D1\uAE30\uC5D0 \uBCC0\uACBD \uC0AC\uD56D\uC774 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uC774\uB3D9\uB41C \uCF54\uB4DC \uBE14\uB85D\uC774 \uBE44\uAD50\uB97C \uC704\uD574 \uC120\uD0DD\uB418\uC5C8\uB294\uC9C0 \uC5EC\uBD80","\uC561\uC138\uC2A4 \uAC00\uB2A5\uD55C Diff \uBDF0\uC5B4 \uD45C\uC2DC \uC5EC\uBD80","diff \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB098\uB780\uD788 \uC778\uB77C\uC778 \uC911\uB2E8\uC810\uC5D0 \uC5F0\uACB0\uD560\uC9C0 \uC5EC\uBD80","'editor.columnSelection'\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uC5B4 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uC120\uD0DD\uB41C \uD14D\uC2A4\uD2B8\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uC5EC\uB7EC \uAC1C\uC758 \uC120\uD0DD \uD56D\uBAA9\uC774 \uC788\uB294\uC9C0 \uC5EC\uBD80","'Tab' \uD0A4\uB97C \uB204\uB974\uBA74 \uD3B8\uC9D1\uAE30 \uBC16\uC73C\uB85C \uD3EC\uCEE4\uC2A4\uAC00 \uC774\uB3D9\uD558\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30 \uD638\uBC84\uAC00 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30 \uAC00\uB9AC\uD0A4\uAE30\uC5D0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uC2A4\uD2F0\uD0A4 \uC2A4\uD06C\uB864\uC758 \uD3EC\uCEE4\uC2A4 \uC5EC\uBD80","\uC2A4\uD2F0\uD0A4 \uC2A4\uD06C\uB864\uC758 \uAC00\uC2DC\uC131 \uC5EC\uBD80","\uB3C5\uB9BD \uC2E4\uD589\uD615 \uC0C9 \uD3B8\uC9D1\uAE30\uAC00 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80","\uB3C5\uB9BD \uC2E4\uD589\uD615 \uC0C9 \uD3B8\uC9D1\uAE30\uAC00 \uD3EC\uCEE4\uC2A4\uB418\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uAC00 \uB354 \uD070 \uD3B8\uC9D1\uAE30(\uC608: \uC804\uC790 \uD544\uAE30\uC7A5)\uC5D0 \uC18D\uD574 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC758 \uC5B8\uC5B4 \uC2DD\uBCC4\uC790","\uD3B8\uC9D1\uAE30\uC5D0 \uC644\uC131 \uD56D\uBAA9 \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uCF54\uB4DC \uC791\uC5C5 \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 CodeLens \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uC815\uC758 \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uC120\uC5B8 \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uAD6C\uD604 \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uD615\uC2DD \uC815\uC758 \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uD638\uBC84 \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uBB38\uC11C \uAC15\uC870 \uD45C\uC2DC \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uBB38\uC11C \uAE30\uD638 \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uCC38\uC870 \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uC774\uB984 \uBC14\uAFB8\uAE30 \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uC2DC\uADF8\uB2C8\uCC98 \uB3C4\uC6C0\uB9D0 \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uC778\uB77C\uC778 \uD78C\uD2B8 \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uBB38\uC11C \uC11C\uC2DD \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uBB38\uC11C \uC120\uD0DD \uC11C\uC2DD \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uC5EC\uB7EC \uAC1C\uC758 \uBB38\uC11C \uC11C\uC2DD \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD3B8\uC9D1\uAE30\uC5D0 \uC5EC\uB7EC \uAC1C\uC758 \uBB38\uC11C \uC120\uD0DD \uC11C\uC2DD \uACF5\uAE09\uC790\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80"],"vs/editor/common/languages":["\uBC30\uC5F4","\uBD80\uC6B8","\uD074\uB798\uC2A4","\uC0C1\uC218","\uC0DD\uC131\uC790","\uC5F4\uAC70\uD615","\uC5F4\uAC70\uD615 \uBA64\uBC84","\uC774\uBCA4\uD2B8","\uD544\uB4DC","\uD30C\uC77C","\uD568\uC218","\uC778\uD130\uD398\uC774\uC2A4","\uD0A4","\uBA54\uC11C\uB4DC","\uBAA8\uB4C8","\uB124\uC784\uC2A4\uD398\uC774\uC2A4","Null","\uC22B\uC790","\uAC1C\uCCB4","\uC5F0\uC0B0\uC790","\uD328\uD0A4\uC9C0","\uC18D\uC131","\uBB38\uC790\uC5F4","\uAD6C\uC870\uCCB4","\uD615\uC2DD \uB9E4\uAC1C \uBCC0\uC218","\uBCC0\uC218","{0}({1})"],"vs/editor/common/languages/modesRegistry":["\uC77C\uBC18 \uD14D\uC2A4\uD2B8"],"vs/editor/common/model/editStack":["\uC785\uB825\uD558\uB294 \uC911"],"vs/editor/common/standaloneStrings":["\uAC1C\uBC1C\uC790: \uAC80\uC0AC \uD1A0\uD070","\uC904/\uC5F4\uB85C \uC774\uB3D9...","\uBE60\uB978 \uC561\uC138\uC2A4 \uACF5\uAE09\uC790 \uBAA8\uB450 \uD45C\uC2DC","\uBA85\uB839 \uD314\uB808\uD2B8","\uBA85\uB839 \uD45C\uC2DC \uBC0F \uC2E4\uD589","\uAE30\uD638\uB85C \uAC00\uC11C...","\uBC94\uC8FC\uBCC4 \uAE30\uD638\uB85C \uC774\uB3D9...","\uD3B8\uC9D1\uAE30 \uCF58\uD150\uCE20","\uC811\uADFC\uC131 \uC635\uC158\uC740 Alt+F1\uC744 \uB20C\uB7EC\uC5EC \uD569\uB2C8\uB2E4.","\uACE0\uB300\uBE44 \uD14C\uB9C8\uB85C \uC804\uD658","{1} \uD30C\uC77C\uC5D0\uC11C \uD3B8\uC9D1\uC744 {0}\uAC1C \uD588\uC2B5\uB2C8\uB2E4."],"vs/editor/common/viewLayout/viewLineRenderer":["\uC790\uC138\uD788 \uD45C\uC2DC({0})","{0}\uC790"],"vs/editor/contrib/anchorSelect/browser/anchorSelect":["\uC120\uD0DD \uC575\uCEE4 \uC9C0\uC810","{0}\uC5D0 \uC124\uC815\uB41C \uC575\uCEE4: {1}","\uC120\uD0DD \uC575\uCEE4 \uC9C0\uC810 \uC124\uC815","\uC120\uD0DD \uC575\uCEE4 \uC9C0\uC810\uC73C\uB85C \uC774\uB3D9","\uC575\uCEE4\uC5D0\uC11C \uCEE4\uC11C\uB85C \uC120\uD0DD","\uC120\uD0DD \uC575\uCEE4 \uC9C0\uC810 \uCDE8\uC18C"],"vs/editor/contrib/bracketMatching/browser/bracketMatching":["\uAD04\uD638\uC5D0 \uD574\uB2F9\uD558\uB294 \uC601\uC5ED\uC744 \uD45C\uC2DC\uC790\uC5D0 \uCC44\uC0C9\uD558\uC5EC \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638\uB85C \uC774\uB3D9","\uAD04\uD638\uAE4C\uC9C0 \uC120\uD0DD","\uB300\uAD04\uD638 \uC81C\uAC70","\uB300\uAD04\uD638\uB85C \uC774\uB3D9(&&B)","\uB300\uAD04\uD638 \uB610\uB294 \uC911\uAD04\uD638\uB97C \uD3EC\uD568\uD558\uC5EC \uB0B4\uBD80 \uD14D\uC2A4\uD2B8\uB97C \uC120\uD0DD\uD569\uB2C8\uB2E4."],"vs/editor/contrib/caretOperations/browser/caretOperations":["\uC120\uD0DD\uD55C \uD14D\uC2A4\uD2B8\uB97C \uC67C\uCABD\uC73C\uB85C \uC774\uB3D9","\uC120\uD0DD\uD55C \uD14D\uC2A4\uD2B8\uB97C \uC624\uB978\uCABD\uC73C\uB85C \uC774\uB3D9"],"vs/editor/contrib/caretOperations/browser/transpose":["\uBB38\uC790 \uBC14\uAFB8\uAE30"],"vs/editor/contrib/clipboard/browser/clipboard":["\uC798\uB77C\uB0B4\uAE30(&&T)","\uC798\uB77C\uB0B4\uAE30","\uC798\uB77C\uB0B4\uAE30","\uC798\uB77C\uB0B4\uAE30","\uBCF5\uC0AC(&&C)","\uBCF5\uC0AC","\uBCF5\uC0AC","\uBCF5\uC0AC","\uB2E4\uC74C\uC73C\uB85C \uBCF5\uC0AC","\uB2E4\uC74C\uC73C\uB85C \uBCF5\uC0AC","\uACF5\uC720","\uACF5\uC720","\uACF5\uC720","\uBD99\uC5EC\uB123\uAE30(&&P)","\uBD99\uC5EC\uB123\uAE30","\uBD99\uC5EC\uB123\uAE30","\uBD99\uC5EC\uB123\uAE30","\uAD6C\uBB38\uC744 \uAC15\uC870 \uD45C\uC2DC\uD558\uC5EC \uBCF5\uC0AC"],"vs/editor/contrib/codeAction/browser/codeAction":["\uCF54\uB4DC \uC791\uC5C5\uC744 \uC801\uC6A9\uD558\uB294 \uC911 \uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4."],"vs/editor/contrib/codeAction/browser/codeActionCommands":["\uC2E4\uD589\uD560 \uCF54\uB4DC \uC791\uC5C5\uC758 \uC885\uB958\uC785\uB2C8\uB2E4.","\uBC18\uD658\uB41C \uC791\uC5C5\uC774 \uC801\uC6A9\uB418\uB294 \uACBD\uC6B0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD56D\uC0C1 \uBC18\uD658\uB41C \uCCAB \uBC88\uC9F8 \uCF54\uB4DC \uC791\uC5C5\uC744 \uC801\uC6A9\uD569\uB2C8\uB2E4.","\uCCAB \uBC88\uC9F8 \uBC18\uD658\uB41C \uCF54\uB4DC \uC791\uC5C5\uC744 \uC801\uC6A9\uD569\uB2C8\uB2E4(\uC774 \uC791\uC5C5\uB9CC \uC788\uB294 \uACBD\uC6B0).","\uBC18\uD658\uB41C \uCF54\uB4DC \uC791\uC5C5\uC744 \uC801\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.","\uAE30\uBCF8 \uCF54\uB4DC \uC791\uC5C5\uB9CC \uBC18\uD658\uB418\uB3C4\uB85D \uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBE60\uB978 \uC218\uC815...","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCF54\uB4DC \uB3D9\uC791\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","'{0}'\uC5D0 \uB300\uD55C \uAE30\uBCF8 \uCF54\uB4DC \uC791\uC5C5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","'{0}'\uC5D0 \uB300\uD55C \uCF54\uB4DC \uC791\uC5C5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uC0AC\uC6A9\uD560 \uC218 \uC788\uB294 \uAE30\uBCF8 \uCF54\uB4DC \uC791\uC5C5 \uC5C6\uC74C","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCF54\uB4DC \uB3D9\uC791\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uB9AC\uD329\uD130\uB9C1...","'{0}'\uC5D0 \uB300\uD55C \uAE30\uBCF8 \uB9AC\uD329\uD130\uB9C1 \uC5C6\uC74C","'{0}'\uC5D0 \uB300\uD55C \uB9AC\uD329\uD130\uB9C1 \uC5C6\uC74C","\uAE30\uBCF8 \uC124\uC815 \uB9AC\uD329\uD130\uB9C1\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uB9AC\uD399\uD130\uB9C1\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC18C\uC2A4 \uC791\uC5C5...","'{0}'\uC5D0 \uB300\uD55C \uAE30\uBCF8 \uC18C\uC2A4 \uC791\uC5C5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","'{0}'\uC5D0 \uB300\uD55C \uC18C\uC2A4 \uC791\uC5C5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uC0AC\uC6A9\uD560 \uC218 \uC788\uB294 \uAE30\uBCF8 \uC6D0\uBCF8 \uC791\uC5C5 \uC5C6\uC74C","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uC18C\uC2A4 \uC791\uC5C5\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uAC00\uC838\uC624\uAE30 \uAD6C\uC131","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uAC00\uC838\uC624\uAE30 \uAD6C\uC131 \uC791\uC5C5\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA8\uB450 \uC218\uC815","\uBAA8\uB4E0 \uC791\uC5C5 \uC218\uC815 \uC0AC\uC6A9 \uBD88\uAC00","\uC790\uB3D9 \uC218\uC815...","\uC0AC\uC6A9\uD560 \uC218 \uC788\uB294 \uC790\uB3D9 \uC218\uC815 \uC5C6\uC74C"],"vs/editor/contrib/codeAction/browser/codeActionContributions":["\uCF54\uB4DC \uC791\uC5C5 \uBA54\uB274\uC5D0 \uADF8\uB8F9 \uD5E4\uB354 \uD45C\uC2DC\uB97C \uD65C\uC131\uD654/\uBE44\uD65C\uC131\uD654\uD569\uB2C8\uB2E4.","\uD604\uC7AC \uC9C4\uB2E8 \uC911\uC774 \uC544\uB2D0 \uB54C \uC904 \uB0B4\uC5D0\uC11C \uAC00\uC7A5 \uAC00\uAE4C\uC6B4 \uBE60\uB978 \uC218\uC815 \uD45C\uC2DC\uB97C \uC0AC\uC6A9/\uC0AC\uC6A9 \uC548 \uD568\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4."],"vs/editor/contrib/codeAction/browser/codeActionController":["\uCEE8\uD14D\uC2A4\uD2B8: \uC904 {1} \uBC0F \uC5F4 {2}\uC758 {0}\uC785\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294 \uD56D\uBAA9 \uC228\uAE30\uAE30","\uBE44\uD65C\uC131\uD654\uB41C \uD56D\uBAA9 \uD45C\uC2DC"],"vs/editor/contrib/codeAction/browser/codeActionMenu":["\uCD94\uAC00 \uC791\uC5C5...","\uBE60\uB978 \uC218\uC815","\uCD94\uCD9C","\uC778\uB77C\uC778","\uC7AC\uC791\uC131","\uC774\uB3D9","\uCF54\uB4DC \uAC10\uC2F8\uAE30","\uC18C\uC2A4 \uC791\uC5C5"],"vs/editor/contrib/codeAction/browser/lightBulbWidget":["\uC2E4\uD589: {0}","\uCF54\uB4DC \uC791\uC5C5 \uD45C\uC2DC. \uAE30\uBCF8 \uC124\uC815 \uBE60\uB978 \uC218\uC815 \uC0AC\uC6A9 \uAC00\uB2A5({0})","\uCF54\uB4DC \uC791\uC5C5 \uD45C\uC2DC({0})","\uCF54\uB4DC \uC791\uC5C5 \uD45C\uC2DC"],"vs/editor/contrib/codelens/browser/codelensController":["\uD604\uC7AC \uC904\uC5D0 \uB300\uD55C \uCF54\uB4DC \uB80C\uC988 \uBA85\uB839 \uD45C\uC2DC","\uBA85\uB839 \uC120\uD0DD"],"vs/editor/contrib/colorPicker/browser/colorPickerWidget":["\uC0C9 \uC635\uC158\uC744 \uD1A0\uAE00\uD558\uB824\uBA74 \uD074\uB9AD\uD558\uC138\uC694(rgb/hsl/hex).","\uC0C9 \uD3B8\uC9D1\uAE30\uB97C \uB2EB\uB294 \uC544\uC774\uCF58"],"vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions":["\uB3C5\uB9BD \uC2E4\uD589\uD615 \uC0C9 \uD3B8\uC9D1\uAE30 \uD45C\uC2DC \uB610\uB294 \uD3EC\uCEE4\uC2A4","\uB3C5\uB9BD \uC2E4\uD589\uD615 \uC0C9 \uD3B8\uC9D1\uAE30 \uD45C\uC2DC \uB610\uB294 \uD3EC\uCEE4\uC2A4(&&S)","\uC0C9 \uD3B8\uC9D1\uAE30 \uC228\uAE30\uAE30","\uB3C5\uB9BD \uC2E4\uD589\uD615 \uC0C9 \uD3B8\uC9D1\uAE30\uB85C \uC0C9 \uC0BD\uC785"],"vs/editor/contrib/comment/browser/comment":["\uC904 \uC8FC\uC11D \uC124\uC815/\uD574\uC81C","\uC904 \uC8FC\uC11D \uC124\uC815/\uD574\uC81C(&&T)","\uC904 \uC8FC\uC11D \uCD94\uAC00","\uC904 \uC8FC\uC11D \uC81C\uAC70","\uBE14\uB85D \uC8FC\uC11D \uC124\uC815/\uD574\uC81C","\uBE14\uB85D \uC8FC\uC11D \uC124\uC815/\uD574\uC81C(&&B)"],"vs/editor/contrib/contextmenu/browser/contextmenu":["\uBBF8\uB2C8\uB9F5","\uBB38\uC790 \uB80C\uB354\uB9C1","\uC138\uB85C \uD06C\uAE30","\uBE44\uB840","\uCC44\uC6B0\uAE30","\uB9DE\uCDA4","\uC2AC\uB77C\uC774\uB354","\uB9C8\uC6B0\uC2A4 \uC704\uB85C","\uD56D\uC0C1","\uD3B8\uC9D1\uAE30 \uC0C1\uD669\uC5D0 \uB9DE\uB294 \uBA54\uB274 \uD45C\uC2DC"],"vs/editor/contrib/cursorUndo/browser/cursorUndo":["\uCEE4\uC11C \uC2E4\uD589 \uCDE8\uC18C","\uCEE4\uC11C \uB2E4\uC2DC \uC2E4\uD589"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution":["\uB2E4\uB978 \uC774\uB984\uC73C\uB85C \uBD99\uC5EC\uB123\uAE30...","\uC801\uC6A9\uD560 \uBD99\uC5EC\uB123\uAE30 \uD3B8\uC9D1\uC758 ID\uC785\uB2C8\uB2E4. \uC81C\uACF5\uD558\uC9C0 \uC54A\uC73C\uBA74 \uD3B8\uC9D1\uAE30\uC5D0 \uC120\uD0DD\uAE30\uAC00 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8\uB85C \uBD99\uC5EC\uB123\uAE30"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteController":["\uBD99\uC5EC\uB123\uAE30 \uC704\uC82F\uC774 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80","\uBD99\uC5EC\uB123\uAE30 \uC635\uC158 \uD45C\uC2DC...","'{0}'\uC5D0 \uB300\uD55C \uBD99\uC5EC\uB123\uAE30 \uD3B8\uC9D1\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBD99\uC5EC\uB123\uAE30 \uCC98\uB9AC\uAE30\uB97C \uC2E4\uD589\uD558\uB294 \uC911\uC785\uB2C8\uB2E4. \uCDE8\uC18C\uD558\uB824\uBA74 \uD074\uB9AD\uD558\uC138\uC694.","\uBD99\uC5EC\uB123\uAE30 \uC791\uC5C5 \uC120\uD0DD","\uBD99\uC5EC\uB123\uAE30 \uCC98\uB9AC\uAE30\uB97C \uC2E4\uD589\uD558\uB294 \uC911"],"vs/editor/contrib/dropOrPasteInto/browser/defaultProviders":["\uAE30\uBCF8 \uC81C\uACF5","\uC77C\uBC18 \uD14D\uC2A4\uD2B8 \uC0BD\uC785","URI \uC0BD\uC785","URI \uC0BD\uC785","\uACBD\uB85C \uC0BD\uC785","\uACBD\uB85C \uC0BD\uC785","\uC0C1\uB300 \uACBD\uB85C \uC0BD\uC785","\uC0C1\uB300 \uACBD\uB85C \uC0BD\uC785","HTML \uC0BD\uC785"],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution":["\uC9C0\uC815\uB41C MIME \uD615\uC2DD\uC758 \uCF58\uD150\uCE20\uC5D0 \uC0AC\uC6A9\uD560 \uAE30\uBCF8 \uB4DC\uB86D \uACF5\uAE09\uC790\uB97C \uAD6C\uC131\uD569\uB2C8\uB2E4."],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController":["\uB4DC\uB86D \uC704\uC82F\uC774 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80","\uB4DC\uB86D \uC635\uC158 \uD45C\uC2DC...","\uB4DC\uB86D \uCC98\uB9AC\uAE30\uB97C \uC2E4\uD589\uD558\uB294 \uC911\uC785\uB2C8\uB2E4. \uCDE8\uC18C\uD558\uB824\uBA74 \uD074\uB9AD\uD558\uC138\uC694."],"vs/editor/contrib/editorState/browser/keybindingCancellation":["\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uCDE8\uC18C \uAC00\uB2A5\uD55C \uC791\uC5C5(\uC608: '\uCC38\uC870 \uD53C\uD0B9')\uC744 \uC2E4\uD589\uD558\uB294\uC9C0 \uC5EC\uBD80"],"vs/editor/contrib/find/browser/findController":["\uD30C\uC77C\uC774 \uB108\uBB34 \uCEE4\uC11C \uBAA8\uB450 \uBC14\uAFB8\uAE30 \uC791\uC5C5\uC744 \uC218\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uCC3E\uAE30","\uCC3E\uAE30(&&F)","\uC778\uC218\uB85C \uCC3E\uAE30","\uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C \uCC3E\uAE30","\uB2E4\uC74C \uCC3E\uAE30","\uC774\uC804 \uCC3E\uAE30","\uC77C\uCE58 \uD56D\uBAA9\uC73C\uB85C \uC774\uB3D9...","\uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uB2E4\uB978 \uB0B4\uC6A9\uC73C\uB85C \uAC80\uC0C9\uD574 \uBCF4\uC138\uC694.","\uD2B9\uC815 \uC77C\uCE58 \uD56D\uBAA9\uC73C\uB85C \uC774\uB3D9\uD558\uB824\uBA74 \uC22B\uC790\uB97C \uC785\uB825\uD558\uC138\uC694(1~{0} \uC0AC\uC774).","1\uC5D0\uC11C {0} \uC0AC\uC774\uC758 \uC22B\uC790\uB97C \uC785\uB825\uD558\uC138\uC694","1\uC5D0\uC11C {0} \uC0AC\uC774\uC758 \uC22B\uC790\uB97C \uC785\uB825\uD558\uC138\uC694","\uB2E4\uC74C \uC120\uD0DD \uCC3E\uAE30","\uC774\uC804 \uC120\uD0DD \uCC3E\uAE30","\uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30(&&R)"],"vs/editor/contrib/find/browser/findWidget":["\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C \uCC3E\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC774 \uCD95\uC18C\uB418\uC5C8\uC74C\uC744 \uB098\uD0C0\uB0B4\uB294 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC774 \uD655\uC7A5\uB418\uC5C8\uC74C\uC744 \uB098\uD0C0\uB0B4\uB294 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uBC14\uAFB8\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uBAA8\uB450 \uBC14\uAFB8\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uC774\uC804 \uCC3E\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uB2E4\uC74C \uCC3E\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uCC3E\uAE30/\uBC14\uAFB8\uAE30","\uCC3E\uAE30","\uCC3E\uAE30","\uC774\uC804 \uAC80\uC0C9 \uACB0\uACFC","\uB2E4\uC74C \uAC80\uC0C9 \uACB0\uACFC","\uC120\uD0DD \uD56D\uBAA9\uC5D0\uC11C \uCC3E\uAE30","\uB2EB\uAE30","\uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30","\uBAA8\uB450 \uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30 \uC124\uC815/\uD574\uC81C","\uCC98\uC74C {0}\uAC1C\uC758 \uACB0\uACFC\uAC00 \uAC15\uC870 \uD45C\uC2DC\uB418\uC9C0\uB9CC \uBAA8\uB4E0 \uCC3E\uAE30 \uC791\uC5C5\uC740 \uC804\uCCB4 \uD14D\uC2A4\uD2B8\uC5D0 \uB300\uD574 \uC218\uD589\uB429\uB2C8\uB2E4.","{1}\uC758 {0}","\uACB0\uACFC \uC5C6\uC74C","{0}\uAC1C \uCC3E\uC74C","'{1}'\uC5D0 \uB300\uD55C {0}\uC744(\uB97C) \uCC3E\uC74C","{2}\uC5D0\uC11C '{1}'\uC5D0 \uB300\uD55C {0}\uC744(\uB97C) \uCC3E\uC74C","'{1}'\uC5D0 \uB300\uD55C {0}\uC744(\uB97C) \uCC3E\uC74C","Ctrl+Enter\uB97C \uB204\uB974\uBA74 \uC774\uC81C \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uBC14\uAFB8\uC9C0 \uC54A\uACE0 \uC904 \uBC14\uAFC8\uC744 \uC0BD\uC785\uD569\uB2C8\uB2E4. editor.action.replaceAll\uC758 \uD0A4 \uBC14\uC778\uB529\uC744 \uC218\uC815\uD558\uC5EC \uC774 \uB3D9\uC791\uC744 \uC7AC\uC815\uC758\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4."],"vs/editor/contrib/folding/browser/folding":["\uD3BC\uCE58\uAE30","\uC7AC\uADC0\uC801\uC73C\uB85C \uD3BC\uCE58\uAE30","\uC811\uAE30","\uC811\uAE30 \uC804\uD658","\uC7AC\uADC0\uC801\uC73C\uB85C \uC811\uAE30","\uBAA8\uB4E0 \uBE14\uB85D \uCF54\uBA58\uD2B8\uB97C \uC811\uAE30","\uBAA8\uB4E0 \uC601\uC5ED \uC811\uAE30","\uBAA8\uB4E0 \uC601\uC5ED \uD3BC\uCE58\uAE30","\uC120\uD0DD\uD55C \uD56D\uBAA9\uC744 \uC81C\uC678\uD55C \uBAA8\uB4E0 \uD56D\uBAA9 \uC811\uAE30","\uC120\uD0DD\uD55C \uD56D\uBAA9\uC744 \uC81C\uC678\uD55C \uBAA8\uB4E0 \uD56D\uBAA9 \uD45C\uC2DC","\uBAA8\uB450 \uC811\uAE30","\uBAA8\uB450 \uD3BC\uCE58\uAE30","\uBD80\uBAA8 \uD3F4\uB529\uC73C\uB85C \uC774\uB3D9","\uC774\uC804 \uC811\uAE30 \uBC94\uC704\uB85C \uC774\uB3D9","\uB2E4\uC74C \uC811\uAE30 \uBC94\uC704\uB85C \uC774\uB3D9","\uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C \uC811\uAE30 \uBC94\uC704 \uB9CC\uB4E4\uAE30","\uC218\uB3D9 \uD3F4\uB529 \uBC94\uC704 \uC81C\uAC70","\uC218\uC900 {0} \uC811\uAE30"],"vs/editor/contrib/folding/browser/foldingDecorations":["\uC811\uD78C \uBC94\uC704\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC0C9\uC740 \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uAE30 \uC704\uD574 \uBD88\uD22C\uBA85\uD574\uC11C\uB294 \uC548 \uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC5EC\uBC31\uC758 \uC811\uAE30 \uCEE8\uD2B8\uB864 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uBB38\uC790 \uBAA8\uC591 \uC5EC\uBC31\uC5D0\uC11C \uD655\uC7A5\uB41C \uBC94\uC704\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uBB38\uC790 \uBAA8\uC591 \uC5EC\uBC31\uC5D0\uC11C \uCD95\uC18C\uB41C \uBC94\uC704\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uBB38\uC790 \uBAA8\uC591 \uC5EC\uBC31\uC5D0\uC11C \uC218\uB3D9\uC73C\uB85C \uCD95\uC18C\uB41C \uBC94\uC704\uC5D0 \uB300\uD55C \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uBB38\uC790 \uBAA8\uC591 \uC5EC\uBC31\uC5D0\uC11C \uC218\uB3D9\uC73C\uB85C \uD655\uC7A5\uB41C \uBC94\uC704\uC5D0 \uB300\uD55C \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uBC94\uC704\uB97C \uD655\uC7A5\uD558\uB824\uBA74 \uD074\uB9AD\uD569\uB2C8\uB2E4.","\uBC94\uC704\uB97C \uCD95\uC18C\uD558\uB824\uBA74 \uD074\uB9AD\uD569\uB2C8\uB2E4."],"vs/editor/contrib/fontZoom/browser/fontZoom":["\uD3B8\uC9D1\uAE30 \uAE00\uAF34 \uD06C\uAE30 \uB298\uB9AC\uAE30","\uD3B8\uC9D1\uAE30 \uAE00\uAF34 \uD06C\uAE30 \uC904\uC774\uAE30","\uD3B8\uC9D1\uAE30 \uAE00\uAF34 \uD06C\uAE30 \uB2E4\uC2DC \uC124\uC815"],"vs/editor/contrib/format/browser/formatActions":["\uBB38\uC11C \uC11C\uC2DD","\uC120\uD0DD \uC601\uC5ED \uC11C\uC2DD"],"vs/editor/contrib/gotoError/browser/gotoError":["\uB2E4\uC74C \uBB38\uC81C\uB85C \uC774\uB3D9 (\uC624\uB958, \uACBD\uACE0, \uC815\uBCF4)","\uB2E4\uC74C \uB9C8\uCEE4\uB85C \uC774\uB3D9\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uC774\uC804 \uBB38\uC81C\uB85C \uC774\uB3D9 (\uC624\uB958, \uACBD\uACE0, \uC815\uBCF4)","\uC774\uC804 \uB9C8\uCEE4\uB85C \uC774\uB3D9\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD30C\uC77C\uC758 \uB2E4\uC74C \uBB38\uC81C\uB85C \uC774\uB3D9 (\uC624\uB958, \uACBD\uACE0, \uC815\uBCF4)","\uB2E4\uC74C \uBB38\uC81C(&&P)","\uD30C\uC77C\uC758 \uC774\uC804 \uBB38\uC81C\uB85C \uC774\uB3D9 (\uC624\uB958, \uACBD\uACE0, \uC815\uBCF4)","\uC774\uC804 \uBB38\uC81C(&&P)"],"vs/editor/contrib/gotoError/browser/gotoErrorWidget":["\uC624\uB958","\uACBD\uACE0","\uC815\uBCF4","\uD78C\uD2B8","{1}\uC758 {0}\uC785\uB2C8\uB2E4. ","\uBB38\uC81C {1}\uAC1C \uC911 {0}\uAC1C","\uBB38\uC81C {1}\uAC1C \uC911 {0}\uAC1C","\uD3B8\uC9D1\uAE30 \uD45C\uC2DD \uD0D0\uC0C9 \uC704\uC82F \uC624\uB958 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB9C8\uCEE4 \uD0D0\uC0C9 \uC704\uC82F \uC624\uB958 \uC81C\uBAA9 \uBC30\uACBD.","\uD3B8\uC9D1\uAE30 \uD45C\uC2DD \uD0D0\uC0C9 \uC704\uC82F \uACBD\uACE0 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB9C8\uCEE4 \uD0D0\uC0C9 \uC704\uC82F \uACBD\uACE0 \uC81C\uBAA9 \uBC30\uACBD.","\uD3B8\uC9D1\uAE30 \uD45C\uC2DD \uD0D0\uC0C9 \uC704\uC82F \uC815\uBCF4 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB9C8\uCEE4 \uD0D0\uC0C9 \uC704\uC82F \uC815\uBCF4 \uC81C\uBAA9 \uBC30\uACBD.","\uD3B8\uC9D1\uAE30 \uD45C\uC2DD \uD0D0\uC0C9 \uC704\uC82F \uBC30\uACBD\uC785\uB2C8\uB2E4."],"vs/editor/contrib/gotoSymbol/browser/goToCommands":["\uD53C\uD0B9","\uC815\uC758","'{0}'\uC5D0 \uB300\uD55C \uC815\uC758\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC815\uC758\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC815\uC758\uB85C \uC774\uB3D9","\uC815\uC758\uB85C \uC774\uB3D9(&&D)","\uCE21\uBA74\uC5D0\uC11C \uC815\uC758 \uC5F4\uAE30","\uC815\uC758 \uD53C\uD0B9","\uC120\uC5B8","'{0}'\uC5D0 \uB300\uD55C \uC120\uC5B8\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC120\uC5B8\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC120\uC5B8\uC73C\uB85C \uC774\uB3D9","\uC120\uC5B8\uC73C\uB85C \uC774\uB3D9(&&D)","'{0}'\uC5D0 \uB300\uD55C \uC120\uC5B8\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC120\uC5B8\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC120\uC5B8 \uBBF8\uB9AC \uBCF4\uAE30","\uD615\uC2DD \uC815\uC758","'{0}'\uC5D0 \uB300\uD55C \uD615\uC2DD \uC815\uC758\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uD615\uC2DD \uC815\uC758\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uD615\uC2DD \uC815\uC758\uB85C \uC774\uB3D9","\uD615\uC2DD \uC815\uC758\uB85C \uC774\uB3D9(&&T)","\uD615\uC2DD \uC815\uC758 \uBBF8\uB9AC \uBCF4\uAE30","\uAD6C\uD604","'{0}'\uC5D0 \uB300\uD55C \uAD6C\uD604\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uAD6C\uD604\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uAD6C\uD604\uC73C\uB85C \uC774\uB3D9","\uAD6C\uD604\uC73C\uB85C \uC774\uB3D9(&&I)","\uD53C\uD0B9 \uAD6C\uD604","'{0}'\uC5D0 \uB300\uD55C \uCC38\uC870\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uCC38\uC870\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uCC38\uC870\uB85C \uC774\uB3D9","\uCC38\uC870\uB85C \uC774\uB3D9(&&R)","\uCC38\uC870","\uCC38\uC870 \uBBF8\uB9AC \uBCF4\uAE30","\uCC38\uC870","\uC784\uC758\uC758 \uAE30\uD638\uB85C \uC774\uB3D9","\uC704\uCE58","'{0}'\uC5D0 \uB300\uD55C \uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC74C","\uCC38\uC870"],"vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition":["{0}\uAC1C \uC815\uC758\uB97C \uD45C\uC2DC\uD558\uB824\uBA74 \uD074\uB9AD\uD558\uC138\uC694."],"vs/editor/contrib/gotoSymbol/browser/peek/referencesController":["'\uCC38\uC870 \uD53C\uD0B9' \uB610\uB294 '\uC815\uC758 \uD53C\uD0B9'\uACFC \uAC19\uC774 \uCC38\uC870 \uD53C\uD0B9\uC774 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80","\uB85C\uB4DC \uC911...","{0}({1})"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesTree":["\uCC38\uC870 {0}\uAC1C","\uCC38\uC870 {0}\uAC1C","\uCC38\uC870"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget":["\uBBF8\uB9AC \uBCF4\uAE30\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uACB0\uACFC \uC5C6\uC74C","\uCC38\uC870"],"vs/editor/contrib/gotoSymbol/browser/referencesModel":["{2} \uC5F4\uC5D0 \uC788\uB294 {1} \uD589\uC758 {0}\uC5D0","{3} \uC5F4\uC5D0\uC11C {2} \uD589\uC758 {1}\uC5D0 {0}","{0}\uC758 \uAE30\uD638 1\uAC1C, \uC804\uCCB4 \uACBD\uB85C {1}","{1}\uC758 \uAE30\uD638 {0}\uAC1C, \uC804\uCCB4 \uACBD\uB85C {2}","\uACB0\uACFC \uC5C6\uC74C","{0}\uC5D0\uC11C \uAE30\uD638 1\uAC1C\uB97C \uCC3E\uC558\uC2B5\uB2C8\uB2E4.","{1}\uC5D0\uC11C \uAE30\uD638 {0}\uAC1C\uB97C \uCC3E\uC558\uC2B5\uB2C8\uB2E4.","{1}\uAC1C \uD30C\uC77C\uC5D0\uC11C \uAE30\uD638 {0}\uAC1C\uB97C \uCC3E\uC558\uC2B5\uB2C8\uB2E4."],"vs/editor/contrib/gotoSymbol/browser/symbolNavigation":["\uD0A4\uBCF4\uB4DC\uB9CC\uC73C\uB85C \uD0D0\uC0C9\uD560 \uC218 \uC788\uB294 \uAE30\uD638 \uC704\uCE58\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","{1}\uC758 {0} \uAE30\uD638, \uB2E4\uC74C\uC758 \uACBD\uC6B0 {2}","{1}\uC758 \uAE30\uD638 {0}"],"vs/editor/contrib/hover/browser/hover":["\uAC00\uB9AC\uD0A4\uAE30 \uB610\uB294 \uD3EC\uCEE4\uC2A4 \uD45C\uC2DC","\uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uCF1C\uB3C4 \uD3EC\uCEE4\uC2A4\uAC00 \uC62E\uACA8 \uAC00\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0A4\uBA74 \uC774\uBBF8 \uD45C\uC2DC\uB41C \uACBD\uC6B0\uC5D0\uB9CC \uD3EC\uCEE4\uC2A4\uAC00 \uC62E\uACA8 \uAC11\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0A4\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uB098\uD0C0\uB098\uB294 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC790\uB3D9\uC73C\uB85C \uC62E\uACA8 \uAC11\uB2C8\uB2E4.","\uC815\uC758 \uBBF8\uB9AC \uBCF4\uAE30 \uAC00\uB9AC\uD0A8 \uD56D\uBAA9 \uD45C\uC2DC","\uC704\uB85C \uC2A4\uD06C\uB864 \uAC00\uB9AC\uD0A4\uAE30","\uC544\uB798\uB85C \uC2A4\uD06C\uB864 \uAC00\uB9AC\uD0A4\uAE30","\uC67C\uCABD\uC73C\uB85C \uC2A4\uD06C\uB864 \uAC00\uB9AC\uD0A4\uAE30","\uC624\uB978\uCABD\uC73C\uB85C \uC2A4\uD06C\uB864 \uAC00\uB9AC\uD0A4\uAE30","\uD398\uC774\uC9C0 \uC704\uB85C \uAC00\uB9AC\uD0A4\uAE30","\uD398\uC774\uC9C0 \uC544\uB798\uCABD \uAC00\uB9AC\uD0A4\uAE30","\uC704\uCABD \uAC00\uB9AC\uD0A4\uAE30\uB85C \uC774\uB3D9","\uC544\uB798\uCABD \uAC00\uB9AC\uD0A4\uAE30\uB85C \uC774\uB3D9"],"vs/editor/contrib/hover/browser/markdownHoverParticipant":["\uB85C\uB4DC \uC911...","\uC131\uB2A5\uC0C1\uC758 \uC774\uC720\uB85C \uAE34 \uC904\uB85C \uC778\uD574 \uB80C\uB354\uB9C1\uC774 \uC77C\uC2DC \uC911\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4. `editor.stopRenderingLineAfter`\uB97C \uD1B5\uD574 \uAD6C\uC131\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC131\uB2A5\uC0C1\uC758 \uC774\uC720\uB85C \uAE34 \uC904\uC758 \uACBD\uC6B0 \uD1A0\uD070\uD654\uB97C \uAC74\uB108\uB701\uB2C8\uB2E4. \uC774 \uD56D\uBAA9\uC740 'editor.maxTokenizationLineLength'\uB97C \uD1B5\uD574 \uAD6C\uC131\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4."],"vs/editor/contrib/hover/browser/markerHoverParticipant":["\uBB38\uC81C \uBCF4\uAE30","\uBE60\uB978 \uC218\uC815\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uBE60\uB978 \uC218\uC815\uC744 \uD655\uC778\uD558\uB294 \uC911...","\uBE60\uB978 \uC218\uC815\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uBE60\uB978 \uC218\uC815..."],"vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace":["\uC774\uC804 \uAC12\uC73C\uB85C \uBC14\uAFB8\uAE30","\uB2E4\uC74C \uAC12\uC73C\uB85C \uBC14\uAFB8\uAE30"],"vs/editor/contrib/indentation/browser/indentation":["\uB4E4\uC5EC\uC4F0\uAE30\uB97C \uACF5\uBC31\uC73C\uB85C \uBCC0\uD658","\uB4E4\uC5EC\uC4F0\uAE30\uB97C \uD0ED\uC73C\uB85C \uBCC0\uD658","\uAD6C\uC131\uB41C \uD0ED \uD06C\uAE30","\uAE30\uBCF8 \uD0ED \uD06C\uAE30","\uD604\uC7AC \uD0ED \uD06C\uAE30","\uD604\uC7AC \uD30C\uC77C\uC758 \uD0ED \uD06C\uAE30 \uC120\uD0DD","\uD0ED\uC744 \uC0AC\uC6A9\uD55C \uB4E4\uC5EC\uC4F0\uAE30","\uACF5\uBC31\uC744 \uC0AC\uC6A9\uD55C \uB4E4\uC5EC\uC4F0\uAE30","\uD0ED \uD45C\uC2DC \uD06C\uAE30 \uBCC0\uACBD","\uCF58\uD150\uCE20\uC5D0\uC11C \uB4E4\uC5EC\uC4F0\uAE30 \uAC10\uC9C0","\uC904 \uB2E4\uC2DC \uB4E4\uC5EC\uC4F0\uAE30","\uC120\uD0DD\uD55C \uC904 \uB2E4\uC2DC \uB4E4\uC5EC\uC4F0\uAE30"],"vs/editor/contrib/inlayHints/browser/inlayHintsHover":["\uC0BD\uC785\uD558\uB824\uBA74 \uB450 \uBC88 \uD074\uB9AD","Cmd+\uD074\uB9AD","Ctrl+\uD074\uB9AD","Option+\uD074\uB9AD","Alt+\uD074\uB9AD","\uC815\uC758({0})\uB85C \uC774\uB3D9\uD558\uC5EC \uC790\uC138\uD788 \uC54C\uC544\uBCF4\uB824\uBA74 \uB9C8\uC6B0\uC2A4 \uC624\uB978\uCABD \uB2E8\uCD94\uB97C \uD074\uB9AD\uD569\uB2C8\uB2E4.","\uC815\uC758\uB85C \uC774\uB3D9({0})","\uBA85\uB839 \uC2E4\uD589"],"vs/editor/contrib/inlineCompletions/browser/commands":["\uB2E4\uC74C \uC778\uB77C\uC778 \uC81C\uC548 \uD45C\uC2DC","\uC774\uC804 \uC778\uB77C\uC778 \uC81C\uC548 \uD45C\uC2DC","\uC778\uB77C\uC778 \uC81C\uC548 \uD2B8\uB9AC\uAC70","\uC778\uB77C\uC778 \uC81C\uC548\uC758 \uB2E4\uC74C \uB2E8\uC5B4 \uC218\uB77D","\uB2E8\uC5B4 \uC218\uB77D","\uC778\uB77C\uC778 \uC81C\uC548\uC758 \uB2E4\uC74C \uC904 \uC218\uB77D","\uC904 \uC218\uB77D","\uC778\uB77C\uC778 \uCD94\uCC9C \uC218\uB77D","\uC218\uB77D","\uC778\uB77C\uC778 \uC81C\uC548 \uC228\uAE30\uAE30","\uD56D\uC0C1 \uB3C4\uAD6C \uBAA8\uC74C \uD45C\uC2DC"],"vs/editor/contrib/inlineCompletions/browser/hoverParticipant":["\uC81C\uC548:"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys":["\uC778\uB77C\uC778 \uC81C\uC548 \uD45C\uC2DC \uC5EC\uBD80","\uC778\uB77C\uC778 \uC81C\uC548\uC774 \uACF5\uBC31\uC73C\uB85C \uC2DC\uC791\uD558\uB294\uC9C0 \uC5EC\uBD80","\uC778\uB77C\uC778 \uC81C\uC548\uC774 \uD0ED\uC5D0 \uC758\uD574 \uC0BD\uC785\uB418\uB294 \uAC83\uBCF4\uB2E4 \uC791\uC740 \uACF5\uBC31\uC73C\uB85C \uC2DC\uC791\uD558\uB294\uC9C0 \uC5EC\uBD80","\uD604\uC7AC \uC81C\uC548\uC5D0 \uB300\uD55C \uC81C\uC548 \uD45C\uC2DC \uC5EC\uBD80"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController":["\uC811\uADFC\uC131 \uBCF4\uAE30\uC5D0\uC11C \uC774\uB97C \uAC80\uC0AC({0})"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget":["\uB2E4\uC74C \uB9E4\uAC1C \uBCC0\uC218 \uD78C\uD2B8 \uD45C\uC2DC\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uC774\uC804 \uB9E4\uAC1C \uBCC0\uC218 \uD78C\uD2B8 \uD45C\uC2DC\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","{0}({1})","\uC774\uC804","\uB2E4\uC74C"],"vs/editor/contrib/lineSelection/browser/lineSelection":["\uC120 \uC120\uD0DD \uC601\uC5ED \uD655\uC7A5"],"vs/editor/contrib/linesOperations/browser/linesOperations":["\uC704\uC5D0 \uC904 \uBCF5\uC0AC","\uC704\uC5D0 \uC904 \uBCF5\uC0AC(&&C)","\uC544\uB798\uC5D0 \uC904 \uBCF5\uC0AC","\uC544\uB798\uC5D0 \uC904 \uBCF5\uC0AC(&&P)","\uC911\uBCF5\uB41C \uC120\uD0DD \uC601\uC5ED","\uC911\uBCF5\uB41C \uC120\uD0DD \uC601\uC5ED(&&D)","\uC904 \uC704\uB85C \uC774\uB3D9","\uC904 \uC704\uB85C \uC774\uB3D9(&&V)","\uC904 \uC544\uB798\uB85C \uC774\uB3D9","\uC904 \uC544\uB798\uB85C \uC774\uB3D9(&&L)","\uC904\uC744 \uC624\uB984\uCC28\uC21C \uC815\uB82C","\uC904\uC744 \uB0B4\uB9BC\uCC28\uC21C\uC73C\uB85C \uC815\uB82C","\uC911\uBCF5 \uB77C\uC778 \uC0AD\uC81C","\uD6C4\uD589 \uACF5\uBC31 \uC790\uB974\uAE30","\uC904 \uC0AD\uC81C","\uC904 \uB4E4\uC5EC\uC4F0\uAE30","\uC904 \uB0B4\uC5B4\uC4F0\uAE30","\uC704\uC5D0 \uC904 \uC0BD\uC785","\uC544\uB798\uC5D0 \uC904 \uC0BD\uC785","\uC67C\uCABD \uBAA8\uB450 \uC0AD\uC81C","\uC6B0\uCE21\uC5D0 \uC788\uB294 \uD56D\uBAA9 \uC0AD\uC81C","\uC904 \uC5F0\uACB0","\uCEE4\uC11C \uC8FC\uC704 \uBB38\uC790 \uBC14\uAFB8\uAE30","\uB300\uBB38\uC790\uB85C \uBCC0\uD658","\uC18C\uBB38\uC790\uB85C \uBCC0\uD658","\uB2E8\uC5B4\uC758 \uCCAB \uAE00\uC790\uB97C \uB300\uBB38\uC790\uB85C \uBCC0\uD658","\uC2A4\uB124\uC774\uD06C \uD45C\uAE30\uBC95\uC73C\uB85C \uBCC0\uD658","Camel Case\uB85C \uBCC0\uD658","Kebab \uC0AC\uB840\uB85C \uBCC0\uD658"],"vs/editor/contrib/linkedEditing/browser/linkedEditing":["\uC5F0\uACB0\uB41C \uD3B8\uC9D1 \uC2DC\uC791","\uD615\uC2DD\uC758 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uC774\uB984\uC744 \uBC14\uAFC0 \uB54C\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4."],"vs/editor/contrib/links/browser/links":["{0} \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC73C\uBBC0\uB85C \uC774 \uB9C1\uD06C\uB97C \uC5F4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4","\uB300\uC0C1\uC774 \uC5C6\uC73C\uBBC0\uB85C \uC774 \uB9C1\uD06C\uB97C \uC5F4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uBA85\uB839 \uC2E4\uD589","\uB9C1\uD06C\uB85C \uC774\uB3D9","Cmd+\uD074\uB9AD","Ctrl+\uD074\uB9AD","Option+\uD074\uB9AD","Alt+\uD074\uB9AD","\uBA85\uB839 {0} \uC2E4\uD589","\uB9C1\uD06C \uC5F4\uAE30"],"vs/editor/contrib/message/browser/messageController":["\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD604\uC7AC \uC778\uB77C\uC778 \uBA54\uC2DC\uC9C0\uB97C \uD45C\uC2DC\uD558\uB294\uC9C0 \uC5EC\uBD80"],"vs/editor/contrib/multicursor/browser/multicursor":["\uCEE4\uC11C\uAC00 \uCD94\uAC00\uB428: {0}","\uCEE4\uC11C\uAC00 \uCD94\uAC00\uB428: {0}","\uC704\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uC704\uC5D0 \uCEE4\uC11C \uCD94\uAC00(&&A)","\uC544\uB798\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uC544\uB798\uC5D0 \uCEE4\uC11C \uCD94\uAC00(&&D)","\uC904 \uB05D\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uC904 \uB05D\uC5D0 \uCEE4\uC11C \uCD94\uAC00(&&U)","\uB9E8 \uC544\uB798\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uB9E8 \uC704\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uB2E4\uC74C \uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uC5D0 \uC120\uD0DD \uD56D\uBAA9 \uCD94\uAC00","\uB2E4\uC74C \uD56D\uBAA9 \uCD94\uAC00(&&N)","\uC774\uC804 \uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uC5D0 \uC120\uD0DD \uD56D\uBAA9 \uCD94\uAC00","\uC774\uC804 \uD56D\uBAA9 \uCD94\uAC00(&&R)","\uB2E4\uC74C \uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uB85C \uB9C8\uC9C0\uB9C9 \uC120\uD0DD \uD56D\uBAA9 \uC774\uB3D9","\uB9C8\uC9C0\uB9C9 \uC120\uD0DD \uD56D\uBAA9\uC744 \uC774\uC804 \uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uB85C \uC774\uB3D9","\uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uC758 \uBAA8\uB4E0 \uD56D\uBAA9 \uC120\uD0DD","\uBAA8\uB4E0 \uD56D\uBAA9 \uC120\uD0DD(&&O)","\uBAA8\uB4E0 \uD56D\uBAA9 \uBCC0\uACBD","\uB2E4\uC74C \uCEE4\uC11C \uD3EC\uCEE4\uC2A4","\uB2E4\uC74C \uCEE4\uC11C\uC5D0 \uD3EC\uCEE4\uC2A4\uB97C \uB9DE\uCDA5\uB2C8\uB2E4.","\uC774\uC804 \uCEE4\uC11C \uD3EC\uCEE4\uC2A4","\uC774\uC804 \uCEE4\uC11C\uC5D0 \uD3EC\uCEE4\uC2A4\uB97C \uB9DE\uCDA5\uB2C8\uB2E4."],"vs/editor/contrib/parameterHints/browser/parameterHints":["\uB9E4\uAC1C \uBCC0\uC218 \uD78C\uD2B8 \uD2B8\uB9AC\uAC70"],"vs/editor/contrib/parameterHints/browser/parameterHintsWidget":["\uB2E4\uC74C \uB9E4\uAC1C \uBCC0\uC218 \uD78C\uD2B8 \uD45C\uC2DC\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uC774\uC804 \uB9E4\uAC1C \uBCC0\uC218 \uD78C\uD2B8 \uD45C\uC2DC\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","{0}, \uD78C\uD2B8","\uB9E4\uAC1C \uBCC0\uC218 \uD78C\uD2B8\uC5D0 \uC788\uB294 \uD65C\uC131 \uD56D\uBAA9\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4."],"vs/editor/contrib/peekView/browser/peekView":["\uD604\uC7AC \uCF54\uB4DC \uD3B8\uC9D1\uAE30\uAC00 \uD53C\uD0B9 \uB0B4\uBD80\uC5D0 \uD3EC\uD568\uB418\uC5C8\uB294\uC9C0 \uC5EC\uBD80","\uB2EB\uAE30","Peek \uBDF0 \uC81C\uBAA9 \uC601\uC5ED\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uC81C\uBAA9 \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uC81C\uBAA9 \uC815\uBCF4 \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD14C\uB450\uB9AC \uBC0F \uD654\uC0B4\uD45C \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC5D0\uC11C \uB77C\uC778 \uB178\uB4DC\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC5D0\uC11C \uD30C\uC77C \uB178\uB4DC\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC5D0\uC11C \uC120\uD0DD\uB41C \uD56D\uBAA9\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC5D0\uC11C \uC120\uD0DD\uB41C \uD56D\uBAA9\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD3B8\uC9D1\uAE30\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD3B8\uC9D1\uAE30\uC758 \uAC70\uD130 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD53C\uD0B9 \uBDF0 \uD3B8\uC9D1\uAE30\uC758 \uACE0\uC815 \uC2A4\uD06C\uB864 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC758 \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD3B8\uC9D1\uAE30\uC758 \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD3B8\uC9D1\uAE30\uC758 \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC \uD14C\uB450\uB9AC\uC785\uB2C8\uB2E4."],"vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess":["\uC6B0\uC120 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30\uB97C \uC5F4\uACE0 \uC904\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4.","\uC904 {0} \uBC0F \uBB38\uC790 {1}(\uC73C)\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4.","{0} \uC904\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4.","\uD604\uC7AC \uC904: {0}, \uBB38\uC790: {1} \uC774\uB3D9\uD560 \uC904 1~{2} \uC0AC\uC774\uC758 \uBC88\uD638\uB97C \uC785\uB825\uD569\uB2C8\uB2E4.","\uD604\uC7AC \uC904: {0}, \uBB38\uC790: {1}. \uC774\uB3D9\uD560 \uC904 \uBC88\uD638\uB97C \uC785\uB825\uD569\uB2C8\uB2E4."],"vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess":["\uAE30\uD638\uB85C \uC774\uB3D9\uD558\uB824\uBA74 \uBA3C\uC800 \uAE30\uD638 \uC815\uBCF4\uAC00 \uC788\uB294 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30\uB97C \uC5FD\uB2C8\uB2E4.","\uD65C\uC131 \uC0C1\uD0DC\uC758 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30\uB294 \uAE30\uD638 \uC815\uBCF4\uB97C \uC81C\uACF5\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uD3B8\uC9D1\uAE30 \uAE30\uD638 \uC5C6\uC74C","\uD3B8\uC9D1\uAE30 \uAE30\uD638 \uC5C6\uC74C","\uCE21\uBA74\uC5D0\uC11C \uC5F4\uAE30","\uD558\uB2E8\uC5D0 \uC5F4\uAE30","\uAE30\uD638({0})","\uC18D\uC131({0})","\uBA54\uC11C\uB4DC({0})","\uD568\uC218({0})","\uC0DD\uC131\uC790({0})","\uBCC0\uC218({0})","\uD074\uB798\uC2A4({0})","\uAD6C\uC870\uCCB4({0})","\uC774\uBCA4\uD2B8({0})","\uC5F0\uC0B0\uC790({0})","\uC778\uD130\uD398\uC774\uC2A4({0})","\uB124\uC784\uC2A4\uD398\uC774\uC2A4({0})","\uD328\uD0A4\uC9C0({0})","\uD615\uC2DD \uB9E4\uAC1C \uBCC0\uC218({0})","\uBAA8\uB4C8({0})","\uC18D\uC131({0})","\uC5F4\uAC70\uD615({0})","\uC5F4\uAC70\uD615 \uBA64\uBC84({0})","\uBB38\uC790\uC5F4({0})","\uD30C\uC77C({0})","\uBC30\uC5F4({0})","\uC22B\uC790({0})","\uBD80\uC6B8({0})","\uAC1C\uCCB4({0})","\uD0A4({0})","\uD544\uB4DC({0})","\uC0C1\uC218({0})"],"vs/editor/contrib/readOnlyMessage/browser/contribution":["\uC77D\uAE30 \uC804\uC6A9 \uC785\uB825\uC5D0\uC11C\uB294 \uD3B8\uC9D1\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC77D\uAE30 \uC804\uC6A9 \uD3B8\uC9D1\uAE30\uC5D0\uC11C\uB294 \uD3B8\uC9D1\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."],"vs/editor/contrib/rename/browser/rename":["\uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC704\uCE58 \uC774\uB984\uC744 \uBC14\uAFB8\uB294 \uC911 \uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.","'{0}'\uC5D0\uC11C '{1}'(\uC73C)\uB85C \uC774\uB984\uC744 \uBC14\uAFB8\uB294 \uC911","{1}\uC5D0 {0} \uC774\uB984 \uBC14\uAFB8\uAE30","'{0}'\uC744(\uB97C) '{1}'(\uC73C)\uB85C \uC774\uB984\uC744 \uBCC0\uACBD\uD588\uC2B5\uB2C8\uB2E4. \uC694\uC57D: {2}","\uC774\uB984 \uBC14\uAFB8\uAE30\uB97C \uD1B5\uD574 \uD3B8\uC9D1 \uB0B4\uC6A9\uC744 \uC801\uC6A9\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC774\uB984 \uBC14\uAFB8\uAE30\uB97C \uD1B5\uD574 \uD3B8\uC9D1 \uB0B4\uC6A9\uC744 \uACC4\uC0B0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uAE30\uD638 \uC774\uB984 \uBC14\uAFB8\uAE30","\uC774\uB984\uC744 \uBC14\uAFB8\uAE30 \uC804\uC5D0 \uBCC0\uACBD \uB0B4\uC6A9\uC744 \uBBF8\uB9AC \uBCFC \uC218 \uC788\uB294 \uAE30\uB2A5 \uC0AC\uC6A9/\uC0AC\uC6A9 \uC548 \uD568"],"vs/editor/contrib/rename/browser/renameInputField":["\uC785\uB825 \uC774\uB984 \uBC14\uAFB8\uAE30 \uC704\uC82F\uC774 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80","\uC785\uB825 \uC774\uB984\uC744 \uBC14\uAFB8\uC138\uC694. \uC0C8 \uC774\uB984\uC744 \uC785\uB825\uD55C \uB2E4\uC74C [Enter] \uD0A4\uB97C \uB20C\uB7EC \uCEE4\uBC0B\uD558\uC138\uC694.","\uC774\uB984 \uBC14\uAFB8\uAE30 {0}, \uBBF8\uB9AC \uBCF4\uAE30 {1}"],"vs/editor/contrib/smartSelect/browser/smartSelect":["\uC120\uD0DD \uC601\uC5ED \uD655\uC7A5","\uC120\uD0DD \uC601\uC5ED \uD655\uC7A5(&&E)","\uC120\uD0DD \uC601\uC5ED \uCD95\uC18C","\uC120\uD0DD \uC601\uC5ED \uCD95\uC18C(&&S)"],"vs/editor/contrib/snippet/browser/snippetController2":["\uD604\uC7AC \uD3B8\uC9D1\uAE30\uAC00 \uCF54\uB4DC \uC870\uAC01 \uBAA8\uB4DC\uC778\uC9C0 \uC5EC\uBD80","\uCF54\uB4DC \uC870\uAC01 \uBAA8\uB4DC\uC77C \uB54C \uB2E4\uC74C \uD0ED \uC815\uC9C0\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uCF54\uB4DC \uC870\uAC01 \uBAA8\uB4DC\uC77C \uB54C \uC774\uC804 \uD0ED \uC815\uC9C0\uAC00 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uB2E4\uC74C \uC790\uB9AC \uD45C\uC2DC\uC790\uB85C \uC774\uB3D9..."],"vs/editor/contrib/snippet/browser/snippetVariables":["\uC77C\uC694\uC77C","\uC6D4\uC694\uC77C","\uD654\uC694\uC77C","\uC218\uC694\uC77C","\uBAA9\uC694\uC77C","\uAE08\uC694\uC77C","\uD1A0\uC694\uC77C","\uC77C","\uC6D4","\uD654","\uC218","\uBAA9","\uAE08","\uD1A0","1\uC6D4","2\uC6D4","3\uC6D4","4\uC6D4","5\uC6D4","6\uC6D4","7\uC6D4","8\uC6D4","9\uC6D4","10\uC6D4","11\uC6D4","12\uC6D4","1\uC6D4","2\uC6D4","3\uC6D4","4\uC6D4","5\uC6D4","6\uC6D4","7\uC6D4","8\uC6D4","9\uC6D4","10\uC6D4","11\uC6D4","12\uC6D4"],"vs/editor/contrib/stickyScroll/browser/stickyScrollActions":["\uD3B8\uC9D1\uAE30 \uACE0\uC815 \uC2A4\uD06C\uB864 \uD1A0\uAE00","\uD3B8\uC9D1\uAE30 \uACE0\uC815 \uC2A4\uD06C\uB864 \uD1A0\uAE00(&\uD1A0\uAE00)","\uACE0\uC815 \uC2A4\uD06C\uB864","\uACE0\uC815 \uC2A4\uD06C\uB864(&&S)","\uACE0\uC815 \uC2A4\uD06C\uB864 \uD3EC\uCEE4\uC2A4","\uACE0\uC815 \uC2A4\uD06C\uB864 \uD3EC\uCEE4\uC2A4(&&F)","\uB2E4\uC74C \uACE0\uC815 \uC2A4\uD06C\uB864 \uC120 \uC120\uD0DD","\uC774\uC804 \uACE0\uC815 \uC2A4\uD06C\uB864 \uC120 \uC120\uD0DD","\uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uACE0\uC815 \uC2A4\uD06C\uB864 \uC120\uC73C\uB85C \uC774\uB3D9","\uD3B8\uC9D1\uAE30 \uC120\uD0DD"],"vs/editor/contrib/suggest/browser/suggest":["\uC81C\uC548\uC5D0 \uCD08\uC810\uC744 \uB9DE\uCD94\uB294\uC9C0 \uC5EC\uBD80","\uC81C\uC548 \uC138\uBD80 \uC815\uBCF4\uAC00 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80","\uC120\uD0DD\uD560 \uC218 \uC788\uB294 \uC5EC\uB7EC \uC81C\uC548\uC774 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uD604\uC7AC \uC81C\uC548\uC744 \uC0BD\uC785\uD558\uBA74 \uBCC0\uACBD \uB0B4\uC6A9\uC774 \uC0DD\uC131\uB418\uB294\uC9C0 \uB610\uB294 \uBAA8\uB4E0 \uD56D\uBAA9\uC774 \uC774\uBBF8 \uC785\uB825\uB418\uC5C8\uB294\uC9C0 \uC5EC\uBD80","<Enter> \uD0A4\uB97C \uB204\uB97C \uB54C \uC81C\uC548\uC774 \uC0BD\uC785\uB418\uB294\uC9C0 \uC5EC\uBD80","\uD604\uC7AC \uC81C\uC548\uC5D0 \uC0BD\uC785 \uBC0F \uBC14\uAFB8\uAE30 \uB3D9\uC791\uC774 \uC788\uB294\uC9C0 \uC5EC\uBD80","\uAE30\uBCF8 \uB3D9\uC791\uC774 \uC0BD\uC785\uC778\uC9C0 \uB610\uB294 \uBC14\uAFB8\uAE30\uC778\uC9C0 \uC5EC\uBD80","\uD604\uC7AC \uC81C\uC548\uC5D0\uC11C \uCD94\uAC00 \uC138\uBD80 \uC815\uBCF4\uB97C \uD655\uC778\uD558\uB3C4\uB85D \uC9C0\uC6D0\uD558\uB294\uC9C0 \uC5EC\uBD80"],"vs/editor/contrib/suggest/browser/suggestController":["{0}\uC758 {1}\uAC1C\uC758 \uC218\uC815\uC0AC\uD56D\uC744 \uC218\uB77D\uD558\uB294 \uC911","\uC81C\uC548 \uD56D\uBAA9 \uD2B8\uB9AC\uAC70","\uC0BD\uC785","\uC0BD\uC785","\uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30","\uC0BD\uC785","\uAC04\uB2E8\uD788 \uD45C\uC2DC","\uB354 \uBCF4\uAE30","\uC81C\uC548 \uC704\uC82F \uD06C\uAE30 \uB2E4\uC2DC \uC124\uC815"],"vs/editor/contrib/suggest/browser/suggestWidget":["\uC81C\uC548 \uC704\uC82F\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uD55C \uC704\uC82F\uC5D0\uC11C \uC120\uD0DD\uB41C \uD56D\uBAA9\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uD55C \uC704\uC82F\uC5D0\uC11C \uC120\uD0DD\uB41C \uD56D\uBAA9\uC758 \uC544\uC774\uCF58 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uD55C \uC704\uC82F\uC5D0\uC11C \uC120\uD0DD\uB41C \uD56D\uBAA9\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC \uC0C9\uC785\uB2C8\uB2E4.","\uD56D\uBAA9\uC5D0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uC744 \uB54C \uCD94\uCC9C \uC704\uC82F\uC5D0\uC11C \uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC758 \uC0C9\uC774 \uAC15\uC870 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F \uC0C1\uD0DC\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB85C\uB4DC \uC911...","\uC81C\uC548 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC81C\uC548","{0} {1}, {2}","{0} {1}","{0}, {1}","{0}, \uBB38\uC11C: {1}"],"vs/editor/contrib/suggest/browser/suggestWidgetDetails":["\uB2EB\uAE30","\uB85C\uB4DC \uC911..."],"vs/editor/contrib/suggest/browser/suggestWidgetRenderer":["\uC81C\uC548 \uC704\uC82F\uC5D0\uC11C \uC790\uC138\uD55C \uC815\uBCF4\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uC790\uC138\uD55C \uC815\uBCF4"],"vs/editor/contrib/suggest/browser/suggestWidgetStatus":["{0}({1})"],"vs/editor/contrib/symbolIcons/browser/symbolIcons":["\uBC30\uC5F4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uBD80\uC6B8 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD074\uB798\uC2A4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC0C9 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0C1\uC218 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC0DD\uC131\uC790 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC5F4\uAC70\uC790 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC5F4\uAC70\uC790 \uBA64\uBC84 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC774\uBCA4\uD2B8 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD544\uB4DC \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uD30C\uC77C \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD3F4\uB354 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD568\uC218 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC778\uD130\uD398\uC774\uC2A4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uD0A4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uD0A4\uC6CC\uB4DC \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uBA54\uC11C\uB4DC \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uBAA8\uB4C8 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uB124\uC784\uC2A4\uD398\uC774\uC2A4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","null \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC22B\uC790 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uAC1C\uCCB4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC5F0\uC0B0\uC790 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD328\uD0A4\uC9C0 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC18D\uC131 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uCC38\uC870 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uBB38\uC790\uC5F4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uAD6C\uC870 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD615\uC2DD \uB9E4\uAC1C\uBCC0\uC218 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uB2E8\uC704 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uBCC0\uC218 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4."],"vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode":["<Tab> \uD0A4\uB85C \uD3EC\uCEE4\uC2A4 \uC774\uB3D9 \uC124\uC815/\uD574\uC81C","\uC774\uC81C <Tab> \uD0A4\uB97C \uB204\uB974\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uB2E4\uC74C \uD3EC\uCEE4\uC2A4 \uAC00\uB2A5\uD55C \uC694\uC18C\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4.","\uC774\uC81C <Tab> \uD0A4\uB97C \uB204\uB974\uBA74 \uD0ED \uBB38\uC790\uAC00 \uC0BD\uC785\uB429\uB2C8\uB2E4."],"vs/editor/contrib/tokenization/browser/tokenization":["\uAC1C\uBC1C\uC790: \uAC15\uC81C\uB85C \uB2E4\uC2DC \uD1A0\uD070\uD654"],"vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter":["\uD655\uC7A5 \uD3B8\uC9D1\uAE30\uC5D0 \uACBD\uACE0 \uBA54\uC2DC\uC9C0\uC640 \uD568\uAED8 \uD45C\uC2DC\uB418\uB294 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uC774 \uBB38\uC11C\uC5D0\uB294 \uAE30\uBCF8 ASCII \uC720\uB2C8\uCF54\uB4DC \uBB38\uC790\uAC00 \uC544\uB2CC \uBB38\uC790\uAC00 \uB9CE\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.","\uC774 \uBB38\uC11C\uC5D0\uB294 \uBAA8\uD638\uD55C \uC720\uB2C8\uCF54\uB4DC \uBB38\uC790\uAC00 \uB9CE\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.","\uC774 \uBB38\uC11C\uC5D0\uB294 \uBCF4\uC774\uC9C0 \uC54A\uB294 \uC720\uB2C8\uCF54\uB4DC \uBB38\uC790\uAC00 \uB9CE\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.","\uC720\uB2C8\uCF54\uB4DC \uAC15\uC870 \uD45C\uC2DC \uC635\uC158 \uAD6C\uC131","\uBB38\uC790 {0}\uC740(\uB294) \uC18C\uC2A4 \uCF54\uB4DC\uC5D0\uC11C \uB354 \uC77C\uBC18\uC801\uC778 ASCII \uBB38\uC790 {1}\uACFC(\uC640) \uD63C\uB3D9\uB420 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","{0} \uBB38\uC790\uB294 \uC18C\uC2A4 \uCF54\uB4DC\uC5D0\uC11C \uB354 \uC77C\uBC18\uC801\uC778 {1} \uBB38\uC790\uC640 \uD63C\uB3D9\uB420 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","{0} \uBB38\uC790\uAC00 \uBCF4\uC774\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","{0} \uBB38\uC790\uB294 \uAE30\uBCF8 ASCII \uBB38\uC790\uAC00 \uC544\uB2D9\uB2C8\uB2E4.","\uC124\uC815 \uC870\uC815","\uBA54\uBAA8\uC5D0\uC11C \uAC15\uC870 \uD45C\uC2DC \uC0AC\uC6A9 \uC548 \uD568","\uBA54\uBAA8\uC5D0\uC11C \uBB38\uC790 \uAC15\uC870 \uD45C\uC2DC \uC0AC\uC6A9 \uC548 \uD568","\uBB38\uC790\uC5F4\uC5D0\uC11C \uAC15\uC870 \uD45C\uC2DC \uC0AC\uC6A9 \uC548 \uD568","\uBB38\uC790\uC5F4\uC5D0\uC11C \uBB38\uC790 \uAC15\uC870 \uD45C\uC2DC \uC0AC\uC6A9 \uC548 \uD568","\uBAA8\uD638\uD55C \uAC15\uC870 \uC0AC\uC6A9 \uC548 \uD568","\uBAA8\uD638\uD55C \uBB38\uC790 \uAC15\uC870 \uD45C\uC2DC \uC0AC\uC6A9 \uC548 \uD568","\uBCF4\uC774\uC9C0 \uC54A\uB294 \uAC15\uC870 \uC0AC\uC6A9 \uC548 \uD568","\uBCF4\uC774\uC9C0 \uC54A\uB294 \uBB38\uC790 \uAC15\uC870 \uD45C\uC2DC \uC0AC\uC6A9 \uC548 \uD568","ASCII\uAC00 \uBB38\uC790\uAC00 \uC544\uB2CC \uAC15\uC870 \uC0AC\uC6A9 \uC548 \uD568","\uAE30\uBCF8\uC774 \uC544\uB2CC ASCII \uBB38\uC790 \uAC15\uC870 \uD45C\uC2DC \uC0AC\uC6A9 \uC548 \uD568","\uC81C\uC678 \uC635\uC158 \uD45C\uC2DC","{0}(\uBCF4\uC774\uC9C0 \uC54A\uB294 \uBB38\uC790)\uC774(\uAC00) \uAC15\uC870 \uD45C\uC2DC\uB418\uC9C0 \uC54A\uB3C4\uB85D \uC81C\uC678","\uAC15\uC870 \uD45C\uC2DC\uC5D0\uC11C {0} \uC81C\uC678",'\uC5B8\uC5B4 "{0}"\uC5D0\uC11C \uB354 \uC77C\uBC18\uC801\uC778 \uC720\uB2C8\uCF54\uB4DC \uBB38\uC790\uB97C \uD5C8\uC6A9\uD569\uB2C8\uB2E4.'],"vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators":["\uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790","\uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790\uAC00 \uAC80\uC0C9\uB428","\uC774 \uD30C\uC77C \u2018\r\n\u2019\uC5D0 LS(\uC904 \uAD6C\uBD84 \uAE30\uD638) \uB610\uB294 PS(\uB2E8\uB77D \uAD6C\uBD84 \uAE30\uD638) \uAC19\uC740 \uD558\uB098 \uC774\uC0C1\uC758 \uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790 \uBB38\uC790\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.{0}\r\n\uD30C\uC77C\uC5D0\uC11C \uC81C\uAC70\uD558\uB294 \uAC83\uC774 \uC88B\uC2B5\uB2C8\uB2E4. `editor.unusualLineTerminators`\uB97C \uD1B5\uD574 \uAD6C\uC131\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790 \uC81C\uAC70(&&R)","\uBB34\uC2DC"],"vs/editor/contrib/wordHighlighter/browser/highlightDecorations":["\uBCC0\uC218 \uC77D\uAE30\uC640 \uAC19\uC740 \uC77D\uAE30 \uC561\uC138\uC2A4 \uC911 \uAE30\uD638\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uBCC0\uC218\uC5D0 \uC4F0\uAE30\uC640 \uAC19\uC740 \uC4F0\uAE30 \uC561\uC138\uC2A4 \uC911 \uAE30\uD638\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uAE30\uD638\uC5D0 \uB300\uD55C \uD14D\uC2A4\uD2B8 \uD56D\uBAA9\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uBCC0\uC218 \uC77D\uAE30\uC640 \uAC19\uC740 \uC77D\uAE30 \uC561\uC138\uC2A4 \uC911 \uAE30\uD638\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uBCC0\uC218\uC5D0 \uC4F0\uAE30\uC640 \uAC19\uC740 \uC4F0\uAE30 \uC561\uC138\uC2A4 \uC911 \uAE30\uD638\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uAE30\uD638\uC5D0 \uB300\uD55C \uD14D\uC2A4\uD2B8 \uD56D\uBAA9\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uAE30\uD638 \uAC15\uC870 \uD45C\uC2DC\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC4F0\uAE30 \uC561\uC138\uC2A4 \uAE30\uD638\uC5D0 \uB300\uD55C \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC774 \uAC15\uC870 \uD45C\uC2DC\uB429\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uAE30\uD638\uC5D0 \uB300\uD55C \uD14D\uC2A4\uD2B8 \uD56D\uBAA9\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uB9C8\uCEE4 \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."],"vs/editor/contrib/wordHighlighter/browser/wordHighlighter":["\uB2E4\uC74C \uAC15\uC870 \uAE30\uD638\uB85C \uC774\uB3D9","\uC774\uC804 \uAC15\uC870 \uAE30\uD638\uB85C \uC774\uB3D9","\uAE30\uD638 \uAC15\uC870 \uD45C\uC2DC \uD2B8\uB9AC\uAC70"],"vs/editor/contrib/wordOperations/browser/wordOperations":["\uB2E8\uC5B4 \uC0AD\uC81C"],"vs/platform/action/common/actionCommonCategories":["\uAC1C\uBC1C\uC790","\uBCF4\uAE30","\uB3C4\uC6C0\uB9D0","\uD14C\uC2A4\uD2B8","\uD30C\uC77C","\uAE30\uBCF8 \uC124\uC815"],"vs/platform/actionWidget/browser/actionList":["\uC801\uC6A9\uD558\uB824\uBA74 {0}, \uBBF8\uB9AC \uBCF4\uAE30\uB97C \uBCF4\uB824\uBA74 {1}","\uC2E0\uCCAD\uD558\uB824\uBA74 {0}","{0}, \uC0AC\uC6A9 \uC548 \uD568 \uC774\uC720: {1}","\uC791\uC5C5 \uC704\uC82F"],"vs/platform/actionWidget/browser/actionWidget":["\uC791\uC5C5 \uD45C\uC2DC\uC904\uC5D0\uC11C \uD1A0\uAE00\uB41C \uC791\uC5C5 \uD56D\uBAA9\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC791\uC5C5 \uC704\uC82F \uBAA9\uB85D \uD45C\uC2DC \uC5EC\uBD80","\uC791\uC5C5 \uC704\uC82F \uC228\uAE30\uAE30","\uC774\uC804 \uC791\uC5C5 \uC120\uD0DD","\uB2E4\uC74C \uC791\uC5C5 \uC120\uD0DD","\uC120\uD0DD\uD55C \uC791\uC5C5 \uC218\uB77D","\uC120\uD0DD\uD55C \uC791\uC5C5 \uBBF8\uB9AC \uBCF4\uAE30"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0}({1})","{0}({1})",`{0}\r
+[{1}] {2}`],"vs/platform/actions/browser/toolbar":["\uC228\uAE30\uAE30","\uBA54\uB274 \uB2E4\uC2DC \uC124\uC815"],"vs/platform/actions/common/menuService":["'{0}' \uC228\uAE30\uAE30"],"vs/platform/audioCues/browser/audioCueService":["\uC904\uC5D0 \uB300\uD55C \uC624\uB958","\uC624\uB958","\uC904\uC5D0 \uB300\uD55C \uACBD\uACE0","\uACBD\uACE0","\uC904\uC758 \uC811\uD78C \uBD80\uBD84","\uC811\uD798","\uC904\uC758 \uC911\uB2E8\uC810","\uC911\uB2E8\uC810","\uC904\uC758 \uC778\uB77C\uC778 \uC81C\uC548","\uD130\uBBF8\uB110 \uBE60\uB978 \uC218\uC815","\uBE60\uB978 \uC218\uC815","\uC911\uB2E8\uC810\uC5D0\uC11C \uC911\uC9C0\uB41C \uB514\uBC84\uAC70","\uC911\uB2E8\uC810","\uC904\uC758 \uC778\uB808\uC774 \uD78C\uD2B8 \uC5C6\uC74C","\uC778\uB808\uC774 \uD78C\uD2B8 \uC5C6\uC74C","\uC644\uB8CC\uB41C \uC791\uC5C5","\uC791\uC5C5 \uC644\uB8CC","\uC791\uC5C5 \uC2E4\uD328","\uC791\uC5C5 \uC2E4\uD328","\uD130\uBBF8\uB110 \uBA85\uB839 \uC2E4\uD328","\uBA85\uB839\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.","\uD130\uBBF8\uB110 \uBCA8","\uD130\uBBF8\uB110 \uBCA8","Notebook \uC140 \uC644\uB8CC\uB428","Notebook \uC140 \uC644\uB8CC\uB428","Notebook \uC140 \uC2E4\uD328","Notebook \uC140 \uC2E4\uD328","Diff \uC904 \uC0BD\uC785\uB428","Diff \uC904 \uC0AD\uC81C\uB428","Diff \uC904 \uC218\uC815\uB428","\uCC44\uD305 \uC694\uCCAD \uC804\uC1A1\uB428","\uCC44\uD305 \uC694\uCCAD \uC804\uC1A1\uB428","\uCC44\uD305 \uC751\uB2F5 \uC218\uC2E0\uB428","\uCC44\uD305 \uC751\uB2F5 \uB300\uAE30 \uC911","\uCC44\uD305 \uC751\uB2F5 \uB300\uAE30 \uC911","\uC9C0\uC6B0\uAE30","\uC9C0\uC6B0\uAE30","\uC800\uC7A5","\uC800\uC7A5","\uC11C\uC2DD","\uD615\uC2DD"],"vs/platform/configuration/common/configurationRegistry":["\uAE30\uBCF8 \uC5B8\uC5B4 \uAD6C\uC131 \uC7AC\uC815\uC758","{0}\uC5D0\uC11C \uC7AC\uC815\uC758\uD560 \uC124\uC815\uC744 \uAD6C\uC131\uD569\uB2C8\uB2E4.","\uC5B8\uC5B4\uC5D0 \uB300\uD574 \uC7AC\uC815\uC758\uD560 \uD3B8\uC9D1\uAE30 \uC124\uC815\uC744 \uAD6C\uC131\uD569\uB2C8\uB2E4.","\uC774 \uC124\uC815\uC740 \uC5B8\uC5B4\uBCC4 \uAD6C\uC131\uC744 \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC5B8\uC5B4\uC5D0 \uB300\uD574 \uC7AC\uC815\uC758\uD560 \uD3B8\uC9D1\uAE30 \uC124\uC815\uC744 \uAD6C\uC131\uD569\uB2C8\uB2E4.","\uC774 \uC124\uC815\uC740 \uC5B8\uC5B4\uBCC4 \uAD6C\uC131\uC744 \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uBE48 \uC18D\uC131\uC744 \uB4F1\uB85D\uD560 \uC218 \uC5C6\uC74C","'{0}'\uC744(\uB97C) \uB4F1\uB85D\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC774\uB294 \uC5B8\uC5B4\uBCC4 \uD3B8\uC9D1\uAE30 \uC124\uC815\uC744 \uC124\uBA85\uD558\uB294 \uC18D\uC131 \uD328\uD134\uC778 '\\\\[.*\\\\]$'\uACFC(\uC640) \uC77C\uCE58\uD569\uB2C8\uB2E4. 'configurationDefaults' \uAE30\uC5EC\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.","'{0}'\uC744(\uB97C) \uB4F1\uB85D\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC774 \uC18D\uC131\uC740 \uC774\uBBF8 \uB4F1\uB85D\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.","'{0}'\uC744(\uB97C) \uB4F1\uB85D\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC5F0\uACB0\uB41C \uC815\uCC45 {1}\uC774(\uAC00) \uC774\uBBF8 {2}\uC5D0 \uB4F1\uB85D\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4."],"vs/platform/contextkey/browser/contextKeyService":["\uCEE8\uD14D\uC2A4\uD2B8 \uD0A4\uC5D0 \uB300\uD55C \uC815\uBCF4\uB97C \uBC18\uD658\uD558\uB294 \uBA85\uB839"],"vs/platform/contextkey/common/contextkey":["\uBE48 \uCEE8\uD14D\uC2A4\uD2B8 \uD0A4 \uC2DD","\uC2DD \uC4F0\uB294 \uAC83\uC744 \uC78A\uC73C\uC168\uB098\uC694? \uD56D\uC0C1 'false' \uB610\uB294 'true'\uB97C \uB123\uC5B4 \uAC01\uAC01 false \uB610\uB294 true\uB85C \uD3C9\uAC00\uD560 \uC218\uB3C4 \uC788\uC2B5\uB2C8\uB2E4.","'not' \uB4A4\uC5D0 'in'\uC774 \uC788\uC2B5\uB2C8\uB2E4.","\uB2EB\uB294 \uAD04\uD638 ')'","\uC608\uAE30\uCE58 \uC54A\uC740 \uD1A0\uD070","\uD1A0\uD070 \uC55E\uC5D0 && \uB610\uB294 ||\uB97C \uC785\uB825\uD558\uB294 \uAC83\uC744 \uC78A\uC73C\uC168\uB098\uC694?","\uD544\uC694\uD558\uC9C0 \uC54A\uC740 \uC2DD\uC758 \uB05D","\uCEE8\uD14D\uC2A4\uD2B8 \uD0A4\uB97C \uC785\uB825\uD558\uB294 \uAC83\uC744 \uC78A\uC73C\uC168\uB098\uC694?",`\uC608\uC0C1: {0}\r
+\uC218\uC2E0\uB428: '{1}'.`],"vs/platform/contextkey/common/contextkeys":["\uC6B4\uC601 \uCCB4\uC81C\uAC00 macOS\uC778\uC9C0 \uC5EC\uBD80","\uC6B4\uC601 \uCCB4\uC81C\uAC00 Linux\uC778\uC9C0 \uC5EC\uBD80","\uC6B4\uC601 \uCCB4\uC81C\uAC00 Windows\uC778\uC9C0 \uC5EC\uBD80","\uD50C\uB7AB\uD3FC\uC774 \uC6F9 \uBE0C\uB77C\uC6B0\uC800\uC778\uC9C0 \uC5EC\uBD80","\uBE0C\uB77C\uC6B0\uC800 \uAE30\uBC18\uC774 \uC544\uB2CC \uD50C\uB7AB\uD3FC\uC5D0\uC11C \uC6B4\uC601 \uCCB4\uC81C\uAC00 macOS\uC778\uC9C0 \uC5EC\uBD80","\uC6B4\uC601 \uCCB4\uC81C\uAC00 iOS\uC778\uC9C0 \uC5EC\uBD80","\uD50C\uB7AB\uD3FC\uC774 \uBAA8\uBC14\uC77C \uC6F9 \uBE0C\uB77C\uC6B0\uC800\uC778\uC9C0 \uC5EC\uBD80","VS \uCF54\uB4DC\uC758 \uD488\uC9C8 \uC720\uD615","\uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uAC00 \uC785\uB825 \uC0C1\uC790 \uB0B4\uC5D0 \uC788\uB294\uC9C0 \uC5EC\uBD80"],"vs/platform/contextkey/common/scanner":["{0}\uC744(\uB97C) \uC0AC\uC6A9\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?","{0} \uB610\uB294 {1}\uC744(\uB97C) \uC0AC\uC6A9\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?","{0}, {1} \uB610\uB294 {2}\uC744(\uB97C) \uC0AC\uC6A9\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?","\uACAC\uC801\uC744 \uC5F4\uAC70\uB098 \uB2EB\uB294 \uAC83\uC744 \uC78A\uC73C\uC168\uB098\uC694?","'/'(\uC2AC\uB798\uC2DC) \uBB38\uC790\uB97C \uC774\uC2A4\uCF00\uC774\uD504\uD558\uB294 \uAC83\uC744 \uC78A\uC73C\uC168\uB098\uC694? \uC774\uC2A4\uCF00\uC774\uD504\uD558\uB824\uBA74 \uC55E\uC5D0 \uBC31\uC2AC\uB77C\uC2DC \uB450 \uAC1C(\uC608: '\\\\/')\uB97C \uB123\uC2B5\uB2C8\uB2E4."],"vs/platform/history/browser/contextScopedHistoryWidget":["\uC81C\uC548\uC774 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80"],"vs/platform/keybinding/common/abstractKeybindingService":["({0})\uC744(\uB97C) \uB20C\uB800\uC2B5\uB2C8\uB2E4. \uB458\uC9F8 \uD0A4\uB294 \uC7A0\uC2DC \uAE30\uB2E4\uB838\uB2E4\uAC00 \uB204\uB974\uC2ED\uC2DC\uC624...","({0})\uC744(\uB97C) \uB20C\uB800\uC2B5\uB2C8\uB2E4. \uCF54\uB4DC\uC758 \uB2E4\uC74C \uD0A4\uB97C \uAE30\uB2E4\uB9AC\uB294 \uC911...","\uD0A4 \uC870\uD569({0}, {1})\uC740 \uBA85\uB839\uC774 \uC544\uB2D9\uB2C8\uB2E4.","\uD0A4 \uC870\uD569({0}, {1})\uC740 \uBA85\uB839\uC774 \uC544\uB2D9\uB2C8\uB2E4."],"vs/platform/list/browser/listService":["\uC6CC\uD06C\uBCA4\uCE58","Windows\uC640 Linux\uC758 'Control'\uC744 macOS\uC758 'Command'\uB85C \uB9E4\uD551\uD569\uB2C8\uB2E4.","Windows\uC640 Linux\uC758 'Alt'\uB97C macOS\uC758 'Option'\uC73C\uB85C \uB9E4\uD551\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uD2B8\uB9AC\uC640 \uBAA9\uB85D\uC758 \uD56D\uBAA9\uC744 \uB2E4\uC911 \uC120\uD0DD\uC5D0 \uCD94\uAC00\uD560 \uB54C \uC0AC\uC6A9\uD560 \uD55C\uC815\uC790\uC785\uB2C8\uB2E4(\uC608\uB97C \uB4E4\uC5B4 \uD0D0\uC0C9\uAE30\uC5D0\uC11C \uD3B8\uC9D1\uAE30\uC640 SCM \uBCF4\uAE30\uB97C \uC5EC\uB294 \uACBD\uC6B0). '\uC606\uC5D0\uC11C \uC5F4\uAE30' \uB9C8\uC6B0\uC2A4 \uC81C\uC2A4\uCC98(\uC9C0\uC6D0\uB418\uB294 \uACBD\uC6B0)\uB294 \uB2E4\uC911 \uC120\uD0DD \uD55C\uC815\uC790\uC640 \uCDA9\uB3CC\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC870\uC815\uB429\uB2C8\uB2E4.","\uD2B8\uB9AC\uC640 \uBAA9\uB85D\uC5D0\uC11C \uB9C8\uC6B0\uC2A4\uB97C \uC0AC\uC6A9\uD558\uC5EC \uD56D\uBAA9\uC744 \uC5EC\uB294 \uBC29\uBC95\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4(\uC9C0\uC6D0\uB418\uB294 \uACBD\uC6B0). \uC77C\uBD80 \uD2B8\uB9AC\uC640 \uBAA9\uB85D\uC5D0\uC11C\uB294 \uC774 \uC124\uC815\uC744 \uC801\uC6A9\uD560 \uC218 \uC5C6\uB294 \uACBD\uC6B0 \uBB34\uC2DC\uD558\uB3C4\uB85D \uC120\uD0DD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC6CC\uD06C\uBCA4\uCE58\uC5D0\uC11C \uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC758 \uAC00\uB85C \uC2A4\uD06C\uB864 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uACBD\uACE0: \uC774 \uC124\uC815\uC744 \uCF1C\uBA74 \uC131\uB2A5\uC5D0 \uC601\uD5A5\uC744 \uBBF8\uCE69\uB2C8\uB2E4.","\uC2A4\uD06C\uB864 \uB9C9\uB300 \uC2A4\uD06C\uB864 \uD398\uC774\uC9C0\uC758 \uD398\uC774\uC9C0\uBCC4 \uD074\uB9AD \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD2B8\uB9AC \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uD53D\uC140 \uB2E8\uC704\uB85C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD2B8\uB9AC\uC5D0\uC11C \uB4E4\uC5EC\uC4F0\uAE30 \uAC00\uC774\uB4DC\uB97C \uB80C\uB354\uB9C1\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBAA9\uB85D\uACFC \uD2B8\uB9AC\uC5D0 \uBD80\uB4DC\uB7EC\uC6B4 \uD654\uBA74 \uC774\uB3D9 \uAE30\uB2A5\uC774 \uC788\uB294\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4 \uD720 \uC2A4\uD06C\uB864 \uC774\uBCA4\uD2B8\uC758 `deltaX` \uBC0F `deltaY`\uC5D0\uC11C \uC0AC\uC6A9\uD560 \uC2B9\uC218\uC785\uB2C8\uB2E4.","'Alt' \uD0A4\uB97C \uB204\uB97C \uB54C \uC2A4\uD06C\uB864 \uC18D\uB3C4 \uC2B9\uC218\uC785\uB2C8\uB2E4.","\uAC80\uC0C9\uD560 \uB54C \uC694\uC18C\uB97C \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4. \uCD94\uAC00 \uC704\uC544\uB798 \uD0D0\uC0C9\uC740 \uAC15\uC870 \uD45C\uC2DC\uB41C \uC694\uC18C\uB9CC \uD0D0\uC0C9\uD569\uB2C8\uB2E4.","\uAC80\uC0C9\uD560 \uB54C \uC694\uC18C\uB97C \uD544\uD130\uB9C1\uD569\uB2C8\uB2E4.","\uC6CC\uD06C\uBCA4\uCE58\uC5D0\uC11C \uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC758 \uAE30\uBCF8 \uCC3E\uAE30 \uBAA8\uB4DC\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAC04\uB2E8\uD55C \uD0A4\uBCF4\uB4DC \uD0D0\uC0C9\uC5D0\uC11C\uB294 \uD0A4\uBCF4\uB4DC \uC785\uB825\uACFC \uC77C\uCE58\uD558\uB294 \uC694\uC18C\uC5D0 \uC9D1\uC911\uD569\uB2C8\uB2E4. \uC77C\uCE58\uB294 \uC811\uB450\uC0AC\uC5D0\uC11C\uB9CC \uC218\uD589\uB429\uB2C8\uB2E4.","\uD0A4\uBCF4\uB4DC \uD0D0\uC0C9 \uAC15\uC870 \uD45C\uC2DC\uC5D0\uC11C\uB294 \uD0A4\uBCF4\uB4DC \uC785\uB825\uACFC \uC77C\uCE58\uD558\uB294 \uC694\uC18C\uB97C \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4. \uC774\uD6C4\uB85C \uD0D0\uC0C9\uC5D0\uC11C \uC704 \uBC0F \uC544\uB798\uB85C \uC774\uB3D9\uD558\uB294 \uACBD\uC6B0 \uAC15\uC870 \uD45C\uC2DC\uB41C \uC694\uC18C\uB9CC \uD2B8\uB798\uBC84\uC2A4\uD569\uB2C8\uB2E4.","\uD0A4\uBCF4\uB4DC \uD0D0\uC0C9 \uD544\uD130\uB9C1\uC5D0\uC11C\uB294 \uD0A4\uBCF4\uB4DC \uC785\uB825\uACFC \uC77C\uCE58\uD558\uC9C0 \uC54A\uB294 \uC694\uC18C\uB97C \uBAA8\uB450 \uD544\uD130\uB9C1\uD558\uC5EC \uC228\uAE41\uB2C8\uB2E4.","\uC6CC\uD06C\uBCA4\uCE58\uC758 \uBAA9\uB85D \uBC0F \uD2B8\uB9AC \uD0A4\uBCF4\uB4DC \uD0D0\uC0C9 \uC2A4\uD0C0\uC77C\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uAC04\uC18C\uD654\uD558\uACE0, \uAC15\uC870 \uD45C\uC2DC\uD558\uACE0, \uD544\uD130\uB9C1\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uB300\uC2E0 'workbench.list.defaultFindMode' \uBC0F 'workbench.list.typeNavigationMode'\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.","\uAC80\uC0C9\uD560 \uB54C \uC720\uC0AC \uD56D\uBAA9 \uC77C\uCE58\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uAC80\uC0C9\uD560 \uB54C \uC5F0\uC18D \uC77C\uCE58\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uC6CC\uD06C\uBCA4\uCE58\uC5D0\uC11C \uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uB97C \uAC80\uC0C9\uD560 \uB54C \uC0AC\uC6A9\uD558\uB294 \uC77C\uCE58 \uC720\uD615\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3F4\uB354 \uC774\uB984\uC744 \uD074\uB9AD\uD560 \uB54C \uD2B8\uB9AC \uD3F4\uB354\uAC00 \uD655\uC7A5\uB418\uB294 \uBC29\uBC95\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC77C\uBD80 \uD2B8\uB9AC\uC640 \uBAA9\uB85D\uC5D0\uC11C\uB294 \uC774 \uC124\uC815\uC744 \uC801\uC6A9\uD560 \uC218 \uC5C6\uB294 \uACBD\uC6B0 \uBB34\uC2DC\uD558\uB3C4\uB85D \uC120\uD0DD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD2B8\uB9AC\uC5D0\uC11C \uACE0\uC815 \uC2A4\uD06C\uB864\uC744 \uC0AC\uC6A9\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","`#workbench.tree.enableStickyScroll#`\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD55C \uACBD\uC6B0 \uD2B8\uB9AC\uC5D0 \uD45C\uC2DC\uB418\uB294 \uACE0\uC815 \uC694\uC18C\uC758 \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC6CC\uD06C\uBCA4\uCE58\uC758 \uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC5D0\uC11C \uD615\uC2DD \uD0D0\uC0C9\uC774 \uC791\uB3D9\uD558\uB294 \uBC29\uC2DD\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4. 'trigger'\uB85C \uC124\uC815 \uC2DC 'list.triggerTypeNavigation' \uBA85\uB839\uC774 \uC2E4\uD589\uB418\uBA74 \uD615\uC2DD \uD0D0\uC0C9\uC774 \uC2DC\uC791\uB429\uB2C8\uB2E4."],"vs/platform/markers/common/markers":["\uC624\uB958","\uACBD\uACE0","\uC815\uBCF4"],"vs/platform/quickinput/browser/commandsQuickAccess":["\uCD5C\uADFC\uC5D0 \uC0AC\uC6A9\uD55C \uD56D\uBAA9","\uC720\uC0AC\uD55C \uBA85\uB839","\uC77C\uBC18\uC801\uC73C\uB85C \uC0AC\uC6A9\uB428","\uAE30\uD0C0 \uBA85\uB839","\uC720\uC0AC\uD55C \uBA85\uB839","{0}, {1}","'{0}' \uBA85\uB839\uC5D0\uC11C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4."],"vs/platform/quickinput/browser/helpQuickAccess":["{0}, {1}"],"vs/platform/quickinput/browser/quickInput":["\uB4A4\uB85C","\uC785\uB825\uC744 \uD655\uC778\uD558\uB824\uBA74 'Enter' \uD0A4\uB97C \uB204\uB974\uACE0, \uCDE8\uC18C\uD558\uB824\uBA74 'Esc' \uD0A4\uB97C \uB204\uB974\uC138\uC694.","{0} / {1}","\uACB0\uACFC\uC758 \uBC94\uC704\uB97C \uCD95\uC18C\uD558\uB824\uBA74 \uC785\uB825\uD558\uC138\uC694."],"vs/platform/quickinput/browser/quickInputController":["\uBAA8\uB4E0 \uD655\uC778\uB780 \uC120\uD0DD/\uD574\uC81C","{0}\uAC1C \uACB0\uACFC","{0} \uC120\uD0DD\uB428","\uD655\uC778","\uC0AC\uC6A9\uC790 \uC9C0\uC815","\uB4A4\uB85C({0})","\uB4A4\uB85C"],"vs/platform/quickinput/browser/quickInputList":["\uBE60\uB978 \uC785\uB825"],"vs/platform/quickinput/browser/quickInputUtils":["'{0}' \uBA85\uB839\uC744 \uC2E4\uD589\uD558\uB824\uBA74 \uD074\uB9AD"],"vs/platform/theme/common/colorRegistry":["\uC804\uCCB4 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC740 \uAD6C\uC131 \uC694\uC18C\uC5D0\uC11C \uC7AC\uC815\uC758\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uBE44\uD65C\uC131\uD654\uB41C \uC694\uC18C\uC758 \uC804\uCCB4 \uC804\uACBD\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC740 \uAD6C\uC131 \uC694\uC18C\uC5D0\uC11C \uC7AC\uC815\uC758\uD558\uC9C0 \uC54A\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uC624\uB958 \uBA54\uC2DC\uC9C0\uC5D0 \uB300\uD55C \uC804\uCCB4 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC740 \uAD6C\uC131 \uC694\uC18C\uC5D0\uC11C \uC7AC\uC815\uC758\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uB808\uC774\uBE14\uACFC \uAC19\uC774 \uCD94\uAC00 \uC815\uBCF4\uB97C \uC81C\uACF5\uD558\uB294 \uC124\uBA85 \uD14D\uC2A4\uD2B8\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC6CC\uD06C\uBCA4\uCE58 \uC544\uC774\uCF58\uC758 \uAE30\uBCF8 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uC694\uC18C\uC758 \uC804\uCCB4 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC740 \uAD6C\uC131 \uC694\uC18C\uC5D0\uC11C \uC7AC\uC815\uC758\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uB354 \uB69C\uB837\uC774 \uB300\uBE44\uB418\uB3C4\uB85D \uC694\uC18C\uB97C \uB2E4\uB978 \uC694\uC18C\uC640 \uAD6C\uBD84\uD558\uB294 \uC694\uC18C \uC8FC\uC704\uC758 \uCD94\uAC00 \uD14C\uB450\uB9AC\uC785\uB2C8\uB2E4.","\uB354 \uB69C\uB837\uC774 \uB300\uBE44\uB418\uB3C4\uB85D \uC694\uC18C\uB97C \uB2E4\uB978 \uC694\uC18C\uC640 \uAD6C\uBD84\uD558\uB294 \uD65C\uC131 \uC694\uC18C \uC8FC\uC704\uC758 \uCD94\uAC00 \uD14C\uB450\uB9AC\uC785\uB2C8\uB2E4.","\uC6CC\uD06C\uBCA4\uCE58\uC758 \uD14D\uC2A4\uD2B8 \uC120\uD0DD(\uC608: \uC785\uB825 \uD544\uB4DC \uB610\uB294 \uD14D\uC2A4\uD2B8 \uC601\uC5ED) \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uD3B8\uC9D1\uAE30 \uB0B4\uC758 \uC120\uD0DD\uC5D0\uB294 \uC801\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8 \uAD6C\uBD84\uC790 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8 \uB0B4 \uB9C1\uD06C\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD074\uB9AD\uD558\uACE0 \uB9C8\uC6B0\uC2A4\uAC00 \uC62C\uB77C\uAC04 \uC0C1\uD0DC\uC758 \uD14D\uC2A4\uD2B8 \uB0B4 \uB9C1\uD06C\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBBF8\uB9AC \uC11C\uC2DD\uC774 \uC9C0\uC815\uB41C \uD14D\uC2A4\uD2B8 \uC138\uADF8\uBA3C\uD2B8\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBBF8\uB9AC \uC11C\uC2DD\uC774 \uC9C0\uC815\uB41C \uD14D\uC2A4\uD2B8 \uC138\uADF8\uBA3C\uD2B8\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8 \uB0B4 \uBE14\uB85D \uC778\uC6A9\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8 \uB0B4 \uBE14\uB85D \uC778\uC6A9\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8 \uB0B4 \uCF54\uB4DC \uBE14\uB85D\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB0B4\uC5D0\uC11C \uCC3E\uAE30/\uBC14\uAFB8\uAE30 \uAC19\uC740 \uC704\uC82F\uC758 \uADF8\uB9BC\uC790 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB0B4\uC5D0\uC11C \uCC3E\uAE30/\uBC14\uAFB8\uAE30\uC640 \uAC19\uC740 \uC704\uC82F\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uC785\uB825 \uC0C1\uC790 \uBC30\uACBD\uC785\uB2C8\uB2E4.","\uC785\uB825 \uC0C1\uC790 \uC804\uACBD\uC785\uB2C8\uB2E4.","\uC785\uB825 \uC0C1\uC790 \uD14C\uB450\uB9AC\uC785\uB2C8\uB2E4.","\uC785\uB825 \uD544\uB4DC\uC5D0\uC11C \uD65C\uC131\uD654\uB41C \uC635\uC158\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uC785\uB825 \uD544\uB4DC\uC5D0\uC11C \uD65C\uC131\uD654\uB41C \uC635\uC158\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC785\uB825 \uD544\uB4DC\uC5D0 \uC788\uB294 \uC635\uC158\uC758 \uBC30\uACBD \uAC00\uB9AC\uD0A4\uAE30 \uC0C9\uC785\uB2C8\uB2E4.","\uC785\uB825 \uD544\uB4DC\uC5D0\uC11C \uD65C\uC131\uD654\uB41C \uC635\uC158\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC704\uCE58 \uD45C\uC2DC\uC790 \uD14D\uC2A4\uD2B8\uC5D0 \uB300\uD55C \uC785\uB825 \uC0C1\uC790 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC815\uBCF4 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC815\uBCF4 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC815\uBCF4 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uACBD\uACE0 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uACBD\uACE0 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uACBD\uACE0 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uC624\uB958 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC624\uB958 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC624\uB958 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uB4DC\uB86D\uB2E4\uC6B4 \uBC30\uACBD\uC785\uB2C8\uB2E4.","\uB4DC\uB86D\uB2E4\uC6B4 \uBAA9\uB85D \uBC30\uACBD\uC785\uB2C8\uB2E4.","\uB4DC\uB86D\uB2E4\uC6B4 \uC804\uACBD\uC785\uB2C8\uB2E4.","\uB4DC\uB86D\uB2E4\uC6B4 \uD14C\uB450\uB9AC\uC785\uB2C8\uB2E4.","\uB2E8\uCD94 \uAE30\uBCF8 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB2E8\uCD94 \uAD6C\uBD84 \uAE30\uD638 \uC0C9\uC785\uB2C8\uB2E4.","\uB2E8\uCD94 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0AC \uB54C \uB2E8\uCD94 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBC84\uD2BC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uBCF4\uC870 \uB2E8\uCD94 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBCF4\uC870 \uB2E8\uCD94 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0AC \uB54C \uBCF4\uC870 \uB2E8\uCD94 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBC30\uC9C0 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBC30\uC9C0\uB294 \uAC80\uC0C9 \uACB0\uACFC \uC218\uC640 \uAC19\uC740 \uC18C\uB7C9\uC758 \uC815\uBCF4 \uB808\uC774\uBE14\uC785\uB2C8\uB2E4.","\uBC30\uC9C0 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBC30\uC9C0\uB294 \uAC80\uC0C9 \uACB0\uACFC \uC218\uC640 \uAC19\uC740 \uC18C\uB7C9\uC758 \uC815\uBCF4 \uB808\uC774\uBE14\uC785\uB2C8\uB2E4.","\uC2A4\uD06C\uB864\uB418\uB294 \uBCF4\uAE30\uB97C \uB098\uD0C0\uB0B4\uB294 \uC2A4\uD06C\uB864 \uB9C9\uB300 \uADF8\uB9BC\uC790\uC785\uB2C8\uB2E4.","\uC2A4\uD06C\uB864 \uB9C9\uB300 \uC2AC\uB77C\uC774\uBC84 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0AC \uB54C \uC2A4\uD06C\uB864 \uB9C9\uB300 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD074\uB9AD\uB41C \uC0C1\uD0DC\uC77C \uB54C \uC2A4\uD06C\uB864 \uB9C9\uB300 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC7A5\uAE30 \uC791\uC5C5\uC744 \uB300\uC0C1\uC73C\uB85C \uD45C\uC2DC\uB420 \uC218 \uC788\uB294 \uC9C4\uD589\uB960 \uD45C\uC2DC\uC904\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC624\uB958 \uD14D\uC2A4\uD2B8\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB0B4 \uC624\uB958 \uD45C\uC2DC\uC120\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC124\uC815\uB41C \uACBD\uC6B0 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC624\uB958\uB97C \uB098\uD0C0\uB0B4\uB294 \uC774\uC911 \uBC11\uC904\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACBD\uACE0 \uD14D\uC2A4\uD2B8\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB0B4 \uACBD\uACE0 \uD45C\uC2DC\uC120\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC124\uC815\uB41C \uACBD\uC6B0 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACBD\uACE0\uB97C \uB098\uD0C0\uB0B4\uB294 \uC774\uC911 \uBC11\uC904\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC815\uBCF4 \uD14D\uC2A4\uD2B8\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB0B4 \uC815\uBCF4 \uD45C\uC2DC\uC120\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC124\uC815\uB41C \uACBD\uC6B0 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC815\uBCF4\uB97C \uB098\uD0C0\uB0B4\uB294 \uC774\uC911 \uBC11\uC904 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD78C\uD2B8 \uD45C\uC2DC\uC120\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC124\uC815\uB41C \uACBD\uC6B0 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD78C\uD2B8\uB97C \uB098\uD0C0\uB0B4\uB294 \uC774\uC911 \uBC11\uC904 \uC0C9\uC785\uB2C8\uB2E4.","\uD65C\uC131 \uC100\uC2DC\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uAE30\uBCF8 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACE0\uC815 \uC2A4\uD06C\uB864\uC758 \uBC30\uACBD\uC0C9","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0AC \uB54C \uACE0\uC815 \uC2A4\uD06C\uB864\uC758 \uBC30\uACBD\uC0C9","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACE0\uC815 \uC2A4\uD06C\uB864\uC758 \uD14C\uB450\uB9AC \uC0C9"," \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACE0\uC815 \uC2A4\uD06C\uB864\uC758 \uADF8\uB9BC\uC790 \uC0C9","\uCC3E\uAE30/\uBC14\uAFB8\uAE30 \uAC19\uC740 \uD3B8\uC9D1\uAE30 \uC704\uC82F\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCC3E\uAE30/\uBC14\uAFB8\uAE30\uC640 \uAC19\uC740 \uD3B8\uC9D1\uAE30 \uC704\uC82F\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC704\uC82F\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4. \uC704\uC82F\uC5D0 \uD14C\uB450\uB9AC\uAC00 \uC788\uACE0 \uC704\uC82F\uC774 \uC0C9\uC0C1\uC744 \uBB34\uC2DC\uD558\uC9C0 \uC54A\uC744 \uB54C\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC704\uC82F \uD06C\uAE30 \uC870\uC815 \uB9C9\uB300\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC740 \uC704\uC82F\uC5D0\uC11C \uD06C\uAE30 \uC870\uC815 \uB9C9\uB300\uB97C \uD45C\uC2DC\uD558\uB3C4\uB85D \uC120\uD0DD\uD558\uACE0 \uC704\uC82F\uC5D0\uC11C \uC0C9\uC744 \uC7AC\uC9C0\uC815\uD558\uC9C0 \uC54A\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uBE60\uB978 \uC120\uD0DD\uAE30 \uBC30\uACBD\uC0C9. \uBE60\uB978 \uC120\uD0DD\uAE30 \uC704\uC82F\uC740 \uBA85\uB839 \uD314\uB808\uD2B8\uC640 \uAC19\uC740 \uC120\uD0DD\uAE30\uB97C \uC704\uD55C \uCEE8\uD14C\uC774\uB108\uC785\uB2C8\uB2E4.","\uBE60\uB978 \uC120\uD0DD\uAE30 \uC804\uACBD\uC0C9. \uC774 \uBE60\uB978 \uC120\uD0DD\uAE30 \uC704\uC82F\uC740 \uBA85\uB839 \uD314\uB808\uD2B8\uC640 \uAC19\uC740 \uC120\uD0DD\uAE30\uB97C \uC704\uD55C \uCEE8\uD14C\uC774\uB108\uC785\uB2C8\uB2E4.","\uBE60\uB978 \uC120\uD0DD\uAE30 \uC81C\uBAA9 \uBC30\uACBD\uC0C9. \uC774 \uBE60\uB978 \uC120\uD0DD\uAE30 \uC704\uC82F\uC740 \uBA85\uB839 \uD314\uB808\uD2B8\uC640 \uAC19\uC740 \uC120\uD0DD\uAE30\uB97C \uC704\uD55C \uCEE8\uD14C\uC774\uB108\uC785\uB2C8\uB2E4.","\uADF8\uB8F9\uD654 \uB808\uC774\uBE14\uC5D0 \uB300\uD55C \uBE60\uB978 \uC120\uD0DD\uAE30 \uC0C9\uC785\uB2C8\uB2E4.","\uADF8\uB8F9\uD654 \uD14C\uB450\uB9AC\uC5D0 \uB300\uD55C \uBE60\uB978 \uC120\uD0DD\uAE30 \uC0C9\uC785\uB2C8\uB2E4.","\uD0A4 \uBC14\uC778\uB529 \uB808\uC774\uBE14 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uD0A4 \uBC14\uC778\uB529 \uB808\uC774\uBE14\uC740 \uBC14\uB85C \uAC00\uAE30 \uD0A4\uB97C \uB098\uD0C0\uB0B4\uB294 \uB370 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD0A4 \uBC14\uC778\uB529 \uB808\uC774\uBE14 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uD0A4 \uBC14\uC778\uB529 \uB808\uC774\uBE14\uC740 \uBC14\uB85C \uAC00\uAE30 \uD0A4\uB97C \uB098\uD0C0\uB0B4\uB294 \uB370 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD0A4 \uBC14\uC778\uB529 \uB808\uC774\uBE14 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4. \uD0A4 \uBC14\uC778\uB529 \uB808\uC774\uBE14\uC740 \uBC14\uB85C \uAC00\uAE30 \uD0A4\uB97C \uB098\uD0C0\uB0B4\uB294 \uB370 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD0A4 \uBC14\uC778\uB529 \uB808\uC774\uBE14 \uD14C\uB450\uB9AC \uC544\uB798\uCABD \uC0C9\uC785\uB2C8\uB2E4. \uD0A4 \uBC14\uC778\uB529 \uB808\uC774\uBE14\uC740 \uBC14\uB85C \uAC00\uAE30 \uD0A4\uB97C \uB098\uD0C0\uB0B4\uB294 \uB370 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC120\uD0DD \uC601\uC5ED\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uACE0\uB300\uBE44\uB97C \uC704\uD55C \uC120\uD0DD \uD14D\uC2A4\uD2B8\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uBE44\uD65C\uC131 \uD3B8\uC9D1\uAE30\uC758 \uC120\uD0DD \uD56D\uBAA9 \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC120\uD0DD \uC601\uC5ED\uACFC \uB3D9\uC77C\uD55C \uCF58\uD150\uCE20\uAC00 \uC788\uB294 \uC601\uC5ED\uC758 \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC120\uD0DD \uC601\uC5ED\uACFC \uB3D9\uC77C\uD55C \uCF58\uD150\uCE20\uAC00 \uC788\uB294 \uC601\uC5ED\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD604\uC7AC \uAC80\uC0C9 \uC77C\uCE58 \uD56D\uBAA9\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uAE30\uD0C0 \uAC80\uC0C9 \uC77C\uCE58 \uD56D\uBAA9\uC758 \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uAC80\uC0C9\uC744 \uC81C\uD55C\uD558\uB294 \uBC94\uC704\uC758 \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD604\uC7AC \uAC80\uC0C9\uACFC \uC77C\uCE58\uD558\uB294 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uB2E4\uB978 \uAC80\uC0C9\uACFC \uC77C\uCE58\uD558\uB294 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uAC80\uC0C9\uC744 \uC81C\uD55C\uD558\uB294 \uBC94\uC704\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uAC80\uC0C9 \uD3B8\uC9D1\uAE30 \uCFFC\uB9AC\uC758 \uC0C9\uC0C1\uC774 \uC77C\uCE58\uD569\uB2C8\uB2E4.","\uAC80\uC0C9 \uD3B8\uC9D1\uAE30 \uCFFC\uB9AC\uC758 \uD14C\uB450\uB9AC \uC0C9\uC0C1\uC774 \uC77C\uCE58\uD569\uB2C8\uB2E4.","\uAC80\uC0C9 \uBDF0\uB81B \uC644\uB8CC \uBA54\uC2DC\uC9C0\uC758 \uD14D\uC2A4\uD2B8 \uC0C9\uC785\uB2C8\uB2E4.","\uD638\uBC84\uAC00 \uD45C\uC2DC\uB41C \uB2E8\uC5B4 \uC544\uB798\uB97C \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD638\uBC84\uC758 \uBC30\uACBD\uC0C9.","\uD3B8\uC9D1\uAE30 \uD638\uBC84\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD638\uBC84\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD638\uBC84 \uC0C1\uD0DC \uD45C\uC2DC\uC904\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD65C\uC131 \uB9C1\uD06C\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uD78C\uD2B8\uC758 \uC804\uACBD\uC0C9","\uC778\uB77C\uC778 \uD78C\uD2B8\uC758 \uBC30\uACBD\uC0C9","\uD615\uC2DD\uC5D0 \uB300\uD55C \uC778\uB77C\uC778 \uD78C\uD2B8\uC758 \uC804\uACBD\uC0C9","\uD615\uC2DD\uC5D0 \uB300\uD55C \uC778\uB77C\uC778 \uD78C\uD2B8\uC758 \uBC30\uACBD\uC0C9","\uB9E4\uAC1C \uBCC0\uC218\uC5D0 \uB300\uD55C \uC778\uB77C\uC778 \uD78C\uD2B8\uC758 \uC804\uACBD\uC0C9","\uB9E4\uAC1C \uBCC0\uC218\uC5D0 \uB300\uD55C \uC778\uB77C\uC778 \uD78C\uD2B8\uC758 \uBC30\uACBD\uC0C9","\uC804\uAD6C \uC791\uC5C5 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uC804\uAD6C \uC790\uB3D9 \uC218\uC815 \uC791\uC5C5 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uC804\uAD6C AI \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uC0BD\uC785\uB41C \uD14D\uC2A4\uD2B8\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC81C\uAC70\uB41C \uD14D\uC2A4\uD2B8 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC0BD\uC785\uB41C \uC904\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC81C\uAC70\uB41C \uC904\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC0C9\uC0C1\uC740 \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC904\uC774 \uC0BD\uC785\uB41C \uC5EC\uBC31\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC904\uC774 \uC81C\uAC70\uB41C \uC5EC\uBC31\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC0BD\uC785\uB41C \uCF58\uD150\uCE20\uC5D0 \uB300\uD55C \uCC28\uB4F1 \uAC1C\uC694 \uB208\uAE08\uC790 \uC804\uACBD\uC785\uB2C8\uB2E4.","\uC81C\uAC70\uB41C \uCF58\uD150\uCE20\uC5D0 \uB300\uD55C \uCC28\uB4F1 \uAC1C\uC694 \uB208\uAE08\uC790 \uC804\uACBD\uC785\uB2C8\uB2E4.","\uC0BD\uC785\uB41C \uD14D\uC2A4\uD2B8\uC758 \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uAC70\uB41C \uD14D\uC2A4\uD2B8\uC758 \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uB450 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30 \uC0AC\uC774\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC758 \uB300\uAC01\uC120 \uCC44\uC6B0\uAE30 \uC0C9\uC785\uB2C8\uB2E4. \uB300\uAC01\uC120 \uCC44\uC6B0\uAE30\uB294 diff \uB098\uB780\uD788 \uBCF4\uAE30\uC5D0\uC11C \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uBE14\uB85D\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uBE14\uB85D\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uCF54\uB4DC\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131\uD654\uB418\uACE0 \uC120\uD0DD\uB418\uC5C8\uC744 \uB54C \uCD08\uC810\uC774 \uB9DE\uCDB0\uC9C4 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC724\uACFD\uC120 \uC0C9\uC0C1\uC785\uB2C8\uB2E4. \uD65C\uC131 \uBAA9\uB85D/\uD2B8\uB9AC\uC5D0\uB294 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uACE0 \uBE44\uD65C\uC131\uC5D0\uB294 \uADF8\uB807\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uC120\uD0DD\uD55C \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uC120\uD0DD\uD55C \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uC120\uD0DD\uD55C \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC544\uC774\uCF58 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uC120\uD0DD\uD55C \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uC120\uD0DD\uD55C \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uC120\uD0DD\uD55C \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC544\uC774\uCF58 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uD56D\uBAA9\uC744 \uAC00\uB9AC\uD0AC \uB54C \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uD56D\uBAA9\uC744 \uAC00\uB9AC\uD0AC \uB54C \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uD56D\uBAA9\uC744 \uC774\uB3D9\uD560 \uB54C \uBAA9\uB85D/\uD2B8\uB9AC \uB04C\uC5B4\uC11C \uB193\uAE30 \uBC30\uACBD\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB97C \uC0AC\uC6A9\uD560 \uB54C \uD56D\uBAA9 \uAC04\uC5D0 \uD56D\uBAA9\uC744 \uC774\uB3D9\uD560 \uB54C \uBAA9\uB85D/\uD2B8\uB9AC \uB04C\uC5B4\uC11C \uB193\uAE30 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC \uB0B4\uC5D0\uC11C \uAC80\uC0C9\uD560 \uB54C \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC \uB0B4\uC5D0\uC11C \uAC80\uC0C9\uD560 \uB54C \uC77C\uCE58 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC0C9\uC774 \uB2A5\uB3D9\uC801\uC73C\uB85C \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC744 \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC798\uBABB\uB41C \uD56D\uBAA9\uC5D0 \uB300\uD55C \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD \uC0C9(\uC608: \uD0D0\uC0C9\uAE30\uC758 \uD655\uC778\uD560 \uC218 \uC5C6\uB294 \uB8E8\uD2B8).","\uC624\uB958\uB97C \uD3EC\uD568\uD558\uB294 \uBAA9\uB85D \uD56D\uBAA9\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uACBD\uACE0\uB97C \uD3EC\uD568\uD558\uB294 \uBAA9\uB85D \uD56D\uBAA9\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC5D0\uC11C \uD615\uC2DD \uD544\uD130 \uC704\uC82F\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC5D0\uC11C \uD615\uC2DD \uD544\uD130 \uC704\uC82F\uC758 \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC774 \uC5C6\uC744 \uB54C \uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC5D0\uC11C \uD45C\uC2DC\uB418\uB294 \uD615\uC2DD \uD544\uD130 \uC704\uC82F\uC758 \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC5D0\uC11C \uC720\uD615 \uD544\uD130 \uC704\uC82F\uC758 \uADF8\uB9BC\uC790 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uD544\uD130\uB9C1\uB41C \uC77C\uCE58 \uD56D\uBAA9\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD544\uD130\uB9C1\uB41C \uC77C\uCE58 \uD56D\uBAA9\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30 \uAC00\uC774\uB4DC\uC758 \uD2B8\uB9AC \uC2A4\uD2B8\uB85C\uD06C \uC0C9\uC785\uB2C8\uB2E4.","\uD65C\uC131 \uC0C1\uD0DC\uAC00 \uC544\uB2CC \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120\uC758 \uD2B8\uB9AC \uC2A4\uD2B8\uB85C\uD06C \uC0C9\uC785\uB2C8\uB2E4.","\uC5F4 \uC0AC\uC774\uC758 \uD45C \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD640\uC218 \uD14C\uC774\uBE14 \uD589\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uAC15\uC870\uB418\uC9C0 \uC54A\uC740 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC0C9. ","\uD655\uC778\uB780 \uC704\uC82F\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD655\uC778\uB780 \uC704\uC82F\uC774 \uD3EC\uD568\uB41C \uC694\uC18C\uAC00 \uC120\uD0DD\uB41C \uACBD\uC6B0\uC758 \uD655\uC778\uB780 \uC704\uC82F \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD655\uC778\uB780 \uC704\uC82F\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD655\uC778\uB780 \uC704\uC82F\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD655\uC778\uB780 \uC704\uC82F\uC774 \uD3EC\uD568\uB41C \uC694\uC18C\uAC00 \uC120\uD0DD\uB41C \uACBD\uC6B0\uC758 \uD655\uC778\uB780 \uC704\uC82F \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uB300\uC2E0 quickInputList.focusBackground\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.","\uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBE60\uB978 \uC120\uD0DD\uAE30 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBE60\uB978 \uC120\uD0DD\uAE30 \uC544\uC774\uCF58 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBE60\uB978 \uC120\uD0DD\uAE30 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274 \uD56D\uBAA9 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274 \uD56D\uBAA9 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274\uC758 \uC120\uD0DD\uB41C \uBA54\uB274 \uD56D\uBAA9 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274\uC758 \uC120\uD0DD\uB41C \uBA54\uB274 \uD56D\uBAA9 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274\uC758 \uC120\uD0DD\uB41C \uBA54\uB274 \uD56D\uBAA9 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274\uC5D0\uC11C \uAD6C\uBD84 \uAE30\uD638 \uBA54\uB274 \uD56D\uBAA9\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC791\uC5C5 \uC704\uB85C \uB9C8\uC6B0\uC2A4\uB97C \uAC00\uC838\uAC00\uB294 \uACBD\uC6B0 \uB3C4\uAD6C \uBAA8\uC74C \uBC30\uACBD","\uB9C8\uC6B0\uC2A4\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC791\uC5C5 \uC704\uB85C \uB9C8\uC6B0\uC2A4\uB97C \uAC00\uC838\uAC00\uB294 \uACBD\uC6B0 \uB3C4\uAD6C \uBAA8\uC74C \uC724\uACFD\uC120","\uC791\uC5C5 \uC704\uC5D0 \uB9C8\uC6B0\uC2A4\uB97C \uB193\uC558\uC744 \uB54C \uB3C4\uAD6C \uBAA8\uC74C \uBC30\uACBD","\uCF54\uB4DC \uC870\uAC01 \uD0ED \uC815\uC9C0\uC758 \uAC15\uC870 \uD45C\uC2DC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uD0ED \uC815\uC9C0\uC758 \uAC15\uC870 \uD45C\uC2DC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uB9C8\uC9C0\uB9C9 \uD0ED \uC815\uC9C0\uC758 \uAC15\uC870 \uD45C\uC2DC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uB9C8\uC9C0\uB9C9 \uD0ED \uC815\uC9C0\uC758 \uAC15\uC870 \uD45C\uC2DC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uC774\uB3D9 \uACBD\uB85C \uD56D\uBAA9\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uC774\uB3D9 \uACBD\uB85C \uD56D\uBAA9\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uC774\uB3D9 \uACBD\uB85C \uD56D\uBAA9\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uC120\uD0DD\uD55C \uC774\uB3D9 \uACBD\uB85C \uD56D\uBAA9\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uC774\uB3D9 \uACBD\uB85C \uD56D\uBAA9 \uC120\uD0DD\uAE30\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uBCD1\uD569 \uCDA9\uB3CC\uC758 \uD604\uC7AC \uD5E4\uB354 \uBC30\uACBD\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uBCD1\uD569 \uCDA9\uB3CC\uC758 \uD604\uC7AC \uCF58\uD150\uCE20 \uBC30\uACBD\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uBCD1\uD569 \uCDA9\uB3CC\uC758 \uB4E4\uC5B4\uC624\uB294 \uD5E4\uB354 \uBC30\uACBD\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uBCD1\uD569 \uCDA9\uB3CC\uC758 \uB4E4\uC5B4\uC624\uB294 \uCF58\uD150\uCE20 \uBC30\uACBD\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uBCD1\uD569 \uCDA9\uB3CC\uC758 \uACF5\uD1B5 \uC0C1\uC704 \uD5E4\uB354 \uBC30\uACBD\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uBCD1\uD569 \uCDA9\uB3CC\uC758 \uACF5\uD1B5 \uC0C1\uC704 \uCF58\uD150\uCE20 \uBC30\uACBD\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uBCD1\uD569 \uCDA9\uB3CC\uC5D0\uC11C \uD5E4\uB354 \uBC0F \uC2A4\uD50C\uB9AC\uD130\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uBCD1\uD569 \uCDA9\uB3CC\uC5D0\uC11C \uD604\uC7AC \uAC1C\uC694 \uB208\uAE08 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uBCD1\uD569 \uCDA9\uB3CC\uC5D0\uC11C \uC218\uC2E0 \uAC1C\uC694 \uB208\uAE08 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uBCD1\uD569 \uCDA9\uB3CC\uC5D0\uC11C \uACF5\uD1B5 \uACFC\uAC70 \uAC1C\uC694 \uB208\uAE08 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC120\uD0DD \uD56D\uBAA9\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC774 \uAC15\uC870 \uD45C\uC2DC\uB429\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC744 \uCC3E\uAE30 \uC704\uD55C \uBBF8\uB2C8\uB9F5 \uD45C\uC2DD \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC120\uD0DD\uC744 \uBC18\uBCF5\uD558\uAE30 \uC704\uD55C \uBBF8\uB2C8\uB9F5 \uD45C\uC2DD \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC120\uD0DD \uC791\uC5C5\uC744 \uC704\uD55C \uBBF8\uB2C8\uB9F5 \uB9C8\uCEE4 \uC0C9\uC785\uB2C8\uB2E4.","\uC815\uBCF4\uC5D0 \uB300\uD55C \uBBF8\uB2C8\uB9F5 \uB9C8\uCEE4 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uACBD\uACE0\uC758 \uBBF8\uB2C8\uB9F5 \uB9C8\uCEE4 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uC624\uB958\uC5D0 \uB300\uD55C \uBBF8\uB2C8\uB9F5 \uB9C8\uCEE4 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.",'\uBBF8\uB2C8\uB9F5\uC5D0\uC11C \uB80C\uB354\uB9C1\uB41C \uC804\uACBD \uC694\uC18C\uC758 \uBD88\uD22C\uBA85\uB3C4\uC785\uB2C8\uB2E4. \uC608\uB97C \uB4E4\uC5B4, "#000000c0"\uC740 \uBD88\uD22C\uBA85\uB3C4 75%\uB85C \uC694\uC18C\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4.',"\uBBF8\uB2C8\uB9F5 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0AC \uB54C \uBBF8\uB2C8\uB9F5 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD074\uB9AD\uD588\uC744 \uB54C \uBBF8\uB2C8\uB9F5 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBB38\uC81C \uC624\uB958 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC785\uB2C8\uB2E4.","\uBB38\uC81C \uACBD\uACE0 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC785\uB2C8\uB2E4.","\uBB38\uC81C \uC815\uBCF4 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC785\uB2C8\uB2E4.","\uCC28\uD2B8\uC5D0 \uC0AC\uC6A9\uB41C \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCC28\uD2B8 \uAC00\uB85C\uC904\uC5D0 \uC0AC\uC6A9\uB41C \uC0C9\uC785\uB2C8\uB2E4.","\uCC28\uD2B8 \uC2DC\uAC01\uD654\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uBE68\uAC04\uC0C9\uC785\uB2C8\uB2E4.","\uCC28\uD2B8 \uC2DC\uAC01\uD654\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uD30C\uB780\uC0C9\uC785\uB2C8\uB2E4.","\uCC28\uD2B8 \uC2DC\uAC01\uD654\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uB178\uB780\uC0C9\uC785\uB2C8\uB2E4.","\uCC28\uD2B8 \uC2DC\uAC01\uD654\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC8FC\uD669\uC0C9\uC785\uB2C8\uB2E4.","\uCC28\uD2B8 \uC2DC\uAC01\uD654\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uB179\uC0C9\uC785\uB2C8\uB2E4.","\uCC28\uD2B8 \uC2DC\uAC01\uD654\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC790\uC8FC\uC0C9\uC785\uB2C8\uB2E4."],"vs/platform/theme/common/iconRegistry":["\uC0AC\uC6A9\uD560 \uAE00\uAF34\uC758 ID\uC785\uB2C8\uB2E4. \uC124\uC815\uD558\uC9C0 \uC54A\uC73C\uBA74 \uCCAB \uBC88\uC9F8\uB85C \uC815\uC758\uD55C \uAE00\uAF34\uC774 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uC544\uC774\uCF58 \uC815\uC758\uC640 \uC5F0\uACB0\uB41C \uAE00\uAF34 \uBB38\uC790\uC785\uB2C8\uB2E4.","\uC704\uC82F\uC5D0\uC11C \uB2EB\uAE30 \uC791\uC5C5\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uC774\uC804 \uD3B8\uC9D1\uAE30 \uC704\uCE58\uB85C \uC774\uB3D9 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uB2E4\uC74C \uD3B8\uC9D1\uAE30 \uC704\uCE58\uB85C \uC774\uB3D9 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4."],"vs/platform/undoRedo/common/undoRedoService":["{0} \uD30C\uC77C\uC774 \uB2EB\uD788\uACE0 \uB514\uC2A4\uD06C\uC5D0\uC11C \uC218\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","{0} \uD30C\uC77C\uC740 \uD638\uD658\uB418\uC9C0 \uC54A\uB294 \uBC29\uC2DD\uC73C\uB85C \uC218\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. {1}","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. {1}","{1}\uC5D0 \uBCC0\uACBD \uB0B4\uC6A9\uC774 \uC801\uC6A9\uB418\uC5C8\uC73C\uBBC0\uB85C \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","{1}\uC5D0\uC11C \uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uC774\uBBF8 \uC2E4\uD589 \uC911\uC774\uBBC0\uB85C \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uADF8\uB3D9\uC548 \uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uBC1C\uC0DD\uD588\uAE30 \uB54C\uBB38\uC5D0 \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?","\uD30C\uC77C {0}\uAC1C\uC5D0\uC11C \uC2E4\uD589 \uCDE8\uC18C(&&U)","\uC774 \uD30C\uC77C \uC2E4\uD589 \uCDE8\uC18C(&&F)","\uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uC774\uBBF8 \uC2E4\uD589 \uC911\uC774\uBBC0\uB85C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","'{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?","\uC608(&&Y)","\uC544\uB2C8\uC694","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. {1}","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. {1}","{1}\uC5D0 \uBCC0\uACBD \uB0B4\uC6A9\uC774 \uC801\uC6A9\uB418\uC5C8\uC73C\uBBC0\uB85C \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","{1}\uC5D0\uC11C \uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uC774\uBBF8 \uC2E4\uD589 \uC911\uC774\uBBC0\uB85C \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uADF8\uB3D9\uC548 \uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uBC1C\uC0DD\uD588\uAE30 \uB54C\uBB38\uC5D0 \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uC774\uBBF8 \uC2E4\uD589 \uC911\uC774\uBBC0\uB85C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."],"vs/platform/workspace/common/workspace":["\uCF54\uB4DC \uC791\uC5C5 \uC601\uC5ED"]});
+
+//# sourceMappingURL=../../../min-maps/vs/editor/editor.main.nls.ko.js.map
\ No newline at end of file
diff --git a/public/vs/editor/editor.main.nls.ru.js b/public/vs/editor/editor.main.nls.ru.js
new file mode 100644
index 0000000..c03cf76
--- /dev/null
+++ b/public/vs/editor/editor.main.nls.ru.js
@@ -0,0 +1,15 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.ru",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["\u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435"],"vs/base/browser/ui/findinput/findInputToggles":["\u0421 \u0443\u0447\u0435\u0442\u043E\u043C \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430","\u0421\u043B\u043E\u0432\u043E \u0446\u0435\u043B\u0438\u043A\u043E\u043C","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u043E\u0435 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0435"],"vs/base/browser/ui/findinput/replaceInput":["\u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435","\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0440\u0435\u0433\u0438\u0441\u0442\u0440"],"vs/base/browser/ui/hover/hoverWidget":["\u041F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u044D\u0442\u043E\u0442 \u0430\u0441\u043F\u0435\u043A\u0442 \u0432 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u043C \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0438 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E {0}.",'\u041F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u044D\u0442\u043E\u0442 \u0430\u0441\u043F\u0435\u043A\u0442 \u0432 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0438 \u0441 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u043E\u0439 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0441 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u043E\u0439 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439", \u043A\u043E\u0442\u043E\u0440\u0443\u044E \u0432 \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0435\u0435 \u0432\u0440\u0435\u043C\u044F \u043D\u0435\u043B\u044C\u0437\u044F \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448.'],"vs/base/browser/ui/iconLabel/iconLabelHover":["\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430\u2026"],"vs/base/browser/ui/inputbox/inputBox":["\u041E\u0448\u0438\u0431\u043A\u0430: {0}","\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435: {0}","\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F: {0}"," \u0438\u043B\u0438 {0} \u0434\u043B\u044F \u0436\u0443\u0440\u043D\u0430\u043B\u0430"," ({0} \u0434\u043B\u044F \u0436\u0443\u0440\u043D\u0430\u043B\u0430)","\u041E\u0447\u0438\u0449\u0435\u043D\u043D\u044B\u0435 \u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\u0441\u0432\u043E\u0431\u043E\u0434\u043D\u044B\u0439"],"vs/base/browser/ui/selectBox/selectBoxCustom":["\u041F\u043E\u043B\u0435 \u0432\u044B\u0431\u043E\u0440\u0430"],"vs/base/browser/ui/toolbar/toolbar":["\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F..."],"vs/base/browser/ui/tree/abstractTree":["\u0424\u0438\u043B\u044C\u0442\u0440","\u041D\u0435\u0447\u0435\u0442\u043A\u043E\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442 \u0434\u043B\u044F \u0444\u0438\u043B\u044C\u0442\u0440\u0430","\u0412\u0432\u043E\u0434 \u0434\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430","\u0412\u0432\u043E\u0434 \u0434\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430","\u0417\u0430\u043A\u0440\u044B\u0442\u044C","\u042D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B."],"vs/base/common/actions":["(\u043F\u0443\u0441\u0442\u043E)"],"vs/base/common/errorMessage":["{0}: {1}","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 ({0})","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430. \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u044B\u0435 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0441\u043C. \u0432 \u0436\u0443\u0440\u043D\u0430\u043B\u0435.","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430. \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u044B\u0435 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0441\u043C. \u0432 \u0436\u0443\u0440\u043D\u0430\u043B\u0435.","{0} (\u0432\u0441\u0435\u0433\u043E \u043E\u0448\u0438\u0431\u043E\u043A: {1})","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430. \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u044B\u0435 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0441\u043C. \u0432 \u0436\u0443\u0440\u043D\u0430\u043B\u0435."],"vs/base/common/keybindingLabels":["CTRL","SHIFT","ALT","Windows","CTRL","SHIFT","ALT","Super","CTRL","SHIFT","\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440","\u041A\u043E\u043C\u0430\u043D\u0434\u0430","CTRL","SHIFT","ALT","Windows","CTRL","SHIFT","ALT","Super"],"vs/base/common/platform":["_"],"vs/editor/browser/controller/textAreaHandler":["\u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440","\u0421\u0435\u0439\u0447\u0430\u0441 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D.","{0} \u0427\u0442\u043E\u0431\u044B \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C \u0447\u0438\u0442\u0430\u0442\u0435\u043B\u044F, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 {1}",'{0} \u0427\u0442\u043E\u0431\u044B \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C \u0447\u0438\u0442\u0430\u0442\u0435\u043B\u044F, \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u0432\u044B\u0431\u043E\u0440 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E {1} \u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 "\u0410\u043A\u0442\u0438\u0432\u0430\u0446\u0438\u044F \u0440\u0435\u0436\u0438\u043C\u0430 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439 \u0434\u043B\u044F \u0447\u0438\u0442\u0430\u0442\u0435\u043B\u044F", \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0441\u0435\u0439\u0447\u0430\u0441 \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B.','{0} \u041D\u0430\u0437\u043D\u0430\u0447\u044C\u0442\u0435 \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448 \u0434\u043B\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u0410\u043A\u0442\u0438\u0432\u0430\u0446\u0438\u044F \u0440\u0435\u0436\u0438\u043C\u0430 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439 \u0434\u043B\u044F \u0447\u0438\u0442\u0430\u0442\u0435\u043B\u044F", \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u044B\u0445 \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0439 \u043A\u043B\u0430\u0432\u0438\u0448 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E {1} \u0438 \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0435 \u0435\u0433\u043E.'],"vs/editor/browser/coreCommands":["\u0420\u0430\u0437\u043C\u0435\u0449\u0430\u0442\u044C \u043D\u0430 \u043A\u043E\u043D\u0446\u0435 \u0434\u0430\u0436\u0435 \u0434\u043B\u044F \u0431\u043E\u043B\u0435\u0435 \u0434\u043B\u0438\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A","\u0420\u0430\u0437\u043C\u0435\u0449\u0430\u0442\u044C \u043D\u0430 \u043A\u043E\u043D\u0446\u0435 \u0434\u0430\u0436\u0435 \u0434\u043B\u044F \u0431\u043E\u043B\u0435\u0435 \u0434\u043B\u0438\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A","\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u043A\u0443\u0440\u0441\u043E\u0440\u044B \u0443\u0434\u0430\u043B\u0435\u043D\u044B."],"vs/editor/browser/editorExtensions":["&&\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C","\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C","&&\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C","\u0412\u0435\u0440\u043D\u0443\u0442\u044C","&&\u0412\u044B\u0434\u0435\u043B\u0438\u0442\u044C \u0432\u0441\u0435","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u0441\u0435"],"vs/editor/browser/widget/codeEditorWidget":["\u0427\u0438\u0441\u043B\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u043E {0}. \u0414\u043B\u044F \u043F\u0440\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u043A\u0440\u0443\u043F\u043D\u044B\u0445 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439 \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C [\u043F\u043E\u0438\u0441\u043A \u0438 \u0437\u0430\u043C\u0435\u043D\u0443](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) \u0438\u043B\u0438 \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u044F \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u044F \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432"],"vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer":['\u0417\u043D\u0430\u0447\u043E\u043A "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C" \u0432 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0441 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u043E\u0439 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430 \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u0439','\u0417\u043D\u0430\u0447\u043E\u043A "\u0423\u0434\u0430\u043B\u0438\u0442\u044C" \u0432 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0441 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u043E\u0439 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430 \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u0439','\u0417\u043D\u0430\u0447\u043E\u043A "\u0417\u0430\u043A\u0440\u044B\u0442\u044C" \u0432 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0441 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u043E\u0439 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430 \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u0439',"\u0417\u0430\u043A\u0440\u044B\u0442\u044C","\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430 \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044F. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 \u0421\u0422\u0420\u0415\u041B\u041A\u0410 \u0412\u0412\u0415\u0420\u0425 \u0438 \u0421\u0422\u0420\u0415\u041B\u041A\u0410 \u0412\u041D\u0418\u0417 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u044F.","\u043D\u0435\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A","1 \u0441\u0442\u0440\u043E\u043A\u0430 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0430","\u0421\u0442\u0440\u043E\u043A \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043E: {0}","\u0420\u0430\u0437\u043B\u0438\u0447\u0438\u0435 {0} \u0438\u0437 {1}: \u0438\u0441\u0445\u043E\u0434\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {2}, {3}, \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {4}, {5}","\u043F\u0443\u0441\u0442\u043E\u0439","{0} \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {1}","{0} \u0438\u0441\u0445\u043E\u0434\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {1} \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {2}","+ {0} \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {1}","- {0} \u0438\u0441\u0445\u043E\u0434\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {1}"],"vs/editor/browser/widget/diffEditor/components/diffEditorEditors":[" \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 {0}, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u043F\u0440\u0430\u0432\u043A\u0443 \u043F\u043E \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u043C \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044F\u043C."],"vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin":["\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 ({0})","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 ({0})","\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u044D\u0442\u043E \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435"],"vs/editor/browser/widget/diffEditor/diffEditor.contribution":["\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0435 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u043D\u043E\u043C \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0435","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u043D\u044B\u0435 \u0431\u043B\u043E\u043A\u0438 \u043A\u043E\u0434\u0430","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439","\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0435 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u0439","\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0441 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u043E\u0439 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430 \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u0439","\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0430\u0442\u0435\u043B\u044C \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0445 \u0440\u0435\u0433\u0438\u043E\u043D\u043E\u0432","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0438\u043B\u0438 \u0441\u043A\u0440\u044B\u0442\u044C \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u043D\u044B\u0435 \u0431\u043B\u043E\u043A\u0438 \u043A\u043E\u0434\u0430",'\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0430\u0442\u0435\u043B\u044C "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0435 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u043D\u043E\u043C \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0435"',"\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0441\u0442\u043E\u0440\u043E\u043D\u0443","\u0412\u044B\u0439\u0442\u0438 \u0438\u0437 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u044F \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044F","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435 \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0435 \u043E\u0431\u043B\u0430\u0441\u0442\u0438","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432\u0441\u0435 \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0435 \u043E\u0431\u043B\u0430\u0441\u0442\u0438","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u044E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u044E"],"vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature":["\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0443\u044E \u043E\u0431\u043B\u0430\u0441\u0442\u044C","\u0429\u0435\u043B\u043A\u043D\u0438\u0442\u0435 \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u0435 \u0432\u044B\u0448\u0435","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0439 \u0440\u0435\u0433\u0438\u043E\u043D","\u0429\u0435\u043B\u043A\u043D\u0438\u0442\u0435 \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0438\u0436\u0435","\u0421\u043A\u0440\u044B\u0442\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 ({0})","\u0414\u0432\u0430\u0436\u0434\u044B \u0449\u0435\u043B\u043A\u043D\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C"],"vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature":["\u041A\u043E\u0434 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D \u0441 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F\u043C\u0438 \u0432 \u0441\u0442\u0440\u043E\u043A\u0443 {0}-{1}","\u041A\u043E\u0434 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D \u0441 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F\u043C\u0438 \u0438\u0437 \u0441\u0442\u0440\u043E\u043A\u0438 {0}-{1}","\u041A\u043E\u0434 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D \u0432 \u0441\u0442\u0440\u043E\u043A\u0443 {0}-{1}","\u041A\u043E\u0434 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D \u0438\u0437 \u0441\u0442\u0440\u043E\u043A\u0438 {0}-{1}"],"vs/editor/browser/widget/diffEditor/features/revertButtonsFeature":["\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F","\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435"],"vs/editor/browser/widget/diffEditor/registrations.contribution":["\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430, \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u043D\u043E\u0433\u043E \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0439 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430, \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u043D\u043E\u0433\u043E \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043D\u0438 \u0432\u043E\u043A\u0440\u0443\u0433 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0445 \u043E\u0431\u043B\u0430\u0441\u0442\u0435\u0439.","\u041E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u041E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0434\u043B\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439."],"vs/editor/browser/widget/hoverWidget/hoverWidget":["\u0423\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0439\u0442\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0443 {0}\u0447\u0442\u043E\u0431\u044B \u043D\u0430\u0432\u0435\u0441\u0442\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C \u043C\u044B\u0448\u0438"],"vs/editor/browser/widget/multiDiffEditorWidget/colors":["\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u0439","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0444\u0430\u0439\u043B\u043E\u0432","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u0439 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0444\u0430\u0439\u043B\u043E\u0432"],"vs/editor/common/config/editorConfigurationSchema":["\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440","\u0427\u0438\u0441\u043B\u043E \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432, \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0435\u0435 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438. \u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430, \u0435\u0441\u043B\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 {0}.",'\u0427\u0438\u0441\u043B\u043E \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u0430, \u043B\u0438\u0431\u043E `"tabSize"` \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0438\u0437 "#editor.tabSize#". \u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430, \u0435\u0441\u043B\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 "#editor.detectIndentation#".',"\u0412\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u043F\u0440\u043E\u0431\u0435\u043B\u044B \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB. \u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430, \u0435\u0441\u043B\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 {0}.","\u041D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0443\u0442 \u043B\u0438 {0} \u0438 {1} \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u044B \u043F\u0440\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u0438 \u0444\u0430\u0439\u043B\u0430.","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u043C\u044B\u0439 \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0439 \u043F\u0440\u043E\u0431\u0435\u043B.","\u0421\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u0434\u043B\u044F \u0431\u043E\u043B\u044C\u0448\u0438\u0445 \u0444\u0430\u0439\u043B\u043E\u0432 \u0441 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435\u043C \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0444\u0443\u043D\u043A\u0446\u0438\u0439, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0438\u043D\u0442\u0435\u043D\u0441\u0438\u0432\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442 \u043F\u0430\u043C\u044F\u0442\u044C.","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043B\u043E\u0432.","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u043E\u0432 \u0442\u043E\u043B\u044C\u043A\u043E \u0438\u0437 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430.","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u043E\u0432 \u0438\u0437 \u0432\u0441\u0435\u0445 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0445 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0430 \u043E\u0434\u043D\u043E\u043C \u044F\u0437\u044B\u043A\u0435.","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u043E\u0432 \u0438\u0437 \u0432\u0441\u0435\u0445 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0445 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0432\u044B\u0447\u0438\u0441\u043B\u044F\u0442\u044C \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043B\u043E\u0432 \u0432 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0435 \u0438 \u0438\u0437 \u043A\u0430\u043A\u0438\u0445 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043E\u043D\u0438 \u0432\u044B\u0447\u0438\u0441\u043B\u044F\u044E\u0442\u0441\u044F.","\u0421\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0446\u0432\u0435\u0442\u043E\u0432\u044B\u0445 \u0442\u0435\u043C.","\u0421\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0446\u0432\u0435\u0442\u043E\u0432\u044B\u0445 \u0442\u0435\u043C.",'\u0421\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 "semanticHighlighting" \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0446\u0432\u0435\u0442\u043E\u0432\u043E\u0439 \u0442\u0435\u043C\u044B.',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043F\u043E\u043A\u0430\u0437 \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0439 \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0438 \u0434\u043B\u044F \u044F\u0437\u044B\u043A\u043E\u0432, \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0449\u0438\u0445 \u0435\u0435.","\u041E\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u0434\u0430\u0436\u0435 \u043F\u0440\u0438 \u0434\u0432\u043E\u0439\u043D\u043E\u043C \u0449\u0435\u043B\u0447\u043A\u0435 \u043F\u043E \u0435\u0433\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u043C\u0443 \u0438 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 ESC.","\u0421\u0442\u0440\u043E\u043A\u0438, \u0434\u043B\u0438\u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043F\u0440\u0435\u0432\u044B\u0448\u0430\u0435\u0442 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435, \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043C\u0435\u0447\u0435\u043D\u044B \u0438\u0437 \u0441\u043E\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u0430 \u043B\u0438 \u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0430 \u043F\u0440\u043E\u0438\u0441\u0445\u043E\u0434\u0438\u0442\u044C \u0430\u0441\u0438\u043D\u0445\u0440\u043E\u043D\u043D\u043E \u0432 \u0440\u0430\u0431\u043E\u0447\u0435\u0439 \u0440\u043E\u043B\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0430\u0441\u0438\u043D\u0445\u0440\u043E\u043D\u043D\u0443\u044E \u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0443. \u0422\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u043E\u0442\u043B\u0430\u0434\u043A\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u0430 \u043B\u0438 \u0430\u0441\u0438\u043D\u0445\u0440\u043E\u043D\u043D\u0430\u044F \u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C\u0441\u044F \u043F\u043E \u043E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u044E \u043A \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0439 \u0444\u043E\u043D\u043E\u0432\u043E\u0439 \u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0435. \u041C\u043E\u0436\u0435\u0442 \u0437\u0430\u043C\u0435\u0434\u043B\u0438\u0442\u044C \u0440\u0430\u0437\u043C\u0435\u0442\u043A\u0443. \u0422\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u043E\u0442\u043B\u0430\u0434\u043A\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0441\u043A\u043E\u0431\u043E\u043A, \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u044E\u0449\u0438\u0435 \u0438\u043B\u0438 \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u044E\u0449\u0438\u0435 \u043E\u0442\u0441\u0442\u0443\u043F.","\u041E\u0442\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0439 \u0441\u0438\u043C\u0432\u043E\u043B \u0441\u043A\u043E\u0431\u043A\u0438 \u0438\u043B\u0438 \u0441\u0442\u0440\u043E\u043A\u043E\u0432\u0430\u044F \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C.","\u0417\u0430\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0439 \u0441\u0438\u043C\u0432\u043E\u043B \u0441\u043A\u043E\u0431\u043A\u0438 \u0438\u043B\u0438 \u0441\u0442\u0440\u043E\u043A\u043E\u0432\u0430\u044F \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043F\u0430\u0440\u044B \u0441\u043A\u043E\u0431\u043E\u043A, \u0446\u0432\u0435\u0442 \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0438\u0445 \u0443\u0440\u043E\u0432\u043D\u044F \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u044F, \u0435\u0441\u043B\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430 \u043E\u043F\u0446\u0438\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0446\u0432\u0435\u0442\u043E\u043C.","\u041E\u0442\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0439 \u0441\u0438\u043C\u0432\u043E\u043B \u0441\u043A\u043E\u0431\u043A\u0438 \u0438\u043B\u0438 \u0441\u0442\u0440\u043E\u043A\u043E\u0432\u0430\u044F \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C.","\u0417\u0430\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0439 \u0441\u0438\u043C\u0432\u043E\u043B \u0441\u043A\u043E\u0431\u043A\u0438 \u0438\u043B\u0438 \u0441\u0442\u0440\u043E\u043A\u043E\u0432\u0430\u044F \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C.","\u0412\u0440\u0435\u043C\u044F \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u0432 \u043C\u0438\u043B\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434\u0430\u0445, \u043F\u043E \u0438\u0441\u0442\u0435\u0447\u0435\u043D\u0438\u0438 \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043E\u0442\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F. \u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 0, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u0440\u0435\u043C\u044F \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F.","\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0444\u0430\u0439\u043B\u0430 \u0432 \u041C\u0411 \u0434\u043B\u044F \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u0439. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 0 \u0431\u0435\u0437 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u0430\u043A \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043E\u0442\u043B\u0438\u0447\u0438\u044F: \u0440\u044F\u0434\u043E\u043C \u0438\u043B\u0438 \u0432 \u0442\u0435\u043A\u0441\u0442\u0435.","\u0415\u0441\u043B\u0438 \u0448\u0438\u0440\u0438\u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043C\u0435\u043D\u044C\u0448\u0435 \u044D\u0442\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0435 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0435.","\u0415\u0441\u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D \u0438 \u0448\u0438\u0440\u0438\u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u0430\u043B\u0430, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0435 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0435.","\u0415\u0441\u043B\u0438 \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043D\u0430 \u043F\u043E\u043B\u0435 \u0433\u043B\u0438\u0444\u0430 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0441\u0442\u0440\u0435\u043B\u043A\u0438 \u0434\u043B\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439.","\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0438\u043B\u0438 \u043A\u043E\u043D\u0435\u0447\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0431\u0435\u043B\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0438\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440\u044B +/- \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0445 \u0438\u043B\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0445 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 CodeLens \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0421\u0442\u0440\u043E\u043A\u0438 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043D\u0438\u043A\u043E\u0433\u0434\u0430.","\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043F\u043E \u0448\u0438\u0440\u0438\u043D\u0435 \u043E\u043A\u043D\u0430 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430.","\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u0432 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u043E\u0439 {0}.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044F.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u0439 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044F.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0435 \u043E\u0431\u043B\u0430\u0441\u0442\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0440\u043E\u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0434\u043B\u044F \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0445 \u043E\u0431\u043B\u0430\u0441\u0442\u0435\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0440\u043E\u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0432 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0445 \u043E\u0431\u043B\u0430\u0441\u0442\u0435\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0440\u043E\u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0432 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430 \u043F\u0440\u0438 \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u0438 \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0445 \u043E\u0431\u043B\u0430\u0441\u0442\u0435\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043D\u044B\u0435 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u044F \u043A\u043E\u0434\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043F\u0443\u0441\u0442\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F, \u0447\u0442\u043E\u0431\u044B \u0443\u0432\u0438\u0434\u0435\u0442\u044C, \u0433\u0434\u0435 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u044B \u0438\u043B\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u044B \u0441\u0438\u043C\u0432\u043E\u043B\u044B."],"vs/editor/common/config/editorOptions":["\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C API-\u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044B \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u044B, \u0447\u0442\u043E\u0431\u044B \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0442\u044C, \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u043B\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430.","\u041E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0441\u043E \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430.","\u041F\u0440\u0435\u0434\u043F\u043E\u043B\u0430\u0433\u0430\u0442\u044C, \u0447\u0442\u043E \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430 \u043D\u0435 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043E.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043B\u044F \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043F\u0440\u043E\u0431\u0435\u043B \u043F\u0440\u0438 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u043F\u0443\u0441\u0442\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F, \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0438\u043B\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432 \u043A \u0441\u0442\u0440\u043E\u043A\u0430\u043C.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043A\u043E\u043F\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u0442\u0435\u043A\u0443\u0449\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u043F\u0440\u0438 \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0438 \u0431\u0435\u0437 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u043A\u0443\u0440\u0441\u043E\u0440 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435.","\u041D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u044B\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0432 \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u043E\u0438\u0441\u043A\u0430 \u0438\u0437 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0412\u0441\u0435\u0433\u0434\u0430 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u044B\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0432 \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u043E\u0438\u0441\u043A\u0430 \u0438\u0437 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0432\u043A\u043B\u044E\u0447\u0430\u044F \u0441\u043B\u043E\u0432\u0430 \u0432 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0412\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u044B\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0432 \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u043E\u0438\u0441\u043A\u0430 \u0442\u043E\u043B\u044C\u043A\u043E \u0438\u0437 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043C\u043E\u0436\u043D\u043E \u043B\u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0438\u0437 \u0442\u0435\u043A\u0441\u0442\u0430, \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u041D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u0432\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u0444\u0443\u043D\u043A\u0446\u0438\u044E \xAB\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438\xBB \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E).","\u0412\u0441\u0435\u0433\u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u0444\u0443\u043D\u043A\u0446\u0438\u044E \xAB\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438\xBB \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.","\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0438 \xAB\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438\xBB \u043F\u0440\u0438 \u0432\u044B\u0431\u043E\u0440\u0435 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0441\u0442\u0440\u043E\u043A \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0443\u0441\u043B\u043E\u0432\u0438\u0435\u043C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0444\u0443\u043D\u043A\u0446\u0438\u0438 \xAB\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438\xBB.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u043E \u043B\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0441\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u0438\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u044F\u0442\u044C \u043E\u0431\u0449\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 macOS.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u043E \u043B\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0442\u044C \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u043D\u0430\u0447\u0430\u043B\u0435 \u043E\u043A\u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u0415\u0441\u043B\u0438 \u0437\u0430\u0434\u0430\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 true, \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u044C \u043F\u0435\u0440\u0432\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u0440\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u043E\u043C \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u043F\u043E\u0438\u0441\u043A \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0442\u044C\u0441\u044F \u0441 \u043D\u0430\u0447\u0430\u043B\u0430 (\u0438\u043B\u0438 \u0441 \u043A\u043E\u043D\u0446\u0430), \u0435\u0441\u043B\u0438 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043D\u0438\u043A\u0430\u043A\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439.",'\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u043B\u0438\u0433\u0430\u0442\u0443\u0440\u044B \u0448\u0440\u0438\u0444\u0442\u043E\u0432 (\u0445\u0430\u0440\u0430\u043A\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043A\u0438 \u0448\u0440\u0438\u0444\u0442\u0430 "calt" \u0438 "liga"). \u0418\u0437\u043C\u0435\u043D\u0438\u0442\u0435 \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443 \u0434\u043B\u044F \u0434\u0435\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E\u043C CSS "font-feature-settings".','\u042F\u0432\u043D\u043E\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E CSS "font-feature-settings". \u0415\u0441\u043B\u0438 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0442\u043E\u043B\u044C\u043A\u043E \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043B\u0438\u0433\u0430\u0442\u0443\u0440\u044B, \u0432\u043C\u0435\u0441\u0442\u043E \u043D\u0435\u0433\u043E \u043C\u043E\u0436\u043D\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435.','\u041D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043B\u0438\u0433\u0430\u0442\u0443\u0440\u044B \u0438\u043B\u0438 \u0445\u0430\u0440\u0430\u043A\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043A\u0438 \u0448\u0440\u0438\u0444\u0442\u0430. \u041C\u043E\u0436\u043D\u043E \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435, \u0447\u0442\u043E\u0431\u044B \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043B\u0438\u0433\u0430\u0442\u0443\u0440\u044B, \u0438\u043B\u0438 \u0441\u0442\u0440\u043E\u043A\u0443 \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430 CSS "font-feature-settings".',"\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u043F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u0435 \u0438\u0437 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 font-weight \u0432 font-variation-settings. \u0418\u0437\u043C\u0435\u043D\u0438\u0442\u0435 \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443 \u0434\u043B\u044F \u0434\u0435\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E\u043C CSS font-variation-settings.","\u042F\u0432\u043D\u043E\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E CSS font-variation-settings. \u0415\u0441\u043B\u0438 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u043B\u0438\u0448\u044C \u043F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 font-weight \u0432 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 font-variation-settings, \u0432\u043C\u0435\u0441\u0442\u043E \u044D\u0442\u043E\u0433\u043E \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u043C\u043E\u0436\u043D\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435.","\u041D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B \u0448\u0440\u0438\u0444\u0442\u043E\u0432. \u041C\u043E\u0436\u0435\u0442 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u0441\u043E\u0431\u043E\u0439 \u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0434\u043B\u044F \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0438\u0437 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 font-weight \u0432 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 font-variation-settings \u0438\u043B\u0438 \u0441\u0442\u0440\u043E\u043A\u0443, \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430 CSS font-variation-settings.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445.",'\u0414\u043E\u043F\u0443\u0441\u043A\u0430\u044E\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 \u0441\u043B\u043E\u0432\u0430 "normal" \u0438\u043B\u0438 "bold" \u0438 \u0447\u0438\u0441\u043B\u0430 \u0432 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0435 \u043E\u0442 1 \u0434\u043E 1000.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043D\u0430\u0441\u044B\u0449\u0435\u043D\u043D\u043E\u0441\u0442\u044C\u044E \u0448\u0440\u0438\u0444\u0442\u0430. \u0414\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F: \u043A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 \u0441\u043B\u043E\u0432\u0430 "normal" \u0438\u043B\u0438 "bold", \u0430 \u0442\u0430\u043A\u0436\u0435 \u0447\u0438\u0441\u043B\u0430 \u0432 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0435 \u043E\u0442 1 \u0434\u043E 1000.',"\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E)","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u043C\u0443 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0443 \u0438 \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u043C\u0443 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0443 \u0438 \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0431\u044B\u0441\u0442\u0440\u0443\u044E \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044E \u0434\u043B\u044F \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u0445","\u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0443\u0441\u0442\u0430\u0440\u0435\u043B. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u043D\u0435\u0433\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, 'editor.editor.gotoLocation.multipleDefinitions' \u0438\u043B\u0438 'editor.editor.gotoLocation.multipleImplementations'.",'\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0442\u0438\u043F\u0430" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044E" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u043C" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0441\u044B\u043B\u043A\u0430\u043C" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u043E\u0439 \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u043A\u043E\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0442\u0438\u043F\u0430" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u043E\u0439 \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u043A\u043E\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044E" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u043E\u0439, \u043A\u043E\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u043E\u0439 \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u043A\u043E\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0441\u044B\u043B\u043A\u0435" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0432\u0440\u0435\u043C\u044F \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0438 \u0432 \u043C\u0438\u043B\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434\u0430\u0445 \u043F\u0435\u0440\u0435\u0434 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u044F.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0434\u043E\u043B\u0436\u043D\u043E \u043B\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u043E\u0441\u0442\u0430\u0432\u0430\u0442\u044C\u0441\u044F \u0432\u0438\u0434\u0438\u043C\u044B\u043C \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043D\u0430 \u043D\u0435\u0433\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0432\u0440\u0435\u043C\u044F \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0438 \u0432 \u043C\u0438\u043B\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434\u0430\u0445 \u043F\u0435\u0440\u0435\u0434 \u0441\u043A\u0440\u044B\u0442\u0438\u0435\u043C \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u044F. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C "editor.hover.sticky".',"\u041F\u0440\u0435\u0434\u043F\u043E\u0447\u0438\u0442\u0430\u0442\u044C \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u043D\u0430\u0434 \u0441\u0442\u0440\u043E\u043A\u043E\u0439, \u0435\u0441\u043B\u0438 \u0435\u0441\u0442\u044C \u043C\u0435\u0441\u0442\u043E.","\u041F\u0440\u0435\u0434\u043F\u043E\u043B\u0430\u0433\u0430\u0435\u0442, \u0447\u0442\u043E \u0432\u0441\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0438\u043C\u0435\u044E\u0442 \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u0443\u044E \u0448\u0438\u0440\u0438\u043D\u0443. \u042D\u0442\u043E \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E \u0434\u043B\u044F \u043C\u043E\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0445 \u0448\u0440\u0438\u0444\u0442\u043E\u0432 \u0438 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0441\u043A\u0440\u0438\u043F\u0442\u043E\u0432 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043B\u0430\u0442\u0438\u043D\u0441\u043A\u0438\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432), \u0433\u0434\u0435 \u0433\u043B\u0438\u0444\u044B \u0438\u043C\u0435\u044E\u0442 \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u0443\u044E \u0448\u0438\u0440\u0438\u043D\u0443.","\u0414\u0435\u043B\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u0435 \u0442\u043E\u0447\u0435\u043A \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443. \u042D\u0442\u043E \u043C\u0435\u0434\u043B\u0435\u043D\u043D\u044B\u0439 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043C\u043E\u0436\u0435\u0442 \u043F\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043A \u0437\u0430\u0432\u0438\u0441\u0430\u043D\u0438\u044F\u043C \u043F\u0440\u0438 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0435 \u0431\u043E\u043B\u044C\u0448\u0438\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u043D\u043E \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E \u0432\u043E \u0432\u0441\u0435\u0445 \u0441\u043B\u0443\u0447\u0430\u044F\u0445.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u043E\u043C, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u044B\u0447\u0438\u0441\u043B\u044F\u0435\u0442 \u0442\u043E\u0447\u043A\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0430. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435, \u0447\u0442\u043E \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u0439 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C, \u0447\u0442\u043E\u0431\u044B \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0442\u044C \u043D\u0430\u0438\u0431\u043E\u043B\u044C\u0448\u0435\u0435 \u0443\u0434\u043E\u0431\u0441\u0442\u0432\u043E \u0440\u0430\u0431\u043E\u0442\u044B.","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043C\u0435\u043D\u044E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043A\u043E\u0434\u0430.","\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043C\u0435\u043D\u044E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043A\u043E\u0434\u0430, \u0435\u0441\u043B\u0438 \u043A\u0443\u0440\u0441\u043E\u0440 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u043E\u043A\u0430\u0445 \u0441 \u043A\u043E\u0434\u043E\u043C.","\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043C\u0435\u043D\u044E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043A\u043E\u0434\u0430, \u0435\u0441\u043B\u0438 \u043A\u0443\u0440\u0441\u043E\u0440 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0430\u0445 \u0441 \u043A\u043E\u0434\u043E\u043C \u0438\u043B\u0438 \u043D\u0430 \u043F\u0443\u0441\u0442\u044B\u0445 \u0441\u0442\u0440\u043E\u043A\u0430\u0445.","\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0437\u043D\u0430\u0447\u043E\u043A \u043B\u0430\u043C\u043F\u043E\u0447\u043A\u0438 \u0434\u043B\u044F \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u0442\u0435\u043A\u0443\u0449\u0438\u0435 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0432 \u0432\u0435\u0440\u0445\u043D\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u0447\u0438\u0441\u043B\u043E \u0437\u0430\u043B\u0438\u043F\u0430\u044E\u0449\u0438\u0445 \u043B\u0438\u043D\u0438\u0439 \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043C\u043E\u0434\u0435\u043B\u044C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u0443\u044E \u0434\u043B\u044F \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A \u0437\u0430\u043B\u0438\u043F\u0430\u043D\u0438\u044F. \u0415\u0441\u043B\u0438 \u043C\u043E\u0434\u0435\u043B\u044C \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u044B \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043E\u043D\u0430 \u043E\u0442\u043A\u0430\u0442\u0438\u0442\u0441\u044F \u043A \u043C\u043E\u0434\u0435\u043B\u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A\u0430 \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u043E\u0442\u043A\u0430\u0442\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u043A \u043C\u043E\u0434\u0435\u043B\u0438 \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432. \u042D\u0442\u043E\u0442 \u043F\u043E\u0440\u044F\u0434\u043E\u043A \u0441\u043E\u0431\u043B\u044E\u0434\u0430\u0435\u0442\u0441\u044F \u0432\u043E \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0445 \u0441\u043B\u0443\u0447\u0430\u044F\u0445.","\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0443 Sticky Scroll \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u043E\u0439 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0412\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u044B.","\u0412\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0438 \u0441\u043A\u0440\u044B\u0432\u0430\u044E\u0442\u0441\u044F \u0443\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0435\u043C \u043A\u043B\u0430\u0432\u0438\u0448 {0}.","\u0412\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0441\u043A\u0440\u044B\u0442\u044B \u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0438 \u0443\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0438 {0}.","\u0412\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u044B.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0440\u0430\u0437\u043C\u0435\u0440\u043E\u043C \u0448\u0440\u0438\u0444\u0442\u0430 \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0445 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E {0} \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F, \u043A\u043E\u0433\u0434\u0430 \u0441\u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 {1} \u0438\u043B\u0438 \u0431\u043E\u043B\u044C\u0448\u0435 \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u0448\u0440\u0438\u0444\u0442\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0435\u043C\u0435\u0439\u0441\u0442\u0432\u043E\u043C \u0448\u0440\u0438\u0444\u0442\u043E\u0432 \u0434\u043B\u044F \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0445 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0415\u0441\u043B\u0438 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043D\u0435 \u0437\u0430\u0434\u0430\u043D\u043E, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F {0}.","\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u043F\u043E\u043B\u044F \u0432\u043E\u043A\u0440\u0443\u0433 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.",`\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0432\u044B\u0441\u043E\u0442\u0443 \u0441\u0442\u0440\u043E\u043A\u0438. \r
+\u2013 \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 0, \u0447\u0442\u043E\u0431\u044B \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0432\u044B\u0447\u0438\u0441\u043B\u0438\u0442\u044C \u0432\u044B\u0441\u043E\u0442\u0443 \u0441\u0442\u0440\u043E\u043A\u0438 \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u0448\u0440\u0438\u0444\u0442\u0430.\r
+\u2013 \u0417\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u043E\u0442 0 \u0434\u043E 8 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0432 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044F \u0434\u043B\u044F \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u0448\u0440\u0438\u0444\u0442\u0430.\r
+\u2013 \u0417\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0431\u043E\u043B\u044C\u0448\u0435 \u0438\u043B\u0438 \u0440\u0430\u0432\u043D\u044B\u0435 8 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0432 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0445 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439.`,"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043A\u0440\u044B\u0442\u0430 \u043B\u0438 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.","\u041C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430 \u0438\u043C\u0435\u0435\u0442 \u0442\u0430\u043A\u043E\u0439 \u0436\u0435 \u0440\u0430\u0437\u043C\u0435\u0440, \u0447\u0442\u043E \u0438 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430).","\u041C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0442\u044F\u0433\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u0438\u043B\u0438 \u0441\u0436\u0438\u043C\u0430\u0442\u044C\u0441\u044F \u043F\u043E \u043C\u0435\u0440\u0435 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438, \u0447\u0442\u043E\u0431\u044B \u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043F\u043E \u0432\u044B\u0441\u043E\u0442\u0435 (\u0431\u0435\u0437 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438).","\u041C\u0438\u043D\u0438\u043A\u0430\u0440\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u0442\u044C\u0441\u044F \u043F\u043E \u043C\u0435\u0440\u0435 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438, \u0447\u0442\u043E\u0431\u044B \u043D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u0431\u044B\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u0435, \u0447\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 (\u0431\u0435\u0437 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438).","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0440\u0430\u0437\u043C\u0435\u0440\u043E\u043C \u043C\u0438\u043D\u0438\u043A\u0430\u0440\u0442\u044B.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441 \u043A\u0430\u043A\u043E\u0439 \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u043E\u0433\u0434\u0430 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043F\u043E\u043B\u0437\u0443\u043D\u043E\u043A \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B.","\u041C\u0430\u0441\u0448\u0442\u0430\u0431 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E, \u043D\u0430\u0440\u0438\u0441\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u043D\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0435: 1, 2 \u0438\u043B\u0438 3.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0444\u0430\u043A\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u0446\u0432\u0435\u0442\u043D\u044B\u0445 \u0431\u043B\u043E\u043A\u043E\u0432.","\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0438\u0440\u0438\u043D\u0443 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B, \u0447\u0442\u043E\u0431\u044B \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u044B\u0445 \u0441\u0442\u043E\u043B\u0431\u0446\u043E\u0432 \u043D\u0435 \u043F\u0440\u0435\u0432\u044B\u0448\u0430\u043B\u043E \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E.","\u0417\u0430\u0434\u0430\u0435\u0442 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u043C\u0435\u0436\u0434\u0443 \u0432\u0435\u0440\u0445\u043D\u0438\u043C \u043A\u0440\u0430\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0438 \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439.","\u0417\u0430\u0434\u0430\u0435\u0442 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u043C\u0435\u0436\u0434\u0443 \u043D\u0438\u0436\u043D\u0438\u043C \u043A\u0440\u0430\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0438 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439.","\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0432\u0441\u043F\u043B\u044B\u0432\u0430\u044E\u0449\u0435\u0435 \u043E\u043A\u043D\u043E \u0441 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0435\u0439 \u043F\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0443 \u0438 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F\u043C\u0438 \u043E \u0442\u0438\u043F\u0435, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043D\u0430\u0431\u043E\u0440\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043C\u0435\u043D\u044E \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A \u043E\u0441\u0442\u0430\u0435\u0442\u0441\u044F \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u0438\u043B\u0438 \u0437\u0430\u043A\u0440\u043E\u0435\u0442\u0441\u044F \u043F\u0440\u0438 \u0434\u043E\u0441\u0442\u0438\u0436\u0435\u043D\u0438\u0438 \u043A\u043E\u043D\u0446\u0430 \u0441\u043F\u0438\u0441\u043A\u0430.","\u042D\u043A\u0441\u043F\u0440\u0435\u0441\u0441-\u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0430\u0446\u0438\u0439","\u042D\u043A\u0441\u043F\u0440\u0435\u0441\u0441-\u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043A\u0430\u043A \u0435\u0434\u0432\u0430 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u043C\u044B\u0439 \u0442\u0435\u043A\u0441\u0442","\u042D\u043A\u0441\u043F\u0440\u0435\u0441\u0441-\u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u044B","\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u043A\u0440\u0430\u0442\u043A\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0432 \u0441\u0442\u0440\u043E\u043A\u0430\u0445.","\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u043A\u0440\u0430\u0442\u043A\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0432 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u044F\u0445.","\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u043A\u0440\u0430\u0442\u043A\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0432\u043D\u0435 \u0441\u0442\u0440\u043E\u043A \u0438 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435. \u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043C\u043E\u0436\u043D\u043E \u0432\u044B\u0431\u0440\u0430\u0442\u044C \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u043F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u0439, \u0441\u0442\u0440\u043E\u043A \u0438 \u0434\u0440\u0443\u0433\u043E\u0433\u043E \u043A\u043E\u0434\u0430. \u0411\u044B\u0441\u0442\u0440\u044B\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043C\u043E\u0436\u043D\u043E \u043D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0432 \u0432\u0438\u0434\u0435 \u0444\u0430\u043D\u0442\u043E\u043C\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430 \u0438\u043B\u0438 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439. \u041D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0442\u0430\u043A\u0436\u0435 \u043F\u043E\u043C\u043D\u0438\u0442\u044C \u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0435 {0}, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0443\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438.","\u041D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A \u043D\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0430\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u044B\u0435 \u043D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u044B\u0435 \u043D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A \u0432\u044B\u0447\u0438\u0441\u043B\u044F\u044E\u0442\u0441\u044F \u043A\u0430\u043A \u0440\u0430\u0441\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0432 \u0441\u0442\u0440\u043E\u043A\u0430\u0445 \u0434\u043E \u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u041D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043A\u0430\u0436\u0434\u044B\u0435 10 \u0441\u0442\u0440\u043E\u043A.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u043D\u043E\u043C\u0435\u0440\u043E\u0432 \u0441\u0442\u0440\u043E\u043A.","\u0427\u0438\u0441\u043B\u043E \u043C\u043E\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432, \u043F\u0440\u0438 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u0440\u0438\u0441\u043E\u0432\u044B\u0432\u0430\u0442\u044C\u0441\u044F \u043B\u0438\u043D\u0435\u0439\u043A\u0430 \u044D\u0442\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u044D\u0442\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u043F\u043E\u0441\u043B\u0435 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0447\u0438\u0441\u043B\u0430 \u043C\u043E\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432. \u0414\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u043B\u0438\u043D\u0435\u0435\u043A \u0443\u043A\u0430\u0436\u0438\u0442\u0435 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439. \u0415\u0441\u043B\u0438 \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u043E \u043D\u0438 \u043E\u0434\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F, \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043D\u0435 \u0431\u0443\u0434\u0443\u0442.","\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u043E\u043B\u043E\u0441\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043D\u0430 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438.","\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u043E\u043B\u043E\u0441\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043D\u0430.","\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u043E\u043B\u043E\u0441\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043A\u0440\u044B\u0442\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0432\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C\u044E \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0439 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438.","\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u043E\u043B\u043E\u0441\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043D\u0430 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438.","\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u043E\u043B\u043E\u0441\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043D\u0430.","\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u043E\u043B\u043E\u0441\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043A\u0440\u044B\u0442\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0432\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C\u044E \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u043E\u0439 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438.","\u0428\u0438\u0440\u0438\u043D\u0430 \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0439 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438.","\u0412\u044B\u0441\u043E\u0442\u0430 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u043E\u0439 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u043E\u0439 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u043E\u043C \u043A \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0449\u0435\u043B\u0447\u043A\u0430.","\u041F\u0440\u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0435 \u044D\u0442\u043E\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u043E\u043B\u043E\u0441\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043D\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0432\u0430\u0442\u044C \u0440\u0430\u0437\u043C\u0435\u0440 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435\u043C \u0432\u0441\u0435\u0445 \u043D\u0435\u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 ASCII. \u0411\u0430\u0437\u043E\u0432\u044B\u043C\u0438 ASCII \u0441\u0447\u0438\u0442\u0430\u044E\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043C\u0435\u0436\u0434\u0443 U+0020 \u0438 U+007E, \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u044F, \u043F\u0435\u0440\u0435\u0432\u043E\u0434 \u0441\u0442\u0440\u043E\u043A\u0438 \u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0442 \u043A\u0430\u0440\u0435\u0442\u043A\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u044B\u0434\u0435\u043B\u044F\u044E\u0442\u0441\u044F \u043B\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043F\u0440\u043E\u0441\u0442\u043E \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u044E\u0442 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u0438\u043B\u0438 \u0432\u043E\u043E\u0431\u0449\u0435 \u043D\u0435 \u0438\u043C\u0435\u044E\u0442 \u0448\u0438\u0440\u0438\u043D\u044B.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435\u043C \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043C\u043E\u0436\u043D\u043E \u0441\u043F\u0443\u0442\u0430\u0442\u044C \u0441 \u043E\u0441\u043D\u043E\u0432\u043D\u044B\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438 ASCII, \u043A\u0440\u043E\u043C\u0435 \u0442\u0435\u0445, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u044F\u0432\u043B\u044F\u044E\u0442\u0441\u044F \u043E\u0431\u0449\u0438\u043C\u0438 \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u043C \u044F\u0437\u044B\u043A\u043E\u0432\u043E\u043C \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0432 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u044F\u0445 \u0442\u0430\u043A\u0436\u0435 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C\u0441\u044F \u0432 \u042E\u043D\u0438\u043A\u043E\u0434\u0435.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0432 \u0441\u0442\u0440\u043E\u043A\u0430\u0445 \u0442\u0430\u043A\u0436\u0435 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C\u0441\u044F \u0432 \u042E\u043D\u0438\u043A\u043E\u0434\u0435.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043D\u0435 \u0432\u044B\u0434\u0435\u043B\u044F\u044E\u0442\u0441\u044F.","\u0421\u0438\u043C\u0432\u043E\u043B\u044B \u042E\u043D\u0438\u043A\u043E\u0434\u0430, \u0440\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0435\u043D\u043D\u044B\u0435 \u0432 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u043D\u044B\u0445 \u044F\u0437\u044B\u043A\u0430\u0445, \u043D\u0435 \u0432\u044B\u0434\u0435\u043B\u044F\u044E\u0442\u0441\u044F.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0430\u043D\u0435\u043B\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0433\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u043A\u0430\u0436\u0434\u043E\u043C \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0438 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0433\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0430\u043D\u0435\u043B\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043C\u044B\u0448\u0438 \u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435.","\u041D\u0435 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u0443\u044E \u043F\u0430\u043D\u0435\u043B\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0441 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u043E\u0433\u0434\u0430 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u0443\u044E \u043F\u0430\u043D\u0435\u043B\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0432\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043C \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0441 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u043C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439. \u0415\u0441\u043B\u0438 \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u043D\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438, \u043A\u043E\u0433\u0434\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0435\u043C\u0435\u0439\u0441\u0442\u0432\u043E\u043C \u0448\u0440\u0438\u0444\u0442\u043E\u0432 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430 \u043B\u0438 \u0440\u0430\u0441\u043A\u0440\u0430\u0441\u043A\u0430 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 {0} \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0446\u0432\u0435\u0442\u043E\u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043A\u043E\u0431\u043E\u043A.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0438\u043C\u0435\u0435\u0442 \u043B\u0438 \u043A\u0430\u0436\u0434\u044B\u0439 \u0442\u0438\u043F \u0441\u043A\u043E\u0431\u043E\u043A \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439 \u043D\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u044B\u0439 \u043F\u0443\u043B \u0446\u0432\u0435\u0442\u043E\u0432.","\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0439 \u043F\u0430\u0440\u044B \u0441\u043A\u043E\u0431\u043E\u043A.","\u041E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u044B \u043B\u0438 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0432 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043A \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u043C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u043C \u0434\u043B\u044F \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0439 \u043F\u0430\u0440\u044B \u0441\u043A\u043E\u0431\u043E\u043A.","\u041E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u044B \u043B\u0438 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u0434\u043B\u044F \u0441\u043A\u043E\u0431\u043E\u043A.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0434\u043E\u043B\u0436\u043D\u0430 \u043B\u0438 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C\u0441\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u043F\u0430\u0440\u0430 \u043A\u0432\u0430\u0434\u0440\u0430\u0442\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u0430.","\u0412\u044B\u0434\u0435\u043B\u044F\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u0443\u044E \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0443\u044E \u043E\u0442\u0441\u0442\u0443\u043F\u0430.","\u0412\u044B\u0434\u0435\u043B\u044F\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u0443\u044E \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0443\u044E \u043E\u0442\u0441\u0442\u0443\u043F\u0430, \u0434\u0430\u0436\u0435 \u0435\u0441\u043B\u0438 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u044B \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u0441\u043A\u043E\u0431\u043E\u043A.","\u041D\u0435 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u0430\u043A\u0442\u0438\u0432\u043D\u0443\u044E \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0443\u044E \u043E\u0442\u0441\u0442\u0443\u043F\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0434\u043E\u043B\u0436\u043D\u0430 \u043B\u0438 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C\u0441\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0430\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u0435\u0437 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u0438 \u0442\u0435\u043A\u0441\u0442\u0430 \u0441\u043F\u0440\u0430\u0432\u0430 \u043E\u0442 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0438 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0442\u0435\u043A\u0441\u0442 \u0441\u043F\u0440\u0430\u0432\u0430 \u043E\u0442 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0443\u0442 \u043B\u0438 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044B\u0432\u0430\u0442\u044C\u0441\u044F \u0441\u043B\u043E\u0432\u0430 \u043F\u0440\u0438 \u043F\u0440\u0438\u043D\u044F\u0442\u0438\u0438 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435, \u0447\u0442\u043E \u044D\u0442\u043E \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0439, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0449\u0438\u0445 \u044D\u0442\u0443 \u0444\u0443\u043D\u043A\u0446\u0438\u044E.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0434\u043E\u043F\u0443\u0441\u043A\u0430\u044E\u0442\u0441\u044F \u043B\u0438 \u043D\u0435\u0431\u043E\u043B\u044C\u0448\u0438\u0435 \u043E\u043F\u0435\u0447\u0430\u0442\u043A\u0438 \u0432 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u0445 \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u043F\u0440\u0438 \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0435 \u0441\u043B\u043E\u0432\u0430, \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u0440\u044F\u0434\u043E\u043C \u0441 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u043B\u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u043D\u044B\u0435 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B \u0432\u044B\u0431\u043E\u0440\u0430 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u043D\u043E \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u043C\u0438 \u0440\u0430\u0431\u043E\u0447\u0438\u043C\u0438 \u043E\u0431\u043B\u0430\u0441\u0442\u044F\u043C\u0438 \u0438 \u043E\u043A\u043D\u0430\u043C\u0438 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F "#editor.suggestSelection#").',"\u0412\u0441\u0435\u0433\u0434\u0430 \u0432\u044B\u0431\u0438\u0440\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0439 \u0430\u043A\u0442\u0438\u0432\u0430\u0446\u0438\u0438 IntelliSense.","\u041D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u0432\u044B\u0431\u0438\u0440\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0439 \u0430\u043A\u0442\u0438\u0432\u0430\u0446\u0438\u0438 IntelliSense.","\u0412\u044B\u0431\u0438\u0440\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 \u0430\u043A\u0442\u0438\u0432\u0430\u0446\u0438\u0438 IntelliSense \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043D\u043E\u0433\u043E \u0441\u0438\u043C\u0432\u043E\u043B\u0430.","\u0412\u044B\u0431\u0438\u0440\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 \u0430\u043A\u0442\u0438\u0432\u0430\u0446\u0438\u0438 IntelliSense \u043F\u043E \u043C\u0435\u0440\u0435 \u0432\u0432\u043E\u0434\u0430.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u044B\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435, \u0447\u0442\u043E \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043A \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u043C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C ("#editor.quickSuggestions#" \u0438 "#editor.suggestOnTriggerCharacters#"), \u0438 \u0447\u0442\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044B\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044F \u043F\u0440\u0438 \u044F\u0432\u043D\u043E\u043C \u0432\u044B\u0437\u043E\u0432\u0435, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448 "CTRL+\u041F\u0420\u041E\u0411\u0415\u041B".',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0437\u0430\u043F\u0440\u0435\u0449\u0430\u0435\u0442 \u043B\u0438 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442 \u043A\u043E\u0434\u0430 \u044D\u043A\u0441\u043F\u0440\u0435\u0441\u0441-\u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F.","\u0423\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442, \u043D\u0443\u0436\u043D\u043E \u043B\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0437\u043D\u0430\u0447\u043A\u0438 \u0432 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u0445.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0432\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0438 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u0432 \u043D\u0438\u0436\u043D\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u043F\u0440\u043E\u0441\u043C\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043B\u0438 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u043C\u0435\u0442\u043A\u043E\u0439 \u0438\u043B\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u0439.","\u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043D\u0435\u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u043C\u044B\u043C. \u0422\u0435\u043F\u0435\u0440\u044C \u0440\u0430\u0437\u043C\u0435\u0440 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u043C\u043E\u0436\u043D\u043E \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C.","\u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0443\u0441\u0442\u0430\u0440\u0435\u043B. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u043D\u0435\u0433\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, 'editor.suggest.showKeywords' \u0438\u043B\u0438 'editor.suggest.showSnippets'.",'\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "method".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "function".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "constructor".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "deprecated".','\u041F\u0440\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438 \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u0438 IntelliSense \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E, \u0447\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0432\u044B\u0439 \u0441\u0438\u043C\u0432\u043E\u043B \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u043B \u0432 \u043D\u0430\u0447\u0430\u043B\u0435 \u0441\u043B\u043E\u0432\u0430, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 "c" \u0432 "Console" \u0438\u043B\u0438 "WebContext", \u043D\u043E _\u043D\u0435_ \u0432 "description". \u0415\u0441\u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D, IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0431\u043E\u043B\u044C\u0448\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432, \u043D\u043E \u043F\u043E-\u043F\u0440\u0435\u0436\u043D\u0435\u043C\u0443 \u0441\u043E\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u043F\u043E \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F.','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "field".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "variable".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "class".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "struct".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "interface".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "module".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "property".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "event".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "operator".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "unit".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "value".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "constant".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "enum".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "enumMember".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "keyword".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "text".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "color".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "file".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "reference".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "customcolor".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "folder".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "typeParameter".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "snippet".','\u0412\u043E \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 IntelliSense \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0442\u0438\u043F\u0430 "\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438".','\u0412\u043E \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0442\u0438\u043F\u0430 "\u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B".',"\u0414\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044B\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u044B \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u044B\u0439 \u0438 \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0439 \u043F\u0440\u043E\u0431\u0435\u043B\u044B.",'\u0421\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0432\u044B\u0431\u0438\u0440\u0430\u0442\u044C \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u0441\u043B\u043E\u0432\u0430 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, "foo" \u0432 "fooBar" \u0438\u043B\u0438 "foo_bar").',"\u0411\u0435\u0437 \u043E\u0442\u0441\u0442\u0443\u043F\u0430. \u041F\u0435\u0440\u0435\u043D\u043E\u0441 \u0441\u0442\u0440\u043E\u043A \u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u0441\u043E \u0441\u0442\u043E\u043B\u0431\u0446\u0430 1.","\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u043F\u043E\u043B\u0443\u0447\u0430\u0442 \u0442\u043E\u0442 \u0436\u0435 \u043E\u0442\u0441\u0442\u0443\u043F, \u0447\u0442\u043E \u0438 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430.","\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u043F\u043E\u043B\u0443\u0447\u0430\u0442 \u043E\u0442\u0441\u0442\u0443\u043F, \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u043D\u044B\u0439 \u043D\u0430 \u0435\u0434\u0438\u043D\u0438\u0446\u0443 \u043F\u043E \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044E \u0441 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439. ","\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u043F\u043E\u043B\u0443\u0447\u0430\u0442 \u043E\u0442\u0441\u0442\u0443\u043F, \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u043D\u044B\u0439 \u043D\u0430 \u0434\u0432\u0430 \u043F\u043E \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044E \u0441 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u043C \u0441\u0442\u0440\u043E\u043A \u0441 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u043E\u043C \u043F\u043E \u0441\u043B\u043E\u0432\u0430\u043C.",'\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C\u044E \u043F\u0435\u0440\u0435\u0442\u0430\u0441\u043A\u0438\u0432\u0430\u043D\u0438\u044F \u0444\u0430\u0439\u043B\u0430 \u0432 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043F\u0440\u0438 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043D\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 "Shift" (\u0432\u043C\u0435\u0441\u0442\u043E \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u044F \u0444\u0430\u0439\u043B\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435).',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u0441\u0431\u0440\u043E\u0441\u0435 \u0444\u0430\u0439\u043B\u043E\u0432 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440. \u042D\u0442\u043E \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0443\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C \u0442\u0435\u043C, \u043A\u0430\u043A \u0441\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u0444\u0430\u0439\u043B.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0432\u044B\u0431\u043E\u0440\u0430 \u0441\u0431\u0440\u043E\u0441\u0430 \u043F\u043E\u0441\u043B\u0435 \u0441\u0431\u0440\u043E\u0441\u0430 \u0444\u0430\u0439\u043B\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440.","\u041D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0432\u044B\u0431\u043E\u0440\u0430 \u0441\u0431\u0440\u043E\u0441\u0430. \u0412\u043C\u0435\u0441\u0442\u043E \u044D\u0442\u043E\u0433\u043E \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0441\u0431\u0440\u043E\u0441\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043C\u043E\u0436\u043D\u043E \u043B\u0438 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u043C\u0438 \u0441\u043F\u043E\u0441\u043E\u0431\u0430\u043C\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043A\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440. \u042D\u0442\u043E \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0443\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C \u0442\u0435\u043C, \u043A\u0430\u043A \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0444\u0430\u0439\u043B.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0432\u044B\u0431\u043E\u0440\u0430 \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u043F\u043E\u0441\u043B\u0435 \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440.","\u041D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0432\u044B\u0431\u043E\u0440\u0430 \u0432\u0441\u0442\u0430\u0432\u043A\u0438. \u0412\u043C\u0435\u0441\u0442\u043E \u044D\u0442\u043E\u0433\u043E \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0443\u0442 \u043B\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0442\u044C\u0441\u044F \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0444\u0438\u043A\u0441\u0430\u0446\u0438\u0438. \u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0432 JavaScript \u0442\u043E\u0447\u043A\u0430 \u0441 \u0437\u0430\u043F\u044F\u0442\u043E\u0439 (";") \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u043C \u0444\u0438\u043A\u0441\u0430\u0446\u0438\u0438, \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442\u0441\u044F.',"\u041F\u0440\u0438\u043D\u0438\u043C\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 \u0412\u0412\u041E\u0414 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043E\u043D\u043E \u0438\u0437\u043C\u0435\u043D\u044F\u0435\u0442 \u0442\u0435\u043A\u0441\u0442.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0443\u0442 \u043B\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0442\u044C\u0441\u044F \u043A\u043B\u0430\u0432\u0438\u0448\u0435\u0439 \u0412\u0412\u041E\u0414 \u0432 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043A \u043A\u043B\u0430\u0432\u0438\u0448\u0435 TAB. \u042D\u0442\u043E \u043F\u043E\u043C\u043E\u0433\u0430\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044C \u043D\u0435\u043E\u0434\u043D\u043E\u0437\u043D\u0430\u0447\u043D\u043E\u0441\u0442\u0438 \u043C\u0435\u0436\u0434\u0443 \u0432\u0441\u0442\u0430\u0432\u043A\u043E\u0439 \u043D\u043E\u0432\u044B\u0445 \u0441\u0442\u0440\u043E\u043A \u0438 \u043F\u0440\u0438\u043D\u044F\u0442\u0438\u0435\u043C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0447\u0438\u0441\u043B\u043E\u043C \u0441\u0442\u0440\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043C\u043E\u0433\u0443\u0442 \u0431\u044B\u0442\u044C \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u044B \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430 \u0437\u0430 \u043E\u0434\u0438\u043D \u0440\u0430\u0437. \u041F\u0440\u0438 \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u0438\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0443\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E 500. \u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435! \u041F\u0440\u0438 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0438 \u0447\u0438\u0441\u043B\u0430 \u0441\u0442\u0440\u043E\u043A, \u043F\u0440\u0435\u0432\u044B\u0448\u0430\u044E\u0449\u0435\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E, \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0441\u043D\u0438\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438.","\u0421\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0439\u0442\u0435 \u0442\u0435\u043C, \u043E\u0431\u044A\u044F\u0432\u043B\u044F\u044E\u0442\u0441\u044F \u043B\u0438 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u044D\u043A\u0440\u0430\u043D\u0430.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044F\u0437\u044B\u043A\u0430 \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F \u0441\u043A\u043E\u0431\u043E\u043A.","\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0441\u043A\u043E\u0431\u043A\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043A\u0443\u0440\u0441\u043E\u0440 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0441\u043B\u0435\u0432\u0430 \u043E\u0442 \u043F\u0440\u043E\u0431\u0435\u043B\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0442\u044C \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0443\u044E \u0441\u043A\u043E\u0431\u043A\u0443 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0439 \u0441\u043A\u043E\u0431\u043A\u0438.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044F\u0437\u044B\u043A\u0430 \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432.","\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043A\u0443\u0440\u0441\u043E\u0440 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0441\u043B\u0435\u0432\u0430 \u043E\u0442 \u043F\u0440\u043E\u0431\u0435\u043B\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u043F\u0440\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u044F.","\u0423\u0434\u0430\u043B\u044F\u0442\u044C \u0441\u043E\u0441\u0435\u0434\u043D\u0438\u0435 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0435 \u043A\u0430\u0432\u044B\u0447\u043A\u0438 \u0438 \u043A\u0432\u0430\u0434\u0440\u0430\u0442\u043D\u044B\u0435 \u0441\u043A\u043E\u0431\u043A\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043E\u043D\u0438 \u0431\u044B\u043B\u0438 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u044B \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0443\u0434\u0430\u043B\u044F\u0442\u044C \u0441\u043E\u0441\u0435\u0434\u043D\u0438\u0435 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0435 \u043A\u0430\u0432\u044B\u0447\u043A\u0438 \u0438\u043B\u0438 \u043A\u0432\u0430\u0434\u0440\u0430\u0442\u043D\u044B\u0435 \u0441\u043A\u043E\u0431\u043A\u0438 \u043F\u0440\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0438.","\u0417\u0430\u043C\u0435\u043D\u044F\u0442\u044C \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0435 \u043A\u0430\u0432\u044B\u0447\u043A\u0438 \u0438 \u0441\u043A\u043E\u0431\u043A\u0438 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043A\u0430\u0432\u044B\u0447\u043A\u0438 \u0438\u043B\u0438 \u0441\u043A\u043E\u0431\u043A\u0438 \u0431\u044B\u043B\u0438 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u044B \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0437\u0430\u043C\u0435\u043D\u044F\u0442\u044C\u0441\u044F \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0435 \u043A\u0430\u0432\u044B\u0447\u043A\u0438 \u0438\u043B\u0438 \u0441\u043A\u043E\u0431\u043A\u0438 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044F\u0437\u044B\u043A\u0430 \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F \u043A\u0430\u0432\u044B\u0447\u0435\u043A.","\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u043A\u0430\u0432\u044B\u0447\u043A\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043A\u0443\u0440\u0441\u043E\u0440 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0441\u043B\u0435\u0432\u0430 \u043E\u0442 \u043F\u0440\u043E\u0431\u0435\u043B\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u043A\u0430\u0432\u044B\u0447\u043A\u0438, \u0435\u0441\u043B\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0434\u043E\u0431\u0430\u0432\u0438\u043B \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0443\u044E \u043A\u0430\u0432\u044B\u0447\u043A\u0443.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0438 \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u0441\u043A\u043E\u0431\u043A\u0438 \u0432 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u043E\u043C \u044F\u0437\u044B\u043A\u0430.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438, \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 \u044F\u0437\u044B\u043A\u043E\u043C \u0441\u043A\u043E\u0431\u043A\u0438 \u0438 \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 onEnterRules, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0435 \u044F\u0437\u044B\u043A\u0430\u043C\u0438.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438, \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 \u044F\u0437\u044B\u043A\u043E\u043C \u0441\u043A\u043E\u0431\u043A\u0438, \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 onEnterRules, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0435 \u044F\u0437\u044B\u043A\u0430\u043C\u0438 \u0438 \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u043E\u0442\u0441\u0442\u0443\u043F\u0430 indentationRules, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0435 \u044F\u0437\u044B\u043A\u0430\u043C\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0438\u0437\u043C\u0435\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B, \u043A\u043E\u0433\u0434\u0430 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438 \u0432\u0432\u043E\u0434\u044F\u0442, \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u044E\u0442 \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u044E\u0442 \u0442\u0435\u043A\u0441\u0442 \u0438\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u044F\u044E\u0442 \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0441\u0442\u0440\u043E\u043A.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044F\u0437\u044B\u043A\u0430 \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u043E\u0431\u0440\u0430\u043C\u043B\u0435\u043D\u0438\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0439.","\u041E\u0431\u0440\u0430\u043C\u043B\u044F\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u0430\u0432\u044B\u0447\u0435\u043A, \u0430 \u043D\u0435 \u0441\u043A\u043E\u0431\u043E\u043A.","\u041E\u0431\u0440\u0430\u043C\u043B\u044F\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0441\u043A\u043E\u0431\u043E\u043A, \u0430 \u043D\u0435 \u043A\u0430\u0432\u044B\u0447\u0435\u043A.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0431\u0440\u0430\u043C\u043B\u044F\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u043A\u0430\u0432\u044B\u0447\u0435\u043A \u0438\u043B\u0438 \u043A\u0432\u0430\u0434\u0440\u0430\u0442\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A.","\u042D\u043C\u0443\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u043F\u0440\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u0430. \u0412\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u043E \u043A \u043F\u043E\u0437\u0438\u0446\u0438\u044F\u043C \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 CodeLens \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0435\u043C\u0435\u0439\u0441\u0442\u0432\u043E\u043C \u0448\u0440\u0438\u0444\u0442\u043E\u0432 \u0434\u043B\u044F CodeLens.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445 \u0434\u043B\u044F CodeLens. \u0415\u0441\u043B\u0438 \u0437\u0430\u0434\u0430\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 0, \u0442\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F 90% \u043E\u0442 \u0440\u0430\u0437\u043C\u0435\u0440\u0430 #editor.fontSize#.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0435 \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u043E\u0440\u044B \u0446\u0432\u0435\u0442\u0430 \u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0446\u0432\u0435\u0442\u0430.","\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043F\u0430\u043B\u0438\u0442\u0440\u0443 \u043F\u0440\u0438 \u0449\u0435\u043B\u0447\u043A\u0435 \u0438 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043D\u0430 \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u043E\u0440 \u0446\u0432\u0435\u0442\u0430","\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043F\u0430\u043B\u0438\u0442\u0440\u0443 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043D\u0430 \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u043E\u0440 \u0446\u0432\u0435\u0442\u0430","\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043F\u0430\u043B\u0438\u0442\u0440\u0443 \u043F\u0440\u0438 \u0449\u0435\u043B\u0447\u043A\u0435 \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u043E\u0440\u0430 \u0446\u0432\u0435\u0442\u0430","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0443\u0441\u043B\u043E\u0432\u0438\u0435\u043C \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043F\u0430\u043B\u0438\u0442\u0440\u044B \u0432 \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u043E\u0440\u0435 \u0446\u0432\u0435\u0442\u0430","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u043C \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E\u043C \u0446\u0432\u0435\u0442\u043E\u0432\u044B\u0445 \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u043E\u0440\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043C\u043E\u0436\u043D\u043E \u043E\u0442\u0440\u0438\u0441\u043E\u0432\u0430\u0442\u044C \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0434\u043D\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E.","\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0442\u043E\u0433\u043E, \u0447\u0442\u043E \u0432\u044B\u0431\u043E\u0440 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0438 \u043C\u044B\u0448\u0438 \u043F\u0440\u0438\u0432\u043E\u0434\u0438\u0442 \u043A \u0432\u044B\u0431\u043E\u0440\u0443 \u0441\u0442\u043E\u043B\u0431\u0446\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0442\u0435\u043A\u0441\u0442 \u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D \u0432 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430 \u0441 \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u043E\u0439 \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0442\u0438\u043B\u0435\u043C \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u041F\u043B\u0430\u0432\u043D\u0430\u044F \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0430.","\u041F\u043B\u0430\u0432\u043D\u0430\u044F \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430, \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u0435\u0442 \u043A\u0443\u0440\u0441\u043E\u0440 \u044F\u0432\u043D\u044B\u043C \u0436\u0435\u0441\u0442\u043E\u043C.","\u041F\u043B\u0430\u0432\u043D\u0430\u044F \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u043B\u0430\u0432\u043D\u0443\u044E \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044E \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0442\u0438\u043B\u0435\u043C \u043A\u0443\u0440\u0441\u043E\u0440\u0430.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u0447\u0438\u0441\u043B\u043E \u0432\u0438\u0434\u0438\u043C\u044B\u0445 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u044B\u0445 \u043B\u0438\u043D\u0438\u0439 (\u043C\u0438\u043D\u0438\u043C\u0443\u043C 0) \u0438 \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0445 \u043B\u0438\u043D\u0438\u0439 (\u043C\u0438\u043D\u0438\u043C\u0443\u043C 1), \u043E\u043A\u0440\u0443\u0436\u0430\u044E\u0449\u0438\u0445 \u043A\u0443\u0440\u0441\u043E\u0440. \u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0438\u043C\u0435\u0435\u0442 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 "scrollOff" \u0438\u043B\u0438 "scrollOffset" \u0432 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430\u0445.','"cursorSurroundingLines" \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0435 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0438\u043B\u0438 API.','"cursorSurroundingLines" \u043F\u0440\u0438\u043D\u0443\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u0432\u043E \u0432\u0441\u0435\u0445 \u0441\u043B\u0443\u0447\u0430\u044F\u0445.','\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u043E\u0433\u0434\u0430 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0442\u044C "#cursorSurroundingLines#".',`\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0448\u0438\u0440\u0438\u043D\u043E\u0439 \u043A\u0443\u0440\u0441\u043E\u0440\u0430, \u043A\u043E\u0433\u0434\u0430 \u0434\u043B\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 "#editor.cursorStyle#" \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 'line'`,"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0443 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043F\u0435\u0440\u0435\u0442\u0430\u0441\u043A\u0438\u0432\u0430\u043D\u0438\u044F.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u043C\u0435\u0442\u043E\u0434 \u043E\u0442\u0440\u0438\u0441\u043E\u0432\u043A\u0438 \u0441 SVG.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u043C\u0435\u0442\u043E\u0434 \u043E\u0442\u0440\u0438\u0441\u043E\u0432\u043A\u0438 \u0441 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438 \u0448\u0440\u0438\u0444\u0442\u0430.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0430\u0431\u0438\u043B\u044C\u043D\u044B\u0439 \u043C\u0435\u0442\u043E\u0434 \u043E\u0442\u0440\u0438\u0441\u043E\u0432\u043A\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u0440\u0438\u0441\u043E\u0432\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u043F\u0440\u043E\u0431\u0435\u043B \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043D\u043E\u0432\u043E\u0433\u043E \u044D\u043A\u0441\u043F\u0435\u0440\u0438\u043C\u0435\u043D\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043C\u0435\u0442\u043E\u0434\u0430.","\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u044F \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 ALT.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u043B\u0438 \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0435 \u043A\u043E\u0434\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044E \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u044F\u0437\u044B\u043A\u0430, \u0435\u0441\u043B\u0438 \u043E\u043D\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430, \u0432 \u043F\u0440\u043E\u0442\u0438\u0432\u043D\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044E \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044E \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0435\u0439 \u0434\u043B\u044F \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u0435\u043C\u044B\u0445 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u0441\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u044B.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0441\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044C \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u044B \u0438\u043C\u043F\u043E\u0440\u0442\u0430.","\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u0435\u043C\u044B\u0445 \u0440\u0435\u0433\u0438\u043E\u043D\u043E\u0432. \u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435 \u044D\u0442\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u043C\u043E\u0436\u0435\u0442 \u043F\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043A \u0441\u043D\u0438\u0436\u0435\u043D\u0438\u044E \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438 \u043E\u0442\u043A\u043B\u0438\u043A\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0435\u0441\u043B\u0438 \u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u043E\u043B\u044C\u0448\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u0435\u043C\u044B\u0445 \u0440\u0435\u0433\u0438\u043E\u043D\u043E\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043F\u0443\u0441\u0442\u043E\u0433\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u043F\u043E\u0441\u043B\u0435 \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u0442\u044C \u0435\u0435.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0441\u0435\u043C\u0435\u0439\u0441\u0442\u0432\u043E \u0448\u0440\u0438\u0444\u0442\u043E\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435. \u041C\u043E\u0434\u0443\u043B\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0438 \u0438\u043C\u0435\u0442\u044C \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D \u0432 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u043C, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u044E\u0449\u0438\u043C, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u043E\u0441\u043B\u0435 \u0432\u0432\u043E\u0434\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u043B\u0435\u0439 \u0433\u043B\u0438\u0444\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u041F\u043E\u043B\u044F \u0433\u043B\u0438\u0444\u0430 \u0432 \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u043C \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u0434\u043B\u044F \u043E\u0442\u043B\u0430\u0434\u043A\u0438.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u043A\u0440\u044B\u0442\u0438\u0435\u043C \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u0432 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u043E\u043C \u043C\u0435\u0436\u0434\u0443 \u0431\u0443\u043A\u0432\u0430\u043C\u0438 \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430 \u043B\u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0430 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438 \u043E\u0442 \u044F\u0437\u044B\u043A\u0430, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \u0442\u0435\u0433\u0438 HTML, \u043E\u0431\u043D\u043E\u0432\u043B\u044F\u044E\u0442\u0441\u044F \u043F\u0440\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0438 \u0438 \u0434\u0435\u043B\u0430\u0442\u044C \u0438\u0445 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u043C\u0438 \u0434\u043B\u044F \u0449\u0435\u043B\u0447\u043A\u0430.","\u0412\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0441\u043A\u043E\u0431\u043A\u0438.","\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 deltaX \u0438 deltaY \u0441\u043E\u0431\u044B\u0442\u0438\u0439 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043A\u043E\u043B\u0435\u0441\u0438\u043A\u0430 \u043C\u044B\u0448\u0438.",'\u0423\u0432\u0435\u043B\u0438\u0447\u044C\u0442\u0435 \u0448\u0440\u0438\u0444\u0442 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044F \u043A\u043E\u043B\u0435\u0441\u043E \u043C\u044B\u0448\u0438 \u0438 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044F "Cmd".',"\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u043E\u0439 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 CTRL \u0438 \u0434\u0432\u0438\u0436\u0435\u043D\u0438\u0438 \u043A\u043E\u043B\u0435\u0441\u0438\u043A\u0430 \u043C\u044B\u0448\u0438.","\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432, \u043A\u043E\u0433\u0434\u0430 \u043E\u043D\u0438 \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u044E\u0442\u0441\u044F.","\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 CTRL \u0432 Windows \u0438 Linux \u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 COMMAND \u0432 macOS.","\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 ALT \u0432 Windows \u0438 Linux \u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 OPTION \u0432 macOS.",'\u041C\u043E\u0434\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043C\u044B\u0448\u0438. \u0416\u0435\u0441\u0442\u044B \u043C\u044B\u0448\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E" \u0438 "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443" \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u0442\u0430\u043A, \u0447\u0442\u043E\u0431\u044B \u043E\u043D\u0438 \u043D\u0435 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u043E\u0432\u0430\u043B\u0438 c [multicursor modifier](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).',"\u041A\u0430\u0436\u0434\u044B\u0439 \u043A\u0443\u0440\u0441\u043E\u0440 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0434\u043D\u0443 \u0441\u0442\u0440\u043E\u043A\u0443 \u0442\u0435\u043A\u0441\u0442\u0430.","\u041A\u0430\u0436\u0434\u044B\u0439 \u043A\u0443\u0440\u0441\u043E\u0440 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u043B\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043A\u043E\u0439, \u043A\u043E\u0433\u0434\u0430 \u0447\u0438\u0441\u043B\u043E \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u043C\u044B\u0445 \u0441\u0442\u0440\u043E\u043A \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0447\u0438\u0441\u043B\u0443 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u043C \u0447\u0438\u0441\u043B\u043E\u043C \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043C\u043E\u0433\u0443\u0442 \u043E\u0434\u043D\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0432 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u041D\u0435 \u0432\u044B\u0434\u0435\u043B\u044F\u0435\u0442 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F.","\u0412\u044B\u0434\u0435\u043B\u044F\u0435\u0442 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u043C \u0444\u0430\u0439\u043B\u0435.","\u042D\u043A\u0441\u043F\u0435\u0440\u0438\u043C\u0435\u043D\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u0444\u0443\u043D\u043A\u0446\u0438\u044F: \u0432\u044B\u0434\u0435\u043B\u044F\u0435\u0442 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F \u0432\u043E \u0432\u0441\u0435\u0445 \u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0445 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0445 \u0444\u0430\u0439\u043B\u0430\u0445.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F \u0432 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0445 \u0444\u0430\u0439\u043B\u0430\u0445.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u0430 \u043B\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u043D\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0435.","\u0424\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u043A\u0430 \u043D\u0430 \u0434\u0435\u0440\u0435\u0432\u0435 \u043F\u0440\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u0438 \u043E\u0431\u0437\u043E\u0440\u0430","\u0424\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u043A\u0430 \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u0440\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u0438 \u043E\u0431\u0437\u043E\u0440\u0430","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0438\u043B\u0438 \u0434\u0435\u0440\u0435\u0432\u043E \u0432 \u0432\u0438\u0434\u0436\u0435\u0442\u0435 \u043E\u0431\u0437\u043E\u0440\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u0441\u0435\u0433\u0434\u0430 \u043B\u0438 \u0436\u0435\u0441\u0442 \u043C\u044B\u0448\u044C\u044E \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C\u044E \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0438 (\u0432 \u043C\u0441) \u043F\u0435\u0440\u0435\u0434 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u043A\u0440\u0430\u0442\u043A\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u043E \u0442\u0438\u043F\u0443.",'\u041D\u0435 \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F; \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u044D\u0442\u043E\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 "editor.linkedEditing".',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0443\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u043D\u043E\u043C\u0435\u0440\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438, \u043A\u043E\u0433\u0434\u0430 \u0444\u0430\u0439\u043B \u0437\u0430\u043A\u0430\u043D\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043D\u043E\u0432\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439.","\u0412\u044B\u0434\u0435\u043B\u044F\u0435\u0442 \u043F\u043E\u043B\u0435 \u0438 \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043E\u0442\u0440\u0438\u0441\u043E\u0432\u044B\u0432\u0430\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438, \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043E\u0433\u0434\u0430 \u043E\u043D \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435.","\u041E\u0442\u0440\u0438\u0441\u043E\u0432\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432, \u043A\u0440\u043E\u043C\u0435 \u043E\u0434\u0438\u043D\u043E\u0447\u043D\u044B\u0445 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0441\u043B\u043E\u0432\u0430\u043C\u0438.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u043E\u0431\u0435\u043B\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C \u0442\u0435\u043A\u0441\u0442\u0435.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u044B.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043F\u0440\u043E\u0431\u0435\u043B\u044B.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u043B\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0441\u043A\u0440\u0443\u0433\u043B\u0435\u043D\u043D\u044B\u0435 \u0443\u0433\u043B\u044B \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E\u043C \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u043F\u043E \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u0437\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044E\u044E \u0441\u0442\u0440\u043E\u043A\u0443.","\u041F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430 \u0442\u043E\u043B\u044C\u043A\u043E \u0432\u0434\u043E\u043B\u044C \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u043E\u0441\u0438 \u043F\u0440\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0435 \u043F\u043E \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u0438 \u0438 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u0438 \u043E\u0434\u043D\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E. \u041F\u0440\u0435\u0434\u043E\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043C\u0435\u0449\u0435\u043D\u0438\u0435 \u043F\u043E \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u0438 \u043F\u0440\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0435 \u043F\u043E \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u0438 \u043D\u0430 \u0442\u0440\u0435\u043A\u043F\u0430\u0434\u0435.","\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u0438\u0440\u0443\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u0438\u0447\u043D\u044B\u0439 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430 Linux.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u044F, \u0430\u043D\u0430\u043B\u043E\u0433\u0438\u0447\u043D\u044B\u0435 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u043C\u0443 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0443.","\u0412\u0441\u0435\u0433\u0434\u0430 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u0435\u043C\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F.","\u041D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0435\u043C \u0438 \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u0442\u044C \u0440\u0430\u0437\u043C\u0435\u0440 \u043F\u0435\u0440\u0435\u043F\u043B\u0435\u0442\u0430.","\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F, \u043A\u043E\u0433\u0434\u0430 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C \u043C\u044B\u0448\u0438 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043D\u0430\u0434 \u043F\u0435\u0440\u0435\u043F\u043B\u0435\u0442\u043E\u043C.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043D\u0430 \u043F\u0435\u0440\u0435\u043F\u043B\u0435\u0442\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u043A\u0440\u044B\u0442\u0438\u0435\u043C \u043D\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0433\u043E \u043A\u043E\u0434\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u0435\u0440\u0435\u0447\u0435\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u0435\u043C \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0445 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0445.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u043E\u0432\u0435\u0440\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u043E\u0434 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432 \u0440\u044F\u0434\u043E\u043C \u0441 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438.","\u041D\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438 \u0438 \u0438\u0445 \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u043E\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044F \u043F\u0440\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0435 \u043E \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044F\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\u043C \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430 \u043F\u0440\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0438 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0433\u043E \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F.","\u0420\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0434\u043B\u044F \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439. \u0415\u0441\u043B\u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E {0}, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 {1}.","\u0412\u044B\u0441\u043E\u0442\u0430 \u0441\u0442\u0440\u043E\u043A\u0438 \u0434\u043B\u044F \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439. \u0415\u0441\u043B\u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E {0}, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 {1}. \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u2014 8.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F.","\u0412\u0441\u0435\u0433\u0434\u0430 \u0432\u044B\u0431\u0438\u0440\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435.",'\u0412\u044B\u0431\u043E\u0440 \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439, \u0435\u0441\u043B\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u0430\u043B\u044C\u043D\u0435\u0439\u0448\u0438\u0439 \u0432\u0432\u043E\u0434 \u043D\u0435 \u043F\u0440\u0438\u0432\u043E\u0434\u0438\u0442 \u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044E \u043E\u0434\u043D\u043E\u0433\u043E \u0438\u0437 \u043D\u0438\u0445, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 "console.| -> console.log", \u0442\u0430\u043A \u043A\u0430\u043A "log" \u043D\u0435\u0434\u0430\u0432\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B\u0441\u044F \u0434\u043B\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F.','\u0412\u044B\u0431\u043E\u0440 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0441 \u0443\u0447\u0435\u0442\u043E\u043C \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u0445 \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u043E\u0432, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u0434\u043B\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u044D\u0442\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 "co -> console" \u0438 "con -> const".',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u043C \u0432\u044B\u0431\u043E\u0440\u043E\u043C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0438 \u0441\u043F\u0438\u0441\u043A\u0430 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041F\u0440\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0438 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043F\u043E TAB \u0431\u0443\u0434\u0435\u0442 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0442\u044C\u0441\u044F \u043D\u0430\u0438\u043B\u0443\u0447\u0448\u0435\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB.","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043F\u043E TAB.",'\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0439 \u043F\u043E TAB \u043F\u0440\u0438 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0438 \u0438\u0445 \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u043E\u0432. \u0424\u0443\u043D\u043A\u0446\u0438\u044F \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043E\u043F\u0442\u0438\u043C\u0430\u043B\u044C\u043D\u043E, \u0435\u0441\u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 "quickSuggestions" \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D.',"\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043F\u043E TAB.","\u041D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0443\u0434\u0430\u043B\u044F\u044E\u0442\u0441\u044F.","\u041D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u044E\u0442\u0441\u044F.","\u0414\u043B\u044F \u043D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438 \u0437\u0430\u043F\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435.","\u0423\u0434\u0430\u043B\u0438\u0442\u0435 \u043D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043C\u043E\u0433\u0443\u0442 \u0432\u044B\u0437\u0432\u0430\u0442\u044C \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B.","\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u043E \u0440\u0430\u0437\u0440\u044B\u0432\u0430 \u0441\u0442\u0440\u043E\u043A \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E.","\u041D\u0435 \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0440\u0430\u0437\u0440\u044B\u0432\u044B \u0441\u043B\u043E\u0432 \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430 \u043D\u0430 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u043E\u043C, \u044F\u043F\u043E\u043D\u0441\u043A\u043E\u043C \u0438\u043B\u0438 \u043A\u043E\u0440\u0435\u0439\u0441\u043A\u043E\u043C \u044F\u0437\u044B\u043A\u0435 (CJK). \u0414\u043B\u044F \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0435\u043A\u0441\u0442\u043E\u0432 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u043E\u0431\u044B\u0447\u043D\u043E\u0435 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043C\u0438 \u0440\u0430\u0437\u0431\u0438\u0435\u043D\u0438\u044F \u043F\u043E \u0441\u043B\u043E\u0432\u0430\u043C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u043C\u0438 \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430 \u043D\u0430 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u043E\u043C,\u044F\u043F\u043E\u043D\u0441\u043A\u043E\u043C \u0438 \u043A\u043E\u0440\u0435\u0439\u0441\u043A\u043E\u043C \u044F\u0437\u044B\u043A\u0435 (CJK).","\u0421\u0438\u043C\u0432\u043E\u043B\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u043A\u0430\u043A \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u0438 \u0441\u043B\u043E\u0432 \u043F\u0440\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438\u043B\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0439, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0445 \u0441\u043E \u0441\u043B\u043E\u0432\u0430\u043C\u0438.","\u0421\u0442\u0440\u043E\u043A\u0438 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043D\u0438\u043A\u043E\u0433\u0434\u0430.","\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043F\u043E \u0448\u0438\u0440\u0438\u043D\u0435 \u043E\u043A\u043D\u0430 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430.",'\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043F\u043E "#editor.wordWrapColumn#".','\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u044B \u043F\u043E \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u043C\u0443 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044E \u0438\u0437 \u0434\u0432\u0443\u0445: \u0448\u0438\u0440\u0438\u043D\u0430 \u043E\u043A\u043D\u0430 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0438 "#editor.wordWrapColumn#".',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043A\u0430\u043A \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0438.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0441\u0442\u043E\u043B\u0431\u0435\u0446 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0435\u0441\u043B\u0438 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "#editor.wordWrap#" \u2014 "wordWrapColumn" \u0438\u043B\u0438 "bounded".',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0435 \u0446\u0432\u0435\u0442\u043E\u0432\u044B\u0435 \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A\u0430 \u0446\u0432\u0435\u0442\u0430 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442 \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432\u043A\u043B\u0430\u0434\u043A\u0438 \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u0442 \u043B\u0438 \u0438\u0445 \u0432 \u0440\u0430\u0431\u043E\u0447\u0443\u044E \u0441\u0440\u0435\u0434\u0443 \u0434\u043B\u044F \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438."],"vs/editor/common/core/editorColorRegistry":["\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0433\u0440\u0430\u043D\u0438\u0446 \u0432\u043E\u043A\u0440\u0443\u0433 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \u043F\u0440\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0438 \u0444\u0443\u043D\u043A\u0446\u0438\u0439 Quick Open \u0438\u043B\u0438 \u043F\u043E\u0438\u0441\u043A\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043E\u0431\u0432\u043E\u0434\u043A\u0438 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F.",'\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0441\u0438\u043C\u0432\u043E\u043B\u0430, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0432 \u0444\u0443\u043D\u043A\u0446\u0438\u044F\u0445 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E" \u0438\u043B\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443/\u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u0441\u0438\u043C\u0432\u043E\u043B\u0443". \u0426\u0432\u0435\u0442 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 \u043F\u043E\u0434 \u043D\u0438\u043C.',"\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0432\u043E\u043A\u0440\u0443\u0433 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432.","\u0426\u0432\u0435\u0442 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u041F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044C \u0446\u0432\u0435\u0442 \u0441\u0438\u043C\u0432\u043E\u043B\u0430, \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u043F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u044B\u043C \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C.","\u0426\u0432\u0435\u0442 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u043D\u043E\u043C\u0435\u0440\u043E\u0432 \u0441\u0442\u0440\u043E\u043A \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.",'\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u043E "editorIndentGuide.background" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043D\u0435\u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u043C\u044B\u043C. \u0412\u043C\u0435\u0441\u0442\u043E \u044D\u0442\u043E\u0433\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 "editorIndentGuide.background1".',"\u0426\u0432\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.",'\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u043E "editorIndentGuide.activeBackground" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043D\u0435\u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u043C\u044B\u043C. \u0412\u043C\u0435\u0441\u0442\u043E \u044D\u0442\u043E\u0433\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 "editorIndentGuide.activeBackground1".',"\u0426\u0432\u0435\u0442 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (1).","\u0426\u0432\u0435\u0442 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (2).","\u0426\u0432\u0435\u0442 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (3).","\u0426\u0432\u0435\u0442 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (4).","\u0426\u0432\u0435\u0442 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (5).","\u0426\u0432\u0435\u0442 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (6).","\u0426\u0432\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (1).","\u0426\u0432\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (2).","\u0426\u0432\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (3).","\u0426\u0432\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (4).","\u0426\u0432\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (5).","\u0426\u0432\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (6).","\u0426\u0432\u0435\u0442 \u043D\u043E\u043C\u0435\u0440\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 'Id' \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043C. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u043D\u0435\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 'editorLineNumber.activeForeground'.","\u0426\u0432\u0435\u0442 \u043D\u043E\u043C\u0435\u0440\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0426\u0432\u0435\u0442 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u043A\u043E\u0433\u0434\u0430 editor.renderFinalNewline \u0438\u043C\u0435\u0435\u0442 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 dimmed.","\u0426\u0432\u0435\u0442 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 CodeLens \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u0430\u0440\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A","\u0426\u0432\u0435\u0442 \u043F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u0438\u043A\u043E\u0432 \u043F\u0430\u0440\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0412 \u043F\u043E\u043B\u0435 \u0440\u0430\u0437\u043C\u0435\u0449\u0430\u044E\u0442\u0441\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0433\u043B\u0438\u0444\u043E\u0432 \u0438 \u043D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043D\u0435\u043D\u0443\u0436\u043D\u043E\u0433\u043E (\u043D\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0433\u043E) \u0438\u0441\u0445\u043E\u0434\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.",'\u041D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0441\u0442\u044C \u043D\u0435\u043D\u0443\u0436\u043D\u043E\u0433\u043E (\u043D\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0433\u043E) \u0438\u0441\u0445\u043E\u0434\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, "#000000c0" \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043A\u043E\u0434 \u0441 \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0441\u0442\u044C\u044E 75 %. \u0412 \u0432\u044B\u0441\u043E\u043A\u043E\u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u043D\u044B\u0445 \u0442\u0435\u043C\u0430\u0445 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043D\u0435\u043D\u0443\u0436\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0432\u043C\u0435\u0441\u0442\u043E \u0437\u0430\u0442\u0435\u043D\u0435\u043D\u0438\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0446\u0432\u0435\u0442 \u0442\u0435\u043C\u044B "editorUnnecessaryCode.border".',"\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u0435\u0434\u0432\u0430 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u043C\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0435\u0434\u0432\u0430 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u043C\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0435\u0434\u0432\u0430 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u043C\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043C\u0435\u0442\u043A\u0438 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0434\u043B\u044F \u043E\u0448\u0438\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043C\u0435\u0442\u043A\u0438 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0434\u043B\u044F \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043C\u0435\u0442\u043A\u0438 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0434\u043B\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u043A\u043E\u0431\u043E\u043A (1). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0430\u0441\u043A\u0440\u0430\u0441\u043A\u0443 \u043F\u0430\u0440\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u043A\u043E\u0431\u043E\u043A (2). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0430\u0441\u043A\u0440\u0430\u0441\u043A\u0443 \u043F\u0430\u0440\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u043A\u043E\u0431\u043E\u043A (3). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0430\u0441\u043A\u0440\u0430\u0441\u043A\u0443 \u043F\u0430\u0440\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u043A\u043E\u0431\u043E\u043A (4). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0430\u0441\u043A\u0440\u0430\u0441\u043A\u0443 \u043F\u0430\u0440\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u043A\u043E\u0431\u043E\u043A (5). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0430\u0441\u043A\u0440\u0430\u0441\u043A\u0443 \u043F\u0430\u0440\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u043A\u043E\u0431\u043E\u043A (6). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0440\u0430\u0441\u043A\u0440\u0430\u0441\u043A\u0443 \u043F\u0430\u0440\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043D\u0435\u043F\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043D\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A (1). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A (2). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A (3). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A (4). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A (5). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A (6). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A (1). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A (2). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A (3). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A (4). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A (5). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A (6). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u042E\u043D\u0438\u043A\u043E\u0434\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u042E\u043D\u0438\u043A\u043E\u0434\u0430."],"vs/editor/common/editorContextKeys":["\u041D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043B\u0438 \u0444\u043E\u043A\u0443\u0441 \u043D\u0430 \u0442\u0435\u043A\u0441\u0442\u0435 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 (\u043A\u0443\u0440\u0441\u043E\u0440 \u043C\u0438\u0433\u0430\u0435\u0442)","\u041D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043B\u0438 \u0444\u043E\u043A\u0443\u0441 \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0438\u043B\u0438 \u043D\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0444\u043E\u043A\u0443\u0441 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043D\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430)","\u041D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043B\u0438 \u0444\u043E\u043A\u0443\u0441 \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0438\u043B\u0438 \u043D\u0430 \u043F\u043E\u043B\u0435 \u0432\u0432\u043E\u0434\u0430 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430 (\u043A\u0443\u0440\u0441\u043E\u0440 \u043C\u0438\u0433\u0430\u0435\u0442)","\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u043C \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0447\u0442\u0435\u043D\u0438\u044F","\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u043E\u043C \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439","\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 \u0432\u043D\u0435\u0434\u0440\u0435\u043D\u043D\u044B\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u043E\u043C \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439","\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u043C\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430\u043C\u0438 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044B \u043B\u0438 \u0432\u0441\u0435 \u0444\u0430\u0439\u043B\u044B \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0445 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439","\u0421\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F","\u0412\u044B\u0431\u0440\u0430\u043D \u043B\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u043D\u044B\u0439 \u0431\u043B\u043E\u043A \u043A\u043E\u0434\u0430 \u0434\u043B\u044F \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044F","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0441 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u043E\u0439 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430 \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u0439","\u0414\u043E\u0441\u0442\u0438\u0433\u043D\u0443\u0442\u0430 \u043B\u0438 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u0430\u044F \u0442\u043E\u0447\u043A\u0430 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0430 \u043F\u0430\u0440\u0430\u043B\u043B\u0435\u043B\u044C\u043D\u043E\u0439 \u043E\u0442\u0440\u0438\u0441\u043E\u0432\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439",'\u0412\u043A\u043B\u044E\u0447\u0435\u043D \u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 "editor.columnSelection"',"\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439 \u0432\u044B\u0431\u043E\u0440","\u041F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u0444\u043E\u043A\u0443\u0441 \u0441 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB","\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0432\u0438\u0434\u0438\u043C\u044B\u043C","\u041D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043B\u0438 \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435","\u041D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043B\u0438 \u0437\u0430\u043B\u0438\u043F\u0430\u043D\u0438\u0435 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0432 \u0444\u043E\u043A\u0443\u0441\u0435","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u0437\u0430\u043B\u0438\u043F\u0430\u043D\u0438\u0435 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438","\u0412\u0438\u0434\u043D\u0430 \u043B\u0438 \u0430\u0432\u0442\u043E\u043D\u043E\u043C\u043D\u0430\u044F \u043F\u0430\u043B\u0438\u0442\u0440\u0430 \u0446\u0432\u0435\u0442\u043E\u0432","\u0421\u0444\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u0430 \u043B\u0438 \u0430\u0432\u0442\u043E\u043D\u043E\u043C\u043D\u0430\u044F \u043F\u0430\u043B\u0438\u0442\u0440\u0430 \u0446\u0432\u0435\u0442\u043E\u0432","\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0447\u0430\u0441\u0442\u044C\u044E \u0431\u043E\u043B\u044C\u0448\u0435\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0437\u0430\u043F\u0438\u0441\u043D\u044B\u0445 \u043A\u043D\u0438\u0436\u0435\u043A)","\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u044F\u0437\u044B\u043A\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441 \u043A\u043E\u0434\u043E\u043C","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A CodeLens","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0439","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0439","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0439 \u0442\u0438\u043F\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u044F","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0441\u0441\u044B\u043B\u043E\u043A","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0441\u043F\u0440\u0430\u0432\u043A\u0438 \u043F\u043E \u0441\u0438\u0433\u043D\u0430\u0442\u0443\u0440\u0430\u043C","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A\u043E\u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A\u043E\u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432"],"vs/editor/common/languages":["\u043C\u0430\u0441\u0441\u0438\u0432","\u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435","\u043A\u043B\u0430\u0441\u0441","\u043A\u043E\u043D\u0441\u0442\u0430\u043D\u0442\u0430","\u043A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0440","\u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u0435","\u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F","\u0441\u043E\u0431\u044B\u0442\u0438\u0435","\u043F\u043E\u043B\u0435","\u0444\u0430\u0439\u043B","\u0444\u0443\u043D\u043A\u0446\u0438\u044F","\u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441","\u043A\u043B\u044E\u0447","\u043C\u0435\u0442\u043E\u0434","\u043C\u043E\u0434\u0443\u043B\u044C","\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u0438\u043C\u0435\u043D","NULL","\u0447\u0438\u0441\u043B\u043E","\u043E\u0431\u044A\u0435\u043A\u0442","\u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440","\u043F\u0430\u043A\u0435\u0442","\u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E","\u0441\u0442\u0440\u043E\u043A\u0430","\u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0430","\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0442\u0438\u043F\u0430","\u041F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u0430\u044F","{0} ({1})"],"vs/editor/common/languages/modesRegistry":["\u041F\u0440\u043E\u0441\u0442\u043E\u0439 \u0442\u0435\u043A\u0441\u0442"],"vs/editor/common/model/editStack":["\u0412\u0432\u043E\u0434"],"vs/editor/common/standaloneStrings":["\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A: \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u0442\u043E\u043A\u0435\u043D\u044B","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0442\u0440\u043E\u043A\u0435/\u0441\u0442\u043E\u043B\u0431\u0446\u0443...","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432\u0441\u0435\u0445 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0434\u043E\u0441\u0442\u0443\u043F\u0430","\u041F\u0430\u043B\u0438\u0442\u0440\u0430 \u043A\u043E\u043C\u0430\u043D\u0434","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u044B","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0438\u043C\u0432\u043E\u043B\u0443...","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0438\u043C\u0432\u043E\u043B\u0443 \u043F\u043E \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F\u043C...","\u0421\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u041D\u0430\u0436\u043C\u0438\u0442\u0435 ALT+F1 \u0434\u043B\u044F \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439.","\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0441\u043E\u043A\u043E\u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u043D\u0443\u044E \u0442\u0435\u043C\u0443","\u0412\u043D\u0435\u0441\u0435\u043D\u043E \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439 \u0432 \u0444\u0430\u0439\u043B\u0430\u0445 ({1}): {0}."],"vs/editor/common/viewLayout/viewLineRenderer":["\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u0435 ({0})","\u0421\u0438\u043C\u0432\u043E\u043B\u044B: {0}"],"vs/editor/contrib/anchorSelect/browser/anchorSelect":["\u041D\u0430\u0447\u0430\u043B\u044C\u043D\u0430\u044F \u0442\u043E\u0447\u043A\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F","\u041D\u0430\u0447\u0430\u043B\u044C\u043D\u0430\u044F \u0442\u043E\u0447\u043A\u0430 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0430 \u0432 {0}:{1}","\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0443\u044E \u0442\u043E\u0447\u043A\u0443 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u0439 \u0442\u043E\u0447\u043A\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F","\u0412\u044B\u0434\u0435\u043B\u0438\u0442\u044C \u0442\u0435\u043A\u0441\u0442 \u043E\u0442 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u0439 \u0442\u043E\u0447\u043A\u0438 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u0430","\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0443\u044E \u0442\u043E\u0447\u043A\u0443 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F"],"vs/editor/contrib/bracketMatching/browser/bracketMatching":["\u0426\u0432\u0435\u0442 \u043C\u0435\u0442\u043A\u0438 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0434\u043B\u044F \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043A\u043E\u0431\u043A\u0435","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0441\u043A\u043E\u0431\u043A\u0443","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u043A\u043E\u0431\u043A\u0438","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u0441\u043A\u043E\u0431\u043A\u0435","\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442 \u0432\u043D\u0443\u0442\u0440\u0438, \u0432\u043A\u043B\u044E\u0447\u0430\u044F \u0441\u043A\u043E\u0431\u043A\u0438 \u0438\u043B\u0438 \u0444\u0438\u0433\u0443\u0440\u043D\u044B\u0435 \u0441\u043A\u043E\u0431\u043A\u0438."],"vs/editor/contrib/caretOperations/browser/caretOperations":["\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \u0432\u043B\u0435\u0432\u043E","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \u0432\u043F\u0440\u0430\u0432\u043E"],"vs/editor/contrib/caretOperations/browser/transpose":["\u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0431\u0443\u043A\u0432\u044B"],"vs/editor/contrib/clipboard/browser/clipboard":["&&\u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C","\u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C","\u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C","\u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C","&&\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043A\u0430\u043A","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043A\u0430\u043A","\u041F\u043E\u0434\u0435\u043B\u0438\u0442\u044C\u0441\u044F","\u041F\u043E\u0434\u0435\u043B\u0438\u0442\u044C\u0441\u044F","\u041F\u043E\u0434\u0435\u043B\u0438\u0442\u044C\u0441\u044F","&&\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435\u043C \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u0430"],"vs/editor/contrib/codeAction/browser/codeAction":["\u041F\u0440\u0438 \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430"],"vs/editor/contrib/codeAction/browser/codeActionCommands":["\u0422\u0438\u043F \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0435\u043C\u043E\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u043E\u0433\u0434\u0430 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u044E\u0442\u0441\u044F \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F.","\u0412\u0441\u0435\u0433\u0434\u0430 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u043D\u043E\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043A\u043E\u0434\u0430.","\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430, \u0435\u0441\u043B\u0438 \u043E\u043D\u043E \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u043C.","\u041D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430.","\u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435...","\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442",'\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043A\u043E\u0434\u0430 \u0434\u043B\u044F "{0}".','\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u0434\u043B\u044F "{0}" \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B',"\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043A\u043E\u0434\u0430","\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","\u0420\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433...",'\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0440\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433\u043E\u0432 \u0434\u043B\u044F "{0}"','\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0433\u043E \u0440\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433\u0430 \u0434\u043B\u044F "{0}"',"\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0440\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433\u043E\u0432","\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433\u0430 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u043C \u043A\u043E\u0434\u043E\u043C...","\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0430 \u0434\u043B\u044F '{0}'",'\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043B\u044F "{0}"',"\u041F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0430 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B","\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","\u041E\u0440\u0433\u0430\u043D\u0438\u0437\u0430\u0446\u0438\u044F \u0438\u043C\u043F\u043E\u0440\u0442\u043E\u0432","\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0434\u043B\u044F \u0443\u043F\u043E\u0440\u044F\u0434\u043E\u0447\u0435\u043D\u0438\u044F \u0438\u043C\u043F\u043E\u0440\u0442\u043E\u0432 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442","\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0432\u0441\u0435","\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043F\u043E \u043E\u0431\u0449\u0435\u043C\u0443 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044E","\u0410\u0432\u0442\u043E\u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435...","\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u0430\u0432\u0442\u043E\u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0439"],"vs/editor/contrib/codeAction/browser/codeActionContributions":["\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0433\u0440\u0443\u043F\u043F \u0432 \u043C\u0435\u043D\u044E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043A\u043E\u0434\u0430.","\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0431\u043B\u0438\u0436\u0430\u0439\u0448\u0435\u0433\u043E \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0432 \u0441\u0442\u0440\u043E\u043A\u0435, \u0435\u0441\u043B\u0438 \u0432 \u044D\u0442\u043E\u0442 \u043C\u043E\u043C\u0435\u043D\u0442 \u043D\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u0434\u0438\u0430\u0433\u043D\u043E\u0441\u0442\u0438\u043A\u0430."],"vs/editor/contrib/codeAction/browser/codeActionController":["\u041A\u043E\u043D\u0442\u0435\u043A\u0441\u0442: {0} \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 {1} \u0438 \u0441\u0442\u043E\u043B\u0431\u0446\u0435 {2}.","\u0421\u043A\u0440\u044B\u0442\u044C \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u0435","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u0435"],"vs/editor/contrib/codeAction/browser/codeActionMenu":["\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F...","\u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435","\u0418\u0437\u0432\u043B\u0435\u0447\u044C","\u0412\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439","\u041F\u0435\u0440\u0435\u043F\u0438\u0441\u0430\u0442\u044C","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C","\u0420\u0430\u0437\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432\u043E \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0435","\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u043C \u043A\u043E\u0434\u043E\u043C"],"vs/editor/contrib/codeAction/browser/lightBulbWidget":["\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C: {0}","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430. \u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 ({0})","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 ({0})","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430"],"vs/editor/contrib/codelens/browser/codelensController":["\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u044B CodeLens \u0434\u043B\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438","\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443"],"vs/editor/contrib/colorPicker/browser/colorPickerWidget":["\u0429\u0435\u043B\u043A\u043D\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0446\u0432\u0435\u0442\u0430 (RGB/HSL/HEX)","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F \u043F\u0430\u043B\u0438\u0442\u0440\u044B"],"vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions":["\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0438\u043B\u0438 \u0432\u044B\u0434\u0435\u043B\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u043D\u043E\u043C\u043D\u044B\u0439 \u0432\u044B\u0431\u043E\u0440 \u0446\u0432\u0435\u0442\u0430","&&\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0438\u043B\u0438 \u0432\u044B\u0434\u0435\u043B\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u043D\u043E\u043C\u043D\u044B\u0439 \u0432\u044B\u0431\u043E\u0440 \u0446\u0432\u0435\u0442\u0430","\u0421\u043A\u0440\u044B\u0442\u044C \u043F\u0430\u043B\u0438\u0442\u0440\u0443 \u0446\u0432\u0435\u0442\u043E\u0432","\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u0446\u0432\u0435\u0442\u0430 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0430\u0432\u0442\u043E\u043D\u043E\u043C\u043D\u043E\u0439 \u043F\u0430\u043B\u0438\u0442\u0440\u044B \u0446\u0432\u0435\u0442\u043E\u0432"],"vs/editor/contrib/comment/browser/comment":["\u0417\u0430\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u043B\u0438 \u0440\u0430\u0441\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443","\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 &&\u0441\u0442\u0440\u043E\u043A\u0438","\u0417\u0430\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443","\u0420\u0430\u0441\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443","\u0417\u0430\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u043B\u0438 \u0440\u0430\u0441\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0431\u043B\u043E\u043A","\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 &&\u0431\u043B\u043E\u043A\u0430"],"vs/editor/contrib/contextmenu/browser/contextmenu":["\u041C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430","\u041E\u0442\u0440\u0438\u0441\u043E\u0432\u043A\u0430 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432","\u0420\u0430\u0437\u043C\u0435\u0440 \u043F\u043E \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u0438","\u041F\u0440\u043E\u043F\u043E\u0440\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E","\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u044C","\u041F\u043E\u0434\u043E\u0433\u043D\u0430\u0442\u044C","\u041F\u043E\u043B\u0437\u0443\u043D\u043E\u043A","\u041D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043C\u044B\u0448\u0438","\u0412\u0441\u0435\u0433\u0434\u0430","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u043D\u043E\u0435 \u043C\u0435\u043D\u044E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430"],"vs/editor/contrib/cursorUndo/browser/cursorUndo":["\u041E\u0442\u043C\u0435\u043D\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0440\u0430","\u041F\u043E\u0432\u0442\u043E\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0440\u0430"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution":["\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u0430\u043A...","\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0434\u043B\u044F \u043F\u043E\u043F\u044B\u0442\u043A\u0438 \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u044F. \u0415\u0441\u043B\u0438 \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D, \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E \u0432\u044B\u0431\u043E\u0440\u0430.","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u0430\u043A \u0442\u0435\u043A\u0441\u0442"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteController":["\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0432\u0441\u0442\u0430\u0432\u043A\u0438","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0432\u0441\u0442\u0430\u0432\u043A\u0438...",'\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0434\u043B\u044F "{0}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B',"\u0417\u0430\u043F\u0443\u0441\u043A\u0430\u044E\u0442\u0441\u044F \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0438 \u0432\u0441\u0442\u0430\u0432\u043A\u0438. \u0429\u0435\u043B\u043A\u043D\u0438\u0442\u0435 \u0434\u043B\u044F \u043E\u0442\u043C\u0435\u043D\u044B","\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u0441\u0442\u0430\u0432\u043A\u0438","\u0417\u0430\u043F\u0443\u0441\u043A \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u043E\u0432 \u0432\u0441\u0442\u0430\u0432\u043A\u0438"],"vs/editor/contrib/dropOrPasteInto/browser/defaultProviders":["\u0412\u0441\u0442\u0440\u043E\u0435\u043D\u043E","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043E\u0431\u044B\u0447\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C URI","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C URI","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043F\u0443\u0442\u0438","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043F\u0443\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0443\u0442\u0438","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0443\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C HTML"],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution":["\u041D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0441\u0431\u0440\u043E\u0441\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0434\u043B\u044F \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0437\u0430\u0434\u0430\u043D\u043D\u043E\u0433\u043E \u0442\u0438\u043F\u0430 MIME."],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController":["\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0441\u0431\u0440\u043E\u0441\u0430","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0441\u0431\u0440\u043E\u0441\u0430...","\u0417\u0430\u043F\u0443\u0441\u043A\u0430\u044E\u0442\u0441\u044F \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0438 \u0441\u0431\u0440\u043E\u0441\u0430. \u0429\u0435\u043B\u043A\u043D\u0438\u0442\u0435 \u0434\u043B\u044F \u043E\u0442\u043C\u0435\u043D\u044B"],"vs/editor/contrib/editorState/browser/keybindingCancellation":['\u0412\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438, \u0434\u043E\u043F\u0443\u0441\u043A\u0430\u044E\u0449\u0438\u0435 \u043E\u0442\u043C\u0435\u043D\u0443, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0438"'],"vs/editor/contrib/find/browser/findController":["\u0424\u0430\u0439\u043B \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0432\u0435\u043B\u0438\u043A \u0434\u043B\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043C\u0435\u043D\u044B \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432.","\u041D\u0430\u0439\u0442\u0438","&&\u041D\u0430\u0439\u0442\u0438","\u041D\u0430\u0439\u0442\u0438 \u0441 \u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442\u0430\u043C\u0438","\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u043C","\u041D\u0430\u0439\u0442\u0438 \u0434\u0430\u043B\u0435\u0435","\u041D\u0430\u0439\u0442\u0438 \u0440\u0430\u043D\u0435\u0435","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u044E...","\u041D\u0435\u0442 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439. \u041F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u043D\u0430\u0439\u0442\u0438 \u0447\u0442\u043E-\u043D\u0438\u0431\u0443\u0434\u044C \u0434\u0440\u0443\u0433\u043E\u0435.","\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0447\u0438\u0441\u043B\u043E, \u0447\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C\u0443 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u044E (\u043E\u0442 1 \u0434\u043E {0})","\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0447\u0438\u0441\u043B\u043E \u043E\u0442 1 \u0434\u043E {0}","\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0447\u0438\u0441\u043B\u043E \u043E\u0442 1 \u0434\u043E {0}","\u041D\u0430\u0439\u0442\u0438 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435","\u041D\u0430\u0439\u0442\u0438 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","&&\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C"],"vs/editor/contrib/find/browser/findWidget":['\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u043C" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.',"\u0417\u043D\u0430\u0447\u043E\u043A, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0438\u0439, \u0447\u0442\u043E \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u043E.","\u0417\u043D\u0430\u0447\u043E\u043A, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0438\u0439, \u0447\u0442\u043E \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u043E.",'\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.','\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0441\u0435" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.','\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041D\u0430\u0439\u0442\u0438 \u0440\u0430\u043D\u0435\u0435" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.','\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041D\u0430\u0439\u0442\u0438 \u0434\u0430\u043B\u0435\u0435" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.',"\u041F\u043E\u0438\u0441\u043A \u0438 \u0437\u0430\u043C\u0435\u043D\u0430","\u041D\u0430\u0439\u0442\u0438","\u041D\u0430\u0439\u0442\u0438","\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438","\u0417\u0430\u043A\u0440\u044B\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0441\u0435","\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0437\u0430\u043C\u0435\u043D\u044B","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0435\u0440\u0432\u044B\u0435 {0} \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432, \u043D\u043E \u0432\u0441\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u0441\u043E \u0432\u0441\u0435\u043C \u0442\u0435\u043A\u0441\u0442\u043E\u043C.","{0} \u0438\u0437 {1}","\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","{0} \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E",'{0} \u043D\u0430\u0439\u0434\u0435\u043D \u0434\u043B\u044F "{1}"','{0} \u043D\u0430\u0439\u0434\u0435\u043D \u0434\u043B\u044F "{1}", \u0432 {2}','{0} \u043D\u0430\u0439\u0434\u0435\u043D \u0434\u043B\u044F "{1}"',"\u0422\u0435\u043F\u0435\u0440\u044C \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448 CTRL+\u0412\u0412\u041E\u0414 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0441\u0438\u043C\u0432\u043E\u043B \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043D\u0430 \u043D\u043E\u0432\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u043C\u0435\u0441\u0442\u043E \u0437\u0430\u043C\u0435\u043D\u044B \u0432\u0441\u0435\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430. \u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448 editor.action.replaceAll, \u0447\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442\u044C \u044D\u0442\u043E \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435."],"vs/editor/contrib/folding/browser/folding":["\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C","\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C","\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0435","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435 \u0431\u043B\u043E\u043A\u0438 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435 \u0440\u0435\u0433\u0438\u043E\u043D\u044B","\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435 \u0440\u0435\u0433\u0438\u043E\u043D\u044B","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435 \u043A\u0440\u043E\u043C\u0435 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0445","\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435 \u043A\u0440\u043E\u043C\u0435 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0445","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435","\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u043C\u0443 \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0443 \u0441\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0443 \u0441\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445","\u0421\u043E\u0437\u0434\u0430\u0442\u044C \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u0438\u0437 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u044B \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u0432\u0440\u0443\u0447\u043D\u0443\u044E","\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u043F\u0430\u043F\u043A\u0438 {0}"],"vs/editor/contrib/folding/browser/foldingDecorations":["\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0437\u0430 \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u043C\u0438 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0430\u043C\u0438. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u0438\u0432\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B.","\u0426\u0432\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0435\u043C \u0432\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u043C \u043F\u043E\u043B\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0445 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432 \u043D\u0430 \u043F\u043E\u043B\u0435 \u0433\u043B\u0438\u0444\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0445 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432 \u043D\u0430 \u043F\u043E\u043B\u0435 \u0433\u043B\u0438\u0444\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0445 \u0432\u0440\u0443\u0447\u043D\u0443\u044E \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432 \u043D\u0430 \u043F\u043E\u043B\u044F\u0445 \u0433\u043B\u0438\u0444\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0445 \u0432\u0440\u0443\u0447\u043D\u0443\u044E \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432 \u043D\u0430 \u043F\u043E\u043B\u044F\u0445 \u0433\u043B\u0438\u0444\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0429\u0435\u043B\u043A\u043D\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044C \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D.","\u0429\u0435\u043B\u043A\u043D\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D."],"vs/editor/contrib/fontZoom/browser/fontZoom":["\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430"],"vs/editor/contrib/format/browser/formatActions":["\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442","\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442"],"vs/editor/contrib/gotoError/browser/gotoError":["\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439 \u041F\u0440\u043E\u0431\u043B\u0435\u043C\u0435 (\u041E\u0448\u0438\u0431\u043A\u0435, \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044E, \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438)","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443 \u043C\u0430\u0440\u043A\u0435\u0440\u0443.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0439 \u041F\u0440\u043E\u0431\u043B\u0435\u043C\u0435 (\u041E\u0448\u0438\u0431\u043A\u0435, \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044E, \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438)","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u043C\u0430\u0440\u043A\u0435\u0440\u0443.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435 \u0432 \u0444\u0430\u0439\u043B\u0430\u0445 (\u043E\u0448\u0438\u0431\u043A\u0438, \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044F, \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F)","\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0430\u044F &&\u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0439 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435 \u0432 \u0444\u0430\u0439\u043B\u0430\u0445 (\u043E\u0448\u0438\u0431\u043A\u0438, \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044F, \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F)","\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0430\u044F &&\u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430"],"vs/editor/contrib/gotoError/browser/gotoErrorWidget":["\u041E\u0448\u0438\u0431\u043A\u0430","\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435","\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F","\u0423\u043A\u0430\u0437\u0430\u043D\u0438\u0435","{0} \u0432 {1}. ","\u041F\u0440\u043E\u0431\u043B\u0435\u043C\u044B: {0} \u0438\u0437 {1}","\u041F\u0440\u043E\u0431\u043B\u0435\u043C\u044B: {0} \u0438\u0437 {1}","\u0426\u0432\u0435\u0442 \u043E\u0448\u0438\u0431\u043A\u0438 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0424\u043E\u043D \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u043E\u0448\u0438\u0431\u043A\u0438 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0424\u043E\u043D \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0424\u043E\u043D \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0424\u043E\u043D \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430."],"vs/editor/contrib/gotoSymbol/browser/goToCommands":["\u041E\u0431\u0437\u043E\u0440","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0434\u043B\u044F "{0}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E.',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E","\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0441\u0431\u043E\u043A\u0443","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435","\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044F",'\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435 \u0434\u043B\u044F "{0}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E.',"\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044E",'\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435 \u0434\u043B\u044F "{0}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E.',"\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E","\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0442\u0438\u043F\u043E\u0432",'\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u0438\u043F\u0430 \u0434\u043B\u044F "{0}".',"\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u0438\u043F\u0430.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0442\u0438\u043F\u0430","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0442\u0438\u043F\u0430","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u0438\u043F\u0430","\u0420\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438",'\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430 \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0434\u043B\u044F "{0}".',"\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430 \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u043C","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u043C","\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438",'\u0421\u0441\u044B\u043B\u043A\u0438 \u0434\u043B\u044F "{0}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B',"\u0421\u0441\u044B\u043B\u043A\u0438 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0441\u044B\u043B\u043A\u0430\u043C","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u0441\u0441\u044B\u043B\u043A\u0430\u043C","\u0421\u0441\u044B\u043B\u043A\u0438","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0438","\u0421\u0441\u044B\u043B\u043A\u0438","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043B\u044E\u0431\u043E\u043C\u0443 \u0441\u0438\u043C\u0432\u043E\u043B\u0443","\u0420\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044F",'\u041D\u0435\u0442 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0434\u043B\u044F "{0}"',"\u0421\u0441\u044B\u043B\u043A\u0438"],"vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition":["\u0429\u0435\u043B\u043A\u043D\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0437\u0438\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F ({0})."],"vs/editor/contrib/gotoSymbol/browser/peek/referencesController":['\u041E\u0442\u043A\u0440\u044B\u0442\u043E \u043B\u0438 \u043E\u043A\u043D\u043E \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0441\u0441\u044B\u043B\u043E\u043A, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, "\u0421\u0441\u044B\u043B\u043A\u0438 \u0434\u043B\u044F \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430" \u0438\u043B\u0438 "\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430"',"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesTree":["\u0421\u0441\u044B\u043B\u043E\u043A: {0}","{0} \u0441\u0441\u044B\u043B\u043A\u0430","\u0421\u0441\u044B\u043B\u043A\u0438"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget":["\u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D","\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","\u0421\u0441\u044B\u043B\u043A\u0438"],"vs/editor/contrib/gotoSymbol/browser/referencesModel":["\u0432 {0} \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 {1} \u0432 \u0441\u0442\u043E\u043B\u0431\u0446\u0435 {2}","{0} \u0432 {1} \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 {2} \u0432 \u0441\u0442\u043E\u043B\u0431\u0446\u0435 {3}","1 \u0441\u0438\u043C\u0432\u043E\u043B \u0432 {0}, \u043F\u043E\u043B\u043D\u044B\u0439 \u043F\u0443\u0442\u044C: {1}","{0} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 {1}, \u043F\u043E\u043B\u043D\u044B\u0439 \u043F\u0443\u0442\u044C: {2} ","\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B","\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D 1 \u0441\u0438\u043C\u0432\u043E\u043B \u0432 {0}","\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E {0} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 {1}","\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E {0} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 {1} \u0444\u0430\u0439\u043B\u0430\u0445"],"vs/editor/contrib/gotoSymbol/browser/symbolNavigation":["\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0442 \u043B\u0438 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432, \u043A \u043A\u043E\u0442\u043E\u0440\u044B\u043C \u043C\u043E\u0436\u043D\u043E \u043F\u0435\u0440\u0435\u0439\u0442\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B","\u0421\u0438\u043C\u0432\u043E\u043B {0} \u0438\u0437 {1}, {2} \u0434\u043B\u044F \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E","\u0421\u0438\u043C\u0432\u043E\u043B {0} \u0438\u0437 {1}"],"vs/editor/contrib/hover/browser/hover":["\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043D\u0430 \u043D\u0435\u0433\u043E \u0444\u043E\u043A\u0443\u0441","\u041F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C \u043C\u044B\u0448\u0438 \u043D\u0435 \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0444\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F.","\u041F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043C\u044B\u0448\u0438 \u0431\u0443\u0434\u0435\u0442 \u0444\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u043A\u0430 \u043F\u0440\u043E\u0438\u0437\u043E\u0439\u0434\u0435\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043E\u043D \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043D.","\u041A\u043E\u0433\u0434\u0430 \u043E\u043D \u043F\u043E\u044F\u0432\u0438\u0442\u0441\u044F, \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043C\u044B\u0448\u0438 \u043F\u0440\u043E\u0438\u0437\u043E\u0439\u0434\u0435\u0442 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u0444\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u043A\u0430.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438","\u041F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u044C \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432\u0432\u0435\u0440\u0445","\u041F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u044C \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432\u043D\u0438\u0437","\u041F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u044C \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432\u043B\u0435\u0432\u043E","\u041F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u044C \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432\u043F\u0440\u0430\u0432\u043E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0432\u0432\u0435\u0440\u0445 \u0432 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0432\u043D\u0438\u0437 \u0432 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u044E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043D\u0438\u0436\u043D\u0435\u043C\u0443 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u044E"],"vs/editor/contrib/hover/browser/markdownHoverParticipant":["\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430...","\u041E\u0442\u0440\u0438\u0441\u043E\u0432\u043A\u0430 \u043F\u0440\u0438\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0430 \u0434\u043B\u044F \u0434\u043B\u0438\u043D\u043D\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0438\u0437 \u0441\u043E\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438. \u042D\u0442\u043E \u043C\u043E\u0436\u043D\u043E \u043D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 editor.stopRenderingLineAfter.",'\u0420\u0430\u0437\u043C\u0435\u0442\u043A\u0430 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442\u0441\u044F \u0434\u043B\u044F \u0434\u043B\u0438\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A \u0438\u0437 \u0441\u043E\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438. \u042D\u0442\u043E \u043C\u043E\u0436\u043D\u043E \u043D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E "editor.maxTokenizationLineLength".'],"vs/editor/contrib/hover/browser/markerHoverParticipant":["\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443","\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B","\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0430\u043B\u0438\u0447\u0438\u044F \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0439...","\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B","\u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435..."],"vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace":["\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u043C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\u043C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u043C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\u043C"],"vs/editor/contrib/indentation/browser/indentation":["\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0432 \u043F\u0440\u043E\u0431\u0435\u043B\u044B","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0432 \u0448\u0430\u0433\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438","\u041D\u0430\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0430\u0433\u0430 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438","\u0420\u0430\u0437\u043C\u0435\u0440 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E","\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0430\u0433\u0430 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0434\u043B\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0444\u0430\u0439\u043B\u0430","\u041E\u0442\u0441\u0442\u0443\u043F \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438","\u041E\u0442\u0441\u0442\u0443\u043F \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432","\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u0430 \u043E\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E","\u041F\u043E\u0432\u0442\u043E\u0440\u043D\u043E \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0441\u0442\u0440\u043E\u043A","\u041F\u043E\u0432\u0442\u043E\u0440\u043D\u043E \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0434\u043B\u044F \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A"],"vs/editor/contrib/inlayHints/browser/inlayHintsHover":["\u0414\u0432\u0430\u0436\u0434\u044B \u0449\u0435\u043B\u043A\u043D\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044C","CMD + \u0449\u0435\u043B\u0447\u043E\u043A","CTRL + \u0449\u0435\u043B\u0447\u043E\u043A","OPTION + \u0449\u0435\u043B\u0447\u043E\u043A","ALT + \u0449\u0435\u043B\u0447\u043E\u043A","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E ({0}), \u0449\u0435\u043B\u043A\u043D\u0438\u0442\u0435 \u043F\u0440\u0430\u0432\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \u043C\u044B\u0448\u0438 \u0434\u043B\u044F \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u0439","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E ({0})","\u0412\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u0443"],"vs/editor/contrib/inlineCompletions/browser/commands":["\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435","\u0410\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435","\u041F\u0440\u0438\u043D\u044F\u0442\u044C \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0441\u043B\u043E\u0432\u043E \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0433\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F","\u041F\u0440\u0438\u043D\u044F\u0442\u044C Word","\u041F\u0440\u0438\u043D\u044F\u0442\u044C \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0433\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F","\u041F\u0440\u0438\u043D\u044F\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443","\u041F\u0440\u0438\u043D\u044F\u0442\u044C \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435","\u041F\u0440\u0438\u043D\u044F\u0442\u044C","\u0421\u043A\u0440\u044B\u0442\u044C \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435","\u0412\u0441\u0435\u0433\u0434\u0430 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0430\u043D\u0435\u043B\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432"],"vs/editor/contrib/inlineCompletions/browser/hoverParticipant":["\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435:"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys":["\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435","\u041D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0441 \u043F\u0440\u043E\u0431\u0435\u043B\u0430","\u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u0442, \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043F\u0440\u043E\u0431\u0435\u043B \u043F\u0435\u0440\u0435\u0434 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0439 \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0430\u0446\u0438\u0435\u0439 \u043A\u043E\u0440\u043E\u0447\u0435, \u0447\u0435\u043C \u0442\u0435\u043A\u0441\u0442, \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u043C\u044B\u0439 \u043A\u043B\u0430\u0432\u0438\u0448\u0435\u0439 TAB","\u0421\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u043F\u043E\u0434\u0430\u0432\u043B\u044F\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController":["\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u044D\u0442\u043E\u0442 \u0430\u0441\u043F\u0435\u043A\u0442 \u0432 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0438 \u0441 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u043E\u0439 \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439 ({0})"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget":["\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430.","{0} ({1})","\u041D\u0430\u0437\u0430\u0434","\u0414\u0430\u043B\u0435\u0435"],"vs/editor/contrib/lineSelection/browser/lineSelection":["\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u043E\u043A\u0438"],"vs/editor/contrib/linesOperations/browser/linesOperations":["\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0441\u0432\u0435\u0440\u0445\u0443","&&\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u044B\u0448\u0435","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0441\u043D\u0438\u0437\u0443","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443 &&\u043D\u0438\u0436\u0435","\u0414\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0435","&&\u0414\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0435","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u0432\u0435\u0440\u0445","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043D\u0430 \u0441&&\u0442\u0440\u043E\u043A\u0443 \u0432\u044B\u0448\u0435","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u043D\u0438\u0437","&&\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443 \u043D\u0438\u0436\u0435","\u0421\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0441\u0442\u0440\u043E\u043A \u043F\u043E \u0432\u043E\u0437\u0440\u0430\u0441\u0442\u0430\u043D\u0438\u044E","\u0421\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0441\u0442\u0440\u043E\u043A \u043F\u043E \u0443\u0431\u044B\u0432\u0430\u043D\u0438\u044E","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0434\u0443\u0431\u043B\u0438\u0440\u0443\u044E\u0449\u0438\u0435\u0441\u044F \u0441\u0442\u0440\u043E\u043A\u0438","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B-\u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u0438","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443","\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F","\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u044B\u0448\u0435","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u043D\u0438\u0436\u0435","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u0441\u0435 \u0441\u043B\u0435\u0432\u0430","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u0441\u0435 \u0441\u043F\u0440\u0430\u0432\u0430","_\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0438","\u0422\u0440\u0430\u043D\u0441\u043F\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0432\u043E\u043A\u0440\u0443\u0433 \u043A\u0443\u0440\u0441\u043E\u0440\u0430","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u043D\u0438\u0436\u043D\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u0437\u0430\u0433\u043B\u0430\u0432\u043D\u044B\u0435 \u0431\u0443\u043A\u0432\u044B","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u043D\u0430\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0441 \u043F\u043E\u0434\u0447\u0435\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u044F\u043C\u0438",'\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0432 "\u0432\u0435\u0440\u0431\u043B\u044E\u0436\u0438\u0439" \u0441\u0442\u0438\u043B\u044C',"\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u043A\u0435\u0431\u0430\u0431-\u043A\u0435\u0439\u0441"],"vs/editor/contrib/linkedEditing/browser/linkedEditing":["\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u0440\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u043C \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0438 \u0442\u0438\u043F\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u043E\u043C."],"vs/editor/contrib/links/browser/links":["\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443, \u0442\u0430\u043A \u043A\u0430\u043A \u043E\u043D\u0430 \u0438\u043C\u0435\u0435\u0442 \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442: {0}","\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443, \u0443 \u043D\u0435\u0435 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0446\u0435\u043B\u0435\u0432\u043E\u0439 \u043E\u0431\u044A\u0435\u043A\u0442.","\u0412\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u0443","\u043F\u0435\u0440\u0435\u0439\u0442\u0438 \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435","\u041A\u043D\u043E\u043F\u043A\u0430 CMD \u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043B\u0435\u0432\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \u043C\u044B\u0448\u0438","\u041A\u043D\u043E\u043F\u043A\u0430 CTRL \u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043B\u0435\u0432\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \u043C\u044B\u0448\u0438","\u041A\u043D\u043E\u043F\u043A\u0430 OPTION \u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043B\u0435\u0432\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \u043C\u044B\u0448\u0438","\u041A\u043D\u043E\u043F\u043A\u0430 ALT \u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043B\u0435\u0432\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \u043C\u044B\u0448\u0438","\u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B {0}","\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443"],"vs/editor/contrib/message/browser/messageController":["\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435"],"vs/editor/contrib/multicursor/browser/multicursor":["\u041A\u0443\u0440\u0441\u043E\u0440 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D: {0}","\u041A\u0443\u0440\u0441\u043E\u0440\u044B \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B: {0}","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440 \u0432\u044B\u0448\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440 &&\u0432\u044B\u0448\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440 \u043D\u0438\u0436\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440 &&\u043D\u0438\u0436\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440\u044B \u043A \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F\u043C \u0441\u0442\u0440\u043E\u043A","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440\u044B \u0432 &&\u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440\u044B \u043D\u0438\u0436\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440\u044B \u0432\u044B\u0448\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C &&\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442 \u0432 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C &&\u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u0435","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0439 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442 \u0432 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u0441\u0435 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u044B\u0445 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u0441\u0435 &&\u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F","\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0441\u0435 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F","\u0424\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u043A\u0430 \u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C \u043A\u0443\u0440\u0441\u043E\u0440\u0435","\u0424\u043E\u043A\u0443\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C \u043A\u0443\u0440\u0441\u043E\u0440\u0435","\u0424\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u043A\u0430 \u043D\u0430 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C \u043A\u0443\u0440\u0441\u043E\u0440\u0435","\u0424\u043E\u043A\u0443\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u043D\u0430 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C \u043A\u0443\u0440\u0441\u043E\u0440\u0435"],"vs/editor/contrib/parameterHints/browser/parameterHints":["\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u043A \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C"],"vs/editor/contrib/parameterHints/browser/parameterHintsWidget":["\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430.","{0}, \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0435","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u0432 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430."],"vs/editor/contrib/peekView/browser/peekView":["\u0412\u0441\u0442\u0440\u043E\u0435\u043D \u043B\u0438 \u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043A\u043E\u0434\u0430 \u0432 \u043E\u043A\u043D\u043E \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430","\u0417\u0430\u043A\u0440\u044B\u0442\u044C","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u0439 \u043E \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0438 \u043C\u0430\u0441\u0441\u0438\u0432\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0443\u0437\u043B\u043E\u0432 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0443\u0437\u043B\u043E\u0432 \u0444\u0430\u0439\u043B\u0430 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u044F \u0432 \u043E\u043A\u043D\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0437\u0430\u043B\u0438\u043F\u0430\u043D\u0438\u044F \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0413\u0440\u0430\u043D\u0438\u0446\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435."],"vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess":["\u0427\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0442\u0440\u043E\u043A\u0435, \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440.","\u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043A \u0441\u0442\u0440\u043E\u043A\u0435 {0} \u0438 \u0441\u0442\u043E\u043B\u0431\u0446\u0443 {1}.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0442\u0440\u043E\u043A\u0435 {0}.","\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: {0}, \u0441\u0438\u043C\u0432\u043E\u043B: {1}. \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u043E\u043C\u0435\u0440 \u0441\u0442\u0440\u043E\u043A\u0438 \u043C\u0435\u0436\u0434\u0443 1 \u0438 {2} \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430.","\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: {0}, \u0441\u0438\u043C\u0432\u043E\u043B: {1}. \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u043E\u043C\u0435\u0440 \u0441\u0442\u0440\u043E\u043A\u0438 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430."],"vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess":["\u0427\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0438\u043C\u0432\u043E\u043B\u0443, \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0441 \u0441\u0438\u043C\u0432\u043E\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0435\u0439.","\u0410\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0438\u043C\u0432\u043E\u043B\u044C\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E.","\u041D\u0435\u0442 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0449\u0438\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u041D\u0435\u0442 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0431\u043E\u043A\u0443","\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432\u043D\u0438\u0437\u0443","\u0441\u0438\u043C\u0432\u043E\u043B\u044B ({0})","\u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430 ({0})","\u043C\u0435\u0442\u043E\u0434\u044B ({0})","\u0444\u0443\u043D\u043A\u0446\u0438\u0438 ({0})","\u043A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0440\u044B ({0})","\u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435 ({0})","\u043A\u043B\u0430\u0441\u0441\u044B ({0})","\u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u044B ({0})","\u0441\u043E\u0431\u044B\u0442\u0438\u044F ({0})","\u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u044B ({0})","\u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044B ({0})","\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 \u0438\u043C\u0435\u043D ({0})","\u043F\u0430\u043A\u0435\u0442\u044B ({0})","\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0442\u0438\u043F\u0430 ({0})","\u043C\u043E\u0434\u0443\u043B\u0438 ({0})","\u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430 ({0})","\u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F ({0})","\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F ({0})","\u0441\u0442\u0440\u043E\u043A\u0438 ({0})","\u0444\u0430\u0439\u043B\u044B ({0})","\u043C\u0430\u0441\u0441\u0438\u0432\u044B ({0})","\u0447\u0438\u0441\u043B\u0430 ({0})","\u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F ({0})","\u043E\u0431\u044A\u0435\u043A\u0442\u044B ({0})","\u043A\u043B\u044E\u0447\u0438 ({0})","\u043F\u043E\u043B\u044F ({0})","\u043A\u043E\u043D\u0441\u0442\u0430\u043D\u0442\u044B ({0})"],"vs/editor/contrib/readOnlyMessage/browser/contribution":["\u041D\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044F \u0432\u043D\u0435\u0441\u0442\u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0432\u043E \u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0447\u0442\u0435\u043D\u0438\u044F","\u041D\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0447\u0442\u0435\u043D\u0438\u044F"],"vs/editor/contrib/rename/browser/rename":["\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442.","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0438 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u0441\u043B\u0435 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F",'\u041F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435 "{0}" \u0432 "{1}"',"\u041F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435 {0} \u0432 {1}","\xAB{0}\xBB \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D \u0432 \xAB{1}\xBB. \u0421\u0432\u043E\u0434\u043A\u0430: {2}","\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0440\u0430\u0432\u043A\u0438","\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0432\u044B\u0447\u0438\u0441\u043B\u0438\u0442\u044C \u043F\u0440\u0430\u0432\u043A\u0438","\u041F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B","\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C/\u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439 \u043F\u0435\u0440\u0435\u0434 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435\u043C"],"vs/editor/contrib/rename/browser/renameInputField":["\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F \u0432\u0445\u043E\u0434\u043D\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445","\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u043E\u0432\u043E\u0435 \u0438\u043C\u044F \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u043D\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0443 \u0412\u0412\u041E\u0414 \u0434\u043B\u044F \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F.","\u041D\u0430\u0436\u043C\u0438\u0442\u0435 {0} \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F, {1} \u0434\u043B\u044F \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430."],"vs/editor/contrib/smartSelect/browser/smartSelect":["\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442","&&\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435","\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442","&&\u0421\u0436\u0430\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435"],"vs/editor/contrib/snippet/browser/snippetController2":["\u041D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043B\u0438 \u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432","\u0423\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043B\u0438 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0430\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u044F \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432","\u0423\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043B\u0438 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0430\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u044F \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443 \u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044E..."],"vs/editor/contrib/snippet/browser/snippetVariables":["\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435","\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A","\u0432\u0442\u043E\u0440\u043D\u0438\u043A","\u0441\u0440\u0435\u0434\u0430","\u0447\u0435\u0442\u0432\u0435\u0440\u0433","\u043F\u044F\u0442\u043D\u0438\u0446\u0430","\u0441\u0443\u0431\u0431\u043E\u0442\u0430","\u0412\u0441","\u041F\u043D","\u0412\u0442","\u0421\u0440","\u0427\u0442","\u041F\u0442","\u0421\u0431","\u042F\u043D\u0432\u0430\u0440\u044C","\u0424\u0435\u0432\u0440\u0430\u043B\u044C","\u041C\u0430\u0440\u0442","\u0410\u043F\u0440\u0435\u043B\u044C","\u041C\u0430\u0439","\u0418\u044E\u043D\u044C","\u0418\u044E\u043B\u044C","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044C","\u041E\u043A\u0442\u044F\u0431\u0440\u044C","\u041D\u043E\u044F\u0431\u0440\u044C","\u0414\u0435\u043A\u0430\u0431\u0440\u044C","\u042F\u043D\u0432","\u0424\u0435\u0432","\u041C\u0430\u0440","\u0410\u043F\u0440","\u041C\u0430\u0439","\u0418\u044E\u043D","\u0418\u044E\u043B","\u0410\u0432\u0433","\u0421\u0435\u043D","\u041E\u043A\u0442","\u041D\u043E\u044F","\u0414\u0435\u043A"],"vs/editor/contrib/stickyScroll/browser/stickyScrollActions":["\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043B\u0438\u043F\u043A\u0443\u044E \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0443 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","&&\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043B\u0438\u043F\u043A\u0443\u044E \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0443 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0417\u0430\u043B\u0438\u043F\u0430\u043D\u0438\u0435 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438","&&\u0417\u0430\u043B\u0438\u043F\u0430\u043D\u0438\u0435 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438","\u0424\u043E\u043A\u0443\u0441 \u043D\u0430 \u0437\u0430\u043B\u0438\u043F\u0430\u043D\u0438\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438","&&\u0424\u043E\u043A\u0443\u0441 \u043D\u0430 \u0437\u0430\u043B\u0438\u043F\u0430\u043D\u0438\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 \u0437\u0430\u043B\u0438\u043F\u0430\u043D\u0438\u044F \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 \u0437\u0430\u043B\u0438\u043F\u0430\u043D\u0438\u044F \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0442\u0440\u043E\u043A\u0435 \u0437\u0430\u043B\u0438\u043F\u0430\u043D\u0438\u044F \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435","\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440"],"vs/editor/contrib/suggest/browser/suggest":["\u041D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043B\u0438 \u043A\u0430\u043A\u043E\u0435-\u043B\u0438\u0431\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0432 \u0444\u043E\u043A\u0443\u0441\u0435","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043B\u0438 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u0445","\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043B\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0434\u043B\u044F \u0432\u044B\u0431\u043E\u0440\u0430","\u041F\u0440\u0438\u0432\u043E\u0434\u0438\u0442 \u043B\u0438 \u0432\u0441\u0442\u0430\u0432\u043A\u0430 \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043A \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044E \u0438\u043B\u0438 \u0432\u0441\u0435 \u0443\u0436\u0435 \u0431\u044B\u043B\u043E \u0432\u0432\u0435\u0434\u0435\u043D\u043E","\u0412\u0441\u0442\u0430\u0432\u043B\u044F\u044E\u0442\u0441\u044F \u043B\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 \u0412\u0412\u041E\u0414",'\u0415\u0441\u0442\u044C \u043B\u0438 \u0443 \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u044F "\u0432\u0441\u0442\u0430\u0432\u043A\u0430" \u0438 "\u0437\u0430\u043C\u0435\u043D\u0430"','\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C "\u0432\u0441\u0442\u0430\u0432\u043A\u0430" \u0438\u043B\u0438 "\u0437\u0430\u043C\u0435\u043D\u0430"',"\u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043B\u0438 \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u0439"],"vs/editor/contrib/suggest/browser/suggestController":['\u041F\u0440\u0438\u043D\u044F\u0442\u0438\u0435 "{0}" \u043F\u0440\u0438\u0432\u0435\u043B\u043E \u043A \u0432\u043D\u0435\u0441\u0435\u043D\u0438\u044E \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u0440\u0430\u0432\u043E\u043A ({1})',"\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043C\u0435\u043D\u044C\u0448\u0435","\u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u0435","\u0421\u0431\u0440\u043E\u0441 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F"],"vs/editor/contrib/suggest/browser/suggestWidget":["\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0437\u043D\u0430\u0447\u043A\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u044F \u0432\u044B\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0430\u0446\u0438\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F.","\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430...","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442.","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0438\u0442\u044C","{0} {1}, {2}","{0} {1}","{0}, {1}","{0}, \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u044B: {1}"],"vs/editor/contrib/suggest/browser/suggestWidgetDetails":["\u0417\u0430\u043A\u0440\u044B\u0442\u044C","\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430..."],"vs/editor/contrib/suggest/browser/suggestWidgetRenderer":["\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u0439 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435"],"vs/editor/contrib/suggest/browser/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/browser/symbolIcons":["\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043C\u0430\u0441\u0441\u0438\u0432\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043B\u0430\u0441\u0441\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0446\u0432\u0435\u0442\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043E\u043D\u0441\u0442\u0430\u043D\u0442\u044B. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0440\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0438\u0442\u0435\u043B\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0447\u043B\u0435\u043D\u0430 \u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0438\u0442\u0435\u043B\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u043E\u0431\u044B\u0442\u0438\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u043E\u043B\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0444\u0430\u0439\u043B\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0430\u043F\u043A\u0438. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0444\u0443\u043D\u043A\u0446\u0438\u0438. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043B\u044E\u0447\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043B\u044E\u0447\u0435\u0432\u043E\u0433\u043E \u0441\u043B\u043E\u0432\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043C\u0435\u0442\u043E\u0434\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043C\u043E\u0434\u0443\u043B\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 \u0438\u043C\u0435\u043D. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 NULL. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0447\u0438\u0441\u043B\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043E\u0431\u044A\u0435\u043A\u0442\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0430\u043A\u0435\u0442\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u0441\u044B\u043B\u043A\u0438. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430 \u043A\u043E\u0434\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u0442\u0440\u043E\u043A\u0438. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u044B. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0442\u0435\u043A\u0441\u0442\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0442\u0438\u043F\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0435\u0434\u0438\u043D\u0438\u0446. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0439. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439."],"vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode":["\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u0435\u0442 \u0444\u043E\u043A\u0443\u0441.","\u041F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u0444\u043E\u043A\u0443\u0441 \u043F\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043C\u043E\u0436\u0435\u0442 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0444\u043E\u043A\u0443\u0441","\u0422\u0435\u043F\u0435\u0440\u044C \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D \u0441\u0438\u043C\u0432\u043E\u043B \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438"],"vs/editor/contrib/tokenization/browser/tokenization":["\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A: \u043F\u0440\u0438\u043D\u0443\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u0430\u044F \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u0442\u043E\u043A\u0435\u043D\u043E\u0432"],"vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter":["\u0417\u043D\u0430\u0447\u043E\u043A, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u044B\u0439 \u0441 \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435\u043C \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0439.","\u042D\u0442\u043E\u0442 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043C\u043D\u043E\u0433\u043E \u043D\u0435\u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u042E\u043D\u0438\u043A\u043E\u0434\u0430 ASCII","\u042D\u0442\u043E\u0442 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043C\u043D\u043E\u0433\u043E \u043D\u0435\u043E\u0434\u043D\u043E\u0437\u043D\u0430\u0447\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u042E\u043D\u0438\u043A\u043E\u0434\u0430","\u042D\u0442\u043E\u0442 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043C\u043D\u043E\u0433\u043E \u043D\u0435\u0432\u0438\u0434\u0438\u043C\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u042E\u043D\u0438\u043A\u043E\u0434\u0430","\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u042E\u043D\u0438\u043A\u043E\u0434\u0430","\u0421\u0438\u043C\u0432\u043E\u043B {0} \u043C\u043E\u0436\u043D\u043E \u0441\u043F\u0443\u0442\u0430\u0442\u044C \u0441 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u043C ASCII {1}, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0447\u0430\u0449\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044F \u0432 \u0438\u0441\u0445\u043E\u0434\u043D\u043E\u043C \u043A\u043E\u0434\u0435.","\u0421\u0438\u043C\u0432\u043E\u043B {0} \u043C\u043E\u0436\u043D\u043E \u0441\u043F\u0443\u0442\u0430\u0442\u044C \u0441 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u043C {1}, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0447\u0430\u0449\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044F \u0432 \u0438\u0441\u0445\u043E\u0434\u043D\u043E\u043C \u043A\u043E\u0434\u0435.","\u0421\u0438\u043C\u0432\u043E\u043B {0} \u043D\u0435\u0432\u0438\u0434\u0438\u043C.","\u0421\u0438\u043C\u0432\u043E\u043B {0} \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0431\u0430\u0437\u043E\u0432\u044B\u043C \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u043C ASCII.","\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0432 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u044F\u0445","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u044F\u0445","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0432 \u0441\u0442\u0440\u043E\u043A\u0430\u0445","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 \u0441\u0442\u0440\u043E\u043A\u0430\u0445","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0435\u043E\u0434\u043D\u043E\u0437\u043D\u0430\u0447\u043D\u043E\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043D\u0435\u043E\u0434\u043D\u043E\u0437\u043D\u0430\u0447\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043D\u0435\u0432\u0438\u0434\u0438\u043C\u043E\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043D\u0435\u0432\u0438\u0434\u0438\u043C\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435, \u043E\u0442\u043B\u0438\u0447\u043D\u043E\u0435 \u043E\u0442 ASCII","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043D\u0435\u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 ASCII","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0438\u0441\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F","\u0418\u0441\u043A\u043B\u044E\u0447\u0438\u0442\u044C {0} (\u043D\u0435\u0432\u0438\u0434\u0438\u043C\u044B\u0439 \u0441\u0438\u043C\u0432\u043E\u043B) \u0438\u0437 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F","\u0418\u0441\u043A\u043B\u044E\u0447\u0438\u0442\u044C {0} \u0438\u0437 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F",'\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u042E\u043D\u0438\u043A\u043E\u0434\u0430, \u0431\u043E\u043B\u0435\u0435 \u0440\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0435\u043D\u043D\u044B\u0435 \u0432 \u044F\u0437\u044B\u043A\u0435 "{0}".'],"vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators":["\u041D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438","\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u044B \u043D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438",`\u0424\u0430\u0439\u043B "{0}" \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043E\u0434\u0438\u043D \u0438\u043B\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0441\u0442\u0440\u043E\u043A (LS) \u0438\u043B\u0438 \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0430\u0431\u0437\u0430\u0446\u0435\u0432 (PS).\r
+\r
+\u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u0438\u0445 \u0438\u0437 \u0444\u0430\u0439\u043B\u0430. \u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u044D\u0442\u0438\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043C\u043E\u0436\u043D\u043E \u043D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 "editor.unusualLineTerminators".`,"&&\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438","\u041F\u0440\u043E\u043F\u0443\u0441\u0442\u0438\u0442\u044C"],"vs/editor/contrib/wordHighlighter/browser/highlightDecorations":["\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u043F\u0440\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0435 \u043D\u0430 \u0447\u0442\u0435\u043D\u0438\u0435, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043F\u0440\u0438 \u0447\u0442\u0435\u043D\u0438\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0439. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043D\u0430 \u0437\u0430\u043F\u0438\u0441\u044C, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \u043F\u0440\u0438 \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u0443\u044E. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u043E\u0433\u043E \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u0430. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u043F\u0440\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0435 \u043D\u0430 \u0447\u0442\u0435\u043D\u0438\u0435, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043F\u0440\u0438 \u0441\u0447\u0438\u0442\u044B\u0432\u0430\u043D\u0438\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0439.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u043F\u0440\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0435 \u043D\u0430 \u0437\u0430\u043F\u0438\u0441\u044C, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043F\u0440\u0438 \u0437\u0430\u043F\u0438\u0441\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0439. ","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u043E\u0433\u043E \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u0430.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043D\u0430 \u0437\u0430\u043F\u0438\u0441\u044C. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u043E\u0433\u043E \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u0430. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F."],"vs/editor/contrib/wordHighlighter/browser/wordHighlighter":["\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432","\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432"],"vs/editor/contrib/wordOperations/browser/wordOperations":["\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u043B\u043E\u0432\u043E"],"vs/platform/action/common/actionCommonCategories":["\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A","\u041F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0435","\u0421\u043F\u0440\u0430\u0432\u043A\u0430","\u0422\u0435\u0441\u0442","\u0424\u0430\u0439\u043B","\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B"],"vs/platform/actionWidget/browser/actionList":["{0}, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C, {1} \u0434\u043B\u044F \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430","{0}, \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C","{0}, \u043F\u0440\u0438\u0447\u0438\u043D\u0430 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F: {1}","\u041C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439"],"vs/platform/actionWidget/browser/actionWidget":["\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0430\u0435\u043C\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u0441\u043F\u0438\u0441\u043E\u043A \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439","\u0421\u043A\u0440\u044B\u0442\u044C \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435","\u041F\u0440\u0438\u043D\u044F\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435","\u041F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})","{0} ({1})",`{0}\r
+[{1}] {2}`],"vs/platform/actions/browser/toolbar":["\u0421\u043A\u0440\u044B\u0442\u044C","\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u043C\u0435\u043D\u044E"],"vs/platform/actions/common/menuService":['\u0421\u043A\u0440\u044B\u0442\u044C "{0}"'],"vs/platform/audioCues/browser/audioCueService":["\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435","\u041E\u0448\u0438\u0431\u043A\u0430","\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435","\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435","\u0421\u043B\u043E\u0436\u0435\u043D\u043D\u0430\u044F \u043E\u0431\u043B\u0430\u0441\u0442\u044C \u0432 \u0441\u0442\u0440\u043E\u043A\u0435","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u043E","\u0422\u043E\u0447\u043A\u0430 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0430 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435","\u0422\u043E\u0447\u043A\u0430 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0430","\u0412\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u0430\u044F \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0430\u0446\u0438\u044F \u0432 \u0441\u0442\u0440\u043E\u043A\u0435","\u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u0430","\u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435","\u041E\u0442\u043B\u0430\u0434\u0447\u0438\u043A \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D \u0432 \u0442\u043E\u0447\u043A\u0435 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0430","\u0422\u043E\u0447\u043A\u0430 \u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0430","\u041E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A \u0432 \u0441\u0442\u0440\u043E\u043A\u0435","\u0412\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u044F \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","\u0417\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430","\u0417\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0430","\u0421\u0431\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438","\u0421\u0431\u043E\u0439 \u0437\u0430\u0434\u0430\u0447\u0438","\u0421\u0431\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B \u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u0430","\u0421\u0431\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B","\u0417\u0432\u043E\u043D\u043E\u043A \u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u0430","\u041A\u043E\u043B\u043E\u043A\u043E\u043B\u044C\u0447\u0438\u043A \u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u0430","\u042F\u0447\u0435\u0439\u043A\u0430 \u0437\u0430\u043F\u0438\u0441\u043D\u043E\u0439 \u043A\u043D\u0438\u0436\u043A\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0430","\u042F\u0447\u0435\u0439\u043A\u0430 \u0437\u0430\u043F\u0438\u0441\u043D\u043E\u0439 \u043A\u043D\u0438\u0436\u043A\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0430","\u0421\u0431\u043E\u0439 \u044F\u0447\u0435\u0439\u043A\u0438 \u0437\u0430\u043F\u0438\u0441\u043D\u043E\u0439 \u043A\u043D\u0438\u0436\u043A\u0438","\u0421\u0431\u043E\u0439 \u044F\u0447\u0435\u0439\u043A\u0438 \u0437\u0430\u043F\u0438\u0441\u043D\u043E\u0439 \u043A\u043D\u0438\u0436\u043A\u0438","\u0412\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0430 \u0440\u0430\u0437\u043D\u043E\u0441\u0442\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430","\u0423\u0434\u0430\u043B\u0435\u043D\u0430 \u0440\u0430\u0437\u043D\u043E\u0441\u0442\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430","\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0430 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u0439","\u041E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D \u0437\u0430\u043F\u0440\u043E\u0441 \u043D\u0430 \u0447\u0430\u0442","\u041E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D \u0437\u0430\u043F\u0440\u043E\u0441 \u043D\u0430 \u0447\u0430\u0442","\u041F\u043E\u043B\u0443\u0447\u0435\u043D \u043E\u0442\u0432\u0435\u0442 \u0447\u0430\u0442\u0430","\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043E\u0442\u0432\u0435\u0442\u0430 \u0447\u0430\u0442\u0430","\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043E\u0442\u0432\u0435\u0442\u0430 \u0447\u0430\u0442\u0430","\u041E\u0447\u0438\u0441\u0442\u043A\u0430","\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C","\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C","\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C","\u0424\u043E\u0440\u043C\u0430\u0442","\u0424\u043E\u0440\u043C\u0430\u0442"],"vs/platform/configuration/common/configurationRegistry":["\u041F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044F\u0437\u044B\u043A\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E","\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0445 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0434\u043B\u044F \u044F\u0437\u044B\u043A\u0430 {0}.","\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0445 \u0434\u043B\u044F \u044F\u0437\u044B\u043A\u0430.","\u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0443 \u0434\u043B\u044F \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0445 \u044F\u0437\u044B\u043A\u043E\u0432.","\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0445 \u0434\u043B\u044F \u044F\u0437\u044B\u043A\u0430.","\u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0443 \u0434\u043B\u044F \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0445 \u044F\u0437\u044B\u043A\u043E\u0432.","\u041D\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044F \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0443\u0441\u0442\u043E\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E",`\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C "{0}". \u041E\u043D\u043E \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0448\u0430\u0431\u043B\u043E\u043D\u0443 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430 '\\\\[.*\\\\]$' \u0434\u043B\u044F \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0445 \u044F\u0437\u044B\u043A\u043E\u043C. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0443\u0447\u0430\u0441\u0442\u0438\u0435 configurationDefaults.`,'\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C "{0}". \u042D\u0442\u043E \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043E.','\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C "{0}". \u0423\u0436\u0435 \u0438\u043C\u0435\u0435\u0442\u0441\u044F \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044F {2} \u0434\u043B\u044F \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0439 \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0438 {1}.'],"vs/platform/contextkey/browser/contextKeyService":["\u041A\u043E\u043C\u0430\u043D\u0434\u0430, \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u044E\u0449\u0430\u044F \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u043E \u043A\u043B\u044E\u0447\u0430\u0445 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430"],"vs/platform/contextkey/common/contextkey":["\u041F\u0443\u0441\u0442\u043E\u0435 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u043A\u043B\u044E\u0447\u0430 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430",'\u0412\u044B \u0437\u0430\u0431\u044B\u043B\u0438 \u0437\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0435? \u0412\u044B \u0442\u0430\u043A\u0436\u0435 \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043C\u0435\u0441\u0442\u0438\u0442\u044C "false" \u0438\u043B\u0438 "true", \u0447\u0442\u043E\u0431\u044B \u0432\u0441\u0435\u0433\u0434\u0430 \u043E\u0446\u0435\u043D\u0438\u0432\u0430\u0442\u044C \u043F\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044E false \u0438\u043B\u0438 true \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u043E.','"in" \u043F\u043E\u0441\u043B\u0435 "not".','\u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0430\u044F \u043A\u0440\u0443\u0433\u043B\u0430\u044F \u0441\u043A\u043E\u0431\u043A\u0430 ")"',"\u041D\u0435\u043F\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043D\u043D\u044B\u0439 \u043C\u0430\u0440\u043A\u0435\u0440","\u0412\u043E\u0437\u043C\u043E\u0436\u043D\u043E, \u0432\u044B \u0437\u0430\u0431\u044B\u043B\u0438 \u043F\u043E\u043C\u0435\u0441\u0442\u0438\u0442\u044C && \u0438\u043B\u0438 || \u043F\u0435\u0440\u0435\u0434 \u043C\u0430\u0440\u043A\u0435\u0440\u043E\u043C?","\u041D\u0435\u043E\u0436\u0438\u0434\u0430\u043D\u043D\u044B\u0439 \u043A\u043E\u043D\u0435\u0446 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u044F","\u0412\u043E\u0437\u043C\u043E\u0436\u043D\u043E, \u0432\u044B \u0437\u0430\u0431\u044B\u043B\u0438 \u043F\u043E\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043A\u043B\u044E\u0447 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430?",`\u041E\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044F: {0}\r
+\u041F\u043E\u043B\u0443\u0447\u0435\u043D\u043E: "{1}".`],"vs/platform/contextkey/common/contextkeys":["\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u043E\u043D\u043D\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430 macOS","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u043E\u043D\u043D\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430 Linux","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u043E\u043D\u043D\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430 Windows","\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043D\u043E\u0439","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u043E\u043D\u043D\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430 macOS \u043D\u0430 \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u0435, \u043E\u0442\u043B\u0438\u0447\u043D\u043E\u0439 \u043E\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043D\u043E\u0439","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u043E\u043D\u043D\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430 IOS","\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u0430 \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043E\u043C","\u0422\u0438\u043F \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0430 VS Code","\u041D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043B\u0438 \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0432 \u043F\u043E\u043B\u0435 \u0432\u0432\u043E\u0434\u0430"],"vs/platform/contextkey/common/scanner":["\u0412\u044B \u0438\u043C\u0435\u043B\u0438 \u0432 \u0432\u0438\u0434\u0443 {0}?","\u0412\u044B \u0438\u043C\u0435\u043B\u0438 \u0432 \u0432\u0438\u0434\u0443 {0} \u0438\u043B\u0438 {1}?","\u0412\u044B \u0438\u043C\u0435\u043B\u0438 \u0432 \u0432\u0438\u0434\u0443 {0}, {1} \u0438\u043B\u0438 {2}?","\u0412\u044B \u0437\u0430\u0431\u044B\u043B\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0438\u043B\u0438 \u0437\u0430\u043A\u0440\u044B\u0442\u044C \u0446\u0438\u0442\u0430\u0442\u0443?",'\u0412\u044B \u0437\u0430\u0431\u044B\u043B\u0438 \u044D\u043A\u0440\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B "/" (\u043A\u043E\u0441\u0430\u044F \u0447\u0435\u0440\u0442\u0430)? \u0427\u0442\u043E\u0431\u044B \u044D\u043A\u0440\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u0442\u044C, \u043F\u043E\u043C\u0435\u0441\u0442\u0438\u0442\u0435 \u043F\u0435\u0440\u0435\u0434 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u043C \u0434\u0432\u0435 \u043E\u0431\u0440\u0430\u0442\u043D\u044B\u0435 \u043A\u043E\u0441\u044B\u0435 \u0447\u0435\u0440\u0442\u044B, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 "\\\\/".'],"vs/platform/history/browser/contextScopedHistoryWidget":["\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043B\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F"],"vs/platform/keybinding/common/abstractKeybindingService":["\u0411\u044B\u043B\u0430 \u043D\u0430\u0436\u0430\u0442\u0430 \u043A\u043B\u0430\u0432\u0438\u0448\u0430 {0}. \u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043D\u0430\u0436\u0430\u0442\u0438\u044F \u0432\u0442\u043E\u0440\u043E\u0439 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F...","\u0411\u044B\u043B\u0430 \u043D\u0430\u0436\u0430\u0442\u0430 \u043A\u043B\u0430\u0432\u0438\u0448\u0430 ({0}). \u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043D\u0430\u0436\u0430\u0442\u0438\u044F \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F...","\u0421\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448 ({0} \u0438 {1}) \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u043E\u0439.","\u0421\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448 ({0} \u0438 {1}) \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u043E\u0439."],"vs/platform/list/browser/listService":["\u0420\u0430\u0431\u043E\u0447\u0435\u0435 \u043C\u0435\u0441\u0442\u043E","\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 CTRL \u0432 Windows \u0438 Linux \u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 COMMAND \u0432 macOS.","\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 ALT \u0432 Windows \u0438 Linux \u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 OPTION \u0432 macOS.",'\u041C\u043E\u0434\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0432 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0438 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0432 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043C\u044B\u0448\u0438 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0432 \u043F\u0440\u043E\u0432\u043E\u0434\u043D\u0438\u043A\u0435, \u0432 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0445 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430\u0445 \u0438 \u0432 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0438 scm). \u0416\u0435\u0441\u0442\u044B \u043C\u044B\u0448\u0438 "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0431\u043E\u043A\u0443" (\u0435\u0441\u043B\u0438 \u043E\u043D\u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0442\u0441\u044F) \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u0442\u0430\u043A\u0438\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C, \u0447\u0442\u043E\u0431\u044B \u043E\u043D\u0438 \u043D\u0435 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u043E\u0432\u0430\u043B\u0438 \u0441 \u043C\u043E\u0434\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430.',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043A\u0430\u043A \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0432 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0438 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043C\u044B\u0448\u0438 (\u0435\u0441\u043B\u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F). \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435, \u0447\u0442\u043E \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043C\u043E\u0436\u0435\u0442 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0432 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0438 \u0441\u043F\u0438\u0441\u043A\u0430\u0445, \u0435\u0441\u043B\u0438 \u043E\u043D \u043D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u043A \u043D\u0438\u043C.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0442 \u043B\u0438 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0443\u044E \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0443 \u0441\u043F\u0438\u0441\u043A\u0438 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F \u043D\u0430 \u0440\u0430\u0431\u043E\u0447\u0435\u043C \u043C\u0435\u0441\u0442\u0435. \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435! \u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u044D\u0442\u043E\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 \u043C\u043E\u0436\u0435\u0442 \u043F\u043E\u0432\u043B\u0438\u044F\u0442\u044C \u043D\u0430 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0449\u0435\u043B\u043A\u0430\u0442\u044C \u043F\u043E\u043B\u043E\u0441\u0443 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043F\u043E\u0441\u0442\u0440\u0430\u043D\u0438\u0447\u043D\u043E.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043E\u0442\u0441\u0442\u0443\u043F \u0434\u043B\u044F \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043D\u0443\u0436\u043D\u043E \u043B\u0438 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u043F\u043B\u0430\u0432\u043D\u0430\u044F \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430 \u0434\u043B\u044F \u0441\u043F\u0438\u0441\u043A\u043E\u0432 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432.","\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 deltaX \u0438 deltaY \u0441\u043E\u0431\u044B\u0442\u0438\u0439 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043A\u043E\u043B\u0435\u0441\u0438\u043A\u0430 \u043C\u044B\u0448\u0438.","\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u044F \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 ALT.","\u041F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B. \u041F\u0440\u0438 \u0434\u0430\u043B\u044C\u043D\u0435\u0439\u0448\u0435\u0439 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u0432\u0435\u0440\u0445 \u0438 \u0432\u043D\u0438\u0437 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u0431\u0445\u043E\u0434 \u0442\u043E\u043B\u044C\u043A\u043E \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432.","\u0424\u0438\u043B\u044C\u0442\u0440\u0443\u0439\u0442\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0440\u0435\u0436\u0438\u043C\u043E\u043C \u043F\u043E\u0438\u0441\u043A\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0434\u043B\u044F \u0441\u043F\u0438\u0441\u043A\u043E\u0432 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432 \u0432 Workbench.","\u041F\u0440\u043E \u043F\u0440\u043E\u0441\u0442\u043E\u0439 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0432\u044B\u0431\u0438\u0440\u0430\u044E\u0442\u0441\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0432\u0432\u043E\u0434\u0438\u043C\u044B\u043C \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0434\u0430\u043D\u043D\u044B\u043C. \u0421\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043E\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u0430\u043C.","\u0424\u0443\u043D\u043A\u0446\u0438\u044F \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0432\u044B\u0434\u0435\u043B\u044F\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0432\u0432\u043E\u0434\u0438\u043C\u044B\u043C \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0434\u0430\u043D\u043D\u044B\u043C. \u041F\u0440\u0438 \u0434\u0430\u043B\u044C\u043D\u0435\u0439\u0448\u0435\u0439 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u0432\u0435\u0440\u0445 \u0438 \u0432\u043D\u0438\u0437 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u0431\u0445\u043E\u0434 \u0442\u043E\u043B\u044C\u043A\u043E \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432.","\u0424\u0438\u043B\u044C\u0442\u0440 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u043E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u043E\u0432\u0430\u0442\u044C \u0438 \u0441\u043A\u0440\u044B\u0442\u044C \u0432\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u043D\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0432\u0432\u043E\u0434\u0438\u043C\u044B\u043C \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0434\u0430\u043D\u043D\u044B\u043C.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0442\u0438\u043B\u0435\u043C \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0434\u043B\u044F \u0441\u043F\u0438\u0441\u043A\u043E\u0432 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432 \u0432 Workbench. \u0414\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u0440\u043E\u0441\u0442\u043E\u0439 \u0440\u0435\u0436\u0438\u043C, \u0440\u0435\u0436\u0438\u043C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0438 \u0440\u0435\u0436\u0438\u043C \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u0438.",'\u0412\u043C\u0435\u0441\u0442\u043E \u044D\u0442\u043E\u0433\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 "workbench.list.defaultFindMode" \u0438 "workbench.list.typeNavigationMode".',"\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043D\u0435\u0447\u0435\u0442\u043A\u043E\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043D\u0435\u043F\u0440\u0435\u0440\u044B\u0432\u043D\u043E\u0435 \u0441\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0438\u043F\u043E\u043C \u0441\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044F, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u043C \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435 \u0441\u043F\u0438\u0441\u043A\u043E\u0432 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432 \u0432 Workbench.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043A\u0430\u043A \u043F\u0430\u043F\u043A\u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043D\u0430 \u0438\u043C\u0435\u043D\u0430 \u043F\u0430\u043F\u043E\u043A. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435, \u0447\u0442\u043E \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043C\u043E\u0436\u0435\u0442 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0432 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0438 \u0441\u043F\u0438\u0441\u043A\u0430\u0445, \u0435\u0441\u043B\u0438 \u043E\u043D \u043D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u043A \u043D\u0438\u043C.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u043B\u0438 \u0437\u0430\u043B\u0438\u043F\u0430\u043D\u0438\u0435 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0432 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0437\u0430\u043B\u0438\u043F\u0430\u044E\u0449\u0438\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u044B\u0445 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043F\u0440\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 "#workbench.tree.enableStickyScroll#".','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0440\u0430\u0431\u043E\u0442\u043E\u0439 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u0442\u0438\u043F\u0430\u043C \u0432 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0432 \u0440\u0430\u0431\u043E\u0447\u0435\u0439 \u0441\u0440\u0435\u0434\u0435. \u0415\u0441\u043B\u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "trigger", \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F \u043F\u043E \u0442\u0438\u043F\u0443 \u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u0437\u0430\u043F\u0443\u0441\u043A\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u044B "list.triggerTypeNavigation".'],"vs/platform/markers/common/markers":["\u041E\u0448\u0438\u0431\u043A\u0430","\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435","\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F"],"vs/platform/quickinput/browser/commandsQuickAccess":["\u043D\u0435\u0434\u0430\u0432\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043D\u044B\u0435","\u043F\u043E\u0445\u043E\u0436\u0438\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B","\u0447\u0430\u0441\u0442\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0435","\u0434\u0440\u0443\u0433\u0438\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B","\u043F\u043E\u0445\u043E\u0436\u0438\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B","{0}, {1}",'\u041A\u043E\u043C\u0430\u043D\u0434\u0430 "{0}" \u043F\u0440\u0438\u0432\u0435\u043B\u0430 \u043A \u043E\u0448\u0438\u0431\u043A\u0435'],"vs/platform/quickinput/browser/helpQuickAccess":["{0}, {1}"],"vs/platform/quickinput/browser/quickInput":["\u041D\u0430\u0437\u0430\u0434","\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0443 \u0412\u0412\u041E\u0414, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C \u0432\u0432\u0435\u0434\u0435\u043D\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435, \u0438\u043B\u0438 ESCAPE \u0434\u043B\u044F \u043E\u0442\u043C\u0435\u043D\u044B","{0} / {1}","\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442, \u0447\u0442\u043E\u0431\u044B \u0443\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u0447\u0438\u0441\u043B\u043E \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432."],"vs/platform/quickinput/browser/quickInputController":["\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u0441\u0435 \u0444\u043B\u0430\u0436\u043A\u0438","\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B: {0}","{0} \u0432\u044B\u0431\u0440\u0430\u043D\u043E","\u041E\u041A","\u0414\u0440\u0443\u0433\u043E\u0439","\u041D\u0430\u0437\u0430\u0434 ({0})","\u041D\u0430\u0437\u0430\u0434"],"vs/platform/quickinput/browser/quickInputList":["\u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u0432\u0432\u043E\u0434"],"vs/platform/quickinput/browser/quickInputUtils":['\u0429\u0435\u043B\u043A\u043D\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u0443 "{0}"'],"vs/platform/theme/common/colorRegistry":["\u041E\u0431\u0449\u0438\u0439 \u0446\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F, \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u0435\u0433\u043E \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442.","\u041E\u0431\u0449\u0438\u0439 \u0446\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043E\u043D \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u043E\u043C.","\u041E\u0431\u0449\u0438\u0439 \u0446\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u043E\u0431 \u043E\u0448\u0438\u0431\u043A\u0430\u0445. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u0435\u0433\u043E \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430, \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043E \u043F\u043E\u044F\u0441\u043D\u0435\u043D\u0438\u044F, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0434\u043B\u044F \u043C\u0435\u0442\u043A\u0438.","\u0426\u0432\u0435\u0442 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u043A\u043E\u0432 \u043D\u0430 \u0440\u0430\u0431\u043E\u0447\u0435\u043C \u043C\u0435\u0441\u0442\u0435.","\u041E\u0431\u0449\u0438\u0439 \u0446\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u0434\u043B\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0441 \u0444\u043E\u043A\u0443\u0441\u043E\u043C. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D \u0432 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0435.","\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u0432\u043E\u043A\u0440\u0443\u0433 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u043E\u0442\u0434\u0435\u043B\u044F\u0435\u0442 \u0438\u0445 \u043E\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0434\u043B\u044F \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u044F \u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u0430.","\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u0432\u043E\u043A\u0440\u0443\u0433 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u043E\u0442\u0434\u0435\u043B\u044F\u0435\u0442 \u0438\u0445 \u043E\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0434\u043B\u044F \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u044F \u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u0440\u0430\u0431\u043E\u0447\u0435\u0439 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0432 \u043F\u043E\u043B\u044F\u0445 \u0432\u0432\u043E\u0434\u0430 \u0438\u043B\u0438 \u0432 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0445 \u043F\u043E\u043B\u044F\u0445). \u041D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u043A \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C\u0443 \u0442\u0435\u043A\u0441\u0442\u0443 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0434\u043B\u044F \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u0435\u0439 \u0442\u0435\u043A\u0441\u0442\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0441\u044B\u043B\u043E\u043A \u0432 \u0442\u0435\u043A\u0441\u0442\u0435.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0441\u044B\u043B\u043E\u043A \u0432 \u0442\u0435\u043A\u0441\u0442\u0435 \u043F\u0440\u0438 \u0449\u0435\u043B\u0447\u043A\u0435 \u0438 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430 \u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u0444\u043E\u0440\u043C\u0430\u0442\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0441\u0435\u0433\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043E\u0442\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0431\u043B\u043E\u043A\u043E\u0432 \u0441 \u0446\u0438\u0442\u0430\u0442\u0430\u043C\u0438 \u0432 \u0442\u0435\u043A\u0441\u0442\u0435.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u0434\u043B\u044F \u0431\u043B\u043E\u043A\u043E\u0432 \u0441 \u0446\u0438\u0442\u0430\u0442\u0430\u043C\u0438 \u0432 \u0442\u0435\u043A\u0441\u0442\u0435.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0432 \u0442\u0435\u043A\u0441\u0442\u0435.",'\u0426\u0432\u0435\u0442 \u0442\u0435\u043D\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A "\u041D\u0430\u0439\u0442\u0438/\u0437\u0430\u043C\u0435\u043D\u0438\u0442\u044C".','\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A "\u041D\u0430\u0439\u0442\u0438/\u0437\u0430\u043C\u0435\u043D\u0438\u0442\u044C".',"\u0424\u043E\u043D \u043F\u043E\u043B\u044F \u0432\u0432\u043E\u0434\u0430.","\u041F\u0435\u0440\u0435\u0434\u043D\u0438\u0439 \u043F\u043B\u0430\u043D \u043F\u043E\u043B\u044F \u0432\u0432\u043E\u0434\u0430.","\u0413\u0440\u0430\u043D\u0438\u0446\u0430 \u043F\u043E\u043B\u044F \u0432\u0432\u043E\u0434\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0432 \u043F\u043E\u043B\u044F\u0445 \u0432\u0432\u043E\u0434\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0432 \u043F\u043E\u043B\u044F\u0445 \u0432\u0432\u043E\u0434\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u043E\u0432\u043E\u0433\u043E \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0432 \u043F\u043E\u043B\u044F\u0445 \u0432\u0432\u043E\u0434\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0432 \u043F\u043E\u043B\u044F\u0445 \u0432\u0432\u043E\u0434\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u044F\u0441\u043D\u044F\u044E\u0449\u0435\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u0432\u0432\u043E\u0434\u0430.",'\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u0421\u0432\u0435\u0434\u0435\u043D\u0438\u044F".','\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u0421\u0432\u0435\u0434\u0435\u043D\u0438\u044F".','\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u0421\u0432\u0435\u0434\u0435\u043D\u0438\u044F".','\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435".','\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435".','\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435".','\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041E\u0448\u0438\u0431\u043A\u0430".','\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041E\u0448\u0438\u0431\u043A\u0430".','\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041E\u0448\u0438\u0431\u043A\u0430".',"\u0424\u043E\u043D \u0440\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E\u0441\u044F \u0441\u043F\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0440\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E\u0441\u044F \u0441\u043F\u0438\u0441\u043A\u0430.","\u041F\u0435\u0440\u0435\u0434\u043D\u0438\u0439 \u043F\u043B\u0430\u043D \u0440\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E\u0441\u044F \u0441\u043F\u0438\u0441\u043A\u0430.","\u0413\u0440\u0430\u043D\u0438\u0446\u0430 \u0440\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E\u0441\u044F \u0441\u043F\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0438.","\u0426\u0432\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044F \u043A\u043D\u043E\u043F\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0438 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043A\u043D\u043E\u043F\u043A\u0438.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u0442\u043E\u0440\u0438\u0447\u043D\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u0442\u043E\u0440\u0438\u0447\u043D\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u0442\u043E\u0440\u0438\u0447\u043D\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u0438 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0431\u044D\u0434\u0436\u0430. \u0411\u044D\u0434\u0436\u0438 - \u043D\u0435\u0431\u043E\u043B\u044C\u0448\u0438\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0449\u0438\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u043E\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430 \u0431\u044D\u0434\u0436\u0430. \u0411\u044D\u0434\u0436\u0438 - \u043D\u0435\u0431\u043E\u043B\u044C\u0448\u0438\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0449\u0438\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u043E\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043D\u0438 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0443\u0435\u0442 \u043E \u0442\u043E\u043C, \u0447\u0442\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043F\u0440\u0438 \u0449\u0435\u043B\u0447\u043A\u0435 \u043F\u043E \u043D\u0435\u043C\u0443.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0438\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440\u0430 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043C\u043E\u0436\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430 \u043E\u0448\u0438\u0431\u043A\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0432\u043E\u043B\u043D\u0438\u0441\u0442\u043E\u0439 \u043B\u0438\u043D\u0438\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043E\u0448\u0438\u0431\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0415\u0441\u043B\u0438 \u0437\u0430\u0434\u0430\u043D\u043E, \u0446\u0432\u0435\u0442 \u0434\u0432\u043E\u0439\u043D\u043E\u0433\u043E \u043F\u043E\u0434\u0447\u0435\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u044F \u043E\u0448\u0438\u0431\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430 \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0432\u043E\u043B\u043D\u0438\u0441\u0442\u043E\u0439 \u043B\u0438\u043D\u0438\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0415\u0441\u043B\u0438 \u0437\u0430\u0434\u0430\u043D\u043E, \u0446\u0432\u0435\u0442 \u0434\u0432\u043E\u0439\u043D\u043E\u0433\u043E \u043F\u043E\u0434\u0447\u0435\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0432\u043E\u043B\u043D\u0438\u0441\u0442\u043E\u0439 \u043B\u0438\u043D\u0438\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0415\u0441\u043B\u0438 \u0437\u0430\u0434\u0430\u043D\u043E, \u0446\u0432\u0435\u0442 \u0434\u0432\u043E\u0439\u043D\u043E\u0433\u043E \u043F\u043E\u0434\u0447\u0435\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0432\u043E\u043B\u043D\u0438\u0441\u0442\u043E\u0439 \u043B\u0438\u043D\u0438\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0415\u0441\u043B\u0438 \u0437\u0430\u0434\u0430\u043D\u043E, \u0446\u0432\u0435\u0442 \u0434\u0432\u043E\u0439\u043D\u043E\u0433\u043E \u043F\u043E\u0434\u0447\u0435\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u044F \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043B\u0435\u043D\u0442.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043B\u0438\u043F\u043A\u043E\u0439 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043B\u0438\u043F\u043A\u043E\u0439 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435","\u0426\u0432\u0435\u0442 \u0442\u0435\u043D\u0438 \u043B\u0438\u043F\u043A\u043E\u0439 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435"," \u0426\u0432\u0435\u0442 \u0442\u0435\u043D\u0438 \u043B\u0438\u043F\u043A\u043E\u0439 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A \u043D\u0430\u0439\u0442\u0438/\u0437\u0430\u043C\u0435\u043D\u0438\u0442\u044C.",'\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A "\u041F\u043E\u0438\u0441\u043A/\u0437\u0430\u043C\u0435\u043D\u0430".',"\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u0443 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0435\u0441\u0442\u044C \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u0438 \u0435\u0441\u043B\u0438 \u044D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u043C.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0430\u043D\u0435\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u0443 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0435\u0441\u0442\u044C \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u0434\u043B\u044F \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u0438 \u0435\u0441\u043B\u0438 \u044D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u043C.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430. \u041C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u043E\u043C \u0434\u043B\u044F \u0442\u0430\u043A\u0438\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0432\u044B\u0431\u043E\u0440\u0430, \u043A\u0430\u043A \u043F\u0430\u043B\u0438\u0442\u0440\u0430 \u043A\u043E\u043C\u0430\u043D\u0434.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430. \u041C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u043E\u043C \u0434\u043B\u044F \u0442\u0430\u043A\u0438\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0432\u044B\u0431\u043E\u0440\u0430, \u043A\u0430\u043A \u043F\u0430\u043B\u0438\u0442\u0440\u0430 \u043A\u043E\u043C\u0430\u043D\u0434.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430. \u041C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u043E\u043C \u0434\u043B\u044F \u0442\u0430\u043A\u0438\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0432\u044B\u0431\u043E\u0440\u0430, \u043A\u0430\u043A \u043F\u0430\u043B\u0438\u0442\u0440\u0430 \u043A\u043E\u043C\u0430\u043D\u0434.","\u0426\u0432\u0435\u0442 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0434\u043B\u044F \u0433\u0440\u0443\u043F\u043F\u0438\u0440\u043E\u0432\u043A\u0438 \u043C\u0435\u0442\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0434\u043B\u044F \u0433\u0440\u0443\u043F\u043F\u0438\u0440\u043E\u0432\u043A\u0438 \u0433\u0440\u0430\u043D\u0438\u0446.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043C\u0435\u0442\u043A\u0438 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448. \u041C\u0435\u0442\u043A\u0430 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0434\u043B\u044F \u043E\u0431\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043C\u0435\u0442\u043A\u0438 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448. \u041C\u0435\u0442\u043A\u0430 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0434\u043B\u044F \u043E\u0431\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043C\u0435\u0442\u043A\u0438 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448. \u041C\u0435\u0442\u043A\u0430 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0434\u043B\u044F \u043E\u0431\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448.","\u0426\u0432\u0435\u0442 \u043D\u0438\u0436\u043D\u0435\u0439 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043C\u0435\u0442\u043A\u0438 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448. \u041C\u0435\u0442\u043A\u0430 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0434\u043B\u044F \u043E\u0431\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0432\u044B\u0441\u043E\u043A\u043E\u0433\u043E \u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u0430.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0441\u0442\u0435\u0439, \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0435\u0442 \u0441 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u043C \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u043C. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0440\u0435\u0433\u0438\u043E\u043D\u043E\u0432 \u0441 \u0442\u0435\u043C \u0436\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u044B\u043C, \u0447\u0442\u043E \u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u043F\u043E\u0438\u0441\u043A\u0430 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0430, \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043F\u043E\u0438\u0441\u043A. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0430 \u043F\u043E\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u043E\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0430, \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043F\u043E\u0438\u0441\u043A. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439 \u0434\u043B\u044F \u0437\u0430\u043F\u0440\u043E\u0441\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0445 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u043F\u043E\u0438\u0441\u043A\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0432\u044C\u044E\u043B\u0435\u0442\u0430.","\u0412\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043F\u043E\u0434 \u0441\u043B\u043E\u0432\u043E\u043C, \u0434\u043B\u044F \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043C\u0435\u043D\u044E \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0438 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u0441\u0441\u044B\u043B\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439 \u0434\u043B\u044F \u0448\u0440\u0438\u0444\u0442\u043E\u0432","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439 \u0434\u043B\u044F \u0448\u0440\u0438\u0444\u0442\u043E\u0432","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439 \u0434\u043B\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439 \u0434\u043B\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u043A\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u043C\u0435\u043D\u044E \u043B\u0430\u043C\u043F\u043E\u0447\u043A\u0438.","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u043A\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0432 \u043C\u0435\u043D\u044E \u043B\u0430\u043C\u043F\u043E\u0447\u043A\u0438.","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u043A\u0430 \u0418\u0418 \u0441 \u043B\u0430\u043C\u043F\u043E\u0447\u043A\u043E\u0439.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u043F\u043E\u043B\u044F, \u0433\u0434\u0435 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u044B \u0441\u0442\u0440\u043E\u043A\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u043F\u043E\u043B\u044F, \u0433\u0434\u0435 \u0443\u0434\u0430\u043B\u0435\u043D\u044B \u0441\u0442\u0440\u043E\u043A\u0438.","\u041F\u0435\u0440\u0435\u0434\u043D\u0438\u0439 \u043F\u043B\u0430\u043D \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u0439 \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E.","\u041F\u0435\u0440\u0435\u0434\u043D\u0438\u0439 \u043F\u043B\u0430\u043D \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u0439 \u0434\u043B\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u0434\u043B\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043C\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043C\u044F \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u043C\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430\u043C\u0438.","\u0426\u0432\u0435\u0442 \u0434\u0438\u0430\u0433\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0439 \u0437\u0430\u043B\u0438\u0432\u043A\u0438 \u0434\u043B\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439. \u0414\u0438\u0430\u0433\u043E\u043D\u0430\u043B\u044C\u043D\u0430\u044F \u0437\u0430\u043B\u0438\u0432\u043A\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0432 \u0440\u0430\u0437\u043C\u0435\u0449\u0430\u0435\u043C\u044B\u0445 \u0440\u044F\u0434\u043E\u043C \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044F\u0445 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0445 \u0431\u043B\u043E\u043A\u043E\u0432 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0445 \u0431\u043B\u043E\u043A\u043E\u0432 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C\xA0\u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D \u0438 \u0432\u044B\u0431\u0440\u0430\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0437\u043D\u0430\u0447\u043A\u0430 \u0441\u043F\u0438\u0441\u043A\u0430 \u0438\u043B\u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u043B\u044F \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430, \u043A\u043E\u0433\u0434\u0430 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u043B\u0438 \u0434\u0435\u0440\u0435\u0432\u043E \u0430\u043A\u0442\u0438\u0432\u043D\u044B. \u0410\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u043B\u0438 \u0434\u0435\u0440\u0435\u0432\u043E \u043D\u0430\u0445\u043E\u0434\u044F\u0442\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u2014 \u043D\u0435\u0442.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0437\u043D\u0430\u0447\u043A\u0430 \u0441\u043F\u0438\u0441\u043A\u0430 \u0438\u043B\u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u043B\u044F \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430, \u043A\u043E\u0433\u0434\u0430 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u043B\u0438 \u0434\u0435\u0440\u0435\u0432\u043E \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B. \u0410\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0438\u043B\u0438 \u0434\u0435\u0440\u0435\u0432\u043E \u043D\u0430\u0445\u043E\u0434\u044F\u0442\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u2014 \u043D\u0435\u0442.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u043D\u0435 \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u043D\u0435 \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C\xA0\u2014 \u043D\u0435\u0442.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 List/Tree \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 List/Tree \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438.","\u041F\u0435\u0440\u0435\u0442\u0430\u0441\u043A\u0438\u0432\u0430\u043D\u0438\u0435 \u0444\u043E\u043D\u0430 \u0441\u043F\u0438\u0441\u043A\u0430 \u0438\u043B\u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u0438 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0430\u0434 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430\u043C\u0438 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043C\u044B\u0448\u0438.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0435\u0440\u0435\u0442\u0430\u0441\u043A\u0438\u0432\u0430\u043D\u0438\u044F \u0441\u043F\u0438\u0441\u043A\u0430/\u0434\u0435\u0440\u0435\u0432\u0430 \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u0438 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430\u043C\u0438 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043C\u044B\u0448\u0438.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435 \u043F\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0443 List/Tree.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435 \u043F\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0443 List/Tree.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0441\u043F\u0438\u0441\u043A\u0430/\u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u043B\u044F \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0434\u043B\u044F \u043D\u0435\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0433\u043E \u0443\u0437\u043B\u0430 \u0432 \u043F\u0440\u043E\u0432\u043E\u0434\u043D\u0438\u043A\u0435.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0441\u043F\u0438\u0441\u043A\u0430, \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u043E\u0448\u0438\u0431\u043A\u0438.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0441\u043F\u0438\u0441\u043A\u0430, \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0438\u043B\u044C\u0442\u0440\u0430 \u0442\u0438\u043F\u043E\u0432 \u0432 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u0434\u043B\u044F \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0438\u043B\u044C\u0442\u0440\u0430 \u0442\u0438\u043F\u043E\u0432 \u0432 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u0434\u043B\u044F \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0438\u043B\u044C\u0442\u0440\u0430 \u0442\u0438\u043F\u043E\u0432 \u0432 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u043F\u0440\u0438 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043D\u0438 \u0434\u043B\u044F \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0438\u043B\u044C\u0442\u0440\u0430 \u0442\u0438\u043F\u043E\u0432 \u0432 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u043E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0448\u0442\u0440\u0438\u0445\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u043B\u044F \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043E\u0442\u0441\u0442\u0443\u043F\u0430.","\u0426\u0432\u0435\u0442 \u0448\u0442\u0440\u0438\u0445\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u043B\u044F \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043E\u0442\u0441\u0442\u0443\u043F\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0442\u0430\u0431\u043B\u0438\u0446\u044B \u043C\u0435\u0436\u0434\u0443 \u0441\u0442\u043E\u043B\u0431\u0446\u0430\u043C\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u043D\u0435\u0447\u0435\u0442\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A \u0442\u0430\u0431\u043B\u0438\u0446\u044B.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435/\u0434\u0435\u0440\u0435\u0432\u0435 \u0434\u043B\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432, \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043E\u0442\u043C\u0435\u043D\u0435\u043D\u043E.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u043B\u0430\u0436\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0444\u043B\u0430\u0436\u043A\u0430 \u043F\u0440\u0438 \u0432\u044B\u0431\u043E\u0440\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430, \u0432 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u043E\u043D \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u043B\u0430\u0436\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u043B\u0430\u0436\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u0444\u043B\u0430\u0436\u043A\u0430, \u043A\u043E\u0433\u0434\u0430 \u0432\u044B\u0431\u0440\u0430\u043D \u044D\u043B\u0435\u043C\u0435\u043D\u0442, \u0432 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u043E\u043D \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F.","\u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C quickInputList.focusBackground.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0434\u043B\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0444\u043E\u043A\u0443\u0441.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0437\u043D\u0430\u0447\u043A\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0434\u043B\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0444\u043E\u043A\u0443\u0441.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0434\u043B\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0444\u043E\u043A\u0443\u0441.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043F\u0443\u043D\u043A\u0442\u043E\u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u0443\u043D\u043A\u0442\u043E\u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u0443\u043D\u043A\u0442\u0430 \u043C\u0435\u043D\u044E \u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u0443\u043D\u043A\u0442\u0430 \u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u0443\u043D\u043A\u0442\u0430 \u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044F \u043C\u0435\u043D\u044E \u0432 \u043C\u0435\u043D\u044E.","\u0424\u043E\u043D \u043F\u0430\u043D\u0435\u043B\u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043C\u044B\u0448\u0438 \u043D\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F","\u041A\u043E\u043D\u0442\u0443\u0440 \u043F\u0430\u043D\u0435\u043B\u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043C\u044B\u0448\u0438 \u043D\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F","\u0424\u043E\u043D \u043F\u0430\u043D\u0435\u043B\u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u0440\u0438 \u0443\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043C\u044B\u0448\u0438 \u043D\u0430\u0434 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F\u043C\u0438","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430.","\u0412\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0446\u0432\u0435\u0442\u043E\u043C \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0432 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430.","\u0426\u0432\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438, \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0438\u0445\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.","\u0426\u0432\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438, \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0438\u0445\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0432\u044B\u0431\u043E\u0440\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.","\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u0446\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u043F\u0440\u0438 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0430\u0445 \u0441\u043B\u0438\u044F\u043D\u0438\u044F. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0424\u043E\u043D \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u043F\u0440\u0438 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0430\u0445 \u0441\u043B\u0438\u044F\u043D\u0438\u044F. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0424\u043E\u043D \u0432\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u043F\u0440\u0438 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0430\u0445 \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0424\u043E\u043D \u0432\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u043F\u0440\u0438 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0430\u0445 \u0441\u043B\u0438\u044F\u043D\u0438\u044F. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0424\u043E\u043D \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u043E\u0431\u0449\u0435\u0433\u043E \u043F\u0440\u0435\u0434\u043A\u0430 \u0432\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0430\u0445 \u0441\u043B\u0438\u044F\u043D\u0438\u044F. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0424\u043E\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u043E\u0431\u0449\u0435\u0433\u043E \u043F\u0440\u0435\u0434\u043A\u0430 \u0432\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0430\u0445 \u0441\u043B\u0438\u044F\u043D\u0438\u044F. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0438 \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044F \u0432\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0430\u0445 \u0441\u043B\u0438\u044F\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u043E\u043A\u043D\u0430 \u0432\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0430\u0445 \u0441\u043B\u0438\u044F\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E \u043E\u043A\u043D\u0430 \u0432\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0430\u0445 \u0441\u043B\u0438\u044F\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u043E\u0431\u0449\u0435\u0433\u043E \u043F\u0440\u0435\u0434\u043A\u0430 \u0432\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u0430\u0445 \u0441\u043B\u0438\u044F\u043D\u0438\u044F. ","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u041C\u0430\u0440\u043A\u0435\u0440 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B \u0434\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u044E\u0449\u0438\u0445\u0441\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B \u0434\u043B\u044F \u0432\u044B\u0431\u043E\u0440\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043D\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0435 \u0434\u043B\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043C\u0438\u043D\u0438\u043A\u0430\u0440\u0442\u044B \u0434\u043B\u044F \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043C\u0438\u043D\u0438\u043A\u0430\u0440\u0442\u044B \u0434\u043B\u044F \u043E\u0448\u0438\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B.",'\u041F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0441\u0442\u044C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u0430\u044F \u0433\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0435. \u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, "#000000c0" \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0441 \u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0441\u0442\u044C\u044E 75%.',"\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043D\u0430 \u043D\u0435\u0433\u043E \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B \u043F\u0440\u0438 \u0435\u0433\u043E \u0449\u0435\u043B\u0447\u043A\u0435.","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u043A\u0430 \u043E\u0448\u0438\u0431\u043A\u0438, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043D\u0430 \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C.","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0430\u044E\u0449\u0435\u0433\u043E \u0437\u043D\u0430\u0447\u043A\u0430, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043D\u0430 \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C.","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u043A\u0430, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043D\u0430 \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043D\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043C\u043C\u0430\u0445.","\u0426\u0432\u0435\u0442 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0445 \u043B\u0438\u043D\u0438\u0439 \u043D\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043C\u043C\u0430\u0445.","\u041A\u0440\u0430\u0441\u043D\u044B\u0439 \u0446\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0432 \u0432\u0438\u0437\u0443\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u0445 \u0434\u0438\u0430\u0433\u0440\u0430\u043C\u043C.","\u0421\u0438\u043D\u0438\u0439 \u0446\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0432 \u0432\u0438\u0437\u0443\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u0445 \u0434\u0438\u0430\u0433\u0440\u0430\u043C\u043C.","\u0416\u0435\u043B\u0442\u044B\u0439 \u0446\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0432 \u0432\u0438\u0437\u0443\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u0445 \u0434\u0438\u0430\u0433\u0440\u0430\u043C\u043C.","\u041E\u0440\u0430\u043D\u0436\u0435\u0432\u044B\u0439 \u0446\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0432 \u0432\u0438\u0437\u0443\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u0445 \u0434\u0438\u0430\u0433\u0440\u0430\u043C\u043C.","\u0417\u0435\u043B\u0435\u043D\u044B\u0439 \u0446\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0432 \u0432\u0438\u0437\u0443\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u0445 \u0434\u0438\u0430\u0433\u0440\u0430\u043C\u043C.","\u041B\u0438\u043B\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0432 \u0432\u0438\u0437\u0443\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u0445 \u0434\u0438\u0430\u0433\u0440\u0430\u043C\u043C."],"vs/platform/theme/common/iconRegistry":["\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0433\u043E \u0448\u0440\u0438\u0444\u0442\u0430. \u0415\u0441\u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043D\u0435 \u0437\u0430\u0434\u0430\u043D, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0448\u0440\u0438\u0444\u0442, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u043F\u0435\u0440\u0432\u044B\u043C.","\u0421\u0438\u043C\u0432\u043E\u043B \u0448\u0440\u0438\u0444\u0442\u0430, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0439 \u0441 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435\u043C \u0437\u043D\u0430\u0447\u043A\u0430.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u0445.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044E \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044E \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435."],"vs/platform/undoRedo/common/undoRedoService":["\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435 \u0444\u0430\u0439\u043B\u044B \u0431\u044B\u043B\u0438 \u0437\u0430\u043A\u0440\u044B\u0442\u044B \u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u043D\u0430 \u0434\u0438\u0441\u043A\u0435: {0}.","\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435 \u0444\u0430\u0439\u043B\u044B \u0431\u044B\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u043D\u0435\u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u044B\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C: {0}.",'\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432. {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432. {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044E "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0431\u044B\u043B\u0438 \u0432\u043D\u0435\u0441\u0435\u043D\u044B \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0432 {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0432 {1} \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u043B\u0430\u0441\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F','\u0412\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432?',"&&\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 \u0444\u0430\u0439\u043B\u0430\u0445 {0}","\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u044D\u0442\u043E\u0442 &&\u0444\u0430\u0439\u043B",'\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}", \u0442\u0430\u043A \u043A\u0430\u043A \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F','\u0412\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C "{0}"?',"&&\u0414\u0430","\u041D\u0435\u0442",'\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044E "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432. {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044E "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432. {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044E "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0431\u044B\u043B\u0438 \u0432\u043D\u0435\u0441\u0435\u043D\u044B \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0432 {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0434\u043B\u044F {1} \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F.','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u043B\u0430\u0441\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}", \u0442\u0430\u043A \u043A\u0430\u043A \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F'],"vs/platform/workspace/common/workspace":["\u0420\u0430\u0431\u043E\u0447\u0430\u044F \u043E\u0431\u043B\u0430\u0441\u0442\u044C \u043A\u043E\u0434\u0430"]});
+
+//# sourceMappingURL=../../../min-maps/vs/editor/editor.main.nls.ru.js.map
\ No newline at end of file
diff --git a/public/vs/editor/editor.main.nls.zh-cn.js b/public/vs/editor/editor.main.nls.zh-cn.js
new file mode 100644
index 0000000..1a31944
--- /dev/null
+++ b/public/vs/editor/editor.main.nls.zh-cn.js
@@ -0,0 +1,15 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.zh-cn",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["\u8F93\u5165"],"vs/base/browser/ui/findinput/findInputToggles":["\u533A\u5206\u5927\u5C0F\u5199","\u5168\u5B57\u5339\u914D","\u4F7F\u7528\u6B63\u5219\u8868\u8FBE\u5F0F"],"vs/base/browser/ui/findinput/replaceInput":["\u8F93\u5165","\u4FDD\u7559\u5927\u5C0F\u5199"],"vs/base/browser/ui/hover/hoverWidget":["\u5728\u8F85\u52A9\u89C6\u56FE\u4E2D\u7528 {0} \u68C0\u67E5\u6B64\u9879\u3002","\u901A\u8FC7\u547D\u4EE4\u201C\u6253\u5F00\u8F85\u52A9\u89C6\u56FE\u201D\u5728\u8F85\u52A9\u89C6\u56FE\u4E2D\u68C0\u67E5\u6B64\u9879\uFF0C\u8BE5\u547D\u4EE4\u5F53\u524D\u65E0\u6CD5\u901A\u8FC7\u952E\u7ED1\u5B9A\u89E6\u53D1\u3002"],"vs/base/browser/ui/iconLabel/iconLabelHover":["\u6B63\u5728\u52A0\u8F7D\u2026"],"vs/base/browser/ui/inputbox/inputBox":["\u9519\u8BEF: {0}","\u8B66\u544A: {0}","\u4FE1\u606F: {0}"," \u6216\u4F7F\u7528 {0} \u4EE5\u67E5\u770B\u5386\u53F2\u8BB0\u5F55"," (\u4F7F\u7528 {0} \u67E5\u770B\u5386\u53F2\u8BB0\u5F55)","\u6E05\u9664\u7684\u8F93\u5165"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\u672A\u7ED1\u5B9A"],"vs/base/browser/ui/selectBox/selectBoxCustom":["\u9009\u62E9\u6846"],"vs/base/browser/ui/toolbar/toolbar":["\u66F4\u591A\u64CD\u4F5C..."],"vs/base/browser/ui/tree/abstractTree":["\u7B5B\u9009\u5668","\u6A21\u7CCA\u5339\u914D","\u8981\u7B5B\u9009\u7684\u7C7B\u578B","\u8981\u641C\u7D22\u7684\u7C7B\u578B","\u8981\u641C\u7D22\u7684\u7C7B\u578B","\u5173\u95ED","\u672A\u627E\u5230\u5143\u7D20\u3002"],"vs/base/common/actions":["(\u7A7A)"],"vs/base/common/errorMessage":["{0}: {1}","\u53D1\u751F\u4E86\u7CFB\u7EDF\u9519\u8BEF ({0})","\u51FA\u73B0\u672A\u77E5\u9519\u8BEF\u3002\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F\uFF0C\u8BF7\u53C2\u9605\u65E5\u5FD7\u3002","\u51FA\u73B0\u672A\u77E5\u9519\u8BEF\u3002\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F\uFF0C\u8BF7\u53C2\u9605\u65E5\u5FD7\u3002","{0} \u4E2A(\u5171 {1} \u4E2A\u9519\u8BEF)","\u51FA\u73B0\u672A\u77E5\u9519\u8BEF\u3002\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F\uFF0C\u8BF7\u53C2\u9605\u65E5\u5FD7\u3002"],"vs/base/common/keybindingLabels":["Ctrl","Shift","Alt","Windows","Ctrl","Shift","Alt","\u8D85\u952E","Control","Shift","\u9009\u9879","Command","Control","Shift","Alt","Windows","Control","Shift","Alt","\u8D85\u952E"],"vs/base/common/platform":["_"],"vs/editor/browser/controller/textAreaHandler":["\u7F16\u8F91\u5668","\u73B0\u5728\u65E0\u6CD5\u8BBF\u95EE\u7F16\u8F91\u5668\u3002","{0} \u82E5\u8981\u542F\u7528\u5C4F\u5E55\u9605\u8BFB\u5668\u4F18\u5316\u6A21\u5F0F\uFF0C\u8BF7\u4F7F\u7528 {1}","{0} \u82E5\u8981\u542F\u7528\u5C4F\u5E55\u9605\u8BFB\u5668\u4F18\u5316\u6A21\u5F0F\uFF0C\u8BF7\u4F7F\u7528 {1} \u6253\u5F00\u5FEB\u901F\u9009\u53D6\uFF0C\u7136\u540E\u8FD0\u884C\u201C\u5207\u6362\u5C4F\u5E55\u9605\u8BFB\u5668\u8F85\u52A9\u529F\u80FD\u6A21\u5F0F\u201D\u547D\u4EE4\uFF1B\u5F53\u524D\u65E0\u6CD5\u901A\u8FC7\u952E\u76D8\u89E6\u53D1\u6B64\u547D\u4EE4\u3002","{0} \u8BF7\u901A\u8FC7\u4F7F\u7528 {1} \u8BBF\u95EE\u952E\u7ED1\u5B9A\u7F16\u8F91\u5668\u5E76\u8FD0\u884C\u5B83\uFF0C\u4E3A\u201C\u5207\u6362\u5C4F\u5E55\u9605\u8BFB\u5668\u8F85\u52A9\u529F\u80FD\u6A21\u5F0F\u201D\u547D\u4EE4\u5206\u914D\u952E\u7ED1\u5B9A\u3002"],"vs/editor/browser/coreCommands":["\u5373\u4F7F\u8F6C\u5230\u8F83\u957F\u7684\u884C\uFF0C\u4E5F\u4E00\u76F4\u5230\u672B\u5C3E","\u5373\u4F7F\u8F6C\u5230\u8F83\u957F\u7684\u884C\uFF0C\u4E5F\u4E00\u76F4\u5230\u672B\u5C3E","\u5DF2\u5220\u9664\u8F85\u52A9\u6E38\u6807"],"vs/editor/browser/editorExtensions":["\u64A4\u6D88(&&U)","\u64A4\u6D88","\u6062\u590D(&&R)","\u6062\u590D","\u5168\u9009(&&S)","\u9009\u62E9\u5168\u90E8"],"vs/editor/browser/widget/codeEditorWidget":["\u5DF2\u5C06\u5149\u6807\u6570\u9650\u5236\u4E3A {0}\u3002\u8BF7\u8003\u8651\u4F7F\u7528 [\u67E5\u627E\u548C\u66FF\u6362](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace)\u8FDB\u884C\u8F83\u5927\u7684\u66F4\u6539\u6216\u589E\u52A0\u7F16\u8F91\u5668\u591A\u5149\u6807\u9650\u5236\u8BBE\u7F6E\u3002","\u589E\u52A0\u591A\u5149\u6807\u9650\u5236"],"vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer":["\u53EF\u8BBF\u95EE\u5DEE\u5F02\u67E5\u770B\u5668\u4E2D\u201C\u63D2\u5165\u201D\u7684\u56FE\u6807\u3002","\u53EF\u8BBF\u95EE\u5DEE\u5F02\u67E5\u770B\u5668\u4E2D\u201C\u5220\u9664\u201D\u7684\u56FE\u6807\u3002","\u53EF\u8BBF\u95EE\u5DEE\u5F02\u67E5\u770B\u5668\u4E2D\u201C\u5173\u95ED\u201D\u7684\u56FE\u6807\u3002","\u5173\u95ED","\u53EF\u8BBF\u95EE\u7684\u5DEE\u5F02\u67E5\u770B\u5668\u3002\u4F7F\u7528\u5411\u4E0A\u548C\u5411\u4E0B\u7BAD\u5934\u5BFC\u822A\u3002","\u672A\u66F4\u6539\u884C","\u66F4\u6539\u4E86 1 \u884C","\u66F4\u6539\u4E86 {0} \u884C","\u5DEE\u5F02 {0}/ {1}: \u539F\u59CB\u884C {2}\uFF0C{3}\uFF0C\u4FEE\u6539\u540E\u7684\u884C {4}\uFF0C{5}","\u7A7A\u767D","{0} \u672A\u66F4\u6539\u7684\u884C {1}","{0}\u539F\u59CB\u884C{1}\u4FEE\u6539\u7684\u884C{2}","+ {0}\u4FEE\u6539\u7684\u884C{1}","- {0}\u539F\u59CB\u884C{1}"],"vs/editor/browser/widget/diffEditor/components/diffEditorEditors":[" \u4F7F\u7528 {0} \u6253\u5F00\u8F85\u52A9\u529F\u80FD\u5E2E\u52A9\u3002"],"vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin":["\u590D\u5236\u5DF2\u5220\u9664\u7684\u884C","\u590D\u5236\u5DF2\u5220\u9664\u7684\u884C","\u590D\u5236\u66F4\u6539\u7684\u884C","\u590D\u5236\u66F4\u6539\u7684\u884C","\u590D\u5236\u5DF2\u5220\u9664\u7684\u884C({0})","\u590D\u5236\u66F4\u6539\u7684\u884C({0})","\u8FD8\u539F\u6B64\u66F4\u6539"],"vs/editor/browser/widget/diffEditor/diffEditor.contribution":["\u7A7A\u95F4\u53D7\u9650\u65F6\u4F7F\u7528\u5185\u8054\u89C6\u56FE","\u663E\u793A\u79FB\u52A8\u7684\u4EE3\u7801\u5757","\u5DEE\u5F02\u7F16\u8F91\u5668","\u53EF\u8BBF\u95EE\u7684\u5DEE\u5F02\u67E5\u770B\u5668","\u6253\u5F00\u53EF\u8BBF\u95EE\u5DEE\u5F02\u67E5\u770B\u5668","\u5207\u6362\u6298\u53E0\u672A\u66F4\u6539\u7684\u533A\u57DF","\u5207\u6362\u663E\u793A\u79FB\u52A8\u7684\u4EE3\u7801\u5757","\u5728\u7A7A\u95F4\u53D7\u9650\u65F6\u5207\u6362\u4F7F\u7528\u5185\u8054\u89C6\u56FE","\u5207\u6362\u4FA7\u9762","\u9000\u51FA\u6BD4\u8F83\u79FB\u52A8","\u6298\u53E0\u6240\u6709\u672A\u66F4\u6539\u7684\u533A\u57DF","\u663E\u793A\u6240\u6709\u672A\u66F4\u6539\u7684\u533A\u57DF","\u8F6C\u81F3\u4E0B\u4E00\u4E2A\u5DEE\u5F02","\u8F6C\u81F3\u4E0A\u4E00\u4E2A\u5DEE\u5F02"],"vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature":["\u6298\u53E0\u672A\u66F4\u6539\u7684\u533A\u57DF","\u5355\u51FB\u6216\u62D6\u52A8\u53EF\u5728\u4E0A\u9762\u663E\u793A\u66F4\u591A\u5185\u5BB9","\u663E\u793A\u672A\u66F4\u6539\u7684\u533A\u57DF","\u5355\u51FB\u6216\u62D6\u52A8\u53EF\u5728\u4E0B\u65B9\u663E\u793A\u66F4\u591A\u5185\u5BB9","{0} \u4E2A\u9690\u85CF\u7684\u884C","\u53CC\u51FB\u5C55\u5F00"],"vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature":["\u4EE3\u7801\u5DF2\u79FB\u52A8\u81F3\u884C {0}-{1}\uFF0C\u6709\u66F4\u6539","\u4EE3\u7801\u5DF2\u4ECE\u884C {0}-{1} \u79FB\u52A8\uFF0C\u6709\u66F4\u6539","\u4EE3\u7801\u5DF2\u79FB\u52A8\u5230\u884C {0} {1}","\u4EE3\u7801\u5DF2\u4ECE\u884C {0}-{1} \u79FB\u52A8"],"vs/editor/browser/widget/diffEditor/features/revertButtonsFeature":["\u8FD8\u539F\u6240\u9009\u66F4\u6539","\u8FD8\u539F\u66F4\u6539"],"vs/editor/browser/widget/diffEditor/registrations.contribution":["\u5728\u5DEE\u5F02\u7F16\u8F91\u5668\u4E2D\u79FB\u52A8\u7684\u6587\u672C\u7684\u8FB9\u6846\u989C\u8272\u3002","\u5728\u5DEE\u5F02\u7F16\u8F91\u5668\u4E2D\u79FB\u52A8\u7684\u6587\u672C\u7684\u6D3B\u52A8\u8FB9\u6846\u989C\u8272\u3002","\u672A\u66F4\u6539\u533A\u57DF\u5C0F\u7EC4\u4EF6\u5468\u56F4\u7684\u9634\u5F71\u989C\u8272\u3002","\u5DEE\u5F02\u7F16\u8F91\u5668\u4E2D\u63D2\u5165\u9879\u7684\u7EBF\u6761\u4FEE\u9970\u3002","\u5DEE\u5F02\u7F16\u8F91\u5668\u4E2D\u5220\u9664\u9879\u7684\u7EBF\u6761\u4FEE\u9970\u3002"],"vs/editor/browser/widget/hoverWidget/hoverWidget":["\u6309\u4F4F {0} \u952E\u5C06\u9F20\u6807\u60AC\u505C"],"vs/editor/browser/widget/multiDiffEditorWidget/colors":["\u5DEE\u5F02\u7F16\u8F91\u5668\u6807\u9898\u7684\u80CC\u666F\u8272","\u591A\u6587\u4EF6\u5DEE\u5F02\u7F16\u8F91\u5668\u7684\u80CC\u666F\u8272","\u591A\u6587\u4EF6\u5DEE\u5F02\u7F16\u8F91\u5668\u7684\u8FB9\u6846\u989C\u8272"],"vs/editor/common/config/editorConfigurationSchema":["\u7F16\u8F91\u5668","\u4E00\u4E2A\u5236\u8868\u7B26\u7B49\u4E8E\u7684\u7A7A\u683C\u6570\u3002\u5F53 {0} \u6253\u5F00\u65F6\uFF0C\u5C06\u6839\u636E\u6587\u4EF6\u5185\u5BB9\u66FF\u4EE3\u6B64\u8BBE\u7F6E\u3002",'\u7528\u4E8E\u7F29\u8FDB\u6216 `"tabSize"` \u7684\u7A7A\u683C\u6570\uFF0C\u53EF\u4F7F\u7528 `#editor.tabSize#` \u4E2D\u7684\u503C\u3002\u5F53 `#editor.detectIndentation#` \u5904\u4E8E\u6253\u5F00\u72B6\u6001\u65F6\uFF0C\u5C06\u6839\u636E\u6587\u4EF6\u5185\u5BB9\u66FF\u4EE3\u6B64\u8BBE\u7F6E\u3002',"\u6309 `Tab` \u65F6\u63D2\u5165\u7A7A\u683C\u3002\u5F53 {0} \u6253\u5F00\u65F6\uFF0C\u5C06\u6839\u636E\u6587\u4EF6\u5185\u5BB9\u66FF\u4EE3\u6B64\u8BBE\u7F6E\u3002","\u63A7\u5236\u5728\u57FA\u4E8E\u6587\u4EF6\u5185\u5BB9\u6253\u5F00\u6587\u4EF6\u65F6\u662F\u5426\u81EA\u52A8\u68C0\u6D4B {0} \u548C {1}\u3002","\u5220\u9664\u81EA\u52A8\u63D2\u5165\u7684\u5C3E\u968F\u7A7A\u767D\u7B26\u53F7\u3002","\u5BF9\u5927\u578B\u6587\u4EF6\u8FDB\u884C\u7279\u6B8A\u5904\u7406\uFF0C\u7981\u7528\u67D0\u4E9B\u5185\u5B58\u5BC6\u96C6\u578B\u529F\u80FD\u3002","\u5173\u95ED\u57FA\u4E8E\u5B57\u8BCD\u7684\u5EFA\u8BAE\u3002","\u4EC5\u5EFA\u8BAE\u6D3B\u52A8\u6587\u6863\u4E2D\u7684\u5B57\u8BCD\u3002","\u5EFA\u8BAE\u4F7F\u7528\u540C\u4E00\u8BED\u8A00\u7684\u6240\u6709\u6253\u5F00\u7684\u6587\u6863\u4E2D\u7684\u5B57\u8BCD\u3002","\u5EFA\u8BAE\u6240\u6709\u6253\u5F00\u7684\u6587\u6863\u4E2D\u7684\u5B57\u8BCD\u3002","\u63A7\u5236\u662F\u5426\u5E94\u6839\u636E\u6587\u6863\u4E2D\u7684\u5B57\u8BCD\u8BA1\u7B97\u8865\u5168\uFF0C\u4EE5\u53CA\u4ECE\u54EA\u4E9B\u6587\u6863\u4E2D\u8BA1\u7B97\u8865\u5168\u3002","\u5BF9\u6240\u6709\u989C\u8272\u4E3B\u9898\u542F\u7528\u8BED\u4E49\u7A81\u51FA\u663E\u793A\u3002","\u5BF9\u6240\u6709\u989C\u8272\u4E3B\u9898\u7981\u7528\u8BED\u4E49\u7A81\u51FA\u663E\u793A\u3002",'\u8BED\u4E49\u7A81\u51FA\u663E\u793A\u662F\u7531\u5F53\u524D\u989C\u8272\u4E3B\u9898\u7684 "semanticHighlighting" \u8BBE\u7F6E\u914D\u7F6E\u7684\u3002',"\u63A7\u5236\u662F\u5426\u4E3A\u652F\u6301\u5B83\u7684\u8BED\u8A00\u663E\u793A\u8BED\u4E49\u7A81\u51FA\u663E\u793A\u3002","\u4FDD\u6301\u901F\u89C8\u7F16\u8F91\u5668\u5904\u4E8E\u6253\u5F00\u72B6\u6001\uFF0C\u5373\u4F7F\u53CC\u51FB\u5176\u4E2D\u7684\u5185\u5BB9\u6216\u8005\u70B9\u51FB `Escape` \u952E\u4E5F\u662F\u5982\u6B64\u3002","\u7531\u4E8E\u6027\u80FD\u539F\u56E0\uFF0C\u8D85\u8FC7\u8FD9\u4E2A\u957F\u5EA6\u7684\u884C\u5C06\u4E0D\u4F1A\u88AB\u6807\u8BB0","\u63A7\u5236\u662F\u5426\u5E94\u5728 Web \u8F85\u52A9\u8FDB\u7A0B\u4E0A\u5F02\u6B65\u8FDB\u884C\u6807\u8BB0\u5316\u3002","\u63A7\u5236\u662F\u5426\u5E94\u8BB0\u5F55\u5F02\u6B65\u8BCD\u6C47\u5207\u5206\u3002\u4EC5\u7528\u4E8E\u8C03\u8BD5\u3002","\u63A7\u5236\u662F\u5426\u5E94\u5BF9\u65E7\u7248\u540E\u53F0\u4EE4\u724C\u5316\u9A8C\u8BC1\u5F02\u6B65\u4EE4\u724C\u5316\u3002\u53EF\u80FD\u4F1A\u51CF\u6162\u4EE4\u724C\u5316\u901F\u5EA6\u3002\u4EC5\u7528\u4E8E\u8C03\u8BD5\u3002","\u5B9A\u4E49\u589E\u52A0\u548C\u51CF\u5C11\u7F29\u8FDB\u7684\u62EC\u53F7\u3002","\u5DE6\u65B9\u62EC\u53F7\u5B57\u7B26\u6216\u5B57\u7B26\u4E32\u5E8F\u5217\u3002","\u53F3\u65B9\u62EC\u53F7\u5B57\u7B26\u6216\u5B57\u7B26\u4E32\u5E8F\u5217\u3002","\u5982\u679C\u542F\u7528\u65B9\u62EC\u53F7\u5BF9\u7740\u8272\uFF0C\u5219\u6309\u7167\u5176\u5D4C\u5957\u7EA7\u522B\u5B9A\u4E49\u5DF2\u7740\u8272\u7684\u65B9\u62EC\u53F7\u5BF9\u3002","\u5DE6\u65B9\u62EC\u53F7\u5B57\u7B26\u6216\u5B57\u7B26\u4E32\u5E8F\u5217\u3002","\u53F3\u65B9\u62EC\u53F7\u5B57\u7B26\u6216\u5B57\u7B26\u4E32\u5E8F\u5217\u3002","\u8D85\u65F6(\u4EE5\u6BEB\u79D2\u4E3A\u5355\u4F4D)\uFF0C\u4E4B\u540E\u5C06\u53D6\u6D88\u5DEE\u5F02\u8BA1\u7B97\u3002\u4F7F\u75280\u8868\u793A\u6CA1\u6709\u8D85\u65F6\u3002","\u8981\u4E3A\u5176\u8BA1\u7B97\u5DEE\u5F02\u7684\u6700\u5927\u6587\u4EF6\u5927\u5C0F(MB)\u3002\u4F7F\u7528 0 \u8868\u793A\u65E0\u9650\u5236\u3002","\u63A7\u5236\u5DEE\u5F02\u7F16\u8F91\u5668\u7684\u663E\u793A\u65B9\u5F0F\u662F\u5E76\u6392\u8FD8\u662F\u5185\u8054\u3002","\u5982\u679C\u5DEE\u5F02\u7F16\u8F91\u5668\u5BBD\u5EA6\u5C0F\u4E8E\u6B64\u503C\uFF0C\u5219\u4F7F\u7528\u5185\u8054\u89C6\u56FE\u3002","\u5982\u679C\u542F\u7528\u5E76\u4E14\u7F16\u8F91\u5668\u5BBD\u5EA6\u592A\u5C0F\uFF0C\u5219\u4F7F\u7528\u5185\u8054\u89C6\u56FE\u3002","\u542F\u7528\u540E\uFF0C\u5DEE\u5F02\u7F16\u8F91\u5668\u4F1A\u5728\u5176\u5B57\u5F62\u8FB9\u8DDD\u4E2D\u663E\u793A\u7BAD\u5934\u4EE5\u8FD8\u539F\u66F4\u6539\u3002","\u542F\u7528\u540E\uFF0C\u5DEE\u5F02\u7F16\u8F91\u5668\u5C06\u5FFD\u7565\u524D\u5BFC\u7A7A\u683C\u6216\u5C3E\u968F\u7A7A\u683C\u4E2D\u7684\u66F4\u6539\u3002","\u63A7\u5236\u5DEE\u5F02\u7F16\u8F91\u5668\u662F\u5426\u4E3A\u6DFB\u52A0/\u5220\u9664\u7684\u66F4\u6539\u663E\u793A +/- \u6307\u793A\u7B26\u53F7\u3002","\u63A7\u5236\u662F\u5426\u5728\u7F16\u8F91\u5668\u4E2D\u663E\u793A CodeLens\u3002","\u6C38\u4E0D\u6362\u884C\u3002","\u5C06\u5728\u89C6\u533A\u5BBD\u5EA6\u5904\u6362\u884C\u3002","\u884C\u5C06\u6839\u636E {0} \u8BBE\u7F6E\u8FDB\u884C\u6362\u884C\u3002","\u4F7F\u7528\u65E7\u5DEE\u5F02\u7B97\u6CD5\u3002","\u4F7F\u7528\u9AD8\u7EA7\u5DEE\u5F02\u7B97\u6CD5\u3002","\u63A7\u5236\u5DEE\u5F02\u7F16\u8F91\u5668\u662F\u5426\u663E\u793A\u672A\u66F4\u6539\u7684\u533A\u57DF\u3002","\u63A7\u5236\u7528\u4E8E\u672A\u66F4\u6539\u533A\u57DF\u7684\u884C\u6570\u3002","\u63A7\u5236\u5C06\u591A\u5C11\u884C\u7528\u4F5C\u672A\u66F4\u6539\u533A\u57DF\u7684\u6700\u5C0F\u503C\u3002","\u63A7\u5236\u5728\u6BD4\u8F83\u672A\u6539\u53D8\u7684\u533A\u57DF\u65F6\u4F7F\u7528\u591A\u5C11\u884C\u4F5C\u4E3A\u4E0A\u4E0B\u6587\u3002","\u63A7\u5236\u5DEE\u5F02\u7F16\u8F91\u5668\u662F\u5426\u5E94\u663E\u793A\u68C0\u6D4B\u5230\u7684\u4EE3\u7801\u79FB\u52A8\u3002","\u63A7\u5236\u5DEE\u5F02\u7F16\u8F91\u5668\u662F\u5426\u663E\u793A\u7A7A\u4FEE\u9970\uFF0C\u4EE5\u67E5\u770B\u63D2\u5165\u6216\u5220\u9664\u5B57\u7B26\u7684\u4F4D\u7F6E\u3002"],"vs/editor/common/config/editorOptions":["\u8FDE\u63A5\u5C4F\u5E55\u9605\u8BFB\u5668\u540E\u4F7F\u7528\u5E73\u53F0 API \u8FDB\u884C\u68C0\u6D4B\u3002","\u9488\u5BF9\u5C4F\u5E55\u9605\u8BFB\u5668\u7684\u4F7F\u7528\u8FDB\u884C\u4F18\u5316\u3002","\u5047\u5B9A\u672A\u8FDE\u63A5\u5C4F\u5E55\u9605\u8BFB\u5668\u3002","\u63A7\u5236 UI \u662F\u5426\u5E94\u5728\u5DF2\u9488\u5BF9\u5C4F\u5E55\u9605\u8BFB\u5668\u8FDB\u884C\u4F18\u5316\u7684\u6A21\u5F0F\u4E0B\u8FD0\u884C\u3002","\u63A7\u5236\u5728\u6CE8\u91CA\u65F6\u662F\u5426\u63D2\u5165\u7A7A\u683C\u5B57\u7B26\u3002","\u63A7\u5236\u5728\u5BF9\u884C\u6CE8\u91CA\u6267\u884C\u5207\u6362\u3001\u6DFB\u52A0\u6216\u5220\u9664\u64CD\u4F5C\u65F6\uFF0C\u662F\u5426\u5E94\u5FFD\u7565\u7A7A\u884C\u3002","\u63A7\u5236\u5728\u6CA1\u6709\u9009\u62E9\u5185\u5BB9\u65F6\u8FDB\u884C\u590D\u5236\u662F\u5426\u590D\u5236\u5F53\u524D\u884C\u3002","\u63A7\u5236\u5728\u952E\u5165\u65F6\u5149\u6807\u662F\u5426\u5E94\u8DF3\u8F6C\u4EE5\u67E5\u627E\u5339\u914D\u9879\u3002","\u5207\u52FF\u4E3A\u7F16\u8F91\u5668\u9009\u62E9\u4E2D\u7684\u641C\u7D22\u5B57\u7B26\u4E32\u8BBE\u5B9A\u79CD\u5B50\u3002","\u59CB\u7EC8\u4E3A\u7F16\u8F91\u5668\u9009\u62E9\u4E2D\u7684\u641C\u7D22\u5B57\u7B26\u4E32\u8BBE\u5B9A\u79CD\u5B50\uFF0C\u5305\u62EC\u5149\u6807\u4F4D\u7F6E\u7684\u5B57\u8BCD\u3002","\u4EC5\u4E3A\u7F16\u8F91\u5668\u9009\u62E9\u4E2D\u7684\u641C\u7D22\u5B57\u7B26\u4E32\u8BBE\u5B9A\u79CD\u5B50\u3002","\u63A7\u5236\u662F\u5426\u5C06\u7F16\u8F91\u5668\u9009\u4E2D\u5185\u5BB9\u4F5C\u4E3A\u641C\u7D22\u8BCD\u586B\u5165\u5230\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u3002","\u4ECE\u4E0D\u81EA\u52A8\u6253\u5F00\u201C\u5728\u9009\u5B9A\u5185\u5BB9\u4E2D\u67E5\u627E\u201D(\u9ED8\u8BA4)\u3002","\u59CB\u7EC8\u81EA\u52A8\u6253\u5F00\u201C\u5728\u9009\u5B9A\u5185\u5BB9\u4E2D\u67E5\u627E\u201D\u3002","\u9009\u62E9\u591A\u884C\u5185\u5BB9\u65F6\uFF0C\u81EA\u52A8\u6253\u5F00\u201C\u5728\u9009\u5B9A\u5185\u5BB9\u4E2D\u67E5\u627E\u201D\u3002","\u63A7\u5236\u81EA\u52A8\u6253\u5F00\u201C\u5728\u9009\u5B9A\u5185\u5BB9\u4E2D\u67E5\u627E\u201D\u7684\u6761\u4EF6\u3002","\u63A7\u5236\u201C\u67E5\u627E\u201D\u5C0F\u7EC4\u4EF6\u662F\u5426\u8BFB\u53D6\u6216\u4FEE\u6539 macOS \u7684\u5171\u4EAB\u67E5\u627E\u526A\u8D34\u677F\u3002",'\u63A7\u5236 "\u67E5\u627E\u5C0F\u90E8\u4EF6" \u662F\u5426\u5E94\u5728\u7F16\u8F91\u5668\u9876\u90E8\u6DFB\u52A0\u989D\u5916\u7684\u884C\u3002\u5982\u679C\u4E3A true, \u5219\u53EF\u4EE5\u5728 "\u67E5\u627E\u5C0F\u5DE5\u5177" \u53EF\u89C1\u65F6\u6EDA\u52A8\u5230\u7B2C\u4E00\u884C\u4E4B\u5916\u3002',"\u63A7\u5236\u5728\u627E\u4E0D\u5230\u5176\u4ED6\u5339\u914D\u9879\u65F6\uFF0C\u662F\u5426\u81EA\u52A8\u4ECE\u5F00\u5934(\u6216\u7ED3\u5C3E)\u91CD\u65B0\u5F00\u59CB\u641C\u7D22\u3002",'\u542F\u7528/\u7981\u7528\u5B57\u4F53\u8FDE\u5B57("calt" \u548C "liga" \u5B57\u4F53\u7279\u6027)\u3002\u5C06\u6B64\u66F4\u6539\u4E3A\u5B57\u7B26\u4E32\uFF0C\u53EF\u5BF9 "font-feature-settings" CSS \u5C5E\u6027\u8FDB\u884C\u7CBE\u7EC6\u63A7\u5236\u3002','\u663E\u5F0F "font-feature-settings" CSS \u5C5E\u6027\u3002\u5982\u679C\u53EA\u9700\u6253\u5F00/\u5173\u95ED\u8FDE\u5B57\uFF0C\u53EF\u4EE5\u6539\u4E3A\u4F20\u9012\u5E03\u5C14\u503C\u3002','\u914D\u7F6E\u5B57\u4F53\u8FDE\u5B57\u6216\u5B57\u4F53\u7279\u6027\u3002\u53EF\u4EE5\u662F\u7528\u4E8E\u542F\u7528/\u7981\u7528\u8FDE\u5B57\u7684\u5E03\u5C14\u503C\uFF0C\u6216\u7528\u4E8E\u8BBE\u7F6E CSS "font-feature-settings" \u5C5E\u6027\u503C\u7684\u5B57\u7B26\u4E32\u3002',"\u542F\u7528/\u7981\u7528\u4ECE font-weight \u5230 font-variation-settings \u7684\u8F6C\u6362\u3002\u5C06\u6B64\u9879\u66F4\u6539\u4E3A\u5B57\u7B26\u4E32\uFF0C\u4EE5\u4FBF\u5BF9\u201Cfont-variation-settings\u201DCSS \u5C5E\u6027\u8FDB\u884C\u7EC6\u5316\u63A7\u5236\u3002","\u663E\u5F0F\u201Cfont-variation-settings\u201DCSS \u5C5E\u6027\u3002\u5982\u679C\u53EA\u9700\u5C06 font-weight \u8F6C\u6362\u4E3A font-variation-settings\uFF0C\u5219\u53EF\u4EE5\u6539\u4E3A\u4F20\u9012\u5E03\u5C14\u503C\u3002","\u914D\u7F6E\u5B57\u4F53\u53D8\u4F53\u3002\u53EF\u4EE5\u662F\u7528\u4E8E\u542F\u7528/\u7981\u7528\u4ECE font-weight \u5230 font-variation-settings \u7684\u8F6C\u6362\u7684\u5E03\u5C14\u503C\uFF0C\u4E5F\u53EF\u4EE5\u662F CSS\u201Cfont-variation-settings\u201D\u5C5E\u6027\u503C\u7684\u5B57\u7B26\u4E32\u3002","\u63A7\u5236\u5B57\u4F53\u5927\u5C0F(\u50CF\u7D20)\u3002","\u4EC5\u5141\u8BB8\u4F7F\u7528\u5173\u952E\u5B57\u201C\u6B63\u5E38\u201D\u548C\u201C\u52A0\u7C97\u201D\uFF0C\u6216\u4F7F\u7528\u4ECB\u4E8E 1 \u81F3 1000 \u4E4B\u95F4\u7684\u6570\u5B57\u3002","\u63A7\u5236\u5B57\u4F53\u7C97\u7EC6\u3002\u63A5\u53D7\u5173\u952E\u5B57\u201C\u6B63\u5E38\u201D\u548C\u201C\u52A0\u7C97\u201D\uFF0C\u6216\u8005\u63A5\u53D7\u4ECB\u4E8E 1 \u81F3 1000 \u4E4B\u95F4\u7684\u6570\u5B57\u3002","\u663E\u793A\u7ED3\u679C\u7684\u901F\u89C8\u89C6\u56FE(\u9ED8\u8BA4)","\u8F6C\u5230\u4E3B\u7ED3\u679C\u5E76\u663E\u793A\u901F\u89C8\u89C6\u56FE","\u8F6C\u5230\u4E3B\u7ED3\u679C\uFF0C\u5E76\u5BF9\u5176\u4ED6\u7ED3\u679C\u542F\u7528\u65E0\u901F\u89C8\u5BFC\u822A",'\u6B64\u8BBE\u7F6E\u5DF2\u5F03\u7528\uFF0C\u8BF7\u6539\u7528\u5355\u72EC\u7684\u8BBE\u7F6E\uFF0C\u5982"editor.editor.gotoLocation.multipleDefinitions"\u6216"editor.editor.gotoLocation.multipleImplementations"\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u5B9A\u4E49"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u7C7B\u578B\u5B9A\u4E49"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u58F0\u660E"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u5B9E\u73B0"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u5F15\u7528"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u5F53"\u8F6C\u5230\u5B9A\u4E49"\u7684\u7ED3\u679C\u4E3A\u5F53\u524D\u4F4D\u7F6E\u65F6\u5C06\u8981\u6267\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u7684 ID\u3002','\u5F53"\u8F6C\u5230\u7C7B\u578B\u5B9A\u4E49"\u7684\u7ED3\u679C\u662F\u5F53\u524D\u4F4D\u7F6E\u65F6\u6B63\u5728\u6267\u884C\u7684\u5907\u7528\u547D\u4EE4 ID\u3002','\u5F53"\u8F6C\u5230\u58F0\u660E"\u7684\u7ED3\u679C\u4E3A\u5F53\u524D\u4F4D\u7F6E\u65F6\u5C06\u8981\u6267\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u7684 ID\u3002','\u5F53"\u8F6C\u5230\u5B9E\u73B0"\u7684\u7ED3\u679C\u4E3A\u5F53\u524D\u4F4D\u7F6E\u65F6\u5C06\u8981\u6267\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u7684 ID\u3002','\u5F53"\u8F6C\u5230\u5F15\u7528"\u7684\u7ED3\u679C\u662F\u5F53\u524D\u4F4D\u7F6E\u65F6\u6B63\u5728\u6267\u884C\u7684\u66FF\u4EE3\u547D\u4EE4 ID\u3002',"\u63A7\u5236\u662F\u5426\u663E\u793A\u60AC\u505C\u63D0\u793A\u3002","\u63A7\u5236\u663E\u793A\u60AC\u505C\u63D0\u793A\u524D\u7684\u7B49\u5F85\u65F6\u95F4 (\u6BEB\u79D2)\u3002","\u63A7\u5236\u5F53\u9F20\u6807\u79FB\u52A8\u5230\u60AC\u505C\u63D0\u793A\u4E0A\u65F6\uFF0C\u5176\u662F\u5426\u4FDD\u6301\u53EF\u89C1\u3002","\u63A7\u5236\u9690\u85CF\u60AC\u505C\u63D0\u793A\u524D\u7684\u7B49\u5F85\u65F6\u95F4(\u6BEB\u79D2)\u3002\u9700\u8981\u542F\u7528\u201Ceditor.hover.sticky\u201D\u3002","\u5982\u679C\u6709\u7A7A\u95F4\uFF0C\u9996\u9009\u5728\u7EBF\u6761\u4E0A\u65B9\u663E\u793A\u60AC\u505C\u3002","\u5047\u5B9A\u6240\u6709\u5B57\u7B26\u7684\u5BBD\u5EA6\u76F8\u540C\u3002\u8FD9\u662F\u4E00\u79CD\u5FEB\u901F\u7B97\u6CD5\uFF0C\u9002\u7528\u4E8E\u7B49\u5BBD\u5B57\u4F53\u548C\u67D0\u4E9B\u5B57\u5F62\u5BBD\u5EA6\u76F8\u7B49\u7684\u6587\u5B57(\u5982\u62C9\u4E01\u5B57\u7B26)\u3002","\u5C06\u5305\u88C5\u70B9\u8BA1\u7B97\u59D4\u6258\u7ED9\u6D4F\u89C8\u5668\u3002\u8FD9\u662F\u4E00\u4E2A\u7F13\u6162\u7B97\u6CD5\uFF0C\u53EF\u80FD\u4F1A\u5BFC\u81F4\u5927\u578B\u6587\u4EF6\u88AB\u51BB\u7ED3\uFF0C\u4F46\u5B83\u5728\u6240\u6709\u60C5\u51B5\u4E0B\u90FD\u6B63\u5E38\u5DE5\u4F5C\u3002","\u63A7\u5236\u8BA1\u7B97\u5305\u88C5\u70B9\u7684\u7B97\u6CD5\u3002\u8BF7\u6CE8\u610F\uFF0C\u5728\u8F85\u52A9\u529F\u80FD\u6A21\u5F0F\u4E0B\uFF0C\u9AD8\u7EA7\u7248\u5C06\u7528\u4E8E\u63D0\u4F9B\u6700\u4F73\u4F53\u9A8C\u3002","\u7981\u7528\u4EE3\u7801\u64CD\u4F5C\u83DC\u5355\u3002","\u5F53\u5149\u6807\u4E0E\u4EE3\u7801\u4E00\u8D77\u6392\u5217\u65F6\uFF0C\u663E\u793A\u4EE3\u7801\u64CD\u4F5C\u83DC\u5355\u3002","\u5F53\u5149\u6807\u4E0E\u4EE3\u7801\u4E00\u8D77\u6392\u5217\u6216\u5728\u7A7A\u7684\u884C\u65F6\uFF0C\u663E\u793A\u4EE3\u7801\u64CD\u4F5C\u83DC\u5355\u3002","\u5728\u7F16\u8F91\u5668\u4E2D\u542F\u7528\u4EE3\u7801\u64CD\u4F5C\u5C0F\u706F\u6CE1\u63D0\u793A\u3002","\u5728\u7F16\u8F91\u5668\u9876\u90E8\u7684\u6EDA\u52A8\u8FC7\u7A0B\u4E2D\u663E\u793A\u5D4C\u5957\u7684\u5F53\u524D\u4F5C\u7528\u57DF\u3002","\u5B9A\u4E49\u8981\u663E\u793A\u7684\u6700\u5927\u7C98\u6EDE\u884C\u6570\u3002","\u5B9A\u4E49\u7528\u4E8E\u786E\u5B9A\u8981\u7C98\u8D34\u7684\u884C\u7684\u6A21\u578B\u3002\u5982\u679C\u5927\u7EB2\u6A21\u578B\u4E0D\u5B58\u5728\uFF0C\u5B83\u5C06\u56DE\u9000\u5230\u56DE\u9000\u5230\u7F29\u8FDB\u6A21\u578B\u7684\u6298\u53E0\u63D0\u4F9B\u7A0B\u5E8F\u6A21\u578B\u4E0A\u3002\u5728\u6240\u6709\u4E09\u79CD\u60C5\u51B5\u4E0B\u90FD\u9075\u5FAA\u6B64\u987A\u5E8F\u3002","\u4F7F\u7528\u7F16\u8F91\u5668\u7684\u6C34\u5E73\u6EDA\u52A8\u6761\u542F\u7528\u7C98\u6EDE\u6EDA\u52A8\u3002","\u5728\u7F16\u8F91\u5668\u4E2D\u542F\u7528\u5185\u8054\u63D0\u793A\u3002","\u5DF2\u542F\u7528\u5185\u5D4C\u63D0\u793A","\u9ED8\u8BA4\u60C5\u51B5\u4E0B\u663E\u793A\u5185\u5D4C\u63D0\u793A\uFF0C\u5E76\u5728\u6309\u4F4F {0} \u65F6\u9690\u85CF","\u9ED8\u8BA4\u60C5\u51B5\u4E0B\u9690\u85CF\u5185\u5D4C\u63D0\u793A\uFF0C\u5E76\u5728\u6309\u4F4F {0} \u65F6\u663E\u793A","\u5DF2\u7981\u7528\u5185\u5D4C\u63D0\u793A","\u63A7\u5236\u7F16\u8F91\u5668\u4E2D\u5D4C\u5165\u63D0\u793A\u7684\u5B57\u53F7\u3002\u9ED8\u8BA4\u60C5\u51B5\u4E0B\uFF0C\u5F53\u914D\u7F6E\u7684\u503C\u5C0F\u4E8E {1} \u6216\u5927\u4E8E\u7F16\u8F91\u5668\u5B57\u53F7\u65F6\uFF0C\u5C06\u4F7F\u7528 {0}\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u4E2D\u5D4C\u5165\u63D0\u793A\u7684\u5B57\u4F53\u7CFB\u5217\u3002\u8BBE\u7F6E\u4E3A\u7A7A\u65F6\uFF0C\u5C06\u4F7F\u7528 {0}\u3002","\u5728\u7F16\u8F91\u5668\u4E2D\u542F\u7528\u53E0\u52A0\u63D0\u793A\u5468\u56F4\u7684\u586B\u5145\u3002",`\u63A7\u5236\u884C\u9AD8\u3002\r
+ - \u4F7F\u7528 0 \u6839\u636E\u5B57\u53F7\u81EA\u52A8\u8BA1\u7B97\u884C\u9AD8\u3002\r
+ - \u4ECB\u4E8E 0 \u548C 8 \u4E4B\u95F4\u7684\u503C\u5C06\u7528\u4F5C\u5B57\u53F7\u7684\u4E58\u6570\u3002\r
+ - \u5927\u4E8E\u6216\u7B49\u4E8E 8 \u7684\u503C\u5C06\u7528\u4F5C\u6709\u6548\u503C\u3002`,"\u63A7\u5236\u662F\u5426\u663E\u793A\u7F29\u7565\u56FE\u3002","\u63A7\u5236\u662F\u5426\u81EA\u52A8\u9690\u85CF\u7F29\u7565\u56FE\u3002","\u8FF7\u4F60\u5730\u56FE\u7684\u5927\u5C0F\u4E0E\u7F16\u8F91\u5668\u5185\u5BB9\u76F8\u540C(\u5E76\u4E14\u53EF\u80FD\u6EDA\u52A8)\u3002","\u8FF7\u4F60\u5730\u56FE\u5C06\u6839\u636E\u9700\u8981\u62C9\u4F38\u6216\u7F29\u5C0F\u4EE5\u586B\u5145\u7F16\u8F91\u5668\u7684\u9AD8\u5EA6(\u4E0D\u6EDA\u52A8)\u3002","\u8FF7\u4F60\u5730\u56FE\u5C06\u6839\u636E\u9700\u8981\u7F29\u5C0F\uFF0C\u6C38\u8FDC\u4E0D\u4F1A\u5927\u4E8E\u7F16\u8F91\u5668(\u4E0D\u6EDA\u52A8)\u3002","\u63A7\u5236\u8FF7\u4F60\u5730\u56FE\u7684\u5927\u5C0F\u3002","\u63A7\u5236\u5728\u54EA\u4E00\u4FA7\u663E\u793A\u7F29\u7565\u56FE\u3002","\u63A7\u5236\u4F55\u65F6\u663E\u793A\u8FF7\u4F60\u5730\u56FE\u6ED1\u5757\u3002","\u5728\u8FF7\u4F60\u5730\u56FE\u4E2D\u7ED8\u5236\u7684\u5185\u5BB9\u6BD4\u4F8B: 1\u30012 \u6216 3\u3002","\u6E32\u67D3\u6BCF\u884C\u7684\u5B9E\u9645\u5B57\u7B26\uFF0C\u800C\u4E0D\u662F\u8272\u5757\u3002","\u9650\u5236\u7F29\u7565\u56FE\u7684\u5BBD\u5EA6\uFF0C\u63A7\u5236\u5176\u6700\u591A\u663E\u793A\u7684\u5217\u6570\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u7684\u9876\u8FB9\u548C\u7B2C\u4E00\u884C\u4E4B\u95F4\u7684\u95F4\u8DDD\u91CF\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u7684\u5E95\u8FB9\u548C\u6700\u540E\u4E00\u884C\u4E4B\u95F4\u7684\u95F4\u8DDD\u91CF\u3002","\u5728\u8F93\u5165\u65F6\u663E\u793A\u542B\u6709\u53C2\u6570\u6587\u6863\u548C\u7C7B\u578B\u4FE1\u606F\u7684\u5C0F\u9762\u677F\u3002","\u63A7\u5236\u53C2\u6570\u63D0\u793A\u83DC\u5355\u5728\u5230\u8FBE\u5217\u8868\u672B\u5C3E\u65F6\u8FDB\u884C\u5FAA\u73AF\u8FD8\u662F\u5173\u95ED\u3002","\u5FEB\u901F\u5EFA\u8BAE\u663E\u793A\u5728\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u5185","\u5FEB\u901F\u5EFA\u8BAE\u663E\u793A\u4E3A\u865A\u5F71\u6587\u672C","\u5DF2\u7981\u7528\u5FEB\u901F\u5EFA\u8BAE","\u5728\u5B57\u7B26\u4E32\u5185\u542F\u7528\u5FEB\u901F\u5EFA\u8BAE\u3002","\u5728\u6CE8\u91CA\u5185\u542F\u7528\u5FEB\u901F\u5EFA\u8BAE\u3002","\u5728\u5B57\u7B26\u4E32\u548C\u6CE8\u91CA\u5916\u542F\u7528\u5FEB\u901F\u5EFA\u8BAE\u3002","\u63A7\u5236\u952E\u5165\u65F6\u662F\u5426\u5E94\u81EA\u52A8\u663E\u793A\u5EFA\u8BAE\u3002\u8FD9\u53EF\u4EE5\u7528\u4E8E\u5728\u6CE8\u91CA\u3001\u5B57\u7B26\u4E32\u548C\u5176\u4ED6\u4EE3\u7801\u4E2D\u952E\u5165\u65F6\u8FDB\u884C\u63A7\u5236\u3002\u53EF\u914D\u7F6E\u5FEB\u901F\u5EFA\u8BAE\u4EE5\u663E\u793A\u4E3A\u865A\u5F71\u6587\u672C\u6216\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u3002\u53E6\u8BF7\u6CE8\u610F\u63A7\u5236\u5EFA\u8BAE\u662F\u5426\u7531\u7279\u6B8A\u5B57\u7B26\u89E6\u53D1\u7684\u201C{0}\u201D\u8BBE\u7F6E\u3002","\u4E0D\u663E\u793A\u884C\u53F7\u3002","\u5C06\u884C\u53F7\u663E\u793A\u4E3A\u7EDD\u5BF9\u884C\u6570\u3002","\u5C06\u884C\u53F7\u663E\u793A\u4E3A\u4E0E\u5149\u6807\u76F8\u9694\u7684\u884C\u6570\u3002","\u6BCF 10 \u884C\u663E\u793A\u4E00\u6B21\u884C\u53F7\u3002","\u63A7\u5236\u884C\u53F7\u7684\u663E\u793A\u3002","\u6B64\u7F16\u8F91\u5668\u6807\u5C3A\u5C06\u6E32\u67D3\u7684\u7B49\u5BBD\u5B57\u7B26\u6570\u3002","\u6B64\u7F16\u8F91\u5668\u6807\u5C3A\u7684\u989C\u8272\u3002","\u5728\u4E00\u5B9A\u6570\u91CF\u7684\u7B49\u5BBD\u5B57\u7B26\u540E\u663E\u793A\u5782\u76F4\u6807\u5C3A\u3002\u8F93\u5165\u591A\u4E2A\u503C\uFF0C\u663E\u793A\u591A\u4E2A\u6807\u5C3A\u3002\u82E5\u6570\u7EC4\u4E3A\u7A7A\uFF0C\u5219\u4E0D\u7ED8\u5236\u6807\u5C3A\u3002","\u5782\u76F4\u6EDA\u52A8\u6761\u4EC5\u5728\u5FC5\u8981\u65F6\u53EF\u89C1\u3002","\u5782\u76F4\u6EDA\u52A8\u6761\u5C06\u59CB\u7EC8\u53EF\u89C1\u3002","\u5782\u76F4\u6EDA\u52A8\u6761\u5C06\u59CB\u7EC8\u9690\u85CF\u3002","\u63A7\u5236\u5782\u76F4\u6EDA\u52A8\u6761\u7684\u53EF\u89C1\u6027\u3002","\u6C34\u5E73\u6EDA\u52A8\u6761\u4EC5\u5728\u5FC5\u8981\u65F6\u53EF\u89C1\u3002","\u6C34\u5E73\u6EDA\u52A8\u6761\u5C06\u59CB\u7EC8\u53EF\u89C1\u3002","\u6C34\u5E73\u6EDA\u52A8\u6761\u5C06\u59CB\u7EC8\u9690\u85CF\u3002","\u63A7\u5236\u6C34\u5E73\u6EDA\u52A8\u6761\u7684\u53EF\u89C1\u6027\u3002","\u5782\u76F4\u6EDA\u52A8\u6761\u7684\u5BBD\u5EA6\u3002","\u6C34\u5E73\u6EDA\u52A8\u6761\u7684\u9AD8\u5EA6\u3002","\u63A7\u5236\u5355\u51FB\u6309\u9875\u6EDA\u52A8\u8FD8\u662F\u8DF3\u8F6C\u5230\u5355\u51FB\u4F4D\u7F6E\u3002","\u8BBE\u7F6E\u540E\uFF0C\u6C34\u5E73\u6EDA\u52A8\u6761\u5C06\u4E0D\u4F1A\u589E\u52A0\u7F16\u8F91\u5668\u5185\u5BB9\u7684\u5927\u5C0F\u3002","\u63A7\u5236\u662F\u5426\u7A81\u51FA\u663E\u793A\u6240\u6709\u975E\u57FA\u672C ASCII \u5B57\u7B26\u3002\u53EA\u6709\u4ECB\u4E8E U+0020 \u5230 U+007E \u4E4B\u95F4\u7684\u5B57\u7B26\u3001\u5236\u8868\u7B26\u3001\u6362\u884C\u7B26\u548C\u56DE\u8F66\u7B26\u624D\u88AB\u89C6\u4E3A\u57FA\u672C ASCII\u3002","\u63A7\u5236\u662F\u5426\u7A81\u51FA\u663E\u793A\u4EC5\u4FDD\u7559\u7A7A\u683C\u6216\u5B8C\u5168\u6CA1\u6709\u5BBD\u5EA6\u7684\u5B57\u7B26\u3002","\u63A7\u5236\u662F\u5426\u7A81\u51FA\u663E\u793A\u53EF\u80FD\u4E0E\u57FA\u672C ASCII \u5B57\u7B26\u6DF7\u6DC6\u7684\u5B57\u7B26\uFF0C\u4F46\u5F53\u524D\u7528\u6237\u533A\u57DF\u8BBE\u7F6E\u4E2D\u5E38\u89C1\u7684\u5B57\u7B26\u9664\u5916\u3002","\u63A7\u5236\u6CE8\u91CA\u4E2D\u7684\u5B57\u7B26\u662F\u5426\u4E5F\u5E94\u8FDB\u884C Unicode \u7A81\u51FA\u663E\u793A\u3002","\u63A7\u5236\u5B57\u7B26\u4E32\u4E2D\u7684\u5B57\u7B26\u662F\u5426\u4E5F\u5E94\u8FDB\u884C Unicode \u7A81\u51FA\u663E\u793A\u3002","\u5B9A\u4E49\u672A\u7A81\u51FA\u663E\u793A\u7684\u5141\u8BB8\u5B57\u7B26\u3002","\u672A\u7A81\u51FA\u663E\u793A\u5728\u5141\u8BB8\u533A\u57DF\u8BBE\u7F6E\u4E2D\u5E38\u89C1\u7684 Unicode \u5B57\u7B26\u3002","\u63A7\u5236\u662F\u5426\u5728\u7F16\u8F91\u5668\u4E2D\u81EA\u52A8\u663E\u793A\u5185\u8054\u5EFA\u8BAE\u3002","\u6BCF\u5F53\u663E\u793A\u5185\u8054\u5EFA\u8BAE\u65F6\uFF0C\u663E\u793A\u5185\u8054\u5EFA\u8BAE\u5DE5\u5177\u680F\u3002","\u5C06\u9F20\u6807\u60AC\u505C\u5728\u5185\u8054\u5EFA\u8BAE\u4E0A\u65F6\u663E\u793A\u5185\u8054\u5EFA\u8BAE\u5DE5\u5177\u680F\u3002","\u4ECE\u4E0D\u663E\u793A\u5185\u8054\u5EFA\u8BAE\u5DE5\u5177\u680F\u3002","\u63A7\u5236\u4F55\u65F6\u663E\u793A\u5185\u8054\u5EFA\u8BAE\u5DE5\u5177\u680F\u3002","\u63A7\u5236\u5185\u8054\u5EFA\u8BAE\u5982\u4F55\u4E0E\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4EA4\u4E92\u3002\u5982\u679C\u542F\u7528\uFF0C\u5F53\u5185\u8054\u5EFA\u8BAE\u53EF\u7528\u65F6\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u663E\u793A\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u3002","\u63A7\u5236\u5185\u8054\u5EFA\u8BAE\u7684\u5B57\u4F53\u7CFB\u5217\u3002","\u63A7\u5236\u662F\u5426\u542F\u7528\u62EC\u53F7\u5BF9\u7740\u8272\u3002\u8BF7\u4F7F\u7528 {0} \u91CD\u5199\u62EC\u53F7\u7A81\u51FA\u663E\u793A\u989C\u8272\u3002","\u63A7\u5236\u6BCF\u4E2A\u65B9\u62EC\u53F7\u7C7B\u578B\u662F\u5426\u5177\u6709\u81EA\u5DF1\u7684\u72EC\u7ACB\u989C\u8272\u6C60\u3002","\u542F\u7528\u62EC\u53F7\u5BF9\u53C2\u8003\u7EBF\u3002","\u4EC5\u4E3A\u6D3B\u52A8\u62EC\u53F7\u5BF9\u542F\u7528\u62EC\u53F7\u5BF9\u53C2\u8003\u7EBF\u3002","\u7981\u7528\u62EC\u53F7\u5BF9\u53C2\u8003\u7EBF\u3002","\u63A7\u5236\u662F\u5426\u542F\u7528\u62EC\u53F7\u5BF9\u6307\u5357\u3002","\u542F\u7528\u6C34\u5E73\u53C2\u8003\u7EBF\u4F5C\u4E3A\u5782\u76F4\u62EC\u53F7\u5BF9\u53C2\u8003\u7EBF\u7684\u6DFB\u52A0\u9879\u3002","\u4EC5\u4E3A\u6D3B\u52A8\u62EC\u53F7\u5BF9\u542F\u7528\u6C34\u5E73\u53C2\u8003\u7EBF\u3002","\u7981\u7528\u6C34\u5E73\u62EC\u53F7\u5BF9\u53C2\u8003\u7EBF\u3002","\u63A7\u5236\u662F\u5426\u542F\u7528\u6C34\u5E73\u62EC\u53F7\u5BF9\u6307\u5357\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u7A81\u51FA\u663E\u793A\u6D3B\u52A8\u7684\u62EC\u53F7\u5BF9\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u663E\u793A\u7F29\u8FDB\u53C2\u8003\u7EBF\u3002","\u7A81\u51FA\u663E\u793A\u6D3B\u52A8\u7F29\u8FDB\u53C2\u8003\u7EBF\u3002","\u7A81\u51FA\u663E\u793A\u6D3B\u52A8\u7F29\u8FDB\u53C2\u8003\u7EBF\uFF0C\u5373\u4F7F\u7A81\u51FA\u663E\u793A\u4E86\u62EC\u53F7\u53C2\u8003\u7EBF\u3002","\u4E0D\u8981\u7A81\u51FA\u663E\u793A\u6D3B\u52A8\u7F29\u8FDB\u53C2\u8003\u7EBF\u3002","\u63A7\u5236\u662F\u5426\u7A81\u51FA\u663E\u793A\u7F16\u8F91\u5668\u4E2D\u6D3B\u52A8\u7684\u7F29\u8FDB\u53C2\u8003\u7EBF\u3002","\u63D2\u5165\u5EFA\u8BAE\u800C\u4E0D\u8986\u76D6\u5149\u6807\u53F3\u4FA7\u7684\u6587\u672C\u3002","\u63D2\u5165\u5EFA\u8BAE\u5E76\u8986\u76D6\u5149\u6807\u53F3\u4FA7\u7684\u6587\u672C\u3002","\u63A7\u5236\u63A5\u53D7\u8865\u5168\u65F6\u662F\u5426\u8986\u76D6\u5355\u8BCD\u3002\u8BF7\u6CE8\u610F\uFF0C\u8FD9\u53D6\u51B3\u4E8E\u6269\u5C55\u9009\u62E9\u4F7F\u7528\u6B64\u529F\u80FD\u3002","\u63A7\u5236\u5BF9\u5EFA\u8BAE\u7684\u7B5B\u9009\u548C\u6392\u5E8F\u662F\u5426\u8003\u8651\u5C0F\u7684\u62FC\u5199\u9519\u8BEF\u3002","\u63A7\u5236\u6392\u5E8F\u65F6\u662F\u5426\u9996\u9009\u5149\u6807\u9644\u8FD1\u7684\u5B57\u8BCD\u3002","\u63A7\u5236\u662F\u5426\u5728\u591A\u4E2A\u5DE5\u4F5C\u533A\u548C\u7A97\u53E3\u95F4\u5171\u4EAB\u8BB0\u5FC6\u7684\u5EFA\u8BAE\u9009\u9879(\u9700\u8981 `#editor.suggestSelection#`)\u3002","\u81EA\u52A8\u89E6\u53D1 IntelliSense \u65F6\u59CB\u7EC8\u9009\u62E9\u5EFA\u8BAE\u3002","\u81EA\u52A8\u89E6\u53D1 IntelliSense \u65F6\uFF0C\u5207\u52FF\u9009\u62E9\u5EFA\u8BAE\u3002","\u4EC5\u5F53\u4ECE\u89E6\u53D1\u5668\u5B57\u7B26\u89E6\u53D1 IntelliSense \u65F6\uFF0C\u624D\u9009\u62E9\u5EFA\u8BAE\u3002","\u4EC5\u5728\u952E\u5165\u65F6\u89E6\u53D1 IntelliSense \u65F6\u624D\u9009\u62E9\u5EFA\u8BAE\u3002","\u63A7\u5236\u5728\u663E\u793A\u5C0F\u7EC4\u4EF6\u65F6\u662F\u5426\u9009\u62E9\u5EFA\u8BAE\u3002\u8BF7\u6CE8\u610F\uFF0C\u8FD9\u4EC5\u9002\u7528\u4E8E(\u201C#editor.quickSuggestions#\u201D\u548C\u201C#editor.suggestOnTriggerCharacters#\u201D)\u81EA\u52A8\u89E6\u53D1\u7684\u5EFA\u8BAE\uFF0C\u5E76\u4E14\u59CB\u7EC8\u5728\u663E\u5F0F\u8C03\u7528\u65F6\u9009\u62E9\u5EFA\u8BAE\uFF0C\u4F8B\u5982\u901A\u8FC7\u201CCtrl+Space\u201D\u3002","\u63A7\u5236\u6D3B\u52A8\u4EE3\u7801\u6BB5\u662F\u5426\u963B\u6B62\u5FEB\u901F\u5EFA\u8BAE\u3002","\u63A7\u5236\u662F\u5426\u5728\u5EFA\u8BAE\u4E2D\u663E\u793A\u6216\u9690\u85CF\u56FE\u6807\u3002","\u63A7\u5236\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u5E95\u90E8\u7684\u72B6\u6001\u680F\u7684\u53EF\u89C1\u6027\u3002","\u63A7\u5236\u662F\u5426\u5728\u7F16\u8F91\u5668\u4E2D\u9884\u89C8\u5EFA\u8BAE\u7ED3\u679C\u3002","\u63A7\u5236\u5EFA\u8BAE\u8BE6\u7EC6\u4FE1\u606F\u662F\u968F\u6807\u7B7E\u5185\u8054\u663E\u793A\u8FD8\u662F\u4EC5\u663E\u793A\u5728\u8BE6\u7EC6\u4FE1\u606F\u5C0F\u7EC4\u4EF6\u4E2D\u3002","\u6B64\u8BBE\u7F6E\u5DF2\u5F03\u7528\u3002\u73B0\u5728\u53EF\u4EE5\u8C03\u6574\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u7684\u5927\u5C0F\u3002",'\u6B64\u8BBE\u7F6E\u5DF2\u5F03\u7528\uFF0C\u8BF7\u6539\u7528\u5355\u72EC\u7684\u8BBE\u7F6E\uFF0C\u5982"editor.suggest.showKeywords"\u6216"editor.suggest.showSnippets"\u3002',"\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u65B9\u6CD5\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u51FD\u6570\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6784\u9020\u51FD\u6570\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A`\u5DF2\u5F03\u7528`\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u7B5B\u9009\u8981\u6C42\u7B2C\u4E00\u4E2A\u5B57\u7B26\u5728\u5355\u8BCD\u5F00\u5934\u5339\u914D\uFF0C\u4F8B\u5982 \u201CConsole\u201D \u6216 \u201CWebContext\u201D \u4E0A\u7684 \u201Cc\u201D\uFF0C\u4F46 \u201Cdescription\u201D \u4E0A\u7684 _not_\u3002\u7981\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u66F4\u591A\u7ED3\u679C\uFF0C\u4F46\u4ECD\u6309\u5339\u914D\u8D28\u91CF\u5BF9\u5176\u8FDB\u884C\u6392\u5E8F\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5B57\u6BB5\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u53D8\u91CF\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u7C7B\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u7ED3\u6784\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u63A5\u53E3\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6A21\u5757\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5C5E\u6027\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u4E8B\u4EF6\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u64CD\u4F5C\u7B26\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5355\u4F4D\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u503C\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5E38\u91CF\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u679A\u4E3E\u201D\u5EFA\u8BAE\u3002",'\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A "enumMember" \u5EFA\u8BAE\u3002',"\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5173\u952E\u5B57\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6587\u672C\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u989C\u8272\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6587\u4EF6\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u53C2\u8003\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u81EA\u5B9A\u4E49\u989C\u8272\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6587\u4EF6\u5939\u201D\u5EFA\u8BAE\u3002",'\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A "typeParameter" \u5EFA\u8BAE\u3002',"\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u7247\u6BB5\u201D\u5EFA\u8BAE\u3002",'\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A"\u7528\u6237"\u5EFA\u8BAE\u3002','\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A"\u95EE\u9898"\u5EFA\u8BAE\u3002',"\u662F\u5426\u5E94\u59CB\u7EC8\u9009\u62E9\u524D\u5BFC\u548C\u5C3E\u968F\u7A7A\u683C\u3002","\u662F\u5426\u5E94\u9009\u62E9\u5B50\u5B57(\u5982\u201CfooBar\u201D\u6216\u201Cfoo_bar\u201D\u4E2D\u7684\u201Cfoo\u201D)\u3002","\u6CA1\u6709\u7F29\u8FDB\u3002\u6298\u884C\u4ECE\u7B2C 1 \u5217\u5F00\u59CB\u3002","\u6298\u884C\u7684\u7F29\u8FDB\u91CF\u4E0E\u5176\u7236\u7EA7\u76F8\u540C\u3002","\u6298\u884C\u7684\u7F29\u8FDB\u91CF\u6BD4\u5176\u7236\u7EA7\u591A 1\u3002","\u6298\u884C\u7684\u7F29\u8FDB\u91CF\u6BD4\u5176\u7236\u7EA7\u591A 2\u3002","\u63A7\u5236\u6298\u884C\u7684\u7F29\u8FDB\u3002","\u63A7\u5236\u662F\u5426\u53EF\u4EE5\u901A\u8FC7\u6309\u4F4F Shift`\u952E\u5C06\u6587\u4EF6\u62D6\u653E\u5230\u7F16\u8F91\u5668\u4E2D\uFF08\u800C\u4E0D\u662F\u5728\u7F16\u8F91\u5668\u4E2D\u6253\u5F00\u8BE5\u6587\u4EF6\uFF09\u3002","\u63A7\u5236\u5C06\u6587\u4EF6\u653E\u5165\u7F16\u8F91\u5668\u65F6\u662F\u5426\u663E\u793A\u5C0F\u7EC4\u4EF6\u3002\u4F7F\u7528\u6B64\u5C0F\u7EC4\u4EF6\u53EF\u4EE5\u63A7\u5236\u6587\u4EF6\u7684\u5220\u9664\u65B9\u5F0F\u3002","\u5C06\u6587\u4EF6\u653E\u5165\u7F16\u8F91\u5668\u540E\u663E\u793A\u653E\u7F6E\u9009\u62E9\u5668\u5C0F\u7EC4\u4EF6\u3002","\u5207\u52FF\u663E\u793A\u653E\u7F6E\u9009\u62E9\u5668\u5C0F\u7EC4\u4EF6\u3002\u800C\u662F\u59CB\u7EC8\u4F7F\u7528\u9ED8\u8BA4\u5220\u9664\u63D0\u4F9B\u7A0B\u5E8F\u3002","\u63A7\u5236\u662F\u5426\u53EF\u4EE5\u4EE5\u4E0D\u540C\u7684\u65B9\u5F0F\u7C98\u8D34\u5185\u5BB9\u3002","\u63A7\u5236\u5C06\u5185\u5BB9\u7C98\u8D34\u5230\u7F16\u8F91\u5668\u65F6\u662F\u5426\u663E\u793A\u5C0F\u7EC4\u4EF6\u3002\u4F7F\u7528\u6B64\u5C0F\u7EC4\u4EF6\u53EF\u4EE5\u63A7\u5236\u6587\u4EF6\u7684\u7C98\u8D34\u65B9\u5F0F\u3002","\u5C06\u5185\u5BB9\u7C98\u8D34\u5230\u7F16\u8F91\u5668\u540E\u663E\u793A\u7C98\u8D34\u9009\u62E9\u5668\u5C0F\u7EC4\u4EF6\u3002","\u5207\u52FF\u663E\u793A\u7C98\u8D34\u9009\u62E9\u5668\u5C0F\u7EC4\u4EF6\u3002\u800C\u662F\u59CB\u7EC8\u4F7F\u7528\u9ED8\u8BA4\u7C98\u8D34\u884C\u4E3A\u3002","\u63A7\u5236\u662F\u5426\u5E94\u5728\u9047\u5230\u63D0\u4EA4\u5B57\u7B26\u65F6\u63A5\u53D7\u5EFA\u8BAE\u3002\u4F8B\u5982\uFF0C\u5728 JavaScript \u4E2D\uFF0C\u534A\u89D2\u5206\u53F7 (`;`) \u53EF\u4EE5\u4E3A\u63D0\u4EA4\u5B57\u7B26\uFF0C\u80FD\u591F\u5728\u63A5\u53D7\u5EFA\u8BAE\u7684\u540C\u65F6\u952E\u5165\u8BE5\u5B57\u7B26\u3002","\u4EC5\u5F53\u5EFA\u8BAE\u5305\u542B\u6587\u672C\u6539\u52A8\u65F6\u624D\u53EF\u4F7F\u7528 `Enter` \u952E\u8FDB\u884C\u63A5\u53D7\u3002","\u63A7\u5236\u9664\u4E86 `Tab` \u952E\u4EE5\u5916\uFF0C `Enter` \u952E\u662F\u5426\u540C\u6837\u53EF\u4EE5\u63A5\u53D7\u5EFA\u8BAE\u3002\u8FD9\u80FD\u51CF\u5C11\u201C\u63D2\u5165\u65B0\u884C\u201D\u548C\u201C\u63A5\u53D7\u5EFA\u8BAE\u201D\u547D\u4EE4\u4E4B\u95F4\u7684\u6B67\u4E49\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u4E2D\u53EF\u7531\u5C4F\u5E55\u9605\u8BFB\u5668\u4E00\u6B21\u8BFB\u51FA\u7684\u884C\u6570\u3002\u6211\u4EEC\u68C0\u6D4B\u5230\u5C4F\u5E55\u9605\u8BFB\u5668\u65F6\uFF0C\u4F1A\u81EA\u52A8\u5C06\u9ED8\u8BA4\u503C\u8BBE\u7F6E\u4E3A 500\u3002\u8B66\u544A: \u5982\u679C\u884C\u6570\u5927\u4E8E\u9ED8\u8BA4\u503C\uFF0C\u53EF\u80FD\u4F1A\u5F71\u54CD\u6027\u80FD\u3002","\u7F16\u8F91\u5668\u5185\u5BB9","\u63A7\u5236\u5185\u8054\u5EFA\u8BAE\u662F\u5426\u7531\u5C4F\u5E55\u9605\u8BFB\u5668\u516C\u5E03\u3002","\u4F7F\u7528\u8BED\u8A00\u914D\u7F6E\u786E\u5B9A\u4F55\u65F6\u81EA\u52A8\u95ED\u5408\u62EC\u53F7\u3002","\u4EC5\u5F53\u5149\u6807\u4F4D\u4E8E\u7A7A\u767D\u5B57\u7B26\u5DE6\u4FA7\u65F6\uFF0C\u624D\u81EA\u52A8\u95ED\u5408\u62EC\u53F7\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5728\u5DE6\u62EC\u53F7\u540E\u81EA\u52A8\u63D2\u5165\u53F3\u62EC\u53F7\u3002","\u4F7F\u7528\u8BED\u8A00\u914D\u7F6E\u786E\u5B9A\u4F55\u65F6\u81EA\u52A8\u5173\u95ED\u6CE8\u91CA\u3002","\u4EC5\u5F53\u5149\u6807\u4F4D\u4E8E\u7A7A\u683C\u5DE6\u4FA7\u65F6\u81EA\u52A8\u5173\u95ED\u6CE8\u91CA\u3002","\u63A7\u5236\u5728\u7528\u6237\u6DFB\u52A0\u6253\u5F00\u6CE8\u91CA\u540E\u7F16\u8F91\u5668\u662F\u5426\u5E94\u81EA\u52A8\u5173\u95ED\u6CE8\u91CA\u3002","\u4EC5\u5728\u81EA\u52A8\u63D2\u5165\u65F6\u624D\u5220\u9664\u76F8\u90BB\u7684\u53F3\u5F15\u53F7\u6216\u53F3\u62EC\u53F7\u3002","\u63A7\u5236\u5728\u5220\u9664\u65F6\u7F16\u8F91\u5668\u662F\u5426\u5E94\u5220\u9664\u76F8\u90BB\u7684\u53F3\u5F15\u53F7\u6216\u53F3\u65B9\u62EC\u53F7\u3002","\u4EC5\u5728\u81EA\u52A8\u63D2\u5165\u65F6\u624D\u6539\u5199\u53F3\u5F15\u53F7\u6216\u53F3\u62EC\u53F7\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u6539\u5199\u53F3\u5F15\u53F7\u6216\u53F3\u62EC\u53F7\u3002","\u4F7F\u7528\u8BED\u8A00\u914D\u7F6E\u786E\u5B9A\u4F55\u65F6\u81EA\u52A8\u95ED\u5408\u5F15\u53F7\u3002","\u4EC5\u5F53\u5149\u6807\u4F4D\u4E8E\u7A7A\u767D\u5B57\u7B26\u5DE6\u4FA7\u65F6\uFF0C\u624D\u81EA\u52A8\u95ED\u5408\u5F15\u53F7\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5728\u5DE6\u5F15\u53F7\u540E\u81EA\u52A8\u63D2\u5165\u53F3\u5F15\u53F7\u3002","\u7F16\u8F91\u5668\u4E0D\u4F1A\u81EA\u52A8\u63D2\u5165\u7F29\u8FDB\u3002","\u7F16\u8F91\u5668\u5C06\u4FDD\u7559\u5F53\u524D\u884C\u7684\u7F29\u8FDB\u3002","\u7F16\u8F91\u5668\u5C06\u4FDD\u7559\u5F53\u524D\u884C\u7684\u7F29\u8FDB\u5E76\u9075\u5FAA\u8BED\u8A00\u5B9A\u4E49\u7684\u62EC\u53F7\u3002","\u7F16\u8F91\u5668\u5C06\u4FDD\u7559\u5F53\u524D\u884C\u7684\u7F29\u8FDB\u3001\u4F7F\u7528\u8BED\u8A00\u5B9A\u4E49\u7684\u62EC\u53F7\u5E76\u8C03\u7528\u8BED\u8A00\u5B9A\u4E49\u7684\u7279\u5B9A onEnterRules\u3002","\u7F16\u8F91\u5668\u5C06\u4FDD\u7559\u5F53\u524D\u884C\u7684\u7F29\u8FDB\uFF0C\u4F7F\u7528\u8BED\u8A00\u5B9A\u4E49\u7684\u62EC\u53F7\uFF0C\u8C03\u7528\u7531\u8BED\u8A00\u5B9A\u4E49\u7684\u7279\u6B8A\u8F93\u5165\u89C4\u5219\uFF0C\u5E76\u9075\u5FAA\u7531\u8BED\u8A00\u5B9A\u4E49\u7684\u7F29\u8FDB\u89C4\u5219\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u5728\u7528\u6237\u952E\u5165\u3001\u7C98\u8D34\u3001\u79FB\u52A8\u6216\u7F29\u8FDB\u884C\u65F6\u81EA\u52A8\u8C03\u6574\u7F29\u8FDB\u3002","\u4F7F\u7528\u8BED\u8A00\u914D\u7F6E\u786E\u5B9A\u4F55\u65F6\u81EA\u52A8\u5305\u4F4F\u6240\u9009\u5185\u5BB9\u3002","\u4F7F\u7528\u5F15\u53F7\u800C\u975E\u62EC\u53F7\u6765\u5305\u4F4F\u6240\u9009\u5185\u5BB9\u3002","\u4F7F\u7528\u62EC\u53F7\u800C\u975E\u5F15\u53F7\u6765\u5305\u4F4F\u6240\u9009\u5185\u5BB9\u3002","\u63A7\u5236\u5728\u952E\u5165\u5F15\u53F7\u6216\u65B9\u62EC\u53F7\u65F6\uFF0C\u7F16\u8F91\u5668\u662F\u5426\u5E94\u81EA\u52A8\u5C06\u6240\u9009\u5185\u5BB9\u62EC\u8D77\u6765\u3002","\u5728\u4F7F\u7528\u7A7A\u683C\u8FDB\u884C\u7F29\u8FDB\u65F6\u6A21\u62DF\u5236\u8868\u7B26\u7684\u9009\u62E9\u884C\u4E3A\u3002\u6240\u9009\u5185\u5BB9\u5C06\u59CB\u7EC8\u4F7F\u7528\u5236\u8868\u7B26\u505C\u6B62\u4F4D\u3002","\u63A7\u5236\u662F\u5426\u5728\u7F16\u8F91\u5668\u4E2D\u663E\u793A CodeLens\u3002","\u63A7\u5236 CodeLens \u7684\u5B57\u4F53\u7CFB\u5217\u3002","\u63A7\u5236 CodeLens \u7684\u5B57\u53F7(\u4EE5\u50CF\u7D20\u4E3A\u5355\u4F4D)\u3002\u8BBE\u7F6E\u4E3A 0 \u65F6\uFF0C\u5C06\u4F7F\u7528 90% \u7684 `#editor.fontSize#`\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u663E\u793A\u5185\u8054\u989C\u8272\u4FEE\u9970\u5668\u548C\u989C\u8272\u9009\u53D6\u5668\u3002","\u5728\u989C\u8272\u4FEE\u9970\u5668\u5355\u51FB\u548C\u60AC\u505C\u65F6\u4F7F\u989C\u8272\u9009\u53D6\u5668\u540C\u65F6\u663E\u793A","\u4F7F\u989C\u8272\u9009\u53D6\u5668\u5728\u989C\u8272\u4FEE\u9970\u5668\u60AC\u505C\u65F6\u663E\u793A","\u5355\u51FB\u989C\u8272\u4FEE\u9970\u5668\u65F6\u663E\u793A\u989C\u8272\u9009\u53D6\u5668","\u63A7\u5236\u4ECE\u989C\u8272\u4FEE\u9970\u5668\u663E\u793A\u989C\u8272\u9009\u53D6\u5668\u7684\u6761\u4EF6","\u63A7\u5236\u53EF\u4E00\u6B21\u6027\u5728\u7F16\u8F91\u5668\u4E2D\u5448\u73B0\u7684\u6700\u5927\u989C\u8272\u4FEE\u9970\u5668\u6570\u3002","\u542F\u7528\u4F7F\u7528\u9F20\u6807\u548C\u952E\u8FDB\u884C\u5217\u9009\u62E9\u3002","\u63A7\u5236\u5728\u590D\u5236\u65F6\u662F\u5426\u540C\u65F6\u590D\u5236\u8BED\u6CD5\u9AD8\u4EAE\u3002","\u63A7\u5236\u5149\u6807\u7684\u52A8\u753B\u6837\u5F0F\u3002","\u5DF2\u7981\u7528\u5E73\u6ED1\u8131\u5B57\u53F7\u52A8\u753B\u3002","\u4EC5\u5F53\u7528\u6237\u4F7F\u7528\u663E\u5F0F\u624B\u52BF\u79FB\u52A8\u5149\u6807\u65F6\uFF0C\u624D\u542F\u7528\u5E73\u6ED1\u8131\u5B57\u53F7\u52A8\u753B\u3002","\u59CB\u7EC8\u542F\u7528\u5E73\u6ED1\u8131\u5B57\u53F7\u52A8\u753B\u3002","\u63A7\u5236\u662F\u5426\u542F\u7528\u5E73\u6ED1\u63D2\u5165\u52A8\u753B\u3002","\u63A7\u5236\u5149\u6807\u6837\u5F0F\u3002","\u63A7\u5236\u5149\u6807\u5468\u56F4\u53EF\u89C1\u7684\u524D\u7F6E\u884C(\u6700\u5C0F\u503C\u4E3A 0)\u548C\u5C3E\u968F\u884C(\u6700\u5C0F\u503C\u4E3A 1)\u7684\u6700\u5C0F\u6570\u76EE\u3002\u5728\u5176\u4ED6\u4E00\u4E9B\u7F16\u8F91\u5668\u4E2D\u79F0\u4E3A \u201CscrollOff\u201D \u6216 \u201CscrollOffset\u201D\u3002",'\u4EC5\u5F53\u901A\u8FC7\u952E\u76D8\u6216 API \u89E6\u53D1\u65F6\uFF0C\u624D\u4F1A\u5F3A\u5236\u6267\u884C"\u5149\u6807\u73AF\u7ED5\u884C"\u3002','\u59CB\u7EC8\u5F3A\u5236\u6267\u884C "cursorSurroundingLines"','\u63A7\u5236\u4F55\u65F6\u5E94\u5F3A\u5236\u6267\u884C"#\u5149\u6807\u73AF\u7ED5\u884C#"\u3002',"\u5F53 `#editor.cursorStyle#` \u8BBE\u7F6E\u4E3A `line` \u65F6\uFF0C\u63A7\u5236\u5149\u6807\u7684\u5BBD\u5EA6\u3002","\u63A7\u5236\u5728\u7F16\u8F91\u5668\u4E2D\u662F\u5426\u5141\u8BB8\u901A\u8FC7\u62D6\u653E\u6765\u79FB\u52A8\u9009\u4E2D\u5185\u5BB9\u3002","\u5C06\u65B0\u7684\u5448\u73B0\u65B9\u6CD5\u4E0E svg \u914D\u5408\u4F7F\u7528\u3002","\u4F7F\u7528\u5305\u542B\u5B57\u4F53\u5B57\u7B26\u7684\u65B0\u5448\u73B0\u65B9\u6CD5\u3002","\u4F7F\u7528\u7A33\u5B9A\u5448\u73B0\u65B9\u6CD5\u3002","\u63A7\u5236\u662F\u5426\u4F7F\u7528\u65B0\u7684\u5B9E\u9A8C\u6027\u65B9\u6CD5\u5448\u73B0\u7A7A\u683C\u3002",'\u6309\u4E0B"Alt"\u65F6\u6EDA\u52A8\u901F\u5EA6\u500D\u589E\u3002',"\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u542F\u7528\u4E86\u4EE3\u7801\u6298\u53E0\u3002","\u4F7F\u7528\u7279\u5B9A\u4E8E\u8BED\u8A00\u7684\u6298\u53E0\u7B56\u7565(\u5982\u679C\u53EF\u7528)\uFF0C\u5426\u5219\u4F7F\u7528\u57FA\u4E8E\u7F29\u8FDB\u7684\u7B56\u7565\u3002","\u4F7F\u7528\u57FA\u4E8E\u7F29\u8FDB\u7684\u6298\u53E0\u7B56\u7565\u3002","\u63A7\u5236\u8BA1\u7B97\u6298\u53E0\u8303\u56F4\u7684\u7B56\u7565\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u7A81\u51FA\u663E\u793A\u6298\u53E0\u8303\u56F4\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u81EA\u52A8\u6298\u53E0\u5BFC\u5165\u8303\u56F4\u3002","\u53EF\u6298\u53E0\u533A\u57DF\u7684\u6700\u5927\u6570\u91CF\u3002\u5982\u679C\u5F53\u524D\u6E90\u5177\u6709\u5927\u91CF\u53EF\u6298\u53E0\u533A\u57DF\uFF0C\u90A3\u4E48\u589E\u52A0\u6B64\u503C\u53EF\u80FD\u4F1A\u5BFC\u81F4\u7F16\u8F91\u5668\u7684\u54CD\u5E94\u901F\u5EA6\u53D8\u6162\u3002","\u63A7\u5236\u5355\u51FB\u5DF2\u6298\u53E0\u7684\u884C\u540E\u9762\u7684\u7A7A\u5185\u5BB9\u662F\u5426\u4F1A\u5C55\u5F00\u8BE5\u884C\u3002","\u63A7\u5236\u5B57\u4F53\u7CFB\u5217\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u81EA\u52A8\u683C\u5F0F\u5316\u7C98\u8D34\u7684\u5185\u5BB9\u3002\u683C\u5F0F\u5316\u7A0B\u5E8F\u5FC5\u987B\u53EF\u7528\uFF0C\u5E76\u4E14\u80FD\u9488\u5BF9\u6587\u6863\u4E2D\u7684\u67D0\u4E00\u8303\u56F4\u8FDB\u884C\u683C\u5F0F\u5316\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u5728\u952E\u5165\u4E00\u884C\u540E\u662F\u5426\u81EA\u52A8\u683C\u5F0F\u5316\u8BE5\u884C\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u5448\u73B0\u5782\u76F4\u5B57\u5F62\u8FB9\u8DDD\u3002\u5B57\u5F62\u8FB9\u8DDD\u6700\u5E38\u7528\u4E8E\u8C03\u8BD5\u3002","\u63A7\u5236\u662F\u5426\u5728\u6982\u89C8\u6807\u5C3A\u4E2D\u9690\u85CF\u5149\u6807\u3002","\u63A7\u5236\u5B57\u6BCD\u95F4\u8DDD(\u50CF\u7D20)\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5DF2\u542F\u7528\u94FE\u63A5\u7F16\u8F91\u3002\u76F8\u5173\u7B26\u53F7(\u5982 HTML \u6807\u8BB0)\u5C06\u5728\u7F16\u8F91\u65F6\u8FDB\u884C\u66F4\u65B0\uFF0C\u5177\u4F53\u53D6\u51B3\u4E8E\u8BED\u8A00\u3002","\u63A7\u5236\u662F\u5426\u5728\u7F16\u8F91\u5668\u4E2D\u68C0\u6D4B\u94FE\u63A5\u5E76\u4F7F\u5176\u53EF\u88AB\u70B9\u51FB\u3002","\u7A81\u51FA\u663E\u793A\u5339\u914D\u7684\u62EC\u53F7\u3002","\u5BF9\u9F20\u6807\u6EDA\u8F6E\u6EDA\u52A8\u4E8B\u4EF6\u7684 `deltaX` \u548C `deltaY` \u4E58\u4E0A\u7684\u7CFB\u6570\u3002","\u6309\u4F4F Cmd \u952E\u5E76\u6EDA\u52A8\u9F20\u6807\u6EDA\u8F6E\u65F6\u5BF9\u7F16\u8F91\u5668\u5B57\u4F53\u5927\u5C0F\u8FDB\u884C\u7F29\u653E\u3002","\u6309\u4F4F `Ctrl` \u952E\u5E76\u6EDA\u52A8\u9F20\u6807\u6EDA\u8F6E\u65F6\u5BF9\u7F16\u8F91\u5668\u5B57\u4F53\u5927\u5C0F\u8FDB\u884C\u7F29\u653E\u3002","\u5F53\u591A\u4E2A\u5149\u6807\u91CD\u53E0\u65F6\u8FDB\u884C\u5408\u5E76\u3002","\u6620\u5C04\u4E3A `Ctrl` (Windows \u548C Linux) \u6216 `Command` (macOS)\u3002","\u6620\u5C04\u4E3A `Alt` (Windows \u548C Linux) \u6216 `Option` (macOS)\u3002","\u7528\u4E8E\u4F7F\u7528\u9F20\u6807\u6DFB\u52A0\u591A\u4E2A\u6E38\u6807\u7684\u4FEE\u9970\u7B26\u3002\u201C\u8F6C\u5230\u5B9A\u4E49\u201D\u548C\u201C\u6253\u5F00\u94FE\u63A5\u201D\u9F20\u6807\u624B\u52BF\u5C06\u8FDB\u884C\u8C03\u6574\uFF0C\u4F7F\u5176\u4E0D\u4E0E [\u591A\u5149\u6807\u4FEE\u9970\u7B26](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier)\u51B2\u7A81\u3002","\u6BCF\u4E2A\u5149\u6807\u7C98\u8D34\u4E00\u884C\u6587\u672C\u3002","\u6BCF\u4E2A\u5149\u6807\u7C98\u8D34\u5168\u6587\u3002","\u63A7\u5236\u7C98\u8D34\u65F6\u7C98\u8D34\u6587\u672C\u7684\u884C\u8BA1\u6570\u4E0E\u5149\u6807\u8BA1\u6570\u76F8\u5339\u914D\u3002","\u63A7\u5236\u4E00\u6B21\u53EF\u4EE5\u5728\u6D3B\u52A8\u7F16\u8F91\u5668\u4E2D\u663E\u793A\u7684\u6700\u5927\u6E38\u6807\u6570\u3002","\u4E0D\u7A81\u51FA\u663E\u793A\u51FA\u73B0\u6B21\u6570\u3002","\u4EC5\u7A81\u51FA\u663E\u793A\u5F53\u524D\u6587\u4EF6\u4E2D\u7684\u51FA\u73B0\u6B21\u6570\u3002","\u5B9E\u9A8C\u6027: \u7A81\u51FA\u663E\u793A\u6240\u6709\u6709\u6548\u6253\u5F00\u6587\u4EF6\u7684\u51FA\u73B0\u6B21\u6570\u3002","\u63A7\u5236\u662F\u5426\u5E94\u7A81\u51FA\u663E\u793A\u5728\u6253\u5F00\u7684\u6587\u4EF6\u4E2D\u7684\u51FA\u73B0\u6B21\u6570\u3002","\u63A7\u5236\u662F\u5426\u5728\u6982\u89C8\u6807\u5C3A\u5468\u56F4\u7ED8\u5236\u8FB9\u6846\u3002","\u6253\u5F00\u901F\u89C8\u65F6\u805A\u7126\u6811","\u6253\u5F00\u9884\u89C8\u65F6\u5C06\u7126\u70B9\u653E\u5728\u7F16\u8F91\u5668\u4E0A","\u63A7\u5236\u662F\u5C06\u7126\u70B9\u653E\u5728\u5185\u8054\u7F16\u8F91\u5668\u4E0A\u8FD8\u662F\u653E\u5728\u9884\u89C8\u5C0F\u90E8\u4EF6\u4E2D\u7684\u6811\u4E0A\u3002",'\u63A7\u5236"\u8F6C\u5230\u5B9A\u4E49"\u9F20\u6807\u624B\u52BF\u662F\u5426\u59CB\u7EC8\u6253\u5F00\u9884\u89C8\u5C0F\u90E8\u4EF6\u3002',"\u63A7\u5236\u663E\u793A\u5FEB\u901F\u5EFA\u8BAE\u524D\u7684\u7B49\u5F85\u65F6\u95F4 (\u6BEB\u79D2)\u3002","\u63A7\u5236\u662F\u5426\u5728\u7F16\u8F91\u5668\u4E2D\u8F93\u5165\u65F6\u81EA\u52A8\u91CD\u547D\u540D\u3002",'\u5DF2\u5F03\u7528\uFF0C\u8BF7\u6539\u7528 "editor.linkedEditing"\u3002',"\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u663E\u793A\u63A7\u5236\u5B57\u7B26\u3002","\u5F53\u6587\u4EF6\u4EE5\u6362\u884C\u7B26\u7ED3\u675F\u65F6, \u5448\u73B0\u6700\u540E\u4E00\u884C\u7684\u884C\u53F7\u3002","\u540C\u65F6\u7A81\u51FA\u663E\u793A\u5BFC\u822A\u7EBF\u548C\u5F53\u524D\u884C\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u7684\u5F53\u524D\u884C\u8FDB\u884C\u9AD8\u4EAE\u663E\u793A\u7684\u65B9\u5F0F\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u4EC5\u5728\u7126\u70B9\u5728\u7F16\u8F91\u5668\u65F6\u7A81\u51FA\u663E\u793A\u5F53\u524D\u884C\u3002","\u5448\u73B0\u7A7A\u683C\u5B57\u7B26(\u5B57\u8BCD\u4E4B\u95F4\u7684\u5355\u4E2A\u7A7A\u683C\u9664\u5916)\u3002","\u4EC5\u5728\u9009\u5B9A\u6587\u672C\u4E0A\u5448\u73B0\u7A7A\u767D\u5B57\u7B26\u3002","\u4EC5\u5448\u73B0\u5C3E\u968F\u7A7A\u683C\u5B57\u7B26\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u5728\u7A7A\u767D\u5B57\u7B26\u4E0A\u663E\u793A\u7B26\u53F7\u7684\u65B9\u5F0F\u3002","\u63A7\u5236\u9009\u533A\u662F\u5426\u6709\u5706\u89D2\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u6C34\u5E73\u6EDA\u52A8\u65F6\u53EF\u4EE5\u8D85\u8FC7\u8303\u56F4\u7684\u5B57\u7B26\u6570\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u53EF\u4EE5\u6EDA\u52A8\u5230\u6700\u540E\u4E00\u884C\u4E4B\u540E\u3002","\u540C\u65F6\u5782\u76F4\u548C\u6C34\u5E73\u6EDA\u52A8\u65F6\uFF0C\u4EC5\u6CBF\u4E3B\u8F74\u6EDA\u52A8\u3002\u5728\u89E6\u63A7\u677F\u4E0A\u5782\u76F4\u6EDA\u52A8\u65F6\uFF0C\u53EF\u9632\u6B62\u6C34\u5E73\u6F02\u79FB\u3002","\u63A7\u5236\u662F\u5426\u652F\u6301 Linux \u4E3B\u526A\u8D34\u677F\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u7A81\u51FA\u663E\u793A\u4E0E\u6240\u9009\u5185\u5BB9\u7C7B\u4F3C\u7684\u5339\u914D\u9879\u3002","\u59CB\u7EC8\u663E\u793A\u6298\u53E0\u63A7\u4EF6\u3002","\u5207\u52FF\u663E\u793A\u6298\u53E0\u63A7\u4EF6\u5E76\u51CF\u5C0F\u88C5\u8BA2\u7EBF\u5927\u5C0F\u3002","\u4EC5\u5728\u9F20\u6807\u4F4D\u4E8E\u88C5\u8BA2\u7EBF\u4E0A\u65B9\u65F6\u663E\u793A\u6298\u53E0\u63A7\u4EF6\u3002","\u63A7\u5236\u4F55\u65F6\u663E\u793A\u884C\u53F7\u69FD\u4E0A\u7684\u6298\u53E0\u63A7\u4EF6\u3002","\u63A7\u5236\u662F\u5426\u6DE1\u5316\u672A\u4F7F\u7528\u7684\u4EE3\u7801\u3002","\u63A7\u5236\u52A0\u5220\u9664\u7EBF\u88AB\u5F03\u7528\u7684\u53D8\u91CF\u3002","\u5728\u5176\u4ED6\u5EFA\u8BAE\u4E0A\u65B9\u663E\u793A\u4EE3\u7801\u7247\u6BB5\u5EFA\u8BAE\u3002","\u5728\u5176\u4ED6\u5EFA\u8BAE\u4E0B\u65B9\u663E\u793A\u4EE3\u7801\u7247\u6BB5\u5EFA\u8BAE\u3002","\u5728\u5176\u4ED6\u5EFA\u8BAE\u4E2D\u7A7F\u63D2\u663E\u793A\u4EE3\u7801\u7247\u6BB5\u5EFA\u8BAE\u3002","\u4E0D\u663E\u793A\u4EE3\u7801\u7247\u6BB5\u5EFA\u8BAE\u3002","\u63A7\u5236\u4EE3\u7801\u7247\u6BB5\u662F\u5426\u4E0E\u5176\u4ED6\u5EFA\u8BAE\u4E00\u8D77\u663E\u793A\u53CA\u5176\u6392\u5217\u7684\u4F4D\u7F6E\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u4F7F\u7528\u52A8\u753B\u6EDA\u52A8\u3002","\u63A7\u5236\u5728\u663E\u793A\u5185\u8054\u5B8C\u6210\u65F6\u662F\u5426\u5E94\u5411\u5C4F\u5E55\u9605\u8BFB\u5668\u7528\u6237\u63D0\u4F9B\u8F85\u52A9\u529F\u80FD\u63D0\u793A\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u7684\u5B57\u53F7\u3002\u8BBE\u7F6E\u4E3A {0} \u65F6\uFF0C\u5C06\u4F7F\u7528 {1} \u7684\u503C\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u7684\u884C\u9AD8\u3002\u8BBE\u7F6E\u4E3A {0} \u65F6\uFF0C\u5C06\u4F7F\u7528 {1} \u7684\u503C\u3002\u6700\u5C0F\u503C\u4E3A 8\u3002","\u63A7\u5236\u5728\u952E\u5165\u89E6\u53D1\u5B57\u7B26\u540E\u662F\u5426\u81EA\u52A8\u663E\u793A\u5EFA\u8BAE\u3002","\u59CB\u7EC8\u9009\u62E9\u7B2C\u4E00\u4E2A\u5EFA\u8BAE\u3002","\u9009\u62E9\u6700\u8FD1\u7684\u5EFA\u8BAE\uFF0C\u9664\u975E\u8FDB\u4E00\u6B65\u952E\u5165\u9009\u62E9\u5176\u4ED6\u9879\u3002\u4F8B\u5982 `console. -> console.log`\uFF0C\u56E0\u4E3A\u6700\u8FD1\u8865\u5168\u8FC7 `log`\u3002","\u6839\u636E\u4E4B\u524D\u8865\u5168\u8FC7\u7684\u5EFA\u8BAE\u7684\u524D\u7F00\u6765\u8FDB\u884C\u9009\u62E9\u3002\u4F8B\u5982\uFF0C`co -> console`\u3001`con -> const`\u3002","\u63A7\u5236\u5728\u5EFA\u8BAE\u5217\u8868\u4E2D\u5982\u4F55\u9884\u5148\u9009\u62E9\u5EFA\u8BAE\u3002","\u5728\u6309\u4E0B Tab \u952E\u65F6\u8FDB\u884C Tab \u8865\u5168\uFF0C\u5C06\u63D2\u5165\u6700\u4F73\u5339\u914D\u5EFA\u8BAE\u3002","\u7981\u7528 Tab \u8865\u5168\u3002",'\u5728\u524D\u7F00\u5339\u914D\u65F6\u8FDB\u884C Tab \u8865\u5168\u3002\u5728 "quickSuggestions" \u672A\u542F\u7528\u65F6\u4F53\u9A8C\u6700\u597D\u3002',"\u542F\u7528 Tab \u8865\u5168\u3002","\u81EA\u52A8\u5220\u9664\u5F02\u5E38\u7684\u884C\u7EC8\u6B62\u7B26\u3002","\u5FFD\u7565\u5F02\u5E38\u7684\u884C\u7EC8\u6B62\u7B26\u3002","\u63D0\u793A\u5220\u9664\u5F02\u5E38\u7684\u884C\u7EC8\u6B62\u7B26\u3002","\u5220\u9664\u53EF\u80FD\u5BFC\u81F4\u95EE\u9898\u7684\u5F02\u5E38\u884C\u7EC8\u6B62\u7B26\u3002","\u6839\u636E\u5236\u8868\u4F4D\u63D2\u5165\u548C\u5220\u9664\u7A7A\u683C\u3002","\u4F7F\u7528\u9ED8\u8BA4\u6362\u884C\u89C4\u5219\u3002","\u4E2D\u6587/\u65E5\u8BED/\u97E9\u8BED(CJK)\u6587\u672C\u4E0D\u5E94\u4F7F\u7528\u65AD\u5B57\u529F\u80FD\u3002\u975E CJK \u6587\u672C\u884C\u4E3A\u4E0E\u666E\u901A\u6587\u672C\u884C\u4E3A\u76F8\u540C\u3002","\u63A7\u5236\u4E2D\u6587/\u65E5\u8BED/\u97E9\u8BED(CJK)\u6587\u672C\u4F7F\u7528\u7684\u65AD\u5B57\u89C4\u5219\u3002","\u6267\u884C\u5355\u8BCD\u76F8\u5173\u7684\u5BFC\u822A\u6216\u64CD\u4F5C\u65F6\u4F5C\u4E3A\u5355\u8BCD\u5206\u9694\u7B26\u7684\u5B57\u7B26\u3002","\u6C38\u4E0D\u6362\u884C\u3002","\u5C06\u5728\u89C6\u533A\u5BBD\u5EA6\u5904\u6362\u884C\u3002","\u5728 `#editor.wordWrapColumn#` \u5904\u6298\u884C\u3002","\u5728\u89C6\u533A\u5BBD\u5EA6\u548C `#editor.wordWrapColumn#` \u4E2D\u7684\u8F83\u5C0F\u503C\u5904\u6298\u884C\u3002","\u63A7\u5236\u6298\u884C\u7684\u65B9\u5F0F\u3002","\u5728 `#editor.wordWrap#` \u4E3A `wordWrapColumn` \u6216 `bounded` \u65F6\uFF0C\u63A7\u5236\u7F16\u8F91\u5668\u7684\u6298\u884C\u5217\u3002","\u63A7\u5236\u662F\u5426\u5E94\u4F7F\u7528\u9ED8\u8BA4\u6587\u6863\u989C\u8272\u63D0\u4F9B\u7A0B\u5E8F\u663E\u793A\u5185\u8054\u989C\u8272\u4FEE\u9970","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u63A5\u6536\u9009\u9879\u5361\u8FD8\u662F\u5C06\u5176\u5EF6\u8FDF\u5230\u5DE5\u4F5C\u53F0\u8FDB\u884C\u5BFC\u822A\u3002"],"vs/editor/common/core/editorColorRegistry":["\u5149\u6807\u6240\u5728\u884C\u9AD8\u4EAE\u5185\u5BB9\u7684\u80CC\u666F\u989C\u8272\u3002","\u5149\u6807\u6240\u5728\u884C\u56DB\u5468\u8FB9\u6846\u7684\u80CC\u666F\u989C\u8272\u3002","\u80CC\u666F\u989C\u8272\u7684\u9AD8\u4EAE\u8303\u56F4\uFF0C\u559C\u6B22\u901A\u8FC7\u5FEB\u901F\u6253\u5F00\u548C\u67E5\u627E\u529F\u80FD\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u9AD8\u4EAE\u533A\u57DF\u8FB9\u6846\u7684\u80CC\u666F\u989C\u8272\u3002","\u9AD8\u4EAE\u663E\u793A\u7B26\u53F7\u7684\u80CC\u666F\u989C\u8272\uFF0C\u4F8B\u5982\u8F6C\u5230\u5B9A\u4E49\u6216\u8F6C\u5230\u4E0B\u4E00\u4E2A/\u4E0A\u4E00\u4E2A\u7B26\u53F7\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u9AD8\u4EAE\u663E\u793A\u7B26\u53F7\u5468\u56F4\u7684\u8FB9\u6846\u7684\u80CC\u666F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u5149\u6807\u989C\u8272\u3002","\u7F16\u8F91\u5668\u5149\u6807\u7684\u80CC\u666F\u8272\u3002\u53EF\u4EE5\u81EA\u5B9A\u4E49\u5757\u578B\u5149\u6807\u8986\u76D6\u5B57\u7B26\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u7A7A\u767D\u5B57\u7B26\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u884C\u53F7\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u7F29\u8FDB\u53C2\u8003\u7EBF\u7684\u989C\u8272\u3002","\u201CeditorIndentGuide.background\u201D \u5DF2\u5F03\u7528\u3002\u8BF7\u6539\u7528 \u201CeditorIndentGuide.background1\u201D\u3002","\u7F16\u8F91\u5668\u6D3B\u52A8\u7F29\u8FDB\u53C2\u8003\u7EBF\u7684\u989C\u8272\u3002","\u201CeditorIndentGuide.activeBackground\u201D \u5DF2\u5F03\u7528\u3002\u8BF7\u6539\u7528 \u201CeditorIndentGuide.activeBackground1\u201D\u3002","\u7F16\u8F91\u5668\u7F29\u8FDB\u53C2\u8003\u7EBF (1) \u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u7F29\u8FDB\u53C2\u8003\u7EBF (2) \u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u7F29\u8FDB\u53C2\u8003\u7EBF (3) \u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u7F29\u8FDB\u53C2\u8003\u7EBF (4) \u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u7F29\u8FDB\u53C2\u8003\u7EBF (5) \u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u7F29\u8FDB\u53C2\u8003\u7EBF (6) \u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6D3B\u52A8\u7F29\u8FDB\u53C2\u8003\u7EBF (1) \u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6D3B\u52A8\u7F29\u8FDB\u53C2\u8003\u7EBF (2) \u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6D3B\u52A8\u7F29\u8FDB\u53C2\u8003\u7EBF (3) \u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6D3B\u52A8\u7F29\u8FDB\u53C2\u8003\u7EBF (4) \u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6D3B\u52A8\u7F29\u8FDB\u53C2\u8003\u7EBF (5) \u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6D3B\u52A8\u7F29\u8FDB\u53C2\u8003\u7EBF (6) \u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6D3B\u52A8\u884C\u53F7\u7684\u989C\u8272",'"Id" \u5DF2\u88AB\u5F03\u7528\uFF0C\u8BF7\u6539\u7528 "editorLineNumber.activeForeground"\u3002',"\u7F16\u8F91\u5668\u6D3B\u52A8\u884C\u53F7\u7684\u989C\u8272","\u5C06 editor.renderFinalNewline \u8BBE\u7F6E\u4E3A\u7070\u8272\u65F6\u6700\u7EC8\u7F16\u8F91\u5668\u884C\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6807\u5C3A\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668 CodeLens \u7684\u524D\u666F\u8272","\u5339\u914D\u62EC\u53F7\u7684\u80CC\u666F\u8272","\u5339\u914D\u62EC\u53F7\u5916\u6846\u7684\u989C\u8272","\u6982\u89C8\u6807\u5C3A\u8FB9\u6846\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6982\u8FF0\u6807\u5C3A\u7684\u80CC\u666F\u8272\u3002","\u7F16\u8F91\u5668\u5BFC\u822A\u7EBF\u7684\u80CC\u666F\u8272\u3002\u5BFC\u822A\u7EBF\u5305\u62EC\u8FB9\u7F18\u7B26\u53F7\u548C\u884C\u53F7\u3002","\u7F16\u8F91\u5668\u4E2D\u4E0D\u5FC5\u8981(\u672A\u4F7F\u7528)\u7684\u6E90\u4EE3\u7801\u7684\u8FB9\u6846\u989C\u8272\u3002",'\u975E\u5FC5\u987B(\u672A\u4F7F\u7528)\u4EE3\u7801\u7684\u5728\u7F16\u8F91\u5668\u4E2D\u663E\u793A\u7684\u4E0D\u900F\u660E\u5EA6\u3002\u4F8B\u5982\uFF0C"#000000c0" \u5C06\u4EE5 75% \u7684\u4E0D\u900F\u660E\u5EA6\u663E\u793A\u4EE3\u7801\u3002\u5BF9\u4E8E\u9AD8\u5BF9\u6BD4\u5EA6\u4E3B\u9898\uFF0C\u8BF7\u4F7F\u7528 \u201DeditorUnnecessaryCode.border\u201C \u4E3B\u9898\u6765\u4E3A\u975E\u5FC5\u987B\u4EE3\u7801\u6DFB\u52A0\u4E0B\u5212\u7EBF\uFF0C\u4EE5\u907F\u514D\u989C\u8272\u6DE1\u5316\u3002',"\u7F16\u8F91\u5668\u4E2D\u865A\u5F71\u6587\u672C\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u865A\u5F71\u6587\u672C\u7684\u524D\u666F\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u865A\u5F71\u6587\u672C\u7684\u80CC\u666F\u8272\u3002","\u7528\u4E8E\u7A81\u51FA\u663E\u793A\u8303\u56F4\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u6982\u89C8\u6807\u5C3A\u4E2D\u9519\u8BEF\u6807\u8BB0\u7684\u989C\u8272\u3002","\u6982\u89C8\u6807\u5C3A\u4E2D\u8B66\u544A\u6807\u8BB0\u7684\u989C\u8272\u3002","\u6982\u89C8\u6807\u5C3A\u4E2D\u4FE1\u606F\u6807\u8BB0\u7684\u989C\u8272\u3002","\u62EC\u53F7\u7684\u524D\u666F\u8272(1)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u7740\u8272\u3002","\u62EC\u53F7\u7684\u524D\u666F\u8272(2)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u7740\u8272\u3002","\u62EC\u53F7\u7684\u524D\u666F\u8272(3)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u7740\u8272\u3002","\u62EC\u53F7\u7684\u524D\u666F\u8272(4)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u7740\u8272\u3002","\u62EC\u53F7\u7684\u524D\u666F\u8272(5)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u7740\u8272\u3002","\u62EC\u53F7\u7684\u524D\u666F\u8272(6)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u7740\u8272\u3002","\u65B9\u62EC\u53F7\u51FA\u73B0\u610F\u5916\u7684\u524D\u666F\u8272\u3002","\u975E\u6D3B\u52A8\u62EC\u53F7\u5BF9\u6307\u5357\u7684\u80CC\u666F\u8272(1)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u6307\u5357\u3002","\u975E\u6D3B\u52A8\u62EC\u53F7\u5BF9\u6307\u5357\u7684\u80CC\u666F\u8272(2)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u6307\u5357\u3002","\u975E\u6D3B\u52A8\u62EC\u53F7\u5BF9\u6307\u5357\u7684\u80CC\u666F\u8272(3)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u6307\u5357\u3002","\u975E\u6D3B\u52A8\u62EC\u53F7\u5BF9\u6307\u5357\u7684\u80CC\u666F\u8272(4)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u6307\u5357\u3002","\u975E\u6D3B\u52A8\u62EC\u53F7\u5BF9\u6307\u5357\u7684\u80CC\u666F\u8272(5)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u6307\u5357\u3002","\u975E\u6D3B\u52A8\u62EC\u53F7\u5BF9\u6307\u5357\u7684\u80CC\u666F\u8272(6)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u6307\u5357\u3002","\u6D3B\u52A8\u62EC\u53F7\u5BF9\u6307\u5357\u7684\u80CC\u666F\u8272(1)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u6307\u5357\u3002","\u6D3B\u52A8\u62EC\u53F7\u5BF9\u6307\u5357\u7684\u80CC\u666F\u8272(2)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u6307\u5357\u3002","\u6D3B\u52A8\u62EC\u53F7\u5BF9\u6307\u5357\u7684\u80CC\u666F\u8272(3)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u6307\u5357\u3002","\u6D3B\u52A8\u62EC\u53F7\u5BF9\u6307\u5357\u7684\u80CC\u666F\u8272(4)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u6307\u5357\u3002","\u6D3B\u52A8\u62EC\u53F7\u5BF9\u6307\u5357\u7684\u80CC\u666F\u8272(5)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u6307\u5357\u3002","\u6D3B\u52A8\u62EC\u53F7\u5BF9\u6307\u5357\u7684\u80CC\u666F\u8272(6)\u3002\u9700\u8981\u542F\u7528\u62EC\u53F7\u5BF9\u6307\u5357\u3002","\u7528\u4E8E\u7A81\u51FA\u663E\u793A Unicode \u5B57\u7B26\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7528\u4E8E\u7A81\u51FA\u663E\u793A Unicode \u5B57\u7B26\u7684\u80CC\u666F\u989C\u8272\u3002"],"vs/editor/common/editorContextKeys":["\u7F16\u8F91\u5668\u6587\u672C\u662F\u5426\u5177\u6709\u7126\u70B9(\u5149\u6807\u662F\u5426\u95EA\u70C1)","\u7F16\u8F91\u5668\u6216\u7F16\u8F91\u5668\u5C0F\u7EC4\u4EF6\u662F\u5426\u5177\u6709\u7126\u70B9(\u4F8B\u5982\u7126\u70B9\u5728\u201C\u67E5\u627E\u201D\u5C0F\u7EC4\u4EF6\u4E2D)","\u7F16\u8F91\u5668\u6216 RTF \u8F93\u5165\u662F\u5426\u6709\u7126\u70B9(\u5149\u6807\u662F\u5426\u95EA\u70C1)","\u7F16\u8F91\u5668\u662F\u5426\u4E3A\u53EA\u8BFB","\u4E0A\u4E0B\u6587\u662F\u5426\u4E3A\u5DEE\u5F02\u7F16\u8F91\u5668","\u4E0A\u4E0B\u6587\u662F\u5426\u4E3A\u5D4C\u5165\u5F0F\u5DEE\u5F02\u7F16\u8F91\u5668","\u4E0A\u4E0B\u6587\u662F\u5426\u4E3A\u591A\u4E2A\u5DEE\u5F02\u7F16\u8F91\u5668","\u662F\u5426\u6298\u53E0\u591A\u5DEE\u5F02\u7F16\u8F91\u5668\u4E2D\u7684\u6240\u6709\u6587\u4EF6","\u5DEE\u5F02\u7F16\u8F91\u5668\u662F\u5426\u6709\u66F4\u6539","\u662F\u5426\u9009\u62E9\u79FB\u52A8\u7684\u4EE3\u7801\u5757\u8FDB\u884C\u6BD4\u8F83","\u53EF\u8BBF\u95EE\u5DEE\u5F02\u67E5\u770B\u5668\u662F\u5426\u53EF\u89C1","\u662F\u5426\u5DF2\u5230\u8FBE\u5DEE\u5F02\u7F16\u8F91\u5668\u5E76\u6392\u5448\u73B0\u5185\u8054\u65AD\u70B9",'\u662F\u5426\u5DF2\u542F\u7528 "editor.columnSelection"',"\u7F16\u8F91\u5668\u662F\u5426\u5DF2\u9009\u5B9A\u6587\u672C","\u7F16\u8F91\u5668\u662F\u5426\u6709\u591A\u4E2A\u9009\u62E9",'"Tab" \u662F\u5426\u5C06\u7126\u70B9\u79FB\u51FA\u7F16\u8F91\u5668',"\u7F16\u8F91\u5668\u8F6F\u952E\u76D8\u662F\u5426\u53EF\u89C1","\u662F\u5426\u805A\u7126\u7F16\u8F91\u5668\u60AC\u505C","\u662F\u5426\u805A\u7126\u7C98\u6027\u6EDA\u52A8","\u7C98\u6027\u6EDA\u52A8\u662F\u5426\u53EF\u89C1","\u72EC\u7ACB\u989C\u8272\u9009\u53D6\u5668\u662F\u5426\u53EF\u89C1","\u72EC\u7ACB\u989C\u8272\u9009\u53D6\u5668\u662F\u5426\u805A\u7126","\u8BE5\u7F16\u8F91\u5668\u662F\u5426\u662F\u66F4\u5927\u7684\u7F16\u8F91\u5668(\u4F8B\u5982\u7B14\u8BB0\u672C)\u7684\u4E00\u90E8\u5206","\u7F16\u8F91\u5668\u7684\u8BED\u8A00\u6807\u8BC6\u7B26","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u8865\u5168\u9879\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u4EE3\u7801\u64CD\u4F5C\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709 CodeLens \u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u5B9A\u4E49\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u58F0\u660E\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u5B9E\u73B0\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u7C7B\u578B\u5B9A\u4E49\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u60AC\u505C\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u6587\u6863\u7A81\u51FA\u663E\u793A\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u6587\u6863\u7B26\u53F7\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u5F15\u7528\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u91CD\u547D\u540D\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u7B7E\u540D\u5E2E\u52A9\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u5185\u8054\u63D0\u793A\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u6587\u6863\u683C\u5F0F\u8BBE\u7F6E\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u6587\u6863\u9009\u62E9\u683C\u5F0F\u8BBE\u7F6E\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u5177\u6709\u591A\u4E2A\u6587\u6863\u683C\u5F0F\u8BBE\u7F6E\u63D0\u4F9B\u7A0B\u5E8F","\u7F16\u8F91\u5668\u662F\u5426\u6709\u591A\u4E2A\u6587\u6863\u9009\u62E9\u683C\u5F0F\u8BBE\u7F6E\u63D0\u4F9B\u7A0B\u5E8F"],"vs/editor/common/languages":["\u6570\u7EC4","\u5E03\u5C14\u503C","\u7C7B","\u5E38\u6570","\u6784\u9020\u51FD\u6570","\u679A\u4E3E","\u679A\u4E3E\u6210\u5458","\u4E8B\u4EF6","\u5B57\u6BB5","\u6587\u4EF6","\u51FD\u6570","\u63A5\u53E3","\u952E","\u65B9\u6CD5","\u6A21\u5757","\u547D\u540D\u7A7A\u95F4","Null","\u6570\u5B57","\u5BF9\u8C61","\u8FD0\u7B97\u7B26","\u5305","\u5C5E\u6027","\u5B57\u7B26\u4E32","\u7ED3\u6784","\u7C7B\u578B\u53C2\u6570","\u53D8\u91CF","{0} ({1})"],"vs/editor/common/languages/modesRegistry":["\u7EAF\u6587\u672C"],"vs/editor/common/model/editStack":["\u8F93\u5165"],"vs/editor/common/standaloneStrings":["\u5F00\u53D1\u4EBA\u5458: \u68C0\u67E5\u4EE4\u724C","\u8F6C\u5230\u884C/\u5217...","\u663E\u793A\u6240\u6709\u5FEB\u901F\u8BBF\u95EE\u63D0\u4F9B\u7A0B\u5E8F","\u547D\u4EE4\u9762\u677F","\u663E\u793A\u5E76\u8FD0\u884C\u547D\u4EE4","\u8F6C\u5230\u7B26\u53F7...","\u6309\u7C7B\u522B\u8F6C\u5230\u7B26\u53F7...","\u7F16\u8F91\u5668\u5185\u5BB9","\u6309 Alt+F1 \u53EF\u6253\u5F00\u8F85\u52A9\u529F\u80FD\u9009\u9879\u3002","\u5207\u6362\u9AD8\u5BF9\u6BD4\u5EA6\u4E3B\u9898","\u5728 {1} \u4E2A\u6587\u4EF6\u4E2D\u8FDB\u884C\u4E86 {0} \u6B21\u7F16\u8F91"],"vs/editor/common/viewLayout/viewLineRenderer":["\u663E\u793A\u66F4\u591A({0})","{0} \u5B57\u7B26"],"vs/editor/contrib/anchorSelect/browser/anchorSelect":["\u9009\u62E9\u5B9A\u4F4D\u70B9","\u5B9A\u4F4D\u70B9\u8BBE\u7F6E\u4E3A {0}:{1}","\u8BBE\u7F6E\u9009\u62E9\u5B9A\u4F4D\u70B9","\u8F6C\u5230\u9009\u62E9\u5B9A\u4F4D\u70B9","\u9009\u62E9\u4ECE\u5B9A\u4F4D\u70B9\u5230\u5149\u6807","\u53D6\u6D88\u9009\u62E9\u5B9A\u4F4D\u70B9"],"vs/editor/contrib/bracketMatching/browser/bracketMatching":["\u6982\u89C8\u6807\u5C3A\u4E0A\u8868\u793A\u5339\u914D\u62EC\u53F7\u7684\u6807\u8BB0\u989C\u8272\u3002","\u8F6C\u5230\u62EC\u53F7","\u9009\u62E9\u62EC\u53F7\u6240\u6709\u5185\u5BB9","\u5220\u9664\u62EC\u53F7","\u8F6C\u5230\u62EC\u53F7(&&B)","\u9009\u62E9\u5176\u4E2D\u7684\u6587\u672C\uFF0C\u5305\u62EC\u62EC\u53F7\u6216\u5927\u62EC\u53F7"],"vs/editor/contrib/caretOperations/browser/caretOperations":["\u5411\u5DE6\u79FB\u52A8\u6240\u9009\u6587\u672C","\u5411\u53F3\u79FB\u52A8\u6240\u9009\u6587\u672C"],"vs/editor/contrib/caretOperations/browser/transpose":["\u8F6C\u7F6E\u5B57\u6BCD"],"vs/editor/contrib/clipboard/browser/clipboard":["\u526A\u5207(&&T)","\u526A\u5207","\u526A\u5207","\u526A\u5207","\u590D\u5236(&&C)","\u590D\u5236","\u590D\u5236","\u590D\u5236","\u590D\u5236\u4E3A","\u590D\u5236\u4E3A","\u5171\u4EAB","\u5171\u4EAB","\u5171\u4EAB","\u7C98\u8D34(&&P)","\u7C98\u8D34","\u7C98\u8D34","\u7C98\u8D34","\u590D\u5236\u5E76\u7A81\u51FA\u663E\u793A\u8BED\u6CD5"],"vs/editor/contrib/codeAction/browser/codeAction":["\u5E94\u7528\u4EE3\u7801\u64CD\u4F5C\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF"],"vs/editor/contrib/codeAction/browser/codeActionCommands":["\u8981\u8FD0\u884C\u7684\u4EE3\u7801\u64CD\u4F5C\u7684\u79CD\u7C7B\u3002","\u63A7\u5236\u4F55\u65F6\u5E94\u7528\u8FD4\u56DE\u7684\u64CD\u4F5C\u3002","\u59CB\u7EC8\u5E94\u7528\u7B2C\u4E00\u4E2A\u8FD4\u56DE\u7684\u4EE3\u7801\u64CD\u4F5C\u3002","\u5982\u679C\u4EC5\u8FD4\u56DE\u7684\u7B2C\u4E00\u4E2A\u4EE3\u7801\u64CD\u4F5C\uFF0C\u5219\u5E94\u7528\u8BE5\u64CD\u4F5C\u3002","\u4E0D\u8981\u5E94\u7528\u8FD4\u56DE\u7684\u4EE3\u7801\u64CD\u4F5C\u3002","\u5982\u679C\u53EA\u5E94\u8FD4\u56DE\u9996\u9009\u4EE3\u7801\u64CD\u4F5C\uFF0C\u5219\u5E94\u8FD4\u56DE\u63A7\u4EF6\u3002","\u5FEB\u901F\u4FEE\u590D...","\u6CA1\u6709\u53EF\u7528\u7684\u4EE3\u7801\u64CD\u4F5C",'\u6CA1\u6709\u9002\u7528\u4E8E"{0}"\u7684\u9996\u9009\u4EE3\u7801\u64CD\u4F5C','\u6CA1\u6709\u9002\u7528\u4E8E"{0}"\u7684\u4EE3\u7801\u64CD\u4F5C',"\u6CA1\u6709\u53EF\u7528\u7684\u9996\u9009\u4EE3\u7801\u64CD\u4F5C","\u6CA1\u6709\u53EF\u7528\u7684\u4EE3\u7801\u64CD\u4F5C","\u91CD\u6784...",'\u6CA1\u6709\u9002\u7528\u4E8E"{0}"\u7684\u9996\u9009\u91CD\u6784','\u6CA1\u6709\u53EF\u7528\u7684"{0}"\u91CD\u6784',"\u6CA1\u6709\u53EF\u7528\u7684\u9996\u9009\u91CD\u6784","\u6CA1\u6709\u53EF\u7528\u7684\u91CD\u6784\u64CD\u4F5C","\u6E90\u4EE3\u7801\u64CD\u4F5C...",'\u6CA1\u6709\u9002\u7528\u4E8E"{0}"\u7684\u9996\u9009\u6E90\u64CD\u4F5C',"\u6CA1\u6709\u9002\u7528\u4E8E\u201C {0}\u201D\u7684\u6E90\u64CD\u4F5C","\u6CA1\u6709\u53EF\u7528\u7684\u9996\u9009\u6E90\u64CD\u4F5C","\u6CA1\u6709\u53EF\u7528\u7684\u6E90\u4EE3\u7801\u64CD\u4F5C","\u6574\u7406 import \u8BED\u53E5","\u6CA1\u6709\u53EF\u7528\u7684\u6574\u7406 import \u8BED\u53E5\u64CD\u4F5C","\u5168\u90E8\u4FEE\u590D","\u6CA1\u6709\u53EF\u7528\u7684\u201C\u5168\u90E8\u4FEE\u590D\u201D\u64CD\u4F5C","\u81EA\u52A8\u4FEE\u590D...","\u6CA1\u6709\u53EF\u7528\u7684\u81EA\u52A8\u4FEE\u590D\u7A0B\u5E8F"],"vs/editor/contrib/codeAction/browser/codeActionContributions":["\u542F\u7528/\u7981\u7528\u5728\u4EE3\u7801\u64CD\u4F5C\u83DC\u5355\u4E2D\u663E\u793A\u7EC4\u6807\u5934\u3002","\u542F\u7528/\u7981\u7528\u5728\u5F53\u524D\u672A\u8FDB\u884C\u8BCA\u65AD\u65F6\u663E\u793A\u884C\u5185\u6700\u8FD1\u7684\u5FEB\u901F\u4FEE\u590D\u3002"],"vs/editor/contrib/codeAction/browser/codeActionController":["\u4E0A\u4E0B\u6587: {0} \u4F4D\u4E8E\u884C {1} \u548C\u5217 {2}\u3002","\u9690\u85CF\u5DF2\u7981\u7528\u9879","\u663E\u793A\u5DF2\u7981\u7528\u9879"],"vs/editor/contrib/codeAction/browser/codeActionMenu":["\u66F4\u591A\u64CD\u4F5C...","\u5FEB\u901F\u4FEE\u590D","\u63D0\u53D6","\u5185\u8054","\u91CD\u5199","\u79FB\u52A8","\u5916\u4FA7\u4EE3\u7801","\u6E90\u4EE3\u7801\u64CD\u4F5C"],"vs/editor/contrib/codeAction/browser/lightBulbWidget":["\u8FD0\u884C\uFF1A{0}","\u663E\u793A\u4EE3\u7801\u64CD\u4F5C\u3002\u9996\u9009\u53EF\u7528\u7684\u5FEB\u901F\u4FEE\u590D({0})","\u663E\u793A\u4EE3\u7801\u64CD\u4F5C({0})","\u663E\u793A\u4EE3\u7801\u64CD\u4F5C"],"vs/editor/contrib/codelens/browser/codelensController":["\u663E\u793A\u5F53\u524D\u884C\u7684 Code Lens \u547D\u4EE4","\u9009\u62E9\u547D\u4EE4"],"vs/editor/contrib/colorPicker/browser/colorPickerWidget":["\u5355\u51FB\u4EE5\u5207\u6362\u989C\u8272\u9009\u9879 (rgb/hsl/hex)","\u7528\u4E8E\u5173\u95ED\u989C\u8272\u9009\u53D6\u5668\u7684\u56FE\u6807"],"vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions":["\u663E\u793A\u6216\u805A\u7126\u72EC\u7ACB\u989C\u8272\u9009\u53D6\u5668","&&\u663E\u793A\u6216\u805A\u7126\u72EC\u7ACB\u989C\u8272\u9009\u53D6\u5668","\u9690\u85CF\u989C\u8272\u9009\u53D6\u5668","\u4F7F\u7528\u72EC\u7ACB\u989C\u8272\u9009\u53D6\u5668\u63D2\u5165\u989C\u8272"],"vs/editor/contrib/comment/browser/comment":["\u5207\u6362\u884C\u6CE8\u91CA","\u5207\u6362\u884C\u6CE8\u91CA(&&T)","\u6DFB\u52A0\u884C\u6CE8\u91CA","\u5220\u9664\u884C\u6CE8\u91CA","\u5207\u6362\u5757\u6CE8\u91CA","\u5207\u6362\u5757\u6CE8\u91CA(&&B)"],"vs/editor/contrib/contextmenu/browser/contextmenu":["\u7F29\u7565\u56FE","\u5448\u73B0\u5B57\u7B26","\u5782\u76F4\u5927\u5C0F","\u6210\u6BD4\u4F8B","\u586B\u5145","\u9002\u5E94","\u6ED1\u5757","\u9F20\u6807\u60AC\u505C","\u59CB\u7EC8","\u663E\u793A\u7F16\u8F91\u5668\u4E0A\u4E0B\u6587\u83DC\u5355"],"vs/editor/contrib/cursorUndo/browser/cursorUndo":["\u5149\u6807\u64A4\u6D88","\u5149\u6807\u91CD\u505A"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution":["\u7C98\u8D34\u4E3A...","\u8981\u5C1D\u8BD5\u5E94\u7528\u7684\u7C98\u8D34\u7F16\u8F91\u7684 ID\u3002\u5982\u679C\u672A\u63D0\u4F9B\uFF0C\u7F16\u8F91\u5668\u5C06\u663E\u793A\u9009\u53D6\u5668\u3002","\u7C98\u8D34\u4E3A\u6587\u672C"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteController":["\u662F\u5426\u663E\u793A\u7C98\u8D34\u5C0F\u7EC4\u4EF6","\u663E\u793A\u7C98\u8D34\u9009\u9879...","\u627E\u4E0D\u5230\u201C{0}\u201D\u7684\u7C98\u8D34\u7F16\u8F91","\u6B63\u5728\u8FD0\u884C\u7C98\u8D34\u5904\u7406\u7A0B\u5E8F\u3002\u5355\u51FB\u4EE5\u53D6\u6D88","\u9009\u62E9\u7C98\u8D34\u64CD\u4F5C","\u6B63\u5728\u8FD0\u884C\u7C98\u8D34\u5904\u7406\u7A0B\u5E8F"],"vs/editor/contrib/dropOrPasteInto/browser/defaultProviders":["\u5185\u7F6E","\u63D2\u5165\u7EAF\u6587\u672C","\u63D2\u5165 URI","\u63D2\u5165 URI","\u63D2\u5165\u8DEF\u5F84","\u63D2\u5165\u8DEF\u5F84","\u63D2\u5165\u76F8\u5BF9\u8DEF\u5F84","\u63D2\u5165\u76F8\u5BF9\u8DEF\u5F84","\u63D2\u5165 HTML"],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution":["\u5C06\u9ED8\u8BA4\u653E\u7F6E\u63D0\u4F9B\u7A0B\u5E8F\u914D\u7F6E\u4E3A\u7528\u4E8E\u7ED9\u5B9A MIME \u7C7B\u578B\u7684\u5185\u5BB9\u3002"],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController":["\u662F\u5426\u663E\u793A\u653E\u7F6E\u5C0F\u7EC4\u4EF6","\u663E\u793A\u653E\u7F6E\u9009\u9879...","\u6B63\u5728\u8FD0\u884C\u653E\u7F6E\u5904\u7406\u7A0B\u5E8F\u3002\u5355\u51FB\u4EE5\u53D6\u6D88"],"vs/editor/contrib/editorState/browser/keybindingCancellation":["\u7F16\u8F91\u5668\u662F\u5426\u8FD0\u884C\u53EF\u53D6\u6D88\u7684\u64CD\u4F5C\uFF0C\u4F8B\u5982\u201C\u9884\u89C8\u5F15\u7528\u201D"],"vs/editor/contrib/find/browser/findController":["\u6587\u4EF6\u592A\u5927\uFF0C\u65E0\u6CD5\u6267\u884C\u5168\u90E8\u66FF\u6362\u64CD\u4F5C\u3002","\u67E5\u627E","\u67E5\u627E(&&F)","\u4F7F\u7528\u53C2\u6570\u67E5\u627E","\u67E5\u627E\u9009\u5B9A\u5185\u5BB9","\u67E5\u627E\u4E0B\u4E00\u4E2A","\u67E5\u627E\u4E0A\u4E00\u4E2A","\u8F6C\u5230\u201C\u5339\u914D\u201D...","\u65E0\u5339\u914D\u9879\u3002\u8BF7\u5C1D\u8BD5\u641C\u7D22\u5176\u4ED6\u5185\u5BB9\u3002","\u952E\u5165\u6570\u5B57\u4EE5\u8F6C\u5230\u7279\u5B9A\u5339\u914D\u9879(\u4ECB\u4E8E 1 \u548C {0} \u4E4B\u95F4)","\u8BF7\u952E\u5165\u4ECB\u4E8E 1 \u548C {0} \u4E4B\u95F4\u7684\u6570\u5B57","\u8BF7\u952E\u5165\u4ECB\u4E8E 1 \u548C {0} \u4E4B\u95F4\u7684\u6570\u5B57","\u67E5\u627E\u4E0B\u4E00\u4E2A\u9009\u62E9","\u67E5\u627E\u4E0A\u4E00\u4E2A\u9009\u62E9","\u66FF\u6362","\u66FF\u6362(&&R)"],"vs/editor/contrib/find/browser/findWidget":["\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u5728\u9009\u5B9A\u5185\u5BB9\u4E2D\u67E5\u627E\u201D\u56FE\u6807\u3002","\u7528\u4E8E\u6307\u793A\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u5DF2\u6298\u53E0\u7684\u56FE\u6807\u3002","\u7528\u4E8E\u6307\u793A\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u5DF2\u5C55\u5F00\u7684\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u66FF\u6362\u201D\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u5168\u90E8\u66FF\u6362\u201D\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u67E5\u627E\u4E0A\u4E00\u4E2A\u201D\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u67E5\u627E\u4E0B\u4E00\u4E2A\u201D\u56FE\u6807\u3002","\u67E5\u627E/\u66FF\u6362","\u67E5\u627E","\u67E5\u627E","\u4E0A\u4E00\u4E2A\u5339\u914D\u9879","\u4E0B\u4E00\u4E2A\u5339\u914D\u9879","\u5728\u9009\u5B9A\u5185\u5BB9\u4E2D\u67E5\u627E","\u5173\u95ED","\u66FF\u6362","\u66FF\u6362","\u66FF\u6362","\u5168\u90E8\u66FF\u6362","\u5207\u6362\u66FF\u6362","\u4EC5\u9AD8\u4EAE\u4E86\u524D {0} \u4E2A\u7ED3\u679C\uFF0C\u4F46\u6240\u6709\u67E5\u627E\u64CD\u4F5C\u5747\u9488\u5BF9\u5168\u6587\u3002","\u7B2C {0} \u9879\uFF0C\u5171 {1} \u9879","\u65E0\u7ED3\u679C","\u627E\u5230 {0}","\u4E3A\u201C{1}\u201D\u627E\u5230 {0}","\u5728 {2} \u5904\u627E\u5230\u201C{1}\u201D\u7684 {0}","\u4E3A\u201C{1}\u201D\u627E\u5230 {0}","Ctrl+Enter \u73B0\u5728\u7531\u5168\u90E8\u66FF\u6362\u6539\u4E3A\u63D2\u5165\u6362\u884C\u3002\u4F60\u53EF\u4EE5\u4FEE\u6539editor.action.replaceAll \u7684\u6309\u952E\u7ED1\u5B9A\u4EE5\u8986\u76D6\u6B64\u884C\u4E3A\u3002"],"vs/editor/contrib/folding/browser/folding":["\u5C55\u5F00","\u4EE5\u9012\u5F52\u65B9\u5F0F\u5C55\u5F00","\u6298\u53E0","\u5207\u6362\u6298\u53E0","\u4EE5\u9012\u5F52\u65B9\u5F0F\u6298\u53E0","\u6298\u53E0\u6240\u6709\u5757\u6CE8\u91CA","\u6298\u53E0\u6240\u6709\u533A\u57DF","\u5C55\u5F00\u6240\u6709\u533A\u57DF","\u6298\u53E0\u9664\u9009\u5B9A\u9879\u4EE5\u5916\u7684\u6240\u6709\u9879","\u5C55\u5F00\u9664\u6240\u9009\u533A\u57DF\u4E4B\u5916\u7684\u6240\u6709\u533A\u57DF","\u5168\u90E8\u6298\u53E0","\u5168\u90E8\u5C55\u5F00","\u8DF3\u8F6C\u5230\u7236\u7EA7\u6298\u53E0","\u8F6C\u5230\u4E0A\u4E00\u4E2A\u6298\u53E0\u8303\u56F4","\u8F6C\u5230\u4E0B\u4E00\u4E2A\u6298\u53E0\u8303\u56F4","\u6839\u636E\u6240\u9009\u5185\u5BB9\u521B\u5EFA\u6298\u53E0\u8303\u56F4","\u5220\u9664\u624B\u52A8\u6298\u53E0\u8303\u56F4","\u6298\u53E0\u7EA7\u522B {0}"],"vs/editor/contrib/folding/browser/foldingDecorations":["\u6298\u53E0\u8303\u56F4\u540E\u9762\u7684\u80CC\u666F\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u8BBE\u4E3A\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u5E95\u5C42\u88C5\u9970\u3002","\u7F16\u8F91\u5668\u88C5\u8BA2\u7EBF\u4E2D\u6298\u53E0\u63A7\u4EF6\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u5B57\u5F62\u8FB9\u8DDD\u4E2D\u5DF2\u5C55\u5F00\u7684\u8303\u56F4\u7684\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u5B57\u5F62\u8FB9\u8DDD\u4E2D\u5DF2\u6298\u53E0\u7684\u8303\u56F4\u7684\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u5B57\u5F62\u8FB9\u8DDD\u4E2D\u624B\u52A8\u6298\u53E0\u7684\u8303\u56F4\u7684\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u5B57\u5F62\u8FB9\u8DDD\u4E2D\u624B\u52A8\u5C55\u5F00\u7684\u8303\u56F4\u7684\u56FE\u6807\u3002","\u5355\u51FB\u4EE5\u5C55\u5F00\u8303\u56F4\u3002","\u5355\u51FB\u4EE5\u6298\u53E0\u8303\u56F4\u3002"],"vs/editor/contrib/fontZoom/browser/fontZoom":["\u589E\u5927\u7F16\u8F91\u5668\u5B57\u53F7","\u51CF\u5C0F\u7F16\u8F91\u5668\u5B57\u53F7","\u91CD\u7F6E\u7F16\u8F91\u5668\u5B57\u53F7"],"vs/editor/contrib/format/browser/formatActions":["\u683C\u5F0F\u5316\u6587\u6863","\u683C\u5F0F\u5316\u9009\u5B9A\u5185\u5BB9"],"vs/editor/contrib/gotoError/browser/gotoError":["\u8F6C\u5230\u4E0B\u4E00\u4E2A\u95EE\u9898 (\u9519\u8BEF\u3001\u8B66\u544A\u3001\u4FE1\u606F)","\u201C\u8F6C\u5230\u4E0B\u4E00\u4E2A\u201D\u6807\u8BB0\u7684\u56FE\u6807\u3002","\u8F6C\u5230\u4E0A\u4E00\u4E2A\u95EE\u9898 (\u9519\u8BEF\u3001\u8B66\u544A\u3001\u4FE1\u606F)","\u201C\u8F6C\u5230\u4E0A\u4E00\u4E2A\u201D\u6807\u8BB0\u7684\u56FE\u6807\u3002","\u8F6C\u5230\u6587\u4EF6\u4E2D\u7684\u4E0B\u4E00\u4E2A\u95EE\u9898 (\u9519\u8BEF\u3001\u8B66\u544A\u3001\u4FE1\u606F)","\u4E0B\u4E00\u4E2A\u95EE\u9898(&&P)","\u8F6C\u5230\u6587\u4EF6\u4E2D\u7684\u4E0A\u4E00\u4E2A\u95EE\u9898 (\u9519\u8BEF\u3001\u8B66\u544A\u3001\u4FE1\u606F)","\u4E0A\u4E00\u4E2A\u95EE\u9898(&&P)"],"vs/editor/contrib/gotoError/browser/gotoErrorWidget":["\u9519\u8BEF","\u8B66\u544A","\u4FE1\u606F","\u63D0\u793A","{1} \u4E2D\u7684 {0}","{0} \u4E2A\u95EE\u9898(\u5171 {1} \u4E2A)","{0} \u4E2A\u95EE\u9898(\u5171 {1} \u4E2A)","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u9519\u8BEF\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u9519\u8BEF\u6807\u9898\u80CC\u666F\u8272\u3002","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u8B66\u544A\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u8B66\u544A\u6807\u9898\u80CC\u666F\u8272\u3002","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u4FE1\u606F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u4FE1\u606F\u6807\u9898\u80CC\u666F\u8272\u3002","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u80CC\u666F\u8272\u3002"],"vs/editor/contrib/gotoSymbol/browser/goToCommands":["\u5FEB\u901F\u67E5\u770B","\u5B9A\u4E49","\u672A\u627E\u5230\u201C{0}\u201D\u7684\u4EFB\u4F55\u5B9A\u4E49","\u627E\u4E0D\u5230\u5B9A\u4E49","\u8F6C\u5230\u5B9A\u4E49","\u8F6C\u5230\u5B9A\u4E49(&&D)","\u6253\u5F00\u4FA7\u8FB9\u7684\u5B9A\u4E49","\u901F\u89C8\u5B9A\u4E49","\u58F0\u660E","\u672A\u627E\u5230\u201C{0}\u201D\u7684\u58F0\u660E","\u672A\u627E\u5230\u58F0\u660E","\u8F6C\u5230\u58F0\u660E","\u8F6C\u5230\u58F0\u660E(&&D)","\u672A\u627E\u5230\u201C{0}\u201D\u7684\u58F0\u660E","\u672A\u627E\u5230\u58F0\u660E","\u67E5\u770B\u58F0\u660E","\u7C7B\u578B\u5B9A\u4E49","\u672A\u627E\u5230\u201C{0}\u201D\u7684\u7C7B\u578B\u5B9A\u4E49","\u672A\u627E\u5230\u7C7B\u578B\u5B9A\u4E49","\u8F6C\u5230\u7C7B\u578B\u5B9A\u4E49","\u8F6C\u5230\u7C7B\u578B\u5B9A\u4E49(&&T)","\u5FEB\u901F\u67E5\u770B\u7C7B\u578B\u5B9A\u4E49","\u5B9E\u73B0","\u672A\u627E\u5230\u201C{0}\u201D\u7684\u5B9E\u73B0","\u672A\u627E\u5230\u5B9E\u73B0","\u8F6C\u5230\u5B9E\u73B0","\u8F6C\u5230\u5B9E\u73B0(&&I)","\u67E5\u770B\u5B9E\u73B0",'\u672A\u627E\u5230"{0}"\u7684\u5F15\u7528',"\u672A\u627E\u5230\u5F15\u7528","\u8F6C\u5230\u5F15\u7528","\u8F6C\u5230\u5F15\u7528(&&R)","\u5F15\u7528","\u67E5\u770B\u5F15\u7528","\u5F15\u7528","\u8F6C\u5230\u4EFB\u4F55\u7B26\u53F7","\u4F4D\u7F6E","\u65E0\u201C{0}\u201D\u7684\u7ED3\u679C","\u5F15\u7528"],"vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition":["\u5355\u51FB\u663E\u793A {0} \u4E2A\u5B9A\u4E49\u3002"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesController":["\u5F15\u7528\u901F\u89C8\u662F\u5426\u53EF\u89C1\uFF0C\u4F8B\u5982\u201C\u901F\u89C8\u5F15\u7528\u201D\u6216\u201C\u901F\u89C8\u5B9A\u4E49\u201D","\u6B63\u5728\u52A0\u8F7D...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesTree":["{0} \u4E2A\u5F15\u7528","{0} \u4E2A\u5F15\u7528","\u5F15\u7528"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget":["\u65E0\u53EF\u7528\u9884\u89C8","\u65E0\u7ED3\u679C","\u5F15\u7528"],"vs/editor/contrib/gotoSymbol/browser/referencesModel":["\u5728\u5217 {2} \u884C {1} \u7684 {0} \u4E2D","\u5728\u5217 {3} \u884C {2} \u7684 {1} \u4E2D\u7684 {0}","{0} \u4E2D\u6709 1 \u4E2A\u7B26\u53F7\uFF0C\u5B8C\u6574\u8DEF\u5F84: {1}","{1} \u4E2D\u6709 {0} \u4E2A\u7B26\u53F7\uFF0C\u5B8C\u6574\u8DEF\u5F84: {2}","\u672A\u627E\u5230\u7ED3\u679C","\u5728 {0} \u4E2D\u627E\u5230 1 \u4E2A\u7B26\u53F7","\u5728 {1} \u4E2D\u627E\u5230 {0} \u4E2A\u7B26\u53F7","\u5728 {1} \u4E2A\u6587\u4EF6\u4E2D\u627E\u5230 {0} \u4E2A\u7B26\u53F7"],"vs/editor/contrib/gotoSymbol/browser/symbolNavigation":["\u662F\u5426\u5B58\u5728\u53EA\u80FD\u901A\u8FC7\u952E\u76D8\u5BFC\u822A\u7684\u7B26\u53F7\u4F4D\u7F6E\u3002","{1} \u7684\u7B26\u53F7 {0}\uFF0C\u4E0B\u4E00\u4E2A\u4F7F\u7528 {2}","{1} \u7684\u7B26\u53F7 {0}"],"vs/editor/contrib/hover/browser/hover":["\u663E\u793A\u6216\u805A\u7126\u60AC\u505C","\u60AC\u505C\u4E0D\u4F1A\u81EA\u52A8\u83B7\u5F97\u7126\u70B9\u3002","\u4EC5\u5F53\u60AC\u505C\u5DF2\u53EF\u89C1\u65F6\uFF0C\u624D\u4F1A\u83B7\u5F97\u7126\u70B9\u3002","\u60AC\u505C\u5728\u51FA\u73B0\u65F6\u4F1A\u81EA\u52A8\u83B7\u5F97\u7126\u70B9\u3002","\u663E\u793A\u5B9A\u4E49\u9884\u89C8\u60AC\u505C","\u5411\u4E0A\u6EDA\u52A8\u60AC\u505C","\u5411\u4E0B\u6EDA\u52A8\u60AC\u505C","\u5411\u5DE6\u6EDA\u52A8\u60AC\u505C","\u5411\u53F3\u6EDA\u52A8\u60AC\u505C","\u5411\u4E0A\u7FFB\u9875\u60AC\u505C","\u5411\u4E0B\u7FFB\u9875\u60AC\u505C","\u8F6C\u5230\u9876\u90E8\u60AC\u505C","\u8F6C\u5230\u5E95\u90E8\u60AC\u505C"],"vs/editor/contrib/hover/browser/markdownHoverParticipant":["\u6B63\u5728\u52A0\u8F7D...","\u7531\u4E8E\u6027\u80FD\u539F\u56E0\uFF0C\u957F\u7EBF\u7684\u5448\u73B0\u5DF2\u6682\u505C\u3002\u53EF\u901A\u8FC7`editor.stopRenderingLineAfter`\u914D\u7F6E\u6B64\u8BBE\u7F6E\u3002","\u51FA\u4E8E\u6027\u80FD\u539F\u56E0\uFF0C\u672A\u5BF9\u957F\u884C\u8FDB\u884C\u89E3\u6790\u3002\u89E3\u6790\u957F\u5EA6\u9608\u503C\u53EF\u901A\u8FC7\u201Ceditor.maxTokenizationLineLength\u201D\u8FDB\u884C\u914D\u7F6E\u3002"],"vs/editor/contrib/hover/browser/markerHoverParticipant":["\u67E5\u770B\u95EE\u9898","\u6CA1\u6709\u53EF\u7528\u7684\u5FEB\u901F\u4FEE\u590D","\u6B63\u5728\u68C0\u67E5\u5FEB\u901F\u4FEE\u590D...","\u6CA1\u6709\u53EF\u7528\u7684\u5FEB\u901F\u4FEE\u590D","\u5FEB\u901F\u4FEE\u590D..."],"vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace":["\u66FF\u6362\u4E3A\u4E0A\u4E00\u4E2A\u503C","\u66FF\u6362\u4E3A\u4E0B\u4E00\u4E2A\u503C"],"vs/editor/contrib/indentation/browser/indentation":["\u5C06\u7F29\u8FDB\u8F6C\u6362\u4E3A\u7A7A\u683C","\u5C06\u7F29\u8FDB\u8F6C\u6362\u4E3A\u5236\u8868\u7B26","\u5DF2\u914D\u7F6E\u5236\u8868\u7B26\u5927\u5C0F","\u9ED8\u8BA4\u9009\u9879\u5361\u5927\u5C0F","\u5F53\u524D\u9009\u9879\u5361\u5927\u5C0F","\u9009\u62E9\u5F53\u524D\u6587\u4EF6\u7684\u5236\u8868\u7B26\u5927\u5C0F","\u4F7F\u7528\u5236\u8868\u7B26\u7F29\u8FDB","\u4F7F\u7528\u7A7A\u683C\u7F29\u8FDB","\u66F4\u6539\u5236\u8868\u7B26\u663E\u793A\u5927\u5C0F","\u4ECE\u5185\u5BB9\u4E2D\u68C0\u6D4B\u7F29\u8FDB\u65B9\u5F0F","\u91CD\u65B0\u7F29\u8FDB\u884C","\u91CD\u65B0\u7F29\u8FDB\u6240\u9009\u884C"],"vs/editor/contrib/inlayHints/browser/inlayHintsHover":["\u53CC\u51FB\u4EE5\u63D2\u5165","cmd + \u70B9\u51FB","ctrl + \u70B9\u51FB","option + \u70B9\u51FB","alt + \u70B9\u51FB","\u8F6C\u5230\u5B9A\u4E49 ({0})\uFF0C\u70B9\u51FB\u53F3\u952E\u4EE5\u67E5\u770B\u8BE6\u7EC6\u4FE1\u606F","\u8F6C\u5230\u5B9A\u4E49\uFF08{0}\uFF09","\u6267\u884C\u547D\u4EE4"],"vs/editor/contrib/inlineCompletions/browser/commands":["\u663E\u793A\u4E0B\u4E00\u4E2A\u5185\u8054\u5EFA\u8BAE","\u663E\u793A\u4E0A\u4E00\u4E2A\u5185\u8054\u5EFA\u8BAE","\u89E6\u53D1\u5185\u8054\u5EFA\u8BAE","\u63A5\u53D7\u5185\u8054\u5EFA\u8BAE\u7684\u4E0B\u4E00\u4E2A\u5B57","\u63A5\u53D7 Word","\u63A5\u53D7\u5185\u8054\u5EFA\u8BAE\u7684\u4E0B\u4E00\u884C","\u63A5\u53D7\u884C","\u63A5\u53D7\u5185\u8054\u5EFA\u8BAE","\u63A5\u53D7","\u9690\u85CF\u5185\u8054\u5EFA\u8BAE","\u59CB\u7EC8\u663E\u793A\u5DE5\u5177\u680F"],"vs/editor/contrib/inlineCompletions/browser/hoverParticipant":["\u5EFA\u8BAE:"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys":["\u5185\u8054\u5EFA\u8BAE\u662F\u5426\u53EF\u89C1","\u5185\u8054\u5EFA\u8BAE\u662F\u5426\u4EE5\u7A7A\u767D\u5F00\u5934","\u5185\u8054\u5EFA\u8BAE\u662F\u5426\u4EE5\u5C0F\u4E8E\u9009\u9879\u5361\u63D2\u5165\u5185\u5BB9\u7684\u7A7A\u683C\u5F00\u5934","\u662F\u5426\u5E94\u6291\u5236\u5F53\u524D\u5EFA\u8BAE"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController":["\u5728\u8F85\u52A9\u89C6\u56FE\u4E2D\u68C0\u67E5\u6B64\u9879 ({0})"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget":["\u201C\u663E\u793A\u4E0B\u4E00\u4E2A\u53C2\u6570\u201D\u63D0\u793A\u7684\u56FE\u6807\u3002","\u201C\u663E\u793A\u4E0A\u4E00\u4E2A\u53C2\u6570\u201D\u63D0\u793A\u7684\u56FE\u6807\u3002","{0} ({1})","\u4E0A\u4E00\u4E2A","\u4E0B\u4E00\u4E2A"],"vs/editor/contrib/lineSelection/browser/lineSelection":["\u5C55\u5F00\u884C\u9009\u62E9"],"vs/editor/contrib/linesOperations/browser/linesOperations":["\u5411\u4E0A\u590D\u5236\u884C","\u5411\u4E0A\u590D\u5236\u4E00\u884C(&&C)","\u5411\u4E0B\u590D\u5236\u884C","\u5411\u4E0B\u590D\u5236\u4E00\u884C(&&P)","\u91CD\u590D\u9009\u62E9","\u91CD\u590D\u9009\u62E9(&&D)","\u5411\u4E0A\u79FB\u52A8\u884C","\u5411\u4E0A\u79FB\u52A8\u4E00\u884C(&&V)","\u5411\u4E0B\u79FB\u52A8\u884C","\u5411\u4E0B\u79FB\u52A8\u4E00\u884C(&&L)","\u6309\u5347\u5E8F\u6392\u5217\u884C","\u6309\u964D\u5E8F\u6392\u5217\u884C","\u5220\u9664\u91CD\u590D\u884C","\u88C1\u526A\u5C3E\u968F\u7A7A\u683C","\u5220\u9664\u884C","\u884C\u7F29\u8FDB","\u884C\u51CF\u5C11\u7F29\u8FDB","\u5728\u4E0A\u9762\u63D2\u5165\u884C","\u5728\u4E0B\u9762\u63D2\u5165\u884C","\u5220\u9664\u5DE6\u4FA7\u6240\u6709\u5185\u5BB9","\u5220\u9664\u53F3\u4FA7\u6240\u6709\u5185\u5BB9","\u5408\u5E76\u884C","\u8F6C\u7F6E\u5149\u6807\u5904\u7684\u5B57\u7B26","\u8F6C\u6362\u4E3A\u5927\u5199","\u8F6C\u6362\u4E3A\u5C0F\u5199","\u8F6C\u6362\u4E3A\u8BCD\u9996\u5B57\u6BCD\u5927\u5199","\u8F6C\u6362\u4E3A\u86C7\u5F62\u547D\u540D\u6CD5","\u8F6C\u6362\u4E3A\u9A7C\u5CF0\u5F0F\u5927\u5C0F\u5199","\u8F6C\u6362\u4E3A Kebab \u6848\u4F8B"],"vs/editor/contrib/linkedEditing/browser/linkedEditing":["\u542F\u52A8\u94FE\u63A5\u7F16\u8F91","\u7F16\u8F91\u5668\u6839\u636E\u7C7B\u578B\u81EA\u52A8\u91CD\u547D\u540D\u65F6\u7684\u80CC\u666F\u8272\u3002"],"vs/editor/contrib/links/browser/links":["\u6B64\u94FE\u63A5\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u65E0\u6CD5\u6253\u5F00: {0}","\u6B64\u94FE\u63A5\u76EE\u6807\u5DF2\u4E22\u5931\uFF0C\u65E0\u6CD5\u6253\u5F00\u3002","\u6267\u884C\u547D\u4EE4","\u6253\u5F00\u94FE\u63A5","cmd + \u5355\u51FB","ctrl + \u5355\u51FB","option + \u5355\u51FB","alt + \u5355\u51FB","\u6267\u884C\u547D\u4EE4 {0}","\u6253\u5F00\u94FE\u63A5"],"vs/editor/contrib/message/browser/messageController":["\u7F16\u8F91\u5668\u5F53\u524D\u662F\u5426\u6B63\u5728\u663E\u793A\u5185\u8054\u6D88\u606F"],"vs/editor/contrib/multicursor/browser/multicursor":["\u6DFB\u52A0\u7684\u5149\u6807: {0}","\u6DFB\u52A0\u7684\u6E38\u6807: {0}","\u5728\u4E0A\u9762\u6DFB\u52A0\u5149\u6807","\u5728\u4E0A\u9762\u6DFB\u52A0\u5149\u6807(&&A)","\u5728\u4E0B\u9762\u6DFB\u52A0\u5149\u6807","\u5728\u4E0B\u9762\u6DFB\u52A0\u5149\u6807(&&D)","\u5728\u884C\u5C3E\u6DFB\u52A0\u5149\u6807","\u5728\u884C\u5C3E\u6DFB\u52A0\u5149\u6807(&&U)","\u5728\u5E95\u90E8\u6DFB\u52A0\u5149\u6807","\u5728\u9876\u90E8\u6DFB\u52A0\u5149\u6807","\u5C06\u4E0B\u4E00\u4E2A\u67E5\u627E\u5339\u914D\u9879\u6DFB\u52A0\u5230\u9009\u62E9","\u6DFB\u52A0\u4E0B\u4E00\u4E2A\u5339\u914D\u9879(&&N)","\u5C06\u9009\u62E9\u5185\u5BB9\u6DFB\u52A0\u5230\u4E0A\u4E00\u67E5\u627E\u5339\u914D\u9879","\u6DFB\u52A0\u4E0A\u4E00\u4E2A\u5339\u914D\u9879(&&R)","\u5C06\u4E0A\u6B21\u9009\u62E9\u79FB\u52A8\u5230\u4E0B\u4E00\u4E2A\u67E5\u627E\u5339\u914D\u9879","\u5C06\u4E0A\u4E2A\u9009\u62E9\u5185\u5BB9\u79FB\u52A8\u5230\u4E0A\u4E00\u67E5\u627E\u5339\u914D\u9879","\u9009\u62E9\u6240\u6709\u627E\u5230\u7684\u67E5\u627E\u5339\u914D\u9879","\u9009\u62E9\u6240\u6709\u5339\u914D\u9879(&&O)","\u66F4\u6539\u6240\u6709\u5339\u914D\u9879","\u805A\u7126\u4E0B\u4E00\u4E2A\u5149\u6807","\u805A\u7126\u4E0B\u4E00\u4E2A\u5149\u6807","\u805A\u7126\u4E0A\u4E00\u4E2A\u5149\u6807","\u805A\u7126\u4E0A\u4E00\u4E2A\u5149\u6807"],"vs/editor/contrib/parameterHints/browser/parameterHints":["\u89E6\u53D1\u53C2\u6570\u63D0\u793A"],"vs/editor/contrib/parameterHints/browser/parameterHintsWidget":["\u201C\u663E\u793A\u4E0B\u4E00\u4E2A\u53C2\u6570\u201D\u63D0\u793A\u7684\u56FE\u6807\u3002","\u201C\u663E\u793A\u4E0A\u4E00\u4E2A\u53C2\u6570\u201D\u63D0\u793A\u7684\u56FE\u6807\u3002","{0}\uFF0C\u63D0\u793A","\u53C2\u6570\u63D0\u793A\u4E2D\u6D3B\u52A8\u9879\u7684\u524D\u666F\u8272\u3002"],"vs/editor/contrib/peekView/browser/peekView":["\u901F\u89C8\u4E2D\u662F\u5426\u5D4C\u5165\u4E86\u5F53\u524D\u4EE3\u7801\u7F16\u8F91\u5668","\u5173\u95ED","\u901F\u89C8\u89C6\u56FE\u6807\u9898\u533A\u57DF\u80CC\u666F\u989C\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u6807\u9898\u989C\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u6807\u9898\u4FE1\u606F\u989C\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u8FB9\u6846\u548C\u7BAD\u5934\u989C\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u80CC\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u884C\u8282\u70B9\u7684\u524D\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u6587\u4EF6\u8282\u70B9\u7684\u524D\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u6240\u9009\u6761\u76EE\u7684\u80CC\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u6240\u9009\u6761\u76EE\u7684\u524D\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7F16\u8F91\u5668\u80CC\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7F16\u8F91\u5668\u4E2D\u88C5\u8BA2\u7EBF\u7684\u80CC\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7F16\u8F91\u5668\u4E2D\u7C98\u6EDE\u6EDA\u52A8\u7684\u80CC\u666F\u8272\u3002","\u5728\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u5339\u914D\u7A81\u51FA\u663E\u793A\u989C\u8272\u3002","\u5728\u901F\u89C8\u89C6\u56FE\u7F16\u8F91\u5668\u4E2D\u5339\u914D\u7A81\u51FA\u663E\u793A\u989C\u8272\u3002","\u5728\u901F\u89C8\u89C6\u56FE\u7F16\u8F91\u5668\u4E2D\u5339\u914D\u9879\u7684\u7A81\u51FA\u663E\u793A\u8FB9\u6846\u3002"],"vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess":["\u5148\u6253\u5F00\u6587\u672C\u7F16\u8F91\u5668\u7136\u540E\u8DF3\u8F6C\u5230\u884C\u3002","\u8F6C\u5230\u7B2C {0} \u884C\u7B2C {1} \u4E2A\u5B57\u7B26\u3002","\u8F6C\u5230\u884C {0}\u3002","\u5F53\u524D\u884C: {0}\uFF0C\u5B57\u7B26: {1}\u3002\u952E\u5165\u8981\u5BFC\u822A\u5230\u7684\u884C\u53F7(\u4ECB\u4E8E 1 \u81F3 {2} \u4E4B\u95F4)\u3002","\u5F53\u524D\u884C: {0}\uFF0C\u5B57\u7B26: {1}\u3002 \u952E\u5165\u8981\u5BFC\u822A\u5230\u7684\u884C\u53F7\u3002"],"vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess":["\u8981\u8F6C\u5230\u7B26\u53F7\uFF0C\u9996\u5148\u6253\u5F00\u5177\u6709\u7B26\u53F7\u4FE1\u606F\u7684\u6587\u672C\u7F16\u8F91\u5668\u3002","\u6D3B\u52A8\u6587\u672C\u7F16\u8F91\u5668\u4E0D\u63D0\u4F9B\u7B26\u53F7\u4FE1\u606F\u3002","\u6CA1\u6709\u5339\u914D\u7684\u7F16\u8F91\u5668\u7B26\u53F7","\u6CA1\u6709\u7F16\u8F91\u5668\u7B26\u53F7","\u5728\u4FA7\u8FB9\u6253\u5F00","\u5728\u5E95\u90E8\u6253\u5F00","\u7B26\u53F7({0})","\u5C5E\u6027({0})","\u65B9\u6CD5({0})","\u51FD\u6570({0})","\u6784\u9020\u51FD\u6570 ({0})","\u53D8\u91CF({0})","\u7C7B({0})","\u7ED3\u6784({0})","\u4E8B\u4EF6({0})","\u8FD0\u7B97\u7B26({0})","\u63A5\u53E3({0})","\u547D\u540D\u7A7A\u95F4({0})","\u5305({0})","\u7C7B\u578B\u53C2\u6570({0})","\u6A21\u5757({0})","\u5C5E\u6027({0})","\u679A\u4E3E({0})","\u679A\u4E3E\u6210\u5458({0})","\u5B57\u7B26\u4E32({0})","\u6587\u4EF6({0})","\u6570\u7EC4({0})","\u6570\u5B57({0})","\u5E03\u5C14\u503C({0})","\u5BF9\u8C61({0})","\u952E({0})","\u5B57\u6BB5({0})","\u5E38\u91CF({0})"],"vs/editor/contrib/readOnlyMessage/browser/contribution":["\u65E0\u6CD5\u5728\u53EA\u8BFB\u8F93\u5165\u4E2D\u7F16\u8F91","\u65E0\u6CD5\u5728\u53EA\u8BFB\u7F16\u8F91\u5668\u4E2D\u7F16\u8F91"],"vs/editor/contrib/rename/browser/rename":["\u65E0\u7ED3\u679C\u3002","\u89E3\u6790\u91CD\u547D\u540D\u4F4D\u7F6E\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF","\u6B63\u5728\u5C06\u201C{0}\u201D\u91CD\u547D\u540D\u4E3A\u201C{1}\u201D","\u5C06 {0} \u91CD\u547D\u540D\u4E3A {1}","\u6210\u529F\u5C06\u201C{0}\u201D\u91CD\u547D\u540D\u4E3A\u201C{1}\u201D\u3002\u6458\u8981: {2}","\u91CD\u547D\u540D\u65E0\u6CD5\u5E94\u7528\u4FEE\u6539","\u91CD\u547D\u540D\u65E0\u6CD5\u8BA1\u7B97\u4FEE\u6539","\u91CD\u547D\u540D\u7B26\u53F7","\u542F\u7528/\u7981\u7528\u91CD\u547D\u540D\u4E4B\u524D\u9884\u89C8\u66F4\u6539\u7684\u529F\u80FD"],"vs/editor/contrib/rename/browser/renameInputField":["\u91CD\u547D\u540D\u8F93\u5165\u5C0F\u7EC4\u4EF6\u662F\u5426\u53EF\u89C1",'\u91CD\u547D\u540D\u8F93\u5165\u3002\u952E\u5165\u65B0\u540D\u79F0\u5E76\u6309 "Enter" \u63D0\u4EA4\u3002',"\u6309 {0} \u8FDB\u884C\u91CD\u547D\u540D\uFF0C\u6309 {1} \u8FDB\u884C\u9884\u89C8"],"vs/editor/contrib/smartSelect/browser/smartSelect":["\u5C55\u5F00\u9009\u62E9","\u6269\u5927\u9009\u533A(&&E)","\u6536\u8D77\u9009\u62E9","\u7F29\u5C0F\u9009\u533A(&&S)"],"vs/editor/contrib/snippet/browser/snippetController2":["\u7F16\u8F91\u5668\u76EE\u524D\u662F\u5426\u5728\u4EE3\u7801\u7247\u6BB5\u6A21\u5F0F\u4E0B","\u5728\u4EE3\u7801\u7247\u6BB5\u6A21\u5F0F\u4E0B\u65F6\u662F\u5426\u5B58\u5728\u4E0B\u4E00\u5236\u8868\u4F4D","\u5728\u4EE3\u7801\u7247\u6BB5\u6A21\u5F0F\u4E0B\u65F6\u662F\u5426\u5B58\u5728\u4E0A\u4E00\u5236\u8868\u4F4D","\u8F6C\u5230\u4E0B\u4E00\u4E2A\u5360\u4F4D\u7B26..."],"vs/editor/contrib/snippet/browser/snippetVariables":["\u661F\u671F\u5929","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D","\u5468\u65E5","\u5468\u4E00","\u5468\u4E8C","\u5468\u4E09","\u5468\u56DB","\u5468\u4E94","\u5468\u516D","\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","5\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708","1\u6708","2\u6708","3\u6708","4\u6708","5\u6708","6\u6708","7\u6708","8\u6708","9\u6708","10\u6708","11 \u6708","12\u6708"],"vs/editor/contrib/stickyScroll/browser/stickyScrollActions":["\u5207\u6362\u7F16\u8F91\u5668\u7C98\u6EDE\u6EDA\u52A8","\u5207\u6362\u7F16\u8F91\u5668\u7C98\u6EDE\u6EDA\u52A8","\u7C98\u6EDE\u6EDA\u52A8","\u7C98\u6EDE\u6EDA\u52A8(&&S)","\u805A\u7126\u7C98\u6027\u6EDA\u52A8","\u805A\u7126\u7C98\u6027\u6EDA\u52A8(&&F)","\u9009\u62E9\u4E0B\u4E00\u4E2A\u7C98\u6027\u6EDA\u52A8\u884C","\u9009\u62E9\u4E0A\u4E00\u4E2A\u7C98\u6027\u6EDA\u52A8\u884C","\u8F6C\u5230\u805A\u7126\u7684\u7C98\u6027\u6EDA\u52A8\u884C","\u9009\u62E9\u7F16\u8F91\u5668"],"vs/editor/contrib/suggest/browser/suggest":["\u662F\u5426\u4EE5\u4EFB\u4F55\u5EFA\u8BAE\u4E3A\u4E2D\u5FC3","\u5EFA\u8BAE\u8BE6\u7EC6\u4FE1\u606F\u662F\u5426\u53EF\u89C1","\u662F\u5426\u5B58\u5728\u591A\u6761\u5EFA\u8BAE\u53EF\u4F9B\u9009\u62E9","\u63D2\u5165\u5F53\u524D\u5EFA\u8BAE\u662F\u5426\u4F1A\u5BFC\u81F4\u66F4\u6539\u6216\u5BFC\u81F4\u5DF2\u952E\u5165\u6240\u6709\u5185\u5BB9","\u6309 Enter \u65F6\u662F\u5426\u4F1A\u63D2\u5165\u5EFA\u8BAE","\u5F53\u524D\u5EFA\u8BAE\u662F\u5426\u5177\u6709\u63D2\u5165\u548C\u66FF\u6362\u884C\u4E3A","\u9ED8\u8BA4\u884C\u4E3A\u662F\u5426\u662F\u63D2\u5165\u6216\u66FF\u6362","\u5F53\u524D\u5EFA\u8BAE\u662F\u5426\u652F\u6301\u89E3\u6790\u66F4\u591A\u8BE6\u7EC6\u4FE1\u606F"],"vs/editor/contrib/suggest/browser/suggestController":["\u9009\u62E9\u201C{0}\u201D\u540E\u8FDB\u884C\u4E86\u5176\u4ED6 {1} \u6B21\u7F16\u8F91","\u89E6\u53D1\u5EFA\u8BAE","\u63D2\u5165","\u63D2\u5165","\u66FF\u6362","\u66FF\u6362","\u63D2\u5165","\u663E\u793A\u66F4\u5C11","\u663E\u793A\u66F4\u591A","\u91CD\u7F6E\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u5927\u5C0F"],"vs/editor/contrib/suggest/browser/suggestWidget":["\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u7684\u80CC\u666F\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u7684\u8FB9\u6846\u989C\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u7684\u524D\u666F\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u6240\u9009\u6761\u76EE\u7684\u524D\u666F\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u6240\u9009\u6761\u76EE\u7684\u56FE\u6807\u524D\u666F\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u6240\u9009\u6761\u76EE\u7684\u80CC\u666F\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u5339\u914D\u5185\u5BB9\u7684\u9AD8\u4EAE\u989C\u8272\u3002","\u5F53\u67D0\u9879\u83B7\u5F97\u7126\u70B9\u65F6\uFF0C\u5728\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u7A81\u51FA\u663E\u793A\u7684\u5339\u914D\u9879\u7684\u989C\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u72B6\u6001\u7684\u524D\u666F\u8272\u3002","\u6B63\u5728\u52A0\u8F7D...","\u65E0\u5EFA\u8BAE\u3002","\u5EFA\u8BAE","{0} {1}\uFF0C{2}","{0} {1}","{0}\uFF0C{1}","{0}\uFF0C\u6587\u6863: {1}"],"vs/editor/contrib/suggest/browser/suggestWidgetDetails":["\u5173\u95ED","\u6B63\u5728\u52A0\u8F7D\u2026"],"vs/editor/contrib/suggest/browser/suggestWidgetRenderer":["\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u8BE6\u7EC6\u4FE1\u606F\u7684\u56FE\u6807\u3002","\u4E86\u89E3\u8BE6\u7EC6\u4FE1\u606F"],"vs/editor/contrib/suggest/browser/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/browser/symbolIcons":["\u6570\u7EC4\u7B26\u53F7\u7684\u524D\u666F\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u5C06\u663E\u793A\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u3002","\u5E03\u5C14\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7C7B\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u989C\u8272\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5E38\u91CF\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6784\u9020\u51FD\u6570\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u679A\u4E3E\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u679A\u4E3E\u5668\u6210\u5458\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u4E8B\u4EF6\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5B57\u6BB5\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6587\u4EF6\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6587\u4EF6\u5939\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u51FD\u6570\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u63A5\u53E3\u7B26\u53F7\u7684\u524D\u666F\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u5C06\u663E\u793A\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u3002","\u952E\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5173\u952E\u5B57\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u65B9\u6CD5\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6A21\u5757\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u547D\u540D\u7A7A\u95F4\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u8F6E\u5ED3\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7A7A\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6570\u5B57\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5BF9\u8C61\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u8FD0\u7B97\u7B26\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5305\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5C5E\u6027\u7B26\u53F7\u7684\u524D\u666F\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u3002","\u53C2\u8003\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7247\u6BB5\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5B57\u7B26\u4E32\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u8F6E\u5ED3\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7ED3\u6784\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6587\u672C\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7C7B\u578B\u53C2\u6570\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5355\u4F4D\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u53D8\u91CF\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002"],"vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode":["\u5207\u6362 Tab \u952E\u79FB\u52A8\u7126\u70B9","Tab \u952E\u5C06\u79FB\u52A8\u5230\u4E0B\u4E00\u53EF\u805A\u7126\u7684\u5143\u7D20","Tab \u952E\u5C06\u63D2\u5165\u5236\u8868\u7B26"],"vs/editor/contrib/tokenization/browser/tokenization":["\u5F00\u53D1\u4EBA\u5458: \u5F3A\u5236\u91CD\u65B0\u8FDB\u884C\u6807\u8BB0"],"vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter":["\u6269\u5C55\u7F16\u8F91\u5668\u4E2D\u968F\u8B66\u544A\u6D88\u606F\u4E00\u540C\u663E\u793A\u7684\u56FE\u6807\u3002","\u672C\u6587\u6863\u5305\u542B\u8BB8\u591A\u975E\u57FA\u672C ASCII unicode \u5B57\u7B26","\u672C\u6587\u6863\u5305\u542B\u8BB8\u591A\u4E0D\u660E\u786E\u7684 unicode \u5B57\u7B26","\u672C\u6587\u6863\u5305\u542B\u8BB8\u591A\u4E0D\u53EF\u89C1\u7684 unicode \u5B57\u7B26","\u914D\u7F6E Unicode \u7A81\u51FA\u663E\u793A\u9009\u9879","\u5B57\u7B26 {0} \u53EF\u80FD\u4F1A\u4E0E ASCII \u5B57\u7B26 {1} \u6DF7\u6DC6\uFF0C\u540E\u8005\u5728\u6E90\u4EE3\u7801\u4E2D\u66F4\u4E3A\u5E38\u89C1\u3002","\u5B57\u7B26 {0} \u53EF\u80FD\u4F1A\u4E0E\u5B57\u7B26 {1} \u6DF7\u6DC6\uFF0C\u540E\u8005\u5728\u6E90\u4EE3\u7801\u4E2D\u66F4\u4E3A\u5E38\u89C1\u3002","\u5B57\u7B26 {0} \u4E0D\u53EF\u89C1\u3002","\u5B57\u7B26 {0} \u4E0D\u662F\u57FA\u672C ASCII \u5B57\u7B26\u3002","\u8C03\u6574\u8BBE\u7F6E","\u7981\u7528\u6279\u6CE8\u4E2D\u7684\u7A81\u51FA\u663E\u793A","\u7981\u7528\u6279\u6CE8\u4E2D\u5B57\u7B26\u7684\u7A81\u51FA\u663E\u793A","\u7981\u7528\u5B57\u7B26\u4E32\u4E2D\u7684\u7A81\u51FA\u663E\u793A","\u7981\u7528\u5B57\u7B26\u4E32\u4E2D\u5B57\u7B26\u7684\u7A81\u51FA\u663E\u793A","\u7981\u7528\u4E0D\u660E\u786E\u7684\u7A81\u51FA\u663E\u793A","\u7981\u6B62\u7A81\u51FA\u663E\u793A\u6B67\u4E49\u5B57\u7B26","\u7981\u7528\u4E0D\u53EF\u89C1\u7A81\u51FA\u663E\u793A","\u7981\u6B62\u7A81\u51FA\u663E\u793A\u4E0D\u53EF\u89C1\u5B57\u7B26","\u7981\u7528\u975E ASCII \u7A81\u51FA\u663E\u793A","\u7981\u6B62\u7A81\u51FA\u663E\u793A\u975E\u57FA\u672C ASCII \u5B57\u7B26","\u663E\u793A\u6392\u9664\u9009\u9879","\u4E0D\u7A81\u51FA\u663E\u793A {0} (\u4E0D\u53EF\u89C1\u5B57\u7B26)","\u5728\u7A81\u51FA\u663E\u793A\u5185\u5BB9\u4E2D\u6392\u9664{0}","\u5141\u8BB8\u8BED\u8A00\u201C{0}\u201D\u4E2D\u66F4\u5E38\u89C1\u7684 unicode \u5B57\u7B26\u3002"],"vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators":["\u5F02\u5E38\u884C\u7EC8\u6B62\u7B26","\u68C0\u6D4B\u5230\u5F02\u5E38\u884C\u7EC8\u6B62\u7B26",`\u6587\u4EF6\u201C{0}\u201D\u5305\u542B\u4E00\u4E2A\u6216\u591A\u4E2A\u5F02\u5E38\u7684\u884C\u7EC8\u6B62\u7B26\uFF0C\u4F8B\u5982\u884C\u5206\u9694\u7B26(LS)\u6216\u6BB5\u843D\u5206\u9694\u7B26(PS)\u3002\r
+\r
+\u5EFA\u8BAE\u4ECE\u6587\u4EF6\u4E2D\u5220\u9664\u5B83\u4EEC\u3002\u53EF\u901A\u8FC7\u201Ceditor.unusualLineTerminators\u201D\u8FDB\u884C\u914D\u7F6E\u3002`,"\u5220\u9664\u5F02\u5E38\u884C\u7EC8\u6B62\u7B26(&&R)","\u5FFD\u7565"],"vs/editor/contrib/wordHighlighter/browser/highlightDecorations":["\u8BFB\u53D6\u8BBF\u95EE\u671F\u95F4\u7B26\u53F7\u7684\u80CC\u666F\u8272\uFF0C\u4F8B\u5982\u8BFB\u53D6\u53D8\u91CF\u65F6\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5199\u5165\u8BBF\u95EE\u8FC7\u7A0B\u4E2D\u7B26\u53F7\u7684\u80CC\u666F\u8272\uFF0C\u4F8B\u5982\u5199\u5165\u53D8\u91CF\u65F6\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7B26\u53F7\u5728\u6587\u672C\u4E2D\u51FA\u73B0\u65F6\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u5C42\u7684\u4FEE\u9970\u3002","\u7B26\u53F7\u5728\u8FDB\u884C\u8BFB\u53D6\u8BBF\u95EE\u64CD\u4F5C\u65F6\u7684\u8FB9\u6846\u989C\u8272\uFF0C\u4F8B\u5982\u8BFB\u53D6\u53D8\u91CF\u3002","\u7B26\u53F7\u5728\u8FDB\u884C\u5199\u5165\u8BBF\u95EE\u64CD\u4F5C\u65F6\u7684\u8FB9\u6846\u989C\u8272\uFF0C\u4F8B\u5982\u5199\u5165\u53D8\u91CF\u3002","\u7B26\u53F7\u5728\u6587\u672C\u4E2D\u51FA\u73B0\u65F6\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7528\u4E8E\u7A81\u51FA\u663E\u793A\u7B26\u53F7\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7528\u4E8E\u7A81\u51FA\u663E\u793A\u5199\u6743\u9650\u7B26\u53F7\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7B26\u53F7\u5728\u6587\u672C\u4E2D\u51FA\u73B0\u65F6\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u5C42\u7684\u4FEE\u9970\u3002"],"vs/editor/contrib/wordHighlighter/browser/wordHighlighter":["\u8F6C\u5230\u4E0B\u4E00\u4E2A\u7A81\u51FA\u663E\u793A\u7684\u7B26\u53F7","\u8F6C\u5230\u4E0A\u4E00\u4E2A\u7A81\u51FA\u663E\u793A\u7684\u7B26\u53F7","\u89E6\u53D1\u7B26\u53F7\u9AD8\u4EAE"],"vs/editor/contrib/wordOperations/browser/wordOperations":["\u5220\u9664 Word"],"vs/platform/action/common/actionCommonCategories":["\u5F00\u53D1\u4EBA\u5458","\u67E5\u770B","\u5E2E\u52A9","\u6D4B\u8BD5","\u6587\u4EF6","\u9996\u9009\u9879"],"vs/platform/actionWidget/browser/actionList":["\u6309 {0} \u4EE5\u5E94\u7528\uFF0C\u6309 {1} \u4EE5\u9884\u89C8","\u6309 {0} \u4EE5\u5E94\u7528","{0}\uFF0C\u7981\u7528\u539F\u56E0: {1}","\u64CD\u4F5C\u5C0F\u7EC4\u4EF6"],"vs/platform/actionWidget/browser/actionWidget":["\u64CD\u4F5C\u680F\u4E2D\u5207\u6362\u7684\u64CD\u4F5C\u9879\u7684\u80CC\u666F\u8272\u3002","\u64CD\u4F5C\u5C0F\u7EC4\u4EF6\u5217\u8868\u662F\u5426\u53EF\u89C1","\u9690\u85CF\u64CD\u4F5C\u5C0F\u7EC4\u4EF6","\u9009\u62E9\u4E0A\u4E00\u4E2A\u64CD\u4F5C","\u9009\u62E9\u4E0B\u4E00\u4E2A\u64CD\u4F5C","\u63A5\u53D7\u6240\u9009\u64CD\u4F5C","\u9884\u89C8\u6240\u9009\u64CD\u4F5C"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})","{0} ({1})",`{0}\r
+[{1}] {2}`],"vs/platform/actions/browser/toolbar":["\u9690\u85CF","\u91CD\u7F6E\u83DC\u5355"],"vs/platform/actions/common/menuService":["\u9690\u85CF\u201C{0}\u201D"],"vs/platform/audioCues/browser/audioCueService":["\u884C\u4E0A\u7684\u9519\u8BEF","\u9519\u8BEF","\u884C\u4E0A\u7684\u8B66\u544A","\u8B66\u544A","\u884C\u4E0A\u7684\u6298\u53E0\u533A\u57DF","\u5DF2\u6298\u53E0","\u884C\u4E0A\u7684\u65AD\u70B9","\u65AD\u70B9","\u884C\u4E0A\u7684\u5185\u8054\u5EFA\u8BAE","\u7EC8\u7AEF\u5FEB\u901F\u4FEE\u590D","\u5FEB\u901F\u4FEE\u590D","\u8C03\u8BD5\u7A0B\u5E8F\u5DF2\u5728\u65AD\u70B9\u5904\u505C\u6B62","\u65AD\u70B9","\u884C\u4E0A\u65E0\u5D4C\u5165\u63D0\u793A","\u65E0\u5185\u5D4C\u63D0\u793A","\u4EFB\u52A1\u5DF2\u5B8C\u6210","\u4EFB\u52A1\u5DF2\u5B8C\u6210","\u4EFB\u52A1\u5931\u8D25","\u4EFB\u52A1\u5931\u8D25","\u7EC8\u7AEF\u547D\u4EE4\u5931\u8D25","\u547D\u4EE4\u5931\u8D25","\u7EC8\u7AEF\u949F","\u7EC8\u7AEF\u949F","\u7B14\u8BB0\u672C\u5355\u5143\u683C\u5DF2\u5B8C\u6210","\u7B14\u8BB0\u672C\u5355\u5143\u683C\u5DF2\u5B8C\u6210","\u7B14\u8BB0\u672C\u5355\u5143\u683C\u5931\u8D25","\u7B14\u8BB0\u672C\u5355\u5143\u683C\u5931\u8D25","\u5DF2\u63D2\u5165\u5DEE\u5F02\u7EBF","\u5DF2\u5220\u9664\u5DEE\u5F02\u884C","\u5DEE\u5F02\u884C\u5DF2\u4FEE\u6539","\u5DF2\u53D1\u9001\u804A\u5929\u8BF7\u6C42","\u5DF2\u53D1\u9001\u804A\u5929\u8BF7\u6C42","\u5DF2\u6536\u5230\u804A\u5929\u54CD\u5E94","\u804A\u5929\u54CD\u5E94\u6302\u8D77","\u804A\u5929\u54CD\u5E94\u6302\u8D77","\u6E05\u9664","\u6E05\u9664","\u4FDD\u5B58","\u4FDD\u5B58","\u683C\u5F0F","\u683C\u5F0F"],"vs/platform/configuration/common/configurationRegistry":["\u9ED8\u8BA4\u8BED\u8A00\u914D\u7F6E\u66FF\u4EE3","\u914D\u7F6E\u8981\u4E3A {0} \u8BED\u8A00\u66FF\u4EE3\u7684\u8BBE\u7F6E\u3002","\u9488\u5BF9\u67D0\u79CD\u8BED\u8A00\uFF0C\u914D\u7F6E\u66FF\u4EE3\u7F16\u8F91\u5668\u8BBE\u7F6E\u3002","\u6B64\u8BBE\u7F6E\u4E0D\u652F\u6301\u6309\u8BED\u8A00\u914D\u7F6E\u3002","\u9488\u5BF9\u67D0\u79CD\u8BED\u8A00\uFF0C\u914D\u7F6E\u66FF\u4EE3\u7F16\u8F91\u5668\u8BBE\u7F6E\u3002","\u6B64\u8BBE\u7F6E\u4E0D\u652F\u6301\u6309\u8BED\u8A00\u914D\u7F6E\u3002","\u65E0\u6CD5\u6CE8\u518C\u7A7A\u5C5E\u6027",'\u65E0\u6CD5\u6CE8\u518C\u201C{0}\u201D\u3002\u5176\u7B26\u5408\u63CF\u8FF0\u7279\u5B9A\u8BED\u8A00\u7F16\u8F91\u5668\u8BBE\u7F6E\u7684\u8868\u8FBE\u5F0F "\\\\[.*\\\\]$"\u3002\u8BF7\u4F7F\u7528 "configurationDefaults"\u3002',"\u65E0\u6CD5\u6CE8\u518C\u201C{0}\u201D\u3002\u6B64\u5C5E\u6027\u5DF2\u6CE8\u518C\u3002",'\u65E0\u6CD5\u6CE8\u518C "{0}"\u3002\u5173\u8054\u7684\u7B56\u7565 {1} \u5DF2\u5411 {2} \u6CE8\u518C\u3002'],"vs/platform/contextkey/browser/contextKeyService":["\u7528\u4E8E\u8FD4\u56DE\u4E0A\u4E0B\u6587\u952E\u7684\u76F8\u5173\u4FE1\u606F\u7684\u547D\u4EE4"],"vs/platform/contextkey/common/contextkey":["\u4E0A\u4E0B\u6587\u952E\u8868\u8FBE\u5F0F\u4E3A\u7A7A",'\u5FD8\u8BB0\u5199\u5165\u8868\u8FBE\u5F0F\u4E86\u5417? \u8FD8\u53EF\u4EE5\u653E\u7F6E "false" \u6216 "true" \u4EE5\u59CB\u7EC8\u5206\u522B\u8BC4\u4F30\u4E3A false \u6216 true\u3002','"not" \u540E\u9762\u7684 "in"\u3002','\u53F3\u62EC\u53F7 ")"',"\u610F\u5916\u7684\u4EE4\u724C","\u5FD8\u8BB0\u5728\u4EE4\u724C\u4E4B\u524D\u653E\u7F6E && \u6216 || \u4E86\u5417?","\u610F\u5916\u7684\u8868\u8FBE\u5F0F\u7ED3\u5C3E","\u5FD8\u8BB0\u653E\u7F6E\u4E0A\u4E0B\u6587\u952E\u4E86\u5417?",`\u5E94\u4E3A: {0}\r
+\u6536\u5230\u7684: "{1}"\u3002`],"vs/platform/contextkey/common/contextkeys":["\u64CD\u4F5C\u7CFB\u7EDF\u662F\u5426 macOS","\u64CD\u4F5C\u7CFB\u7EDF\u662F\u5426\u4E3A Linux","\u64CD\u4F5C\u7CFB\u7EDF\u662F\u5426\u4E3A Windows","\u5E73\u53F0\u662F\u5426\u4E3A Web \u6D4F\u89C8\u5668","\u64CD\u4F5C\u7CFB\u7EDF\u662F\u5426\u662F\u975E\u6D4F\u89C8\u5668\u5E73\u53F0\u4E0A\u7684 macOS","\u64CD\u4F5C\u7CFB\u7EDF\u662F\u5426\u4E3A iOS","\u5E73\u53F0\u662F\u5426\u4E3A Web \u6D4F\u89C8\u5668","VS Code \u7684\u8D28\u91CF\u7C7B\u578B","\u952E\u76D8\u7126\u70B9\u662F\u5426\u5728\u8F93\u5165\u6846\u4E2D"],"vs/platform/contextkey/common/scanner":["\u4F60\u6307\u7684\u662F {0} \u5417?","\u4F60\u6307\u7684\u662F {0} \u8FD8\u662F {1}?","\u4F60\u6307\u7684\u662F {0}\u3001{1} \u8FD8\u662F {2}?","\u5FD8\u8BB0\u5DE6\u5F15\u53F7\u6216\u53F3\u5F15\u53F7\u4E86\u5417?",'\u5FD8\u8BB0\u8F6C\u4E49 "/"(\u659C\u6760)\u5B57\u7B26\u4E86\u5417? \u5728\u8BE5\u5B57\u7B26\u524D\u653E\u7F6E\u4E24\u4E2A\u53CD\u659C\u6760\u4EE5\u8FDB\u884C\u8F6C\u4E49\uFF0C\u4F8B\u5982 "\\\\/"\u3002'],"vs/platform/history/browser/contextScopedHistoryWidget":["\u5EFA\u8BAE\u662F\u5426\u53EF\u89C1"],"vs/platform/keybinding/common/abstractKeybindingService":["({0})\u5DF2\u6309\u4E0B\u3002\u6B63\u5728\u7B49\u5F85\u6309\u4E0B\u7B2C\u4E8C\u4E2A\u952E...","\u5DF2\u6309\u4E0B({0})\u3002\u6B63\u5728\u7B49\u5F85\u7B2C\u4E8C\u4E2A\u952E...","\u7EC4\u5408\u952E({0}\uFF0C{1})\u4E0D\u662F\u547D\u4EE4\u3002","\u7EC4\u5408\u952E({0}\uFF0C{1})\u4E0D\u662F\u547D\u4EE4\u3002"],"vs/platform/list/browser/listService":["\u5DE5\u4F5C\u53F0","\u6620\u5C04\u4E3A `Ctrl` (Windows \u548C Linux) \u6216 `Command` (macOS)\u3002","\u6620\u5C04\u4E3A `Alt` (Windows \u548C Linux) \u6216 `Option` (macOS)\u3002","\u5728\u901A\u8FC7\u9F20\u6807\u591A\u9009\u6811\u548C\u5217\u8868\u6761\u76EE\u65F6\u4F7F\u7528\u7684\u4FEE\u6539\u952E (\u4F8B\u5982\u201C\u8D44\u6E90\u7BA1\u7406\u5668\u201D\u3001\u201C\u6253\u5F00\u7684\u7F16\u8F91\u5668\u201D\u548C\u201C\u6E90\u4EE3\u7801\u7BA1\u7406\u201D\u89C6\u56FE)\u3002\u201C\u5728\u4FA7\u8FB9\u6253\u5F00\u201D\u529F\u80FD\u6240\u9700\u7684\u9F20\u6807\u52A8\u4F5C (\u82E5\u53EF\u7528) \u5C06\u4F1A\u76F8\u5E94\u8C03\u6574\uFF0C\u4E0D\u4E0E\u591A\u9009\u4FEE\u6539\u952E\u51B2\u7A81\u3002","\u63A7\u5236\u5982\u4F55\u4F7F\u7528\u9F20\u6807\u6253\u5F00\u6811\u548C\u5217\u8868\u4E2D\u7684\u9879(\u82E5\u652F\u6301)\u3002\u8BF7\u6CE8\u610F\uFF0C\u5982\u679C\u6B64\u8BBE\u7F6E\u4E0D\u9002\u7528\uFF0C\u67D0\u4E9B\u6811\u548C\u5217\u8868\u53EF\u80FD\u4F1A\u9009\u62E9\u5FFD\u7565\u5B83\u3002","\u63A7\u5236\u5DE5\u4F5C\u53F0\u4E0A\u7684\u5217\u8868\u548C\u6811\u662F\u5426\u652F\u6301\u6C34\u5E73\u6EDA\u52A8\u3002\u8B66\u544A: \u6253\u5F00\u6B64\u8BBE\u7F6E\u4F1A\u5F71\u54CD\u6027\u80FD\u3002","\u63A7\u5236\u5728\u6EDA\u52A8\u6761\u4E2D\u5355\u51FB\u65F6\u662F\u5426\u9010\u9875\u5355\u51FB\u3002","\u63A7\u5236\u6811\u7F29\u8FDB(\u4EE5\u50CF\u7D20\u4E3A\u5355\u4F4D)\u3002","\u63A7\u5236\u6811\u662F\u5426\u5E94\u5448\u73B0\u7F29\u8FDB\u53C2\u8003\u7EBF\u3002","\u63A7\u5236\u5217\u8868\u548C\u6811\u662F\u5426\u5177\u6709\u5E73\u6ED1\u6EDA\u52A8\u6548\u679C\u3002","\u5BF9\u9F20\u6807\u6EDA\u8F6E\u6EDA\u52A8\u4E8B\u4EF6\u7684 `deltaX` \u548C `deltaY` \u4E58\u4E0A\u7684\u7CFB\u6570\u3002",'\u6309\u4E0B"Alt"\u65F6\u6EDA\u52A8\u901F\u5EA6\u500D\u589E\u3002',"\u641C\u7D22\u65F6\u7A81\u51FA\u663E\u793A\u5143\u7D20\u3002\u8FDB\u4E00\u6B65\u5411\u4E0A\u548C\u5411\u4E0B\u5BFC\u822A\u5C06\u4EC5\u904D\u5386\u7A81\u51FA\u663E\u793A\u7684\u5143\u7D20\u3002","\u641C\u7D22\u65F6\u7B5B\u9009\u5143\u7D20\u3002","\u63A7\u5236\u5DE5\u4F5C\u53F0\u4E2D\u5217\u8868\u548C\u6811\u7684\u9ED8\u8BA4\u67E5\u627E\u6A21\u5F0F\u3002","\u7B80\u5355\u952E\u76D8\u5BFC\u822A\u805A\u7126\u4E0E\u952E\u76D8\u8F93\u5165\u76F8\u5339\u914D\u7684\u5143\u7D20\u3002\u4EC5\u5BF9\u524D\u7F00\u8FDB\u884C\u5339\u914D\u3002","\u9AD8\u4EAE\u952E\u76D8\u5BFC\u822A\u4F1A\u7A81\u51FA\u663E\u793A\u4E0E\u952E\u76D8\u8F93\u5165\u76F8\u5339\u914D\u7684\u5143\u7D20\u3002\u8FDB\u4E00\u6B65\u5411\u4E0A\u548C\u5411\u4E0B\u5BFC\u822A\u5C06\u4EC5\u904D\u5386\u7A81\u51FA\u663E\u793A\u7684\u5143\u7D20\u3002","\u7B5B\u9009\u5668\u952E\u76D8\u5BFC\u822A\u5C06\u7B5B\u9009\u51FA\u5E76\u9690\u85CF\u4E0E\u952E\u76D8\u8F93\u5165\u4E0D\u5339\u914D\u7684\u6240\u6709\u5143\u7D20\u3002","\u63A7\u5236\u5DE5\u4F5C\u53F0\u4E2D\u7684\u5217\u8868\u548C\u6811\u7684\u952E\u76D8\u5BFC\u822A\u6837\u5F0F\u3002\u5B83\u53EF\u4E3A\u201C\u7B80\u5355\u201D\u3001\u201C\u7A81\u51FA\u663E\u793A\u201D\u6216\u201C\u7B5B\u9009\u201D\u3002",'\u8BF7\u6539\u7528 "workbench.list.defaultFindMode" \u548C "workbench.list.typeNavigationMode"\u3002',"\u5728\u641C\u7D22\u65F6\u4F7F\u7528\u6A21\u7CCA\u5339\u914D\u3002","\u5728\u641C\u7D22\u65F6\u4F7F\u7528\u8FDE\u7EED\u5339\u914D\u3002","\u63A7\u5236\u5728\u5DE5\u4F5C\u53F0\u4E2D\u641C\u7D22\u5217\u8868\u548C\u6811\u65F6\u4F7F\u7528\u7684\u5339\u914D\u7C7B\u578B\u3002","\u63A7\u5236\u5728\u5355\u51FB\u6587\u4EF6\u5939\u540D\u79F0\u65F6\u5982\u4F55\u6269\u5C55\u6811\u6587\u4EF6\u5939\u3002\u8BF7\u6CE8\u610F\uFF0C\u5982\u679C\u4E0D\u9002\u7528\uFF0C\u67D0\u4E9B\u6811\u548C\u5217\u8868\u53EF\u80FD\u4F1A\u9009\u62E9\u5FFD\u7565\u6B64\u8BBE\u7F6E\u3002","\u63A7\u5236\u662F\u5426\u5728\u6811\u4E2D\u542F\u7528\u7C98\u6027\u6EDA\u52A8\u3002","\u63A7\u5236\u542F\u7528`#workbench.tree.enableStickyScroll#`\u65F6\u6811\u4E2D\u663E\u793A\u7684\u7C98\u6027\u5143\u7D20\u6570\u3002","\u63A7\u5236\u7C7B\u578B\u5BFC\u822A\u5728\u5DE5\u4F5C\u53F0\u7684\u5217\u8868\u548C\u6811\u4E2D\u7684\u5DE5\u4F5C\u65B9\u5F0F\u3002\u5982\u679C\u8BBE\u7F6E\u4E3A`trigger`\uFF0C\u5219\u5728\u8FD0\u884C `list.triggerTypeNavigation` \u547D\u4EE4\u540E\uFF0C\u7C7B\u578B\u5BFC\u822A\u5C06\u5F00\u59CB\u3002"],"vs/platform/markers/common/markers":["\u9519\u8BEF","\u8B66\u544A","\u4FE1\u606F"],"vs/platform/quickinput/browser/commandsQuickAccess":["\u6700\u8FD1\u4F7F\u7528","\u7C7B\u4F3C\u547D\u4EE4","\u5E38\u7528","\u5176\u4ED6\u547D\u4EE4","\u7C7B\u4F3C\u547D\u4EE4","{0}, {1}",'\u547D\u4EE4 "{0}" \u5BFC\u81F4\u9519\u8BEF'],"vs/platform/quickinput/browser/helpQuickAccess":["{0}, {1}"],"vs/platform/quickinput/browser/quickInput":["\u4E0A\u4E00\u6B65",'\u6309 "Enter" \u4EE5\u786E\u8BA4\u6216\u6309 "Esc" \u4EE5\u53D6\u6D88',"{0}/{1}","\u5728\u6B64\u8F93\u5165\u53EF\u7F29\u5C0F\u7ED3\u679C\u8303\u56F4\u3002"],"vs/platform/quickinput/browser/quickInputController":["\u5207\u6362\u6240\u6709\u590D\u9009\u6846","{0} \u4E2A\u7ED3\u679C","\u5DF2\u9009 {0} \u9879","\u786E\u5B9A","\u81EA\u5B9A\u4E49","\u540E\u9000 ({0})","\u4E0A\u4E00\u6B65"],"vs/platform/quickinput/browser/quickInputList":["\u5FEB\u901F\u8F93\u5165"],"vs/platform/quickinput/browser/quickInputUtils":['\u5355\u51FB\u4EE5\u6267\u884C\u547D\u4EE4 "{0}"'],"vs/platform/theme/common/colorRegistry":["\u6574\u4F53\u524D\u666F\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u4E0D\u88AB\u7EC4\u4EF6\u8986\u76D6\u65F6\u9002\u7528\u3002","\u5DF2\u7981\u7528\u5143\u7D20\u7684\u6574\u4F53\u524D\u666F\u8272\u3002\u4EC5\u5728\u672A\u7531\u7EC4\u4EF6\u66FF\u4EE3\u65F6\u624D\u80FD\u4F7F\u7528\u6B64\u989C\u8272\u3002","\u9519\u8BEF\u4FE1\u606F\u7684\u6574\u4F53\u524D\u666F\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u4E0D\u88AB\u7EC4\u4EF6\u8986\u76D6\u65F6\u9002\u7528\u3002","\u63D0\u4F9B\u5176\u4ED6\u4FE1\u606F\u7684\u8BF4\u660E\u6587\u672C\u7684\u524D\u666F\u8272\uFF0C\u4F8B\u5982\u6807\u7B7E\u6587\u672C\u3002","\u5DE5\u4F5C\u53F0\u4E2D\u56FE\u6807\u7684\u9ED8\u8BA4\u989C\u8272\u3002","\u7126\u70B9\u5143\u7D20\u7684\u6574\u4F53\u8FB9\u6846\u989C\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u4E0D\u88AB\u5176\u4ED6\u7EC4\u4EF6\u8986\u76D6\u65F6\u9002\u7528\u3002","\u5728\u5143\u7D20\u5468\u56F4\u989D\u5916\u7684\u4E00\u5C42\u8FB9\u6846\uFF0C\u7528\u6765\u63D0\u9AD8\u5BF9\u6BD4\u5EA6\u4ECE\u800C\u533A\u522B\u5176\u4ED6\u5143\u7D20\u3002","\u5728\u6D3B\u52A8\u5143\u7D20\u5468\u56F4\u989D\u5916\u7684\u4E00\u5C42\u8FB9\u6846\uFF0C\u7528\u6765\u63D0\u9AD8\u5BF9\u6BD4\u5EA6\u4ECE\u800C\u533A\u522B\u5176\u4ED6\u5143\u7D20\u3002","\u5DE5\u4F5C\u53F0\u6240\u9009\u6587\u672C\u7684\u80CC\u666F\u989C\u8272(\u4F8B\u5982\u8F93\u5165\u5B57\u6BB5\u6216\u6587\u672C\u533A\u57DF)\u3002\u6CE8\u610F\uFF0C\u672C\u8BBE\u7F6E\u4E0D\u9002\u7528\u4E8E\u7F16\u8F91\u5668\u3002","\u6587\u5B57\u5206\u9694\u7B26\u7684\u989C\u8272\u3002","\u6587\u672C\u4E2D\u94FE\u63A5\u7684\u524D\u666F\u8272\u3002","\u6587\u672C\u4E2D\u94FE\u63A5\u5728\u70B9\u51FB\u6216\u9F20\u6807\u60AC\u505C\u65F6\u7684\u524D\u666F\u8272 \u3002","\u9884\u683C\u5F0F\u5316\u6587\u672C\u6BB5\u7684\u524D\u666F\u8272\u3002","\u9884\u683C\u5F0F\u5316\u6587\u672C\u6BB5\u7684\u80CC\u666F\u8272\u3002","\u6587\u672C\u4E2D\u5757\u5F15\u7528\u7684\u80CC\u666F\u989C\u8272\u3002","\u6587\u672C\u4E2D\u5757\u5F15\u7528\u7684\u8FB9\u6846\u989C\u8272\u3002","\u6587\u672C\u4E2D\u4EE3\u7801\u5757\u7684\u80CC\u666F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u5185\u5C0F\u7EC4\u4EF6(\u5982\u67E5\u627E/\u66FF\u6362)\u7684\u9634\u5F71\u989C\u8272\u3002","\u7F16\u8F91\u5668\u5185\u5C0F\u7EC4\u4EF6(\u5982\u67E5\u627E/\u66FF\u6362)\u7684\u8FB9\u6846\u989C\u8272\u3002","\u8F93\u5165\u6846\u80CC\u666F\u8272\u3002","\u8F93\u5165\u6846\u524D\u666F\u8272\u3002","\u8F93\u5165\u6846\u8FB9\u6846\u3002","\u8F93\u5165\u5B57\u6BB5\u4E2D\u5DF2\u6FC0\u6D3B\u9009\u9879\u7684\u8FB9\u6846\u989C\u8272\u3002","\u8F93\u5165\u5B57\u6BB5\u4E2D\u6FC0\u6D3B\u9009\u9879\u7684\u80CC\u666F\u989C\u8272\u3002","\u8F93\u5165\u5B57\u6BB5\u4E2D\u9009\u9879\u7684\u80CC\u666F\u60AC\u505C\u989C\u8272\u3002","\u8F93\u5165\u5B57\u6BB5\u4E2D\u5DF2\u6FC0\u6D3B\u7684\u9009\u9879\u7684\u524D\u666F\u8272\u3002","\u8F93\u5165\u6846\u4E2D\u5360\u4F4D\u7B26\u7684\u524D\u666F\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u4FE1\u606F\u7EA7\u522B\u65F6\u7684\u80CC\u666F\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u4FE1\u606F\u7EA7\u522B\u65F6\u7684\u524D\u666F\u8272\u3002","\u4E25\u91CD\u6027\u4E3A\u4FE1\u606F\u65F6\u8F93\u5165\u9A8C\u8BC1\u7684\u8FB9\u6846\u989C\u8272\u3002","\u4E25\u91CD\u6027\u4E3A\u8B66\u544A\u65F6\u8F93\u5165\u9A8C\u8BC1\u7684\u80CC\u666F\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u8B66\u544A\u7EA7\u522B\u65F6\u7684\u524D\u666F\u8272\u3002","\u4E25\u91CD\u6027\u4E3A\u8B66\u544A\u65F6\u8F93\u5165\u9A8C\u8BC1\u7684\u8FB9\u6846\u989C\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u9519\u8BEF\u7EA7\u522B\u65F6\u7684\u80CC\u666F\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u9519\u8BEF\u7EA7\u522B\u65F6\u7684\u524D\u666F\u8272\u3002","\u4E25\u91CD\u6027\u4E3A\u9519\u8BEF\u65F6\u8F93\u5165\u9A8C\u8BC1\u7684\u8FB9\u6846\u989C\u8272\u3002","\u4E0B\u62C9\u5217\u8868\u80CC\u666F\u8272\u3002","\u4E0B\u62C9\u5217\u8868\u80CC\u666F\u8272\u3002","\u4E0B\u62C9\u5217\u8868\u524D\u666F\u8272\u3002","\u4E0B\u62C9\u5217\u8868\u8FB9\u6846\u3002","\u6309\u94AE\u524D\u666F\u8272\u3002","\u6309\u94AE\u5206\u9694\u7B26\u989C\u8272\u3002","\u6309\u94AE\u80CC\u666F\u8272\u3002","\u6309\u94AE\u5728\u60AC\u505C\u65F6\u7684\u80CC\u666F\u989C\u8272\u3002","\u6309\u94AE\u8FB9\u6846\u989C\u8272\u3002","\u8F85\u52A9\u6309\u94AE\u524D\u666F\u8272\u3002","\u8F85\u52A9\u6309\u94AE\u80CC\u666F\u8272\u3002","\u60AC\u505C\u65F6\u7684\u8F85\u52A9\u6309\u94AE\u80CC\u666F\u8272\u3002","Badge \u80CC\u666F\u8272\u3002Badge \u662F\u5C0F\u578B\u7684\u4FE1\u606F\u6807\u7B7E\uFF0C\u5982\u8868\u793A\u641C\u7D22\u7ED3\u679C\u6570\u91CF\u7684\u6807\u7B7E\u3002","Badge \u524D\u666F\u8272\u3002Badge \u662F\u5C0F\u578B\u7684\u4FE1\u606F\u6807\u7B7E\uFF0C\u5982\u8868\u793A\u641C\u7D22\u7ED3\u679C\u6570\u91CF\u7684\u6807\u7B7E\u3002","\u8868\u793A\u89C6\u56FE\u88AB\u6EDA\u52A8\u7684\u6EDA\u52A8\u6761\u9634\u5F71\u3002","\u6EDA\u52A8\u6761\u6ED1\u5757\u80CC\u666F\u8272","\u6EDA\u52A8\u6761\u6ED1\u5757\u5728\u60AC\u505C\u65F6\u7684\u80CC\u666F\u8272","\u6EDA\u52A8\u6761\u6ED1\u5757\u5728\u88AB\u70B9\u51FB\u65F6\u7684\u80CC\u666F\u8272\u3002","\u8868\u793A\u957F\u65F6\u95F4\u64CD\u4F5C\u7684\u8FDB\u5EA6\u6761\u7684\u80CC\u666F\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u9519\u8BEF\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7F16\u8F91\u5668\u4E2D\u9519\u8BEF\u6CE2\u6D6A\u7EBF\u7684\u524D\u666F\u8272\u3002","\u5982\u679C\u8BBE\u7F6E\uFF0C\u7F16\u8F91\u5668\u4E2D\u9519\u8BEF\u7684\u53CC\u4E0B\u5212\u7EBF\u989C\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u8B66\u544A\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7F16\u8F91\u5668\u4E2D\u8B66\u544A\u6CE2\u6D6A\u7EBF\u7684\u524D\u666F\u8272\u3002","\u5982\u679C\u8BBE\u7F6E\uFF0C\u7F16\u8F91\u5668\u4E2D\u8B66\u544A\u7684\u53CC\u4E0B\u5212\u7EBF\u989C\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u4FE1\u606F\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7F16\u8F91\u5668\u4E2D\u4FE1\u606F\u6CE2\u6D6A\u7EBF\u7684\u524D\u666F\u8272\u3002","\u5982\u679C\u8BBE\u7F6E\uFF0C\u7F16\u8F91\u5668\u4E2D\u4FE1\u606F\u7684\u53CC\u4E0B\u5212\u7EBF\u989C\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u63D0\u793A\u6CE2\u6D6A\u7EBF\u7684\u524D\u666F\u8272\u3002","\u5982\u679C\u8BBE\u7F6E\uFF0C\u7F16\u8F91\u5668\u4E2D\u63D0\u793A\u7684\u53CC\u4E0B\u5212\u7EBF\u989C\u8272\u3002","\u6D3B\u52A8\u6846\u683C\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7F16\u8F91\u5668\u80CC\u666F\u8272\u3002","\u7F16\u8F91\u5668\u9ED8\u8BA4\u524D\u666F\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u7C98\u6EDE\u6EDA\u52A8\u7684\u80CC\u666F\u8272","\u5728\u7F16\u8F91\u5668\u4E2D\u60AC\u505C\u65F6\u7C98\u6EDE\u6EDA\u52A8\u7684\u80CC\u666F\u8272","\u7F16\u8F91\u5668\u4E2D\u7C98\u6EDE\u6EDA\u52A8\u7684\u8FB9\u6846\u989C\u8272"," \u7F16\u8F91\u5668\u4E2D\u7C98\u6EDE\u6EDA\u52A8\u7684\u9634\u5F71\u989C\u8272","\u7F16\u8F91\u5668\u7EC4\u4EF6(\u5982\u67E5\u627E/\u66FF\u6362)\u80CC\u666F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u5C0F\u90E8\u4EF6\u7684\u524D\u666F\u8272\uFF0C\u5982\u67E5\u627E/\u66FF\u6362\u3002","\u7F16\u8F91\u5668\u5C0F\u90E8\u4EF6\u7684\u8FB9\u6846\u989C\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u5C0F\u90E8\u4EF6\u6709\u8FB9\u6846\u4E14\u4E0D\u88AB\u5C0F\u90E8\u4EF6\u91CD\u5199\u65F6\u9002\u7528\u3002","\u7F16\u8F91\u5668\u5C0F\u90E8\u4EF6\u5927\u5C0F\u8C03\u6574\u6761\u7684\u8FB9\u6846\u989C\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u5C0F\u90E8\u4EF6\u6709\u8C03\u6574\u8FB9\u6846\u4E14\u4E0D\u88AB\u5C0F\u90E8\u4EF6\u989C\u8272\u8986\u76D6\u65F6\u4F7F\u7528\u3002","\u80CC\u666F\u989C\u8272\u5FEB\u901F\u9009\u53D6\u5668\u3002\u5FEB\u901F\u9009\u53D6\u5668\u5C0F\u90E8\u4EF6\u662F\u9009\u53D6\u5668(\u5982\u547D\u4EE4\u8C03\u8272\u677F)\u7684\u5BB9\u5668\u3002","\u524D\u666F\u989C\u8272\u5FEB\u901F\u9009\u53D6\u5668\u3002\u5FEB\u901F\u9009\u53D6\u5668\u5C0F\u90E8\u4EF6\u662F\u547D\u4EE4\u8C03\u8272\u677F\u7B49\u9009\u53D6\u5668\u7684\u5BB9\u5668\u3002","\u6807\u9898\u80CC\u666F\u989C\u8272\u5FEB\u901F\u9009\u53D6\u5668\u3002\u5FEB\u901F\u9009\u53D6\u5668\u5C0F\u90E8\u4EF6\u662F\u547D\u4EE4\u8C03\u8272\u677F\u7B49\u9009\u53D6\u5668\u7684\u5BB9\u5668\u3002","\u5FEB\u901F\u9009\u53D6\u5668\u5206\u7EC4\u6807\u7B7E\u7684\u989C\u8272\u3002","\u5FEB\u901F\u9009\u53D6\u5668\u5206\u7EC4\u8FB9\u6846\u7684\u989C\u8272\u3002","\u952E\u7ED1\u5B9A\u6807\u7B7E\u80CC\u666F\u8272\u3002\u952E\u7ED1\u5B9A\u6807\u7B7E\u7528\u4E8E\u8868\u793A\u952E\u76D8\u5FEB\u6377\u65B9\u5F0F\u3002","\u952E\u7ED1\u5B9A\u6807\u7B7E\u524D\u666F\u8272\u3002\u952E\u7ED1\u5B9A\u6807\u7B7E\u7528\u4E8E\u8868\u793A\u952E\u76D8\u5FEB\u6377\u65B9\u5F0F\u3002","\u952E\u7ED1\u5B9A\u6807\u7B7E\u8FB9\u6846\u8272\u3002\u952E\u7ED1\u5B9A\u6807\u7B7E\u7528\u4E8E\u8868\u793A\u952E\u76D8\u5FEB\u6377\u65B9\u5F0F\u3002","\u952E\u7ED1\u5B9A\u6807\u7B7E\u8FB9\u6846\u5E95\u90E8\u8272\u3002\u952E\u7ED1\u5B9A\u6807\u7B7E\u7528\u4E8E\u8868\u793A\u952E\u76D8\u5FEB\u6377\u65B9\u5F0F\u3002","\u7F16\u8F91\u5668\u6240\u9009\u5185\u5BB9\u7684\u989C\u8272\u3002","\u7528\u4EE5\u5F70\u663E\u9AD8\u5BF9\u6BD4\u5EA6\u7684\u6240\u9009\u6587\u672C\u7684\u989C\u8272\u3002","\u975E\u6D3B\u52A8\u7F16\u8F91\u5668\u4E2D\u6240\u9009\u5185\u5BB9\u7684\u989C\u8272\uFF0C\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u88C5\u9970\u6548\u679C\u3002","\u5177\u6709\u4E0E\u6240\u9009\u9879\u76F8\u5173\u5185\u5BB9\u7684\u533A\u57DF\u7684\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u4E0E\u6240\u9009\u9879\u5185\u5BB9\u76F8\u540C\u7684\u533A\u57DF\u7684\u8FB9\u6846\u989C\u8272\u3002","\u5F53\u524D\u641C\u7D22\u5339\u914D\u9879\u7684\u989C\u8272\u3002","\u5176\u4ED6\u641C\u7D22\u5339\u914D\u9879\u7684\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u9650\u5236\u641C\u7D22\u8303\u56F4\u7684\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5F53\u524D\u641C\u7D22\u5339\u914D\u9879\u7684\u8FB9\u6846\u989C\u8272\u3002","\u5176\u4ED6\u641C\u7D22\u5339\u914D\u9879\u7684\u8FB9\u6846\u989C\u8272\u3002","\u9650\u5236\u641C\u7D22\u7684\u8303\u56F4\u7684\u8FB9\u6846\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u641C\u7D22\u7F16\u8F91\u5668\u67E5\u8BE2\u5339\u914D\u7684\u989C\u8272\u3002","\u641C\u7D22\u7F16\u8F91\u5668\u67E5\u8BE2\u5339\u914D\u7684\u8FB9\u6846\u989C\u8272\u3002","\u641C\u7D22 Viewlet \u5B8C\u6210\u6D88\u606F\u4E2D\u6587\u672C\u7684\u989C\u8272\u3002","\u5728\u4E0B\u9762\u7A81\u51FA\u663E\u793A\u60AC\u505C\u7684\u5B57\u8BCD\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7F16\u8F91\u5668\u60AC\u505C\u63D0\u793A\u7684\u80CC\u666F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u60AC\u505C\u7684\u524D\u666F\u989C\u8272\u3002","\u5149\u6807\u60AC\u505C\u65F6\u7F16\u8F91\u5668\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7F16\u8F91\u5668\u60AC\u505C\u72B6\u6001\u680F\u7684\u80CC\u666F\u8272\u3002","\u6D3B\u52A8\u94FE\u63A5\u989C\u8272\u3002","\u5185\u8054\u63D0\u793A\u7684\u524D\u666F\u8272","\u5185\u8054\u63D0\u793A\u7684\u80CC\u666F\u8272","\u7C7B\u578B\u5185\u8054\u63D0\u793A\u7684\u524D\u666F\u8272","\u7C7B\u578B\u5185\u8054\u63D0\u793A\u7684\u80CC\u666F\u8272","\u53C2\u6570\u5185\u8054\u63D0\u793A\u7684\u524D\u666F\u8272","\u53C2\u6570\u5185\u8054\u63D0\u793A\u7684\u80CC\u666F\u8272","\u7528\u4E8E\u706F\u6CE1\u64CD\u4F5C\u56FE\u6807\u7684\u989C\u8272\u3002","\u7528\u4E8E\u706F\u6CE1\u81EA\u52A8\u4FEE\u590D\u64CD\u4F5C\u56FE\u6807\u7684\u989C\u8272\u3002","\u7528\u4E8E\u706F\u6CE1 AI \u56FE\u6807\u7684\u989C\u8272\u3002","\u5DF2\u63D2\u5165\u7684\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5DF2\u5220\u9664\u7684\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5DF2\u63D2\u5165\u7684\u884C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5DF2\u5220\u9664\u7684\u884C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u63D2\u5165\u884C\u7684\u8FB9\u8DDD\u7684\u80CC\u666F\u8272\u3002","\u5220\u9664\u884C\u7684\u8FB9\u8DDD\u7684\u80CC\u666F\u8272\u3002","\u63D2\u5165\u5185\u5BB9\u7684\u5DEE\u5F02\u6982\u8FF0\u6807\u5C3A\u524D\u666F\u3002","\u5220\u9664\u5185\u5BB9\u7684\u5DEE\u5F02\u6982\u8FF0\u6807\u5C3A\u524D\u666F\u3002","\u63D2\u5165\u7684\u6587\u672C\u7684\u8F6E\u5ED3\u989C\u8272\u3002","\u88AB\u5220\u9664\u6587\u672C\u7684\u8F6E\u5ED3\u989C\u8272\u3002","\u4E24\u4E2A\u6587\u672C\u7F16\u8F91\u5668\u4E4B\u95F4\u7684\u8FB9\u6846\u989C\u8272\u3002","\u5DEE\u5F02\u7F16\u8F91\u5668\u7684\u5BF9\u89D2\u7EBF\u586B\u5145\u989C\u8272\u3002\u5BF9\u89D2\u7EBF\u586B\u5145\u7528\u4E8E\u5E76\u6392\u5DEE\u5F02\u89C6\u56FE\u3002","\u5DEE\u5F02\u7F16\u8F91\u5668\u4E2D\u672A\u66F4\u6539\u5757\u7684\u80CC\u666F\u8272\u3002","\u5DEE\u5F02\u7F16\u8F91\u5668\u4E2D\u672A\u66F4\u6539\u5757\u7684\u524D\u666F\u8272\u3002","\u5DEE\u5F02\u7F16\u8F91\u5668\u4E2D\u672A\u66F4\u6539\u4EE3\u7801\u7684\u80CC\u666F\u8272\u3002","\u7126\u70B9\u9879\u5728\u5217\u8868\u6216\u6811\u6D3B\u52A8\u65F6\u7684\u80CC\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u7126\u70B9\u9879\u5728\u5217\u8868\u6216\u6811\u6D3B\u52A8\u65F6\u7684\u524D\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u5217\u8868/\u6811\u6D3B\u52A8\u65F6\uFF0C\u7126\u70B9\u9879\u76EE\u7684\u5217\u8868/\u6811\u8FB9\u6846\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868/\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u5F53\u5217\u8868/\u6811\u5904\u4E8E\u6D3B\u52A8\u72B6\u6001\u4E14\u5DF2\u9009\u62E9\u65F6\uFF0C\u91CD\u70B9\u9879\u7684\u5217\u8868/\u6811\u8FB9\u6846\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868/\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u4F46\u975E\u6D3B\u52A8\u7684\u5219\u6CA1\u6709\u3002","\u5DF2\u9009\u9879\u5728\u5217\u8868\u6216\u6811\u6D3B\u52A8\u65F6\u7684\u80CC\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u5DF2\u9009\u9879\u5728\u5217\u8868\u6216\u6811\u6D3B\u52A8\u65F6\u7684\u524D\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u5DF2\u9009\u9879\u5728\u5217\u8868/\u6811\u6D3B\u52A8\u65F6\u7684\u5217\u8868/\u6811\u56FE\u6807\u524D\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868/\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u5219\u6CA1\u6709\u3002","\u5DF2\u9009\u9879\u5728\u5217\u8868\u6216\u6811\u975E\u6D3B\u52A8\u65F6\u7684\u80CC\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u5DF2\u9009\u9879\u5728\u5217\u8868\u6216\u6811\u975E\u6D3B\u52A8\u65F6\u7684\u524D\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u5DF2\u9009\u9879\u5728\u5217\u8868/\u6811\u975E\u6D3B\u52A8\u65F6\u7684\u56FE\u6807\u524D\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868/\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u5219\u6CA1\u6709\u3002","\u975E\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u63A7\u4EF6\u4E2D\u7126\u70B9\u9879\u7684\u80CC\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u5217\u8868/\u6570\u975E\u6D3B\u52A8\u65F6\uFF0C\u7126\u70B9\u9879\u76EE\u7684\u5217\u8868/\u6811\u8FB9\u6846\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868/\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u4F7F\u7528\u9F20\u6807\u79FB\u52A8\u9879\u76EE\u65F6\uFF0C\u5217\u8868\u6216\u6811\u7684\u80CC\u666F\u989C\u8272\u3002","\u9F20\u6807\u5728\u9879\u76EE\u4E0A\u60AC\u505C\u65F6\uFF0C\u5217\u8868\u6216\u6811\u7684\u524D\u666F\u989C\u8272\u3002","\u4F7F\u7528\u9F20\u6807\u79FB\u52A8\u9879\u76EE\u65F6\uFF0C\u5217\u8868\u6216\u6811\u8FDB\u884C\u62D6\u653E\u7684\u80CC\u666F\u989C\u8272\u3002","\u4F7F\u7528\u9F20\u6807\u5728\u9879\u76EE\u4E4B\u95F4\u79FB\u52A8\u9879\u65F6\uFF0C\u5217\u8868/\u6811\u62D6\u653E\u8FB9\u6846\u7684\u989C\u8272\u3002","\u5728\u5217\u8868\u6216\u6811\u4E2D\u641C\u7D22\u65F6\uFF0C\u5176\u4E2D\u5339\u914D\u5185\u5BB9\u7684\u9AD8\u4EAE\u989C\u8272\u3002","\u5728\u5217\u8868\u6216\u6811\u4E2D\u641C\u7D22\u65F6\uFF0C\u5339\u914D\u6D3B\u52A8\u805A\u7126\u9879\u7684\u7A81\u51FA\u663E\u793A\u5185\u5BB9\u7684\u5217\u8868/\u6811\u524D\u666F\u8272\u3002","\u5217\u8868\u6216\u6811\u4E2D\u65E0\u6548\u9879\u7684\u524D\u666F\u8272\uFF0C\u4F8B\u5982\u8D44\u6E90\u7BA1\u7406\u5668\u4E2D\u6CA1\u6709\u89E3\u6790\u7684\u6839\u76EE\u5F55\u3002","\u5305\u542B\u9519\u8BEF\u7684\u5217\u8868\u9879\u7684\u524D\u666F\u989C\u8272\u3002","\u5305\u542B\u8B66\u544A\u7684\u5217\u8868\u9879\u7684\u524D\u666F\u989C\u8272\u3002","\u5217\u8868\u548C\u6811\u4E2D\u7C7B\u578B\u7B5B\u9009\u5668\u5C0F\u7EC4\u4EF6\u7684\u80CC\u666F\u8272\u3002","\u5217\u8868\u548C\u6811\u4E2D\u7C7B\u578B\u7B5B\u9009\u5668\u5C0F\u7EC4\u4EF6\u7684\u8F6E\u5ED3\u989C\u8272\u3002","\u5F53\u6CA1\u6709\u5339\u914D\u9879\u65F6\uFF0C\u5217\u8868\u548C\u6811\u4E2D\u7C7B\u578B\u7B5B\u9009\u5668\u5C0F\u7EC4\u4EF6\u7684\u8F6E\u5ED3\u989C\u8272\u3002","\u5217\u8868\u548C\u6811\u4E2D\u7C7B\u578B\u7B5B\u9009\u5668\u5C0F\u7EC4\u4EF6\u7684\u9634\u5F71\u989C\u8272\u3002","\u7B5B\u9009\u540E\u7684\u5339\u914D\u9879\u7684\u80CC\u666F\u989C\u8272\u3002","\u7B5B\u9009\u540E\u7684\u5339\u914D\u9879\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7F29\u8FDB\u53C2\u8003\u7EBF\u7684\u6811\u63CF\u8FB9\u989C\u8272\u3002","\u975E\u6D3B\u52A8\u7F29\u8FDB\u53C2\u8003\u7EBF\u7684\u6811\u63CF\u8FB9\u989C\u8272\u3002","\u5217\u4E4B\u95F4\u7684\u8868\u8FB9\u6846\u989C\u8272\u3002","\u5947\u6570\u8868\u884C\u7684\u80CC\u666F\u8272\u3002","\u53D6\u6D88\u5F3A\u8C03\u7684\u9879\u76EE\u7684\u5217\u8868/\u6811\u524D\u666F\u989C\u8272\u3002","\u590D\u9009\u6846\u5C0F\u90E8\u4EF6\u7684\u80CC\u666F\u989C\u8272\u3002","\u9009\u62E9\u590D\u9009\u6846\u5C0F\u7EC4\u4EF6\u6240\u5728\u7684\u5143\u7D20\u65F6\u8BE5\u5C0F\u7EC4\u4EF6\u7684\u80CC\u666F\u8272\u3002","\u590D\u9009\u6846\u5C0F\u90E8\u4EF6\u7684\u524D\u666F\u8272\u3002","\u590D\u9009\u6846\u5C0F\u90E8\u4EF6\u7684\u8FB9\u6846\u989C\u8272\u3002","\u9009\u62E9\u590D\u9009\u6846\u5C0F\u7EC4\u4EF6\u6240\u5728\u7684\u5143\u7D20\u65F6\u8BE5\u5C0F\u7EC4\u4EF6\u7684\u8FB9\u6846\u989C\u8272\u3002","\u8BF7\u6539\u7528 quickInputList.focusBackground","\u7126\u70B9\u9879\u76EE\u7684\u5FEB\u901F\u9009\u62E9\u5668\u524D\u666F\u8272\u3002","\u7126\u70B9\u9879\u76EE\u7684\u5FEB\u901F\u9009\u53D6\u5668\u56FE\u6807\u524D\u666F\u8272\u3002","\u7126\u70B9\u9879\u76EE\u7684\u5FEB\u901F\u9009\u62E9\u5668\u80CC\u666F\u8272\u3002","\u83DC\u5355\u7684\u8FB9\u6846\u989C\u8272\u3002","\u83DC\u5355\u9879\u7684\u524D\u666F\u989C\u8272\u3002","\u83DC\u5355\u9879\u7684\u80CC\u666F\u989C\u8272\u3002","\u83DC\u5355\u4E2D\u9009\u5B9A\u83DC\u5355\u9879\u7684\u524D\u666F\u8272\u3002","\u83DC\u5355\u4E2D\u6240\u9009\u83DC\u5355\u9879\u7684\u80CC\u666F\u8272\u3002","\u83DC\u5355\u4E2D\u6240\u9009\u83DC\u5355\u9879\u7684\u8FB9\u6846\u989C\u8272\u3002","\u83DC\u5355\u4E2D\u5206\u9694\u7EBF\u7684\u989C\u8272\u3002","\u4F7F\u7528\u9F20\u6807\u60AC\u505C\u5728\u64CD\u4F5C\u4E0A\u65F6\u663E\u793A\u5DE5\u5177\u680F\u80CC\u666F","\u4F7F\u7528\u9F20\u6807\u60AC\u505C\u5728\u64CD\u4F5C\u4E0A\u65F6\u663E\u793A\u5DE5\u5177\u680F\u8F6E\u5ED3","\u5C06\u9F20\u6807\u60AC\u505C\u5728\u64CD\u4F5C\u4E0A\u65F6\u7684\u5DE5\u5177\u680F\u80CC\u666F","\u4EE3\u7801\u7247\u6BB5 Tab \u4F4D\u7684\u9AD8\u4EAE\u80CC\u666F\u8272\u3002","\u4EE3\u7801\u7247\u6BB5 Tab \u4F4D\u7684\u9AD8\u4EAE\u8FB9\u6846\u989C\u8272\u3002","\u4EE3\u7801\u7247\u6BB5\u4E2D\u6700\u540E\u7684 Tab \u4F4D\u7684\u9AD8\u4EAE\u80CC\u666F\u8272\u3002","\u4EE3\u7801\u7247\u6BB5\u4E2D\u6700\u540E\u7684\u5236\u8868\u4F4D\u7684\u9AD8\u4EAE\u8FB9\u6846\u989C\u8272\u3002","\u7126\u70B9\u5BFC\u822A\u8DEF\u5F84\u7684\u989C\u8272","\u5BFC\u822A\u8DEF\u5F84\u9879\u7684\u80CC\u666F\u8272\u3002","\u7126\u70B9\u5BFC\u822A\u8DEF\u5F84\u7684\u989C\u8272","\u5DF2\u9009\u5BFC\u822A\u8DEF\u5F84\u9879\u7684\u989C\u8272\u3002","\u5BFC\u822A\u8DEF\u5F84\u9879\u9009\u62E9\u5668\u7684\u80CC\u666F\u8272\u3002","\u5F53\u524D\u6807\u9898\u80CC\u666F\u7684\u5185\u8054\u5408\u5E76\u51B2\u7A81\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5185\u8054\u5408\u5E76\u51B2\u7A81\u4E2D\u7684\u5F53\u524D\u5185\u5BB9\u80CC\u666F\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5185\u8054\u5408\u5E76\u51B2\u7A81\u4E2D\u7684\u4F20\u5165\u6807\u9898\u80CC\u666F\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5185\u8054\u5408\u5E76\u51B2\u7A81\u4E2D\u7684\u4F20\u5165\u5185\u5BB9\u80CC\u666F\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5185\u8054\u5408\u5E76\u51B2\u7A81\u4E2D\u7684\u5E38\u89C1\u7956\u5148\u6807\u5934\u80CC\u666F\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5185\u8054\u5408\u5E76\u51B2\u7A81\u4E2D\u7684\u5E38\u89C1\u7956\u5148\u5185\u5BB9\u80CC\u666F\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5185\u8054\u5408\u5E76\u51B2\u7A81\u4E2D\u6807\u5934\u548C\u5206\u5272\u7EBF\u7684\u8FB9\u6846\u989C\u8272\u3002","\u5185\u8054\u5408\u5E76\u51B2\u7A81\u4E2D\u5F53\u524D\u7248\u672C\u533A\u57DF\u7684\u6982\u89C8\u6807\u5C3A\u524D\u666F\u8272\u3002","\u5185\u8054\u5408\u5E76\u51B2\u7A81\u4E2D\u4F20\u5165\u7684\u7248\u672C\u533A\u57DF\u7684\u6982\u89C8\u6807\u5C3A\u524D\u666F\u8272\u3002","\u5185\u8054\u5408\u5E76\u51B2\u7A81\u4E2D\u5171\u540C\u7956\u5148\u533A\u57DF\u7684\u6982\u89C8\u6807\u5C3A\u524D\u666F\u8272\u3002","\u7528\u4E8E\u67E5\u627E\u5339\u914D\u9879\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7528\u4E8E\u7A81\u51FA\u663E\u793A\u6240\u9009\u5185\u5BB9\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7528\u4E8E\u67E5\u627E\u5339\u914D\u9879\u7684\u8FF7\u4F60\u5730\u56FE\u6807\u8BB0\u989C\u8272\u3002","\u7528\u4E8E\u91CD\u590D\u7F16\u8F91\u5668\u9009\u62E9\u7684\u7F29\u7565\u56FE\u6807\u8BB0\u989C\u8272\u3002","\u7F16\u8F91\u5668\u9009\u533A\u5728\u8FF7\u4F60\u5730\u56FE\u4E2D\u5BF9\u5E94\u7684\u6807\u8BB0\u989C\u8272\u3002","\u4FE1\u606F\u7684\u8FF7\u4F60\u5730\u56FE\u6807\u8BB0\u989C\u8272\u3002","\u7528\u4E8E\u8B66\u544A\u7684\u8FF7\u4F60\u5730\u56FE\u6807\u8BB0\u989C\u8272\u3002","\u7528\u4E8E\u9519\u8BEF\u7684\u8FF7\u4F60\u5730\u56FE\u6807\u8BB0\u989C\u8272\u3002","\u8FF7\u4F60\u5730\u56FE\u80CC\u666F\u989C\u8272\u3002",'\u5728\u7F29\u7565\u56FE\u4E2D\u5448\u73B0\u7684\u524D\u666F\u5143\u7D20\u7684\u4E0D\u900F\u660E\u5EA6\u3002\u4F8B\u5982\uFF0C"#000000c0" \u5C06\u5448\u73B0\u4E0D\u900F\u660E\u5EA6\u4E3A 75% \u7684\u5143\u7D20\u3002',"\u8FF7\u4F60\u5730\u56FE\u6ED1\u5757\u80CC\u666F\u989C\u8272\u3002","\u60AC\u505C\u65F6\uFF0C\u8FF7\u4F60\u5730\u56FE\u6ED1\u5757\u7684\u80CC\u666F\u989C\u8272\u3002","\u5355\u51FB\u65F6\uFF0C\u8FF7\u4F60\u5730\u56FE\u6ED1\u5757\u7684\u80CC\u666F\u989C\u8272\u3002","\u7528\u4E8E\u95EE\u9898\u9519\u8BEF\u56FE\u6807\u7684\u989C\u8272\u3002","\u7528\u4E8E\u95EE\u9898\u8B66\u544A\u56FE\u6807\u7684\u989C\u8272\u3002","\u7528\u4E8E\u95EE\u9898\u4FE1\u606F\u56FE\u6807\u7684\u989C\u8272\u3002","\u56FE\u8868\u4E2D\u4F7F\u7528\u7684\u524D\u666F\u989C\u8272\u3002","\u7528\u4E8E\u56FE\u8868\u4E2D\u7684\u6C34\u5E73\u7EBF\u6761\u7684\u989C\u8272\u3002","\u56FE\u8868\u53EF\u89C6\u5316\u6548\u679C\u4E2D\u4F7F\u7528\u7684\u7EA2\u8272\u3002","\u56FE\u8868\u53EF\u89C6\u5316\u6548\u679C\u4E2D\u4F7F\u7528\u7684\u84DD\u8272\u3002","\u56FE\u8868\u53EF\u89C6\u5316\u6548\u679C\u4E2D\u4F7F\u7528\u7684\u9EC4\u8272\u3002","\u56FE\u8868\u53EF\u89C6\u5316\u6548\u679C\u4E2D\u4F7F\u7528\u7684\u6A59\u8272\u3002","\u56FE\u8868\u53EF\u89C6\u5316\u6548\u679C\u4E2D\u4F7F\u7528\u7684\u7EFF\u8272\u3002","\u56FE\u8868\u53EF\u89C6\u5316\u6548\u679C\u4E2D\u4F7F\u7528\u7684\u7D2B\u8272\u3002"],"vs/platform/theme/common/iconRegistry":["\u8981\u4F7F\u7528\u7684\u5B57\u4F53\u7684 ID\u3002\u5982\u679C\u672A\u8BBE\u7F6E\uFF0C\u5219\u4F7F\u7528\u6700\u5148\u5B9A\u4E49\u7684\u5B57\u4F53\u3002","\u4E0E\u56FE\u6807\u5B9A\u4E49\u5173\u8054\u7684\u5B57\u4F53\u5B57\u7B26\u3002","\u5C0F\u7EC4\u4EF6\u4E2D\u201C\u5173\u95ED\u201D\u64CD\u4F5C\u7684\u56FE\u6807\u3002","\u201C\u8F6C\u5230\u4E0A\u4E00\u4E2A\u7F16\u8F91\u5668\u4F4D\u7F6E\u201D\u56FE\u6807\u3002","\u201C\u8F6C\u5230\u4E0B\u4E00\u4E2A\u7F16\u8F91\u5668\u4F4D\u7F6E\u201D\u56FE\u6807\u3002"],"vs/platform/undoRedo/common/undoRedoService":["\u4EE5\u4E0B\u6587\u4EF6\u5DF2\u5173\u95ED\u5E76\u4E14\u5DF2\u5728\u78C1\u76D8\u4E0A\u4FEE\u6539: {0}\u3002","\u4EE5\u4E0B\u6587\u4EF6\u5DF2\u4EE5\u4E0D\u517C\u5BB9\u7684\u65B9\u5F0F\u4FEE\u6539: {0}\u3002","\u65E0\u6CD5\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u64A4\u6D88\u201C{0}\u201D\u3002{1}","\u65E0\u6CD5\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u64A4\u6D88\u201C{0}\u201D\u3002{1}","\u65E0\u6CD5\u64A4\u6D88\u6240\u6709\u6587\u4EF6\u7684\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u5DF2\u66F4\u6539 {1}","\u65E0\u6CD5\u8DE8\u6240\u6709\u6587\u4EF6\u64A4\u9500\u201C{0}\u201D\uFF0C\u56E0\u4E3A {1} \u4E0A\u5DF2\u6709\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C\u6B63\u5728\u8FD0\u884C","\u65E0\u6CD5\u8DE8\u6240\u6709\u6587\u4EF6\u64A4\u9500\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u540C\u65F6\u53D1\u751F\u4E86\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C","\u662F\u5426\u8981\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u64A4\u6D88\u201C{0}\u201D?","\u5728 {0} \u4E2A\u6587\u4EF6\u4E2D\u64A4\u6D88(&&U)","\u64A4\u6D88\u6B64\u6587\u4EF6(&&F)","\u65E0\u6CD5\u64A4\u9500\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u5DF2\u6709\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C\u6B63\u5728\u8FD0\u884C\u3002","\u662F\u5426\u8981\u64A4\u6D88\u201C{0}\u201D?","\u662F(&&Y)","\u5426","\u65E0\u6CD5\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u91CD\u505A\u201C{0}\u201D\u3002{1}","\u65E0\u6CD5\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u91CD\u505A\u201C{0}\u201D\u3002{1}","\u65E0\u6CD5\u5BF9\u6240\u6709\u6587\u4EF6\u91CD\u505A\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u5DF2\u66F4\u6539 {1}","\u65E0\u6CD5\u8DE8\u6240\u6709\u6587\u4EF6\u91CD\u505A\u201C{0}\u201D\uFF0C\u56E0\u4E3A {1} \u4E0A\u5DF2\u6709\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C\u6B63\u5728\u8FD0\u884C","\u65E0\u6CD5\u8DE8\u6240\u6709\u6587\u4EF6\u91CD\u505A\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u540C\u65F6\u53D1\u751F\u4E86\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C","\u65E0\u6CD5\u91CD\u505A\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u5DF2\u6709\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C\u6B63\u5728\u8FD0\u884C\u3002"],"vs/platform/workspace/common/workspace":["Code \u5DE5\u4F5C\u533A"]});
+
+//# sourceMappingURL=../../../min-maps/vs/editor/editor.main.nls.zh-cn.js.map
\ No newline at end of file
diff --git a/public/vs/editor/editor.main.nls.zh-tw.js b/public/vs/editor/editor.main.nls.zh-tw.js
new file mode 100644
index 0000000..0d7ee84
--- /dev/null
+++ b/public/vs/editor/editor.main.nls.zh-tw.js
@@ -0,0 +1,13 @@
+/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.zh-tw",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["\u8F38\u5165"],"vs/base/browser/ui/findinput/findInputToggles":["\u5927\u5C0F\u5BEB\u9808\u76F8\u7B26","\u5168\u5B57\u62FC\u5BEB\u9808\u76F8\u7B26","\u4F7F\u7528\u898F\u5247\u904B\u7B97\u5F0F"],"vs/base/browser/ui/findinput/replaceInput":["\u8F38\u5165","\u4FDD\u7559\u5927\u5C0F\u5BEB"],"vs/base/browser/ui/hover/hoverWidget":["\u4F7F\u7528 {0} \u5728\u53EF\u5B58\u53D6\u6AA2\u8996\u4E2D\u6AA2\u67E5\u6B64\u9805\u76EE\u3002","\u900F\u904E\u76EE\u524D\u7121\u6CD5\u900F\u904E\u6309\u9375\u7E6B\u7D50\u95DC\u4FC2\u89F8\u767C\u7684\u958B\u555F\u53EF\u5B58\u53D6\u6AA2\u8996\u547D\u4EE4\uFF0C\u5728\u53EF\u5B58\u53D6\u6AA2\u8996\u4E2D\u6AA2\u67E5\u6B64\u9805\u76EE\u3002"],"vs/base/browser/ui/iconLabel/iconLabelHover":["\u6B63\u5728\u8F09\u5165..."],"vs/base/browser/ui/inputbox/inputBox":["\u932F\u8AA4: {0}","\u8B66\u544A: {0}","\u8CC7\u8A0A: {0}"," \u6216 {0} \u4EE5\u53D6\u5F97\u6B77\u7A0B\u8A18\u9304"," ({0} \u4EE5\u53D6\u5F97\u6B77\u7A0B\u8A18\u9304)","\u5DF2\u6E05\u9664\u8F38\u5165"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\u672A\u7E6B\u7D50"],"vs/base/browser/ui/selectBox/selectBoxCustom":["\u9078\u53D6\u65B9\u584A"],"vs/base/browser/ui/toolbar/toolbar":["\u66F4\u591A\u64CD\u4F5C"],"vs/base/browser/ui/tree/abstractTree":["\u7BE9\u9078","\u6A21\u7CCA\u6BD4\u5C0D","\u8981\u7BE9\u9078\u7684\u985E\u578B","\u8981\u641C\u5C0B\u7684\u985E\u578B","\u8981\u641C\u5C0B\u7684\u985E\u578B","\u95DC\u9589","\u627E\u4E0D\u5230\u4EFB\u4F55\u5143\u7D20\u3002"],"vs/base/common/actions":["(\u7A7A\u7684)"],"vs/base/common/errorMessage":["{0}: {1}","\u767C\u751F\u7CFB\u7D71\u932F\u8AA4 ({0})","\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4\u3002\u5982\u9700\u8A73\u7D30\u8CC7\u8A0A\uFF0C\u8ACB\u53C3\u95B1\u8A18\u9304\u6A94\u3002","\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4\u3002\u5982\u9700\u8A73\u7D30\u8CC7\u8A0A\uFF0C\u8ACB\u53C3\u95B1\u8A18\u9304\u6A94\u3002","{0} (\u7E3D\u8A08 {1} \u500B\u932F\u8AA4)","\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4\u3002\u5982\u9700\u8A73\u7D30\u8CC7\u8A0A\uFF0C\u8ACB\u53C3\u95B1\u8A18\u9304\u6A94\u3002"],"vs/base/common/keybindingLabels":["Ctrl","Shift","Alt","Windows","Ctrl","Shift","Alt","\u8D85\u7D1A\u9375","Control","Shift","\u9078\u9805","\u547D\u4EE4","Control","Shift","Alt","Windows","Control","Shift","Alt","\u8D85\u7D1A\u9375"],"vs/base/common/platform":["_"],"vs/editor/browser/controller/textAreaHandler":["\u7DE8\u8F2F\u5668","\u76EE\u524D\u7121\u6CD5\u5B58\u53D6\u6B64\u7DE8\u8F2F\u5668\u3002","{0} \u82E5\u8981\u555F\u7528\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u6700\u4F73\u5316\u6A21\u5F0F\uFF0C\u8ACB\u4F7F\u7528 {1}","{0} \u82E5\u8981\u555F\u7528\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u6700\u4F73\u5316\u6A21\u5F0F\uFF0C\uFF0C\u8ACB\u4F7F\u7528 {1} \u958B\u555F\u5FEB\u901F\u6311\u9078\uFF0C\u7136\u5F8C\u57F7\u884C [\u5207\u63DB\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u5354\u52A9\u5DE5\u5177\u6A21\u5F0F] \u547D\u4EE4\uFF0C\u8A72\u6A21\u5F0F\u76EE\u524D\u7121\u6CD5\u900F\u904E\u9375\u76E4\u89F8\u767C\u3002","{0} \u8ACB\u4F7F\u7528 {1} \u5B58\u53D6\u6309\u9375\u7E6B\u7D50\u95DC\u4FC2\u7DE8\u8F2F\u5668\u4E26\u52A0\u4EE5\u57F7\u884C\uFF0C\u4EE5\u70BA [\u5207\u63DB\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u5354\u52A9\u5DE5\u5177\u6A21\u5F0F] \u547D\u4EE4\u6307\u6D3E\u6309\u9375\u7E6B\u7D50\u95DC\u4FC2\u3002"],"vs/editor/browser/coreCommands":["\u5373\u4F7F\u884C\u7684\u9577\u5EA6\u904E\u9577\uFF0C\u4ECD\u8981\u5805\u6301\u81F3\u7D50\u5C3E","\u5373\u4F7F\u884C\u7684\u9577\u5EA6\u904E\u9577\uFF0C\u4ECD\u8981\u5805\u6301\u81F3\u7D50\u5C3E","\u5DF2\u79FB\u9664\u6B21\u8981\u8CC7\u6599\u6307\u6A19"],"vs/editor/browser/editorExtensions":["\u5FA9\u539F(&&U)","\u5FA9\u539F","\u53D6\u6D88\u5FA9\u539F(&&R)","\u91CD\u505A","\u5168\u9078(&&S)","\u5168\u9078"],"vs/editor/browser/widget/codeEditorWidget":["\u6E38\u6A19\u6578\u76EE\u5DF2\u9650\u5236\u70BA {0}\u3002\u8ACB\u8003\u616E\u4F7F\u7528 [\u5C0B\u627E\u548C\u53D6\u4EE3](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) \u9032\u884C\u8F03\u5927\u578B\u7684\u8B8A\u66F4\uFF0C\u6216\u589E\u52A0\u7DE8\u8F2F\u5668\u7684\u591A\u91CD\u6E38\u6A19\u9650\u5236\u8A2D\u5B9A\u3002","\u589E\u52A0\u591A\u91CD\u6E38\u6A19\u9650\u5236"],"vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer":["\u6613\u5B58\u53D6\u5DEE\u7570\u6AA2\u8996\u5668\u4E2D\u7684 [\u63D2\u5165] \u5716\u793A\u3002","\u6613\u5B58\u53D6\u5DEE\u7570\u6AA2\u8996\u5668\u4E2D\u7684 [\u79FB\u9664] \u5716\u793A\u3002","\u6613\u5B58\u53D6\u5DEE\u7570\u6AA2\u8996\u5668\u4E2D\u7684 [\u95DC\u9589] \u5716\u793A\u3002","\u95DC\u9589","\u53EF\u5B58\u53D6\u7684 Diff \u6AA2\u8996\u5668\u3002\u4F7F\u7528\u5411\u4E0A\u548C\u5411\u4E0B\u7BAD\u982D\u4F86\u700F\u89BD\u3002","\u672A\u8B8A\u66F4\u4EFB\u4E00\u884C","\u5DF2\u8B8A\u66F4 1 \u884C","\u5DF2\u8B8A\u66F4 {0} \u884C","{1} \u9805\u5DEE\u7570\u4E2D\u7684\u7B2C {0} \u9805: \u539F\u59CB\u884C {2}\u3001{3}\uFF0C\u4FEE\u6539\u884C {4}\u3001{5}","\u7A7A\u767D","{0} \u672A\u8B8A\u66F4\u884C {1}","{0} \u539F\u59CB\u884C {1} \u4FEE\u6539\u7684\u884C {2}","+ {0} \u4FEE\u6539\u884C {1}","- {0} \u539F\u59CB\u884C {1}"],"vs/editor/browser/widget/diffEditor/components/diffEditorEditors":[" \u4F7F\u7528 {0} \u4EE5\u958B\u555F\u5354\u52A9\u5DE5\u5177\u8AAA\u660E\u3002"],"vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin":["\u8907\u88FD\u5DF2\u522A\u9664\u7684\u884C","\u8907\u88FD\u5DF2\u522A\u9664\u7684\u884C","\u8907\u88FD\u8B8A\u66F4\u7684\u884C","\u8907\u88FD\u8B8A\u66F4\u7684\u884C","\u8907\u88FD\u5DF2\u522A\u9664\u7684\u884C \uFF08{0}\uFF09","\u8907\u88FD\u8B8A\u66F4\u7684\u884C ({0})","\u9084\u539F\u6B64\u8B8A\u66F4"],"vs/editor/browser/widget/diffEditor/diffEditor.contribution":["\u7A7A\u9593\u6709\u9650\u6642\u4F7F\u7528\u5167\u5D4C\u6AA2\u8996","\u986F\u793A\u79FB\u52D5\u7684\u7A0B\u5F0F\u78BC\u5340\u584A","Diff \u7DE8\u8F2F\u5668","\u53EF\u5B58\u53D6\u7684 Diff \u6AA2\u8996\u5668","\u958B\u555F\u6613\u5B58\u53D6\u5DEE\u7570\u6AA2\u8996\u5668","\u5207\u63DB\u647A\u758A\u672A\u8B8A\u66F4\u7684\u5340\u57DF","\u5207\u63DB\u986F\u793A\u79FB\u52D5\u7684\u7A0B\u5F0F\u78BC\u5340\u584A","\u7576\u7A7A\u9593\u6709\u9650\u6642\u5207\u63DB\u4F7F\u7528\u5167\u5D4C\u6AA2\u8996","\u5207\u63DB\u5074\u908A","\u7D50\u675F\u6BD4\u8F03\u79FB\u52D5","\u647A\u758A\u6240\u6709\u672A\u8B8A\u66F4\u7684\u5340\u57DF","\u986F\u793A\u6240\u6709\u672A\u8B8A\u66F4\u7684\u5340\u57DF","\u79FB\u81F3\u4E0B\u4E00\u500B\u5DEE\u7570","\u79FB\u81F3\u4E0A\u4E00\u500B\u5DEE\u7570"],"vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature":["\u647A\u758A\u672A\u8B8A\u66F4\u7684\u5340\u57DF","\u6309\u4E00\u4E0B\u6216\u62D6\u66F3\u4EE5\u5728\u4E0A\u65B9\u986F\u793A\u66F4\u591A\u5167\u5BB9","\u986F\u793A\u672A\u8B8A\u66F4\u7684\u5340\u57DF","\u6309\u4E00\u4E0B\u6216\u62D6\u66F3\u4EE5\u5728\u4E0B\u65B9\u986F\u793A\u66F4\u591A\u5167\u5BB9","{0} \u689D\u96B1\u85CF\u884C","\u6309\u5169\u4E0B\u4EE5\u5C55\u958B"],"vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature":["\u884C {0}-{1} \u7684\u7A0B\u5F0F\u78BC\u5DF2\u79FB\u52D5\uFF0C\u4E14\u6709\u6240\u8B8A\u66F4","\u884C {0}-{1} \u7684\u7A0B\u5F0F\u78BC\u5DF2\u79FB\u52D5\uFF0C\u4E14\u6709\u6240\u8B8A\u66F4","\u7A0B\u5F0F\u78BC\u5DF2\u79FB\u81F3\u884C {0}-{1}","\u884C {0}-{1} \u7684\u7A0B\u5F0F\u78BC\u5DF2\u79FB\u52D5"],"vs/editor/browser/widget/diffEditor/features/revertButtonsFeature":["\u9084\u539F\u9078\u53D6\u7684\u8B8A\u66F4","\u9084\u539F\u8B8A\u66F4"],"vs/editor/browser/widget/diffEditor/registrations.contribution":["\u5728 Diff \u7DE8\u8F2F\u5668\u4E2D\u79FB\u52D5\u7684\u6587\u5B57\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u5728 Diff \u7DE8\u8F2F\u5668\u4E2D\u79FB\u52D5\u7684\u6587\u5B57\u7684\u4F5C\u7528\u4E2D\u6846\u7DDA\u8272\u5F69\u3002","\u672A\u8B8A\u66F4\u7684\u5340\u57DF\u5C0F\u5DE5\u5177\u5468\u570D\u7684\u9670\u5F71\u8272\u5F69\u3002","Diff \u7DE8\u8F2F\u5668\u4E2D\u7528\u65BC\u63D2\u5165\u7684\u7DDA\u689D\u88DD\u98FE\u3002","Diff \u7DE8\u8F2F\u5668\u4E2D\u7528\u65BC\u79FB\u9664\u7684\u7DDA\u689D\u88DD\u98FE\u3002"],"vs/editor/browser/widget/hoverWidget/hoverWidget":["\u6309\u4F4F {0} \u9375\u5C07\u6ED1\u9F20\u61F8\u505C\u5728\u4E0A\u9762"],"vs/editor/browser/widget/multiDiffEditorWidget/colors":["Diff \u7DE8\u8F2F\u5668\u6A19\u982D\u7684\u80CC\u666F\u8272\u5F69","\u591A\u91CD\u6A94\u6848 Diff \u7DE8\u8F2F\u5668\u7684\u80CC\u666F\u8272\u5F69","\u591A\u91CD\u6A94\u6848 Diff \u7DE8\u8F2F\u5668\u7684\u6846\u7DDA\u8272\u5F69"],"vs/editor/common/config/editorConfigurationSchema":["\u7DE8\u8F2F\u5668","\u8207 Tab \u76F8\u7B49\u7684\u7A7A\u683C\u6578\u91CF\u3002\u7576 {0} \u5DF2\u958B\u555F\u6642\uFF0C\u6703\u6839\u64DA\u6A94\u6848\u5167\u5BB9\u8986\u5BEB\u6B64\u8A2D\u5B9A\u3002","\u7528\u65BC\u7E2E\u6392\u6216 'tabSize' \u4F7F\u7528 `\"editor.tabSize\"` \u503C\u7684\u7A7A\u683C\u6578\u76EE\u3002\u7576 '#editor.detectIndentation#' \u958B\u555F\u6642\uFF0C\u6703\u6839\u64DA\u6A94\u6848\u5167\u5BB9\u8986\u5BEB\u9019\u500B\u8A2D\u5B9A\u3002","\u5728\u6309 `Tab` \u6642\u63D2\u5165\u7A7A\u683C\u3002\u7576 {0} \u958B\u555F\u6642\uFF0C\u6703\u6839\u64DA\u6A94\u6848\u5167\u5BB9\u8986\u5BEB\u6B64\u8A2D\u5B9A\u3002","\u6839\u64DA\u6A94\u6848\u5167\u5BB9\uFF0C\u63A7\u5236\u7576\u6A94\u6848\u958B\u555F\u6642\uFF0C\u662F\u5426\u81EA\u52D5\u5075\u6E2C {0} \u548C {1}\u3002","\u79FB\u9664\u5C3E\u7AEF\u81EA\u52D5\u63D2\u5165\u7684\u7A7A\u767D\u5B57\u5143\u3002","\u91DD\u5C0D\u5927\u578B\u6A94\u6848\u505C\u7528\u90E8\u5206\u9AD8\u8A18\u61B6\u9AD4\u9700\u6C42\u529F\u80FD\u7684\u7279\u6B8A\u8655\u7406\u65B9\u5F0F\u3002","\u95DC\u9589 Word \u578B\u5EFA\u8B70\u3002","\u50C5\u5EFA\u8B70\u4F86\u81EA\u4F7F\u7528\u4E2D\u6587\u4EF6\u4E2D\u7684\u5B57\u7D44\u3002","\u5EFA\u8B70\u4F86\u81EA\u6240\u6709\u5DF2\u958B\u555F\u6587\u4EF6\u4E2D\uFF0C\u8A9E\u8A00\u76F8\u540C\u7684\u5B57\u7D44\u3002","\u5EFA\u8B70\u4F86\u81EA\u6240\u6709\u5DF2\u958B\u555F\u6587\u4EF6\u4E2D\u7684\u5B57\u7D44\u3002","\u63A7\u5236\u662F\u5426\u61C9\u8A72\u6839\u64DA\u6587\u4EF6\u4E2D\u7684\u6587\u5B57\u4F86\u8A08\u7B97\u5B8C\u6210\uFF0C\u4EE5\u53CA\u5F9E\u54EA\u4E9B\u6587\u4EF6\u8A08\u7B97\u3002","\u6240\u6709\u5F69\u8272\u4E3B\u984C\u7686\u5DF2\u555F\u7528\u8A9E\u610F\u9192\u76EE\u63D0\u793A\u3002","\u6240\u6709\u5F69\u8272\u4E3B\u984C\u7686\u5DF2\u505C\u7528\u8A9E\u610F\u9192\u76EE\u63D0\u793A\u3002","\u8A9E\u610F\u9192\u76EE\u63D0\u793A\u7531\u76EE\u524D\u4E4B\u5F69\u8272\u4F48\u666F\u4E3B\u984C\u7684 'semanticHighlighting' \u8A2D\u5B9A\u6240\u8A2D\u5B9A\u3002","\u63A7\u5236 semanticHighlighting \u662F\u5426\u6703\u70BA\u652F\u63F4\u7684\u8A9E\u8A00\u986F\u793A\u3002","\u5373\u4F7F\u6309\u5169\u4E0B\u5167\u5BB9\u6216\u6309 `Escape`\uFF0C\u4ECD\u4FDD\u6301\u7784\u5B54\u7DE8\u8F2F\u5668\u958B\u555F\u3002","\u56E0\u6548\u80FD\u7684\u7DE3\u6545\uFF0C\u4E0D\u6703\u5C07\u8D85\u904E\u6B64\u9AD8\u5EA6\u7684\u884C Token \u5316","\u63A7\u5236\u6B0A\u6756\u5316\u662F\u5426\u61C9\u8A72\u5728 Web \u5DE5\u4F5C\u8005\u4E0A\u975E\u540C\u6B65\u9032\u884C\u3002","\u63A7\u5236\u662F\u5426\u61C9\u8A72\u8A18\u9304\u975E\u540C\u6B65\u6B0A\u6756\u5316\u3002\u50C5\u9069\u7528\u5075\u932F\u3002","\u63A7\u5236\u662F\u5426\u61C9\u4F7F\u7528\u820A\u7248\u80CC\u666F Token \u5316\u4F86\u9A57\u8B49\u975E\u540C\u6B65 Token \u5316\u3002\u53EF\u80FD\u6703\u6E1B\u6162 Token \u5316\u7684\u901F\u5EA6\u3002\u50C5\u7528\u65BC\u5075\u932F\u3002","\u5B9A\u7FA9\u589E\u52A0\u6216\u6E1B\u5C11\u7E2E\u6392\u7684\u62EC\u5F27\u7B26\u865F\u3002","\u5DE6\u62EC\u5F27\u5B57\u5143\u6216\u5B57\u4E32\u9806\u5E8F\u3002","\u53F3\u62EC\u5F27\u5B57\u5143\u6216\u5B57\u4E32\u9806\u5E8F\u3002","\u5B9A\u7FA9\u7576\u62EC\u5F27\u914D\u5C0D\u8457\u8272\u5DF2\u555F\u7528\u6642\uFF0C\u7531\u5176\u5DE2\u72C0\u5C64\u7D1A\u8457\u8272\u7684\u62EC\u5F27\u914D\u5C0D\u3002","\u5DE6\u62EC\u5F27\u5B57\u5143\u6216\u5B57\u4E32\u9806\u5E8F\u3002","\u53F3\u62EC\u5F27\u5B57\u5143\u6216\u5B57\u4E32\u9806\u5E8F\u3002","\u53D6\u6D88 Diff \u8A08\u7B97\u524D\u7684\u903E\u6642\u9650\u5236 (\u6BEB\u79D2)\u3002\u82E5\u7121\u903E\u6642\uFF0C\u8ACB\u4F7F\u7528 0\u3002","\u8981\u8A08\u7B97\u5DEE\u7570\u7684\u6A94\u6848\u5927\u5C0F\u4E0A\u9650 (MB)\u3002\u4F7F\u7528 0 \u8868\u793A\u7121\u9650\u5236\u3002","\u63A7\u5236 Diff \u7DE8\u8F2F\u5668\u8981\u4E26\u6392\u6216\u5167\u5D4C\u986F\u793A Diff\u3002","\u5982\u679C\u5DEE\u7570\u7DE8\u8F2F\u5668\u5BEC\u5EA6\u5C0F\u65BC\u6B64\u503C\uFF0C\u5247\u4F7F\u7528\u5167\u5D4C\u6AA2\u8996\u3002","\u5982\u679C\u555F\u7528\u4E14\u7DE8\u8F2F\u5668\u5BEC\u5EA6\u592A\u5C0F\uFF0C\u5247\u6703\u4F7F\u7528\u5167\u5D4C\u6AA2\u8996\u3002","\u555F\u7528\u6642\uFF0CDiff \u7DE8\u8F2F\u5668\u6703\u5728\u5176\u5B57\u5143\u908A\u7DE3\u986F\u793A\u7BAD\u982D\uFF0C\u4EE5\u9084\u539F\u8B8A\u66F4\u3002","\u555F\u7528\u6642\uFF0CDiff \u7DE8\u8F2F\u5668\u6703\u5FFD\u7565\u524D\u7F6E\u6216\u5F8C\u7F6E\u7A7A\u683C\u7684\u8B8A\u66F4\u3002","\u63A7\u5236 Diff \u7DE8\u8F2F\u5668\u662F\u5426\u8981\u70BA\u65B0\u589E/\u79FB\u9664\u7684\u8B8A\u66F4\u986F\u793A +/- \u6A19\u8A18\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u986F\u793A codelens\u3002","\u4E00\u5F8B\u4E0D\u63DB\u884C\u3002","\u4F9D\u6AA2\u8996\u5340\u5BEC\u5EA6\u63DB\u884C\u3002","\u5C07\u4F9D\u64DA {0} \u8A2D\u5B9A\u81EA\u52D5\u63DB\u884C\u3002","\u4F7F\u7528\u820A\u7248\u5DEE\u7570\u6F14\u7B97\u6CD5\u3002","\u4F7F\u7528\u9032\u968E\u7248\u5DEE\u7570\u6F14\u7B97\u6CD5\u3002","\u63A7\u5236\u5DEE\u7570\u7DE8\u8F2F\u5668\u662F\u5426\u986F\u793A\u672A\u8B8A\u66F4\u7684\u5340\u57DF\u3002","\u63A7\u5236\u672A\u8B8A\u66F4\u5340\u57DF\u7684\u4F7F\u7528\u884C\u6578\u3002","\u63A7\u5236\u672A\u8B8A\u66F4\u5340\u57DF\u7684\u6700\u5C0F\u4F7F\u7528\u884C\u6578\u3002","\u63A7\u5236\u6BD4\u8F03\u672A\u8B8A\u66F4\u7684\u5340\u57DF\u6642\uFF0C\u8981\u4F7F\u7528\u591A\u5C11\u884C\u4F5C\u70BA\u5167\u5BB9\u3002","\u63A7\u5236 Diff \u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u8A72\u986F\u793A\u5075\u6E2C\u5230\u7684\u7A0B\u5F0F\u78BC\u79FB\u52D5\u3002","\u63A7\u5236\u5DEE\u7570\u7DE8\u8F2F\u5668\u662F\u5426\u986F\u793A\u7A7A\u767D\u88DD\u98FE\u9805\u76EE\uFF0C\u4EE5\u67E5\u770B\u63D2\u5165\u6216\u522A\u9664\u5B57\u5143\u7684\u4F4D\u7F6E\u3002"],"vs/editor/common/config/editorOptions":["\u4F7F\u7528\u5E73\u53F0 API \u4EE5\u5075\u6E2C\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u9644\u52A0\u3002","\u4F7F\u7528\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u5C07\u4F7F\u7528\u65B9\u5F0F\u6700\u4F73\u5316\u3002","\u5047\u8A2D\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u672A\u9023\u7D50\u3002","\u63A7\u5236 UI \u662F\u5426\u61C9\u65BC\u5DF2\u70BA\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u6700\u4F73\u5316\u7684\u6A21\u5F0F\u4E2D\u57F7\u884C\u3002","\u63A7\u5236\u662F\u5426\u8981\u5728\u8A3B\u89E3\u6642\u63D2\u5165\u7A7A\u767D\u5B57\u5143\u3002","\u63A7\u5236\u662F\u5426\u61C9\u4EE5\u884C\u8A3B\u89E3\u7684\u5207\u63DB\u3001\u65B0\u589E\u6216\u79FB\u9664\u52D5\u4F5C\uFF0C\u5FFD\u7565\u7A7A\u767D\u7684\u884C\u3002","\u63A7\u5236\u8907\u88FD\u6642\u4E0D\u9078\u53D6\u4EFB\u4F55\u9805\u76EE\u662F\u5426\u6703\u8907\u88FD\u76EE\u524D\u7A0B\u5F0F\u884C\u3002","\u63A7\u5236\u5728\u8F38\u5165\u671F\u9593\u662F\u5426\u8981\u8DF3\u904E\u6E38\u6A19\u4F86\u5C0B\u627E\u76F8\u7B26\u7684\u9805\u76EE\u3002","\u6C38\u4E0D\u5F9E\u7DE8\u8F2F\u5668\u9078\u53D6\u7BC4\u570D\u4E2D\u690D\u5165\u641C\u5C0B\u5B57\u4E32\u3002","\u4E00\u5F8B\u5F9E\u7DE8\u8F2F\u5668\u9078\u53D6\u7BC4\u570D\u4E2D\u690D\u5165\u641C\u5C0B\u5B57\u4E32\uFF0C\u5305\u62EC\u6E38\u6A19\u4F4D\u7F6E\u7684\u5B57\u3002","\u53EA\u6709\u4F86\u81EA\u7DE8\u8F2F\u5668\u9078\u53D6\u7BC4\u570D\u4E2D\u7684\u690D\u5165\u641C\u5C0B\u5B57\u4E32\u3002","\u63A7\u5236 [\u5C0B\u627E\u5C0F\u5DE5\u5177] \u4E2D\u7684\u641C\u5C0B\u5B57\u4E32\u662F\u5426\u4F86\u81EA\u7DE8\u8F2F\u5668\u9078\u53D6\u9805\u76EE\u3002","\u6C38\u4E0D\u81EA\u52D5\u958B\u555F [\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E] (\u9810\u8A2D)\u3002","\u4E00\u5F8B\u81EA\u52D5\u958B\u555F [\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E]\u3002","\u9078\u53D6\u591A\u884C\u5167\u5BB9\u6642\uFF0C\u81EA\u52D5\u958B\u555F [\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E]\u3002","\u63A7\u5236\u81EA\u52D5\u958B\u555F [\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E] \u7684\u689D\u4EF6\u3002","\u63A7\u5236\u5C0B\u627E\u5C0F\u5DE5\u5177\u662F\u5426\u5728 macOS \u4E0A\u8B80\u53D6\u6216\u4FEE\u6539\u5171\u7528\u5C0B\u627E\u526A\u8CBC\u7C3F\u3002","\u63A7\u5236\u5C0B\u627E\u5C0F\u5DE5\u5177\u662F\u5426\u61C9\u5728\u7DE8\u8F2F\u5668\u9802\u7AEF\u984D\u5916\u65B0\u589E\u884C\u3002\u82E5\u70BA true\uFF0C\u7576\u60A8\u53EF\u770B\u5230\u5C0B\u627E\u5C0F\u5DE5\u5177\u6642\uFF0C\u60A8\u7684\u6372\u52D5\u7BC4\u570D\u6703\u8D85\u904E\u7B2C\u4E00\u884C\u3002","\u7576\u518D\u4E5F\u627E\u4E0D\u5230\u5176\u4ED6\u76F8\u7B26\u9805\u76EE\u6642\uFF0C\u63A7\u5236\u662F\u5426\u81EA\u52D5\u5F9E\u958B\u982D (\u6216\u7D50\u5C3E) \u91CD\u65B0\u958B\u59CB\u641C\u5C0B\u3002","\u555F\u7528/\u505C\u7528\u9023\u5B57\u5B57\u578B ('calt' \u548C 'liga' \u5B57\u578B\u529F\u80FD)\u3002\u5C07\u6B64\u9805\u8B8A\u66F4\u70BA\u5B57\u4E32\uFF0C\u4EE5\u7CBE\u78BA\u63A7\u5236 'font-feature-settings' CSS \u5C6C\u6027\u3002","\u660E\u78BA\u7684 'font-feature-settings' CSS \u5C6C\u6027\u3002\u5982\u679C\u53EA\u9700\u8981\u958B\u555F/\u95DC\u9589\u9023\u5B57\uFF0C\u53EF\u4EE5\u6539\u70BA\u50B3\u905E\u5E03\u6797\u503C\u3002","\u8A2D\u5B9A\u9023\u5B57\u5B57\u578B\u6216\u5B57\u578B\u529F\u80FD\u3002\u53EF\u4EE5\u662F\u5E03\u6797\u503C\u4EE5\u555F\u7528/\u505C\u7528\u9023\u5B57\uFF0C\u6216\u4EE3\u8868 CSS 'font-feature-settings' \u5C6C\u6027\u7684\u5B57\u4E32\u3002","\u555F\u7528/\u505C\u7528\u5F9E font-weight \u5230 font-variation-settings \u7684\u8F49\u63DB\u3002\u5C07\u6B64\u8A2D\u5B9A\u8B8A\u66F4\u70BA\u5B57\u4E32\uFF0C\u4EE5\u66F4\u7CBE\u7D30\u5730\u63A7\u5236 'font-variation-settings' CSS \u5C6C\u6027\u3002","\u660E\u78BA\u7684 'font-variation-settings' CSS \u5C6C\u6027\u3002\u5982\u679C\u53EA\u9700\u8981\u5C07 font-weight \u8F49\u63DB\u70BA font-variation-settings\uFF0C\u53EF\u4EE5\u6539\u70BA\u50B3\u905E\u5E03\u6797\u503C\u3002","\u8A2D\u5B9A\u5B57\u578B\u8B8A\u5316\u3002\u53EF\u4EE5\u662F\u5E03\u6797\u503C\uFF0C\u4EE5\u555F\u7528/\u505C\u7528\u5F9E font-weight \u5230 font-variation-settings \u7684\u8F49\u63DB\uFF0C\u6216\u662F\u5B57\u4E32\uFF0C\u505A\u70BA CSS 'font-variation-settings' \u5C6C\u6027\u7684\u503C\u3002","\u63A7\u5236\u5B57\u578B\u5927\u5C0F (\u50CF\u7D20)\u3002","\u53EA\u5141\u8A31\u300C\u4E00\u822C\u300D\u53CA\u300C\u7C97\u9AD4\u300D\u95DC\u9375\u5B57\uFF0C\u6216\u4ECB\u65BC 1 \u5230 1000 \u4E4B\u9593\u7684\u6578\u503C\u3002","\u63A7\u5236\u5B57\u578B\u7C97\u7D30\u3002\u63A5\u53D7\u300C\u4E00\u822C\u300D\u53CA\u300C\u7C97\u9AD4\u300D\u95DC\u9375\u5B57\uFF0C\u6216\u4ECB\u65BC 1 \u5230 1000 \u4E4B\u9593\u7684\u6578\u503C\u3002","\u986F\u793A\u7D50\u679C\u7684\u9810\u89BD\u6AA2\u8996 (\u9810\u8A2D)","\u79FB\u81F3\u4E3B\u8981\u7D50\u679C\u4E26\u986F\u793A\u9810\u89BD\u6AA2\u8996","\u524D\u5F80\u4E3B\u8981\u7D50\u679C\uFF0C\u4E26\u5C0D\u5176\u4ED6\u4EBA\u555F\u7528\u7121\u9810\u89BD\u700F\u89BD","\u6B64\u8A2D\u5B9A\u5DF2\u6DD8\u6C70\uFF0C\u8ACB\u6539\u7528 'editor.editor.gotoLocation.multipleDefinitions' \u6216 'editor.editor.gotoLocation.multipleImplementations' \u7B49\u55AE\u7368\u8A2D\u5B9A\u3002","\u63A7\u5236 'Go to Definition' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u63A7\u5236 'Go to Type Definition' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u63A7\u5236 'Go to Declaration' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u63A7\u5236 'Go to Implementations' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u63A7\u5236 'Go to References' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u7576 'Go to Definition' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u7576 'Go to Type Definition' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u7576 'Go to Declaration' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u7576 'Go to Implementation' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u7576 'Go to Reference' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u63A7\u5236\u662F\u5426\u986F\u793A\u66AB\u7559\u3002","\u63A7\u5236\u66AB\u7559\u986F\u793A\u7684\u5EF6\u9072\u6642\u9593 (\u4EE5\u6BEB\u79D2\u70BA\u55AE\u4F4D)\u3002","\u63A7\u5236\u7576\u6ED1\u9F20\u79FB\u904E\u6642\uFF0C\u662F\u5426\u61C9\u4FDD\u6301\u986F\u793A\u66AB\u7559\u3002","\u63A7\u5236\u66AB\u7559\u96B1\u85CF\u7684\u5EF6\u9072\u6642\u9593 (\u4EE5\u6BEB\u79D2\u70BA\u55AE\u4F4D)\u3002\u9700\u8981\u555F\u7528 `editor.hover.sticky`\u3002","\u5982\u679C\u6709\u7A7A\u9593\uFF0C\u5247\u504F\u597D\u5728\u884C\u4E0A\u65B9\u986F\u793A\u6E38\u6A19\u3002","\u5047\u8A2D\u6240\u6709\u5B57\u5143\u7684\u5BEC\u5EA6\u5747\u76F8\u540C\u3002\u9019\u662F\u4E00\u7A2E\u5FEB\u901F\u7684\u6F14\u7B97\u6CD5\uFF0C\u9069\u7528\u65BC\u7B49\u5BEC\u5B57\u578B\uFF0C\u4EE5\u53CA\u5B57\u7B26\u5BEC\u5EA6\u76F8\u540C\u7684\u90E8\u5206\u6307\u4EE4\u78BC (\u4F8B\u5982\u62C9\u4E01\u6587\u5B57\u5143)\u3002","\u5C07\u5916\u570D\u9EDE\u8A08\u7B97\u59D4\u6D3E\u7D66\u700F\u89BD\u5668\u3002\u9019\u662F\u7DE9\u6162\u7684\u6F14\u7B97\u6CD5\uFF0C\u5982\u679C\u6A94\u6848\u8F03\u5927\u53EF\u80FD\u6703\u5C0E\u81F4\u51CD\u7D50\uFF0C\u4F46\u5728\u6240\u6709\u60C5\u6CC1\u4E0B\u90FD\u6B63\u5E38\u904B\u4F5C\u3002","\u63A7\u5236\u8A08\u7B97\u5916\u570D\u9EDE\u7684\u6F14\u7B97\u6CD5\u3002\u8ACB\u6CE8\u610F\uFF0C\u5728\u5354\u52A9\u5DE5\u5177\u6A21\u5F0F\u4E2D\uFF0C\u6703\u4F7F\u7528\u9032\u968E\u4F86\u7372\u5F97\u6700\u4F73\u9AD4\u9A57\u3002","\u505C\u7528\u7A0B\u5F0F\u4EE3\u78BC\u52D5\u4F5C\u529F\u80FD\u8868\u3002","\u7576\u6E38\u6A19\u4F4D\u65BC\u542B\u6709\u7A0B\u5F0F\u4EE3\u78BC\u7684\u884C\u6642\uFF0C\u986F\u793A\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u529F\u80FD\u8868\u3002","\u7576\u6E38\u6A19\u4F4D\u65BC\u542B\u6709\u7A0B\u5F0F\u4EE3\u78BC\u7684\u884C\u6216\u7A7A\u884C\u6642\uFF0C\u986F\u793A\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u529F\u80FD\u8868\u3002","\u5728\u7DE8\u8F2F\u5668\u4E2D\u555F\u7528\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u71C8\u6CE1\u3002","\u5728\u7DE8\u8F2F\u5668\u9802\u7AEF\u6372\u52D5\u671F\u9593\u986F\u793A\u5DE2\u72C0\u7684\u76EE\u524D\u7BC4\u570D\u3002","\u5B9A\u7FA9\u8981\u986F\u793A\u7684\u81EA\u9ECF\u7DDA\u6578\u76EE\u4E0A\u9650\u3002","\u5B9A\u7FA9\u8981\u7528\u65BC\u5224\u65B7\u8981\u9ECF\u4F4F\u7684\u7DDA\u689D\u7684\u6A21\u578B\u3002\u5982\u679C\u5927\u7DB1\u6A21\u578B\u4E0D\u5B58\u5728\uFF0C\u5247\u6703\u56DE\u5230\u647A\u758A\u63D0\u4F9B\u8005\u6A21\u578B\uFF0C\u5176\u6703\u56DE\u5230\u7E2E\u6392\u6A21\u578B\u3002\u9019\u4E09\u7A2E\u60C5\u6CC1\u4E2D\u6703\u9075\u5B88\u6B64\u9806\u5E8F\u3002","\u4F7F\u7528\u7DE8\u8F2F\u5668\u7684\u6C34\u5E73\u6372\u8EF8\uFF0C\u555F\u7528\u81EA\u9ECF\u6372\u52D5\u7684\u6372\u52D5\u3002","\u555F\u7528\u7DE8\u8F2F\u5668\u4E2D\u7684\u5167\u5D4C\u63D0\u793A\u3002","\u5DF2\u555F\u7528\u5167\u5D4C\u63D0\u793A","\u9810\u8A2D\u6703\u986F\u793A\u5167\u5D4C\u63D0\u793A\uFF0C\u4E26\u5728\u6309\u4F4F {0} \u6642\u96B1\u85CF","\u9810\u8A2D\u6703\u96B1\u85CF\u5167\u5D4C\u63D0\u793A\uFF0C\u4E26\u5728\u6309\u4F4F {0} \u6642\u986F\u793A","\u5DF2\u505C\u7528\u5167\u5D4C\u63D0\u793A","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E2D\u5167\u5D4C\u63D0\u793A\u7684\u5B57\u578B\u5927\u5C0F\u3002\u7576\u8A2D\u5B9A\u7684\u503C\u5C0F\u65BC {1} \u6216\u5927\u65BC\u7DE8\u8F2F\u5668\u5B57\u578B\u5927\u5C0F\u6642\uFF0C\u5247\u6703\u4F7F\u7528{0} \u9810\u8A2D\u503C\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E2D\uFF0C\u5167\u5D4C\u63D0\u793A\u7684\u5B57\u578B\u5BB6\u65CF\u3002\u8A2D\u5B9A\u70BA\u7A7A\u767D\u6642\uFF0C\u5247\u6703\u4F7F\u7528 {0}\u3002","\u5728\u7DE8\u8F2F\u5668\u4E2D\u555F\u7528\u7684\u5167\u5D4C\u63D0\u793A\u5468\u570D\u7684\u586B\u88DC\u3002",`\u63A7\u5236\u884C\u9AD8\u3002\r
+ - \u4F7F\u7528 0 \u5F9E\u5B57\u578B\u5927\u5C0F\u81EA\u52D5\u8A08\u7B97\u884C\u9AD8\u3002\r
+ - \u4F7F\u7528\u4ECB\u65BC 0 \u548C 8 \u4E4B\u9593\u7684\u503C\u4F5C\u70BA\u5B57\u578B\u5927\u5C0F\u7684\u4E58\u6578\u3002\r
+ - \u5927\u65BC\u6216\u7B49\u65BC 8 \u7684\u503C\u5C07\u7528\u4F86\u4F5C\u70BA\u6709\u6548\u503C\u3002`,"\u63A7\u5236\u662F\u5426\u6703\u986F\u793A\u7E2E\u5716","\u63A7\u5236\u662F\u5426\u6703\u81EA\u52D5\u96B1\u85CF\u7E2E\u5716\u3002","\u7E2E\u5716\u5927\u5C0F\u8207\u7DE8\u8F2F\u5668\u5167\u5BB9\u76F8\u540C (\u4E14\u53EF\u80FD\u6703\u6372\u52D5)\u3002","\u7E2E\u5716\u6703\u8996\u9700\u8981\u4F38\u7E2E\uFF0C\u4EE5\u586B\u6EFF\u8A72\u7DE8\u8F2F\u5668\u7684\u9AD8\u5EA6 (\u7121\u6372\u52D5)\u3002","\u7E2E\u5716\u5C07\u8996\u9700\u8981\u7E2E\u5C0F\uFF0C\u4E00\u5F8B\u4E0D\u6703\u5927\u65BC\u8A72\u7DE8\u8F2F\u5668 (\u7121\u6372\u52D5)\u3002","\u63A7\u5236\u7E2E\u5716\u7684\u5927\u5C0F\u3002","\u63A7\u5236\u8981\u5728\u54EA\u7AEF\u5448\u73FE\u7E2E\u5716\u3002","\u63A7\u5236\u4F55\u6642\u986F\u793A\u8FF7\u4F60\u5730\u5716\u6ED1\u687F\u3002","\u7E2E\u5716\u5167\u6240\u7E6A\u88FD\u7684\u5167\u5BB9\u5927\u5C0F: 1\u30012 \u6216 3\u3002","\u986F\u793A\u884C\u4E2D\u7684\u5BE6\u969B\u5B57\u5143\uFF0C\u800C\u4E0D\u662F\u8272\u5F69\u5340\u584A\u3002","\u9650\u5236\u7E2E\u5716\u7684\u5BEC\u5EA6\uFF0C\u6700\u591A\u986F\u793A\u67D0\u500B\u6578\u76EE\u7684\u5217\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E0A\u908A\u7DE3\u8207\u7B2C\u4E00\u884C\u4E4B\u9593\u7684\u7A7A\u683C\u6578\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E0B\u908A\u7DE3\u8207\u6700\u5F8C\u4E00\u884C\u4E4B\u9593\u7684\u7A7A\u683C\u6578\u3002","\u555F\u7528\u5FEB\u986F\uFF0C\u5728\u60A8\u9375\u5165\u7684\u540C\u6642\u986F\u793A\u53C3\u6578\u6587\u4EF6\u548C\u985E\u578B\u8CC7\u8A0A\u3002","\u63A7\u5236\u63D0\u793A\u529F\u80FD\u8868\u662F\u5426\u5728\u6E05\u55AE\u7D50\u5C3E\u6642\u5FAA\u74B0\u6216\u95DC\u9589\u3002","\u5FEB\u901F\u5EFA\u8B70\u6703\u986F\u793A\u5728\u5EFA\u8B70\u5C0F\u5DE5\u5177\u5167","\u5FEB\u901F\u5EFA\u8B70\u6703\u986F\u793A\u70BA\u6D6E\u6C34\u5370\u6587\u5B57","\u5DF2\u505C\u7528\u5FEB\u901F\u5EFA\u8B70","\u5141\u8A31\u5728\u5B57\u4E32\u5167\u986F\u793A\u5373\u6642\u5EFA\u8B70\u3002","\u5141\u8A31\u5728\u8A3B\u89E3\u4E2D\u986F\u793A\u5373\u6642\u5EFA\u8B70\u3002","\u5141\u8A31\u5728\u5B57\u4E32\u8207\u8A3B\u89E3\u4EE5\u5916\u4E4B\u8655\u986F\u793A\u5373\u6642\u5EFA\u8B70\u3002","\u63A7\u5236\u8F38\u5165\u6642\u662F\u5426\u61C9\u81EA\u52D5\u986F\u793A\u5EFA\u8B70\u3002\u9019\u53EF\u63A7\u5236\u5728\u8A3B\u89E3\u3001\u5B57\u4E32\u53CA\u5176\u4ED6\u7A0B\u5F0F\u78BC\u4E2D\u7684\u8F38\u5165\u3002\u53EF\u8A2D\u5B9A\u5FEB\u901F\u5EFA\u8B70\u4EE5\u96B1\u5F62\u6D6E\u51FA\u6587\u5B57\u6216\u5EFA\u8B70\u5C0F\u5DE5\u5177\u986F\u793A\u3002\u53E6\u5916\u4E5F\u8ACB\u6CE8\u610F '{0}'-\u8A2D\u5B9A\uFF0C\u5176\u6703\u63A7\u5236\u5EFA\u8B70\u662F\u5426\u7531\u7279\u6B8A\u5B57\u5143\u6240\u89F8\u767C\u3002","\u4E0D\u986F\u793A\u884C\u865F\u3002","\u884C\u865F\u4EE5\u7D55\u5C0D\u503C\u986F\u793A\u3002","\u884C\u865F\u4EE5\u76EE\u524D\u6E38\u6A19\u7684\u76F8\u5C0D\u503C\u986F\u793A\u3002","\u6BCF 10 \u884C\u986F\u793A\u884C\u865F\u3002","\u63A7\u5236\u884C\u865F\u7684\u986F\u793A\u3002","\u9019\u500B\u7DE8\u8F2F\u5668\u5C3A\u898F\u6703\u8F49\u8B6F\u7684\u7B49\u5BEC\u5B57\u5143\u6578\u3002","\u6B64\u7DE8\u8F2F\u5668\u5C3A\u898F\u7684\u8272\u5F69\u3002","\u5728\u67D0\u500B\u6578\u76EE\u7684\u7B49\u5BEC\u5B57\u5143\u4E4B\u5F8C\u986F\u793A\u5782\u76F4\u5C3A\u898F\u3002\u5982\u6709\u591A\u500B\u5C3A\u898F\uFF0C\u5C31\u6703\u4F7F\u7528\u591A\u500B\u503C\u3002\u82E5\u9663\u5217\u7A7A\u767D\uFF0C\u5C31\u4E0D\u6703\u7E6A\u88FD\u4EFB\u4F55\u5C3A\u898F\u3002","\u5782\u76F4\u6372\u8EF8\u53EA\u6709\u5728\u5FC5\u8981\u6642\u624D\u53EF\u898B\u3002","\u5782\u76F4\u6372\u8EF8\u6C38\u9060\u53EF\u898B\u3002","\u5782\u76F4\u6372\u8EF8\u6C38\u9060\u96B1\u85CF\u3002","\u63A7\u5236\u9805\u5782\u76F4\u6372\u8EF8\u7684\u53EF\u898B\u5EA6\u3002","\u6C34\u5E73\u6372\u8EF8\u53EA\u6709\u5728\u5FC5\u8981\u6642\u624D\u53EF\u898B\u3002","\u6C34\u5E73\u6372\u8EF8\u6C38\u9060\u53EF\u898B\u3002","\u6C34\u5E73\u6372\u8EF8\u6C38\u9060\u96B1\u85CF\u3002","\u63A7\u5236\u9805\u6C34\u5E73\u6372\u8EF8\u7684\u53EF\u898B\u5EA6\u3002","\u5782\u76F4\u6372\u8EF8\u7684\u5BEC\u5EA6\u3002","\u6C34\u5E73\u6372\u8EF8\u7684\u9AD8\u5EA6\u3002","\u63A7\u5236\u9805\u6309\u4E00\u4E0B\u662F\u5426\u6309\u9801\u9762\u6EFE\u52D5\u6216\u8DF3\u5230\u6309\u4E00\u4E0B\u4F4D\u7F6E\u3002","\u8A2D\u5B9A\u6642\uFF0C\u6C34\u5E73\u6372\u8EF8\u4E0D\u6703\u589E\u52A0\u7DE8\u8F2F\u5668\u5167\u5BB9\u7684\u5927\u5C0F\u3002","\u63A7\u5236\u662F\u5426\u9192\u76EE\u63D0\u793A\u6240\u6709\u975E\u57FA\u672C\u7684 ASCII \u5B57\u5143\u3002\u53EA\u6709\u4ECB\u65BC U+0020\u548C U+007E\u3001tab\u3001\u63DB\u884C\u548C\u6B78\u4F4D\u5B57\u5143\u4E4B\u9593\u7684\u5B57\u5143\u6703\u8996\u70BA\u57FA\u672C ASCII\u3002","\u63A7\u5236\u662F\u5426\u53EA\u4FDD\u7559\u7A7A\u683C\u6216\u5B8C\u5168\u6C92\u6709\u5BEC\u5EA6\u4E4B\u5B57\u5143\u7684\u9192\u76EE\u63D0\u793A\u3002","\u63A7\u5236\u662F\u5426\u9192\u76EE\u63D0\u793A\u8207\u57FA\u672C ASCII \u5B57\u5143\u6DF7\u6DC6\u7684\u5B57\u5143\uFF0C\u4F46\u76EE\u524D\u4F7F\u7528\u8005\u5730\u5340\u8A2D\u5B9A\u4E2D\u901A\u7528\u7684\u5B57\u5143\u9664\u5916\u3002","\u63A7\u5236\u8A3B\u89E3\u4E2D\u7684\u5B57\u5143\u662F\u5426\u4E5F\u61C9\u53D7\u5230 Unicode \u9192\u76EE\u63D0\u793A\u3002","\u63A7\u5236\u5B57\u4E32\u4E2D\u7684\u5B57\u5143\u662F\u5426\u4E5F\u61C9\u53D7\u5230 Unicode \u9192\u76EE\u63D0\u793A\u3002","\u5B9A\u7FA9\u672A\u9192\u76EE\u63D0\u793A\u7684\u5141\u8A31\u5B57\u5143\u3002","\u4E0D\u6703\u5C07\u5141\u8A31\u5730\u5340\u8A2D\u7F6E\u4E2D\u5E38\u898B\u7684 Unicode \u5B57\u5143\u5F37\u8ABF\u986F\u793A\u3002","\u63A7\u5236\u662F\u5426\u8981\u5728\u7DE8\u8F2F\u5668\u4E2D\u81EA\u52D5\u986F\u793A\u5167\u5D4C\u5EFA\u8B70\u3002","\u6BCF\u7576\u986F\u793A\u5167\u5D4C\u5EFA\u8B70\u6642\uFF0C\u986F\u793A\u5167\u5D4C\u5EFA\u8B70\u5DE5\u5177\u5217\u3002","\u6BCF\u7576\u6E38\u6A19\u505C\u7559\u5728\u5167\u5D4C\u5EFA\u8B70\u4E0A\u65B9\u6642\uFF0C\u986F\u793A\u5167\u5D4C\u5EFA\u8B70\u5DE5\u5177\u5217\u3002","\u6C38\u4E0D\u986F\u793A\u5167\u5D4C\u5EFA\u8B70\u5DE5\u5177\u5217\u3002","\u63A7\u5236\u4F55\u6642\u986F\u793A\u5167\u5D4C\u5EFA\u8B70\u5DE5\u5177\u5217\u3002","\u63A7\u5236\u5167\u5D4C\u5EFA\u8B70\u5982\u4F55\u8207\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E92\u52D5\u3002\u5982\u679C\u555F\u7528\uFF0C\u6709\u53EF\u7528\u7684\u5167\u5D4C\u5EFA\u8B70\u6642\uFF0C\u4E0D\u6703\u81EA\u52D5\u986F\u793A\u5EFA\u8B70\u5C0F\u5DE5\u5177\u3002","\u63A7\u5236\u5167\u5D4C\u5EFA\u8B70\u7684\u5B57\u9AD4\u7CFB\u5217\u3002","\u63A7\u5236\u662F\u5426\u555F\u7528\u6210\u5C0D\u65B9\u62EC\u5F27\u8457\u8272\u3002\u4F7F\u7528 {0} \u8986\u5BEB\u62EC\u5F27\u4EAE\u986F\u984F\u8272\u3002","\u63A7\u5236\u6BCF\u500B\u62EC\u5F27\u985E\u578B\u662F\u5426\u6709\u81EA\u5DF1\u7684\u7368\u7ACB\u8272\u5F69\u96C6\u5340\u3002","\u555F\u7528\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u53EA\u555F\u7528\u4F7F\u7528\u4E2D\u62EC\u5F27\u7D44\u7684\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u505C\u7528\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u63A7\u5236\u662F\u5426\u555F\u7528\u6210\u5C0D\u65B9\u62EC\u5F27\u6307\u5357\u3002","\u555F\u7528\u6C34\u5E73\u8F14\u52A9\u7DDA\u4F5C\u70BA\u5782\u76F4\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u7684\u65B0\u589E\u529F\u80FD\u3002","\u53EA\u555F\u7528\u4F7F\u7528\u4E2D\u62EC\u5F27\u914D\u5C0D\u7684\u6C34\u5E73\u8F14\u52A9\u7DDA\u3002","\u505C\u7528\u6C34\u5E73\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u63A7\u5236\u662F\u5426\u555F\u7528\u6C34\u5E73\u6210\u5C0D\u65B9\u62EC\u5F27\u8F14\u52A9\u7DDA\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u9192\u76EE\u63D0\u793A\u4F7F\u7528\u4E2D\u7684\u6210\u5C0D\u62EC\u5F27\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u986F\u793A\u7E2E\u6392\u8F14\u52A9\u7DDA\u3002","\u9192\u76EE\u63D0\u793A\u4F7F\u7528\u4E2D\u7684\u7E2E\u6392\u8F14\u52A9\u7DDA\u3002","\u5373\u4F7F\u9192\u76EE\u63D0\u793A\u62EC\u5F27\u8F14\u52A9\u7DDA\uFF0C\u4ECD\u9192\u76EE\u63D0\u793A\u4F7F\u7528\u4E2D\u7684\u7E2E\u6392\u8F14\u52A9\u7DDA\u3002","\u4E0D\u8981\u9192\u76EE\u63D0\u793A\u4F7F\u7528\u4E2D\u7684\u7E2E\u6392\u8F14\u52A9\u7DDA\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u9192\u76EE\u63D0\u793A\u4F7F\u7528\u4E2D\u7684\u7E2E\u6392\u8F14\u52A9\u7DDA\u3002","\u63D2\u5165\u5EFA\u8B70\u800C\u4E0D\u8986\u5BEB\u6E38\u6A19\u65C1\u7684\u6587\u5B57\u3002","\u63D2\u5165\u5EFA\u8B70\u4E26\u8986\u5BEB\u6E38\u6A19\u65C1\u7684\u6587\u5B57\u3002","\u63A7\u5236\u662F\u5426\u8981\u5728\u63A5\u53D7\u5B8C\u6210\u6642\u8986\u5BEB\u5B57\u7D44\u3002\u8ACB\u6CE8\u610F\uFF0C\u9019\u53D6\u6C7A\u65BC\u52A0\u5165\u6B64\u529F\u80FD\u7684\u5EF6\u4F38\u6A21\u7D44\u3002","\u63A7\u5236\u5C0D\u65BC\u62DA\u932F\u5B57\u662F\u5426\u9032\u884C\u7BE9\u9078\u548C\u6392\u5E8F\u5176\u5EFA\u8B70","\u63A7\u5236\u6392\u5E8F\u662F\u5426\u504F\u597D\u6E38\u6A19\u9644\u8FD1\u7684\u5B57\u7D44\u3002","\u63A7\u5236\u8A18\u9304\u7684\u5EFA\u8B70\u9078\u53D6\u9805\u76EE\u662F\u5426\u5728\u591A\u500B\u5DE5\u4F5C\u5340\u548C\u8996\u7A97\u9593\u5171\u7528 (\u9700\u8981 `#editor.suggestSelection#`)\u3002","\u81EA\u52D5\u89F8\u767C IntelliSense \u6642\u4E00\u5F8B\u9078\u53D6\u5EFA\u8B70\u3002","\u81EA\u52D5\u89F8\u767C IntelliSense \u6642\u6C38\u4E0D\u9078\u53D6\u5EFA\u8B70\u3002","\u53EA\u6709\u5728\u5F9E\u89F8\u767C\u5B57\u5143\u89F8\u767C IntelliSense \u6642\uFF0C\u624D\u9078\u53D6\u5EFA\u8B70\u3002","\u53EA\u6709\u5728\u60A8\u8F38\u5165\u6642\u89F8\u767C IntelliSense \u6642\uFF0C\u624D\u9078\u53D6\u5EFA\u8B70\u3002","\u63A7\u5236\u5C0F\u5DE5\u5177\u986F\u793A\u6642\u662F\u5426\u9078\u53D6\u5EFA\u8B70\u3002\u8ACB\u6CE8\u610F\uFF0C\u9019\u53EA\u9069\u7528\u65BC('#editor.quickSuggestions#' \u548C '#editor.suggestOnTriggerCharacters#') \u81EA\u52D5\u89F8\u767C\u7684\u5EFA\u8B70\uFF0C\u800C\u4E14\u4E00\u5F8B\u6703\u5728\u660E\u78BA\u53EB\u7528\u6642\u9078\u53D6\u5EFA\u8B70\uFF0C\u4F8B\u5982\u900F\u904E 'Ctrl+Space'\u3002","\u63A7\u5236\u6B63\u5728\u4F7F\u7528\u7684\u7A0B\u5F0F\u78BC\u7247\u6BB5\u662F\u5426\u6703\u907F\u514D\u5FEB\u901F\u5EFA\u8B70\u3002","\u63A7\u5236\u8981\u5728\u5EFA\u8B70\u4E2D\u986F\u793A\u6216\u96B1\u85CF\u5716\u793A\u3002","\u63A7\u5236\u5EFA\u8B70\u5C0F\u5DE5\u5177\u5E95\u4E0B\u7684\u72C0\u614B\u5217\u53EF\u898B\u5EA6\u3002","\u63A7\u5236\u662F\u5426\u8981\u5728\u7DE8\u8F2F\u5668\u4E2D\u9810\u89BD\u5EFA\u8B70\u7D50\u679C\u3002","\u63A7\u5236\u5EFA\u8B70\u8A73\u7D30\u8CC7\u6599\u662F\u4EE5\u5167\u5D4C\u65BC\u6A19\u7C64\u7684\u65B9\u5F0F\u986F\u793A\uFF0C\u9084\u662F\u53EA\u5728\u8A73\u7D30\u8CC7\u6599\u5C0F\u5DE5\u5177\u4E2D\u986F\u793A\u3002","\u6B64\u8A2D\u5B9A\u5DF2\u6DD8\u6C70\u3002\u5EFA\u8B70\u5C0F\u5DE5\u5177\u73FE\u53EF\u8ABF\u6574\u5927\u5C0F\u3002","\u6B64\u8A2D\u5B9A\u5DF2\u6DD8\u6C70\uFF0C\u8ACB\u6539\u7528 'editor.suggest.showKeywords' \u6216 'editor.suggest.showSnippets' \u7B49\u55AE\u7368\u8A2D\u5B9A\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u65B9\u6CD5\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u51FD\u5F0F\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u5EFA\u69CB\u51FD\u5F0F\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u5DF2\u53D6\u4EE3\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u7BE9\u9078\u6703\u8981\u6C42\u7B2C\u4E00\u500B\u5B57\u5143\u7B26\u5408\u6587\u5B57\u958B\u982D\uFF0C\u4F8B\u5982 `Console` \u6216 `WebCoNtext` \u4E0A\u7684 `c`\uFF0C\u4F46\u4E0D\u662F `description` \u4E0A\u7684 _not_\u3002\u505C\u7528\u6642\uFF0CIntelliSense \u6703\u986F\u793A\u66F4\u591A\u7D50\u679C\uFF0C\u4F46\u4ECD\u6703\u4F9D\u76F8\u7B26\u54C1\u8CEA\u6392\u5E8F\u7D50\u679C\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u6B04\u4F4D\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u8B8A\u6578\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u985E\u5225\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u7D50\u69CB\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u4ECB\u9762\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u6A21\u7D44\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u5C6C\u6027\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u4E8B\u4EF6\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u904B\u7B97\u5B50\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u55AE\u4F4D\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u503C\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u5E38\u6578\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u5217\u8209\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300CenumMember\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u95DC\u9375\u5B57\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u6587\u5B57\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u8272\u5F69\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u6A94\u6848\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u53C3\u8003\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300Ccustomcolor\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u8CC7\u6599\u593E\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300CtypeParameter\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u7A0B\u5F0F\u78BC\u7247\u6BB5\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u4E4B\u5F8C\uFF0CIntelliSense \u6703\u986F\u793A `user`-suggestions\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u6703\u986F\u793A `issues`-suggestions\u3002","\u662F\u5426\u61C9\u4E00\u5F8B\u9078\u53D6\u524D\u7F6E\u548C\u5F8C\u7F6E\u7684\u7A7A\u767D\u5B57\u5143\u3002","\u662F\u5426\u61C9\u8A72\u9078\u53D6\u5B50\u8A5E (\u4F8B\u5982 'fooBar' \u6216 'foo_bar' \u4E2D\u7684 'foo')\u3002","\u7121\u7E2E\u6392\u3002\u63DB\u884C\u5F9E\u7B2C 1 \u5217\u958B\u59CB\u3002","\u63DB\u884C\u7684\u7E2E\u6392\u6703\u8207\u7236\u884C\u76F8\u540C\u3002","\u63DB\u884C\u7684\u7E2E\u6392\u70BA\u7236\u884C +1\u3002","\u63DB\u884C\u7E2E\u6392\u70BA\u7236\u884C +2\u3002","\u63A7\u5236\u63DB\u884C\u7684\u7E2E\u6392\u3002","\u63A7\u5236\u60A8\u662F\u5426\u53EF\u4EE5\u6309\u4F4F `Shift` \u9375\uFF0C\u5C07\u6A94\u6848\u62D6\u653E\u5230\u6587\u5B57\u7DE8\u8F2F\u5668\u4E2D (\u800C\u975E\u5728\u7DE8\u8F2F\u5668\u4E2D\u958B\u555F\u6A94\u6848)\u3002","\u63A7\u5236\u5C07\u6A94\u6848\u653E\u5165\u7DE8\u8F2F\u5668\u6642\u662F\u5426\u986F\u793A\u5C0F\u5DE5\u5177\u3002\u6B64\u5C0F\u5DE5\u5177\u53EF\u8B93\u60A8\u63A7\u5236\u6A94\u6848\u7684\u7F6E\u653E\u65B9\u5F0F\u3002","\u5C07\u6A94\u6848\u653E\u5165\u7DE8\u8F2F\u5668\u5F8C\u986F\u793A\u7F6E\u653E\u9078\u53D6\u5668\u5C0F\u5DE5\u5177\u3002","\u6C38\u4E0D\u986F\u793A\u7F6E\u653E\u9078\u53D6\u5668\u5C0F\u5DE5\u5177\u3002\u6539\u70BA\u4E00\u5F8B\u4F7F\u7528\u9810\u8A2D\u7F6E\u653E\u63D0\u4F9B\u8005\u3002","\u63A7\u5236\u662F\u5426\u53EF\u4EE5\u4EE5\u4E0D\u540C\u65B9\u5F0F\u8CBC\u4E0A\u5167\u5BB9\u3002","\u63A7\u5236\u5C07\u5167\u5BB9\u8CBC\u4E0A\u81F3\u7DE8\u8F2F\u5668\u6642\u662F\u5426\u986F\u793A\u5C0F\u5DE5\u5177\u3002\u6B64\u5C0F\u5DE5\u5177\u53EF\u8B93\u60A8\u63A7\u5236\u6A94\u6848\u7684\u8CBC\u4E0A\u65B9\u5F0F\u3002","\u5C07\u5167\u5BB9\u8CBC\u4E0A\u7DE8\u8F2F\u5668\u5F8C\u986F\u793A\u8CBC\u4E0A\u9078\u53D6\u5668\u5C0F\u5DE5\u5177\u3002","\u6C38\u4E0D\u986F\u793A\u8CBC\u4E0A\u9078\u53D6\u5668\u5C0F\u5DE5\u5177\u3002\u800C\u662F\u4E00\u5F8B\u4F7F\u7528\u9810\u8A2D\u7684\u8CBC\u4E0A\u884C\u70BA\u3002","\u63A7\u5236\u662F\u5426\u900F\u904E\u63D0\u4EA4\u5B57\u5143\u63A5\u53D7\u5EFA\u8B70\u3002\u4F8B\u5982\u5728 JavaScript \u4E2D\uFF0C\u5206\u865F (';') \u53EF\u4EE5\u662F\u63A5\u53D7\u5EFA\u8B70\u4E26\u9375\u5165\u8A72\u5B57\u5143\u7684\u63D0\u4EA4\u5B57\u5143\u3002","\u5728\u5EFA\u8B70\u9032\u884C\u6587\u5B57\u8B8A\u66F4\u6642\uFF0C\u50C5\u900F\u904E `Enter` \u63A5\u53D7\u5EFA\u8B70\u3002","\u63A7\u5236\u9664\u4E86 'Tab' \u5916\uFF0C\u662F\u5426\u4E5F\u900F\u904E 'Enter' \u63A5\u53D7\u5EFA\u8B70\u3002\u9019\u6709\u52A9\u65BC\u907F\u514D\u6DF7\u6DC6\u8981\u63D2\u5165\u65B0\u884C\u6216\u63A5\u53D7\u5EFA\u8B70\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E2D\u53EF\u4E00\u6B21\u7531\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u8B80\u51FA\u7684\u884C\u6578\u3002\u5075\u6E2C\u5230\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u6642\u6703\u81EA\u52D5\u9810\u8A2D\u70BA 500\u3002\u8B66\u544A: \u82E5\u6578\u5B57\u8D85\u904E\u9810\u8A2D\uFF0C\u53EF\u80FD\u6703\u5C0D\u6548\u80FD\u6709\u6240\u5F71\u97FF\u3002","\u7DE8\u8F2F\u5668\u5167\u5BB9","\u63A7\u5236\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u662F\u5426\u5BA3\u544A\u5167\u5D4C\u5EFA\u8B70\u3002","\u4F7F\u7528\u8A9E\u8A00\u914D\u7F6E\u78BA\u5B9A\u4F55\u6642\u81EA\u52D5\u95DC\u9589\u62EC\u865F\u3002","\u50C5\u7576\u6E38\u6A19\u4F4D\u65BC\u7A7A\u767D\u7684\u5DE6\u5074\u6642\u81EA\u52D5\u95DC\u9589\u62EC\u865F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u4F7F\u7528\u8005\u65B0\u589E\u5DE6\u62EC\u5F27\u5F8C\uFF0C\u81EA\u52D5\u52A0\u4E0A\u53F3\u62EC\u5F27\u3002","\u4F7F\u7528\u8A9E\u8A00\u914D\u7F6E\u78BA\u5B9A\u4F55\u6642\u81EA\u52D5\u95DC\u9589\u8A3B\u89E3\u3002","\u50C5\u7576\u6E38\u6A19\u4F4D\u65BC\u7A7A\u767D\u7684\u5DE6\u5074\u6642\u81EA\u52D5\u95DC\u9589\u8A3B\u89E3\u3002","\u63A7\u5236\u4F7F\u7528\u8005\u65B0\u589E\u958B\u555F\u7684\u8A3B\u89E3\u4E4B\u5F8C\uFF0C\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u8A72\u81EA\u52D5\u95DC\u9589\u8A3B\u89E3\u3002","\u50C5\u5728\u81EA\u52D5\u63D2\u5165\u76F8\u9130\u7684\u53F3\u5F15\u865F\u6216\u62EC\u5F27\u6642\uFF0C\u624D\u5C07\u5176\u79FB\u9664\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u522A\u9664\u6642\u79FB\u9664\u76F8\u9130\u7684\u53F3\u5F15\u865F\u6216\u62EC\u5F27\u3002","\u50C5\u5728\u81EA\u52D5\u63D2\u5165\u53F3\u5F15\u865F\u6216\u62EC\u865F\u6642\uFF0C\u624D\u5728\u5176\u4E0A\u65B9\u9375\u5165\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u53F3\u5F15\u865F\u6216\u62EC\u865F\u4E0A\u9375\u5165\u3002","\u4F7F\u7528\u8A9E\u8A00\u914D\u7F6E\u78BA\u5B9A\u4F55\u6642\u81EA\u52D5\u95DC\u9589\u5F15\u865F\u3002","\u50C5\u7576\u6E38\u6A19\u4F4D\u65BC\u7A7A\u767D\u7684\u5DE6\u5074\u6642\u81EA\u52D5\u95DC\u9589\u5F15\u865F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u4F7F\u7528\u8005\u65B0\u589E\u958B\u59CB\u5F15\u865F\u5F8C\uFF0C\u81EA\u52D5\u52A0\u4E0A\u95DC\u9589\u5F15\u865F\u3002","\u7DE8\u8F2F\u5668\u4E0D\u6703\u81EA\u52D5\u63D2\u5165\u7E2E\u6392\u3002","\u7DE8\u8F2F\u5668\u6703\u4FDD\u7559\u76EE\u524D\u884C\u7684\u7E2E\u6392\u3002","\u7DE8\u8F2F\u5668\u6703\u4FDD\u7559\u76EE\u524D\u884C\u7684\u7E2E\u6392\u4E26\u63A5\u53D7\u8A9E\u8A00\u5B9A\u7FA9\u7684\u62EC\u865F\u3002","\u7DE8\u8F2F\u5668\u6703\u76EE\u524D\u884C\u7684\u7E2E\u6392\u3001\u63A5\u53D7\u8A9E\u8A00\u5B9A\u7FA9\u7684\u62EC\u865F\u4E26\u53EB\u7528\u8A9E\u8A00\u5B9A\u7FA9\u7684\u7279\u6B8A onEnterRules\u3002","\u7DE8\u8F2F\u5668\u6703\u4FDD\u7559\u76EE\u524D\u884C\u7684\u7E2E\u6392\u3001\u63A5\u53D7\u8A9E\u8A00\u5B9A\u7FA9\u7684\u62EC\u865F\u4E26\u53EB\u7528\u8A9E\u8A00\u5B9A\u7FA9\u7684\u7279\u6B8A onEnterRules \u4E26\u63A5\u53D7\u8A9E\u8A00\u5B9A\u7FA9\u7684 indentationRules\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u4F7F\u7528\u8005\u9375\u5165\u3001\u8CBC\u4E0A\u3001\u79FB\u52D5\u6216\u7E2E\u6392\u884C\u6642\u81EA\u52D5\u8ABF\u6574\u7E2E\u6392\u3002","\u4F7F\u7528\u8A9E\u8A00\u7D44\u614B\u4F86\u6C7A\u5B9A\u4F55\u6642\u81EA\u52D5\u74B0\u7E5E\u9078\u53D6\u9805\u76EE\u3002","\u7528\u5F15\u865F\u62EC\u4F4F\uFF0C\u800C\u975E\u4F7F\u7528\u62EC\u5F27\u3002","\u7528\u62EC\u5F27\u62EC\u4F4F\uFF0C\u800C\u975E\u4F7F\u7528\u5F15\u865F\u3002 ","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u9375\u5165\u5F15\u865F\u6216\u62EC\u5F27\u6642\u81EA\u52D5\u5305\u570D\u9078\u53D6\u7BC4\u570D\u3002","\u7576\u4F7F\u7528\u7A7A\u683C\u9032\u884C\u7E2E\u6392\u6642\uFF0C\u6703\u6A21\u64EC\u5B9A\u4F4D\u5B57\u5143\u7684\u9078\u53D6\u8868\u73FE\u65B9\u5F0F\u3002\u9078\u53D6\u7BC4\u570D\u6703\u4F9D\u5FAA\u5B9A\u4F4D\u505C\u99D0\u9EDE\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u986F\u793A codelens\u3002","\u63A7\u5236 CodeLens \u7684\u5B57\u578B\u5BB6\u65CF\u3002","\u63A7\u5236 CodeLens \u7684\u5B57\u578B\u5927\u5C0F (\u50CF\u7D20)\u3002\u8A2D\u5B9A\u70BA 0 \u6642\uFF0C\u6703\u4F7F\u7528 90% \u7684 `#editor.fontSize#`\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u8F49\u8B6F\u5167\u5D4C\u8272\u5F69\u88DD\u98FE\u9805\u76EE\u8207\u8272\u5F69\u9078\u64C7\u5668\u3002","\u8B93\u8272\u5F69\u9078\u64C7\u5668\u5728\u6309\u4E00\u4E0B\u548C\u505C\u99D0\u8272\u5F69\u5728\u88DD\u98FE\u9805\u76EE\u4E0A\u6642\u51FA\u73FE","\u8B93\u8272\u5F69\u9078\u64C7\u5668\u5728\u505C\u99D0\u8272\u5F69\u88DD\u98FE\u9805\u76EE\u6642\u51FA\u73FE","\u8B93\u8272\u5F69\u9078\u64C7\u5668\u5728\u6309\u4E00\u4E0B\u8272\u5F69\u88DD\u98FE\u9805\u76EE\u6642\u51FA\u73FE","\u63A7\u5236\u689D\u4EF6\uFF0C\u8B93\u8272\u5F69\u9078\u64C7\u5668\u5F9E\u8272\u5F69\u88DD\u98FE\u9805\u76EE\u51FA\u73FE","\u63A7\u5236\u4E00\u6B21\u53EF\u5728\u7DE8\u8F2F\u5668\u4E2D\u5448\u73FE\u7684\u8272\u5F69\u88DD\u98FE\u9805\u76EE\u6700\u5927\u6578\u76EE\u3002","\u555F\u7528\u5373\u53EF\u4EE5\u6ED1\u9F20\u8207\u6309\u9375\u9078\u53D6\u9032\u884C\u8CC7\u6599\u884C\u9078\u53D6\u3002","\u63A7\u5236\u8A9E\u6CD5\u9192\u76EE\u63D0\u793A\u662F\u5426\u61C9\u8907\u88FD\u5230\u526A\u8CBC\u7C3F\u3002","\u63A7\u5236\u8CC7\u6599\u6307\u6A19\u52D5\u756B\u6A23\u5F0F\u3002","\u5E73\u6ED1\u63D2\u5165\u865F\u52D5\u756B\u5DF2\u505C\u7528\u3002","\u53EA\u6709\u7576\u4F7F\u7528\u8005\u4F7F\u7528\u660E\u78BA\u624B\u52E2\u79FB\u52D5\u6E38\u6A19\u6642\uFF0C\u624D\u6703\u555F\u7528\u5E73\u6ED1\u63D2\u5165\u865F\u52D5\u756B\u3002","\u6C38\u9060\u555F\u7528\u5E73\u6ED1\u63D2\u5165\u865F\u52D5\u756B\u3002","\u63A7\u5236\u662F\u5426\u61C9\u555F\u7528\u5E73\u6ED1\u63D2\u5165\u9EDE\u52D5\u756B\u3002 ","\u63A7\u5236\u8CC7\u6599\u6307\u6A19\u6A23\u5F0F\u3002","\u63A7\u5236\u6E38\u6A19\u4E0A\u4E0B\u5468\u570D\u53EF\u986F\u793A\u7684\u524D\u7F6E\u7DDA (\u6700\u5C0F\u70BA 0) \u548C\u5F8C\u7F6E\u7DDA (\u6700\u5C0F\u70BA 1) \u7684\u6700\u5C0F\u6578\u76EE\u3002\u5728\u67D0\u4E9B\u7DE8\u8F2F\u5668\u4E2D\u7A31\u70BA 'scrollOff' \u6216 'scrollOffset'\u3002","\u53EA\u6709\u901A\u904E\u9375\u76E4\u6216 API \u89F8\u767C\u6642\uFF0C\u624D\u6703\u65BD\u884C `cursorSurroundingLines`\u3002","\u4E00\u5F8B\u5F37\u5236\u57F7\u884C `cursorSurroundingLines`","\u63A7\u5236\u61C9\u5F37\u5236\u57F7\u884C `#cursorSurroundingLines#` \u7684\u6642\u6A5F\u3002","\u63A7\u5236\u6E38\u6A19\u5BEC\u5EA6\uFF0C\u7576 `#editor.cursorStyle#` \u8A2D\u5B9A\u70BA `line` \u6642\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u5141\u8A31\u900F\u904E\u62D6\u653E\u4F86\u79FB\u52D5\u9078\u53D6\u9805\u76EE\u3002","\u4F7F\u7528\u65B0\u7684 svg \u8F49\u8B6F\u65B9\u6CD5\u3002","\u4F7F\u7528\u5177\u6709\u5B57\u578B\u5B57\u5143\u7684\u65B0\u8F49\u8B6F\u65B9\u6CD5\u3002","\u4F7F\u7528\u7A69\u5B9A\u8F49\u8B6F\u65B9\u6CD5\u3002","\u63A7\u5236\u662F\u5426\u4F7F\u7528\u65B0\u7684\u5BE6\u9A57\u6027\u65B9\u6CD5\u4F86\u5448\u73FE\u7A7A\u767D\u5B57\u5143\u3002","\u6309\u4E0B `Alt` \u6642\u7684\u6372\u52D5\u901F\u5EA6\u4E58\u6578\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u555F\u7528\u7A0B\u5F0F\u78BC\u647A\u758A\u529F\u80FD\u3002","\u4F7F\u7528\u8A9E\u8A00\u7279\u5B9A\u647A\u758A\u7B56\u7565 (\u5982\u679C\u53EF\u7528)\uFF0C\u5426\u5247\u4F7F\u7528\u7E2E\u6392\u5F0F\u7B56\u7565\u3002","\u4F7F\u7528\u7E2E\u6392\u5F0F\u647A\u758A\u7B56\u7565\u3002","\u63A7\u5236\u8A08\u7B97\u8CC7\u6599\u593E\u7BC4\u570D\u7684\u7B56\u7565\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5C07\u6298\u758A\u7684\u7BC4\u570D\u9192\u76EE\u63D0\u793A\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u6703\u81EA\u52D5\u647A\u758A\u532F\u5165\u7BC4\u570D\u3002","\u53EF\u647A\u758A\u5340\u57DF\u7684\u6578\u76EE\u4E0A\u9650\u3002\u589E\u52A0\u6B64\u503C\u53EF\u80FD\u6703\u9020\u6210\u7576\u76EE\u524D\u7684\u4F86\u6E90\u6709\u5927\u91CF\u53EF\u647A\u758A\u5340\u57DF\u6642\uFF0C\u7DE8\u8F2F\u5668\u7684\u56DE\u61C9\u901F\u5EA6\u8B8A\u6162\u3002","\u63A7\u5236\u6309\u4E00\u4E0B\u5DF2\u6298\u758A\u884C\u5F8C\u65B9\u7684\u7A7A\u767D\u5167\u5BB9\u662F\u5426\u6703\u5C55\u958B\u884C\u3002","\u63A7\u5236\u5B57\u578B\u5BB6\u65CF\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u81EA\u52D5\u70BA\u8CBC\u4E0A\u7684\u5167\u5BB9\u8A2D\u5B9A\u683C\u5F0F\u3002\u5FC5\u9808\u6709\u53EF\u7528\u7684\u683C\u5F0F\u5668\uFF0C\u800C\u4E14\u683C\u5F0F\u5668\u61C9\u80FD\u5920\u70BA\u6587\u4EF6\u4E2D\u7684\u4E00\u500B\u7BC4\u570D\u8A2D\u5B9A\u683C\u5F0F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u81EA\u52D5\u5728\u9375\u5165\u5F8C\u8A2D\u5B9A\u884C\u7684\u683C\u5F0F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u8F49\u8B6F\u5782\u76F4\u5B57\u7B26\u908A\u754C\u3002\u5B57\u7B26\u908A\u754C\u6700\u5E38\u7528\u4F86\u9032\u884C\u5075\u932F\u3002","\u63A7\u5236\u6E38\u6A19\u662F\u5426\u61C9\u96B1\u85CF\u5728\u6982\u89C0\u5C3A\u898F\u4E2D\u3002","\u63A7\u5236\u5B57\u6BCD\u9593\u8DDD (\u50CF\u7D20)\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u5DF2\u555F\u7528\u9023\u7D50\u7DE8\u8F2F\u3002\u76F8\u95DC\u7B26\u865F (\u4F8B\u5982 HTML \u6A19\u7C64) \u6703\u6839\u64DA\u8A9E\u8A00\u5728\u7DE8\u8F2F\u6642\u66F4\u65B0\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5075\u6E2C\u9023\u7D50\u4E26\u4F7F\u5176\u53EF\u4F9B\u9EDE\u9078\u3002","\u5C07\u7B26\u5408\u7684\u62EC\u865F\u9192\u76EE\u63D0\u793A\u3002","\u8981\u7528\u65BC\u6ED1\u9F20\u6EFE\u8F2A\u6372\u52D5\u4E8B\u4EF6 `deltaX` \u548C `deltaY` \u7684\u4E58\u6578\u3002","\u4F7F\u7528\u6ED1\u9F20\u6EFE\u8F2A\u4E26\u6309\u4F4F `Cmd` \u6642\uFF0C\u7E2E\u653E\u7DE8\u8F2F\u5668\u7684\u5B57\u578B","\u4F7F\u7528\u6ED1\u9F20\u6EFE\u8F2A\u4E26\u6309\u4F4F `Ctrl` \u6642\uFF0C\u7E2E\u653E\u7DE8\u8F2F\u5668\u7684\u5B57\u578B","\u5728\u591A\u500B\u6E38\u6A19\u91CD\u758A\u6642\u5C07\u5176\u5408\u4F75\u3002","\u5C0D\u61C9Windows\u548CLinux\u7684'Control'\u8207\u5C0D\u61C9 macOS \u7684'Command'\u3002","\u5C0D\u61C9Windows\u548CLinux\u7684'Alt'\u8207\u5C0D\u61C9macOS\u7684'Option'\u3002","\u7528\u65BC\u5728\u6ED1\u9F20\u65B0\u589E\u591A\u500B\u6E38\u6A19\u7684\u4FEE\u98FE\u5143\u3002[\u79FB\u81F3\u5B9A\u7FA9] \u548C [\u958B\u555F\u9023\u7D50] \u6ED1\u9F20\u624B\u52E2\u6703\u52A0\u4EE5\u9069\u61C9\uFF0C\u4EE5\u907F\u514D\u8207 [\u591A\u500B\u6E38\u6A19\u7684\u4FEE\u98FE\u5143](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier) \u76F8\u885D\u7A81\u3002","\u6BCF\u500B\u6E38\u6A19\u90FD\u6703\u8CBC\u4E0A\u4E00\u884C\u6587\u5B57\u3002","\u6BCF\u500B\u6E38\u6A19\u90FD\u6703\u8CBC\u4E0A\u5168\u6587\u3002","\u7576\u5DF2\u8CBC\u4E0A\u6587\u5B57\u7684\u884C\u6578\u8207\u6E38\u6A19\u6578\u76F8\u7B26\u6642\u63A7\u5236\u8CBC\u4E0A\u529F\u80FD\u3002","\u63A7\u5236\u4E00\u6B21\u53EF\u5728\u4F5C\u7528\u4E2D\u7DE8\u8F2F\u5668\u4E2D\u7684\u6E38\u6A19\u6578\u76EE\u4E0A\u9650\u3002","\u4E0D\u5F37\u8ABF\u986F\u793A\u51FA\u73FE\u9805\u76EE\u3002","\u50C5\u5F37\u8ABF\u986F\u793A\u76EE\u524D\u6A94\u6848\u4E2D\u7684\u51FA\u73FE\u9805\u76EE\u3002","\u5BE6\u9A57: \u8DE8\u6240\u6709\u6709\u6548\u7684\u958B\u555F\u6A94\u6848\u5F37\u8ABF\u986F\u793A\u51FA\u73FE\u9805\u76EE\u3002","\u63A7\u5236\u662F\u5426\u61C9\u8DE8\u958B\u555F\u7684\u6A94\u6848\u5F37\u8ABF\u986F\u793A\u51FA\u73FE\u9805\u76EE\u3002","\u63A7\u5236\u662F\u5426\u61C9\u5728\u6982\u89C0\u5C3A\u898F\u5468\u570D\u7E6A\u88FD\u6846\u7DDA\u3002","\u958B\u555F\u9810\u89BD\u6642\u7126\u9EDE\u6A39\u72C0","\u958B\u555F\u6642\u805A\u7126\u7DE8\u8F2F\u5668","\u63A7\u5236\u8981\u805A\u7126\u5167\u5D4C\u7DE8\u8F2F\u5668\u6216\u9810\u89BD\u5C0F\u5DE5\u5177\u4E2D\u7684\u6A39\u7CFB\u3002","\u63A7\u5236\u300C\u524D\u5F80\u5B9A\u7FA9\u300D\u6ED1\u9F20\u624B\u52E2\uFF0C\u662F\u5426\u4E00\u5F8B\u958B\u555F\u7784\u6838\u5C0F\u5DE5\u5177\u3002","\u63A7\u5236\u5728\u5FEB\u901F\u5EFA\u8B70\u986F\u793A\u5F8C\u7684\u5EF6\u9072 (\u4EE5\u6BEB\u79D2\u70BA\u55AE\u4F4D)\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u6703\u81EA\u52D5\u4F9D\u985E\u578B\u91CD\u65B0\u547D\u540D\u3002","\u5DF2\u6DD8\u6C70\uFF0C\u8ACB\u6539\u7528 `editor.linkedEditing`\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u986F\u793A\u63A7\u5236\u5B57\u5143\u3002","\u5728\u6A94\u6848\u7D50\u5C3E\u70BA\u65B0\u884C\u6642\uFF0C\u5448\u73FE\u6700\u5F8C\u4E00\u884C\u7684\u865F\u78BC\u3002","\u9192\u76EE\u63D0\u793A\u88DD\u8A02\u908A\u548C\u76EE\u524D\u7684\u884C\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u5982\u4F55\u986F\u793A\u76EE\u524D\u884C\u7684\u9192\u76EE\u63D0\u793A\u3002","\u63A7\u5236\u7576\u805A\u7126\u65BC\u7DE8\u8F2F\u5668\u6642\uFF0C\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u50C5\u8F49\u8B6F\u76EE\u524D\u884C\u7684\u9192\u76EE\u63D0\u793A\u3002","\u8F49\u8B6F\u7A7A\u767D\u5B57\u5143\uFF0C\u4F46\u6587\u5B57\u4E4B\u9593\u7684\u55AE\u4E00\u7A7A\u683C\u9664\u5916\u3002","\u53EA\u8F49\u8B6F\u6240\u9078\u6587\u5B57\u7684\u7A7A\u767D\u5B57\u5143\u3002","\u53EA\u8F49\u8B6F\u7D50\u5C3E\u7A7A\u767D\u5B57\u5143\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u61C9\u5982\u4F55\u8F49\u8B6F\u7A7A\u767D\u5B57\u5143\u3002","\u63A7\u5236\u9078\u53D6\u7BC4\u570D\u662F\u5426\u6709\u5713\u89D2","\u63A7\u5236\u7DE8\u8F2F\u5668\u6C34\u5E73\u6372\u52D5\u7684\u984D\u5916\u5B57\u5143\u6578\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u6372\u52D5\u5230\u6700\u5F8C\u4E00\u884C\u4E4B\u5916\u3002","\u540C\u6642\u9032\u884C\u5782\u76F4\u8207\u6C34\u5E73\u6372\u52D5\u6642\uFF0C\u50C5\u6CBF\u4E3B\u8EF8\u6372\u52D5\u3002\u907F\u514D\u5728\u8ECC\u8DE1\u677F\u4E0A\u9032\u884C\u5782\u76F4\u6372\u52D5\u6642\u767C\u751F\u6C34\u5E73\u6F02\u79FB\u3002","\u63A7\u5236\u662F\u5426\u652F\u63F4 Linux \u4E3B\u8981\u526A\u8CBC\u7C3F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u9192\u76EE\u63D0\u793A\u8207\u9078\u53D6\u9805\u76EE\u985E\u4F3C\u7684\u76F8\u7B26\u9805\u76EE\u3002","\u4E00\u5F8B\u986F\u793A\u647A\u758A\u63A7\u5236\u9805\u3002","\u6C38\u4E0D\u986F\u793A\u647A\u758A\u63A7\u5236\u9805\u8207\u6E1B\u5C11\u88DD\u8A02\u908A\u5927\u5C0F\u3002","\u50C5\u7576\u6ED1\u9F20\u61F8\u505C\u5728\u6D3B\u52D5\u5217\u4E0A\u6642\uFF0C\u624D\u986F\u793A\u6298\u758A\u529F\u80FD\u3002","\u63A7\u5236\u647A\u758A\u63A7\u5236\u9805\u5728\u88DD\u8A02\u908A\u4E0A\u7684\u986F\u793A\u6642\u6A5F\u3002","\u63A7\u5236\u672A\u4F7F\u7528\u7A0B\u5F0F\u78BC\u7684\u6DE1\u51FA\u3002","\u63A7\u5236\u5DF2\u522A\u9664\u7684\u6DD8\u6C70\u8B8A\u6578\u3002","\u5C07\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5EFA\u8B70\u986F\u793A\u65BC\u5176\u4ED6\u5EFA\u8B70\u7684\u9802\u7AEF\u3002","\u5C07\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5EFA\u8B70\u986F\u793A\u65BC\u5176\u4ED6\u5EFA\u8B70\u7684\u4E0B\u65B9\u3002","\u5C07\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5EFA\u8B70\u8207\u5176\u4ED6\u5EFA\u8B70\u4E00\u540C\u986F\u793A\u3002","\u4E0D\u986F\u793A\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5EFA\u8B70\u3002","\u63A7\u5236\u7A0B\u5F0F\u78BC\u7247\u6BB5\u662F\u5426\u96A8\u5176\u4ED6\u5EFA\u8B70\u986F\u793A\uFF0C\u4EE5\u53CA\u5176\u6392\u5E8F\u65B9\u5F0F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u6703\u4F7F\u7528\u52D5\u756B\u6372\u52D5","\u63A7\u5236\u7576\u986F\u793A\u5167\u5D4C\u5B8C\u6210\u6642\uFF0C\u662F\u5426\u61C9\u63D0\u4F9B\u5354\u52A9\u5DE5\u5177\u63D0\u793A\u7D66\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u4F7F\u7528\u8005\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u5B57\u578B\u5927\u5C0F\u3002\u7576\u8A2D\u5B9A\u70BA {0} \u6642\uFF0C\u5247\u6703\u4F7F\u7528 {1} \u7684\u503C\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u884C\u9AD8\u3002\u7576\u8A2D\u5B9A\u70BA {0} \u6642\uFF0C\u5247\u6703\u4F7F\u7528 {1} \u7684\u503C\u3002\u6700\u5C0F\u503C\u70BA 8\u3002","\u63A7\u5236\u5EFA\u8B70\u662F\u5426\u61C9\u5728\u9375\u5165\u89F8\u767C\u5B57\u5143\u6642\u81EA\u52D5\u986F\u793A\u3002","\u4E00\u5F8B\u9078\u53D6\u7B2C\u4E00\u500B\u5EFA\u8B70\u3002","\u9664\u975E\u9032\u4E00\u6B65\u9375\u5165\u9078\u53D6\u4E86\u5EFA\u8B70\uFF0C\u5426\u5247\u9078\u53D6\u6700\u8FD1\u7684\u5EFA\u8B70\uFF0C\u4F8B\u5982 `console.| -> console.log`\uFF0C\u539F\u56E0\u662F\u6700\u8FD1\u5B8C\u6210\u4E86 `log`\u3002","\u6839\u64DA\u5148\u524D\u5DF2\u5B8C\u6210\u8A72\u5EFA\u8B70\u7684\u524D\u7F6E\u8A5E\u9078\u53D6\u5EFA\u8B70\uFF0C\u4F8B\u5982 `co -> console` \u548C `con -> const`\u3002","\u63A7\u5236\u5728\u986F\u793A\u5EFA\u8B70\u6E05\u55AE\u6642\u5982\u4F55\u9810\u5148\u9078\u53D6\u5EFA\u8B70\u3002","\u6309 Tab \u6642\uFF0CTab \u5B8C\u6210\u6703\u63D2\u5165\u6700\u7B26\u5408\u7684\u5EFA\u8B70\u3002","\u505C\u7528 tab \u9375\u81EA\u52D5\u5B8C\u6210\u3002","\u5728\u7A0B\u5F0F\u78BC\u7247\u6BB5\u7684\u9996\u78BC\u76F8\u7B26\u6642\u4F7F\u7528 Tab \u5B8C\u6210\u3002\u672A\u555F\u7528 'quickSuggestions' \u6642\u6548\u679C\u6700\u4F73\u3002","\u555F\u7528 tab \u9375\u81EA\u52D5\u5B8C\u6210\u3002","\u81EA\u52D5\u79FB\u9664\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143\u3002","\u5FFD\u7565\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143\u3002","\u8981\u79FB\u9664\u4E4B\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143\u63D0\u793A\u3002","\u79FB\u9664\u53EF\u80FD\u5C0E\u81F4\u554F\u984C\u7684\u7570\u5E38\u884C\u7D50\u675F\u5B57\u5143\u3002","\u63D2\u5165\u548C\u522A\u9664\u63A5\u5728\u5B9A\u4F4D\u505C\u99D0\u9EDE\u5F8C\u7684\u7A7A\u767D\u5B57\u5143\u3002","\u4F7F\u7528\u9810\u8A2D\u7684\u5206\u884C\u7B26\u865F\u898F\u5247\u3002","\u4E2D\u6587/\u65E5\u6587/\u97D3\u6587 (CJK) \u6587\u5B57\u4E0D\u61C9\u8A72\u4F7F\u7528\u65B7\u5B57\u3002\u975E\u4E2D\u65E5\u97D3\u7684\u6587\u5B57\u884C\u70BA\u8207\u4E00\u822C\u6587\u5B57\u76F8\u540C\u3002","\u63A7\u5236\u7528\u65BC\u4E2D\u6587/\u65E5\u6587/\u97D3\u6587 (CJK) \u6587\u5B57\u7684\u65B7\u5B57\u898F\u5247\u3002","\u5728\u57F7\u884C\u6587\u5B57\u76F8\u95DC\u5C0E\u89BD\u6216\u4F5C\u696D\u6642\u8981\u7528\u4F5C\u6587\u5B57\u5206\u9694\u7B26\u865F\u7684\u5B57\u5143","\u4E00\u5F8B\u4E0D\u63DB\u884C\u3002","\u4F9D\u6AA2\u8996\u5340\u5BEC\u5EA6\u63DB\u884C\u3002","\u65BC '#editor.wordWrapColumn#' \u63DB\u884C\u3002","\u7576\u6AA2\u8996\u5340\u7E2E\u81F3\u6700\u5C0F\u4E26\u8A2D\u5B9A '#editor.wordWrapColumn#' \u6642\u63DB\u884C\u3002","\u63A7\u5236\u5982\u4F55\u63DB\u884C\u3002","\u7576 `#editor.wordWrap#` \u70BA `wordWrapColumn` \u6216 `bounded` \u6642\uFF0C\u63A7\u5236\u7DE8\u8F2F\u5668\u4E2D\u7684\u8CC7\u6599\u884C\u63DB\u884C\u3002","\u63A7\u5236\u662F\u5426\u61C9\u4F7F\u7528\u9810\u8A2D\u7684\u6587\u4EF6\u8272\u5F69\u63D0\u4F9B\u8005\u986F\u793A\u5167\u5D4C\u8272\u5F69\u88DD\u98FE","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u63A5\u6536\u7D22\u5F15\u6A19\u7C64\uFF0C\u6216\u5C07\u5176\u5EF6\u9072\u81F3\u5DE5\u4F5C\u53F0\u9032\u884C\u6D41\u89BD\u3002"],"vs/editor/common/core/editorColorRegistry":["\u76EE\u524D\u6E38\u6A19\u4F4D\u7F6E\u884C\u7684\u53CD\u767D\u986F\u793A\u80CC\u666F\u8272\u5F69\u3002","\u76EE\u524D\u6E38\u6A19\u4F4D\u7F6E\u884C\u4E4B\u5468\u570D\u6846\u7DDA\u7684\u80CC\u666F\u8272\u5F69\u3002","\u9192\u76EE\u63D0\u793A\u7BC4\u570D\u7684\u80CC\u666F\u8272\u5F69\uFF0C\u4F8B\u5982\u5FEB\u901F\u958B\u555F\u4E26\u5C0B\u627E\u529F\u80FD\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u53CD\u767D\u986F\u793A\u7BC4\u570D\u5468\u570D\u908A\u6846\u7684\u80CC\u666F\u984F\u8272\u3002","\u9192\u76EE\u63D0\u793A\u7B26\u865F\u7684\u80CC\u666F\u8272\u5F69\uFF0C\u76F8\u4F3C\u65BC\u524D\u5F80\u4E0B\u4E00\u500B\u5B9A\u7FA9\u6216\u524D\u5F80\u4E0B\u4E00\u500B/\u4E0A\u4E00\u500B\u7B26\u865F\u3002\u8272\u5F69\u5FC5\u9808\u900F\u660E\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u9192\u76EE\u63D0\u793A\u5468\u570D\u7684\u908A\u754C\u80CC\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u6E38\u6A19\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u6E38\u6A19\u7684\u80CC\u666F\u8272\u5F69\u3002\u5141\u8A31\u81EA\u8A02\u5340\u584A\u6E38\u6A19\u91CD\u758A\u7684\u5B57\u5143\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4E2D\u7A7A\u767D\u5B57\u5143\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u884C\u865F\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69\u3002","'editorIndentGuide.background' \u5DF2\u88AB\u53D6\u4EE3\u3002\u8ACB\u6539\u7528 'editorIndentGuide.background1'\u3002","\u4F7F\u7528\u4E2D\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69\u3002","'editorIndentGuide.activeBackground' \u5DF2\u88AB\u53D6\u4EE3\u3002\u8ACB\u6539\u7528 'editorIndentGuide.activeBackground1'\u3002","\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69 (1)\u3002","\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69 (2)\u3002","\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69 (3)\u3002","\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69 (4)\u3002","\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69 (5)\u3002","\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69 (6)\u3002","\u4F7F\u7528\u4E2D\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69 (1)\u3002","\u4F7F\u7528\u4E2D\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69 (2)\u3002","\u4F7F\u7528\u4E2D\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69 (3)\u3002","\u4F7F\u7528\u4E2D\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69 (4)\u3002","\u4F7F\u7528\u4E2D\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69 (5)\u3002","\u4F7F\u7528\u4E2D\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69 (6)\u3002","\u7DE8\u8F2F\u5668\u4F7F\u7528\u4E2D\u884C\u865F\u7684\u8272\u5F69","Id \u5DF2\u53D6\u4EE3\u3002\u8ACB\u6539\u7528 'editorLineNumber.activeForeground' \u3002","\u7DE8\u8F2F\u5668\u4F7F\u7528\u4E2D\u884C\u865F\u7684\u8272\u5F69","editor.renderFinalNewline \u8A2D\u5B9A\u70BA\u6697\u7070\u8272\u6642\uFF0C\u6700\u7D42\u7DE8\u8F2F\u5668\u7DDA\u689D\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u5C3A\u898F\u7684\u8272\u5F69","\u7DE8\u8F2F\u5668\u7A0B\u5F0F\u78BC\u6FFE\u93E1\u7684\u524D\u666F\u8272\u5F69","\u6210\u5C0D\u62EC\u865F\u80CC\u666F\u8272\u5F69","\u6210\u5C0D\u62EC\u865F\u908A\u6846\u8272\u5F69","\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u5C3A\u898F\u7684\u908A\u6846\u8272\u5F69.","\u7DE8\u8F2F\u5668\u6982\u89C0\u5C3A\u898F\u7684\u80CC\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u908A\u6846\u7684\u80CC\u666F\u984F\u8272,\u5305\u542B\u884C\u865F\u8207\u5B57\u5F62\u5716\u793A\u7684\u908A\u6846.","\u7DE8\u8F2F\u5668\u4E2D\u4E0D\u5FC5\u8981 (\u672A\u4F7F\u7528) \u539F\u59CB\u7A0B\u5F0F\u78BC\u7684\u6846\u7DDA\u8272\u5F69\u3002",`\u7DE8\u8F2F\u5668\u4E2D\u4E0D\u5FC5\u8981 (\u672A\u4F7F\u7528) \u539F\u59CB\u7A0B\u5F0F\u78BC\u7684\u4E0D\u900F\u660E\u5EA6\u3002\u4F8B\u5982 "#000000c0\u201D \u6703\u4EE5 75% \u7684\u4E0D\u900F\u660E\u5EA6\u8F49\u8B6F\u7A0B\u5F0F\u78BC\u3002\u91DD\u5C0D\u9AD8\u5C0D\u6BD4\u4E3B\u984C\uFF0C\u4F7F\u7528 'editorUnnecessaryCode.border' \u4E3B\u984C\u8272\u5F69\u53EF\u70BA\u4E0D\u5FC5\u8981\u7684\u7A0B\u5F0F\u78BC\u52A0\u4E0A\u5E95\u7DDA\uFF0C\u800C\u4E0D\u662F\u5C07\u5176\u8B8A\u6DE1\u3002`,"\u7DE8\u8F2F\u5668\u4E2D\u6D6E\u6C34\u5370\u6587\u5B57\u7684\u908A\u6846\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4E2D\u6D6E\u6C34\u5370\u6587\u5B57\u7684\u524D\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4E2D\u6D6E\u6C34\u5370\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002","\u7BC4\u570D\u9192\u76EE\u63D0\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u932F\u8AA4\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002","\u8B66\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002","\u8CC7\u8A0A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002","\u62EC\u5F27 (1) \u7684\u524D\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u6210\u5C0D\u65B9\u62EC\u5F27\u8457\u8272\u3002","\u62EC\u5F27 (2) \u7684\u524D\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u6210\u5C0D\u65B9\u62EC\u5F27\u8457\u8272\u3002","\u62EC\u5F27 (3) \u7684\u524D\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u6210\u5C0D\u65B9\u62EC\u5F27\u8457\u8272\u3002","\u62EC\u5F27 (4) \u7684\u524D\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u6210\u5C0D\u65B9\u62EC\u5F27\u8457\u8272\u3002","\u62EC\u5F27 (5) \u7684\u524D\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u6210\u5C0D\u65B9\u62EC\u5F27\u8457\u8272\u3002","\u62EC\u5F27 (6) \u7684\u524D\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u6210\u5C0D\u65B9\u62EC\u5F27\u8457\u8272\u3002","\u672A\u9810\u671F\u62EC\u5F27\u7684\u524D\u666F\u8272\u5F69\u3002","\u975E\u4F7F\u7528\u4E2D\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA (1) \u7684\u80CC\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u975E\u4F7F\u7528\u4E2D\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA (2) \u7684\u80CC\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u975E\u4F7F\u7528\u4E2D\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA (3) \u7684\u80CC\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u975E\u4F7F\u7528\u4E2D\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA (4) \u7684\u80CC\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u975E\u4F7F\u7528\u4E2D\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA (5) \u7684\u80CC\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u975E\u4F7F\u7528\u4E2D\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA (6) \u7684\u80CC\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u4F7F\u7528\u4E2D\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA (1) \u7684\u80CC\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u4F7F\u7528\u4E2D\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA (2) \u7684\u80CC\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u4F7F\u7528\u4E2D\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA (3) \u7684\u80CC\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u4F7F\u7528\u4E2D\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA (4) \u7684\u80CC\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u4F7F\u7528\u4E2D\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA (5) \u7684\u80CC\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u4F7F\u7528\u4E2D\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA (6) \u7684\u80CC\u666F\u8272\u5F69\u3002\u9700\u8981\u555F\u7528\u62EC\u5F27\u914D\u5C0D\u8F14\u52A9\u7DDA\u3002","\u7528\u4F86\u9192\u76EE\u63D0\u793A Unicode \u5B57\u5143\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7528\u4F86\u9192\u76EE\u63D0\u793A Unicode \u5B57\u5143\u7684\u80CC\u666F\u8272\u5F69\u3002"],"vs/editor/common/editorContextKeys":["\u7DE8\u8F2F\u5668\u6587\u5B57\u662F\u5426\u6709\u7126\u9EDE (\u6E38\u6A19\u9583\u720D)","\u7DE8\u8F2F\u5668\u6216\u7DE8\u8F2F\u5668\u5C0F\u5DE5\u5177\u662F\u5426\u6709\u7126\u9EDE (\u4F8B\u5982\u7126\u9EDE\u4F4D\u65BC [\u5C0B\u627E] \u5C0F\u5DE5\u5177\u4E2D)","\u7DE8\u8F2F\u5668\u6216 RTF \u8F38\u5165\u662F\u5426\u6709\u7126\u9EDE (\u6E38\u6A19\u9583\u720D)","\u7DE8\u8F2F\u5668\u662F\u5426\u70BA\u552F\u8B80","\u5167\u5BB9\u662F\u5426\u70BA Diff \u7DE8\u8F2F\u5668","\u5167\u5BB9\u662F\u5426\u70BA\u5167\u5D4C Diff \u7DE8\u8F2F\u5668","\u5167\u5BB9\u662F\u5426\u70BA Diff \u7DE8\u8F2F\u5668","\u662F\u5426\u647A\u758A\u591A\u91CD Diff \u7DE8\u8F2F\u5668\u4E2D\u7684\u6240\u6709\u6A94\u6848","Diff \u7DE8\u8F2F\u5668\u662F\u5426\u6709\u8B8A\u66F4","\u662F\u5426\u9078\u53D6\u79FB\u52D5\u7684\u7A0B\u5F0F\u78BC\u5340\u584A\u9032\u884C\u6BD4\u8F03","\u662F\u5426\u986F\u793A\u6613\u5B58\u53D6\u5DEE\u7570\u6AA2\u8996\u5668","\u662F\u5426\u5DF2\u9054\u5230\u5DEE\u7570\u7DE8\u8F2F\u5668\u4E26\u6392\u5448\u73FE\u5167\u5D4C\u4E2D\u65B7\u9EDE","'editor.columnSelection' \u662F\u5426\u5DF2\u555F\u7528","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u9078\u53D6\u6587\u5B57","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u591A\u500B\u9078\u53D6\u9805\u76EE","'Tab' \u662F\u5426\u6703\u5C07\u7126\u9EDE\u79FB\u51FA\u7DE8\u8F2F\u5668","\u7DE8\u8F2F\u5668\u66AB\u7559\u662F\u5426\u986F\u793A","\u7DE8\u8F2F\u5668\u66AB\u7559\u662F\u5426\u805A\u7126","\u81EA\u9ECF\u6372\u52D5\u662F\u5426\u805A\u7126","\u81EA\u9ECF\u6372\u52D5\u662F\u5426\u986F\u793A","\u662F\u5426\u986F\u793A\u7368\u7ACB\u7684\u984F\u8272\u9078\u64C7\u5668","\u7368\u7ACB\u7684\u984F\u8272\u9078\u64C7\u5668\u662F\u5426\u805A\u7126","\u7DE8\u8F2F\u5668\u662F\u5426\u70BA\u8F03\u5927\u7DE8\u8F2F\u5668\u7684\u4E00\u90E8\u5206 (\u4F8B\u5982\u7B46\u8A18\u672C)","\u7DE8\u8F2F\u5668\u7684\u8A9E\u8A00\u8B58\u5225\u78BC","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u5B8C\u6210\u9805\u76EE\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709 CodeLens \u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u5B9A\u7FA9\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u5BA3\u544A\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u5BE6\u4F5C\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u578B\u5225\u5B9A\u7FA9\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u66AB\u7559\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u6587\u4EF6\u9192\u76EE\u63D0\u793A\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u6587\u4EF6\u7B26\u865F\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u53C3\u8003\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u91CD\u65B0\u547D\u540D\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u7C3D\u7AE0\u8AAA\u660E\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u5167\u5D4C\u63D0\u793A\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u6587\u4EF6\u683C\u5F0F\u5316\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u6587\u4EF6\u9078\u53D6\u9805\u76EE\u683C\u5F0F\u5316\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u591A\u500B\u6587\u4EF6\u683C\u5F0F\u5316\u63D0\u4F9B\u8005","\u7DE8\u8F2F\u5668\u662F\u5426\u6709\u591A\u500B\u6587\u4EF6\u9078\u53D6\u9805\u76EE\u683C\u5F0F\u5316\u63D0\u4F9B\u8005"],"vs/editor/common/languages":["\u9663\u5217","\u5E03\u6797\u503C","\u985E\u5225","\u5E38\u6578","\u5EFA\u69CB\u51FD\u5F0F","\u5217\u8209","\u5217\u8209\u6210\u54E1","\u4E8B\u4EF6","\u6B04\u4F4D","\u6A94\u6848","\u51FD\u5F0F","\u4ECB\u9762","\u7D22\u5F15\u9375","\u65B9\u6CD5","\u6A21\u7D44","\u547D\u540D\u7A7A\u9593","null","\u6578\u5B57","\u7269\u4EF6","\u904B\u7B97\u5B50","\u5957\u4EF6","\u5C6C\u6027","\u5B57\u4E32","\u7D50\u69CB","\u578B\u5225\u53C3\u6578","\u8B8A\u6578","{0} ({1})"],"vs/editor/common/languages/modesRegistry":["\u7D14\u6587\u5B57"],"vs/editor/common/model/editStack":["\u6B63\u5728\u9375\u5165"],"vs/editor/common/standaloneStrings":["\u958B\u767C\u4EBA\u54E1: \u6AA2\u67E5\u6B0A\u6756","\u524D\u5F80\u884C/\u6B04...","\u986F\u793A\u6240\u6709\u5FEB\u901F\u5B58\u53D6\u63D0\u4F9B\u8005","\u547D\u4EE4\u9078\u64C7\u5340","\u986F\u793A\u4E26\u57F7\u884C\u547D\u4EE4","\u79FB\u81F3\u7B26\u865F...","\u524D\u5F80\u7B26\u865F (\u4F9D\u985E\u5225)...","\u7DE8\u8F2F\u5668\u5167\u5BB9","\u6309 Alt+F1 \u53EF\u53D6\u5F97\u5354\u52A9\u5DE5\u5177\u9078\u9805\u3002","\u5207\u63DB\u9AD8\u5C0D\u6BD4\u4F48\u666F\u4E3B\u984C","\u5DF2\u5728 {1} \u6A94\u6848\u4E2D\u9032\u884C {0} \u9805\u7DE8\u8F2F"],"vs/editor/common/viewLayout/viewLineRenderer":["\u986F\u793A\u66F4\u591A ({0})","{0} chars"],"vs/editor/contrib/anchorSelect/browser/anchorSelect":["\u9078\u53D6\u7BC4\u570D\u9328\u9EDE","\u8A2D\u5B9A\u9328\u9EDE\u70BA {0}:{1}","\u8A2D\u5B9A\u9078\u53D6\u7BC4\u570D\u9328\u9EDE","\u524D\u5F80\u9078\u53D6\u7BC4\u570D\u9328\u9EDE","\u9078\u53D6\u5F9E\u9328\u9EDE\u5230\u6E38\u6A19\u4E4B\u9593\u7684\u7BC4\u570D","\u53D6\u6D88\u9078\u53D6\u7BC4\u570D\u9328\u9EDE"],"vs/editor/contrib/bracketMatching/browser/bracketMatching":["\u6210\u5C0D\u62EC\u5F27\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002","\u79FB\u81F3\u65B9\u62EC\u5F27","\u9078\u53D6\u81F3\u62EC\u5F27","\u79FB\u9664\u62EC\u5F27","\u524D\u5F80\u62EC\u5F27(&&B)","\u9078\u53D6\u5167\u90E8\u6587\u5B57\uFF0C\u4E26\u5305\u542B\u62EC\u5F27\u6216\u5927\u62EC\u5F27"],"vs/editor/contrib/caretOperations/browser/caretOperations":["\u5C07\u6240\u9078\u6587\u5B57\u5411\u5DE6\u79FB\u52D5","\u5C07\u6240\u9078\u6587\u5B57\u5411\u53F3\u79FB\u52D5"],"vs/editor/contrib/caretOperations/browser/transpose":["\u8ABF\u63DB\u5B57\u6BCD"],"vs/editor/contrib/clipboard/browser/clipboard":["\u526A\u4E0B(&&T)","\u526A\u4E0B","\u526A\u4E0B","\u526A\u4E0B","\u8907\u88FD(&&C)","\u8907\u88FD","\u8907\u88FD","\u8907\u88FD","\u8907\u88FD\u70BA","\u8907\u88FD\u70BA","\u5171\u7528","\u5171\u7528","\u5171\u7528","\u8CBC\u4E0A(&&P)","\u8CBC\u4E0A","\u8CBC\u4E0A","\u8CBC\u4E0A","\u96A8\u8A9E\u6CD5\u9192\u76EE\u63D0\u793A\u8907\u88FD"],"vs/editor/contrib/codeAction/browser/codeAction":["\u5957\u7528\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u6642\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4"],"vs/editor/contrib/codeAction/browser/codeActionCommands":["\u8981\u57F7\u884C\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u7684\u7A2E\u985E\u3002","\u63A7\u5236\u8981\u5957\u7528\u50B3\u56DE\u52D5\u4F5C\u7684\u6642\u6A5F\u3002","\u4E00\u5F8B\u5957\u7528\u7B2C\u4E00\u500B\u50B3\u56DE\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u3002","\u5982\u679C\u50B3\u56DE\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u662F\u552F\u4E00\u52D5\u4F5C\uFF0C\u5247\u52A0\u4EE5\u5957\u7528\u3002","\u4E0D\u8981\u5957\u7528\u50B3\u56DE\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u3002","\u63A7\u5236\u662F\u5426\u50C5\u61C9\u50B3\u56DE\u504F\u597D\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u3002","\u5FEB\u901F\u4FEE\u5FA9...","\u6C92\u6709\u53EF\u7528\u7684\u7A0B\u5F0F\u78BC\u64CD\u4F5C",'\u6C92\u6709 "{0}" \u7684\u504F\u597D\u7A0B\u5F0F\u78BC\u52D5\u4F5C','\u6C92\u6709 "{0}" \u53EF\u7528\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C',"\u6C92\u6709\u53EF\u7528\u7684\u504F\u597D\u7A0B\u5F0F\u78BC\u52D5\u4F5C","\u6C92\u6709\u53EF\u7528\u7684\u7A0B\u5F0F\u78BC\u64CD\u4F5C","\u91CD\u69CB...","\u6C92\u6709\u9069\u7528\u65BC '{0}' \u7684\u504F\u597D\u91CD\u69CB\u3002",'\u6C92\u6709\u53EF\u7528\u7684 "{0}" \u91CD\u69CB',"\u6C92\u6709\u53EF\u7528\u7684\u504F\u597D\u91CD\u69CB","\u6C92\u6709\u53EF\u7528\u7684\u91CD\u69CB","\u4F86\u6E90\u52D5\u4F5C...","\u6C92\u6709\u9069\u7528\u65BC '{0}' \u7684\u504F\u597D\u4F86\u6E90\u52D5\u4F5C",'\u6C92\u6709 "{0}" \u53EF\u7528\u7684\u4F86\u6E90\u52D5\u4F5C',"\u6C92\u6709\u53EF\u7528\u7684\u504F\u597D\u4F86\u6E90\u52D5\u4F5C","\u6C92\u6709\u53EF\u7528\u7684\u4F86\u6E90\u52D5\u4F5C","\u7D44\u7E54\u532F\u5165","\u6C92\u6709\u4EFB\u4F55\u53EF\u7528\u7684\u7D44\u7E54\u532F\u5165\u52D5\u4F5C","\u5168\u90E8\u4FEE\u6B63","\u6C92\u6709\u5168\u90E8\u4FEE\u6B63\u52D5\u4F5C\u53EF\u7528","\u81EA\u52D5\u4FEE\u6B63...","\u6C92\u6709\u53EF\u7528\u7684\u81EA\u52D5\u4FEE\u6B63"],"vs/editor/contrib/codeAction/browser/codeActionContributions":["\u555F\u7528/\u505C\u7528\u5728 [\u7A0B\u5F0F\u78BC\u52D5\u4F5C] \u529F\u80FD\u8868\u4E2D\u986F\u793A\u7FA4\u7D44\u6A19\u982D\u3002","\u76EE\u524D\u4E0D\u5728\u8A3A\u65B7\u6642\uFF0C\u555F\u7528/\u505C\u7528\u986F\u793A\u884C\u5167\u6700\u8FD1\u7684 [\u5FEB\u901F\u4FEE\u6B63]\u3002"],"vs/editor/contrib/codeAction/browser/codeActionController":["\u5167\u5BB9: {0} \u5728\u884C {1} \u548C\u6B04 {2}\u3002","\u96B1\u85CF\u5DF2\u505C\u7528\u9805\u76EE","\u986F\u793A\u5DF2\u505C\u7528\u9805\u76EE"],"vs/editor/contrib/codeAction/browser/codeActionMenu":["\u66F4\u591A\u52D5\u4F5C...","\u5FEB\u901F\u4FEE\u6B63","\u64F7\u53D6","\u5167\u5D4C","\u91CD\u5BEB","\u79FB\u52D5","\u7BC4\u570D\u9673\u8FF0\u5F0F","\u4F86\u6E90\u52D5\u4F5C"],"vs/editor/contrib/codeAction/browser/lightBulbWidget":["\u57F7\u884C: {0}","\u986F\u793A\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u3002\u504F\u597D\u7684\u5FEB\u901F\u4FEE\u6B63\u53EF\u7528 ({0})","\u986F\u793A\u7A0B\u5F0F\u78BC\u52D5\u4F5C ({0})","\u986F\u793A\u7A0B\u5F0F\u78BC\u52D5\u4F5C"],"vs/editor/contrib/codelens/browser/codelensController":["\u986F\u793A\u76EE\u524D\u884C\u7684 Code Lens \u547D\u4EE4","\u9078\u53D6\u547D\u4EE4"],"vs/editor/contrib/colorPicker/browser/colorPickerWidget":["\u6309\u4E00\u4E0B\u4EE5\u5207\u63DB\u8272\u5F69\u9078\u9805 (rgb/hsl/hex)","\u8981\u95DC\u9589\u984F\u8272\u9078\u64C7\u5668\u7684\u5716\u793A"],"vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions":["\u986F\u793A\u6216\u805A\u7126\u7368\u7ACB\u7684\u984F\u8272\u9078\u64C7\u5668","&&\u986F\u793A\u6216\u805A\u7126\u7368\u7ACB\u7684\u984F\u8272\u9078\u64C7\u5668","\u96B1\u85CF\u984F\u8272\u9078\u64C7\u5668","\u4F7F\u7528\u7368\u7ACB\u7684\u984F\u8272\u9078\u64C7\u5668\u63D2\u5165\u984F\u8272"],"vs/editor/contrib/comment/browser/comment":["\u5207\u63DB\u884C\u8A3B\u89E3","\u5207\u63DB\u884C\u8A3B\u89E3(&&T)","\u52A0\u5165\u884C\u8A3B\u89E3","\u79FB\u9664\u884C\u8A3B\u89E3","\u5207\u63DB\u5340\u584A\u8A3B\u89E3","\u5207\u63DB\u5340\u584A\u8A3B\u89E3(&&B)"],"vs/editor/contrib/contextmenu/browser/contextmenu":["\u7E2E\u5716","\u8F49\u8B6F\u5B57\u5143","\u5782\u76F4\u5927\u5C0F","\u6309\u6BD4\u4F8B","\u586B\u6EFF","\u6700\u9069\u5927\u5C0F","\u6ED1\u687F","\u6ED1\u9F20\u79FB\u81F3\u4E0A\u65B9","\u4E00\u5F8B","\u986F\u793A\u7DE8\u8F2F\u5668\u5167\u5BB9\u529F\u80FD\u8868"],"vs/editor/contrib/cursorUndo/browser/cursorUndo":["\u6E38\u6A19\u5FA9\u539F","\u6E38\u6A19\u91CD\u505A"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution":["\u8CBC\u4E0A\u70BA...","\u8981\u5617\u8A66\u5957\u7528\u7684\u8CBC\u4E0A\u7DE8\u8F2F\u7684\u8B58\u5225\u78BC\u3002\u5982\u679C\u672A\u63D0\u4F9B\uFF0C\u7DE8\u8F2F\u5668\u5C07\u986F\u793A\u9078\u64C7\u5668\u3002","\u8CBC\u4E0A\u70BA\u6587\u5B57"],"vs/editor/contrib/dropOrPasteInto/browser/copyPasteController":["\u662F\u5426\u986F\u793A\u8CBC\u4E0A\u5C0F\u5DE5\u5177","\u986F\u793A\u8CBC\u4E0A\u9078\u9805...","\u627E\u4E0D\u5230 '{0}' \u7684\u8CBC\u4E0A\u7DE8\u8F2F","\u6B63\u5728\u57F7\u884C\u8CBC\u4E0A\u8655\u7406\u5E38\u5F0F\u3002\u6309\u4E00\u4E0B\u4EE5\u53D6\u6D88","\u9078\u53D6\u8CBC\u4E0A\u52D5\u4F5C","\u57F7\u884C\u8CBC\u4E0A\u8655\u7406\u5E38\u5F0F"],"vs/editor/contrib/dropOrPasteInto/browser/defaultProviders":["\u5167\u5EFA","\u63D2\u5165\u7D14\u6587\u5B57","\u63D2\u5165 URI","\u63D2\u5165 URI","\u63D2\u5165\u8DEF\u5F91","\u63D2\u5165\u8DEF\u5F91","\u63D2\u5165\u76F8\u5C0D\u8DEF\u5F91","\u63D2\u5165\u76F8\u5C0D\u8DEF\u5F91","\u63D2\u5165 HTML"],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution":["\u8A2D\u5B9A\u9810\u8A2D\u5378\u8F09\u63D0\u4F9B\u8005\uFF0C\u4EE5\u7528\u65BC\u6307\u5B9A MIME \u985E\u578B\u7684\u5167\u5BB9\u3002"],"vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController":["\u662F\u5426\u986F\u793A\u5378\u9664\u5C0F\u5DE5\u5177","\u986F\u793A\u5378\u9664\u9078\u9805...","\u6B63\u5728\u57F7\u884C\u7F6E\u653E\u8655\u7406\u5E38\u5F0F\u3002\u6309\u4E00\u4E0B\u4EE5\u53D6\u6D88"],"vs/editor/contrib/editorState/browser/keybindingCancellation":["\u7DE8\u8F2F\u5668\u662F\u5426\u57F7\u884C\u53EF\u53D6\u6D88\u7684\u4F5C\u696D\uFF0C\u4F8B\u5982\u300C\u9810\u89BD\u53C3\u8003\u300D"],"vs/editor/contrib/find/browser/findController":["\u6A94\u6848\u592A\u5927\uFF0C\u7121\u6CD5\u57F7\u884C\u53D6\u4EE3\u6240\u6709\u4F5C\u696D\u3002","\u5C0B\u627E","\u5C0B\u627E(&&F)","\u4F7F\u7528\u5F15\u6578\u5C0B\u627E","\u5C0B\u627E\u9078\u53D6\u9805\u76EE","\u5C0B\u627E\u4E0B\u4E00\u500B","\u5C0B\u627E\u4E0A\u4E00\u500B","\u79FB\u81F3\u76F8\u7B26\u9805\u76EE...","\u6C92\u6709\u76F8\u7B26\u9805\u76EE\u3002\u5617\u8A66\u641C\u5C0B\u5176\u4ED6\u9805\u76EE\u3002","\u8F38\u5165\u6578\u5B57\u4EE5\u524D\u5F80\u7279\u5B9A\u76F8\u7B26\u9805\u76EE (\u4ECB\u65BC 1 \u5230 {0})","\u8ACB\u8F38\u5165\u4ECB\u65BC 1 \u548C {0} \u4E4B\u9593\u7684\u6578\u5B57\u3002","\u8ACB\u8F38\u5165\u4ECB\u65BC 1 \u548C {0} \u4E4B\u9593\u7684\u6578\u5B57\u3002","\u5C0B\u627E\u4E0B\u4E00\u500B\u9078\u53D6\u9805\u76EE","\u5C0B\u627E\u4E0A\u4E00\u500B\u9078\u53D6\u9805\u76EE","\u53D6\u4EE3","\u53D6\u4EE3(&&R)"],"vs/editor/contrib/find/browser/findWidget":["\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E] \u7684\u5716\u793A\u3002","\u8868\u793A\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u5DF2\u647A\u758A\u7684\u5716\u793A\u3002","\u8868\u793A\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u5DF2\u5C55\u958B\u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u53D6\u4EE3] \u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u5168\u90E8\u53D6\u4EE3] \u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u5C0B\u627E\u4E0A\u4E00\u500B] \u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u5C0B\u627E\u4E0B\u4E00\u500B] \u7684\u5716\u793A\u3002","\u5C0B\u627E/\u53D6\u4EE3","\u5C0B\u627E","\u5C0B\u627E","\u4E0A\u4E00\u500B\u76F8\u7B26\u9805\u76EE","\u4E0B\u4E00\u500B\u76F8\u7B26\u9805\u76EE","\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E","\u95DC\u9589","\u53D6\u4EE3","\u53D6\u4EE3","\u53D6\u4EE3","\u5168\u90E8\u53D6\u4EE3","\u5207\u63DB\u53D6\u4EE3","\u50C5\u53CD\u767D\u986F\u793A\u524D {0} \u7B46\u7D50\u679C\uFF0C\u4F46\u6240\u6709\u5C0B\u627E\u4F5C\u696D\u6703\u5728\u5B8C\u6574\u6587\u5B57\u4E0A\u57F7\u884C\u3002","{1} \u7684 {0}","\u67E5\u7121\u7D50\u679C","\u627E\u5230 {0}","\u4EE5 '{1}' \u627E\u5230 {0}","\u4EE5 '{1}' \u627E\u5230 {0}\uFF0C\u4F4D\u65BC {2}","\u5DF2\u4EE5 '{1}' \u627E\u5230 {0}","Ctrl+Enter \u73FE\u5728\u6703\u63D2\u5165\u5206\u884C\u7B26\u865F\uFF0C\u800C\u4E0D\u6703\u5168\u90E8\u53D6\u4EE3\u3002\u60A8\u53EF\u4EE5\u4FEE\u6539 editor.action.replaceAll \u7684\u6309\u9375\u7E6B\u7D50\u95DC\u4FC2\uFF0C\u4EE5\u8986\u5BEB\u6B64\u884C\u70BA\u3002"],"vs/editor/contrib/folding/browser/folding":["\u5C55\u958B","\u4EE5\u905E\u8FF4\u65B9\u5F0F\u5C55\u958B","\u647A\u758A","\u5207\u63DB\u647A\u758A","\u4EE5\u905E\u8FF4\u65B9\u5F0F\u647A\u758A","\u647A\u758A\u5168\u90E8\u5340\u584A\u8A3B\u89E3","\u647A\u758A\u6240\u6709\u5340\u57DF","\u5C55\u958B\u6240\u6709\u5340\u57DF","\u647A\u758A\u6240\u9078\u5340\u57DF\u4EE5\u5916\u7684\u6240\u6709\u5340\u57DF","\u5C55\u958B\u6240\u9078\u5340\u57DF\u4EE5\u5916\u7684\u6240\u6709\u5340\u57DF","\u5168\u90E8\u647A\u758A","\u5168\u90E8\u5C55\u958B","\u79FB\u81F3\u7236\u4EE3\u647A\u758A","\u79FB\u81F3\u4E0A\u4E00\u500B\u647A\u758A\u7BC4\u570D","\u79FB\u81F3\u4E0B\u4E00\u500B\u647A\u758A\u7BC4\u570D","\u5F9E\u9078\u53D6\u7BC4\u570D\u5EFA\u7ACB\u647A\u758A\u7BC4\u570D","\u79FB\u9664\u624B\u52D5\u6298\u758A\u7BC4\u570D","\u647A\u758A\u5C64\u7D1A {0}"],"vs/editor/contrib/folding/browser/foldingDecorations":["\u5DF2\u647A\u758A\u7BC4\u570D\u5F8C\u7684\u80CC\u666F\u8272\u5F69\u3002\u8272\u5F69\u4E0D\u5F97\u8655\u65BC\u4E0D\u900F\u660E\u72C0\u614B\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u88DD\u8A02\u908A\u7684\u647A\u758A\u63A7\u5236\u9805\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u5B57\u7B26\u908A\u754C\u4E2D [\u5C55\u958B\u7684\u7BC4\u570D] \u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5B57\u7B26\u908A\u754C\u4E2D [\u647A\u758A\u7684\u7BC4\u570D] \u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5B57\u7B26\u908A\u754C\u4E2D\u624B\u52D5\u647A\u758A\u7BC4\u570D\u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5B57\u7B26\u908A\u754C\u4E2D\u624B\u52D5\u5C55\u958B\u7BC4\u570D\u7684\u5716\u793A\u3002","\u6309\u4E00\u4E0B\u4EE5\u5C55\u958B\u7BC4\u570D\u3002","\u6309\u4E00\u4E0B\u4EE5\u647A\u758A\u7BC4\u570D\u3002"],"vs/editor/contrib/fontZoom/browser/fontZoom":["\u589E\u52A0\u7DE8\u8F2F\u5668\u5B57\u578B\u5927\u5C0F","\u6E1B\u5C11\u7DE8\u8F2F\u5668\u5B57\u578B\u5927\u5C0F","\u91CD\u8A2D\u7DE8\u8F2F\u5668\u5B57\u578B\u5927\u5C0F"],"vs/editor/contrib/format/browser/formatActions":["\u683C\u5F0F\u5316\u6587\u4EF6","\u683C\u5F0F\u5316\u9078\u53D6\u7BC4\u570D"],"vs/editor/contrib/gotoError/browser/gotoError":["\u79FB\u81F3\u4E0B\u4E00\u500B\u554F\u984C (\u932F\u8AA4, \u8B66\u544A, \u8CC7\u8A0A)","[\u524D\u5F80\u4E0B\u4E00\u500B\u6A19\u8A18] \u7684\u5716\u793A\u3002","\u79FB\u81F3\u4E0A\u4E00\u500B\u554F\u984C (\u932F\u8AA4, \u8B66\u544A, \u8CC7\u8A0A)","[\u524D\u5F80\u4E0A\u4E00\u500B\u6A19\u8A18] \u7684\u5716\u793A\u3002","\u79FB\u81F3\u6A94\u6848\u88E1\u9762\u7684\u4E0B\u4E00\u500B\u554F\u984C (\u932F\u8AA4, \u8B66\u544A, \u8CC7\u8A0A)","\u4E0B\u4E00\u500B\u554F\u984C(&&P)","\u79FB\u81F3\u6A94\u6848\u88E1\u9762\u7684\u4E0A\u4E00\u500B\u554F\u984C (\u932F\u8AA4, \u8B66\u544A, \u8CC7\u8A0A)","\u524D\u4E00\u500B\u554F\u984C(&&P)"],"vs/editor/contrib/gotoError/browser/gotoErrorWidget":["\u932F\u8AA4","\u8B66\u544A","\u8CC7\u8A0A","\u63D0\u793A","{0} \u65BC {1}\u3002","{0} \u500B\u554F\u984C (\u5171 {1} \u500B)","{0} \u500B\u554F\u984C (\u5171 {1} \u500B)","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u932F\u8AA4\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u932F\u8AA4\u6A19\u984C\u80CC\u666F\u3002","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u8B66\u544A\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u8B66\u544A\u6A19\u984C\u80CC\u666F\u3002","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u8CC7\u8A0A\u7684\u8272\u5F69","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u8CC7\u8A0A\u6A19\u984C\u80CC\u666F\u3002","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u7684\u80CC\u666F\u3002"],"vs/editor/contrib/gotoSymbol/browser/goToCommands":["\u67E5\u770B","\u5B9A\u7FA9","\u627E\u4E0D\u5230 '{0}' \u7684\u5B9A\u7FA9","\u627E\u4E0D\u5230\u4EFB\u4F55\u5B9A\u7FA9","\u79FB\u81F3\u5B9A\u7FA9","\u79FB\u81F3\u5B9A\u7FA9(&&D)","\u5728\u4E00\u5074\u958B\u555F\u5B9A\u7FA9","\u7784\u6838\u5B9A\u7FA9","\u5BA3\u544A","\u627E\u4E0D\u5230 '{0}' \u7684\u5BA3\u544A ","\u627E\u4E0D\u5230\u4EFB\u4F55\u5BA3\u544A","\u79FB\u81F3\u5BA3\u544A","\u524D\u5F80\u5BA3\u544A(&&D)","\u627E\u4E0D\u5230 '{0}' \u7684\u5BA3\u544A ","\u627E\u4E0D\u5230\u4EFB\u4F55\u5BA3\u544A","\u9810\u89BD\u5BA3\u544A","\u985E\u578B\u5B9A\u7FA9","\u627E\u4E0D\u5230 '{0}' \u7684\u4EFB\u4F55\u985E\u578B\u5B9A\u7FA9","\u627E\u4E0D\u5230\u4EFB\u4F55\u985E\u578B\u5B9A\u7FA9","\u79FB\u81F3\u985E\u578B\u5B9A\u7FA9","\u524D\u5F80\u985E\u578B\u5B9A\u7FA9(&&T)","\u9810\u89BD\u985E\u578B\u5B9A\u7FA9","\u5BE6\u4F5C","\u627E\u4E0D\u5230 '{0}' \u7684\u4EFB\u4F55\u5BE6\u4F5C","\u627E\u4E0D\u5230\u4EFB\u4F55\u5BE6\u4F5C","\u524D\u5F80\u5BE6\u4F5C","\u524D\u5F80\u5BE6\u4F5C(&&I)","\u67E5\u770B\u5BE6\u4F5C",'\u672A\u627E\u5230 "{0}" \u7684\u53C3\u8003',"\u672A\u627E\u5230\u53C3\u8003","\u524D\u5F80\u53C3\u8003","\u524D\u5F80\u53C3\u8003(&&R)","\u53C3\u8003","\u9810\u89BD\u53C3\u8003","\u53C3\u8003","\u524D\u5F80\u4EFB\u4F55\u7B26\u865F","\u4F4D\u7F6E","'{0}' \u6C92\u6709\u7D50\u679C","\u53C3\u8003"],"vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition":["\u6309\u4E00\u4E0B\u4EE5\u986F\u793A {0} \u9805\u5B9A\u7FA9\u3002"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesController":["\u662F\u5426\u986F\u793A\u53C3\u8003\u7784\u6838\uFF0C\u4F8B\u5982\u300C\u7784\u6838\u53C3\u8003\u300D\u6216\u300C\u7784\u6838\u5B9A\u7FA9\u300D","\u6B63\u5728\u8F09\u5165...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesTree":["{0} \u500B\u53C3\u8003","{0} \u500B\u53C3\u8003","\u53C3\u8003"],"vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget":["\u7121\u6CD5\u9810\u89BD","\u67E5\u7121\u7D50\u679C","\u53C3\u8003"],"vs/editor/contrib/gotoSymbol/browser/referencesModel":["\u5728\u8CC7\u6599\u884C {2} \u884C {1} \u7684 {0} \u4E2D","\u5728\u8CC7\u6599\u884C {3} \u884C {2} \u7684 {1} \u7684 {0} \u4E2D","1 \u500B\u7B26\u865F\u4F4D\u65BC {0}, \u5B8C\u6574\u8DEF\u5F91 {1}","{0} \u500B\u7B26\u865F\u4F4D\u65BC {1}, \u5B8C\u6574\u8DEF\u5F91 {2}","\u627E\u4E0D\u5230\u7D50\u679C","\u5728 {0} \u4E2D\u627E\u5230 1 \u500B\u7B26\u865F","\u5728 {1} \u4E2D\u627E\u5230 {0} \u500B\u7B26\u865F","\u5728 {1} \u500B\u6A94\u6848\u4E2D\u627E\u5230 {0} \u500B\u7B26\u865F"],"vs/editor/contrib/gotoSymbol/browser/symbolNavigation":["\u662F\u5426\u6709\u53EA\u80FD\u900F\u904E\u9375\u76E4\u700F\u89BD\u7684\u7B26\u865F\u4F4D\u7F6E\u3002","{1} \u7684\u7B26\u865F {0}\uFF0C{2} \u70BA\u4E0B\u4E00\u500B","{1} \u7684\u7B26\u865F {0}"],"vs/editor/contrib/hover/browser/hover":["\u986F\u793A\u6216\u805A\u7126\u66AB\u7559","\u6E38\u6A19\u66AB\u7559\u5C07\u4E0D\u6703\u81EA\u52D5\u805A\u7126\u3002","\u53EA\u6709\u5728\u6E38\u6A19\u66AB\u7559\u986F\u793A\u6642\u624D\u6703\u805A\u7126\u3002","\u6E38\u6A19\u66AB\u7559\u51FA\u73FE\u6642\u5C07\u81EA\u52D5\u805A\u7126\u3002","\u986F\u793A\u5B9A\u7FA9\u9810\u89BD\u61F8\u505C","\u5411\u4E0A\u6372\u52D5\u66AB\u7559","\u5411\u4E0B\u6372\u52D5\u66AB\u7559","\u5411\u5DE6\u6372\u52D5\u66AB\u7559","\u5411\u53F3\u6372\u52D5\u66AB\u7559","\u4E0A\u4E00\u9801\u66AB\u7559","\u4E0B\u4E00\u9801\u66AB\u7559","\u79FB\u81F3\u4E0A\u65B9\u66AB\u7559","\u79FB\u81F3\u4E0B\u65B9\u66AB\u7559"],"vs/editor/contrib/hover/browser/markdownHoverParticipant":["\u6B63\u5728\u8F09\u5165...","\u7531\u65BC\u6548\u80FD\u539F\u56E0\uFF0C\u5DF2\u66AB\u505C\u8F49\u8B6F\u3002\u9019\u53EF\u900F\u904E `editor.stopRenderingLineAfter` \u9032\u884C\u8A2D\u5B9A\u3002","\u56E0\u6548\u80FD\u7684\u7DE3\u6545\uFF0C\u5DF2\u8DF3\u904E\u5C07\u9577\u7684\u884C Token \u5316\u3002\u60A8\u53EF\u900F\u904E `editor.maxTokenizationLineLength` \u8A2D\u5B9A\u3002"],"vs/editor/contrib/hover/browser/markerHoverParticipant":["\u6AA2\u8996\u554F\u984C","\u6C92\u6709\u53EF\u7528\u7684\u5FEB\u901F\u4FEE\u6B63","\u6B63\u5728\u6AA2\u67E5\u5FEB\u901F\u4FEE\u6B63...","\u6C92\u6709\u53EF\u7528\u7684\u5FEB\u901F\u4FEE\u6B63","\u5FEB\u901F\u4FEE\u5FA9..."],"vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace":["\u4EE5\u4E0A\u4E00\u500B\u503C\u53D6\u4EE3","\u4EE5\u4E0B\u4E00\u500B\u503C\u53D6\u4EE3"],"vs/editor/contrib/indentation/browser/indentation":["\u5C07\u7E2E\u6392\u8F49\u63DB\u6210\u7A7A\u683C","\u5C07\u7E2E\u6392\u8F49\u63DB\u6210\u5B9A\u4F4D\u9EDE","\u5DF2\u8A2D\u5B9A\u7684\u5B9A\u4F4D\u9EDE\u5927\u5C0F","\u9810\u8A2D\u7D22\u5F15\u6A19\u7C64\u5927\u5C0F","\u76EE\u524D\u7684\u7D22\u5F15\u6A19\u7C64\u5927\u5C0F","\u9078\u53D6\u76EE\u524D\u6A94\u6848\u7684\u5B9A\u4F4D\u9EDE\u5927\u5C0F","\u4F7F\u7528 Tab \u9032\u884C\u7E2E\u6392","\u4F7F\u7528\u7A7A\u683C\u9375\u9032\u884C\u7E2E\u6392","\u8B8A\u66F4\u7D22\u5F15\u6A19\u7C64\u986F\u793A\u5927\u5C0F","\u5075\u6E2C\u5167\u5BB9\u4E2D\u7684\u7E2E\u6392","\u91CD\u65B0\u5C07\u884C\u7E2E\u6392","\u91CD\u65B0\u5C07\u9078\u53D6\u7684\u884C\u7E2E\u6392"],"vs/editor/contrib/inlayHints/browser/inlayHintsHover":["\u6309\u5169\u4E0B\u4EE5\u63D2\u5165","cmd + \u6309\u4E00\u4E0B","ctrl + \u6309\u4E00\u4E0B","\u9078\u9805 + \u6309\u4E00\u4E0B","alt + \u6309\u4E00\u4E0B","\u524D\u5F80 [\u5B9A\u7FA9] ({0})\uFF0C\u6309\u4E00\u4E0B\u6ED1\u9F20\u53F3\u9375\u4EE5\u4E86\u89E3\u66F4\u591A","\u79FB\u81F3\u5B9A\u7FA9 ({0})","\u57F7\u884C\u547D\u4EE4"],"vs/editor/contrib/inlineCompletions/browser/commands":["\u986F\u793A\u4E0B\u4E00\u500B\u5167\u5D4C\u5EFA\u8B70","\u986F\u793A\u4E0A\u4E00\u500B\u5167\u5D4C\u5EFA\u8B70","\u89F8\u767C\u5167\u5D4C\u5EFA\u8B70","\u63A5\u53D7\u4E0B\u4E00\u500B\u5167\u5D4C\u5EFA\u8B70\u5B57\u7D44","\u63A5\u53D7\u5B57\u7D44","\u63A5\u53D7\u4E0B\u4E00\u500B\u5167\u5D4C\u5EFA\u8B70\u884C","\u63A5\u53D7\u884C","\u63A5\u53D7\u5167\u5D4C\u5EFA\u8B70","\u63A5\u53D7","\u96B1\u85CF\u5167\u5D4C\u5EFA\u8B70","\u6C38\u9060\u986F\u793A\u5DE5\u5177\u5217"],"vs/editor/contrib/inlineCompletions/browser/hoverParticipant":["\u5EFA\u8B70:"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys":["\u662F\u5426\u986F\u793A\u5167\u5D4C\u5EFA\u8B70","\u5167\u5D4C\u5EFA\u8B70\u662F\u5426\u4EE5\u7A7A\u767D\u5B57\u5143\u958B\u982D","\u5167\u5D4C\u5EFA\u8B70\u7684\u958B\u982D\u662F\u5426\u70BA\u7A7A\u767D\uFF0C\u4E14\u6BD4 Tab \u80FD\u63D2\u5165\u7684\u5B57\u5143\u8981\u5C0F","\u662F\u5426\u61C9\u96B1\u85CF\u76EE\u524D\u5EFA\u8B70\u7684\u5176\u4ED6\u5EFA\u8B70"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController":["\u5728\u53EF\u5B58\u53D6\u6AA2\u8996\u4E2D\u6AA2\u67E5\u6B64\u9805\u76EE ({0})"],"vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget":["[\u986F\u793A\u4E0B\u4E00\u500B\u53C3\u6578\u63D0\u793A] \u7684\u5716\u793A\u3002","[\u986F\u793A\u4E0A\u4E00\u500B\u53C3\u6578\u63D0\u793A] \u7684\u5716\u793A\u3002","{0} ({1})","\u4E0A\u4E00\u6B65","\u4E0B\u4E00\u6B65"],"vs/editor/contrib/lineSelection/browser/lineSelection":["\u5C55\u958B\u7DDA\u689D\u9078\u53D6\u7BC4\u570D"],"vs/editor/contrib/linesOperations/browser/linesOperations":["\u5C07\u884C\u5411\u4E0A\u8907\u88FD","\u5C07\u884C\u5411\u4E0A\u8907\u88FD(&&C)","\u5C07\u884C\u5411\u4E0B\u8907\u88FD","\u5C07\u884C\u5411\u4E0B\u8907\u88FD(&&P)","\u91CD\u8907\u9078\u53D6\u9805\u76EE","\u91CD\u8907\u9078\u53D6\u9805\u76EE(&&D)","\u4E0A\u79FB\u4E00\u884C","\u4E0A\u79FB\u4E00\u884C(&&V)","\u4E0B\u79FB\u4E00\u884C","\u4E0B\u79FB\u4E00\u884C(&&L)","\u905E\u589E\u6392\u5E8F\u884C","\u905E\u6E1B\u6392\u5E8F\u884C","\u522A\u9664\u91CD\u8907\u7684\u884C","\u4FEE\u526A\u5C3E\u7AEF\u7A7A\u767D","\u522A\u9664\u884C","\u7E2E\u6392\u884C","\u51F8\u6392\u884C","\u5728\u4E0A\u65B9\u63D2\u5165\u884C","\u5728\u4E0B\u65B9\u63D2\u5165\u884C","\u5DE6\u908A\u5168\u90E8\u522A\u9664","\u522A\u9664\u6240\u6709\u53F3\u65B9\u9805\u76EE","\u9023\u63A5\u7DDA","\u8F49\u7F6E\u6E38\u6A19\u5468\u570D\u7684\u5B57\u5143\u6578","\u8F49\u63DB\u5230\u5927\u5BEB","\u8F49\u63DB\u5230\u5C0F\u5BEB","\u8F49\u63DB\u70BA\u5B57\u9996\u5927\u5BEB","\u8F49\u63DB\u70BA\u5E95\u7DDA\u9023\u63A5\u5B57","\u8F49\u63DB\u70BA Camel \u6848\u4F8B","\u8F49\u63DB\u6210 Kebab Case"],"vs/editor/contrib/linkedEditing/browser/linkedEditing":["\u958B\u59CB\u9023\u7D50\u7684\u7DE8\u8F2F","\u7576\u7DE8\u8F2F\u5668\u81EA\u52D5\u91CD\u65B0\u547D\u540D\u985E\u578B\u6642\u7684\u80CC\u666F\u8272\u5F69\u3002"],"vs/editor/contrib/links/browser/links":["\u56E0\u70BA\u6B64\u9023\u7D50\u7684\u683C\u5F0F\u4E0D\u6B63\u78BA\uFF0C\u6240\u4EE5\u7121\u6CD5\u958B\u555F: {0}","\u56E0\u70BA\u6B64\u9023\u7D50\u76EE\u6A19\u907A\u5931\uFF0C\u6240\u4EE5\u7121\u6CD5\u958B\u555F\u3002","\u57F7\u884C\u547D\u4EE4","\u8FFD\u8E64\u9023\u7D50","cmd + \u6309\u4E00\u4E0B","ctrl + \u6309\u4E00\u4E0B","\u9078\u9805 + \u6309\u4E00\u4E0B","alt + \u6309\u4E00\u4E0B","\u57F7\u884C\u547D\u4EE4 {0}","\u958B\u555F\u9023\u7D50"],"vs/editor/contrib/message/browser/messageController":["\u7DE8\u8F2F\u5668\u76EE\u524D\u662F\u5426\u6B63\u5728\u986F\u793A\u5167\u5D4C\u8A0A\u606F"],"vs/editor/contrib/multicursor/browser/multicursor":["\u65B0\u589E\u7684\u8CC7\u6599\u6307\u6A19: {0}","\u65B0\u589E\u7684\u8CC7\u6599\u6307\u6A19: {0}","\u5728\u4E0A\u65B9\u52A0\u5165\u6E38\u6A19","\u5728\u4E0A\u65B9\u65B0\u589E\u6E38\u6A19(&&A)","\u5728\u4E0B\u65B9\u52A0\u5165\u6E38\u6A19","\u5728\u4E0B\u65B9\u65B0\u589E\u6E38\u6A19(&&D)","\u5728\u884C\u5C3E\u65B0\u589E\u6E38\u6A19","\u5728\u884C\u5C3E\u65B0\u589E\u6E38\u6A19(&&U)","\u5C07\u6E38\u6A19\u65B0\u589E\u5230\u5E95\u90E8 ","\u5C07\u6E38\u6A19\u65B0\u589E\u5230\u9802\u90E8","\u5C07\u9078\u53D6\u9805\u76EE\u52A0\u5165\u4E0B\u4E00\u500B\u627E\u5230\u7684\u76F8\u7B26\u9805","\u65B0\u589E\u4E0B\u4E00\u500B\u9805\u76EE(&&N)","\u5C07\u9078\u53D6\u9805\u76EE\u52A0\u5165\u524D\u4E00\u500B\u627E\u5230\u7684\u76F8\u7B26\u9805\u4E2D","\u65B0\u589E\u4E0A\u4E00\u500B\u9805\u76EE(&&R)","\u5C07\u6700\u5F8C\u4E00\u500B\u9078\u64C7\u9805\u76EE\u79FB\u81F3\u4E0B\u4E00\u500B\u627E\u5230\u7684\u76F8\u7B26\u9805","\u5C07\u6700\u5F8C\u4E00\u500B\u9078\u64C7\u9805\u76EE\u79FB\u81F3\u524D\u4E00\u500B\u627E\u5230\u7684\u76F8\u7B26\u9805","\u9078\u53D6\u6240\u6709\u627E\u5230\u7684\u76F8\u7B26\u9805\u76EE","\u9078\u53D6\u6240\u6709\u9805\u76EE(&&O)","\u8B8A\u66F4\u6240\u6709\u767C\u751F\u6B21\u6578","\u805A\u7126\u4E0B\u4E00\u500B\u6E38\u6A19","\u805A\u7126\u4E0B\u4E00\u500B\u6E38\u6A19","\u805A\u7126\u4E0A\u4E00\u500B\u6E38\u6A19","\u805A\u7126\u524D\u4E00\u500B\u6E38\u6A19"],"vs/editor/contrib/parameterHints/browser/parameterHints":["\u89F8\u767C\u53C3\u6578\u63D0\u793A"],"vs/editor/contrib/parameterHints/browser/parameterHintsWidget":["[\u986F\u793A\u4E0B\u4E00\u500B\u53C3\u6578\u63D0\u793A] \u7684\u5716\u793A\u3002","[\u986F\u793A\u4E0A\u4E00\u500B\u53C3\u6578\u63D0\u793A] \u7684\u5716\u793A\u3002","{0}\uFF0C\u63D0\u793A","\u53C3\u6578\u63D0\u793A\u4E2D\u4F7F\u7528\u4E2D\u9805\u76EE\u7684\u524D\u666F\u8272\u5F69\u3002"],"vs/editor/contrib/peekView/browser/peekView":["\u76EE\u524D\u7684\u7A0B\u5F0F\u78BC\u7DE8\u8F2F\u5668\u662F\u5426\u5167\u5D4C\u65BC\u7784\u6838\u5167","\u95DC\u9589","\u9810\u89BD\u6AA2\u8996\u6A19\u984C\u5340\u57DF\u7684\u80CC\u666F\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u6A19\u984C\u7684\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u6A19\u984C\u8CC7\u8A0A\u7684\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u4E4B\u6846\u7DDA\u8207\u7BAD\u982D\u7684\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u4E2D\u7D50\u679C\u6E05\u55AE\u7684\u80CC\u666F\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u7D50\u679C\u5217\u8868\u4E2D\u884C\u7BC0\u9EDE\u7684\u524D\u666F\u8272\u5F69","\u9810\u89BD\u6AA2\u8996\u7D50\u679C\u5217\u8868\u4E2D\u6A94\u6848\u7BC0\u9EDE\u7684\u524D\u666F\u8272\u5F69","\u5728\u9810\u89BD\u6AA2\u8996\u4E4B\u7D50\u679C\u6E05\u55AE\u4E2D\u9078\u53D6\u9805\u76EE\u6642\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5728\u9810\u89BD\u6AA2\u8996\u4E4B\u7D50\u679C\u6E05\u55AE\u4E2D\u9078\u53D6\u9805\u76EE\u6642\u7684\u524D\u666F\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u7684\u80CC\u666F\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u908A\u6846(\u542B\u884C\u865F\u6216\u5B57\u5F62\u5716\u793A)\u7684\u80CC\u666F\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u4E2D\u9ECF\u6027\u6EFE\u52D5\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5728\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u4E2D\u6BD4\u5C0D\u6642\u7684\u53CD\u767D\u986F\u793A\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u4E2D\u6BD4\u5C0D\u6642\u7684\u53CD\u767D\u986F\u793A\u8272\u5F69\u3002","\u5728\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u4E2D\u6BD4\u5C0D\u6642\u7684\u53CD\u767D\u986F\u793A\u908A\u754C\u3002"],"vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess":["\u5148\u958B\u555F\u6587\u5B57\u7DE8\u8F2F\u5668\uFF0C\u524D\u5F80\u67D0\u4E00\u884C\u3002","\u524D\u5F80\u7B2C {0} \u884C\u7684\u7B2C {1} \u500B\u5B57\u5143\u3002","\u524D\u5F80\u7B2C {0} \u884C\u3002","\u76EE\u524D\u884C: {0}\uFF0C\u5B57\u5143: {1}\u3002\u8ACB\u9375\u5165\u4ECB\u65BC 1 \u5230 {2} \u4E4B\u9593\u884C\u865F\uFF0C\u5C0E\u89BD\u81F3\u8A72\u884C\u3002","\u76EE\u524D\u884C: {0}\uFF0C\u5B57\u5143: {1}\u3002\u8ACB\u9375\u5165\u8981\u5C0E\u89BD\u81F3\u7684\u884C\u865F\u3002"],"vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess":["\u82E5\u8981\u524D\u5F80\u7B26\u865F\uFF0C\u8ACB\u5148\u958B\u555F\u5305\u542B\u7B26\u865F\u8CC7\u8A0A\u7684\u6587\u5B57\u7DE8\u8F2F\u5668\u3002","\u4F7F\u7528\u4E2D\u7684\u6587\u5B57\u7DE8\u8F2F\u5668\u4E0D\u63D0\u4F9B\u7B26\u865F\u8CC7\u8A0A\u3002","\u6C92\u6709\u76F8\u7B26\u7684\u7DE8\u8F2F\u5668\u7B26\u865F","\u6C92\u6709\u7DE8\u8F2F\u5668\u7B26\u865F","\u958B\u81F3\u5074\u908A","\u958B\u555F\u5230\u5E95\u90E8","\u7B26\u865F ({0})","\u5C6C\u6027 ({0})","\u65B9\u6CD5 ({0})","\u51FD\u5F0F ({0})","\u5EFA\u69CB\u51FD\u5F0F ({0})","\u8B8A\u6578 ({0})","\u985E\u5225 ({0})","\u7D50\u69CB ({0})","\u4E8B\u4EF6 ({0})","\u904B\u7B97\u5B50 ({0})","\u4ECB\u9762 ({0})","\u547D\u540D\u7A7A\u9593 ({0})","\u5957\u4EF6 ({0})","\u578B\u5225\u53C3\u6578 ({0})","\u6A21\u7D44 ({0})","\u5C6C\u6027 ({0})","\u5217\u8209 ({0})","\u5217\u8209\u6210\u54E1 ({0})","\u5B57\u4E32 ({0})","\u6A94\u6848 ({0})","\u9663\u5217 ({0})","\u6578\u5B57 ({0})","\u5E03\u6797\u503C ({0})","\u7269\u4EF6 ({0})","\u7D22\u5F15\u9375 ({0})","\u6B04\u4F4D ({0})","\u5E38\u6578 ({0})"],"vs/editor/contrib/readOnlyMessage/browser/contribution":["\u7121\u6CD5\u5728\u552F\u8B80\u8F38\u5165\u4E2D\u7DE8\u8F2F","\u7121\u6CD5\u5728\u552F\u8B80\u7DE8\u8F2F\u5668\u4E2D\u7DE8\u8F2F"],"vs/editor/contrib/rename/browser/rename":["\u6C92\u6709\u7D50\u679C\u3002","\u89E3\u6790\u91CD\u65B0\u547D\u540D\u4F4D\u7F6E\u6642\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4","\u6B63\u5728\u5C07 '{0}' \u91CD\u65B0\u547D\u540D\u70BA '{1}'","\u6B63\u5728\u5C07 {0} \u91CD\u65B0\u547D\u540D\u70BA {1}","\u5DF2\u6210\u529F\u5C07 '{0}' \u91CD\u65B0\u547D\u540D\u70BA '{1}'\u3002\u6458\u8981: {2}","\u91CD\u547D\u540D\u7121\u6CD5\u5957\u7528\u7DE8\u8F2F","\u91CD\u65B0\u547D\u540D\u7121\u6CD5\u8A08\u7B97\u7DE8\u8F2F","\u91CD\u65B0\u547D\u540D\u7B26\u865F","\u555F\u7528/\u505C\u7528\u91CD\u65B0\u547D\u540D\u524D\u5148\u9810\u89BD\u8B8A\u66F4\u7684\u529F\u80FD"],"vs/editor/contrib/rename/browser/renameInputField":["\u662F\u5426\u986F\u793A\u91CD\u65B0\u547D\u540D\u8F38\u5165\u5C0F\u5DE5\u5177","\u70BA\u8F38\u5165\u91CD\u65B0\u547D\u540D\u3002\u8ACB\u9375\u5165\u65B0\u540D\u7A31\uFF0C\u7136\u5F8C\u6309 Enter \u4EE5\u63D0\u4EA4\u3002","\u6309 {0} \u9032\u884C\u91CD\u65B0\u547D\u540D\uFF0C\u6309 {1} \u9032\u884C\u9810\u89BD"],"vs/editor/contrib/smartSelect/browser/smartSelect":["\u5C55\u958B\u9078\u53D6\u9805\u76EE","\u5C55\u958B\u9078\u53D6\u7BC4\u570D(&&E)","\u7E2E\u5C0F\u9078\u53D6\u9805\u76EE","\u58D3\u7E2E\u9078\u53D6\u7BC4\u570D(&&S)"],"vs/editor/contrib/snippet/browser/snippetController2":["\u7DE8\u8F2F\u5668\u76EE\u524D\u662F\u5426\u5728\u7A0B\u5F0F\u78BC\u7247\u6BB5\u6A21\u5F0F\u4E2D","\u5728\u7A0B\u5F0F\u78BC\u7247\u6BB5\u6A21\u5F0F\u4E2D\u662F\u5426\u6709\u4E0B\u4E00\u500B\u5B9A\u4F4D\u505C\u99D0\u9EDE","\u5728\u7A0B\u5F0F\u78BC\u7247\u6BB5\u6A21\u5F0F\u4E2D\u662F\u5426\u6709\u4E0A\u4E00\u500B\u5B9A\u4F4D\u505C\u99D0\u9EDE","\u79FB\u81F3\u4E0B\u4E00\u500B\u9810\u7559\u4F4D\u7F6E..."],"vs/editor/contrib/snippet/browser/snippetVariables":["\u661F\u671F\u5929","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D","\u9031\u65E5","\u9031\u4E00","\u9031\u4E8C","\u9031\u4E09","\u9031\u56DB","\u9031\u4E94","\u9031\u516D","\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708","1\u6708","2\u6708","3 \u6708","4\u6708","\u4E94\u6708","6\u6708","7 \u6708","8 \u6708","9 \u6708","10 \u6708","11 \u6708","12 \u6708"],"vs/editor/contrib/stickyScroll/browser/stickyScrollActions":["\u5207\u63DB\u7DE8\u8F2F\u5668\u81EA\u9ECF\u6372\u52D5","\u5207\u63DB\u7DE8\u8F2F\u5668\u81EA\u9ECF\u6372\u52D5(&&T)","\u81EA\u9ECF\u6372\u52D5","\u81EA\u9ECF\u6372\u52D5(&&S)","\u805A\u7126\u81EA\u9ECF\u6372\u52D5","\u7126\u9EDE\u81EA\u9ECF\u6372\u52D5(&&F)","\u9078\u53D6\u4E0B\u4E00\u500B\u81EA\u9ECF\u6372\u52D5\u884C","\u9078\u53D6\u4E0A\u4E00\u500B\u81EA\u9ECF\u6372\u52D5\u884C","\u79FB\u81F3\u805A\u7126\u7684\u81EA\u9ECF\u6372\u52D5\u884C","\u9078\u53D6\u7DE8\u8F2F\u5668"],"vs/editor/contrib/suggest/browser/suggest":["\u662F\u5426\u805A\u7126\u4EFB\u4F55\u5EFA\u8B70","\u662F\u5426\u986F\u793A\u5EFA\u8B70\u8A73\u7D30\u8CC7\u6599","\u662F\u5426\u6709\u591A\u500B\u5EFA\u8B70\u53EF\u4EE5\u6311\u9078","\u63D2\u5165\u76EE\u524D\u7684\u5EFA\u8B70\u6703\u7522\u751F\u8B8A\u66F4\uFF0C\u6216\u5DF2\u9375\u5165\u6240\u6709\u9805\u76EE","\u662F\u5426\u5728\u6309\u4E0B Enter \u6642\u63D2\u5165\u5EFA\u8B70","\u76EE\u524D\u7684\u5EFA\u8B70\u662F\u5426\u6709\u63D2\u5165\u548C\u53D6\u4EE3\u884C\u70BA","\u9810\u8A2D\u884C\u70BA\u662F\u63D2\u5165\u6216\u53D6\u4EE3","\u76EE\u524D\u7684\u5EFA\u8B70\u662F\u5426\u652F\u63F4\u89E3\u6C7A\u66F4\u591A\u8A73\u7D30\u8CC7\u6599"],"vs/editor/contrib/suggest/browser/suggestController":["\u63A5\u53D7 \u2018{0}\u2019 \u9032\u884C\u4E86\u5176\u4ED6 {1} \u9805\u7DE8\u8F2F","\u89F8\u767C\u5EFA\u8B70","\u63D2\u5165","\u63D2\u5165","\u53D6\u4EE3","\u53D6\u4EE3","\u63D2\u5165","\u986F\u793A\u66F4\u5C11","\u986F\u793A\u66F4\u591A","\u91CD\u8A2D\u5EFA\u8B70\u5C0F\u5DE5\u5177\u5927\u5C0F"],"vs/editor/contrib/suggest/browser/suggestWidget":["\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u908A\u754C\u8272\u5F69\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u524D\u666F\u8272\u5F69\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u6240\u9078\u9805\u76EE\u7684\u524D\u666F\u8272\u5F69\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u6240\u9078\u9805\u76EE\u7684\u5716\u793A\u524D\u666F\u8272\u5F69\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u6240\u9078\u9805\u76EE\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u76F8\u7B26\u9192\u76EE\u63D0\u793A\u7684\u8272\u5F69\u3002","\u7576\u9805\u76EE\u6210\u70BA\u7126\u9EDE\u6642\uFF0C\u76F8\u7B26\u9805\u76EE\u7684\u8272\u5F69\u5728\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u6703\u9192\u76EE\u986F\u793A\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u72C0\u614B\u7684\u524D\u666F\u8272\u5F69\u3002","\u6B63\u5728\u8F09\u5165...","\u7121\u5EFA\u8B70\u3002","\u5EFA\u8B70","{0} {1}\uFF0C{2}","{0} {1}","{0}\uFF0C{1}","{0}\uFF0C\u6587\u4EF6: {1}"],"vs/editor/contrib/suggest/browser/suggestWidgetDetails":["\u95DC\u9589","\u6B63\u5728\u8F09\u5165..."],"vs/editor/contrib/suggest/browser/suggestWidgetRenderer":["\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D [\u66F4\u591A\u8A73\u7D30\u8CC7\u8A0A] \u7684\u5716\u793A\u3002","\u95B1\u8B80\u66F4\u591A"],"vs/editor/contrib/suggest/browser/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/browser/symbolIcons":["\u9663\u5217\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5E03\u6797\u503C\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u985E\u5225\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u8272\u5F69\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5E38\u6578\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5EFA\u69CB\u51FD\u5F0F\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5217\u8209\u503C\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5217\u8209\u503C\u6210\u54E1\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u4E8B\u4EF6\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6B04\u4F4D\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6A94\u6848\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u8CC7\u6599\u593E\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u51FD\u5F0F\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u4ECB\u9762\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u7D22\u5F15\u9375\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u95DC\u9375\u5B57\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u65B9\u6CD5\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6A21\u7D44\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u547D\u540D\u7A7A\u9593\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","Null \u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6578\u5B57\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u7269\u4EF6\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u904B\u7B97\u5B50\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5957\u4EF6\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5C6C\u6027\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u53C3\u8003\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5B57\u4E32\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u7D50\u69CB\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6587\u5B57\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u578B\u5225\u53C3\u6578\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u55AE\u4F4D\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u8B8A\u6578\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002"],"vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode":["\u5207\u63DB TAB \u9375\u79FB\u52D5\u7126\u9EDE","\u6309 Tab \u73FE\u5728\u6703\u5C07\u7126\u9EDE\u79FB\u81F3\u4E0B\u4E00\u500B\u53EF\u8A2D\u5B9A\u7126\u9EDE\u7684\u5143\u7D20\u3002","\u6309 Tab \u73FE\u5728\u6703\u63D2\u5165\u5B9A\u4F4D\u5B57\u5143\u3002"],"vs/editor/contrib/tokenization/browser/tokenization":["\u958B\u767C\u4EBA\u54E1: \u5F37\u5236\u91CD\u65B0\u7F6E\u653E"],"vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter":["\u5EF6\u4F38\u6A21\u7D44\u7DE8\u8F2F\u5668\u4E2D\u986F\u793A\u542B\u6709\u8B66\u544A\u8A0A\u606F\u7684\u5716\u793A\u3002","\u6B64\u6587\u4EF6\u5305\u542B\u8A31\u591A\u975E\u57FA\u672C ASCII Unicode \u5B57\u5143","\u6B64\u6587\u4EF6\u5305\u542B\u8A31\u591A\u4E0D\u660E\u78BA\u7684 Unicode \u5B57\u5143","\u6B64\u6587\u4EF6\u5305\u542B\u8A31\u591A\u96B1\u85CF\u7684 Unicode \u5B57\u5143","\u8A2D\u5B9A Unicode \u9192\u76EE\u63D0\u793A\u9078\u9805","\u5B57\u5143 {0} \u53EF\u80FD\u8207 ASCII \u5B57\u5143 {1} \u6DF7\u6DC6\uFF0C\u9019\u5728\u539F\u59CB\u7A0B\u5F0F\u78BC\u4E2D\u6BD4\u8F03\u5E38\u898B\u3002","\u5B57\u5143 {0} \u53EF\u80FD\u8207\u5B57\u5143 {1} \u6DF7\u6DC6\uFF0C\u9019\u5728\u539F\u59CB\u7A0B\u5F0F\u78BC\u4E2D\u6BD4\u8F03\u5E38\u898B\u3002","\u5B57\u5143 {0} \u96B1\u85CF\u3002","\u5B57\u5143 {0} \u4E0D\u662F\u57FA\u672C\u7684 ASCII \u5B57\u5143\u3002","\u8ABF\u6574\u8A2D\u5B9A","\u505C\u7528\u8A3B\u89E3\u4E2D\u7684\u9192\u76EE\u63D0\u793A","\u505C\u7528\u8A3B\u89E3\u4E2D\u5B57\u5143\u7684\u9192\u76EE\u63D0\u793A","\u505C\u7528\u5B57\u4E32\u4E2D\u7684\u9192\u76EE\u63D0\u793A","\u505C\u7528\u5B57\u4E32\u4E2D\u5B57\u5143\u7684\u9192\u76EE\u63D0\u793A","\u505C\u7528\u4E0D\u660E\u78BA\u7684\u9192\u76EE\u63D0\u793A","\u505C\u7528\u4E0D\u660E\u78BA\u5B57\u5143\u7684\u9192\u76EE\u63D0\u793A","\u505C\u7528\u96B1\u85CF\u9192\u76EE\u63D0\u793A","\u505C\u7528\u96B1\u85CF\u5B57\u5143\u7684\u9192\u76EE\u63D0\u793A","\u505C\u7528\u975E ASCII \u9192\u76EE\u63D0\u793A","\u505C\u7528\u975E\u57FA\u672C ASCII \u5B57\u5143\u7684\u9192\u76EE\u63D0\u793A","\u986F\u793A\u6392\u9664\u9078\u9805","\u6392\u9664 {0} (\u96B1\u85CF\u5B57\u5143) \u7684\u53CD\u767D\u986F\u793A","\u5C07 {0} \u6392\u9664\u5728\u5DF2\u9192\u76EE\u63D0\u793A","\u5141\u8A31\u5728\u8A9E\u8A00\u300C{0}\u300D\u4E2D\u8F03\u5E38\u7528\u7684 Unicode \u5B57\u5143\u3002"],"vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators":["\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143","\u5075\u6E2C\u5230\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143","\u6A94\u6848 '{0}' \u5305\u542B\u4E00\u6216\u591A\u500B\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143\uFF0C\u4F8B\u5982\u884C\u5206\u9694\u7B26\u865F (LS) \u6216\u6BB5\u843D\u5206\u9694\u7B26\u865F (PS)\u3002\r\n\r\n\u5EFA\u8B70\u60A8\u5C07\u5176\u5F9E\u6A94\u6848\u4E2D\u79FB\u9664\u3002\u9019\u53EF\u4EE5\u900F\u904E `editor.unusualLineTerminators` \u9032\u884C\u8A2D\u5B9A\u3002","\u79FB\u9664\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143(&&R)","\u5FFD\u7565"],"vs/editor/contrib/wordHighlighter/browser/highlightDecorations":["\u8B80\u53D6\u6B0A\u9650\u671F\u9593 (\u5982\u8B80\u53D6\u8B8A\u6578) \u7B26\u865F\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5BEB\u5165\u6B0A\u9650\u671F\u9593 (\u5982\u5BEB\u5165\u8B8A\u6578) \u7B26\u865F\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7B26\u865F\u6587\u5B57\u51FA\u73FE\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u8B80\u53D6\u5B58\u53D6\u671F\u9593 (\u4F8B\u5982\u8B80\u53D6\u8B8A\u6578\u6642) \u7B26\u865F\u7684\u908A\u6846\u984F\u8272\u3002","\u5BEB\u5165\u5B58\u53D6\u671F\u9593 (\u4F8B\u5982\u5BEB\u5165\u8B8A\u6578\u6642) \u7B26\u865F\u7684\u908A\u6846\u984F\u8272\u3002 ","\u7B26\u865F\u6587\u5B57\u51FA\u73FE\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7B26\u865F\u9192\u76EE\u63D0\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5BEB\u5165\u6B0A\u9650\u7B26\u865F\u9192\u76EE\u63D0\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7B26\u865F\u6587\u5B57\u51FA\u73FE\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002"],"vs/editor/contrib/wordHighlighter/browser/wordHighlighter":["\u79FB\u81F3\u4E0B\u4E00\u500B\u53CD\u767D\u7B26\u865F","\u79FB\u81F3\u4E0A\u4E00\u500B\u53CD\u767D\u7B26\u865F","\u89F8\u767C\u7B26\u865F\u53CD\u767D\u986F\u793A"],"vs/editor/contrib/wordOperations/browser/wordOperations":["\u522A\u9664\u5B57\u7D44"],"vs/platform/action/common/actionCommonCategories":["\u958B\u767C\u4EBA\u54E1","\u6AA2\u8996","\u8AAA\u660E","\u6E2C\u8A66","\u6A94\u6848","\u559C\u597D\u8A2D\u5B9A"],"vs/platform/actionWidget/browser/actionList":["{0} \u4EE5\u5957\u7528\uFF0C{1} \u4EE5\u9810\u89BD","{0} \u4EE5\u7533\u8ACB","{0}\uFF0C\u505C\u7528\u539F\u56E0: {1}","\u52D5\u4F5C\u5C0F\u5DE5\u5177"],"vs/platform/actionWidget/browser/actionWidget":["\u52D5\u4F5C\u5217\u4E2D\u5207\u63DB\u52D5\u4F5C\u9805\u76EE\u7684\u80CC\u666F\u8272\u5F69\u3002","\u662F\u5426\u986F\u793A\u52D5\u4F5C\u5C0F\u5DE5\u5177\u6E05\u55AE","\u96B1\u85CF\u52D5\u4F5C\u5C0F\u5DE5\u5177","\u9078\u53D6\u4E0A\u4E00\u500B\u52D5\u4F5C","\u9078\u53D6\u4E0B\u4E00\u500B\u52D5\u4F5C","\u63A5\u53D7\u9078\u53D6\u7684\u52D5\u4F5C","\u9810\u89BD\u9078\u53D6\u7684\u52D5\u4F5C"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})","{0} ({1})",`{0}\r
+[{1}] {2}`],"vs/platform/actions/browser/toolbar":["\u96B1\u85CF","\u91CD\u8A2D\u529F\u80FD\u8868"],"vs/platform/actions/common/menuService":["\u96B1\u85CF '{0}'"],"vs/platform/audioCues/browser/audioCueService":["\u884C\u4E0A\u767C\u751F\u932F\u8AA4","\u932F\u8AA4","\u884C\u4E0A\u7684\u8B66\u544A","\u8B66\u544A","\u884C\u4E0A\u7684\u647A\u758A\u5340\u57DF","\u5DF2\u647A\u758A","\u884C\u4E0A\u7684\u4E2D\u65B7\u9EDE","\u4E2D\u65B7\u9EDE","\u884C\u4E0A\u7684\u5167\u5D4C\u5EFA\u8B70","\u7D42\u7AEF\u6A5F\u5FEB\u901F\u4FEE\u6B63","\u5FEB\u901F\u4FEE\u6B63","\u5728\u4E2D\u65B7\u9EDE\u505C\u6B62\u5075\u932F\u5DE5\u5177","\u4E2D\u65B7\u9EDE","\u884C\u4E0A\u6C92\u6709\u5D4C\u5165\u63D0\u793A","\u7121\u5167\u5D4C\u63D0\u793A","\u5DE5\u4F5C\u5B8C\u6210","\u5DE5\u4F5C\u5B8C\u6210","\u5DE5\u4F5C\u5931\u6557","\u5DE5\u4F5C\u5931\u6557","\u7D42\u7AEF\u6A5F\u547D\u4EE4\u5931\u6557","\u547D\u4EE4\u5931\u6557","\u7D42\u7AEF\u9234","\u7D42\u7AEF\u9234\u8072","Notebook \u5132\u5B58\u683C\u5DF2\u5B8C\u6210","Notebook \u5132\u5B58\u683C\u5DF2\u5B8C\u6210","Notebook \u5132\u5B58\u683C\u5931\u6557","Notebook \u5132\u5B58\u683C\u5931\u6557","\u5DEE\u7570\u884C\u5DF2\u63D2\u5165","\u5DEE\u7570\u884C\u5DF2\u522A\u9664","\u5DEE\u7570\u884C\u5DF2\u4FEE\u6539","\u804A\u5929\u8981\u6C42\u5DF2\u50B3\u9001","\u804A\u5929\u8981\u6C42\u5DF2\u50B3\u9001","\u804A\u5929\u56DE\u61C9\u5DF2\u63A5\u6536","\u804A\u5929\u56DE\u61C9\u64F1\u7F6E\u4E2D","\u804A\u5929\u56DE\u61C9\u64F1\u7F6E\u4E2D","\u6E05\u9664","\u6E05\u9664","\u5132\u5B58","\u5132\u5B58","\u683C\u5F0F","\u683C\u5F0F"],"vs/platform/configuration/common/configurationRegistry":["\u9810\u8A2D\u8A9E\u8A00\u7D44\u614B\u8986\u5BEB","\u8A2D\u5B9A\u8981\u91DD\u5C0D {0} \u8A9E\u8A00\u8986\u5BEB\u7684\u8A2D\u5B9A\u3002","\u8A2D\u5B9A\u8981\u91DD\u5C0D\u8A9E\u8A00\u8986\u5BEB\u7684\u7DE8\u8F2F\u5668\u8A2D\u5B9A\u3002","\u9019\u500B\u8A2D\u5B9A\u4E0D\u652F\u63F4\u4EE5\u8A9E\u8A00\u70BA\u6839\u64DA\u7684\u7D44\u614B\u3002","\u8A2D\u5B9A\u8981\u91DD\u5C0D\u8A9E\u8A00\u8986\u5BEB\u7684\u7DE8\u8F2F\u5668\u8A2D\u5B9A\u3002","\u9019\u500B\u8A2D\u5B9A\u4E0D\u652F\u63F4\u4EE5\u8A9E\u8A00\u70BA\u6839\u64DA\u7684\u7D44\u614B\u3002","\u7121\u6CD5\u8A3B\u518A\u7A7A\u767D\u5C6C\u6027","\u7121\u6CD5\u8A3B\u518A '{0}'\u3002\u9019\u7B26\u5408\u7528\u65BC\u63CF\u8FF0\u8A9E\u8A00\u5C08\u7528\u7DE8\u8F2F\u5668\u8A2D\u5B9A\u7684\u5C6C\u6027\u6A21\u5F0F '\\\\[.*\\\\]$'\u3002\u8ACB\u4F7F\u7528 'configurationDefaults' \u8CA2\u737B\u3002","\u7121\u6CD5\u8A3B\u518A '{0}'\u3002\u6B64\u5C6C\u6027\u5DF2\u7D93\u8A3B\u518A\u3002","\u7121\u6CD5\u8A3B\u518A '{0}'\u3002\u5DF2\u5411 {2} \u8A3B\u518A\u95DC\u806F\u7684\u539F\u5247 {1}\u3002"],"vs/platform/contextkey/browser/contextKeyService":["\u50B3\u56DE\u6709\u95DC\u5167\u5BB9\u7D22\u5F15\u9375\u8CC7\u8A0A\u7684\u547D\u4EE4"],"vs/platform/contextkey/common/contextkey":["\u7A7A\u7684\u5167\u5BB9\u7D22\u5F15\u9375\u904B\u7B97\u5F0F","\u60A8\u662F\u5426\u5FD8\u8A18\u64B0\u5BEB\u904B\u7B97\u5F0F? \u60A8\u4E5F\u53EF\u4EE5\u5206\u5225\u653E\u7F6E 'false' \u6216 'true'\uFF0C\u4EE5\u4E00\u5F8B\u8A55\u4F30\u70BA False \u6216 True\u3002","'not' \u5F8C\u70BA 'in'\u3002","\u53F3\u62EC\u5F27 ')'","\u672A\u9810\u671F\u7684\u6B0A\u6756","\u60A8\u662F\u5426\u5FD8\u8A18\u5728\u6B0A\u6756\u4E4B\u524D\u653E\u7F6E && \u6216 ||?","\u904B\u7B97\u5F0F\u672A\u9810\u671F\u7684\u7D50\u5C3E","\u60A8\u662F\u5426\u5FD8\u8A18\u653E\u7F6E\u5167\u5BB9\u91D1\u9470?",`\u9810\u671F: {0}\r
+\u6536\u5230: '{1}'\u3002`],"vs/platform/contextkey/common/contextkeys":["\u4F5C\u696D\u7CFB\u7D71\u662F\u5426\u70BA macOS","\u4F5C\u696D\u7CFB\u7D71\u662F\u5426\u70BA Linux","\u4F5C\u696D\u7CFB\u7D71\u662F\u5426\u70BA Windows","\u5E73\u53F0\u662F\u5426\u70BA\u7DB2\u9801\u700F\u89BD\u5668","\u975E\u700F\u89BD\u5668\u5E73\u53F0\u4E0A\u7684\u4F5C\u696D\u7CFB\u7D71\u662F\u5426\u70BA macOS","\u4F5C\u696D\u7CFB\u7D71\u662F\u5426\u70BA iOS","\u5E73\u81FA\u662F\u5426\u70BA\u884C\u52D5\u7DB2\u9801\u700F\u89BD\u5668","VS Code \u7684\u54C1\u8CEA\u985E\u578B","\u9375\u76E4\u7126\u9EDE\u662F\u5426\u4F4D\u65BC\u8F38\u5165\u65B9\u584A\u5167"],"vs/platform/contextkey/common/scanner":["\u60A8\u662F\u6307 '{0}'?","\u60A8\u662F\u6307 {0} \u6216 {1}?","\u60A8\u662F\u6307 {0}\u3001{1} \u6216 {2}?","\u60A8\u662F\u5426\u5FD8\u8A18\u5DE6\u62EC\u5F27\u6216\u53F3\u62EC\u5F27?","\u60A8\u662F\u5426\u5FD8\u8A18\u9038\u51FA '/' (\u659C\u7DDA) \u5B57\u5143? \u5728\u53CD\u659C\u7DDA\u524D\u653E\u5169\u500B\u53CD\u659C\u7DDA\u4EE5\u9038\u51FA\uFF0C\u4F8B\u5982 '\\\\/'\u3002"],"vs/platform/history/browser/contextScopedHistoryWidget":["\u662F\u5426\u986F\u793A\u5EFA\u8B70"],"vs/platform/keybinding/common/abstractKeybindingService":["\u5DF2\u6309\u4E0B ({0})\u3002\u7B49\u5F85\u7B2C\u4E8C\u500B\u5957\u7D22\u9375...","({0}) \u5DF2\u6309\u4E0B\u3002\u6B63\u5728\u7B49\u5F85\u4E0B\u4E00\u500B\u5957\u7D22\u9375...","\u6309\u9375\u7D44\u5408 ({0}, {1}) \u4E0D\u662F\u547D\u4EE4\u3002","\u6309\u9375\u7D44\u5408 ({0}, {1}) \u4E0D\u662F\u547D\u4EE4\u3002"],"vs/platform/list/browser/listService":["\u5DE5\u4F5C\u53F0","\u5C0D\u61C9Windows\u548CLinux\u7684'Control'\u8207\u5C0D\u61C9 macOS \u7684'Command'\u3002","\u5C0D\u61C9Windows\u548CLinux\u7684'Alt'\u8207\u5C0D\u61C9macOS\u7684'Option'\u3002","\u900F\u904E\u6ED1\u9F20\u591A\u9078\uFF0C\u7528\u65BC\u5728\u6A39\u72C0\u76EE\u9304\u8207\u6E05\u55AE\u4E2D\u65B0\u589E\u9805\u76EE\u7684\u8F14\u52A9\u6309\u9375 (\u4F8B\u5982\u5728\u7E3D\u7BA1\u4E2D\u958B\u555F\u7DE8\u8F2F\u5668 \u53CA SCM \u6AA2\u8996)\u3002'\u5728\u5074\u908A\u958B\u555F' \u6ED1\u9F20\u624B\u52E2 (\u82E5\u652F\u63F4) \u5C07\u6703\u9069\u61C9\u4EE5\u907F\u514D\u548C\u591A\u9078\u8F14\u52A9\u6309\u9375\u885D\u7A81\u3002","\u63A7\u5236\u5982\u4F55\u4F7F\u7528\u6ED1\u9F20 (\u5982\u652F\u63F4\u6B64\u7528\u6CD5) \u958B\u555F\u6A39\u72C0\u76EE\u9304\u8207\u6E05\u55AE\u4E2D\u7684\u9805\u76EE\u3002\u82E5\u4E0D\u9069\u7528\uFF0C\u67D0\u4E9B\u6A39\u72C0\u76EE\u9304\u8207\u6E05\u55AE\u53EF\u80FD\u6703\u9078\u64C7\u5FFD\u7565\u6B64\u8A2D\u5B9A\u3002","\u63A7\u5236\u5728\u5DE5\u4F5C\u53F0\u4E2D\uFF0C\u6E05\u55AE\u8207\u6A39\u72C0\u7D50\u69CB\u662F\u5426\u652F\u63F4\u6C34\u5E73\u6372\u52D5\u3002\u8B66\u544A: \u958B\u555F\u6B64\u8A2D\u5B9A\u5C07\u6703\u5F71\u97FF\u6548\u80FD\u3002","\u63A7\u5236\u6309\u4E00\u4E0B\u6372\u8EF8\u662F\u5426\u9010\u9801\u6372\u52D5\u3002","\u63A7\u5236\u6A39\u72C0\u7D50\u69CB\u7E2E\u6392 (\u50CF\u7D20)\u3002","\u63A7\u5236\u6A39\u7CFB\u662F\u5426\u61C9\u8F49\u8B6F\u7E2E\u6392\u8F14\u52A9\u7DDA\u3002","\u63A7\u5236\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u662F\u5426\u5177\u6709\u5E73\u6ED1\u6372\u52D5\u3002","\u8981\u7528\u65BC\u6ED1\u9F20\u6EFE\u8F2A\u6372\u52D5\u4E8B\u4EF6 `deltaX` \u548C `deltaY` \u7684\u4E58\u6578\u3002","\u6309\u4E0B `Alt` \u6642\u7684\u6372\u52D5\u901F\u5EA6\u4E58\u6578\u3002","\u641C\u5C0B\u6642\u6703\u9192\u76EE\u63D0\u793A\u5143\u7D20\u3002\u9032\u4E00\u6B65\u7684\u5411\u4E0A\u548C\u5411\u4E0B\u700F\u89BD\u53EA\u6703\u5468\u904A\u5DF2\u9192\u76EE\u63D0\u793A\u7684\u5143\u7D20\u3002","\u641C\u5C0B\u6642\u7BE9\u9078\u5143\u7D20\u3002","\u63A7\u5236 Workbench \u4E2D\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u7684\u9810\u8A2D\u5C0B\u627E\u6A21\u5F0F\u3002","\u6BD4\u5C0D\u6309\u9375\u8F38\u5165\u7684\u7C21\u6613\u6309\u9375\u700F\u89BD\u7126\u9EDE\u5143\u7D20\u3002\u50C5\u6BD4\u5C0D\u524D\u7F6E\u8A5E\u3002","\u9192\u76EE\u63D0\u793A\u9375\u76E4\u700F\u89BD\u6703\u9192\u76EE\u63D0\u793A\u7B26\u5408\u9375\u76E4\u8F38\u5165\u7684\u5143\u7D20\u3002\u9032\u4E00\u6B65\u5411\u4E0A\u6216\u5411\u4E0B\u700F\u89BD\u53EA\u6703\u5468\u904A\u9192\u76EE\u63D0\u793A\u7684\u5143\u7D20\u3002","\u7BE9\u9078\u9375\u76E4\u700F\u89BD\u6703\u7BE9\u6389\u4E26\u96B1\u85CF\u4E0D\u7B26\u5408\u9375\u76E4\u8F38\u5165\u7684\u6240\u6709\u5143\u7D20\u3002","\u63A7\u5236 Workbench \u4E2D\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u7684\u9375\u76E4\u700F\u89BD\u6A23\u5F0F\u3002\u53EF\u4EE5\u662F\u7C21\u6613\u7684\u3001\u9192\u76EE\u63D0\u793A\u548C\u7BE9\u9078\u3002","\u8ACB\u6539\u70BA\u4F7F\u7528 'workbench.list.defaultFindMode' \u548C 'workbench.list.typeNavigationMode'\u3002","\u641C\u5C0B\u6642\u4F7F\u7528\u6A21\u7CCA\u6BD4\u5C0D\u3002","\u641C\u5C0B\u6642\u4F7F\u7528\u9023\u7E8C\u6BD4\u5C0D\u3002","\u63A7\u5236\u5728\u5DE5\u4F5C\u53F0\u4E2D\u641C\u5C0B\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u6642\u6240\u4F7F\u7528\u7684\u6BD4\u5C0D\u985E\u578B\u3002","\u63A7\u5236\u7576\u6309\u4E0B\u8CC7\u6599\u593E\u540D\u7A31\u6642\uFF0C\u6A39\u72C0\u76EE\u9304\u8CC7\u6599\u593E\u7684\u5C55\u958B\u65B9\u5F0F\u3002\u8ACB\u6CE8\u610F\uFF0C\u82E5\u4E0D\u9069\u7528\uFF0C\u67D0\u4E9B\u6A39\u72C0\u76EE\u9304\u548C\u6E05\u55AE\u53EF\u80FD\u6703\u9078\u64C7\u5FFD\u7565\u6B64\u8A2D\u5B9A\u3002","\u63A7\u5236\u662F\u5426\u8981\u5728\u6A39\u72C0\u4E2D\u555F\u52D5\u9ECF\u6027\u6372\u52D5\u3002","\u63A7\u5236\u555F\u7528 `#workbench.tree.enableStickyScroll#` \u6642\uFF0C\u6A39\u72C0\u4E2D\u986F\u793A\u7684\u9ECF\u6027\u5143\u7D20\u6578\u76EE\u3002","\u63A7\u5236\u5DE5\u4F5C\u53F0\u4E2D\u6E05\u55AE\u548C\u6A39\u72C0\u76EE\u9304\u7684\u985E\u578B\u700F\u89BD\u904B\u4F5C\u65B9\u5F0F\u3002\u8A2D\u5B9A\u70BA 'trigger' \u6642\uFF0C\u985E\u578B\u700F\u89BD\u6703\u5728\u57F7\u884C 'list.triggerTypeNavigation' \u547D\u4EE4\u6642\u96A8\u5373\u958B\u59CB\u3002"],"vs/platform/markers/common/markers":["\u932F\u8AA4","\u8B66\u544A","\u8CC7\u8A0A"],"vs/platform/quickinput/browser/commandsQuickAccess":["\u6700\u8FD1\u4F7F\u7528\u7684","\u985E\u4F3C\u7684\u547D\u4EE4","\u7D93\u5E38\u4F7F\u7528","\u5176\u4ED6\u547D\u4EE4","\u985E\u4F3C\u7684\u547D\u4EE4","{0}, {1}","\u547D\u4EE4 '{0}' \u9020\u6210\u932F\u8AA4"],"vs/platform/quickinput/browser/helpQuickAccess":["{0}, {1}"],"vs/platform/quickinput/browser/quickInput":["\u4E0A\u4E00\u9801","\u6309 'Enter' \u9375\u78BA\u8A8D\u60A8\u7684\u8F38\u5165\u6216\u6309 'Esc' \u9375\u53D6\u6D88","{0}/{1}","\u8F38\u5165\u4EE5\u7E2E\u5C0F\u7D50\u679C\u7BC4\u570D\u3002"],"vs/platform/quickinput/browser/quickInputController":["\u5207\u63DB\u6240\u6709\u6838\u53D6\u65B9\u584A","{0} \u500B\u7D50\u679C","\u5DF2\u9078\u64C7 {0}","\u78BA\u5B9A","\u81EA\u8A02","\u80CC\u9762 ({0})","\u8FD4\u56DE"],"vs/platform/quickinput/browser/quickInputList":["\u5FEB\u901F\u8F38\u5165"],"vs/platform/quickinput/browser/quickInputUtils":["\u6309\u4E00\u4E0B\u4EE5\u57F7\u884C\u547D\u4EE4 \u2018{0}\u2019"],"vs/platform/theme/common/colorRegistry":["\u6574\u9AD4\u7684\u524D\u666F\u8272\u5F69\u3002\u50C5\u7576\u672A\u88AB\u4EFB\u4F55\u5143\u4EF6\u8986\u758A\u6642\uFF0C\u624D\u6703\u4F7F\u7528\u6B64\u8272\u5F69\u3002","\u5DF2\u505C\u7528\u5143\u7D20\u7684\u6574\u9AD4\u524D\u666F\u3002\u53EA\u6709\u5728\u5143\u4EF6\u672A\u8986\u84CB\u6642\uFF0C\u624D\u80FD\u4F7F\u7528\u9019\u500B\u8272\u5F69\u3002","\u6574\u9AD4\u932F\u8AA4\u8A0A\u606F\u7684\u524D\u666F\u8272\u5F69\u3002\u50C5\u7576\u672A\u88AB\u4EFB\u4F55\u5143\u4EF6\u8986\u84CB\u6642\uFF0C\u624D\u6703\u4F7F\u7528\u6B64\u8272\u5F69\u3002","\u63D0\u4F9B\u9644\u52A0\u8A0A\u606F\u7684\u524D\u666F\u984F\u8272,\u4F8B\u5982\u6A19\u7C64","\u5DE5\u4F5C\u53F0\u4E2D\u5716\u793A\u7684\u9810\u8A2D\u8272\u5F69\u3002","\u7126\u9EDE\u9805\u76EE\u7684\u6574\u9AD4\u6846\u7DDA\u8272\u5F69\u3002\u53EA\u5728\u6C92\u6709\u4EFB\u4F55\u5143\u4EF6\u8986\u5BEB\u6B64\u8272\u5F69\u6642\uFF0C\u624D\u6703\u52A0\u4EE5\u4F7F\u7528\u3002","\u9805\u76EE\u5468\u570D\u7684\u984D\u5916\u6846\u7DDA\uFF0C\u53EF\u5C07\u9805\u76EE\u5F9E\u5176\u4ED6\u9805\u76EE\u4E2D\u5340\u9694\u51FA\u4F86\u4EE5\u63D0\u9AD8\u5C0D\u6BD4\u3002","\u4F7F\u7528\u4E2D\u9805\u76EE\u5468\u570D\u7684\u984D\u5916\u908A\u754C\uFF0C\u53EF\u5C07\u9805\u76EE\u5F9E\u5176\u4ED6\u9805\u76EE\u4E2D\u5340\u9694\u51FA\u4F86\u4EE5\u63D0\u9AD8\u5C0D\u6BD4\u3002","\u4F5C\u696D\u5340\u57DF\u9078\u53D6\u7684\u80CC\u666F\u984F\u8272(\u4F8B\u5982\u8F38\u5165\u6216\u6587\u5B57\u5340\u57DF)\u3002\u8ACB\u6CE8\u610F\uFF0C\u9019\u4E0D\u9069\u7528\u65BC\u7DE8\u8F2F\u5668\u4E2D\u7684\u9078\u53D6\u3002","\u6587\u5B57\u5206\u9694\u7B26\u865F\u7684\u984F\u8272\u3002","\u5167\u6587\u9023\u7D50\u7684\u524D\u666F\u8272\u5F69","\u7576\u6ED1\u9F20\u9EDE\u64CA\u6216\u61F8\u505C\u6642\uFF0C\u6587\u5B57\u4E2D\u9023\u7D50\u7684\u524D\u666F\u8272\u5F69\u3002","\u63D0\u793A\u53CA\u5EFA\u8B70\u6587\u5B57\u7684\u524D\u666F\u8272\u5F69\u3002","\u9810\u5148\u683C\u5F0F\u5316\u6587\u5B57\u5340\u6BB5\u7684\u80CC\u666F\u8272\u5F69\u3002","\u6587\u5167\u5F15\u7528\u5340\u584A\u80CC\u666F\u8272\u5F69\u3002","\u5F15\u7528\u6587\u5B57\u7684\u6846\u7DDA\u984F\u8272\u3002","\u6587\u5B57\u5340\u584A\u7684\u80CC\u666F\u984F\u8272\u3002","\u5C0F\u5DE5\u5177\u7684\u9670\u5F71\u8272\u5F69\uFF0C\u4F8B\u5982\u7DE8\u8F2F\u5668\u4E2D\u7684\u5C0B\u627E/\u53D6\u4EE3\u3002","\u5C0F\u5DE5\u5177\u7684\u6846\u7DDA\u8272\u5F69\uFF0C\u4F8B\u5982\u7DE8\u8F2F\u5668\u4E2D\u7684\u5C0B\u627E/\u53D6\u4EE3\u3002","\u8F38\u5165\u65B9\u584A\u7684\u80CC\u666F\u3002","\u8F38\u5165\u65B9\u584A\u7684\u524D\u666F\u3002","\u8F38\u5165\u65B9\u584A\u7684\u6846\u7DDA\u3002","\u8F38\u5165\u6B04\u4F4D\u4E2D\u53EF\u4F7F\u7528\u4E4B\u9805\u76EE\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u5728\u8F38\u5165\u6B04\u4F4D\u4E2D\u6240\u555F\u52D5\u9078\u9805\u7684\u80CC\u666F\u8272\u5F69\u3002","\u8F38\u5165\u6B04\u4F4D\u4E2D\u9078\u9805\u7684\u80CC\u666F\u66AB\u7559\u8272\u5F69\u3002","\u5728\u8F38\u5165\u6B04\u4F4D\u4E2D\u6240\u555F\u52D5\u9078\u9805\u7684\u524D\u666F\u8272\u5F69\u3002","\u6587\u5B57\u8F38\u5165\u66FF\u4EE3\u5B57\u7B26\u7684\u524D\u666F\u984F\u8272\u3002","\u8CC7\u8A0A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u80CC\u666F\u8272\u5F69\u3002","\u8CC7\u8A0A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u524D\u666F\u8272\u5F69\u3002","\u8CC7\u8A0A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u908A\u754C\u8272\u5F69\u3002","\u8B66\u544A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u80CC\u666F\u8272\u5F69\u3002","\u8B66\u544A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u524D\u666F\u8272\u5F69\u3002","\u8B66\u544A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u908A\u754C\u8272\u5F69\u3002","\u932F\u8AA4\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u80CC\u666F\u8272\u5F69\u3002","\u932F\u8AA4\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u524D\u666F\u8272\u5F69\u3002","\u932F\u8AA4\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u908A\u754C\u8272\u5F69\u3002","\u4E0B\u62C9\u5F0F\u6E05\u55AE\u7684\u80CC\u666F\u3002","\u4E0B\u62C9\u5F0F\u6E05\u55AE\u7684\u80CC\u666F\u3002","\u4E0B\u62C9\u5F0F\u6E05\u55AE\u7684\u524D\u666F\u3002","\u4E0B\u62C9\u5F0F\u6E05\u55AE\u7684\u6846\u7DDA\u3002","\u6309\u9215\u524D\u666F\u8272\u5F69\u3002","\u5206\u9694\u7DDA\u8272\u5F69\u6309\u9215\u3002","\u6309\u9215\u80CC\u666F\u8272\u5F69\u3002","\u66AB\u7559\u6642\u7684\u6309\u9215\u80CC\u666F\u8272\u5F69\u3002","\u6309\u9215\u6846\u7DDA\u8272\u5F69\u3002","\u6B21\u8981\u6309\u9215\u524D\u666F\u8272\u5F69\u3002","\u6B21\u8981\u6309\u9215\u80CC\u666F\u8272\u5F69\u3002","\u6ED1\u9F20\u66AB\u7559\u6642\u7684\u6B21\u8981\u6309\u9215\u80CC\u666F\u8272\u5F69\u3002","\u6A19\u8A18\u7684\u80CC\u666F\u984F\u8272\u3002\u6A19\u8A18\u70BA\u5C0F\u578B\u7684\u8A0A\u606F\u6A19\u7C64,\u4F8B\u5982\u641C\u5C0B\u7D50\u679C\u7684\u6578\u91CF\u3002","\u6A19\u8A18\u7684\u524D\u666F\u984F\u8272\u3002\u6A19\u8A18\u70BA\u5C0F\u578B\u7684\u8A0A\u606F\u6A19\u7C64,\u4F8B\u5982\u641C\u5C0B\u7D50\u679C\u7684\u6578\u91CF\u3002","\u6307\u51FA\u5728\u6372\u52D5\u8A72\u6AA2\u8996\u7684\u6372\u8EF8\u9670\u5F71\u3002","\u6372\u8EF8\u6ED1\u687F\u7684\u80CC\u666F\u984F\u8272\u3002","\u52D5\u614B\u986F\u793A\u6642\u6372\u8EF8\u6ED1\u687F\u7684\u80CC\u666F\u984F\u8272\u3002","\u7576\u9EDE\u64CA\u6642\u6372\u8EF8\u6ED1\u687F\u7684\u80CC\u666F\u984F\u8272\u3002","\u9577\u6642\u9593\u904B\u884C\u9032\u5EA6\u689D\u7684\u80CC\u666F\u8272\u5F69.","\u7DE8\u8F2F\u5668\u4E2D\u932F\u8AA4\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u5167\u932F\u8AA4\u63D0\u793A\u7DDA\u7684\u524D\u666F\u8272\u5F69.","\u5982\u679C\u8A2D\u5B9A\uFF0C\u7DE8\u8F2F\u5668\u4E2D\u7684\u932F\u8AA4\u6703\u986F\u793A\u96D9\u5E95\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4E2D\u8B66\u544A\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u5167\u8B66\u544A\u63D0\u793A\u7DDA\u7684\u524D\u666F\u8272\u5F69.","\u5982\u679C\u8A2D\u5B9A\uFF0C\u7DE8\u8F2F\u5668\u4E2D\u7684\u8B66\u544A\u6703\u986F\u793A\u96D9\u5E95\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4E2D\u8CC7\u8A0A\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u5167\u8CC7\u8A0A\u63D0\u793A\u7DDA\u7684\u524D\u666F\u8272\u5F69","\u5982\u679C\u8A2D\u5B9A\uFF0C\u7DE8\u8F2F\u5668\u4E2D\u7684\u63D0\u793A\u6703\u986F\u793A\u96D9\u5E95\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u5167\u63D0\u793A\u8A0A\u606F\u7684\u63D0\u793A\u7DDA\u524D\u666F\u8272\u5F69","\u5982\u679C\u8A2D\u5B9A\uFF0C\u7DE8\u8F2F\u5668\u4E2D\u7684\u63D0\u793A\u6703\u986F\u793A\u96D9\u5E95\u7DDA\u8272\u5F69\u3002","\u4F7F\u7528\u4E2D\u98FE\u5E36\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u7684\u80CC\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u7684\u9810\u8A2D\u524D\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4E2D\u9ECF\u6027\u6EFE\u52D5\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5728\u7DE8\u8F2F\u5668\u66AB\u7559\u6642\u6642\uFF0C\u9ECF\u6027\u6EFE\u52D5\u7684\u80CC\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4E2D\u81EA\u9ECF\u6372\u52D5\u7684\u908A\u754C\u8272\u5F69"," \u7DE8\u8F2F\u5668\u4E2D\u81EA\u9ECF\u6372\u52D5\u7684\u9670\u5F71\u8272\u5F69","\u7DE8\u8F2F\u5668\u5C0F\u5DE5\u5177\u7684\u80CC\u666F\u8272\u5F69\uFF0C\u4F8B\u5982\u5C0B\u627E/\u53D6\u4EE3\u3002","\u7DE8\u8F2F\u5668\u5C0F\u5DE5\u5177 (\u4F8B\u5982\u5C0B\u627E/\u53D6\u4EE3) \u7684\u524D\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u5C0F\u5DE5\u5177\u7684\u908A\u754C\u8272\u5F69\u3002\u5C0F\u5DE5\u5177\u9078\u64C7\u64C1\u6709\u908A\u754C\u6216\u8272\u5F69\u672A\u88AB\u5C0F\u5DE5\u5177\u8986\u5BEB\u6642\uFF0C\u624D\u6703\u4F7F\u7528\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u5C0F\u5DE5\u5177\u4E4B\u8ABF\u6574\u5927\u5C0F\u5217\u7684\u908A\u754C\u8272\u5F69\u3002\u53EA\u5728\u5C0F\u5DE5\u5177\u9078\u64C7\u5177\u6709\u8ABF\u6574\u5927\u5C0F\u908A\u754C\u4E14\u672A\u8986\u5BEB\u8A72\u8272\u5F69\u6642\uFF0C\u624D\u4F7F\u7528\u8A72\u8272\u5F69\u3002","\u5FEB\u901F\u9078\u64C7\u5668\u80CC\u666F\u8272\u5F69\u3002\u8A72\u5FEB\u901F\u9078\u64C7\u5668\u5C0F\u5DE5\u5177\u662F\u985E\u4F3C\u547D\u4EE4\u9078\u64C7\u5340\u7684\u9078\u64C7\u5668\u5BB9\u5668\u3002","\u5FEB\u901F\u9078\u64C7\u5668\u524D\u666F\u8272\u5F69\u3002\u5FEB\u901F\u9078\u64C7\u5668\u5C0F\u5DE5\u5177\u662F\u985E\u4F3C\u547D\u4EE4\u9078\u64C7\u5340\u7B49\u9078\u64C7\u5668\u7684\u5BB9\u5668\u3002","\u5FEB\u901F\u9078\u64C7\u5668\u6A19\u984C\u80CC\u666F\u8272\u5F69\u3002\u5FEB\u901F\u9078\u64C7\u5668\u5C0F\u5DE5\u5177\u662F\u985E\u4F3C\u547D\u4EE4\u9078\u64C7\u5340\u7684\u9078\u64C7\u5668\u5BB9\u5668\u3002","\u5206\u7D44\u6A19\u7C64\u7684\u5FEB\u901F\u9078\u64C7\u5668\u8272\u5F69\u3002","\u5206\u7D44\u908A\u754C\u7684\u5FEB\u901F\u9078\u64C7\u5668\u8272\u5F69\u3002","\u91D1\u9470\u7D81\u5B9A\u6A19\u7C64\u80CC\u666F\u8272\u5F69\u3002\u6309\u9375\u7D81\u5B9A\u6A19\u7C64\u7528\u4F86\u4EE3\u8868\u9375\u76E4\u5FEB\u901F\u9375\u3002","\u91D1\u9470\u7D81\u5B9A\u6A19\u7C64\u524D\u666F\u8272\u5F69\u3002\u6309\u9375\u7D81\u5B9A\u6A19\u7C64\u7528\u4F86\u4EE3\u8868\u9375\u76E4\u5FEB\u901F\u9375\u3002","\u91D1\u9470\u7D81\u5B9A\u6A19\u7C64\u908A\u6846\u8272\u5F69\u3002\u6309\u9375\u7D81\u5B9A\u6A19\u7C64\u7528\u4F86\u4EE3\u8868\u9375\u76E4\u5FEB\u901F\u9375\u3002","\u91D1\u9470\u7D81\u5B9A\u6A19\u7C64\u908A\u6846\u5E95\u90E8\u8272\u5F69\u3002\u6309\u9375\u7D81\u5B9A\u6A19\u7C64\u7528\u4F86\u4EE3\u8868\u9375\u76E4\u5FEB\u901F\u9375\u3002","\u7DE8\u8F2F\u5668\u9078\u53D6\u7BC4\u570D\u7684\u8272\u5F69\u3002","\u70BA\u9078\u53D6\u7684\u6587\u5B57\u984F\u8272\u9AD8\u5C0D\u6BD4\u5316","\u975E\u4F7F\u7528\u4E2D\u7DE8\u8F2F\u5668\u5167\u7684\u9078\u53D6\u9805\u76EE\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u8207\u9078\u53D6\u9805\u76EE\u5167\u5BB9\u76F8\u540C\u4E4B\u5340\u57DF\u7684\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u9078\u53D6\u6642\uFF0C\u5167\u5BB9\u76F8\u540C\u4E4B\u5340\u57DF\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7B26\u5408\u76EE\u524D\u641C\u5C0B\u7684\u8272\u5F69\u3002","\u5176\u4ED6\u641C\u5C0B\u76F8\u7B26\u9805\u76EE\u7684\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u9650\u5236\u641C\u5C0B\u4E4B\u7BC4\u570D\u7684\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7B26\u5408\u76EE\u524D\u641C\u5C0B\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7B26\u5408\u5176\u4ED6\u641C\u5C0B\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u9650\u5236\u641C\u5C0B\u4E4B\u7BC4\u570D\u7684\u6846\u7DDA\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u641C\u5C0B\u7DE8\u8F2F\u5668\u67E5\u8A62\u7B26\u5408\u7684\u8272\u5F69\u3002","\u641C\u7D22\u7DE8\u8F2F\u5668\u67E5\u8A62\u7B26\u5408\u7684\u908A\u6846\u8272\u5F69\u3002","\u641C\u5C0B Viewlet \u5B8C\u6210\u8A0A\u606F\u4E2D\u6587\u5B57\u7684\u8272\u5F69\u3002","\u5728\u986F\u793A\u52D5\u614B\u986F\u793A\u7684\u6587\u5B57\u4E0B\u9192\u76EE\u63D0\u793A\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u52D5\u614B\u986F\u793A\u7684\u80CC\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u52D5\u614B\u986F\u793A\u7684\u524D\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u52D5\u614B\u986F\u793A\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u66AB\u7559\u72C0\u614B\u5217\u7684\u80CC\u666F\u8272\u5F69\u3002","\u4F7F\u7528\u4E2D\u4E4B\u9023\u7D50\u7684\u8272\u5F69\u3002","\u5167\u5D4C\u63D0\u793A\u7684\u524D\u666F\u8272\u5F69","\u5167\u5D4C\u63D0\u793A\u7684\u80CC\u666F\u8272\u5F69","\u985E\u578B\u5167\u5D4C\u63D0\u793A\u7684\u524D\u666F\u8272\u5F69","\u985E\u578B\u5167\u5D4C\u63D0\u793A\u7684\u80CC\u666F\u8272\u5F69","\u53C3\u6578\u5167\u5D4C\u63D0\u793A\u7684\u524D\u666F\u8272\u5F69","\u53C3\u6578\u5167\u5D4C\u63D0\u793A\u7684\u80CC\u666F\u8272\u5F69","\u7528\u65BC\u71C8\u6CE1\u52D5\u4F5C\u5716\u793A\u7684\u8272\u5F69\u3002","\u7528\u65BC\u71C8\u6CE1\u81EA\u52D5\u4FEE\u6B63\u52D5\u4F5C\u5716\u793A\u7684\u8272\u5F69\u3002","\u71C8\u6CE1 AI \u5716\u793A\u4F7F\u7528\u7684\u8272\u5F69\u3002","\u5DF2\u63D2\u5165\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5DF2\u79FB\u9664\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5DF2\u63D2\u5165\u7A0B\u5F0F\u884C\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5DF2\u79FB\u9664\u7A0B\u5F0F\u884C\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u63D2\u5165\u7A0B\u5F0F\u884C\u6240\u5728\u908A\u754C\u7684\u80CC\u666F\u8272\u5F69\u3002","\u79FB\u9664\u7A0B\u5F0F\u884C\u6240\u5728\u908A\u754C\u7684\u80CC\u666F\u8272\u5F69\u3002","\u63D2\u5165\u5167\u5BB9\u7684\u5DEE\u7570\u6982\u89C0\u5C3A\u898F\u524D\u666F\u3002","\u79FB\u9664\u5167\u5BB9\u7684\u5DEE\u7570\u6982\u89C0\u5C3A\u898F\u524D\u666F\u3002","\u63D2\u5165\u7684\u6587\u5B57\u5916\u6846\u8272\u5F69\u3002","\u79FB\u9664\u7684\u6587\u5B57\u5916\u6846\u8272\u5F69\u3002","\u5169\u500B\u6587\u5B57\u7DE8\u8F2F\u5668\u4E4B\u9593\u7684\u6846\u7DDA\u8272\u5F69\u3002","Diff \u7DE8\u8F2F\u5668\u7684\u659C\u7D0B\u586B\u6EFF\u8272\u5F69\u3002\u659C\u7D0B\u586B\u6EFF\u7528\u65BC\u4E26\u6392 Diff \u6AA2\u8996\u3002","Diff \u7DE8\u8F2F\u5668\u4E2D\u672A\u8B8A\u66F4\u5340\u584A\u7684\u80CC\u666F\u8272\u5F69\u3002","Diff \u7DE8\u8F2F\u5668\u4E2D\u672A\u8B8A\u66F4\u5340\u584A\u7684\u524D\u666F\u8272\u5F69\u3002","Diff \u7DE8\u8F2F\u5668\u4E2D\u672A\u8B8A\u66F4\u7A0B\u5F0F\u78BC\u7684\u80CC\u666F\u8272\u5F69\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u5916\u6846\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u4E26\u5DF2\u9078\u53D6\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u5916\u6846\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u5177\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u6240\u9078\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u6240\u9078\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u6240\u9078\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u5716\u793A\u524D\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u975E\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u6240\u9078\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u6240\u9078\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u975E\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u6240\u9078\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u5716\u793A\u524D\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u975E\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u70BA\u975E\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u5916\u6846\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u4F7F\u7528\u6ED1\u9F20\u66AB\u7559\u5728\u9805\u76EE\u6642\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u3002","\u6ED1\u9F20\u66AB\u7559\u5728\u9805\u76EE\u6642\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u3002","\u4F7F\u7528\u6ED1\u9F20\u5C07\u9805\u76EE\u79FB\u5230\u5176\u4ED6\u9805\u76EE\u4E0A\u6642\u7684\u6E05\u55AE/\u6A39\u72C0\u62D6\u653E\u80CC\u666F\u3002","\u4F7F\u7528\u6ED1\u9F20\u79FB\u52D5\u9805\u76EE\u6642\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u62D6\u653E\u908A\u754C\u8272\u5F69\u3002","\u5728\u6E05\u55AE/\u6A39\u72C0\u5167\u641C\u5C0B\u6642\uFF0C\u76F8\u7B26\u9192\u76EE\u63D0\u793A\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u8272\u5F69\u3002","\u5728\u6E05\u55AE/\u6A39\u72C0\u5167\u641C\u5C0B\u6642\uFF0C\u76F8\u7B26\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u7D50\u69CB\u524D\u666F\u8272\u5F69\u6703\u91DD\u5C0D\u4E3B\u52D5\u7126\u9EDE\u9805\u76EE\u9032\u884C\u5F37\u8ABF\u986F\u793A\u3002","\u5217\u8868/\u6A39\u72C0 \u7121\u6548\u9805\u76EE\u7684\u524D\u666F\u8272\u5F69\uFF0C\u4F8B\u5982\u5728\u700F\u89BD\u8996\u7A97\u7121\u6CD5\u89E3\u6790\u7684\u6839\u76EE\u9304","\u5305\u542B\u932F\u8AA4\u6E05\u55AE\u9805\u76EE\u7684\u524D\u666F\u8272\u5F69","\u5305\u542B\u8B66\u544A\u6E05\u55AE\u9805\u76EE\u7684\u524D\u666F\u8272\u5F69","\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u4E2D\u985E\u578B\u7BE9\u9078\u5C0F\u5DE5\u5177\u7684\u80CC\u666F\u8272\u5F69\u3002","\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u4E2D\u985E\u578B\u7BE9\u9078\u5C0F\u5DE5\u5177\u7684\u5927\u7DB1\u8272\u5F69\u3002","\u5728\u6C92\u6709\u76F8\u7B26\u9805\u76EE\u6642\uFF0C\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u4E2D\u985E\u578B\u7BE9\u9078\u5C0F\u5DE5\u5177\u7684\u5927\u7DB1\u8272\u5F69\u3002","\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u4E2D\u985E\u578B\u7BE9\u9078\u5C0F\u5DE5\u5177\u7684\u9670\u5F71\u8272\u5F69\u3002","\u5DF2\u7BE9\u9078\u76F8\u7B26\u9805\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5DF2\u7BE9\u9078\u76F8\u7B26\u9805\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u6A39\u72C0\u7B46\u89F8\u8272\u5F69\u3002","\u975E\u4F7F\u7528\u4E2D\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u6A39\u72C0\u7B46\u89F8\u8272\u5F69\u3002","\u8CC7\u6599\u884C\u4E4B\u9593\u7684\u8CC7\u6599\u8868\u908A\u754C\u8272\u5F69\u3002","\u5947\u6578\u8CC7\u6599\u8868\u8CC7\u6599\u5217\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5DF2\u53D6\u6D88\u5F37\u8ABF\u7684\u6E05\u55AE/\u6A39\u72C0\u7D50\u69CB\u524D\u666F\u8272\u5F69\u3002","\u6838\u53D6\u65B9\u584A\u5C0F\u5DE5\u5177\u7684\u80CC\u666F\u8272\u5F69\u3002","\u9078\u53D6\u5176\u6240\u8655\u5143\u7D20\u6642\uFF0C\u6838\u53D6\u65B9\u584A\u5C0F\u5DE5\u5177\u7684\u80CC\u666F\u8272\u5F69\u3002","\u6838\u53D6\u65B9\u584A\u5C0F\u5DE5\u5177\u7684\u524D\u666F\u8272\u5F69\u3002","\u6838\u53D6\u65B9\u584A\u5C0F\u5DE5\u5177\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u9078\u53D6\u5176\u6240\u8655\u5143\u7D20\u6642\uFF0C\u6838\u53D6\u65B9\u584A\u5C0F\u5DE5\u5177\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u8ACB\u6539\u7528 quickInputList.focusBackground","\u7126\u9EDE\u9805\u76EE\u7684\u5FEB\u901F\u9078\u64C7\u5668\u524D\u666F\u8272\u5F69\u3002","\u7126\u9EDE\u9805\u76EE\u7684\u5FEB\u901F\u9078\u64C7\u5668\u5716\u793A\u524D\u666F\u8272\u5F69\u3002","\u7126\u9EDE\u9805\u76EE\u7684\u5FEB\u901F\u9078\u64C7\u5668\u80CC\u666F\u8272\u5F69\u3002","\u529F\u80FD\u8868\u7684\u908A\u6846\u8272\u5F69\u3002","\u529F\u80FD\u8868\u9805\u76EE\u7684\u524D\u666F\u8272\u5F69\u3002","\u529F\u80FD\u8868\u9805\u76EE\u7684\u80CC\u666F\u8272\u5F69\u3002","\u529F\u80FD\u8868\u4E2D\u6240\u9078\u529F\u80FD\u8868\u9805\u76EE\u7684\u524D\u666F\u8272\u5F69\u3002","\u529F\u80FD\u8868\u4E2D\u6240\u9078\u529F\u80FD\u8868\u9805\u76EE\u7684\u80CC\u666F\u8272\u5F69\u3002","\u529F\u80FD\u8868\u4E2D\u6240\u9078\u529F\u80FD\u8868\u9805\u76EE\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u529F\u80FD\u8868\u4E2D\u5206\u9694\u7DDA\u529F\u80FD\u8868\u9805\u76EE\u7684\u8272\u5F69\u3002","\u4F7F\u7528\u6ED1\u9F20\u5C07\u6E38\u6A19\u505C\u7559\u5728\u52D5\u4F5C\u4E0A\u65B9\u6642\u7684\u5DE5\u5177\u5217\u80CC\u666F","\u4F7F\u7528\u6ED1\u9F20\u5C07\u6E38\u6A19\u505C\u7559\u5728\u52D5\u4F5C\u4E0A\u65B9\u6642\u7684\u5DE5\u5177\u5217\u5916\u6846","\u5C07\u6ED1\u9F20\u79FB\u5230\u52D5\u4F5C\u4E0A\u65B9\u6642\u7684\u5DE5\u5177\u5217\u80CC\u666F","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5B9A\u4F4D\u505C\u99D0\u9EDE\u7684\u53CD\u767D\u986F\u793A\u80CC\u666F\u8272\u5F69\u3002","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5B9A\u4F4D\u505C\u99D0\u9EDE\u7684\u53CD\u767D\u986F\u793A\u908A\u754C\u8272\u5F69\u3002","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u6700\u7D42\u5B9A\u4F4D\u505C\u99D0\u9EDE\u7684\u53CD\u767D\u986F\u793A\u80CC\u666F\u8272\u5F69\u3002","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u6700\u7D42\u5B9A\u4F4D\u505C\u99D0\u9EDE\u7684\u9192\u76EE\u63D0\u793A\u6846\u7DDA\u8272\u5F69\u3002","\u7126\u9EDE\u968E\u5C64\u9023\u7D50\u9805\u76EE\u7684\u8272\u5F69\u3002","\u968E\u5C64\u9023\u7D50\u7684\u80CC\u666F\u8272\u3002","\u7126\u9EDE\u968E\u5C64\u9023\u7D50\u9805\u76EE\u7684\u8272\u5F69\u3002","\u6240\u9078\u968E\u5C64\u9023\u7D50\u9805\u76EE\u7684\u8272\u5F69\u3002","\u968E\u5C64\u9023\u7D50\u9805\u76EE\u9078\u64C7\u5668\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5167\u5D4C\u5408\u4F75\u885D\u7A81\u4E2D\u76EE\u524D\u7684\u6A19\u982D\u80CC\u666F\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5167\u5D4C\u5408\u4F75\u885D\u7A81\u4E2D\u7684\u76EE\u524D\u5167\u5BB9\u80CC\u666F\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5167\u5D4C\u5408\u4F75\u885D\u7A81\u4E2D\u7684\u50B3\u5165\u6A19\u982D\u80CC\u666F\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5167\u5D4C\u5408\u4F75\u885D\u7A81\u4E2D\u7684\u50B3\u5165\u5167\u5BB9\u80CC\u666F\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5167\u5D4C\u5408\u4F75\u885D\u7A81\u4E2D\u7684\u4E00\u822C\u4E0A\u968E\u6A19\u982D\u80CC\u666F\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5167\u5D4C\u5408\u4F75\u885D\u7A81\u4E2D\u7684\u4E00\u822C\u4E0A\u968E\u5167\u5BB9\u80CC\u666F\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5167\u5D4C\u5408\u4F75\u885D\u7A81\u4E2D\u6A19\u982D\u53CA\u5206\u9694\u5668\u7684\u908A\u754C\u8272\u5F69\u3002","\u76EE\u524D\u5167\u5D4C\u5408\u4F75\u885D\u7A81\u7684\u6982\u89C0\u5C3A\u898F\u524D\u666F\u3002","\u50B3\u5165\u5167\u5D4C\u5408\u4F75\u885D\u7A81\u7684\u6982\u89C0\u5C3A\u898F\u524D\u666F\u3002","\u5167\u5D4C\u5408\u4F75\u885D\u7A81\u4E2D\u7684\u5171\u540C\u4E0A\u968E\u6982\u89C0\u5C3A\u898F\u524D\u666F\u3002","\u5C0B\u627E\u76F8\u7B26\u9805\u76EE\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u9078\u53D6\u9805\u76EE\u9192\u76EE\u63D0\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7528\u65BC\u5C0B\u627E\u76F8\u7B26\u9805\u76EE\u7684\u7E2E\u5716\u6A19\u8A18\u8272\u5F69\u3002","\u91CD\u8907\u7DE8\u8F2F\u5668\u9078\u53D6\u9805\u76EE\u7684\u7E2E\u5716\u6A19\u8A18\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u9078\u53D6\u7BC4\u570D\u7684\u8FF7\u4F60\u5730\u5716\u6A19\u8A18\u8272\u5F69\u3002","\u8CC7\u8A0A\u7684\u7E2E\u5716\u6A19\u8A18\u8272\u5F69\u3002","\u8B66\u544A\u7684\u7E2E\u5716\u6A19\u8A18\u8272\u5F69\u3002","\u932F\u8AA4\u7684\u7E2E\u5716\u6A19\u8A18\u8272\u5F69\u3002","\u7E2E\u5716\u80CC\u666F\u8272\u5F69\u3002",'\u5728\u7E2E\u5716\u4E2D\u5448\u73FE\u7684\u524D\u666F\u5143\u7D20\u4E0D\u900F\u660E\u5EA6\u3002\u4F8B\u5982\uFF0C"#000000c0" \u6703\u4EE5\u4E0D\u900F\u660E\u5EA6 75% \u8F49\u8B6F\u5143\u7D20\u3002',"\u7E2E\u5716\u6ED1\u687F\u80CC\u666F\u8272\u5F69\u3002","\u66AB\u7559\u6642\u7684\u7E2E\u5716\u6ED1\u687F\u80CC\u666F\u8272\u5F69\u3002","\u6309\u4E00\u4E0B\u6642\u7684\u7E2E\u5716\u6ED1\u687F\u80CC\u666F\u8272\u5F69\u3002","\u7528\u65BC\u554F\u984C\u932F\u8AA4\u5716\u793A\u7684\u8272\u5F69\u3002","\u7528\u65BC\u554F\u984C\u8B66\u544A\u5716\u793A\u7684\u8272\u5F69\u3002","\u7528\u65BC\u554F\u984C\u8CC7\u8A0A\u5716\u793A\u7684\u8272\u5F69\u3002","\u5716\u8868\u4E2D\u4F7F\u7528\u7684\u524D\u666F\u8272\u5F69\u3002","\u7528\u65BC\u5716\u8868\u4E2D\u6C34\u5E73\u7DDA\u7684\u8272\u5F69\u3002","\u5716\u8868\u8996\u89BA\u6548\u679C\u4E2D\u6240\u4F7F\u7528\u7684\u7D05\u8272\u3002","\u5716\u8868\u8996\u89BA\u6548\u679C\u4E2D\u6240\u4F7F\u7528\u7684\u85CD\u8272\u3002","\u5716\u8868\u8996\u89BA\u6548\u679C\u4E2D\u6240\u4F7F\u7528\u7684\u9EC3\u8272\u3002","\u5716\u8868\u8996\u89BA\u6548\u679C\u4E2D\u6240\u4F7F\u7528\u7684\u6A59\u8272\u3002","\u5716\u8868\u8996\u89BA\u6548\u679C\u4E2D\u6240\u4F7F\u7528\u7684\u7DA0\u8272\u3002","\u5716\u8868\u8996\u89BA\u6548\u679C\u4E2D\u6240\u4F7F\u7528\u7684\u7D2B\u8272\u3002"],"vs/platform/theme/common/iconRegistry":["\u8981\u4F7F\u7528\u7684\u5B57\u578B\u8B58\u5225\u78BC\u3002\u5982\u672A\u8A2D\u5B9A\uFF0C\u5C31\u6703\u4F7F\u7528\u6700\u5148\u5B9A\u7FA9\u7684\u5B57\u578B\u3002","\u8207\u5716\u793A\u5B9A\u7FA9\u5EFA\u7ACB\u95DC\u806F\u7684\u5B57\u578B\u5B57\u5143\u3002","\u5C0F\u5DE5\u5177\u4E2D\u95DC\u9589\u52D5\u4F5C\u7684\u5716\u793A\u3002","\u79FB\u81F3\u4E0A\u4E00\u500B\u7DE8\u8F2F\u5668\u4F4D\u7F6E\u7684\u5716\u793A\u3002","\u79FB\u81F3\u4E0B\u4E00\u500B\u7DE8\u8F2F\u5668\u4F4D\u7F6E\u7684\u5716\u793A\u3002"],"vs/platform/undoRedo/common/undoRedoService":["\u5DF2\u5728\u78C1\u789F\u4E0A\u95DC\u9589\u4E26\u4FEE\u6539\u4EE5\u4E0B\u6A94\u6848: {0}\u3002","\u4E0B\u5217\u6A94\u6848\u5DF2\u4F7F\u7528\u4E0D\u76F8\u5BB9\u7684\u65B9\u5F0F\u4FEE\u6539: {0}\u3002","\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'\u3002{1}","\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'\u3002{1}","\u56E0\u70BA\u5DF2\u5C0D {1} \u9032\u884C\u8B8A\u66F4\uFF0C\u6240\u4EE5\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'","\u56E0\u70BA {1} \u4E2D\u5DF2\u7D93\u6709\u6B63\u5728\u57F7\u884C\u7684\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u70BA\u6240\u6709\u6A94\u6848\u5FA9\u539F '{0}'","\u56E0\u70BA\u540C\u6642\u767C\u751F\u5176\u4ED6\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u70BA\u6240\u6709\u6A94\u6848\u5FA9\u539F '{0}'","\u8981\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}' \u55CE?","\u5728 {0} \u500B\u6A94\u6848\u4E2D\u5FA9\u539F(&&U)","\u5FA9\u539F\u6B64\u6A94\u6848(&&F)","\u56E0\u70BA\u5DF2\u7D93\u6709\u6B63\u5728\u57F7\u884C\u7684\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u5FA9\u539F '{0}'\u3002","\u8981\u5FA9\u539F '{0}' \u55CE?","\u662F(&&Y)","\u5426","\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'\u3002{1}","\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'\u3002{1}","\u56E0\u70BA\u5DF2\u5C0D {1} \u9032\u884C\u8B8A\u66F4\uFF0C\u6240\u4EE5\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'","\u56E0\u70BA {1} \u4E2D\u5DF2\u7D93\u6709\u6B63\u5728\u57F7\u884C\u7684\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u70BA\u6240\u6709\u6A94\u6848\u91CD\u505A '{0}'","\u56E0\u70BA\u540C\u6642\u767C\u751F\u5176\u4ED6\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u70BA\u6240\u6709\u6A94\u6848\u91CD\u505A '{0}'","\u56E0\u70BA\u5DF2\u7D93\u6709\u6B63\u5728\u57F7\u884C\u7684\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u91CD\u505A '{0}'\u3002"],"vs/platform/workspace/common/workspace":["Code \u5DE5\u4F5C\u5340"]});
+
+//# sourceMappingURL=../../../min-maps/vs/editor/editor.main.nls.zh-tw.js.map
\ No newline at end of file
diff --git a/public/vs/language/css/cssMode.js b/public/vs/language/css/cssMode.js
new file mode 100644
index 0000000..75e827c
--- /dev/null
+++ b/public/vs/language/css/cssMode.js
@@ -0,0 +1,13 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/language/css/cssMode", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var tn=Object.create;var Y=Object.defineProperty;var rn=Object.getOwnPropertyDescriptor;var on=Object.getOwnPropertyNames;var sn=Object.getPrototypeOf,an=Object.prototype.hasOwnProperty;var un=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(t,i)=>(typeof require<"u"?require:t)[i]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var dn=(n,t)=>()=>(t||n((t={exports:{}}).exports,t),t.exports),cn=(n,t)=>{for(var i in t)Y(n,i,{get:t[i],enumerable:!0})},J=(n,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of on(t))!an.call(n,e)&&e!==i&&Y(n,e,{get:()=>t[e],enumerable:!(r=rn(t,e))||r.enumerable});return n},pe=(n,t,i)=>(J(n,t,"default"),i&&J(i,t,"default")),he=(n,t,i)=>(i=n!=null?tn(sn(n)):{},J(t||!n||!n.__esModule?Y(i,"default",{value:n,enumerable:!0}):i,n)),ln=n=>J(Y({},"__esModule",{value:!0}),n);var ve=dn((Wn,me)=>{var gn=he(un("vs/editor/editor.api"));me.exports=gn});var Sn={};cn(Sn,{CompletionAdapter:()=>H,DefinitionAdapter:()=>O,DiagnosticsAdapter:()=>K,DocumentColorAdapter:()=>$,DocumentFormattingEditProvider:()=>X,DocumentHighlightAdapter:()=>j,DocumentLinkAdapter:()=>le,DocumentRangeFormattingEditProvider:()=>B,DocumentSymbolAdapter:()=>z,FoldingRangeAdapter:()=>q,HoverAdapter:()=>U,ReferenceAdapter:()=>N,RenameAdapter:()=>V,SelectionRangeAdapter:()=>Q,WorkerManager:()=>E,fromPosition:()=>_,fromRange:()=>ge,setupMode:()=>Rn,toRange:()=>T,toTextEdit:()=>W});var d={};pe(d,he(ve()));var fn=2*60*1e3,E=class{constructor(t){this._defaults=t,this._worker=null,this._client=null,this._idleCheckInterval=window.setInterval(()=>this._checkIfIdle(),30*1e3),this._lastUsedTime=0,this._configChangeListener=this._defaults.onDidChange(()=>this._stopWorker())}_stopWorker(){this._worker&&(this._worker.dispose(),this._worker=null),this._client=null}dispose(){clearInterval(this._idleCheckInterval),this._configChangeListener.dispose(),this._stopWorker()}_checkIfIdle(){if(!this._worker)return;Date.now()-this._lastUsedTime>fn&&this._stopWorker()}_getClient(){return this._lastUsedTime=Date.now(),this._client||(this._worker=d.editor.createWebWorker({moduleId:"vs/language/css/cssWorker",label:this._defaults.languageId,createData:{options:this._defaults.options,languageId:this._defaults.languageId}}),this._client=this._worker.getProxy()),this._client}getLanguageServiceWorker(...t){let i;return this._getClient().then(r=>{i=r}).then(r=>{if(this._worker)return this._worker.withSyncedResources(t)}).then(r=>i)}};var ye;(function(n){n.MIN_VALUE=-2147483648,n.MAX_VALUE=2147483647})(ye||(ye={}));var ee;(function(n){n.MIN_VALUE=0,n.MAX_VALUE=2147483647})(ee||(ee={}));var x;(function(n){function t(r,e){return r===Number.MAX_VALUE&&(r=ee.MAX_VALUE),e===Number.MAX_VALUE&&(e=ee.MAX_VALUE),{line:r,character:e}}n.create=t;function i(r){var e=r;return a.objectLiteral(e)&&a.uinteger(e.line)&&a.uinteger(e.character)}n.is=i})(x||(x={}));var v;(function(n){function t(r,e,o,s){if(a.uinteger(r)&&a.uinteger(e)&&a.uinteger(o)&&a.uinteger(s))return{start:x.create(r,e),end:x.create(o,s)};if(x.is(r)&&x.is(e))return{start:r,end:e};throw new Error("Range#create called with invalid arguments["+r+", "+e+", "+o+", "+s+"]")}n.create=t;function i(r){var e=r;return a.objectLiteral(e)&&x.is(e.start)&&x.is(e.end)}n.is=i})(v||(v={}));var se;(function(n){function t(r,e){return{uri:r,range:e}}n.create=t;function i(r){var e=r;return a.defined(e)&&v.is(e.range)&&(a.string(e.uri)||a.undefined(e.uri))}n.is=i})(se||(se={}));var Te;(function(n){function t(r,e,o,s){return{targetUri:r,targetRange:e,targetSelectionRange:o,originSelectionRange:s}}n.create=t;function i(r){var e=r;return a.defined(e)&&v.is(e.targetRange)&&a.string(e.targetUri)&&(v.is(e.targetSelectionRange)||a.undefined(e.targetSelectionRange))&&(v.is(e.originSelectionRange)||a.undefined(e.originSelectionRange))}n.is=i})(Te||(Te={}));var ae;(function(n){function t(r,e,o,s){return{red:r,green:e,blue:o,alpha:s}}n.create=t;function i(r){var e=r;return a.numberRange(e.red,0,1)&&a.numberRange(e.green,0,1)&&a.numberRange(e.blue,0,1)&&a.numberRange(e.alpha,0,1)}n.is=i})(ae||(ae={}));var xe;(function(n){function t(r,e){return{range:r,color:e}}n.create=t;function i(r){var e=r;return v.is(e.range)&&ae.is(e.color)}n.is=i})(xe||(xe={}));var ke;(function(n){function t(r,e,o){return{label:r,textEdit:e,additionalTextEdits:o}}n.create=t;function i(r){var e=r;return a.string(e.label)&&(a.undefined(e.textEdit)||C.is(e))&&(a.undefined(e.additionalTextEdits)||a.typedArray(e.additionalTextEdits,C.is))}n.is=i})(ke||(ke={}));var S;(function(n){n.Comment="comment",n.Imports="imports",n.Region="region"})(S||(S={}));var Ie;(function(n){function t(r,e,o,s,u){var l={startLine:r,endLine:e};return a.defined(o)&&(l.startCharacter=o),a.defined(s)&&(l.endCharacter=s),a.defined(u)&&(l.kind=u),l}n.create=t;function i(r){var e=r;return a.uinteger(e.startLine)&&a.uinteger(e.startLine)&&(a.undefined(e.startCharacter)||a.uinteger(e.startCharacter))&&(a.undefined(e.endCharacter)||a.uinteger(e.endCharacter))&&(a.undefined(e.kind)||a.string(e.kind))}n.is=i})(Ie||(Ie={}));var ue;(function(n){function t(r,e){return{location:r,message:e}}n.create=t;function i(r){var e=r;return a.defined(e)&&se.is(e.location)&&a.string(e.message)}n.is=i})(ue||(ue={}));var b;(function(n){n.Error=1,n.Warning=2,n.Information=3,n.Hint=4})(b||(b={}));var Ce;(function(n){n.Unnecessary=1,n.Deprecated=2})(Ce||(Ce={}));var _e;(function(n){function t(i){var r=i;return r!=null&&a.string(r.href)}n.is=t})(_e||(_e={}));var ne;(function(n){function t(r,e,o,s,u,l){var f={range:r,message:e};return a.defined(o)&&(f.severity=o),a.defined(s)&&(f.code=s),a.defined(u)&&(f.source=u),a.defined(l)&&(f.relatedInformation=l),f}n.create=t;function i(r){var e,o=r;return a.defined(o)&&v.is(o.range)&&a.string(o.message)&&(a.number(o.severity)||a.undefined(o.severity))&&(a.integer(o.code)||a.string(o.code)||a.undefined(o.code))&&(a.undefined(o.codeDescription)||a.string((e=o.codeDescription)===null||e===void 0?void 0:e.href))&&(a.string(o.source)||a.undefined(o.source))&&(a.undefined(o.relatedInformation)||a.typedArray(o.relatedInformation,ue.is))}n.is=i})(ne||(ne={}));var D;(function(n){function t(r,e){for(var o=[],s=2;s<arguments.length;s++)o[s-2]=arguments[s];var u={title:r,command:e};return a.defined(o)&&o.length>0&&(u.arguments=o),u}n.create=t;function i(r){var e=r;return a.defined(e)&&a.string(e.title)&&a.string(e.command)}n.is=i})(D||(D={}));var C;(function(n){function t(o,s){return{range:o,newText:s}}n.replace=t;function i(o,s){return{range:{start:o,end:o},newText:s}}n.insert=i;function r(o){return{range:o,newText:""}}n.del=r;function e(o){var s=o;return a.objectLiteral(s)&&a.string(s.newText)&&v.is(s.range)}n.is=e})(C||(C={}));var R;(function(n){function t(r,e,o){var s={label:r};return e!==void 0&&(s.needsConfirmation=e),o!==void 0&&(s.description=o),s}n.create=t;function i(r){var e=r;return e!==void 0&&a.objectLiteral(e)&&a.string(e.label)&&(a.boolean(e.needsConfirmation)||e.needsConfirmation===void 0)&&(a.string(e.description)||e.description===void 0)}n.is=i})(R||(R={}));var y;(function(n){function t(i){var r=i;return typeof r=="string"}n.is=t})(y||(y={}));var I;(function(n){function t(o,s,u){return{range:o,newText:s,annotationId:u}}n.replace=t;function i(o,s,u){return{range:{start:o,end:o},newText:s,annotationId:u}}n.insert=i;function r(o,s){return{range:o,newText:"",annotationId:s}}n.del=r;function e(o){var s=o;return C.is(s)&&(R.is(s.annotationId)||y.is(s.annotationId))}n.is=e})(I||(I={}));var te;(function(n){function t(r,e){return{textDocument:r,edits:e}}n.create=t;function i(r){var e=r;return a.defined(e)&&re.is(e.textDocument)&&Array.isArray(e.edits)}n.is=i})(te||(te={}));var L;(function(n){function t(r,e,o){var s={kind:"create",uri:r};return e!==void 0&&(e.overwrite!==void 0||e.ignoreIfExists!==void 0)&&(s.options=e),o!==void 0&&(s.annotationId=o),s}n.create=t;function i(r){var e=r;return e&&e.kind==="create"&&a.string(e.uri)&&(e.options===void 0||(e.options.overwrite===void 0||a.boolean(e.options.overwrite))&&(e.options.ignoreIfExists===void 0||a.boolean(e.options.ignoreIfExists)))&&(e.annotationId===void 0||y.is(e.annotationId))}n.is=i})(L||(L={}));var F;(function(n){function t(r,e,o,s){var u={kind:"rename",oldUri:r,newUri:e};return o!==void 0&&(o.overwrite!==void 0||o.ignoreIfExists!==void 0)&&(u.options=o),s!==void 0&&(u.annotationId=s),u}n.create=t;function i(r){var e=r;return e&&e.kind==="rename"&&a.string(e.oldUri)&&a.string(e.newUri)&&(e.options===void 0||(e.options.overwrite===void 0||a.boolean(e.options.overwrite))&&(e.options.ignoreIfExists===void 0||a.boolean(e.options.ignoreIfExists)))&&(e.annotationId===void 0||y.is(e.annotationId))}n.is=i})(F||(F={}));var M;(function(n){function t(r,e,o){var s={kind:"delete",uri:r};return e!==void 0&&(e.recursive!==void 0||e.ignoreIfNotExists!==void 0)&&(s.options=e),o!==void 0&&(s.annotationId=o),s}n.create=t;function i(r){var e=r;return e&&e.kind==="delete"&&a.string(e.uri)&&(e.options===void 0||(e.options.recursive===void 0||a.boolean(e.options.recursive))&&(e.options.ignoreIfNotExists===void 0||a.boolean(e.options.ignoreIfNotExists)))&&(e.annotationId===void 0||y.is(e.annotationId))}n.is=i})(M||(M={}));var de;(function(n){function t(i){var r=i;return r&&(r.changes!==void 0||r.documentChanges!==void 0)&&(r.documentChanges===void 0||r.documentChanges.every(function(e){return a.string(e.kind)?L.is(e)||F.is(e)||M.is(e):te.is(e)}))}n.is=t})(de||(de={}));var Z=function(){function n(t,i){this.edits=t,this.changeAnnotations=i}return n.prototype.insert=function(t,i,r){var e,o;if(r===void 0?e=C.insert(t,i):y.is(r)?(o=r,e=I.insert(t,i,r)):(this.assertChangeAnnotations(this.changeAnnotations),o=this.changeAnnotations.manage(r),e=I.insert(t,i,o)),this.edits.push(e),o!==void 0)return o},n.prototype.replace=function(t,i,r){var e,o;if(r===void 0?e=C.replace(t,i):y.is(r)?(o=r,e=I.replace(t,i,r)):(this.assertChangeAnnotations(this.changeAnnotations),o=this.changeAnnotations.manage(r),e=I.replace(t,i,o)),this.edits.push(e),o!==void 0)return o},n.prototype.delete=function(t,i){var r,e;if(i===void 0?r=C.del(t):y.is(i)?(e=i,r=I.del(t,i)):(this.assertChangeAnnotations(this.changeAnnotations),e=this.changeAnnotations.manage(i),r=I.del(t,e)),this.edits.push(r),e!==void 0)return e},n.prototype.add=function(t){this.edits.push(t)},n.prototype.all=function(){return this.edits},n.prototype.clear=function(){this.edits.splice(0,this.edits.length)},n.prototype.assertChangeAnnotations=function(t){if(t===void 0)throw new Error("Text edit change is not configured to manage change annotations.")},n}(),be=function(){function n(t){this._annotations=t===void 0?Object.create(null):t,this._counter=0,this._size=0}return n.prototype.all=function(){return this._annotations},Object.defineProperty(n.prototype,"size",{get:function(){return this._size},enumerable:!1,configurable:!0}),n.prototype.manage=function(t,i){var r;if(y.is(t)?r=t:(r=this.nextId(),i=t),this._annotations[r]!==void 0)throw new Error("Id "+r+" is already in use.");if(i===void 0)throw new Error("No annotation provided for id "+r);return this._annotations[r]=i,this._size++,r},n.prototype.nextId=function(){return this._counter++,this._counter.toString()},n}(),Kn=function(){function n(t){var i=this;this._textEditChanges=Object.create(null),t!==void 0?(this._workspaceEdit=t,t.documentChanges?(this._changeAnnotations=new be(t.changeAnnotations),t.changeAnnotations=this._changeAnnotations.all(),t.documentChanges.forEach(function(r){if(te.is(r)){var e=new Z(r.edits,i._changeAnnotations);i._textEditChanges[r.textDocument.uri]=e}})):t.changes&&Object.keys(t.changes).forEach(function(r){var e=new Z(t.changes[r]);i._textEditChanges[r]=e})):this._workspaceEdit={}}return Object.defineProperty(n.prototype,"edit",{get:function(){return this.initDocumentChanges(),this._changeAnnotations!==void 0&&(this._changeAnnotations.size===0?this._workspaceEdit.changeAnnotations=void 0:this._workspaceEdit.changeAnnotations=this._changeAnnotations.all()),this._workspaceEdit},enumerable:!1,configurable:!0}),n.prototype.getTextEditChange=function(t){if(re.is(t)){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var i={uri:t.uri,version:t.version},r=this._textEditChanges[i.uri];if(!r){var e=[],o={textDocument:i,edits:e};this._workspaceEdit.documentChanges.push(o),r=new Z(e,this._changeAnnotations),this._textEditChanges[i.uri]=r}return r}else{if(this.initChanges(),this._workspaceEdit.changes===void 0)throw new Error("Workspace edit is not configured for normal text edit changes.");var r=this._textEditChanges[t];if(!r){var e=[];this._workspaceEdit.changes[t]=e,r=new Z(e),this._textEditChanges[t]=r}return r}},n.prototype.initDocumentChanges=function(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._changeAnnotations=new be,this._workspaceEdit.documentChanges=[],this._workspaceEdit.changeAnnotations=this._changeAnnotations.all())},n.prototype.initChanges=function(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._workspaceEdit.changes=Object.create(null))},n.prototype.createFile=function(t,i,r){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var e;R.is(i)||y.is(i)?e=i:r=i;var o,s;if(e===void 0?o=L.create(t,r):(s=y.is(e)?e:this._changeAnnotations.manage(e),o=L.create(t,r,s)),this._workspaceEdit.documentChanges.push(o),s!==void 0)return s},n.prototype.renameFile=function(t,i,r,e){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var o;R.is(r)||y.is(r)?o=r:e=r;var s,u;if(o===void 0?s=F.create(t,i,e):(u=y.is(o)?o:this._changeAnnotations.manage(o),s=F.create(t,i,e,u)),this._workspaceEdit.documentChanges.push(s),u!==void 0)return u},n.prototype.deleteFile=function(t,i,r){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var e;R.is(i)||y.is(i)?e=i:r=i;var o,s;if(e===void 0?o=M.create(t,r):(s=y.is(e)?e:this._changeAnnotations.manage(e),o=M.create(t,r,s)),this._workspaceEdit.documentChanges.push(o),s!==void 0)return s},n}();var we;(function(n){function t(r){return{uri:r}}n.create=t;function i(r){var e=r;return a.defined(e)&&a.string(e.uri)}n.is=i})(we||(we={}));var Ee;(function(n){function t(r,e){return{uri:r,version:e}}n.create=t;function i(r){var e=r;return a.defined(e)&&a.string(e.uri)&&a.integer(e.version)}n.is=i})(Ee||(Ee={}));var re;(function(n){function t(r,e){return{uri:r,version:e}}n.create=t;function i(r){var e=r;return a.defined(e)&&a.string(e.uri)&&(e.version===null||a.integer(e.version))}n.is=i})(re||(re={}));var Re;(function(n){function t(r,e,o,s){return{uri:r,languageId:e,version:o,text:s}}n.create=t;function i(r){var e=r;return a.defined(e)&&a.string(e.uri)&&a.string(e.languageId)&&a.integer(e.version)&&a.string(e.text)}n.is=i})(Re||(Re={}));var A;(function(n){n.PlainText="plaintext",n.Markdown="markdown"})(A||(A={}));(function(n){function t(i){var r=i;return r===n.PlainText||r===n.Markdown}n.is=t})(A||(A={}));var ce;(function(n){function t(i){var r=i;return a.objectLiteral(i)&&A.is(r.kind)&&a.string(r.value)}n.is=t})(ce||(ce={}));var p;(function(n){n.Text=1,n.Method=2,n.Function=3,n.Constructor=4,n.Field=5,n.Variable=6,n.Class=7,n.Interface=8,n.Module=9,n.Property=10,n.Unit=11,n.Value=12,n.Enum=13,n.Keyword=14,n.Snippet=15,n.Color=16,n.File=17,n.Reference=18,n.Folder=19,n.EnumMember=20,n.Constant=21,n.Struct=22,n.Event=23,n.Operator=24,n.TypeParameter=25})(p||(p={}));var ie;(function(n){n.PlainText=1,n.Snippet=2})(ie||(ie={}));var Se;(function(n){n.Deprecated=1})(Se||(Se={}));var Pe;(function(n){function t(r,e,o){return{newText:r,insert:e,replace:o}}n.create=t;function i(r){var e=r;return e&&a.string(e.newText)&&v.is(e.insert)&&v.is(e.replace)}n.is=i})(Pe||(Pe={}));var We;(function(n){n.asIs=1,n.adjustIndentation=2})(We||(We={}));var De;(function(n){function t(i){return{label:i}}n.create=t})(De||(De={}));var Le;(function(n){function t(i,r){return{items:i||[],isIncomplete:!!r}}n.create=t})(Le||(Le={}));var oe;(function(n){function t(r){return r.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}n.fromPlainText=t;function i(r){var e=r;return a.string(e)||a.objectLiteral(e)&&a.string(e.language)&&a.string(e.value)}n.is=i})(oe||(oe={}));var Fe;(function(n){function t(i){var r=i;return!!r&&a.objectLiteral(r)&&(ce.is(r.contents)||oe.is(r.contents)||a.typedArray(r.contents,oe.is))&&(i.range===void 0||v.is(i.range))}n.is=t})(Fe||(Fe={}));var Me;(function(n){function t(i,r){return r?{label:i,documentation:r}:{label:i}}n.create=t})(Me||(Me={}));var Ae;(function(n){function t(i,r){for(var e=[],o=2;o<arguments.length;o++)e[o-2]=arguments[o];var s={label:i};return a.defined(r)&&(s.documentation=r),a.defined(e)?s.parameters=e:s.parameters=[],s}n.create=t})(Ae||(Ae={}));var P;(function(n){n.Text=1,n.Read=2,n.Write=3})(P||(P={}));var Ke;(function(n){function t(i,r){var e={range:i};return a.number(r)&&(e.kind=r),e}n.create=t})(Ke||(Ke={}));var h;(function(n){n.File=1,n.Module=2,n.Namespace=3,n.Package=4,n.Class=5,n.Method=6,n.Property=7,n.Field=8,n.Constructor=9,n.Enum=10,n.Interface=11,n.Function=12,n.Variable=13,n.Constant=14,n.String=15,n.Number=16,n.Boolean=17,n.Array=18,n.Object=19,n.Key=20,n.Null=21,n.EnumMember=22,n.Struct=23,n.Event=24,n.Operator=25,n.TypeParameter=26})(h||(h={}));var He;(function(n){n.Deprecated=1})(He||(He={}));var Ue;(function(n){function t(i,r,e,o,s){var u={name:i,kind:r,location:{uri:o,range:e}};return s&&(u.containerName=s),u}n.create=t})(Ue||(Ue={}));var je;(function(n){function t(r,e,o,s,u,l){var f={name:r,detail:e,kind:o,range:s,selectionRange:u};return l!==void 0&&(f.children=l),f}n.create=t;function i(r){var e=r;return e&&a.string(e.name)&&a.number(e.kind)&&v.is(e.range)&&v.is(e.selectionRange)&&(e.detail===void 0||a.string(e.detail))&&(e.deprecated===void 0||a.boolean(e.deprecated))&&(e.children===void 0||Array.isArray(e.children))&&(e.tags===void 0||Array.isArray(e.tags))}n.is=i})(je||(je={}));var Oe;(function(n){n.Empty="",n.QuickFix="quickfix",n.Refactor="refactor",n.RefactorExtract="refactor.extract",n.RefactorInline="refactor.inline",n.RefactorRewrite="refactor.rewrite",n.Source="source",n.SourceOrganizeImports="source.organizeImports",n.SourceFixAll="source.fixAll"})(Oe||(Oe={}));var Ne;(function(n){function t(r,e){var o={diagnostics:r};return e!=null&&(o.only=e),o}n.create=t;function i(r){var e=r;return a.defined(e)&&a.typedArray(e.diagnostics,ne.is)&&(e.only===void 0||a.typedArray(e.only,a.string))}n.is=i})(Ne||(Ne={}));var Ve;(function(n){function t(r,e,o){var s={title:r},u=!0;return typeof e=="string"?(u=!1,s.kind=e):D.is(e)?s.command=e:s.edit=e,u&&o!==void 0&&(s.kind=o),s}n.create=t;function i(r){var e=r;return e&&a.string(e.title)&&(e.diagnostics===void 0||a.typedArray(e.diagnostics,ne.is))&&(e.kind===void 0||a.string(e.kind))&&(e.edit!==void 0||e.command!==void 0)&&(e.command===void 0||D.is(e.command))&&(e.isPreferred===void 0||a.boolean(e.isPreferred))&&(e.edit===void 0||de.is(e.edit))}n.is=i})(Ve||(Ve={}));var ze;(function(n){function t(r,e){var o={range:r};return a.defined(e)&&(o.data=e),o}n.create=t;function i(r){var e=r;return a.defined(e)&&v.is(e.range)&&(a.undefined(e.command)||D.is(e.command))}n.is=i})(ze||(ze={}));var Xe;(function(n){function t(r,e){return{tabSize:r,insertSpaces:e}}n.create=t;function i(r){var e=r;return a.defined(e)&&a.uinteger(e.tabSize)&&a.boolean(e.insertSpaces)}n.is=i})(Xe||(Xe={}));var Be;(function(n){function t(r,e,o){return{range:r,target:e,data:o}}n.create=t;function i(r){var e=r;return a.defined(e)&&v.is(e.range)&&(a.undefined(e.target)||a.string(e.target))}n.is=i})(Be||(Be={}));var $e;(function(n){function t(r,e){return{range:r,parent:e}}n.create=t;function i(r){var e=r;return e!==void 0&&v.is(e.range)&&(e.parent===void 0||n.is(e.parent))}n.is=i})($e||($e={}));var qe;(function(n){function t(o,s,u,l){return new pn(o,s,u,l)}n.create=t;function i(o){var s=o;return!!(a.defined(s)&&a.string(s.uri)&&(a.undefined(s.languageId)||a.string(s.languageId))&&a.uinteger(s.lineCount)&&a.func(s.getText)&&a.func(s.positionAt)&&a.func(s.offsetAt))}n.is=i;function r(o,s){for(var u=o.getText(),l=e(s,function(w,G){var fe=w.range.start.line-G.range.start.line;return fe===0?w.range.start.character-G.range.start.character:fe}),f=u.length,g=l.length-1;g>=0;g--){var m=l[g],k=o.offsetAt(m.range.start),c=o.offsetAt(m.range.end);if(c<=f)u=u.substring(0,k)+m.newText+u.substring(c,u.length);else throw new Error("Overlapping edit");f=k}return u}n.applyEdits=r;function e(o,s){if(o.length<=1)return o;var u=o.length/2|0,l=o.slice(0,u),f=o.slice(u);e(l,s),e(f,s);for(var g=0,m=0,k=0;g<l.length&&m<f.length;){var c=s(l[g],f[m]);c<=0?o[k++]=l[g++]:o[k++]=f[m++]}for(;g<l.length;)o[k++]=l[g++];for(;m<f.length;)o[k++]=f[m++];return o}})(qe||(qe={}));var pn=function(){function n(t,i,r,e){this._uri=t,this._languageId=i,this._version=r,this._content=e,this._lineOffsets=void 0}return Object.defineProperty(n.prototype,"uri",{get:function(){return this._uri},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"languageId",{get:function(){return this._languageId},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"version",{get:function(){return this._version},enumerable:!1,configurable:!0}),n.prototype.getText=function(t){if(t){var i=this.offsetAt(t.start),r=this.offsetAt(t.end);return this._content.substring(i,r)}return this._content},n.prototype.update=function(t,i){this._content=t.text,this._version=i,this._lineOffsets=void 0},n.prototype.getLineOffsets=function(){if(this._lineOffsets===void 0){for(var t=[],i=this._content,r=!0,e=0;e<i.length;e++){r&&(t.push(e),r=!1);var o=i.charAt(e);r=o==="\r"||o===`
+`,o==="\r"&&e+1<i.length&&i.charAt(e+1)===`
+`&&e++}r&&i.length>0&&t.push(i.length),this._lineOffsets=t}return this._lineOffsets},n.prototype.positionAt=function(t){t=Math.max(Math.min(t,this._content.length),0);var i=this.getLineOffsets(),r=0,e=i.length;if(e===0)return x.create(0,t);for(;r<e;){var o=Math.floor((r+e)/2);i[o]>t?e=o:r=o+1}var s=r-1;return x.create(s,t-i[s])},n.prototype.offsetAt=function(t){var i=this.getLineOffsets();if(t.line>=i.length)return this._content.length;if(t.line<0)return 0;var r=i[t.line],e=t.line+1<i.length?i[t.line+1]:this._content.length;return Math.max(Math.min(r+t.character,e),r)},Object.defineProperty(n.prototype,"lineCount",{get:function(){return this.getLineOffsets().length},enumerable:!1,configurable:!0}),n}(),a;(function(n){var t=Object.prototype.toString;function i(c){return typeof c<"u"}n.defined=i;function r(c){return typeof c>"u"}n.undefined=r;function e(c){return c===!0||c===!1}n.boolean=e;function o(c){return t.call(c)==="[object String]"}n.string=o;function s(c){return t.call(c)==="[object Number]"}n.number=s;function u(c,w,G){return t.call(c)==="[object Number]"&&w<=c&&c<=G}n.numberRange=u;function l(c){return t.call(c)==="[object Number]"&&-2147483648<=c&&c<=2147483647}n.integer=l;function f(c){return t.call(c)==="[object Number]"&&0<=c&&c<=2147483647}n.uinteger=f;function g(c){return t.call(c)==="[object Function]"}n.func=g;function m(c){return c!==null&&typeof c=="object"}n.objectLiteral=m;function k(c,w){return Array.isArray(c)&&c.every(w)}n.typedArray=k})(a||(a={}));var K=class{constructor(t,i,r){this._languageId=t;this._worker=i;this._disposables=[];this._listener=Object.create(null);let e=s=>{let u=s.getLanguageId();if(u!==this._languageId)return;let l;this._listener[s.uri.toString()]=s.onDidChangeContent(()=>{window.clearTimeout(l),l=window.setTimeout(()=>this._doValidate(s.uri,u),500)}),this._doValidate(s.uri,u)},o=s=>{d.editor.setModelMarkers(s,this._languageId,[]);let u=s.uri.toString(),l=this._listener[u];l&&(l.dispose(),delete this._listener[u])};this._disposables.push(d.editor.onDidCreateModel(e)),this._disposables.push(d.editor.onWillDisposeModel(o)),this._disposables.push(d.editor.onDidChangeModelLanguage(s=>{o(s.model),e(s.model)})),this._disposables.push(r(s=>{d.editor.getModels().forEach(u=>{u.getLanguageId()===this._languageId&&(o(u),e(u))})})),this._disposables.push({dispose:()=>{d.editor.getModels().forEach(o);for(let s in this._listener)this._listener[s].dispose()}}),d.editor.getModels().forEach(e)}dispose(){this._disposables.forEach(t=>t&&t.dispose()),this._disposables.length=0}_doValidate(t,i){this._worker(t).then(r=>r.doValidation(t.toString())).then(r=>{let e=r.map(s=>vn(t,s)),o=d.editor.getModel(t);o&&o.getLanguageId()===i&&d.editor.setModelMarkers(o,i,e)}).then(void 0,r=>{console.error(r)})}};function mn(n){switch(n){case b.Error:return d.MarkerSeverity.Error;case b.Warning:return d.MarkerSeverity.Warning;case b.Information:return d.MarkerSeverity.Info;case b.Hint:return d.MarkerSeverity.Hint;default:return d.MarkerSeverity.Info}}function vn(n,t){let i=typeof t.code=="number"?String(t.code):t.code;return{severity:mn(t.severity),startLineNumber:t.range.start.line+1,startColumn:t.range.start.character+1,endLineNumber:t.range.end.line+1,endColumn:t.range.end.character+1,message:t.message,code:i,source:t.source}}var H=class{constructor(t,i){this._worker=t;this._triggerCharacters=i}get triggerCharacters(){return this._triggerCharacters}provideCompletionItems(t,i,r,e){let o=t.uri;return this._worker(o).then(s=>s.doComplete(o.toString(),_(i))).then(s=>{if(!s)return;let u=t.getWordUntilPosition(i),l=new d.Range(i.lineNumber,u.startColumn,i.lineNumber,u.endColumn),f=s.items.map(g=>{let m={label:g.label,insertText:g.insertText||g.label,sortText:g.sortText,filterText:g.filterText,documentation:g.documentation,detail:g.detail,command:xn(g.command),range:l,kind:Tn(g.kind)};return g.textEdit&&(yn(g.textEdit)?m.range={insert:T(g.textEdit.insert),replace:T(g.textEdit.replace)}:m.range=T(g.textEdit.range),m.insertText=g.textEdit.newText),g.additionalTextEdits&&(m.additionalTextEdits=g.additionalTextEdits.map(W)),g.insertTextFormat===ie.Snippet&&(m.insertTextRules=d.languages.CompletionItemInsertTextRule.InsertAsSnippet),m});return{isIncomplete:s.isIncomplete,suggestions:f}})}};function _(n){if(n)return{character:n.column-1,line:n.lineNumber-1}}function ge(n){if(n)return{start:{line:n.startLineNumber-1,character:n.startColumn-1},end:{line:n.endLineNumber-1,character:n.endColumn-1}}}function T(n){if(n)return new d.Range(n.start.line+1,n.start.character+1,n.end.line+1,n.end.character+1)}function yn(n){return typeof n.insert<"u"&&typeof n.replace<"u"}function Tn(n){let t=d.languages.CompletionItemKind;switch(n){case p.Text:return t.Text;case p.Method:return t.Method;case p.Function:return t.Function;case p.Constructor:return t.Constructor;case p.Field:return t.Field;case p.Variable:return t.Variable;case p.Class:return t.Class;case p.Interface:return t.Interface;case p.Module:return t.Module;case p.Property:return t.Property;case p.Unit:return t.Unit;case p.Value:return t.Value;case p.Enum:return t.Enum;case p.Keyword:return t.Keyword;case p.Snippet:return t.Snippet;case p.Color:return t.Color;case p.File:return t.File;case p.Reference:return t.Reference}return t.Property}function W(n){if(n)return{range:T(n.range),text:n.newText}}function xn(n){return n&&n.command==="editor.action.triggerSuggest"?{id:n.command,title:n.title,arguments:n.arguments}:void 0}var U=class{constructor(t){this._worker=t}provideHover(t,i,r){let e=t.uri;return this._worker(e).then(o=>o.doHover(e.toString(),_(i))).then(o=>{if(o)return{range:T(o.range),contents:In(o.contents)}})}};function kn(n){return n&&typeof n=="object"&&typeof n.kind=="string"}function Qe(n){return typeof n=="string"?{value:n}:kn(n)?n.kind==="plaintext"?{value:n.value.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}:{value:n.value}:{value:"```"+n.language+`
+`+n.value+"\n```\n"}}function In(n){if(n)return Array.isArray(n)?n.map(Qe):[Qe(n)]}var j=class{constructor(t){this._worker=t}provideDocumentHighlights(t,i,r){let e=t.uri;return this._worker(e).then(o=>o.findDocumentHighlights(e.toString(),_(i))).then(o=>{if(o)return o.map(s=>({range:T(s.range),kind:Cn(s.kind)}))})}};function Cn(n){switch(n){case P.Read:return d.languages.DocumentHighlightKind.Read;case P.Write:return d.languages.DocumentHighlightKind.Write;case P.Text:return d.languages.DocumentHighlightKind.Text}return d.languages.DocumentHighlightKind.Text}var O=class{constructor(t){this._worker=t}provideDefinition(t,i,r){let e=t.uri;return this._worker(e).then(o=>o.findDefinition(e.toString(),_(i))).then(o=>{if(o)return[Ge(o)]})}};function Ge(n){return{uri:d.Uri.parse(n.uri),range:T(n.range)}}var N=class{constructor(t){this._worker=t}provideReferences(t,i,r,e){let o=t.uri;return this._worker(o).then(s=>s.findReferences(o.toString(),_(i))).then(s=>{if(s)return s.map(Ge)})}},V=class{constructor(t){this._worker=t}provideRenameEdits(t,i,r,e){let o=t.uri;return this._worker(o).then(s=>s.doRename(o.toString(),_(i),r)).then(s=>_n(s))}};function _n(n){if(!n||!n.changes)return;let t=[];for(let i in n.changes){let r=d.Uri.parse(i);for(let e of n.changes[i])t.push({resource:r,versionId:void 0,textEdit:{range:T(e.range),text:e.newText}})}return{edits:t}}var z=class{constructor(t){this._worker=t}provideDocumentSymbols(t,i){let r=t.uri;return this._worker(r).then(e=>e.findDocumentSymbols(r.toString())).then(e=>{if(e)return e.map(o=>bn(o)?Je(o):{name:o.name,detail:"",containerName:o.containerName,kind:Ye(o.kind),range:T(o.location.range),selectionRange:T(o.location.range),tags:[]})})}};function bn(n){return"children"in n}function Je(n){return{name:n.name,detail:n.detail??"",kind:Ye(n.kind),range:T(n.range),selectionRange:T(n.selectionRange),tags:n.tags??[],children:(n.children??[]).map(t=>Je(t))}}function Ye(n){let t=d.languages.SymbolKind;switch(n){case h.File:return t.File;case h.Module:return t.Module;case h.Namespace:return t.Namespace;case h.Package:return t.Package;case h.Class:return t.Class;case h.Method:return t.Method;case h.Property:return t.Property;case h.Field:return t.Field;case h.Constructor:return t.Constructor;case h.Enum:return t.Enum;case h.Interface:return t.Interface;case h.Function:return t.Function;case h.Variable:return t.Variable;case h.Constant:return t.Constant;case h.String:return t.String;case h.Number:return t.Number;case h.Boolean:return t.Boolean;case h.Array:return t.Array}return t.Function}var le=class{constructor(t){this._worker=t}provideLinks(t,i){let r=t.uri;return this._worker(r).then(e=>e.findDocumentLinks(r.toString())).then(e=>{if(e)return{links:e.map(o=>({range:T(o.range),url:o.target}))}})}},X=class{constructor(t){this._worker=t}provideDocumentFormattingEdits(t,i,r){let e=t.uri;return this._worker(e).then(o=>o.format(e.toString(),null,Ze(i)).then(s=>{if(!(!s||s.length===0))return s.map(W)}))}},B=class{constructor(t){this._worker=t;this.canFormatMultipleRanges=!1}provideDocumentRangeFormattingEdits(t,i,r,e){let o=t.uri;return this._worker(o).then(s=>s.format(o.toString(),ge(i),Ze(r)).then(u=>{if(!(!u||u.length===0))return u.map(W)}))}};function Ze(n){return{tabSize:n.tabSize,insertSpaces:n.insertSpaces}}var $=class{constructor(t){this._worker=t}provideDocumentColors(t,i){let r=t.uri;return this._worker(r).then(e=>e.findDocumentColors(r.toString())).then(e=>{if(e)return e.map(o=>({color:o.color,range:T(o.range)}))})}provideColorPresentations(t,i,r){let e=t.uri;return this._worker(e).then(o=>o.getColorPresentations(e.toString(),i.color,ge(i.range))).then(o=>{if(o)return o.map(s=>{let u={label:s.label};return s.textEdit&&(u.textEdit=W(s.textEdit)),s.additionalTextEdits&&(u.additionalTextEdits=s.additionalTextEdits.map(W)),u})})}},q=class{constructor(t){this._worker=t}provideFoldingRanges(t,i,r){let e=t.uri;return this._worker(e).then(o=>o.getFoldingRanges(e.toString(),i)).then(o=>{if(o)return o.map(s=>{let u={start:s.startLine+1,end:s.endLine+1};return typeof s.kind<"u"&&(u.kind=wn(s.kind)),u})})}};function wn(n){switch(n){case S.Comment:return d.languages.FoldingRangeKind.Comment;case S.Imports:return d.languages.FoldingRangeKind.Imports;case S.Region:return d.languages.FoldingRangeKind.Region}}var Q=class{constructor(t){this._worker=t}provideSelectionRanges(t,i,r){let e=t.uri;return this._worker(e).then(o=>o.getSelectionRanges(e.toString(),i.map(_))).then(o=>{if(o)return o.map(s=>{let u=[];for(;s;)u.push({range:T(s.range)}),s=s.parent;return u})})}};function Rn(n){let t=[],i=[],r=new E(n);t.push(r);let e=(...s)=>r.getLanguageServiceWorker(...s);function o(){let{languageId:s,modeConfiguration:u}=n;nn(i),u.completionItems&&i.push(d.languages.registerCompletionItemProvider(s,new H(e,["/","-",":"]))),u.hovers&&i.push(d.languages.registerHoverProvider(s,new U(e))),u.documentHighlights&&i.push(d.languages.registerDocumentHighlightProvider(s,new j(e))),u.definitions&&i.push(d.languages.registerDefinitionProvider(s,new O(e))),u.references&&i.push(d.languages.registerReferenceProvider(s,new N(e))),u.documentSymbols&&i.push(d.languages.registerDocumentSymbolProvider(s,new z(e))),u.rename&&i.push(d.languages.registerRenameProvider(s,new V(e))),u.colors&&i.push(d.languages.registerColorProvider(s,new $(e))),u.foldingRanges&&i.push(d.languages.registerFoldingRangeProvider(s,new q(e))),u.diagnostics&&i.push(new K(s,e,n.onDidChange)),u.selectionRanges&&i.push(d.languages.registerSelectionRangeProvider(s,new Q(e))),u.documentFormattingEdits&&i.push(d.languages.registerDocumentFormattingEditProvider(s,new X(e))),u.documentRangeFormattingEdits&&i.push(d.languages.registerDocumentRangeFormattingEditProvider(s,new B(e)))}return o(),t.push(en(i)),en(t)}function en(n){return{dispose:()=>nn(n)}}function nn(n){for(;n.length;)n.pop().dispose()}return ln(Sn);})();
+return moduleExports;
+});
diff --git a/public/vs/language/css/cssWorker.js b/public/vs/language/css/cssWorker.js
new file mode 100644
index 0000000..aad04ab
--- /dev/null
+++ b/public/vs/language/css/cssWorker.js
@@ -0,0 +1,78 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/language/css/cssWorker", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var $n=Object.defineProperty;var ds=Object.getOwnPropertyDescriptor;var hs=Object.getOwnPropertyNames;var ps=Object.prototype.hasOwnProperty;var us=(n,e)=>{for(var t in e)$n(n,t,{get:e[t],enumerable:!0})},ms=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of hs(e))!ps.call(n,i)&&i!==t&&$n(n,i,{get:()=>e[i],enumerable:!(r=ds(e,i))||r.enumerable});return n};var fs=n=>ms($n({},"__esModule",{value:!0}),n);var sl={};us(sl,{CSSWorker:()=>Vn,create:()=>ol});var d;(function(n){n[n.Ident=0]="Ident",n[n.AtKeyword=1]="AtKeyword",n[n.String=2]="String",n[n.BadString=3]="BadString",n[n.UnquotedString=4]="UnquotedString",n[n.Hash=5]="Hash",n[n.Num=6]="Num",n[n.Percentage=7]="Percentage",n[n.Dimension=8]="Dimension",n[n.UnicodeRange=9]="UnicodeRange",n[n.CDO=10]="CDO",n[n.CDC=11]="CDC",n[n.Colon=12]="Colon",n[n.SemiColon=13]="SemiColon",n[n.CurlyL=14]="CurlyL",n[n.CurlyR=15]="CurlyR",n[n.ParenthesisL=16]="ParenthesisL",n[n.ParenthesisR=17]="ParenthesisR",n[n.BracketL=18]="BracketL",n[n.BracketR=19]="BracketR",n[n.Whitespace=20]="Whitespace",n[n.Includes=21]="Includes",n[n.Dashmatch=22]="Dashmatch",n[n.SubstringOperator=23]="SubstringOperator",n[n.PrefixOperator=24]="PrefixOperator",n[n.SuffixOperator=25]="SuffixOperator",n[n.Delim=26]="Delim",n[n.EMS=27]="EMS",n[n.EXS=28]="EXS",n[n.Length=29]="Length",n[n.Angle=30]="Angle",n[n.Time=31]="Time",n[n.Freq=32]="Freq",n[n.Exclamation=33]="Exclamation",n[n.Resolution=34]="Resolution",n[n.Comma=35]="Comma",n[n.Charset=36]="Charset",n[n.EscapedJavaScript=37]="EscapedJavaScript",n[n.BadEscapedJavaScript=38]="BadEscapedJavaScript",n[n.Comment=39]="Comment",n[n.SingleLineComment=40]="SingleLineComment",n[n.EOF=41]="EOF",n[n.CustomToken=42]="CustomToken"})(d||(d={}));var Kr=function(){function n(e){this.source=e,this.len=e.length,this.position=0}return n.prototype.substring=function(e,t){return t===void 0&&(t=this.position),this.source.substring(e,t)},n.prototype.eos=function(){return this.len<=this.position},n.prototype.pos=function(){return this.position},n.prototype.goBackTo=function(e){this.position=e},n.prototype.goBack=function(e){this.position-=e},n.prototype.advance=function(e){this.position+=e},n.prototype.nextChar=function(){return this.source.charCodeAt(this.position++)||0},n.prototype.peekChar=function(e){return e===void 0&&(e=0),this.source.charCodeAt(this.position+e)||0},n.prototype.lookbackChar=function(e){return e===void 0&&(e=0),this.source.charCodeAt(this.position-e)||0},n.prototype.advanceIfChar=function(e){return e===this.source.charCodeAt(this.position)?(this.position++,!0):!1},n.prototype.advanceIfChars=function(e){if(this.position+e.length>this.source.length)return!1;for(var t=0;t<e.length;t++)if(this.source.charCodeAt(this.position+t)!==e[t])return!1;return this.advance(t),!0},n.prototype.advanceWhileChar=function(e){for(var t=this.position;this.position<this.len&&e(this.source.charCodeAt(this.position));)this.position++;return this.position-t},n}();var tn=97,Gr=102,Hr=122;var nn=65,Jr=70,Xr=90,St=48,kt=57,gs=126,bs=94,Ct=61,vs=124,Ye=45,Yr=95,ys=37,qn=42,ri=40,ii=41,ws=60,xs=62,Ss=64,ks=35,Cs=36,Kn=92,Qr=47,st=10,at=13,_t=12,Zr=34,ei=39,Gn=32,Hn=9,_s=59,Fs=58,Es=123,Ds=125,zs=91,Rs=93,Is=44,ti=46,ni=33,Ms=63,Ts=43,_e={};_e[_s]=d.SemiColon;_e[Fs]=d.Colon;_e[Es]=d.CurlyL;_e[Ds]=d.CurlyR;_e[Rs]=d.BracketR;_e[zs]=d.BracketL;_e[ri]=d.ParenthesisL;_e[ii]=d.ParenthesisR;_e[Is]=d.Comma;var X={};X.em=d.EMS;X.ex=d.EXS;X.px=d.Length;X.cm=d.Length;X.mm=d.Length;X.in=d.Length;X.pt=d.Length;X.pc=d.Length;X.deg=d.Angle;X.rad=d.Angle;X.grad=d.Angle;X.ms=d.Time;X.s=d.Time;X.hz=d.Freq;X.khz=d.Freq;X["%"]=d.Percentage;X.fr=d.Percentage;X.dpi=d.Resolution;X.dpcm=d.Resolution;var Fe=function(){function n(){this.stream=new Kr(""),this.ignoreComment=!0,this.ignoreWhitespace=!0,this.inURL=!1}return n.prototype.setSource=function(e){this.stream=new Kr(e)},n.prototype.finishToken=function(e,t,r){return{offset:e,len:this.stream.pos()-e,type:t,text:r||this.stream.substring(e)}},n.prototype.substring=function(e,t){return this.stream.substring(e,e+t)},n.prototype.pos=function(){return this.stream.pos()},n.prototype.goBackTo=function(e){this.stream.goBackTo(e)},n.prototype.scanUnquotedString=function(){var e=this.stream.pos(),t=[];return this._unquotedString(t)?this.finishToken(e,d.UnquotedString,t.join("")):null},n.prototype.scan=function(){var e=this.trivia();if(e!==null)return e;var t=this.stream.pos();return this.stream.eos()?this.finishToken(t,d.EOF):this.scanNext(t)},n.prototype.tryScanUnicode=function(){var e=this.stream.pos();if(!this.stream.eos()&&this._unicodeRange())return this.finishToken(e,d.UnicodeRange);this.stream.goBackTo(e)},n.prototype.scanNext=function(e){if(this.stream.advanceIfChars([ws,ni,Ye,Ye]))return this.finishToken(e,d.CDO);if(this.stream.advanceIfChars([Ye,Ye,xs]))return this.finishToken(e,d.CDC);var t=[];if(this.ident(t))return this.finishToken(e,d.Ident,t.join(""));if(this.stream.advanceIfChar(Ss))if(t=["@"],this._name(t)){var r=t.join("");return r==="@charset"?this.finishToken(e,d.Charset,r):this.finishToken(e,d.AtKeyword,r)}else return this.finishToken(e,d.Delim);if(this.stream.advanceIfChar(ks))return t=["#"],this._name(t)?this.finishToken(e,d.Hash,t.join("")):this.finishToken(e,d.Delim);if(this.stream.advanceIfChar(ni))return this.finishToken(e,d.Exclamation);if(this._number()){var i=this.stream.pos();if(t=[this.stream.substring(e,i)],this.stream.advanceIfChar(ys))return this.finishToken(e,d.Percentage);if(this.ident(t)){var o=this.stream.substring(i).toLowerCase(),s=X[o];return typeof s<"u"?this.finishToken(e,s,t.join("")):this.finishToken(e,d.Dimension,t.join(""))}return this.finishToken(e,d.Num)}t=[];var a=this._string(t);return a!==null?this.finishToken(e,a,t.join("")):(a=_e[this.stream.peekChar()],typeof a<"u"?(this.stream.advance(1),this.finishToken(e,a)):this.stream.peekChar(0)===gs&&this.stream.peekChar(1)===Ct?(this.stream.advance(2),this.finishToken(e,d.Includes)):this.stream.peekChar(0)===vs&&this.stream.peekChar(1)===Ct?(this.stream.advance(2),this.finishToken(e,d.Dashmatch)):this.stream.peekChar(0)===qn&&this.stream.peekChar(1)===Ct?(this.stream.advance(2),this.finishToken(e,d.SubstringOperator)):this.stream.peekChar(0)===bs&&this.stream.peekChar(1)===Ct?(this.stream.advance(2),this.finishToken(e,d.PrefixOperator)):this.stream.peekChar(0)===Cs&&this.stream.peekChar(1)===Ct?(this.stream.advance(2),this.finishToken(e,d.SuffixOperator)):(this.stream.nextChar(),this.finishToken(e,d.Delim)))},n.prototype.trivia=function(){for(;;){var e=this.stream.pos();if(this._whitespace()){if(!this.ignoreWhitespace)return this.finishToken(e,d.Whitespace)}else if(this.comment()){if(!this.ignoreComment)return this.finishToken(e,d.Comment)}else return null}},n.prototype.comment=function(){if(this.stream.advanceIfChars([Qr,qn])){var e=!1,t=!1;return this.stream.advanceWhileChar(function(r){return t&&r===Qr?(e=!0,!1):(t=r===qn,!0)}),e&&this.stream.advance(1),!0}return!1},n.prototype._number=function(){var e=0,t;return this.stream.peekChar()===ti&&(e=1),t=this.stream.peekChar(e),t>=St&&t<=kt?(this.stream.advance(e+1),this.stream.advanceWhileChar(function(r){return r>=St&&r<=kt||e===0&&r===ti}),!0):!1},n.prototype._newline=function(e){var t=this.stream.peekChar();switch(t){case at:case _t:case st:return this.stream.advance(1),e.push(String.fromCharCode(t)),t===at&&this.stream.advanceIfChar(st)&&e.push(`
+`),!0}return!1},n.prototype._escape=function(e,t){var r=this.stream.peekChar();if(r===Kn){this.stream.advance(1),r=this.stream.peekChar();for(var i=0;i<6&&(r>=St&&r<=kt||r>=tn&&r<=Gr||r>=nn&&r<=Jr);)this.stream.advance(1),r=this.stream.peekChar(),i++;if(i>0){try{var o=parseInt(this.stream.substring(this.stream.pos()-i),16);o&&e.push(String.fromCharCode(o))}catch{}return r===Gn||r===Hn?this.stream.advance(1):this._newline([]),!0}if(r!==at&&r!==_t&&r!==st)return this.stream.advance(1),e.push(String.fromCharCode(r)),!0;if(t)return this._newline(e)}return!1},n.prototype._stringChar=function(e,t){var r=this.stream.peekChar();return r!==0&&r!==e&&r!==Kn&&r!==at&&r!==_t&&r!==st?(this.stream.advance(1),t.push(String.fromCharCode(r)),!0):!1},n.prototype._string=function(e){if(this.stream.peekChar()===ei||this.stream.peekChar()===Zr){var t=this.stream.nextChar();for(e.push(String.fromCharCode(t));this._stringChar(t,e)||this._escape(e,!0););return this.stream.peekChar()===t?(this.stream.nextChar(),e.push(String.fromCharCode(t)),d.String):d.BadString}return null},n.prototype._unquotedChar=function(e){var t=this.stream.peekChar();return t!==0&&t!==Kn&&t!==ei&&t!==Zr&&t!==ri&&t!==ii&&t!==Gn&&t!==Hn&&t!==st&&t!==_t&&t!==at?(this.stream.advance(1),e.push(String.fromCharCode(t)),!0):!1},n.prototype._unquotedString=function(e){for(var t=!1;this._unquotedChar(e)||this._escape(e);)t=!0;return t},n.prototype._whitespace=function(){var e=this.stream.advanceWhileChar(function(t){return t===Gn||t===Hn||t===st||t===_t||t===at});return e>0},n.prototype._name=function(e){for(var t=!1;this._identChar(e)||this._escape(e);)t=!0;return t},n.prototype.ident=function(e){var t=this.stream.pos(),r=this._minus(e);if(r){if(this._minus(e)||this._identFirstChar(e)||this._escape(e)){for(;this._identChar(e)||this._escape(e););return!0}}else if(this._identFirstChar(e)||this._escape(e)){for(;this._identChar(e)||this._escape(e););return!0}return this.stream.goBackTo(t),!1},n.prototype._identFirstChar=function(e){var t=this.stream.peekChar();return t===Yr||t>=tn&&t<=Hr||t>=nn&&t<=Xr||t>=128&&t<=65535?(this.stream.advance(1),e.push(String.fromCharCode(t)),!0):!1},n.prototype._minus=function(e){var t=this.stream.peekChar();return t===Ye?(this.stream.advance(1),e.push(String.fromCharCode(t)),!0):!1},n.prototype._identChar=function(e){var t=this.stream.peekChar();return t===Yr||t===Ye||t>=tn&&t<=Hr||t>=nn&&t<=Xr||t>=St&&t<=kt||t>=128&&t<=65535?(this.stream.advance(1),e.push(String.fromCharCode(t)),!0):!1},n.prototype._unicodeRange=function(){if(this.stream.advanceIfChar(Ts)){var e=function(i){return i>=St&&i<=kt||i>=tn&&i<=Gr||i>=nn&&i<=Jr},t=this.stream.advanceWhileChar(e)+this.stream.advanceWhileChar(function(i){return i===Ms});if(t>=1&&t<=6)if(this.stream.advanceIfChar(Ye)){var r=this.stream.advanceWhileChar(e);if(r>=1&&r<=6)return!0}else return!0}return!1},n}();function q(n,e){if(n.length<e.length)return!1;for(var t=0;t<e.length;t++)if(n[t]!==e[t])return!1;return!0}function rn(n,e){var t=n.length-e.length;return t>0?n.lastIndexOf(e)===t:t===0?n===e:!1}function oi(n,e,t){t===void 0&&(t=4);var r=Math.abs(n.length-e.length);if(r>t)return 0;var i=[],o=[],s,a;for(s=0;s<e.length+1;++s)o.push(0);for(s=0;s<n.length+1;++s)i.push(o);for(s=1;s<n.length+1;++s)for(a=1;a<e.length+1;++a)n[s-1]===e[a-1]?i[s][a]=i[s-1][a-1]+1:i[s][a]=Math.max(i[s-1][a],i[s][a-1]);return i[n.length][e.length]-Math.sqrt(r)}function Jn(n,e){return e===void 0&&(e=!0),n?n.length<140?n:n.slice(0,140)+(e?"\u2026":""):""}function si(n,e){var t=e.exec(n);return t&&t[0].length?n.substr(0,n.length-t[0].length):n}function Xn(n,e){for(var t="";e>0;)(e&1)===1&&(t+=n),n+=n,e=e>>>1;return t}var E=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}}(),u;(function(n){n[n.Undefined=0]="Undefined",n[n.Identifier=1]="Identifier",n[n.Stylesheet=2]="Stylesheet",n[n.Ruleset=3]="Ruleset",n[n.Selector=4]="Selector",n[n.SimpleSelector=5]="SimpleSelector",n[n.SelectorInterpolation=6]="SelectorInterpolation",n[n.SelectorCombinator=7]="SelectorCombinator",n[n.SelectorCombinatorParent=8]="SelectorCombinatorParent",n[n.SelectorCombinatorSibling=9]="SelectorCombinatorSibling",n[n.SelectorCombinatorAllSiblings=10]="SelectorCombinatorAllSiblings",n[n.SelectorCombinatorShadowPiercingDescendant=11]="SelectorCombinatorShadowPiercingDescendant",n[n.Page=12]="Page",n[n.PageBoxMarginBox=13]="PageBoxMarginBox",n[n.ClassSelector=14]="ClassSelector",n[n.IdentifierSelector=15]="IdentifierSelector",n[n.ElementNameSelector=16]="ElementNameSelector",n[n.PseudoSelector=17]="PseudoSelector",n[n.AttributeSelector=18]="AttributeSelector",n[n.Declaration=19]="Declaration",n[n.Declarations=20]="Declarations",n[n.Property=21]="Property",n[n.Expression=22]="Expression",n[n.BinaryExpression=23]="BinaryExpression",n[n.Term=24]="Term",n[n.Operator=25]="Operator",n[n.Value=26]="Value",n[n.StringLiteral=27]="StringLiteral",n[n.URILiteral=28]="URILiteral",n[n.EscapedValue=29]="EscapedValue",n[n.Function=30]="Function",n[n.NumericValue=31]="NumericValue",n[n.HexColorValue=32]="HexColorValue",n[n.RatioValue=33]="RatioValue",n[n.MixinDeclaration=34]="MixinDeclaration",n[n.MixinReference=35]="MixinReference",n[n.VariableName=36]="VariableName",n[n.VariableDeclaration=37]="VariableDeclaration",n[n.Prio=38]="Prio",n[n.Interpolation=39]="Interpolation",n[n.NestedProperties=40]="NestedProperties",n[n.ExtendsReference=41]="ExtendsReference",n[n.SelectorPlaceholder=42]="SelectorPlaceholder",n[n.Debug=43]="Debug",n[n.If=44]="If",n[n.Else=45]="Else",n[n.For=46]="For",n[n.Each=47]="Each",n[n.While=48]="While",n[n.MixinContentReference=49]="MixinContentReference",n[n.MixinContentDeclaration=50]="MixinContentDeclaration",n[n.Media=51]="Media",n[n.Keyframe=52]="Keyframe",n[n.FontFace=53]="FontFace",n[n.Import=54]="Import",n[n.Namespace=55]="Namespace",n[n.Invocation=56]="Invocation",n[n.FunctionDeclaration=57]="FunctionDeclaration",n[n.ReturnStatement=58]="ReturnStatement",n[n.MediaQuery=59]="MediaQuery",n[n.MediaCondition=60]="MediaCondition",n[n.MediaFeature=61]="MediaFeature",n[n.FunctionParameter=62]="FunctionParameter",n[n.FunctionArgument=63]="FunctionArgument",n[n.KeyframeSelector=64]="KeyframeSelector",n[n.ViewPort=65]="ViewPort",n[n.Document=66]="Document",n[n.AtApplyRule=67]="AtApplyRule",n[n.CustomPropertyDeclaration=68]="CustomPropertyDeclaration",n[n.CustomPropertySet=69]="CustomPropertySet",n[n.ListEntry=70]="ListEntry",n[n.Supports=71]="Supports",n[n.SupportsCondition=72]="SupportsCondition",n[n.NamespacePrefix=73]="NamespacePrefix",n[n.GridLine=74]="GridLine",n[n.Plugin=75]="Plugin",n[n.UnknownAtRule=76]="UnknownAtRule",n[n.Use=77]="Use",n[n.ModuleConfiguration=78]="ModuleConfiguration",n[n.Forward=79]="Forward",n[n.ForwardVisibility=80]="ForwardVisibility",n[n.Module=81]="Module",n[n.UnicodeRange=82]="UnicodeRange"})(u||(u={}));var A;(function(n){n[n.Mixin=0]="Mixin",n[n.Rule=1]="Rule",n[n.Variable=2]="Variable",n[n.Function=3]="Function",n[n.Keyframe=4]="Keyframe",n[n.Unknown=5]="Unknown",n[n.Module=6]="Module",n[n.Forward=7]="Forward",n[n.ForwardVisibility=8]="ForwardVisibility"})(A||(A={}));function on(n,e){var t=null;return!n||e<n.offset||e>n.end?null:(n.accept(function(r){return r.offset===-1&&r.length===-1?!0:r.offset<=e&&r.end>=e?(t?r.length<=t.length&&(t=r):t=r,!0):!1}),t)}function lt(n,e){for(var t=on(n,e),r=[];t;)r.unshift(t),t=t.parent;return r}function ai(n){var e=n.findParent(u.Declaration),t=e&&e.getValue();return t&&t.encloses(n)?e:null}var F=function(){function n(e,t,r){e===void 0&&(e=-1),t===void 0&&(t=-1),this.parent=null,this.offset=e,this.length=t,r&&(this.nodeType=r)}return Object.defineProperty(n.prototype,"end",{get:function(){return this.offset+this.length},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"type",{get:function(){return this.nodeType||u.Undefined},set:function(e){this.nodeType=e},enumerable:!1,configurable:!0}),n.prototype.getTextProvider=function(){for(var e=this;e&&!e.textProvider;)e=e.parent;return e?e.textProvider:function(){return"unknown"}},n.prototype.getText=function(){return this.getTextProvider()(this.offset,this.length)},n.prototype.matches=function(e){return this.length===e.length&&this.getTextProvider()(this.offset,this.length)===e},n.prototype.startsWith=function(e){return this.length>=e.length&&this.getTextProvider()(this.offset,e.length)===e},n.prototype.endsWith=function(e){return this.length>=e.length&&this.getTextProvider()(this.end-e.length,e.length)===e},n.prototype.accept=function(e){if(e(this)&&this.children)for(var t=0,r=this.children;t<r.length;t++){var i=r[t];i.accept(e)}},n.prototype.acceptVisitor=function(e){this.accept(e.visitNode.bind(e))},n.prototype.adoptChild=function(e,t){if(t===void 0&&(t=-1),e.parent&&e.parent.children){var r=e.parent.children.indexOf(e);r>=0&&e.parent.children.splice(r,1)}e.parent=this;var i=this.children;return i||(i=this.children=[]),t!==-1?i.splice(t,0,e):i.push(e),e},n.prototype.attachTo=function(e,t){return t===void 0&&(t=-1),e&&e.adoptChild(this,t),this},n.prototype.collectIssues=function(e){this.issues&&e.push.apply(e,this.issues)},n.prototype.addIssue=function(e){this.issues||(this.issues=[]),this.issues.push(e)},n.prototype.hasIssue=function(e){return Array.isArray(this.issues)&&this.issues.some(function(t){return t.getRule()===e})},n.prototype.isErroneous=function(e){return e===void 0&&(e=!1),this.issues&&this.issues.length>0?!0:e&&Array.isArray(this.children)&&this.children.some(function(t){return t.isErroneous(!0)})},n.prototype.setNode=function(e,t,r){return r===void 0&&(r=-1),t?(t.attachTo(this,r),this[e]=t,!0):!1},n.prototype.addChild=function(e){return e?(this.children||(this.children=[]),e.attachTo(this),this.updateOffsetAndLength(e),!0):!1},n.prototype.updateOffsetAndLength=function(e){(e.offset<this.offset||this.offset===-1)&&(this.offset=e.offset);var t=e.end;(t>this.end||this.length===-1)&&(this.length=t-this.offset)},n.prototype.hasChildren=function(){return!!this.children&&this.children.length>0},n.prototype.getChildren=function(){return this.children?this.children.slice(0):[]},n.prototype.getChild=function(e){return this.children&&e<this.children.length?this.children[e]:null},n.prototype.addChildren=function(e){for(var t=0,r=e;t<r.length;t++){var i=r[t];this.addChild(i)}},n.prototype.findFirstChildBeforeOffset=function(e){if(this.children){for(var t=null,r=this.children.length-1;r>=0;r--)if(t=this.children[r],t.offset<=e)return t}return null},n.prototype.findChildAtOffset=function(e,t){var r=this.findFirstChildBeforeOffset(e);return r&&r.end>=e?t&&r.findChildAtOffset(e,!0)||r:null},n.prototype.encloses=function(e){return this.offset<=e.offset&&this.offset+this.length>=e.offset+e.length},n.prototype.getParent=function(){for(var e=this.parent;e instanceof ee;)e=e.parent;return e},n.prototype.findParent=function(e){for(var t=this;t&&t.type!==e;)t=t.parent;return t},n.prototype.findAParent=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var r=this;r&&!e.some(function(i){return r.type===i});)r=r.parent;return r},n.prototype.setData=function(e,t){this.options||(this.options={}),this.options[e]=t},n.prototype.getData=function(e){return!this.options||!this.options.hasOwnProperty(e)?null:this.options[e]},n}();var ee=function(n){E(e,n);function e(t,r){r===void 0&&(r=-1);var i=n.call(this,-1,-1)||this;return i.attachTo(t,r),i.offset=-1,i.length=-1,i}return e}(F);var li=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.UnicodeRange},enumerable:!1,configurable:!0}),e.prototype.setRangeStart=function(t){return this.setNode("rangeStart",t)},e.prototype.getRangeStart=function(){return this.rangeStart},e.prototype.setRangeEnd=function(t){return this.setNode("rangeEnd",t)},e.prototype.getRangeEnd=function(){return this.rangeEnd},e}(F);var te=function(n){E(e,n);function e(t,r){var i=n.call(this,t,r)||this;return i.isCustomProperty=!1,i}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Identifier},enumerable:!1,configurable:!0}),e.prototype.containsInterpolation=function(){return this.hasChildren()},e}(F);var ci=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Stylesheet},enumerable:!1,configurable:!0}),e}(F);var Ft=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Declarations},enumerable:!1,configurable:!0}),e}(F);var K=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return e.prototype.getDeclarations=function(){return this.declarations},e.prototype.setDeclarations=function(t){return this.setNode("declarations",t)},e}(F);var Te=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Ruleset},enumerable:!1,configurable:!0}),e.prototype.getSelectors=function(){return this.selectors||(this.selectors=new ee(this)),this.selectors},e.prototype.isNested=function(){return!!this.parent&&this.parent.findParent(u.Declarations)!==null},e}(K);var Ee=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Selector},enumerable:!1,configurable:!0}),e}(F);var De=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.SimpleSelector},enumerable:!1,configurable:!0}),e}(F);var cl=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.AtApplyRule},enumerable:!1,configurable:!0}),e.prototype.setIdentifier=function(t){return this.setNode("identifier",t,0)},e.prototype.getIdentifier=function(){return this.identifier},e.prototype.getName=function(){return this.identifier?this.identifier.getText():""},e}(F);var sn=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return e}(F);var di=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.CustomPropertySet},enumerable:!1,configurable:!0}),e}(K);var ae=function(n){E(e,n);function e(t,r){var i=n.call(this,t,r)||this;return i.property=null,i}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Declaration},enumerable:!1,configurable:!0}),e.prototype.setProperty=function(t){return this.setNode("property",t)},e.prototype.getProperty=function(){return this.property},e.prototype.getFullPropertyName=function(){var t=this.property?this.property.getName():"unknown";if(this.parent instanceof Ft&&this.parent.getParent()instanceof Yn){var r=this.parent.getParent().getParent();if(r instanceof e)return r.getFullPropertyName()+t}return t},e.prototype.getNonPrefixedPropertyName=function(){var t=this.getFullPropertyName();if(t&&t.charAt(0)==="-"){var r=t.indexOf("-",1);if(r!==-1)return t.substring(r+1)}return t},e.prototype.setValue=function(t){return this.setNode("value",t)},e.prototype.getValue=function(){return this.value},e.prototype.setNestedProperties=function(t){return this.setNode("nestedProperties",t)},e.prototype.getNestedProperties=function(){return this.nestedProperties},e}(sn);var hi=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.CustomPropertyDeclaration},enumerable:!1,configurable:!0}),e.prototype.setPropertySet=function(t){return this.setNode("propertySet",t)},e.prototype.getPropertySet=function(){return this.propertySet},e}(ae);var ct=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Property},enumerable:!1,configurable:!0}),e.prototype.setIdentifier=function(t){return this.setNode("identifier",t)},e.prototype.getIdentifier=function(){return this.identifier},e.prototype.getName=function(){return si(this.getText(),/[_\+]+$/)},e.prototype.isCustomProperty=function(){return!!this.identifier&&this.identifier.isCustomProperty},e}(F);var Ns=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Invocation},enumerable:!1,configurable:!0}),e.prototype.getArguments=function(){return this.arguments||(this.arguments=new ee(this)),this.arguments},e}(F);var Pe=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Function},enumerable:!1,configurable:!0}),e.prototype.setIdentifier=function(t){return this.setNode("identifier",t,0)},e.prototype.getIdentifier=function(){return this.identifier},e.prototype.getName=function(){return this.identifier?this.identifier.getText():""},e}(Ns);var Be=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.FunctionParameter},enumerable:!1,configurable:!0}),e.prototype.setIdentifier=function(t){return this.setNode("identifier",t,0)},e.prototype.getIdentifier=function(){return this.identifier},e.prototype.getName=function(){return this.identifier?this.identifier.getText():""},e.prototype.setDefaultValue=function(t){return this.setNode("defaultValue",t,0)},e.prototype.getDefaultValue=function(){return this.defaultValue},e}(F);var we=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.FunctionArgument},enumerable:!1,configurable:!0}),e.prototype.setIdentifier=function(t){return this.setNode("identifier",t,0)},e.prototype.getIdentifier=function(){return this.identifier},e.prototype.getName=function(){return this.identifier?this.identifier.getText():""},e.prototype.setValue=function(t){return this.setNode("value",t,0)},e.prototype.getValue=function(){return this.value},e}(F);var pi=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.If},enumerable:!1,configurable:!0}),e.prototype.setExpression=function(t){return this.setNode("expression",t,0)},e.prototype.setElseClause=function(t){return this.setNode("elseClause",t)},e}(K);var ui=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.For},enumerable:!1,configurable:!0}),e.prototype.setVariable=function(t){return this.setNode("variable",t,0)},e}(K);var mi=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Each},enumerable:!1,configurable:!0}),e.prototype.getVariables=function(){return this.variables||(this.variables=new ee(this)),this.variables},e}(K);var fi=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.While},enumerable:!1,configurable:!0}),e}(K);var gi=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Else},enumerable:!1,configurable:!0}),e}(K);var Qe=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.FunctionDeclaration},enumerable:!1,configurable:!0}),e.prototype.setIdentifier=function(t){return this.setNode("identifier",t,0)},e.prototype.getIdentifier=function(){return this.identifier},e.prototype.getName=function(){return this.identifier?this.identifier.getText():""},e.prototype.getParameters=function(){return this.parameters||(this.parameters=new ee(this)),this.parameters},e}(K);var bi=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.ViewPort},enumerable:!1,configurable:!0}),e}(K);var an=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.FontFace},enumerable:!1,configurable:!0}),e}(K);var Yn=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.NestedProperties},enumerable:!1,configurable:!0}),e}(K);var ln=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Keyframe},enumerable:!1,configurable:!0}),e.prototype.setKeyword=function(t){return this.setNode("keyword",t,0)},e.prototype.getKeyword=function(){return this.keyword},e.prototype.setIdentifier=function(t){return this.setNode("identifier",t,0)},e.prototype.getIdentifier=function(){return this.identifier},e.prototype.getName=function(){return this.identifier?this.identifier.getText():""},e}(K);var Qn=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.KeyframeSelector},enumerable:!1,configurable:!0}),e}(K);var dt=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Import},enumerable:!1,configurable:!0}),e.prototype.setMedialist=function(t){return t?(t.attachTo(this),!0):!1},e}(F);var vi=function(n){E(e,n);function e(){return n!==null&&n.apply(this,arguments)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Use},enumerable:!1,configurable:!0}),e.prototype.getParameters=function(){return this.parameters||(this.parameters=new ee(this)),this.parameters},e.prototype.setIdentifier=function(t){return this.setNode("identifier",t,0)},e.prototype.getIdentifier=function(){return this.identifier},e}(F);var yi=function(n){E(e,n);function e(){return n!==null&&n.apply(this,arguments)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.ModuleConfiguration},enumerable:!1,configurable:!0}),e.prototype.setIdentifier=function(t){return this.setNode("identifier",t,0)},e.prototype.getIdentifier=function(){return this.identifier},e.prototype.getName=function(){return this.identifier?this.identifier.getText():""},e.prototype.setValue=function(t){return this.setNode("value",t,0)},e.prototype.getValue=function(){return this.value},e}(F);var wi=function(n){E(e,n);function e(){return n!==null&&n.apply(this,arguments)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Forward},enumerable:!1,configurable:!0}),e.prototype.setIdentifier=function(t){return this.setNode("identifier",t,0)},e.prototype.getIdentifier=function(){return this.identifier},e.prototype.getMembers=function(){return this.members||(this.members=new ee(this)),this.members},e.prototype.getParameters=function(){return this.parameters||(this.parameters=new ee(this)),this.parameters},e}(F);var xi=function(n){E(e,n);function e(){return n!==null&&n.apply(this,arguments)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.ForwardVisibility},enumerable:!1,configurable:!0}),e.prototype.setIdentifier=function(t){return this.setNode("identifier",t,0)},e.prototype.getIdentifier=function(){return this.identifier},e}(F);var Si=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Namespace},enumerable:!1,configurable:!0}),e}(F);var cn=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Media},enumerable:!1,configurable:!0}),e}(K);var Et=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Supports},enumerable:!1,configurable:!0}),e}(K);var ki=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Document},enumerable:!1,configurable:!0}),e}(K);var dn=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return e.prototype.getMediums=function(){return this.mediums||(this.mediums=new ee(this)),this.mediums},e}(F);var hn=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.MediaQuery},enumerable:!1,configurable:!0}),e}(F);var Ci=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.MediaCondition},enumerable:!1,configurable:!0}),e}(F);var _i=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.MediaFeature},enumerable:!1,configurable:!0}),e}(F);var Ze=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.SupportsCondition},enumerable:!1,configurable:!0}),e}(F);var Fi=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Page},enumerable:!1,configurable:!0}),e}(K);var Ei=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.PageBoxMarginBox},enumerable:!1,configurable:!0}),e}(K);var pn=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Expression},enumerable:!1,configurable:!0}),e}(F);var ht=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.BinaryExpression},enumerable:!1,configurable:!0}),e.prototype.setLeft=function(t){return this.setNode("left",t)},e.prototype.getLeft=function(){return this.left},e.prototype.setRight=function(t){return this.setNode("right",t)},e.prototype.getRight=function(){return this.right},e.prototype.setOperator=function(t){return this.setNode("operator",t)},e.prototype.getOperator=function(){return this.operator},e}(F);var Di=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Term},enumerable:!1,configurable:!0}),e.prototype.setOperator=function(t){return this.setNode("operator",t)},e.prototype.getOperator=function(){return this.operator},e.prototype.setExpression=function(t){return this.setNode("expression",t)},e.prototype.getExpression=function(){return this.expression},e}(F);var zi=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.AttributeSelector},enumerable:!1,configurable:!0}),e.prototype.setNamespacePrefix=function(t){return this.setNode("namespacePrefix",t)},e.prototype.getNamespacePrefix=function(){return this.namespacePrefix},e.prototype.setIdentifier=function(t){return this.setNode("identifier",t)},e.prototype.getIdentifier=function(){return this.identifier},e.prototype.setOperator=function(t){return this.setNode("operator",t)},e.prototype.getOperator=function(){return this.operator},e.prototype.setValue=function(t){return this.setNode("value",t)},e.prototype.getValue=function(){return this.value},e}(F);var dl=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Operator},enumerable:!1,configurable:!0}),e}(F);var Dt=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.HexColorValue},enumerable:!1,configurable:!0}),e}(F);var Ri=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.RatioValue},enumerable:!1,configurable:!0}),e}(F);var Os=46,Ws=48,Ls=57,zt=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.NumericValue},enumerable:!1,configurable:!0}),e.prototype.getValue=function(){for(var t=this.getText(),r=0,i,o=0,s=t.length;o<s&&(i=t.charCodeAt(o),Ws<=i&&i<=Ls||i===Os);o++)r+=1;return{value:t.substring(0,r),unit:r<t.length?t.substring(r):void 0}},e}(F);var $e=function(n){E(e,n);function e(t,r){var i=n.call(this,t,r)||this;return i.variable=null,i.value=null,i.needsSemicolon=!0,i}return Object.defineProperty(e.prototype,"type",{get:function(){return u.VariableDeclaration},enumerable:!1,configurable:!0}),e.prototype.setVariable=function(t){return t?(t.attachTo(this),this.variable=t,!0):!1},e.prototype.getVariable=function(){return this.variable},e.prototype.getName=function(){return this.variable?this.variable.getName():""},e.prototype.setValue=function(t){return t?(t.attachTo(this),this.value=t,!0):!1},e.prototype.getValue=function(){return this.value},e}(sn);var Rt=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Interpolation},enumerable:!1,configurable:!0}),e}(F);var pt=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.VariableName},enumerable:!1,configurable:!0}),e.prototype.getName=function(){return this.getText()},e}(F);var qe=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.ExtendsReference},enumerable:!1,configurable:!0}),e.prototype.getSelectors=function(){return this.selectors||(this.selectors=new ee(this)),this.selectors},e}(F);var Ii=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.MixinContentReference},enumerable:!1,configurable:!0}),e.prototype.getArguments=function(){return this.arguments||(this.arguments=new ee(this)),this.arguments},e}(F);var Mi=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.MixinContentReference},enumerable:!1,configurable:!0}),e.prototype.getParameters=function(){return this.parameters||(this.parameters=new ee(this)),this.parameters},e}(K);var et=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.MixinReference},enumerable:!1,configurable:!0}),e.prototype.getNamespaces=function(){return this.namespaces||(this.namespaces=new ee(this)),this.namespaces},e.prototype.setIdentifier=function(t){return this.setNode("identifier",t,0)},e.prototype.getIdentifier=function(){return this.identifier},e.prototype.getName=function(){return this.identifier?this.identifier.getText():""},e.prototype.getArguments=function(){return this.arguments||(this.arguments=new ee(this)),this.arguments},e.prototype.setContent=function(t){return this.setNode("content",t)},e.prototype.getContent=function(){return this.content},e}(F);var Ae=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.MixinDeclaration},enumerable:!1,configurable:!0}),e.prototype.setIdentifier=function(t){return this.setNode("identifier",t,0)},e.prototype.getIdentifier=function(){return this.identifier},e.prototype.getName=function(){return this.identifier?this.identifier.getText():""},e.prototype.getParameters=function(){return this.parameters||(this.parameters=new ee(this)),this.parameters},e.prototype.setGuard=function(t){return t&&(t.attachTo(this),this.guard=t),!1},e}(K);var un=function(n){E(e,n);function e(t,r){return n.call(this,t,r)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.UnknownAtRule},enumerable:!1,configurable:!0}),e.prototype.setAtRuleName=function(t){this.atRuleName=t},e.prototype.getAtRuleName=function(){return this.atRuleName},e}(K);var Ti=function(n){E(e,n);function e(){return n!==null&&n.apply(this,arguments)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.ListEntry},enumerable:!1,configurable:!0}),e.prototype.setKey=function(t){return this.setNode("key",t,0)},e.prototype.setValue=function(t){return this.setNode("value",t,1)},e}(F);var Pi=function(n){E(e,n);function e(){return n!==null&&n.apply(this,arguments)||this}return e.prototype.getConditions=function(){return this.conditions||(this.conditions=new ee(this)),this.conditions},e}(F);var Ai=function(n){E(e,n);function e(){return n!==null&&n.apply(this,arguments)||this}return e.prototype.setVariable=function(t){return this.setNode("variable",t)},e}(F);var Zn=function(n){E(e,n);function e(){return n!==null&&n.apply(this,arguments)||this}return Object.defineProperty(e.prototype,"type",{get:function(){return u.Module},enumerable:!1,configurable:!0}),e.prototype.setIdentifier=function(t){return this.setNode("identifier",t,0)},e.prototype.getIdentifier=function(){return this.identifier},e}(F);var ne;(function(n){n[n.Ignore=1]="Ignore",n[n.Warning=2]="Warning",n[n.Error=4]="Error"})(ne||(ne={}));var mn=function(){function n(e,t,r,i,o,s){o===void 0&&(o=e.offset),s===void 0&&(s=e.length),this.node=e,this.rule=t,this.level=r,this.message=i||t.message,this.offset=o,this.length=s}return n.prototype.getRule=function(){return this.rule},n.prototype.getLevel=function(){return this.level},n.prototype.getOffset=function(){return this.offset},n.prototype.getLength=function(){return this.length},n.prototype.getNode=function(){return this.node},n.prototype.getMessage=function(){return this.message},n}();var Ni=function(){function n(){this.entries=[]}return n.entries=function(e){var t=new n;return e.acceptVisitor(t),t.entries},n.prototype.visitNode=function(e){return e.isErroneous()&&e.collectIssues(this.entries),!0},n}();function Us(n,e){let t;return e.length===0?t=n:t=n.replace(/\{(\d+)\}/g,(r,i)=>{let o=i[0];return typeof e[o]<"u"?e[o]:r}),t}function js(n,e,...t){return Us(e,t)}function H(n){return js}var U=H(),j=function(){function n(e,t){this.id=e,this.message=t}return n}();var f={NumberExpected:new j("css-numberexpected",U("expected.number","number expected")),ConditionExpected:new j("css-conditionexpected",U("expected.condt","condition expected")),RuleOrSelectorExpected:new j("css-ruleorselectorexpected",U("expected.ruleorselector","at-rule or selector expected")),DotExpected:new j("css-dotexpected",U("expected.dot","dot expected")),ColonExpected:new j("css-colonexpected",U("expected.colon","colon expected")),SemiColonExpected:new j("css-semicolonexpected",U("expected.semicolon","semi-colon expected")),TermExpected:new j("css-termexpected",U("expected.term","term expected")),ExpressionExpected:new j("css-expressionexpected",U("expected.expression","expression expected")),OperatorExpected:new j("css-operatorexpected",U("expected.operator","operator expected")),IdentifierExpected:new j("css-identifierexpected",U("expected.ident","identifier expected")),PercentageExpected:new j("css-percentageexpected",U("expected.percentage","percentage expected")),URIOrStringExpected:new j("css-uriorstringexpected",U("expected.uriorstring","uri or string expected")),URIExpected:new j("css-uriexpected",U("expected.uri","URI expected")),VariableNameExpected:new j("css-varnameexpected",U("expected.varname","variable name expected")),VariableValueExpected:new j("css-varvalueexpected",U("expected.varvalue","variable value expected")),PropertyValueExpected:new j("css-propertyvalueexpected",U("expected.propvalue","property value expected")),LeftCurlyExpected:new j("css-lcurlyexpected",U("expected.lcurly","{ expected")),RightCurlyExpected:new j("css-rcurlyexpected",U("expected.rcurly","} expected")),LeftSquareBracketExpected:new j("css-rbracketexpected",U("expected.lsquare","[ expected")),RightSquareBracketExpected:new j("css-lbracketexpected",U("expected.rsquare","] expected")),LeftParenthesisExpected:new j("css-lparentexpected",U("expected.lparen","( expected")),RightParenthesisExpected:new j("css-rparentexpected",U("expected.rparent",") expected")),CommaExpected:new j("css-commaexpected",U("expected.comma","comma expected")),PageDirectiveOrDeclarationExpected:new j("css-pagedirordeclexpected",U("expected.pagedirordecl","page directive or declaraton expected")),UnknownAtRule:new j("css-unknownatrule",U("unknown.atrule","at-rule unknown")),UnknownKeyword:new j("css-unknownkeyword",U("unknown.keyword","unknown keyword")),SelectorExpected:new j("css-selectorexpected",U("expected.selector","selector expected")),StringLiteralExpected:new j("css-stringliteralexpected",U("expected.stringliteral","string literal expected")),WhitespaceExpected:new j("css-whitespaceexpected",U("expected.whitespace","whitespace expected")),MediaQueryExpected:new j("css-mediaqueryexpected",U("expected.mediaquery","media query expected")),IdentifierOrWildcardExpected:new j("css-idorwildcardexpected",U("expected.idorwildcard","identifier or wildcard expected")),WildcardExpected:new j("css-wildcardexpected",U("expected.wildcard","wildcard expected")),IdentifierOrVariableExpected:new j("css-idorvarexpected",U("expected.idorvar","identifier or variable expected"))};var Oi;(function(n){n.MIN_VALUE=-2147483648,n.MAX_VALUE=2147483647})(Oi||(Oi={}));var gn;(function(n){n.MIN_VALUE=0,n.MAX_VALUE=2147483647})(gn||(gn={}));var Q;(function(n){function e(r,i){return r===Number.MAX_VALUE&&(r=gn.MAX_VALUE),i===Number.MAX_VALUE&&(i=gn.MAX_VALUE),{line:r,character:i}}n.create=e;function t(r){var i=r;return v.objectLiteral(i)&&v.uinteger(i.line)&&v.uinteger(i.character)}n.is=t})(Q||(Q={}));var W;(function(n){function e(r,i,o,s){if(v.uinteger(r)&&v.uinteger(i)&&v.uinteger(o)&&v.uinteger(s))return{start:Q.create(r,i),end:Q.create(o,s)};if(Q.is(r)&&Q.is(i))return{start:r,end:i};throw new Error("Range#create called with invalid arguments["+r+", "+i+", "+o+", "+s+"]")}n.create=e;function t(r){var i=r;return v.objectLiteral(i)&&Q.is(i.start)&&Q.is(i.end)}n.is=t})(W||(W={}));var tt;(function(n){function e(r,i){return{uri:r,range:i}}n.create=e;function t(r){var i=r;return v.defined(i)&&W.is(i.range)&&(v.string(i.uri)||v.undefined(i.uri))}n.is=t})(tt||(tt={}));var Wi;(function(n){function e(r,i,o,s){return{targetUri:r,targetRange:i,targetSelectionRange:o,originSelectionRange:s}}n.create=e;function t(r){var i=r;return v.defined(i)&&W.is(i.targetRange)&&v.string(i.targetUri)&&(W.is(i.targetSelectionRange)||v.undefined(i.targetSelectionRange))&&(W.is(i.originSelectionRange)||v.undefined(i.originSelectionRange))}n.is=t})(Wi||(Wi={}));var bn;(function(n){function e(r,i,o,s){return{red:r,green:i,blue:o,alpha:s}}n.create=e;function t(r){var i=r;return v.numberRange(i.red,0,1)&&v.numberRange(i.green,0,1)&&v.numberRange(i.blue,0,1)&&v.numberRange(i.alpha,0,1)}n.is=t})(bn||(bn={}));var er;(function(n){function e(r,i){return{range:r,color:i}}n.create=e;function t(r){var i=r;return W.is(i.range)&&bn.is(i.color)}n.is=t})(er||(er={}));var tr;(function(n){function e(r,i,o){return{label:r,textEdit:i,additionalTextEdits:o}}n.create=e;function t(r){var i=r;return v.string(i.label)&&(v.undefined(i.textEdit)||T.is(i))&&(v.undefined(i.additionalTextEdits)||v.typedArray(i.additionalTextEdits,T.is))}n.is=t})(tr||(tr={}));var nr;(function(n){n.Comment="comment",n.Imports="imports",n.Region="region"})(nr||(nr={}));var rr;(function(n){function e(r,i,o,s,a){var l={startLine:r,endLine:i};return v.defined(o)&&(l.startCharacter=o),v.defined(s)&&(l.endCharacter=s),v.defined(a)&&(l.kind=a),l}n.create=e;function t(r){var i=r;return v.uinteger(i.startLine)&&v.uinteger(i.startLine)&&(v.undefined(i.startCharacter)||v.uinteger(i.startCharacter))&&(v.undefined(i.endCharacter)||v.uinteger(i.endCharacter))&&(v.undefined(i.kind)||v.string(i.kind))}n.is=t})(rr||(rr={}));var ir;(function(n){function e(r,i){return{location:r,message:i}}n.create=e;function t(r){var i=r;return v.defined(i)&&tt.is(i.location)&&v.string(i.message)}n.is=t})(ir||(ir={}));var mt;(function(n){n.Error=1,n.Warning=2,n.Information=3,n.Hint=4})(mt||(mt={}));var Li;(function(n){n.Unnecessary=1,n.Deprecated=2})(Li||(Li={}));var Ui;(function(n){function e(t){var r=t;return r!=null&&v.string(r.href)}n.is=e})(Ui||(Ui={}));var It;(function(n){function e(r,i,o,s,a,l){var c={range:r,message:i};return v.defined(o)&&(c.severity=o),v.defined(s)&&(c.code=s),v.defined(a)&&(c.source=a),v.defined(l)&&(c.relatedInformation=l),c}n.create=e;function t(r){var i,o=r;return v.defined(o)&&W.is(o.range)&&v.string(o.message)&&(v.number(o.severity)||v.undefined(o.severity))&&(v.integer(o.code)||v.string(o.code)||v.undefined(o.code))&&(v.undefined(o.codeDescription)||v.string((i=o.codeDescription)===null||i===void 0?void 0:i.href))&&(v.string(o.source)||v.undefined(o.source))&&(v.undefined(o.relatedInformation)||v.typedArray(o.relatedInformation,ir.is))}n.is=t})(It||(It={}));var Ge;(function(n){function e(r,i){for(var o=[],s=2;s<arguments.length;s++)o[s-2]=arguments[s];var a={title:r,command:i};return v.defined(o)&&o.length>0&&(a.arguments=o),a}n.create=e;function t(r){var i=r;return v.defined(i)&&v.string(i.title)&&v.string(i.command)}n.is=t})(Ge||(Ge={}));var T;(function(n){function e(o,s){return{range:o,newText:s}}n.replace=e;function t(o,s){return{range:{start:o,end:o},newText:s}}n.insert=t;function r(o){return{range:o,newText:""}}n.del=r;function i(o){var s=o;return v.objectLiteral(s)&&v.string(s.newText)&&W.is(s.range)}n.is=i})(T||(T={}));var ut;(function(n){function e(r,i,o){var s={label:r};return i!==void 0&&(s.needsConfirmation=i),o!==void 0&&(s.description=o),s}n.create=e;function t(r){var i=r;return i!==void 0&&v.objectLiteral(i)&&v.string(i.label)&&(v.boolean(i.needsConfirmation)||i.needsConfirmation===void 0)&&(v.string(i.description)||i.description===void 0)}n.is=t})(ut||(ut={}));var le;(function(n){function e(t){var r=t;return typeof r=="string"}n.is=e})(le||(le={}));var Ke;(function(n){function e(o,s,a){return{range:o,newText:s,annotationId:a}}n.replace=e;function t(o,s,a){return{range:{start:o,end:o},newText:s,annotationId:a}}n.insert=t;function r(o,s){return{range:o,newText:"",annotationId:s}}n.del=r;function i(o){var s=o;return T.is(s)&&(ut.is(s.annotationId)||le.is(s.annotationId))}n.is=i})(Ke||(Ke={}));var nt;(function(n){function e(r,i){return{textDocument:r,edits:i}}n.create=e;function t(r){var i=r;return v.defined(i)&&yn.is(i.textDocument)&&Array.isArray(i.edits)}n.is=t})(nt||(nt={}));var Mt;(function(n){function e(r,i,o){var s={kind:"create",uri:r};return i!==void 0&&(i.overwrite!==void 0||i.ignoreIfExists!==void 0)&&(s.options=i),o!==void 0&&(s.annotationId=o),s}n.create=e;function t(r){var i=r;return i&&i.kind==="create"&&v.string(i.uri)&&(i.options===void 0||(i.options.overwrite===void 0||v.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||v.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||le.is(i.annotationId))}n.is=t})(Mt||(Mt={}));var Tt;(function(n){function e(r,i,o,s){var a={kind:"rename",oldUri:r,newUri:i};return o!==void 0&&(o.overwrite!==void 0||o.ignoreIfExists!==void 0)&&(a.options=o),s!==void 0&&(a.annotationId=s),a}n.create=e;function t(r){var i=r;return i&&i.kind==="rename"&&v.string(i.oldUri)&&v.string(i.newUri)&&(i.options===void 0||(i.options.overwrite===void 0||v.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||v.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||le.is(i.annotationId))}n.is=t})(Tt||(Tt={}));var Pt;(function(n){function e(r,i,o){var s={kind:"delete",uri:r};return i!==void 0&&(i.recursive!==void 0||i.ignoreIfNotExists!==void 0)&&(s.options=i),o!==void 0&&(s.annotationId=o),s}n.create=e;function t(r){var i=r;return i&&i.kind==="delete"&&v.string(i.uri)&&(i.options===void 0||(i.options.recursive===void 0||v.boolean(i.options.recursive))&&(i.options.ignoreIfNotExists===void 0||v.boolean(i.options.ignoreIfNotExists)))&&(i.annotationId===void 0||le.is(i.annotationId))}n.is=t})(Pt||(Pt={}));var vn;(function(n){function e(t){var r=t;return r&&(r.changes!==void 0||r.documentChanges!==void 0)&&(r.documentChanges===void 0||r.documentChanges.every(function(i){return v.string(i.kind)?Mt.is(i)||Tt.is(i)||Pt.is(i):nt.is(i)}))}n.is=e})(vn||(vn={}));var fn=function(){function n(e,t){this.edits=e,this.changeAnnotations=t}return n.prototype.insert=function(e,t,r){var i,o;if(r===void 0?i=T.insert(e,t):le.is(r)?(o=r,i=Ke.insert(e,t,r)):(this.assertChangeAnnotations(this.changeAnnotations),o=this.changeAnnotations.manage(r),i=Ke.insert(e,t,o)),this.edits.push(i),o!==void 0)return o},n.prototype.replace=function(e,t,r){var i,o;if(r===void 0?i=T.replace(e,t):le.is(r)?(o=r,i=Ke.replace(e,t,r)):(this.assertChangeAnnotations(this.changeAnnotations),o=this.changeAnnotations.manage(r),i=Ke.replace(e,t,o)),this.edits.push(i),o!==void 0)return o},n.prototype.delete=function(e,t){var r,i;if(t===void 0?r=T.del(e):le.is(t)?(i=t,r=Ke.del(e,t)):(this.assertChangeAnnotations(this.changeAnnotations),i=this.changeAnnotations.manage(t),r=Ke.del(e,i)),this.edits.push(r),i!==void 0)return i},n.prototype.add=function(e){this.edits.push(e)},n.prototype.all=function(){return this.edits},n.prototype.clear=function(){this.edits.splice(0,this.edits.length)},n.prototype.assertChangeAnnotations=function(e){if(e===void 0)throw new Error("Text edit change is not configured to manage change annotations.")},n}(),ji=function(){function n(e){this._annotations=e===void 0?Object.create(null):e,this._counter=0,this._size=0}return n.prototype.all=function(){return this._annotations},Object.defineProperty(n.prototype,"size",{get:function(){return this._size},enumerable:!1,configurable:!0}),n.prototype.manage=function(e,t){var r;if(le.is(e)?r=e:(r=this.nextId(),t=e),this._annotations[r]!==void 0)throw new Error("Id "+r+" is already in use.");if(t===void 0)throw new Error("No annotation provided for id "+r);return this._annotations[r]=t,this._size++,r},n.prototype.nextId=function(){return this._counter++,this._counter.toString()},n}(),pl=function(){function n(e){var t=this;this._textEditChanges=Object.create(null),e!==void 0?(this._workspaceEdit=e,e.documentChanges?(this._changeAnnotations=new ji(e.changeAnnotations),e.changeAnnotations=this._changeAnnotations.all(),e.documentChanges.forEach(function(r){if(nt.is(r)){var i=new fn(r.edits,t._changeAnnotations);t._textEditChanges[r.textDocument.uri]=i}})):e.changes&&Object.keys(e.changes).forEach(function(r){var i=new fn(e.changes[r]);t._textEditChanges[r]=i})):this._workspaceEdit={}}return Object.defineProperty(n.prototype,"edit",{get:function(){return this.initDocumentChanges(),this._changeAnnotations!==void 0&&(this._changeAnnotations.size===0?this._workspaceEdit.changeAnnotations=void 0:this._workspaceEdit.changeAnnotations=this._changeAnnotations.all()),this._workspaceEdit},enumerable:!1,configurable:!0}),n.prototype.getTextEditChange=function(e){if(yn.is(e)){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var t={uri:e.uri,version:e.version},r=this._textEditChanges[t.uri];if(!r){var i=[],o={textDocument:t,edits:i};this._workspaceEdit.documentChanges.push(o),r=new fn(i,this._changeAnnotations),this._textEditChanges[t.uri]=r}return r}else{if(this.initChanges(),this._workspaceEdit.changes===void 0)throw new Error("Workspace edit is not configured for normal text edit changes.");var r=this._textEditChanges[e];if(!r){var i=[];this._workspaceEdit.changes[e]=i,r=new fn(i),this._textEditChanges[e]=r}return r}},n.prototype.initDocumentChanges=function(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._changeAnnotations=new ji,this._workspaceEdit.documentChanges=[],this._workspaceEdit.changeAnnotations=this._changeAnnotations.all())},n.prototype.initChanges=function(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._workspaceEdit.changes=Object.create(null))},n.prototype.createFile=function(e,t,r){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var i;ut.is(t)||le.is(t)?i=t:r=t;var o,s;if(i===void 0?o=Mt.create(e,r):(s=le.is(i)?i:this._changeAnnotations.manage(i),o=Mt.create(e,r,s)),this._workspaceEdit.documentChanges.push(o),s!==void 0)return s},n.prototype.renameFile=function(e,t,r,i){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var o;ut.is(r)||le.is(r)?o=r:i=r;var s,a;if(o===void 0?s=Tt.create(e,t,i):(a=le.is(o)?o:this._changeAnnotations.manage(o),s=Tt.create(e,t,i,a)),this._workspaceEdit.documentChanges.push(s),a!==void 0)return a},n.prototype.deleteFile=function(e,t,r){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var i;ut.is(t)||le.is(t)?i=t:r=t;var o,s;if(i===void 0?o=Pt.create(e,r):(s=le.is(i)?i:this._changeAnnotations.manage(i),o=Pt.create(e,r,s)),this._workspaceEdit.documentChanges.push(o),s!==void 0)return s},n}();var Vi;(function(n){function e(r){return{uri:r}}n.create=e;function t(r){var i=r;return v.defined(i)&&v.string(i.uri)}n.is=t})(Vi||(Vi={}));var At;(function(n){function e(r,i){return{uri:r,version:i}}n.create=e;function t(r){var i=r;return v.defined(i)&&v.string(i.uri)&&v.integer(i.version)}n.is=t})(At||(At={}));var yn;(function(n){function e(r,i){return{uri:r,version:i}}n.create=e;function t(r){var i=r;return v.defined(i)&&v.string(i.uri)&&(i.version===null||v.integer(i.version))}n.is=t})(yn||(yn={}));var Bi;(function(n){function e(r,i,o,s){return{uri:r,languageId:i,version:o,text:s}}n.create=e;function t(r){var i=r;return v.defined(i)&&v.string(i.uri)&&v.string(i.languageId)&&v.integer(i.version)&&v.string(i.text)}n.is=t})(Bi||(Bi={}));var ce;(function(n){n.PlainText="plaintext",n.Markdown="markdown"})(ce||(ce={}));(function(n){function e(t){var r=t;return r===n.PlainText||r===n.Markdown}n.is=e})(ce||(ce={}));var wn;(function(n){function e(t){var r=t;return v.objectLiteral(t)&&ce.is(r.kind)&&v.string(r.value)}n.is=e})(wn||(wn={}));var R;(function(n){n.Text=1,n.Method=2,n.Function=3,n.Constructor=4,n.Field=5,n.Variable=6,n.Class=7,n.Interface=8,n.Module=9,n.Property=10,n.Unit=11,n.Value=12,n.Enum=13,n.Keyword=14,n.Snippet=15,n.Color=16,n.File=17,n.Reference=18,n.Folder=19,n.EnumMember=20,n.Constant=21,n.Struct=22,n.Event=23,n.Operator=24,n.TypeParameter=25})(R||(R={}));var re;(function(n){n.PlainText=1,n.Snippet=2})(re||(re={}));var Ne;(function(n){n.Deprecated=1})(Ne||(Ne={}));var $i;(function(n){function e(r,i,o){return{newText:r,insert:i,replace:o}}n.create=e;function t(r){var i=r;return i&&v.string(i.newText)&&W.is(i.insert)&&W.is(i.replace)}n.is=t})($i||($i={}));var qi;(function(n){n.asIs=1,n.adjustIndentation=2})(qi||(qi={}));var or;(function(n){function e(t){return{label:t}}n.create=e})(or||(or={}));var sr;(function(n){function e(t,r){return{items:t||[],isIncomplete:!!r}}n.create=e})(sr||(sr={}));var Nt;(function(n){function e(r){return r.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}n.fromPlainText=e;function t(r){var i=r;return v.string(i)||v.objectLiteral(i)&&v.string(i.language)&&v.string(i.value)}n.is=t})(Nt||(Nt={}));var ar;(function(n){function e(t){var r=t;return!!r&&v.objectLiteral(r)&&(wn.is(r.contents)||Nt.is(r.contents)||v.typedArray(r.contents,Nt.is))&&(t.range===void 0||W.is(t.range))}n.is=e})(ar||(ar={}));var Ki;(function(n){function e(t,r){return r?{label:t,documentation:r}:{label:t}}n.create=e})(Ki||(Ki={}));var Gi;(function(n){function e(t,r){for(var i=[],o=2;o<arguments.length;o++)i[o-2]=arguments[o];var s={label:t};return v.defined(r)&&(s.documentation=r),v.defined(i)?s.parameters=i:s.parameters=[],s}n.create=e})(Gi||(Gi={}));var He;(function(n){n.Text=1,n.Read=2,n.Write=3})(He||(He={}));var lr;(function(n){function e(t,r){var i={range:t};return v.number(r)&&(i.kind=r),i}n.create=e})(lr||(lr={}));var Oe;(function(n){n.File=1,n.Module=2,n.Namespace=3,n.Package=4,n.Class=5,n.Method=6,n.Property=7,n.Field=8,n.Constructor=9,n.Enum=10,n.Interface=11,n.Function=12,n.Variable=13,n.Constant=14,n.String=15,n.Number=16,n.Boolean=17,n.Array=18,n.Object=19,n.Key=20,n.Null=21,n.EnumMember=22,n.Struct=23,n.Event=24,n.Operator=25,n.TypeParameter=26})(Oe||(Oe={}));var Hi;(function(n){n.Deprecated=1})(Hi||(Hi={}));var cr;(function(n){function e(t,r,i,o,s){var a={name:t,kind:r,location:{uri:o,range:i}};return s&&(a.containerName=s),a}n.create=e})(cr||(cr={}));var dr;(function(n){function e(r,i,o,s,a,l){var c={name:r,detail:i,kind:o,range:s,selectionRange:a};return l!==void 0&&(c.children=l),c}n.create=e;function t(r){var i=r;return i&&v.string(i.name)&&v.number(i.kind)&&W.is(i.range)&&W.is(i.selectionRange)&&(i.detail===void 0||v.string(i.detail))&&(i.deprecated===void 0||v.boolean(i.deprecated))&&(i.children===void 0||Array.isArray(i.children))&&(i.tags===void 0||Array.isArray(i.tags))}n.is=t})(dr||(dr={}));var Ot;(function(n){n.Empty="",n.QuickFix="quickfix",n.Refactor="refactor",n.RefactorExtract="refactor.extract",n.RefactorInline="refactor.inline",n.RefactorRewrite="refactor.rewrite",n.Source="source",n.SourceOrganizeImports="source.organizeImports",n.SourceFixAll="source.fixAll"})(Ot||(Ot={}));var hr;(function(n){function e(r,i){var o={diagnostics:r};return i!=null&&(o.only=i),o}n.create=e;function t(r){var i=r;return v.defined(i)&&v.typedArray(i.diagnostics,It.is)&&(i.only===void 0||v.typedArray(i.only,v.string))}n.is=t})(hr||(hr={}));var Wt;(function(n){function e(r,i,o){var s={title:r},a=!0;return typeof i=="string"?(a=!1,s.kind=i):Ge.is(i)?s.command=i:s.edit=i,a&&o!==void 0&&(s.kind=o),s}n.create=e;function t(r){var i=r;return i&&v.string(i.title)&&(i.diagnostics===void 0||v.typedArray(i.diagnostics,It.is))&&(i.kind===void 0||v.string(i.kind))&&(i.edit!==void 0||i.command!==void 0)&&(i.command===void 0||Ge.is(i.command))&&(i.isPreferred===void 0||v.boolean(i.isPreferred))&&(i.edit===void 0||vn.is(i.edit))}n.is=t})(Wt||(Wt={}));var Ji;(function(n){function e(r,i){var o={range:r};return v.defined(i)&&(o.data=i),o}n.create=e;function t(r){var i=r;return v.defined(i)&&W.is(i.range)&&(v.undefined(i.command)||Ge.is(i.command))}n.is=t})(Ji||(Ji={}));var Xi;(function(n){function e(r,i){return{tabSize:r,insertSpaces:i}}n.create=e;function t(r){var i=r;return v.defined(i)&&v.uinteger(i.tabSize)&&v.boolean(i.insertSpaces)}n.is=t})(Xi||(Xi={}));var pr;(function(n){function e(r,i,o){return{range:r,target:i,data:o}}n.create=e;function t(r){var i=r;return v.defined(i)&&W.is(i.range)&&(v.undefined(i.target)||v.string(i.target))}n.is=t})(pr||(pr={}));var ft;(function(n){function e(r,i){return{range:r,parent:i}}n.create=e;function t(r){var i=r;return i!==void 0&&W.is(i.range)&&(i.parent===void 0||n.is(i.parent))}n.is=t})(ft||(ft={}));var Yi;(function(n){function e(o,s,a,l){return new Vs(o,s,a,l)}n.create=e;function t(o){var s=o;return!!(v.defined(s)&&v.string(s.uri)&&(v.undefined(s.languageId)||v.string(s.languageId))&&v.uinteger(s.lineCount)&&v.func(s.getText)&&v.func(s.positionAt)&&v.func(s.offsetAt))}n.is=t;function r(o,s){for(var a=o.getText(),l=i(s,function(w,x){var y=w.range.start.line-x.range.start.line;return y===0?w.range.start.character-x.range.start.character:y}),c=a.length,h=l.length-1;h>=0;h--){var p=l[h],m=o.offsetAt(p.range.start),g=o.offsetAt(p.range.end);if(g<=c)a=a.substring(0,m)+p.newText+a.substring(g,a.length);else throw new Error("Overlapping edit");c=m}return a}n.applyEdits=r;function i(o,s){if(o.length<=1)return o;var a=o.length/2|0,l=o.slice(0,a),c=o.slice(a);i(l,s),i(c,s);for(var h=0,p=0,m=0;h<l.length&&p<c.length;){var g=s(l[h],c[p]);g<=0?o[m++]=l[h++]:o[m++]=c[p++]}for(;h<l.length;)o[m++]=l[h++];for(;p<c.length;)o[m++]=c[p++];return o}})(Yi||(Yi={}));var Vs=function(){function n(e,t,r,i){this._uri=e,this._languageId=t,this._version=r,this._content=i,this._lineOffsets=void 0}return Object.defineProperty(n.prototype,"uri",{get:function(){return this._uri},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"languageId",{get:function(){return this._languageId},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"version",{get:function(){return this._version},enumerable:!1,configurable:!0}),n.prototype.getText=function(e){if(e){var t=this.offsetAt(e.start),r=this.offsetAt(e.end);return this._content.substring(t,r)}return this._content},n.prototype.update=function(e,t){this._content=e.text,this._version=t,this._lineOffsets=void 0},n.prototype.getLineOffsets=function(){if(this._lineOffsets===void 0){for(var e=[],t=this._content,r=!0,i=0;i<t.length;i++){r&&(e.push(i),r=!1);var o=t.charAt(i);r=o==="\r"||o===`
+`,o==="\r"&&i+1<t.length&&t.charAt(i+1)===`
+`&&i++}r&&t.length>0&&e.push(t.length),this._lineOffsets=e}return this._lineOffsets},n.prototype.positionAt=function(e){e=Math.max(Math.min(e,this._content.length),0);var t=this.getLineOffsets(),r=0,i=t.length;if(i===0)return Q.create(0,e);for(;r<i;){var o=Math.floor((r+i)/2);t[o]>e?i=o:r=o+1}var s=r-1;return Q.create(s,e-t[s])},n.prototype.offsetAt=function(e){var t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;var r=t[e.line],i=e.line+1<t.length?t[e.line+1]:this._content.length;return Math.max(Math.min(r+e.character,i),r)},Object.defineProperty(n.prototype,"lineCount",{get:function(){return this.getLineOffsets().length},enumerable:!1,configurable:!0}),n}(),v;(function(n){var e=Object.prototype.toString;function t(g){return typeof g<"u"}n.defined=t;function r(g){return typeof g>"u"}n.undefined=r;function i(g){return g===!0||g===!1}n.boolean=i;function o(g){return e.call(g)==="[object String]"}n.string=o;function s(g){return e.call(g)==="[object Number]"}n.number=s;function a(g,w,x){return e.call(g)==="[object Number]"&&w<=g&&g<=x}n.numberRange=a;function l(g){return e.call(g)==="[object Number]"&&-2147483648<=g&&g<=2147483647}n.integer=l;function c(g){return e.call(g)==="[object Number]"&&0<=g&&g<=2147483647}n.uinteger=c;function h(g){return e.call(g)==="[object Function]"}n.func=h;function p(g){return g!==null&&typeof g=="object"}n.objectLiteral=p;function m(g,w){return Array.isArray(g)&&g.every(w)}n.typedArray=m})(v||(v={}));var xn=class n{constructor(e,t,r,i){this._uri=e,this._languageId=t,this._version=r,this._content=i,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let t=this.offsetAt(e.start),r=this.offsetAt(e.end);return this._content.substring(t,r)}return this._content}update(e,t){for(let r of e)if(n.isIncremental(r)){let i=Zi(r.range),o=this.offsetAt(i.start),s=this.offsetAt(i.end);this._content=this._content.substring(0,o)+r.text+this._content.substring(s,this._content.length);let a=Math.max(i.start.line,0),l=Math.max(i.end.line,0),c=this._lineOffsets,h=Qi(r.text,!1,o);if(l-a===h.length)for(let m=0,g=h.length;m<g;m++)c[m+a+1]=h[m];else h.length<1e4?c.splice(a+1,l-a,...h):this._lineOffsets=c=c.slice(0,a+1).concat(h,c.slice(l+1));let p=r.text.length-(s-o);if(p!==0)for(let m=a+1+h.length,g=c.length;m<g;m++)c[m]=c[m]+p}else if(n.isFull(r))this._content=r.text,this._lineOffsets=void 0;else throw new Error("Unknown change event received");this._version=t}getLineOffsets(){return this._lineOffsets===void 0&&(this._lineOffsets=Qi(this._content,!0)),this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let t=this.getLineOffsets(),r=0,i=t.length;if(i===0)return{line:0,character:e};for(;r<i;){let s=Math.floor((r+i)/2);t[s]>e?i=s:r=s+1}let o=r-1;return{line:o,character:e-t[o]}}offsetAt(e){let t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;let r=t[e.line],i=e.line+1<t.length?t[e.line+1]:this._content.length;return Math.max(Math.min(r+e.character,i),r)}get lineCount(){return this.getLineOffsets().length}static isIncremental(e){let t=e;return t!=null&&typeof t.text=="string"&&t.range!==void 0&&(t.rangeLength===void 0||typeof t.rangeLength=="number")}static isFull(e){let t=e;return t!=null&&typeof t.text=="string"&&t.range===void 0&&t.rangeLength===void 0}},Lt;(function(n){function e(i,o,s,a){return new xn(i,o,s,a)}n.create=e;function t(i,o,s){if(i instanceof xn)return i.update(o,s),i;throw new Error("TextDocument.update: document must be created by TextDocument.create")}n.update=t;function r(i,o){let s=i.getText(),a=ur(o.map(Bs),(h,p)=>{let m=h.range.start.line-p.range.start.line;return m===0?h.range.start.character-p.range.start.character:m}),l=0,c=[];for(let h of a){let p=i.offsetAt(h.range.start);if(p<l)throw new Error("Overlapping edit");p>l&&c.push(s.substring(l,p)),h.newText.length&&c.push(h.newText),l=i.offsetAt(h.range.end)}return c.push(s.substr(l)),c.join("")}n.applyEdits=r})(Lt||(Lt={}));function ur(n,e){if(n.length<=1)return n;let t=n.length/2|0,r=n.slice(0,t),i=n.slice(t);ur(r,e),ur(i,e);let o=0,s=0,a=0;for(;o<r.length&&s<i.length;)e(r[o],i[s])<=0?n[a++]=r[o++]:n[a++]=i[s++];for(;o<r.length;)n[a++]=r[o++];for(;s<i.length;)n[a++]=i[s++];return n}function Qi(n,e,t=0){let r=e?[t]:[];for(let i=0;i<n.length;i++){let o=n.charCodeAt(i);(o===13||o===10)&&(o===13&&i+1<n.length&&n.charCodeAt(i+1)===10&&i++,r.push(t+i+1))}return r}function Zi(n){let e=n.start,t=n.end;return e.line>t.line||e.line===t.line&&e.character>t.character?{start:t,end:e}:n}function Bs(n){let e=Zi(n.range);return e!==n.range?{newText:n.newText,range:e}:n}var eo;(function(n){n.LATEST={textDocument:{completion:{completionItem:{documentationFormat:[ce.Markdown,ce.PlainText]}},hover:{contentFormat:[ce.Markdown,ce.PlainText]}}}})(eo||(eo={}));var rt;(function(n){n[n.Unknown=0]="Unknown",n[n.File=1]="File",n[n.Directory=2]="Directory",n[n.SymbolicLink=64]="SymbolicLink"})(rt||(rt={}));var to={E:"Edge",FF:"Firefox",S:"Safari",C:"Chrome",IE:"IE",O:"Opera"};function no(n){switch(n){case"experimental":return`\u26A0\uFE0F Property is experimental. Be cautious when using it.\uFE0F
+
+`;case"nonstandard":return`\u{1F6A8}\uFE0F Property is nonstandard. Avoid using it.
+
+`;case"obsolete":return`\u{1F6A8}\uFE0F\uFE0F\uFE0F Property is obsolete. Avoid using it.
+
+`;default:return""}}function ze(n,e,t){var r;if(e?r={kind:"markdown",value:qs(n,t)}:r={kind:"plaintext",value:$s(n,t)},r.value!=="")return r}function Sn(n){return n=n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&"),n.replace(/</g,"&lt;").replace(/>/g,"&gt;")}function $s(n,e){if(!n.description||n.description==="")return"";if(typeof n.description!="string")return n.description.value;var t="";if(e?.documentation!==!1){n.status&&(t+=no(n.status)),t+=n.description;var r=ro(n.browsers);r&&(t+=`
+(`+r+")"),"syntax"in n&&(t+=`
+
+Syntax: `.concat(n.syntax))}return n.references&&n.references.length>0&&e?.references!==!1&&(t.length>0&&(t+=`
+
+`),t+=n.references.map(function(i){return"".concat(i.name,": ").concat(i.url)}).join(" | ")),t}function qs(n,e){if(!n.description||n.description==="")return"";var t="";if(e?.documentation!==!1){n.status&&(t+=no(n.status)),typeof n.description=="string"?t+=Sn(n.description):t+=n.description.kind===ce.Markdown?n.description.value:Sn(n.description.value);var r=ro(n.browsers);r&&(t+=`
+
+(`+Sn(r)+")"),"syntax"in n&&n.syntax&&(t+=`
+
+Syntax: `.concat(Sn(n.syntax)))}return n.references&&n.references.length>0&&e?.references!==!1&&(t.length>0&&(t+=`
+
+`),t+=n.references.map(function(i){return"[".concat(i.name,"](").concat(i.url,")")}).join(" | ")),t}function ro(n){return n===void 0&&(n=[]),n.length===0?null:n.map(function(e){var t="",r=e.match(/([A-Z]+)(\d+)?/),i=r[1],o=r[2];return i in to&&(t+=to[i]),o&&(t+=" "+o),t}).join(", ")}var Ut=H(),ao=[{func:"rgb($red, $green, $blue)",desc:Ut("css.builtin.rgb","Creates a Color from red, green, and blue values.")},{func:"rgba($red, $green, $blue, $alpha)",desc:Ut("css.builtin.rgba","Creates a Color from red, green, blue, and alpha values.")},{func:"hsl($hue, $saturation, $lightness)",desc:Ut("css.builtin.hsl","Creates a Color from hue, saturation, and lightness values.")},{func:"hsla($hue, $saturation, $lightness, $alpha)",desc:Ut("css.builtin.hsla","Creates a Color from hue, saturation, lightness, and alpha values.")},{func:"hwb($hue $white $black)",desc:Ut("css.builtin.hwb","Creates a Color from hue, white and black.")}],jt={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},mr={currentColor:"The value of the 'color' property. The computed value of the 'currentColor' keyword is the computed value of the 'color' property. If the 'currentColor' keyword is set on the 'color' property itself, it is treated as 'color:inherit' at parse time.",transparent:"Fully transparent. This keyword can be considered a shorthand for rgba(0,0,0,0) which is its computed value."};function Je(n,e){var t=n.getText(),r=t.match(/^([-+]?[0-9]*\.?[0-9]+)(%?)$/);if(r){r[2]&&(e=100);var i=parseFloat(r[1])/e;if(i>=0&&i<=1)return i}throw new Error}function io(n){var e=n.getText(),t=e.match(/^([-+]?[0-9]*\.?[0-9]+)(deg|rad|grad|turn)?$/);if(t)switch(t[2]){case"deg":return parseFloat(e)%360;case"rad":return parseFloat(e)*180/Math.PI%360;case"grad":return parseFloat(e)*.9%360;case"turn":return parseFloat(e)*360%360;default:if(typeof t[2]>"u")return parseFloat(e)%360}throw new Error}function lo(n){var e=n.getName();return e?/^(rgb|rgba|hsl|hsla|hwb)$/gi.test(e):!1}var oo=48,Ks=57,Gs=65;var kn=97,Hs=102;function J(n){return n<oo?0:n<=Ks?n-oo:(n<kn&&(n+=kn-Gs),n>=kn&&n<=Hs?n-kn+10:0)}function so(n){if(n[0]!=="#")return null;switch(n.length){case 4:return{red:J(n.charCodeAt(1))*17/255,green:J(n.charCodeAt(2))*17/255,blue:J(n.charCodeAt(3))*17/255,alpha:1};case 5:return{red:J(n.charCodeAt(1))*17/255,green:J(n.charCodeAt(2))*17/255,blue:J(n.charCodeAt(3))*17/255,alpha:J(n.charCodeAt(4))*17/255};case 7:return{red:(J(n.charCodeAt(1))*16+J(n.charCodeAt(2)))/255,green:(J(n.charCodeAt(3))*16+J(n.charCodeAt(4)))/255,blue:(J(n.charCodeAt(5))*16+J(n.charCodeAt(6)))/255,alpha:1};case 9:return{red:(J(n.charCodeAt(1))*16+J(n.charCodeAt(2)))/255,green:(J(n.charCodeAt(3))*16+J(n.charCodeAt(4)))/255,blue:(J(n.charCodeAt(5))*16+J(n.charCodeAt(6)))/255,alpha:(J(n.charCodeAt(7))*16+J(n.charCodeAt(8)))/255}}return null}function co(n,e,t,r){if(r===void 0&&(r=1),n=n/60,e===0)return{red:t,green:t,blue:t,alpha:r};var i=function(a,l,c){for(;c<0;)c+=6;for(;c>=6;)c-=6;return c<1?(l-a)*c+a:c<3?l:c<4?(l-a)*(4-c)+a:a},o=t<=.5?t*(e+1):t+e-t*e,s=t*2-o;return{red:i(s,o,n+2),green:i(s,o,n),blue:i(s,o,n-2),alpha:r}}function fr(n){var e=n.red,t=n.green,r=n.blue,i=n.alpha,o=Math.max(e,t,r),s=Math.min(e,t,r),a=0,l=0,c=(s+o)/2,h=o-s;if(h>0){switch(l=Math.min(c<=.5?h/(2*c):h/(2-2*c),1),o){case e:a=(t-r)/h+(t<r?6:0);break;case t:a=(r-e)/h+2;break;case r:a=(e-t)/h+4;break}a*=60,a=Math.round(a)}return{h:a,s:l,l:c,a:i}}function Js(n,e,t,r){if(r===void 0&&(r=1),e+t>=1){var i=e/(e+t);return{red:i,green:i,blue:i,alpha:r}}var o=co(n,1,.5,r),s=o.red;s*=1-e-t,s+=e;var a=o.green;a*=1-e-t,a+=e;var l=o.blue;return l*=1-e-t,l+=e,{red:s,green:a,blue:l,alpha:r}}function ho(n){var e=fr(n),t=Math.min(n.red,n.green,n.blue),r=1-Math.max(n.red,n.green,n.blue);return{h:e.h,w:t,b:r,a:e.a}}function po(n){if(n.type===u.HexColorValue){var e=n.getText();return so(e)}else if(n.type===u.Function){var t=n,r=t.getName(),i=t.getArguments().getChildren();if(i.length===1){var o=i[0].getChildren();if(o.length===1&&o[0].type===u.Expression&&(i=o[0].getChildren(),i.length===3)){var s=i[2];if(s instanceof ht){var a=s.getLeft(),l=s.getRight(),c=s.getOperator();a&&l&&c&&c.matches("/")&&(i=[i[0],i[1],a,l])}}}if(!r||i.length<3||i.length>4)return null;try{var h=i.length===4?Je(i[3],1):1;if(r==="rgb"||r==="rgba")return{red:Je(i[0],255),green:Je(i[1],255),blue:Je(i[2],255),alpha:h};if(r==="hsl"||r==="hsla"){var p=io(i[0]),m=Je(i[1],100),g=Je(i[2],100);return co(p,m,g,h)}else if(r==="hwb"){var p=io(i[0]),w=Je(i[1],100),x=Je(i[2],100);return Js(p,w,x,h)}}catch{return null}}else if(n.type===u.Identifier){if(n.parent&&n.parent.type!==u.Term)return null;var y=n.parent;if(y&&y.parent&&y.parent.type===u.BinaryExpression){var D=y.parent;if(D.parent&&D.parent.type===u.ListEntry&&D.parent.key===D)return null}var M=n.getText().toLowerCase();if(M==="none")return null;var z=jt[M];if(z)return so(z)}return null}var gr={bottom:"Computes to \u2018100%\u2019 for the vertical position if one or two values are given, otherwise specifies the bottom edge as the origin for the next offset.",center:"Computes to \u201850%\u2019 (\u2018left 50%\u2019) for the horizontal position if the horizontal position is not otherwise specified, or \u201850%\u2019 (\u2018top 50%\u2019) for the vertical position if it is.",left:"Computes to \u20180%\u2019 for the horizontal position if one or two values are given, otherwise specifies the left edge as the origin for the next offset.",right:"Computes to \u2018100%\u2019 for the horizontal position if one or two values are given, otherwise specifies the right edge as the origin for the next offset.",top:"Computes to \u20180%\u2019 for the vertical position if one or two values are given, otherwise specifies the top edge as the origin for the next offset."},br={"no-repeat":"Placed once and not repeated in this direction.",repeat:"Repeated in this direction as often as needed to cover the background painting area.","repeat-x":"Computes to \u2018repeat no-repeat\u2019.","repeat-y":"Computes to \u2018no-repeat repeat\u2019.",round:"Repeated as often as will fit within the background positioning area. If it doesn\u2019t fit a whole number of times, it is rescaled so that it does.",space:"Repeated as often as will fit within the background positioning area without being clipped and then the images are spaced out to fill the area."},vr={dashed:"A series of square-ended dashes.",dotted:"A series of round dots.",double:"Two parallel solid lines with some space between them.",groove:"Looks as if it were carved in the canvas.",hidden:"Same as \u2018none\u2019, but has different behavior in the border conflict resolution rules for border-collapsed tables.",inset:"Looks as if the content on the inside of the border is sunken into the canvas.",none:"No border. Color and width are ignored.",outset:"Looks as if the content on the inside of the border is coming out of the canvas.",ridge:"Looks as if it were coming out of the canvas.",solid:"A single line segment."},uo=["medium","thick","thin"],yr={"border-box":"The background is painted within (clipped to) the border box.","content-box":"The background is painted within (clipped to) the content box.","padding-box":"The background is painted within (clipped to) the padding box."},wr={"margin-box":"Uses the margin box as reference box.","fill-box":"Uses the object bounding box as reference box.","stroke-box":"Uses the stroke bounding box as reference box.","view-box":"Uses the nearest SVG viewport as reference box."},xr={initial:"Represents the value specified as the property\u2019s initial value.",inherit:"Represents the computed value of the property on the element\u2019s parent.",unset:"Acts as either `inherit` or `initial`, depending on whether the property is inherited or not."},Sr={"var()":"Evaluates the value of a custom variable.","calc()":"Evaluates an mathematical expression. The following operators can be used: + - * /."},kr={"url()":"Reference an image file by URL","image()":"Provide image fallbacks and annotations.","-webkit-image-set()":"Provide multiple resolutions. Remember to use unprefixed image-set() in addition.","image-set()":"Provide multiple resolutions of an image and const the UA decide which is most appropriate in a given situation.","-moz-element()":"Use an element in the document as an image. Remember to use unprefixed element() in addition.","element()":"Use an element in the document as an image.","cross-fade()":"Indicates the two images to be combined and how far along in the transition the combination is.","-webkit-gradient()":"Deprecated. Use modern linear-gradient() or radial-gradient() instead.","-webkit-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","-moz-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","-o-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","linear-gradient()":"A linear gradient is created by specifying a straight gradient line, and then several colors placed along that line.","-webkit-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","-moz-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","-o-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","repeating-linear-gradient()":"Same as linear-gradient, except the color-stops are repeated infinitely in both directions, with their positions shifted by multiples of the difference between the last specified color-stop\u2019s position and the first specified color-stop\u2019s position.","-webkit-radial-gradient()":"Radial gradient. Remember to use unprefixed version in addition.","-moz-radial-gradient()":"Radial gradient. Remember to use unprefixed version in addition.","radial-gradient()":"Colors emerge from a single point and smoothly spread outward in a circular or elliptical shape.","-webkit-repeating-radial-gradient()":"Repeating radial gradient. Remember to use unprefixed version in addition.","-moz-repeating-radial-gradient()":"Repeating radial gradient. Remember to use unprefixed version in addition.","repeating-radial-gradient()":"Same as radial-gradient, except the color-stops are repeated infinitely in both directions, with their positions shifted by multiples of the difference between the last specified color-stop\u2019s position and the first specified color-stop\u2019s position."},Cr={ease:"Equivalent to cubic-bezier(0.25, 0.1, 0.25, 1.0).","ease-in":"Equivalent to cubic-bezier(0.42, 0, 1.0, 1.0).","ease-in-out":"Equivalent to cubic-bezier(0.42, 0, 0.58, 1.0).","ease-out":"Equivalent to cubic-bezier(0, 0, 0.58, 1.0).",linear:"Equivalent to cubic-bezier(0.0, 0.0, 1.0, 1.0).","step-end":"Equivalent to steps(1, end).","step-start":"Equivalent to steps(1, start).","steps()":"The first parameter specifies the number of intervals in the function. The second parameter, which is optional, is either the value \u201Cstart\u201D or \u201Cend\u201D.","cubic-bezier()":"Specifies a cubic-bezier curve. The four values specify points P1 and P2  of the curve as (x1, y1, x2, y2).","cubic-bezier(0.6, -0.28, 0.735, 0.045)":"Ease-in Back. Overshoots.","cubic-bezier(0.68, -0.55, 0.265, 1.55)":"Ease-in-out Back. Overshoots.","cubic-bezier(0.175, 0.885, 0.32, 1.275)":"Ease-out Back. Overshoots.","cubic-bezier(0.6, 0.04, 0.98, 0.335)":"Ease-in Circular. Based on half circle.","cubic-bezier(0.785, 0.135, 0.15, 0.86)":"Ease-in-out Circular. Based on half circle.","cubic-bezier(0.075, 0.82, 0.165, 1)":"Ease-out Circular. Based on half circle.","cubic-bezier(0.55, 0.055, 0.675, 0.19)":"Ease-in Cubic. Based on power of three.","cubic-bezier(0.645, 0.045, 0.355, 1)":"Ease-in-out Cubic. Based on power of three.","cubic-bezier(0.215, 0.610, 0.355, 1)":"Ease-out Cubic. Based on power of three.","cubic-bezier(0.95, 0.05, 0.795, 0.035)":"Ease-in Exponential. Based on two to the power ten.","cubic-bezier(1, 0, 0, 1)":"Ease-in-out Exponential. Based on two to the power ten.","cubic-bezier(0.19, 1, 0.22, 1)":"Ease-out Exponential. Based on two to the power ten.","cubic-bezier(0.47, 0, 0.745, 0.715)":"Ease-in Sine.","cubic-bezier(0.445, 0.05, 0.55, 0.95)":"Ease-in-out Sine.","cubic-bezier(0.39, 0.575, 0.565, 1)":"Ease-out Sine.","cubic-bezier(0.55, 0.085, 0.68, 0.53)":"Ease-in Quadratic. Based on power of two.","cubic-bezier(0.455, 0.03, 0.515, 0.955)":"Ease-in-out Quadratic. Based on power of two.","cubic-bezier(0.25, 0.46, 0.45, 0.94)":"Ease-out Quadratic. Based on power of two.","cubic-bezier(0.895, 0.03, 0.685, 0.22)":"Ease-in Quartic. Based on power of four.","cubic-bezier(0.77, 0, 0.175, 1)":"Ease-in-out Quartic. Based on power of four.","cubic-bezier(0.165, 0.84, 0.44, 1)":"Ease-out Quartic. Based on power of four.","cubic-bezier(0.755, 0.05, 0.855, 0.06)":"Ease-in Quintic. Based on power of five.","cubic-bezier(0.86, 0, 0.07, 1)":"Ease-in-out Quintic. Based on power of five.","cubic-bezier(0.23, 1, 0.320, 1)":"Ease-out Quintic. Based on power of five."},_r={"circle()":"Defines a circle.","ellipse()":"Defines an ellipse.","inset()":"Defines an inset rectangle.","polygon()":"Defines a polygon."},Cn={length:["em","rem","ex","px","cm","mm","in","pt","pc","ch","vw","vh","vmin","vmax"],angle:["deg","rad","grad","turn"],time:["ms","s"],frequency:["Hz","kHz"],resolution:["dpi","dpcm","dppx"],percentage:["%","fr"]},mo=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","const","video","wbr"],fo=["circle","clipPath","cursor","defs","desc","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","foreignObject","g","hatch","hatchpath","image","line","linearGradient","marker","mask","mesh","meshpatch","meshrow","metadata","mpath","path","pattern","polygon","polyline","radialGradient","rect","set","solidcolor","stop","svg","switch","symbol","text","textPath","tspan","use","view"],go=["@bottom-center","@bottom-left","@bottom-left-corner","@bottom-right","@bottom-right-corner","@left-bottom","@left-middle","@left-top","@right-bottom","@right-middle","@right-top","@top-center","@top-left","@top-left-corner","@top-right","@top-right-corner"];function Vt(n){return Object.keys(n).map(function(e){return n[e]})}function he(n){return typeof n<"u"}var bo=function(n,e,t){if(t||arguments.length===2)for(var r=0,i=e.length,o;r<i;r++)(o||!(r in e))&&(o||(o=Array.prototype.slice.call(e,0,r)),o[r]=e[r]);return n.concat(o||Array.prototype.slice.call(e))},gt=function(){function n(e){e===void 0&&(e=new Fe),this.keyframeRegex=/^@(\-(webkit|ms|moz|o)\-)?keyframes$/i,this.scanner=e,this.token={type:d.EOF,offset:-1,len:0,text:""},this.prevToken=void 0}return n.prototype.peekIdent=function(e){return d.Ident===this.token.type&&e.length===this.token.text.length&&e===this.token.text.toLowerCase()},n.prototype.peekKeyword=function(e){return d.AtKeyword===this.token.type&&e.length===this.token.text.length&&e===this.token.text.toLowerCase()},n.prototype.peekDelim=function(e){return d.Delim===this.token.type&&e===this.token.text},n.prototype.peek=function(e){return e===this.token.type},n.prototype.peekOne=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e.indexOf(this.token.type)!==-1},n.prototype.peekRegExp=function(e,t){return e!==this.token.type?!1:t.test(this.token.text)},n.prototype.hasWhitespace=function(){return!!this.prevToken&&this.prevToken.offset+this.prevToken.len!==this.token.offset},n.prototype.consumeToken=function(){this.prevToken=this.token,this.token=this.scanner.scan()},n.prototype.acceptUnicodeRange=function(){var e=this.scanner.tryScanUnicode();return e?(this.prevToken=e,this.token=this.scanner.scan(),!0):!1},n.prototype.mark=function(){return{prev:this.prevToken,curr:this.token,pos:this.scanner.pos()}},n.prototype.restoreAtMark=function(e){this.prevToken=e.prev,this.token=e.curr,this.scanner.goBackTo(e.pos)},n.prototype.try=function(e){var t=this.mark(),r=e();return r||(this.restoreAtMark(t),null)},n.prototype.acceptOneKeyword=function(e){if(d.AtKeyword===this.token.type)for(var t=0,r=e;t<r.length;t++){var i=r[t];if(i.length===this.token.text.length&&i===this.token.text.toLowerCase())return this.consumeToken(),!0}return!1},n.prototype.accept=function(e){return e===this.token.type?(this.consumeToken(),!0):!1},n.prototype.acceptIdent=function(e){return this.peekIdent(e)?(this.consumeToken(),!0):!1},n.prototype.acceptKeyword=function(e){return this.peekKeyword(e)?(this.consumeToken(),!0):!1},n.prototype.acceptDelim=function(e){return this.peekDelim(e)?(this.consumeToken(),!0):!1},n.prototype.acceptRegexp=function(e){return e.test(this.token.text)?(this.consumeToken(),!0):!1},n.prototype._parseRegexp=function(e){var t=this.createNode(u.Identifier);do;while(this.acceptRegexp(e));return this.finish(t)},n.prototype.acceptUnquotedString=function(){var e=this.scanner.pos();this.scanner.goBackTo(this.token.offset);var t=this.scanner.scanUnquotedString();return t?(this.token=t,this.consumeToken(),!0):(this.scanner.goBackTo(e),!1)},n.prototype.resync=function(e,t){for(;;){if(e&&e.indexOf(this.token.type)!==-1)return this.consumeToken(),!0;if(t&&t.indexOf(this.token.type)!==-1)return!0;if(this.token.type===d.EOF)return!1;this.token=this.scanner.scan()}},n.prototype.createNode=function(e){return new F(this.token.offset,this.token.len,e)},n.prototype.create=function(e){return new e(this.token.offset,this.token.len)},n.prototype.finish=function(e,t,r,i){if(!(e instanceof ee)&&(t&&this.markError(e,t,r,i),this.prevToken)){var o=this.prevToken.offset+this.prevToken.len;e.length=o>e.offset?o-e.offset:0}return e},n.prototype.markError=function(e,t,r,i){this.token!==this.lastErrorToken&&(e.addIssue(new mn(e,t,ne.Error,void 0,this.token.offset,this.token.len)),this.lastErrorToken=this.token),(r||i)&&this.resync(r,i)},n.prototype.parseStylesheet=function(e){var t=e.version,r=e.getText(),i=function(o,s){if(e.version!==t)throw new Error("Underlying model has changed, AST is no longer valid");return r.substr(o,s)};return this.internalParse(r,this._parseStylesheet,i)},n.prototype.internalParse=function(e,t,r){this.scanner.setSource(e),this.token=this.scanner.scan();var i=t.bind(this)();return i&&(r?i.textProvider=r:i.textProvider=function(o,s){return e.substr(o,s)}),i},n.prototype._parseStylesheet=function(){for(var e=this.create(ci);e.addChild(this._parseStylesheetStart()););var t=!1;do{var r=!1;do{r=!1;var i=this._parseStylesheetStatement();for(i&&(e.addChild(i),r=!0,t=!1,!this.peek(d.EOF)&&this._needsSemicolonAfter(i)&&!this.accept(d.SemiColon)&&this.markError(e,f.SemiColonExpected));this.accept(d.SemiColon)||this.accept(d.CDO)||this.accept(d.CDC);)r=!0,t=!1}while(r);if(this.peek(d.EOF))break;t||(this.peek(d.AtKeyword)?this.markError(e,f.UnknownAtRule):this.markError(e,f.RuleOrSelectorExpected),t=!0),this.consumeToken()}while(!this.peek(d.EOF));return this.finish(e)},n.prototype._parseStylesheetStart=function(){return this._parseCharset()},n.prototype._parseStylesheetStatement=function(e){return e===void 0&&(e=!1),this.peek(d.AtKeyword)?this._parseStylesheetAtStatement(e):this._parseRuleset(e)},n.prototype._parseStylesheetAtStatement=function(e){return e===void 0&&(e=!1),this._parseImport()||this._parseMedia(e)||this._parsePage()||this._parseFontFace()||this._parseKeyframe()||this._parseSupports(e)||this._parseViewPort()||this._parseNamespace()||this._parseDocument()||this._parseUnknownAtRule()},n.prototype._tryParseRuleset=function(e){var t=this.mark();if(this._parseSelector(e)){for(;this.accept(d.Comma)&&this._parseSelector(e););if(this.accept(d.CurlyL))return this.restoreAtMark(t),this._parseRuleset(e)}return this.restoreAtMark(t),null},n.prototype._parseRuleset=function(e){e===void 0&&(e=!1);var t=this.create(Te),r=t.getSelectors();if(!r.addChild(this._parseSelector(e)))return null;for(;this.accept(d.Comma);)if(!r.addChild(this._parseSelector(e)))return this.finish(t,f.SelectorExpected);return this._parseBody(t,this._parseRuleSetDeclaration.bind(this))},n.prototype._parseRuleSetDeclarationAtStatement=function(){return this._parseUnknownAtRule()},n.prototype._parseRuleSetDeclaration=function(){return this.peek(d.AtKeyword)?this._parseRuleSetDeclarationAtStatement():this._parseDeclaration()},n.prototype._needsSemicolonAfter=function(e){switch(e.type){case u.Keyframe:case u.ViewPort:case u.Media:case u.Ruleset:case u.Namespace:case u.If:case u.For:case u.Each:case u.While:case u.MixinDeclaration:case u.FunctionDeclaration:case u.MixinContentDeclaration:return!1;case u.ExtendsReference:case u.MixinContentReference:case u.ReturnStatement:case u.MediaQuery:case u.Debug:case u.Import:case u.AtApplyRule:case u.CustomPropertyDeclaration:return!0;case u.VariableDeclaration:return e.needsSemicolon;case u.MixinReference:return!e.getContent();case u.Declaration:return!e.getNestedProperties()}return!1},n.prototype._parseDeclarations=function(e){var t=this.create(Ft);if(!this.accept(d.CurlyL))return null;for(var r=e();t.addChild(r)&&!this.peek(d.CurlyR);){if(this._needsSemicolonAfter(r)&&!this.accept(d.SemiColon))return this.finish(t,f.SemiColonExpected,[d.SemiColon,d.CurlyR]);for(r&&this.prevToken&&this.prevToken.type===d.SemiColon&&(r.semicolonPosition=this.prevToken.offset);this.accept(d.SemiColon););r=e()}return this.accept(d.CurlyR)?this.finish(t):this.finish(t,f.RightCurlyExpected,[d.CurlyR,d.SemiColon])},n.prototype._parseBody=function(e,t){return e.setDeclarations(this._parseDeclarations(t))?this.finish(e):this.finish(e,f.LeftCurlyExpected,[d.CurlyR,d.SemiColon])},n.prototype._parseSelector=function(e){var t=this.create(Ee),r=!1;for(e&&(r=t.addChild(this._parseCombinator()));t.addChild(this._parseSimpleSelector());)r=!0,t.addChild(this._parseCombinator());return r?this.finish(t):null},n.prototype._parseDeclaration=function(e){var t=this._tryParseCustomPropertyDeclaration(e);if(t)return t;var r=this.create(ae);return r.setProperty(this._parseProperty())?this.accept(d.Colon)?(this.prevToken&&(r.colonPosition=this.prevToken.offset),r.setValue(this._parseExpr())?(r.addChild(this._parsePrio()),this.peek(d.SemiColon)&&(r.semicolonPosition=this.token.offset),this.finish(r)):this.finish(r,f.PropertyValueExpected)):this.finish(r,f.ColonExpected,[d.Colon],e||[d.SemiColon]):null},n.prototype._tryParseCustomPropertyDeclaration=function(e){if(!this.peekRegExp(d.Ident,/^--/))return null;var t=this.create(hi);if(!t.setProperty(this._parseProperty()))return null;if(!this.accept(d.Colon))return this.finish(t,f.ColonExpected,[d.Colon]);this.prevToken&&(t.colonPosition=this.prevToken.offset);var r=this.mark();if(this.peek(d.CurlyL)){var i=this.create(di),o=this._parseDeclarations(this._parseRuleSetDeclaration.bind(this));if(i.setDeclarations(o)&&!o.isErroneous(!0)&&(i.addChild(this._parsePrio()),this.peek(d.SemiColon)))return this.finish(i),t.setPropertySet(i),t.semicolonPosition=this.token.offset,this.finish(t);this.restoreAtMark(r)}var s=this._parseExpr();return s&&!s.isErroneous(!0)&&(this._parsePrio(),this.peekOne.apply(this,bo(bo([],e||[],!1),[d.SemiColon,d.EOF],!1)))?(t.setValue(s),this.peek(d.SemiColon)&&(t.semicolonPosition=this.token.offset),this.finish(t)):(this.restoreAtMark(r),t.addChild(this._parseCustomPropertyValue(e)),t.addChild(this._parsePrio()),he(t.colonPosition)&&this.token.offset===t.colonPosition+1?this.finish(t,f.PropertyValueExpected):this.finish(t))},n.prototype._parseCustomPropertyValue=function(e){var t=this;e===void 0&&(e=[d.CurlyR]);var r=this.create(F),i=function(){return s===0&&a===0&&l===0},o=function(){return e.indexOf(t.token.type)!==-1},s=0,a=0,l=0;e:for(;;){switch(this.token.type){case d.SemiColon:if(i())break e;break;case d.Exclamation:if(i())break e;break;case d.CurlyL:s++;break;case d.CurlyR:if(s--,s<0){if(o()&&a===0&&l===0)break e;return this.finish(r,f.LeftCurlyExpected)}break;case d.ParenthesisL:a++;break;case d.ParenthesisR:if(a--,a<0){if(o()&&l===0&&s===0)break e;return this.finish(r,f.LeftParenthesisExpected)}break;case d.BracketL:l++;break;case d.BracketR:if(l--,l<0)return this.finish(r,f.LeftSquareBracketExpected);break;case d.BadString:break e;case d.EOF:var c=f.RightCurlyExpected;return l>0?c=f.RightSquareBracketExpected:a>0&&(c=f.RightParenthesisExpected),this.finish(r,c)}this.consumeToken()}return this.finish(r)},n.prototype._tryToParseDeclaration=function(e){var t=this.mark();return this._parseProperty()&&this.accept(d.Colon)?(this.restoreAtMark(t),this._parseDeclaration(e)):(this.restoreAtMark(t),null)},n.prototype._parseProperty=function(){var e=this.create(ct),t=this.mark();return(this.acceptDelim("*")||this.acceptDelim("_"))&&this.hasWhitespace()?(this.restoreAtMark(t),null):e.setIdentifier(this._parsePropertyIdentifier())?this.finish(e):null},n.prototype._parsePropertyIdentifier=function(){return this._parseIdent()},n.prototype._parseCharset=function(){if(!this.peek(d.Charset))return null;var e=this.create(F);return this.consumeToken(),this.accept(d.String)?this.accept(d.SemiColon)?this.finish(e):this.finish(e,f.SemiColonExpected):this.finish(e,f.IdentifierExpected)},n.prototype._parseImport=function(){if(!this.peekKeyword("@import"))return null;var e=this.create(dt);return this.consumeToken(),!e.addChild(this._parseURILiteral())&&!e.addChild(this._parseStringLiteral())?this.finish(e,f.URIOrStringExpected):(!this.peek(d.SemiColon)&&!this.peek(d.EOF)&&e.setMedialist(this._parseMediaQueryList()),this.finish(e))},n.prototype._parseNamespace=function(){if(!this.peekKeyword("@namespace"))return null;var e=this.create(Si);return this.consumeToken(),!e.addChild(this._parseURILiteral())&&(e.addChild(this._parseIdent()),!e.addChild(this._parseURILiteral())&&!e.addChild(this._parseStringLiteral()))?this.finish(e,f.URIExpected,[d.SemiColon]):this.accept(d.SemiColon)?this.finish(e):this.finish(e,f.SemiColonExpected)},n.prototype._parseFontFace=function(){if(!this.peekKeyword("@font-face"))return null;var e=this.create(an);return this.consumeToken(),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},n.prototype._parseViewPort=function(){if(!this.peekKeyword("@-ms-viewport")&&!this.peekKeyword("@-o-viewport")&&!this.peekKeyword("@viewport"))return null;var e=this.create(bi);return this.consumeToken(),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},n.prototype._parseKeyframe=function(){if(!this.peekRegExp(d.AtKeyword,this.keyframeRegex))return null;var e=this.create(ln),t=this.create(F);return this.consumeToken(),e.setKeyword(this.finish(t)),t.matches("@-ms-keyframes")&&this.markError(t,f.UnknownKeyword),e.setIdentifier(this._parseKeyframeIdent())?this._parseBody(e,this._parseKeyframeSelector.bind(this)):this.finish(e,f.IdentifierExpected,[d.CurlyR])},n.prototype._parseKeyframeIdent=function(){return this._parseIdent([A.Keyframe])},n.prototype._parseKeyframeSelector=function(){var e=this.create(Qn);if(!e.addChild(this._parseIdent())&&!this.accept(d.Percentage))return null;for(;this.accept(d.Comma);)if(!e.addChild(this._parseIdent())&&!this.accept(d.Percentage))return this.finish(e,f.PercentageExpected);return this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},n.prototype._tryParseKeyframeSelector=function(){var e=this.create(Qn),t=this.mark();if(!e.addChild(this._parseIdent())&&!this.accept(d.Percentage))return null;for(;this.accept(d.Comma);)if(!e.addChild(this._parseIdent())&&!this.accept(d.Percentage))return this.restoreAtMark(t),null;return this.peek(d.CurlyL)?this._parseBody(e,this._parseRuleSetDeclaration.bind(this)):(this.restoreAtMark(t),null)},n.prototype._parseSupports=function(e){if(e===void 0&&(e=!1),!this.peekKeyword("@supports"))return null;var t=this.create(Et);return this.consumeToken(),t.addChild(this._parseSupportsCondition()),this._parseBody(t,this._parseSupportsDeclaration.bind(this,e))},n.prototype._parseSupportsDeclaration=function(e){return e===void 0&&(e=!1),e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)},n.prototype._parseSupportsCondition=function(){var e=this.create(Ze);if(this.acceptIdent("not"))e.addChild(this._parseSupportsConditionInParens());else if(e.addChild(this._parseSupportsConditionInParens()),this.peekRegExp(d.Ident,/^(and|or)$/i))for(var t=this.token.text.toLowerCase();this.acceptIdent(t);)e.addChild(this._parseSupportsConditionInParens());return this.finish(e)},n.prototype._parseSupportsConditionInParens=function(){var e=this.create(Ze);if(this.accept(d.ParenthesisL))return this.prevToken&&(e.lParent=this.prevToken.offset),!e.addChild(this._tryToParseDeclaration([d.ParenthesisR]))&&!this._parseSupportsCondition()?this.finish(e,f.ConditionExpected):this.accept(d.ParenthesisR)?(this.prevToken&&(e.rParent=this.prevToken.offset),this.finish(e)):this.finish(e,f.RightParenthesisExpected,[d.ParenthesisR],[]);if(this.peek(d.Ident)){var t=this.mark();if(this.consumeToken(),!this.hasWhitespace()&&this.accept(d.ParenthesisL)){for(var r=1;this.token.type!==d.EOF&&r!==0;)this.token.type===d.ParenthesisL?r++:this.token.type===d.ParenthesisR&&r--,this.consumeToken();return this.finish(e)}else this.restoreAtMark(t)}return this.finish(e,f.LeftParenthesisExpected,[],[d.ParenthesisL])},n.prototype._parseMediaDeclaration=function(e){return e===void 0&&(e=!1),e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)},n.prototype._parseMedia=function(e){if(e===void 0&&(e=!1),!this.peekKeyword("@media"))return null;var t=this.create(cn);return this.consumeToken(),t.addChild(this._parseMediaQueryList())?this._parseBody(t,this._parseMediaDeclaration.bind(this,e)):this.finish(t,f.MediaQueryExpected)},n.prototype._parseMediaQueryList=function(){var e=this.create(dn);if(!e.addChild(this._parseMediaQuery()))return this.finish(e,f.MediaQueryExpected);for(;this.accept(d.Comma);)if(!e.addChild(this._parseMediaQuery()))return this.finish(e,f.MediaQueryExpected);return this.finish(e)},n.prototype._parseMediaQuery=function(){var e=this.create(hn),t=this.mark();if(this.acceptIdent("not"),this.peek(d.ParenthesisL))this.restoreAtMark(t),e.addChild(this._parseMediaCondition());else{if(this.acceptIdent("only"),!e.addChild(this._parseIdent()))return null;this.acceptIdent("and")&&e.addChild(this._parseMediaCondition())}return this.finish(e)},n.prototype._parseRatio=function(){var e=this.mark(),t=this.create(Ri);return this._parseNumeric()?this.acceptDelim("/")?this._parseNumeric()?this.finish(t):this.finish(t,f.NumberExpected):(this.restoreAtMark(e),null):null},n.prototype._parseMediaCondition=function(){var e=this.create(Ci);this.acceptIdent("not");for(var t=!0;t;){if(!this.accept(d.ParenthesisL))return this.finish(e,f.LeftParenthesisExpected,[],[d.CurlyL]);if(this.peek(d.ParenthesisL)||this.peekIdent("not")?e.addChild(this._parseMediaCondition()):e.addChild(this._parseMediaFeature()),!this.accept(d.ParenthesisR))return this.finish(e,f.RightParenthesisExpected,[],[d.CurlyL]);t=this.acceptIdent("and")||this.acceptIdent("or")}return this.finish(e)},n.prototype._parseMediaFeature=function(){var e=this,t=[d.ParenthesisR],r=this.create(_i),i=function(){return e.acceptDelim("<")||e.acceptDelim(">")?(e.hasWhitespace()||e.acceptDelim("="),!0):!!e.acceptDelim("=")};if(r.addChild(this._parseMediaFeatureName())){if(this.accept(d.Colon)){if(!r.addChild(this._parseMediaFeatureValue()))return this.finish(r,f.TermExpected,[],t)}else if(i()){if(!r.addChild(this._parseMediaFeatureValue()))return this.finish(r,f.TermExpected,[],t);if(i()&&!r.addChild(this._parseMediaFeatureValue()))return this.finish(r,f.TermExpected,[],t)}}else if(r.addChild(this._parseMediaFeatureValue())){if(!i())return this.finish(r,f.OperatorExpected,[],t);if(!r.addChild(this._parseMediaFeatureName()))return this.finish(r,f.IdentifierExpected,[],t);if(i()&&!r.addChild(this._parseMediaFeatureValue()))return this.finish(r,f.TermExpected,[],t)}else return this.finish(r,f.IdentifierExpected,[],t);return this.finish(r)},n.prototype._parseMediaFeatureName=function(){return this._parseIdent()},n.prototype._parseMediaFeatureValue=function(){return this._parseRatio()||this._parseTermExpression()},n.prototype._parseMedium=function(){var e=this.create(F);return e.addChild(this._parseIdent())?this.finish(e):null},n.prototype._parsePageDeclaration=function(){return this._parsePageMarginBox()||this._parseRuleSetDeclaration()},n.prototype._parsePage=function(){if(!this.peekKeyword("@page"))return null;var e=this.create(Fi);if(this.consumeToken(),e.addChild(this._parsePageSelector())){for(;this.accept(d.Comma);)if(!e.addChild(this._parsePageSelector()))return this.finish(e,f.IdentifierExpected)}return this._parseBody(e,this._parsePageDeclaration.bind(this))},n.prototype._parsePageMarginBox=function(){if(!this.peek(d.AtKeyword))return null;var e=this.create(Ei);return this.acceptOneKeyword(go)||this.markError(e,f.UnknownAtRule,[],[d.CurlyL]),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},n.prototype._parsePageSelector=function(){if(!this.peek(d.Ident)&&!this.peek(d.Colon))return null;var e=this.create(F);return e.addChild(this._parseIdent()),this.accept(d.Colon)&&!e.addChild(this._parseIdent())?this.finish(e,f.IdentifierExpected):this.finish(e)},n.prototype._parseDocument=function(){if(!this.peekKeyword("@-moz-document"))return null;var e=this.create(ki);return this.consumeToken(),this.resync([],[d.CurlyL]),this._parseBody(e,this._parseStylesheetStatement.bind(this))},n.prototype._parseUnknownAtRule=function(){if(!this.peek(d.AtKeyword))return null;var e=this.create(un);e.addChild(this._parseUnknownAtRuleName());var t=function(){return i===0&&o===0&&s===0},r=0,i=0,o=0,s=0;e:for(;;){switch(this.token.type){case d.SemiColon:if(t())break e;break;case d.EOF:return i>0?this.finish(e,f.RightCurlyExpected):s>0?this.finish(e,f.RightSquareBracketExpected):o>0?this.finish(e,f.RightParenthesisExpected):this.finish(e);case d.CurlyL:r++,i++;break;case d.CurlyR:if(i--,r>0&&i===0){if(this.consumeToken(),s>0)return this.finish(e,f.RightSquareBracketExpected);if(o>0)return this.finish(e,f.RightParenthesisExpected);break e}if(i<0){if(o===0&&s===0)break e;return this.finish(e,f.LeftCurlyExpected)}break;case d.ParenthesisL:o++;break;case d.ParenthesisR:if(o--,o<0)return this.finish(e,f.LeftParenthesisExpected);break;case d.BracketL:s++;break;case d.BracketR:if(s--,s<0)return this.finish(e,f.LeftSquareBracketExpected);break}this.consumeToken()}return e},n.prototype._parseUnknownAtRuleName=function(){var e=this.create(F);return this.accept(d.AtKeyword)?this.finish(e):e},n.prototype._parseOperator=function(){if(this.peekDelim("/")||this.peekDelim("*")||this.peekDelim("+")||this.peekDelim("-")||this.peek(d.Dashmatch)||this.peek(d.Includes)||this.peek(d.SubstringOperator)||this.peek(d.PrefixOperator)||this.peek(d.SuffixOperator)||this.peekDelim("=")){var e=this.createNode(u.Operator);return this.consumeToken(),this.finish(e)}else return null},n.prototype._parseUnaryOperator=function(){if(!this.peekDelim("+")&&!this.peekDelim("-"))return null;var e=this.create(F);return this.consumeToken(),this.finish(e)},n.prototype._parseCombinator=function(){if(this.peekDelim(">")){var e=this.create(F);this.consumeToken();var t=this.mark();if(!this.hasWhitespace()&&this.acceptDelim(">")){if(!this.hasWhitespace()&&this.acceptDelim(">"))return e.type=u.SelectorCombinatorShadowPiercingDescendant,this.finish(e);this.restoreAtMark(t)}return e.type=u.SelectorCombinatorParent,this.finish(e)}else if(this.peekDelim("+")){var e=this.create(F);return this.consumeToken(),e.type=u.SelectorCombinatorSibling,this.finish(e)}else if(this.peekDelim("~")){var e=this.create(F);return this.consumeToken(),e.type=u.SelectorCombinatorAllSiblings,this.finish(e)}else if(this.peekDelim("/")){var e=this.create(F);this.consumeToken();var t=this.mark();if(!this.hasWhitespace()&&this.acceptIdent("deep")&&!this.hasWhitespace()&&this.acceptDelim("/"))return e.type=u.SelectorCombinatorShadowPiercingDescendant,this.finish(e);this.restoreAtMark(t)}return null},n.prototype._parseSimpleSelector=function(){var e=this.create(De),t=0;for(e.addChild(this._parseElementName())&&t++;(t===0||!this.hasWhitespace())&&e.addChild(this._parseSimpleSelectorBody());)t++;return t>0?this.finish(e):null},n.prototype._parseSimpleSelectorBody=function(){return this._parsePseudo()||this._parseHash()||this._parseClass()||this._parseAttrib()},n.prototype._parseSelectorIdent=function(){return this._parseIdent()},n.prototype._parseHash=function(){if(!this.peek(d.Hash)&&!this.peekDelim("#"))return null;var e=this.createNode(u.IdentifierSelector);if(this.acceptDelim("#")){if(this.hasWhitespace()||!e.addChild(this._parseSelectorIdent()))return this.finish(e,f.IdentifierExpected)}else this.consumeToken();return this.finish(e)},n.prototype._parseClass=function(){if(!this.peekDelim("."))return null;var e=this.createNode(u.ClassSelector);return this.consumeToken(),this.hasWhitespace()||!e.addChild(this._parseSelectorIdent())?this.finish(e,f.IdentifierExpected):this.finish(e)},n.prototype._parseElementName=function(){var e=this.mark(),t=this.createNode(u.ElementNameSelector);return t.addChild(this._parseNamespacePrefix()),!t.addChild(this._parseSelectorIdent())&&!this.acceptDelim("*")?(this.restoreAtMark(e),null):this.finish(t)},n.prototype._parseNamespacePrefix=function(){var e=this.mark(),t=this.createNode(u.NamespacePrefix);return!t.addChild(this._parseIdent())&&this.acceptDelim("*"),this.acceptDelim("|")?this.finish(t):(this.restoreAtMark(e),null)},n.prototype._parseAttrib=function(){if(!this.peek(d.BracketL))return null;var e=this.create(zi);return this.consumeToken(),e.setNamespacePrefix(this._parseNamespacePrefix()),e.setIdentifier(this._parseIdent())?(e.setOperator(this._parseOperator())&&(e.setValue(this._parseBinaryExpr()),this.acceptIdent("i"),this.acceptIdent("s")),this.accept(d.BracketR)?this.finish(e):this.finish(e,f.RightSquareBracketExpected)):this.finish(e,f.IdentifierExpected)},n.prototype._parsePseudo=function(){var e=this,t=this._tryParsePseudoIdentifier();if(t){if(!this.hasWhitespace()&&this.accept(d.ParenthesisL)){var r=function(){var i=e.create(F);if(!i.addChild(e._parseSelector(!1)))return null;for(;e.accept(d.Comma)&&i.addChild(e._parseSelector(!1)););return e.peek(d.ParenthesisR)?e.finish(i):null};if(t.addChild(this.try(r)||this._parseBinaryExpr()),!this.accept(d.ParenthesisR))return this.finish(t,f.RightParenthesisExpected)}return this.finish(t)}return null},n.prototype._tryParsePseudoIdentifier=function(){if(!this.peek(d.Colon))return null;var e=this.mark(),t=this.createNode(u.PseudoSelector);return this.consumeToken(),this.hasWhitespace()?(this.restoreAtMark(e),null):(this.accept(d.Colon),this.hasWhitespace()||!t.addChild(this._parseIdent())?this.finish(t,f.IdentifierExpected):this.finish(t))},n.prototype._tryParsePrio=function(){var e=this.mark(),t=this._parsePrio();return t||(this.restoreAtMark(e),null)},n.prototype._parsePrio=function(){if(!this.peek(d.Exclamation))return null;var e=this.createNode(u.Prio);return this.accept(d.Exclamation)&&this.acceptIdent("important")?this.finish(e):null},n.prototype._parseExpr=function(e){e===void 0&&(e=!1);var t=this.create(pn);if(!t.addChild(this._parseBinaryExpr()))return null;for(;;){if(this.peek(d.Comma)){if(e)return this.finish(t);this.consumeToken()}else if(!this.hasWhitespace())break;if(!t.addChild(this._parseBinaryExpr()))break}return this.finish(t)},n.prototype._parseUnicodeRange=function(){if(!this.peekIdent("u"))return null;var e=this.create(li);return this.acceptUnicodeRange()?this.finish(e):null},n.prototype._parseNamedLine=function(){if(!this.peek(d.BracketL))return null;var e=this.createNode(u.GridLine);for(this.consumeToken();e.addChild(this._parseIdent()););return this.accept(d.BracketR)?this.finish(e):this.finish(e,f.RightSquareBracketExpected)},n.prototype._parseBinaryExpr=function(e,t){var r=this.create(ht);if(!r.setLeft(e||this._parseTerm()))return null;if(!r.setOperator(t||this._parseOperator()))return this.finish(r);if(!r.setRight(this._parseTerm()))return this.finish(r,f.TermExpected);r=this.finish(r);var i=this._parseOperator();return i&&(r=this._parseBinaryExpr(r,i)),this.finish(r)},n.prototype._parseTerm=function(){var e=this.create(Di);return e.setOperator(this._parseUnaryOperator()),e.setExpression(this._parseTermExpression())?this.finish(e):null},n.prototype._parseTermExpression=function(){return this._parseURILiteral()||this._parseUnicodeRange()||this._parseFunction()||this._parseIdent()||this._parseStringLiteral()||this._parseNumeric()||this._parseHexColor()||this._parseOperation()||this._parseNamedLine()},n.prototype._parseOperation=function(){if(!this.peek(d.ParenthesisL))return null;var e=this.create(F);return this.consumeToken(),e.addChild(this._parseExpr()),this.accept(d.ParenthesisR)?this.finish(e):this.finish(e,f.RightParenthesisExpected)},n.prototype._parseNumeric=function(){if(this.peek(d.Num)||this.peek(d.Percentage)||this.peek(d.Resolution)||this.peek(d.Length)||this.peek(d.EMS)||this.peek(d.EXS)||this.peek(d.Angle)||this.peek(d.Time)||this.peek(d.Dimension)||this.peek(d.Freq)){var e=this.create(zt);return this.consumeToken(),this.finish(e)}return null},n.prototype._parseStringLiteral=function(){if(!this.peek(d.String)&&!this.peek(d.BadString))return null;var e=this.createNode(u.StringLiteral);return this.consumeToken(),this.finish(e)},n.prototype._parseURILiteral=function(){if(!this.peekRegExp(d.Ident,/^url(-prefix)?$/i))return null;var e=this.mark(),t=this.createNode(u.URILiteral);return this.accept(d.Ident),this.hasWhitespace()||!this.peek(d.ParenthesisL)?(this.restoreAtMark(e),null):(this.scanner.inURL=!0,this.consumeToken(),t.addChild(this._parseURLArgument()),this.scanner.inURL=!1,this.accept(d.ParenthesisR)?this.finish(t):this.finish(t,f.RightParenthesisExpected))},n.prototype._parseURLArgument=function(){var e=this.create(F);return!this.accept(d.String)&&!this.accept(d.BadString)&&!this.acceptUnquotedString()?null:this.finish(e)},n.prototype._parseIdent=function(e){if(!this.peek(d.Ident))return null;var t=this.create(te);return e&&(t.referenceTypes=e),t.isCustomProperty=this.peekRegExp(d.Ident,/^--/),this.consumeToken(),this.finish(t)},n.prototype._parseFunction=function(){var e=this.mark(),t=this.create(Pe);if(!t.setIdentifier(this._parseFunctionIdentifier()))return null;if(this.hasWhitespace()||!this.accept(d.ParenthesisL))return this.restoreAtMark(e),null;if(t.getArguments().addChild(this._parseFunctionArgument()))for(;this.accept(d.Comma)&&!this.peek(d.ParenthesisR);)t.getArguments().addChild(this._parseFunctionArgument())||this.markError(t,f.ExpressionExpected);return this.accept(d.ParenthesisR)?this.finish(t):this.finish(t,f.RightParenthesisExpected)},n.prototype._parseFunctionIdentifier=function(){if(!this.peek(d.Ident))return null;var e=this.create(te);if(e.referenceTypes=[A.Function],this.acceptIdent("progid")){if(this.accept(d.Colon))for(;this.accept(d.Ident)&&this.acceptDelim("."););return this.finish(e)}return this.consumeToken(),this.finish(e)},n.prototype._parseFunctionArgument=function(){var e=this.create(we);return e.setValue(this._parseExpr(!0))?this.finish(e):null},n.prototype._parseHexColor=function(){if(this.peekRegExp(d.Hash,/^#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/g)){var e=this.create(Dt);return this.consumeToken(),this.finish(e)}else return null},n}();function yo(n,e){var t=0,r=n.length;if(r===0)return 0;for(;t<r;){var i=Math.floor((t+r)/2);e(n[i])?r=i:t=i+1}return t}function Fr(n,e){return n.indexOf(e)!==-1}function Bt(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];for(var t=[],r=0,i=n;r<i.length;r++)for(var o=i[r],s=0,a=o;s<a.length;s++){var l=a[s];Fr(t,l)||t.push(l)}return t}var Ys=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}}(),wo=function(){function n(e,t){this.offset=e,this.length=t,this.symbols=[],this.parent=null,this.children=[]}return n.prototype.addChild=function(e){this.children.push(e),e.setParent(this)},n.prototype.setParent=function(e){this.parent=e},n.prototype.findScope=function(e,t){return t===void 0&&(t=0),this.offset<=e&&this.offset+this.length>e+t||this.offset===e&&this.length===t?this.findInScope(e,t):null},n.prototype.findInScope=function(e,t){t===void 0&&(t=0);var r=e+t,i=yo(this.children,function(s){return s.offset>r});if(i===0)return this;var o=this.children[i-1];return o.offset<=e&&o.offset+o.length>=e+t?o.findInScope(e,t):this},n.prototype.addSymbol=function(e){this.symbols.push(e)},n.prototype.getSymbol=function(e,t){for(var r=0;r<this.symbols.length;r++){var i=this.symbols[r];if(i.name===e&&i.type===t)return i}return null},n.prototype.getSymbols=function(){return this.symbols},n}();var Qs=function(n){Ys(e,n);function e(){return n.call(this,0,Number.MAX_VALUE)||this}return e}(wo);var Fn=function(){function n(e,t,r,i){this.name=e,this.value=t,this.node=r,this.type=i}return n}();var Zs=function(){function n(e){this.scope=e}return n.prototype.addSymbol=function(e,t,r,i){if(e.offset!==-1){var o=this.scope.findScope(e.offset,e.length);o&&o.addSymbol(new Fn(t,r,e,i))}},n.prototype.addScope=function(e){if(e.offset!==-1){var t=this.scope.findScope(e.offset,e.length);if(t&&(t.offset!==e.offset||t.length!==e.length)){var r=new wo(e.offset,e.length);return t.addChild(r),r}return t}return null},n.prototype.addSymbolToChildScope=function(e,t,r,i,o){if(e&&e.offset!==-1){var s=this.addScope(e);s&&s.addSymbol(new Fn(r,i,t,o))}},n.prototype.visitNode=function(e){switch(e.type){case u.Keyframe:return this.addSymbol(e,e.getName(),void 0,A.Keyframe),!0;case u.CustomPropertyDeclaration:return this.visitCustomPropertyDeclarationNode(e);case u.VariableDeclaration:return this.visitVariableDeclarationNode(e);case u.Ruleset:return this.visitRuleSet(e);case u.MixinDeclaration:return this.addSymbol(e,e.getName(),void 0,A.Mixin),!0;case u.FunctionDeclaration:return this.addSymbol(e,e.getName(),void 0,A.Function),!0;case u.FunctionParameter:return this.visitFunctionParameterNode(e);case u.Declarations:return this.addScope(e),!0;case u.For:var t=e,r=t.getDeclarations();return r&&t.variable&&this.addSymbolToChildScope(r,t.variable,t.variable.getName(),void 0,A.Variable),!0;case u.Each:{var i=e,o=i.getDeclarations();if(o)for(var s=i.getVariables().getChildren(),a=0,l=s;a<l.length;a++){var c=l[a];this.addSymbolToChildScope(o,c,c.getName(),void 0,A.Variable)}return!0}}return!0},n.prototype.visitRuleSet=function(e){var t=this.scope.findScope(e.offset,e.length);if(t)for(var r=0,i=e.getSelectors().getChildren();r<i.length;r++){var o=i[r];o instanceof Ee&&o.getChildren().length===1&&t.addSymbol(new Fn(o.getChild(0).getText(),void 0,o,A.Rule))}return!0},n.prototype.visitVariableDeclarationNode=function(e){var t=e.getValue()?e.getValue().getText():void 0;return this.addSymbol(e,e.getName(),t,A.Variable),!0},n.prototype.visitFunctionParameterNode=function(e){var t=e.getParent().getDeclarations();if(t){var r=e.getDefaultValue(),i=r?r.getText():void 0;this.addSymbolToChildScope(t,e,e.getName(),i,A.Variable)}return!0},n.prototype.visitCustomPropertyDeclarationNode=function(e){var t=e.getValue()?e.getValue().getText():"";return this.addCSSVariable(e.getProperty(),e.getProperty().getName(),t,A.Variable),!0},n.prototype.addCSSVariable=function(e,t,r,i){e.offset!==-1&&this.scope.addSymbol(new Fn(t,r,e,i))},n}();var $t=function(){function n(e){this.global=new Qs,e.acceptVisitor(new Zs(this.global))}return n.prototype.findSymbolsAtOffset=function(e,t){for(var r=this.global.findScope(e,0),i=[],o={};r;){for(var s=r.getSymbols(),a=0;a<s.length;a++){var l=s[a];l.type===t&&!o[l.name]&&(i.push(l),o[l.name]=!0)}r=r.parent}return i},n.prototype.internalFindSymbol=function(e,t){var r=e;if(e.parent instanceof Be&&e.parent.getParent()instanceof K&&(r=e.parent.getParent().getDeclarations()),e.parent instanceof we&&e.parent.getParent()instanceof Pe){var i=e.parent.getParent().getIdentifier();if(i){var o=this.internalFindSymbol(i,[A.Function]);o&&(r=o.node.getDeclarations())}}if(!r)return null;for(var s=e.getText(),a=this.global.findScope(r.offset,r.length);a;){for(var l=0;l<t.length;l++){var c=t[l],h=a.getSymbol(s,c);if(h)return h}a=a.parent}return null},n.prototype.evaluateReferenceTypes=function(e){if(e instanceof te){var t=e.referenceTypes;if(t)return t;if(e.isCustomProperty)return[A.Variable];var r=ai(e);if(r){var i=r.getNonPrefixedPropertyName();if((i==="animation"||i==="animation-name")&&r.getValue()&&r.getValue().offset===e.offset)return[A.Keyframe]}}else if(e instanceof pt)return[A.Variable];var o=e.findAParent(u.Selector,u.ExtendsReference);return o?[A.Rule]:null},n.prototype.findSymbolFromNode=function(e){if(!e)return null;for(;e.type===u.Interpolation;)e=e.getParent();var t=this.evaluateReferenceTypes(e);return t?this.internalFindSymbol(e,t):null},n.prototype.matchesSymbol=function(e,t){if(!e)return!1;for(;e.type===u.Interpolation;)e=e.getParent();if(!e.matches(t.name))return!1;var r=this.evaluateReferenceTypes(e);if(!r||r.indexOf(t.type)===-1)return!1;var i=this.internalFindSymbol(e,r);return i===t},n.prototype.findSymbol=function(e,t,r){for(var i=this.global.findScope(r);i;){var o=i.getSymbol(e,t);if(o)return o;i=i.parent}return null},n}();var xo;xo=(()=>{"use strict";var n={470:r=>{function i(a){if(typeof a!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(a))}function o(a,l){for(var c,h="",p=0,m=-1,g=0,w=0;w<=a.length;++w){if(w<a.length)c=a.charCodeAt(w);else{if(c===47)break;c=47}if(c===47){if(!(m===w-1||g===1))if(m!==w-1&&g===2){if(h.length<2||p!==2||h.charCodeAt(h.length-1)!==46||h.charCodeAt(h.length-2)!==46){if(h.length>2){var x=h.lastIndexOf("/");if(x!==h.length-1){x===-1?(h="",p=0):p=(h=h.slice(0,x)).length-1-h.lastIndexOf("/"),m=w,g=0;continue}}else if(h.length===2||h.length===1){h="",p=0,m=w,g=0;continue}}l&&(h.length>0?h+="/..":h="..",p=2)}else h.length>0?h+="/"+a.slice(m+1,w):h=a.slice(m+1,w),p=w-m-1;m=w,g=0}else c===46&&g!==-1?++g:g=-1}return h}var s={resolve:function(){for(var a,l="",c=!1,h=arguments.length-1;h>=-1&&!c;h--){var p;h>=0?p=arguments[h]:(a===void 0&&(a=process.cwd()),p=a),i(p),p.length!==0&&(l=p+"/"+l,c=p.charCodeAt(0)===47)}return l=o(l,!c),c?l.length>0?"/"+l:"/":l.length>0?l:"."},normalize:function(a){if(i(a),a.length===0)return".";var l=a.charCodeAt(0)===47,c=a.charCodeAt(a.length-1)===47;return(a=o(a,!l)).length!==0||l||(a="."),a.length>0&&c&&(a+="/"),l?"/"+a:a},isAbsolute:function(a){return i(a),a.length>0&&a.charCodeAt(0)===47},join:function(){if(arguments.length===0)return".";for(var a,l=0;l<arguments.length;++l){var c=arguments[l];i(c),c.length>0&&(a===void 0?a=c:a+="/"+c)}return a===void 0?".":s.normalize(a)},relative:function(a,l){if(i(a),i(l),a===l||(a=s.resolve(a))===(l=s.resolve(l)))return"";for(var c=1;c<a.length&&a.charCodeAt(c)===47;++c);for(var h=a.length,p=h-c,m=1;m<l.length&&l.charCodeAt(m)===47;++m);for(var g=l.length-m,w=p<g?p:g,x=-1,y=0;y<=w;++y){if(y===w){if(g>w){if(l.charCodeAt(m+y)===47)return l.slice(m+y+1);if(y===0)return l.slice(m+y)}else p>w&&(a.charCodeAt(c+y)===47?x=y:y===0&&(x=0));break}var D=a.charCodeAt(c+y);if(D!==l.charCodeAt(m+y))break;D===47&&(x=y)}var M="";for(y=c+x+1;y<=h;++y)y!==h&&a.charCodeAt(y)!==47||(M.length===0?M+="..":M+="/..");return M.length>0?M+l.slice(m+x):(m+=x,l.charCodeAt(m)===47&&++m,l.slice(m))},_makeLong:function(a){return a},dirname:function(a){if(i(a),a.length===0)return".";for(var l=a.charCodeAt(0),c=l===47,h=-1,p=!0,m=a.length-1;m>=1;--m)if((l=a.charCodeAt(m))===47){if(!p){h=m;break}}else p=!1;return h===-1?c?"/":".":c&&h===1?"//":a.slice(0,h)},basename:function(a,l){if(l!==void 0&&typeof l!="string")throw new TypeError('"ext" argument must be a string');i(a);var c,h=0,p=-1,m=!0;if(l!==void 0&&l.length>0&&l.length<=a.length){if(l.length===a.length&&l===a)return"";var g=l.length-1,w=-1;for(c=a.length-1;c>=0;--c){var x=a.charCodeAt(c);if(x===47){if(!m){h=c+1;break}}else w===-1&&(m=!1,w=c+1),g>=0&&(x===l.charCodeAt(g)?--g==-1&&(p=c):(g=-1,p=w))}return h===p?p=w:p===-1&&(p=a.length),a.slice(h,p)}for(c=a.length-1;c>=0;--c)if(a.charCodeAt(c)===47){if(!m){h=c+1;break}}else p===-1&&(m=!1,p=c+1);return p===-1?"":a.slice(h,p)},extname:function(a){i(a);for(var l=-1,c=0,h=-1,p=!0,m=0,g=a.length-1;g>=0;--g){var w=a.charCodeAt(g);if(w!==47)h===-1&&(p=!1,h=g+1),w===46?l===-1?l=g:m!==1&&(m=1):l!==-1&&(m=-1);else if(!p){c=g+1;break}}return l===-1||h===-1||m===0||m===1&&l===h-1&&l===c+1?"":a.slice(l,h)},format:function(a){if(a===null||typeof a!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof a);return function(l,c){var h=c.dir||c.root,p=c.base||(c.name||"")+(c.ext||"");return h?h===c.root?h+p:h+"/"+p:p}(0,a)},parse:function(a){i(a);var l={root:"",dir:"",base:"",ext:"",name:""};if(a.length===0)return l;var c,h=a.charCodeAt(0),p=h===47;p?(l.root="/",c=1):c=0;for(var m=-1,g=0,w=-1,x=!0,y=a.length-1,D=0;y>=c;--y)if((h=a.charCodeAt(y))!==47)w===-1&&(x=!1,w=y+1),h===46?m===-1?m=y:D!==1&&(D=1):m!==-1&&(D=-1);else if(!x){g=y+1;break}return m===-1||w===-1||D===0||D===1&&m===w-1&&m===g+1?w!==-1&&(l.base=l.name=g===0&&p?a.slice(1,w):a.slice(g,w)):(g===0&&p?(l.name=a.slice(1,m),l.base=a.slice(1,w)):(l.name=a.slice(g,m),l.base=a.slice(g,w)),l.ext=a.slice(m,w)),g>0?l.dir=a.slice(0,g-1):p&&(l.dir="/"),l},sep:"/",delimiter:":",win32:null,posix:null};s.posix=s,r.exports=s},447:(r,i,o)=>{var s;if(o.r(i),o.d(i,{URI:()=>M,Utils:()=>pe}),typeof process=="object")s=process.platform==="win32";else if(typeof navigator=="object"){var a=navigator.userAgent;s=a.indexOf("Windows")>=0}var l,c,h=(l=function(C,b){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(k,_){k.__proto__=_}||function(k,_){for(var N in _)Object.prototype.hasOwnProperty.call(_,N)&&(k[N]=_[N])})(C,b)},function(C,b){if(typeof b!="function"&&b!==null)throw new TypeError("Class extends value "+String(b)+" is not a constructor or null");function k(){this.constructor=C}l(C,b),C.prototype=b===null?Object.create(b):(k.prototype=b.prototype,new k)}),p=/^\w[\w\d+.-]*$/,m=/^\//,g=/^\/\//;function w(C,b){if(!C.scheme&&b)throw new Error('[UriError]: Scheme is missing: {scheme: "", authority: "'.concat(C.authority,'", path: "').concat(C.path,'", query: "').concat(C.query,'", fragment: "').concat(C.fragment,'"}'));if(C.scheme&&!p.test(C.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(C.path){if(C.authority){if(!m.test(C.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(g.test(C.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}var x="",y="/",D=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/,M=function(){function C(b,k,_,N,O,B){B===void 0&&(B=!1),typeof b=="object"?(this.scheme=b.scheme||x,this.authority=b.authority||x,this.path=b.path||x,this.query=b.query||x,this.fragment=b.fragment||x):(this.scheme=function(Ce,se){return Ce||se?Ce:"file"}(b,B),this.authority=k||x,this.path=function(Ce,se){switch(Ce){case"https":case"http":case"file":se?se[0]!==y&&(se=y+se):se=y}return se}(this.scheme,_||x),this.query=N||x,this.fragment=O||x,w(this,B))}return C.isUri=function(b){return b instanceof C||!!b&&typeof b.authority=="string"&&typeof b.fragment=="string"&&typeof b.path=="string"&&typeof b.query=="string"&&typeof b.scheme=="string"&&typeof b.fsPath=="string"&&typeof b.with=="function"&&typeof b.toString=="function"},Object.defineProperty(C.prototype,"fsPath",{get:function(){return oe(this,!1)},enumerable:!1,configurable:!0}),C.prototype.with=function(b){if(!b)return this;var k=b.scheme,_=b.authority,N=b.path,O=b.query,B=b.fragment;return k===void 0?k=this.scheme:k===null&&(k=x),_===void 0?_=this.authority:_===null&&(_=x),N===void 0?N=this.path:N===null&&(N=x),O===void 0?O=this.query:O===null&&(O=x),B===void 0?B=this.fragment:B===null&&(B=x),k===this.scheme&&_===this.authority&&N===this.path&&O===this.query&&B===this.fragment?this:new P(k,_,N,O,B)},C.parse=function(b,k){k===void 0&&(k=!1);var _=D.exec(b);return _?new P(_[2]||x,ke(_[4]||x),ke(_[5]||x),ke(_[7]||x),ke(_[9]||x),k):new P(x,x,x,x,x)},C.file=function(b){var k=x;if(s&&(b=b.replace(/\\/g,y)),b[0]===y&&b[1]===y){var _=b.indexOf(y,2);_===-1?(k=b.substring(2),b=y):(k=b.substring(2,_),b=b.substring(_)||y)}return new P("file",k,b,x,x)},C.from=function(b){var k=new P(b.scheme,b.authority,b.path,b.query,b.fragment);return w(k,!0),k},C.prototype.toString=function(b){return b===void 0&&(b=!1),me(this,b)},C.prototype.toJSON=function(){return this},C.revive=function(b){if(b){if(b instanceof C)return b;var k=new P(b);return k._formatted=b.external,k._fsPath=b._sep===z?b.fsPath:null,k}return b},C}(),z=s?1:void 0,P=function(C){function b(){var k=C!==null&&C.apply(this,arguments)||this;return k._formatted=null,k._fsPath=null,k}return h(b,C),Object.defineProperty(b.prototype,"fsPath",{get:function(){return this._fsPath||(this._fsPath=oe(this,!1)),this._fsPath},enumerable:!1,configurable:!0}),b.prototype.toString=function(k){return k===void 0&&(k=!1),k?me(this,!0):(this._formatted||(this._formatted=me(this,!1)),this._formatted)},b.prototype.toJSON=function(){var k={$mid:1};return this._fsPath&&(k.fsPath=this._fsPath,k._sep=z),this._formatted&&(k.external=this._formatted),this.path&&(k.path=this.path),this.scheme&&(k.scheme=this.scheme),this.authority&&(k.authority=this.authority),this.query&&(k.query=this.query),this.fragment&&(k.fragment=this.fragment),k},b}(M),L=((c={})[58]="%3A",c[47]="%2F",c[63]="%3F",c[35]="%23",c[91]="%5B",c[93]="%5D",c[64]="%40",c[33]="%21",c[36]="%24",c[38]="%26",c[39]="%27",c[40]="%28",c[41]="%29",c[42]="%2A",c[43]="%2B",c[44]="%2C",c[59]="%3B",c[61]="%3D",c[32]="%20",c);function $(C,b){for(var k=void 0,_=-1,N=0;N<C.length;N++){var O=C.charCodeAt(N);if(O>=97&&O<=122||O>=65&&O<=90||O>=48&&O<=57||O===45||O===46||O===95||O===126||b&&O===47)_!==-1&&(k+=encodeURIComponent(C.substring(_,N)),_=-1),k!==void 0&&(k+=C.charAt(N));else{k===void 0&&(k=C.substr(0,N));var B=L[O];B!==void 0?(_!==-1&&(k+=encodeURIComponent(C.substring(_,N)),_=-1),k+=B):_===-1&&(_=N)}}return _!==-1&&(k+=encodeURIComponent(C.substring(_))),k!==void 0?k:C}function ue(C){for(var b=void 0,k=0;k<C.length;k++){var _=C.charCodeAt(k);_===35||_===63?(b===void 0&&(b=C.substr(0,k)),b+=L[_]):b!==void 0&&(b+=C[k])}return b!==void 0?b:C}function oe(C,b){var k;return k=C.authority&&C.path.length>1&&C.scheme==="file"?"//".concat(C.authority).concat(C.path):C.path.charCodeAt(0)===47&&(C.path.charCodeAt(1)>=65&&C.path.charCodeAt(1)<=90||C.path.charCodeAt(1)>=97&&C.path.charCodeAt(1)<=122)&&C.path.charCodeAt(2)===58?b?C.path.substr(1):C.path[1].toLowerCase()+C.path.substr(2):C.path,s&&(k=k.replace(/\//g,"\\")),k}function me(C,b){var k=b?ue:$,_="",N=C.scheme,O=C.authority,B=C.path,Ce=C.query,se=C.fragment;if(N&&(_+=N,_+=":"),(O||N==="file")&&(_+=y,_+=y),O){var ge=O.indexOf("@");if(ge!==-1){var Xe=O.substr(0,ge);O=O.substr(ge+1),(ge=Xe.indexOf(":"))===-1?_+=k(Xe,!1):(_+=k(Xe.substr(0,ge),!1),_+=":",_+=k(Xe.substr(ge+1),!1)),_+="@"}(ge=(O=O.toLowerCase()).indexOf(":"))===-1?_+=k(O,!1):(_+=k(O.substr(0,ge),!1),_+=O.substr(ge))}if(B){if(B.length>=3&&B.charCodeAt(0)===47&&B.charCodeAt(2)===58)(Me=B.charCodeAt(1))>=65&&Me<=90&&(B="/".concat(String.fromCharCode(Me+32),":").concat(B.substr(3)));else if(B.length>=2&&B.charCodeAt(1)===58){var Me;(Me=B.charCodeAt(0))>=65&&Me<=90&&(B="".concat(String.fromCharCode(Me+32),":").concat(B.substr(2)))}_+=k(B,!0)}return Ce&&(_+="?",_+=k(Ce,!1)),se&&(_+="#",_+=b?se:$(se,!1)),_}function ve(C){try{return decodeURIComponent(C)}catch{return C.length>3?C.substr(0,3)+ve(C.substr(3)):C}}var ye=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function ke(C){return C.match(ye)?C.replace(ye,function(b){return ve(b)}):C}var pe,G=o(470),Ie=function(C,b,k){if(k||arguments.length===2)for(var _,N=0,O=b.length;N<O;N++)!_&&N in b||(_||(_=Array.prototype.slice.call(b,0,N)),_[N]=b[N]);return C.concat(_||Array.prototype.slice.call(b))},fe=G.posix||G;(function(C){C.joinPath=function(b){for(var k=[],_=1;_<arguments.length;_++)k[_-1]=arguments[_];return b.with({path:fe.join.apply(fe,Ie([b.path],k,!1))})},C.resolvePath=function(b){for(var k=[],_=1;_<arguments.length;_++)k[_-1]=arguments[_];var N=b.path||"/";return b.with({path:fe.resolve.apply(fe,Ie([N],k,!1))})},C.dirname=function(b){var k=fe.dirname(b.path);return k.length===1&&k.charCodeAt(0)===46?b:b.with({path:k})},C.basename=function(b){return fe.basename(b.path)},C.extname=function(b){return fe.extname(b.path)}})(pe||(pe={}))}},e={};function t(r){if(e[r])return e[r].exports;var i=e[r]={exports:{}};return n[r](i,i.exports,t),i.exports}return t.d=(r,i)=>{for(var o in i)t.o(i,o)&&!t.o(r,o)&&Object.defineProperty(r,o,{enumerable:!0,get:i[o]})},t.o=(r,i)=>Object.prototype.hasOwnProperty.call(r,i),t.r=r=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(r,"__esModule",{value:!0})},t(447)})();var{URI:qt,Utils:En}=xo;var ea=function(n,e,t){if(t||arguments.length===2)for(var r=0,i=e.length,o;r<i;r++)(o||!(r in e))&&(o||(o=Array.prototype.slice.call(e,0,r)),o[r]=e[r]);return n.concat(o||Array.prototype.slice.call(e))};function Dn(n){return En.dirname(qt.parse(n)).toString()}function Kt(n){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];return En.joinPath.apply(En,ea([qt.parse(n)],e,!1)).toString()}var So=function(n,e,t,r){function i(o){return o instanceof t?o:new t(function(s){s(o)})}return new(t||(t=Promise))(function(o,s){function a(h){try{c(r.next(h))}catch(p){s(p)}}function l(h){try{c(r.throw(h))}catch(p){s(p)}}function c(h){h.done?o(h.value):i(h.value).then(a,l)}c((r=r.apply(n,e||[])).next())})},ko=function(n,e){var t={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},r,i,o,s;return s={next:a(0),throw:a(1),return:a(2)},typeof Symbol=="function"&&(s[Symbol.iterator]=function(){return this}),s;function a(c){return function(h){return l([c,h])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;t;)try{if(r=1,i&&(o=c[0]&2?i.return:c[0]?i.throw||((o=i.return)&&o.call(i),0):i.next)&&!(o=o.call(i,c[1])).done)return o;switch(i=0,o&&(c=[c[0]&2,o.value]),c[0]){case 0:case 1:o=c;break;case 4:return t.label++,{value:c[1],done:!1};case 5:t.label++,i=c[1],c=[0];continue;case 7:c=t.ops.pop(),t.trys.pop();continue;default:if(o=t.trys,!(o=o.length>0&&o[o.length-1])&&(c[0]===6||c[0]===2)){t=0;continue}if(c[0]===3&&(!o||c[1]>o[0]&&c[1]<o[3])){t.label=c[1];break}if(c[0]===6&&t.label<o[1]){t.label=o[1],o=c;break}if(o&&t.label<o[2]){t.label=o[2],t.ops.push(c);break}o[2]&&t.ops.pop(),t.trys.pop();continue}c=e.call(n,t)}catch(h){c=[6,h],i=0}finally{r=o=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}},Co=function(){function n(e){this.readDirectory=e,this.literalCompletions=[],this.importCompletions=[]}return n.prototype.onCssURILiteralValue=function(e){this.literalCompletions.push(e)},n.prototype.onCssImportPath=function(e){this.importCompletions.push(e)},n.prototype.computeCompletions=function(e,t){return So(this,void 0,void 0,function(){var r,i,o,s,a,x,l,c,h,z,p,m,g,w,x,y,D,M,z;return ko(this,function(P){switch(P.label){case 0:r={items:[],isIncomplete:!1},i=0,o=this.literalCompletions,P.label=1;case 1:return i<o.length?(s=o[i],a=s.uriValue,x=Er(a),x==="."||x===".."?(r.isIncomplete=!0,[3,4]):[3,2]):[3,5];case 2:return[4,this.providePathSuggestions(a,s.position,s.range,e,t)];case 3:for(l=P.sent(),c=0,h=l;c<h.length;c++)z=h[c],r.items.push(z);P.label=4;case 4:return i++,[3,1];case 5:p=0,m=this.importCompletions,P.label=6;case 6:return p<m.length?(g=m[p],w=g.pathValue,x=Er(w),x==="."||x===".."?(r.isIncomplete=!0,[3,9]):[3,7]):[3,10];case 7:return[4,this.providePathSuggestions(w,g.position,g.range,e,t)];case 8:for(y=P.sent(),e.languageId==="scss"&&y.forEach(function(L){q(L.label,"_")&&rn(L.label,".scss")&&(L.textEdit?L.textEdit.newText=L.label.slice(1,-5):L.label=L.label.slice(1,-5))}),D=0,M=y;D<M.length;D++)z=M[D],r.items.push(z);P.label=9;case 9:return p++,[3,6];case 10:return[2,r]}})})},n.prototype.providePathSuggestions=function(e,t,r,i,o){return So(this,void 0,void 0,function(){var s,a,l,c,h,p,m,g,w,x,y,D,M,z,P,L;return ko(this,function($){switch($.label){case 0:if(s=Er(e),a=q(e,"'")||q(e,'"'),l=a?s.slice(0,t.character-(r.start.character+1)):s.slice(0,t.character-r.start.character),c=i.uri,h=a?ia(r,1,-1):r,p=na(l,s,h),m=l.substring(0,l.lastIndexOf("/")+1),g=o.resolveReference(m||".",c),!g)return[3,4];$.label=1;case 1:return $.trys.push([1,3,,4]),w=[],[4,this.readDirectory(g)];case 2:for(x=$.sent(),y=0,D=x;y<D.length;y++)M=D[y],z=M[0],P=M[1],z.charCodeAt(0)!==ta&&(P===rt.Directory||Kt(g,z)!==c)&&w.push(ra(z,P===rt.Directory,p));return[2,w];case 3:return L=$.sent(),[3,4];case 4:return[2,[]]}})})},n}();var ta=46;function Er(n){return q(n,"'")||q(n,'"')?n.slice(1,-1):n}function na(n,e,t){var r,i=n.lastIndexOf("/");if(i===-1)r=t;else{var o=e.slice(i+1),s=Rn(t.end,-o.length),a=o.indexOf(" "),l=void 0;a!==-1?l=Rn(s,a):l=t.end,r=W.create(s,l)}return r}function ra(n,e,t){return e?(n=n+"/",{label:zn(n),kind:R.Folder,textEdit:T.replace(t,zn(n)),command:{title:"Suggest",command:"editor.action.triggerSuggest"}}):{label:zn(n),kind:R.File,textEdit:T.replace(t,zn(n))}}function zn(n){return n.replace(/(\s|\(|\)|,|"|')/g,"\\$1")}function Rn(n,e){return Q.create(n.line,n.character+e)}function ia(n,e,t){var r=Rn(n.start,e),i=Rn(n.end,t);return W.create(r,i)}var oa=function(n,e,t,r){function i(o){return o instanceof t?o:new t(function(s){s(o)})}return new(t||(t=Promise))(function(o,s){function a(h){try{c(r.next(h))}catch(p){s(p)}}function l(h){try{c(r.throw(h))}catch(p){s(p)}}function c(h){h.done?o(h.value):i(h.value).then(a,l)}c((r=r.apply(n,e||[])).next())})},sa=function(n,e){var t={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},r,i,o,s;return s={next:a(0),throw:a(1),return:a(2)},typeof Symbol=="function"&&(s[Symbol.iterator]=function(){return this}),s;function a(c){return function(h){return l([c,h])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;t;)try{if(r=1,i&&(o=c[0]&2?i.return:c[0]?i.throw||((o=i.return)&&o.call(i),0):i.next)&&!(o=o.call(i,c[1])).done)return o;switch(i=0,o&&(c=[c[0]&2,o.value]),c[0]){case 0:case 1:o=c;break;case 4:return t.label++,{value:c[1],done:!1};case 5:t.label++,i=c[1],c=[0];continue;case 7:c=t.ops.pop(),t.trys.pop();continue;default:if(o=t.trys,!(o=o.length>0&&o[o.length-1])&&(c[0]===6||c[0]===2)){t=0;continue}if(c[0]===3&&(!o||c[1]>o[0]&&c[1]<o[3])){t.label=c[1];break}if(c[0]===6&&t.label<o[1]){t.label=o[1],o=c;break}if(o&&t.label<o[2]){t.label=o[2],t.ops.push(c);break}o[2]&&t.ops.pop(),t.trys.pop();continue}c=e.call(n,t)}catch(h){c=[6,h],i=0}finally{r=o=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}},aa=H(),We=re.Snippet,_o={title:"Suggest",command:"editor.action.triggerSuggest"},Re;(function(n){n.Enums=" ",n.Normal="d",n.VendorPrefixed="x",n.Term="y",n.Variable="z"})(Re||(Re={}));var vt=function(){function n(e,t,r){e===void 0&&(e=null),this.variablePrefix=e,this.lsOptions=t,this.cssDataManager=r,this.completionParticipants=[]}return n.prototype.configure=function(e){this.defaultSettings=e},n.prototype.getSymbolContext=function(){return this.symbolContext||(this.symbolContext=new $t(this.styleSheet)),this.symbolContext},n.prototype.setCompletionParticipants=function(e){this.completionParticipants=e||[]},n.prototype.doComplete2=function(e,t,r,i,o){return o===void 0&&(o=this.defaultSettings),oa(this,void 0,void 0,function(){var s,a,l,c;return sa(this,function(h){switch(h.label){case 0:if(!this.lsOptions.fileSystemProvider||!this.lsOptions.fileSystemProvider.readDirectory)return[2,this.doComplete(e,t,r,o)];s=new Co(this.lsOptions.fileSystemProvider.readDirectory),a=this.completionParticipants,this.completionParticipants=[s].concat(a),l=this.doComplete(e,t,r,o),h.label=1;case 1:return h.trys.push([1,,3,4]),[4,s.computeCompletions(e,i)];case 2:return c=h.sent(),[2,{isIncomplete:l.isIncomplete||c.isIncomplete,items:c.items.concat(l.items)}];case 3:return this.completionParticipants=a,[7];case 4:return[2]}})})},n.prototype.doComplete=function(e,t,r,i){this.offset=e.offsetAt(t),this.position=t,this.currentWord=ha(e,this.offset),this.defaultReplaceRange=W.create(Q.create(this.position.line,this.position.character-this.currentWord.length),this.position),this.textDocument=e,this.styleSheet=r,this.documentSettings=i;try{var o={isIncomplete:!1,items:[]};this.nodePath=lt(this.styleSheet,this.offset);for(var s=this.nodePath.length-1;s>=0;s--){var a=this.nodePath[s];if(a instanceof ct)this.getCompletionsForDeclarationProperty(a.getParent(),o);else if(a instanceof pn)a.parent instanceof Rt?this.getVariableProposals(null,o):this.getCompletionsForExpression(a,o);else if(a instanceof De){var l=a.findAParent(u.ExtendsReference,u.Ruleset);if(l)if(l.type===u.ExtendsReference)this.getCompletionsForExtendsReference(l,a,o);else{var c=l;this.getCompletionsForSelector(c,c&&c.isNested(),o)}}else if(a instanceof we)this.getCompletionsForFunctionArgument(a,a.getParent(),o);else if(a instanceof Ft)this.getCompletionsForDeclarations(a,o);else if(a instanceof $e)this.getCompletionsForVariableDeclaration(a,o);else if(a instanceof Te)this.getCompletionsForRuleSet(a,o);else if(a instanceof Rt)this.getCompletionsForInterpolation(a,o);else if(a instanceof Qe)this.getCompletionsForFunctionDeclaration(a,o);else if(a instanceof et)this.getCompletionsForMixinReference(a,o);else if(a instanceof Pe)this.getCompletionsForFunctionArgument(null,a,o);else if(a instanceof Et)this.getCompletionsForSupports(a,o);else if(a instanceof Ze)this.getCompletionsForSupportsCondition(a,o);else if(a instanceof qe)this.getCompletionsForExtendsReference(a,null,o);else if(a.type===u.URILiteral)this.getCompletionForUriLiteralValue(a,o);else if(a.parent===null)this.getCompletionForTopLevel(o);else if(a.type===u.StringLiteral&&this.isImportPathParent(a.parent.type))this.getCompletionForImportPath(a,o);else continue;if(o.items.length>0||this.offset>a.offset)return this.finalize(o)}return this.getCompletionsForStylesheet(o),o.items.length===0&&this.variablePrefix&&this.currentWord.indexOf(this.variablePrefix)===0&&this.getVariableProposals(null,o),this.finalize(o)}finally{this.position=null,this.currentWord=null,this.textDocument=null,this.styleSheet=null,this.symbolContext=null,this.defaultReplaceRange=null,this.nodePath=null}},n.prototype.isImportPathParent=function(e){return e===u.Import},n.prototype.finalize=function(e){return e},n.prototype.findInNodePath=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var r=this.nodePath.length-1;r>=0;r--){var i=this.nodePath[r];if(e.indexOf(i.type)!==-1)return i}return null},n.prototype.getCompletionsForDeclarationProperty=function(e,t){return this.getPropertyProposals(e,t)},n.prototype.getPropertyProposals=function(e,t){var r=this,i=this.isTriggerPropertyValueCompletionEnabled,o=this.isCompletePropertyWithSemicolonEnabled,s=this.cssDataManager.getProperties();return s.forEach(function(a){var l,c,h=!1;e?(l=r.getCompletionRange(e.getProperty()),c=a.name,he(e.colonPosition)||(c+=": ",h=!0)):(l=r.getCompletionRange(null),c=a.name+": ",h=!0),!e&&o&&(c+="$0;"),e&&!e.semicolonPosition&&o&&r.offset>=r.textDocument.offsetAt(l.end)&&(c+="$0;");var p={label:a.name,documentation:ze(a,r.doesSupportMarkdown()),tags:Gt(a)?[Ne.Deprecated]:[],textEdit:T.replace(l,c),insertTextFormat:re.Snippet,kind:R.Property};a.restrictions||(h=!1),i&&h&&(p.command=_o);var m=typeof a.relevance=="number"?Math.min(Math.max(a.relevance,0),99):50,g=(255-m).toString(16),w=q(a.name,"-")?Re.VendorPrefixed:Re.Normal;p.sortText=w+"_"+g,t.items.push(p)}),this.completionParticipants.forEach(function(a){a.onCssProperty&&a.onCssProperty({propertyName:r.currentWord,range:r.defaultReplaceRange})}),t},Object.defineProperty(n.prototype,"isTriggerPropertyValueCompletionEnabled",{get:function(){var e,t;return(t=(e=this.documentSettings)===null||e===void 0?void 0:e.triggerPropertyValueCompletion)!==null&&t!==void 0?t:!0},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"isCompletePropertyWithSemicolonEnabled",{get:function(){var e,t;return(t=(e=this.documentSettings)===null||e===void 0?void 0:e.completePropertyWithSemicolon)!==null&&t!==void 0?t:!0},enumerable:!1,configurable:!0}),n.prototype.getCompletionsForDeclarationValue=function(e,t){for(var r=this,i=e.getFullPropertyName(),o=this.cssDataManager.getProperty(i),s=e.getValue()||null;s&&s.hasChildren();)s=s.findChildAtOffset(this.offset,!1);if(this.completionParticipants.forEach(function(w){w.onCssPropertyValue&&w.onCssPropertyValue({propertyName:i,propertyValue:r.currentWord,range:r.getCompletionRange(s)})}),o){if(o.restrictions)for(var a=0,l=o.restrictions;a<l.length;a++){var c=l[a];switch(c){case"color":this.getColorProposals(o,s,t);break;case"position":this.getPositionProposals(o,s,t);break;case"repeat":this.getRepeatStyleProposals(o,s,t);break;case"line-style":this.getLineStyleProposals(o,s,t);break;case"line-width":this.getLineWidthProposals(o,s,t);break;case"geometry-box":this.getGeometryBoxProposals(o,s,t);break;case"box":this.getBoxProposals(o,s,t);break;case"image":this.getImageProposals(o,s,t);break;case"timing-function":this.getTimingFunctionProposals(o,s,t);break;case"shape":this.getBasicShapeProposals(o,s,t);break}}this.getValueEnumProposals(o,s,t),this.getCSSWideKeywordProposals(o,s,t),this.getUnitProposals(o,s,t)}else for(var h=la(this.styleSheet,e),p=0,m=h.getEntries();p<m.length;p++){var g=m[p];t.items.push({label:g,textEdit:T.replace(this.getCompletionRange(s),g),kind:R.Value})}return this.getVariableProposals(s,t),this.getTermProposals(o,s,t),t},n.prototype.getValueEnumProposals=function(e,t,r){if(e.values)for(var i=0,o=e.values;i<o.length;i++){var s=o[i],a=s.name,l=void 0;if(rn(a,")")){var c=a.lastIndexOf("(");c!==-1&&(a=a.substr(0,c)+"($1)",l=We)}var h=Re.Enums;q(s.name,"-")&&(h+=Re.VendorPrefixed);var p={label:s.name,documentation:ze(s,this.doesSupportMarkdown()),tags:Gt(e)?[Ne.Deprecated]:[],textEdit:T.replace(this.getCompletionRange(t),a),sortText:h,kind:R.Value,insertTextFormat:l};r.items.push(p)}return r},n.prototype.getCSSWideKeywordProposals=function(e,t,r){for(var i in xr)r.items.push({label:i,documentation:xr[i],textEdit:T.replace(this.getCompletionRange(t),i),kind:R.Value});for(var o in Sr){var s=bt(o);r.items.push({label:o,documentation:Sr[o],textEdit:T.replace(this.getCompletionRange(t),s),kind:R.Function,insertTextFormat:We,command:q(o,"var")?_o:void 0})}return r},n.prototype.getCompletionsForInterpolation=function(e,t){return this.offset>=e.offset+2&&this.getVariableProposals(null,t),t},n.prototype.getVariableProposals=function(e,t){for(var r=this.getSymbolContext().findSymbolsAtOffset(this.offset,A.Variable),i=0,o=r;i<o.length;i++){var s=o[i],a=q(s.name,"--")?"var(".concat(s.name,")"):s.name,l={label:s.name,documentation:s.value?Jn(s.value):s.value,textEdit:T.replace(this.getCompletionRange(e),a),kind:R.Variable,sortText:Re.Variable};if(typeof l.documentation=="string"&&Fo(l.documentation)&&(l.kind=R.Color),s.node.type===u.FunctionParameter){var c=s.node.getParent();c.type===u.MixinDeclaration&&(l.detail=aa("completion.argument","argument from '{0}'",c.getName()))}t.items.push(l)}return t},n.prototype.getVariableProposalsForCSSVarFunction=function(e){var t=new Dr;this.styleSheet.acceptVisitor(new da(t,this.offset));for(var r=this.getSymbolContext().findSymbolsAtOffset(this.offset,A.Variable),i=0,o=r;i<o.length;i++){var s=o[i];if(q(s.name,"--")){var a={label:s.name,documentation:s.value?Jn(s.value):s.value,textEdit:T.replace(this.getCompletionRange(null),s.name),kind:R.Variable};typeof a.documentation=="string"&&Fo(a.documentation)&&(a.kind=R.Color),e.items.push(a)}t.remove(s.name)}for(var l=0,c=t.getEntries();l<c.length;l++){var h=c[l];if(q(h,"--")){var a={label:h,textEdit:T.replace(this.getCompletionRange(null),h),kind:R.Variable};e.items.push(a)}}return e},n.prototype.getUnitProposals=function(e,t,r){var i="0";if(this.currentWord.length>0){var o=this.currentWord.match(/^-?\d[\.\d+]*/);o&&(i=o[0],r.isIncomplete=i.length===this.currentWord.length)}else this.currentWord.length===0&&(r.isIncomplete=!0);if(t&&t.parent&&t.parent.type===u.Term&&(t=t.getParent()),e.restrictions)for(var s=0,a=e.restrictions;s<a.length;s++){var l=a[s],c=Cn[l];if(c)for(var h=0,p=c;h<p.length;h++){var m=p[h],g=i+m;r.items.push({label:g,textEdit:T.replace(this.getCompletionRange(t),g),kind:R.Unit})}}return r},n.prototype.getCompletionRange=function(e){if(e&&e.offset<=this.offset&&this.offset<=e.end){var t=e.end!==-1?this.textDocument.positionAt(e.end):this.position,r=this.textDocument.positionAt(e.offset);if(r.line===t.line)return W.create(r,t)}return this.defaultReplaceRange},n.prototype.getColorProposals=function(e,t,r){for(var i in jt)r.items.push({label:i,documentation:jt[i],textEdit:T.replace(this.getCompletionRange(t),i),kind:R.Color});for(var i in mr)r.items.push({label:i,documentation:mr[i],textEdit:T.replace(this.getCompletionRange(t),i),kind:R.Value});var o=new Dr;this.styleSheet.acceptVisitor(new ca(o,this.offset));for(var s=0,a=o.getEntries();s<a.length;s++){var i=a[s];r.items.push({label:i,textEdit:T.replace(this.getCompletionRange(t),i),kind:R.Color})}for(var l=function(g){var w=1,x=function(D,M){return"${"+w+++":"+M+"}"},y=g.func.replace(/\[?\$(\w+)\]?/g,x);r.items.push({label:g.func.substr(0,g.func.indexOf("(")),detail:g.func,documentation:g.desc,textEdit:T.replace(c.getCompletionRange(t),y),insertTextFormat:We,kind:R.Function})},c=this,h=0,p=ao;h<p.length;h++){var m=p[h];l(m)}return r},n.prototype.getPositionProposals=function(e,t,r){for(var i in gr)r.items.push({label:i,documentation:gr[i],textEdit:T.replace(this.getCompletionRange(t),i),kind:R.Value});return r},n.prototype.getRepeatStyleProposals=function(e,t,r){for(var i in br)r.items.push({label:i,documentation:br[i],textEdit:T.replace(this.getCompletionRange(t),i),kind:R.Value});return r},n.prototype.getLineStyleProposals=function(e,t,r){for(var i in vr)r.items.push({label:i,documentation:vr[i],textEdit:T.replace(this.getCompletionRange(t),i),kind:R.Value});return r},n.prototype.getLineWidthProposals=function(e,t,r){for(var i=0,o=uo;i<o.length;i++){var s=o[i];r.items.push({label:s,textEdit:T.replace(this.getCompletionRange(t),s),kind:R.Value})}return r},n.prototype.getGeometryBoxProposals=function(e,t,r){for(var i in wr)r.items.push({label:i,documentation:wr[i],textEdit:T.replace(this.getCompletionRange(t),i),kind:R.Value});return r},n.prototype.getBoxProposals=function(e,t,r){for(var i in yr)r.items.push({label:i,documentation:yr[i],textEdit:T.replace(this.getCompletionRange(t),i),kind:R.Value});return r},n.prototype.getImageProposals=function(e,t,r){for(var i in kr){var o=bt(i);r.items.push({label:i,documentation:kr[i],textEdit:T.replace(this.getCompletionRange(t),o),kind:R.Function,insertTextFormat:i!==o?We:void 0})}return r},n.prototype.getTimingFunctionProposals=function(e,t,r){for(var i in Cr){var o=bt(i);r.items.push({label:i,documentation:Cr[i],textEdit:T.replace(this.getCompletionRange(t),o),kind:R.Function,insertTextFormat:i!==o?We:void 0})}return r},n.prototype.getBasicShapeProposals=function(e,t,r){for(var i in _r){var o=bt(i);r.items.push({label:i,documentation:_r[i],textEdit:T.replace(this.getCompletionRange(t),o),kind:R.Function,insertTextFormat:i!==o?We:void 0})}return r},n.prototype.getCompletionsForStylesheet=function(e){var t=this.styleSheet.findFirstChildBeforeOffset(this.offset);return t?t instanceof Te?this.getCompletionsForRuleSet(t,e):t instanceof Et?this.getCompletionsForSupports(t,e):e:this.getCompletionForTopLevel(e)},n.prototype.getCompletionForTopLevel=function(e){var t=this;return this.cssDataManager.getAtDirectives().forEach(function(r){e.items.push({label:r.name,textEdit:T.replace(t.getCompletionRange(null),r.name),documentation:ze(r,t.doesSupportMarkdown()),tags:Gt(r)?[Ne.Deprecated]:[],kind:R.Keyword})}),this.getCompletionsForSelector(null,!1,e),e},n.prototype.getCompletionsForRuleSet=function(e,t){var r=e.getDeclarations(),i=r&&r.endsWith("}")&&this.offset>=r.end;if(i)return this.getCompletionForTopLevel(t);var o=!r||this.offset<=r.offset;return o?this.getCompletionsForSelector(e,e.isNested(),t):this.getCompletionsForDeclarations(e.getDeclarations(),t)},n.prototype.getCompletionsForSelector=function(e,t,r){var i=this,o=this.findInNodePath(u.PseudoSelector,u.IdentifierSelector,u.ClassSelector,u.ElementNameSelector);!o&&this.hasCharacterAtPosition(this.offset-this.currentWord.length-1,":")&&(this.currentWord=":"+this.currentWord,this.hasCharacterAtPosition(this.offset-this.currentWord.length-1,":")&&(this.currentWord=":"+this.currentWord),this.defaultReplaceRange=W.create(Q.create(this.position.line,this.position.character-this.currentWord.length),this.position));var s=this.cssDataManager.getPseudoClasses();s.forEach(function(y){var D=bt(y.name),M={label:y.name,textEdit:T.replace(i.getCompletionRange(o),D),documentation:ze(y,i.doesSupportMarkdown()),tags:Gt(y)?[Ne.Deprecated]:[],kind:R.Function,insertTextFormat:y.name!==D?We:void 0};q(y.name,":-")&&(M.sortText=Re.VendorPrefixed),r.items.push(M)});var a=this.cssDataManager.getPseudoElements();if(a.forEach(function(y){var D=bt(y.name),M={label:y.name,textEdit:T.replace(i.getCompletionRange(o),D),documentation:ze(y,i.doesSupportMarkdown()),tags:Gt(y)?[Ne.Deprecated]:[],kind:R.Function,insertTextFormat:y.name!==D?We:void 0};q(y.name,"::-")&&(M.sortText=Re.VendorPrefixed),r.items.push(M)}),!t){for(var l=0,c=mo;l<c.length;l++){var h=c[l];r.items.push({label:h,textEdit:T.replace(this.getCompletionRange(o),h),kind:R.Keyword})}for(var p=0,m=fo;p<m.length;p++){var h=m[p];r.items.push({label:h,textEdit:T.replace(this.getCompletionRange(o),h),kind:R.Keyword})}}var g={};g[this.currentWord]=!0;var w=this.textDocument.getText();if(this.styleSheet.accept(function(y){if(y.type===u.SimpleSelector&&y.length>0){var D=w.substr(y.offset,y.length);return D.charAt(0)==="."&&!g[D]&&(g[D]=!0,r.items.push({label:D,textEdit:T.replace(i.getCompletionRange(o),D),kind:R.Keyword})),!1}return!0}),e&&e.isNested()){var x=e.getSelectors().findFirstChildBeforeOffset(this.offset);x&&e.getSelectors().getChildren().indexOf(x)===0&&this.getPropertyProposals(null,r)}return r},n.prototype.getCompletionsForDeclarations=function(e,t){if(!e||this.offset===e.offset)return t;var r=e.findFirstChildBeforeOffset(this.offset);if(!r)return this.getCompletionsForDeclarationProperty(null,t);if(r instanceof sn){var i=r;if(!he(i.colonPosition)||this.offset<=i.colonPosition)return this.getCompletionsForDeclarationProperty(i,t);if(he(i.semicolonPosition)&&i.semicolonPosition<this.offset)return this.offset===i.semicolonPosition+1?t:this.getCompletionsForDeclarationProperty(null,t);if(i instanceof ae)return this.getCompletionsForDeclarationValue(i,t)}else r instanceof qe?this.getCompletionsForExtendsReference(r,null,t):this.currentWord&&this.currentWord[0]==="@"?this.getCompletionsForDeclarationProperty(null,t):r instanceof Te&&this.getCompletionsForDeclarationProperty(null,t);return t},n.prototype.getCompletionsForVariableDeclaration=function(e,t){return this.offset&&he(e.colonPosition)&&this.offset>e.colonPosition&&this.getVariableProposals(e.getValue(),t),t},n.prototype.getCompletionsForExpression=function(e,t){var r=e.getParent();if(r instanceof we)return this.getCompletionsForFunctionArgument(r,r.getParent(),t),t;var i=e.findParent(u.Declaration);if(!i)return this.getTermProposals(void 0,null,t),t;var o=e.findChildAtOffset(this.offset,!0);return o?o instanceof zt||o instanceof te?this.getCompletionsForDeclarationValue(i,t):t:this.getCompletionsForDeclarationValue(i,t)},n.prototype.getCompletionsForFunctionArgument=function(e,t,r){var i=t.getIdentifier();return i&&i.matches("var")&&(!t.getArguments().hasChildren()||t.getArguments().getChild(0)===e)&&this.getVariableProposalsForCSSVarFunction(r),r},n.prototype.getCompletionsForFunctionDeclaration=function(e,t){var r=e.getDeclarations();return r&&this.offset>r.offset&&this.offset<r.end&&this.getTermProposals(void 0,null,t),t},n.prototype.getCompletionsForMixinReference=function(e,t){for(var r=this,i=this.getSymbolContext().findSymbolsAtOffset(this.offset,A.Mixin),o=0,s=i;o<s.length;o++){var a=s[o];a.node instanceof Ae&&t.items.push(this.makeTermProposal(a,a.node.getParameters(),null))}var l=e.getIdentifier()||null;return this.completionParticipants.forEach(function(c){c.onCssMixinReference&&c.onCssMixinReference({mixinName:r.currentWord,range:r.getCompletionRange(l)})}),t},n.prototype.getTermProposals=function(e,t,r){for(var i=this.getSymbolContext().findSymbolsAtOffset(this.offset,A.Function),o=0,s=i;o<s.length;o++){var a=s[o];a.node instanceof Qe&&r.items.push(this.makeTermProposal(a,a.node.getParameters(),t))}return r},n.prototype.makeTermProposal=function(e,t,r){var i=e.node,o=t.getChildren().map(function(a){return a instanceof Be?a.getName():a.getText()}),s=e.name+"("+o.map(function(a,l){return"${"+(l+1)+":"+a+"}"}).join(", ")+")";return{label:e.name,detail:e.name+"("+o.join(", ")+")",textEdit:T.replace(this.getCompletionRange(r),s),insertTextFormat:We,kind:R.Function,sortText:Re.Term}},n.prototype.getCompletionsForSupportsCondition=function(e,t){var r=e.findFirstChildBeforeOffset(this.offset);if(r){if(r instanceof ae)return!he(r.colonPosition)||this.offset<=r.colonPosition?this.getCompletionsForDeclarationProperty(r,t):this.getCompletionsForDeclarationValue(r,t);if(r instanceof Ze)return this.getCompletionsForSupportsCondition(r,t)}return he(e.lParent)&&this.offset>e.lParent&&(!he(e.rParent)||this.offset<=e.rParent)?this.getCompletionsForDeclarationProperty(null,t):t},n.prototype.getCompletionsForSupports=function(e,t){var r=e.getDeclarations(),i=!r||this.offset<=r.offset;if(i){var o=e.findFirstChildBeforeOffset(this.offset);return o instanceof Ze?this.getCompletionsForSupportsCondition(o,t):t}return this.getCompletionForTopLevel(t)},n.prototype.getCompletionsForExtendsReference=function(e,t,r){return r},n.prototype.getCompletionForUriLiteralValue=function(e,t){var r,i,o;if(e.hasChildren()){var a=e.getChild(0);r=a.getText(),i=this.position,o=this.getCompletionRange(a)}else{r="",i=this.position;var s=this.textDocument.positionAt(e.offset+4);o=W.create(s,s)}return this.completionParticipants.forEach(function(l){l.onCssURILiteralValue&&l.onCssURILiteralValue({uriValue:r,position:i,range:o})}),t},n.prototype.getCompletionForImportPath=function(e,t){var r=this;return this.completionParticipants.forEach(function(i){i.onCssImportPath&&i.onCssImportPath({pathValue:e.getText(),position:r.position,range:r.getCompletionRange(e)})}),t},n.prototype.hasCharacterAtPosition=function(e,t){var r=this.textDocument.getText();return e>=0&&e<r.length&&r.charAt(e)===t},n.prototype.doesSupportMarkdown=function(){var e,t,r;if(!he(this.supportsMarkdown)){if(!he(this.lsOptions.clientCapabilities))return this.supportsMarkdown=!0,this.supportsMarkdown;var i=(r=(t=(e=this.lsOptions.clientCapabilities.textDocument)===null||e===void 0?void 0:e.completion)===null||t===void 0?void 0:t.completionItem)===null||r===void 0?void 0:r.documentationFormat;this.supportsMarkdown=Array.isArray(i)&&i.indexOf(ce.Markdown)!==-1}return this.supportsMarkdown},n}();function Gt(n){return!!(n.status&&(n.status==="nonstandard"||n.status==="obsolete"))}var Dr=function(){function n(){this.entries={}}return n.prototype.add=function(e){this.entries[e]=!0},n.prototype.remove=function(e){delete this.entries[e]},n.prototype.getEntries=function(){return Object.keys(this.entries)},n}();function bt(n){return n.replace(/\(\)$/,"($1)")}function la(n,e){var t=e.getFullPropertyName(),r=new Dr;function i(a){return(a instanceof te||a instanceof zt||a instanceof Dt)&&r.add(a.getText()),!0}function o(a){var l=a.getFullPropertyName();return t===l}function s(a){if(a instanceof ae&&a!==e&&o(a)){var l=a.getValue();l&&l.accept(i)}return!0}return n.accept(s),r}var ca=function(){function n(e,t){this.entries=e,this.currentOffset=t}return n.prototype.visitNode=function(e){return(e instanceof Dt||e instanceof Pe&&lo(e))&&(this.currentOffset<e.offset||e.end<this.currentOffset)&&this.entries.add(e.getText()),!0},n}(),da=function(){function n(e,t){this.entries=e,this.currentOffset=t}return n.prototype.visitNode=function(e){return e instanceof te&&e.isCustomProperty&&(this.currentOffset<e.offset||e.end<this.currentOffset)&&this.entries.add(e.getText()),!0},n}();function ha(n,e){for(var t=e-1,r=n.getText();t>=0&&` 	
+\r":{[()]},*>+`.indexOf(r.charAt(t))===-1;)t--;return r.substring(t+1,e)}function Fo(n){return n.toLowerCase()in jt||/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(n)}var zo=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}}(),pa=H(),Rr=function(){function n(){this.parent=null,this.children=null,this.attributes=null}return n.prototype.findAttribute=function(e){if(this.attributes)for(var t=0,r=this.attributes;t<r.length;t++){var i=r[t];if(i.name===e)return i.value}return null},n.prototype.addChild=function(e){e instanceof n&&(e.parent=this),this.children||(this.children=[]),this.children.push(e)},n.prototype.append=function(e){if(this.attributes){var t=this.attributes[this.attributes.length-1];t.value=t.value+e}},n.prototype.prepend=function(e){if(this.attributes){var t=this.attributes[0];t.value=e+t.value}},n.prototype.findRoot=function(){for(var e=this;e.parent&&!(e.parent instanceof yt);)e=e.parent;return e},n.prototype.removeChild=function(e){if(this.children){var t=this.children.indexOf(e);if(t!==-1)return this.children.splice(t,1),!0}return!1},n.prototype.addAttr=function(e,t){this.attributes||(this.attributes=[]);for(var r=0,i=this.attributes;r<i.length;r++){var o=i[r];if(o.name===e){o.value+=" "+t;return}}this.attributes.push({name:e,value:t})},n.prototype.clone=function(e){e===void 0&&(e=!0);var t=new n;if(this.attributes){t.attributes=[];for(var r=0,i=this.attributes;r<i.length;r++){var o=i[r];t.addAttr(o.name,o.value)}}if(e&&this.children){t.children=[];for(var s=0;s<this.children.length;s++)t.addChild(this.children[s].clone())}return t},n.prototype.cloneWithParent=function(){var e=this.clone(!1);if(this.parent&&!(this.parent instanceof yt)){var t=this.parent.cloneWithParent();t.addChild(e)}return e},n}();var yt=function(n){zo(e,n);function e(){return n!==null&&n.apply(this,arguments)||this}return e}(Rr);var zr=function(n){zo(e,n);function e(t){var r=n.call(this)||this;return r.addAttr("name",t),r}return e}(Rr);var Eo=function(){function n(e){this.quote=e,this.result=[]}return n.prototype.print=function(e){this.result=[],e instanceof yt?e.children&&this.doPrint(e.children,0):this.doPrint([e],0);var t=this.result.join(`
+`);return[{language:"html",value:t}]},n.prototype.doPrint=function(e,t){for(var r=0,i=e;r<i.length;r++){var o=i[r];this.doPrintElement(o,t),o.children&&this.doPrint(o.children,t+1)}},n.prototype.writeLine=function(e,t){var r=new Array(e+1).join("  ");this.result.push(r+t)},n.prototype.doPrintElement=function(e,t){var r=e.findAttribute("name");if(e instanceof zr||r==="\u2026"){this.writeLine(t,r);return}var i=["<"];if(r?i.push(r):i.push("element"),e.attributes)for(var o=0,s=e.attributes;o<s.length;o++){var a=s[o];if(a.name!=="name"){i.push(" "),i.push(a.name);var l=a.value;l&&(i.push("="),i.push(Le.ensure(l,this.quote)))}}i.push(">"),this.writeLine(t,i.join(""))},n}(),Le;(function(n){function e(r,i){return i+t(r)+i}n.ensure=e;function t(r){var i=r.match(/^['"](.*)["']$/);return i?i[1]:r}n.remove=t})(Le||(Le={}));var Do=function(){function n(){this.id=0,this.attr=0,this.tag=0}return n}();function Ro(n,e){for(var t=new Rr,r=0,i=n.getChildren();r<i.length;r++){var o=i[r];switch(o.type){case u.SelectorCombinator:if(e){var s=o.getText().split("&");if(s.length===1){t.addAttr("name",s[0]);break}if(t=e.cloneWithParent(),s[0]){var a=t.findRoot();a.prepend(s[0])}for(var l=1;l<s.length;l++){if(l>1){var c=e.cloneWithParent();t.addChild(c.findRoot()),t=c}t.append(s[l])}}break;case u.SelectorPlaceholder:if(o.matches("@at-root"))return t;case u.ElementNameSelector:var h=o.getText();t.addAttr("name",h==="*"?"element":be(h));break;case u.ClassSelector:t.addAttr("class",be(o.getText().substring(1)));break;case u.IdentifierSelector:t.addAttr("id",be(o.getText().substring(1)));break;case u.MixinDeclaration:t.addAttr("class",o.getName());break;case u.PseudoSelector:t.addAttr(be(o.getText()),"");break;case u.AttributeSelector:var p=o,m=p.getIdentifier();if(m){var g=p.getValue(),w=p.getOperator(),x=void 0;if(g&&w)switch(be(w.getText())){case"|=":x="".concat(Le.remove(be(g.getText())),"-\u2026");break;case"^=":x="".concat(Le.remove(be(g.getText())),"\u2026");break;case"$=":x="\u2026".concat(Le.remove(be(g.getText())));break;case"~=":x=" \u2026 ".concat(Le.remove(be(g.getText()))," \u2026 ");break;case"*=":x="\u2026".concat(Le.remove(be(g.getText())),"\u2026");break;default:x=Le.remove(be(g.getText()));break}t.addAttr(be(m.getText()),x)}break}}return t}function be(n){var e=new Fe;e.setSource(n);var t=e.scanUnquotedString();return t?t.text:n}var Io=function(){function n(e){this.cssDataManager=e}return n.prototype.selectorToMarkedString=function(e){var t=fa(e);if(t){var r=new Eo('"').print(t);return r.push(this.selectorToSpecificityMarkedString(e)),r}else return[]},n.prototype.simpleSelectorToMarkedString=function(e){var t=Ro(e),r=new Eo('"').print(t);return r.push(this.selectorToSpecificityMarkedString(e)),r},n.prototype.isPseudoElementIdentifier=function(e){var t=e.match(/^::?([\w-]+)/);return t?!!this.cssDataManager.getPseudoElement("::"+t[1]):!1},n.prototype.selectorToSpecificityMarkedString=function(e){var t=this,r=function(o){var s=new Do;e:for(var a=0,l=o.getChildren();a<l.length;a++){var c=l[a];switch(c.type){case u.IdentifierSelector:s.id++;break;case u.ClassSelector:case u.AttributeSelector:s.attr++;break;case u.ElementNameSelector:if(c.matches("*"))break;s.tag++;break;case u.PseudoSelector:var h=c.getText();if(t.isPseudoElementIdentifier(h)){s.tag++;break}if(h.match(/^:where/i))continue e;if(h.match(/^:(not|has|is)/i)&&c.getChildren().length>0){for(var p=new Do,m=0,g=c.getChildren();m<g.length;m++){var w=g[m],x=void 0;w.type===u.Undefined?x=w.getChildren():x=[w];for(var y=0,D=w.getChildren();y<D.length;y++){var M=D[y],z=r(M);if(z.id>p.id){p=z;continue}else if(z.id<p.id)continue;if(z.attr>p.attr){p=z;continue}else if(z.attr<p.attr)continue;if(z.tag>p.tag){p=z;continue}}}s.id+=p.id,s.attr+=p.attr,s.tag+=p.tag;continue e}s.attr++;break}if(c.getChildren().length>0){var z=r(c);s.id+=z.id,s.attr+=z.attr,s.tag+=z.tag}}return s},i=r(e);return pa("specificity","[Selector Specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity): ({0}, {1}, {2})",i.id,i.attr,i.tag)},n}();var ua=function(){function n(e){this.prev=null,this.element=e}return n.prototype.processSelector=function(e){var t=null;if(!(this.element instanceof yt)&&e.getChildren().some(function(h){return h.hasChildren()&&h.getChild(0).type===u.SelectorCombinator})){var r=this.element.findRoot();r.parent instanceof yt&&(t=this.element,this.element=r.parent,this.element.removeChild(r),this.prev=null)}for(var i=0,o=e.getChildren();i<o.length;i++){var s=o[i];if(s instanceof De){if(this.prev instanceof De){var a=new zr("\u2026");this.element.addChild(a),this.element=a}else this.prev&&(this.prev.matches("+")||this.prev.matches("~"))&&this.element.parent&&(this.element=this.element.parent);this.prev&&this.prev.matches("~")&&this.element.addChild(new zr("\u22EE"));var l=Ro(s,t),c=l.findRoot();this.element.addChild(c),this.element=l}(s instanceof De||s.type===u.SelectorCombinatorParent||s.type===u.SelectorCombinatorShadowPiercingDescendant||s.type===u.SelectorCombinatorSibling||s.type===u.SelectorCombinatorAllSiblings)&&(this.prev=s)}},n}();function ma(n){switch(n.type){case u.MixinDeclaration:case u.Stylesheet:return!0}return!1}function fa(n){if(n.matches("@at-root"))return null;var e=new yt,t=[],r=n.getParent();if(r instanceof Te)for(var i=r.getParent();i&&!ma(i);){if(i instanceof Te){if(i.getSelectors().matches("@at-root"))break;t.push(i)}i=i.getParent()}for(var o=new ua(e),s=t.length-1;s>=0;s--){var a=t[s].getSelectors().getChild(0);a&&o.processSelector(a)}return o.processSelector(n),e}var In=function(){function n(e,t){this.clientCapabilities=e,this.cssDataManager=t,this.selectorPrinting=new Io(t)}return n.prototype.configure=function(e){this.defaultSettings=e},n.prototype.doHover=function(e,t,r,i){i===void 0&&(i=this.defaultSettings);function o(y){return W.create(e.positionAt(y.offset),e.positionAt(y.end))}for(var s=e.offsetAt(t),a=lt(r,s),l=null,c=0;c<a.length;c++){var h=a[c];if(h instanceof Ee){l={contents:this.selectorPrinting.selectorToMarkedString(h),range:o(h)};break}if(h instanceof De){q(h.getText(),"@")||(l={contents:this.selectorPrinting.simpleSelectorToMarkedString(h),range:o(h)});break}if(h instanceof ae){var p=h.getFullPropertyName(),m=this.cssDataManager.getProperty(p);if(m){var g=ze(m,this.doesSupportMarkdown(),i);g?l={contents:g,range:o(h)}:l=null}continue}if(h instanceof un){var w=h.getText(),m=this.cssDataManager.getAtDirective(w);if(m){var g=ze(m,this.doesSupportMarkdown(),i);g?l={contents:g,range:o(h)}:l=null}continue}if(h instanceof F&&h.type===u.PseudoSelector){var x=h.getText(),m=x.slice(0,2)==="::"?this.cssDataManager.getPseudoElement(x):this.cssDataManager.getPseudoClass(x);if(m){var g=ze(m,this.doesSupportMarkdown(),i);g?l={contents:g,range:o(h)}:l=null}continue}}return l&&(l.contents=this.convertContents(l.contents)),l},n.prototype.convertContents=function(e){return this.doesSupportMarkdown()||typeof e=="string"?e:"kind"in e?{kind:"plaintext",value:e.value}:Array.isArray(e)?e.map(function(t){return typeof t=="string"?t:t.value}):e.value},n.prototype.doesSupportMarkdown=function(){if(!he(this.supportsMarkdown)){if(!he(this.clientCapabilities))return this.supportsMarkdown=!0,this.supportsMarkdown;var e=this.clientCapabilities.textDocument&&this.clientCapabilities.textDocument.hover;this.supportsMarkdown=e&&e.contentFormat&&Array.isArray(e.contentFormat)&&e.contentFormat.indexOf(ce.Markdown)!==-1}return this.supportsMarkdown},n}();var Ht=function(n,e,t,r){function i(o){return o instanceof t?o:new t(function(s){s(o)})}return new(t||(t=Promise))(function(o,s){function a(h){try{c(r.next(h))}catch(p){s(p)}}function l(h){try{c(r.throw(h))}catch(p){s(p)}}function c(h){h.done?o(h.value):i(h.value).then(a,l)}c((r=r.apply(n,e||[])).next())})},Jt=function(n,e){var t={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},r,i,o,s;return s={next:a(0),throw:a(1),return:a(2)},typeof Symbol=="function"&&(s[Symbol.iterator]=function(){return this}),s;function a(c){return function(h){return l([c,h])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;t;)try{if(r=1,i&&(o=c[0]&2?i.return:c[0]?i.throw||((o=i.return)&&o.call(i),0):i.next)&&!(o=o.call(i,c[1])).done)return o;switch(i=0,o&&(c=[c[0]&2,o.value]),c[0]){case 0:case 1:o=c;break;case 4:return t.label++,{value:c[1],done:!1};case 5:t.label++,i=c[1],c=[0];continue;case 7:c=t.ops.pop(),t.trys.pop();continue;default:if(o=t.trys,!(o=o.length>0&&o[o.length-1])&&(c[0]===6||c[0]===2)){t=0;continue}if(c[0]===3&&(!o||c[1]>o[0]&&c[1]<o[3])){t.label=c[1];break}if(c[0]===6&&t.label<o[1]){t.label=o[1],o=c;break}if(o&&t.label<o[2]){t.label=o[2],t.ops.push(c);break}o[2]&&t.ops.pop(),t.trys.pop();continue}c=e.call(n,t)}catch(h){c=[6,h],i=0}finally{r=o=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}},Mo=H(),To=/^\w+:\/\//,Po=/^data:/,Xt=function(){function n(e,t){this.fileSystemProvider=e,this.resolveModuleReferences=t}return n.prototype.findDefinition=function(e,t,r){var i=new $t(r),o=e.offsetAt(t),s=on(r,o);if(!s)return null;var a=i.findSymbolFromNode(s);return a?{uri:e.uri,range:ot(a.node,e)}:null},n.prototype.findReferences=function(e,t,r){var i=this.findDocumentHighlights(e,t,r);return i.map(function(o){return{uri:e.uri,range:o.range}})},n.prototype.findDocumentHighlights=function(e,t,r){var i=[],o=e.offsetAt(t),s=on(r,o);if(!s||s.type===u.Stylesheet||s.type===u.Declarations)return i;s.type===u.Identifier&&s.parent&&s.parent.type===u.ClassSelector&&(s=s.parent);var a=new $t(r),l=a.findSymbolFromNode(s),c=s.getText();return r.accept(function(h){if(l){if(a.matchesSymbol(h,l))return i.push({kind:Ao(h),range:ot(h,e)}),!1}else s&&s.type===h.type&&h.matches(c)&&i.push({kind:Ao(h),range:ot(h,e)});return!0}),i},n.prototype.isRawStringDocumentLinkNode=function(e){return e.type===u.Import},n.prototype.findDocumentLinks=function(e,t,r){for(var i=this.findUnresolvedLinks(e,t),o=[],s=0,a=i;s<a.length;s++){var l=a[s],c=l.link,h=c.target;if(!(!h||Po.test(h)))if(To.test(h))o.push(c);else{var p=r.resolveReference(h,e.uri);p&&(c.target=p),o.push(c)}}return o},n.prototype.findDocumentLinks2=function(e,t,r){return Ht(this,void 0,void 0,function(){var i,o,s,a,l,c,h,p;return Jt(this,function(m){switch(m.label){case 0:i=this.findUnresolvedLinks(e,t),o=[],s=0,a=i,m.label=1;case 1:return s<a.length?(l=a[s],c=l.link,h=c.target,!h||Po.test(h)?[3,5]:[3,2]):[3,6];case 2:return To.test(h)?(o.push(c),[3,5]):[3,3];case 3:return[4,this.resolveRelativeReference(h,e.uri,r,l.isRawLink)];case 4:p=m.sent(),p!==void 0&&(c.target=p,o.push(c)),m.label=5;case 5:return s++,[3,1];case 6:return[2,o]}})})},n.prototype.findUnresolvedLinks=function(e,t){var r=this,i=[],o=function(s){var a=s.getText(),l=ot(s,e);if(!(l.start.line===l.end.line&&l.start.character===l.end.character)){(q(a,"'")||q(a,'"'))&&(a=a.slice(1,-1));var c=s.parent?r.isRawStringDocumentLinkNode(s.parent):!1;i.push({link:{target:a,range:l},isRawLink:c})}};return t.accept(function(s){if(s.type===u.URILiteral){var a=s.getChild(0);return a&&o(a),!1}if(s.parent&&r.isRawStringDocumentLinkNode(s.parent)){var l=s.getText();return(q(l,"'")||q(l,'"'))&&o(s),!1}return!0}),i},n.prototype.findDocumentSymbols=function(e,t){var r=[];return t.accept(function(i){var o={name:null,kind:Oe.Class,location:null},s=i;if(i instanceof Ee)return o.name=i.getText(),s=i.findAParent(u.Ruleset,u.ExtendsReference),s&&(o.location=tt.create(e.uri,ot(s,e)),r.push(o)),!1;if(i instanceof $e)o.name=i.getName(),o.kind=Oe.Variable;else if(i instanceof Ae)o.name=i.getName(),o.kind=Oe.Method;else if(i instanceof Qe)o.name=i.getName(),o.kind=Oe.Function;else if(i instanceof ln)o.name=Mo("literal.keyframes","@keyframes {0}",i.getName());else if(i instanceof an)o.name=Mo("literal.fontface","@font-face");else if(i instanceof cn){var a=i.getChild(0);a instanceof dn&&(o.name="@media "+a.getText(),o.kind=Oe.Module)}return o.name&&(o.location=tt.create(e.uri,ot(s,e)),r.push(o)),!0}),r},n.prototype.findDocumentColors=function(e,t){var r=[];return t.accept(function(i){var o=ga(i,e);return o&&r.push(o),!0}),r},n.prototype.getColorPresentations=function(e,t,r,i){var o=[],s=Math.round(r.red*255),a=Math.round(r.green*255),l=Math.round(r.blue*255),c;r.alpha===1?c="rgb(".concat(s,", ").concat(a,", ").concat(l,")"):c="rgba(".concat(s,", ").concat(a,", ").concat(l,", ").concat(r.alpha,")"),o.push({label:c,textEdit:T.replace(i,c)}),r.alpha===1?c="#".concat(it(s)).concat(it(a)).concat(it(l)):c="#".concat(it(s)).concat(it(a)).concat(it(l)).concat(it(Math.round(r.alpha*255))),o.push({label:c,textEdit:T.replace(i,c)});var h=fr(r);h.a===1?c="hsl(".concat(h.h,", ").concat(Math.round(h.s*100),"%, ").concat(Math.round(h.l*100),"%)"):c="hsla(".concat(h.h,", ").concat(Math.round(h.s*100),"%, ").concat(Math.round(h.l*100),"%, ").concat(h.a,")"),o.push({label:c,textEdit:T.replace(i,c)});var p=ho(r);return p.a===1?c="hwb(".concat(p.h," ").concat(Math.round(p.w*100),"% ").concat(Math.round(p.b*100),"%)"):c="hwb(".concat(p.h," ").concat(Math.round(p.w*100),"% ").concat(Math.round(p.b*100),"% / ").concat(p.a,")"),o.push({label:c,textEdit:T.replace(i,c)}),o},n.prototype.doRename=function(e,t,r,i){var o,s=this.findDocumentHighlights(e,t,i),a=s.map(function(l){return T.replace(l.range,r)});return{changes:(o={},o[e.uri]=a,o)}},n.prototype.resolveModuleReference=function(e,t,r){return Ht(this,void 0,void 0,function(){var i,o,s,a,l;return Jt(this,function(c){switch(c.label){case 0:return q(t,"file://")?(i=ba(e),o=r.resolveReference("/",t),s=Dn(t),[4,this.resolvePathToModule(i,s,o)]):[3,2];case 1:if(a=c.sent(),a)return l=e.substring(i.length+1),[2,Kt(a,l)];c.label=2;case 2:return[2,void 0]}})})},n.prototype.resolveRelativeReference=function(e,t,r,i){return Ht(this,void 0,void 0,function(){var o,s;return Jt(this,function(a){switch(a.label){case 0:return o=r.resolveReference(e,t),e[0]==="~"&&e[1]!=="/"&&this.fileSystemProvider?(e=e.substring(1),[4,this.resolveModuleReference(e,t,r)]):[3,2];case 1:return[2,a.sent()||o];case 2:return this.resolveModuleReferences?(s=o,s?[4,this.fileExists(o)]:[3,4]):[3,7];case 3:s=a.sent(),a.label=4;case 4:return s?[2,o]:[3,5];case 5:return[4,this.resolveModuleReference(e,t,r)];case 6:return[2,a.sent()||o];case 7:return[2,o]}})})},n.prototype.resolvePathToModule=function(e,t,r){return Ht(this,void 0,void 0,function(){var i;return Jt(this,function(o){switch(o.label){case 0:return i=Kt(t,"node_modules",e,"package.json"),[4,this.fileExists(i)];case 1:return o.sent()?[2,Dn(i)]:r&&t.startsWith(r)&&t.length!==r.length?[2,this.resolvePathToModule(e,Dn(t),r)]:[2,void 0]}})})},n.prototype.fileExists=function(e){return Ht(this,void 0,void 0,function(){var t,r;return Jt(this,function(i){switch(i.label){case 0:if(!this.fileSystemProvider)return[2,!1];i.label=1;case 1:return i.trys.push([1,3,,4]),[4,this.fileSystemProvider.stat(e)];case 2:return t=i.sent(),t.type===rt.Unknown&&t.size===-1?[2,!1]:[2,!0];case 3:return r=i.sent(),[2,!1];case 4:return[2]}})})},n}();function ga(n,e){var t=po(n);if(t){var r=ot(n,e);return{color:t,range:r}}return null}function ot(n,e){return W.create(e.positionAt(n.offset),e.positionAt(n.end))}function Ao(n){if(n.type===u.Selector)return He.Write;if(n instanceof te&&n.parent&&n.parent instanceof ct&&n.isCustomProperty)return He.Write;if(n.parent)switch(n.parent.type){case u.FunctionDeclaration:case u.MixinDeclaration:case u.Keyframe:case u.VariableDeclaration:case u.FunctionParameter:return He.Write}return He.Read}function it(n){var e=n.toString(16);return e.length!==2?"0"+e:e}function ba(n){return n[0]==="@"?n.substring(0,n.indexOf("/",n.indexOf("/")+1)):n.substring(0,n.indexOf("/"))}var Y=H(),wt=ne.Warning,No=ne.Error,Se=ne.Ignore,Z=function(){function n(e,t,r){this.id=e,this.message=t,this.defaultValue=r}return n}();var va=function(){function n(e,t,r){this.id=e,this.message=t,this.defaultValue=r}return n}();var V={AllVendorPrefixes:new Z("compatibleVendorPrefixes",Y("rule.vendorprefixes.all","When using a vendor-specific prefix make sure to also include all other vendor-specific properties"),Se),IncludeStandardPropertyWhenUsingVendorPrefix:new Z("vendorPrefix",Y("rule.standardvendorprefix.all","When using a vendor-specific prefix also include the standard property"),wt),DuplicateDeclarations:new Z("duplicateProperties",Y("rule.duplicateDeclarations","Do not use duplicate style definitions"),Se),EmptyRuleSet:new Z("emptyRules",Y("rule.emptyRuleSets","Do not use empty rulesets"),wt),ImportStatemement:new Z("importStatement",Y("rule.importDirective","Import statements do not load in parallel"),Se),BewareOfBoxModelSize:new Z("boxModel",Y("rule.bewareOfBoxModelSize","Do not use width or height when using padding or border"),Se),UniversalSelector:new Z("universalSelector",Y("rule.universalSelector","The universal selector (*) is known to be slow"),Se),ZeroWithUnit:new Z("zeroUnits",Y("rule.zeroWidthUnit","No unit for zero needed"),Se),RequiredPropertiesForFontFace:new Z("fontFaceProperties",Y("rule.fontFaceProperties","@font-face rule must define 'src' and 'font-family' properties"),wt),HexColorLength:new Z("hexColorLength",Y("rule.hexColor","Hex colors must consist of three, four, six or eight hex numbers"),No),ArgsInColorFunction:new Z("argumentsInColorFunction",Y("rule.colorFunction","Invalid number of parameters"),No),UnknownProperty:new Z("unknownProperties",Y("rule.unknownProperty","Unknown property."),wt),UnknownAtRules:new Z("unknownAtRules",Y("rule.unknownAtRules","Unknown at-rule."),wt),IEStarHack:new Z("ieHack",Y("rule.ieHack","IE hacks are only necessary when supporting IE7 and older"),Se),UnknownVendorSpecificProperty:new Z("unknownVendorSpecificProperties",Y("rule.unknownVendorSpecificProperty","Unknown vendor specific property."),Se),PropertyIgnoredDueToDisplay:new Z("propertyIgnoredDueToDisplay",Y("rule.propertyIgnoredDueToDisplay","Property is ignored due to the display."),wt),AvoidImportant:new Z("important",Y("rule.avoidImportant","Avoid using !important. It is an indication that the specificity of the entire CSS has gotten out of control and needs to be refactored."),Se),AvoidFloat:new Z("float",Y("rule.avoidFloat","Avoid using 'float'. Floats lead to fragile CSS that is easy to break if one aspect of the layout changes."),Se),AvoidIdSelector:new Z("idSelector",Y("rule.avoidIdSelector","Selectors should not contain IDs because these rules are too tightly coupled with the HTML."),Se)},Oo={ValidProperties:new va("validProperties",Y("rule.validProperties","A list of properties that are not validated against the `unknownProperties` rule."),[])},Wo=function(){function n(e){e===void 0&&(e={}),this.conf=e}return n.prototype.getRule=function(e){if(this.conf.hasOwnProperty(e.id)){var t=ya(this.conf[e.id]);if(t)return t}return e.defaultValue},n.prototype.getSetting=function(e){return this.conf[e.id]},n}();function ya(n){switch(n){case"ignore":return ne.Ignore;case"warning":return ne.Warning;case"error":return ne.Error}return null}var wa=H(),Mn=function(){function n(e){this.cssDataManager=e}return n.prototype.doCodeActions=function(e,t,r,i){return this.doCodeActions2(e,t,r,i).map(function(o){var s=o.edit&&o.edit.documentChanges&&o.edit.documentChanges[0];return Ge.create(o.title,"_css.applyCodeAction",e.uri,e.version,s&&s.edits)})},n.prototype.doCodeActions2=function(e,t,r,i){var o=[];if(r.diagnostics)for(var s=0,a=r.diagnostics;s<a.length;s++){var l=a[s];this.appendFixesForMarker(e,i,l,o)}return o},n.prototype.getFixesForUnknownProperty=function(e,t,r,i){var o=t.getName(),s=[];this.cssDataManager.getProperties().forEach(function(D){var M=oi(o,D.name);M>=o.length/2&&s.push({property:D.name,score:M})}),s.sort(function(D,M){return M.score-D.score||D.property.localeCompare(M.property)});for(var a=3,l=0,c=s;l<c.length;l++){var h=c[l],p=h.property,m=wa("css.codeaction.rename","Rename to '{0}'",p),g=T.replace(r.range,p),w=At.create(e.uri,e.version),x={documentChanges:[nt.create(w,[g])]},y=Wt.create(m,x,Ot.QuickFix);if(y.diagnostics=[r],i.push(y),--a<=0)return}},n.prototype.appendFixesForMarker=function(e,t,r,i){if(r.code===V.UnknownProperty.id)for(var o=e.offsetAt(r.range.start),s=e.offsetAt(r.range.end),a=lt(t,o),l=a.length-1;l>=0;l--){var c=a[l];if(c instanceof ae){var h=c.getProperty();if(h&&h.offset===o&&h.end===s){this.getFixesForUnknownProperty(e,h,r,i);return}}}},n}();var Uo=function(){function n(e){this.fullPropertyName=e.getFullPropertyName().toLowerCase(),this.node=e}return n}();function Yt(n,e,t,r){var i=n[e];i.value=t,t&&(Fr(i.properties,r)||i.properties.push(r))}function xa(n,e,t){Yt(n,"top",e,t),Yt(n,"right",e,t),Yt(n,"bottom",e,t),Yt(n,"left",e,t)}function ie(n,e,t,r){e==="top"||e==="right"||e==="bottom"||e==="left"?Yt(n,e,t,r):xa(n,t,r)}function Ir(n,e,t){switch(e.length){case 1:ie(n,void 0,e[0],t);break;case 2:ie(n,"top",e[0],t),ie(n,"bottom",e[0],t),ie(n,"right",e[1],t),ie(n,"left",e[1],t);break;case 3:ie(n,"top",e[0],t),ie(n,"right",e[1],t),ie(n,"left",e[1],t),ie(n,"bottom",e[2],t);break;case 4:ie(n,"top",e[0],t),ie(n,"right",e[1],t),ie(n,"bottom",e[2],t),ie(n,"left",e[3],t);break}}function Mr(n,e){for(var t=0,r=e;t<r.length;t++){var i=r[t];if(n.matches(i))return!0}return!1}function Qt(n,e){return e===void 0&&(e=!0),e&&Mr(n,["initial","unset"])?!1:parseFloat(n.getText())!==0}function Lo(n,e){return e===void 0&&(e=!0),n.map(function(t){return Qt(t,e)})}function Tn(n,e){return e===void 0&&(e=!0),!(Mr(n,["none","hidden"])||e&&Mr(n,["initial","unset"]))}function Sa(n,e){return e===void 0&&(e=!0),n.map(function(t){return Tn(t,e)})}function ka(n){var e=n.getChildren();if(e.length===1){var t=e[0];return Qt(t)&&Tn(t)}for(var r=0,i=e;r<i.length;r++){var o=i[r],t=o;if(!Qt(t,!1)||!Tn(t,!1))return!1}return!0}function Tr(n){for(var e={top:{value:!1,properties:[]},right:{value:!1,properties:[]},bottom:{value:!1,properties:[]},left:{value:!1,properties:[]}},t=0,r=n;t<r.length;t++){var i=r[t],o=i.node.value;if(!(typeof o>"u"))switch(i.fullPropertyName){case"box-sizing":return{top:{value:!1,properties:[]},right:{value:!1,properties:[]},bottom:{value:!1,properties:[]},left:{value:!1,properties:[]}};case"width":e.width=i;break;case"height":e.height=i;break;default:var s=i.fullPropertyName.split("-");switch(s[0]){case"border":switch(s[1]){case void 0:case"top":case"right":case"bottom":case"left":switch(s[2]){case void 0:ie(e,s[1],ka(o),i);break;case"width":ie(e,s[1],Qt(o,!1),i);break;case"style":ie(e,s[1],Tn(o,!0),i);break}break;case"width":Ir(e,Lo(o.getChildren(),!1),i);break;case"style":Ir(e,Sa(o.getChildren(),!0),i);break}break;case"padding":s.length===1?Ir(e,Lo(o.getChildren(),!0),i):ie(e,s[1],Qt(o,!0),i);break}break}}return e}var Ue=H(),jo=function(){function n(){this.data={}}return n.prototype.add=function(e,t,r){var i=this.data[e];i||(i={nodes:[],names:[]},this.data[e]=i),i.names.push(t),r&&i.nodes.push(r)},n}(),Vo=function(){function n(e,t,r){var i=this;this.cssDataManager=r,this.warnings=[],this.settings=t,this.documentText=e.getText(),this.keyframes=new jo,this.validProperties={};var o=t.getSetting(Oo.ValidProperties);Array.isArray(o)&&o.forEach(function(s){if(typeof s=="string"){var a=s.trim().toLowerCase();a.length&&(i.validProperties[a]=!0)}})}return n.entries=function(e,t,r,i,o){var s=new n(t,r,i);return e.acceptVisitor(s),s.completeValidations(),s.getEntries(o)},n.prototype.isValidPropertyDeclaration=function(e){var t=e.fullPropertyName;return this.validProperties[t]},n.prototype.fetch=function(e,t){for(var r=[],i=0,o=e;i<o.length;i++){var s=o[i];s.fullPropertyName===t&&r.push(s)}return r},n.prototype.fetchWithValue=function(e,t,r){for(var i=[],o=0,s=e;o<s.length;o++){var a=s[o];if(a.fullPropertyName===t){var l=a.node.getValue();l&&this.findValueInExpression(l,r)&&i.push(a)}}return i},n.prototype.findValueInExpression=function(e,t){var r=!1;return e.accept(function(i){return i.type===u.Identifier&&i.matches(t)&&(r=!0),!r}),r},n.prototype.getEntries=function(e){return e===void 0&&(e=ne.Warning|ne.Error),this.warnings.filter(function(t){return(t.getLevel()&e)!==0})},n.prototype.addEntry=function(e,t,r){var i=new mn(e,t,this.settings.getRule(t),r);this.warnings.push(i)},n.prototype.getMissingNames=function(e,t){for(var r=e.slice(0),i=0;i<t.length;i++){var o=r.indexOf(t[i]);o!==-1&&(r[o]=null)}for(var s=null,i=0;i<r.length;i++){var a=r[i];a&&(s===null?s=Ue("namelist.single","'{0}'",a):s=Ue("namelist.concatenated","{0}, '{1}'",s,a))}return s},n.prototype.visitNode=function(e){switch(e.type){case u.UnknownAtRule:return this.visitUnknownAtRule(e);case u.Keyframe:return this.visitKeyframe(e);case u.FontFace:return this.visitFontFace(e);case u.Ruleset:return this.visitRuleSet(e);case u.SimpleSelector:return this.visitSimpleSelector(e);case u.Function:return this.visitFunction(e);case u.NumericValue:return this.visitNumericValue(e);case u.Import:return this.visitImport(e);case u.HexColorValue:return this.visitHexColorValue(e);case u.Prio:return this.visitPrio(e);case u.IdentifierSelector:return this.visitIdentifierSelector(e)}return!0},n.prototype.completeValidations=function(){this.validateKeyframes()},n.prototype.visitUnknownAtRule=function(e){var t=e.getChild(0);if(!t)return!1;var r=this.cssDataManager.getAtDirective(t.getText());return r?!1:(this.addEntry(t,V.UnknownAtRules,"Unknown at rule ".concat(t.getText())),!0)},n.prototype.visitKeyframe=function(e){var t=e.getKeyword();if(!t)return!1;var r=t.getText();return this.keyframes.add(e.getName(),r,r!=="@keyframes"?t:null),!0},n.prototype.validateKeyframes=function(){var e=["@-webkit-keyframes","@-moz-keyframes","@-o-keyframes"];for(var t in this.keyframes.data){var r=this.keyframes.data[t].names,i=r.indexOf("@keyframes")===-1;if(!(!i&&r.length===1)){var o=this.getMissingNames(e,r);if(o||i)for(var s=0,a=this.keyframes.data[t].nodes;s<a.length;s++){var l=a[s];if(i){var c=Ue("keyframes.standardrule.missing","Always define standard rule '@keyframes' when defining keyframes.");this.addEntry(l,V.IncludeStandardPropertyWhenUsingVendorPrefix,c)}if(o){var c=Ue("keyframes.vendorspecific.missing","Always include all vendor specific rules: Missing: {0}",o);this.addEntry(l,V.AllVendorPrefixes,c)}}}}return!0},n.prototype.visitSimpleSelector=function(e){var t=this.documentText.charAt(e.offset);return e.length===1&&t==="*"&&this.addEntry(e,V.UniversalSelector),!0},n.prototype.visitIdentifierSelector=function(e){return this.addEntry(e,V.AvoidIdSelector),!0},n.prototype.visitImport=function(e){return this.addEntry(e,V.ImportStatemement),!0},n.prototype.visitRuleSet=function(e){var t=e.getDeclarations();if(!t)return!1;t.hasChildren()||this.addEntry(e.getSelectors(),V.EmptyRuleSet);for(var r=[],i=0,o=t.getChildren();i<o.length;i++){var s=o[i];s instanceof ae&&r.push(new Uo(s))}var a=Tr(r);if(a.width){var l=[];if(a.right.value&&(l=Bt(l,a.right.properties)),a.left.value&&(l=Bt(l,a.left.properties)),l.length!==0){for(var c=0,h=l;c<h.length;c++){var p=h[c];this.addEntry(p.node,V.BewareOfBoxModelSize)}this.addEntry(a.width.node,V.BewareOfBoxModelSize)}}if(a.height){var l=[];if(a.top.value&&(l=Bt(l,a.top.properties)),a.bottom.value&&(l=Bt(l,a.bottom.properties)),l.length!==0){for(var m=0,g=l;m<g.length;m++){var p=g[m];this.addEntry(p.node,V.BewareOfBoxModelSize)}this.addEntry(a.height.node,V.BewareOfBoxModelSize)}}var w=this.fetchWithValue(r,"display","inline-block");if(w.length>0)for(var x=this.fetch(r,"float"),y=0;y<x.length;y++){var D=x[y].node,M=D.getValue();M&&!M.matches("none")&&this.addEntry(D,V.PropertyIgnoredDueToDisplay,Ue("rule.propertyIgnoredDueToDisplayInlineBlock","inline-block is ignored due to the float. If 'float' has a value other than 'none', the box is floated and 'display' is treated as 'block'"))}if(w=this.fetchWithValue(r,"display","block"),w.length>0)for(var x=this.fetch(r,"vertical-align"),y=0;y<x.length;y++)this.addEntry(x[y].node,V.PropertyIgnoredDueToDisplay,Ue("rule.propertyIgnoredDueToDisplayBlock","Property is ignored due to the display. With 'display: block', vertical-align should not be used."));for(var z=this.fetch(r,"float"),y=0;y<z.length;y++){var s=z[y];this.isValidPropertyDeclaration(s)||this.addEntry(s.node,V.AvoidFloat)}for(var P=0;P<r.length;P++){var s=r[P];if(s.fullPropertyName!=="background"&&!this.validProperties[s.fullPropertyName]){var M=s.node.getValue();if(M&&this.documentText.charAt(M.offset)!=="-"){var L=this.fetch(r,s.fullPropertyName);if(L.length>1)for(var $=0;$<L.length;$++){var ue=L[$].node.getValue();ue&&this.documentText.charAt(ue.offset)!=="-"&&L[$]!==s&&this.addEntry(s.node,V.DuplicateDeclarations)}}}}var oe=e.getSelectors().matches(":export");if(!oe){for(var me=new jo,ve=!1,ye=0,ke=r;ye<ke.length;ye++){var s=ke[ye],pe=s.node;if(this.isCSSDeclaration(pe)){var G=s.fullPropertyName,Ie=G.charAt(0);if(Ie==="-"){if(G.charAt(1)!=="-"){!this.cssDataManager.isKnownProperty(G)&&!this.validProperties[G]&&this.addEntry(pe.getProperty(),V.UnknownVendorSpecificProperty);var fe=pe.getNonPrefixedPropertyName();me.add(fe,G,pe.getProperty())}}else{var C=G;(Ie==="*"||Ie==="_")&&(this.addEntry(pe.getProperty(),V.IEStarHack),G=G.substr(1)),!this.cssDataManager.isKnownProperty(C)&&!this.cssDataManager.isKnownProperty(G)&&(this.validProperties[G]||this.addEntry(pe.getProperty(),V.UnknownProperty,Ue("property.unknownproperty.detailed","Unknown property: '{0}'",pe.getFullPropertyName()))),me.add(G,G,null)}}else ve=!0}if(!ve)for(var b in me.data){var k=me.data[b],_=k.names,N=this.cssDataManager.isStandardProperty(b)&&_.indexOf(b)===-1;if(!(!N&&_.length===1)){for(var O=[],P=0,B=n.prefixes.length;P<B;P++){var Ce=n.prefixes[P];this.cssDataManager.isStandardProperty(Ce+b)&&O.push(Ce+b)}var se=this.getMissingNames(O,_);if(se||N)for(var ge=0,Xe=k.nodes;ge<Xe.length;ge++){var Me=Xe[ge];if(N){var Bn=Ue("property.standard.missing","Also define the standard property '{0}' for compatibility",b);this.addEntry(Me,V.IncludeStandardPropertyWhenUsingVendorPrefix,Bn)}if(se){var Bn=Ue("property.vendorspecific.missing","Always include all vendor specific properties: Missing: {0}",se);this.addEntry(Me,V.AllVendorPrefixes,Bn)}}}}}return!0},n.prototype.visitPrio=function(e){return this.addEntry(e,V.AvoidImportant),!0},n.prototype.visitNumericValue=function(e){var t=e.findParent(u.Function);if(t&&t.getName()==="calc")return!0;var r=e.findParent(u.Declaration);if(r){var i=r.getValue();if(i){var o=e.getValue();if(!o.unit||Cn.length.indexOf(o.unit.toLowerCase())===-1)return!0;parseFloat(o.value)===0&&o.unit&&!this.validProperties[r.getFullPropertyName()]&&this.addEntry(e,V.ZeroWithUnit)}}return!0},n.prototype.visitFontFace=function(e){var t=e.getDeclarations();if(!t)return!1;for(var r=!1,i=!1,o=!1,s=0,a=t.getChildren();s<a.length;s++){var l=a[s];if(this.isCSSDeclaration(l)){var c=l.getProperty().getName().toLowerCase();c==="src"&&(r=!0),c==="font-family"&&(i=!0)}else o=!0}return!o&&(!r||!i)&&this.addEntry(e,V.RequiredPropertiesForFontFace),!0},n.prototype.isCSSDeclaration=function(e){if(e instanceof ae){if(!e.getValue())return!1;var t=e.getProperty();if(!t)return!1;var r=t.getIdentifier();return!(!r||r.containsInterpolation())}return!1},n.prototype.visitHexColorValue=function(e){var t=e.length;return t!==9&&t!==7&&t!==5&&t!==4&&this.addEntry(e,V.HexColorLength),!1},n.prototype.visitFunction=function(e){var t=e.getName().toLowerCase(),r=-1,i=0;switch(t){case"rgb(":case"hsl(":r=3;break;case"rgba(":case"hsla(":r=4;break}return r!==-1&&(e.getArguments().accept(function(o){return o instanceof ht?(i+=1,!1):!0}),i!==r&&this.addEntry(e,V.ArgsInColorFunction)),!0},n.prefixes=["-ms-","-moz-","-o-","-webkit-"],n}();var Pn=function(){function n(e){this.cssDataManager=e}return n.prototype.configure=function(e){this.settings=e},n.prototype.doValidation=function(e,t,r){if(r===void 0&&(r=this.settings),r&&r.validate===!1)return[];var i=[];i.push.apply(i,Ni.entries(t)),i.push.apply(i,Vo.entries(t,e,new Wo(r&&r.lint),this.cssDataManager));var o=[];for(var s in V)o.push(V[s].id);function a(l){var c=W.create(e.positionAt(l.getOffset()),e.positionAt(l.getOffset()+l.getLength())),h=e.languageId;return{code:l.getRule().id,source:h,message:l.getMessage(),severity:l.getLevel()===ne.Warning?mt.Warning:mt.Error,range:c}}return i.filter(function(l){return l.getLevel()!==ne.Ignore}).map(a)},n}();var Ca=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}}(),Bo=47,_a=10,Fa=13,Ea=12,Da=36,za=35,Ra=123,Zt=61,Ia=33,Ma=60,Ta=62,Pr=46;var je=d.CustomToken,An=je++,xt=je++,vc=je++,Ar=je++,Nr=je++,Or=je++,Wr=je++,en=je++,yc=je++,Nn=function(n){Ca(e,n);function e(){return n!==null&&n.apply(this,arguments)||this}return e.prototype.scanNext=function(t){if(this.stream.advanceIfChar(Da)){var r=["$"];if(this.ident(r))return this.finishToken(t,An,r.join(""));this.stream.goBackTo(t)}return this.stream.advanceIfChars([za,Ra])?this.finishToken(t,xt):this.stream.advanceIfChars([Zt,Zt])?this.finishToken(t,Ar):this.stream.advanceIfChars([Ia,Zt])?this.finishToken(t,Nr):this.stream.advanceIfChar(Ma)?this.stream.advanceIfChar(Zt)?this.finishToken(t,Wr):this.finishToken(t,d.Delim):this.stream.advanceIfChar(Ta)?this.stream.advanceIfChar(Zt)?this.finishToken(t,Or):this.finishToken(t,d.Delim):this.stream.advanceIfChars([Pr,Pr,Pr])?this.finishToken(t,en):n.prototype.scanNext.call(this,t)},e.prototype.comment=function(){return n.prototype.comment.call(this)?!0:!this.inURL&&this.stream.advanceIfChars([Bo,Bo])?(this.stream.advanceWhileChar(function(t){switch(t){case _a:case Fa:case Ea:return!1;default:return!0}}),!0):!1},e}(Fe);var Lr=H(),Ur=function(){function n(e,t){this.id=e,this.message=t}return n}();var On={FromExpected:new Ur("scss-fromexpected",Lr("expected.from","'from' expected")),ThroughOrToExpected:new Ur("scss-throughexpected",Lr("expected.through","'through' or 'to' expected")),InExpected:new Ur("scss-fromexpected",Lr("expected.in","'in' expected"))};var Aa=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}}(),$o=function(n){Aa(e,n);function e(){return n.call(this,new Nn)||this}return e.prototype._parseStylesheetStatement=function(t){return t===void 0&&(t=!1),this.peek(d.AtKeyword)?this._parseWarnAndDebug()||this._parseControlStatement()||this._parseMixinDeclaration()||this._parseMixinContent()||this._parseMixinReference()||this._parseFunctionDeclaration()||this._parseForward()||this._parseUse()||this._parseRuleset(t)||n.prototype._parseStylesheetAtStatement.call(this,t):this._parseRuleset(!0)||this._parseVariableDeclaration()},e.prototype._parseImport=function(){if(!this.peekKeyword("@import"))return null;var t=this.create(dt);if(this.consumeToken(),!t.addChild(this._parseURILiteral())&&!t.addChild(this._parseStringLiteral()))return this.finish(t,f.URIOrStringExpected);for(;this.accept(d.Comma);)if(!t.addChild(this._parseURILiteral())&&!t.addChild(this._parseStringLiteral()))return this.finish(t,f.URIOrStringExpected);return!this.peek(d.SemiColon)&&!this.peek(d.EOF)&&t.setMedialist(this._parseMediaQueryList()),this.finish(t)},e.prototype._parseVariableDeclaration=function(t){if(t===void 0&&(t=[]),!this.peek(An))return null;var r=this.create($e);if(!r.setVariable(this._parseVariable()))return null;if(!this.accept(d.Colon))return this.finish(r,f.ColonExpected);if(this.prevToken&&(r.colonPosition=this.prevToken.offset),!r.setValue(this._parseExpr()))return this.finish(r,f.VariableValueExpected,[],t);for(;this.peek(d.Exclamation);)if(!r.addChild(this._tryParsePrio())){if(this.consumeToken(),!this.peekRegExp(d.Ident,/^(default|global)$/))return this.finish(r,f.UnknownKeyword);this.consumeToken()}return this.peek(d.SemiColon)&&(r.semicolonPosition=this.token.offset),this.finish(r)},e.prototype._parseMediaCondition=function(){return this._parseInterpolation()||n.prototype._parseMediaCondition.call(this)},e.prototype._parseMediaFeatureName=function(){return this._parseModuleMember()||this._parseFunction()||this._parseIdent()||this._parseVariable()},e.prototype._parseKeyframeSelector=function(){return this._tryParseKeyframeSelector()||this._parseControlStatement(this._parseKeyframeSelector.bind(this))||this._parseVariableDeclaration()||this._parseMixinContent()},e.prototype._parseVariable=function(){if(!this.peek(An))return null;var t=this.create(pt);return this.consumeToken(),t},e.prototype._parseModuleMember=function(){var t=this.mark(),r=this.create(Zn);return r.setIdentifier(this._parseIdent([A.Module]))?this.hasWhitespace()||!this.acceptDelim(".")||this.hasWhitespace()?(this.restoreAtMark(t),null):r.addChild(this._parseVariable()||this._parseFunction())?r:this.finish(r,f.IdentifierOrVariableExpected):null},e.prototype._parseIdent=function(t){var r=this;if(!this.peek(d.Ident)&&!this.peek(xt)&&!this.peekDelim("-"))return null;var i=this.create(te);i.referenceTypes=t,i.isCustomProperty=this.peekRegExp(d.Ident,/^--/);for(var o=!1,s=function(){var a=r.mark();return r.acceptDelim("-")&&(r.hasWhitespace()||r.acceptDelim("-"),r.hasWhitespace())?(r.restoreAtMark(a),null):r._parseInterpolation()};(this.accept(d.Ident)||i.addChild(s())||o&&this.acceptRegexp(/^[\w-]/))&&(o=!0,!this.hasWhitespace()););return o?this.finish(i):null},e.prototype._parseTermExpression=function(){return this._parseModuleMember()||this._parseVariable()||this._parseSelectorCombinator()||n.prototype._parseTermExpression.call(this)},e.prototype._parseInterpolation=function(){if(this.peek(xt)){var t=this.create(Rt);return this.consumeToken(),!t.addChild(this._parseExpr())&&!this._parseSelectorCombinator()?this.accept(d.CurlyR)?this.finish(t):this.finish(t,f.ExpressionExpected):this.accept(d.CurlyR)?this.finish(t):this.finish(t,f.RightCurlyExpected)}return null},e.prototype._parseOperator=function(){if(this.peek(Ar)||this.peek(Nr)||this.peek(Or)||this.peek(Wr)||this.peekDelim(">")||this.peekDelim("<")||this.peekIdent("and")||this.peekIdent("or")||this.peekDelim("%")){var t=this.createNode(u.Operator);return this.consumeToken(),this.finish(t)}return n.prototype._parseOperator.call(this)},e.prototype._parseUnaryOperator=function(){if(this.peekIdent("not")){var t=this.create(F);return this.consumeToken(),this.finish(t)}return n.prototype._parseUnaryOperator.call(this)},e.prototype._parseRuleSetDeclaration=function(){return this.peek(d.AtKeyword)?this._parseKeyframe()||this._parseImport()||this._parseMedia(!0)||this._parseFontFace()||this._parseWarnAndDebug()||this._parseControlStatement()||this._parseFunctionDeclaration()||this._parseExtends()||this._parseMixinReference()||this._parseMixinContent()||this._parseMixinDeclaration()||this._parseRuleset(!0)||this._parseSupports(!0)||n.prototype._parseRuleSetDeclarationAtStatement.call(this):this._parseVariableDeclaration()||this._tryParseRuleset(!0)||n.prototype._parseRuleSetDeclaration.call(this)},e.prototype._parseDeclaration=function(t){var r=this._tryParseCustomPropertyDeclaration(t);if(r)return r;var i=this.create(ae);if(!i.setProperty(this._parseProperty()))return null;if(!this.accept(d.Colon))return this.finish(i,f.ColonExpected,[d.Colon],t||[d.SemiColon]);this.prevToken&&(i.colonPosition=this.prevToken.offset);var o=!1;if(i.setValue(this._parseExpr())&&(o=!0,i.addChild(this._parsePrio())),this.peek(d.CurlyL))i.setNestedProperties(this._parseNestedProperties());else if(!o)return this.finish(i,f.PropertyValueExpected);return this.peek(d.SemiColon)&&(i.semicolonPosition=this.token.offset),this.finish(i)},e.prototype._parseNestedProperties=function(){var t=this.create(Yn);return this._parseBody(t,this._parseDeclaration.bind(this))},e.prototype._parseExtends=function(){if(this.peekKeyword("@extend")){var t=this.create(qe);if(this.consumeToken(),!t.getSelectors().addChild(this._parseSimpleSelector()))return this.finish(t,f.SelectorExpected);for(;this.accept(d.Comma);)t.getSelectors().addChild(this._parseSimpleSelector());return this.accept(d.Exclamation)&&!this.acceptIdent("optional")?this.finish(t,f.UnknownKeyword):this.finish(t)}return null},e.prototype._parseSimpleSelectorBody=function(){return this._parseSelectorCombinator()||this._parseSelectorPlaceholder()||n.prototype._parseSimpleSelectorBody.call(this)},e.prototype._parseSelectorCombinator=function(){if(this.peekDelim("&")){var t=this.createNode(u.SelectorCombinator);for(this.consumeToken();!this.hasWhitespace()&&(this.acceptDelim("-")||this.accept(d.Num)||this.accept(d.Dimension)||t.addChild(this._parseIdent())||this.acceptDelim("&")););return this.finish(t)}return null},e.prototype._parseSelectorPlaceholder=function(){if(this.peekDelim("%")){var t=this.createNode(u.SelectorPlaceholder);return this.consumeToken(),this._parseIdent(),this.finish(t)}else if(this.peekKeyword("@at-root")){var t=this.createNode(u.SelectorPlaceholder);return this.consumeToken(),this.finish(t)}return null},e.prototype._parseElementName=function(){var t=this.mark(),r=n.prototype._parseElementName.call(this);return r&&!this.hasWhitespace()&&this.peek(d.ParenthesisL)?(this.restoreAtMark(t),null):r},e.prototype._tryParsePseudoIdentifier=function(){return this._parseInterpolation()||n.prototype._tryParsePseudoIdentifier.call(this)},e.prototype._parseWarnAndDebug=function(){if(!this.peekKeyword("@debug")&&!this.peekKeyword("@warn")&&!this.peekKeyword("@error"))return null;var t=this.createNode(u.Debug);return this.consumeToken(),t.addChild(this._parseExpr()),this.finish(t)},e.prototype._parseControlStatement=function(t){return t===void 0&&(t=this._parseRuleSetDeclaration.bind(this)),this.peek(d.AtKeyword)?this._parseIfStatement(t)||this._parseForStatement(t)||this._parseEachStatement(t)||this._parseWhileStatement(t):null},e.prototype._parseIfStatement=function(t){return this.peekKeyword("@if")?this._internalParseIfStatement(t):null},e.prototype._internalParseIfStatement=function(t){var r=this.create(pi);if(this.consumeToken(),!r.setExpression(this._parseExpr(!0)))return this.finish(r,f.ExpressionExpected);if(this._parseBody(r,t),this.acceptKeyword("@else")){if(this.peekIdent("if"))r.setElseClause(this._internalParseIfStatement(t));else if(this.peek(d.CurlyL)){var i=this.create(gi);this._parseBody(i,t),r.setElseClause(i)}}return this.finish(r)},e.prototype._parseForStatement=function(t){if(!this.peekKeyword("@for"))return null;var r=this.create(ui);return this.consumeToken(),r.setVariable(this._parseVariable())?this.acceptIdent("from")?r.addChild(this._parseBinaryExpr())?!this.acceptIdent("to")&&!this.acceptIdent("through")?this.finish(r,On.ThroughOrToExpected,[d.CurlyR]):r.addChild(this._parseBinaryExpr())?this._parseBody(r,t):this.finish(r,f.ExpressionExpected,[d.CurlyR]):this.finish(r,f.ExpressionExpected,[d.CurlyR]):this.finish(r,On.FromExpected,[d.CurlyR]):this.finish(r,f.VariableNameExpected,[d.CurlyR])},e.prototype._parseEachStatement=function(t){if(!this.peekKeyword("@each"))return null;var r=this.create(mi);this.consumeToken();var i=r.getVariables();if(!i.addChild(this._parseVariable()))return this.finish(r,f.VariableNameExpected,[d.CurlyR]);for(;this.accept(d.Comma);)if(!i.addChild(this._parseVariable()))return this.finish(r,f.VariableNameExpected,[d.CurlyR]);return this.finish(i),this.acceptIdent("in")?r.addChild(this._parseExpr())?this._parseBody(r,t):this.finish(r,f.ExpressionExpected,[d.CurlyR]):this.finish(r,On.InExpected,[d.CurlyR])},e.prototype._parseWhileStatement=function(t){if(!this.peekKeyword("@while"))return null;var r=this.create(fi);return this.consumeToken(),r.addChild(this._parseBinaryExpr())?this._parseBody(r,t):this.finish(r,f.ExpressionExpected,[d.CurlyR])},e.prototype._parseFunctionBodyDeclaration=function(){return this._parseVariableDeclaration()||this._parseReturnStatement()||this._parseWarnAndDebug()||this._parseControlStatement(this._parseFunctionBodyDeclaration.bind(this))},e.prototype._parseFunctionDeclaration=function(){if(!this.peekKeyword("@function"))return null;var t=this.create(Qe);if(this.consumeToken(),!t.setIdentifier(this._parseIdent([A.Function])))return this.finish(t,f.IdentifierExpected,[d.CurlyR]);if(!this.accept(d.ParenthesisL))return this.finish(t,f.LeftParenthesisExpected,[d.CurlyR]);if(t.getParameters().addChild(this._parseParameterDeclaration())){for(;this.accept(d.Comma)&&!this.peek(d.ParenthesisR);)if(!t.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(t,f.VariableNameExpected)}return this.accept(d.ParenthesisR)?this._parseBody(t,this._parseFunctionBodyDeclaration.bind(this)):this.finish(t,f.RightParenthesisExpected,[d.CurlyR])},e.prototype._parseReturnStatement=function(){if(!this.peekKeyword("@return"))return null;var t=this.createNode(u.ReturnStatement);return this.consumeToken(),t.addChild(this._parseExpr())?this.finish(t):this.finish(t,f.ExpressionExpected)},e.prototype._parseMixinDeclaration=function(){if(!this.peekKeyword("@mixin"))return null;var t=this.create(Ae);if(this.consumeToken(),!t.setIdentifier(this._parseIdent([A.Mixin])))return this.finish(t,f.IdentifierExpected,[d.CurlyR]);if(this.accept(d.ParenthesisL)){if(t.getParameters().addChild(this._parseParameterDeclaration())){for(;this.accept(d.Comma)&&!this.peek(d.ParenthesisR);)if(!t.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(t,f.VariableNameExpected)}if(!this.accept(d.ParenthesisR))return this.finish(t,f.RightParenthesisExpected,[d.CurlyR])}return this._parseBody(t,this._parseRuleSetDeclaration.bind(this))},e.prototype._parseParameterDeclaration=function(){var t=this.create(Be);return t.setIdentifier(this._parseVariable())?(this.accept(en),this.accept(d.Colon)&&!t.setDefaultValue(this._parseExpr(!0))?this.finish(t,f.VariableValueExpected,[],[d.Comma,d.ParenthesisR]):this.finish(t)):null},e.prototype._parseMixinContent=function(){if(!this.peekKeyword("@content"))return null;var t=this.create(Ii);if(this.consumeToken(),this.accept(d.ParenthesisL)){if(t.getArguments().addChild(this._parseFunctionArgument())){for(;this.accept(d.Comma)&&!this.peek(d.ParenthesisR);)if(!t.getArguments().addChild(this._parseFunctionArgument()))return this.finish(t,f.ExpressionExpected)}if(!this.accept(d.ParenthesisR))return this.finish(t,f.RightParenthesisExpected)}return this.finish(t)},e.prototype._parseMixinReference=function(){if(!this.peekKeyword("@include"))return null;var t=this.create(et);this.consumeToken();var r=this._parseIdent([A.Mixin]);if(!t.setIdentifier(r))return this.finish(t,f.IdentifierExpected,[d.CurlyR]);if(!this.hasWhitespace()&&this.acceptDelim(".")&&!this.hasWhitespace()){var i=this._parseIdent([A.Mixin]);if(!i)return this.finish(t,f.IdentifierExpected,[d.CurlyR]);var o=this.create(Zn);r.referenceTypes=[A.Module],o.setIdentifier(r),t.setIdentifier(i),t.addChild(o)}if(this.accept(d.ParenthesisL)){if(t.getArguments().addChild(this._parseFunctionArgument())){for(;this.accept(d.Comma)&&!this.peek(d.ParenthesisR);)if(!t.getArguments().addChild(this._parseFunctionArgument()))return this.finish(t,f.ExpressionExpected)}if(!this.accept(d.ParenthesisR))return this.finish(t,f.RightParenthesisExpected)}return(this.peekIdent("using")||this.peek(d.CurlyL))&&t.setContent(this._parseMixinContentDeclaration()),this.finish(t)},e.prototype._parseMixinContentDeclaration=function(){var t=this.create(Mi);if(this.acceptIdent("using")){if(!this.accept(d.ParenthesisL))return this.finish(t,f.LeftParenthesisExpected,[d.CurlyL]);if(t.getParameters().addChild(this._parseParameterDeclaration())){for(;this.accept(d.Comma)&&!this.peek(d.ParenthesisR);)if(!t.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(t,f.VariableNameExpected)}if(!this.accept(d.ParenthesisR))return this.finish(t,f.RightParenthesisExpected,[d.CurlyL])}return this.peek(d.CurlyL)&&this._parseBody(t,this._parseMixinReferenceBodyStatement.bind(this)),this.finish(t)},e.prototype._parseMixinReferenceBodyStatement=function(){return this._tryParseKeyframeSelector()||this._parseRuleSetDeclaration()},e.prototype._parseFunctionArgument=function(){var t=this.create(we),r=this.mark(),i=this._parseVariable();if(i)if(this.accept(d.Colon))t.setIdentifier(i);else{if(this.accept(en))return t.setValue(i),this.finish(t);this.restoreAtMark(r)}return t.setValue(this._parseExpr(!0))?(this.accept(en),t.addChild(this._parsePrio()),this.finish(t)):t.setValue(this._tryParsePrio())?this.finish(t):null},e.prototype._parseURLArgument=function(){var t=this.mark(),r=n.prototype._parseURLArgument.call(this);if(!r||!this.peek(d.ParenthesisR)){this.restoreAtMark(t);var i=this.create(F);return i.addChild(this._parseBinaryExpr()),this.finish(i)}return r},e.prototype._parseOperation=function(){if(!this.peek(d.ParenthesisL))return null;var t=this.create(F);for(this.consumeToken();t.addChild(this._parseListElement());)this.accept(d.Comma);return this.accept(d.ParenthesisR)?this.finish(t):this.finish(t,f.RightParenthesisExpected)},e.prototype._parseListElement=function(){var t=this.create(Ti),r=this._parseBinaryExpr();if(!r)return null;if(this.accept(d.Colon)){if(t.setKey(r),!t.setValue(this._parseBinaryExpr()))return this.finish(t,f.ExpressionExpected)}else t.setValue(r);return this.finish(t)},e.prototype._parseUse=function(){if(!this.peekKeyword("@use"))return null;var t=this.create(vi);if(this.consumeToken(),!t.addChild(this._parseStringLiteral()))return this.finish(t,f.StringLiteralExpected);if(!this.peek(d.SemiColon)&&!this.peek(d.EOF)){if(!this.peekRegExp(d.Ident,/as|with/))return this.finish(t,f.UnknownKeyword);if(this.acceptIdent("as")&&!t.setIdentifier(this._parseIdent([A.Module]))&&!this.acceptDelim("*"))return this.finish(t,f.IdentifierOrWildcardExpected);if(this.acceptIdent("with")){if(!this.accept(d.ParenthesisL))return this.finish(t,f.LeftParenthesisExpected,[d.ParenthesisR]);if(!t.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(t,f.VariableNameExpected);for(;this.accept(d.Comma)&&!this.peek(d.ParenthesisR);)if(!t.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(t,f.VariableNameExpected);if(!this.accept(d.ParenthesisR))return this.finish(t,f.RightParenthesisExpected)}}return!this.accept(d.SemiColon)&&!this.accept(d.EOF)?this.finish(t,f.SemiColonExpected):this.finish(t)},e.prototype._parseModuleConfigDeclaration=function(){var t=this.create(yi);return t.setIdentifier(this._parseVariable())?!this.accept(d.Colon)||!t.setValue(this._parseExpr(!0))?this.finish(t,f.VariableValueExpected,[],[d.Comma,d.ParenthesisR]):this.accept(d.Exclamation)&&(this.hasWhitespace()||!this.acceptIdent("default"))?this.finish(t,f.UnknownKeyword):this.finish(t):null},e.prototype._parseForward=function(){if(!this.peekKeyword("@forward"))return null;var t=this.create(wi);if(this.consumeToken(),!t.addChild(this._parseStringLiteral()))return this.finish(t,f.StringLiteralExpected);if(this.acceptIdent("with")){if(!this.accept(d.ParenthesisL))return this.finish(t,f.LeftParenthesisExpected,[d.ParenthesisR]);if(!t.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(t,f.VariableNameExpected);for(;this.accept(d.Comma)&&!this.peek(d.ParenthesisR);)if(!t.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(t,f.VariableNameExpected);if(!this.accept(d.ParenthesisR))return this.finish(t,f.RightParenthesisExpected)}if(!this.peek(d.SemiColon)&&!this.peek(d.EOF)){if(!this.peekRegExp(d.Ident,/as|hide|show/))return this.finish(t,f.UnknownKeyword);if(this.acceptIdent("as")){var r=this._parseIdent([A.Forward]);if(!t.setIdentifier(r))return this.finish(t,f.IdentifierExpected);if(this.hasWhitespace()||!this.acceptDelim("*"))return this.finish(t,f.WildcardExpected)}if((this.peekIdent("hide")||this.peekIdent("show"))&&!t.addChild(this._parseForwardVisibility()))return this.finish(t,f.IdentifierOrVariableExpected)}return!this.accept(d.SemiColon)&&!this.accept(d.EOF)?this.finish(t,f.SemiColonExpected):this.finish(t)},e.prototype._parseForwardVisibility=function(){var t=this.create(xi);for(t.setIdentifier(this._parseIdent());t.addChild(this._parseVariable()||this._parseIdent());)this.accept(d.Comma);return t.getChildren().length>1?t:null},e.prototype._parseSupportsCondition=function(){return this._parseInterpolation()||n.prototype._parseSupportsCondition.call(this)},e}(gt);var Na=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}}(),S=H(),Ko=function(n){Na(e,n);function e(t,r){var i=n.call(this,"$",t,r)||this;return qo(e.scssModuleLoaders),qo(e.scssModuleBuiltIns),i}return e.prototype.isImportPathParent=function(t){return t===u.Forward||t===u.Use||n.prototype.isImportPathParent.call(this,t)},e.prototype.getCompletionForImportPath=function(t,r){var i=t.getParent().type;if(i===u.Forward||i===u.Use)for(var o=0,s=e.scssModuleBuiltIns;o<s.length;o++){var a=s[o],l={label:a.label,documentation:a.documentation,textEdit:T.replace(this.getCompletionRange(t),"'".concat(a.label,"'")),kind:R.Module};r.items.push(l)}return n.prototype.getCompletionForImportPath.call(this,t,r)},e.prototype.createReplaceFunction=function(){var t=1;return function(r,i){return"\\"+i+": ${"+t+++":"+(e.variableDefaults[i]||"")+"}"}},e.prototype.createFunctionProposals=function(t,r,i,o){for(var s=0,a=t;s<a.length;s++){var l=a[s],c=l.func.replace(/\[?(\$\w+)\]?/g,this.createReplaceFunction()),h=l.func.substr(0,l.func.indexOf("(")),p={label:h,detail:l.func,documentation:l.desc,textEdit:T.replace(this.getCompletionRange(r),c),insertTextFormat:re.Snippet,kind:R.Function};i&&(p.sortText="z"),o.items.push(p)}return o},e.prototype.getCompletionsForSelector=function(t,r,i){return this.createFunctionProposals(e.selectorFuncs,null,!0,i),n.prototype.getCompletionsForSelector.call(this,t,r,i)},e.prototype.getTermProposals=function(t,r,i){var o=e.builtInFuncs;return t&&(o=o.filter(function(s){return!s.type||!t.restrictions||t.restrictions.indexOf(s.type)!==-1})),this.createFunctionProposals(o,r,!0,i),n.prototype.getTermProposals.call(this,t,r,i)},e.prototype.getColorProposals=function(t,r,i){return this.createFunctionProposals(e.colorProposals,r,!1,i),n.prototype.getColorProposals.call(this,t,r,i)},e.prototype.getCompletionsForDeclarationProperty=function(t,r){return this.getCompletionForAtDirectives(r),this.getCompletionsForSelector(null,!0,r),n.prototype.getCompletionsForDeclarationProperty.call(this,t,r)},e.prototype.getCompletionsForExtendsReference=function(t,r,i){for(var o=this.getSymbolContext().findSymbolsAtOffset(this.offset,A.Rule),s=0,a=o;s<a.length;s++){var l=a[s],c={label:l.name,textEdit:T.replace(this.getCompletionRange(r),l.name),kind:R.Function};i.items.push(c)}return i},e.prototype.getCompletionForAtDirectives=function(t){var r;return(r=t.items).push.apply(r,e.scssAtDirectives),t},e.prototype.getCompletionForTopLevel=function(t){return this.getCompletionForAtDirectives(t),this.getCompletionForModuleLoaders(t),n.prototype.getCompletionForTopLevel.call(this,t),t},e.prototype.getCompletionForModuleLoaders=function(t){var r;return(r=t.items).push.apply(r,e.scssModuleLoaders),t},e.variableDefaults={$red:"1",$green:"2",$blue:"3",$alpha:"1.0",$color:"#000000",$weight:"0.5",$hue:"0",$saturation:"0%",$lightness:"0%",$degrees:"0",$amount:"0",$string:'""',$substring:'"s"',$number:"0",$limit:"1"},e.colorProposals=[{func:"red($color)",desc:S("scss.builtin.red","Gets the red component of a color.")},{func:"green($color)",desc:S("scss.builtin.green","Gets the green component of a color.")},{func:"blue($color)",desc:S("scss.builtin.blue","Gets the blue component of a color.")},{func:"mix($color, $color, [$weight])",desc:S("scss.builtin.mix","Mixes two colors together.")},{func:"hue($color)",desc:S("scss.builtin.hue","Gets the hue component of a color.")},{func:"saturation($color)",desc:S("scss.builtin.saturation","Gets the saturation component of a color.")},{func:"lightness($color)",desc:S("scss.builtin.lightness","Gets the lightness component of a color.")},{func:"adjust-hue($color, $degrees)",desc:S("scss.builtin.adjust-hue","Changes the hue of a color.")},{func:"lighten($color, $amount)",desc:S("scss.builtin.lighten","Makes a color lighter.")},{func:"darken($color, $amount)",desc:S("scss.builtin.darken","Makes a color darker.")},{func:"saturate($color, $amount)",desc:S("scss.builtin.saturate","Makes a color more saturated.")},{func:"desaturate($color, $amount)",desc:S("scss.builtin.desaturate","Makes a color less saturated.")},{func:"grayscale($color)",desc:S("scss.builtin.grayscale","Converts a color to grayscale.")},{func:"complement($color)",desc:S("scss.builtin.complement","Returns the complement of a color.")},{func:"invert($color)",desc:S("scss.builtin.invert","Returns the inverse of a color.")},{func:"alpha($color)",desc:S("scss.builtin.alpha","Gets the opacity component of a color.")},{func:"opacity($color)",desc:"Gets the alpha component (opacity) of a color."},{func:"rgba($color, $alpha)",desc:S("scss.builtin.rgba","Changes the alpha component for a color.")},{func:"opacify($color, $amount)",desc:S("scss.builtin.opacify","Makes a color more opaque.")},{func:"fade-in($color, $amount)",desc:S("scss.builtin.fade-in","Makes a color more opaque.")},{func:"transparentize($color, $amount)",desc:S("scss.builtin.transparentize","Makes a color more transparent.")},{func:"fade-out($color, $amount)",desc:S("scss.builtin.fade-out","Makes a color more transparent.")},{func:"adjust-color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])",desc:S("scss.builtin.adjust-color","Increases or decreases one or more components of a color.")},{func:"scale-color($color, [$red], [$green], [$blue], [$saturation], [$lightness], [$alpha])",desc:S("scss.builtin.scale-color","Fluidly scales one or more properties of a color.")},{func:"change-color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])",desc:S("scss.builtin.change-color","Changes one or more properties of a color.")},{func:"ie-hex-str($color)",desc:S("scss.builtin.ie-hex-str","Converts a color into the format understood by IE filters.")}],e.selectorFuncs=[{func:"selector-nest($selectors\u2026)",desc:S("scss.builtin.selector-nest","Nests selector beneath one another like they would be nested in the stylesheet.")},{func:"selector-append($selectors\u2026)",desc:S("scss.builtin.selector-append","Appends selectors to one another without spaces in between.")},{func:"selector-extend($selector, $extendee, $extender)",desc:S("scss.builtin.selector-extend","Extends $extendee with $extender within $selector.")},{func:"selector-replace($selector, $original, $replacement)",desc:S("scss.builtin.selector-replace","Replaces $original with $replacement within $selector.")},{func:"selector-unify($selector1, $selector2)",desc:S("scss.builtin.selector-unify","Unifies two selectors to produce a selector that matches elements matched by both.")},{func:"is-superselector($super, $sub)",desc:S("scss.builtin.is-superselector","Returns whether $super matches all the elements $sub does, and possibly more.")},{func:"simple-selectors($selector)",desc:S("scss.builtin.simple-selectors","Returns the simple selectors that comprise a compound selector.")},{func:"selector-parse($selector)",desc:S("scss.builtin.selector-parse","Parses a selector into the format returned by &.")}],e.builtInFuncs=[{func:"unquote($string)",desc:S("scss.builtin.unquote","Removes quotes from a string.")},{func:"quote($string)",desc:S("scss.builtin.quote","Adds quotes to a string.")},{func:"str-length($string)",desc:S("scss.builtin.str-length","Returns the number of characters in a string.")},{func:"str-insert($string, $insert, $index)",desc:S("scss.builtin.str-insert","Inserts $insert into $string at $index.")},{func:"str-index($string, $substring)",desc:S("scss.builtin.str-index","Returns the index of the first occurance of $substring in $string.")},{func:"str-slice($string, $start-at, [$end-at])",desc:S("scss.builtin.str-slice","Extracts a substring from $string.")},{func:"to-upper-case($string)",desc:S("scss.builtin.to-upper-case","Converts a string to upper case.")},{func:"to-lower-case($string)",desc:S("scss.builtin.to-lower-case","Converts a string to lower case.")},{func:"percentage($number)",desc:S("scss.builtin.percentage","Converts a unitless number to a percentage."),type:"percentage"},{func:"round($number)",desc:S("scss.builtin.round","Rounds a number to the nearest whole number.")},{func:"ceil($number)",desc:S("scss.builtin.ceil","Rounds a number up to the next whole number.")},{func:"floor($number)",desc:S("scss.builtin.floor","Rounds a number down to the previous whole number.")},{func:"abs($number)",desc:S("scss.builtin.abs","Returns the absolute value of a number.")},{func:"min($numbers)",desc:S("scss.builtin.min","Finds the minimum of several numbers.")},{func:"max($numbers)",desc:S("scss.builtin.max","Finds the maximum of several numbers.")},{func:"random([$limit])",desc:S("scss.builtin.random","Returns a random number.")},{func:"length($list)",desc:S("scss.builtin.length","Returns the length of a list.")},{func:"nth($list, $n)",desc:S("scss.builtin.nth","Returns a specific item in a list.")},{func:"set-nth($list, $n, $value)",desc:S("scss.builtin.set-nth","Replaces the nth item in a list.")},{func:"join($list1, $list2, [$separator])",desc:S("scss.builtin.join","Joins together two lists into one.")},{func:"append($list1, $val, [$separator])",desc:S("scss.builtin.append","Appends a single value onto the end of a list.")},{func:"zip($lists)",desc:S("scss.builtin.zip","Combines several lists into a single multidimensional list.")},{func:"index($list, $value)",desc:S("scss.builtin.index","Returns the position of a value within a list.")},{func:"list-separator(#list)",desc:S("scss.builtin.list-separator","Returns the separator of a list.")},{func:"map-get($map, $key)",desc:S("scss.builtin.map-get","Returns the value in a map associated with a given key.")},{func:"map-merge($map1, $map2)",desc:S("scss.builtin.map-merge","Merges two maps together into a new map.")},{func:"map-remove($map, $keys)",desc:S("scss.builtin.map-remove","Returns a new map with keys removed.")},{func:"map-keys($map)",desc:S("scss.builtin.map-keys","Returns a list of all keys in a map.")},{func:"map-values($map)",desc:S("scss.builtin.map-values","Returns a list of all values in a map.")},{func:"map-has-key($map, $key)",desc:S("scss.builtin.map-has-key","Returns whether a map has a value associated with a given key.")},{func:"keywords($args)",desc:S("scss.builtin.keywords","Returns the keywords passed to a function that takes variable arguments.")},{func:"feature-exists($feature)",desc:S("scss.builtin.feature-exists","Returns whether a feature exists in the current Sass runtime.")},{func:"variable-exists($name)",desc:S("scss.builtin.variable-exists","Returns whether a variable with the given name exists in the current scope.")},{func:"global-variable-exists($name)",desc:S("scss.builtin.global-variable-exists","Returns whether a variable with the given name exists in the global scope.")},{func:"function-exists($name)",desc:S("scss.builtin.function-exists","Returns whether a function with the given name exists.")},{func:"mixin-exists($name)",desc:S("scss.builtin.mixin-exists","Returns whether a mixin with the given name exists.")},{func:"inspect($value)",desc:S("scss.builtin.inspect","Returns the string representation of a value as it would be represented in Sass.")},{func:"type-of($value)",desc:S("scss.builtin.type-of","Returns the type of a value.")},{func:"unit($number)",desc:S("scss.builtin.unit","Returns the unit(s) associated with a number.")},{func:"unitless($number)",desc:S("scss.builtin.unitless","Returns whether a number has units.")},{func:"comparable($number1, $number2)",desc:S("scss.builtin.comparable","Returns whether two numbers can be added, subtracted, or compared.")},{func:"call($name, $args\u2026)",desc:S("scss.builtin.call","Dynamically calls a Sass function.")}],e.scssAtDirectives=[{label:"@extend",documentation:S("scss.builtin.@extend","Inherits the styles of another selector."),kind:R.Keyword},{label:"@at-root",documentation:S("scss.builtin.@at-root","Causes one or more rules to be emitted at the root of the document."),kind:R.Keyword},{label:"@debug",documentation:S("scss.builtin.@debug","Prints the value of an expression to the standard error output stream. Useful for debugging complicated Sass files."),kind:R.Keyword},{label:"@warn",documentation:S("scss.builtin.@warn","Prints the value of an expression to the standard error output stream. Useful for libraries that need to warn users of deprecations or recovering from minor mixin usage mistakes. Warnings can be turned off with the `--quiet` command-line option or the `:quiet` Sass option."),kind:R.Keyword},{label:"@error",documentation:S("scss.builtin.@error","Throws the value of an expression as a fatal error with stack trace. Useful for validating arguments to mixins and functions."),kind:R.Keyword},{label:"@if",documentation:S("scss.builtin.@if","Includes the body if the expression does not evaluate to `false` or `null`."),insertText:`@if \${1:expr} {
+	$0
+}`,insertTextFormat:re.Snippet,kind:R.Keyword},{label:"@for",documentation:S("scss.builtin.@for","For loop that repeatedly outputs a set of styles for each `$var` in the `from/through` or `from/to` clause."),insertText:"@for \\$${1:var} from ${2:start} ${3|to,through|} ${4:end} {\n	$0\n}",insertTextFormat:re.Snippet,kind:R.Keyword},{label:"@each",documentation:S("scss.builtin.@each","Each loop that sets `$var` to each item in the list or map, then outputs the styles it contains using that value of `$var`."),insertText:"@each \\$${1:var} in ${2:list} {\n	$0\n}",insertTextFormat:re.Snippet,kind:R.Keyword},{label:"@while",documentation:S("scss.builtin.@while","While loop that takes an expression and repeatedly outputs the nested styles until the statement evaluates to `false`."),insertText:`@while \${1:condition} {
+	$0
+}`,insertTextFormat:re.Snippet,kind:R.Keyword},{label:"@mixin",documentation:S("scss.builtin.@mixin","Defines styles that can be re-used throughout the stylesheet with `@include`."),insertText:`@mixin \${1:name} {
+	$0
+}`,insertTextFormat:re.Snippet,kind:R.Keyword},{label:"@include",documentation:S("scss.builtin.@include","Includes the styles defined by another mixin into the current rule."),kind:R.Keyword},{label:"@function",documentation:S("scss.builtin.@function","Defines complex operations that can be re-used throughout stylesheets."),kind:R.Keyword}],e.scssModuleLoaders=[{label:"@use",documentation:S("scss.builtin.@use","Loads mixins, functions, and variables from other Sass stylesheets as 'modules', and combines CSS from multiple stylesheets together."),references:[{name:"Sass documentation",url:"https://sass-lang.com/documentation/at-rules/use"}],insertText:"@use $0;",insertTextFormat:re.Snippet,kind:R.Keyword},{label:"@forward",documentation:S("scss.builtin.@forward","Loads a Sass stylesheet and makes its mixins, functions, and variables available when this stylesheet is loaded with the @use rule."),references:[{name:"Sass documentation",url:"https://sass-lang.com/documentation/at-rules/forward"}],insertText:"@forward $0;",insertTextFormat:re.Snippet,kind:R.Keyword}],e.scssModuleBuiltIns=[{label:"sass:math",documentation:S("scss.builtin.sass:math","Provides functions that operate on numbers."),references:[{name:"Sass documentation",url:"https://sass-lang.com/documentation/modules/math"}]},{label:"sass:string",documentation:S("scss.builtin.sass:string","Makes it easy to combine, search, or split apart strings."),references:[{name:"Sass documentation",url:"https://sass-lang.com/documentation/modules/string"}]},{label:"sass:color",documentation:S("scss.builtin.sass:color","Generates new colors based on existing ones, making it easy to build color themes."),references:[{name:"Sass documentation",url:"https://sass-lang.com/documentation/modules/color"}]},{label:"sass:list",documentation:S("scss.builtin.sass:list","Lets you access and modify values in lists."),references:[{name:"Sass documentation",url:"https://sass-lang.com/documentation/modules/list"}]},{label:"sass:map",documentation:S("scss.builtin.sass:map","Makes it possible to look up the value associated with a key in a map, and much more."),references:[{name:"Sass documentation",url:"https://sass-lang.com/documentation/modules/map"}]},{label:"sass:selector",documentation:S("scss.builtin.sass:selector","Provides access to Sass\u2019s powerful selector engine."),references:[{name:"Sass documentation",url:"https://sass-lang.com/documentation/modules/selector"}]},{label:"sass:meta",documentation:S("scss.builtin.sass:meta","Exposes the details of Sass\u2019s inner workings."),references:[{name:"Sass documentation",url:"https://sass-lang.com/documentation/modules/meta"}]}],e}(vt);function qo(n){n.forEach(function(e){if(e.documentation&&e.references&&e.references.length>0){var t=typeof e.documentation=="string"?{kind:"markdown",value:e.documentation}:{kind:"markdown",value:e.documentation.value};t.value+=`
+
+`,t.value+=e.references.map(function(r){return"[".concat(r.name,"](").concat(r.url,")")}).join(" | "),e.documentation=t}})}var Oa=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}}(),Go=47,Wa=10,La=13,Ua=12,jr=96,Vr=46,ja=d.CustomToken,Wn=ja++,Ln=function(n){Oa(e,n);function e(){return n!==null&&n.apply(this,arguments)||this}return e.prototype.scanNext=function(t){var r=this.escapedJavaScript();return r!==null?this.finishToken(t,r):this.stream.advanceIfChars([Vr,Vr,Vr])?this.finishToken(t,Wn):n.prototype.scanNext.call(this,t)},e.prototype.comment=function(){return n.prototype.comment.call(this)?!0:!this.inURL&&this.stream.advanceIfChars([Go,Go])?(this.stream.advanceWhileChar(function(t){switch(t){case Wa:case La:case Ua:return!1;default:return!0}}),!0):!1},e.prototype.escapedJavaScript=function(){var t=this.stream.peekChar();return t===jr?(this.stream.advance(1),this.stream.advanceWhileChar(function(r){return r!==jr}),this.stream.advanceIfChar(jr)?d.EscapedJavaScript:d.BadEscapedJavaScript):null},e}(Fe);var Ba=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}}(),Ho=function(n){Ba(e,n);function e(){return n.call(this,new Ln)||this}return e.prototype._parseStylesheetStatement=function(t){return t===void 0&&(t=!1),this.peek(d.AtKeyword)?this._parseVariableDeclaration()||this._parsePlugin()||n.prototype._parseStylesheetAtStatement.call(this,t):this._tryParseMixinDeclaration()||this._tryParseMixinReference()||this._parseFunction()||this._parseRuleset(!0)},e.prototype._parseImport=function(){if(!this.peekKeyword("@import")&&!this.peekKeyword("@import-once"))return null;var t=this.create(dt);if(this.consumeToken(),this.accept(d.ParenthesisL)){if(!this.accept(d.Ident))return this.finish(t,f.IdentifierExpected,[d.SemiColon]);do if(!this.accept(d.Comma))break;while(this.accept(d.Ident));if(!this.accept(d.ParenthesisR))return this.finish(t,f.RightParenthesisExpected,[d.SemiColon])}return!t.addChild(this._parseURILiteral())&&!t.addChild(this._parseStringLiteral())?this.finish(t,f.URIOrStringExpected,[d.SemiColon]):(!this.peek(d.SemiColon)&&!this.peek(d.EOF)&&t.setMedialist(this._parseMediaQueryList()),this.finish(t))},e.prototype._parsePlugin=function(){if(!this.peekKeyword("@plugin"))return null;var t=this.createNode(u.Plugin);return this.consumeToken(),t.addChild(this._parseStringLiteral())?this.accept(d.SemiColon)?this.finish(t):this.finish(t,f.SemiColonExpected):this.finish(t,f.StringLiteralExpected)},e.prototype._parseMediaQuery=function(){var t=n.prototype._parseMediaQuery.call(this);if(!t){var r=this.create(hn);return r.addChild(this._parseVariable())?this.finish(r):null}return t},e.prototype._parseMediaDeclaration=function(t){return t===void 0&&(t=!1),this._tryParseRuleset(t)||this._tryToParseDeclaration()||this._tryParseMixinDeclaration()||this._tryParseMixinReference()||this._parseDetachedRuleSetMixin()||this._parseStylesheetStatement(t)},e.prototype._parseMediaFeatureName=function(){return this._parseIdent()||this._parseVariable()},e.prototype._parseVariableDeclaration=function(t){t===void 0&&(t=[]);var r=this.create($e),i=this.mark();if(!r.setVariable(this._parseVariable(!0)))return null;if(this.accept(d.Colon)){if(this.prevToken&&(r.colonPosition=this.prevToken.offset),r.setValue(this._parseDetachedRuleSet()))r.needsSemicolon=!1;else if(!r.setValue(this._parseExpr()))return this.finish(r,f.VariableValueExpected,[],t);r.addChild(this._parsePrio())}else return this.restoreAtMark(i),null;return this.peek(d.SemiColon)&&(r.semicolonPosition=this.token.offset),this.finish(r)},e.prototype._parseDetachedRuleSet=function(){var t=this.mark();if(this.peekDelim("#")||this.peekDelim("."))if(this.consumeToken(),!this.hasWhitespace()&&this.accept(d.ParenthesisL)){var r=this.create(Ae);if(r.getParameters().addChild(this._parseMixinParameter()))for(;(this.accept(d.Comma)||this.accept(d.SemiColon))&&!this.peek(d.ParenthesisR);)r.getParameters().addChild(this._parseMixinParameter())||this.markError(r,f.IdentifierExpected,[],[d.ParenthesisR]);if(!this.accept(d.ParenthesisR))return this.restoreAtMark(t),null}else return this.restoreAtMark(t),null;if(!this.peek(d.CurlyL))return null;var i=this.create(K);return this._parseBody(i,this._parseDetachedRuleSetBody.bind(this)),this.finish(i)},e.prototype._parseDetachedRuleSetBody=function(){return this._tryParseKeyframeSelector()||this._parseRuleSetDeclaration()},e.prototype._addLookupChildren=function(t){if(!t.addChild(this._parseLookupValue()))return!1;for(var r=!1;this.peek(d.BracketL)&&(r=!0),!!t.addChild(this._parseLookupValue());)r=!1;return!r},e.prototype._parseLookupValue=function(){var t=this.create(F),r=this.mark();return this.accept(d.BracketL)?(t.addChild(this._parseVariable(!1,!0))||t.addChild(this._parsePropertyIdentifier()))&&this.accept(d.BracketR)||this.accept(d.BracketR)?t:(this.restoreAtMark(r),null):(this.restoreAtMark(r),null)},e.prototype._parseVariable=function(t,r){t===void 0&&(t=!1),r===void 0&&(r=!1);var i=!t&&this.peekDelim("$");if(!this.peekDelim("@")&&!i&&!this.peek(d.AtKeyword))return null;for(var o=this.create(pt),s=this.mark();this.acceptDelim("@")||!t&&this.acceptDelim("$");)if(this.hasWhitespace())return this.restoreAtMark(s),null;return!this.accept(d.AtKeyword)&&!this.accept(d.Ident)?(this.restoreAtMark(s),null):!r&&this.peek(d.BracketL)&&!this._addLookupChildren(o)?(this.restoreAtMark(s),null):o},e.prototype._parseTermExpression=function(){return this._parseVariable()||this._parseEscaped()||n.prototype._parseTermExpression.call(this)||this._tryParseMixinReference(!1)},e.prototype._parseEscaped=function(){if(this.peek(d.EscapedJavaScript)||this.peek(d.BadEscapedJavaScript)){var t=this.createNode(u.EscapedValue);return this.consumeToken(),this.finish(t)}if(this.peekDelim("~")){var t=this.createNode(u.EscapedValue);return this.consumeToken(),this.accept(d.String)||this.accept(d.EscapedJavaScript)?this.finish(t):this.finish(t,f.TermExpected)}return null},e.prototype._parseOperator=function(){var t=this._parseGuardOperator();return t||n.prototype._parseOperator.call(this)},e.prototype._parseGuardOperator=function(){if(this.peekDelim(">")){var t=this.createNode(u.Operator);return this.consumeToken(),this.acceptDelim("="),t}else if(this.peekDelim("=")){var t=this.createNode(u.Operator);return this.consumeToken(),this.acceptDelim("<"),t}else if(this.peekDelim("<")){var t=this.createNode(u.Operator);return this.consumeToken(),this.acceptDelim("="),t}return null},e.prototype._parseRuleSetDeclaration=function(){return this.peek(d.AtKeyword)?this._parseKeyframe()||this._parseMedia(!0)||this._parseImport()||this._parseSupports(!0)||this._parseDetachedRuleSetMixin()||this._parseVariableDeclaration()||n.prototype._parseRuleSetDeclarationAtStatement.call(this):this._tryParseMixinDeclaration()||this._tryParseRuleset(!0)||this._tryParseMixinReference()||this._parseFunction()||this._parseExtend()||n.prototype._parseRuleSetDeclaration.call(this)},e.prototype._parseKeyframeIdent=function(){return this._parseIdent([A.Keyframe])||this._parseVariable()},e.prototype._parseKeyframeSelector=function(){return this._parseDetachedRuleSetMixin()||n.prototype._parseKeyframeSelector.call(this)},e.prototype._parseSimpleSelectorBody=function(){return this._parseSelectorCombinator()||n.prototype._parseSimpleSelectorBody.call(this)},e.prototype._parseSelector=function(t){var r=this.create(Ee),i=!1;for(t&&(i=r.addChild(this._parseCombinator()));r.addChild(this._parseSimpleSelector());){i=!0;var o=this.mark();if(r.addChild(this._parseGuard())&&this.peek(d.CurlyL))break;this.restoreAtMark(o),r.addChild(this._parseCombinator())}return i?this.finish(r):null},e.prototype._parseSelectorCombinator=function(){if(this.peekDelim("&")){var t=this.createNode(u.SelectorCombinator);for(this.consumeToken();!this.hasWhitespace()&&(this.acceptDelim("-")||this.accept(d.Num)||this.accept(d.Dimension)||t.addChild(this._parseIdent())||this.acceptDelim("&")););return this.finish(t)}return null},e.prototype._parseSelectorIdent=function(){if(!this.peekInterpolatedIdent())return null;var t=this.createNode(u.SelectorInterpolation),r=this._acceptInterpolatedIdent(t);return r?this.finish(t):null},e.prototype._parsePropertyIdentifier=function(t){t===void 0&&(t=!1);var r=/^[\w-]+/;if(!this.peekInterpolatedIdent()&&!this.peekRegExp(this.token.type,r))return null;var i=this.mark(),o=this.create(te);o.isCustomProperty=this.acceptDelim("-")&&this.acceptDelim("-");var s=!1;return t?o.isCustomProperty?s=o.addChild(this._parseIdent()):s=o.addChild(this._parseRegexp(r)):o.isCustomProperty?s=this._acceptInterpolatedIdent(o):s=this._acceptInterpolatedIdent(o,r),s?(!t&&!this.hasWhitespace()&&(this.acceptDelim("+"),this.hasWhitespace()||this.acceptIdent("_")),this.finish(o)):(this.restoreAtMark(i),null)},e.prototype.peekInterpolatedIdent=function(){return this.peek(d.Ident)||this.peekDelim("@")||this.peekDelim("$")||this.peekDelim("-")},e.prototype._acceptInterpolatedIdent=function(t,r){for(var i=this,o=!1,s=function(){var l=i.mark();return i.acceptDelim("-")&&(i.hasWhitespace()||i.acceptDelim("-"),i.hasWhitespace())?(i.restoreAtMark(l),null):i._parseInterpolation()},a=r?function(){return i.acceptRegexp(r)}:function(){return i.accept(d.Ident)};(a()||t.addChild(this._parseInterpolation()||this.try(s)))&&(o=!0,!this.hasWhitespace()););return o},e.prototype._parseInterpolation=function(){var t=this.mark();if(this.peekDelim("@")||this.peekDelim("$")){var r=this.createNode(u.Interpolation);return this.consumeToken(),this.hasWhitespace()||!this.accept(d.CurlyL)?(this.restoreAtMark(t),null):r.addChild(this._parseIdent())?this.accept(d.CurlyR)?this.finish(r):this.finish(r,f.RightCurlyExpected):this.finish(r,f.IdentifierExpected)}return null},e.prototype._tryParseMixinDeclaration=function(){var t=this.mark(),r=this.create(Ae);if(!r.setIdentifier(this._parseMixinDeclarationIdentifier())||!this.accept(d.ParenthesisL))return this.restoreAtMark(t),null;if(r.getParameters().addChild(this._parseMixinParameter()))for(;(this.accept(d.Comma)||this.accept(d.SemiColon))&&!this.peek(d.ParenthesisR);)r.getParameters().addChild(this._parseMixinParameter())||this.markError(r,f.IdentifierExpected,[],[d.ParenthesisR]);return this.accept(d.ParenthesisR)?(r.setGuard(this._parseGuard()),this.peek(d.CurlyL)?this._parseBody(r,this._parseMixInBodyDeclaration.bind(this)):(this.restoreAtMark(t),null)):(this.restoreAtMark(t),null)},e.prototype._parseMixInBodyDeclaration=function(){return this._parseFontFace()||this._parseRuleSetDeclaration()},e.prototype._parseMixinDeclarationIdentifier=function(){var t;if(this.peekDelim("#")||this.peekDelim(".")){if(t=this.create(te),this.consumeToken(),this.hasWhitespace()||!t.addChild(this._parseIdent()))return null}else if(this.peek(d.Hash))t=this.create(te),this.consumeToken();else return null;return t.referenceTypes=[A.Mixin],this.finish(t)},e.prototype._parsePseudo=function(){if(!this.peek(d.Colon))return null;var t=this.mark(),r=this.create(qe);return this.consumeToken(),this.acceptIdent("extend")?this._completeExtends(r):(this.restoreAtMark(t),n.prototype._parsePseudo.call(this))},e.prototype._parseExtend=function(){if(!this.peekDelim("&"))return null;var t=this.mark(),r=this.create(qe);return this.consumeToken(),this.hasWhitespace()||!this.accept(d.Colon)||!this.acceptIdent("extend")?(this.restoreAtMark(t),null):this._completeExtends(r)},e.prototype._completeExtends=function(t){if(!this.accept(d.ParenthesisL))return this.finish(t,f.LeftParenthesisExpected);var r=t.getSelectors();if(!r.addChild(this._parseSelector(!0)))return this.finish(t,f.SelectorExpected);for(;this.accept(d.Comma);)if(!r.addChild(this._parseSelector(!0)))return this.finish(t,f.SelectorExpected);return this.accept(d.ParenthesisR)?this.finish(t):this.finish(t,f.RightParenthesisExpected)},e.prototype._parseDetachedRuleSetMixin=function(){if(!this.peek(d.AtKeyword))return null;var t=this.mark(),r=this.create(et);return r.addChild(this._parseVariable(!0))&&(this.hasWhitespace()||!this.accept(d.ParenthesisL))?(this.restoreAtMark(t),null):this.accept(d.ParenthesisR)?this.finish(r):this.finish(r,f.RightParenthesisExpected)},e.prototype._tryParseMixinReference=function(t){t===void 0&&(t=!0);for(var r=this.mark(),i=this.create(et),o=this._parseMixinDeclarationIdentifier();o;){this.acceptDelim(">");var s=this._parseMixinDeclarationIdentifier();if(s)i.getNamespaces().addChild(o),o=s;else break}if(!i.setIdentifier(o))return this.restoreAtMark(r),null;var a=!1;if(this.accept(d.ParenthesisL)){if(a=!0,i.getArguments().addChild(this._parseMixinArgument())){for(;(this.accept(d.Comma)||this.accept(d.SemiColon))&&!this.peek(d.ParenthesisR);)if(!i.getArguments().addChild(this._parseMixinArgument()))return this.finish(i,f.ExpressionExpected)}if(!this.accept(d.ParenthesisR))return this.finish(i,f.RightParenthesisExpected);o.referenceTypes=[A.Mixin]}else o.referenceTypes=[A.Mixin,A.Rule];return this.peek(d.BracketL)?t||this._addLookupChildren(i):i.addChild(this._parsePrio()),!a&&!this.peek(d.SemiColon)&&!this.peek(d.CurlyR)&&!this.peek(d.EOF)?(this.restoreAtMark(r),null):this.finish(i)},e.prototype._parseMixinArgument=function(){var t=this.create(we),r=this.mark(),i=this._parseVariable();return i&&(this.accept(d.Colon)?t.setIdentifier(i):this.restoreAtMark(r)),t.setValue(this._parseDetachedRuleSet()||this._parseExpr(!0))?this.finish(t):(this.restoreAtMark(r),null)},e.prototype._parseMixinParameter=function(){var t=this.create(Be);if(this.peekKeyword("@rest")){var r=this.create(F);return this.consumeToken(),this.accept(Wn)?(t.setIdentifier(this.finish(r)),this.finish(t)):this.finish(t,f.DotExpected,[],[d.Comma,d.ParenthesisR])}if(this.peek(Wn)){var i=this.create(F);return this.consumeToken(),t.setIdentifier(this.finish(i)),this.finish(t)}var o=!1;return t.setIdentifier(this._parseVariable())&&(this.accept(d.Colon),o=!0),!t.setDefaultValue(this._parseDetachedRuleSet()||this._parseExpr(!0))&&!o?null:this.finish(t)},e.prototype._parseGuard=function(){if(!this.peekIdent("when"))return null;var t=this.create(Pi);if(this.consumeToken(),t.isNegated=this.acceptIdent("not"),!t.getConditions().addChild(this._parseGuardCondition()))return this.finish(t,f.ConditionExpected);for(;this.acceptIdent("and")||this.accept(d.Comma);)if(!t.getConditions().addChild(this._parseGuardCondition()))return this.finish(t,f.ConditionExpected);return this.finish(t)},e.prototype._parseGuardCondition=function(){if(!this.peek(d.ParenthesisL))return null;var t=this.create(Ai);return this.consumeToken(),t.addChild(this._parseExpr()),this.accept(d.ParenthesisR)?this.finish(t):this.finish(t,f.RightParenthesisExpected)},e.prototype._parseFunction=function(){var t=this.mark(),r=this.create(Pe);if(!r.setIdentifier(this._parseFunctionIdentifier()))return null;if(this.hasWhitespace()||!this.accept(d.ParenthesisL))return this.restoreAtMark(t),null;if(r.getArguments().addChild(this._parseMixinArgument())){for(;(this.accept(d.Comma)||this.accept(d.SemiColon))&&!this.peek(d.ParenthesisR);)if(!r.getArguments().addChild(this._parseMixinArgument()))return this.finish(r,f.ExpressionExpected)}return this.accept(d.ParenthesisR)?this.finish(r):this.finish(r,f.RightParenthesisExpected)},e.prototype._parseFunctionIdentifier=function(){if(this.peekDelim("%")){var t=this.create(te);return t.referenceTypes=[A.Function],this.consumeToken(),this.finish(t)}return n.prototype._parseFunctionIdentifier.call(this)},e.prototype._parseURLArgument=function(){var t=this.mark(),r=n.prototype._parseURLArgument.call(this);if(!r||!this.peek(d.ParenthesisR)){this.restoreAtMark(t);var i=this.create(F);return i.addChild(this._parseBinaryExpr()),this.finish(i)}return r},e}(gt);var $a=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}}(),I=H(),Jo=function(n){$a(e,n);function e(t,r){return n.call(this,"@",t,r)||this}return e.prototype.createFunctionProposals=function(t,r,i,o){for(var s=0,a=t;s<a.length;s++){var l=a[s],c={label:l.name,detail:l.example,documentation:l.description,textEdit:T.replace(this.getCompletionRange(r),l.name+"($0)"),insertTextFormat:re.Snippet,kind:R.Function};i&&(c.sortText="z"),o.items.push(c)}return o},e.prototype.getTermProposals=function(t,r,i){var o=e.builtInProposals;return t&&(o=o.filter(function(s){return!s.type||!t.restrictions||t.restrictions.indexOf(s.type)!==-1})),this.createFunctionProposals(o,r,!0,i),n.prototype.getTermProposals.call(this,t,r,i)},e.prototype.getColorProposals=function(t,r,i){return this.createFunctionProposals(e.colorProposals,r,!1,i),n.prototype.getColorProposals.call(this,t,r,i)},e.prototype.getCompletionsForDeclarationProperty=function(t,r){return this.getCompletionsForSelector(null,!0,r),n.prototype.getCompletionsForDeclarationProperty.call(this,t,r)},e.builtInProposals=[{name:"if",example:"if(condition, trueValue [, falseValue]);",description:I("less.builtin.if","returns one of two values depending on a condition.")},{name:"boolean",example:"boolean(condition);",description:I("less.builtin.boolean",'"store" a boolean test for later evaluation in a guard or if().')},{name:"length",example:"length(@list);",description:I("less.builtin.length","returns the number of elements in a value list")},{name:"extract",example:"extract(@list, index);",description:I("less.builtin.extract","returns a value at the specified position in the list")},{name:"range",example:"range([start, ] end [, step]);",description:I("less.builtin.range","generate a list spanning a range of values")},{name:"each",example:"each(@list, ruleset);",description:I("less.builtin.each","bind the evaluation of a ruleset to each member of a list.")},{name:"escape",example:"escape(@string);",description:I("less.builtin.escape","URL encodes a string")},{name:"e",example:"e(@string);",description:I("less.builtin.e","escape string content")},{name:"replace",example:"replace(@string, @pattern, @replacement[, @flags]);",description:I("less.builtin.replace","string replace")},{name:"unit",example:"unit(@dimension, [@unit: '']);",description:I("less.builtin.unit","remove or change the unit of a dimension")},{name:"color",example:"color(@string);",description:I("less.builtin.color","parses a string to a color"),type:"color"},{name:"convert",example:"convert(@value, unit);",description:I("less.builtin.convert","converts numbers from one type into another")},{name:"data-uri",example:"data-uri([mimetype,] url);",description:I("less.builtin.data-uri","inlines a resource and falls back to `url()`"),type:"url"},{name:"abs",description:I("less.builtin.abs","absolute value of a number"),example:"abs(number);"},{name:"acos",description:I("less.builtin.acos","arccosine - inverse of cosine function"),example:"acos(number);"},{name:"asin",description:I("less.builtin.asin","arcsine - inverse of sine function"),example:"asin(number);"},{name:"ceil",example:"ceil(@number);",description:I("less.builtin.ceil","rounds up to an integer")},{name:"cos",description:I("less.builtin.cos","cosine function"),example:"cos(number);"},{name:"floor",description:I("less.builtin.floor","rounds down to an integer"),example:"floor(@number);"},{name:"percentage",description:I("less.builtin.percentage","converts to a %, e.g. 0.5 > 50%"),example:"percentage(@number);",type:"percentage"},{name:"round",description:I("less.builtin.round","rounds a number to a number of places"),example:"round(number, [places: 0]);"},{name:"sqrt",description:I("less.builtin.sqrt","calculates square root of a number"),example:"sqrt(number);"},{name:"sin",description:I("less.builtin.sin","sine function"),example:"sin(number);"},{name:"tan",description:I("less.builtin.tan","tangent function"),example:"tan(number);"},{name:"atan",description:I("less.builtin.atan","arctangent - inverse of tangent function"),example:"atan(number);"},{name:"pi",description:I("less.builtin.pi","returns pi"),example:"pi();"},{name:"pow",description:I("less.builtin.pow","first argument raised to the power of the second argument"),example:"pow(@base, @exponent);"},{name:"mod",description:I("less.builtin.mod","first argument modulus second argument"),example:"mod(number, number);"},{name:"min",description:I("less.builtin.min","returns the lowest of one or more values"),example:"min(@x, @y);"},{name:"max",description:I("less.builtin.max","returns the lowest of one or more values"),example:"max(@x, @y);"}],e.colorProposals=[{name:"argb",example:"argb(@color);",description:I("less.builtin.argb","creates a #AARRGGBB")},{name:"hsl",example:"hsl(@hue, @saturation, @lightness);",description:I("less.builtin.hsl","creates a color")},{name:"hsla",example:"hsla(@hue, @saturation, @lightness, @alpha);",description:I("less.builtin.hsla","creates a color")},{name:"hsv",example:"hsv(@hue, @saturation, @value);",description:I("less.builtin.hsv","creates a color")},{name:"hsva",example:"hsva(@hue, @saturation, @value, @alpha);",description:I("less.builtin.hsva","creates a color")},{name:"hue",example:"hue(@color);",description:I("less.builtin.hue","returns the `hue` channel of `@color` in the HSL space")},{name:"saturation",example:"saturation(@color);",description:I("less.builtin.saturation","returns the `saturation` channel of `@color` in the HSL space")},{name:"lightness",example:"lightness(@color);",description:I("less.builtin.lightness","returns the `lightness` channel of `@color` in the HSL space")},{name:"hsvhue",example:"hsvhue(@color);",description:I("less.builtin.hsvhue","returns the `hue` channel of `@color` in the HSV space")},{name:"hsvsaturation",example:"hsvsaturation(@color);",description:I("less.builtin.hsvsaturation","returns the `saturation` channel of `@color` in the HSV space")},{name:"hsvvalue",example:"hsvvalue(@color);",description:I("less.builtin.hsvvalue","returns the `value` channel of `@color` in the HSV space")},{name:"red",example:"red(@color);",description:I("less.builtin.red","returns the `red` channel of `@color`")},{name:"green",example:"green(@color);",description:I("less.builtin.green","returns the `green` channel of `@color`")},{name:"blue",example:"blue(@color);",description:I("less.builtin.blue","returns the `blue` channel of `@color`")},{name:"alpha",example:"alpha(@color);",description:I("less.builtin.alpha","returns the `alpha` channel of `@color`")},{name:"luma",example:"luma(@color);",description:I("less.builtin.luma","returns the `luma` value (perceptual brightness) of `@color`")},{name:"saturate",example:"saturate(@color, 10%);",description:I("less.builtin.saturate","return `@color` 10% points more saturated")},{name:"desaturate",example:"desaturate(@color, 10%);",description:I("less.builtin.desaturate","return `@color` 10% points less saturated")},{name:"lighten",example:"lighten(@color, 10%);",description:I("less.builtin.lighten","return `@color` 10% points lighter")},{name:"darken",example:"darken(@color, 10%);",description:I("less.builtin.darken","return `@color` 10% points darker")},{name:"fadein",example:"fadein(@color, 10%);",description:I("less.builtin.fadein","return `@color` 10% points less transparent")},{name:"fadeout",example:"fadeout(@color, 10%);",description:I("less.builtin.fadeout","return `@color` 10% points more transparent")},{name:"fade",example:"fade(@color, 50%);",description:I("less.builtin.fade","return `@color` with 50% transparency")},{name:"spin",example:"spin(@color, 10);",description:I("less.builtin.spin","return `@color` with a 10 degree larger in hue")},{name:"mix",example:"mix(@color1, @color2, [@weight: 50%]);",description:I("less.builtin.mix","return a mix of `@color1` and `@color2`")},{name:"greyscale",example:"greyscale(@color);",description:I("less.builtin.greyscale","returns a grey, 100% desaturated color")},{name:"contrast",example:"contrast(@color1, [@darkcolor: black], [@lightcolor: white], [@threshold: 43%]);",description:I("less.builtin.contrast","return `@darkcolor` if `@color1 is> 43% luma` otherwise return `@lightcolor`, see notes")},{name:"multiply",example:"multiply(@color1, @color2);"},{name:"screen",example:"screen(@color1, @color2);"},{name:"overlay",example:"overlay(@color1, @color2);"},{name:"softlight",example:"softlight(@color1, @color2);"},{name:"hardlight",example:"hardlight(@color1, @color2);"},{name:"difference",example:"difference(@color1, @color2);"},{name:"exclusion",example:"exclusion(@color1, @color2);"},{name:"average",example:"average(@color1, @color2);"},{name:"negation",example:"negation(@color1, @color2);"}],e}(vt);function Yo(n,e){var t=qa(n);return Ka(t,e)}function qa(n){function e(p){return n.positionAt(p.offset).line}function t(p){return n.positionAt(p.offset+p.len).line}function r(){switch(n.languageId){case"scss":return new Nn;case"less":return new Ln;default:return new Fe}}function i(p,m){var g=e(p),w=t(p);return g!==w?{startLine:g,endLine:w,kind:m}:null}var o=[],s=[],a=r();a.ignoreComment=!1,a.setSource(n.getText());for(var l=a.scan(),c=null,h=function(){switch(l.type){case d.CurlyL:case xt:{s.push({line:e(l),type:"brace",isStart:!0});break}case d.CurlyR:{if(s.length!==0){var p=Xo(s,"brace");if(!p)break;var m=t(l);p.type==="brace"&&(c&&t(c)!==m&&m--,p.line!==m&&o.push({startLine:p.line,endLine:m,kind:void 0}))}break}case d.Comment:{var g=function(D){return D==="#region"?{line:e(l),type:"comment",isStart:!0}:{line:t(l),type:"comment",isStart:!1}},w=function(D){var M=D.text.match(/^\s*\/\*\s*(#region|#endregion)\b\s*(.*?)\s*\*\//);if(M)return g(M[1]);if(n.languageId==="scss"||n.languageId==="less"){var z=D.text.match(/^\s*\/\/\s*(#region|#endregion)\b\s*(.*?)\s*/);if(z)return g(z[1])}return null},x=w(l);if(x)if(x.isStart)s.push(x);else{var p=Xo(s,"comment");if(!p)break;p.type==="comment"&&p.line!==x.line&&o.push({startLine:p.line,endLine:x.line,kind:"region"})}else{var y=i(l,"comment");y&&o.push(y)}break}}c=l,l=a.scan()};l.type!==d.EOF;)h();return o}function Xo(n,e){if(n.length===0)return null;for(var t=n.length-1;t>=0;t--)if(n[t].type===e&&n[t].isStart)return n.splice(t,1)[0];return null}function Ka(n,e){var t=e&&e.rangeLimit||Number.MAX_VALUE,r=n.sort(function(s,a){var l=s.startLine-a.startLine;return l===0&&(l=s.endLine-a.endLine),l}),i=[],o=-1;return r.forEach(function(s){s.startLine<o&&o<s.endLine||(i.push(s),o=s.endLine)}),i.length<t?i:i.slice(0,t)}var Qo;(function(){"use strict";var n=[,,function(i){function o(l){this.__parent=l,this.__character_count=0,this.__indent_count=-1,this.__alignment_count=0,this.__wrap_point_index=0,this.__wrap_point_character_count=0,this.__wrap_point_indent_count=-1,this.__wrap_point_alignment_count=0,this.__items=[]}o.prototype.clone_empty=function(){var l=new o(this.__parent);return l.set_indent(this.__indent_count,this.__alignment_count),l},o.prototype.item=function(l){return l<0?this.__items[this.__items.length+l]:this.__items[l]},o.prototype.has_match=function(l){for(var c=this.__items.length-1;c>=0;c--)if(this.__items[c].match(l))return!0;return!1},o.prototype.set_indent=function(l,c){this.is_empty()&&(this.__indent_count=l||0,this.__alignment_count=c||0,this.__character_count=this.__parent.get_indent_size(this.__indent_count,this.__alignment_count))},o.prototype._set_wrap_point=function(){this.__parent.wrap_line_length&&(this.__wrap_point_index=this.__items.length,this.__wrap_point_character_count=this.__character_count,this.__wrap_point_indent_count=this.__parent.next_line.__indent_count,this.__wrap_point_alignment_count=this.__parent.next_line.__alignment_count)},o.prototype._should_wrap=function(){return this.__wrap_point_index&&this.__character_count>this.__parent.wrap_line_length&&this.__wrap_point_character_count>this.__parent.next_line.__character_count},o.prototype._allow_wrap=function(){if(this._should_wrap()){this.__parent.add_new_line();var l=this.__parent.current_line;return l.set_indent(this.__wrap_point_indent_count,this.__wrap_point_alignment_count),l.__items=this.__items.slice(this.__wrap_point_index),this.__items=this.__items.slice(0,this.__wrap_point_index),l.__character_count+=this.__character_count-this.__wrap_point_character_count,this.__character_count=this.__wrap_point_character_count,l.__items[0]===" "&&(l.__items.splice(0,1),l.__character_count-=1),!0}return!1},o.prototype.is_empty=function(){return this.__items.length===0},o.prototype.last=function(){return this.is_empty()?null:this.__items[this.__items.length-1]},o.prototype.push=function(l){this.__items.push(l);var c=l.lastIndexOf(`
+`);c!==-1?this.__character_count=l.length-c:this.__character_count+=l.length},o.prototype.pop=function(){var l=null;return this.is_empty()||(l=this.__items.pop(),this.__character_count-=l.length),l},o.prototype._remove_indent=function(){this.__indent_count>0&&(this.__indent_count-=1,this.__character_count-=this.__parent.indent_size)},o.prototype._remove_wrap_indent=function(){this.__wrap_point_indent_count>0&&(this.__wrap_point_indent_count-=1)},o.prototype.trim=function(){for(;this.last()===" ";)this.__items.pop(),this.__character_count-=1},o.prototype.toString=function(){var l="";return this.is_empty()?this.__parent.indent_empty_lines&&(l=this.__parent.get_indent_string(this.__indent_count)):(l=this.__parent.get_indent_string(this.__indent_count,this.__alignment_count),l+=this.__items.join("")),l};function s(l,c){this.__cache=[""],this.__indent_size=l.indent_size,this.__indent_string=l.indent_char,l.indent_with_tabs||(this.__indent_string=new Array(l.indent_size+1).join(l.indent_char)),c=c||"",l.indent_level>0&&(c=new Array(l.indent_level+1).join(this.__indent_string)),this.__base_string=c,this.__base_string_length=c.length}s.prototype.get_indent_size=function(l,c){var h=this.__base_string_length;return c=c||0,l<0&&(h=0),h+=l*this.__indent_size,h+=c,h},s.prototype.get_indent_string=function(l,c){var h=this.__base_string;return c=c||0,l<0&&(l=0,h=""),c+=l*this.__indent_size,this.__ensure_cache(c),h+=this.__cache[c],h},s.prototype.__ensure_cache=function(l){for(;l>=this.__cache.length;)this.__add_column()},s.prototype.__add_column=function(){var l=this.__cache.length,c=0,h="";this.__indent_size&&l>=this.__indent_size&&(c=Math.floor(l/this.__indent_size),l-=c*this.__indent_size,h=new Array(c+1).join(this.__indent_string)),l&&(h+=new Array(l+1).join(" ")),this.__cache.push(h)};function a(l,c){this.__indent_cache=new s(l,c),this.raw=!1,this._end_with_newline=l.end_with_newline,this.indent_size=l.indent_size,this.wrap_line_length=l.wrap_line_length,this.indent_empty_lines=l.indent_empty_lines,this.__lines=[],this.previous_line=null,this.current_line=null,this.next_line=new o(this),this.space_before_token=!1,this.non_breaking_space=!1,this.previous_token_wrapped=!1,this.__add_outputline()}a.prototype.__add_outputline=function(){this.previous_line=this.current_line,this.current_line=this.next_line.clone_empty(),this.__lines.push(this.current_line)},a.prototype.get_line_number=function(){return this.__lines.length},a.prototype.get_indent_string=function(l,c){return this.__indent_cache.get_indent_string(l,c)},a.prototype.get_indent_size=function(l,c){return this.__indent_cache.get_indent_size(l,c)},a.prototype.is_empty=function(){return!this.previous_line&&this.current_line.is_empty()},a.prototype.add_new_line=function(l){return this.is_empty()||!l&&this.just_added_newline()?!1:(this.raw||this.__add_outputline(),!0)},a.prototype.get_code=function(l){this.trim(!0);var c=this.current_line.pop();c&&(c[c.length-1]===`
+`&&(c=c.replace(/\n+$/g,"")),this.current_line.push(c)),this._end_with_newline&&this.__add_outputline();var h=this.__lines.join(`
+`);return l!==`
+`&&(h=h.replace(/[\n]/g,l)),h},a.prototype.set_wrap_point=function(){this.current_line._set_wrap_point()},a.prototype.set_indent=function(l,c){return l=l||0,c=c||0,this.next_line.set_indent(l,c),this.__lines.length>1?(this.current_line.set_indent(l,c),!0):(this.current_line.set_indent(),!1)},a.prototype.add_raw_token=function(l){for(var c=0;c<l.newlines;c++)this.__add_outputline();this.current_line.set_indent(-1),this.current_line.push(l.whitespace_before),this.current_line.push(l.text),this.space_before_token=!1,this.non_breaking_space=!1,this.previous_token_wrapped=!1},a.prototype.add_token=function(l){this.__add_space_before_token(),this.current_line.push(l),this.space_before_token=!1,this.non_breaking_space=!1,this.previous_token_wrapped=this.current_line._allow_wrap()},a.prototype.__add_space_before_token=function(){this.space_before_token&&!this.just_added_newline()&&(this.non_breaking_space||this.set_wrap_point(),this.current_line.push(" "))},a.prototype.remove_indent=function(l){for(var c=this.__lines.length;l<c;)this.__lines[l]._remove_indent(),l++;this.current_line._remove_wrap_indent()},a.prototype.trim=function(l){for(l=l===void 0?!1:l,this.current_line.trim();l&&this.__lines.length>1&&this.current_line.is_empty();)this.__lines.pop(),this.current_line=this.__lines[this.__lines.length-1],this.current_line.trim();this.previous_line=this.__lines.length>1?this.__lines[this.__lines.length-2]:null},a.prototype.just_added_newline=function(){return this.current_line.is_empty()},a.prototype.just_added_blankline=function(){return this.is_empty()||this.current_line.is_empty()&&this.previous_line.is_empty()},a.prototype.ensure_empty_line_above=function(l,c){for(var h=this.__lines.length-2;h>=0;){var p=this.__lines[h];if(p.is_empty())break;if(p.item(0).indexOf(l)!==0&&p.item(-1)!==c){this.__lines.splice(h+1,0,new o(this)),this.previous_line=this.__lines[this.__lines.length-2];break}h--}},i.exports.Output=a},,,,function(i){function o(l,c){this.raw_options=s(l,c),this.disabled=this._get_boolean("disabled"),this.eol=this._get_characters("eol","auto"),this.end_with_newline=this._get_boolean("end_with_newline"),this.indent_size=this._get_number("indent_size",4),this.indent_char=this._get_characters("indent_char"," "),this.indent_level=this._get_number("indent_level"),this.preserve_newlines=this._get_boolean("preserve_newlines",!0),this.max_preserve_newlines=this._get_number("max_preserve_newlines",32786),this.preserve_newlines||(this.max_preserve_newlines=0),this.indent_with_tabs=this._get_boolean("indent_with_tabs",this.indent_char==="	"),this.indent_with_tabs&&(this.indent_char="	",this.indent_size===1&&(this.indent_size=4)),this.wrap_line_length=this._get_number("wrap_line_length",this._get_number("max_char")),this.indent_empty_lines=this._get_boolean("indent_empty_lines"),this.templating=this._get_selection_list("templating",["auto","none","django","erb","handlebars","php","smarty"],["auto"])}o.prototype._get_array=function(l,c){var h=this.raw_options[l],p=c||[];return typeof h=="object"?h!==null&&typeof h.concat=="function"&&(p=h.concat()):typeof h=="string"&&(p=h.split(/[^a-zA-Z0-9_\/\-]+/)),p},o.prototype._get_boolean=function(l,c){var h=this.raw_options[l],p=h===void 0?!!c:!!h;return p},o.prototype._get_characters=function(l,c){var h=this.raw_options[l],p=c||"";return typeof h=="string"&&(p=h.replace(/\\r/,"\r").replace(/\\n/,`
+`).replace(/\\t/,"	")),p},o.prototype._get_number=function(l,c){var h=this.raw_options[l];c=parseInt(c,10),isNaN(c)&&(c=0);var p=parseInt(h,10);return isNaN(p)&&(p=c),p},o.prototype._get_selection=function(l,c,h){var p=this._get_selection_list(l,c,h);if(p.length!==1)throw new Error("Invalid Option Value: The option '"+l+`' can only be one of the following values:
+`+c+`
+You passed in: '`+this.raw_options[l]+"'");return p[0]},o.prototype._get_selection_list=function(l,c,h){if(!c||c.length===0)throw new Error("Selection list cannot be empty.");if(h=h||[c[0]],!this._is_valid_selection(h,c))throw new Error("Invalid Default Value!");var p=this._get_array(l,h);if(!this._is_valid_selection(p,c))throw new Error("Invalid Option Value: The option '"+l+`' can contain only the following values:
+`+c+`
+You passed in: '`+this.raw_options[l]+"'");return p},o.prototype._is_valid_selection=function(l,c){return l.length&&c.length&&!l.some(function(h){return c.indexOf(h)===-1})};function s(l,c){var h={};l=a(l);var p;for(p in l)p!==c&&(h[p]=l[p]);if(c&&l[c])for(p in l[c])h[p]=l[c][p];return h}function a(l){var c={},h;for(h in l){var p=h.replace(/-/g,"_");c[p]=l[h]}return c}i.exports.Options=o,i.exports.normalizeOpts=a,i.exports.mergeOpts=s},,function(i){var o=RegExp.prototype.hasOwnProperty("sticky");function s(a){this.__input=a||"",this.__input_length=this.__input.length,this.__position=0}s.prototype.restart=function(){this.__position=0},s.prototype.back=function(){this.__position>0&&(this.__position-=1)},s.prototype.hasNext=function(){return this.__position<this.__input_length},s.prototype.next=function(){var a=null;return this.hasNext()&&(a=this.__input.charAt(this.__position),this.__position+=1),a},s.prototype.peek=function(a){var l=null;return a=a||0,a+=this.__position,a>=0&&a<this.__input_length&&(l=this.__input.charAt(a)),l},s.prototype.__match=function(a,l){a.lastIndex=l;var c=a.exec(this.__input);return c&&!(o&&a.sticky)&&c.index!==l&&(c=null),c},s.prototype.test=function(a,l){return l=l||0,l+=this.__position,l>=0&&l<this.__input_length?!!this.__match(a,l):!1},s.prototype.testChar=function(a,l){var c=this.peek(l);return a.lastIndex=0,c!==null&&a.test(c)},s.prototype.match=function(a){var l=this.__match(a,this.__position);return l?this.__position+=l[0].length:l=null,l},s.prototype.read=function(a,l,c){var h="",p;return a&&(p=this.match(a),p&&(h+=p[0])),l&&(p||!a)&&(h+=this.readUntil(l,c)),h},s.prototype.readUntil=function(a,l){var c="",h=this.__position;a.lastIndex=this.__position;var p=a.exec(this.__input);return p?(h=p.index,l&&(h+=p[0].length)):h=this.__input_length,c=this.__input.substring(this.__position,h),this.__position=h,c},s.prototype.readUntilAfter=function(a){return this.readUntil(a,!0)},s.prototype.get_regexp=function(a,l){var c=null,h="g";return l&&o&&(h="y"),typeof a=="string"&&a!==""?c=new RegExp(a,h):a&&(c=new RegExp(a.source,h)),c},s.prototype.get_literal_regexp=function(a){return RegExp(a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"))},s.prototype.peekUntilAfter=function(a){var l=this.__position,c=this.readUntilAfter(a);return this.__position=l,c},s.prototype.lookBack=function(a){var l=this.__position-1;return l>=a.length&&this.__input.substring(l-a.length,l).toLowerCase()===a},i.exports.InputScanner=s},,,,,function(i){function o(s,a){s=typeof s=="string"?s:s.source,a=typeof a=="string"?a:a.source,this.__directives_block_pattern=new RegExp(s+/ beautify( \w+[:]\w+)+ /.source+a,"g"),this.__directive_pattern=/ (\w+)[:](\w+)/g,this.__directives_end_ignore_pattern=new RegExp(s+/\sbeautify\signore:end\s/.source+a,"g")}o.prototype.get_directives=function(s){if(!s.match(this.__directives_block_pattern))return null;var a={};this.__directive_pattern.lastIndex=0;for(var l=this.__directive_pattern.exec(s);l;)a[l[1]]=l[2],l=this.__directive_pattern.exec(s);return a},o.prototype.readIgnored=function(s){return s.readUntilAfter(this.__directives_end_ignore_pattern)},i.exports.Directives=o},,function(i,o,s){var a=s(16).Beautifier,l=s(17).Options;function c(h,p){var m=new a(h,p);return m.beautify()}i.exports=c,i.exports.defaultOptions=function(){return new l}},function(i,o,s){var a=s(17).Options,l=s(2).Output,c=s(8).InputScanner,h=s(13).Directives,p=new h(/\/\*/,/\*\//),m=/\r\n|[\r\n]/,g=/\r\n|[\r\n]/g,w=/\s/,x=/(?:\s|\n)+/g,y=/\/\*(?:[\s\S]*?)((?:\*\/)|$)/g,D=/\/\/(?:[^\n\r\u2028\u2029]*)/g;function M(z,P){this._source_text=z||"",this._options=new a(P),this._ch=null,this._input=null,this.NESTED_AT_RULE={"@page":!0,"@font-face":!0,"@keyframes":!0,"@media":!0,"@supports":!0,"@document":!0},this.CONDITIONAL_GROUP_RULE={"@media":!0,"@supports":!0,"@document":!0}}M.prototype.eatString=function(z){var P="";for(this._ch=this._input.next();this._ch;){if(P+=this._ch,this._ch==="\\")P+=this._input.next();else if(z.indexOf(this._ch)!==-1||this._ch===`
+`)break;this._ch=this._input.next()}return P},M.prototype.eatWhitespace=function(z){for(var P=w.test(this._input.peek()),L=0;w.test(this._input.peek());)this._ch=this._input.next(),z&&this._ch===`
+`&&(L===0||L<this._options.max_preserve_newlines)&&(L++,this._output.add_new_line(!0));return P},M.prototype.foundNestedPseudoClass=function(){for(var z=0,P=1,L=this._input.peek(P);L;){if(L==="{")return!0;if(L==="(")z+=1;else if(L===")"){if(z===0)return!1;z-=1}else if(L===";"||L==="}")return!1;P++,L=this._input.peek(P)}return!1},M.prototype.print_string=function(z){this._output.set_indent(this._indentLevel),this._output.non_breaking_space=!0,this._output.add_token(z)},M.prototype.preserveSingleSpace=function(z){z&&(this._output.space_before_token=!0)},M.prototype.indent=function(){this._indentLevel++},M.prototype.outdent=function(){this._indentLevel>0&&this._indentLevel--},M.prototype.beautify=function(){if(this._options.disabled)return this._source_text;var z=this._source_text,P=this._options.eol;P==="auto"&&(P=`
+`,z&&m.test(z||"")&&(P=z.match(m)[0])),z=z.replace(g,`
+`);var L=z.match(/^[\t ]*/)[0];this._output=new l(this._options,L),this._input=new c(z),this._indentLevel=0,this._nestedLevel=0,this._ch=null;for(var $=0,ue=!1,oe=!1,me=!1,ve=!1,ye=!1,ke=this._ch,pe,G,Ie;pe=this._input.read(x),G=pe!=="",Ie=ke,this._ch=this._input.next(),this._ch==="\\"&&this._input.hasNext()&&(this._ch+=this._input.next()),ke=this._ch,this._ch;)if(this._ch==="/"&&this._input.peek()==="*"){this._output.add_new_line(),this._input.back();var fe=this._input.read(y),C=p.get_directives(fe);C&&C.ignore==="start"&&(fe+=p.readIgnored(this._input)),this.print_string(fe),this.eatWhitespace(!0),this._output.add_new_line()}else if(this._ch==="/"&&this._input.peek()==="/")this._output.space_before_token=!0,this._input.back(),this.print_string(this._input.read(D)),this.eatWhitespace(!0);else if(this._ch==="@")if(this.preserveSingleSpace(G),this._input.peek()==="{")this.print_string(this._ch+this.eatString("}"));else{this.print_string(this._ch);var b=this._input.peekUntilAfter(/[: ,;{}()[\]\/='"]/g);b.match(/[ :]$/)&&(b=this.eatString(": ").replace(/\s$/,""),this.print_string(b),this._output.space_before_token=!0),b=b.replace(/\s$/,""),b==="extend"?ve=!0:b==="import"&&(ye=!0),b in this.NESTED_AT_RULE?(this._nestedLevel+=1,b in this.CONDITIONAL_GROUP_RULE&&(me=!0)):!ue&&$===0&&b.indexOf(":")!==-1&&(oe=!0,this.indent())}else this._ch==="#"&&this._input.peek()==="{"?(this.preserveSingleSpace(G),this.print_string(this._ch+this.eatString("}"))):this._ch==="{"?(oe&&(oe=!1,this.outdent()),me?(me=!1,ue=this._indentLevel>=this._nestedLevel):ue=this._indentLevel>=this._nestedLevel-1,this._options.newline_between_rules&&ue&&this._output.previous_line&&this._output.previous_line.item(-1)!=="{"&&this._output.ensure_empty_line_above("/",","),this._output.space_before_token=!0,this._options.brace_style==="expand"?(this._output.add_new_line(),this.print_string(this._ch),this.indent(),this._output.set_indent(this._indentLevel)):(this.indent(),this.print_string(this._ch)),this.eatWhitespace(!0),this._output.add_new_line()):this._ch==="}"?(this.outdent(),this._output.add_new_line(),Ie==="{"&&this._output.trim(!0),ye=!1,ve=!1,oe&&(this.outdent(),oe=!1),this.print_string(this._ch),ue=!1,this._nestedLevel&&this._nestedLevel--,this.eatWhitespace(!0),this._output.add_new_line(),this._options.newline_between_rules&&!this._output.just_added_blankline()&&this._input.peek()!=="}"&&this._output.add_new_line(!0)):this._ch===":"?(ue||me)&&!(this._input.lookBack("&")||this.foundNestedPseudoClass())&&!this._input.lookBack("(")&&!ve&&$===0?(this.print_string(":"),oe||(oe=!0,this._output.space_before_token=!0,this.eatWhitespace(!0),this.indent())):(this._input.lookBack(" ")&&(this._output.space_before_token=!0),this._input.peek()===":"?(this._ch=this._input.next(),this.print_string("::")):this.print_string(":")):this._ch==='"'||this._ch==="'"?(this.preserveSingleSpace(G),this.print_string(this._ch+this.eatString(this._ch)),this.eatWhitespace(!0)):this._ch===";"?$===0?(oe&&(this.outdent(),oe=!1),ve=!1,ye=!1,this.print_string(this._ch),this.eatWhitespace(!0),this._input.peek()!=="/"&&this._output.add_new_line()):(this.print_string(this._ch),this.eatWhitespace(!0),this._output.space_before_token=!0):this._ch==="("?this._input.lookBack("url")?(this.print_string(this._ch),this.eatWhitespace(),$++,this.indent(),this._ch=this._input.next(),this._ch===")"||this._ch==='"'||this._ch==="'"?this._input.back():this._ch&&(this.print_string(this._ch+this.eatString(")")),$&&($--,this.outdent()))):(this.preserveSingleSpace(G),this.print_string(this._ch),this.eatWhitespace(),$++,this.indent()):this._ch===")"?($&&($--,this.outdent()),this.print_string(this._ch)):this._ch===","?(this.print_string(this._ch),this.eatWhitespace(!0),this._options.selector_separator_newline&&!oe&&$===0&&!ye&&!ve?this._output.add_new_line():this._output.space_before_token=!0):(this._ch===">"||this._ch==="+"||this._ch==="~")&&!oe&&$===0?this._options.space_around_combinator?(this._output.space_before_token=!0,this.print_string(this._ch),this._output.space_before_token=!0):(this.print_string(this._ch),this.eatWhitespace(),this._ch&&w.test(this._ch)&&(this._ch="")):this._ch==="]"?this.print_string(this._ch):this._ch==="["?(this.preserveSingleSpace(G),this.print_string(this._ch)):this._ch==="="?(this.eatWhitespace(),this.print_string("="),w.test(this._ch)&&(this._ch="")):this._ch==="!"&&!this._input.lookBack("\\")?(this.print_string(" "),this.print_string(this._ch)):(this.preserveSingleSpace(G),this.print_string(this._ch));var k=this._output.get_code(P);return k},i.exports.Beautifier=M},function(i,o,s){var a=s(6).Options;function l(c){a.call(this,c,"css"),this.selector_separator_newline=this._get_boolean("selector_separator_newline",!0),this.newline_between_rules=this._get_boolean("newline_between_rules",!0);var h=this._get_boolean("space_around_selector_separator");this.space_around_combinator=this._get_boolean("space_around_combinator")||h;var p=this._get_selection_list("brace_style",["collapse","expand","end-expand","none","preserve-inline"]);this.brace_style="collapse";for(var m=0;m<p.length;m++)p[m]!=="expand"?this.brace_style="collapse":this.brace_style=p[m]}l.prototype=new a,i.exports.Options=l}],e={};function t(i){var o=e[i];if(o!==void 0)return o.exports;var s=e[i]={exports:{}};return n[i](s,s.exports,t),s.exports}var r=t(15);Qo=r})();var Zo=Qo;function rs(n,e,t){var r=n.getText(),i=!0,o=0,s=!1,a=t.tabSize||4;if(e){for(var l=n.offsetAt(e.start),c=l;c>0&&ns(r,c-1);)c--;c===0||ts(r,c-1)?l=c:c<l&&(l=c+1);for(var h=n.offsetAt(e.end),p=h;p<r.length&&ns(r,p);)p++;if((p===r.length||ts(r,p))&&(h=p),e=W.create(n.positionAt(l),n.positionAt(h)),s=Ja(r,l),i=h===r.length,r=r.substring(l,h),l!==0){var m=n.offsetAt(Q.create(e.start.line,0));o=Xa(n.getText(),m,t)}s&&(r=`{
+`.concat(es(r)))}else e=W.create(Q.create(0,0),n.positionAt(r.length));var g={indent_size:a,indent_char:t.insertSpaces?" ":"	",end_with_newline:i&&Ve(t,"insertFinalNewline",!1),selector_separator_newline:Ve(t,"newlineBetweenSelectors",!0),newline_between_rules:Ve(t,"newlineBetweenRules",!0),space_around_selector_separator:Ve(t,"spaceAroundSelectorSeparator",!1),brace_style:Ve(t,"braceStyle","collapse"),indent_empty_lines:Ve(t,"indentEmptyLines",!1),max_preserve_newlines:Ve(t,"maxPreserveNewLines",void 0),preserve_newlines:Ve(t,"preserveNewLines",!0),wrap_line_length:Ve(t,"wrapLineLength",void 0),eol:`
+`},w=Zo(r,g);if(s&&(w=es(w.substring(2))),o>0){var x=t.insertSpaces?Xn(" ",a*o):Xn("	",o);w=w.split(`
+`).join(`
+`+x),e.start.character===0&&(w=x+w)}return[{range:e,newText:w}]}function es(n){return n.replace(/^\s+/,"")}var Ga=123,Ha=125;function Ja(n,e){for(;e>=0;){var t=n.charCodeAt(e);if(t===Ga)return!0;if(t===Ha)return!1;e--}return!1}function Ve(n,e,t){if(n&&n.hasOwnProperty(e)){var r=n[e];if(r!==null)return r}return t}function Xa(n,e,t){for(var r=e,i=0,o=t.tabSize||4;r<n.length;){var s=n.charAt(r);if(s===" ")i++;else if(s==="	")i+=o;else break;r++}return Math.floor(i/o)}function ts(n,e){return`\r
+`.indexOf(n.charAt(e))!==-1}function ns(n,e){return" 	".indexOf(n.charAt(e))!==-1}var Br={version:1.1,properties:[{name:"additive-symbols",browsers:["FF33"],syntax:"[ <integer> && <symbol> ]#",relevance:50,description:"@counter-style descriptor. Specifies the symbols used by the marker-construction algorithm specified by the system descriptor. Needs to be specified if the counter system is 'additive'.",restrictions:["integer","string","image","identifier"]},{name:"align-content",values:[{name:"center",description:"Lines are packed toward the center of the flex container."},{name:"flex-end",description:"Lines are packed toward the end of the flex container."},{name:"flex-start",description:"Lines are packed toward the start of the flex container."},{name:"space-around",description:"Lines are evenly distributed in the flex container, with half-size spaces on either end."},{name:"space-between",description:"Lines are evenly distributed in the flex container."},{name:"stretch",description:"Lines stretch to take up the remaining space."}],syntax:"normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position>",relevance:62,description:"Aligns a flex container\u2019s lines within the flex container when there is extra space in the cross-axis, similar to how 'justify-content' aligns individual items within the main-axis.",restrictions:["enum"]},{name:"align-items",values:[{name:"baseline",description:"If the flex item\u2019s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."},{name:"center",description:"The flex item\u2019s margin box is centered in the cross axis within the line."},{name:"flex-end",description:"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."},{name:"flex-start",description:"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."}],syntax:"normal | stretch | <baseline-position> | [ <overflow-position>? <self-position> ]",relevance:85,description:"Aligns flex items along the cross axis of the current line of the flex container.",restrictions:["enum"]},{name:"justify-items",values:[{name:"auto"},{name:"normal"},{name:"end"},{name:"start"},{name:"flex-end",description:'"Flex items are packed toward the end of the line."'},{name:"flex-start",description:'"Flex items are packed toward the start of the line."'},{name:"self-end",description:"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis."},{name:"self-start",description:"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis.."},{name:"center",description:"The items are packed flush to each other toward the center of the of the alignment container."},{name:"left"},{name:"right"},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"save"},{name:"unsave"},{name:"legacy"}],syntax:"normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ] | legacy | legacy && [ left | right | center ]",relevance:53,description:"Defines the default justify-self for all items of the box, giving them the default way of justifying each box along the appropriate axis",restrictions:["enum"]},{name:"justify-self",values:[{name:"auto"},{name:"normal"},{name:"end"},{name:"start"},{name:"flex-end",description:'"Flex items are packed toward the end of the line."'},{name:"flex-start",description:'"Flex items are packed toward the start of the line."'},{name:"self-end",description:"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis."},{name:"self-start",description:"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis.."},{name:"center",description:"The items are packed flush to each other toward the center of the of the alignment container."},{name:"left"},{name:"right"},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"save"},{name:"unsave"}],syntax:"auto | normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ]",relevance:53,description:"Defines the way of justifying a box inside its container along the appropriate axis.",restrictions:["enum"]},{name:"align-self",values:[{name:"auto",description:"Computes to the value of 'align-items' on the element\u2019s parent, or 'stretch' if the element has no parent. On absolutely positioned elements, it computes to itself."},{name:"baseline",description:"If the flex item\u2019s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."},{name:"center",description:"The flex item\u2019s margin box is centered in the cross axis within the line."},{name:"flex-end",description:"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."},{name:"flex-start",description:"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."}],syntax:"auto | normal | stretch | <baseline-position> | <overflow-position>? <self-position>",relevance:72,description:"Allows the default alignment along the cross axis to be overridden for individual flex items.",restrictions:["enum"]},{name:"all",browsers:["E79","FF27","S9.1","C37","O24"],values:[],syntax:"initial | inherit | unset | revert",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/all"}],description:"Shorthand that resets all properties except 'direction' and 'unicode-bidi'.",restrictions:["enum"]},{name:"alt",browsers:["S9"],values:[],relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/alt"}],description:"Provides alternative text for assistive technology to replace the generated content of a ::before or ::after element.",restrictions:["string","enum"]},{name:"animation",values:[{name:"alternate",description:"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."},{name:"alternate-reverse",description:"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."},{name:"backwards",description:"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."},{name:"both",description:"Both forwards and backwards fill modes are applied."},{name:"forwards",description:"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."},{name:"infinite",description:"Causes the animation to repeat forever."},{name:"none",description:"No animation is performed"},{name:"normal",description:"Normal playback."},{name:"reverse",description:"All iterations of the animation are played in the reverse direction from the way they were specified."}],syntax:"<single-animation>#",relevance:82,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation"}],description:"Shorthand property combines six of the animation properties into a single property.",restrictions:["time","timing-function","enum","identifier","number"]},{name:"animation-delay",syntax:"<time>#",relevance:64,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation-delay"}],description:"Defines when the animation will start.",restrictions:["time"]},{name:"animation-direction",values:[{name:"alternate",description:"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."},{name:"alternate-reverse",description:"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."},{name:"normal",description:"Normal playback."},{name:"reverse",description:"All iterations of the animation are played in the reverse direction from the way they were specified."}],syntax:"<single-animation-direction>#",relevance:57,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation-direction"}],description:"Defines whether or not the animation should play in reverse on alternate cycles.",restrictions:["enum"]},{name:"animation-duration",syntax:"<time>#",relevance:68,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation-duration"}],description:"Defines the length of time that an animation takes to complete one cycle.",restrictions:["time"]},{name:"animation-fill-mode",values:[{name:"backwards",description:"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."},{name:"both",description:"Both forwards and backwards fill modes are applied."},{name:"forwards",description:"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."},{name:"none",description:"There is no change to the property value between the time the animation is applied and the time the animation begins playing or after the animation completes."}],syntax:"<single-animation-fill-mode>#",relevance:63,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation-fill-mode"}],description:"Defines what values are applied by the animation outside the time it is executing.",restrictions:["enum"]},{name:"animation-iteration-count",values:[{name:"infinite",description:"Causes the animation to repeat forever."}],syntax:"<single-animation-iteration-count>#",relevance:60,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation-iteration-count"}],description:"Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.",restrictions:["number","enum"]},{name:"animation-name",values:[{name:"none",description:"No animation is performed"}],syntax:"[ none | <keyframes-name> ]#",relevance:68,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation-name"}],description:"Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.",restrictions:["identifier","enum"]},{name:"animation-play-state",values:[{name:"paused",description:"A running animation will be paused."},{name:"running",description:"Resume playback of a paused animation."}],syntax:"<single-animation-play-state>#",relevance:54,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation-play-state"}],description:"Defines whether the animation is running or paused.",restrictions:["enum"]},{name:"animation-timing-function",syntax:"<easing-function>#",relevance:71,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation-timing-function"}],description:"Describes how the animation will progress over one cycle of its duration.",restrictions:["timing-function"]},{name:"backface-visibility",values:[{name:"hidden",description:"Back side is hidden."},{name:"visible",description:"Back side is visible."}],syntax:"visible | hidden",relevance:59,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/backface-visibility"}],description:"Determines whether or not the 'back' side of a transformed element is visible when facing the viewer. With an identity transform, the front side of an element faces the viewer.",restrictions:["enum"]},{name:"background",values:[{name:"fixed",description:"The background is fixed with regard to the viewport. In paged media where there is no viewport, a 'fixed' background is fixed with respect to the page box and therefore replicated on every page."},{name:"local",description:"The background is fixed with regard to the element's contents: if the element has a scrolling mechanism, the background scrolls with the element's contents."},{name:"none",description:"A value of 'none' counts as an image layer but draws nothing."},{name:"scroll",description:"The background is fixed with regard to the element itself and does not scroll with its contents. (It is effectively attached to the element's border.)"}],syntax:"[ <bg-layer> , ]* <final-bg-layer>",relevance:93,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/background"}],description:"Shorthand property for setting most background properties at the same place in the style sheet.",restrictions:["enum","image","color","position","length","repeat","percentage","box"]},{name:"background-attachment",values:[{name:"fixed",description:"The background is fixed with regard to the viewport. In paged media where there is no viewport, a 'fixed' background is fixed with respect to the page box and therefore replicated on every page."},{name:"local",description:"The background is fixed with regard to the element\u2019s contents: if the element has a scrolling mechanism, the background scrolls with the element\u2019s contents."},{name:"scroll",description:"The background is fixed with regard to the element itself and does not scroll with its contents. (It is effectively attached to the element\u2019s border.)"}],syntax:"<attachment>#",relevance:54,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/background-attachment"}],description:"Specifies whether the background images are fixed with regard to the viewport ('fixed') or scroll along with the element ('scroll') or its contents ('local').",restrictions:["enum"]},{name:"background-blend-mode",browsers:["E79","FF30","S8","C35","O22"],values:[{name:"normal",description:"Default attribute which specifies no blending"},{name:"multiply",description:"The source color is multiplied by the destination color and replaces the destination."},{name:"screen",description:"Multiplies the complements of the backdrop and source color values, then complements the result."},{name:"overlay",description:"Multiplies or screens the colors, depending on the backdrop color value."},{name:"darken",description:"Selects the darker of the backdrop and source colors."},{name:"lighten",description:"Selects the lighter of the backdrop and source colors."},{name:"color-dodge",description:"Brightens the backdrop color to reflect the source color."},{name:"color-burn",description:"Darkens the backdrop color to reflect the source color."},{name:"hard-light",description:"Multiplies or screens the colors, depending on the source color value."},{name:"soft-light",description:"Darkens or lightens the colors, depending on the source color value."},{name:"difference",description:"Subtracts the darker of the two constituent colors from the lighter color.."},{name:"exclusion",description:"Produces an effect similar to that of the Difference mode but lower in contrast."},{name:"hue",browsers:["E79","FF30","S8","C35","O22"],description:"Creates a color with the hue of the source color and the saturation and luminosity of the backdrop color."},{name:"saturation",browsers:["E79","FF30","S8","C35","O22"],description:"Creates a color with the saturation of the source color and the hue and luminosity of the backdrop color."},{name:"color",browsers:["E79","FF30","S8","C35","O22"],description:"Creates a color with the hue and saturation of the source color and the luminosity of the backdrop color."},{name:"luminosity",browsers:["E79","FF30","S8","C35","O22"],description:"Creates a color with the luminosity of the source color and the hue and saturation of the backdrop color."}],syntax:"<blend-mode>#",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/background-blend-mode"}],description:"Defines the blending mode of each background layer.",restrictions:["enum"]},{name:"background-clip",syntax:"<box>#",relevance:69,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/background-clip"}],description:"Determines the background painting area.",restrictions:["box"]},{name:"background-color",syntax:"<color>",relevance:95,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/background-color"}],description:"Sets the background color of an element.",restrictions:["color"]},{name:"background-image",values:[{name:"none",description:"Counts as an image layer but draws nothing."}],syntax:"<bg-image>#",relevance:89,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/background-image"}],description:"Sets the background image(s) of an element.",restrictions:["image","enum"]},{name:"background-origin",syntax:"<box>#",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/background-origin"}],description:"For elements rendered as a single box, specifies the background positioning area. For elements rendered as multiple boxes (e.g., inline boxes on several lines, boxes on several pages) specifies which boxes 'box-decoration-break' operates on to determine the background positioning area(s).",restrictions:["box"]},{name:"background-position",syntax:"<bg-position>#",relevance:88,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/background-position"}],description:"Specifies the initial position of the background image(s) (after any resizing) within their corresponding background positioning area.",restrictions:["position","length","percentage"]},{name:"background-position-x",values:[{name:"center",description:"Equivalent to '50%' ('left 50%') for the horizontal position if the horizontal position is not otherwise specified, or '50%' ('top 50%') for the vertical position if it is."},{name:"left",description:"Equivalent to '0%' for the horizontal position if one or two values are given, otherwise specifies the left edge as the origin for the next offset."},{name:"right",description:"Equivalent to '100%' for the horizontal position if one or two values are given, otherwise specifies the right edge as the origin for the next offset."}],status:"experimental",syntax:"[ center | [ [ left | right | x-start | x-end ]? <length-percentage>? ]! ]#",relevance:54,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/background-position-x"}],description:"If background images have been specified, this property specifies their initial position (after any resizing) within their corresponding background positioning area.",restrictions:["length","percentage"]},{name:"background-position-y",values:[{name:"bottom",description:"Equivalent to '100%' for the vertical position if one or two values are given, otherwise specifies the bottom edge as the origin for the next offset."},{name:"center",description:"Equivalent to '50%' ('left 50%') for the horizontal position if the horizontal position is not otherwise specified, or '50%' ('top 50%') for the vertical position if it is."},{name:"top",description:"Equivalent to '0%' for the vertical position if one or two values are given, otherwise specifies the top edge as the origin for the next offset."}],status:"experimental",syntax:"[ center | [ [ top | bottom | y-start | y-end ]? <length-percentage>? ]! ]#",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/background-position-y"}],description:"If background images have been specified, this property specifies their initial position (after any resizing) within their corresponding background positioning area.",restrictions:["length","percentage"]},{name:"background-repeat",values:[],syntax:"<repeat-style>#",relevance:85,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/background-repeat"}],description:"Specifies how background images are tiled after they have been sized and positioned.",restrictions:["repeat"]},{name:"background-size",values:[{name:"auto",description:"Resolved by using the image\u2019s intrinsic ratio and the size of the other dimension, or failing that, using the image\u2019s intrinsic size, or failing that, treating it as 100%."},{name:"contain",description:"Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area."},{name:"cover",description:"Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area."}],syntax:"<bg-size>#",relevance:85,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/background-size"}],description:"Specifies the size of the background images.",restrictions:["length","percentage"]},{name:"behavior",browsers:["IE6"],relevance:50,description:"IE only. Used to extend behaviors of the browser.",restrictions:["url"]},{name:"block-size",browsers:["E79","FF41","S12.1","C57","O44"],values:[{name:"auto",description:"Depends on the values of other properties."}],syntax:"<'width'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/block-size"}],description:"Size of an element in the direction opposite that of the direction specified by 'writing-mode'.",restrictions:["length","percentage"]},{name:"border",syntax:"<line-width> || <line-style> || <color>",relevance:96,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border"}],description:"Shorthand property for setting border width, style, and color.",restrictions:["length","line-width","line-style","color"]},{name:"border-block-end",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-width'> || <'border-top-style'> || <color>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-block-end"}],description:"Logical 'border-bottom'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","line-width","line-style","color"]},{name:"border-block-start",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-width'> || <'border-top-style'> || <color>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-block-start"}],description:"Logical 'border-top'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","line-width","line-style","color"]},{name:"border-block-end-color",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-color'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-block-end-color"}],description:"Logical 'border-bottom-color'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["color"]},{name:"border-block-start-color",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-color'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-block-start-color"}],description:"Logical 'border-top-color'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["color"]},{name:"border-block-end-style",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-style'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-block-end-style"}],description:"Logical 'border-bottom-style'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["line-style"]},{name:"border-block-start-style",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-style'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-block-start-style"}],description:"Logical 'border-top-style'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["line-style"]},{name:"border-block-end-width",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-width'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-block-end-width"}],description:"Logical 'border-bottom-width'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","line-width"]},{name:"border-block-start-width",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-width'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-block-start-width"}],description:"Logical 'border-top-width'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","line-width"]},{name:"border-bottom",syntax:"<line-width> || <line-style> || <color>",relevance:89,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-bottom"}],description:"Shorthand property for setting border width, style and color.",restrictions:["length","line-width","line-style","color"]},{name:"border-bottom-color",syntax:"<'border-top-color'>",relevance:72,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-bottom-color"}],description:"Sets the color of the bottom border.",restrictions:["color"]},{name:"border-bottom-left-radius",syntax:"<length-percentage>{1,2}",relevance:75,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-bottom-left-radius"}],description:"Defines the radii of the bottom left outer border edge.",restrictions:["length","percentage"]},{name:"border-bottom-right-radius",syntax:"<length-percentage>{1,2}",relevance:75,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-bottom-right-radius"}],description:"Defines the radii of the bottom right outer border edge.",restrictions:["length","percentage"]},{name:"border-bottom-style",syntax:"<line-style>",relevance:59,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-bottom-style"}],description:"Sets the style of the bottom border.",restrictions:["line-style"]},{name:"border-bottom-width",syntax:"<line-width>",relevance:63,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-bottom-width"}],description:"Sets the thickness of the bottom border.",restrictions:["length","line-width"]},{name:"border-collapse",values:[{name:"collapse",description:"Selects the collapsing borders model."},{name:"separate",description:"Selects the separated borders border model."}],syntax:"collapse | separate",relevance:75,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-collapse"}],description:"Selects a table's border model.",restrictions:["enum"]},{name:"border-color",values:[],syntax:"<color>{1,4}",relevance:87,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-color"}],description:"The color of the border around all four edges of an element.",restrictions:["color"]},{name:"border-image",values:[{name:"auto",description:"If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead."},{name:"fill",description:"Causes the middle part of the border-image to be preserved."},{name:"none",description:"Use the border styles."},{name:"repeat",description:"The image is tiled (repeated) to fill the area."},{name:"round",description:"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does."},{name:"space",description:"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles."},{name:"stretch",description:"The image is stretched to fill the area."},{name:"url()"}],syntax:"<'border-image-source'> || <'border-image-slice'> [ / <'border-image-width'> | / <'border-image-width'>? / <'border-image-outset'> ]? || <'border-image-repeat'>",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-image"}],description:"Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.",restrictions:["length","percentage","number","url","enum"]},{name:"border-image-outset",syntax:"[ <length> | <number> ]{1,4}",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-image-outset"}],description:"The values specify the amount by which the border image area extends beyond the border box on the top, right, bottom, and left sides respectively. If the fourth value is absent, it is the same as the second. If the third one is also absent, it is the same as the first. If the second one is also absent, it is the same as the first. Numbers represent multiples of the corresponding border-width.",restrictions:["length","number"]},{name:"border-image-repeat",values:[{name:"repeat",description:"The image is tiled (repeated) to fill the area."},{name:"round",description:"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does."},{name:"space",description:"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles."},{name:"stretch",description:"The image is stretched to fill the area."}],syntax:"[ stretch | repeat | round | space ]{1,2}",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-image-repeat"}],description:"Specifies how the images for the sides and the middle part of the border image are scaled and tiled. If the second keyword is absent, it is assumed to be the same as the first.",restrictions:["enum"]},{name:"border-image-slice",values:[{name:"fill",description:"Causes the middle part of the border-image to be preserved."}],syntax:"<number-percentage>{1,4} && fill?",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-image-slice"}],description:"Specifies inward offsets from the top, right, bottom, and left edges of the image, dividing it into nine regions: four corners, four edges and a middle.",restrictions:["number","percentage"]},{name:"border-image-source",values:[{name:"none",description:"Use the border styles."}],syntax:"none | <image>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-image-source"}],description:"Specifies an image to use instead of the border styles given by the 'border-style' properties and as an additional background layer for the element. If the value is 'none' or if the image cannot be displayed, the border styles will be used.",restrictions:["image"]},{name:"border-image-width",values:[{name:"auto",description:"The border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead."}],syntax:"[ <length-percentage> | <number> | auto ]{1,4}",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-image-width"}],description:"The four values of 'border-image-width' specify offsets that are used to divide the border image area into nine parts. They represent inward distances from the top, right, bottom, and left sides of the area, respectively.",restrictions:["length","percentage","number"]},{name:"border-inline-end",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-width'> || <'border-top-style'> || <color>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-inline-end"}],description:"Logical 'border-right'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","line-width","line-style","color"]},{name:"border-inline-start",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-width'> || <'border-top-style'> || <color>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-inline-start"}],description:"Logical 'border-left'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","line-width","line-style","color"]},{name:"border-inline-end-color",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-color'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-color"}],description:"Logical 'border-right-color'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["color"]},{name:"border-inline-start-color",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-color'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-color"}],description:"Logical 'border-left-color'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["color"]},{name:"border-inline-end-style",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-style'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-style"}],description:"Logical 'border-right-style'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["line-style"]},{name:"border-inline-start-style",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-style'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-style"}],description:"Logical 'border-left-style'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["line-style"]},{name:"border-inline-end-width",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-width'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-width"}],description:"Logical 'border-right-width'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","line-width"]},{name:"border-inline-start-width",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'border-top-width'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-width"}],description:"Logical 'border-left-width'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","line-width"]},{name:"border-left",syntax:"<line-width> || <line-style> || <color>",relevance:83,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-left"}],description:"Shorthand property for setting border width, style and color",restrictions:["length","line-width","line-style","color"]},{name:"border-left-color",syntax:"<color>",relevance:65,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-left-color"}],description:"Sets the color of the left border.",restrictions:["color"]},{name:"border-left-style",syntax:"<line-style>",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-left-style"}],description:"Sets the style of the left border.",restrictions:["line-style"]},{name:"border-left-width",syntax:"<line-width>",relevance:59,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-left-width"}],description:"Sets the thickness of the left border.",restrictions:["length","line-width"]},{name:"border-radius",syntax:"<length-percentage>{1,4} [ / <length-percentage>{1,4} ]?",relevance:92,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-radius"}],description:"Defines the radii of the outer border edge.",restrictions:["length","percentage"]},{name:"border-right",syntax:"<line-width> || <line-style> || <color>",relevance:82,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-right"}],description:"Shorthand property for setting border width, style and color",restrictions:["length","line-width","line-style","color"]},{name:"border-right-color",syntax:"<color>",relevance:65,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-right-color"}],description:"Sets the color of the right border.",restrictions:["color"]},{name:"border-right-style",syntax:"<line-style>",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-right-style"}],description:"Sets the style of the right border.",restrictions:["line-style"]},{name:"border-right-width",syntax:"<line-width>",relevance:59,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-right-width"}],description:"Sets the thickness of the right border.",restrictions:["length","line-width"]},{name:"border-spacing",syntax:"<length> <length>?",relevance:68,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-spacing"}],description:"The lengths specify the distance that separates adjoining cell borders. If one length is specified, it gives both the horizontal and vertical spacing. If two are specified, the first gives the horizontal spacing and the second the vertical spacing. Lengths may not be negative.",restrictions:["length"]},{name:"border-style",values:[],syntax:"<line-style>{1,4}",relevance:81,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-style"}],description:"The style of the border around edges of an element.",restrictions:["line-style"]},{name:"border-top",syntax:"<line-width> || <line-style> || <color>",relevance:88,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-top"}],description:"Shorthand property for setting border width, style and color",restrictions:["length","line-width","line-style","color"]},{name:"border-top-color",syntax:"<color>",relevance:72,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-top-color"}],description:"Sets the color of the top border.",restrictions:["color"]},{name:"border-top-left-radius",syntax:"<length-percentage>{1,2}",relevance:76,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-top-left-radius"}],description:"Defines the radii of the top left outer border edge.",restrictions:["length","percentage"]},{name:"border-top-right-radius",syntax:"<length-percentage>{1,2}",relevance:75,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-top-right-radius"}],description:"Defines the radii of the top right outer border edge.",restrictions:["length","percentage"]},{name:"border-top-style",syntax:"<line-style>",relevance:57,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-top-style"}],description:"Sets the style of the top border.",restrictions:["line-style"]},{name:"border-top-width",syntax:"<line-width>",relevance:61,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-top-width"}],description:"Sets the thickness of the top border.",restrictions:["length","line-width"]},{name:"border-width",values:[],syntax:"<line-width>{1,4}",relevance:82,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-width"}],description:"Shorthand that sets the four 'border-*-width' properties. If it has four values, they set top, right, bottom and left in that order. If left is missing, it is the same as right; if bottom is missing, it is the same as top; if right is missing, it is the same as top.",restrictions:["length","line-width"]},{name:"bottom",values:[{name:"auto",description:"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well"}],syntax:"<length> | <percentage> | auto",relevance:90,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/bottom"}],description:"Specifies how far an absolutely positioned box's bottom margin edge is offset above the bottom edge of the box's 'containing block'.",restrictions:["length","percentage"]},{name:"box-decoration-break",browsers:["E79","FF32","S7","C22","O15"],values:[{name:"clone",description:"Each box is independently wrapped with the border and padding."},{name:"slice",description:"The effect is as though the element were rendered with no breaks present, and then sliced by the breaks afterward."}],syntax:"slice | clone",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/box-decoration-break"}],description:"Specifies whether individual boxes are treated as broken pieces of one continuous box, or whether each box is individually wrapped with the border and padding.",restrictions:["enum"]},{name:"box-shadow",values:[{name:"inset",description:"Changes the drop shadow from an outer shadow (one that shadows the box onto the canvas, as if it were lifted above the canvas) to an inner shadow (one that shadows the canvas onto the box, as if the box were cut out of the canvas and shifted behind it)."},{name:"none",description:"No shadow."}],syntax:"none | <shadow>#",relevance:90,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/box-shadow"}],description:"Attaches one or more drop-shadows to the box. The property is a comma-separated list of shadows, each specified by 2-4 length values, an optional color, and an optional 'inset' keyword. Omitted lengths are 0; omitted colors are a user agent chosen color.",restrictions:["length","color","enum"]},{name:"box-sizing",values:[{name:"border-box",description:"The specified width and height (and respective min/max properties) on this element determine the border box of the element."},{name:"content-box",description:"Behavior of width and height as specified by CSS2.1. The specified width and height (and respective min/max properties) apply to the width and height respectively of the content box of the element."}],syntax:"content-box | border-box",relevance:93,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/box-sizing"}],description:"Specifies the behavior of the 'width' and 'height' properties.",restrictions:["enum"]},{name:"break-after",values:[{name:"always",description:"Always force a page break before/after the generated box."},{name:"auto",description:"Neither force nor forbid a page/column break before/after the principal box."},{name:"avoid",description:"Avoid a break before/after the principal box."},{name:"avoid-column",description:"Avoid a column break before/after the principal box."},{name:"avoid-page",description:"Avoid a page break before/after the principal box."},{name:"column",description:"Always force a column break before/after the principal box."},{name:"left",description:"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page."},{name:"page",description:"Always force a page break before/after the principal box."},{name:"right",description:"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page."}],syntax:"auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region",relevance:50,description:"Describes the page/column/region break behavior after the generated box.",restrictions:["enum"]},{name:"break-before",values:[{name:"always",description:"Always force a page break before/after the generated box."},{name:"auto",description:"Neither force nor forbid a page/column break before/after the principal box."},{name:"avoid",description:"Avoid a break before/after the principal box."},{name:"avoid-column",description:"Avoid a column break before/after the principal box."},{name:"avoid-page",description:"Avoid a page break before/after the principal box."},{name:"column",description:"Always force a column break before/after the principal box."},{name:"left",description:"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page."},{name:"page",description:"Always force a page break before/after the principal box."},{name:"right",description:"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page."}],syntax:"auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region",relevance:50,description:"Describes the page/column/region break behavior before the generated box.",restrictions:["enum"]},{name:"break-inside",values:[{name:"auto",description:"Impose no additional breaking constraints within the box."},{name:"avoid",description:"Avoid breaks within the box."},{name:"avoid-column",description:"Avoid a column break within the box."},{name:"avoid-page",description:"Avoid a page break within the box."}],syntax:"auto | avoid | avoid-page | avoid-column | avoid-region",relevance:51,description:"Describes the page/column/region break behavior inside the principal box.",restrictions:["enum"]},{name:"caption-side",values:[{name:"bottom",description:"Positions the caption box below the table box."},{name:"top",description:"Positions the caption box above the table box."}],syntax:"top | bottom | block-start | block-end | inline-start | inline-end",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/caption-side"}],description:"Specifies the position of the caption box with respect to the table box.",restrictions:["enum"]},{name:"caret-color",browsers:["E79","FF53","S11.1","C57","O44"],values:[{name:"auto",description:"The user agent selects an appropriate color for the caret. This is generally currentcolor, but the user agent may choose a different color to ensure good visibility and contrast with the surrounding content, taking into account the value of currentcolor, the background, shadows, and other factors."}],syntax:"auto | <color>",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/caret-color"}],description:"Controls the color of the text insertion indicator.",restrictions:["color","enum"]},{name:"clear",values:[{name:"both",description:"The clearance of the generated box is set to the amount necessary to place the top border edge below the bottom outer edge of any right-floating and left-floating boxes that resulted from elements earlier in the source document."},{name:"left",description:"The clearance of the generated box is set to the amount necessary to place the top border edge below the bottom outer edge of any left-floating boxes that resulted from elements earlier in the source document."},{name:"none",description:"No constraint on the box's position with respect to floats."},{name:"right",description:"The clearance of the generated box is set to the amount necessary to place the top border edge below the bottom outer edge of any right-floating boxes that resulted from elements earlier in the source document."}],syntax:"none | left | right | both | inline-start | inline-end",relevance:85,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/clear"}],description:"Indicates which sides of an element's box(es) may not be adjacent to an earlier floating box. The 'clear' property does not consider floats inside the element itself or in other block formatting contexts.",restrictions:["enum"]},{name:"clip",values:[{name:"auto",description:"The element does not clip."},{name:"rect()",description:"Specifies offsets from the edges of the border box."}],syntax:"<shape> | auto",relevance:75,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/clip"}],description:"Deprecated. Use the 'clip-path' property when support allows. Defines the visible portion of an element\u2019s box.",restrictions:["enum"]},{name:"clip-path",values:[{name:"none",description:"No clipping path gets created."},{name:"url()",description:"References a <clipPath> element to create a clipping path."}],syntax:"<clip-source> | [ <basic-shape> || <geometry-box> ] | none",relevance:62,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/clip-path"}],description:"Specifies a clipping path where everything inside the path is visible and everything outside is clipped out.",restrictions:["url","shape","geometry-box","enum"]},{name:"clip-rule",browsers:["E","C5","FF3","IE10","O9","S6"],values:[{name:"evenodd",description:"Determines the \u2018insideness\u2019 of a point on the canvas by drawing a ray from that point to infinity in any direction and counting the number of path segments from the given shape that the ray crosses."},{name:"nonzero",description:"Determines the \u2018insideness\u2019 of a point on the canvas by drawing a ray from that point to infinity in any direction and then examining the places where a segment of the shape crosses the ray."}],relevance:50,description:"Indicates the algorithm which is to be used to determine what parts of the canvas are included inside the shape.",restrictions:["enum"]},{name:"color",syntax:"<color>",relevance:95,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/color"}],description:"Sets the color of an element's text",restrictions:["color"]},{name:"color-interpolation-filters",browsers:["E","C5","FF3","IE10","O9","S6"],values:[{name:"auto",description:"Color operations are not required to occur in a particular color space."},{name:"linearRGB",description:"Color operations should occur in the linearized RGB color space."},{name:"sRGB",description:"Color operations should occur in the sRGB color space."}],relevance:50,description:"Specifies the color space for imaging operations performed via filter effects.",restrictions:["enum"]},{name:"column-count",values:[{name:"auto",description:"Determines the number of columns by the 'column-width' property and the element width."}],syntax:"<integer> | auto",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/column-count"}],description:"Describes the optimal number of columns into which the content of the element will be flowed.",restrictions:["integer","enum"]},{name:"column-fill",values:[{name:"auto",description:"Fills columns sequentially."},{name:"balance",description:"Balance content equally between columns, if possible."}],syntax:"auto | balance | balance-all",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/column-fill"}],description:"In continuous media, this property will only be consulted if the length of columns has been constrained. Otherwise, columns will automatically be balanced.",restrictions:["enum"]},{name:"column-gap",values:[{name:"normal",description:"User agent specific and typically equivalent to 1em."}],syntax:"normal | <length-percentage>",relevance:54,description:"Sets the gap between columns. If there is a column rule between columns, it will appear in the middle of the gap.",restrictions:["length","enum"]},{name:"column-rule",syntax:"<'column-rule-width'> || <'column-rule-style'> || <'column-rule-color'>",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/column-rule"}],description:"Shorthand for setting 'column-rule-width', 'column-rule-style', and 'column-rule-color' at the same place in the style sheet. Omitted values are set to their initial values.",restrictions:["length","line-width","line-style","color"]},{name:"column-rule-color",syntax:"<color>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/column-rule-color"}],description:"Sets the color of the column rule",restrictions:["color"]},{name:"column-rule-style",syntax:"<'border-style'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/column-rule-style"}],description:"Sets the style of the rule between columns of an element.",restrictions:["line-style"]},{name:"column-rule-width",syntax:"<'border-width'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/column-rule-width"}],description:"Sets the width of the rule between columns. Negative values are not allowed.",restrictions:["length","line-width"]},{name:"columns",values:[{name:"auto",description:"The width depends on the values of other properties."}],syntax:"<'column-width'> || <'column-count'>",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/columns"}],description:"A shorthand property which sets both 'column-width' and 'column-count'.",restrictions:["length","integer","enum"]},{name:"column-span",values:[{name:"all",description:"The element spans across all columns. Content in the normal flow that appears before the element is automatically balanced across all columns before the element appear."},{name:"none",description:"The element does not span multiple columns."}],syntax:"none | all",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/column-span"}],description:"Describes the page/column break behavior after the generated box.",restrictions:["enum"]},{name:"column-width",values:[{name:"auto",description:"The width depends on the values of other properties."}],syntax:"<length> | auto",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/column-width"}],description:"Describes the width of columns in multicol elements.",restrictions:["length","enum"]},{name:"contain",browsers:["E79","FF69","S15.4","C52","O40"],values:[{name:"none",description:"Indicates that the property has no effect."},{name:"strict",description:"Turns on all forms of containment for the element."},{name:"content",description:"All containment rules except size are applied to the element."},{name:"size",description:"For properties that can have effects on more than just an element and its descendants, those effects don't escape the containing element."},{name:"layout",description:"Turns on layout containment for the element."},{name:"style",description:"Turns on style containment for the element."},{name:"paint",description:"Turns on paint containment for the element."}],syntax:"none | strict | content | [ size || layout || style || paint ]",relevance:59,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/contain"}],description:"Indicates that an element and its contents are, as much as possible, independent of the rest of the document tree.",restrictions:["enum"]},{name:"content",values:[{name:"attr()",description:"The attr(n) function returns as a string the value of attribute n for the subject of the selector."},{name:"counter(name)",description:"Counters are denoted by identifiers (see the 'counter-increment' and 'counter-reset' properties)."},{name:"icon",description:"The (pseudo-)element is replaced in its entirety by the resource referenced by its 'icon' property, and treated as a replaced element."},{name:"none",description:"On elements, this inhibits the children of the element from being rendered as children of this element, as if the element was empty. On pseudo-elements it causes the pseudo-element to have no content."},{name:"normal",description:"See http://www.w3.org/TR/css3-content/#content for computation rules."},{name:"url()"}],syntax:"normal | none | [ <content-replacement> | <content-list> ] [/ [ <string> | <counter> ]+ ]?",relevance:90,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/content"}],description:"Determines which page-based occurrence of a given element is applied to a counter or string value.",restrictions:["string","url"]},{name:"counter-increment",values:[{name:"none",description:"This element does not alter the value of any counters."}],syntax:"[ <counter-name> <integer>? ]+ | none",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/counter-increment"}],description:"Manipulate the value of existing counters.",restrictions:["identifier","integer"]},{name:"counter-reset",values:[{name:"none",description:"The counter is not modified."}],syntax:"[ <counter-name> <integer>? | <reversed-counter-name> <integer>? ]+ | none",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/counter-reset"}],description:"Property accepts one or more names of counters (identifiers), each one optionally followed by an integer. The integer gives the value that the counter is set to on each occurrence of the element.",restrictions:["identifier","integer"]},{name:"cursor",values:[{name:"alias",description:"Indicates an alias of/shortcut to something is to be created. Often rendered as an arrow with a small curved arrow next to it."},{name:"all-scroll",description:"Indicates that the something can be scrolled in any direction. Often rendered as arrows pointing up, down, left, and right with a dot in the middle."},{name:"auto",description:"The UA determines the cursor to display based on the current context."},{name:"cell",description:"Indicates that a cell or set of cells may be selected. Often rendered as a thick plus-sign with a dot in the middle."},{name:"col-resize",description:"Indicates that the item/column can be resized horizontally. Often rendered as arrows pointing left and right with a vertical bar separating them."},{name:"context-menu",description:"A context menu is available for the object under the cursor. Often rendered as an arrow with a small menu-like graphic next to it."},{name:"copy",description:"Indicates something is to be copied. Often rendered as an arrow with a small plus sign next to it."},{name:"crosshair",description:"A simple crosshair (e.g., short line segments resembling a '+' sign). Often used to indicate a two dimensional bitmap selection mode."},{name:"default",description:"The platform-dependent default cursor. Often rendered as an arrow."},{name:"e-resize",description:"Indicates that east edge is to be moved."},{name:"ew-resize",description:"Indicates a bidirectional east-west resize cursor."},{name:"grab",description:"Indicates that something can be grabbed."},{name:"grabbing",description:"Indicates that something is being grabbed."},{name:"help",description:"Help is available for the object under the cursor. Often rendered as a question mark or a balloon."},{name:"move",description:"Indicates something is to be moved."},{name:"-moz-grab",description:"Indicates that something can be grabbed."},{name:"-moz-grabbing",description:"Indicates that something is being grabbed."},{name:"-moz-zoom-in",description:"Indicates that something can be zoomed (magnified) in."},{name:"-moz-zoom-out",description:"Indicates that something can be zoomed (magnified) out."},{name:"ne-resize",description:"Indicates that movement starts from north-east corner."},{name:"nesw-resize",description:"Indicates a bidirectional north-east/south-west cursor."},{name:"no-drop",description:"Indicates that the dragged item cannot be dropped at the current cursor location. Often rendered as a hand or pointer with a small circle with a line through it."},{name:"none",description:"No cursor is rendered for the element."},{name:"not-allowed",description:"Indicates that the requested action will not be carried out. Often rendered as a circle with a line through it."},{name:"n-resize",description:"Indicates that north edge is to be moved."},{name:"ns-resize",description:"Indicates a bidirectional north-south cursor."},{name:"nw-resize",description:"Indicates that movement starts from north-west corner."},{name:"nwse-resize",description:"Indicates a bidirectional north-west/south-east cursor."},{name:"pointer",description:"The cursor is a pointer that indicates a link."},{name:"progress",description:"A progress indicator. The program is performing some processing, but is different from 'wait' in that the user may still interact with the program. Often rendered as a spinning beach ball, or an arrow with a watch or hourglass."},{name:"row-resize",description:"Indicates that the item/row can be resized vertically. Often rendered as arrows pointing up and down with a horizontal bar separating them."},{name:"se-resize",description:"Indicates that movement starts from south-east corner."},{name:"s-resize",description:"Indicates that south edge is to be moved."},{name:"sw-resize",description:"Indicates that movement starts from south-west corner."},{name:"text",description:"Indicates text that may be selected. Often rendered as a vertical I-beam."},{name:"vertical-text",description:"Indicates vertical-text that may be selected. Often rendered as a horizontal I-beam."},{name:"wait",description:"Indicates that the program is busy and the user should wait. Often rendered as a watch or hourglass."},{name:"-webkit-grab",description:"Indicates that something can be grabbed."},{name:"-webkit-grabbing",description:"Indicates that something is being grabbed."},{name:"-webkit-zoom-in",description:"Indicates that something can be zoomed (magnified) in."},{name:"-webkit-zoom-out",description:"Indicates that something can be zoomed (magnified) out."},{name:"w-resize",description:"Indicates that west edge is to be moved."},{name:"zoom-in",description:"Indicates that something can be zoomed (magnified) in."},{name:"zoom-out",description:"Indicates that something can be zoomed (magnified) out."}],syntax:"[ [ <url> [ <x> <y> ]? , ]* [ auto | default | none | context-menu | help | pointer | progress | wait | cell | crosshair | text | vertical-text | alias | copy | move | no-drop | not-allowed | e-resize | n-resize | ne-resize | nw-resize | s-resize | se-resize | sw-resize | w-resize | ew-resize | ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | all-scroll | zoom-in | zoom-out | grab | grabbing ] ]",relevance:92,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/cursor"}],description:"Allows control over cursor appearance in an element",restrictions:["url","number","enum"]},{name:"direction",values:[{name:"ltr",description:"Left-to-right direction."},{name:"rtl",description:"Right-to-left direction."}],syntax:"ltr | rtl",relevance:69,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/direction"}],description:"Specifies the inline base direction or directionality of any bidi paragraph, embedding, isolate, or override established by the box. Note: for HTML content use the 'dir' attribute and 'bdo' element rather than this property.",restrictions:["enum"]},{name:"display",values:[{name:"block",description:"The element generates a block-level box"},{name:"contents",description:"The element itself does not generate any boxes, but its children and pseudo-elements still generate boxes as normal."},{name:"flex",description:"The element generates a principal flex container box and establishes a flex formatting context."},{name:"flexbox",description:"The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'."},{name:"flow-root",description:"The element generates a block container box, and lays out its contents using flow layout."},{name:"grid",description:"The element generates a principal grid container box, and establishes a grid formatting context."},{name:"inline",description:"The element generates an inline-level box."},{name:"inline-block",description:"A block box, which itself is flowed as a single inline box, similar to a replaced element. The inside of an inline-block is formatted as a block box, and the box itself is formatted as an inline box."},{name:"inline-flex",description:"Inline-level flex container."},{name:"inline-flexbox",description:"Inline-level flex container. Standardized as 'inline-flex'"},{name:"inline-table",description:"Inline-level table wrapper box containing table box."},{name:"list-item",description:"One or more block boxes and one marker box."},{name:"-moz-box",description:"The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'."},{name:"-moz-deck"},{name:"-moz-grid"},{name:"-moz-grid-group"},{name:"-moz-grid-line"},{name:"-moz-groupbox"},{name:"-moz-inline-box",description:"Inline-level flex container. Standardized as 'inline-flex'"},{name:"-moz-inline-grid"},{name:"-moz-inline-stack"},{name:"-moz-marker"},{name:"-moz-popup"},{name:"-moz-stack"},{name:"-ms-flexbox",description:"The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'."},{name:"-ms-grid",description:"The element generates a principal grid container box, and establishes a grid formatting context."},{name:"-ms-inline-flexbox",description:"Inline-level flex container. Standardized as 'inline-flex'"},{name:"-ms-inline-grid",description:"Inline-level grid container."},{name:"none",description:"The element and its descendants generates no boxes."},{name:"ruby",description:"The element generates a principal ruby container box, and establishes a ruby formatting context."},{name:"ruby-base"},{name:"ruby-base-container"},{name:"ruby-text"},{name:"ruby-text-container"},{name:"run-in",description:"The element generates a run-in box. Run-in elements act like inlines or blocks, depending on the surrounding elements."},{name:"table",description:"The element generates a principal table wrapper box containing an additionally-generated table box, and establishes a table formatting context."},{name:"table-caption"},{name:"table-cell"},{name:"table-column"},{name:"table-column-group"},{name:"table-footer-group"},{name:"table-header-group"},{name:"table-row"},{name:"table-row-group"},{name:"-webkit-box",description:"The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'."},{name:"-webkit-flex",description:"The element lays out its contents using flow layout (block-and-inline layout)."},{name:"-webkit-inline-box",description:"Inline-level flex container. Standardized as 'inline-flex'"},{name:"-webkit-inline-flex",description:"Inline-level flex container."}],syntax:"[ <display-outside> || <display-inside> ] | <display-listitem> | <display-internal> | <display-box> | <display-legacy>",relevance:96,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/display"}],description:"In combination with 'float' and 'position', determines the type of box or boxes that are generated for an element.",restrictions:["enum"]},{name:"empty-cells",values:[{name:"hide",description:"No borders or backgrounds are drawn around/behind empty cells."},{name:"-moz-show-background"},{name:"show",description:"Borders and backgrounds are drawn around/behind empty cells (like normal cells)."}],syntax:"show | hide",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/empty-cells"}],description:"In the separated borders model, this property controls the rendering of borders and backgrounds around cells that have no visible content.",restrictions:["enum"]},{name:"enable-background",values:[{name:"accumulate",description:"If the ancestor container element has a property of new, then all graphics elements within the current container are rendered both on the parent's background image and onto the target."},{name:"new",description:"Create a new background image canvas. All children of the current container element can access the background, and they will be rendered onto both the parent's background image canvas in addition to the target device."}],relevance:50,description:"Deprecated. Use 'isolation' property instead when support allows. Specifies how the accumulation of the background image is managed.",restrictions:["integer","length","percentage","enum"]},{name:"fallback",browsers:["FF33"],syntax:"<counter-style-name>",relevance:50,description:"@counter-style descriptor. Specifies a fallback counter style to be used when the current counter style can\u2019t create a representation for a given counter value.",restrictions:["identifier"]},{name:"fill",values:[{name:"url()",description:"A URL reference to a paint server element, which is an element that defines a paint server: \u2018hatch\u2019, \u2018linearGradient\u2019, \u2018mesh\u2019, \u2018pattern\u2019, \u2018radialGradient\u2019 and \u2018solidcolor\u2019."},{name:"none",description:"No paint is applied in this layer."}],relevance:77,description:"Paints the interior of the given graphical element.",restrictions:["color","enum","url"]},{name:"fill-opacity",relevance:52,description:"Specifies the opacity of the painting operation used to paint the interior the current object.",restrictions:["number(0-1)"]},{name:"fill-rule",values:[{name:"evenodd",description:"Determines the \u2018insideness\u2019 of a point on the canvas by drawing a ray from that point to infinity in any direction and counting the number of path segments from the given shape that the ray crosses."},{name:"nonzero",description:"Determines the \u2018insideness\u2019 of a point on the canvas by drawing a ray from that point to infinity in any direction and then examining the places where a segment of the shape crosses the ray."}],relevance:50,description:"Indicates the algorithm (or winding rule) which is to be used to determine what parts of the canvas are included inside the shape.",restrictions:["enum"]},{name:"filter",browsers:["E12","FF35","S9.1","C53","O40"],values:[{name:"none",description:"No filter effects are applied."},{name:"blur()",description:"Applies a Gaussian blur to the input image."},{name:"brightness()",description:"Applies a linear multiplier to input image, making it appear more or less bright."},{name:"contrast()",description:"Adjusts the contrast of the input."},{name:"drop-shadow()",description:"Applies a drop shadow effect to the input image."},{name:"grayscale()",description:"Converts the input image to grayscale."},{name:"hue-rotate()",description:"Applies a hue rotation on the input image. "},{name:"invert()",description:"Inverts the samples in the input image."},{name:"opacity()",description:"Applies transparency to the samples in the input image."},{name:"saturate()",description:"Saturates the input image."},{name:"sepia()",description:"Converts the input image to sepia."},{name:"url()",browsers:["E12","FF35","S9.1","C53","O40"],description:"A filter reference to a <filter> element."}],syntax:"none | <filter-function-list>",relevance:66,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/filter"}],description:"Processes an element\u2019s rendering before it is displayed in the document, by applying one or more filter effects.",restrictions:["enum","url"]},{name:"flex",values:[{name:"auto",description:"Retrieves the value of the main size property as the used 'flex-basis'."},{name:"content",description:"Indicates automatic sizing, based on the flex item\u2019s content."},{name:"none",description:"Expands to '0 0 auto'."}],syntax:"none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]",relevance:80,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/flex"}],description:"Specifies the components of a flexible length: the flex grow factor and flex shrink factor, and the flex basis.",restrictions:["length","number","percentage"]},{name:"flex-basis",values:[{name:"auto",description:"Retrieves the value of the main size property as the used 'flex-basis'."},{name:"content",description:"Indicates automatic sizing, based on the flex item\u2019s content."}],syntax:"content | <'width'>",relevance:65,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/flex-basis"}],description:"Sets the flex basis.",restrictions:["length","number","percentage"]},{name:"flex-direction",values:[{name:"column",description:"The flex container\u2019s main axis has the same orientation as the block axis of the current writing mode."},{name:"column-reverse",description:"Same as 'column', except the main-start and main-end directions are swapped."},{name:"row",description:"The flex container\u2019s main axis has the same orientation as the inline axis of the current writing mode."},{name:"row-reverse",description:"Same as 'row', except the main-start and main-end directions are swapped."}],syntax:"row | row-reverse | column | column-reverse",relevance:83,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/flex-direction"}],description:"Specifies how flex items are placed in the flex container, by setting the direction of the flex container\u2019s main axis.",restrictions:["enum"]},{name:"flex-flow",values:[{name:"column",description:"The flex container\u2019s main axis has the same orientation as the block axis of the current writing mode."},{name:"column-reverse",description:"Same as 'column', except the main-start and main-end directions are swapped."},{name:"nowrap",description:"The flex container is single-line."},{name:"row",description:"The flex container\u2019s main axis has the same orientation as the inline axis of the current writing mode."},{name:"row-reverse",description:"Same as 'row', except the main-start and main-end directions are swapped."},{name:"wrap",description:"The flexbox is multi-line."},{name:"wrap-reverse",description:"Same as 'wrap', except the cross-start and cross-end directions are swapped."}],syntax:"<'flex-direction'> || <'flex-wrap'>",relevance:61,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/flex-flow"}],description:"Specifies how flexbox items are placed in the flexbox.",restrictions:["enum"]},{name:"flex-grow",syntax:"<number>",relevance:75,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/flex-grow"}],description:"Sets the flex grow factor. Negative numbers are invalid.",restrictions:["number"]},{name:"flex-shrink",syntax:"<number>",relevance:74,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/flex-shrink"}],description:"Sets the flex shrink factor. Negative numbers are invalid.",restrictions:["number"]},{name:"flex-wrap",values:[{name:"nowrap",description:"The flex container is single-line."},{name:"wrap",description:"The flexbox is multi-line."},{name:"wrap-reverse",description:"Same as 'wrap', except the cross-start and cross-end directions are swapped."}],syntax:"nowrap | wrap | wrap-reverse",relevance:79,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/flex-wrap"}],description:"Controls whether the flex container is single-line or multi-line, and the direction of the cross-axis, which determines the direction new lines are stacked in.",restrictions:["enum"]},{name:"float",values:[{name:"inline-end",description:"A keyword indicating that the element must float on the end side of its containing block. That is the right side with ltr scripts, and the left side with rtl scripts."},{name:"inline-start",description:"A keyword indicating that the element must float on the start side of its containing block. That is the left side with ltr scripts, and the right side with rtl scripts."},{name:"left",description:"The element generates a block box that is floated to the left. Content flows on the right side of the box, starting at the top (subject to the 'clear' property)."},{name:"none",description:"The box is not floated."},{name:"right",description:"Similar to 'left', except the box is floated to the right, and content flows on the left side of the box, starting at the top."}],syntax:"left | right | none | inline-start | inline-end",relevance:91,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/float"}],description:"Specifies how a box should be floated. It may be set for any element, but only applies to elements that generate boxes that are not absolutely positioned.",restrictions:["enum"]},{name:"flood-color",browsers:["E","C5","FF3","IE10","O9","S6"],relevance:50,description:"Indicates what color to use to flood the current filter primitive subregion.",restrictions:["color"]},{name:"flood-opacity",browsers:["E","C5","FF3","IE10","O9","S6"],relevance:50,description:"Indicates what opacity to use to flood the current filter primitive subregion.",restrictions:["number(0-1)","percentage"]},{name:"font",values:[{name:"100",description:"Thin"},{name:"200",description:"Extra Light (Ultra Light)"},{name:"300",description:"Light"},{name:"400",description:"Normal"},{name:"500",description:"Medium"},{name:"600",description:"Semi Bold (Demi Bold)"},{name:"700",description:"Bold"},{name:"800",description:"Extra Bold (Ultra Bold)"},{name:"900",description:"Black (Heavy)"},{name:"bold",description:"Same as 700"},{name:"bolder",description:"Specifies the weight of the face bolder than the inherited value."},{name:"caption",description:"The font used for captioned controls (e.g., buttons, drop-downs, etc.)."},{name:"icon",description:"The font used to label icons."},{name:"italic",description:"Selects a font that is labeled 'italic', or, if that is not available, one labeled 'oblique'."},{name:"large"},{name:"larger"},{name:"lighter",description:"Specifies the weight of the face lighter than the inherited value."},{name:"medium"},{name:"menu",description:"The font used in menus (e.g., dropdown menus and menu lists)."},{name:"message-box",description:"The font used in dialog boxes."},{name:"normal",description:"Specifies a face that is not labeled as a small-caps font."},{name:"oblique",description:"Selects a font that is labeled 'oblique'."},{name:"small"},{name:"small-caps",description:"Specifies a font that is labeled as a small-caps font. If a genuine small-caps font is not available, user agents should simulate a small-caps font."},{name:"small-caption",description:"The font used for labeling small controls."},{name:"smaller"},{name:"status-bar",description:"The font used in window status bars."},{name:"x-large"},{name:"x-small"},{name:"xx-large"},{name:"xx-small"}],syntax:"[ [ <'font-style'> || <font-variant-css21> || <'font-weight'> || <'font-stretch'> ]? <'font-size'> [ / <'line-height'> ]? <'font-family'> ] | caption | icon | menu | message-box | small-caption | status-bar",relevance:84,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font"}],description:"Shorthand property for setting 'font-style', 'font-variant', 'font-weight', 'font-size', 'line-height', and 'font-family', at the same place in the style sheet. The syntax of this property is based on a traditional typographical shorthand notation to set multiple properties related to fonts.",restrictions:["font"]},{name:"font-family",values:[{name:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif"},{name:"Arial, Helvetica, sans-serif"},{name:"Cambria, Cochin, Georgia, Times, 'Times New Roman', serif"},{name:"'Courier New', Courier, monospace"},{name:"cursive"},{name:"fantasy"},{name:"'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif"},{name:"Georgia, 'Times New Roman', Times, serif"},{name:"'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif"},{name:"Impact, Haettenschweiler, 'Arial Narrow Bold', sans-serif"},{name:"'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif"},{name:"monospace"},{name:"sans-serif"},{name:"'Segoe UI', Tahoma, Geneva, Verdana, sans-serif"},{name:"serif"},{name:"'Times New Roman', Times, serif"},{name:"'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif"},{name:"Verdana, Geneva, Tahoma, sans-serif"}],syntax:"<family-name>",relevance:94,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-family"}],description:"Specifies a prioritized list of font family names or generic family names. A user agent iterates through the list of family names until it matches an available font that contains a glyph for the character to be rendered.",restrictions:["font"]},{name:"font-feature-settings",values:[{name:'"aalt"',description:"Access All Alternates."},{name:'"abvf"',description:"Above-base Forms. Required in Khmer script."},{name:'"abvm"',description:"Above-base Mark Positioning. Required in Indic scripts."},{name:'"abvs"',description:"Above-base Substitutions. Required in Indic scripts."},{name:'"afrc"',description:"Alternative Fractions."},{name:'"akhn"',description:"Akhand. Required in most Indic scripts."},{name:'"blwf"',description:"Below-base Form. Required in a number of Indic scripts."},{name:'"blwm"',description:"Below-base Mark Positioning. Required in Indic scripts."},{name:'"blws"',description:"Below-base Substitutions. Required in Indic scripts."},{name:'"calt"',description:"Contextual Alternates."},{name:'"case"',description:"Case-Sensitive Forms. Applies only to European scripts; particularly prominent in Spanish-language setting."},{name:'"ccmp"',description:"Glyph Composition/Decomposition."},{name:'"cfar"',description:"Conjunct Form After Ro. Required in Khmer scripts."},{name:'"cjct"',description:"Conjunct Forms. Required in Indic scripts that show similarity to Devanagari."},{name:'"clig"',description:"Contextual Ligatures."},{name:'"cpct"',description:"Centered CJK Punctuation. Used primarily in Chinese fonts."},{name:'"cpsp"',description:"Capital Spacing. Should not be used in connecting scripts (e.g. most Arabic)."},{name:'"cswh"',description:"Contextual Swash."},{name:'"curs"',description:"Cursive Positioning. Can be used in any cursive script."},{name:'"c2pc"',description:"Petite Capitals From Capitals. Applies only to bicameral scripts."},{name:'"c2sc"',description:"Small Capitals From Capitals. Applies only to bicameral scripts."},{name:'"dist"',description:"Distances. Required in Indic scripts."},{name:'"dlig"',description:"Discretionary ligatures."},{name:'"dnom"',description:"Denominators."},{name:'"dtls"',description:"Dotless Forms. Applied to math formula layout."},{name:'"expt"',description:"Expert Forms. Applies only to Japanese."},{name:'"falt"',description:"Final Glyph on Line Alternates. Can be used in any cursive script."},{name:'"fin2"',description:"Terminal Form #2. Used only with the Syriac script."},{name:'"fin3"',description:"Terminal Form #3. Used only with the Syriac script."},{name:'"fina"',description:"Terminal Forms. Can be used in any alphabetic script."},{name:'"flac"',description:"Flattened ascent forms. Applied to math formula layout."},{name:'"frac"',description:"Fractions."},{name:'"fwid"',description:"Full Widths. Applies to any script which can use monospaced forms."},{name:'"half"',description:"Half Forms. Required in Indic scripts that show similarity to Devanagari."},{name:'"haln"',description:"Halant Forms. Required in Indic scripts."},{name:'"halt"',description:"Alternate Half Widths. Used only in CJKV fonts."},{name:'"hist"',description:"Historical Forms."},{name:'"hkna"',description:"Horizontal Kana Alternates. Applies only to fonts that support kana (hiragana and katakana)."},{name:'"hlig"',description:"Historical Ligatures."},{name:'"hngl"',description:"Hangul. Korean only."},{name:'"hojo"',description:"Hojo Kanji Forms (JIS X 0212-1990 Kanji Forms). Used only with Kanji script."},{name:'"hwid"',description:"Half Widths. Generally used only in CJKV fonts."},{name:'"init"',description:"Initial Forms. Can be used in any alphabetic script."},{name:'"isol"',description:"Isolated Forms. Can be used in any cursive script."},{name:'"ital"',description:"Italics. Applies mostly to Latin; note that many non-Latin fonts contain Latin as well."},{name:'"jalt"',description:"Justification Alternates. Can be used in any cursive script."},{name:'"jp78"',description:"JIS78 Forms. Applies only to Japanese."},{name:'"jp83"',description:"JIS83 Forms. Applies only to Japanese."},{name:'"jp90"',description:"JIS90 Forms. Applies only to Japanese."},{name:'"jp04"',description:"JIS2004 Forms. Applies only to Japanese."},{name:'"kern"',description:"Kerning."},{name:'"lfbd"',description:"Left Bounds."},{name:'"liga"',description:"Standard Ligatures."},{name:'"ljmo"',description:"Leading Jamo Forms. Required for Hangul script when Ancient Hangul writing system is supported."},{name:'"lnum"',description:"Lining Figures."},{name:'"locl"',description:"Localized Forms."},{name:'"ltra"',description:"Left-to-right glyph alternates."},{name:'"ltrm"',description:"Left-to-right mirrored forms."},{name:'"mark"',description:"Mark Positioning."},{name:'"med2"',description:"Medial Form #2. Used only with the Syriac script."},{name:'"medi"',description:"Medial Forms."},{name:'"mgrk"',description:"Mathematical Greek."},{name:'"mkmk"',description:"Mark to Mark Positioning."},{name:'"nalt"',description:"Alternate Annotation Forms."},{name:'"nlck"',description:"NLC Kanji Forms. Used only with Kanji script."},{name:'"nukt"',description:"Nukta Forms. Required in Indic scripts.."},{name:'"numr"',description:"Numerators."},{name:'"onum"',description:"Oldstyle Figures."},{name:'"opbd"',description:"Optical Bounds."},{name:'"ordn"',description:"Ordinals. Applies mostly to Latin script."},{name:'"ornm"',description:"Ornaments."},{name:'"palt"',description:"Proportional Alternate Widths. Used mostly in CJKV fonts."},{name:'"pcap"',description:"Petite Capitals."},{name:'"pkna"',description:"Proportional Kana. Generally used only in Japanese fonts."},{name:'"pnum"',description:"Proportional Figures."},{name:'"pref"',description:"Pre-base Forms. Required in Khmer and Myanmar (Burmese) scripts and southern Indic scripts that may display a pre-base form of Ra."},{name:'"pres"',description:"Pre-base Substitutions. Required in Indic scripts."},{name:'"pstf"',description:"Post-base Forms. Required in scripts of south and southeast Asia that have post-base forms for consonants eg: Gurmukhi, Malayalam, Khmer."},{name:'"psts"',description:"Post-base Substitutions."},{name:'"pwid"',description:"Proportional Widths."},{name:'"qwid"',description:"Quarter Widths. Generally used only in CJKV fonts."},{name:'"rand"',description:"Randomize."},{name:'"rclt"',description:"Required Contextual Alternates. May apply to any script, but is especially important for many styles of Arabic."},{name:'"rlig"',description:"Required Ligatures. Applies to Arabic and Syriac. May apply to some other scripts."},{name:'"rkrf"',description:"Rakar Forms. Required in Devanagari and Gujarati scripts."},{name:'"rphf"',description:"Reph Form. Required in Indic scripts. E.g. Devanagari, Kannada."},{name:'"rtbd"',description:"Right Bounds."},{name:'"rtla"',description:"Right-to-left alternates."},{name:'"rtlm"',description:"Right-to-left mirrored forms."},{name:'"ruby"',description:"Ruby Notation Forms. Applies only to Japanese."},{name:'"salt"',description:"Stylistic Alternates."},{name:'"sinf"',description:"Scientific Inferiors."},{name:'"size"',description:"Optical size."},{name:'"smcp"',description:"Small Capitals. Applies only to bicameral scripts."},{name:'"smpl"',description:"Simplified Forms. Applies only to Chinese and Japanese."},{name:'"ssty"',description:"Math script style alternates."},{name:'"stch"',description:"Stretching Glyph Decomposition."},{name:'"subs"',description:"Subscript."},{name:'"sups"',description:"Superscript."},{name:'"swsh"',description:"Swash. Does not apply to ideographic scripts."},{name:'"titl"',description:"Titling."},{name:'"tjmo"',description:"Trailing Jamo Forms. Required for Hangul script when Ancient Hangul writing system is supported."},{name:'"tnam"',description:"Traditional Name Forms. Applies only to Japanese."},{name:'"tnum"',description:"Tabular Figures."},{name:'"trad"',description:"Traditional Forms. Applies only to Chinese and Japanese."},{name:'"twid"',description:"Third Widths. Generally used only in CJKV fonts."},{name:'"unic"',description:"Unicase."},{name:'"valt"',description:"Alternate Vertical Metrics. Applies only to scripts with vertical writing modes."},{name:'"vatu"',description:"Vattu Variants. Used for Indic scripts. E.g. Devanagari."},{name:'"vert"',description:"Vertical Alternates. Applies only to scripts with vertical writing modes."},{name:'"vhal"',description:"Alternate Vertical Half Metrics. Used only in CJKV fonts."},{name:'"vjmo"',description:"Vowel Jamo Forms. Required for Hangul script when Ancient Hangul writing system is supported."},{name:'"vkna"',description:"Vertical Kana Alternates. Applies only to fonts that support kana (hiragana and katakana)."},{name:'"vkrn"',description:"Vertical Kerning."},{name:'"vpal"',description:"Proportional Alternate Vertical Metrics. Used mostly in CJKV fonts."},{name:'"vrt2"',description:"Vertical Alternates and Rotation. Applies only to scripts with vertical writing modes."},{name:'"zero"',description:"Slashed Zero."},{name:"normal",description:"No change in glyph substitution or positioning occurs."},{name:"off",description:"Disable feature."},{name:"on",description:"Enable feature."}],syntax:"normal | <feature-tag-value>#",relevance:57,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-feature-settings"}],description:"Provides low-level control over OpenType font features. It is intended as a way of providing access to font features that are not widely used but are needed for a particular use case.",restrictions:["string","integer"]},{name:"font-kerning",browsers:["E79","FF32","S9","C33","O20"],values:[{name:"auto",description:"Specifies that kerning is applied at the discretion of the user agent."},{name:"none",description:"Specifies that kerning is not applied."},{name:"normal",description:"Specifies that kerning is applied."}],syntax:"auto | normal | none",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-kerning"}],description:"Kerning is the contextual adjustment of inter-glyph spacing. This property controls metric kerning, kerning that utilizes adjustment data contained in the font.",restrictions:["enum"]},{name:"font-language-override",browsers:["FF34"],values:[{name:"normal",description:"Implies that when rendering with OpenType fonts the language of the document is used to infer the OpenType language system, used to select language specific features when rendering."}],syntax:"normal | <string>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-language-override"}],description:"The value of 'normal' implies that when rendering with OpenType fonts the language of the document is used to infer the OpenType language system, used to select language specific features when rendering.",restrictions:["string"]},{name:"font-size",values:[{name:"large"},{name:"larger"},{name:"medium"},{name:"small"},{name:"smaller"},{name:"x-large"},{name:"x-small"},{name:"xx-large"},{name:"xx-small"}],syntax:"<absolute-size> | <relative-size> | <length-percentage>",relevance:95,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-size"}],description:"Indicates the desired height of glyphs from the font. For scalable fonts, the font-size is a scale factor applied to the EM unit of the font. (Note that certain glyphs may bleed outside their EM box.) For non-scalable fonts, the font-size is converted into absolute units and matched against the declared font-size of the font, using the same absolute coordinate space for both of the matched values.",restrictions:["length","percentage"]},{name:"font-size-adjust",browsers:["E79","FF40","C43","O30"],values:[{name:"none",description:"Do not preserve the font\u2019s x-height."}],syntax:"none | [ ex-height | cap-height | ch-width | ic-width | ic-height ]? [ from-font | <number> ]",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-size-adjust"}],description:"Preserves the readability of text when font fallback occurs by adjusting the font-size so that the x-height is the same regardless of the font used.",restrictions:["number"]},{name:"font-stretch",values:[{name:"condensed"},{name:"expanded"},{name:"extra-condensed"},{name:"extra-expanded"},{name:"narrower",description:"Indicates a narrower value relative to the width of the parent element."},{name:"normal"},{name:"semi-condensed"},{name:"semi-expanded"},{name:"ultra-condensed"},{name:"ultra-expanded"},{name:"wider",description:"Indicates a wider value relative to the width of the parent element."}],syntax:"<font-stretch-absolute>{1,2}",relevance:56,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-stretch"}],description:"Selects a normal, condensed, or expanded face from a font family.",restrictions:["enum"]},{name:"font-style",values:[{name:"italic",description:"Selects a font that is labeled as an 'italic' face, or an 'oblique' face if one is not"},{name:"normal",description:"Selects a face that is classified as 'normal'."},{name:"oblique",description:"Selects a font that is labeled as an 'oblique' face, or an 'italic' face if one is not."}],syntax:"normal | italic | oblique <angle>{0,2}",relevance:90,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-style"}],description:"Allows italic or oblique faces to be selected. Italic forms are generally cursive in nature while oblique faces are typically sloped versions of the regular face.",restrictions:["enum"]},{name:"font-synthesis",browsers:["E97","FF34","S9","C97","O83"],values:[{name:"none",description:"Disallow all synthetic faces."},{name:"style",description:"Allow synthetic italic faces."},{name:"weight",description:"Allow synthetic bold faces."}],syntax:"none | [ weight || style || small-caps ]",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-synthesis"}],description:"Controls whether user agents are allowed to synthesize bold or oblique font faces when a font family lacks bold or italic faces.",restrictions:["enum"]},{name:"font-variant",values:[{name:"normal",description:"Specifies a face that is not labeled as a small-caps font."},{name:"small-caps",description:"Specifies a font that is labeled as a small-caps font. If a genuine small-caps font is not available, user agents should simulate a small-caps font."}],syntax:"normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> || stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero || <east-asian-variant-values> || <east-asian-width-values> || ruby ]",relevance:64,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-variant"}],description:"Specifies variant representations of the font",restrictions:["enum"]},{name:"font-variant-alternates",browsers:["FF34","S9.1"],values:[{name:"annotation()",description:"Enables display of alternate annotation forms."},{name:"character-variant()",description:"Enables display of specific character variants."},{name:"historical-forms",description:"Enables display of historical forms."},{name:"normal",description:"None of the features are enabled."},{name:"ornaments()",description:"Enables replacement of default glyphs with ornaments, if provided in the font."},{name:"styleset()",description:"Enables display with stylistic sets."},{name:"stylistic()",description:"Enables display of stylistic alternates."},{name:"swash()",description:"Enables display of swash glyphs."}],syntax:"normal | [ stylistic( <feature-value-name> ) || historical-forms || styleset( <feature-value-name># ) || character-variant( <feature-value-name># ) || swash( <feature-value-name> ) || ornaments( <feature-value-name> ) || annotation( <feature-value-name> ) ]",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates"}],description:"For any given character, fonts can provide a variety of alternate glyphs in addition to the default glyph for that character. This property provides control over the selection of these alternate glyphs.",restrictions:["enum"]},{name:"font-variant-caps",browsers:["E79","FF34","S9.1","C52","O39"],values:[{name:"all-petite-caps",description:"Enables display of petite capitals for both upper and lowercase letters."},{name:"all-small-caps",description:"Enables display of small capitals for both upper and lowercase letters."},{name:"normal",description:"None of the features are enabled."},{name:"petite-caps",description:"Enables display of petite capitals."},{name:"small-caps",description:"Enables display of small capitals. Small-caps glyphs typically use the form of uppercase letters but are reduced to the size of lowercase letters."},{name:"titling-caps",description:"Enables display of titling capitals."},{name:"unicase",description:"Enables display of mixture of small capitals for uppercase letters with normal lowercase letters."}],syntax:"normal | small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-variant-caps"}],description:"Specifies control over capitalized forms.",restrictions:["enum"]},{name:"font-variant-east-asian",browsers:["E79","FF34","S9.1","C63","O50"],values:[{name:"full-width",description:"Enables rendering of full-width variants."},{name:"jis04",description:"Enables rendering of JIS04 forms."},{name:"jis78",description:"Enables rendering of JIS78 forms."},{name:"jis83",description:"Enables rendering of JIS83 forms."},{name:"jis90",description:"Enables rendering of JIS90 forms."},{name:"normal",description:"None of the features are enabled."},{name:"proportional-width",description:"Enables rendering of proportionally-spaced variants."},{name:"ruby",description:"Enables display of ruby variant glyphs."},{name:"simplified",description:"Enables rendering of simplified forms."},{name:"traditional",description:"Enables rendering of traditional forms."}],syntax:"normal | [ <east-asian-variant-values> || <east-asian-width-values> || ruby ]",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-variant-east-asian"}],description:"Allows control of glyph substitute and positioning in East Asian text.",restrictions:["enum"]},{name:"font-variant-ligatures",browsers:["E79","FF34","S9.1","C34","O21"],values:[{name:"additional-ligatures",description:"Enables display of additional ligatures."},{name:"common-ligatures",description:"Enables display of common ligatures."},{name:"contextual",browsers:["E79","FF34","S9.1","C34","O21"],description:"Enables display of contextual alternates."},{name:"discretionary-ligatures",description:"Enables display of discretionary ligatures."},{name:"historical-ligatures",description:"Enables display of historical ligatures."},{name:"no-additional-ligatures",description:"Disables display of additional ligatures."},{name:"no-common-ligatures",description:"Disables display of common ligatures."},{name:"no-contextual",browsers:["E79","FF34","S9.1","C34","O21"],description:"Disables display of contextual alternates."},{name:"no-discretionary-ligatures",description:"Disables display of discretionary ligatures."},{name:"no-historical-ligatures",description:"Disables display of historical ligatures."},{name:"none",browsers:["E79","FF34","S9.1","C34","O21"],description:"Disables all ligatures."},{name:"normal",description:"Implies that the defaults set by the font are used."}],syntax:"normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> ]",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-variant-ligatures"}],description:"Specifies control over which ligatures are enabled or disabled. A value of \u2018normal\u2019 implies that the defaults set by the font are used.",restrictions:["enum"]},{name:"font-variant-numeric",browsers:["E79","FF34","S9.1","C52","O39"],values:[{name:"diagonal-fractions",description:"Enables display of lining diagonal fractions."},{name:"lining-nums",description:"Enables display of lining numerals."},{name:"normal",description:"None of the features are enabled."},{name:"oldstyle-nums",description:"Enables display of old-style numerals."},{name:"ordinal",description:"Enables display of letter forms used with ordinal numbers."},{name:"proportional-nums",description:"Enables display of proportional numerals."},{name:"slashed-zero",description:"Enables display of slashed zeros."},{name:"stacked-fractions",description:"Enables display of lining stacked fractions."},{name:"tabular-nums",description:"Enables display of tabular numerals."}],syntax:"normal | [ <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero ]",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-variant-numeric"}],description:"Specifies control over numerical forms.",restrictions:["enum"]},{name:"font-variant-position",browsers:["FF34","S9.1"],values:[{name:"normal",description:"None of the features are enabled."},{name:"sub",description:"Enables display of subscript variants (OpenType feature: subs)."},{name:"super",description:"Enables display of superscript variants (OpenType feature: sups)."}],syntax:"normal | sub | super",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-variant-position"}],description:"Specifies the vertical position",restrictions:["enum"]},{name:"font-weight",values:[{name:"100",description:"Thin"},{name:"200",description:"Extra Light (Ultra Light)"},{name:"300",description:"Light"},{name:"400",description:"Normal"},{name:"500",description:"Medium"},{name:"600",description:"Semi Bold (Demi Bold)"},{name:"700",description:"Bold"},{name:"800",description:"Extra Bold (Ultra Bold)"},{name:"900",description:"Black (Heavy)"},{name:"bold",description:"Same as 700"},{name:"bolder",description:"Specifies the weight of the face bolder than the inherited value."},{name:"lighter",description:"Specifies the weight of the face lighter than the inherited value."},{name:"normal",description:"Same as 400"}],syntax:"<font-weight-absolute>{1,2}",relevance:94,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-weight"}],description:"Specifies weight of glyphs in the font, their degree of blackness or stroke thickness.",restrictions:["enum"]},{name:"glyph-orientation-horizontal",relevance:50,description:"Controls glyph orientation when the inline-progression-direction is horizontal.",restrictions:["angle","number"]},{name:"glyph-orientation-vertical",values:[{name:"auto",description:"Sets the orientation based on the fullwidth or non-fullwidth characters and the most common orientation."}],relevance:50,description:"Controls glyph orientation when the inline-progression-direction is vertical.",restrictions:["angle","number","enum"]},{name:"grid-area",browsers:["E16","FF52","S10.1","C57","O44"],values:[{name:"auto",description:"The property contributes nothing to the grid item\u2019s placement, indicating auto-placement, an automatic span, or a default span of one."},{name:"span",description:"Contributes a grid span to the grid item\u2019s placement such that the corresponding edge of the grid item\u2019s grid area is N lines from its opposite edge."}],syntax:"<grid-line> [ / <grid-line> ]{0,3}",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid-area"}],description:"Determine a grid item\u2019s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement. Shorthand for 'grid-row-start', 'grid-column-start', 'grid-row-end', and 'grid-column-end'.",restrictions:["identifier","integer"]},{name:"grid",browsers:["E16","FF52","S10.1","C57","O44"],syntax:"<'grid-template'> | <'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>? | [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid"}],description:"The grid CSS property is a shorthand property that sets all of the explicit grid properties ('grid-template-rows', 'grid-template-columns', and 'grid-template-areas'), and all the implicit grid properties ('grid-auto-rows', 'grid-auto-columns', and 'grid-auto-flow'), in a single declaration.",restrictions:["identifier","length","percentage","string","enum"]},{name:"grid-auto-columns",values:[{name:"min-content",description:"Represents the largest min-content contribution of the grid items occupying the grid track."},{name:"max-content",description:"Represents the largest max-content contribution of the grid items occupying the grid track."},{name:"auto",description:"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track."},{name:"minmax()",description:"Defines a size range greater than or equal to min and less than or equal to max."}],syntax:"<track-size>+",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid-auto-columns"}],description:"Specifies the size of implicitly created columns.",restrictions:["length","percentage"]},{name:"grid-auto-flow",browsers:["E16","FF52","S10.1","C57","O44"],values:[{name:"row",description:"The auto-placement algorithm places items by filling each row in turn, adding new rows as necessary."},{name:"column",description:"The auto-placement algorithm places items by filling each column in turn, adding new columns as necessary."},{name:"dense",description:"If specified, the auto-placement algorithm uses a \u201Cdense\u201D packing algorithm, which attempts to fill in holes earlier in the grid if smaller items come up later."}],syntax:"[ row | column ] || dense",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid-auto-flow"}],description:"Controls how the auto-placement algorithm works, specifying exactly how auto-placed items get flowed into the grid.",restrictions:["enum"]},{name:"grid-auto-rows",values:[{name:"min-content",description:"Represents the largest min-content contribution of the grid items occupying the grid track."},{name:"max-content",description:"Represents the largest max-content contribution of the grid items occupying the grid track."},{name:"auto",description:"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track."},{name:"minmax()",description:"Defines a size range greater than or equal to min and less than or equal to max."}],syntax:"<track-size>+",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid-auto-rows"}],description:"Specifies the size of implicitly created rows.",restrictions:["length","percentage"]},{name:"grid-column",browsers:["E16","FF52","S10.1","C57","O44"],values:[{name:"auto",description:"The property contributes nothing to the grid item\u2019s placement, indicating auto-placement, an automatic span, or a default span of one."},{name:"span",description:"Contributes a grid span to the grid item\u2019s placement such that the corresponding edge of the grid item\u2019s grid area is N lines from its opposite edge."}],syntax:"<grid-line> [ / <grid-line> ]?",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid-column"}],description:"Shorthand for 'grid-column-start' and 'grid-column-end'.",restrictions:["identifier","integer","enum"]},{name:"grid-column-end",browsers:["E16","FF52","S10.1","C57","O44"],values:[{name:"auto",description:"The property contributes nothing to the grid item\u2019s placement, indicating auto-placement, an automatic span, or a default span of one."},{name:"span",description:"Contributes a grid span to the grid item\u2019s placement such that the corresponding edge of the grid item\u2019s grid area is N lines from its opposite edge."}],syntax:"<grid-line>",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid-column-end"}],description:"Determine a grid item\u2019s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.",restrictions:["identifier","integer","enum"]},{name:"grid-column-gap",browsers:["FF52","C57","S10.1","O44"],status:"obsolete",syntax:"<length-percentage>",relevance:2,description:"Specifies the gutters between grid columns. Replaced by 'column-gap' property.",restrictions:["length"]},{name:"grid-column-start",browsers:["E16","FF52","S10.1","C57","O44"],values:[{name:"auto",description:"The property contributes nothing to the grid item\u2019s placement, indicating auto-placement, an automatic span, or a default span of one."},{name:"span",description:"Contributes a grid span to the grid item\u2019s placement such that the corresponding edge of the grid item\u2019s grid area is N lines from its opposite edge."}],syntax:"<grid-line>",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid-column-start"}],description:"Determine a grid item\u2019s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.",restrictions:["identifier","integer","enum"]},{name:"grid-gap",browsers:["FF52","C57","S10.1","O44"],status:"obsolete",syntax:"<'grid-row-gap'> <'grid-column-gap'>?",relevance:3,description:"Shorthand that specifies the gutters between grid columns and grid rows in one declaration. Replaced by 'gap' property.",restrictions:["length"]},{name:"grid-row",browsers:["E16","FF52","S10.1","C57","O44"],values:[{name:"auto",description:"The property contributes nothing to the grid item\u2019s placement, indicating auto-placement, an automatic span, or a default span of one."},{name:"span",description:"Contributes a grid span to the grid item\u2019s placement such that the corresponding edge of the grid item\u2019s grid area is N lines from its opposite edge."}],syntax:"<grid-line> [ / <grid-line> ]?",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid-row"}],description:"Shorthand for 'grid-row-start' and 'grid-row-end'.",restrictions:["identifier","integer","enum"]},{name:"grid-row-end",browsers:["E16","FF52","S10.1","C57","O44"],values:[{name:"auto",description:"The property contributes nothing to the grid item\u2019s placement, indicating auto-placement, an automatic span, or a default span of one."},{name:"span",description:"Contributes a grid span to the grid item\u2019s placement such that the corresponding edge of the grid item\u2019s grid area is N lines from its opposite edge."}],syntax:"<grid-line>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid-row-end"}],description:"Determine a grid item\u2019s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.",restrictions:["identifier","integer","enum"]},{name:"grid-row-gap",browsers:["FF52","C57","S10.1","O44"],status:"obsolete",syntax:"<length-percentage>",relevance:1,description:"Specifies the gutters between grid rows. Replaced by 'row-gap' property.",restrictions:["length"]},{name:"grid-row-start",browsers:["E16","FF52","S10.1","C57","O44"],values:[{name:"auto",description:"The property contributes nothing to the grid item\u2019s placement, indicating auto-placement, an automatic span, or a default span of one."},{name:"span",description:"Contributes a grid span to the grid item\u2019s placement such that the corresponding edge of the grid item\u2019s grid area is N lines from its opposite edge."}],syntax:"<grid-line>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid-row-start"}],description:"Determine a grid item\u2019s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.",restrictions:["identifier","integer","enum"]},{name:"grid-template",browsers:["E16","FF52","S10.1","C57","O44"],values:[{name:"none",description:"Sets all three properties to their initial values."},{name:"min-content",description:"Represents the largest min-content contribution of the grid items occupying the grid track."},{name:"max-content",description:"Represents the largest max-content contribution of the grid items occupying the grid track."},{name:"auto",description:"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track."},{name:"subgrid",description:"Sets 'grid-template-rows' and 'grid-template-columns' to 'subgrid', and 'grid-template-areas' to its initial value."},{name:"minmax()",description:"Defines a size range greater than or equal to min and less than or equal to max."},{name:"repeat()",description:"Represents a repeated fragment of the track list, allowing a large number of columns or rows that exhibit a recurring pattern to be written in a more compact form."}],syntax:"none | [ <'grid-template-rows'> / <'grid-template-columns'> ] | [ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <explicit-track-list> ]?",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid-template"}],description:"Shorthand for setting grid-template-columns, grid-template-rows, and grid-template-areas in a single declaration.",restrictions:["identifier","length","percentage","string","enum"]},{name:"grid-template-areas",browsers:["E16","FF52","S10.1","C57","O44"],values:[{name:"none",description:"The grid container doesn\u2019t define any named grid areas."}],syntax:"none | <string>+",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid-template-areas"}],description:"Specifies named grid areas, which are not associated with any particular grid item, but can be referenced from the grid-placement properties.",restrictions:["string"]},{name:"grid-template-columns",values:[{name:"none",description:"There is no explicit grid; any rows/columns will be implicitly generated."},{name:"min-content",description:"Represents the largest min-content contribution of the grid items occupying the grid track."},{name:"max-content",description:"Represents the largest max-content contribution of the grid items occupying the grid track."},{name:"auto",description:"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track."},{name:"subgrid",description:"Indicates that the grid will align to its parent grid in that axis."},{name:"minmax()",description:"Defines a size range greater than or equal to min and less than or equal to max."},{name:"repeat()",description:"Represents a repeated fragment of the track list, allowing a large number of columns or rows that exhibit a recurring pattern to be written in a more compact form."}],syntax:"none | <track-list> | <auto-track-list> | subgrid <line-name-list>?",relevance:58,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid-template-columns"}],description:"specifies, as a space-separated track list, the line names and track sizing functions of the grid.",restrictions:["identifier","length","percentage","enum"]},{name:"grid-template-rows",values:[{name:"none",description:"There is no explicit grid; any rows/columns will be implicitly generated."},{name:"min-content",description:"Represents the largest min-content contribution of the grid items occupying the grid track."},{name:"max-content",description:"Represents the largest max-content contribution of the grid items occupying the grid track."},{name:"auto",description:"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track."},{name:"subgrid",description:"Indicates that the grid will align to its parent grid in that axis."},{name:"minmax()",description:"Defines a size range greater than or equal to min and less than or equal to max."},{name:"repeat()",description:"Represents a repeated fragment of the track list, allowing a large number of columns or rows that exhibit a recurring pattern to be written in a more compact form."}],syntax:"none | <track-list> | <auto-track-list> | subgrid <line-name-list>?",relevance:54,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/grid-template-rows"}],description:"specifies, as a space-separated track list, the line names and track sizing functions of the grid.",restrictions:["identifier","length","percentage","string","enum"]},{name:"height",values:[{name:"auto",description:"The height depends on the values of other properties."},{name:"fit-content",description:"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode."},{name:"max-content",description:"Use the max-content inline size or max-content block size, as appropriate to the writing mode."},{name:"min-content",description:"Use the min-content inline size or min-content block size, as appropriate to the writing mode."}],syntax:"<viewport-length>{1,2}",relevance:96,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/height"}],description:"Specifies the height of the content area, padding area or border area (depending on 'box-sizing') of certain boxes.",restrictions:["length","percentage"]},{name:"hyphens",values:[{name:"auto",description:"Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word."},{name:"manual",description:"Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities"},{name:"none",description:"Words are not broken at line breaks, even if characters inside the word suggest line break points."}],syntax:"none | manual | auto",relevance:55,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/hyphens"}],description:"Controls whether hyphenation is allowed to create more break opportunities within a line of text.",restrictions:["enum"]},{name:"image-orientation",browsers:["E81","FF26","S13.1","C81","O67"],values:[{name:"flip",description:"After rotating by the precededing angle, the image is flipped horizontally. Defaults to 0deg if the angle is ommitted."},{name:"from-image",description:"If the image has an orientation specified in its metadata, such as EXIF, this value computes to the angle that the metadata specifies is necessary to correctly orient the image."}],syntax:"from-image | <angle> | [ <angle>? flip ]",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/image-orientation"}],description:"Specifies an orthogonal rotation to be applied to an image before it is laid out.",restrictions:["angle"]},{name:"image-rendering",browsers:["E79","FF3.6","S6","C13","O15"],values:[{name:"auto",description:"The image should be scaled with an algorithm that maximizes the appearance of the image."},{name:"crisp-edges",description:"The image must be scaled with an algorithm that preserves contrast and edges in the image, and which does not smooth colors or introduce blur to the image in the process."},{name:"-moz-crisp-edges",browsers:["E79","FF3.6","S6","C13","O15"]},{name:"optimizeQuality",description:"Deprecated."},{name:"optimizeSpeed",description:"Deprecated."},{name:"pixelated",description:"When scaling the image up, the 'nearest neighbor' or similar algorithm must be used, so that the image appears to be simply composed of very large pixels."}],syntax:"auto | crisp-edges | pixelated",relevance:54,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/image-rendering"}],description:"Provides a hint to the user-agent about what aspects of an image are most important to preserve when the image is scaled, to aid the user-agent in the choice of an appropriate scaling algorithm.",restrictions:["enum"]},{name:"ime-mode",browsers:["E12","FF3","IE5"],values:[{name:"active",description:"The input method editor is initially active; text entry is performed using it unless the user specifically dismisses it."},{name:"auto",description:"No change is made to the current input method editor state. This is the default."},{name:"disabled",description:"The input method editor is disabled and may not be activated by the user."},{name:"inactive",description:"The input method editor is initially inactive, but the user may activate it if they wish."},{name:"normal",description:"The IME state should be normal; this value can be used in a user style sheet to override the page setting."}],status:"obsolete",syntax:"auto | normal | active | inactive | disabled",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/ime-mode"}],description:"Controls the state of the input method editor for text fields.",restrictions:["enum"]},{name:"inline-size",browsers:["E79","FF41","S12.1","C57","O44"],values:[{name:"auto",description:"Depends on the values of other properties."}],syntax:"<'width'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/inline-size"}],description:"Size of an element in the direction specified by 'writing-mode'.",restrictions:["length","percentage"]},{name:"isolation",browsers:["E79","FF36","S8","C41","O30"],values:[{name:"auto",description:"Elements are not isolated unless an operation is applied that causes the creation of a stacking context."},{name:"isolate",description:"In CSS will turn the element into a stacking context."}],syntax:"auto | isolate",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/isolation"}],description:"In CSS setting to 'isolate' will turn the element into a stacking context. In SVG, it defines whether an element is isolated or not.",restrictions:["enum"]},{name:"justify-content",values:[{name:"center",description:"Flex items are packed toward the center of the line."},{name:"start",description:"The items are packed flush to each other toward the start edge of the alignment container in the main axis."},{name:"end",description:"The items are packed flush to each other toward the end edge of the alignment container in the main axis."},{name:"left",description:"The items are packed flush to each other toward the left edge of the alignment container in the main axis."},{name:"right",description:"The items are packed flush to each other toward the right edge of the alignment container in the main axis."},{name:"safe",description:"If the size of the item overflows the alignment container, the item is instead aligned as if the alignment mode were start."},{name:"unsafe",description:"Regardless of the relative sizes of the item and alignment container, the given alignment value is honored."},{name:"stretch",description:"If the combined size of the alignment subjects is less than the size of the alignment container, any auto-sized alignment subjects have their size increased equally (not proportionally), while still respecting the constraints imposed by max-height/max-width (or equivalent functionality), so that the combined size exactly fills the alignment container."},{name:"space-evenly",description:"The items are evenly distributed within the alignment container along the main axis."},{name:"flex-end",description:"Flex items are packed toward the end of the line."},{name:"flex-start",description:"Flex items are packed toward the start of the line."},{name:"space-around",description:"Flex items are evenly distributed in the line, with half-size spaces on either end."},{name:"space-between",description:"Flex items are evenly distributed in the line."},{name:"baseline",description:"Specifies participation in first-baseline alignment."},{name:"first baseline",description:"Specifies participation in first-baseline alignment."},{name:"last baseline",description:"Specifies participation in last-baseline alignment."}],syntax:"normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ]",relevance:85,description:"Aligns flex items along the main axis of the current line of the flex container.",restrictions:["enum"]},{name:"kerning",values:[{name:"auto",description:"Indicates that the user agent should adjust inter-glyph spacing based on kerning tables that are included in the font that will be used."}],relevance:50,description:"Indicates whether the user agent should adjust inter-glyph spacing based on kerning tables that are included in the relevant font or instead disable auto-kerning and set inter-character spacing to a specific length.",restrictions:["length","enum"]},{name:"left",values:[{name:"auto",description:"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well"}],syntax:"<length> | <percentage> | auto",relevance:95,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/left"}],description:"Specifies how far an absolutely positioned box's left margin edge is offset to the right of the left edge of the box's 'containing block'.",restrictions:["length","percentage"]},{name:"letter-spacing",values:[{name:"normal",description:"The spacing is the normal spacing for the current font. It is typically zero-length."}],syntax:"normal | <length>",relevance:81,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/letter-spacing"}],description:"Specifies the minimum, maximum, and optimal spacing between grapheme clusters.",restrictions:["length"]},{name:"lighting-color",browsers:["E","C5","FF3","IE10","O9","S6"],relevance:50,description:"Defines the color of the light source for filter primitives 'feDiffuseLighting' and 'feSpecularLighting'.",restrictions:["color"]},{name:"line-break",values:[{name:"auto",description:"The UA determines the set of line-breaking restrictions to use for CJK scripts, and it may vary the restrictions based on the length of the line; e.g., use a less restrictive set of line-break rules for short lines."},{name:"loose",description:"Breaks text using the least restrictive set of line-breaking rules. Typically used for short lines, such as in newspapers."},{name:"normal",description:"Breaks text using the most common set of line-breaking rules."},{name:"strict",description:"Breaks CJK scripts using a more restrictive set of line-breaking rules than 'normal'."}],syntax:"auto | loose | normal | strict | anywhere",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/line-break"}],description:"Specifies what set of line breaking restrictions are in effect within the element.",restrictions:["enum"]},{name:"line-height",values:[{name:"normal",description:"Tells user agents to set the computed value to a 'reasonable' value based on the font size of the element."}],syntax:"normal | <number> | <length> | <percentage>",relevance:93,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/line-height"}],description:"Determines the block-progression dimension of the text content area of an inline box.",restrictions:["number","length","percentage"]},{name:"list-style",values:[{name:"armenian"},{name:"circle",description:"A hollow circle."},{name:"decimal"},{name:"decimal-leading-zero"},{name:"disc",description:"A filled circle."},{name:"georgian"},{name:"inside",description:"The marker box is outside the principal block box, as described in the section on the ::marker pseudo-element below."},{name:"lower-alpha"},{name:"lower-greek"},{name:"lower-latin"},{name:"lower-roman"},{name:"none"},{name:"outside",description:"The ::marker pseudo-element is an inline element placed immediately before all ::before pseudo-elements in the principal block box, after which the element's content flows."},{name:"square",description:"A filled square."},{name:"symbols()",description:"Allows a counter style to be defined inline."},{name:"upper-alpha"},{name:"upper-latin"},{name:"upper-roman"},{name:"url()"}],syntax:"<'list-style-type'> || <'list-style-position'> || <'list-style-image'>",relevance:85,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/list-style"}],description:"Shorthand for setting 'list-style-type', 'list-style-position' and 'list-style-image'",restrictions:["image","enum","url"]},{name:"list-style-image",values:[{name:"none",description:"The default contents of the of the list item\u2019s marker are given by 'list-style-type' instead."}],syntax:"<image> | none",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/list-style-image"}],description:"Sets the image that will be used as the list item marker. When the image is available, it will replace the marker set with the 'list-style-type' marker.",restrictions:["image"]},{name:"list-style-position",values:[{name:"inside",description:"The marker box is outside the principal block box, as described in the section on the ::marker pseudo-element below."},{name:"outside",description:"The ::marker pseudo-element is an inline element placed immediately before all ::before pseudo-elements in the principal block box, after which the element's content flows."}],syntax:"inside | outside",relevance:55,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/list-style-position"}],description:"Specifies the position of the '::marker' pseudo-element's box in the list item.",restrictions:["enum"]},{name:"list-style-type",values:[{name:"armenian",description:"Traditional uppercase Armenian numbering."},{name:"circle",description:"A hollow circle."},{name:"decimal",description:"Western decimal numbers."},{name:"decimal-leading-zero",description:"Decimal numbers padded by initial zeros."},{name:"disc",description:"A filled circle."},{name:"georgian",description:"Traditional Georgian numbering."},{name:"lower-alpha",description:"Lowercase ASCII letters."},{name:"lower-greek",description:"Lowercase classical Greek."},{name:"lower-latin",description:"Lowercase ASCII letters."},{name:"lower-roman",description:"Lowercase ASCII Roman numerals."},{name:"none",description:"No marker"},{name:"square",description:"A filled square."},{name:"symbols()",description:"Allows a counter style to be defined inline."},{name:"upper-alpha",description:"Uppercase ASCII letters."},{name:"upper-latin",description:"Uppercase ASCII letters."},{name:"upper-roman",description:"Uppercase ASCII Roman numerals."}],syntax:"<counter-style> | <string> | none",relevance:75,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/list-style-type"}],description:"Used to construct the default contents of a list item\u2019s marker",restrictions:["enum","string"]},{name:"margin",values:[{name:"auto"}],syntax:"[ <length> | <percentage> | auto ]{1,4}",relevance:96,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/margin"}],description:"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits.",restrictions:["length","percentage"]},{name:"margin-block-end",browsers:["E79","FF41","S12.1","C69","O56"],values:[{name:"auto"}],syntax:"<'margin-left'>",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/margin-block-end"}],description:"Logical 'margin-bottom'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","percentage"]},{name:"margin-block-start",browsers:["E79","FF41","S12.1","C69","O56"],values:[{name:"auto"}],syntax:"<'margin-left'>",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/margin-block-start"}],description:"Logical 'margin-top'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","percentage"]},{name:"margin-bottom",values:[{name:"auto"}],syntax:"<length> | <percentage> | auto",relevance:92,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/margin-bottom"}],description:"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..",restrictions:["length","percentage"]},{name:"margin-inline-end",browsers:["E79","FF41","S12.1","C69","O56"],values:[{name:"auto"}],syntax:"<'margin-left'>",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/margin-inline-end"}],description:"Logical 'margin-right'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","percentage"]},{name:"margin-inline-start",browsers:["E79","FF41","S12.1","C69","O56"],values:[{name:"auto"}],syntax:"<'margin-left'>",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/margin-inline-start"}],description:"Logical 'margin-left'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","percentage"]},{name:"margin-left",values:[{name:"auto"}],syntax:"<length> | <percentage> | auto",relevance:92,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/margin-left"}],description:"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..",restrictions:["length","percentage"]},{name:"margin-right",values:[{name:"auto"}],syntax:"<length> | <percentage> | auto",relevance:91,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/margin-right"}],description:"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..",restrictions:["length","percentage"]},{name:"margin-top",values:[{name:"auto"}],syntax:"<length> | <percentage> | auto",relevance:95,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/margin-top"}],description:"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..",restrictions:["length","percentage"]},{name:"marker",values:[{name:"none",description:"Indicates that no marker symbol will be drawn at the given vertex or vertices."},{name:"url()",description:"Indicates that the <marker> element referenced will be used."}],relevance:50,description:"Specifies the marker symbol that shall be used for all points on the sets the value for all vertices on the given \u2018path\u2019 element or basic shape.",restrictions:["url"]},{name:"marker-end",values:[{name:"none",description:"Indicates that no marker symbol will be drawn at the given vertex or vertices."},{name:"url()",description:"Indicates that the <marker> element referenced will be used."}],relevance:50,description:"Specifies the marker that will be drawn at the last vertices of the given markable element.",restrictions:["url"]},{name:"marker-mid",values:[{name:"none",description:"Indicates that no marker symbol will be drawn at the given vertex or vertices."},{name:"url()",description:"Indicates that the <marker> element referenced will be used."}],relevance:50,description:"Specifies the marker that will be drawn at all vertices except the first and last.",restrictions:["url"]},{name:"marker-start",values:[{name:"none",description:"Indicates that no marker symbol will be drawn at the given vertex or vertices."},{name:"url()",description:"Indicates that the <marker> element referenced will be used."}],relevance:50,description:"Specifies the marker that will be drawn at the first vertices of the given markable element.",restrictions:["url"]},{name:"mask-image",browsers:["E79","FF53","S15.4","C1","O15"],values:[{name:"none",description:"Counts as a transparent black image layer."},{name:"url()",description:"Reference to a <mask element or to a CSS image."}],syntax:"<mask-reference>#",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-image"}],description:"Sets the mask layer image of an element.",restrictions:["url","image","enum"]},{name:"mask-mode",browsers:["FF53","S15.4"],values:[{name:"alpha",description:"Alpha values of the mask layer image should be used as the mask values."},{name:"auto",description:"Use alpha values if 'mask-image' is an image, luminance if a <mask> element or a CSS image."},{name:"luminance",description:"Luminance values of the mask layer image should be used as the mask values."}],syntax:"<masking-mode>#",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-mode"}],description:"Indicates whether the mask layer image is treated as luminance mask or alpha mask.",restrictions:["url","image","enum"]},{name:"mask-origin",browsers:["E79","FF53","S15.4","C1","O15"],syntax:"<geometry-box>#",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-origin"}],description:"Specifies the mask positioning area.",restrictions:["geometry-box","enum"]},{name:"mask-position",browsers:["E79","FF53","S15.4","C1","O15"],syntax:"<position>#",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-position"}],description:"Specifies how mask layer images are positioned.",restrictions:["position","length","percentage"]},{name:"mask-repeat",browsers:["E79","FF53","S15.4","C1","O15"],syntax:"<repeat-style>#",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-repeat"}],description:"Specifies how mask layer images are tiled after they have been sized and positioned.",restrictions:["repeat"]},{name:"mask-size",browsers:["E79","FF53","S15.4","C4","O15"],values:[{name:"auto",description:"Resolved by using the image\u2019s intrinsic ratio and the size of the other dimension, or failing that, using the image\u2019s intrinsic size, or failing that, treating it as 100%."},{name:"contain",description:"Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area."},{name:"cover",description:"Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area."}],syntax:"<bg-size>#",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-size"}],description:"Specifies the size of the mask layer images.",restrictions:["length","percentage","enum"]},{name:"mask-type",browsers:["E79","FF35","S7","C24","O15"],values:[{name:"alpha",description:"Indicates that the alpha values of the mask should be used."},{name:"luminance",description:"Indicates that the luminance values of the mask should be used."}],syntax:"luminance | alpha",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-type"}],description:"Defines whether the content of the <mask> element is treated as as luminance mask or alpha mask.",restrictions:["enum"]},{name:"max-block-size",browsers:["E79","FF41","S12.1","C57","O44"],values:[{name:"none",description:"No limit on the width of the box."}],syntax:"<'max-width'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/max-block-size"}],description:"Maximum size of an element in the direction opposite that of the direction specified by 'writing-mode'.",restrictions:["length","percentage"]},{name:"max-height",values:[{name:"none",description:"No limit on the height of the box."},{name:"fit-content",description:"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode."},{name:"max-content",description:"Use the max-content inline size or max-content block size, as appropriate to the writing mode."},{name:"min-content",description:"Use the min-content inline size or min-content block size, as appropriate to the writing mode."}],syntax:"<viewport-length>",relevance:85,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/max-height"}],description:"Allows authors to constrain content height to a certain range.",restrictions:["length","percentage"]},{name:"max-inline-size",browsers:["E79","FF41","S12.1","C57","O44"],values:[{name:"none",description:"No limit on the height of the box."}],syntax:"<'max-width'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/max-inline-size"}],description:"Maximum size of an element in the direction specified by 'writing-mode'.",restrictions:["length","percentage"]},{name:"max-width",values:[{name:"none",description:"No limit on the width of the box."},{name:"fit-content",description:"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode."},{name:"max-content",description:"Use the max-content inline size or max-content block size, as appropriate to the writing mode."},{name:"min-content",description:"Use the min-content inline size or min-content block size, as appropriate to the writing mode."}],syntax:"<viewport-length>",relevance:91,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/max-width"}],description:"Allows authors to constrain content width to a certain range.",restrictions:["length","percentage"]},{name:"min-block-size",browsers:["E79","FF41","S12.1","C57","O44"],syntax:"<'min-width'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/min-block-size"}],description:"Minimal size of an element in the direction opposite that of the direction specified by 'writing-mode'.",restrictions:["length","percentage"]},{name:"min-height",values:[{name:"auto"},{name:"fit-content",description:"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode."},{name:"max-content",description:"Use the max-content inline size or max-content block size, as appropriate to the writing mode."},{name:"min-content",description:"Use the min-content inline size or min-content block size, as appropriate to the writing mode."}],syntax:"<viewport-length>",relevance:90,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/min-height"}],description:"Allows authors to constrain content height to a certain range.",restrictions:["length","percentage"]},{name:"min-inline-size",browsers:["E79","FF41","S12.1","C57","O44"],syntax:"<'min-width'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/min-inline-size"}],description:"Minimal size of an element in the direction specified by 'writing-mode'.",restrictions:["length","percentage"]},{name:"min-width",values:[{name:"auto"},{name:"fit-content",description:"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode."},{name:"max-content",description:"Use the max-content inline size or max-content block size, as appropriate to the writing mode."},{name:"min-content",description:"Use the min-content inline size or min-content block size, as appropriate to the writing mode."}],syntax:"<viewport-length>",relevance:88,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/min-width"}],description:"Allows authors to constrain content width to a certain range.",restrictions:["length","percentage"]},{name:"mix-blend-mode",browsers:["E79","FF32","S8","C41","O28"],values:[{name:"normal",description:"Default attribute which specifies no blending"},{name:"multiply",description:"The source color is multiplied by the destination color and replaces the destination."},{name:"screen",description:"Multiplies the complements of the backdrop and source color values, then complements the result."},{name:"overlay",description:"Multiplies or screens the colors, depending on the backdrop color value."},{name:"darken",description:"Selects the darker of the backdrop and source colors."},{name:"lighten",description:"Selects the lighter of the backdrop and source colors."},{name:"color-dodge",description:"Brightens the backdrop color to reflect the source color."},{name:"color-burn",description:"Darkens the backdrop color to reflect the source color."},{name:"hard-light",description:"Multiplies or screens the colors, depending on the source color value."},{name:"soft-light",description:"Darkens or lightens the colors, depending on the source color value."},{name:"difference",description:"Subtracts the darker of the two constituent colors from the lighter color.."},{name:"exclusion",description:"Produces an effect similar to that of the Difference mode but lower in contrast."},{name:"hue",browsers:["E79","FF32","S8","C41","O28"],description:"Creates a color with the hue of the source color and the saturation and luminosity of the backdrop color."},{name:"saturation",browsers:["E79","FF32","S8","C41","O28"],description:"Creates a color with the saturation of the source color and the hue and luminosity of the backdrop color."},{name:"color",browsers:["E79","FF32","S8","C41","O28"],description:"Creates a color with the hue and saturation of the source color and the luminosity of the backdrop color."},{name:"luminosity",browsers:["E79","FF32","S8","C41","O28"],description:"Creates a color with the luminosity of the source color and the hue and saturation of the backdrop color."}],syntax:"<blend-mode>",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mix-blend-mode"}],description:"Defines the formula that must be used to mix the colors with the backdrop.",restrictions:["enum"]},{name:"motion",browsers:["C46","O33"],values:[{name:"none",description:"No motion path gets created."},{name:"path()",description:"Defines an SVG path as a string, with optional 'fill-rule' as the first argument."},{name:"auto",description:"Indicates that the object is rotated by the angle of the direction of the motion path."},{name:"reverse",description:"Indicates that the object is rotated by the angle of the direction of the motion path plus 180 degrees."}],relevance:50,description:"Shorthand property for setting 'motion-path', 'motion-offset' and 'motion-rotation'.",restrictions:["url","length","percentage","angle","shape","geometry-box","enum"]},{name:"motion-offset",browsers:["C46","O33"],relevance:50,description:"A distance that describes the position along the specified motion path.",restrictions:["length","percentage"]},{name:"motion-path",browsers:["C46","O33"],values:[{name:"none",description:"No motion path gets created."},{name:"path()",description:"Defines an SVG path as a string, with optional 'fill-rule' as the first argument."}],relevance:50,description:"Specifies the motion path the element gets positioned at.",restrictions:["url","shape","geometry-box","enum"]},{name:"motion-rotation",browsers:["C46","O33"],values:[{name:"auto",description:"Indicates that the object is rotated by the angle of the direction of the motion path."},{name:"reverse",description:"Indicates that the object is rotated by the angle of the direction of the motion path plus 180 degrees."}],relevance:50,description:"Defines the direction of the element while positioning along the motion path.",restrictions:["angle"]},{name:"-moz-animation",browsers:["FF9"],values:[{name:"alternate",description:"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."},{name:"alternate-reverse",description:"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."},{name:"backwards",description:"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."},{name:"both",description:"Both forwards and backwards fill modes are applied."},{name:"forwards",description:"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."},{name:"infinite",description:"Causes the animation to repeat forever."},{name:"none",description:"No animation is performed"},{name:"normal",description:"Normal playback."},{name:"reverse",description:"All iterations of the animation are played in the reverse direction from the way they were specified."}],relevance:50,description:"Shorthand property combines six of the animation properties into a single property.",restrictions:["time","enum","timing-function","identifier","number"]},{name:"-moz-animation-delay",browsers:["FF9"],relevance:50,description:"Defines when the animation will start.",restrictions:["time"]},{name:"-moz-animation-direction",browsers:["FF9"],values:[{name:"alternate",description:"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."},{name:"alternate-reverse",description:"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."},{name:"normal",description:"Normal playback."},{name:"reverse",description:"All iterations of the animation are played in the reverse direction from the way they were specified."}],relevance:50,description:"Defines whether or not the animation should play in reverse on alternate cycles.",restrictions:["enum"]},{name:"-moz-animation-duration",browsers:["FF9"],relevance:50,description:"Defines the length of time that an animation takes to complete one cycle.",restrictions:["time"]},{name:"-moz-animation-iteration-count",browsers:["FF9"],values:[{name:"infinite",description:"Causes the animation to repeat forever."}],relevance:50,description:"Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.",restrictions:["number","enum"]},{name:"-moz-animation-name",browsers:["FF9"],values:[{name:"none",description:"No animation is performed"}],relevance:50,description:"Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.",restrictions:["identifier","enum"]},{name:"-moz-animation-play-state",browsers:["FF9"],values:[{name:"paused",description:"A running animation will be paused."},{name:"running",description:"Resume playback of a paused animation."}],relevance:50,description:"Defines whether the animation is running or paused.",restrictions:["enum"]},{name:"-moz-animation-timing-function",browsers:["FF9"],relevance:50,description:"Describes how the animation will progress over one cycle of its duration. See the 'transition-timing-function'.",restrictions:["timing-function"]},{name:"-moz-appearance",browsers:["FF1"],values:[{name:"button"},{name:"button-arrow-down"},{name:"button-arrow-next"},{name:"button-arrow-previous"},{name:"button-arrow-up"},{name:"button-bevel"},{name:"checkbox"},{name:"checkbox-container"},{name:"checkbox-label"},{name:"dialog"},{name:"groupbox"},{name:"listbox"},{name:"menuarrow"},{name:"menuimage"},{name:"menuitem"},{name:"menuitemtext"},{name:"menulist"},{name:"menulist-button"},{name:"menulist-text"},{name:"menulist-textfield"},{name:"menupopup"},{name:"menuradio"},{name:"menuseparator"},{name:"-moz-mac-unified-toolbar"},{name:"-moz-win-borderless-glass"},{name:"-moz-win-browsertabbar-toolbox"},{name:"-moz-win-communications-toolbox"},{name:"-moz-win-glass"},{name:"-moz-win-media-toolbox"},{name:"none"},{name:"progressbar"},{name:"progresschunk"},{name:"radio"},{name:"radio-container"},{name:"radio-label"},{name:"radiomenuitem"},{name:"resizer"},{name:"resizerpanel"},{name:"scrollbarbutton-down"},{name:"scrollbarbutton-left"},{name:"scrollbarbutton-right"},{name:"scrollbarbutton-up"},{name:"scrollbar-small"},{name:"scrollbartrack-horizontal"},{name:"scrollbartrack-vertical"},{name:"separator"},{name:"spinner"},{name:"spinner-downbutton"},{name:"spinner-textfield"},{name:"spinner-upbutton"},{name:"statusbar"},{name:"statusbarpanel"},{name:"tab"},{name:"tabpanels"},{name:"tab-scroll-arrow-back"},{name:"tab-scroll-arrow-forward"},{name:"textfield"},{name:"textfield-multiline"},{name:"toolbar"},{name:"toolbox"},{name:"tooltip"},{name:"treeheadercell"},{name:"treeheadersortarrow"},{name:"treeitem"},{name:"treetwistyopen"},{name:"treeview"},{name:"treewisty"},{name:"window"}],status:"nonstandard",syntax:"none | button | button-arrow-down | button-arrow-next | button-arrow-previous | button-arrow-up | button-bevel | button-focus | caret | checkbox | checkbox-container | checkbox-label | checkmenuitem | dualbutton | groupbox | listbox | listitem | menuarrow | menubar | menucheckbox | menuimage | menuitem | menuitemtext | menulist | menulist-button | menulist-text | menulist-textfield | menupopup | menuradio | menuseparator | meterbar | meterchunk | progressbar | progressbar-vertical | progresschunk | progresschunk-vertical | radio | radio-container | radio-label | radiomenuitem | range | range-thumb | resizer | resizerpanel | scale-horizontal | scalethumbend | scalethumb-horizontal | scalethumbstart | scalethumbtick | scalethumb-vertical | scale-vertical | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | separator | sheet | spinner | spinner-downbutton | spinner-textfield | spinner-upbutton | splitter | statusbar | statusbarpanel | tab | tabpanel | tabpanels | tab-scroll-arrow-back | tab-scroll-arrow-forward | textfield | textfield-multiline | toolbar | toolbarbutton | toolbarbutton-dropdown | toolbargripper | toolbox | tooltip | treeheader | treeheadercell | treeheadersortarrow | treeitem | treeline | treetwisty | treetwistyopen | treeview | -moz-mac-unified-toolbar | -moz-win-borderless-glass | -moz-win-browsertabbar-toolbox | -moz-win-communicationstext | -moz-win-communications-toolbox | -moz-win-exclude-glass | -moz-win-glass | -moz-win-mediatext | -moz-win-media-toolbox | -moz-window-button-box | -moz-window-button-box-maximized | -moz-window-button-close | -moz-window-button-maximize | -moz-window-button-minimize | -moz-window-button-restore | -moz-window-frame-bottom | -moz-window-frame-left | -moz-window-frame-right | -moz-window-titlebar | -moz-window-titlebar-maximized",relevance:0,description:"Used in Gecko (Firefox) to display an element using a platform-native styling based on the operating system's theme.",restrictions:["enum"]},{name:"-moz-backface-visibility",browsers:["FF10"],values:[{name:"hidden"},{name:"visible"}],relevance:50,description:"Determines whether or not the 'back' side of a transformed element is visible when facing the viewer. With an identity transform, the front side of an element faces the viewer.",restrictions:["enum"]},{name:"-moz-background-clip",browsers:["FF1-3.6"],values:[{name:"padding"}],relevance:50,description:"Determines the background painting area.",restrictions:["box","enum"]},{name:"-moz-background-inline-policy",browsers:["FF1"],values:[{name:"bounding-box"},{name:"continuous"},{name:"each-box"}],relevance:50,description:"In Gecko-based applications like Firefox, the -moz-background-inline-policy CSS property specifies how the background image of an inline element is determined when the content of the inline element wraps onto multiple lines. The choice of position has significant effects on repetition.",restrictions:["enum"]},{name:"-moz-background-origin",browsers:["FF1"],relevance:50,description:"For elements rendered as a single box, specifies the background positioning area. For elements rendered as multiple boxes (e.g., inline boxes on several lines, boxes on several pages) specifies which boxes 'box-decoration-break' operates on to determine the background positioning area(s).",restrictions:["box"]},{name:"-moz-border-bottom-colors",browsers:["FF1"],status:"nonstandard",syntax:"<color>+ | none",relevance:0,description:"Sets a list of colors for the bottom border.",restrictions:["color"]},{name:"-moz-border-image",browsers:["FF3.6"],values:[{name:"auto",description:"If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead."},{name:"fill",description:"Causes the middle part of the border-image to be preserved."},{name:"none"},{name:"repeat",description:"The image is tiled (repeated) to fill the area."},{name:"round",description:"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does."},{name:"space",description:"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles."},{name:"stretch",description:"The image is stretched to fill the area."},{name:"url()"}],relevance:50,description:"Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.",restrictions:["length","percentage","number","url","enum"]},{name:"-moz-border-left-colors",browsers:["FF1"],status:"nonstandard",syntax:"<color>+ | none",relevance:0,description:"Sets a list of colors for the bottom border.",restrictions:["color"]},{name:"-moz-border-right-colors",browsers:["FF1"],status:"nonstandard",syntax:"<color>+ | none",relevance:0,description:"Sets a list of colors for the bottom border.",restrictions:["color"]},{name:"-moz-border-top-colors",browsers:["FF1"],status:"nonstandard",syntax:"<color>+ | none",relevance:0,description:"Ske Firefox, -moz-border-bottom-colors sets a list of colors for the bottom border.",restrictions:["color"]},{name:"-moz-box-align",browsers:["FF1"],values:[{name:"baseline",description:"If this box orientation is inline-axis or horizontal, all children are placed with their baselines aligned, and extra space placed before or after as necessary. For block flows, the baseline of the first non-empty line box located within the element is used. For tables, the baseline of the first cell is used."},{name:"center",description:"Any extra space is divided evenly, with half placed above the child and the other half placed after the child."},{name:"end",description:"For normal direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element. For reverse direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element."},{name:"start",description:"For normal direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element. For reverse direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element."},{name:"stretch",description:"The height of each child is adjusted to that of the containing block."}],relevance:50,description:"Specifies how a XUL box aligns its contents across (perpendicular to) the direction of its layout. The effect of this is only visible if there is extra space in the box.",restrictions:["enum"]},{name:"-moz-box-direction",browsers:["FF1"],values:[{name:"normal",description:"A box with a computed value of horizontal for box-orient displays its children from left to right. A box with a computed value of vertical displays its children from top to bottom."},{name:"reverse",description:"A box with a computed value of horizontal for box-orient displays its children from right to left. A box with a computed value of vertical displays its children from bottom to top."}],relevance:50,description:"Specifies whether a box lays out its contents normally (from the top or left edge), or in reverse (from the bottom or right edge).",restrictions:["enum"]},{name:"-moz-box-flex",browsers:["FF1"],relevance:50,description:"Specifies how a box grows to fill the box that contains it, in the direction of the containing box's layout.",restrictions:["number"]},{name:"-moz-box-flexgroup",browsers:["FF1"],relevance:50,description:"Flexible elements can be assigned to flex groups using the 'box-flex-group' property.",restrictions:["integer"]},{name:"-moz-box-ordinal-group",browsers:["FF1"],relevance:50,description:"Indicates the ordinal group the element belongs to. Elements with a lower ordinal group are displayed before those with a higher ordinal group.",restrictions:["integer"]},{name:"-moz-box-orient",browsers:["FF1"],values:[{name:"block-axis",description:"Elements are oriented along the box's axis."},{name:"horizontal",description:"The box displays its children from left to right in a horizontal line."},{name:"inline-axis",description:"Elements are oriented vertically."},{name:"vertical",description:"The box displays its children from stacked from top to bottom vertically."}],relevance:50,description:"In Mozilla applications, -moz-box-orient specifies whether a box lays out its contents horizontally or vertically.",restrictions:["enum"]},{name:"-moz-box-pack",browsers:["FF1"],values:[{name:"center",description:"The extra space is divided evenly, with half placed before the first child and the other half placed after the last child."},{name:"end",description:"For normal direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child. For reverse direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child."},{name:"justify",description:"The space is divided evenly in-between each child, with none of the extra space placed before the first child or after the last child. If there is only one child, treat the pack value as if it were start."},{name:"start",description:"For normal direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child. For reverse direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child."}],relevance:50,description:"Specifies how a box packs its contents in the direction of its layout. The effect of this is only visible if there is extra space in the box.",restrictions:["enum"]},{name:"-moz-box-sizing",browsers:["FF1"],values:[{name:"border-box",description:"The specified width and height (and respective min/max properties) on this element determine the border box of the element."},{name:"content-box",description:"Behavior of width and height as specified by CSS2.1. The specified width and height (and respective min/max properties) apply to the width and height respectively of the content box of the element."},{name:"padding-box",description:"The specified width and height (and respective min/max properties) on this element determine the padding box of the element."}],relevance:50,description:"Box Model addition in CSS3.",restrictions:["enum"]},{name:"-moz-column-count",browsers:["FF3.5"],values:[{name:"auto",description:"Determines the number of columns by the 'column-width' property and the element width."}],relevance:50,description:"Describes the optimal number of columns into which the content of the element will be flowed.",restrictions:["integer"]},{name:"-moz-column-gap",browsers:["FF3.5"],values:[{name:"normal",description:"User agent specific and typically equivalent to 1em."}],relevance:50,description:"Sets the gap between columns. If there is a column rule between columns, it will appear in the middle of the gap.",restrictions:["length"]},{name:"-moz-column-rule",browsers:["FF3.5"],relevance:50,description:"Shorthand for setting 'column-rule-width', 'column-rule-style', and 'column-rule-color' at the same place in the style sheet. Omitted values are set to their initial values.",restrictions:["length","line-width","line-style","color"]},{name:"-moz-column-rule-color",browsers:["FF3.5"],relevance:50,description:"Sets the color of the column rule",restrictions:["color"]},{name:"-moz-column-rule-style",browsers:["FF3.5"],relevance:50,description:"Sets the style of the rule between columns of an element.",restrictions:["line-style"]},{name:"-moz-column-rule-width",browsers:["FF3.5"],relevance:50,description:"Sets the width of the rule between columns. Negative values are not allowed.",restrictions:["length","line-width"]},{name:"-moz-columns",browsers:["FF9"],values:[{name:"auto",description:"The width depends on the values of other properties."}],relevance:50,description:"A shorthand property which sets both 'column-width' and 'column-count'.",restrictions:["length","integer"]},{name:"-moz-column-width",browsers:["FF3.5"],values:[{name:"auto",description:"The width depends on the values of other properties."}],relevance:50,description:"This property describes the width of columns in multicol elements.",restrictions:["length"]},{name:"-moz-font-feature-settings",browsers:["FF4"],values:[{name:'"c2cs"'},{name:'"dlig"'},{name:'"kern"'},{name:'"liga"'},{name:'"lnum"'},{name:'"onum"'},{name:'"smcp"'},{name:'"swsh"'},{name:'"tnum"'},{name:"normal",description:"No change in glyph substitution or positioning occurs."},{name:"off",browsers:["FF4"]},{name:"on",browsers:["FF4"]}],relevance:50,description:"Provides low-level control over OpenType font features. It is intended as a way of providing access to font features that are not widely used but are needed for a particular use case.",restrictions:["string","integer"]},{name:"-moz-hyphens",browsers:["FF9"],values:[{name:"auto",description:"Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word."},{name:"manual",description:"Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities"},{name:"none",description:"Words are not broken at line breaks, even if characters inside the word suggest line break points."}],relevance:50,description:"Controls whether hyphenation is allowed to create more break opportunities within a line of text.",restrictions:["enum"]},{name:"-moz-perspective",browsers:["FF10"],values:[{name:"none",description:"No perspective transform is applied."}],relevance:50,description:"Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.",restrictions:["length"]},{name:"-moz-perspective-origin",browsers:["FF10"],relevance:50,description:"Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.",restrictions:["position","percentage","length"]},{name:"-moz-text-align-last",browsers:["FF12"],values:[{name:"auto"},{name:"center",description:"The inline contents are centered within the line box."},{name:"justify",description:"The text is justified according to the method specified by the 'text-justify' property."},{name:"left",description:"The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text."},{name:"right",description:"The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text."}],relevance:50,description:"Describes how the last line of a block or a line right before a forced line break is aligned when 'text-align' is set to 'justify'.",restrictions:["enum"]},{name:"-moz-text-decoration-color",browsers:["FF6"],relevance:50,description:"Specifies the color of text decoration (underlines overlines, and line-throughs) set on the element with text-decoration-line.",restrictions:["color"]},{name:"-moz-text-decoration-line",browsers:["FF6"],values:[{name:"line-through",description:"Each line of text has a line through the middle."},{name:"none",description:"Neither produces nor inhibits text decoration."},{name:"overline",description:"Each line of text has a line above it."},{name:"underline",description:"Each line of text is underlined."}],relevance:50,description:"Specifies what line decorations, if any, are added to the element.",restrictions:["enum"]},{name:"-moz-text-decoration-style",browsers:["FF6"],values:[{name:"dashed",description:"Produces a dashed line style."},{name:"dotted",description:"Produces a dotted line."},{name:"double",description:"Produces a double line."},{name:"none",description:"Produces no line."},{name:"solid",description:"Produces a solid line."},{name:"wavy",description:"Produces a wavy line."}],relevance:50,description:"Specifies the line style for underline, line-through and overline text decoration.",restrictions:["enum"]},{name:"-moz-text-size-adjust",browsers:["FF"],values:[{name:"auto",description:"Renderers must use the default size adjustment when displaying on a small device."},{name:"none",description:"Renderers must not do size adjustment when displaying on a small device."}],relevance:50,description:"Specifies a size adjustment for displaying text content in mobile browsers.",restrictions:["enum","percentage"]},{name:"-moz-transform",browsers:["FF3.5"],values:[{name:"matrix()",description:"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]"},{name:"matrix3d()",description:"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order."},{name:"none"},{name:"perspective",description:"Specifies a perspective projection matrix."},{name:"rotate()",description:"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property."},{name:"rotate3d()",description:"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters."},{name:"rotateX('angle')",description:"Specifies a clockwise rotation by the given angle about the X axis."},{name:"rotateY('angle')",description:"Specifies a clockwise rotation by the given angle about the Y axis."},{name:"rotateZ('angle')",description:"Specifies a clockwise rotation by the given angle about the Z axis."},{name:"scale()",description:"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first."},{name:"scale3d()",description:"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters."},{name:"scaleX()",description:"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter."},{name:"scaleY()",description:"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter."},{name:"scaleZ()",description:"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter."},{name:"skew()",description:"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis)."},{name:"skewX()",description:"Specifies a skew transformation along the X axis by the given angle."},{name:"skewY()",description:"Specifies a skew transformation along the Y axis by the given angle."},{name:"translate()",description:"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter."},{name:"translate3d()",description:"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively."},{name:"translateX()",description:"Specifies a translation by the given amount in the X direction."},{name:"translateY()",description:"Specifies a translation by the given amount in the Y direction."},{name:"translateZ()",description:"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0."}],relevance:50,description:"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.",restrictions:["enum"]},{name:"-moz-transform-origin",browsers:["FF3.5"],relevance:50,description:"Establishes the origin of transformation for an element.",restrictions:["position","length","percentage"]},{name:"-moz-transition",browsers:["FF4"],values:[{name:"all",description:"Every property that is able to undergo a transition will do so."},{name:"none",description:"No property will transition."}],relevance:50,description:"Shorthand property combines four of the transition properties into a single property.",restrictions:["time","property","timing-function","enum"]},{name:"-moz-transition-delay",browsers:["FF4"],relevance:50,description:"Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.",restrictions:["time"]},{name:"-moz-transition-duration",browsers:["FF4"],relevance:50,description:"Specifies how long the transition from the old value to the new value should take.",restrictions:["time"]},{name:"-moz-transition-property",browsers:["FF4"],values:[{name:"all",description:"Every property that is able to undergo a transition will do so."},{name:"none",description:"No property will transition."}],relevance:50,description:"Specifies the name of the CSS property to which the transition is applied.",restrictions:["property"]},{name:"-moz-transition-timing-function",browsers:["FF4"],relevance:50,description:"Describes how the intermediate values used during a transition will be calculated.",restrictions:["timing-function"]},{name:"-moz-user-focus",browsers:["FF1"],values:[{name:"ignore"},{name:"normal"}],status:"nonstandard",syntax:"ignore | normal | select-after | select-before | select-menu | select-same | select-all | none",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-moz-user-focus"}],description:"Used to indicate whether the element can have focus."},{name:"-moz-user-select",browsers:["FF1.5"],values:[{name:"all"},{name:"element"},{name:"elements"},{name:"-moz-all"},{name:"-moz-none"},{name:"none"},{name:"text"},{name:"toggle"}],relevance:50,description:"Controls the appearance of selection.",restrictions:["enum"]},{name:"-ms-accelerator",browsers:["E","IE10"],values:[{name:"false",description:"The element does not contain an accelerator key sequence."},{name:"true",description:"The element contains an accelerator key sequence."}],status:"nonstandard",syntax:"false | true",relevance:0,description:"IE only. Has the ability to turn off its system underlines for accelerator keys until the ALT key is pressed",restrictions:["enum"]},{name:"-ms-behavior",browsers:["IE8"],relevance:50,description:"IE only. Used to extend behaviors of the browser",restrictions:["url"]},{name:"-ms-block-progression",browsers:["IE8"],values:[{name:"bt",description:"Bottom-to-top block flow. Layout is horizontal."},{name:"lr",description:"Left-to-right direction. The flow orientation is vertical."},{name:"rl",description:"Right-to-left direction. The flow orientation is vertical."},{name:"tb",description:"Top-to-bottom direction. The flow orientation is horizontal."}],status:"nonstandard",syntax:"tb | rl | bt | lr",relevance:0,description:"Sets the block-progression value and the flow orientation",restrictions:["enum"]},{name:"-ms-content-zoom-chaining",browsers:["E","IE10"],values:[{name:"chained",description:"The nearest zoomable parent element begins zooming when the user hits a zoom limit during a manipulation. No bounce effect is shown."},{name:"none",description:"A bounce effect is shown when the user hits a zoom limit during a manipulation."}],status:"nonstandard",syntax:"none | chained",relevance:0,description:"Specifies the zoom behavior that occurs when a user hits the zoom limit during a manipulation."},{name:"-ms-content-zooming",browsers:["E","IE10"],values:[{name:"none",description:"The element is not zoomable."},{name:"zoom",description:"The element is zoomable."}],status:"nonstandard",syntax:"none | zoom",relevance:0,description:"Specifies whether zooming is enabled.",restrictions:["enum"]},{name:"-ms-content-zoom-limit",browsers:["E","IE10"],status:"nonstandard",syntax:"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>",relevance:0,description:"Shorthand property for the -ms-content-zoom-limit-min and -ms-content-zoom-limit-max properties.",restrictions:["percentage"]},{name:"-ms-content-zoom-limit-max",browsers:["E","IE10"],status:"nonstandard",syntax:"<percentage>",relevance:0,description:"Specifies the maximum zoom factor.",restrictions:["percentage"]},{name:"-ms-content-zoom-limit-min",browsers:["E","IE10"],status:"nonstandard",syntax:"<percentage>",relevance:0,description:"Specifies the minimum zoom factor.",restrictions:["percentage"]},{name:"-ms-content-zoom-snap",browsers:["E","IE10"],values:[{name:"mandatory",description:"Indicates that the motion of the content after the contact is picked up is always adjusted so that it lands on a snap-point."},{name:"none",description:"Indicates that zooming is unaffected by any defined snap-points."},{name:"proximity",description:'Indicates that the motion of the content after the contact is picked up may be adjusted if the content would normally stop "close enough" to a snap-point.'},{name:"snapInterval(100%, 100%)",description:"Specifies where the snap-points will be placed."},{name:"snapList()",description:"Specifies the position of individual snap-points as a comma-separated list of zoom factors."}],status:"nonstandard",syntax:"<'-ms-content-zoom-snap-type'> || <'-ms-content-zoom-snap-points'>",relevance:0,description:"Shorthand property for the -ms-content-zoom-snap-type and -ms-content-zoom-snap-points properties."},{name:"-ms-content-zoom-snap-points",browsers:["E","IE10"],values:[{name:"snapInterval(100%, 100%)",description:"Specifies where the snap-points will be placed."},{name:"snapList()",description:"Specifies the position of individual snap-points as a comma-separated list of zoom factors."}],status:"nonstandard",syntax:"snapInterval( <percentage>, <percentage> ) | snapList( <percentage># )",relevance:0,description:"Defines where zoom snap-points are located."},{name:"-ms-content-zoom-snap-type",browsers:["E","IE10"],values:[{name:"mandatory",description:"Indicates that the motion of the content after the contact is picked up is always adjusted so that it lands on a snap-point."},{name:"none",description:"Indicates that zooming is unaffected by any defined snap-points."},{name:"proximity",description:'Indicates that the motion of the content after the contact is picked up may be adjusted if the content would normally stop "close enough" to a snap-point.'}],status:"nonstandard",syntax:"none | proximity | mandatory",relevance:0,description:"Specifies how zooming is affected by defined snap-points.",restrictions:["enum"]},{name:"-ms-filter",browsers:["IE8-9"],status:"nonstandard",syntax:"<string>",relevance:0,description:"IE only. Used to produce visual effects.",restrictions:["string"]},{name:"-ms-flex",browsers:["IE10"],values:[{name:"auto",description:"Retrieves the value of the main size property as the used 'flex-basis'."},{name:"none",description:"Expands to '0 0 auto'."}],relevance:50,description:"specifies the parameters of a flexible length: the positive and negative flexibility, and the preferred size.",restrictions:["length","number","percentage"]},{name:"-ms-flex-align",browsers:["IE10"],values:[{name:"baseline",description:"If the flex item\u2019s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."},{name:"center",description:"The flex item\u2019s margin box is centered in the cross axis within the line."},{name:"end",description:"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."},{name:"start",description:"The cross-start margin edge of the flexbox item is placed flush with the cross-start edge of the line."},{name:"stretch",description:"If the cross size property of the flexbox item is anything other than 'auto', this value is identical to 'start'."}],relevance:50,description:"Aligns flex items along the cross axis of the current line of the flex container.",restrictions:["enum"]},{name:"-ms-flex-direction",browsers:["IE10"],values:[{name:"column",description:"The flex container\u2019s main axis has the same orientation as the block axis of the current writing mode."},{name:"column-reverse",description:"Same as 'column', except the main-start and main-end directions are swapped."},{name:"row",description:"The flex container\u2019s main axis has the same orientation as the inline axis of the current writing mode."},{name:"row-reverse",description:"Same as 'row', except the main-start and main-end directions are swapped."}],relevance:50,description:"Specifies how flex items are placed in the flex container, by setting the direction of the flex container\u2019s main axis.",restrictions:["enum"]},{name:"-ms-flex-flow",browsers:["IE10"],values:[{name:"column",description:"The flex container\u2019s main axis has the same orientation as the block axis of the current writing mode."},{name:"column-reverse",description:"Same as 'column', except the main-start and main-end directions are swapped."},{name:"nowrap",description:"The flex container is single-line."},{name:"row",description:"The flex container\u2019s main axis has the same orientation as the inline axis of the current writing mode."},{name:"wrap",description:"The flexbox is multi-line."},{name:"wrap-reverse",description:"Same as 'wrap', except the cross-start and cross-end directions are swapped."}],relevance:50,description:"Specifies how flexbox items are placed in the flexbox.",restrictions:["enum"]},{name:"-ms-flex-item-align",browsers:["IE10"],values:[{name:"auto",description:"Computes to the value of 'align-items' on the element\u2019s parent, or 'stretch' if the element has no parent. On absolutely positioned elements, it computes to itself."},{name:"baseline",description:"If the flex item\u2019s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."},{name:"center",description:"The flex item\u2019s margin box is centered in the cross axis within the line."},{name:"end",description:"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."},{name:"start",description:"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."}],relevance:50,description:"Allows the default alignment along the cross axis to be overridden for individual flex items.",restrictions:["enum"]},{name:"-ms-flex-line-pack",browsers:["IE10"],values:[{name:"center",description:"Lines are packed toward the center of the flex container."},{name:"distribute",description:"Lines are evenly distributed in the flex container, with half-size spaces on either end."},{name:"end",description:"Lines are packed toward the end of the flex container."},{name:"justify",description:"Lines are evenly distributed in the flex container."},{name:"start",description:"Lines are packed toward the start of the flex container."},{name:"stretch",description:"Lines stretch to take up the remaining space."}],relevance:50,description:"Aligns a flex container\u2019s lines within the flex container when there is extra space in the cross-axis, similar to how 'justify-content' aligns individual items within the main-axis.",restrictions:["enum"]},{name:"-ms-flex-order",browsers:["IE10"],relevance:50,description:"Controls the order in which children of a flex container appear within the flex container, by assigning them to ordinal groups.",restrictions:["integer"]},{name:"-ms-flex-pack",browsers:["IE10"],values:[{name:"center",description:"Flex items are packed toward the center of the line."},{name:"distribute",description:"Flex items are evenly distributed in the line, with half-size spaces on either end."},{name:"end",description:"Flex items are packed toward the end of the line."},{name:"justify",description:"Flex items are evenly distributed in the line."},{name:"start",description:"Flex items are packed toward the start of the line."}],relevance:50,description:"Aligns flex items along the main axis of the current line of the flex container.",restrictions:["enum"]},{name:"-ms-flex-wrap",browsers:["IE10"],values:[{name:"nowrap",description:"The flex container is single-line."},{name:"wrap",description:"The flexbox is multi-line."},{name:"wrap-reverse",description:"Same as 'wrap', except the cross-start and cross-end directions are swapped."}],relevance:50,description:"Controls whether the flex container is single-line or multi-line, and the direction of the cross-axis, which determines the direction new lines are stacked in.",restrictions:["enum"]},{name:"-ms-flow-from",browsers:["E","IE10"],values:[{name:"none",description:"The block container is not a CSS Region."}],status:"nonstandard",syntax:"[ none | <custom-ident> ]#",relevance:0,description:"Makes a block container a region and associates it with a named flow.",restrictions:["identifier"]},{name:"-ms-flow-into",browsers:["E","IE10"],values:[{name:"none",description:"The element is not moved to a named flow and normal CSS processing takes place."}],status:"nonstandard",syntax:"[ none | <custom-ident> ]#",relevance:0,description:"Places an element or its contents into a named flow.",restrictions:["identifier"]},{name:"-ms-grid-column",browsers:["E12","IE10"],values:[{name:"auto"},{name:"end"},{name:"start"}],relevance:50,description:"Used to place grid items and explicitly defined grid cells in the Grid.",restrictions:["integer","string","enum"]},{name:"-ms-grid-column-align",browsers:["E12","IE10"],values:[{name:"center",description:"Places the center of the Grid Item's margin box at the center of the Grid Item's column."},{name:"end",description:"Aligns the end edge of the Grid Item's margin box to the end edge of the Grid Item's column."},{name:"start",description:"Aligns the starting edge of the Grid Item's margin box to the starting edge of the Grid Item's column."},{name:"stretch",description:"Ensures that the Grid Item's margin box is equal to the size of the Grid Item's column."}],relevance:50,description:"Aligns the columns in a grid.",restrictions:["enum"]},{name:"-ms-grid-columns",browsers:["E","IE10"],status:"nonstandard",syntax:"none | <track-list> | <auto-track-list>",relevance:0,description:"Lays out the columns of the grid."},{name:"-ms-grid-column-span",browsers:["E12","IE10"],relevance:50,description:"Specifies the number of columns to span.",restrictions:["integer"]},{name:"-ms-grid-layer",browsers:["E","IE10"],relevance:50,description:"Grid-layer is similar in concept to z-index, but avoids overloading the meaning of the z-index property, which is applicable only to positioned elements.",restrictions:["integer"]},{name:"-ms-grid-row",browsers:["E12","IE10"],values:[{name:"auto"},{name:"end"},{name:"start"}],relevance:50,description:"grid-row is used to place grid items and explicitly defined grid cells in the Grid.",restrictions:["integer","string","enum"]},{name:"-ms-grid-row-align",browsers:["E12","IE10"],values:[{name:"center",description:"Places the center of the Grid Item's margin box at the center of the Grid Item's row."},{name:"end",description:"Aligns the end edge of the Grid Item's margin box to the end edge of the Grid Item's row."},{name:"start",description:"Aligns the starting edge of the Grid Item's margin box to the starting edge of the Grid Item's row."},{name:"stretch",description:"Ensures that the Grid Item's margin box is equal to the size of the Grid Item's row."}],relevance:50,description:"Aligns the rows in a grid.",restrictions:["enum"]},{name:"-ms-grid-rows",browsers:["E","IE10"],status:"nonstandard",syntax:"none | <track-list> | <auto-track-list>",relevance:0,description:"Lays out the columns of the grid."},{name:"-ms-grid-row-span",browsers:["E12","IE10"],relevance:50,description:"Specifies the number of rows to span.",restrictions:["integer"]},{name:"-ms-high-contrast-adjust",browsers:["E","IE10"],values:[{name:"auto",description:"Properties will be adjusted as applicable."},{name:"none",description:"No adjustments will be applied."}],status:"nonstandard",syntax:"auto | none",relevance:0,description:"Specifies if properties should be adjusted in high contrast mode.",restrictions:["enum"]},{name:"-ms-hyphenate-limit-chars",browsers:["E","IE10"],values:[{name:"auto",description:"The user agent chooses a value that adapts to the current layout."}],status:"nonstandard",syntax:"auto | <integer>{1,3}",relevance:0,description:"Specifies the minimum number of characters in a hyphenated word.",restrictions:["integer"]},{name:"-ms-hyphenate-limit-lines",browsers:["E","IE10"],values:[{name:"no-limit",description:"There is no limit."}],status:"nonstandard",syntax:"no-limit | <integer>",relevance:0,description:"Indicates the maximum number of successive hyphenated lines in an element.",restrictions:["integer"]},{name:"-ms-hyphenate-limit-zone",browsers:["E","IE10"],status:"nonstandard",syntax:"<percentage> | <length>",relevance:0,description:"Specifies the maximum amount of unfilled space (before justification) that may be left in the line box before hyphenation is triggered to pull part of a word from the next line back up into the current line.",restrictions:["percentage","length"]},{name:"-ms-hyphens",browsers:["E","IE10"],values:[{name:"auto",description:"Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word."},{name:"manual",description:"Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities"},{name:"none",description:"Words are not broken at line breaks, even if characters inside the word suggest line break points."}],relevance:50,description:"Controls whether hyphenation is allowed to create more break opportunities within a line of text.",restrictions:["enum"]},{name:"-ms-ime-mode",browsers:["IE10"],values:[{name:"active",description:"The input method editor is initially active; text entry is performed using it unless the user specifically dismisses it."},{name:"auto",description:"No change is made to the current input method editor state. This is the default."},{name:"disabled",description:"The input method editor is disabled and may not be activated by the user."},{name:"inactive",description:"The input method editor is initially inactive, but the user may activate it if they wish."},{name:"normal",description:"The IME state should be normal; this value can be used in a user style sheet to override the page setting."}],relevance:50,description:"Controls the state of the input method editor for text fields.",restrictions:["enum"]},{name:"-ms-interpolation-mode",browsers:["IE7"],values:[{name:"bicubic"},{name:"nearest-neighbor"}],relevance:50,description:"Gets or sets the interpolation (resampling) method used to stretch images.",restrictions:["enum"]},{name:"-ms-layout-grid",browsers:["E","IE10"],values:[{name:"char",description:"Any of the range of character values available to the -ms-layout-grid-char property."},{name:"line",description:"Any of the range of line values available to the -ms-layout-grid-line property."},{name:"mode",description:"Any of the range of mode values available to the -ms-layout-grid-mode property."},{name:"type",description:"Any of the range of type values available to the -ms-layout-grid-type property."}],relevance:50,description:"Sets or retrieves the composite document grid properties that specify the layout of text characters."},{name:"-ms-layout-grid-char",browsers:["E","IE10"],values:[{name:"auto",description:"Largest character in the font of the element is used to set the character grid."},{name:"none",description:"Default. No character grid is set."}],relevance:50,description:"Sets or retrieves the size of the character grid used for rendering the text content of an element.",restrictions:["enum","length","percentage"]},{name:"-ms-layout-grid-line",browsers:["E","IE10"],values:[{name:"auto",description:"Largest character in the font of the element is used to set the character grid."},{name:"none",description:"Default. No grid line is set."}],relevance:50,description:"Sets or retrieves the gridline value used for rendering the text content of an element.",restrictions:["length"]},{name:"-ms-layout-grid-mode",browsers:["E","IE10"],values:[{name:"both",description:"Default. Both the char and line grid modes are enabled. This setting is necessary to fully enable the layout grid on an element."},{name:"char",description:"Only a character grid is used. This is recommended for use with block-level elements, such as a blockquote, where the line grid is intended to be disabled."},{name:"line",description:"Only a line grid is used. This is recommended for use with inline elements, such as a span, to disable the horizontal grid on runs of text that act as a single entity in the grid layout."},{name:"none",description:"No grid is used."}],relevance:50,description:"Gets or sets whether the text layout grid uses two dimensions.",restrictions:["enum"]},{name:"-ms-layout-grid-type",browsers:["E","IE10"],values:[{name:"fixed",description:"Grid used for monospaced layout. All noncursive characters are treated as equal; every character is centered within a single grid space by default."},{name:"loose",description:"Default. Grid used for Japanese and Korean characters."},{name:"strict",description:"Grid used for Chinese, as well as Japanese (Genko) and Korean characters. Only the ideographs, kanas, and wide characters are snapped to the grid."}],relevance:50,description:"Sets or retrieves the type of grid used for rendering the text content of an element.",restrictions:["enum"]},{name:"-ms-line-break",browsers:["E","IE10"],values:[{name:"auto",description:"The UA determines the set of line-breaking restrictions to use for CJK scripts, and it may vary the restrictions based on the length of the line; e.g., use a less restrictive set of line-break rules for short lines."},{name:"keep-all",description:"Sequences of CJK characters can no longer break on implied break points. This option should only be used where the presence of word separator characters still creates line-breaking opportunities, as in Korean."},{name:"newspaper",description:"Breaks CJK scripts using the least restrictive set of line-breaking rules. Typically used for short lines, such as in newspapers."},{name:"normal",description:"Breaks CJK scripts using a normal set of line-breaking rules."},{name:"strict",description:"Breaks CJK scripts using a more restrictive set of line-breaking rules than 'normal'."}],relevance:50,description:"Specifies what set of line breaking restrictions are in effect within the element.",restrictions:["enum"]},{name:"-ms-overflow-style",browsers:["E","IE10"],values:[{name:"auto",description:"No preference, UA should use the first scrolling method in the list that it supports."},{name:"-ms-autohiding-scrollbar",description:"Indicates the element displays auto-hiding scrollbars during mouse interactions and panning indicators during touch and keyboard interactions."},{name:"none",description:"Indicates the element does not display scrollbars or panning indicators, even when its content overflows."},{name:"scrollbar",description:'Scrollbars are typically narrow strips inserted on one or two edges of an element and which often have arrows to click on and a "thumb" to drag up and down (or left and right) to move the contents of the element.'}],status:"nonstandard",syntax:"auto | none | scrollbar | -ms-autohiding-scrollbar",relevance:0,description:"Specify whether content is clipped when it overflows the element's content area.",restrictions:["enum"]},{name:"-ms-perspective",browsers:["IE10"],values:[{name:"none",description:"No perspective transform is applied."}],relevance:50,description:"Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.",restrictions:["length"]},{name:"-ms-perspective-origin",browsers:["IE10"],relevance:50,description:"Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.",restrictions:["position","percentage","length"]},{name:"-ms-perspective-origin-x",browsers:["IE10"],relevance:50,description:"Establishes the origin for the perspective property. It effectively sets the X  position at which the viewer appears to be looking at the children of the element.",restrictions:["position","percentage","length"]},{name:"-ms-perspective-origin-y",browsers:["IE10"],relevance:50,description:"Establishes the origin for the perspective property. It effectively sets the Y position at which the viewer appears to be looking at the children of the element.",restrictions:["position","percentage","length"]},{name:"-ms-progress-appearance",browsers:["IE10"],values:[{name:"bar"},{name:"ring"}],relevance:50,description:"Gets or sets a value that specifies whether a progress control displays as a bar or a ring.",restrictions:["enum"]},{name:"-ms-scrollbar-3dlight-color",browsers:["IE8"],status:"nonstandard",syntax:"<color>",relevance:0,description:"Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.",restrictions:["color"]},{name:"-ms-scrollbar-arrow-color",browsers:["IE8"],status:"nonstandard",syntax:"<color>",relevance:0,description:"Determines the color of the arrow elements of a scroll arrow.",restrictions:["color"]},{name:"-ms-scrollbar-base-color",browsers:["IE8"],status:"nonstandard",syntax:"<color>",relevance:0,description:"Determines the color of the main elements of a scroll bar, which include the scroll box, track, and scroll arrows.",restrictions:["color"]},{name:"-ms-scrollbar-darkshadow-color",browsers:["IE8"],status:"nonstandard",syntax:"<color>",relevance:0,description:"Determines the color of the gutter of a scroll bar.",restrictions:["color"]},{name:"-ms-scrollbar-face-color",browsers:["IE8"],status:"nonstandard",syntax:"<color>",relevance:0,description:"Determines the color of the scroll box and scroll arrows of a scroll bar.",restrictions:["color"]},{name:"-ms-scrollbar-highlight-color",browsers:["IE8"],status:"nonstandard",syntax:"<color>",relevance:0,description:"Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.",restrictions:["color"]},{name:"-ms-scrollbar-shadow-color",browsers:["IE8"],status:"nonstandard",syntax:"<color>",relevance:0,description:"Determines the color of the bottom and right edges of the scroll box and scroll arrows of a scroll bar.",restrictions:["color"]},{name:"-ms-scrollbar-track-color",browsers:["IE5"],status:"nonstandard",syntax:"<color>",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-track-color"}],description:"Determines the color of the track element of a scroll bar.",restrictions:["color"]},{name:"-ms-scroll-chaining",browsers:["E","IE10"],values:[{name:"chained"},{name:"none"}],status:"nonstandard",syntax:"chained | none",relevance:0,description:"Gets or sets a value that indicates the scrolling behavior that occurs when a user hits the content boundary during a manipulation.",restrictions:["enum","length"]},{name:"-ms-scroll-limit",browsers:["E","IE10"],values:[{name:"auto"}],status:"nonstandard",syntax:"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>",relevance:0,description:"Gets or sets a shorthand value that sets values for the -ms-scroll-limit-x-min, -ms-scroll-limit-y-min, -ms-scroll-limit-x-max, and -ms-scroll-limit-y-max properties.",restrictions:["length"]},{name:"-ms-scroll-limit-x-max",browsers:["E","IE10"],values:[{name:"auto"}],status:"nonstandard",syntax:"auto | <length>",relevance:0,description:"Gets or sets a value that specifies the maximum value for the scrollLeft property.",restrictions:["length"]},{name:"-ms-scroll-limit-x-min",browsers:["E","IE10"],status:"nonstandard",syntax:"<length>",relevance:0,description:"Gets or sets a value that specifies the minimum value for the scrollLeft property.",restrictions:["length"]},{name:"-ms-scroll-limit-y-max",browsers:["E","IE10"],values:[{name:"auto"}],status:"nonstandard",syntax:"auto | <length>",relevance:0,description:"Gets or sets a value that specifies the maximum value for the scrollTop property.",restrictions:["length"]},{name:"-ms-scroll-limit-y-min",browsers:["E","IE10"],status:"nonstandard",syntax:"<length>",relevance:0,description:"Gets or sets a value that specifies the minimum value for the scrollTop property.",restrictions:["length"]},{name:"-ms-scroll-rails",browsers:["E","IE10"],values:[{name:"none"},{name:"railed"}],status:"nonstandard",syntax:"none | railed",relevance:0,description:"Gets or sets a value that indicates whether or not small motions perpendicular to the primary axis of motion will result in either changes to both the scrollTop and scrollLeft properties or a change to the primary axis (for instance, either the scrollTop or scrollLeft properties will change, but not both).",restrictions:["enum","length"]},{name:"-ms-scroll-snap-points-x",browsers:["E","IE10"],values:[{name:"snapInterval(100%, 100%)"},{name:"snapList()"}],status:"nonstandard",syntax:"snapInterval( <length-percentage>, <length-percentage> ) | snapList( <length-percentage># )",relevance:0,description:"Gets or sets a value that defines where snap-points will be located along the x-axis.",restrictions:["enum"]},{name:"-ms-scroll-snap-points-y",browsers:["E","IE10"],values:[{name:"snapInterval(100%, 100%)"},{name:"snapList()"}],status:"nonstandard",syntax:"snapInterval( <length-percentage>, <length-percentage> ) | snapList( <length-percentage># )",relevance:0,description:"Gets or sets a value that defines where snap-points will be located along the y-axis.",restrictions:["enum"]},{name:"-ms-scroll-snap-type",browsers:["E","IE10"],values:[{name:"none",description:"The visual viewport of this scroll container must ignore snap points, if any, when scrolled."},{name:"mandatory",description:"The visual viewport of this scroll container is guaranteed to rest on a snap point when there are no active scrolling operations."},{name:"proximity",description:"The visual viewport of this scroll container may come to rest on a snap point at the termination of a scroll at the discretion of the UA given the parameters of the scroll."}],status:"nonstandard",syntax:"none | proximity | mandatory",relevance:0,description:"Gets or sets a value that defines what type of snap-point should be used for the current element. There are two type of snap-points, with the primary difference being whether or not the user is guaranteed to always stop on a snap-point.",restrictions:["enum"]},{name:"-ms-scroll-snap-x",browsers:["E","IE10"],values:[{name:"mandatory"},{name:"none"},{name:"proximity"},{name:"snapInterval(100%, 100%)"},{name:"snapList()"}],status:"nonstandard",syntax:"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>",relevance:0,description:"Gets or sets a shorthand value that sets values for the -ms-scroll-snap-type and -ms-scroll-snap-points-x properties.",restrictions:["enum"]},{name:"-ms-scroll-snap-y",browsers:["E","IE10"],values:[{name:"mandatory"},{name:"none"},{name:"proximity"},{name:"snapInterval(100%, 100%)"},{name:"snapList()"}],status:"nonstandard",syntax:"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>",relevance:0,description:"Gets or sets a shorthand value that sets values for the -ms-scroll-snap-type and -ms-scroll-snap-points-y properties.",restrictions:["enum"]},{name:"-ms-scroll-translation",browsers:["E","IE10"],values:[{name:"none"},{name:"vertical-to-horizontal"}],status:"nonstandard",syntax:"none | vertical-to-horizontal",relevance:0,description:"Gets or sets a value that specifies whether vertical-to-horizontal scroll wheel translation occurs on the specified element.",restrictions:["enum"]},{name:"-ms-text-align-last",browsers:["E","IE8"],values:[{name:"auto"},{name:"center",description:"The inline contents are centered within the line box."},{name:"justify",description:"The text is justified according to the method specified by the 'text-justify' property."},{name:"left",description:"The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text."},{name:"right",description:"The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text."}],relevance:50,description:"Describes how the last line of a block or a line right before a forced line break is aligned when 'text-align' is set to 'justify'.",restrictions:["enum"]},{name:"-ms-text-autospace",browsers:["E","IE8"],values:[{name:"ideograph-alpha",description:"Creates 1/4em extra spacing between runs of ideographic letters and non-ideographic letters, such as Latin-based, Cyrillic, Greek, Arabic or Hebrew."},{name:"ideograph-numeric",description:"Creates 1/4em extra spacing between runs of ideographic letters and numeric glyphs."},{name:"ideograph-parenthesis",description:"Creates extra spacing between normal (non wide) parenthesis and ideographs."},{name:"ideograph-space",description:"Extends the width of the space character while surrounded by ideographs."},{name:"none",description:"No extra space is created."},{name:"punctuation",description:"Creates extra non-breaking spacing around punctuation as required by language-specific typographic conventions."}],status:"nonstandard",syntax:"none | ideograph-alpha | ideograph-numeric | ideograph-parenthesis | ideograph-space",relevance:0,description:"Determines whether or not a full-width punctuation mark character should be trimmed if it appears at the beginning of a line, so that its 'ink' lines up with the first glyph in the line above and below.",restrictions:["enum"]},{name:"-ms-text-combine-horizontal",browsers:["E","IE11"],values:[{name:"all",description:"Attempt to typeset horizontally all consecutive characters within the box such that they take up the space of a single character within the vertical line box."},{name:"digits",description:"Attempt to typeset horizontally each maximal sequence of consecutive ASCII digits (U+0030\u2013U+0039) that has as many or fewer characters than the specified integer such that it takes up the space of a single character within the vertical line box."},{name:"none",description:"No special processing."}],relevance:50,description:"This property specifies the combination of multiple characters into the space of a single character.",restrictions:["enum","integer"]},{name:"-ms-text-justify",browsers:["E","IE8"],values:[{name:"auto",description:"The UA determines the justification algorithm to follow, based on a balance between performance and adequate presentation quality."},{name:"distribute",description:"Justification primarily changes spacing both at word separators and at grapheme cluster boundaries in all scripts except those in the connected and cursive groups. This value is sometimes used in e.g. Japanese, often with the 'text-align-last' property."},{name:"inter-cluster",description:"Justification primarily changes spacing at word separators and at grapheme cluster boundaries in clustered scripts. This value is typically used for Southeast Asian scripts such as Thai."},{name:"inter-ideograph",description:"Justification primarily changes spacing at word separators and at inter-graphemic boundaries in scripts that use no word spaces. This value is typically used for CJK languages."},{name:"inter-word",description:"Justification primarily changes spacing at word separators. This value is typically used for languages that separate words using spaces, like English or (sometimes) Korean."},{name:"kashida",description:"Justification primarily stretches Arabic and related scripts through the use of kashida or other calligraphic elongation."}],relevance:50,description:"Selects the justification algorithm used when 'text-align' is set to 'justify'. The property applies to block containers, but the UA may (but is not required to) also support it on inline elements.",restrictions:["enum"]},{name:"-ms-text-kashida-space",browsers:["E","IE10"],relevance:50,description:"Sets or retrieves the ratio of kashida expansion to white space expansion when justifying lines of text in the object.",restrictions:["percentage"]},{name:"-ms-text-overflow",browsers:["IE10"],values:[{name:"clip",description:"Clip inline content that overflows. Characters may be only partially rendered."},{name:"ellipsis",description:"Render an ellipsis character (U+2026) to represent clipped inline content."}],relevance:50,description:"Text can overflow for example when it is prevented from wrapping",restrictions:["enum"]},{name:"-ms-text-size-adjust",browsers:["E","IE10"],values:[{name:"auto",description:"Renderers must use the default size adjustment when displaying on a small device."},{name:"none",description:"Renderers must not do size adjustment when displaying on a small device."}],relevance:50,description:"Specifies a size adjustment for displaying text content in mobile browsers.",restrictions:["enum","percentage"]},{name:"-ms-text-underline-position",browsers:["E","IE10"],values:[{name:"alphabetic",description:"The underline is aligned with the alphabetic baseline. In this case the underline is likely to cross some descenders."},{name:"auto",description:"The user agent may use any algorithm to determine the underline's position. In horizontal line layout, the underline should be aligned as for alphabetic. In vertical line layout, if the language is set to Japanese or Korean, the underline should be aligned as for over."},{name:"over",description:"The underline is aligned with the 'top' (right in vertical writing) edge of the element's em-box. In this mode, an overline also switches sides."},{name:"under",description:"The underline is aligned with the 'bottom' (left in vertical writing) edge of the element's em-box. In this case the underline usually does not cross the descenders. This is sometimes called 'accounting' underline."}],relevance:50,description:"Sets the position of an underline specified on the same element: it does not affect underlines specified by ancestor elements.This property is typically used in vertical writing contexts such as in Japanese documents where it often desired to have the underline appear 'over' (to the right of) the affected run of text",restrictions:["enum"]},{name:"-ms-touch-action",browsers:["IE10"],values:[{name:"auto",description:"The element is a passive element, with several exceptions."},{name:"double-tap-zoom",description:"The element will zoom on double-tap."},{name:"manipulation",description:"The element is a manipulation-causing element."},{name:"none",description:"The element is a manipulation-blocking element."},{name:"pan-x",description:"The element permits touch-driven panning on the horizontal axis. The touch pan is performed on the nearest ancestor with horizontally scrollable content."},{name:"pan-y",description:"The element permits touch-driven panning on the vertical axis. The touch pan is performed on the nearest ancestor with vertically scrollable content."},{name:"pinch-zoom",description:"The element permits pinch-zooming. The pinch-zoom is performed on the nearest ancestor with zoomable content."}],relevance:50,description:"Gets or sets a value that indicates whether and how a given region can be manipulated by the user.",restrictions:["enum"]},{name:"-ms-touch-select",browsers:["E","IE10"],values:[{name:"grippers",description:"Grippers are always on."},{name:"none",description:"Grippers are always off."}],status:"nonstandard",syntax:"grippers | none",relevance:0,description:"Gets or sets a value that toggles the 'gripper' visual elements that enable touch text selection.",restrictions:["enum"]},{name:"-ms-transform",browsers:["IE9-9"],values:[{name:"matrix()",description:"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]"},{name:"matrix3d()",description:"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order."},{name:"none"},{name:"rotate()",description:"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property."},{name:"rotate3d()",description:"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters."},{name:"rotateX('angle')",description:"Specifies a clockwise rotation by the given angle about the X axis."},{name:"rotateY('angle')",description:"Specifies a clockwise rotation by the given angle about the Y axis."},{name:"rotateZ('angle')",description:"Specifies a clockwise rotation by the given angle about the Z axis."},{name:"scale()",description:"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first."},{name:"scale3d()",description:"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters."},{name:"scaleX()",description:"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter."},{name:"scaleY()",description:"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter."},{name:"scaleZ()",description:"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter."},{name:"skew()",description:"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis)."},{name:"skewX()",description:"Specifies a skew transformation along the X axis by the given angle."},{name:"skewY()",description:"Specifies a skew transformation along the Y axis by the given angle."},{name:"translate()",description:"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter."},{name:"translate3d()",description:"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively."},{name:"translateX()",description:"Specifies a translation by the given amount in the X direction."},{name:"translateY()",description:"Specifies a translation by the given amount in the Y direction."},{name:"translateZ()",description:"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0."}],relevance:50,description:"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.",restrictions:["enum"]},{name:"-ms-transform-origin",browsers:["IE9-9"],relevance:50,description:"Establishes the origin of transformation for an element.",restrictions:["position","length","percentage"]},{name:"-ms-transform-origin-x",browsers:["IE10"],relevance:50,description:"The x coordinate of the origin for transforms applied to an element with respect to its border box.",restrictions:["length","percentage"]},{name:"-ms-transform-origin-y",browsers:["IE10"],relevance:50,description:"The y coordinate of the origin for transforms applied to an element with respect to its border box.",restrictions:["length","percentage"]},{name:"-ms-transform-origin-z",browsers:["IE10"],relevance:50,description:"The z coordinate of the origin for transforms applied to an element with respect to its border box.",restrictions:["length","percentage"]},{name:"-ms-user-select",browsers:["E","IE10"],values:[{name:"element"},{name:"none"},{name:"text"}],status:"nonstandard",syntax:"none | element | text",relevance:0,description:"Controls the appearance of selection.",restrictions:["enum"]},{name:"-ms-word-break",browsers:["IE8"],values:[{name:"break-all",description:"Lines may break between any two grapheme clusters for non-CJK scripts."},{name:"keep-all",description:"Block characters can no longer create implied break points."},{name:"normal",description:"Breaks non-CJK scripts according to their own rules."}],relevance:50,description:"Specifies line break opportunities for non-CJK scripts.",restrictions:["enum"]},{name:"-ms-word-wrap",browsers:["IE8"],values:[{name:"break-word",description:"An unbreakable 'word' may be broken at an arbitrary point if there are no otherwise-acceptable break points in the line."},{name:"normal",description:"Lines may break only at allowed break points."}],relevance:50,description:"Specifies whether the UA may break within a word to prevent overflow when an otherwise-unbreakable string is too long to fit.",restrictions:["enum"]},{name:"-ms-wrap-flow",browsers:["E","IE10"],values:[{name:"auto",description:"For floats an exclusion is created, for all other elements an exclusion is not created."},{name:"both",description:"Inline flow content can flow on all sides of the exclusion."},{name:"clear",description:"Inline flow content can only wrap on top and bottom of the exclusion and must leave the areas to the start and end edges of the exclusion box empty."},{name:"end",description:"Inline flow content can wrap on the end side of the exclusion area but must leave the area to the start edge of the exclusion area empty."},{name:"maximum",description:"Inline flow content can wrap on the side of the exclusion with the largest available space for the given line, and must leave the other side of the exclusion empty."},{name:"minimum",description:"Inline flow content can flow around the edge of the exclusion with the smallest available space within the flow content\u2019s containing block, and must leave the other edge of the exclusion empty."},{name:"start",description:"Inline flow content can wrap on the start edge of the exclusion area but must leave the area to end edge of the exclusion area empty."}],status:"nonstandard",syntax:"auto | both | start | end | maximum | clear",relevance:0,description:"An element becomes an exclusion when its 'wrap-flow' property has a computed value other than 'auto'.",restrictions:["enum"]},{name:"-ms-wrap-margin",browsers:["E","IE10"],status:"nonstandard",syntax:"<length>",relevance:0,description:"Gets or sets a value that is used to offset the inner wrap shape from other shapes.",restrictions:["length","percentage"]},{name:"-ms-wrap-through",browsers:["E","IE10"],values:[{name:"none",description:"The exclusion element does not inherit its parent node's wrapping context. Its descendants are only subject to exclusion shapes defined inside the element."},{name:"wrap",description:"The exclusion element inherits its parent node's wrapping context. Its descendant inline content wraps around exclusions defined outside the element."}],status:"nonstandard",syntax:"wrap | none",relevance:0,description:"Specifies if an element inherits its parent wrapping context. In other words if it is subject to the exclusions defined outside the element.",restrictions:["enum"]},{name:"-ms-writing-mode",browsers:["IE8"],values:[{name:"bt-lr"},{name:"bt-rl"},{name:"lr-bt"},{name:"lr-tb"},{name:"rl-bt"},{name:"rl-tb"},{name:"tb-lr"},{name:"tb-rl"}],relevance:50,description:"Shorthand property for both 'direction' and 'block-progression'.",restrictions:["enum"]},{name:"-ms-zoom",browsers:["IE8"],values:[{name:"normal"}],relevance:50,description:"Sets or retrieves the magnification scale of the object.",restrictions:["enum","integer","number","percentage"]},{name:"-ms-zoom-animation",browsers:["IE10"],values:[{name:"default"},{name:"none"}],relevance:50,description:"Gets or sets a value that indicates whether an animation is used when zooming.",restrictions:["enum"]},{name:"nav-down",browsers:["O9.5"],values:[{name:"auto",description:"The user agent automatically determines which element to navigate the focus to in response to directional navigational input."},{name:"current",description:"Indicates that the user agent should target the frame that the element is in."},{name:"root",description:"Indicates that the user agent should target the full window."}],relevance:50,description:"Provides an way to control directional focus navigation.",restrictions:["enum","identifier","string"]},{name:"nav-index",browsers:["O9.5"],values:[{name:"auto",description:"The element's sequential navigation order is assigned automatically by the user agent."}],relevance:50,description:"Provides an input-method-neutral way of specifying the sequential navigation order (also known as 'tabbing order').",restrictions:["number"]},{name:"nav-left",browsers:["O9.5"],values:[{name:"auto",description:"The user agent automatically determines which element to navigate the focus to in response to directional navigational input."},{name:"current",description:"Indicates that the user agent should target the frame that the element is in."},{name:"root",description:"Indicates that the user agent should target the full window."}],relevance:50,description:"Provides an way to control directional focus navigation.",restrictions:["enum","identifier","string"]},{name:"nav-right",browsers:["O9.5"],values:[{name:"auto",description:"The user agent automatically determines which element to navigate the focus to in response to directional navigational input."},{name:"current",description:"Indicates that the user agent should target the frame that the element is in."},{name:"root",description:"Indicates that the user agent should target the full window."}],relevance:50,description:"Provides an way to control directional focus navigation.",restrictions:["enum","identifier","string"]},{name:"nav-up",browsers:["O9.5"],values:[{name:"auto",description:"The user agent automatically determines which element to navigate the focus to in response to directional navigational input."},{name:"current",description:"Indicates that the user agent should target the frame that the element is in."},{name:"root",description:"Indicates that the user agent should target the full window."}],relevance:50,description:"Provides an way to control directional focus navigation.",restrictions:["enum","identifier","string"]},{name:"negative",browsers:["FF33"],syntax:"<symbol> <symbol>?",relevance:50,description:"@counter-style descriptor. Defines how to alter the representation when the counter value is negative.",restrictions:["image","identifier","string"]},{name:"-o-animation",browsers:["O12"],values:[{name:"alternate",description:"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."},{name:"alternate-reverse",description:"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."},{name:"backwards",description:"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."},{name:"both",description:"Both forwards and backwards fill modes are applied."},{name:"forwards",description:"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."},{name:"infinite",description:"Causes the animation to repeat forever."},{name:"none",description:"No animation is performed"},{name:"normal",description:"Normal playback."},{name:"reverse",description:"All iterations of the animation are played in the reverse direction from the way they were specified."}],relevance:50,description:"Shorthand property combines six of the animation properties into a single property.",restrictions:["time","enum","timing-function","identifier","number"]},{name:"-o-animation-delay",browsers:["O12"],relevance:50,description:"Defines when the animation will start.",restrictions:["time"]},{name:"-o-animation-direction",browsers:["O12"],values:[{name:"alternate",description:"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."},{name:"alternate-reverse",description:"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."},{name:"normal",description:"Normal playback."},{name:"reverse",description:"All iterations of the animation are played in the reverse direction from the way they were specified."}],relevance:50,description:"Defines whether or not the animation should play in reverse on alternate cycles.",restrictions:["enum"]},{name:"-o-animation-duration",browsers:["O12"],relevance:50,description:"Defines the length of time that an animation takes to complete one cycle.",restrictions:["time"]},{name:"-o-animation-fill-mode",browsers:["O12"],values:[{name:"backwards",description:"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."},{name:"both",description:"Both forwards and backwards fill modes are applied."},{name:"forwards",description:"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."},{name:"none",description:"There is no change to the property value between the time the animation is applied and the time the animation begins playing or after the animation completes."}],relevance:50,description:"Defines what values are applied by the animation outside the time it is executing.",restrictions:["enum"]},{name:"-o-animation-iteration-count",browsers:["O12"],values:[{name:"infinite",description:"Causes the animation to repeat forever."}],relevance:50,description:"Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.",restrictions:["number","enum"]},{name:"-o-animation-name",browsers:["O12"],values:[{name:"none",description:"No animation is performed"}],relevance:50,description:"Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.",restrictions:["identifier","enum"]},{name:"-o-animation-play-state",browsers:["O12"],values:[{name:"paused",description:"A running animation will be paused."},{name:"running",description:"Resume playback of a paused animation."}],relevance:50,description:"Defines whether the animation is running or paused.",restrictions:["enum"]},{name:"-o-animation-timing-function",browsers:["O12"],relevance:50,description:"Describes how the animation will progress over one cycle of its duration. See the 'transition-timing-function'.",restrictions:["timing-function"]},{name:"object-fit",browsers:["E79","FF36","S10","C32","O19"],values:[{name:"contain",description:"The replaced content is sized to maintain its aspect ratio while fitting within the element\u2019s content box: its concrete object size is resolved as a contain constraint against the element's used width and height."},{name:"cover",description:"The replaced content is sized to maintain its aspect ratio while filling the element's entire content box: its concrete object size is resolved as a cover constraint against the element\u2019s used width and height."},{name:"fill",description:"The replaced content is sized to fill the element\u2019s content box: the object's concrete object size is the element's used width and height."},{name:"none",description:"The replaced content is not resized to fit inside the element's content box"},{name:"scale-down",description:"Size the content as if \u2018none\u2019 or \u2018contain\u2019 were specified, whichever would result in a smaller concrete object size."}],syntax:"fill | contain | cover | none | scale-down",relevance:68,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/object-fit"}],description:"Specifies how the contents of a replaced element should be scaled relative to the box established by its used height and width.",restrictions:["enum"]},{name:"object-position",browsers:["E79","FF36","S10","C32","O19"],syntax:"<position>",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/object-position"}],description:"Determines the alignment of the replaced element inside its box.",restrictions:["position","length","percentage"]},{name:"-o-border-image",browsers:["O11.6"],values:[{name:"auto",description:"If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead."},{name:"fill",description:"Causes the middle part of the border-image to be preserved."},{name:"none"},{name:"repeat",description:"The image is tiled (repeated) to fill the area."},{name:"round",description:"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does."},{name:"space",description:"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles."},{name:"stretch",description:"The image is stretched to fill the area."}],relevance:50,description:"Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.",restrictions:["length","percentage","number","image","enum"]},{name:"-o-object-fit",browsers:["O10.6"],values:[{name:"contain",description:"The replaced content is sized to maintain its aspect ratio while fitting within the element\u2019s content box: its concrete object size is resolved as a contain constraint against the element's used width and height."},{name:"cover",description:"The replaced content is sized to maintain its aspect ratio while filling the element's entire content box: its concrete object size is resolved as a cover constraint against the element\u2019s used width and height."},{name:"fill",description:"The replaced content is sized to fill the element\u2019s content box: the object's concrete object size is the element's used width and height."},{name:"none",description:"The replaced content is not resized to fit inside the element's content box"},{name:"scale-down",description:"Size the content as if \u2018none\u2019 or \u2018contain\u2019 were specified, whichever would result in a smaller concrete object size."}],relevance:50,description:"Specifies how the contents of a replaced element should be scaled relative to the box established by its used height and width.",restrictions:["enum"]},{name:"-o-object-position",browsers:["O10.6"],relevance:50,description:"Determines the alignment of the replaced element inside its box.",restrictions:["position","length","percentage"]},{name:"opacity",syntax:"<alpha-value>",relevance:93,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/opacity"}],description:"Opacity of an element's text, where 1 is opaque and 0 is entirely transparent.",restrictions:["number(0-1)"]},{name:"order",syntax:"<integer>",relevance:63,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/order"}],description:"Controls the order in which children of a flex container appear within the flex container, by assigning them to ordinal groups.",restrictions:["integer"]},{name:"orphans",browsers:["E12","S1.3","C25","IE8","O9.2"],syntax:"<integer>",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/orphans"}],description:"Specifies the minimum number of line boxes in a block container that must be left in a fragment before a fragmentation break.",restrictions:["integer"]},{name:"-o-table-baseline",browsers:["O9.6"],relevance:50,description:"Determines which row of a inline-table should be used as baseline of inline-table.",restrictions:["integer"]},{name:"-o-tab-size",browsers:["O10.6"],relevance:50,description:"This property determines the width of the tab character (U+0009), in space characters (U+0020), when rendered.",restrictions:["integer","length"]},{name:"-o-text-overflow",browsers:["O10"],values:[{name:"clip",description:"Clip inline content that overflows. Characters may be only partially rendered."},{name:"ellipsis",description:"Render an ellipsis character (U+2026) to represent clipped inline content."}],relevance:50,description:"Text can overflow for example when it is prevented from wrapping",restrictions:["enum"]},{name:"-o-transform",browsers:["O10.5"],values:[{name:"matrix()",description:"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]"},{name:"matrix3d()",description:"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order."},{name:"none"},{name:"rotate()",description:"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property."},{name:"rotate3d()",description:"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters."},{name:"rotateX('angle')",description:"Specifies a clockwise rotation by the given angle about the X axis."},{name:"rotateY('angle')",description:"Specifies a clockwise rotation by the given angle about the Y axis."},{name:"rotateZ('angle')",description:"Specifies a clockwise rotation by the given angle about the Z axis."},{name:"scale()",description:"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first."},{name:"scale3d()",description:"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters."},{name:"scaleX()",description:"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter."},{name:"scaleY()",description:"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter."},{name:"scaleZ()",description:"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter."},{name:"skew()",description:"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis)."},{name:"skewX()",description:"Specifies a skew transformation along the X axis by the given angle."},{name:"skewY()",description:"Specifies a skew transformation along the Y axis by the given angle."},{name:"translate()",description:"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter."},{name:"translate3d()",description:"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively."},{name:"translateX()",description:"Specifies a translation by the given amount in the X direction."},{name:"translateY()",description:"Specifies a translation by the given amount in the Y direction."},{name:"translateZ()",description:"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0."}],relevance:50,description:"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.",restrictions:["enum"]},{name:"-o-transform-origin",browsers:["O10.5"],relevance:50,description:"Establishes the origin of transformation for an element.",restrictions:["positon","length","percentage"]},{name:"-o-transition",browsers:["O11.5"],values:[{name:"all",description:"Every property that is able to undergo a transition will do so."},{name:"none",description:"No property will transition."}],relevance:50,description:"Shorthand property combines four of the transition properties into a single property.",restrictions:["time","property","timing-function","enum"]},{name:"-o-transition-delay",browsers:["O11.5"],relevance:50,description:"Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.",restrictions:["time"]},{name:"-o-transition-duration",browsers:["O11.5"],relevance:50,description:"Specifies how long the transition from the old value to the new value should take.",restrictions:["time"]},{name:"-o-transition-property",browsers:["O11.5"],values:[{name:"all",description:"Every property that is able to undergo a transition will do so."},{name:"none",description:"No property will transition."}],relevance:50,description:"Specifies the name of the CSS property to which the transition is applied.",restrictions:["property"]},{name:"-o-transition-timing-function",browsers:["O11.5"],relevance:50,description:"Describes how the intermediate values used during a transition will be calculated.",restrictions:["timing-function"]},{name:"offset-block-end",browsers:["FF41"],values:[{name:"auto",description:"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well."}],relevance:50,description:"Logical 'bottom'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","percentage"]},{name:"offset-block-start",browsers:["FF41"],values:[{name:"auto",description:"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well."}],relevance:50,description:"Logical 'top'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","percentage"]},{name:"offset-inline-end",browsers:["FF41"],values:[{name:"auto",description:"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well."}],relevance:50,description:"Logical 'right'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","percentage"]},{name:"offset-inline-start",browsers:["FF41"],values:[{name:"auto",description:"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well."}],relevance:50,description:"Logical 'left'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","percentage"]},{name:"outline",values:[{name:"auto",description:"Permits the user agent to render a custom outline style, typically the default platform style."},{name:"invert",description:"Performs a color inversion on the pixels on the screen."}],syntax:"[ <'outline-color'> || <'outline-style'> || <'outline-width'> ]",relevance:88,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/outline"}],description:"Shorthand property for 'outline-style', 'outline-width', and 'outline-color'.",restrictions:["length","line-width","line-style","color","enum"]},{name:"outline-color",values:[{name:"invert",description:"Performs a color inversion on the pixels on the screen."}],syntax:"<color> | invert",relevance:55,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/outline-color"}],description:"The color of the outline.",restrictions:["enum","color"]},{name:"outline-offset",browsers:["E15","FF1.5","S1.2","C1","O9.5"],syntax:"<length>",relevance:69,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/outline-offset"}],description:"Offset the outline and draw it beyond the border edge.",restrictions:["length"]},{name:"outline-style",values:[{name:"auto",description:"Permits the user agent to render a custom outline style, typically the default platform style."}],syntax:"auto | <'border-style'>",relevance:61,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/outline-style"}],description:"Style of the outline.",restrictions:["line-style","enum"]},{name:"outline-width",syntax:"<line-width>",relevance:61,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/outline-width"}],description:"Width of the outline.",restrictions:["length","line-width"]},{name:"overflow",values:[{name:"auto",description:"The behavior of the 'auto' value is UA-dependent, but should cause a scrolling mechanism to be provided for overflowing boxes."},{name:"hidden",description:"Content is clipped and no scrolling mechanism should be provided to view the content outside the clipping region."},{name:"-moz-hidden-unscrollable",description:"Same as the standardized 'clip', except doesn\u2019t establish a block formatting context."},{name:"scroll",description:"Content is clipped and if the user agent uses a scrolling mechanism that is visible on the screen (such as a scroll bar or a panner), that mechanism should be displayed for a box whether or not any of its content is clipped."},{name:"visible",description:"Content is not clipped, i.e., it may be rendered outside the content box."}],syntax:"[ visible | hidden | clip | scroll | auto ]{1,2}",relevance:93,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/overflow"}],description:"Shorthand for setting 'overflow-x' and 'overflow-y'.",restrictions:["enum"]},{name:"overflow-wrap",values:[{name:"break-word",description:"An otherwise unbreakable sequence of characters may be broken at an arbitrary point if there are no otherwise-acceptable break points in the line."},{name:"normal",description:"Lines may break only at allowed break points."}],syntax:"normal | break-word | anywhere",relevance:66,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/overflow-wrap"}],description:"Specifies whether the UA may break within a word to prevent overflow when an otherwise-unbreakable string is too long to fit within the line box.",restrictions:["enum"]},{name:"overflow-x",values:[{name:"auto",description:"The behavior of the 'auto' value is UA-dependent, but should cause a scrolling mechanism to be provided for overflowing boxes."},{name:"hidden",description:"Content is clipped and no scrolling mechanism should be provided to view the content outside the clipping region."},{name:"scroll",description:"Content is clipped and if the user agent uses a scrolling mechanism that is visible on the screen (such as a scroll bar or a panner), that mechanism should be displayed for a box whether or not any of its content is clipped."},{name:"visible",description:"Content is not clipped, i.e., it may be rendered outside the content box."}],syntax:"visible | hidden | clip | scroll | auto",relevance:81,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/overflow-x"}],description:"Specifies the handling of overflow in the horizontal direction.",restrictions:["enum"]},{name:"overflow-y",values:[{name:"auto",description:"The behavior of the 'auto' value is UA-dependent, but should cause a scrolling mechanism to be provided for overflowing boxes."},{name:"hidden",description:"Content is clipped and no scrolling mechanism should be provided to view the content outside the clipping region."},{name:"scroll",description:"Content is clipped and if the user agent uses a scrolling mechanism that is visible on the screen (such as a scroll bar or a panner), that mechanism should be displayed for a box whether or not any of its content is clipped."},{name:"visible",description:"Content is not clipped, i.e., it may be rendered outside the content box."}],syntax:"visible | hidden | clip | scroll | auto",relevance:83,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/overflow-y"}],description:"Specifies the handling of overflow in the vertical direction.",restrictions:["enum"]},{name:"pad",browsers:["FF33"],syntax:"<integer> && <symbol>",relevance:50,description:"@counter-style descriptor. Specifies a \u201Cfixed-width\u201D counter style, where representations shorter than the pad value are padded with a particular <symbol>",restrictions:["integer","image","string","identifier"]},{name:"padding",values:[],syntax:"[ <length> | <percentage> ]{1,4}",relevance:96,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/padding"}],description:"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.",restrictions:["length","percentage"]},{name:"padding-bottom",syntax:"<length> | <percentage>",relevance:89,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/padding-bottom"}],description:"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.",restrictions:["length","percentage"]},{name:"padding-block-end",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'padding-left'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/padding-block-end"}],description:"Logical 'padding-bottom'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","percentage"]},{name:"padding-block-start",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'padding-left'>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/padding-block-start"}],description:"Logical 'padding-top'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","percentage"]},{name:"padding-inline-end",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'padding-left'>",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/padding-inline-end"}],description:"Logical 'padding-right'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","percentage"]},{name:"padding-inline-start",browsers:["E79","FF41","S12.1","C69","O56"],syntax:"<'padding-left'>",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/padding-inline-start"}],description:"Logical 'padding-left'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.",restrictions:["length","percentage"]},{name:"padding-left",syntax:"<length> | <percentage>",relevance:91,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/padding-left"}],description:"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.",restrictions:["length","percentage"]},{name:"padding-right",syntax:"<length> | <percentage>",relevance:90,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/padding-right"}],description:"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.",restrictions:["length","percentage"]},{name:"padding-top",syntax:"<length> | <percentage>",relevance:90,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/padding-top"}],description:"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.",restrictions:["length","percentage"]},{name:"page-break-after",values:[{name:"always",description:"Always force a page break after the generated box."},{name:"auto",description:"Neither force nor forbid a page break after generated box."},{name:"avoid",description:"Avoid a page break after the generated box."},{name:"left",description:"Force one or two page breaks after the generated box so that the next page is formatted as a left page."},{name:"right",description:"Force one or two page breaks after the generated box so that the next page is formatted as a right page."}],syntax:"auto | always | avoid | left | right | recto | verso",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/page-break-after"}],description:"Defines rules for page breaks after an element.",restrictions:["enum"]},{name:"page-break-before",values:[{name:"always",description:"Always force a page break before the generated box."},{name:"auto",description:"Neither force nor forbid a page break before the generated box."},{name:"avoid",description:"Avoid a page break before the generated box."},{name:"left",description:"Force one or two page breaks before the generated box so that the next page is formatted as a left page."},{name:"right",description:"Force one or two page breaks before the generated box so that the next page is formatted as a right page."}],syntax:"auto | always | avoid | left | right | recto | verso",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/page-break-before"}],description:"Defines rules for page breaks before an element.",restrictions:["enum"]},{name:"page-break-inside",values:[{name:"auto",description:"Neither force nor forbid a page break inside the generated box."},{name:"avoid",description:"Avoid a page break inside the generated box."}],syntax:"auto | avoid",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/page-break-inside"}],description:"Defines rules for page breaks inside an element.",restrictions:["enum"]},{name:"paint-order",browsers:["E17","FF60","S8","C35","O22"],values:[{name:"fill"},{name:"markers"},{name:"normal",description:"The element is painted with the standard order of painting operations: the 'fill' is painted first, then its 'stroke' and finally its markers."},{name:"stroke"}],syntax:"normal | [ fill || stroke || markers ]",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/paint-order"}],description:"Controls the order that the three paint operations that shapes and text are rendered with: their fill, their stroke and any markers they might have.",restrictions:["enum"]},{name:"perspective",values:[{name:"none",description:"No perspective transform is applied."}],syntax:"none | <length>",relevance:55,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/perspective"}],description:"Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.",restrictions:["length","enum"]},{name:"perspective-origin",syntax:"<position>",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/perspective-origin"}],description:"Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.",restrictions:["position","percentage","length"]},{name:"pointer-events",values:[{name:"all",description:"The given element can be the target element for pointer events whenever the pointer is over either the interior or the perimeter of the element."},{name:"fill",description:"The given element can be the target element for pointer events whenever the pointer is over the interior of the element."},{name:"none",description:"The given element does not receive pointer events."},{name:"painted",description:'The given element can be the target element for pointer events when the pointer is over a "painted" area. '},{name:"stroke",description:"The given element can be the target element for pointer events whenever the pointer is over the perimeter of the element."},{name:"visible",description:"The given element can be the target element for pointer events when the \u2018visibility\u2019 property is set to visible and the pointer is over either the interior or the perimeter of the element."},{name:"visibleFill",description:"The given element can be the target element for pointer events when the \u2018visibility\u2019 property is set to visible and when the pointer is over the interior of the element."},{name:"visiblePainted",description:"The given element can be the target element for pointer events when the \u2018visibility\u2019 property is set to visible and when the pointer is over a \u2018painted\u2019 area."},{name:"visibleStroke",description:"The given element can be the target element for pointer events when the \u2018visibility\u2019 property is set to visible and when the pointer is over the perimeter of the element."}],syntax:"auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | inherit",relevance:82,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/pointer-events"}],description:"Specifies under what circumstances a given element can be the target element for a pointer event.",restrictions:["enum"]},{name:"position",values:[{name:"absolute",description:"The box's position (and possibly size) is specified with the 'top', 'right', 'bottom', and 'left' properties. These properties specify offsets with respect to the box's 'containing block'."},{name:"fixed",description:"The box's position is calculated according to the 'absolute' model, but in addition, the box is fixed with respect to some reference. As with the 'absolute' model, the box's margins do not collapse with any other margins."},{name:"-ms-page",description:"The box's position is calculated according to the 'absolute' model."},{name:"relative",description:"The box's position is calculated according to the normal flow (this is called the position in normal flow). Then the box is offset relative to its normal position."},{name:"static",description:"The box is a normal box, laid out according to the normal flow. The 'top', 'right', 'bottom', and 'left' properties do not apply."},{name:"sticky",description:"The box's position is calculated according to the normal flow. Then the box is offset relative to its flow root and containing block and in all cases, including table elements, does not affect the position of any following boxes."},{name:"-webkit-sticky",description:"The box's position is calculated according to the normal flow. Then the box is offset relative to its flow root and containing block and in all cases, including table elements, does not affect the position of any following boxes."}],syntax:"static | relative | absolute | sticky | fixed",relevance:96,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/position"}],description:"The position CSS property sets how an element is positioned in a document. The top, right, bottom, and left properties determine the final location of positioned elements.",restrictions:["enum"]},{name:"prefix",browsers:["FF33"],syntax:"<symbol>",relevance:50,description:"@counter-style descriptor. Specifies a <symbol> that is prepended to the marker representation.",restrictions:["image","string","identifier"]},{name:"quotes",values:[{name:"none",description:"The 'open-quote' and 'close-quote' values of the 'content' property produce no quotations marks, as if they were 'no-open-quote' and 'no-close-quote' respectively."}],syntax:"none | auto | [ <string> <string> ]+",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/quotes"}],description:"Specifies quotation marks for any number of embedded quotations.",restrictions:["string"]},{name:"range",browsers:["FF33"],values:[{name:"auto",description:"The range depends on the counter system."},{name:"infinite",description:"If used as the first value in a range, it represents negative infinity; if used as the second value, it represents positive infinity."}],syntax:"[ [ <integer> | infinite ]{2} ]# | auto",relevance:50,description:"@counter-style descriptor. Defines the ranges over which the counter style is defined.",restrictions:["integer","enum"]},{name:"resize",browsers:["E79","FF4","S3","C1","O12.1"],values:[{name:"both",description:"The UA presents a bidirectional resizing mechanism to allow the user to adjust both the height and the width of the element."},{name:"horizontal",description:"The UA presents a unidirectional horizontal resizing mechanism to allow the user to adjust only the width of the element."},{name:"none",description:"The UA does not present a resizing mechanism on the element, and the user is given no direct manipulation mechanism to resize the element."},{name:"vertical",description:"The UA presents a unidirectional vertical resizing mechanism to allow the user to adjust only the height of the element."}],syntax:"none | both | horizontal | vertical | block | inline",relevance:61,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/resize"}],description:"Specifies whether or not an element is resizable by the user, and if so, along which axis/axes.",restrictions:["enum"]},{name:"right",values:[{name:"auto",description:"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well"}],syntax:"<length> | <percentage> | auto",relevance:91,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/right"}],description:"Specifies how far an absolutely positioned box's right margin edge is offset to the left of the right edge of the box's 'containing block'.",restrictions:["length","percentage"]},{name:"ruby-align",browsers:["FF38"],values:[{name:"auto",browsers:["FF38"],description:"The user agent determines how the ruby contents are aligned. This is the initial value."},{name:"center",description:"The ruby content is centered within its box."},{name:"distribute-letter",browsers:["FF38"],description:"If the width of the ruby text is smaller than that of the base, then the ruby text contents are evenly distributed across the width of the base, with the first and last ruby text glyphs lining up with the corresponding first and last base glyphs. If the width of the ruby text is at least the width of the base, then the letters of the base are evenly distributed across the width of the ruby text."},{name:"distribute-space",browsers:["FF38"],description:"If the width of the ruby text is smaller than that of the base, then the ruby text contents are evenly distributed across the width of the base, with a certain amount of white space preceding the first and following the last character in the ruby text. That amount of white space is normally equal to half the amount of inter-character space of the ruby text."},{name:"left",description:"The ruby text content is aligned with the start edge of the base."},{name:"line-edge",browsers:["FF38"],description:"If the ruby text is not adjacent to a line edge, it is aligned as in 'auto'. If it is adjacent to a line edge, then it is still aligned as in auto, but the side of the ruby text that touches the end of the line is lined up with the corresponding edge of the base."},{name:"right",browsers:["FF38"],description:"The ruby text content is aligned with the end edge of the base."},{name:"start",browsers:["FF38"],description:"The ruby text content is aligned with the start edge of the base."},{name:"space-between",browsers:["FF38"],description:"The ruby content expands as defined for normal text justification (as defined by 'text-justify'),"},{name:"space-around",browsers:["FF38"],description:"As for 'space-between' except that there exists an extra justification opportunities whose space is distributed half before and half after the ruby content."}],status:"experimental",syntax:"start | center | space-between | space-around",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/ruby-align"}],description:"Specifies how text is distributed within the various ruby boxes when their contents do not exactly fill their respective boxes.",restrictions:["enum"]},{name:"ruby-overhang",browsers:["FF10","IE5"],values:[{name:"auto",description:"The ruby text can overhang text adjacent to the base on either side. This is the initial value."},{name:"end",description:"The ruby text can overhang the text that follows it."},{name:"none",description:"The ruby text cannot overhang any text adjacent to its base, only its own base."},{name:"start",description:"The ruby text can overhang the text that precedes it."}],relevance:50,description:"Determines whether, and on which side, ruby text is allowed to partially overhang any adjacent text in addition to its own base, when the ruby text is wider than the ruby base.",restrictions:["enum"]},{name:"ruby-position",browsers:["E84","FF38","S7","C84","O70"],values:[{name:"after",description:"The ruby text appears after the base. This is a relatively rare setting used in ideographic East Asian writing systems, most easily found in educational text."},{name:"before",description:"The ruby text appears before the base. This is the most common setting used in ideographic East Asian writing systems."},{name:"inline"},{name:"right",description:"The ruby text appears on the right of the base. Unlike 'before' and 'after', this value is not relative to the text flow direction."}],status:"experimental",syntax:"[ alternate || [ over | under ] ] | inter-character",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/ruby-position"}],description:"Used by the parent of elements with display: ruby-text to control the position of the ruby text with respect to its base.",restrictions:["enum"]},{name:"ruby-span",browsers:["FF10"],values:[{name:"attr(x)",description:"The value of attribute 'x' is a string value. The string value is evaluated as a <number> to determine the number of ruby base elements to be spanned by the annotation element."},{name:"none",description:"No spanning. The computed value is '1'."}],relevance:50,description:"Determines whether, and on which side, ruby text is allowed to partially overhang any adjacent text in addition to its own base, when the ruby text is wider than the ruby base.",restrictions:["enum"]},{name:"scrollbar-3dlight-color",browsers:["IE5"],relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scrollbar-3dlight-color"}],description:"Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.",restrictions:["color"]},{name:"scrollbar-arrow-color",browsers:["IE5"],relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scrollbar-arrow-color"}],description:"Determines the color of the arrow elements of a scroll arrow.",restrictions:["color"]},{name:"scrollbar-base-color",browsers:["IE5"],relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scrollbar-base-color"}],description:"Determines the color of the main elements of a scroll bar, which include the scroll box, track, and scroll arrows.",restrictions:["color"]},{name:"scrollbar-darkshadow-color",browsers:["IE5"],relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scrollbar-darkshadow-color"}],description:"Determines the color of the gutter of a scroll bar.",restrictions:["color"]},{name:"scrollbar-face-color",browsers:["IE5"],relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scrollbar-face-color"}],description:"Determines the color of the scroll box and scroll arrows of a scroll bar.",restrictions:["color"]},{name:"scrollbar-highlight-color",browsers:["IE5"],relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scrollbar-highlight-color"}],description:"Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.",restrictions:["color"]},{name:"scrollbar-shadow-color",browsers:["IE5"],relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scrollbar-shadow-color"}],description:"Determines the color of the bottom and right edges of the scroll box and scroll arrows of a scroll bar.",restrictions:["color"]},{name:"scrollbar-track-color",browsers:["IE6"],relevance:50,description:"Determines the color of the track element of a scroll bar.",restrictions:["color"]},{name:"scroll-behavior",browsers:["E79","FF36","S15.4","C61","O48"],values:[{name:"auto",description:"Scrolls in an instant fashion."},{name:"smooth",description:"Scrolls in a smooth fashion using a user-agent-defined timing function and time period."}],syntax:"auto | smooth",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-behavior"}],description:"Specifies the scrolling behavior for a scrolling box, when scrolling happens due to navigation or CSSOM scrolling APIs.",restrictions:["enum"]},{name:"scroll-snap-coordinate",browsers:["FF39"],values:[{name:"none",description:"Specifies that this element does not contribute a snap point."}],status:"obsolete",syntax:"none | <position>#",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-coordinate"}],description:"Defines the x and y coordinate within the element which will align with the nearest ancestor scroll container\u2019s snap-destination for the respective axis.",restrictions:["position","length","percentage","enum"]},{name:"scroll-snap-destination",browsers:["FF39"],status:"obsolete",syntax:"<position>",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-destination"}],description:"Define the x and y coordinate within the scroll container\u2019s visual viewport which element snap points will align with.",restrictions:["position","length","percentage"]},{name:"scroll-snap-points-x",browsers:["FF39","S9"],values:[{name:"none",description:"No snap points are defined by this scroll container."},{name:"repeat()",description:"Defines an interval at which snap points are defined, starting from the container\u2019s relevant start edge."}],status:"obsolete",syntax:"none | repeat( <length-percentage> )",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-points-x"}],description:"Defines the positioning of snap points along the x axis of the scroll container it is applied to.",restrictions:["enum"]},{name:"scroll-snap-points-y",browsers:["FF39","S9"],values:[{name:"none",description:"No snap points are defined by this scroll container."},{name:"repeat()",description:"Defines an interval at which snap points are defined, starting from the container\u2019s relevant start edge."}],status:"obsolete",syntax:"none | repeat( <length-percentage> )",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-points-y"}],description:"Defines the positioning of snap points along the y axis of the scroll container it is applied to.",restrictions:["enum"]},{name:"scroll-snap-type",values:[{name:"none",description:"The visual viewport of this scroll container must ignore snap points, if any, when scrolled."},{name:"mandatory",description:"The visual viewport of this scroll container is guaranteed to rest on a snap point when there are no active scrolling operations."},{name:"proximity",description:"The visual viewport of this scroll container may come to rest on a snap point at the termination of a scroll at the discretion of the UA given the parameters of the scroll."}],syntax:"none | [ x | y | block | inline | both ] [ mandatory | proximity ]?",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type"}],description:"Defines how strictly snap points are enforced on the scroll container.",restrictions:["enum"]},{name:"shape-image-threshold",browsers:["E79","FF62","S10.1","C37","O24"],syntax:"<alpha-value>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/shape-image-threshold"}],description:"Defines the alpha channel threshold used to extract the shape using an image. A value of 0.5 means that the shape will enclose all the pixels that are more than 50% opaque.",restrictions:["number"]},{name:"shape-margin",browsers:["E79","FF62","S10.1","C37","O24"],syntax:"<length-percentage>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/shape-margin"}],description:"Adds a margin to a 'shape-outside'. This defines a new shape that is the smallest contour that includes all the points that are the 'shape-margin' distance outward in the perpendicular direction from a point on the underlying shape.",restrictions:["url","length","percentage"]},{name:"shape-outside",browsers:["E79","FF62","S10.1","C37","O24"],values:[{name:"margin-box",description:"The background is painted within (clipped to) the margin box."},{name:"none",description:"The float area is unaffected."}],syntax:"none | [ <shape-box> || <basic-shape> ] | <image>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/shape-outside"}],description:"Specifies an orthogonal rotation to be applied to an image before it is laid out.",restrictions:["image","box","shape","enum"]},{name:"shape-rendering",values:[{name:"auto",description:"Suppresses aural rendering."},{name:"crispEdges",description:"Emphasize the contrast between clean edges of artwork over rendering speed and geometric precision."},{name:"geometricPrecision",description:"Emphasize geometric precision over speed and crisp edges."},{name:"optimizeSpeed",description:"Emphasize rendering speed over geometric precision and crisp edges."}],relevance:50,description:"Provides hints about what tradeoffs to make as it renders vector graphics elements such as <path> elements and basic shapes such as circles and rectangles.",restrictions:["enum"]},{name:"size",browsers:["C","O8"],syntax:"<length>{1,2} | auto | [ <page-size> || [ portrait | landscape ] ]",relevance:53,description:"The size CSS at-rule descriptor, used with the @page at-rule, defines the size and orientation of the box which is used to represent a page. Most of the time, this size corresponds to the target size of the printed page if applicable.",restrictions:["length"]},{name:"src",values:[{name:"url()",description:"Reference font by URL"},{name:"format()",description:"Optional hint describing the format of the font resource."},{name:"local()",description:"Format-specific string that identifies a locally available copy of a given font."}],syntax:"[ <url> [ format( <string># ) ]? | local( <family-name> ) ]#",relevance:87,description:"@font-face descriptor. Specifies the resource containing font data. It is required, whether the font is downloadable or locally installed.",restrictions:["enum","url","identifier"]},{name:"stop-color",relevance:51,description:"Indicates what color to use at that gradient stop.",restrictions:["color"]},{name:"stop-opacity",relevance:50,description:"Defines the opacity of a given gradient stop.",restrictions:["number(0-1)"]},{name:"stroke",values:[{name:"url()",description:"A URL reference to a paint server element, which is an element that defines a paint server: \u2018hatch\u2019, \u2018linearGradient\u2019, \u2018mesh\u2019, \u2018pattern\u2019, \u2018radialGradient\u2019 and \u2018solidcolor\u2019."},{name:"none",description:"No paint is applied in this layer."}],relevance:65,description:"Paints along the outline of the given graphical element.",restrictions:["color","enum","url"]},{name:"stroke-dasharray",values:[{name:"none",description:"Indicates that no dashing is used."}],relevance:58,description:"Controls the pattern of dashes and gaps used to stroke paths.",restrictions:["length","percentage","number","enum"]},{name:"stroke-dashoffset",relevance:59,description:"Specifies the distance into the dash pattern to start the dash.",restrictions:["percentage","length"]},{name:"stroke-linecap",values:[{name:"butt",description:"Indicates that the stroke for each subpath does not extend beyond its two endpoints."},{name:"round",description:"Indicates that at each end of each subpath, the shape representing the stroke will be extended by a half circle with a radius equal to the stroke width."},{name:"square",description:"Indicates that at the end of each subpath, the shape representing the stroke will be extended by a rectangle with the same width as the stroke width and whose length is half of the stroke width."}],relevance:53,description:"Specifies the shape to be used at the end of open subpaths when they are stroked.",restrictions:["enum"]},{name:"stroke-linejoin",values:[{name:"bevel",description:"Indicates that a bevelled corner is to be used to join path segments."},{name:"miter",description:"Indicates that a sharp corner is to be used to join path segments."},{name:"round",description:"Indicates that a round corner is to be used to join path segments."}],relevance:50,description:"Specifies the shape to be used at the corners of paths or basic shapes when they are stroked.",restrictions:["enum"]},{name:"stroke-miterlimit",relevance:51,description:"When two line segments meet at a sharp angle and miter joins have been specified for 'stroke-linejoin', it is possible for the miter to extend far beyond the thickness of the line stroking the path.",restrictions:["number"]},{name:"stroke-opacity",relevance:52,description:"Specifies the opacity of the painting operation used to stroke the current object.",restrictions:["number(0-1)"]},{name:"stroke-width",relevance:61,description:"Specifies the width of the stroke on the current object.",restrictions:["percentage","length"]},{name:"suffix",browsers:["FF33"],syntax:"<symbol>",relevance:50,description:"@counter-style descriptor. Specifies a <symbol> that is appended to the marker representation.",restrictions:["image","string","identifier"]},{name:"system",browsers:["FF33"],values:[{name:"additive",description:"Represents \u201Csign-value\u201D numbering systems, which, rather than using reusing digits in different positions to change their value, define additional digits with much larger values, so that the value of the number can be obtained by adding all the digits together."},{name:"alphabetic",description:'Interprets the list of counter symbols as digits to an alphabetic numbering system, similar to the default lower-alpha counter style, which wraps from "a", "b", "c", to "aa", "ab", "ac".'},{name:"cyclic",description:"Cycles repeatedly through its provided symbols, looping back to the beginning when it reaches the end of the list."},{name:"extends",description:"Use the algorithm of another counter style, but alter other aspects."},{name:"fixed",description:"Runs through its list of counter symbols once, then falls back."},{name:"numeric",description:`interprets the list of counter symbols as digits to a "place-value" numbering system, similar to the default 'decimal' counter style.`},{name:"symbolic",description:"Cycles repeatedly through its provided symbols, doubling, tripling, etc. the symbols on each successive pass through the list."}],syntax:"cyclic | numeric | alphabetic | symbolic | additive | [ fixed <integer>? ] | [ extends <counter-style-name> ]",relevance:50,description:"@counter-style descriptor. Specifies which algorithm will be used to construct the counter\u2019s representation based on the counter value.",restrictions:["enum","integer"]},{name:"symbols",browsers:["FF33"],syntax:"<symbol>+",relevance:50,description:"@counter-style descriptor. Specifies the symbols used by the marker-construction algorithm specified by the system descriptor.",restrictions:["image","string","identifier"]},{name:"table-layout",values:[{name:"auto",description:"Use any automatic table layout algorithm."},{name:"fixed",description:"Use the fixed table layout algorithm."}],syntax:"auto | fixed",relevance:60,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/table-layout"}],description:"Controls the algorithm used to lay out the table cells, rows, and columns.",restrictions:["enum"]},{name:"tab-size",browsers:["E79","FF91","S7","C21","O15"],syntax:"<integer> | <length>",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/tab-size"}],description:"Determines the width of the tab character (U+0009), in space characters (U+0020), when rendered.",restrictions:["integer","length"]},{name:"text-align",values:[{name:"center",description:"The inline contents are centered within the line box."},{name:"end",description:"The inline contents are aligned to the end edge of the line box."},{name:"justify",description:"The text is justified according to the method specified by the 'text-justify' property."},{name:"left",description:"The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text."},{name:"right",description:"The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text."},{name:"start",description:"The inline contents are aligned to the start edge of the line box."}],syntax:"start | end | left | right | center | justify | match-parent",relevance:94,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-align"}],description:"Describes how inline contents of a block are horizontally aligned if the contents do not completely fill the line box.",restrictions:["string"]},{name:"text-align-last",browsers:["E12","FF49","C47","IE5.5","O34"],values:[{name:"auto",description:"Content on the affected line is aligned per 'text-align' unless 'text-align' is set to 'justify', in which case it is 'start-aligned'."},{name:"center",description:"The inline contents are centered within the line box."},{name:"justify",description:"The text is justified according to the method specified by the 'text-justify' property."},{name:"left",description:"The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text."},{name:"right",description:"The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text."}],syntax:"auto | start | end | left | right | center | justify",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-align-last"}],description:"Describes how the last line of a block or a line right before a forced line break is aligned when 'text-align' is set to 'justify'.",restrictions:["enum"]},{name:"text-anchor",values:[{name:"end",description:"The rendered characters are aligned such that the end of the resulting rendered text is at the initial current text position."},{name:"middle",description:"The rendered characters are aligned such that the geometric middle of the resulting rendered text is at the initial current text position."},{name:"start",description:"The rendered characters are aligned such that the start of the resulting rendered text is at the initial current text position."}],relevance:50,description:"Used to align (start-, middle- or end-alignment) a string of text relative to a given point.",restrictions:["enum"]},{name:"text-decoration",values:[{name:"dashed",description:"Produces a dashed line style."},{name:"dotted",description:"Produces a dotted line."},{name:"double",description:"Produces a double line."},{name:"line-through",description:"Each line of text has a line through the middle."},{name:"none",description:"Produces no line."},{name:"overline",description:"Each line of text has a line above it."},{name:"solid",description:"Produces a solid line."},{name:"underline",description:"Each line of text is underlined."},{name:"wavy",description:"Produces a wavy line."}],syntax:"<'text-decoration-line'> || <'text-decoration-style'> || <'text-decoration-color'> || <'text-decoration-thickness'>",relevance:92,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-decoration"}],description:"Decorations applied to font used for an element's text.",restrictions:["enum","color"]},{name:"text-decoration-color",browsers:["E79","FF36","S12.1","C57","O44"],syntax:"<color>",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-decoration-color"}],description:"Specifies the color of text decoration (underlines overlines, and line-throughs) set on the element with text-decoration-line.",restrictions:["color"]},{name:"text-decoration-line",browsers:["E79","FF36","S12.1","C57","O44"],values:[{name:"line-through",description:"Each line of text has a line through the middle."},{name:"none",description:"Neither produces nor inhibits text decoration."},{name:"overline",description:"Each line of text has a line above it."},{name:"underline",description:"Each line of text is underlined."}],syntax:"none | [ underline || overline || line-through || blink ] | spelling-error | grammar-error",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-decoration-line"}],description:"Specifies what line decorations, if any, are added to the element.",restrictions:["enum"]},{name:"text-decoration-style",browsers:["E79","FF36","S12.1","C57","O44"],values:[{name:"dashed",description:"Produces a dashed line style."},{name:"dotted",description:"Produces a dotted line."},{name:"double",description:"Produces a double line."},{name:"none",description:"Produces no line."},{name:"solid",description:"Produces a solid line."},{name:"wavy",description:"Produces a wavy line."}],syntax:"solid | double | dotted | dashed | wavy",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-decoration-style"}],description:"Specifies the line style for underline, line-through and overline text decoration.",restrictions:["enum"]},{name:"text-indent",values:[],syntax:"<length-percentage> && hanging? && each-line?",relevance:68,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-indent"}],description:"Specifies the indentation applied to lines of inline content in a block. The indentation only affects the first line of inline content in the block unless the 'hanging' keyword is specified, in which case it affects all lines except the first.",restrictions:["percentage","length"]},{name:"text-justify",browsers:["E12","FF55","C32","IE11","O19"],values:[{name:"auto",description:"The UA determines the justification algorithm to follow, based on a balance between performance and adequate presentation quality."},{name:"distribute",description:"Justification primarily changes spacing both at word separators and at grapheme cluster boundaries in all scripts except those in the connected and cursive groups. This value is sometimes used in e.g. Japanese, often with the 'text-align-last' property."},{name:"distribute-all-lines"},{name:"inter-cluster",description:"Justification primarily changes spacing at word separators and at grapheme cluster boundaries in clustered scripts. This value is typically used for Southeast Asian scripts such as Thai."},{name:"inter-ideograph",description:"Justification primarily changes spacing at word separators and at inter-graphemic boundaries in scripts that use no word spaces. This value is typically used for CJK languages."},{name:"inter-word",description:"Justification primarily changes spacing at word separators. This value is typically used for languages that separate words using spaces, like English or (sometimes) Korean."},{name:"kashida",description:"Justification primarily stretches Arabic and related scripts through the use of kashida or other calligraphic elongation."},{name:"newspaper"}],syntax:"auto | inter-character | inter-word | none",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-justify"}],description:"Selects the justification algorithm used when 'text-align' is set to 'justify'. The property applies to block containers, but the UA may (but is not required to) also support it on inline elements.",restrictions:["enum"]},{name:"text-orientation",browsers:["E79","FF41","S14","C48","O35"],values:[{name:"sideways",browsers:["E79","FF41","S14","C48","O35"],description:"This value is equivalent to 'sideways-right' in 'vertical-rl' writing mode and equivalent to 'sideways-left' in 'vertical-lr' writing mode."},{name:"sideways-right",browsers:["E79","FF41","S14","C48","O35"],description:"In vertical writing modes, this causes text to be set as if in a horizontal layout, but rotated 90\xB0 clockwise."},{name:"upright",description:"In vertical writing modes, characters from horizontal-only scripts are rendered upright, i.e. in their standard horizontal orientation."}],syntax:"mixed | upright | sideways",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-orientation"}],description:"Specifies the orientation of text within a line.",restrictions:["enum"]},{name:"text-overflow",values:[{name:"clip",description:"Clip inline content that overflows. Characters may be only partially rendered."},{name:"ellipsis",description:"Render an ellipsis character (U+2026) to represent clipped inline content."}],syntax:"[ clip | ellipsis | <string> ]{1,2}",relevance:82,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-overflow"}],description:"Text can overflow for example when it is prevented from wrapping.",restrictions:["enum","string"]},{name:"text-rendering",browsers:["E79","FF1","S5","C4","O15"],values:[{name:"auto"},{name:"geometricPrecision",description:"Indicates that the user agent shall emphasize geometric precision over legibility and rendering speed."},{name:"optimizeLegibility",description:"Indicates that the user agent shall emphasize legibility over rendering speed and geometric precision."},{name:"optimizeSpeed",description:"Indicates that the user agent shall emphasize rendering speed over legibility and geometric precision."}],syntax:"auto | optimizeSpeed | optimizeLegibility | geometricPrecision",relevance:70,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-rendering"}],description:"The creator of SVG content might want to provide a hint to the implementation about what tradeoffs to make as it renders text. The \u2018text-rendering\u2019 property provides these hints.",restrictions:["enum"]},{name:"text-shadow",values:[{name:"none",description:"No shadow."}],syntax:"none | <shadow-t>#",relevance:74,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-shadow"}],description:"Enables shadow effects to be applied to the text of the element.",restrictions:["length","color"]},{name:"text-transform",values:[{name:"capitalize",description:"Puts the first typographic letter unit of each word in titlecase."},{name:"lowercase",description:"Puts all letters in lowercase."},{name:"none",description:"No effects."},{name:"uppercase",description:"Puts all letters in uppercase."}],syntax:"none | capitalize | uppercase | lowercase | full-width | full-size-kana",relevance:86,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-transform"}],description:"Controls capitalization effects of an element\u2019s text.",restrictions:["enum"]},{name:"text-underline-position",values:[{name:"above"},{name:"auto",description:"The user agent may use any algorithm to determine the underline\u2019s position. In horizontal line layout, the underline should be aligned as for alphabetic. In vertical line layout, if the language is set to Japanese or Korean, the underline should be aligned as for over."},{name:"below",description:"The underline is aligned with the under edge of the element\u2019s content box."}],syntax:"auto | from-font | [ under || [ left | right ] ]",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-underline-position"}],description:"Sets the position of an underline specified on the same element: it does not affect underlines specified by ancestor elements. This property is typically used in vertical writing contexts such as in Japanese documents where it often desired to have the underline appear 'over' (to the right of) the affected run of text",restrictions:["enum"]},{name:"top",values:[{name:"auto",description:"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well"}],syntax:"<length> | <percentage> | auto",relevance:95,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/top"}],description:"Specifies how far an absolutely positioned box's top margin edge is offset below the top edge of the box's 'containing block'.",restrictions:["length","percentage"]},{name:"touch-action",values:[{name:"auto",description:"The user agent may determine any permitted touch behaviors for touches that begin on the element."},{name:"cross-slide-x"},{name:"cross-slide-y"},{name:"double-tap-zoom"},{name:"manipulation",description:"The user agent may consider touches that begin on the element only for the purposes of scrolling and continuous zooming."},{name:"none",description:"Touches that begin on the element must not trigger default touch behaviors."},{name:"pan-x",description:"The user agent may consider touches that begin on the element only for the purposes of horizontally scrolling the element\u2019s nearest ancestor with horizontally scrollable content."},{name:"pan-y",description:"The user agent may consider touches that begin on the element only for the purposes of vertically scrolling the element\u2019s nearest ancestor with vertically scrollable content."},{name:"pinch-zoom"}],syntax:"auto | none | [ [ pan-x | pan-left | pan-right ] || [ pan-y | pan-up | pan-down ] || pinch-zoom ] | manipulation",relevance:67,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/touch-action"}],description:"Determines whether touch input may trigger default behavior supplied by user agent.",restrictions:["enum"]},{name:"transform",values:[{name:"matrix()",description:"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]"},{name:"matrix3d()",description:"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order."},{name:"none"},{name:"perspective()",description:"Specifies a perspective projection matrix."},{name:"rotate()",description:"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property."},{name:"rotate3d()",description:"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters."},{name:"rotateX('angle')",description:"Specifies a clockwise rotation by the given angle about the X axis."},{name:"rotateY('angle')",description:"Specifies a clockwise rotation by the given angle about the Y axis."},{name:"rotateZ('angle')",description:"Specifies a clockwise rotation by the given angle about the Z axis."},{name:"scale()",description:"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first."},{name:"scale3d()",description:"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters."},{name:"scaleX()",description:"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter."},{name:"scaleY()",description:"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter."},{name:"scaleZ()",description:"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter."},{name:"skew()",description:"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis)."},{name:"skewX()",description:"Specifies a skew transformation along the X axis by the given angle."},{name:"skewY()",description:"Specifies a skew transformation along the Y axis by the given angle."},{name:"translate()",description:"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter."},{name:"translate3d()",description:"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively."},{name:"translateX()",description:"Specifies a translation by the given amount in the X direction."},{name:"translateY()",description:"Specifies a translation by the given amount in the Y direction."},{name:"translateZ()",description:"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0."}],syntax:"none | <transform-list>",relevance:90,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/transform"}],description:"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.",restrictions:["enum"]},{name:"transform-origin",syntax:"[ <length-percentage> | left | center | right | top | bottom ] | [ [ <length-percentage> | left | center | right ] && [ <length-percentage> | top | center | bottom ] ] <length>?",relevance:77,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/transform-origin"}],description:"Establishes the origin of transformation for an element.",restrictions:["position","length","percentage"]},{name:"transform-style",browsers:["E12","FF16","S9","C36","O23"],values:[{name:"flat",description:"All children of this element are rendered flattened into the 2D plane of the element."},{name:"preserve-3d",browsers:["E12","FF16","S9","C36","O23"],description:"Flattening is not performed, so children maintain their position in 3D space."}],syntax:"flat | preserve-3d",relevance:55,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/transform-style"}],description:"Defines how nested elements are rendered in 3D space.",restrictions:["enum"]},{name:"transition",values:[{name:"all",description:"Every property that is able to undergo a transition will do so."},{name:"none",description:"No property will transition."}],syntax:"<single-transition>#",relevance:88,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/transition"}],description:"Shorthand property combines four of the transition properties into a single property.",restrictions:["time","property","timing-function","enum"]},{name:"transition-delay",syntax:"<time>#",relevance:64,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/transition-delay"}],description:"Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.",restrictions:["time"]},{name:"transition-duration",syntax:"<time>#",relevance:64,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/transition-duration"}],description:"Specifies how long the transition from the old value to the new value should take.",restrictions:["time"]},{name:"transition-property",values:[{name:"all",description:"Every property that is able to undergo a transition will do so."},{name:"none",description:"No property will transition."}],syntax:"none | <single-transition-property>#",relevance:64,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/transition-property"}],description:"Specifies the name of the CSS property to which the transition is applied.",restrictions:["property"]},{name:"transition-timing-function",syntax:"<easing-function>#",relevance:64,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/transition-timing-function"}],description:"Describes how the intermediate values used during a transition will be calculated.",restrictions:["timing-function"]},{name:"unicode-bidi",values:[{name:"bidi-override",description:"Inside the element, reordering is strictly in sequence according to the 'direction' property; the implicit part of the bidirectional algorithm is ignored."},{name:"embed",description:"If the element is inline-level, this value opens an additional level of embedding with respect to the bidirectional algorithm. The direction of this embedding level is given by the 'direction' property."},{name:"isolate",description:"The contents of the element are considered to be inside a separate, independent paragraph."},{name:"isolate-override",description:"This combines the isolation behavior of 'isolate' with the directional override behavior of 'bidi-override'"},{name:"normal",description:"The element does not open an additional level of embedding with respect to the bidirectional algorithm. For inline-level elements, implicit reordering works across element boundaries."},{name:"plaintext",description:"For the purposes of the Unicode bidirectional algorithm, the base directionality of each bidi paragraph for which the element forms the containing block is determined not by the element's computed 'direction'."}],syntax:"normal | embed | isolate | bidi-override | isolate-override | plaintext",relevance:57,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/unicode-bidi"}],description:"The level of embedding with respect to the bidirectional algorithm.",restrictions:["enum"]},{name:"unicode-range",values:[{name:"U+26",description:"Ampersand."},{name:"U+20-24F, U+2B0-2FF, U+370-4FF, U+1E00-1EFF, U+2000-20CF, U+2100-23FF, U+2500-26FF, U+E000-F8FF, U+FB00\u2013FB4F",description:"WGL4 character set (Pan-European)."},{name:"U+20-17F, U+2B0-2FF, U+2000-206F, U+20A0-20CF, U+2100-21FF, U+2600-26FF",description:"The Multilingual European Subset No. 1. Latin. Covers ~44 languages."},{name:"U+20-2FF, U+370-4FF, U+1E00-20CF, U+2100-23FF, U+2500-26FF, U+FB00-FB4F, U+FFF0-FFFD",description:"The Multilingual European Subset No. 2. Latin, Greek, and Cyrillic. Covers ~128 language."},{name:"U+20-4FF, U+530-58F, U+10D0-10FF, U+1E00-23FF, U+2440-245F, U+2500-26FF, U+FB00-FB4F, U+FE20-FE2F, U+FFF0-FFFD",description:"The Multilingual European Subset No. 3. Covers all characters belonging to European scripts."},{name:"U+00-7F",description:"Basic Latin (ASCII)."},{name:"U+80-FF",description:"Latin-1 Supplement. Accented characters for Western European languages, common punctuation characters, multiplication and division signs."},{name:"U+100-17F",description:"Latin Extended-A. Accented characters for for Czech, Dutch, Polish, and Turkish."},{name:"U+180-24F",description:"Latin Extended-B. Croatian, Slovenian, Romanian, Non-European and historic latin, Khoisan, Pinyin, Livonian, Sinology."},{name:"U+1E00-1EFF",description:"Latin Extended Additional. Vietnamese, German captial sharp s, Medievalist, Latin general use."},{name:"U+250-2AF",description:"International Phonetic Alphabet Extensions."},{name:"U+370-3FF",description:"Greek and Coptic."},{name:"U+1F00-1FFF",description:"Greek Extended. Accented characters for polytonic Greek."},{name:"U+400-4FF",description:"Cyrillic."},{name:"U+500-52F",description:"Cyrillic Supplement. Extra letters for Komi, Khanty, Chukchi, Mordvin, Kurdish, Aleut, Chuvash, Abkhaz, Azerbaijani, and Orok."},{name:"U+00-52F, U+1E00-1FFF, U+2200\u201322FF",description:"Latin, Greek, Cyrillic, some punctuation and symbols."},{name:"U+530\u201358F",description:"Armenian."},{name:"U+590\u20135FF",description:"Hebrew."},{name:"U+600\u20136FF",description:"Arabic."},{name:"U+750\u201377F",description:"Arabic Supplement. Additional letters for African languages, Khowar, Torwali, Burushaski, and early Persian."},{name:"U+8A0\u20138FF",description:"Arabic Extended-A. Additional letters for African languages, European and Central Asian languages, Rohingya, Tamazight, Arwi, and Koranic annotation signs."},{name:"U+700\u201374F",description:"Syriac."},{name:"U+900\u201397F",description:"Devanagari."},{name:"U+980\u20139FF",description:"Bengali."},{name:"U+A00\u2013A7F",description:"Gurmukhi."},{name:"U+A80\u2013AFF",description:"Gujarati."},{name:"U+B00\u2013B7F",description:"Oriya."},{name:"U+B80\u2013BFF",description:"Tamil."},{name:"U+C00\u2013C7F",description:"Telugu."},{name:"U+C80\u2013CFF",description:"Kannada."},{name:"U+D00\u2013D7F",description:"Malayalam."},{name:"U+D80\u2013DFF",description:"Sinhala."},{name:"U+118A0\u2013118FF",description:"Warang Citi."},{name:"U+E00\u2013E7F",description:"Thai."},{name:"U+1A20\u20131AAF",description:"Tai Tham."},{name:"U+AA80\u2013AADF",description:"Tai Viet."},{name:"U+E80\u2013EFF",description:"Lao."},{name:"U+F00\u2013FFF",description:"Tibetan."},{name:"U+1000\u2013109F",description:"Myanmar (Burmese)."},{name:"U+10A0\u201310FF",description:"Georgian."},{name:"U+1200\u2013137F",description:"Ethiopic."},{name:"U+1380\u2013139F",description:"Ethiopic Supplement. Extra Syllables for Sebatbeit, and Tonal marks"},{name:"U+2D80\u20132DDF",description:"Ethiopic Extended. Extra Syllables for Me'en, Blin, and Sebatbeit."},{name:"U+AB00\u2013AB2F",description:"Ethiopic Extended-A. Extra characters for Gamo-Gofa-Dawro, Basketo, and Gumuz."},{name:"U+1780\u201317FF",description:"Khmer."},{name:"U+1800\u201318AF",description:"Mongolian."},{name:"U+1B80\u20131BBF",description:"Sundanese."},{name:"U+1CC0\u20131CCF",description:"Sundanese Supplement. Punctuation."},{name:"U+4E00\u20139FD5",description:"CJK (Chinese, Japanese, Korean) Unified Ideographs. Most common ideographs for modern Chinese and Japanese."},{name:"U+3400\u20134DB5",description:"CJK Unified Ideographs Extension A. Rare ideographs."},{name:"U+2F00\u20132FDF",description:"Kangxi Radicals."},{name:"U+2E80\u20132EFF",description:"CJK Radicals Supplement. Alternative forms of Kangxi Radicals."},{name:"U+1100\u201311FF",description:"Hangul Jamo."},{name:"U+AC00\u2013D7AF",description:"Hangul Syllables."},{name:"U+3040\u2013309F",description:"Hiragana."},{name:"U+30A0\u201330FF",description:"Katakana."},{name:"U+A5, U+4E00-9FFF, U+30??, U+FF00-FF9F",description:"Japanese Kanji, Hiragana and Katakana characters plus Yen/Yuan symbol."},{name:"U+A4D0\u2013A4FF",description:"Lisu."},{name:"U+A000\u2013A48F",description:"Yi Syllables."},{name:"U+A490\u2013A4CF",description:"Yi Radicals."},{name:"U+2000-206F",description:"General Punctuation."},{name:"U+3000\u2013303F",description:"CJK Symbols and Punctuation."},{name:"U+2070\u2013209F",description:"Superscripts and Subscripts."},{name:"U+20A0\u201320CF",description:"Currency Symbols."},{name:"U+2100\u2013214F",description:"Letterlike Symbols."},{name:"U+2150\u2013218F",description:"Number Forms."},{name:"U+2190\u201321FF",description:"Arrows."},{name:"U+2200\u201322FF",description:"Mathematical Operators."},{name:"U+2300\u201323FF",description:"Miscellaneous Technical."},{name:"U+E000-F8FF",description:"Private Use Area."},{name:"U+FB00\u2013FB4F",description:"Alphabetic Presentation Forms. Ligatures for latin, Armenian, and Hebrew."},{name:"U+FB50\u2013FDFF",description:"Arabic Presentation Forms-A. Contextual forms / ligatures for Persian, Urdu, Sindhi, Central Asian languages, etc, Arabic pedagogical symbols, word ligatures."},{name:"U+1F600\u20131F64F",description:"Emoji: Emoticons."},{name:"U+2600\u201326FF",description:"Emoji: Miscellaneous Symbols."},{name:"U+1F300\u20131F5FF",description:"Emoji: Miscellaneous Symbols and Pictographs."},{name:"U+1F900\u20131F9FF",description:"Emoji: Supplemental Symbols and Pictographs."},{name:"U+1F680\u20131F6FF",description:"Emoji: Transport and Map Symbols."}],syntax:"<unicode-range>#",relevance:73,description:"@font-face descriptor. Defines the set of Unicode codepoints that may be supported by the font face for which it is declared.",restrictions:["unicode-range"]},{name:"user-select",values:[{name:"all",description:"The content of the element must be selected atomically"},{name:"auto"},{name:"contain",description:"UAs must not allow a selection which is started in this element to be extended outside of this element."},{name:"none",description:"The UA must not allow selections to be started in this element."},{name:"text",description:"The element imposes no constraint on the selection."}],syntax:"auto | text | none | contain | all",relevance:78,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/user-select"}],description:"Controls the appearance of selection.",restrictions:["enum"]},{name:"vertical-align",values:[{name:"auto",description:"Align the dominant baseline of the parent box with the equivalent, or heuristically reconstructed, baseline of the element inline box."},{name:"baseline",description:"Align the 'alphabetic' baseline of the element with the 'alphabetic' baseline of the parent element."},{name:"bottom",description:"Align the after edge of the extended inline box with the after-edge of the line box."},{name:"middle",description:"Align the 'middle' baseline of the inline element with the middle baseline of the parent."},{name:"sub",description:"Lower the baseline of the box to the proper position for subscripts of the parent's box. (This value has no effect on the font size of the element's text.)"},{name:"super",description:"Raise the baseline of the box to the proper position for superscripts of the parent's box. (This value has no effect on the font size of the element's text.)"},{name:"text-bottom",description:"Align the bottom of the box with the after-edge of the parent element's font."},{name:"text-top",description:"Align the top of the box with the before-edge of the parent element's font."},{name:"top",description:"Align the before edge of the extended inline box with the before-edge of the line box."},{name:"-webkit-baseline-middle"}],syntax:"baseline | sub | super | text-top | text-bottom | middle | top | bottom | <percentage> | <length>",relevance:92,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/vertical-align"}],description:"Affects the vertical positioning of the inline boxes generated by an inline-level element inside a line box.",restrictions:["percentage","length"]},{name:"visibility",values:[{name:"collapse",description:"Table-specific. If used on elements other than rows, row groups, columns, or column groups, 'collapse' has the same meaning as 'hidden'."},{name:"hidden",description:"The generated box is invisible (fully transparent, nothing is drawn), but still affects layout."},{name:"visible",description:"The generated box is visible."}],syntax:"visible | hidden | collapse",relevance:88,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/visibility"}],description:"Specifies whether the boxes generated by an element are rendered. Invisible boxes still affect layout (set the \u2018display\u2019 property to \u2018none\u2019 to suppress box generation altogether).",restrictions:["enum"]},{name:"-webkit-animation",browsers:["C","S5"],values:[{name:"alternate",description:"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."},{name:"alternate-reverse",description:"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."},{name:"backwards",description:"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."},{name:"both",description:"Both forwards and backwards fill modes are applied."},{name:"forwards",description:"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."},{name:"infinite",description:"Causes the animation to repeat forever."},{name:"none",description:"No animation is performed"},{name:"normal",description:"Normal playback."},{name:"reverse",description:"All iterations of the animation are played in the reverse direction from the way they were specified."}],relevance:50,description:"Shorthand property combines six of the animation properties into a single property.",restrictions:["time","enum","timing-function","identifier","number"]},{name:"-webkit-animation-delay",browsers:["C","S5"],relevance:50,description:"Defines when the animation will start.",restrictions:["time"]},{name:"-webkit-animation-direction",browsers:["C","S5"],values:[{name:"alternate",description:"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."},{name:"alternate-reverse",description:"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."},{name:"normal",description:"Normal playback."},{name:"reverse",description:"All iterations of the animation are played in the reverse direction from the way they were specified."}],relevance:50,description:"Defines whether or not the animation should play in reverse on alternate cycles.",restrictions:["enum"]},{name:"-webkit-animation-duration",browsers:["C","S5"],relevance:50,description:"Defines the length of time that an animation takes to complete one cycle.",restrictions:["time"]},{name:"-webkit-animation-fill-mode",browsers:["C","S5"],values:[{name:"backwards",description:"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."},{name:"both",description:"Both forwards and backwards fill modes are applied."},{name:"forwards",description:"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."},{name:"none",description:"There is no change to the property value between the time the animation is applied and the time the animation begins playing or after the animation completes."}],relevance:50,description:"Defines what values are applied by the animation outside the time it is executing.",restrictions:["enum"]},{name:"-webkit-animation-iteration-count",browsers:["C","S5"],values:[{name:"infinite",description:"Causes the animation to repeat forever."}],relevance:50,description:"Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.",restrictions:["number","enum"]},{name:"-webkit-animation-name",browsers:["C","S5"],values:[{name:"none",description:"No animation is performed"}],relevance:50,description:"Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.",restrictions:["identifier","enum"]},{name:"-webkit-animation-play-state",browsers:["C","S5"],values:[{name:"paused",description:"A running animation will be paused."},{name:"running",description:"Resume playback of a paused animation."}],relevance:50,description:"Defines whether the animation is running or paused.",restrictions:["enum"]},{name:"-webkit-animation-timing-function",browsers:["C","S5"],relevance:50,description:"Describes how the animation will progress over one cycle of its duration. See the 'transition-timing-function'.",restrictions:["timing-function"]},{name:"-webkit-appearance",browsers:["C","S3"],values:[{name:"button"},{name:"button-bevel"},{name:"caps-lock-indicator"},{name:"caret"},{name:"checkbox"},{name:"default-button"},{name:"listbox"},{name:"listitem"},{name:"media-fullscreen-button"},{name:"media-mute-button"},{name:"media-play-button"},{name:"media-seek-back-button"},{name:"media-seek-forward-button"},{name:"media-slider"},{name:"media-sliderthumb"},{name:"menulist"},{name:"menulist-button"},{name:"menulist-text"},{name:"menulist-textfield"},{name:"none"},{name:"push-button"},{name:"radio"},{name:"scrollbarbutton-down"},{name:"scrollbarbutton-left"},{name:"scrollbarbutton-right"},{name:"scrollbarbutton-up"},{name:"scrollbargripper-horizontal"},{name:"scrollbargripper-vertical"},{name:"scrollbarthumb-horizontal"},{name:"scrollbarthumb-vertical"},{name:"scrollbartrack-horizontal"},{name:"scrollbartrack-vertical"},{name:"searchfield"},{name:"searchfield-cancel-button"},{name:"searchfield-decoration"},{name:"searchfield-results-button"},{name:"searchfield-results-decoration"},{name:"slider-horizontal"},{name:"sliderthumb-horizontal"},{name:"sliderthumb-vertical"},{name:"slider-vertical"},{name:"square-button"},{name:"textarea"},{name:"textfield"}],status:"nonstandard",syntax:"none | button | button-bevel | caret | checkbox | default-button | inner-spin-button | listbox | listitem | media-controls-background | media-controls-fullscreen-background | media-current-time-display | media-enter-fullscreen-button | media-exit-fullscreen-button | media-fullscreen-button | media-mute-button | media-overlay-play-button | media-play-button | media-seek-back-button | media-seek-forward-button | media-slider | media-sliderthumb | media-time-remaining-display | media-toggle-closed-captions-button | media-volume-slider | media-volume-slider-container | media-volume-sliderthumb | menulist | menulist-button | menulist-text | menulist-textfield | meter | progress-bar | progress-bar-value | push-button | radio | searchfield | searchfield-cancel-button | searchfield-decoration | searchfield-results-button | searchfield-results-decoration | slider-horizontal | slider-vertical | sliderthumb-horizontal | sliderthumb-vertical | square-button | textarea | textfield | -apple-pay-button",relevance:0,description:"Changes the appearance of buttons and other controls to resemble native controls.",restrictions:["enum"]},{name:"-webkit-backdrop-filter",browsers:["S9"],values:[{name:"none",description:"No filter effects are applied."},{name:"blur()",description:"Applies a Gaussian blur to the input image."},{name:"brightness()",description:"Applies a linear multiplier to input image, making it appear more or less bright."},{name:"contrast()",description:"Adjusts the contrast of the input."},{name:"drop-shadow()",description:"Applies a drop shadow effect to the input image."},{name:"grayscale()",description:"Converts the input image to grayscale."},{name:"hue-rotate()",description:"Applies a hue rotation on the input image. "},{name:"invert()",description:"Inverts the samples in the input image."},{name:"opacity()",description:"Applies transparency to the samples in the input image."},{name:"saturate()",description:"Saturates the input image."},{name:"sepia()",description:"Converts the input image to sepia."},{name:"url()",description:"A filter reference to a <filter> element."}],relevance:50,description:"Applies a filter effect where the first filter in the list takes the element's background image as the input image.",restrictions:["enum","url"]},{name:"-webkit-backface-visibility",browsers:["C","S5"],values:[{name:"hidden"},{name:"visible"}],relevance:50,description:"Determines whether or not the 'back' side of a transformed element is visible when facing the viewer. With an identity transform, the front side of an element faces the viewer.",restrictions:["enum"]},{name:"-webkit-background-clip",browsers:["C","S3"],relevance:50,description:"Determines the background painting area.",restrictions:["box"]},{name:"-webkit-background-composite",browsers:["C","S3"],values:[{name:"border"},{name:"padding"}],relevance:50,restrictions:["enum"]},{name:"-webkit-background-origin",browsers:["C","S3"],relevance:50,description:"For elements rendered as a single box, specifies the background positioning area. For elements rendered as multiple boxes (e.g., inline boxes on several lines, boxes on several pages) specifies which boxes 'box-decoration-break' operates on to determine the background positioning area(s).",restrictions:["box"]},{name:"-webkit-border-image",browsers:["C","S5"],values:[{name:"auto",description:"If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead."},{name:"fill",description:"Causes the middle part of the border-image to be preserved."},{name:"none"},{name:"repeat",description:"The image is tiled (repeated) to fill the area."},{name:"round",description:"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does."},{name:"space",description:"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles."},{name:"stretch",description:"The image is stretched to fill the area."},{name:"url()"}],relevance:50,description:"Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.",restrictions:["length","percentage","number","url","enum"]},{name:"-webkit-box-align",browsers:["C","S3"],values:[{name:"baseline",description:"If this box orientation is inline-axis or horizontal, all children are placed with their baselines aligned, and extra space placed before or after as necessary. For block flows, the baseline of the first non-empty line box located within the element is used. For tables, the baseline of the first cell is used."},{name:"center",description:"Any extra space is divided evenly, with half placed above the child and the other half placed after the child."},{name:"end",description:"For normal direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element. For reverse direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element."},{name:"start",description:"For normal direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element. For reverse direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element."},{name:"stretch",description:"The height of each child is adjusted to that of the containing block."}],relevance:50,description:"Specifies the alignment of nested elements within an outer flexible box element.",restrictions:["enum"]},{name:"-webkit-box-direction",browsers:["C","S3"],values:[{name:"normal",description:"A box with a computed value of horizontal for box-orient displays its children from left to right. A box with a computed value of vertical displays its children from top to bottom."},{name:"reverse",description:"A box with a computed value of horizontal for box-orient displays its children from right to left. A box with a computed value of vertical displays its children from bottom to top."}],relevance:50,description:"In webkit applications, -webkit-box-direction specifies whether a box lays out its contents normally (from the top or left edge), or in reverse (from the bottom or right edge).",restrictions:["enum"]},{name:"-webkit-box-flex",browsers:["C","S3"],relevance:50,description:"Specifies an element's flexibility.",restrictions:["number"]},{name:"-webkit-box-flex-group",browsers:["C","S3"],relevance:50,description:"Flexible elements can be assigned to flex groups using the 'box-flex-group' property.",restrictions:["integer"]},{name:"-webkit-box-ordinal-group",browsers:["C","S3"],relevance:50,description:"Indicates the ordinal group the element belongs to. Elements with a lower ordinal group are displayed before those with a higher ordinal group.",restrictions:["integer"]},{name:"-webkit-box-orient",browsers:["C","S3"],values:[{name:"block-axis",description:"Elements are oriented along the box's axis."},{name:"horizontal",description:"The box displays its children from left to right in a horizontal line."},{name:"inline-axis",description:"Elements are oriented vertically."},{name:"vertical",description:"The box displays its children from stacked from top to bottom vertically."}],relevance:50,description:"In webkit applications, -webkit-box-orient specifies whether a box lays out its contents horizontally or vertically.",restrictions:["enum"]},{name:"-webkit-box-pack",browsers:["C","S3"],values:[{name:"center",description:"The extra space is divided evenly, with half placed before the first child and the other half placed after the last child."},{name:"end",description:"For normal direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child. For reverse direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child."},{name:"justify",description:"The space is divided evenly in-between each child, with none of the extra space placed before the first child or after the last child. If there is only one child, treat the pack value as if it were start."},{name:"start",description:"For normal direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child. For reverse direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child."}],relevance:50,description:"Specifies alignment of child elements within the current element in the direction of orientation.",restrictions:["enum"]},{name:"-webkit-box-reflect",browsers:["E79","S4","C4","O15"],values:[{name:"above",description:"The reflection appears above the border box."},{name:"below",description:"The reflection appears below the border box."},{name:"left",description:"The reflection appears to the left of the border box."},{name:"right",description:"The reflection appears to the right of the border box."}],status:"nonstandard",syntax:"[ above | below | right | left ]? <length>? <image>?",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-box-reflect"}],description:"Defines a reflection of a border box."},{name:"-webkit-box-sizing",browsers:["C","S3"],values:[{name:"border-box",description:"The specified width and height (and respective min/max properties) on this element determine the border box of the element."},{name:"content-box",description:"Behavior of width and height as specified by CSS2.1. The specified width and height (and respective min/max properties) apply to the width and height respectively of the content box of the element."}],relevance:50,description:"Box Model addition in CSS3.",restrictions:["enum"]},{name:"-webkit-break-after",browsers:["S7"],values:[{name:"always",description:"Always force a page break before/after the generated box."},{name:"auto",description:"Neither force nor forbid a page/column break before/after the generated box."},{name:"avoid",description:"Avoid a page/column break before/after the generated box."},{name:"avoid-column",description:"Avoid a column break before/after the generated box."},{name:"avoid-page",description:"Avoid a page break before/after the generated box."},{name:"avoid-region"},{name:"column",description:"Always force a column break before/after the generated box."},{name:"left",description:"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page."},{name:"page",description:"Always force a page break before/after the generated box."},{name:"region"},{name:"right",description:"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page."}],relevance:50,description:"Describes the page/column break behavior before the generated box.",restrictions:["enum"]},{name:"-webkit-break-before",browsers:["S7"],values:[{name:"always",description:"Always force a page break before/after the generated box."},{name:"auto",description:"Neither force nor forbid a page/column break before/after the generated box."},{name:"avoid",description:"Avoid a page/column break before/after the generated box."},{name:"avoid-column",description:"Avoid a column break before/after the generated box."},{name:"avoid-page",description:"Avoid a page break before/after the generated box."},{name:"avoid-region"},{name:"column",description:"Always force a column break before/after the generated box."},{name:"left",description:"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page."},{name:"page",description:"Always force a page break before/after the generated box."},{name:"region"},{name:"right",description:"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page."}],relevance:50,description:"Describes the page/column break behavior before the generated box.",restrictions:["enum"]},{name:"-webkit-break-inside",browsers:["S7"],values:[{name:"auto",description:"Neither force nor forbid a page/column break inside the generated box."},{name:"avoid",description:"Avoid a page/column break inside the generated box."},{name:"avoid-column",description:"Avoid a column break inside the generated box."},{name:"avoid-page",description:"Avoid a page break inside the generated box."},{name:"avoid-region"}],relevance:50,description:"Describes the page/column break behavior inside the generated box.",restrictions:["enum"]},{name:"-webkit-column-break-after",browsers:["C","S3"],values:[{name:"always",description:"Always force a page break before/after the generated box."},{name:"auto",description:"Neither force nor forbid a page/column break before/after the generated box."},{name:"avoid",description:"Avoid a page/column break before/after the generated box."},{name:"avoid-column",description:"Avoid a column break before/after the generated box."},{name:"avoid-page",description:"Avoid a page break before/after the generated box."},{name:"avoid-region"},{name:"column",description:"Always force a column break before/after the generated box."},{name:"left",description:"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page."},{name:"page",description:"Always force a page break before/after the generated box."},{name:"region"},{name:"right",description:"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page."}],relevance:50,description:"Describes the page/column break behavior before the generated box.",restrictions:["enum"]},{name:"-webkit-column-break-before",browsers:["C","S3"],values:[{name:"always",description:"Always force a page break before/after the generated box."},{name:"auto",description:"Neither force nor forbid a page/column break before/after the generated box."},{name:"avoid",description:"Avoid a page/column break before/after the generated box."},{name:"avoid-column",description:"Avoid a column break before/after the generated box."},{name:"avoid-page",description:"Avoid a page break before/after the generated box."},{name:"avoid-region"},{name:"column",description:"Always force a column break before/after the generated box."},{name:"left",description:"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page."},{name:"page",description:"Always force a page break before/after the generated box."},{name:"region"},{name:"right",description:"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page."}],relevance:50,description:"Describes the page/column break behavior before the generated box.",restrictions:["enum"]},{name:"-webkit-column-break-inside",browsers:["C","S3"],values:[{name:"auto",description:"Neither force nor forbid a page/column break inside the generated box."},{name:"avoid",description:"Avoid a page/column break inside the generated box."},{name:"avoid-column",description:"Avoid a column break inside the generated box."},{name:"avoid-page",description:"Avoid a page break inside the generated box."},{name:"avoid-region"}],relevance:50,description:"Describes the page/column break behavior inside the generated box.",restrictions:["enum"]},{name:"-webkit-column-count",browsers:["C","S3"],values:[{name:"auto",description:"Determines the number of columns by the 'column-width' property and the element width."}],relevance:50,description:"Describes the optimal number of columns into which the content of the element will be flowed.",restrictions:["integer"]},{name:"-webkit-column-gap",browsers:["C","S3"],values:[{name:"normal",description:"User agent specific and typically equivalent to 1em."}],relevance:50,description:"Sets the gap between columns. If there is a column rule between columns, it will appear in the middle of the gap.",restrictions:["length"]},{name:"-webkit-column-rule",browsers:["C","S3"],relevance:50,description:"This property is a shorthand for setting 'column-rule-width', 'column-rule-style', and 'column-rule-color' at the same place in the style sheet. Omitted values are set to their initial values.",restrictions:["length","line-width","line-style","color"]},{name:"-webkit-column-rule-color",browsers:["C","S3"],relevance:50,description:"Sets the color of the column rule",restrictions:["color"]},{name:"-webkit-column-rule-style",browsers:["C","S3"],relevance:50,description:"Sets the style of the rule between columns of an element.",restrictions:["line-style"]},{name:"-webkit-column-rule-width",browsers:["C","S3"],relevance:50,description:"Sets the width of the rule between columns. Negative values are not allowed.",restrictions:["length","line-width"]},{name:"-webkit-columns",browsers:["C","S3"],values:[{name:"auto",description:"The width depends on the values of other properties."}],relevance:50,description:"A shorthand property which sets both 'column-width' and 'column-count'.",restrictions:["length","integer"]},{name:"-webkit-column-span",browsers:["C","S3"],values:[{name:"all",description:"The element spans across all columns. Content in the normal flow that appears before the element is automatically balanced across all columns before the element appear."},{name:"none",description:"The element does not span multiple columns."}],relevance:50,description:"Describes the page/column break behavior after the generated box.",restrictions:["enum"]},{name:"-webkit-column-width",browsers:["C","S3"],values:[{name:"auto",description:"The width depends on the values of other properties."}],relevance:50,description:"This property describes the width of columns in multicol elements.",restrictions:["length"]},{name:"-webkit-filter",browsers:["C18","O15","S6"],values:[{name:"none",description:"No filter effects are applied."},{name:"blur()",description:"Applies a Gaussian blur to the input image."},{name:"brightness()",description:"Applies a linear multiplier to input image, making it appear more or less bright."},{name:"contrast()",description:"Adjusts the contrast of the input."},{name:"drop-shadow()",description:"Applies a drop shadow effect to the input image."},{name:"grayscale()",description:"Converts the input image to grayscale."},{name:"hue-rotate()",description:"Applies a hue rotation on the input image. "},{name:"invert()",description:"Inverts the samples in the input image."},{name:"opacity()",description:"Applies transparency to the samples in the input image."},{name:"saturate()",description:"Saturates the input image."},{name:"sepia()",description:"Converts the input image to sepia."},{name:"url()",description:"A filter reference to a <filter> element."}],relevance:50,description:"Processes an element\u2019s rendering before it is displayed in the document, by applying one or more filter effects.",restrictions:["enum","url"]},{name:"-webkit-flow-from",browsers:["S6.1"],values:[{name:"none",description:"The block container is not a CSS Region."}],relevance:50,description:"Makes a block container a region and associates it with a named flow.",restrictions:["identifier"]},{name:"-webkit-flow-into",browsers:["S6.1"],values:[{name:"none",description:"The element is not moved to a named flow and normal CSS processing takes place."}],relevance:50,description:"Places an element or its contents into a named flow.",restrictions:["identifier"]},{name:"-webkit-font-feature-settings",browsers:["C16"],values:[{name:'"c2cs"'},{name:'"dlig"'},{name:'"kern"'},{name:'"liga"'},{name:'"lnum"'},{name:'"onum"'},{name:'"smcp"'},{name:'"swsh"'},{name:'"tnum"'},{name:"normal",description:"No change in glyph substitution or positioning occurs."},{name:"off"},{name:"on"}],relevance:50,description:"This property provides low-level control over OpenType font features. It is intended as a way of providing access to font features that are not widely used but are needed for a particular use case.",restrictions:["string","integer"]},{name:"-webkit-hyphens",browsers:["S5.1"],values:[{name:"auto",description:"Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word."},{name:"manual",description:"Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities"},{name:"none",description:"Words are not broken at line breaks, even if characters inside the word suggest line break points."}],relevance:50,description:"Controls whether hyphenation is allowed to create more break opportunities within a line of text.",restrictions:["enum"]},{name:"-webkit-line-break",browsers:["C","S3"],values:[{name:"after-white-space"},{name:"normal"}],relevance:50,description:"Specifies line-breaking rules for CJK (Chinese, Japanese, and Korean) text."},{name:"-webkit-margin-bottom-collapse",browsers:["C","S3"],values:[{name:"collapse"},{name:"discard"},{name:"separate"}],relevance:50,restrictions:["enum"]},{name:"-webkit-margin-collapse",browsers:["C","S3"],values:[{name:"collapse"},{name:"discard"},{name:"separate"}],relevance:50,restrictions:["enum"]},{name:"-webkit-margin-start",browsers:["C","S3"],values:[{name:"auto"}],relevance:50,restrictions:["percentage","length"]},{name:"-webkit-margin-top-collapse",browsers:["C","S3"],values:[{name:"collapse"},{name:"discard"},{name:"separate"}],relevance:50,restrictions:["enum"]},{name:"-webkit-mask-clip",browsers:["C","O15","S4"],status:"nonstandard",syntax:"[ <box> | border | padding | content | text ]#",relevance:0,description:"Determines the mask painting area, which determines the area that is affected by the mask.",restrictions:["box"]},{name:"-webkit-mask-image",browsers:["C","O15","S4"],values:[{name:"none",description:"Counts as a transparent black image layer."},{name:"url()",description:"Reference to a <mask element or to a CSS image."}],status:"nonstandard",syntax:"<mask-reference>#",relevance:0,description:"Sets the mask layer image of an element.",restrictions:["url","image","enum"]},{name:"-webkit-mask-origin",browsers:["C","O15","S4"],status:"nonstandard",syntax:"[ <box> | border | padding | content ]#",relevance:0,description:"Specifies the mask positioning area.",restrictions:["box"]},{name:"-webkit-mask-repeat",browsers:["C","O15","S4"],status:"nonstandard",syntax:"<repeat-style>#",relevance:0,description:"Specifies how mask layer images are tiled after they have been sized and positioned.",restrictions:["repeat"]},{name:"-webkit-mask-size",browsers:["C","O15","S4"],values:[{name:"auto",description:"Resolved by using the image\u2019s intrinsic ratio and the size of the other dimension, or failing that, using the image\u2019s intrinsic size, or failing that, treating it as 100%."},{name:"contain",description:"Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area."},{name:"cover",description:"Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area."}],status:"nonstandard",syntax:"<bg-size>#",relevance:0,description:"Specifies the size of the mask layer images.",restrictions:["length","percentage","enum"]},{name:"-webkit-nbsp-mode",browsers:["C","S3"],values:[{name:"normal"},{name:"space"}],relevance:50,description:"Defines the behavior of nonbreaking spaces within text."},{name:"-webkit-overflow-scrolling",browsers:["C","S5"],values:[{name:"auto"},{name:"touch"}],status:"nonstandard",syntax:"auto | touch",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-overflow-scrolling"}],description:"Specifies whether to use native-style scrolling in an overflow:scroll element."},{name:"-webkit-padding-start",browsers:["C","S3"],relevance:50,restrictions:["percentage","length"]},{name:"-webkit-perspective",browsers:["C","S4"],values:[{name:"none",description:"No perspective transform is applied."}],relevance:50,description:"Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.",restrictions:["length"]},{name:"-webkit-perspective-origin",browsers:["C","S4"],relevance:50,description:"Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.",restrictions:["position","percentage","length"]},{name:"-webkit-region-fragment",browsers:["S7"],values:[{name:"auto",description:"Content flows as it would in a regular content box."},{name:"break",description:"If the content fits within the CSS Region, then this property has no effect."}],relevance:50,description:"The 'region-fragment' property controls the behavior of the last region associated with a named flow.",restrictions:["enum"]},{name:"-webkit-tap-highlight-color",browsers:["E12","C16","O15"],status:"nonstandard",syntax:"<color>",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-tap-highlight-color"}],restrictions:["color"]},{name:"-webkit-text-fill-color",browsers:["E12","FF49","S3","C1","O15"],status:"nonstandard",syntax:"<color>",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-fill-color"}],restrictions:["color"]},{name:"-webkit-text-size-adjust",browsers:["E","C","S3"],values:[{name:"auto",description:"Renderers must use the default size adjustment when displaying on a small device."},{name:"none",description:"Renderers must not do size adjustment when displaying on a small device."}],relevance:50,description:"Specifies a size adjustment for displaying text content in mobile browsers.",restrictions:["percentage"]},{name:"-webkit-text-stroke",browsers:["E15","FF49","S3","C4","O15"],status:"nonstandard",syntax:"<length> || <color>",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke"}],restrictions:["length","line-width","color","percentage"]},{name:"-webkit-text-stroke-color",browsers:["E15","FF49","S3","C1","O15"],status:"nonstandard",syntax:"<color>",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-color"}],restrictions:["color"]},{name:"-webkit-text-stroke-width",browsers:["E15","FF49","S3","C1","O15"],status:"nonstandard",syntax:"<length>",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-width"}],restrictions:["length","line-width","percentage"]},{name:"-webkit-touch-callout",browsers:["S3"],values:[{name:"none"}],status:"nonstandard",syntax:"default | none",relevance:0,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-touch-callout"}],restrictions:["enum"]},{name:"-webkit-transform",browsers:["C","O12","S3.1"],values:[{name:"matrix()",description:"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]"},{name:"matrix3d()",description:"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order."},{name:"none"},{name:"perspective()",description:"Specifies a perspective projection matrix."},{name:"rotate()",description:"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property."},{name:"rotate3d()",description:"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters."},{name:"rotateX('angle')",description:"Specifies a clockwise rotation by the given angle about the X axis."},{name:"rotateY('angle')",description:"Specifies a clockwise rotation by the given angle about the Y axis."},{name:"rotateZ('angle')",description:"Specifies a clockwise rotation by the given angle about the Z axis."},{name:"scale()",description:"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first."},{name:"scale3d()",description:"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters."},{name:"scaleX()",description:"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter."},{name:"scaleY()",description:"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter."},{name:"scaleZ()",description:"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter."},{name:"skew()",description:"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis)."},{name:"skewX()",description:"Specifies a skew transformation along the X axis by the given angle."},{name:"skewY()",description:"Specifies a skew transformation along the Y axis by the given angle."},{name:"translate()",description:"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter."},{name:"translate3d()",description:"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively."},{name:"translateX()",description:"Specifies a translation by the given amount in the X direction."},{name:"translateY()",description:"Specifies a translation by the given amount in the Y direction."},{name:"translateZ()",description:"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0."}],relevance:50,description:"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.",restrictions:["enum"]},{name:"-webkit-transform-origin",browsers:["C","O15","S3.1"],relevance:50,description:"Establishes the origin of transformation for an element.",restrictions:["position","length","percentage"]},{name:"-webkit-transform-origin-x",browsers:["C","S3.1"],relevance:50,description:"The x coordinate of the origin for transforms applied to an element with respect to its border box.",restrictions:["length","percentage"]},{name:"-webkit-transform-origin-y",browsers:["C","S3.1"],relevance:50,description:"The y coordinate of the origin for transforms applied to an element with respect to its border box.",restrictions:["length","percentage"]},{name:"-webkit-transform-origin-z",browsers:["C","S4"],relevance:50,description:"The z coordinate of the origin for transforms applied to an element with respect to its border box.",restrictions:["length","percentage"]},{name:"-webkit-transform-style",browsers:["C","S4"],values:[{name:"flat",description:"All children of this element are rendered flattened into the 2D plane of the element."}],relevance:50,description:"Defines how nested elements are rendered in 3D space.",restrictions:["enum"]},{name:"-webkit-transition",browsers:["C","O12","S5"],values:[{name:"all",description:"Every property that is able to undergo a transition will do so."},{name:"none",description:"No property will transition."}],relevance:50,description:"Shorthand property combines four of the transition properties into a single property.",restrictions:["time","property","timing-function","enum"]},{name:"-webkit-transition-delay",browsers:["C","O12","S5"],relevance:50,description:"Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.",restrictions:["time"]},{name:"-webkit-transition-duration",browsers:["C","O12","S5"],relevance:50,description:"Specifies how long the transition from the old value to the new value should take.",restrictions:["time"]},{name:"-webkit-transition-property",browsers:["C","O12","S5"],values:[{name:"all",description:"Every property that is able to undergo a transition will do so."},{name:"none",description:"No property will transition."}],relevance:50,description:"Specifies the name of the CSS property to which the transition is applied.",restrictions:["property"]},{name:"-webkit-transition-timing-function",browsers:["C","O12","S5"],relevance:50,description:"Describes how the intermediate values used during a transition will be calculated.",restrictions:["timing-function"]},{name:"-webkit-user-drag",browsers:["S3"],values:[{name:"auto"},{name:"element"},{name:"none"}],relevance:50,restrictions:["enum"]},{name:"-webkit-user-modify",browsers:["C","S3"],values:[{name:"read-only"},{name:"read-write"},{name:"read-write-plaintext-only"}],status:"nonstandard",syntax:"read-only | read-write | read-write-plaintext-only",relevance:0,description:"Determines whether a user can edit the content of an element.",restrictions:["enum"]},{name:"-webkit-user-select",browsers:["C","S3"],values:[{name:"auto"},{name:"none"},{name:"text"}],relevance:50,description:"Controls the appearance of selection.",restrictions:["enum"]},{name:"widows",browsers:["E12","S1.3","C25","IE8","O9.2"],syntax:"<integer>",relevance:51,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/widows"}],description:"Specifies the minimum number of line boxes of a block container that must be left in a fragment after a break.",restrictions:["integer"]},{name:"width",values:[{name:"auto",description:"The width depends on the values of other properties."},{name:"fit-content",description:"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode."},{name:"max-content",description:"Use the max-content inline size or max-content block size, as appropriate to the writing mode."},{name:"min-content",description:"Use the min-content inline size or min-content block size, as appropriate to the writing mode."}],syntax:"<viewport-length>{1,2}",relevance:96,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/width"}],description:"Specifies the width of the content area, padding area or border area (depending on 'box-sizing') of certain boxes.",restrictions:["length","percentage"]},{name:"will-change",browsers:["E79","FF36","S9.1","C36","O24"],values:[{name:"auto",description:"Expresses no particular intent."},{name:"contents",description:"Indicates that the author expects to animate or change something about the element\u2019s contents in the near future."},{name:"scroll-position",description:"Indicates that the author expects to animate or change the scroll position of the element in the near future."}],syntax:"auto | <animateable-feature>#",relevance:63,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/will-change"}],description:"Provides a rendering hint to the user agent, stating what kinds of changes the author expects to perform on the element.",restrictions:["enum","identifier"]},{name:"word-break",values:[{name:"break-all",description:"Lines may break between any two grapheme clusters for non-CJK scripts."},{name:"keep-all",description:"Block characters can no longer create implied break points."},{name:"normal",description:"Breaks non-CJK scripts according to their own rules."}],syntax:"normal | break-all | keep-all | break-word",relevance:75,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/word-break"}],description:"Specifies line break opportunities for non-CJK scripts.",restrictions:["enum"]},{name:"word-spacing",values:[{name:"normal",description:"No additional spacing is applied. Computes to zero."}],syntax:"normal | <length>",relevance:57,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/word-spacing"}],description:"Specifies additional spacing between \u201Cwords\u201D.",restrictions:["length","percentage"]},{name:"word-wrap",values:[{name:"break-word",description:"An otherwise unbreakable sequence of characters may be broken at an arbitrary point if there are no otherwise-acceptable break points in the line."},{name:"normal",description:"Lines may break only at allowed break points."}],syntax:"normal | break-word",relevance:78,description:"Specifies whether the UA may break within a word to prevent overflow when an otherwise-unbreakable string is too long to fit.",restrictions:["enum"]},{name:"writing-mode",values:[{name:"horizontal-tb",description:"Top-to-bottom block flow direction. The writing mode is horizontal."},{name:"sideways-lr",description:"Left-to-right block flow direction. The writing mode is vertical, while the typographic mode is horizontal."},{name:"sideways-rl",description:"Right-to-left block flow direction. The writing mode is vertical, while the typographic mode is horizontal."},{name:"vertical-lr",description:"Left-to-right block flow direction. The writing mode is vertical."},{name:"vertical-rl",description:"Right-to-left block flow direction. The writing mode is vertical."}],syntax:"horizontal-tb | vertical-rl | vertical-lr | sideways-rl | sideways-lr",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/writing-mode"}],description:"This is a shorthand property for both 'direction' and 'block-progression'.",restrictions:["enum"]},{name:"z-index",values:[{name:"auto",description:"The stack level of the generated box in the current stacking context is 0. The box does not establish a new stacking context unless it is the root element."}],syntax:"auto | <integer>",relevance:92,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/z-index"}],description:"For a positioned box, the 'z-index' property specifies the stack level of the box in the current stacking context and whether the box establishes a local stacking context.",restrictions:["integer"]},{name:"zoom",browsers:["E12","S3.1","C1","IE5.5","O15"],values:[{name:"normal"}],syntax:"auto | <number> | <percentage>",relevance:67,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/zoom"}],description:"Non-standard. Specifies the magnification scale of the object. See 'transform: scale()' for a standards-based alternative.",restrictions:["enum","integer","number","percentage"]},{name:"-ms-ime-align",status:"nonstandard",syntax:"auto | after",relevance:0,description:"Aligns the Input Method Editor (IME) candidate window box relative to the element on which the IME composition is active."},{name:"-moz-binding",status:"nonstandard",syntax:"<url> | none",relevance:0,browsers:["FF1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-moz-binding"}],description:"The -moz-binding CSS property is used by Mozilla-based applications to attach an XBL binding to a DOM element."},{name:"-moz-context-properties",status:"nonstandard",syntax:"none | [ fill | fill-opacity | stroke | stroke-opacity ]#",relevance:0,browsers:["FF55"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-moz-context-properties"}],description:`If you reference an SVG image in a webpage (such as with the <img> element or as a background image), the SVG image can coordinate with the embedding element (its context) to have the image adopt property values set on the embedding element. To do this the embedding element needs to list the properties that are to be made available to the image by listing them as values of the -moz-context-properties property, and the image needs to opt in to using those properties by using values such as the context-fill value.
+
+This feature is available since Firefox 55, but is only currently supported with SVG images loaded via chrome:// or resource:// URLs. To experiment with the feature in SVG on the Web it is necessary to set the svg.context-properties.content.enabled pref to true.`},{name:"-moz-float-edge",status:"nonstandard",syntax:"border-box | content-box | margin-box | padding-box",relevance:0,browsers:["FF1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-moz-float-edge"}],description:"The non-standard -moz-float-edge CSS property specifies whether the height and width properties of the element include the margin, border, or padding thickness."},{name:"-moz-force-broken-image-icon",status:"nonstandard",syntax:"0 | 1",relevance:0,browsers:["FF1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-moz-force-broken-image-icon"}],description:"The -moz-force-broken-image-icon extended CSS property can be used to force the broken image icon to be shown even when a broken image has an alt attribute."},{name:"-moz-image-region",status:"nonstandard",syntax:"<shape> | auto",relevance:0,browsers:["FF1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-moz-image-region"}],description:"For certain XUL elements and pseudo-elements that use an image from the list-style-image property, this property specifies a region of the image that is used in place of the whole image. This allows elements to use different pieces of the same image to improve performance."},{name:"-moz-orient",status:"nonstandard",syntax:"inline | block | horizontal | vertical",relevance:0,browsers:["FF6"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-moz-orient"}],description:"The -moz-orient CSS property specifies the orientation of the element to which it's applied."},{name:"-moz-outline-radius",status:"nonstandard",syntax:"<outline-radius>{1,4} [ / <outline-radius>{1,4} ]?",relevance:0,browsers:["FF1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius"}],description:"In Mozilla applications like Firefox, the -moz-outline-radius CSS property can be used to give an element's outline rounded corners."},{name:"-moz-outline-radius-bottomleft",status:"nonstandard",syntax:"<outline-radius>",relevance:0,browsers:["FF1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-bottomleft"}],description:"In Mozilla applications, the -moz-outline-radius-bottomleft CSS property can be used to round the bottom-left corner of an element's outline."},{name:"-moz-outline-radius-bottomright",status:"nonstandard",syntax:"<outline-radius>",relevance:0,browsers:["FF1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-bottomright"}],description:"In Mozilla applications, the -moz-outline-radius-bottomright CSS property can be used to round the bottom-right corner of an element's outline."},{name:"-moz-outline-radius-topleft",status:"nonstandard",syntax:"<outline-radius>",relevance:0,browsers:["FF1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-topleft"}],description:"In Mozilla applications, the -moz-outline-radius-topleft CSS property can be used to round the top-left corner of an element's outline."},{name:"-moz-outline-radius-topright",status:"nonstandard",syntax:"<outline-radius>",relevance:0,browsers:["FF1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-topright"}],description:"In Mozilla applications, the -moz-outline-radius-topright CSS property can be used to round the top-right corner of an element's outline."},{name:"-moz-stack-sizing",status:"nonstandard",syntax:"ignore | stretch-to-fit",relevance:0,description:"-moz-stack-sizing is an extended CSS property. Normally, a stack will change its size so that all of its child elements are completely visible. For example, moving a child of the stack far to the right will widen the stack so the child remains visible."},{name:"-moz-text-blink",status:"nonstandard",syntax:"none | blink",relevance:0,description:"The -moz-text-blink non-standard Mozilla CSS extension specifies the blink mode."},{name:"-moz-user-input",status:"nonstandard",syntax:"auto | none | enabled | disabled",relevance:0,browsers:["FF1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-moz-user-input"}],description:"In Mozilla applications, -moz-user-input determines if an element will accept user input."},{name:"-moz-user-modify",status:"nonstandard",syntax:"read-only | read-write | write-only",relevance:0,description:"The -moz-user-modify property has no effect. It was originally planned to determine whether or not the content of an element can be edited by a user."},{name:"-moz-window-dragging",status:"nonstandard",syntax:"drag | no-drag",relevance:0,description:"The -moz-window-dragging CSS property specifies whether a window is draggable or not. It only works in Chrome code, and only on Mac OS X."},{name:"-moz-window-shadow",status:"nonstandard",syntax:"default | menu | tooltip | sheet | none",relevance:0,description:"The -moz-window-shadow CSS property specifies whether a window will have a shadow. It only works on Mac OS X."},{name:"-webkit-border-before",status:"nonstandard",syntax:"<'border-width'> || <'border-style'> || <color>",relevance:0,browsers:["E79","S5.1","C8","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-border-before"}],description:"The -webkit-border-before CSS property is a shorthand property for setting the individual logical block start border property values in a single place in the style sheet."},{name:"-webkit-border-before-color",status:"nonstandard",syntax:"<color>",relevance:0,description:"The -webkit-border-before-color CSS property sets the color of the individual logical block start border in a single place in the style sheet."},{name:"-webkit-border-before-style",status:"nonstandard",syntax:"<'border-style'>",relevance:0,description:"The -webkit-border-before-style CSS property sets the style of the individual logical block start border in a single place in the style sheet."},{name:"-webkit-border-before-width",status:"nonstandard",syntax:"<'border-width'>",relevance:0,description:"The -webkit-border-before-width CSS property sets the width of the individual logical block start border in a single place in the style sheet."},{name:"-webkit-line-clamp",syntax:"none | <integer>",relevance:50,browsers:["E17","FF68","S5","C6","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-line-clamp"}],description:"The -webkit-line-clamp CSS property allows limiting of the contents of a block container to the specified number of lines."},{name:"-webkit-mask",status:"nonstandard",syntax:"[ <mask-reference> || <position> [ / <bg-size> ]? || <repeat-style> || [ <box> | border | padding | content | text ] || [ <box> | border | padding | content ] ]#",relevance:0,description:"The mask CSS property alters the visibility of an element by either partially or fully hiding it. This is accomplished by either masking or clipping the image at specific points."},{name:"-webkit-mask-attachment",status:"nonstandard",syntax:"<attachment>#",relevance:0,browsers:["S4","C1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-attachment"}],description:"If a -webkit-mask-image is specified, -webkit-mask-attachment determines whether the mask image's position is fixed within the viewport, or scrolls along with its containing block."},{name:"-webkit-mask-composite",status:"nonstandard",syntax:"<composite-style>#",relevance:0,browsers:["E18","FF53","S3.1","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-composite"}],description:"The -webkit-mask-composite property specifies the manner in which multiple mask images applied to the same element are composited with one another. Mask images are composited in the opposite order that they are declared with the -webkit-mask-image property."},{name:"-webkit-mask-position",status:"nonstandard",syntax:"<position>#",relevance:0,description:"The mask-position CSS property sets the initial position, relative to the mask position layer defined by mask-origin, for each defined mask image."},{name:"-webkit-mask-position-x",status:"nonstandard",syntax:"[ <length-percentage> | left | center | right ]#",relevance:0,browsers:["E18","FF49","S3.1","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-x"}],description:"The -webkit-mask-position-x CSS property sets the initial horizontal position of a mask image."},{name:"-webkit-mask-position-y",status:"nonstandard",syntax:"[ <length-percentage> | top | center | bottom ]#",relevance:0,browsers:["E18","FF49","S3.1","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-y"}],description:"The -webkit-mask-position-y CSS property sets the initial vertical position of a mask image."},{name:"-webkit-mask-repeat-x",status:"nonstandard",syntax:"repeat | no-repeat | space | round",relevance:0,browsers:["E18","S5","C3","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-x"}],description:"The -webkit-mask-repeat-x property specifies whether and how a mask image is repeated (tiled) horizontally."},{name:"-webkit-mask-repeat-y",status:"nonstandard",syntax:"repeat | no-repeat | space | round",relevance:0,browsers:["E18","S5","C3","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-y"}],description:"The -webkit-mask-repeat-y property specifies whether and how a mask image is repeated (tiled) vertically."},{name:"accent-color",syntax:"auto | <color>",relevance:50,browsers:["E93","FF92","S15.4","C93","O79"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/accent-color"}],description:"Sets the color of the elements accent"},{name:"align-tracks",status:"experimental",syntax:"[ normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position> ]#",relevance:50,browsers:["FF77"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/align-tracks"}],description:"The align-tracks CSS property sets the alignment in the masonry axis for grid containers that have masonry in their block axis."},{name:"animation-timeline",syntax:"<single-animation-timeline>#",relevance:50,browsers:["FF97"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation-timeline"}],description:"Specifies the names of one or more @scroll-timeline at-rules to describe the element's scroll animations."},{name:"appearance",status:"experimental",syntax:"none | auto | textfield | menulist-button | <compat-auto>",relevance:62,browsers:["E84","FF80","S15.4","C84","O70"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/appearance"}],description:"Changes the appearance of buttons and other controls to resemble native controls."},{name:"aspect-ratio",status:"experimental",syntax:"auto | <ratio>",relevance:52,browsers:["E88","FF89","S15","C88","O74"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/aspect-ratio"}],description:"The aspect-ratio   CSS property sets a preferred aspect ratio for the box, which will be used in the calculation of auto sizes and some other layout functions."},{name:"azimuth",status:"obsolete",syntax:"<angle> | [ [ left-side | far-left | left | center-left | center | center-right | right | far-right | right-side ] || behind ] | leftwards | rightwards",relevance:0,description:"In combination with elevation, the azimuth CSS property enables different audio sources to be positioned spatially for aural presentation. This is important in that it provides a natural way to tell several voices apart, as each can be positioned to originate at a different location on the sound stage. Stereo output produce a lateral sound stage, while binaural headphones and multi-speaker setups allow for a fully three-dimensional stage."},{name:"backdrop-filter",syntax:"none | <filter-function-list>",relevance:53,browsers:["E17","FF70","S9","C76","O63"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/backdrop-filter"}],description:"The backdrop-filter CSS property lets you apply graphical effects such as blurring or color shifting to the area behind an element. Because it applies to everything behind the element, to see the effect you must make the element or its background at least partially transparent."},{name:"border-block",syntax:"<'border-top-width'> || <'border-top-style'> || <color>",relevance:50,browsers:["E87","FF66","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-block"}],description:"The border-block CSS property is a shorthand property for setting the individual logical block border property values in a single place in the style sheet."},{name:"border-block-color",syntax:"<'border-top-color'>{1,2}",relevance:50,browsers:["E87","FF66","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-block-color"}],description:"The border-block-color CSS property defines the color of the logical block borders of an element, which maps to a physical border color depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-color and border-bottom-color, or border-right-color and border-left-color property depending on the values defined for writing-mode, direction, and text-orientation."},{name:"border-block-style",syntax:"<'border-top-style'>",relevance:50,browsers:["E87","FF66","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-block-style"}],description:"The border-block-style CSS property defines the style of the logical block borders of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-style and border-bottom-style, or border-left-style and border-right-style properties depending on the values defined for writing-mode, direction, and text-orientation."},{name:"border-block-width",syntax:"<'border-top-width'>",relevance:50,browsers:["E87","FF66","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-block-width"}],description:"The border-block-width CSS property defines the width of the logical block borders of an element, which maps to a physical border width depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-width and border-bottom-width, or border-left-width, and border-right-width property depending on the values defined for writing-mode, direction, and text-orientation."},{name:"border-end-end-radius",syntax:"<length-percentage>{1,2}",relevance:50,browsers:["E89","FF66","S15","C89","O75"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-end-end-radius"}],description:"The border-end-end-radius CSS property defines a logical border radius on an element, which maps to a physical border radius that depends on on the element's writing-mode, direction, and text-orientation."},{name:"border-end-start-radius",syntax:"<length-percentage>{1,2}",relevance:50,browsers:["E89","FF66","S15","C89","O75"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-end-start-radius"}],description:"The border-end-start-radius CSS property defines a logical border radius on an element, which maps to a physical border radius depending on the element's writing-mode, direction, and text-orientation."},{name:"border-inline",syntax:"<'border-top-width'> || <'border-top-style'> || <color>",relevance:50,browsers:["E87","FF66","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-inline"}],description:"The border-inline CSS property is a shorthand property for setting the individual logical inline border property values in a single place in the style sheet."},{name:"border-inline-color",syntax:"<'border-top-color'>{1,2}",relevance:50,browsers:["E87","FF66","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-inline-color"}],description:"The border-inline-color CSS property defines the color of the logical inline borders of an element, which maps to a physical border color depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-color and border-bottom-color, or border-right-color and border-left-color property depending on the values defined for writing-mode, direction, and text-orientation."},{name:"border-inline-style",syntax:"<'border-top-style'>",relevance:50,browsers:["E87","FF66","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-inline-style"}],description:"The border-inline-style CSS property defines the style of the logical inline borders of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-style and border-bottom-style, or border-left-style and border-right-style properties depending on the values defined for writing-mode, direction, and text-orientation."},{name:"border-inline-width",syntax:"<'border-top-width'>",relevance:50,browsers:["E87","FF66","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-inline-width"}],description:"The border-inline-width CSS property defines the width of the logical inline borders of an element, which maps to a physical border width depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-width and border-bottom-width, or border-left-width, and border-right-width property depending on the values defined for writing-mode, direction, and text-orientation."},{name:"border-start-end-radius",syntax:"<length-percentage>{1,2}",relevance:50,browsers:["E89","FF66","S15","C89","O75"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-start-end-radius"}],description:"The border-start-end-radius CSS property defines a logical border radius on an element, which maps to a physical border radius depending on the element's writing-mode, direction, and text-orientation."},{name:"border-start-start-radius",syntax:"<length-percentage>{1,2}",relevance:50,browsers:["E89","FF66","S15","C89","O75"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/border-start-start-radius"}],description:"The border-start-start-radius CSS property defines a logical border radius on an element, which maps to a physical border radius that depends on the element's writing-mode, direction, and text-orientation."},{name:"box-align",status:"nonstandard",syntax:"start | center | end | baseline | stretch",relevance:0,browsers:["E12","FF1","S3","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/box-align"}],description:"The box-align CSS property specifies how an element aligns its contents across its layout in a perpendicular direction. The effect of the property is only visible if there is extra space in the box."},{name:"box-direction",status:"nonstandard",syntax:"normal | reverse | inherit",relevance:0,browsers:["E12","FF1","S3","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/box-direction"}],description:"The box-direction CSS property specifies whether a box lays out its contents normally (from the top or left edge), or in reverse (from the bottom or right edge)."},{name:"box-flex",status:"nonstandard",syntax:"<number>",relevance:0,browsers:["E12","FF1","S3","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/box-flex"}],description:"The -moz-box-flex and -webkit-box-flex CSS properties specify how a -moz-box or -webkit-box grows to fill the box that contains it, in the direction of the containing box's layout."},{name:"box-flex-group",status:"nonstandard",syntax:"<integer>",relevance:0,browsers:["S3","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/box-flex-group"}],description:"The box-flex-group CSS property assigns the flexbox's child elements to a flex group."},{name:"box-lines",status:"nonstandard",syntax:"single | multiple",relevance:0,browsers:["S3","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/box-lines"}],description:"The box-lines CSS property determines whether the box may have a single or multiple lines (rows for horizontally oriented boxes, columns for vertically oriented boxes)."},{name:"box-ordinal-group",status:"nonstandard",syntax:"<integer>",relevance:0,browsers:["E12","FF1","S3","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/box-ordinal-group"}],description:"The box-ordinal-group CSS property assigns the flexbox's child elements to an ordinal group."},{name:"box-orient",status:"nonstandard",syntax:"horizontal | vertical | inline-axis | block-axis | inherit",relevance:0,browsers:["E12","FF1","S3","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/box-orient"}],description:"The box-orient CSS property specifies whether an element lays out its contents horizontally or vertically."},{name:"box-pack",status:"nonstandard",syntax:"start | center | end | justify",relevance:0,browsers:["E12","FF1","S3","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/box-pack"}],description:"The -moz-box-pack and -webkit-box-pack CSS properties specify how a -moz-box or -webkit-box packs its contents in the direction of its layout. The effect of this is only visible if there is extra space in the box."},{name:"print-color-adjust",syntax:"economy | exact",relevance:50,browsers:["E79","FF97","S15.4","C17","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/print-color-adjust"}],description:"Defines what optimization the user agent is allowed to do when adjusting the appearance for an output device."},{name:"color-scheme",syntax:"normal | [ light | dark | <custom-ident> ]+ && only?",relevance:52,browsers:["E81","FF96","S13","C81","O68"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/color-scheme"}],description:"The color-scheme CSS property allows an element to indicate which color schemes it can comfortably be rendered in."},{name:"content-visibility",syntax:"visible | auto | hidden",relevance:51,browsers:["E85","S15.4","C85","O71"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/content-visibility"}],description:"Controls whether or not an element renders its contents at all, along with forcing a strong set of containments, allowing user agents to potentially omit large swathes of layout and rendering work until it becomes needed."},{name:"counter-set",syntax:"[ <counter-name> <integer>? ]+ | none",relevance:50,browsers:["E85","FF68","C85","O71"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/counter-set"}],description:"The counter-set CSS property sets a CSS counter to a given value. It manipulates the value of existing counters, and will only create new counters if there isn't already a counter of the given name on the element."},{name:"font-optical-sizing",syntax:"auto | none",relevance:50,browsers:["E17","FF62","S11","C79","O66"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-optical-sizing"}],description:"The font-optical-sizing CSS property allows developers to control whether browsers render text with slightly differing visual representations to optimize viewing at different sizes, or not. This only works for fonts that have an optical size variation axis."},{name:"font-variation-settings",syntax:"normal | [ <string> <number> ]#",relevance:50,browsers:["E17","FF62","S11","C62","O49"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-variation-settings"}],description:"The font-variation-settings CSS property provides low-level control over OpenType or TrueType font variations, by specifying the four letter axis names of the features you want to vary, along with their variation values."},{name:"font-smooth",status:"nonstandard",syntax:"auto | never | always | <absolute-size> | <length>",relevance:0,browsers:["E79","FF25","S4","C5","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/font-smooth"}],description:"The font-smooth CSS property controls the application of anti-aliasing when fonts are rendered."},{name:"forced-color-adjust",status:"experimental",syntax:"auto | none",relevance:52,browsers:["E79","C89","IE10"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/forced-color-adjust"}],description:"Allows authors to opt certain elements out of forced colors mode. This then restores the control of those values to CSS"},{name:"gap",syntax:"<'row-gap'> <'column-gap'>?",relevance:55,browsers:["E84","FF63","S14.1","C84","O70"],description:"The gap CSS property is a shorthand property for row-gap and column-gap specifying the gutters between grid rows and columns."},{name:"hanging-punctuation",syntax:"none | [ first || [ force-end | allow-end ] || last ]",relevance:50,browsers:["S10"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/hanging-punctuation"}],description:"The hanging-punctuation CSS property specifies whether a punctuation mark should hang at the start or end of a line of text. Hanging punctuation may be placed outside the line box."},{name:"hyphenate-character",syntax:"auto | <string>",relevance:50,browsers:["E79","FF98","S5.1","C6","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/hyphenate-character"}],description:"A hyphenate character used at the end of a line."},{name:"image-resolution",status:"experimental",syntax:"[ from-image || <resolution> ] && snap?",relevance:50,description:"The image-resolution property specifies the intrinsic resolution of all raster images used in or on the element. It affects both content images (e.g. replaced elements and generated content) and decorative images (such as background-image). The intrinsic resolution of an image is used to determine the image\u2019s intrinsic dimensions."},{name:"initial-letter",status:"experimental",syntax:"normal | [ <number> <integer>? ]",relevance:50,browsers:["S9"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/initial-letter"}],description:"The initial-letter CSS property specifies styling for dropped, raised, and sunken initial letters."},{name:"initial-letter-align",status:"experimental",syntax:"[ auto | alphabetic | hanging | ideographic ]",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/initial-letter-align"}],description:"The initial-letter-align CSS property specifies the alignment of initial letters within a paragraph."},{name:"input-security",syntax:"auto | none",relevance:50,description:"Enables or disables the obscuring a sensitive test input."},{name:"inset",syntax:"<'top'>{1,4}",relevance:51,browsers:["E87","FF66","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/inset"}],description:"The inset CSS property defines the logical block and inline start and end offsets of an element, which map to physical offsets depending on the element's writing mode, directionality, and text orientation. It corresponds to the top and bottom, or right and left properties depending on the values defined for writing-mode, direction, and text-orientation."},{name:"inset-block",syntax:"<'top'>{1,2}",relevance:50,browsers:["E87","FF63","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/inset-block"}],description:"The inset-block CSS property defines the logical block start and end offsets of an element, which maps to physical offsets depending on the element's writing mode, directionality, and text orientation. It corresponds to the top and bottom, or right and left properties depending on the values defined for writing-mode, direction, and text-orientation."},{name:"inset-block-end",syntax:"<'top'>",relevance:50,browsers:["E87","FF63","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/inset-block-end"}],description:"The inset-block-end CSS property defines the logical block end offset of an element, which maps to a physical offset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation."},{name:"inset-block-start",syntax:"<'top'>",relevance:50,browsers:["E87","FF63","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/inset-block-start"}],description:"The inset-block-start CSS property defines the logical block start offset of an element, which maps to a physical offset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation."},{name:"inset-inline",syntax:"<'top'>{1,2}",relevance:50,browsers:["E87","FF63","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/inset-inline"}],description:"The inset-inline CSS property defines the logical block start and end offsets of an element, which maps to physical offsets depending on the element's writing mode, directionality, and text orientation. It corresponds to the top and bottom, or right and left properties depending on the values defined for writing-mode, direction, and text-orientation."},{name:"inset-inline-end",syntax:"<'top'>",relevance:50,browsers:["E87","FF63","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/inset-inline-end"}],description:"The inset-inline-end CSS property defines the logical inline end inset of an element, which maps to a physical inset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation."},{name:"inset-inline-start",syntax:"<'top'>",relevance:50,browsers:["E87","FF63","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/inset-inline-start"}],description:"The inset-inline-start CSS property defines the logical inline start inset of an element, which maps to a physical offset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation."},{name:"justify-tracks",status:"experimental",syntax:"[ normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ] ]#",relevance:50,browsers:["FF77"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/justify-tracks"}],description:"The justify-tracks CSS property sets the alignment in the masonry axis for grid containers that have masonry in their inline axis"},{name:"line-clamp",status:"experimental",syntax:"none | <integer>",relevance:50,description:"The line-clamp property allows limiting the contents of a block container to the specified number of lines; remaining content is fragmented away and neither rendered nor measured. Optionally, it also allows inserting content into the last line box to indicate the continuity of truncated/interrupted content."},{name:"line-height-step",status:"experimental",syntax:"<length>",relevance:50,browsers:["E79","C60","O47"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/line-height-step"}],description:"The line-height-step CSS property defines the step units for line box heights. When the step unit is positive, line box heights are rounded up to the closest multiple of the unit. Negative values are invalid."},{name:"margin-block",syntax:"<'margin-left'>{1,2}",relevance:50,browsers:["E87","FF66","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/margin-block"}],description:"The margin-block CSS property defines the logical block start and end margins of an element, which maps to physical margins depending on the element's writing mode, directionality, and text orientation."},{name:"margin-inline",syntax:"<'margin-left'>{1,2}",relevance:50,browsers:["E87","FF66","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/margin-inline"}],description:"The margin-inline CSS property defines the logical inline start and end margins of an element, which maps to physical margins depending on the element's writing mode, directionality, and text orientation."},{name:"margin-trim",status:"experimental",syntax:"none | in-flow | all",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/margin-trim"}],description:"The margin-trim property allows the container to trim the margins of its children where they adjoin the container\u2019s edges."},{name:"mask",syntax:"<mask-layer>#",relevance:50,browsers:["E79","FF2","S3.1","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask"}],description:"The mask CSS property alters the visibility of an element by either partially or fully hiding it. This is accomplished by either masking or clipping the image at specific points."},{name:"mask-border",syntax:"<'mask-border-source'> || <'mask-border-slice'> [ / <'mask-border-width'>? [ / <'mask-border-outset'> ]? ]? || <'mask-border-repeat'> || <'mask-border-mode'>",relevance:50,browsers:["E79","S3.1","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-border"}],description:`The mask-border CSS property lets you create a mask along the edge of an element's border.
+
+This property is a shorthand for mask-border-source, mask-border-slice, mask-border-width, mask-border-outset, mask-border-repeat, and mask-border-mode. As with all shorthand properties, any omitted sub-values will be set to their initial value.`},{name:"mask-border-mode",syntax:"luminance | alpha",relevance:50,description:"The mask-border-mode CSS property specifies the blending mode used in a mask border."},{name:"mask-border-outset",syntax:"[ <length> | <number> ]{1,4}",relevance:50,browsers:["E79","S3.1","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-border-outset"}],description:"The mask-border-outset CSS property specifies the distance by which an element's mask border is set out from its border box."},{name:"mask-border-repeat",syntax:"[ stretch | repeat | round | space ]{1,2}",relevance:50,browsers:["E79","S3.1","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-border-repeat"}],description:"The mask-border-repeat CSS property defines how the edge regions of a source image are adjusted to fit the dimensions of an element's mask border."},{name:"mask-border-slice",syntax:"<number-percentage>{1,4} fill?",relevance:50,browsers:["E79","S3.1","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-border-slice"}],description:"The mask-border-slice CSS property divides the image specified by mask-border-source into regions. These regions are used to form the components of an element's mask border."},{name:"mask-border-source",syntax:"none | <image>",relevance:50,browsers:["E79","S3.1","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-border-source"}],description:`The mask-border-source CSS property specifies the source image used to create an element's mask border.
+
+The mask-border-slice property is used to divide the source image into regions, which are then dynamically applied to the final mask border.`},{name:"mask-border-width",syntax:"[ <length-percentage> | <number> | auto ]{1,4}",relevance:50,browsers:["E79","S3.1","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-border-width"}],description:"The mask-border-width CSS property specifies the width of an element's mask border."},{name:"mask-clip",syntax:"[ <geometry-box> | no-clip ]#",relevance:50,browsers:["E79","FF53","S15.4","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-clip"}],description:"The mask-clip CSS property determines the area, which is affected by a mask. The painted content of an element must be restricted to this area."},{name:"mask-composite",syntax:"<compositing-operator>#",relevance:50,browsers:["E18","FF53","S15.4"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/mask-composite"}],description:"The mask-composite CSS property represents a compositing operation used on the current mask layer with the mask layers below it."},{name:"masonry-auto-flow",status:"experimental",syntax:"[ pack | next ] || [ definite-first | ordered ]",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/masonry-auto-flow"}],description:"The masonry-auto-flow CSS property modifies how items are placed when using masonry in CSS Grid Layout."},{name:"math-style",syntax:"normal | compact",relevance:50,browsers:["FF83","S14.1","C83"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/math-style"}],description:"The math-style property indicates whether MathML equations should render with normal or compact height."},{name:"max-lines",status:"experimental",syntax:"none | <integer>",relevance:50,description:"The max-liens property forces a break after a set number of lines"},{name:"offset",syntax:"[ <'offset-position'>? [ <'offset-path'> [ <'offset-distance'> || <'offset-rotate'> ]? ]? ]! [ / <'offset-anchor'> ]?",relevance:50,browsers:["E79","FF72","C55","O42"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/offset"}],description:"The offset CSS property is a shorthand property for animating an element along a defined path."},{name:"offset-anchor",syntax:"auto | <position>",relevance:50,browsers:["FF72"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/offset-anchor"}],description:"Defines an anchor point of the box positioned along the path. The anchor point specifies the point of the box which is to be considered as the point that is moved along the path."},{name:"offset-distance",syntax:"<length-percentage>",relevance:50,browsers:["E79","FF72","C55","O42"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/offset-distance"}],description:"The offset-distance CSS property specifies a position along an offset-path."},{name:"offset-path",syntax:"none | ray( [ <angle> && <size> && contain? ] ) | <path()> | <url> | [ <basic-shape> || <geometry-box> ]",relevance:50,browsers:["E79","FF72","C55","O45"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/offset-path"}],description:`The offset-path CSS property specifies the offset path where the element gets positioned. The exact element\u2019s position on the offset path is determined by the offset-distance property. An offset path is either a specified path with one or multiple sub-paths or the geometry of a not-styled basic shape. Each shape or path must define an initial position for the computed value of "0" for offset-distance and an initial direction which specifies the rotation of the object to the initial position.
+
+In this specification, a direction (or rotation) of 0 degrees is equivalent to the direction of the positive x-axis in the object\u2019s local coordinate system. In other words, a rotation of 0 degree points to the right side of the UA if the object and its ancestors have no transformation applied.`},{name:"offset-position",status:"experimental",syntax:"auto | <position>",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/offset-position"}],description:"Specifies the initial position of the offset path. If position is specified with static, offset-position would be ignored."},{name:"offset-rotate",syntax:"[ auto | reverse ] || <angle>",relevance:50,browsers:["E79","FF72","C56","O43"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/offset-rotate"}],description:"The offset-rotate CSS property defines the direction of the element while positioning along the offset path."},{name:"overflow-anchor",syntax:"auto | none",relevance:52,browsers:["E79","FF66","C56","O43"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/overflow-anchor"}],description:"The overflow-anchor CSS property provides a way to opt out browser scroll anchoring behavior which adjusts scroll position to minimize content shifts."},{name:"overflow-block",syntax:"visible | hidden | clip | scroll | auto",relevance:50,browsers:["FF69"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/overflow-block"}],description:"The overflow-block CSS media feature can be used to test how the output device handles content that overflows the initial containing block along the block axis."},{name:"overflow-clip-box",status:"nonstandard",syntax:"padding-box | content-box",relevance:0,browsers:["FF29"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Mozilla/Gecko/Chrome/CSS/overflow-clip-box"}],description:"The overflow-clip-box CSS property specifies relative to which box the clipping happens when there is an overflow. It is short hand for the overflow-clip-box-inline and overflow-clip-box-block properties."},{name:"overflow-clip-margin",syntax:"<visual-box> || <length [0,\u221E]>",relevance:50,browsers:["E90","C90","O76"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/overflow-clip-margin"}],description:"The overflow-clip-margin CSS property determines how far outside its bounds an element with overflow: clip may be painted before being clipped."},{name:"overflow-inline",syntax:"visible | hidden | clip | scroll | auto",relevance:50,browsers:["FF69"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/overflow-inline"}],description:"The overflow-inline CSS media feature can be used to test how the output device handles content that overflows the initial containing block along the inline axis."},{name:"overscroll-behavior",syntax:"[ contain | none | auto ]{1,2}",relevance:50,browsers:["E18","FF59","C63","O50"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior"}],description:"The overscroll-behavior CSS property is shorthand for the overscroll-behavior-x and overscroll-behavior-y properties, which allow you to control the browser's scroll overflow behavior \u2014 what happens when the boundary of a scrolling area is reached."},{name:"overscroll-behavior-block",syntax:"contain | none | auto",relevance:50,browsers:["E79","FF73","C77","O64"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-block"}],description:"The overscroll-behavior-block CSS property sets the browser's behavior when the block direction boundary of a scrolling area is reached."},{name:"overscroll-behavior-inline",syntax:"contain | none | auto",relevance:50,browsers:["E79","FF73","C77","O64"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-inline"}],description:"The overscroll-behavior-inline CSS property sets the browser's behavior when the inline direction boundary of a scrolling area is reached."},{name:"overscroll-behavior-x",syntax:"contain | none | auto",relevance:50,browsers:["E18","FF59","C63","O50"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-x"}],description:"The overscroll-behavior-x CSS property is allows you to control the browser's scroll overflow behavior \u2014 what happens when the boundary of a scrolling area is reached \u2014 in the x axis direction."},{name:"overscroll-behavior-y",syntax:"contain | none | auto",relevance:50,browsers:["E18","FF59","C63","O50"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-y"}],description:"The overscroll-behavior-y CSS property is allows you to control the browser's scroll overflow behavior \u2014 what happens when the boundary of a scrolling area is reached \u2014 in the y axis direction."},{name:"padding-block",syntax:"<'padding-left'>{1,2}",relevance:50,browsers:["E87","FF66","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/padding-block"}],description:"The padding-block CSS property defines the logical block start and end padding of an element, which maps to physical padding properties depending on the element's writing mode, directionality, and text orientation."},{name:"padding-inline",syntax:"<'padding-left'>{1,2}",relevance:50,browsers:["E87","FF66","S14.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/padding-inline"}],description:"The padding-inline CSS property defines the logical inline start and end padding of an element, which maps to physical padding properties depending on the element's writing mode, directionality, and text orientation."},{name:"place-content",syntax:"<'align-content'> <'justify-content'>?",relevance:50,browsers:["E79","FF45","S9","C59","O46"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/place-content"}],description:"The place-content CSS shorthand property sets both the align-content and justify-content properties."},{name:"place-items",syntax:"<'align-items'> <'justify-items'>?",relevance:50,browsers:["E79","FF45","S11","C59","O46"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/place-items"}],description:"The CSS place-items shorthand property sets both the align-items and justify-items properties. The first value is the align-items property value, the second the justify-items one. If the second value is not present, the first value is also used for it."},{name:"place-self",syntax:"<'align-self'> <'justify-self'>?",relevance:50,browsers:["E79","FF45","S11","C59","O46"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/place-self"}],description:"The place-self CSS property is a shorthand property sets both the align-self and justify-self properties. The first value is the align-self property value, the second the justify-self one. If the second value is not present, the first value is also used for it."},{name:"rotate",syntax:"none | <angle> | [ x | y | z | <number>{3} ] && <angle>",relevance:50,browsers:["FF72","S14.1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/rotate"}],description:"The rotate CSS property allows you to specify rotation transforms individually and independently of the transform property. This maps better to typical user interface usage, and saves having to remember the exact order of transform functions to specify in the transform value."},{name:"row-gap",syntax:"normal | <length-percentage>",relevance:51,browsers:["E84","FF63","S14.1","C84","O70"],description:"The row-gap CSS property specifies the gutter between grid rows."},{name:"ruby-merge",status:"experimental",syntax:"separate | collapse | auto",relevance:50,description:"This property controls how ruby annotation boxes should be rendered when there are more than one in a ruby container box: whether each pair should be kept separate, the annotations should be collapsed and rendered as a group, or the separation should be determined based on the space available."},{name:"scale",syntax:"none | <number>{1,3}",relevance:50,browsers:["FF72","S14.1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scale"}],description:"The scale CSS property allows you to specify scale transforms individually and independently of the transform property. This maps better to typical user interface usage, and saves having to remember the exact order of transform functions to specify in the transform value."},{name:"scrollbar-color",syntax:"auto | <color>{2}",relevance:50,browsers:["FF64"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scrollbar-color"}],description:"The scrollbar-color CSS property sets the color of the scrollbar track and thumb."},{name:"scrollbar-gutter",syntax:"auto | stable && both-edges?",relevance:50,browsers:["E94","FF97","C94","O80"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scrollbar-gutter"}],description:"The scrollbar-gutter CSS property allows authors to reserve space for the scrollbar, preventing unwanted layout changes as the content grows while also avoiding unnecessary visuals when scrolling isn't needed."},{name:"scrollbar-width",syntax:"auto | thin | none",relevance:50,browsers:["FF64"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scrollbar-width"}],description:"The scrollbar-width property allows the author to set the maximum thickness of an element\u2019s scrollbars when they are shown. "},{name:"scroll-margin",syntax:"<length>{1,4}",relevance:50,browsers:["E79","FF90","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-margin"}],description:"The scroll-margin property is a shorthand property which sets all of the scroll-margin longhands, assigning values much like the margin property does for the margin-* longhands."},{name:"scroll-margin-block",syntax:"<length>{1,2}",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block"}],description:"The scroll-margin-block property is a shorthand property which sets the scroll-margin longhands in the block dimension."},{name:"scroll-margin-block-start",syntax:"<length>",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-start"}],description:"The scroll-margin-block-start property defines the margin of the scroll snap area at the start of the block dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets."},{name:"scroll-margin-block-end",syntax:"<length>",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-end"}],description:"The scroll-margin-block-end property defines the margin of the scroll snap area at the end of the block dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets."},{name:"scroll-margin-bottom",syntax:"<length>",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-bottom"}],description:"The scroll-margin-bottom property defines the bottom margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets."},{name:"scroll-margin-inline",syntax:"<length>{1,2}",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline"}],description:"The scroll-margin-inline property is a shorthand property which sets the scroll-margin longhands in the inline dimension."},{name:"scroll-margin-inline-start",syntax:"<length>",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-start"}],description:"The scroll-margin-inline-start property defines the margin of the scroll snap area at the start of the inline dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets."},{name:"scroll-margin-inline-end",syntax:"<length>",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-end"}],description:"The scroll-margin-inline-end property defines the margin of the scroll snap area at the end of the inline dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets."},{name:"scroll-margin-left",syntax:"<length>",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-left"}],description:"The scroll-margin-left property defines the left margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets."},{name:"scroll-margin-right",syntax:"<length>",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-right"}],description:"The scroll-margin-right property defines the right margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets."},{name:"scroll-margin-top",syntax:"<length>",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-top"}],description:"The scroll-margin-top property defines the top margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets."},{name:"scroll-padding",syntax:"[ auto | <length-percentage> ]{1,4}",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-padding"}],description:"The scroll-padding property is a shorthand property which sets all of the scroll-padding longhands, assigning values much like the padding property does for the padding-* longhands."},{name:"scroll-padding-block",syntax:"[ auto | <length-percentage> ]{1,2}",relevance:50,browsers:["E79","FF68","S15","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block"}],description:"The scroll-padding-block property is a shorthand property which sets the scroll-padding longhands for the block dimension."},{name:"scroll-padding-block-start",syntax:"auto | <length-percentage>",relevance:50,browsers:["E79","FF68","S15","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-start"}],description:"The scroll-padding-block-start property defines offsets for the start edge in the block dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."},{name:"scroll-padding-block-end",syntax:"auto | <length-percentage>",relevance:50,browsers:["E79","FF68","S15","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-end"}],description:"The scroll-padding-block-end property defines offsets for the end edge in the block dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."},{name:"scroll-padding-bottom",syntax:"auto | <length-percentage>",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-bottom"}],description:"The scroll-padding-bottom property defines offsets for the bottom of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."},{name:"scroll-padding-inline",syntax:"[ auto | <length-percentage> ]{1,2}",relevance:50,browsers:["E79","FF68","S15","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline"}],description:"The scroll-padding-inline property is a shorthand property which sets the scroll-padding longhands for the inline dimension."},{name:"scroll-padding-inline-start",syntax:"auto | <length-percentage>",relevance:50,browsers:["E79","FF68","S15","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-start"}],description:"The scroll-padding-inline-start property defines offsets for the start edge in the inline dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."},{name:"scroll-padding-inline-end",syntax:"auto | <length-percentage>",relevance:50,browsers:["E79","FF68","S15","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-end"}],description:"The scroll-padding-inline-end property defines offsets for the end edge in the inline dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."},{name:"scroll-padding-left",syntax:"auto | <length-percentage>",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-left"}],description:"The scroll-padding-left property defines offsets for the left of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."},{name:"scroll-padding-right",syntax:"auto | <length-percentage>",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-right"}],description:"The scroll-padding-right property defines offsets for the right of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."},{name:"scroll-padding-top",syntax:"auto | <length-percentage>",relevance:50,browsers:["E79","FF68","S14.1","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-top"}],description:"The scroll-padding-top property defines offsets for the top of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."},{name:"scroll-snap-align",syntax:"[ none | start | end | center ]{1,2}",relevance:52,browsers:["E79","FF68","S11","C69","O56"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-align"}],description:"The scroll-snap-align property specifies the box\u2019s snap position as an alignment of its snap area (as the alignment subject) within its snap container\u2019s snapport (as the alignment container). The two values specify the snapping alignment in the block axis and inline axis, respectively. If only one value is specified, the second value defaults to the same value."},{name:"scroll-snap-stop",syntax:"normal | always",relevance:50,browsers:["E79","S15","C75","O62"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-stop"}],description:'The scroll-snap-stop CSS property defines whether the scroll container is allowed to "pass over" possible snap positions.'},{name:"scroll-snap-type-x",status:"obsolete",syntax:"none | mandatory | proximity",relevance:0,browsers:["FF39","S9"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type-x"}],description:`The scroll-snap-type-x CSS property defines how strictly snap points are enforced on the horizontal axis of the scroll container in case there is one.
+
+Specifying any precise animations or physics used to enforce those snap points is not covered by this property but instead left up to the user agent.`},{name:"scroll-snap-type-y",status:"obsolete",syntax:"none | mandatory | proximity",relevance:0,browsers:["FF39"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type-y"}],description:`The scroll-snap-type-y CSS property defines how strictly snap points are enforced on the vertical axis of the scroll container in case there is one.
+
+Specifying any precise animations or physics used to enforce those snap points is not covered by this property but instead left up to the user agent.`},{name:"text-combine-upright",syntax:"none | all | [ digits <integer>? ]",relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-combine-upright"}],description:`The text-combine-upright CSS property specifies the combination of multiple characters into the space of a single character. If the combined text is wider than 1em, the user agent must fit the contents within 1em. The resulting composition is treated as a single upright glyph for layout and decoration. This property only has an effect in vertical writing modes.
+
+This is used to produce an effect that is known as tate-ch\u016B-yoko (\u7E26\u4E2D\u6A2A) in Japanese, or as \u76F4\u66F8\u6A6B\u5411 in Chinese.`},{name:"text-decoration-skip",status:"experimental",syntax:"none | [ objects || [ spaces | [ leading-spaces || trailing-spaces ] ] || edges || box-decoration ]",relevance:52,browsers:["S12.1","C57","O44"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip"}],description:"The text-decoration-skip CSS property specifies what parts of the element\u2019s content any text decoration affecting the element must skip over. It controls all text decoration lines drawn by the element and also any text decoration lines drawn by its ancestors."},{name:"text-decoration-skip-ink",syntax:"auto | all | none",relevance:50,browsers:["E79","FF70","S15.4","C64","O50"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip-ink"}],description:"The text-decoration-skip-ink CSS property specifies how overlines and underlines are drawn when they pass over glyph ascenders and descenders."},{name:"text-decoration-thickness",syntax:"auto | from-font | <length> | <percentage> ",relevance:50,browsers:["E89","FF70","S12.1","C89","O75"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-decoration-thickness"}],description:"The text-decoration-thickness CSS property sets the thickness, or width, of the decoration line that is used on text in an element, such as a line-through, underline, or overline."},{name:"text-emphasis",syntax:"<'text-emphasis-style'> || <'text-emphasis-color'>",relevance:50,browsers:["E79","FF46","S7","C25","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-emphasis"}],description:"The text-emphasis CSS property is a shorthand property for setting text-emphasis-style and text-emphasis-color in one declaration. This property will apply the specified emphasis mark to each character of the element's text, except separator characters, like spaces,  and control characters."},{name:"text-emphasis-color",syntax:"<color>",relevance:50,browsers:["E79","FF46","S7","C25","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-color"}],description:"The text-emphasis-color CSS property defines the color used to draw emphasis marks on text being rendered in the HTML document. This value can also be set and reset using the text-emphasis shorthand."},{name:"text-emphasis-position",syntax:"[ over | under ] && [ right | left ]",relevance:50,browsers:["E79","FF46","S7","C25","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-position"}],description:"The text-emphasis-position CSS property describes where emphasis marks are drawn at. The effect of emphasis marks on the line height is the same as for ruby text: if there isn't enough place, the line height is increased."},{name:"text-emphasis-style",syntax:"none | [ [ filled | open ] || [ dot | circle | double-circle | triangle | sesame ] ] | <string>",relevance:50,browsers:["E79","FF46","S7","C25","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-style"}],description:"The text-emphasis-style CSS property defines the type of emphasis used. It can also be set, and reset, using the text-emphasis shorthand."},{name:"text-size-adjust",status:"experimental",syntax:"none | auto | <percentage>",relevance:57,browsers:["E79","C54","O41"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-size-adjust"}],description:"The text-size-adjust CSS property controls the text inflation algorithm used on some smartphones and tablets. Other browsers will ignore this property."},{name:"text-underline-offset",syntax:"auto | <length> | <percentage> ",relevance:50,browsers:["E87","FF70","S12.1","C87","O73"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/text-underline-offset"}],description:"The text-underline-offset CSS property sets the offset distance of an underline text decoration line (applied using text-decoration) from its original position."},{name:"transform-box",syntax:"content-box | border-box | fill-box | stroke-box | view-box",relevance:50,browsers:["E79","FF55","S11","C64","O51"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/transform-box"}],description:"The transform-box CSS property defines the layout box to which the transform and transform-origin properties relate."},{name:"translate",syntax:"none | <length-percentage> [ <length-percentage> <length>? ]?",relevance:50,browsers:["FF72","S14.1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/translate"}],description:"The translate CSS property allows you to specify translation transforms individually and independently of the transform property. This maps better to typical user interface usage, and saves having to remember the exact order of transform functions to specify in the transform value."},{name:"white-space",syntax:"normal | pre | nowrap | pre-wrap | pre-line | break-spaces",relevance:90,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/white-space"}],description:"Specifies how whitespace is handled in an element."},{name:"speak-as",syntax:"auto | bullets | numbers | words | spell-out | <counter-style-name>",relevance:50,description:"The speak-as descriptor specifies how a counter symbol constructed with a given @counter-style will be represented in the spoken form. For example, an author can specify a counter symbol to be either spoken as its numerical value or just represented with an audio cue."},{name:"ascent-override",status:"experimental",syntax:"normal | <percentage>",relevance:50,description:"Describes the ascent metric of a font."},{name:"descent-override",status:"experimental",syntax:"normal | <percentage>",relevance:50,description:"Describes the descent metric of a font."},{name:"font-display",status:"experimental",syntax:"[ auto | block | swap | fallback | optional ]",relevance:70,description:"The font-display descriptor determines how a font face is displayed based on whether and when it is downloaded and ready to use."},{name:"line-gap-override",status:"experimental",syntax:"normal | <percentage>",relevance:50,description:"Describes the line-gap metric of a font."},{name:"size-adjust",status:"experimental",syntax:"<percentage>",relevance:50,description:"A multiplier for glyph outlines and metrics of a font."},{name:"bleed",syntax:"auto | <length>",relevance:50,description:"The bleed CSS at-rule descriptor, used with the @page at-rule, specifies the extent of the page bleed area outside the page box. This property only has effect if crop marks are enabled using the marks property."},{name:"marks",syntax:"none | [ crop || cross ]",relevance:50,description:"The marks CSS at-rule descriptor, used with the @page at-rule, adds crop and/or cross marks to the presentation of the document. Crop marks indicate where the page should be cut. Cross marks are used to align sheets."},{name:"syntax",status:"experimental",syntax:"<string>",relevance:50,description:"Specifies the syntax of the custom property registration represented by the @property rule, controlling how the property\u2019s value is parsed at computed value time."},{name:"inherits",status:"experimental",syntax:"true | false",relevance:50,description:"Specifies the inherit flag of the custom property registration represented by the @property rule, controlling whether or not the property inherits by default."},{name:"initial-value",status:"experimental",syntax:"<string>",relevance:50,description:"Specifies the initial value of the custom property registration represented by the @property rule, controlling the property\u2019s initial value."},{name:"max-zoom",syntax:"auto | <number> | <percentage>",relevance:50,description:`The max-zoom CSS descriptor sets the maximum zoom factor of a document defined by the @viewport at-rule. The browser will not zoom in any further than this, whether automatically or at the user's request.
+
+A zoom factor of 1.0 or 100% corresponds to no zooming. Larger values are zoomed in. Smaller values are zoomed out.`},{name:"min-zoom",syntax:"auto | <number> | <percentage>",relevance:50,description:`The min-zoom CSS descriptor sets the minimum zoom factor of a document defined by the @viewport at-rule. The browser will not zoom out any further than this, whether automatically or at the user's request.
+
+A zoom factor of 1.0 or 100% corresponds to no zooming. Larger values are zoomed in. Smaller values are zoomed out.`},{name:"orientation",syntax:"auto | portrait | landscape",relevance:50,description:"The orientation CSS @media media feature can be used to apply styles based on the orientation of the viewport (or the page box, for paged media)."},{name:"user-zoom",syntax:"zoom | fixed",relevance:50,description:"The user-zoom CSS descriptor controls whether or not the user can change the zoom factor of a document defined by @viewport."},{name:"viewport-fit",syntax:"auto | contain | cover",relevance:50,description:"The border-block-style CSS property defines the style of the logical block borders of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation."}],atDirectives:[{name:"@charset",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/@charset"}],description:"Defines character set of the document."},{name:"@counter-style",browsers:["E91","FF33","C91","O77"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/@counter-style"}],description:"Defines a custom counter style."},{name:"@font-face",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/@font-face"}],description:"Allows for linking to fonts that are automatically activated when needed. This permits authors to work around the limitation of 'web-safe' fonts, allowing for consistent rendering independent of the fonts available in a given user's environment."},{name:"@font-feature-values",browsers:["FF34","S9.1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/@font-feature-values"}],description:"Defines named values for the indices used to select alternate glyphs for a given font family."},{name:"@import",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/@import"}],description:"Includes content of another file."},{name:"@keyframes",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/@keyframes"}],description:"Defines set of animation key frames."},{name:"@media",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/@media"}],description:"Defines a stylesheet for a particular media type."},{name:"@-moz-document",browsers:["FF1.8"],description:"Gecko-specific at-rule that restricts the style rules contained within it based on the URL of the document."},{name:"@-moz-keyframes",browsers:["FF5"],description:"Defines set of animation key frames."},{name:"@-ms-viewport",browsers:["E","IE10"],description:"Specifies the size, zoom factor, and orientation of the viewport."},{name:"@namespace",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/@namespace"}],description:"Declares a prefix and associates it with a namespace name."},{name:"@-o-keyframes",browsers:["O12"],description:"Defines set of animation key frames."},{name:"@-o-viewport",browsers:["O11"],description:"Specifies the size, zoom factor, and orientation of the viewport."},{name:"@page",browsers:["E12","FF19","C2","IE8","O6"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/@page"}],description:"Directive defines various page parameters."},{name:"@supports",browsers:["E12","FF22","S9","C28","O12.1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/@supports"}],description:"A conditional group rule whose condition tests whether the user agent supports CSS property:value pairs."},{name:"@-webkit-keyframes",browsers:["C","S4"],description:"Defines set of animation key frames."}],pseudoClasses:[{name:":active",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:active"}],description:"Applies while an element is being activated by the user. For example, between the times the user presses the mouse button and releases it."},{name:":any-link",browsers:["E79","FF50","S9","C65","O52"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:any-link"}],description:"Represents an element that acts as the source anchor of a hyperlink. Applies to both visited and unvisited links."},{name:":checked",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:checked"}],description:"Radio and checkbox elements can be toggled by the user. Some menu items are 'checked' when the user selects them. When such elements are toggled 'on' the :checked pseudo-class applies."},{name:":corner-present",browsers:["C","S5"],description:"Non-standard. Indicates whether or not a scrollbar corner is present."},{name:":decrement",browsers:["C","S5"],description:"Non-standard. Applies to buttons and track pieces. Indicates whether or not the button or track piece will decrement the view\u2019s position when used."},{name:":default",browsers:["E79","FF4","S5","C10","O10"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:default"}],description:"Applies to the one or more UI elements that are the default among a set of similar elements. Typically applies to context menu items, buttons, and select lists/menus."},{name:":disabled",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:disabled"}],description:"Represents user interface elements that are in a disabled state; such elements have a corresponding enabled state."},{name:":double-button",browsers:["C","S5"],description:"Non-standard. Applies to buttons and track pieces. Applies when both buttons are displayed together at the same end of the scrollbar."},{name:":empty",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:empty"}],description:"Represents an element that has no children at all."},{name:":enabled",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:enabled"}],description:"Represents user interface elements that are in an enabled state; such elements have a corresponding disabled state."},{name:":end",browsers:["C","S5"],description:"Non-standard. Applies to buttons and track pieces. Indicates whether the object is placed after the thumb."},{name:":first",browsers:["E12","S6","C18","IE8","O9.2"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:first"}],description:"When printing double-sided documents, the page boxes on left and right pages may be different. This can be expressed through CSS pseudo-classes defined in the  page context."},{name:":first-child",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:first-child"}],description:"Same as :nth-child(1). Represents an element that is the first child of some other element."},{name:":first-of-type",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:first-of-type"}],description:"Same as :nth-of-type(1). Represents an element that is the first sibling of its type in the list of children of its parent element."},{name:":focus",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:focus"}],description:"Applies while an element has the focus (accepts keyboard or mouse events, or other forms of input)."},{name:":fullscreen",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:fullscreen"}],description:"Matches any element that has its fullscreen flag set."},{name:":future",browsers:["S7"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:future"}],description:"Represents any element that is defined to occur entirely after a :current element."},{name:":horizontal",browsers:["C","S5"],description:"Non-standard. Applies to any scrollbar pieces that have a horizontal orientation."},{name:":host",browsers:["E79","FF63","S10","C54","O41"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:host"}],description:"When evaluated in the context of a shadow tree, matches the shadow tree\u2019s host element."},{name:":host()",browsers:["C35","O22"],description:"When evaluated in the context of a shadow tree, it matches the shadow tree\u2019s host element if the host element, in its normal context, matches the selector argument."},{name:":host-context()",browsers:["C35","O22"],description:"Tests whether there is an ancestor, outside the shadow tree, which matches a particular selector."},{name:":hover",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:hover"}],description:"Applies while the user designates an element with a pointing device, but does not necessarily activate it. For example, a visual user agent could apply this pseudo-class when the cursor (mouse pointer) hovers over a box generated by the element."},{name:":increment",browsers:["C","S5"],description:"Non-standard. Applies to buttons and track pieces. Indicates whether or not the button or track piece will increment the view\u2019s position when used."},{name:":indeterminate",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:indeterminate"}],description:"Applies to UI elements whose value is in an indeterminate state."},{name:":in-range",browsers:["E13","FF29","S5.1","C10","O11"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:in-range"}],description:"Used in conjunction with the min and max attributes, whether on a range input, a number field, or any other types that accept those attributes."},{name:":invalid",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:invalid"}],description:"An element is :valid or :invalid when it is, respectively, valid or invalid with respect to data validity semantics defined by a different specification."},{name:":lang()",browsers:["E","C","FF1","IE8","O8","S3"],description:"Represents an element that is in language specified."},{name:":last-child",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:last-child"}],description:"Same as :nth-last-child(1). Represents an element that is the last child of some other element."},{name:":last-of-type",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:last-of-type"}],description:"Same as :nth-last-of-type(1). Represents an element that is the last sibling of its type in the list of children of its parent element."},{name:":left",browsers:["E12","S5.1","C6","IE8","O9.2"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:left"}],description:"When printing double-sided documents, the page boxes on left and right pages may be different. This can be expressed through CSS pseudo-classes defined in the  page context."},{name:":link",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:link"}],description:"Applies to links that have not yet been visited."},{name:":matches()",browsers:["S9"],description:"Takes a selector list as its argument. It represents an element that is represented by its argument."},{name:":-moz-any()",browsers:["FF4"],description:"Represents an element that is represented by the selector list passed as its argument. Standardized as :matches()."},{name:":-moz-any-link",browsers:["FF1"],description:"Represents an element that acts as the source anchor of a hyperlink. Applies to both visited and unvisited links."},{name:":-moz-broken",browsers:["FF3"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:-moz-broken"}],description:"Non-standard. Matches elements representing broken images."},{name:":-moz-drag-over",browsers:["FF1"],description:"Non-standard. Matches elements when a drag-over event applies to it."},{name:":-moz-first-node",browsers:["FF1"],description:"Non-standard. Represents an element that is the first child node of some other element."},{name:":-moz-focusring",browsers:["FF4"],description:"Non-standard. Matches an element that has focus and focus ring drawing is enabled in the browser."},{name:":-moz-full-screen",browsers:["FF9"],description:"Matches any element that has its fullscreen flag set. Standardized as :fullscreen."},{name:":-moz-last-node",browsers:["FF1"],description:"Non-standard. Represents an element that is the last child node of some other element."},{name:":-moz-loading",browsers:["FF3"],description:"Non-standard. Matches elements, such as images, that haven\u2019t started loading yet."},{name:":-moz-only-whitespace",browsers:["FF1"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:-moz-only-whitespace"}],description:"The same as :empty, except that it additionally matches elements that only contain code points affected by whitespace processing. Standardized as :blank."},{name:":-moz-placeholder",browsers:["FF4"],description:"Deprecated. Represents placeholder text in an input field. Use ::-moz-placeholder for Firefox 19+."},{name:":-moz-submit-invalid",browsers:["FF88"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:-moz-submit-invalid"}],description:"Non-standard. Represents any submit button when the contents of the associated form are not valid."},{name:":-moz-suppressed",browsers:["FF3"],description:"Non-standard. Matches elements representing images that have been blocked from loading."},{name:":-moz-ui-invalid",browsers:["FF4"],description:"Non-standard. Represents any validated form element whose value isn't valid "},{name:":-moz-ui-valid",browsers:["FF4"],description:"Non-standard. Represents any validated form element whose value is valid "},{name:":-moz-user-disabled",browsers:["FF3"],description:"Non-standard. Matches elements representing images that have been disabled due to the user\u2019s preferences."},{name:":-moz-window-inactive",browsers:["FF4"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:-moz-window-inactive"}],description:"Non-standard. Matches elements in an inactive window."},{name:":-ms-fullscreen",browsers:["IE11"],description:"Matches any element that has its fullscreen flag set."},{name:":-ms-input-placeholder",browsers:["IE10"],description:"Represents placeholder text in an input field. Note: for Edge use the pseudo-element ::-ms-input-placeholder. Standardized as ::placeholder."},{name:":-ms-keyboard-active",browsers:["IE10"],description:"Windows Store apps only. Applies one or more styles to an element when it has focus and the user presses the space bar."},{name:":-ms-lang()",browsers:["E","IE10"],description:"Represents an element that is in the language specified. Accepts a comma separated list of language tokens."},{name:":no-button",browsers:["C","S5"],description:"Non-standard. Applies to track pieces. Applies when there is no button at that end of the track."},{name:":not()",browsers:["E","C","FF1","IE9","O9.5","S2"],description:"The negation pseudo-class, :not(X), is a functional notation taking a simple selector (excluding the negation pseudo-class itself) as an argument. It represents an element that is not represented by its argument."},{name:":nth-child()",browsers:["E","C","FF3.5","IE9","O9.5","S3.1"],description:"Represents an element that has an+b-1 siblings before it in the document tree, for any positive integer or zero value of n, and has a parent element."},{name:":nth-last-child()",browsers:["E","C","FF3.5","IE9","O9.5","S3.1"],description:"Represents an element that has an+b-1 siblings after it in the document tree, for any positive integer or zero value of n, and has a parent element."},{name:":nth-last-of-type()",browsers:["E","C","FF3.5","IE9","O9.5","S3.1"],description:"Represents an element that has an+b-1 siblings with the same expanded element name after it in the document tree, for any zero or positive integer value of n, and has a parent element."},{name:":nth-of-type()",browsers:["E","C","FF3.5","IE9","O9.5","S3.1"],description:"Represents an element that has an+b-1 siblings with the same expanded element name before it in the document tree, for any zero or positive integer value of n, and has a parent element."},{name:":only-child",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:only-child"}],description:"Represents an element that has a parent element and whose parent element has no other element children. Same as :first-child:last-child or :nth-child(1):nth-last-child(1), but with a lower specificity."},{name:":only-of-type",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:only-of-type"}],description:"Matches every element that is the only child of its type, of its parent. Same as :first-of-type:last-of-type or :nth-of-type(1):nth-last-of-type(1), but with a lower specificity."},{name:":optional",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:optional"}],description:"A form element is :required or :optional if a value for it is, respectively, required or optional before the form it belongs to is submitted. Elements that are not form elements are neither required nor optional."},{name:":out-of-range",browsers:["E13","FF29","S5.1","C10","O11"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:out-of-range"}],description:"Used in conjunction with the min and max attributes, whether on a range input, a number field, or any other types that accept those attributes."},{name:":past",browsers:["S7"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:past"}],description:"Represents any element that is defined to occur entirely prior to a :current element."},{name:":read-only",browsers:["E13","FF78","S4","C1","O9"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:read-only"}],description:"An element whose contents are not user-alterable is :read-only. However, elements whose contents are user-alterable (such as text input fields) are considered to be in a :read-write state. In typical documents, most elements are :read-only."},{name:":read-write",browsers:["E13","FF78","S4","C1","O9"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:read-write"}],description:"An element whose contents are not user-alterable is :read-only. However, elements whose contents are user-alterable (such as text input fields) are considered to be in a :read-write state. In typical documents, most elements are :read-only."},{name:":required",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:required"}],description:"A form element is :required or :optional if a value for it is, respectively, required or optional before the form it belongs to is submitted. Elements that are not form elements are neither required nor optional."},{name:":right",browsers:["E12","S5.1","C6","IE8","O9.2"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:right"}],description:"When printing double-sided documents, the page boxes on left and right pages may be different. This can be expressed through CSS pseudo-classes defined in the  page context."},{name:":root",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:root"}],description:"Represents an element that is the root of the document. In HTML 4, this is always the HTML element."},{name:":scope",browsers:["E79","FF32","S7","C27","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:scope"}],description:"Represents any element that is in the contextual reference element set."},{name:":single-button",browsers:["C","S5"],description:"Non-standard. Applies to buttons and track pieces. Applies when both buttons are displayed separately at either end of the scrollbar."},{name:":start",browsers:["C","S5"],description:"Non-standard. Applies to buttons and track pieces. Indicates whether the object is placed before the thumb."},{name:":target",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:target"}],description:"Some URIs refer to a location within a resource. This kind of URI ends with a 'number sign' (#) followed by an anchor identifier (called the fragment identifier)."},{name:":valid",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:valid"}],description:"An element is :valid or :invalid when it is, respectively, valid or invalid with respect to data validity semantics defined by a different specification."},{name:":vertical",browsers:["C","S5"],description:"Non-standard. Applies to any scrollbar pieces that have a vertical orientation."},{name:":visited",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:visited"}],description:"Applies once the link has been visited by the user."},{name:":-webkit-any()",browsers:["C","S5"],description:"Represents an element that is represented by the selector list passed as its argument. Standardized as :matches()."},{name:":-webkit-full-screen",browsers:["C","S6"],description:"Matches any element that has its fullscreen flag set. Standardized as :fullscreen."},{name:":window-inactive",browsers:["C","S3"],description:"Non-standard. Applies to all scrollbar pieces. Indicates whether or not the window containing the scrollbar is currently active."},{name:":current",status:"experimental",description:"The :current CSS pseudo-class selector is a time-dimensional pseudo-class that represents the element, or an ancestor of the element, that is currently being displayed"},{name:":blank",status:"experimental",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:blank"}],description:"The :blank CSS pseudo-class selects empty user input elements (eg. <input> or <textarea>)."},{name:":defined",status:"experimental",browsers:["E79","FF63","S10","C54","O41"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:defined"}],description:"The :defined CSS pseudo-class represents any element that has been defined. This includes any standard element built in to the browser, and custom elements that have been successfully defined (i.e. with the CustomElementRegistry.define() method)."},{name:":dir",browsers:["FF49"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:dir"}],description:"The :dir() CSS pseudo-class matches elements based on the directionality of the text contained in them."},{name:":focus-visible",browsers:["E86","FF85","S15.4","C86","O72"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:focus-visible"}],description:"The :focus-visible pseudo-class applies while an element matches the :focus pseudo-class and the UA determines via heuristics that the focus should be made evident on the element."},{name:":focus-within",browsers:["E79","FF52","S10.1","C60","O47"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:focus-within"}],description:"The :focus-within pseudo-class applies to any element for which the :focus pseudo class applies as well as to an element whose descendant in the flat tree (including non-element nodes, such as text nodes) matches the conditions for matching :focus."},{name:":has",status:"experimental",browsers:["S15.4"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:has"}],description:":The :has() CSS pseudo-class represents an element if any of the selectors passed as parameters (relative to the :scope of the given element), match at least one element."},{name:":is",status:"experimental",browsers:["E88","FF78","S14","C88","O74"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:is"}],description:"The :is() CSS pseudo-class function takes a selector list as its argument, and selects any element that can be selected by one of the selectors in that list. This is useful for writing large selectors in a more compact form."},{name:":local-link",status:"experimental",description:"The :local-link CSS pseudo-class represents an link to the same document"},{name:":nth-col",status:"experimental",description:"The :nth-col() CSS pseudo-class is designed for tables and grids. It accepts the An+B notation such as used with the :nth-child selector, using this to target every nth column. "},{name:":nth-last-col",status:"experimental",description:"The :nth-last-col() CSS pseudo-class is designed for tables and grids. It accepts the An+B notation such as used with the :nth-child selector, using this to target every nth column before it, therefore counting back from the end of the set of columns."},{name:":paused",status:"experimental",description:"The :paused CSS pseudo-class selector is a resource state pseudo-class that will match an audio, video, or similar resource that is capable of being \u201Cplayed\u201D or \u201Cpaused\u201D, when that element is \u201Cpaused\u201D."},{name:":placeholder-shown",status:"experimental",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:placeholder-shown"}],description:"The :placeholder-shown CSS pseudo-class represents any <input> or <textarea> element that is currently displaying placeholder text."},{name:":playing",status:"experimental",description:"The :playing CSS pseudo-class selector is a resource state pseudo-class that will match an audio, video, or similar resource that is capable of being \u201Cplayed\u201D or \u201Cpaused\u201D, when that element is \u201Cplaying\u201D. "},{name:":target-within",status:"experimental",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:target-within"}],description:"The :target-within CSS pseudo-class represents an element that is a target element or contains an element that is a target. A target element is a unique element with an id matching the URL's fragment."},{name:":user-invalid",status:"experimental",browsers:["FF88"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:user-invalid"}],description:"The :user-invalid CSS pseudo-class represents any validated form element whose value isn't valid based on their validation constraints, after the user has interacted with it."},{name:":user-valid",status:"experimental",browsers:["FF88"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:user-valid"}],description:"The :user-valid CSS pseudo-class represents any validated form element whose value validates correctly based on its validation constraints. However, unlike :valid it only matches once the user has interacted with it."},{name:":where",status:"experimental",browsers:["E88","FF78","S14","C88","O74"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/:where"}],description:"The :where() CSS pseudo-class function takes a selector list as its argument, and selects any element that can be selected by one of the selectors in that list."},{name:":picture-in-picture",status:"experimental",description:"The :picture-in-picture CSS pseudo-class matches the element which is currently in picture-in-picture mode."}],pseudoElements:[{name:"::after",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::after"}],description:"Represents a styleable child pseudo-element immediately after the originating element\u2019s actual content."},{name:"::backdrop",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::backdrop"}],description:"Used to create a backdrop that hides the underlying document for an element in a top layer (such as an element that is displayed fullscreen)."},{name:"::before",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::before"}],description:"Represents a styleable child pseudo-element immediately before the originating element\u2019s actual content."},{name:"::content",browsers:["C35","O22"],description:"Deprecated. Matches the distribution list itself, on elements that have one. Use ::slotted for forward compatibility."},{name:"::cue",browsers:["E79","FF55","S7","C26","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::cue"}]},{name:"::cue()",browsers:["C","O16","S6"]},{name:"::cue-region",browsers:["C","O16","S6"]},{name:"::cue-region()",browsers:["C","O16","S6"]},{name:"::first-letter",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::first-letter"}],description:"Represents the first letter of an element, if it is not preceded by any other content (such as images or inline tables) on its line."},{name:"::first-line",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::first-line"}],description:"Describes the contents of the first formatted line of its originating element."},{name:"::-moz-focus-inner",browsers:["FF4"]},{name:"::-moz-focus-outer",browsers:["FF4"]},{name:"::-moz-list-bullet",browsers:["FF1"],description:"Used to style the bullet of a list element. Similar to the standardized ::marker."},{name:"::-moz-list-number",browsers:["FF1"],description:"Used to style the numbers of a list element. Similar to the standardized ::marker."},{name:"::-moz-placeholder",browsers:["FF19"],description:"Represents placeholder text in an input field"},{name:"::-moz-progress-bar",browsers:["FF9"],description:"Represents the bar portion of a progress bar."},{name:"::-moz-selection",browsers:["FF1"],description:"Represents the portion of a document that has been highlighted by the user."},{name:"::-ms-backdrop",browsers:["IE11"],description:"Used to create a backdrop that hides the underlying document for an element in a top layer (such as an element that is displayed fullscreen)."},{name:"::-ms-browse",browsers:["E","IE10"],description:"Represents the browse button of an input type=file control."},{name:"::-ms-check",browsers:["E","IE10"],description:"Represents the check of a checkbox or radio button input control."},{name:"::-ms-clear",browsers:["E","IE10"],description:"Represents the clear button of a text input control"},{name:"::-ms-expand",browsers:["E","IE10"],description:"Represents the drop-down button of a select control."},{name:"::-ms-fill",browsers:["E","IE10"],description:"Represents the bar portion of a progress bar."},{name:"::-ms-fill-lower",browsers:["E","IE10"],description:"Represents the portion of the slider track from its smallest value up to the value currently selected by the thumb. In a left-to-right layout, this is the portion of the slider track to the left of the thumb."},{name:"::-ms-fill-upper",browsers:["E","IE10"],description:"Represents the portion of the slider track from the value currently selected by the thumb up to the slider's largest value. In a left-to-right layout, this is the portion of the slider track to the right of the thumb."},{name:"::-ms-reveal",browsers:["E","IE10"],description:"Represents the password reveal button of an input type=password control."},{name:"::-ms-thumb",browsers:["E","IE10"],description:"Represents the portion of range input control (also known as a slider control) that the user drags."},{name:"::-ms-ticks-after",browsers:["E","IE10"],description:"Represents the tick marks of a slider that begin just after the thumb and continue up to the slider's largest value. In a left-to-right layout, these are the ticks to the right of the thumb."},{name:"::-ms-ticks-before",browsers:["E","IE10"],description:"Represents the tick marks of a slider that represent its smallest values up to the value currently selected by the thumb. In a left-to-right layout, these are the ticks to the left of the thumb."},{name:"::-ms-tooltip",browsers:["E","IE10"],description:"Represents the tooltip of a slider (input type=range)."},{name:"::-ms-track",browsers:["E","IE10"],description:"Represents the track of a slider."},{name:"::-ms-value",browsers:["E","IE10"],description:"Represents the content of a text or password input control, or a select control."},{name:"::selection",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::selection"}],description:"Represents the portion of a document that has been highlighted by the user."},{name:"::shadow",browsers:["C35","O22"],description:"Matches the shadow root if an element has a shadow tree."},{name:"::-webkit-file-upload-button",browsers:["C","O","S6"]},{name:"::-webkit-inner-spin-button",browsers:["E79","S5","C6","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-inner-spin-button"}]},{name:"::-webkit-input-placeholder",browsers:["C","S4"]},{name:"::-webkit-keygen-select",browsers:["C","O","S6"]},{name:"::-webkit-meter-bar",browsers:["E79","S5.1","C12","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-bar"}]},{name:"::-webkit-meter-even-less-good-value",browsers:["E79","S5.1","C12","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-even-less-good-value"}]},{name:"::-webkit-meter-optimum-value",browsers:["E79","S5.1","C12","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-optimum-value"}]},{name:"::-webkit-meter-suboptimum-value",browsers:["E79","S5.1","C12","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-suboptimum-value"}]},{name:"::-webkit-outer-spin-button",browsers:["S5","C6"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-outer-spin-button"}]},{name:"::-webkit-progress-bar",browsers:["E79","S7","C25","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-bar"}]},{name:"::-webkit-progress-inner-element",browsers:["E79","S7","C23","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-inner-element"}]},{name:"::-webkit-progress-value",browsers:["E79","S7","C25","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-value"}]},{name:"::-webkit-resizer",browsers:["E79","S4","C2","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar"}]},{name:"::-webkit-scrollbar",browsers:["E79","S4","C2","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar"}]},{name:"::-webkit-scrollbar-button",browsers:["E79","S4","C2","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar"}]},{name:"::-webkit-scrollbar-corner",browsers:["E79","S4","C2","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar"}]},{name:"::-webkit-scrollbar-thumb",browsers:["E79","S4","C2","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar"}]},{name:"::-webkit-scrollbar-track",browsers:["E79","S4","C2","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar"}]},{name:"::-webkit-scrollbar-track-piece",browsers:["E79","S4","C2","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar"}]},{name:"::-webkit-search-cancel-button",browsers:["E79","S3","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-search-cancel-button"}]},{name:"::-webkit-search-decoration",browsers:["C","S4"]},{name:"::-webkit-search-results-button",browsers:["E79","S3","C1","O15"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-webkit-search-results-button"}]},{name:"::-webkit-search-results-decoration",browsers:["C","S4"]},{name:"::-webkit-slider-runnable-track",browsers:["C","O","S6"]},{name:"::-webkit-slider-thumb",browsers:["C","O","S6"]},{name:"::-webkit-textfield-decoration-container",browsers:["C","O","S6"]},{name:"::-webkit-validation-bubble",browsers:["C","O","S6"]},{name:"::-webkit-validation-bubble-arrow",browsers:["C","O","S6"]},{name:"::-webkit-validation-bubble-arrow-clipper",browsers:["C","O","S6"]},{name:"::-webkit-validation-bubble-heading",browsers:["C","O","S6"]},{name:"::-webkit-validation-bubble-message",browsers:["C","O","S6"]},{name:"::-webkit-validation-bubble-text-block",browsers:["C","O","S6"]},{name:"::target-text",status:"experimental",browsers:["E89","C89","O75"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::target-text"}],description:"The ::target-text CSS pseudo-element represents the text that has been scrolled to if the browser supports scroll-to-text fragments. It allows authors to choose how to highlight that section of text."},{name:"::-moz-range-progress",status:"nonstandard",browsers:["FF22"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-moz-range-progress"}],description:'The ::-moz-range-progress CSS pseudo-element is a Mozilla extension that represents the lower portion of the track (i.e., groove) in which the indicator slides in an <input> of type="range". This portion corresponds to values lower than the value currently selected by the thumb (i.e., virtual knob).'},{name:"::-moz-range-thumb",status:"nonstandard",browsers:["FF21"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-moz-range-thumb"}],description:`The ::-moz-range-thumb CSS pseudo-element is a Mozilla extension that represents the thumb (i.e., virtual knob) of an <input> of type="range". The user can move the thumb along the input's track to alter its numerical value.`},{name:"::-moz-range-track",status:"nonstandard",browsers:["FF21"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::-moz-range-track"}],description:'The ::-moz-range-track CSS pseudo-element is a Mozilla extension that represents the track (i.e., groove) in which the indicator slides in an <input> of type="range".'},{name:"::-webkit-progress-inner-value",status:"nonstandard",description:`The ::-webkit-progress-value CSS pseudo-element represents the filled-in portion of the bar of a <progress> element. It is a child of the ::-webkit-progress-bar pseudo-element.
+
+In order to let ::-webkit-progress-value take effect, -webkit-appearance needs to be set to none on the <progress> element.`},{name:"::grammar-error",status:"experimental",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::grammar-error"}],description:"The ::grammar-error CSS pseudo-element represents a text segment which the user agent has flagged as grammatically incorrect."},{name:"::marker",browsers:["E86","FF68","S11.1","C86","O72"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::marker"}],description:"The ::marker CSS pseudo-element selects the marker box of a list item, which typically contains a bullet or number. It works on any element or pseudo-element set to display: list-item, such as the <li> and <summary> elements."},{name:"::part",status:"experimental",browsers:["E79","FF72","S13.1","C73","O60"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::part"}],description:"The ::part CSS pseudo-element represents any element within a shadow tree that has a matching part attribute."},{name:"::placeholder",browsers:["E79","FF51","S10.1","C57","O44"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::placeholder"}],description:"The ::placeholder CSS pseudo-element represents the placeholder text of a form element."},{name:"::slotted",browsers:["E79","FF63","S10","C50","O37"],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::slotted"}],description:"The :slotted() CSS pseudo-element represents any element that has been placed into a slot inside an HTML template."},{name:"::spelling-error",status:"experimental",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/::spelling-error"}],description:"The ::spelling-error CSS pseudo-element represents a text segment which the user agent has flagged as incorrectly spelled."}]};var Un=function(){function n(e){this._properties=[],this._atDirectives=[],this._pseudoClasses=[],this._pseudoElements=[],this.addData(e)}return n.prototype.provideProperties=function(){return this._properties},n.prototype.provideAtDirectives=function(){return this._atDirectives},n.prototype.providePseudoClasses=function(){return this._pseudoClasses},n.prototype.providePseudoElements=function(){return this._pseudoElements},n.prototype.addData=function(e){if(Array.isArray(e.properties))for(var t=0,r=e.properties;t<r.length;t++){var i=r[t];Ya(i)&&this._properties.push(i)}if(Array.isArray(e.atDirectives))for(var o=0,s=e.atDirectives;o<s.length;o++){var i=s[o];Qa(i)&&this._atDirectives.push(i)}if(Array.isArray(e.pseudoClasses))for(var a=0,l=e.pseudoClasses;a<l.length;a++){var i=l[a];Za(i)&&this._pseudoClasses.push(i)}if(Array.isArray(e.pseudoElements))for(var c=0,h=e.pseudoElements;c<h.length;c++){var i=h[c];el(i)&&this._pseudoElements.push(i)}},n}();function Ya(n){return typeof n.name=="string"}function Qa(n){return typeof n.name=="string"}function Za(n){return typeof n.name=="string"}function el(n){return typeof n.name=="string"}var jn=function(){function n(e){this.dataProviders=[],this._propertySet={},this._atDirectiveSet={},this._pseudoClassSet={},this._pseudoElementSet={},this._properties=[],this._atDirectives=[],this._pseudoClasses=[],this._pseudoElements=[],this.setDataProviders(e?.useDefaultDataProvider!==!1,e?.customDataProviders||[])}return n.prototype.setDataProviders=function(e,t){var r;this.dataProviders=[],e&&this.dataProviders.push(new Un(Br)),(r=this.dataProviders).push.apply(r,t),this.collectData()},n.prototype.collectData=function(){var e=this;this._propertySet={},this._atDirectiveSet={},this._pseudoClassSet={},this._pseudoElementSet={},this.dataProviders.forEach(function(t){t.provideProperties().forEach(function(r){e._propertySet[r.name]||(e._propertySet[r.name]=r)}),t.provideAtDirectives().forEach(function(r){e._atDirectiveSet[r.name]||(e._atDirectiveSet[r.name]=r)}),t.providePseudoClasses().forEach(function(r){e._pseudoClassSet[r.name]||(e._pseudoClassSet[r.name]=r)}),t.providePseudoElements().forEach(function(r){e._pseudoElementSet[r.name]||(e._pseudoElementSet[r.name]=r)})}),this._properties=Vt(this._propertySet),this._atDirectives=Vt(this._atDirectiveSet),this._pseudoClasses=Vt(this._pseudoClassSet),this._pseudoElements=Vt(this._pseudoElementSet)},n.prototype.getProperty=function(e){return this._propertySet[e]},n.prototype.getAtDirective=function(e){return this._atDirectiveSet[e]},n.prototype.getPseudoClass=function(e){return this._pseudoClassSet[e]},n.prototype.getPseudoElement=function(e){return this._pseudoElementSet[e]},n.prototype.getProperties=function(){return this._properties},n.prototype.getAtDirectives=function(){return this._atDirectives},n.prototype.getPseudoClasses=function(){return this._pseudoClasses},n.prototype.getPseudoElements=function(){return this._pseudoElements},n.prototype.isKnownProperty=function(e){return e.toLowerCase()in this._propertySet},n.prototype.isStandardProperty=function(e){return this.isKnownProperty(e)&&(!this._propertySet[e.toLowerCase()].status||this._propertySet[e.toLowerCase()].status==="standard")},n}();function is(n,e,t){function r(o){for(var s=i(o),a=void 0,l=s.length-1;l>=0;l--)a=ft.create(W.create(n.positionAt(s[l][0]),n.positionAt(s[l][1])),a);return a||(a=ft.create(W.create(o,o))),a}return e.map(r);function i(o){var s=n.offsetAt(o),a=t.findChildAtOffset(s,!0);if(!a)return[];for(var l=[];a;){if(a.parent&&a.offset===a.parent.offset&&a.end===a.parent.end){a=a.parent;continue}a.type===u.Declarations&&s>a.offset&&s<a.end&&l.push([a.offset+1,a.end-1]),l.push([a.offset,a.end]),a=a.parent}return l}}var tl=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}}(),nl=function(n,e,t,r){function i(o){return o instanceof t?o:new t(function(s){s(o)})}return new(t||(t=Promise))(function(o,s){function a(h){try{c(r.next(h))}catch(p){s(p)}}function l(h){try{c(r.throw(h))}catch(p){s(p)}}function c(h){h.done?o(h.value):i(h.value).then(a,l)}c((r=r.apply(n,e||[])).next())})},rl=function(n,e){var t={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},r,i,o,s;return s={next:a(0),throw:a(1),return:a(2)},typeof Symbol=="function"&&(s[Symbol.iterator]=function(){return this}),s;function a(c){return function(h){return l([c,h])}}function l(c){if(r)throw new TypeError("Generator is already executing.");for(;t;)try{if(r=1,i&&(o=c[0]&2?i.return:c[0]?i.throw||((o=i.return)&&o.call(i),0):i.next)&&!(o=o.call(i,c[1])).done)return o;switch(i=0,o&&(c=[c[0]&2,o.value]),c[0]){case 0:case 1:o=c;break;case 4:return t.label++,{value:c[1],done:!1};case 5:t.label++,i=c[1],c=[0];continue;case 7:c=t.ops.pop(),t.trys.pop();continue;default:if(o=t.trys,!(o=o.length>0&&o[o.length-1])&&(c[0]===6||c[0]===2)){t=0;continue}if(c[0]===3&&(!o||c[1]>o[0]&&c[1]<o[3])){t.label=c[1];break}if(c[0]===6&&t.label<o[1]){t.label=o[1],o=c;break}if(o&&t.label<o[2]){t.label=o[2],t.ops.push(c);break}o[2]&&t.ops.pop(),t.trys.pop();continue}c=e.call(n,t)}catch(h){c=[6,h],i=0}finally{r=o=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}},os=function(n){tl(e,n);function e(t){return n.call(this,t,!0)||this}return e.prototype.isRawStringDocumentLinkNode=function(t){return n.prototype.isRawStringDocumentLinkNode.call(this,t)||t.type===u.Use||t.type===u.Forward},e.prototype.resolveRelativeReference=function(t,r,i,o){return nl(this,void 0,void 0,function(){function s(m){if(m.path!==""&&!(m.path.endsWith(".scss")||m.path.endsWith(".css"))){if(m.path.endsWith("/"))return[m.with({path:m.path+"index.scss"}).toString(),m.with({path:m.path+"_index.scss"}).toString()];var g=m.path.split("/"),w=g[g.length-1],x=m.path.slice(0,-w.length);if(w.startsWith("_"))return m.path.endsWith(".scss")?void 0:[m.with({path:m.path+".scss"}).toString()];var y=w+".scss",D=function(ue){return m.with({path:x+ue}).toString()},M=D(y),z=D("_"+y),P=D(y.slice(0,-5)+"/index.scss"),L=D(y.slice(0,-5)+"/_index.scss"),$=D(y.slice(0,-5)+".css");return[M,z,P,L,$]}}var a,l,c,h,p;return rl(this,function(m){switch(m.label){case 0:return q(t,"sass:")?[2,void 0]:[4,n.prototype.resolveRelativeReference.call(this,t,r,i,o)];case 1:if(a=m.sent(),!(this.fileSystemProvider&&a&&o))return[3,8];l=qt.parse(a),m.label=2;case 2:if(m.trys.push([2,7,,8]),c=s(l),!c)return[3,6];h=0,m.label=3;case 3:return h<c.length?[4,this.fileExists(c[h])]:[3,6];case 4:if(m.sent())return[2,c[h]];m.label=5;case 5:return h++,[3,3];case 6:return[3,8];case 7:return p=m.sent(),[3,8];case 8:return[2,a]}})})},e}(Xt);function ss(n){return new Un(n)}function $r(n,e,t,r,i,o,s){return{configure:function(a){o.configure(a),e.configure(a?.completion),t.configure(a?.hover)},setDataProviders:s.setDataProviders.bind(s),doValidation:o.doValidation.bind(o),parseStylesheet:n.parseStylesheet.bind(n),doComplete:e.doComplete.bind(e),doComplete2:e.doComplete2.bind(e),setCompletionParticipants:e.setCompletionParticipants.bind(e),doHover:t.doHover.bind(t),format:rs,findDefinition:r.findDefinition.bind(r),findReferences:r.findReferences.bind(r),findDocumentHighlights:r.findDocumentHighlights.bind(r),findDocumentLinks:r.findDocumentLinks.bind(r),findDocumentLinks2:r.findDocumentLinks2.bind(r),findDocumentSymbols:r.findDocumentSymbols.bind(r),doCodeActions:i.doCodeActions.bind(i),doCodeActions2:i.doCodeActions2.bind(i),findDocumentColors:r.findDocumentColors.bind(r),getColorPresentations:r.getColorPresentations.bind(r),doRename:r.doRename.bind(r),getFoldingRanges:Yo,getSelectionRanges:is}}var qr={};function as(n){n===void 0&&(n=qr);var e=new jn(n);return $r(new gt,new vt(null,n,e),new In(n&&n.clientCapabilities,e),new Xt(n&&n.fileSystemProvider,!1),new Mn(e),new Pn(e),e)}function ls(n){n===void 0&&(n=qr);var e=new jn(n);return $r(new $o,new Ko(n,e),new In(n&&n.clientCapabilities,e),new os(n&&n.fileSystemProvider),new Mn(e),new Pn(e),e)}function cs(n){n===void 0&&(n=qr);var e=new jn(n);return $r(new Ho,new Jo(n,e),new In(n&&n.clientCapabilities,e),new Xt(n&&n.fileSystemProvider,!0),new Mn(e),new Pn(e),e)}var Vn=class{constructor(e,t){this._ctx=e,this._languageSettings=t.options,this._languageId=t.languageId;let r=t.options.data,i=r?.useDefaultDataProvider,o=[];if(r?.dataProviders)for(let a in r.dataProviders)o.push(ss(r.dataProviders[a]));let s={customDataProviders:o,useDefaultDataProvider:i};switch(this._languageId){case"css":this._languageService=as(s);break;case"less":this._languageService=cs(s);break;case"scss":this._languageService=ls(s);break;default:throw new Error("Invalid language id: "+this._languageId)}this._languageService.configure(this._languageSettings)}async doValidation(e){let t=this._getTextDocument(e);if(t){let r=this._languageService.parseStylesheet(t),i=this._languageService.doValidation(t,r);return Promise.resolve(i)}return Promise.resolve([])}async doComplete(e,t){let r=this._getTextDocument(e);if(!r)return null;let i=this._languageService.parseStylesheet(r),o=this._languageService.doComplete(r,t,i);return Promise.resolve(o)}async doHover(e,t){let r=this._getTextDocument(e);if(!r)return null;let i=this._languageService.parseStylesheet(r),o=this._languageService.doHover(r,t,i);return Promise.resolve(o)}async findDefinition(e,t){let r=this._getTextDocument(e);if(!r)return null;let i=this._languageService.parseStylesheet(r),o=this._languageService.findDefinition(r,t,i);return Promise.resolve(o)}async findReferences(e,t){let r=this._getTextDocument(e);if(!r)return[];let i=this._languageService.parseStylesheet(r),o=this._languageService.findReferences(r,t,i);return Promise.resolve(o)}async findDocumentHighlights(e,t){let r=this._getTextDocument(e);if(!r)return[];let i=this._languageService.parseStylesheet(r),o=this._languageService.findDocumentHighlights(r,t,i);return Promise.resolve(o)}async findDocumentSymbols(e){let t=this._getTextDocument(e);if(!t)return[];let r=this._languageService.parseStylesheet(t),i=this._languageService.findDocumentSymbols(t,r);return Promise.resolve(i)}async doCodeActions(e,t,r){let i=this._getTextDocument(e);if(!i)return[];let o=this._languageService.parseStylesheet(i),s=this._languageService.doCodeActions(i,t,r,o);return Promise.resolve(s)}async findDocumentColors(e){let t=this._getTextDocument(e);if(!t)return[];let r=this._languageService.parseStylesheet(t),i=this._languageService.findDocumentColors(t,r);return Promise.resolve(i)}async getColorPresentations(e,t,r){let i=this._getTextDocument(e);if(!i)return[];let o=this._languageService.parseStylesheet(i),s=this._languageService.getColorPresentations(i,o,t,r);return Promise.resolve(s)}async getFoldingRanges(e,t){let r=this._getTextDocument(e);if(!r)return[];let i=this._languageService.getFoldingRanges(r,t);return Promise.resolve(i)}async getSelectionRanges(e,t){let r=this._getTextDocument(e);if(!r)return[];let i=this._languageService.parseStylesheet(r),o=this._languageService.getSelectionRanges(r,t,i);return Promise.resolve(o)}async doRename(e,t,r){let i=this._getTextDocument(e);if(!i)return null;let o=this._languageService.parseStylesheet(i),s=this._languageService.doRename(i,t,r,o);return Promise.resolve(s)}async format(e,t,r){let i=this._getTextDocument(e);if(!i)return[];let o={...this._languageSettings.format,...r},s=this._languageService.format(i,t,o);return Promise.resolve(s)}_getTextDocument(e){let t=this._ctx.getMirrorModels();for(let r of t)if(r.uri.toString()===e)return Lt.create(e,this._languageId,r.version,r.getValue());return null}};function ol(n,e){return new Vn(n,e)}return fs(sl);})();
+return moduleExports;
+});
diff --git a/public/vs/language/html/htmlMode.js b/public/vs/language/html/htmlMode.js
new file mode 100644
index 0000000..61bcb8e
--- /dev/null
+++ b/public/vs/language/html/htmlMode.js
@@ -0,0 +1,13 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/language/html/htmlMode", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var rn=Object.create;var Q=Object.defineProperty;var on=Object.getOwnPropertyDescriptor;var sn=Object.getOwnPropertyNames;var an=Object.getPrototypeOf,un=Object.prototype.hasOwnProperty;var dn=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(t,i)=>(typeof require<"u"?require:t)[i]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var cn=(n,t)=>()=>(t||n((t={exports:{}}).exports,t),t.exports),ln=(n,t)=>{for(var i in t)Q(n,i,{get:t[i],enumerable:!0})},q=(n,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of sn(t))!un.call(n,e)&&e!==i&&Q(n,e,{get:()=>t[e],enumerable:!(r=on(t,e))||r.enumerable});return n},me=(n,t,i)=>(q(n,t,"default"),i&&q(i,t,"default")),he=(n,t,i)=>(i=n!=null?rn(an(n)):{},q(t||!n||!n.__esModule?Q(i,"default",{value:n,enumerable:!0}):i,n)),gn=n=>q(Q({},"__esModule",{value:!0}),n);var Te=cn((Sn,ve)=>{var fn=he(dn("vs/editor/editor.api"));ve.exports=fn});var Dn={};ln(Dn,{CompletionAdapter:()=>B,DefinitionAdapter:()=>ce,DiagnosticsAdapter:()=>de,DocumentColorAdapter:()=>ge,DocumentFormattingEditProvider:()=>H,DocumentHighlightAdapter:()=>S,DocumentLinkAdapter:()=>A,DocumentRangeFormattingEditProvider:()=>K,DocumentSymbolAdapter:()=>M,FoldingRangeAdapter:()=>U,HoverAdapter:()=>L,ReferenceAdapter:()=>le,RenameAdapter:()=>F,SelectionRangeAdapter:()=>j,WorkerManager:()=>b,fromPosition:()=>C,fromRange:()=>fe,setupMode:()=>Wn,setupMode1:()=>Pn,toRange:()=>y,toTextEdit:()=>D});var d={};me(d,he(Te()));var pn=2*60*1e3,b=class{constructor(t){this._defaults=t,this._worker=null,this._client=null,this._idleCheckInterval=window.setInterval(()=>this._checkIfIdle(),30*1e3),this._lastUsedTime=0,this._configChangeListener=this._defaults.onDidChange(()=>this._stopWorker())}_stopWorker(){this._worker&&(this._worker.dispose(),this._worker=null),this._client=null}dispose(){clearInterval(this._idleCheckInterval),this._configChangeListener.dispose(),this._stopWorker()}_checkIfIdle(){if(!this._worker)return;Date.now()-this._lastUsedTime>pn&&this._stopWorker()}_getClient(){return this._lastUsedTime=Date.now(),this._client||(this._worker=d.editor.createWebWorker({moduleId:"vs/language/html/htmlWorker",createData:{languageSettings:this._defaults.options,languageId:this._defaults.languageId},label:this._defaults.languageId}),this._client=this._worker.getProxy()),this._client}getLanguageServiceWorker(...t){let i;return this._getClient().then(r=>{i=r}).then(r=>{if(this._worker)return this._worker.withSyncedResources(t)}).then(r=>i)}};var ye;(function(n){n.MIN_VALUE=-2147483648,n.MAX_VALUE=2147483647})(ye||(ye={}));var J;(function(n){n.MIN_VALUE=0,n.MAX_VALUE=2147483647})(J||(J={}));var x;(function(n){function t(r,e){return r===Number.MAX_VALUE&&(r=J.MAX_VALUE),e===Number.MAX_VALUE&&(e=J.MAX_VALUE),{line:r,character:e}}n.create=t;function i(r){var e=r;return a.objectLiteral(e)&&a.uinteger(e.line)&&a.uinteger(e.character)}n.is=i})(x||(x={}));var v;(function(n){function t(r,e,o,s){if(a.uinteger(r)&&a.uinteger(e)&&a.uinteger(o)&&a.uinteger(s))return{start:x.create(r,e),end:x.create(o,s)};if(x.is(r)&&x.is(e))return{start:r,end:e};throw new Error("Range#create called with invalid arguments["+r+", "+e+", "+o+", "+s+"]")}n.create=t;function i(r){var e=r;return a.objectLiteral(e)&&x.is(e.start)&&x.is(e.end)}n.is=i})(v||(v={}));var ie;(function(n){function t(r,e){return{uri:r,range:e}}n.create=t;function i(r){var e=r;return a.defined(e)&&v.is(e.range)&&(a.string(e.uri)||a.undefined(e.uri))}n.is=i})(ie||(ie={}));var xe;(function(n){function t(r,e,o,s){return{targetUri:r,targetRange:e,targetSelectionRange:o,originSelectionRange:s}}n.create=t;function i(r){var e=r;return a.defined(e)&&v.is(e.targetRange)&&a.string(e.targetUri)&&(v.is(e.targetSelectionRange)||a.undefined(e.targetSelectionRange))&&(v.is(e.originSelectionRange)||a.undefined(e.originSelectionRange))}n.is=i})(xe||(xe={}));var oe;(function(n){function t(r,e,o,s){return{red:r,green:e,blue:o,alpha:s}}n.create=t;function i(r){var e=r;return a.numberRange(e.red,0,1)&&a.numberRange(e.green,0,1)&&a.numberRange(e.blue,0,1)&&a.numberRange(e.alpha,0,1)}n.is=i})(oe||(oe={}));var ke;(function(n){function t(r,e){return{range:r,color:e}}n.create=t;function i(r){var e=r;return v.is(e.range)&&oe.is(e.color)}n.is=i})(ke||(ke={}));var Ie;(function(n){function t(r,e,o){return{label:r,textEdit:e,additionalTextEdits:o}}n.create=t;function i(r){var e=r;return a.string(e.label)&&(a.undefined(e.textEdit)||_.is(e))&&(a.undefined(e.additionalTextEdits)||a.typedArray(e.additionalTextEdits,_.is))}n.is=i})(Ie||(Ie={}));var P;(function(n){n.Comment="comment",n.Imports="imports",n.Region="region"})(P||(P={}));var _e;(function(n){function t(r,e,o,s,u){var l={startLine:r,endLine:e};return a.defined(o)&&(l.startCharacter=o),a.defined(s)&&(l.endCharacter=s),a.defined(u)&&(l.kind=u),l}n.create=t;function i(r){var e=r;return a.uinteger(e.startLine)&&a.uinteger(e.startLine)&&(a.undefined(e.startCharacter)||a.uinteger(e.startCharacter))&&(a.undefined(e.endCharacter)||a.uinteger(e.endCharacter))&&(a.undefined(e.kind)||a.string(e.kind))}n.is=i})(_e||(_e={}));var se;(function(n){function t(r,e){return{location:r,message:e}}n.create=t;function i(r){var e=r;return a.defined(e)&&ie.is(e.location)&&a.string(e.message)}n.is=i})(se||(se={}));var w;(function(n){n.Error=1,n.Warning=2,n.Information=3,n.Hint=4})(w||(w={}));var Ce;(function(n){n.Unnecessary=1,n.Deprecated=2})(Ce||(Ce={}));var be;(function(n){function t(i){var r=i;return r!=null&&a.string(r.href)}n.is=t})(be||(be={}));var Y;(function(n){function t(r,e,o,s,u,l){var f={range:r,message:e};return a.defined(o)&&(f.severity=o),a.defined(s)&&(f.code=s),a.defined(u)&&(f.source=u),a.defined(l)&&(f.relatedInformation=l),f}n.create=t;function i(r){var e,o=r;return a.defined(o)&&v.is(o.range)&&a.string(o.message)&&(a.number(o.severity)||a.undefined(o.severity))&&(a.integer(o.code)||a.string(o.code)||a.undefined(o.code))&&(a.undefined(o.codeDescription)||a.string((e=o.codeDescription)===null||e===void 0?void 0:e.href))&&(a.string(o.source)||a.undefined(o.source))&&(a.undefined(o.relatedInformation)||a.typedArray(o.relatedInformation,se.is))}n.is=i})(Y||(Y={}));var O;(function(n){function t(r,e){for(var o=[],s=2;s<arguments.length;s++)o[s-2]=arguments[s];var u={title:r,command:e};return a.defined(o)&&o.length>0&&(u.arguments=o),u}n.create=t;function i(r){var e=r;return a.defined(e)&&a.string(e.title)&&a.string(e.command)}n.is=i})(O||(O={}));var _;(function(n){function t(o,s){return{range:o,newText:s}}n.replace=t;function i(o,s){return{range:{start:o,end:o},newText:s}}n.insert=i;function r(o){return{range:o,newText:""}}n.del=r;function e(o){var s=o;return a.objectLiteral(s)&&a.string(s.newText)&&v.is(s.range)}n.is=e})(_||(_={}));var R;(function(n){function t(r,e,o){var s={label:r};return e!==void 0&&(s.needsConfirmation=e),o!==void 0&&(s.description=o),s}n.create=t;function i(r){var e=r;return e!==void 0&&a.objectLiteral(e)&&a.string(e.label)&&(a.boolean(e.needsConfirmation)||e.needsConfirmation===void 0)&&(a.string(e.description)||e.description===void 0)}n.is=i})(R||(R={}));var T;(function(n){function t(i){var r=i;return typeof r=="string"}n.is=t})(T||(T={}));var I;(function(n){function t(o,s,u){return{range:o,newText:s,annotationId:u}}n.replace=t;function i(o,s,u){return{range:{start:o,end:o},newText:s,annotationId:u}}n.insert=i;function r(o,s){return{range:o,newText:"",annotationId:s}}n.del=r;function e(o){var s=o;return _.is(s)&&(R.is(s.annotationId)||T.is(s.annotationId))}n.is=e})(I||(I={}));var Z;(function(n){function t(r,e){return{textDocument:r,edits:e}}n.create=t;function i(r){var e=r;return a.defined(e)&&ee.is(e.textDocument)&&Array.isArray(e.edits)}n.is=i})(Z||(Z={}));var N;(function(n){function t(r,e,o){var s={kind:"create",uri:r};return e!==void 0&&(e.overwrite!==void 0||e.ignoreIfExists!==void 0)&&(s.options=e),o!==void 0&&(s.annotationId=o),s}n.create=t;function i(r){var e=r;return e&&e.kind==="create"&&a.string(e.uri)&&(e.options===void 0||(e.options.overwrite===void 0||a.boolean(e.options.overwrite))&&(e.options.ignoreIfExists===void 0||a.boolean(e.options.ignoreIfExists)))&&(e.annotationId===void 0||T.is(e.annotationId))}n.is=i})(N||(N={}));var V;(function(n){function t(r,e,o,s){var u={kind:"rename",oldUri:r,newUri:e};return o!==void 0&&(o.overwrite!==void 0||o.ignoreIfExists!==void 0)&&(u.options=o),s!==void 0&&(u.annotationId=s),u}n.create=t;function i(r){var e=r;return e&&e.kind==="rename"&&a.string(e.oldUri)&&a.string(e.newUri)&&(e.options===void 0||(e.options.overwrite===void 0||a.boolean(e.options.overwrite))&&(e.options.ignoreIfExists===void 0||a.boolean(e.options.ignoreIfExists)))&&(e.annotationId===void 0||T.is(e.annotationId))}n.is=i})(V||(V={}));var z;(function(n){function t(r,e,o){var s={kind:"delete",uri:r};return e!==void 0&&(e.recursive!==void 0||e.ignoreIfNotExists!==void 0)&&(s.options=e),o!==void 0&&(s.annotationId=o),s}n.create=t;function i(r){var e=r;return e&&e.kind==="delete"&&a.string(e.uri)&&(e.options===void 0||(e.options.recursive===void 0||a.boolean(e.options.recursive))&&(e.options.ignoreIfNotExists===void 0||a.boolean(e.options.ignoreIfNotExists)))&&(e.annotationId===void 0||T.is(e.annotationId))}n.is=i})(z||(z={}));var ae;(function(n){function t(i){var r=i;return r&&(r.changes!==void 0||r.documentChanges!==void 0)&&(r.documentChanges===void 0||r.documentChanges.every(function(e){return a.string(e.kind)?N.is(e)||V.is(e)||z.is(e):Z.is(e)}))}n.is=t})(ae||(ae={}));var G=function(){function n(t,i){this.edits=t,this.changeAnnotations=i}return n.prototype.insert=function(t,i,r){var e,o;if(r===void 0?e=_.insert(t,i):T.is(r)?(o=r,e=I.insert(t,i,r)):(this.assertChangeAnnotations(this.changeAnnotations),o=this.changeAnnotations.manage(r),e=I.insert(t,i,o)),this.edits.push(e),o!==void 0)return o},n.prototype.replace=function(t,i,r){var e,o;if(r===void 0?e=_.replace(t,i):T.is(r)?(o=r,e=I.replace(t,i,r)):(this.assertChangeAnnotations(this.changeAnnotations),o=this.changeAnnotations.manage(r),e=I.replace(t,i,o)),this.edits.push(e),o!==void 0)return o},n.prototype.delete=function(t,i){var r,e;if(i===void 0?r=_.del(t):T.is(i)?(e=i,r=I.del(t,i)):(this.assertChangeAnnotations(this.changeAnnotations),e=this.changeAnnotations.manage(i),r=I.del(t,e)),this.edits.push(r),e!==void 0)return e},n.prototype.add=function(t){this.edits.push(t)},n.prototype.all=function(){return this.edits},n.prototype.clear=function(){this.edits.splice(0,this.edits.length)},n.prototype.assertChangeAnnotations=function(t){if(t===void 0)throw new Error("Text edit change is not configured to manage change annotations.")},n}(),we=function(){function n(t){this._annotations=t===void 0?Object.create(null):t,this._counter=0,this._size=0}return n.prototype.all=function(){return this._annotations},Object.defineProperty(n.prototype,"size",{get:function(){return this._size},enumerable:!1,configurable:!0}),n.prototype.manage=function(t,i){var r;if(T.is(t)?r=t:(r=this.nextId(),i=t),this._annotations[r]!==void 0)throw new Error("Id "+r+" is already in use.");if(i===void 0)throw new Error("No annotation provided for id "+r);return this._annotations[r]=i,this._size++,r},n.prototype.nextId=function(){return this._counter++,this._counter.toString()},n}(),Un=function(){function n(t){var i=this;this._textEditChanges=Object.create(null),t!==void 0?(this._workspaceEdit=t,t.documentChanges?(this._changeAnnotations=new we(t.changeAnnotations),t.changeAnnotations=this._changeAnnotations.all(),t.documentChanges.forEach(function(r){if(Z.is(r)){var e=new G(r.edits,i._changeAnnotations);i._textEditChanges[r.textDocument.uri]=e}})):t.changes&&Object.keys(t.changes).forEach(function(r){var e=new G(t.changes[r]);i._textEditChanges[r]=e})):this._workspaceEdit={}}return Object.defineProperty(n.prototype,"edit",{get:function(){return this.initDocumentChanges(),this._changeAnnotations!==void 0&&(this._changeAnnotations.size===0?this._workspaceEdit.changeAnnotations=void 0:this._workspaceEdit.changeAnnotations=this._changeAnnotations.all()),this._workspaceEdit},enumerable:!1,configurable:!0}),n.prototype.getTextEditChange=function(t){if(ee.is(t)){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var i={uri:t.uri,version:t.version},r=this._textEditChanges[i.uri];if(!r){var e=[],o={textDocument:i,edits:e};this._workspaceEdit.documentChanges.push(o),r=new G(e,this._changeAnnotations),this._textEditChanges[i.uri]=r}return r}else{if(this.initChanges(),this._workspaceEdit.changes===void 0)throw new Error("Workspace edit is not configured for normal text edit changes.");var r=this._textEditChanges[t];if(!r){var e=[];this._workspaceEdit.changes[t]=e,r=new G(e),this._textEditChanges[t]=r}return r}},n.prototype.initDocumentChanges=function(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._changeAnnotations=new we,this._workspaceEdit.documentChanges=[],this._workspaceEdit.changeAnnotations=this._changeAnnotations.all())},n.prototype.initChanges=function(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._workspaceEdit.changes=Object.create(null))},n.prototype.createFile=function(t,i,r){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var e;R.is(i)||T.is(i)?e=i:r=i;var o,s;if(e===void 0?o=N.create(t,r):(s=T.is(e)?e:this._changeAnnotations.manage(e),o=N.create(t,r,s)),this._workspaceEdit.documentChanges.push(o),s!==void 0)return s},n.prototype.renameFile=function(t,i,r,e){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var o;R.is(r)||T.is(r)?o=r:e=r;var s,u;if(o===void 0?s=V.create(t,i,e):(u=T.is(o)?o:this._changeAnnotations.manage(o),s=V.create(t,i,e,u)),this._workspaceEdit.documentChanges.push(s),u!==void 0)return u},n.prototype.deleteFile=function(t,i,r){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var e;R.is(i)||T.is(i)?e=i:r=i;var o,s;if(e===void 0?o=z.create(t,r):(s=T.is(e)?e:this._changeAnnotations.manage(e),o=z.create(t,r,s)),this._workspaceEdit.documentChanges.push(o),s!==void 0)return s},n}();var Ee;(function(n){function t(r){return{uri:r}}n.create=t;function i(r){var e=r;return a.defined(e)&&a.string(e.uri)}n.is=i})(Ee||(Ee={}));var Re;(function(n){function t(r,e){return{uri:r,version:e}}n.create=t;function i(r){var e=r;return a.defined(e)&&a.string(e.uri)&&a.integer(e.version)}n.is=i})(Re||(Re={}));var ee;(function(n){function t(r,e){return{uri:r,version:e}}n.create=t;function i(r){var e=r;return a.defined(e)&&a.string(e.uri)&&(e.version===null||a.integer(e.version))}n.is=i})(ee||(ee={}));var Pe;(function(n){function t(r,e,o,s){return{uri:r,languageId:e,version:o,text:s}}n.create=t;function i(r){var e=r;return a.defined(e)&&a.string(e.uri)&&a.string(e.languageId)&&a.integer(e.version)&&a.string(e.text)}n.is=i})(Pe||(Pe={}));var X;(function(n){n.PlainText="plaintext",n.Markdown="markdown"})(X||(X={}));(function(n){function t(i){var r=i;return r===n.PlainText||r===n.Markdown}n.is=t})(X||(X={}));var ue;(function(n){function t(i){var r=i;return a.objectLiteral(i)&&X.is(r.kind)&&a.string(r.value)}n.is=t})(ue||(ue={}));var p;(function(n){n.Text=1,n.Method=2,n.Function=3,n.Constructor=4,n.Field=5,n.Variable=6,n.Class=7,n.Interface=8,n.Module=9,n.Property=10,n.Unit=11,n.Value=12,n.Enum=13,n.Keyword=14,n.Snippet=15,n.Color=16,n.File=17,n.Reference=18,n.Folder=19,n.EnumMember=20,n.Constant=21,n.Struct=22,n.Event=23,n.Operator=24,n.TypeParameter=25})(p||(p={}));var ne;(function(n){n.PlainText=1,n.Snippet=2})(ne||(ne={}));var We;(function(n){n.Deprecated=1})(We||(We={}));var De;(function(n){function t(r,e,o){return{newText:r,insert:e,replace:o}}n.create=t;function i(r){var e=r;return e&&a.string(e.newText)&&v.is(e.insert)&&v.is(e.replace)}n.is=i})(De||(De={}));var Le;(function(n){n.asIs=1,n.adjustIndentation=2})(Le||(Le={}));var Se;(function(n){function t(i){return{label:i}}n.create=t})(Se||(Se={}));var Fe;(function(n){function t(i,r){return{items:i||[],isIncomplete:!!r}}n.create=t})(Fe||(Fe={}));var te;(function(n){function t(r){return r.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}n.fromPlainText=t;function i(r){var e=r;return a.string(e)||a.objectLiteral(e)&&a.string(e.language)&&a.string(e.value)}n.is=i})(te||(te={}));var Me;(function(n){function t(i){var r=i;return!!r&&a.objectLiteral(r)&&(ue.is(r.contents)||te.is(r.contents)||a.typedArray(r.contents,te.is))&&(i.range===void 0||v.is(i.range))}n.is=t})(Me||(Me={}));var Ae;(function(n){function t(i,r){return r?{label:i,documentation:r}:{label:i}}n.create=t})(Ae||(Ae={}));var He;(function(n){function t(i,r){for(var e=[],o=2;o<arguments.length;o++)e[o-2]=arguments[o];var s={label:i};return a.defined(r)&&(s.documentation=r),a.defined(e)?s.parameters=e:s.parameters=[],s}n.create=t})(He||(He={}));var W;(function(n){n.Text=1,n.Read=2,n.Write=3})(W||(W={}));var Ke;(function(n){function t(i,r){var e={range:i};return a.number(r)&&(e.kind=r),e}n.create=t})(Ke||(Ke={}));var m;(function(n){n.File=1,n.Module=2,n.Namespace=3,n.Package=4,n.Class=5,n.Method=6,n.Property=7,n.Field=8,n.Constructor=9,n.Enum=10,n.Interface=11,n.Function=12,n.Variable=13,n.Constant=14,n.String=15,n.Number=16,n.Boolean=17,n.Array=18,n.Object=19,n.Key=20,n.Null=21,n.EnumMember=22,n.Struct=23,n.Event=24,n.Operator=25,n.TypeParameter=26})(m||(m={}));var Ue;(function(n){n.Deprecated=1})(Ue||(Ue={}));var je;(function(n){function t(i,r,e,o,s){var u={name:i,kind:r,location:{uri:o,range:e}};return s&&(u.containerName=s),u}n.create=t})(je||(je={}));var Oe;(function(n){function t(r,e,o,s,u,l){var f={name:r,detail:e,kind:o,range:s,selectionRange:u};return l!==void 0&&(f.children=l),f}n.create=t;function i(r){var e=r;return e&&a.string(e.name)&&a.number(e.kind)&&v.is(e.range)&&v.is(e.selectionRange)&&(e.detail===void 0||a.string(e.detail))&&(e.deprecated===void 0||a.boolean(e.deprecated))&&(e.children===void 0||Array.isArray(e.children))&&(e.tags===void 0||Array.isArray(e.tags))}n.is=i})(Oe||(Oe={}));var Ne;(function(n){n.Empty="",n.QuickFix="quickfix",n.Refactor="refactor",n.RefactorExtract="refactor.extract",n.RefactorInline="refactor.inline",n.RefactorRewrite="refactor.rewrite",n.Source="source",n.SourceOrganizeImports="source.organizeImports",n.SourceFixAll="source.fixAll"})(Ne||(Ne={}));var Ve;(function(n){function t(r,e){var o={diagnostics:r};return e!=null&&(o.only=e),o}n.create=t;function i(r){var e=r;return a.defined(e)&&a.typedArray(e.diagnostics,Y.is)&&(e.only===void 0||a.typedArray(e.only,a.string))}n.is=i})(Ve||(Ve={}));var ze;(function(n){function t(r,e,o){var s={title:r},u=!0;return typeof e=="string"?(u=!1,s.kind=e):O.is(e)?s.command=e:s.edit=e,u&&o!==void 0&&(s.kind=o),s}n.create=t;function i(r){var e=r;return e&&a.string(e.title)&&(e.diagnostics===void 0||a.typedArray(e.diagnostics,Y.is))&&(e.kind===void 0||a.string(e.kind))&&(e.edit!==void 0||e.command!==void 0)&&(e.command===void 0||O.is(e.command))&&(e.isPreferred===void 0||a.boolean(e.isPreferred))&&(e.edit===void 0||ae.is(e.edit))}n.is=i})(ze||(ze={}));var Xe;(function(n){function t(r,e){var o={range:r};return a.defined(e)&&(o.data=e),o}n.create=t;function i(r){var e=r;return a.defined(e)&&v.is(e.range)&&(a.undefined(e.command)||O.is(e.command))}n.is=i})(Xe||(Xe={}));var Be;(function(n){function t(r,e){return{tabSize:r,insertSpaces:e}}n.create=t;function i(r){var e=r;return a.defined(e)&&a.uinteger(e.tabSize)&&a.boolean(e.insertSpaces)}n.is=i})(Be||(Be={}));var $e;(function(n){function t(r,e,o){return{range:r,target:e,data:o}}n.create=t;function i(r){var e=r;return a.defined(e)&&v.is(e.range)&&(a.undefined(e.target)||a.string(e.target))}n.is=i})($e||($e={}));var qe;(function(n){function t(r,e){return{range:r,parent:e}}n.create=t;function i(r){var e=r;return e!==void 0&&v.is(e.range)&&(e.parent===void 0||n.is(e.parent))}n.is=i})(qe||(qe={}));var Qe;(function(n){function t(o,s,u,l){return new mn(o,s,u,l)}n.create=t;function i(o){var s=o;return!!(a.defined(s)&&a.string(s.uri)&&(a.undefined(s.languageId)||a.string(s.languageId))&&a.uinteger(s.lineCount)&&a.func(s.getText)&&a.func(s.positionAt)&&a.func(s.offsetAt))}n.is=i;function r(o,s){for(var u=o.getText(),l=e(s,function(E,$){var pe=E.range.start.line-$.range.start.line;return pe===0?E.range.start.character-$.range.start.character:pe}),f=u.length,g=l.length-1;g>=0;g--){var h=l[g],k=o.offsetAt(h.range.start),c=o.offsetAt(h.range.end);if(c<=f)u=u.substring(0,k)+h.newText+u.substring(c,u.length);else throw new Error("Overlapping edit");f=k}return u}n.applyEdits=r;function e(o,s){if(o.length<=1)return o;var u=o.length/2|0,l=o.slice(0,u),f=o.slice(u);e(l,s),e(f,s);for(var g=0,h=0,k=0;g<l.length&&h<f.length;){var c=s(l[g],f[h]);c<=0?o[k++]=l[g++]:o[k++]=f[h++]}for(;g<l.length;)o[k++]=l[g++];for(;h<f.length;)o[k++]=f[h++];return o}})(Qe||(Qe={}));var mn=function(){function n(t,i,r,e){this._uri=t,this._languageId=i,this._version=r,this._content=e,this._lineOffsets=void 0}return Object.defineProperty(n.prototype,"uri",{get:function(){return this._uri},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"languageId",{get:function(){return this._languageId},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"version",{get:function(){return this._version},enumerable:!1,configurable:!0}),n.prototype.getText=function(t){if(t){var i=this.offsetAt(t.start),r=this.offsetAt(t.end);return this._content.substring(i,r)}return this._content},n.prototype.update=function(t,i){this._content=t.text,this._version=i,this._lineOffsets=void 0},n.prototype.getLineOffsets=function(){if(this._lineOffsets===void 0){for(var t=[],i=this._content,r=!0,e=0;e<i.length;e++){r&&(t.push(e),r=!1);var o=i.charAt(e);r=o==="\r"||o===`
+`,o==="\r"&&e+1<i.length&&i.charAt(e+1)===`
+`&&e++}r&&i.length>0&&t.push(i.length),this._lineOffsets=t}return this._lineOffsets},n.prototype.positionAt=function(t){t=Math.max(Math.min(t,this._content.length),0);var i=this.getLineOffsets(),r=0,e=i.length;if(e===0)return x.create(0,t);for(;r<e;){var o=Math.floor((r+e)/2);i[o]>t?e=o:r=o+1}var s=r-1;return x.create(s,t-i[s])},n.prototype.offsetAt=function(t){var i=this.getLineOffsets();if(t.line>=i.length)return this._content.length;if(t.line<0)return 0;var r=i[t.line],e=t.line+1<i.length?i[t.line+1]:this._content.length;return Math.max(Math.min(r+t.character,e),r)},Object.defineProperty(n.prototype,"lineCount",{get:function(){return this.getLineOffsets().length},enumerable:!1,configurable:!0}),n}(),a;(function(n){var t=Object.prototype.toString;function i(c){return typeof c<"u"}n.defined=i;function r(c){return typeof c>"u"}n.undefined=r;function e(c){return c===!0||c===!1}n.boolean=e;function o(c){return t.call(c)==="[object String]"}n.string=o;function s(c){return t.call(c)==="[object Number]"}n.number=s;function u(c,E,$){return t.call(c)==="[object Number]"&&E<=c&&c<=$}n.numberRange=u;function l(c){return t.call(c)==="[object Number]"&&-2147483648<=c&&c<=2147483647}n.integer=l;function f(c){return t.call(c)==="[object Number]"&&0<=c&&c<=2147483647}n.uinteger=f;function g(c){return t.call(c)==="[object Function]"}n.func=g;function h(c){return c!==null&&typeof c=="object"}n.objectLiteral=h;function k(c,E){return Array.isArray(c)&&c.every(E)}n.typedArray=k})(a||(a={}));var de=class{constructor(t,i,r){this._languageId=t;this._worker=i;this._disposables=[];this._listener=Object.create(null);let e=s=>{let u=s.getLanguageId();if(u!==this._languageId)return;let l;this._listener[s.uri.toString()]=s.onDidChangeContent(()=>{window.clearTimeout(l),l=window.setTimeout(()=>this._doValidate(s.uri,u),500)}),this._doValidate(s.uri,u)},o=s=>{d.editor.setModelMarkers(s,this._languageId,[]);let u=s.uri.toString(),l=this._listener[u];l&&(l.dispose(),delete this._listener[u])};this._disposables.push(d.editor.onDidCreateModel(e)),this._disposables.push(d.editor.onWillDisposeModel(o)),this._disposables.push(d.editor.onDidChangeModelLanguage(s=>{o(s.model),e(s.model)})),this._disposables.push(r(s=>{d.editor.getModels().forEach(u=>{u.getLanguageId()===this._languageId&&(o(u),e(u))})})),this._disposables.push({dispose:()=>{d.editor.getModels().forEach(o);for(let s in this._listener)this._listener[s].dispose()}}),d.editor.getModels().forEach(e)}dispose(){this._disposables.forEach(t=>t&&t.dispose()),this._disposables.length=0}_doValidate(t,i){this._worker(t).then(r=>r.doValidation(t.toString())).then(r=>{let e=r.map(s=>Tn(t,s)),o=d.editor.getModel(t);o&&o.getLanguageId()===i&&d.editor.setModelMarkers(o,i,e)}).then(void 0,r=>{console.error(r)})}};function vn(n){switch(n){case w.Error:return d.MarkerSeverity.Error;case w.Warning:return d.MarkerSeverity.Warning;case w.Information:return d.MarkerSeverity.Info;case w.Hint:return d.MarkerSeverity.Hint;default:return d.MarkerSeverity.Info}}function Tn(n,t){let i=typeof t.code=="number"?String(t.code):t.code;return{severity:vn(t.severity),startLineNumber:t.range.start.line+1,startColumn:t.range.start.character+1,endLineNumber:t.range.end.line+1,endColumn:t.range.end.character+1,message:t.message,code:i,source:t.source}}var B=class{constructor(t,i){this._worker=t;this._triggerCharacters=i}get triggerCharacters(){return this._triggerCharacters}provideCompletionItems(t,i,r,e){let o=t.uri;return this._worker(o).then(s=>s.doComplete(o.toString(),C(i))).then(s=>{if(!s)return;let u=t.getWordUntilPosition(i),l=new d.Range(i.lineNumber,u.startColumn,i.lineNumber,u.endColumn),f=s.items.map(g=>{let h={label:g.label,insertText:g.insertText||g.label,sortText:g.sortText,filterText:g.filterText,documentation:g.documentation,detail:g.detail,command:kn(g.command),range:l,kind:xn(g.kind)};return g.textEdit&&(yn(g.textEdit)?h.range={insert:y(g.textEdit.insert),replace:y(g.textEdit.replace)}:h.range=y(g.textEdit.range),h.insertText=g.textEdit.newText),g.additionalTextEdits&&(h.additionalTextEdits=g.additionalTextEdits.map(D)),g.insertTextFormat===ne.Snippet&&(h.insertTextRules=d.languages.CompletionItemInsertTextRule.InsertAsSnippet),h});return{isIncomplete:s.isIncomplete,suggestions:f}})}};function C(n){if(n)return{character:n.column-1,line:n.lineNumber-1}}function fe(n){if(n)return{start:{line:n.startLineNumber-1,character:n.startColumn-1},end:{line:n.endLineNumber-1,character:n.endColumn-1}}}function y(n){if(n)return new d.Range(n.start.line+1,n.start.character+1,n.end.line+1,n.end.character+1)}function yn(n){return typeof n.insert<"u"&&typeof n.replace<"u"}function xn(n){let t=d.languages.CompletionItemKind;switch(n){case p.Text:return t.Text;case p.Method:return t.Method;case p.Function:return t.Function;case p.Constructor:return t.Constructor;case p.Field:return t.Field;case p.Variable:return t.Variable;case p.Class:return t.Class;case p.Interface:return t.Interface;case p.Module:return t.Module;case p.Property:return t.Property;case p.Unit:return t.Unit;case p.Value:return t.Value;case p.Enum:return t.Enum;case p.Keyword:return t.Keyword;case p.Snippet:return t.Snippet;case p.Color:return t.Color;case p.File:return t.File;case p.Reference:return t.Reference}return t.Property}function D(n){if(n)return{range:y(n.range),text:n.newText}}function kn(n){return n&&n.command==="editor.action.triggerSuggest"?{id:n.command,title:n.title,arguments:n.arguments}:void 0}var L=class{constructor(t){this._worker=t}provideHover(t,i,r){let e=t.uri;return this._worker(e).then(o=>o.doHover(e.toString(),C(i))).then(o=>{if(o)return{range:y(o.range),contents:_n(o.contents)}})}};function In(n){return n&&typeof n=="object"&&typeof n.kind=="string"}function Ge(n){return typeof n=="string"?{value:n}:In(n)?n.kind==="plaintext"?{value:n.value.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}:{value:n.value}:{value:"```"+n.language+`
+`+n.value+"\n```\n"}}function _n(n){if(n)return Array.isArray(n)?n.map(Ge):[Ge(n)]}var S=class{constructor(t){this._worker=t}provideDocumentHighlights(t,i,r){let e=t.uri;return this._worker(e).then(o=>o.findDocumentHighlights(e.toString(),C(i))).then(o=>{if(o)return o.map(s=>({range:y(s.range),kind:Cn(s.kind)}))})}};function Cn(n){switch(n){case W.Read:return d.languages.DocumentHighlightKind.Read;case W.Write:return d.languages.DocumentHighlightKind.Write;case W.Text:return d.languages.DocumentHighlightKind.Text}return d.languages.DocumentHighlightKind.Text}var ce=class{constructor(t){this._worker=t}provideDefinition(t,i,r){let e=t.uri;return this._worker(e).then(o=>o.findDefinition(e.toString(),C(i))).then(o=>{if(o)return[Je(o)]})}};function Je(n){return{uri:d.Uri.parse(n.uri),range:y(n.range)}}var le=class{constructor(t){this._worker=t}provideReferences(t,i,r,e){let o=t.uri;return this._worker(o).then(s=>s.findReferences(o.toString(),C(i))).then(s=>{if(s)return s.map(Je)})}},F=class{constructor(t){this._worker=t}provideRenameEdits(t,i,r,e){let o=t.uri;return this._worker(o).then(s=>s.doRename(o.toString(),C(i),r)).then(s=>bn(s))}};function bn(n){if(!n||!n.changes)return;let t=[];for(let i in n.changes){let r=d.Uri.parse(i);for(let e of n.changes[i])t.push({resource:r,versionId:void 0,textEdit:{range:y(e.range),text:e.newText}})}return{edits:t}}var M=class{constructor(t){this._worker=t}provideDocumentSymbols(t,i){let r=t.uri;return this._worker(r).then(e=>e.findDocumentSymbols(r.toString())).then(e=>{if(e)return e.map(o=>wn(o)?Ye(o):{name:o.name,detail:"",containerName:o.containerName,kind:Ze(o.kind),range:y(o.location.range),selectionRange:y(o.location.range),tags:[]})})}};function wn(n){return"children"in n}function Ye(n){return{name:n.name,detail:n.detail??"",kind:Ze(n.kind),range:y(n.range),selectionRange:y(n.selectionRange),tags:n.tags??[],children:(n.children??[]).map(t=>Ye(t))}}function Ze(n){let t=d.languages.SymbolKind;switch(n){case m.File:return t.File;case m.Module:return t.Module;case m.Namespace:return t.Namespace;case m.Package:return t.Package;case m.Class:return t.Class;case m.Method:return t.Method;case m.Property:return t.Property;case m.Field:return t.Field;case m.Constructor:return t.Constructor;case m.Enum:return t.Enum;case m.Interface:return t.Interface;case m.Function:return t.Function;case m.Variable:return t.Variable;case m.Constant:return t.Constant;case m.String:return t.String;case m.Number:return t.Number;case m.Boolean:return t.Boolean;case m.Array:return t.Array}return t.Function}var A=class{constructor(t){this._worker=t}provideLinks(t,i){let r=t.uri;return this._worker(r).then(e=>e.findDocumentLinks(r.toString())).then(e=>{if(e)return{links:e.map(o=>({range:y(o.range),url:o.target}))}})}},H=class{constructor(t){this._worker=t}provideDocumentFormattingEdits(t,i,r){let e=t.uri;return this._worker(e).then(o=>o.format(e.toString(),null,en(i)).then(s=>{if(!(!s||s.length===0))return s.map(D)}))}},K=class{constructor(t){this._worker=t;this.canFormatMultipleRanges=!1}provideDocumentRangeFormattingEdits(t,i,r,e){let o=t.uri;return this._worker(o).then(s=>s.format(o.toString(),fe(i),en(r)).then(u=>{if(!(!u||u.length===0))return u.map(D)}))}};function en(n){return{tabSize:n.tabSize,insertSpaces:n.insertSpaces}}var ge=class{constructor(t){this._worker=t}provideDocumentColors(t,i){let r=t.uri;return this._worker(r).then(e=>e.findDocumentColors(r.toString())).then(e=>{if(e)return e.map(o=>({color:o.color,range:y(o.range)}))})}provideColorPresentations(t,i,r){let e=t.uri;return this._worker(e).then(o=>o.getColorPresentations(e.toString(),i.color,fe(i.range))).then(o=>{if(o)return o.map(s=>{let u={label:s.label};return s.textEdit&&(u.textEdit=D(s.textEdit)),s.additionalTextEdits&&(u.additionalTextEdits=s.additionalTextEdits.map(D)),u})})}},U=class{constructor(t){this._worker=t}provideFoldingRanges(t,i,r){let e=t.uri;return this._worker(e).then(o=>o.getFoldingRanges(e.toString(),i)).then(o=>{if(o)return o.map(s=>{let u={start:s.startLine+1,end:s.endLine+1};return typeof s.kind<"u"&&(u.kind=En(s.kind)),u})})}};function En(n){switch(n){case P.Comment:return d.languages.FoldingRangeKind.Comment;case P.Imports:return d.languages.FoldingRangeKind.Imports;case P.Region:return d.languages.FoldingRangeKind.Region}}var j=class{constructor(t){this._worker=t}provideSelectionRanges(t,i,r){let e=t.uri;return this._worker(e).then(o=>o.getSelectionRanges(e.toString(),i.map(C))).then(o=>{if(o)return o.map(s=>{let u=[];for(;s;)u.push({range:y(s.range)}),s=s.parent;return u})})}};var re=class extends B{constructor(t){super(t,[".",":","<",'"',"=","/"])}};function Pn(n){let t=new b(n),i=(...e)=>t.getLanguageServiceWorker(...e),r=n.languageId;d.languages.registerCompletionItemProvider(r,new re(i)),d.languages.registerHoverProvider(r,new L(i)),d.languages.registerDocumentHighlightProvider(r,new S(i)),d.languages.registerLinkProvider(r,new A(i)),d.languages.registerFoldingRangeProvider(r,new U(i)),d.languages.registerDocumentSymbolProvider(r,new M(i)),d.languages.registerSelectionRangeProvider(r,new j(i)),d.languages.registerRenameProvider(r,new F(i)),r==="html"&&(d.languages.registerDocumentFormattingEditProvider(r,new H(i)),d.languages.registerDocumentRangeFormattingEditProvider(r,new K(i)))}function Wn(n){let t=[],i=[],r=new b(n);t.push(r);let e=(...s)=>r.getLanguageServiceWorker(...s);function o(){let{languageId:s,modeConfiguration:u}=n;tn(i),u.completionItems&&i.push(d.languages.registerCompletionItemProvider(s,new re(e))),u.hovers&&i.push(d.languages.registerHoverProvider(s,new L(e))),u.documentHighlights&&i.push(d.languages.registerDocumentHighlightProvider(s,new S(e))),u.links&&i.push(d.languages.registerLinkProvider(s,new A(e))),u.documentSymbols&&i.push(d.languages.registerDocumentSymbolProvider(s,new M(e))),u.rename&&i.push(d.languages.registerRenameProvider(s,new F(e))),u.foldingRanges&&i.push(d.languages.registerFoldingRangeProvider(s,new U(e))),u.selectionRanges&&i.push(d.languages.registerSelectionRangeProvider(s,new j(e))),u.documentFormattingEdits&&i.push(d.languages.registerDocumentFormattingEditProvider(s,new H(e))),u.documentRangeFormattingEdits&&i.push(d.languages.registerDocumentRangeFormattingEditProvider(s,new K(e)))}return o(),t.push(nn(i)),nn(t)}function nn(n){return{dispose:()=>tn(n)}}function tn(n){for(;n.length;)n.pop().dispose()}return gn(Dn);})();
+return moduleExports;
+});
diff --git a/public/vs/language/html/htmlWorker.js b/public/vs/language/html/htmlWorker.js
new file mode 100644
index 0000000..0f3f0d2
--- /dev/null
+++ b/public/vs/language/html/htmlWorker.js
@@ -0,0 +1,452 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/language/html/htmlWorker", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var Xe=Object.defineProperty;var xn=Object.getOwnPropertyDescriptor;var Dn=Object.getOwnPropertyNames;var En=Object.prototype.hasOwnProperty;var Cn=(t,i)=>{for(var o in i)Xe(t,o,{get:i[o],enumerable:!0})},Ln=(t,i,o,n)=>{if(i&&typeof i=="object"||typeof i=="function")for(let e of Dn(i))!En.call(t,e)&&e!==o&&Xe(t,e,{get:()=>i[e],enumerable:!(n=xn(i,e))||n.enumerable});return t};var Mn=t=>Ln(Xe({},"__esModule",{value:!0}),t);var Ri={};Cn(Ri,{HTMLWorker:()=>Je,create:()=>Mi});function Rn(t,i){let o;return i.length===0?o=t:o=t.replace(/\{(\d+)\}/g,(n,e)=>{let a=e[0];return typeof i[a]<"u"?i[a]:n}),o}function zn(t,i,...o){return Rn(i,o)}function ge(t){return zn}var yt;(function(t){t.MIN_VALUE=-2147483648,t.MAX_VALUE=2147483647})(yt||(yt={}));var Ie;(function(t){t.MIN_VALUE=0,t.MAX_VALUE=2147483647})(Ie||(Ie={}));var X;(function(t){function i(n,e){return n===Number.MAX_VALUE&&(n=Ie.MAX_VALUE),e===Number.MAX_VALUE&&(e=Ie.MAX_VALUE),{line:n,character:e}}t.create=i;function o(n){var e=n;return _.objectLiteral(e)&&_.uinteger(e.line)&&_.uinteger(e.character)}t.is=o})(X||(X={}));var P;(function(t){function i(n,e,a,c){if(_.uinteger(n)&&_.uinteger(e)&&_.uinteger(a)&&_.uinteger(c))return{start:X.create(n,e),end:X.create(a,c)};if(X.is(n)&&X.is(e))return{start:n,end:e};throw new Error("Range#create called with invalid arguments["+n+", "+e+", "+a+", "+c+"]")}t.create=i;function o(n){var e=n;return _.objectLiteral(e)&&X.is(e.start)&&X.is(e.end)}t.is=o})(P||(P={}));var ve;(function(t){function i(n,e){return{uri:n,range:e}}t.create=i;function o(n){var e=n;return _.defined(e)&&P.is(e.range)&&(_.string(e.uri)||_.undefined(e.uri))}t.is=o})(ve||(ve={}));var Tt;(function(t){function i(n,e,a,c){return{targetUri:n,targetRange:e,targetSelectionRange:a,originSelectionRange:c}}t.create=i;function o(n){var e=n;return _.defined(e)&&P.is(e.targetRange)&&_.string(e.targetUri)&&(P.is(e.targetSelectionRange)||_.undefined(e.targetSelectionRange))&&(P.is(e.originSelectionRange)||_.undefined(e.originSelectionRange))}t.is=o})(Tt||(Tt={}));var Ue;(function(t){function i(n,e,a,c){return{red:n,green:e,blue:a,alpha:c}}t.create=i;function o(n){var e=n;return _.numberRange(e.red,0,1)&&_.numberRange(e.green,0,1)&&_.numberRange(e.blue,0,1)&&_.numberRange(e.alpha,0,1)}t.is=o})(Ue||(Ue={}));var $e;(function(t){function i(n,e){return{range:n,color:e}}t.create=i;function o(n){var e=n;return P.is(e.range)&&Ue.is(e.color)}t.is=o})($e||($e={}));var Qe;(function(t){function i(n,e,a){return{label:n,textEdit:e,additionalTextEdits:a}}t.create=i;function o(n){var e=n;return _.string(e.label)&&(_.undefined(e.textEdit)||Y.is(e))&&(_.undefined(e.additionalTextEdits)||_.typedArray(e.additionalTextEdits,Y.is))}t.is=o})(Qe||(Qe={}));var we;(function(t){t.Comment="comment",t.Imports="imports",t.Region="region"})(we||(we={}));var Ze;(function(t){function i(n,e,a,c,l){var r={startLine:n,endLine:e};return _.defined(a)&&(r.startCharacter=a),_.defined(c)&&(r.endCharacter=c),_.defined(l)&&(r.kind=l),r}t.create=i;function o(n){var e=n;return _.uinteger(e.startLine)&&_.uinteger(e.startLine)&&(_.undefined(e.startCharacter)||_.uinteger(e.startCharacter))&&(_.undefined(e.endCharacter)||_.uinteger(e.endCharacter))&&(_.undefined(e.kind)||_.string(e.kind))}t.is=o})(Ze||(Ze={}));var Ke;(function(t){function i(n,e){return{location:n,message:e}}t.create=i;function o(n){var e=n;return _.defined(e)&&ve.is(e.location)&&_.string(e.message)}t.is=o})(Ke||(Ke={}));var kt;(function(t){t.Error=1,t.Warning=2,t.Information=3,t.Hint=4})(kt||(kt={}));var St;(function(t){t.Unnecessary=1,t.Deprecated=2})(St||(St={}));var At;(function(t){function i(o){var n=o;return n!=null&&_.string(n.href)}t.is=i})(At||(At={}));var Ae;(function(t){function i(n,e,a,c,l,r){var s={range:n,message:e};return _.defined(a)&&(s.severity=a),_.defined(c)&&(s.code=c),_.defined(l)&&(s.source=l),_.defined(r)&&(s.relatedInformation=r),s}t.create=i;function o(n){var e,a=n;return _.defined(a)&&P.is(a.range)&&_.string(a.message)&&(_.number(a.severity)||_.undefined(a.severity))&&(_.integer(a.code)||_.string(a.code)||_.undefined(a.code))&&(_.undefined(a.codeDescription)||_.string((e=a.codeDescription)===null||e===void 0?void 0:e.href))&&(_.string(a.source)||_.undefined(a.source))&&(_.undefined(a.relatedInformation)||_.typedArray(a.relatedInformation,Ke.is))}t.is=o})(Ae||(Ae={}));var _e;(function(t){function i(n,e){for(var a=[],c=2;c<arguments.length;c++)a[c-2]=arguments[c];var l={title:n,command:e};return _.defined(a)&&a.length>0&&(l.arguments=a),l}t.create=i;function o(n){var e=n;return _.defined(e)&&_.string(e.title)&&_.string(e.command)}t.is=o})(_e||(_e={}));var Y;(function(t){function i(a,c){return{range:a,newText:c}}t.replace=i;function o(a,c){return{range:{start:a,end:a},newText:c}}t.insert=o;function n(a){return{range:a,newText:""}}t.del=n;function e(a){var c=a;return _.objectLiteral(c)&&_.string(c.newText)&&P.is(c.range)}t.is=e})(Y||(Y={}));var be;(function(t){function i(n,e,a){var c={label:n};return e!==void 0&&(c.needsConfirmation=e),a!==void 0&&(c.description=a),c}t.create=i;function o(n){var e=n;return e!==void 0&&_.objectLiteral(e)&&_.string(e.label)&&(_.boolean(e.needsConfirmation)||e.needsConfirmation===void 0)&&(_.string(e.description)||e.description===void 0)}t.is=o})(be||(be={}));var Z;(function(t){function i(o){var n=o;return typeof n=="string"}t.is=i})(Z||(Z={}));var ce;(function(t){function i(a,c,l){return{range:a,newText:c,annotationId:l}}t.replace=i;function o(a,c,l){return{range:{start:a,end:a},newText:c,annotationId:l}}t.insert=o;function n(a,c){return{range:a,newText:"",annotationId:c}}t.del=n;function e(a){var c=a;return Y.is(c)&&(be.is(c.annotationId)||Z.is(c.annotationId))}t.is=e})(ce||(ce={}));var We;(function(t){function i(n,e){return{textDocument:n,edits:e}}t.create=i;function o(n){var e=n;return _.defined(e)&&Fe.is(e.textDocument)&&Array.isArray(e.edits)}t.is=o})(We||(We={}));var xe;(function(t){function i(n,e,a){var c={kind:"create",uri:n};return e!==void 0&&(e.overwrite!==void 0||e.ignoreIfExists!==void 0)&&(c.options=e),a!==void 0&&(c.annotationId=a),c}t.create=i;function o(n){var e=n;return e&&e.kind==="create"&&_.string(e.uri)&&(e.options===void 0||(e.options.overwrite===void 0||_.boolean(e.options.overwrite))&&(e.options.ignoreIfExists===void 0||_.boolean(e.options.ignoreIfExists)))&&(e.annotationId===void 0||Z.is(e.annotationId))}t.is=o})(xe||(xe={}));var De;(function(t){function i(n,e,a,c){var l={kind:"rename",oldUri:n,newUri:e};return a!==void 0&&(a.overwrite!==void 0||a.ignoreIfExists!==void 0)&&(l.options=a),c!==void 0&&(l.annotationId=c),l}t.create=i;function o(n){var e=n;return e&&e.kind==="rename"&&_.string(e.oldUri)&&_.string(e.newUri)&&(e.options===void 0||(e.options.overwrite===void 0||_.boolean(e.options.overwrite))&&(e.options.ignoreIfExists===void 0||_.boolean(e.options.ignoreIfExists)))&&(e.annotationId===void 0||Z.is(e.annotationId))}t.is=o})(De||(De={}));var Ee;(function(t){function i(n,e,a){var c={kind:"delete",uri:n};return e!==void 0&&(e.recursive!==void 0||e.ignoreIfNotExists!==void 0)&&(c.options=e),a!==void 0&&(c.annotationId=a),c}t.create=i;function o(n){var e=n;return e&&e.kind==="delete"&&_.string(e.uri)&&(e.options===void 0||(e.options.recursive===void 0||_.boolean(e.options.recursive))&&(e.options.ignoreIfNotExists===void 0||_.boolean(e.options.ignoreIfNotExists)))&&(e.annotationId===void 0||Z.is(e.annotationId))}t.is=o})(Ee||(Ee={}));var Be;(function(t){function i(o){var n=o;return n&&(n.changes!==void 0||n.documentChanges!==void 0)&&(n.documentChanges===void 0||n.documentChanges.every(function(e){return _.string(e.kind)?xe.is(e)||De.is(e)||Ee.is(e):We.is(e)}))}t.is=i})(Be||(Be={}));var He=function(){function t(i,o){this.edits=i,this.changeAnnotations=o}return t.prototype.insert=function(i,o,n){var e,a;if(n===void 0?e=Y.insert(i,o):Z.is(n)?(a=n,e=ce.insert(i,o,n)):(this.assertChangeAnnotations(this.changeAnnotations),a=this.changeAnnotations.manage(n),e=ce.insert(i,o,a)),this.edits.push(e),a!==void 0)return a},t.prototype.replace=function(i,o,n){var e,a;if(n===void 0?e=Y.replace(i,o):Z.is(n)?(a=n,e=ce.replace(i,o,n)):(this.assertChangeAnnotations(this.changeAnnotations),a=this.changeAnnotations.manage(n),e=ce.replace(i,o,a)),this.edits.push(e),a!==void 0)return a},t.prototype.delete=function(i,o){var n,e;if(o===void 0?n=Y.del(i):Z.is(o)?(e=o,n=ce.del(i,o)):(this.assertChangeAnnotations(this.changeAnnotations),e=this.changeAnnotations.manage(o),n=ce.del(i,e)),this.edits.push(n),e!==void 0)return e},t.prototype.add=function(i){this.edits.push(i)},t.prototype.all=function(){return this.edits},t.prototype.clear=function(){this.edits.splice(0,this.edits.length)},t.prototype.assertChangeAnnotations=function(i){if(i===void 0)throw new Error("Text edit change is not configured to manage change annotations.")},t}(),xt=function(){function t(i){this._annotations=i===void 0?Object.create(null):i,this._counter=0,this._size=0}return t.prototype.all=function(){return this._annotations},Object.defineProperty(t.prototype,"size",{get:function(){return this._size},enumerable:!1,configurable:!0}),t.prototype.manage=function(i,o){var n;if(Z.is(i)?n=i:(n=this.nextId(),o=i),this._annotations[n]!==void 0)throw new Error("Id "+n+" is already in use.");if(o===void 0)throw new Error("No annotation provided for id "+n);return this._annotations[n]=o,this._size++,n},t.prototype.nextId=function(){return this._counter++,this._counter.toString()},t}(),Hi=function(){function t(i){var o=this;this._textEditChanges=Object.create(null),i!==void 0?(this._workspaceEdit=i,i.documentChanges?(this._changeAnnotations=new xt(i.changeAnnotations),i.changeAnnotations=this._changeAnnotations.all(),i.documentChanges.forEach(function(n){if(We.is(n)){var e=new He(n.edits,o._changeAnnotations);o._textEditChanges[n.textDocument.uri]=e}})):i.changes&&Object.keys(i.changes).forEach(function(n){var e=new He(i.changes[n]);o._textEditChanges[n]=e})):this._workspaceEdit={}}return Object.defineProperty(t.prototype,"edit",{get:function(){return this.initDocumentChanges(),this._changeAnnotations!==void 0&&(this._changeAnnotations.size===0?this._workspaceEdit.changeAnnotations=void 0:this._workspaceEdit.changeAnnotations=this._changeAnnotations.all()),this._workspaceEdit},enumerable:!1,configurable:!0}),t.prototype.getTextEditChange=function(i){if(Fe.is(i)){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var o={uri:i.uri,version:i.version},n=this._textEditChanges[o.uri];if(!n){var e=[],a={textDocument:o,edits:e};this._workspaceEdit.documentChanges.push(a),n=new He(e,this._changeAnnotations),this._textEditChanges[o.uri]=n}return n}else{if(this.initChanges(),this._workspaceEdit.changes===void 0)throw new Error("Workspace edit is not configured for normal text edit changes.");var n=this._textEditChanges[i];if(!n){var e=[];this._workspaceEdit.changes[i]=e,n=new He(e),this._textEditChanges[i]=n}return n}},t.prototype.initDocumentChanges=function(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._changeAnnotations=new xt,this._workspaceEdit.documentChanges=[],this._workspaceEdit.changeAnnotations=this._changeAnnotations.all())},t.prototype.initChanges=function(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._workspaceEdit.changes=Object.create(null))},t.prototype.createFile=function(i,o,n){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var e;be.is(o)||Z.is(o)?e=o:n=o;var a,c;if(e===void 0?a=xe.create(i,n):(c=Z.is(e)?e:this._changeAnnotations.manage(e),a=xe.create(i,n,c)),this._workspaceEdit.documentChanges.push(a),c!==void 0)return c},t.prototype.renameFile=function(i,o,n,e){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var a;be.is(n)||Z.is(n)?a=n:e=n;var c,l;if(a===void 0?c=De.create(i,o,e):(l=Z.is(a)?a:this._changeAnnotations.manage(a),c=De.create(i,o,e,l)),this._workspaceEdit.documentChanges.push(c),l!==void 0)return l},t.prototype.deleteFile=function(i,o,n){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var e;be.is(o)||Z.is(o)?e=o:n=o;var a,c;if(e===void 0?a=Ee.create(i,n):(c=Z.is(e)?e:this._changeAnnotations.manage(e),a=Ee.create(i,n,c)),this._workspaceEdit.documentChanges.push(a),c!==void 0)return c},t}();var Dt;(function(t){function i(n){return{uri:n}}t.create=i;function o(n){var e=n;return _.defined(e)&&_.string(e.uri)}t.is=o})(Dt||(Dt={}));var Et;(function(t){function i(n,e){return{uri:n,version:e}}t.create=i;function o(n){var e=n;return _.defined(e)&&_.string(e.uri)&&_.integer(e.version)}t.is=o})(Et||(Et={}));var Fe;(function(t){function i(n,e){return{uri:n,version:e}}t.create=i;function o(n){var e=n;return _.defined(e)&&_.string(e.uri)&&(e.version===null||_.integer(e.version))}t.is=o})(Fe||(Fe={}));var Ct;(function(t){function i(n,e,a,c){return{uri:n,languageId:e,version:a,text:c}}t.create=i;function o(n){var e=n;return _.defined(e)&&_.string(e.uri)&&_.string(e.languageId)&&_.integer(e.version)&&_.string(e.text)}t.is=o})(Ct||(Ct={}));var ee;(function(t){t.PlainText="plaintext",t.Markdown="markdown"})(ee||(ee={}));(function(t){function i(o){var n=o;return n===t.PlainText||n===t.Markdown}t.is=i})(ee||(ee={}));var Pe;(function(t){function i(o){var n=o;return _.objectLiteral(o)&&ee.is(n.kind)&&_.string(n.value)}t.is=i})(Pe||(Pe={}));var Q;(function(t){t.Text=1,t.Method=2,t.Function=3,t.Constructor=4,t.Field=5,t.Variable=6,t.Class=7,t.Interface=8,t.Module=9,t.Property=10,t.Unit=11,t.Value=12,t.Enum=13,t.Keyword=14,t.Snippet=15,t.Color=16,t.File=17,t.Reference=18,t.Folder=19,t.EnumMember=20,t.Constant=21,t.Struct=22,t.Event=23,t.Operator=24,t.TypeParameter=25})(Q||(Q={}));var ne;(function(t){t.PlainText=1,t.Snippet=2})(ne||(ne={}));var et;(function(t){t.Deprecated=1})(et||(et={}));var tt;(function(t){function i(n,e,a){return{newText:n,insert:e,replace:a}}t.create=i;function o(n){var e=n;return e&&_.string(e.newText)&&P.is(e.insert)&&P.is(e.replace)}t.is=o})(tt||(tt={}));var nt;(function(t){t.asIs=1,t.adjustIndentation=2})(nt||(nt={}));var it;(function(t){function i(o){return{label:o}}t.create=i})(it||(it={}));var rt;(function(t){function i(o,n){return{items:o||[],isIncomplete:!!n}}t.create=i})(rt||(rt={}));var Ce;(function(t){function i(n){return n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}t.fromPlainText=i;function o(n){var e=n;return _.string(e)||_.objectLiteral(e)&&_.string(e.language)&&_.string(e.value)}t.is=o})(Ce||(Ce={}));var at;(function(t){function i(o){var n=o;return!!n&&_.objectLiteral(n)&&(Pe.is(n.contents)||Ce.is(n.contents)||_.typedArray(n.contents,Ce.is))&&(o.range===void 0||P.is(o.range))}t.is=i})(at||(at={}));var Lt;(function(t){function i(o,n){return n?{label:o,documentation:n}:{label:o}}t.create=i})(Lt||(Lt={}));var Mt;(function(t){function i(o,n){for(var e=[],a=2;a<arguments.length;a++)e[a-2]=arguments[a];var c={label:o};return _.defined(n)&&(c.documentation=n),_.defined(e)?c.parameters=e:c.parameters=[],c}t.create=i})(Mt||(Mt={}));var ye;(function(t){t.Text=1,t.Read=2,t.Write=3})(ye||(ye={}));var ot;(function(t){function i(o,n){var e={range:o};return _.number(n)&&(e.kind=n),e}t.create=i})(ot||(ot={}));var Le;(function(t){t.File=1,t.Module=2,t.Namespace=3,t.Package=4,t.Class=5,t.Method=6,t.Property=7,t.Field=8,t.Constructor=9,t.Enum=10,t.Interface=11,t.Function=12,t.Variable=13,t.Constant=14,t.String=15,t.Number=16,t.Boolean=17,t.Array=18,t.Object=19,t.Key=20,t.Null=21,t.EnumMember=22,t.Struct=23,t.Event=24,t.Operator=25,t.TypeParameter=26})(Le||(Le={}));var Rt;(function(t){t.Deprecated=1})(Rt||(Rt={}));var st;(function(t){function i(o,n,e,a,c){var l={name:o,kind:n,location:{uri:a,range:e}};return c&&(l.containerName=c),l}t.create=i})(st||(st={}));var zt;(function(t){function i(n,e,a,c,l,r){var s={name:n,detail:e,kind:a,range:c,selectionRange:l};return r!==void 0&&(s.children=r),s}t.create=i;function o(n){var e=n;return e&&_.string(e.name)&&_.number(e.kind)&&P.is(e.range)&&P.is(e.selectionRange)&&(e.detail===void 0||_.string(e.detail))&&(e.deprecated===void 0||_.boolean(e.deprecated))&&(e.children===void 0||Array.isArray(e.children))&&(e.tags===void 0||Array.isArray(e.tags))}t.is=o})(zt||(zt={}));var Ht;(function(t){t.Empty="",t.QuickFix="quickfix",t.Refactor="refactor",t.RefactorExtract="refactor.extract",t.RefactorInline="refactor.inline",t.RefactorRewrite="refactor.rewrite",t.Source="source",t.SourceOrganizeImports="source.organizeImports",t.SourceFixAll="source.fixAll"})(Ht||(Ht={}));var It;(function(t){function i(n,e){var a={diagnostics:n};return e!=null&&(a.only=e),a}t.create=i;function o(n){var e=n;return _.defined(e)&&_.typedArray(e.diagnostics,Ae.is)&&(e.only===void 0||_.typedArray(e.only,_.string))}t.is=o})(It||(It={}));var Ut;(function(t){function i(n,e,a){var c={title:n},l=!0;return typeof e=="string"?(l=!1,c.kind=e):_e.is(e)?c.command=e:c.edit=e,l&&a!==void 0&&(c.kind=a),c}t.create=i;function o(n){var e=n;return e&&_.string(e.title)&&(e.diagnostics===void 0||_.typedArray(e.diagnostics,Ae.is))&&(e.kind===void 0||_.string(e.kind))&&(e.edit!==void 0||e.command!==void 0)&&(e.command===void 0||_e.is(e.command))&&(e.isPreferred===void 0||_.boolean(e.isPreferred))&&(e.edit===void 0||Be.is(e.edit))}t.is=o})(Ut||(Ut={}));var Wt;(function(t){function i(n,e){var a={range:n};return _.defined(e)&&(a.data=e),a}t.create=i;function o(n){var e=n;return _.defined(e)&&P.is(e.range)&&(_.undefined(e.command)||_e.is(e.command))}t.is=o})(Wt||(Wt={}));var lt;(function(t){function i(n,e){return{tabSize:n,insertSpaces:e}}t.create=i;function o(n){var e=n;return _.defined(e)&&_.uinteger(e.tabSize)&&_.boolean(e.insertSpaces)}t.is=o})(lt||(lt={}));var ut;(function(t){function i(n,e,a){return{range:n,target:e,data:a}}t.create=i;function o(n){var e=n;return _.defined(e)&&P.is(e.range)&&(_.undefined(e.target)||_.string(e.target))}t.is=o})(ut||(ut={}));var Te;(function(t){function i(n,e){return{range:n,parent:e}}t.create=i;function o(n){var e=n;return e!==void 0&&P.is(e.range)&&(e.parent===void 0||t.is(e.parent))}t.is=o})(Te||(Te={}));var Bt;(function(t){function i(a,c,l,r){return new Hn(a,c,l,r)}t.create=i;function o(a){var c=a;return!!(_.defined(c)&&_.string(c.uri)&&(_.undefined(c.languageId)||_.string(c.languageId))&&_.uinteger(c.lineCount)&&_.func(c.getText)&&_.func(c.positionAt)&&_.func(c.offsetAt))}t.is=o;function n(a,c){for(var l=a.getText(),r=e(c,function(y,m){var A=y.range.start.line-m.range.start.line;return A===0?y.range.start.character-m.range.start.character:A}),s=l.length,u=r.length-1;u>=0;u--){var h=r[u],d=a.offsetAt(h.range.start),g=a.offsetAt(h.range.end);if(g<=s)l=l.substring(0,d)+h.newText+l.substring(g,l.length);else throw new Error("Overlapping edit");s=d}return l}t.applyEdits=n;function e(a,c){if(a.length<=1)return a;var l=a.length/2|0,r=a.slice(0,l),s=a.slice(l);e(r,c),e(s,c);for(var u=0,h=0,d=0;u<r.length&&h<s.length;){var g=c(r[u],s[h]);g<=0?a[d++]=r[u++]:a[d++]=s[h++]}for(;u<r.length;)a[d++]=r[u++];for(;h<s.length;)a[d++]=s[h++];return a}})(Bt||(Bt={}));var Hn=function(){function t(i,o,n,e){this._uri=i,this._languageId=o,this._version=n,this._content=e,this._lineOffsets=void 0}return Object.defineProperty(t.prototype,"uri",{get:function(){return this._uri},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"languageId",{get:function(){return this._languageId},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"version",{get:function(){return this._version},enumerable:!1,configurable:!0}),t.prototype.getText=function(i){if(i){var o=this.offsetAt(i.start),n=this.offsetAt(i.end);return this._content.substring(o,n)}return this._content},t.prototype.update=function(i,o){this._content=i.text,this._version=o,this._lineOffsets=void 0},t.prototype.getLineOffsets=function(){if(this._lineOffsets===void 0){for(var i=[],o=this._content,n=!0,e=0;e<o.length;e++){n&&(i.push(e),n=!1);var a=o.charAt(e);n=a==="\r"||a===`
+`,a==="\r"&&e+1<o.length&&o.charAt(e+1)===`
+`&&e++}n&&o.length>0&&i.push(o.length),this._lineOffsets=i}return this._lineOffsets},t.prototype.positionAt=function(i){i=Math.max(Math.min(i,this._content.length),0);var o=this.getLineOffsets(),n=0,e=o.length;if(e===0)return X.create(0,i);for(;n<e;){var a=Math.floor((n+e)/2);o[a]>i?e=a:n=a+1}var c=n-1;return X.create(c,i-o[c])},t.prototype.offsetAt=function(i){var o=this.getLineOffsets();if(i.line>=o.length)return this._content.length;if(i.line<0)return 0;var n=o[i.line],e=i.line+1<o.length?o[i.line+1]:this._content.length;return Math.max(Math.min(n+i.character,e),n)},Object.defineProperty(t.prototype,"lineCount",{get:function(){return this.getLineOffsets().length},enumerable:!1,configurable:!0}),t}(),_;(function(t){var i=Object.prototype.toString;function o(g){return typeof g<"u"}t.defined=o;function n(g){return typeof g>"u"}t.undefined=n;function e(g){return g===!0||g===!1}t.boolean=e;function a(g){return i.call(g)==="[object String]"}t.string=a;function c(g){return i.call(g)==="[object Number]"}t.number=c;function l(g,y,m){return i.call(g)==="[object Number]"&&y<=g&&g<=m}t.numberRange=l;function r(g){return i.call(g)==="[object Number]"&&-2147483648<=g&&g<=2147483647}t.integer=r;function s(g){return i.call(g)==="[object Number]"&&0<=g&&g<=2147483647}t.uinteger=s;function u(g){return i.call(g)==="[object Function]"}t.func=u;function h(g){return g!==null&&typeof g=="object"}t.objectLiteral=h;function d(g,y){return Array.isArray(g)&&g.every(y)}t.typedArray=d})(_||(_={}));var Ne=class t{constructor(i,o,n,e){this._uri=i,this._languageId=o,this._version=n,this._content=e,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(i){if(i){let o=this.offsetAt(i.start),n=this.offsetAt(i.end);return this._content.substring(o,n)}return this._content}update(i,o){for(let n of i)if(t.isIncremental(n)){let e=Pt(n.range),a=this.offsetAt(e.start),c=this.offsetAt(e.end);this._content=this._content.substring(0,a)+n.text+this._content.substring(c,this._content.length);let l=Math.max(e.start.line,0),r=Math.max(e.end.line,0),s=this._lineOffsets,u=Ft(n.text,!1,a);if(r-l===u.length)for(let d=0,g=u.length;d<g;d++)s[d+l+1]=u[d];else u.length<1e4?s.splice(l+1,r-l,...u):this._lineOffsets=s=s.slice(0,l+1).concat(u,s.slice(r+1));let h=n.text.length-(c-a);if(h!==0)for(let d=l+1+u.length,g=s.length;d<g;d++)s[d]=s[d]+h}else if(t.isFull(n))this._content=n.text,this._lineOffsets=void 0;else throw new Error("Unknown change event received");this._version=o}getLineOffsets(){return this._lineOffsets===void 0&&(this._lineOffsets=Ft(this._content,!0)),this._lineOffsets}positionAt(i){i=Math.max(Math.min(i,this._content.length),0);let o=this.getLineOffsets(),n=0,e=o.length;if(e===0)return{line:0,character:i};for(;n<e;){let c=Math.floor((n+e)/2);o[c]>i?e=c:n=c+1}let a=n-1;return{line:a,character:i-o[a]}}offsetAt(i){let o=this.getLineOffsets();if(i.line>=o.length)return this._content.length;if(i.line<0)return 0;let n=o[i.line],e=i.line+1<o.length?o[i.line+1]:this._content.length;return Math.max(Math.min(n+i.character,e),n)}get lineCount(){return this.getLineOffsets().length}static isIncremental(i){let o=i;return o!=null&&typeof o.text=="string"&&o.range!==void 0&&(o.rangeLength===void 0||typeof o.rangeLength=="number")}static isFull(i){let o=i;return o!=null&&typeof o.text=="string"&&o.range===void 0&&o.rangeLength===void 0}},Me;(function(t){function i(e,a,c,l){return new Ne(e,a,c,l)}t.create=i;function o(e,a,c){if(e instanceof Ne)return e.update(a,c),e;throw new Error("TextDocument.update: document must be created by TextDocument.create")}t.update=o;function n(e,a){let c=e.getText(),l=ct(a.map(In),(u,h)=>{let d=u.range.start.line-h.range.start.line;return d===0?u.range.start.character-h.range.start.character:d}),r=0,s=[];for(let u of l){let h=e.offsetAt(u.range.start);if(h<r)throw new Error("Overlapping edit");h>r&&s.push(c.substring(r,h)),u.newText.length&&s.push(u.newText),r=e.offsetAt(u.range.end)}return s.push(c.substr(r)),s.join("")}t.applyEdits=n})(Me||(Me={}));function ct(t,i){if(t.length<=1)return t;let o=t.length/2|0,n=t.slice(0,o),e=t.slice(o);ct(n,i),ct(e,i);let a=0,c=0,l=0;for(;a<n.length&&c<e.length;)i(n[a],e[c])<=0?t[l++]=n[a++]:t[l++]=e[c++];for(;a<n.length;)t[l++]=n[a++];for(;c<e.length;)t[l++]=e[c++];return t}function Ft(t,i,o=0){let n=i?[o]:[];for(let e=0;e<t.length;e++){let a=t.charCodeAt(e);(a===13||a===10)&&(a===13&&e+1<t.length&&t.charCodeAt(e+1)===10&&e++,n.push(o+e+1))}return n}function Pt(t){let i=t.start,o=t.end;return i.line>o.line||i.line===o.line&&i.character>o.character?{start:o,end:i}:t}function In(t){let i=Pt(t.range);return i!==t.range?{newText:t.newText,range:i}:t}var S;(function(t){t[t.StartCommentTag=0]="StartCommentTag",t[t.Comment=1]="Comment",t[t.EndCommentTag=2]="EndCommentTag",t[t.StartTagOpen=3]="StartTagOpen",t[t.StartTagClose=4]="StartTagClose",t[t.StartTagSelfClose=5]="StartTagSelfClose",t[t.StartTag=6]="StartTag",t[t.EndTagOpen=7]="EndTagOpen",t[t.EndTagClose=8]="EndTagClose",t[t.EndTag=9]="EndTag",t[t.DelimiterAssign=10]="DelimiterAssign",t[t.AttributeName=11]="AttributeName",t[t.AttributeValue=12]="AttributeValue",t[t.StartDoctypeTag=13]="StartDoctypeTag",t[t.Doctype=14]="Doctype",t[t.EndDoctypeTag=15]="EndDoctypeTag",t[t.Content=16]="Content",t[t.Whitespace=17]="Whitespace",t[t.Unknown=18]="Unknown",t[t.Script=19]="Script",t[t.Styles=20]="Styles",t[t.EOS=21]="EOS"})(S||(S={}));var W;(function(t){t[t.WithinContent=0]="WithinContent",t[t.AfterOpeningStartTag=1]="AfterOpeningStartTag",t[t.AfterOpeningEndTag=2]="AfterOpeningEndTag",t[t.WithinDoctype=3]="WithinDoctype",t[t.WithinTag=4]="WithinTag",t[t.WithinEndTag=5]="WithinEndTag",t[t.WithinComment=6]="WithinComment",t[t.WithinScriptContent=7]="WithinScriptContent",t[t.WithinStyleContent=8]="WithinStyleContent",t[t.AfterAttributeName=9]="AfterAttributeName",t[t.BeforeAttributeValue=10]="BeforeAttributeValue"})(W||(W={}));var Nt;(function(t){t.LATEST={textDocument:{completion:{completionItem:{documentationFormat:[ee.Markdown,ee.PlainText]}},hover:{contentFormat:[ee.Markdown,ee.PlainText]}}}})(Nt||(Nt={}));var Oe;(function(t){t[t.Unknown=0]="Unknown",t[t.File=1]="File",t[t.Directory=2]="Directory",t[t.SymbolicLink=64]="SymbolicLink"})(Oe||(Oe={}));var he=ge(),Un=function(){function t(i,o){this.source=i,this.len=i.length,this.position=o}return t.prototype.eos=function(){return this.len<=this.position},t.prototype.getSource=function(){return this.source},t.prototype.pos=function(){return this.position},t.prototype.goBackTo=function(i){this.position=i},t.prototype.goBack=function(i){this.position-=i},t.prototype.advance=function(i){this.position+=i},t.prototype.goToEnd=function(){this.position=this.source.length},t.prototype.nextChar=function(){return this.source.charCodeAt(this.position++)||0},t.prototype.peekChar=function(i){return i===void 0&&(i=0),this.source.charCodeAt(this.position+i)||0},t.prototype.advanceIfChar=function(i){return i===this.source.charCodeAt(this.position)?(this.position++,!0):!1},t.prototype.advanceIfChars=function(i){var o;if(this.position+i.length>this.source.length)return!1;for(o=0;o<i.length;o++)if(this.source.charCodeAt(this.position+o)!==i[o])return!1;return this.advance(o),!0},t.prototype.advanceIfRegExp=function(i){var o=this.source.substr(this.position),n=o.match(i);return n?(this.position=this.position+n.index+n[0].length,n[0]):""},t.prototype.advanceUntilRegExp=function(i){var o=this.source.substr(this.position),n=o.match(i);return n?(this.position=this.position+n.index,n[0]):(this.goToEnd(),"")},t.prototype.advanceUntilChar=function(i){for(;this.position<this.source.length;){if(this.source.charCodeAt(this.position)===i)return!0;this.advance(1)}return!1},t.prototype.advanceUntilChars=function(i){for(;this.position+i.length<=this.source.length;){for(var o=0;o<i.length&&this.source.charCodeAt(this.position+o)===i[o];o++);if(o===i.length)return!0;this.advance(1)}return this.goToEnd(),!1},t.prototype.skipWhitespace=function(){var i=this.advanceWhileChar(function(o){return o===qn||o===jn||o===Pn||o===On||o===Nn});return i>0},t.prototype.advanceWhileChar=function(i){for(var o=this.position;this.position<this.len&&i(this.source.charCodeAt(this.position));)this.position++;return this.position-o},t}(),Ot=33,ke=45,qe=60,se=62,ht=47,Wn=61,Bn=34,Fn=39,Pn=10,Nn=13,On=12,qn=32,jn=9,Gn={"text/x-handlebars-template":!0,"text/html":!0};function $(t,i,o,n){i===void 0&&(i=0),o===void 0&&(o=W.WithinContent),n===void 0&&(n=!1);var e=new Un(t,i),a=o,c=0,l=S.Unknown,r,s,u,h,d;function g(){return e.advanceIfRegExp(/^[_:\w][_:\w-.\d]*/).toLowerCase()}function y(){return e.advanceIfRegExp(/^[^\s"'></=\x00-\x0F\x7F\x80-\x9F]*/).toLowerCase()}function m(w,M,B){return l=M,c=w,r=B,M}function A(){var w=e.pos(),M=a,B=E();return B!==S.EOS&&w===e.pos()&&!(n&&(B===S.StartTagClose||B===S.EndTagClose))?(console.log("Scanner.scan has not advanced at offset "+w+", state before: "+M+" after: "+a),e.advance(1),m(w,S.Unknown)):B}function E(){var w=e.pos();if(e.eos())return m(w,S.EOS);var M;switch(a){case W.WithinComment:return e.advanceIfChars([ke,ke,se])?(a=W.WithinContent,m(w,S.EndCommentTag)):(e.advanceUntilChars([ke,ke,se]),m(w,S.Comment));case W.WithinDoctype:return e.advanceIfChar(se)?(a=W.WithinContent,m(w,S.EndDoctypeTag)):(e.advanceUntilChar(se),m(w,S.Doctype));case W.WithinContent:if(e.advanceIfChar(qe)){if(!e.eos()&&e.peekChar()===Ot){if(e.advanceIfChars([Ot,ke,ke]))return a=W.WithinComment,m(w,S.StartCommentTag);if(e.advanceIfRegExp(/^!doctype/i))return a=W.WithinDoctype,m(w,S.StartDoctypeTag)}return e.advanceIfChar(ht)?(a=W.AfterOpeningEndTag,m(w,S.EndTagOpen)):(a=W.AfterOpeningStartTag,m(w,S.StartTagOpen))}return e.advanceUntilChar(qe),m(w,S.Content);case W.AfterOpeningEndTag:var B=g();return B.length>0?(a=W.WithinEndTag,m(w,S.EndTag)):e.skipWhitespace()?m(w,S.Whitespace,he("error.unexpectedWhitespace","Tag name must directly follow the open bracket.")):(a=W.WithinEndTag,e.advanceUntilChar(se),w<e.pos()?m(w,S.Unknown,he("error.endTagNameExpected","End tag name expected.")):E());case W.WithinEndTag:if(e.skipWhitespace())return m(w,S.Whitespace);if(e.advanceIfChar(se))return a=W.WithinContent,m(w,S.EndTagClose);if(n&&e.peekChar()===qe)return a=W.WithinContent,m(w,S.EndTagClose,he("error.closingBracketMissing","Closing bracket missing."));M=he("error.closingBracketExpected","Closing bracket expected.");break;case W.AfterOpeningStartTag:return u=g(),d=void 0,h=void 0,u.length>0?(s=!1,a=W.WithinTag,m(w,S.StartTag)):e.skipWhitespace()?m(w,S.Whitespace,he("error.unexpectedWhitespace","Tag name must directly follow the open bracket.")):(a=W.WithinTag,e.advanceUntilChar(se),w<e.pos()?m(w,S.Unknown,he("error.startTagNameExpected","Start tag name expected.")):E());case W.WithinTag:return e.skipWhitespace()?(s=!0,m(w,S.Whitespace)):s&&(h=y(),h.length>0)?(a=W.AfterAttributeName,s=!1,m(w,S.AttributeName)):e.advanceIfChars([ht,se])?(a=W.WithinContent,m(w,S.StartTagSelfClose)):e.advanceIfChar(se)?(u==="script"?d&&Gn[d]?a=W.WithinContent:a=W.WithinScriptContent:u==="style"?a=W.WithinStyleContent:a=W.WithinContent,m(w,S.StartTagClose)):n&&e.peekChar()===qe?(a=W.WithinContent,m(w,S.StartTagClose,he("error.closingBracketMissing","Closing bracket missing."))):(e.advance(1),m(w,S.Unknown,he("error.unexpectedCharacterInTag","Unexpected character in tag.")));case W.AfterAttributeName:return e.skipWhitespace()?(s=!0,m(w,S.Whitespace)):e.advanceIfChar(Wn)?(a=W.BeforeAttributeValue,m(w,S.DelimiterAssign)):(a=W.WithinTag,E());case W.BeforeAttributeValue:if(e.skipWhitespace())return m(w,S.Whitespace);var G=e.advanceIfRegExp(/^[^\s"'`=<>]+/);if(G.length>0)return e.peekChar()===se&&e.peekChar(-1)===ht&&(e.goBack(1),G=G.substr(0,G.length-1)),h==="type"&&(d=G),a=W.WithinTag,s=!1,m(w,S.AttributeValue);var J=e.peekChar();return J===Fn||J===Bn?(e.advance(1),e.advanceUntilChar(J)&&e.advance(1),h==="type"&&(d=e.getSource().substring(w+1,e.pos()-1)),a=W.WithinTag,s=!1,m(w,S.AttributeValue)):(a=W.WithinTag,s=!1,E());case W.WithinScriptContent:for(var f=1;!e.eos();){var p=e.advanceIfRegExp(/<!--|-->|<\/?script\s*\/?>?/i);if(p.length===0)return e.goToEnd(),m(w,S.Script);if(p==="<!--")f===1&&(f=2);else if(p==="-->")f=1;else if(p[1]!=="/")f===2&&(f=3);else if(f===3)f=2;else{e.goBack(p.length);break}}return a=W.WithinContent,w<e.pos()?m(w,S.Script):E();case W.WithinStyleContent:return e.advanceUntilRegExp(/<\/style/i),a=W.WithinContent,w<e.pos()?m(w,S.Styles):E()}return e.advance(1),a=W.WithinContent,m(w,S.Unknown,M)}return{scan:A,getTokenType:function(){return l},getTokenOffset:function(){return c},getTokenLength:function(){return e.pos()-c},getTokenEnd:function(){return e.pos()},getTokenText:function(){return e.getSource().substring(c,e.pos())},getScannerState:function(){return a},getTokenError:function(){return r}}}function dt(t,i){var o=0,n=t.length;if(n===0)return 0;for(;o<n;){var e=Math.floor((o+n)/2);i(t[e])?n=e:o=e+1}return o}function qt(t,i,o){for(var n=0,e=t.length-1;n<=e;){var a=(n+e)/2|0,c=o(t[a],i);if(c<0)n=a+1;else if(c>0)e=a-1;else return a}return-(n+1)}var Jn=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"];function pe(t){return!!t&&qt(Jn,t.toLowerCase(),function(i,o){return i.localeCompare(o)})>=0}var jt=function(){function t(i,o,n,e){this.start=i,this.end=o,this.children=n,this.parent=e,this.closed=!1}return Object.defineProperty(t.prototype,"attributeNames",{get:function(){return this.attributes?Object.keys(this.attributes):[]},enumerable:!1,configurable:!0}),t.prototype.isSameTag=function(i){return this.tag===void 0?i===void 0:i!==void 0&&this.tag.length===i.length&&this.tag.toLowerCase()===i},Object.defineProperty(t.prototype,"firstChild",{get:function(){return this.children[0]},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"lastChild",{get:function(){return this.children.length?this.children[this.children.length-1]:void 0},enumerable:!1,configurable:!0}),t.prototype.findNodeBefore=function(i){var o=dt(this.children,function(a){return i<=a.start})-1;if(o>=0){var n=this.children[o];if(i>n.start){if(i<n.end)return n.findNodeBefore(i);var e=n.lastChild;return e&&e.end===n.end?n.findNodeBefore(i):n}}return this},t.prototype.findNodeAt=function(i){var o=dt(this.children,function(e){return i<=e.start})-1;if(o>=0){var n=this.children[o];if(i>n.start&&i<=n.end)return n.findNodeAt(i)}return this},t}();function je(t){for(var i=$(t,void 0,void 0,!0),o=new jt(0,t.length,[],void 0),n=o,e=-1,a=void 0,c=null,l=i.scan();l!==S.EOS;){switch(l){case S.StartTagOpen:var r=new jt(i.getTokenOffset(),t.length,[],n);n.children.push(r),n=r;break;case S.StartTag:n.tag=i.getTokenText();break;case S.StartTagClose:n.parent&&(n.end=i.getTokenEnd(),i.getTokenLength()?(n.startTagEnd=i.getTokenEnd(),n.tag&&pe(n.tag)&&(n.closed=!0,n=n.parent)):n=n.parent);break;case S.StartTagSelfClose:n.parent&&(n.closed=!0,n.end=i.getTokenEnd(),n.startTagEnd=i.getTokenEnd(),n=n.parent);break;case S.EndTagOpen:e=i.getTokenOffset(),a=void 0;break;case S.EndTag:a=i.getTokenText().toLowerCase();break;case S.EndTagClose:for(var s=n;!s.isSameTag(a)&&s.parent;)s=s.parent;if(s.parent){for(;n!==s;)n.end=e,n.closed=!1,n=n.parent;n.closed=!0,n.endTagStart=e,n.end=i.getTokenEnd(),n=n.parent}break;case S.AttributeName:{c=i.getTokenText();var u=n.attributes;u||(n.attributes=u={}),u[c]=null;break}case S.AttributeValue:{var h=i.getTokenText(),u=n.attributes;u&&c&&(u[c]=h,c=null);break}}l=i.scan()}for(;n.parent;)n.end=t.length,n.closed=!1,n=n.parent;return{roots:o.children,findNodeBefore:o.findNodeBefore.bind(o),findNodeAt:o.findNodeAt.bind(o)}}var me={"Aacute;":"\xC1",Aacute:"\xC1","aacute;":"\xE1",aacute:"\xE1","Abreve;":"\u0102","abreve;":"\u0103","ac;":"\u223E","acd;":"\u223F","acE;":"\u223E\u0333","Acirc;":"\xC2",Acirc:"\xC2","acirc;":"\xE2",acirc:"\xE2","acute;":"\xB4",acute:"\xB4","Acy;":"\u0410","acy;":"\u0430","AElig;":"\xC6",AElig:"\xC6","aelig;":"\xE6",aelig:"\xE6","af;":"\u2061","Afr;":"\u{1D504}","afr;":"\u{1D51E}","Agrave;":"\xC0",Agrave:"\xC0","agrave;":"\xE0",agrave:"\xE0","alefsym;":"\u2135","aleph;":"\u2135","Alpha;":"\u0391","alpha;":"\u03B1","Amacr;":"\u0100","amacr;":"\u0101","amalg;":"\u2A3F","AMP;":"&",AMP:"&","amp;":"&",amp:"&","And;":"\u2A53","and;":"\u2227","andand;":"\u2A55","andd;":"\u2A5C","andslope;":"\u2A58","andv;":"\u2A5A","ang;":"\u2220","ange;":"\u29A4","angle;":"\u2220","angmsd;":"\u2221","angmsdaa;":"\u29A8","angmsdab;":"\u29A9","angmsdac;":"\u29AA","angmsdad;":"\u29AB","angmsdae;":"\u29AC","angmsdaf;":"\u29AD","angmsdag;":"\u29AE","angmsdah;":"\u29AF","angrt;":"\u221F","angrtvb;":"\u22BE","angrtvbd;":"\u299D","angsph;":"\u2222","angst;":"\xC5","angzarr;":"\u237C","Aogon;":"\u0104","aogon;":"\u0105","Aopf;":"\u{1D538}","aopf;":"\u{1D552}","ap;":"\u2248","apacir;":"\u2A6F","apE;":"\u2A70","ape;":"\u224A","apid;":"\u224B","apos;":"'","ApplyFunction;":"\u2061","approx;":"\u2248","approxeq;":"\u224A","Aring;":"\xC5",Aring:"\xC5","aring;":"\xE5",aring:"\xE5","Ascr;":"\u{1D49C}","ascr;":"\u{1D4B6}","Assign;":"\u2254","ast;":"*","asymp;":"\u2248","asympeq;":"\u224D","Atilde;":"\xC3",Atilde:"\xC3","atilde;":"\xE3",atilde:"\xE3","Auml;":"\xC4",Auml:"\xC4","auml;":"\xE4",auml:"\xE4","awconint;":"\u2233","awint;":"\u2A11","backcong;":"\u224C","backepsilon;":"\u03F6","backprime;":"\u2035","backsim;":"\u223D","backsimeq;":"\u22CD","Backslash;":"\u2216","Barv;":"\u2AE7","barvee;":"\u22BD","Barwed;":"\u2306","barwed;":"\u2305","barwedge;":"\u2305","bbrk;":"\u23B5","bbrktbrk;":"\u23B6","bcong;":"\u224C","Bcy;":"\u0411","bcy;":"\u0431","bdquo;":"\u201E","becaus;":"\u2235","Because;":"\u2235","because;":"\u2235","bemptyv;":"\u29B0","bepsi;":"\u03F6","bernou;":"\u212C","Bernoullis;":"\u212C","Beta;":"\u0392","beta;":"\u03B2","beth;":"\u2136","between;":"\u226C","Bfr;":"\u{1D505}","bfr;":"\u{1D51F}","bigcap;":"\u22C2","bigcirc;":"\u25EF","bigcup;":"\u22C3","bigodot;":"\u2A00","bigoplus;":"\u2A01","bigotimes;":"\u2A02","bigsqcup;":"\u2A06","bigstar;":"\u2605","bigtriangledown;":"\u25BD","bigtriangleup;":"\u25B3","biguplus;":"\u2A04","bigvee;":"\u22C1","bigwedge;":"\u22C0","bkarow;":"\u290D","blacklozenge;":"\u29EB","blacksquare;":"\u25AA","blacktriangle;":"\u25B4","blacktriangledown;":"\u25BE","blacktriangleleft;":"\u25C2","blacktriangleright;":"\u25B8","blank;":"\u2423","blk12;":"\u2592","blk14;":"\u2591","blk34;":"\u2593","block;":"\u2588","bne;":"=\u20E5","bnequiv;":"\u2261\u20E5","bNot;":"\u2AED","bnot;":"\u2310","Bopf;":"\u{1D539}","bopf;":"\u{1D553}","bot;":"\u22A5","bottom;":"\u22A5","bowtie;":"\u22C8","boxbox;":"\u29C9","boxDL;":"\u2557","boxDl;":"\u2556","boxdL;":"\u2555","boxdl;":"\u2510","boxDR;":"\u2554","boxDr;":"\u2553","boxdR;":"\u2552","boxdr;":"\u250C","boxH;":"\u2550","boxh;":"\u2500","boxHD;":"\u2566","boxHd;":"\u2564","boxhD;":"\u2565","boxhd;":"\u252C","boxHU;":"\u2569","boxHu;":"\u2567","boxhU;":"\u2568","boxhu;":"\u2534","boxminus;":"\u229F","boxplus;":"\u229E","boxtimes;":"\u22A0","boxUL;":"\u255D","boxUl;":"\u255C","boxuL;":"\u255B","boxul;":"\u2518","boxUR;":"\u255A","boxUr;":"\u2559","boxuR;":"\u2558","boxur;":"\u2514","boxV;":"\u2551","boxv;":"\u2502","boxVH;":"\u256C","boxVh;":"\u256B","boxvH;":"\u256A","boxvh;":"\u253C","boxVL;":"\u2563","boxVl;":"\u2562","boxvL;":"\u2561","boxvl;":"\u2524","boxVR;":"\u2560","boxVr;":"\u255F","boxvR;":"\u255E","boxvr;":"\u251C","bprime;":"\u2035","Breve;":"\u02D8","breve;":"\u02D8","brvbar;":"\xA6",brvbar:"\xA6","Bscr;":"\u212C","bscr;":"\u{1D4B7}","bsemi;":"\u204F","bsim;":"\u223D","bsime;":"\u22CD","bsol;":"\\","bsolb;":"\u29C5","bsolhsub;":"\u27C8","bull;":"\u2022","bullet;":"\u2022","bump;":"\u224E","bumpE;":"\u2AAE","bumpe;":"\u224F","Bumpeq;":"\u224E","bumpeq;":"\u224F","Cacute;":"\u0106","cacute;":"\u0107","Cap;":"\u22D2","cap;":"\u2229","capand;":"\u2A44","capbrcup;":"\u2A49","capcap;":"\u2A4B","capcup;":"\u2A47","capdot;":"\u2A40","CapitalDifferentialD;":"\u2145","caps;":"\u2229\uFE00","caret;":"\u2041","caron;":"\u02C7","Cayleys;":"\u212D","ccaps;":"\u2A4D","Ccaron;":"\u010C","ccaron;":"\u010D","Ccedil;":"\xC7",Ccedil:"\xC7","ccedil;":"\xE7",ccedil:"\xE7","Ccirc;":"\u0108","ccirc;":"\u0109","Cconint;":"\u2230","ccups;":"\u2A4C","ccupssm;":"\u2A50","Cdot;":"\u010A","cdot;":"\u010B","cedil;":"\xB8",cedil:"\xB8","Cedilla;":"\xB8","cemptyv;":"\u29B2","cent;":"\xA2",cent:"\xA2","CenterDot;":"\xB7","centerdot;":"\xB7","Cfr;":"\u212D","cfr;":"\u{1D520}","CHcy;":"\u0427","chcy;":"\u0447","check;":"\u2713","checkmark;":"\u2713","Chi;":"\u03A7","chi;":"\u03C7","cir;":"\u25CB","circ;":"\u02C6","circeq;":"\u2257","circlearrowleft;":"\u21BA","circlearrowright;":"\u21BB","circledast;":"\u229B","circledcirc;":"\u229A","circleddash;":"\u229D","CircleDot;":"\u2299","circledR;":"\xAE","circledS;":"\u24C8","CircleMinus;":"\u2296","CirclePlus;":"\u2295","CircleTimes;":"\u2297","cirE;":"\u29C3","cire;":"\u2257","cirfnint;":"\u2A10","cirmid;":"\u2AEF","cirscir;":"\u29C2","ClockwiseContourIntegral;":"\u2232","CloseCurlyDoubleQuote;":"\u201D","CloseCurlyQuote;":"\u2019","clubs;":"\u2663","clubsuit;":"\u2663","Colon;":"\u2237","colon;":":","Colone;":"\u2A74","colone;":"\u2254","coloneq;":"\u2254","comma;":",","commat;":"@","comp;":"\u2201","compfn;":"\u2218","complement;":"\u2201","complexes;":"\u2102","cong;":"\u2245","congdot;":"\u2A6D","Congruent;":"\u2261","Conint;":"\u222F","conint;":"\u222E","ContourIntegral;":"\u222E","Copf;":"\u2102","copf;":"\u{1D554}","coprod;":"\u2210","Coproduct;":"\u2210","COPY;":"\xA9",COPY:"\xA9","copy;":"\xA9",copy:"\xA9","copysr;":"\u2117","CounterClockwiseContourIntegral;":"\u2233","crarr;":"\u21B5","Cross;":"\u2A2F","cross;":"\u2717","Cscr;":"\u{1D49E}","cscr;":"\u{1D4B8}","csub;":"\u2ACF","csube;":"\u2AD1","csup;":"\u2AD0","csupe;":"\u2AD2","ctdot;":"\u22EF","cudarrl;":"\u2938","cudarrr;":"\u2935","cuepr;":"\u22DE","cuesc;":"\u22DF","cularr;":"\u21B6","cularrp;":"\u293D","Cup;":"\u22D3","cup;":"\u222A","cupbrcap;":"\u2A48","CupCap;":"\u224D","cupcap;":"\u2A46","cupcup;":"\u2A4A","cupdot;":"\u228D","cupor;":"\u2A45","cups;":"\u222A\uFE00","curarr;":"\u21B7","curarrm;":"\u293C","curlyeqprec;":"\u22DE","curlyeqsucc;":"\u22DF","curlyvee;":"\u22CE","curlywedge;":"\u22CF","curren;":"\xA4",curren:"\xA4","curvearrowleft;":"\u21B6","curvearrowright;":"\u21B7","cuvee;":"\u22CE","cuwed;":"\u22CF","cwconint;":"\u2232","cwint;":"\u2231","cylcty;":"\u232D","Dagger;":"\u2021","dagger;":"\u2020","daleth;":"\u2138","Darr;":"\u21A1","dArr;":"\u21D3","darr;":"\u2193","dash;":"\u2010","Dashv;":"\u2AE4","dashv;":"\u22A3","dbkarow;":"\u290F","dblac;":"\u02DD","Dcaron;":"\u010E","dcaron;":"\u010F","Dcy;":"\u0414","dcy;":"\u0434","DD;":"\u2145","dd;":"\u2146","ddagger;":"\u2021","ddarr;":"\u21CA","DDotrahd;":"\u2911","ddotseq;":"\u2A77","deg;":"\xB0",deg:"\xB0","Del;":"\u2207","Delta;":"\u0394","delta;":"\u03B4","demptyv;":"\u29B1","dfisht;":"\u297F","Dfr;":"\u{1D507}","dfr;":"\u{1D521}","dHar;":"\u2965","dharl;":"\u21C3","dharr;":"\u21C2","DiacriticalAcute;":"\xB4","DiacriticalDot;":"\u02D9","DiacriticalDoubleAcute;":"\u02DD","DiacriticalGrave;":"`","DiacriticalTilde;":"\u02DC","diam;":"\u22C4","Diamond;":"\u22C4","diamond;":"\u22C4","diamondsuit;":"\u2666","diams;":"\u2666","die;":"\xA8","DifferentialD;":"\u2146","digamma;":"\u03DD","disin;":"\u22F2","div;":"\xF7","divide;":"\xF7",divide:"\xF7","divideontimes;":"\u22C7","divonx;":"\u22C7","DJcy;":"\u0402","djcy;":"\u0452","dlcorn;":"\u231E","dlcrop;":"\u230D","dollar;":"$","Dopf;":"\u{1D53B}","dopf;":"\u{1D555}","Dot;":"\xA8","dot;":"\u02D9","DotDot;":"\u20DC","doteq;":"\u2250","doteqdot;":"\u2251","DotEqual;":"\u2250","dotminus;":"\u2238","dotplus;":"\u2214","dotsquare;":"\u22A1","doublebarwedge;":"\u2306","DoubleContourIntegral;":"\u222F","DoubleDot;":"\xA8","DoubleDownArrow;":"\u21D3","DoubleLeftArrow;":"\u21D0","DoubleLeftRightArrow;":"\u21D4","DoubleLeftTee;":"\u2AE4","DoubleLongLeftArrow;":"\u27F8","DoubleLongLeftRightArrow;":"\u27FA","DoubleLongRightArrow;":"\u27F9","DoubleRightArrow;":"\u21D2","DoubleRightTee;":"\u22A8","DoubleUpArrow;":"\u21D1","DoubleUpDownArrow;":"\u21D5","DoubleVerticalBar;":"\u2225","DownArrow;":"\u2193","Downarrow;":"\u21D3","downarrow;":"\u2193","DownArrowBar;":"\u2913","DownArrowUpArrow;":"\u21F5","DownBreve;":"\u0311","downdownarrows;":"\u21CA","downharpoonleft;":"\u21C3","downharpoonright;":"\u21C2","DownLeftRightVector;":"\u2950","DownLeftTeeVector;":"\u295E","DownLeftVector;":"\u21BD","DownLeftVectorBar;":"\u2956","DownRightTeeVector;":"\u295F","DownRightVector;":"\u21C1","DownRightVectorBar;":"\u2957","DownTee;":"\u22A4","DownTeeArrow;":"\u21A7","drbkarow;":"\u2910","drcorn;":"\u231F","drcrop;":"\u230C","Dscr;":"\u{1D49F}","dscr;":"\u{1D4B9}","DScy;":"\u0405","dscy;":"\u0455","dsol;":"\u29F6","Dstrok;":"\u0110","dstrok;":"\u0111","dtdot;":"\u22F1","dtri;":"\u25BF","dtrif;":"\u25BE","duarr;":"\u21F5","duhar;":"\u296F","dwangle;":"\u29A6","DZcy;":"\u040F","dzcy;":"\u045F","dzigrarr;":"\u27FF","Eacute;":"\xC9",Eacute:"\xC9","eacute;":"\xE9",eacute:"\xE9","easter;":"\u2A6E","Ecaron;":"\u011A","ecaron;":"\u011B","ecir;":"\u2256","Ecirc;":"\xCA",Ecirc:"\xCA","ecirc;":"\xEA",ecirc:"\xEA","ecolon;":"\u2255","Ecy;":"\u042D","ecy;":"\u044D","eDDot;":"\u2A77","Edot;":"\u0116","eDot;":"\u2251","edot;":"\u0117","ee;":"\u2147","efDot;":"\u2252","Efr;":"\u{1D508}","efr;":"\u{1D522}","eg;":"\u2A9A","Egrave;":"\xC8",Egrave:"\xC8","egrave;":"\xE8",egrave:"\xE8","egs;":"\u2A96","egsdot;":"\u2A98","el;":"\u2A99","Element;":"\u2208","elinters;":"\u23E7","ell;":"\u2113","els;":"\u2A95","elsdot;":"\u2A97","Emacr;":"\u0112","emacr;":"\u0113","empty;":"\u2205","emptyset;":"\u2205","EmptySmallSquare;":"\u25FB","emptyv;":"\u2205","EmptyVerySmallSquare;":"\u25AB","emsp;":"\u2003","emsp13;":"\u2004","emsp14;":"\u2005","ENG;":"\u014A","eng;":"\u014B","ensp;":"\u2002","Eogon;":"\u0118","eogon;":"\u0119","Eopf;":"\u{1D53C}","eopf;":"\u{1D556}","epar;":"\u22D5","eparsl;":"\u29E3","eplus;":"\u2A71","epsi;":"\u03B5","Epsilon;":"\u0395","epsilon;":"\u03B5","epsiv;":"\u03F5","eqcirc;":"\u2256","eqcolon;":"\u2255","eqsim;":"\u2242","eqslantgtr;":"\u2A96","eqslantless;":"\u2A95","Equal;":"\u2A75","equals;":"=","EqualTilde;":"\u2242","equest;":"\u225F","Equilibrium;":"\u21CC","equiv;":"\u2261","equivDD;":"\u2A78","eqvparsl;":"\u29E5","erarr;":"\u2971","erDot;":"\u2253","Escr;":"\u2130","escr;":"\u212F","esdot;":"\u2250","Esim;":"\u2A73","esim;":"\u2242","Eta;":"\u0397","eta;":"\u03B7","ETH;":"\xD0",ETH:"\xD0","eth;":"\xF0",eth:"\xF0","Euml;":"\xCB",Euml:"\xCB","euml;":"\xEB",euml:"\xEB","euro;":"\u20AC","excl;":"!","exist;":"\u2203","Exists;":"\u2203","expectation;":"\u2130","ExponentialE;":"\u2147","exponentiale;":"\u2147","fallingdotseq;":"\u2252","Fcy;":"\u0424","fcy;":"\u0444","female;":"\u2640","ffilig;":"\uFB03","fflig;":"\uFB00","ffllig;":"\uFB04","Ffr;":"\u{1D509}","ffr;":"\u{1D523}","filig;":"\uFB01","FilledSmallSquare;":"\u25FC","FilledVerySmallSquare;":"\u25AA","fjlig;":"fj","flat;":"\u266D","fllig;":"\uFB02","fltns;":"\u25B1","fnof;":"\u0192","Fopf;":"\u{1D53D}","fopf;":"\u{1D557}","ForAll;":"\u2200","forall;":"\u2200","fork;":"\u22D4","forkv;":"\u2AD9","Fouriertrf;":"\u2131","fpartint;":"\u2A0D","frac12;":"\xBD",frac12:"\xBD","frac13;":"\u2153","frac14;":"\xBC",frac14:"\xBC","frac15;":"\u2155","frac16;":"\u2159","frac18;":"\u215B","frac23;":"\u2154","frac25;":"\u2156","frac34;":"\xBE",frac34:"\xBE","frac35;":"\u2157","frac38;":"\u215C","frac45;":"\u2158","frac56;":"\u215A","frac58;":"\u215D","frac78;":"\u215E","frasl;":"\u2044","frown;":"\u2322","Fscr;":"\u2131","fscr;":"\u{1D4BB}","gacute;":"\u01F5","Gamma;":"\u0393","gamma;":"\u03B3","Gammad;":"\u03DC","gammad;":"\u03DD","gap;":"\u2A86","Gbreve;":"\u011E","gbreve;":"\u011F","Gcedil;":"\u0122","Gcirc;":"\u011C","gcirc;":"\u011D","Gcy;":"\u0413","gcy;":"\u0433","Gdot;":"\u0120","gdot;":"\u0121","gE;":"\u2267","ge;":"\u2265","gEl;":"\u2A8C","gel;":"\u22DB","geq;":"\u2265","geqq;":"\u2267","geqslant;":"\u2A7E","ges;":"\u2A7E","gescc;":"\u2AA9","gesdot;":"\u2A80","gesdoto;":"\u2A82","gesdotol;":"\u2A84","gesl;":"\u22DB\uFE00","gesles;":"\u2A94","Gfr;":"\u{1D50A}","gfr;":"\u{1D524}","Gg;":"\u22D9","gg;":"\u226B","ggg;":"\u22D9","gimel;":"\u2137","GJcy;":"\u0403","gjcy;":"\u0453","gl;":"\u2277","gla;":"\u2AA5","glE;":"\u2A92","glj;":"\u2AA4","gnap;":"\u2A8A","gnapprox;":"\u2A8A","gnE;":"\u2269","gne;":"\u2A88","gneq;":"\u2A88","gneqq;":"\u2269","gnsim;":"\u22E7","Gopf;":"\u{1D53E}","gopf;":"\u{1D558}","grave;":"`","GreaterEqual;":"\u2265","GreaterEqualLess;":"\u22DB","GreaterFullEqual;":"\u2267","GreaterGreater;":"\u2AA2","GreaterLess;":"\u2277","GreaterSlantEqual;":"\u2A7E","GreaterTilde;":"\u2273","Gscr;":"\u{1D4A2}","gscr;":"\u210A","gsim;":"\u2273","gsime;":"\u2A8E","gsiml;":"\u2A90","GT;":">",GT:">","Gt;":"\u226B","gt;":">",gt:">","gtcc;":"\u2AA7","gtcir;":"\u2A7A","gtdot;":"\u22D7","gtlPar;":"\u2995","gtquest;":"\u2A7C","gtrapprox;":"\u2A86","gtrarr;":"\u2978","gtrdot;":"\u22D7","gtreqless;":"\u22DB","gtreqqless;":"\u2A8C","gtrless;":"\u2277","gtrsim;":"\u2273","gvertneqq;":"\u2269\uFE00","gvnE;":"\u2269\uFE00","Hacek;":"\u02C7","hairsp;":"\u200A","half;":"\xBD","hamilt;":"\u210B","HARDcy;":"\u042A","hardcy;":"\u044A","hArr;":"\u21D4","harr;":"\u2194","harrcir;":"\u2948","harrw;":"\u21AD","Hat;":"^","hbar;":"\u210F","Hcirc;":"\u0124","hcirc;":"\u0125","hearts;":"\u2665","heartsuit;":"\u2665","hellip;":"\u2026","hercon;":"\u22B9","Hfr;":"\u210C","hfr;":"\u{1D525}","HilbertSpace;":"\u210B","hksearow;":"\u2925","hkswarow;":"\u2926","hoarr;":"\u21FF","homtht;":"\u223B","hookleftarrow;":"\u21A9","hookrightarrow;":"\u21AA","Hopf;":"\u210D","hopf;":"\u{1D559}","horbar;":"\u2015","HorizontalLine;":"\u2500","Hscr;":"\u210B","hscr;":"\u{1D4BD}","hslash;":"\u210F","Hstrok;":"\u0126","hstrok;":"\u0127","HumpDownHump;":"\u224E","HumpEqual;":"\u224F","hybull;":"\u2043","hyphen;":"\u2010","Iacute;":"\xCD",Iacute:"\xCD","iacute;":"\xED",iacute:"\xED","ic;":"\u2063","Icirc;":"\xCE",Icirc:"\xCE","icirc;":"\xEE",icirc:"\xEE","Icy;":"\u0418","icy;":"\u0438","Idot;":"\u0130","IEcy;":"\u0415","iecy;":"\u0435","iexcl;":"\xA1",iexcl:"\xA1","iff;":"\u21D4","Ifr;":"\u2111","ifr;":"\u{1D526}","Igrave;":"\xCC",Igrave:"\xCC","igrave;":"\xEC",igrave:"\xEC","ii;":"\u2148","iiiint;":"\u2A0C","iiint;":"\u222D","iinfin;":"\u29DC","iiota;":"\u2129","IJlig;":"\u0132","ijlig;":"\u0133","Im;":"\u2111","Imacr;":"\u012A","imacr;":"\u012B","image;":"\u2111","ImaginaryI;":"\u2148","imagline;":"\u2110","imagpart;":"\u2111","imath;":"\u0131","imof;":"\u22B7","imped;":"\u01B5","Implies;":"\u21D2","in;":"\u2208","incare;":"\u2105","infin;":"\u221E","infintie;":"\u29DD","inodot;":"\u0131","Int;":"\u222C","int;":"\u222B","intcal;":"\u22BA","integers;":"\u2124","Integral;":"\u222B","intercal;":"\u22BA","Intersection;":"\u22C2","intlarhk;":"\u2A17","intprod;":"\u2A3C","InvisibleComma;":"\u2063","InvisibleTimes;":"\u2062","IOcy;":"\u0401","iocy;":"\u0451","Iogon;":"\u012E","iogon;":"\u012F","Iopf;":"\u{1D540}","iopf;":"\u{1D55A}","Iota;":"\u0399","iota;":"\u03B9","iprod;":"\u2A3C","iquest;":"\xBF",iquest:"\xBF","Iscr;":"\u2110","iscr;":"\u{1D4BE}","isin;":"\u2208","isindot;":"\u22F5","isinE;":"\u22F9","isins;":"\u22F4","isinsv;":"\u22F3","isinv;":"\u2208","it;":"\u2062","Itilde;":"\u0128","itilde;":"\u0129","Iukcy;":"\u0406","iukcy;":"\u0456","Iuml;":"\xCF",Iuml:"\xCF","iuml;":"\xEF",iuml:"\xEF","Jcirc;":"\u0134","jcirc;":"\u0135","Jcy;":"\u0419","jcy;":"\u0439","Jfr;":"\u{1D50D}","jfr;":"\u{1D527}","jmath;":"\u0237","Jopf;":"\u{1D541}","jopf;":"\u{1D55B}","Jscr;":"\u{1D4A5}","jscr;":"\u{1D4BF}","Jsercy;":"\u0408","jsercy;":"\u0458","Jukcy;":"\u0404","jukcy;":"\u0454","Kappa;":"\u039A","kappa;":"\u03BA","kappav;":"\u03F0","Kcedil;":"\u0136","kcedil;":"\u0137","Kcy;":"\u041A","kcy;":"\u043A","Kfr;":"\u{1D50E}","kfr;":"\u{1D528}","kgreen;":"\u0138","KHcy;":"\u0425","khcy;":"\u0445","KJcy;":"\u040C","kjcy;":"\u045C","Kopf;":"\u{1D542}","kopf;":"\u{1D55C}","Kscr;":"\u{1D4A6}","kscr;":"\u{1D4C0}","lAarr;":"\u21DA","Lacute;":"\u0139","lacute;":"\u013A","laemptyv;":"\u29B4","lagran;":"\u2112","Lambda;":"\u039B","lambda;":"\u03BB","Lang;":"\u27EA","lang;":"\u27E8","langd;":"\u2991","langle;":"\u27E8","lap;":"\u2A85","Laplacetrf;":"\u2112","laquo;":"\xAB",laquo:"\xAB","Larr;":"\u219E","lArr;":"\u21D0","larr;":"\u2190","larrb;":"\u21E4","larrbfs;":"\u291F","larrfs;":"\u291D","larrhk;":"\u21A9","larrlp;":"\u21AB","larrpl;":"\u2939","larrsim;":"\u2973","larrtl;":"\u21A2","lat;":"\u2AAB","lAtail;":"\u291B","latail;":"\u2919","late;":"\u2AAD","lates;":"\u2AAD\uFE00","lBarr;":"\u290E","lbarr;":"\u290C","lbbrk;":"\u2772","lbrace;":"{","lbrack;":"[","lbrke;":"\u298B","lbrksld;":"\u298F","lbrkslu;":"\u298D","Lcaron;":"\u013D","lcaron;":"\u013E","Lcedil;":"\u013B","lcedil;":"\u013C","lceil;":"\u2308","lcub;":"{","Lcy;":"\u041B","lcy;":"\u043B","ldca;":"\u2936","ldquo;":"\u201C","ldquor;":"\u201E","ldrdhar;":"\u2967","ldrushar;":"\u294B","ldsh;":"\u21B2","lE;":"\u2266","le;":"\u2264","LeftAngleBracket;":"\u27E8","LeftArrow;":"\u2190","Leftarrow;":"\u21D0","leftarrow;":"\u2190","LeftArrowBar;":"\u21E4","LeftArrowRightArrow;":"\u21C6","leftarrowtail;":"\u21A2","LeftCeiling;":"\u2308","LeftDoubleBracket;":"\u27E6","LeftDownTeeVector;":"\u2961","LeftDownVector;":"\u21C3","LeftDownVectorBar;":"\u2959","LeftFloor;":"\u230A","leftharpoondown;":"\u21BD","leftharpoonup;":"\u21BC","leftleftarrows;":"\u21C7","LeftRightArrow;":"\u2194","Leftrightarrow;":"\u21D4","leftrightarrow;":"\u2194","leftrightarrows;":"\u21C6","leftrightharpoons;":"\u21CB","leftrightsquigarrow;":"\u21AD","LeftRightVector;":"\u294E","LeftTee;":"\u22A3","LeftTeeArrow;":"\u21A4","LeftTeeVector;":"\u295A","leftthreetimes;":"\u22CB","LeftTriangle;":"\u22B2","LeftTriangleBar;":"\u29CF","LeftTriangleEqual;":"\u22B4","LeftUpDownVector;":"\u2951","LeftUpTeeVector;":"\u2960","LeftUpVector;":"\u21BF","LeftUpVectorBar;":"\u2958","LeftVector;":"\u21BC","LeftVectorBar;":"\u2952","lEg;":"\u2A8B","leg;":"\u22DA","leq;":"\u2264","leqq;":"\u2266","leqslant;":"\u2A7D","les;":"\u2A7D","lescc;":"\u2AA8","lesdot;":"\u2A7F","lesdoto;":"\u2A81","lesdotor;":"\u2A83","lesg;":"\u22DA\uFE00","lesges;":"\u2A93","lessapprox;":"\u2A85","lessdot;":"\u22D6","lesseqgtr;":"\u22DA","lesseqqgtr;":"\u2A8B","LessEqualGreater;":"\u22DA","LessFullEqual;":"\u2266","LessGreater;":"\u2276","lessgtr;":"\u2276","LessLess;":"\u2AA1","lesssim;":"\u2272","LessSlantEqual;":"\u2A7D","LessTilde;":"\u2272","lfisht;":"\u297C","lfloor;":"\u230A","Lfr;":"\u{1D50F}","lfr;":"\u{1D529}","lg;":"\u2276","lgE;":"\u2A91","lHar;":"\u2962","lhard;":"\u21BD","lharu;":"\u21BC","lharul;":"\u296A","lhblk;":"\u2584","LJcy;":"\u0409","ljcy;":"\u0459","Ll;":"\u22D8","ll;":"\u226A","llarr;":"\u21C7","llcorner;":"\u231E","Lleftarrow;":"\u21DA","llhard;":"\u296B","lltri;":"\u25FA","Lmidot;":"\u013F","lmidot;":"\u0140","lmoust;":"\u23B0","lmoustache;":"\u23B0","lnap;":"\u2A89","lnapprox;":"\u2A89","lnE;":"\u2268","lne;":"\u2A87","lneq;":"\u2A87","lneqq;":"\u2268","lnsim;":"\u22E6","loang;":"\u27EC","loarr;":"\u21FD","lobrk;":"\u27E6","LongLeftArrow;":"\u27F5","Longleftarrow;":"\u27F8","longleftarrow;":"\u27F5","LongLeftRightArrow;":"\u27F7","Longleftrightarrow;":"\u27FA","longleftrightarrow;":"\u27F7","longmapsto;":"\u27FC","LongRightArrow;":"\u27F6","Longrightarrow;":"\u27F9","longrightarrow;":"\u27F6","looparrowleft;":"\u21AB","looparrowright;":"\u21AC","lopar;":"\u2985","Lopf;":"\u{1D543}","lopf;":"\u{1D55D}","loplus;":"\u2A2D","lotimes;":"\u2A34","lowast;":"\u2217","lowbar;":"_","LowerLeftArrow;":"\u2199","LowerRightArrow;":"\u2198","loz;":"\u25CA","lozenge;":"\u25CA","lozf;":"\u29EB","lpar;":"(","lparlt;":"\u2993","lrarr;":"\u21C6","lrcorner;":"\u231F","lrhar;":"\u21CB","lrhard;":"\u296D","lrm;":"\u200E","lrtri;":"\u22BF","lsaquo;":"\u2039","Lscr;":"\u2112","lscr;":"\u{1D4C1}","Lsh;":"\u21B0","lsh;":"\u21B0","lsim;":"\u2272","lsime;":"\u2A8D","lsimg;":"\u2A8F","lsqb;":"[","lsquo;":"\u2018","lsquor;":"\u201A","Lstrok;":"\u0141","lstrok;":"\u0142","LT;":"<",LT:"<","Lt;":"\u226A","lt;":"<",lt:"<","ltcc;":"\u2AA6","ltcir;":"\u2A79","ltdot;":"\u22D6","lthree;":"\u22CB","ltimes;":"\u22C9","ltlarr;":"\u2976","ltquest;":"\u2A7B","ltri;":"\u25C3","ltrie;":"\u22B4","ltrif;":"\u25C2","ltrPar;":"\u2996","lurdshar;":"\u294A","luruhar;":"\u2966","lvertneqq;":"\u2268\uFE00","lvnE;":"\u2268\uFE00","macr;":"\xAF",macr:"\xAF","male;":"\u2642","malt;":"\u2720","maltese;":"\u2720","Map;":"\u2905","map;":"\u21A6","mapsto;":"\u21A6","mapstodown;":"\u21A7","mapstoleft;":"\u21A4","mapstoup;":"\u21A5","marker;":"\u25AE","mcomma;":"\u2A29","Mcy;":"\u041C","mcy;":"\u043C","mdash;":"\u2014","mDDot;":"\u223A","measuredangle;":"\u2221","MediumSpace;":"\u205F","Mellintrf;":"\u2133","Mfr;":"\u{1D510}","mfr;":"\u{1D52A}","mho;":"\u2127","micro;":"\xB5",micro:"\xB5","mid;":"\u2223","midast;":"*","midcir;":"\u2AF0","middot;":"\xB7",middot:"\xB7","minus;":"\u2212","minusb;":"\u229F","minusd;":"\u2238","minusdu;":"\u2A2A","MinusPlus;":"\u2213","mlcp;":"\u2ADB","mldr;":"\u2026","mnplus;":"\u2213","models;":"\u22A7","Mopf;":"\u{1D544}","mopf;":"\u{1D55E}","mp;":"\u2213","Mscr;":"\u2133","mscr;":"\u{1D4C2}","mstpos;":"\u223E","Mu;":"\u039C","mu;":"\u03BC","multimap;":"\u22B8","mumap;":"\u22B8","nabla;":"\u2207","Nacute;":"\u0143","nacute;":"\u0144","nang;":"\u2220\u20D2","nap;":"\u2249","napE;":"\u2A70\u0338","napid;":"\u224B\u0338","napos;":"\u0149","napprox;":"\u2249","natur;":"\u266E","natural;":"\u266E","naturals;":"\u2115","nbsp;":"\xA0",nbsp:"\xA0","nbump;":"\u224E\u0338","nbumpe;":"\u224F\u0338","ncap;":"\u2A43","Ncaron;":"\u0147","ncaron;":"\u0148","Ncedil;":"\u0145","ncedil;":"\u0146","ncong;":"\u2247","ncongdot;":"\u2A6D\u0338","ncup;":"\u2A42","Ncy;":"\u041D","ncy;":"\u043D","ndash;":"\u2013","ne;":"\u2260","nearhk;":"\u2924","neArr;":"\u21D7","nearr;":"\u2197","nearrow;":"\u2197","nedot;":"\u2250\u0338","NegativeMediumSpace;":"\u200B","NegativeThickSpace;":"\u200B","NegativeThinSpace;":"\u200B","NegativeVeryThinSpace;":"\u200B","nequiv;":"\u2262","nesear;":"\u2928","nesim;":"\u2242\u0338","NestedGreaterGreater;":"\u226B","NestedLessLess;":"\u226A","NewLine;":`
+`,"nexist;":"\u2204","nexists;":"\u2204","Nfr;":"\u{1D511}","nfr;":"\u{1D52B}","ngE;":"\u2267\u0338","nge;":"\u2271","ngeq;":"\u2271","ngeqq;":"\u2267\u0338","ngeqslant;":"\u2A7E\u0338","nges;":"\u2A7E\u0338","nGg;":"\u22D9\u0338","ngsim;":"\u2275","nGt;":"\u226B\u20D2","ngt;":"\u226F","ngtr;":"\u226F","nGtv;":"\u226B\u0338","nhArr;":"\u21CE","nharr;":"\u21AE","nhpar;":"\u2AF2","ni;":"\u220B","nis;":"\u22FC","nisd;":"\u22FA","niv;":"\u220B","NJcy;":"\u040A","njcy;":"\u045A","nlArr;":"\u21CD","nlarr;":"\u219A","nldr;":"\u2025","nlE;":"\u2266\u0338","nle;":"\u2270","nLeftarrow;":"\u21CD","nleftarrow;":"\u219A","nLeftrightarrow;":"\u21CE","nleftrightarrow;":"\u21AE","nleq;":"\u2270","nleqq;":"\u2266\u0338","nleqslant;":"\u2A7D\u0338","nles;":"\u2A7D\u0338","nless;":"\u226E","nLl;":"\u22D8\u0338","nlsim;":"\u2274","nLt;":"\u226A\u20D2","nlt;":"\u226E","nltri;":"\u22EA","nltrie;":"\u22EC","nLtv;":"\u226A\u0338","nmid;":"\u2224","NoBreak;":"\u2060","NonBreakingSpace;":"\xA0","Nopf;":"\u2115","nopf;":"\u{1D55F}","Not;":"\u2AEC","not;":"\xAC",not:"\xAC","NotCongruent;":"\u2262","NotCupCap;":"\u226D","NotDoubleVerticalBar;":"\u2226","NotElement;":"\u2209","NotEqual;":"\u2260","NotEqualTilde;":"\u2242\u0338","NotExists;":"\u2204","NotGreater;":"\u226F","NotGreaterEqual;":"\u2271","NotGreaterFullEqual;":"\u2267\u0338","NotGreaterGreater;":"\u226B\u0338","NotGreaterLess;":"\u2279","NotGreaterSlantEqual;":"\u2A7E\u0338","NotGreaterTilde;":"\u2275","NotHumpDownHump;":"\u224E\u0338","NotHumpEqual;":"\u224F\u0338","notin;":"\u2209","notindot;":"\u22F5\u0338","notinE;":"\u22F9\u0338","notinva;":"\u2209","notinvb;":"\u22F7","notinvc;":"\u22F6","NotLeftTriangle;":"\u22EA","NotLeftTriangleBar;":"\u29CF\u0338","NotLeftTriangleEqual;":"\u22EC","NotLess;":"\u226E","NotLessEqual;":"\u2270","NotLessGreater;":"\u2278","NotLessLess;":"\u226A\u0338","NotLessSlantEqual;":"\u2A7D\u0338","NotLessTilde;":"\u2274","NotNestedGreaterGreater;":"\u2AA2\u0338","NotNestedLessLess;":"\u2AA1\u0338","notni;":"\u220C","notniva;":"\u220C","notnivb;":"\u22FE","notnivc;":"\u22FD","NotPrecedes;":"\u2280","NotPrecedesEqual;":"\u2AAF\u0338","NotPrecedesSlantEqual;":"\u22E0","NotReverseElement;":"\u220C","NotRightTriangle;":"\u22EB","NotRightTriangleBar;":"\u29D0\u0338","NotRightTriangleEqual;":"\u22ED","NotSquareSubset;":"\u228F\u0338","NotSquareSubsetEqual;":"\u22E2","NotSquareSuperset;":"\u2290\u0338","NotSquareSupersetEqual;":"\u22E3","NotSubset;":"\u2282\u20D2","NotSubsetEqual;":"\u2288","NotSucceeds;":"\u2281","NotSucceedsEqual;":"\u2AB0\u0338","NotSucceedsSlantEqual;":"\u22E1","NotSucceedsTilde;":"\u227F\u0338","NotSuperset;":"\u2283\u20D2","NotSupersetEqual;":"\u2289","NotTilde;":"\u2241","NotTildeEqual;":"\u2244","NotTildeFullEqual;":"\u2247","NotTildeTilde;":"\u2249","NotVerticalBar;":"\u2224","npar;":"\u2226","nparallel;":"\u2226","nparsl;":"\u2AFD\u20E5","npart;":"\u2202\u0338","npolint;":"\u2A14","npr;":"\u2280","nprcue;":"\u22E0","npre;":"\u2AAF\u0338","nprec;":"\u2280","npreceq;":"\u2AAF\u0338","nrArr;":"\u21CF","nrarr;":"\u219B","nrarrc;":"\u2933\u0338","nrarrw;":"\u219D\u0338","nRightarrow;":"\u21CF","nrightarrow;":"\u219B","nrtri;":"\u22EB","nrtrie;":"\u22ED","nsc;":"\u2281","nsccue;":"\u22E1","nsce;":"\u2AB0\u0338","Nscr;":"\u{1D4A9}","nscr;":"\u{1D4C3}","nshortmid;":"\u2224","nshortparallel;":"\u2226","nsim;":"\u2241","nsime;":"\u2244","nsimeq;":"\u2244","nsmid;":"\u2224","nspar;":"\u2226","nsqsube;":"\u22E2","nsqsupe;":"\u22E3","nsub;":"\u2284","nsubE;":"\u2AC5\u0338","nsube;":"\u2288","nsubset;":"\u2282\u20D2","nsubseteq;":"\u2288","nsubseteqq;":"\u2AC5\u0338","nsucc;":"\u2281","nsucceq;":"\u2AB0\u0338","nsup;":"\u2285","nsupE;":"\u2AC6\u0338","nsupe;":"\u2289","nsupset;":"\u2283\u20D2","nsupseteq;":"\u2289","nsupseteqq;":"\u2AC6\u0338","ntgl;":"\u2279","Ntilde;":"\xD1",Ntilde:"\xD1","ntilde;":"\xF1",ntilde:"\xF1","ntlg;":"\u2278","ntriangleleft;":"\u22EA","ntrianglelefteq;":"\u22EC","ntriangleright;":"\u22EB","ntrianglerighteq;":"\u22ED","Nu;":"\u039D","nu;":"\u03BD","num;":"#","numero;":"\u2116","numsp;":"\u2007","nvap;":"\u224D\u20D2","nVDash;":"\u22AF","nVdash;":"\u22AE","nvDash;":"\u22AD","nvdash;":"\u22AC","nvge;":"\u2265\u20D2","nvgt;":">\u20D2","nvHarr;":"\u2904","nvinfin;":"\u29DE","nvlArr;":"\u2902","nvle;":"\u2264\u20D2","nvlt;":"<\u20D2","nvltrie;":"\u22B4\u20D2","nvrArr;":"\u2903","nvrtrie;":"\u22B5\u20D2","nvsim;":"\u223C\u20D2","nwarhk;":"\u2923","nwArr;":"\u21D6","nwarr;":"\u2196","nwarrow;":"\u2196","nwnear;":"\u2927","Oacute;":"\xD3",Oacute:"\xD3","oacute;":"\xF3",oacute:"\xF3","oast;":"\u229B","ocir;":"\u229A","Ocirc;":"\xD4",Ocirc:"\xD4","ocirc;":"\xF4",ocirc:"\xF4","Ocy;":"\u041E","ocy;":"\u043E","odash;":"\u229D","Odblac;":"\u0150","odblac;":"\u0151","odiv;":"\u2A38","odot;":"\u2299","odsold;":"\u29BC","OElig;":"\u0152","oelig;":"\u0153","ofcir;":"\u29BF","Ofr;":"\u{1D512}","ofr;":"\u{1D52C}","ogon;":"\u02DB","Ograve;":"\xD2",Ograve:"\xD2","ograve;":"\xF2",ograve:"\xF2","ogt;":"\u29C1","ohbar;":"\u29B5","ohm;":"\u03A9","oint;":"\u222E","olarr;":"\u21BA","olcir;":"\u29BE","olcross;":"\u29BB","oline;":"\u203E","olt;":"\u29C0","Omacr;":"\u014C","omacr;":"\u014D","Omega;":"\u03A9","omega;":"\u03C9","Omicron;":"\u039F","omicron;":"\u03BF","omid;":"\u29B6","ominus;":"\u2296","Oopf;":"\u{1D546}","oopf;":"\u{1D560}","opar;":"\u29B7","OpenCurlyDoubleQuote;":"\u201C","OpenCurlyQuote;":"\u2018","operp;":"\u29B9","oplus;":"\u2295","Or;":"\u2A54","or;":"\u2228","orarr;":"\u21BB","ord;":"\u2A5D","order;":"\u2134","orderof;":"\u2134","ordf;":"\xAA",ordf:"\xAA","ordm;":"\xBA",ordm:"\xBA","origof;":"\u22B6","oror;":"\u2A56","orslope;":"\u2A57","orv;":"\u2A5B","oS;":"\u24C8","Oscr;":"\u{1D4AA}","oscr;":"\u2134","Oslash;":"\xD8",Oslash:"\xD8","oslash;":"\xF8",oslash:"\xF8","osol;":"\u2298","Otilde;":"\xD5",Otilde:"\xD5","otilde;":"\xF5",otilde:"\xF5","Otimes;":"\u2A37","otimes;":"\u2297","otimesas;":"\u2A36","Ouml;":"\xD6",Ouml:"\xD6","ouml;":"\xF6",ouml:"\xF6","ovbar;":"\u233D","OverBar;":"\u203E","OverBrace;":"\u23DE","OverBracket;":"\u23B4","OverParenthesis;":"\u23DC","par;":"\u2225","para;":"\xB6",para:"\xB6","parallel;":"\u2225","parsim;":"\u2AF3","parsl;":"\u2AFD","part;":"\u2202","PartialD;":"\u2202","Pcy;":"\u041F","pcy;":"\u043F","percnt;":"%","period;":".","permil;":"\u2030","perp;":"\u22A5","pertenk;":"\u2031","Pfr;":"\u{1D513}","pfr;":"\u{1D52D}","Phi;":"\u03A6","phi;":"\u03C6","phiv;":"\u03D5","phmmat;":"\u2133","phone;":"\u260E","Pi;":"\u03A0","pi;":"\u03C0","pitchfork;":"\u22D4","piv;":"\u03D6","planck;":"\u210F","planckh;":"\u210E","plankv;":"\u210F","plus;":"+","plusacir;":"\u2A23","plusb;":"\u229E","pluscir;":"\u2A22","plusdo;":"\u2214","plusdu;":"\u2A25","pluse;":"\u2A72","PlusMinus;":"\xB1","plusmn;":"\xB1",plusmn:"\xB1","plussim;":"\u2A26","plustwo;":"\u2A27","pm;":"\xB1","Poincareplane;":"\u210C","pointint;":"\u2A15","Popf;":"\u2119","popf;":"\u{1D561}","pound;":"\xA3",pound:"\xA3","Pr;":"\u2ABB","pr;":"\u227A","prap;":"\u2AB7","prcue;":"\u227C","prE;":"\u2AB3","pre;":"\u2AAF","prec;":"\u227A","precapprox;":"\u2AB7","preccurlyeq;":"\u227C","Precedes;":"\u227A","PrecedesEqual;":"\u2AAF","PrecedesSlantEqual;":"\u227C","PrecedesTilde;":"\u227E","preceq;":"\u2AAF","precnapprox;":"\u2AB9","precneqq;":"\u2AB5","precnsim;":"\u22E8","precsim;":"\u227E","Prime;":"\u2033","prime;":"\u2032","primes;":"\u2119","prnap;":"\u2AB9","prnE;":"\u2AB5","prnsim;":"\u22E8","prod;":"\u220F","Product;":"\u220F","profalar;":"\u232E","profline;":"\u2312","profsurf;":"\u2313","prop;":"\u221D","Proportion;":"\u2237","Proportional;":"\u221D","propto;":"\u221D","prsim;":"\u227E","prurel;":"\u22B0","Pscr;":"\u{1D4AB}","pscr;":"\u{1D4C5}","Psi;":"\u03A8","psi;":"\u03C8","puncsp;":"\u2008","Qfr;":"\u{1D514}","qfr;":"\u{1D52E}","qint;":"\u2A0C","Qopf;":"\u211A","qopf;":"\u{1D562}","qprime;":"\u2057","Qscr;":"\u{1D4AC}","qscr;":"\u{1D4C6}","quaternions;":"\u210D","quatint;":"\u2A16","quest;":"?","questeq;":"\u225F","QUOT;":'"',QUOT:'"',"quot;":'"',quot:'"',"rAarr;":"\u21DB","race;":"\u223D\u0331","Racute;":"\u0154","racute;":"\u0155","radic;":"\u221A","raemptyv;":"\u29B3","Rang;":"\u27EB","rang;":"\u27E9","rangd;":"\u2992","range;":"\u29A5","rangle;":"\u27E9","raquo;":"\xBB",raquo:"\xBB","Rarr;":"\u21A0","rArr;":"\u21D2","rarr;":"\u2192","rarrap;":"\u2975","rarrb;":"\u21E5","rarrbfs;":"\u2920","rarrc;":"\u2933","rarrfs;":"\u291E","rarrhk;":"\u21AA","rarrlp;":"\u21AC","rarrpl;":"\u2945","rarrsim;":"\u2974","Rarrtl;":"\u2916","rarrtl;":"\u21A3","rarrw;":"\u219D","rAtail;":"\u291C","ratail;":"\u291A","ratio;":"\u2236","rationals;":"\u211A","RBarr;":"\u2910","rBarr;":"\u290F","rbarr;":"\u290D","rbbrk;":"\u2773","rbrace;":"}","rbrack;":"]","rbrke;":"\u298C","rbrksld;":"\u298E","rbrkslu;":"\u2990","Rcaron;":"\u0158","rcaron;":"\u0159","Rcedil;":"\u0156","rcedil;":"\u0157","rceil;":"\u2309","rcub;":"}","Rcy;":"\u0420","rcy;":"\u0440","rdca;":"\u2937","rdldhar;":"\u2969","rdquo;":"\u201D","rdquor;":"\u201D","rdsh;":"\u21B3","Re;":"\u211C","real;":"\u211C","realine;":"\u211B","realpart;":"\u211C","reals;":"\u211D","rect;":"\u25AD","REG;":"\xAE",REG:"\xAE","reg;":"\xAE",reg:"\xAE","ReverseElement;":"\u220B","ReverseEquilibrium;":"\u21CB","ReverseUpEquilibrium;":"\u296F","rfisht;":"\u297D","rfloor;":"\u230B","Rfr;":"\u211C","rfr;":"\u{1D52F}","rHar;":"\u2964","rhard;":"\u21C1","rharu;":"\u21C0","rharul;":"\u296C","Rho;":"\u03A1","rho;":"\u03C1","rhov;":"\u03F1","RightAngleBracket;":"\u27E9","RightArrow;":"\u2192","Rightarrow;":"\u21D2","rightarrow;":"\u2192","RightArrowBar;":"\u21E5","RightArrowLeftArrow;":"\u21C4","rightarrowtail;":"\u21A3","RightCeiling;":"\u2309","RightDoubleBracket;":"\u27E7","RightDownTeeVector;":"\u295D","RightDownVector;":"\u21C2","RightDownVectorBar;":"\u2955","RightFloor;":"\u230B","rightharpoondown;":"\u21C1","rightharpoonup;":"\u21C0","rightleftarrows;":"\u21C4","rightleftharpoons;":"\u21CC","rightrightarrows;":"\u21C9","rightsquigarrow;":"\u219D","RightTee;":"\u22A2","RightTeeArrow;":"\u21A6","RightTeeVector;":"\u295B","rightthreetimes;":"\u22CC","RightTriangle;":"\u22B3","RightTriangleBar;":"\u29D0","RightTriangleEqual;":"\u22B5","RightUpDownVector;":"\u294F","RightUpTeeVector;":"\u295C","RightUpVector;":"\u21BE","RightUpVectorBar;":"\u2954","RightVector;":"\u21C0","RightVectorBar;":"\u2953","ring;":"\u02DA","risingdotseq;":"\u2253","rlarr;":"\u21C4","rlhar;":"\u21CC","rlm;":"\u200F","rmoust;":"\u23B1","rmoustache;":"\u23B1","rnmid;":"\u2AEE","roang;":"\u27ED","roarr;":"\u21FE","robrk;":"\u27E7","ropar;":"\u2986","Ropf;":"\u211D","ropf;":"\u{1D563}","roplus;":"\u2A2E","rotimes;":"\u2A35","RoundImplies;":"\u2970","rpar;":")","rpargt;":"\u2994","rppolint;":"\u2A12","rrarr;":"\u21C9","Rrightarrow;":"\u21DB","rsaquo;":"\u203A","Rscr;":"\u211B","rscr;":"\u{1D4C7}","Rsh;":"\u21B1","rsh;":"\u21B1","rsqb;":"]","rsquo;":"\u2019","rsquor;":"\u2019","rthree;":"\u22CC","rtimes;":"\u22CA","rtri;":"\u25B9","rtrie;":"\u22B5","rtrif;":"\u25B8","rtriltri;":"\u29CE","RuleDelayed;":"\u29F4","ruluhar;":"\u2968","rx;":"\u211E","Sacute;":"\u015A","sacute;":"\u015B","sbquo;":"\u201A","Sc;":"\u2ABC","sc;":"\u227B","scap;":"\u2AB8","Scaron;":"\u0160","scaron;":"\u0161","sccue;":"\u227D","scE;":"\u2AB4","sce;":"\u2AB0","Scedil;":"\u015E","scedil;":"\u015F","Scirc;":"\u015C","scirc;":"\u015D","scnap;":"\u2ABA","scnE;":"\u2AB6","scnsim;":"\u22E9","scpolint;":"\u2A13","scsim;":"\u227F","Scy;":"\u0421","scy;":"\u0441","sdot;":"\u22C5","sdotb;":"\u22A1","sdote;":"\u2A66","searhk;":"\u2925","seArr;":"\u21D8","searr;":"\u2198","searrow;":"\u2198","sect;":"\xA7",sect:"\xA7","semi;":";","seswar;":"\u2929","setminus;":"\u2216","setmn;":"\u2216","sext;":"\u2736","Sfr;":"\u{1D516}","sfr;":"\u{1D530}","sfrown;":"\u2322","sharp;":"\u266F","SHCHcy;":"\u0429","shchcy;":"\u0449","SHcy;":"\u0428","shcy;":"\u0448","ShortDownArrow;":"\u2193","ShortLeftArrow;":"\u2190","shortmid;":"\u2223","shortparallel;":"\u2225","ShortRightArrow;":"\u2192","ShortUpArrow;":"\u2191","shy;":"\xAD",shy:"\xAD","Sigma;":"\u03A3","sigma;":"\u03C3","sigmaf;":"\u03C2","sigmav;":"\u03C2","sim;":"\u223C","simdot;":"\u2A6A","sime;":"\u2243","simeq;":"\u2243","simg;":"\u2A9E","simgE;":"\u2AA0","siml;":"\u2A9D","simlE;":"\u2A9F","simne;":"\u2246","simplus;":"\u2A24","simrarr;":"\u2972","slarr;":"\u2190","SmallCircle;":"\u2218","smallsetminus;":"\u2216","smashp;":"\u2A33","smeparsl;":"\u29E4","smid;":"\u2223","smile;":"\u2323","smt;":"\u2AAA","smte;":"\u2AAC","smtes;":"\u2AAC\uFE00","SOFTcy;":"\u042C","softcy;":"\u044C","sol;":"/","solb;":"\u29C4","solbar;":"\u233F","Sopf;":"\u{1D54A}","sopf;":"\u{1D564}","spades;":"\u2660","spadesuit;":"\u2660","spar;":"\u2225","sqcap;":"\u2293","sqcaps;":"\u2293\uFE00","sqcup;":"\u2294","sqcups;":"\u2294\uFE00","Sqrt;":"\u221A","sqsub;":"\u228F","sqsube;":"\u2291","sqsubset;":"\u228F","sqsubseteq;":"\u2291","sqsup;":"\u2290","sqsupe;":"\u2292","sqsupset;":"\u2290","sqsupseteq;":"\u2292","squ;":"\u25A1","Square;":"\u25A1","square;":"\u25A1","SquareIntersection;":"\u2293","SquareSubset;":"\u228F","SquareSubsetEqual;":"\u2291","SquareSuperset;":"\u2290","SquareSupersetEqual;":"\u2292","SquareUnion;":"\u2294","squarf;":"\u25AA","squf;":"\u25AA","srarr;":"\u2192","Sscr;":"\u{1D4AE}","sscr;":"\u{1D4C8}","ssetmn;":"\u2216","ssmile;":"\u2323","sstarf;":"\u22C6","Star;":"\u22C6","star;":"\u2606","starf;":"\u2605","straightepsilon;":"\u03F5","straightphi;":"\u03D5","strns;":"\xAF","Sub;":"\u22D0","sub;":"\u2282","subdot;":"\u2ABD","subE;":"\u2AC5","sube;":"\u2286","subedot;":"\u2AC3","submult;":"\u2AC1","subnE;":"\u2ACB","subne;":"\u228A","subplus;":"\u2ABF","subrarr;":"\u2979","Subset;":"\u22D0","subset;":"\u2282","subseteq;":"\u2286","subseteqq;":"\u2AC5","SubsetEqual;":"\u2286","subsetneq;":"\u228A","subsetneqq;":"\u2ACB","subsim;":"\u2AC7","subsub;":"\u2AD5","subsup;":"\u2AD3","succ;":"\u227B","succapprox;":"\u2AB8","succcurlyeq;":"\u227D","Succeeds;":"\u227B","SucceedsEqual;":"\u2AB0","SucceedsSlantEqual;":"\u227D","SucceedsTilde;":"\u227F","succeq;":"\u2AB0","succnapprox;":"\u2ABA","succneqq;":"\u2AB6","succnsim;":"\u22E9","succsim;":"\u227F","SuchThat;":"\u220B","Sum;":"\u2211","sum;":"\u2211","sung;":"\u266A","Sup;":"\u22D1","sup;":"\u2283","sup1;":"\xB9",sup1:"\xB9","sup2;":"\xB2",sup2:"\xB2","sup3;":"\xB3",sup3:"\xB3","supdot;":"\u2ABE","supdsub;":"\u2AD8","supE;":"\u2AC6","supe;":"\u2287","supedot;":"\u2AC4","Superset;":"\u2283","SupersetEqual;":"\u2287","suphsol;":"\u27C9","suphsub;":"\u2AD7","suplarr;":"\u297B","supmult;":"\u2AC2","supnE;":"\u2ACC","supne;":"\u228B","supplus;":"\u2AC0","Supset;":"\u22D1","supset;":"\u2283","supseteq;":"\u2287","supseteqq;":"\u2AC6","supsetneq;":"\u228B","supsetneqq;":"\u2ACC","supsim;":"\u2AC8","supsub;":"\u2AD4","supsup;":"\u2AD6","swarhk;":"\u2926","swArr;":"\u21D9","swarr;":"\u2199","swarrow;":"\u2199","swnwar;":"\u292A","szlig;":"\xDF",szlig:"\xDF","Tab;":"	","target;":"\u2316","Tau;":"\u03A4","tau;":"\u03C4","tbrk;":"\u23B4","Tcaron;":"\u0164","tcaron;":"\u0165","Tcedil;":"\u0162","tcedil;":"\u0163","Tcy;":"\u0422","tcy;":"\u0442","tdot;":"\u20DB","telrec;":"\u2315","Tfr;":"\u{1D517}","tfr;":"\u{1D531}","there4;":"\u2234","Therefore;":"\u2234","therefore;":"\u2234","Theta;":"\u0398","theta;":"\u03B8","thetasym;":"\u03D1","thetav;":"\u03D1","thickapprox;":"\u2248","thicksim;":"\u223C","ThickSpace;":"\u205F\u200A","thinsp;":"\u2009","ThinSpace;":"\u2009","thkap;":"\u2248","thksim;":"\u223C","THORN;":"\xDE",THORN:"\xDE","thorn;":"\xFE",thorn:"\xFE","Tilde;":"\u223C","tilde;":"\u02DC","TildeEqual;":"\u2243","TildeFullEqual;":"\u2245","TildeTilde;":"\u2248","times;":"\xD7",times:"\xD7","timesb;":"\u22A0","timesbar;":"\u2A31","timesd;":"\u2A30","tint;":"\u222D","toea;":"\u2928","top;":"\u22A4","topbot;":"\u2336","topcir;":"\u2AF1","Topf;":"\u{1D54B}","topf;":"\u{1D565}","topfork;":"\u2ADA","tosa;":"\u2929","tprime;":"\u2034","TRADE;":"\u2122","trade;":"\u2122","triangle;":"\u25B5","triangledown;":"\u25BF","triangleleft;":"\u25C3","trianglelefteq;":"\u22B4","triangleq;":"\u225C","triangleright;":"\u25B9","trianglerighteq;":"\u22B5","tridot;":"\u25EC","trie;":"\u225C","triminus;":"\u2A3A","TripleDot;":"\u20DB","triplus;":"\u2A39","trisb;":"\u29CD","tritime;":"\u2A3B","trpezium;":"\u23E2","Tscr;":"\u{1D4AF}","tscr;":"\u{1D4C9}","TScy;":"\u0426","tscy;":"\u0446","TSHcy;":"\u040B","tshcy;":"\u045B","Tstrok;":"\u0166","tstrok;":"\u0167","twixt;":"\u226C","twoheadleftarrow;":"\u219E","twoheadrightarrow;":"\u21A0","Uacute;":"\xDA",Uacute:"\xDA","uacute;":"\xFA",uacute:"\xFA","Uarr;":"\u219F","uArr;":"\u21D1","uarr;":"\u2191","Uarrocir;":"\u2949","Ubrcy;":"\u040E","ubrcy;":"\u045E","Ubreve;":"\u016C","ubreve;":"\u016D","Ucirc;":"\xDB",Ucirc:"\xDB","ucirc;":"\xFB",ucirc:"\xFB","Ucy;":"\u0423","ucy;":"\u0443","udarr;":"\u21C5","Udblac;":"\u0170","udblac;":"\u0171","udhar;":"\u296E","ufisht;":"\u297E","Ufr;":"\u{1D518}","ufr;":"\u{1D532}","Ugrave;":"\xD9",Ugrave:"\xD9","ugrave;":"\xF9",ugrave:"\xF9","uHar;":"\u2963","uharl;":"\u21BF","uharr;":"\u21BE","uhblk;":"\u2580","ulcorn;":"\u231C","ulcorner;":"\u231C","ulcrop;":"\u230F","ultri;":"\u25F8","Umacr;":"\u016A","umacr;":"\u016B","uml;":"\xA8",uml:"\xA8","UnderBar;":"_","UnderBrace;":"\u23DF","UnderBracket;":"\u23B5","UnderParenthesis;":"\u23DD","Union;":"\u22C3","UnionPlus;":"\u228E","Uogon;":"\u0172","uogon;":"\u0173","Uopf;":"\u{1D54C}","uopf;":"\u{1D566}","UpArrow;":"\u2191","Uparrow;":"\u21D1","uparrow;":"\u2191","UpArrowBar;":"\u2912","UpArrowDownArrow;":"\u21C5","UpDownArrow;":"\u2195","Updownarrow;":"\u21D5","updownarrow;":"\u2195","UpEquilibrium;":"\u296E","upharpoonleft;":"\u21BF","upharpoonright;":"\u21BE","uplus;":"\u228E","UpperLeftArrow;":"\u2196","UpperRightArrow;":"\u2197","Upsi;":"\u03D2","upsi;":"\u03C5","upsih;":"\u03D2","Upsilon;":"\u03A5","upsilon;":"\u03C5","UpTee;":"\u22A5","UpTeeArrow;":"\u21A5","upuparrows;":"\u21C8","urcorn;":"\u231D","urcorner;":"\u231D","urcrop;":"\u230E","Uring;":"\u016E","uring;":"\u016F","urtri;":"\u25F9","Uscr;":"\u{1D4B0}","uscr;":"\u{1D4CA}","utdot;":"\u22F0","Utilde;":"\u0168","utilde;":"\u0169","utri;":"\u25B5","utrif;":"\u25B4","uuarr;":"\u21C8","Uuml;":"\xDC",Uuml:"\xDC","uuml;":"\xFC",uuml:"\xFC","uwangle;":"\u29A7","vangrt;":"\u299C","varepsilon;":"\u03F5","varkappa;":"\u03F0","varnothing;":"\u2205","varphi;":"\u03D5","varpi;":"\u03D6","varpropto;":"\u221D","vArr;":"\u21D5","varr;":"\u2195","varrho;":"\u03F1","varsigma;":"\u03C2","varsubsetneq;":"\u228A\uFE00","varsubsetneqq;":"\u2ACB\uFE00","varsupsetneq;":"\u228B\uFE00","varsupsetneqq;":"\u2ACC\uFE00","vartheta;":"\u03D1","vartriangleleft;":"\u22B2","vartriangleright;":"\u22B3","Vbar;":"\u2AEB","vBar;":"\u2AE8","vBarv;":"\u2AE9","Vcy;":"\u0412","vcy;":"\u0432","VDash;":"\u22AB","Vdash;":"\u22A9","vDash;":"\u22A8","vdash;":"\u22A2","Vdashl;":"\u2AE6","Vee;":"\u22C1","vee;":"\u2228","veebar;":"\u22BB","veeeq;":"\u225A","vellip;":"\u22EE","Verbar;":"\u2016","verbar;":"|","Vert;":"\u2016","vert;":"|","VerticalBar;":"\u2223","VerticalLine;":"|","VerticalSeparator;":"\u2758","VerticalTilde;":"\u2240","VeryThinSpace;":"\u200A","Vfr;":"\u{1D519}","vfr;":"\u{1D533}","vltri;":"\u22B2","vnsub;":"\u2282\u20D2","vnsup;":"\u2283\u20D2","Vopf;":"\u{1D54D}","vopf;":"\u{1D567}","vprop;":"\u221D","vrtri;":"\u22B3","Vscr;":"\u{1D4B1}","vscr;":"\u{1D4CB}","vsubnE;":"\u2ACB\uFE00","vsubne;":"\u228A\uFE00","vsupnE;":"\u2ACC\uFE00","vsupne;":"\u228B\uFE00","Vvdash;":"\u22AA","vzigzag;":"\u299A","Wcirc;":"\u0174","wcirc;":"\u0175","wedbar;":"\u2A5F","Wedge;":"\u22C0","wedge;":"\u2227","wedgeq;":"\u2259","weierp;":"\u2118","Wfr;":"\u{1D51A}","wfr;":"\u{1D534}","Wopf;":"\u{1D54E}","wopf;":"\u{1D568}","wp;":"\u2118","wr;":"\u2240","wreath;":"\u2240","Wscr;":"\u{1D4B2}","wscr;":"\u{1D4CC}","xcap;":"\u22C2","xcirc;":"\u25EF","xcup;":"\u22C3","xdtri;":"\u25BD","Xfr;":"\u{1D51B}","xfr;":"\u{1D535}","xhArr;":"\u27FA","xharr;":"\u27F7","Xi;":"\u039E","xi;":"\u03BE","xlArr;":"\u27F8","xlarr;":"\u27F5","xmap;":"\u27FC","xnis;":"\u22FB","xodot;":"\u2A00","Xopf;":"\u{1D54F}","xopf;":"\u{1D569}","xoplus;":"\u2A01","xotime;":"\u2A02","xrArr;":"\u27F9","xrarr;":"\u27F6","Xscr;":"\u{1D4B3}","xscr;":"\u{1D4CD}","xsqcup;":"\u2A06","xuplus;":"\u2A04","xutri;":"\u25B3","xvee;":"\u22C1","xwedge;":"\u22C0","Yacute;":"\xDD",Yacute:"\xDD","yacute;":"\xFD",yacute:"\xFD","YAcy;":"\u042F","yacy;":"\u044F","Ycirc;":"\u0176","ycirc;":"\u0177","Ycy;":"\u042B","ycy;":"\u044B","yen;":"\xA5",yen:"\xA5","Yfr;":"\u{1D51C}","yfr;":"\u{1D536}","YIcy;":"\u0407","yicy;":"\u0457","Yopf;":"\u{1D550}","yopf;":"\u{1D56A}","Yscr;":"\u{1D4B4}","yscr;":"\u{1D4CE}","YUcy;":"\u042E","yucy;":"\u044E","Yuml;":"\u0178","yuml;":"\xFF",yuml:"\xFF","Zacute;":"\u0179","zacute;":"\u017A","Zcaron;":"\u017D","zcaron;":"\u017E","Zcy;":"\u0417","zcy;":"\u0437","Zdot;":"\u017B","zdot;":"\u017C","zeetrf;":"\u2128","ZeroWidthSpace;":"\u200B","Zeta;":"\u0396","zeta;":"\u03B6","Zfr;":"\u2128","zfr;":"\u{1D537}","ZHcy;":"\u0416","zhcy;":"\u0436","zigrarr;":"\u21DD","Zopf;":"\u2124","zopf;":"\u{1D56B}","Zscr;":"\u{1D4B5}","zscr;":"\u{1D4CF}","zwj;":"\u200D","zwnj;":"\u200C"};function ae(t,i){if(t.length<i.length)return!1;for(var o=0;o<i.length;o++)if(t[o]!==i[o])return!1;return!0}function Gt(t,i){var o=t.length-i.length;return o>0?t.lastIndexOf(i)===o:o===0?t===i:!1}function pt(t,i){for(var o="";i>0;)(i&1)===1&&(o+=t),t+=t,i=i>>>1;return o}var Xn=97,Yn=122,$n=65,Qn=90,Zn=48,Kn=57;function fe(t,i){var o=t.charCodeAt(i);return Xn<=o&&o<=Yn||$n<=o&&o<=Qn||Zn<=o&&o<=Kn}function Se(t){return typeof t<"u"}function Vt(t){if(t)return typeof t=="string"?{kind:"markdown",value:t}:{kind:"markdown",value:t.value}}var Ge=function(){function t(i,o){var n=this;this.id=i,this._tags=[],this._tagMap={},this._valueSetMap={},this._tags=o.tags||[],this._globalAttributes=o.globalAttributes||[],this._tags.forEach(function(e){n._tagMap[e.name.toLowerCase()]=e}),o.valueSets&&o.valueSets.forEach(function(e){n._valueSetMap[e.name]=e.values})}return t.prototype.isApplicable=function(){return!0},t.prototype.getId=function(){return this.id},t.prototype.provideTags=function(){return this._tags},t.prototype.provideAttributes=function(i){var o=[],n=function(a){o.push(a)},e=this._tagMap[i.toLowerCase()];return e&&e.attributes.forEach(n),this._globalAttributes.forEach(n),o},t.prototype.provideValues=function(i,o){var n=this,e=[];o=o.toLowerCase();var a=function(l){l.forEach(function(r){r.name.toLowerCase()===o&&(r.values&&r.values.forEach(function(s){e.push(s)}),r.valueSet&&n._valueSetMap[r.valueSet]&&n._valueSetMap[r.valueSet].forEach(function(s){e.push(s)}))})},c=this._tagMap[i.toLowerCase()];return c&&a(c.attributes),a(this._globalAttributes),e},t}();function le(t,i,o){i===void 0&&(i={});var n={kind:o?"markdown":"plaintext",value:""};if(t.description&&i.documentation!==!1){var e=Vt(t.description);e&&(n.value+=e.value)}if(t.references&&t.references.length>0&&i.references!==!1&&(n.value.length&&(n.value+=`
+
+`),o?n.value+=t.references.map(function(a){return"[".concat(a.name,"](").concat(a.url,")")}).join(" | "):n.value+=t.references.map(function(a){return"".concat(a.name,": ").concat(a.url)}).join(`
+`)),n.value!=="")return n}var Jt=function(t,i,o,n){function e(a){return a instanceof o?a:new o(function(c){c(a)})}return new(o||(o=Promise))(function(a,c){function l(u){try{s(n.next(u))}catch(h){c(h)}}function r(u){try{s(n.throw(u))}catch(h){c(h)}}function s(u){u.done?a(u.value):e(u.value).then(l,r)}s((n=n.apply(t,i||[])).next())})},Xt=function(t,i){var o={label:0,sent:function(){if(a[0]&1)throw a[1];return a[1]},trys:[],ops:[]},n,e,a,c;return c={next:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(c[Symbol.iterator]=function(){return this}),c;function l(s){return function(u){return r([s,u])}}function r(s){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,e&&(a=s[0]&2?e.return:s[0]?e.throw||((a=e.return)&&a.call(e),0):e.next)&&!(a=a.call(e,s[1])).done)return a;switch(e=0,a&&(s=[s[0]&2,a.value]),s[0]){case 0:case 1:a=s;break;case 4:return o.label++,{value:s[1],done:!1};case 5:o.label++,e=s[1],s=[0];continue;case 7:s=o.ops.pop(),o.trys.pop();continue;default:if(a=o.trys,!(a=a.length>0&&a[a.length-1])&&(s[0]===6||s[0]===2)){o=0;continue}if(s[0]===3&&(!a||s[1]>a[0]&&s[1]<a[3])){o.label=s[1];break}if(s[0]===6&&o.label<a[1]){o.label=a[1],a=s;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(s);break}a[2]&&o.ops.pop(),o.trys.pop();continue}s=i.call(t,o)}catch(u){s=[6,u],e=0}finally{n=a=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},Yt=function(){function t(i){this.readDirectory=i,this.atributeCompletions=[]}return t.prototype.onHtmlAttributeValue=function(i){ri(i.tag,i.attribute)&&this.atributeCompletions.push(i)},t.prototype.computeCompletions=function(i,o){return Jt(this,void 0,void 0,function(){var n,e,a,c,l,r,s,u,h,d;return Xt(this,function(g){switch(g.label){case 0:n={items:[],isIncomplete:!1},e=0,a=this.atributeCompletions,g.label=1;case 1:return e<a.length?(c=a[e],l=ni(i.getText(c.range)),ii(l)?l==="."||l===".."?(n.isIncomplete=!0,[3,4]):[3,2]:[3,4]):[3,5];case 2:return r=ai(c.value,l,c.range),[4,this.providePathSuggestions(c.value,r,i,o)];case 3:for(s=g.sent(),u=0,h=s;u<h.length;u++)d=h[u],n.items.push(d);g.label=4;case 4:return e++,[3,1];case 5:return[2,n]}})})},t.prototype.providePathSuggestions=function(i,o,n,e){return Jt(this,void 0,void 0,function(){var a,c,l,r,s,u,h,d,g,y;return Xt(this,function(m){switch(m.label){case 0:if(a=i.substring(0,i.lastIndexOf("/")+1),c=e.resolveReference(a||".",n.uri),!c)return[3,4];m.label=1;case 1:return m.trys.push([1,3,,4]),l=[],[4,this.readDirectory(c)];case 2:for(r=m.sent(),s=0,u=r;s<u.length;s++)h=u[s],d=h[0],g=h[1],d.charCodeAt(0)!==ti&&l.push(oi(d,g===Oe.Directory,o));return[2,l];case 3:return y=m.sent(),[3,4];case 4:return[2,[]]}})})},t}();var ti=46;function ni(t){return ae(t,"'")||ae(t,'"')?t.slice(1,-1):t}function ii(t){return!(ae(t,"http")||ae(t,"https")||ae(t,"//"))}function ri(t,i){if(i==="src"||i==="href")return!0;var o=li[t];return o?typeof o=="string"?o===i:o.indexOf(i)!==-1:!1}function ai(t,i,o){var n,e=t.lastIndexOf("/");if(e===-1)n=si(o,1,-1);else{var a=i.slice(e+1),c=Re(o.end,-1-a.length),l=a.indexOf(" "),r=void 0;l!==-1?r=Re(c,l):r=Re(o.end,-1),n=P.create(c,r)}return n}function oi(t,i,o){return i?(t=t+"/",{label:t,kind:Q.Folder,textEdit:Y.replace(o,t),command:{title:"Suggest",command:"editor.action.triggerSuggest"}}):{label:t,kind:Q.File,textEdit:Y.replace(o,t)}}function Re(t,i){return X.create(t.line,t.character+i)}function si(t,i,o){var n=Re(t.start,i),e=Re(t.end,o);return P.create(n,e)}var li={a:"href",area:"href",body:"background",del:"cite",form:"action",frame:["src","longdesc"],img:["src","longdesc"],ins:"cite",link:"href",object:"data",q:"cite",script:"src",audio:"src",button:"formaction",command:"icon",embed:"src",html:"manifest",input:["src","formaction"],source:"src",track:"src",video:["src","poster"]};var ui=function(t,i,o,n){function e(a){return a instanceof o?a:new o(function(c){c(a)})}return new(o||(o=Promise))(function(a,c){function l(u){try{s(n.next(u))}catch(h){c(h)}}function r(u){try{s(n.throw(u))}catch(h){c(h)}}function s(u){u.done?a(u.value):e(u.value).then(l,r)}s((n=n.apply(t,i||[])).next())})},ci=function(t,i){var o={label:0,sent:function(){if(a[0]&1)throw a[1];return a[1]},trys:[],ops:[]},n,e,a,c;return c={next:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(c[Symbol.iterator]=function(){return this}),c;function l(s){return function(u){return r([s,u])}}function r(s){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,e&&(a=s[0]&2?e.return:s[0]?e.throw||((a=e.return)&&a.call(e),0):e.next)&&!(a=a.call(e,s[1])).done)return a;switch(e=0,a&&(s=[s[0]&2,a.value]),s[0]){case 0:case 1:a=s;break;case 4:return o.label++,{value:s[1],done:!1};case 5:o.label++,e=s[1],s=[0];continue;case 7:s=o.ops.pop(),o.trys.pop();continue;default:if(a=o.trys,!(a=a.length>0&&a[a.length-1])&&(s[0]===6||s[0]===2)){o=0;continue}if(s[0]===3&&(!a||s[1]>a[0]&&s[1]<a[3])){o.label=s[1];break}if(s[0]===6&&o.label<a[1]){o.label=a[1],a=s;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(s);break}a[2]&&o.ops.pop(),o.trys.pop();continue}s=i.call(t,o)}catch(u){s=[6,u],e=0}finally{n=a=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}},hi=ge(),Qt=function(){function t(i,o){this.lsOptions=i,this.dataManager=o,this.completionParticipants=[]}return t.prototype.setCompletionParticipants=function(i){this.completionParticipants=i||[]},t.prototype.doComplete2=function(i,o,n,e,a){return ui(this,void 0,void 0,function(){var c,l,r,s;return ci(this,function(u){switch(u.label){case 0:if(!this.lsOptions.fileSystemProvider||!this.lsOptions.fileSystemProvider.readDirectory)return[2,this.doComplete(i,o,n,a)];c=new Yt(this.lsOptions.fileSystemProvider.readDirectory),l=this.completionParticipants,this.completionParticipants=[c].concat(l),r=this.doComplete(i,o,n,a),u.label=1;case 1:return u.trys.push([1,,3,4]),[4,c.computeCompletions(i,e)];case 2:return s=u.sent(),[2,{isIncomplete:r.isIncomplete||s.isIncomplete,items:s.items.concat(r.items)}];case 3:return this.completionParticipants=l,[7];case 4:return[2]}})})},t.prototype.doComplete=function(i,o,n,e){var a=this._doComplete(i,o,n,e);return this.convertCompletionList(a)},t.prototype._doComplete=function(i,o,n,e){var a={isIncomplete:!1,items:[]},c=this.completionParticipants,l=this.dataManager.getDataProviders().filter(function(x){return x.isApplicable(i.languageId)&&(!e||e[x.getId()]!==!1)}),r=this.doesSupportMarkdown(),s=i.getText(),u=i.offsetAt(o),h=n.findNodeBefore(u);if(!h)return a;var d=$(s,h.start),g="",y;function m(x,D){return D===void 0&&(D=u),x>u&&(x=u),{start:i.positionAt(x),end:i.positionAt(D)}}function A(x,D){var L=m(x,D);return l.forEach(function(q){q.provideTags().forEach(function(j){a.items.push({label:j.name,kind:Q.Property,documentation:le(j,void 0,r),textEdit:Y.replace(L,j.name),insertTextFormat:ne.PlainText})})}),a}function E(x){for(var D=x;D>0;){var L=s.charAt(D-1);if(`
+\r`.indexOf(L)>=0)return s.substring(D,x);if(!Ve(L))return null;D--}return s.substring(0,x)}function w(x,D,L){L===void 0&&(L=u);var q=m(x,L),j=$t(s,L,W.WithinEndTag,S.EndTagClose)?"":">",O=h;for(D&&(O=O.parent);O;){var V=O.tag;if(V&&(!O.closed||O.endTagStart&&O.endTagStart>u)){var K={label:"/"+V,kind:Q.Property,filterText:"/"+V,textEdit:Y.replace(q,"/"+V+j),insertTextFormat:ne.PlainText},oe=E(O.start),ue=E(x-1);if(oe!==null&&ue!==null&&oe!==ue){var te=oe+"</"+V+j;K.textEdit=Y.replace(m(x-1-ue.length),te),K.filterText=ue+"</"+V}return a.items.push(K),a}O=O.parent}return D||l.forEach(function(de){de.provideTags().forEach(function(re){a.items.push({label:"/"+re.name,kind:Q.Property,documentation:le(re,void 0,r),filterText:"/"+re.name+j,textEdit:Y.replace(q,"/"+re.name+j),insertTextFormat:ne.PlainText})})}),a}function M(x,D){if(e&&e.hideAutoCompleteProposals)return a;if(!pe(D)){var L=i.positionAt(x);a.items.push({label:"</"+D+">",kind:Q.Property,filterText:"</"+D+">",textEdit:Y.insert(L,"$0</"+D+">"),insertTextFormat:ne.Snippet})}return a}function B(x,D){return A(x,D),w(x,!0,D),a}function G(){var x=Object.create(null);return h.attributeNames.forEach(function(D){x[D]=!0}),x}function J(x,D){var L;D===void 0&&(D=u);for(var q=u;q<D&&s[q]!=="<";)q++;var j=s.substring(x,D),O=m(x,q),V="";if(!$t(s,D,W.AfterAttributeName,S.DelimiterAssign)){var K=(L=e?.attributeDefaultValue)!==null&&L!==void 0?L:"doublequotes";K==="empty"?V="=$1":K==="singlequotes"?V="='$1'":V='="$1"'}var oe=G();return oe[j]=!1,l.forEach(function(ue){ue.provideAttributes(g).forEach(function(te){if(!oe[te.name]){oe[te.name]=!0;var de=te.name,re;te.valueSet!=="v"&&V.length&&(de=de+V,(te.valueSet||te.name==="style")&&(re={title:"Suggest",command:"editor.action.triggerSuggest"})),a.items.push({label:te.name,kind:te.valueSet==="handler"?Q.Function:Q.Value,documentation:le(te,void 0,r),textEdit:Y.replace(O,de),insertTextFormat:ne.Snippet,command:re})}})}),f(O,oe),a}function f(x,D){var L="data-",q={};q[L]="".concat(L,'$1="$2"');function j(O){O.attributeNames.forEach(function(V){ae(V,L)&&!q[V]&&!D[V]&&(q[V]=V+'="$1"')}),O.children.forEach(function(V){return j(V)})}n&&n.roots.forEach(function(O){return j(O)}),Object.keys(q).forEach(function(O){return a.items.push({label:O,kind:Q.Value,textEdit:Y.replace(x,q[O]),insertTextFormat:ne.Snippet})})}function p(x,D){D===void 0&&(D=u);var L,q,j;if(u>x&&u<=D&&di(s[x])){var O=x+1,V=D;D>x&&s[D-1]===s[x]&&V--;var K=pi(s,u,O),oe=mi(s,u,V);L=m(K,oe),j=u>=O&&u<=V?s.substring(O,u):"",q=!1}else L=m(x,D),j=s.substring(x,u),q=!0;if(c.length>0)for(var ue=g.toLowerCase(),te=y.toLowerCase(),de=m(x,D),re=0,vt=c;re<vt.length;re++){var wt=vt[re];wt.onHtmlAttributeValue&&wt.onHtmlAttributeValue({document:i,position:o,tag:ue,attribute:te,value:j,range:de})}return l.forEach(function(An){An.provideValues(g,y).forEach(function(ze){var _t=q?'"'+ze.name+'"':ze.name;a.items.push({label:ze.name,filterText:_t,kind:Q.Unit,documentation:le(ze,void 0,r),textEdit:Y.replace(L,_t),insertTextFormat:ne.PlainText})})}),R(),a}function b(x){return u===d.getTokenEnd()&&(H=d.scan(),H===x&&d.getTokenOffset()===u)?d.getTokenEnd():u}function N(){for(var x=0,D=c;x<D.length;x++){var L=D[x];L.onHtmlContent&&L.onHtmlContent({document:i,position:o})}return R()}function R(){for(var x=u-1,D=o.character;x>=0&&fe(s,x);)x--,D--;if(x>=0&&s[x]==="&"){var L=P.create(X.create(o.line,D-1),o);for(var q in me)if(Gt(q,";")){var j="&"+q;a.items.push({label:j,kind:Q.Keyword,documentation:hi("entity.propose","Character entity representing '".concat(me[q],"'")),textEdit:Y.replace(L,j),insertTextFormat:ne.PlainText})}}return a}function U(x,D){var L=m(x,D);a.items.push({label:"!DOCTYPE",kind:Q.Property,documentation:"A preamble for an HTML document.",textEdit:Y.replace(L,"!DOCTYPE html>"),insertTextFormat:ne.PlainText})}for(var H=d.scan();H!==S.EOS&&d.getTokenOffset()<=u;){switch(H){case S.StartTagOpen:if(d.getTokenEnd()===u){var z=b(S.StartTag);return o.line===0&&U(u,z),B(u,z)}break;case S.StartTag:if(d.getTokenOffset()<=u&&u<=d.getTokenEnd())return A(d.getTokenOffset(),d.getTokenEnd());g=d.getTokenText();break;case S.AttributeName:if(d.getTokenOffset()<=u&&u<=d.getTokenEnd())return J(d.getTokenOffset(),d.getTokenEnd());y=d.getTokenText();break;case S.DelimiterAssign:if(d.getTokenEnd()===u){var z=b(S.AttributeValue);return p(u,z)}break;case S.AttributeValue:if(d.getTokenOffset()<=u&&u<=d.getTokenEnd())return p(d.getTokenOffset(),d.getTokenEnd());break;case S.Whitespace:if(u<=d.getTokenEnd())switch(d.getScannerState()){case W.AfterOpeningStartTag:var I=d.getTokenOffset(),F=b(S.StartTag);return B(I,F);case W.WithinTag:case W.AfterAttributeName:return J(d.getTokenEnd());case W.BeforeAttributeValue:return p(d.getTokenEnd());case W.AfterOpeningEndTag:return w(d.getTokenOffset()-1,!1);case W.WithinContent:return N()}break;case S.EndTagOpen:if(u<=d.getTokenEnd()){var T=d.getTokenOffset()+1,v=b(S.EndTag);return w(T,!1,v)}break;case S.EndTag:if(u<=d.getTokenEnd())for(var k=d.getTokenOffset()-1;k>=0;){var C=s.charAt(k);if(C==="/")return w(k,!1,d.getTokenEnd());if(!Ve(C))break;k--}break;case S.StartTagClose:if(u<=d.getTokenEnd()&&g)return M(d.getTokenEnd(),g);break;case S.Content:if(u<=d.getTokenEnd())return N();break;default:if(u<=d.getTokenEnd())return a;break}H=d.scan()}return a},t.prototype.doQuoteComplete=function(i,o,n,e){var a,c=i.offsetAt(o);if(c<=0)return null;var l=(a=e?.attributeDefaultValue)!==null&&a!==void 0?a:"doublequotes";if(l==="empty")return null;var r=i.getText().charAt(c-1);if(r!=="=")return null;var s=l==="doublequotes"?'"$1"':"'$1'",u=n.findNodeBefore(c);if(u&&u.attributes&&u.start<c&&(!u.endTagStart||u.endTagStart>c))for(var h=$(i.getText(),u.start),d=h.scan();d!==S.EOS&&h.getTokenEnd()<=c;){if(d===S.AttributeName&&h.getTokenEnd()===c-1)return d=h.scan(),d!==S.DelimiterAssign||(d=h.scan(),d===S.Unknown||d===S.AttributeValue)?null:s;d=h.scan()}return null},t.prototype.doTagComplete=function(i,o,n){var e=i.offsetAt(o);if(e<=0)return null;var a=i.getText().charAt(e-1);if(a===">"){var c=n.findNodeBefore(e);if(c&&c.tag&&!pe(c.tag)&&c.start<e&&(!c.endTagStart||c.endTagStart>e))for(var l=$(i.getText(),c.start),r=l.scan();r!==S.EOS&&l.getTokenEnd()<=e;){if(r===S.StartTagClose&&l.getTokenEnd()===e)return"$0</".concat(c.tag,">");r=l.scan()}}else if(a==="/"){for(var c=n.findNodeBefore(e);c&&c.closed&&!(c.endTagStart&&c.endTagStart>e);)c=c.parent;if(c&&c.tag)for(var l=$(i.getText(),c.start),r=l.scan();r!==S.EOS&&l.getTokenEnd()<=e;){if(r===S.EndTagOpen&&l.getTokenEnd()===e)return"".concat(c.tag,">");r=l.scan()}}return null},t.prototype.convertCompletionList=function(i){return this.doesSupportMarkdown()||i.items.forEach(function(o){o.documentation&&typeof o.documentation!="string"&&(o.documentation={kind:"plaintext",value:o.documentation.value})}),i},t.prototype.doesSupportMarkdown=function(){var i,o,n;if(!Se(this.supportsMarkdown)){if(!Se(this.lsOptions.clientCapabilities))return this.supportsMarkdown=!0,this.supportsMarkdown;var e=(n=(o=(i=this.lsOptions.clientCapabilities.textDocument)===null||i===void 0?void 0:i.completion)===null||o===void 0?void 0:o.completionItem)===null||n===void 0?void 0:n.documentationFormat;this.supportsMarkdown=Array.isArray(e)&&e.indexOf(ee.Markdown)!==-1}return this.supportsMarkdown},t}();function di(t){return/^["']*$/.test(t)}function Ve(t){return/^\s*$/.test(t)}function $t(t,i,o,n){for(var e=$(t,i,o),a=e.scan();a===S.Whitespace;)a=e.scan();return a===n}function pi(t,i,o){for(;i>o&&!Ve(t[i-1]);)i--;return i}function mi(t,i,o){for(;i<o&&!Ve(t[i]);)i++;return i}var fi=ge(),Zt=function(){function t(i,o){this.lsOptions=i,this.dataManager=o}return t.prototype.doHover=function(i,o,n,e){var a=this.convertContents.bind(this),c=this.doesSupportMarkdown(),l=i.offsetAt(o),r=n.findNodeAt(l),s=i.getText();if(!r||!r.tag)return null;var u=this.dataManager.getDataProviders().filter(function(U){return U.isApplicable(i.languageId)});function h(U,H,z){for(var I=function(C){var x=null;if(C.provideTags().forEach(function(D){if(D.name.toLowerCase()===U.toLowerCase()){var L=le(D,e,c);L||(L={kind:c?"markdown":"plaintext",value:""}),x={contents:L,range:H}}}),x)return x.contents=a(x.contents),{value:x}},F=0,T=u;F<T.length;F++){var v=T[F],k=I(v);if(typeof k=="object")return k.value}return null}function d(U,H,z){for(var I=function(C){var x=null;if(C.provideAttributes(U).forEach(function(D){if(H===D.name&&D.description){var L=le(D,e,c);L?x={contents:L,range:z}:x=null}}),x)return x.contents=a(x.contents),{value:x}},F=0,T=u;F<T.length;F++){var v=T[F],k=I(v);if(typeof k=="object")return k.value}return null}function g(U,H,z,I){for(var F=function(x){var D=null;if(x.provideValues(U,H).forEach(function(L){if(z===L.name&&L.description){var q=le(L,e,c);q?D={contents:q,range:I}:D=null}}),D)return D.contents=a(D.contents),{value:D}},T=0,v=u;T<v.length;T++){var k=v[T],C=F(k);if(typeof C=="object")return C.value}return null}function y(U,H){var z=E(U);for(var I in me){var F=null,T="&"+I;if(z===T){var v=me[I].charCodeAt(0).toString(16).toUpperCase(),k="U+";if(v.length<4)for(var C=4-v.length,x=0;x<C;)k+="0",x+=1;k+=v;var D=fi("entity.propose","Character entity representing '".concat(me[I],"', unicode equivalent '").concat(k,"'"));D?F={contents:D,range:H}:F=null}if(F)return F.contents=a(F.contents),F}return null}function m(U,H){for(var z=$(i.getText(),H),I=z.scan();I!==S.EOS&&(z.getTokenEnd()<l||z.getTokenEnd()===l&&I!==U);)I=z.scan();return I===U&&l<=z.getTokenEnd()?{start:i.positionAt(z.getTokenOffset()),end:i.positionAt(z.getTokenEnd())}:null}function A(){for(var U=l-1,H=o.character;U>=0&&fe(s,U);)U--,H--;for(var z=U+1,I=H;fe(s,z);)z++,I++;if(U>=0&&s[U]==="&"){var F=null;return s[z]===";"?F=P.create(X.create(o.line,H),X.create(o.line,I+1)):F=P.create(X.create(o.line,H),X.create(o.line,I)),F}return null}function E(U){for(var H=l-1,z="&";H>=0&&fe(U,H);)H--;for(H=H+1;fe(U,H);)z+=U[H],H+=1;return z+=";",z}if(r.endTagStart&&l>=r.endTagStart){var w=m(S.EndTag,r.endTagStart);return w?h(r.tag,w,!1):null}var M=m(S.StartTag,r.start);if(M)return h(r.tag,M,!0);var B=m(S.AttributeName,r.start);if(B){var G=r.tag,J=i.getText(B);return d(G,J,B)}var f=A();if(f)return y(s,f);function p(U,H){for(var z=$(i.getText(),U),I=z.scan(),F=void 0;I!==S.EOS&&z.getTokenEnd()<=H;)I=z.scan(),I===S.AttributeName&&(F=z.getTokenText());return F}var b=m(S.AttributeValue,r.start);if(b){var G=r.tag,N=gi(i.getText(b)),R=p(r.start,i.offsetAt(b.start));if(R)return g(G,R,N,b)}return null},t.prototype.convertContents=function(i){if(!this.doesSupportMarkdown()){if(typeof i=="string")return i;if("kind"in i)return{kind:"plaintext",value:i.value};if(Array.isArray(i))i.map(function(o){return typeof o=="string"?o:o.value});else return i.value}return i},t.prototype.doesSupportMarkdown=function(){var i,o,n;if(!Se(this.supportsMarkdown)){if(!Se(this.lsOptions.clientCapabilities))return this.supportsMarkdown=!0,this.supportsMarkdown;var e=(n=(o=(i=this.lsOptions.clientCapabilities)===null||i===void 0?void 0:i.textDocument)===null||o===void 0?void 0:o.hover)===null||n===void 0?void 0:n.contentFormat;this.supportsMarkdown=Array.isArray(e)&&e.indexOf(ee.Markdown)!==-1}return this.supportsMarkdown},t}();function gi(t){return t.length<=1?t.replace(/['"]/,""):((t[0]==="'"||t[0]==='"')&&(t=t.slice(1)),(t[t.length-1]==="'"||t[t.length-1]==='"')&&(t=t.slice(0,-1)),t)}function Kt(t,i){return t}var en;(function(){"use strict";var t=[,,function(e){function a(r){this.__parent=r,this.__character_count=0,this.__indent_count=-1,this.__alignment_count=0,this.__wrap_point_index=0,this.__wrap_point_character_count=0,this.__wrap_point_indent_count=-1,this.__wrap_point_alignment_count=0,this.__items=[]}a.prototype.clone_empty=function(){var r=new a(this.__parent);return r.set_indent(this.__indent_count,this.__alignment_count),r},a.prototype.item=function(r){return r<0?this.__items[this.__items.length+r]:this.__items[r]},a.prototype.has_match=function(r){for(var s=this.__items.length-1;s>=0;s--)if(this.__items[s].match(r))return!0;return!1},a.prototype.set_indent=function(r,s){this.is_empty()&&(this.__indent_count=r||0,this.__alignment_count=s||0,this.__character_count=this.__parent.get_indent_size(this.__indent_count,this.__alignment_count))},a.prototype._set_wrap_point=function(){this.__parent.wrap_line_length&&(this.__wrap_point_index=this.__items.length,this.__wrap_point_character_count=this.__character_count,this.__wrap_point_indent_count=this.__parent.next_line.__indent_count,this.__wrap_point_alignment_count=this.__parent.next_line.__alignment_count)},a.prototype._should_wrap=function(){return this.__wrap_point_index&&this.__character_count>this.__parent.wrap_line_length&&this.__wrap_point_character_count>this.__parent.next_line.__character_count},a.prototype._allow_wrap=function(){if(this._should_wrap()){this.__parent.add_new_line();var r=this.__parent.current_line;return r.set_indent(this.__wrap_point_indent_count,this.__wrap_point_alignment_count),r.__items=this.__items.slice(this.__wrap_point_index),this.__items=this.__items.slice(0,this.__wrap_point_index),r.__character_count+=this.__character_count-this.__wrap_point_character_count,this.__character_count=this.__wrap_point_character_count,r.__items[0]===" "&&(r.__items.splice(0,1),r.__character_count-=1),!0}return!1},a.prototype.is_empty=function(){return this.__items.length===0},a.prototype.last=function(){return this.is_empty()?null:this.__items[this.__items.length-1]},a.prototype.push=function(r){this.__items.push(r);var s=r.lastIndexOf(`
+`);s!==-1?this.__character_count=r.length-s:this.__character_count+=r.length},a.prototype.pop=function(){var r=null;return this.is_empty()||(r=this.__items.pop(),this.__character_count-=r.length),r},a.prototype._remove_indent=function(){this.__indent_count>0&&(this.__indent_count-=1,this.__character_count-=this.__parent.indent_size)},a.prototype._remove_wrap_indent=function(){this.__wrap_point_indent_count>0&&(this.__wrap_point_indent_count-=1)},a.prototype.trim=function(){for(;this.last()===" ";)this.__items.pop(),this.__character_count-=1},a.prototype.toString=function(){var r="";return this.is_empty()?this.__parent.indent_empty_lines&&(r=this.__parent.get_indent_string(this.__indent_count)):(r=this.__parent.get_indent_string(this.__indent_count,this.__alignment_count),r+=this.__items.join("")),r};function c(r,s){this.__cache=[""],this.__indent_size=r.indent_size,this.__indent_string=r.indent_char,r.indent_with_tabs||(this.__indent_string=new Array(r.indent_size+1).join(r.indent_char)),s=s||"",r.indent_level>0&&(s=new Array(r.indent_level+1).join(this.__indent_string)),this.__base_string=s,this.__base_string_length=s.length}c.prototype.get_indent_size=function(r,s){var u=this.__base_string_length;return s=s||0,r<0&&(u=0),u+=r*this.__indent_size,u+=s,u},c.prototype.get_indent_string=function(r,s){var u=this.__base_string;return s=s||0,r<0&&(r=0,u=""),s+=r*this.__indent_size,this.__ensure_cache(s),u+=this.__cache[s],u},c.prototype.__ensure_cache=function(r){for(;r>=this.__cache.length;)this.__add_column()},c.prototype.__add_column=function(){var r=this.__cache.length,s=0,u="";this.__indent_size&&r>=this.__indent_size&&(s=Math.floor(r/this.__indent_size),r-=s*this.__indent_size,u=new Array(s+1).join(this.__indent_string)),r&&(u+=new Array(r+1).join(" ")),this.__cache.push(u)};function l(r,s){this.__indent_cache=new c(r,s),this.raw=!1,this._end_with_newline=r.end_with_newline,this.indent_size=r.indent_size,this.wrap_line_length=r.wrap_line_length,this.indent_empty_lines=r.indent_empty_lines,this.__lines=[],this.previous_line=null,this.current_line=null,this.next_line=new a(this),this.space_before_token=!1,this.non_breaking_space=!1,this.previous_token_wrapped=!1,this.__add_outputline()}l.prototype.__add_outputline=function(){this.previous_line=this.current_line,this.current_line=this.next_line.clone_empty(),this.__lines.push(this.current_line)},l.prototype.get_line_number=function(){return this.__lines.length},l.prototype.get_indent_string=function(r,s){return this.__indent_cache.get_indent_string(r,s)},l.prototype.get_indent_size=function(r,s){return this.__indent_cache.get_indent_size(r,s)},l.prototype.is_empty=function(){return!this.previous_line&&this.current_line.is_empty()},l.prototype.add_new_line=function(r){return this.is_empty()||!r&&this.just_added_newline()?!1:(this.raw||this.__add_outputline(),!0)},l.prototype.get_code=function(r){this.trim(!0);var s=this.current_line.pop();s&&(s[s.length-1]===`
+`&&(s=s.replace(/\n+$/g,"")),this.current_line.push(s)),this._end_with_newline&&this.__add_outputline();var u=this.__lines.join(`
+`);return r!==`
+`&&(u=u.replace(/[\n]/g,r)),u},l.prototype.set_wrap_point=function(){this.current_line._set_wrap_point()},l.prototype.set_indent=function(r,s){return r=r||0,s=s||0,this.next_line.set_indent(r,s),this.__lines.length>1?(this.current_line.set_indent(r,s),!0):(this.current_line.set_indent(),!1)},l.prototype.add_raw_token=function(r){for(var s=0;s<r.newlines;s++)this.__add_outputline();this.current_line.set_indent(-1),this.current_line.push(r.whitespace_before),this.current_line.push(r.text),this.space_before_token=!1,this.non_breaking_space=!1,this.previous_token_wrapped=!1},l.prototype.add_token=function(r){this.__add_space_before_token(),this.current_line.push(r),this.space_before_token=!1,this.non_breaking_space=!1,this.previous_token_wrapped=this.current_line._allow_wrap()},l.prototype.__add_space_before_token=function(){this.space_before_token&&!this.just_added_newline()&&(this.non_breaking_space||this.set_wrap_point(),this.current_line.push(" "))},l.prototype.remove_indent=function(r){for(var s=this.__lines.length;r<s;)this.__lines[r]._remove_indent(),r++;this.current_line._remove_wrap_indent()},l.prototype.trim=function(r){for(r=r===void 0?!1:r,this.current_line.trim();r&&this.__lines.length>1&&this.current_line.is_empty();)this.__lines.pop(),this.current_line=this.__lines[this.__lines.length-1],this.current_line.trim();this.previous_line=this.__lines.length>1?this.__lines[this.__lines.length-2]:null},l.prototype.just_added_newline=function(){return this.current_line.is_empty()},l.prototype.just_added_blankline=function(){return this.is_empty()||this.current_line.is_empty()&&this.previous_line.is_empty()},l.prototype.ensure_empty_line_above=function(r,s){for(var u=this.__lines.length-2;u>=0;){var h=this.__lines[u];if(h.is_empty())break;if(h.item(0).indexOf(r)!==0&&h.item(-1)!==s){this.__lines.splice(u+1,0,new a(this)),this.previous_line=this.__lines[this.__lines.length-2];break}u--}},e.exports.Output=l},,,,function(e){function a(r,s){this.raw_options=c(r,s),this.disabled=this._get_boolean("disabled"),this.eol=this._get_characters("eol","auto"),this.end_with_newline=this._get_boolean("end_with_newline"),this.indent_size=this._get_number("indent_size",4),this.indent_char=this._get_characters("indent_char"," "),this.indent_level=this._get_number("indent_level"),this.preserve_newlines=this._get_boolean("preserve_newlines",!0),this.max_preserve_newlines=this._get_number("max_preserve_newlines",32786),this.preserve_newlines||(this.max_preserve_newlines=0),this.indent_with_tabs=this._get_boolean("indent_with_tabs",this.indent_char==="	"),this.indent_with_tabs&&(this.indent_char="	",this.indent_size===1&&(this.indent_size=4)),this.wrap_line_length=this._get_number("wrap_line_length",this._get_number("max_char")),this.indent_empty_lines=this._get_boolean("indent_empty_lines"),this.templating=this._get_selection_list("templating",["auto","none","django","erb","handlebars","php","smarty"],["auto"])}a.prototype._get_array=function(r,s){var u=this.raw_options[r],h=s||[];return typeof u=="object"?u!==null&&typeof u.concat=="function"&&(h=u.concat()):typeof u=="string"&&(h=u.split(/[^a-zA-Z0-9_\/\-]+/)),h},a.prototype._get_boolean=function(r,s){var u=this.raw_options[r],h=u===void 0?!!s:!!u;return h},a.prototype._get_characters=function(r,s){var u=this.raw_options[r],h=s||"";return typeof u=="string"&&(h=u.replace(/\\r/,"\r").replace(/\\n/,`
+`).replace(/\\t/,"	")),h},a.prototype._get_number=function(r,s){var u=this.raw_options[r];s=parseInt(s,10),isNaN(s)&&(s=0);var h=parseInt(u,10);return isNaN(h)&&(h=s),h},a.prototype._get_selection=function(r,s,u){var h=this._get_selection_list(r,s,u);if(h.length!==1)throw new Error("Invalid Option Value: The option '"+r+`' can only be one of the following values:
+`+s+`
+You passed in: '`+this.raw_options[r]+"'");return h[0]},a.prototype._get_selection_list=function(r,s,u){if(!s||s.length===0)throw new Error("Selection list cannot be empty.");if(u=u||[s[0]],!this._is_valid_selection(u,s))throw new Error("Invalid Default Value!");var h=this._get_array(r,u);if(!this._is_valid_selection(h,s))throw new Error("Invalid Option Value: The option '"+r+`' can contain only the following values:
+`+s+`
+You passed in: '`+this.raw_options[r]+"'");return h},a.prototype._is_valid_selection=function(r,s){return r.length&&s.length&&!r.some(function(u){return s.indexOf(u)===-1})};function c(r,s){var u={};r=l(r);var h;for(h in r)h!==s&&(u[h]=r[h]);if(s&&r[s])for(h in r[s])u[h]=r[s][h];return u}function l(r){var s={},u;for(u in r){var h=u.replace(/-/g,"_");s[h]=r[u]}return s}e.exports.Options=a,e.exports.normalizeOpts=l,e.exports.mergeOpts=c},,function(e){var a=RegExp.prototype.hasOwnProperty("sticky");function c(l){this.__input=l||"",this.__input_length=this.__input.length,this.__position=0}c.prototype.restart=function(){this.__position=0},c.prototype.back=function(){this.__position>0&&(this.__position-=1)},c.prototype.hasNext=function(){return this.__position<this.__input_length},c.prototype.next=function(){var l=null;return this.hasNext()&&(l=this.__input.charAt(this.__position),this.__position+=1),l},c.prototype.peek=function(l){var r=null;return l=l||0,l+=this.__position,l>=0&&l<this.__input_length&&(r=this.__input.charAt(l)),r},c.prototype.__match=function(l,r){l.lastIndex=r;var s=l.exec(this.__input);return s&&!(a&&l.sticky)&&s.index!==r&&(s=null),s},c.prototype.test=function(l,r){return r=r||0,r+=this.__position,r>=0&&r<this.__input_length?!!this.__match(l,r):!1},c.prototype.testChar=function(l,r){var s=this.peek(r);return l.lastIndex=0,s!==null&&l.test(s)},c.prototype.match=function(l){var r=this.__match(l,this.__position);return r?this.__position+=r[0].length:r=null,r},c.prototype.read=function(l,r,s){var u="",h;return l&&(h=this.match(l),h&&(u+=h[0])),r&&(h||!l)&&(u+=this.readUntil(r,s)),u},c.prototype.readUntil=function(l,r){var s="",u=this.__position;l.lastIndex=this.__position;var h=l.exec(this.__input);return h?(u=h.index,r&&(u+=h[0].length)):u=this.__input_length,s=this.__input.substring(this.__position,u),this.__position=u,s},c.prototype.readUntilAfter=function(l){return this.readUntil(l,!0)},c.prototype.get_regexp=function(l,r){var s=null,u="g";return r&&a&&(u="y"),typeof l=="string"&&l!==""?s=new RegExp(l,u):l&&(s=new RegExp(l.source,u)),s},c.prototype.get_literal_regexp=function(l){return RegExp(l.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"))},c.prototype.peekUntilAfter=function(l){var r=this.__position,s=this.readUntilAfter(l);return this.__position=r,s},c.prototype.lookBack=function(l){var r=this.__position-1;return r>=l.length&&this.__input.substring(r-l.length,r).toLowerCase()===l},e.exports.InputScanner=c},,,,,function(e){function a(c,l){c=typeof c=="string"?c:c.source,l=typeof l=="string"?l:l.source,this.__directives_block_pattern=new RegExp(c+/ beautify( \w+[:]\w+)+ /.source+l,"g"),this.__directive_pattern=/ (\w+)[:](\w+)/g,this.__directives_end_ignore_pattern=new RegExp(c+/\sbeautify\signore:end\s/.source+l,"g")}a.prototype.get_directives=function(c){if(!c.match(this.__directives_block_pattern))return null;var l={};this.__directive_pattern.lastIndex=0;for(var r=this.__directive_pattern.exec(c);r;)l[r[1]]=r[2],r=this.__directive_pattern.exec(c);return l},a.prototype.readIgnored=function(c){return c.readUntilAfter(this.__directives_end_ignore_pattern)},e.exports.Directives=a},,function(e,a,c){var l=c(16).Beautifier,r=c(17).Options;function s(u,h){var d=new l(u,h);return d.beautify()}e.exports=s,e.exports.defaultOptions=function(){return new r}},function(e,a,c){var l=c(17).Options,r=c(2).Output,s=c(8).InputScanner,u=c(13).Directives,h=new u(/\/\*/,/\*\//),d=/\r\n|[\r\n]/,g=/\r\n|[\r\n]/g,y=/\s/,m=/(?:\s|\n)+/g,A=/\/\*(?:[\s\S]*?)((?:\*\/)|$)/g,E=/\/\/(?:[^\n\r\u2028\u2029]*)/g;function w(M,B){this._source_text=M||"",this._options=new l(B),this._ch=null,this._input=null,this.NESTED_AT_RULE={"@page":!0,"@font-face":!0,"@keyframes":!0,"@media":!0,"@supports":!0,"@document":!0},this.CONDITIONAL_GROUP_RULE={"@media":!0,"@supports":!0,"@document":!0}}w.prototype.eatString=function(M){var B="";for(this._ch=this._input.next();this._ch;){if(B+=this._ch,this._ch==="\\")B+=this._input.next();else if(M.indexOf(this._ch)!==-1||this._ch===`
+`)break;this._ch=this._input.next()}return B},w.prototype.eatWhitespace=function(M){for(var B=y.test(this._input.peek()),G=0;y.test(this._input.peek());)this._ch=this._input.next(),M&&this._ch===`
+`&&(G===0||G<this._options.max_preserve_newlines)&&(G++,this._output.add_new_line(!0));return B},w.prototype.foundNestedPseudoClass=function(){for(var M=0,B=1,G=this._input.peek(B);G;){if(G==="{")return!0;if(G==="(")M+=1;else if(G===")"){if(M===0)return!1;M-=1}else if(G===";"||G==="}")return!1;B++,G=this._input.peek(B)}return!1},w.prototype.print_string=function(M){this._output.set_indent(this._indentLevel),this._output.non_breaking_space=!0,this._output.add_token(M)},w.prototype.preserveSingleSpace=function(M){M&&(this._output.space_before_token=!0)},w.prototype.indent=function(){this._indentLevel++},w.prototype.outdent=function(){this._indentLevel>0&&this._indentLevel--},w.prototype.beautify=function(){if(this._options.disabled)return this._source_text;var M=this._source_text,B=this._options.eol;B==="auto"&&(B=`
+`,M&&d.test(M||"")&&(B=M.match(d)[0])),M=M.replace(g,`
+`);var G=M.match(/^[\t ]*/)[0];this._output=new r(this._options,G),this._input=new s(M),this._indentLevel=0,this._nestedLevel=0,this._ch=null;for(var J=0,f=!1,p=!1,b=!1,N=!1,R=!1,U=this._ch,H,z,I;H=this._input.read(m),z=H!=="",I=U,this._ch=this._input.next(),this._ch==="\\"&&this._input.hasNext()&&(this._ch+=this._input.next()),U=this._ch,this._ch;)if(this._ch==="/"&&this._input.peek()==="*"){this._output.add_new_line(),this._input.back();var F=this._input.read(A),T=h.get_directives(F);T&&T.ignore==="start"&&(F+=h.readIgnored(this._input)),this.print_string(F),this.eatWhitespace(!0),this._output.add_new_line()}else if(this._ch==="/"&&this._input.peek()==="/")this._output.space_before_token=!0,this._input.back(),this.print_string(this._input.read(E)),this.eatWhitespace(!0);else if(this._ch==="@")if(this.preserveSingleSpace(z),this._input.peek()==="{")this.print_string(this._ch+this.eatString("}"));else{this.print_string(this._ch);var v=this._input.peekUntilAfter(/[: ,;{}()[\]\/='"]/g);v.match(/[ :]$/)&&(v=this.eatString(": ").replace(/\s$/,""),this.print_string(v),this._output.space_before_token=!0),v=v.replace(/\s$/,""),v==="extend"?N=!0:v==="import"&&(R=!0),v in this.NESTED_AT_RULE?(this._nestedLevel+=1,v in this.CONDITIONAL_GROUP_RULE&&(b=!0)):!f&&J===0&&v.indexOf(":")!==-1&&(p=!0,this.indent())}else this._ch==="#"&&this._input.peek()==="{"?(this.preserveSingleSpace(z),this.print_string(this._ch+this.eatString("}"))):this._ch==="{"?(p&&(p=!1,this.outdent()),b?(b=!1,f=this._indentLevel>=this._nestedLevel):f=this._indentLevel>=this._nestedLevel-1,this._options.newline_between_rules&&f&&this._output.previous_line&&this._output.previous_line.item(-1)!=="{"&&this._output.ensure_empty_line_above("/",","),this._output.space_before_token=!0,this._options.brace_style==="expand"?(this._output.add_new_line(),this.print_string(this._ch),this.indent(),this._output.set_indent(this._indentLevel)):(this.indent(),this.print_string(this._ch)),this.eatWhitespace(!0),this._output.add_new_line()):this._ch==="}"?(this.outdent(),this._output.add_new_line(),I==="{"&&this._output.trim(!0),R=!1,N=!1,p&&(this.outdent(),p=!1),this.print_string(this._ch),f=!1,this._nestedLevel&&this._nestedLevel--,this.eatWhitespace(!0),this._output.add_new_line(),this._options.newline_between_rules&&!this._output.just_added_blankline()&&this._input.peek()!=="}"&&this._output.add_new_line(!0)):this._ch===":"?(f||b)&&!(this._input.lookBack("&")||this.foundNestedPseudoClass())&&!this._input.lookBack("(")&&!N&&J===0?(this.print_string(":"),p||(p=!0,this._output.space_before_token=!0,this.eatWhitespace(!0),this.indent())):(this._input.lookBack(" ")&&(this._output.space_before_token=!0),this._input.peek()===":"?(this._ch=this._input.next(),this.print_string("::")):this.print_string(":")):this._ch==='"'||this._ch==="'"?(this.preserveSingleSpace(z),this.print_string(this._ch+this.eatString(this._ch)),this.eatWhitespace(!0)):this._ch===";"?J===0?(p&&(this.outdent(),p=!1),N=!1,R=!1,this.print_string(this._ch),this.eatWhitespace(!0),this._input.peek()!=="/"&&this._output.add_new_line()):(this.print_string(this._ch),this.eatWhitespace(!0),this._output.space_before_token=!0):this._ch==="("?this._input.lookBack("url")?(this.print_string(this._ch),this.eatWhitespace(),J++,this.indent(),this._ch=this._input.next(),this._ch===")"||this._ch==='"'||this._ch==="'"?this._input.back():this._ch&&(this.print_string(this._ch+this.eatString(")")),J&&(J--,this.outdent()))):(this.preserveSingleSpace(z),this.print_string(this._ch),this.eatWhitespace(),J++,this.indent()):this._ch===")"?(J&&(J--,this.outdent()),this.print_string(this._ch)):this._ch===","?(this.print_string(this._ch),this.eatWhitespace(!0),this._options.selector_separator_newline&&!p&&J===0&&!R&&!N?this._output.add_new_line():this._output.space_before_token=!0):(this._ch===">"||this._ch==="+"||this._ch==="~")&&!p&&J===0?this._options.space_around_combinator?(this._output.space_before_token=!0,this.print_string(this._ch),this._output.space_before_token=!0):(this.print_string(this._ch),this.eatWhitespace(),this._ch&&y.test(this._ch)&&(this._ch="")):this._ch==="]"?this.print_string(this._ch):this._ch==="["?(this.preserveSingleSpace(z),this.print_string(this._ch)):this._ch==="="?(this.eatWhitespace(),this.print_string("="),y.test(this._ch)&&(this._ch="")):this._ch==="!"&&!this._input.lookBack("\\")?(this.print_string(" "),this.print_string(this._ch)):(this.preserveSingleSpace(z),this.print_string(this._ch));var k=this._output.get_code(B);return k},e.exports.Beautifier=w},function(e,a,c){var l=c(6).Options;function r(s){l.call(this,s,"css"),this.selector_separator_newline=this._get_boolean("selector_separator_newline",!0),this.newline_between_rules=this._get_boolean("newline_between_rules",!0);var u=this._get_boolean("space_around_selector_separator");this.space_around_combinator=this._get_boolean("space_around_combinator")||u;var h=this._get_selection_list("brace_style",["collapse","expand","end-expand","none","preserve-inline"]);this.brace_style="collapse";for(var d=0;d<h.length;d++)h[d]!=="expand"?this.brace_style="collapse":this.brace_style=h[d]}r.prototype=new l,e.exports.Options=r}],i={};function o(e){var a=i[e];if(a!==void 0)return a.exports;var c=i[e]={exports:{}};return t[e](c,c.exports,o),c.exports}var n=o(15);en=n})();var tn=en;var nn;(function(){"use strict";var t=[,,function(e){function a(r){this.__parent=r,this.__character_count=0,this.__indent_count=-1,this.__alignment_count=0,this.__wrap_point_index=0,this.__wrap_point_character_count=0,this.__wrap_point_indent_count=-1,this.__wrap_point_alignment_count=0,this.__items=[]}a.prototype.clone_empty=function(){var r=new a(this.__parent);return r.set_indent(this.__indent_count,this.__alignment_count),r},a.prototype.item=function(r){return r<0?this.__items[this.__items.length+r]:this.__items[r]},a.prototype.has_match=function(r){for(var s=this.__items.length-1;s>=0;s--)if(this.__items[s].match(r))return!0;return!1},a.prototype.set_indent=function(r,s){this.is_empty()&&(this.__indent_count=r||0,this.__alignment_count=s||0,this.__character_count=this.__parent.get_indent_size(this.__indent_count,this.__alignment_count))},a.prototype._set_wrap_point=function(){this.__parent.wrap_line_length&&(this.__wrap_point_index=this.__items.length,this.__wrap_point_character_count=this.__character_count,this.__wrap_point_indent_count=this.__parent.next_line.__indent_count,this.__wrap_point_alignment_count=this.__parent.next_line.__alignment_count)},a.prototype._should_wrap=function(){return this.__wrap_point_index&&this.__character_count>this.__parent.wrap_line_length&&this.__wrap_point_character_count>this.__parent.next_line.__character_count},a.prototype._allow_wrap=function(){if(this._should_wrap()){this.__parent.add_new_line();var r=this.__parent.current_line;return r.set_indent(this.__wrap_point_indent_count,this.__wrap_point_alignment_count),r.__items=this.__items.slice(this.__wrap_point_index),this.__items=this.__items.slice(0,this.__wrap_point_index),r.__character_count+=this.__character_count-this.__wrap_point_character_count,this.__character_count=this.__wrap_point_character_count,r.__items[0]===" "&&(r.__items.splice(0,1),r.__character_count-=1),!0}return!1},a.prototype.is_empty=function(){return this.__items.length===0},a.prototype.last=function(){return this.is_empty()?null:this.__items[this.__items.length-1]},a.prototype.push=function(r){this.__items.push(r);var s=r.lastIndexOf(`
+`);s!==-1?this.__character_count=r.length-s:this.__character_count+=r.length},a.prototype.pop=function(){var r=null;return this.is_empty()||(r=this.__items.pop(),this.__character_count-=r.length),r},a.prototype._remove_indent=function(){this.__indent_count>0&&(this.__indent_count-=1,this.__character_count-=this.__parent.indent_size)},a.prototype._remove_wrap_indent=function(){this.__wrap_point_indent_count>0&&(this.__wrap_point_indent_count-=1)},a.prototype.trim=function(){for(;this.last()===" ";)this.__items.pop(),this.__character_count-=1},a.prototype.toString=function(){var r="";return this.is_empty()?this.__parent.indent_empty_lines&&(r=this.__parent.get_indent_string(this.__indent_count)):(r=this.__parent.get_indent_string(this.__indent_count,this.__alignment_count),r+=this.__items.join("")),r};function c(r,s){this.__cache=[""],this.__indent_size=r.indent_size,this.__indent_string=r.indent_char,r.indent_with_tabs||(this.__indent_string=new Array(r.indent_size+1).join(r.indent_char)),s=s||"",r.indent_level>0&&(s=new Array(r.indent_level+1).join(this.__indent_string)),this.__base_string=s,this.__base_string_length=s.length}c.prototype.get_indent_size=function(r,s){var u=this.__base_string_length;return s=s||0,r<0&&(u=0),u+=r*this.__indent_size,u+=s,u},c.prototype.get_indent_string=function(r,s){var u=this.__base_string;return s=s||0,r<0&&(r=0,u=""),s+=r*this.__indent_size,this.__ensure_cache(s),u+=this.__cache[s],u},c.prototype.__ensure_cache=function(r){for(;r>=this.__cache.length;)this.__add_column()},c.prototype.__add_column=function(){var r=this.__cache.length,s=0,u="";this.__indent_size&&r>=this.__indent_size&&(s=Math.floor(r/this.__indent_size),r-=s*this.__indent_size,u=new Array(s+1).join(this.__indent_string)),r&&(u+=new Array(r+1).join(" ")),this.__cache.push(u)};function l(r,s){this.__indent_cache=new c(r,s),this.raw=!1,this._end_with_newline=r.end_with_newline,this.indent_size=r.indent_size,this.wrap_line_length=r.wrap_line_length,this.indent_empty_lines=r.indent_empty_lines,this.__lines=[],this.previous_line=null,this.current_line=null,this.next_line=new a(this),this.space_before_token=!1,this.non_breaking_space=!1,this.previous_token_wrapped=!1,this.__add_outputline()}l.prototype.__add_outputline=function(){this.previous_line=this.current_line,this.current_line=this.next_line.clone_empty(),this.__lines.push(this.current_line)},l.prototype.get_line_number=function(){return this.__lines.length},l.prototype.get_indent_string=function(r,s){return this.__indent_cache.get_indent_string(r,s)},l.prototype.get_indent_size=function(r,s){return this.__indent_cache.get_indent_size(r,s)},l.prototype.is_empty=function(){return!this.previous_line&&this.current_line.is_empty()},l.prototype.add_new_line=function(r){return this.is_empty()||!r&&this.just_added_newline()?!1:(this.raw||this.__add_outputline(),!0)},l.prototype.get_code=function(r){this.trim(!0);var s=this.current_line.pop();s&&(s[s.length-1]===`
+`&&(s=s.replace(/\n+$/g,"")),this.current_line.push(s)),this._end_with_newline&&this.__add_outputline();var u=this.__lines.join(`
+`);return r!==`
+`&&(u=u.replace(/[\n]/g,r)),u},l.prototype.set_wrap_point=function(){this.current_line._set_wrap_point()},l.prototype.set_indent=function(r,s){return r=r||0,s=s||0,this.next_line.set_indent(r,s),this.__lines.length>1?(this.current_line.set_indent(r,s),!0):(this.current_line.set_indent(),!1)},l.prototype.add_raw_token=function(r){for(var s=0;s<r.newlines;s++)this.__add_outputline();this.current_line.set_indent(-1),this.current_line.push(r.whitespace_before),this.current_line.push(r.text),this.space_before_token=!1,this.non_breaking_space=!1,this.previous_token_wrapped=!1},l.prototype.add_token=function(r){this.__add_space_before_token(),this.current_line.push(r),this.space_before_token=!1,this.non_breaking_space=!1,this.previous_token_wrapped=this.current_line._allow_wrap()},l.prototype.__add_space_before_token=function(){this.space_before_token&&!this.just_added_newline()&&(this.non_breaking_space||this.set_wrap_point(),this.current_line.push(" "))},l.prototype.remove_indent=function(r){for(var s=this.__lines.length;r<s;)this.__lines[r]._remove_indent(),r++;this.current_line._remove_wrap_indent()},l.prototype.trim=function(r){for(r=r===void 0?!1:r,this.current_line.trim();r&&this.__lines.length>1&&this.current_line.is_empty();)this.__lines.pop(),this.current_line=this.__lines[this.__lines.length-1],this.current_line.trim();this.previous_line=this.__lines.length>1?this.__lines[this.__lines.length-2]:null},l.prototype.just_added_newline=function(){return this.current_line.is_empty()},l.prototype.just_added_blankline=function(){return this.is_empty()||this.current_line.is_empty()&&this.previous_line.is_empty()},l.prototype.ensure_empty_line_above=function(r,s){for(var u=this.__lines.length-2;u>=0;){var h=this.__lines[u];if(h.is_empty())break;if(h.item(0).indexOf(r)!==0&&h.item(-1)!==s){this.__lines.splice(u+1,0,new a(this)),this.previous_line=this.__lines[this.__lines.length-2];break}u--}},e.exports.Output=l},function(e){function a(c,l,r,s){this.type=c,this.text=l,this.comments_before=null,this.newlines=r||0,this.whitespace_before=s||"",this.parent=null,this.next=null,this.previous=null,this.opened=null,this.closed=null,this.directives=null}e.exports.Token=a},,,function(e){function a(r,s){this.raw_options=c(r,s),this.disabled=this._get_boolean("disabled"),this.eol=this._get_characters("eol","auto"),this.end_with_newline=this._get_boolean("end_with_newline"),this.indent_size=this._get_number("indent_size",4),this.indent_char=this._get_characters("indent_char"," "),this.indent_level=this._get_number("indent_level"),this.preserve_newlines=this._get_boolean("preserve_newlines",!0),this.max_preserve_newlines=this._get_number("max_preserve_newlines",32786),this.preserve_newlines||(this.max_preserve_newlines=0),this.indent_with_tabs=this._get_boolean("indent_with_tabs",this.indent_char==="	"),this.indent_with_tabs&&(this.indent_char="	",this.indent_size===1&&(this.indent_size=4)),this.wrap_line_length=this._get_number("wrap_line_length",this._get_number("max_char")),this.indent_empty_lines=this._get_boolean("indent_empty_lines"),this.templating=this._get_selection_list("templating",["auto","none","django","erb","handlebars","php","smarty"],["auto"])}a.prototype._get_array=function(r,s){var u=this.raw_options[r],h=s||[];return typeof u=="object"?u!==null&&typeof u.concat=="function"&&(h=u.concat()):typeof u=="string"&&(h=u.split(/[^a-zA-Z0-9_\/\-]+/)),h},a.prototype._get_boolean=function(r,s){var u=this.raw_options[r],h=u===void 0?!!s:!!u;return h},a.prototype._get_characters=function(r,s){var u=this.raw_options[r],h=s||"";return typeof u=="string"&&(h=u.replace(/\\r/,"\r").replace(/\\n/,`
+`).replace(/\\t/,"	")),h},a.prototype._get_number=function(r,s){var u=this.raw_options[r];s=parseInt(s,10),isNaN(s)&&(s=0);var h=parseInt(u,10);return isNaN(h)&&(h=s),h},a.prototype._get_selection=function(r,s,u){var h=this._get_selection_list(r,s,u);if(h.length!==1)throw new Error("Invalid Option Value: The option '"+r+`' can only be one of the following values:
+`+s+`
+You passed in: '`+this.raw_options[r]+"'");return h[0]},a.prototype._get_selection_list=function(r,s,u){if(!s||s.length===0)throw new Error("Selection list cannot be empty.");if(u=u||[s[0]],!this._is_valid_selection(u,s))throw new Error("Invalid Default Value!");var h=this._get_array(r,u);if(!this._is_valid_selection(h,s))throw new Error("Invalid Option Value: The option '"+r+`' can contain only the following values:
+`+s+`
+You passed in: '`+this.raw_options[r]+"'");return h},a.prototype._is_valid_selection=function(r,s){return r.length&&s.length&&!r.some(function(u){return s.indexOf(u)===-1})};function c(r,s){var u={};r=l(r);var h;for(h in r)h!==s&&(u[h]=r[h]);if(s&&r[s])for(h in r[s])u[h]=r[s][h];return u}function l(r){var s={},u;for(u in r){var h=u.replace(/-/g,"_");s[h]=r[u]}return s}e.exports.Options=a,e.exports.normalizeOpts=l,e.exports.mergeOpts=c},,function(e){var a=RegExp.prototype.hasOwnProperty("sticky");function c(l){this.__input=l||"",this.__input_length=this.__input.length,this.__position=0}c.prototype.restart=function(){this.__position=0},c.prototype.back=function(){this.__position>0&&(this.__position-=1)},c.prototype.hasNext=function(){return this.__position<this.__input_length},c.prototype.next=function(){var l=null;return this.hasNext()&&(l=this.__input.charAt(this.__position),this.__position+=1),l},c.prototype.peek=function(l){var r=null;return l=l||0,l+=this.__position,l>=0&&l<this.__input_length&&(r=this.__input.charAt(l)),r},c.prototype.__match=function(l,r){l.lastIndex=r;var s=l.exec(this.__input);return s&&!(a&&l.sticky)&&s.index!==r&&(s=null),s},c.prototype.test=function(l,r){return r=r||0,r+=this.__position,r>=0&&r<this.__input_length?!!this.__match(l,r):!1},c.prototype.testChar=function(l,r){var s=this.peek(r);return l.lastIndex=0,s!==null&&l.test(s)},c.prototype.match=function(l){var r=this.__match(l,this.__position);return r?this.__position+=r[0].length:r=null,r},c.prototype.read=function(l,r,s){var u="",h;return l&&(h=this.match(l),h&&(u+=h[0])),r&&(h||!l)&&(u+=this.readUntil(r,s)),u},c.prototype.readUntil=function(l,r){var s="",u=this.__position;l.lastIndex=this.__position;var h=l.exec(this.__input);return h?(u=h.index,r&&(u+=h[0].length)):u=this.__input_length,s=this.__input.substring(this.__position,u),this.__position=u,s},c.prototype.readUntilAfter=function(l){return this.readUntil(l,!0)},c.prototype.get_regexp=function(l,r){var s=null,u="g";return r&&a&&(u="y"),typeof l=="string"&&l!==""?s=new RegExp(l,u):l&&(s=new RegExp(l.source,u)),s},c.prototype.get_literal_regexp=function(l){return RegExp(l.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"))},c.prototype.peekUntilAfter=function(l){var r=this.__position,s=this.readUntilAfter(l);return this.__position=r,s},c.prototype.lookBack=function(l){var r=this.__position-1;return r>=l.length&&this.__input.substring(r-l.length,r).toLowerCase()===l},e.exports.InputScanner=c},function(e,a,c){var l=c(8).InputScanner,r=c(3).Token,s=c(10).TokenStream,u=c(11).WhitespacePattern,h={START:"TK_START",RAW:"TK_RAW",EOF:"TK_EOF"},d=function(g,y){this._input=new l(g),this._options=y||{},this.__tokens=null,this._patterns={},this._patterns.whitespace=new u(this._input)};d.prototype.tokenize=function(){this._input.restart(),this.__tokens=new s,this._reset();for(var g,y=new r(h.START,""),m=null,A=[],E=new s;y.type!==h.EOF;){for(g=this._get_next_token(y,m);this._is_comment(g);)E.add(g),g=this._get_next_token(y,m);E.isEmpty()||(g.comments_before=E,E=new s),g.parent=m,this._is_opening(g)?(A.push(m),m=g):m&&this._is_closing(g,m)&&(g.opened=m,m.closed=g,m=A.pop(),g.parent=m),g.previous=y,y.next=g,this.__tokens.add(g),y=g}return this.__tokens},d.prototype._is_first_token=function(){return this.__tokens.isEmpty()},d.prototype._reset=function(){},d.prototype._get_next_token=function(g,y){this._readWhitespace();var m=this._input.read(/.+/g);return m?this._create_token(h.RAW,m):this._create_token(h.EOF,"")},d.prototype._is_comment=function(g){return!1},d.prototype._is_opening=function(g){return!1},d.prototype._is_closing=function(g,y){return!1},d.prototype._create_token=function(g,y){var m=new r(g,y,this._patterns.whitespace.newline_count,this._patterns.whitespace.whitespace_before_token);return m},d.prototype._readWhitespace=function(){return this._patterns.whitespace.read()},e.exports.Tokenizer=d,e.exports.TOKEN=h},function(e){function a(c){this.__tokens=[],this.__tokens_length=this.__tokens.length,this.__position=0,this.__parent_token=c}a.prototype.restart=function(){this.__position=0},a.prototype.isEmpty=function(){return this.__tokens_length===0},a.prototype.hasNext=function(){return this.__position<this.__tokens_length},a.prototype.next=function(){var c=null;return this.hasNext()&&(c=this.__tokens[this.__position],this.__position+=1),c},a.prototype.peek=function(c){var l=null;return c=c||0,c+=this.__position,c>=0&&c<this.__tokens_length&&(l=this.__tokens[c]),l},a.prototype.add=function(c){this.__parent_token&&(c.parent=this.__parent_token),this.__tokens.push(c),this.__tokens_length+=1},e.exports.TokenStream=a},function(e,a,c){var l=c(12).Pattern;function r(s,u){l.call(this,s,u),u?this._line_regexp=this._input.get_regexp(u._line_regexp):this.__set_whitespace_patterns("",""),this.newline_count=0,this.whitespace_before_token=""}r.prototype=new l,r.prototype.__set_whitespace_patterns=function(s,u){s+="\\t ",u+="\\n\\r",this._match_pattern=this._input.get_regexp("["+s+u+"]+",!0),this._newline_regexp=this._input.get_regexp("\\r\\n|["+u+"]")},r.prototype.read=function(){this.newline_count=0,this.whitespace_before_token="";var s=this._input.read(this._match_pattern);if(s===" ")this.whitespace_before_token=" ";else if(s){var u=this.__split(this._newline_regexp,s);this.newline_count=u.length-1,this.whitespace_before_token=u[this.newline_count]}return s},r.prototype.matching=function(s,u){var h=this._create();return h.__set_whitespace_patterns(s,u),h._update(),h},r.prototype._create=function(){return new r(this._input,this)},r.prototype.__split=function(s,u){s.lastIndex=0;for(var h=0,d=[],g=s.exec(u);g;)d.push(u.substring(h,g.index)),h=g.index+g[0].length,g=s.exec(u);return h<u.length?d.push(u.substring(h,u.length)):d.push(""),d},e.exports.WhitespacePattern=r},function(e){function a(c,l){this._input=c,this._starting_pattern=null,this._match_pattern=null,this._until_pattern=null,this._until_after=!1,l&&(this._starting_pattern=this._input.get_regexp(l._starting_pattern,!0),this._match_pattern=this._input.get_regexp(l._match_pattern,!0),this._until_pattern=this._input.get_regexp(l._until_pattern),this._until_after=l._until_after)}a.prototype.read=function(){var c=this._input.read(this._starting_pattern);return(!this._starting_pattern||c)&&(c+=this._input.read(this._match_pattern,this._until_pattern,this._until_after)),c},a.prototype.read_match=function(){return this._input.match(this._match_pattern)},a.prototype.until_after=function(c){var l=this._create();return l._until_after=!0,l._until_pattern=this._input.get_regexp(c),l._update(),l},a.prototype.until=function(c){var l=this._create();return l._until_after=!1,l._until_pattern=this._input.get_regexp(c),l._update(),l},a.prototype.starting_with=function(c){var l=this._create();return l._starting_pattern=this._input.get_regexp(c,!0),l._update(),l},a.prototype.matching=function(c){var l=this._create();return l._match_pattern=this._input.get_regexp(c,!0),l._update(),l},a.prototype._create=function(){return new a(this._input,this)},a.prototype._update=function(){},e.exports.Pattern=a},function(e){function a(c,l){c=typeof c=="string"?c:c.source,l=typeof l=="string"?l:l.source,this.__directives_block_pattern=new RegExp(c+/ beautify( \w+[:]\w+)+ /.source+l,"g"),this.__directive_pattern=/ (\w+)[:](\w+)/g,this.__directives_end_ignore_pattern=new RegExp(c+/\sbeautify\signore:end\s/.source+l,"g")}a.prototype.get_directives=function(c){if(!c.match(this.__directives_block_pattern))return null;var l={};this.__directive_pattern.lastIndex=0;for(var r=this.__directive_pattern.exec(c);r;)l[r[1]]=r[2],r=this.__directive_pattern.exec(c);return l},a.prototype.readIgnored=function(c){return c.readUntilAfter(this.__directives_end_ignore_pattern)},e.exports.Directives=a},function(e,a,c){var l=c(12).Pattern,r={django:!1,erb:!1,handlebars:!1,php:!1,smarty:!1};function s(u,h){l.call(this,u,h),this.__template_pattern=null,this._disabled=Object.assign({},r),this._excluded=Object.assign({},r),h&&(this.__template_pattern=this._input.get_regexp(h.__template_pattern),this._excluded=Object.assign(this._excluded,h._excluded),this._disabled=Object.assign(this._disabled,h._disabled));var d=new l(u);this.__patterns={handlebars_comment:d.starting_with(/{{!--/).until_after(/--}}/),handlebars_unescaped:d.starting_with(/{{{/).until_after(/}}}/),handlebars:d.starting_with(/{{/).until_after(/}}/),php:d.starting_with(/<\?(?:[= ]|php)/).until_after(/\?>/),erb:d.starting_with(/<%[^%]/).until_after(/[^%]%>/),django:d.starting_with(/{%/).until_after(/%}/),django_value:d.starting_with(/{{/).until_after(/}}/),django_comment:d.starting_with(/{#/).until_after(/#}/),smarty:d.starting_with(/{(?=[^}{\s\n])/).until_after(/[^\s\n]}/),smarty_comment:d.starting_with(/{\*/).until_after(/\*}/),smarty_literal:d.starting_with(/{literal}/).until_after(/{\/literal}/)}}s.prototype=new l,s.prototype._create=function(){return new s(this._input,this)},s.prototype._update=function(){this.__set_templated_pattern()},s.prototype.disable=function(u){var h=this._create();return h._disabled[u]=!0,h._update(),h},s.prototype.read_options=function(u){var h=this._create();for(var d in r)h._disabled[d]=u.templating.indexOf(d)===-1;return h._update(),h},s.prototype.exclude=function(u){var h=this._create();return h._excluded[u]=!0,h._update(),h},s.prototype.read=function(){var u="";this._match_pattern?u=this._input.read(this._starting_pattern):u=this._input.read(this._starting_pattern,this.__template_pattern);for(var h=this._read_template();h;)this._match_pattern?h+=this._input.read(this._match_pattern):h+=this._input.readUntil(this.__template_pattern),u+=h,h=this._read_template();return this._until_after&&(u+=this._input.readUntilAfter(this._until_pattern)),u},s.prototype.__set_templated_pattern=function(){var u=[];this._disabled.php||u.push(this.__patterns.php._starting_pattern.source),this._disabled.handlebars||u.push(this.__patterns.handlebars._starting_pattern.source),this._disabled.erb||u.push(this.__patterns.erb._starting_pattern.source),this._disabled.django||(u.push(this.__patterns.django._starting_pattern.source),u.push(this.__patterns.django_value._starting_pattern.source),u.push(this.__patterns.django_comment._starting_pattern.source)),this._disabled.smarty||u.push(this.__patterns.smarty._starting_pattern.source),this._until_pattern&&u.push(this._until_pattern.source),this.__template_pattern=this._input.get_regexp("(?:"+u.join("|")+")")},s.prototype._read_template=function(){var u="",h=this._input.peek();if(h==="<"){var d=this._input.peek(1);!this._disabled.php&&!this._excluded.php&&d==="?"&&(u=u||this.__patterns.php.read()),!this._disabled.erb&&!this._excluded.erb&&d==="%"&&(u=u||this.__patterns.erb.read())}else h==="{"&&(!this._disabled.handlebars&&!this._excluded.handlebars&&(u=u||this.__patterns.handlebars_comment.read(),u=u||this.__patterns.handlebars_unescaped.read(),u=u||this.__patterns.handlebars.read()),this._disabled.django||(!this._excluded.django&&!this._excluded.handlebars&&(u=u||this.__patterns.django_value.read()),this._excluded.django||(u=u||this.__patterns.django_comment.read(),u=u||this.__patterns.django.read())),this._disabled.smarty||this._disabled.django&&this._disabled.handlebars&&(u=u||this.__patterns.smarty_comment.read(),u=u||this.__patterns.smarty_literal.read(),u=u||this.__patterns.smarty.read()));return u},e.exports.TemplatablePattern=s},,,,function(e,a,c){var l=c(19).Beautifier,r=c(20).Options;function s(u,h,d,g){var y=new l(u,h,d,g);return y.beautify()}e.exports=s,e.exports.defaultOptions=function(){return new r}},function(e,a,c){var l=c(20).Options,r=c(2).Output,s=c(21).Tokenizer,u=c(21).TOKEN,h=/\r\n|[\r\n]/,d=/\r\n|[\r\n]/g,g=function(f,p){this.indent_level=0,this.alignment_size=0,this.max_preserve_newlines=f.max_preserve_newlines,this.preserve_newlines=f.preserve_newlines,this._output=new r(f,p)};g.prototype.current_line_has_match=function(f){return this._output.current_line.has_match(f)},g.prototype.set_space_before_token=function(f,p){this._output.space_before_token=f,this._output.non_breaking_space=p},g.prototype.set_wrap_point=function(){this._output.set_indent(this.indent_level,this.alignment_size),this._output.set_wrap_point()},g.prototype.add_raw_token=function(f){this._output.add_raw_token(f)},g.prototype.print_preserved_newlines=function(f){var p=0;f.type!==u.TEXT&&f.previous.type!==u.TEXT&&(p=f.newlines?1:0),this.preserve_newlines&&(p=f.newlines<this.max_preserve_newlines+1?f.newlines:this.max_preserve_newlines+1);for(var b=0;b<p;b++)this.print_newline(b>0);return p!==0},g.prototype.traverse_whitespace=function(f){return f.whitespace_before||f.newlines?(this.print_preserved_newlines(f)||(this._output.space_before_token=!0),!0):!1},g.prototype.previous_token_wrapped=function(){return this._output.previous_token_wrapped},g.prototype.print_newline=function(f){this._output.add_new_line(f)},g.prototype.print_token=function(f){f.text&&(this._output.set_indent(this.indent_level,this.alignment_size),this._output.add_token(f.text))},g.prototype.indent=function(){this.indent_level++},g.prototype.get_full_indent=function(f){return f=this.indent_level+(f||0),f<1?"":this._output.get_indent_string(f)};var y=function(f){for(var p=null,b=f.next;b.type!==u.EOF&&f.closed!==b;){if(b.type===u.ATTRIBUTE&&b.text==="type"){b.next&&b.next.type===u.EQUALS&&b.next.next&&b.next.next.type===u.VALUE&&(p=b.next.next.text);break}b=b.next}return p},m=function(f,p){var b=null,N=null;return p.closed?(f==="script"?b="text/javascript":f==="style"&&(b="text/css"),b=y(p)||b,b.search("text/css")>-1?N="css":b.search(/module|((text|application|dojo)\/(x-)?(javascript|ecmascript|jscript|livescript|(ld\+)?json|method|aspect))/)>-1?N="javascript":b.search(/(text|application|dojo)\/(x-)?(html)/)>-1?N="html":b.search(/test\/null/)>-1&&(N="null"),N):null};function A(f,p){return p.indexOf(f)!==-1}function E(f,p,b){this.parent=f||null,this.tag=p?p.tag_name:"",this.indent_level=b||0,this.parser_token=p||null}function w(f){this._printer=f,this._current_frame=null}w.prototype.get_parser_token=function(){return this._current_frame?this._current_frame.parser_token:null},w.prototype.record_tag=function(f){var p=new E(this._current_frame,f,this._printer.indent_level);this._current_frame=p},w.prototype._try_pop_frame=function(f){var p=null;return f&&(p=f.parser_token,this._printer.indent_level=f.indent_level,this._current_frame=f.parent),p},w.prototype._get_frame=function(f,p){for(var b=this._current_frame;b&&f.indexOf(b.tag)===-1;){if(p&&p.indexOf(b.tag)!==-1){b=null;break}b=b.parent}return b},w.prototype.try_pop=function(f,p){var b=this._get_frame([f],p);return this._try_pop_frame(b)},w.prototype.indent_to_tag=function(f){var p=this._get_frame(f);p&&(this._printer.indent_level=p.indent_level)};function M(f,p,b,N){this._source_text=f||"",p=p||{},this._js_beautify=b,this._css_beautify=N,this._tag_stack=null;var R=new l(p,"html");this._options=R,this._is_wrap_attributes_force=this._options.wrap_attributes.substr(0,5)==="force",this._is_wrap_attributes_force_expand_multiline=this._options.wrap_attributes==="force-expand-multiline",this._is_wrap_attributes_force_aligned=this._options.wrap_attributes==="force-aligned",this._is_wrap_attributes_aligned_multiple=this._options.wrap_attributes==="aligned-multiple",this._is_wrap_attributes_preserve=this._options.wrap_attributes.substr(0,8)==="preserve",this._is_wrap_attributes_preserve_aligned=this._options.wrap_attributes==="preserve-aligned"}M.prototype.beautify=function(){if(this._options.disabled)return this._source_text;var f=this._source_text,p=this._options.eol;this._options.eol==="auto"&&(p=`
+`,f&&h.test(f)&&(p=f.match(h)[0])),f=f.replace(d,`
+`);var b=f.match(/^[\t ]*/)[0],N={text:"",type:""},R=new B,U=new g(this._options,b),H=new s(f,this._options).tokenize();this._tag_stack=new w(U);for(var z=null,I=H.next();I.type!==u.EOF;)I.type===u.TAG_OPEN||I.type===u.COMMENT?(z=this._handle_tag_open(U,I,R,N),R=z):I.type===u.ATTRIBUTE||I.type===u.EQUALS||I.type===u.VALUE||I.type===u.TEXT&&!R.tag_complete?z=this._handle_inside_tag(U,I,R,H):I.type===u.TAG_CLOSE?z=this._handle_tag_close(U,I,R):I.type===u.TEXT?z=this._handle_text(U,I,R):U.add_raw_token(I),N=z,I=H.next();var F=U._output.get_code(p);return F},M.prototype._handle_tag_close=function(f,p,b){var N={text:p.text,type:p.type};return f.alignment_size=0,b.tag_complete=!0,f.set_space_before_token(p.newlines||p.whitespace_before!=="",!0),b.is_unformatted?f.add_raw_token(p):(b.tag_start_char==="<"&&(f.set_space_before_token(p.text[0]==="/",!0),this._is_wrap_attributes_force_expand_multiline&&b.has_wrapped_attrs&&f.print_newline(!1)),f.print_token(p)),b.indent_content&&!(b.is_unformatted||b.is_content_unformatted)&&(f.indent(),b.indent_content=!1),!b.is_inline_element&&!(b.is_unformatted||b.is_content_unformatted)&&f.set_wrap_point(),N},M.prototype._handle_inside_tag=function(f,p,b,N){var R=b.has_wrapped_attrs,U={text:p.text,type:p.type};if(f.set_space_before_token(p.newlines||p.whitespace_before!=="",!0),b.is_unformatted)f.add_raw_token(p);else if(b.tag_start_char==="{"&&p.type===u.TEXT)f.print_preserved_newlines(p)?(p.newlines=0,f.add_raw_token(p)):f.print_token(p);else{if(p.type===u.ATTRIBUTE?(f.set_space_before_token(!0),b.attr_count+=1):(p.type===u.EQUALS||p.type===u.VALUE&&p.previous.type===u.EQUALS)&&f.set_space_before_token(!1),p.type===u.ATTRIBUTE&&b.tag_start_char==="<"&&((this._is_wrap_attributes_preserve||this._is_wrap_attributes_preserve_aligned)&&(f.traverse_whitespace(p),R=R||p.newlines!==0),this._is_wrap_attributes_force)){var H=b.attr_count>1;if(this._is_wrap_attributes_force_expand_multiline&&b.attr_count===1){var z=!0,I=0,F;do{if(F=N.peek(I),F.type===u.ATTRIBUTE){z=!1;break}I+=1}while(I<4&&F.type!==u.EOF&&F.type!==u.TAG_CLOSE);H=!z}H&&(f.print_newline(!1),R=!0)}f.print_token(p),R=R||f.previous_token_wrapped(),b.has_wrapped_attrs=R}return U},M.prototype._handle_text=function(f,p,b){var N={text:p.text,type:"TK_CONTENT"};return b.custom_beautifier_name?this._print_custom_beatifier_text(f,p,b):b.is_unformatted||b.is_content_unformatted?f.add_raw_token(p):(f.traverse_whitespace(p),f.print_token(p)),N},M.prototype._print_custom_beatifier_text=function(f,p,b){var N=this;if(p.text!==""){var R=p.text,U,H=1,z="",I="";b.custom_beautifier_name==="javascript"&&typeof this._js_beautify=="function"?U=this._js_beautify:b.custom_beautifier_name==="css"&&typeof this._css_beautify=="function"?U=this._css_beautify:b.custom_beautifier_name==="html"&&(U=function(x,D){var L=new M(x,D,N._js_beautify,N._css_beautify);return L.beautify()}),this._options.indent_scripts==="keep"?H=0:this._options.indent_scripts==="separate"&&(H=-f.indent_level);var F=f.get_full_indent(H);if(R=R.replace(/\n[ \t]*$/,""),b.custom_beautifier_name!=="html"&&R[0]==="<"&&R.match(/^(<!--|<!\[CDATA\[)/)){var T=/^(<!--[^\n]*|<!\[CDATA\[)(\n?)([ \t\n]*)([\s\S]*)(-->|]]>)$/.exec(R);if(!T){f.add_raw_token(p);return}z=F+T[1]+`
+`,R=T[4],T[5]&&(I=F+T[5]),R=R.replace(/\n[ \t]*$/,""),(T[2]||T[3].indexOf(`
+`)!==-1)&&(T=T[3].match(/[ \t]+$/),T&&(p.whitespace_before=T[0]))}if(R)if(U){var v=function(){this.eol=`
+`};v.prototype=this._options.raw_options;var k=new v;R=U(F+R,k)}else{var C=p.whitespace_before;C&&(R=R.replace(new RegExp(`
+(`+C+")?","g"),`
+`)),R=F+R.replace(/\n/g,`
+`+F)}z&&(R?R=z+R+`
+`+I:R=z+I),f.print_newline(!1),R&&(p.text=R,p.whitespace_before="",p.newlines=0,f.add_raw_token(p),f.print_newline(!0))}},M.prototype._handle_tag_open=function(f,p,b,N){var R=this._get_tag_open_token(p);return(b.is_unformatted||b.is_content_unformatted)&&!b.is_empty_element&&p.type===u.TAG_OPEN&&p.text.indexOf("</")===0?(f.add_raw_token(p),R.start_tag_token=this._tag_stack.try_pop(R.tag_name)):(f.traverse_whitespace(p),this._set_tag_position(f,p,R,b,N),R.is_inline_element||f.set_wrap_point(),f.print_token(p)),(this._is_wrap_attributes_force_aligned||this._is_wrap_attributes_aligned_multiple||this._is_wrap_attributes_preserve_aligned)&&(R.alignment_size=p.text.length+1),!R.tag_complete&&!R.is_unformatted&&(f.alignment_size=R.alignment_size),R};var B=function(f,p){if(this.parent=f||null,this.text="",this.type="TK_TAG_OPEN",this.tag_name="",this.is_inline_element=!1,this.is_unformatted=!1,this.is_content_unformatted=!1,this.is_empty_element=!1,this.is_start_tag=!1,this.is_end_tag=!1,this.indent_content=!1,this.multiline_content=!1,this.custom_beautifier_name=null,this.start_tag_token=null,this.attr_count=0,this.has_wrapped_attrs=!1,this.alignment_size=0,this.tag_complete=!1,this.tag_start_char="",this.tag_check="",!p)this.tag_complete=!0;else{var b;this.tag_start_char=p.text[0],this.text=p.text,this.tag_start_char==="<"?(b=p.text.match(/^<([^\s>]*)/),this.tag_check=b?b[1]:""):(b=p.text.match(/^{{(?:[\^]|#\*?)?([^\s}]+)/),this.tag_check=b?b[1]:"",p.text==="{{#>"&&this.tag_check===">"&&p.next!==null&&(this.tag_check=p.next.text)),this.tag_check=this.tag_check.toLowerCase(),p.type===u.COMMENT&&(this.tag_complete=!0),this.is_start_tag=this.tag_check.charAt(0)!=="/",this.tag_name=this.is_start_tag?this.tag_check:this.tag_check.substr(1),this.is_end_tag=!this.is_start_tag||p.closed&&p.closed.text==="/>",this.is_end_tag=this.is_end_tag||this.tag_start_char==="{"&&(this.text.length<3||/[^#\^]/.test(this.text.charAt(2)))}};M.prototype._get_tag_open_token=function(f){var p=new B(this._tag_stack.get_parser_token(),f);return p.alignment_size=this._options.wrap_attributes_indent_size,p.is_end_tag=p.is_end_tag||A(p.tag_check,this._options.void_elements),p.is_empty_element=p.tag_complete||p.is_start_tag&&p.is_end_tag,p.is_unformatted=!p.tag_complete&&A(p.tag_check,this._options.unformatted),p.is_content_unformatted=!p.is_empty_element&&A(p.tag_check,this._options.content_unformatted),p.is_inline_element=A(p.tag_name,this._options.inline)||p.tag_start_char==="{",p},M.prototype._set_tag_position=function(f,p,b,N,R){if(b.is_empty_element||(b.is_end_tag?b.start_tag_token=this._tag_stack.try_pop(b.tag_name):(this._do_optional_end_element(b)&&(b.is_inline_element||f.print_newline(!1)),this._tag_stack.record_tag(b),(b.tag_name==="script"||b.tag_name==="style")&&!(b.is_unformatted||b.is_content_unformatted)&&(b.custom_beautifier_name=m(b.tag_check,p)))),A(b.tag_check,this._options.extra_liners)&&(f.print_newline(!1),f._output.just_added_blankline()||f.print_newline(!0)),b.is_empty_element){if(b.tag_start_char==="{"&&b.tag_check==="else"){this._tag_stack.indent_to_tag(["if","unless","each"]),b.indent_content=!0;var U=f.current_line_has_match(/{{#if/);U||f.print_newline(!1)}b.tag_name==="!--"&&R.type===u.TAG_CLOSE&&N.is_end_tag&&b.text.indexOf(`
+`)===-1||(b.is_inline_element||b.is_unformatted||f.print_newline(!1),this._calcluate_parent_multiline(f,b))}else if(b.is_end_tag){var H=!1;H=b.start_tag_token&&b.start_tag_token.multiline_content,H=H||!b.is_inline_element&&!(N.is_inline_element||N.is_unformatted)&&!(R.type===u.TAG_CLOSE&&b.start_tag_token===N)&&R.type!=="TK_CONTENT",(b.is_content_unformatted||b.is_unformatted)&&(H=!1),H&&f.print_newline(!1)}else b.indent_content=!b.custom_beautifier_name,b.tag_start_char==="<"&&(b.tag_name==="html"?b.indent_content=this._options.indent_inner_html:b.tag_name==="head"?b.indent_content=this._options.indent_head_inner_html:b.tag_name==="body"&&(b.indent_content=this._options.indent_body_inner_html)),!(b.is_inline_element||b.is_unformatted)&&(R.type!=="TK_CONTENT"||b.is_content_unformatted)&&f.print_newline(!1),this._calcluate_parent_multiline(f,b)},M.prototype._calcluate_parent_multiline=function(f,p){p.parent&&f._output.just_added_newline()&&!((p.is_inline_element||p.is_unformatted)&&p.parent.is_inline_element)&&(p.parent.multiline_content=!0)};var G=["address","article","aside","blockquote","details","div","dl","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hr","main","nav","ol","p","pre","section","table","ul"],J=["a","audio","del","ins","map","noscript","video"];M.prototype._do_optional_end_element=function(f){var p=null;if(!(f.is_empty_element||!f.is_start_tag||!f.parent)){if(f.tag_name==="body")p=p||this._tag_stack.try_pop("head");else if(f.tag_name==="li")p=p||this._tag_stack.try_pop("li",["ol","ul"]);else if(f.tag_name==="dd"||f.tag_name==="dt")p=p||this._tag_stack.try_pop("dt",["dl"]),p=p||this._tag_stack.try_pop("dd",["dl"]);else if(f.parent.tag_name==="p"&&G.indexOf(f.tag_name)!==-1){var b=f.parent.parent;(!b||J.indexOf(b.tag_name)===-1)&&(p=p||this._tag_stack.try_pop("p"))}else f.tag_name==="rp"||f.tag_name==="rt"?(p=p||this._tag_stack.try_pop("rt",["ruby","rtc"]),p=p||this._tag_stack.try_pop("rp",["ruby","rtc"])):f.tag_name==="optgroup"?p=p||this._tag_stack.try_pop("optgroup",["select"]):f.tag_name==="option"?p=p||this._tag_stack.try_pop("option",["select","datalist","optgroup"]):f.tag_name==="colgroup"?p=p||this._tag_stack.try_pop("caption",["table"]):f.tag_name==="thead"?(p=p||this._tag_stack.try_pop("caption",["table"]),p=p||this._tag_stack.try_pop("colgroup",["table"])):f.tag_name==="tbody"||f.tag_name==="tfoot"?(p=p||this._tag_stack.try_pop("caption",["table"]),p=p||this._tag_stack.try_pop("colgroup",["table"]),p=p||this._tag_stack.try_pop("thead",["table"]),p=p||this._tag_stack.try_pop("tbody",["table"])):f.tag_name==="tr"?(p=p||this._tag_stack.try_pop("caption",["table"]),p=p||this._tag_stack.try_pop("colgroup",["table"]),p=p||this._tag_stack.try_pop("tr",["table","thead","tbody","tfoot"])):(f.tag_name==="th"||f.tag_name==="td")&&(p=p||this._tag_stack.try_pop("td",["table","thead","tbody","tfoot","tr"]),p=p||this._tag_stack.try_pop("th",["table","thead","tbody","tfoot","tr"]));return f.parent=this._tag_stack.get_parser_token(),p}},e.exports.Beautifier=M},function(e,a,c){var l=c(6).Options;function r(s){l.call(this,s,"html"),this.templating.length===1&&this.templating[0]==="auto"&&(this.templating=["django","erb","handlebars","php"]),this.indent_inner_html=this._get_boolean("indent_inner_html"),this.indent_body_inner_html=this._get_boolean("indent_body_inner_html",!0),this.indent_head_inner_html=this._get_boolean("indent_head_inner_html",!0),this.indent_handlebars=this._get_boolean("indent_handlebars",!0),this.wrap_attributes=this._get_selection("wrap_attributes",["auto","force","force-aligned","force-expand-multiline","aligned-multiple","preserve","preserve-aligned"]),this.wrap_attributes_indent_size=this._get_number("wrap_attributes_indent_size",this.indent_size),this.extra_liners=this._get_array("extra_liners",["head","body","/html"]),this.inline=this._get_array("inline",["a","abbr","area","audio","b","bdi","bdo","br","button","canvas","cite","code","data","datalist","del","dfn","em","embed","i","iframe","img","input","ins","kbd","keygen","label","map","mark","math","meter","noscript","object","output","progress","q","ruby","s","samp","select","small","span","strong","sub","sup","svg","template","textarea","time","u","var","video","wbr","text","acronym","big","strike","tt"]),this.void_elements=this._get_array("void_elements",["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr","!doctype","?xml","basefont","isindex"]),this.unformatted=this._get_array("unformatted",[]),this.content_unformatted=this._get_array("content_unformatted",["pre","textarea"]),this.unformatted_content_delimiter=this._get_characters("unformatted_content_delimiter"),this.indent_scripts=this._get_selection("indent_scripts",["normal","keep","separate"])}r.prototype=new l,e.exports.Options=r},function(e,a,c){var l=c(9).Tokenizer,r=c(9).TOKEN,s=c(13).Directives,u=c(14).TemplatablePattern,h=c(12).Pattern,d={TAG_OPEN:"TK_TAG_OPEN",TAG_CLOSE:"TK_TAG_CLOSE",ATTRIBUTE:"TK_ATTRIBUTE",EQUALS:"TK_EQUALS",VALUE:"TK_VALUE",COMMENT:"TK_COMMENT",TEXT:"TK_TEXT",UNKNOWN:"TK_UNKNOWN",START:r.START,RAW:r.RAW,EOF:r.EOF},g=new s(/<\!--/,/-->/),y=function(m,A){l.call(this,m,A),this._current_tag_name="";var E=new u(this._input).read_options(this._options),w=new h(this._input);if(this.__patterns={word:E.until(/[\n\r\t <]/),single_quote:E.until_after(/'/),double_quote:E.until_after(/"/),attribute:E.until(/[\n\r\t =>]|\/>/),element_name:E.until(/[\n\r\t >\/]/),handlebars_comment:w.starting_with(/{{!--/).until_after(/--}}/),handlebars:w.starting_with(/{{/).until_after(/}}/),handlebars_open:w.until(/[\n\r\t }]/),handlebars_raw_close:w.until(/}}/),comment:w.starting_with(/<!--/).until_after(/-->/),cdata:w.starting_with(/<!\[CDATA\[/).until_after(/]]>/),conditional_comment:w.starting_with(/<!\[/).until_after(/]>/),processing:w.starting_with(/<\?/).until_after(/\?>/)},this._options.indent_handlebars&&(this.__patterns.word=this.__patterns.word.exclude("handlebars")),this._unformatted_content_delimiter=null,this._options.unformatted_content_delimiter){var M=this._input.get_literal_regexp(this._options.unformatted_content_delimiter);this.__patterns.unformatted_content_delimiter=w.matching(M).until_after(M)}};y.prototype=new l,y.prototype._is_comment=function(m){return!1},y.prototype._is_opening=function(m){return m.type===d.TAG_OPEN},y.prototype._is_closing=function(m,A){return m.type===d.TAG_CLOSE&&A&&((m.text===">"||m.text==="/>")&&A.text[0]==="<"||m.text==="}}"&&A.text[0]==="{"&&A.text[1]==="{")},y.prototype._reset=function(){this._current_tag_name=""},y.prototype._get_next_token=function(m,A){var E=null;this._readWhitespace();var w=this._input.peek();return w===null?this._create_token(d.EOF,""):(E=E||this._read_open_handlebars(w,A),E=E||this._read_attribute(w,m,A),E=E||this._read_close(w,A),E=E||this._read_raw_content(w,m,A),E=E||this._read_content_word(w),E=E||this._read_comment_or_cdata(w),E=E||this._read_processing(w),E=E||this._read_open(w,A),E=E||this._create_token(d.UNKNOWN,this._input.next()),E)},y.prototype._read_comment_or_cdata=function(m){var A=null,E=null,w=null;if(m==="<"){var M=this._input.peek(1);M==="!"&&(E=this.__patterns.comment.read(),E?(w=g.get_directives(E),w&&w.ignore==="start"&&(E+=g.readIgnored(this._input))):E=this.__patterns.cdata.read()),E&&(A=this._create_token(d.COMMENT,E),A.directives=w)}return A},y.prototype._read_processing=function(m){var A=null,E=null,w=null;if(m==="<"){var M=this._input.peek(1);(M==="!"||M==="?")&&(E=this.__patterns.conditional_comment.read(),E=E||this.__patterns.processing.read()),E&&(A=this._create_token(d.COMMENT,E),A.directives=w)}return A},y.prototype._read_open=function(m,A){var E=null,w=null;return A||m==="<"&&(E=this._input.next(),this._input.peek()==="/"&&(E+=this._input.next()),E+=this.__patterns.element_name.read(),w=this._create_token(d.TAG_OPEN,E)),w},y.prototype._read_open_handlebars=function(m,A){var E=null,w=null;return A||this._options.indent_handlebars&&m==="{"&&this._input.peek(1)==="{"&&(this._input.peek(2)==="!"?(E=this.__patterns.handlebars_comment.read(),E=E||this.__patterns.handlebars.read(),w=this._create_token(d.COMMENT,E)):(E=this.__patterns.handlebars_open.read(),w=this._create_token(d.TAG_OPEN,E))),w},y.prototype._read_close=function(m,A){var E=null,w=null;return A&&(A.text[0]==="<"&&(m===">"||m==="/"&&this._input.peek(1)===">")?(E=this._input.next(),m==="/"&&(E+=this._input.next()),w=this._create_token(d.TAG_CLOSE,E)):A.text[0]==="{"&&m==="}"&&this._input.peek(1)==="}"&&(this._input.next(),this._input.next(),w=this._create_token(d.TAG_CLOSE,"}}"))),w},y.prototype._read_attribute=function(m,A,E){var w=null,M="";if(E&&E.text[0]==="<")if(m==="=")w=this._create_token(d.EQUALS,this._input.next());else if(m==='"'||m==="'"){var B=this._input.next();m==='"'?B+=this.__patterns.double_quote.read():B+=this.__patterns.single_quote.read(),w=this._create_token(d.VALUE,B)}else M=this.__patterns.attribute.read(),M&&(A.type===d.EQUALS?w=this._create_token(d.VALUE,M):w=this._create_token(d.ATTRIBUTE,M));return w},y.prototype._is_content_unformatted=function(m){return this._options.void_elements.indexOf(m)===-1&&(this._options.content_unformatted.indexOf(m)!==-1||this._options.unformatted.indexOf(m)!==-1)},y.prototype._read_raw_content=function(m,A,E){var w="";if(E&&E.text[0]==="{")w=this.__patterns.handlebars_raw_close.read();else if(A.type===d.TAG_CLOSE&&A.opened.text[0]==="<"&&A.text[0]!=="/"){var M=A.opened.text.substr(1).toLowerCase();if(M==="script"||M==="style"){var B=this._read_comment_or_cdata(m);if(B)return B.type=d.TEXT,B;w=this._input.readUntil(new RegExp("</"+M+"[\\n\\r\\t ]*?>","ig"))}else this._is_content_unformatted(M)&&(w=this._input.readUntil(new RegExp("</"+M+"[\\n\\r\\t ]*?>","ig")))}return w?this._create_token(d.TEXT,w):null},y.prototype._read_content_word=function(m){var A="";if(this._options.unformatted_content_delimiter&&m===this._options.unformatted_content_delimiter[0]&&(A=this.__patterns.unformatted_content_delimiter.read()),A||(A=this.__patterns.word.read()),A)return this._create_token(d.TEXT,A)},e.exports.Tokenizer=y,e.exports.TOKEN=d}],i={};function o(e){var a=i[e];if(a!==void 0)return a.exports;var c=i[e]={exports:{}};return t[e](c,c.exports,o),c.exports}var n=o(18);nn=n})();function rn(t,i){return nn(t,i,Kt,tn)}function sn(t,i,o){var n=t.getText(),e=!0,a=0,c=o.tabSize||4;if(i){for(var l=t.offsetAt(i.start),r=l;r>0&&on(n,r-1);)r--;r===0||an(n,r-1)?l=r:r<l&&(l=r+1);for(var s=t.offsetAt(i.end),u=s;u<n.length&&on(n,u);)u++;(u===n.length||an(n,u))&&(s=u),i=P.create(t.positionAt(l),t.positionAt(s));var h=n.substring(0,l);if(new RegExp(/.*[<][^>]*$/).test(h))return n=n.substring(l,s),[{range:i,newText:n}];if(e=s===n.length,n=n.substring(l,s),l!==0){var d=t.offsetAt(X.create(i.start.line,0));a=wi(t.getText(),d,o)}}else i=P.create(X.create(0,0),t.positionAt(n.length));var g={indent_size:c,indent_char:o.insertSpaces?" ":"	",indent_empty_lines:ie(o,"indentEmptyLines",!1),wrap_line_length:ie(o,"wrapLineLength",120),unformatted:mt(o,"unformatted",void 0),content_unformatted:mt(o,"contentUnformatted",void 0),indent_inner_html:ie(o,"indentInnerHtml",!1),preserve_newlines:ie(o,"preserveNewLines",!0),max_preserve_newlines:ie(o,"maxPreserveNewLines",32786),indent_handlebars:ie(o,"indentHandlebars",!1),end_with_newline:e&&ie(o,"endWithNewline",!1),extra_liners:mt(o,"extraLiners",void 0),wrap_attributes:ie(o,"wrapAttributes","auto"),wrap_attributes_indent_size:ie(o,"wrapAttributesIndentSize",void 0),eol:`
+`,indent_scripts:ie(o,"indentScripts","normal"),templating:vi(o,"all"),unformatted_content_delimiter:ie(o,"unformattedContentDelimiter","")},y=rn(bi(n),g);if(a>0){var m=o.insertSpaces?pt(" ",c*a):pt("	",a);y=y.split(`
+`).join(`
+`+m),i.start.character===0&&(y=m+y)}return[{range:i,newText:y}]}function bi(t){return t.replace(/^\s+/,"")}function ie(t,i,o){if(t&&t.hasOwnProperty(i)){var n=t[i];if(n!==null)return n}return o}function mt(t,i,o){var n=ie(t,i,null);return typeof n=="string"?n.length>0?n.split(",").map(function(e){return e.trim().toLowerCase()}):[]:o}function vi(t,i){var o=ie(t,"templating",i);return o===!0?["auto"]:["none"]}function wi(t,i,o){for(var n=i,e=0,a=o.tabSize||4;n<t.length;){var c=t.charAt(n);if(c===" ")e++;else if(c==="	")e+=a;else break;n++}return Math.floor(e/a)}function an(t,i){return`\r
+`.indexOf(t.charAt(i))!==-1}function on(t,i){return" 	".indexOf(t.charAt(i))!==-1}var ln;ln=(()=>{"use strict";var t={470:n=>{function e(l){if(typeof l!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(l))}function a(l,r){for(var s,u="",h=0,d=-1,g=0,y=0;y<=l.length;++y){if(y<l.length)s=l.charCodeAt(y);else{if(s===47)break;s=47}if(s===47){if(!(d===y-1||g===1))if(d!==y-1&&g===2){if(u.length<2||h!==2||u.charCodeAt(u.length-1)!==46||u.charCodeAt(u.length-2)!==46){if(u.length>2){var m=u.lastIndexOf("/");if(m!==u.length-1){m===-1?(u="",h=0):h=(u=u.slice(0,m)).length-1-u.lastIndexOf("/"),d=y,g=0;continue}}else if(u.length===2||u.length===1){u="",h=0,d=y,g=0;continue}}r&&(u.length>0?u+="/..":u="..",h=2)}else u.length>0?u+="/"+l.slice(d+1,y):u=l.slice(d+1,y),h=y-d-1;d=y,g=0}else s===46&&g!==-1?++g:g=-1}return u}var c={resolve:function(){for(var l,r="",s=!1,u=arguments.length-1;u>=-1&&!s;u--){var h;u>=0?h=arguments[u]:(l===void 0&&(l=process.cwd()),h=l),e(h),h.length!==0&&(r=h+"/"+r,s=h.charCodeAt(0)===47)}return r=a(r,!s),s?r.length>0?"/"+r:"/":r.length>0?r:"."},normalize:function(l){if(e(l),l.length===0)return".";var r=l.charCodeAt(0)===47,s=l.charCodeAt(l.length-1)===47;return(l=a(l,!r)).length!==0||r||(l="."),l.length>0&&s&&(l+="/"),r?"/"+l:l},isAbsolute:function(l){return e(l),l.length>0&&l.charCodeAt(0)===47},join:function(){if(arguments.length===0)return".";for(var l,r=0;r<arguments.length;++r){var s=arguments[r];e(s),s.length>0&&(l===void 0?l=s:l+="/"+s)}return l===void 0?".":c.normalize(l)},relative:function(l,r){if(e(l),e(r),l===r||(l=c.resolve(l))===(r=c.resolve(r)))return"";for(var s=1;s<l.length&&l.charCodeAt(s)===47;++s);for(var u=l.length,h=u-s,d=1;d<r.length&&r.charCodeAt(d)===47;++d);for(var g=r.length-d,y=h<g?h:g,m=-1,A=0;A<=y;++A){if(A===y){if(g>y){if(r.charCodeAt(d+A)===47)return r.slice(d+A+1);if(A===0)return r.slice(d+A)}else h>y&&(l.charCodeAt(s+A)===47?m=A:A===0&&(m=0));break}var E=l.charCodeAt(s+A);if(E!==r.charCodeAt(d+A))break;E===47&&(m=A)}var w="";for(A=s+m+1;A<=u;++A)A!==u&&l.charCodeAt(A)!==47||(w.length===0?w+="..":w+="/..");return w.length>0?w+r.slice(d+m):(d+=m,r.charCodeAt(d)===47&&++d,r.slice(d))},_makeLong:function(l){return l},dirname:function(l){if(e(l),l.length===0)return".";for(var r=l.charCodeAt(0),s=r===47,u=-1,h=!0,d=l.length-1;d>=1;--d)if((r=l.charCodeAt(d))===47){if(!h){u=d;break}}else h=!1;return u===-1?s?"/":".":s&&u===1?"//":l.slice(0,u)},basename:function(l,r){if(r!==void 0&&typeof r!="string")throw new TypeError('"ext" argument must be a string');e(l);var s,u=0,h=-1,d=!0;if(r!==void 0&&r.length>0&&r.length<=l.length){if(r.length===l.length&&r===l)return"";var g=r.length-1,y=-1;for(s=l.length-1;s>=0;--s){var m=l.charCodeAt(s);if(m===47){if(!d){u=s+1;break}}else y===-1&&(d=!1,y=s+1),g>=0&&(m===r.charCodeAt(g)?--g==-1&&(h=s):(g=-1,h=y))}return u===h?h=y:h===-1&&(h=l.length),l.slice(u,h)}for(s=l.length-1;s>=0;--s)if(l.charCodeAt(s)===47){if(!d){u=s+1;break}}else h===-1&&(d=!1,h=s+1);return h===-1?"":l.slice(u,h)},extname:function(l){e(l);for(var r=-1,s=0,u=-1,h=!0,d=0,g=l.length-1;g>=0;--g){var y=l.charCodeAt(g);if(y!==47)u===-1&&(h=!1,u=g+1),y===46?r===-1?r=g:d!==1&&(d=1):r!==-1&&(d=-1);else if(!h){s=g+1;break}}return r===-1||u===-1||d===0||d===1&&r===u-1&&r===s+1?"":l.slice(r,u)},format:function(l){if(l===null||typeof l!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof l);return function(r,s){var u=s.dir||s.root,h=s.base||(s.name||"")+(s.ext||"");return u?u===s.root?u+h:u+"/"+h:h}(0,l)},parse:function(l){e(l);var r={root:"",dir:"",base:"",ext:"",name:""};if(l.length===0)return r;var s,u=l.charCodeAt(0),h=u===47;h?(r.root="/",s=1):s=0;for(var d=-1,g=0,y=-1,m=!0,A=l.length-1,E=0;A>=s;--A)if((u=l.charCodeAt(A))!==47)y===-1&&(m=!1,y=A+1),u===46?d===-1?d=A:E!==1&&(E=1):d!==-1&&(E=-1);else if(!m){g=A+1;break}return d===-1||y===-1||E===0||E===1&&d===y-1&&d===g+1?y!==-1&&(r.base=r.name=g===0&&h?l.slice(1,y):l.slice(g,y)):(g===0&&h?(r.name=l.slice(1,d),r.base=l.slice(1,y)):(r.name=l.slice(g,d),r.base=l.slice(g,y)),r.ext=l.slice(d,y)),g>0?r.dir=l.slice(0,g-1):h&&(r.dir="/"),r},sep:"/",delimiter:":",win32:null,posix:null};c.posix=c,n.exports=c},447:(n,e,a)=>{var c;if(a.r(e),a.d(e,{URI:()=>w,Utils:()=>H}),typeof process=="object")c=process.platform==="win32";else if(typeof navigator=="object"){var l=navigator.userAgent;c=l.indexOf("Windows")>=0}var r,s,u=(r=function(T,v){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(k,C){k.__proto__=C}||function(k,C){for(var x in C)Object.prototype.hasOwnProperty.call(C,x)&&(k[x]=C[x])})(T,v)},function(T,v){if(typeof v!="function"&&v!==null)throw new TypeError("Class extends value "+String(v)+" is not a constructor or null");function k(){this.constructor=T}r(T,v),T.prototype=v===null?Object.create(v):(k.prototype=v.prototype,new k)}),h=/^\w[\w\d+.-]*$/,d=/^\//,g=/^\/\//;function y(T,v){if(!T.scheme&&v)throw new Error('[UriError]: Scheme is missing: {scheme: "", authority: "'.concat(T.authority,'", path: "').concat(T.path,'", query: "').concat(T.query,'", fragment: "').concat(T.fragment,'"}'));if(T.scheme&&!h.test(T.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(T.path){if(T.authority){if(!d.test(T.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(g.test(T.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}var m="",A="/",E=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/,w=function(){function T(v,k,C,x,D,L){L===void 0&&(L=!1),typeof v=="object"?(this.scheme=v.scheme||m,this.authority=v.authority||m,this.path=v.path||m,this.query=v.query||m,this.fragment=v.fragment||m):(this.scheme=function(q,j){return q||j?q:"file"}(v,L),this.authority=k||m,this.path=function(q,j){switch(q){case"https":case"http":case"file":j?j[0]!==A&&(j=A+j):j=A}return j}(this.scheme,C||m),this.query=x||m,this.fragment=D||m,y(this,L))}return T.isUri=function(v){return v instanceof T||!!v&&typeof v.authority=="string"&&typeof v.fragment=="string"&&typeof v.path=="string"&&typeof v.query=="string"&&typeof v.scheme=="string"&&typeof v.fsPath=="string"&&typeof v.with=="function"&&typeof v.toString=="function"},Object.defineProperty(T.prototype,"fsPath",{get:function(){return p(this,!1)},enumerable:!1,configurable:!0}),T.prototype.with=function(v){if(!v)return this;var k=v.scheme,C=v.authority,x=v.path,D=v.query,L=v.fragment;return k===void 0?k=this.scheme:k===null&&(k=m),C===void 0?C=this.authority:C===null&&(C=m),x===void 0?x=this.path:x===null&&(x=m),D===void 0?D=this.query:D===null&&(D=m),L===void 0?L=this.fragment:L===null&&(L=m),k===this.scheme&&C===this.authority&&x===this.path&&D===this.query&&L===this.fragment?this:new B(k,C,x,D,L)},T.parse=function(v,k){k===void 0&&(k=!1);var C=E.exec(v);return C?new B(C[2]||m,U(C[4]||m),U(C[5]||m),U(C[7]||m),U(C[9]||m),k):new B(m,m,m,m,m)},T.file=function(v){var k=m;if(c&&(v=v.replace(/\\/g,A)),v[0]===A&&v[1]===A){var C=v.indexOf(A,2);C===-1?(k=v.substring(2),v=A):(k=v.substring(2,C),v=v.substring(C)||A)}return new B("file",k,v,m,m)},T.from=function(v){var k=new B(v.scheme,v.authority,v.path,v.query,v.fragment);return y(k,!0),k},T.prototype.toString=function(v){return v===void 0&&(v=!1),b(this,v)},T.prototype.toJSON=function(){return this},T.revive=function(v){if(v){if(v instanceof T)return v;var k=new B(v);return k._formatted=v.external,k._fsPath=v._sep===M?v.fsPath:null,k}return v},T}(),M=c?1:void 0,B=function(T){function v(){var k=T!==null&&T.apply(this,arguments)||this;return k._formatted=null,k._fsPath=null,k}return u(v,T),Object.defineProperty(v.prototype,"fsPath",{get:function(){return this._fsPath||(this._fsPath=p(this,!1)),this._fsPath},enumerable:!1,configurable:!0}),v.prototype.toString=function(k){return k===void 0&&(k=!1),k?b(this,!0):(this._formatted||(this._formatted=b(this,!1)),this._formatted)},v.prototype.toJSON=function(){var k={$mid:1};return this._fsPath&&(k.fsPath=this._fsPath,k._sep=M),this._formatted&&(k.external=this._formatted),this.path&&(k.path=this.path),this.scheme&&(k.scheme=this.scheme),this.authority&&(k.authority=this.authority),this.query&&(k.query=this.query),this.fragment&&(k.fragment=this.fragment),k},v}(w),G=((s={})[58]="%3A",s[47]="%2F",s[63]="%3F",s[35]="%23",s[91]="%5B",s[93]="%5D",s[64]="%40",s[33]="%21",s[36]="%24",s[38]="%26",s[39]="%27",s[40]="%28",s[41]="%29",s[42]="%2A",s[43]="%2B",s[44]="%2C",s[59]="%3B",s[61]="%3D",s[32]="%20",s);function J(T,v){for(var k=void 0,C=-1,x=0;x<T.length;x++){var D=T.charCodeAt(x);if(D>=97&&D<=122||D>=65&&D<=90||D>=48&&D<=57||D===45||D===46||D===95||D===126||v&&D===47)C!==-1&&(k+=encodeURIComponent(T.substring(C,x)),C=-1),k!==void 0&&(k+=T.charAt(x));else{k===void 0&&(k=T.substr(0,x));var L=G[D];L!==void 0?(C!==-1&&(k+=encodeURIComponent(T.substring(C,x)),C=-1),k+=L):C===-1&&(C=x)}}return C!==-1&&(k+=encodeURIComponent(T.substring(C))),k!==void 0?k:T}function f(T){for(var v=void 0,k=0;k<T.length;k++){var C=T.charCodeAt(k);C===35||C===63?(v===void 0&&(v=T.substr(0,k)),v+=G[C]):v!==void 0&&(v+=T[k])}return v!==void 0?v:T}function p(T,v){var k;return k=T.authority&&T.path.length>1&&T.scheme==="file"?"//".concat(T.authority).concat(T.path):T.path.charCodeAt(0)===47&&(T.path.charCodeAt(1)>=65&&T.path.charCodeAt(1)<=90||T.path.charCodeAt(1)>=97&&T.path.charCodeAt(1)<=122)&&T.path.charCodeAt(2)===58?v?T.path.substr(1):T.path[1].toLowerCase()+T.path.substr(2):T.path,c&&(k=k.replace(/\//g,"\\")),k}function b(T,v){var k=v?f:J,C="",x=T.scheme,D=T.authority,L=T.path,q=T.query,j=T.fragment;if(x&&(C+=x,C+=":"),(D||x==="file")&&(C+=A,C+=A),D){var O=D.indexOf("@");if(O!==-1){var V=D.substr(0,O);D=D.substr(O+1),(O=V.indexOf(":"))===-1?C+=k(V,!1):(C+=k(V.substr(0,O),!1),C+=":",C+=k(V.substr(O+1),!1)),C+="@"}(O=(D=D.toLowerCase()).indexOf(":"))===-1?C+=k(D,!1):(C+=k(D.substr(0,O),!1),C+=D.substr(O))}if(L){if(L.length>=3&&L.charCodeAt(0)===47&&L.charCodeAt(2)===58)(K=L.charCodeAt(1))>=65&&K<=90&&(L="/".concat(String.fromCharCode(K+32),":").concat(L.substr(3)));else if(L.length>=2&&L.charCodeAt(1)===58){var K;(K=L.charCodeAt(0))>=65&&K<=90&&(L="".concat(String.fromCharCode(K+32),":").concat(L.substr(2)))}C+=k(L,!0)}return q&&(C+="?",C+=k(q,!1)),j&&(C+="#",C+=v?j:J(j,!1)),C}function N(T){try{return decodeURIComponent(T)}catch{return T.length>3?T.substr(0,3)+N(T.substr(3)):T}}var R=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function U(T){return T.match(R)?T.replace(R,function(v){return N(v)}):T}var H,z=a(470),I=function(T,v,k){if(k||arguments.length===2)for(var C,x=0,D=v.length;x<D;x++)!C&&x in v||(C||(C=Array.prototype.slice.call(v,0,x)),C[x]=v[x]);return T.concat(C||Array.prototype.slice.call(v))},F=z.posix||z;(function(T){T.joinPath=function(v){for(var k=[],C=1;C<arguments.length;C++)k[C-1]=arguments[C];return v.with({path:F.join.apply(F,I([v.path],k,!1))})},T.resolvePath=function(v){for(var k=[],C=1;C<arguments.length;C++)k[C-1]=arguments[C];var x=v.path||"/";return v.with({path:F.resolve.apply(F,I([x],k,!1))})},T.dirname=function(v){var k=F.dirname(v.path);return k.length===1&&k.charCodeAt(0)===46?v:v.with({path:k})},T.basename=function(v){return F.basename(v.path)},T.extname=function(v){return F.extname(v.path)}})(H||(H={}))}},i={};function o(n){if(i[n])return i[n].exports;var e=i[n]={exports:{}};return t[n](e,e.exports,o),e.exports}return o.d=(n,e)=>{for(var a in e)o.o(e,a)&&!o.o(n,a)&&Object.defineProperty(n,a,{enumerable:!0,get:e[a]})},o.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),o.r=n=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},o(447)})();var{URI:un,Utils:Dr}=ln;function ft(t){var i=t[0],o=t[t.length-1];return i===o&&(i==="'"||i==='"')&&(t=t.substr(1,t.length-2)),t}function _i(t,i){return!t.length||i==="handlebars"&&/{{|}}/.test(t)?!1:/\b(w[\w\d+.-]*:\/\/)?[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/?))/.test(t)}function yi(t,i,o,n){if(!(/^\s*javascript\:/i.test(i)||/[\n\r]/.test(i))){if(i=i.replace(/^\s*/g,""),/^https?:\/\//i.test(i)||/^file:\/\//i.test(i))return i;if(/^\#/i.test(i))return t+i;if(/^\/\//i.test(i)){var e=ae(t,"https://")?"https":"http";return e+":"+i.replace(/^\s*/g,"")}return o?o.resolveReference(i,n||t):i}}function Ti(t,i,o,n,e,a){var c=ft(o);if(_i(c,t.languageId)){c.length<o.length&&(n++,e--);var l=yi(t.uri,c,i,a);if(!(!l||!ki(l)))return{range:P.create(t.positionAt(n),t.positionAt(e)),target:l}}}function ki(t){try{return un.parse(t),!0}catch{return!1}}function cn(t,i){for(var o=[],n=$(t.getText(),0),e=n.scan(),a=void 0,c=!1,l=void 0,r={};e!==S.EOS;){switch(e){case S.StartTag:if(!l){var s=n.getTokenText().toLowerCase();c=s==="base"}break;case S.AttributeName:a=n.getTokenText().toLowerCase();break;case S.AttributeValue:if(a==="src"||a==="href"){var u=n.getTokenText();if(!c){var h=Ti(t,i,u,n.getTokenOffset(),n.getTokenEnd(),l);h&&o.push(h)}c&&typeof l>"u"&&(l=ft(u),l&&i&&(l=i.resolveReference(l,t.uri))),c=!1,a=void 0}else if(a==="id"){var d=ft(n.getTokenText());r[d]=n.getTokenOffset()}break}e=n.scan()}for(var g=0,y=o;g<y.length;g++){var h=y[g],m=t.uri+"#";if(h.target&&ae(h.target,m)){var A=h.target.substr(m.length),E=r[A];if(E!==void 0){var w=t.positionAt(E);h.target="".concat(m).concat(w.line+1,",").concat(w.character+1)}}}return o}function mn(t,i,o){var n=t.offsetAt(i),e=o.findNodeAt(n);if(!e.tag)return[];var a=[],c=pn(S.StartTag,t,e.start),l=typeof e.endTagStart=="number"&&pn(S.EndTag,t,e.endTagStart);return(c&&dn(c,i)||l&&dn(l,i))&&(c&&a.push({kind:ye.Read,range:c}),l&&a.push({kind:ye.Read,range:l})),a}function hn(t,i){return t.line<i.line||t.line===i.line&&t.character<=i.character}function dn(t,i){return hn(t.start,i)&&hn(i,t.end)}function pn(t,i,o){for(var n=$(i.getText(),o),e=n.scan();e!==S.EOS&&e!==t;)e=n.scan();return e!==S.EOS?{start:i.positionAt(n.getTokenOffset()),end:i.positionAt(n.getTokenEnd())}:null}function fn(t,i){var o=[];return i.roots.forEach(function(n){gn(t,n,"",o)}),o}function gn(t,i,o,n){var e=Si(i),a=ve.create(t.uri,P.create(t.positionAt(i.start),t.positionAt(i.end))),c={name:e,location:a,containerName:o,kind:Le.Field};n.push(c),i.children.forEach(function(l){gn(t,l,e,n)})}function Si(t){var i=t.tag;if(t.attributes){var o=t.attributes.id,n=t.attributes.class;o&&(i+="#".concat(o.replace(/[\"\']/g,""))),n&&(i+=n.replace(/[\"\']/g,"").split(/\s+/).map(function(e){return".".concat(e)}).join(""))}return i||"?"}function bn(t,i,o,n){var e,a=t.offsetAt(i),c=n.findNodeAt(a);if(!c.tag||!Ai(c,a,c.tag))return null;var l=[],r={start:t.positionAt(c.start+1),end:t.positionAt(c.start+1+c.tag.length)};if(l.push({range:r,newText:o}),c.endTagStart){var s={start:t.positionAt(c.endTagStart+2),end:t.positionAt(c.endTagStart+2+c.tag.length)};l.push({range:s,newText:o})}var u=(e={},e[t.uri.toString()]=l,e);return{changes:u}}function Ai(t,i,o){return t.endTagStart&&t.endTagStart+2<=i&&i<=t.endTagStart+2+o.length?!0:t.start+1<=i&&i<=t.start+1+o.length}function vn(t,i,o){var n=t.offsetAt(i),e=o.findNodeAt(n);if(!e.tag||!e.endTagStart)return null;if(e.start+1<=n&&n<=e.start+1+e.tag.length){var a=n-1-e.start+e.endTagStart+2;return t.positionAt(a)}if(e.endTagStart+2<=n&&n<=e.endTagStart+2+e.tag.length){var a=n-2-e.endTagStart+e.start+1;return t.positionAt(a)}return null}function gt(t,i,o){var n=t.offsetAt(i),e=o.findNodeAt(n),a=e.tag?e.tag.length:0;return e.endTagStart&&(e.start+1<=n&&n<=e.start+1+a||e.endTagStart+2<=n&&n<=e.endTagStart+2+a)?[P.create(t.positionAt(e.start+1),t.positionAt(e.start+1+a)),P.create(t.positionAt(e.endTagStart+2),t.positionAt(e.endTagStart+2+a))]:null}function xi(t,i){t=t.sort(function(y,m){var A=y.startLine-m.startLine;return A===0&&(A=y.endLine-m.endLine),A});for(var o=void 0,n=[],e=[],a=[],c=function(y,m){e[y]=m,m<30&&(a[m]=(a[m]||0)+1)},l=0;l<t.length;l++){var r=t[l];if(!o)o=r,c(l,0);else if(r.startLine>o.startLine){if(r.endLine<=o.endLine)n.push(o),o=r,c(l,n.length);else if(r.startLine>o.endLine){do o=n.pop();while(o&&r.startLine>o.endLine);o&&n.push(o),o=r,c(l,n.length)}}}for(var s=0,u=0,l=0;l<a.length;l++){var h=a[l];if(h){if(h+s>i){u=l;break}s+=h}}for(var d=[],l=0;l<t.length;l++){var g=e[l];typeof g=="number"&&(g<u||g===u&&s++<i)&&d.push(t[l])}return d}function wn(t,i){var o=$(t.getText()),n=o.scan(),e=[],a=[],c=null,l=-1;function r(w){e.push(w),l=w.startLine}for(;n!==S.EOS;){switch(n){case S.StartTag:{var s=o.getTokenText(),u=t.positionAt(o.getTokenOffset()).line;a.push({startLine:u,tagName:s}),c=s;break}case S.EndTag:{c=o.getTokenText();break}case S.StartTagClose:if(!c||!pe(c))break;case S.EndTagClose:case S.StartTagSelfClose:{for(var h=a.length-1;h>=0&&a[h].tagName!==c;)h--;if(h>=0){var d=a[h];a.length=h;var g=t.positionAt(o.getTokenOffset()).line,u=d.startLine,y=g-1;y>u&&l!==u&&r({startLine:u,endLine:y})}break}case S.Comment:{var u=t.positionAt(o.getTokenOffset()).line,m=o.getTokenText(),A=m.match(/^\s*#(region\b)|(endregion\b)/);if(A)if(A[1])a.push({startLine:u,tagName:""});else{for(var h=a.length-1;h>=0&&a[h].tagName.length;)h--;if(h>=0){var d=a[h];a.length=h;var y=u;u=d.startLine,y>u&&l!==u&&r({startLine:u,endLine:y,kind:we.Region})}}else{var y=t.positionAt(o.getTokenOffset()+o.getTokenLength()).line;u<y&&r({startLine:u,endLine:y,kind:we.Comment})}break}}n=o.scan()}var E=i&&i.rangeLimit||Number.MAX_VALUE;return e.length>E?xi(e,E):e}function yn(t,i){function o(n){for(var e=Di(t,n),a=void 0,c=void 0,l=e.length-1;l>=0;l--){var r=e[l];(!a||r[0]!==a[0]||r[1]!==a[1])&&(c=Te.create(P.create(t.positionAt(e[l][0]),t.positionAt(e[l][1])),c)),a=r}return c||(c=Te.create(P.create(n,n))),c}return i.map(o)}function Di(t,i){var o=je(t.getText()),n=t.offsetAt(i),e=o.findNodeAt(n),a=Ei(e);if(e.startTagEnd&&!e.endTagStart){if(e.startTagEnd!==e.end)return[[e.start,e.end]];var c=P.create(t.positionAt(e.startTagEnd-2),t.positionAt(e.startTagEnd)),l=t.getText(c);l==="/>"?a.unshift([e.start+1,e.startTagEnd-2]):a.unshift([e.start+1,e.startTagEnd-1]);var r=_n(t,e,n);return a=r.concat(a),a}if(!e.startTagEnd||!e.endTagStart)return a;if(a.unshift([e.start,e.end]),e.start<n&&n<e.startTagEnd){a.unshift([e.start+1,e.startTagEnd-1]);var r=_n(t,e,n);return a=r.concat(a),a}else return e.startTagEnd<=n&&n<=e.endTagStart?(a.unshift([e.startTagEnd,e.endTagStart]),a):(n>=e.endTagStart+2&&a.unshift([e.endTagStart+2,e.end-1]),a)}function Ei(t){for(var i=t,o=function(e){return e.startTagEnd&&e.endTagStart&&e.startTagEnd<e.endTagStart?[[e.startTagEnd,e.endTagStart],[e.start,e.end]]:[[e.start,e.end]]},n=[];i.parent;)i=i.parent,o(i).forEach(function(e){return n.push(e)});return n}function _n(t,i,o){for(var n=P.create(t.positionAt(i.start),t.positionAt(i.end)),e=t.getText(n),a=o-i.start,c=$(e),l=c.scan(),r=i.start,s=[],u=!1,h=-1;l!==S.EOS;){switch(l){case S.AttributeName:{if(a<c.getTokenOffset()){u=!1;break}a<=c.getTokenEnd()&&s.unshift([c.getTokenOffset(),c.getTokenEnd()]),u=!0,h=c.getTokenOffset();break}case S.AttributeValue:{if(!u)break;var d=c.getTokenText();if(a<c.getTokenOffset()){s.push([h,c.getTokenEnd()]);break}a>=c.getTokenOffset()&&a<=c.getTokenEnd()&&(s.unshift([c.getTokenOffset(),c.getTokenEnd()]),(d[0]==='"'&&d[d.length-1]==='"'||d[0]==="'"&&d[d.length-1]==="'")&&a>=c.getTokenOffset()+1&&a<=c.getTokenEnd()-1&&s.unshift([c.getTokenOffset()+1,c.getTokenEnd()-1]),s.push([h,c.getTokenEnd()]));break}}l=c.scan()}return s.map(function(g){return[g[0]+r,g[1]+r]})}var bt={version:1.1,tags:[{name:"html",description:{kind:"markdown",value:"The html element represents the root of an HTML document."},attributes:[{name:"manifest",description:{kind:"markdown",value:"Specifies the URI of a resource manifest indicating resources that should be cached locally. See [Using the application cache](https://developer.mozilla.org/en-US/docs/Web/HTML/Using_the_application_cache) for details."}},{name:"version",description:'Specifies the version of the HTML [Document Type Definition](https://developer.mozilla.org/en-US/docs/Glossary/DTD "Document Type Definition: In HTML, the doctype is the required "<!DOCTYPE html>" preamble found at the top of all documents. Its sole purpose is to prevent a browser from switching into so-called \u201Cquirks mode\u201D when rendering a document; that is, the "<!DOCTYPE html>" doctype ensures that the browser makes a best-effort attempt at following the relevant specifications, rather than using a different rendering mode that is incompatible with some specifications.") that governs the current document. This attribute is not needed, because it is redundant with the version information in the document type declaration.'},{name:"xmlns",description:'Specifies the XML Namespace of the document. Default value is `"http://www.w3.org/1999/xhtml"`. This is required in documents parsed with XML parsers, and optional in text/html documents.'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/html"}]},{name:"head",description:{kind:"markdown",value:"The head element represents a collection of metadata for the Document."},attributes:[{name:"profile",description:"The URIs of one or more metadata profiles, separated by white space."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/head"}]},{name:"title",description:{kind:"markdown",value:"The title element represents the document's title or name. Authors should use titles that identify their documents even when they are used out of context, for example in a user's history or bookmarks, or in search results. The document's title is often different from its first heading, since the first heading does not have to stand alone when taken out of context."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/title"}]},{name:"base",description:{kind:"markdown",value:"The base element allows authors to specify the document base URL for the purposes of resolving relative URLs, and the name of the default browsing context for the purposes of following hyperlinks. The element does not represent any content beyond this information."},attributes:[{name:"href",description:{kind:"markdown",value:"The base URL to be used throughout the document for relative URL addresses. If this attribute is specified, this element must come before any other elements with attributes whose values are URLs. Absolute and relative URLs are allowed."}},{name:"target",description:{kind:"markdown",value:"A name or keyword indicating the default location to display the result when hyperlinks or forms cause navigation, for elements that do not have an explicit target reference. It is a name of, or keyword for, a _browsing context_ (for example: tab, window, or inline frame). The following keywords have special meanings:\n\n*   `_self`: Load the result into the same browsing context as the current one. This value is the default if the attribute is not specified.\n*   `_blank`: Load the result into a new unnamed browsing context.\n*   `_parent`: Load the result into the parent browsing context of the current one. If there is no parent, this option behaves the same way as `_self`.\n*   `_top`: Load the result into the top-level browsing context (that is, the browsing context that is an ancestor of the current one, and has no parent). If there is no parent, this option behaves the same way as `_self`.\n\nIf this attribute is specified, this element must come before any other elements with attributes whose values are URLs."}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/base"}]},{name:"link",description:{kind:"markdown",value:"The link element allows authors to link their document to other resources."},attributes:[{name:"href",description:{kind:"markdown",value:'This attribute specifies the [URL](https://developer.mozilla.org/en-US/docs/Glossary/URL "URL: Uniform Resource Locator (URL) is a text string specifying where a resource can be found on the Internet.") of the linked resource. A URL can be absolute or relative.'}},{name:"crossorigin",valueSet:"xo",description:{kind:"markdown",value:'This enumerated attribute indicates whether [CORS](https://developer.mozilla.org/en-US/docs/Glossary/CORS "CORS: CORS (Cross-Origin Resource Sharing) is a system, consisting of transmitting HTTP headers, that determines whether browsers block frontend JavaScript code from accessing responses for cross-origin requests.") must be used when fetching the resource. [CORS-enabled images](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_Enabled_Image) can be reused in the [`<canvas>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas "Use the HTML <canvas> element with either the canvas scripting API or the WebGL API to draw graphics and animations.") element without being _tainted_. The allowed values are:\n\n`anonymous`\n\nA cross-origin request (i.e. with an [`Origin`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin "The Origin request header indicates where a fetch originates from. It doesn\'t include any path information, but only the server name. It is sent with CORS requests, as well as with POST requests. It is similar to the Referer header, but, unlike this header, it doesn\'t disclose the whole path.") HTTP header) is performed, but no credential is sent (i.e. no cookie, X.509 certificate, or HTTP Basic authentication). If the server does not give credentials to the origin site (by not setting the [`Access-Control-Allow-Origin`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin "The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin.") HTTP header) the image will be tainted and its usage restricted.\n\n`use-credentials`\n\nA cross-origin request (i.e. with an `Origin` HTTP header) is performed along with a credential sent (i.e. a cookie, certificate, and/or HTTP Basic authentication is performed). If the server does not give credentials to the origin site (through [`Access-Control-Allow-Credentials`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials "The Access-Control-Allow-Credentials response header tells browsers whether to expose the response to frontend JavaScript code when the request\'s credentials mode (Request.credentials) is "include".") HTTP header), the resource will be _tainted_ and its usage restricted.\n\nIf the attribute is not present, the resource is fetched without a [CORS](https://developer.mozilla.org/en-US/docs/Glossary/CORS "CORS: CORS (Cross-Origin Resource Sharing) is a system, consisting of transmitting HTTP headers, that determines whether browsers block frontend JavaScript code from accessing responses for cross-origin requests.") request (i.e. without sending the `Origin` HTTP header), preventing its non-tainted usage. If invalid, it is handled as if the enumerated keyword **anonymous** was used. See [CORS settings attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for additional information.'}},{name:"rel",description:{kind:"markdown",value:"This attribute names a relationship of the linked document to the current document. The attribute must be a space-separated list of the [link types values](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)."}},{name:"media",description:{kind:"markdown",value:"This attribute specifies the media that the linked resource applies to. Its value must be a media type / [media query](https://developer.mozilla.org/en-US/docs/Web/CSS/Media_queries). This attribute is mainly useful when linking to external stylesheets \u2014 it allows the user agent to pick the best adapted one for the device it runs on.\n\n**Notes:**\n\n*   In HTML 4, this can only be a simple white-space-separated list of media description literals, i.e., [media types and groups](https://developer.mozilla.org/en-US/docs/Web/CSS/@media), where defined and allowed as values for this attribute, such as `print`, `screen`, `aural`, `braille`. HTML5 extended this to any kind of [media queries](https://developer.mozilla.org/en-US/docs/Web/CSS/Media_queries), which are a superset of the allowed values of HTML 4.\n*   Browsers not supporting [CSS3 Media Queries](https://developer.mozilla.org/en-US/docs/Web/CSS/Media_queries) won't necessarily recognize the adequate link; do not forget to set fallback links, the restricted set of media queries defined in HTML 4."}},{name:"hreflang",description:{kind:"markdown",value:"This attribute indicates the language of the linked resource. It is purely advisory. Allowed values are determined by [BCP47](https://www.ietf.org/rfc/bcp/bcp47.txt). Use this attribute only if the [`href`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-href) attribute is present."}},{name:"type",description:{kind:"markdown",value:'This attribute is used to define the type of the content linked to. The value of the attribute should be a MIME type such as **text/html**, **text/css**, and so on. The common use of this attribute is to define the type of stylesheet being referenced (such as **text/css**), but given that CSS is the only stylesheet language used on the web, not only is it possible to omit the `type` attribute, but is actually now recommended practice. It is also used on `rel="preload"` link types, to make sure the browser only downloads file types that it supports.'}},{name:"sizes",description:{kind:"markdown",value:"This attribute defines the sizes of the icons for visual media contained in the resource. It must be present only if the [`rel`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-rel) contains a value of `icon` or a non-standard type such as Apple's `apple-touch-icon`. It may have the following values:\n\n*   `any`, meaning that the icon can be scaled to any size as it is in a vector format, like `image/svg+xml`.\n*   a white-space separated list of sizes, each in the format `_<width in pixels>_x_<height in pixels>_` or `_<width in pixels>_X_<height in pixels>_`. Each of these sizes must be contained in the resource.\n\n**Note:** Most icon formats are only able to store one single icon; therefore most of the time the [`sizes`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes#attr-sizes) contains only one entry. MS's ICO format does, as well as Apple's ICNS. ICO is more ubiquitous; you should definitely use it."}},{name:"as",description:'This attribute is only used when `rel="preload"` or `rel="prefetch"` has been set on the `<link>` element. It specifies the type of content being loaded by the `<link>`, which is necessary for content prioritization, request matching, application of correct [content security policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP), and setting of correct [`Accept`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept "The Accept request HTTP header advertises which content types, expressed as MIME types, the client is able to understand. Using content negotiation, the server then selects one of the proposals, uses it and informs the client of its choice with the Content-Type response header. Browsers set adequate values for this header depending on\xA0the context where the request is done: when fetching a CSS stylesheet a different value is set for the request than when fetching an image,\xA0video or a script.") request header.'},{name:"importance",description:"Indicates the relative importance of the resource. Priority hints are delegated using the values:"},{name:"importance",description:'**`auto`**: Indicates\xA0**no\xA0preference**. The browser may use its own heuristics to decide the priority of the resource.\n\n**`high`**: Indicates to the\xA0browser\xA0that the resource is of\xA0**high** priority.\n\n**`low`**:\xA0Indicates to the\xA0browser\xA0that the resource is of\xA0**low** priority.\n\n**Note:** The `importance` attribute may only be used for the `<link>` element if `rel="preload"` or `rel="prefetch"` is present.'},{name:"integrity",description:"Contains inline metadata \u2014 a base64-encoded cryptographic hash of the resource (file) you\u2019re telling the browser to fetch. The browser can use this to verify that the fetched resource has been delivered free of unexpected manipulation. See [Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity)."},{name:"referrerpolicy",description:'A string indicating which referrer to use when fetching the resource:\n\n*   `no-referrer` means that the [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer "The Referer request header contains the address of the previous web page from which a link to the currently requested page was followed. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching, for example.") header will not be sent.\n*   `no-referrer-when-downgrade` means that no [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer "The Referer request header contains the address of the previous web page from which a link to the currently requested page was followed. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching, for example.") header will be sent when navigating to an origin without TLS (HTTPS). This is a user agent\u2019s default behavior, if no policy is otherwise specified.\n*   `origin` means that the referrer will be the origin of the page, which is roughly the scheme, the host, and the port.\n*   `origin-when-cross-origin` means that navigating to other origins will be limited to the scheme, the host, and the port, while navigating on the same origin will include the referrer\'s path.\n*   `unsafe-url` means that the referrer will include the origin and the path (but not the fragment, password, or username). This case is unsafe because it can leak origins and paths from TLS-protected resources to insecure origins.'},{name:"title",description:'The `title` attribute has special semantics on the `<link>` element. When used on a `<link rel="stylesheet">` it defines a [preferred or an alternate stylesheet](https://developer.mozilla.org/en-US/docs/Web/CSS/Alternative_style_sheets). Incorrectly using it may [cause the stylesheet to be ignored](https://developer.mozilla.org/en-US/docs/Correctly_Using_Titles_With_External_Stylesheets).'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/link"}]},{name:"meta",description:{kind:"markdown",value:"The meta element represents various kinds of metadata that cannot be expressed using the title, base, link, style, and script elements."},attributes:[{name:"name",description:{kind:"markdown",value:`This attribute defines the name of a piece of document-level metadata. It should not be set if one of the attributes [\`itemprop\`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes#attr-itemprop), [\`http-equiv\`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-http-equiv) or [\`charset\`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-charset) is also set.
+
+This metadata name is associated with the value contained by the [\`content\`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-content) attribute. The possible values for the name attribute are:
+
+*   \`application-name\` which defines the name of the application running in the web page.
+    
+    **Note:**
+    
+    *   Browsers may use this to identify the application. It is different from the [\`<title>\`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title "The HTML Title element (<title>) defines the document's title that is shown in a browser's title bar or a page's tab.") element, which usually contain the application name, but may also contain information like the document name or a status.
+    *   Simple web pages shouldn't define an application-name.
+    
+*   \`author\` which defines the name of the document's author.
+*   \`description\` which contains a short and accurate summary of the content of the page. Several browsers, like Firefox and Opera, use this as the default description of bookmarked pages.
+*   \`generator\` which contains the identifier of the software that generated the page.
+*   \`keywords\` which contains words relevant to the page's content separated by commas.
+*   \`referrer\` which controls the [\`Referer\` HTTP header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer) attached to requests sent from the document:
+    
+    Values for the \`content\` attribute of \`<meta name="referrer">\`
+    
+    \`no-referrer\`
+    
+    Do not send a HTTP \`Referrer\` header.
+    
+    \`origin\`
+    
+    Send the [origin](https://developer.mozilla.org/en-US/docs/Glossary/Origin) of the document.
+    
+    \`no-referrer-when-downgrade\`
+    
+    Send the [origin](https://developer.mozilla.org/en-US/docs/Glossary/Origin) as a referrer to URLs as secure as the current page, (https\u2192https), but does not send a referrer to less secure URLs (https\u2192http). This is the default behaviour.
+    
+    \`origin-when-cross-origin\`
+    
+    Send the full URL (stripped of parameters) for same-origin requests, but only send the [origin](https://developer.mozilla.org/en-US/docs/Glossary/Origin) for other cases.
+    
+    \`same-origin\`
+    
+    A referrer will be sent for [same-site origins](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy), but cross-origin requests will contain no referrer information.
+    
+    \`strict-origin\`
+    
+    Only send the origin of the document as the referrer to a-priori as-much-secure destination (HTTPS->HTTPS), but don't send it to a less secure destination (HTTPS->HTTP).
+    
+    \`strict-origin-when-cross-origin\`
+    
+    Send a full URL when performing a same-origin request, only send the origin of the document to a-priori as-much-secure destination (HTTPS->HTTPS), and send no header to a less secure destination (HTTPS->HTTP).
+    
+    \`unsafe-URL\`
+    
+    Send the full URL (stripped of parameters) for same-origin or cross-origin requests.
+    
+    **Notes:**
+    
+    *   Some browsers support the deprecated values of \`always\`, \`default\`, and \`never\` for referrer.
+    *   Dynamically inserting \`<meta name="referrer">\` (with [\`document.write\`](https://developer.mozilla.org/en-US/docs/Web/API/Document/write) or [\`appendChild\`](https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild)) makes the referrer behaviour unpredictable.
+    *   When several conflicting policies are defined, the no-referrer policy is applied.
+    
+
+This attribute may also have a value taken from the extended list defined on [WHATWG Wiki MetaExtensions page](https://wiki.whatwg.org/wiki/MetaExtensions). Although none have been formally accepted yet, a few commonly used names are:
+
+*   \`creator\` which defines the name of the creator of the document, such as an organization or institution. If there are more than one, several [\`<meta>\`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta "The HTML <meta> element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>.") elements should be used.
+*   \`googlebot\`, a synonym of \`robots\`, is only followed by Googlebot (the indexing crawler for Google).
+*   \`publisher\` which defines the name of the document's publisher.
+*   \`robots\` which defines the behaviour that cooperative crawlers, or "robots", should use with the page. It is a comma-separated list of the values below:
+    
+    Values for the content of \`<meta name="robots">\`
+    
+    Value
+    
+    Description
+    
+    Used by
+    
+    \`index\`
+    
+    Allows the robot to index the page (default).
+    
+    All
+    
+    \`noindex\`
+    
+    Requests the robot to not index the page.
+    
+    All
+    
+    \`follow\`
+    
+    Allows the robot to follow the links on the page (default).
+    
+    All
+    
+    \`nofollow\`
+    
+    Requests the robot to not follow the links on the page.
+    
+    All
+    
+    \`none\`
+    
+    Equivalent to \`noindex, nofollow\`
+    
+    [Google](https://support.google.com/webmasters/answer/79812)
+    
+    \`noodp\`
+    
+    Prevents using the [Open Directory Project](https://www.dmoz.org/) description, if any, as the page description in search engine results.
+    
+    [Google](https://support.google.com/webmasters/answer/35624#nodmoz), [Yahoo](https://help.yahoo.com/kb/search-for-desktop/meta-tags-robotstxt-yahoo-search-sln2213.html#cont5), [Bing](https://www.bing.com/webmaster/help/which-robots-metatags-does-bing-support-5198d240)
+    
+    \`noarchive\`
+    
+    Requests the search engine not to cache the page content.
+    
+    [Google](https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag#valid-indexing--serving-directives), [Yahoo](https://help.yahoo.com/kb/search-for-desktop/SLN2213.html), [Bing](https://www.bing.com/webmaster/help/which-robots-metatags-does-bing-support-5198d240)
+    
+    \`nosnippet\`
+    
+    Prevents displaying any description of the page in search engine results.
+    
+    [Google](https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag#valid-indexing--serving-directives), [Bing](https://www.bing.com/webmaster/help/which-robots-metatags-does-bing-support-5198d240)
+    
+    \`noimageindex\`
+    
+    Requests this page not to appear as the referring page of an indexed image.
+    
+    [Google](https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag#valid-indexing--serving-directives)
+    
+    \`nocache\`
+    
+    Synonym of \`noarchive\`.
+    
+    [Bing](https://www.bing.com/webmaster/help/which-robots-metatags-does-bing-support-5198d240)
+    
+    **Notes:**
+    
+    *   Only cooperative robots follow these rules. Do not expect to prevent e-mail harvesters with them.
+    *   The robot still needs to access the page in order to read these rules. To prevent bandwidth consumption, use a _[robots.txt](https://developer.mozilla.org/en-US/docs/Glossary/robots.txt "robots.txt: Robots.txt is a file which is usually placed in the root of any website. It decides whether\xA0crawlers are permitted or forbidden access to the web site.")_ file.
+    *   If you want to remove a page, \`noindex\` will work, but only after the robot visits the page again. Ensure that the \`robots.txt\` file is not preventing revisits.
+    *   Some values are mutually exclusive, like \`index\` and \`noindex\`, or \`follow\` and \`nofollow\`. In these cases the robot's behaviour is undefined and may vary between them.
+    *   Some crawler robots, like Google, Yahoo and Bing, support the same values for the HTTP header \`X-Robots-Tag\`; this allows non-HTML documents like images to use these rules.
+    
+*   \`slurp\`, is a synonym of \`robots\`, but only for Slurp - the crawler for Yahoo Search.
+*   \`viewport\`, which gives hints about the size of the initial size of the [viewport](https://developer.mozilla.org/en-US/docs/Glossary/viewport "viewport: A viewport represents a polygonal (normally rectangular) area in computer graphics that is currently being viewed. In web browser terms, it refers to the part of the document you're viewing which is currently visible in its window (or the screen, if the document is being viewed in full screen mode). Content outside the viewport is not visible onscreen until scrolled into view."). Used by mobile devices only.
+    
+    Values for the content of \`<meta name="viewport">\`
+    
+    Value
+    
+    Possible subvalues
+    
+    Description
+    
+    \`width\`
+    
+    A positive integer number, or the text \`device-width\`
+    
+    Defines the pixel width of the viewport that you want the web site to be rendered at.
+    
+    \`height\`
+    
+    A positive integer, or the text \`device-height\`
+    
+    Defines the height of the viewport. Not used by any browser.
+    
+    \`initial-scale\`
+    
+    A positive number between \`0.0\` and \`10.0\`
+    
+    Defines the ratio between the device width (\`device-width\` in portrait mode or \`device-height\` in landscape mode) and the viewport size.
+    
+    \`maximum-scale\`
+    
+    A positive number between \`0.0\` and \`10.0\`
+    
+    Defines the maximum amount to zoom in. It must be greater or equal to the \`minimum-scale\` or the behaviour is undefined. Browser settings can ignore this rule and iOS10+ ignores it by default.
+    
+    \`minimum-scale\`
+    
+    A positive number between \`0.0\` and \`10.0\`
+    
+    Defines the minimum zoom level. It must be smaller or equal to the \`maximum-scale\` or the behaviour is undefined. Browser settings can ignore this rule and iOS10+ ignores it by default.
+    
+    \`user-scalable\`
+    
+    \`yes\` or \`no\`
+    
+    If set to \`no\`, the user is not able to zoom in the webpage. The default is \`yes\`. Browser settings can ignore this rule, and iOS10+ ignores it by default.
+    
+    Specification
+    
+    Status
+    
+    Comment
+    
+    [CSS Device Adaptation  
+    The definition of '<meta name="viewport">' in that specification.](https://drafts.csswg.org/css-device-adapt/#viewport-meta)
+    
+    Working Draft
+    
+    Non-normatively describes the Viewport META element
+    
+    See also: [\`@viewport\`](https://developer.mozilla.org/en-US/docs/Web/CSS/@viewport "The @viewport CSS at-rule lets you configure the viewport through which the document is viewed. It's primarily used for mobile devices, but is also used by desktop browsers that support features like "snap to edge" (such as Microsoft Edge).")
+    
+    **Notes:**
+    
+    *   Though unstandardized, this declaration is respected by most mobile browsers due to de-facto dominance.
+    *   The default values may vary between devices and browsers.
+    *   To learn about this declaration in Firefox for Mobile, see [this article](https://developer.mozilla.org/en-US/docs/Mobile/Viewport_meta_tag "Mobile/Viewport meta tag").`}},{name:"http-equiv",description:{kind:"markdown",value:'Defines a pragma directive. The attribute is named `**http-equiv**(alent)` because all the allowed values are names of particular HTTP headers:\n\n*   `"content-language"`  \n    Defines the default language of the page. It can be overridden by the [lang](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang) attribute on any element.\n    \n    **Warning:** Do not use this value, as it is obsolete. Prefer the `lang` attribute on the [`<html>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/html "The HTML <html> element represents the root (top-level element) of an HTML document, so it is also referred to as the root element. All other elements must be descendants of this element.") element.\n    \n*   `"content-security-policy"`  \n    Allows page authors to define a [content policy](https://developer.mozilla.org/en-US/docs/Web/Security/CSP/CSP_policy_directives) for the current page. Content policies mostly specify allowed server origins and script endpoints which help guard against cross-site scripting attacks.\n*   `"content-type"`  \n    Defines the [MIME type](https://developer.mozilla.org/en-US/docs/Glossary/MIME_type) of the document, followed by its character encoding. It follows the same syntax as the HTTP `content-type` entity-header field, but as it is inside a HTML page, most values other than `text/html` are impossible. Therefore the valid syntax for its `content` is the string \'`text/html`\' followed by a character set with the following syntax: \'`; charset=_IANAcharset_`\', where `IANAcharset` is the _preferred MIME name_ for a character set as [defined by the IANA.](https://www.iana.org/assignments/character-sets)\n    \n    **Warning:** Do not use this value, as it is obsolete. Use the [`charset`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-charset) attribute on the [`<meta>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta "The HTML <meta> element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>.") element.\n    \n    **Note:** As [`<meta>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta "The HTML <meta> element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>.") can\'t change documents\' types in XHTML or HTML5\'s XHTML serialization, never set the MIME type to an XHTML MIME type with `<meta>`.\n    \n*   `"refresh"`  \n    This instruction specifies:\n    *   The number of seconds until the page should be reloaded - only if the [`content`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-content) attribute contains a positive integer.\n    *   The number of seconds until the page should redirect to another - only if the [`content`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-content) attribute contains a positive integer followed by the string \'`;url=`\', and a valid URL.\n*   `"set-cookie"`  \n    Defines a [cookie](https://developer.mozilla.org/en-US/docs/cookie) for the page. Its content must follow the syntax defined in the [IETF HTTP Cookie Specification](https://tools.ietf.org/html/draft-ietf-httpstate-cookie-14).\n    \n    **Warning:** Do not use this instruction, as it is obsolete. Use the HTTP header [`Set-Cookie`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie) instead.'}},{name:"content",description:{kind:"markdown",value:"This attribute contains the value for the [`http-equiv`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-http-equiv) or [`name`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-name) attribute, depending on which is used."}},{name:"charset",description:{kind:"markdown",value:'This attribute declares the page\'s character encoding. It must contain a [standard IANA MIME name for character encodings](https://www.iana.org/assignments/character-sets). Although the standard doesn\'t request a specific encoding, it suggests:\n\n*   Authors are encouraged to use [`UTF-8`](https://developer.mozilla.org/en-US/docs/Glossary/UTF-8).\n*   Authors should not use ASCII-incompatible encodings to avoid security risk: browsers not supporting them may interpret harmful content as HTML. This happens with the `JIS_C6226-1983`, `JIS_X0212-1990`, `HZ-GB-2312`, `JOHAB`, the ISO-2022 family and the EBCDIC family.\n\n**Note:** ASCII-incompatible encodings are those that don\'t map the 8-bit code points `0x20` to `0x7E` to the `0x0020` to `0x007E` Unicode code points)\n\n*   Authors **must not** use `CESU-8`, `UTF-7`, `BOCU-1` and/or `SCSU` as [cross-site scripting](https://developer.mozilla.org/en-US/docs/Glossary/Cross-site_scripting) attacks with these encodings have been demonstrated.\n*   Authors should not use `UTF-32` because not all HTML5 encoding algorithms can distinguish it from `UTF-16`.\n\n**Notes:**\n\n*   The declared character encoding must match the one the page was saved with to avoid garbled characters and security holes.\n*   The [`<meta>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta "The HTML <meta> element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>.") element declaring the encoding must be inside the [`<head>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head "The HTML <head> element provides general information (metadata) about the document, including its title and links to its\xA0scripts and style sheets.") element and **within the first 1024 bytes** of the HTML as some browsers only look at those bytes before choosing an encoding.\n*   This [`<meta>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta "The HTML <meta> element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>.") element is only one part of the [algorithm to determine a page\'s character set](https://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#encoding-sniffing-algorithm "Algorithm charset page"). The [`Content-Type` header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type) and any [Byte-Order Marks](https://developer.mozilla.org/en-US/docs/Glossary/Byte-Order_Mark "The definition of that term (Byte-Order Marks) has not been written yet; please consider contributing it!") override this element.\n*   It is strongly recommended to define the character encoding. If a page\'s encoding is undefined, cross-scripting techniques are possible, such as the [`UTF-7` fallback cross-scripting technique](https://code.google.com/p/doctype-mirror/wiki/ArticleUtf7).\n*   The [`<meta>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta "The HTML <meta> element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>.") element with a `charset` attribute is a synonym for the pre-HTML5 `<meta http-equiv="Content-Type" content="text/html; charset=_IANAcharset_">`, where _`IANAcharset`_ contains the value of the equivalent [`charset`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-charset) attribute. This syntax is still allowed, although no longer recommended.'}},{name:"scheme",description:"This attribute defines the scheme in which metadata is described. A scheme is a context leading to the correct interpretations of the [`content`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-content) value, like a format.\n\n**Warning:** Do not use this value, as it is obsolete. There is no replacement as there was no real usage for it."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/meta"}]},{name:"style",description:{kind:"markdown",value:"The style element allows authors to embed style information in their documents. The style element is one of several inputs to the styling processing model. The element does not represent content for the user."},attributes:[{name:"media",description:{kind:"markdown",value:"This attribute defines which media the style should be applied to. Its value is a [media query](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Media_queries), which defaults to `all` if the attribute is missing."}},{name:"nonce",description:{kind:"markdown",value:"A cryptographic nonce (number used once) used to whitelist inline styles in a [style-src Content-Security-Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src). The server must generate a unique nonce value each time it transmits a policy. It is critical to provide a nonce that cannot be guessed as bypassing a resource\u2019s policy is otherwise trivial."}},{name:"type",description:{kind:"markdown",value:"This attribute defines the styling language as a MIME type (charset should not be specified). This attribute is optional and defaults to `text/css` if it is not specified \u2014 there is very little reason to include this in modern web documents."}},{name:"scoped",valueSet:"v"},{name:"title",description:"This attribute specifies [alternative style sheet](https://developer.mozilla.org/en-US/docs/Web/CSS/Alternative_style_sheets) sets."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/style"}]},{name:"body",description:{kind:"markdown",value:"The body element represents the content of the document."},attributes:[{name:"onafterprint",description:{kind:"markdown",value:"Function to call after the user has printed the document."}},{name:"onbeforeprint",description:{kind:"markdown",value:"Function to call when the user requests printing of the document."}},{name:"onbeforeunload",description:{kind:"markdown",value:"Function to call when the document is about to be unloaded."}},{name:"onhashchange",description:{kind:"markdown",value:"Function to call when the fragment identifier part (starting with the hash (`'#'`) character) of the document's current address has changed."}},{name:"onlanguagechange",description:{kind:"markdown",value:"Function to call when the preferred languages changed."}},{name:"onmessage",description:{kind:"markdown",value:"Function to call when the document has received a message."}},{name:"onoffline",description:{kind:"markdown",value:"Function to call when network communication has failed."}},{name:"ononline",description:{kind:"markdown",value:"Function to call when network communication has been restored."}},{name:"onpagehide"},{name:"onpageshow"},{name:"onpopstate",description:{kind:"markdown",value:"Function to call when the user has navigated session history."}},{name:"onstorage",description:{kind:"markdown",value:"Function to call when the storage area has changed."}},{name:"onunload",description:{kind:"markdown",value:"Function to call when the document is going away."}},{name:"alink",description:'Color of text for hyperlinks when selected. _This method is non-conforming, use CSS [`color`](https://developer.mozilla.org/en-US/docs/Web/CSS/color "The color CSS property sets the foreground color value of an element\'s text and text decorations, and sets the currentcolor value.") property in conjunction with the [`:active`](https://developer.mozilla.org/en-US/docs/Web/CSS/:active "The :active CSS pseudo-class represents an element (such as a button) that is being activated by the user.") pseudo-class instead._'},{name:"background",description:'URI of a image to use as a background. _This method is non-conforming, use CSS [`background`](https://developer.mozilla.org/en-US/docs/Web/CSS/background "The background shorthand CSS property sets all background style properties at once, such as color, image, origin and size, or repeat method.") property on the element instead._'},{name:"bgcolor",description:'Background color for the document. _This method is non-conforming, use CSS [`background-color`](https://developer.mozilla.org/en-US/docs/Web/CSS/background-color "The background-color CSS property sets the background color of an element.") property on the element instead._'},{name:"bottommargin",description:'The margin of the bottom of the body. _This method is non-conforming, use CSS [`margin-bottom`](https://developer.mozilla.org/en-US/docs/Web/CSS/margin-bottom "The margin-bottom CSS property sets the margin area on the bottom of an element. A positive value places it farther from its neighbors, while a negative value places it closer.") property on the element instead._'},{name:"leftmargin",description:'The margin of the left of the body. _This method is non-conforming, use CSS [`margin-left`](https://developer.mozilla.org/en-US/docs/Web/CSS/margin-left "The margin-left CSS property sets the margin area on the left side of an element. A positive value places it farther from its neighbors, while a negative value places it closer.") property on the element instead._'},{name:"link",description:'Color of text for unvisited hypertext links. _This method is non-conforming, use CSS [`color`](https://developer.mozilla.org/en-US/docs/Web/CSS/color "The color CSS property sets the foreground color value of an element\'s text and text decorations, and sets the currentcolor value.") property in conjunction with the [`:link`](https://developer.mozilla.org/en-US/docs/Web/CSS/:link "The :link CSS pseudo-class represents an element that has not yet been visited. It matches every unvisited <a>, <area>, or <link> element that has an href attribute.") pseudo-class instead._'},{name:"onblur",description:"Function to call when the document loses focus."},{name:"onerror",description:"Function to call when the document fails to load properly."},{name:"onfocus",description:"Function to call when the document receives focus."},{name:"onload",description:"Function to call when the document has finished loading."},{name:"onredo",description:"Function to call when the user has moved forward in undo transaction history."},{name:"onresize",description:"Function to call when the document has been resized."},{name:"onundo",description:"Function to call when the user has moved backward in undo transaction history."},{name:"rightmargin",description:'The margin of the right of the body. _This method is non-conforming, use CSS [`margin-right`](https://developer.mozilla.org/en-US/docs/Web/CSS/margin-right "The margin-right CSS property sets the margin area on the right side of an element. A positive value places it farther from its neighbors, while a negative value places it closer.") property on the element instead._'},{name:"text",description:'Foreground color of text. _This method is non-conforming, use CSS [`color`](https://developer.mozilla.org/en-US/docs/Web/CSS/color "The color CSS property sets the foreground color value of an element\'s text and text decorations, and sets the currentcolor value.") property on the element instead._'},{name:"topmargin",description:'The margin of the top of the body. _This method is non-conforming, use CSS [`margin-top`](https://developer.mozilla.org/en-US/docs/Web/CSS/margin-top "The margin-top CSS property sets the margin area on the top of an element. A positive value places it farther from its neighbors, while a negative value places it closer.") property on the element instead._'},{name:"vlink",description:'Color of text for visited hypertext links. _This method is non-conforming, use CSS [`color`](https://developer.mozilla.org/en-US/docs/Web/CSS/color "The color CSS property sets the foreground color value of an element\'s text and text decorations, and sets the currentcolor value.") property in conjunction with the [`:visited`](https://developer.mozilla.org/en-US/docs/Web/CSS/:visited "The :visited CSS pseudo-class represents links that the user has already visited. For privacy reasons, the styles that can be modified using this selector are very limited.") pseudo-class instead._'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/body"}]},{name:"article",description:{kind:"markdown",value:"The article element represents a complete, or self-contained, composition in a document, page, application, or site and that is, in principle, independently distributable or reusable, e.g. in syndication. This could be a forum post, a magazine or newspaper article, a blog entry, a user-submitted comment, an interactive widget or gadget, or any other independent item of content. Each article should be identified, typically by including a heading (h1\u2013h6 element) as a child of the article element."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/article"}]},{name:"section",description:{kind:"markdown",value:"The section element represents a generic section of a document or application. A section, in this context, is a thematic grouping of content. Each section should be identified, typically by including a heading ( h1- h6 element) as a child of the section element."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/section"}]},{name:"nav",description:{kind:"markdown",value:"The nav element represents a section of a page that links to other pages or to parts within the page: a section with navigation links."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/nav"}]},{name:"aside",description:{kind:"markdown",value:"The aside element represents a section of a page that consists of content that is tangentially related to the content around the aside element, and which could be considered separate from that content. Such sections are often represented as sidebars in printed typography."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/aside"}]},{name:"h1",description:{kind:"markdown",value:"The h1 element represents a section heading."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/Heading_Elements"}]},{name:"h2",description:{kind:"markdown",value:"The h2 element represents a section heading."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/Heading_Elements"}]},{name:"h3",description:{kind:"markdown",value:"The h3 element represents a section heading."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/Heading_Elements"}]},{name:"h4",description:{kind:"markdown",value:"The h4 element represents a section heading."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/Heading_Elements"}]},{name:"h5",description:{kind:"markdown",value:"The h5 element represents a section heading."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/Heading_Elements"}]},{name:"h6",description:{kind:"markdown",value:"The h6 element represents a section heading."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/Heading_Elements"}]},{name:"header",description:{kind:"markdown",value:"The header element represents introductory content for its nearest ancestor sectioning content or sectioning root element. A header typically contains a group of introductory or navigational aids. When the nearest ancestor sectioning content or sectioning root element is the body element, then it applies to the whole page."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/header"}]},{name:"footer",description:{kind:"markdown",value:"The footer element represents a footer for its nearest ancestor sectioning content or sectioning root element. A footer typically contains information about its section such as who wrote it, links to related documents, copyright data, and the like."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/footer"}]},{name:"address",description:{kind:"markdown",value:"The address element represents the contact information for its nearest article or body element ancestor. If that is the body element, then the contact information applies to the document as a whole."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/address"}]},{name:"p",description:{kind:"markdown",value:"The p element represents a paragraph."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/p"}]},{name:"hr",description:{kind:"markdown",value:"The hr element represents a paragraph-level thematic break, e.g. a scene change in a story, or a transition to another topic within a section of a reference book."},attributes:[{name:"align",description:"Sets the alignment of the rule on the page. If no value is specified, the default value is `left`."},{name:"color",description:"Sets the color of the rule through color name or hexadecimal value."},{name:"noshade",description:"Sets the rule to have no shading."},{name:"size",description:"Sets the height, in pixels, of the rule."},{name:"width",description:"Sets the length of the rule on the page through a pixel or percentage value."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/hr"}]},{name:"pre",description:{kind:"markdown",value:"The pre element represents a block of preformatted text, in which structure is represented by typographic conventions rather than by elements."},attributes:[{name:"cols",description:'Contains the _preferred_ count of characters that a line should have. It was a non-standard synonym of [`width`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/pre#attr-width). To achieve such an effect, use CSS [`width`](https://developer.mozilla.org/en-US/docs/Web/CSS/width "The width CSS property sets an element\'s width. By default it sets the width of the content area, but if box-sizing is set to border-box, it sets the width of the border area.") instead.'},{name:"width",description:'Contains the _preferred_ count of characters that a line should have. Though technically still implemented, this attribute has no visual effect; to achieve such an effect, use CSS [`width`](https://developer.mozilla.org/en-US/docs/Web/CSS/width "The width CSS property sets an element\'s width. By default it sets the width of the content area, but if box-sizing is set to border-box, it sets the width of the border area.") instead.'},{name:"wrap",description:'Is a _hint_ indicating how the overflow must happen. In modern browser this hint is ignored and no visual effect results in its present; to achieve such an effect, use CSS [`white-space`](https://developer.mozilla.org/en-US/docs/Web/CSS/white-space "The white-space CSS property sets how white space inside an element is handled.") instead.'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/pre"}]},{name:"blockquote",description:{kind:"markdown",value:"The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a footer or cite element, and optionally with in-line changes such as annotations and abbreviations."},attributes:[{name:"cite",description:{kind:"markdown",value:"A URL that designates a source document or message for the information quoted. This attribute is intended to point to information explaining the context or the reference for the quote."}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/blockquote"}]},{name:"ol",description:{kind:"markdown",value:"The ol element represents a list of items, where the items have been intentionally ordered, such that changing the order would change the meaning of the document."},attributes:[{name:"reversed",valueSet:"v",description:{kind:"markdown",value:"This Boolean attribute specifies that the items of the list are specified in reversed order."}},{name:"start",description:{kind:"markdown",value:'This integer attribute specifies the start value for numbering the individual list items. Although the ordering type of list elements might be Roman numerals, such as XXXI, or letters, the value of start is always represented as a number. To start numbering elements from the letter "C", use `<ol start="3">`.\n\n**Note**: This attribute was deprecated in HTML4, but reintroduced in HTML5.'}},{name:"type",valueSet:"lt",description:{kind:"markdown",value:"Indicates the numbering type:\n\n*   `'a'` indicates lowercase letters,\n*   `'A'` indicates uppercase letters,\n*   `'i'` indicates lowercase Roman numerals,\n*   `'I'` indicates uppercase Roman numerals,\n*   and `'1'` indicates numbers (default).\n\nThe type set is used for the entire list unless a different [`type`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li#attr-type) attribute is used within an enclosed [`<li>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li \"The HTML <li> element is used to represent an item in a list. It must be contained in a parent element: an ordered list (<ol>), an unordered list (<ul>), or a menu (<menu>). In menus and unordered lists, list items are usually displayed using bullet points. In ordered lists, they are usually displayed with an ascending counter on the left, such as a number or letter.\") element.\n\n**Note:** This attribute was deprecated in HTML4, but reintroduced in HTML5.\n\nUnless the value of the list number matters (e.g. in legal or technical documents where items are to be referenced by their number/letter), the CSS [`list-style-type`](https://developer.mozilla.org/en-US/docs/Web/CSS/list-style-type \"The list-style-type CSS property sets the marker (such as a disc, character, or custom counter style) of a list item element.\") property should be used instead."}},{name:"compact",description:'This Boolean attribute hints that the list should be rendered in a compact style. The interpretation of this attribute depends on the user agent and it doesn\'t work in all browsers.\n\n**Warning:** Do not use this attribute, as it has been deprecated: the [`<ol>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol "The HTML <ol> element represents an ordered list of items, typically rendered as a numbered list.") element should be styled using [CSS](https://developer.mozilla.org/en-US/docs/CSS). To give an effect similar to the `compact` attribute, the [CSS](https://developer.mozilla.org/en-US/docs/CSS) property [`line-height`](https://developer.mozilla.org/en-US/docs/Web/CSS/line-height "The line-height CSS property sets the amount of space used for lines, such as in text. On block-level elements, it specifies the minimum height of line boxes within the element. On non-replaced inline elements, it specifies the height that is used to calculate line box height.") can be used with a value of `80%`.'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/ol"}]},{name:"ul",description:{kind:"markdown",value:"The ul element represents a list of items, where the order of the items is not important \u2014 that is, where changing the order would not materially change the meaning of the document."},attributes:[{name:"compact",description:'This Boolean attribute hints that the list should be rendered in a compact style. The interpretation of this attribute depends on the user agent and it doesn\'t work in all browsers.\n\n**Usage note:\xA0**Do not use this attribute, as it has been deprecated: the [`<ul>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul "The HTML <ul> element represents an unordered list of items, typically rendered as a bulleted list.") element should be styled using [CSS](https://developer.mozilla.org/en-US/docs/CSS). To give a similar effect as the `compact` attribute, the [CSS](https://developer.mozilla.org/en-US/docs/CSS) property [line-height](https://developer.mozilla.org/en-US/docs/CSS/line-height) can be used with a value of `80%`.'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/ul"}]},{name:"li",description:{kind:"markdown",value:"The li element represents a list item. If its parent element is an ol, ul, or menu element, then the element is an item of the parent element's list, as defined for those elements. Otherwise, the list item has no defined list-related relationship to any other li element."},attributes:[{name:"value",description:{kind:"markdown",value:'This integer attribute indicates the current ordinal value of the list item as defined by the [`<ol>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol "The HTML <ol> element represents an ordered list of items, typically rendered as a numbered list.") element. The only allowed value for this attribute is a number, even if the list is displayed with Roman numerals or letters. List items that follow this one continue numbering from the value set. The **value** attribute has no meaning for unordered lists ([`<ul>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul "The HTML <ul> element represents an unordered list of items, typically rendered as a bulleted list.")) or for menus ([`<menu>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/menu "The HTML <menu> element represents a group of commands that a user can perform or activate. This includes both list menus, which might appear across the top of a screen, as well as context menus, such as those that might appear underneath a button after it has been clicked.")).\n\n**Note**: This attribute was deprecated in HTML4, but reintroduced in HTML5.\n\n**Note:** Prior to Gecko\xA09.0, negative values were incorrectly converted to 0. Starting in Gecko\xA09.0 all integer values are correctly parsed.'}},{name:"type",description:'This character attribute indicates the numbering type:\n\n*   `a`: lowercase letters\n*   `A`: uppercase letters\n*   `i`: lowercase Roman numerals\n*   `I`: uppercase Roman numerals\n*   `1`: numbers\n\nThis type overrides the one used by its parent [`<ol>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol "The HTML <ol> element represents an ordered list of items, typically rendered as a numbered list.") element, if any.\n\n**Usage note:** This attribute has been deprecated: use the CSS [`list-style-type`](https://developer.mozilla.org/en-US/docs/Web/CSS/list-style-type "The list-style-type CSS property sets the marker (such as a disc, character, or custom counter style) of a list item element.") property instead.'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/li"}]},{name:"dl",description:{kind:"markdown",value:"The dl element represents an association list consisting of zero or more name-value groups (a description list). A name-value group consists of one or more names (dt elements) followed by one or more values (dd elements), ignoring any nodes other than dt and dd elements. Within a single dl element, there should not be more than one dt element for each name."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/dl"}]},{name:"dt",description:{kind:"markdown",value:"The dt element represents the term, or name, part of a term-description group in a description list (dl element)."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/dt"}]},{name:"dd",description:{kind:"markdown",value:"The dd element represents the description, definition, or value, part of a term-description group in a description list (dl element)."},attributes:[{name:"nowrap",description:"If the value of this attribute is set to `yes`, the definition text will not wrap. The default value is `no`."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/dd"}]},{name:"figure",description:{kind:"markdown",value:"The figure element represents some flow content, optionally with a caption, that is self-contained (like a complete sentence) and is typically referenced as a single unit from the main flow of the document."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/figure"}]},{name:"figcaption",description:{kind:"markdown",value:"The figcaption element represents a caption or legend for the rest of the contents of the figcaption element's parent figure element, if any."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/figcaption"}]},{name:"main",description:{kind:"markdown",value:"The main element represents the main content of the body of a document or application. The main content area consists of content that is directly related to or expands upon the central topic of a document or central functionality of an application."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/main"}]},{name:"div",description:{kind:"markdown",value:"The div element has no special meaning at all. It represents its children. It can be used with the class, lang, and title attributes to mark up semantics common to a group of consecutive elements."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/div"}]},{name:"a",description:{kind:"markdown",value:"If the a element has an href attribute, then it represents a hyperlink (a hypertext anchor) labeled by its contents."},attributes:[{name:"href",description:{kind:"markdown",value:"Contains a URL or a URL fragment that the hyperlink points to."}},{name:"target",description:{kind:"markdown",value:'Specifies where to display the linked URL. It is a name of, or keyword for, a _browsing context_: a tab, window, or `<iframe>`. The following keywords have special meanings:\n\n*   `_self`: Load the URL into the same browsing context as the current one. This is the default behavior.\n*   `_blank`: Load the URL into a new browsing context. This is usually a tab, but users can configure browsers to use new windows instead.\n*   `_parent`: Load the URL into the parent browsing context of the current one. If there is no parent, this behaves the same way as `_self`.\n*   `_top`: Load the URL into the top-level browsing context (that is, the "highest" browsing context that is an ancestor of the current one, and has no parent). If there is no parent, this behaves the same way as `_self`.\n\n**Note:** When using `target`, consider adding `rel="noreferrer"` to avoid exploitation of the `window.opener` API.\n\n**Note:** Linking to another page using `target="_blank"` will run the new page on the same process as your page. If the new page is executing expensive JS, your page\'s performance may suffer. To avoid this use `rel="noopener"`.'}},{name:"download",description:{kind:"markdown",value:"This attribute instructs browsers to download a URL instead of navigating to it, so the user will be prompted to save it as a local file. If the attribute has a value, it is used as the pre-filled file name in the Save prompt (the user can still change the file name if they want). There are no restrictions on allowed values, though `/` and `\\` are converted to underscores. Most file systems limit some punctuation in file names, and browsers will adjust the suggested name accordingly.\n\n**Notes:**\n\n*   This attribute only works for [same-origin URLs](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy).\n*   Although HTTP(s) URLs need to be in the same-origin, [`blob:` URLs](https://developer.mozilla.org/en-US/docs/Web/API/URL.createObjectURL) and [`data:` URLs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs) are allowed so that content generated by JavaScript, such as pictures created in an image-editor Web app, can be downloaded.\n*   If the HTTP header [`Content-Disposition:`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition) gives a different filename than this attribute, the HTTP header takes priority over this attribute.\n*   If `Content-Disposition:` is set to `inline`, Firefox prioritizes `Content-Disposition`, like the filename case, while Chrome prioritizes the `download` attribute."}},{name:"ping",description:{kind:"markdown",value:'Contains a space-separated list of URLs to which, when the hyperlink is followed, [`POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST "The HTTP POST method sends data to the server. The type of the body of the request is indicated by the Content-Type header.") requests with the body `PING` will be sent by the browser (in the background). Typically used for tracking.'}},{name:"rel",description:{kind:"markdown",value:"Specifies the relationship of the target object to the link object. The value is a space-separated list of [link types](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)."}},{name:"hreflang",description:{kind:"markdown",value:'This attribute indicates the human language of the linked resource. It is purely advisory, with no built-in functionality. Allowed values are determined by [BCP47](https://www.ietf.org/rfc/bcp/bcp47.txt "Tags for Identifying Languages").'}},{name:"type",description:{kind:"markdown",value:'Specifies the media type in the form of a [MIME type](https://developer.mozilla.org/en-US/docs/Glossary/MIME_type "MIME type: A\xA0MIME type\xA0(now properly called "media type", but\xA0also sometimes "content type") is a string sent along\xA0with a file indicating the type of the file (describing the content format, for example, a sound file might be labeled\xA0audio/ogg, or an image file\xA0image/png).") for the linked URL. It is purely advisory, with no built-in functionality.'}},{name:"referrerpolicy",description:"Indicates which [referrer](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer) to send when fetching the URL:\n\n*   `'no-referrer'` means the `Referer:` header will not be sent.\n*   `'no-referrer-when-downgrade'` means no `Referer:` header will be sent when navigating to an origin without HTTPS. This is the default behavior.\n*   `'origin'` means the referrer will be the [origin](https://developer.mozilla.org/en-US/docs/Glossary/Origin) of the page, not including information after the domain.\n*   `'origin-when-cross-origin'` meaning that navigations to other origins will be limited to the scheme, the host and the port, while navigations on the same origin will include the referrer's path.\n*   `'strict-origin-when-cross-origin'`\n*   `'unsafe-url'` means the referrer will include the origin and path, but not the fragment, password, or username. This is unsafe because it can leak data from secure URLs to insecure ones."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/a"}]},{name:"em",description:{kind:"markdown",value:"The em element represents stress emphasis of its contents."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/em"}]},{name:"strong",description:{kind:"markdown",value:"The strong element represents strong importance, seriousness, or urgency for its contents."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/strong"}]},{name:"small",description:{kind:"markdown",value:"The small element represents side comments such as small print."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/small"}]},{name:"s",description:{kind:"markdown",value:"The s element represents contents that are no longer accurate or no longer relevant."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/s"}]},{name:"cite",description:{kind:"markdown",value:"The cite element represents a reference to a creative work. It must include the title of the work or the name of the author(person, people or organization) or an URL reference, or a reference in abbreviated form as per the conventions used for the addition of citation metadata."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/cite"}]},{name:"q",description:{kind:"markdown",value:"The q element represents some phrasing content quoted from another source."},attributes:[{name:"cite",description:{kind:"markdown",value:"The value of this attribute is a URL that designates a source document or message for the information quoted. This attribute is intended to point to information explaining the context or the reference for the quote."}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/q"}]},{name:"dfn",description:{kind:"markdown",value:"The dfn element represents the defining instance of a term. The paragraph, description list group, or section that is the nearest ancestor of the dfn element must also contain the definition(s) for the term given by the dfn element."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/dfn"}]},{name:"abbr",description:{kind:"markdown",value:"The abbr element represents an abbreviation or acronym, optionally with its expansion. The title attribute may be used to provide an expansion of the abbreviation. The attribute, if specified, must contain an expansion of the abbreviation, and nothing else."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/abbr"}]},{name:"ruby",description:{kind:"markdown",value:"The ruby element allows one or more spans of phrasing content to be marked with ruby annotations. Ruby annotations are short runs of text presented alongside base text, primarily used in East Asian typography as a guide for pronunciation or to include other annotations. In Japanese, this form of typography is also known as furigana. Ruby text can appear on either side, and sometimes both sides, of the base text, and it is possible to control its position using CSS. A more complete introduction to ruby can be found in the Use Cases & Exploratory Approaches for Ruby Markup document as well as in CSS Ruby Module Level 1. [RUBY-UC] [CSSRUBY]"},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/ruby"}]},{name:"rb",description:{kind:"markdown",value:"The rb element marks the base text component of a ruby annotation. When it is the child of a ruby element, it doesn't represent anything itself, but its parent ruby element uses it as part of determining what it represents."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/rb"}]},{name:"rt",description:{kind:"markdown",value:"The rt element marks the ruby text component of a ruby annotation. When it is the child of a ruby element or of an rtc element that is itself the child of a ruby element, it doesn't represent anything itself, but its ancestor ruby element uses it as part of determining what it represents."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/rt"}]},{name:"rp",description:{kind:"markdown",value:"The rp element is used to provide fallback text to be shown by user agents that don't support ruby annotations. One widespread convention is to provide parentheses around the ruby text component of a ruby annotation."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/rp"}]},{name:"time",description:{kind:"markdown",value:"The time element represents its contents, along with a machine-readable form of those contents in the datetime attribute. The kind of content is limited to various kinds of dates, times, time-zone offsets, and durations, as described below."},attributes:[{name:"datetime",description:{kind:"markdown",value:"This attribute indicates the time and/or date of the element and must be in one of the formats described below."}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/time"}]},{name:"code",description:{kind:"markdown",value:"The code element represents a fragment of computer code. This could be an XML element name, a file name, a computer program, or any other string that a computer would recognize."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/code"}]},{name:"var",description:{kind:"markdown",value:"The var element represents a variable. This could be an actual variable in a mathematical expression or programming context, an identifier representing a constant, a symbol identifying a physical quantity, a function parameter, or just be a term used as a placeholder in prose."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/var"}]},{name:"samp",description:{kind:"markdown",value:"The samp element represents sample or quoted output from another program or computing system."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/samp"}]},{name:"kbd",description:{kind:"markdown",value:"The kbd element represents user input (typically keyboard input, although it may also be used to represent other input, such as voice commands)."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/kbd"}]},{name:"sub",description:{kind:"markdown",value:"The sub element represents a subscript."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/sub"}]},{name:"sup",description:{kind:"markdown",value:"The sup element represents a superscript."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/sup"}]},{name:"i",description:{kind:"markdown",value:"The i element represents a span of text in an alternate voice or mood, or otherwise offset from the normal prose in a manner indicating a different quality of text, such as a taxonomic designation, a technical term, an idiomatic phrase from another language, transliteration, a thought, or a ship name in Western texts."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/i"}]},{name:"b",description:{kind:"markdown",value:"The b element represents a span of text to which attention is being drawn for utilitarian purposes without conveying any extra importance and with no implication of an alternate voice or mood, such as key words in a document abstract, product names in a review, actionable words in interactive text-driven software, or an article lede."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/b"}]},{name:"u",description:{kind:"markdown",value:"The u element represents a span of text with an unarticulated, though explicitly rendered, non-textual annotation, such as labeling the text as being a proper name in Chinese text (a Chinese proper name mark), or labeling the text as being misspelt."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/u"}]},{name:"mark",description:{kind:"markdown",value:"The mark element represents a run of text in one document marked or highlighted for reference purposes, due to its relevance in another context. When used in a quotation or other block of text referred to from the prose, it indicates a highlight that was not originally present but which has been added to bring the reader's attention to a part of the text that might not have been considered important by the original author when the block was originally written, but which is now under previously unexpected scrutiny. When used in the main prose of a document, it indicates a part of the document that has been highlighted due to its likely relevance to the user's current activity."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/mark"}]},{name:"bdi",description:{kind:"markdown",value:"The bdi element represents a span of text that is to be isolated from its surroundings for the purposes of bidirectional text formatting. [BIDI]"},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/bdi"}]},{name:"bdo",description:{kind:"markdown",value:"The bdo element represents explicit text directionality formatting control for its children. It allows authors to override the Unicode bidirectional algorithm by explicitly specifying a direction override. [BIDI]"},attributes:[{name:"dir",description:"The direction in which text should be rendered in this element's contents. Possible values are:\n\n*   `ltr`: Indicates that the text should go in a left-to-right direction.\n*   `rtl`: Indicates that the text should go in a right-to-left direction."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/bdo"}]},{name:"span",description:{kind:"markdown",value:"The span element doesn't mean anything on its own, but can be useful when used together with the global attributes, e.g. class, lang, or dir. It represents its children."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/span"}]},{name:"br",description:{kind:"markdown",value:"The br element represents a line break."},attributes:[{name:"clear",description:"Indicates where to begin the next line after the break."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/br"}]},{name:"wbr",description:{kind:"markdown",value:"The wbr element represents a line break opportunity."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/wbr"}]},{name:"ins",description:{kind:"markdown",value:"The ins element represents an addition to the document."},attributes:[{name:"cite",description:"This attribute defines the URI of a resource that explains the change, such as a link to meeting minutes or a ticket in a troubleshooting system."},{name:"datetime",description:'This attribute indicates the time and date of the change and must be a valid date with an optional time string. If the value cannot be parsed as a date with an optional time string, the element does not have an associated time stamp. For the format of the string without a time, see [Format of a valid date string](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#Format_of_a_valid_date_string "Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article.") in [Date and time formats used in HTML](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats "Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article."). The format of the string if it includes both date and time is covered in [Format of a valid local date and time string](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#Format_of_a_valid_local_date_and_time_string "Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article.") in [Date and time formats used in HTML](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats "Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article.").'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/ins"}]},{name:"del",description:{kind:"markdown",value:"The del element represents a removal from the document."},attributes:[{name:"cite",description:{kind:"markdown",value:"A URI for a resource that explains the change (for example, meeting minutes)."}},{name:"datetime",description:{kind:"markdown",value:'This attribute indicates the time and date of the change and must be a valid date string with an optional time. If the value cannot be parsed as a date with an optional time string, the element does not have an associated time stamp. For the format of the string without a time, see [Format of a valid date string](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#Format_of_a_valid_date_string "Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article.") in [Date and time formats used in HTML](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats "Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article."). The format of the string if it includes both date and time is covered in [Format of a valid local date and time string](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#Format_of_a_valid_local_date_and_time_string "Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article.") in [Date and time formats used in HTML](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats "Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article.").'}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/del"}]},{name:"picture",description:{kind:"markdown",value:"The picture element is a container which provides multiple sources to its contained img element to allow authors to declaratively control or give hints to the user agent about which image resource to use, based on the screen pixel density, viewport size, image format, and other factors. It represents its children."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/picture"}]},{name:"img",description:{kind:"markdown",value:"An img element represents an image."},attributes:[{name:"alt",description:{kind:"markdown",value:'This attribute defines an alternative text description of the image.\n\n**Note:** Browsers do not always display the image referenced by the element. This is the case for non-graphical browsers (including those used by people with visual impairments), if the user chooses not to display images, or if the browser cannot display the image because it is invalid or an [unsupported type](#Supported_image_formats). In these cases, the browser may replace the image with the text defined in this element\'s `alt` attribute. You should, for these reasons and others, provide a useful value for `alt` whenever possible.\n\n**Note:** Omitting this attribute altogether indicates that the image is a key part of the content, and no textual equivalent is available. Setting this attribute to an empty string (`alt=""`) indicates that this image is _not_ a key part of the content (decorative), and that non-visual browsers may omit it from rendering.'}},{name:"src",description:{kind:"markdown",value:"The image URL. This attribute is mandatory for the `<img>` element. On browsers supporting `srcset`, `src` is treated like a candidate image with a pixel density descriptor `1x` unless an image with this pixel density descriptor is already defined in `srcset,` or unless `srcset` contains '`w`' descriptors."}},{name:"srcset",description:{kind:"markdown",value:"A list of one or more strings separated by commas indicating a set of possible image sources for the user agent to use. Each string is composed of:\n\n1.  a URL to an image,\n2.  optionally, whitespace followed by one of:\n    *   A width descriptor, or a positive integer directly followed by '`w`'. The width descriptor is divided by the source size given in the `sizes` attribute to calculate the effective pixel density.\n    *   A pixel density descriptor, which is a positive floating point number directly followed by '`x`'.\n\nIf no descriptor is specified, the source is assigned the default descriptor: `1x`.\n\nIt is incorrect to mix width descriptors and pixel density descriptors in the same `srcset` attribute. Duplicate descriptors (for instance, two sources in the same `srcset` which are both described with '`2x`') are also invalid.\n\nThe user agent selects any one of the available sources at its discretion. This provides them with significant leeway to tailor their selection based on things like user preferences or bandwidth conditions. See our [Responsive images](https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images) tutorial for an example."}},{name:"crossorigin",valueSet:"xo",description:{kind:"markdown",value:'This enumerated attribute indicates if the fetching of the related image must be done using CORS or not. [CORS-enabled images](https://developer.mozilla.org/en-US/docs/CORS_Enabled_Image) can be reused in the [`<canvas>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas "Use the HTML <canvas> element with either the canvas scripting API or the WebGL API to draw graphics and animations.") element without being "[tainted](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image#What_is_a_tainted_canvas)." The allowed values are:'}},{name:"usemap",description:{kind:"markdown",value:'The partial URL (starting with \'#\') of an [image map](https://developer.mozilla.org/en-US/docs/HTML/Element/map) associated with the element.\n\n**Note:** You cannot use this attribute if the `<img>` element is a descendant of an [`<a>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a "The HTML <a> element (or anchor element) creates a hyperlink to other web pages, files, locations within the same page, email addresses, or any other URL.") or [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button "The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.") element.'}},{name:"ismap",valueSet:"v",description:{kind:"markdown",value:'This Boolean attribute indicates that the image is part of a server-side map. If so, the precise coordinates of a click are sent to the server.\n\n**Note:** This attribute is allowed only if the `<img>` element is a descendant of an [`<a>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a "The HTML <a> element (or anchor element) creates a hyperlink to other web pages, files, locations within the same page, email addresses, or any other URL.") element with a valid [`href`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-href) attribute.'}},{name:"width",description:{kind:"markdown",value:"The intrinsic width of the image in pixels."}},{name:"height",description:{kind:"markdown",value:"The intrinsic height of the image in pixels."}},{name:"decoding",description:"Provides an image decoding hint to the browser. The allowed values are:"},{name:"decoding",description:`\`sync\`
+
+Decode the image synchronously for atomic presentation with other content.
+
+\`async\`
+
+Decode the image asynchronously to reduce delay in presenting other content.
+
+\`auto\`
+
+Default mode, which indicates no preference for the decoding mode. The browser decides what is best for the user.`},{name:"importance",description:"Indicates the relative importance of the resource. Priority hints are delegated using the values:"},{name:"importance",description:"`auto`: Indicates\xA0**no\xA0preference**. The browser may use its own heuristics to decide the priority of the image.\n\n`high`: Indicates to the\xA0browser\xA0that the image is of\xA0**high** priority.\n\n`low`:\xA0Indicates to the\xA0browser\xA0that the image is of\xA0**low** priority."},{name:"intrinsicsize",description:"This attribute tells the browser to ignore the actual intrinsic size of the image and pretend it\u2019s the size specified in the attribute. Specifically, the image would raster at these dimensions and `naturalWidth`/`naturalHeight` on images would return the values specified in this attribute. [Explainer](https://github.com/ojanvafai/intrinsicsize-attribute), [examples](https://googlechrome.github.io/samples/intrinsic-size/index.html)"},{name:"referrerpolicy",description:"A string indicating which referrer to use when fetching the resource:\n\n*   `no-referrer:` The [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer \"The Referer request header contains the address of the previous web page from which a link to the currently requested page was followed. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching, for example.\") header will not be sent.\n*   `no-referrer-when-downgrade:` No `Referer` header will be sent when navigating to an origin without TLS (HTTPS). This is a user agent\u2019s default behavior if no policy is otherwise specified.\n*   `origin:` The `Referer` header will include the page of origin's scheme, the host, and the port.\n*   `origin-when-cross-origin:` Navigating to other origins will limit the included referral data to the scheme, the host and the port, while navigating from the same origin will include the referrer's full path.\n*   `unsafe-url:` The `Referer` header will include the origin and the path, but not the fragment, password, or username. This case is unsafe because it can leak origins and paths from TLS-protected resources to insecure origins."},{name:"sizes",description:"A list of one or more strings separated by commas indicating a set of source sizes. Each source size consists of:\n\n1.  a media condition. This must be omitted for the last item.\n2.  a source size value.\n\nSource size values specify the intended display size of the image. User agents use the current source size to select one of the sources supplied by the `srcset` attribute, when those sources are described using width ('`w`') descriptors. The selected source size affects the intrinsic size of the image (the image\u2019s display size if no CSS styling is applied). If the `srcset` attribute is absent, or contains no values with a width (`w`) descriptor, then the `sizes` attribute has no effect."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/img"}]},{name:"iframe",description:{kind:"markdown",value:"The iframe element represents a nested browsing context."},attributes:[{name:"src",description:{kind:"markdown",value:'The URL of the page to embed. Use a value of `about:blank` to embed an empty page that conforms to the [same-origin policy](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy#Inherited_origins). Also note that programatically removing an `<iframe>`\'s src attribute (e.g. via [`Element.removeAttribute()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/removeAttribute "The Element method removeAttribute() removes the attribute with the specified name from the element.")) causes `about:blank` to be loaded in the frame in Firefox (from version 65), Chromium-based browsers, and Safari/iOS.'}},{name:"srcdoc",description:{kind:"markdown",value:"Inline HTML to embed, overriding the `src` attribute. If a browser does not support the `srcdoc` attribute, it will fall back to the URL in the `src` attribute."}},{name:"name",description:{kind:"markdown",value:'A targetable name for the embedded browsing context. This can be used in the `target` attribute of the [`<a>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a "The HTML <a> element (or anchor element) creates a hyperlink to other web pages, files, locations within the same page, email addresses, or any other URL."), [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form "The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server."), or [`<base>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base "The HTML <base> element specifies the base URL to use for all relative URLs contained within a document. There can be only one <base> element in a document.") elements; the `formtarget` attribute of the [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input "The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.") or [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button "The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.") elements; or the `windowName` parameter in the [`window.open()`](https://developer.mozilla.org/en-US/docs/Web/API/Window/open "The\xA0Window interface\'s open() method loads the specified resource into the browsing context (window, <iframe> or tab) with the specified name. If the name doesn\'t exist, then a new window is opened and the specified resource is loaded into its browsing context.") method.'}},{name:"sandbox",valueSet:"sb",description:{kind:"markdown",value:'Applies extra restrictions to the content in the frame. The value of the attribute can either be empty to apply all restrictions, or space-separated tokens to lift particular restrictions:\n\n*   `allow-forms`: Allows the resource to submit forms. If this keyword is not used, form submission is blocked.\n*   `allow-modals`: Lets the resource [open modal windows](https://html.spec.whatwg.org/multipage/origin.html#sandboxed-modals-flag).\n*   `allow-orientation-lock`: Lets the resource [lock the screen orientation](https://developer.mozilla.org/en-US/docs/Web/API/Screen/lockOrientation).\n*   `allow-pointer-lock`: Lets the resource use the [Pointer Lock API](https://developer.mozilla.org/en-US/docs/WebAPI/Pointer_Lock).\n*   `allow-popups`: Allows popups (such as `window.open()`, `target="_blank"`, or `showModalDialog()`). If this keyword is not used, the popup will silently fail to open.\n*   `allow-popups-to-escape-sandbox`: Lets the sandboxed document open new windows without those windows inheriting the sandboxing. For example, this can safely sandbox an advertisement without forcing the same restrictions upon the page the ad links to.\n*   `allow-presentation`: Lets the resource start a [presentation session](https://developer.mozilla.org/en-US/docs/Web/API/PresentationRequest).\n*   `allow-same-origin`: If this token is not used, the resource is treated as being from a special origin that always fails the [same-origin policy](https://developer.mozilla.org/en-US/docs/Glossary/same-origin_policy "same-origin policy: The same-origin policy is a critical security mechanism that restricts how a document or script loaded from one origin can interact with a resource from another origin.").\n*   `allow-scripts`: Lets the resource run scripts (but not create popup windows).\n*   `allow-storage-access-by-user-activation` : Lets the resource request access to the parent\'s storage capabilities with the [Storage Access API](https://developer.mozilla.org/en-US/docs/Web/API/Storage_Access_API).\n*   `allow-top-navigation`: Lets the resource navigate the top-level browsing context (the one named `_top`).\n*   `allow-top-navigation-by-user-activation`: Lets the resource navigate the top-level browsing context, but only if initiated by a user gesture.\n\n**Notes about sandboxing:**\n\n*   When the embedded document has the same origin as the embedding page, it is **strongly discouraged** to use both `allow-scripts` and `allow-same-origin`, as that lets the embedded document remove the `sandbox` attribute \u2014 making it no more secure than not using the `sandbox` attribute at all.\n*   Sandboxing is useless if the attacker can display content outside a sandboxed `iframe` \u2014 such as if the viewer opens the frame in a new tab. Such content should be also served from a _separate origin_ to limit potential damage.\n*   The `sandbox` attribute is unsupported in Internet Explorer 9 and earlier.'}},{name:"seamless",valueSet:"v"},{name:"allowfullscreen",valueSet:"v",description:{kind:"markdown",value:'Set to `true` if the `<iframe>` can activate fullscreen mode by calling the [`requestFullscreen()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullscreen "The Element.requestFullscreen() method issues an asynchronous request to make the element be displayed in full-screen mode.") method.'}},{name:"width",description:{kind:"markdown",value:"The width of the frame in CSS pixels. Default is `300`."}},{name:"height",description:{kind:"markdown",value:"The height of the frame in CSS pixels. Default is `150`."}},{name:"allow",description:"Specifies a [feature policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Feature_Policy) for the `<iframe>`."},{name:"allowpaymentrequest",description:"Set to `true` if a cross-origin `<iframe>` should be allowed to invoke the [Payment Request API](https://developer.mozilla.org/en-US/docs/Web/API/Payment_Request_API)."},{name:"allowpaymentrequest",description:'This attribute is considered a legacy attribute and redefined as `allow="payment"`.'},{name:"csp",description:'A [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) enforced for the embedded resource. See [`HTMLIFrameElement.csp`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/csp "The csp property of the HTMLIFrameElement interface specifies the Content Security Policy that an embedded document must agree to enforce upon itself.") for details.'},{name:"importance",description:`The download priority of the resource in the \`<iframe>\`'s \`src\` attribute. Allowed values:
+
+\`auto\` (default)
+
+No preference. The browser uses its own heuristics to decide the priority of the resource.
+
+\`high\`
+
+The resource should be downloaded before other lower-priority page resources.
+
+\`low\`
+
+The resource should be downloaded after other higher-priority page resources.`},{name:"referrerpolicy",description:'Indicates which [referrer](https://developer.mozilla.org/en-US/docs/Web/API/Document/referrer) to send when fetching the frame\'s resource:\n\n*   `no-referrer`: The [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer "The Referer request header contains the address of the previous web page from which a link to the currently requested page was followed. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching, for example.") header will not be sent.\n*   `no-referrer-when-downgrade` (default): The [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer "The Referer request header contains the address of the previous web page from which a link to the currently requested page was followed. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching, for example.") header will not be sent to [origin](https://developer.mozilla.org/en-US/docs/Glossary/origin "origin: Web content\'s origin is defined by the scheme (protocol), host (domain), and port of the URL used to access it. Two objects have the same origin only when the scheme, host, and port all match.")s without [TLS](https://developer.mozilla.org/en-US/docs/Glossary/TLS "TLS: Transport Layer Security (TLS), previously known as Secure Sockets Layer (SSL), is a protocol used by applications to communicate securely across a network, preventing tampering with and eavesdropping on email, web browsing, messaging, and other protocols.") ([HTTPS](https://developer.mozilla.org/en-US/docs/Glossary/HTTPS "HTTPS: HTTPS (HTTP Secure) is an encrypted version of the HTTP protocol. It usually uses SSL or TLS to encrypt all communication between a client and a server. This secure connection allows clients to safely exchange sensitive data with a server, for example for banking activities or online shopping.")).\n*   `origin`: The sent referrer will be limited to the origin of the referring page: its [scheme](https://developer.mozilla.org/en-US/docs/Archive/Mozilla/URIScheme), [host](https://developer.mozilla.org/en-US/docs/Glossary/host "host: A host is a device connected to the Internet (or a local network). Some hosts called servers offer additional services like serving webpages or storing files and emails."), and [port](https://developer.mozilla.org/en-US/docs/Glossary/port "port: For a computer connected to a network with an IP address, a port is a communication endpoint. Ports are designated by numbers, and below 1024 each port is associated by default with a specific protocol.").\n*   `origin-when-cross-origin`: The referrer sent to other origins will be limited to the scheme, the host, and the port. Navigations on the same origin will still include the path.\n*   `same-origin`: A referrer will be sent for [same origin](https://developer.mozilla.org/en-US/docs/Glossary/Same-origin_policy "same origin: The same-origin policy is a critical security mechanism that restricts how a document or script loaded from one origin can interact with a resource from another origin."), but cross-origin requests will contain no referrer information.\n*   `strict-origin`: Only send the origin of the document as the referrer when the protocol security level stays the same (HTTPS\u2192HTTPS), but don\'t send it to a less secure destination (HTTPS\u2192HTTP).\n*   `strict-origin-when-cross-origin`: Send a full URL when performing a same-origin request, only send the origin when the protocol security level stays the same (HTTPS\u2192HTTPS), and send no header to a less secure destination (HTTPS\u2192HTTP).\n*   `unsafe-url`: The referrer will include the origin _and_ the path (but not the [fragment](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/hash), [password](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/password), or [username](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/username)). **This value is unsafe**, because it leaks origins and paths from TLS-protected resources to insecure origins.'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/iframe"}]},{name:"embed",description:{kind:"markdown",value:"The embed element provides an integration point for an external (typically non-HTML) application or interactive content."},attributes:[{name:"src",description:{kind:"markdown",value:"The URL\xA0of the resource being embedded."}},{name:"type",description:{kind:"markdown",value:"The MIME\xA0type to use to select the plug-in to instantiate."}},{name:"width",description:{kind:"markdown",value:"The displayed width of the resource, in [CSS pixels](https://drafts.csswg.org/css-values/#px). This must be an absolute value; percentages are _not_ allowed."}},{name:"height",description:{kind:"markdown",value:"The displayed height of the resource, in [CSS pixels](https://drafts.csswg.org/css-values/#px). This must be an absolute value; percentages are _not_ allowed."}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/embed"}]},{name:"object",description:{kind:"markdown",value:"The object element can represent an external resource, which, depending on the type of the resource, will either be treated as an image, as a nested browsing context, or as an external resource to be processed by a plugin."},attributes:[{name:"data",description:{kind:"markdown",value:"The address of the resource as a valid URL. At least one of **data** and **type** must be defined."}},{name:"type",description:{kind:"markdown",value:"The [content type](https://developer.mozilla.org/en-US/docs/Glossary/Content_type) of the resource specified by **data**. At least one of **data** and **type** must be defined."}},{name:"typemustmatch",valueSet:"v",description:{kind:"markdown",value:"This Boolean attribute indicates if the **type** attribute and the actual [content type](https://developer.mozilla.org/en-US/docs/Glossary/Content_type) of the resource must match to be used."}},{name:"name",description:{kind:"markdown",value:"The name of valid browsing context (HTML5), or the name of the control (HTML 4)."}},{name:"usemap",description:{kind:"markdown",value:"A hash-name reference to a [`<map>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/map \"The HTML <map> element is used with <area> elements to define an image map (a clickable link area).\") element; that is a '#' followed by the value of a [`name`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/map#attr-name) of a map element."}},{name:"form",description:{kind:"markdown",value:'The form element, if any, that the object element is associated with (its _form owner_). The value of the attribute must be an ID of a [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form "The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.") element in the same document.'}},{name:"width",description:{kind:"markdown",value:"The width of the display resource, in [CSS pixels](https://drafts.csswg.org/css-values/#px). -- (Absolute values only. [NO percentages](https://html.spec.whatwg.org/multipage/embedded-content.html#dimension-attributes))"}},{name:"height",description:{kind:"markdown",value:"The height of the displayed resource, in [CSS pixels](https://drafts.csswg.org/css-values/#px). -- (Absolute values only. [NO percentages](https://html.spec.whatwg.org/multipage/embedded-content.html#dimension-attributes))"}},{name:"archive",description:"A space-separated list of URIs for archives of resources for the object."},{name:"border",description:"The width of a border around the control, in pixels."},{name:"classid",description:"The URI of the object's implementation. It can be used together with, or in place of, the **data** attribute."},{name:"codebase",description:"The base path used to resolve relative URIs specified by **classid**, **data**, or **archive**. If not specified, the default is the base URI of the current document."},{name:"codetype",description:"The content type of the data specified by **classid**."},{name:"declare",description:"The presence of this Boolean attribute makes this element a declaration only. The object must be instantiated by a subsequent `<object>` element. In HTML5, repeat the <object> element completely each that that the resource is reused."},{name:"standby",description:"A message that the browser can show while loading the object's implementation and data."},{name:"tabindex",description:"The position of the element in the tabbing navigation order for the current document."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/object"}]},{name:"param",description:{kind:"markdown",value:"The param element defines parameters for plugins invoked by object elements. It does not represent anything on its own."},attributes:[{name:"name",description:{kind:"markdown",value:"Name of the parameter."}},{name:"value",description:{kind:"markdown",value:"Specifies the value of the parameter."}},{name:"type",description:'Only used if the `valuetype` is set to "ref". Specifies the MIME type of values found at the URI specified by value.'},{name:"valuetype",description:`Specifies the type of the \`value\` attribute. Possible values are:
+
+*   data: Default value. The value is passed to the object's implementation as a string.
+*   ref: The value is a URI to a resource where run-time values are stored.
+*   object: An ID of another [\`<object>\`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/object "The HTML <object> element represents an external resource, which can be treated as an image, a nested browsing context, or a resource to be handled by a plugin.") in the same document.`}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/param"}]},{name:"video",description:{kind:"markdown",value:"A video element is used for playing videos or movies, and audio files with captions."},attributes:[{name:"src"},{name:"crossorigin",valueSet:"xo"},{name:"poster"},{name:"preload",valueSet:"pl"},{name:"autoplay",valueSet:"v",description:{kind:"markdown",value:"A Boolean attribute; if specified, the video automatically begins to play back as soon as it can do so without stopping to finish loading the data."}},{name:"mediagroup"},{name:"loop",valueSet:"v"},{name:"muted",valueSet:"v"},{name:"controls",valueSet:"v"},{name:"width"},{name:"height"}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/video"}]},{name:"audio",description:{kind:"markdown",value:"An audio element represents a sound or audio stream."},attributes:[{name:"src",description:{kind:"markdown",value:'The URL of the audio to embed. This is subject to [HTTP access controls](https://developer.mozilla.org/en-US/docs/HTTP_access_control). This is optional; you may instead use the [`<source>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source "The HTML <source> element specifies multiple media resources for the <picture>, the <audio> element, or the <video> element.") element within the audio block to specify the audio to embed.'}},{name:"crossorigin",valueSet:"xo",description:{kind:"markdown",value:'This enumerated attribute indicates whether to use CORS to fetch the related image. [CORS-enabled resources](https://developer.mozilla.org/en-US/docs/CORS_Enabled_Image) can be reused in the [`<canvas>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas "Use the HTML <canvas> element with either the canvas scripting API or the WebGL API to draw graphics and animations.") element without being _tainted_. The allowed values are:\n\nanonymous\n\nSends a cross-origin request without a credential. In other words, it sends the `Origin:` HTTP header without a cookie, X.509 certificate, or performing HTTP Basic authentication. If the server does not give credentials to the origin site (by not setting the `Access-Control-Allow-Origin:` HTTP header), the image will be _tainted_, and its usage restricted.\n\nuse-credentials\n\nSends a cross-origin request with a credential. In other words, it sends the `Origin:` HTTP header with a cookie, a certificate, or performing HTTP Basic authentication. If the server does not give credentials to the origin site (through `Access-Control-Allow-Credentials:` HTTP header), the image will be _tainted_ and its usage restricted.\n\nWhen not present, the resource is fetched without a CORS request (i.e. without sending the `Origin:` HTTP header), preventing its non-tainted used in [`<canvas>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas "Use the HTML <canvas> element with either the canvas scripting API or the WebGL API to draw graphics and animations.") elements. If invalid, it is handled as if the enumerated keyword **anonymous** was used. See [CORS settings attributes](https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes) for additional information.'}},{name:"preload",valueSet:"pl",description:{kind:"markdown",value:"This enumerated attribute is intended to provide a hint to the browser about what the author thinks will lead to the best user experience. It may have one of the following values:\n\n*   `none`: Indicates that the audio should not be preloaded.\n*   `metadata`: Indicates that only audio metadata (e.g. length) is fetched.\n*   `auto`: Indicates that the whole audio file can be downloaded, even if the user is not expected to use it.\n*   _empty string_: A synonym of the `auto` value.\n\nIf not set, `preload`'s default value is browser-defined (i.e. each browser may have its own default value). The spec advises it to be set to `metadata`.\n\n**Usage notes:**\n\n*   The `autoplay` attribute has precedence over\xA0`preload`. If `autoplay` is specified, the browser would obviously need to start downloading the audio for playback.\n*   The browser is not forced by the specification to follow the value of this attribute; it is a mere hint."}},{name:"autoplay",valueSet:"v",description:{kind:"markdown",value:`A Boolean attribute:\xA0if specified, the audio will automatically begin playback as soon as it can do so, without waiting for the entire audio file to finish downloading.
+
+**Note**: Sites that automatically play audio (or videos with an audio track) can be an unpleasant experience for users, so should be avoided when possible. If you must offer autoplay functionality, you should make it opt-in (requiring a user to specifically enable it). However, this can be useful when creating media elements whose source will be set at a later time, under user control.`}},{name:"mediagroup"},{name:"loop",valueSet:"v",description:{kind:"markdown",value:"A Boolean attribute:\xA0if specified, the audio player will\xA0automatically seek back to the start\xA0upon reaching the end of the audio."}},{name:"muted",valueSet:"v",description:{kind:"markdown",value:"A Boolean attribute that indicates whether the audio will be initially silenced. Its default value is `false`."}},{name:"controls",valueSet:"v",description:{kind:"markdown",value:"If this attribute is present, the browser will offer controls to allow the user to control audio playback, including volume, seeking, and pause/resume playback."}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/audio"}]},{name:"source",description:{kind:"markdown",value:"The source element allows authors to specify multiple alternative media resources for media elements. It does not represent anything on its own."},attributes:[{name:"src",description:{kind:"markdown",value:'Required for [`<audio>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio "The HTML <audio> element is used to embed sound content in documents. It may contain one or more audio sources, represented using the src attribute or the <source> element:\xA0the browser will choose the most suitable one. It can also be the destination for streamed media, using a MediaStream.") and [`<video>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video "The HTML Video element (<video>) embeds a media player which supports video playback into the document."), address of the media resource. The value of this attribute is ignored when the `<source>` element is placed inside a [`<picture>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture "The HTML <picture> element contains zero or more <source> elements and one <img> element to provide versions of an image for different display/device scenarios.") element.'}},{name:"type",description:{kind:"markdown",value:"The MIME-type of the resource, optionally with a `codecs` parameter. See [RFC 4281](https://tools.ietf.org/html/rfc4281) for information about how to specify codecs."}},{name:"sizes",description:'Is a list of source sizes that describes the final rendered width of the image represented by the source. Each source size consists of a comma-separated list of media condition-length pairs. This information is used by the browser to determine, before laying the page out, which image defined in [`srcset`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source#attr-srcset) to use.  \nThe `sizes` attribute has an effect only when the [`<source>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source "The HTML <source> element specifies multiple media resources for the <picture>, the <audio> element, or the <video> element.") element is the direct child of a [`<picture>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture "The HTML <picture> element contains zero or more <source> elements and one <img> element to provide versions of an image for different display/device scenarios.") element.'},{name:"srcset",description:"A list of one or more strings separated by commas indicating a set of possible images represented by the source for the browser to use. Each string is composed of:\n\n1.  one URL to an image,\n2.  a width descriptor, that is a positive integer directly followed by `'w'`. The default value, if missing, is the infinity.\n3.  a pixel density descriptor, that is a positive floating number directly followed by `'x'`. The default value, if missing, is `1x`.\n\nEach string in the list must have at least a width descriptor or a pixel density descriptor to be valid. Among the list, there must be only one string containing the same tuple of width descriptor and pixel density descriptor.  \nThe browser chooses the most adequate image to display at a given point of time.  \nThe `srcset` attribute has an effect only when the [`<source>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source \"The HTML <source> element specifies multiple media resources for the <picture>, the <audio> element, or the <video> element.\") element is the direct child of a [`<picture>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture \"The HTML <picture> element contains zero or more <source> elements and one <img> element to provide versions of an image for different display/device scenarios.\") element."},{name:"media",description:'[Media query](https://developer.mozilla.org/en-US/docs/CSS/Media_queries) of the resource\'s intended media; this should be used only in a [`<picture>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture "The HTML <picture> element contains zero or more <source> elements and one <img> element to provide versions of an image for different display/device scenarios.") element.'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/source"}]},{name:"track",description:{kind:"markdown",value:"The track element allows authors to specify explicit external timed text tracks for media elements. It does not represent anything on its own."},attributes:[{name:"default",valueSet:"v",description:{kind:"markdown",value:"This attribute indicates that the track should be enabled unless the user's preferences indicate that another track is more appropriate. This may only be used on one `track` element per media element."}},{name:"kind",valueSet:"tk",description:{kind:"markdown",value:"How the text track is meant to be used. If omitted the default kind is `subtitles`. If the attribute is not present, it will use the `subtitles`. If the attribute contains an invalid value, it will use `metadata`. (Versions of Chrome earlier than 52 treated an invalid value as `subtitles`.)\xA0The following keywords are allowed:\n\n*   `subtitles`\n    *   Subtitles provide translation of content that cannot be understood by the viewer. For example dialogue or text that is not English in an English language film.\n    *   Subtitles may contain additional content, usually extra background information. For example the text at the beginning of the Star Wars films, or the date, time, and location of a scene.\n*   `captions`\n    *   Closed captions provide a transcription and possibly a translation of audio.\n    *   It may include important non-verbal information such as music cues or sound effects. It may indicate the cue's source (e.g. music, text, character).\n    *   Suitable for users who are deaf or when the sound is muted.\n*   `descriptions`\n    *   Textual description of the video content.\n    *   Suitable for users who are blind or where the video cannot be seen.\n*   `chapters`\n    *   Chapter titles are intended to be used when the user is navigating the media resource.\n*   `metadata`\n    *   Tracks used by scripts. Not visible to the user."}},{name:"label",description:{kind:"markdown",value:"A user-readable title of the text track which is used by the browser when listing available text tracks."}},{name:"src",description:{kind:"markdown",value:'Address of the track (`.vtt` file). Must be a valid URL. This attribute must be specified and its URL value must have the same origin as the document \u2014 unless the [`<audio>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio "The HTML <audio> element is used to embed sound content in documents. It may contain one or more audio sources, represented using the src attribute or the <source> element:\xA0the browser will choose the most suitable one. It can also be the destination for streamed media, using a MediaStream.") or [`<video>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video "The HTML Video element (<video>) embeds a media player which supports video playback into the document.") parent element of the `track` element has a [`crossorigin`](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) attribute.'}},{name:"srclang",description:{kind:"markdown",value:"Language of the track text data. It must be a valid [BCP 47](https://r12a.github.io/app-subtags/) language tag. If the `kind` attribute is set to\xA0`subtitles,` then `srclang` must be defined."}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/track"}]},{name:"map",description:{kind:"markdown",value:"The map element, in conjunction with an img element and any area element descendants, defines an image map. The element represents its children."},attributes:[{name:"name",description:{kind:"markdown",value:"The name attribute gives the map a name so that it can be referenced. The attribute must be present and must have a non-empty value with no space characters. The value of the name attribute must not be a compatibility-caseless match for the value of the name attribute of another map element in the same document. If the id attribute is also specified, both attributes must have the same value."}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/map"}]},{name:"area",description:{kind:"markdown",value:"The area element represents either a hyperlink with some text and a corresponding area on an image map, or a dead area on an image map."},attributes:[{name:"alt"},{name:"coords"},{name:"shape",valueSet:"sh"},{name:"href"},{name:"target"},{name:"download"},{name:"ping"},{name:"rel"},{name:"hreflang"},{name:"type"},{name:"accesskey",description:"Specifies a keyboard navigation accelerator for the element. Pressing ALT or a similar key in association with the specified character selects the form control correlated with that key sequence. Page designers are forewarned to avoid key sequences already bound to browsers. This attribute is global since HTML5."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/area"}]},{name:"table",description:{kind:"markdown",value:"The table element represents data with more than one dimension, in the form of a table."},attributes:[{name:"border"},{name:"align",description:'This enumerated attribute indicates how the table must be aligned inside the containing document. It may have the following values:\n\n*   left: the table is displayed on the left side of the document;\n*   center: the table is displayed in the center of the document;\n*   right: the table is displayed on the right side of the document.\n\n**Usage Note**\n\n*   **Do not use this attribute**, as it has been deprecated. The [`<table>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table "The HTML <table> element represents tabular data \u2014 that is, information presented in a two-dimensional table comprised of rows and columns of cells containing data.") element should be styled using [CSS](https://developer.mozilla.org/en-US/docs/CSS). Set [`margin-left`](https://developer.mozilla.org/en-US/docs/Web/CSS/margin-left "The margin-left CSS property sets the margin area on the left side of an element. A positive value places it farther from its neighbors, while a negative value places it closer.") and [`margin-right`](https://developer.mozilla.org/en-US/docs/Web/CSS/margin-right "The margin-right CSS property sets the margin area on the right side of an element. A positive value places it farther from its neighbors, while a negative value places it closer.") to `auto` or [`margin`](https://developer.mozilla.org/en-US/docs/Web/CSS/margin "The margin CSS property sets the margin area on all four sides of an element. It is a shorthand for margin-top, margin-right, margin-bottom, and margin-left.") to `0 auto` to achieve an effect that is similar to the align attribute.\n*   Prior to Firefox 4, Firefox also supported the `middle`, `absmiddle`, and `abscenter` values as synonyms of `center`, in quirks mode only.'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/table"}]},{name:"caption",description:{kind:"markdown",value:"The caption element represents the title of the table that is its parent, if it has a parent and that is a table element."},attributes:[{name:"align",description:`This enumerated attribute indicates how the caption must be aligned with respect to the table. It may have one of the following values:
+
+\`left\`
+
+The caption is displayed to the left of the table.
+
+\`top\`
+
+The caption is displayed above the table.
+
+\`right\`
+
+The caption is displayed to the right of the table.
+
+\`bottom\`
+
+The caption is displayed below the table.
+
+**Usage note:** Do not use this attribute, as it has been deprecated. The [\`<caption>\`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/caption "The HTML Table Caption element (<caption>) specifies the caption (or title) of a table, and if used is always the first child of a <table>.") element should be styled using the [CSS](https://developer.mozilla.org/en-US/docs/CSS) properties [\`caption-side\`](https://developer.mozilla.org/en-US/docs/Web/CSS/caption-side "The caption-side CSS property puts the content of a table's <caption> on the specified side. The values are relative to the writing-mode of the table.") and [\`text-align\`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.").`}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/caption"}]},{name:"colgroup",description:{kind:"markdown",value:"The colgroup element represents a group of one or more columns in the table that is its parent, if it has a parent and that is a table element."},attributes:[{name:"span"},{name:"align",description:'This enumerated attribute specifies how horizontal alignment of each column cell content will be handled. Possible values are:\n\n*   `left`, aligning the content to the left of the cell\n*   `center`, centering the content in the cell\n*   `right`, aligning the content to the right of the cell\n*   `justify`, inserting spaces into the textual content so that the content is justified in the cell\n*   `char`, aligning the textual content on a special character with a minimal offset, defined by the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col#attr-charoff) attributes Unimplemented (see [bug\xA02212](https://bugzilla.mozilla.org/show_bug.cgi?id=2212 "character alignment not implemented (align=char, charoff=, text-align:<string>)")).\n\nIf this attribute is not set, the `left` value is assumed. The descendant [`<col>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col "The HTML <col> element defines a column within a table and is used for defining common semantics on all common cells. It is generally found within a <colgroup> element.") elements may override this value using their own [`align`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col#attr-align) attribute.\n\n**Note:** Do not use this attribute as it is obsolete (not supported) in the latest standard.\n\n*   To achieve the same effect as the `left`, `center`, `right` or `justify` values:\n    *   Do not try to set the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property on a selector giving a [`<colgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup "The HTML <colgroup> element defines a group of columns within a table.") element. Because [`<td>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td "The HTML <td> element defines a cell of a table that contains data. It participates in the table model.") elements are not descendant of the [`<colgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup "The HTML <colgroup> element defines a group of columns within a table.") element, they won\'t inherit it.\n    *   If the table doesn\'t use a [`colspan`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-colspan) attribute, use one `td:nth-child(an+b)` CSS selector per column, where a is the total number of the columns in the table and b is the ordinal position of this column in the table. Only after this selector the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property can be used.\n    *   If the table does use a [`colspan`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-colspan) attribute, the effect can be achieved by combining adequate CSS attribute selectors like `[colspan=n]`, though this is not trivial.\n*   To achieve the same effect as the `char` value, in CSS3, you can use the value of the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup#attr-char) as the value of the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property Unimplemented.'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/colgroup"}]},{name:"col",description:{kind:"markdown",value:"If a col element has a parent and that is a colgroup element that itself has a parent that is a table element, then the col element represents one or more columns in the column group represented by that colgroup."},attributes:[{name:"span"},{name:"align",description:'This enumerated attribute specifies how horizontal alignment of each column cell content will be handled. Possible values are:\n\n*   `left`, aligning the content to the left of the cell\n*   `center`, centering the content in the cell\n*   `right`, aligning the content to the right of the cell\n*   `justify`, inserting spaces into the textual content so that the content is justified in the cell\n*   `char`, aligning the textual content on a special character with a minimal offset, defined by the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col#attr-charoff) attributes Unimplemented (see [bug\xA02212](https://bugzilla.mozilla.org/show_bug.cgi?id=2212 "character alignment not implemented (align=char, charoff=, text-align:<string>)")).\n\nIf this attribute is not set, its value is inherited from the [`align`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup#attr-align) of the [`<colgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup "The HTML <colgroup> element defines a group of columns within a table.") element this `<col>` element belongs too. If there are none, the `left` value is assumed.\n\n**Note:** Do not use this attribute as it is obsolete (not supported) in the latest standard.\n\n*   To achieve the same effect as the `left`, `center`, `right` or `justify` values:\n    *   Do not try to set the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property on a selector giving a [`<col>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col "The HTML <col> element defines a column within a table and is used for defining common semantics on all common cells. It is generally found within a <colgroup> element.") element. Because [`<td>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td "The HTML <td> element defines a cell of a table that contains data. It participates in the table model.") elements are not descendant of the [`<col>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col "The HTML <col> element defines a column within a table and is used for defining common semantics on all common cells. It is generally found within a <colgroup> element.") element, they won\'t inherit it.\n    *   If the table doesn\'t use a [`colspan`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-colspan) attribute, use the `td:nth-child(an+b)` CSS selector. Set `a` to zero and `b` to the position of the column in the table, e.g. `td:nth-child(2) { text-align: right; }` to right-align the second column.\n    *   If the table does use a [`colspan`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-colspan) attribute, the effect can be achieved by combining adequate CSS attribute selectors like `[colspan=n]`, though this is not trivial.\n*   To achieve the same effect as the `char` value, in CSS3, you can use the value of the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col#attr-char) as the value of the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property Unimplemented.'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/col"}]},{name:"tbody",description:{kind:"markdown",value:"The tbody element represents a block of rows that consist of a body of data for the parent table element, if the tbody element has a parent and it is a table."},attributes:[{name:"align",description:'This enumerated attribute specifies how horizontal alignment of each cell content will be handled. Possible values are:\n\n*   `left`, aligning the content to the left of the cell\n*   `center`, centering the content in the cell\n*   `right`, aligning the content to the right of the cell\n*   `justify`, inserting spaces into the textual content so that the content is justified in the cell\n*   `char`, aligning the textual content on a special character with a minimal offset, defined by the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody#attr-charoff) attributes.\n\nIf this attribute is not set, the `left` value is assumed.\n\n**Note:** Do not use this attribute as it is obsolete (not supported) in the latest standard.\n\n*   To achieve the same effect as the `left`, `center`, `right` or `justify` values, use the CSS [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property on it.\n*   To achieve the same effect as the `char` value, in CSS3, you can use the value of the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody#attr-char) as the value of the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property Unimplemented.'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/tbody"}]},{name:"thead",description:{kind:"markdown",value:"The thead element represents the block of rows that consist of the column labels (headers) for the parent table element, if the thead element has a parent and it is a table."},attributes:[{name:"align",description:'This enumerated attribute specifies how horizontal alignment of each cell content will be handled. Possible values are:\n\n*   `left`, aligning the content to the left of the cell\n*   `center`, centering the content in the cell\n*   `right`, aligning the content to the right of the cell\n*   `justify`, inserting spaces into the textual content so that the content is justified in the cell\n*   `char`, aligning the textual content on a special character with a minimal offset, defined by the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead#attr-charoff) attributes Unimplemented (see [bug\xA02212](https://bugzilla.mozilla.org/show_bug.cgi?id=2212 "character alignment not implemented (align=char, charoff=, text-align:<string>)")).\n\nIf this attribute is not set, the `left` value is assumed.\n\n**Note:** Do not use this attribute as it is obsolete (not supported) in the latest standard.\n\n*   To achieve the same effect as the `left`, `center`, `right` or `justify` values, use the CSS [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property on it.\n*   To achieve the same effect as the `char` value, in CSS3, you can use the value of the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead#attr-char) as the value of the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property Unimplemented.'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/thead"}]},{name:"tfoot",description:{kind:"markdown",value:"The tfoot element represents the block of rows that consist of the column summaries (footers) for the parent table element, if the tfoot element has a parent and it is a table."},attributes:[{name:"align",description:'This enumerated attribute specifies how horizontal alignment of each cell content will be handled. Possible values are:\n\n*   `left`, aligning the content to the left of the cell\n*   `center`, centering the content in the cell\n*   `right`, aligning the content to the right of the cell\n*   `justify`, inserting spaces into the textual content so that the content is justified in the cell\n*   `char`, aligning the textual content on a special character with a minimal offset, defined by the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody#attr-charoff) attributes Unimplemented (see [bug\xA02212](https://bugzilla.mozilla.org/show_bug.cgi?id=2212 "character alignment not implemented (align=char, charoff=, text-align:<string>)")).\n\nIf this attribute is not set, the `left` value is assumed.\n\n**Note:** Do not use this attribute as it is obsolete (not supported) in the latest standard.\n\n*   To achieve the same effect as the `left`, `center`, `right` or `justify` values, use the CSS [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property on it.\n*   To achieve the same effect as the `char` value, in CSS3, you can use the value of the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tfoot#attr-char) as the value of the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property Unimplemented.'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/tfoot"}]},{name:"tr",description:{kind:"markdown",value:"The tr element represents a row of cells in a table."},attributes:[{name:"align",description:'A [`DOMString`](https://developer.mozilla.org/en-US/docs/Web/API/DOMString "DOMString is a UTF-16 String. As JavaScript already uses such strings, DOMString is mapped directly to a String.") which specifies how the cell\'s context should be aligned horizontally within the cells in the row; this is shorthand for using `align` on every cell in the row individually. Possible values are:\n\n`left`\n\nAlign the content of each cell at its left edge.\n\n`center`\n\nCenter the contents of each cell between their left and right edges.\n\n`right`\n\nAlign the content of each cell at its right edge.\n\n`justify`\n\nWiden whitespaces within the text of each cell so that the text fills the full width of each cell (full justification).\n\n`char`\n\nAlign each cell in the row on a specific character (such that each row in the column that is configured this way will horizontally align its cells on that character). This uses the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tr#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tr#attr-charoff) to establish the alignment character (typically "." or "," when aligning numerical data) and the number of characters that should follow the alignment character. This alignment type was never widely supported.\n\nIf no value is expressly set for `align`, the parent node\'s value is inherited.\n\nInstead of using the obsolete `align` attribute, you should instead use the CSS [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property to establish `left`, `center`, `right`, or `justify` alignment for the row\'s cells. To apply character-based alignment, set the CSS [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property to the alignment character (such as `"."` or `","`).'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/tr"}]},{name:"td",description:{kind:"markdown",value:"The td element represents a data cell in a table."},attributes:[{name:"colspan"},{name:"rowspan"},{name:"headers"},{name:"abbr",description:`This attribute contains a short abbreviated description of the cell's content. Some user-agents, such as speech readers, may present this description before the content itself.
+
+**Note:** Do not use this attribute as it is obsolete in the latest standard. Alternatively, you can put the abbreviated description inside the cell and place the long content in the **title** attribute.`},{name:"align",description:'This enumerated attribute specifies how the cell content\'s horizontal alignment will be handled. Possible values are:\n\n*   `left`: The content is aligned to the left of the cell.\n*   `center`: The content is centered in the cell.\n*   `right`: The content is aligned to the right of the cell.\n*   `justify` (with text only): The content is stretched out inside the cell so that it covers its entire width.\n*   `char` (with text only): The content is aligned to a character inside the `<th>` element with minimal offset. This character is defined by the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-charoff) attributes Unimplemented (see [bug\xA02212](https://bugzilla.mozilla.org/show_bug.cgi?id=2212 "character alignment not implemented (align=char, charoff=, text-align:<string>)")).\n\nThe default value when this attribute is not specified is `left`.\n\n**Note:** Do not use this attribute as it is obsolete in the latest standard.\n\n*   To achieve the same effect as the `left`, `center`, `right` or `justify` values, apply the CSS [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property to the element.\n*   To achieve the same effect as the `char` value, give the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property the same value you would use for the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-char). Unimplemented in CSS3.'},{name:"axis",description:"This attribute contains a list of space-separated strings. Each string is the `id` of a group of cells that this header applies to.\n\n**Note:** Do not use this attribute as it is obsolete in the latest standard."},{name:"bgcolor",description:`This attribute defines the background color of each cell in a column. It consists of a 6-digit hexadecimal code as defined in [sRGB](https://www.w3.org/Graphics/Color/sRGB) and is prefixed by '#'. This attribute may be used with one of sixteen predefined color strings:
+
+\xA0
+
+\`black\` = "#000000"
+
+\xA0
+
+\`green\` = "#008000"
+
+\xA0
+
+\`silver\` = "#C0C0C0"
+
+\xA0
+
+\`lime\` = "#00FF00"
+
+\xA0
+
+\`gray\` = "#808080"
+
+\xA0
+
+\`olive\` = "#808000"
+
+\xA0
+
+\`white\` = "#FFFFFF"
+
+\xA0
+
+\`yellow\` = "#FFFF00"
+
+\xA0
+
+\`maroon\` = "#800000"
+
+\xA0
+
+\`navy\` = "#000080"
+
+\xA0
+
+\`red\` = "#FF0000"
+
+\xA0
+
+\`blue\` = "#0000FF"
+
+\xA0
+
+\`purple\` = "#800080"
+
+\xA0
+
+\`teal\` = "#008080"
+
+\xA0
+
+\`fuchsia\` = "#FF00FF"
+
+\xA0
+
+\`aqua\` = "#00FFFF"
+
+**Note:** Do not use this attribute, as it is non-standard and only implemented in some versions of Microsoft Internet Explorer: The [\`<td>\`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td "The HTML <td> element defines a cell of a table that contains data. It participates in the table model.") element should be styled using [CSS](https://developer.mozilla.org/en-US/docs/CSS). To create a similar effect use the [\`background-color\`](https://developer.mozilla.org/en-US/docs/Web/CSS/background-color "The background-color CSS property sets the background color of an element.") property in [CSS](https://developer.mozilla.org/en-US/docs/CSS) instead.`}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/td"}]},{name:"th",description:{kind:"markdown",value:"The th element represents a header cell in a table."},attributes:[{name:"colspan"},{name:"rowspan"},{name:"headers"},{name:"scope",valueSet:"s"},{name:"sorted"},{name:"abbr",description:{kind:"markdown",value:"This attribute contains a short abbreviated description of the cell's content. Some user-agents, such as speech readers, may present this description before the content itself."}},{name:"align",description:'This enumerated attribute specifies how the cell content\'s horizontal alignment will be handled. Possible values are:\n\n*   `left`: The content is aligned to the left of the cell.\n*   `center`: The content is centered in the cell.\n*   `right`: The content is aligned to the right of the cell.\n*   `justify` (with text only): The content is stretched out inside the cell so that it covers its entire width.\n*   `char` (with text only): The content is aligned to a character inside the `<th>` element with minimal offset. This character is defined by the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th#attr-charoff) attributes.\n\nThe default value when this attribute is not specified is `left`.\n\n**Note:** Do not use this attribute as it is obsolete in the latest standard.\n\n*   To achieve the same effect as the `left`, `center`, `right` or `justify` values, apply the CSS [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property to the element.\n*   To achieve the same effect as the `char` value, give the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align "The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.") property the same value you would use for the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th#attr-char). Unimplemented in CSS3.'},{name:"axis",description:"This attribute contains a list of space-separated strings. Each string is the `id` of a group of cells that this header applies to.\n\n**Note:** Do not use this attribute as it is obsolete in the latest standard: use the [`scope`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th#attr-scope) attribute instead."},{name:"bgcolor",description:`This attribute defines the background color of each cell in a column. It consists of a 6-digit hexadecimal code as defined in [sRGB](https://www.w3.org/Graphics/Color/sRGB) and is prefixed by '#'. This attribute may be used with one of sixteen predefined color strings:
+
+\xA0
+
+\`black\` = "#000000"
+
+\xA0
+
+\`green\` = "#008000"
+
+\xA0
+
+\`silver\` = "#C0C0C0"
+
+\xA0
+
+\`lime\` = "#00FF00"
+
+\xA0
+
+\`gray\` = "#808080"
+
+\xA0
+
+\`olive\` = "#808000"
+
+\xA0
+
+\`white\` = "#FFFFFF"
+
+\xA0
+
+\`yellow\` = "#FFFF00"
+
+\xA0
+
+\`maroon\` = "#800000"
+
+\xA0
+
+\`navy\` = "#000080"
+
+\xA0
+
+\`red\` = "#FF0000"
+
+\xA0
+
+\`blue\` = "#0000FF"
+
+\xA0
+
+\`purple\` = "#800080"
+
+\xA0
+
+\`teal\` = "#008080"
+
+\xA0
+
+\`fuchsia\` = "#FF00FF"
+
+\xA0
+
+\`aqua\` = "#00FFFF"
+
+**Note:** Do not use this attribute, as it is non-standard and only implemented in some versions of Microsoft Internet Explorer: The [\`<th>\`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th "The HTML <th> element defines a cell as header of a group of table cells. The exact nature of this group is defined by the scope and headers attributes.") element should be styled using [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS). To create a similar effect use the [\`background-color\`](https://developer.mozilla.org/en-US/docs/Web/CSS/background-color "The background-color CSS property sets the background color of an element.") property in [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS) instead.`}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/th"}]},{name:"form",description:{kind:"markdown",value:"The form element represents a collection of form-associated elements, some of which can represent editable values that can be submitted to a server for processing."},attributes:[{name:"accept-charset",description:{kind:"markdown",value:'A space- or comma-delimited list of character encodings that the server accepts. The browser uses them in the order in which they are listed. The default value, the reserved string `"UNKNOWN"`, indicates the same encoding as that of the document containing the form element.  \nIn previous versions of HTML, the different character encodings could be delimited by spaces or commas. In HTML5, only spaces are allowed as delimiters.'}},{name:"action",description:{kind:"markdown",value:'The URI of a program that processes the form information. This value can be overridden by a [`formaction`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-formaction) attribute on a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button "The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.") or [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input "The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.") element.'}},{name:"autocomplete",valueSet:"o",description:{kind:"markdown",value:"Indicates whether input elements can by default have their values automatically completed by the browser. This setting can be overridden by an `autocomplete` attribute on an element belonging to the form. Possible values are:\n\n*   `off`: The user must explicitly enter a value into each field for every use, or the document provides its own auto-completion method; the browser does not automatically complete entries.\n*   `on`: The browser can automatically complete values based on values that the user has previously entered in the form.\n\nFor most modern browsers (including Firefox 38+, Google Chrome 34+, IE 11+) setting the autocomplete attribute will not prevent a browser's password manager from asking the user if they want to store login fields (username and password), if the user permits the storage the browser will autofill the login the next time the user visits the page. See [The autocomplete attribute and login fields](https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion#The_autocomplete_attribute_and_login_fields)."}},{name:"enctype",valueSet:"et",description:{kind:"markdown",value:'When the value of the `method` attribute is `post`, enctype is the [MIME type](https://en.wikipedia.org/wiki/Mime_type) of content that is used to submit the form to the server. Possible values are:\n\n*   `application/x-www-form-urlencoded`: The default value if the attribute is not specified.\n*   `multipart/form-data`: The value used for an [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input "The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.") element with the `type` attribute set to "file".\n*   `text/plain`: (HTML5)\n\nThis value can be overridden by a [`formenctype`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-formenctype) attribute on a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button "The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.") or [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input "The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.") element.'}},{name:"method",valueSet:"m",description:{kind:"markdown",value:'The [HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP) method that the browser uses to submit the form. Possible values are:\n\n*   `post`: Corresponds to the HTTP [POST method](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5) ; form data are included in the body of the form and sent to the server.\n*   `get`: Corresponds to the HTTP [GET method](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3); form data are appended to the `action` attribute URI with a \'?\' as separator, and the resulting URI is sent to the server. Use this method when the form has no side-effects and contains only ASCII characters.\n*   `dialog`: Use when the form is inside a\xA0[`<dialog>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog "The HTML <dialog> element represents a dialog box or other interactive component, such as an inspector or window.") element to close the dialog when submitted.\n\nThis value can be overridden by a [`formmethod`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-formmethod) attribute on a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button "The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.") or [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input "The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.") element.'}},{name:"name",description:{kind:"markdown",value:"The name of the form. In HTML 4, its use is deprecated (`id` should be used instead). It must be unique among the forms in a document and not just an empty string in HTML 5."}},{name:"novalidate",valueSet:"v",description:{kind:"markdown",value:'This Boolean attribute indicates that the form is not to be validated when submitted. If this attribute is not specified (and therefore the form is validated), this default setting can be overridden by a [`formnovalidate`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-formnovalidate) attribute on a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button "The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.") or [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input "The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.") element belonging to the form.'}},{name:"target",description:{kind:"markdown",value:'A name or keyword indicating where to display the response that is received after submitting the form. In HTML 4, this is the name/keyword for a frame. In HTML5, it is a name/keyword for a _browsing context_ (for example, tab, window, or inline frame). The following keywords have special meanings:\n\n*   `_self`: Load the response into the same HTML 4 frame (or HTML5 browsing context) as the current one. This value is the default if the attribute is not specified.\n*   `_blank`: Load the response into a new unnamed HTML 4 window or HTML5 browsing context.\n*   `_parent`: Load the response into the HTML 4 frameset parent of the current frame, or HTML5 parent browsing context of the current one. If there is no parent, this option behaves the same way as `_self`.\n*   `_top`: HTML 4: Load the response into the full original window, and cancel all other frames. HTML5: Load the response into the top-level browsing context (i.e., the browsing context that is an ancestor of the current one, and has no parent). If there is no parent, this option behaves the same way as `_self`.\n*   _iframename_: The response is displayed in a named [`<iframe>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe "The HTML Inline Frame element (<iframe>) represents a nested browsing context, embedding another HTML page into the current one.").\n\nHTML5: This value can be overridden by a [`formtarget`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-formtarget) attribute on a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button "The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.") or [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input "The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.") element.'}},{name:"accept",description:'A comma-separated list of content types that the server accepts.\n\n**Usage note:** This attribute has been removed in HTML5 and should no longer be used. Instead, use the [`accept`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-accept) attribute of the specific [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input "The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.") element.'},{name:"autocapitalize",description:"This is a nonstandard attribute used by iOS Safari Mobile which controls whether and how the text value for textual form control descendants should be automatically capitalized as it is entered/edited by the user. If the `autocapitalize` attribute is specified on an individual form control descendant, it trumps the form-wide `autocapitalize` setting. The non-deprecated values are available in iOS 5 and later. The default value is `sentences`. Possible values are:\n\n*   `none`: Completely disables automatic capitalization\n*   `sentences`: Automatically capitalize the first letter of sentences.\n*   `words`: Automatically capitalize the first letter of words.\n*   `characters`: Automatically capitalize all characters.\n*   `on`: Deprecated since iOS 5.\n*   `off`: Deprecated since iOS 5."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/form"}]},{name:"label",description:{kind:"markdown",value:"The label element represents a caption in a user interface. The caption can be associated with a specific form control, known as the label element's labeled control, either using the for attribute, or by putting the form control inside the label element itself."},attributes:[{name:"form",description:{kind:"markdown",value:'The [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form "The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.") element with which the label is associated (its _form owner_). If specified, the value of the attribute is the `id` of a [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form "The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.") element in the same document. This lets you place label elements anywhere within a document, not just as descendants of their form elements.'}},{name:"for",description:{kind:"markdown",value:"The [`id`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes#attr-id) of a [labelable](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Form_labelable) form-related element in the same document as the `<label>` element. The first element in the document with an `id` matching the value of the `for` attribute is the _labeled control_ for this label element, if it is a labelable element. If it is\xA0not labelable then the `for` attribute has no effect. If there are other elements which also match the `id` value, later in the document, they are not considered.\n\n**Note**: A `<label>` element can have both a `for` attribute and a contained control element, as long as the `for` attribute points to the contained control element."}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/label"}]},{name:"input",description:{kind:"markdown",value:"The input element represents a typed data field, usually with a form control to allow the user to edit the data."},attributes:[{name:"accept"},{name:"alt"},{name:"autocomplete",valueSet:"inputautocomplete"},{name:"autofocus",valueSet:"v"},{name:"checked",valueSet:"v"},{name:"dirname"},{name:"disabled",valueSet:"v"},{name:"form"},{name:"formaction"},{name:"formenctype",valueSet:"et"},{name:"formmethod",valueSet:"fm"},{name:"formnovalidate",valueSet:"v"},{name:"formtarget"},{name:"height"},{name:"inputmode",valueSet:"im"},{name:"list"},{name:"max"},{name:"maxlength"},{name:"min"},{name:"minlength"},{name:"multiple",valueSet:"v"},{name:"name"},{name:"pattern"},{name:"placeholder"},{name:"readonly",valueSet:"v"},{name:"required",valueSet:"v"},{name:"size"},{name:"src"},{name:"step"},{name:"type",valueSet:"t"},{name:"value"},{name:"width"}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/input"}]},{name:"button",description:{kind:"markdown",value:"The button element represents a button labeled by its contents."},attributes:[{name:"autofocus",valueSet:"v",description:{kind:"markdown",value:"This Boolean attribute lets you specify that the button should have input focus when the page loads, unless the user overrides it, for example by typing in a different control. Only one form-associated element in a document can have this attribute specified."}},{name:"disabled",valueSet:"v",description:{kind:"markdown",value:'This Boolean attribute indicates that the user cannot interact with the button. If this attribute is not specified, the button inherits its setting from the containing element, for example [`<fieldset>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset "The HTML <fieldset> element is used to group several controls as well as labels (<label>) within a web form."); if there is no containing element with the **disabled** attribute set, then the button is enabled.\n\nFirefox will, unlike other browsers, by default, [persist the dynamic disabled state](https://stackoverflow.com/questions/5985839/bug-with-firefox-disabled-attribute-of-input-not-resetting-when-refreshing) of a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button "The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.") across page loads. Use the [`autocomplete`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-autocomplete) attribute to control this feature.'}},{name:"form",description:{kind:"markdown",value:'The form element that the button is associated with (its _form owner_). The value of the attribute must be the **id** attribute of a [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form "The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.") element in the same document. If this attribute is not specified, the `<button>` element will be associated to an ancestor [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form "The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.") element, if one exists. This attribute enables you to associate `<button>` elements to [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form "The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.") elements anywhere within a document, not just as descendants of [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form "The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.") elements.'}},{name:"formaction",description:{kind:"markdown",value:"The URI of a program that processes the information submitted by the button. If specified, it overrides the [`action`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-action) attribute of the button's form owner."}},{name:"formenctype",valueSet:"et",description:{kind:"markdown",value:'If the button is a submit button, this attribute specifies the type of content that is used to submit the form to the server. Possible values are:\n\n*   `application/x-www-form-urlencoded`: The default value if the attribute is not specified.\n*   `multipart/form-data`: Use this value if you are using an [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input "The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.") element with the [`type`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-type) attribute set to `file`.\n*   `text/plain`\n\nIf this attribute is specified, it overrides the [`enctype`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-enctype) attribute of the button\'s form owner.'}},{name:"formmethod",valueSet:"fm",description:{kind:"markdown",value:"If the button is a submit button, this attribute specifies the HTTP method that the browser uses to submit the form. Possible values are:\n\n*   `post`: The data from the form are included in the body of the form and sent to the server.\n*   `get`: The data from the form are appended to the **form** attribute URI, with a '?' as a separator, and the resulting URI is sent to the server. Use this method when the form has no side-effects and contains only ASCII characters.\n\nIf specified, this attribute overrides the [`method`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-method) attribute of the button's form owner."}},{name:"formnovalidate",valueSet:"v",description:{kind:"markdown",value:"If the button is a submit button, this Boolean attribute specifies that the form is not to be validated when it is submitted. If this attribute is specified, it overrides the [`novalidate`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-novalidate) attribute of the button's form owner."}},{name:"formtarget",description:{kind:"markdown",value:"If the button is a submit button, this attribute is a name or keyword indicating where to display the response that is received after submitting the form. This is a name of, or keyword for, a _browsing context_ (for example, tab, window, or inline frame). If this attribute is specified, it overrides the [`target`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-target) attribute of the button's form owner. The following keywords have special meanings:\n\n*   `_self`: Load the response into the same browsing context as the current one. This value is the default if the attribute is not specified.\n*   `_blank`: Load the response into a new unnamed browsing context.\n*   `_parent`: Load the response into the parent browsing context of the current one. If there is no parent, this option behaves the same way as `_self`.\n*   `_top`: Load the response into the top-level browsing context (that is, the browsing context that is an ancestor of the current one, and has no parent). If there is no parent, this option behaves the same way as `_self`."}},{name:"name",description:{kind:"markdown",value:"The name of the button, which is submitted with the form data."}},{name:"type",valueSet:"bt",description:{kind:"markdown",value:"The type of the button. Possible values are:\n\n*   `submit`: The button submits the form data to the server. This is the default if the attribute is not specified, or if the attribute is dynamically changed to an empty or invalid value.\n*   `reset`: The button resets all the controls to their initial values.\n*   `button`: The button has no default behavior. It can have client-side scripts associated with the element's events, which are triggered when the events occur."}},{name:"value",description:{kind:"markdown",value:"The initial value of the button. It defines the value associated with the button which is submitted with the form data. This value is passed to the server in params when the form is submitted."}},{name:"autocomplete",description:'The use of this attribute on a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button "The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.") is nonstandard and Firefox-specific. By default, unlike other browsers, [Firefox persists the dynamic disabled state](https://stackoverflow.com/questions/5985839/bug-with-firefox-disabled-attribute-of-input-not-resetting-when-refreshing) of a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button "The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.") across page loads. Setting the value of this attribute to `off` (i.e. `autocomplete="off"`) disables this feature. See [bug\xA0654072](https://bugzilla.mozilla.org/show_bug.cgi?id=654072 "if disabled state is changed with javascript, the normal state doesn\'t return after refreshing the page").'}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/button"}]},{name:"select",description:{kind:"markdown",value:"The select element represents a control for selecting amongst a set of options."},attributes:[{name:"autocomplete",valueSet:"inputautocomplete",description:{kind:"markdown",value:'A [`DOMString`](https://developer.mozilla.org/en-US/docs/Web/API/DOMString "DOMString is a UTF-16 String. As JavaScript already uses such strings, DOMString is mapped directly to a String.") providing a hint for a [user agent\'s](https://developer.mozilla.org/en-US/docs/Glossary/user_agent "user agent\'s: A user agent is a computer program representing a person, for example, a browser in a Web context.") autocomplete feature. See [The HTML autocomplete attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete) for a complete list of values and details on how to use autocomplete.'}},{name:"autofocus",valueSet:"v",description:{kind:"markdown",value:"This Boolean attribute lets you specify that a form control should have input focus when the page loads. Only one form element in a document can have the `autofocus` attribute."}},{name:"disabled",valueSet:"v",description:{kind:"markdown",value:"This Boolean attribute indicates that the user cannot interact with the control. If this attribute is not specified, the control inherits its setting from the containing element, for example `fieldset`; if there is no containing element with the `disabled` attribute set, then the control is enabled."}},{name:"form",description:{kind:"markdown",value:'This attribute lets you specify the form element to\xA0which\xA0the select element is associated\xA0(that is, its "form owner"). If this attribute is specified, its value must be the same as the `id` of a form element in the same document. This enables you to place select elements anywhere within a document, not just as descendants of their form elements.'}},{name:"multiple",valueSet:"v",description:{kind:"markdown",value:"This Boolean attribute indicates that multiple options can be selected in the list. If it is not specified, then only one option can be selected at a time. When `multiple` is specified, most browsers will show a scrolling list box instead of a single line dropdown."}},{name:"name",description:{kind:"markdown",value:"This attribute is used to specify the name of the control."}},{name:"required",valueSet:"v",description:{kind:"markdown",value:"A Boolean attribute indicating that an option with a non-empty string value must be selected."}},{name:"size",description:{kind:"markdown",value:"If the control is presented as a scrolling list box (e.g. when `multiple` is specified), this attribute represents the number of rows in the list that should be visible at one time. Browsers are not required to present a select element as a scrolled list box. The default value is 0.\n\n**Note:** According to the HTML5 specification, the default value for size should be 1; however, in practice, this has been found to break some web sites, and no other browser currently does that, so Mozilla has opted to continue to return 0 for the time being with Firefox."}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/select"}]},{name:"datalist",description:{kind:"markdown",value:"The datalist element represents a set of option elements that represent predefined options for other controls. In the rendering, the datalist element represents nothing and it, along with its children, should be hidden."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/datalist"}]},{name:"optgroup",description:{kind:"markdown",value:"The optgroup element represents a group of option elements with a common label."},attributes:[{name:"disabled",valueSet:"v",description:{kind:"markdown",value:"If this Boolean attribute is set, none of the items in this option group is selectable. Often browsers grey out such control and it won't receive any browsing events, like mouse clicks or focus-related ones."}},{name:"label",description:{kind:"markdown",value:"The name of the group of options, which the browser can use when labeling the options in the user interface. This attribute is mandatory if this element is used."}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/optgroup"}]},{name:"option",description:{kind:"markdown",value:"The option element represents an option in a select element or as part of a list of suggestions in a datalist element."},attributes:[{name:"disabled",valueSet:"v",description:{kind:"markdown",value:'If this Boolean attribute is set, this option is not checkable. Often browsers grey out such control and it won\'t receive any browsing event, like mouse clicks or focus-related ones. If this attribute is not set, the element can still be disabled if one of its ancestors is a disabled [`<optgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/optgroup "The HTML <optgroup> element creates a grouping of options within a <select> element.") element.'}},{name:"label",description:{kind:"markdown",value:"This attribute is text for the label indicating the meaning of the option. If the `label` attribute isn't defined, its value is that of the element text content."}},{name:"selected",valueSet:"v",description:{kind:"markdown",value:'If present, this Boolean attribute indicates that the option is initially selected. If the `<option>` element is the descendant of a [`<select>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select "The HTML <select> element represents a control that provides a menu of options") element whose [`multiple`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select#attr-multiple) attribute is not set, only one single `<option>` of this [`<select>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select "The HTML <select> element represents a control that provides a menu of options") element may have the `selected` attribute.'}},{name:"value",description:{kind:"markdown",value:"The content of this attribute represents the value to be submitted with the form, should this option be selected.\xA0If this attribute is omitted, the value is taken from the text content of the option element."}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/option"}]},{name:"textarea",description:{kind:"markdown",value:"The textarea element represents a multiline plain text edit control for the element's raw value. The contents of the control represent the control's default value."},attributes:[{name:"autocomplete",valueSet:"inputautocomplete",description:{kind:"markdown",value:'This attribute indicates whether the value of the control can be automatically completed by the browser. Possible values are:\n\n*   `off`: The user must explicitly enter a value into this field for every use, or the document provides its own auto-completion method; the browser does not automatically complete the entry.\n*   `on`: The browser can automatically complete the value based on values that the user has entered during previous uses.\n\nIf the `autocomplete` attribute is not specified on a `<textarea>` element, then the browser uses the `autocomplete` attribute value of the `<textarea>` element\'s form owner. The form owner is either the [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form "The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.") element that this `<textarea>` element is a descendant of or the form element whose `id` is specified by the `form` attribute of the input element. For more information, see the [`autocomplete`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-autocomplete) attribute in [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form "The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.").'}},{name:"autofocus",valueSet:"v",description:{kind:"markdown",value:"This Boolean attribute lets you specify that a form control should have input focus when the page loads. Only one form-associated element in a document can have this attribute specified."}},{name:"cols",description:{kind:"markdown",value:"The visible width of the text control, in average character widths. If it is specified, it must be a positive integer. If it is not specified, the default value is `20`."}},{name:"dirname"},{name:"disabled",valueSet:"v",description:{kind:"markdown",value:'This Boolean attribute indicates that the user cannot interact with the control. If this attribute is not specified, the control inherits its setting from the containing element, for example [`<fieldset>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset "The HTML <fieldset> element is used to group several controls as well as labels (<label>) within a web form."); if there is no containing element when the `disabled` attribute is set, the control is enabled.'}},{name:"form",description:{kind:"markdown",value:'The form element that the `<textarea>` element is associated with (its "form owner"). The value of the attribute must be the `id` of a form element in the same document. If this attribute is not specified, the `<textarea>` element must be a descendant of a form element. This attribute enables you to place `<textarea>` elements anywhere within a document, not just as descendants of form elements.'}},{name:"inputmode",valueSet:"im"},{name:"maxlength",description:{kind:"markdown",value:"The maximum number of characters (unicode code points) that the user can enter. If this value isn't specified, the user can enter an unlimited number of characters."}},{name:"minlength",description:{kind:"markdown",value:"The minimum number of characters (unicode code points) required that the user should enter."}},{name:"name",description:{kind:"markdown",value:"The name of the control."}},{name:"placeholder",description:{kind:"markdown",value:'A hint to the user of what can be entered in the control. Carriage returns or line-feeds within the placeholder text must be treated as line breaks when rendering the hint.\n\n**Note:** Placeholders should only be used to show an example of the type of data that should be entered into a form; they are _not_ a substitute for a proper [`<label>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label "The HTML <label> element represents a caption for an item in a user interface.") element tied to the input. See [Labels and placeholders](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Labels_and_placeholders "The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.") in [<input>: The Input (Form Input) element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input "The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.") for a full explanation.'}},{name:"readonly",valueSet:"v",description:{kind:"markdown",value:"This Boolean attribute indicates that the user cannot modify the value of the control. Unlike the `disabled` attribute, the `readonly` attribute does not prevent the user from clicking or selecting in the control. The value of a read-only control is still submitted with the form."}},{name:"required",valueSet:"v",description:{kind:"markdown",value:"This attribute specifies that the user must fill in a value before submitting a form."}},{name:"rows",description:{kind:"markdown",value:"The number of visible text lines for the control."}},{name:"wrap",valueSet:"w",description:{kind:"markdown",value:"Indicates how the control wraps text. Possible values are:\n\n*   `hard`: The browser automatically inserts line breaks (CR+LF) so that each line has no more than the width of the control; the `cols` attribute must also be specified for this to take effect.\n*   `soft`: The browser ensures that all line breaks in the value consist of a CR+LF pair, but does not insert any additional line breaks.\n*   `off` : Like `soft` but changes appearance to `white-space: pre` so line segments exceeding `cols` are not wrapped and the `<textarea>` becomes horizontally scrollable.\n\nIf this attribute is not specified, `soft` is its default value."}},{name:"autocapitalize",description:"This is a non-standard attribute supported by WebKit on iOS (therefore nearly all browsers running on iOS, including Safari, Firefox, and Chrome), which controls whether and how the text value should be automatically capitalized as it is entered/edited by the user. The non-deprecated values are available in iOS 5 and later. Possible values are:\n\n*   `none`: Completely disables automatic capitalization.\n*   `sentences`: Automatically capitalize the first letter of sentences.\n*   `words`: Automatically capitalize the first letter of words.\n*   `characters`: Automatically capitalize all characters.\n*   `on`: Deprecated since iOS 5.\n*   `off`: Deprecated since iOS 5."},{name:"spellcheck",description:"Specifies whether the `<textarea>` is subject to spell checking by the underlying browser/OS. the value can be:\n\n*   `true`: Indicates that the element needs to have its spelling and grammar checked.\n*   `default` : Indicates that the element is to act according to a default behavior, possibly based on the parent element's own `spellcheck` value.\n*   `false` : Indicates that the element should not be spell checked."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/textarea"}]},{name:"output",description:{kind:"markdown",value:"The output element represents the result of a calculation performed by the application, or the result of a user action."},attributes:[{name:"for",description:{kind:"markdown",value:"A space-separated list of other elements\u2019 [`id`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id)s, indicating that those elements contributed input values to (or otherwise affected) the calculation."}},{name:"form",description:{kind:"markdown",value:'The [form element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form) that this element is associated with (its "form owner"). The value of the attribute must be an `id` of a form element in the same document. If this attribute is not specified, the output element must be a descendant of a form element. This attribute enables you to place output elements anywhere within a document, not just as descendants of their form elements.'}},{name:"name",description:{kind:"markdown",value:'The name of the element, exposed in the [`HTMLFormElement`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement "The HTMLFormElement interface represents a <form> element in the DOM; it allows access to and in some cases modification of aspects of the form, as well as access to its component elements.") API.'}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/output"}]},{name:"progress",description:{kind:"markdown",value:"The progress element represents the completion progress of a task. The progress is either indeterminate, indicating that progress is being made but that it is not clear how much more work remains to be done before the task is complete (e.g. because the task is waiting for a remote host to respond), or the progress is a number in the range zero to a maximum, giving the fraction of work that has so far been completed."},attributes:[{name:"value",description:{kind:"markdown",value:"This attribute specifies how much of the task that has been completed. It must be a valid floating point number between 0 and `max`, or between 0 and 1 if `max` is omitted. If there is no `value` attribute, the progress bar is indeterminate; this indicates that an activity is ongoing with no indication of how long it is expected to take."}},{name:"max",description:{kind:"markdown",value:"This attribute describes how much work the task indicated by the `progress` element requires. The `max` attribute, if present, must have a value greater than zero and be a valid floating point number. The default value is 1."}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/progress"}]},{name:"meter",description:{kind:"markdown",value:"The meter element represents a scalar measurement within a known range, or a fractional value; for example disk usage, the relevance of a query result, or the fraction of a voting population to have selected a particular candidate."},attributes:[{name:"value",description:{kind:"markdown",value:"The current numeric value. This must be between the minimum and maximum values (`min` attribute and `max` attribute) if they are specified. If unspecified or malformed, the value is 0. If specified, but not within the range given by the `min` attribute and `max` attribute, the value is equal to the nearest end of the range.\n\n**Usage note:** Unless the `value` attribute is between `0` and `1` (inclusive), the `min` and `max` attributes should define the range so that the `value` attribute's value is within it."}},{name:"min",description:{kind:"markdown",value:"The lower numeric bound of the measured range. This must be less than the maximum value (`max` attribute), if specified. If unspecified, the minimum value is 0."}},{name:"max",description:{kind:"markdown",value:"The upper numeric bound of the measured range. This must be greater than the minimum value (`min` attribute), if specified. If unspecified, the maximum value is 1."}},{name:"low",description:{kind:"markdown",value:"The upper numeric bound of the low end of the measured range. This must be greater than the minimum value (`min` attribute), and it also must be less than the high value and maximum value (`high` attribute and `max` attribute, respectively), if any are specified. If unspecified, or if less than the minimum value, the `low` value is equal to the minimum value."}},{name:"high",description:{kind:"markdown",value:"The lower numeric bound of the high end of the measured range. This must be less than the maximum value (`max` attribute), and it also must be greater than the low value and minimum value (`low` attribute and **min** attribute, respectively), if any are specified. If unspecified, or if greater than the maximum value, the `high` value is equal to the maximum value."}},{name:"optimum",description:{kind:"markdown",value:"This attribute indicates the optimal numeric value. It must be within the range (as defined by the `min` attribute and `max` attribute). When used with the `low` attribute and `high` attribute, it gives an indication where along the range is considered preferable. For example, if it is between the `min` attribute and the `low` attribute, then the lower range is considered preferred."}},{name:"form",description:"This attribute associates the element with a `form` element that has ownership of the `meter` element. For example, a `meter` might be displaying a range corresponding to an `input` element of `type` _number_. This attribute is only used if the `meter` element is being used as a form-associated element; even then, it may be omitted if the element appears as a descendant of a `form` element."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/meter"}]},{name:"fieldset",description:{kind:"markdown",value:"The fieldset element represents a set of form controls optionally grouped under a common name."},attributes:[{name:"disabled",valueSet:"v",description:{kind:"markdown",value:"If this Boolean attribute is set, all form controls that are descendants of the `<fieldset>`, are disabled, meaning they are not editable and won't be submitted along with the `<form>`. They won't receive any browsing events, like mouse clicks or focus-related events. By default browsers display such controls grayed out. Note that form elements inside the [`<legend>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/legend \"The HTML <legend> element represents a caption for the content of its parent <fieldset>.\") element won't be disabled."}},{name:"form",description:{kind:"markdown",value:'This attribute takes the value of the `id` attribute of a [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form "The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.") element you want the `<fieldset>` to be part of, even if it is not inside the form.'}},{name:"name",description:{kind:"markdown",value:'The name associated with the group.\n\n**Note**: The caption for the fieldset is given by the first [`<legend>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/legend "The HTML <legend> element represents a caption for the content of its parent <fieldset>.") element nested inside it.'}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/fieldset"}]},{name:"legend",description:{kind:"markdown",value:"The legend element represents a caption for the rest of the contents of the legend element's parent fieldset element, if any."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/legend"}]},{name:"details",description:{kind:"markdown",value:"The details element represents a disclosure widget from which the user can obtain additional information or controls."},attributes:[{name:"open",valueSet:"v",description:{kind:"markdown",value:"This Boolean attribute indicates whether or not the details \u2014 that is, the contents of the `<details>` element \u2014 are currently visible. The default, `false`, means the details are not visible."}}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/details"}]},{name:"summary",description:{kind:"markdown",value:"The summary element represents a summary, caption, or legend for the rest of the contents of the summary element's parent details element, if any."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/summary"}]},{name:"dialog",description:{kind:"markdown",value:"The dialog element represents a part of an application that a user interacts with to perform a task, for example a dialog box, inspector, or window."},attributes:[{name:"open",description:"Indicates that the dialog is active and available for interaction. When the `open` attribute is not set, the dialog shouldn't be shown to the user."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/dialog"}]},{name:"script",description:{kind:"markdown",value:"The script element allows authors to include dynamic script and data blocks in their documents. The element does not represent content for the user."},attributes:[{name:"src",description:{kind:"markdown",value:"This attribute specifies the URI of an external script; this can be used as an alternative to embedding a script directly within a document.\n\nIf a `script` element has a `src` attribute specified, it should not have a script embedded inside its tags."}},{name:"type",description:{kind:"markdown",value:'This attribute indicates the type of script represented. The value of this attribute will be in one of the following categories:\n\n*   **Omitted or a JavaScript MIME type:** For HTML5-compliant browsers this indicates the script is JavaScript. HTML5 specification urges authors to omit the attribute rather than provide a redundant MIME type. In earlier browsers, this identified the scripting language of the embedded or imported (via the `src` attribute) code. JavaScript MIME types are [listed in the specification](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#JavaScript_types).\n*   **`module`:** For HTML5-compliant browsers the code is treated as a JavaScript module. The processing of the script contents is not affected by the `charset` and `defer` attributes. For information on using `module`, see [ES6 in Depth: Modules](https://hacks.mozilla.org/2015/08/es6-in-depth-modules/). Code may behave differently when the `module` keyword is used.\n*   **Any other value:** The embedded content is treated as a data block which won\'t be processed by the browser. Developers must use a valid MIME type that is not a JavaScript MIME type to denote data blocks. The `src` attribute will be ignored.\n\n**Note:** in Firefox you could specify the version of JavaScript contained in a `<script>` element by including a non-standard `version` parameter inside the `type` attribute \u2014 for example `type="text/javascript;version=1.8"`. This has been removed in Firefox 59 (see [bug\xA01428745](https://bugzilla.mozilla.org/show_bug.cgi?id=1428745 "FIXED: Remove support for version parameter from script loader")).'}},{name:"charset"},{name:"async",valueSet:"v",description:{kind:"markdown",value:`This is a Boolean attribute indicating that the browser should, if possible, load the script asynchronously.
+
+This attribute must not be used if the \`src\` attribute is absent (i.e. for inline scripts). If it is included in this case it will have no effect.
+
+Browsers usually assume the worst case scenario and load scripts synchronously, (i.e. \`async="false"\`) during HTML parsing.
+
+Dynamically inserted scripts (using [\`document.createElement()\`](https://developer.mozilla.org/en-US/docs/Web/API/Document/createElement "In an HTML document, the document.createElement() method creates the HTML element specified by tagName, or an HTMLUnknownElement if tagName isn't recognized.")) load asynchronously by default, so to turn on synchronous loading (i.e. scripts load in the order they were inserted) set \`async="false"\`.
+
+See [Browser compatibility](#Browser_compatibility) for notes on browser support. See also [Async scripts for asm.js](https://developer.mozilla.org/en-US/docs/Games/Techniques/Async_scripts).`}},{name:"defer",valueSet:"v",description:{kind:"markdown",value:'This Boolean attribute is set to indicate to a browser that the script is meant to be executed after the document has been parsed, but before firing [`DOMContentLoaded`](https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded "/en-US/docs/Web/Events/DOMContentLoaded").\n\nScripts with the `defer` attribute will prevent the `DOMContentLoaded` event from firing until the script has loaded and finished evaluating.\n\nThis attribute must not be used if the `src` attribute is absent (i.e. for inline scripts), in this case it would have no effect.\n\nTo achieve a similar effect for dynamically inserted scripts use `async="false"` instead. Scripts with the `defer` attribute will execute in the order in which they appear in the document.'}},{name:"crossorigin",valueSet:"xo",description:{kind:"markdown",value:'Normal `script` elements pass minimal information to the [`window.onerror`](https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror "The onerror property of the GlobalEventHandlers mixin is an EventHandler that processes error events.") for scripts which do not pass the standard [CORS](https://developer.mozilla.org/en-US/docs/Glossary/CORS "CORS: CORS (Cross-Origin Resource Sharing) is a system, consisting of transmitting HTTP headers, that determines whether browsers block frontend JavaScript code from accessing responses for cross-origin requests.") checks. To allow error logging for sites which use a separate domain for static media, use this attribute. See [CORS settings attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for a more descriptive explanation of its valid arguments.'}},{name:"nonce",description:{kind:"markdown",value:"A cryptographic nonce (number used once) to whitelist inline scripts in a [script-src Content-Security-Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src). The server must generate a unique nonce value each time it transmits a policy. It is critical to provide a nonce that cannot be guessed as bypassing a resource's policy is otherwise trivial."}},{name:"integrity",description:"This attribute contains inline metadata that a user agent can use to verify that a fetched resource has been delivered free of unexpected manipulation. See [Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity)."},{name:"nomodule",description:"This Boolean attribute is set to indicate that the script should not be executed in browsers that support [ES2015 modules](https://hacks.mozilla.org/2015/08/es6-in-depth-modules/) \u2014 in effect, this can be used to serve fallback scripts to older browsers that do not support modular JavaScript code."},{name:"referrerpolicy",description:'Indicates which [referrer](https://developer.mozilla.org/en-US/docs/Web/API/Document/referrer) to send when fetching the script, or resources fetched by the script:\n\n*   `no-referrer`: The [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer "The Referer request header contains the address of the previous web page from which a link to the currently requested page was followed. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching, for example.") header will not be sent.\n*   `no-referrer-when-downgrade` (default): The [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer "The Referer request header contains the address of the previous web page from which a link to the currently requested page was followed. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching, for example.") header will not be sent to [origin](https://developer.mozilla.org/en-US/docs/Glossary/origin "origin: Web content\'s origin is defined by the scheme (protocol), host (domain), and port of the URL used to access it. Two objects have the same origin only when the scheme, host, and port all match.")s without [TLS](https://developer.mozilla.org/en-US/docs/Glossary/TLS "TLS: Transport Layer Security (TLS), previously known as Secure Sockets Layer (SSL), is a protocol used by applications to communicate securely across a network, preventing tampering with and eavesdropping on email, web browsing, messaging, and other protocols.") ([HTTPS](https://developer.mozilla.org/en-US/docs/Glossary/HTTPS "HTTPS: HTTPS (HTTP Secure) is an encrypted version of the HTTP protocol. It usually uses SSL or TLS to encrypt all communication between a client and a server. This secure connection allows clients to safely exchange sensitive data with a server, for example for banking activities or online shopping.")).\n*   `origin`: The sent referrer will be limited to the origin of the referring page: its [scheme](https://developer.mozilla.org/en-US/docs/Archive/Mozilla/URIScheme), [host](https://developer.mozilla.org/en-US/docs/Glossary/host "host: A host is a device connected to the Internet (or a local network). Some hosts called servers offer additional services like serving webpages or storing files and emails."), and [port](https://developer.mozilla.org/en-US/docs/Glossary/port "port: For a computer connected to a network with an IP address, a port is a communication endpoint. Ports are designated by numbers, and below 1024 each port is associated by default with a specific protocol.").\n*   `origin-when-cross-origin`: The referrer sent to other origins will be limited to the scheme, the host, and the port. Navigations on the same origin will still include the path.\n*   `same-origin`: A referrer will be sent for [same origin](https://developer.mozilla.org/en-US/docs/Glossary/Same-origin_policy "same origin: The same-origin policy is a critical security mechanism that restricts how a document or script loaded from one origin can interact with a resource from another origin."), but cross-origin requests will contain no referrer information.\n*   `strict-origin`: Only send the origin of the document as the referrer when the protocol security level stays the same (e.g. HTTPS\u2192HTTPS), but don\'t send it to a less secure destination (e.g. HTTPS\u2192HTTP).\n*   `strict-origin-when-cross-origin`: Send a full URL when performing a same-origin request, but only send the origin when the protocol security level stays the same (e.g.HTTPS\u2192HTTPS), and send no header to a less secure destination (e.g. HTTPS\u2192HTTP).\n*   `unsafe-url`: The referrer will include the origin _and_ the path (but not the [fragment](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/hash), [password](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/password), or [username](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/username)). **This value is unsafe**, because it leaks origins and paths from TLS-protected resources to insecure origins.\n\n**Note**: An empty string value (`""`) is both the default value, and a fallback value if `referrerpolicy` is not supported. If `referrerpolicy` is not explicitly specified on the `<script>` element, it will adopt a higher-level referrer policy, i.e. one set on the whole document or domain. If a higher-level policy is not available,\xA0the empty string is treated as being equivalent to `no-referrer-when-downgrade`.'},{name:"text",description:"Like the `textContent` attribute, this attribute sets the text content of the element. Unlike the `textContent` attribute, however, this attribute is evaluated as executable code after the node is inserted into the DOM."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/script"}]},{name:"noscript",description:{kind:"markdown",value:"The noscript element represents nothing if scripting is enabled, and represents its children if scripting is disabled. It is used to present different markup to user agents that support scripting and those that don't support scripting, by affecting how the document is parsed."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/noscript"}]},{name:"template",description:{kind:"markdown",value:"The template element is used to declare fragments of HTML that can be cloned and inserted in the document by script."},attributes:[],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/template"}]},{name:"canvas",description:{kind:"markdown",value:"The canvas element provides scripts with a resolution-dependent bitmap canvas, which can be used for rendering graphs, game graphics, art, or other visual images on the fly."},attributes:[{name:"width",description:{kind:"markdown",value:"The width of the coordinate space in CSS pixels. Defaults to 300."}},{name:"height",description:{kind:"markdown",value:"The height of the coordinate space in CSS pixels. Defaults to 150."}},{name:"moz-opaque",description:"Lets the canvas know whether or not translucency will be a factor. If the canvas knows there's no translucency, painting performance can be optimized. This is only supported by Mozilla-based browsers; use the standardized [`canvas.getContext('2d', { alpha: false })`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext \"The HTMLCanvasElement.getContext() method returns a drawing context on the canvas, or null if the context identifier is not supported.\") instead."}],references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Element/canvas"}]}],globalAttributes:[{name:"accesskey",description:{kind:"markdown",value:"Provides a hint for generating a keyboard shortcut for the current element. This attribute consists of a space-separated list of characters. The browser should use the first one that exists on the computer keyboard layout."},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/accesskey"}]},{name:"autocapitalize",description:{kind:"markdown",value:"Controls whether and how text input is automatically capitalized as it is entered/edited by the user. It can have the following values:\n\n*   `off` or `none`, no autocapitalization is applied (all letters default to lowercase)\n*   `on` or `sentences`, the first letter of each sentence defaults to a capital letter; all other letters default to lowercase\n*   `words`, the first letter of each word defaults to a capital letter; all other letters default to lowercase\n*   `characters`, all letters should default to uppercase"},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/autocapitalize"}]},{name:"class",description:{kind:"markdown",value:'A space-separated list of the classes of the element. Classes allows CSS and JavaScript to select and access specific elements via the [class selectors](/en-US/docs/Web/CSS/Class_selectors) or functions like the method [`Document.getElementsByClassName()`](/en-US/docs/Web/API/Document/getElementsByClassName "returns an array-like object of all child elements which have all of the given class names.").'},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/class"}]},{name:"contenteditable",description:{kind:"markdown",value:"An enumerated attribute indicating if the element should be editable by the user. If so, the browser modifies its widget to allow editing. The attribute must take one of the following values:\n\n*   `true` or the _empty string_, which indicates that the element must be editable;\n*   `false`, which indicates that the element must not be editable."},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/contenteditable"}]},{name:"contextmenu",description:{kind:"markdown",value:'The `[**id**](#attr-id)` of a [`<menu>`](/en-US/docs/Web/HTML/Element/menu "The HTML <menu> element represents a group of commands that a user can perform or activate. This includes both list menus, which might appear across the top of a screen, as well as context menus, such as those that might appear underneath a button after it has been clicked.") to use as the contextual menu for this element.'},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/contextmenu"}]},{name:"dir",description:{kind:"markdown",value:"An enumerated attribute indicating the directionality of the element's text. It can have the following values:\n\n*   `ltr`, which means _left to right_ and is to be used for languages that are written from the left to the right (like English);\n*   `rtl`, which means _right to left_ and is to be used for languages that are written from the right to the left (like Arabic);\n*   `auto`, which lets the user agent decide. It uses a basic algorithm as it parses the characters inside the element until it finds a character with a strong directionality, then it applies that directionality to the whole element."},valueSet:"d",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/dir"}]},{name:"draggable",description:{kind:"markdown",value:"An enumerated attribute indicating whether the element can be dragged, using the [Drag and Drop API](/en-us/docs/DragDrop/Drag_and_Drop). It can have the following values:\n\n*   `true`, which indicates that the element may be dragged\n*   `false`, which indicates that the element may not be dragged."},valueSet:"b",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/draggable"}]},{name:"dropzone",description:{kind:"markdown",value:"An enumerated attribute indicating what types of content can be dropped on an element, using the [Drag and Drop API](/en-US/docs/DragDrop/Drag_and_Drop). It can have the following values:\n\n*   `copy`, which indicates that dropping will create a copy of the element that was dragged\n*   `move`, which indicates that the element that was dragged will be moved to this new location.\n*   `link`, will create a link to the dragged data."}},{name:"exportparts",description:{kind:"markdown",value:"Used to transitively export shadow parts from a nested shadow tree into a containing light tree."},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/exportparts"}]},{name:"hidden",description:{kind:"markdown",value:"A Boolean attribute indicates that the element is not yet, or is no longer, _relevant_. For example, it can be used to hide elements of the page that can't be used until the login process has been completed. The browser won't render such elements. This attribute must not be used to hide content that could legitimately be shown."},valueSet:"v",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/hidden"}]},{name:"id",description:{kind:"markdown",value:"Defines a unique identifier (ID) which must be unique in the whole document. Its purpose is to identify the element when linking (using a fragment identifier), scripting, or styling (with CSS)."},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/id"}]},{name:"inputmode",description:{kind:"markdown",value:'Provides a hint to browsers as to the type of virtual keyboard configuration to use when editing this element or its contents. Used primarily on [`<input>`](/en-US/docs/Web/HTML/Element/input "The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.") elements, but is usable on any element while in `[contenteditable](/en-US/docs/Web/HTML/Global_attributes#attr-contenteditable)` mode.'},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/inputmode"}]},{name:"is",description:{kind:"markdown",value:"Allows you to specify that a standard HTML element should behave like a registered custom built-in element (see [Using custom elements](/en-US/docs/Web/Web_Components/Using_custom_elements) for more details)."},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/is"}]},{name:"itemid",description:{kind:"markdown",value:"The unique, global identifier of an item."},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/itemid"}]},{name:"itemprop",description:{kind:"markdown",value:"Used to add properties to an item. Every HTML element may have an `itemprop` attribute specified, where an `itemprop` consists of a name and value pair."},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/itemprop"}]},{name:"itemref",description:{kind:"markdown",value:"Properties that are not descendants of an element with the `itemscope` attribute can be associated with the item using an `itemref`. It provides a list of element ids (not `itemid`s) with additional properties elsewhere in the document."},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/itemref"}]},{name:"itemscope",description:{kind:"markdown",value:"`itemscope` (usually) works along with `[itemtype](/en-US/docs/Web/HTML/Global_attributes#attr-itemtype)` to specify that the HTML contained in a block is about a particular item. `itemscope` creates the Item and defines the scope of the `itemtype` associated with it. `itemtype` is a valid URL of a vocabulary (such as [schema.org](https://schema.org/)) that describes the item and its properties context."},valueSet:"v",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/itemscope"}]},{name:"itemtype",description:{kind:"markdown",value:"Specifies the URL of the vocabulary that will be used to define `itemprop`s (item properties) in the data structure. `[itemscope](/en-US/docs/Web/HTML/Global_attributes#attr-itemscope)` is used to set the scope of where in the data structure the vocabulary set by `itemtype` will be active."},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/itemtype"}]},{name:"lang",description:{kind:"markdown",value:"Helps define the language of an element: the language that non-editable elements are in, or the language that editable elements should be written in by the user. The attribute contains one \u201Clanguage tag\u201D (made of hyphen-separated \u201Clanguage subtags\u201D) in the format defined in [_Tags for Identifying Languages (BCP47)_](https://www.ietf.org/rfc/bcp/bcp47.txt). [**xml:lang**](#attr-xml:lang) has priority over it."},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/lang"}]},{name:"part",description:{kind:"markdown",value:'A space-separated list of the part names of the element. Part names allows CSS to select and style specific elements in a shadow tree via the [`::part`](/en-US/docs/Web/CSS/::part "The ::part CSS pseudo-element represents any element within a shadow tree that has a matching part attribute.") pseudo-element.'},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/part"}]},{name:"role",valueSet:"roles"},{name:"slot",description:{kind:"markdown",value:"Assigns a slot in a [shadow DOM](/en-US/docs/Web/Web_Components/Shadow_DOM) shadow tree to an element: An element with a `slot` attribute is assigned to the slot created by the [`<slot>`](/en-US/docs/Web/HTML/Element/slot \"The HTML <slot> element\u2014part of the Web Components technology suite\u2014is a placeholder inside a web component that you can fill with your own markup, which lets you create separate DOM trees and present them together.\") element whose `[name](/en-US/docs/Web/HTML/Element/slot#attr-name)` attribute's value matches that `slot` attribute's value."},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/slot"}]},{name:"spellcheck",description:{kind:"markdown",value:"An enumerated attribute defines whether the element may be checked for spelling errors. It may have the following values:\n\n*   `true`, which indicates that the element should be, if possible, checked for spelling errors;\n*   `false`, which indicates that the element should not be checked for spelling errors."},valueSet:"b",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/spellcheck"}]},{name:"style",description:{kind:"markdown",value:'Contains [CSS](/en-US/docs/Web/CSS) styling declarations to be applied to the element. Note that it is recommended for styles to be defined in a separate file or files. This attribute and the [`<style>`](/en-US/docs/Web/HTML/Element/style "The HTML <style> element contains style information for a document, or part of a document.") element have mainly the purpose of allowing for quick styling, for example for testing purposes.'},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/style"}]},{name:"tabindex",description:{kind:"markdown",value:`An integer attribute indicating if the element can take input focus (is _focusable_), if it should participate to sequential keyboard navigation, and if so, at what position. It can take several values:
+
+*   a _negative value_ means that the element should be focusable, but should not be reachable via sequential keyboard navigation;
+*   \`0\` means that the element should be focusable and reachable via sequential keyboard navigation, but its relative order is defined by the platform convention;
+*   a _positive value_ means that the element should be focusable and reachable via sequential keyboard navigation; the order in which the elements are focused is the increasing value of the [**tabindex**](#attr-tabindex). If several elements share the same tabindex, their relative order follows their relative positions in the document.`},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/tabindex"}]},{name:"title",description:{kind:"markdown",value:"Contains a text representing advisory information related to the element it belongs to. Such information can typically, but not necessarily, be presented to the user as a tooltip."},references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/title"}]},{name:"translate",description:{kind:"markdown",value:"An enumerated attribute that is used to specify whether an element's attribute values and the values of its [`Text`](/en-US/docs/Web/API/Text \"The Text interface represents the textual content of Element or Attr. If an element has no markup within its content, it has a single child implementing Text that contains the element's text. However, if the element contains markup, it is parsed into information items and Text nodes that form its children.\") node children are to be translated when the page is localized, or whether to leave them unchanged. It can have the following values:\n\n*   empty string and `yes`, which indicates that the element will be translated.\n*   `no`, which indicates that the element will not be translated."},valueSet:"y",references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/HTML/Global_attributes/translate"}]},{name:"onabort",description:{kind:"markdown",value:"The loading of a resource has been aborted."}},{name:"onblur",description:{kind:"markdown",value:"An element has lost focus (does not bubble)."}},{name:"oncanplay",description:{kind:"markdown",value:"The user agent can play the media, but estimates that not enough data has been loaded to play the media up to its end without having to stop for further buffering of content."}},{name:"oncanplaythrough",description:{kind:"markdown",value:"The user agent can play the media up to its end without having to stop for further buffering of content."}},{name:"onchange",description:{kind:"markdown",value:"The change event is fired for <input>, <select>, and <textarea> elements when a change to the element's value is committed by the user."}},{name:"onclick",description:{kind:"markdown",value:"A pointing device button has been pressed and released on an element."}},{name:"oncontextmenu",description:{kind:"markdown",value:"The right button of the mouse is clicked (before the context menu is displayed)."}},{name:"ondblclick",description:{kind:"markdown",value:"A pointing device button is clicked twice on an element."}},{name:"ondrag",description:{kind:"markdown",value:"An element or text selection is being dragged (every 350ms)."}},{name:"ondragend",description:{kind:"markdown",value:"A drag operation is being ended (by releasing a mouse button or hitting the escape key)."}},{name:"ondragenter",description:{kind:"markdown",value:"A dragged element or text selection enters a valid drop target."}},{name:"ondragleave",description:{kind:"markdown",value:"A dragged element or text selection leaves a valid drop target."}},{name:"ondragover",description:{kind:"markdown",value:"An element or text selection is being dragged over a valid drop target (every 350ms)."}},{name:"ondragstart",description:{kind:"markdown",value:"The user starts dragging an element or text selection."}},{name:"ondrop",description:{kind:"markdown",value:"An element is dropped on a valid drop target."}},{name:"ondurationchange",description:{kind:"markdown",value:"The duration attribute has been updated."}},{name:"onemptied",description:{kind:"markdown",value:"The media has become empty; for example, this event is sent if the media has already been loaded (or partially loaded), and the load() method is called to reload it."}},{name:"onended",description:{kind:"markdown",value:"Playback has stopped because the end of the media was reached."}},{name:"onerror",description:{kind:"markdown",value:"A resource failed to load."}},{name:"onfocus",description:{kind:"markdown",value:"An element has received focus (does not bubble)."}},{name:"onformchange"},{name:"onforminput"},{name:"oninput",description:{kind:"markdown",value:"The value of an element changes or the content of an element with the attribute contenteditable is modified."}},{name:"oninvalid",description:{kind:"markdown",value:"A submittable element has been checked and doesn't satisfy its constraints."}},{name:"onkeydown",description:{kind:"markdown",value:"A key is pressed down."}},{name:"onkeypress",description:{kind:"markdown",value:"A key is pressed down and that key normally produces a character value (use input instead)."}},{name:"onkeyup",description:{kind:"markdown",value:"A key is released."}},{name:"onload",description:{kind:"markdown",value:"A resource and its dependent resources have finished loading."}},{name:"onloadeddata",description:{kind:"markdown",value:"The first frame of the media has finished loading."}},{name:"onloadedmetadata",description:{kind:"markdown",value:"The metadata has been loaded."}},{name:"onloadstart",description:{kind:"markdown",value:"Progress has begun."}},{name:"onmousedown",description:{kind:"markdown",value:"A pointing device button (usually a mouse) is pressed on an element."}},{name:"onmousemove",description:{kind:"markdown",value:"A pointing device is moved over an element."}},{name:"onmouseout",description:{kind:"markdown",value:"A pointing device is moved off the element that has the listener attached or off one of its children."}},{name:"onmouseover",description:{kind:"markdown",value:"A pointing device is moved onto the element that has the listener attached or onto one of its children."}},{name:"onmouseup",description:{kind:"markdown",value:"A pointing device button is released over an element."}},{name:"onmousewheel"},{name:"onmouseenter",description:{kind:"markdown",value:"A pointing device is moved onto the element that has the listener attached."}},{name:"onmouseleave",description:{kind:"markdown",value:"A pointing device is moved off the element that has the listener attached."}},{name:"onpause",description:{kind:"markdown",value:"Playback has been paused."}},{name:"onplay",description:{kind:"markdown",value:"Playback has begun."}},{name:"onplaying",description:{kind:"markdown",value:"Playback is ready to start after having been paused or delayed due to lack of data."}},{name:"onprogress",description:{kind:"markdown",value:"In progress."}},{name:"onratechange",description:{kind:"markdown",value:"The playback rate has changed."}},{name:"onreset",description:{kind:"markdown",value:"A form is reset."}},{name:"onresize",description:{kind:"markdown",value:"The document view has been resized."}},{name:"onreadystatechange",description:{kind:"markdown",value:"The readyState attribute of a document has changed."}},{name:"onscroll",description:{kind:"markdown",value:"The document view or an element has been scrolled."}},{name:"onseeked",description:{kind:"markdown",value:"A seek operation completed."}},{name:"onseeking",description:{kind:"markdown",value:"A seek operation began."}},{name:"onselect",description:{kind:"markdown",value:"Some text is being selected."}},{name:"onshow",description:{kind:"markdown",value:"A contextmenu event was fired on/bubbled to an element that has a contextmenu attribute"}},{name:"onstalled",description:{kind:"markdown",value:"The user agent is trying to fetch media data, but data is unexpectedly not forthcoming."}},{name:"onsubmit",description:{kind:"markdown",value:"A form is submitted."}},{name:"onsuspend",description:{kind:"markdown",value:"Media data loading has been suspended."}},{name:"ontimeupdate",description:{kind:"markdown",value:"The time indicated by the currentTime attribute has been updated."}},{name:"onvolumechange",description:{kind:"markdown",value:"The volume has changed."}},{name:"onwaiting",description:{kind:"markdown",value:"Playback has stopped because of a temporary lack of data."}},{name:"onpointercancel",description:{kind:"markdown",value:"The pointer is unlikely to produce any more events."}},{name:"onpointerdown",description:{kind:"markdown",value:"The pointer enters the active buttons state."}},{name:"onpointerenter",description:{kind:"markdown",value:"Pointing device is moved inside the hit-testing boundary."}},{name:"onpointerleave",description:{kind:"markdown",value:"Pointing device is moved out of the hit-testing boundary."}},{name:"onpointerlockchange",description:{kind:"markdown",value:"The pointer was locked or released."}},{name:"onpointerlockerror",description:{kind:"markdown",value:"It was impossible to lock the pointer for technical reasons or because the permission was denied."}},{name:"onpointermove",description:{kind:"markdown",value:"The pointer changed coordinates."}},{name:"onpointerout",description:{kind:"markdown",value:"The pointing device moved out of hit-testing boundary or leaves detectable hover range."}},{name:"onpointerover",description:{kind:"markdown",value:"The pointing device is moved into the hit-testing boundary."}},{name:"onpointerup",description:{kind:"markdown",value:"The pointer leaves the active buttons state."}},{name:"aria-activedescendant",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-activedescendant"}],description:{kind:"markdown",value:"Identifies the currently active element when DOM focus is on a [`composite`](https://www.w3.org/TR/wai-aria-1.1/#composite) widget, [`textbox`](https://www.w3.org/TR/wai-aria-1.1/#textbox), [`group`](https://www.w3.org/TR/wai-aria-1.1/#group), or [`application`](https://www.w3.org/TR/wai-aria-1.1/#application)."}},{name:"aria-atomic",valueSet:"b",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-atomic"}],description:{kind:"markdown",value:"Indicates whether [assistive technologies](https://www.w3.org/TR/wai-aria-1.1/#dfn-assistive-technology) will present all, or only parts of, the changed region based on the change notifications defined by the [`aria-relevant`](https://www.w3.org/TR/wai-aria-1.1/#aria-relevant) attribute."}},{name:"aria-autocomplete",valueSet:"autocomplete",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-autocomplete"}],description:{kind:"markdown",value:"Indicates whether inputting text could trigger display of one or more predictions of the user's intended value for an input and specifies how predictions would be presented if they are made."}},{name:"aria-busy",valueSet:"b",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-busy"}],description:{kind:"markdown",value:"Indicates an element is being modified and that assistive technologies _MAY_ want to wait until the modifications are complete before exposing them to the user."}},{name:"aria-checked",valueSet:"tristate",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-checked"}],description:{kind:"markdown",value:'Indicates the current "checked" [state](https://www.w3.org/TR/wai-aria-1.1/#dfn-state) of checkboxes, radio buttons, and other [widgets](https://www.w3.org/TR/wai-aria-1.1/#dfn-widget). See related [`aria-pressed`](https://www.w3.org/TR/wai-aria-1.1/#aria-pressed) and [`aria-selected`](https://www.w3.org/TR/wai-aria-1.1/#aria-selected).'}},{name:"aria-colcount",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-colcount"}],description:{kind:"markdown",value:"Defines the total number of columns in a [`table`](https://www.w3.org/TR/wai-aria-1.1/#table), [`grid`](https://www.w3.org/TR/wai-aria-1.1/#grid), or [`treegrid`](https://www.w3.org/TR/wai-aria-1.1/#treegrid). See related [`aria-colindex`](https://www.w3.org/TR/wai-aria-1.1/#aria-colindex)."}},{name:"aria-colindex",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-colindex"}],description:{kind:"markdown",value:"Defines an [element's](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) column index or position with respect to the total number of columns within a [`table`](https://www.w3.org/TR/wai-aria-1.1/#table), [`grid`](https://www.w3.org/TR/wai-aria-1.1/#grid), or [`treegrid`](https://www.w3.org/TR/wai-aria-1.1/#treegrid). See related [`aria-colcount`](https://www.w3.org/TR/wai-aria-1.1/#aria-colcount) and [`aria-colspan`](https://www.w3.org/TR/wai-aria-1.1/#aria-colspan)."}},{name:"aria-colspan",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-colspan"}],description:{kind:"markdown",value:"Defines the number of columns spanned by a cell or gridcell within a [`table`](https://www.w3.org/TR/wai-aria-1.1/#table), [`grid`](https://www.w3.org/TR/wai-aria-1.1/#grid), or [`treegrid`](https://www.w3.org/TR/wai-aria-1.1/#treegrid). See related [`aria-colindex`](https://www.w3.org/TR/wai-aria-1.1/#aria-colindex) and [`aria-rowspan`](https://www.w3.org/TR/wai-aria-1.1/#aria-rowspan)."}},{name:"aria-controls",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-controls"}],description:{kind:"markdown",value:"Identifies the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) (or elements) whose contents or presence are controlled by the current element. See related [`aria-owns`](https://www.w3.org/TR/wai-aria-1.1/#aria-owns)."}},{name:"aria-current",valueSet:"current",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-current"}],description:{kind:"markdown",value:"Indicates the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) that represents the current item within a container or set of related elements."}},{name:"aria-describedby",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-describedby"}],description:{kind:"markdown",value:"Identifies the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) (or elements) that describes the [object](https://www.w3.org/TR/wai-aria-1.1/#dfn-object). See related [`aria-labelledby`](https://www.w3.org/TR/wai-aria-1.1/#aria-labelledby)."}},{name:"aria-disabled",valueSet:"b",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-disabled"}],description:{kind:"markdown",value:"Indicates that the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) is [perceivable](https://www.w3.org/TR/wai-aria-1.1/#dfn-perceivable) but disabled, so it is not editable or otherwise [operable](https://www.w3.org/TR/wai-aria-1.1/#dfn-operable). See related [`aria-hidden`](https://www.w3.org/TR/wai-aria-1.1/#aria-hidden) and [`aria-readonly`](https://www.w3.org/TR/wai-aria-1.1/#aria-readonly)."}},{name:"aria-dropeffect",valueSet:"dropeffect",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-dropeffect"}],description:{kind:"markdown",value:"\\[Deprecated in ARIA 1.1\\] Indicates what functions can be performed when a dragged object is released on the drop target."}},{name:"aria-errormessage",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-errormessage"}],description:{kind:"markdown",value:"Identifies the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) that provides an error message for the [object](https://www.w3.org/TR/wai-aria-1.1/#dfn-object). See related [`aria-invalid`](https://www.w3.org/TR/wai-aria-1.1/#aria-invalid) and [`aria-describedby`](https://www.w3.org/TR/wai-aria-1.1/#aria-describedby)."}},{name:"aria-expanded",valueSet:"u",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-expanded"}],description:{kind:"markdown",value:"Indicates whether the element, or another grouping element it controls, is currently expanded or collapsed."}},{name:"aria-flowto",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-flowto"}],description:{kind:"markdown",value:"Identifies the next [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) (or elements) in an alternate reading order of content which, at the user's discretion, allows assistive technology to override the general default of reading in document source order."}},{name:"aria-grabbed",valueSet:"u",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-grabbed"}],description:{kind:"markdown",value:`\\[Deprecated in ARIA 1.1\\] Indicates an element's "grabbed" [state](https://www.w3.org/TR/wai-aria-1.1/#dfn-state) in a drag-and-drop operation.`}},{name:"aria-haspopup",valueSet:"haspopup",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-haspopup"}],description:{kind:"markdown",value:"Indicates the availability and type of interactive popup element, such as menu or dialog, that can be triggered by an [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element)."}},{name:"aria-hidden",valueSet:"b",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-hidden"}],description:{kind:"markdown",value:"Indicates whether the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) is exposed to an accessibility API. See related [`aria-disabled`](https://www.w3.org/TR/wai-aria-1.1/#aria-disabled)."}},{name:"aria-invalid",valueSet:"invalid",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-invalid"}],description:{kind:"markdown",value:"Indicates the entered value does not conform to the format expected by the application. See related [`aria-errormessage`](https://www.w3.org/TR/wai-aria-1.1/#aria-errormessage)."}},{name:"aria-label",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-label"}],description:{kind:"markdown",value:"Defines a string value that labels the current element. See related [`aria-labelledby`](https://www.w3.org/TR/wai-aria-1.1/#aria-labelledby)."}},{name:"aria-labelledby",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-labelledby"}],description:{kind:"markdown",value:"Identifies the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) (or elements) that labels the current element. See related [`aria-describedby`](https://www.w3.org/TR/wai-aria-1.1/#aria-describedby)."}},{name:"aria-level",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-level"}],description:{kind:"markdown",value:"Defines the hierarchical level of an [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) within a structure."}},{name:"aria-live",valueSet:"live",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-live"}],description:{kind:"markdown",value:"Indicates that an [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) will be updated, and describes the types of updates the [user agents](https://www.w3.org/TR/wai-aria-1.1/#dfn-user-agent), [assistive technologies](https://www.w3.org/TR/wai-aria-1.1/#dfn-assistive-technology), and user can expect from the [live region](https://www.w3.org/TR/wai-aria-1.1/#dfn-live-region)."}},{name:"aria-modal",valueSet:"b",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-modal"}],description:{kind:"markdown",value:"Indicates whether an [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) is modal when displayed."}},{name:"aria-multiline",valueSet:"b",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-multiline"}],description:{kind:"markdown",value:"Indicates whether a text box accepts multiple lines of input or only a single line."}},{name:"aria-multiselectable",valueSet:"b",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-multiselectable"}],description:{kind:"markdown",value:"Indicates that the user may select more than one item from the current selectable descendants."}},{name:"aria-orientation",valueSet:"orientation",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-orientation"}],description:{kind:"markdown",value:"Indicates whether the element's orientation is horizontal, vertical, or unknown/ambiguous."}},{name:"aria-owns",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-owns"}],description:{kind:"markdown",value:"Identifies an [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) (or elements) in order to define a visual, functional, or contextual parent/child [relationship](https://www.w3.org/TR/wai-aria-1.1/#dfn-relationship) between DOM elements where the DOM hierarchy cannot be used to represent the relationship. See related [`aria-controls`](https://www.w3.org/TR/wai-aria-1.1/#aria-controls)."}},{name:"aria-placeholder",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-placeholder"}],description:{kind:"markdown",value:"Defines a short hint (a word or short phrase) intended to aid the user with data entry when the control has no value. A hint could be a sample value or a brief description of the expected format."}},{name:"aria-posinset",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-posinset"}],description:{kind:"markdown",value:"Defines an [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element)'s number or position in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM. See related [`aria-setsize`](https://www.w3.org/TR/wai-aria-1.1/#aria-setsize)."}},{name:"aria-pressed",valueSet:"tristate",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-pressed"}],description:{kind:"markdown",value:'Indicates the current "pressed" [state](https://www.w3.org/TR/wai-aria-1.1/#dfn-state) of toggle buttons. See related [`aria-checked`](https://www.w3.org/TR/wai-aria-1.1/#aria-checked) and [`aria-selected`](https://www.w3.org/TR/wai-aria-1.1/#aria-selected).'}},{name:"aria-readonly",valueSet:"b",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-readonly"}],description:{kind:"markdown",value:"Indicates that the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) is not editable, but is otherwise [operable](https://www.w3.org/TR/wai-aria-1.1/#dfn-operable). See related [`aria-disabled`](https://www.w3.org/TR/wai-aria-1.1/#aria-disabled)."}},{name:"aria-relevant",valueSet:"relevant",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-relevant"}],description:{kind:"markdown",value:"Indicates what notifications the user agent will trigger when the accessibility tree within a live region is modified. See related [`aria-atomic`](https://www.w3.org/TR/wai-aria-1.1/#aria-atomic)."}},{name:"aria-required",valueSet:"b",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-required"}],description:{kind:"markdown",value:"Indicates that user input is required on the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) before a form may be submitted."}},{name:"aria-roledescription",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-roledescription"}],description:{kind:"markdown",value:"Defines a human-readable, author-localized description for the [role](https://www.w3.org/TR/wai-aria-1.1/#dfn-role) of an [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element)."}},{name:"aria-rowcount",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-rowcount"}],description:{kind:"markdown",value:"Defines the total number of rows in a [`table`](https://www.w3.org/TR/wai-aria-1.1/#table), [`grid`](https://www.w3.org/TR/wai-aria-1.1/#grid), or [`treegrid`](https://www.w3.org/TR/wai-aria-1.1/#treegrid). See related [`aria-rowindex`](https://www.w3.org/TR/wai-aria-1.1/#aria-rowindex)."}},{name:"aria-rowindex",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-rowindex"}],description:{kind:"markdown",value:"Defines an [element's](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) row index or position with respect to the total number of rows within a [`table`](https://www.w3.org/TR/wai-aria-1.1/#table), [`grid`](https://www.w3.org/TR/wai-aria-1.1/#grid), or [`treegrid`](https://www.w3.org/TR/wai-aria-1.1/#treegrid). See related [`aria-rowcount`](https://www.w3.org/TR/wai-aria-1.1/#aria-rowcount) and [`aria-rowspan`](https://www.w3.org/TR/wai-aria-1.1/#aria-rowspan)."}},{name:"aria-rowspan",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-rowspan"}],description:{kind:"markdown",value:"Defines the number of rows spanned by a cell or gridcell within a [`table`](https://www.w3.org/TR/wai-aria-1.1/#table), [`grid`](https://www.w3.org/TR/wai-aria-1.1/#grid), or [`treegrid`](https://www.w3.org/TR/wai-aria-1.1/#treegrid). See related [`aria-rowindex`](https://www.w3.org/TR/wai-aria-1.1/#aria-rowindex) and [`aria-colspan`](https://www.w3.org/TR/wai-aria-1.1/#aria-colspan)."}},{name:"aria-selected",valueSet:"u",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-selected"}],description:{kind:"markdown",value:'Indicates the current "selected" [state](https://www.w3.org/TR/wai-aria-1.1/#dfn-state) of various [widgets](https://www.w3.org/TR/wai-aria-1.1/#dfn-widget). See related [`aria-checked`](https://www.w3.org/TR/wai-aria-1.1/#aria-checked) and [`aria-pressed`](https://www.w3.org/TR/wai-aria-1.1/#aria-pressed).'}},{name:"aria-setsize",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-setsize"}],description:{kind:"markdown",value:"Defines the number of items in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM. See related [`aria-posinset`](https://www.w3.org/TR/wai-aria-1.1/#aria-posinset)."}},{name:"aria-sort",valueSet:"sort",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-sort"}],description:{kind:"markdown",value:"Indicates if items in a table or grid are sorted in ascending or descending order."}},{name:"aria-valuemax",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-valuemax"}],description:{kind:"markdown",value:"Defines the maximum allowed value for a range [widget](https://www.w3.org/TR/wai-aria-1.1/#dfn-widget)."}},{name:"aria-valuemin",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-valuemin"}],description:{kind:"markdown",value:"Defines the minimum allowed value for a range [widget](https://www.w3.org/TR/wai-aria-1.1/#dfn-widget)."}},{name:"aria-valuenow",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-valuenow"}],description:{kind:"markdown",value:"Defines the current value for a range [widget](https://www.w3.org/TR/wai-aria-1.1/#dfn-widget). See related [`aria-valuetext`](https://www.w3.org/TR/wai-aria-1.1/#aria-valuetext)."}},{name:"aria-valuetext",references:[{name:"WAI-ARIA Reference",url:"https://www.w3.org/TR/wai-aria-1.1/#aria-valuetext"}],description:{kind:"markdown",value:"Defines the human readable text alternative of [`aria-valuenow`](https://www.w3.org/TR/wai-aria-1.1/#aria-valuenow) for a range [widget](https://www.w3.org/TR/wai-aria-1.1/#dfn-widget)."}},{name:"aria-details",description:{kind:"markdown",value:"Identifies the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) that provides a detailed, extended description for the [object](https://www.w3.org/TR/wai-aria-1.1/#dfn-object). See related [`aria-describedby`](https://www.w3.org/TR/wai-aria-1.1/#aria-describedby)."}},{name:"aria-keyshortcuts",description:{kind:"markdown",value:"Indicates keyboard shortcuts that an author has implemented to activate or give focus to an element."}}],valueSets:[{name:"b",values:[{name:"true"},{name:"false"}]},{name:"u",values:[{name:"true"},{name:"false"},{name:"undefined"}]},{name:"o",values:[{name:"on"},{name:"off"}]},{name:"y",values:[{name:"yes"},{name:"no"}]},{name:"w",values:[{name:"soft"},{name:"hard"}]},{name:"d",values:[{name:"ltr"},{name:"rtl"},{name:"auto"}]},{name:"m",values:[{name:"get",description:{kind:"markdown",value:"Corresponds to the HTTP [GET method](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3); form data are appended to the `action` attribute URI with a '?' as separator, and the resulting URI is sent to the server. Use this method when the form has no side-effects and contains only ASCII characters."}},{name:"post",description:{kind:"markdown",value:"Corresponds to the HTTP [POST method](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5); form data are included in the body of the form and sent to the server."}},{name:"dialog",description:{kind:"markdown",value:"Use when the form is inside a [`<dialog>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog) element to close the dialog when submitted."}}]},{name:"fm",values:[{name:"get"},{name:"post"}]},{name:"s",values:[{name:"row"},{name:"col"},{name:"rowgroup"},{name:"colgroup"}]},{name:"t",values:[{name:"hidden"},{name:"text"},{name:"search"},{name:"tel"},{name:"url"},{name:"email"},{name:"password"},{name:"datetime"},{name:"date"},{name:"month"},{name:"week"},{name:"time"},{name:"datetime-local"},{name:"number"},{name:"range"},{name:"color"},{name:"checkbox"},{name:"radio"},{name:"file"},{name:"submit"},{name:"image"},{name:"reset"},{name:"button"}]},{name:"im",values:[{name:"verbatim"},{name:"latin"},{name:"latin-name"},{name:"latin-prose"},{name:"full-width-latin"},{name:"kana"},{name:"kana-name"},{name:"katakana"},{name:"numeric"},{name:"tel"},{name:"email"},{name:"url"}]},{name:"bt",values:[{name:"button"},{name:"submit"},{name:"reset"},{name:"menu"}]},{name:"lt",values:[{name:"1"},{name:"a"},{name:"A"},{name:"i"},{name:"I"}]},{name:"mt",values:[{name:"context"},{name:"toolbar"}]},{name:"mit",values:[{name:"command"},{name:"checkbox"},{name:"radio"}]},{name:"et",values:[{name:"application/x-www-form-urlencoded"},{name:"multipart/form-data"},{name:"text/plain"}]},{name:"tk",values:[{name:"subtitles"},{name:"captions"},{name:"descriptions"},{name:"chapters"},{name:"metadata"}]},{name:"pl",values:[{name:"none"},{name:"metadata"},{name:"auto"}]},{name:"sh",values:[{name:"circle"},{name:"default"},{name:"poly"},{name:"rect"}]},{name:"xo",values:[{name:"anonymous"},{name:"use-credentials"}]},{name:"sb",values:[{name:"allow-forms"},{name:"allow-modals"},{name:"allow-pointer-lock"},{name:"allow-popups"},{name:"allow-popups-to-escape-sandbox"},{name:"allow-same-origin"},{name:"allow-scripts"},{name:"allow-top-navigation"}]},{name:"tristate",values:[{name:"true"},{name:"false"},{name:"mixed"},{name:"undefined"}]},{name:"inputautocomplete",values:[{name:"additional-name"},{name:"address-level1"},{name:"address-level2"},{name:"address-level3"},{name:"address-level4"},{name:"address-line1"},{name:"address-line2"},{name:"address-line3"},{name:"bday"},{name:"bday-year"},{name:"bday-day"},{name:"bday-month"},{name:"billing"},{name:"cc-additional-name"},{name:"cc-csc"},{name:"cc-exp"},{name:"cc-exp-month"},{name:"cc-exp-year"},{name:"cc-family-name"},{name:"cc-given-name"},{name:"cc-name"},{name:"cc-number"},{name:"cc-type"},{name:"country"},{name:"country-name"},{name:"current-password"},{name:"email"},{name:"family-name"},{name:"fax"},{name:"given-name"},{name:"home"},{name:"honorific-prefix"},{name:"honorific-suffix"},{name:"impp"},{name:"language"},{name:"mobile"},{name:"name"},{name:"new-password"},{name:"nickname"},{name:"organization"},{name:"organization-title"},{name:"pager"},{name:"photo"},{name:"postal-code"},{name:"sex"},{name:"shipping"},{name:"street-address"},{name:"tel-area-code"},{name:"tel"},{name:"tel-country-code"},{name:"tel-extension"},{name:"tel-local"},{name:"tel-local-prefix"},{name:"tel-local-suffix"},{name:"tel-national"},{name:"transaction-amount"},{name:"transaction-currency"},{name:"url"},{name:"username"},{name:"work"}]},{name:"autocomplete",values:[{name:"inline"},{name:"list"},{name:"both"},{name:"none"}]},{name:"current",values:[{name:"page"},{name:"step"},{name:"location"},{name:"date"},{name:"time"},{name:"true"},{name:"false"}]},{name:"dropeffect",values:[{name:"copy"},{name:"move"},{name:"link"},{name:"execute"},{name:"popup"},{name:"none"}]},{name:"invalid",values:[{name:"grammar"},{name:"false"},{name:"spelling"},{name:"true"}]},{name:"live",values:[{name:"off"},{name:"polite"},{name:"assertive"}]},{name:"orientation",values:[{name:"vertical"},{name:"horizontal"},{name:"undefined"}]},{name:"relevant",values:[{name:"additions"},{name:"removals"},{name:"text"},{name:"all"},{name:"additions text"}]},{name:"sort",values:[{name:"ascending"},{name:"descending"},{name:"none"},{name:"other"}]},{name:"roles",values:[{name:"alert"},{name:"alertdialog"},{name:"button"},{name:"checkbox"},{name:"dialog"},{name:"gridcell"},{name:"link"},{name:"log"},{name:"marquee"},{name:"menuitem"},{name:"menuitemcheckbox"},{name:"menuitemradio"},{name:"option"},{name:"progressbar"},{name:"radio"},{name:"scrollbar"},{name:"searchbox"},{name:"slider"},{name:"spinbutton"},{name:"status"},{name:"switch"},{name:"tab"},{name:"tabpanel"},{name:"textbox"},{name:"timer"},{name:"tooltip"},{name:"treeitem"},{name:"combobox"},{name:"grid"},{name:"listbox"},{name:"menu"},{name:"menubar"},{name:"radiogroup"},{name:"tablist"},{name:"tree"},{name:"treegrid"},{name:"application"},{name:"article"},{name:"cell"},{name:"columnheader"},{name:"definition"},{name:"directory"},{name:"document"},{name:"feed"},{name:"figure"},{name:"group"},{name:"heading"},{name:"img"},{name:"list"},{name:"listitem"},{name:"math"},{name:"none"},{name:"note"},{name:"presentation"},{name:"region"},{name:"row"},{name:"rowgroup"},{name:"rowheader"},{name:"separator"},{name:"table"},{name:"term"},{name:"text"},{name:"toolbar"},{name:"banner"},{name:"complementary"},{name:"contentinfo"},{name:"form"},{name:"main"},{name:"navigation"},{name:"region"},{name:"search"},{name:"doc-abstract"},{name:"doc-acknowledgments"},{name:"doc-afterword"},{name:"doc-appendix"},{name:"doc-backlink"},{name:"doc-biblioentry"},{name:"doc-bibliography"},{name:"doc-biblioref"},{name:"doc-chapter"},{name:"doc-colophon"},{name:"doc-conclusion"},{name:"doc-cover"},{name:"doc-credit"},{name:"doc-credits"},{name:"doc-dedication"},{name:"doc-endnote"},{name:"doc-endnotes"},{name:"doc-epigraph"},{name:"doc-epilogue"},{name:"doc-errata"},{name:"doc-example"},{name:"doc-footnote"},{name:"doc-foreword"},{name:"doc-glossary"},{name:"doc-glossref"},{name:"doc-index"},{name:"doc-introduction"},{name:"doc-noteref"},{name:"doc-notice"},{name:"doc-pagebreak"},{name:"doc-pagelist"},{name:"doc-part"},{name:"doc-preface"},{name:"doc-prologue"},{name:"doc-pullquote"},{name:"doc-qna"},{name:"doc-subtitle"},{name:"doc-tip"},{name:"doc-toc"}]},{name:"metanames",values:[{name:"application-name"},{name:"author"},{name:"description"},{name:"format-detection"},{name:"generator"},{name:"keywords"},{name:"publisher"},{name:"referrer"},{name:"robots"},{name:"theme-color"},{name:"viewport"}]},{name:"haspopup",values:[{name:"false",description:{kind:"markdown",value:"(default) Indicates the element does not have a popup."}},{name:"true",description:{kind:"markdown",value:"Indicates the popup is a menu."}},{name:"menu",description:{kind:"markdown",value:"Indicates the popup is a menu."}},{name:"listbox",description:{kind:"markdown",value:"Indicates the popup is a listbox."}},{name:"tree",description:{kind:"markdown",value:"Indicates the popup is a tree."}},{name:"grid",description:{kind:"markdown",value:"Indicates the popup is a grid."}},{name:"dialog",description:{kind:"markdown",value:"Indicates the popup is a dialog."}}]}]};var Tn=function(){function t(i){this.dataProviders=[],this.setDataProviders(i.useDefaultDataProvider!==!1,i.customDataProviders||[])}return t.prototype.setDataProviders=function(i,o){var n;this.dataProviders=[],i&&this.dataProviders.push(new Ge("html5",bt)),(n=this.dataProviders).push.apply(n,o)},t.prototype.getDataProviders=function(){return this.dataProviders},t}();var Ci={};function kn(t){t===void 0&&(t=Ci);var i=new Tn(t),o=new Zt(t,i),n=new Qt(t,i);return{setDataProviders:i.setDataProviders.bind(i),createScanner:$,parseHTMLDocument:function(e){return je(e.getText())},doComplete:n.doComplete.bind(n),doComplete2:n.doComplete2.bind(n),setCompletionParticipants:n.setCompletionParticipants.bind(n),doHover:o.doHover.bind(o),format:sn,findDocumentHighlights:mn,findDocumentLinks:cn,findDocumentSymbols:fn,getFoldingRanges:wn,getSelectionRanges:yn,doQuoteComplete:n.doQuoteComplete.bind(n),doTagComplete:n.doTagComplete.bind(n),doRename:bn,findMatchingTagPosition:vn,findOnTypeRenameRanges:gt,findLinkedEditingRanges:gt}}function Sn(t,i){return new Ge(t,i)}var Je=class{constructor(i,o){this._ctx=i,this._languageSettings=o.languageSettings,this._languageId=o.languageId;let n=this._languageSettings.data,e=n?.useDefaultDataProvider,a=[];if(n?.dataProviders)for(let c in n.dataProviders)a.push(Sn(c,n.dataProviders[c]));this._languageService=kn({useDefaultDataProvider:e,customDataProviders:a})}async doComplete(i,o){let n=this._getTextDocument(i);if(!n)return null;let e=this._languageService.parseHTMLDocument(n);return Promise.resolve(this._languageService.doComplete(n,o,e,this._languageSettings&&this._languageSettings.suggest))}async format(i,o,n){let e=this._getTextDocument(i);if(!e)return[];let a={...this._languageSettings.format,...n},c=this._languageService.format(e,o,a);return Promise.resolve(c)}async doHover(i,o){let n=this._getTextDocument(i);if(!n)return null;let e=this._languageService.parseHTMLDocument(n),a=this._languageService.doHover(n,o,e);return Promise.resolve(a)}async findDocumentHighlights(i,o){let n=this._getTextDocument(i);if(!n)return[];let e=this._languageService.parseHTMLDocument(n),a=this._languageService.findDocumentHighlights(n,o,e);return Promise.resolve(a)}async findDocumentLinks(i){let o=this._getTextDocument(i);if(!o)return[];let n=this._languageService.findDocumentLinks(o,null);return Promise.resolve(n)}async findDocumentSymbols(i){let o=this._getTextDocument(i);if(!o)return[];let n=this._languageService.parseHTMLDocument(o),e=this._languageService.findDocumentSymbols(o,n);return Promise.resolve(e)}async getFoldingRanges(i,o){let n=this._getTextDocument(i);if(!n)return[];let e=this._languageService.getFoldingRanges(n,o);return Promise.resolve(e)}async getSelectionRanges(i,o){let n=this._getTextDocument(i);if(!n)return[];let e=this._languageService.getSelectionRanges(n,o);return Promise.resolve(e)}async doRename(i,o,n){let e=this._getTextDocument(i);if(!e)return null;let a=this._languageService.parseHTMLDocument(e),c=this._languageService.doRename(e,o,n,a);return Promise.resolve(c)}_getTextDocument(i){let o=this._ctx.getMirrorModels();for(let n of o)if(n.uri.toString()===i)return Me.create(i,this._languageId,n.version,n.getValue());return null}};function Mi(t,i){return new Je(t,i)}return Mn(Ri);})();
+return moduleExports;
+});
diff --git a/public/vs/language/json/jsonMode.js b/public/vs/language/json/jsonMode.js
new file mode 100644
index 0000000..bd19178
--- /dev/null
+++ b/public/vs/language/json/jsonMode.js
@@ -0,0 +1,15 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/language/json/jsonMode", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var wn=Object.create;var ie=Object.defineProperty;var In=Object.getOwnPropertyDescriptor;var xn=Object.getOwnPropertyNames;var En=Object.getPrototypeOf,_n=Object.prototype.hasOwnProperty;var Sn=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,i)=>(typeof require<"u"?require:t)[i]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var Pn=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),An=(e,t)=>{for(var i in t)ie(e,i,{get:t[i],enumerable:!0})},te=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of xn(t))!_n.call(e,n)&&n!==i&&ie(e,n,{get:()=>t[n],enumerable:!(r=In(t,n))||r.enumerable});return e},_e=(e,t,i)=>(te(e,t,"default"),i&&te(i,t,"default")),Se=(e,t,i)=>(i=e!=null?wn(En(e)):{},te(t||!e||!e.__esModule?ie(i,"default",{value:e,enumerable:!0}):i,e)),Ln=e=>te(ie({},"__esModule",{value:!0}),e);var Ae=Pn((vr,Pe)=>{var On=Se(Sn("vs/editor/editor.api"));Pe.exports=On});var hr={};An(hr,{CompletionAdapter:()=>X,DefinitionAdapter:()=>Te,DiagnosticsAdapter:()=>q,DocumentColorAdapter:()=>Z,DocumentFormattingEditProvider:()=>G,DocumentHighlightAdapter:()=>ke,DocumentLinkAdapter:()=>we,DocumentRangeFormattingEditProvider:()=>Q,DocumentSymbolAdapter:()=>$,FoldingRangeAdapter:()=>ee,HoverAdapter:()=>Y,ReferenceAdapter:()=>be,RenameAdapter:()=>Ce,SelectionRangeAdapter:()=>ne,WorkerManager:()=>D,fromPosition:()=>L,fromRange:()=>Ie,getWorker:()=>dr,setupMode:()=>gr,toRange:()=>b,toTextEdit:()=>j});var c={};_e(c,Se(Ae()));var Wn=2*60*1e3,D=class{constructor(t){this._defaults=t,this._worker=null,this._client=null,this._idleCheckInterval=window.setInterval(()=>this._checkIfIdle(),30*1e3),this._lastUsedTime=0,this._configChangeListener=this._defaults.onDidChange(()=>this._stopWorker())}_stopWorker(){this._worker&&(this._worker.dispose(),this._worker=null),this._client=null}dispose(){clearInterval(this._idleCheckInterval),this._configChangeListener.dispose(),this._stopWorker()}_checkIfIdle(){if(!this._worker)return;Date.now()-this._lastUsedTime>Wn&&this._stopWorker()}_getClient(){return this._lastUsedTime=Date.now(),this._client||(this._worker=c.editor.createWebWorker({moduleId:"vs/language/json/jsonWorker",label:this._defaults.languageId,createData:{languageSettings:this._defaults.diagnosticsOptions,languageId:this._defaults.languageId,enableSchemaRequest:this._defaults.diagnosticsOptions.enableSchemaRequest}}),this._client=this._worker.getProxy()),this._client}getLanguageServiceWorker(...t){let i;return this._getClient().then(r=>{i=r}).then(r=>{if(this._worker)return this._worker.withSyncedResources(t)}).then(r=>i)}};var Le;(function(e){e.MIN_VALUE=-2147483648,e.MAX_VALUE=2147483647})(Le||(Le={}));var oe;(function(e){e.MIN_VALUE=0,e.MAX_VALUE=2147483647})(oe||(oe={}));var S;(function(e){function t(r,n){return r===Number.MAX_VALUE&&(r=oe.MAX_VALUE),n===Number.MAX_VALUE&&(n=oe.MAX_VALUE),{line:r,character:n}}e.create=t;function i(r){var n=r;return s.objectLiteral(n)&&s.uinteger(n.line)&&s.uinteger(n.character)}e.is=i})(S||(S={}));var y;(function(e){function t(r,n,a,o){if(s.uinteger(r)&&s.uinteger(n)&&s.uinteger(a)&&s.uinteger(o))return{start:S.create(r,n),end:S.create(a,o)};if(S.is(r)&&S.is(n))return{start:r,end:n};throw new Error("Range#create called with invalid arguments["+r+", "+n+", "+a+", "+o+"]")}e.create=t;function i(r){var n=r;return s.objectLiteral(n)&&S.is(n.start)&&S.is(n.end)}e.is=i})(y||(y={}));var pe;(function(e){function t(r,n){return{uri:r,range:n}}e.create=t;function i(r){var n=r;return s.defined(n)&&y.is(n.range)&&(s.string(n.uri)||s.undefined(n.uri))}e.is=i})(pe||(pe={}));var Oe;(function(e){function t(r,n,a,o){return{targetUri:r,targetRange:n,targetSelectionRange:a,originSelectionRange:o}}e.create=t;function i(r){var n=r;return s.defined(n)&&y.is(n.targetRange)&&s.string(n.targetUri)&&(y.is(n.targetSelectionRange)||s.undefined(n.targetSelectionRange))&&(y.is(n.originSelectionRange)||s.undefined(n.originSelectionRange))}e.is=i})(Oe||(Oe={}));var he;(function(e){function t(r,n,a,o){return{red:r,green:n,blue:a,alpha:o}}e.create=t;function i(r){var n=r;return s.numberRange(n.red,0,1)&&s.numberRange(n.green,0,1)&&s.numberRange(n.blue,0,1)&&s.numberRange(n.alpha,0,1)}e.is=i})(he||(he={}));var We;(function(e){function t(r,n){return{range:r,color:n}}e.create=t;function i(r){var n=r;return y.is(n.range)&&he.is(n.color)}e.is=i})(We||(We={}));var Re;(function(e){function t(r,n,a){return{label:r,textEdit:n,additionalTextEdits:a}}e.create=t;function i(r){var n=r;return s.string(n.label)&&(s.undefined(n.textEdit)||A.is(n))&&(s.undefined(n.additionalTextEdits)||s.typedArray(n.additionalTextEdits,A.is))}e.is=i})(Re||(Re={}));var M;(function(e){e.Comment="comment",e.Imports="imports",e.Region="region"})(M||(M={}));var De;(function(e){function t(r,n,a,o,u){var l={startLine:r,endLine:n};return s.defined(a)&&(l.startCharacter=a),s.defined(o)&&(l.endCharacter=o),s.defined(u)&&(l.kind=u),l}e.create=t;function i(r){var n=r;return s.uinteger(n.startLine)&&s.uinteger(n.startLine)&&(s.undefined(n.startCharacter)||s.uinteger(n.startCharacter))&&(s.undefined(n.endCharacter)||s.uinteger(n.endCharacter))&&(s.undefined(n.kind)||s.string(n.kind))}e.is=i})(De||(De={}));var me;(function(e){function t(r,n){return{location:r,message:n}}e.create=t;function i(r){var n=r;return s.defined(n)&&pe.is(n.location)&&s.string(n.message)}e.is=i})(me||(me={}));var O;(function(e){e.Error=1,e.Warning=2,e.Information=3,e.Hint=4})(O||(O={}));var Ne;(function(e){e.Unnecessary=1,e.Deprecated=2})(Ne||(Ne={}));var Me;(function(e){function t(i){var r=i;return r!=null&&s.string(r.href)}e.is=t})(Me||(Me={}));var se;(function(e){function t(r,n,a,o,u,l){var h={range:r,message:n};return s.defined(a)&&(h.severity=a),s.defined(o)&&(h.code=o),s.defined(u)&&(h.source=u),s.defined(l)&&(h.relatedInformation=l),h}e.create=t;function i(r){var n,a=r;return s.defined(a)&&y.is(a.range)&&s.string(a.message)&&(s.number(a.severity)||s.undefined(a.severity))&&(s.integer(a.code)||s.string(a.code)||s.undefined(a.code))&&(s.undefined(a.codeDescription)||s.string((n=a.codeDescription)===null||n===void 0?void 0:n.href))&&(s.string(a.source)||s.undefined(a.source))&&(s.undefined(a.relatedInformation)||s.typedArray(a.relatedInformation,me.is))}e.is=i})(se||(se={}));var K;(function(e){function t(r,n){for(var a=[],o=2;o<arguments.length;o++)a[o-2]=arguments[o];var u={title:r,command:n};return s.defined(a)&&a.length>0&&(u.arguments=a),u}e.create=t;function i(r){var n=r;return s.defined(n)&&s.string(n.title)&&s.string(n.command)}e.is=i})(K||(K={}));var A;(function(e){function t(a,o){return{range:a,newText:o}}e.replace=t;function i(a,o){return{range:{start:a,end:a},newText:o}}e.insert=i;function r(a){return{range:a,newText:""}}e.del=r;function n(a){var o=a;return s.objectLiteral(o)&&s.string(o.newText)&&y.is(o.range)}e.is=n})(A||(A={}));var N;(function(e){function t(r,n,a){var o={label:r};return n!==void 0&&(o.needsConfirmation=n),a!==void 0&&(o.description=a),o}e.create=t;function i(r){var n=r;return n!==void 0&&s.objectLiteral(n)&&s.string(n.label)&&(s.boolean(n.needsConfirmation)||n.needsConfirmation===void 0)&&(s.string(n.description)||n.description===void 0)}e.is=i})(N||(N={}));var T;(function(e){function t(i){var r=i;return typeof r=="string"}e.is=t})(T||(T={}));var P;(function(e){function t(a,o,u){return{range:a,newText:o,annotationId:u}}e.replace=t;function i(a,o,u){return{range:{start:a,end:a},newText:o,annotationId:u}}e.insert=i;function r(a,o){return{range:a,newText:"",annotationId:o}}e.del=r;function n(a){var o=a;return A.is(o)&&(N.is(o.annotationId)||T.is(o.annotationId))}e.is=n})(P||(P={}));var ue;(function(e){function t(r,n){return{textDocument:r,edits:n}}e.create=t;function i(r){var n=r;return s.defined(n)&&ce.is(n.textDocument)&&Array.isArray(n.edits)}e.is=i})(ue||(ue={}));var H;(function(e){function t(r,n,a){var o={kind:"create",uri:r};return n!==void 0&&(n.overwrite!==void 0||n.ignoreIfExists!==void 0)&&(o.options=n),a!==void 0&&(o.annotationId=a),o}e.create=t;function i(r){var n=r;return n&&n.kind==="create"&&s.string(n.uri)&&(n.options===void 0||(n.options.overwrite===void 0||s.boolean(n.options.overwrite))&&(n.options.ignoreIfExists===void 0||s.boolean(n.options.ignoreIfExists)))&&(n.annotationId===void 0||T.is(n.annotationId))}e.is=i})(H||(H={}));var J;(function(e){function t(r,n,a,o){var u={kind:"rename",oldUri:r,newUri:n};return a!==void 0&&(a.overwrite!==void 0||a.ignoreIfExists!==void 0)&&(u.options=a),o!==void 0&&(u.annotationId=o),u}e.create=t;function i(r){var n=r;return n&&n.kind==="rename"&&s.string(n.oldUri)&&s.string(n.newUri)&&(n.options===void 0||(n.options.overwrite===void 0||s.boolean(n.options.overwrite))&&(n.options.ignoreIfExists===void 0||s.boolean(n.options.ignoreIfExists)))&&(n.annotationId===void 0||T.is(n.annotationId))}e.is=i})(J||(J={}));var B;(function(e){function t(r,n,a){var o={kind:"delete",uri:r};return n!==void 0&&(n.recursive!==void 0||n.ignoreIfNotExists!==void 0)&&(o.options=n),a!==void 0&&(o.annotationId=a),o}e.create=t;function i(r){var n=r;return n&&n.kind==="delete"&&s.string(n.uri)&&(n.options===void 0||(n.options.recursive===void 0||s.boolean(n.options.recursive))&&(n.options.ignoreIfNotExists===void 0||s.boolean(n.options.ignoreIfNotExists)))&&(n.annotationId===void 0||T.is(n.annotationId))}e.is=i})(B||(B={}));var ve;(function(e){function t(i){var r=i;return r&&(r.changes!==void 0||r.documentChanges!==void 0)&&(r.documentChanges===void 0||r.documentChanges.every(function(n){return s.string(n.kind)?H.is(n)||J.is(n)||B.is(n):ue.is(n)}))}e.is=t})(ve||(ve={}));var ae=function(){function e(t,i){this.edits=t,this.changeAnnotations=i}return e.prototype.insert=function(t,i,r){var n,a;if(r===void 0?n=A.insert(t,i):T.is(r)?(a=r,n=P.insert(t,i,r)):(this.assertChangeAnnotations(this.changeAnnotations),a=this.changeAnnotations.manage(r),n=P.insert(t,i,a)),this.edits.push(n),a!==void 0)return a},e.prototype.replace=function(t,i,r){var n,a;if(r===void 0?n=A.replace(t,i):T.is(r)?(a=r,n=P.replace(t,i,r)):(this.assertChangeAnnotations(this.changeAnnotations),a=this.changeAnnotations.manage(r),n=P.replace(t,i,a)),this.edits.push(n),a!==void 0)return a},e.prototype.delete=function(t,i){var r,n;if(i===void 0?r=A.del(t):T.is(i)?(n=i,r=P.del(t,i)):(this.assertChangeAnnotations(this.changeAnnotations),n=this.changeAnnotations.manage(i),r=P.del(t,n)),this.edits.push(r),n!==void 0)return n},e.prototype.add=function(t){this.edits.push(t)},e.prototype.all=function(){return this.edits},e.prototype.clear=function(){this.edits.splice(0,this.edits.length)},e.prototype.assertChangeAnnotations=function(t){if(t===void 0)throw new Error("Text edit change is not configured to manage change annotations.")},e}(),Fe=function(){function e(t){this._annotations=t===void 0?Object.create(null):t,this._counter=0,this._size=0}return e.prototype.all=function(){return this._annotations},Object.defineProperty(e.prototype,"size",{get:function(){return this._size},enumerable:!1,configurable:!0}),e.prototype.manage=function(t,i){var r;if(T.is(t)?r=t:(r=this.nextId(),i=t),this._annotations[r]!==void 0)throw new Error("Id "+r+" is already in use.");if(i===void 0)throw new Error("No annotation provided for id "+r);return this._annotations[r]=i,this._size++,r},e.prototype.nextId=function(){return this._counter++,this._counter.toString()},e}(),wr=function(){function e(t){var i=this;this._textEditChanges=Object.create(null),t!==void 0?(this._workspaceEdit=t,t.documentChanges?(this._changeAnnotations=new Fe(t.changeAnnotations),t.changeAnnotations=this._changeAnnotations.all(),t.documentChanges.forEach(function(r){if(ue.is(r)){var n=new ae(r.edits,i._changeAnnotations);i._textEditChanges[r.textDocument.uri]=n}})):t.changes&&Object.keys(t.changes).forEach(function(r){var n=new ae(t.changes[r]);i._textEditChanges[r]=n})):this._workspaceEdit={}}return Object.defineProperty(e.prototype,"edit",{get:function(){return this.initDocumentChanges(),this._changeAnnotations!==void 0&&(this._changeAnnotations.size===0?this._workspaceEdit.changeAnnotations=void 0:this._workspaceEdit.changeAnnotations=this._changeAnnotations.all()),this._workspaceEdit},enumerable:!1,configurable:!0}),e.prototype.getTextEditChange=function(t){if(ce.is(t)){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var i={uri:t.uri,version:t.version},r=this._textEditChanges[i.uri];if(!r){var n=[],a={textDocument:i,edits:n};this._workspaceEdit.documentChanges.push(a),r=new ae(n,this._changeAnnotations),this._textEditChanges[i.uri]=r}return r}else{if(this.initChanges(),this._workspaceEdit.changes===void 0)throw new Error("Workspace edit is not configured for normal text edit changes.");var r=this._textEditChanges[t];if(!r){var n=[];this._workspaceEdit.changes[t]=n,r=new ae(n),this._textEditChanges[t]=r}return r}},e.prototype.initDocumentChanges=function(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._changeAnnotations=new Fe,this._workspaceEdit.documentChanges=[],this._workspaceEdit.changeAnnotations=this._changeAnnotations.all())},e.prototype.initChanges=function(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._workspaceEdit.changes=Object.create(null))},e.prototype.createFile=function(t,i,r){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var n;N.is(i)||T.is(i)?n=i:r=i;var a,o;if(n===void 0?a=H.create(t,r):(o=T.is(n)?n:this._changeAnnotations.manage(n),a=H.create(t,r,o)),this._workspaceEdit.documentChanges.push(a),o!==void 0)return o},e.prototype.renameFile=function(t,i,r,n){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var a;N.is(r)||T.is(r)?a=r:n=r;var o,u;if(a===void 0?o=J.create(t,i,n):(u=T.is(a)?a:this._changeAnnotations.manage(a),o=J.create(t,i,n,u)),this._workspaceEdit.documentChanges.push(o),u!==void 0)return u},e.prototype.deleteFile=function(t,i,r){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var n;N.is(i)||T.is(i)?n=i:r=i;var a,o;if(n===void 0?a=B.create(t,r):(o=T.is(n)?n:this._changeAnnotations.manage(n),a=B.create(t,r,o)),this._workspaceEdit.documentChanges.push(a),o!==void 0)return o},e}();var je;(function(e){function t(r){return{uri:r}}e.create=t;function i(r){var n=r;return s.defined(n)&&s.string(n.uri)}e.is=i})(je||(je={}));var Ue;(function(e){function t(r,n){return{uri:r,version:n}}e.create=t;function i(r){var n=r;return s.defined(n)&&s.string(n.uri)&&s.integer(n.version)}e.is=i})(Ue||(Ue={}));var ce;(function(e){function t(r,n){return{uri:r,version:n}}e.create=t;function i(r){var n=r;return s.defined(n)&&s.string(n.uri)&&(n.version===null||s.integer(n.version))}e.is=i})(ce||(ce={}));var Ve;(function(e){function t(r,n,a,o){return{uri:r,languageId:n,version:a,text:o}}e.create=t;function i(r){var n=r;return s.defined(n)&&s.string(n.uri)&&s.string(n.languageId)&&s.integer(n.version)&&s.string(n.text)}e.is=i})(Ve||(Ve={}));var z;(function(e){e.PlainText="plaintext",e.Markdown="markdown"})(z||(z={}));(function(e){function t(i){var r=i;return r===e.PlainText||r===e.Markdown}e.is=t})(z||(z={}));var ye;(function(e){function t(i){var r=i;return s.objectLiteral(i)&&z.is(r.kind)&&s.string(r.value)}e.is=t})(ye||(ye={}));var m;(function(e){e.Text=1,e.Method=2,e.Function=3,e.Constructor=4,e.Field=5,e.Variable=6,e.Class=7,e.Interface=8,e.Module=9,e.Property=10,e.Unit=11,e.Value=12,e.Enum=13,e.Keyword=14,e.Snippet=15,e.Color=16,e.File=17,e.Reference=18,e.Folder=19,e.EnumMember=20,e.Constant=21,e.Struct=22,e.Event=23,e.Operator=24,e.TypeParameter=25})(m||(m={}));var le;(function(e){e.PlainText=1,e.Snippet=2})(le||(le={}));var Ke;(function(e){e.Deprecated=1})(Ke||(Ke={}));var He;(function(e){function t(r,n,a){return{newText:r,insert:n,replace:a}}e.create=t;function i(r){var n=r;return n&&s.string(n.newText)&&y.is(n.insert)&&y.is(n.replace)}e.is=i})(He||(He={}));var Je;(function(e){e.asIs=1,e.adjustIndentation=2})(Je||(Je={}));var Be;(function(e){function t(i){return{label:i}}e.create=t})(Be||(Be={}));var ze;(function(e){function t(i,r){return{items:i||[],isIncomplete:!!r}}e.create=t})(ze||(ze={}));var fe;(function(e){function t(r){return r.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}e.fromPlainText=t;function i(r){var n=r;return s.string(n)||s.objectLiteral(n)&&s.string(n.language)&&s.string(n.value)}e.is=i})(fe||(fe={}));var qe;(function(e){function t(i){var r=i;return!!r&&s.objectLiteral(r)&&(ye.is(r.contents)||fe.is(r.contents)||s.typedArray(r.contents,fe.is))&&(i.range===void 0||y.is(i.range))}e.is=t})(qe||(qe={}));var Xe;(function(e){function t(i,r){return r?{label:i,documentation:r}:{label:i}}e.create=t})(Xe||(Xe={}));var Ye;(function(e){function t(i,r){for(var n=[],a=2;a<arguments.length;a++)n[a-2]=arguments[a];var o={label:i};return s.defined(r)&&(o.documentation=r),s.defined(n)?o.parameters=n:o.parameters=[],o}e.create=t})(Ye||(Ye={}));var F;(function(e){e.Text=1,e.Read=2,e.Write=3})(F||(F={}));var $e;(function(e){function t(i,r){var n={range:i};return s.number(r)&&(n.kind=r),n}e.create=t})($e||($e={}));var v;(function(e){e.File=1,e.Module=2,e.Namespace=3,e.Package=4,e.Class=5,e.Method=6,e.Property=7,e.Field=8,e.Constructor=9,e.Enum=10,e.Interface=11,e.Function=12,e.Variable=13,e.Constant=14,e.String=15,e.Number=16,e.Boolean=17,e.Array=18,e.Object=19,e.Key=20,e.Null=21,e.EnumMember=22,e.Struct=23,e.Event=24,e.Operator=25,e.TypeParameter=26})(v||(v={}));var Ge;(function(e){e.Deprecated=1})(Ge||(Ge={}));var Qe;(function(e){function t(i,r,n,a,o){var u={name:i,kind:r,location:{uri:a,range:n}};return o&&(u.containerName=o),u}e.create=t})(Qe||(Qe={}));var Ze;(function(e){function t(r,n,a,o,u,l){var h={name:r,detail:n,kind:a,range:o,selectionRange:u};return l!==void 0&&(h.children=l),h}e.create=t;function i(r){var n=r;return n&&s.string(n.name)&&s.number(n.kind)&&y.is(n.range)&&y.is(n.selectionRange)&&(n.detail===void 0||s.string(n.detail))&&(n.deprecated===void 0||s.boolean(n.deprecated))&&(n.children===void 0||Array.isArray(n.children))&&(n.tags===void 0||Array.isArray(n.tags))}e.is=i})(Ze||(Ze={}));var en;(function(e){e.Empty="",e.QuickFix="quickfix",e.Refactor="refactor",e.RefactorExtract="refactor.extract",e.RefactorInline="refactor.inline",e.RefactorRewrite="refactor.rewrite",e.Source="source",e.SourceOrganizeImports="source.organizeImports",e.SourceFixAll="source.fixAll"})(en||(en={}));var nn;(function(e){function t(r,n){var a={diagnostics:r};return n!=null&&(a.only=n),a}e.create=t;function i(r){var n=r;return s.defined(n)&&s.typedArray(n.diagnostics,se.is)&&(n.only===void 0||s.typedArray(n.only,s.string))}e.is=i})(nn||(nn={}));var rn;(function(e){function t(r,n,a){var o={title:r},u=!0;return typeof n=="string"?(u=!1,o.kind=n):K.is(n)?o.command=n:o.edit=n,u&&a!==void 0&&(o.kind=a),o}e.create=t;function i(r){var n=r;return n&&s.string(n.title)&&(n.diagnostics===void 0||s.typedArray(n.diagnostics,se.is))&&(n.kind===void 0||s.string(n.kind))&&(n.edit!==void 0||n.command!==void 0)&&(n.command===void 0||K.is(n.command))&&(n.isPreferred===void 0||s.boolean(n.isPreferred))&&(n.edit===void 0||ve.is(n.edit))}e.is=i})(rn||(rn={}));var tn;(function(e){function t(r,n){var a={range:r};return s.defined(n)&&(a.data=n),a}e.create=t;function i(r){var n=r;return s.defined(n)&&y.is(n.range)&&(s.undefined(n.command)||K.is(n.command))}e.is=i})(tn||(tn={}));var an;(function(e){function t(r,n){return{tabSize:r,insertSpaces:n}}e.create=t;function i(r){var n=r;return s.defined(n)&&s.uinteger(n.tabSize)&&s.boolean(n.insertSpaces)}e.is=i})(an||(an={}));var on;(function(e){function t(r,n,a){return{range:r,target:n,data:a}}e.create=t;function i(r){var n=r;return s.defined(n)&&y.is(n.range)&&(s.undefined(n.target)||s.string(n.target))}e.is=i})(on||(on={}));var sn;(function(e){function t(r,n){return{range:r,parent:n}}e.create=t;function i(r){var n=r;return n!==void 0&&y.is(n.range)&&(n.parent===void 0||e.is(n.parent))}e.is=i})(sn||(sn={}));var un;(function(e){function t(a,o,u,l){return new Rn(a,o,u,l)}e.create=t;function i(a){var o=a;return!!(s.defined(o)&&s.string(o.uri)&&(s.undefined(o.languageId)||s.string(o.languageId))&&s.uinteger(o.lineCount)&&s.func(o.getText)&&s.func(o.positionAt)&&s.func(o.offsetAt))}e.is=i;function r(a,o){for(var u=a.getText(),l=n(o,function(_,R){var V=_.range.start.line-R.range.start.line;return V===0?_.range.start.character-R.range.start.character:V}),h=u.length,p=l.length-1;p>=0;p--){var f=l[p],C=a.offsetAt(f.range.start),g=a.offsetAt(f.range.end);if(g<=h)u=u.substring(0,C)+f.newText+u.substring(g,u.length);else throw new Error("Overlapping edit");h=C}return u}e.applyEdits=r;function n(a,o){if(a.length<=1)return a;var u=a.length/2|0,l=a.slice(0,u),h=a.slice(u);n(l,o),n(h,o);for(var p=0,f=0,C=0;p<l.length&&f<h.length;){var g=o(l[p],h[f]);g<=0?a[C++]=l[p++]:a[C++]=h[f++]}for(;p<l.length;)a[C++]=l[p++];for(;f<h.length;)a[C++]=h[f++];return a}})(un||(un={}));var Rn=function(){function e(t,i,r,n){this._uri=t,this._languageId=i,this._version=r,this._content=n,this._lineOffsets=void 0}return Object.defineProperty(e.prototype,"uri",{get:function(){return this._uri},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"languageId",{get:function(){return this._languageId},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"version",{get:function(){return this._version},enumerable:!1,configurable:!0}),e.prototype.getText=function(t){if(t){var i=this.offsetAt(t.start),r=this.offsetAt(t.end);return this._content.substring(i,r)}return this._content},e.prototype.update=function(t,i){this._content=t.text,this._version=i,this._lineOffsets=void 0},e.prototype.getLineOffsets=function(){if(this._lineOffsets===void 0){for(var t=[],i=this._content,r=!0,n=0;n<i.length;n++){r&&(t.push(n),r=!1);var a=i.charAt(n);r=a==="\r"||a===`
+`,a==="\r"&&n+1<i.length&&i.charAt(n+1)===`
+`&&n++}r&&i.length>0&&t.push(i.length),this._lineOffsets=t}return this._lineOffsets},e.prototype.positionAt=function(t){t=Math.max(Math.min(t,this._content.length),0);var i=this.getLineOffsets(),r=0,n=i.length;if(n===0)return S.create(0,t);for(;r<n;){var a=Math.floor((r+n)/2);i[a]>t?n=a:r=a+1}var o=r-1;return S.create(o,t-i[o])},e.prototype.offsetAt=function(t){var i=this.getLineOffsets();if(t.line>=i.length)return this._content.length;if(t.line<0)return 0;var r=i[t.line],n=t.line+1<i.length?i[t.line+1]:this._content.length;return Math.max(Math.min(r+t.character,n),r)},Object.defineProperty(e.prototype,"lineCount",{get:function(){return this.getLineOffsets().length},enumerable:!1,configurable:!0}),e}(),s;(function(e){var t=Object.prototype.toString;function i(g){return typeof g<"u"}e.defined=i;function r(g){return typeof g>"u"}e.undefined=r;function n(g){return g===!0||g===!1}e.boolean=n;function a(g){return t.call(g)==="[object String]"}e.string=a;function o(g){return t.call(g)==="[object Number]"}e.number=o;function u(g,_,R){return t.call(g)==="[object Number]"&&_<=g&&g<=R}e.numberRange=u;function l(g){return t.call(g)==="[object Number]"&&-2147483648<=g&&g<=2147483647}e.integer=l;function h(g){return t.call(g)==="[object Number]"&&0<=g&&g<=2147483647}e.uinteger=h;function p(g){return t.call(g)==="[object Function]"}e.func=p;function f(g){return g!==null&&typeof g=="object"}e.objectLiteral=f;function C(g,_){return Array.isArray(g)&&g.every(_)}e.typedArray=C})(s||(s={}));var q=class{constructor(t,i,r){this._languageId=t;this._worker=i;this._disposables=[];this._listener=Object.create(null);let n=o=>{let u=o.getLanguageId();if(u!==this._languageId)return;let l;this._listener[o.uri.toString()]=o.onDidChangeContent(()=>{window.clearTimeout(l),l=window.setTimeout(()=>this._doValidate(o.uri,u),500)}),this._doValidate(o.uri,u)},a=o=>{c.editor.setModelMarkers(o,this._languageId,[]);let u=o.uri.toString(),l=this._listener[u];l&&(l.dispose(),delete this._listener[u])};this._disposables.push(c.editor.onDidCreateModel(n)),this._disposables.push(c.editor.onWillDisposeModel(a)),this._disposables.push(c.editor.onDidChangeModelLanguage(o=>{a(o.model),n(o.model)})),this._disposables.push(r(o=>{c.editor.getModels().forEach(u=>{u.getLanguageId()===this._languageId&&(a(u),n(u))})})),this._disposables.push({dispose:()=>{c.editor.getModels().forEach(a);for(let o in this._listener)this._listener[o].dispose()}}),c.editor.getModels().forEach(n)}dispose(){this._disposables.forEach(t=>t&&t.dispose()),this._disposables.length=0}_doValidate(t,i){this._worker(t).then(r=>r.doValidation(t.toString())).then(r=>{let n=r.map(o=>Mn(t,o)),a=c.editor.getModel(t);a&&a.getLanguageId()===i&&c.editor.setModelMarkers(a,i,n)}).then(void 0,r=>{console.error(r)})}};function Nn(e){switch(e){case O.Error:return c.MarkerSeverity.Error;case O.Warning:return c.MarkerSeverity.Warning;case O.Information:return c.MarkerSeverity.Info;case O.Hint:return c.MarkerSeverity.Hint;default:return c.MarkerSeverity.Info}}function Mn(e,t){let i=typeof t.code=="number"?String(t.code):t.code;return{severity:Nn(t.severity),startLineNumber:t.range.start.line+1,startColumn:t.range.start.character+1,endLineNumber:t.range.end.line+1,endColumn:t.range.end.character+1,message:t.message,code:i,source:t.source}}var X=class{constructor(t,i){this._worker=t;this._triggerCharacters=i}get triggerCharacters(){return this._triggerCharacters}provideCompletionItems(t,i,r,n){let a=t.uri;return this._worker(a).then(o=>o.doComplete(a.toString(),L(i))).then(o=>{if(!o)return;let u=t.getWordUntilPosition(i),l=new c.Range(i.lineNumber,u.startColumn,i.lineNumber,u.endColumn),h=o.items.map(p=>{let f={label:p.label,insertText:p.insertText||p.label,sortText:p.sortText,filterText:p.filterText,documentation:p.documentation,detail:p.detail,command:Un(p.command),range:l,kind:jn(p.kind)};return p.textEdit&&(Fn(p.textEdit)?f.range={insert:b(p.textEdit.insert),replace:b(p.textEdit.replace)}:f.range=b(p.textEdit.range),f.insertText=p.textEdit.newText),p.additionalTextEdits&&(f.additionalTextEdits=p.additionalTextEdits.map(j)),p.insertTextFormat===le.Snippet&&(f.insertTextRules=c.languages.CompletionItemInsertTextRule.InsertAsSnippet),f});return{isIncomplete:o.isIncomplete,suggestions:h}})}};function L(e){if(e)return{character:e.column-1,line:e.lineNumber-1}}function Ie(e){if(e)return{start:{line:e.startLineNumber-1,character:e.startColumn-1},end:{line:e.endLineNumber-1,character:e.endColumn-1}}}function b(e){if(e)return new c.Range(e.start.line+1,e.start.character+1,e.end.line+1,e.end.character+1)}function Fn(e){return typeof e.insert<"u"&&typeof e.replace<"u"}function jn(e){let t=c.languages.CompletionItemKind;switch(e){case m.Text:return t.Text;case m.Method:return t.Method;case m.Function:return t.Function;case m.Constructor:return t.Constructor;case m.Field:return t.Field;case m.Variable:return t.Variable;case m.Class:return t.Class;case m.Interface:return t.Interface;case m.Module:return t.Module;case m.Property:return t.Property;case m.Unit:return t.Unit;case m.Value:return t.Value;case m.Enum:return t.Enum;case m.Keyword:return t.Keyword;case m.Snippet:return t.Snippet;case m.Color:return t.Color;case m.File:return t.File;case m.Reference:return t.Reference}return t.Property}function j(e){if(e)return{range:b(e.range),text:e.newText}}function Un(e){return e&&e.command==="editor.action.triggerSuggest"?{id:e.command,title:e.title,arguments:e.arguments}:void 0}var Y=class{constructor(t){this._worker=t}provideHover(t,i,r){let n=t.uri;return this._worker(n).then(a=>a.doHover(n.toString(),L(i))).then(a=>{if(a)return{range:b(a.range),contents:Kn(a.contents)}})}};function Vn(e){return e&&typeof e=="object"&&typeof e.kind=="string"}function cn(e){return typeof e=="string"?{value:e}:Vn(e)?e.kind==="plaintext"?{value:e.value.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}:{value:e.value}:{value:"```"+e.language+`
+`+e.value+"\n```\n"}}function Kn(e){if(e)return Array.isArray(e)?e.map(cn):[cn(e)]}var ke=class{constructor(t){this._worker=t}provideDocumentHighlights(t,i,r){let n=t.uri;return this._worker(n).then(a=>a.findDocumentHighlights(n.toString(),L(i))).then(a=>{if(a)return a.map(o=>({range:b(o.range),kind:Hn(o.kind)}))})}};function Hn(e){switch(e){case F.Read:return c.languages.DocumentHighlightKind.Read;case F.Write:return c.languages.DocumentHighlightKind.Write;case F.Text:return c.languages.DocumentHighlightKind.Text}return c.languages.DocumentHighlightKind.Text}var Te=class{constructor(t){this._worker=t}provideDefinition(t,i,r){let n=t.uri;return this._worker(n).then(a=>a.findDefinition(n.toString(),L(i))).then(a=>{if(a)return[ln(a)]})}};function ln(e){return{uri:c.Uri.parse(e.uri),range:b(e.range)}}var be=class{constructor(t){this._worker=t}provideReferences(t,i,r,n){let a=t.uri;return this._worker(a).then(o=>o.findReferences(a.toString(),L(i))).then(o=>{if(o)return o.map(ln)})}},Ce=class{constructor(t){this._worker=t}provideRenameEdits(t,i,r,n){let a=t.uri;return this._worker(a).then(o=>o.doRename(a.toString(),L(i),r)).then(o=>Jn(o))}};function Jn(e){if(!e||!e.changes)return;let t=[];for(let i in e.changes){let r=c.Uri.parse(i);for(let n of e.changes[i])t.push({resource:r,versionId:void 0,textEdit:{range:b(n.range),text:n.newText}})}return{edits:t}}var $=class{constructor(t){this._worker=t}provideDocumentSymbols(t,i){let r=t.uri;return this._worker(r).then(n=>n.findDocumentSymbols(r.toString())).then(n=>{if(n)return n.map(a=>Bn(a)?fn(a):{name:a.name,detail:"",containerName:a.containerName,kind:dn(a.kind),range:b(a.location.range),selectionRange:b(a.location.range),tags:[]})})}};function Bn(e){return"children"in e}function fn(e){return{name:e.name,detail:e.detail??"",kind:dn(e.kind),range:b(e.range),selectionRange:b(e.selectionRange),tags:e.tags??[],children:(e.children??[]).map(t=>fn(t))}}function dn(e){let t=c.languages.SymbolKind;switch(e){case v.File:return t.File;case v.Module:return t.Module;case v.Namespace:return t.Namespace;case v.Package:return t.Package;case v.Class:return t.Class;case v.Method:return t.Method;case v.Property:return t.Property;case v.Field:return t.Field;case v.Constructor:return t.Constructor;case v.Enum:return t.Enum;case v.Interface:return t.Interface;case v.Function:return t.Function;case v.Variable:return t.Variable;case v.Constant:return t.Constant;case v.String:return t.String;case v.Number:return t.Number;case v.Boolean:return t.Boolean;case v.Array:return t.Array}return t.Function}var we=class{constructor(t){this._worker=t}provideLinks(t,i){let r=t.uri;return this._worker(r).then(n=>n.findDocumentLinks(r.toString())).then(n=>{if(n)return{links:n.map(a=>({range:b(a.range),url:a.target}))}})}},G=class{constructor(t){this._worker=t}provideDocumentFormattingEdits(t,i,r){let n=t.uri;return this._worker(n).then(a=>a.format(n.toString(),null,gn(i)).then(o=>{if(!(!o||o.length===0))return o.map(j)}))}},Q=class{constructor(t){this._worker=t;this.canFormatMultipleRanges=!1}provideDocumentRangeFormattingEdits(t,i,r,n){let a=t.uri;return this._worker(a).then(o=>o.format(a.toString(),Ie(i),gn(r)).then(u=>{if(!(!u||u.length===0))return u.map(j)}))}};function gn(e){return{tabSize:e.tabSize,insertSpaces:e.insertSpaces}}var Z=class{constructor(t){this._worker=t}provideDocumentColors(t,i){let r=t.uri;return this._worker(r).then(n=>n.findDocumentColors(r.toString())).then(n=>{if(n)return n.map(a=>({color:a.color,range:b(a.range)}))})}provideColorPresentations(t,i,r){let n=t.uri;return this._worker(n).then(a=>a.getColorPresentations(n.toString(),i.color,Ie(i.range))).then(a=>{if(a)return a.map(o=>{let u={label:o.label};return o.textEdit&&(u.textEdit=j(o.textEdit)),o.additionalTextEdits&&(u.additionalTextEdits=o.additionalTextEdits.map(j)),u})})}},ee=class{constructor(t){this._worker=t}provideFoldingRanges(t,i,r){let n=t.uri;return this._worker(n).then(a=>a.getFoldingRanges(n.toString(),i)).then(a=>{if(a)return a.map(o=>{let u={start:o.startLine+1,end:o.endLine+1};return typeof o.kind<"u"&&(u.kind=zn(o.kind)),u})})}};function zn(e){switch(e){case M.Comment:return c.languages.FoldingRangeKind.Comment;case M.Imports:return c.languages.FoldingRangeKind.Imports;case M.Region:return c.languages.FoldingRangeKind.Region}}var ne=class{constructor(t){this._worker=t}provideSelectionRanges(t,i,r){let n=t.uri;return this._worker(n).then(a=>a.getSelectionRanges(n.toString(),i.map(L))).then(a=>{if(a)return a.map(o=>{let u=[];for(;o;)u.push({range:b(o.range)}),o=o.parent;return u})})}};function de(e,t){t===void 0&&(t=!1);var i=e.length,r=0,n="",a=0,o=16,u=0,l=0,h=0,p=0,f=0;function C(d,w){for(var E=0,I=0;E<d||!w;){var k=e.charCodeAt(r);if(k>=48&&k<=57)I=I*16+k-48;else if(k>=65&&k<=70)I=I*16+k-65+10;else if(k>=97&&k<=102)I=I*16+k-97+10;else break;r++,E++}return E<d&&(I=-1),I}function g(d){r=d,n="",a=0,o=16,f=0}function _(){var d=r;if(e.charCodeAt(r)===48)r++;else for(r++;r<e.length&&U(e.charCodeAt(r));)r++;if(r<e.length&&e.charCodeAt(r)===46)if(r++,r<e.length&&U(e.charCodeAt(r)))for(r++;r<e.length&&U(e.charCodeAt(r));)r++;else return f=3,e.substring(d,r);var w=r;if(r<e.length&&(e.charCodeAt(r)===69||e.charCodeAt(r)===101))if(r++,(r<e.length&&e.charCodeAt(r)===43||e.charCodeAt(r)===45)&&r++,r<e.length&&U(e.charCodeAt(r))){for(r++;r<e.length&&U(e.charCodeAt(r));)r++;w=r}else f=3;return e.substring(d,w)}function R(){for(var d="",w=r;;){if(r>=i){d+=e.substring(w,r),f=2;break}var E=e.charCodeAt(r);if(E===34){d+=e.substring(w,r),r++;break}if(E===92){if(d+=e.substring(w,r),r++,r>=i){f=2;break}var I=e.charCodeAt(r++);switch(I){case 34:d+='"';break;case 92:d+="\\";break;case 47:d+="/";break;case 98:d+="\b";break;case 102:d+="\f";break;case 110:d+=`
+`;break;case 114:d+="\r";break;case 116:d+="	";break;case 117:var k=C(4,!0);k>=0?d+=String.fromCharCode(k):f=4;break;default:f=5}w=r;continue}if(E>=0&&E<=31)if(re(E)){d+=e.substring(w,r),f=2;break}else f=6;r++}return d}function V(){if(n="",f=0,a=r,l=u,p=h,r>=i)return a=i,o=17;var d=e.charCodeAt(r);if(xe(d)){do r++,n+=String.fromCharCode(d),d=e.charCodeAt(r);while(xe(d));return o=15}if(re(d))return r++,n+=String.fromCharCode(d),d===13&&e.charCodeAt(r)===10&&(r++,n+=`
+`),u++,h=r,o=14;switch(d){case 123:return r++,o=1;case 125:return r++,o=2;case 91:return r++,o=3;case 93:return r++,o=4;case 58:return r++,o=6;case 44:return r++,o=5;case 34:return r++,n=R(),o=10;case 47:var w=r-1;if(e.charCodeAt(r+1)===47){for(r+=2;r<i&&!re(e.charCodeAt(r));)r++;return n=e.substring(w,r),o=12}if(e.charCodeAt(r+1)===42){r+=2;for(var E=i-1,I=!1;r<E;){var k=e.charCodeAt(r);if(k===42&&e.charCodeAt(r+1)===47){r+=2,I=!0;break}r++,re(k)&&(k===13&&e.charCodeAt(r)===10&&r++,u++,h=r)}return I||(r++,f=1),n=e.substring(w,r),o=13}return n+=String.fromCharCode(d),r++,o=16;case 45:if(n+=String.fromCharCode(d),r++,r===i||!U(e.charCodeAt(r)))return o=16;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return n+=_(),o=11;default:for(;r<i&&bn(d);)r++,d=e.charCodeAt(r);if(a!==r){switch(n=e.substring(a,r),n){case"true":return o=8;case"false":return o=9;case"null":return o=7}return o=16}return n+=String.fromCharCode(d),r++,o=16}}function bn(d){if(xe(d)||re(d))return!1;switch(d){case 125:case 93:case 123:case 91:case 34:case 58:case 44:case 47:return!1}return!0}function Cn(){var d;do d=V();while(d>=12&&d<=15);return d}return{setPosition:g,getPosition:function(){return r},scan:t?Cn:V,getToken:function(){return o},getTokenValue:function(){return n},getTokenOffset:function(){return a},getTokenLength:function(){return r-a},getTokenStartLine:function(){return l},getTokenStartCharacter:function(){return a-p},getTokenError:function(){return f}}}function xe(e){return e===32||e===9||e===11||e===12||e===160||e===5760||e>=8192&&e<=8203||e===8239||e===8287||e===12288||e===65279}function re(e){return e===10||e===13||e===8232||e===8233}function U(e){return e>=48&&e<=57}var pn;(function(e){e.DEFAULT={allowTrailingComma:!1}})(pn||(pn={}));var hn=de;function yn(e){return{getInitialState:()=>new ge(null,null,!1,null),tokenize:(t,i)=>fr(e,t,i)}}var mn="delimiter.bracket.json",vn="delimiter.array.json",rr="delimiter.colon.json",tr="delimiter.comma.json",ir="keyword.json",ar="keyword.json",or="string.value.json",sr="number.json",ur="string.key.json",cr="comment.block.json",lr="comment.line.json";var W=class e{constructor(t,i){this.parent=t;this.type=i}static pop(t){return t?t.parent:null}static push(t,i){return new e(t,i)}static equals(t,i){if(!t&&!i)return!0;if(!t||!i)return!1;for(;t&&i;){if(t===i)return!0;if(t.type!==i.type)return!1;t=t.parent,i=i.parent}return!0}},ge=class e{constructor(t,i,r,n){this._state=t,this.scanError=i,this.lastWasColon=r,this.parents=n}clone(){return new e(this._state,this.scanError,this.lastWasColon,this.parents)}equals(t){return t===this?!0:!t||!(t instanceof e)?!1:this.scanError===t.scanError&&this.lastWasColon===t.lastWasColon&&W.equals(this.parents,t.parents)}getStateData(){return this._state}setStateData(t){this._state=t}};function fr(e,t,i,r=0){let n=0,a=!1;switch(i.scanError){case 2:t='"'+t,n=1;break;case 1:t="/*"+t,n=2;break}let o=hn(t),u=i.lastWasColon,l=i.parents,h={tokens:[],endState:i.clone()};for(;;){let p=r+o.getPosition(),f="",C=o.scan();if(C===17)break;if(p===r+o.getPosition())throw new Error("Scanner did not advance, next 3 characters are: "+t.substr(o.getPosition(),3));switch(a&&(p-=n),a=n>0,C){case 1:l=W.push(l,0),f=mn,u=!1;break;case 2:l=W.pop(l),f=mn,u=!1;break;case 3:l=W.push(l,1),f=vn,u=!1;break;case 4:l=W.pop(l),f=vn,u=!1;break;case 6:f=rr,u=!0;break;case 5:f=tr,u=!1;break;case 8:case 9:f=ir,u=!1;break;case 7:f=ar,u=!1;break;case 10:let _=(l?l.type:0)===1;f=u||_?or:ur,u=!1;break;case 11:f=sr,u=!1;break}if(e)switch(C){case 12:f=lr;break;case 13:f=cr;break}h.endState=new ge(i.getStateData(),o.getTokenError(),u,l),h.tokens.push({startIndex:p,scopes:f})}return h}var x;function dr(){return new Promise((e,t)=>{if(!x)return t("JSON not registered!");e(x)})}var Ee=class extends q{constructor(t,i,r){super(t,i,r.onDidChange),this._disposables.push(c.editor.onWillDisposeModel(n=>{this._resetSchema(n.uri)})),this._disposables.push(c.editor.onDidChangeModelLanguage(n=>{this._resetSchema(n.model.uri)}))}_resetSchema(t){this._worker().then(i=>{i.resetSchema(t.toString())})}};function gr(e){let t=[],i=[],r=new D(e);t.push(r),x=(...o)=>r.getLanguageServiceWorker(...o);function n(){let{languageId:o,modeConfiguration:u}=e;Tn(i),u.documentFormattingEdits&&i.push(c.languages.registerDocumentFormattingEditProvider(o,new G(x))),u.documentRangeFormattingEdits&&i.push(c.languages.registerDocumentRangeFormattingEditProvider(o,new Q(x))),u.completionItems&&i.push(c.languages.registerCompletionItemProvider(o,new X(x,[" ",":",'"']))),u.hovers&&i.push(c.languages.registerHoverProvider(o,new Y(x))),u.documentSymbols&&i.push(c.languages.registerDocumentSymbolProvider(o,new $(x))),u.tokens&&i.push(c.languages.setTokensProvider(o,yn(!0))),u.colors&&i.push(c.languages.registerColorProvider(o,new Z(x))),u.foldingRanges&&i.push(c.languages.registerFoldingRangeProvider(o,new ee(x))),u.diagnostics&&i.push(new Ee(o,x,e)),u.selectionRanges&&i.push(c.languages.registerSelectionRangeProvider(o,new ne(x)))}n(),t.push(c.languages.setLanguageConfiguration(e.languageId,pr));let a=e.modeConfiguration;return e.onDidChange(o=>{o.modeConfiguration!==a&&(a=o.modeConfiguration,n())}),t.push(kn(i)),kn(t)}function kn(e){return{dispose:()=>Tn(e)}}function Tn(e){for(;e.length;)e.pop().dispose()}var pr={wordPattern:/(-?\d*\.\d\w*)|([^\[\{\]\}\:\"\,\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string"]},{open:"[",close:"]",notIn:["string"]},{open:'"',close:'"',notIn:["string"]}]};return Ln(hr);})();
+return moduleExports;
+});
diff --git a/public/vs/language/json/jsonWorker.js b/public/vs/language/json/jsonWorker.js
new file mode 100644
index 0000000..798bd7c
--- /dev/null
+++ b/public/vs/language/json/jsonWorker.js
@@ -0,0 +1,36 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/language/json/jsonWorker", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var ht=Object.defineProperty;var Hr=Object.getOwnPropertyDescriptor;var Gr=Object.getOwnPropertyNames;var Xr=Object.prototype.hasOwnProperty;var Zr=(t,r)=>{for(var i in r)ht(t,i,{get:r[i],enumerable:!0})},Qr=(t,r,i,e)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of Gr(r))!Xr.call(t,n)&&n!==i&&ht(t,n,{get:()=>r[n],enumerable:!(e=Hr(r,n))||e.enumerable});return t};var Yr=t=>Qr(ht({},"__esModule",{value:!0}),t);var _n={};Zr(_n,{JSONWorker:()=>ft,create:()=>Bn});function Ce(t,r){r===void 0&&(r=!1);var i=t.length,e=0,n="",a=0,s=16,o=0,f=0,l=0,u=0,c=0;function h(v,O){for(var E=0,I=0;E<v||!O;){var A=t.charCodeAt(e);if(A>=48&&A<=57)I=I*16+A-48;else if(A>=65&&A<=70)I=I*16+A-65+10;else if(A>=97&&A<=102)I=I*16+A-97+10;else break;e++,E++}return E<v&&(I=-1),I}function d(v){e=v,n="",a=0,s=16,c=0}function m(){var v=e;if(t.charCodeAt(e)===48)e++;else for(e++;e<t.length&&Oe(t.charCodeAt(e));)e++;if(e<t.length&&t.charCodeAt(e)===46)if(e++,e<t.length&&Oe(t.charCodeAt(e)))for(e++;e<t.length&&Oe(t.charCodeAt(e));)e++;else return c=3,t.substring(v,e);var O=e;if(e<t.length&&(t.charCodeAt(e)===69||t.charCodeAt(e)===101))if(e++,(e<t.length&&t.charCodeAt(e)===43||t.charCodeAt(e)===45)&&e++,e<t.length&&Oe(t.charCodeAt(e))){for(e++;e<t.length&&Oe(t.charCodeAt(e));)e++;O=e}else c=3;return t.substring(v,O)}function p(){for(var v="",O=e;;){if(e>=i){v+=t.substring(O,e),c=2;break}var E=t.charCodeAt(e);if(E===34){v+=t.substring(O,e),e++;break}if(E===92){if(v+=t.substring(O,e),e++,e>=i){c=2;break}var I=t.charCodeAt(e++);switch(I){case 34:v+='"';break;case 92:v+="\\";break;case 47:v+="/";break;case 98:v+="\b";break;case 102:v+="\f";break;case 110:v+=`
+`;break;case 114:v+="\r";break;case 116:v+="	";break;case 117:var A=h(4,!0);A>=0?v+=String.fromCharCode(A):c=4;break;default:c=5}O=e;continue}if(E>=0&&E<=31)if(Me(E)){v+=t.substring(O,e),c=2;break}else c=6;e++}return v}function g(){if(n="",c=0,a=e,f=o,u=l,e>=i)return a=i,s=17;var v=t.charCodeAt(e);if(gt(v)){do e++,n+=String.fromCharCode(v),v=t.charCodeAt(e);while(gt(v));return s=15}if(Me(v))return e++,n+=String.fromCharCode(v),v===13&&t.charCodeAt(e)===10&&(e++,n+=`
+`),o++,l=e,s=14;switch(v){case 123:return e++,s=1;case 125:return e++,s=2;case 91:return e++,s=3;case 93:return e++,s=4;case 58:return e++,s=6;case 44:return e++,s=5;case 34:return e++,n=p(),s=10;case 47:var O=e-1;if(t.charCodeAt(e+1)===47){for(e+=2;e<i&&!Me(t.charCodeAt(e));)e++;return n=t.substring(O,e),s=12}if(t.charCodeAt(e+1)===42){e+=2;for(var E=i-1,I=!1;e<E;){var A=t.charCodeAt(e);if(A===42&&t.charCodeAt(e+1)===47){e+=2,I=!0;break}e++,Me(A)&&(A===13&&t.charCodeAt(e)===10&&e++,o++,l=e)}return I||(e++,c=1),n=t.substring(O,e),s=13}return n+=String.fromCharCode(v),e++,s=16;case 45:if(n+=String.fromCharCode(v),e++,e===i||!Oe(t.charCodeAt(e)))return s=16;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return n+=m(),s=11;default:for(;e<i&&b(v);)e++,v=t.charCodeAt(e);if(a!==e){switch(n=t.substring(a,e),n){case"true":return s=8;case"false":return s=9;case"null":return s=7}return s=16}return n+=String.fromCharCode(v),e++,s=16}}function b(v){if(gt(v)||Me(v))return!1;switch(v){case 125:case 93:case 123:case 91:case 34:case 58:case 44:case 47:return!1}return!0}function y(){var v;do v=g();while(v>=12&&v<=15);return v}return{setPosition:d,getPosition:function(){return e},scan:r?y:g,getToken:function(){return s},getTokenValue:function(){return n},getTokenOffset:function(){return a},getTokenLength:function(){return e-a},getTokenStartLine:function(){return f},getTokenStartCharacter:function(){return a-u},getTokenError:function(){return c}}}function gt(t){return t===32||t===9||t===11||t===12||t===160||t===5760||t>=8192&&t<=8203||t===8239||t===8287||t===12288||t===65279}function Me(t){return t===10||t===13||t===8232||t===8233}function Oe(t){return t>=48&&t<=57}function mt(t,r,i){var e,n,a,s,o;if(r){for(s=r.offset,o=s+r.length,a=s;a>0&&!pt(t,a-1);)a--;for(var f=o;f<t.length&&!pt(t,f);)f++;n=t.substring(a,f),e=en(n,i)}else n=t,e=0,a=0,s=0,o=t.length;var l=tn(i,t),u=!1,c=0,h;i.insertSpaces?h=dt(" ",i.tabSize||4):h="	";var d=Ce(n,!1),m=!1;function p(){return l+dt(h,e+c)}function g(){var N=d.scan();for(u=!1;N===15||N===14;)u=u||N===14,N=d.scan();return m=N===16||d.getTokenError()!==0,N}var b=[];function y(N,L,R){!m&&(!r||L<o&&R>s)&&t.substring(L,R)!==N&&b.push({offset:L,length:R-L,content:N})}var v=g();if(v!==17){var O=d.getTokenOffset()+a,E=dt(h,e);y(E,a,O)}for(;v!==17;){for(var I=d.getTokenOffset()+d.getTokenLength()+a,A=g(),P="",w=!1;!u&&(A===12||A===13);){var C=d.getTokenOffset()+a;y(" ",I,C),I=d.getTokenOffset()+d.getTokenLength()+a,w=A===12,P=w?p():"",A=g()}if(A===2)v!==1&&(c--,P=p());else if(A===4)v!==3&&(c--,P=p());else{switch(v){case 3:case 1:c++,P=p();break;case 5:case 12:P=p();break;case 13:u?P=p():w||(P=" ");break;case 6:w||(P=" ");break;case 10:if(A===6){w||(P="");break}case 7:case 8:case 9:case 11:case 2:case 4:A===12||A===13?w||(P=" "):A!==5&&A!==17&&(m=!0);break;case 16:m=!0;break}u&&(A===12||A===13)&&(P=p())}A===17&&(P=i.insertFinalNewline?l:"");var F=d.getTokenOffset()+a;y(P,I,F),v=A}return b}function dt(t,r){for(var i="",e=0;e<r;e++)i+=t;return i}function en(t,r){for(var i=0,e=0,n=r.tabSize||4;i<t.length;){var a=t.charAt(i);if(a===" ")e++;else if(a==="	")e+=n;else break;i++}return Math.floor(e/n)}function tn(t,r){for(var i=0;i<r.length;i++){var e=r.charAt(i);if(e==="\r")return i+1<r.length&&r.charAt(i+1)===`
+`?`\r
+`:"\r";if(e===`
+`)return`
+`}return t&&t.eol||`
+`}function pt(t,r){return`\r
+`.indexOf(t.charAt(r))!==-1}var ze;(function(t){t.DEFAULT={allowTrailingComma:!1}})(ze||(ze={}));function Zt(t,r,i){r===void 0&&(r=[]),i===void 0&&(i=ze.DEFAULT);var e=null,n=[],a=[];function s(f){Array.isArray(n)?n.push(f):e!==null&&(n[e]=f)}var o={onObjectBegin:function(){var f={};s(f),a.push(n),n=f,e=null},onObjectProperty:function(f){e=f},onObjectEnd:function(){n=a.pop()},onArrayBegin:function(){var f=[];s(f),a.push(n),n=f,e=null},onArrayEnd:function(){n=a.pop()},onLiteralValue:s,onError:function(f,l,u){r.push({error:f,offset:l,length:u})}};return Qt(t,o,i),n[0]}function vt(t){if(!t.parent||!t.parent.children)return[];var r=vt(t.parent);if(t.parent.type==="property"){var i=t.parent.children[0].value;r.push(i)}else if(t.parent.type==="array"){var e=t.parent.children.indexOf(t);e!==-1&&r.push(e)}return r}function Be(t){switch(t.type){case"array":return t.children.map(Be);case"object":for(var r=Object.create(null),i=0,e=t.children;i<e.length;i++){var n=e[i],a=n.children[1];a&&(r[n.children[0].value]=Be(a))}return r;case"null":case"string":case"number":case"boolean":return t.value;default:return}}function nn(t,r,i){return i===void 0&&(i=!1),r>=t.offset&&r<t.offset+t.length||i&&r===t.offset+t.length}function yt(t,r,i){if(i===void 0&&(i=!1),nn(t,r,i)){var e=t.children;if(Array.isArray(e))for(var n=0;n<e.length&&e[n].offset<=r;n++){var a=yt(e[n],r,i);if(a)return a}return t}}function Qt(t,r,i){i===void 0&&(i=ze.DEFAULT);var e=Ce(t,!1);function n(w){return w?function(){return w(e.getTokenOffset(),e.getTokenLength(),e.getTokenStartLine(),e.getTokenStartCharacter())}:function(){return!0}}function a(w){return w?function(C){return w(C,e.getTokenOffset(),e.getTokenLength(),e.getTokenStartLine(),e.getTokenStartCharacter())}:function(){return!0}}var s=n(r.onObjectBegin),o=a(r.onObjectProperty),f=n(r.onObjectEnd),l=n(r.onArrayBegin),u=n(r.onArrayEnd),c=a(r.onLiteralValue),h=a(r.onSeparator),d=n(r.onComment),m=a(r.onError),p=i&&i.disallowComments,g=i&&i.allowTrailingComma;function b(){for(;;){var w=e.scan();switch(e.getTokenError()){case 4:y(14);break;case 5:y(15);break;case 3:y(13);break;case 1:p||y(11);break;case 2:y(12);break;case 6:y(16);break}switch(w){case 12:case 13:p?y(10):d();break;case 16:y(1);break;case 15:case 14:break;default:return w}}}function y(w,C,F){if(C===void 0&&(C=[]),F===void 0&&(F=[]),m(w),C.length+F.length>0)for(var N=e.getToken();N!==17;){if(C.indexOf(N)!==-1){b();break}else if(F.indexOf(N)!==-1)break;N=b()}}function v(w){var C=e.getTokenValue();return w?c(C):o(C),b(),!0}function O(){switch(e.getToken()){case 11:var w=e.getTokenValue(),C=Number(w);isNaN(C)&&(y(2),C=0),c(C);break;case 7:c(null);break;case 8:c(!0);break;case 9:c(!1);break;default:return!1}return b(),!0}function E(){return e.getToken()!==10?(y(3,[],[2,5]),!1):(v(!1),e.getToken()===6?(h(":"),b(),P()||y(4,[],[2,5])):y(5,[],[2,5]),!0)}function I(){s(),b();for(var w=!1;e.getToken()!==2&&e.getToken()!==17;){if(e.getToken()===5){if(w||y(4,[],[]),h(","),b(),e.getToken()===2&&g)break}else w&&y(6,[],[]);E()||y(4,[],[2,5]),w=!0}return f(),e.getToken()!==2?y(7,[2],[]):b(),!0}function A(){l(),b();for(var w=!1;e.getToken()!==4&&e.getToken()!==17;){if(e.getToken()===5){if(w||y(4,[],[]),h(","),b(),e.getToken()===4&&g)break}else w&&y(6,[],[]);P()||y(4,[],[4,5]),w=!0}return u(),e.getToken()!==4?y(8,[4],[]):b(),!0}function P(){switch(e.getToken()){case 3:return A();case 1:return I();case 10:return v(!0);default:return O()}}return b(),e.getToken()===17?i.allowEmptyContent?!0:(y(4,[],[]),!1):P()?(e.getToken()!==17&&y(9,[],[]),!0):(y(4,[],[]),!1)}var le=Ce;var Yt=Zt;var Kt=yt,er=vt,tr=Be;function rr(t,r,i){return mt(t,r,i)}function Pe(t,r){if(t===r)return!0;if(t==null||r===null||r===void 0||typeof t!=typeof r||typeof t!="object"||Array.isArray(t)!==Array.isArray(r))return!1;var i,e;if(Array.isArray(t)){if(t.length!==r.length)return!1;for(i=0;i<t.length;i++)if(!Pe(t[i],r[i]))return!1}else{var n=[];for(e in t)n.push(e);n.sort();var a=[];for(e in r)a.push(e);if(a.sort(),!Pe(n,a))return!1;for(i=0;i<n.length;i++)if(!Pe(t[n[i]],r[n[i]]))return!1}return!0}function ee(t){return typeof t=="number"}function se(t){return typeof t<"u"}function ie(t){return typeof t=="boolean"}function nr(t){return typeof t=="string"}function un(t,r){if(t.length<r.length)return!1;for(var i=0;i<r.length;i++)if(t[i]!==r[i])return!1;return!0}function pe(t,r){var i=t.length-r.length;return i>0?t.lastIndexOf(r)===i:i===0?t===r:!1}function xe(t){var r="";un(t,"(?i)")&&(t=t.substring(4),r="i");try{return new RegExp(t,r+"u")}catch{try{return new RegExp(t,r)}catch{return}}}var ar;(function(t){t.MIN_VALUE=-2147483648,t.MAX_VALUE=2147483647})(ar||(ar={}));var He;(function(t){t.MIN_VALUE=0,t.MAX_VALUE=2147483647})(He||(He={}));var re;(function(t){function r(e,n){return e===Number.MAX_VALUE&&(e=He.MAX_VALUE),n===Number.MAX_VALUE&&(n=He.MAX_VALUE),{line:e,character:n}}t.create=r;function i(e){var n=e;return x.objectLiteral(n)&&x.uinteger(n.line)&&x.uinteger(n.character)}t.is=i})(re||(re={}));var U;(function(t){function r(e,n,a,s){if(x.uinteger(e)&&x.uinteger(n)&&x.uinteger(a)&&x.uinteger(s))return{start:re.create(e,n),end:re.create(a,s)};if(re.is(e)&&re.is(n))return{start:e,end:n};throw new Error("Range#create called with invalid arguments["+e+", "+n+", "+a+", "+s+"]")}t.create=r;function i(e){var n=e;return x.objectLiteral(n)&&re.is(n.start)&&re.is(n.end)}t.is=i})(U||(U={}));var Se;(function(t){function r(e,n){return{uri:e,range:n}}t.create=r;function i(e){var n=e;return x.defined(n)&&U.is(n.range)&&(x.string(n.uri)||x.undefined(n.uri))}t.is=i})(Se||(Se={}));var or;(function(t){function r(e,n,a,s){return{targetUri:e,targetRange:n,targetSelectionRange:a,originSelectionRange:s}}t.create=r;function i(e){var n=e;return x.defined(n)&&U.is(n.targetRange)&&x.string(n.targetUri)&&(U.is(n.targetSelectionRange)||x.undefined(n.targetSelectionRange))&&(U.is(n.originSelectionRange)||x.undefined(n.originSelectionRange))}t.is=i})(or||(or={}));var Ge;(function(t){function r(e,n,a,s){return{red:e,green:n,blue:a,alpha:s}}t.create=r;function i(e){var n=e;return x.numberRange(n.red,0,1)&&x.numberRange(n.green,0,1)&&x.numberRange(n.blue,0,1)&&x.numberRange(n.alpha,0,1)}t.is=i})(Ge||(Ge={}));var xt;(function(t){function r(e,n){return{range:e,color:n}}t.create=r;function i(e){var n=e;return U.is(n.range)&&Ge.is(n.color)}t.is=i})(xt||(xt={}));var St;(function(t){function r(e,n,a){return{label:e,textEdit:n,additionalTextEdits:a}}t.create=r;function i(e){var n=e;return x.string(n.label)&&(x.undefined(n.textEdit)||Y.is(n))&&(x.undefined(n.additionalTextEdits)||x.typedArray(n.additionalTextEdits,Y.is))}t.is=i})(St||(St={}));var Ae;(function(t){t.Comment="comment",t.Imports="imports",t.Region="region"})(Ae||(Ae={}));var At;(function(t){function r(e,n,a,s,o){var f={startLine:e,endLine:n};return x.defined(a)&&(f.startCharacter=a),x.defined(s)&&(f.endCharacter=s),x.defined(o)&&(f.kind=o),f}t.create=r;function i(e){var n=e;return x.uinteger(n.startLine)&&x.uinteger(n.startLine)&&(x.undefined(n.startCharacter)||x.uinteger(n.startCharacter))&&(x.undefined(n.endCharacter)||x.uinteger(n.endCharacter))&&(x.undefined(n.kind)||x.string(n.kind))}t.is=i})(At||(At={}));var wt;(function(t){function r(e,n){return{location:e,message:n}}t.create=r;function i(e){var n=e;return x.defined(n)&&Se.is(n.location)&&x.string(n.message)}t.is=i})(wt||(wt={}));var Z;(function(t){t.Error=1,t.Warning=2,t.Information=3,t.Hint=4})(Z||(Z={}));var sr;(function(t){t.Unnecessary=1,t.Deprecated=2})(sr||(sr={}));var fr;(function(t){function r(i){var e=i;return e!=null&&x.string(e.href)}t.is=r})(fr||(fr={}));var ae;(function(t){function r(e,n,a,s,o,f){var l={range:e,message:n};return x.defined(a)&&(l.severity=a),x.defined(s)&&(l.code=s),x.defined(o)&&(l.source=o),x.defined(f)&&(l.relatedInformation=f),l}t.create=r;function i(e){var n,a=e;return x.defined(a)&&U.is(a.range)&&x.string(a.message)&&(x.number(a.severity)||x.undefined(a.severity))&&(x.integer(a.code)||x.string(a.code)||x.undefined(a.code))&&(x.undefined(a.codeDescription)||x.string((n=a.codeDescription)===null||n===void 0?void 0:n.href))&&(x.string(a.source)||x.undefined(a.source))&&(x.undefined(a.relatedInformation)||x.typedArray(a.relatedInformation,wt.is))}t.is=i})(ae||(ae={}));var Ee;(function(t){function r(e,n){for(var a=[],s=2;s<arguments.length;s++)a[s-2]=arguments[s];var o={title:e,command:n};return x.defined(a)&&a.length>0&&(o.arguments=a),o}t.create=r;function i(e){var n=e;return x.defined(n)&&x.string(n.title)&&x.string(n.command)}t.is=i})(Ee||(Ee={}));var Y;(function(t){function r(a,s){return{range:a,newText:s}}t.replace=r;function i(a,s){return{range:{start:a,end:a},newText:s}}t.insert=i;function e(a){return{range:a,newText:""}}t.del=e;function n(a){var s=a;return x.objectLiteral(s)&&x.string(s.newText)&&U.is(s.range)}t.is=n})(Y||(Y={}));var je;(function(t){function r(e,n,a){var s={label:e};return n!==void 0&&(s.needsConfirmation=n),a!==void 0&&(s.description=a),s}t.create=r;function i(e){var n=e;return n!==void 0&&x.objectLiteral(n)&&x.string(n.label)&&(x.boolean(n.needsConfirmation)||n.needsConfirmation===void 0)&&(x.string(n.description)||n.description===void 0)}t.is=i})(je||(je={}));var X;(function(t){function r(i){var e=i;return typeof e=="string"}t.is=r})(X||(X={}));var me;(function(t){function r(a,s,o){return{range:a,newText:s,annotationId:o}}t.replace=r;function i(a,s,o){return{range:{start:a,end:a},newText:s,annotationId:o}}t.insert=i;function e(a,s){return{range:a,newText:"",annotationId:s}}t.del=e;function n(a){var s=a;return Y.is(s)&&(je.is(s.annotationId)||X.is(s.annotationId))}t.is=n})(me||(me={}));var Fe;(function(t){function r(e,n){return{textDocument:e,edits:n}}t.create=r;function i(e){var n=e;return x.defined(n)&&Ze.is(n.textDocument)&&Array.isArray(n.edits)}t.is=i})(Fe||(Fe={}));var Le;(function(t){function r(e,n,a){var s={kind:"create",uri:e};return n!==void 0&&(n.overwrite!==void 0||n.ignoreIfExists!==void 0)&&(s.options=n),a!==void 0&&(s.annotationId=a),s}t.create=r;function i(e){var n=e;return n&&n.kind==="create"&&x.string(n.uri)&&(n.options===void 0||(n.options.overwrite===void 0||x.boolean(n.options.overwrite))&&(n.options.ignoreIfExists===void 0||x.boolean(n.options.ignoreIfExists)))&&(n.annotationId===void 0||X.is(n.annotationId))}t.is=i})(Le||(Le={}));var Ve;(function(t){function r(e,n,a,s){var o={kind:"rename",oldUri:e,newUri:n};return a!==void 0&&(a.overwrite!==void 0||a.ignoreIfExists!==void 0)&&(o.options=a),s!==void 0&&(o.annotationId=s),o}t.create=r;function i(e){var n=e;return n&&n.kind==="rename"&&x.string(n.oldUri)&&x.string(n.newUri)&&(n.options===void 0||(n.options.overwrite===void 0||x.boolean(n.options.overwrite))&&(n.options.ignoreIfExists===void 0||x.boolean(n.options.ignoreIfExists)))&&(n.annotationId===void 0||X.is(n.annotationId))}t.is=i})(Ve||(Ve={}));var De;(function(t){function r(e,n,a){var s={kind:"delete",uri:e};return n!==void 0&&(n.recursive!==void 0||n.ignoreIfNotExists!==void 0)&&(s.options=n),a!==void 0&&(s.annotationId=a),s}t.create=r;function i(e){var n=e;return n&&n.kind==="delete"&&x.string(n.uri)&&(n.options===void 0||(n.options.recursive===void 0||x.boolean(n.options.recursive))&&(n.options.ignoreIfNotExists===void 0||x.boolean(n.options.ignoreIfNotExists)))&&(n.annotationId===void 0||X.is(n.annotationId))}t.is=i})(De||(De={}));var Xe;(function(t){function r(i){var e=i;return e&&(e.changes!==void 0||e.documentChanges!==void 0)&&(e.documentChanges===void 0||e.documentChanges.every(function(n){return x.string(n.kind)?Le.is(n)||Ve.is(n)||De.is(n):Fe.is(n)}))}t.is=r})(Xe||(Xe={}));var _e=function(){function t(r,i){this.edits=r,this.changeAnnotations=i}return t.prototype.insert=function(r,i,e){var n,a;if(e===void 0?n=Y.insert(r,i):X.is(e)?(a=e,n=me.insert(r,i,e)):(this.assertChangeAnnotations(this.changeAnnotations),a=this.changeAnnotations.manage(e),n=me.insert(r,i,a)),this.edits.push(n),a!==void 0)return a},t.prototype.replace=function(r,i,e){var n,a;if(e===void 0?n=Y.replace(r,i):X.is(e)?(a=e,n=me.replace(r,i,e)):(this.assertChangeAnnotations(this.changeAnnotations),a=this.changeAnnotations.manage(e),n=me.replace(r,i,a)),this.edits.push(n),a!==void 0)return a},t.prototype.delete=function(r,i){var e,n;if(i===void 0?e=Y.del(r):X.is(i)?(n=i,e=me.del(r,i)):(this.assertChangeAnnotations(this.changeAnnotations),n=this.changeAnnotations.manage(i),e=me.del(r,n)),this.edits.push(e),n!==void 0)return n},t.prototype.add=function(r){this.edits.push(r)},t.prototype.all=function(){return this.edits},t.prototype.clear=function(){this.edits.splice(0,this.edits.length)},t.prototype.assertChangeAnnotations=function(r){if(r===void 0)throw new Error("Text edit change is not configured to manage change annotations.")},t}(),ur=function(){function t(r){this._annotations=r===void 0?Object.create(null):r,this._counter=0,this._size=0}return t.prototype.all=function(){return this._annotations},Object.defineProperty(t.prototype,"size",{get:function(){return this._size},enumerable:!1,configurable:!0}),t.prototype.manage=function(r,i){var e;if(X.is(r)?e=r:(e=this.nextId(),i=r),this._annotations[e]!==void 0)throw new Error("Id "+e+" is already in use.");if(i===void 0)throw new Error("No annotation provided for id "+e);return this._annotations[e]=i,this._size++,e},t.prototype.nextId=function(){return this._counter++,this._counter.toString()},t}(),ni=function(){function t(r){var i=this;this._textEditChanges=Object.create(null),r!==void 0?(this._workspaceEdit=r,r.documentChanges?(this._changeAnnotations=new ur(r.changeAnnotations),r.changeAnnotations=this._changeAnnotations.all(),r.documentChanges.forEach(function(e){if(Fe.is(e)){var n=new _e(e.edits,i._changeAnnotations);i._textEditChanges[e.textDocument.uri]=n}})):r.changes&&Object.keys(r.changes).forEach(function(e){var n=new _e(r.changes[e]);i._textEditChanges[e]=n})):this._workspaceEdit={}}return Object.defineProperty(t.prototype,"edit",{get:function(){return this.initDocumentChanges(),this._changeAnnotations!==void 0&&(this._changeAnnotations.size===0?this._workspaceEdit.changeAnnotations=void 0:this._workspaceEdit.changeAnnotations=this._changeAnnotations.all()),this._workspaceEdit},enumerable:!1,configurable:!0}),t.prototype.getTextEditChange=function(r){if(Ze.is(r)){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var i={uri:r.uri,version:r.version},e=this._textEditChanges[i.uri];if(!e){var n=[],a={textDocument:i,edits:n};this._workspaceEdit.documentChanges.push(a),e=new _e(n,this._changeAnnotations),this._textEditChanges[i.uri]=e}return e}else{if(this.initChanges(),this._workspaceEdit.changes===void 0)throw new Error("Workspace edit is not configured for normal text edit changes.");var e=this._textEditChanges[r];if(!e){var n=[];this._workspaceEdit.changes[r]=n,e=new _e(n),this._textEditChanges[r]=e}return e}},t.prototype.initDocumentChanges=function(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._changeAnnotations=new ur,this._workspaceEdit.documentChanges=[],this._workspaceEdit.changeAnnotations=this._changeAnnotations.all())},t.prototype.initChanges=function(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._workspaceEdit.changes=Object.create(null))},t.prototype.createFile=function(r,i,e){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var n;je.is(i)||X.is(i)?n=i:e=i;var a,s;if(n===void 0?a=Le.create(r,e):(s=X.is(n)?n:this._changeAnnotations.manage(n),a=Le.create(r,e,s)),this._workspaceEdit.documentChanges.push(a),s!==void 0)return s},t.prototype.renameFile=function(r,i,e,n){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var a;je.is(e)||X.is(e)?a=e:n=e;var s,o;if(a===void 0?s=Ve.create(r,i,n):(o=X.is(a)?a:this._changeAnnotations.manage(a),s=Ve.create(r,i,n,o)),this._workspaceEdit.documentChanges.push(s),o!==void 0)return o},t.prototype.deleteFile=function(r,i,e){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");var n;je.is(i)||X.is(i)?n=i:e=i;var a,s;if(n===void 0?a=De.create(r,e):(s=X.is(n)?n:this._changeAnnotations.manage(n),a=De.create(r,e,s)),this._workspaceEdit.documentChanges.push(a),s!==void 0)return s},t}();var cr;(function(t){function r(e){return{uri:e}}t.create=r;function i(e){var n=e;return x.defined(n)&&x.string(n.uri)}t.is=i})(cr||(cr={}));var Tt;(function(t){function r(e,n){return{uri:e,version:n}}t.create=r;function i(e){var n=e;return x.defined(n)&&x.string(n.uri)&&x.integer(n.version)}t.is=i})(Tt||(Tt={}));var Ze;(function(t){function r(e,n){return{uri:e,version:n}}t.create=r;function i(e){var n=e;return x.defined(n)&&x.string(n.uri)&&(n.version===null||x.integer(n.version))}t.is=i})(Ze||(Ze={}));var lr;(function(t){function r(e,n,a,s){return{uri:e,languageId:n,version:a,text:s}}t.create=r;function i(e){var n=e;return x.defined(n)&&x.string(n.uri)&&x.string(n.languageId)&&x.integer(n.version)&&x.string(n.text)}t.is=i})(lr||(lr={}));var fe;(function(t){t.PlainText="plaintext",t.Markdown="markdown"})(fe||(fe={}));(function(t){function r(i){var e=i;return e===t.PlainText||e===t.Markdown}t.is=r})(fe||(fe={}));var Qe;(function(t){function r(i){var e=i;return x.objectLiteral(i)&&fe.is(e.kind)&&x.string(e.value)}t.is=r})(Qe||(Qe={}));var Q;(function(t){t.Text=1,t.Method=2,t.Function=3,t.Constructor=4,t.Field=5,t.Variable=6,t.Class=7,t.Interface=8,t.Module=9,t.Property=10,t.Unit=11,t.Value=12,t.Enum=13,t.Keyword=14,t.Snippet=15,t.Color=16,t.File=17,t.Reference=18,t.Folder=19,t.EnumMember=20,t.Constant=21,t.Struct=22,t.Event=23,t.Operator=24,t.TypeParameter=25})(Q||(Q={}));var z;(function(t){t.PlainText=1,t.Snippet=2})(z||(z={}));var kt;(function(t){t.Deprecated=1})(kt||(kt={}));var hr;(function(t){function r(e,n,a){return{newText:e,insert:n,replace:a}}t.create=r;function i(e){var n=e;return n&&x.string(n.newText)&&U.is(n.insert)&&U.is(n.replace)}t.is=i})(hr||(hr={}));var gr;(function(t){t.asIs=1,t.adjustIndentation=2})(gr||(gr={}));var $e;(function(t){function r(i){return{label:i}}t.create=r})($e||($e={}));var Ot;(function(t){function r(i,e){return{items:i||[],isIncomplete:!!e}}t.create=r})(Ot||(Ot={}));var Re;(function(t){function r(e){return e.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}t.fromPlainText=r;function i(e){var n=e;return x.string(n)||x.objectLiteral(n)&&x.string(n.language)&&x.string(n.value)}t.is=i})(Re||(Re={}));var Ct;(function(t){function r(i){var e=i;return!!e&&x.objectLiteral(e)&&(Qe.is(e.contents)||Re.is(e.contents)||x.typedArray(e.contents,Re.is))&&(i.range===void 0||U.is(i.range))}t.is=r})(Ct||(Ct={}));var dr;(function(t){function r(i,e){return e?{label:i,documentation:e}:{label:i}}t.create=r})(dr||(dr={}));var pr;(function(t){function r(i,e){for(var n=[],a=2;a<arguments.length;a++)n[a-2]=arguments[a];var s={label:i};return x.defined(e)&&(s.documentation=e),x.defined(n)?s.parameters=n:s.parameters=[],s}t.create=r})(pr||(pr={}));var Pt;(function(t){t.Text=1,t.Read=2,t.Write=3})(Pt||(Pt={}));var jt;(function(t){function r(i,e){var n={range:i};return x.number(e)&&(n.kind=e),n}t.create=r})(jt||(jt={}));var oe;(function(t){t.File=1,t.Module=2,t.Namespace=3,t.Package=4,t.Class=5,t.Method=6,t.Property=7,t.Field=8,t.Constructor=9,t.Enum=10,t.Interface=11,t.Function=12,t.Variable=13,t.Constant=14,t.String=15,t.Number=16,t.Boolean=17,t.Array=18,t.Object=19,t.Key=20,t.Null=21,t.EnumMember=22,t.Struct=23,t.Event=24,t.Operator=25,t.TypeParameter=26})(oe||(oe={}));var mr;(function(t){t.Deprecated=1})(mr||(mr={}));var Et;(function(t){function r(i,e,n,a,s){var o={name:i,kind:e,location:{uri:a,range:n}};return s&&(o.containerName=s),o}t.create=r})(Et||(Et={}));var It;(function(t){function r(e,n,a,s,o,f){var l={name:e,detail:n,kind:a,range:s,selectionRange:o};return f!==void 0&&(l.children=f),l}t.create=r;function i(e){var n=e;return n&&x.string(n.name)&&x.number(n.kind)&&U.is(n.range)&&U.is(n.selectionRange)&&(n.detail===void 0||x.string(n.detail))&&(n.deprecated===void 0||x.boolean(n.deprecated))&&(n.children===void 0||Array.isArray(n.children))&&(n.tags===void 0||Array.isArray(n.tags))}t.is=i})(It||(It={}));var Nt;(function(t){t.Empty="",t.QuickFix="quickfix",t.Refactor="refactor",t.RefactorExtract="refactor.extract",t.RefactorInline="refactor.inline",t.RefactorRewrite="refactor.rewrite",t.Source="source",t.SourceOrganizeImports="source.organizeImports",t.SourceFixAll="source.fixAll"})(Nt||(Nt={}));var Mt;(function(t){function r(e,n){var a={diagnostics:e};return n!=null&&(a.only=n),a}t.create=r;function i(e){var n=e;return x.defined(n)&&x.typedArray(n.diagnostics,ae.is)&&(n.only===void 0||x.typedArray(n.only,x.string))}t.is=i})(Mt||(Mt={}));var Ft;(function(t){function r(e,n,a){var s={title:e},o=!0;return typeof n=="string"?(o=!1,s.kind=n):Ee.is(n)?s.command=n:s.edit=n,o&&a!==void 0&&(s.kind=a),s}t.create=r;function i(e){var n=e;return n&&x.string(n.title)&&(n.diagnostics===void 0||x.typedArray(n.diagnostics,ae.is))&&(n.kind===void 0||x.string(n.kind))&&(n.edit!==void 0||n.command!==void 0)&&(n.command===void 0||Ee.is(n.command))&&(n.isPreferred===void 0||x.boolean(n.isPreferred))&&(n.edit===void 0||Xe.is(n.edit))}t.is=i})(Ft||(Ft={}));var vr;(function(t){function r(e,n){var a={range:e};return x.defined(n)&&(a.data=n),a}t.create=r;function i(e){var n=e;return x.defined(n)&&U.is(n.range)&&(x.undefined(n.command)||Ee.is(n.command))}t.is=i})(vr||(vr={}));var yr;(function(t){function r(e,n){return{tabSize:e,insertSpaces:n}}t.create=r;function i(e){var n=e;return x.defined(n)&&x.uinteger(n.tabSize)&&x.boolean(n.insertSpaces)}t.is=i})(yr||(yr={}));var Lt;(function(t){function r(e,n,a){return{range:e,target:n,data:a}}t.create=r;function i(e){var n=e;return x.defined(n)&&U.is(n.range)&&(x.undefined(n.target)||x.string(n.target))}t.is=i})(Lt||(Lt={}));var Ie;(function(t){function r(e,n){return{range:e,parent:n}}t.create=r;function i(e){var n=e;return n!==void 0&&U.is(n.range)&&(n.parent===void 0||t.is(n.parent))}t.is=i})(Ie||(Ie={}));var br;(function(t){function r(a,s,o,f){return new cn(a,s,o,f)}t.create=r;function i(a){var s=a;return!!(x.defined(s)&&x.string(s.uri)&&(x.undefined(s.languageId)||x.string(s.languageId))&&x.uinteger(s.lineCount)&&x.func(s.getText)&&x.func(s.positionAt)&&x.func(s.offsetAt))}t.is=i;function e(a,s){for(var o=a.getText(),f=n(s,function(m,p){var g=m.range.start.line-p.range.start.line;return g===0?m.range.start.character-p.range.start.character:g}),l=o.length,u=f.length-1;u>=0;u--){var c=f[u],h=a.offsetAt(c.range.start),d=a.offsetAt(c.range.end);if(d<=l)o=o.substring(0,h)+c.newText+o.substring(d,o.length);else throw new Error("Overlapping edit");l=h}return o}t.applyEdits=e;function n(a,s){if(a.length<=1)return a;var o=a.length/2|0,f=a.slice(0,o),l=a.slice(o);n(f,s),n(l,s);for(var u=0,c=0,h=0;u<f.length&&c<l.length;){var d=s(f[u],l[c]);d<=0?a[h++]=f[u++]:a[h++]=l[c++]}for(;u<f.length;)a[h++]=f[u++];for(;c<l.length;)a[h++]=l[c++];return a}})(br||(br={}));var cn=function(){function t(r,i,e,n){this._uri=r,this._languageId=i,this._version=e,this._content=n,this._lineOffsets=void 0}return Object.defineProperty(t.prototype,"uri",{get:function(){return this._uri},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"languageId",{get:function(){return this._languageId},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"version",{get:function(){return this._version},enumerable:!1,configurable:!0}),t.prototype.getText=function(r){if(r){var i=this.offsetAt(r.start),e=this.offsetAt(r.end);return this._content.substring(i,e)}return this._content},t.prototype.update=function(r,i){this._content=r.text,this._version=i,this._lineOffsets=void 0},t.prototype.getLineOffsets=function(){if(this._lineOffsets===void 0){for(var r=[],i=this._content,e=!0,n=0;n<i.length;n++){e&&(r.push(n),e=!1);var a=i.charAt(n);e=a==="\r"||a===`
+`,a==="\r"&&n+1<i.length&&i.charAt(n+1)===`
+`&&n++}e&&i.length>0&&r.push(i.length),this._lineOffsets=r}return this._lineOffsets},t.prototype.positionAt=function(r){r=Math.max(Math.min(r,this._content.length),0);var i=this.getLineOffsets(),e=0,n=i.length;if(n===0)return re.create(0,r);for(;e<n;){var a=Math.floor((e+n)/2);i[a]>r?n=a:e=a+1}var s=e-1;return re.create(s,r-i[s])},t.prototype.offsetAt=function(r){var i=this.getLineOffsets();if(r.line>=i.length)return this._content.length;if(r.line<0)return 0;var e=i[r.line],n=r.line+1<i.length?i[r.line+1]:this._content.length;return Math.max(Math.min(e+r.character,n),e)},Object.defineProperty(t.prototype,"lineCount",{get:function(){return this.getLineOffsets().length},enumerable:!1,configurable:!0}),t}(),x;(function(t){var r=Object.prototype.toString;function i(d){return typeof d<"u"}t.defined=i;function e(d){return typeof d>"u"}t.undefined=e;function n(d){return d===!0||d===!1}t.boolean=n;function a(d){return r.call(d)==="[object String]"}t.string=a;function s(d){return r.call(d)==="[object Number]"}t.number=s;function o(d,m,p){return r.call(d)==="[object Number]"&&m<=d&&d<=p}t.numberRange=o;function f(d){return r.call(d)==="[object Number]"&&-2147483648<=d&&d<=2147483647}t.integer=f;function l(d){return r.call(d)==="[object Number]"&&0<=d&&d<=2147483647}t.uinteger=l;function u(d){return r.call(d)==="[object Function]"}t.func=u;function c(d){return d!==null&&typeof d=="object"}t.objectLiteral=c;function h(d,m){return Array.isArray(d)&&d.every(m)}t.typedArray=h})(x||(x={}));var Ye=class t{constructor(r,i,e,n){this._uri=r,this._languageId=i,this._version=e,this._content=n,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(r){if(r){let i=this.offsetAt(r.start),e=this.offsetAt(r.end);return this._content.substring(i,e)}return this._content}update(r,i){for(let e of r)if(t.isIncremental(e)){let n=Sr(e.range),a=this.offsetAt(n.start),s=this.offsetAt(n.end);this._content=this._content.substring(0,a)+e.text+this._content.substring(s,this._content.length);let o=Math.max(n.start.line,0),f=Math.max(n.end.line,0),l=this._lineOffsets,u=xr(e.text,!1,a);if(f-o===u.length)for(let h=0,d=u.length;h<d;h++)l[h+o+1]=u[h];else u.length<1e4?l.splice(o+1,f-o,...u):this._lineOffsets=l=l.slice(0,o+1).concat(u,l.slice(f+1));let c=e.text.length-(s-a);if(c!==0)for(let h=o+1+u.length,d=l.length;h<d;h++)l[h]=l[h]+c}else if(t.isFull(e))this._content=e.text,this._lineOffsets=void 0;else throw new Error("Unknown change event received");this._version=i}getLineOffsets(){return this._lineOffsets===void 0&&(this._lineOffsets=xr(this._content,!0)),this._lineOffsets}positionAt(r){r=Math.max(Math.min(r,this._content.length),0);let i=this.getLineOffsets(),e=0,n=i.length;if(n===0)return{line:0,character:r};for(;e<n;){let s=Math.floor((e+n)/2);i[s]>r?n=s:e=s+1}let a=e-1;return{line:a,character:r-i[a]}}offsetAt(r){let i=this.getLineOffsets();if(r.line>=i.length)return this._content.length;if(r.line<0)return 0;let e=i[r.line],n=r.line+1<i.length?i[r.line+1]:this._content.length;return Math.max(Math.min(e+r.character,n),e)}get lineCount(){return this.getLineOffsets().length}static isIncremental(r){let i=r;return i!=null&&typeof i.text=="string"&&i.range!==void 0&&(i.rangeLength===void 0||typeof i.rangeLength=="number")}static isFull(r){let i=r;return i!=null&&typeof i.text=="string"&&i.range===void 0&&i.rangeLength===void 0}},Ue;(function(t){function r(n,a,s,o){return new Ye(n,a,s,o)}t.create=r;function i(n,a,s){if(n instanceof Ye)return n.update(a,s),n;throw new Error("TextDocument.update: document must be created by TextDocument.create")}t.update=i;function e(n,a){let s=n.getText(),o=Vt(a.map(ln),(u,c)=>{let h=u.range.start.line-c.range.start.line;return h===0?u.range.start.character-c.range.start.character:h}),f=0,l=[];for(let u of o){let c=n.offsetAt(u.range.start);if(c<f)throw new Error("Overlapping edit");c>f&&l.push(s.substring(f,c)),u.newText.length&&l.push(u.newText),f=n.offsetAt(u.range.end)}return l.push(s.substr(f)),l.join("")}t.applyEdits=e})(Ue||(Ue={}));function Vt(t,r){if(t.length<=1)return t;let i=t.length/2|0,e=t.slice(0,i),n=t.slice(i);Vt(e,r),Vt(n,r);let a=0,s=0,o=0;for(;a<e.length&&s<n.length;)r(e[a],n[s])<=0?t[o++]=e[a++]:t[o++]=n[s++];for(;a<e.length;)t[o++]=e[a++];for(;s<n.length;)t[o++]=n[s++];return t}function xr(t,r,i=0){let e=r?[i]:[];for(let n=0;n<t.length;n++){let a=t.charCodeAt(n);(a===13||a===10)&&(a===13&&n+1<t.length&&t.charCodeAt(n+1)===10&&n++,e.push(i+n+1))}return e}function Sr(t){let r=t.start,i=t.end;return r.line>i.line||r.line===i.line&&r.character>i.character?{start:i,end:r}:t}function ln(t){let r=Sr(t.range);return r!==t.range?{newText:t.newText,range:r}:t}var W;(function(t){t[t.Undefined=0]="Undefined",t[t.EnumValueMismatch=1]="EnumValueMismatch",t[t.Deprecated=2]="Deprecated",t[t.UnexpectedEndOfComment=257]="UnexpectedEndOfComment",t[t.UnexpectedEndOfString=258]="UnexpectedEndOfString",t[t.UnexpectedEndOfNumber=259]="UnexpectedEndOfNumber",t[t.InvalidUnicode=260]="InvalidUnicode",t[t.InvalidEscapeCharacter=261]="InvalidEscapeCharacter",t[t.InvalidCharacter=262]="InvalidCharacter",t[t.PropertyExpected=513]="PropertyExpected",t[t.CommaExpected=514]="CommaExpected",t[t.ColonExpected=515]="ColonExpected",t[t.ValueExpected=516]="ValueExpected",t[t.CommaOrCloseBacketExpected=517]="CommaOrCloseBacketExpected",t[t.CommaOrCloseBraceExpected=518]="CommaOrCloseBraceExpected",t[t.TrailingComma=519]="TrailingComma",t[t.DuplicateKey=520]="DuplicateKey",t[t.CommentNotPermitted=521]="CommentNotPermitted",t[t.SchemaResolveError=768]="SchemaResolveError"})(W||(W={}));var Ke;(function(t){t.LATEST={textDocument:{completion:{completionItem:{documentationFormat:[fe.Markdown,fe.PlainText],commitCharactersSupport:!0}}}}})(Ke||(Ke={}));function hn(t,r){let i;return r.length===0?i=t:i=t.replace(/\{(\d+)\}/g,(e,n)=>{let a=n[0];return typeof r[a]<"u"?r[a]:e}),i}function gn(t,r,...i){return hn(r,i)}function he(t){return gn}var we=function(){var t=function(r,i){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,n){e.__proto__=n}||function(e,n){for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])},t(r,i)};return function(r,i){if(typeof i!="function"&&i!==null)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");t(r,i);function e(){this.constructor=r}r.prototype=i===null?Object.create(i):(e.prototype=i.prototype,new e)}}(),M=he(),dn={"color-hex":{errorMessage:M("colorHexFormatWarning","Invalid color format. Use #RGB, #RGBA, #RRGGBB or #RRGGBBAA."),pattern:/^#([0-9A-Fa-f]{3,4}|([0-9A-Fa-f]{2}){3,4})$/},"date-time":{errorMessage:M("dateTimeFormatWarning","String is not a RFC3339 date-time."),pattern:/^(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]|60)(\.[0-9]+)?(Z|(\+|-)([01][0-9]|2[0-3]):([0-5][0-9]))$/i},date:{errorMessage:M("dateFormatWarning","String is not a RFC3339 date."),pattern:/^(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/i},time:{errorMessage:M("timeFormatWarning","String is not a RFC3339 time."),pattern:/^([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]|60)(\.[0-9]+)?(Z|(\+|-)([01][0-9]|2[0-3]):([0-5][0-9]))$/i},email:{errorMessage:M("emailFormatWarning","String is not an e-mail address."),pattern:/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}))$/},hostname:{errorMessage:M("hostnameFormatWarning","String is not a hostname."),pattern:/^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i},ipv4:{errorMessage:M("ipv4FormatWarning","String is not an IPv4 address."),pattern:/^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/},ipv6:{errorMessage:M("ipv6FormatWarning","String is not an IPv6 address."),pattern:/^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i}},Te=function(){function t(r,i,e){e===void 0&&(e=0),this.offset=i,this.length=e,this.parent=r}return Object.defineProperty(t.prototype,"children",{get:function(){return[]},enumerable:!1,configurable:!0}),t.prototype.toString=function(){return"type: "+this.type+" ("+this.offset+"/"+this.length+")"+(this.parent?" parent: {"+this.parent.toString()+"}":"")},t}();var pn=function(t){we(r,t);function r(i,e){var n=t.call(this,i,e)||this;return n.type="null",n.value=null,n}return r}(Te);var Ar=function(t){we(r,t);function r(i,e,n){var a=t.call(this,i,n)||this;return a.type="boolean",a.value=e,a}return r}(Te);var mn=function(t){we(r,t);function r(i,e){var n=t.call(this,i,e)||this;return n.type="array",n.items=[],n}return Object.defineProperty(r.prototype,"children",{get:function(){return this.items},enumerable:!1,configurable:!0}),r}(Te);var vn=function(t){we(r,t);function r(i,e){var n=t.call(this,i,e)||this;return n.type="number",n.isInteger=!0,n.value=Number.NaN,n}return r}(Te);var Dt=function(t){we(r,t);function r(i,e,n){var a=t.call(this,i,e,n)||this;return a.type="string",a.value="",a}return r}(Te);var yn=function(t){we(r,t);function r(i,e,n){var a=t.call(this,i,e)||this;return a.type="property",a.colonOffset=-1,a.keyNode=n,a}return Object.defineProperty(r.prototype,"children",{get:function(){return this.valueNode?[this.keyNode,this.valueNode]:[this.keyNode]},enumerable:!1,configurable:!0}),r}(Te);var bn=function(t){we(r,t);function r(i,e){var n=t.call(this,i,e)||this;return n.type="object",n.properties=[],n}return Object.defineProperty(r.prototype,"children",{get:function(){return this.properties},enumerable:!1,configurable:!0}),r}(Te);function K(t){return ie(t)?t?{}:{not:{}}:t}var wr;(function(t){t[t.Key=0]="Key",t[t.Enum=1]="Enum"})(wr||(wr={}));var xn=function(){function t(r,i){r===void 0&&(r=-1),this.focusOffset=r,this.exclude=i,this.schemas=[]}return t.prototype.add=function(r){this.schemas.push(r)},t.prototype.merge=function(r){Array.prototype.push.apply(this.schemas,r.schemas)},t.prototype.include=function(r){return(this.focusOffset===-1||Rt(r,this.focusOffset))&&r!==this.exclude},t.prototype.newSub=function(){return new t(-1,this.exclude)},t}(),$t=function(){function t(){}return Object.defineProperty(t.prototype,"schemas",{get:function(){return[]},enumerable:!1,configurable:!0}),t.prototype.add=function(r){},t.prototype.merge=function(r){},t.prototype.include=function(r){return!0},t.prototype.newSub=function(){return this},t.instance=new t,t}(),te=function(){function t(){this.problems=[],this.propertiesMatches=0,this.propertiesValueMatches=0,this.primaryValueMatches=0,this.enumValueMatch=!1,this.enumValues=void 0}return t.prototype.hasProblems=function(){return!!this.problems.length},t.prototype.mergeAll=function(r){for(var i=0,e=r;i<e.length;i++){var n=e[i];this.merge(n)}},t.prototype.merge=function(r){this.problems=this.problems.concat(r.problems)},t.prototype.mergeEnumValues=function(r){if(!this.enumValueMatch&&!r.enumValueMatch&&this.enumValues&&r.enumValues){this.enumValues=this.enumValues.concat(r.enumValues);for(var i=0,e=this.problems;i<e.length;i++){var n=e[i];n.code===W.EnumValueMismatch&&(n.message=M("enumWarning","Value is not accepted. Valid values: {0}.",this.enumValues.map(function(a){return JSON.stringify(a)}).join(", ")))}}},t.prototype.mergePropertyMatch=function(r){this.merge(r),this.propertiesMatches++,(r.enumValueMatch||!r.hasProblems()&&r.propertiesMatches)&&this.propertiesValueMatches++,r.enumValueMatch&&r.enumValues&&r.enumValues.length===1&&this.primaryValueMatches++},t.prototype.compare=function(r){var i=this.hasProblems();return i!==r.hasProblems()?i?-1:1:this.enumValueMatch!==r.enumValueMatch?r.enumValueMatch?-1:1:this.primaryValueMatches!==r.primaryValueMatches?this.primaryValueMatches-r.primaryValueMatches:this.propertiesValueMatches!==r.propertiesValueMatches?this.propertiesValueMatches-r.propertiesValueMatches:this.propertiesMatches-r.propertiesMatches},t}();function Tr(t,r){return r===void 0&&(r=[]),new kr(t,r,[])}function de(t){return tr(t)}function Je(t){return er(t)}function Rt(t,r,i){return i===void 0&&(i=!1),r>=t.offset&&r<t.offset+t.length||i&&r===t.offset+t.length}var kr=function(){function t(r,i,e){i===void 0&&(i=[]),e===void 0&&(e=[]),this.root=r,this.syntaxErrors=i,this.comments=e}return t.prototype.getNodeFromOffset=function(r,i){if(i===void 0&&(i=!1),this.root)return Kt(this.root,r,i)},t.prototype.visit=function(r){if(this.root){var i=function(e){var n=r(e),a=e.children;if(Array.isArray(a))for(var s=0;s<a.length&&n;s++)n=i(a[s]);return n};i(this.root)}},t.prototype.validate=function(r,i,e){if(e===void 0&&(e=Z.Warning),this.root&&i){var n=new te;return _(this.root,i,n,$t.instance),n.problems.map(function(a){var s,o=U.create(r.positionAt(a.location.offset),r.positionAt(a.location.offset+a.location.length));return ae.create(o,a.message,(s=a.severity)!==null&&s!==void 0?s:e,a.code)})}},t.prototype.getMatchingSchemas=function(r,i,e){i===void 0&&(i=-1);var n=new xn(i,e);return this.root&&r&&_(this.root,r,new te,n),n.schemas},t}();function _(t,r,i,e){if(!t||!e.include(t))return;var n=t;switch(n.type){case"object":l(n,r,i,e);break;case"array":f(n,r,i,e);break;case"string":o(n,r,i,e);break;case"number":s(n,r,i,e);break;case"property":return _(n.valueNode,r,i,e)}a(),e.add({node:n,schema:r});function a(){function u(L){return n.type===L||L==="integer"&&n.type==="number"&&n.isInteger}if(Array.isArray(r.type)?r.type.some(u)||i.problems.push({location:{offset:n.offset,length:n.length},message:r.errorMessage||M("typeArrayMismatchWarning","Incorrect type. Expected one of {0}.",r.type.join(", "))}):r.type&&(u(r.type)||i.problems.push({location:{offset:n.offset,length:n.length},message:r.errorMessage||M("typeMismatchWarning",'Incorrect type. Expected "{0}".',r.type)})),Array.isArray(r.allOf))for(var c=0,h=r.allOf;c<h.length;c++){var d=h[c];_(n,K(d),i,e)}var m=K(r.not);if(m){var p=new te,g=e.newSub();_(n,m,p,g),p.hasProblems()||i.problems.push({location:{offset:n.offset,length:n.length},message:M("notSchemaWarning","Matches a schema that is not allowed.")});for(var b=0,y=g.schemas;b<y.length;b++){var v=y[b];v.inverted=!v.inverted,e.add(v)}}var O=function(L,R){for(var H=[],q=void 0,T=0,S=L;T<S.length;T++){var k=S[T],j=K(k),V=new te,$=e.newSub();if(_(n,j,V,$),V.hasProblems()||H.push(j),!q)q={schema:j,validationResult:V,matchingSchemas:$};else if(!R&&!V.hasProblems()&&!q.validationResult.hasProblems())q.matchingSchemas.merge($),q.validationResult.propertiesMatches+=V.propertiesMatches,q.validationResult.propertiesValueMatches+=V.propertiesValueMatches;else{var J=V.compare(q.validationResult);J>0?q={schema:j,validationResult:V,matchingSchemas:$}:J===0&&(q.matchingSchemas.merge($),q.validationResult.mergeEnumValues(V))}}return H.length>1&&R&&i.problems.push({location:{offset:n.offset,length:1},message:M("oneOfWarning","Matches multiple schemas when only one must validate.")}),q&&(i.merge(q.validationResult),i.propertiesMatches+=q.validationResult.propertiesMatches,i.propertiesValueMatches+=q.validationResult.propertiesValueMatches,e.merge(q.matchingSchemas)),H.length};Array.isArray(r.anyOf)&&O(r.anyOf,!1),Array.isArray(r.oneOf)&&O(r.oneOf,!0);var E=function(L){var R=new te,H=e.newSub();_(n,K(L),R,H),i.merge(R),i.propertiesMatches+=R.propertiesMatches,i.propertiesValueMatches+=R.propertiesValueMatches,e.merge(H)},I=function(L,R,H){var q=K(L),T=new te,S=e.newSub();_(n,q,T,S),e.merge(S),T.hasProblems()?H&&E(H):R&&E(R)},A=K(r.if);if(A&&I(A,K(r.then),K(r.else)),Array.isArray(r.enum)){for(var P=de(n),w=!1,C=0,F=r.enum;C<F.length;C++){var N=F[C];if(Pe(P,N)){w=!0;break}}i.enumValues=r.enum,i.enumValueMatch=w,w||i.problems.push({location:{offset:n.offset,length:n.length},code:W.EnumValueMismatch,message:r.errorMessage||M("enumWarning","Value is not accepted. Valid values: {0}.",r.enum.map(function(L){return JSON.stringify(L)}).join(", "))})}if(se(r.const)){var P=de(n);Pe(P,r.const)?i.enumValueMatch=!0:(i.problems.push({location:{offset:n.offset,length:n.length},code:W.EnumValueMismatch,message:r.errorMessage||M("constWarning","Value must be {0}.",JSON.stringify(r.const))}),i.enumValueMatch=!1),i.enumValues=[r.const]}r.deprecationMessage&&n.parent&&i.problems.push({location:{offset:n.parent.offset,length:n.parent.length},severity:Z.Warning,message:r.deprecationMessage,code:W.Deprecated})}function s(u,c,h,d){var m=u.value;function p(C){var F,N=/^(-?\d+)(?:\.(\d+))?(?:e([-+]\d+))?$/.exec(C.toString());return N&&{value:Number(N[1]+(N[2]||"")),multiplier:(((F=N[2])===null||F===void 0?void 0:F.length)||0)-(parseInt(N[3])||0)}}if(ee(c.multipleOf)){var g=-1;if(Number.isInteger(c.multipleOf))g=m%c.multipleOf;else{var b=p(c.multipleOf),y=p(m);if(b&&y){var v=Math.pow(10,Math.abs(y.multiplier-b.multiplier));y.multiplier<b.multiplier?y.value*=v:b.value*=v,g=y.value%b.value}}g!==0&&h.problems.push({location:{offset:u.offset,length:u.length},message:M("multipleOfWarning","Value is not divisible by {0}.",c.multipleOf)})}function O(C,F){if(ee(F))return F;if(ie(F)&&F)return C}function E(C,F){if(!ie(F)||!F)return C}var I=O(c.minimum,c.exclusiveMinimum);ee(I)&&m<=I&&h.problems.push({location:{offset:u.offset,length:u.length},message:M("exclusiveMinimumWarning","Value is below the exclusive minimum of {0}.",I)});var A=O(c.maximum,c.exclusiveMaximum);ee(A)&&m>=A&&h.problems.push({location:{offset:u.offset,length:u.length},message:M("exclusiveMaximumWarning","Value is above the exclusive maximum of {0}.",A)});var P=E(c.minimum,c.exclusiveMinimum);ee(P)&&m<P&&h.problems.push({location:{offset:u.offset,length:u.length},message:M("minimumWarning","Value is below the minimum of {0}.",P)});var w=E(c.maximum,c.exclusiveMaximum);ee(w)&&m>w&&h.problems.push({location:{offset:u.offset,length:u.length},message:M("maximumWarning","Value is above the maximum of {0}.",w)})}function o(u,c,h,d){if(ee(c.minLength)&&u.value.length<c.minLength&&h.problems.push({location:{offset:u.offset,length:u.length},message:M("minLengthWarning","String is shorter than the minimum length of {0}.",c.minLength)}),ee(c.maxLength)&&u.value.length>c.maxLength&&h.problems.push({location:{offset:u.offset,length:u.length},message:M("maxLengthWarning","String is longer than the maximum length of {0}.",c.maxLength)}),nr(c.pattern)){var m=xe(c.pattern);m?.test(u.value)||h.problems.push({location:{offset:u.offset,length:u.length},message:c.patternErrorMessage||c.errorMessage||M("patternWarning",'String does not match the pattern of "{0}".',c.pattern)})}if(c.format)switch(c.format){case"uri":case"uri-reference":{var p=void 0;if(!u.value)p=M("uriEmpty","URI expected.");else{var g=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/.exec(u.value);g?!g[2]&&c.format==="uri"&&(p=M("uriSchemeMissing","URI with a scheme is expected.")):p=M("uriMissing","URI is expected.")}p&&h.problems.push({location:{offset:u.offset,length:u.length},message:c.patternErrorMessage||c.errorMessage||M("uriFormatWarning","String is not a URI: {0}",p)})}break;case"color-hex":case"date-time":case"date":case"time":case"email":case"hostname":case"ipv4":case"ipv6":var b=dn[c.format];(!u.value||!b.pattern.exec(u.value))&&h.problems.push({location:{offset:u.offset,length:u.length},message:c.patternErrorMessage||c.errorMessage||b.errorMessage});default:}}function f(u,c,h,d){if(Array.isArray(c.items)){for(var m=c.items,p=0;p<m.length;p++){var g=m[p],b=K(g),y=new te,v=u.items[p];v?(_(v,b,y,d),h.mergePropertyMatch(y)):u.items.length>=m.length&&h.propertiesValueMatches++}if(u.items.length>m.length)if(typeof c.additionalItems=="object")for(var O=m.length;O<u.items.length;O++){var y=new te;_(u.items[O],c.additionalItems,y,d),h.mergePropertyMatch(y)}else c.additionalItems===!1&&h.problems.push({location:{offset:u.offset,length:u.length},message:M("additionalItemsWarning","Array has too many items according to schema. Expected {0} or fewer.",m.length)})}else{var E=K(c.items);if(E)for(var I=0,A=u.items;I<A.length;I++){var v=A[I],y=new te;_(v,E,y,d),h.mergePropertyMatch(y)}}var P=K(c.contains);if(P){var w=u.items.some(function(N){var L=new te;return _(N,P,L,$t.instance),!L.hasProblems()});w||h.problems.push({location:{offset:u.offset,length:u.length},message:c.errorMessage||M("requiredItemMissingWarning","Array does not contain required item.")})}if(ee(c.minItems)&&u.items.length<c.minItems&&h.problems.push({location:{offset:u.offset,length:u.length},message:M("minItemsWarning","Array has too few items. Expected {0} or more.",c.minItems)}),ee(c.maxItems)&&u.items.length>c.maxItems&&h.problems.push({location:{offset:u.offset,length:u.length},message:M("maxItemsWarning","Array has too many items. Expected {0} or fewer.",c.maxItems)}),c.uniqueItems===!0){var C=de(u),F=C.some(function(N,L){return L!==C.lastIndexOf(N)});F&&h.problems.push({location:{offset:u.offset,length:u.length},message:M("uniqueItemsWarning","Array has duplicate items.")})}}function l(u,c,h,d){for(var m=Object.create(null),p=[],g=0,b=u.properties;g<b.length;g++){var y=b[g],v=y.keyNode.value;m[v]=y.valueNode,p.push(v)}if(Array.isArray(c.required))for(var O=0,E=c.required;O<E.length;O++){var I=E[O];if(!m[I]){var A=u.parent&&u.parent.type==="property"&&u.parent.keyNode,P=A?{offset:A.offset,length:A.length}:{offset:u.offset,length:1};h.problems.push({location:P,message:M("MissingRequiredPropWarning",'Missing property "{0}".',I)})}}var w=function(Xt){for(var lt=p.indexOf(Xt);lt>=0;)p.splice(lt,1),lt=p.indexOf(Xt)};if(c.properties)for(var C=0,F=Object.keys(c.properties);C<F.length;C++){var I=F[C];w(I);var N=c.properties[I],L=m[I];if(L)if(ie(N))if(N)h.propertiesMatches++,h.propertiesValueMatches++;else{var y=L.parent;h.problems.push({location:{offset:y.keyNode.offset,length:y.keyNode.length},message:c.errorMessage||M("DisallowedExtraPropWarning","Property {0} is not allowed.",I)})}else{var R=new te;_(L,N,R,d),h.mergePropertyMatch(R)}}if(c.patternProperties)for(var H=0,q=Object.keys(c.patternProperties);H<q.length;H++)for(var T=q[H],S=xe(T),k=0,j=p.slice(0);k<j.length;k++){var I=j[k];if(S?.test(I)){w(I);var L=m[I];if(L){var N=c.patternProperties[T];if(ie(N))if(N)h.propertiesMatches++,h.propertiesValueMatches++;else{var y=L.parent;h.problems.push({location:{offset:y.keyNode.offset,length:y.keyNode.length},message:c.errorMessage||M("DisallowedExtraPropWarning","Property {0} is not allowed.",I)})}else{var R=new te;_(L,N,R,d),h.mergePropertyMatch(R)}}}}if(typeof c.additionalProperties=="object")for(var V=0,$=p;V<$.length;V++){var I=$[V],L=m[I];if(L){var R=new te;_(L,c.additionalProperties,R,d),h.mergePropertyMatch(R)}}else if(c.additionalProperties===!1&&p.length>0)for(var J=0,ue=p;J<ue.length;J++){var I=ue[J],L=m[I];if(L){var y=L.parent;h.problems.push({location:{offset:y.keyNode.offset,length:y.keyNode.length},message:c.errorMessage||M("DisallowedExtraPropWarning","Property {0} is not allowed.",I)})}}if(ee(c.maxProperties)&&u.properties.length>c.maxProperties&&h.problems.push({location:{offset:u.offset,length:u.length},message:M("MaxPropWarning","Object has more properties than limit of {0}.",c.maxProperties)}),ee(c.minProperties)&&u.properties.length<c.minProperties&&h.problems.push({location:{offset:u.offset,length:u.length},message:M("MinPropWarning","Object has fewer properties than the required number of {0}",c.minProperties)}),c.dependencies)for(var G=0,ne=Object.keys(c.dependencies);G<ne.length;G++){var v=ne[G],ke=m[v];if(ke){var ce=c.dependencies[v];if(Array.isArray(ce))for(var ut=0,Bt=ce;ut<Bt.length;ut++){var _t=Bt[ut];m[_t]?h.propertiesValueMatches++:h.problems.push({location:{offset:u.offset,length:u.length},message:M("RequiredDependentPropWarning","Object is missing property {0} required by property {1}.",_t,v)})}else{var N=K(ce);if(N){var R=new te;_(u,N,R,d),h.mergePropertyMatch(R)}}}}var Ht=K(c.propertyNames);if(Ht)for(var ct=0,Gt=u.properties;ct<Gt.length;ct++){var _r=Gt[ct],v=_r.keyNode;v&&_(v,Ht,h,$t.instance)}}}function Or(t,r){var i=[],e=-1,n=t.getText(),a=le(n,!1),s=r&&r.collectComments?[]:void 0;function o(){for(;;){var A=a.scan();switch(c(),A){case 12:case 13:Array.isArray(s)&&s.push(U.create(t.positionAt(a.getTokenOffset()),t.positionAt(a.getTokenOffset()+a.getTokenLength())));break;case 15:case 14:break;default:return A}}}function f(A){return a.getToken()===A?(o(),!0):!1}function l(A,P,w,C,F){if(F===void 0&&(F=Z.Error),i.length===0||w!==e){var N=U.create(t.positionAt(w),t.positionAt(C));i.push(ae.create(N,A,F,P,t.languageId)),e=w}}function u(A,P,w,C,F){w===void 0&&(w=void 0),C===void 0&&(C=[]),F===void 0&&(F=[]);var N=a.getTokenOffset(),L=a.getTokenOffset()+a.getTokenLength();if(N===L&&N>0){for(N--;N>0&&/\s/.test(n.charAt(N));)N--;L=N+1}if(l(A,P,N,L),w&&h(w,!1),C.length+F.length>0)for(var R=a.getToken();R!==17;){if(C.indexOf(R)!==-1){o();break}else if(F.indexOf(R)!==-1)break;R=o()}return w}function c(){switch(a.getTokenError()){case 4:return u(M("InvalidUnicode","Invalid unicode sequence in string."),W.InvalidUnicode),!0;case 5:return u(M("InvalidEscapeCharacter","Invalid escape character in string."),W.InvalidEscapeCharacter),!0;case 3:return u(M("UnexpectedEndOfNumber","Unexpected end of number."),W.UnexpectedEndOfNumber),!0;case 1:return u(M("UnexpectedEndOfComment","Unexpected end of comment."),W.UnexpectedEndOfComment),!0;case 2:return u(M("UnexpectedEndOfString","Unexpected end of string."),W.UnexpectedEndOfString),!0;case 6:return u(M("InvalidCharacter","Invalid characters in string. Control characters must be escaped."),W.InvalidCharacter),!0}return!1}function h(A,P){return A.length=a.getTokenOffset()+a.getTokenLength()-A.offset,P&&o(),A}function d(A){if(a.getToken()===3){var P=new mn(A,a.getTokenOffset());o();for(var w=0,C=!1;a.getToken()!==4&&a.getToken()!==17;){if(a.getToken()===5){C||u(M("ValueExpected","Value expected"),W.ValueExpected);var F=a.getTokenOffset();if(o(),a.getToken()===4){C&&l(M("TrailingComma","Trailing comma"),W.TrailingComma,F,F+1);continue}}else C&&u(M("ExpectedComma","Expected comma"),W.CommaExpected);var N=O(P);N?P.items.push(N):u(M("PropertyExpected","Value expected"),W.ValueExpected,void 0,[],[4,5]),C=!0}return a.getToken()!==4?u(M("ExpectedCloseBracket","Expected comma or closing bracket"),W.CommaOrCloseBacketExpected,P):h(P,!0)}}var m=new Dt(void 0,0,0);function p(A,P){var w=new yn(A,a.getTokenOffset(),m),C=b(w);if(!C)if(a.getToken()===16){u(M("DoubleQuotesExpected","Property keys must be doublequoted"),W.Undefined);var F=new Dt(w,a.getTokenOffset(),a.getTokenLength());F.value=a.getTokenValue(),C=F,o()}else return;w.keyNode=C;var N=P[C.value];if(N?(l(M("DuplicateKeyWarning","Duplicate object key"),W.DuplicateKey,w.keyNode.offset,w.keyNode.offset+w.keyNode.length,Z.Warning),typeof N=="object"&&l(M("DuplicateKeyWarning","Duplicate object key"),W.DuplicateKey,N.keyNode.offset,N.keyNode.offset+N.keyNode.length,Z.Warning),P[C.value]=!0):P[C.value]=w,a.getToken()===6)w.colonOffset=a.getTokenOffset(),o();else if(u(M("ColonExpected","Colon expected"),W.ColonExpected),a.getToken()===10&&t.positionAt(C.offset+C.length).line<t.positionAt(a.getTokenOffset()).line)return w.length=C.length,w;var L=O(w);return L?(w.valueNode=L,w.length=L.offset+L.length-w.offset,w):u(M("ValueExpected","Value expected"),W.ValueExpected,w,[],[2,5])}function g(A){if(a.getToken()===1){var P=new bn(A,a.getTokenOffset()),w=Object.create(null);o();for(var C=!1;a.getToken()!==2&&a.getToken()!==17;){if(a.getToken()===5){C||u(M("PropertyExpected","Property expected"),W.PropertyExpected);var F=a.getTokenOffset();if(o(),a.getToken()===2){C&&l(M("TrailingComma","Trailing comma"),W.TrailingComma,F,F+1);continue}}else C&&u(M("ExpectedComma","Expected comma"),W.CommaExpected);var N=p(P,w);N?P.properties.push(N):u(M("PropertyExpected","Property expected"),W.PropertyExpected,void 0,[],[2,5]),C=!0}return a.getToken()!==2?u(M("ExpectedCloseBrace","Expected comma or closing brace"),W.CommaOrCloseBraceExpected,P):h(P,!0)}}function b(A){if(a.getToken()===10){var P=new Dt(A,a.getTokenOffset());return P.value=a.getTokenValue(),h(P,!0)}}function y(A){if(a.getToken()===11){var P=new vn(A,a.getTokenOffset());if(a.getTokenError()===0){var w=a.getTokenValue();try{var C=JSON.parse(w);if(!ee(C))return u(M("InvalidNumberFormat","Invalid number format."),W.Undefined,P);P.value=C}catch{return u(M("InvalidNumberFormat","Invalid number format."),W.Undefined,P)}P.isInteger=w.indexOf(".")===-1}return h(P,!0)}}function v(A){var P;switch(a.getToken()){case 7:return h(new pn(A,a.getTokenOffset()),!0);case 8:return h(new Ar(A,!0,a.getTokenOffset()),!0);case 9:return h(new Ar(A,!1,a.getTokenOffset()),!0);default:return}}function O(A){return d(A)||g(A)||b(A)||y(A)||v(A)}var E=void 0,I=o();return I!==17&&(E=O(E),E?a.getToken()!==17&&u(M("End of file expected","End of file expected."),W.Undefined):u(M("Invalid symbol","Expected a JSON object, array or literal."),W.Undefined)),new kr(E,i,s)}function tt(t,r,i){if(t!==null&&typeof t=="object"){var e=r+"	";if(Array.isArray(t)){if(t.length===0)return"[]";for(var n=`[
+`,a=0;a<t.length;a++)n+=e+tt(t[a],e,i),a<t.length-1&&(n+=","),n+=`
+`;return n+=r+"]",n}else{var s=Object.keys(t);if(s.length===0)return"{}";for(var n=`{
+`,a=0;a<s.length;a++){var o=s[a];n+=e+JSON.stringify(o)+": "+tt(t[o],e,i),a<s.length-1&&(n+=","),n+=`
+`}return n+=r+"}",n}}return i(t)}var Ut=he(),Sn=[",","}","]"],An=[":"],Cr=function(){function t(r,i,e,n){i===void 0&&(i=[]),e===void 0&&(e=Promise),n===void 0&&(n={}),this.schemaService=r,this.contributions=i,this.promiseConstructor=e,this.clientCapabilities=n}return t.prototype.doResolve=function(r){for(var i=this.contributions.length-1;i>=0;i--){var e=this.contributions[i].resolveCompletion;if(e){var n=e(r);if(n)return n}}return this.promiseConstructor.resolve(r)},t.prototype.doComplete=function(r,i,e){var n=this,a={items:[],isIncomplete:!1},s=r.getText(),o=r.offsetAt(i),f=e.getNodeFromOffset(o,!0);if(this.isInComment(r,f?f.offset:0,o))return Promise.resolve(a);if(f&&o===f.offset+f.length&&o>0){var l=s[o-1];(f.type==="object"&&l==="}"||f.type==="array"&&l==="]")&&(f=f.parent)}var u=this.getCurrentWord(r,o),c;if(f&&(f.type==="string"||f.type==="number"||f.type==="boolean"||f.type==="null"))c=U.create(r.positionAt(f.offset),r.positionAt(f.offset+f.length));else{var h=o-u.length;h>0&&s[h-1]==='"'&&h--,c=U.create(r.positionAt(h),i)}var d=!1,m={},p={add:function(g){var b=g.label,y=m[b];if(y)y.documentation||(y.documentation=g.documentation),y.detail||(y.detail=g.detail);else{if(b=b.replace(/[\n]/g,"\u21B5"),b.length>60){var v=b.substr(0,57).trim()+"...";m[v]||(b=v)}c&&g.insertText!==void 0&&(g.textEdit=Y.replace(c,g.insertText)),d&&(g.commitCharacters=g.kind===Q.Property?An:Sn),g.label=b,m[b]=g,a.items.push(g)}},setAsIncomplete:function(){a.isIncomplete=!0},error:function(g){console.error(g)},log:function(g){console.log(g)},getNumberOfProposals:function(){return a.items.length}};return this.schemaService.getSchemaForResource(r.uri,e).then(function(g){var b=[],y=!0,v="",O=void 0;if(f&&f.type==="string"){var E=f.parent;E&&E.type==="property"&&E.keyNode===f&&(y=!E.valueNode,O=E,v=s.substr(f.offset+1,f.length-2),E&&(f=E.parent))}if(f&&f.type==="object"){if(f.offset===o)return a;var I=f.properties;I.forEach(function(C){(!O||O!==C)&&(m[C.keyNode.value]=$e.create("__"))});var A="";y&&(A=n.evaluateSeparatorAfter(r,r.offsetAt(c.end))),g?n.getPropertyCompletions(g,e,f,y,A,p):n.getSchemaLessPropertyCompletions(e,f,v,p);var P=Je(f);n.contributions.forEach(function(C){var F=C.collectPropertyCompletions(r.uri,P,u,y,A==="",p);F&&b.push(F)}),!g&&u.length>0&&s.charAt(o-u.length-1)!=='"'&&(p.add({kind:Q.Property,label:n.getLabelForValue(u),insertText:n.getInsertTextForProperty(u,void 0,!1,A),insertTextFormat:z.Snippet,documentation:""}),p.setAsIncomplete())}var w={};return g?n.getValueCompletions(g,e,f,o,r,p,w):n.getSchemaLessValueCompletions(e,f,o,r,p),n.contributions.length>0&&n.getContributedValueCompletions(e,f,o,r,p,b),n.promiseConstructor.all(b).then(function(){if(p.getNumberOfProposals()===0){var C=o;f&&(f.type==="string"||f.type==="number"||f.type==="boolean"||f.type==="null")&&(C=f.offset+f.length);var F=n.evaluateSeparatorAfter(r,C);n.addFillerValueCompletions(w,F,p)}return a})})},t.prototype.getPropertyCompletions=function(r,i,e,n,a,s){var o=this,f=i.getMatchingSchemas(r.schema,e.offset);f.forEach(function(l){if(l.node===e&&!l.inverted){var u=l.schema.properties;u&&Object.keys(u).forEach(function(p){var g=u[p];if(typeof g=="object"&&!g.deprecationMessage&&!g.doNotSuggest){var b={kind:Q.Property,label:p,insertText:o.getInsertTextForProperty(p,g,n,a),insertTextFormat:z.Snippet,filterText:o.getFilterTextForValue(p),documentation:o.fromMarkup(g.markdownDescription)||g.description||""};g.suggestSortText!==void 0&&(b.sortText=g.suggestSortText),b.insertText&&pe(b.insertText,"$1".concat(a))&&(b.command={title:"Suggest",command:"editor.action.triggerSuggest"}),s.add(b)}});var c=l.schema.propertyNames;if(typeof c=="object"&&!c.deprecationMessage&&!c.doNotSuggest){var h=function(p,g){g===void 0&&(g=void 0);var b={kind:Q.Property,label:p,insertText:o.getInsertTextForProperty(p,void 0,n,a),insertTextFormat:z.Snippet,filterText:o.getFilterTextForValue(p),documentation:g||o.fromMarkup(c.markdownDescription)||c.description||""};c.suggestSortText!==void 0&&(b.sortText=c.suggestSortText),b.insertText&&pe(b.insertText,"$1".concat(a))&&(b.command={title:"Suggest",command:"editor.action.triggerSuggest"}),s.add(b)};if(c.enum)for(var d=0;d<c.enum.length;d++){var m=void 0;c.markdownEnumDescriptions&&d<c.markdownEnumDescriptions.length?m=o.fromMarkup(c.markdownEnumDescriptions[d]):c.enumDescriptions&&d<c.enumDescriptions.length&&(m=c.enumDescriptions[d]),h(c.enum[d],m)}c.const&&h(c.const)}}})},t.prototype.getSchemaLessPropertyCompletions=function(r,i,e,n){var a=this,s=function(f){f.properties.forEach(function(l){var u=l.keyNode.value;n.add({kind:Q.Property,label:u,insertText:a.getInsertTextForValue(u,""),insertTextFormat:z.Snippet,filterText:a.getFilterTextForValue(u),documentation:""})})};if(i.parent)if(i.parent.type==="property"){var o=i.parent.keyNode.value;r.visit(function(f){return f.type==="property"&&f!==i.parent&&f.keyNode.value===o&&f.valueNode&&f.valueNode.type==="object"&&s(f.valueNode),!0})}else i.parent.type==="array"&&i.parent.items.forEach(function(f){f.type==="object"&&f!==i&&s(f)});else i.type==="object"&&n.add({kind:Q.Property,label:"$schema",insertText:this.getInsertTextForProperty("$schema",void 0,!0,""),insertTextFormat:z.Snippet,documentation:"",filterText:this.getFilterTextForValue("$schema")})},t.prototype.getSchemaLessValueCompletions=function(r,i,e,n,a){var s=this,o=e;if(i&&(i.type==="string"||i.type==="number"||i.type==="boolean"||i.type==="null")&&(o=i.offset+i.length,i=i.parent),!i){a.add({kind:this.getSuggestionKind("object"),label:"Empty object",insertText:this.getInsertTextForValue({},""),insertTextFormat:z.Snippet,documentation:""}),a.add({kind:this.getSuggestionKind("array"),label:"Empty array",insertText:this.getInsertTextForValue([],""),insertTextFormat:z.Snippet,documentation:""});return}var f=this.evaluateSeparatorAfter(n,o),l=function(d){d.parent&&!Rt(d.parent,e,!0)&&a.add({kind:s.getSuggestionKind(d.type),label:s.getLabelTextForMatchingNode(d,n),insertText:s.getInsertTextForMatchingNode(d,n,f),insertTextFormat:z.Snippet,documentation:""}),d.type==="boolean"&&s.addBooleanValueCompletion(!d.value,f,a)};if(i.type==="property"&&e>(i.colonOffset||0)){var u=i.valueNode;if(u&&(e>u.offset+u.length||u.type==="object"||u.type==="array"))return;var c=i.keyNode.value;r.visit(function(d){return d.type==="property"&&d.keyNode.value===c&&d.valueNode&&l(d.valueNode),!0}),c==="$schema"&&i.parent&&!i.parent.parent&&this.addDollarSchemaCompletions(f,a)}if(i.type==="array")if(i.parent&&i.parent.type==="property"){var h=i.parent.keyNode.value;r.visit(function(d){return d.type==="property"&&d.keyNode.value===h&&d.valueNode&&d.valueNode.type==="array"&&d.valueNode.items.forEach(l),!0})}else i.items.forEach(l)},t.prototype.getValueCompletions=function(r,i,e,n,a,s,o){var f=n,l=void 0,u=void 0;if(e&&(e.type==="string"||e.type==="number"||e.type==="boolean"||e.type==="null")&&(f=e.offset+e.length,u=e,e=e.parent),!e){this.addSchemaValueCompletions(r.schema,"",s,o);return}if(e.type==="property"&&n>(e.colonOffset||0)){var c=e.valueNode;if(c&&n>c.offset+c.length)return;l=e.keyNode.value,e=e.parent}if(e&&(l!==void 0||e.type==="array")){for(var h=this.evaluateSeparatorAfter(a,f),d=i.getMatchingSchemas(r.schema,e.offset,u),m=0,p=d;m<p.length;m++){var g=p[m];if(g.node===e&&!g.inverted&&g.schema){if(e.type==="array"&&g.schema.items)if(Array.isArray(g.schema.items)){var b=this.findItemAtOffset(e,a,n);b<g.schema.items.length&&this.addSchemaValueCompletions(g.schema.items[b],h,s,o)}else this.addSchemaValueCompletions(g.schema.items,h,s,o);if(l!==void 0){var y=!1;if(g.schema.properties){var v=g.schema.properties[l];v&&(y=!0,this.addSchemaValueCompletions(v,h,s,o))}if(g.schema.patternProperties&&!y)for(var O=0,E=Object.keys(g.schema.patternProperties);O<E.length;O++){var I=E[O],A=xe(I);if(A?.test(l)){y=!0;var v=g.schema.patternProperties[I];this.addSchemaValueCompletions(v,h,s,o)}}if(g.schema.additionalProperties&&!y){var v=g.schema.additionalProperties;this.addSchemaValueCompletions(v,h,s,o)}}}}l==="$schema"&&!e.parent&&this.addDollarSchemaCompletions(h,s),o.boolean&&(this.addBooleanValueCompletion(!0,h,s),this.addBooleanValueCompletion(!1,h,s)),o.null&&this.addNullValueCompletion(h,s)}},t.prototype.getContributedValueCompletions=function(r,i,e,n,a,s){if(!i)this.contributions.forEach(function(u){var c=u.collectDefaultCompletions(n.uri,a);c&&s.push(c)});else if((i.type==="string"||i.type==="number"||i.type==="boolean"||i.type==="null")&&(i=i.parent),i&&i.type==="property"&&e>(i.colonOffset||0)){var o=i.keyNode.value,f=i.valueNode;if((!f||e<=f.offset+f.length)&&i.parent){var l=Je(i.parent);this.contributions.forEach(function(u){var c=u.collectValueCompletions(n.uri,l,o,a);c&&s.push(c)})}}},t.prototype.addSchemaValueCompletions=function(r,i,e,n){var a=this;typeof r=="object"&&(this.addEnumValueCompletions(r,i,e),this.addDefaultValueCompletions(r,i,e),this.collectTypes(r,n),Array.isArray(r.allOf)&&r.allOf.forEach(function(s){return a.addSchemaValueCompletions(s,i,e,n)}),Array.isArray(r.anyOf)&&r.anyOf.forEach(function(s){return a.addSchemaValueCompletions(s,i,e,n)}),Array.isArray(r.oneOf)&&r.oneOf.forEach(function(s){return a.addSchemaValueCompletions(s,i,e,n)}))},t.prototype.addDefaultValueCompletions=function(r,i,e,n){var a=this;n===void 0&&(n=0);var s=!1;if(se(r.default)){for(var o=r.type,f=r.default,l=n;l>0;l--)f=[f],o="array";e.add({kind:this.getSuggestionKind(o),label:this.getLabelForValue(f),insertText:this.getInsertTextForValue(f,i),insertTextFormat:z.Snippet,detail:Ut("json.suggest.default","Default value")}),s=!0}Array.isArray(r.examples)&&r.examples.forEach(function(u){for(var c=r.type,h=u,d=n;d>0;d--)h=[h],c="array";e.add({kind:a.getSuggestionKind(c),label:a.getLabelForValue(h),insertText:a.getInsertTextForValue(h,i),insertTextFormat:z.Snippet}),s=!0}),Array.isArray(r.defaultSnippets)&&r.defaultSnippets.forEach(function(u){var c=r.type,h=u.body,d=u.label,m,p;if(se(h)){for(var g=r.type,b=n;b>0;b--)h=[h],g="array";m=a.getInsertTextForSnippetValue(h,i),p=a.getFilterTextForSnippetValue(h),d=d||a.getLabelForSnippetValue(h)}else if(typeof u.bodyText=="string"){for(var y="",v="",O="",b=n;b>0;b--)y=y+O+`[
+`,v=v+`
+`+O+"]",O+="	",c="array";m=y+O+u.bodyText.split(`
+`).join(`
+`+O)+v+i,d=d||m,p=m.replace(/[\n]/g,"")}else return;e.add({kind:a.getSuggestionKind(c),label:d,documentation:a.fromMarkup(u.markdownDescription)||u.description,insertText:m,insertTextFormat:z.Snippet,filterText:p}),s=!0}),!s&&typeof r.items=="object"&&!Array.isArray(r.items)&&n<5&&this.addDefaultValueCompletions(r.items,i,e,n+1)},t.prototype.addEnumValueCompletions=function(r,i,e){if(se(r.const)&&e.add({kind:this.getSuggestionKind(r.type),label:this.getLabelForValue(r.const),insertText:this.getInsertTextForValue(r.const,i),insertTextFormat:z.Snippet,documentation:this.fromMarkup(r.markdownDescription)||r.description}),Array.isArray(r.enum))for(var n=0,a=r.enum.length;n<a;n++){var s=r.enum[n],o=this.fromMarkup(r.markdownDescription)||r.description;r.markdownEnumDescriptions&&n<r.markdownEnumDescriptions.length&&this.doesSupportMarkdown()?o=this.fromMarkup(r.markdownEnumDescriptions[n]):r.enumDescriptions&&n<r.enumDescriptions.length&&(o=r.enumDescriptions[n]),e.add({kind:this.getSuggestionKind(r.type),label:this.getLabelForValue(s),insertText:this.getInsertTextForValue(s,i),insertTextFormat:z.Snippet,documentation:o})}},t.prototype.collectTypes=function(r,i){if(!(Array.isArray(r.enum)||se(r.const))){var e=r.type;Array.isArray(e)?e.forEach(function(n){return i[n]=!0}):e&&(i[e]=!0)}},t.prototype.addFillerValueCompletions=function(r,i,e){r.object&&e.add({kind:this.getSuggestionKind("object"),label:"{}",insertText:this.getInsertTextForGuessedValue({},i),insertTextFormat:z.Snippet,detail:Ut("defaults.object","New object"),documentation:""}),r.array&&e.add({kind:this.getSuggestionKind("array"),label:"[]",insertText:this.getInsertTextForGuessedValue([],i),insertTextFormat:z.Snippet,detail:Ut("defaults.array","New array"),documentation:""})},t.prototype.addBooleanValueCompletion=function(r,i,e){e.add({kind:this.getSuggestionKind("boolean"),label:r?"true":"false",insertText:this.getInsertTextForValue(r,i),insertTextFormat:z.Snippet,documentation:""})},t.prototype.addNullValueCompletion=function(r,i){i.add({kind:this.getSuggestionKind("null"),label:"null",insertText:"null"+r,insertTextFormat:z.Snippet,documentation:""})},t.prototype.addDollarSchemaCompletions=function(r,i){var e=this,n=this.schemaService.getRegisteredSchemaIds(function(a){return a==="http"||a==="https"});n.forEach(function(a){return i.add({kind:Q.Module,label:e.getLabelForValue(a),filterText:e.getFilterTextForValue(a),insertText:e.getInsertTextForValue(a,r),insertTextFormat:z.Snippet,documentation:""})})},t.prototype.getLabelForValue=function(r){return JSON.stringify(r)},t.prototype.getFilterTextForValue=function(r){return JSON.stringify(r)},t.prototype.getFilterTextForSnippetValue=function(r){return JSON.stringify(r).replace(/\$\{\d+:([^}]+)\}|\$\d+/g,"$1")},t.prototype.getLabelForSnippetValue=function(r){var i=JSON.stringify(r);return i.replace(/\$\{\d+:([^}]+)\}|\$\d+/g,"$1")},t.prototype.getInsertTextForPlainText=function(r){return r.replace(/[\\\$\}]/g,"\\$&")},t.prototype.getInsertTextForValue=function(r,i){var e=JSON.stringify(r,null,"	");return e==="{}"?"{$1}"+i:e==="[]"?"[$1]"+i:this.getInsertTextForPlainText(e+i)},t.prototype.getInsertTextForSnippetValue=function(r,i){var e=function(n){return typeof n=="string"&&n[0]==="^"?n.substr(1):JSON.stringify(n)};return tt(r,"",e)+i},t.prototype.getInsertTextForGuessedValue=function(r,i){switch(typeof r){case"object":return r===null?"${1:null}"+i:this.getInsertTextForValue(r,i);case"string":var e=JSON.stringify(r);return e=e.substr(1,e.length-2),e=this.getInsertTextForPlainText(e),'"${1:'+e+'}"'+i;case"number":case"boolean":return"${1:"+JSON.stringify(r)+"}"+i}return this.getInsertTextForValue(r,i)},t.prototype.getSuggestionKind=function(r){if(Array.isArray(r)){var i=r;r=i.length>0?i[0]:void 0}if(!r)return Q.Value;switch(r){case"string":return Q.Value;case"object":return Q.Module;case"property":return Q.Property;default:return Q.Value}},t.prototype.getLabelTextForMatchingNode=function(r,i){switch(r.type){case"array":return"[]";case"object":return"{}";default:var e=i.getText().substr(r.offset,r.length);return e}},t.prototype.getInsertTextForMatchingNode=function(r,i,e){switch(r.type){case"array":return this.getInsertTextForValue([],e);case"object":return this.getInsertTextForValue({},e);default:var n=i.getText().substr(r.offset,r.length)+e;return this.getInsertTextForPlainText(n)}},t.prototype.getInsertTextForProperty=function(r,i,e,n){var a=this.getInsertTextForValue(r,"");if(!e)return a;var s=a+": ",o,f=0;if(i){if(Array.isArray(i.defaultSnippets)){if(i.defaultSnippets.length===1){var l=i.defaultSnippets[0].body;se(l)&&(o=this.getInsertTextForSnippetValue(l,""))}f+=i.defaultSnippets.length}if(i.enum&&(!o&&i.enum.length===1&&(o=this.getInsertTextForGuessedValue(i.enum[0],"")),f+=i.enum.length),se(i.default)&&(o||(o=this.getInsertTextForGuessedValue(i.default,"")),f++),Array.isArray(i.examples)&&i.examples.length&&(o||(o=this.getInsertTextForGuessedValue(i.examples[0],"")),f+=i.examples.length),f===0){var u=Array.isArray(i.type)?i.type[0]:i.type;switch(u||(i.properties?u="object":i.items&&(u="array")),u){case"boolean":o="$1";break;case"string":o='"$1"';break;case"object":o="{$1}";break;case"array":o="[$1]";break;case"number":case"integer":o="${1:0}";break;case"null":o="${1:null}";break;default:return a}}}return(!o||f>1)&&(o="$1"),s+o+n},t.prototype.getCurrentWord=function(r,i){for(var e=i-1,n=r.getText();e>=0&&` 	
+\r\v":{[,]}`.indexOf(n.charAt(e))===-1;)e--;return n.substring(e+1,i)},t.prototype.evaluateSeparatorAfter=function(r,i){var e=le(r.getText(),!0);e.setPosition(i);var n=e.scan();switch(n){case 5:case 2:case 4:case 17:return"";default:return","}},t.prototype.findItemAtOffset=function(r,i,e){for(var n=le(i.getText(),!0),a=r.items,s=a.length-1;s>=0;s--){var o=a[s];if(e>o.offset+o.length){n.setPosition(o.offset+o.length);var f=n.scan();return f===5&&e>=n.getTokenOffset()+n.getTokenLength()?s+1:s}else if(e>=o.offset)return s}return 0},t.prototype.isInComment=function(r,i,e){var n=le(r.getText(),!1);n.setPosition(i);for(var a=n.scan();a!==17&&n.getTokenOffset()+n.getTokenLength()<e;)a=n.scan();return(a===12||a===13)&&n.getTokenOffset()<=e},t.prototype.fromMarkup=function(r){if(r&&this.doesSupportMarkdown())return{kind:fe.Markdown,value:r}},t.prototype.doesSupportMarkdown=function(){if(!se(this.supportsMarkdown)){var r=this.clientCapabilities.textDocument&&this.clientCapabilities.textDocument.completion;this.supportsMarkdown=r&&r.completionItem&&Array.isArray(r.completionItem.documentationFormat)&&r.completionItem.documentationFormat.indexOf(fe.Markdown)!==-1}return this.supportsMarkdown},t.prototype.doesSupportsCommitCharacters=function(){if(!se(this.supportsCommitCharacters)){var r=this.clientCapabilities.textDocument&&this.clientCapabilities.textDocument.completion;this.supportsCommitCharacters=r&&r.completionItem&&!!r.completionItem.commitCharactersSupport}return this.supportsCommitCharacters},t}();var Pr=function(){function t(r,i,e){i===void 0&&(i=[]),this.schemaService=r,this.contributions=i,this.promise=e||Promise}return t.prototype.doHover=function(r,i,e){var n=r.offsetAt(i),a=e.getNodeFromOffset(n);if(!a||(a.type==="object"||a.type==="array")&&n>a.offset+1&&n<a.offset+a.length-1)return this.promise.resolve(null);var s=a;if(a.type==="string"){var o=a.parent;if(o&&o.type==="property"&&o.keyNode===a&&(a=o.valueNode,!a))return this.promise.resolve(null)}for(var f=U.create(r.positionAt(s.offset),r.positionAt(s.offset+s.length)),l=function(m){var p={contents:m,range:f};return p},u=Je(a),c=this.contributions.length-1;c>=0;c--){var h=this.contributions[c],d=h.getInfoContribution(r.uri,u);if(d)return d.then(function(m){return l(m)})}return this.schemaService.getSchemaForResource(r.uri,e).then(function(m){if(m&&a){var p=e.getMatchingSchemas(m.schema,a.offset),g=void 0,b=void 0,y=void 0,v=void 0;p.every(function(E){if(E.node===a&&!E.inverted&&E.schema&&(g=g||E.schema.title,b=b||E.schema.markdownDescription||Wt(E.schema.description),E.schema.enum)){var I=E.schema.enum.indexOf(de(a));E.schema.markdownEnumDescriptions?y=E.schema.markdownEnumDescriptions[I]:E.schema.enumDescriptions&&(y=Wt(E.schema.enumDescriptions[I])),y&&(v=E.schema.enum[I],typeof v!="string"&&(v=JSON.stringify(v)))}return!0});var O="";return g&&(O=Wt(g)),b&&(O.length>0&&(O+=`
+
+`),O+=b),y&&(O.length>0&&(O+=`
+
+`),O+="`".concat(wn(v),"`: ").concat(y)),l([O])}return null})},t}();function Wt(t){if(t){var r=t.replace(/([^\n\r])(\r?\n)([^\n\r])/gm,`$1
+
+$3`);return r.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}}function wn(t){return t.indexOf("`")!==-1?"`` "+t+" ``":t}var Tn=he(),jr=function(){function t(r,i){this.jsonSchemaService=r,this.promise=i,this.validationEnabled=!0}return t.prototype.configure=function(r){r&&(this.validationEnabled=r.validate!==!1,this.commentSeverity=r.allowComments?void 0:Z.Error)},t.prototype.doValidation=function(r,i,e,n){var a=this;if(!this.validationEnabled)return this.promise.resolve([]);var s=[],o={},f=function(h){var d=h.range.start.line+" "+h.range.start.character+" "+h.message;o[d]||(o[d]=!0,s.push(h))},l=function(h){var d=e?.trailingCommas?rt(e.trailingCommas):Z.Error,m=e?.comments?rt(e.comments):a.commentSeverity,p=e?.schemaValidation?rt(e.schemaValidation):Z.Warning,g=e?.schemaRequest?rt(e.schemaRequest):Z.Warning;if(h){if(h.errors.length&&i.root&&g){var b=i.root,y=b.type==="object"?b.properties[0]:void 0;if(y&&y.keyNode.value==="$schema"){var v=y.valueNode||y,O=U.create(r.positionAt(v.offset),r.positionAt(v.offset+v.length));f(ae.create(O,h.errors[0],g,W.SchemaResolveError))}else{var O=U.create(r.positionAt(b.offset),r.positionAt(b.offset+1));f(ae.create(O,h.errors[0],g,W.SchemaResolveError))}}else if(p){var E=i.validate(r,h.schema,p);E&&E.forEach(f)}Er(h.schema)&&(m=void 0),Ir(h.schema)&&(d=void 0)}for(var I=0,A=i.syntaxErrors;I<A.length;I++){var P=A[I];if(P.code===W.TrailingComma){if(typeof d!="number")continue;P.severity=d}f(P)}if(typeof m=="number"){var w=Tn("InvalidCommentToken","Comments are not permitted in JSON.");i.comments.forEach(function(C){f(ae.create(C,w,m,W.CommentNotPermitted))})}return s};if(n){var u=n.id||"schemaservice://untitled/"+kn++,c=this.jsonSchemaService.registerExternalSchema(u,[],n);return c.getResolvedSchema().then(function(h){return l(h)})}return this.jsonSchemaService.getSchemaForResource(r.uri,i).then(function(h){return l(h)})},t.prototype.getLanguageStatus=function(r,i){return{schemas:this.jsonSchemaService.getSchemaURIsForResource(r.uri,i)}},t}();var kn=0;function Er(t){if(t&&typeof t=="object"){if(ie(t.allowComments))return t.allowComments;if(t.allOf)for(var r=0,i=t.allOf;r<i.length;r++){var e=i[r],n=Er(e);if(ie(n))return n}}}function Ir(t){if(t&&typeof t=="object"){if(ie(t.allowTrailingCommas))return t.allowTrailingCommas;var r=t;if(ie(r.allowsTrailingCommas))return r.allowsTrailingCommas;if(t.allOf)for(var i=0,e=t.allOf;i<e.length;i++){var n=e[i],a=Ir(n);if(ie(a))return a}}}function rt(t){switch(t){case"error":return Z.Error;case"warning":return Z.Warning;case"ignore":return}}var Nr=48,On=57,Cn=65,nt=97,Pn=102;function B(t){return t<Nr?0:t<=On?t-Nr:(t<nt&&(t+=nt-Cn),t>=nt&&t<=Pn?t-nt+10:0)}function Mr(t){if(t[0]==="#")switch(t.length){case 4:return{red:B(t.charCodeAt(1))*17/255,green:B(t.charCodeAt(2))*17/255,blue:B(t.charCodeAt(3))*17/255,alpha:1};case 5:return{red:B(t.charCodeAt(1))*17/255,green:B(t.charCodeAt(2))*17/255,blue:B(t.charCodeAt(3))*17/255,alpha:B(t.charCodeAt(4))*17/255};case 7:return{red:(B(t.charCodeAt(1))*16+B(t.charCodeAt(2)))/255,green:(B(t.charCodeAt(3))*16+B(t.charCodeAt(4)))/255,blue:(B(t.charCodeAt(5))*16+B(t.charCodeAt(6)))/255,alpha:1};case 9:return{red:(B(t.charCodeAt(1))*16+B(t.charCodeAt(2)))/255,green:(B(t.charCodeAt(3))*16+B(t.charCodeAt(4)))/255,blue:(B(t.charCodeAt(5))*16+B(t.charCodeAt(6)))/255,alpha:(B(t.charCodeAt(7))*16+B(t.charCodeAt(8)))/255}}}var Fr=function(){function t(r){this.schemaService=r}return t.prototype.findDocumentSymbols=function(r,i,e){var n=this;e===void 0&&(e={resultLimit:Number.MAX_VALUE});var a=i.root;if(!a)return[];var s=e.resultLimit||Number.MAX_VALUE,o=r.uri;if((o==="vscode://defaultsettings/keybindings.json"||pe(o.toLowerCase(),"/user/keybindings.json"))&&a.type==="array"){for(var f=[],l=0,u=a.items;l<u.length;l++){var c=u[l];if(c.type==="object")for(var h=0,d=c.properties;h<d.length;h++){var m=d[h];if(m.keyNode.value==="key"&&m.valueNode){var p=Se.create(r.uri,ve(r,c));if(f.push({name:de(m.valueNode),kind:oe.Function,location:p}),s--,s<=0)return e&&e.onResultLimitExceeded&&e.onResultLimitExceeded(o),f}}}return f}for(var g=[{node:a,containerName:""}],b=0,y=!1,v=[],O=function(I,A){I.type==="array"?I.items.forEach(function(P){P&&g.push({node:P,containerName:A})}):I.type==="object"&&I.properties.forEach(function(P){var w=P.valueNode;if(w)if(s>0){s--;var C=Se.create(r.uri,ve(r,P)),F=A?A+"."+P.keyNode.value:P.keyNode.value;v.push({name:n.getKeyLabel(P),kind:n.getSymbolKind(w.type),location:C,containerName:A}),g.push({node:w,containerName:F})}else y=!0})};b<g.length;){var E=g[b++];O(E.node,E.containerName)}return y&&e&&e.onResultLimitExceeded&&e.onResultLimitExceeded(o),v},t.prototype.findDocumentSymbols2=function(r,i,e){var n=this;e===void 0&&(e={resultLimit:Number.MAX_VALUE});var a=i.root;if(!a)return[];var s=e.resultLimit||Number.MAX_VALUE,o=r.uri;if((o==="vscode://defaultsettings/keybindings.json"||pe(o.toLowerCase(),"/user/keybindings.json"))&&a.type==="array"){for(var f=[],l=0,u=a.items;l<u.length;l++){var c=u[l];if(c.type==="object")for(var h=0,d=c.properties;h<d.length;h++){var m=d[h];if(m.keyNode.value==="key"&&m.valueNode){var p=ve(r,c),g=ve(r,m.keyNode);if(f.push({name:de(m.valueNode),kind:oe.Function,range:p,selectionRange:g}),s--,s<=0)return e&&e.onResultLimitExceeded&&e.onResultLimitExceeded(o),f}}}return f}for(var b=[],y=[{node:a,result:b}],v=0,O=!1,E=function(A,P){A.type==="array"?A.items.forEach(function(w,C){if(w)if(s>0){s--;var F=ve(r,w),N=F,L=String(C),R={name:L,kind:n.getSymbolKind(w.type),range:F,selectionRange:N,children:[]};P.push(R),y.push({result:R.children,node:w})}else O=!0}):A.type==="object"&&A.properties.forEach(function(w){var C=w.valueNode;if(C)if(s>0){s--;var F=ve(r,w),N=ve(r,w.keyNode),L=[],R={name:n.getKeyLabel(w),kind:n.getSymbolKind(C.type),range:F,selectionRange:N,children:L,detail:n.getDetail(C)};P.push(R),y.push({result:L,node:C})}else O=!0})};v<y.length;){var I=y[v++];E(I.node,I.result)}return O&&e&&e.onResultLimitExceeded&&e.onResultLimitExceeded(o),b},t.prototype.getSymbolKind=function(r){switch(r){case"object":return oe.Module;case"string":return oe.String;case"number":return oe.Number;case"array":return oe.Array;case"boolean":return oe.Boolean;default:return oe.Variable}},t.prototype.getKeyLabel=function(r){var i=r.keyNode.value;return i&&(i=i.replace(/[\n]/g,"\u21B5")),i&&i.trim()?i:'"'.concat(i,'"')},t.prototype.getDetail=function(r){if(r){if(r.type==="boolean"||r.type==="number"||r.type==="null"||r.type==="string")return String(r.value);if(r.type==="array")return r.children.length?void 0:"[]";if(r.type==="object")return r.children.length?void 0:"{}"}},t.prototype.findDocumentColors=function(r,i,e){return this.schemaService.getSchemaForResource(r.uri,i).then(function(n){var a=[];if(n)for(var s=e&&typeof e.resultLimit=="number"?e.resultLimit:Number.MAX_VALUE,o=i.getMatchingSchemas(n.schema),f={},l=0,u=o;l<u.length;l++){var c=u[l];if(!c.inverted&&c.schema&&(c.schema.format==="color"||c.schema.format==="color-hex")&&c.node&&c.node.type==="string"){var h=String(c.node.offset);if(!f[h]){var d=Mr(de(c.node));if(d){var m=ve(r,c.node);a.push({color:d,range:m})}if(f[h]=!0,s--,s<=0)return e&&e.onResultLimitExceeded&&e.onResultLimitExceeded(r.uri),a}}}return a})},t.prototype.getColorPresentations=function(r,i,e,n){var a=[],s=Math.round(e.red*255),o=Math.round(e.green*255),f=Math.round(e.blue*255);function l(c){var h=c.toString(16);return h.length!==2?"0"+h:h}var u;return e.alpha===1?u="#".concat(l(s)).concat(l(o)).concat(l(f)):u="#".concat(l(s)).concat(l(o)).concat(l(f)).concat(l(Math.round(e.alpha*255))),a.push({label:u,textEdit:Y.replace(n,JSON.stringify(u))}),a},t}();function ve(t,r){return U.create(t.positionAt(r.offset),t.positionAt(r.offset+r.length))}var D=he(),ot={schemaAssociations:[],schemas:{"http://json-schema.org/schema#":{$ref:"http://json-schema.org/draft-07/schema#"},"http://json-schema.org/draft-04/schema#":{$schema:"http://json-schema.org/draft-04/schema#",definitions:{schemaArray:{type:"array",minItems:1,items:{$ref:"#"}},positiveInteger:{type:"integer",minimum:0},positiveIntegerDefault0:{allOf:[{$ref:"#/definitions/positiveInteger"},{default:0}]},simpleTypes:{type:"string",enum:["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},minItems:1,uniqueItems:!0}},type:"object",properties:{id:{type:"string",format:"uri"},$schema:{type:"string",format:"uri"},title:{type:"string"},description:{type:"string"},default:{},multipleOf:{type:"number",minimum:0,exclusiveMinimum:!0},maximum:{type:"number"},exclusiveMaximum:{type:"boolean",default:!1},minimum:{type:"number"},exclusiveMinimum:{type:"boolean",default:!1},maxLength:{allOf:[{$ref:"#/definitions/positiveInteger"}]},minLength:{allOf:[{$ref:"#/definitions/positiveIntegerDefault0"}]},pattern:{type:"string",format:"regex"},additionalItems:{anyOf:[{type:"boolean"},{$ref:"#"}],default:{}},items:{anyOf:[{$ref:"#"},{$ref:"#/definitions/schemaArray"}],default:{}},maxItems:{allOf:[{$ref:"#/definitions/positiveInteger"}]},minItems:{allOf:[{$ref:"#/definitions/positiveIntegerDefault0"}]},uniqueItems:{type:"boolean",default:!1},maxProperties:{allOf:[{$ref:"#/definitions/positiveInteger"}]},minProperties:{allOf:[{$ref:"#/definitions/positiveIntegerDefault0"}]},required:{allOf:[{$ref:"#/definitions/stringArray"}]},additionalProperties:{anyOf:[{type:"boolean"},{$ref:"#"}],default:{}},definitions:{type:"object",additionalProperties:{$ref:"#"},default:{}},properties:{type:"object",additionalProperties:{$ref:"#"},default:{}},patternProperties:{type:"object",additionalProperties:{$ref:"#"},default:{}},dependencies:{type:"object",additionalProperties:{anyOf:[{$ref:"#"},{$ref:"#/definitions/stringArray"}]}},enum:{type:"array",minItems:1,uniqueItems:!0},type:{anyOf:[{$ref:"#/definitions/simpleTypes"},{type:"array",items:{$ref:"#/definitions/simpleTypes"},minItems:1,uniqueItems:!0}]},format:{anyOf:[{type:"string",enum:["date-time","uri","email","hostname","ipv4","ipv6","regex"]},{type:"string"}]},allOf:{allOf:[{$ref:"#/definitions/schemaArray"}]},anyOf:{allOf:[{$ref:"#/definitions/schemaArray"}]},oneOf:{allOf:[{$ref:"#/definitions/schemaArray"}]},not:{allOf:[{$ref:"#"}]}},dependencies:{exclusiveMaximum:["maximum"],exclusiveMinimum:["minimum"]},default:{}},"http://json-schema.org/draft-07/schema#":{definitions:{schemaArray:{type:"array",minItems:1,items:{$ref:"#"}},nonNegativeInteger:{type:"integer",minimum:0},nonNegativeIntegerDefault0:{allOf:[{$ref:"#/definitions/nonNegativeInteger"},{default:0}]},simpleTypes:{enum:["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},uniqueItems:!0,default:[]}},type:["object","boolean"],properties:{$id:{type:"string",format:"uri-reference"},$schema:{type:"string",format:"uri"},$ref:{type:"string",format:"uri-reference"},$comment:{type:"string"},title:{type:"string"},description:{type:"string"},default:!0,readOnly:{type:"boolean",default:!1},examples:{type:"array",items:!0},multipleOf:{type:"number",exclusiveMinimum:0},maximum:{type:"number"},exclusiveMaximum:{type:"number"},minimum:{type:"number"},exclusiveMinimum:{type:"number"},maxLength:{$ref:"#/definitions/nonNegativeInteger"},minLength:{$ref:"#/definitions/nonNegativeIntegerDefault0"},pattern:{type:"string",format:"regex"},additionalItems:{$ref:"#"},items:{anyOf:[{$ref:"#"},{$ref:"#/definitions/schemaArray"}],default:!0},maxItems:{$ref:"#/definitions/nonNegativeInteger"},minItems:{$ref:"#/definitions/nonNegativeIntegerDefault0"},uniqueItems:{type:"boolean",default:!1},contains:{$ref:"#"},maxProperties:{$ref:"#/definitions/nonNegativeInteger"},minProperties:{$ref:"#/definitions/nonNegativeIntegerDefault0"},required:{$ref:"#/definitions/stringArray"},additionalProperties:{$ref:"#"},definitions:{type:"object",additionalProperties:{$ref:"#"},default:{}},properties:{type:"object",additionalProperties:{$ref:"#"},default:{}},patternProperties:{type:"object",additionalProperties:{$ref:"#"},propertyNames:{format:"regex"},default:{}},dependencies:{type:"object",additionalProperties:{anyOf:[{$ref:"#"},{$ref:"#/definitions/stringArray"}]}},propertyNames:{$ref:"#"},const:!0,enum:{type:"array",items:!0,minItems:1,uniqueItems:!0},type:{anyOf:[{$ref:"#/definitions/simpleTypes"},{type:"array",items:{$ref:"#/definitions/simpleTypes"},minItems:1,uniqueItems:!0}]},format:{type:"string"},contentMediaType:{type:"string"},contentEncoding:{type:"string"},if:{$ref:"#"},then:{$ref:"#"},else:{$ref:"#"},allOf:{$ref:"#/definitions/schemaArray"},anyOf:{$ref:"#/definitions/schemaArray"},oneOf:{$ref:"#/definitions/schemaArray"},not:{$ref:"#"}},default:!0}}},jn={id:D("schema.json.id","A unique identifier for the schema."),$schema:D("schema.json.$schema","The schema to verify this document against."),title:D("schema.json.title","A descriptive title of the element."),description:D("schema.json.description","A long description of the element. Used in hover menus and suggestions."),default:D("schema.json.default","A default value. Used by suggestions."),multipleOf:D("schema.json.multipleOf","A number that should cleanly divide the current value (i.e. have no remainder)."),maximum:D("schema.json.maximum","The maximum numerical value, inclusive by default."),exclusiveMaximum:D("schema.json.exclusiveMaximum","Makes the maximum property exclusive."),minimum:D("schema.json.minimum","The minimum numerical value, inclusive by default."),exclusiveMinimum:D("schema.json.exclusiveMininum","Makes the minimum property exclusive."),maxLength:D("schema.json.maxLength","The maximum length of a string."),minLength:D("schema.json.minLength","The minimum length of a string."),pattern:D("schema.json.pattern","A regular expression to match the string against. It is not implicitly anchored."),additionalItems:D("schema.json.additionalItems","For arrays, only when items is set as an array. If it is a schema, then this schema validates items after the ones specified by the items array. If it is false, then additional items will cause validation to fail."),items:D("schema.json.items","For arrays. Can either be a schema to validate every element against or an array of schemas to validate each item against in order (the first schema will validate the first element, the second schema will validate the second element, and so on."),maxItems:D("schema.json.maxItems","The maximum number of items that can be inside an array. Inclusive."),minItems:D("schema.json.minItems","The minimum number of items that can be inside an array. Inclusive."),uniqueItems:D("schema.json.uniqueItems","If all of the items in the array must be unique. Defaults to false."),maxProperties:D("schema.json.maxProperties","The maximum number of properties an object can have. Inclusive."),minProperties:D("schema.json.minProperties","The minimum number of properties an object can have. Inclusive."),required:D("schema.json.required","An array of strings that lists the names of all properties required on this object."),additionalProperties:D("schema.json.additionalProperties","Either a schema or a boolean. If a schema, then used to validate all properties not matched by 'properties' or 'patternProperties'. If false, then any properties not matched by either will cause this schema to fail."),definitions:D("schema.json.definitions","Not used for validation. Place subschemas here that you wish to reference inline with $ref."),properties:D("schema.json.properties","A map of property names to schemas for each property."),patternProperties:D("schema.json.patternProperties","A map of regular expressions on property names to schemas for matching properties."),dependencies:D("schema.json.dependencies","A map of property names to either an array of property names or a schema. An array of property names means the property named in the key depends on the properties in the array being present in the object in order to be valid. If the value is a schema, then the schema is only applied to the object if the property in the key exists on the object."),enum:D("schema.json.enum","The set of literal values that are valid."),type:D("schema.json.type","Either a string of one of the basic schema types (number, integer, null, array, object, boolean, string) or an array of strings specifying a subset of those types."),format:D("schema.json.format","Describes the format expected for the value."),allOf:D("schema.json.allOf","An array of schemas, all of which must match."),anyOf:D("schema.json.anyOf","An array of schemas, where at least one must match."),oneOf:D("schema.json.oneOf","An array of schemas, exactly one of which must match."),not:D("schema.json.not","A schema which must not match."),$id:D("schema.json.$id","A unique identifier for the schema."),$ref:D("schema.json.$ref","Reference a definition hosted on any location."),$comment:D("schema.json.$comment","Comments from schema authors to readers or maintainers of the schema."),readOnly:D("schema.json.readOnly","Indicates that the value of the instance is managed exclusively by the owning authority."),examples:D("schema.json.examples","Sample JSON values associated with a particular schema, for the purpose of illustrating usage."),contains:D("schema.json.contains",'An array instance is valid against "contains" if at least one of its elements is valid against the given schema.'),propertyNames:D("schema.json.propertyNames","If the instance is an object, this keyword validates if every property name in the instance validates against the provided schema."),const:D("schema.json.const","An instance validates successfully against this keyword if its value is equal to the value of the keyword."),contentMediaType:D("schema.json.contentMediaType","Describes the media type of a string property."),contentEncoding:D("schema.json.contentEncoding","Describes the content encoding of a string property."),if:D("schema.json.if",'The validation outcome of the "if" subschema controls which of the "then" or "else" keywords are evaluated.'),then:D("schema.json.then",'The "if" subschema is used for validation when the "if" subschema succeeds.'),else:D("schema.json.else",'The "else" subschema is used for validation when the "if" subschema fails.')};for(Lr in ot.schemas){it=ot.schemas[Lr];for(Ne in it.properties)at=it.properties[Ne],typeof at=="boolean"&&(at=it.properties[Ne]={}),Jt=jn[Ne],Jt?at.description=Jt:console.log("".concat(Ne,": localize('schema.json.").concat(Ne,`', "")`))}var it,at,Jt,Ne,Lr;var Vr;Vr=(()=>{"use strict";var t={470:e=>{function n(o){if(typeof o!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(o))}function a(o,f){for(var l,u="",c=0,h=-1,d=0,m=0;m<=o.length;++m){if(m<o.length)l=o.charCodeAt(m);else{if(l===47)break;l=47}if(l===47){if(!(h===m-1||d===1))if(h!==m-1&&d===2){if(u.length<2||c!==2||u.charCodeAt(u.length-1)!==46||u.charCodeAt(u.length-2)!==46){if(u.length>2){var p=u.lastIndexOf("/");if(p!==u.length-1){p===-1?(u="",c=0):c=(u=u.slice(0,p)).length-1-u.lastIndexOf("/"),h=m,d=0;continue}}else if(u.length===2||u.length===1){u="",c=0,h=m,d=0;continue}}f&&(u.length>0?u+="/..":u="..",c=2)}else u.length>0?u+="/"+o.slice(h+1,m):u=o.slice(h+1,m),c=m-h-1;h=m,d=0}else l===46&&d!==-1?++d:d=-1}return u}var s={resolve:function(){for(var o,f="",l=!1,u=arguments.length-1;u>=-1&&!l;u--){var c;u>=0?c=arguments[u]:(o===void 0&&(o=process.cwd()),c=o),n(c),c.length!==0&&(f=c+"/"+f,l=c.charCodeAt(0)===47)}return f=a(f,!l),l?f.length>0?"/"+f:"/":f.length>0?f:"."},normalize:function(o){if(n(o),o.length===0)return".";var f=o.charCodeAt(0)===47,l=o.charCodeAt(o.length-1)===47;return(o=a(o,!f)).length!==0||f||(o="."),o.length>0&&l&&(o+="/"),f?"/"+o:o},isAbsolute:function(o){return n(o),o.length>0&&o.charCodeAt(0)===47},join:function(){if(arguments.length===0)return".";for(var o,f=0;f<arguments.length;++f){var l=arguments[f];n(l),l.length>0&&(o===void 0?o=l:o+="/"+l)}return o===void 0?".":s.normalize(o)},relative:function(o,f){if(n(o),n(f),o===f||(o=s.resolve(o))===(f=s.resolve(f)))return"";for(var l=1;l<o.length&&o.charCodeAt(l)===47;++l);for(var u=o.length,c=u-l,h=1;h<f.length&&f.charCodeAt(h)===47;++h);for(var d=f.length-h,m=c<d?c:d,p=-1,g=0;g<=m;++g){if(g===m){if(d>m){if(f.charCodeAt(h+g)===47)return f.slice(h+g+1);if(g===0)return f.slice(h+g)}else c>m&&(o.charCodeAt(l+g)===47?p=g:g===0&&(p=0));break}var b=o.charCodeAt(l+g);if(b!==f.charCodeAt(h+g))break;b===47&&(p=g)}var y="";for(g=l+p+1;g<=u;++g)g!==u&&o.charCodeAt(g)!==47||(y.length===0?y+="..":y+="/..");return y.length>0?y+f.slice(h+p):(h+=p,f.charCodeAt(h)===47&&++h,f.slice(h))},_makeLong:function(o){return o},dirname:function(o){if(n(o),o.length===0)return".";for(var f=o.charCodeAt(0),l=f===47,u=-1,c=!0,h=o.length-1;h>=1;--h)if((f=o.charCodeAt(h))===47){if(!c){u=h;break}}else c=!1;return u===-1?l?"/":".":l&&u===1?"//":o.slice(0,u)},basename:function(o,f){if(f!==void 0&&typeof f!="string")throw new TypeError('"ext" argument must be a string');n(o);var l,u=0,c=-1,h=!0;if(f!==void 0&&f.length>0&&f.length<=o.length){if(f.length===o.length&&f===o)return"";var d=f.length-1,m=-1;for(l=o.length-1;l>=0;--l){var p=o.charCodeAt(l);if(p===47){if(!h){u=l+1;break}}else m===-1&&(h=!1,m=l+1),d>=0&&(p===f.charCodeAt(d)?--d==-1&&(c=l):(d=-1,c=m))}return u===c?c=m:c===-1&&(c=o.length),o.slice(u,c)}for(l=o.length-1;l>=0;--l)if(o.charCodeAt(l)===47){if(!h){u=l+1;break}}else c===-1&&(h=!1,c=l+1);return c===-1?"":o.slice(u,c)},extname:function(o){n(o);for(var f=-1,l=0,u=-1,c=!0,h=0,d=o.length-1;d>=0;--d){var m=o.charCodeAt(d);if(m!==47)u===-1&&(c=!1,u=d+1),m===46?f===-1?f=d:h!==1&&(h=1):f!==-1&&(h=-1);else if(!c){l=d+1;break}}return f===-1||u===-1||h===0||h===1&&f===u-1&&f===l+1?"":o.slice(f,u)},format:function(o){if(o===null||typeof o!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof o);return function(f,l){var u=l.dir||l.root,c=l.base||(l.name||"")+(l.ext||"");return u?u===l.root?u+c:u+"/"+c:c}(0,o)},parse:function(o){n(o);var f={root:"",dir:"",base:"",ext:"",name:""};if(o.length===0)return f;var l,u=o.charCodeAt(0),c=u===47;c?(f.root="/",l=1):l=0;for(var h=-1,d=0,m=-1,p=!0,g=o.length-1,b=0;g>=l;--g)if((u=o.charCodeAt(g))!==47)m===-1&&(p=!1,m=g+1),u===46?h===-1?h=g:b!==1&&(b=1):h!==-1&&(b=-1);else if(!p){d=g+1;break}return h===-1||m===-1||b===0||b===1&&h===m-1&&h===d+1?m!==-1&&(f.base=f.name=d===0&&c?o.slice(1,m):o.slice(d,m)):(d===0&&c?(f.name=o.slice(1,h),f.base=o.slice(1,m)):(f.name=o.slice(d,h),f.base=o.slice(d,m)),f.ext=o.slice(h,m)),d>0?f.dir=o.slice(0,d-1):c&&(f.dir="/"),f},sep:"/",delimiter:":",win32:null,posix:null};s.posix=s,e.exports=s},447:(e,n,a)=>{var s;if(a.r(n),a.d(n,{URI:()=>y,Utils:()=>L}),typeof process=="object")s=process.platform==="win32";else if(typeof navigator=="object"){var o=navigator.userAgent;s=o.indexOf("Windows")>=0}var f,l,u=(f=function(T,S){return(f=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(k,j){k.__proto__=j}||function(k,j){for(var V in j)Object.prototype.hasOwnProperty.call(j,V)&&(k[V]=j[V])})(T,S)},function(T,S){if(typeof S!="function"&&S!==null)throw new TypeError("Class extends value "+String(S)+" is not a constructor or null");function k(){this.constructor=T}f(T,S),T.prototype=S===null?Object.create(S):(k.prototype=S.prototype,new k)}),c=/^\w[\w\d+.-]*$/,h=/^\//,d=/^\/\//;function m(T,S){if(!T.scheme&&S)throw new Error('[UriError]: Scheme is missing: {scheme: "", authority: "'.concat(T.authority,'", path: "').concat(T.path,'", query: "').concat(T.query,'", fragment: "').concat(T.fragment,'"}'));if(T.scheme&&!c.test(T.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(T.path){if(T.authority){if(!h.test(T.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(d.test(T.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}var p="",g="/",b=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/,y=function(){function T(S,k,j,V,$,J){J===void 0&&(J=!1),typeof S=="object"?(this.scheme=S.scheme||p,this.authority=S.authority||p,this.path=S.path||p,this.query=S.query||p,this.fragment=S.fragment||p):(this.scheme=function(ue,G){return ue||G?ue:"file"}(S,J),this.authority=k||p,this.path=function(ue,G){switch(ue){case"https":case"http":case"file":G?G[0]!==g&&(G=g+G):G=g}return G}(this.scheme,j||p),this.query=V||p,this.fragment=$||p,m(this,J))}return T.isUri=function(S){return S instanceof T||!!S&&typeof S.authority=="string"&&typeof S.fragment=="string"&&typeof S.path=="string"&&typeof S.query=="string"&&typeof S.scheme=="string"&&typeof S.fsPath=="string"&&typeof S.with=="function"&&typeof S.toString=="function"},Object.defineProperty(T.prototype,"fsPath",{get:function(){return P(this,!1)},enumerable:!1,configurable:!0}),T.prototype.with=function(S){if(!S)return this;var k=S.scheme,j=S.authority,V=S.path,$=S.query,J=S.fragment;return k===void 0?k=this.scheme:k===null&&(k=p),j===void 0?j=this.authority:j===null&&(j=p),V===void 0?V=this.path:V===null&&(V=p),$===void 0?$=this.query:$===null&&($=p),J===void 0?J=this.fragment:J===null&&(J=p),k===this.scheme&&j===this.authority&&V===this.path&&$===this.query&&J===this.fragment?this:new O(k,j,V,$,J)},T.parse=function(S,k){k===void 0&&(k=!1);var j=b.exec(S);return j?new O(j[2]||p,N(j[4]||p),N(j[5]||p),N(j[7]||p),N(j[9]||p),k):new O(p,p,p,p,p)},T.file=function(S){var k=p;if(s&&(S=S.replace(/\\/g,g)),S[0]===g&&S[1]===g){var j=S.indexOf(g,2);j===-1?(k=S.substring(2),S=g):(k=S.substring(2,j),S=S.substring(j)||g)}return new O("file",k,S,p,p)},T.from=function(S){var k=new O(S.scheme,S.authority,S.path,S.query,S.fragment);return m(k,!0),k},T.prototype.toString=function(S){return S===void 0&&(S=!1),w(this,S)},T.prototype.toJSON=function(){return this},T.revive=function(S){if(S){if(S instanceof T)return S;var k=new O(S);return k._formatted=S.external,k._fsPath=S._sep===v?S.fsPath:null,k}return S},T}(),v=s?1:void 0,O=function(T){function S(){var k=T!==null&&T.apply(this,arguments)||this;return k._formatted=null,k._fsPath=null,k}return u(S,T),Object.defineProperty(S.prototype,"fsPath",{get:function(){return this._fsPath||(this._fsPath=P(this,!1)),this._fsPath},enumerable:!1,configurable:!0}),S.prototype.toString=function(k){return k===void 0&&(k=!1),k?w(this,!0):(this._formatted||(this._formatted=w(this,!1)),this._formatted)},S.prototype.toJSON=function(){var k={$mid:1};return this._fsPath&&(k.fsPath=this._fsPath,k._sep=v),this._formatted&&(k.external=this._formatted),this.path&&(k.path=this.path),this.scheme&&(k.scheme=this.scheme),this.authority&&(k.authority=this.authority),this.query&&(k.query=this.query),this.fragment&&(k.fragment=this.fragment),k},S}(y),E=((l={})[58]="%3A",l[47]="%2F",l[63]="%3F",l[35]="%23",l[91]="%5B",l[93]="%5D",l[64]="%40",l[33]="%21",l[36]="%24",l[38]="%26",l[39]="%27",l[40]="%28",l[41]="%29",l[42]="%2A",l[43]="%2B",l[44]="%2C",l[59]="%3B",l[61]="%3D",l[32]="%20",l);function I(T,S){for(var k=void 0,j=-1,V=0;V<T.length;V++){var $=T.charCodeAt(V);if($>=97&&$<=122||$>=65&&$<=90||$>=48&&$<=57||$===45||$===46||$===95||$===126||S&&$===47)j!==-1&&(k+=encodeURIComponent(T.substring(j,V)),j=-1),k!==void 0&&(k+=T.charAt(V));else{k===void 0&&(k=T.substr(0,V));var J=E[$];J!==void 0?(j!==-1&&(k+=encodeURIComponent(T.substring(j,V)),j=-1),k+=J):j===-1&&(j=V)}}return j!==-1&&(k+=encodeURIComponent(T.substring(j))),k!==void 0?k:T}function A(T){for(var S=void 0,k=0;k<T.length;k++){var j=T.charCodeAt(k);j===35||j===63?(S===void 0&&(S=T.substr(0,k)),S+=E[j]):S!==void 0&&(S+=T[k])}return S!==void 0?S:T}function P(T,S){var k;return k=T.authority&&T.path.length>1&&T.scheme==="file"?"//".concat(T.authority).concat(T.path):T.path.charCodeAt(0)===47&&(T.path.charCodeAt(1)>=65&&T.path.charCodeAt(1)<=90||T.path.charCodeAt(1)>=97&&T.path.charCodeAt(1)<=122)&&T.path.charCodeAt(2)===58?S?T.path.substr(1):T.path[1].toLowerCase()+T.path.substr(2):T.path,s&&(k=k.replace(/\//g,"\\")),k}function w(T,S){var k=S?A:I,j="",V=T.scheme,$=T.authority,J=T.path,ue=T.query,G=T.fragment;if(V&&(j+=V,j+=":"),($||V==="file")&&(j+=g,j+=g),$){var ne=$.indexOf("@");if(ne!==-1){var ke=$.substr(0,ne);$=$.substr(ne+1),(ne=ke.indexOf(":"))===-1?j+=k(ke,!1):(j+=k(ke.substr(0,ne),!1),j+=":",j+=k(ke.substr(ne+1),!1)),j+="@"}(ne=($=$.toLowerCase()).indexOf(":"))===-1?j+=k($,!1):(j+=k($.substr(0,ne),!1),j+=$.substr(ne))}if(J){if(J.length>=3&&J.charCodeAt(0)===47&&J.charCodeAt(2)===58)(ce=J.charCodeAt(1))>=65&&ce<=90&&(J="/".concat(String.fromCharCode(ce+32),":").concat(J.substr(3)));else if(J.length>=2&&J.charCodeAt(1)===58){var ce;(ce=J.charCodeAt(0))>=65&&ce<=90&&(J="".concat(String.fromCharCode(ce+32),":").concat(J.substr(2)))}j+=k(J,!0)}return ue&&(j+="?",j+=k(ue,!1)),G&&(j+="#",j+=S?G:I(G,!1)),j}function C(T){try{return decodeURIComponent(T)}catch{return T.length>3?T.substr(0,3)+C(T.substr(3)):T}}var F=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function N(T){return T.match(F)?T.replace(F,function(S){return C(S)}):T}var L,R=a(470),H=function(T,S,k){if(k||arguments.length===2)for(var j,V=0,$=S.length;V<$;V++)!j&&V in S||(j||(j=Array.prototype.slice.call(S,0,V)),j[V]=S[V]);return T.concat(j||Array.prototype.slice.call(S))},q=R.posix||R;(function(T){T.joinPath=function(S){for(var k=[],j=1;j<arguments.length;j++)k[j-1]=arguments[j];return S.with({path:q.join.apply(q,H([S.path],k,!1))})},T.resolvePath=function(S){for(var k=[],j=1;j<arguments.length;j++)k[j-1]=arguments[j];var V=S.path||"/";return S.with({path:q.resolve.apply(q,H([V],k,!1))})},T.dirname=function(S){var k=q.dirname(S.path);return k.length===1&&k.charCodeAt(0)===46?S:S.with({path:k})},T.basename=function(S){return q.basename(S.path)},T.extname=function(S){return q.extname(S.path)}})(L||(L={}))}},r={};function i(e){if(r[e])return r[e].exports;var n=r[e]={exports:{}};return t[e](n,n.exports,i),n.exports}return i.d=(e,n)=>{for(var a in n)i.o(n,a)&&!i.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:n[a]})},i.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),i.r=e=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i(447)})();var{URI:ye,Utils:Pi}=Vr;function Dr(t,r){if(typeof t!="string")throw new TypeError("Expected a string");for(var i=String(t),e="",n=r?!!r.extended:!1,a=r?!!r.globstar:!1,s=!1,o=r&&typeof r.flags=="string"?r.flags:"",f,l=0,u=i.length;l<u;l++)switch(f=i[l],f){case"/":case"$":case"^":case"+":case".":case"(":case")":case"=":case"!":case"|":e+="\\"+f;break;case"?":if(n){e+=".";break}case"[":case"]":if(n){e+=f;break}case"{":if(n){s=!0,e+="(";break}case"}":if(n){s=!1,e+=")";break}case",":if(s){e+="|";break}e+="\\"+f;break;case"*":for(var c=i[l-1],h=1;i[l+1]==="*";)h++,l++;var d=i[l+1];if(!a)e+=".*";else{var m=h>1&&(c==="/"||c===void 0||c==="{"||c===",")&&(d==="/"||d===void 0||d===","||d==="}");m?(d==="/"?l++:c==="/"&&e.endsWith("\\/")&&(e=e.substr(0,e.length-2)),e+="((?:[^/]*(?:/|$))*)"):e+="([^/]*)"}break;default:e+=f}return(!o||!~o.indexOf("g"))&&(e="^"+e+"$"),new RegExp(e,o)}var ge=he(),En="!",In="/",Nn=function(){function t(r,i){this.globWrappers=[];try{for(var e=0,n=r;e<n.length;e++){var a=n[e],s=a[0]!==En;s||(a=a.substring(1)),a.length>0&&(a[0]===In&&(a=a.substring(1)),this.globWrappers.push({regexp:Dr("**/"+a,{extended:!0,globstar:!0}),include:s}))}this.uris=i}catch{this.globWrappers.length=0,this.uris=[]}}return t.prototype.matchesPattern=function(r){for(var i=!1,e=0,n=this.globWrappers;e<n.length;e++){var a=n[e],s=a.regexp,o=a.include;s.test(r)&&(i=o)}return i},t.prototype.getURIs=function(){return this.uris},t}(),Mn=function(){function t(r,i,e){this.service=r,this.uri=i,this.dependencies=new Set,this.anchors=void 0,e&&(this.unresolvedSchema=this.service.promise.resolve(new qe(e)))}return t.prototype.getUnresolvedSchema=function(){return this.unresolvedSchema||(this.unresolvedSchema=this.service.loadSchema(this.uri)),this.unresolvedSchema},t.prototype.getResolvedSchema=function(){var r=this;return this.resolvedSchema||(this.resolvedSchema=this.getUnresolvedSchema().then(function(i){return r.service.resolveSchemaContent(i,r)})),this.resolvedSchema},t.prototype.clearSchema=function(){var r=!!this.unresolvedSchema;return this.resolvedSchema=void 0,this.unresolvedSchema=void 0,this.dependencies.clear(),this.anchors=void 0,r},t}(),qe=function(){function t(r,i){i===void 0&&(i=[]),this.schema=r,this.errors=i}return t}();var $r=function(){function t(r,i){i===void 0&&(i=[]),this.schema=r,this.errors=i}return t.prototype.getSection=function(r){var i=this.getSectionRecursive(r,this.schema);if(i)return K(i)},t.prototype.getSectionRecursive=function(r,i){if(!i||typeof i=="boolean"||r.length===0)return i;var e=r.shift();if(i.properties&&typeof i.properties[e])return this.getSectionRecursive(r,i.properties[e]);if(i.patternProperties)for(var n=0,a=Object.keys(i.patternProperties);n<a.length;n++){var s=a[n],o=xe(s);if(o?.test(e))return this.getSectionRecursive(r,i.patternProperties[s])}else{if(typeof i.additionalProperties=="object")return this.getSectionRecursive(r,i.additionalProperties);if(e.match("[0-9]+")){if(Array.isArray(i.items)){var f=parseInt(e,10);if(!isNaN(f)&&i.items[f])return this.getSectionRecursive(r,i.items[f])}else if(i.items)return this.getSectionRecursive(r,i.items)}}},t}();var Rr=function(){function t(r,i,e){this.contextService=i,this.requestService=r,this.promiseConstructor=e||Promise,this.callOnDispose=[],this.contributionSchemas={},this.contributionAssociations=[],this.schemasById={},this.filePatternAssociations=[],this.registeredSchemasIds={}}return t.prototype.getRegisteredSchemaIds=function(r){return Object.keys(this.registeredSchemasIds).filter(function(i){var e=ye.parse(i).scheme;return e!=="schemaservice"&&(!r||r(e))})},Object.defineProperty(t.prototype,"promise",{get:function(){return this.promiseConstructor},enumerable:!1,configurable:!0}),t.prototype.dispose=function(){for(;this.callOnDispose.length>0;)this.callOnDispose.pop()()},t.prototype.onResourceChange=function(r){var i=this;this.cachedSchemaForResource=void 0;var e=!1;r=be(r);for(var n=[r],a=Object.keys(this.schemasById).map(function(l){return i.schemasById[l]});n.length;)for(var s=n.pop(),o=0;o<a.length;o++){var f=a[o];f&&(f.uri===s||f.dependencies.has(s))&&(f.uri!==s&&n.push(f.uri),f.clearSchema()&&(e=!0),a[o]=void 0)}return e},t.prototype.setSchemaContributions=function(r){if(r.schemas){var i=r.schemas;for(var e in i){var n=be(e);this.contributionSchemas[n]=this.addSchemaHandle(n,i[e])}}if(Array.isArray(r.schemaAssociations))for(var a=r.schemaAssociations,s=0,o=a;s<o.length;s++){var f=o[s],l=f.uris.map(be),u=this.addFilePatternAssociation(f.pattern,l);this.contributionAssociations.push(u)}},t.prototype.addSchemaHandle=function(r,i){var e=new Mn(this,r,i);return this.schemasById[r]=e,e},t.prototype.getOrAddSchemaHandle=function(r,i){return this.schemasById[r]||this.addSchemaHandle(r,i)},t.prototype.addFilePatternAssociation=function(r,i){var e=new Nn(r,i);return this.filePatternAssociations.push(e),e},t.prototype.registerExternalSchema=function(r,i,e){var n=be(r);return this.registeredSchemasIds[n]=!0,this.cachedSchemaForResource=void 0,i&&this.addFilePatternAssociation(i,[n]),e?this.addSchemaHandle(n,e):this.getOrAddSchemaHandle(n)},t.prototype.clearExternalSchemas=function(){this.schemasById={},this.filePatternAssociations=[],this.registeredSchemasIds={},this.cachedSchemaForResource=void 0;for(var r in this.contributionSchemas)this.schemasById[r]=this.contributionSchemas[r],this.registeredSchemasIds[r]=!0;for(var i=0,e=this.contributionAssociations;i<e.length;i++){var n=e[i];this.filePatternAssociations.push(n)}},t.prototype.getResolvedSchema=function(r){var i=be(r),e=this.schemasById[i];return e?e.getResolvedSchema():this.promise.resolve(void 0)},t.prototype.loadSchema=function(r){if(!this.requestService){var i=ge("json.schema.norequestservice","Unable to load schema from '{0}'. No schema request service available",st(r));return this.promise.resolve(new qe({},[i]))}return this.requestService(r).then(function(e){if(!e){var n=ge("json.schema.nocontent","Unable to load schema from '{0}': No content.",st(r));return new qe({},[n])}var a={},s=[];a=Yt(e,s);var o=s.length?[ge("json.schema.invalidFormat","Unable to parse content from '{0}': Parse error at offset {1}.",st(r),s[0].offset)]:[];return new qe(a,o)},function(e){var n=e.toString(),a=e.toString().split("Error: ");return a.length>1&&(n=a[1]),pe(n,".")&&(n=n.substr(0,n.length-1)),new qe({},[ge("json.schema.nocontent","Unable to load schema from '{0}': {1}.",st(r),n)])})},t.prototype.resolveSchemaContent=function(r,i){var e=this,n=r.errors.slice(0),a=r.schema;if(a.$schema){var s=be(a.$schema);if(s==="http://json-schema.org/draft-03/schema")return this.promise.resolve(new $r({},[ge("json.schema.draft03.notsupported","Draft-03 schemas are not supported.")]));s==="https://json-schema.org/draft/2019-09/schema"?n.push(ge("json.schema.draft201909.notsupported","Draft 2019-09 schemas are not yet fully supported.")):s==="https://json-schema.org/draft/2020-12/schema"&&n.push(ge("json.schema.draft202012.notsupported","Draft 2020-12 schemas are not yet fully supported."))}var o=this.contextService,f=function(p,g){g=decodeURIComponent(g);var b=p;return g[0]==="/"&&(g=g.substring(1)),g.split("/").some(function(y){return y=y.replace(/~1/g,"/").replace(/~0/g,"~"),b=b[y],!b}),b},l=function(p,g,b){return g.anchors||(g.anchors=m(p)),g.anchors.get(b)},u=function(p,g){for(var b in g)g.hasOwnProperty(b)&&!p.hasOwnProperty(b)&&b!=="id"&&b!=="$id"&&(p[b]=g[b])},c=function(p,g,b,y){var v;y===void 0||y.length===0?v=g:y.charAt(0)==="/"?v=f(g,y):v=l(g,b,y),v?u(p,v):n.push(ge("json.schema.invalidid","$ref '{0}' in '{1}' can not be resolved.",y,b.uri))},h=function(p,g,b,y){o&&!/^[A-Za-z][A-Za-z0-9+\-.+]*:\/\/.*/.test(g)&&(g=o.resolveRelativePath(g,y.uri)),g=be(g);var v=e.getOrAddSchemaHandle(g);return v.getUnresolvedSchema().then(function(O){if(y.dependencies.add(g),O.errors.length){var E=b?g+"#"+b:g;n.push(ge("json.schema.problemloadingref","Problems loading reference '{0}': {1}",E,O.errors[0]))}return c(p,O.schema,v,b),d(p,O.schema,v)})},d=function(p,g,b){var y=[];return e.traverseNodes(p,function(v){for(var O=new Set;v.$ref;){var E=v.$ref,I=E.split("#",2);if(delete v.$ref,I[0].length>0){y.push(h(v,I[0],I[1],b));return}else if(!O.has(E)){var A=I[1];c(v,g,b,A),O.add(E)}}}),e.promise.all(y)},m=function(p){var g=new Map;return e.traverseNodes(p,function(b){var y=b.$id||b.id;if(typeof y=="string"&&y.charAt(0)==="#"){var v=y.substring(1);g.has(v)?n.push(ge("json.schema.duplicateid","Duplicate id declaration: '{0}'",y)):g.set(v,b)}}),g};return d(a,a,i).then(function(p){return new $r(a,n)})},t.prototype.traverseNodes=function(r,i){if(!r||typeof r!="object")return Promise.resolve(null);for(var e=new Set,n=function(){for(var l=[],u=0;u<arguments.length;u++)l[u]=arguments[u];for(var c=0,h=l;c<h.length;c++){var d=h[c];typeof d=="object"&&o.push(d)}},a=function(){for(var l=[],u=0;u<arguments.length;u++)l[u]=arguments[u];for(var c=0,h=l;c<h.length;c++){var d=h[c];if(typeof d=="object")for(var m in d){var p=m,g=d[p];typeof g=="object"&&o.push(g)}}},s=function(){for(var l=[],u=0;u<arguments.length;u++)l[u]=arguments[u];for(var c=0,h=l;c<h.length;c++){var d=h[c];if(Array.isArray(d))for(var m=0,p=d;m<p.length;m++){var g=p[m];typeof g=="object"&&o.push(g)}}},o=[r],f=o.pop();f;)e.has(f)||(e.add(f),i(f),n(f.items,f.additionalItems,f.additionalProperties,f.not,f.contains,f.propertyNames,f.if,f.then,f.else),a(f.definitions,f.properties,f.patternProperties,f.dependencies),s(f.anyOf,f.allOf,f.oneOf,f.items)),f=o.pop()},t.prototype.getSchemaFromProperty=function(r,i){var e,n;if(((e=i.root)===null||e===void 0?void 0:e.type)==="object")for(var a=0,s=i.root.properties;a<s.length;a++){var o=s[a];if(o.keyNode.value==="$schema"&&((n=o.valueNode)===null||n===void 0?void 0:n.type)==="string"){var f=o.valueNode.value;return this.contextService&&!/^\w[\w\d+.-]*:/.test(f)&&(f=this.contextService.resolveRelativePath(f,r)),f}}},t.prototype.getAssociatedSchemas=function(r){for(var i=Object.create(null),e=[],n=Ln(r),a=0,s=this.filePatternAssociations;a<s.length;a++){var o=s[a];if(o.matchesPattern(n))for(var f=0,l=o.getURIs();f<l.length;f++){var u=l[f];i[u]||(e.push(u),i[u]=!0)}}return e},t.prototype.getSchemaURIsForResource=function(r,i){var e=i&&this.getSchemaFromProperty(r,i);return e?[e]:this.getAssociatedSchemas(r)},t.prototype.getSchemaForResource=function(r,i){if(i){var e=this.getSchemaFromProperty(r,i);if(e){var n=be(e);return this.getOrAddSchemaHandle(n).getResolvedSchema()}}if(this.cachedSchemaForResource&&this.cachedSchemaForResource.resource===r)return this.cachedSchemaForResource.resolvedSchema;var a=this.getAssociatedSchemas(r),s=a.length>0?this.createCombinedSchema(r,a).getResolvedSchema():this.promise.resolve(void 0);return this.cachedSchemaForResource={resource:r,resolvedSchema:s},s},t.prototype.createCombinedSchema=function(r,i){if(i.length===1)return this.getOrAddSchemaHandle(i[0]);var e="schemaservice://combinedSchema/"+encodeURIComponent(r),n={allOf:i.map(function(a){return{$ref:a}})};return this.addSchemaHandle(e,n)},t.prototype.getMatchingSchemas=function(r,i,e){if(e){var n=e.id||"schemaservice://untitled/matchingSchemas/"+Fn++,a=this.addSchemaHandle(n,e);return a.getResolvedSchema().then(function(s){return i.getMatchingSchemas(s.schema).filter(function(o){return!o.inverted})})}return this.getSchemaForResource(r.uri,i).then(function(s){return s?i.getMatchingSchemas(s.schema).filter(function(o){return!o.inverted}):[]})},t}();var Fn=0;function be(t){try{return ye.parse(t).toString(!0)}catch{return t}}function Ln(t){try{return ye.parse(t).with({fragment:null,query:null}).toString(!0)}catch{return t}}function st(t){try{var r=ye.parse(t);if(r.scheme==="file")return r.fsPath}catch{}return t}function Ur(t,r){var i=[],e=[],n=[],a=-1,s=le(t.getText(),!1),o=s.scan();function f(C){i.push(C),e.push(n.length)}for(;o!==17;){switch(o){case 1:case 3:{var l=t.positionAt(s.getTokenOffset()).line,u={startLine:l,endLine:l,kind:o===1?"object":"array"};n.push(u);break}case 2:case 4:{var c=o===2?"object":"array";if(n.length>0&&n[n.length-1].kind===c){var u=n.pop(),h=t.positionAt(s.getTokenOffset()).line;u&&h>u.startLine+1&&a!==u.startLine&&(u.endLine=h-1,f(u),a=u.startLine)}break}case 13:{var l=t.positionAt(s.getTokenOffset()).line,d=t.positionAt(s.getTokenOffset()+s.getTokenLength()).line;s.getTokenError()===1&&l+1<t.lineCount?s.setPosition(t.offsetAt(re.create(l+1,0))):l<d&&(f({startLine:l,endLine:d,kind:Ae.Comment}),a=l);break}case 12:{var m=t.getText().substr(s.getTokenOffset(),s.getTokenLength()),p=m.match(/^\/\/\s*#(region\b)|(endregion\b)/);if(p){var h=t.positionAt(s.getTokenOffset()).line;if(p[1]){var u={startLine:h,endLine:h,kind:Ae.Region};n.push(u)}else{for(var g=n.length-1;g>=0&&n[g].kind!==Ae.Region;)g--;if(g>=0){var u=n[g];n.length=g,h>u.startLine&&a!==u.startLine&&(u.endLine=h,f(u),a=u.startLine)}}}break}}o=s.scan()}var b=r&&r.rangeLimit;if(typeof b!="number"||i.length<=b)return i;r&&r.onRangeLimitExceeded&&r.onRangeLimitExceeded(t.uri);for(var y=[],v=0,O=e;v<O.length;v++){var E=O[v];E<30&&(y[E]=(y[E]||0)+1)}for(var I=0,A=0,g=0;g<y.length;g++){var P=y[g];if(P){if(P+I>b){A=g;break}I+=P}}for(var w=[],g=0;g<i.length;g++){var E=e[g];typeof E=="number"&&(E<A||E===A&&I++<b)&&w.push(i[g])}return w}function Wr(t,r,i){function e(o){for(var f=t.offsetAt(o),l=i.getNodeFromOffset(f,!0),u=[];l;){switch(l.type){case"string":case"object":case"array":var c=l.offset+1,h=l.offset+l.length-1;c<h&&f>=c&&f<=h&&u.push(n(c,h)),u.push(n(l.offset,l.offset+l.length));break;case"number":case"boolean":case"null":case"property":u.push(n(l.offset,l.offset+l.length));break}if(l.type==="property"||l.parent&&l.parent.type==="array"){var d=s(l.offset+l.length,5);d!==-1&&u.push(n(l.offset,d))}l=l.parent}for(var m=void 0,p=u.length-1;p>=0;p--)m=Ie.create(u[p],m);return m||(m=Ie.create(U.create(o,o))),m}function n(o,f){return U.create(t.positionAt(o),t.positionAt(f))}var a=le(t.getText(),!0);function s(o,f){a.setPosition(o);var l=a.scan();return l===f?a.getTokenOffset()+a.getTokenLength():-1}return r.map(e)}function Jr(t,r){var i=[];return r.visit(function(e){var n;if(e.type==="property"&&e.keyNode.value==="$ref"&&((n=e.valueNode)===null||n===void 0?void 0:n.type)==="string"){var a=e.valueNode.value,s=Dn(r,a);if(s){var o=t.positionAt(s.offset);i.push({target:"".concat(t.uri,"#").concat(o.line+1,",").concat(o.character+1),range:Vn(t,e.valueNode)})}}return!0}),Promise.resolve(i)}function Vn(t,r){return U.create(t.positionAt(r.offset+1),t.positionAt(r.offset+r.length-1))}function Dn(t,r){var i=$n(r);return i?qt(i,t.root):null}function qt(t,r){if(!r)return null;if(t.length===0)return r;var i=t.shift();if(r&&r.type==="object"){var e=r.properties.find(function(s){return s.keyNode.value===i});return e?qt(t,e.valueNode):null}else if(r&&r.type==="array"&&i.match(/^(0|[1-9][0-9]*)$/)){var n=Number.parseInt(i),a=r.items[n];return a?qt(t,a):null}return null}function $n(t){return t==="#"?[]:t[0]!=="#"||t[1]!=="/"?null:t.substring(2).split(/\//).map(Rn)}function Rn(t){return t.replace(/~1/g,"/").replace(/~0/g,"~")}function qr(t){var r=t.promiseConstructor||Promise,i=new Rr(t.schemaRequestService,t.workspaceContext,r);i.setSchemaContributions(ot);var e=new Cr(i,t.contributions,r,t.clientCapabilities),n=new Pr(i,t.contributions,r),a=new Fr(i),s=new jr(i,r);return{configure:function(o){i.clearExternalSchemas(),o.schemas&&o.schemas.forEach(function(f){i.registerExternalSchema(f.uri,f.fileMatch,f.schema)}),s.configure(o)},resetSchema:function(o){return i.onResourceChange(o)},doValidation:s.doValidation.bind(s),getLanguageStatus:s.getLanguageStatus.bind(s),parseJSONDocument:function(o){return Or(o,{collectComments:!0})},newJSONDocument:function(o,f){return Tr(o,f)},getMatchingSchemas:i.getMatchingSchemas.bind(i),doResolve:e.doResolve.bind(e),doComplete:e.doComplete.bind(e),findDocumentSymbols:a.findDocumentSymbols.bind(a),findDocumentSymbols2:a.findDocumentSymbols2.bind(a),findDocumentColors:a.findDocumentColors.bind(a),getColorPresentations:a.getColorPresentations.bind(a),doHover:n.doHover.bind(n),getFoldingRanges:Ur,getSelectionRanges:Wr,findDefinition:function(){return Promise.resolve([])},findLinks:Jr,format:function(o,f,l){var u=void 0;if(f){var c=o.offsetAt(f.start),h=o.offsetAt(f.end)-c;u={offset:c,length:h}}var d={tabSize:l?l.tabSize:4,insertSpaces:l?.insertSpaces===!0,insertFinalNewline:l?.insertFinalNewline===!0,eol:`
+`};return rr(o.getText(),u,d).map(function(m){return Y.replace(U.create(o.positionAt(m.offset),o.positionAt(m.offset+m.length)),m.content)})}}}var zr;typeof fetch<"u"&&(zr=function(t){return fetch(t).then(r=>r.text())});var ft=class{constructor(r,i){this._ctx=r,this._languageSettings=i.languageSettings,this._languageId=i.languageId,this._languageService=qr({workspaceContext:{resolveRelativePath:(e,n)=>{let a=n.substr(0,n.lastIndexOf("/")+1);return qn(a,e)}},schemaRequestService:i.enableSchemaRequest?zr:void 0,clientCapabilities:Ke.LATEST}),this._languageService.configure(this._languageSettings)}async doValidation(r){let i=this._getTextDocument(r);if(i){let e=this._languageService.parseJSONDocument(i);return this._languageService.doValidation(i,e,this._languageSettings)}return Promise.resolve([])}async doComplete(r,i){let e=this._getTextDocument(r);if(!e)return null;let n=this._languageService.parseJSONDocument(e);return this._languageService.doComplete(e,i,n)}async doResolve(r){return this._languageService.doResolve(r)}async doHover(r,i){let e=this._getTextDocument(r);if(!e)return null;let n=this._languageService.parseJSONDocument(e);return this._languageService.doHover(e,i,n)}async format(r,i,e){let n=this._getTextDocument(r);if(!n)return[];let a=this._languageService.format(n,i,e);return Promise.resolve(a)}async resetSchema(r){return Promise.resolve(this._languageService.resetSchema(r))}async findDocumentSymbols(r){let i=this._getTextDocument(r);if(!i)return[];let e=this._languageService.parseJSONDocument(i),n=this._languageService.findDocumentSymbols2(i,e);return Promise.resolve(n)}async findDocumentColors(r){let i=this._getTextDocument(r);if(!i)return[];let e=this._languageService.parseJSONDocument(i),n=this._languageService.findDocumentColors(i,e);return Promise.resolve(n)}async getColorPresentations(r,i,e){let n=this._getTextDocument(r);if(!n)return[];let a=this._languageService.parseJSONDocument(n),s=this._languageService.getColorPresentations(n,a,i,e);return Promise.resolve(s)}async getFoldingRanges(r,i){let e=this._getTextDocument(r);if(!e)return[];let n=this._languageService.getFoldingRanges(e,i);return Promise.resolve(n)}async getSelectionRanges(r,i){let e=this._getTextDocument(r);if(!e)return[];let n=this._languageService.parseJSONDocument(e),a=this._languageService.getSelectionRanges(e,i,n);return Promise.resolve(a)}async parseJSONDocument(r){let i=this._getTextDocument(r);if(!i)return null;let e=this._languageService.parseJSONDocument(i);return Promise.resolve(e)}async getMatchingSchemas(r){let i=this._getTextDocument(r);if(!i)return[];let e=this._languageService.parseJSONDocument(i);return Promise.resolve(this._languageService.getMatchingSchemas(i,e))}_getTextDocument(r){let i=this._ctx.getMirrorModels();for(let e of i)if(e.uri.toString()===r)return Ue.create(r,this._languageId,e.version,e.getValue());return null}},Wn=47,zt=46;function Jn(t){return t.charCodeAt(0)===Wn}function qn(t,r){if(Jn(r)){let i=ye.parse(t),e=r.split("/");return i.with({path:Br(e)}).toString()}return zn(t,r)}function Br(t){let r=[];for(let e of t)e.length===0||e.length===1&&e.charCodeAt(0)===zt||(e.length===2&&e.charCodeAt(0)===zt&&e.charCodeAt(1)===zt?r.pop():r.push(e));t.length>1&&t[t.length-1].length===0&&r.push("");let i=r.join("/");return t[0].length===0&&(i="/"+i),i}function zn(t,...r){let i=ye.parse(t),e=i.path.split("/");for(let n of r)e.push(...n.split("/"));return i.with({path:Br(e)}).toString()}function Bn(t,r){return new ft(t,r)}return Yr(_n);})();
+return moduleExports;
+});
diff --git a/public/vs/language/typescript/tsMode.js b/public/vs/language/typescript/tsMode.js
new file mode 100644
index 0000000..cd8d9dd
--- /dev/null
+++ b/public/vs/language/typescript/tsMode.js
@@ -0,0 +1,20 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/language/typescript/tsMode", ["require","require"],(require)=>{
+"use strict";var moduleExports=(()=>{var ee=Object.create;var K=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var re=Object.getPrototypeOf,se=Object.prototype.hasOwnProperty;var B=(s=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(s,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):s)(function(s){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')});var ne=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports),oe=(s,e)=>{for(var t in e)K(s,t,{get:e[t],enumerable:!0})},H=(s,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let l of ie(e))!se.call(s,l)&&l!==t&&K(s,l,{get:()=>e[l],enumerable:!(i=te(e,l))||i.enumerable});return s},$=(s,e,t)=>(H(s,e,"default"),t&&H(t,e,"default")),z=(s,e,t)=>(t=s!=null?ee(re(s)):{},H(e||!s||!s.__esModule?K(t,"default",{value:s,enumerable:!0}):t,s)),ae=s=>H(K({},"__esModule",{value:!0}),s);var G=ne((he,J)=>{var le=z(B("vs/editor/editor.api"));J.exports=le});var me={};oe(me,{Adapter:()=>k,CodeActionAdaptor:()=>O,DefinitionAdapter:()=>F,DiagnosticsAdapter:()=>T,DocumentHighlightAdapter:()=>D,FormatAdapter:()=>A,FormatHelper:()=>x,FormatOnTypeAdapter:()=>R,InlayHintsAdapter:()=>N,Kind:()=>m,LibFiles:()=>_,OutlineAdapter:()=>M,QuickInfoAdapter:()=>P,ReferenceAdapter:()=>L,RenameAdapter:()=>E,SignatureHelpAdapter:()=>I,SuggestAdapter:()=>C,WorkerManager:()=>v,flattenDiagnosticMessageText:()=>U,getJavaScriptWorker:()=>pe,getTypeScriptWorker:()=>de,setupJavaScript:()=>ge,setupTypeScript:()=>ue});var r={};$(r,z(G()));var v=class{constructor(e,t){this._modeId=e;this._defaults=t;this._worker=null,this._client=null,this._configChangeListener=this._defaults.onDidChange(()=>this._stopWorker()),this._updateExtraLibsToken=0,this._extraLibsChangeListener=this._defaults.onDidExtraLibsChange(()=>this._updateExtraLibs())}dispose(){this._configChangeListener.dispose(),this._extraLibsChangeListener.dispose(),this._stopWorker()}_stopWorker(){this._worker&&(this._worker.dispose(),this._worker=null),this._client=null}async _updateExtraLibs(){if(!this._worker)return;let e=++this._updateExtraLibsToken,t=await this._worker.getProxy();this._updateExtraLibsToken===e&&t.updateExtraLibs(this._defaults.getExtraLibs())}_getClient(){return this._client||(this._client=(async()=>(this._worker=r.editor.createWebWorker({moduleId:"vs/language/typescript/tsWorker",label:this._modeId,keepIdleModels:!0,createData:{compilerOptions:this._defaults.getCompilerOptions(),extraLibs:this._defaults.getExtraLibs(),customWorkerPath:this._defaults.workerOptions.customWorkerPath,inlayHintsOptions:this._defaults.inlayHintsOptions}}),this._defaults.getEagerModelSync()?await this._worker.withSyncedResources(r.editor.getModels().filter(e=>e.getLanguageId()===this._modeId).map(e=>e.uri)):await this._worker.getProxy()))()),this._client}async getLanguageServiceWorker(...e){let t=await this._getClient();return this._worker&&await this._worker.withSyncedResources(e),t}};var q=B("./monaco.contribution");var n={};n["lib.d.ts"]=!0;n["lib.decorators.d.ts"]=!0;n["lib.decorators.legacy.d.ts"]=!0;n["lib.dom.d.ts"]=!0;n["lib.dom.iterable.d.ts"]=!0;n["lib.es2015.collection.d.ts"]=!0;n["lib.es2015.core.d.ts"]=!0;n["lib.es2015.d.ts"]=!0;n["lib.es2015.generator.d.ts"]=!0;n["lib.es2015.iterable.d.ts"]=!0;n["lib.es2015.promise.d.ts"]=!0;n["lib.es2015.proxy.d.ts"]=!0;n["lib.es2015.reflect.d.ts"]=!0;n["lib.es2015.symbol.d.ts"]=!0;n["lib.es2015.symbol.wellknown.d.ts"]=!0;n["lib.es2016.array.include.d.ts"]=!0;n["lib.es2016.d.ts"]=!0;n["lib.es2016.full.d.ts"]=!0;n["lib.es2017.d.ts"]=!0;n["lib.es2017.full.d.ts"]=!0;n["lib.es2017.intl.d.ts"]=!0;n["lib.es2017.object.d.ts"]=!0;n["lib.es2017.sharedmemory.d.ts"]=!0;n["lib.es2017.string.d.ts"]=!0;n["lib.es2017.typedarrays.d.ts"]=!0;n["lib.es2018.asyncgenerator.d.ts"]=!0;n["lib.es2018.asynciterable.d.ts"]=!0;n["lib.es2018.d.ts"]=!0;n["lib.es2018.full.d.ts"]=!0;n["lib.es2018.intl.d.ts"]=!0;n["lib.es2018.promise.d.ts"]=!0;n["lib.es2018.regexp.d.ts"]=!0;n["lib.es2019.array.d.ts"]=!0;n["lib.es2019.d.ts"]=!0;n["lib.es2019.full.d.ts"]=!0;n["lib.es2019.intl.d.ts"]=!0;n["lib.es2019.object.d.ts"]=!0;n["lib.es2019.string.d.ts"]=!0;n["lib.es2019.symbol.d.ts"]=!0;n["lib.es2020.bigint.d.ts"]=!0;n["lib.es2020.d.ts"]=!0;n["lib.es2020.date.d.ts"]=!0;n["lib.es2020.full.d.ts"]=!0;n["lib.es2020.intl.d.ts"]=!0;n["lib.es2020.number.d.ts"]=!0;n["lib.es2020.promise.d.ts"]=!0;n["lib.es2020.sharedmemory.d.ts"]=!0;n["lib.es2020.string.d.ts"]=!0;n["lib.es2020.symbol.wellknown.d.ts"]=!0;n["lib.es2021.d.ts"]=!0;n["lib.es2021.full.d.ts"]=!0;n["lib.es2021.intl.d.ts"]=!0;n["lib.es2021.promise.d.ts"]=!0;n["lib.es2021.string.d.ts"]=!0;n["lib.es2021.weakref.d.ts"]=!0;n["lib.es2022.array.d.ts"]=!0;n["lib.es2022.d.ts"]=!0;n["lib.es2022.error.d.ts"]=!0;n["lib.es2022.full.d.ts"]=!0;n["lib.es2022.intl.d.ts"]=!0;n["lib.es2022.object.d.ts"]=!0;n["lib.es2022.regexp.d.ts"]=!0;n["lib.es2022.sharedmemory.d.ts"]=!0;n["lib.es2022.string.d.ts"]=!0;n["lib.es2023.array.d.ts"]=!0;n["lib.es2023.d.ts"]=!0;n["lib.es2023.full.d.ts"]=!0;n["lib.es5.d.ts"]=!0;n["lib.es6.d.ts"]=!0;n["lib.esnext.d.ts"]=!0;n["lib.esnext.full.d.ts"]=!0;n["lib.esnext.intl.d.ts"]=!0;n["lib.scripthost.d.ts"]=!0;n["lib.webworker.d.ts"]=!0;n["lib.webworker.importscripts.d.ts"]=!0;n["lib.webworker.iterable.d.ts"]=!0;function U(s,e,t=0){if(typeof s=="string")return s;if(s===void 0)return"";let i="";if(t){i+=e;for(let l=0;l<t;l++)i+="  "}if(i+=s.messageText,t++,s.next)for(let l of s.next)i+=U(l,e,t);return i}function S(s){return s?s.map(e=>e.text).join(""):""}var k=class{constructor(e){this._worker=e}_textSpanToRange(e,t){let i=e.getPositionAt(t.start),l=e.getPositionAt(t.start+t.length),{lineNumber:c,column:u}=i,{lineNumber:g,column:o}=l;return{startLineNumber:c,startColumn:u,endLineNumber:g,endColumn:o}}},_=class{constructor(e){this._worker=e;this._libFiles={},this._hasFetchedLibFiles=!1,this._fetchLibFilesPromise=null}isLibFile(e){return e&&e.path.indexOf("/lib.")===0?!!n[e.path.slice(1)]:!1}getOrCreateModel(e){let t=r.Uri.parse(e),i=r.editor.getModel(t);if(i)return i;if(this.isLibFile(t)&&this._hasFetchedLibFiles)return r.editor.createModel(this._libFiles[t.path.slice(1)],"typescript",t);let l=q.typescriptDefaults.getExtraLibs()[e];return l?r.editor.createModel(l.content,"typescript",t):null}_containsLibFile(e){for(let t of e)if(this.isLibFile(t))return!0;return!1}async fetchLibFilesIfNecessary(e){this._containsLibFile(e)&&await this._fetchLibFiles()}_fetchLibFiles(){return this._fetchLibFilesPromise||(this._fetchLibFilesPromise=this._worker().then(e=>e.getLibFiles()).then(e=>{this._hasFetchedLibFiles=!0,this._libFiles=e})),this._fetchLibFilesPromise}};var T=class extends k{constructor(t,i,l,c){super(c);this._libFiles=t;this._defaults=i;this._selector=l;this._disposables=[];this._listener=Object.create(null);let u=a=>{if(a.getLanguageId()!==l)return;let d=()=>{let{onlyVisible:y}=this._defaults.getDiagnosticsOptions();y?a.isAttachedToEditor()&&this._doValidate(a):this._doValidate(a)},p,f=a.onDidChangeContent(()=>{clearTimeout(p),p=window.setTimeout(d,500)}),b=a.onDidChangeAttached(()=>{let{onlyVisible:y}=this._defaults.getDiagnosticsOptions();y&&(a.isAttachedToEditor()?d():r.editor.setModelMarkers(a,this._selector,[]))});this._listener[a.uri.toString()]={dispose(){f.dispose(),b.dispose(),clearTimeout(p)}},d()},g=a=>{r.editor.setModelMarkers(a,this._selector,[]);let d=a.uri.toString();this._listener[d]&&(this._listener[d].dispose(),delete this._listener[d])};this._disposables.push(r.editor.onDidCreateModel(a=>u(a))),this._disposables.push(r.editor.onWillDisposeModel(g)),this._disposables.push(r.editor.onDidChangeModelLanguage(a=>{g(a.model),u(a.model)})),this._disposables.push({dispose(){for(let a of r.editor.getModels())g(a)}});let o=()=>{for(let a of r.editor.getModels())g(a),u(a)};this._disposables.push(this._defaults.onDidChange(o)),this._disposables.push(this._defaults.onDidExtraLibsChange(o)),r.editor.getModels().forEach(a=>u(a))}dispose(){this._disposables.forEach(t=>t&&t.dispose()),this._disposables=[]}async _doValidate(t){let i=await this._worker(t.uri);if(t.isDisposed())return;let l=[],{noSyntaxValidation:c,noSemanticValidation:u,noSuggestionDiagnostics:g}=this._defaults.getDiagnosticsOptions();c||l.push(i.getSyntacticDiagnostics(t.uri.toString())),u||l.push(i.getSemanticDiagnostics(t.uri.toString())),g||l.push(i.getSuggestionDiagnostics(t.uri.toString()));let o=await Promise.all(l);if(!o||t.isDisposed())return;let a=o.reduce((p,f)=>f.concat(p),[]).filter(p=>(this._defaults.getDiagnosticsOptions().diagnosticCodesToIgnore||[]).indexOf(p.code)===-1),d=a.map(p=>p.relatedInformation||[]).reduce((p,f)=>f.concat(p),[]).map(p=>p.file?r.Uri.parse(p.file.fileName):null);await this._libFiles.fetchLibFilesIfNecessary(d),!t.isDisposed()&&r.editor.setModelMarkers(t,this._selector,a.map(p=>this._convertDiagnostics(t,p)))}_convertDiagnostics(t,i){let l=i.start||0,c=i.length||1,{lineNumber:u,column:g}=t.getPositionAt(l),{lineNumber:o,column:a}=t.getPositionAt(l+c),d=[];return i.reportsUnnecessary&&d.push(r.MarkerTag.Unnecessary),i.reportsDeprecated&&d.push(r.MarkerTag.Deprecated),{severity:this._tsDiagnosticCategoryToMarkerSeverity(i.category),startLineNumber:u,startColumn:g,endLineNumber:o,endColumn:a,message:U(i.messageText,`
+`),code:i.code.toString(),tags:d,relatedInformation:this._convertRelatedInformation(t,i.relatedInformation)}}_convertRelatedInformation(t,i){if(!i)return[];let l=[];return i.forEach(c=>{let u=t;if(c.file&&(u=this._libFiles.getOrCreateModel(c.file.fileName)),!u)return;let g=c.start||0,o=c.length||1,{lineNumber:a,column:d}=u.getPositionAt(g),{lineNumber:p,column:f}=u.getPositionAt(g+o);l.push({resource:u.uri,startLineNumber:a,startColumn:d,endLineNumber:p,endColumn:f,message:U(c.messageText,`
+`)})}),l}_tsDiagnosticCategoryToMarkerSeverity(t){switch(t){case 1:return r.MarkerSeverity.Error;case 3:return r.MarkerSeverity.Info;case 0:return r.MarkerSeverity.Warning;case 2:return r.MarkerSeverity.Hint}return r.MarkerSeverity.Info}},C=class s extends k{get triggerCharacters(){return["."]}async provideCompletionItems(e,t,i,l){let c=e.getWordUntilPosition(t),u=new r.Range(t.lineNumber,c.startColumn,t.lineNumber,c.endColumn),g=e.uri,o=e.getOffsetAt(t),a=await this._worker(g);if(e.isDisposed())return;let d=await a.getCompletionsAtPosition(g.toString(),o);return!d||e.isDisposed()?void 0:{suggestions:d.entries.map(f=>{let b=u;if(f.replacementSpan){let W=e.getPositionAt(f.replacementSpan.start),w=e.getPositionAt(f.replacementSpan.start+f.replacementSpan.length);b=new r.Range(W.lineNumber,W.column,w.lineNumber,w.column)}let y=[];return f.kindModifiers!==void 0&&f.kindModifiers.indexOf("deprecated")!==-1&&y.push(r.languages.CompletionItemTag.Deprecated),{uri:g,position:t,offset:o,range:b,label:f.name,insertText:f.name,sortText:f.sortText,kind:s.convertKind(f.kind),tags:y}})}}async resolveCompletionItem(e,t){let i=e,l=i.uri,c=i.position,u=i.offset,o=await(await this._worker(l)).getCompletionEntryDetails(l.toString(),u,i.label);return o?{uri:l,position:c,label:o.name,kind:s.convertKind(o.kind),detail:S(o.displayParts),documentation:{value:s.createDocumentationString(o)}}:i}static convertKind(e){switch(e){case m.primitiveType:case m.keyword:return r.languages.CompletionItemKind.Keyword;case m.variable:case m.localVariable:return r.languages.CompletionItemKind.Variable;case m.memberVariable:case m.memberGetAccessor:case m.memberSetAccessor:return r.languages.CompletionItemKind.Field;case m.function:case m.memberFunction:case m.constructSignature:case m.callSignature:case m.indexSignature:return r.languages.CompletionItemKind.Function;case m.enum:return r.languages.CompletionItemKind.Enum;case m.module:return r.languages.CompletionItemKind.Module;case m.class:return r.languages.CompletionItemKind.Class;case m.interface:return r.languages.CompletionItemKind.Interface;case m.warning:return r.languages.CompletionItemKind.File}return r.languages.CompletionItemKind.Property}static createDocumentationString(e){let t=S(e.documentation);if(e.tags)for(let i of e.tags)t+=`
+
+${Q(i)}`;return t}};function Q(s){let e=`*@${s.name}*`;if(s.name==="param"&&s.text){let[t,...i]=s.text;e+=`\`${t.text}\``,i.length>0&&(e+=` \u2014 ${i.map(l=>l.text).join(" ")}`)}else Array.isArray(s.text)?e+=` \u2014 ${s.text.map(t=>t.text).join(" ")}`:s.text&&(e+=` \u2014 ${s.text}`);return e}var I=class s extends k{constructor(){super(...arguments);this.signatureHelpTriggerCharacters=["(",","]}static _toSignatureHelpTriggerReason(t){switch(t.triggerKind){case r.languages.SignatureHelpTriggerKind.TriggerCharacter:return t.triggerCharacter?t.isRetrigger?{kind:"retrigger",triggerCharacter:t.triggerCharacter}:{kind:"characterTyped",triggerCharacter:t.triggerCharacter}:{kind:"invoked"};case r.languages.SignatureHelpTriggerKind.ContentChange:return t.isRetrigger?{kind:"retrigger"}:{kind:"invoked"};case r.languages.SignatureHelpTriggerKind.Invoke:default:return{kind:"invoked"}}}async provideSignatureHelp(t,i,l,c){let u=t.uri,g=t.getOffsetAt(i),o=await this._worker(u);if(t.isDisposed())return;let a=await o.getSignatureHelpItems(u.toString(),g,{triggerReason:s._toSignatureHelpTriggerReason(c)});if(!a||t.isDisposed())return;let d={activeSignature:a.selectedItemIndex,activeParameter:a.argumentIndex,signatures:[]};return a.items.forEach(p=>{let f={label:"",parameters:[]};f.documentation={value:S(p.documentation)},f.label+=S(p.prefixDisplayParts),p.parameters.forEach((b,y,W)=>{let w=S(b.displayParts),Z={label:w,documentation:{value:S(b.documentation)}};f.label+=w,f.parameters.push(Z),y<W.length-1&&(f.label+=S(p.separatorDisplayParts))}),f.label+=S(p.suffixDisplayParts),d.signatures.push(f)}),{value:d,dispose(){}}}},P=class extends k{async provideHover(e,t,i){let l=e.uri,c=e.getOffsetAt(t),u=await this._worker(l);if(e.isDisposed())return;let g=await u.getQuickInfoAtPosition(l.toString(),c);if(!g||e.isDisposed())return;let o=S(g.documentation),a=g.tags?g.tags.map(p=>Q(p)).join(`  
+
+`):"",d=S(g.displayParts);return{range:this._textSpanToRange(e,g.textSpan),contents:[{value:"```typescript\n"+d+"\n```\n"},{value:o+(a?`
+
+`+a:"")}]}}},D=class extends k{async provideDocumentHighlights(e,t,i){let l=e.uri,c=e.getOffsetAt(t),u=await this._worker(l);if(e.isDisposed())return;let g=await u.getDocumentHighlights(l.toString(),c,[l.toString()]);if(!(!g||e.isDisposed()))return g.flatMap(o=>o.highlightSpans.map(a=>({range:this._textSpanToRange(e,a.textSpan),kind:a.kind==="writtenReference"?r.languages.DocumentHighlightKind.Write:r.languages.DocumentHighlightKind.Text})))}},F=class extends k{constructor(t,i){super(i);this._libFiles=t}async provideDefinition(t,i,l){let c=t.uri,u=t.getOffsetAt(i),g=await this._worker(c);if(t.isDisposed())return;let o=await g.getDefinitionAtPosition(c.toString(),u);if(!o||t.isDisposed()||(await this._libFiles.fetchLibFilesIfNecessary(o.map(d=>r.Uri.parse(d.fileName))),t.isDisposed()))return;let a=[];for(let d of o){let p=this._libFiles.getOrCreateModel(d.fileName);p&&a.push({uri:p.uri,range:this._textSpanToRange(p,d.textSpan)})}return a}},L=class extends k{constructor(t,i){super(i);this._libFiles=t}async provideReferences(t,i,l,c){let u=t.uri,g=t.getOffsetAt(i),o=await this._worker(u);if(t.isDisposed())return;let a=await o.getReferencesAtPosition(u.toString(),g);if(!a||t.isDisposed()||(await this._libFiles.fetchLibFilesIfNecessary(a.map(p=>r.Uri.parse(p.fileName))),t.isDisposed()))return;let d=[];for(let p of a){let f=this._libFiles.getOrCreateModel(p.fileName);f&&d.push({uri:f.uri,range:this._textSpanToRange(f,p.textSpan)})}return d}},M=class extends k{async provideDocumentSymbols(e,t){let i=e.uri,l=await this._worker(i);if(e.isDisposed())return;let c=await l.getNavigationTree(i.toString());if(!c||e.isDisposed())return;let u=(o,a)=>({name:o.text,detail:"",kind:h[o.kind]||r.languages.SymbolKind.Variable,range:this._textSpanToRange(e,o.spans[0]),selectionRange:this._textSpanToRange(e,o.spans[0]),tags:[],children:o.childItems?.map(p=>u(p,o.text)),containerName:a});return c.childItems?c.childItems.map(o=>u(o)):[]}},m=class{static{this.unknown=""}static{this.keyword="keyword"}static{this.script="script"}static{this.module="module"}static{this.class="class"}static{this.interface="interface"}static{this.type="type"}static{this.enum="enum"}static{this.variable="var"}static{this.localVariable="local var"}static{this.function="function"}static{this.localFunction="local function"}static{this.memberFunction="method"}static{this.memberGetAccessor="getter"}static{this.memberSetAccessor="setter"}static{this.memberVariable="property"}static{this.constructorImplementation="constructor"}static{this.callSignature="call"}static{this.indexSignature="index"}static{this.constructSignature="construct"}static{this.parameter="parameter"}static{this.typeParameter="type parameter"}static{this.primitiveType="primitive type"}static{this.label="label"}static{this.alias="alias"}static{this.const="const"}static{this.let="let"}static{this.warning="warning"}},h=Object.create(null);h[m.module]=r.languages.SymbolKind.Module;h[m.class]=r.languages.SymbolKind.Class;h[m.enum]=r.languages.SymbolKind.Enum;h[m.interface]=r.languages.SymbolKind.Interface;h[m.memberFunction]=r.languages.SymbolKind.Method;h[m.memberVariable]=r.languages.SymbolKind.Property;h[m.memberGetAccessor]=r.languages.SymbolKind.Property;h[m.memberSetAccessor]=r.languages.SymbolKind.Property;h[m.variable]=r.languages.SymbolKind.Variable;h[m.const]=r.languages.SymbolKind.Variable;h[m.localVariable]=r.languages.SymbolKind.Variable;h[m.variable]=r.languages.SymbolKind.Variable;h[m.function]=r.languages.SymbolKind.Function;h[m.localFunction]=r.languages.SymbolKind.Function;var x=class extends k{static _convertOptions(e){return{ConvertTabsToSpaces:e.insertSpaces,TabSize:e.tabSize,IndentSize:e.tabSize,IndentStyle:2,NewLineCharacter:`
+`,InsertSpaceAfterCommaDelimiter:!0,InsertSpaceAfterSemicolonInForStatements:!0,InsertSpaceBeforeAndAfterBinaryOperators:!0,InsertSpaceAfterKeywordsInControlFlowStatements:!0,InsertSpaceAfterFunctionKeywordForAnonymousFunctions:!0,InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis:!1,InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets:!1,InsertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces:!1,PlaceOpenBraceOnNewLineForControlBlocks:!1,PlaceOpenBraceOnNewLineForFunctions:!1}}_convertTextChanges(e,t){return{text:t.newText,range:this._textSpanToRange(e,t.span)}}},A=class extends x{constructor(){super(...arguments);this.canFormatMultipleRanges=!1}async provideDocumentRangeFormattingEdits(t,i,l,c){let u=t.uri,g=t.getOffsetAt({lineNumber:i.startLineNumber,column:i.startColumn}),o=t.getOffsetAt({lineNumber:i.endLineNumber,column:i.endColumn}),a=await this._worker(u);if(t.isDisposed())return;let d=await a.getFormattingEditsForRange(u.toString(),g,o,x._convertOptions(l));if(!(!d||t.isDisposed()))return d.map(p=>this._convertTextChanges(t,p))}},R=class extends x{get autoFormatTriggerCharacters(){return[";","}",`
+`]}async provideOnTypeFormattingEdits(e,t,i,l,c){let u=e.uri,g=e.getOffsetAt(t),o=await this._worker(u);if(e.isDisposed())return;let a=await o.getFormattingEditsAfterKeystroke(u.toString(),g,i,x._convertOptions(l));if(!(!a||e.isDisposed()))return a.map(d=>this._convertTextChanges(e,d))}},O=class extends x{async provideCodeActions(e,t,i,l){let c=e.uri,u=e.getOffsetAt({lineNumber:t.startLineNumber,column:t.startColumn}),g=e.getOffsetAt({lineNumber:t.endLineNumber,column:t.endColumn}),o=x._convertOptions(e.getOptions()),a=i.markers.filter(b=>b.code).map(b=>b.code).map(Number),d=await this._worker(c);if(e.isDisposed())return;let p=await d.getCodeFixesAtPosition(c.toString(),u,g,a,o);return!p||e.isDisposed()?{actions:[],dispose:()=>{}}:{actions:p.filter(b=>b.changes.filter(y=>y.isNewFile).length===0).map(b=>this._tsCodeFixActionToMonacoCodeAction(e,i,b)),dispose:()=>{}}}_tsCodeFixActionToMonacoCodeAction(e,t,i){let l=[];for(let u of i.changes)for(let g of u.textChanges)l.push({resource:e.uri,versionId:void 0,textEdit:{range:this._textSpanToRange(e,g.span),text:g.newText}});return{title:i.description,edit:{edits:l},diagnostics:t.markers,kind:"quickfix"}}},E=class extends k{constructor(t,i){super(i);this._libFiles=t}async provideRenameEdits(t,i,l,c){let u=t.uri,g=u.toString(),o=t.getOffsetAt(i),a=await this._worker(u);if(t.isDisposed())return;let d=await a.getRenameInfo(g,o,{allowRenameOfImportPath:!1});if(d.canRename===!1)return{edits:[],rejectReason:d.localizedErrorMessage};if(d.fileToRename!==void 0)throw new Error("Renaming files is not supported.");let p=await a.findRenameLocations(g,o,!1,!1,!1);if(!p||t.isDisposed())return;let f=[];for(let b of p){let y=this._libFiles.getOrCreateModel(b.fileName);if(y)f.push({resource:y.uri,versionId:void 0,textEdit:{range:this._textSpanToRange(y,b.textSpan),text:l}});else throw new Error(`Unknown file ${b.fileName}.`)}return{edits:f}}},N=class extends k{async provideInlayHints(e,t,i){let l=e.uri,c=l.toString(),u=e.getOffsetAt({lineNumber:t.startLineNumber,column:t.startColumn}),g=e.getOffsetAt({lineNumber:t.endLineNumber,column:t.endColumn}),o=await this._worker(l);return e.isDisposed()?null:{hints:(await o.provideInlayHints(c,u,g)).map(p=>({...p,label:p.text,position:e.getPositionAt(p.position),kind:this._convertHintKind(p.kind)})),dispose:()=>{}}}_convertHintKind(e){switch(e){case"Parameter":return r.languages.InlayHintKind.Parameter;case"Type":return r.languages.InlayHintKind.Type;default:return r.languages.InlayHintKind.Type}}};var V,j;function ue(s){j=X(s,"typescript")}function ge(s){V=X(s,"javascript")}function pe(){return new Promise((s,e)=>{if(!V)return e("JavaScript not registered!");s(V)})}function de(){return new Promise((s,e)=>{if(!j)return e("TypeScript not registered!");s(j)})}function X(s,e){let t=[],i=[],l=new v(e,s);t.push(l);let c=(...o)=>l.getLanguageServiceWorker(...o),u=new _(c);function g(){let{modeConfiguration:o}=s;Y(i),o.completionItems&&i.push(r.languages.registerCompletionItemProvider(e,new C(c))),o.signatureHelp&&i.push(r.languages.registerSignatureHelpProvider(e,new I(c))),o.hovers&&i.push(r.languages.registerHoverProvider(e,new P(c))),o.documentHighlights&&i.push(r.languages.registerDocumentHighlightProvider(e,new D(c))),o.definitions&&i.push(r.languages.registerDefinitionProvider(e,new F(u,c))),o.references&&i.push(r.languages.registerReferenceProvider(e,new L(u,c))),o.documentSymbols&&i.push(r.languages.registerDocumentSymbolProvider(e,new M(c))),o.rename&&i.push(r.languages.registerRenameProvider(e,new E(u,c))),o.documentRangeFormattingEdits&&i.push(r.languages.registerDocumentRangeFormattingEditProvider(e,new A(c))),o.onTypeFormattingEdits&&i.push(r.languages.registerOnTypeFormattingEditProvider(e,new R(c))),o.codeActions&&i.push(r.languages.registerCodeActionProvider(e,new O(c))),o.inlayHints&&i.push(r.languages.registerInlayHintsProvider(e,new N(c))),o.diagnostics&&i.push(new T(u,s,e,c))}return g(),t.push(fe(i)),c}function fe(s){return{dispose:()=>Y(s)}}function Y(s){for(;s.length;)s.pop().dispose()}return ae(me);})();
+return moduleExports;
+});
diff --git a/public/vs/language/typescript/tsWorker.js b/public/vs/language/typescript/tsWorker.js
new file mode 100644
index 0000000..57567b4
--- /dev/null
+++ b/public/vs/language/typescript/tsWorker.js
@@ -0,0 +1,37249 @@
+/*!-----------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
+ *-----------------------------------------------------------------------------*/
+define("vs/language/typescript/tsWorker", ["require", "require"], (require) => {
+    "use strict"; var moduleExports = (() => {
+        var rae = Object.defineProperty; var hit = Object.getOwnPropertyDescriptor; var git = Object.getOwnPropertyNames; var yit = Object.prototype.hasOwnProperty; var hke = (zd, ti) => { for (var gt in ti) rae(zd, gt, { get: ti[gt], enumerable: !0 }) }, vit = (zd, ti, gt, hs) => { if (ti && typeof ti == "object" || typeof ti == "function") for (let Mo of git(ti)) !yit.call(zd, Mo) && Mo !== gt && rae(zd, Mo, { get: () => ti[Mo], enumerable: !(hs = hit(ti, Mo)) || hs.enumerable }); return zd }; var bit = zd => vit(rae({}, "__esModule", { value: !0 }), zd); var kit = {}; hke(kit, { TypeScriptWorker: () => o8, create: () => Lit }); var oae = {}; hke(oae, { EndOfLineState: () => Sit, IndentStyle: () => Ait, ScriptKind: () => uA, ScriptTarget: () => Cit, TokenClass: () => Iit, createClassifier: () => Eit, createLanguageService: () => iae, displayPartsToString: () => Tit, flattenDiagnosticMessageText: () => xit, typescript: () => aae }); var d0 = void 0, IU = { exports: {} }; var f0 = (() => {
+            var zd = Object.defineProperty, ti = Object.getOwnPropertyNames, gt = (e, t) => function () { return e && (t = (0, e[ti(e)[0]])(e = 0)), t }, hs = (e, t) => function () { return t || (0, e[ti(e)[0]])((t = { exports: {} }).exports, t), t.exports }, Mo = (e, t) => { for (var r in t) zd(e, r, { get: t[r], enumerable: !0 }) }, Sg, Rf, LU, gke = gt({ "src/compiler/corePublic.ts"() { "use strict"; Sg = "5.0", Rf = "5.0.2", LU = (e => (e[e.LessThan = -1] = "LessThan", e[e.EqualTo = 0] = "EqualTo", e[e.GreaterThan = 1] = "GreaterThan", e))(LU || {}) } }); function Fn(e) { return e ? e.length : 0 } function mn(e, t) { if (e) for (let r = 0; r < e.length; r++) { let i = t(e[r], r); if (i) return i } } function sae(e, t) { if (e) for (let r = e.length - 1; r >= 0; r--) { let i = t(e[r], r); if (i) return i } } function ks(e, t) { if (e !== void 0) for (let r = 0; r < e.length; r++) { let i = t(e[r], r); if (i !== void 0) return i } } function FD(e, t) { for (let r of e) { let i = t(r); if (i !== void 0) return i } } function yke(e, t, r) { let i = r; if (e) { let o = 0; for (let s of e) i = t(i, s, o), o++ } return i } function kU(e, t, r) { let i = []; L.assertEqual(e.length, t.length); for (let o = 0; o < e.length; o++)i.push(r(e[o], t[o], o)); return i } function DU(e, t) { if (e.length <= 1) return e; let r = []; for (let i = 0, o = e.length; i < o; i++)i && r.push(t), r.push(e[i]); return r } function Ji(e, t) { if (e) { for (let r = 0; r < e.length; r++)if (!t(e[r], r)) return !1 } return !0 } function wr(e, t, r) { if (e !== void 0) for (let i = r ?? 0; i < e.length; i++) { let o = e[i]; if (t(o, i)) return o } } function dA(e, t, r) { if (e !== void 0) for (let i = r ?? e.length - 1; i >= 0; i--) { let o = e[i]; if (t(o, i)) return o } } function Yc(e, t, r) { if (e === void 0) return -1; for (let i = r ?? 0; i < e.length; i++)if (t(e[i], i)) return i; return -1 } function s8(e, t, r) { if (e === void 0) return -1; for (let i = r ?? e.length - 1; i >= 0; i--)if (t(e[i], i)) return i; return -1 } function vke(e, t) { for (let r = 0; r < e.length; r++) { let i = t(e[r], r); if (i) return i } return L.fail() } function ya(e, t, r = Zv) { if (e) { for (let i of e) if (r(i, t)) return !0 } return !1 } function GD(e, t, r = Zv) { return e.length === t.length && e.every((i, o) => r(i, t[o])) } function cae(e, t, r) { for (let i = r || 0; i < e.length; i++)if (ya(t, e.charCodeAt(i))) return i; return -1 } function Oy(e, t) { let r = 0; if (e) for (let i = 0; i < e.length; i++) { let o = e[i]; t(o, i) && r++ } return r } function Pr(e, t) { if (e) { let r = e.length, i = 0; for (; i < r && t(e[i]);)i++; if (i < r) { let o = e.slice(0, i); for (i++; i < r;) { let s = e[i]; t(s) && o.push(s), i++ } return o } } return e } function wU(e, t) { let r = 0; for (let i = 0; i < e.length; i++)t(e[i], i, e) && (e[r] = e[i], r++); e.length = r } function Om(e) { e.length = 0 } function on(e, t) { let r; if (e) { r = []; for (let i = 0; i < e.length; i++)r.push(t(e[i], i)) } return r } function* RU(e, t) { for (let r of e) yield t(r) } function Tl(e, t) { if (e) for (let r = 0; r < e.length; r++) { let i = e[r], o = t(i, r); if (i !== o) { let s = e.slice(0, r); for (s.push(o), r++; r < e.length; r++)s.push(t(e[r], r)); return s } } return e } function t_(e) { let t = []; for (let r of e) r && (ba(r) ? si(t, r) : t.push(r)); return t } function Uo(e, t) { let r; if (e) for (let i = 0; i < e.length; i++) { let o = t(e[i], i); o && (ba(o) ? r = si(r, o) : r = Sn(r, o)) } return r || Je } function BD(e, t) { let r = []; if (e) for (let i = 0; i < e.length; i++) { let o = t(e[i], i); o && (ba(o) ? si(r, o) : r.push(o)) } return r } function* OU(e, t) { for (let r of e) { let i = t(r); i && (yield* i) } } function lae(e, t) { let r; if (e) for (let i = 0; i < e.length; i++) { let o = e[i], s = t(o, i); (r || o !== s || ba(s)) && (r || (r = e.slice(0, i)), ba(s) ? si(r, s) : r.push(s)) } return r || e } function NU(e, t) { let r = []; for (let i = 0; i < e.length; i++) { let o = t(e[i], i); if (o === void 0) return; r.push(o) } return r } function Zi(e, t) { let r = []; if (e) for (let i = 0; i < e.length; i++) { let o = t(e[i], i); o !== void 0 && r.push(o) } return r } function* UD(e, t) { for (let r of e) { let i = t(r); i !== void 0 && (yield i) } } function bke(e, t) { if (!e) return; let r = new Map; return e.forEach((i, o) => { let s = t(o, i); if (s !== void 0) { let [l, f] = s; l !== void 0 && f !== void 0 && r.set(l, f) } }), r } function VD(e, t, r) { if (e.has(t)) return e.get(t); let i = r(); return e.set(t, i), i } function _0(e, t) { return e.has(t) ? !1 : (e.add(t), !0) } function* Eke(e) { yield e } function c8(e, t, r) { let i; if (e) { i = []; let o = e.length, s, l, f = 0, d = 0; for (; f < o;) { for (; d < o;) { let g = e[d]; if (l = t(g, d), d === 0) s = l; else if (l !== s) break; d++ } if (f < d) { let g = r(e.slice(f, d), s, f, d); g && i.push(g), f = d } s = l, d++ } } return i } function uae(e, t) { if (!e) return; let r = new Map; return e.forEach((i, o) => { let [s, l] = t(o, i); r.set(s, l) }), r } function vt(e, t) { if (e) if (t) { for (let r of e) if (t(r)) return !0 } else return e.length > 0; return !1 } function PU(e, t, r) { let i; for (let o = 0; o < e.length; o++)t(e[o]) ? i = i === void 0 ? o : i : i !== void 0 && (r(i, o), i = void 0); i !== void 0 && r(i, e.length) } function Qi(e, t) { return vt(t) ? vt(e) ? [...e, ...t] : t : e } function Tke(e, t) { return t } function jD(e) { return e.map(Tke) } function Ske(e, t, r) { let i = jD(e); _ae(e, i, r); let o = e[i[0]], s = [i[0]]; for (let l = 1; l < i.length; l++) { let f = i[l], d = e[f]; t(o, d) || (s.push(f), o = d) } return s.sort(), s.map(l => e[l]) } function xke(e, t) { let r = []; for (let i of e) Of(r, i, t); return r } function fA(e, t, r) { return e.length === 0 ? [] : e.length === 1 ? e.slice() : r ? Ske(e, t, r) : xke(e, t) } function Ake(e, t) { if (e.length === 0) return Je; let r = e[0], i = [r]; for (let o = 1; o < e.length; o++) { let s = e[o]; switch (t(s, r)) { case !0: case 0: continue; case -1: return L.fail("Array is unsorted.") }i.push(r = s) } return i } function MU() { return [] } function Ny(e, t, r, i) { if (e.length === 0) return e.push(t), !0; let o = Py(e, t, Ks, r); return o < 0 ? (e.splice(~o, 0, t), !0) : i ? (e.splice(o, 0, t), !0) : !1 } function HD(e, t, r) { return Ake(XC(e, t), r || t || su) } function dae(e, t) { if (e.length < 2) return !0; for (let r = 1, i = e.length; r < i; r++)if (t(e[r - 1], e[r]) === 1) return !1; return !0 } function l8(e, t, r, i) { let o = 3; if (e.length < 2) return o; let s = t(e[0]); for (let l = 1, f = e.length; l < f && o !== 0; l++) { let d = t(e[l]); o & 1 && r(s, d) > 0 && (o &= -2), o & 2 && i(s, d) > 0 && (o &= -3), s = d } return o } function up(e, t, r = Zv) { if (!e || !t) return e === t; if (e.length !== t.length) return !1; for (let i = 0; i < e.length; i++)if (!r(e[i], t[i], i)) return !1; return !0 } function WD(e) { let t; if (e) for (let r = 0; r < e.length; r++) { let i = e[r]; (t || !i) && (t || (t = e.slice(0, r)), i && t.push(i)) } return t || e } function fae(e, t, r) { if (!t || !e || t.length === 0 || e.length === 0) return t; let i = []; e: for (let o = 0, s = 0; s < t.length; s++) { s > 0 && L.assertGreaterThanOrEqual(r(t[s], t[s - 1]), 0); t: for (let l = o; o < e.length; o++)switch (o > l && L.assertGreaterThanOrEqual(r(e[o], e[o - 1]), 0), r(t[s], e[o])) { case -1: i.push(t[s]); continue e; case 0: continue e; case 1: continue t } } return i } function Sn(e, t) { return t === void 0 ? e : e === void 0 ? [t] : (e.push(t), e) } function _A(e, t) { return e === void 0 ? t : t === void 0 ? e : ba(e) ? ba(t) ? Qi(e, t) : Sn(e, t) : ba(t) ? Sn(t, e) : [e, t] } function FU(e, t) { return t < 0 ? e.length + t : t } function si(e, t, r, i) { if (t === void 0 || t.length === 0) return e; if (e === void 0) return t.slice(r, i); r = r === void 0 ? 0 : FU(t, r), i = i === void 0 ? t.length : FU(t, i); for (let o = r; o < i && o < t.length; o++)t[o] !== void 0 && e.push(t[o]); return e } function Of(e, t, r) { return ya(e, t, r) ? !1 : (e.push(t), !0) } function xg(e, t, r) { return e ? (Of(e, t, r), e) : [t] } function _ae(e, t, r) { t.sort((i, o) => r(e[i], e[o]) || Es(i, o)) } function XC(e, t) { return e.length === 0 ? e : e.slice().sort(t) } function* Cke(e) { for (let t = e.length - 1; t >= 0; t--)yield e[t] } function Ag(e, t) { let r = jD(e); return _ae(e, r, t), r.map(i => e[i]) } function GU(e, t, r, i) { for (; r < i;) { if (e[r] !== t[r]) return !1; r++ } return !0 } function Sl(e) { return e === void 0 || e.length === 0 ? void 0 : e[0] } function u8(e) { if (e) for (let t of e) return t } function Vo(e) { return L.assert(e.length !== 0), e[0] } function pae(e) { for (let t of e) return t; L.fail("iterator is empty") } function Os(e) { return e === void 0 || e.length === 0 ? void 0 : e[e.length - 1] } function To(e) { return L.assert(e.length !== 0), e[e.length - 1] } function Wp(e) { return e && e.length === 1 ? e[0] : void 0 } function BU(e) { return L.checkDefined(Wp(e)) } function zp(e) { return e && e.length === 1 ? e[0] : e } function UU(e, t, r) { let i = e.slice(0); return i[t] = r, i } function Py(e, t, r, i, o) { return j1(e, r(t), r, i, o) } function j1(e, t, r, i, o) { if (!vt(e)) return -1; let s = o || 0, l = e.length - 1; for (; s <= l;) { let f = s + (l - s >> 1), d = r(e[f], f); switch (i(d, t)) { case -1: s = f + 1; break; case 0: return f; case 1: l = f - 1; break } } return ~s } function ou(e, t, r, i, o) { if (e && e.length > 0) { let s = e.length; if (s > 0) { let l = i === void 0 || i < 0 ? 0 : i, f = o === void 0 || l + o > s - 1 ? s - 1 : l + o, d; for (arguments.length <= 2 ? (d = e[l], l++) : d = r; l <= f;)d = t(d, e[l], l), l++; return d } } return r } function fs(e, t) { return Lg.call(e, t) } function zD(e, t) { return Lg.call(e, t) ? e[t] : void 0 } function bh(e) { let t = []; for (let r in e) Lg.call(e, r) && t.push(r); return t } function Ike(e) { let t = []; do { let r = Object.getOwnPropertyNames(e); for (let i of r) Of(t, i) } while (e = Object.getPrototypeOf(e)); return t } function H1(e) { let t = []; for (let r in e) Lg.call(e, r) && t.push(e[r]); return t } function mae(e, t) { let r = new Array(e); for (let i = 0; i < e; i++)r[i] = t(i); return r } function lo(e, t) { let r = []; for (let i of e) r.push(t ? t(i) : i); return r } function JD(e, ...t) { for (let r of t) if (r !== void 0) for (let i in r) fs(r, i) && (e[i] = r[i]); return e } function hae(e, t, r = Zv) { if (e === t) return !0; if (!e || !t) return !1; for (let i in e) if (Lg.call(e, i) && (!Lg.call(t, i) || !r(e[i], t[i]))) return !1; for (let i in t) if (Lg.call(t, i) && !Lg.call(e, i)) return !1; return !0 } function p0(e, t, r = Ks) { let i = new Map; for (let o of e) { let s = t(o); s !== void 0 && i.set(s, r(o)) } return i } function gae(e, t, r = Ks) { let i = []; for (let o of e) i[t(o)] = r(o); return i } function KD(e, t, r = Ks) { let i = Nf(); for (let o of e) i.add(t(o), r(o)); return i } function YC(e, t, r = Ks) { return lo(KD(e, t).values(), r) } function yae(e, t) { var r; let i = {}; if (e) for (let o of e) { let s = `${t(o)}`; ((r = i[s]) != null ? r : i[s] = []).push(o) } return i } function VU(e) { let t = {}; for (let r in e) Lg.call(e, r) && (t[r] = e[r]); return t } function d8(e, t) { let r = {}; for (let i in t) Lg.call(t, i) && (r[i] = t[i]); for (let i in e) Lg.call(e, i) && (r[i] = e[i]); return r } function jU(e, t) { for (let r in t) Lg.call(t, r) && (e[r] = t[r]) } function ho(e, t) { return t ? t.bind(e) : void 0 } function Nf() { let e = new Map; return e.add = Lke, e.remove = kke, e } function Lke(e, t) { let r = this.get(e); return r ? r.push(t) : this.set(e, r = [t]), r } function kke(e, t) { let r = this.get(e); r && (YD(r, t), r.length || this.delete(e)) } function vae() { return Nf() } function HU(e) { let t = e?.slice() || [], r = 0; function i() { return r === t.length } function o(...l) { t.push(...l) } function s() { if (i()) throw new Error("Queue is empty"); let l = t[r]; if (t[r] = void 0, r++, r > 100 && r > t.length >> 1) { let f = t.length - r; t.copyWithin(0, r), t.length = f, r = 0 } return l } return { enqueue: o, dequeue: s, isEmpty: i } } function Dke(e, t) { let r = new Map, i = 0; function* o() { for (let l of r.values()) ba(l) ? yield* l : yield l } let s = { has(l) { let f = e(l); if (!r.has(f)) return !1; let d = r.get(f); if (!ba(d)) return t(d, l); for (let g of d) if (t(g, l)) return !0; return !1 }, add(l) { let f = e(l); if (r.has(f)) { let d = r.get(f); if (ba(d)) ya(d, l, t) || (d.push(l), i++); else { let g = d; t(g, l) || (r.set(f, [g, l]), i++) } } else r.set(f, l), i++; return this }, delete(l) { let f = e(l); if (!r.has(f)) return !1; let d = r.get(f); if (ba(d)) { for (let g = 0; g < d.length; g++)if (t(d[g], l)) return d.length === 1 ? r.delete(f) : d.length === 2 ? r.set(f, d[1 - g]) : zU(d, g), i--, !0 } else if (t(d, l)) return r.delete(f), i--, !0; return !1 }, clear() { r.clear(), i = 0 }, get size() { return i }, forEach(l) { for (let f of lo(r.values())) if (ba(f)) for (let d of f) l(d, d, s); else { let d = f; l(d, d, s) } }, keys() { return o() }, values() { return o() }, *entries() { for (let l of o()) yield [l, l] }, [Symbol.iterator]: () => o(), [Symbol.toStringTag]: r[Symbol.toStringTag] }; return s } function ba(e) { return Array.isArray(e) } function qD(e) { return ba(e) ? e : [e] } function Ta(e) { return typeof e == "string" } function Cg(e) { return typeof e == "number" } function zr(e, t) { return e !== void 0 && t(e) ? e : void 0 } function Ga(e, t) { return e !== void 0 && t(e) ? e : L.fail(`Invalid cast. The supplied value ${e} did not pass the test '${L.getFunctionName(t)}'.`) } function Ba(e) { } function m0() { return !1 } function h0() { return !0 } function Qv() { } function Ks(e) { return e } function bae(e) { return e.toLowerCase() } function n_(e) { return YU.test(e) ? e.replace(YU, bae) : e } function Sa() { throw new Error("Not implemented") } function zu(e) { let t; return () => (e && (t = e(), e = void 0), t) } function Jp(e) { let t = new Map; return r => { let i = `${typeof r}:${r}`, o = t.get(i); return o === void 0 && !t.has(i) && (o = e(r), t.set(i, o)), o } } function wke(e) { let t = new WeakMap; return r => { let i = t.get(r); return i === void 0 && !t.has(r) && (i = e(r), t.set(r, i)), i } } function Eae(e, t) { return (...r) => { let i = t.get(r); return i === void 0 && !t.has(r) && (i = e(...r), t.set(r, i)), i } } function Rke(e, t, r, i, o) { if (o) { let s = []; for (let l = 0; l < arguments.length; l++)s[l] = arguments[l]; return l => ou(s, (f, d) => d(f), l) } else return i ? s => i(r(t(e(s)))) : r ? s => r(t(e(s))) : t ? s => t(e(s)) : e ? s => e(s) : s => s } function Zv(e, t) { return e === t } function W1(e, t) { return e === t || e !== void 0 && t !== void 0 && e.toUpperCase() === t.toUpperCase() } function z1(e, t) { return Zv(e, t) } function Tae(e, t) { return e === t ? 0 : e === void 0 ? -1 : t === void 0 ? 1 : e < t ? -1 : 1 } function Es(e, t) { return Tae(e, t) } function f8(e, t) { return Es(e?.start, t?.start) || Es(e?.length, t?.length) } function WU(e, t) { return ou(e, (r, i) => t(r, i) === -1 ? r : i) } function _8(e, t) { return e === t ? 0 : e === void 0 ? -1 : t === void 0 ? 1 : (e = e.toUpperCase(), t = t.toUpperCase(), e < t ? -1 : e > t ? 1 : 0) } function Sae(e, t) { return e === t ? 0 : e === void 0 ? -1 : t === void 0 ? 1 : (e = e.toLowerCase(), t = t.toLowerCase(), e < t ? -1 : e > t ? 1 : 0) } function su(e, t) { return Tae(e, t) } function p8(e) { return e ? _8 : su } function xae() { return T8 } function Aae(e) { T8 !== e && (T8 = e, QU = void 0) } function XD(e, t) { return (QU || (QU = Mae(T8)))(e, t) } function Cae(e, t, r, i) { return e === t ? 0 : e === void 0 ? -1 : t === void 0 ? 1 : i(e[r], t[r]) } function g0(e, t) { return Es(e ? 1 : 0, t ? 1 : 0) } function $C(e, t, r) { let i = Math.max(2, Math.floor(e.length * .34)), o = Math.floor(e.length * .4) + 1, s; for (let l of t) { let f = r(l); if (f !== void 0 && Math.abs(f.length - e.length) <= i) { if (f === e || f.length < 3 && f.toLowerCase() !== e.toLowerCase()) continue; let d = Oke(e, f, o - .1); if (d === void 0) continue; L.assert(d < o), o = d, s = l } } return s } function Oke(e, t, r) { let i = new Array(t.length + 1), o = new Array(t.length + 1), s = r + .01; for (let f = 0; f <= t.length; f++)i[f] = f; for (let f = 1; f <= e.length; f++) { let d = e.charCodeAt(f - 1), g = Math.ceil(f > r ? f - r : 1), m = Math.floor(t.length > r + f ? r + f : t.length); o[0] = f; let v = f; for (let x = 1; x < g; x++)o[x] = s; for (let x = g; x <= m; x++) { let A = e[f - 1].toLowerCase() === t[x - 1].toLowerCase() ? i[x - 1] + .1 : i[x - 1] + 2, w = d === t.charCodeAt(x - 1) ? i[x - 1] : Math.min(i[x] + 1, o[x - 1] + 1, A); o[x] = w, v = Math.min(v, w) } for (let x = m + 1; x <= t.length; x++)o[x] = s; if (v > r) return; let S = i; i = o, o = S } let l = i[t.length]; return l > r ? void 0 : l } function Oc(e, t) { let r = e.length - t.length; return r >= 0 && e.indexOf(t, r) === r } function pA(e, t) { return Oc(e, t) ? e.slice(0, e.length - t.length) : e } function Iae(e, t) { return Oc(e, t) ? e.slice(0, e.length - t.length) : void 0 } function jl(e, t) { return e.indexOf(t) !== -1 } function Lae(e) { let t = e.length; for (let r = t - 1; r > 0; r--) { let i = e.charCodeAt(r); if (i >= 48 && i <= 57) do --r, i = e.charCodeAt(r); while (r > 0 && i >= 48 && i <= 57); else if (r > 4 && (i === 110 || i === 78)) { if (--r, i = e.charCodeAt(r), i !== 105 && i !== 73 || (--r, i = e.charCodeAt(r), i !== 109 && i !== 77)) break; --r, i = e.charCodeAt(r) } else break; if (i !== 45 && i !== 46) break; t = r } return t === e.length ? e : e.slice(0, t) } function m8(e, t) { for (let r = 0; r < e.length; r++)if (e[r] === t) return y0(e, r), !0; return !1 } function y0(e, t) { for (let r = t; r < e.length - 1; r++)e[r] = e[r + 1]; e.pop() } function zU(e, t) { e[t] = e[e.length - 1], e.pop() } function YD(e, t) { return Nke(e, r => r === t) } function Nke(e, t) { for (let r = 0; r < e.length; r++)if (t(e[r])) return zU(e, r), !0; return !1 } function Dl(e) { return e ? Ks : n_ } function kae({ prefix: e, suffix: t }) { return `${e}*${t}` } function Dae(e, t) { return L.assert(h8(e, t)), t.substring(e.prefix.length, t.length - e.suffix.length) } function JU(e, t, r) { let i, o = -1; for (let s of e) { let l = t(s); h8(l, r) && l.prefix.length > o && (o = l.prefix.length, i = s) } return i } function na(e, t) { return e.lastIndexOf(t, 0) === 0 } function QC(e, t) { return na(e, t) ? e.substr(t.length) : e } function KU(e, t, r = Ks) { return na(r(e), r(t)) ? e.substring(t.length) : void 0 } function h8({ prefix: e, suffix: t }, r) { return r.length >= e.length + t.length && na(r, e) && Oc(r, t) } function g8(e, t) { return r => e(r) && t(r) } function Kp(...e) { return (...t) => { let r; for (let i of e) if (r = i(...t), r) return r; return r } } function y8(e) { return (...t) => !e(...t) } function Pke(e) { } function aT(e) { return e === void 0 ? void 0 : [e] } function wae(e, t, r, i, o, s) { s = s || Ba; let l = 0, f = 0, d = e.length, g = t.length, m = !1; for (; l < d && f < g;) { let v = e[l], S = t[f], x = r(v, S); x === -1 ? (i(v), l++, m = !0) : x === 1 ? (o(S), f++, m = !0) : (s(S, v), l++, f++) } for (; l < d;)i(e[l++]), m = !0; for (; f < g;)o(t[f++]), m = !0; return m } function Rae(e) { let t = []; return Oae(e, t, void 0, 0), t } function Oae(e, t, r, i) { for (let o of e[i]) { let s; r ? (s = r.slice(), s.push(o)) : s = [o], i === e.length - 1 ? t.push(s) : Oae(e, t, s, i + 1) } } function J1(e, t, r = " ") { return t <= e.length ? e : r.repeat(t - e.length) + e } function Mke(e, t, r = " ") { return t <= e.length ? e : e + r.repeat(t - e.length) } function v8(e, t) { if (e) { let r = e.length, i = 0; for (; i < r && t(e[i]);)i++; return e.slice(0, i) } } function Nae(e, t) { if (e) { let r = e.length, i = 0; for (; i < r && t(e[i]);)i++; return e.slice(i) } } function Fke(e) { let t = e.length - 1; for (; t >= 0 && xh(e.charCodeAt(t));)t--; return e.slice(0, t + 1) } function qU() { return typeof process < "u" && process.nextTick && !process.browser && typeof IU == "object" } var Je, b8, Pae, XU, Ig, Lg, E8, YU, $U, Mae, QU, T8, v0, $D, ZC, Gke = gt({ "src/compiler/core.ts"() { "use strict"; fa(), Je = [], b8 = new Map, Pae = new Set, XU = (e => (e[e.None = 0] = "None", e[e.CaseSensitive = 1] = "CaseSensitive", e[e.CaseInsensitive = 2] = "CaseInsensitive", e[e.Both = 3] = "Both", e))(XU || {}), Ig = Array.prototype.at ? (e, t) => e?.at(t) : (e, t) => { if (e && (t = FU(e, t), t < e.length)) return e[t] }, Lg = Object.prototype.hasOwnProperty, E8 = { push: Ba, length: 0 }, YU = /[^\u0130\u0131\u00DFa-z0-9\\/:\-_\. ]+/g, $U = (e => (e[e.None = 0] = "None", e[e.Normal = 1] = "Normal", e[e.Aggressive = 2] = "Aggressive", e[e.VeryAggressive = 3] = "VeryAggressive", e))($U || {}), Mae = (() => { let e, t, r = f(); return d; function i(g, m, v) { if (g === m) return 0; if (g === void 0) return -1; if (m === void 0) return 1; let S = v(g, m); return S < 0 ? -1 : S > 0 ? 1 : 0 } function o(g) { let m = new Intl.Collator(g, { usage: "sort", sensitivity: "variant" }).compare; return (v, S) => i(v, S, m) } function s(g) { if (g !== void 0) return l(); return (v, S) => i(v, S, m); function m(v, S) { return v.localeCompare(S) } } function l() { return (v, S) => i(v, S, g); function g(v, S) { return m(v.toUpperCase(), S.toUpperCase()) || m(v, S) } function m(v, S) { return v < S ? -1 : v > S ? 1 : 0 } } function f() { return typeof Intl == "object" && typeof Intl.Collator == "function" ? o : typeof String.prototype.localeCompare == "function" && typeof String.prototype.toLocaleUpperCase == "function" && "a".localeCompare("B") < 0 ? s : l } function d(g) { return g === void 0 ? e || (e = r(g)) : g === "en-US" ? t || (t = r(g)) : r(g) } })(), v0 = String.prototype.trim ? e => e.trim() : e => $D(ZC(e)), $D = String.prototype.trimEnd ? e => e.trimEnd() : Fke, ZC = String.prototype.trimStart ? e => e.trimStart() : e => e.replace(/^\s+/g, "") } }), ZU, L, Bke = gt({
+                "src/compiler/debug.ts"() {
+                    "use strict"; fa(), fa(), ZU = (e => (e[e.Off = 0] = "Off", e[e.Error = 1] = "Error", e[e.Warning = 2] = "Warning", e[e.Info = 3] = "Info", e[e.Verbose = 4] = "Verbose", e))(ZU || {}), (e => {
+                        let t = 0; e.currentLogLevel = 2, e.isDebugging = !1; function r(Dt) { return e.currentLogLevel <= Dt } e.shouldLog = r; function i(Dt, pn) { e.loggingHost && r(Dt) && e.loggingHost.log(Dt, pn) } function o(Dt) { i(3, Dt) } e.log = o, (Dt => { function pn(ri) { i(1, ri) } Dt.error = pn; function An(ri) { i(2, ri) } Dt.warn = An; function Kn(ri) { i(3, ri) } Dt.log = Kn; function hi(ri) { i(4, ri) } Dt.trace = hi })(o = e.log || (e.log = {})); let s = {}; function l() { return t } e.getAssertionLevel = l; function f(Dt) { let pn = t; if (t = Dt, Dt > pn) for (let An of bh(s)) { let Kn = s[An]; Kn !== void 0 && e[An] !== Kn.assertion && Dt >= Kn.level && (e[An] = Kn, s[An] = void 0) } } e.setAssertionLevel = f; function d(Dt) { return t >= Dt } e.shouldAssert = d; function g(Dt, pn) { return d(Dt) ? !0 : (s[pn] = { level: Dt, assertion: e[pn] }, e[pn] = Ba, !1) } function m(Dt, pn) { let An = new Error(Dt ? `Debug Failure. ${Dt}` : "Debug Failure."); throw Error.captureStackTrace && Error.captureStackTrace(An, pn || m), An } e.fail = m; function v(Dt, pn, An) {
+                            return m(`${pn || "Unexpected node."}\r
+Node ${Ve(Dt.kind)} was unexpected.`, An || v)
+                        } e.failBadSyntaxKind = v; function S(Dt, pn, An, Kn) {
+                            Dt || (pn = pn ? `False expression: ${pn}` : "False expression.", An && (pn += `\r
+Verbose Debug Information: `+ (typeof An == "string" ? An : An())), m(pn, Kn || S))
+                        } e.assert = S; function x(Dt, pn, An, Kn, hi) { if (Dt !== pn) { let ri = An ? Kn ? `${An} ${Kn}` : An : ""; m(`Expected ${Dt} === ${pn}. ${ri}`, hi || x) } } e.assertEqual = x; function A(Dt, pn, An, Kn) { Dt >= pn && m(`Expected ${Dt} < ${pn}. ${An || ""}`, Kn || A) } e.assertLessThan = A; function w(Dt, pn, An) { Dt > pn && m(`Expected ${Dt} <= ${pn}`, An || w) } e.assertLessThanOrEqual = w; function C(Dt, pn, An) { Dt < pn && m(`Expected ${Dt} >= ${pn}`, An || C) } e.assertGreaterThanOrEqual = C; function P(Dt, pn, An) { Dt == null && m(pn, An || P) } e.assertIsDefined = P; function F(Dt, pn, An) { return P(Dt, pn, An || F), Dt } e.checkDefined = F; function B(Dt, pn, An) { for (let Kn of Dt) P(Kn, pn, An || B) } e.assertEachIsDefined = B; function q(Dt, pn, An) { return B(Dt, pn, An || q), Dt } e.checkEachDefined = q; function W(Dt, pn = "Illegal value:", An) { let Kn = typeof Dt == "object" && fs(Dt, "kind") && fs(Dt, "pos") ? "SyntaxKind: " + Ve(Dt.kind) : JSON.stringify(Dt); return m(`${pn} ${Kn}`, An || W) } e.assertNever = W; function Y(Dt, pn, An, Kn) { g(1, "assertEachNode") && S(pn === void 0 || Ji(Dt, pn), An || "Unexpected node.", () => `Node array did not pass test '${re(pn)}'.`, Kn || Y) } e.assertEachNode = Y; function R(Dt, pn, An, Kn) { g(1, "assertNode") && S(Dt !== void 0 && (pn === void 0 || pn(Dt)), An || "Unexpected node.", () => `Node ${Ve(Dt?.kind)} did not pass test '${re(pn)}'.`, Kn || R) } e.assertNode = R; function ie(Dt, pn, An, Kn) { g(1, "assertNotNode") && S(Dt === void 0 || pn === void 0 || !pn(Dt), An || "Unexpected node.", () => `Node ${Ve(Dt.kind)} should not have passed test '${re(pn)}'.`, Kn || ie) } e.assertNotNode = ie; function $(Dt, pn, An, Kn) { g(1, "assertOptionalNode") && S(pn === void 0 || Dt === void 0 || pn(Dt), An || "Unexpected node.", () => `Node ${Ve(Dt?.kind)} did not pass test '${re(pn)}'.`, Kn || $) } e.assertOptionalNode = $; function fe(Dt, pn, An, Kn) { g(1, "assertOptionalToken") && S(pn === void 0 || Dt === void 0 || Dt.kind === pn, An || "Unexpected node.", () => `Node ${Ve(Dt?.kind)} was not a '${Ve(pn)}' token.`, Kn || fe) } e.assertOptionalToken = fe; function Z(Dt, pn, An) { g(1, "assertMissingNode") && S(Dt === void 0, pn || "Unexpected node.", () => `Node ${Ve(Dt.kind)} was unexpected'.`, An || Z) } e.assertMissingNode = Z; function U(Dt) { } e.type = U; function re(Dt) { if (typeof Dt != "function") return ""; if (fs(Dt, "name")) return Dt.name; { let pn = Function.prototype.toString.call(Dt), An = /^function\s+([\w\$]+)\s*\(/.exec(pn); return An ? An[1] : "" } } e.getFunctionName = re; function le(Dt) { return `{ name: ${Gi(Dt.escapedName)}; flags: ${Be(Dt.flags)}; declarations: ${on(Dt.declarations, pn => Ve(pn.kind))} }` } e.formatSymbol = le; function _e(Dt = 0, pn, An) { let Kn = X(pn); if (Dt === 0) return Kn.length > 0 && Kn[0][0] === 0 ? Kn[0][1] : "0"; if (An) { let hi = [], ri = Dt; for (let [vn, Ht] of Kn) { if (vn > Dt) break; vn !== 0 && vn & Dt && (hi.push(Ht), ri &= ~vn) } if (ri === 0) return hi.join("|") } else for (let [hi, ri] of Kn) if (hi === Dt) return ri; return Dt.toString() } e.formatEnum = _e; let ge = new Map; function X(Dt) { let pn = ge.get(Dt); if (pn) return pn; let An = []; for (let hi in Dt) { let ri = Dt[hi]; typeof ri == "number" && An.push([ri, hi]) } let Kn = Ag(An, (hi, ri) => Es(hi[0], ri[0])); return ge.set(Dt, Kn), Kn } function Ve(Dt) { return _e(Dt, I8, !1) } e.formatSyntaxKind = Ve; function we(Dt) { return _e(Dt, B8, !1) } e.formatSnippetKind = we; function ke(Dt) { return _e(Dt, L8, !0) } e.formatNodeFlags = ke; function Pe(Dt) { return _e(Dt, k8, !0) } e.formatModifierFlags = Pe; function Ce(Dt) { return _e(Dt, G8, !0) } e.formatTransformFlags = Ce; function Ie(Dt) { return _e(Dt, U8, !0) } e.formatEmitFlags = Ie; function Be(Dt) { return _e(Dt, O8, !0) } e.formatSymbolFlags = Be; function Ne(Dt) { return _e(Dt, N8, !0) } e.formatTypeFlags = Ne; function Le(Dt) { return _e(Dt, M8, !0) } e.formatSignatureFlags = Le; function Ye(Dt) { return _e(Dt, P8, !0) } e.formatObjectFlags = Ye; function _t(Dt) { return _e(Dt, tw, !0) } e.formatFlowFlags = _t; function ct(Dt) { return _e(Dt, D8, !0) } e.formatRelationComparisonResult = ct; function Rt(Dt) { return _e(Dt, _F, !0) } e.formatCheckMode = Rt; function We(Dt) { return _e(Dt, pF, !0) } e.formatSignatureCheckMode = We; function qe(Dt) { return _e(Dt, dF, !0) } e.formatTypeFacts = qe; let zt = !1, Qt; function tn(Dt) { "__debugFlowFlags" in Dt || Object.defineProperties(Dt, { __tsDebuggerDisplay: { value() { let pn = this.flags & 2 ? "FlowStart" : this.flags & 4 ? "FlowBranchLabel" : this.flags & 8 ? "FlowLoopLabel" : this.flags & 16 ? "FlowAssignment" : this.flags & 32 ? "FlowTrueCondition" : this.flags & 64 ? "FlowFalseCondition" : this.flags & 128 ? "FlowSwitchClause" : this.flags & 256 ? "FlowArrayMutation" : this.flags & 512 ? "FlowCall" : this.flags & 1024 ? "FlowReduceLabel" : this.flags & 1 ? "FlowUnreachable" : "UnknownFlow", An = this.flags & -2048; return `${pn}${An ? ` (${_t(An)})` : ""}` } }, __debugFlowFlags: { get() { return _e(this.flags, tw, !0) } }, __debugToString: { value() { return nn(this) } } }) } function kn(Dt) { zt && (typeof Object.setPrototypeOf == "function" ? (Qt || (Qt = Object.create(Object.prototype), tn(Qt)), Object.setPrototypeOf(Dt, Qt)) : tn(Dt)) } e.attachFlowNodeDebugInfo = kn; let _n; function Gt(Dt) { "__tsDebuggerDisplay" in Dt || Object.defineProperties(Dt, { __tsDebuggerDisplay: { value(pn) { return pn = String(pn).replace(/(?:,[\s\w\d_]+:[^,]+)+\]$/, "]"), `NodeArray ${pn}` } } }) } function $n(Dt) { zt && (typeof Object.setPrototypeOf == "function" ? (_n || (_n = Object.create(Array.prototype), Gt(_n)), Object.setPrototypeOf(Dt, _n)) : Gt(Dt)) } e.attachNodeArrayDebugInfo = $n; function ui() { if (zt) return; let Dt = new WeakMap, pn = new WeakMap; Object.defineProperties(ml.getSymbolConstructor().prototype, { __tsDebuggerDisplay: { value() { let Kn = this.flags & 33554432 ? "TransientSymbol" : "Symbol", hi = this.flags & -33554433; return `${Kn} '${fc(this)}'${hi ? ` (${Be(hi)})` : ""}` } }, __debugFlags: { get() { return Be(this.flags) } } }), Object.defineProperties(ml.getTypeConstructor().prototype, { __tsDebuggerDisplay: { value() { let Kn = this.flags & 98304 ? "NullableType" : this.flags & 384 ? `LiteralType ${JSON.stringify(this.value)}` : this.flags & 2048 ? `LiteralType ${this.value.negative ? "-" : ""}${this.value.base10Value}n` : this.flags & 8192 ? "UniqueESSymbolType" : this.flags & 32 ? "EnumType" : this.flags & 67359327 ? `IntrinsicType ${this.intrinsicName}` : this.flags & 1048576 ? "UnionType" : this.flags & 2097152 ? "IntersectionType" : this.flags & 4194304 ? "IndexType" : this.flags & 8388608 ? "IndexedAccessType" : this.flags & 16777216 ? "ConditionalType" : this.flags & 33554432 ? "SubstitutionType" : this.flags & 262144 ? "TypeParameter" : this.flags & 524288 ? this.objectFlags & 3 ? "InterfaceType" : this.objectFlags & 4 ? "TypeReference" : this.objectFlags & 8 ? "TupleType" : this.objectFlags & 16 ? "AnonymousType" : this.objectFlags & 32 ? "MappedType" : this.objectFlags & 1024 ? "ReverseMappedType" : this.objectFlags & 256 ? "EvolvingArrayType" : "ObjectType" : "Type", hi = this.flags & 524288 ? this.objectFlags & -1344 : 0; return `${Kn}${this.symbol ? ` '${fc(this.symbol)}'` : ""}${hi ? ` (${Ye(hi)})` : ""}` } }, __debugFlags: { get() { return Ne(this.flags) } }, __debugObjectFlags: { get() { return this.flags & 524288 ? Ye(this.objectFlags) : "" } }, __debugTypeToString: { value() { let Kn = Dt.get(this); return Kn === void 0 && (Kn = this.checker.typeToString(this), Dt.set(this, Kn)), Kn } } }), Object.defineProperties(ml.getSignatureConstructor().prototype, { __debugFlags: { get() { return Le(this.flags) } }, __debugSignatureToString: { value() { var Kn; return (Kn = this.checker) == null ? void 0 : Kn.signatureToString(this) } } }); let An = [ml.getNodeConstructor(), ml.getIdentifierConstructor(), ml.getTokenConstructor(), ml.getSourceFileConstructor()]; for (let Kn of An) fs(Kn.prototype, "__debugKind") || Object.defineProperties(Kn.prototype, { __tsDebuggerDisplay: { value() { return `${tc(this) ? "GeneratedIdentifier" : Re(this) ? `Identifier '${vr(this)}'` : pi(this) ? `PrivateIdentifier '${vr(this)}'` : yo(this) ? `StringLiteral ${JSON.stringify(this.text.length < 10 ? this.text : this.text.slice(10) + "...")}` : Vf(this) ? `NumericLiteral ${this.text}` : a3(this) ? `BigIntLiteral ${this.text}n` : _c(this) ? "TypeParameterDeclaration" : ha(this) ? "ParameterDeclaration" : Ec(this) ? "ConstructorDeclaration" : p_(this) ? "GetAccessorDeclaration" : Sf(this) ? "SetAccessorDeclaration" : _2(this) ? "CallSignatureDeclaration" : uO(this) ? "ConstructSignatureDeclaration" : kS(this) ? "IndexSignatureDeclaration" : l3(this) ? "TypePredicateNode" : m_(this) ? "TypeReferenceNode" : Jm(this) ? "FunctionTypeNode" : yL(this) ? "ConstructorTypeNode" : vL(this) ? "TypeQueryNode" : Rd(this) ? "TypeLiteralNode" : wz(this) ? "ArrayTypeNode" : p2(this) ? "TupleTypeNode" : Rz(this) ? "OptionalTypeNode" : Oz(this) ? "RestTypeNode" : DS(this) ? "UnionTypeNode" : dO(this) ? "IntersectionTypeNode" : m2(this) ? "ConditionalTypeNode" : h2(this) ? "InferTypeNode" : wS(this) ? "ParenthesizedTypeNode" : u3(this) ? "ThisTypeNode" : RS(this) ? "TypeOperatorNode" : OS(this) ? "IndexedAccessTypeNode" : EL(this) ? "MappedTypeNode" : mb(this) ? "LiteralTypeNode" : bL(this) ? "NamedTupleMember" : Mh(this) ? "ImportTypeNode" : Ve(this.kind)}${this.flags ? ` (${ke(this.flags)})` : ""}` } }, __debugKind: { get() { return Ve(this.kind) } }, __debugNodeFlags: { get() { return ke(this.flags) } }, __debugModifierFlags: { get() { return Pe(qce(this)) } }, __debugTransformFlags: { get() { return Ce(this.transformFlags) } }, __debugIsParseTreeNode: { get() { return dI(this) } }, __debugEmitFlags: { get() { return Ie(Ya(this)) } }, __debugGetText: { value(hi) { if (ws(this)) return ""; let ri = pn.get(this); if (ri === void 0) { let vn = ea(this), Ht = vn && Gn(vn); ri = Ht ? k0(Ht, vn, hi) : "", pn.set(this, ri) } return ri } } }); zt = !0 } e.enableDebugInfo = ui; function Ni(Dt) { let pn = Dt & 7, An = pn === 0 ? "in out" : pn === 3 ? "[bivariant]" : pn === 2 ? "in" : pn === 1 ? "out" : pn === 4 ? "[independent]" : ""; return Dt & 8 ? An += " (unmeasurable)" : Dt & 16 && (An += " (unreliable)"), An } e.formatVariance = Ni; class Pi {
+                            __debugToString() {
+                                var pn; switch (this.kind) {
+                                    case 3: return ((pn = this.debugInfo) == null ? void 0 : pn.call(this)) || "(function mapper)"; case 0: return `${this.source.__debugTypeToString()} -> ${this.target.__debugTypeToString()}`; case 1: return kU(this.sources, this.targets || on(this.sources, () => "any"), (An, Kn) => `${An.__debugTypeToString()} -> ${typeof Kn == "string" ? Kn : Kn.__debugTypeToString()}`).join(", "); case 2: return kU(this.sources, this.targets, (An, Kn) => `${An.__debugTypeToString()} -> ${Kn().__debugTypeToString()}`).join(", "); case 5: case 4: return `m1: ${this.mapper1.__debugToString().split(`
+`).join(`
+    `)}
+m2: ${this.mapper2.__debugToString().split(`
+`).join(`
+    `)}`; default: return W(this)
+                                }
+                            }
+                        } e.DebugTypeMapper = Pi; function gr(Dt) { return e.isDebugging ? Object.setPrototypeOf(Dt, Pi.prototype) : Dt } e.attachDebugPrototypeIfDebug = gr; function pt(Dt) { return console.log(nn(Dt)) } e.printControlFlowGraph = pt; function nn(Dt) {
+                            let pn = -1; function An(pe) { return pe.id || (pe.id = pn, pn--), pe.id } let Kn; (pe => { pe.lr = "\u2500", pe.ud = "\u2502", pe.dr = "\u256D", pe.dl = "\u256E", pe.ul = "\u256F", pe.ur = "\u2570", pe.udr = "\u251C", pe.udl = "\u2524", pe.dlr = "\u252C", pe.ulr = "\u2534", pe.udlr = "\u256B" })(Kn || (Kn = {})); let hi; (pe => { pe[pe.None = 0] = "None", pe[pe.Up = 1] = "Up", pe[pe.Down = 2] = "Down", pe[pe.Left = 4] = "Left", pe[pe.Right = 8] = "Right", pe[pe.UpDown = 3] = "UpDown", pe[pe.LeftRight = 12] = "LeftRight", pe[pe.UpLeft = 5] = "UpLeft", pe[pe.UpRight = 9] = "UpRight", pe[pe.DownLeft = 6] = "DownLeft", pe[pe.DownRight = 10] = "DownRight", pe[pe.UpDownLeft = 7] = "UpDownLeft", pe[pe.UpDownRight = 11] = "UpDownRight", pe[pe.UpLeftRight = 13] = "UpLeftRight", pe[pe.DownLeftRight = 14] = "DownLeftRight", pe[pe.UpDownLeftRight = 15] = "UpDownLeftRight", pe[pe.NoChildren = 16] = "NoChildren" })(hi || (hi = {})); let ri = 2032, vn = 882, Ht = Object.create(null), En = [], dr = [], Cr = G(Dt, new Set); for (let pe of En) pe.text = ae(pe.flowNode, pe.circular), je(pe); let Se = Ge(Cr), at = kt(Se); return Kt(Cr, 0), rt(); function Tt(pe) { return !!(pe.flags & 128) } function ve(pe) { return !!(pe.flags & 12) && !!pe.antecedents } function nt(pe) { return !!(pe.flags & ri) } function ce(pe) { return !!(pe.flags & vn) } function Q(pe) { let z = []; for (let Te of pe.edges) Te.source === pe && z.push(Te.target); return z } function ue(pe) { let z = []; for (let Te of pe.edges) Te.target === pe && z.push(Te.source); return z } function G(pe, z) { let Te = An(pe), j = Ht[Te]; if (j && z.has(pe)) return j.circular = !0, j = { id: -1, flowNode: pe, edges: [], text: "", lane: -1, endLane: -1, level: -1, circular: "circularity" }, En.push(j), j; if (z.add(pe), !j) if (Ht[Te] = j = { id: Te, flowNode: pe, edges: [], text: "", lane: -1, endLane: -1, level: -1, circular: !1 }, En.push(j), ve(pe)) for (let yt of pe.antecedents) Oe(j, yt, z); else nt(pe) && Oe(j, pe.antecedent, z); return z.delete(pe), j } function Oe(pe, z, Te) { let j = G(z, Te), yt = { source: pe, target: j }; dr.push(yt), pe.edges.push(yt), j.edges.push(yt) } function je(pe) { if (pe.level !== -1) return pe.level; let z = 0; for (let Te of ue(pe)) z = Math.max(z, je(Te) + 1); return pe.level = z } function Ge(pe) { let z = 0; for (let Te of Q(pe)) z = Math.max(z, Ge(Te)); return z + 1 } function kt(pe) { let z = Ke(Array(pe), 0); for (let Te of En) z[Te.level] = Math.max(z[Te.level], Te.text.length); return z } function Kt(pe, z) { if (pe.lane === -1) { pe.lane = z, pe.endLane = z; let Te = Q(pe); for (let j = 0; j < Te.length; j++) { j > 0 && z++; let yt = Te[j]; Kt(yt, z), yt.endLane > pe.endLane && (z = yt.endLane) } pe.endLane = z } } function ln(pe) { if (pe & 2) return "Start"; if (pe & 4) return "Branch"; if (pe & 8) return "Loop"; if (pe & 16) return "Assignment"; if (pe & 32) return "True"; if (pe & 64) return "False"; if (pe & 128) return "SwitchClause"; if (pe & 256) return "ArrayMutation"; if (pe & 512) return "Call"; if (pe & 1024) return "ReduceLabel"; if (pe & 1) return "Unreachable"; throw new Error } function ir(pe) { let z = Gn(pe); return k0(z, pe, !1) } function ae(pe, z) { let Te = ln(pe.flags); if (z && (Te = `${Te}#${An(pe)}`), ce(pe)) pe.node && (Te += ` (${ir(pe.node)})`); else if (Tt(pe)) { let j = []; for (let yt = pe.clauseStart; yt < pe.clauseEnd; yt++) { let lt = pe.switchStatement.caseBlock.clauses[yt]; yO(lt) ? j.push("default") : j.push(ir(lt.expression)) } Te += ` (${j.join(", ")})` } return z === "circularity" ? `Circular(${Te})` : Te } function rt() {
+                                let pe = at.length, z = En.reduce((Qe, Vt) => Math.max(Qe, Vt.lane), 0) + 1, Te = Ke(Array(z), ""), j = at.map(() => Array(z)), yt = at.map(() => Ke(Array(z), 0)); for (let Qe of En) { j[Qe.level][Qe.lane] = Qe; let Vt = Q(Qe); for (let jr = 0; jr < Vt.length; jr++) { let ei = Vt[jr], Kr = 8; ei.lane === Qe.lane && (Kr |= 4), jr > 0 && (Kr |= 1), jr < Vt.length - 1 && (Kr |= 2), yt[Qe.level][ei.lane] |= Kr } Vt.length === 0 && (yt[Qe.level][Qe.lane] |= 16); let Hn = ue(Qe); for (let jr = 0; jr < Hn.length; jr++) { let ei = Hn[jr], Kr = 4; jr > 0 && (Kr |= 1), jr < Hn.length - 1 && (Kr |= 2), yt[Qe.level - 1][ei.lane] |= Kr } } for (let Qe = 0; Qe < pe; Qe++)for (let Vt = 0; Vt < z; Vt++) { let Hn = Qe > 0 ? yt[Qe - 1][Vt] : 0, jr = Vt > 0 ? yt[Qe][Vt - 1] : 0, ei = yt[Qe][Vt]; ei || (Hn & 8 && (ei |= 12), jr & 2 && (ei |= 3), yt[Qe][Vt] = ei) } for (let Qe = 0; Qe < pe; Qe++)for (let Vt = 0; Vt < Te.length; Vt++) { let Hn = yt[Qe][Vt], jr = Hn & 4 ? "\u2500" : " ", ei = j[Qe][Vt]; ei ? (lt(Vt, ei.text), Qe < pe - 1 && (lt(Vt, " "), lt(Vt, oe(jr, at[Qe] - ei.text.length)))) : Qe < pe - 1 && lt(Vt, oe(jr, at[Qe] + 1)), lt(Vt, Ot(Hn)), lt(Vt, Hn & 8 && Qe < pe - 1 && !j[Qe + 1][Vt] ? "\u2500" : " ") } return `
+${Te.join(`
+`)}
+`; function lt(Qe, Vt) { Te[Qe] += Vt }
+                            } function Ot(pe) { switch (pe) { case 3: return "\u2502"; case 12: return "\u2500"; case 5: return "\u256F"; case 9: return "\u2570"; case 6: return "\u256E"; case 10: return "\u256D"; case 7: return "\u2524"; case 11: return "\u251C"; case 13: return "\u2534"; case 14: return "\u252C"; case 15: return "\u256B" }return " " } function Ke(pe, z) { if (pe.fill) pe.fill(z); else for (let Te = 0; Te < pe.length; Te++)pe[Te] = z; return pe } function oe(pe, z) { if (pe.repeat) return z > 0 ? pe.repeat(z) : ""; let Te = ""; for (; Te.length < z;)Te += pe; return Te }
+                        } e.formatControlFlowGraph = nn
+                    })(L || (L = {}))
+                }
+            }); function Fae(e) { let t = Bae.exec(e); if (!t) return; let [, r, i = "0", o = "0", s = "", l = ""] = t; if (!(s && !Uae.test(s)) && !(l && !jae.test(l))) return { major: parseInt(r, 10), minor: parseInt(i, 10), patch: parseInt(o, 10), prerelease: s, build: l } } function Uke(e, t) { if (e === t) return 0; if (e.length === 0) return t.length === 0 ? 0 : 1; if (t.length === 0) return -1; let r = Math.min(e.length, t.length); for (let i = 0; i < r; i++) { let o = e[i], s = t[i]; if (o === s) continue; let l = tV.test(o), f = tV.test(s); if (l || f) { if (l !== f) return l ? -1 : 1; let d = Es(+o, +s); if (d) return d } else { let d = su(o, s); if (d) return d } } return Es(e.length, t.length) } function Gae(e) { let t = []; for (let r of v0(e).split(Wae)) { if (!r) continue; let i = []; r = v0(r); let o = Kae.exec(r); if (o) { if (!Vke(o[1], o[2], i)) return } else for (let s of r.split(zae)) { let l = qae.exec(v0(s)); if (!l || !jke(l[1], l[2], i)) return } t.push(i) } return t } function eV(e) { let t = Jae.exec(e); if (!t) return; let [, r, i = "*", o = "*", s, l] = t; return { version: new r_(mf(r) ? 0 : parseInt(r, 10), mf(r) || mf(i) ? 0 : parseInt(i, 10), mf(r) || mf(i) || mf(o) ? 0 : parseInt(o, 10), s, l), major: r, minor: i, patch: o } } function Vke(e, t, r) { let i = eV(e); if (!i) return !1; let o = eV(t); return o ? (mf(i.major) || r.push(dp(">=", i.version)), mf(o.major) || r.push(mf(o.minor) ? dp("<", o.version.increment("major")) : mf(o.patch) ? dp("<", o.version.increment("minor")) : dp("<=", o.version)), !0) : !1 } function jke(e, t, r) { let i = eV(t); if (!i) return !1; let { version: o, major: s, minor: l, patch: f } = i; if (mf(s)) (e === "<" || e === ">") && r.push(dp("<", r_.zero)); else switch (e) { case "~": r.push(dp(">=", o)), r.push(dp("<", o.increment(mf(l) ? "major" : "minor"))); break; case "^": r.push(dp(">=", o)), r.push(dp("<", o.increment(o.major > 0 || mf(l) ? "major" : o.minor > 0 || mf(f) ? "minor" : "patch"))); break; case "<": case ">=": r.push(mf(l) || mf(f) ? dp(e, o.with({ prerelease: "0" })) : dp(e, o)); break; case "<=": case ">": r.push(mf(l) ? dp(e === "<=" ? "<" : ">=", o.increment("major").with({ prerelease: "0" })) : mf(f) ? dp(e === "<=" ? "<" : ">=", o.increment("minor").with({ prerelease: "0" })) : dp(e, o)); break; case "=": case void 0: mf(l) || mf(f) ? (r.push(dp(">=", o.with({ prerelease: "0" }))), r.push(dp("<", o.increment(mf(l) ? "major" : "minor").with({ prerelease: "0" })))) : r.push(dp("=", o)); break; default: return !1 }return !0 } function mf(e) { return e === "*" || e === "x" || e === "X" } function dp(e, t) { return { operator: e, operand: t } } function Hke(e, t) { if (t.length === 0) return !0; for (let r of t) if (Wke(e, r)) return !0; return !1 } function Wke(e, t) { for (let r of t) if (!zke(e, r.operator, r.operand)) return !1; return !0 } function zke(e, t, r) { let i = e.compareTo(r); switch (t) { case "<": return i < 0; case "<=": return i <= 0; case ">": return i > 0; case ">=": return i >= 0; case "=": return i === 0; default: return L.assertNever(t) } } function Jke(e) { return on(e, Kke).join(" || ") || "*" } function Kke(e) { return on(e, qke).join(" ") } function qke(e) { return `${e.operator}${e.operand}` } var Bae, Uae, Vae, jae, Hae, tV, K1, r_, mA, Wae, zae, Jae, Kae, qae, Xke = gt({ "src/compiler/semver.ts"() { "use strict"; fa(), Bae = /^(0|[1-9]\d*)(?:\.(0|[1-9]\d*)(?:\.(0|[1-9]\d*)(?:\-([a-z0-9-.]+))?(?:\+([a-z0-9-.]+))?)?)?$/i, Uae = /^(?:0|[1-9]\d*|[a-z-][a-z0-9-]*)(?:\.(?:0|[1-9]\d*|[a-z-][a-z0-9-]*))*$/i, Vae = /^(?:0|[1-9]\d*|[a-z-][a-z0-9-]*)$/i, jae = /^[a-z0-9-]+(?:\.[a-z0-9-]+)*$/i, Hae = /^[a-z0-9-]+$/i, tV = /^(0|[1-9]\d*)$/, K1 = class { constructor(e, t = 0, r = 0, i = "", o = "") { typeof e == "string" && ({ major: e, minor: t, patch: r, prerelease: i, build: o } = L.checkDefined(Fae(e), "Invalid version")), L.assert(e >= 0, "Invalid argument: major"), L.assert(t >= 0, "Invalid argument: minor"), L.assert(r >= 0, "Invalid argument: patch"); let s = i ? ba(i) ? i : i.split(".") : Je, l = o ? ba(o) ? o : o.split(".") : Je; L.assert(Ji(s, f => Vae.test(f)), "Invalid argument: prerelease"), L.assert(Ji(l, f => Hae.test(f)), "Invalid argument: build"), this.major = e, this.minor = t, this.patch = r, this.prerelease = s, this.build = l } static tryParse(e) { let t = Fae(e); if (!t) return; let { major: r, minor: i, patch: o, prerelease: s, build: l } = t; return new K1(r, i, o, s, l) } compareTo(e) { return this === e ? 0 : e === void 0 ? 1 : Es(this.major, e.major) || Es(this.minor, e.minor) || Es(this.patch, e.patch) || Uke(this.prerelease, e.prerelease) } increment(e) { switch (e) { case "major": return new K1(this.major + 1, 0, 0); case "minor": return new K1(this.major, this.minor + 1, 0); case "patch": return new K1(this.major, this.minor, this.patch + 1); default: return L.assertNever(e) } } with(e) { let { major: t = this.major, minor: r = this.minor, patch: i = this.patch, prerelease: o = this.prerelease, build: s = this.build } = e; return new K1(t, r, i, o, s) } toString() { let e = `${this.major}.${this.minor}.${this.patch}`; return vt(this.prerelease) && (e += `-${this.prerelease.join(".")}`), vt(this.build) && (e += `+${this.build.join(".")}`), e } }, r_ = K1, r_.zero = new K1(0, 0, 0, ["0"]), mA = class { constructor(e) { this._alternatives = e ? L.checkDefined(Gae(e), "Invalid range spec.") : Je } static tryParse(e) { let t = Gae(e); if (t) { let r = new mA(""); return r._alternatives = t, r } } test(e) { return typeof e == "string" && (e = new r_(e)), Hke(e, this._alternatives) } toString() { return Jke(this._alternatives) } }, Wae = /\|\|/g, zae = /\s+/g, Jae = /^([xX*0]|[1-9]\d*)(?:\.([xX*0]|[1-9]\d*)(?:\.([xX*0]|[1-9]\d*)(?:-([a-z0-9-.]+))?(?:\+([a-z0-9-.]+))?)?)?$/i, Kae = /^\s*([a-z0-9-+.*]+)\s+-\s+([a-z0-9-+.*]+)\s*$/i, qae = /^(~|\^|<|<=|>|>=|=)?\s*([a-z0-9-+.*]+)$/i } }); function Xae(e, t) { return typeof e == "object" && typeof e.timeOrigin == "number" && typeof e.mark == "function" && typeof e.measure == "function" && typeof e.now == "function" && typeof e.clearMarks == "function" && typeof e.clearMeasures == "function" && typeof t == "function" } function Yke() { if (typeof performance == "object" && typeof PerformanceObserver == "function" && Xae(performance, PerformanceObserver)) return { shouldWriteNativeEvents: !0, performance, PerformanceObserver } } function $ke() { if (qU()) try { let e, { performance: t, PerformanceObserver: r } = d0("perf_hooks"); if (Xae(t, r)) { e = t; let i = new r_(process.versions.node); return new mA("<12.16.3 || 13 <13.13").test(i) && (e = { get timeOrigin() { return t.timeOrigin }, now() { return t.now() }, mark(s) { return t.mark(s) }, measure(s, l = "nodeStart", f) { f === void 0 && (f = "__performance.measure-fix__", t.mark(f)), t.measure(s, l, f), f === "__performance.measure-fix__" && t.clearMarks("__performance.measure-fix__") }, clearMarks(s) { return t.clearMarks(s) }, clearMeasures(s) { return t.clearMeasures(s) } }), { shouldWriteNativeEvents: !1, performance: e, PerformanceObserver: r } } } catch { } } function Yae() { return S8 } var S8, nV, Ms, Qke = gt({ "src/compiler/performanceCore.ts"() { "use strict"; fa(), S8 = Yke() || $ke(), nV = S8?.performance, Ms = nV ? () => nV.now() : Date.now ? Date.now : () => +new Date } }), $ae, QD, Qae, fp, Zke = gt({ "src/compiler/perfLogger.ts"() { "use strict"; fa(), $ae = { logEvent: Ba, logErrEvent: Ba, logPerfEvent: Ba, logInfoEvent: Ba, logStartCommand: Ba, logStopCommand: Ba, logStartUpdateProgram: Ba, logStopUpdateProgram: Ba, logStartUpdateGraph: Ba, logStopUpdateGraph: Ba, logStartResolveModule: Ba, logStopResolveModule: Ba, logStartParseSourceFile: Ba, logStopParseSourceFile: Ba, logStartReadFile: Ba, logStopReadFile: Ba, logStartBindFile: Ba, logStopBindFile: Ba, logStartScheduledOperation: Ba, logStopScheduledOperation: Ba }; try { let e = (Qae = process.env.TS_ETW_MODULE_PATH) != null ? Qae : "./node_modules/@microsoft/typescript-etw"; QD = d0(e) } catch { QD = void 0 } fp = QD?.logEvent ? QD : $ae } }); function Zae(e, t, r, i) { return e ? x8(t, r, i) : A8 } function x8(e, t, r) { let i = 0; return { enter: o, exit: s }; function o() { ++i === 1 && Fs(t) } function s() { --i === 0 ? (Fs(r), hf(e, t, r)) : i < 0 && L.fail("enter/exit count does not match.") } } function Fs(e) { var t; if (q1) { let r = (t = hA.get(e)) != null ? t : 0; hA.set(e, r + 1), X1.set(e, Ms()), b0?.mark(e), typeof onProfilerEvent == "function" && onProfilerEvent(e) } } function hf(e, t, r) { var i, o; if (q1) { let s = (i = r !== void 0 ? X1.get(r) : void 0) != null ? i : Ms(), l = (o = t !== void 0 ? X1.get(t) : void 0) != null ? o : rV, f = Y1.get(e) || 0; Y1.set(e, f + (s - l)), b0?.measure(e, t, r) } } function eDe(e) { return hA.get(e) || 0 } function tDe(e) { return Y1.get(e) || 0 } function nDe(e) { Y1.forEach((t, r) => e(r, t)) } function rDe(e) { X1.forEach((t, r) => e(r)) } function iDe(e) { e !== void 0 ? Y1.delete(e) : Y1.clear(), b0?.clearMeasures(e) } function aDe(e) { e !== void 0 ? (hA.delete(e), X1.delete(e)) : (hA.clear(), X1.clear()), b0?.clearMarks(e) } function oDe() { return q1 } function sDe(e = xl) { var t; return q1 || (q1 = !0, eI || (eI = Yae()), eI && (rV = eI.performance.timeOrigin, (eI.shouldWriteNativeEvents || (t = e?.cpuProfilingEnabled) != null && t.call(e) || e?.debugMode) && (b0 = eI.performance))), !0 } function cDe() { q1 && (X1.clear(), hA.clear(), Y1.clear(), b0 = void 0, q1 = !1) } var eI, b0, A8, q1, rV, X1, hA, Y1, lDe = gt({ "src/compiler/performance.ts"() { "use strict"; fa(), A8 = { enter: Ba, exit: Ba }, q1 = !1, rV = Ms(), X1 = new Map, hA = new Map, Y1 = new Map } }), ZD = {}; Mo(ZD, { clearMarks: () => aDe, clearMeasures: () => iDe, createTimer: () => x8, createTimerIf: () => Zae, disable: () => cDe, enable: () => sDe, forEachMark: () => rDe, forEachMeasure: () => nDe, getCount: () => eDe, getDuration: () => tDe, isEnabled: () => oDe, mark: () => Fs, measure: () => hf, nullTimer: () => A8 }); var E0 = gt({ "src/compiler/_namespaces/ts.performance.ts"() { "use strict"; lDe() } }), ai, ew, eoe, toe, uDe = gt({
+                "src/compiler/tracing.ts"() {
+                    "use strict"; fa(), E0(), (e => {
+                        let t, r = 0, i = 0, o, s = [], l, f = []; function d(R, ie, $) {
+                            if (L.assert(!ai, "Tracing already started"), t === void 0) try { t = d0("fs") } catch (le) {
+                                throw new Error(`tracing requires having fs
+(original error: ${le.message || le})`)
+                            } o = R, s.length = 0, l === void 0 && (l = vi(ie, "legend.json")), t.existsSync(ie) || t.mkdirSync(ie, { recursive: !0 }); let fe = o === "build" ? `.${process.pid}-${++r}` : o === "server" ? `.${process.pid}` : "", Z = vi(ie, `trace${fe}.json`), U = vi(ie, `types${fe}.json`); f.push({ configFilePath: $, tracePath: Z, typesPath: U }), i = t.openSync(Z, "w"), ai = e; let re = { cat: "__metadata", ph: "M", ts: 1e3 * Ms(), pid: 1, tid: 1 }; t.writeSync(i, `[
+`+ [{ name: "process_name", args: { name: "tsc" }, ...re }, { name: "thread_name", args: { name: "Main" }, ...re }, { name: "TracingStartedInBrowser", ...re, cat: "disabled-by-default-devtools.timeline" }].map(le => JSON.stringify(le)).join(`,
+`))
+                        } e.startTracing = d; function g() {
+                            L.assert(ai, "Tracing is not in progress"), L.assert(!!s.length == (o !== "server")), t.writeSync(i, `
+]
+`), t.closeSync(i), ai = void 0, s.length ? W(s) : f[f.length - 1].typesPath = void 0
+                        } e.stopTracing = g; function m(R) { o !== "server" && s.push(R) } e.recordType = m; let v; (R => { R.Parse = "parse", R.Program = "program", R.Bind = "bind", R.Check = "check", R.CheckTypes = "checkTypes", R.Emit = "emit", R.Session = "session" })(v = e.Phase || (e.Phase = {})); function S(R, ie, $) { B("I", R, ie, $, '"s":"g"') } e.instant = S; let x = []; function A(R, ie, $, fe = !1) { fe && B("B", R, ie, $), x.push({ phase: R, name: ie, args: $, time: 1e3 * Ms(), separateBeginAndEnd: fe }) } e.push = A; function w(R) { L.assert(x.length > 0), F(x.length - 1, 1e3 * Ms(), R), x.length-- } e.pop = w; function C() { let R = 1e3 * Ms(); for (let ie = x.length - 1; ie >= 0; ie--)F(ie, R); x.length = 0 } e.popAll = C; let P = 1e3 * 10; function F(R, ie, $) { let { phase: fe, name: Z, args: U, time: re, separateBeginAndEnd: le } = x[R]; le ? (L.assert(!$, "`results` are not supported for events with `separateBeginAndEnd`"), B("E", fe, Z, U, void 0, ie)) : P - re % P <= ie - re && B("X", fe, Z, { ...U, results: $ }, `"dur":${ie - re}`, re) } function B(R, ie, $, fe, Z, U = 1e3 * Ms()) {
+                            o === "server" && ie === "checkTypes" || (Fs("beginTracing"), t.writeSync(i, `,
+{"pid":1,"tid":1,"ph":"${R}","cat":"${ie}","ts":${U},"name":"${$}"`), Z && t.writeSync(i, `,${Z}`), fe && t.writeSync(i, `,"args":${JSON.stringify(fe)}`), t.writeSync(i, "}"), Fs("endTracing"), hf("Tracing", "beginTracing", "endTracing"))
+                        } function q(R) { let ie = Gn(R); return ie ? { path: ie.path, start: $(Gs(ie, R.pos)), end: $(Gs(ie, R.end)) } : void 0; function $(fe) { return { line: fe.line + 1, character: fe.character + 1 } } } function W(R) {
+                            var ie, $, fe, Z, U, re, le, _e, ge, X, Ve, we, ke, Pe, Ce, Ie, Be, Ne, Le, Ye, _t, ct; Fs("beginDumpTypes"); let Rt = f[f.length - 1].typesPath, We = t.openSync(Rt, "w"), qe = new Map; t.writeSync(We, "["); let zt = R.length; for (let Qt = 0; Qt < zt; Qt++) {
+                                let tn = R[Qt], kn = tn.objectFlags, _n = (ie = tn.aliasSymbol) != null ? ie : tn.symbol, Gt; if (kn & 16 | tn.flags & 2944) try { Gt = ($ = tn.checker) == null ? void 0 : $.typeToString(tn) } catch { Gt = void 0 } let $n = {}; if (tn.flags & 8388608) { let An = tn; $n = { indexedAccessObjectType: (fe = An.objectType) == null ? void 0 : fe.id, indexedAccessIndexType: (Z = An.indexType) == null ? void 0 : Z.id } } let ui = {}; if (kn & 4) { let An = tn; ui = { instantiatedType: (U = An.target) == null ? void 0 : U.id, typeArguments: (re = An.resolvedTypeArguments) == null ? void 0 : re.map(Kn => Kn.id), referenceLocation: q(An.node) } } let Ni = {}; if (tn.flags & 16777216) { let An = tn; Ni = { conditionalCheckType: (le = An.checkType) == null ? void 0 : le.id, conditionalExtendsType: (_e = An.extendsType) == null ? void 0 : _e.id, conditionalTrueType: (X = (ge = An.resolvedTrueType) == null ? void 0 : ge.id) != null ? X : -1, conditionalFalseType: (we = (Ve = An.resolvedFalseType) == null ? void 0 : Ve.id) != null ? we : -1 } } let Pi = {}; if (tn.flags & 33554432) { let An = tn; Pi = { substitutionBaseType: (ke = An.baseType) == null ? void 0 : ke.id, constraintType: (Pe = An.constraint) == null ? void 0 : Pe.id } } let gr = {}; if (kn & 1024) { let An = tn; gr = { reverseMappedSourceType: (Ce = An.source) == null ? void 0 : Ce.id, reverseMappedMappedType: (Ie = An.mappedType) == null ? void 0 : Ie.id, reverseMappedConstraintType: (Be = An.constraintType) == null ? void 0 : Be.id } } let pt = {}; if (kn & 256) { let An = tn; pt = { evolvingArrayElementType: An.elementType.id, evolvingArrayFinalType: (Ne = An.finalArrayType) == null ? void 0 : Ne.id } } let nn, Dt = tn.checker.getRecursionIdentity(tn); Dt && (nn = qe.get(Dt), nn || (nn = qe.size, qe.set(Dt, nn))); let pn = { id: tn.id, intrinsicName: tn.intrinsicName, symbolName: _n?.escapedName && Gi(_n.escapedName), recursionId: nn, isTuple: kn & 8 ? !0 : void 0, unionTypes: tn.flags & 1048576 ? (Le = tn.types) == null ? void 0 : Le.map(An => An.id) : void 0, intersectionTypes: tn.flags & 2097152 ? tn.types.map(An => An.id) : void 0, aliasTypeArguments: (Ye = tn.aliasTypeArguments) == null ? void 0 : Ye.map(An => An.id), keyofType: tn.flags & 4194304 ? (_t = tn.type) == null ? void 0 : _t.id : void 0, ...$n, ...ui, ...Ni, ...Pi, ...gr, ...pt, destructuringPattern: q(tn.pattern), firstDeclaration: q((ct = _n?.declarations) == null ? void 0 : ct[0]), flags: L.formatTypeFlags(tn.flags).split("|"), display: Gt }; t.writeSync(We, JSON.stringify(pn)), Qt < zt - 1 && t.writeSync(We, `,
+`)
+                            } t.writeSync(We, `]
+`), t.closeSync(We), Fs("endDumpTypes"), hf("Dump types", "beginDumpTypes", "endDumpTypes")
+                        } function Y() { l && t.writeFileSync(l, JSON.stringify(f)) } e.dumpLegend = Y
+                    })(ew || (ew = {})), eoe = ew.startTracing, toe = ew.dumpLegend
+                }
+            }); function C8(e, t = !0) { let r = nw[e.category]; return t ? r.toLowerCase() : r } var I8, L8, k8, iV, D8, w8, aV, tw, oV, tI, R8, sV, cV, lV, uV, dV, fV, _V, pV, mV, hV, gV, yV, vV, bV, O8, EV, TV, SV, xV, N8, P8, AV, CV, IV, LV, kV, M8, DV, wV, RV, OV, NV, PV, nw, rw, MV, FV, GV, BV, F8, UV, VV, jV, HV, WV, zV, JV, KV, qV, G8, B8, U8, XV, YV, $V, QV, ZV, ej, tj, nj, iw, noe = gt({ "src/compiler/types.ts"() { "use strict"; I8 = (e => (e[e.Unknown = 0] = "Unknown", e[e.EndOfFileToken = 1] = "EndOfFileToken", e[e.SingleLineCommentTrivia = 2] = "SingleLineCommentTrivia", e[e.MultiLineCommentTrivia = 3] = "MultiLineCommentTrivia", e[e.NewLineTrivia = 4] = "NewLineTrivia", e[e.WhitespaceTrivia = 5] = "WhitespaceTrivia", e[e.ShebangTrivia = 6] = "ShebangTrivia", e[e.ConflictMarkerTrivia = 7] = "ConflictMarkerTrivia", e[e.NumericLiteral = 8] = "NumericLiteral", e[e.BigIntLiteral = 9] = "BigIntLiteral", e[e.StringLiteral = 10] = "StringLiteral", e[e.JsxText = 11] = "JsxText", e[e.JsxTextAllWhiteSpaces = 12] = "JsxTextAllWhiteSpaces", e[e.RegularExpressionLiteral = 13] = "RegularExpressionLiteral", e[e.NoSubstitutionTemplateLiteral = 14] = "NoSubstitutionTemplateLiteral", e[e.TemplateHead = 15] = "TemplateHead", e[e.TemplateMiddle = 16] = "TemplateMiddle", e[e.TemplateTail = 17] = "TemplateTail", e[e.OpenBraceToken = 18] = "OpenBraceToken", e[e.CloseBraceToken = 19] = "CloseBraceToken", e[e.OpenParenToken = 20] = "OpenParenToken", e[e.CloseParenToken = 21] = "CloseParenToken", e[e.OpenBracketToken = 22] = "OpenBracketToken", e[e.CloseBracketToken = 23] = "CloseBracketToken", e[e.DotToken = 24] = "DotToken", e[e.DotDotDotToken = 25] = "DotDotDotToken", e[e.SemicolonToken = 26] = "SemicolonToken", e[e.CommaToken = 27] = "CommaToken", e[e.QuestionDotToken = 28] = "QuestionDotToken", e[e.LessThanToken = 29] = "LessThanToken", e[e.LessThanSlashToken = 30] = "LessThanSlashToken", e[e.GreaterThanToken = 31] = "GreaterThanToken", e[e.LessThanEqualsToken = 32] = "LessThanEqualsToken", e[e.GreaterThanEqualsToken = 33] = "GreaterThanEqualsToken", e[e.EqualsEqualsToken = 34] = "EqualsEqualsToken", e[e.ExclamationEqualsToken = 35] = "ExclamationEqualsToken", e[e.EqualsEqualsEqualsToken = 36] = "EqualsEqualsEqualsToken", e[e.ExclamationEqualsEqualsToken = 37] = "ExclamationEqualsEqualsToken", e[e.EqualsGreaterThanToken = 38] = "EqualsGreaterThanToken", e[e.PlusToken = 39] = "PlusToken", e[e.MinusToken = 40] = "MinusToken", e[e.AsteriskToken = 41] = "AsteriskToken", e[e.AsteriskAsteriskToken = 42] = "AsteriskAsteriskToken", e[e.SlashToken = 43] = "SlashToken", e[e.PercentToken = 44] = "PercentToken", e[e.PlusPlusToken = 45] = "PlusPlusToken", e[e.MinusMinusToken = 46] = "MinusMinusToken", e[e.LessThanLessThanToken = 47] = "LessThanLessThanToken", e[e.GreaterThanGreaterThanToken = 48] = "GreaterThanGreaterThanToken", e[e.GreaterThanGreaterThanGreaterThanToken = 49] = "GreaterThanGreaterThanGreaterThanToken", e[e.AmpersandToken = 50] = "AmpersandToken", e[e.BarToken = 51] = "BarToken", e[e.CaretToken = 52] = "CaretToken", e[e.ExclamationToken = 53] = "ExclamationToken", e[e.TildeToken = 54] = "TildeToken", e[e.AmpersandAmpersandToken = 55] = "AmpersandAmpersandToken", e[e.BarBarToken = 56] = "BarBarToken", e[e.QuestionToken = 57] = "QuestionToken", e[e.ColonToken = 58] = "ColonToken", e[e.AtToken = 59] = "AtToken", e[e.QuestionQuestionToken = 60] = "QuestionQuestionToken", e[e.BacktickToken = 61] = "BacktickToken", e[e.HashToken = 62] = "HashToken", e[e.EqualsToken = 63] = "EqualsToken", e[e.PlusEqualsToken = 64] = "PlusEqualsToken", e[e.MinusEqualsToken = 65] = "MinusEqualsToken", e[e.AsteriskEqualsToken = 66] = "AsteriskEqualsToken", e[e.AsteriskAsteriskEqualsToken = 67] = "AsteriskAsteriskEqualsToken", e[e.SlashEqualsToken = 68] = "SlashEqualsToken", e[e.PercentEqualsToken = 69] = "PercentEqualsToken", e[e.LessThanLessThanEqualsToken = 70] = "LessThanLessThanEqualsToken", e[e.GreaterThanGreaterThanEqualsToken = 71] = "GreaterThanGreaterThanEqualsToken", e[e.GreaterThanGreaterThanGreaterThanEqualsToken = 72] = "GreaterThanGreaterThanGreaterThanEqualsToken", e[e.AmpersandEqualsToken = 73] = "AmpersandEqualsToken", e[e.BarEqualsToken = 74] = "BarEqualsToken", e[e.BarBarEqualsToken = 75] = "BarBarEqualsToken", e[e.AmpersandAmpersandEqualsToken = 76] = "AmpersandAmpersandEqualsToken", e[e.QuestionQuestionEqualsToken = 77] = "QuestionQuestionEqualsToken", e[e.CaretEqualsToken = 78] = "CaretEqualsToken", e[e.Identifier = 79] = "Identifier", e[e.PrivateIdentifier = 80] = "PrivateIdentifier", e[e.BreakKeyword = 81] = "BreakKeyword", e[e.CaseKeyword = 82] = "CaseKeyword", e[e.CatchKeyword = 83] = "CatchKeyword", e[e.ClassKeyword = 84] = "ClassKeyword", e[e.ConstKeyword = 85] = "ConstKeyword", e[e.ContinueKeyword = 86] = "ContinueKeyword", e[e.DebuggerKeyword = 87] = "DebuggerKeyword", e[e.DefaultKeyword = 88] = "DefaultKeyword", e[e.DeleteKeyword = 89] = "DeleteKeyword", e[e.DoKeyword = 90] = "DoKeyword", e[e.ElseKeyword = 91] = "ElseKeyword", e[e.EnumKeyword = 92] = "EnumKeyword", e[e.ExportKeyword = 93] = "ExportKeyword", e[e.ExtendsKeyword = 94] = "ExtendsKeyword", e[e.FalseKeyword = 95] = "FalseKeyword", e[e.FinallyKeyword = 96] = "FinallyKeyword", e[e.ForKeyword = 97] = "ForKeyword", e[e.FunctionKeyword = 98] = "FunctionKeyword", e[e.IfKeyword = 99] = "IfKeyword", e[e.ImportKeyword = 100] = "ImportKeyword", e[e.InKeyword = 101] = "InKeyword", e[e.InstanceOfKeyword = 102] = "InstanceOfKeyword", e[e.NewKeyword = 103] = "NewKeyword", e[e.NullKeyword = 104] = "NullKeyword", e[e.ReturnKeyword = 105] = "ReturnKeyword", e[e.SuperKeyword = 106] = "SuperKeyword", e[e.SwitchKeyword = 107] = "SwitchKeyword", e[e.ThisKeyword = 108] = "ThisKeyword", e[e.ThrowKeyword = 109] = "ThrowKeyword", e[e.TrueKeyword = 110] = "TrueKeyword", e[e.TryKeyword = 111] = "TryKeyword", e[e.TypeOfKeyword = 112] = "TypeOfKeyword", e[e.VarKeyword = 113] = "VarKeyword", e[e.VoidKeyword = 114] = "VoidKeyword", e[e.WhileKeyword = 115] = "WhileKeyword", e[e.WithKeyword = 116] = "WithKeyword", e[e.ImplementsKeyword = 117] = "ImplementsKeyword", e[e.InterfaceKeyword = 118] = "InterfaceKeyword", e[e.LetKeyword = 119] = "LetKeyword", e[e.PackageKeyword = 120] = "PackageKeyword", e[e.PrivateKeyword = 121] = "PrivateKeyword", e[e.ProtectedKeyword = 122] = "ProtectedKeyword", e[e.PublicKeyword = 123] = "PublicKeyword", e[e.StaticKeyword = 124] = "StaticKeyword", e[e.YieldKeyword = 125] = "YieldKeyword", e[e.AbstractKeyword = 126] = "AbstractKeyword", e[e.AccessorKeyword = 127] = "AccessorKeyword", e[e.AsKeyword = 128] = "AsKeyword", e[e.AssertsKeyword = 129] = "AssertsKeyword", e[e.AssertKeyword = 130] = "AssertKeyword", e[e.AnyKeyword = 131] = "AnyKeyword", e[e.AsyncKeyword = 132] = "AsyncKeyword", e[e.AwaitKeyword = 133] = "AwaitKeyword", e[e.BooleanKeyword = 134] = "BooleanKeyword", e[e.ConstructorKeyword = 135] = "ConstructorKeyword", e[e.DeclareKeyword = 136] = "DeclareKeyword", e[e.GetKeyword = 137] = "GetKeyword", e[e.InferKeyword = 138] = "InferKeyword", e[e.IntrinsicKeyword = 139] = "IntrinsicKeyword", e[e.IsKeyword = 140] = "IsKeyword", e[e.KeyOfKeyword = 141] = "KeyOfKeyword", e[e.ModuleKeyword = 142] = "ModuleKeyword", e[e.NamespaceKeyword = 143] = "NamespaceKeyword", e[e.NeverKeyword = 144] = "NeverKeyword", e[e.OutKeyword = 145] = "OutKeyword", e[e.ReadonlyKeyword = 146] = "ReadonlyKeyword", e[e.RequireKeyword = 147] = "RequireKeyword", e[e.NumberKeyword = 148] = "NumberKeyword", e[e.ObjectKeyword = 149] = "ObjectKeyword", e[e.SatisfiesKeyword = 150] = "SatisfiesKeyword", e[e.SetKeyword = 151] = "SetKeyword", e[e.StringKeyword = 152] = "StringKeyword", e[e.SymbolKeyword = 153] = "SymbolKeyword", e[e.TypeKeyword = 154] = "TypeKeyword", e[e.UndefinedKeyword = 155] = "UndefinedKeyword", e[e.UniqueKeyword = 156] = "UniqueKeyword", e[e.UnknownKeyword = 157] = "UnknownKeyword", e[e.FromKeyword = 158] = "FromKeyword", e[e.GlobalKeyword = 159] = "GlobalKeyword", e[e.BigIntKeyword = 160] = "BigIntKeyword", e[e.OverrideKeyword = 161] = "OverrideKeyword", e[e.OfKeyword = 162] = "OfKeyword", e[e.QualifiedName = 163] = "QualifiedName", e[e.ComputedPropertyName = 164] = "ComputedPropertyName", e[e.TypeParameter = 165] = "TypeParameter", e[e.Parameter = 166] = "Parameter", e[e.Decorator = 167] = "Decorator", e[e.PropertySignature = 168] = "PropertySignature", e[e.PropertyDeclaration = 169] = "PropertyDeclaration", e[e.MethodSignature = 170] = "MethodSignature", e[e.MethodDeclaration = 171] = "MethodDeclaration", e[e.ClassStaticBlockDeclaration = 172] = "ClassStaticBlockDeclaration", e[e.Constructor = 173] = "Constructor", e[e.GetAccessor = 174] = "GetAccessor", e[e.SetAccessor = 175] = "SetAccessor", e[e.CallSignature = 176] = "CallSignature", e[e.ConstructSignature = 177] = "ConstructSignature", e[e.IndexSignature = 178] = "IndexSignature", e[e.TypePredicate = 179] = "TypePredicate", e[e.TypeReference = 180] = "TypeReference", e[e.FunctionType = 181] = "FunctionType", e[e.ConstructorType = 182] = "ConstructorType", e[e.TypeQuery = 183] = "TypeQuery", e[e.TypeLiteral = 184] = "TypeLiteral", e[e.ArrayType = 185] = "ArrayType", e[e.TupleType = 186] = "TupleType", e[e.OptionalType = 187] = "OptionalType", e[e.RestType = 188] = "RestType", e[e.UnionType = 189] = "UnionType", e[e.IntersectionType = 190] = "IntersectionType", e[e.ConditionalType = 191] = "ConditionalType", e[e.InferType = 192] = "InferType", e[e.ParenthesizedType = 193] = "ParenthesizedType", e[e.ThisType = 194] = "ThisType", e[e.TypeOperator = 195] = "TypeOperator", e[e.IndexedAccessType = 196] = "IndexedAccessType", e[e.MappedType = 197] = "MappedType", e[e.LiteralType = 198] = "LiteralType", e[e.NamedTupleMember = 199] = "NamedTupleMember", e[e.TemplateLiteralType = 200] = "TemplateLiteralType", e[e.TemplateLiteralTypeSpan = 201] = "TemplateLiteralTypeSpan", e[e.ImportType = 202] = "ImportType", e[e.ObjectBindingPattern = 203] = "ObjectBindingPattern", e[e.ArrayBindingPattern = 204] = "ArrayBindingPattern", e[e.BindingElement = 205] = "BindingElement", e[e.ArrayLiteralExpression = 206] = "ArrayLiteralExpression", e[e.ObjectLiteralExpression = 207] = "ObjectLiteralExpression", e[e.PropertyAccessExpression = 208] = "PropertyAccessExpression", e[e.ElementAccessExpression = 209] = "ElementAccessExpression", e[e.CallExpression = 210] = "CallExpression", e[e.NewExpression = 211] = "NewExpression", e[e.TaggedTemplateExpression = 212] = "TaggedTemplateExpression", e[e.TypeAssertionExpression = 213] = "TypeAssertionExpression", e[e.ParenthesizedExpression = 214] = "ParenthesizedExpression", e[e.FunctionExpression = 215] = "FunctionExpression", e[e.ArrowFunction = 216] = "ArrowFunction", e[e.DeleteExpression = 217] = "DeleteExpression", e[e.TypeOfExpression = 218] = "TypeOfExpression", e[e.VoidExpression = 219] = "VoidExpression", e[e.AwaitExpression = 220] = "AwaitExpression", e[e.PrefixUnaryExpression = 221] = "PrefixUnaryExpression", e[e.PostfixUnaryExpression = 222] = "PostfixUnaryExpression", e[e.BinaryExpression = 223] = "BinaryExpression", e[e.ConditionalExpression = 224] = "ConditionalExpression", e[e.TemplateExpression = 225] = "TemplateExpression", e[e.YieldExpression = 226] = "YieldExpression", e[e.SpreadElement = 227] = "SpreadElement", e[e.ClassExpression = 228] = "ClassExpression", e[e.OmittedExpression = 229] = "OmittedExpression", e[e.ExpressionWithTypeArguments = 230] = "ExpressionWithTypeArguments", e[e.AsExpression = 231] = "AsExpression", e[e.NonNullExpression = 232] = "NonNullExpression", e[e.MetaProperty = 233] = "MetaProperty", e[e.SyntheticExpression = 234] = "SyntheticExpression", e[e.SatisfiesExpression = 235] = "SatisfiesExpression", e[e.TemplateSpan = 236] = "TemplateSpan", e[e.SemicolonClassElement = 237] = "SemicolonClassElement", e[e.Block = 238] = "Block", e[e.EmptyStatement = 239] = "EmptyStatement", e[e.VariableStatement = 240] = "VariableStatement", e[e.ExpressionStatement = 241] = "ExpressionStatement", e[e.IfStatement = 242] = "IfStatement", e[e.DoStatement = 243] = "DoStatement", e[e.WhileStatement = 244] = "WhileStatement", e[e.ForStatement = 245] = "ForStatement", e[e.ForInStatement = 246] = "ForInStatement", e[e.ForOfStatement = 247] = "ForOfStatement", e[e.ContinueStatement = 248] = "ContinueStatement", e[e.BreakStatement = 249] = "BreakStatement", e[e.ReturnStatement = 250] = "ReturnStatement", e[e.WithStatement = 251] = "WithStatement", e[e.SwitchStatement = 252] = "SwitchStatement", e[e.LabeledStatement = 253] = "LabeledStatement", e[e.ThrowStatement = 254] = "ThrowStatement", e[e.TryStatement = 255] = "TryStatement", e[e.DebuggerStatement = 256] = "DebuggerStatement", e[e.VariableDeclaration = 257] = "VariableDeclaration", e[e.VariableDeclarationList = 258] = "VariableDeclarationList", e[e.FunctionDeclaration = 259] = "FunctionDeclaration", e[e.ClassDeclaration = 260] = "ClassDeclaration", e[e.InterfaceDeclaration = 261] = "InterfaceDeclaration", e[e.TypeAliasDeclaration = 262] = "TypeAliasDeclaration", e[e.EnumDeclaration = 263] = "EnumDeclaration", e[e.ModuleDeclaration = 264] = "ModuleDeclaration", e[e.ModuleBlock = 265] = "ModuleBlock", e[e.CaseBlock = 266] = "CaseBlock", e[e.NamespaceExportDeclaration = 267] = "NamespaceExportDeclaration", e[e.ImportEqualsDeclaration = 268] = "ImportEqualsDeclaration", e[e.ImportDeclaration = 269] = "ImportDeclaration", e[e.ImportClause = 270] = "ImportClause", e[e.NamespaceImport = 271] = "NamespaceImport", e[e.NamedImports = 272] = "NamedImports", e[e.ImportSpecifier = 273] = "ImportSpecifier", e[e.ExportAssignment = 274] = "ExportAssignment", e[e.ExportDeclaration = 275] = "ExportDeclaration", e[e.NamedExports = 276] = "NamedExports", e[e.NamespaceExport = 277] = "NamespaceExport", e[e.ExportSpecifier = 278] = "ExportSpecifier", e[e.MissingDeclaration = 279] = "MissingDeclaration", e[e.ExternalModuleReference = 280] = "ExternalModuleReference", e[e.JsxElement = 281] = "JsxElement", e[e.JsxSelfClosingElement = 282] = "JsxSelfClosingElement", e[e.JsxOpeningElement = 283] = "JsxOpeningElement", e[e.JsxClosingElement = 284] = "JsxClosingElement", e[e.JsxFragment = 285] = "JsxFragment", e[e.JsxOpeningFragment = 286] = "JsxOpeningFragment", e[e.JsxClosingFragment = 287] = "JsxClosingFragment", e[e.JsxAttribute = 288] = "JsxAttribute", e[e.JsxAttributes = 289] = "JsxAttributes", e[e.JsxSpreadAttribute = 290] = "JsxSpreadAttribute", e[e.JsxExpression = 291] = "JsxExpression", e[e.CaseClause = 292] = "CaseClause", e[e.DefaultClause = 293] = "DefaultClause", e[e.HeritageClause = 294] = "HeritageClause", e[e.CatchClause = 295] = "CatchClause", e[e.AssertClause = 296] = "AssertClause", e[e.AssertEntry = 297] = "AssertEntry", e[e.ImportTypeAssertionContainer = 298] = "ImportTypeAssertionContainer", e[e.PropertyAssignment = 299] = "PropertyAssignment", e[e.ShorthandPropertyAssignment = 300] = "ShorthandPropertyAssignment", e[e.SpreadAssignment = 301] = "SpreadAssignment", e[e.EnumMember = 302] = "EnumMember", e[e.UnparsedPrologue = 303] = "UnparsedPrologue", e[e.UnparsedPrepend = 304] = "UnparsedPrepend", e[e.UnparsedText = 305] = "UnparsedText", e[e.UnparsedInternalText = 306] = "UnparsedInternalText", e[e.UnparsedSyntheticReference = 307] = "UnparsedSyntheticReference", e[e.SourceFile = 308] = "SourceFile", e[e.Bundle = 309] = "Bundle", e[e.UnparsedSource = 310] = "UnparsedSource", e[e.InputFiles = 311] = "InputFiles", e[e.JSDocTypeExpression = 312] = "JSDocTypeExpression", e[e.JSDocNameReference = 313] = "JSDocNameReference", e[e.JSDocMemberName = 314] = "JSDocMemberName", e[e.JSDocAllType = 315] = "JSDocAllType", e[e.JSDocUnknownType = 316] = "JSDocUnknownType", e[e.JSDocNullableType = 317] = "JSDocNullableType", e[e.JSDocNonNullableType = 318] = "JSDocNonNullableType", e[e.JSDocOptionalType = 319] = "JSDocOptionalType", e[e.JSDocFunctionType = 320] = "JSDocFunctionType", e[e.JSDocVariadicType = 321] = "JSDocVariadicType", e[e.JSDocNamepathType = 322] = "JSDocNamepathType", e[e.JSDoc = 323] = "JSDoc", e[e.JSDocComment = 323] = "JSDocComment", e[e.JSDocText = 324] = "JSDocText", e[e.JSDocTypeLiteral = 325] = "JSDocTypeLiteral", e[e.JSDocSignature = 326] = "JSDocSignature", e[e.JSDocLink = 327] = "JSDocLink", e[e.JSDocLinkCode = 328] = "JSDocLinkCode", e[e.JSDocLinkPlain = 329] = "JSDocLinkPlain", e[e.JSDocTag = 330] = "JSDocTag", e[e.JSDocAugmentsTag = 331] = "JSDocAugmentsTag", e[e.JSDocImplementsTag = 332] = "JSDocImplementsTag", e[e.JSDocAuthorTag = 333] = "JSDocAuthorTag", e[e.JSDocDeprecatedTag = 334] = "JSDocDeprecatedTag", e[e.JSDocClassTag = 335] = "JSDocClassTag", e[e.JSDocPublicTag = 336] = "JSDocPublicTag", e[e.JSDocPrivateTag = 337] = "JSDocPrivateTag", e[e.JSDocProtectedTag = 338] = "JSDocProtectedTag", e[e.JSDocReadonlyTag = 339] = "JSDocReadonlyTag", e[e.JSDocOverrideTag = 340] = "JSDocOverrideTag", e[e.JSDocCallbackTag = 341] = "JSDocCallbackTag", e[e.JSDocOverloadTag = 342] = "JSDocOverloadTag", e[e.JSDocEnumTag = 343] = "JSDocEnumTag", e[e.JSDocParameterTag = 344] = "JSDocParameterTag", e[e.JSDocReturnTag = 345] = "JSDocReturnTag", e[e.JSDocThisTag = 346] = "JSDocThisTag", e[e.JSDocTypeTag = 347] = "JSDocTypeTag", e[e.JSDocTemplateTag = 348] = "JSDocTemplateTag", e[e.JSDocTypedefTag = 349] = "JSDocTypedefTag", e[e.JSDocSeeTag = 350] = "JSDocSeeTag", e[e.JSDocPropertyTag = 351] = "JSDocPropertyTag", e[e.JSDocThrowsTag = 352] = "JSDocThrowsTag", e[e.JSDocSatisfiesTag = 353] = "JSDocSatisfiesTag", e[e.SyntaxList = 354] = "SyntaxList", e[e.NotEmittedStatement = 355] = "NotEmittedStatement", e[e.PartiallyEmittedExpression = 356] = "PartiallyEmittedExpression", e[e.CommaListExpression = 357] = "CommaListExpression", e[e.MergeDeclarationMarker = 358] = "MergeDeclarationMarker", e[e.EndOfDeclarationMarker = 359] = "EndOfDeclarationMarker", e[e.SyntheticReferenceExpression = 360] = "SyntheticReferenceExpression", e[e.Count = 361] = "Count", e[e.FirstAssignment = 63] = "FirstAssignment", e[e.LastAssignment = 78] = "LastAssignment", e[e.FirstCompoundAssignment = 64] = "FirstCompoundAssignment", e[e.LastCompoundAssignment = 78] = "LastCompoundAssignment", e[e.FirstReservedWord = 81] = "FirstReservedWord", e[e.LastReservedWord = 116] = "LastReservedWord", e[e.FirstKeyword = 81] = "FirstKeyword", e[e.LastKeyword = 162] = "LastKeyword", e[e.FirstFutureReservedWord = 117] = "FirstFutureReservedWord", e[e.LastFutureReservedWord = 125] = "LastFutureReservedWord", e[e.FirstTypeNode = 179] = "FirstTypeNode", e[e.LastTypeNode = 202] = "LastTypeNode", e[e.FirstPunctuation = 18] = "FirstPunctuation", e[e.LastPunctuation = 78] = "LastPunctuation", e[e.FirstToken = 0] = "FirstToken", e[e.LastToken = 162] = "LastToken", e[e.FirstTriviaToken = 2] = "FirstTriviaToken", e[e.LastTriviaToken = 7] = "LastTriviaToken", e[e.FirstLiteralToken = 8] = "FirstLiteralToken", e[e.LastLiteralToken = 14] = "LastLiteralToken", e[e.FirstTemplateToken = 14] = "FirstTemplateToken", e[e.LastTemplateToken = 17] = "LastTemplateToken", e[e.FirstBinaryOperator = 29] = "FirstBinaryOperator", e[e.LastBinaryOperator = 78] = "LastBinaryOperator", e[e.FirstStatement = 240] = "FirstStatement", e[e.LastStatement = 256] = "LastStatement", e[e.FirstNode = 163] = "FirstNode", e[e.FirstJSDocNode = 312] = "FirstJSDocNode", e[e.LastJSDocNode = 353] = "LastJSDocNode", e[e.FirstJSDocTagNode = 330] = "FirstJSDocTagNode", e[e.LastJSDocTagNode = 353] = "LastJSDocTagNode", e[e.FirstContextualKeyword = 126] = "FirstContextualKeyword", e[e.LastContextualKeyword = 162] = "LastContextualKeyword", e))(I8 || {}), L8 = (e => (e[e.None = 0] = "None", e[e.Let = 1] = "Let", e[e.Const = 2] = "Const", e[e.NestedNamespace = 4] = "NestedNamespace", e[e.Synthesized = 8] = "Synthesized", e[e.Namespace = 16] = "Namespace", e[e.OptionalChain = 32] = "OptionalChain", e[e.ExportContext = 64] = "ExportContext", e[e.ContainsThis = 128] = "ContainsThis", e[e.HasImplicitReturn = 256] = "HasImplicitReturn", e[e.HasExplicitReturn = 512] = "HasExplicitReturn", e[e.GlobalAugmentation = 1024] = "GlobalAugmentation", e[e.HasAsyncFunctions = 2048] = "HasAsyncFunctions", e[e.DisallowInContext = 4096] = "DisallowInContext", e[e.YieldContext = 8192] = "YieldContext", e[e.DecoratorContext = 16384] = "DecoratorContext", e[e.AwaitContext = 32768] = "AwaitContext", e[e.DisallowConditionalTypesContext = 65536] = "DisallowConditionalTypesContext", e[e.ThisNodeHasError = 131072] = "ThisNodeHasError", e[e.JavaScriptFile = 262144] = "JavaScriptFile", e[e.ThisNodeOrAnySubNodesHasError = 524288] = "ThisNodeOrAnySubNodesHasError", e[e.HasAggregatedChildData = 1048576] = "HasAggregatedChildData", e[e.PossiblyContainsDynamicImport = 2097152] = "PossiblyContainsDynamicImport", e[e.PossiblyContainsImportMeta = 4194304] = "PossiblyContainsImportMeta", e[e.JSDoc = 8388608] = "JSDoc", e[e.Ambient = 16777216] = "Ambient", e[e.InWithStatement = 33554432] = "InWithStatement", e[e.JsonFile = 67108864] = "JsonFile", e[e.TypeCached = 134217728] = "TypeCached", e[e.Deprecated = 268435456] = "Deprecated", e[e.BlockScoped = 3] = "BlockScoped", e[e.ReachabilityCheckFlags = 768] = "ReachabilityCheckFlags", e[e.ReachabilityAndEmitFlags = 2816] = "ReachabilityAndEmitFlags", e[e.ContextFlags = 50720768] = "ContextFlags", e[e.TypeExcludesFlags = 40960] = "TypeExcludesFlags", e[e.PermanentlySetIncrementalFlags = 6291456] = "PermanentlySetIncrementalFlags", e[e.IdentifierHasExtendedUnicodeEscape = 128] = "IdentifierHasExtendedUnicodeEscape", e[e.IdentifierIsInJSDocNamespace = 2048] = "IdentifierIsInJSDocNamespace", e))(L8 || {}), k8 = (e => (e[e.None = 0] = "None", e[e.Export = 1] = "Export", e[e.Ambient = 2] = "Ambient", e[e.Public = 4] = "Public", e[e.Private = 8] = "Private", e[e.Protected = 16] = "Protected", e[e.Static = 32] = "Static", e[e.Readonly = 64] = "Readonly", e[e.Accessor = 128] = "Accessor", e[e.Abstract = 256] = "Abstract", e[e.Async = 512] = "Async", e[e.Default = 1024] = "Default", e[e.Const = 2048] = "Const", e[e.HasComputedJSDocModifiers = 4096] = "HasComputedJSDocModifiers", e[e.Deprecated = 8192] = "Deprecated", e[e.Override = 16384] = "Override", e[e.In = 32768] = "In", e[e.Out = 65536] = "Out", e[e.Decorator = 131072] = "Decorator", e[e.HasComputedFlags = 536870912] = "HasComputedFlags", e[e.AccessibilityModifier = 28] = "AccessibilityModifier", e[e.ParameterPropertyModifier = 16476] = "ParameterPropertyModifier", e[e.NonPublicAccessibilityModifier = 24] = "NonPublicAccessibilityModifier", e[e.TypeScriptModifier = 117086] = "TypeScriptModifier", e[e.ExportDefault = 1025] = "ExportDefault", e[e.All = 258047] = "All", e[e.Modifier = 126975] = "Modifier", e))(k8 || {}), iV = (e => (e[e.None = 0] = "None", e[e.IntrinsicNamedElement = 1] = "IntrinsicNamedElement", e[e.IntrinsicIndexedElement = 2] = "IntrinsicIndexedElement", e[e.IntrinsicElement = 3] = "IntrinsicElement", e))(iV || {}), D8 = (e => (e[e.Succeeded = 1] = "Succeeded", e[e.Failed = 2] = "Failed", e[e.Reported = 4] = "Reported", e[e.ReportsUnmeasurable = 8] = "ReportsUnmeasurable", e[e.ReportsUnreliable = 16] = "ReportsUnreliable", e[e.ReportsMask = 24] = "ReportsMask", e))(D8 || {}), w8 = (e => (e[e.None = 0] = "None", e[e.Auto = 1] = "Auto", e[e.Loop = 2] = "Loop", e[e.Unique = 3] = "Unique", e[e.Node = 4] = "Node", e[e.KindMask = 7] = "KindMask", e[e.ReservedInNestedScopes = 8] = "ReservedInNestedScopes", e[e.Optimistic = 16] = "Optimistic", e[e.FileLevel = 32] = "FileLevel", e[e.AllowNameSubstitution = 64] = "AllowNameSubstitution", e))(w8 || {}), aV = (e => (e[e.None = 0] = "None", e[e.PrecedingLineBreak = 1] = "PrecedingLineBreak", e[e.PrecedingJSDocComment = 2] = "PrecedingJSDocComment", e[e.Unterminated = 4] = "Unterminated", e[e.ExtendedUnicodeEscape = 8] = "ExtendedUnicodeEscape", e[e.Scientific = 16] = "Scientific", e[e.Octal = 32] = "Octal", e[e.HexSpecifier = 64] = "HexSpecifier", e[e.BinarySpecifier = 128] = "BinarySpecifier", e[e.OctalSpecifier = 256] = "OctalSpecifier", e[e.ContainsSeparator = 512] = "ContainsSeparator", e[e.UnicodeEscape = 1024] = "UnicodeEscape", e[e.ContainsInvalidEscape = 2048] = "ContainsInvalidEscape", e[e.BinaryOrOctalSpecifier = 384] = "BinaryOrOctalSpecifier", e[e.NumericLiteralFlags = 1008] = "NumericLiteralFlags", e[e.TemplateLiteralLikeFlags = 2048] = "TemplateLiteralLikeFlags", e))(aV || {}), tw = (e => (e[e.Unreachable = 1] = "Unreachable", e[e.Start = 2] = "Start", e[e.BranchLabel = 4] = "BranchLabel", e[e.LoopLabel = 8] = "LoopLabel", e[e.Assignment = 16] = "Assignment", e[e.TrueCondition = 32] = "TrueCondition", e[e.FalseCondition = 64] = "FalseCondition", e[e.SwitchClause = 128] = "SwitchClause", e[e.ArrayMutation = 256] = "ArrayMutation", e[e.Call = 512] = "Call", e[e.ReduceLabel = 1024] = "ReduceLabel", e[e.Referenced = 2048] = "Referenced", e[e.Shared = 4096] = "Shared", e[e.Label = 12] = "Label", e[e.Condition = 96] = "Condition", e))(tw || {}), oV = (e => (e[e.ExpectError = 0] = "ExpectError", e[e.Ignore = 1] = "Ignore", e))(oV || {}), tI = class { }, R8 = (e => (e[e.RootFile = 0] = "RootFile", e[e.SourceFromProjectReference = 1] = "SourceFromProjectReference", e[e.OutputFromProjectReference = 2] = "OutputFromProjectReference", e[e.Import = 3] = "Import", e[e.ReferenceFile = 4] = "ReferenceFile", e[e.TypeReferenceDirective = 5] = "TypeReferenceDirective", e[e.LibFile = 6] = "LibFile", e[e.LibReferenceDirective = 7] = "LibReferenceDirective", e[e.AutomaticTypeDirectiveFile = 8] = "AutomaticTypeDirectiveFile", e))(R8 || {}), sV = (e => (e[e.FilePreprocessingReferencedDiagnostic = 0] = "FilePreprocessingReferencedDiagnostic", e[e.FilePreprocessingFileExplainingDiagnostic = 1] = "FilePreprocessingFileExplainingDiagnostic", e[e.ResolutionDiagnostics = 2] = "ResolutionDiagnostics", e))(sV || {}), cV = (e => (e[e.Js = 0] = "Js", e[e.Dts = 1] = "Dts", e))(cV || {}), lV = (e => (e[e.Not = 0] = "Not", e[e.SafeModules = 1] = "SafeModules", e[e.Completely = 2] = "Completely", e))(lV || {}), uV = (e => (e[e.Success = 0] = "Success", e[e.DiagnosticsPresent_OutputsSkipped = 1] = "DiagnosticsPresent_OutputsSkipped", e[e.DiagnosticsPresent_OutputsGenerated = 2] = "DiagnosticsPresent_OutputsGenerated", e[e.InvalidProject_OutputsSkipped = 3] = "InvalidProject_OutputsSkipped", e[e.ProjectReferenceCycle_OutputsSkipped = 4] = "ProjectReferenceCycle_OutputsSkipped", e))(uV || {}), dV = (e => (e[e.Ok = 0] = "Ok", e[e.NeedsOverride = 1] = "NeedsOverride", e[e.HasInvalidOverride = 2] = "HasInvalidOverride", e))(dV || {}), fV = (e => (e[e.None = 0] = "None", e[e.Literal = 1] = "Literal", e[e.Subtype = 2] = "Subtype", e))(fV || {}), _V = (e => (e[e.None = 0] = "None", e[e.Signature = 1] = "Signature", e[e.NoConstraints = 2] = "NoConstraints", e[e.Completions = 4] = "Completions", e[e.SkipBindingPatterns = 8] = "SkipBindingPatterns", e))(_V || {}), pV = (e => (e[e.None = 0] = "None", e[e.NoTruncation = 1] = "NoTruncation", e[e.WriteArrayAsGenericType = 2] = "WriteArrayAsGenericType", e[e.GenerateNamesForShadowedTypeParams = 4] = "GenerateNamesForShadowedTypeParams", e[e.UseStructuralFallback = 8] = "UseStructuralFallback", e[e.ForbidIndexedAccessSymbolReferences = 16] = "ForbidIndexedAccessSymbolReferences", e[e.WriteTypeArgumentsOfSignature = 32] = "WriteTypeArgumentsOfSignature", e[e.UseFullyQualifiedType = 64] = "UseFullyQualifiedType", e[e.UseOnlyExternalAliasing = 128] = "UseOnlyExternalAliasing", e[e.SuppressAnyReturnType = 256] = "SuppressAnyReturnType", e[e.WriteTypeParametersInQualifiedName = 512] = "WriteTypeParametersInQualifiedName", e[e.MultilineObjectLiterals = 1024] = "MultilineObjectLiterals", e[e.WriteClassExpressionAsTypeLiteral = 2048] = "WriteClassExpressionAsTypeLiteral", e[e.UseTypeOfFunction = 4096] = "UseTypeOfFunction", e[e.OmitParameterModifiers = 8192] = "OmitParameterModifiers", e[e.UseAliasDefinedOutsideCurrentScope = 16384] = "UseAliasDefinedOutsideCurrentScope", e[e.UseSingleQuotesForStringLiteralType = 268435456] = "UseSingleQuotesForStringLiteralType", e[e.NoTypeReduction = 536870912] = "NoTypeReduction", e[e.OmitThisParameter = 33554432] = "OmitThisParameter", e[e.AllowThisInObjectLiteral = 32768] = "AllowThisInObjectLiteral", e[e.AllowQualifiedNameInPlaceOfIdentifier = 65536] = "AllowQualifiedNameInPlaceOfIdentifier", e[e.AllowAnonymousIdentifier = 131072] = "AllowAnonymousIdentifier", e[e.AllowEmptyUnionOrIntersection = 262144] = "AllowEmptyUnionOrIntersection", e[e.AllowEmptyTuple = 524288] = "AllowEmptyTuple", e[e.AllowUniqueESSymbolType = 1048576] = "AllowUniqueESSymbolType", e[e.AllowEmptyIndexInfoType = 2097152] = "AllowEmptyIndexInfoType", e[e.WriteComputedProps = 1073741824] = "WriteComputedProps", e[e.AllowNodeModulesRelativePaths = 67108864] = "AllowNodeModulesRelativePaths", e[e.DoNotIncludeSymbolChain = 134217728] = "DoNotIncludeSymbolChain", e[e.IgnoreErrors = 70221824] = "IgnoreErrors", e[e.InObjectTypeLiteral = 4194304] = "InObjectTypeLiteral", e[e.InTypeAlias = 8388608] = "InTypeAlias", e[e.InInitialEntityName = 16777216] = "InInitialEntityName", e))(pV || {}), mV = (e => (e[e.None = 0] = "None", e[e.NoTruncation = 1] = "NoTruncation", e[e.WriteArrayAsGenericType = 2] = "WriteArrayAsGenericType", e[e.UseStructuralFallback = 8] = "UseStructuralFallback", e[e.WriteTypeArgumentsOfSignature = 32] = "WriteTypeArgumentsOfSignature", e[e.UseFullyQualifiedType = 64] = "UseFullyQualifiedType", e[e.SuppressAnyReturnType = 256] = "SuppressAnyReturnType", e[e.MultilineObjectLiterals = 1024] = "MultilineObjectLiterals", e[e.WriteClassExpressionAsTypeLiteral = 2048] = "WriteClassExpressionAsTypeLiteral", e[e.UseTypeOfFunction = 4096] = "UseTypeOfFunction", e[e.OmitParameterModifiers = 8192] = "OmitParameterModifiers", e[e.UseAliasDefinedOutsideCurrentScope = 16384] = "UseAliasDefinedOutsideCurrentScope", e[e.UseSingleQuotesForStringLiteralType = 268435456] = "UseSingleQuotesForStringLiteralType", e[e.NoTypeReduction = 536870912] = "NoTypeReduction", e[e.OmitThisParameter = 33554432] = "OmitThisParameter", e[e.AllowUniqueESSymbolType = 1048576] = "AllowUniqueESSymbolType", e[e.AddUndefined = 131072] = "AddUndefined", e[e.WriteArrowStyleSignature = 262144] = "WriteArrowStyleSignature", e[e.InArrayType = 524288] = "InArrayType", e[e.InElementType = 2097152] = "InElementType", e[e.InFirstTypeArgument = 4194304] = "InFirstTypeArgument", e[e.InTypeAlias = 8388608] = "InTypeAlias", e[e.NodeBuilderFlagsMask = 848330091] = "NodeBuilderFlagsMask", e))(mV || {}), hV = (e => (e[e.None = 0] = "None", e[e.WriteTypeParametersOrArguments = 1] = "WriteTypeParametersOrArguments", e[e.UseOnlyExternalAliasing = 2] = "UseOnlyExternalAliasing", e[e.AllowAnyNodeKind = 4] = "AllowAnyNodeKind", e[e.UseAliasDefinedOutsideCurrentScope = 8] = "UseAliasDefinedOutsideCurrentScope", e[e.WriteComputedProps = 16] = "WriteComputedProps", e[e.DoNotIncludeSymbolChain = 32] = "DoNotIncludeSymbolChain", e))(hV || {}), gV = (e => (e[e.Accessible = 0] = "Accessible", e[e.NotAccessible = 1] = "NotAccessible", e[e.CannotBeNamed = 2] = "CannotBeNamed", e))(gV || {}), yV = (e => (e[e.UnionOrIntersection = 0] = "UnionOrIntersection", e[e.Spread = 1] = "Spread", e))(yV || {}), vV = (e => (e[e.This = 0] = "This", e[e.Identifier = 1] = "Identifier", e[e.AssertsThis = 2] = "AssertsThis", e[e.AssertsIdentifier = 3] = "AssertsIdentifier", e))(vV || {}), bV = (e => (e[e.Unknown = 0] = "Unknown", e[e.TypeWithConstructSignatureAndValue = 1] = "TypeWithConstructSignatureAndValue", e[e.VoidNullableOrNeverType = 2] = "VoidNullableOrNeverType", e[e.NumberLikeType = 3] = "NumberLikeType", e[e.BigIntLikeType = 4] = "BigIntLikeType", e[e.StringLikeType = 5] = "StringLikeType", e[e.BooleanType = 6] = "BooleanType", e[e.ArrayLikeType = 7] = "ArrayLikeType", e[e.ESSymbolType = 8] = "ESSymbolType", e[e.Promise = 9] = "Promise", e[e.TypeWithCallSignature = 10] = "TypeWithCallSignature", e[e.ObjectType = 11] = "ObjectType", e))(bV || {}), O8 = (e => (e[e.None = 0] = "None", e[e.FunctionScopedVariable = 1] = "FunctionScopedVariable", e[e.BlockScopedVariable = 2] = "BlockScopedVariable", e[e.Property = 4] = "Property", e[e.EnumMember = 8] = "EnumMember", e[e.Function = 16] = "Function", e[e.Class = 32] = "Class", e[e.Interface = 64] = "Interface", e[e.ConstEnum = 128] = "ConstEnum", e[e.RegularEnum = 256] = "RegularEnum", e[e.ValueModule = 512] = "ValueModule", e[e.NamespaceModule = 1024] = "NamespaceModule", e[e.TypeLiteral = 2048] = "TypeLiteral", e[e.ObjectLiteral = 4096] = "ObjectLiteral", e[e.Method = 8192] = "Method", e[e.Constructor = 16384] = "Constructor", e[e.GetAccessor = 32768] = "GetAccessor", e[e.SetAccessor = 65536] = "SetAccessor", e[e.Signature = 131072] = "Signature", e[e.TypeParameter = 262144] = "TypeParameter", e[e.TypeAlias = 524288] = "TypeAlias", e[e.ExportValue = 1048576] = "ExportValue", e[e.Alias = 2097152] = "Alias", e[e.Prototype = 4194304] = "Prototype", e[e.ExportStar = 8388608] = "ExportStar", e[e.Optional = 16777216] = "Optional", e[e.Transient = 33554432] = "Transient", e[e.Assignment = 67108864] = "Assignment", e[e.ModuleExports = 134217728] = "ModuleExports", e[e.All = 67108863] = "All", e[e.Enum = 384] = "Enum", e[e.Variable = 3] = "Variable", e[e.Value = 111551] = "Value", e[e.Type = 788968] = "Type", e[e.Namespace = 1920] = "Namespace", e[e.Module = 1536] = "Module", e[e.Accessor = 98304] = "Accessor", e[e.FunctionScopedVariableExcludes = 111550] = "FunctionScopedVariableExcludes", e[e.BlockScopedVariableExcludes = 111551] = "BlockScopedVariableExcludes", e[e.ParameterExcludes = 111551] = "ParameterExcludes", e[e.PropertyExcludes = 0] = "PropertyExcludes", e[e.EnumMemberExcludes = 900095] = "EnumMemberExcludes", e[e.FunctionExcludes = 110991] = "FunctionExcludes", e[e.ClassExcludes = 899503] = "ClassExcludes", e[e.InterfaceExcludes = 788872] = "InterfaceExcludes", e[e.RegularEnumExcludes = 899327] = "RegularEnumExcludes", e[e.ConstEnumExcludes = 899967] = "ConstEnumExcludes", e[e.ValueModuleExcludes = 110735] = "ValueModuleExcludes", e[e.NamespaceModuleExcludes = 0] = "NamespaceModuleExcludes", e[e.MethodExcludes = 103359] = "MethodExcludes", e[e.GetAccessorExcludes = 46015] = "GetAccessorExcludes", e[e.SetAccessorExcludes = 78783] = "SetAccessorExcludes", e[e.AccessorExcludes = 13247] = "AccessorExcludes", e[e.TypeParameterExcludes = 526824] = "TypeParameterExcludes", e[e.TypeAliasExcludes = 788968] = "TypeAliasExcludes", e[e.AliasExcludes = 2097152] = "AliasExcludes", e[e.ModuleMember = 2623475] = "ModuleMember", e[e.ExportHasLocal = 944] = "ExportHasLocal", e[e.BlockScoped = 418] = "BlockScoped", e[e.PropertyOrAccessor = 98308] = "PropertyOrAccessor", e[e.ClassMember = 106500] = "ClassMember", e[e.ExportSupportsDefaultModifier = 112] = "ExportSupportsDefaultModifier", e[e.ExportDoesNotSupportDefaultModifier = -113] = "ExportDoesNotSupportDefaultModifier", e[e.Classifiable = 2885600] = "Classifiable", e[e.LateBindingContainer = 6256] = "LateBindingContainer", e))(O8 || {}), EV = (e => (e[e.Numeric = 0] = "Numeric", e[e.Literal = 1] = "Literal", e))(EV || {}), TV = (e => (e[e.None = 0] = "None", e[e.Instantiated = 1] = "Instantiated", e[e.SyntheticProperty = 2] = "SyntheticProperty", e[e.SyntheticMethod = 4] = "SyntheticMethod", e[e.Readonly = 8] = "Readonly", e[e.ReadPartial = 16] = "ReadPartial", e[e.WritePartial = 32] = "WritePartial", e[e.HasNonUniformType = 64] = "HasNonUniformType", e[e.HasLiteralType = 128] = "HasLiteralType", e[e.ContainsPublic = 256] = "ContainsPublic", e[e.ContainsProtected = 512] = "ContainsProtected", e[e.ContainsPrivate = 1024] = "ContainsPrivate", e[e.ContainsStatic = 2048] = "ContainsStatic", e[e.Late = 4096] = "Late", e[e.ReverseMapped = 8192] = "ReverseMapped", e[e.OptionalParameter = 16384] = "OptionalParameter", e[e.RestParameter = 32768] = "RestParameter", e[e.DeferredType = 65536] = "DeferredType", e[e.HasNeverType = 131072] = "HasNeverType", e[e.Mapped = 262144] = "Mapped", e[e.StripOptional = 524288] = "StripOptional", e[e.Unresolved = 1048576] = "Unresolved", e[e.Synthetic = 6] = "Synthetic", e[e.Discriminant = 192] = "Discriminant", e[e.Partial = 48] = "Partial", e))(TV || {}), SV = (e => (e.Call = "__call", e.Constructor = "__constructor", e.New = "__new", e.Index = "__index", e.ExportStar = "__export", e.Global = "__global", e.Missing = "__missing", e.Type = "__type", e.Object = "__object", e.JSXAttributes = "__jsxAttributes", e.Class = "__class", e.Function = "__function", e.Computed = "__computed", e.Resolving = "__resolving__", e.ExportEquals = "export=", e.Default = "default", e.This = "this", e))(SV || {}), xV = (e => (e[e.None = 0] = "None", e[e.TypeChecked = 1] = "TypeChecked", e[e.LexicalThis = 2] = "LexicalThis", e[e.CaptureThis = 4] = "CaptureThis", e[e.CaptureNewTarget = 8] = "CaptureNewTarget", e[e.SuperInstance = 16] = "SuperInstance", e[e.SuperStatic = 32] = "SuperStatic", e[e.ContextChecked = 64] = "ContextChecked", e[e.MethodWithSuperPropertyAccessInAsync = 128] = "MethodWithSuperPropertyAccessInAsync", e[e.MethodWithSuperPropertyAssignmentInAsync = 256] = "MethodWithSuperPropertyAssignmentInAsync", e[e.CaptureArguments = 512] = "CaptureArguments", e[e.EnumValuesComputed = 1024] = "EnumValuesComputed", e[e.LexicalModuleMergesWithClass = 2048] = "LexicalModuleMergesWithClass", e[e.LoopWithCapturedBlockScopedBinding = 4096] = "LoopWithCapturedBlockScopedBinding", e[e.ContainsCapturedBlockScopeBinding = 8192] = "ContainsCapturedBlockScopeBinding", e[e.CapturedBlockScopedBinding = 16384] = "CapturedBlockScopedBinding", e[e.BlockScopedBindingInLoop = 32768] = "BlockScopedBindingInLoop", e[e.ClassWithBodyScopedClassBinding = 65536] = "ClassWithBodyScopedClassBinding", e[e.BodyScopedClassBinding = 131072] = "BodyScopedClassBinding", e[e.NeedsLoopOutParameter = 262144] = "NeedsLoopOutParameter", e[e.AssignmentsMarked = 524288] = "AssignmentsMarked", e[e.ClassWithConstructorReference = 1048576] = "ClassWithConstructorReference", e[e.ConstructorReferenceInClass = 2097152] = "ConstructorReferenceInClass", e[e.ContainsClassWithPrivateIdentifiers = 4194304] = "ContainsClassWithPrivateIdentifiers", e[e.ContainsSuperPropertyInStaticInitializer = 8388608] = "ContainsSuperPropertyInStaticInitializer", e[e.InCheckIdentifier = 16777216] = "InCheckIdentifier", e))(xV || {}), N8 = (e => (e[e.Any = 1] = "Any", e[e.Unknown = 2] = "Unknown", e[e.String = 4] = "String", e[e.Number = 8] = "Number", e[e.Boolean = 16] = "Boolean", e[e.Enum = 32] = "Enum", e[e.BigInt = 64] = "BigInt", e[e.StringLiteral = 128] = "StringLiteral", e[e.NumberLiteral = 256] = "NumberLiteral", e[e.BooleanLiteral = 512] = "BooleanLiteral", e[e.EnumLiteral = 1024] = "EnumLiteral", e[e.BigIntLiteral = 2048] = "BigIntLiteral", e[e.ESSymbol = 4096] = "ESSymbol", e[e.UniqueESSymbol = 8192] = "UniqueESSymbol", e[e.Void = 16384] = "Void", e[e.Undefined = 32768] = "Undefined", e[e.Null = 65536] = "Null", e[e.Never = 131072] = "Never", e[e.TypeParameter = 262144] = "TypeParameter", e[e.Object = 524288] = "Object", e[e.Union = 1048576] = "Union", e[e.Intersection = 2097152] = "Intersection", e[e.Index = 4194304] = "Index", e[e.IndexedAccess = 8388608] = "IndexedAccess", e[e.Conditional = 16777216] = "Conditional", e[e.Substitution = 33554432] = "Substitution", e[e.NonPrimitive = 67108864] = "NonPrimitive", e[e.TemplateLiteral = 134217728] = "TemplateLiteral", e[e.StringMapping = 268435456] = "StringMapping", e[e.AnyOrUnknown = 3] = "AnyOrUnknown", e[e.Nullable = 98304] = "Nullable", e[e.Literal = 2944] = "Literal", e[e.Unit = 109472] = "Unit", e[e.Freshable = 2976] = "Freshable", e[e.StringOrNumberLiteral = 384] = "StringOrNumberLiteral", e[e.StringOrNumberLiteralOrUnique = 8576] = "StringOrNumberLiteralOrUnique", e[e.DefinitelyFalsy = 117632] = "DefinitelyFalsy", e[e.PossiblyFalsy = 117724] = "PossiblyFalsy", e[e.Intrinsic = 67359327] = "Intrinsic", e[e.Primitive = 134348796] = "Primitive", e[e.StringLike = 402653316] = "StringLike", e[e.NumberLike = 296] = "NumberLike", e[e.BigIntLike = 2112] = "BigIntLike", e[e.BooleanLike = 528] = "BooleanLike", e[e.EnumLike = 1056] = "EnumLike", e[e.ESSymbolLike = 12288] = "ESSymbolLike", e[e.VoidLike = 49152] = "VoidLike", e[e.DefinitelyNonNullable = 470302716] = "DefinitelyNonNullable", e[e.DisjointDomains = 469892092] = "DisjointDomains", e[e.UnionOrIntersection = 3145728] = "UnionOrIntersection", e[e.StructuredType = 3670016] = "StructuredType", e[e.TypeVariable = 8650752] = "TypeVariable", e[e.InstantiableNonPrimitive = 58982400] = "InstantiableNonPrimitive", e[e.InstantiablePrimitive = 406847488] = "InstantiablePrimitive", e[e.Instantiable = 465829888] = "Instantiable", e[e.StructuredOrInstantiable = 469499904] = "StructuredOrInstantiable", e[e.ObjectFlagsType = 3899393] = "ObjectFlagsType", e[e.Simplifiable = 25165824] = "Simplifiable", e[e.Singleton = 67358815] = "Singleton", e[e.Narrowable = 536624127] = "Narrowable", e[e.IncludesMask = 205258751] = "IncludesMask", e[e.IncludesMissingType = 262144] = "IncludesMissingType", e[e.IncludesNonWideningType = 4194304] = "IncludesNonWideningType", e[e.IncludesWildcard = 8388608] = "IncludesWildcard", e[e.IncludesEmptyObject = 16777216] = "IncludesEmptyObject", e[e.IncludesInstantiable = 33554432] = "IncludesInstantiable", e[e.NotPrimitiveUnion = 36323363] = "NotPrimitiveUnion", e))(N8 || {}), P8 = (e => (e[e.None = 0] = "None", e[e.Class = 1] = "Class", e[e.Interface = 2] = "Interface", e[e.Reference = 4] = "Reference", e[e.Tuple = 8] = "Tuple", e[e.Anonymous = 16] = "Anonymous", e[e.Mapped = 32] = "Mapped", e[e.Instantiated = 64] = "Instantiated", e[e.ObjectLiteral = 128] = "ObjectLiteral", e[e.EvolvingArray = 256] = "EvolvingArray", e[e.ObjectLiteralPatternWithComputedProperties = 512] = "ObjectLiteralPatternWithComputedProperties", e[e.ReverseMapped = 1024] = "ReverseMapped", e[e.JsxAttributes = 2048] = "JsxAttributes", e[e.JSLiteral = 4096] = "JSLiteral", e[e.FreshLiteral = 8192] = "FreshLiteral", e[e.ArrayLiteral = 16384] = "ArrayLiteral", e[e.PrimitiveUnion = 32768] = "PrimitiveUnion", e[e.ContainsWideningType = 65536] = "ContainsWideningType", e[e.ContainsObjectOrArrayLiteral = 131072] = "ContainsObjectOrArrayLiteral", e[e.NonInferrableType = 262144] = "NonInferrableType", e[e.CouldContainTypeVariablesComputed = 524288] = "CouldContainTypeVariablesComputed", e[e.CouldContainTypeVariables = 1048576] = "CouldContainTypeVariables", e[e.ClassOrInterface = 3] = "ClassOrInterface", e[e.RequiresWidening = 196608] = "RequiresWidening", e[e.PropagatingFlags = 458752] = "PropagatingFlags", e[e.ObjectTypeKindMask = 1343] = "ObjectTypeKindMask", e[e.ContainsSpread = 2097152] = "ContainsSpread", e[e.ObjectRestType = 4194304] = "ObjectRestType", e[e.InstantiationExpressionType = 8388608] = "InstantiationExpressionType", e[e.IsClassInstanceClone = 16777216] = "IsClassInstanceClone", e[e.IdenticalBaseTypeCalculated = 33554432] = "IdenticalBaseTypeCalculated", e[e.IdenticalBaseTypeExists = 67108864] = "IdenticalBaseTypeExists", e[e.IsGenericTypeComputed = 2097152] = "IsGenericTypeComputed", e[e.IsGenericObjectType = 4194304] = "IsGenericObjectType", e[e.IsGenericIndexType = 8388608] = "IsGenericIndexType", e[e.IsGenericType = 12582912] = "IsGenericType", e[e.ContainsIntersections = 16777216] = "ContainsIntersections", e[e.IsUnknownLikeUnionComputed = 33554432] = "IsUnknownLikeUnionComputed", e[e.IsUnknownLikeUnion = 67108864] = "IsUnknownLikeUnion", e[e.IsNeverIntersectionComputed = 16777216] = "IsNeverIntersectionComputed", e[e.IsNeverIntersection = 33554432] = "IsNeverIntersection", e))(P8 || {}), AV = (e => (e[e.Invariant = 0] = "Invariant", e[e.Covariant = 1] = "Covariant", e[e.Contravariant = 2] = "Contravariant", e[e.Bivariant = 3] = "Bivariant", e[e.Independent = 4] = "Independent", e[e.VarianceMask = 7] = "VarianceMask", e[e.Unmeasurable = 8] = "Unmeasurable", e[e.Unreliable = 16] = "Unreliable", e[e.AllowsStructuralFallback = 24] = "AllowsStructuralFallback", e))(AV || {}), CV = (e => (e[e.Required = 1] = "Required", e[e.Optional = 2] = "Optional", e[e.Rest = 4] = "Rest", e[e.Variadic = 8] = "Variadic", e[e.Fixed = 3] = "Fixed", e[e.Variable = 12] = "Variable", e[e.NonRequired = 14] = "NonRequired", e[e.NonRest = 11] = "NonRest", e))(CV || {}), IV = (e => (e[e.None = 0] = "None", e[e.IncludeUndefined = 1] = "IncludeUndefined", e[e.NoIndexSignatures = 2] = "NoIndexSignatures", e[e.Writing = 4] = "Writing", e[e.CacheSymbol = 8] = "CacheSymbol", e[e.NoTupleBoundsCheck = 16] = "NoTupleBoundsCheck", e[e.ExpressionPosition = 32] = "ExpressionPosition", e[e.ReportDeprecated = 64] = "ReportDeprecated", e[e.SuppressNoImplicitAnyError = 128] = "SuppressNoImplicitAnyError", e[e.Contextual = 256] = "Contextual", e[e.Persistent = 1] = "Persistent", e))(IV || {}), LV = (e => (e[e.Component = 0] = "Component", e[e.Function = 1] = "Function", e[e.Mixed = 2] = "Mixed", e))(LV || {}), kV = (e => (e[e.Call = 0] = "Call", e[e.Construct = 1] = "Construct", e))(kV || {}), M8 = (e => (e[e.None = 0] = "None", e[e.HasRestParameter = 1] = "HasRestParameter", e[e.HasLiteralTypes = 2] = "HasLiteralTypes", e[e.Abstract = 4] = "Abstract", e[e.IsInnerCallChain = 8] = "IsInnerCallChain", e[e.IsOuterCallChain = 16] = "IsOuterCallChain", e[e.IsUntypedSignatureInJSFile = 32] = "IsUntypedSignatureInJSFile", e[e.PropagatingFlags = 39] = "PropagatingFlags", e[e.CallChainFlags = 24] = "CallChainFlags", e))(M8 || {}), DV = (e => (e[e.String = 0] = "String", e[e.Number = 1] = "Number", e))(DV || {}), wV = (e => (e[e.Simple = 0] = "Simple", e[e.Array = 1] = "Array", e[e.Deferred = 2] = "Deferred", e[e.Function = 3] = "Function", e[e.Composite = 4] = "Composite", e[e.Merged = 5] = "Merged", e))(wV || {}), RV = (e => (e[e.None = 0] = "None", e[e.NakedTypeVariable = 1] = "NakedTypeVariable", e[e.SpeculativeTuple = 2] = "SpeculativeTuple", e[e.SubstituteSource = 4] = "SubstituteSource", e[e.HomomorphicMappedType = 8] = "HomomorphicMappedType", e[e.PartialHomomorphicMappedType = 16] = "PartialHomomorphicMappedType", e[e.MappedTypeConstraint = 32] = "MappedTypeConstraint", e[e.ContravariantConditional = 64] = "ContravariantConditional", e[e.ReturnType = 128] = "ReturnType", e[e.LiteralKeyof = 256] = "LiteralKeyof", e[e.NoConstraints = 512] = "NoConstraints", e[e.AlwaysStrict = 1024] = "AlwaysStrict", e[e.MaxValue = 2048] = "MaxValue", e[e.PriorityImpliesCombination = 416] = "PriorityImpliesCombination", e[e.Circularity = -1] = "Circularity", e))(RV || {}), OV = (e => (e[e.None = 0] = "None", e[e.NoDefault = 1] = "NoDefault", e[e.AnyDefault = 2] = "AnyDefault", e[e.SkippedGenericFunction = 4] = "SkippedGenericFunction", e))(OV || {}), NV = (e => (e[e.False = 0] = "False", e[e.Unknown = 1] = "Unknown", e[e.Maybe = 3] = "Maybe", e[e.True = -1] = "True", e))(NV || {}), PV = (e => (e[e.None = 0] = "None", e[e.ExportsProperty = 1] = "ExportsProperty", e[e.ModuleExports = 2] = "ModuleExports", e[e.PrototypeProperty = 3] = "PrototypeProperty", e[e.ThisProperty = 4] = "ThisProperty", e[e.Property = 5] = "Property", e[e.Prototype = 6] = "Prototype", e[e.ObjectDefinePropertyValue = 7] = "ObjectDefinePropertyValue", e[e.ObjectDefinePropertyExports = 8] = "ObjectDefinePropertyExports", e[e.ObjectDefinePrototypeProperty = 9] = "ObjectDefinePrototypeProperty", e))(PV || {}), nw = (e => (e[e.Warning = 0] = "Warning", e[e.Error = 1] = "Error", e[e.Suggestion = 2] = "Suggestion", e[e.Message = 3] = "Message", e))(nw || {}), rw = (e => (e[e.Classic = 1] = "Classic", e[e.NodeJs = 2] = "NodeJs", e[e.Node10 = 2] = "Node10", e[e.Node16 = 3] = "Node16", e[e.NodeNext = 99] = "NodeNext", e[e.Bundler = 100] = "Bundler", e))(rw || {}), MV = (e => (e[e.Legacy = 1] = "Legacy", e[e.Auto = 2] = "Auto", e[e.Force = 3] = "Force", e))(MV || {}), FV = (e => (e[e.FixedPollingInterval = 0] = "FixedPollingInterval", e[e.PriorityPollingInterval = 1] = "PriorityPollingInterval", e[e.DynamicPriorityPolling = 2] = "DynamicPriorityPolling", e[e.FixedChunkSizePolling = 3] = "FixedChunkSizePolling", e[e.UseFsEvents = 4] = "UseFsEvents", e[e.UseFsEventsOnParentDirectory = 5] = "UseFsEventsOnParentDirectory", e))(FV || {}), GV = (e => (e[e.UseFsEvents = 0] = "UseFsEvents", e[e.FixedPollingInterval = 1] = "FixedPollingInterval", e[e.DynamicPriorityPolling = 2] = "DynamicPriorityPolling", e[e.FixedChunkSizePolling = 3] = "FixedChunkSizePolling", e))(GV || {}), BV = (e => (e[e.FixedInterval = 0] = "FixedInterval", e[e.PriorityInterval = 1] = "PriorityInterval", e[e.DynamicPriority = 2] = "DynamicPriority", e[e.FixedChunkSize = 3] = "FixedChunkSize", e))(BV || {}), F8 = (e => (e[e.None = 0] = "None", e[e.CommonJS = 1] = "CommonJS", e[e.AMD = 2] = "AMD", e[e.UMD = 3] = "UMD", e[e.System = 4] = "System", e[e.ES2015 = 5] = "ES2015", e[e.ES2020 = 6] = "ES2020", e[e.ES2022 = 7] = "ES2022", e[e.ESNext = 99] = "ESNext", e[e.Node16 = 100] = "Node16", e[e.NodeNext = 199] = "NodeNext", e))(F8 || {}), UV = (e => (e[e.None = 0] = "None", e[e.Preserve = 1] = "Preserve", e[e.React = 2] = "React", e[e.ReactNative = 3] = "ReactNative", e[e.ReactJSX = 4] = "ReactJSX", e[e.ReactJSXDev = 5] = "ReactJSXDev", e))(UV || {}), VV = (e => (e[e.Remove = 0] = "Remove", e[e.Preserve = 1] = "Preserve", e[e.Error = 2] = "Error", e))(VV || {}), jV = (e => (e[e.CarriageReturnLineFeed = 0] = "CarriageReturnLineFeed", e[e.LineFeed = 1] = "LineFeed", e))(jV || {}), HV = (e => (e[e.Unknown = 0] = "Unknown", e[e.JS = 1] = "JS", e[e.JSX = 2] = "JSX", e[e.TS = 3] = "TS", e[e.TSX = 4] = "TSX", e[e.External = 5] = "External", e[e.JSON = 6] = "JSON", e[e.Deferred = 7] = "Deferred", e))(HV || {}), WV = (e => (e[e.ES3 = 0] = "ES3", e[e.ES5 = 1] = "ES5", e[e.ES2015 = 2] = "ES2015", e[e.ES2016 = 3] = "ES2016", e[e.ES2017 = 4] = "ES2017", e[e.ES2018 = 5] = "ES2018", e[e.ES2019 = 6] = "ES2019", e[e.ES2020 = 7] = "ES2020", e[e.ES2021 = 8] = "ES2021", e[e.ES2022 = 9] = "ES2022", e[e.ESNext = 99] = "ESNext", e[e.JSON = 100] = "JSON", e[e.Latest = 99] = "Latest", e))(WV || {}), zV = (e => (e[e.Standard = 0] = "Standard", e[e.JSX = 1] = "JSX", e))(zV || {}), JV = (e => (e[e.None = 0] = "None", e[e.Recursive = 1] = "Recursive", e))(JV || {}), KV = (e => (e[e.nullCharacter = 0] = "nullCharacter", e[e.maxAsciiCharacter = 127] = "maxAsciiCharacter", e[e.lineFeed = 10] = "lineFeed", e[e.carriageReturn = 13] = "carriageReturn", e[e.lineSeparator = 8232] = "lineSeparator", e[e.paragraphSeparator = 8233] = "paragraphSeparator", e[e.nextLine = 133] = "nextLine", e[e.space = 32] = "space", e[e.nonBreakingSpace = 160] = "nonBreakingSpace", e[e.enQuad = 8192] = "enQuad", e[e.emQuad = 8193] = "emQuad", e[e.enSpace = 8194] = "enSpace", e[e.emSpace = 8195] = "emSpace", e[e.threePerEmSpace = 8196] = "threePerEmSpace", e[e.fourPerEmSpace = 8197] = "fourPerEmSpace", e[e.sixPerEmSpace = 8198] = "sixPerEmSpace", e[e.figureSpace = 8199] = "figureSpace", e[e.punctuationSpace = 8200] = "punctuationSpace", e[e.thinSpace = 8201] = "thinSpace", e[e.hairSpace = 8202] = "hairSpace", e[e.zeroWidthSpace = 8203] = "zeroWidthSpace", e[e.narrowNoBreakSpace = 8239] = "narrowNoBreakSpace", e[e.ideographicSpace = 12288] = "ideographicSpace", e[e.mathematicalSpace = 8287] = "mathematicalSpace", e[e.ogham = 5760] = "ogham", e[e._ = 95] = "_", e[e.$ = 36] = "$", e[e._0 = 48] = "_0", e[e._1 = 49] = "_1", e[e._2 = 50] = "_2", e[e._3 = 51] = "_3", e[e._4 = 52] = "_4", e[e._5 = 53] = "_5", e[e._6 = 54] = "_6", e[e._7 = 55] = "_7", e[e._8 = 56] = "_8", e[e._9 = 57] = "_9", e[e.a = 97] = "a", e[e.b = 98] = "b", e[e.c = 99] = "c", e[e.d = 100] = "d", e[e.e = 101] = "e", e[e.f = 102] = "f", e[e.g = 103] = "g", e[e.h = 104] = "h", e[e.i = 105] = "i", e[e.j = 106] = "j", e[e.k = 107] = "k", e[e.l = 108] = "l", e[e.m = 109] = "m", e[e.n = 110] = "n", e[e.o = 111] = "o", e[e.p = 112] = "p", e[e.q = 113] = "q", e[e.r = 114] = "r", e[e.s = 115] = "s", e[e.t = 116] = "t", e[e.u = 117] = "u", e[e.v = 118] = "v", e[e.w = 119] = "w", e[e.x = 120] = "x", e[e.y = 121] = "y", e[e.z = 122] = "z", e[e.A = 65] = "A", e[e.B = 66] = "B", e[e.C = 67] = "C", e[e.D = 68] = "D", e[e.E = 69] = "E", e[e.F = 70] = "F", e[e.G = 71] = "G", e[e.H = 72] = "H", e[e.I = 73] = "I", e[e.J = 74] = "J", e[e.K = 75] = "K", e[e.L = 76] = "L", e[e.M = 77] = "M", e[e.N = 78] = "N", e[e.O = 79] = "O", e[e.P = 80] = "P", e[e.Q = 81] = "Q", e[e.R = 82] = "R", e[e.S = 83] = "S", e[e.T = 84] = "T", e[e.U = 85] = "U", e[e.V = 86] = "V", e[e.W = 87] = "W", e[e.X = 88] = "X", e[e.Y = 89] = "Y", e[e.Z = 90] = "Z", e[e.ampersand = 38] = "ampersand", e[e.asterisk = 42] = "asterisk", e[e.at = 64] = "at", e[e.backslash = 92] = "backslash", e[e.backtick = 96] = "backtick", e[e.bar = 124] = "bar", e[e.caret = 94] = "caret", e[e.closeBrace = 125] = "closeBrace", e[e.closeBracket = 93] = "closeBracket", e[e.closeParen = 41] = "closeParen", e[e.colon = 58] = "colon", e[e.comma = 44] = "comma", e[e.dot = 46] = "dot", e[e.doubleQuote = 34] = "doubleQuote", e[e.equals = 61] = "equals", e[e.exclamation = 33] = "exclamation", e[e.greaterThan = 62] = "greaterThan", e[e.hash = 35] = "hash", e[e.lessThan = 60] = "lessThan", e[e.minus = 45] = "minus", e[e.openBrace = 123] = "openBrace", e[e.openBracket = 91] = "openBracket", e[e.openParen = 40] = "openParen", e[e.percent = 37] = "percent", e[e.plus = 43] = "plus", e[e.question = 63] = "question", e[e.semicolon = 59] = "semicolon", e[e.singleQuote = 39] = "singleQuote", e[e.slash = 47] = "slash", e[e.tilde = 126] = "tilde", e[e.backspace = 8] = "backspace", e[e.formFeed = 12] = "formFeed", e[e.byteOrderMark = 65279] = "byteOrderMark", e[e.tab = 9] = "tab", e[e.verticalTab = 11] = "verticalTab", e))(KV || {}), qV = (e => (e.Ts = ".ts", e.Tsx = ".tsx", e.Dts = ".d.ts", e.Js = ".js", e.Jsx = ".jsx", e.Json = ".json", e.TsBuildInfo = ".tsbuildinfo", e.Mjs = ".mjs", e.Mts = ".mts", e.Dmts = ".d.mts", e.Cjs = ".cjs", e.Cts = ".cts", e.Dcts = ".d.cts", e))(qV || {}), G8 = (e => (e[e.None = 0] = "None", e[e.ContainsTypeScript = 1] = "ContainsTypeScript", e[e.ContainsJsx = 2] = "ContainsJsx", e[e.ContainsESNext = 4] = "ContainsESNext", e[e.ContainsES2022 = 8] = "ContainsES2022", e[e.ContainsES2021 = 16] = "ContainsES2021", e[e.ContainsES2020 = 32] = "ContainsES2020", e[e.ContainsES2019 = 64] = "ContainsES2019", e[e.ContainsES2018 = 128] = "ContainsES2018", e[e.ContainsES2017 = 256] = "ContainsES2017", e[e.ContainsES2016 = 512] = "ContainsES2016", e[e.ContainsES2015 = 1024] = "ContainsES2015", e[e.ContainsGenerator = 2048] = "ContainsGenerator", e[e.ContainsDestructuringAssignment = 4096] = "ContainsDestructuringAssignment", e[e.ContainsTypeScriptClassSyntax = 8192] = "ContainsTypeScriptClassSyntax", e[e.ContainsLexicalThis = 16384] = "ContainsLexicalThis", e[e.ContainsRestOrSpread = 32768] = "ContainsRestOrSpread", e[e.ContainsObjectRestOrSpread = 65536] = "ContainsObjectRestOrSpread", e[e.ContainsComputedPropertyName = 131072] = "ContainsComputedPropertyName", e[e.ContainsBlockScopedBinding = 262144] = "ContainsBlockScopedBinding", e[e.ContainsBindingPattern = 524288] = "ContainsBindingPattern", e[e.ContainsYield = 1048576] = "ContainsYield", e[e.ContainsAwait = 2097152] = "ContainsAwait", e[e.ContainsHoistedDeclarationOrCompletion = 4194304] = "ContainsHoistedDeclarationOrCompletion", e[e.ContainsDynamicImport = 8388608] = "ContainsDynamicImport", e[e.ContainsClassFields = 16777216] = "ContainsClassFields", e[e.ContainsDecorators = 33554432] = "ContainsDecorators", e[e.ContainsPossibleTopLevelAwait = 67108864] = "ContainsPossibleTopLevelAwait", e[e.ContainsLexicalSuper = 134217728] = "ContainsLexicalSuper", e[e.ContainsUpdateExpressionForIdentifier = 268435456] = "ContainsUpdateExpressionForIdentifier", e[e.ContainsPrivateIdentifierInExpression = 536870912] = "ContainsPrivateIdentifierInExpression", e[e.HasComputedFlags = -2147483648] = "HasComputedFlags", e[e.AssertTypeScript = 1] = "AssertTypeScript", e[e.AssertJsx = 2] = "AssertJsx", e[e.AssertESNext = 4] = "AssertESNext", e[e.AssertES2022 = 8] = "AssertES2022", e[e.AssertES2021 = 16] = "AssertES2021", e[e.AssertES2020 = 32] = "AssertES2020", e[e.AssertES2019 = 64] = "AssertES2019", e[e.AssertES2018 = 128] = "AssertES2018", e[e.AssertES2017 = 256] = "AssertES2017", e[e.AssertES2016 = 512] = "AssertES2016", e[e.AssertES2015 = 1024] = "AssertES2015", e[e.AssertGenerator = 2048] = "AssertGenerator", e[e.AssertDestructuringAssignment = 4096] = "AssertDestructuringAssignment", e[e.OuterExpressionExcludes = -2147483648] = "OuterExpressionExcludes", e[e.PropertyAccessExcludes = -2147483648] = "PropertyAccessExcludes", e[e.NodeExcludes = -2147483648] = "NodeExcludes", e[e.ArrowFunctionExcludes = -2072174592] = "ArrowFunctionExcludes", e[e.FunctionExcludes = -1937940480] = "FunctionExcludes", e[e.ConstructorExcludes = -1937948672] = "ConstructorExcludes", e[e.MethodOrAccessorExcludes = -2005057536] = "MethodOrAccessorExcludes", e[e.PropertyExcludes = -2013249536] = "PropertyExcludes", e[e.ClassExcludes = -2147344384] = "ClassExcludes", e[e.ModuleExcludes = -1941676032] = "ModuleExcludes", e[e.TypeExcludes = -2] = "TypeExcludes", e[e.ObjectLiteralExcludes = -2147278848] = "ObjectLiteralExcludes", e[e.ArrayLiteralOrCallOrNewExcludes = -2147450880] = "ArrayLiteralOrCallOrNewExcludes", e[e.VariableDeclarationListExcludes = -2146893824] = "VariableDeclarationListExcludes", e[e.ParameterExcludes = -2147483648] = "ParameterExcludes", e[e.CatchClauseExcludes = -2147418112] = "CatchClauseExcludes", e[e.BindingPatternExcludes = -2147450880] = "BindingPatternExcludes", e[e.ContainsLexicalThisOrSuper = 134234112] = "ContainsLexicalThisOrSuper", e[e.PropertyNamePropagatingFlags = 134234112] = "PropertyNamePropagatingFlags", e))(G8 || {}), B8 = (e => (e[e.TabStop = 0] = "TabStop", e[e.Placeholder = 1] = "Placeholder", e[e.Choice = 2] = "Choice", e[e.Variable = 3] = "Variable", e))(B8 || {}), U8 = (e => (e[e.None = 0] = "None", e[e.SingleLine = 1] = "SingleLine", e[e.MultiLine = 2] = "MultiLine", e[e.AdviseOnEmitNode = 4] = "AdviseOnEmitNode", e[e.NoSubstitution = 8] = "NoSubstitution", e[e.CapturesThis = 16] = "CapturesThis", e[e.NoLeadingSourceMap = 32] = "NoLeadingSourceMap", e[e.NoTrailingSourceMap = 64] = "NoTrailingSourceMap", e[e.NoSourceMap = 96] = "NoSourceMap", e[e.NoNestedSourceMaps = 128] = "NoNestedSourceMaps", e[e.NoTokenLeadingSourceMaps = 256] = "NoTokenLeadingSourceMaps", e[e.NoTokenTrailingSourceMaps = 512] = "NoTokenTrailingSourceMaps", e[e.NoTokenSourceMaps = 768] = "NoTokenSourceMaps", e[e.NoLeadingComments = 1024] = "NoLeadingComments", e[e.NoTrailingComments = 2048] = "NoTrailingComments", e[e.NoComments = 3072] = "NoComments", e[e.NoNestedComments = 4096] = "NoNestedComments", e[e.HelperName = 8192] = "HelperName", e[e.ExportName = 16384] = "ExportName", e[e.LocalName = 32768] = "LocalName", e[e.InternalName = 65536] = "InternalName", e[e.Indented = 131072] = "Indented", e[e.NoIndentation = 262144] = "NoIndentation", e[e.AsyncFunctionBody = 524288] = "AsyncFunctionBody", e[e.ReuseTempVariableScope = 1048576] = "ReuseTempVariableScope", e[e.CustomPrologue = 2097152] = "CustomPrologue", e[e.NoHoisting = 4194304] = "NoHoisting", e[e.HasEndOfDeclarationMarker = 8388608] = "HasEndOfDeclarationMarker", e[e.Iterator = 16777216] = "Iterator", e[e.NoAsciiEscaping = 33554432] = "NoAsciiEscaping", e))(U8 || {}), XV = (e => (e[e.None = 0] = "None", e[e.TypeScriptClassWrapper = 1] = "TypeScriptClassWrapper", e[e.NeverApplyImportHelper = 2] = "NeverApplyImportHelper", e[e.IgnoreSourceNewlines = 4] = "IgnoreSourceNewlines", e[e.Immutable = 8] = "Immutable", e[e.IndirectCall = 16] = "IndirectCall", e[e.TransformPrivateStaticElements = 32] = "TransformPrivateStaticElements", e))(XV || {}), YV = (e => (e[e.Extends = 1] = "Extends", e[e.Assign = 2] = "Assign", e[e.Rest = 4] = "Rest", e[e.Decorate = 8] = "Decorate", e[e.ESDecorateAndRunInitializers = 8] = "ESDecorateAndRunInitializers", e[e.Metadata = 16] = "Metadata", e[e.Param = 32] = "Param", e[e.Awaiter = 64] = "Awaiter", e[e.Generator = 128] = "Generator", e[e.Values = 256] = "Values", e[e.Read = 512] = "Read", e[e.SpreadArray = 1024] = "SpreadArray", e[e.Await = 2048] = "Await", e[e.AsyncGenerator = 4096] = "AsyncGenerator", e[e.AsyncDelegator = 8192] = "AsyncDelegator", e[e.AsyncValues = 16384] = "AsyncValues", e[e.ExportStar = 32768] = "ExportStar", e[e.ImportStar = 65536] = "ImportStar", e[e.ImportDefault = 131072] = "ImportDefault", e[e.MakeTemplateObject = 262144] = "MakeTemplateObject", e[e.ClassPrivateFieldGet = 524288] = "ClassPrivateFieldGet", e[e.ClassPrivateFieldSet = 1048576] = "ClassPrivateFieldSet", e[e.ClassPrivateFieldIn = 2097152] = "ClassPrivateFieldIn", e[e.CreateBinding = 4194304] = "CreateBinding", e[e.SetFunctionName = 8388608] = "SetFunctionName", e[e.PropKey = 16777216] = "PropKey", e[e.FirstEmitHelper = 1] = "FirstEmitHelper", e[e.LastEmitHelper = 16777216] = "LastEmitHelper", e[e.ForOfIncludes = 256] = "ForOfIncludes", e[e.ForAwaitOfIncludes = 16384] = "ForAwaitOfIncludes", e[e.AsyncGeneratorIncludes = 6144] = "AsyncGeneratorIncludes", e[e.AsyncDelegatorIncludes = 26624] = "AsyncDelegatorIncludes", e[e.SpreadIncludes = 1536] = "SpreadIncludes", e))(YV || {}), $V = (e => (e[e.SourceFile = 0] = "SourceFile", e[e.Expression = 1] = "Expression", e[e.IdentifierName = 2] = "IdentifierName", e[e.MappedTypeParameter = 3] = "MappedTypeParameter", e[e.Unspecified = 4] = "Unspecified", e[e.EmbeddedStatement = 5] = "EmbeddedStatement", e[e.JsxAttributeValue = 6] = "JsxAttributeValue", e))($V || {}), QV = (e => (e[e.Parentheses = 1] = "Parentheses", e[e.TypeAssertions = 2] = "TypeAssertions", e[e.NonNullAssertions = 4] = "NonNullAssertions", e[e.PartiallyEmittedExpressions = 8] = "PartiallyEmittedExpressions", e[e.Assertions = 6] = "Assertions", e[e.All = 15] = "All", e[e.ExcludeJSDocTypeAssertion = 16] = "ExcludeJSDocTypeAssertion", e))(QV || {}), ZV = (e => (e[e.None = 0] = "None", e[e.InParameters = 1] = "InParameters", e[e.VariablesHoistedInParameters = 2] = "VariablesHoistedInParameters", e))(ZV || {}), ej = (e => (e.Prologue = "prologue", e.EmitHelpers = "emitHelpers", e.NoDefaultLib = "no-default-lib", e.Reference = "reference", e.Type = "type", e.TypeResolutionModeRequire = "type-require", e.TypeResolutionModeImport = "type-import", e.Lib = "lib", e.Prepend = "prepend", e.Text = "text", e.Internal = "internal", e))(ej || {}), tj = (e => (e[e.None = 0] = "None", e[e.SingleLine = 0] = "SingleLine", e[e.MultiLine = 1] = "MultiLine", e[e.PreserveLines = 2] = "PreserveLines", e[e.LinesMask = 3] = "LinesMask", e[e.NotDelimited = 0] = "NotDelimited", e[e.BarDelimited = 4] = "BarDelimited", e[e.AmpersandDelimited = 8] = "AmpersandDelimited", e[e.CommaDelimited = 16] = "CommaDelimited", e[e.AsteriskDelimited = 32] = "AsteriskDelimited", e[e.DelimitersMask = 60] = "DelimitersMask", e[e.AllowTrailingComma = 64] = "AllowTrailingComma", e[e.Indented = 128] = "Indented", e[e.SpaceBetweenBraces = 256] = "SpaceBetweenBraces", e[e.SpaceBetweenSiblings = 512] = "SpaceBetweenSiblings", e[e.Braces = 1024] = "Braces", e[e.Parenthesis = 2048] = "Parenthesis", e[e.AngleBrackets = 4096] = "AngleBrackets", e[e.SquareBrackets = 8192] = "SquareBrackets", e[e.BracketsMask = 15360] = "BracketsMask", e[e.OptionalIfUndefined = 16384] = "OptionalIfUndefined", e[e.OptionalIfEmpty = 32768] = "OptionalIfEmpty", e[e.Optional = 49152] = "Optional", e[e.PreferNewLine = 65536] = "PreferNewLine", e[e.NoTrailingNewLine = 131072] = "NoTrailingNewLine", e[e.NoInterveningComments = 262144] = "NoInterveningComments", e[e.NoSpaceIfEmpty = 524288] = "NoSpaceIfEmpty", e[e.SingleElement = 1048576] = "SingleElement", e[e.SpaceAfterList = 2097152] = "SpaceAfterList", e[e.Modifiers = 2359808] = "Modifiers", e[e.HeritageClauses = 512] = "HeritageClauses", e[e.SingleLineTypeLiteralMembers = 768] = "SingleLineTypeLiteralMembers", e[e.MultiLineTypeLiteralMembers = 32897] = "MultiLineTypeLiteralMembers", e[e.SingleLineTupleTypeElements = 528] = "SingleLineTupleTypeElements", e[e.MultiLineTupleTypeElements = 657] = "MultiLineTupleTypeElements", e[e.UnionTypeConstituents = 516] = "UnionTypeConstituents", e[e.IntersectionTypeConstituents = 520] = "IntersectionTypeConstituents", e[e.ObjectBindingPatternElements = 525136] = "ObjectBindingPatternElements", e[e.ArrayBindingPatternElements = 524880] = "ArrayBindingPatternElements", e[e.ObjectLiteralExpressionProperties = 526226] = "ObjectLiteralExpressionProperties", e[e.ImportClauseEntries = 526226] = "ImportClauseEntries", e[e.ArrayLiteralExpressionElements = 8914] = "ArrayLiteralExpressionElements", e[e.CommaListElements = 528] = "CommaListElements", e[e.CallExpressionArguments = 2576] = "CallExpressionArguments", e[e.NewExpressionArguments = 18960] = "NewExpressionArguments", e[e.TemplateExpressionSpans = 262144] = "TemplateExpressionSpans", e[e.SingleLineBlockStatements = 768] = "SingleLineBlockStatements", e[e.MultiLineBlockStatements = 129] = "MultiLineBlockStatements", e[e.VariableDeclarationList = 528] = "VariableDeclarationList", e[e.SingleLineFunctionBodyStatements = 768] = "SingleLineFunctionBodyStatements", e[e.MultiLineFunctionBodyStatements = 1] = "MultiLineFunctionBodyStatements", e[e.ClassHeritageClauses = 0] = "ClassHeritageClauses", e[e.ClassMembers = 129] = "ClassMembers", e[e.InterfaceMembers = 129] = "InterfaceMembers", e[e.EnumMembers = 145] = "EnumMembers", e[e.CaseBlockClauses = 129] = "CaseBlockClauses", e[e.NamedImportsOrExportsElements = 525136] = "NamedImportsOrExportsElements", e[e.JsxElementOrFragmentChildren = 262144] = "JsxElementOrFragmentChildren", e[e.JsxElementAttributes = 262656] = "JsxElementAttributes", e[e.CaseOrDefaultClauseStatements = 163969] = "CaseOrDefaultClauseStatements", e[e.HeritageClauseTypes = 528] = "HeritageClauseTypes", e[e.SourceFileStatements = 131073] = "SourceFileStatements", e[e.Decorators = 2146305] = "Decorators", e[e.TypeArguments = 53776] = "TypeArguments", e[e.TypeParameters = 53776] = "TypeParameters", e[e.Parameters = 2576] = "Parameters", e[e.IndexSignatureParameters = 8848] = "IndexSignatureParameters", e[e.JSDocComment = 33] = "JSDocComment", e))(tj || {}), nj = (e => (e[e.None = 0] = "None", e[e.TripleSlashXML = 1] = "TripleSlashXML", e[e.SingleLine = 2] = "SingleLine", e[e.MultiLine = 4] = "MultiLine", e[e.All = 7] = "All", e[e.Default = 7] = "Default", e))(nj || {}), iw = { reference: { args: [{ name: "types", optional: !0, captureSpan: !0 }, { name: "lib", optional: !0, captureSpan: !0 }, { name: "path", optional: !0, captureSpan: !0 }, { name: "no-default-lib", optional: !0 }, { name: "resolution-mode", optional: !0 }], kind: 1 }, "amd-dependency": { args: [{ name: "path" }, { name: "name", optional: !0 }], kind: 1 }, "amd-module": { args: [{ name: "name" }], kind: 1 }, "ts-check": { kind: 2 }, "ts-nocheck": { kind: 2 }, jsx: { args: [{ name: "factory" }], kind: 4 }, jsxfrag: { args: [{ name: "factory" }], kind: 4 }, jsximportsource: { args: [{ name: "factory" }], kind: 4 }, jsxruntime: { args: [{ name: "factory" }], kind: 4 } } } }); function aw(e) { let t = 5381; for (let r = 0; r < e.length; r++)t = (t << 5) + t + e.charCodeAt(r); return t.toString() } function dDe() { Error.stackTraceLimit < 100 && (Error.stackTraceLimit = 100) } function $1(e, t) { return e.getModifiedTime(t) || Eh } function rj(e) { return { 250: e.Low, 500: e.Medium, 2e3: e.High } } function fDe(e) { if (!e.getEnvironmentVariable) return; let t = o("TSC_WATCH_POLLINGINTERVAL", V8); cw = s("TSC_WATCH_POLLINGCHUNKSIZE", sw) || cw, lw = s("TSC_WATCH_UNCHANGEDPOLLTHRESHOLDS", sw) || lw; function r(l, f) { return e.getEnvironmentVariable(`${l}_${f.toUpperCase()}`) } function i(l) { let f; return d("Low"), d("Medium"), d("High"), f; function d(g) { let m = r(l, g); m && ((f || (f = {}))[g] = Number(m)) } } function o(l, f) { let d = i(l); if (d) return g("Low"), g("Medium"), g("High"), !0; return !1; function g(m) { f[m] = d[m] || f[m] } } function s(l, f) { let d = i(l); return (t || d) && rj(d ? { ...f, ...d } : f) } } function roe(e, t, r, i, o) { let s = r; for (let f = t.length; i && f; l(), f--) { let d = t[r]; if (d) { if (d.isClosed) { t[r] = void 0; continue } } else continue; i--; let g = hDe(d, $1(e, d.fileName)); if (d.isClosed) { t[r] = void 0; continue } o?.(d, r, g), t[r] && (s < r && (t[s] = d, t[r] = void 0), s++) } return r; function l() { r++, r === t.length && (s < r && (t.length = s), r = 0, s = 0) } } function _De(e) { let t = [], r = [], i = f(250), o = f(500), s = f(2e3); return l; function l(C, P, F) { let B = { fileName: C, callback: P, unchangedPolls: 0, mtime: $1(e, C) }; return t.push(B), S(B, F), { close: () => { B.isClosed = !0, YD(t, B) } } } function f(C) { let P = []; return P.pollingInterval = C, P.pollIndex = 0, P.pollScheduled = !1, P } function d(C) { C.pollIndex = m(C, C.pollingInterval, C.pollIndex, cw[C.pollingInterval]), C.length ? w(C.pollingInterval) : (L.assert(C.pollIndex === 0), C.pollScheduled = !1) } function g(C) { m(r, 250, 0, r.length), d(C), !C.pollScheduled && r.length && w(250) } function m(C, P, F, B) { return roe(e, C, F, B, q); function q(W, Y, R) { R ? (W.unchangedPolls = 0, C !== r && (C[Y] = void 0, x(W))) : W.unchangedPolls !== lw[P] ? W.unchangedPolls++ : C === r ? (W.unchangedPolls = 1, C[Y] = void 0, S(W, 250)) : P !== 2e3 && (W.unchangedPolls++, C[Y] = void 0, S(W, P === 250 ? 500 : 2e3)) } } function v(C) { switch (C) { case 250: return i; case 500: return o; case 2e3: return s } } function S(C, P) { v(P).push(C), A(P) } function x(C) { r.push(C), A(250) } function A(C) { v(C).pollScheduled || w(C) } function w(C) { v(C).pollScheduled = e.setTimeout(C === 250 ? g : d, C, v(C)) } } function pDe(e, t) { let r = Nf(), i = new Map, o = Dl(t); return s; function s(f, d, g, m) { let v = o(f); r.add(v, d); let S = ni(v) || ".", x = i.get(S) || l(ni(f) || ".", S, m); return x.referenceCount++, { close: () => { x.referenceCount === 1 ? (x.close(), i.delete(S)) : x.referenceCount--, r.remove(v, d) } } } function l(f, d, g) { let m = e(f, 1, (v, S, x) => { if (!Ta(S)) return; let A = _a(S, f), w = A && r.get(o(A)); if (w) for (let C of w) C(A, 1, x) }, !1, 500, g); return m.referenceCount = 0, i.set(d, m), m } } function mDe(e) { let t = [], r = 0, i; return o; function o(f, d) { let g = { fileName: f, callback: d, mtime: $1(e, f) }; return t.push(g), l(), { close: () => { g.isClosed = !0, YD(t, g) } } } function s() { i = void 0, r = roe(e, t, r, cw[250]), l() } function l() { !t.length || i || (i = e.setTimeout(s, 2e3)) } } function ioe(e, t, r, i, o) { let l = Dl(t)(r), f = e.get(l); return f ? f.callbacks.push(i) : e.set(l, { watcher: o((d, g, m) => { var v; return (v = e.get(l)) == null ? void 0 : v.callbacks.slice().forEach(S => S(d, g, m)) }), callbacks: [i] }), { close: () => { let d = e.get(l); d && (!m8(d.callbacks, i) || d.callbacks.length || (e.delete(l), _m(d))) } } } function hDe(e, t) { let r = e.mtime.getTime(), i = t.getTime(); return r !== i ? (e.mtime = t, e.callback(e.fileName, aoe(r, i), t), !0) : !1 } function aoe(e, t) { return e === 0 ? 0 : t === 0 ? 2 : 1 } function ow(e) { return aj(e) } function ooe(e) { aj = e } function gDe({ watchDirectory: e, useCaseSensitiveFileNames: t, getCurrentDirectory: r, getAccessibleSortedChildDirectories: i, fileSystemEntryExists: o, realpath: s, setTimeout: l, clearTimeout: f }) { let d = new Map, g = Nf(), m = new Map, v, S = p8(!t), x = Dl(t); return (R, ie, $, fe) => $ ? A(R, fe, ie) : e(R, ie, $, fe); function A(R, ie, $) { let fe = x(R), Z = d.get(fe); Z ? Z.refCount++ : (Z = { watcher: e(R, re => { W(re, ie) || (ie?.synchronousWatchDirectory ? (w(fe, re), q(R, fe, ie)) : C(R, fe, re, ie)) }, !1, ie), refCount: 1, childWatches: Je }, d.set(fe, Z), q(R, fe, ie)); let U = $ && { dirName: R, callback: $ }; return U && g.add(fe, U), { dirName: R, close: () => { let re = L.checkDefined(d.get(fe)); U && g.remove(fe, U), re.refCount--, !re.refCount && (d.delete(fe), _m(re), re.childWatches.forEach(am)) } } } function w(R, ie, $) { let fe, Z; Ta(ie) ? fe = ie : Z = ie, g.forEach((U, re) => { if (!(Z && Z.get(re) === !0) && (re === R || na(R, re) && R[re.length] === _s)) if (Z) if ($) { let le = Z.get(re); le ? le.push(...$) : Z.set(re, $.slice()) } else Z.set(re, !0); else U.forEach(({ callback: le }) => le(fe)) }) } function C(R, ie, $, fe) { let Z = d.get(ie); if (Z && o(R, 1)) { P(R, ie, $, fe); return } w(ie, $), B(Z) } function P(R, ie, $, fe) { let Z = m.get(ie); Z ? Z.fileNames.push($) : m.set(ie, { dirName: R, options: fe, fileNames: [$] }), v && (f(v), v = void 0), v = l(F, 1e3) } function F() { v = void 0, ow(`sysLog:: onTimerToUpdateChildWatches:: ${m.size}`); let R = Ms(), ie = new Map; for (; !v && m.size;) { let fe = m.entries().next(); L.assert(!fe.done); let { value: [Z, { dirName: U, options: re, fileNames: le }] } = fe; m.delete(Z); let _e = q(U, Z, re); w(Z, ie, _e ? void 0 : le) } ow(`sysLog:: invokingWatchers:: Elapsed:: ${Ms() - R}ms:: ${m.size}`), g.forEach((fe, Z) => { let U = ie.get(Z); U && fe.forEach(({ callback: re, dirName: le }) => { ba(U) ? U.forEach(re) : re(le) }) }); let $ = Ms() - R; ow(`sysLog:: Elapsed:: ${$}ms:: onTimerToUpdateChildWatches:: ${m.size} ${v}`) } function B(R) { if (!R) return; let ie = R.childWatches; R.childWatches = Je; for (let $ of ie) $.close(), B(d.get(x($.dirName))) } function q(R, ie, $) { let fe = d.get(ie); if (!fe) return !1; let Z, U = wae(o(R, 1) ? Zi(i(R), _e => { let ge = _a(_e, R); return !W(ge, $) && S(ge, So(s(ge))) === 0 ? ge : void 0 }) : Je, fe.childWatches, (_e, ge) => S(_e, ge.dirName), re, am, le); return fe.childWatches = Z || Je, U; function re(_e) { let ge = A(_e, $); le(ge) } function le(_e) { (Z || (Z = [])).push(_e) } } function W(R, ie) { return vt(uw, $ => Y(R, $)) || soe(R, ie, t, r) } function Y(R, ie) { return jl(R, ie) ? !0 : t ? !1 : jl(x(R), ie) } } function yDe(e) { return (t, r, i) => e(r === 1 ? "change" : "rename", "", i) } function vDe(e, t, r) { return (i, o, s) => { i === "rename" ? (s || (s = r(e) || Eh), t(e, s !== Eh ? 0 : 2, s)) : t(e, 1, s) } } function soe(e, t, r, i) { return (t?.excludeDirectories || t?.excludeFiles) && (G3(e, t?.excludeFiles, r, i()) || G3(e, t?.excludeDirectories, r, i())) } function coe(e, t, r, i, o) { return (s, l) => { if (s === "rename") { let f = l ? So(vi(e, l)) : e; (!l || !soe(f, r, i, o)) && t(f) } } } function loe({ pollingWatchFileWorker: e, getModifiedTime: t, setTimeout: r, clearTimeout: i, fsWatchWorker: o, fileSystemEntryExists: s, useCaseSensitiveFileNames: l, getCurrentDirectory: f, fsSupportsRecursiveFsWatch: d, getAccessibleSortedChildDirectories: g, realpath: m, tscWatchFile: v, useNonPollingWatchers: S, tscWatchDirectory: x, inodeWatching: A, sysLog: w }) { let C = new Map, P = new Map, F = new Map, B, q, W, Y, R = !1; return { watchFile: ie, watchDirectory: re }; function ie(we, ke, Pe, Ce) { Ce = Z(Ce, S); let Ie = L.checkDefined(Ce.watchFile); switch (Ie) { case 0: return ge(we, ke, 250, void 0); case 1: return ge(we, ke, Pe, void 0); case 2: return $()(we, ke, Pe, void 0); case 3: return fe()(we, ke, void 0, void 0); case 4: return X(we, 0, vDe(we, ke, t), !1, Pe, _N(Ce)); case 5: return W || (W = pDe(X, l)), W(we, ke, Pe, _N(Ce)); default: L.assertNever(Ie) } } function $() { return B || (B = _De({ getModifiedTime: t, setTimeout: r })) } function fe() { return q || (q = mDe({ getModifiedTime: t, setTimeout: r })) } function Z(we, ke) { if (we && we.watchFile !== void 0) return we; switch (v) { case "PriorityPollingInterval": return { watchFile: 1 }; case "DynamicPriorityPolling": return { watchFile: 2 }; case "UseFsEvents": return U(4, 1, we); case "UseFsEventsWithFallbackDynamicPolling": return U(4, 2, we); case "UseFsEventsOnParentDirectory": ke = !0; default: return ke ? U(5, 1, we) : { watchFile: 4 } } } function U(we, ke, Pe) { let Ce = Pe?.fallbackPolling; return { watchFile: we, fallbackPolling: Ce === void 0 ? ke : Ce } } function re(we, ke, Pe, Ce) { return d ? X(we, 1, coe(we, ke, Ce, l, f), Pe, 500, _N(Ce)) : (Y || (Y = gDe({ useCaseSensitiveFileNames: l, getCurrentDirectory: f, fileSystemEntryExists: s, getAccessibleSortedChildDirectories: g, watchDirectory: le, realpath: m, setTimeout: r, clearTimeout: i })), Y(we, ke, Pe, Ce)) } function le(we, ke, Pe, Ce) { L.assert(!Pe); let Ie = _e(Ce), Be = L.checkDefined(Ie.watchDirectory); switch (Be) { case 1: return ge(we, () => ke(we), 500, void 0); case 2: return $()(we, () => ke(we), 500, void 0); case 3: return fe()(we, () => ke(we), void 0, void 0); case 0: return X(we, 1, coe(we, ke, Ce, l, f), Pe, 500, _N(Ie)); default: L.assertNever(Be) } } function _e(we) { if (we && we.watchDirectory !== void 0) return we; switch (x) { case "RecursiveDirectoryUsingFsWatchFile": return { watchDirectory: 1 }; case "RecursiveDirectoryUsingDynamicPriorityPolling": return { watchDirectory: 2 }; default: let ke = we?.fallbackPolling; return { watchDirectory: 0, fallbackPolling: ke !== void 0 ? ke : void 0 } } } function ge(we, ke, Pe, Ce) { return ioe(C, l, we, ke, Ie => e(we, Ie, Pe, Ce)) } function X(we, ke, Pe, Ce, Ie, Be) { return ioe(Ce ? F : P, l, we, Pe, Ne => Ve(we, ke, Ne, Ce, Ie, Be)) } function Ve(we, ke, Pe, Ce, Ie, Be) { let Ne, Le; A && (Ne = we.substring(we.lastIndexOf(_s)), Le = Ne.slice(_s.length)); let Ye = s(we, ke) ? ct() : qe(); return { close: () => { Ye && (Ye.close(), Ye = void 0) } }; function _t(zt) { Ye && (w(`sysLog:: ${we}:: Changing watcher to ${zt === ct ? "Present" : "Missing"}FileSystemEntryWatcher`), Ye.close(), Ye = zt()) } function ct() { if (R) return w(`sysLog:: ${we}:: Defaulting to watchFile`), We(); try { let zt = o(we, Ce, A ? Rt : Pe); return zt.on("error", () => { Pe("rename", ""), _t(qe) }), zt } catch (zt) { return R || (R = zt.code === "ENOSPC"), w(`sysLog:: ${we}:: Changing to watchFile`), We() } } function Rt(zt, Qt) { let tn; if (Qt && Oc(Qt, "~") && (tn = Qt, Qt = Qt.slice(0, Qt.length - 1)), zt === "rename" && (!Qt || Qt === Le || Oc(Qt, Ne))) { let kn = t(we) || Eh; tn && Pe(zt, tn, kn), Pe(zt, Qt, kn), A ? _t(kn === Eh ? qe : ct) : kn === Eh && _t(qe) } else tn && Pe(zt, tn), Pe(zt, Qt) } function We() { return ie(we, yDe(Pe), Ie, Be) } function qe() { return ie(we, (zt, Qt, tn) => { Qt === 0 && (tn || (tn = t(we) || Eh), tn !== Eh && (Pe("rename", "", tn), _t(ct))) }, Ie, Be) } } } function uoe(e) { let t = e.writeFile; e.writeFile = (r, i, o) => nW(r, i, !!o, (s, l, f) => t.call(e, s, l, f), s => e.createDirectory(s), s => e.directoryExists(s)) } function bDe(e) { xl = e } var ij, V8, Eh, sw, cw, lw, uw, aj, oj, xl, EDe = gt({ "src/compiler/sys.ts"() { "use strict"; fa(), ij = (e => (e[e.Created = 0] = "Created", e[e.Changed = 1] = "Changed", e[e.Deleted = 2] = "Deleted", e))(ij || {}), V8 = (e => (e[e.High = 2e3] = "High", e[e.Medium = 500] = "Medium", e[e.Low = 250] = "Low", e))(V8 || {}), Eh = new Date(0), sw = { Low: 32, Medium: 64, High: 256 }, cw = rj(sw), lw = rj(sw), uw = ["/node_modules/.", "/.git", "/.#"], aj = Ba, oj = (e => (e[e.File = 0] = "File", e[e.Directory = 1] = "Directory", e))(oj || {}), xl = (() => { let e = "\uFEFF"; function t() { let i = /^native |^\([^)]+\)$|^(internal[\\/]|[a-zA-Z0-9_\s]+(\.js)?$)/, o = d0("fs"), s = d0("path"), l = d0("os"), f; try { f = d0("crypto") } catch { f = void 0 } let d, g = "./profile.cpuprofile", m = d0("buffer").Buffer, v = process.platform === "linux" || process.platform === "darwin", S = l.platform(), x = fe(), A = o.realpathSync.native ? process.platform === "win32" ? Ie : o.realpathSync.native : o.realpathSync, w = __filename.endsWith("sys.js") ? s.join(s.dirname(__dirname), "__fake__.js") : __filename, C = process.platform === "win32" || process.platform === "darwin", P = zu(() => process.cwd()), { watchFile: F, watchDirectory: B } = loe({ pollingWatchFileWorker: U, getModifiedTime: Ne, setTimeout, clearTimeout, fsWatchWorker: re, useCaseSensitiveFileNames: x, getCurrentDirectory: P, fileSystemEntryExists: we, fsSupportsRecursiveFsWatch: C, getAccessibleSortedChildDirectories: ct => X(ct).directories, realpath: Be, tscWatchFile: process.env.TSC_WATCHFILE, useNonPollingWatchers: process.env.TSC_NONPOLLING_WATCHER, tscWatchDirectory: process.env.TSC_WATCHDIRECTORY, inodeWatching: v, sysLog: ow }), q = { args: process.argv.slice(2), newLine: l.EOL, useCaseSensitiveFileNames: x, write(ct) { process.stdout.write(ct) }, getWidthOfTerminal() { return process.stdout.columns }, writeOutputIsTTY() { return process.stdout.isTTY }, readFile: _e, writeFile: ge, watchFile: F, watchDirectory: B, resolvePath: ct => s.resolve(ct), fileExists: ke, directoryExists: Pe, createDirectory(ct) { if (!q.directoryExists(ct)) try { o.mkdirSync(ct) } catch (Rt) { if (Rt.code !== "EEXIST") throw Rt } }, getExecutingFilePath() { return w }, getCurrentDirectory: P, getDirectories: Ce, getEnvironmentVariable(ct) { return process.env[ct] || "" }, readDirectory: Ve, getModifiedTime: Ne, setModifiedTime: Le, deleteFile: Ye, createHash: f ? _t : aw, createSHA256Hash: f ? _t : void 0, getMemoryUsage() { return global.gc && global.gc(), process.memoryUsage().heapUsed }, getFileSize(ct) { try { let Rt = W(ct); if (Rt?.isFile()) return Rt.size } catch { } return 0 }, exit(ct) { ie(() => process.exit(ct)) }, enableCPUProfiler: Y, disableCPUProfiler: ie, cpuProfilingEnabled: () => !!d || ya(process.execArgv, "--cpu-prof") || ya(process.execArgv, "--prof"), realpath: Be, debugMode: !!process.env.NODE_INSPECTOR_IPC || !!process.env.VSCODE_INSPECTOR_OPTIONS || vt(process.execArgv, ct => /^--(inspect|debug)(-brk)?(=\d+)?$/i.test(ct)), tryEnableSourceMapsForHost() { try { d0("source-map-support").install() } catch { } }, setTimeout, clearTimeout, clearScreen: () => { process.stdout.write("\x1Bc") }, setBlocking: () => { process.stdout && process.stdout._handle && process.stdout._handle.setBlocking && process.stdout._handle.setBlocking(!0) }, bufferFrom: $, base64decode: ct => $(ct, "base64").toString("utf8"), base64encode: ct => $(ct).toString("base64"), require: (ct, Rt) => { try { let We = jfe(Rt, ct, q); return { module: d0(We), modulePath: We, error: void 0 } } catch (We) { return { module: void 0, modulePath: void 0, error: We } } } }; return q; function W(ct) { return o.statSync(ct, { throwIfNoEntry: !1 }) } function Y(ct, Rt) { if (d) return Rt(), !1; let We = d0("inspector"); if (!We || !We.Session) return Rt(), !1; let qe = new We.Session; return qe.connect(), qe.post("Profiler.enable", () => { qe.post("Profiler.start", () => { d = qe, g = ct, Rt() }) }), !0 } function R(ct) { let Rt = 0, We = new Map, qe = Al(s.dirname(w)), zt = `file://${_p(qe) === 1 ? "" : "/"}${qe}`; for (let Qt of ct.nodes) if (Qt.callFrame.url) { let tn = Al(Qt.callFrame.url); Gy(zt, tn, x) ? Qt.callFrame.url = Q1(zt, tn, zt, Dl(x), !0) : i.test(tn) || (Qt.callFrame.url = (We.has(tn) ? We : We.set(tn, `external${Rt}.js`)).get(tn), Rt++) } return ct } function ie(ct) { if (d && d !== "stopping") { let Rt = d; return d.post("Profiler.stop", (We, { profile: qe }) => { var zt; if (!We) { try { (zt = W(g)) != null && zt.isDirectory() && (g = s.join(g, `${new Date().toISOString().replace(/:/g, "-")}+P${process.pid}.cpuprofile`)) } catch { } try { o.mkdirSync(s.dirname(g), { recursive: !0 }) } catch { } o.writeFileSync(g, JSON.stringify(R(qe))) } d = void 0, Rt.disconnect(), ct() }), d = "stopping", !0 } else return ct(), !1 } function $(ct, Rt) { return m.from && m.from !== Int8Array.from ? m.from(ct, Rt) : new m(ct, Rt) } function fe() { return S === "win32" || S === "win64" ? !1 : !ke(Z(__filename)) } function Z(ct) { return ct.replace(/\w/g, Rt => { let We = Rt.toUpperCase(); return Rt === We ? Rt.toLowerCase() : We }) } function U(ct, Rt, We) { o.watchFile(ct, { persistent: !0, interval: We }, zt); let qe; return { close: () => o.unwatchFile(ct, zt) }; function zt(Qt, tn) { let kn = +tn.mtime == 0 || qe === 2; if (+Qt.mtime == 0) { if (kn) return; qe = 2 } else if (kn) qe = 0; else { if (+Qt.mtime == +tn.mtime) return; qe = 1 } Rt(ct, qe, Qt.mtime) } } function re(ct, Rt, We) { return o.watch(ct, C ? { persistent: !0, recursive: !!Rt } : { persistent: !0 }, We) } function le(ct, Rt) { let We; try { We = o.readFileSync(ct) } catch { return } let qe = We.length; if (qe >= 2 && We[0] === 254 && We[1] === 255) { qe &= -2; for (let zt = 0; zt < qe; zt += 2) { let Qt = We[zt]; We[zt] = We[zt + 1], We[zt + 1] = Qt } return We.toString("utf16le", 2) } return qe >= 2 && We[0] === 255 && We[1] === 254 ? We.toString("utf16le", 2) : qe >= 3 && We[0] === 239 && We[1] === 187 && We[2] === 191 ? We.toString("utf8", 3) : We.toString("utf8") } function _e(ct, Rt) { fp.logStartReadFile(ct); let We = le(ct, Rt); return fp.logStopReadFile(), We } function ge(ct, Rt, We) { fp.logEvent("WriteFile: " + ct), We && (Rt = e + Rt); let qe; try { qe = o.openSync(ct, "w"), o.writeSync(qe, Rt, void 0, "utf8") } finally { qe !== void 0 && o.closeSync(qe) } } function X(ct) { fp.logEvent("ReadDir: " + (ct || ".")); try { let Rt = o.readdirSync(ct || ".", { withFileTypes: !0 }), We = [], qe = []; for (let zt of Rt) { let Qt = typeof zt == "string" ? zt : zt.name; if (Qt === "." || Qt === "..") continue; let tn; if (typeof zt == "string" || zt.isSymbolicLink()) { let kn = vi(ct, Qt); try { if (tn = W(kn), !tn) continue } catch { continue } } else tn = zt; tn.isFile() ? We.push(Qt) : tn.isDirectory() && qe.push(Qt) } return We.sort(), qe.sort(), { files: We, directories: qe } } catch { return D4 } } function Ve(ct, Rt, We, qe, zt) { return wW(ct, Rt, We, qe, x, process.cwd(), zt, X, Be) } function we(ct, Rt) { let We = Error.stackTraceLimit; Error.stackTraceLimit = 0; try { let qe = W(ct); if (!qe) return !1; switch (Rt) { case 0: return qe.isFile(); case 1: return qe.isDirectory(); default: return !1 } } catch { return !1 } finally { Error.stackTraceLimit = We } } function ke(ct) { return we(ct, 0) } function Pe(ct) { return we(ct, 1) } function Ce(ct) { return X(ct).directories.slice() } function Ie(ct) { return ct.length < 260 ? o.realpathSync.native(ct) : o.realpathSync(ct) } function Be(ct) { try { return A(ct) } catch { return ct } } function Ne(ct) { var Rt; let We = Error.stackTraceLimit; Error.stackTraceLimit = 0; try { return (Rt = W(ct)) == null ? void 0 : Rt.mtime } catch { return } finally { Error.stackTraceLimit = We } } function Le(ct, Rt) { try { o.utimesSync(ct, Rt, Rt) } catch { return } } function Ye(ct) { try { return o.unlinkSync(ct) } catch { return } } function _t(ct) { let Rt = f.createHash("sha256"); return Rt.update(ct), Rt.digest("hex") } } let r; return qU() && (r = t()), r && uoe(r), r })(), xl && xl.getEnvironmentVariable && (fDe(xl), L.setAssertionLevel(/^development$/i.test(xl.getEnvironmentVariable("NODE_ENV")) ? 1 : 0)), xl && xl.debugMode && (L.isDebugging = !0) } }); function sj(e) { return e === 47 || e === 92 } function doe(e) { return dw(e) < 0 } function qp(e) { return dw(e) > 0 } function TDe(e) { let t = dw(e); return t > 0 && t === e.length } function nI(e) { return dw(e) !== 0 } function Jd(e) { return /^\.\.?($|[\\/])/.test(e) } function cj(e) { return !nI(e) && !Jd(e) } function gA(e) { return jl(Hl(e), ".") } function Gc(e, t) { return e.length > t.length && Oc(e, t) } function $c(e, t) { for (let r of t) if (Gc(e, r)) return !0; return !1 } function My(e) { return e.length > 0 && sj(e.charCodeAt(e.length - 1)) } function foe(e) { return e >= 97 && e <= 122 || e >= 65 && e <= 90 } function SDe(e, t) { let r = e.charCodeAt(t); if (r === 58) return t + 1; if (r === 37 && e.charCodeAt(t + 1) === 51) { let i = e.charCodeAt(t + 2); if (i === 97 || i === 65) return t + 3 } return -1 } function dw(e) { if (!e) return 0; let t = e.charCodeAt(0); if (t === 47 || t === 92) { if (e.charCodeAt(1) !== t) return 1; let i = e.indexOf(t === 47 ? _s : pw, 2); return i < 0 ? e.length : i + 1 } if (foe(t) && e.charCodeAt(1) === 58) { let i = e.charCodeAt(2); if (i === 47 || i === 92) return 3; if (e.length === 2) return 2 } let r = e.indexOf(pj); if (r !== -1) { let i = r + pj.length, o = e.indexOf(_s, i); if (o !== -1) { let s = e.slice(0, r), l = e.slice(i, o); if (s === "file" && (l === "" || l === "localhost") && foe(e.charCodeAt(o + 1))) { let f = SDe(e, o + 2); if (f !== -1) { if (e.charCodeAt(f) === 47) return ~(f + 1); if (f === e.length) return ~f } } return ~(o + 1) } return ~e.length } return 0 } function _p(e) { let t = dw(e); return t < 0 ? ~t : t } function ni(e) { e = Al(e); let t = _p(e); return t === e.length ? e : (e = sT(e), e.slice(0, Math.max(t, e.lastIndexOf(_s)))) } function Hl(e, t, r) { if (e = Al(e), _p(e) === e.length) return ""; e = sT(e); let o = e.slice(Math.max(_p(e), e.lastIndexOf(_s) + 1)), s = t !== void 0 && r !== void 0 ? j8(o, t, r) : void 0; return s ? o.slice(0, o.length - s.length) : o } function _oe(e, t, r) { if (na(t, ".") || (t = "." + t), e.length >= t.length && e.charCodeAt(e.length - t.length) === 46) { let i = e.slice(e.length - t.length); if (r(i, t)) return i } } function xDe(e, t, r) { if (typeof t == "string") return _oe(e, t, r) || ""; for (let i of t) { let o = _oe(e, i, r); if (o) return o } return "" } function j8(e, t, r) { if (t) return xDe(sT(e), t, r ? W1 : z1); let i = Hl(e), o = i.lastIndexOf("."); return o >= 0 ? i.substring(o) : "" } function ADe(e, t) { let r = e.substring(0, t), i = e.substring(t).split(_s); return i.length && !Os(i) && i.pop(), [r, ...i] } function Ou(e, t = "") { return e = vi(t, e), ADe(e, _p(e)) } function T0(e) { return e.length === 0 ? "" : (e[0] && cu(e[0])) + e.slice(1).join(_s) } function Al(e) { return e.indexOf("\\") !== -1 ? e.replace(poe, _s) : e } function oT(e) { if (!vt(e)) return []; let t = [e[0]]; for (let r = 1; r < e.length; r++) { let i = e[r]; if (i && i !== ".") { if (i === "..") { if (t.length > 1) { if (t[t.length - 1] !== "..") { t.pop(); continue } } else if (t[0]) continue } t.push(i) } } return t } function vi(e, ...t) { e && (e = Al(e)); for (let r of t) r && (r = Al(r), !e || _p(r) !== 0 ? e = r : e = cu(e) + r); return e } function Fy(e, ...t) { return So(vt(t) ? vi(e, ...t) : Al(e)) } function fw(e, t) { return oT(Ou(e, t)) } function _a(e, t) { return T0(fw(e, t)) } function So(e) { if (e = Al(e), !mw.test(e)) return e; let t = e.replace(/\/\.\//g, "/").replace(/^\.\//, ""); if (t !== e && (e = t, !mw.test(e))) return e; let r = T0(oT(Ou(e))); return r && My(e) ? cu(r) : r } function CDe(e) { return e.length === 0 ? "" : e.slice(1).join(_s) } function lj(e, t) { return CDe(fw(e, t)) } function Ts(e, t, r) { let i = qp(e) ? So(e) : _a(e, t); return r(i) } function sT(e) { return My(e) ? e.substr(0, e.length - 1) : e } function cu(e) { return My(e) ? e : e + _s } function S0(e) { return !nI(e) && !Jd(e) ? "./" + e : e } function uj(e, t, r, i) { let o = r !== void 0 && i !== void 0 ? j8(e, r, i) : j8(e); return o ? e.slice(0, e.length - o.length) + (na(t, ".") ? t : "." + t) : e } function dj(e, t, r) { if (e === t) return 0; if (e === void 0) return -1; if (t === void 0) return 1; let i = e.substring(0, _p(e)), o = t.substring(0, _p(t)), s = _8(i, o); if (s !== 0) return s; let l = e.substring(i.length), f = t.substring(o.length); if (!mw.test(l) && !mw.test(f)) return r(l, f); let d = oT(Ou(e)), g = oT(Ou(t)), m = Math.min(d.length, g.length); for (let v = 1; v < m; v++) { let S = r(d[v], g[v]); if (S !== 0) return S } return Es(d.length, g.length) } function IDe(e, t) { return dj(e, t, su) } function LDe(e, t) { return dj(e, t, _8) } function cT(e, t, r, i) { return typeof r == "string" ? (e = vi(r, e), t = vi(r, t)) : typeof r == "boolean" && (i = r), dj(e, t, p8(i)) } function Gy(e, t, r, i) { if (typeof r == "string" ? (e = vi(r, e), t = vi(r, t)) : typeof r == "boolean" && (i = r), e === void 0 || t === void 0) return !1; if (e === t) return !0; let o = oT(Ou(e)), s = oT(Ou(t)); if (s.length < o.length) return !1; let l = i ? W1 : z1; for (let f = 0; f < o.length; f++)if (!(f === 0 ? W1 : l)(o[f], s[f])) return !1; return !0 } function fj(e, t, r) { let i = r(e), o = r(t); return na(i, o + "/") || na(i, o + "\\") } function _j(e, t, r, i) { let o = oT(Ou(e)), s = oT(Ou(t)), l; for (l = 0; l < o.length && l < s.length; l++) { let g = i(o[l]), m = i(s[l]); if (!(l === 0 ? W1 : r)(g, m)) break } if (l === 0) return s; let f = s.slice(l), d = []; for (; l < o.length; l++)d.push(".."); return ["", ...d, ...f] } function Xp(e, t, r) { L.assert(_p(e) > 0 == _p(t) > 0, "Paths must either both be absolute or both be relative"); let s = _j(e, t, (typeof r == "boolean" ? r : !1) ? W1 : z1, typeof r == "function" ? r : Ks); return T0(s) } function rI(e, t, r) { return qp(e) ? Q1(t, e, t, r, !1) : e } function _w(e, t, r) { return S0(Xp(ni(e), t, r)) } function Q1(e, t, r, i, o) { let s = _j(Fy(r, e), Fy(r, t), z1, i), l = s[0]; if (o && qp(l)) { let f = l.charAt(0) === _s ? "file://" : "file:///"; s[0] = f + l } return T0(s) } function Th(e, t) { for (; ;) { let r = t(e); if (r !== void 0) return r; let i = ni(e); if (i === e) return; e = i } } function H8(e) { return Oc(e, "/node_modules") } var _s, pw, pj, poe, mw, kDe = gt({ "src/compiler/path.ts"() { "use strict"; fa(), _s = "/", pw = "\\", pj = "://", poe = /\\/g, mw = /(?:\/\/)|(?:^|\/)\.\.?(?:$|\/)/ } }); function b(e, t, r, i, o, s, l) { return { code: e, category: t, key: r, message: i, reportsUnnecessary: o, elidedInCompatabilityPyramid: s, reportsDeprecated: l } } var _, DDe = gt({ "src/compiler/diagnosticInformationMap.generated.ts"() { "use strict"; noe(), _ = { Unterminated_string_literal: b(1002, 1, "Unterminated_string_literal_1002", "Unterminated string literal."), Identifier_expected: b(1003, 1, "Identifier_expected_1003", "Identifier expected."), _0_expected: b(1005, 1, "_0_expected_1005", "'{0}' expected."), A_file_cannot_have_a_reference_to_itself: b(1006, 1, "A_file_cannot_have_a_reference_to_itself_1006", "A file cannot have a reference to itself."), The_parser_expected_to_find_a_1_to_match_the_0_token_here: b(1007, 1, "The_parser_expected_to_find_a_1_to_match_the_0_token_here_1007", "The parser expected to find a '{1}' to match the '{0}' token here."), Trailing_comma_not_allowed: b(1009, 1, "Trailing_comma_not_allowed_1009", "Trailing comma not allowed."), Asterisk_Slash_expected: b(1010, 1, "Asterisk_Slash_expected_1010", "'*/' expected."), An_element_access_expression_should_take_an_argument: b(1011, 1, "An_element_access_expression_should_take_an_argument_1011", "An element access expression should take an argument."), Unexpected_token: b(1012, 1, "Unexpected_token_1012", "Unexpected token."), A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma: b(1013, 1, "A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma_1013", "A rest parameter or binding pattern may not have a trailing comma."), A_rest_parameter_must_be_last_in_a_parameter_list: b(1014, 1, "A_rest_parameter_must_be_last_in_a_parameter_list_1014", "A rest parameter must be last in a parameter list."), Parameter_cannot_have_question_mark_and_initializer: b(1015, 1, "Parameter_cannot_have_question_mark_and_initializer_1015", "Parameter cannot have question mark and initializer."), A_required_parameter_cannot_follow_an_optional_parameter: b(1016, 1, "A_required_parameter_cannot_follow_an_optional_parameter_1016", "A required parameter cannot follow an optional parameter."), An_index_signature_cannot_have_a_rest_parameter: b(1017, 1, "An_index_signature_cannot_have_a_rest_parameter_1017", "An index signature cannot have a rest parameter."), An_index_signature_parameter_cannot_have_an_accessibility_modifier: b(1018, 1, "An_index_signature_parameter_cannot_have_an_accessibility_modifier_1018", "An index signature parameter cannot have an accessibility modifier."), An_index_signature_parameter_cannot_have_a_question_mark: b(1019, 1, "An_index_signature_parameter_cannot_have_a_question_mark_1019", "An index signature parameter cannot have a question mark."), An_index_signature_parameter_cannot_have_an_initializer: b(1020, 1, "An_index_signature_parameter_cannot_have_an_initializer_1020", "An index signature parameter cannot have an initializer."), An_index_signature_must_have_a_type_annotation: b(1021, 1, "An_index_signature_must_have_a_type_annotation_1021", "An index signature must have a type annotation."), An_index_signature_parameter_must_have_a_type_annotation: b(1022, 1, "An_index_signature_parameter_must_have_a_type_annotation_1022", "An index signature parameter must have a type annotation."), readonly_modifier_can_only_appear_on_a_property_declaration_or_index_signature: b(1024, 1, "readonly_modifier_can_only_appear_on_a_property_declaration_or_index_signature_1024", "'readonly' modifier can only appear on a property declaration or index signature."), An_index_signature_cannot_have_a_trailing_comma: b(1025, 1, "An_index_signature_cannot_have_a_trailing_comma_1025", "An index signature cannot have a trailing comma."), Accessibility_modifier_already_seen: b(1028, 1, "Accessibility_modifier_already_seen_1028", "Accessibility modifier already seen."), _0_modifier_must_precede_1_modifier: b(1029, 1, "_0_modifier_must_precede_1_modifier_1029", "'{0}' modifier must precede '{1}' modifier."), _0_modifier_already_seen: b(1030, 1, "_0_modifier_already_seen_1030", "'{0}' modifier already seen."), _0_modifier_cannot_appear_on_class_elements_of_this_kind: b(1031, 1, "_0_modifier_cannot_appear_on_class_elements_of_this_kind_1031", "'{0}' modifier cannot appear on class elements of this kind."), super_must_be_followed_by_an_argument_list_or_member_access: b(1034, 1, "super_must_be_followed_by_an_argument_list_or_member_access_1034", "'super' must be followed by an argument list or member access."), Only_ambient_modules_can_use_quoted_names: b(1035, 1, "Only_ambient_modules_can_use_quoted_names_1035", "Only ambient modules can use quoted names."), Statements_are_not_allowed_in_ambient_contexts: b(1036, 1, "Statements_are_not_allowed_in_ambient_contexts_1036", "Statements are not allowed in ambient contexts."), A_declare_modifier_cannot_be_used_in_an_already_ambient_context: b(1038, 1, "A_declare_modifier_cannot_be_used_in_an_already_ambient_context_1038", "A 'declare' modifier cannot be used in an already ambient context."), Initializers_are_not_allowed_in_ambient_contexts: b(1039, 1, "Initializers_are_not_allowed_in_ambient_contexts_1039", "Initializers are not allowed in ambient contexts."), _0_modifier_cannot_be_used_in_an_ambient_context: b(1040, 1, "_0_modifier_cannot_be_used_in_an_ambient_context_1040", "'{0}' modifier cannot be used in an ambient context."), _0_modifier_cannot_be_used_here: b(1042, 1, "_0_modifier_cannot_be_used_here_1042", "'{0}' modifier cannot be used here."), _0_modifier_cannot_appear_on_a_module_or_namespace_element: b(1044, 1, "_0_modifier_cannot_appear_on_a_module_or_namespace_element_1044", "'{0}' modifier cannot appear on a module or namespace element."), Top_level_declarations_in_d_ts_files_must_start_with_either_a_declare_or_export_modifier: b(1046, 1, "Top_level_declarations_in_d_ts_files_must_start_with_either_a_declare_or_export_modifier_1046", "Top-level declarations in .d.ts files must start with either a 'declare' or 'export' modifier."), A_rest_parameter_cannot_be_optional: b(1047, 1, "A_rest_parameter_cannot_be_optional_1047", "A rest parameter cannot be optional."), A_rest_parameter_cannot_have_an_initializer: b(1048, 1, "A_rest_parameter_cannot_have_an_initializer_1048", "A rest parameter cannot have an initializer."), A_set_accessor_must_have_exactly_one_parameter: b(1049, 1, "A_set_accessor_must_have_exactly_one_parameter_1049", "A 'set' accessor must have exactly one parameter."), A_set_accessor_cannot_have_an_optional_parameter: b(1051, 1, "A_set_accessor_cannot_have_an_optional_parameter_1051", "A 'set' accessor cannot have an optional parameter."), A_set_accessor_parameter_cannot_have_an_initializer: b(1052, 1, "A_set_accessor_parameter_cannot_have_an_initializer_1052", "A 'set' accessor parameter cannot have an initializer."), A_set_accessor_cannot_have_rest_parameter: b(1053, 1, "A_set_accessor_cannot_have_rest_parameter_1053", "A 'set' accessor cannot have rest parameter."), A_get_accessor_cannot_have_parameters: b(1054, 1, "A_get_accessor_cannot_have_parameters_1054", "A 'get' accessor cannot have parameters."), Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value: b(1055, 1, "Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Prom_1055", "Type '{0}' is not a valid async function return type in ES5/ES3 because it does not refer to a Promise-compatible constructor value."), Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher: b(1056, 1, "Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher_1056", "Accessors are only available when targeting ECMAScript 5 and higher."), The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member: b(1058, 1, "The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_t_1058", "The return type of an async function must either be a valid promise or must not contain a callable 'then' member."), A_promise_must_have_a_then_method: b(1059, 1, "A_promise_must_have_a_then_method_1059", "A promise must have a 'then' method."), The_first_parameter_of_the_then_method_of_a_promise_must_be_a_callback: b(1060, 1, "The_first_parameter_of_the_then_method_of_a_promise_must_be_a_callback_1060", "The first parameter of the 'then' method of a promise must be a callback."), Enum_member_must_have_initializer: b(1061, 1, "Enum_member_must_have_initializer_1061", "Enum member must have initializer."), Type_is_referenced_directly_or_indirectly_in_the_fulfillment_callback_of_its_own_then_method: b(1062, 1, "Type_is_referenced_directly_or_indirectly_in_the_fulfillment_callback_of_its_own_then_method_1062", "Type is referenced directly or indirectly in the fulfillment callback of its own 'then' method."), An_export_assignment_cannot_be_used_in_a_namespace: b(1063, 1, "An_export_assignment_cannot_be_used_in_a_namespace_1063", "An export assignment cannot be used in a namespace."), The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type_Did_you_mean_to_write_Promise_0: b(1064, 1, "The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type_Did_you_mean_to_wri_1064", "The return type of an async function or method must be the global Promise<T> type. Did you mean to write 'Promise<{0}>'?"), In_ambient_enum_declarations_member_initializer_must_be_constant_expression: b(1066, 1, "In_ambient_enum_declarations_member_initializer_must_be_constant_expression_1066", "In ambient enum declarations member initializer must be constant expression."), Unexpected_token_A_constructor_method_accessor_or_property_was_expected: b(1068, 1, "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068", "Unexpected token. A constructor, method, accessor, or property was expected."), Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces: b(1069, 1, "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069", "Unexpected token. A type parameter name was expected without curly braces."), _0_modifier_cannot_appear_on_a_type_member: b(1070, 1, "_0_modifier_cannot_appear_on_a_type_member_1070", "'{0}' modifier cannot appear on a type member."), _0_modifier_cannot_appear_on_an_index_signature: b(1071, 1, "_0_modifier_cannot_appear_on_an_index_signature_1071", "'{0}' modifier cannot appear on an index signature."), A_0_modifier_cannot_be_used_with_an_import_declaration: b(1079, 1, "A_0_modifier_cannot_be_used_with_an_import_declaration_1079", "A '{0}' modifier cannot be used with an import declaration."), Invalid_reference_directive_syntax: b(1084, 1, "Invalid_reference_directive_syntax_1084", "Invalid 'reference' directive syntax."), Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher_Use_the_syntax_0: b(1085, 1, "Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher_Use_the_syntax_0_1085", "Octal literals are not available when targeting ECMAScript 5 and higher. Use the syntax '{0}'."), _0_modifier_cannot_appear_on_a_constructor_declaration: b(1089, 1, "_0_modifier_cannot_appear_on_a_constructor_declaration_1089", "'{0}' modifier cannot appear on a constructor declaration."), _0_modifier_cannot_appear_on_a_parameter: b(1090, 1, "_0_modifier_cannot_appear_on_a_parameter_1090", "'{0}' modifier cannot appear on a parameter."), Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement: b(1091, 1, "Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement_1091", "Only a single variable declaration is allowed in a 'for...in' statement."), Type_parameters_cannot_appear_on_a_constructor_declaration: b(1092, 1, "Type_parameters_cannot_appear_on_a_constructor_declaration_1092", "Type parameters cannot appear on a constructor declaration."), Type_annotation_cannot_appear_on_a_constructor_declaration: b(1093, 1, "Type_annotation_cannot_appear_on_a_constructor_declaration_1093", "Type annotation cannot appear on a constructor declaration."), An_accessor_cannot_have_type_parameters: b(1094, 1, "An_accessor_cannot_have_type_parameters_1094", "An accessor cannot have type parameters."), A_set_accessor_cannot_have_a_return_type_annotation: b(1095, 1, "A_set_accessor_cannot_have_a_return_type_annotation_1095", "A 'set' accessor cannot have a return type annotation."), An_index_signature_must_have_exactly_one_parameter: b(1096, 1, "An_index_signature_must_have_exactly_one_parameter_1096", "An index signature must have exactly one parameter."), _0_list_cannot_be_empty: b(1097, 1, "_0_list_cannot_be_empty_1097", "'{0}' list cannot be empty."), Type_parameter_list_cannot_be_empty: b(1098, 1, "Type_parameter_list_cannot_be_empty_1098", "Type parameter list cannot be empty."), Type_argument_list_cannot_be_empty: b(1099, 1, "Type_argument_list_cannot_be_empty_1099", "Type argument list cannot be empty."), Invalid_use_of_0_in_strict_mode: b(1100, 1, "Invalid_use_of_0_in_strict_mode_1100", "Invalid use of '{0}' in strict mode."), with_statements_are_not_allowed_in_strict_mode: b(1101, 1, "with_statements_are_not_allowed_in_strict_mode_1101", "'with' statements are not allowed in strict mode."), delete_cannot_be_called_on_an_identifier_in_strict_mode: b(1102, 1, "delete_cannot_be_called_on_an_identifier_in_strict_mode_1102", "'delete' cannot be called on an identifier in strict mode."), for_await_loops_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules: b(1103, 1, "for_await_loops_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules_1103", "'for await' loops are only allowed within async functions and at the top levels of modules."), A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement: b(1104, 1, "A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement_1104", "A 'continue' statement can only be used within an enclosing iteration statement."), A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement: b(1105, 1, "A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement_1105", "A 'break' statement can only be used within an enclosing iteration or switch statement."), The_left_hand_side_of_a_for_of_statement_may_not_be_async: b(1106, 1, "The_left_hand_side_of_a_for_of_statement_may_not_be_async_1106", "The left-hand side of a 'for...of' statement may not be 'async'."), Jump_target_cannot_cross_function_boundary: b(1107, 1, "Jump_target_cannot_cross_function_boundary_1107", "Jump target cannot cross function boundary."), A_return_statement_can_only_be_used_within_a_function_body: b(1108, 1, "A_return_statement_can_only_be_used_within_a_function_body_1108", "A 'return' statement can only be used within a function body."), Expression_expected: b(1109, 1, "Expression_expected_1109", "Expression expected."), Type_expected: b(1110, 1, "Type_expected_1110", "Type expected."), A_default_clause_cannot_appear_more_than_once_in_a_switch_statement: b(1113, 1, "A_default_clause_cannot_appear_more_than_once_in_a_switch_statement_1113", "A 'default' clause cannot appear more than once in a 'switch' statement."), Duplicate_label_0: b(1114, 1, "Duplicate_label_0_1114", "Duplicate label '{0}'."), A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement: b(1115, 1, "A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement_1115", "A 'continue' statement can only jump to a label of an enclosing iteration statement."), A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement: b(1116, 1, "A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement_1116", "A 'break' statement can only jump to a label of an enclosing statement."), An_object_literal_cannot_have_multiple_properties_with_the_same_name: b(1117, 1, "An_object_literal_cannot_have_multiple_properties_with_the_same_name_1117", "An object literal cannot have multiple properties with the same name."), An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name: b(1118, 1, "An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name_1118", "An object literal cannot have multiple get/set accessors with the same name."), An_object_literal_cannot_have_property_and_accessor_with_the_same_name: b(1119, 1, "An_object_literal_cannot_have_property_and_accessor_with_the_same_name_1119", "An object literal cannot have property and accessor with the same name."), An_export_assignment_cannot_have_modifiers: b(1120, 1, "An_export_assignment_cannot_have_modifiers_1120", "An export assignment cannot have modifiers."), Octal_literals_are_not_allowed_in_strict_mode: b(1121, 1, "Octal_literals_are_not_allowed_in_strict_mode_1121", "Octal literals are not allowed in strict mode."), Variable_declaration_list_cannot_be_empty: b(1123, 1, "Variable_declaration_list_cannot_be_empty_1123", "Variable declaration list cannot be empty."), Digit_expected: b(1124, 1, "Digit_expected_1124", "Digit expected."), Hexadecimal_digit_expected: b(1125, 1, "Hexadecimal_digit_expected_1125", "Hexadecimal digit expected."), Unexpected_end_of_text: b(1126, 1, "Unexpected_end_of_text_1126", "Unexpected end of text."), Invalid_character: b(1127, 1, "Invalid_character_1127", "Invalid character."), Declaration_or_statement_expected: b(1128, 1, "Declaration_or_statement_expected_1128", "Declaration or statement expected."), Statement_expected: b(1129, 1, "Statement_expected_1129", "Statement expected."), case_or_default_expected: b(1130, 1, "case_or_default_expected_1130", "'case' or 'default' expected."), Property_or_signature_expected: b(1131, 1, "Property_or_signature_expected_1131", "Property or signature expected."), Enum_member_expected: b(1132, 1, "Enum_member_expected_1132", "Enum member expected."), Variable_declaration_expected: b(1134, 1, "Variable_declaration_expected_1134", "Variable declaration expected."), Argument_expression_expected: b(1135, 1, "Argument_expression_expected_1135", "Argument expression expected."), Property_assignment_expected: b(1136, 1, "Property_assignment_expected_1136", "Property assignment expected."), Expression_or_comma_expected: b(1137, 1, "Expression_or_comma_expected_1137", "Expression or comma expected."), Parameter_declaration_expected: b(1138, 1, "Parameter_declaration_expected_1138", "Parameter declaration expected."), Type_parameter_declaration_expected: b(1139, 1, "Type_parameter_declaration_expected_1139", "Type parameter declaration expected."), Type_argument_expected: b(1140, 1, "Type_argument_expected_1140", "Type argument expected."), String_literal_expected: b(1141, 1, "String_literal_expected_1141", "String literal expected."), Line_break_not_permitted_here: b(1142, 1, "Line_break_not_permitted_here_1142", "Line break not permitted here."), or_expected: b(1144, 1, "or_expected_1144", "'{' or ';' expected."), or_JSX_element_expected: b(1145, 1, "or_JSX_element_expected_1145", "'{' or JSX element expected."), Declaration_expected: b(1146, 1, "Declaration_expected_1146", "Declaration expected."), Import_declarations_in_a_namespace_cannot_reference_a_module: b(1147, 1, "Import_declarations_in_a_namespace_cannot_reference_a_module_1147", "Import declarations in a namespace cannot reference a module."), Cannot_use_imports_exports_or_module_augmentations_when_module_is_none: b(1148, 1, "Cannot_use_imports_exports_or_module_augmentations_when_module_is_none_1148", "Cannot use imports, exports, or module augmentations when '--module' is 'none'."), File_name_0_differs_from_already_included_file_name_1_only_in_casing: b(1149, 1, "File_name_0_differs_from_already_included_file_name_1_only_in_casing_1149", "File name '{0}' differs from already included file name '{1}' only in casing."), const_declarations_must_be_initialized: b(1155, 1, "const_declarations_must_be_initialized_1155", "'const' declarations must be initialized."), const_declarations_can_only_be_declared_inside_a_block: b(1156, 1, "const_declarations_can_only_be_declared_inside_a_block_1156", "'const' declarations can only be declared inside a block."), let_declarations_can_only_be_declared_inside_a_block: b(1157, 1, "let_declarations_can_only_be_declared_inside_a_block_1157", "'let' declarations can only be declared inside a block."), Unterminated_template_literal: b(1160, 1, "Unterminated_template_literal_1160", "Unterminated template literal."), Unterminated_regular_expression_literal: b(1161, 1, "Unterminated_regular_expression_literal_1161", "Unterminated regular expression literal."), An_object_member_cannot_be_declared_optional: b(1162, 1, "An_object_member_cannot_be_declared_optional_1162", "An object member cannot be declared optional."), A_yield_expression_is_only_allowed_in_a_generator_body: b(1163, 1, "A_yield_expression_is_only_allowed_in_a_generator_body_1163", "A 'yield' expression is only allowed in a generator body."), Computed_property_names_are_not_allowed_in_enums: b(1164, 1, "Computed_property_names_are_not_allowed_in_enums_1164", "Computed property names are not allowed in enums."), A_computed_property_name_in_an_ambient_context_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type: b(1165, 1, "A_computed_property_name_in_an_ambient_context_must_refer_to_an_expression_whose_type_is_a_literal_t_1165", "A computed property name in an ambient context must refer to an expression whose type is a literal type or a 'unique symbol' type."), A_computed_property_name_in_a_class_property_declaration_must_have_a_simple_literal_type_or_a_unique_symbol_type: b(1166, 1, "A_computed_property_name_in_a_class_property_declaration_must_have_a_simple_literal_type_or_a_unique_1166", "A computed property name in a class property declaration must have a simple literal type or a 'unique symbol' type."), A_computed_property_name_in_a_method_overload_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type: b(1168, 1, "A_computed_property_name_in_a_method_overload_must_refer_to_an_expression_whose_type_is_a_literal_ty_1168", "A computed property name in a method overload must refer to an expression whose type is a literal type or a 'unique symbol' type."), A_computed_property_name_in_an_interface_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type: b(1169, 1, "A_computed_property_name_in_an_interface_must_refer_to_an_expression_whose_type_is_a_literal_type_or_1169", "A computed property name in an interface must refer to an expression whose type is a literal type or a 'unique symbol' type."), A_computed_property_name_in_a_type_literal_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type: b(1170, 1, "A_computed_property_name_in_a_type_literal_must_refer_to_an_expression_whose_type_is_a_literal_type__1170", "A computed property name in a type literal must refer to an expression whose type is a literal type or a 'unique symbol' type."), A_comma_expression_is_not_allowed_in_a_computed_property_name: b(1171, 1, "A_comma_expression_is_not_allowed_in_a_computed_property_name_1171", "A comma expression is not allowed in a computed property name."), extends_clause_already_seen: b(1172, 1, "extends_clause_already_seen_1172", "'extends' clause already seen."), extends_clause_must_precede_implements_clause: b(1173, 1, "extends_clause_must_precede_implements_clause_1173", "'extends' clause must precede 'implements' clause."), Classes_can_only_extend_a_single_class: b(1174, 1, "Classes_can_only_extend_a_single_class_1174", "Classes can only extend a single class."), implements_clause_already_seen: b(1175, 1, "implements_clause_already_seen_1175", "'implements' clause already seen."), Interface_declaration_cannot_have_implements_clause: b(1176, 1, "Interface_declaration_cannot_have_implements_clause_1176", "Interface declaration cannot have 'implements' clause."), Binary_digit_expected: b(1177, 1, "Binary_digit_expected_1177", "Binary digit expected."), Octal_digit_expected: b(1178, 1, "Octal_digit_expected_1178", "Octal digit expected."), Unexpected_token_expected: b(1179, 1, "Unexpected_token_expected_1179", "Unexpected token. '{' expected."), Property_destructuring_pattern_expected: b(1180, 1, "Property_destructuring_pattern_expected_1180", "Property destructuring pattern expected."), Array_element_destructuring_pattern_expected: b(1181, 1, "Array_element_destructuring_pattern_expected_1181", "Array element destructuring pattern expected."), A_destructuring_declaration_must_have_an_initializer: b(1182, 1, "A_destructuring_declaration_must_have_an_initializer_1182", "A destructuring declaration must have an initializer."), An_implementation_cannot_be_declared_in_ambient_contexts: b(1183, 1, "An_implementation_cannot_be_declared_in_ambient_contexts_1183", "An implementation cannot be declared in ambient contexts."), Modifiers_cannot_appear_here: b(1184, 1, "Modifiers_cannot_appear_here_1184", "Modifiers cannot appear here."), Merge_conflict_marker_encountered: b(1185, 1, "Merge_conflict_marker_encountered_1185", "Merge conflict marker encountered."), A_rest_element_cannot_have_an_initializer: b(1186, 1, "A_rest_element_cannot_have_an_initializer_1186", "A rest element cannot have an initializer."), A_parameter_property_may_not_be_declared_using_a_binding_pattern: b(1187, 1, "A_parameter_property_may_not_be_declared_using_a_binding_pattern_1187", "A parameter property may not be declared using a binding pattern."), Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement: b(1188, 1, "Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement_1188", "Only a single variable declaration is allowed in a 'for...of' statement."), The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer: b(1189, 1, "The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer_1189", "The variable declaration of a 'for...in' statement cannot have an initializer."), The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer: b(1190, 1, "The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer_1190", "The variable declaration of a 'for...of' statement cannot have an initializer."), An_import_declaration_cannot_have_modifiers: b(1191, 1, "An_import_declaration_cannot_have_modifiers_1191", "An import declaration cannot have modifiers."), Module_0_has_no_default_export: b(1192, 1, "Module_0_has_no_default_export_1192", "Module '{0}' has no default export."), An_export_declaration_cannot_have_modifiers: b(1193, 1, "An_export_declaration_cannot_have_modifiers_1193", "An export declaration cannot have modifiers."), Export_declarations_are_not_permitted_in_a_namespace: b(1194, 1, "Export_declarations_are_not_permitted_in_a_namespace_1194", "Export declarations are not permitted in a namespace."), export_Asterisk_does_not_re_export_a_default: b(1195, 1, "export_Asterisk_does_not_re_export_a_default_1195", "'export *' does not re-export a default."), Catch_clause_variable_type_annotation_must_be_any_or_unknown_if_specified: b(1196, 1, "Catch_clause_variable_type_annotation_must_be_any_or_unknown_if_specified_1196", "Catch clause variable type annotation must be 'any' or 'unknown' if specified."), Catch_clause_variable_cannot_have_an_initializer: b(1197, 1, "Catch_clause_variable_cannot_have_an_initializer_1197", "Catch clause variable cannot have an initializer."), An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive: b(1198, 1, "An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive_1198", "An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive."), Unterminated_Unicode_escape_sequence: b(1199, 1, "Unterminated_Unicode_escape_sequence_1199", "Unterminated Unicode escape sequence."), Line_terminator_not_permitted_before_arrow: b(1200, 1, "Line_terminator_not_permitted_before_arrow_1200", "Line terminator not permitted before arrow."), Import_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_import_d_from_mod_or_another_module_format_instead: b(1202, 1, "Import_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_import_Asterisk_as_1202", `Import assignment cannot be used when targeting ECMAScript modules. Consider using 'import * as ns from "mod"', 'import {a} from "mod"', 'import d from "mod"', or another module format instead.`), Export_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_export_default_or_another_module_format_instead: b(1203, 1, "Export_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_export_default_or__1203", "Export assignment cannot be used when targeting ECMAScript modules. Consider using 'export default' or another module format instead."), Re_exporting_a_type_when_0_is_enabled_requires_using_export_type: b(1205, 1, "Re_exporting_a_type_when_0_is_enabled_requires_using_export_type_1205", "Re-exporting a type when '{0}' is enabled requires using 'export type'."), Decorators_are_not_valid_here: b(1206, 1, "Decorators_are_not_valid_here_1206", "Decorators are not valid here."), Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name: b(1207, 1, "Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name_1207", "Decorators cannot be applied to multiple get/set accessors of the same name."), Invalid_optional_chain_from_new_expression_Did_you_mean_to_call_0: b(1209, 1, "Invalid_optional_chain_from_new_expression_Did_you_mean_to_call_0_1209", "Invalid optional chain from new expression. Did you mean to call '{0}()'?"), Code_contained_in_a_class_is_evaluated_in_JavaScript_s_strict_mode_which_does_not_allow_this_use_of_0_For_more_information_see_https_Colon_Slash_Slashdeveloper_mozilla_org_Slashen_US_Slashdocs_SlashWeb_SlashJavaScript_SlashReference_SlashStrict_mode: b(1210, 1, "Code_contained_in_a_class_is_evaluated_in_JavaScript_s_strict_mode_which_does_not_allow_this_use_of__1210", "Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of '{0}'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode."), A_class_declaration_without_the_default_modifier_must_have_a_name: b(1211, 1, "A_class_declaration_without_the_default_modifier_must_have_a_name_1211", "A class declaration without the 'default' modifier must have a name."), Identifier_expected_0_is_a_reserved_word_in_strict_mode: b(1212, 1, "Identifier_expected_0_is_a_reserved_word_in_strict_mode_1212", "Identifier expected. '{0}' is a reserved word in strict mode."), Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode: b(1213, 1, "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_stric_1213", "Identifier expected. '{0}' is a reserved word in strict mode. Class definitions are automatically in strict mode."), Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode: b(1214, 1, "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode_1214", "Identifier expected. '{0}' is a reserved word in strict mode. Modules are automatically in strict mode."), Invalid_use_of_0_Modules_are_automatically_in_strict_mode: b(1215, 1, "Invalid_use_of_0_Modules_are_automatically_in_strict_mode_1215", "Invalid use of '{0}'. Modules are automatically in strict mode."), Identifier_expected_esModule_is_reserved_as_an_exported_marker_when_transforming_ECMAScript_modules: b(1216, 1, "Identifier_expected_esModule_is_reserved_as_an_exported_marker_when_transforming_ECMAScript_modules_1216", "Identifier expected. '__esModule' is reserved as an exported marker when transforming ECMAScript modules."), Export_assignment_is_not_supported_when_module_flag_is_system: b(1218, 1, "Export_assignment_is_not_supported_when_module_flag_is_system_1218", "Export assignment is not supported when '--module' flag is 'system'."), Generators_are_not_allowed_in_an_ambient_context: b(1221, 1, "Generators_are_not_allowed_in_an_ambient_context_1221", "Generators are not allowed in an ambient context."), An_overload_signature_cannot_be_declared_as_a_generator: b(1222, 1, "An_overload_signature_cannot_be_declared_as_a_generator_1222", "An overload signature cannot be declared as a generator."), _0_tag_already_specified: b(1223, 1, "_0_tag_already_specified_1223", "'{0}' tag already specified."), Signature_0_must_be_a_type_predicate: b(1224, 1, "Signature_0_must_be_a_type_predicate_1224", "Signature '{0}' must be a type predicate."), Cannot_find_parameter_0: b(1225, 1, "Cannot_find_parameter_0_1225", "Cannot find parameter '{0}'."), Type_predicate_0_is_not_assignable_to_1: b(1226, 1, "Type_predicate_0_is_not_assignable_to_1_1226", "Type predicate '{0}' is not assignable to '{1}'."), Parameter_0_is_not_in_the_same_position_as_parameter_1: b(1227, 1, "Parameter_0_is_not_in_the_same_position_as_parameter_1_1227", "Parameter '{0}' is not in the same position as parameter '{1}'."), A_type_predicate_is_only_allowed_in_return_type_position_for_functions_and_methods: b(1228, 1, "A_type_predicate_is_only_allowed_in_return_type_position_for_functions_and_methods_1228", "A type predicate is only allowed in return type position for functions and methods."), A_type_predicate_cannot_reference_a_rest_parameter: b(1229, 1, "A_type_predicate_cannot_reference_a_rest_parameter_1229", "A type predicate cannot reference a rest parameter."), A_type_predicate_cannot_reference_element_0_in_a_binding_pattern: b(1230, 1, "A_type_predicate_cannot_reference_element_0_in_a_binding_pattern_1230", "A type predicate cannot reference element '{0}' in a binding pattern."), An_export_assignment_must_be_at_the_top_level_of_a_file_or_module_declaration: b(1231, 1, "An_export_assignment_must_be_at_the_top_level_of_a_file_or_module_declaration_1231", "An export assignment must be at the top level of a file or module declaration."), An_import_declaration_can_only_be_used_at_the_top_level_of_a_namespace_or_module: b(1232, 1, "An_import_declaration_can_only_be_used_at_the_top_level_of_a_namespace_or_module_1232", "An import declaration can only be used at the top level of a namespace or module."), An_export_declaration_can_only_be_used_at_the_top_level_of_a_namespace_or_module: b(1233, 1, "An_export_declaration_can_only_be_used_at_the_top_level_of_a_namespace_or_module_1233", "An export declaration can only be used at the top level of a namespace or module."), An_ambient_module_declaration_is_only_allowed_at_the_top_level_in_a_file: b(1234, 1, "An_ambient_module_declaration_is_only_allowed_at_the_top_level_in_a_file_1234", "An ambient module declaration is only allowed at the top level in a file."), A_namespace_declaration_is_only_allowed_at_the_top_level_of_a_namespace_or_module: b(1235, 1, "A_namespace_declaration_is_only_allowed_at_the_top_level_of_a_namespace_or_module_1235", "A namespace declaration is only allowed at the top level of a namespace or module."), The_return_type_of_a_property_decorator_function_must_be_either_void_or_any: b(1236, 1, "The_return_type_of_a_property_decorator_function_must_be_either_void_or_any_1236", "The return type of a property decorator function must be either 'void' or 'any'."), The_return_type_of_a_parameter_decorator_function_must_be_either_void_or_any: b(1237, 1, "The_return_type_of_a_parameter_decorator_function_must_be_either_void_or_any_1237", "The return type of a parameter decorator function must be either 'void' or 'any'."), Unable_to_resolve_signature_of_class_decorator_when_called_as_an_expression: b(1238, 1, "Unable_to_resolve_signature_of_class_decorator_when_called_as_an_expression_1238", "Unable to resolve signature of class decorator when called as an expression."), Unable_to_resolve_signature_of_parameter_decorator_when_called_as_an_expression: b(1239, 1, "Unable_to_resolve_signature_of_parameter_decorator_when_called_as_an_expression_1239", "Unable to resolve signature of parameter decorator when called as an expression."), Unable_to_resolve_signature_of_property_decorator_when_called_as_an_expression: b(1240, 1, "Unable_to_resolve_signature_of_property_decorator_when_called_as_an_expression_1240", "Unable to resolve signature of property decorator when called as an expression."), Unable_to_resolve_signature_of_method_decorator_when_called_as_an_expression: b(1241, 1, "Unable_to_resolve_signature_of_method_decorator_when_called_as_an_expression_1241", "Unable to resolve signature of method decorator when called as an expression."), abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration: b(1242, 1, "abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration_1242", "'abstract' modifier can only appear on a class, method, or property declaration."), _0_modifier_cannot_be_used_with_1_modifier: b(1243, 1, "_0_modifier_cannot_be_used_with_1_modifier_1243", "'{0}' modifier cannot be used with '{1}' modifier."), Abstract_methods_can_only_appear_within_an_abstract_class: b(1244, 1, "Abstract_methods_can_only_appear_within_an_abstract_class_1244", "Abstract methods can only appear within an abstract class."), Method_0_cannot_have_an_implementation_because_it_is_marked_abstract: b(1245, 1, "Method_0_cannot_have_an_implementation_because_it_is_marked_abstract_1245", "Method '{0}' cannot have an implementation because it is marked abstract."), An_interface_property_cannot_have_an_initializer: b(1246, 1, "An_interface_property_cannot_have_an_initializer_1246", "An interface property cannot have an initializer."), A_type_literal_property_cannot_have_an_initializer: b(1247, 1, "A_type_literal_property_cannot_have_an_initializer_1247", "A type literal property cannot have an initializer."), A_class_member_cannot_have_the_0_keyword: b(1248, 1, "A_class_member_cannot_have_the_0_keyword_1248", "A class member cannot have the '{0}' keyword."), A_decorator_can_only_decorate_a_method_implementation_not_an_overload: b(1249, 1, "A_decorator_can_only_decorate_a_method_implementation_not_an_overload_1249", "A decorator can only decorate a method implementation, not an overload."), Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5: b(1250, 1, "Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_1250", "Function declarations are not allowed inside blocks in strict mode when targeting 'ES3' or 'ES5'."), Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Class_definitions_are_automatically_in_strict_mode: b(1251, 1, "Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Class_d_1251", "Function declarations are not allowed inside blocks in strict mode when targeting 'ES3' or 'ES5'. Class definitions are automatically in strict mode."), Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Modules_are_automatically_in_strict_mode: b(1252, 1, "Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Modules_1252", "Function declarations are not allowed inside blocks in strict mode when targeting 'ES3' or 'ES5'. Modules are automatically in strict mode."), A_const_initializer_in_an_ambient_context_must_be_a_string_or_numeric_literal_or_literal_enum_reference: b(1254, 1, "A_const_initializer_in_an_ambient_context_must_be_a_string_or_numeric_literal_or_literal_enum_refere_1254", "A 'const' initializer in an ambient context must be a string or numeric literal or literal enum reference."), A_definite_assignment_assertion_is_not_permitted_in_this_context: b(1255, 1, "A_definite_assignment_assertion_is_not_permitted_in_this_context_1255", "A definite assignment assertion '!' is not permitted in this context."), A_required_element_cannot_follow_an_optional_element: b(1257, 1, "A_required_element_cannot_follow_an_optional_element_1257", "A required element cannot follow an optional element."), A_default_export_must_be_at_the_top_level_of_a_file_or_module_declaration: b(1258, 1, "A_default_export_must_be_at_the_top_level_of_a_file_or_module_declaration_1258", "A default export must be at the top level of a file or module declaration."), Module_0_can_only_be_default_imported_using_the_1_flag: b(1259, 1, "Module_0_can_only_be_default_imported_using_the_1_flag_1259", "Module '{0}' can only be default-imported using the '{1}' flag"), Keywords_cannot_contain_escape_characters: b(1260, 1, "Keywords_cannot_contain_escape_characters_1260", "Keywords cannot contain escape characters."), Already_included_file_name_0_differs_from_file_name_1_only_in_casing: b(1261, 1, "Already_included_file_name_0_differs_from_file_name_1_only_in_casing_1261", "Already included file name '{0}' differs from file name '{1}' only in casing."), Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module: b(1262, 1, "Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module_1262", "Identifier expected. '{0}' is a reserved word at the top-level of a module."), Declarations_with_initializers_cannot_also_have_definite_assignment_assertions: b(1263, 1, "Declarations_with_initializers_cannot_also_have_definite_assignment_assertions_1263", "Declarations with initializers cannot also have definite assignment assertions."), Declarations_with_definite_assignment_assertions_must_also_have_type_annotations: b(1264, 1, "Declarations_with_definite_assignment_assertions_must_also_have_type_annotations_1264", "Declarations with definite assignment assertions must also have type annotations."), A_rest_element_cannot_follow_another_rest_element: b(1265, 1, "A_rest_element_cannot_follow_another_rest_element_1265", "A rest element cannot follow another rest element."), An_optional_element_cannot_follow_a_rest_element: b(1266, 1, "An_optional_element_cannot_follow_a_rest_element_1266", "An optional element cannot follow a rest element."), Property_0_cannot_have_an_initializer_because_it_is_marked_abstract: b(1267, 1, "Property_0_cannot_have_an_initializer_because_it_is_marked_abstract_1267", "Property '{0}' cannot have an initializer because it is marked abstract."), An_index_signature_parameter_type_must_be_string_number_symbol_or_a_template_literal_type: b(1268, 1, "An_index_signature_parameter_type_must_be_string_number_symbol_or_a_template_literal_type_1268", "An index signature parameter type must be 'string', 'number', 'symbol', or a template literal type."), Cannot_use_export_import_on_a_type_or_type_only_namespace_when_0_is_enabled: b(1269, 1, "Cannot_use_export_import_on_a_type_or_type_only_namespace_when_0_is_enabled_1269", "Cannot use 'export import' on a type or type-only namespace when '{0}' is enabled."), Decorator_function_return_type_0_is_not_assignable_to_type_1: b(1270, 1, "Decorator_function_return_type_0_is_not_assignable_to_type_1_1270", "Decorator function return type '{0}' is not assignable to type '{1}'."), Decorator_function_return_type_is_0_but_is_expected_to_be_void_or_any: b(1271, 1, "Decorator_function_return_type_is_0_but_is_expected_to_be_void_or_any_1271", "Decorator function return type is '{0}' but is expected to be 'void' or 'any'."), A_type_referenced_in_a_decorated_signature_must_be_imported_with_import_type_or_a_namespace_import_when_isolatedModules_and_emitDecoratorMetadata_are_enabled: b(1272, 1, "A_type_referenced_in_a_decorated_signature_must_be_imported_with_import_type_or_a_namespace_import_w_1272", "A type referenced in a decorated signature must be imported with 'import type' or a namespace import when 'isolatedModules' and 'emitDecoratorMetadata' are enabled."), _0_modifier_cannot_appear_on_a_type_parameter: b(1273, 1, "_0_modifier_cannot_appear_on_a_type_parameter_1273", "'{0}' modifier cannot appear on a type parameter"), _0_modifier_can_only_appear_on_a_type_parameter_of_a_class_interface_or_type_alias: b(1274, 1, "_0_modifier_can_only_appear_on_a_type_parameter_of_a_class_interface_or_type_alias_1274", "'{0}' modifier can only appear on a type parameter of a class, interface or type alias"), accessor_modifier_can_only_appear_on_a_property_declaration: b(1275, 1, "accessor_modifier_can_only_appear_on_a_property_declaration_1275", "'accessor' modifier can only appear on a property declaration."), An_accessor_property_cannot_be_declared_optional: b(1276, 1, "An_accessor_property_cannot_be_declared_optional_1276", "An 'accessor' property cannot be declared optional."), _0_modifier_can_only_appear_on_a_type_parameter_of_a_function_method_or_class: b(1277, 1, "_0_modifier_can_only_appear_on_a_type_parameter_of_a_function_method_or_class_1277", "'{0}' modifier can only appear on a type parameter of a function, method or class"), The_runtime_will_invoke_the_decorator_with_1_arguments_but_the_decorator_expects_0: b(1278, 1, "The_runtime_will_invoke_the_decorator_with_1_arguments_but_the_decorator_expects_0_1278", "The runtime will invoke the decorator with {1} arguments, but the decorator expects {0}."), The_runtime_will_invoke_the_decorator_with_1_arguments_but_the_decorator_expects_at_least_0: b(1279, 1, "The_runtime_will_invoke_the_decorator_with_1_arguments_but_the_decorator_expects_at_least_0_1279", "The runtime will invoke the decorator with {1} arguments, but the decorator expects at least {0}."), Namespaces_are_not_allowed_in_global_script_files_when_0_is_enabled_If_this_file_is_not_intended_to_be_a_global_script_set_moduleDetection_to_force_or_add_an_empty_export_statement: b(1280, 1, "Namespaces_are_not_allowed_in_global_script_files_when_0_is_enabled_If_this_file_is_not_intended_to__1280", "Namespaces are not allowed in global script files when '{0}' is enabled. If this file is not intended to be a global script, set 'moduleDetection' to 'force' or add an empty 'export {}' statement."), Cannot_access_0_from_another_file_without_qualification_when_1_is_enabled_Use_2_instead: b(1281, 1, "Cannot_access_0_from_another_file_without_qualification_when_1_is_enabled_Use_2_instead_1281", "Cannot access '{0}' from another file without qualification when '{1}' is enabled. Use '{2}' instead."), An_export_declaration_must_reference_a_value_when_verbatimModuleSyntax_is_enabled_but_0_only_refers_to_a_type: b(1282, 1, "An_export_declaration_must_reference_a_value_when_verbatimModuleSyntax_is_enabled_but_0_only_refers__1282", "An 'export =' declaration must reference a value when 'verbatimModuleSyntax' is enabled, but '{0}' only refers to a type."), An_export_declaration_must_reference_a_real_value_when_verbatimModuleSyntax_is_enabled_but_0_resolves_to_a_type_only_declaration: b(1283, 1, "An_export_declaration_must_reference_a_real_value_when_verbatimModuleSyntax_is_enabled_but_0_resolve_1283", "An 'export =' declaration must reference a real value when 'verbatimModuleSyntax' is enabled, but '{0}' resolves to a type-only declaration."), An_export_default_must_reference_a_value_when_verbatimModuleSyntax_is_enabled_but_0_only_refers_to_a_type: b(1284, 1, "An_export_default_must_reference_a_value_when_verbatimModuleSyntax_is_enabled_but_0_only_refers_to_a_1284", "An 'export default' must reference a value when 'verbatimModuleSyntax' is enabled, but '{0}' only refers to a type."), An_export_default_must_reference_a_real_value_when_verbatimModuleSyntax_is_enabled_but_0_resolves_to_a_type_only_declaration: b(1285, 1, "An_export_default_must_reference_a_real_value_when_verbatimModuleSyntax_is_enabled_but_0_resolves_to_1285", "An 'export default' must reference a real value when 'verbatimModuleSyntax' is enabled, but '{0}' resolves to a type-only declaration."), ESM_syntax_is_not_allowed_in_a_CommonJS_module_when_verbatimModuleSyntax_is_enabled: b(1286, 1, "ESM_syntax_is_not_allowed_in_a_CommonJS_module_when_verbatimModuleSyntax_is_enabled_1286", "ESM syntax is not allowed in a CommonJS module when 'verbatimModuleSyntax' is enabled."), A_top_level_export_modifier_cannot_be_used_on_value_declarations_in_a_CommonJS_module_when_verbatimModuleSyntax_is_enabled: b(1287, 1, "A_top_level_export_modifier_cannot_be_used_on_value_declarations_in_a_CommonJS_module_when_verbatimM_1287", "A top-level 'export' modifier cannot be used on value declarations in a CommonJS module when 'verbatimModuleSyntax' is enabled."), An_import_alias_cannot_resolve_to_a_type_or_type_only_declaration_when_verbatimModuleSyntax_is_enabled: b(1288, 1, "An_import_alias_cannot_resolve_to_a_type_or_type_only_declaration_when_verbatimModuleSyntax_is_enabl_1288", "An import alias cannot resolve to a type or type-only declaration when 'verbatimModuleSyntax' is enabled."), with_statements_are_not_allowed_in_an_async_function_block: b(1300, 1, "with_statements_are_not_allowed_in_an_async_function_block_1300", "'with' statements are not allowed in an async function block."), await_expressions_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules: b(1308, 1, "await_expressions_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules_1308", "'await' expressions are only allowed within async functions and at the top levels of modules."), The_current_file_is_a_CommonJS_module_and_cannot_use_await_at_the_top_level: b(1309, 1, "The_current_file_is_a_CommonJS_module_and_cannot_use_await_at_the_top_level_1309", "The current file is a CommonJS module and cannot use 'await' at the top level."), Did_you_mean_to_use_a_Colon_An_can_only_follow_a_property_name_when_the_containing_object_literal_is_part_of_a_destructuring_pattern: b(1312, 1, "Did_you_mean_to_use_a_Colon_An_can_only_follow_a_property_name_when_the_containing_object_literal_is_1312", "Did you mean to use a ':'? An '=' can only follow a property name when the containing object literal is part of a destructuring pattern."), The_body_of_an_if_statement_cannot_be_the_empty_statement: b(1313, 1, "The_body_of_an_if_statement_cannot_be_the_empty_statement_1313", "The body of an 'if' statement cannot be the empty statement."), Global_module_exports_may_only_appear_in_module_files: b(1314, 1, "Global_module_exports_may_only_appear_in_module_files_1314", "Global module exports may only appear in module files."), Global_module_exports_may_only_appear_in_declaration_files: b(1315, 1, "Global_module_exports_may_only_appear_in_declaration_files_1315", "Global module exports may only appear in declaration files."), Global_module_exports_may_only_appear_at_top_level: b(1316, 1, "Global_module_exports_may_only_appear_at_top_level_1316", "Global module exports may only appear at top level."), A_parameter_property_cannot_be_declared_using_a_rest_parameter: b(1317, 1, "A_parameter_property_cannot_be_declared_using_a_rest_parameter_1317", "A parameter property cannot be declared using a rest parameter."), An_abstract_accessor_cannot_have_an_implementation: b(1318, 1, "An_abstract_accessor_cannot_have_an_implementation_1318", "An abstract accessor cannot have an implementation."), A_default_export_can_only_be_used_in_an_ECMAScript_style_module: b(1319, 1, "A_default_export_can_only_be_used_in_an_ECMAScript_style_module_1319", "A default export can only be used in an ECMAScript-style module."), Type_of_await_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member: b(1320, 1, "Type_of_await_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member_1320", "Type of 'await' operand must either be a valid promise or must not contain a callable 'then' member."), Type_of_yield_operand_in_an_async_generator_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member: b(1321, 1, "Type_of_yield_operand_in_an_async_generator_must_either_be_a_valid_promise_or_must_not_contain_a_cal_1321", "Type of 'yield' operand in an async generator must either be a valid promise or must not contain a callable 'then' member."), Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member: b(1322, 1, "Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_con_1322", "Type of iterated elements of a 'yield*' operand must either be a valid promise or must not contain a callable 'then' member."), Dynamic_imports_are_only_supported_when_the_module_flag_is_set_to_es2020_es2022_esnext_commonjs_amd_system_umd_node16_or_nodenext: b(1323, 1, "Dynamic_imports_are_only_supported_when_the_module_flag_is_set_to_es2020_es2022_esnext_commonjs_amd__1323", "Dynamic imports are only supported when the '--module' flag is set to 'es2020', 'es2022', 'esnext', 'commonjs', 'amd', 'system', 'umd', 'node16', or 'nodenext'."), Dynamic_imports_only_support_a_second_argument_when_the_module_option_is_set_to_esnext_node16_or_nodenext: b(1324, 1, "Dynamic_imports_only_support_a_second_argument_when_the_module_option_is_set_to_esnext_node16_or_nod_1324", "Dynamic imports only support a second argument when the '--module' option is set to 'esnext', 'node16', or 'nodenext'."), Argument_of_dynamic_import_cannot_be_spread_element: b(1325, 1, "Argument_of_dynamic_import_cannot_be_spread_element_1325", "Argument of dynamic import cannot be spread element."), This_use_of_import_is_invalid_import_calls_can_be_written_but_they_must_have_parentheses_and_cannot_have_type_arguments: b(1326, 1, "This_use_of_import_is_invalid_import_calls_can_be_written_but_they_must_have_parentheses_and_cannot__1326", "This use of 'import' is invalid. 'import()' calls can be written, but they must have parentheses and cannot have type arguments."), String_literal_with_double_quotes_expected: b(1327, 1, "String_literal_with_double_quotes_expected_1327", "String literal with double quotes expected."), Property_value_can_only_be_string_literal_numeric_literal_true_false_null_object_literal_or_array_literal: b(1328, 1, "Property_value_can_only_be_string_literal_numeric_literal_true_false_null_object_literal_or_array_li_1328", "Property value can only be string literal, numeric literal, 'true', 'false', 'null', object literal or array literal."), _0_accepts_too_few_arguments_to_be_used_as_a_decorator_here_Did_you_mean_to_call_it_first_and_write_0: b(1329, 1, "_0_accepts_too_few_arguments_to_be_used_as_a_decorator_here_Did_you_mean_to_call_it_first_and_write__1329", "'{0}' accepts too few arguments to be used as a decorator here. Did you mean to call it first and write '@{0}()'?"), A_property_of_an_interface_or_type_literal_whose_type_is_a_unique_symbol_type_must_be_readonly: b(1330, 1, "A_property_of_an_interface_or_type_literal_whose_type_is_a_unique_symbol_type_must_be_readonly_1330", "A property of an interface or type literal whose type is a 'unique symbol' type must be 'readonly'."), A_property_of_a_class_whose_type_is_a_unique_symbol_type_must_be_both_static_and_readonly: b(1331, 1, "A_property_of_a_class_whose_type_is_a_unique_symbol_type_must_be_both_static_and_readonly_1331", "A property of a class whose type is a 'unique symbol' type must be both 'static' and 'readonly'."), A_variable_whose_type_is_a_unique_symbol_type_must_be_const: b(1332, 1, "A_variable_whose_type_is_a_unique_symbol_type_must_be_const_1332", "A variable whose type is a 'unique symbol' type must be 'const'."), unique_symbol_types_may_not_be_used_on_a_variable_declaration_with_a_binding_name: b(1333, 1, "unique_symbol_types_may_not_be_used_on_a_variable_declaration_with_a_binding_name_1333", "'unique symbol' types may not be used on a variable declaration with a binding name."), unique_symbol_types_are_only_allowed_on_variables_in_a_variable_statement: b(1334, 1, "unique_symbol_types_are_only_allowed_on_variables_in_a_variable_statement_1334", "'unique symbol' types are only allowed on variables in a variable statement."), unique_symbol_types_are_not_allowed_here: b(1335, 1, "unique_symbol_types_are_not_allowed_here_1335", "'unique symbol' types are not allowed here."), An_index_signature_parameter_type_cannot_be_a_literal_type_or_generic_type_Consider_using_a_mapped_object_type_instead: b(1337, 1, "An_index_signature_parameter_type_cannot_be_a_literal_type_or_generic_type_Consider_using_a_mapped_o_1337", "An index signature parameter type cannot be a literal type or generic type. Consider using a mapped object type instead."), infer_declarations_are_only_permitted_in_the_extends_clause_of_a_conditional_type: b(1338, 1, "infer_declarations_are_only_permitted_in_the_extends_clause_of_a_conditional_type_1338", "'infer' declarations are only permitted in the 'extends' clause of a conditional type."), Module_0_does_not_refer_to_a_value_but_is_used_as_a_value_here: b(1339, 1, "Module_0_does_not_refer_to_a_value_but_is_used_as_a_value_here_1339", "Module '{0}' does not refer to a value, but is used as a value here."), Module_0_does_not_refer_to_a_type_but_is_used_as_a_type_here_Did_you_mean_typeof_import_0: b(1340, 1, "Module_0_does_not_refer_to_a_type_but_is_used_as_a_type_here_Did_you_mean_typeof_import_0_1340", "Module '{0}' does not refer to a type, but is used as a type here. Did you mean 'typeof import('{0}')'?"), Class_constructor_may_not_be_an_accessor: b(1341, 1, "Class_constructor_may_not_be_an_accessor_1341", "Class constructor may not be an accessor."), The_import_meta_meta_property_is_only_allowed_when_the_module_option_is_es2020_es2022_esnext_system_node16_or_nodenext: b(1343, 1, "The_import_meta_meta_property_is_only_allowed_when_the_module_option_is_es2020_es2022_esnext_system__1343", "The 'import.meta' meta-property is only allowed when the '--module' option is 'es2020', 'es2022', 'esnext', 'system', 'node16', or 'nodenext'."), A_label_is_not_allowed_here: b(1344, 1, "A_label_is_not_allowed_here_1344", "'A label is not allowed here."), An_expression_of_type_void_cannot_be_tested_for_truthiness: b(1345, 1, "An_expression_of_type_void_cannot_be_tested_for_truthiness_1345", "An expression of type 'void' cannot be tested for truthiness."), This_parameter_is_not_allowed_with_use_strict_directive: b(1346, 1, "This_parameter_is_not_allowed_with_use_strict_directive_1346", "This parameter is not allowed with 'use strict' directive."), use_strict_directive_cannot_be_used_with_non_simple_parameter_list: b(1347, 1, "use_strict_directive_cannot_be_used_with_non_simple_parameter_list_1347", "'use strict' directive cannot be used with non-simple parameter list."), Non_simple_parameter_declared_here: b(1348, 1, "Non_simple_parameter_declared_here_1348", "Non-simple parameter declared here."), use_strict_directive_used_here: b(1349, 1, "use_strict_directive_used_here_1349", "'use strict' directive used here."), Print_the_final_configuration_instead_of_building: b(1350, 3, "Print_the_final_configuration_instead_of_building_1350", "Print the final configuration instead of building."), An_identifier_or_keyword_cannot_immediately_follow_a_numeric_literal: b(1351, 1, "An_identifier_or_keyword_cannot_immediately_follow_a_numeric_literal_1351", "An identifier or keyword cannot immediately follow a numeric literal."), A_bigint_literal_cannot_use_exponential_notation: b(1352, 1, "A_bigint_literal_cannot_use_exponential_notation_1352", "A bigint literal cannot use exponential notation."), A_bigint_literal_must_be_an_integer: b(1353, 1, "A_bigint_literal_must_be_an_integer_1353", "A bigint literal must be an integer."), readonly_type_modifier_is_only_permitted_on_array_and_tuple_literal_types: b(1354, 1, "readonly_type_modifier_is_only_permitted_on_array_and_tuple_literal_types_1354", "'readonly' type modifier is only permitted on array and tuple literal types."), A_const_assertions_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array_or_object_literals: b(1355, 1, "A_const_assertions_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array__1355", "A 'const' assertions can only be applied to references to enum members, or string, number, boolean, array, or object literals."), Did_you_mean_to_mark_this_function_as_async: b(1356, 1, "Did_you_mean_to_mark_this_function_as_async_1356", "Did you mean to mark this function as 'async'?"), An_enum_member_name_must_be_followed_by_a_or: b(1357, 1, "An_enum_member_name_must_be_followed_by_a_or_1357", "An enum member name must be followed by a ',', '=', or '}'."), Tagged_template_expressions_are_not_permitted_in_an_optional_chain: b(1358, 1, "Tagged_template_expressions_are_not_permitted_in_an_optional_chain_1358", "Tagged template expressions are not permitted in an optional chain."), Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here: b(1359, 1, "Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here_1359", "Identifier expected. '{0}' is a reserved word that cannot be used here."), Type_0_does_not_satisfy_the_expected_type_1: b(1360, 1, "Type_0_does_not_satisfy_the_expected_type_1_1360", "Type '{0}' does not satisfy the expected type '{1}'."), _0_cannot_be_used_as_a_value_because_it_was_imported_using_import_type: b(1361, 1, "_0_cannot_be_used_as_a_value_because_it_was_imported_using_import_type_1361", "'{0}' cannot be used as a value because it was imported using 'import type'."), _0_cannot_be_used_as_a_value_because_it_was_exported_using_export_type: b(1362, 1, "_0_cannot_be_used_as_a_value_because_it_was_exported_using_export_type_1362", "'{0}' cannot be used as a value because it was exported using 'export type'."), A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both: b(1363, 1, "A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both_1363", "A type-only import can specify a default import or named bindings, but not both."), Convert_to_type_only_export: b(1364, 3, "Convert_to_type_only_export_1364", "Convert to type-only export"), Convert_all_re_exported_types_to_type_only_exports: b(1365, 3, "Convert_all_re_exported_types_to_type_only_exports_1365", "Convert all re-exported types to type-only exports"), Split_into_two_separate_import_declarations: b(1366, 3, "Split_into_two_separate_import_declarations_1366", "Split into two separate import declarations"), Split_all_invalid_type_only_imports: b(1367, 3, "Split_all_invalid_type_only_imports_1367", "Split all invalid type-only imports"), Class_constructor_may_not_be_a_generator: b(1368, 1, "Class_constructor_may_not_be_a_generator_1368", "Class constructor may not be a generator."), Did_you_mean_0: b(1369, 3, "Did_you_mean_0_1369", "Did you mean '{0}'?"), This_import_is_never_used_as_a_value_and_must_use_import_type_because_importsNotUsedAsValues_is_set_to_error: b(1371, 1, "This_import_is_never_used_as_a_value_and_must_use_import_type_because_importsNotUsedAsValues_is_set__1371", "This import is never used as a value and must use 'import type' because 'importsNotUsedAsValues' is set to 'error'."), Convert_to_type_only_import: b(1373, 3, "Convert_to_type_only_import_1373", "Convert to type-only import"), Convert_all_imports_not_used_as_a_value_to_type_only_imports: b(1374, 3, "Convert_all_imports_not_used_as_a_value_to_type_only_imports_1374", "Convert all imports not used as a value to type-only imports"), await_expressions_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_has_no_imports_or_exports_Consider_adding_an_empty_export_to_make_this_file_a_module: b(1375, 1, "await_expressions_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_fi_1375", "'await' expressions are only allowed at the top level of a file when that file is a module, but this file has no imports or exports. Consider adding an empty 'export {}' to make this file a module."), _0_was_imported_here: b(1376, 3, "_0_was_imported_here_1376", "'{0}' was imported here."), _0_was_exported_here: b(1377, 3, "_0_was_exported_here_1377", "'{0}' was exported here."), Top_level_await_expressions_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_or_nodenext_and_the_target_option_is_set_to_es2017_or_higher: b(1378, 1, "Top_level_await_expressions_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_n_1378", "Top-level 'await' expressions are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', or 'nodenext', and the 'target' option is set to 'es2017' or higher."), An_import_alias_cannot_reference_a_declaration_that_was_exported_using_export_type: b(1379, 1, "An_import_alias_cannot_reference_a_declaration_that_was_exported_using_export_type_1379", "An import alias cannot reference a declaration that was exported using 'export type'."), An_import_alias_cannot_reference_a_declaration_that_was_imported_using_import_type: b(1380, 1, "An_import_alias_cannot_reference_a_declaration_that_was_imported_using_import_type_1380", "An import alias cannot reference a declaration that was imported using 'import type'."), Unexpected_token_Did_you_mean_or_rbrace: b(1381, 1, "Unexpected_token_Did_you_mean_or_rbrace_1381", "Unexpected token. Did you mean `{'}'}` or `&rbrace;`?"), Unexpected_token_Did_you_mean_or_gt: b(1382, 1, "Unexpected_token_Did_you_mean_or_gt_1382", "Unexpected token. Did you mean `{'>'}` or `&gt;`?"), Function_type_notation_must_be_parenthesized_when_used_in_a_union_type: b(1385, 1, "Function_type_notation_must_be_parenthesized_when_used_in_a_union_type_1385", "Function type notation must be parenthesized when used in a union type."), Constructor_type_notation_must_be_parenthesized_when_used_in_a_union_type: b(1386, 1, "Constructor_type_notation_must_be_parenthesized_when_used_in_a_union_type_1386", "Constructor type notation must be parenthesized when used in a union type."), Function_type_notation_must_be_parenthesized_when_used_in_an_intersection_type: b(1387, 1, "Function_type_notation_must_be_parenthesized_when_used_in_an_intersection_type_1387", "Function type notation must be parenthesized when used in an intersection type."), Constructor_type_notation_must_be_parenthesized_when_used_in_an_intersection_type: b(1388, 1, "Constructor_type_notation_must_be_parenthesized_when_used_in_an_intersection_type_1388", "Constructor type notation must be parenthesized when used in an intersection type."), _0_is_not_allowed_as_a_variable_declaration_name: b(1389, 1, "_0_is_not_allowed_as_a_variable_declaration_name_1389", "'{0}' is not allowed as a variable declaration name."), _0_is_not_allowed_as_a_parameter_name: b(1390, 1, "_0_is_not_allowed_as_a_parameter_name_1390", "'{0}' is not allowed as a parameter name."), An_import_alias_cannot_use_import_type: b(1392, 1, "An_import_alias_cannot_use_import_type_1392", "An import alias cannot use 'import type'"), Imported_via_0_from_file_1: b(1393, 3, "Imported_via_0_from_file_1_1393", "Imported via {0} from file '{1}'"), Imported_via_0_from_file_1_with_packageId_2: b(1394, 3, "Imported_via_0_from_file_1_with_packageId_2_1394", "Imported via {0} from file '{1}' with packageId '{2}'"), Imported_via_0_from_file_1_to_import_importHelpers_as_specified_in_compilerOptions: b(1395, 3, "Imported_via_0_from_file_1_to_import_importHelpers_as_specified_in_compilerOptions_1395", "Imported via {0} from file '{1}' to import 'importHelpers' as specified in compilerOptions"), Imported_via_0_from_file_1_with_packageId_2_to_import_importHelpers_as_specified_in_compilerOptions: b(1396, 3, "Imported_via_0_from_file_1_with_packageId_2_to_import_importHelpers_as_specified_in_compilerOptions_1396", "Imported via {0} from file '{1}' with packageId '{2}' to import 'importHelpers' as specified in compilerOptions"), Imported_via_0_from_file_1_to_import_jsx_and_jsxs_factory_functions: b(1397, 3, "Imported_via_0_from_file_1_to_import_jsx_and_jsxs_factory_functions_1397", "Imported via {0} from file '{1}' to import 'jsx' and 'jsxs' factory functions"), Imported_via_0_from_file_1_with_packageId_2_to_import_jsx_and_jsxs_factory_functions: b(1398, 3, "Imported_via_0_from_file_1_with_packageId_2_to_import_jsx_and_jsxs_factory_functions_1398", "Imported via {0} from file '{1}' with packageId '{2}' to import 'jsx' and 'jsxs' factory functions"), File_is_included_via_import_here: b(1399, 3, "File_is_included_via_import_here_1399", "File is included via import here."), Referenced_via_0_from_file_1: b(1400, 3, "Referenced_via_0_from_file_1_1400", "Referenced via '{0}' from file '{1}'"), File_is_included_via_reference_here: b(1401, 3, "File_is_included_via_reference_here_1401", "File is included via reference here."), Type_library_referenced_via_0_from_file_1: b(1402, 3, "Type_library_referenced_via_0_from_file_1_1402", "Type library referenced via '{0}' from file '{1}'"), Type_library_referenced_via_0_from_file_1_with_packageId_2: b(1403, 3, "Type_library_referenced_via_0_from_file_1_with_packageId_2_1403", "Type library referenced via '{0}' from file '{1}' with packageId '{2}'"), File_is_included_via_type_library_reference_here: b(1404, 3, "File_is_included_via_type_library_reference_here_1404", "File is included via type library reference here."), Library_referenced_via_0_from_file_1: b(1405, 3, "Library_referenced_via_0_from_file_1_1405", "Library referenced via '{0}' from file '{1}'"), File_is_included_via_library_reference_here: b(1406, 3, "File_is_included_via_library_reference_here_1406", "File is included via library reference here."), Matched_by_include_pattern_0_in_1: b(1407, 3, "Matched_by_include_pattern_0_in_1_1407", "Matched by include pattern '{0}' in '{1}'"), File_is_matched_by_include_pattern_specified_here: b(1408, 3, "File_is_matched_by_include_pattern_specified_here_1408", "File is matched by include pattern specified here."), Part_of_files_list_in_tsconfig_json: b(1409, 3, "Part_of_files_list_in_tsconfig_json_1409", "Part of 'files' list in tsconfig.json"), File_is_matched_by_files_list_specified_here: b(1410, 3, "File_is_matched_by_files_list_specified_here_1410", "File is matched by 'files' list specified here."), Output_from_referenced_project_0_included_because_1_specified: b(1411, 3, "Output_from_referenced_project_0_included_because_1_specified_1411", "Output from referenced project '{0}' included because '{1}' specified"), Output_from_referenced_project_0_included_because_module_is_specified_as_none: b(1412, 3, "Output_from_referenced_project_0_included_because_module_is_specified_as_none_1412", "Output from referenced project '{0}' included because '--module' is specified as 'none'"), File_is_output_from_referenced_project_specified_here: b(1413, 3, "File_is_output_from_referenced_project_specified_here_1413", "File is output from referenced project specified here."), Source_from_referenced_project_0_included_because_1_specified: b(1414, 3, "Source_from_referenced_project_0_included_because_1_specified_1414", "Source from referenced project '{0}' included because '{1}' specified"), Source_from_referenced_project_0_included_because_module_is_specified_as_none: b(1415, 3, "Source_from_referenced_project_0_included_because_module_is_specified_as_none_1415", "Source from referenced project '{0}' included because '--module' is specified as 'none'"), File_is_source_from_referenced_project_specified_here: b(1416, 3, "File_is_source_from_referenced_project_specified_here_1416", "File is source from referenced project specified here."), Entry_point_of_type_library_0_specified_in_compilerOptions: b(1417, 3, "Entry_point_of_type_library_0_specified_in_compilerOptions_1417", "Entry point of type library '{0}' specified in compilerOptions"), Entry_point_of_type_library_0_specified_in_compilerOptions_with_packageId_1: b(1418, 3, "Entry_point_of_type_library_0_specified_in_compilerOptions_with_packageId_1_1418", "Entry point of type library '{0}' specified in compilerOptions with packageId '{1}'"), File_is_entry_point_of_type_library_specified_here: b(1419, 3, "File_is_entry_point_of_type_library_specified_here_1419", "File is entry point of type library specified here."), Entry_point_for_implicit_type_library_0: b(1420, 3, "Entry_point_for_implicit_type_library_0_1420", "Entry point for implicit type library '{0}'"), Entry_point_for_implicit_type_library_0_with_packageId_1: b(1421, 3, "Entry_point_for_implicit_type_library_0_with_packageId_1_1421", "Entry point for implicit type library '{0}' with packageId '{1}'"), Library_0_specified_in_compilerOptions: b(1422, 3, "Library_0_specified_in_compilerOptions_1422", "Library '{0}' specified in compilerOptions"), File_is_library_specified_here: b(1423, 3, "File_is_library_specified_here_1423", "File is library specified here."), Default_library: b(1424, 3, "Default_library_1424", "Default library"), Default_library_for_target_0: b(1425, 3, "Default_library_for_target_0_1425", "Default library for target '{0}'"), File_is_default_library_for_target_specified_here: b(1426, 3, "File_is_default_library_for_target_specified_here_1426", "File is default library for target specified here."), Root_file_specified_for_compilation: b(1427, 3, "Root_file_specified_for_compilation_1427", "Root file specified for compilation"), File_is_output_of_project_reference_source_0: b(1428, 3, "File_is_output_of_project_reference_source_0_1428", "File is output of project reference source '{0}'"), File_redirects_to_file_0: b(1429, 3, "File_redirects_to_file_0_1429", "File redirects to file '{0}'"), The_file_is_in_the_program_because_Colon: b(1430, 3, "The_file_is_in_the_program_because_Colon_1430", "The file is in the program because:"), for_await_loops_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_has_no_imports_or_exports_Consider_adding_an_empty_export_to_make_this_file_a_module: b(1431, 1, "for_await_loops_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_1431", "'for await' loops are only allowed at the top level of a file when that file is a module, but this file has no imports or exports. Consider adding an empty 'export {}' to make this file a module."), Top_level_for_await_loops_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_or_nodenext_and_the_target_option_is_set_to_es2017_or_higher: b(1432, 1, "Top_level_for_await_loops_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_nod_1432", "Top-level 'for await' loops are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', or 'nodenext', and the 'target' option is set to 'es2017' or higher."), Neither_decorators_nor_modifiers_may_be_applied_to_this_parameters: b(1433, 1, "Neither_decorators_nor_modifiers_may_be_applied_to_this_parameters_1433", "Neither decorators nor modifiers may be applied to 'this' parameters."), Unexpected_keyword_or_identifier: b(1434, 1, "Unexpected_keyword_or_identifier_1434", "Unexpected keyword or identifier."), Unknown_keyword_or_identifier_Did_you_mean_0: b(1435, 1, "Unknown_keyword_or_identifier_Did_you_mean_0_1435", "Unknown keyword or identifier. Did you mean '{0}'?"), Decorators_must_precede_the_name_and_all_keywords_of_property_declarations: b(1436, 1, "Decorators_must_precede_the_name_and_all_keywords_of_property_declarations_1436", "Decorators must precede the name and all keywords of property declarations."), Namespace_must_be_given_a_name: b(1437, 1, "Namespace_must_be_given_a_name_1437", "Namespace must be given a name."), Interface_must_be_given_a_name: b(1438, 1, "Interface_must_be_given_a_name_1438", "Interface must be given a name."), Type_alias_must_be_given_a_name: b(1439, 1, "Type_alias_must_be_given_a_name_1439", "Type alias must be given a name."), Variable_declaration_not_allowed_at_this_location: b(1440, 1, "Variable_declaration_not_allowed_at_this_location_1440", "Variable declaration not allowed at this location."), Cannot_start_a_function_call_in_a_type_annotation: b(1441, 1, "Cannot_start_a_function_call_in_a_type_annotation_1441", "Cannot start a function call in a type annotation."), Expected_for_property_initializer: b(1442, 1, "Expected_for_property_initializer_1442", "Expected '=' for property initializer."), Module_declaration_names_may_only_use_or_quoted_strings: b(1443, 1, "Module_declaration_names_may_only_use_or_quoted_strings_1443", `Module declaration names may only use ' or " quoted strings.`), _0_is_a_type_and_must_be_imported_using_a_type_only_import_when_preserveValueImports_and_isolatedModules_are_both_enabled: b(1444, 1, "_0_is_a_type_and_must_be_imported_using_a_type_only_import_when_preserveValueImports_and_isolatedMod_1444", "'{0}' is a type and must be imported using a type-only import when 'preserveValueImports' and 'isolatedModules' are both enabled."), _0_resolves_to_a_type_only_declaration_and_must_be_imported_using_a_type_only_import_when_preserveValueImports_and_isolatedModules_are_both_enabled: b(1446, 1, "_0_resolves_to_a_type_only_declaration_and_must_be_imported_using_a_type_only_import_when_preserveVa_1446", "'{0}' resolves to a type-only declaration and must be imported using a type-only import when 'preserveValueImports' and 'isolatedModules' are both enabled."), _0_resolves_to_a_type_only_declaration_and_must_be_re_exported_using_a_type_only_re_export_when_1_is_enabled: b(1448, 1, "_0_resolves_to_a_type_only_declaration_and_must_be_re_exported_using_a_type_only_re_export_when_1_is_1448", "'{0}' resolves to a type-only declaration and must be re-exported using a type-only re-export when '{1}' is enabled."), Preserve_unused_imported_values_in_the_JavaScript_output_that_would_otherwise_be_removed: b(1449, 3, "Preserve_unused_imported_values_in_the_JavaScript_output_that_would_otherwise_be_removed_1449", "Preserve unused imported values in the JavaScript output that would otherwise be removed."), Dynamic_imports_can_only_accept_a_module_specifier_and_an_optional_assertion_as_arguments: b(1450, 3, "Dynamic_imports_can_only_accept_a_module_specifier_and_an_optional_assertion_as_arguments_1450", "Dynamic imports can only accept a module specifier and an optional assertion as arguments"), Private_identifiers_are_only_allowed_in_class_bodies_and_may_only_be_used_as_part_of_a_class_member_declaration_property_access_or_on_the_left_hand_side_of_an_in_expression: b(1451, 1, "Private_identifiers_are_only_allowed_in_class_bodies_and_may_only_be_used_as_part_of_a_class_member__1451", "Private identifiers are only allowed in class bodies and may only be used as part of a class member declaration, property access, or on the left-hand-side of an 'in' expression"), resolution_mode_assertions_are_only_supported_when_moduleResolution_is_node16_or_nodenext: b(1452, 1, "resolution_mode_assertions_are_only_supported_when_moduleResolution_is_node16_or_nodenext_1452", "'resolution-mode' assertions are only supported when `moduleResolution` is `node16` or `nodenext`."), resolution_mode_should_be_either_require_or_import: b(1453, 1, "resolution_mode_should_be_either_require_or_import_1453", "`resolution-mode` should be either `require` or `import`."), resolution_mode_can_only_be_set_for_type_only_imports: b(1454, 1, "resolution_mode_can_only_be_set_for_type_only_imports_1454", "`resolution-mode` can only be set for type-only imports."), resolution_mode_is_the_only_valid_key_for_type_import_assertions: b(1455, 1, "resolution_mode_is_the_only_valid_key_for_type_import_assertions_1455", "`resolution-mode` is the only valid key for type import assertions."), Type_import_assertions_should_have_exactly_one_key_resolution_mode_with_value_import_or_require: b(1456, 1, "Type_import_assertions_should_have_exactly_one_key_resolution_mode_with_value_import_or_require_1456", "Type import assertions should have exactly one key - `resolution-mode` - with value `import` or `require`."), Matched_by_default_include_pattern_Asterisk_Asterisk_Slash_Asterisk: b(1457, 3, "Matched_by_default_include_pattern_Asterisk_Asterisk_Slash_Asterisk_1457", "Matched by default include pattern '**/*'"), File_is_ECMAScript_module_because_0_has_field_type_with_value_module: b(1458, 3, "File_is_ECMAScript_module_because_0_has_field_type_with_value_module_1458", `File is ECMAScript module because '{0}' has field "type" with value "module"`), File_is_CommonJS_module_because_0_has_field_type_whose_value_is_not_module: b(1459, 3, "File_is_CommonJS_module_because_0_has_field_type_whose_value_is_not_module_1459", `File is CommonJS module because '{0}' has field "type" whose value is not "module"`), File_is_CommonJS_module_because_0_does_not_have_field_type: b(1460, 3, "File_is_CommonJS_module_because_0_does_not_have_field_type_1460", `File is CommonJS module because '{0}' does not have field "type"`), File_is_CommonJS_module_because_package_json_was_not_found: b(1461, 3, "File_is_CommonJS_module_because_package_json_was_not_found_1461", "File is CommonJS module because 'package.json' was not found"), The_import_meta_meta_property_is_not_allowed_in_files_which_will_build_into_CommonJS_output: b(1470, 1, "The_import_meta_meta_property_is_not_allowed_in_files_which_will_build_into_CommonJS_output_1470", "The 'import.meta' meta-property is not allowed in files which will build into CommonJS output."), Module_0_cannot_be_imported_using_this_construct_The_specifier_only_resolves_to_an_ES_module_which_cannot_be_imported_with_require_Use_an_ECMAScript_import_instead: b(1471, 1, "Module_0_cannot_be_imported_using_this_construct_The_specifier_only_resolves_to_an_ES_module_which_c_1471", "Module '{0}' cannot be imported using this construct. The specifier only resolves to an ES module, which cannot be imported with 'require'. Use an ECMAScript import instead."), catch_or_finally_expected: b(1472, 1, "catch_or_finally_expected_1472", "'catch' or 'finally' expected."), An_import_declaration_can_only_be_used_at_the_top_level_of_a_module: b(1473, 1, "An_import_declaration_can_only_be_used_at_the_top_level_of_a_module_1473", "An import declaration can only be used at the top level of a module."), An_export_declaration_can_only_be_used_at_the_top_level_of_a_module: b(1474, 1, "An_export_declaration_can_only_be_used_at_the_top_level_of_a_module_1474", "An export declaration can only be used at the top level of a module."), Control_what_method_is_used_to_detect_module_format_JS_files: b(1475, 3, "Control_what_method_is_used_to_detect_module_format_JS_files_1475", "Control what method is used to detect module-format JS files."), auto_Colon_Treat_files_with_imports_exports_import_meta_jsx_with_jsx_Colon_react_jsx_or_esm_format_with_module_Colon_node16_as_modules: b(1476, 3, "auto_Colon_Treat_files_with_imports_exports_import_meta_jsx_with_jsx_Colon_react_jsx_or_esm_format_w_1476", '"auto": Treat files with imports, exports, import.meta, jsx (with jsx: react-jsx), or esm format (with module: node16+) as modules.'), An_instantiation_expression_cannot_be_followed_by_a_property_access: b(1477, 1, "An_instantiation_expression_cannot_be_followed_by_a_property_access_1477", "An instantiation expression cannot be followed by a property access."), Identifier_or_string_literal_expected: b(1478, 1, "Identifier_or_string_literal_expected_1478", "Identifier or string literal expected."), The_current_file_is_a_CommonJS_module_whose_imports_will_produce_require_calls_however_the_referenced_file_is_an_ECMAScript_module_and_cannot_be_imported_with_require_Consider_writing_a_dynamic_import_0_call_instead: b(1479, 1, "The_current_file_is_a_CommonJS_module_whose_imports_will_produce_require_calls_however_the_reference_1479", `The current file is a CommonJS module whose imports will produce 'require' calls; however, the referenced file is an ECMAScript module and cannot be imported with 'require'. Consider writing a dynamic 'import("{0}")' call instead.`), To_convert_this_file_to_an_ECMAScript_module_change_its_file_extension_to_0_or_create_a_local_package_json_file_with_type_Colon_module: b(1480, 3, "To_convert_this_file_to_an_ECMAScript_module_change_its_file_extension_to_0_or_create_a_local_packag_1480", 'To convert this file to an ECMAScript module, change its file extension to \'{0}\' or create a local package.json file with `{ "type": "module" }`.'), To_convert_this_file_to_an_ECMAScript_module_change_its_file_extension_to_0_or_add_the_field_type_Colon_module_to_1: b(1481, 3, "To_convert_this_file_to_an_ECMAScript_module_change_its_file_extension_to_0_or_add_the_field_type_Co_1481", `To convert this file to an ECMAScript module, change its file extension to '{0}', or add the field \`"type": "module"\` to '{1}'.`), To_convert_this_file_to_an_ECMAScript_module_add_the_field_type_Colon_module_to_0: b(1482, 3, "To_convert_this_file_to_an_ECMAScript_module_add_the_field_type_Colon_module_to_0_1482", 'To convert this file to an ECMAScript module, add the field `"type": "module"` to \'{0}\'.'), To_convert_this_file_to_an_ECMAScript_module_create_a_local_package_json_file_with_type_Colon_module: b(1483, 3, "To_convert_this_file_to_an_ECMAScript_module_create_a_local_package_json_file_with_type_Colon_module_1483", 'To convert this file to an ECMAScript module, create a local package.json file with `{ "type": "module" }`.'), _0_is_a_type_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled: b(1484, 1, "_0_is_a_type_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled_1484", "'{0}' is a type and must be imported using a type-only import when 'verbatimModuleSyntax' is enabled."), _0_resolves_to_a_type_only_declaration_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled: b(1485, 1, "_0_resolves_to_a_type_only_declaration_and_must_be_imported_using_a_type_only_import_when_verbatimMo_1485", "'{0}' resolves to a type-only declaration and must be imported using a type-only import when 'verbatimModuleSyntax' is enabled."), Decorator_used_before_export_here: b(1486, 1, "Decorator_used_before_export_here_1486", "Decorator used before 'export' here."), The_types_of_0_are_incompatible_between_these_types: b(2200, 1, "The_types_of_0_are_incompatible_between_these_types_2200", "The types of '{0}' are incompatible between these types."), The_types_returned_by_0_are_incompatible_between_these_types: b(2201, 1, "The_types_returned_by_0_are_incompatible_between_these_types_2201", "The types returned by '{0}' are incompatible between these types."), Call_signature_return_types_0_and_1_are_incompatible: b(2202, 1, "Call_signature_return_types_0_and_1_are_incompatible_2202", "Call signature return types '{0}' and '{1}' are incompatible.", void 0, !0), Construct_signature_return_types_0_and_1_are_incompatible: b(2203, 1, "Construct_signature_return_types_0_and_1_are_incompatible_2203", "Construct signature return types '{0}' and '{1}' are incompatible.", void 0, !0), Call_signatures_with_no_arguments_have_incompatible_return_types_0_and_1: b(2204, 1, "Call_signatures_with_no_arguments_have_incompatible_return_types_0_and_1_2204", "Call signatures with no arguments have incompatible return types '{0}' and '{1}'.", void 0, !0), Construct_signatures_with_no_arguments_have_incompatible_return_types_0_and_1: b(2205, 1, "Construct_signatures_with_no_arguments_have_incompatible_return_types_0_and_1_2205", "Construct signatures with no arguments have incompatible return types '{0}' and '{1}'.", void 0, !0), The_type_modifier_cannot_be_used_on_a_named_import_when_import_type_is_used_on_its_import_statement: b(2206, 1, "The_type_modifier_cannot_be_used_on_a_named_import_when_import_type_is_used_on_its_import_statement_2206", "The 'type' modifier cannot be used on a named import when 'import type' is used on its import statement."), The_type_modifier_cannot_be_used_on_a_named_export_when_export_type_is_used_on_its_export_statement: b(2207, 1, "The_type_modifier_cannot_be_used_on_a_named_export_when_export_type_is_used_on_its_export_statement_2207", "The 'type' modifier cannot be used on a named export when 'export type' is used on its export statement."), This_type_parameter_might_need_an_extends_0_constraint: b(2208, 1, "This_type_parameter_might_need_an_extends_0_constraint_2208", "This type parameter might need an `extends {0}` constraint."), The_project_root_is_ambiguous_but_is_required_to_resolve_export_map_entry_0_in_file_1_Supply_the_rootDir_compiler_option_to_disambiguate: b(2209, 1, "The_project_root_is_ambiguous_but_is_required_to_resolve_export_map_entry_0_in_file_1_Supply_the_roo_2209", "The project root is ambiguous, but is required to resolve export map entry '{0}' in file '{1}'. Supply the `rootDir` compiler option to disambiguate."), The_project_root_is_ambiguous_but_is_required_to_resolve_import_map_entry_0_in_file_1_Supply_the_rootDir_compiler_option_to_disambiguate: b(2210, 1, "The_project_root_is_ambiguous_but_is_required_to_resolve_import_map_entry_0_in_file_1_Supply_the_roo_2210", "The project root is ambiguous, but is required to resolve import map entry '{0}' in file '{1}'. Supply the `rootDir` compiler option to disambiguate."), Add_extends_constraint: b(2211, 3, "Add_extends_constraint_2211", "Add `extends` constraint."), Add_extends_constraint_to_all_type_parameters: b(2212, 3, "Add_extends_constraint_to_all_type_parameters_2212", "Add `extends` constraint to all type parameters"), Duplicate_identifier_0: b(2300, 1, "Duplicate_identifier_0_2300", "Duplicate identifier '{0}'."), Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: b(2301, 1, "Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor_2301", "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor."), Static_members_cannot_reference_class_type_parameters: b(2302, 1, "Static_members_cannot_reference_class_type_parameters_2302", "Static members cannot reference class type parameters."), Circular_definition_of_import_alias_0: b(2303, 1, "Circular_definition_of_import_alias_0_2303", "Circular definition of import alias '{0}'."), Cannot_find_name_0: b(2304, 1, "Cannot_find_name_0_2304", "Cannot find name '{0}'."), Module_0_has_no_exported_member_1: b(2305, 1, "Module_0_has_no_exported_member_1_2305", "Module '{0}' has no exported member '{1}'."), File_0_is_not_a_module: b(2306, 1, "File_0_is_not_a_module_2306", "File '{0}' is not a module."), Cannot_find_module_0_or_its_corresponding_type_declarations: b(2307, 1, "Cannot_find_module_0_or_its_corresponding_type_declarations_2307", "Cannot find module '{0}' or its corresponding type declarations."), Module_0_has_already_exported_a_member_named_1_Consider_explicitly_re_exporting_to_resolve_the_ambiguity: b(2308, 1, "Module_0_has_already_exported_a_member_named_1_Consider_explicitly_re_exporting_to_resolve_the_ambig_2308", "Module {0} has already exported a member named '{1}'. Consider explicitly re-exporting to resolve the ambiguity."), An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements: b(2309, 1, "An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements_2309", "An export assignment cannot be used in a module with other exported elements."), Type_0_recursively_references_itself_as_a_base_type: b(2310, 1, "Type_0_recursively_references_itself_as_a_base_type_2310", "Type '{0}' recursively references itself as a base type."), Cannot_find_name_0_Did_you_mean_to_write_this_in_an_async_function: b(2311, 1, "Cannot_find_name_0_Did_you_mean_to_write_this_in_an_async_function_2311", "Cannot find name '{0}'. Did you mean to write this in an async function?"), An_interface_can_only_extend_an_object_type_or_intersection_of_object_types_with_statically_known_members: b(2312, 1, "An_interface_can_only_extend_an_object_type_or_intersection_of_object_types_with_statically_known_me_2312", "An interface can only extend an object type or intersection of object types with statically known members."), Type_parameter_0_has_a_circular_constraint: b(2313, 1, "Type_parameter_0_has_a_circular_constraint_2313", "Type parameter '{0}' has a circular constraint."), Generic_type_0_requires_1_type_argument_s: b(2314, 1, "Generic_type_0_requires_1_type_argument_s_2314", "Generic type '{0}' requires {1} type argument(s)."), Type_0_is_not_generic: b(2315, 1, "Type_0_is_not_generic_2315", "Type '{0}' is not generic."), Global_type_0_must_be_a_class_or_interface_type: b(2316, 1, "Global_type_0_must_be_a_class_or_interface_type_2316", "Global type '{0}' must be a class or interface type."), Global_type_0_must_have_1_type_parameter_s: b(2317, 1, "Global_type_0_must_have_1_type_parameter_s_2317", "Global type '{0}' must have {1} type parameter(s)."), Cannot_find_global_type_0: b(2318, 1, "Cannot_find_global_type_0_2318", "Cannot find global type '{0}'."), Named_property_0_of_types_1_and_2_are_not_identical: b(2319, 1, "Named_property_0_of_types_1_and_2_are_not_identical_2319", "Named property '{0}' of types '{1}' and '{2}' are not identical."), Interface_0_cannot_simultaneously_extend_types_1_and_2: b(2320, 1, "Interface_0_cannot_simultaneously_extend_types_1_and_2_2320", "Interface '{0}' cannot simultaneously extend types '{1}' and '{2}'."), Excessive_stack_depth_comparing_types_0_and_1: b(2321, 1, "Excessive_stack_depth_comparing_types_0_and_1_2321", "Excessive stack depth comparing types '{0}' and '{1}'."), Type_0_is_not_assignable_to_type_1: b(2322, 1, "Type_0_is_not_assignable_to_type_1_2322", "Type '{0}' is not assignable to type '{1}'."), Cannot_redeclare_exported_variable_0: b(2323, 1, "Cannot_redeclare_exported_variable_0_2323", "Cannot redeclare exported variable '{0}'."), Property_0_is_missing_in_type_1: b(2324, 1, "Property_0_is_missing_in_type_1_2324", "Property '{0}' is missing in type '{1}'."), Property_0_is_private_in_type_1_but_not_in_type_2: b(2325, 1, "Property_0_is_private_in_type_1_but_not_in_type_2_2325", "Property '{0}' is private in type '{1}' but not in type '{2}'."), Types_of_property_0_are_incompatible: b(2326, 1, "Types_of_property_0_are_incompatible_2326", "Types of property '{0}' are incompatible."), Property_0_is_optional_in_type_1_but_required_in_type_2: b(2327, 1, "Property_0_is_optional_in_type_1_but_required_in_type_2_2327", "Property '{0}' is optional in type '{1}' but required in type '{2}'."), Types_of_parameters_0_and_1_are_incompatible: b(2328, 1, "Types_of_parameters_0_and_1_are_incompatible_2328", "Types of parameters '{0}' and '{1}' are incompatible."), Index_signature_for_type_0_is_missing_in_type_1: b(2329, 1, "Index_signature_for_type_0_is_missing_in_type_1_2329", "Index signature for type '{0}' is missing in type '{1}'."), _0_and_1_index_signatures_are_incompatible: b(2330, 1, "_0_and_1_index_signatures_are_incompatible_2330", "'{0}' and '{1}' index signatures are incompatible."), this_cannot_be_referenced_in_a_module_or_namespace_body: b(2331, 1, "this_cannot_be_referenced_in_a_module_or_namespace_body_2331", "'this' cannot be referenced in a module or namespace body."), this_cannot_be_referenced_in_current_location: b(2332, 1, "this_cannot_be_referenced_in_current_location_2332", "'this' cannot be referenced in current location."), this_cannot_be_referenced_in_constructor_arguments: b(2333, 1, "this_cannot_be_referenced_in_constructor_arguments_2333", "'this' cannot be referenced in constructor arguments."), this_cannot_be_referenced_in_a_static_property_initializer: b(2334, 1, "this_cannot_be_referenced_in_a_static_property_initializer_2334", "'this' cannot be referenced in a static property initializer."), super_can_only_be_referenced_in_a_derived_class: b(2335, 1, "super_can_only_be_referenced_in_a_derived_class_2335", "'super' can only be referenced in a derived class."), super_cannot_be_referenced_in_constructor_arguments: b(2336, 1, "super_cannot_be_referenced_in_constructor_arguments_2336", "'super' cannot be referenced in constructor arguments."), Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors: b(2337, 1, "Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors_2337", "Super calls are not permitted outside constructors or in nested functions inside constructors."), super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class: b(2338, 1, "super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_der_2338", "'super' property access is permitted only in a constructor, member function, or member accessor of a derived class."), Property_0_does_not_exist_on_type_1: b(2339, 1, "Property_0_does_not_exist_on_type_1_2339", "Property '{0}' does not exist on type '{1}'."), Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword: b(2340, 1, "Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword_2340", "Only public and protected methods of the base class are accessible via the 'super' keyword."), Property_0_is_private_and_only_accessible_within_class_1: b(2341, 1, "Property_0_is_private_and_only_accessible_within_class_1_2341", "Property '{0}' is private and only accessible within class '{1}'."), This_syntax_requires_an_imported_helper_named_1_which_does_not_exist_in_0_Consider_upgrading_your_version_of_0: b(2343, 1, "This_syntax_requires_an_imported_helper_named_1_which_does_not_exist_in_0_Consider_upgrading_your_ve_2343", "This syntax requires an imported helper named '{1}' which does not exist in '{0}'. Consider upgrading your version of '{0}'."), Type_0_does_not_satisfy_the_constraint_1: b(2344, 1, "Type_0_does_not_satisfy_the_constraint_1_2344", "Type '{0}' does not satisfy the constraint '{1}'."), Argument_of_type_0_is_not_assignable_to_parameter_of_type_1: b(2345, 1, "Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_2345", "Argument of type '{0}' is not assignable to parameter of type '{1}'."), Call_target_does_not_contain_any_signatures: b(2346, 1, "Call_target_does_not_contain_any_signatures_2346", "Call target does not contain any signatures."), Untyped_function_calls_may_not_accept_type_arguments: b(2347, 1, "Untyped_function_calls_may_not_accept_type_arguments_2347", "Untyped function calls may not accept type arguments."), Value_of_type_0_is_not_callable_Did_you_mean_to_include_new: b(2348, 1, "Value_of_type_0_is_not_callable_Did_you_mean_to_include_new_2348", "Value of type '{0}' is not callable. Did you mean to include 'new'?"), This_expression_is_not_callable: b(2349, 1, "This_expression_is_not_callable_2349", "This expression is not callable."), Only_a_void_function_can_be_called_with_the_new_keyword: b(2350, 1, "Only_a_void_function_can_be_called_with_the_new_keyword_2350", "Only a void function can be called with the 'new' keyword."), This_expression_is_not_constructable: b(2351, 1, "This_expression_is_not_constructable_2351", "This expression is not constructable."), Conversion_of_type_0_to_type_1_may_be_a_mistake_because_neither_type_sufficiently_overlaps_with_the_other_If_this_was_intentional_convert_the_expression_to_unknown_first: b(2352, 1, "Conversion_of_type_0_to_type_1_may_be_a_mistake_because_neither_type_sufficiently_overlaps_with_the__2352", "Conversion of type '{0}' to type '{1}' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first."), Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1: b(2353, 1, "Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1_2353", "Object literal may only specify known properties, and '{0}' does not exist in type '{1}'."), This_syntax_requires_an_imported_helper_but_module_0_cannot_be_found: b(2354, 1, "This_syntax_requires_an_imported_helper_but_module_0_cannot_be_found_2354", "This syntax requires an imported helper but module '{0}' cannot be found."), A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value: b(2355, 1, "A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value_2355", "A function whose declared type is neither 'void' nor 'any' must return a value."), An_arithmetic_operand_must_be_of_type_any_number_bigint_or_an_enum_type: b(2356, 1, "An_arithmetic_operand_must_be_of_type_any_number_bigint_or_an_enum_type_2356", "An arithmetic operand must be of type 'any', 'number', 'bigint' or an enum type."), The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access: b(2357, 1, "The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access_2357", "The operand of an increment or decrement operator must be a variable or a property access."), The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter: b(2358, 1, "The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_paramete_2358", "The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter."), The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_Function_interface_type: b(2359, 1, "The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_F_2359", "The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type."), The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type: b(2362, 1, "The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type_2362", "The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type."), The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type: b(2363, 1, "The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type_2363", "The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type."), The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access: b(2364, 1, "The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access_2364", "The left-hand side of an assignment expression must be a variable or a property access."), Operator_0_cannot_be_applied_to_types_1_and_2: b(2365, 1, "Operator_0_cannot_be_applied_to_types_1_and_2_2365", "Operator '{0}' cannot be applied to types '{1}' and '{2}'."), Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined: b(2366, 1, "Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined_2366", "Function lacks ending return statement and return type does not include 'undefined'."), This_comparison_appears_to_be_unintentional_because_the_types_0_and_1_have_no_overlap: b(2367, 1, "This_comparison_appears_to_be_unintentional_because_the_types_0_and_1_have_no_overlap_2367", "This comparison appears to be unintentional because the types '{0}' and '{1}' have no overlap."), Type_parameter_name_cannot_be_0: b(2368, 1, "Type_parameter_name_cannot_be_0_2368", "Type parameter name cannot be '{0}'."), A_parameter_property_is_only_allowed_in_a_constructor_implementation: b(2369, 1, "A_parameter_property_is_only_allowed_in_a_constructor_implementation_2369", "A parameter property is only allowed in a constructor implementation."), A_rest_parameter_must_be_of_an_array_type: b(2370, 1, "A_rest_parameter_must_be_of_an_array_type_2370", "A rest parameter must be of an array type."), A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation: b(2371, 1, "A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation_2371", "A parameter initializer is only allowed in a function or constructor implementation."), Parameter_0_cannot_reference_itself: b(2372, 1, "Parameter_0_cannot_reference_itself_2372", "Parameter '{0}' cannot reference itself."), Parameter_0_cannot_reference_identifier_1_declared_after_it: b(2373, 1, "Parameter_0_cannot_reference_identifier_1_declared_after_it_2373", "Parameter '{0}' cannot reference identifier '{1}' declared after it."), Duplicate_index_signature_for_type_0: b(2374, 1, "Duplicate_index_signature_for_type_0_2374", "Duplicate index signature for type '{0}'."), Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties: b(2375, 1, "Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefi_2375", "Type '{0}' is not assignable to type '{1}' with 'exactOptionalPropertyTypes: true'. Consider adding 'undefined' to the types of the target's properties."), A_super_call_must_be_the_first_statement_in_the_constructor_to_refer_to_super_or_this_when_a_derived_class_contains_initialized_properties_parameter_properties_or_private_identifiers: b(2376, 1, "A_super_call_must_be_the_first_statement_in_the_constructor_to_refer_to_super_or_this_when_a_derived_2376", "A 'super' call must be the first statement in the constructor to refer to 'super' or 'this' when a derived class contains initialized properties, parameter properties, or private identifiers."), Constructors_for_derived_classes_must_contain_a_super_call: b(2377, 1, "Constructors_for_derived_classes_must_contain_a_super_call_2377", "Constructors for derived classes must contain a 'super' call."), A_get_accessor_must_return_a_value: b(2378, 1, "A_get_accessor_must_return_a_value_2378", "A 'get' accessor must return a value."), Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties: b(2379, 1, "Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_with_exactOptionalPropertyTypes_Colon_tr_2379", "Argument of type '{0}' is not assignable to parameter of type '{1}' with 'exactOptionalPropertyTypes: true'. Consider adding 'undefined' to the types of the target's properties."), The_return_type_of_a_get_accessor_must_be_assignable_to_its_set_accessor_type: b(2380, 1, "The_return_type_of_a_get_accessor_must_be_assignable_to_its_set_accessor_type_2380", "The return type of a 'get' accessor must be assignable to its 'set' accessor type"), Overload_signatures_must_all_be_exported_or_non_exported: b(2383, 1, "Overload_signatures_must_all_be_exported_or_non_exported_2383", "Overload signatures must all be exported or non-exported."), Overload_signatures_must_all_be_ambient_or_non_ambient: b(2384, 1, "Overload_signatures_must_all_be_ambient_or_non_ambient_2384", "Overload signatures must all be ambient or non-ambient."), Overload_signatures_must_all_be_public_private_or_protected: b(2385, 1, "Overload_signatures_must_all_be_public_private_or_protected_2385", "Overload signatures must all be public, private or protected."), Overload_signatures_must_all_be_optional_or_required: b(2386, 1, "Overload_signatures_must_all_be_optional_or_required_2386", "Overload signatures must all be optional or required."), Function_overload_must_be_static: b(2387, 1, "Function_overload_must_be_static_2387", "Function overload must be static."), Function_overload_must_not_be_static: b(2388, 1, "Function_overload_must_not_be_static_2388", "Function overload must not be static."), Function_implementation_name_must_be_0: b(2389, 1, "Function_implementation_name_must_be_0_2389", "Function implementation name must be '{0}'."), Constructor_implementation_is_missing: b(2390, 1, "Constructor_implementation_is_missing_2390", "Constructor implementation is missing."), Function_implementation_is_missing_or_not_immediately_following_the_declaration: b(2391, 1, "Function_implementation_is_missing_or_not_immediately_following_the_declaration_2391", "Function implementation is missing or not immediately following the declaration."), Multiple_constructor_implementations_are_not_allowed: b(2392, 1, "Multiple_constructor_implementations_are_not_allowed_2392", "Multiple constructor implementations are not allowed."), Duplicate_function_implementation: b(2393, 1, "Duplicate_function_implementation_2393", "Duplicate function implementation."), This_overload_signature_is_not_compatible_with_its_implementation_signature: b(2394, 1, "This_overload_signature_is_not_compatible_with_its_implementation_signature_2394", "This overload signature is not compatible with its implementation signature."), Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local: b(2395, 1, "Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local_2395", "Individual declarations in merged declaration '{0}' must be all exported or all local."), Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters: b(2396, 1, "Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters_2396", "Duplicate identifier 'arguments'. Compiler uses 'arguments' to initialize rest parameters."), Declaration_name_conflicts_with_built_in_global_identifier_0: b(2397, 1, "Declaration_name_conflicts_with_built_in_global_identifier_0_2397", "Declaration name conflicts with built-in global identifier '{0}'."), constructor_cannot_be_used_as_a_parameter_property_name: b(2398, 1, "constructor_cannot_be_used_as_a_parameter_property_name_2398", "'constructor' cannot be used as a parameter property name."), Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference: b(2399, 1, "Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference_2399", "Duplicate identifier '_this'. Compiler uses variable declaration '_this' to capture 'this' reference."), Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference: b(2400, 1, "Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference_2400", "Expression resolves to variable declaration '_this' that compiler uses to capture 'this' reference."), A_super_call_must_be_a_root_level_statement_within_a_constructor_of_a_derived_class_that_contains_initialized_properties_parameter_properties_or_private_identifiers: b(2401, 1, "A_super_call_must_be_a_root_level_statement_within_a_constructor_of_a_derived_class_that_contains_in_2401", "A 'super' call must be a root-level statement within a constructor of a derived class that contains initialized properties, parameter properties, or private identifiers."), Expression_resolves_to_super_that_compiler_uses_to_capture_base_class_reference: b(2402, 1, "Expression_resolves_to_super_that_compiler_uses_to_capture_base_class_reference_2402", "Expression resolves to '_super' that compiler uses to capture base class reference."), Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_type_2: b(2403, 1, "Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_t_2403", "Subsequent variable declarations must have the same type.  Variable '{0}' must be of type '{1}', but here has type '{2}'."), The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation: b(2404, 1, "The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation_2404", "The left-hand side of a 'for...in' statement cannot use a type annotation."), The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any: b(2405, 1, "The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any_2405", "The left-hand side of a 'for...in' statement must be of type 'string' or 'any'."), The_left_hand_side_of_a_for_in_statement_must_be_a_variable_or_a_property_access: b(2406, 1, "The_left_hand_side_of_a_for_in_statement_must_be_a_variable_or_a_property_access_2406", "The left-hand side of a 'for...in' statement must be a variable or a property access."), The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter_but_here_has_type_0: b(2407, 1, "The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter_but_2407", "The right-hand side of a 'for...in' statement must be of type 'any', an object type or a type parameter, but here has type '{0}'."), Setters_cannot_return_a_value: b(2408, 1, "Setters_cannot_return_a_value_2408", "Setters cannot return a value."), Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class: b(2409, 1, "Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class_2409", "Return type of constructor signature must be assignable to the instance type of the class."), The_with_statement_is_not_supported_All_symbols_in_a_with_block_will_have_type_any: b(2410, 1, "The_with_statement_is_not_supported_All_symbols_in_a_with_block_will_have_type_any_2410", "The 'with' statement is not supported. All symbols in a 'with' block will have type 'any'."), Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_type_of_the_target: b(2412, 1, "Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefi_2412", "Type '{0}' is not assignable to type '{1}' with 'exactOptionalPropertyTypes: true'. Consider adding 'undefined' to the type of the target."), Property_0_of_type_1_is_not_assignable_to_2_index_type_3: b(2411, 1, "Property_0_of_type_1_is_not_assignable_to_2_index_type_3_2411", "Property '{0}' of type '{1}' is not assignable to '{2}' index type '{3}'."), _0_index_type_1_is_not_assignable_to_2_index_type_3: b(2413, 1, "_0_index_type_1_is_not_assignable_to_2_index_type_3_2413", "'{0}' index type '{1}' is not assignable to '{2}' index type '{3}'."), Class_name_cannot_be_0: b(2414, 1, "Class_name_cannot_be_0_2414", "Class name cannot be '{0}'."), Class_0_incorrectly_extends_base_class_1: b(2415, 1, "Class_0_incorrectly_extends_base_class_1_2415", "Class '{0}' incorrectly extends base class '{1}'."), Property_0_in_type_1_is_not_assignable_to_the_same_property_in_base_type_2: b(2416, 1, "Property_0_in_type_1_is_not_assignable_to_the_same_property_in_base_type_2_2416", "Property '{0}' in type '{1}' is not assignable to the same property in base type '{2}'."), Class_static_side_0_incorrectly_extends_base_class_static_side_1: b(2417, 1, "Class_static_side_0_incorrectly_extends_base_class_static_side_1_2417", "Class static side '{0}' incorrectly extends base class static side '{1}'."), Type_of_computed_property_s_value_is_0_which_is_not_assignable_to_type_1: b(2418, 1, "Type_of_computed_property_s_value_is_0_which_is_not_assignable_to_type_1_2418", "Type of computed property's value is '{0}', which is not assignable to type '{1}'."), Types_of_construct_signatures_are_incompatible: b(2419, 1, "Types_of_construct_signatures_are_incompatible_2419", "Types of construct signatures are incompatible."), Class_0_incorrectly_implements_interface_1: b(2420, 1, "Class_0_incorrectly_implements_interface_1_2420", "Class '{0}' incorrectly implements interface '{1}'."), A_class_can_only_implement_an_object_type_or_intersection_of_object_types_with_statically_known_members: b(2422, 1, "A_class_can_only_implement_an_object_type_or_intersection_of_object_types_with_statically_known_memb_2422", "A class can only implement an object type or intersection of object types with statically known members."), Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_accessor: b(2423, 1, "Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_access_2423", "Class '{0}' defines instance member function '{1}', but extended class '{2}' defines it as instance member accessor."), Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_function: b(2425, 1, "Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_functi_2425", "Class '{0}' defines instance member property '{1}', but extended class '{2}' defines it as instance member function."), Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function: b(2426, 1, "Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_functi_2426", "Class '{0}' defines instance member accessor '{1}', but extended class '{2}' defines it as instance member function."), Interface_name_cannot_be_0: b(2427, 1, "Interface_name_cannot_be_0_2427", "Interface name cannot be '{0}'."), All_declarations_of_0_must_have_identical_type_parameters: b(2428, 1, "All_declarations_of_0_must_have_identical_type_parameters_2428", "All declarations of '{0}' must have identical type parameters."), Interface_0_incorrectly_extends_interface_1: b(2430, 1, "Interface_0_incorrectly_extends_interface_1_2430", "Interface '{0}' incorrectly extends interface '{1}'."), Enum_name_cannot_be_0: b(2431, 1, "Enum_name_cannot_be_0_2431", "Enum name cannot be '{0}'."), In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enum_element: b(2432, 1, "In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enu_2432", "In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element."), A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merged: b(2433, 1, "A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merg_2433", "A namespace declaration cannot be in a different file from a class or function with which it is merged."), A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged: b(2434, 1, "A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged_2434", "A namespace declaration cannot be located prior to a class or function with which it is merged."), Ambient_modules_cannot_be_nested_in_other_modules_or_namespaces: b(2435, 1, "Ambient_modules_cannot_be_nested_in_other_modules_or_namespaces_2435", "Ambient modules cannot be nested in other modules or namespaces."), Ambient_module_declaration_cannot_specify_relative_module_name: b(2436, 1, "Ambient_module_declaration_cannot_specify_relative_module_name_2436", "Ambient module declaration cannot specify relative module name."), Module_0_is_hidden_by_a_local_declaration_with_the_same_name: b(2437, 1, "Module_0_is_hidden_by_a_local_declaration_with_the_same_name_2437", "Module '{0}' is hidden by a local declaration with the same name."), Import_name_cannot_be_0: b(2438, 1, "Import_name_cannot_be_0_2438", "Import name cannot be '{0}'."), Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relative_module_name: b(2439, 1, "Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relati_2439", "Import or export declaration in an ambient module declaration cannot reference module through relative module name."), Import_declaration_conflicts_with_local_declaration_of_0: b(2440, 1, "Import_declaration_conflicts_with_local_declaration_of_0_2440", "Import declaration conflicts with local declaration of '{0}'."), Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module: b(2441, 1, "Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module_2441", "Duplicate identifier '{0}'. Compiler reserves name '{1}' in top level scope of a module."), Types_have_separate_declarations_of_a_private_property_0: b(2442, 1, "Types_have_separate_declarations_of_a_private_property_0_2442", "Types have separate declarations of a private property '{0}'."), Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2: b(2443, 1, "Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2_2443", "Property '{0}' is protected but type '{1}' is not a class derived from '{2}'."), Property_0_is_protected_in_type_1_but_public_in_type_2: b(2444, 1, "Property_0_is_protected_in_type_1_but_public_in_type_2_2444", "Property '{0}' is protected in type '{1}' but public in type '{2}'."), Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses: b(2445, 1, "Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses_2445", "Property '{0}' is protected and only accessible within class '{1}' and its subclasses."), Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1_This_is_an_instance_of_class_2: b(2446, 1, "Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1_This_is_an_instance_of_cl_2446", "Property '{0}' is protected and only accessible through an instance of class '{1}'. This is an instance of class '{2}'."), The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead: b(2447, 1, "The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead_2447", "The '{0}' operator is not allowed for boolean types. Consider using '{1}' instead."), Block_scoped_variable_0_used_before_its_declaration: b(2448, 1, "Block_scoped_variable_0_used_before_its_declaration_2448", "Block-scoped variable '{0}' used before its declaration."), Class_0_used_before_its_declaration: b(2449, 1, "Class_0_used_before_its_declaration_2449", "Class '{0}' used before its declaration."), Enum_0_used_before_its_declaration: b(2450, 1, "Enum_0_used_before_its_declaration_2450", "Enum '{0}' used before its declaration."), Cannot_redeclare_block_scoped_variable_0: b(2451, 1, "Cannot_redeclare_block_scoped_variable_0_2451", "Cannot redeclare block-scoped variable '{0}'."), An_enum_member_cannot_have_a_numeric_name: b(2452, 1, "An_enum_member_cannot_have_a_numeric_name_2452", "An enum member cannot have a numeric name."), Variable_0_is_used_before_being_assigned: b(2454, 1, "Variable_0_is_used_before_being_assigned_2454", "Variable '{0}' is used before being assigned."), Type_alias_0_circularly_references_itself: b(2456, 1, "Type_alias_0_circularly_references_itself_2456", "Type alias '{0}' circularly references itself."), Type_alias_name_cannot_be_0: b(2457, 1, "Type_alias_name_cannot_be_0_2457", "Type alias name cannot be '{0}'."), An_AMD_module_cannot_have_multiple_name_assignments: b(2458, 1, "An_AMD_module_cannot_have_multiple_name_assignments_2458", "An AMD module cannot have multiple name assignments."), Module_0_declares_1_locally_but_it_is_not_exported: b(2459, 1, "Module_0_declares_1_locally_but_it_is_not_exported_2459", "Module '{0}' declares '{1}' locally, but it is not exported."), Module_0_declares_1_locally_but_it_is_exported_as_2: b(2460, 1, "Module_0_declares_1_locally_but_it_is_exported_as_2_2460", "Module '{0}' declares '{1}' locally, but it is exported as '{2}'."), Type_0_is_not_an_array_type: b(2461, 1, "Type_0_is_not_an_array_type_2461", "Type '{0}' is not an array type."), A_rest_element_must_be_last_in_a_destructuring_pattern: b(2462, 1, "A_rest_element_must_be_last_in_a_destructuring_pattern_2462", "A rest element must be last in a destructuring pattern."), A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature: b(2463, 1, "A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature_2463", "A binding pattern parameter cannot be optional in an implementation signature."), A_computed_property_name_must_be_of_type_string_number_symbol_or_any: b(2464, 1, "A_computed_property_name_must_be_of_type_string_number_symbol_or_any_2464", "A computed property name must be of type 'string', 'number', 'symbol', or 'any'."), this_cannot_be_referenced_in_a_computed_property_name: b(2465, 1, "this_cannot_be_referenced_in_a_computed_property_name_2465", "'this' cannot be referenced in a computed property name."), super_cannot_be_referenced_in_a_computed_property_name: b(2466, 1, "super_cannot_be_referenced_in_a_computed_property_name_2466", "'super' cannot be referenced in a computed property name."), A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type: b(2467, 1, "A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type_2467", "A computed property name cannot reference a type parameter from its containing type."), Cannot_find_global_value_0: b(2468, 1, "Cannot_find_global_value_0_2468", "Cannot find global value '{0}'."), The_0_operator_cannot_be_applied_to_type_symbol: b(2469, 1, "The_0_operator_cannot_be_applied_to_type_symbol_2469", "The '{0}' operator cannot be applied to type 'symbol'."), Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_5_and_higher: b(2472, 1, "Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_5_and_higher_2472", "Spread operator in 'new' expressions is only available when targeting ECMAScript 5 and higher."), Enum_declarations_must_all_be_const_or_non_const: b(2473, 1, "Enum_declarations_must_all_be_const_or_non_const_2473", "Enum declarations must all be const or non-const."), const_enum_member_initializers_must_be_constant_expressions: b(2474, 1, "const_enum_member_initializers_must_be_constant_expressions_2474", "const enum member initializers must be constant expressions."), const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_import_declaration_or_export_assignment_or_type_query: b(2475, 1, "const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_im_2475", "'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment or type query."), A_const_enum_member_can_only_be_accessed_using_a_string_literal: b(2476, 1, "A_const_enum_member_can_only_be_accessed_using_a_string_literal_2476", "A const enum member can only be accessed using a string literal."), const_enum_member_initializer_was_evaluated_to_a_non_finite_value: b(2477, 1, "const_enum_member_initializer_was_evaluated_to_a_non_finite_value_2477", "'const' enum member initializer was evaluated to a non-finite value."), const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN: b(2478, 1, "const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN_2478", "'const' enum member initializer was evaluated to disallowed value 'NaN'."), let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations: b(2480, 1, "let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations_2480", "'let' is not allowed to be used as a name in 'let' or 'const' declarations."), Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1: b(2481, 1, "Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1_2481", "Cannot initialize outer scoped variable '{0}' in the same scope as block scoped declaration '{1}'."), The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation: b(2483, 1, "The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation_2483", "The left-hand side of a 'for...of' statement cannot use a type annotation."), Export_declaration_conflicts_with_exported_declaration_of_0: b(2484, 1, "Export_declaration_conflicts_with_exported_declaration_of_0_2484", "Export declaration conflicts with exported declaration of '{0}'."), The_left_hand_side_of_a_for_of_statement_must_be_a_variable_or_a_property_access: b(2487, 1, "The_left_hand_side_of_a_for_of_statement_must_be_a_variable_or_a_property_access_2487", "The left-hand side of a 'for...of' statement must be a variable or a property access."), Type_0_must_have_a_Symbol_iterator_method_that_returns_an_iterator: b(2488, 1, "Type_0_must_have_a_Symbol_iterator_method_that_returns_an_iterator_2488", "Type '{0}' must have a '[Symbol.iterator]()' method that returns an iterator."), An_iterator_must_have_a_next_method: b(2489, 1, "An_iterator_must_have_a_next_method_2489", "An iterator must have a 'next()' method."), The_type_returned_by_the_0_method_of_an_iterator_must_have_a_value_property: b(2490, 1, "The_type_returned_by_the_0_method_of_an_iterator_must_have_a_value_property_2490", "The type returned by the '{0}()' method of an iterator must have a 'value' property."), The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern: b(2491, 1, "The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern_2491", "The left-hand side of a 'for...in' statement cannot be a destructuring pattern."), Cannot_redeclare_identifier_0_in_catch_clause: b(2492, 1, "Cannot_redeclare_identifier_0_in_catch_clause_2492", "Cannot redeclare identifier '{0}' in catch clause."), Tuple_type_0_of_length_1_has_no_element_at_index_2: b(2493, 1, "Tuple_type_0_of_length_1_has_no_element_at_index_2_2493", "Tuple type '{0}' of length '{1}' has no element at index '{2}'."), Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher: b(2494, 1, "Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher_2494", "Using a string in a 'for...of' statement is only supported in ECMAScript 5 and higher."), Type_0_is_not_an_array_type_or_a_string_type: b(2495, 1, "Type_0_is_not_an_array_type_or_a_string_type_2495", "Type '{0}' is not an array type or a string type."), The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_standard_function_expression: b(2496, 1, "The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_stand_2496", "The 'arguments' object cannot be referenced in an arrow function in ES3 and ES5. Consider using a standard function expression."), This_module_can_only_be_referenced_with_ECMAScript_imports_Slashexports_by_turning_on_the_0_flag_and_referencing_its_default_export: b(2497, 1, "This_module_can_only_be_referenced_with_ECMAScript_imports_Slashexports_by_turning_on_the_0_flag_and_2497", "This module can only be referenced with ECMAScript imports/exports by turning on the '{0}' flag and referencing its default export."), Module_0_uses_export_and_cannot_be_used_with_export_Asterisk: b(2498, 1, "Module_0_uses_export_and_cannot_be_used_with_export_Asterisk_2498", "Module '{0}' uses 'export =' and cannot be used with 'export *'."), An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments: b(2499, 1, "An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments_2499", "An interface can only extend an identifier/qualified-name with optional type arguments."), A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments: b(2500, 1, "A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments_2500", "A class can only implement an identifier/qualified-name with optional type arguments."), A_rest_element_cannot_contain_a_binding_pattern: b(2501, 1, "A_rest_element_cannot_contain_a_binding_pattern_2501", "A rest element cannot contain a binding pattern."), _0_is_referenced_directly_or_indirectly_in_its_own_type_annotation: b(2502, 1, "_0_is_referenced_directly_or_indirectly_in_its_own_type_annotation_2502", "'{0}' is referenced directly or indirectly in its own type annotation."), Cannot_find_namespace_0: b(2503, 1, "Cannot_find_namespace_0_2503", "Cannot find namespace '{0}'."), Type_0_must_have_a_Symbol_asyncIterator_method_that_returns_an_async_iterator: b(2504, 1, "Type_0_must_have_a_Symbol_asyncIterator_method_that_returns_an_async_iterator_2504", "Type '{0}' must have a '[Symbol.asyncIterator]()' method that returns an async iterator."), A_generator_cannot_have_a_void_type_annotation: b(2505, 1, "A_generator_cannot_have_a_void_type_annotation_2505", "A generator cannot have a 'void' type annotation."), _0_is_referenced_directly_or_indirectly_in_its_own_base_expression: b(2506, 1, "_0_is_referenced_directly_or_indirectly_in_its_own_base_expression_2506", "'{0}' is referenced directly or indirectly in its own base expression."), Type_0_is_not_a_constructor_function_type: b(2507, 1, "Type_0_is_not_a_constructor_function_type_2507", "Type '{0}' is not a constructor function type."), No_base_constructor_has_the_specified_number_of_type_arguments: b(2508, 1, "No_base_constructor_has_the_specified_number_of_type_arguments_2508", "No base constructor has the specified number of type arguments."), Base_constructor_return_type_0_is_not_an_object_type_or_intersection_of_object_types_with_statically_known_members: b(2509, 1, "Base_constructor_return_type_0_is_not_an_object_type_or_intersection_of_object_types_with_statically_2509", "Base constructor return type '{0}' is not an object type or intersection of object types with statically known members."), Base_constructors_must_all_have_the_same_return_type: b(2510, 1, "Base_constructors_must_all_have_the_same_return_type_2510", "Base constructors must all have the same return type."), Cannot_create_an_instance_of_an_abstract_class: b(2511, 1, "Cannot_create_an_instance_of_an_abstract_class_2511", "Cannot create an instance of an abstract class."), Overload_signatures_must_all_be_abstract_or_non_abstract: b(2512, 1, "Overload_signatures_must_all_be_abstract_or_non_abstract_2512", "Overload signatures must all be abstract or non-abstract."), Abstract_method_0_in_class_1_cannot_be_accessed_via_super_expression: b(2513, 1, "Abstract_method_0_in_class_1_cannot_be_accessed_via_super_expression_2513", "Abstract method '{0}' in class '{1}' cannot be accessed via super expression."), A_tuple_type_cannot_be_indexed_with_a_negative_value: b(2514, 1, "A_tuple_type_cannot_be_indexed_with_a_negative_value_2514", "A tuple type cannot be indexed with a negative value."), Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2: b(2515, 1, "Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2_2515", "Non-abstract class '{0}' does not implement inherited abstract member '{1}' from class '{2}'."), All_declarations_of_an_abstract_method_must_be_consecutive: b(2516, 1, "All_declarations_of_an_abstract_method_must_be_consecutive_2516", "All declarations of an abstract method must be consecutive."), Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type: b(2517, 1, "Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type_2517", "Cannot assign an abstract constructor type to a non-abstract constructor type."), A_this_based_type_guard_is_not_compatible_with_a_parameter_based_type_guard: b(2518, 1, "A_this_based_type_guard_is_not_compatible_with_a_parameter_based_type_guard_2518", "A 'this'-based type guard is not compatible with a parameter-based type guard."), An_async_iterator_must_have_a_next_method: b(2519, 1, "An_async_iterator_must_have_a_next_method_2519", "An async iterator must have a 'next()' method."), Duplicate_identifier_0_Compiler_uses_declaration_1_to_support_async_functions: b(2520, 1, "Duplicate_identifier_0_Compiler_uses_declaration_1_to_support_async_functions_2520", "Duplicate identifier '{0}'. Compiler uses declaration '{1}' to support async functions."), The_arguments_object_cannot_be_referenced_in_an_async_function_or_method_in_ES3_and_ES5_Consider_using_a_standard_function_or_method: b(2522, 1, "The_arguments_object_cannot_be_referenced_in_an_async_function_or_method_in_ES3_and_ES5_Consider_usi_2522", "The 'arguments' object cannot be referenced in an async function or method in ES3 and ES5. Consider using a standard function or method."), yield_expressions_cannot_be_used_in_a_parameter_initializer: b(2523, 1, "yield_expressions_cannot_be_used_in_a_parameter_initializer_2523", "'yield' expressions cannot be used in a parameter initializer."), await_expressions_cannot_be_used_in_a_parameter_initializer: b(2524, 1, "await_expressions_cannot_be_used_in_a_parameter_initializer_2524", "'await' expressions cannot be used in a parameter initializer."), Initializer_provides_no_value_for_this_binding_element_and_the_binding_element_has_no_default_value: b(2525, 1, "Initializer_provides_no_value_for_this_binding_element_and_the_binding_element_has_no_default_value_2525", "Initializer provides no value for this binding element and the binding element has no default value."), A_this_type_is_available_only_in_a_non_static_member_of_a_class_or_interface: b(2526, 1, "A_this_type_is_available_only_in_a_non_static_member_of_a_class_or_interface_2526", "A 'this' type is available only in a non-static member of a class or interface."), The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary: b(2527, 1, "The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary_2527", "The inferred type of '{0}' references an inaccessible '{1}' type. A type annotation is necessary."), A_module_cannot_have_multiple_default_exports: b(2528, 1, "A_module_cannot_have_multiple_default_exports_2528", "A module cannot have multiple default exports."), Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module_containing_async_functions: b(2529, 1, "Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module_containing_async_func_2529", "Duplicate identifier '{0}'. Compiler reserves name '{1}' in top level scope of a module containing async functions."), Property_0_is_incompatible_with_index_signature: b(2530, 1, "Property_0_is_incompatible_with_index_signature_2530", "Property '{0}' is incompatible with index signature."), Object_is_possibly_null: b(2531, 1, "Object_is_possibly_null_2531", "Object is possibly 'null'."), Object_is_possibly_undefined: b(2532, 1, "Object_is_possibly_undefined_2532", "Object is possibly 'undefined'."), Object_is_possibly_null_or_undefined: b(2533, 1, "Object_is_possibly_null_or_undefined_2533", "Object is possibly 'null' or 'undefined'."), A_function_returning_never_cannot_have_a_reachable_end_point: b(2534, 1, "A_function_returning_never_cannot_have_a_reachable_end_point_2534", "A function returning 'never' cannot have a reachable end point."), Type_0_cannot_be_used_to_index_type_1: b(2536, 1, "Type_0_cannot_be_used_to_index_type_1_2536", "Type '{0}' cannot be used to index type '{1}'."), Type_0_has_no_matching_index_signature_for_type_1: b(2537, 1, "Type_0_has_no_matching_index_signature_for_type_1_2537", "Type '{0}' has no matching index signature for type '{1}'."), Type_0_cannot_be_used_as_an_index_type: b(2538, 1, "Type_0_cannot_be_used_as_an_index_type_2538", "Type '{0}' cannot be used as an index type."), Cannot_assign_to_0_because_it_is_not_a_variable: b(2539, 1, "Cannot_assign_to_0_because_it_is_not_a_variable_2539", "Cannot assign to '{0}' because it is not a variable."), Cannot_assign_to_0_because_it_is_a_read_only_property: b(2540, 1, "Cannot_assign_to_0_because_it_is_a_read_only_property_2540", "Cannot assign to '{0}' because it is a read-only property."), Index_signature_in_type_0_only_permits_reading: b(2542, 1, "Index_signature_in_type_0_only_permits_reading_2542", "Index signature in type '{0}' only permits reading."), Duplicate_identifier_newTarget_Compiler_uses_variable_declaration_newTarget_to_capture_new_target_meta_property_reference: b(2543, 1, "Duplicate_identifier_newTarget_Compiler_uses_variable_declaration_newTarget_to_capture_new_target_me_2543", "Duplicate identifier '_newTarget'. Compiler uses variable declaration '_newTarget' to capture 'new.target' meta-property reference."), Expression_resolves_to_variable_declaration_newTarget_that_compiler_uses_to_capture_new_target_meta_property_reference: b(2544, 1, "Expression_resolves_to_variable_declaration_newTarget_that_compiler_uses_to_capture_new_target_meta__2544", "Expression resolves to variable declaration '_newTarget' that compiler uses to capture 'new.target' meta-property reference."), A_mixin_class_must_have_a_constructor_with_a_single_rest_parameter_of_type_any: b(2545, 1, "A_mixin_class_must_have_a_constructor_with_a_single_rest_parameter_of_type_any_2545", "A mixin class must have a constructor with a single rest parameter of type 'any[]'."), The_type_returned_by_the_0_method_of_an_async_iterator_must_be_a_promise_for_a_type_with_a_value_property: b(2547, 1, "The_type_returned_by_the_0_method_of_an_async_iterator_must_be_a_promise_for_a_type_with_a_value_pro_2547", "The type returned by the '{0}()' method of an async iterator must be a promise for a type with a 'value' property."), Type_0_is_not_an_array_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator: b(2548, 1, "Type_0_is_not_an_array_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator_2548", "Type '{0}' is not an array type or does not have a '[Symbol.iterator]()' method that returns an iterator."), Type_0_is_not_an_array_type_or_a_string_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator: b(2549, 1, "Type_0_is_not_an_array_type_or_a_string_type_or_does_not_have_a_Symbol_iterator_method_that_returns__2549", "Type '{0}' is not an array type or a string type or does not have a '[Symbol.iterator]()' method that returns an iterator."), Property_0_does_not_exist_on_type_1_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_2_or_later: b(2550, 1, "Property_0_does_not_exist_on_type_1_Do_you_need_to_change_your_target_library_Try_changing_the_lib_c_2550", "Property '{0}' does not exist on type '{1}'. Do you need to change your target library? Try changing the 'lib' compiler option to '{2}' or later."), Property_0_does_not_exist_on_type_1_Did_you_mean_2: b(2551, 1, "Property_0_does_not_exist_on_type_1_Did_you_mean_2_2551", "Property '{0}' does not exist on type '{1}'. Did you mean '{2}'?"), Cannot_find_name_0_Did_you_mean_1: b(2552, 1, "Cannot_find_name_0_Did_you_mean_1_2552", "Cannot find name '{0}'. Did you mean '{1}'?"), Computed_values_are_not_permitted_in_an_enum_with_string_valued_members: b(2553, 1, "Computed_values_are_not_permitted_in_an_enum_with_string_valued_members_2553", "Computed values are not permitted in an enum with string valued members."), Expected_0_arguments_but_got_1: b(2554, 1, "Expected_0_arguments_but_got_1_2554", "Expected {0} arguments, but got {1}."), Expected_at_least_0_arguments_but_got_1: b(2555, 1, "Expected_at_least_0_arguments_but_got_1_2555", "Expected at least {0} arguments, but got {1}."), A_spread_argument_must_either_have_a_tuple_type_or_be_passed_to_a_rest_parameter: b(2556, 1, "A_spread_argument_must_either_have_a_tuple_type_or_be_passed_to_a_rest_parameter_2556", "A spread argument must either have a tuple type or be passed to a rest parameter."), Expected_0_type_arguments_but_got_1: b(2558, 1, "Expected_0_type_arguments_but_got_1_2558", "Expected {0} type arguments, but got {1}."), Type_0_has_no_properties_in_common_with_type_1: b(2559, 1, "Type_0_has_no_properties_in_common_with_type_1_2559", "Type '{0}' has no properties in common with type '{1}'."), Value_of_type_0_has_no_properties_in_common_with_type_1_Did_you_mean_to_call_it: b(2560, 1, "Value_of_type_0_has_no_properties_in_common_with_type_1_Did_you_mean_to_call_it_2560", "Value of type '{0}' has no properties in common with type '{1}'. Did you mean to call it?"), Object_literal_may_only_specify_known_properties_but_0_does_not_exist_in_type_1_Did_you_mean_to_write_2: b(2561, 1, "Object_literal_may_only_specify_known_properties_but_0_does_not_exist_in_type_1_Did_you_mean_to_writ_2561", "Object literal may only specify known properties, but '{0}' does not exist in type '{1}'. Did you mean to write '{2}'?"), Base_class_expressions_cannot_reference_class_type_parameters: b(2562, 1, "Base_class_expressions_cannot_reference_class_type_parameters_2562", "Base class expressions cannot reference class type parameters."), The_containing_function_or_module_body_is_too_large_for_control_flow_analysis: b(2563, 1, "The_containing_function_or_module_body_is_too_large_for_control_flow_analysis_2563", "The containing function or module body is too large for control flow analysis."), Property_0_has_no_initializer_and_is_not_definitely_assigned_in_the_constructor: b(2564, 1, "Property_0_has_no_initializer_and_is_not_definitely_assigned_in_the_constructor_2564", "Property '{0}' has no initializer and is not definitely assigned in the constructor."), Property_0_is_used_before_being_assigned: b(2565, 1, "Property_0_is_used_before_being_assigned_2565", "Property '{0}' is used before being assigned."), A_rest_element_cannot_have_a_property_name: b(2566, 1, "A_rest_element_cannot_have_a_property_name_2566", "A rest element cannot have a property name."), Enum_declarations_can_only_merge_with_namespace_or_other_enum_declarations: b(2567, 1, "Enum_declarations_can_only_merge_with_namespace_or_other_enum_declarations_2567", "Enum declarations can only merge with namespace or other enum declarations."), Property_0_may_not_exist_on_type_1_Did_you_mean_2: b(2568, 1, "Property_0_may_not_exist_on_type_1_Did_you_mean_2_2568", "Property '{0}' may not exist on type '{1}'. Did you mean '{2}'?"), Could_not_find_name_0_Did_you_mean_1: b(2570, 1, "Could_not_find_name_0_Did_you_mean_1_2570", "Could not find name '{0}'. Did you mean '{1}'?"), Object_is_of_type_unknown: b(2571, 1, "Object_is_of_type_unknown_2571", "Object is of type 'unknown'."), A_rest_element_type_must_be_an_array_type: b(2574, 1, "A_rest_element_type_must_be_an_array_type_2574", "A rest element type must be an array type."), No_overload_expects_0_arguments_but_overloads_do_exist_that_expect_either_1_or_2_arguments: b(2575, 1, "No_overload_expects_0_arguments_but_overloads_do_exist_that_expect_either_1_or_2_arguments_2575", "No overload expects {0} arguments, but overloads do exist that expect either {1} or {2} arguments."), Property_0_does_not_exist_on_type_1_Did_you_mean_to_access_the_static_member_2_instead: b(2576, 1, "Property_0_does_not_exist_on_type_1_Did_you_mean_to_access_the_static_member_2_instead_2576", "Property '{0}' does not exist on type '{1}'. Did you mean to access the static member '{2}' instead?"), Return_type_annotation_circularly_references_itself: b(2577, 1, "Return_type_annotation_circularly_references_itself_2577", "Return type annotation circularly references itself."), Unused_ts_expect_error_directive: b(2578, 1, "Unused_ts_expect_error_directive_2578", "Unused '@ts-expect-error' directive."), Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode: b(2580, 1, "Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashno_2580", "Cannot find name '{0}'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node`."), Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slashjquery: b(2581, 1, "Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slash_2581", "Cannot find name '{0}'. Do you need to install type definitions for jQuery? Try `npm i --save-dev @types/jquery`."), Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_types_Slashjest_or_npm_i_save_dev_types_Slashmocha: b(2582, 1, "Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_type_2582", "Cannot find name '{0}'. Do you need to install type definitions for a test runner? Try `npm i --save-dev @types/jest` or `npm i --save-dev @types/mocha`."), Cannot_find_name_0_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_1_or_later: b(2583, 1, "Cannot_find_name_0_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_2583", "Cannot find name '{0}'. Do you need to change your target library? Try changing the 'lib' compiler option to '{1}' or later."), Cannot_find_name_0_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_include_dom: b(2584, 1, "Cannot_find_name_0_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_2584", "Cannot find name '{0}'. Do you need to change your target library? Try changing the 'lib' compiler option to include 'dom'."), _0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_es2015_or_later: b(2585, 1, "_0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Do_you_need_to_change_your_target_library_2585", "'{0}' only refers to a type, but is being used as a value here. Do you need to change your target library? Try changing the 'lib' compiler option to es2015 or later."), Cannot_assign_to_0_because_it_is_a_constant: b(2588, 1, "Cannot_assign_to_0_because_it_is_a_constant_2588", "Cannot assign to '{0}' because it is a constant."), Type_instantiation_is_excessively_deep_and_possibly_infinite: b(2589, 1, "Type_instantiation_is_excessively_deep_and_possibly_infinite_2589", "Type instantiation is excessively deep and possibly infinite."), Expression_produces_a_union_type_that_is_too_complex_to_represent: b(2590, 1, "Expression_produces_a_union_type_that_is_too_complex_to_represent_2590", "Expression produces a union type that is too complex to represent."), Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode_and_then_add_node_to_the_types_field_in_your_tsconfig: b(2591, 1, "Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashno_2591", "Cannot find name '{0}'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node` and then add 'node' to the types field in your tsconfig."), Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slashjquery_and_then_add_jquery_to_the_types_field_in_your_tsconfig: b(2592, 1, "Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slash_2592", "Cannot find name '{0}'. Do you need to install type definitions for jQuery? Try `npm i --save-dev @types/jquery` and then add 'jquery' to the types field in your tsconfig."), Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_types_Slashjest_or_npm_i_save_dev_types_Slashmocha_and_then_add_jest_or_mocha_to_the_types_field_in_your_tsconfig: b(2593, 1, "Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_type_2593", "Cannot find name '{0}'. Do you need to install type definitions for a test runner? Try `npm i --save-dev @types/jest` or `npm i --save-dev @types/mocha` and then add 'jest' or 'mocha' to the types field in your tsconfig."), This_module_is_declared_with_export_and_can_only_be_used_with_a_default_import_when_using_the_0_flag: b(2594, 1, "This_module_is_declared_with_export_and_can_only_be_used_with_a_default_import_when_using_the_0_flag_2594", "This module is declared with 'export =', and can only be used with a default import when using the '{0}' flag."), _0_can_only_be_imported_by_using_a_default_import: b(2595, 1, "_0_can_only_be_imported_by_using_a_default_import_2595", "'{0}' can only be imported by using a default import."), _0_can_only_be_imported_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import: b(2596, 1, "_0_can_only_be_imported_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import_2596", "'{0}' can only be imported by turning on the 'esModuleInterop' flag and using a default import."), _0_can_only_be_imported_by_using_a_require_call_or_by_using_a_default_import: b(2597, 1, "_0_can_only_be_imported_by_using_a_require_call_or_by_using_a_default_import_2597", "'{0}' can only be imported by using a 'require' call or by using a default import."), _0_can_only_be_imported_by_using_a_require_call_or_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import: b(2598, 1, "_0_can_only_be_imported_by_using_a_require_call_or_by_turning_on_the_esModuleInterop_flag_and_using__2598", "'{0}' can only be imported by using a 'require' call or by turning on the 'esModuleInterop' flag and using a default import."), JSX_element_implicitly_has_type_any_because_the_global_type_JSX_Element_does_not_exist: b(2602, 1, "JSX_element_implicitly_has_type_any_because_the_global_type_JSX_Element_does_not_exist_2602", "JSX element implicitly has type 'any' because the global type 'React.JSX.Element' does not exist."), Property_0_in_type_1_is_not_assignable_to_type_2: b(2603, 1, "Property_0_in_type_1_is_not_assignable_to_type_2_2603", "Property '{0}' in type '{1}' is not assignable to type '{2}'."), JSX_element_type_0_does_not_have_any_construct_or_call_signatures: b(2604, 1, "JSX_element_type_0_does_not_have_any_construct_or_call_signatures_2604", "JSX element type '{0}' does not have any construct or call signatures."), Property_0_of_JSX_spread_attribute_is_not_assignable_to_target_property: b(2606, 1, "Property_0_of_JSX_spread_attribute_is_not_assignable_to_target_property_2606", "Property '{0}' of JSX spread attribute is not assignable to target property."), JSX_element_class_does_not_support_attributes_because_it_does_not_have_a_0_property: b(2607, 1, "JSX_element_class_does_not_support_attributes_because_it_does_not_have_a_0_property_2607", "JSX element class does not support attributes because it does not have a '{0}' property."), The_global_type_JSX_0_may_not_have_more_than_one_property: b(2608, 1, "The_global_type_JSX_0_may_not_have_more_than_one_property_2608", "The global type 'JSX.{0}' may not have more than one property."), JSX_spread_child_must_be_an_array_type: b(2609, 1, "JSX_spread_child_must_be_an_array_type_2609", "JSX spread child must be an array type."), _0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property: b(2610, 1, "_0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property_2610", "'{0}' is defined as an accessor in class '{1}', but is overridden here in '{2}' as an instance property."), _0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor: b(2611, 1, "_0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor_2611", "'{0}' is defined as a property in class '{1}', but is overridden here in '{2}' as an accessor."), Property_0_will_overwrite_the_base_property_in_1_If_this_is_intentional_add_an_initializer_Otherwise_add_a_declare_modifier_or_remove_the_redundant_declaration: b(2612, 1, "Property_0_will_overwrite_the_base_property_in_1_If_this_is_intentional_add_an_initializer_Otherwise_2612", "Property '{0}' will overwrite the base property in '{1}'. If this is intentional, add an initializer. Otherwise, add a 'declare' modifier or remove the redundant declaration."), Module_0_has_no_default_export_Did_you_mean_to_use_import_1_from_0_instead: b(2613, 1, "Module_0_has_no_default_export_Did_you_mean_to_use_import_1_from_0_instead_2613", "Module '{0}' has no default export. Did you mean to use 'import { {1} } from {0}' instead?"), Module_0_has_no_exported_member_1_Did_you_mean_to_use_import_1_from_0_instead: b(2614, 1, "Module_0_has_no_exported_member_1_Did_you_mean_to_use_import_1_from_0_instead_2614", "Module '{0}' has no exported member '{1}'. Did you mean to use 'import {1} from {0}' instead?"), Type_of_property_0_circularly_references_itself_in_mapped_type_1: b(2615, 1, "Type_of_property_0_circularly_references_itself_in_mapped_type_1_2615", "Type of property '{0}' circularly references itself in mapped type '{1}'."), _0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import: b(2616, 1, "_0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import_2616", "'{0}' can only be imported by using 'import {1} = require({2})' or a default import."), _0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import: b(2617, 1, "_0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_us_2617", "'{0}' can only be imported by using 'import {1} = require({2})' or by turning on the 'esModuleInterop' flag and using a default import."), Source_has_0_element_s_but_target_requires_1: b(2618, 1, "Source_has_0_element_s_but_target_requires_1_2618", "Source has {0} element(s) but target requires {1}."), Source_has_0_element_s_but_target_allows_only_1: b(2619, 1, "Source_has_0_element_s_but_target_allows_only_1_2619", "Source has {0} element(s) but target allows only {1}."), Target_requires_0_element_s_but_source_may_have_fewer: b(2620, 1, "Target_requires_0_element_s_but_source_may_have_fewer_2620", "Target requires {0} element(s) but source may have fewer."), Target_allows_only_0_element_s_but_source_may_have_more: b(2621, 1, "Target_allows_only_0_element_s_but_source_may_have_more_2621", "Target allows only {0} element(s) but source may have more."), Source_provides_no_match_for_required_element_at_position_0_in_target: b(2623, 1, "Source_provides_no_match_for_required_element_at_position_0_in_target_2623", "Source provides no match for required element at position {0} in target."), Source_provides_no_match_for_variadic_element_at_position_0_in_target: b(2624, 1, "Source_provides_no_match_for_variadic_element_at_position_0_in_target_2624", "Source provides no match for variadic element at position {0} in target."), Variadic_element_at_position_0_in_source_does_not_match_element_at_position_1_in_target: b(2625, 1, "Variadic_element_at_position_0_in_source_does_not_match_element_at_position_1_in_target_2625", "Variadic element at position {0} in source does not match element at position {1} in target."), Type_at_position_0_in_source_is_not_compatible_with_type_at_position_1_in_target: b(2626, 1, "Type_at_position_0_in_source_is_not_compatible_with_type_at_position_1_in_target_2626", "Type at position {0} in source is not compatible with type at position {1} in target."), Type_at_positions_0_through_1_in_source_is_not_compatible_with_type_at_position_2_in_target: b(2627, 1, "Type_at_positions_0_through_1_in_source_is_not_compatible_with_type_at_position_2_in_target_2627", "Type at positions {0} through {1} in source is not compatible with type at position {2} in target."), Cannot_assign_to_0_because_it_is_an_enum: b(2628, 1, "Cannot_assign_to_0_because_it_is_an_enum_2628", "Cannot assign to '{0}' because it is an enum."), Cannot_assign_to_0_because_it_is_a_class: b(2629, 1, "Cannot_assign_to_0_because_it_is_a_class_2629", "Cannot assign to '{0}' because it is a class."), Cannot_assign_to_0_because_it_is_a_function: b(2630, 1, "Cannot_assign_to_0_because_it_is_a_function_2630", "Cannot assign to '{0}' because it is a function."), Cannot_assign_to_0_because_it_is_a_namespace: b(2631, 1, "Cannot_assign_to_0_because_it_is_a_namespace_2631", "Cannot assign to '{0}' because it is a namespace."), Cannot_assign_to_0_because_it_is_an_import: b(2632, 1, "Cannot_assign_to_0_because_it_is_an_import_2632", "Cannot assign to '{0}' because it is an import."), JSX_property_access_expressions_cannot_include_JSX_namespace_names: b(2633, 1, "JSX_property_access_expressions_cannot_include_JSX_namespace_names_2633", "JSX property access expressions cannot include JSX namespace names"), _0_index_signatures_are_incompatible: b(2634, 1, "_0_index_signatures_are_incompatible_2634", "'{0}' index signatures are incompatible."), Type_0_has_no_signatures_for_which_the_type_argument_list_is_applicable: b(2635, 1, "Type_0_has_no_signatures_for_which_the_type_argument_list_is_applicable_2635", "Type '{0}' has no signatures for which the type argument list is applicable."), Type_0_is_not_assignable_to_type_1_as_implied_by_variance_annotation: b(2636, 1, "Type_0_is_not_assignable_to_type_1_as_implied_by_variance_annotation_2636", "Type '{0}' is not assignable to type '{1}' as implied by variance annotation."), Variance_annotations_are_only_supported_in_type_aliases_for_object_function_constructor_and_mapped_types: b(2637, 1, "Variance_annotations_are_only_supported_in_type_aliases_for_object_function_constructor_and_mapped_t_2637", "Variance annotations are only supported in type aliases for object, function, constructor, and mapped types."), Type_0_may_represent_a_primitive_value_which_is_not_permitted_as_the_right_operand_of_the_in_operator: b(2638, 1, "Type_0_may_represent_a_primitive_value_which_is_not_permitted_as_the_right_operand_of_the_in_operato_2638", "Type '{0}' may represent a primitive value, which is not permitted as the right operand of the 'in' operator."), Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity: b(2649, 1, "Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity_2649", "Cannot augment module '{0}' with value exports because it resolves to a non-module entity."), A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums: b(2651, 1, "A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_memb_2651", "A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums."), Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_default_0_declaration_instead: b(2652, 1, "Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_d_2652", "Merged declaration '{0}' cannot include a default export declaration. Consider adding a separate 'export default {0}' declaration instead."), Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1: b(2653, 1, "Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1_2653", "Non-abstract class expression does not implement inherited abstract member '{0}' from class '{1}'."), JSX_expressions_must_have_one_parent_element: b(2657, 1, "JSX_expressions_must_have_one_parent_element_2657", "JSX expressions must have one parent element."), Type_0_provides_no_match_for_the_signature_1: b(2658, 1, "Type_0_provides_no_match_for_the_signature_1_2658", "Type '{0}' provides no match for the signature '{1}'."), super_is_only_allowed_in_members_of_object_literal_expressions_when_option_target_is_ES2015_or_higher: b(2659, 1, "super_is_only_allowed_in_members_of_object_literal_expressions_when_option_target_is_ES2015_or_highe_2659", "'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher."), super_can_only_be_referenced_in_members_of_derived_classes_or_object_literal_expressions: b(2660, 1, "super_can_only_be_referenced_in_members_of_derived_classes_or_object_literal_expressions_2660", "'super' can only be referenced in members of derived classes or object literal expressions."), Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module: b(2661, 1, "Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module_2661", "Cannot export '{0}'. Only local declarations can be exported from a module."), Cannot_find_name_0_Did_you_mean_the_static_member_1_0: b(2662, 1, "Cannot_find_name_0_Did_you_mean_the_static_member_1_0_2662", "Cannot find name '{0}'. Did you mean the static member '{1}.{0}'?"), Cannot_find_name_0_Did_you_mean_the_instance_member_this_0: b(2663, 1, "Cannot_find_name_0_Did_you_mean_the_instance_member_this_0_2663", "Cannot find name '{0}'. Did you mean the instance member 'this.{0}'?"), Invalid_module_name_in_augmentation_module_0_cannot_be_found: b(2664, 1, "Invalid_module_name_in_augmentation_module_0_cannot_be_found_2664", "Invalid module name in augmentation, module '{0}' cannot be found."), Invalid_module_name_in_augmentation_Module_0_resolves_to_an_untyped_module_at_1_which_cannot_be_augmented: b(2665, 1, "Invalid_module_name_in_augmentation_Module_0_resolves_to_an_untyped_module_at_1_which_cannot_be_augm_2665", "Invalid module name in augmentation. Module '{0}' resolves to an untyped module at '{1}', which cannot be augmented."), Exports_and_export_assignments_are_not_permitted_in_module_augmentations: b(2666, 1, "Exports_and_export_assignments_are_not_permitted_in_module_augmentations_2666", "Exports and export assignments are not permitted in module augmentations."), Imports_are_not_permitted_in_module_augmentations_Consider_moving_them_to_the_enclosing_external_module: b(2667, 1, "Imports_are_not_permitted_in_module_augmentations_Consider_moving_them_to_the_enclosing_external_mod_2667", "Imports are not permitted in module augmentations. Consider moving them to the enclosing external module."), export_modifier_cannot_be_applied_to_ambient_modules_and_module_augmentations_since_they_are_always_visible: b(2668, 1, "export_modifier_cannot_be_applied_to_ambient_modules_and_module_augmentations_since_they_are_always__2668", "'export' modifier cannot be applied to ambient modules and module augmentations since they are always visible."), Augmentations_for_the_global_scope_can_only_be_directly_nested_in_external_modules_or_ambient_module_declarations: b(2669, 1, "Augmentations_for_the_global_scope_can_only_be_directly_nested_in_external_modules_or_ambient_module_2669", "Augmentations for the global scope can only be directly nested in external modules or ambient module declarations."), Augmentations_for_the_global_scope_should_have_declare_modifier_unless_they_appear_in_already_ambient_context: b(2670, 1, "Augmentations_for_the_global_scope_should_have_declare_modifier_unless_they_appear_in_already_ambien_2670", "Augmentations for the global scope should have 'declare' modifier unless they appear in already ambient context."), Cannot_augment_module_0_because_it_resolves_to_a_non_module_entity: b(2671, 1, "Cannot_augment_module_0_because_it_resolves_to_a_non_module_entity_2671", "Cannot augment module '{0}' because it resolves to a non-module entity."), Cannot_assign_a_0_constructor_type_to_a_1_constructor_type: b(2672, 1, "Cannot_assign_a_0_constructor_type_to_a_1_constructor_type_2672", "Cannot assign a '{0}' constructor type to a '{1}' constructor type."), Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration: b(2673, 1, "Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration_2673", "Constructor of class '{0}' is private and only accessible within the class declaration."), Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration: b(2674, 1, "Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration_2674", "Constructor of class '{0}' is protected and only accessible within the class declaration."), Cannot_extend_a_class_0_Class_constructor_is_marked_as_private: b(2675, 1, "Cannot_extend_a_class_0_Class_constructor_is_marked_as_private_2675", "Cannot extend a class '{0}'. Class constructor is marked as private."), Accessors_must_both_be_abstract_or_non_abstract: b(2676, 1, "Accessors_must_both_be_abstract_or_non_abstract_2676", "Accessors must both be abstract or non-abstract."), A_type_predicate_s_type_must_be_assignable_to_its_parameter_s_type: b(2677, 1, "A_type_predicate_s_type_must_be_assignable_to_its_parameter_s_type_2677", "A type predicate's type must be assignable to its parameter's type."), Type_0_is_not_comparable_to_type_1: b(2678, 1, "Type_0_is_not_comparable_to_type_1_2678", "Type '{0}' is not comparable to type '{1}'."), A_function_that_is_called_with_the_new_keyword_cannot_have_a_this_type_that_is_void: b(2679, 1, "A_function_that_is_called_with_the_new_keyword_cannot_have_a_this_type_that_is_void_2679", "A function that is called with the 'new' keyword cannot have a 'this' type that is 'void'."), A_0_parameter_must_be_the_first_parameter: b(2680, 1, "A_0_parameter_must_be_the_first_parameter_2680", "A '{0}' parameter must be the first parameter."), A_constructor_cannot_have_a_this_parameter: b(2681, 1, "A_constructor_cannot_have_a_this_parameter_2681", "A constructor cannot have a 'this' parameter."), this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation: b(2683, 1, "this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation_2683", "'this' implicitly has type 'any' because it does not have a type annotation."), The_this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1: b(2684, 1, "The_this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1_2684", "The 'this' context of type '{0}' is not assignable to method's 'this' of type '{1}'."), The_this_types_of_each_signature_are_incompatible: b(2685, 1, "The_this_types_of_each_signature_are_incompatible_2685", "The 'this' types of each signature are incompatible."), _0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead: b(2686, 1, "_0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead_2686", "'{0}' refers to a UMD global, but the current file is a module. Consider adding an import instead."), All_declarations_of_0_must_have_identical_modifiers: b(2687, 1, "All_declarations_of_0_must_have_identical_modifiers_2687", "All declarations of '{0}' must have identical modifiers."), Cannot_find_type_definition_file_for_0: b(2688, 1, "Cannot_find_type_definition_file_for_0_2688", "Cannot find type definition file for '{0}'."), Cannot_extend_an_interface_0_Did_you_mean_implements: b(2689, 1, "Cannot_extend_an_interface_0_Did_you_mean_implements_2689", "Cannot extend an interface '{0}'. Did you mean 'implements'?"), _0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Did_you_mean_to_use_1_in_0: b(2690, 1, "_0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Did_you_mean_to_use_1_in_0_2690", "'{0}' only refers to a type, but is being used as a value here. Did you mean to use '{1} in {0}'?"), _0_is_a_primitive_but_1_is_a_wrapper_object_Prefer_using_0_when_possible: b(2692, 1, "_0_is_a_primitive_but_1_is_a_wrapper_object_Prefer_using_0_when_possible_2692", "'{0}' is a primitive, but '{1}' is a wrapper object. Prefer using '{0}' when possible."), _0_only_refers_to_a_type_but_is_being_used_as_a_value_here: b(2693, 1, "_0_only_refers_to_a_type_but_is_being_used_as_a_value_here_2693", "'{0}' only refers to a type, but is being used as a value here."), Namespace_0_has_no_exported_member_1: b(2694, 1, "Namespace_0_has_no_exported_member_1_2694", "Namespace '{0}' has no exported member '{1}'."), Left_side_of_comma_operator_is_unused_and_has_no_side_effects: b(2695, 1, "Left_side_of_comma_operator_is_unused_and_has_no_side_effects_2695", "Left side of comma operator is unused and has no side effects.", !0), The_Object_type_is_assignable_to_very_few_other_types_Did_you_mean_to_use_the_any_type_instead: b(2696, 1, "The_Object_type_is_assignable_to_very_few_other_types_Did_you_mean_to_use_the_any_type_instead_2696", "The 'Object' type is assignable to very few other types. Did you mean to use the 'any' type instead?"), An_async_function_or_method_must_return_a_Promise_Make_sure_you_have_a_declaration_for_Promise_or_include_ES2015_in_your_lib_option: b(2697, 1, "An_async_function_or_method_must_return_a_Promise_Make_sure_you_have_a_declaration_for_Promise_or_in_2697", "An async function or method must return a 'Promise'. Make sure you have a declaration for 'Promise' or include 'ES2015' in your '--lib' option."), Spread_types_may_only_be_created_from_object_types: b(2698, 1, "Spread_types_may_only_be_created_from_object_types_2698", "Spread types may only be created from object types."), Static_property_0_conflicts_with_built_in_property_Function_0_of_constructor_function_1: b(2699, 1, "Static_property_0_conflicts_with_built_in_property_Function_0_of_constructor_function_1_2699", "Static property '{0}' conflicts with built-in property 'Function.{0}' of constructor function '{1}'."), Rest_types_may_only_be_created_from_object_types: b(2700, 1, "Rest_types_may_only_be_created_from_object_types_2700", "Rest types may only be created from object types."), The_target_of_an_object_rest_assignment_must_be_a_variable_or_a_property_access: b(2701, 1, "The_target_of_an_object_rest_assignment_must_be_a_variable_or_a_property_access_2701", "The target of an object rest assignment must be a variable or a property access."), _0_only_refers_to_a_type_but_is_being_used_as_a_namespace_here: b(2702, 1, "_0_only_refers_to_a_type_but_is_being_used_as_a_namespace_here_2702", "'{0}' only refers to a type, but is being used as a namespace here."), The_operand_of_a_delete_operator_must_be_a_property_reference: b(2703, 1, "The_operand_of_a_delete_operator_must_be_a_property_reference_2703", "The operand of a 'delete' operator must be a property reference."), The_operand_of_a_delete_operator_cannot_be_a_read_only_property: b(2704, 1, "The_operand_of_a_delete_operator_cannot_be_a_read_only_property_2704", "The operand of a 'delete' operator cannot be a read-only property."), An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option: b(2705, 1, "An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_de_2705", "An async function or method in ES5/ES3 requires the 'Promise' constructor.  Make sure you have a declaration for the 'Promise' constructor or include 'ES2015' in your '--lib' option."), Required_type_parameters_may_not_follow_optional_type_parameters: b(2706, 1, "Required_type_parameters_may_not_follow_optional_type_parameters_2706", "Required type parameters may not follow optional type parameters."), Generic_type_0_requires_between_1_and_2_type_arguments: b(2707, 1, "Generic_type_0_requires_between_1_and_2_type_arguments_2707", "Generic type '{0}' requires between {1} and {2} type arguments."), Cannot_use_namespace_0_as_a_value: b(2708, 1, "Cannot_use_namespace_0_as_a_value_2708", "Cannot use namespace '{0}' as a value."), Cannot_use_namespace_0_as_a_type: b(2709, 1, "Cannot_use_namespace_0_as_a_type_2709", "Cannot use namespace '{0}' as a type."), _0_are_specified_twice_The_attribute_named_0_will_be_overwritten: b(2710, 1, "_0_are_specified_twice_The_attribute_named_0_will_be_overwritten_2710", "'{0}' are specified twice. The attribute named '{0}' will be overwritten."), A_dynamic_import_call_returns_a_Promise_Make_sure_you_have_a_declaration_for_Promise_or_include_ES2015_in_your_lib_option: b(2711, 1, "A_dynamic_import_call_returns_a_Promise_Make_sure_you_have_a_declaration_for_Promise_or_include_ES20_2711", "A dynamic import call returns a 'Promise'. Make sure you have a declaration for 'Promise' or include 'ES2015' in your '--lib' option."), A_dynamic_import_call_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option: b(2712, 1, "A_dynamic_import_call_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declarat_2712", "A dynamic import call in ES5/ES3 requires the 'Promise' constructor.  Make sure you have a declaration for the 'Promise' constructor or include 'ES2015' in your '--lib' option."), Cannot_access_0_1_because_0_is_a_type_but_not_a_namespace_Did_you_mean_to_retrieve_the_type_of_the_property_1_in_0_with_0_1: b(2713, 1, "Cannot_access_0_1_because_0_is_a_type_but_not_a_namespace_Did_you_mean_to_retrieve_the_type_of_the_p_2713", `Cannot access '{0}.{1}' because '{0}' is a type, but not a namespace. Did you mean to retrieve the type of the property '{1}' in '{0}' with '{0}["{1}"]'?`), The_expression_of_an_export_assignment_must_be_an_identifier_or_qualified_name_in_an_ambient_context: b(2714, 1, "The_expression_of_an_export_assignment_must_be_an_identifier_or_qualified_name_in_an_ambient_context_2714", "The expression of an export assignment must be an identifier or qualified name in an ambient context."), Abstract_property_0_in_class_1_cannot_be_accessed_in_the_constructor: b(2715, 1, "Abstract_property_0_in_class_1_cannot_be_accessed_in_the_constructor_2715", "Abstract property '{0}' in class '{1}' cannot be accessed in the constructor."), Type_parameter_0_has_a_circular_default: b(2716, 1, "Type_parameter_0_has_a_circular_default_2716", "Type parameter '{0}' has a circular default."), Subsequent_property_declarations_must_have_the_same_type_Property_0_must_be_of_type_1_but_here_has_type_2: b(2717, 1, "Subsequent_property_declarations_must_have_the_same_type_Property_0_must_be_of_type_1_but_here_has_t_2717", "Subsequent property declarations must have the same type.  Property '{0}' must be of type '{1}', but here has type '{2}'."), Duplicate_property_0: b(2718, 1, "Duplicate_property_0_2718", "Duplicate property '{0}'."), Type_0_is_not_assignable_to_type_1_Two_different_types_with_this_name_exist_but_they_are_unrelated: b(2719, 1, "Type_0_is_not_assignable_to_type_1_Two_different_types_with_this_name_exist_but_they_are_unrelated_2719", "Type '{0}' is not assignable to type '{1}'. Two different types with this name exist, but they are unrelated."), Class_0_incorrectly_implements_class_1_Did_you_mean_to_extend_1_and_inherit_its_members_as_a_subclass: b(2720, 1, "Class_0_incorrectly_implements_class_1_Did_you_mean_to_extend_1_and_inherit_its_members_as_a_subclas_2720", "Class '{0}' incorrectly implements class '{1}'. Did you mean to extend '{1}' and inherit its members as a subclass?"), Cannot_invoke_an_object_which_is_possibly_null: b(2721, 1, "Cannot_invoke_an_object_which_is_possibly_null_2721", "Cannot invoke an object which is possibly 'null'."), Cannot_invoke_an_object_which_is_possibly_undefined: b(2722, 1, "Cannot_invoke_an_object_which_is_possibly_undefined_2722", "Cannot invoke an object which is possibly 'undefined'."), Cannot_invoke_an_object_which_is_possibly_null_or_undefined: b(2723, 1, "Cannot_invoke_an_object_which_is_possibly_null_or_undefined_2723", "Cannot invoke an object which is possibly 'null' or 'undefined'."), _0_has_no_exported_member_named_1_Did_you_mean_2: b(2724, 1, "_0_has_no_exported_member_named_1_Did_you_mean_2_2724", "'{0}' has no exported member named '{1}'. Did you mean '{2}'?"), Class_name_cannot_be_Object_when_targeting_ES5_with_module_0: b(2725, 1, "Class_name_cannot_be_Object_when_targeting_ES5_with_module_0_2725", "Class name cannot be 'Object' when targeting ES5 with module {0}."), Cannot_find_lib_definition_for_0: b(2726, 1, "Cannot_find_lib_definition_for_0_2726", "Cannot find lib definition for '{0}'."), Cannot_find_lib_definition_for_0_Did_you_mean_1: b(2727, 1, "Cannot_find_lib_definition_for_0_Did_you_mean_1_2727", "Cannot find lib definition for '{0}'. Did you mean '{1}'?"), _0_is_declared_here: b(2728, 3, "_0_is_declared_here_2728", "'{0}' is declared here."), Property_0_is_used_before_its_initialization: b(2729, 1, "Property_0_is_used_before_its_initialization_2729", "Property '{0}' is used before its initialization."), An_arrow_function_cannot_have_a_this_parameter: b(2730, 1, "An_arrow_function_cannot_have_a_this_parameter_2730", "An arrow function cannot have a 'this' parameter."), Implicit_conversion_of_a_symbol_to_a_string_will_fail_at_runtime_Consider_wrapping_this_expression_in_String: b(2731, 1, "Implicit_conversion_of_a_symbol_to_a_string_will_fail_at_runtime_Consider_wrapping_this_expression_i_2731", "Implicit conversion of a 'symbol' to a 'string' will fail at runtime. Consider wrapping this expression in 'String(...)'."), Cannot_find_module_0_Consider_using_resolveJsonModule_to_import_module_with_json_extension: b(2732, 1, "Cannot_find_module_0_Consider_using_resolveJsonModule_to_import_module_with_json_extension_2732", "Cannot find module '{0}'. Consider using '--resolveJsonModule' to import module with '.json' extension."), Property_0_was_also_declared_here: b(2733, 1, "Property_0_was_also_declared_here_2733", "Property '{0}' was also declared here."), Are_you_missing_a_semicolon: b(2734, 1, "Are_you_missing_a_semicolon_2734", "Are you missing a semicolon?"), Did_you_mean_for_0_to_be_constrained_to_type_new_args_Colon_any_1: b(2735, 1, "Did_you_mean_for_0_to_be_constrained_to_type_new_args_Colon_any_1_2735", "Did you mean for '{0}' to be constrained to type 'new (...args: any[]) => {1}'?"), Operator_0_cannot_be_applied_to_type_1: b(2736, 1, "Operator_0_cannot_be_applied_to_type_1_2736", "Operator '{0}' cannot be applied to type '{1}'."), BigInt_literals_are_not_available_when_targeting_lower_than_ES2020: b(2737, 1, "BigInt_literals_are_not_available_when_targeting_lower_than_ES2020_2737", "BigInt literals are not available when targeting lower than ES2020."), An_outer_value_of_this_is_shadowed_by_this_container: b(2738, 3, "An_outer_value_of_this_is_shadowed_by_this_container_2738", "An outer value of 'this' is shadowed by this container."), Type_0_is_missing_the_following_properties_from_type_1_Colon_2: b(2739, 1, "Type_0_is_missing_the_following_properties_from_type_1_Colon_2_2739", "Type '{0}' is missing the following properties from type '{1}': {2}"), Type_0_is_missing_the_following_properties_from_type_1_Colon_2_and_3_more: b(2740, 1, "Type_0_is_missing_the_following_properties_from_type_1_Colon_2_and_3_more_2740", "Type '{0}' is missing the following properties from type '{1}': {2}, and {3} more."), Property_0_is_missing_in_type_1_but_required_in_type_2: b(2741, 1, "Property_0_is_missing_in_type_1_but_required_in_type_2_2741", "Property '{0}' is missing in type '{1}' but required in type '{2}'."), The_inferred_type_of_0_cannot_be_named_without_a_reference_to_1_This_is_likely_not_portable_A_type_annotation_is_necessary: b(2742, 1, "The_inferred_type_of_0_cannot_be_named_without_a_reference_to_1_This_is_likely_not_portable_A_type_a_2742", "The inferred type of '{0}' cannot be named without a reference to '{1}'. This is likely not portable. A type annotation is necessary."), No_overload_expects_0_type_arguments_but_overloads_do_exist_that_expect_either_1_or_2_type_arguments: b(2743, 1, "No_overload_expects_0_type_arguments_but_overloads_do_exist_that_expect_either_1_or_2_type_arguments_2743", "No overload expects {0} type arguments, but overloads do exist that expect either {1} or {2} type arguments."), Type_parameter_defaults_can_only_reference_previously_declared_type_parameters: b(2744, 1, "Type_parameter_defaults_can_only_reference_previously_declared_type_parameters_2744", "Type parameter defaults can only reference previously declared type parameters."), This_JSX_tag_s_0_prop_expects_type_1_which_requires_multiple_children_but_only_a_single_child_was_provided: b(2745, 1, "This_JSX_tag_s_0_prop_expects_type_1_which_requires_multiple_children_but_only_a_single_child_was_pr_2745", "This JSX tag's '{0}' prop expects type '{1}' which requires multiple children, but only a single child was provided."), This_JSX_tag_s_0_prop_expects_a_single_child_of_type_1_but_multiple_children_were_provided: b(2746, 1, "This_JSX_tag_s_0_prop_expects_a_single_child_of_type_1_but_multiple_children_were_provided_2746", "This JSX tag's '{0}' prop expects a single child of type '{1}', but multiple children were provided."), _0_components_don_t_accept_text_as_child_elements_Text_in_JSX_has_the_type_string_but_the_expected_type_of_1_is_2: b(2747, 1, "_0_components_don_t_accept_text_as_child_elements_Text_in_JSX_has_the_type_string_but_the_expected_t_2747", "'{0}' components don't accept text as child elements. Text in JSX has the type 'string', but the expected type of '{1}' is '{2}'."), Cannot_access_ambient_const_enums_when_0_is_enabled: b(2748, 1, "Cannot_access_ambient_const_enums_when_0_is_enabled_2748", "Cannot access ambient const enums when '{0}' is enabled."), _0_refers_to_a_value_but_is_being_used_as_a_type_here_Did_you_mean_typeof_0: b(2749, 1, "_0_refers_to_a_value_but_is_being_used_as_a_type_here_Did_you_mean_typeof_0_2749", "'{0}' refers to a value, but is being used as a type here. Did you mean 'typeof {0}'?"), The_implementation_signature_is_declared_here: b(2750, 1, "The_implementation_signature_is_declared_here_2750", "The implementation signature is declared here."), Circularity_originates_in_type_at_this_location: b(2751, 1, "Circularity_originates_in_type_at_this_location_2751", "Circularity originates in type at this location."), The_first_export_default_is_here: b(2752, 1, "The_first_export_default_is_here_2752", "The first export default is here."), Another_export_default_is_here: b(2753, 1, "Another_export_default_is_here_2753", "Another export default is here."), super_may_not_use_type_arguments: b(2754, 1, "super_may_not_use_type_arguments_2754", "'super' may not use type arguments."), No_constituent_of_type_0_is_callable: b(2755, 1, "No_constituent_of_type_0_is_callable_2755", "No constituent of type '{0}' is callable."), Not_all_constituents_of_type_0_are_callable: b(2756, 1, "Not_all_constituents_of_type_0_are_callable_2756", "Not all constituents of type '{0}' are callable."), Type_0_has_no_call_signatures: b(2757, 1, "Type_0_has_no_call_signatures_2757", "Type '{0}' has no call signatures."), Each_member_of_the_union_type_0_has_signatures_but_none_of_those_signatures_are_compatible_with_each_other: b(2758, 1, "Each_member_of_the_union_type_0_has_signatures_but_none_of_those_signatures_are_compatible_with_each_2758", "Each member of the union type '{0}' has signatures, but none of those signatures are compatible with each other."), No_constituent_of_type_0_is_constructable: b(2759, 1, "No_constituent_of_type_0_is_constructable_2759", "No constituent of type '{0}' is constructable."), Not_all_constituents_of_type_0_are_constructable: b(2760, 1, "Not_all_constituents_of_type_0_are_constructable_2760", "Not all constituents of type '{0}' are constructable."), Type_0_has_no_construct_signatures: b(2761, 1, "Type_0_has_no_construct_signatures_2761", "Type '{0}' has no construct signatures."), Each_member_of_the_union_type_0_has_construct_signatures_but_none_of_those_signatures_are_compatible_with_each_other: b(2762, 1, "Each_member_of_the_union_type_0_has_construct_signatures_but_none_of_those_signatures_are_compatible_2762", "Each member of the union type '{0}' has construct signatures, but none of those signatures are compatible with each other."), Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_for_of_will_always_send_0: b(2763, 1, "Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_for_of_will_always_s_2763", "Cannot iterate value because the 'next' method of its iterator expects type '{1}', but for-of will always send '{0}'."), Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_array_spread_will_always_send_0: b(2764, 1, "Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_array_spread_will_al_2764", "Cannot iterate value because the 'next' method of its iterator expects type '{1}', but array spread will always send '{0}'."), Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_array_destructuring_will_always_send_0: b(2765, 1, "Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_array_destructuring__2765", "Cannot iterate value because the 'next' method of its iterator expects type '{1}', but array destructuring will always send '{0}'."), Cannot_delegate_iteration_to_value_because_the_next_method_of_its_iterator_expects_type_1_but_the_containing_generator_will_always_send_0: b(2766, 1, "Cannot_delegate_iteration_to_value_because_the_next_method_of_its_iterator_expects_type_1_but_the_co_2766", "Cannot delegate iteration to value because the 'next' method of its iterator expects type '{1}', but the containing generator will always send '{0}'."), The_0_property_of_an_iterator_must_be_a_method: b(2767, 1, "The_0_property_of_an_iterator_must_be_a_method_2767", "The '{0}' property of an iterator must be a method."), The_0_property_of_an_async_iterator_must_be_a_method: b(2768, 1, "The_0_property_of_an_async_iterator_must_be_a_method_2768", "The '{0}' property of an async iterator must be a method."), No_overload_matches_this_call: b(2769, 1, "No_overload_matches_this_call_2769", "No overload matches this call."), The_last_overload_gave_the_following_error: b(2770, 1, "The_last_overload_gave_the_following_error_2770", "The last overload gave the following error."), The_last_overload_is_declared_here: b(2771, 1, "The_last_overload_is_declared_here_2771", "The last overload is declared here."), Overload_0_of_1_2_gave_the_following_error: b(2772, 1, "Overload_0_of_1_2_gave_the_following_error_2772", "Overload {0} of {1}, '{2}', gave the following error."), Did_you_forget_to_use_await: b(2773, 1, "Did_you_forget_to_use_await_2773", "Did you forget to use 'await'?"), This_condition_will_always_return_true_since_this_function_is_always_defined_Did_you_mean_to_call_it_instead: b(2774, 1, "This_condition_will_always_return_true_since_this_function_is_always_defined_Did_you_mean_to_call_it_2774", "This condition will always return true since this function is always defined. Did you mean to call it instead?"), Assertions_require_every_name_in_the_call_target_to_be_declared_with_an_explicit_type_annotation: b(2775, 1, "Assertions_require_every_name_in_the_call_target_to_be_declared_with_an_explicit_type_annotation_2775", "Assertions require every name in the call target to be declared with an explicit type annotation."), Assertions_require_the_call_target_to_be_an_identifier_or_qualified_name: b(2776, 1, "Assertions_require_the_call_target_to_be_an_identifier_or_qualified_name_2776", "Assertions require the call target to be an identifier or qualified name."), The_operand_of_an_increment_or_decrement_operator_may_not_be_an_optional_property_access: b(2777, 1, "The_operand_of_an_increment_or_decrement_operator_may_not_be_an_optional_property_access_2777", "The operand of an increment or decrement operator may not be an optional property access."), The_target_of_an_object_rest_assignment_may_not_be_an_optional_property_access: b(2778, 1, "The_target_of_an_object_rest_assignment_may_not_be_an_optional_property_access_2778", "The target of an object rest assignment may not be an optional property access."), The_left_hand_side_of_an_assignment_expression_may_not_be_an_optional_property_access: b(2779, 1, "The_left_hand_side_of_an_assignment_expression_may_not_be_an_optional_property_access_2779", "The left-hand side of an assignment expression may not be an optional property access."), The_left_hand_side_of_a_for_in_statement_may_not_be_an_optional_property_access: b(2780, 1, "The_left_hand_side_of_a_for_in_statement_may_not_be_an_optional_property_access_2780", "The left-hand side of a 'for...in' statement may not be an optional property access."), The_left_hand_side_of_a_for_of_statement_may_not_be_an_optional_property_access: b(2781, 1, "The_left_hand_side_of_a_for_of_statement_may_not_be_an_optional_property_access_2781", "The left-hand side of a 'for...of' statement may not be an optional property access."), _0_needs_an_explicit_type_annotation: b(2782, 3, "_0_needs_an_explicit_type_annotation_2782", "'{0}' needs an explicit type annotation."), _0_is_specified_more_than_once_so_this_usage_will_be_overwritten: b(2783, 1, "_0_is_specified_more_than_once_so_this_usage_will_be_overwritten_2783", "'{0}' is specified more than once, so this usage will be overwritten."), get_and_set_accessors_cannot_declare_this_parameters: b(2784, 1, "get_and_set_accessors_cannot_declare_this_parameters_2784", "'get' and 'set' accessors cannot declare 'this' parameters."), This_spread_always_overwrites_this_property: b(2785, 1, "This_spread_always_overwrites_this_property_2785", "This spread always overwrites this property."), _0_cannot_be_used_as_a_JSX_component: b(2786, 1, "_0_cannot_be_used_as_a_JSX_component_2786", "'{0}' cannot be used as a JSX component."), Its_return_type_0_is_not_a_valid_JSX_element: b(2787, 1, "Its_return_type_0_is_not_a_valid_JSX_element_2787", "Its return type '{0}' is not a valid JSX element."), Its_instance_type_0_is_not_a_valid_JSX_element: b(2788, 1, "Its_instance_type_0_is_not_a_valid_JSX_element_2788", "Its instance type '{0}' is not a valid JSX element."), Its_element_type_0_is_not_a_valid_JSX_element: b(2789, 1, "Its_element_type_0_is_not_a_valid_JSX_element_2789", "Its element type '{0}' is not a valid JSX element."), The_operand_of_a_delete_operator_must_be_optional: b(2790, 1, "The_operand_of_a_delete_operator_must_be_optional_2790", "The operand of a 'delete' operator must be optional."), Exponentiation_cannot_be_performed_on_bigint_values_unless_the_target_option_is_set_to_es2016_or_later: b(2791, 1, "Exponentiation_cannot_be_performed_on_bigint_values_unless_the_target_option_is_set_to_es2016_or_lat_2791", "Exponentiation cannot be performed on 'bigint' values unless the 'target' option is set to 'es2016' or later."), Cannot_find_module_0_Did_you_mean_to_set_the_moduleResolution_option_to_nodenext_or_to_add_aliases_to_the_paths_option: b(2792, 1, "Cannot_find_module_0_Did_you_mean_to_set_the_moduleResolution_option_to_nodenext_or_to_add_aliases_t_2792", "Cannot find module '{0}'. Did you mean to set the 'moduleResolution' option to 'nodenext', or to add aliases to the 'paths' option?"), The_call_would_have_succeeded_against_this_implementation_but_implementation_signatures_of_overloads_are_not_externally_visible: b(2793, 1, "The_call_would_have_succeeded_against_this_implementation_but_implementation_signatures_of_overloads_2793", "The call would have succeeded against this implementation, but implementation signatures of overloads are not externally visible."), Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise: b(2794, 1, "Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise_2794", "Expected {0} arguments, but got {1}. Did you forget to include 'void' in your type argument to 'Promise'?"), The_intrinsic_keyword_can_only_be_used_to_declare_compiler_provided_intrinsic_types: b(2795, 1, "The_intrinsic_keyword_can_only_be_used_to_declare_compiler_provided_intrinsic_types_2795", "The 'intrinsic' keyword can only be used to declare compiler provided intrinsic types."), It_is_likely_that_you_are_missing_a_comma_to_separate_these_two_template_expressions_They_form_a_tagged_template_expression_which_cannot_be_invoked: b(2796, 1, "It_is_likely_that_you_are_missing_a_comma_to_separate_these_two_template_expressions_They_form_a_tag_2796", "It is likely that you are missing a comma to separate these two template expressions. They form a tagged template expression which cannot be invoked."), A_mixin_class_that_extends_from_a_type_variable_containing_an_abstract_construct_signature_must_also_be_declared_abstract: b(2797, 1, "A_mixin_class_that_extends_from_a_type_variable_containing_an_abstract_construct_signature_must_also_2797", "A mixin class that extends from a type variable containing an abstract construct signature must also be declared 'abstract'."), The_declaration_was_marked_as_deprecated_here: b(2798, 1, "The_declaration_was_marked_as_deprecated_here_2798", "The declaration was marked as deprecated here."), Type_produces_a_tuple_type_that_is_too_large_to_represent: b(2799, 1, "Type_produces_a_tuple_type_that_is_too_large_to_represent_2799", "Type produces a tuple type that is too large to represent."), Expression_produces_a_tuple_type_that_is_too_large_to_represent: b(2800, 1, "Expression_produces_a_tuple_type_that_is_too_large_to_represent_2800", "Expression produces a tuple type that is too large to represent."), This_condition_will_always_return_true_since_this_0_is_always_defined: b(2801, 1, "This_condition_will_always_return_true_since_this_0_is_always_defined_2801", "This condition will always return true since this '{0}' is always defined."), Type_0_can_only_be_iterated_through_when_using_the_downlevelIteration_flag_or_with_a_target_of_es2015_or_higher: b(2802, 1, "Type_0_can_only_be_iterated_through_when_using_the_downlevelIteration_flag_or_with_a_target_of_es201_2802", "Type '{0}' can only be iterated through when using the '--downlevelIteration' flag or with a '--target' of 'es2015' or higher."), Cannot_assign_to_private_method_0_Private_methods_are_not_writable: b(2803, 1, "Cannot_assign_to_private_method_0_Private_methods_are_not_writable_2803", "Cannot assign to private method '{0}'. Private methods are not writable."), Duplicate_identifier_0_Static_and_instance_elements_cannot_share_the_same_private_name: b(2804, 1, "Duplicate_identifier_0_Static_and_instance_elements_cannot_share_the_same_private_name_2804", "Duplicate identifier '{0}'. Static and instance elements cannot share the same private name."), Private_accessor_was_defined_without_a_getter: b(2806, 1, "Private_accessor_was_defined_without_a_getter_2806", "Private accessor was defined without a getter."), This_syntax_requires_an_imported_helper_named_1_with_2_parameters_which_is_not_compatible_with_the_one_in_0_Consider_upgrading_your_version_of_0: b(2807, 1, "This_syntax_requires_an_imported_helper_named_1_with_2_parameters_which_is_not_compatible_with_the_o_2807", "This syntax requires an imported helper named '{1}' with {2} parameters, which is not compatible with the one in '{0}'. Consider upgrading your version of '{0}'."), A_get_accessor_must_be_at_least_as_accessible_as_the_setter: b(2808, 1, "A_get_accessor_must_be_at_least_as_accessible_as_the_setter_2808", "A get accessor must be at least as accessible as the setter"), Declaration_or_statement_expected_This_follows_a_block_of_statements_so_if_you_intended_to_write_a_destructuring_assignment_you_might_need_to_wrap_the_whole_assignment_in_parentheses: b(2809, 1, "Declaration_or_statement_expected_This_follows_a_block_of_statements_so_if_you_intended_to_write_a_d_2809", "Declaration or statement expected. This '=' follows a block of statements, so if you intended to write a destructuring assignment, you might need to wrap the whole assignment in parentheses."), Expected_1_argument_but_got_0_new_Promise_needs_a_JSDoc_hint_to_produce_a_resolve_that_can_be_called_without_arguments: b(2810, 1, "Expected_1_argument_but_got_0_new_Promise_needs_a_JSDoc_hint_to_produce_a_resolve_that_can_be_called_2810", "Expected 1 argument, but got 0. 'new Promise()' needs a JSDoc hint to produce a 'resolve' that can be called without arguments."), Initializer_for_property_0: b(2811, 1, "Initializer_for_property_0_2811", "Initializer for property '{0}'"), Property_0_does_not_exist_on_type_1_Try_changing_the_lib_compiler_option_to_include_dom: b(2812, 1, "Property_0_does_not_exist_on_type_1_Try_changing_the_lib_compiler_option_to_include_dom_2812", "Property '{0}' does not exist on type '{1}'. Try changing the 'lib' compiler option to include 'dom'."), Class_declaration_cannot_implement_overload_list_for_0: b(2813, 1, "Class_declaration_cannot_implement_overload_list_for_0_2813", "Class declaration cannot implement overload list for '{0}'."), Function_with_bodies_can_only_merge_with_classes_that_are_ambient: b(2814, 1, "Function_with_bodies_can_only_merge_with_classes_that_are_ambient_2814", "Function with bodies can only merge with classes that are ambient."), arguments_cannot_be_referenced_in_property_initializers: b(2815, 1, "arguments_cannot_be_referenced_in_property_initializers_2815", "'arguments' cannot be referenced in property initializers."), Cannot_use_this_in_a_static_property_initializer_of_a_decorated_class: b(2816, 1, "Cannot_use_this_in_a_static_property_initializer_of_a_decorated_class_2816", "Cannot use 'this' in a static property initializer of a decorated class."), Property_0_has_no_initializer_and_is_not_definitely_assigned_in_a_class_static_block: b(2817, 1, "Property_0_has_no_initializer_and_is_not_definitely_assigned_in_a_class_static_block_2817", "Property '{0}' has no initializer and is not definitely assigned in a class static block."), Duplicate_identifier_0_Compiler_reserves_name_1_when_emitting_super_references_in_static_initializers: b(2818, 1, "Duplicate_identifier_0_Compiler_reserves_name_1_when_emitting_super_references_in_static_initializer_2818", "Duplicate identifier '{0}'. Compiler reserves name '{1}' when emitting 'super' references in static initializers."), Namespace_name_cannot_be_0: b(2819, 1, "Namespace_name_cannot_be_0_2819", "Namespace name cannot be '{0}'."), Type_0_is_not_assignable_to_type_1_Did_you_mean_2: b(2820, 1, "Type_0_is_not_assignable_to_type_1_Did_you_mean_2_2820", "Type '{0}' is not assignable to type '{1}'. Did you mean '{2}'?"), Import_assertions_are_only_supported_when_the_module_option_is_set_to_esnext_or_nodenext: b(2821, 1, "Import_assertions_are_only_supported_when_the_module_option_is_set_to_esnext_or_nodenext_2821", "Import assertions are only supported when the '--module' option is set to 'esnext' or 'nodenext'."), Import_assertions_cannot_be_used_with_type_only_imports_or_exports: b(2822, 1, "Import_assertions_cannot_be_used_with_type_only_imports_or_exports_2822", "Import assertions cannot be used with type-only imports or exports."), Cannot_find_namespace_0_Did_you_mean_1: b(2833, 1, "Cannot_find_namespace_0_Did_you_mean_1_2833", "Cannot find namespace '{0}'. Did you mean '{1}'?"), Relative_import_paths_need_explicit_file_extensions_in_EcmaScript_imports_when_moduleResolution_is_node16_or_nodenext_Consider_adding_an_extension_to_the_import_path: b(2834, 1, "Relative_import_paths_need_explicit_file_extensions_in_EcmaScript_imports_when_moduleResolution_is_n_2834", "Relative import paths need explicit file extensions in EcmaScript imports when '--moduleResolution' is 'node16' or 'nodenext'. Consider adding an extension to the import path."), Relative_import_paths_need_explicit_file_extensions_in_EcmaScript_imports_when_moduleResolution_is_node16_or_nodenext_Did_you_mean_0: b(2835, 1, "Relative_import_paths_need_explicit_file_extensions_in_EcmaScript_imports_when_moduleResolution_is_n_2835", "Relative import paths need explicit file extensions in EcmaScript imports when '--moduleResolution' is 'node16' or 'nodenext'. Did you mean '{0}'?"), Import_assertions_are_not_allowed_on_statements_that_transpile_to_commonjs_require_calls: b(2836, 1, "Import_assertions_are_not_allowed_on_statements_that_transpile_to_commonjs_require_calls_2836", "Import assertions are not allowed on statements that transpile to commonjs 'require' calls."), Import_assertion_values_must_be_string_literal_expressions: b(2837, 1, "Import_assertion_values_must_be_string_literal_expressions_2837", "Import assertion values must be string literal expressions."), All_declarations_of_0_must_have_identical_constraints: b(2838, 1, "All_declarations_of_0_must_have_identical_constraints_2838", "All declarations of '{0}' must have identical constraints."), This_condition_will_always_return_0_since_JavaScript_compares_objects_by_reference_not_value: b(2839, 1, "This_condition_will_always_return_0_since_JavaScript_compares_objects_by_reference_not_value_2839", "This condition will always return '{0}' since JavaScript compares objects by reference, not value."), An_interface_cannot_extend_a_primitive_type_like_0_an_interface_can_only_extend_named_types_and_classes: b(2840, 1, "An_interface_cannot_extend_a_primitive_type_like_0_an_interface_can_only_extend_named_types_and_clas_2840", "An interface cannot extend a primitive type like '{0}'; an interface can only extend named types and classes"), The_type_of_this_expression_cannot_be_named_without_a_resolution_mode_assertion_which_is_an_unstable_feature_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next: b(2841, 1, "The_type_of_this_expression_cannot_be_named_without_a_resolution_mode_assertion_which_is_an_unstable_2841", "The type of this expression cannot be named without a 'resolution-mode' assertion, which is an unstable feature. Use nightly TypeScript to silence this error. Try updating with 'npm install -D typescript@next'."), _0_is_an_unused_renaming_of_1_Did_you_intend_to_use_it_as_a_type_annotation: b(2842, 1, "_0_is_an_unused_renaming_of_1_Did_you_intend_to_use_it_as_a_type_annotation_2842", "'{0}' is an unused renaming of '{1}'. Did you intend to use it as a type annotation?"), We_can_only_write_a_type_for_0_by_adding_a_type_for_the_entire_parameter_here: b(2843, 1, "We_can_only_write_a_type_for_0_by_adding_a_type_for_the_entire_parameter_here_2843", "We can only write a type for '{0}' by adding a type for the entire parameter here."), Type_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: b(2844, 1, "Type_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor_2844", "Type of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor."), This_condition_will_always_return_0: b(2845, 1, "This_condition_will_always_return_0_2845", "This condition will always return '{0}'."), A_declaration_file_cannot_be_imported_without_import_type_Did_you_mean_to_import_an_implementation_file_0_instead: b(2846, 1, "A_declaration_file_cannot_be_imported_without_import_type_Did_you_mean_to_import_an_implementation_f_2846", "A declaration file cannot be imported without 'import type'. Did you mean to import an implementation file '{0}' instead?"), Import_declaration_0_is_using_private_name_1: b(4e3, 1, "Import_declaration_0_is_using_private_name_1_4000", "Import declaration '{0}' is using private name '{1}'."), Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: b(4002, 1, "Type_parameter_0_of_exported_class_has_or_is_using_private_name_1_4002", "Type parameter '{0}' of exported class has or is using private name '{1}'."), Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: b(4004, 1, "Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1_4004", "Type parameter '{0}' of exported interface has or is using private name '{1}'."), Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1: b(4006, 1, "Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1_4006", "Type parameter '{0}' of constructor signature from exported interface has or is using private name '{1}'."), Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1: b(4008, 1, "Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1_4008", "Type parameter '{0}' of call signature from exported interface has or is using private name '{1}'."), Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1: b(4010, 1, "Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1_4010", "Type parameter '{0}' of public static method from exported class has or is using private name '{1}'."), Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1: b(4012, 1, "Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1_4012", "Type parameter '{0}' of public method from exported class has or is using private name '{1}'."), Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1: b(4014, 1, "Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1_4014", "Type parameter '{0}' of method from exported interface has or is using private name '{1}'."), Type_parameter_0_of_exported_function_has_or_is_using_private_name_1: b(4016, 1, "Type_parameter_0_of_exported_function_has_or_is_using_private_name_1_4016", "Type parameter '{0}' of exported function has or is using private name '{1}'."), Implements_clause_of_exported_class_0_has_or_is_using_private_name_1: b(4019, 1, "Implements_clause_of_exported_class_0_has_or_is_using_private_name_1_4019", "Implements clause of exported class '{0}' has or is using private name '{1}'."), extends_clause_of_exported_class_0_has_or_is_using_private_name_1: b(4020, 1, "extends_clause_of_exported_class_0_has_or_is_using_private_name_1_4020", "'extends' clause of exported class '{0}' has or is using private name '{1}'."), extends_clause_of_exported_class_has_or_is_using_private_name_0: b(4021, 1, "extends_clause_of_exported_class_has_or_is_using_private_name_0_4021", "'extends' clause of exported class has or is using private name '{0}'."), extends_clause_of_exported_interface_0_has_or_is_using_private_name_1: b(4022, 1, "extends_clause_of_exported_interface_0_has_or_is_using_private_name_1_4022", "'extends' clause of exported interface '{0}' has or is using private name '{1}'."), Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: b(4023, 1, "Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named_4023", "Exported variable '{0}' has or is using name '{1}' from external module {2} but cannot be named."), Exported_variable_0_has_or_is_using_name_1_from_private_module_2: b(4024, 1, "Exported_variable_0_has_or_is_using_name_1_from_private_module_2_4024", "Exported variable '{0}' has or is using name '{1}' from private module '{2}'."), Exported_variable_0_has_or_is_using_private_name_1: b(4025, 1, "Exported_variable_0_has_or_is_using_private_name_1_4025", "Exported variable '{0}' has or is using private name '{1}'."), Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: b(4026, 1, "Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot__4026", "Public static property '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named."), Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: b(4027, 1, "Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2_4027", "Public static property '{0}' of exported class has or is using name '{1}' from private module '{2}'."), Public_static_property_0_of_exported_class_has_or_is_using_private_name_1: b(4028, 1, "Public_static_property_0_of_exported_class_has_or_is_using_private_name_1_4028", "Public static property '{0}' of exported class has or is using private name '{1}'."), Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: b(4029, 1, "Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_name_4029", "Public property '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named."), Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: b(4030, 1, "Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2_4030", "Public property '{0}' of exported class has or is using name '{1}' from private module '{2}'."), Public_property_0_of_exported_class_has_or_is_using_private_name_1: b(4031, 1, "Public_property_0_of_exported_class_has_or_is_using_private_name_1_4031", "Public property '{0}' of exported class has or is using private name '{1}'."), Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2: b(4032, 1, "Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2_4032", "Property '{0}' of exported interface has or is using name '{1}' from private module '{2}'."), Property_0_of_exported_interface_has_or_is_using_private_name_1: b(4033, 1, "Property_0_of_exported_interface_has_or_is_using_private_name_1_4033", "Property '{0}' of exported interface has or is using private name '{1}'."), Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2: b(4034, 1, "Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_name_1_from_private_mod_4034", "Parameter type of public static setter '{0}' from exported class has or is using name '{1}' from private module '{2}'."), Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_private_name_1: b(4035, 1, "Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_private_name_1_4035", "Parameter type of public static setter '{0}' from exported class has or is using private name '{1}'."), Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2: b(4036, 1, "Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2_4036", "Parameter type of public setter '{0}' from exported class has or is using name '{1}' from private module '{2}'."), Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_private_name_1: b(4037, 1, "Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_private_name_1_4037", "Parameter type of public setter '{0}' from exported class has or is using private name '{1}'."), Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: b(4038, 1, "Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_external_modul_4038", "Return type of public static getter '{0}' from exported class has or is using name '{1}' from external module {2} but cannot be named."), Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2: b(4039, 1, "Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_4039", "Return type of public static getter '{0}' from exported class has or is using name '{1}' from private module '{2}'."), Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_private_name_1: b(4040, 1, "Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_private_name_1_4040", "Return type of public static getter '{0}' from exported class has or is using private name '{1}'."), Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: b(4041, 1, "Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_4041", "Return type of public getter '{0}' from exported class has or is using name '{1}' from external module {2} but cannot be named."), Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2: b(4042, 1, "Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2_4042", "Return type of public getter '{0}' from exported class has or is using name '{1}' from private module '{2}'."), Return_type_of_public_getter_0_from_exported_class_has_or_is_using_private_name_1: b(4043, 1, "Return_type_of_public_getter_0_from_exported_class_has_or_is_using_private_name_1_4043", "Return type of public getter '{0}' from exported class has or is using private name '{1}'."), Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: b(4044, 1, "Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_mod_4044", "Return type of constructor signature from exported interface has or is using name '{0}' from private module '{1}'."), Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0: b(4045, 1, "Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0_4045", "Return type of constructor signature from exported interface has or is using private name '{0}'."), Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: b(4046, 1, "Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1_4046", "Return type of call signature from exported interface has or is using name '{0}' from private module '{1}'."), Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0: b(4047, 1, "Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0_4047", "Return type of call signature from exported interface has or is using private name '{0}'."), Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: b(4048, 1, "Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1_4048", "Return type of index signature from exported interface has or is using name '{0}' from private module '{1}'."), Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0: b(4049, 1, "Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0_4049", "Return type of index signature from exported interface has or is using private name '{0}'."), Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: b(4050, 1, "Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module__4050", "Return type of public static method from exported class has or is using name '{0}' from external module {1} but cannot be named."), Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1: b(4051, 1, "Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1_4051", "Return type of public static method from exported class has or is using name '{0}' from private module '{1}'."), Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0: b(4052, 1, "Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0_4052", "Return type of public static method from exported class has or is using private name '{0}'."), Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: b(4053, 1, "Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_c_4053", "Return type of public method from exported class has or is using name '{0}' from external module {1} but cannot be named."), Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1: b(4054, 1, "Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1_4054", "Return type of public method from exported class has or is using name '{0}' from private module '{1}'."), Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0: b(4055, 1, "Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0_4055", "Return type of public method from exported class has or is using private name '{0}'."), Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1: b(4056, 1, "Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1_4056", "Return type of method from exported interface has or is using name '{0}' from private module '{1}'."), Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0: b(4057, 1, "Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0_4057", "Return type of method from exported interface has or is using private name '{0}'."), Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: b(4058, 1, "Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named_4058", "Return type of exported function has or is using name '{0}' from external module {1} but cannot be named."), Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1: b(4059, 1, "Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1_4059", "Return type of exported function has or is using name '{0}' from private module '{1}'."), Return_type_of_exported_function_has_or_is_using_private_name_0: b(4060, 1, "Return_type_of_exported_function_has_or_is_using_private_name_0_4060", "Return type of exported function has or is using private name '{0}'."), Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: b(4061, 1, "Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_can_4061", "Parameter '{0}' of constructor from exported class has or is using name '{1}' from external module {2} but cannot be named."), Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2: b(4062, 1, "Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2_4062", "Parameter '{0}' of constructor from exported class has or is using name '{1}' from private module '{2}'."), Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1: b(4063, 1, "Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1_4063", "Parameter '{0}' of constructor from exported class has or is using private name '{1}'."), Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2: b(4064, 1, "Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_mod_4064", "Parameter '{0}' of constructor signature from exported interface has or is using name '{1}' from private module '{2}'."), Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1: b(4065, 1, "Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1_4065", "Parameter '{0}' of constructor signature from exported interface has or is using private name '{1}'."), Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2: b(4066, 1, "Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2_4066", "Parameter '{0}' of call signature from exported interface has or is using name '{1}' from private module '{2}'."), Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1: b(4067, 1, "Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1_4067", "Parameter '{0}' of call signature from exported interface has or is using private name '{1}'."), Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: b(4068, 1, "Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module__4068", "Parameter '{0}' of public static method from exported class has or is using name '{1}' from external module {2} but cannot be named."), Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2: b(4069, 1, "Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2_4069", "Parameter '{0}' of public static method from exported class has or is using name '{1}' from private module '{2}'."), Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1: b(4070, 1, "Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1_4070", "Parameter '{0}' of public static method from exported class has or is using private name '{1}'."), Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: b(4071, 1, "Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_c_4071", "Parameter '{0}' of public method from exported class has or is using name '{1}' from external module {2} but cannot be named."), Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2: b(4072, 1, "Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2_4072", "Parameter '{0}' of public method from exported class has or is using name '{1}' from private module '{2}'."), Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1: b(4073, 1, "Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1_4073", "Parameter '{0}' of public method from exported class has or is using private name '{1}'."), Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2: b(4074, 1, "Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2_4074", "Parameter '{0}' of method from exported interface has or is using name '{1}' from private module '{2}'."), Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1: b(4075, 1, "Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1_4075", "Parameter '{0}' of method from exported interface has or is using private name '{1}'."), Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: b(4076, 1, "Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named_4076", "Parameter '{0}' of exported function has or is using name '{1}' from external module {2} but cannot be named."), Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2: b(4077, 1, "Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2_4077", "Parameter '{0}' of exported function has or is using name '{1}' from private module '{2}'."), Parameter_0_of_exported_function_has_or_is_using_private_name_1: b(4078, 1, "Parameter_0_of_exported_function_has_or_is_using_private_name_1_4078", "Parameter '{0}' of exported function has or is using private name '{1}'."), Exported_type_alias_0_has_or_is_using_private_name_1: b(4081, 1, "Exported_type_alias_0_has_or_is_using_private_name_1_4081", "Exported type alias '{0}' has or is using private name '{1}'."), Default_export_of_the_module_has_or_is_using_private_name_0: b(4082, 1, "Default_export_of_the_module_has_or_is_using_private_name_0_4082", "Default export of the module has or is using private name '{0}'."), Type_parameter_0_of_exported_type_alias_has_or_is_using_private_name_1: b(4083, 1, "Type_parameter_0_of_exported_type_alias_has_or_is_using_private_name_1_4083", "Type parameter '{0}' of exported type alias has or is using private name '{1}'."), Exported_type_alias_0_has_or_is_using_private_name_1_from_module_2: b(4084, 1, "Exported_type_alias_0_has_or_is_using_private_name_1_from_module_2_4084", "Exported type alias '{0}' has or is using private name '{1}' from module {2}."), Extends_clause_for_inferred_type_0_has_or_is_using_private_name_1: b(4085, 1, "Extends_clause_for_inferred_type_0_has_or_is_using_private_name_1_4085", "Extends clause for inferred type '{0}' has or is using private name '{1}'."), Conflicting_definitions_for_0_found_at_1_and_2_Consider_installing_a_specific_version_of_this_library_to_resolve_the_conflict: b(4090, 1, "Conflicting_definitions_for_0_found_at_1_and_2_Consider_installing_a_specific_version_of_this_librar_4090", "Conflicting definitions for '{0}' found at '{1}' and '{2}'. Consider installing a specific version of this library to resolve the conflict."), Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2: b(4091, 1, "Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2_4091", "Parameter '{0}' of index signature from exported interface has or is using name '{1}' from private module '{2}'."), Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_private_name_1: b(4092, 1, "Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_private_name_1_4092", "Parameter '{0}' of index signature from exported interface has or is using private name '{1}'."), Property_0_of_exported_class_expression_may_not_be_private_or_protected: b(4094, 1, "Property_0_of_exported_class_expression_may_not_be_private_or_protected_4094", "Property '{0}' of exported class expression may not be private or protected."), Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: b(4095, 1, "Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_4095", "Public static method '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named."), Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: b(4096, 1, "Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2_4096", "Public static method '{0}' of exported class has or is using name '{1}' from private module '{2}'."), Public_static_method_0_of_exported_class_has_or_is_using_private_name_1: b(4097, 1, "Public_static_method_0_of_exported_class_has_or_is_using_private_name_1_4097", "Public static method '{0}' of exported class has or is using private name '{1}'."), Public_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: b(4098, 1, "Public_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named_4098", "Public method '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named."), Public_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: b(4099, 1, "Public_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2_4099", "Public method '{0}' of exported class has or is using name '{1}' from private module '{2}'."), Public_method_0_of_exported_class_has_or_is_using_private_name_1: b(4100, 1, "Public_method_0_of_exported_class_has_or_is_using_private_name_1_4100", "Public method '{0}' of exported class has or is using private name '{1}'."), Method_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2: b(4101, 1, "Method_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2_4101", "Method '{0}' of exported interface has or is using name '{1}' from private module '{2}'."), Method_0_of_exported_interface_has_or_is_using_private_name_1: b(4102, 1, "Method_0_of_exported_interface_has_or_is_using_private_name_1_4102", "Method '{0}' of exported interface has or is using private name '{1}'."), Type_parameter_0_of_exported_mapped_object_type_is_using_private_name_1: b(4103, 1, "Type_parameter_0_of_exported_mapped_object_type_is_using_private_name_1_4103", "Type parameter '{0}' of exported mapped object type is using private name '{1}'."), The_type_0_is_readonly_and_cannot_be_assigned_to_the_mutable_type_1: b(4104, 1, "The_type_0_is_readonly_and_cannot_be_assigned_to_the_mutable_type_1_4104", "The type '{0}' is 'readonly' and cannot be assigned to the mutable type '{1}'."), Private_or_protected_member_0_cannot_be_accessed_on_a_type_parameter: b(4105, 1, "Private_or_protected_member_0_cannot_be_accessed_on_a_type_parameter_4105", "Private or protected member '{0}' cannot be accessed on a type parameter."), Parameter_0_of_accessor_has_or_is_using_private_name_1: b(4106, 1, "Parameter_0_of_accessor_has_or_is_using_private_name_1_4106", "Parameter '{0}' of accessor has or is using private name '{1}'."), Parameter_0_of_accessor_has_or_is_using_name_1_from_private_module_2: b(4107, 1, "Parameter_0_of_accessor_has_or_is_using_name_1_from_private_module_2_4107", "Parameter '{0}' of accessor has or is using name '{1}' from private module '{2}'."), Parameter_0_of_accessor_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: b(4108, 1, "Parameter_0_of_accessor_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named_4108", "Parameter '{0}' of accessor has or is using name '{1}' from external module '{2}' but cannot be named."), Type_arguments_for_0_circularly_reference_themselves: b(4109, 1, "Type_arguments_for_0_circularly_reference_themselves_4109", "Type arguments for '{0}' circularly reference themselves."), Tuple_type_arguments_circularly_reference_themselves: b(4110, 1, "Tuple_type_arguments_circularly_reference_themselves_4110", "Tuple type arguments circularly reference themselves."), Property_0_comes_from_an_index_signature_so_it_must_be_accessed_with_0: b(4111, 1, "Property_0_comes_from_an_index_signature_so_it_must_be_accessed_with_0_4111", "Property '{0}' comes from an index signature, so it must be accessed with ['{0}']."), This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class: b(4112, 1, "This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another__4112", "This member cannot have an 'override' modifier because its containing class '{0}' does not extend another class."), This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0: b(4113, 1, "This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_4113", "This member cannot have an 'override' modifier because it is not declared in the base class '{0}'."), This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0: b(4114, 1, "This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0_4114", "This member must have an 'override' modifier because it overrides a member in the base class '{0}'."), This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0: b(4115, 1, "This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0_4115", "This parameter property must have an 'override' modifier because it overrides a member in base class '{0}'."), This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0: b(4116, 1, "This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared__4116", "This member must have an 'override' modifier because it overrides an abstract method that is declared in the base class '{0}'."), This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1: b(4117, 1, "This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_Did_you__4117", "This member cannot have an 'override' modifier because it is not declared in the base class '{0}'. Did you mean '{1}'?"), The_type_of_this_node_cannot_be_serialized_because_its_property_0_cannot_be_serialized: b(4118, 1, "The_type_of_this_node_cannot_be_serialized_because_its_property_0_cannot_be_serialized_4118", "The type of this node cannot be serialized because its property '{0}' cannot be serialized."), This_member_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0: b(4119, 1, "This_member_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_4119", "This member must have a JSDoc comment with an '@override' tag because it overrides a member in the base class '{0}'."), This_parameter_property_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0: b(4120, 1, "This_parameter_property_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_4120", "This parameter property must have a JSDoc comment with an '@override' tag because it overrides a member in the base class '{0}'."), This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_extend_another_class: b(4121, 1, "This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_4121", "This member cannot have a JSDoc comment with an '@override' tag because its containing class '{0}' does not extend another class."), This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0: b(4122, 1, "This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base__4122", "This member cannot have a JSDoc comment with an '@override' tag because it is not declared in the base class '{0}'."), This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1: b(4123, 1, "This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base__4123", "This member cannot have a JSDoc comment with an 'override' tag because it is not declared in the base class '{0}'. Did you mean '{1}'?"), Compiler_option_0_of_value_1_is_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next: b(4124, 1, "Compiler_option_0_of_value_1_is_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_w_4124", "Compiler option '{0}' of value '{1}' is unstable. Use nightly TypeScript to silence this error. Try updating with 'npm install -D typescript@next'."), resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next: b(4125, 1, "resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_wi_4125", "'resolution-mode' assertions are unstable. Use nightly TypeScript to silence this error. Try updating with 'npm install -D typescript@next'."), The_current_host_does_not_support_the_0_option: b(5001, 1, "The_current_host_does_not_support_the_0_option_5001", "The current host does not support the '{0}' option."), Cannot_find_the_common_subdirectory_path_for_the_input_files: b(5009, 1, "Cannot_find_the_common_subdirectory_path_for_the_input_files_5009", "Cannot find the common subdirectory path for the input files."), File_specification_cannot_end_in_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0: b(5010, 1, "File_specification_cannot_end_in_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0_5010", "File specification cannot end in a recursive directory wildcard ('**'): '{0}'."), Cannot_read_file_0_Colon_1: b(5012, 1, "Cannot_read_file_0_Colon_1_5012", "Cannot read file '{0}': {1}."), Failed_to_parse_file_0_Colon_1: b(5014, 1, "Failed_to_parse_file_0_Colon_1_5014", "Failed to parse file '{0}': {1}."), Unknown_compiler_option_0: b(5023, 1, "Unknown_compiler_option_0_5023", "Unknown compiler option '{0}'."), Compiler_option_0_requires_a_value_of_type_1: b(5024, 1, "Compiler_option_0_requires_a_value_of_type_1_5024", "Compiler option '{0}' requires a value of type {1}."), Unknown_compiler_option_0_Did_you_mean_1: b(5025, 1, "Unknown_compiler_option_0_Did_you_mean_1_5025", "Unknown compiler option '{0}'. Did you mean '{1}'?"), Could_not_write_file_0_Colon_1: b(5033, 1, "Could_not_write_file_0_Colon_1_5033", "Could not write file '{0}': {1}."), Option_project_cannot_be_mixed_with_source_files_on_a_command_line: b(5042, 1, "Option_project_cannot_be_mixed_with_source_files_on_a_command_line_5042", "Option 'project' cannot be mixed with source files on a command line."), Option_isolatedModules_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES2015_or_higher: b(5047, 1, "Option_isolatedModules_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES_5047", "Option 'isolatedModules' can only be used when either option '--module' is provided or option 'target' is 'ES2015' or higher."), Option_0_cannot_be_specified_when_option_target_is_ES3: b(5048, 1, "Option_0_cannot_be_specified_when_option_target_is_ES3_5048", "Option '{0}' cannot be specified when option 'target' is 'ES3'."), Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided: b(5051, 1, "Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided_5051", "Option '{0} can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided."), Option_0_cannot_be_specified_without_specifying_option_1: b(5052, 1, "Option_0_cannot_be_specified_without_specifying_option_1_5052", "Option '{0}' cannot be specified without specifying option '{1}'."), Option_0_cannot_be_specified_with_option_1: b(5053, 1, "Option_0_cannot_be_specified_with_option_1_5053", "Option '{0}' cannot be specified with option '{1}'."), A_tsconfig_json_file_is_already_defined_at_Colon_0: b(5054, 1, "A_tsconfig_json_file_is_already_defined_at_Colon_0_5054", "A 'tsconfig.json' file is already defined at: '{0}'."), Cannot_write_file_0_because_it_would_overwrite_input_file: b(5055, 1, "Cannot_write_file_0_because_it_would_overwrite_input_file_5055", "Cannot write file '{0}' because it would overwrite input file."), Cannot_write_file_0_because_it_would_be_overwritten_by_multiple_input_files: b(5056, 1, "Cannot_write_file_0_because_it_would_be_overwritten_by_multiple_input_files_5056", "Cannot write file '{0}' because it would be overwritten by multiple input files."), Cannot_find_a_tsconfig_json_file_at_the_specified_directory_Colon_0: b(5057, 1, "Cannot_find_a_tsconfig_json_file_at_the_specified_directory_Colon_0_5057", "Cannot find a tsconfig.json file at the specified directory: '{0}'."), The_specified_path_does_not_exist_Colon_0: b(5058, 1, "The_specified_path_does_not_exist_Colon_0_5058", "The specified path does not exist: '{0}'."), Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier: b(5059, 1, "Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier_5059", "Invalid value for '--reactNamespace'. '{0}' is not a valid identifier."), Pattern_0_can_have_at_most_one_Asterisk_character: b(5061, 1, "Pattern_0_can_have_at_most_one_Asterisk_character_5061", "Pattern '{0}' can have at most one '*' character."), Substitution_0_in_pattern_1_can_have_at_most_one_Asterisk_character: b(5062, 1, "Substitution_0_in_pattern_1_can_have_at_most_one_Asterisk_character_5062", "Substitution '{0}' in pattern '{1}' can have at most one '*' character."), Substitutions_for_pattern_0_should_be_an_array: b(5063, 1, "Substitutions_for_pattern_0_should_be_an_array_5063", "Substitutions for pattern '{0}' should be an array."), Substitution_0_for_pattern_1_has_incorrect_type_expected_string_got_2: b(5064, 1, "Substitution_0_for_pattern_1_has_incorrect_type_expected_string_got_2_5064", "Substitution '{0}' for pattern '{1}' has incorrect type, expected 'string', got '{2}'."), File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0: b(5065, 1, "File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildca_5065", "File specification cannot contain a parent directory ('..') that appears after a recursive directory wildcard ('**'): '{0}'."), Substitutions_for_pattern_0_shouldn_t_be_an_empty_array: b(5066, 1, "Substitutions_for_pattern_0_shouldn_t_be_an_empty_array_5066", "Substitutions for pattern '{0}' shouldn't be an empty array."), Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name: b(5067, 1, "Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name_5067", "Invalid value for 'jsxFactory'. '{0}' is not a valid identifier or qualified-name."), Adding_a_tsconfig_json_file_will_help_organize_projects_that_contain_both_TypeScript_and_JavaScript_files_Learn_more_at_https_Colon_Slash_Slashaka_ms_Slashtsconfig: b(5068, 1, "Adding_a_tsconfig_json_file_will_help_organize_projects_that_contain_both_TypeScript_and_JavaScript__5068", "Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig."), Option_0_cannot_be_specified_without_specifying_option_1_or_option_2: b(5069, 1, "Option_0_cannot_be_specified_without_specifying_option_1_or_option_2_5069", "Option '{0}' cannot be specified without specifying option '{1}' or option '{2}'."), Option_resolveJsonModule_cannot_be_specified_when_moduleResolution_is_set_to_classic: b(5070, 1, "Option_resolveJsonModule_cannot_be_specified_when_moduleResolution_is_set_to_classic_5070", "Option '--resolveJsonModule' cannot be specified when 'moduleResolution' is set to 'classic'."), Option_resolveJsonModule_can_only_be_specified_when_module_code_generation_is_commonjs_amd_es2015_or_esNext: b(5071, 1, "Option_resolveJsonModule_can_only_be_specified_when_module_code_generation_is_commonjs_amd_es2015_or_5071", "Option '--resolveJsonModule' can only be specified when module code generation is 'commonjs', 'amd', 'es2015' or 'esNext'."), Unknown_build_option_0: b(5072, 1, "Unknown_build_option_0_5072", "Unknown build option '{0}'."), Build_option_0_requires_a_value_of_type_1: b(5073, 1, "Build_option_0_requires_a_value_of_type_1_5073", "Build option '{0}' requires a value of type {1}."), Option_incremental_can_only_be_specified_using_tsconfig_emitting_to_single_file_or_when_option_tsBuildInfoFile_is_specified: b(5074, 1, "Option_incremental_can_only_be_specified_using_tsconfig_emitting_to_single_file_or_when_option_tsBui_5074", "Option '--incremental' can only be specified using tsconfig, emitting to single file or when option '--tsBuildInfoFile' is specified."), _0_is_assignable_to_the_constraint_of_type_1_but_1_could_be_instantiated_with_a_different_subtype_of_constraint_2: b(5075, 1, "_0_is_assignable_to_the_constraint_of_type_1_but_1_could_be_instantiated_with_a_different_subtype_of_5075", "'{0}' is assignable to the constraint of type '{1}', but '{1}' could be instantiated with a different subtype of constraint '{2}'."), _0_and_1_operations_cannot_be_mixed_without_parentheses: b(5076, 1, "_0_and_1_operations_cannot_be_mixed_without_parentheses_5076", "'{0}' and '{1}' operations cannot be mixed without parentheses."), Unknown_build_option_0_Did_you_mean_1: b(5077, 1, "Unknown_build_option_0_Did_you_mean_1_5077", "Unknown build option '{0}'. Did you mean '{1}'?"), Unknown_watch_option_0: b(5078, 1, "Unknown_watch_option_0_5078", "Unknown watch option '{0}'."), Unknown_watch_option_0_Did_you_mean_1: b(5079, 1, "Unknown_watch_option_0_Did_you_mean_1_5079", "Unknown watch option '{0}'. Did you mean '{1}'?"), Watch_option_0_requires_a_value_of_type_1: b(5080, 1, "Watch_option_0_requires_a_value_of_type_1_5080", "Watch option '{0}' requires a value of type {1}."), Cannot_find_a_tsconfig_json_file_at_the_current_directory_Colon_0: b(5081, 1, "Cannot_find_a_tsconfig_json_file_at_the_current_directory_Colon_0_5081", "Cannot find a tsconfig.json file at the current directory: {0}."), _0_could_be_instantiated_with_an_arbitrary_type_which_could_be_unrelated_to_1: b(5082, 1, "_0_could_be_instantiated_with_an_arbitrary_type_which_could_be_unrelated_to_1_5082", "'{0}' could be instantiated with an arbitrary type which could be unrelated to '{1}'."), Cannot_read_file_0: b(5083, 1, "Cannot_read_file_0_5083", "Cannot read file '{0}'."), Tuple_members_must_all_have_names_or_all_not_have_names: b(5084, 1, "Tuple_members_must_all_have_names_or_all_not_have_names_5084", "Tuple members must all have names or all not have names."), A_tuple_member_cannot_be_both_optional_and_rest: b(5085, 1, "A_tuple_member_cannot_be_both_optional_and_rest_5085", "A tuple member cannot be both optional and rest."), A_labeled_tuple_element_is_declared_as_optional_with_a_question_mark_after_the_name_and_before_the_colon_rather_than_after_the_type: b(5086, 1, "A_labeled_tuple_element_is_declared_as_optional_with_a_question_mark_after_the_name_and_before_the_c_5086", "A labeled tuple element is declared as optional with a question mark after the name and before the colon, rather than after the type."), A_labeled_tuple_element_is_declared_as_rest_with_a_before_the_name_rather_than_before_the_type: b(5087, 1, "A_labeled_tuple_element_is_declared_as_rest_with_a_before_the_name_rather_than_before_the_type_5087", "A labeled tuple element is declared as rest with a '...' before the name, rather than before the type."), The_inferred_type_of_0_references_a_type_with_a_cyclic_structure_which_cannot_be_trivially_serialized_A_type_annotation_is_necessary: b(5088, 1, "The_inferred_type_of_0_references_a_type_with_a_cyclic_structure_which_cannot_be_trivially_serialize_5088", "The inferred type of '{0}' references a type with a cyclic structure which cannot be trivially serialized. A type annotation is necessary."), Option_0_cannot_be_specified_when_option_jsx_is_1: b(5089, 1, "Option_0_cannot_be_specified_when_option_jsx_is_1_5089", "Option '{0}' cannot be specified when option 'jsx' is '{1}'."), Non_relative_paths_are_not_allowed_when_baseUrl_is_not_set_Did_you_forget_a_leading_Slash: b(5090, 1, "Non_relative_paths_are_not_allowed_when_baseUrl_is_not_set_Did_you_forget_a_leading_Slash_5090", "Non-relative paths are not allowed when 'baseUrl' is not set. Did you forget a leading './'?"), Option_preserveConstEnums_cannot_be_disabled_when_0_is_enabled: b(5091, 1, "Option_preserveConstEnums_cannot_be_disabled_when_0_is_enabled_5091", "Option 'preserveConstEnums' cannot be disabled when '{0}' is enabled."), The_root_value_of_a_0_file_must_be_an_object: b(5092, 1, "The_root_value_of_a_0_file_must_be_an_object_5092", "The root value of a '{0}' file must be an object."), Compiler_option_0_may_only_be_used_with_build: b(5093, 1, "Compiler_option_0_may_only_be_used_with_build_5093", "Compiler option '--{0}' may only be used with '--build'."), Compiler_option_0_may_not_be_used_with_build: b(5094, 1, "Compiler_option_0_may_not_be_used_with_build_5094", "Compiler option '--{0}' may not be used with '--build'."), Option_0_can_only_be_used_when_module_is_set_to_es2015_or_later: b(5095, 1, "Option_0_can_only_be_used_when_module_is_set_to_es2015_or_later_5095", "Option '{0}' can only be used when 'module' is set to 'es2015' or later."), Option_allowImportingTsExtensions_can_only_be_used_when_either_noEmit_or_emitDeclarationOnly_is_set: b(5096, 1, "Option_allowImportingTsExtensions_can_only_be_used_when_either_noEmit_or_emitDeclarationOnly_is_set_5096", "Option 'allowImportingTsExtensions' can only be used when either 'noEmit' or 'emitDeclarationOnly' is set."), An_import_path_can_only_end_with_a_0_extension_when_allowImportingTsExtensions_is_enabled: b(5097, 1, "An_import_path_can_only_end_with_a_0_extension_when_allowImportingTsExtensions_is_enabled_5097", "An import path can only end with a '{0}' extension when 'allowImportingTsExtensions' is enabled."), Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler: b(5098, 1, "Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler_5098", "Option '{0}' can only be used when 'moduleResolution' is set to 'node16', 'nodenext', or 'bundler'."), Option_0_is_deprecated_and_will_stop_functioning_in_TypeScript_1_Specify_compilerOption_ignoreDeprecations_Colon_2_to_silence_this_error: b(5101, 1, "Option_0_is_deprecated_and_will_stop_functioning_in_TypeScript_1_Specify_compilerOption_ignoreDeprec_5101", `Option '{0}' is deprecated and will stop functioning in TypeScript {1}. Specify compilerOption '"ignoreDeprecations": "{2}"' to silence this error.`), Option_0_has_been_removed_Please_remove_it_from_your_configuration: b(5102, 1, "Option_0_has_been_removed_Please_remove_it_from_your_configuration_5102", "Option '{0}' has been removed. Please remove it from your configuration."), Invalid_value_for_ignoreDeprecations: b(5103, 1, "Invalid_value_for_ignoreDeprecations_5103", "Invalid value for '--ignoreDeprecations'."), Option_0_is_redundant_and_cannot_be_specified_with_option_1: b(5104, 1, "Option_0_is_redundant_and_cannot_be_specified_with_option_1_5104", "Option '{0}' is redundant and cannot be specified with option '{1}'."), Option_verbatimModuleSyntax_cannot_be_used_when_module_is_set_to_UMD_AMD_or_System: b(5105, 1, "Option_verbatimModuleSyntax_cannot_be_used_when_module_is_set_to_UMD_AMD_or_System_5105", "Option 'verbatimModuleSyntax' cannot be used when 'module' is set to 'UMD', 'AMD', or 'System'."), Use_0_instead: b(5106, 3, "Use_0_instead_5106", "Use '{0}' instead."), Option_0_1_is_deprecated_and_will_stop_functioning_in_TypeScript_2_Specify_compilerOption_ignoreDeprecations_Colon_3_to_silence_this_error: b(5107, 1, "Option_0_1_is_deprecated_and_will_stop_functioning_in_TypeScript_2_Specify_compilerOption_ignoreDepr_5107", `Option '{0}={1}' is deprecated and will stop functioning in TypeScript {2}. Specify compilerOption '"ignoreDeprecations": "{3}"' to silence this error.`), Option_0_1_has_been_removed_Please_remove_it_from_your_configuration: b(5108, 1, "Option_0_1_has_been_removed_Please_remove_it_from_your_configuration_5108", "Option '{0}={1}' has been removed. Please remove it from your configuration."), Generates_a_sourcemap_for_each_corresponding_d_ts_file: b(6e3, 3, "Generates_a_sourcemap_for_each_corresponding_d_ts_file_6000", "Generates a sourcemap for each corresponding '.d.ts' file."), Concatenate_and_emit_output_to_single_file: b(6001, 3, "Concatenate_and_emit_output_to_single_file_6001", "Concatenate and emit output to single file."), Generates_corresponding_d_ts_file: b(6002, 3, "Generates_corresponding_d_ts_file_6002", "Generates corresponding '.d.ts' file."), Specify_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations: b(6004, 3, "Specify_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations_6004", "Specify the location where debugger should locate TypeScript files instead of source locations."), Watch_input_files: b(6005, 3, "Watch_input_files_6005", "Watch input files."), Redirect_output_structure_to_the_directory: b(6006, 3, "Redirect_output_structure_to_the_directory_6006", "Redirect output structure to the directory."), Do_not_erase_const_enum_declarations_in_generated_code: b(6007, 3, "Do_not_erase_const_enum_declarations_in_generated_code_6007", "Do not erase const enum declarations in generated code."), Do_not_emit_outputs_if_any_errors_were_reported: b(6008, 3, "Do_not_emit_outputs_if_any_errors_were_reported_6008", "Do not emit outputs if any errors were reported."), Do_not_emit_comments_to_output: b(6009, 3, "Do_not_emit_comments_to_output_6009", "Do not emit comments to output."), Do_not_emit_outputs: b(6010, 3, "Do_not_emit_outputs_6010", "Do not emit outputs."), Allow_default_imports_from_modules_with_no_default_export_This_does_not_affect_code_emit_just_typechecking: b(6011, 3, "Allow_default_imports_from_modules_with_no_default_export_This_does_not_affect_code_emit_just_typech_6011", "Allow default imports from modules with no default export. This does not affect code emit, just typechecking."), Skip_type_checking_of_declaration_files: b(6012, 3, "Skip_type_checking_of_declaration_files_6012", "Skip type checking of declaration files."), Do_not_resolve_the_real_path_of_symlinks: b(6013, 3, "Do_not_resolve_the_real_path_of_symlinks_6013", "Do not resolve the real path of symlinks."), Only_emit_d_ts_declaration_files: b(6014, 3, "Only_emit_d_ts_declaration_files_6014", "Only emit '.d.ts' declaration files."), Specify_ECMAScript_target_version: b(6015, 3, "Specify_ECMAScript_target_version_6015", "Specify ECMAScript target version."), Specify_module_code_generation: b(6016, 3, "Specify_module_code_generation_6016", "Specify module code generation."), Print_this_message: b(6017, 3, "Print_this_message_6017", "Print this message."), Print_the_compiler_s_version: b(6019, 3, "Print_the_compiler_s_version_6019", "Print the compiler's version."), Compile_the_project_given_the_path_to_its_configuration_file_or_to_a_folder_with_a_tsconfig_json: b(6020, 3, "Compile_the_project_given_the_path_to_its_configuration_file_or_to_a_folder_with_a_tsconfig_json_6020", "Compile the project given the path to its configuration file, or to a folder with a 'tsconfig.json'."), Syntax_Colon_0: b(6023, 3, "Syntax_Colon_0_6023", "Syntax: {0}"), options: b(6024, 3, "options_6024", "options"), file: b(6025, 3, "file_6025", "file"), Examples_Colon_0: b(6026, 3, "Examples_Colon_0_6026", "Examples: {0}"), Options_Colon: b(6027, 3, "Options_Colon_6027", "Options:"), Version_0: b(6029, 3, "Version_0_6029", "Version {0}"), Insert_command_line_options_and_files_from_a_file: b(6030, 3, "Insert_command_line_options_and_files_from_a_file_6030", "Insert command line options and files from a file."), Starting_compilation_in_watch_mode: b(6031, 3, "Starting_compilation_in_watch_mode_6031", "Starting compilation in watch mode..."), File_change_detected_Starting_incremental_compilation: b(6032, 3, "File_change_detected_Starting_incremental_compilation_6032", "File change detected. Starting incremental compilation..."), KIND: b(6034, 3, "KIND_6034", "KIND"), FILE: b(6035, 3, "FILE_6035", "FILE"), VERSION: b(6036, 3, "VERSION_6036", "VERSION"), LOCATION: b(6037, 3, "LOCATION_6037", "LOCATION"), DIRECTORY: b(6038, 3, "DIRECTORY_6038", "DIRECTORY"), STRATEGY: b(6039, 3, "STRATEGY_6039", "STRATEGY"), FILE_OR_DIRECTORY: b(6040, 3, "FILE_OR_DIRECTORY_6040", "FILE OR DIRECTORY"), Errors_Files: b(6041, 3, "Errors_Files_6041", "Errors  Files"), Generates_corresponding_map_file: b(6043, 3, "Generates_corresponding_map_file_6043", "Generates corresponding '.map' file."), Compiler_option_0_expects_an_argument: b(6044, 1, "Compiler_option_0_expects_an_argument_6044", "Compiler option '{0}' expects an argument."), Unterminated_quoted_string_in_response_file_0: b(6045, 1, "Unterminated_quoted_string_in_response_file_0_6045", "Unterminated quoted string in response file '{0}'."), Argument_for_0_option_must_be_Colon_1: b(6046, 1, "Argument_for_0_option_must_be_Colon_1_6046", "Argument for '{0}' option must be: {1}."), Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1: b(6048, 1, "Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1_6048", "Locale must be of the form <language> or <language>-<territory>. For example '{0}' or '{1}'."), Unable_to_open_file_0: b(6050, 1, "Unable_to_open_file_0_6050", "Unable to open file '{0}'."), Corrupted_locale_file_0: b(6051, 1, "Corrupted_locale_file_0_6051", "Corrupted locale file {0}."), Raise_error_on_expressions_and_declarations_with_an_implied_any_type: b(6052, 3, "Raise_error_on_expressions_and_declarations_with_an_implied_any_type_6052", "Raise error on expressions and declarations with an implied 'any' type."), File_0_not_found: b(6053, 1, "File_0_not_found_6053", "File '{0}' not found."), File_0_has_an_unsupported_extension_The_only_supported_extensions_are_1: b(6054, 1, "File_0_has_an_unsupported_extension_The_only_supported_extensions_are_1_6054", "File '{0}' has an unsupported extension. The only supported extensions are {1}."), Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures: b(6055, 3, "Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures_6055", "Suppress noImplicitAny errors for indexing objects lacking index signatures."), Do_not_emit_declarations_for_code_that_has_an_internal_annotation: b(6056, 3, "Do_not_emit_declarations_for_code_that_has_an_internal_annotation_6056", "Do not emit declarations for code that has an '@internal' annotation."), Specify_the_root_directory_of_input_files_Use_to_control_the_output_directory_structure_with_outDir: b(6058, 3, "Specify_the_root_directory_of_input_files_Use_to_control_the_output_directory_structure_with_outDir_6058", "Specify the root directory of input files. Use to control the output directory structure with --outDir."), File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files: b(6059, 1, "File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files_6059", "File '{0}' is not under 'rootDir' '{1}'. 'rootDir' is expected to contain all source files."), Specify_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix: b(6060, 3, "Specify_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix_6060", "Specify the end of line sequence to be used when emitting files: 'CRLF' (dos) or 'LF' (unix)."), NEWLINE: b(6061, 3, "NEWLINE_6061", "NEWLINE"), Option_0_can_only_be_specified_in_tsconfig_json_file_or_set_to_null_on_command_line: b(6064, 1, "Option_0_can_only_be_specified_in_tsconfig_json_file_or_set_to_null_on_command_line_6064", "Option '{0}' can only be specified in 'tsconfig.json' file or set to 'null' on command line."), Enables_experimental_support_for_ES7_decorators: b(6065, 3, "Enables_experimental_support_for_ES7_decorators_6065", "Enables experimental support for ES7 decorators."), Enables_experimental_support_for_emitting_type_metadata_for_decorators: b(6066, 3, "Enables_experimental_support_for_emitting_type_metadata_for_decorators_6066", "Enables experimental support for emitting type metadata for decorators."), Initializes_a_TypeScript_project_and_creates_a_tsconfig_json_file: b(6070, 3, "Initializes_a_TypeScript_project_and_creates_a_tsconfig_json_file_6070", "Initializes a TypeScript project and creates a tsconfig.json file."), Successfully_created_a_tsconfig_json_file: b(6071, 3, "Successfully_created_a_tsconfig_json_file_6071", "Successfully created a tsconfig.json file."), Suppress_excess_property_checks_for_object_literals: b(6072, 3, "Suppress_excess_property_checks_for_object_literals_6072", "Suppress excess property checks for object literals."), Stylize_errors_and_messages_using_color_and_context_experimental: b(6073, 3, "Stylize_errors_and_messages_using_color_and_context_experimental_6073", "Stylize errors and messages using color and context (experimental)."), Do_not_report_errors_on_unused_labels: b(6074, 3, "Do_not_report_errors_on_unused_labels_6074", "Do not report errors on unused labels."), Report_error_when_not_all_code_paths_in_function_return_a_value: b(6075, 3, "Report_error_when_not_all_code_paths_in_function_return_a_value_6075", "Report error when not all code paths in function return a value."), Report_errors_for_fallthrough_cases_in_switch_statement: b(6076, 3, "Report_errors_for_fallthrough_cases_in_switch_statement_6076", "Report errors for fallthrough cases in switch statement."), Do_not_report_errors_on_unreachable_code: b(6077, 3, "Do_not_report_errors_on_unreachable_code_6077", "Do not report errors on unreachable code."), Disallow_inconsistently_cased_references_to_the_same_file: b(6078, 3, "Disallow_inconsistently_cased_references_to_the_same_file_6078", "Disallow inconsistently-cased references to the same file."), Specify_library_files_to_be_included_in_the_compilation: b(6079, 3, "Specify_library_files_to_be_included_in_the_compilation_6079", "Specify library files to be included in the compilation."), Specify_JSX_code_generation: b(6080, 3, "Specify_JSX_code_generation_6080", "Specify JSX code generation."), File_0_has_an_unsupported_extension_so_skipping_it: b(6081, 3, "File_0_has_an_unsupported_extension_so_skipping_it_6081", "File '{0}' has an unsupported extension, so skipping it."), Only_amd_and_system_modules_are_supported_alongside_0: b(6082, 1, "Only_amd_and_system_modules_are_supported_alongside_0_6082", "Only 'amd' and 'system' modules are supported alongside --{0}."), Base_directory_to_resolve_non_absolute_module_names: b(6083, 3, "Base_directory_to_resolve_non_absolute_module_names_6083", "Base directory to resolve non-absolute module names."), Deprecated_Use_jsxFactory_instead_Specify_the_object_invoked_for_createElement_when_targeting_react_JSX_emit: b(6084, 3, "Deprecated_Use_jsxFactory_instead_Specify_the_object_invoked_for_createElement_when_targeting_react__6084", "[Deprecated] Use '--jsxFactory' instead. Specify the object invoked for createElement when targeting 'react' JSX emit"), Enable_tracing_of_the_name_resolution_process: b(6085, 3, "Enable_tracing_of_the_name_resolution_process_6085", "Enable tracing of the name resolution process."), Resolving_module_0_from_1: b(6086, 3, "Resolving_module_0_from_1_6086", "======== Resolving module '{0}' from '{1}'. ========"), Explicitly_specified_module_resolution_kind_Colon_0: b(6087, 3, "Explicitly_specified_module_resolution_kind_Colon_0_6087", "Explicitly specified module resolution kind: '{0}'."), Module_resolution_kind_is_not_specified_using_0: b(6088, 3, "Module_resolution_kind_is_not_specified_using_0_6088", "Module resolution kind is not specified, using '{0}'."), Module_name_0_was_successfully_resolved_to_1: b(6089, 3, "Module_name_0_was_successfully_resolved_to_1_6089", "======== Module name '{0}' was successfully resolved to '{1}'. ========"), Module_name_0_was_not_resolved: b(6090, 3, "Module_name_0_was_not_resolved_6090", "======== Module name '{0}' was not resolved. ========"), paths_option_is_specified_looking_for_a_pattern_to_match_module_name_0: b(6091, 3, "paths_option_is_specified_looking_for_a_pattern_to_match_module_name_0_6091", "'paths' option is specified, looking for a pattern to match module name '{0}'."), Module_name_0_matched_pattern_1: b(6092, 3, "Module_name_0_matched_pattern_1_6092", "Module name '{0}', matched pattern '{1}'."), Trying_substitution_0_candidate_module_location_Colon_1: b(6093, 3, "Trying_substitution_0_candidate_module_location_Colon_1_6093", "Trying substitution '{0}', candidate module location: '{1}'."), Resolving_module_name_0_relative_to_base_url_1_2: b(6094, 3, "Resolving_module_name_0_relative_to_base_url_1_2_6094", "Resolving module name '{0}' relative to base url '{1}' - '{2}'."), Loading_module_as_file_Slash_folder_candidate_module_location_0_target_file_types_Colon_1: b(6095, 3, "Loading_module_as_file_Slash_folder_candidate_module_location_0_target_file_types_Colon_1_6095", "Loading module as file / folder, candidate module location '{0}', target file types: {1}."), File_0_does_not_exist: b(6096, 3, "File_0_does_not_exist_6096", "File '{0}' does not exist."), File_0_exists_use_it_as_a_name_resolution_result: b(6097, 3, "File_0_exists_use_it_as_a_name_resolution_result_6097", "File '{0}' exists - use it as a name resolution result."), Loading_module_0_from_node_modules_folder_target_file_types_Colon_1: b(6098, 3, "Loading_module_0_from_node_modules_folder_target_file_types_Colon_1_6098", "Loading module '{0}' from 'node_modules' folder, target file types: {1}."), Found_package_json_at_0: b(6099, 3, "Found_package_json_at_0_6099", "Found 'package.json' at '{0}'."), package_json_does_not_have_a_0_field: b(6100, 3, "package_json_does_not_have_a_0_field_6100", "'package.json' does not have a '{0}' field."), package_json_has_0_field_1_that_references_2: b(6101, 3, "package_json_has_0_field_1_that_references_2_6101", "'package.json' has '{0}' field '{1}' that references '{2}'."), Allow_javascript_files_to_be_compiled: b(6102, 3, "Allow_javascript_files_to_be_compiled_6102", "Allow javascript files to be compiled."), Checking_if_0_is_the_longest_matching_prefix_for_1_2: b(6104, 3, "Checking_if_0_is_the_longest_matching_prefix_for_1_2_6104", "Checking if '{0}' is the longest matching prefix for '{1}' - '{2}'."), Expected_type_of_0_field_in_package_json_to_be_1_got_2: b(6105, 3, "Expected_type_of_0_field_in_package_json_to_be_1_got_2_6105", "Expected type of '{0}' field in 'package.json' to be '{1}', got '{2}'."), baseUrl_option_is_set_to_0_using_this_value_to_resolve_non_relative_module_name_1: b(6106, 3, "baseUrl_option_is_set_to_0_using_this_value_to_resolve_non_relative_module_name_1_6106", "'baseUrl' option is set to '{0}', using this value to resolve non-relative module name '{1}'."), rootDirs_option_is_set_using_it_to_resolve_relative_module_name_0: b(6107, 3, "rootDirs_option_is_set_using_it_to_resolve_relative_module_name_0_6107", "'rootDirs' option is set, using it to resolve relative module name '{0}'."), Longest_matching_prefix_for_0_is_1: b(6108, 3, "Longest_matching_prefix_for_0_is_1_6108", "Longest matching prefix for '{0}' is '{1}'."), Loading_0_from_the_root_dir_1_candidate_location_2: b(6109, 3, "Loading_0_from_the_root_dir_1_candidate_location_2_6109", "Loading '{0}' from the root dir '{1}', candidate location '{2}'."), Trying_other_entries_in_rootDirs: b(6110, 3, "Trying_other_entries_in_rootDirs_6110", "Trying other entries in 'rootDirs'."), Module_resolution_using_rootDirs_has_failed: b(6111, 3, "Module_resolution_using_rootDirs_has_failed_6111", "Module resolution using 'rootDirs' has failed."), Do_not_emit_use_strict_directives_in_module_output: b(6112, 3, "Do_not_emit_use_strict_directives_in_module_output_6112", "Do not emit 'use strict' directives in module output."), Enable_strict_null_checks: b(6113, 3, "Enable_strict_null_checks_6113", "Enable strict null checks."), Unknown_option_excludes_Did_you_mean_exclude: b(6114, 1, "Unknown_option_excludes_Did_you_mean_exclude_6114", "Unknown option 'excludes'. Did you mean 'exclude'?"), Raise_error_on_this_expressions_with_an_implied_any_type: b(6115, 3, "Raise_error_on_this_expressions_with_an_implied_any_type_6115", "Raise error on 'this' expressions with an implied 'any' type."), Resolving_type_reference_directive_0_containing_file_1_root_directory_2: b(6116, 3, "Resolving_type_reference_directive_0_containing_file_1_root_directory_2_6116", "======== Resolving type reference directive '{0}', containing file '{1}', root directory '{2}'. ========"), Type_reference_directive_0_was_successfully_resolved_to_1_primary_Colon_2: b(6119, 3, "Type_reference_directive_0_was_successfully_resolved_to_1_primary_Colon_2_6119", "======== Type reference directive '{0}' was successfully resolved to '{1}', primary: {2}. ========"), Type_reference_directive_0_was_not_resolved: b(6120, 3, "Type_reference_directive_0_was_not_resolved_6120", "======== Type reference directive '{0}' was not resolved. ========"), Resolving_with_primary_search_path_0: b(6121, 3, "Resolving_with_primary_search_path_0_6121", "Resolving with primary search path '{0}'."), Root_directory_cannot_be_determined_skipping_primary_search_paths: b(6122, 3, "Root_directory_cannot_be_determined_skipping_primary_search_paths_6122", "Root directory cannot be determined, skipping primary search paths."), Resolving_type_reference_directive_0_containing_file_1_root_directory_not_set: b(6123, 3, "Resolving_type_reference_directive_0_containing_file_1_root_directory_not_set_6123", "======== Resolving type reference directive '{0}', containing file '{1}', root directory not set. ========"), Type_declaration_files_to_be_included_in_compilation: b(6124, 3, "Type_declaration_files_to_be_included_in_compilation_6124", "Type declaration files to be included in compilation."), Looking_up_in_node_modules_folder_initial_location_0: b(6125, 3, "Looking_up_in_node_modules_folder_initial_location_0_6125", "Looking up in 'node_modules' folder, initial location '{0}'."), Containing_file_is_not_specified_and_root_directory_cannot_be_determined_skipping_lookup_in_node_modules_folder: b(6126, 3, "Containing_file_is_not_specified_and_root_directory_cannot_be_determined_skipping_lookup_in_node_mod_6126", "Containing file is not specified and root directory cannot be determined, skipping lookup in 'node_modules' folder."), Resolving_type_reference_directive_0_containing_file_not_set_root_directory_1: b(6127, 3, "Resolving_type_reference_directive_0_containing_file_not_set_root_directory_1_6127", "======== Resolving type reference directive '{0}', containing file not set, root directory '{1}'. ========"), Resolving_type_reference_directive_0_containing_file_not_set_root_directory_not_set: b(6128, 3, "Resolving_type_reference_directive_0_containing_file_not_set_root_directory_not_set_6128", "======== Resolving type reference directive '{0}', containing file not set, root directory not set. ========"), Resolving_real_path_for_0_result_1: b(6130, 3, "Resolving_real_path_for_0_result_1_6130", "Resolving real path for '{0}', result '{1}'."), Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system: b(6131, 1, "Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system_6131", "Cannot compile modules using option '{0}' unless the '--module' flag is 'amd' or 'system'."), File_name_0_has_a_1_extension_stripping_it: b(6132, 3, "File_name_0_has_a_1_extension_stripping_it_6132", "File name '{0}' has a '{1}' extension - stripping it."), _0_is_declared_but_its_value_is_never_read: b(6133, 1, "_0_is_declared_but_its_value_is_never_read_6133", "'{0}' is declared but its value is never read.", !0), Report_errors_on_unused_locals: b(6134, 3, "Report_errors_on_unused_locals_6134", "Report errors on unused locals."), Report_errors_on_unused_parameters: b(6135, 3, "Report_errors_on_unused_parameters_6135", "Report errors on unused parameters."), The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files: b(6136, 3, "The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files_6136", "The maximum dependency depth to search under node_modules and load JavaScript files."), Cannot_import_type_declaration_files_Consider_importing_0_instead_of_1: b(6137, 1, "Cannot_import_type_declaration_files_Consider_importing_0_instead_of_1_6137", "Cannot import type declaration files. Consider importing '{0}' instead of '{1}'."), Property_0_is_declared_but_its_value_is_never_read: b(6138, 1, "Property_0_is_declared_but_its_value_is_never_read_6138", "Property '{0}' is declared but its value is never read.", !0), Import_emit_helpers_from_tslib: b(6139, 3, "Import_emit_helpers_from_tslib_6139", "Import emit helpers from 'tslib'."), Auto_discovery_for_typings_is_enabled_in_project_0_Running_extra_resolution_pass_for_module_1_using_cache_location_2: b(6140, 1, "Auto_discovery_for_typings_is_enabled_in_project_0_Running_extra_resolution_pass_for_module_1_using__6140", "Auto discovery for typings is enabled in project '{0}'. Running extra resolution pass for module '{1}' using cache location '{2}'."), Parse_in_strict_mode_and_emit_use_strict_for_each_source_file: b(6141, 3, "Parse_in_strict_mode_and_emit_use_strict_for_each_source_file_6141", 'Parse in strict mode and emit "use strict" for each source file.'), Module_0_was_resolved_to_1_but_jsx_is_not_set: b(6142, 1, "Module_0_was_resolved_to_1_but_jsx_is_not_set_6142", "Module '{0}' was resolved to '{1}', but '--jsx' is not set."), Module_0_was_resolved_as_locally_declared_ambient_module_in_file_1: b(6144, 3, "Module_0_was_resolved_as_locally_declared_ambient_module_in_file_1_6144", "Module '{0}' was resolved as locally declared ambient module in file '{1}'."), Module_0_was_resolved_as_ambient_module_declared_in_1_since_this_file_was_not_modified: b(6145, 3, "Module_0_was_resolved_as_ambient_module_declared_in_1_since_this_file_was_not_modified_6145", "Module '{0}' was resolved as ambient module declared in '{1}' since this file was not modified."), Specify_the_JSX_factory_function_to_use_when_targeting_react_JSX_emit_e_g_React_createElement_or_h: b(6146, 3, "Specify_the_JSX_factory_function_to_use_when_targeting_react_JSX_emit_e_g_React_createElement_or_h_6146", "Specify the JSX factory function to use when targeting 'react' JSX emit, e.g. 'React.createElement' or 'h'."), Resolution_for_module_0_was_found_in_cache_from_location_1: b(6147, 3, "Resolution_for_module_0_was_found_in_cache_from_location_1_6147", "Resolution for module '{0}' was found in cache from location '{1}'."), Directory_0_does_not_exist_skipping_all_lookups_in_it: b(6148, 3, "Directory_0_does_not_exist_skipping_all_lookups_in_it_6148", "Directory '{0}' does not exist, skipping all lookups in it."), Show_diagnostic_information: b(6149, 3, "Show_diagnostic_information_6149", "Show diagnostic information."), Show_verbose_diagnostic_information: b(6150, 3, "Show_verbose_diagnostic_information_6150", "Show verbose diagnostic information."), Emit_a_single_file_with_source_maps_instead_of_having_a_separate_file: b(6151, 3, "Emit_a_single_file_with_source_maps_instead_of_having_a_separate_file_6151", "Emit a single file with source maps instead of having a separate file."), Emit_the_source_alongside_the_sourcemaps_within_a_single_file_requires_inlineSourceMap_or_sourceMap_to_be_set: b(6152, 3, "Emit_the_source_alongside_the_sourcemaps_within_a_single_file_requires_inlineSourceMap_or_sourceMap__6152", "Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set."), Transpile_each_file_as_a_separate_module_similar_to_ts_transpileModule: b(6153, 3, "Transpile_each_file_as_a_separate_module_similar_to_ts_transpileModule_6153", "Transpile each file as a separate module (similar to 'ts.transpileModule')."), Print_names_of_generated_files_part_of_the_compilation: b(6154, 3, "Print_names_of_generated_files_part_of_the_compilation_6154", "Print names of generated files part of the compilation."), Print_names_of_files_part_of_the_compilation: b(6155, 3, "Print_names_of_files_part_of_the_compilation_6155", "Print names of files part of the compilation."), The_locale_used_when_displaying_messages_to_the_user_e_g_en_us: b(6156, 3, "The_locale_used_when_displaying_messages_to_the_user_e_g_en_us_6156", "The locale used when displaying messages to the user (e.g. 'en-us')"), Do_not_generate_custom_helper_functions_like_extends_in_compiled_output: b(6157, 3, "Do_not_generate_custom_helper_functions_like_extends_in_compiled_output_6157", "Do not generate custom helper functions like '__extends' in compiled output."), Do_not_include_the_default_library_file_lib_d_ts: b(6158, 3, "Do_not_include_the_default_library_file_lib_d_ts_6158", "Do not include the default library file (lib.d.ts)."), Do_not_add_triple_slash_references_or_imported_modules_to_the_list_of_compiled_files: b(6159, 3, "Do_not_add_triple_slash_references_or_imported_modules_to_the_list_of_compiled_files_6159", "Do not add triple-slash references or imported modules to the list of compiled files."), Deprecated_Use_skipLibCheck_instead_Skip_type_checking_of_default_library_declaration_files: b(6160, 3, "Deprecated_Use_skipLibCheck_instead_Skip_type_checking_of_default_library_declaration_files_6160", "[Deprecated] Use '--skipLibCheck' instead. Skip type checking of default library declaration files."), List_of_folders_to_include_type_definitions_from: b(6161, 3, "List_of_folders_to_include_type_definitions_from_6161", "List of folders to include type definitions from."), Disable_size_limitations_on_JavaScript_projects: b(6162, 3, "Disable_size_limitations_on_JavaScript_projects_6162", "Disable size limitations on JavaScript projects."), The_character_set_of_the_input_files: b(6163, 3, "The_character_set_of_the_input_files_6163", "The character set of the input files."), Do_not_truncate_error_messages: b(6165, 3, "Do_not_truncate_error_messages_6165", "Do not truncate error messages."), Output_directory_for_generated_declaration_files: b(6166, 3, "Output_directory_for_generated_declaration_files_6166", "Output directory for generated declaration files."), A_series_of_entries_which_re_map_imports_to_lookup_locations_relative_to_the_baseUrl: b(6167, 3, "A_series_of_entries_which_re_map_imports_to_lookup_locations_relative_to_the_baseUrl_6167", "A series of entries which re-map imports to lookup locations relative to the 'baseUrl'."), List_of_root_folders_whose_combined_content_represents_the_structure_of_the_project_at_runtime: b(6168, 3, "List_of_root_folders_whose_combined_content_represents_the_structure_of_the_project_at_runtime_6168", "List of root folders whose combined content represents the structure of the project at runtime."), Show_all_compiler_options: b(6169, 3, "Show_all_compiler_options_6169", "Show all compiler options."), Deprecated_Use_outFile_instead_Concatenate_and_emit_output_to_single_file: b(6170, 3, "Deprecated_Use_outFile_instead_Concatenate_and_emit_output_to_single_file_6170", "[Deprecated] Use '--outFile' instead. Concatenate and emit output to single file"), Command_line_Options: b(6171, 3, "Command_line_Options_6171", "Command-line Options"), Provide_full_support_for_iterables_in_for_of_spread_and_destructuring_when_targeting_ES5_or_ES3: b(6179, 3, "Provide_full_support_for_iterables_in_for_of_spread_and_destructuring_when_targeting_ES5_or_ES3_6179", "Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'."), Enable_all_strict_type_checking_options: b(6180, 3, "Enable_all_strict_type_checking_options_6180", "Enable all strict type-checking options."), Scoped_package_detected_looking_in_0: b(6182, 3, "Scoped_package_detected_looking_in_0_6182", "Scoped package detected, looking in '{0}'"), Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2: b(6183, 3, "Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_6183", "Reusing resolution of module '{0}' from '{1}' of old program, it was successfully resolved to '{2}'."), Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3: b(6184, 3, "Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package__6184", "Reusing resolution of module '{0}' from '{1}' of old program, it was successfully resolved to '{2}' with Package ID '{3}'."), Enable_strict_checking_of_function_types: b(6186, 3, "Enable_strict_checking_of_function_types_6186", "Enable strict checking of function types."), Enable_strict_checking_of_property_initialization_in_classes: b(6187, 3, "Enable_strict_checking_of_property_initialization_in_classes_6187", "Enable strict checking of property initialization in classes."), Numeric_separators_are_not_allowed_here: b(6188, 1, "Numeric_separators_are_not_allowed_here_6188", "Numeric separators are not allowed here."), Multiple_consecutive_numeric_separators_are_not_permitted: b(6189, 1, "Multiple_consecutive_numeric_separators_are_not_permitted_6189", "Multiple consecutive numeric separators are not permitted."), Whether_to_keep_outdated_console_output_in_watch_mode_instead_of_clearing_the_screen: b(6191, 3, "Whether_to_keep_outdated_console_output_in_watch_mode_instead_of_clearing_the_screen_6191", "Whether to keep outdated console output in watch mode instead of clearing the screen."), All_imports_in_import_declaration_are_unused: b(6192, 1, "All_imports_in_import_declaration_are_unused_6192", "All imports in import declaration are unused.", !0), Found_1_error_Watching_for_file_changes: b(6193, 3, "Found_1_error_Watching_for_file_changes_6193", "Found 1 error. Watching for file changes."), Found_0_errors_Watching_for_file_changes: b(6194, 3, "Found_0_errors_Watching_for_file_changes_6194", "Found {0} errors. Watching for file changes."), Resolve_keyof_to_string_valued_property_names_only_no_numbers_or_symbols: b(6195, 3, "Resolve_keyof_to_string_valued_property_names_only_no_numbers_or_symbols_6195", "Resolve 'keyof' to string valued property names only (no numbers or symbols)."), _0_is_declared_but_never_used: b(6196, 1, "_0_is_declared_but_never_used_6196", "'{0}' is declared but never used.", !0), Include_modules_imported_with_json_extension: b(6197, 3, "Include_modules_imported_with_json_extension_6197", "Include modules imported with '.json' extension"), All_destructured_elements_are_unused: b(6198, 1, "All_destructured_elements_are_unused_6198", "All destructured elements are unused.", !0), All_variables_are_unused: b(6199, 1, "All_variables_are_unused_6199", "All variables are unused.", !0), Definitions_of_the_following_identifiers_conflict_with_those_in_another_file_Colon_0: b(6200, 1, "Definitions_of_the_following_identifiers_conflict_with_those_in_another_file_Colon_0_6200", "Definitions of the following identifiers conflict with those in another file: {0}"), Conflicts_are_in_this_file: b(6201, 3, "Conflicts_are_in_this_file_6201", "Conflicts are in this file."), Project_references_may_not_form_a_circular_graph_Cycle_detected_Colon_0: b(6202, 1, "Project_references_may_not_form_a_circular_graph_Cycle_detected_Colon_0_6202", "Project references may not form a circular graph. Cycle detected: {0}"), _0_was_also_declared_here: b(6203, 3, "_0_was_also_declared_here_6203", "'{0}' was also declared here."), and_here: b(6204, 3, "and_here_6204", "and here."), All_type_parameters_are_unused: b(6205, 1, "All_type_parameters_are_unused_6205", "All type parameters are unused."), package_json_has_a_typesVersions_field_with_version_specific_path_mappings: b(6206, 3, "package_json_has_a_typesVersions_field_with_version_specific_path_mappings_6206", "'package.json' has a 'typesVersions' field with version-specific path mappings."), package_json_does_not_have_a_typesVersions_entry_that_matches_version_0: b(6207, 3, "package_json_does_not_have_a_typesVersions_entry_that_matches_version_0_6207", "'package.json' does not have a 'typesVersions' entry that matches version '{0}'."), package_json_has_a_typesVersions_entry_0_that_matches_compiler_version_1_looking_for_a_pattern_to_match_module_name_2: b(6208, 3, "package_json_has_a_typesVersions_entry_0_that_matches_compiler_version_1_looking_for_a_pattern_to_ma_6208", "'package.json' has a 'typesVersions' entry '{0}' that matches compiler version '{1}', looking for a pattern to match module name '{2}'."), package_json_has_a_typesVersions_entry_0_that_is_not_a_valid_semver_range: b(6209, 3, "package_json_has_a_typesVersions_entry_0_that_is_not_a_valid_semver_range_6209", "'package.json' has a 'typesVersions' entry '{0}' that is not a valid semver range."), An_argument_for_0_was_not_provided: b(6210, 3, "An_argument_for_0_was_not_provided_6210", "An argument for '{0}' was not provided."), An_argument_matching_this_binding_pattern_was_not_provided: b(6211, 3, "An_argument_matching_this_binding_pattern_was_not_provided_6211", "An argument matching this binding pattern was not provided."), Did_you_mean_to_call_this_expression: b(6212, 3, "Did_you_mean_to_call_this_expression_6212", "Did you mean to call this expression?"), Did_you_mean_to_use_new_with_this_expression: b(6213, 3, "Did_you_mean_to_use_new_with_this_expression_6213", "Did you mean to use 'new' with this expression?"), Enable_strict_bind_call_and_apply_methods_on_functions: b(6214, 3, "Enable_strict_bind_call_and_apply_methods_on_functions_6214", "Enable strict 'bind', 'call', and 'apply' methods on functions."), Using_compiler_options_of_project_reference_redirect_0: b(6215, 3, "Using_compiler_options_of_project_reference_redirect_0_6215", "Using compiler options of project reference redirect '{0}'."), Found_1_error: b(6216, 3, "Found_1_error_6216", "Found 1 error."), Found_0_errors: b(6217, 3, "Found_0_errors_6217", "Found {0} errors."), Module_name_0_was_successfully_resolved_to_1_with_Package_ID_2: b(6218, 3, "Module_name_0_was_successfully_resolved_to_1_with_Package_ID_2_6218", "======== Module name '{0}' was successfully resolved to '{1}' with Package ID '{2}'. ========"), Type_reference_directive_0_was_successfully_resolved_to_1_with_Package_ID_2_primary_Colon_3: b(6219, 3, "Type_reference_directive_0_was_successfully_resolved_to_1_with_Package_ID_2_primary_Colon_3_6219", "======== Type reference directive '{0}' was successfully resolved to '{1}' with Package ID '{2}', primary: {3}. ========"), package_json_had_a_falsy_0_field: b(6220, 3, "package_json_had_a_falsy_0_field_6220", "'package.json' had a falsy '{0}' field."), Disable_use_of_source_files_instead_of_declaration_files_from_referenced_projects: b(6221, 3, "Disable_use_of_source_files_instead_of_declaration_files_from_referenced_projects_6221", "Disable use of source files instead of declaration files from referenced projects."), Emit_class_fields_with_Define_instead_of_Set: b(6222, 3, "Emit_class_fields_with_Define_instead_of_Set_6222", "Emit class fields with Define instead of Set."), Generates_a_CPU_profile: b(6223, 3, "Generates_a_CPU_profile_6223", "Generates a CPU profile."), Disable_solution_searching_for_this_project: b(6224, 3, "Disable_solution_searching_for_this_project_6224", "Disable solution searching for this project."), Specify_strategy_for_watching_file_Colon_FixedPollingInterval_default_PriorityPollingInterval_DynamicPriorityPolling_FixedChunkSizePolling_UseFsEvents_UseFsEventsOnParentDirectory: b(6225, 3, "Specify_strategy_for_watching_file_Colon_FixedPollingInterval_default_PriorityPollingInterval_Dynami_6225", "Specify strategy for watching file: 'FixedPollingInterval' (default), 'PriorityPollingInterval', 'DynamicPriorityPolling', 'FixedChunkSizePolling', 'UseFsEvents', 'UseFsEventsOnParentDirectory'."), Specify_strategy_for_watching_directory_on_platforms_that_don_t_support_recursive_watching_natively_Colon_UseFsEvents_default_FixedPollingInterval_DynamicPriorityPolling_FixedChunkSizePolling: b(6226, 3, "Specify_strategy_for_watching_directory_on_platforms_that_don_t_support_recursive_watching_natively__6226", "Specify strategy for watching directory on platforms that don't support recursive watching natively: 'UseFsEvents' (default), 'FixedPollingInterval', 'DynamicPriorityPolling', 'FixedChunkSizePolling'."), Specify_strategy_for_creating_a_polling_watch_when_it_fails_to_create_using_file_system_events_Colon_FixedInterval_default_PriorityInterval_DynamicPriority_FixedChunkSize: b(6227, 3, "Specify_strategy_for_creating_a_polling_watch_when_it_fails_to_create_using_file_system_events_Colon_6227", "Specify strategy for creating a polling watch when it fails to create using file system events: 'FixedInterval' (default), 'PriorityInterval', 'DynamicPriority', 'FixedChunkSize'."), Tag_0_expects_at_least_1_arguments_but_the_JSX_factory_2_provides_at_most_3: b(6229, 1, "Tag_0_expects_at_least_1_arguments_but_the_JSX_factory_2_provides_at_most_3_6229", "Tag '{0}' expects at least '{1}' arguments, but the JSX factory '{2}' provides at most '{3}'."), Option_0_can_only_be_specified_in_tsconfig_json_file_or_set_to_false_or_null_on_command_line: b(6230, 1, "Option_0_can_only_be_specified_in_tsconfig_json_file_or_set_to_false_or_null_on_command_line_6230", "Option '{0}' can only be specified in 'tsconfig.json' file or set to 'false' or 'null' on command line."), Could_not_resolve_the_path_0_with_the_extensions_Colon_1: b(6231, 1, "Could_not_resolve_the_path_0_with_the_extensions_Colon_1_6231", "Could not resolve the path '{0}' with the extensions: {1}."), Declaration_augments_declaration_in_another_file_This_cannot_be_serialized: b(6232, 1, "Declaration_augments_declaration_in_another_file_This_cannot_be_serialized_6232", "Declaration augments declaration in another file. This cannot be serialized."), This_is_the_declaration_being_augmented_Consider_moving_the_augmenting_declaration_into_the_same_file: b(6233, 1, "This_is_the_declaration_being_augmented_Consider_moving_the_augmenting_declaration_into_the_same_fil_6233", "This is the declaration being augmented. Consider moving the augmenting declaration into the same file."), This_expression_is_not_callable_because_it_is_a_get_accessor_Did_you_mean_to_use_it_without: b(6234, 1, "This_expression_is_not_callable_because_it_is_a_get_accessor_Did_you_mean_to_use_it_without_6234", "This expression is not callable because it is a 'get' accessor. Did you mean to use it without '()'?"), Disable_loading_referenced_projects: b(6235, 3, "Disable_loading_referenced_projects_6235", "Disable loading referenced projects."), Arguments_for_the_rest_parameter_0_were_not_provided: b(6236, 1, "Arguments_for_the_rest_parameter_0_were_not_provided_6236", "Arguments for the rest parameter '{0}' were not provided."), Generates_an_event_trace_and_a_list_of_types: b(6237, 3, "Generates_an_event_trace_and_a_list_of_types_6237", "Generates an event trace and a list of types."), Specify_the_module_specifier_to_be_used_to_import_the_jsx_and_jsxs_factory_functions_from_eg_react: b(6238, 1, "Specify_the_module_specifier_to_be_used_to_import_the_jsx_and_jsxs_factory_functions_from_eg_react_6238", "Specify the module specifier to be used to import the 'jsx' and 'jsxs' factory functions from. eg, react"), File_0_exists_according_to_earlier_cached_lookups: b(6239, 3, "File_0_exists_according_to_earlier_cached_lookups_6239", "File '{0}' exists according to earlier cached lookups."), File_0_does_not_exist_according_to_earlier_cached_lookups: b(6240, 3, "File_0_does_not_exist_according_to_earlier_cached_lookups_6240", "File '{0}' does not exist according to earlier cached lookups."), Resolution_for_type_reference_directive_0_was_found_in_cache_from_location_1: b(6241, 3, "Resolution_for_type_reference_directive_0_was_found_in_cache_from_location_1_6241", "Resolution for type reference directive '{0}' was found in cache from location '{1}'."), Resolving_type_reference_directive_0_containing_file_1: b(6242, 3, "Resolving_type_reference_directive_0_containing_file_1_6242", "======== Resolving type reference directive '{0}', containing file '{1}'. ========"), Interpret_optional_property_types_as_written_rather_than_adding_undefined: b(6243, 3, "Interpret_optional_property_types_as_written_rather_than_adding_undefined_6243", "Interpret optional property types as written, rather than adding 'undefined'."), Modules: b(6244, 3, "Modules_6244", "Modules"), File_Management: b(6245, 3, "File_Management_6245", "File Management"), Emit: b(6246, 3, "Emit_6246", "Emit"), JavaScript_Support: b(6247, 3, "JavaScript_Support_6247", "JavaScript Support"), Type_Checking: b(6248, 3, "Type_Checking_6248", "Type Checking"), Editor_Support: b(6249, 3, "Editor_Support_6249", "Editor Support"), Watch_and_Build_Modes: b(6250, 3, "Watch_and_Build_Modes_6250", "Watch and Build Modes"), Compiler_Diagnostics: b(6251, 3, "Compiler_Diagnostics_6251", "Compiler Diagnostics"), Interop_Constraints: b(6252, 3, "Interop_Constraints_6252", "Interop Constraints"), Backwards_Compatibility: b(6253, 3, "Backwards_Compatibility_6253", "Backwards Compatibility"), Language_and_Environment: b(6254, 3, "Language_and_Environment_6254", "Language and Environment"), Projects: b(6255, 3, "Projects_6255", "Projects"), Output_Formatting: b(6256, 3, "Output_Formatting_6256", "Output Formatting"), Completeness: b(6257, 3, "Completeness_6257", "Completeness"), _0_should_be_set_inside_the_compilerOptions_object_of_the_config_json_file: b(6258, 1, "_0_should_be_set_inside_the_compilerOptions_object_of_the_config_json_file_6258", "'{0}' should be set inside the 'compilerOptions' object of the config json file"), Found_1_error_in_1: b(6259, 3, "Found_1_error_in_1_6259", "Found 1 error in {1}"), Found_0_errors_in_the_same_file_starting_at_Colon_1: b(6260, 3, "Found_0_errors_in_the_same_file_starting_at_Colon_1_6260", "Found {0} errors in the same file, starting at: {1}"), Found_0_errors_in_1_files: b(6261, 3, "Found_0_errors_in_1_files_6261", "Found {0} errors in {1} files."), File_name_0_has_a_1_extension_looking_up_2_instead: b(6262, 3, "File_name_0_has_a_1_extension_looking_up_2_instead_6262", "File name '{0}' has a '{1}' extension - looking up '{2}' instead."), Module_0_was_resolved_to_1_but_allowArbitraryExtensions_is_not_set: b(6263, 1, "Module_0_was_resolved_to_1_but_allowArbitraryExtensions_is_not_set_6263", "Module '{0}' was resolved to '{1}', but '--allowArbitraryExtensions' is not set."), Enable_importing_files_with_any_extension_provided_a_declaration_file_is_present: b(6264, 3, "Enable_importing_files_with_any_extension_provided_a_declaration_file_is_present_6264", "Enable importing files with any extension, provided a declaration file is present."), Directory_0_has_no_containing_package_json_scope_Imports_will_not_resolve: b(6270, 3, "Directory_0_has_no_containing_package_json_scope_Imports_will_not_resolve_6270", "Directory '{0}' has no containing package.json scope. Imports will not resolve."), Import_specifier_0_does_not_exist_in_package_json_scope_at_path_1: b(6271, 3, "Import_specifier_0_does_not_exist_in_package_json_scope_at_path_1_6271", "Import specifier '{0}' does not exist in package.json scope at path '{1}'."), Invalid_import_specifier_0_has_no_possible_resolutions: b(6272, 3, "Invalid_import_specifier_0_has_no_possible_resolutions_6272", "Invalid import specifier '{0}' has no possible resolutions."), package_json_scope_0_has_no_imports_defined: b(6273, 3, "package_json_scope_0_has_no_imports_defined_6273", "package.json scope '{0}' has no imports defined."), package_json_scope_0_explicitly_maps_specifier_1_to_null: b(6274, 3, "package_json_scope_0_explicitly_maps_specifier_1_to_null_6274", "package.json scope '{0}' explicitly maps specifier '{1}' to null."), package_json_scope_0_has_invalid_type_for_target_of_specifier_1: b(6275, 3, "package_json_scope_0_has_invalid_type_for_target_of_specifier_1_6275", "package.json scope '{0}' has invalid type for target of specifier '{1}'"), Export_specifier_0_does_not_exist_in_package_json_scope_at_path_1: b(6276, 3, "Export_specifier_0_does_not_exist_in_package_json_scope_at_path_1_6276", "Export specifier '{0}' does not exist in package.json scope at path '{1}'."), Resolution_of_non_relative_name_failed_trying_with_modern_Node_resolution_features_disabled_to_see_if_npm_library_needs_configuration_update: b(6277, 3, "Resolution_of_non_relative_name_failed_trying_with_modern_Node_resolution_features_disabled_to_see_i_6277", "Resolution of non-relative name failed; trying with modern Node resolution features disabled to see if npm library needs configuration update."), There_are_types_at_0_but_this_result_could_not_be_resolved_when_respecting_package_json_exports_The_1_library_may_need_to_update_its_package_json_or_typings: b(6278, 3, "There_are_types_at_0_but_this_result_could_not_be_resolved_when_respecting_package_json_exports_The__6278", `There are types at '{0}', but this result could not be resolved when respecting package.json "exports". The '{1}' library may need to update its package.json or typings.`), Enable_project_compilation: b(6302, 3, "Enable_project_compilation_6302", "Enable project compilation"), Composite_projects_may_not_disable_declaration_emit: b(6304, 1, "Composite_projects_may_not_disable_declaration_emit_6304", "Composite projects may not disable declaration emit."), Output_file_0_has_not_been_built_from_source_file_1: b(6305, 1, "Output_file_0_has_not_been_built_from_source_file_1_6305", "Output file '{0}' has not been built from source file '{1}'."), Referenced_project_0_must_have_setting_composite_Colon_true: b(6306, 1, "Referenced_project_0_must_have_setting_composite_Colon_true_6306", `Referenced project '{0}' must have setting "composite": true.`), File_0_is_not_listed_within_the_file_list_of_project_1_Projects_must_list_all_files_or_use_an_include_pattern: b(6307, 1, "File_0_is_not_listed_within_the_file_list_of_project_1_Projects_must_list_all_files_or_use_an_includ_6307", "File '{0}' is not listed within the file list of project '{1}'. Projects must list all files or use an 'include' pattern."), Cannot_prepend_project_0_because_it_does_not_have_outFile_set: b(6308, 1, "Cannot_prepend_project_0_because_it_does_not_have_outFile_set_6308", "Cannot prepend project '{0}' because it does not have 'outFile' set"), Output_file_0_from_project_1_does_not_exist: b(6309, 1, "Output_file_0_from_project_1_does_not_exist_6309", "Output file '{0}' from project '{1}' does not exist"), Referenced_project_0_may_not_disable_emit: b(6310, 1, "Referenced_project_0_may_not_disable_emit_6310", "Referenced project '{0}' may not disable emit."), Project_0_is_out_of_date_because_output_1_is_older_than_input_2: b(6350, 3, "Project_0_is_out_of_date_because_output_1_is_older_than_input_2_6350", "Project '{0}' is out of date because output '{1}' is older than input '{2}'"), Project_0_is_up_to_date_because_newest_input_1_is_older_than_output_2: b(6351, 3, "Project_0_is_up_to_date_because_newest_input_1_is_older_than_output_2_6351", "Project '{0}' is up to date because newest input '{1}' is older than output '{2}'"), Project_0_is_out_of_date_because_output_file_1_does_not_exist: b(6352, 3, "Project_0_is_out_of_date_because_output_file_1_does_not_exist_6352", "Project '{0}' is out of date because output file '{1}' does not exist"), Project_0_is_out_of_date_because_its_dependency_1_is_out_of_date: b(6353, 3, "Project_0_is_out_of_date_because_its_dependency_1_is_out_of_date_6353", "Project '{0}' is out of date because its dependency '{1}' is out of date"), Project_0_is_up_to_date_with_d_ts_files_from_its_dependencies: b(6354, 3, "Project_0_is_up_to_date_with_d_ts_files_from_its_dependencies_6354", "Project '{0}' is up to date with .d.ts files from its dependencies"), Projects_in_this_build_Colon_0: b(6355, 3, "Projects_in_this_build_Colon_0_6355", "Projects in this build: {0}"), A_non_dry_build_would_delete_the_following_files_Colon_0: b(6356, 3, "A_non_dry_build_would_delete_the_following_files_Colon_0_6356", "A non-dry build would delete the following files: {0}"), A_non_dry_build_would_build_project_0: b(6357, 3, "A_non_dry_build_would_build_project_0_6357", "A non-dry build would build project '{0}'"), Building_project_0: b(6358, 3, "Building_project_0_6358", "Building project '{0}'..."), Updating_output_timestamps_of_project_0: b(6359, 3, "Updating_output_timestamps_of_project_0_6359", "Updating output timestamps of project '{0}'..."), Project_0_is_up_to_date: b(6361, 3, "Project_0_is_up_to_date_6361", "Project '{0}' is up to date"), Skipping_build_of_project_0_because_its_dependency_1_has_errors: b(6362, 3, "Skipping_build_of_project_0_because_its_dependency_1_has_errors_6362", "Skipping build of project '{0}' because its dependency '{1}' has errors"), Project_0_can_t_be_built_because_its_dependency_1_has_errors: b(6363, 3, "Project_0_can_t_be_built_because_its_dependency_1_has_errors_6363", "Project '{0}' can't be built because its dependency '{1}' has errors"), Build_one_or_more_projects_and_their_dependencies_if_out_of_date: b(6364, 3, "Build_one_or_more_projects_and_their_dependencies_if_out_of_date_6364", "Build one or more projects and their dependencies, if out of date"), Delete_the_outputs_of_all_projects: b(6365, 3, "Delete_the_outputs_of_all_projects_6365", "Delete the outputs of all projects."), Show_what_would_be_built_or_deleted_if_specified_with_clean: b(6367, 3, "Show_what_would_be_built_or_deleted_if_specified_with_clean_6367", "Show what would be built (or deleted, if specified with '--clean')"), Option_build_must_be_the_first_command_line_argument: b(6369, 1, "Option_build_must_be_the_first_command_line_argument_6369", "Option '--build' must be the first command line argument."), Options_0_and_1_cannot_be_combined: b(6370, 1, "Options_0_and_1_cannot_be_combined_6370", "Options '{0}' and '{1}' cannot be combined."), Updating_unchanged_output_timestamps_of_project_0: b(6371, 3, "Updating_unchanged_output_timestamps_of_project_0_6371", "Updating unchanged output timestamps of project '{0}'..."), Project_0_is_out_of_date_because_output_of_its_dependency_1_has_changed: b(6372, 3, "Project_0_is_out_of_date_because_output_of_its_dependency_1_has_changed_6372", "Project '{0}' is out of date because output of its dependency '{1}' has changed"), Updating_output_of_project_0: b(6373, 3, "Updating_output_of_project_0_6373", "Updating output of project '{0}'..."), A_non_dry_build_would_update_timestamps_for_output_of_project_0: b(6374, 3, "A_non_dry_build_would_update_timestamps_for_output_of_project_0_6374", "A non-dry build would update timestamps for output of project '{0}'"), A_non_dry_build_would_update_output_of_project_0: b(6375, 3, "A_non_dry_build_would_update_output_of_project_0_6375", "A non-dry build would update output of project '{0}'"), Cannot_update_output_of_project_0_because_there_was_error_reading_file_1: b(6376, 3, "Cannot_update_output_of_project_0_because_there_was_error_reading_file_1_6376", "Cannot update output of project '{0}' because there was error reading file '{1}'"), Cannot_write_file_0_because_it_will_overwrite_tsbuildinfo_file_generated_by_referenced_project_1: b(6377, 1, "Cannot_write_file_0_because_it_will_overwrite_tsbuildinfo_file_generated_by_referenced_project_1_6377", "Cannot write file '{0}' because it will overwrite '.tsbuildinfo' file generated by referenced project '{1}'"), Composite_projects_may_not_disable_incremental_compilation: b(6379, 1, "Composite_projects_may_not_disable_incremental_compilation_6379", "Composite projects may not disable incremental compilation."), Specify_file_to_store_incremental_compilation_information: b(6380, 3, "Specify_file_to_store_incremental_compilation_information_6380", "Specify file to store incremental compilation information"), Project_0_is_out_of_date_because_output_for_it_was_generated_with_version_1_that_differs_with_current_version_2: b(6381, 3, "Project_0_is_out_of_date_because_output_for_it_was_generated_with_version_1_that_differs_with_curren_6381", "Project '{0}' is out of date because output for it was generated with version '{1}' that differs with current version '{2}'"), Skipping_build_of_project_0_because_its_dependency_1_was_not_built: b(6382, 3, "Skipping_build_of_project_0_because_its_dependency_1_was_not_built_6382", "Skipping build of project '{0}' because its dependency '{1}' was not built"), Project_0_can_t_be_built_because_its_dependency_1_was_not_built: b(6383, 3, "Project_0_can_t_be_built_because_its_dependency_1_was_not_built_6383", "Project '{0}' can't be built because its dependency '{1}' was not built"), Have_recompiles_in_incremental_and_watch_assume_that_changes_within_a_file_will_only_affect_files_directly_depending_on_it: b(6384, 3, "Have_recompiles_in_incremental_and_watch_assume_that_changes_within_a_file_will_only_affect_files_di_6384", "Have recompiles in '--incremental' and '--watch' assume that changes within a file will only affect files directly depending on it."), _0_is_deprecated: b(6385, 2, "_0_is_deprecated_6385", "'{0}' is deprecated.", void 0, void 0, !0), Performance_timings_for_diagnostics_or_extendedDiagnostics_are_not_available_in_this_session_A_native_implementation_of_the_Web_Performance_API_could_not_be_found: b(6386, 3, "Performance_timings_for_diagnostics_or_extendedDiagnostics_are_not_available_in_this_session_A_nativ_6386", "Performance timings for '--diagnostics' or '--extendedDiagnostics' are not available in this session. A native implementation of the Web Performance API could not be found."), The_signature_0_of_1_is_deprecated: b(6387, 2, "The_signature_0_of_1_is_deprecated_6387", "The signature '{0}' of '{1}' is deprecated.", void 0, void 0, !0), Project_0_is_being_forcibly_rebuilt: b(6388, 3, "Project_0_is_being_forcibly_rebuilt_6388", "Project '{0}' is being forcibly rebuilt"), Reusing_resolution_of_module_0_from_1_of_old_program_it_was_not_resolved: b(6389, 3, "Reusing_resolution_of_module_0_from_1_of_old_program_it_was_not_resolved_6389", "Reusing resolution of module '{0}' from '{1}' of old program, it was not resolved."), Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2: b(6390, 3, "Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved__6390", "Reusing resolution of type reference directive '{0}' from '{1}' of old program, it was successfully resolved to '{2}'."), Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3: b(6391, 3, "Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved__6391", "Reusing resolution of type reference directive '{0}' from '{1}' of old program, it was successfully resolved to '{2}' with Package ID '{3}'."), Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_not_resolved: b(6392, 3, "Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_not_resolved_6392", "Reusing resolution of type reference directive '{0}' from '{1}' of old program, it was not resolved."), Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_3: b(6393, 3, "Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_6393", "Reusing resolution of module '{0}' from '{1}' found in cache from location '{2}', it was successfully resolved to '{3}'."), Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_3_with_Package_ID_4: b(6394, 3, "Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_6394", "Reusing resolution of module '{0}' from '{1}' found in cache from location '{2}', it was successfully resolved to '{3}' with Package ID '{4}'."), Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_not_resolved: b(6395, 3, "Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_not_resolved_6395", "Reusing resolution of module '{0}' from '{1}' found in cache from location '{2}', it was not resolved."), Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_3: b(6396, 3, "Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_succes_6396", "Reusing resolution of type reference directive '{0}' from '{1}' found in cache from location '{2}', it was successfully resolved to '{3}'."), Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_3_with_Package_ID_4: b(6397, 3, "Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_succes_6397", "Reusing resolution of type reference directive '{0}' from '{1}' found in cache from location '{2}', it was successfully resolved to '{3}' with Package ID '{4}'."), Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_not_resolved: b(6398, 3, "Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_not_re_6398", "Reusing resolution of type reference directive '{0}' from '{1}' found in cache from location '{2}', it was not resolved."), Project_0_is_out_of_date_because_buildinfo_file_1_indicates_that_some_of_the_changes_were_not_emitted: b(6399, 3, "Project_0_is_out_of_date_because_buildinfo_file_1_indicates_that_some_of_the_changes_were_not_emitte_6399", "Project '{0}' is out of date because buildinfo file '{1}' indicates that some of the changes were not emitted"), Project_0_is_up_to_date_but_needs_to_update_timestamps_of_output_files_that_are_older_than_input_files: b(6400, 3, "Project_0_is_up_to_date_but_needs_to_update_timestamps_of_output_files_that_are_older_than_input_fil_6400", "Project '{0}' is up to date but needs to update timestamps of output files that are older than input files"), Project_0_is_out_of_date_because_there_was_error_reading_file_1: b(6401, 3, "Project_0_is_out_of_date_because_there_was_error_reading_file_1_6401", "Project '{0}' is out of date because there was error reading file '{1}'"), Resolving_in_0_mode_with_conditions_1: b(6402, 3, "Resolving_in_0_mode_with_conditions_1_6402", "Resolving in {0} mode with conditions {1}."), Matched_0_condition_1: b(6403, 3, "Matched_0_condition_1_6403", "Matched '{0}' condition '{1}'."), Using_0_subpath_1_with_target_2: b(6404, 3, "Using_0_subpath_1_with_target_2_6404", "Using '{0}' subpath '{1}' with target '{2}'."), Saw_non_matching_condition_0: b(6405, 3, "Saw_non_matching_condition_0_6405", "Saw non-matching condition '{0}'."), Project_0_is_out_of_date_because_buildinfo_file_1_indicates_there_is_change_in_compilerOptions: b(6406, 3, "Project_0_is_out_of_date_because_buildinfo_file_1_indicates_there_is_change_in_compilerOptions_6406", "Project '{0}' is out of date because buildinfo file '{1}' indicates there is change in compilerOptions"), Allow_imports_to_include_TypeScript_file_extensions_Requires_moduleResolution_bundler_and_either_noEmit_or_emitDeclarationOnly_to_be_set: b(6407, 3, "Allow_imports_to_include_TypeScript_file_extensions_Requires_moduleResolution_bundler_and_either_noE_6407", "Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set."), Use_the_package_json_exports_field_when_resolving_package_imports: b(6408, 3, "Use_the_package_json_exports_field_when_resolving_package_imports_6408", "Use the package.json 'exports' field when resolving package imports."), Use_the_package_json_imports_field_when_resolving_imports: b(6409, 3, "Use_the_package_json_imports_field_when_resolving_imports_6409", "Use the package.json 'imports' field when resolving imports."), Conditions_to_set_in_addition_to_the_resolver_specific_defaults_when_resolving_imports: b(6410, 3, "Conditions_to_set_in_addition_to_the_resolver_specific_defaults_when_resolving_imports_6410", "Conditions to set in addition to the resolver-specific defaults when resolving imports."), true_when_moduleResolution_is_node16_nodenext_or_bundler_otherwise_false: b(6411, 3, "true_when_moduleResolution_is_node16_nodenext_or_bundler_otherwise_false_6411", "`true` when 'moduleResolution' is 'node16', 'nodenext', or 'bundler'; otherwise `false`."), Project_0_is_out_of_date_because_buildinfo_file_1_indicates_that_file_2_was_root_file_of_compilation_but_not_any_more: b(6412, 3, "Project_0_is_out_of_date_because_buildinfo_file_1_indicates_that_file_2_was_root_file_of_compilation_6412", "Project '{0}' is out of date because buildinfo file '{1}' indicates that file '{2}' was root file of compilation but not any more."), Entering_conditional_exports: b(6413, 3, "Entering_conditional_exports_6413", "Entering conditional exports."), Resolved_under_condition_0: b(6414, 3, "Resolved_under_condition_0_6414", "Resolved under condition '{0}'."), Failed_to_resolve_under_condition_0: b(6415, 3, "Failed_to_resolve_under_condition_0_6415", "Failed to resolve under condition '{0}'."), Exiting_conditional_exports: b(6416, 3, "Exiting_conditional_exports_6416", "Exiting conditional exports."), The_expected_type_comes_from_property_0_which_is_declared_here_on_type_1: b(6500, 3, "The_expected_type_comes_from_property_0_which_is_declared_here_on_type_1_6500", "The expected type comes from property '{0}' which is declared here on type '{1}'"), The_expected_type_comes_from_this_index_signature: b(6501, 3, "The_expected_type_comes_from_this_index_signature_6501", "The expected type comes from this index signature."), The_expected_type_comes_from_the_return_type_of_this_signature: b(6502, 3, "The_expected_type_comes_from_the_return_type_of_this_signature_6502", "The expected type comes from the return type of this signature."), Print_names_of_files_that_are_part_of_the_compilation_and_then_stop_processing: b(6503, 3, "Print_names_of_files_that_are_part_of_the_compilation_and_then_stop_processing_6503", "Print names of files that are part of the compilation and then stop processing."), File_0_is_a_JavaScript_file_Did_you_mean_to_enable_the_allowJs_option: b(6504, 1, "File_0_is_a_JavaScript_file_Did_you_mean_to_enable_the_allowJs_option_6504", "File '{0}' is a JavaScript file. Did you mean to enable the 'allowJs' option?"), Print_names_of_files_and_the_reason_they_are_part_of_the_compilation: b(6505, 3, "Print_names_of_files_and_the_reason_they_are_part_of_the_compilation_6505", "Print names of files and the reason they are part of the compilation."), Consider_adding_a_declare_modifier_to_this_class: b(6506, 3, "Consider_adding_a_declare_modifier_to_this_class_6506", "Consider adding a 'declare' modifier to this class."), Allow_JavaScript_files_to_be_a_part_of_your_program_Use_the_checkJS_option_to_get_errors_from_these_files: b(6600, 3, "Allow_JavaScript_files_to_be_a_part_of_your_program_Use_the_checkJS_option_to_get_errors_from_these__6600", "Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files."), Allow_import_x_from_y_when_a_module_doesn_t_have_a_default_export: b(6601, 3, "Allow_import_x_from_y_when_a_module_doesn_t_have_a_default_export_6601", "Allow 'import x from y' when a module doesn't have a default export."), Allow_accessing_UMD_globals_from_modules: b(6602, 3, "Allow_accessing_UMD_globals_from_modules_6602", "Allow accessing UMD globals from modules."), Disable_error_reporting_for_unreachable_code: b(6603, 3, "Disable_error_reporting_for_unreachable_code_6603", "Disable error reporting for unreachable code."), Disable_error_reporting_for_unused_labels: b(6604, 3, "Disable_error_reporting_for_unused_labels_6604", "Disable error reporting for unused labels."), Ensure_use_strict_is_always_emitted: b(6605, 3, "Ensure_use_strict_is_always_emitted_6605", "Ensure 'use strict' is always emitted."), Have_recompiles_in_projects_that_use_incremental_and_watch_mode_assume_that_changes_within_a_file_will_only_affect_files_directly_depending_on_it: b(6606, 3, "Have_recompiles_in_projects_that_use_incremental_and_watch_mode_assume_that_changes_within_a_file_wi_6606", "Have recompiles in projects that use 'incremental' and 'watch' mode assume that changes within a file will only affect files directly depending on it."), Specify_the_base_directory_to_resolve_non_relative_module_names: b(6607, 3, "Specify_the_base_directory_to_resolve_non_relative_module_names_6607", "Specify the base directory to resolve non-relative module names."), No_longer_supported_In_early_versions_manually_set_the_text_encoding_for_reading_files: b(6608, 3, "No_longer_supported_In_early_versions_manually_set_the_text_encoding_for_reading_files_6608", "No longer supported. In early versions, manually set the text encoding for reading files."), Enable_error_reporting_in_type_checked_JavaScript_files: b(6609, 3, "Enable_error_reporting_in_type_checked_JavaScript_files_6609", "Enable error reporting in type-checked JavaScript files."), Enable_constraints_that_allow_a_TypeScript_project_to_be_used_with_project_references: b(6611, 3, "Enable_constraints_that_allow_a_TypeScript_project_to_be_used_with_project_references_6611", "Enable constraints that allow a TypeScript project to be used with project references."), Generate_d_ts_files_from_TypeScript_and_JavaScript_files_in_your_project: b(6612, 3, "Generate_d_ts_files_from_TypeScript_and_JavaScript_files_in_your_project_6612", "Generate .d.ts files from TypeScript and JavaScript files in your project."), Specify_the_output_directory_for_generated_declaration_files: b(6613, 3, "Specify_the_output_directory_for_generated_declaration_files_6613", "Specify the output directory for generated declaration files."), Create_sourcemaps_for_d_ts_files: b(6614, 3, "Create_sourcemaps_for_d_ts_files_6614", "Create sourcemaps for d.ts files."), Output_compiler_performance_information_after_building: b(6615, 3, "Output_compiler_performance_information_after_building_6615", "Output compiler performance information after building."), Disables_inference_for_type_acquisition_by_looking_at_filenames_in_a_project: b(6616, 3, "Disables_inference_for_type_acquisition_by_looking_at_filenames_in_a_project_6616", "Disables inference for type acquisition by looking at filenames in a project."), Reduce_the_number_of_projects_loaded_automatically_by_TypeScript: b(6617, 3, "Reduce_the_number_of_projects_loaded_automatically_by_TypeScript_6617", "Reduce the number of projects loaded automatically by TypeScript."), Remove_the_20mb_cap_on_total_source_code_size_for_JavaScript_files_in_the_TypeScript_language_server: b(6618, 3, "Remove_the_20mb_cap_on_total_source_code_size_for_JavaScript_files_in_the_TypeScript_language_server_6618", "Remove the 20mb cap on total source code size for JavaScript files in the TypeScript language server."), Opt_a_project_out_of_multi_project_reference_checking_when_editing: b(6619, 3, "Opt_a_project_out_of_multi_project_reference_checking_when_editing_6619", "Opt a project out of multi-project reference checking when editing."), Disable_preferring_source_files_instead_of_declaration_files_when_referencing_composite_projects: b(6620, 3, "Disable_preferring_source_files_instead_of_declaration_files_when_referencing_composite_projects_6620", "Disable preferring source files instead of declaration files when referencing composite projects."), Emit_more_compliant_but_verbose_and_less_performant_JavaScript_for_iteration: b(6621, 3, "Emit_more_compliant_but_verbose_and_less_performant_JavaScript_for_iteration_6621", "Emit more compliant, but verbose and less performant JavaScript for iteration."), Emit_a_UTF_8_Byte_Order_Mark_BOM_in_the_beginning_of_output_files: b(6622, 3, "Emit_a_UTF_8_Byte_Order_Mark_BOM_in_the_beginning_of_output_files_6622", "Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files."), Only_output_d_ts_files_and_not_JavaScript_files: b(6623, 3, "Only_output_d_ts_files_and_not_JavaScript_files_6623", "Only output d.ts files and not JavaScript files."), Emit_design_type_metadata_for_decorated_declarations_in_source_files: b(6624, 3, "Emit_design_type_metadata_for_decorated_declarations_in_source_files_6624", "Emit design-type metadata for decorated declarations in source files."), Disable_the_type_acquisition_for_JavaScript_projects: b(6625, 3, "Disable_the_type_acquisition_for_JavaScript_projects_6625", "Disable the type acquisition for JavaScript projects"), Emit_additional_JavaScript_to_ease_support_for_importing_CommonJS_modules_This_enables_allowSyntheticDefaultImports_for_type_compatibility: b(6626, 3, "Emit_additional_JavaScript_to_ease_support_for_importing_CommonJS_modules_This_enables_allowSyntheti_6626", "Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility."), Filters_results_from_the_include_option: b(6627, 3, "Filters_results_from_the_include_option_6627", "Filters results from the `include` option."), Remove_a_list_of_directories_from_the_watch_process: b(6628, 3, "Remove_a_list_of_directories_from_the_watch_process_6628", "Remove a list of directories from the watch process."), Remove_a_list_of_files_from_the_watch_mode_s_processing: b(6629, 3, "Remove_a_list_of_files_from_the_watch_mode_s_processing_6629", "Remove a list of files from the watch mode's processing."), Enable_experimental_support_for_legacy_experimental_decorators: b(6630, 3, "Enable_experimental_support_for_legacy_experimental_decorators_6630", "Enable experimental support for legacy experimental decorators."), Print_files_read_during_the_compilation_including_why_it_was_included: b(6631, 3, "Print_files_read_during_the_compilation_including_why_it_was_included_6631", "Print files read during the compilation including why it was included."), Output_more_detailed_compiler_performance_information_after_building: b(6632, 3, "Output_more_detailed_compiler_performance_information_after_building_6632", "Output more detailed compiler performance information after building."), Specify_one_or_more_path_or_node_module_references_to_base_configuration_files_from_which_settings_are_inherited: b(6633, 3, "Specify_one_or_more_path_or_node_module_references_to_base_configuration_files_from_which_settings_a_6633", "Specify one or more path or node module references to base configuration files from which settings are inherited."), Specify_what_approach_the_watcher_should_use_if_the_system_runs_out_of_native_file_watchers: b(6634, 3, "Specify_what_approach_the_watcher_should_use_if_the_system_runs_out_of_native_file_watchers_6634", "Specify what approach the watcher should use if the system runs out of native file watchers."), Include_a_list_of_files_This_does_not_support_glob_patterns_as_opposed_to_include: b(6635, 3, "Include_a_list_of_files_This_does_not_support_glob_patterns_as_opposed_to_include_6635", "Include a list of files. This does not support glob patterns, as opposed to `include`."), Build_all_projects_including_those_that_appear_to_be_up_to_date: b(6636, 3, "Build_all_projects_including_those_that_appear_to_be_up_to_date_6636", "Build all projects, including those that appear to be up to date."), Ensure_that_casing_is_correct_in_imports: b(6637, 3, "Ensure_that_casing_is_correct_in_imports_6637", "Ensure that casing is correct in imports."), Emit_a_v8_CPU_profile_of_the_compiler_run_for_debugging: b(6638, 3, "Emit_a_v8_CPU_profile_of_the_compiler_run_for_debugging_6638", "Emit a v8 CPU profile of the compiler run for debugging."), Allow_importing_helper_functions_from_tslib_once_per_project_instead_of_including_them_per_file: b(6639, 3, "Allow_importing_helper_functions_from_tslib_once_per_project_instead_of_including_them_per_file_6639", "Allow importing helper functions from tslib once per project, instead of including them per-file."), Specify_a_list_of_glob_patterns_that_match_files_to_be_included_in_compilation: b(6641, 3, "Specify_a_list_of_glob_patterns_that_match_files_to_be_included_in_compilation_6641", "Specify a list of glob patterns that match files to be included in compilation."), Save_tsbuildinfo_files_to_allow_for_incremental_compilation_of_projects: b(6642, 3, "Save_tsbuildinfo_files_to_allow_for_incremental_compilation_of_projects_6642", "Save .tsbuildinfo files to allow for incremental compilation of projects."), Include_sourcemap_files_inside_the_emitted_JavaScript: b(6643, 3, "Include_sourcemap_files_inside_the_emitted_JavaScript_6643", "Include sourcemap files inside the emitted JavaScript."), Include_source_code_in_the_sourcemaps_inside_the_emitted_JavaScript: b(6644, 3, "Include_source_code_in_the_sourcemaps_inside_the_emitted_JavaScript_6644", "Include source code in the sourcemaps inside the emitted JavaScript."), Ensure_that_each_file_can_be_safely_transpiled_without_relying_on_other_imports: b(6645, 3, "Ensure_that_each_file_can_be_safely_transpiled_without_relying_on_other_imports_6645", "Ensure that each file can be safely transpiled without relying on other imports."), Specify_what_JSX_code_is_generated: b(6646, 3, "Specify_what_JSX_code_is_generated_6646", "Specify what JSX code is generated."), Specify_the_JSX_factory_function_used_when_targeting_React_JSX_emit_e_g_React_createElement_or_h: b(6647, 3, "Specify_the_JSX_factory_function_used_when_targeting_React_JSX_emit_e_g_React_createElement_or_h_6647", "Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'."), Specify_the_JSX_Fragment_reference_used_for_fragments_when_targeting_React_JSX_emit_e_g_React_Fragment_or_Fragment: b(6648, 3, "Specify_the_JSX_Fragment_reference_used_for_fragments_when_targeting_React_JSX_emit_e_g_React_Fragme_6648", "Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'."), Specify_module_specifier_used_to_import_the_JSX_factory_functions_when_using_jsx_Colon_react_jsx_Asterisk: b(6649, 3, "Specify_module_specifier_used_to_import_the_JSX_factory_functions_when_using_jsx_Colon_react_jsx_Ast_6649", "Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'."), Make_keyof_only_return_strings_instead_of_string_numbers_or_symbols_Legacy_option: b(6650, 3, "Make_keyof_only_return_strings_instead_of_string_numbers_or_symbols_Legacy_option_6650", "Make keyof only return strings instead of string, numbers or symbols. Legacy option."), Specify_a_set_of_bundled_library_declaration_files_that_describe_the_target_runtime_environment: b(6651, 3, "Specify_a_set_of_bundled_library_declaration_files_that_describe_the_target_runtime_environment_6651", "Specify a set of bundled library declaration files that describe the target runtime environment."), Print_the_names_of_emitted_files_after_a_compilation: b(6652, 3, "Print_the_names_of_emitted_files_after_a_compilation_6652", "Print the names of emitted files after a compilation."), Print_all_of_the_files_read_during_the_compilation: b(6653, 3, "Print_all_of_the_files_read_during_the_compilation_6653", "Print all of the files read during the compilation."), Set_the_language_of_the_messaging_from_TypeScript_This_does_not_affect_emit: b(6654, 3, "Set_the_language_of_the_messaging_from_TypeScript_This_does_not_affect_emit_6654", "Set the language of the messaging from TypeScript. This does not affect emit."), Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations: b(6655, 3, "Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations_6655", "Specify the location where debugger should locate map files instead of generated locations."), Specify_the_maximum_folder_depth_used_for_checking_JavaScript_files_from_node_modules_Only_applicable_with_allowJs: b(6656, 3, "Specify_the_maximum_folder_depth_used_for_checking_JavaScript_files_from_node_modules_Only_applicabl_6656", "Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'."), Specify_what_module_code_is_generated: b(6657, 3, "Specify_what_module_code_is_generated_6657", "Specify what module code is generated."), Specify_how_TypeScript_looks_up_a_file_from_a_given_module_specifier: b(6658, 3, "Specify_how_TypeScript_looks_up_a_file_from_a_given_module_specifier_6658", "Specify how TypeScript looks up a file from a given module specifier."), Set_the_newline_character_for_emitting_files: b(6659, 3, "Set_the_newline_character_for_emitting_files_6659", "Set the newline character for emitting files."), Disable_emitting_files_from_a_compilation: b(6660, 3, "Disable_emitting_files_from_a_compilation_6660", "Disable emitting files from a compilation."), Disable_generating_custom_helper_functions_like_extends_in_compiled_output: b(6661, 3, "Disable_generating_custom_helper_functions_like_extends_in_compiled_output_6661", "Disable generating custom helper functions like '__extends' in compiled output."), Disable_emitting_files_if_any_type_checking_errors_are_reported: b(6662, 3, "Disable_emitting_files_if_any_type_checking_errors_are_reported_6662", "Disable emitting files if any type checking errors are reported."), Disable_truncating_types_in_error_messages: b(6663, 3, "Disable_truncating_types_in_error_messages_6663", "Disable truncating types in error messages."), Enable_error_reporting_for_fallthrough_cases_in_switch_statements: b(6664, 3, "Enable_error_reporting_for_fallthrough_cases_in_switch_statements_6664", "Enable error reporting for fallthrough cases in switch statements."), Enable_error_reporting_for_expressions_and_declarations_with_an_implied_any_type: b(6665, 3, "Enable_error_reporting_for_expressions_and_declarations_with_an_implied_any_type_6665", "Enable error reporting for expressions and declarations with an implied 'any' type."), Ensure_overriding_members_in_derived_classes_are_marked_with_an_override_modifier: b(6666, 3, "Ensure_overriding_members_in_derived_classes_are_marked_with_an_override_modifier_6666", "Ensure overriding members in derived classes are marked with an override modifier."), Enable_error_reporting_for_codepaths_that_do_not_explicitly_return_in_a_function: b(6667, 3, "Enable_error_reporting_for_codepaths_that_do_not_explicitly_return_in_a_function_6667", "Enable error reporting for codepaths that do not explicitly return in a function."), Enable_error_reporting_when_this_is_given_the_type_any: b(6668, 3, "Enable_error_reporting_when_this_is_given_the_type_any_6668", "Enable error reporting when 'this' is given the type 'any'."), Disable_adding_use_strict_directives_in_emitted_JavaScript_files: b(6669, 3, "Disable_adding_use_strict_directives_in_emitted_JavaScript_files_6669", "Disable adding 'use strict' directives in emitted JavaScript files."), Disable_including_any_library_files_including_the_default_lib_d_ts: b(6670, 3, "Disable_including_any_library_files_including_the_default_lib_d_ts_6670", "Disable including any library files, including the default lib.d.ts."), Enforces_using_indexed_accessors_for_keys_declared_using_an_indexed_type: b(6671, 3, "Enforces_using_indexed_accessors_for_keys_declared_using_an_indexed_type_6671", "Enforces using indexed accessors for keys declared using an indexed type."), Disallow_import_s_require_s_or_reference_s_from_expanding_the_number_of_files_TypeScript_should_add_to_a_project: b(6672, 3, "Disallow_import_s_require_s_or_reference_s_from_expanding_the_number_of_files_TypeScript_should_add__6672", "Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project."), Disable_strict_checking_of_generic_signatures_in_function_types: b(6673, 3, "Disable_strict_checking_of_generic_signatures_in_function_types_6673", "Disable strict checking of generic signatures in function types."), Add_undefined_to_a_type_when_accessed_using_an_index: b(6674, 3, "Add_undefined_to_a_type_when_accessed_using_an_index_6674", "Add 'undefined' to a type when accessed using an index."), Enable_error_reporting_when_local_variables_aren_t_read: b(6675, 3, "Enable_error_reporting_when_local_variables_aren_t_read_6675", "Enable error reporting when local variables aren't read."), Raise_an_error_when_a_function_parameter_isn_t_read: b(6676, 3, "Raise_an_error_when_a_function_parameter_isn_t_read_6676", "Raise an error when a function parameter isn't read."), Deprecated_setting_Use_outFile_instead: b(6677, 3, "Deprecated_setting_Use_outFile_instead_6677", "Deprecated setting. Use 'outFile' instead."), Specify_an_output_folder_for_all_emitted_files: b(6678, 3, "Specify_an_output_folder_for_all_emitted_files_6678", "Specify an output folder for all emitted files."), Specify_a_file_that_bundles_all_outputs_into_one_JavaScript_file_If_declaration_is_true_also_designates_a_file_that_bundles_all_d_ts_output: b(6679, 3, "Specify_a_file_that_bundles_all_outputs_into_one_JavaScript_file_If_declaration_is_true_also_designa_6679", "Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output."), Specify_a_set_of_entries_that_re_map_imports_to_additional_lookup_locations: b(6680, 3, "Specify_a_set_of_entries_that_re_map_imports_to_additional_lookup_locations_6680", "Specify a set of entries that re-map imports to additional lookup locations."), Specify_a_list_of_language_service_plugins_to_include: b(6681, 3, "Specify_a_list_of_language_service_plugins_to_include_6681", "Specify a list of language service plugins to include."), Disable_erasing_const_enum_declarations_in_generated_code: b(6682, 3, "Disable_erasing_const_enum_declarations_in_generated_code_6682", "Disable erasing 'const enum' declarations in generated code."), Disable_resolving_symlinks_to_their_realpath_This_correlates_to_the_same_flag_in_node: b(6683, 3, "Disable_resolving_symlinks_to_their_realpath_This_correlates_to_the_same_flag_in_node_6683", "Disable resolving symlinks to their realpath. This correlates to the same flag in node."), Disable_wiping_the_console_in_watch_mode: b(6684, 3, "Disable_wiping_the_console_in_watch_mode_6684", "Disable wiping the console in watch mode."), Enable_color_and_formatting_in_TypeScript_s_output_to_make_compiler_errors_easier_to_read: b(6685, 3, "Enable_color_and_formatting_in_TypeScript_s_output_to_make_compiler_errors_easier_to_read_6685", "Enable color and formatting in TypeScript's output to make compiler errors easier to read."), Specify_the_object_invoked_for_createElement_This_only_applies_when_targeting_react_JSX_emit: b(6686, 3, "Specify_the_object_invoked_for_createElement_This_only_applies_when_targeting_react_JSX_emit_6686", "Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit."), Specify_an_array_of_objects_that_specify_paths_for_projects_Used_in_project_references: b(6687, 3, "Specify_an_array_of_objects_that_specify_paths_for_projects_Used_in_project_references_6687", "Specify an array of objects that specify paths for projects. Used in project references."), Disable_emitting_comments: b(6688, 3, "Disable_emitting_comments_6688", "Disable emitting comments."), Enable_importing_json_files: b(6689, 3, "Enable_importing_json_files_6689", "Enable importing .json files."), Specify_the_root_folder_within_your_source_files: b(6690, 3, "Specify_the_root_folder_within_your_source_files_6690", "Specify the root folder within your source files."), Allow_multiple_folders_to_be_treated_as_one_when_resolving_modules: b(6691, 3, "Allow_multiple_folders_to_be_treated_as_one_when_resolving_modules_6691", "Allow multiple folders to be treated as one when resolving modules."), Skip_type_checking_d_ts_files_that_are_included_with_TypeScript: b(6692, 3, "Skip_type_checking_d_ts_files_that_are_included_with_TypeScript_6692", "Skip type checking .d.ts files that are included with TypeScript."), Skip_type_checking_all_d_ts_files: b(6693, 3, "Skip_type_checking_all_d_ts_files_6693", "Skip type checking all .d.ts files."), Create_source_map_files_for_emitted_JavaScript_files: b(6694, 3, "Create_source_map_files_for_emitted_JavaScript_files_6694", "Create source map files for emitted JavaScript files."), Specify_the_root_path_for_debuggers_to_find_the_reference_source_code: b(6695, 3, "Specify_the_root_path_for_debuggers_to_find_the_reference_source_code_6695", "Specify the root path for debuggers to find the reference source code."), Check_that_the_arguments_for_bind_call_and_apply_methods_match_the_original_function: b(6697, 3, "Check_that_the_arguments_for_bind_call_and_apply_methods_match_the_original_function_6697", "Check that the arguments for 'bind', 'call', and 'apply' methods match the original function."), When_assigning_functions_check_to_ensure_parameters_and_the_return_values_are_subtype_compatible: b(6698, 3, "When_assigning_functions_check_to_ensure_parameters_and_the_return_values_are_subtype_compatible_6698", "When assigning functions, check to ensure parameters and the return values are subtype-compatible."), When_type_checking_take_into_account_null_and_undefined: b(6699, 3, "When_type_checking_take_into_account_null_and_undefined_6699", "When type checking, take into account 'null' and 'undefined'."), Check_for_class_properties_that_are_declared_but_not_set_in_the_constructor: b(6700, 3, "Check_for_class_properties_that_are_declared_but_not_set_in_the_constructor_6700", "Check for class properties that are declared but not set in the constructor."), Disable_emitting_declarations_that_have_internal_in_their_JSDoc_comments: b(6701, 3, "Disable_emitting_declarations_that_have_internal_in_their_JSDoc_comments_6701", "Disable emitting declarations that have '@internal' in their JSDoc comments."), Disable_reporting_of_excess_property_errors_during_the_creation_of_object_literals: b(6702, 3, "Disable_reporting_of_excess_property_errors_during_the_creation_of_object_literals_6702", "Disable reporting of excess property errors during the creation of object literals."), Suppress_noImplicitAny_errors_when_indexing_objects_that_lack_index_signatures: b(6703, 3, "Suppress_noImplicitAny_errors_when_indexing_objects_that_lack_index_signatures_6703", "Suppress 'noImplicitAny' errors when indexing objects that lack index signatures."), Synchronously_call_callbacks_and_update_the_state_of_directory_watchers_on_platforms_that_don_t_support_recursive_watching_natively: b(6704, 3, "Synchronously_call_callbacks_and_update_the_state_of_directory_watchers_on_platforms_that_don_t_supp_6704", "Synchronously call callbacks and update the state of directory watchers on platforms that don`t support recursive watching natively."), Set_the_JavaScript_language_version_for_emitted_JavaScript_and_include_compatible_library_declarations: b(6705, 3, "Set_the_JavaScript_language_version_for_emitted_JavaScript_and_include_compatible_library_declaratio_6705", "Set the JavaScript language version for emitted JavaScript and include compatible library declarations."), Log_paths_used_during_the_moduleResolution_process: b(6706, 3, "Log_paths_used_during_the_moduleResolution_process_6706", "Log paths used during the 'moduleResolution' process."), Specify_the_path_to_tsbuildinfo_incremental_compilation_file: b(6707, 3, "Specify_the_path_to_tsbuildinfo_incremental_compilation_file_6707", "Specify the path to .tsbuildinfo incremental compilation file."), Specify_options_for_automatic_acquisition_of_declaration_files: b(6709, 3, "Specify_options_for_automatic_acquisition_of_declaration_files_6709", "Specify options for automatic acquisition of declaration files."), Specify_multiple_folders_that_act_like_Slashnode_modules_Slash_types: b(6710, 3, "Specify_multiple_folders_that_act_like_Slashnode_modules_Slash_types_6710", "Specify multiple folders that act like './node_modules/@types'."), Specify_type_package_names_to_be_included_without_being_referenced_in_a_source_file: b(6711, 3, "Specify_type_package_names_to_be_included_without_being_referenced_in_a_source_file_6711", "Specify type package names to be included without being referenced in a source file."), Emit_ECMAScript_standard_compliant_class_fields: b(6712, 3, "Emit_ECMAScript_standard_compliant_class_fields_6712", "Emit ECMAScript-standard-compliant class fields."), Enable_verbose_logging: b(6713, 3, "Enable_verbose_logging_6713", "Enable verbose logging."), Specify_how_directories_are_watched_on_systems_that_lack_recursive_file_watching_functionality: b(6714, 3, "Specify_how_directories_are_watched_on_systems_that_lack_recursive_file_watching_functionality_6714", "Specify how directories are watched on systems that lack recursive file-watching functionality."), Specify_how_the_TypeScript_watch_mode_works: b(6715, 3, "Specify_how_the_TypeScript_watch_mode_works_6715", "Specify how the TypeScript watch mode works."), Require_undeclared_properties_from_index_signatures_to_use_element_accesses: b(6717, 3, "Require_undeclared_properties_from_index_signatures_to_use_element_accesses_6717", "Require undeclared properties from index signatures to use element accesses."), Specify_emit_Slashchecking_behavior_for_imports_that_are_only_used_for_types: b(6718, 3, "Specify_emit_Slashchecking_behavior_for_imports_that_are_only_used_for_types_6718", "Specify emit/checking behavior for imports that are only used for types."), Default_catch_clause_variables_as_unknown_instead_of_any: b(6803, 3, "Default_catch_clause_variables_as_unknown_instead_of_any_6803", "Default catch clause variables as 'unknown' instead of 'any'."), Do_not_transform_or_elide_any_imports_or_exports_not_marked_as_type_only_ensuring_they_are_written_in_the_output_file_s_format_based_on_the_module_setting: b(6804, 3, "Do_not_transform_or_elide_any_imports_or_exports_not_marked_as_type_only_ensuring_they_are_written_i_6804", "Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting."), one_of_Colon: b(6900, 3, "one_of_Colon_6900", "one of:"), one_or_more_Colon: b(6901, 3, "one_or_more_Colon_6901", "one or more:"), type_Colon: b(6902, 3, "type_Colon_6902", "type:"), default_Colon: b(6903, 3, "default_Colon_6903", "default:"), module_system_or_esModuleInterop: b(6904, 3, "module_system_or_esModuleInterop_6904", 'module === "system" or esModuleInterop'), false_unless_strict_is_set: b(6905, 3, "false_unless_strict_is_set_6905", "`false`, unless `strict` is set"), false_unless_composite_is_set: b(6906, 3, "false_unless_composite_is_set_6906", "`false`, unless `composite` is set"), node_modules_bower_components_jspm_packages_plus_the_value_of_outDir_if_one_is_specified: b(6907, 3, "node_modules_bower_components_jspm_packages_plus_the_value_of_outDir_if_one_is_specified_6907", '`["node_modules", "bower_components", "jspm_packages"]`, plus the value of `outDir` if one is specified.'), if_files_is_specified_otherwise_Asterisk_Asterisk_Slash_Asterisk: b(6908, 3, "if_files_is_specified_otherwise_Asterisk_Asterisk_Slash_Asterisk_6908", '`[]` if `files` is specified, otherwise `["**/*"]`'), true_if_composite_false_otherwise: b(6909, 3, "true_if_composite_false_otherwise_6909", "`true` if `composite`, `false` otherwise"), module_AMD_or_UMD_or_System_or_ES6_then_Classic_Otherwise_Node: b(69010, 3, "module_AMD_or_UMD_or_System_or_ES6_then_Classic_Otherwise_Node_69010", "module === `AMD` or `UMD` or `System` or `ES6`, then `Classic`, Otherwise `Node`"), Computed_from_the_list_of_input_files: b(6911, 3, "Computed_from_the_list_of_input_files_6911", "Computed from the list of input files"), Platform_specific: b(6912, 3, "Platform_specific_6912", "Platform specific"), You_can_learn_about_all_of_the_compiler_options_at_0: b(6913, 3, "You_can_learn_about_all_of_the_compiler_options_at_0_6913", "You can learn about all of the compiler options at {0}"), Including_watch_w_will_start_watching_the_current_project_for_the_file_changes_Once_set_you_can_config_watch_mode_with_Colon: b(6914, 3, "Including_watch_w_will_start_watching_the_current_project_for_the_file_changes_Once_set_you_can_conf_6914", "Including --watch, -w will start watching the current project for the file changes. Once set, you can config watch mode with:"), Using_build_b_will_make_tsc_behave_more_like_a_build_orchestrator_than_a_compiler_This_is_used_to_trigger_building_composite_projects_which_you_can_learn_more_about_at_0: b(6915, 3, "Using_build_b_will_make_tsc_behave_more_like_a_build_orchestrator_than_a_compiler_This_is_used_to_tr_6915", "Using --build, -b will make tsc behave more like a build orchestrator than a compiler. This is used to trigger building composite projects which you can learn more about at {0}"), COMMON_COMMANDS: b(6916, 3, "COMMON_COMMANDS_6916", "COMMON COMMANDS"), ALL_COMPILER_OPTIONS: b(6917, 3, "ALL_COMPILER_OPTIONS_6917", "ALL COMPILER OPTIONS"), WATCH_OPTIONS: b(6918, 3, "WATCH_OPTIONS_6918", "WATCH OPTIONS"), BUILD_OPTIONS: b(6919, 3, "BUILD_OPTIONS_6919", "BUILD OPTIONS"), COMMON_COMPILER_OPTIONS: b(6920, 3, "COMMON_COMPILER_OPTIONS_6920", "COMMON COMPILER OPTIONS"), COMMAND_LINE_FLAGS: b(6921, 3, "COMMAND_LINE_FLAGS_6921", "COMMAND LINE FLAGS"), tsc_Colon_The_TypeScript_Compiler: b(6922, 3, "tsc_Colon_The_TypeScript_Compiler_6922", "tsc: The TypeScript Compiler"), Compiles_the_current_project_tsconfig_json_in_the_working_directory: b(6923, 3, "Compiles_the_current_project_tsconfig_json_in_the_working_directory_6923", "Compiles the current project (tsconfig.json in the working directory.)"), Ignoring_tsconfig_json_compiles_the_specified_files_with_default_compiler_options: b(6924, 3, "Ignoring_tsconfig_json_compiles_the_specified_files_with_default_compiler_options_6924", "Ignoring tsconfig.json, compiles the specified files with default compiler options."), Build_a_composite_project_in_the_working_directory: b(6925, 3, "Build_a_composite_project_in_the_working_directory_6925", "Build a composite project in the working directory."), Creates_a_tsconfig_json_with_the_recommended_settings_in_the_working_directory: b(6926, 3, "Creates_a_tsconfig_json_with_the_recommended_settings_in_the_working_directory_6926", "Creates a tsconfig.json with the recommended settings in the working directory."), Compiles_the_TypeScript_project_located_at_the_specified_path: b(6927, 3, "Compiles_the_TypeScript_project_located_at_the_specified_path_6927", "Compiles the TypeScript project located at the specified path."), An_expanded_version_of_this_information_showing_all_possible_compiler_options: b(6928, 3, "An_expanded_version_of_this_information_showing_all_possible_compiler_options_6928", "An expanded version of this information, showing all possible compiler options"), Compiles_the_current_project_with_additional_settings: b(6929, 3, "Compiles_the_current_project_with_additional_settings_6929", "Compiles the current project, with additional settings."), true_for_ES2022_and_above_including_ESNext: b(6930, 3, "true_for_ES2022_and_above_including_ESNext_6930", "`true` for ES2022 and above, including ESNext."), List_of_file_name_suffixes_to_search_when_resolving_a_module: b(6931, 1, "List_of_file_name_suffixes_to_search_when_resolving_a_module_6931", "List of file name suffixes to search when resolving a module."), Variable_0_implicitly_has_an_1_type: b(7005, 1, "Variable_0_implicitly_has_an_1_type_7005", "Variable '{0}' implicitly has an '{1}' type."), Parameter_0_implicitly_has_an_1_type: b(7006, 1, "Parameter_0_implicitly_has_an_1_type_7006", "Parameter '{0}' implicitly has an '{1}' type."), Member_0_implicitly_has_an_1_type: b(7008, 1, "Member_0_implicitly_has_an_1_type_7008", "Member '{0}' implicitly has an '{1}' type."), new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type: b(7009, 1, "new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type_7009", "'new' expression, whose target lacks a construct signature, implicitly has an 'any' type."), _0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type: b(7010, 1, "_0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type_7010", "'{0}', which lacks return-type annotation, implicitly has an '{1}' return type."), Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type: b(7011, 1, "Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type_7011", "Function expression, which lacks return-type annotation, implicitly has an '{0}' return type."), This_overload_implicitly_returns_the_type_0_because_it_lacks_a_return_type_annotation: b(7012, 1, "This_overload_implicitly_returns_the_type_0_because_it_lacks_a_return_type_annotation_7012", "This overload implicitly returns the type '{0}' because it lacks a return type annotation."), Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type: b(7013, 1, "Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type_7013", "Construct signature, which lacks return-type annotation, implicitly has an 'any' return type."), Function_type_which_lacks_return_type_annotation_implicitly_has_an_0_return_type: b(7014, 1, "Function_type_which_lacks_return_type_annotation_implicitly_has_an_0_return_type_7014", "Function type, which lacks return-type annotation, implicitly has an '{0}' return type."), Element_implicitly_has_an_any_type_because_index_expression_is_not_of_type_number: b(7015, 1, "Element_implicitly_has_an_any_type_because_index_expression_is_not_of_type_number_7015", "Element implicitly has an 'any' type because index expression is not of type 'number'."), Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type: b(7016, 1, "Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type_7016", "Could not find a declaration file for module '{0}'. '{1}' implicitly has an 'any' type."), Element_implicitly_has_an_any_type_because_type_0_has_no_index_signature: b(7017, 1, "Element_implicitly_has_an_any_type_because_type_0_has_no_index_signature_7017", "Element implicitly has an 'any' type because type '{0}' has no index signature."), Object_literal_s_property_0_implicitly_has_an_1_type: b(7018, 1, "Object_literal_s_property_0_implicitly_has_an_1_type_7018", "Object literal's property '{0}' implicitly has an '{1}' type."), Rest_parameter_0_implicitly_has_an_any_type: b(7019, 1, "Rest_parameter_0_implicitly_has_an_any_type_7019", "Rest parameter '{0}' implicitly has an 'any[]' type."), Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type: b(7020, 1, "Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type_7020", "Call signature, which lacks return-type annotation, implicitly has an 'any' return type."), _0_implicitly_has_type_any_because_it_does_not_have_a_type_annotation_and_is_referenced_directly_or_indirectly_in_its_own_initializer: b(7022, 1, "_0_implicitly_has_type_any_because_it_does_not_have_a_type_annotation_and_is_referenced_directly_or__7022", "'{0}' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer."), _0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions: b(7023, 1, "_0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_reference_7023", "'{0}' implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions."), Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions: b(7024, 1, "Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_ref_7024", "Function implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions."), Generator_implicitly_has_yield_type_0_because_it_does_not_yield_any_values_Consider_supplying_a_return_type_annotation: b(7025, 1, "Generator_implicitly_has_yield_type_0_because_it_does_not_yield_any_values_Consider_supplying_a_retu_7025", "Generator implicitly has yield type '{0}' because it does not yield any values. Consider supplying a return type annotation."), JSX_element_implicitly_has_type_any_because_no_interface_JSX_0_exists: b(7026, 1, "JSX_element_implicitly_has_type_any_because_no_interface_JSX_0_exists_7026", "JSX element implicitly has type 'any' because no interface 'JSX.{0}' exists."), Unreachable_code_detected: b(7027, 1, "Unreachable_code_detected_7027", "Unreachable code detected.", !0), Unused_label: b(7028, 1, "Unused_label_7028", "Unused label.", !0), Fallthrough_case_in_switch: b(7029, 1, "Fallthrough_case_in_switch_7029", "Fallthrough case in switch."), Not_all_code_paths_return_a_value: b(7030, 1, "Not_all_code_paths_return_a_value_7030", "Not all code paths return a value."), Binding_element_0_implicitly_has_an_1_type: b(7031, 1, "Binding_element_0_implicitly_has_an_1_type_7031", "Binding element '{0}' implicitly has an '{1}' type."), Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation: b(7032, 1, "Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation_7032", "Property '{0}' implicitly has type 'any', because its set accessor lacks a parameter type annotation."), Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation: b(7033, 1, "Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation_7033", "Property '{0}' implicitly has type 'any', because its get accessor lacks a return type annotation."), Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined: b(7034, 1, "Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined_7034", "Variable '{0}' implicitly has type '{1}' in some locations where its type cannot be determined."), Try_npm_i_save_dev_types_Slash_1_if_it_exists_or_add_a_new_declaration_d_ts_file_containing_declare_module_0: b(7035, 1, "Try_npm_i_save_dev_types_Slash_1_if_it_exists_or_add_a_new_declaration_d_ts_file_containing_declare__7035", "Try `npm i --save-dev @types/{1}` if it exists or add a new declaration (.d.ts) file containing `declare module '{0}';`"), Dynamic_import_s_specifier_must_be_of_type_string_but_here_has_type_0: b(7036, 1, "Dynamic_import_s_specifier_must_be_of_type_string_but_here_has_type_0_7036", "Dynamic import's specifier must be of type 'string', but here has type '{0}'."), Enables_emit_interoperability_between_CommonJS_and_ES_Modules_via_creation_of_namespace_objects_for_all_imports_Implies_allowSyntheticDefaultImports: b(7037, 3, "Enables_emit_interoperability_between_CommonJS_and_ES_Modules_via_creation_of_namespace_objects_for__7037", "Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'."), Type_originates_at_this_import_A_namespace_style_import_cannot_be_called_or_constructed_and_will_cause_a_failure_at_runtime_Consider_using_a_default_import_or_import_require_here_instead: b(7038, 3, "Type_originates_at_this_import_A_namespace_style_import_cannot_be_called_or_constructed_and_will_cau_7038", "Type originates at this import. A namespace-style import cannot be called or constructed, and will cause a failure at runtime. Consider using a default import or import require here instead."), Mapped_object_type_implicitly_has_an_any_template_type: b(7039, 1, "Mapped_object_type_implicitly_has_an_any_template_type_7039", "Mapped object type implicitly has an 'any' template type."), If_the_0_package_actually_exposes_this_module_consider_sending_a_pull_request_to_amend_https_Colon_Slash_Slashgithub_com_SlashDefinitelyTyped_SlashDefinitelyTyped_Slashtree_Slashmaster_Slashtypes_Slash_1: b(7040, 1, "If_the_0_package_actually_exposes_this_module_consider_sending_a_pull_request_to_amend_https_Colon_S_7040", "If the '{0}' package actually exposes this module, consider sending a pull request to amend 'https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/{1}'"), The_containing_arrow_function_captures_the_global_value_of_this: b(7041, 1, "The_containing_arrow_function_captures_the_global_value_of_this_7041", "The containing arrow function captures the global value of 'this'."), Module_0_was_resolved_to_1_but_resolveJsonModule_is_not_used: b(7042, 1, "Module_0_was_resolved_to_1_but_resolveJsonModule_is_not_used_7042", "Module '{0}' was resolved to '{1}', but '--resolveJsonModule' is not used."), Variable_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage: b(7043, 2, "Variable_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage_7043", "Variable '{0}' implicitly has an '{1}' type, but a better type may be inferred from usage."), Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage: b(7044, 2, "Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage_7044", "Parameter '{0}' implicitly has an '{1}' type, but a better type may be inferred from usage."), Member_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage: b(7045, 2, "Member_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage_7045", "Member '{0}' implicitly has an '{1}' type, but a better type may be inferred from usage."), Variable_0_implicitly_has_type_1_in_some_locations_but_a_better_type_may_be_inferred_from_usage: b(7046, 2, "Variable_0_implicitly_has_type_1_in_some_locations_but_a_better_type_may_be_inferred_from_usage_7046", "Variable '{0}' implicitly has type '{1}' in some locations, but a better type may be inferred from usage."), Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage: b(7047, 2, "Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage_7047", "Rest parameter '{0}' implicitly has an 'any[]' type, but a better type may be inferred from usage."), Property_0_implicitly_has_type_any_but_a_better_type_for_its_get_accessor_may_be_inferred_from_usage: b(7048, 2, "Property_0_implicitly_has_type_any_but_a_better_type_for_its_get_accessor_may_be_inferred_from_usage_7048", "Property '{0}' implicitly has type 'any', but a better type for its get accessor may be inferred from usage."), Property_0_implicitly_has_type_any_but_a_better_type_for_its_set_accessor_may_be_inferred_from_usage: b(7049, 2, "Property_0_implicitly_has_type_any_but_a_better_type_for_its_set_accessor_may_be_inferred_from_usage_7049", "Property '{0}' implicitly has type 'any', but a better type for its set accessor may be inferred from usage."), _0_implicitly_has_an_1_return_type_but_a_better_type_may_be_inferred_from_usage: b(7050, 2, "_0_implicitly_has_an_1_return_type_but_a_better_type_may_be_inferred_from_usage_7050", "'{0}' implicitly has an '{1}' return type, but a better type may be inferred from usage."), Parameter_has_a_name_but_no_type_Did_you_mean_0_Colon_1: b(7051, 1, "Parameter_has_a_name_but_no_type_Did_you_mean_0_Colon_1_7051", "Parameter has a name but no type. Did you mean '{0}: {1}'?"), Element_implicitly_has_an_any_type_because_type_0_has_no_index_signature_Did_you_mean_to_call_1: b(7052, 1, "Element_implicitly_has_an_any_type_because_type_0_has_no_index_signature_Did_you_mean_to_call_1_7052", "Element implicitly has an 'any' type because type '{0}' has no index signature. Did you mean to call '{1}'?"), Element_implicitly_has_an_any_type_because_expression_of_type_0_can_t_be_used_to_index_type_1: b(7053, 1, "Element_implicitly_has_an_any_type_because_expression_of_type_0_can_t_be_used_to_index_type_1_7053", "Element implicitly has an 'any' type because expression of type '{0}' can't be used to index type '{1}'."), No_index_signature_with_a_parameter_of_type_0_was_found_on_type_1: b(7054, 1, "No_index_signature_with_a_parameter_of_type_0_was_found_on_type_1_7054", "No index signature with a parameter of type '{0}' was found on type '{1}'."), _0_which_lacks_return_type_annotation_implicitly_has_an_1_yield_type: b(7055, 1, "_0_which_lacks_return_type_annotation_implicitly_has_an_1_yield_type_7055", "'{0}', which lacks return-type annotation, implicitly has an '{1}' yield type."), The_inferred_type_of_this_node_exceeds_the_maximum_length_the_compiler_will_serialize_An_explicit_type_annotation_is_needed: b(7056, 1, "The_inferred_type_of_this_node_exceeds_the_maximum_length_the_compiler_will_serialize_An_explicit_ty_7056", "The inferred type of this node exceeds the maximum length the compiler will serialize. An explicit type annotation is needed."), yield_expression_implicitly_results_in_an_any_type_because_its_containing_generator_lacks_a_return_type_annotation: b(7057, 1, "yield_expression_implicitly_results_in_an_any_type_because_its_containing_generator_lacks_a_return_t_7057", "'yield' expression implicitly results in an 'any' type because its containing generator lacks a return-type annotation."), If_the_0_package_actually_exposes_this_module_try_adding_a_new_declaration_d_ts_file_containing_declare_module_1: b(7058, 1, "If_the_0_package_actually_exposes_this_module_try_adding_a_new_declaration_d_ts_file_containing_decl_7058", "If the '{0}' package actually exposes this module, try adding a new declaration (.d.ts) file containing `declare module '{1}';`"), This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Use_an_as_expression_instead: b(7059, 1, "This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Use_an_as_expression_instead_7059", "This syntax is reserved in files with the .mts or .cts extension. Use an `as` expression instead."), This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Add_a_trailing_comma_or_explicit_constraint: b(7060, 1, "This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Add_a_trailing_comma_or_explicit_cons_7060", "This syntax is reserved in files with the .mts or .cts extension. Add a trailing comma or explicit constraint."), A_mapped_type_may_not_declare_properties_or_methods: b(7061, 1, "A_mapped_type_may_not_declare_properties_or_methods_7061", "A mapped type may not declare properties or methods."), You_cannot_rename_this_element: b(8e3, 1, "You_cannot_rename_this_element_8000", "You cannot rename this element."), You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library: b(8001, 1, "You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library_8001", "You cannot rename elements that are defined in the standard TypeScript library."), import_can_only_be_used_in_TypeScript_files: b(8002, 1, "import_can_only_be_used_in_TypeScript_files_8002", "'import ... =' can only be used in TypeScript files."), export_can_only_be_used_in_TypeScript_files: b(8003, 1, "export_can_only_be_used_in_TypeScript_files_8003", "'export =' can only be used in TypeScript files."), Type_parameter_declarations_can_only_be_used_in_TypeScript_files: b(8004, 1, "Type_parameter_declarations_can_only_be_used_in_TypeScript_files_8004", "Type parameter declarations can only be used in TypeScript files."), implements_clauses_can_only_be_used_in_TypeScript_files: b(8005, 1, "implements_clauses_can_only_be_used_in_TypeScript_files_8005", "'implements' clauses can only be used in TypeScript files."), _0_declarations_can_only_be_used_in_TypeScript_files: b(8006, 1, "_0_declarations_can_only_be_used_in_TypeScript_files_8006", "'{0}' declarations can only be used in TypeScript files."), Type_aliases_can_only_be_used_in_TypeScript_files: b(8008, 1, "Type_aliases_can_only_be_used_in_TypeScript_files_8008", "Type aliases can only be used in TypeScript files."), The_0_modifier_can_only_be_used_in_TypeScript_files: b(8009, 1, "The_0_modifier_can_only_be_used_in_TypeScript_files_8009", "The '{0}' modifier can only be used in TypeScript files."), Type_annotations_can_only_be_used_in_TypeScript_files: b(8010, 1, "Type_annotations_can_only_be_used_in_TypeScript_files_8010", "Type annotations can only be used in TypeScript files."), Type_arguments_can_only_be_used_in_TypeScript_files: b(8011, 1, "Type_arguments_can_only_be_used_in_TypeScript_files_8011", "Type arguments can only be used in TypeScript files."), Parameter_modifiers_can_only_be_used_in_TypeScript_files: b(8012, 1, "Parameter_modifiers_can_only_be_used_in_TypeScript_files_8012", "Parameter modifiers can only be used in TypeScript files."), Non_null_assertions_can_only_be_used_in_TypeScript_files: b(8013, 1, "Non_null_assertions_can_only_be_used_in_TypeScript_files_8013", "Non-null assertions can only be used in TypeScript files."), Type_assertion_expressions_can_only_be_used_in_TypeScript_files: b(8016, 1, "Type_assertion_expressions_can_only_be_used_in_TypeScript_files_8016", "Type assertion expressions can only be used in TypeScript files."), Octal_literal_types_must_use_ES2015_syntax_Use_the_syntax_0: b(8017, 1, "Octal_literal_types_must_use_ES2015_syntax_Use_the_syntax_0_8017", "Octal literal types must use ES2015 syntax. Use the syntax '{0}'."), Octal_literals_are_not_allowed_in_enums_members_initializer_Use_the_syntax_0: b(8018, 1, "Octal_literals_are_not_allowed_in_enums_members_initializer_Use_the_syntax_0_8018", "Octal literals are not allowed in enums members initializer. Use the syntax '{0}'."), Report_errors_in_js_files: b(8019, 3, "Report_errors_in_js_files_8019", "Report errors in .js files."), JSDoc_types_can_only_be_used_inside_documentation_comments: b(8020, 1, "JSDoc_types_can_only_be_used_inside_documentation_comments_8020", "JSDoc types can only be used inside documentation comments."), JSDoc_typedef_tag_should_either_have_a_type_annotation_or_be_followed_by_property_or_member_tags: b(8021, 1, "JSDoc_typedef_tag_should_either_have_a_type_annotation_or_be_followed_by_property_or_member_tags_8021", "JSDoc '@typedef' tag should either have a type annotation or be followed by '@property' or '@member' tags."), JSDoc_0_is_not_attached_to_a_class: b(8022, 1, "JSDoc_0_is_not_attached_to_a_class_8022", "JSDoc '@{0}' is not attached to a class."), JSDoc_0_1_does_not_match_the_extends_2_clause: b(8023, 1, "JSDoc_0_1_does_not_match_the_extends_2_clause_8023", "JSDoc '@{0} {1}' does not match the 'extends {2}' clause."), JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name: b(8024, 1, "JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name_8024", "JSDoc '@param' tag has name '{0}', but there is no parameter with that name."), Class_declarations_cannot_have_more_than_one_augments_or_extends_tag: b(8025, 1, "Class_declarations_cannot_have_more_than_one_augments_or_extends_tag_8025", "Class declarations cannot have more than one '@augments' or '@extends' tag."), Expected_0_type_arguments_provide_these_with_an_extends_tag: b(8026, 1, "Expected_0_type_arguments_provide_these_with_an_extends_tag_8026", "Expected {0} type arguments; provide these with an '@extends' tag."), Expected_0_1_type_arguments_provide_these_with_an_extends_tag: b(8027, 1, "Expected_0_1_type_arguments_provide_these_with_an_extends_tag_8027", "Expected {0}-{1} type arguments; provide these with an '@extends' tag."), JSDoc_may_only_appear_in_the_last_parameter_of_a_signature: b(8028, 1, "JSDoc_may_only_appear_in_the_last_parameter_of_a_signature_8028", "JSDoc '...' may only appear in the last parameter of a signature."), JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name_It_would_match_arguments_if_it_had_an_array_type: b(8029, 1, "JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name_It_would_match_arguments_if_it_h_8029", "JSDoc '@param' tag has name '{0}', but there is no parameter with that name. It would match 'arguments' if it had an array type."), The_type_of_a_function_declaration_must_match_the_function_s_signature: b(8030, 1, "The_type_of_a_function_declaration_must_match_the_function_s_signature_8030", "The type of a function declaration must match the function's signature."), You_cannot_rename_a_module_via_a_global_import: b(8031, 1, "You_cannot_rename_a_module_via_a_global_import_8031", "You cannot rename a module via a global import."), Qualified_name_0_is_not_allowed_without_a_leading_param_object_1: b(8032, 1, "Qualified_name_0_is_not_allowed_without_a_leading_param_object_1_8032", "Qualified name '{0}' is not allowed without a leading '@param {object} {1}'."), A_JSDoc_typedef_comment_may_not_contain_multiple_type_tags: b(8033, 1, "A_JSDoc_typedef_comment_may_not_contain_multiple_type_tags_8033", "A JSDoc '@typedef' comment may not contain multiple '@type' tags."), The_tag_was_first_specified_here: b(8034, 1, "The_tag_was_first_specified_here_8034", "The tag was first specified here."), You_cannot_rename_elements_that_are_defined_in_a_node_modules_folder: b(8035, 1, "You_cannot_rename_elements_that_are_defined_in_a_node_modules_folder_8035", "You cannot rename elements that are defined in a 'node_modules' folder."), You_cannot_rename_elements_that_are_defined_in_another_node_modules_folder: b(8036, 1, "You_cannot_rename_elements_that_are_defined_in_another_node_modules_folder_8036", "You cannot rename elements that are defined in another 'node_modules' folder."), Type_satisfaction_expressions_can_only_be_used_in_TypeScript_files: b(8037, 1, "Type_satisfaction_expressions_can_only_be_used_in_TypeScript_files_8037", "Type satisfaction expressions can only be used in TypeScript files."), Decorators_may_not_appear_after_export_or_export_default_if_they_also_appear_before_export: b(8038, 1, "Decorators_may_not_appear_after_export_or_export_default_if_they_also_appear_before_export_8038", "Decorators may not appear after 'export' or 'export default' if they also appear before 'export'."), Declaration_emit_for_this_file_requires_using_private_name_0_An_explicit_type_annotation_may_unblock_declaration_emit: b(9005, 1, "Declaration_emit_for_this_file_requires_using_private_name_0_An_explicit_type_annotation_may_unblock_9005", "Declaration emit for this file requires using private name '{0}'. An explicit type annotation may unblock declaration emit."), Declaration_emit_for_this_file_requires_using_private_name_0_from_module_1_An_explicit_type_annotation_may_unblock_declaration_emit: b(9006, 1, "Declaration_emit_for_this_file_requires_using_private_name_0_from_module_1_An_explicit_type_annotati_9006", "Declaration emit for this file requires using private name '{0}' from module '{1}'. An explicit type annotation may unblock declaration emit."), JSX_attributes_must_only_be_assigned_a_non_empty_expression: b(17e3, 1, "JSX_attributes_must_only_be_assigned_a_non_empty_expression_17000", "JSX attributes must only be assigned a non-empty 'expression'."), JSX_elements_cannot_have_multiple_attributes_with_the_same_name: b(17001, 1, "JSX_elements_cannot_have_multiple_attributes_with_the_same_name_17001", "JSX elements cannot have multiple attributes with the same name."), Expected_corresponding_JSX_closing_tag_for_0: b(17002, 1, "Expected_corresponding_JSX_closing_tag_for_0_17002", "Expected corresponding JSX closing tag for '{0}'."), Cannot_use_JSX_unless_the_jsx_flag_is_provided: b(17004, 1, "Cannot_use_JSX_unless_the_jsx_flag_is_provided_17004", "Cannot use JSX unless the '--jsx' flag is provided."), A_constructor_cannot_contain_a_super_call_when_its_class_extends_null: b(17005, 1, "A_constructor_cannot_contain_a_super_call_when_its_class_extends_null_17005", "A constructor cannot contain a 'super' call when its class extends 'null'."), An_unary_expression_with_the_0_operator_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Consider_enclosing_the_expression_in_parentheses: b(17006, 1, "An_unary_expression_with_the_0_operator_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_ex_17006", "An unary expression with the '{0}' operator is not allowed in the left-hand side of an exponentiation expression. Consider enclosing the expression in parentheses."), A_type_assertion_expression_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Consider_enclosing_the_expression_in_parentheses: b(17007, 1, "A_type_assertion_expression_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Con_17007", "A type assertion expression is not allowed in the left-hand side of an exponentiation expression. Consider enclosing the expression in parentheses."), JSX_element_0_has_no_corresponding_closing_tag: b(17008, 1, "JSX_element_0_has_no_corresponding_closing_tag_17008", "JSX element '{0}' has no corresponding closing tag."), super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class: b(17009, 1, "super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class_17009", "'super' must be called before accessing 'this' in the constructor of a derived class."), Unknown_type_acquisition_option_0: b(17010, 1, "Unknown_type_acquisition_option_0_17010", "Unknown type acquisition option '{0}'."), super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class: b(17011, 1, "super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class_17011", "'super' must be called before accessing a property of 'super' in the constructor of a derived class."), _0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2: b(17012, 1, "_0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2_17012", "'{0}' is not a valid meta-property for keyword '{1}'. Did you mean '{2}'?"), Meta_property_0_is_only_allowed_in_the_body_of_a_function_declaration_function_expression_or_constructor: b(17013, 1, "Meta_property_0_is_only_allowed_in_the_body_of_a_function_declaration_function_expression_or_constru_17013", "Meta-property '{0}' is only allowed in the body of a function declaration, function expression, or constructor."), JSX_fragment_has_no_corresponding_closing_tag: b(17014, 1, "JSX_fragment_has_no_corresponding_closing_tag_17014", "JSX fragment has no corresponding closing tag."), Expected_corresponding_closing_tag_for_JSX_fragment: b(17015, 1, "Expected_corresponding_closing_tag_for_JSX_fragment_17015", "Expected corresponding closing tag for JSX fragment."), The_jsxFragmentFactory_compiler_option_must_be_provided_to_use_JSX_fragments_with_the_jsxFactory_compiler_option: b(17016, 1, "The_jsxFragmentFactory_compiler_option_must_be_provided_to_use_JSX_fragments_with_the_jsxFactory_com_17016", "The 'jsxFragmentFactory' compiler option must be provided to use JSX fragments with the 'jsxFactory' compiler option."), An_jsxFrag_pragma_is_required_when_using_an_jsx_pragma_with_JSX_fragments: b(17017, 1, "An_jsxFrag_pragma_is_required_when_using_an_jsx_pragma_with_JSX_fragments_17017", "An @jsxFrag pragma is required when using an @jsx pragma with JSX fragments."), Unknown_type_acquisition_option_0_Did_you_mean_1: b(17018, 1, "Unknown_type_acquisition_option_0_Did_you_mean_1_17018", "Unknown type acquisition option '{0}'. Did you mean '{1}'?"), _0_at_the_end_of_a_type_is_not_valid_TypeScript_syntax_Did_you_mean_to_write_1: b(17019, 1, "_0_at_the_end_of_a_type_is_not_valid_TypeScript_syntax_Did_you_mean_to_write_1_17019", "'{0}' at the end of a type is not valid TypeScript syntax. Did you mean to write '{1}'?"), _0_at_the_start_of_a_type_is_not_valid_TypeScript_syntax_Did_you_mean_to_write_1: b(17020, 1, "_0_at_the_start_of_a_type_is_not_valid_TypeScript_syntax_Did_you_mean_to_write_1_17020", "'{0}' at the start of a type is not valid TypeScript syntax. Did you mean to write '{1}'?"), Circularity_detected_while_resolving_configuration_Colon_0: b(18e3, 1, "Circularity_detected_while_resolving_configuration_Colon_0_18000", "Circularity detected while resolving configuration: {0}"), The_files_list_in_config_file_0_is_empty: b(18002, 1, "The_files_list_in_config_file_0_is_empty_18002", "The 'files' list in config file '{0}' is empty."), No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2: b(18003, 1, "No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2_18003", "No inputs were found in config file '{0}'. Specified 'include' paths were '{1}' and 'exclude' paths were '{2}'."), File_is_a_CommonJS_module_it_may_be_converted_to_an_ES_module: b(80001, 2, "File_is_a_CommonJS_module_it_may_be_converted_to_an_ES_module_80001", "File is a CommonJS module; it may be converted to an ES module."), This_constructor_function_may_be_converted_to_a_class_declaration: b(80002, 2, "This_constructor_function_may_be_converted_to_a_class_declaration_80002", "This constructor function may be converted to a class declaration."), Import_may_be_converted_to_a_default_import: b(80003, 2, "Import_may_be_converted_to_a_default_import_80003", "Import may be converted to a default import."), JSDoc_types_may_be_moved_to_TypeScript_types: b(80004, 2, "JSDoc_types_may_be_moved_to_TypeScript_types_80004", "JSDoc types may be moved to TypeScript types."), require_call_may_be_converted_to_an_import: b(80005, 2, "require_call_may_be_converted_to_an_import_80005", "'require' call may be converted to an import."), This_may_be_converted_to_an_async_function: b(80006, 2, "This_may_be_converted_to_an_async_function_80006", "This may be converted to an async function."), await_has_no_effect_on_the_type_of_this_expression: b(80007, 2, "await_has_no_effect_on_the_type_of_this_expression_80007", "'await' has no effect on the type of this expression."), Numeric_literals_with_absolute_values_equal_to_2_53_or_greater_are_too_large_to_be_represented_accurately_as_integers: b(80008, 2, "Numeric_literals_with_absolute_values_equal_to_2_53_or_greater_are_too_large_to_be_represented_accur_80008", "Numeric literals with absolute values equal to 2^53 or greater are too large to be represented accurately as integers."), Add_missing_super_call: b(90001, 3, "Add_missing_super_call_90001", "Add missing 'super()' call"), Make_super_call_the_first_statement_in_the_constructor: b(90002, 3, "Make_super_call_the_first_statement_in_the_constructor_90002", "Make 'super()' call the first statement in the constructor"), Change_extends_to_implements: b(90003, 3, "Change_extends_to_implements_90003", "Change 'extends' to 'implements'"), Remove_unused_declaration_for_Colon_0: b(90004, 3, "Remove_unused_declaration_for_Colon_0_90004", "Remove unused declaration for: '{0}'"), Remove_import_from_0: b(90005, 3, "Remove_import_from_0_90005", "Remove import from '{0}'"), Implement_interface_0: b(90006, 3, "Implement_interface_0_90006", "Implement interface '{0}'"), Implement_inherited_abstract_class: b(90007, 3, "Implement_inherited_abstract_class_90007", "Implement inherited abstract class"), Add_0_to_unresolved_variable: b(90008, 3, "Add_0_to_unresolved_variable_90008", "Add '{0}.' to unresolved variable"), Remove_variable_statement: b(90010, 3, "Remove_variable_statement_90010", "Remove variable statement"), Remove_template_tag: b(90011, 3, "Remove_template_tag_90011", "Remove template tag"), Remove_type_parameters: b(90012, 3, "Remove_type_parameters_90012", "Remove type parameters"), Import_0_from_1: b(90013, 3, "Import_0_from_1_90013", `Import '{0}' from "{1}"`), Change_0_to_1: b(90014, 3, "Change_0_to_1_90014", "Change '{0}' to '{1}'"), Declare_property_0: b(90016, 3, "Declare_property_0_90016", "Declare property '{0}'"), Add_index_signature_for_property_0: b(90017, 3, "Add_index_signature_for_property_0_90017", "Add index signature for property '{0}'"), Disable_checking_for_this_file: b(90018, 3, "Disable_checking_for_this_file_90018", "Disable checking for this file"), Ignore_this_error_message: b(90019, 3, "Ignore_this_error_message_90019", "Ignore this error message"), Initialize_property_0_in_the_constructor: b(90020, 3, "Initialize_property_0_in_the_constructor_90020", "Initialize property '{0}' in the constructor"), Initialize_static_property_0: b(90021, 3, "Initialize_static_property_0_90021", "Initialize static property '{0}'"), Change_spelling_to_0: b(90022, 3, "Change_spelling_to_0_90022", "Change spelling to '{0}'"), Declare_method_0: b(90023, 3, "Declare_method_0_90023", "Declare method '{0}'"), Declare_static_method_0: b(90024, 3, "Declare_static_method_0_90024", "Declare static method '{0}'"), Prefix_0_with_an_underscore: b(90025, 3, "Prefix_0_with_an_underscore_90025", "Prefix '{0}' with an underscore"), Rewrite_as_the_indexed_access_type_0: b(90026, 3, "Rewrite_as_the_indexed_access_type_0_90026", "Rewrite as the indexed access type '{0}'"), Declare_static_property_0: b(90027, 3, "Declare_static_property_0_90027", "Declare static property '{0}'"), Call_decorator_expression: b(90028, 3, "Call_decorator_expression_90028", "Call decorator expression"), Add_async_modifier_to_containing_function: b(90029, 3, "Add_async_modifier_to_containing_function_90029", "Add async modifier to containing function"), Replace_infer_0_with_unknown: b(90030, 3, "Replace_infer_0_with_unknown_90030", "Replace 'infer {0}' with 'unknown'"), Replace_all_unused_infer_with_unknown: b(90031, 3, "Replace_all_unused_infer_with_unknown_90031", "Replace all unused 'infer' with 'unknown'"), Add_parameter_name: b(90034, 3, "Add_parameter_name_90034", "Add parameter name"), Declare_private_property_0: b(90035, 3, "Declare_private_property_0_90035", "Declare private property '{0}'"), Replace_0_with_Promise_1: b(90036, 3, "Replace_0_with_Promise_1_90036", "Replace '{0}' with 'Promise<{1}>'"), Fix_all_incorrect_return_type_of_an_async_functions: b(90037, 3, "Fix_all_incorrect_return_type_of_an_async_functions_90037", "Fix all incorrect return type of an async functions"), Declare_private_method_0: b(90038, 3, "Declare_private_method_0_90038", "Declare private method '{0}'"), Remove_unused_destructuring_declaration: b(90039, 3, "Remove_unused_destructuring_declaration_90039", "Remove unused destructuring declaration"), Remove_unused_declarations_for_Colon_0: b(90041, 3, "Remove_unused_declarations_for_Colon_0_90041", "Remove unused declarations for: '{0}'"), Declare_a_private_field_named_0: b(90053, 3, "Declare_a_private_field_named_0_90053", "Declare a private field named '{0}'."), Includes_imports_of_types_referenced_by_0: b(90054, 3, "Includes_imports_of_types_referenced_by_0_90054", "Includes imports of types referenced by '{0}'"), Remove_type_from_import_declaration_from_0: b(90055, 3, "Remove_type_from_import_declaration_from_0_90055", `Remove 'type' from import declaration from "{0}"`), Remove_type_from_import_of_0_from_1: b(90056, 3, "Remove_type_from_import_of_0_from_1_90056", `Remove 'type' from import of '{0}' from "{1}"`), Add_import_from_0: b(90057, 3, "Add_import_from_0_90057", 'Add import from "{0}"'), Update_import_from_0: b(90058, 3, "Update_import_from_0_90058", 'Update import from "{0}"'), Export_0_from_module_1: b(90059, 3, "Export_0_from_module_1_90059", "Export '{0}' from module '{1}'"), Export_all_referenced_locals: b(90060, 3, "Export_all_referenced_locals_90060", "Export all referenced locals"), Convert_function_to_an_ES2015_class: b(95001, 3, "Convert_function_to_an_ES2015_class_95001", "Convert function to an ES2015 class"), Convert_0_to_1_in_0: b(95003, 3, "Convert_0_to_1_in_0_95003", "Convert '{0}' to '{1} in {0}'"), Extract_to_0_in_1: b(95004, 3, "Extract_to_0_in_1_95004", "Extract to {0} in {1}"), Extract_function: b(95005, 3, "Extract_function_95005", "Extract function"), Extract_constant: b(95006, 3, "Extract_constant_95006", "Extract constant"), Extract_to_0_in_enclosing_scope: b(95007, 3, "Extract_to_0_in_enclosing_scope_95007", "Extract to {0} in enclosing scope"), Extract_to_0_in_1_scope: b(95008, 3, "Extract_to_0_in_1_scope_95008", "Extract to {0} in {1} scope"), Annotate_with_type_from_JSDoc: b(95009, 3, "Annotate_with_type_from_JSDoc_95009", "Annotate with type from JSDoc"), Infer_type_of_0_from_usage: b(95011, 3, "Infer_type_of_0_from_usage_95011", "Infer type of '{0}' from usage"), Infer_parameter_types_from_usage: b(95012, 3, "Infer_parameter_types_from_usage_95012", "Infer parameter types from usage"), Convert_to_default_import: b(95013, 3, "Convert_to_default_import_95013", "Convert to default import"), Install_0: b(95014, 3, "Install_0_95014", "Install '{0}'"), Replace_import_with_0: b(95015, 3, "Replace_import_with_0_95015", "Replace import with '{0}'."), Use_synthetic_default_member: b(95016, 3, "Use_synthetic_default_member_95016", "Use synthetic 'default' member."), Convert_to_ES_module: b(95017, 3, "Convert_to_ES_module_95017", "Convert to ES module"), Add_undefined_type_to_property_0: b(95018, 3, "Add_undefined_type_to_property_0_95018", "Add 'undefined' type to property '{0}'"), Add_initializer_to_property_0: b(95019, 3, "Add_initializer_to_property_0_95019", "Add initializer to property '{0}'"), Add_definite_assignment_assertion_to_property_0: b(95020, 3, "Add_definite_assignment_assertion_to_property_0_95020", "Add definite assignment assertion to property '{0}'"), Convert_all_type_literals_to_mapped_type: b(95021, 3, "Convert_all_type_literals_to_mapped_type_95021", "Convert all type literals to mapped type"), Add_all_missing_members: b(95022, 3, "Add_all_missing_members_95022", "Add all missing members"), Infer_all_types_from_usage: b(95023, 3, "Infer_all_types_from_usage_95023", "Infer all types from usage"), Delete_all_unused_declarations: b(95024, 3, "Delete_all_unused_declarations_95024", "Delete all unused declarations"), Prefix_all_unused_declarations_with_where_possible: b(95025, 3, "Prefix_all_unused_declarations_with_where_possible_95025", "Prefix all unused declarations with '_' where possible"), Fix_all_detected_spelling_errors: b(95026, 3, "Fix_all_detected_spelling_errors_95026", "Fix all detected spelling errors"), Add_initializers_to_all_uninitialized_properties: b(95027, 3, "Add_initializers_to_all_uninitialized_properties_95027", "Add initializers to all uninitialized properties"), Add_definite_assignment_assertions_to_all_uninitialized_properties: b(95028, 3, "Add_definite_assignment_assertions_to_all_uninitialized_properties_95028", "Add definite assignment assertions to all uninitialized properties"), Add_undefined_type_to_all_uninitialized_properties: b(95029, 3, "Add_undefined_type_to_all_uninitialized_properties_95029", "Add undefined type to all uninitialized properties"), Change_all_jsdoc_style_types_to_TypeScript: b(95030, 3, "Change_all_jsdoc_style_types_to_TypeScript_95030", "Change all jsdoc-style types to TypeScript"), Change_all_jsdoc_style_types_to_TypeScript_and_add_undefined_to_nullable_types: b(95031, 3, "Change_all_jsdoc_style_types_to_TypeScript_and_add_undefined_to_nullable_types_95031", "Change all jsdoc-style types to TypeScript (and add '| undefined' to nullable types)"), Implement_all_unimplemented_interfaces: b(95032, 3, "Implement_all_unimplemented_interfaces_95032", "Implement all unimplemented interfaces"), Install_all_missing_types_packages: b(95033, 3, "Install_all_missing_types_packages_95033", "Install all missing types packages"), Rewrite_all_as_indexed_access_types: b(95034, 3, "Rewrite_all_as_indexed_access_types_95034", "Rewrite all as indexed access types"), Convert_all_to_default_imports: b(95035, 3, "Convert_all_to_default_imports_95035", "Convert all to default imports"), Make_all_super_calls_the_first_statement_in_their_constructor: b(95036, 3, "Make_all_super_calls_the_first_statement_in_their_constructor_95036", "Make all 'super()' calls the first statement in their constructor"), Add_qualifier_to_all_unresolved_variables_matching_a_member_name: b(95037, 3, "Add_qualifier_to_all_unresolved_variables_matching_a_member_name_95037", "Add qualifier to all unresolved variables matching a member name"), Change_all_extended_interfaces_to_implements: b(95038, 3, "Change_all_extended_interfaces_to_implements_95038", "Change all extended interfaces to 'implements'"), Add_all_missing_super_calls: b(95039, 3, "Add_all_missing_super_calls_95039", "Add all missing super calls"), Implement_all_inherited_abstract_classes: b(95040, 3, "Implement_all_inherited_abstract_classes_95040", "Implement all inherited abstract classes"), Add_all_missing_async_modifiers: b(95041, 3, "Add_all_missing_async_modifiers_95041", "Add all missing 'async' modifiers"), Add_ts_ignore_to_all_error_messages: b(95042, 3, "Add_ts_ignore_to_all_error_messages_95042", "Add '@ts-ignore' to all error messages"), Annotate_everything_with_types_from_JSDoc: b(95043, 3, "Annotate_everything_with_types_from_JSDoc_95043", "Annotate everything with types from JSDoc"), Add_to_all_uncalled_decorators: b(95044, 3, "Add_to_all_uncalled_decorators_95044", "Add '()' to all uncalled decorators"), Convert_all_constructor_functions_to_classes: b(95045, 3, "Convert_all_constructor_functions_to_classes_95045", "Convert all constructor functions to classes"), Generate_get_and_set_accessors: b(95046, 3, "Generate_get_and_set_accessors_95046", "Generate 'get' and 'set' accessors"), Convert_require_to_import: b(95047, 3, "Convert_require_to_import_95047", "Convert 'require' to 'import'"), Convert_all_require_to_import: b(95048, 3, "Convert_all_require_to_import_95048", "Convert all 'require' to 'import'"), Move_to_a_new_file: b(95049, 3, "Move_to_a_new_file_95049", "Move to a new file"), Remove_unreachable_code: b(95050, 3, "Remove_unreachable_code_95050", "Remove unreachable code"), Remove_all_unreachable_code: b(95051, 3, "Remove_all_unreachable_code_95051", "Remove all unreachable code"), Add_missing_typeof: b(95052, 3, "Add_missing_typeof_95052", "Add missing 'typeof'"), Remove_unused_label: b(95053, 3, "Remove_unused_label_95053", "Remove unused label"), Remove_all_unused_labels: b(95054, 3, "Remove_all_unused_labels_95054", "Remove all unused labels"), Convert_0_to_mapped_object_type: b(95055, 3, "Convert_0_to_mapped_object_type_95055", "Convert '{0}' to mapped object type"), Convert_namespace_import_to_named_imports: b(95056, 3, "Convert_namespace_import_to_named_imports_95056", "Convert namespace import to named imports"), Convert_named_imports_to_namespace_import: b(95057, 3, "Convert_named_imports_to_namespace_import_95057", "Convert named imports to namespace import"), Add_or_remove_braces_in_an_arrow_function: b(95058, 3, "Add_or_remove_braces_in_an_arrow_function_95058", "Add or remove braces in an arrow function"), Add_braces_to_arrow_function: b(95059, 3, "Add_braces_to_arrow_function_95059", "Add braces to arrow function"), Remove_braces_from_arrow_function: b(95060, 3, "Remove_braces_from_arrow_function_95060", "Remove braces from arrow function"), Convert_default_export_to_named_export: b(95061, 3, "Convert_default_export_to_named_export_95061", "Convert default export to named export"), Convert_named_export_to_default_export: b(95062, 3, "Convert_named_export_to_default_export_95062", "Convert named export to default export"), Add_missing_enum_member_0: b(95063, 3, "Add_missing_enum_member_0_95063", "Add missing enum member '{0}'"), Add_all_missing_imports: b(95064, 3, "Add_all_missing_imports_95064", "Add all missing imports"), Convert_to_async_function: b(95065, 3, "Convert_to_async_function_95065", "Convert to async function"), Convert_all_to_async_functions: b(95066, 3, "Convert_all_to_async_functions_95066", "Convert all to async functions"), Add_missing_call_parentheses: b(95067, 3, "Add_missing_call_parentheses_95067", "Add missing call parentheses"), Add_all_missing_call_parentheses: b(95068, 3, "Add_all_missing_call_parentheses_95068", "Add all missing call parentheses"), Add_unknown_conversion_for_non_overlapping_types: b(95069, 3, "Add_unknown_conversion_for_non_overlapping_types_95069", "Add 'unknown' conversion for non-overlapping types"), Add_unknown_to_all_conversions_of_non_overlapping_types: b(95070, 3, "Add_unknown_to_all_conversions_of_non_overlapping_types_95070", "Add 'unknown' to all conversions of non-overlapping types"), Add_missing_new_operator_to_call: b(95071, 3, "Add_missing_new_operator_to_call_95071", "Add missing 'new' operator to call"), Add_missing_new_operator_to_all_calls: b(95072, 3, "Add_missing_new_operator_to_all_calls_95072", "Add missing 'new' operator to all calls"), Add_names_to_all_parameters_without_names: b(95073, 3, "Add_names_to_all_parameters_without_names_95073", "Add names to all parameters without names"), Enable_the_experimentalDecorators_option_in_your_configuration_file: b(95074, 3, "Enable_the_experimentalDecorators_option_in_your_configuration_file_95074", "Enable the 'experimentalDecorators' option in your configuration file"), Convert_parameters_to_destructured_object: b(95075, 3, "Convert_parameters_to_destructured_object_95075", "Convert parameters to destructured object"), Extract_type: b(95077, 3, "Extract_type_95077", "Extract type"), Extract_to_type_alias: b(95078, 3, "Extract_to_type_alias_95078", "Extract to type alias"), Extract_to_typedef: b(95079, 3, "Extract_to_typedef_95079", "Extract to typedef"), Infer_this_type_of_0_from_usage: b(95080, 3, "Infer_this_type_of_0_from_usage_95080", "Infer 'this' type of '{0}' from usage"), Add_const_to_unresolved_variable: b(95081, 3, "Add_const_to_unresolved_variable_95081", "Add 'const' to unresolved variable"), Add_const_to_all_unresolved_variables: b(95082, 3, "Add_const_to_all_unresolved_variables_95082", "Add 'const' to all unresolved variables"), Add_await: b(95083, 3, "Add_await_95083", "Add 'await'"), Add_await_to_initializer_for_0: b(95084, 3, "Add_await_to_initializer_for_0_95084", "Add 'await' to initializer for '{0}'"), Fix_all_expressions_possibly_missing_await: b(95085, 3, "Fix_all_expressions_possibly_missing_await_95085", "Fix all expressions possibly missing 'await'"), Remove_unnecessary_await: b(95086, 3, "Remove_unnecessary_await_95086", "Remove unnecessary 'await'"), Remove_all_unnecessary_uses_of_await: b(95087, 3, "Remove_all_unnecessary_uses_of_await_95087", "Remove all unnecessary uses of 'await'"), Enable_the_jsx_flag_in_your_configuration_file: b(95088, 3, "Enable_the_jsx_flag_in_your_configuration_file_95088", "Enable the '--jsx' flag in your configuration file"), Add_await_to_initializers: b(95089, 3, "Add_await_to_initializers_95089", "Add 'await' to initializers"), Extract_to_interface: b(95090, 3, "Extract_to_interface_95090", "Extract to interface"), Convert_to_a_bigint_numeric_literal: b(95091, 3, "Convert_to_a_bigint_numeric_literal_95091", "Convert to a bigint numeric literal"), Convert_all_to_bigint_numeric_literals: b(95092, 3, "Convert_all_to_bigint_numeric_literals_95092", "Convert all to bigint numeric literals"), Convert_const_to_let: b(95093, 3, "Convert_const_to_let_95093", "Convert 'const' to 'let'"), Prefix_with_declare: b(95094, 3, "Prefix_with_declare_95094", "Prefix with 'declare'"), Prefix_all_incorrect_property_declarations_with_declare: b(95095, 3, "Prefix_all_incorrect_property_declarations_with_declare_95095", "Prefix all incorrect property declarations with 'declare'"), Convert_to_template_string: b(95096, 3, "Convert_to_template_string_95096", "Convert to template string"), Add_export_to_make_this_file_into_a_module: b(95097, 3, "Add_export_to_make_this_file_into_a_module_95097", "Add 'export {}' to make this file into a module"), Set_the_target_option_in_your_configuration_file_to_0: b(95098, 3, "Set_the_target_option_in_your_configuration_file_to_0_95098", "Set the 'target' option in your configuration file to '{0}'"), Set_the_module_option_in_your_configuration_file_to_0: b(95099, 3, "Set_the_module_option_in_your_configuration_file_to_0_95099", "Set the 'module' option in your configuration file to '{0}'"), Convert_invalid_character_to_its_html_entity_code: b(95100, 3, "Convert_invalid_character_to_its_html_entity_code_95100", "Convert invalid character to its html entity code"), Convert_all_invalid_characters_to_HTML_entity_code: b(95101, 3, "Convert_all_invalid_characters_to_HTML_entity_code_95101", "Convert all invalid characters to HTML entity code"), Convert_all_const_to_let: b(95102, 3, "Convert_all_const_to_let_95102", "Convert all 'const' to 'let'"), Convert_function_expression_0_to_arrow_function: b(95105, 3, "Convert_function_expression_0_to_arrow_function_95105", "Convert function expression '{0}' to arrow function"), Convert_function_declaration_0_to_arrow_function: b(95106, 3, "Convert_function_declaration_0_to_arrow_function_95106", "Convert function declaration '{0}' to arrow function"), Fix_all_implicit_this_errors: b(95107, 3, "Fix_all_implicit_this_errors_95107", "Fix all implicit-'this' errors"), Wrap_invalid_character_in_an_expression_container: b(95108, 3, "Wrap_invalid_character_in_an_expression_container_95108", "Wrap invalid character in an expression container"), Wrap_all_invalid_characters_in_an_expression_container: b(95109, 3, "Wrap_all_invalid_characters_in_an_expression_container_95109", "Wrap all invalid characters in an expression container"), Visit_https_Colon_Slash_Slashaka_ms_Slashtsconfig_to_read_more_about_this_file: b(95110, 3, "Visit_https_Colon_Slash_Slashaka_ms_Slashtsconfig_to_read_more_about_this_file_95110", "Visit https://aka.ms/tsconfig to read more about this file"), Add_a_return_statement: b(95111, 3, "Add_a_return_statement_95111", "Add a return statement"), Remove_braces_from_arrow_function_body: b(95112, 3, "Remove_braces_from_arrow_function_body_95112", "Remove braces from arrow function body"), Wrap_the_following_body_with_parentheses_which_should_be_an_object_literal: b(95113, 3, "Wrap_the_following_body_with_parentheses_which_should_be_an_object_literal_95113", "Wrap the following body with parentheses which should be an object literal"), Add_all_missing_return_statement: b(95114, 3, "Add_all_missing_return_statement_95114", "Add all missing return statement"), Remove_braces_from_all_arrow_function_bodies_with_relevant_issues: b(95115, 3, "Remove_braces_from_all_arrow_function_bodies_with_relevant_issues_95115", "Remove braces from all arrow function bodies with relevant issues"), Wrap_all_object_literal_with_parentheses: b(95116, 3, "Wrap_all_object_literal_with_parentheses_95116", "Wrap all object literal with parentheses"), Move_labeled_tuple_element_modifiers_to_labels: b(95117, 3, "Move_labeled_tuple_element_modifiers_to_labels_95117", "Move labeled tuple element modifiers to labels"), Convert_overload_list_to_single_signature: b(95118, 3, "Convert_overload_list_to_single_signature_95118", "Convert overload list to single signature"), Generate_get_and_set_accessors_for_all_overriding_properties: b(95119, 3, "Generate_get_and_set_accessors_for_all_overriding_properties_95119", "Generate 'get' and 'set' accessors for all overriding properties"), Wrap_in_JSX_fragment: b(95120, 3, "Wrap_in_JSX_fragment_95120", "Wrap in JSX fragment"), Wrap_all_unparented_JSX_in_JSX_fragment: b(95121, 3, "Wrap_all_unparented_JSX_in_JSX_fragment_95121", "Wrap all unparented JSX in JSX fragment"), Convert_arrow_function_or_function_expression: b(95122, 3, "Convert_arrow_function_or_function_expression_95122", "Convert arrow function or function expression"), Convert_to_anonymous_function: b(95123, 3, "Convert_to_anonymous_function_95123", "Convert to anonymous function"), Convert_to_named_function: b(95124, 3, "Convert_to_named_function_95124", "Convert to named function"), Convert_to_arrow_function: b(95125, 3, "Convert_to_arrow_function_95125", "Convert to arrow function"), Remove_parentheses: b(95126, 3, "Remove_parentheses_95126", "Remove parentheses"), Could_not_find_a_containing_arrow_function: b(95127, 3, "Could_not_find_a_containing_arrow_function_95127", "Could not find a containing arrow function"), Containing_function_is_not_an_arrow_function: b(95128, 3, "Containing_function_is_not_an_arrow_function_95128", "Containing function is not an arrow function"), Could_not_find_export_statement: b(95129, 3, "Could_not_find_export_statement_95129", "Could not find export statement"), This_file_already_has_a_default_export: b(95130, 3, "This_file_already_has_a_default_export_95130", "This file already has a default export"), Could_not_find_import_clause: b(95131, 3, "Could_not_find_import_clause_95131", "Could not find import clause"), Could_not_find_namespace_import_or_named_imports: b(95132, 3, "Could_not_find_namespace_import_or_named_imports_95132", "Could not find namespace import or named imports"), Selection_is_not_a_valid_type_node: b(95133, 3, "Selection_is_not_a_valid_type_node_95133", "Selection is not a valid type node"), No_type_could_be_extracted_from_this_type_node: b(95134, 3, "No_type_could_be_extracted_from_this_type_node_95134", "No type could be extracted from this type node"), Could_not_find_property_for_which_to_generate_accessor: b(95135, 3, "Could_not_find_property_for_which_to_generate_accessor_95135", "Could not find property for which to generate accessor"), Name_is_not_valid: b(95136, 3, "Name_is_not_valid_95136", "Name is not valid"), Can_only_convert_property_with_modifier: b(95137, 3, "Can_only_convert_property_with_modifier_95137", "Can only convert property with modifier"), Switch_each_misused_0_to_1: b(95138, 3, "Switch_each_misused_0_to_1_95138", "Switch each misused '{0}' to '{1}'"), Convert_to_optional_chain_expression: b(95139, 3, "Convert_to_optional_chain_expression_95139", "Convert to optional chain expression"), Could_not_find_convertible_access_expression: b(95140, 3, "Could_not_find_convertible_access_expression_95140", "Could not find convertible access expression"), Could_not_find_matching_access_expressions: b(95141, 3, "Could_not_find_matching_access_expressions_95141", "Could not find matching access expressions"), Can_only_convert_logical_AND_access_chains: b(95142, 3, "Can_only_convert_logical_AND_access_chains_95142", "Can only convert logical AND access chains"), Add_void_to_Promise_resolved_without_a_value: b(95143, 3, "Add_void_to_Promise_resolved_without_a_value_95143", "Add 'void' to Promise resolved without a value"), Add_void_to_all_Promises_resolved_without_a_value: b(95144, 3, "Add_void_to_all_Promises_resolved_without_a_value_95144", "Add 'void' to all Promises resolved without a value"), Use_element_access_for_0: b(95145, 3, "Use_element_access_for_0_95145", "Use element access for '{0}'"), Use_element_access_for_all_undeclared_properties: b(95146, 3, "Use_element_access_for_all_undeclared_properties_95146", "Use element access for all undeclared properties."), Delete_all_unused_imports: b(95147, 3, "Delete_all_unused_imports_95147", "Delete all unused imports"), Infer_function_return_type: b(95148, 3, "Infer_function_return_type_95148", "Infer function return type"), Return_type_must_be_inferred_from_a_function: b(95149, 3, "Return_type_must_be_inferred_from_a_function_95149", "Return type must be inferred from a function"), Could_not_determine_function_return_type: b(95150, 3, "Could_not_determine_function_return_type_95150", "Could not determine function return type"), Could_not_convert_to_arrow_function: b(95151, 3, "Could_not_convert_to_arrow_function_95151", "Could not convert to arrow function"), Could_not_convert_to_named_function: b(95152, 3, "Could_not_convert_to_named_function_95152", "Could not convert to named function"), Could_not_convert_to_anonymous_function: b(95153, 3, "Could_not_convert_to_anonymous_function_95153", "Could not convert to anonymous function"), Can_only_convert_string_concatenation: b(95154, 3, "Can_only_convert_string_concatenation_95154", "Can only convert string concatenation"), Selection_is_not_a_valid_statement_or_statements: b(95155, 3, "Selection_is_not_a_valid_statement_or_statements_95155", "Selection is not a valid statement or statements"), Add_missing_function_declaration_0: b(95156, 3, "Add_missing_function_declaration_0_95156", "Add missing function declaration '{0}'"), Add_all_missing_function_declarations: b(95157, 3, "Add_all_missing_function_declarations_95157", "Add all missing function declarations"), Method_not_implemented: b(95158, 3, "Method_not_implemented_95158", "Method not implemented."), Function_not_implemented: b(95159, 3, "Function_not_implemented_95159", "Function not implemented."), Add_override_modifier: b(95160, 3, "Add_override_modifier_95160", "Add 'override' modifier"), Remove_override_modifier: b(95161, 3, "Remove_override_modifier_95161", "Remove 'override' modifier"), Add_all_missing_override_modifiers: b(95162, 3, "Add_all_missing_override_modifiers_95162", "Add all missing 'override' modifiers"), Remove_all_unnecessary_override_modifiers: b(95163, 3, "Remove_all_unnecessary_override_modifiers_95163", "Remove all unnecessary 'override' modifiers"), Can_only_convert_named_export: b(95164, 3, "Can_only_convert_named_export_95164", "Can only convert named export"), Add_missing_properties: b(95165, 3, "Add_missing_properties_95165", "Add missing properties"), Add_all_missing_properties: b(95166, 3, "Add_all_missing_properties_95166", "Add all missing properties"), Add_missing_attributes: b(95167, 3, "Add_missing_attributes_95167", "Add missing attributes"), Add_all_missing_attributes: b(95168, 3, "Add_all_missing_attributes_95168", "Add all missing attributes"), Add_undefined_to_optional_property_type: b(95169, 3, "Add_undefined_to_optional_property_type_95169", "Add 'undefined' to optional property type"), Convert_named_imports_to_default_import: b(95170, 3, "Convert_named_imports_to_default_import_95170", "Convert named imports to default import"), Delete_unused_param_tag_0: b(95171, 3, "Delete_unused_param_tag_0_95171", "Delete unused '@param' tag '{0}'"), Delete_all_unused_param_tags: b(95172, 3, "Delete_all_unused_param_tags_95172", "Delete all unused '@param' tags"), Rename_param_tag_name_0_to_1: b(95173, 3, "Rename_param_tag_name_0_to_1_95173", "Rename '@param' tag name '{0}' to '{1}'"), Use_0: b(95174, 3, "Use_0_95174", "Use `{0}`."), Use_Number_isNaN_in_all_conditions: b(95175, 3, "Use_Number_isNaN_in_all_conditions_95175", "Use `Number.isNaN` in all conditions."), No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer: b(18004, 1, "No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer_18004", "No value exists in scope for the shorthand property '{0}'. Either declare one or provide an initializer."), Classes_may_not_have_a_field_named_constructor: b(18006, 1, "Classes_may_not_have_a_field_named_constructor_18006", "Classes may not have a field named 'constructor'."), JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array: b(18007, 1, "JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array_18007", "JSX expressions may not use the comma operator. Did you mean to write an array?"), Private_identifiers_cannot_be_used_as_parameters: b(18009, 1, "Private_identifiers_cannot_be_used_as_parameters_18009", "Private identifiers cannot be used as parameters."), An_accessibility_modifier_cannot_be_used_with_a_private_identifier: b(18010, 1, "An_accessibility_modifier_cannot_be_used_with_a_private_identifier_18010", "An accessibility modifier cannot be used with a private identifier."), The_operand_of_a_delete_operator_cannot_be_a_private_identifier: b(18011, 1, "The_operand_of_a_delete_operator_cannot_be_a_private_identifier_18011", "The operand of a 'delete' operator cannot be a private identifier."), constructor_is_a_reserved_word: b(18012, 1, "constructor_is_a_reserved_word_18012", "'#constructor' is a reserved word."), Property_0_is_not_accessible_outside_class_1_because_it_has_a_private_identifier: b(18013, 1, "Property_0_is_not_accessible_outside_class_1_because_it_has_a_private_identifier_18013", "Property '{0}' is not accessible outside class '{1}' because it has a private identifier."), The_property_0_cannot_be_accessed_on_type_1_within_this_class_because_it_is_shadowed_by_another_private_identifier_with_the_same_spelling: b(18014, 1, "The_property_0_cannot_be_accessed_on_type_1_within_this_class_because_it_is_shadowed_by_another_priv_18014", "The property '{0}' cannot be accessed on type '{1}' within this class because it is shadowed by another private identifier with the same spelling."), Property_0_in_type_1_refers_to_a_different_member_that_cannot_be_accessed_from_within_type_2: b(18015, 1, "Property_0_in_type_1_refers_to_a_different_member_that_cannot_be_accessed_from_within_type_2_18015", "Property '{0}' in type '{1}' refers to a different member that cannot be accessed from within type '{2}'."), Private_identifiers_are_not_allowed_outside_class_bodies: b(18016, 1, "Private_identifiers_are_not_allowed_outside_class_bodies_18016", "Private identifiers are not allowed outside class bodies."), The_shadowing_declaration_of_0_is_defined_here: b(18017, 1, "The_shadowing_declaration_of_0_is_defined_here_18017", "The shadowing declaration of '{0}' is defined here"), The_declaration_of_0_that_you_probably_intended_to_use_is_defined_here: b(18018, 1, "The_declaration_of_0_that_you_probably_intended_to_use_is_defined_here_18018", "The declaration of '{0}' that you probably intended to use is defined here"), _0_modifier_cannot_be_used_with_a_private_identifier: b(18019, 1, "_0_modifier_cannot_be_used_with_a_private_identifier_18019", "'{0}' modifier cannot be used with a private identifier."), An_enum_member_cannot_be_named_with_a_private_identifier: b(18024, 1, "An_enum_member_cannot_be_named_with_a_private_identifier_18024", "An enum member cannot be named with a private identifier."), can_only_be_used_at_the_start_of_a_file: b(18026, 1, "can_only_be_used_at_the_start_of_a_file_18026", "'#!' can only be used at the start of a file."), Compiler_reserves_name_0_when_emitting_private_identifier_downlevel: b(18027, 1, "Compiler_reserves_name_0_when_emitting_private_identifier_downlevel_18027", "Compiler reserves name '{0}' when emitting private identifier downlevel."), Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher: b(18028, 1, "Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher_18028", "Private identifiers are only available when targeting ECMAScript 2015 and higher."), Private_identifiers_are_not_allowed_in_variable_declarations: b(18029, 1, "Private_identifiers_are_not_allowed_in_variable_declarations_18029", "Private identifiers are not allowed in variable declarations."), An_optional_chain_cannot_contain_private_identifiers: b(18030, 1, "An_optional_chain_cannot_contain_private_identifiers_18030", "An optional chain cannot contain private identifiers."), The_intersection_0_was_reduced_to_never_because_property_1_has_conflicting_types_in_some_constituents: b(18031, 1, "The_intersection_0_was_reduced_to_never_because_property_1_has_conflicting_types_in_some_constituent_18031", "The intersection '{0}' was reduced to 'never' because property '{1}' has conflicting types in some constituents."), The_intersection_0_was_reduced_to_never_because_property_1_exists_in_multiple_constituents_and_is_private_in_some: b(18032, 1, "The_intersection_0_was_reduced_to_never_because_property_1_exists_in_multiple_constituents_and_is_pr_18032", "The intersection '{0}' was reduced to 'never' because property '{1}' exists in multiple constituents and is private in some."), Type_0_is_not_assignable_to_type_1_as_required_for_computed_enum_member_values: b(18033, 1, "Type_0_is_not_assignable_to_type_1_as_required_for_computed_enum_member_values_18033", "Type '{0}' is not assignable to type '{1}' as required for computed enum member values."), Specify_the_JSX_fragment_factory_function_to_use_when_targeting_react_JSX_emit_with_jsxFactory_compiler_option_is_specified_e_g_Fragment: b(18034, 3, "Specify_the_JSX_fragment_factory_function_to_use_when_targeting_react_JSX_emit_with_jsxFactory_compi_18034", "Specify the JSX fragment factory function to use when targeting 'react' JSX emit with 'jsxFactory' compiler option is specified, e.g. 'Fragment'."), Invalid_value_for_jsxFragmentFactory_0_is_not_a_valid_identifier_or_qualified_name: b(18035, 1, "Invalid_value_for_jsxFragmentFactory_0_is_not_a_valid_identifier_or_qualified_name_18035", "Invalid value for 'jsxFragmentFactory'. '{0}' is not a valid identifier or qualified-name."), Class_decorators_can_t_be_used_with_static_private_identifier_Consider_removing_the_experimental_decorator: b(18036, 1, "Class_decorators_can_t_be_used_with_static_private_identifier_Consider_removing_the_experimental_dec_18036", "Class decorators can't be used with static private identifier. Consider removing the experimental decorator."), Await_expression_cannot_be_used_inside_a_class_static_block: b(18037, 1, "Await_expression_cannot_be_used_inside_a_class_static_block_18037", "Await expression cannot be used inside a class static block."), For_await_loops_cannot_be_used_inside_a_class_static_block: b(18038, 1, "For_await_loops_cannot_be_used_inside_a_class_static_block_18038", "'For await' loops cannot be used inside a class static block."), Invalid_use_of_0_It_cannot_be_used_inside_a_class_static_block: b(18039, 1, "Invalid_use_of_0_It_cannot_be_used_inside_a_class_static_block_18039", "Invalid use of '{0}'. It cannot be used inside a class static block."), A_return_statement_cannot_be_used_inside_a_class_static_block: b(18041, 1, "A_return_statement_cannot_be_used_inside_a_class_static_block_18041", "A 'return' statement cannot be used inside a class static block."), _0_is_a_type_and_cannot_be_imported_in_JavaScript_files_Use_1_in_a_JSDoc_type_annotation: b(18042, 1, "_0_is_a_type_and_cannot_be_imported_in_JavaScript_files_Use_1_in_a_JSDoc_type_annotation_18042", "'{0}' is a type and cannot be imported in JavaScript files. Use '{1}' in a JSDoc type annotation."), Types_cannot_appear_in_export_declarations_in_JavaScript_files: b(18043, 1, "Types_cannot_appear_in_export_declarations_in_JavaScript_files_18043", "Types cannot appear in export declarations in JavaScript files."), _0_is_automatically_exported_here: b(18044, 3, "_0_is_automatically_exported_here_18044", "'{0}' is automatically exported here."), Properties_with_the_accessor_modifier_are_only_available_when_targeting_ECMAScript_2015_and_higher: b(18045, 1, "Properties_with_the_accessor_modifier_are_only_available_when_targeting_ECMAScript_2015_and_higher_18045", "Properties with the 'accessor' modifier are only available when targeting ECMAScript 2015 and higher."), _0_is_of_type_unknown: b(18046, 1, "_0_is_of_type_unknown_18046", "'{0}' is of type 'unknown'."), _0_is_possibly_null: b(18047, 1, "_0_is_possibly_null_18047", "'{0}' is possibly 'null'."), _0_is_possibly_undefined: b(18048, 1, "_0_is_possibly_undefined_18048", "'{0}' is possibly 'undefined'."), _0_is_possibly_null_or_undefined: b(18049, 1, "_0_is_possibly_null_or_undefined_18049", "'{0}' is possibly 'null' or 'undefined'."), The_value_0_cannot_be_used_here: b(18050, 1, "The_value_0_cannot_be_used_here_18050", "The value '{0}' cannot be used here."), Compiler_option_0_cannot_be_given_an_empty_string: b(18051, 1, "Compiler_option_0_cannot_be_given_an_empty_string_18051", "Compiler option '{0}' cannot be given an empty string.") } } }); function Su(e) { return e >= 79 } function moe(e) { return e === 31 || Su(e) } function iI(e, t) { if (e < t[0]) return !1; let r = 0, i = t.length, o; for (; r + 1 < i;) { if (o = r + (i - r) / 2, o -= o % 2, t[o] <= e && e <= t[o + 1]) return !0; e < t[o] ? i = o : r = o + 2 } return !1 } function W8(e, t) { return t >= 2 ? iI(e, Aoe) : t === 1 ? iI(e, Soe) : iI(e, Eoe) } function wDe(e, t) { return t >= 2 ? iI(e, Coe) : t === 1 ? iI(e, xoe) : iI(e, Toe) } function RDe(e) { let t = []; return e.forEach((r, i) => { t[r] = i }), t } function Xa(e) { return koe[e] } function lT(e) { return vj.get(e) } function hw(e) { let t = [], r = 0, i = 0; for (; r < e.length;) { let o = e.charCodeAt(r); switch (r++, o) { case 13: e.charCodeAt(r) === 10 && r++; case 10: t.push(i), i = r; break; default: o > 127 && Wl(o) && (t.push(i), i = r); break } } return t.push(i), t } function gw(e, t, r, i) { return e.getPositionOfLineAndCharacter ? e.getPositionOfLineAndCharacter(t, r, i) : mj(Sh(e), t, r, e.text, i) } function mj(e, t, r, i, o) { (t < 0 || t >= e.length) && (o ? t = t < 0 ? 0 : t >= e.length ? e.length - 1 : t : L.fail(`Bad line number. Line: ${t}, lineStarts.length: ${e.length} , line map is correct? ${i !== void 0 ? GD(e, hw(i)) : "unknown"}`)); let s = e[t] + r; return o ? s > e[t + 1] ? e[t + 1] : typeof i == "string" && s > i.length ? i.length : s : (t < e.length - 1 ? L.assert(s < e[t + 1]) : i !== void 0 && L.assert(s <= i.length), s) } function Sh(e) { return e.lineMap || (e.lineMap = hw(e.text)) } function yw(e, t) { let r = aI(e, t); return { line: r, character: t - e[r] } } function aI(e, t, r) { let i = Py(e, t, Ks, Es, r); return i < 0 && (i = ~i - 1, L.assert(i !== -1, "position cannot precede the beginning of the file")), i } function oI(e, t, r) { if (t === r) return 0; let i = Sh(e), o = Math.min(t, r), s = o === r, l = s ? t : r, f = aI(i, o), d = aI(i, l, f); return s ? f - d : d - f } function Gs(e, t) { return yw(Sh(e), t) } function xh(e) { return Yp(e) || Wl(e) } function Yp(e) { return e === 32 || e === 9 || e === 11 || e === 12 || e === 160 || e === 133 || e === 5760 || e >= 8192 && e <= 8203 || e === 8239 || e === 8287 || e === 12288 || e === 65279 } function Wl(e) { return e === 10 || e === 13 || e === 8232 || e === 8233 } function sI(e) { return e >= 48 && e <= 57 } function z8(e) { return sI(e) || e >= 65 && e <= 70 || e >= 97 && e <= 102 } function ODe(e) { return e <= 1114111 } function hj(e) { return e >= 48 && e <= 55 } function hoe(e, t) { let r = e.charCodeAt(t); switch (r) { case 13: case 10: case 9: case 11: case 12: case 32: case 47: case 60: case 124: case 61: case 62: return !0; case 35: return t === 0; default: return r > 127 } } function xo(e, t, r, i, o) { if (vp(t)) return t; let s = !1; for (; ;) { let l = e.charCodeAt(t); switch (l) { case 13: e.charCodeAt(t + 1) === 10 && t++; case 10: if (t++, r) return t; s = !!o; continue; case 9: case 11: case 12: case 32: t++; continue; case 47: if (i) break; if (e.charCodeAt(t + 1) === 47) { for (t += 2; t < e.length && !Wl(e.charCodeAt(t));)t++; s = !1; continue } if (e.charCodeAt(t + 1) === 42) { for (t += 2; t < e.length;) { if (e.charCodeAt(t) === 42 && e.charCodeAt(t + 1) === 47) { t += 2; break } t++ } s = !1; continue } break; case 60: case 124: case 61: case 62: if (yA(e, t)) { t = cI(e, t), s = !1; continue } break; case 35: if (t === 0 && gj(e, t)) { t = yj(e, t), s = !1; continue } break; case 42: if (s) { t++, s = !1; continue } break; default: if (l > 127 && xh(l)) { t++; continue } break }return t } } function yA(e, t) { if (L.assert(t >= 0), t === 0 || Wl(e.charCodeAt(t - 1))) { let r = e.charCodeAt(t); if (t + Tw < e.length) { for (let i = 0; i < Tw; i++)if (e.charCodeAt(t + i) !== r) return !1; return r === 61 || e.charCodeAt(t + Tw) === 32 } } return !1 } function cI(e, t, r) { r && r(_.Merge_conflict_marker_encountered, t, Tw); let i = e.charCodeAt(t), o = e.length; if (i === 60 || i === 62) for (; t < o && !Wl(e.charCodeAt(t));)t++; else for (L.assert(i === 124 || i === 61); t < o;) { let s = e.charCodeAt(t); if ((s === 61 || s === 62) && s !== i && yA(e, t)) break; t++ } return t } function gj(e, t) { return L.assert(t === 0), q8.test(e) } function yj(e, t) { let r = q8.exec(e)[0]; return t = t + r.length, t } function J8(e, t, r, i, o, s, l) { let f, d, g, m, v = !1, S = i, x = l; if (r === 0) { S = !0; let A = K8(t); A && (r = A.length) } e: for (; r >= 0 && r < t.length;) { let A = t.charCodeAt(r); switch (A) { case 13: t.charCodeAt(r + 1) === 10 && r++; case 10: if (r++, i) break e; S = !0, v && (m = !0); continue; case 9: case 11: case 12: case 32: r++; continue; case 47: let w = t.charCodeAt(r + 1), C = !1; if (w === 47 || w === 42) { let P = w === 47 ? 2 : 3, F = r; if (r += 2, w === 47) for (; r < t.length;) { if (Wl(t.charCodeAt(r))) { C = !0; break } r++ } else for (; r < t.length;) { if (t.charCodeAt(r) === 42 && t.charCodeAt(r + 1) === 47) { r += 2; break } r++ } if (S) { if (v && (x = o(f, d, g, m, s, x), !e && x)) return x; f = F, d = r, g = P, m = C, v = !0 } continue } break e; default: if (A > 127 && xh(A)) { v && Wl(A) && (m = !0), r++; continue } break e } } return v && (x = o(f, d, g, m, s, x)), x } function vw(e, t, r, i) { return J8(!1, e, t, !1, r, i) } function bw(e, t, r, i) { return J8(!1, e, t, !0, r, i) } function goe(e, t, r, i, o) { return J8(!0, e, t, !1, r, i, o) } function yoe(e, t, r, i, o) { return J8(!0, e, t, !0, r, i, o) } function voe(e, t, r, i, o, s = []) { return s.push({ kind: r, pos: e, end: t, hasTrailingNewLine: i }), s } function Nm(e, t) { return goe(e, t, voe, void 0, void 0) } function eb(e, t) { return yoe(e, t, voe, void 0, void 0) } function K8(e) { let t = q8.exec(e); if (t) return t[0] } function Pm(e, t) { return e >= 65 && e <= 90 || e >= 97 && e <= 122 || e === 36 || e === 95 || e > 127 && W8(e, t) } function tb(e, t, r) { return e >= 65 && e <= 90 || e >= 97 && e <= 122 || e >= 48 && e <= 57 || e === 36 || e === 95 || (r === 1 ? e === 45 || e === 58 : !1) || e > 127 && wDe(e, t) } function i_(e, t, r) { let i = Dg(e, 0); if (!Pm(i, t)) return !1; for (let o = By(i); o < e.length; o += By(i))if (!tb(i = Dg(e, o), t, r)) return !1; return !0 } function kg(e, t, r = 0, i, o, s, l) {
+                var f = i, d, g, m, v, S, x, A, w, C = 0; Dt(f, s, l); var P = { getStartPos: () => m, getTextPos: () => d, getToken: () => S, getTokenPos: () => v, getTokenText: () => f.substring(v, d), getTokenValue: () => x, hasUnicodeEscape: () => (A & 1024) !== 0, hasExtendedUnicodeEscape: () => (A & 8) !== 0, hasPrecedingLineBreak: () => (A & 1) !== 0, hasPrecedingJSDocComment: () => (A & 2) !== 0, isIdentifier: () => S === 79 || S > 116, isReservedWord: () => S >= 81 && S <= 116, isUnterminated: () => (A & 4) !== 0, getCommentDirectives: () => w, getNumericLiteralFlags: () => A & 1008, getTokenFlags: () => A, reScanGreaterToken: Be, reScanAsteriskEqualsToken: Ne, reScanSlashToken: Le, reScanTemplateToken: ct, reScanTemplateHeadOrNoSubstitutionTemplate: Rt, scanJsxIdentifier: kn, scanJsxAttributeValue: _n, reScanJsxAttributeValue: Gt, reScanJsxToken: We, reScanLessThanToken: qe, reScanHashToken: zt, reScanQuestionToken: Qt, reScanInvalidIdentifier: Ce, scanJsxToken: tn, scanJsDocToken: $n, scan: Pe, getText: pt, clearCommentDirectives: nn, setText: Dt, setScriptTarget: An, setLanguageVariant: Kn, setOnError: pn, setTextPos: hi, setInJSDocType: ri, tryScan: gr, lookAhead: Pi, scanRange: Ni }; return L.isDebugging && Object.defineProperty(P, "__debugShowCurrentPositionInText", { get: () => { let vn = P.getText(); return vn.slice(0, P.getStartPos()) + "\u2551" + vn.slice(P.getStartPos()) } }), P; function F(vn, Ht = d, En) { if (o) { let dr = d; d = Ht, o(vn, En || 0), d = dr } } function B() { let vn = d, Ht = !1, En = !1, dr = ""; for (; ;) { let Cr = f.charCodeAt(d); if (Cr === 95) { A |= 512, Ht ? (Ht = !1, En = !0, dr += f.substring(vn, d)) : F(En ? _.Multiple_consecutive_numeric_separators_are_not_permitted : _.Numeric_separators_are_not_allowed_here, d, 1), d++, vn = d; continue } if (sI(Cr)) { Ht = !0, En = !1, d++; continue } break } return f.charCodeAt(d - 1) === 95 && F(_.Numeric_separators_are_not_allowed_here, d - 1, 1), dr + f.substring(vn, d) } function q() { let vn = d, Ht = B(), En, dr; f.charCodeAt(d) === 46 && (d++, En = B()); let Cr = d; if (f.charCodeAt(d) === 69 || f.charCodeAt(d) === 101) { d++, A |= 16, (f.charCodeAt(d) === 43 || f.charCodeAt(d) === 45) && d++; let at = d, Tt = B(); Tt ? (dr = f.substring(Cr, at) + Tt, Cr = d) : F(_.Digit_expected) } let Se; if (A & 512 ? (Se = Ht, En && (Se += "." + En), dr && (Se += dr)) : Se = f.substring(vn, Cr), En !== void 0 || A & 16) return W(vn, En === void 0 && !!(A & 16)), { type: 8, value: "" + +Se }; { x = Se; let at = ke(); return W(vn), { type: at, value: x } } } function W(vn, Ht) { if (!Pm(Dg(f, d), e)) return; let En = d, { length: dr } = X(); dr === 1 && f[En] === "n" ? F(Ht ? _.A_bigint_literal_cannot_use_exponential_notation : _.A_bigint_literal_must_be_an_integer, vn, En - vn + 1) : (F(_.An_identifier_or_keyword_cannot_immediately_follow_a_numeric_literal, En, dr), d = En) } function Y() { let vn = d; for (; hj(f.charCodeAt(d));)d++; return +f.substring(vn, d) } function R(vn, Ht) { let En = $(vn, !1, Ht); return En ? parseInt(En, 16) : -1 } function ie(vn, Ht) { return $(vn, !0, Ht) } function $(vn, Ht, En) { let dr = [], Cr = !1, Se = !1; for (; dr.length < vn || Ht;) { let at = f.charCodeAt(d); if (En && at === 95) { A |= 512, Cr ? (Cr = !1, Se = !0) : F(Se ? _.Multiple_consecutive_numeric_separators_are_not_permitted : _.Numeric_separators_are_not_allowed_here, d, 1), d++; continue } if (Cr = En, at >= 65 && at <= 70) at += 32; else if (!(at >= 48 && at <= 57 || at >= 97 && at <= 102)) break; dr.push(at), d++, Se = !1 } return dr.length < vn && (dr = []), f.charCodeAt(d - 1) === 95 && F(_.Numeric_separators_are_not_allowed_here, d - 1, 1), String.fromCharCode(...dr) } function fe(vn = !1) { let Ht = f.charCodeAt(d); d++; let En = "", dr = d; for (; ;) { if (d >= g) { En += f.substring(dr, d), A |= 4, F(_.Unterminated_string_literal); break } let Cr = f.charCodeAt(d); if (Cr === Ht) { En += f.substring(dr, d), d++; break } if (Cr === 92 && !vn) { En += f.substring(dr, d), En += U(), dr = d; continue } if (Wl(Cr) && !vn) { En += f.substring(dr, d), A |= 4, F(_.Unterminated_string_literal); break } d++ } return En } function Z(vn) {
+                    let Ht = f.charCodeAt(d) === 96; d++; let En = d, dr = "", Cr; for (; ;) {
+                        if (d >= g) { dr += f.substring(En, d), A |= 4, F(_.Unterminated_template_literal), Cr = Ht ? 14 : 17; break } let Se = f.charCodeAt(d); if (Se === 96) { dr += f.substring(En, d), d++, Cr = Ht ? 14 : 17; break } if (Se === 36 && d + 1 < g && f.charCodeAt(d + 1) === 123) { dr += f.substring(En, d), d += 2, Cr = Ht ? 15 : 16; break } if (Se === 92) { dr += f.substring(En, d), dr += U(vn), En = d; continue } if (Se === 13) {
+                            dr += f.substring(En, d), d++, d < g && f.charCodeAt(d) === 10 && d++, dr += `
+`, En = d; continue
+                        } d++
+                    } return L.assert(Cr !== void 0), x = dr, Cr
+                } function U(vn) {
+                    let Ht = d; if (d++, d >= g) return F(_.Unexpected_end_of_text), ""; let En = f.charCodeAt(d); switch (d++, En) {
+                        case 48: return vn && d < g && sI(f.charCodeAt(d)) ? (d++, A |= 2048, f.substring(Ht, d)) : "\0"; case 98: return "\b"; case 116: return "	"; case 110: return `
+`; case 118: return "\v"; case 102: return "\f"; case 114: return "\r"; case 39: return "'"; case 34: return '"'; case 117: if (vn) { for (let dr = d; dr < d + 4; dr++)if (dr < g && !z8(f.charCodeAt(dr)) && f.charCodeAt(dr) !== 123) return d = dr, A |= 2048, f.substring(Ht, d) } if (d < g && f.charCodeAt(d) === 123) { if (d++, vn && !z8(f.charCodeAt(d))) return A |= 2048, f.substring(Ht, d); if (vn) { let dr = d, Cr = ie(1, !1), Se = Cr ? parseInt(Cr, 16) : -1; if (!ODe(Se) || f.charCodeAt(d) !== 125) return A |= 2048, f.substring(Ht, d); d = dr } return A |= 8, le() } return A |= 1024, re(4); case 120: if (vn) if (z8(f.charCodeAt(d))) { if (!z8(f.charCodeAt(d + 1))) return d++, A |= 2048, f.substring(Ht, d) } else return A |= 2048, f.substring(Ht, d); return re(2); case 13: d < g && f.charCodeAt(d) === 10 && d++; case 10: case 8232: case 8233: return ""; default: return String.fromCharCode(En)
+                    }
+                } function re(vn) { let Ht = R(vn, !1); return Ht >= 0 ? String.fromCharCode(Ht) : (F(_.Hexadecimal_digit_expected), "") } function le() { let vn = ie(1, !1), Ht = vn ? parseInt(vn, 16) : -1, En = !1; return Ht < 0 ? (F(_.Hexadecimal_digit_expected), En = !0) : Ht > 1114111 && (F(_.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive), En = !0), d >= g ? (F(_.Unexpected_end_of_text), En = !0) : f.charCodeAt(d) === 125 ? d++ : (F(_.Unterminated_Unicode_escape_sequence), En = !0), En ? "" : lI(Ht) } function _e() { if (d + 5 < g && f.charCodeAt(d + 1) === 117) { let vn = d; d += 2; let Ht = R(4, !1); return d = vn, Ht } return -1 } function ge() { if (Dg(f, d + 1) === 117 && Dg(f, d + 2) === 123) { let vn = d; d += 3; let Ht = ie(1, !1), En = Ht ? parseInt(Ht, 16) : -1; return d = vn, En } return -1 } function X() { let vn = "", Ht = d; for (; d < g;) { let En = Dg(f, d); if (tb(En, e)) d += By(En); else if (En === 92) { if (En = ge(), En >= 0 && tb(En, e)) { d += 3, A |= 8, vn += le(), Ht = d; continue } if (En = _e(), !(En >= 0 && tb(En, e))) break; A |= 1024, vn += f.substring(Ht, d), vn += lI(En), d += 6, Ht = d } else break } return vn += f.substring(Ht, d), vn } function Ve() { let vn = x.length; if (vn >= 2 && vn <= 12) { let Ht = x.charCodeAt(0); if (Ht >= 97 && Ht <= 122) { let En = boe.get(x); if (En !== void 0) return S = En } } return S = 79 } function we(vn) { let Ht = "", En = !1, dr = !1; for (; ;) { let Cr = f.charCodeAt(d); if (Cr === 95) { A |= 512, En ? (En = !1, dr = !0) : F(dr ? _.Multiple_consecutive_numeric_separators_are_not_permitted : _.Numeric_separators_are_not_allowed_here, d, 1), d++; continue } if (En = !0, !sI(Cr) || Cr - 48 >= vn) break; Ht += f[d], d++, dr = !1 } return f.charCodeAt(d - 1) === 95 && F(_.Numeric_separators_are_not_allowed_here, d - 1, 1), Ht } function ke() { return f.charCodeAt(d) === 110 ? (x += "n", A & 384 && (x = iL(x) + "n"), d++, 9) : (x = "" + (A & 128 ? parseInt(x.slice(2), 2) : A & 256 ? parseInt(x.slice(2), 8) : +x), 8) } function Pe() { m = d, A = 0; let vn = !1; for (; ;) { if (v = d, d >= g) return S = 1; let Ht = Dg(f, d); if (Ht === 35 && d === 0 && gj(f, d)) { if (d = yj(f, d), t) continue; return S = 6 } switch (Ht) { case 10: case 13: if (A |= 1, t) { d++; continue } else return Ht === 13 && d + 1 < g && f.charCodeAt(d + 1) === 10 ? d += 2 : d++, S = 4; case 9: case 11: case 12: case 32: case 160: case 5760: case 8192: case 8193: case 8194: case 8195: case 8196: case 8197: case 8198: case 8199: case 8200: case 8201: case 8202: case 8203: case 8239: case 8287: case 12288: case 65279: if (t) { d++; continue } else { for (; d < g && Yp(f.charCodeAt(d));)d++; return S = 5 } case 33: return f.charCodeAt(d + 1) === 61 ? f.charCodeAt(d + 2) === 61 ? (d += 3, S = 37) : (d += 2, S = 35) : (d++, S = 53); case 34: case 39: return x = fe(), S = 10; case 96: return S = Z(!1); case 37: return f.charCodeAt(d + 1) === 61 ? (d += 2, S = 69) : (d++, S = 44); case 38: return f.charCodeAt(d + 1) === 38 ? f.charCodeAt(d + 2) === 61 ? (d += 3, S = 76) : (d += 2, S = 55) : f.charCodeAt(d + 1) === 61 ? (d += 2, S = 73) : (d++, S = 50); case 40: return d++, S = 20; case 41: return d++, S = 21; case 42: if (f.charCodeAt(d + 1) === 61) return d += 2, S = 66; if (f.charCodeAt(d + 1) === 42) return f.charCodeAt(d + 2) === 61 ? (d += 3, S = 67) : (d += 2, S = 42); if (d++, C && !vn && A & 1) { vn = !0; continue } return S = 41; case 43: return f.charCodeAt(d + 1) === 43 ? (d += 2, S = 45) : f.charCodeAt(d + 1) === 61 ? (d += 2, S = 64) : (d++, S = 39); case 44: return d++, S = 27; case 45: return f.charCodeAt(d + 1) === 45 ? (d += 2, S = 46) : f.charCodeAt(d + 1) === 61 ? (d += 2, S = 65) : (d++, S = 40); case 46: return sI(f.charCodeAt(d + 1)) ? (x = q().value, S = 8) : f.charCodeAt(d + 1) === 46 && f.charCodeAt(d + 2) === 46 ? (d += 3, S = 25) : (d++, S = 24); case 47: if (f.charCodeAt(d + 1) === 47) { for (d += 2; d < g && !Wl(f.charCodeAt(d));)d++; if (w = Ye(w, f.slice(v, d), Ioe, v), t) continue; return S = 2 } if (f.charCodeAt(d + 1) === 42) { d += 2, f.charCodeAt(d) === 42 && f.charCodeAt(d + 1) !== 47 && (A |= 2); let Tt = !1, ve = v; for (; d < g;) { let nt = f.charCodeAt(d); if (nt === 42 && f.charCodeAt(d + 1) === 47) { d += 2, Tt = !0; break } d++, Wl(nt) && (ve = d, A |= 1) } if (w = Ye(w, f.slice(ve, d), Loe, ve), Tt || F(_.Asterisk_Slash_expected), t) continue; return Tt || (A |= 4), S = 3 } return f.charCodeAt(d + 1) === 61 ? (d += 2, S = 68) : (d++, S = 43); case 48: if (d + 2 < g && (f.charCodeAt(d + 1) === 88 || f.charCodeAt(d + 1) === 120)) return d += 2, x = ie(1, !0), x || (F(_.Hexadecimal_digit_expected), x = "0"), x = "0x" + x, A |= 64, S = ke(); if (d + 2 < g && (f.charCodeAt(d + 1) === 66 || f.charCodeAt(d + 1) === 98)) return d += 2, x = we(2), x || (F(_.Binary_digit_expected), x = "0"), x = "0b" + x, A |= 128, S = ke(); if (d + 2 < g && (f.charCodeAt(d + 1) === 79 || f.charCodeAt(d + 1) === 111)) return d += 2, x = we(8), x || (F(_.Octal_digit_expected), x = "0"), x = "0o" + x, A |= 256, S = ke(); if (d + 1 < g && hj(f.charCodeAt(d + 1))) return x = "" + Y(), A |= 32, S = 8; case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: return { type: S, value: x } = q(), S; case 58: return d++, S = 58; case 59: return d++, S = 26; case 60: if (yA(f, d)) { if (d = cI(f, d, F), t) continue; return S = 7 } return f.charCodeAt(d + 1) === 60 ? f.charCodeAt(d + 2) === 61 ? (d += 3, S = 70) : (d += 2, S = 47) : f.charCodeAt(d + 1) === 61 ? (d += 2, S = 32) : r === 1 && f.charCodeAt(d + 1) === 47 && f.charCodeAt(d + 2) !== 42 ? (d += 2, S = 30) : (d++, S = 29); case 61: if (yA(f, d)) { if (d = cI(f, d, F), t) continue; return S = 7 } return f.charCodeAt(d + 1) === 61 ? f.charCodeAt(d + 2) === 61 ? (d += 3, S = 36) : (d += 2, S = 34) : f.charCodeAt(d + 1) === 62 ? (d += 2, S = 38) : (d++, S = 63); case 62: if (yA(f, d)) { if (d = cI(f, d, F), t) continue; return S = 7 } return d++, S = 31; case 63: return f.charCodeAt(d + 1) === 46 && !sI(f.charCodeAt(d + 2)) ? (d += 2, S = 28) : f.charCodeAt(d + 1) === 63 ? f.charCodeAt(d + 2) === 61 ? (d += 3, S = 77) : (d += 2, S = 60) : (d++, S = 57); case 91: return d++, S = 22; case 93: return d++, S = 23; case 94: return f.charCodeAt(d + 1) === 61 ? (d += 2, S = 78) : (d++, S = 52); case 123: return d++, S = 18; case 124: if (yA(f, d)) { if (d = cI(f, d, F), t) continue; return S = 7 } return f.charCodeAt(d + 1) === 124 ? f.charCodeAt(d + 2) === 61 ? (d += 3, S = 75) : (d += 2, S = 56) : f.charCodeAt(d + 1) === 61 ? (d += 2, S = 74) : (d++, S = 51); case 125: return d++, S = 19; case 126: return d++, S = 54; case 64: return d++, S = 59; case 92: let En = ge(); if (En >= 0 && Pm(En, e)) return d += 3, A |= 8, x = le() + X(), S = Ve(); let dr = _e(); return dr >= 0 && Pm(dr, e) ? (d += 6, A |= 1024, x = String.fromCharCode(dr) + X(), S = Ve()) : (F(_.Invalid_character), d++, S = 0); case 35: if (d !== 0 && f[d + 1] === "!") return F(_.can_only_be_used_at_the_start_of_a_file), d++, S = 0; let Cr = Dg(f, d + 1); if (Cr === 92) { d++; let Tt = ge(); if (Tt >= 0 && Pm(Tt, e)) return d += 3, A |= 8, x = "#" + le() + X(), S = 80; let ve = _e(); if (ve >= 0 && Pm(ve, e)) return d += 6, A |= 1024, x = "#" + String.fromCharCode(ve) + X(), S = 80; d-- } return Pm(Cr, e) ? (d++, Ie(Cr, e)) : (x = "#", F(_.Invalid_character, d++, By(Ht))), S = 80; default: let Se = Ie(Ht, e); if (Se) return S = Se; if (Yp(Ht)) { d += By(Ht); continue } else if (Wl(Ht)) { A |= 1, d += By(Ht); continue } let at = By(Ht); return F(_.Invalid_character, d, at), d += at, S = 0 } } } function Ce() { L.assert(S === 0, "'reScanInvalidIdentifier' should only be called when the current token is 'SyntaxKind.Unknown'."), d = v = m, A = 0; let vn = Dg(f, d), Ht = Ie(vn, 99); return Ht ? S = Ht : (d += By(vn), S) } function Ie(vn, Ht) { let En = vn; if (Pm(En, Ht)) { for (d += By(En); d < g && tb(En = Dg(f, d), Ht);)d += By(En); return x = f.substring(v, d), En === 92 && (x += X()), Ve() } } function Be() { if (S === 31) { if (f.charCodeAt(d) === 62) return f.charCodeAt(d + 1) === 62 ? f.charCodeAt(d + 2) === 61 ? (d += 3, S = 72) : (d += 2, S = 49) : f.charCodeAt(d + 1) === 61 ? (d += 2, S = 71) : (d++, S = 48); if (f.charCodeAt(d) === 61) return d++, S = 33 } return S } function Ne() { return L.assert(S === 66, "'reScanAsteriskEqualsToken' should only be called on a '*='"), d = v + 1, S = 63 } function Le() { if (S === 43 || S === 68) { let vn = v + 1, Ht = !1, En = !1; for (; ;) { if (vn >= g) { A |= 4, F(_.Unterminated_regular_expression_literal); break } let dr = f.charCodeAt(vn); if (Wl(dr)) { A |= 4, F(_.Unterminated_regular_expression_literal); break } if (Ht) Ht = !1; else if (dr === 47 && !En) { vn++; break } else dr === 91 ? En = !0 : dr === 92 ? Ht = !0 : dr === 93 && (En = !1); vn++ } for (; vn < g && tb(f.charCodeAt(vn), e);)vn++; d = vn, x = f.substring(v, d), S = 13 } return S } function Ye(vn, Ht, En, dr) { let Cr = _t(ZC(Ht), En); return Cr === void 0 ? vn : Sn(vn, { range: { pos: dr, end: d }, type: Cr }) } function _t(vn, Ht) { let En = Ht.exec(vn); if (En) switch (En[1]) { case "ts-expect-error": return 0; case "ts-ignore": return 1 } } function ct(vn) { return L.assert(S === 19, "'reScanTemplateToken' should only be called on a '}'"), d = v, S = Z(vn) } function Rt() { return d = v, S = Z(!0) } function We(vn = !0) { return d = v = m, S = tn(vn) } function qe() { return S === 47 ? (d = v + 1, S = 29) : S } function zt() { return S === 80 ? (d = v + 1, S = 62) : S } function Qt() { return L.assert(S === 60, "'reScanQuestionToken' should only be called on a '??'"), d = v + 1, S = 57 } function tn(vn = !0) { if (m = v = d, d >= g) return S = 1; let Ht = f.charCodeAt(d); if (Ht === 60) return f.charCodeAt(d + 1) === 47 ? (d += 2, S = 30) : (d++, S = 29); if (Ht === 123) return d++, S = 18; let En = 0; for (; d < g && (Ht = f.charCodeAt(d), Ht !== 123);) { if (Ht === 60) { if (yA(f, d)) return d = cI(f, d, F), S = 7; break } if (Ht === 62 && F(_.Unexpected_token_Did_you_mean_or_gt, d, 1), Ht === 125 && F(_.Unexpected_token_Did_you_mean_or_rbrace, d, 1), Wl(Ht) && En === 0) En = -1; else { if (!vn && Wl(Ht) && En > 0) break; xh(Ht) || (En = d) } d++ } return x = f.substring(m, d), En === -1 ? 12 : 11 } function kn() { if (Su(S)) { let vn = !1; for (; d < g;) { let Ht = f.charCodeAt(d); if (Ht === 45) { x += "-", d++; continue } else if (Ht === 58 && !vn) { x += ":", d++, vn = !0, S = 79; continue } let En = d; if (x += X(), d === En) break } return x.slice(-1) === ":" && (x = x.slice(0, -1), d--), Ve() } return S } function _n() { switch (m = d, f.charCodeAt(d)) { case 34: case 39: return x = fe(!0), S = 10; default: return Pe() } } function Gt() { return d = v = m, _n() } function $n() { if (m = v = d, A = 0, d >= g) return S = 1; let vn = Dg(f, d); switch (d += By(vn), vn) { case 9: case 11: case 12: case 32: for (; d < g && Yp(f.charCodeAt(d));)d++; return S = 5; case 64: return S = 59; case 13: f.charCodeAt(d) === 10 && d++; case 10: return A |= 1, S = 4; case 42: return S = 41; case 123: return S = 18; case 125: return S = 19; case 91: return S = 22; case 93: return S = 23; case 60: return S = 29; case 62: return S = 31; case 61: return S = 63; case 44: return S = 27; case 46: return S = 24; case 96: return S = 61; case 35: return S = 62; case 92: d--; let Ht = ge(); if (Ht >= 0 && Pm(Ht, e)) return d += 3, A |= 8, x = le() + X(), S = Ve(); let En = _e(); return En >= 0 && Pm(En, e) ? (d += 6, A |= 1024, x = String.fromCharCode(En) + X(), S = Ve()) : (d++, S = 0) }if (Pm(vn, e)) { let Ht = vn; for (; d < g && tb(Ht = Dg(f, d), e) || f.charCodeAt(d) === 45;)d += By(Ht); return x = f.substring(v, d), Ht === 92 && (x += X()), S = Ve() } else return S = 0 } function ui(vn, Ht) { let En = d, dr = m, Cr = v, Se = S, at = x, Tt = A, ve = vn(); return (!ve || Ht) && (d = En, m = dr, v = Cr, S = Se, x = at, A = Tt), ve } function Ni(vn, Ht, En) { let dr = g, Cr = d, Se = m, at = v, Tt = S, ve = x, nt = A, ce = w; Dt(f, vn, Ht); let Q = En(); return g = dr, d = Cr, m = Se, v = at, S = Tt, x = ve, A = nt, w = ce, Q } function Pi(vn) { return ui(vn, !0) } function gr(vn) { return ui(vn, !1) } function pt() { return f } function nn() { w = void 0 } function Dt(vn, Ht, En) { f = vn || "", g = En === void 0 ? f.length : Ht + En, hi(Ht || 0) } function pn(vn) { o = vn } function An(vn) { e = vn } function Kn(vn) { r = vn } function hi(vn) { L.assert(vn >= 0), d = vn, m = vn, v = vn, S = 0, x = void 0, A = 0 } function ri(vn) { C += vn ? 1 : -1 }
+            } function By(e) { return e >= 65536 ? 2 : 1 } function NDe(e) { if (L.assert(0 <= e && e <= 1114111), e <= 65535) return String.fromCharCode(e); let t = Math.floor((e - 65536) / 1024) + 55296, r = (e - 65536) % 1024 + 56320; return String.fromCharCode(t, r) } function lI(e) { return Doe(e) } var Ew, boe, vj, Eoe, Toe, Soe, xoe, Aoe, Coe, Ioe, Loe, koe, Tw, q8, Dg, Doe, PDe = gt({ "src/compiler/scanner.ts"() { "use strict"; fa(), Ew = { abstract: 126, accessor: 127, any: 131, as: 128, asserts: 129, assert: 130, bigint: 160, boolean: 134, break: 81, case: 82, catch: 83, class: 84, continue: 86, const: 85, constructor: 135, debugger: 87, declare: 136, default: 88, delete: 89, do: 90, else: 91, enum: 92, export: 93, extends: 94, false: 95, finally: 96, for: 97, from: 158, function: 98, get: 137, if: 99, implements: 117, import: 100, in: 101, infer: 138, instanceof: 102, interface: 118, intrinsic: 139, is: 140, keyof: 141, let: 119, module: 142, namespace: 143, never: 144, new: 103, null: 104, number: 148, object: 149, package: 120, private: 121, protected: 122, public: 123, override: 161, out: 145, readonly: 146, require: 147, global: 159, return: 105, satisfies: 150, set: 151, static: 124, string: 152, super: 106, switch: 107, symbol: 153, this: 108, throw: 109, true: 110, try: 111, type: 154, typeof: 112, undefined: 155, unique: 156, unknown: 157, var: 113, void: 114, while: 115, with: 116, yield: 125, async: 132, await: 133, of: 162 }, boe = new Map(Object.entries(Ew)), vj = new Map(Object.entries({ ...Ew, "{": 18, "}": 19, "(": 20, ")": 21, "[": 22, "]": 23, ".": 24, "...": 25, ";": 26, ",": 27, "<": 29, ">": 31, "<=": 32, ">=": 33, "==": 34, "!=": 35, "===": 36, "!==": 37, "=>": 38, "+": 39, "-": 40, "**": 42, "*": 41, "/": 43, "%": 44, "++": 45, "--": 46, "<<": 47, "</": 30, ">>": 48, ">>>": 49, "&": 50, "|": 51, "^": 52, "!": 53, "~": 54, "&&": 55, "||": 56, "?": 57, "??": 60, "?.": 28, ":": 58, "=": 63, "+=": 64, "-=": 65, "*=": 66, "**=": 67, "/=": 68, "%=": 69, "<<=": 70, ">>=": 71, ">>>=": 72, "&=": 73, "|=": 74, "^=": 78, "||=": 75, "&&=": 76, "??=": 77, "@": 59, "#": 62, "`": 61 })), Eoe = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 543, 546, 563, 592, 685, 688, 696, 699, 705, 720, 721, 736, 740, 750, 750, 890, 890, 902, 902, 904, 906, 908, 908, 910, 929, 931, 974, 976, 983, 986, 1011, 1024, 1153, 1164, 1220, 1223, 1224, 1227, 1228, 1232, 1269, 1272, 1273, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1569, 1594, 1600, 1610, 1649, 1747, 1749, 1749, 1765, 1766, 1786, 1788, 1808, 1808, 1810, 1836, 1920, 1957, 2309, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2699, 2701, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2784, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2870, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 2997, 2999, 3001, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3294, 3294, 3296, 3297, 3333, 3340, 3342, 3344, 3346, 3368, 3370, 3385, 3424, 3425, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3805, 3840, 3840, 3904, 3911, 3913, 3946, 3976, 3979, 4096, 4129, 4131, 4135, 4137, 4138, 4176, 4181, 4256, 4293, 4304, 4342, 4352, 4441, 4447, 4514, 4520, 4601, 4608, 4614, 4616, 4678, 4680, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4742, 4744, 4744, 4746, 4749, 4752, 4782, 4784, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4814, 4816, 4822, 4824, 4846, 4848, 4878, 4880, 4880, 4882, 4885, 4888, 4894, 4896, 4934, 4936, 4954, 5024, 5108, 5121, 5740, 5743, 5750, 5761, 5786, 5792, 5866, 6016, 6067, 6176, 6263, 6272, 6312, 7680, 7835, 7840, 7929, 7936, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8319, 8319, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8497, 8499, 8505, 8544, 8579, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12346, 12353, 12436, 12445, 12446, 12449, 12538, 12540, 12542, 12549, 12588, 12593, 12686, 12704, 12727, 13312, 19893, 19968, 40869, 40960, 42124, 44032, 55203, 63744, 64045, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65138, 65140, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500], Toe = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 543, 546, 563, 592, 685, 688, 696, 699, 705, 720, 721, 736, 740, 750, 750, 768, 846, 864, 866, 890, 890, 902, 902, 904, 906, 908, 908, 910, 929, 931, 974, 976, 983, 986, 1011, 1024, 1153, 1155, 1158, 1164, 1220, 1223, 1224, 1227, 1228, 1232, 1269, 1272, 1273, 1329, 1366, 1369, 1369, 1377, 1415, 1425, 1441, 1443, 1465, 1467, 1469, 1471, 1471, 1473, 1474, 1476, 1476, 1488, 1514, 1520, 1522, 1569, 1594, 1600, 1621, 1632, 1641, 1648, 1747, 1749, 1756, 1759, 1768, 1770, 1773, 1776, 1788, 1808, 1836, 1840, 1866, 1920, 1968, 2305, 2307, 2309, 2361, 2364, 2381, 2384, 2388, 2392, 2403, 2406, 2415, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2492, 2494, 2500, 2503, 2504, 2507, 2509, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2562, 2562, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2649, 2652, 2654, 2654, 2662, 2676, 2689, 2691, 2693, 2699, 2701, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2784, 2790, 2799, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2870, 2873, 2876, 2883, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2913, 2918, 2927, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 2997, 2999, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3031, 3031, 3047, 3055, 3073, 3075, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3134, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3168, 3169, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3262, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3297, 3302, 3311, 3330, 3331, 3333, 3340, 3342, 3344, 3346, 3368, 3370, 3385, 3390, 3395, 3398, 3400, 3402, 3405, 3415, 3415, 3424, 3425, 3430, 3439, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3805, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3946, 3953, 3972, 3974, 3979, 3984, 3991, 3993, 4028, 4038, 4038, 4096, 4129, 4131, 4135, 4137, 4138, 4140, 4146, 4150, 4153, 4160, 4169, 4176, 4185, 4256, 4293, 4304, 4342, 4352, 4441, 4447, 4514, 4520, 4601, 4608, 4614, 4616, 4678, 4680, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4742, 4744, 4744, 4746, 4749, 4752, 4782, 4784, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4814, 4816, 4822, 4824, 4846, 4848, 4878, 4880, 4880, 4882, 4885, 4888, 4894, 4896, 4934, 4936, 4954, 4969, 4977, 5024, 5108, 5121, 5740, 5743, 5750, 5761, 5786, 5792, 5866, 6016, 6099, 6112, 6121, 6160, 6169, 6176, 6263, 6272, 6313, 7680, 7835, 7840, 7929, 7936, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8255, 8256, 8319, 8319, 8400, 8412, 8417, 8417, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8497, 8499, 8505, 8544, 8579, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12346, 12353, 12436, 12441, 12442, 12445, 12446, 12449, 12542, 12549, 12588, 12593, 12686, 12704, 12727, 13312, 19893, 19968, 40869, 40960, 42124, 44032, 55203, 63744, 64045, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65056, 65059, 65075, 65076, 65101, 65103, 65136, 65138, 65140, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65381, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500], Soe = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6e3, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43e3, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500], xoe = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520, 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112, 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423, 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424, 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6e3, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272, 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155, 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205, 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417, 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43e3, 43047, 43072, 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309, 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584, 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500], Aoe = [65, 90, 97, 122, 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 895, 895, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1488, 1514, 1519, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2144, 2154, 2208, 2228, 2230, 2237, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2432, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2556, 2556, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2809, 2809, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3133, 3160, 3162, 3168, 3169, 3200, 3200, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3412, 3414, 3423, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5880, 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6e3, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6264, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6430, 6480, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7401, 7404, 7406, 7411, 7413, 7414, 7418, 7418, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8472, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12443, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40943, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42653, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42943, 42946, 42950, 42999, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43261, 43262, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43488, 43492, 43494, 43503, 43514, 43518, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43646, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43879, 43888, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66176, 66204, 66208, 66256, 66304, 66335, 66349, 66378, 66384, 66421, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 67072, 67382, 67392, 67413, 67424, 67431, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68096, 68112, 68115, 68117, 68119, 68121, 68149, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68324, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68899, 69376, 69404, 69415, 69415, 69424, 69445, 69600, 69622, 69635, 69687, 69763, 69807, 69840, 69864, 69891, 69926, 69956, 69956, 69968, 70002, 70006, 70006, 70019, 70066, 70081, 70084, 70106, 70106, 70108, 70108, 70144, 70161, 70163, 70187, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70366, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70461, 70461, 70480, 70480, 70493, 70497, 70656, 70708, 70727, 70730, 70751, 70751, 70784, 70831, 70852, 70853, 70855, 70855, 71040, 71086, 71128, 71131, 71168, 71215, 71236, 71236, 71296, 71338, 71352, 71352, 71424, 71450, 71680, 71723, 71840, 71903, 71935, 71935, 72096, 72103, 72106, 72144, 72161, 72161, 72163, 72163, 72192, 72192, 72203, 72242, 72250, 72250, 72272, 72272, 72284, 72329, 72349, 72349, 72384, 72440, 72704, 72712, 72714, 72750, 72768, 72768, 72818, 72847, 72960, 72966, 72968, 72969, 72971, 73008, 73030, 73030, 73056, 73061, 73063, 73064, 73066, 73097, 73112, 73112, 73440, 73458, 73728, 74649, 74752, 74862, 74880, 75075, 77824, 78894, 82944, 83526, 92160, 92728, 92736, 92766, 92880, 92909, 92928, 92975, 92992, 92995, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94032, 94032, 94099, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101106, 110592, 110878, 110928, 110930, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 123136, 123180, 123191, 123197, 123214, 123214, 123584, 123627, 124928, 125124, 125184, 125251, 125259, 125259, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173782, 173824, 177972, 177984, 178205, 178208, 183969, 183984, 191456, 194560, 195101], Coe = [48, 57, 65, 90, 95, 95, 97, 122, 170, 170, 181, 181, 183, 183, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 895, 895, 902, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1155, 1159, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1519, 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2045, 2045, 2048, 2093, 2112, 2139, 2144, 2154, 2208, 2228, 2230, 2237, 2259, 2273, 2275, 2403, 2406, 2415, 2417, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2556, 2556, 2558, 2558, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2809, 2815, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3072, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3162, 3168, 3171, 3174, 3183, 3200, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3328, 3331, 3333, 3340, 3342, 3344, 3346, 3396, 3398, 3400, 3402, 3406, 3412, 3415, 3423, 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3558, 3567, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4969, 4977, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5880, 5888, 5900, 5902, 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6e3, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6264, 6272, 6314, 6320, 6389, 6400, 6430, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6608, 6618, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6823, 6823, 6832, 6845, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155, 7168, 7223, 7232, 7241, 7245, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7376, 7378, 7380, 7418, 7424, 7673, 7675, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417, 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8472, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40943, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42539, 42560, 42607, 42612, 42621, 42623, 42737, 42775, 42783, 42786, 42888, 42891, 42943, 42946, 42950, 42999, 43047, 43072, 43123, 43136, 43205, 43216, 43225, 43232, 43255, 43259, 43259, 43261, 43309, 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43488, 43518, 43520, 43574, 43584, 43597, 43600, 43609, 43616, 43638, 43642, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43879, 43888, 44010, 44012, 44013, 44016, 44025, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65071, 65075, 65076, 65101, 65103, 65136, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66045, 66045, 66176, 66204, 66208, 66256, 66272, 66272, 66304, 66335, 66349, 66378, 66384, 66426, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 66720, 66729, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 67072, 67382, 67392, 67413, 67424, 67431, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68099, 68101, 68102, 68108, 68115, 68117, 68119, 68121, 68149, 68152, 68154, 68159, 68159, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68326, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68903, 68912, 68921, 69376, 69404, 69415, 69415, 69424, 69456, 69600, 69622, 69632, 69702, 69734, 69743, 69759, 69818, 69840, 69864, 69872, 69881, 69888, 69940, 69942, 69951, 69956, 69958, 69968, 70003, 70006, 70006, 70016, 70084, 70089, 70092, 70096, 70106, 70108, 70108, 70144, 70161, 70163, 70199, 70206, 70206, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70378, 70384, 70393, 70400, 70403, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70459, 70468, 70471, 70472, 70475, 70477, 70480, 70480, 70487, 70487, 70493, 70499, 70502, 70508, 70512, 70516, 70656, 70730, 70736, 70745, 70750, 70751, 70784, 70853, 70855, 70855, 70864, 70873, 71040, 71093, 71096, 71104, 71128, 71133, 71168, 71232, 71236, 71236, 71248, 71257, 71296, 71352, 71360, 71369, 71424, 71450, 71453, 71467, 71472, 71481, 71680, 71738, 71840, 71913, 71935, 71935, 72096, 72103, 72106, 72151, 72154, 72161, 72163, 72164, 72192, 72254, 72263, 72263, 72272, 72345, 72349, 72349, 72384, 72440, 72704, 72712, 72714, 72758, 72760, 72768, 72784, 72793, 72818, 72847, 72850, 72871, 72873, 72886, 72960, 72966, 72968, 72969, 72971, 73014, 73018, 73018, 73020, 73021, 73023, 73031, 73040, 73049, 73056, 73061, 73063, 73064, 73066, 73102, 73104, 73105, 73107, 73112, 73120, 73129, 73440, 73462, 73728, 74649, 74752, 74862, 74880, 75075, 77824, 78894, 82944, 83526, 92160, 92728, 92736, 92766, 92768, 92777, 92880, 92909, 92912, 92916, 92928, 92982, 92992, 92995, 93008, 93017, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94031, 94087, 94095, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101106, 110592, 110878, 110928, 110930, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 113821, 113822, 119141, 119145, 119149, 119154, 119163, 119170, 119173, 119179, 119210, 119213, 119362, 119364, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 120782, 120831, 121344, 121398, 121403, 121452, 121461, 121461, 121476, 121476, 121499, 121503, 121505, 121519, 122880, 122886, 122888, 122904, 122907, 122913, 122915, 122916, 122918, 122922, 123136, 123180, 123184, 123197, 123200, 123209, 123214, 123214, 123584, 123641, 124928, 125124, 125136, 125142, 125184, 125259, 125264, 125273, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173782, 173824, 177972, 177984, 178205, 178208, 183969, 183984, 191456, 194560, 195101, 917760, 917999], Ioe = /^\/\/\/?\s*@(ts-expect-error|ts-ignore)/, Loe = /^(?:\/|\*)*\s*@(ts-expect-error|ts-ignore)/, koe = RDe(vj), Tw = 7, q8 = /^#!.*/, Dg = String.prototype.codePointAt ? (e, t) => e.codePointAt(t) : function (t, r) { let i = t.length; if (r < 0 || r >= i) return; let o = t.charCodeAt(r); if (o >= 55296 && o <= 56319 && i > r + 1) { let s = t.charCodeAt(r + 1); if (s >= 56320 && s <= 57343) return (o - 55296) * 1024 + s - 56320 + 65536 } return o }, Doe = String.fromCodePoint ? e => String.fromCodePoint(e) : NDe } }); function fl(e) { return Jd(e) || qp(e) } function vA(e) { return HD(e, ZI) } function X8(e) { switch (Do(e)) { case 99: return "lib.esnext.full.d.ts"; case 9: return "lib.es2022.full.d.ts"; case 8: return "lib.es2021.full.d.ts"; case 7: return "lib.es2020.full.d.ts"; case 6: return "lib.es2019.full.d.ts"; case 5: return "lib.es2018.full.d.ts"; case 4: return "lib.es2017.full.d.ts"; case 3: return "lib.es2016.full.d.ts"; case 2: return "lib.es6.d.ts"; default: return "lib.d.ts" } } function wl(e) { return e.start + e.length } function woe(e) { return e.length === 0 } function bj(e, t) { return t >= e.start && t < wl(e) } function Y8(e, t) { return t >= e.pos && t <= e.end } function Roe(e, t) { return t.start >= e.start && wl(t) <= wl(e) } function MDe(e, t) { return Ooe(e, t) !== void 0 } function Ooe(e, t) { let r = Poe(e, t); return r && r.length === 0 ? void 0 : r } function FDe(e, t) { return Q8(e.start, e.length, t.start, t.length) } function $8(e, t, r) { return Q8(e.start, e.length, t, r) } function Q8(e, t, r, i) { let o = e + t, s = r + i; return r <= o && s >= e } function Noe(e, t) { return t <= wl(e) && t >= e.start } function Poe(e, t) { let r = Math.max(e.start, t.start), i = Math.min(wl(e), wl(t)); return r <= i ? Wc(r, i) : void 0 } function il(e, t) { if (e < 0) throw new Error("start < 0"); if (t < 0) throw new Error("length < 0"); return { start: e, length: t } } function Wc(e, t) { return il(e, t - e) } function uI(e) { return il(e.span.start, e.newLength) } function Moe(e) { return woe(e.span) && e.newLength === 0 } function Sw(e, t) { if (t < 0) throw new Error("newLength < 0"); return { span: e, newLength: t } } function GDe(e) { if (e.length === 0) return $j; if (e.length === 1) return e[0]; let t = e[0], r = t.span.start, i = wl(t.span), o = r + t.newLength; for (let s = 1; s < e.length; s++) { let l = e[s], f = r, d = i, g = o, m = l.span.start, v = wl(l.span), S = m + l.newLength; r = Math.min(f, m), i = Math.max(d, d + (v - g)), o = Math.max(S, S + (g - v)) } return Sw(Wc(r, i), o - r) } function BDe(e) { if (e && e.kind === 165) { for (let t = e; t; t = t.parent)if (Ia(t) || Yr(t) || t.kind === 261) return t } } function Ad(e, t) { return ha(e) && Mr(e, 16476) && t.kind === 173 } function Foe(e) { return La(e) ? Ji(e.elements, Goe) : !1 } function Goe(e) { return ol(e) ? !0 : Foe(e.name) } function bA(e) { let t = e.parent; for (; Wo(t.parent);)t = t.parent.parent; return t.parent } function Ej(e, t) { Wo(e) && (e = bA(e)); let r = t(e); return e.kind === 257 && (e = e.parent), e && e.kind === 258 && (r |= t(e), e = e.parent), e && e.kind === 240 && (r |= t(e)), r } function wg(e) { return Ej(e, uu) } function Tj(e) { return Ej(e, Jce) } function G_(e) { return Ej(e, t => t.flags) } function UDe(e, t, r) { let i = e.toLowerCase(), o = /^([a-z]+)([_\-]([a-z]+))?$/.exec(i); if (!o) { r && r.push(ps(_.Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1, "en", "ja-jp")); return } let s = o[1], l = o[3]; ya(Qj, i) && !f(s, l, r) && f(s, void 0, r), Aae(e); function f(d, g, m) { let v = So(t.getExecutingFilePath()), S = ni(v), x = vi(S, d); if (g && (x = x + "-" + g), x = t.resolvePath(vi(x, "diagnosticMessages.generated.json")), !t.fileExists(x)) return !1; let A = ""; try { A = t.readFile(x) } catch { return m && m.push(ps(_.Unable_to_open_file_0, x)), !1 } try { ple(JSON.parse(A)) } catch { return m && m.push(ps(_.Corrupted_locale_file_0, x)), !1 } return !0 } } function ec(e, t) { if (e) for (; e.original !== void 0;)e = e.original; return !e || !t || t(e) ? e : void 0 } function jn(e, t) { for (; e;) { let r = t(e); if (r === "quit") return; if (r) return e; e = e.parent } } function dI(e) { return (e.flags & 8) === 0 } function ea(e, t) { if (e === void 0 || dI(e)) return e; for (e = e.original; e;) { if (dI(e)) return !t || t(e) ? e : void 0; e = e.original } } function Bs(e) { return e.length >= 2 && e.charCodeAt(0) === 95 && e.charCodeAt(1) === 95 ? "_" + e : e } function Gi(e) { let t = e; return t.length >= 3 && t.charCodeAt(0) === 95 && t.charCodeAt(1) === 95 && t.charCodeAt(2) === 95 ? t.substr(1) : t } function vr(e) { return Gi(e.escapedText) } function nb(e) { let t = lT(e.escapedText); return t ? zr(t, Xu) : void 0 } function fc(e) { return e.valueDeclaration && xu(e.valueDeclaration) ? vr(e.valueDeclaration.name) : Gi(e.escapedName) } function Boe(e) { let t = e.parent.parent; if (t) { if (Kl(t)) return Z8(t); switch (t.kind) { case 240: if (t.declarationList && t.declarationList.declarations[0]) return Z8(t.declarationList.declarations[0]); break; case 241: let r = t.expression; switch (r.kind === 223 && r.operatorToken.kind === 63 && (r = r.left), r.kind) { case 208: return r.name; case 209: let i = r.argumentExpression; if (Re(i)) return i }break; case 214: return Z8(t.expression); case 253: { if (Kl(t.statement) || ot(t.statement)) return Z8(t.statement); break } } } } function Z8(e) { let t = sa(e); return t && Re(t) ? t : void 0 } function xw(e, t) { return !!(zl(e) && Re(e.name) && vr(e.name) === vr(t) || Bc(e) && vt(e.declarationList.declarations, r => xw(r, t))) } function Uoe(e) { return e.name || Boe(e) } function zl(e) { return !!e.name } function Sj(e) { switch (e.kind) { case 79: return e; case 351: case 344: { let { name: r } = e; if (r.kind === 163) return r.right; break } case 210: case 223: { let r = e; switch (ic(r)) { case 1: case 4: case 5: case 3: return W6(r.left); case 7: case 8: case 9: return r.arguments[1]; default: return } } case 349: return Uoe(e); case 343: return Boe(e); case 274: { let { expression: r } = e; return Re(r) ? r : void 0 } case 209: let t = e; if (H6(t)) return t.argumentExpression }return e.name } function sa(e) { if (e !== void 0) return Sj(e) || (ms(e) || xs(e) || _u(e) ? xj(e) : void 0) } function xj(e) { if (e.parent) { if (yl(e.parent) || Wo(e.parent)) return e.parent.name; if (ar(e.parent) && e === e.parent.right) { if (Re(e.parent.left)) return e.parent.left; if (Us(e.parent.left)) return W6(e.parent.left) } else if (wi(e.parent) && Re(e.parent.name)) return e.parent.name } else return } function Uy(e) { if (bf(e)) return Pr(e.modifiers, du) } function uT(e) { if (Mr(e, 126975)) return Pr(e.modifiers, Ha) } function Voe(e, t) { if (e.name) if (Re(e.name)) { let r = e.name.escapedText; return _I(e.parent, t).filter(i => xp(i) && Re(i.name) && i.name.escapedText === r) } else { let r = e.parent.parameters.indexOf(e); L.assert(r > -1, "Parameters should always be in their parents' parameter list"); let i = _I(e.parent, t).filter(xp); if (r < i.length) return [i[r]] } return Je } function fI(e) { return Voe(e, !1) } function joe(e) { return Voe(e, !0) } function Hoe(e, t) { let r = e.name.escapedText; return _I(e.parent, t).filter(i => H_(i) && i.typeParameters.some(o => o.name.escapedText === r)) } function Woe(e) { return Hoe(e, !1) } function zoe(e) { return Hoe(e, !0) } function Joe(e) { return !!gf(e, xp) } function Koe(e) { return gf(e, x2) } function qoe(e) { return kj(e, qz) } function Aj(e) { return gf(e, Xue) } function VDe(e) { return gf(e, jz) } function Xoe(e) { return gf(e, jz, !0) } function jDe(e) { return gf(e, Hz) } function Yoe(e) { return gf(e, Hz, !0) } function HDe(e) { return gf(e, Wz) } function $oe(e) { return gf(e, Wz, !0) } function WDe(e) { return gf(e, zz) } function Qoe(e) { return gf(e, zz, !0) } function Zoe(e) { return gf(e, g3, !0) } function Cj(e) { return gf(e, Jz) } function ese(e) { return gf(e, Jz, !0) } function Ij(e) { return gf(e, vO) } function e6(e) { return gf(e, Yue) } function tse(e) { return gf(e, y3) } function zDe(e) { return gf(e, H_) } function Lj(e) { return gf(e, v3) } function x0(e) { let t = gf(e, DL); if (t && t.typeExpression && t.typeExpression.type) return t } function Vy(e) { let t = gf(e, DL); return !t && ha(e) && (t = wr(fI(e), r => !!r.typeExpression)), t && t.typeExpression && t.typeExpression.type } function Aw(e) { let t = tse(e); if (t && t.typeExpression) return t.typeExpression.type; let r = x0(e); if (r && r.typeExpression) { let i = r.typeExpression.type; if (Rd(i)) { let o = wr(i.members, _2); return o && o.type } if (Jm(i) || S2(i)) return i.type } } function _I(e, t) { var r, i; if (!lR(e)) return Je; let o = (r = e.jsDoc) == null ? void 0 : r.jsDocCache; if (o === void 0 || t) { let s = PH(e, t); L.assert(s.length < 2 || s[0] !== s[1]), o = Uo(s, l => dm(l) ? l.tags : l), t || ((i = e.jsDoc) != null || (e.jsDoc = []), e.jsDoc.jsDocCache = o) } return o } function A0(e) { return _I(e, !1) } function JDe(e) { return _I(e, !0) } function gf(e, t, r) { return wr(_I(e, r), t) } function kj(e, t) { return A0(e).filter(t) } function KDe(e, t) { return A0(e).filter(r => r.kind === t) } function Cw(e) { return typeof e == "string" ? e : e?.map(t => t.kind === 324 ? t.text : qDe(t)).join("") } function qDe(e) { let t = e.kind === 327 ? "link" : e.kind === 328 ? "linkcode" : "linkplain", r = e.name ? qd(e.name) : "", i = e.name && e.text.startsWith("://") ? "" : " "; return `{@${t} ${r}${i}${e.text}}` } function jy(e) { if (X0(e)) { if (kL(e.parent)) { let t = OI(e.parent); if (t && Fn(t.tags)) return Uo(t.tags, r => H_(r) ? r.typeParameters : void 0) } return Je } if (Ff(e)) return L.assert(e.parent.kind === 323), Uo(e.parent.tags, t => H_(t) ? t.typeParameters : void 0); if (e.typeParameters || sde(e) && e.typeParameters) return e.typeParameters; if (Yn(e)) { let t = t4(e); if (t.length) return t; let r = Vy(e); if (r && Jm(r) && r.typeParameters) return r.typeParameters } return Je } function EA(e) { return e.constraint ? e.constraint : H_(e.parent) && e === e.parent.typeParameters[0] ? e.parent.constraint : void 0 } function Ah(e) { return e.kind === 79 || e.kind === 80 } function t6(e) { return e.kind === 175 || e.kind === 174 } function n6(e) { return br(e) && !!(e.flags & 32) } function Dj(e) { return Vs(e) && !!(e.flags & 32) } function dT(e) { return Pa(e) && !!(e.flags & 32) } function Jl(e) { let t = e.kind; return !!(e.flags & 32) && (t === 208 || t === 209 || t === 210 || t === 232) } function pI(e) { return Jl(e) && !PS(e) && !!e.questionDotToken } function r6(e) { return pI(e.parent) && e.parent.expression === e } function mI(e) { return !Jl(e.parent) || pI(e.parent) || e !== e.parent.expression } function wj(e) { return e.kind === 223 && e.operatorToken.kind === 60 } function Ch(e) { return m_(e) && Re(e.typeName) && e.typeName.escapedText === "const" && !e.typeArguments } function a_(e) { return ql(e, 8) } function i6(e) { return PS(e) && !!(e.flags & 32) } function hI(e) { return e.kind === 249 || e.kind === 248 } function Rj(e) { return e.kind === 277 || e.kind === 276 } function nse(e) { switch (e.kind) { case 305: case 306: return !0; default: return !1 } } function Oj(e) { return nse(e) || e.kind === 303 || e.kind === 307 } function a6(e) { return e.kind === 351 || e.kind === 344 } function XDe(e) { return Iw(e.kind) } function Iw(e) { return e >= 163 } function Nj(e) { return e >= 0 && e <= 162 } function Z1(e) { return Nj(e.kind) } function C0(e) { return fs(e, "pos") && fs(e, "end") } function gI(e) { return 8 <= e && e <= 14 } function fT(e) { return gI(e.kind) } function Pj(e) { switch (e.kind) { case 207: case 206: case 13: case 215: case 228: return !0 }return !1 } function Hy(e) { return 14 <= e && e <= 17 } function rse(e) { return Hy(e.kind) } function o6(e) { let t = e.kind; return t === 16 || t === 17 } function eS(e) { return $u(e) || Mu(e) } function Mj(e) { switch (e.kind) { case 273: return e.isTypeOnly || e.parent.parent.isTypeOnly; case 271: return e.parent.isTypeOnly; case 270: case 268: return e.isTypeOnly }return !1 } function ise(e) { switch (e.kind) { case 278: return e.isTypeOnly || e.parent.parent.isTypeOnly; case 275: return e.isTypeOnly && !!e.moduleSpecifier && !e.exportClause; case 277: return e.parent.isTypeOnly }return !1 } function I0(e) { return Mj(e) || ise(e) } function ase(e) { return yo(e) || Re(e) } function Fj(e) { return e.kind === 10 || Hy(e.kind) } function tc(e) { var t; return Re(e) && ((t = e.emitNode) == null ? void 0 : t.autoGenerate) !== void 0 } function tS(e) { var t; return pi(e) && ((t = e.emitNode) == null ? void 0 : t.autoGenerate) !== void 0 } function xu(e) { return (Na(e) || xA(e)) && pi(e.name) } function TA(e) { return br(e) && pi(e.name) } function Rg(e) { switch (e) { case 126: case 127: case 132: case 85: case 136: case 88: case 93: case 101: case 123: case 121: case 122: case 146: case 124: case 145: case 161: return !0 }return !1 } function yI(e) { return !!(gS(e) & 16476) } function Gj(e) { return yI(e) || e === 124 || e === 161 || e === 127 } function Ha(e) { return Rg(e.kind) } function Cd(e) { let t = e.kind; return t === 163 || t === 79 } function Ys(e) { let t = e.kind; return t === 79 || t === 80 || t === 10 || t === 8 || t === 164 } function Mm(e) { let t = e.kind; return t === 79 || t === 203 || t === 204 } function Ia(e) { return !!e && nS(e.kind) } function SA(e) { return !!e && (nS(e.kind) || oc(e)) } function Ds(e) { return e && sse(e.kind) } function ose(e) { return e.kind === 110 || e.kind === 95 } function sse(e) { switch (e) { case 259: case 171: case 173: case 174: case 175: case 215: case 216: return !0; default: return !1 } } function nS(e) { switch (e) { case 170: case 176: case 326: case 177: case 178: case 181: case 320: case 182: return !0; default: return sse(e) } } function Bj(e) { return Li(e) || Tp(e) || Va(e) && Ia(e.parent) } function _l(e) { let t = e.kind; return t === 173 || t === 169 || t === 171 || t === 174 || t === 175 || t === 178 || t === 172 || t === 237 } function Yr(e) { return e && (e.kind === 260 || e.kind === 228) } function rb(e) { return e && (e.kind === 174 || e.kind === 175) } function Id(e) { return Na(e) && rm(e) } function xA(e) { switch (e.kind) { case 171: case 174: case 175: return !0; default: return !1 } } function cse(e) { switch (e.kind) { case 171: case 174: case 175: case 169: return !0; default: return !1 } } function Ns(e) { return Ha(e) || du(e) } function _T(e) { let t = e.kind; return t === 177 || t === 176 || t === 168 || t === 170 || t === 178 || t === 174 || t === 175 } function s6(e) { return _T(e) || _l(e) } function Og(e) { let t = e.kind; return t === 299 || t === 300 || t === 301 || t === 171 || t === 174 || t === 175 } function bi(e) { return vW(e.kind) } function lse(e) { switch (e.kind) { case 181: case 182: return !0 }return !1 } function La(e) { if (e) { let t = e.kind; return t === 204 || t === 203 } return !1 } function vI(e) { let t = e.kind; return t === 206 || t === 207 } function c6(e) { let t = e.kind; return t === 205 || t === 229 } function Lw(e) { switch (e.kind) { case 257: case 166: case 205: return !0 }return !1 } function use(e) { return wi(e) || ha(e) || Dw(e) || ww(e) } function kw(e) { return Uj(e) || Vj(e) } function Uj(e) { switch (e.kind) { case 203: case 207: return !0 }return !1 } function Dw(e) { switch (e.kind) { case 205: case 299: case 300: case 301: return !0 }return !1 } function Vj(e) { switch (e.kind) { case 204: case 206: return !0 }return !1 } function ww(e) { switch (e.kind) { case 205: case 229: case 227: case 206: case 207: case 79: case 208: case 209: return !0 }return Iu(e, !0) } function dse(e) { let t = e.kind; return t === 208 || t === 163 || t === 202 } function fse(e) { let t = e.kind; return t === 208 || t === 163 } function rS(e) { switch (e.kind) { case 283: case 282: case 210: case 211: case 212: case 167: return !0; default: return !1 } } function Ih(e) { return e.kind === 210 || e.kind === 211 } function AA(e) { let t = e.kind; return t === 225 || t === 14 } function Ju(e) { return _se(a_(e).kind) } function _se(e) { switch (e) { case 208: case 209: case 211: case 210: case 281: case 282: case 285: case 212: case 206: case 214: case 207: case 228: case 215: case 79: case 80: case 13: case 8: case 9: case 10: case 14: case 225: case 95: case 104: case 108: case 110: case 106: case 232: case 230: case 233: case 100: case 279: return !0; default: return !1 } } function jj(e) { return pse(a_(e).kind) } function pse(e) { switch (e) { case 221: case 222: case 217: case 218: case 219: case 220: case 213: return !0; default: return _se(e) } } function mse(e) { switch (e.kind) { case 222: return !0; case 221: return e.operator === 45 || e.operator === 46; default: return !1 } } function hse(e) { switch (e.kind) { case 104: case 110: case 95: case 221: return !0; default: return fT(e) } } function ot(e) { return YDe(a_(e).kind) } function YDe(e) { switch (e) { case 224: case 226: case 216: case 223: case 227: case 231: case 229: case 357: case 356: case 235: return !0; default: return pse(e) } } function pT(e) { let t = e.kind; return t === 213 || t === 231 } function $De(e) { return Gz(e) || _3(e) } function Wy(e, t) { switch (e.kind) { case 245: case 246: case 247: case 243: case 244: return !0; case 253: return t && Wy(e.statement, t) }return !1 } function gse(e) { return pc(e) || Il(e) } function yse(e) { return vt(e, gse) } function l6(e) { return !Uw(e) && !pc(e) && !Mr(e, 1) && !lu(e) } function Rw(e) { return Uw(e) || pc(e) || Mr(e, 1) } function CA(e) { return e.kind === 246 || e.kind === 247 } function u6(e) { return Va(e) || ot(e) } function Hj(e) { return Va(e) } function pp(e) { return pu(e) || ot(e) } function vse(e) { let t = e.kind; return t === 265 || t === 264 || t === 79 } function QDe(e) { let t = e.kind; return t === 265 || t === 264 } function ZDe(e) { let t = e.kind; return t === 79 || t === 264 } function Wj(e) { let t = e.kind; return t === 272 || t === 271 } function Ow(e) { return e.kind === 264 || e.kind === 263 } function $p(e) { switch (e.kind) { case 216: case 223: case 205: case 210: case 176: case 260: case 228: case 172: case 173: case 182: case 177: case 209: case 263: case 302: case 274: case 275: case 278: case 259: case 215: case 181: case 174: case 79: case 270: case 268: case 273: case 178: case 261: case 341: case 343: case 320: case 344: case 351: case 326: case 349: case 325: case 288: case 289: case 290: case 197: case 171: case 170: case 264: case 199: case 277: case 267: case 271: case 211: case 14: case 8: case 207: case 166: case 208: case 299: case 169: case 168: case 175: case 300: case 308: case 301: case 10: case 262: case 184: case 165: case 257: return !0; default: return !1 } } function Qp(e) { switch (e.kind) { case 216: case 238: case 176: case 266: case 295: case 172: case 191: case 173: case 182: case 177: case 245: case 246: case 247: case 259: case 215: case 181: case 174: case 178: case 341: case 343: case 320: case 326: case 349: case 197: case 171: case 170: case 264: case 175: case 308: case 262: return !0; default: return !1 } } function ewe(e) { return e === 216 || e === 205 || e === 260 || e === 228 || e === 172 || e === 173 || e === 263 || e === 302 || e === 278 || e === 259 || e === 215 || e === 174 || e === 270 || e === 268 || e === 273 || e === 261 || e === 288 || e === 171 || e === 170 || e === 264 || e === 267 || e === 271 || e === 277 || e === 166 || e === 299 || e === 169 || e === 168 || e === 175 || e === 300 || e === 262 || e === 165 || e === 257 || e === 349 || e === 341 || e === 351 } function zj(e) { return e === 259 || e === 279 || e === 260 || e === 261 || e === 262 || e === 263 || e === 264 || e === 269 || e === 268 || e === 275 || e === 274 || e === 267 } function Jj(e) { return e === 249 || e === 248 || e === 256 || e === 243 || e === 241 || e === 239 || e === 246 || e === 247 || e === 245 || e === 242 || e === 253 || e === 250 || e === 252 || e === 254 || e === 255 || e === 240 || e === 244 || e === 251 || e === 355 || e === 359 || e === 358 } function Kl(e) { return e.kind === 165 ? e.parent && e.parent.kind !== 348 || Yn(e) : ewe(e.kind) } function bse(e) { return zj(e.kind) } function Nw(e) { return Jj(e.kind) } function ca(e) { let t = e.kind; return Jj(t) || zj(t) || twe(e) } function twe(e) { return e.kind !== 238 || e.parent !== void 0 && (e.parent.kind === 255 || e.parent.kind === 295) ? !1 : !bT(e) } function Ese(e) { let t = e.kind; return Jj(t) || zj(t) || t === 238 } function Tse(e) { let t = e.kind; return t === 280 || t === 163 || t === 79 } function bI(e) { let t = e.kind; return t === 108 || t === 79 || t === 208 } function Pw(e) { let t = e.kind; return t === 281 || t === 291 || t === 282 || t === 11 || t === 285 } function d6(e) { let t = e.kind; return t === 288 || t === 290 } function Sse(e) { let t = e.kind; return t === 10 || t === 291 } function Au(e) { let t = e.kind; return t === 283 || t === 282 } function Kj(e) { let t = e.kind; return t === 292 || t === 293 } function IA(e) { return e.kind >= 312 && e.kind <= 353 } function qj(e) { return e.kind === 323 || e.kind === 322 || e.kind === 324 || iS(e) || EI(e) || LL(e) || X0(e) } function EI(e) { return e.kind >= 330 && e.kind <= 353 } function Ng(e) { return e.kind === 175 } function zy(e) { return e.kind === 174 } function Kd(e) { if (!lR(e)) return !1; let { jsDoc: t } = e; return !!t && t.length > 0 } function f6(e) { return !!e.type } function Jy(e) { return !!e.initializer } function mT(e) { switch (e.kind) { case 257: case 166: case 205: case 169: case 299: case 302: return !0; default: return !1 } } function Xj(e) { return e.kind === 288 || e.kind === 290 || Og(e) } function _6(e) { return e.kind === 180 || e.kind === 230 } function xse(e) { let t = Zj; for (let r of e) { if (!r.length) continue; let i = 0; for (; i < r.length && i < t && xh(r.charCodeAt(i)); i++); if (i < t && (t = i), t === 0) return 0 } return t === Zj ? void 0 : t } function es(e) { return e.kind === 10 || e.kind === 14 } function iS(e) { return e.kind === 327 || e.kind === 328 || e.kind === 329 } function Yj(e) { let t = Os(e.parameters); return !!t && Fm(t) } function Fm(e) { let t = xp(e) ? e.typeExpression && e.typeExpression.type : e.type; return e.dotDotDotToken !== void 0 || !!t && t.kind === 321 } var $j, Qj, Zj, nwe = gt({ "src/compiler/utilitiesPublic.ts"() { "use strict"; fa(), $j = Sw(il(0, 0), 0), Qj = ["cs", "de", "es", "fr", "it", "ja", "ko", "pl", "pt-br", "ru", "tr", "zh-cn", "zh-tw"], Zj = 1073741823 } }); function nc(e, t) { let r = e.declarations; if (r) { for (let i of r) if (i.kind === t) return i } } function Ase(e, t) { return Pr(e.declarations || Je, r => r.kind === t) } function Ua(e) { let t = new Map; if (e) for (let r of e) t.set(r.escapedName, r); return t } function Zp(e) { return (e.flags & 33554432) !== 0 } function rwe() { var e = ""; let t = r => e += r; return { getText: () => e, write: t, rawWrite: t, writeKeyword: t, writeOperator: t, writePunctuation: t, writeSpace: t, writeStringLiteral: t, writeLiteral: t, writeParameter: t, writeProperty: t, writeSymbol: (r, i) => t(r), writeTrailingSemicolon: t, writeComment: t, getTextPos: () => e.length, getLine: () => 0, getColumn: () => 0, getIndent: () => 0, isAtStartOfLine: () => !1, hasTrailingComment: () => !1, hasTrailingWhitespace: () => !!e.length && xh(e.charCodeAt(e.length - 1)), writeLine: () => e += " ", increaseIndent: Ba, decreaseIndent: Ba, clear: () => e = "" } } function eH(e, t) { return e.configFilePath !== t.configFilePath || Cse(e, t) } function Cse(e, t) { return LA(e, t, U3) } function Ise(e, t) { return LA(e, t, GJ) } function LA(e, t, r) { return e !== t && r.some(i => !GW(f4(e, i), f4(t, i))) } function Lse(e, t) { for (; ;) { let r = t(e); if (r === "quit") return; if (r !== void 0) return r; if (Li(e)) return; e = e.parent } } function Ld(e, t) { let r = e.entries(); for (let [i, o] of r) { let s = t(o, i); if (s) return s } } function TI(e, t) { let r = e.keys(); for (let i of r) { let o = t(i); if (o) return o } } function Mw(e, t) { e.forEach((r, i) => { t.set(i, r) }) } function SI(e) { let t = uL.getText(); try { return e(uL), uL.getText() } finally { uL.clear(), uL.writeKeyword(t) } } function Fw(e) { return e.end - e.pos } function kA(e, t, r) { var i, o; return (o = (i = e?.resolvedModules) == null ? void 0 : i.get(t, r)) == null ? void 0 : o.resolvedModule } function kse(e, t, r, i) { e.resolvedModules || (e.resolvedModules = WT()), e.resolvedModules.set(t, i, r) } function Dse(e, t, r, i) { e.resolvedTypeReferenceDirectiveNames || (e.resolvedTypeReferenceDirectiveNames = WT()), e.resolvedTypeReferenceDirectiveNames.set(t, i, r) } function iwe(e, t, r) { var i, o; return (o = (i = e?.resolvedTypeReferenceDirectiveNames) == null ? void 0 : i.get(t, r)) == null ? void 0 : o.resolvedTypeReferenceDirective } function tH(e, t) { return e.path === t.path && !e.prepend == !t.prepend && !e.circular == !t.circular } function wse(e, t) { return e === t || e.resolvedModule === t.resolvedModule || !!e.resolvedModule && !!t.resolvedModule && e.resolvedModule.isExternalLibraryImport === t.resolvedModule.isExternalLibraryImport && e.resolvedModule.extension === t.resolvedModule.extension && e.resolvedModule.resolvedFileName === t.resolvedModule.resolvedFileName && e.resolvedModule.originalPath === t.resolvedModule.originalPath && awe(e.resolvedModule.packageId, t.resolvedModule.packageId) } function awe(e, t) { return e === t || !!e && !!t && e.name === t.name && e.subModuleName === t.subModuleName && e.version === t.version } function p6({ name: e, subModuleName: t }) { return t ? `${e}/${t}` : e } function hT(e) { return `${p6(e)}@${e.version}` } function Rse(e, t) { return e === t || e.resolvedTypeReferenceDirective === t.resolvedTypeReferenceDirective || !!e.resolvedTypeReferenceDirective && !!t.resolvedTypeReferenceDirective && e.resolvedTypeReferenceDirective.resolvedFileName === t.resolvedTypeReferenceDirective.resolvedFileName && !!e.resolvedTypeReferenceDirective.primary == !!t.resolvedTypeReferenceDirective.primary && e.resolvedTypeReferenceDirective.originalPath === t.resolvedTypeReferenceDirective.originalPath } function nH(e, t, r, i, o, s) { L.assert(e.length === r.length); for (let l = 0; l < e.length; l++) { let f = r[l], d = e[l], g = s.getName(d), m = s.getMode(d, t), v = i && i.get(g, m); if (v ? !f || !o(v, f) : f) return !0 } return !1 } function Gw(e) { return owe(e), (e.flags & 524288) !== 0 } function owe(e) { e.flags & 1048576 || ((e.flags & 131072 || pa(e, Gw)) && (e.flags |= 524288), e.flags |= 1048576) } function Gn(e) { for (; e && e.kind !== 308;)e = e.parent; return e } function m6(e) { return Gn(e.valueDeclaration || dH(e)) } function h6(e, t) { return !!e && (e.scriptKind === 1 || e.scriptKind === 2) && !e.checkJsDirective && t === void 0 } function Ose(e) { switch (e.kind) { case 238: case 266: case 245: case 246: case 247: return !0 }return !1 } function Ky(e, t) { return L.assert(e >= 0), Sh(t)[e] } function swe(e) { let t = Gn(e), r = Gs(t, e.pos); return `${t.fileName}(${r.line + 1},${r.character + 1})` } function Bw(e, t) { L.assert(e >= 0); let r = Sh(t), i = e, o = t.text; if (i + 1 === r.length) return o.length - 1; { let s = r[i], l = r[i + 1] - 1; for (L.assert(Wl(o.charCodeAt(l))); s <= l && Wl(o.charCodeAt(l));)l--; return l } } function g6(e, t, r) { return !(r && r(t)) && !e.identifiers.has(t) } function rc(e) { return e === void 0 ? !0 : e.pos === e.end && e.pos >= 0 && e.kind !== 1 } function Pf(e) { return !rc(e) } function Nse(e, t) { return _c(e) ? t === e.expression : oc(e) ? t === e.modifiers : $d(e) ? t === e.initializer : Na(e) ? t === e.questionToken && Id(e) : yl(e) ? t === e.modifiers || t === e.questionToken || t === e.exclamationToken || xI(e.modifiers, t, Ns) : xf(e) ? t === e.equalsToken || t === e.modifiers || t === e.questionToken || t === e.exclamationToken || xI(e.modifiers, t, Ns) : Nc(e) ? t === e.exclamationToken : Ec(e) ? t === e.typeParameters || t === e.type || xI(e.typeParameters, t, _c) : p_(e) ? t === e.typeParameters || xI(e.typeParameters, t, _c) : Sf(e) ? t === e.typeParameters || t === e.type || xI(e.typeParameters, t, _c) : gO(e) ? t === e.modifiers || xI(e.modifiers, t, Ns) : !1 } function xI(e, t, r) { return !e || ba(t) || !r(t) ? !1 : ya(e, t) } function Pse(e, t, r) { if (t === void 0 || t.length === 0) return e; let i = 0; for (; i < e.length && r(e[i]); ++i); return e.splice(i, 0, ...t), e } function Mse(e, t, r) { if (t === void 0) return e; let i = 0; for (; i < e.length && r(e[i]); ++i); return e.splice(i, 0, t), e } function Fse(e) { return B_(e) || !!(Ya(e) & 2097152) } function em(e, t) { return Pse(e, t, B_) } function rH(e, t) { return Pse(e, t, Fse) } function cwe(e, t) { return Mse(e, t, B_) } function L0(e, t) { return Mse(e, t, Fse) } function iH(e, t, r) { if (e.charCodeAt(t + 1) === 47 && t + 2 < r && e.charCodeAt(t + 2) === 47) { let i = e.substring(t, r); return !!(qW.test(i) || XW.test(i) || Wle.test(i) || zle.test(i)) } return !1 } function y6(e, t) { return e.charCodeAt(t + 1) === 42 && e.charCodeAt(t + 2) === 33 } function Gse(e, t) { let r = new Map(t.map(l => [`${Gs(e, l.range.end).line}`, l])), i = new Map; return { getUnusedExpectations: o, markUsed: s }; function o() { return lo(r.entries()).filter(([l, f]) => f.type === 0 && !i.get(l)).map(([l, f]) => f) } function s(l) { return r.has(`${l}`) ? (i.set(`${l}`, !0), !0) : !1 } } function gT(e, t, r) { return rc(e) ? e.pos : IA(e) || e.kind === 11 ? xo((t || Gn(e)).text, e.pos, !1, !0) : r && Kd(e) ? gT(e.jsDoc[0], t) : e.kind === 354 && e._children.length > 0 ? gT(e._children[0], t, r) : xo((t || Gn(e)).text, e.pos, !1, !1, qw(e)) } function aH(e, t) { let r = !rc(e) && g_(e) ? dA(e.modifiers, du) : void 0; return r ? xo((t || Gn(e)).text, r.end) : gT(e, t) } function k0(e, t, r = !1) { return AI(e.text, t, r) } function lwe(e) { return !!jn(e, UT) } function v6(e) { return !!(Il(e) && e.exportClause && qm(e.exportClause) && e.exportClause.name.escapedText === "default") } function AI(e, t, r = !1) {
+                if (rc(t)) return ""; let i = e.substring(r ? t.pos : xo(e, t.pos), t.end); return lwe(t) && (i = i.split(/\r\n|\n|\r/).map(o => ZC(o.replace(/^\s*\*/, ""))).join(`
+`)), i
+            } function Qc(e, t = !1) { return k0(Gn(e), e, t) } function uwe(e) { return e.pos } function DA(e, t) { return Py(e, t, uwe, Es) } function Ya(e) { let t = e.emitNode; return t && t.flags || 0 } function o_(e) { let t = e.emitNode; return t && t.internalFlags || 0 } function oH() { return new Map(Object.entries({ Array: new Map(Object.entries({ es2015: ["find", "findIndex", "fill", "copyWithin", "entries", "keys", "values"], es2016: ["includes"], es2019: ["flat", "flatMap"], es2022: ["at"], es2023: ["findLastIndex", "findLast"] })), Iterator: new Map(Object.entries({ es2015: Je })), AsyncIterator: new Map(Object.entries({ es2015: Je })), Atomics: new Map(Object.entries({ es2017: Je })), SharedArrayBuffer: new Map(Object.entries({ es2017: Je })), AsyncIterable: new Map(Object.entries({ es2018: Je })), AsyncIterableIterator: new Map(Object.entries({ es2018: Je })), AsyncGenerator: new Map(Object.entries({ es2018: Je })), AsyncGeneratorFunction: new Map(Object.entries({ es2018: Je })), RegExp: new Map(Object.entries({ es2015: ["flags", "sticky", "unicode"], es2018: ["dotAll"] })), Reflect: new Map(Object.entries({ es2015: ["apply", "construct", "defineProperty", "deleteProperty", "get", " getOwnPropertyDescriptor", "getPrototypeOf", "has", "isExtensible", "ownKeys", "preventExtensions", "set", "setPrototypeOf"] })), ArrayConstructor: new Map(Object.entries({ es2015: ["from", "of"] })), ObjectConstructor: new Map(Object.entries({ es2015: ["assign", "getOwnPropertySymbols", "keys", "is", "setPrototypeOf"], es2017: ["values", "entries", "getOwnPropertyDescriptors"], es2019: ["fromEntries"], es2022: ["hasOwn"] })), NumberConstructor: new Map(Object.entries({ es2015: ["isFinite", "isInteger", "isNaN", "isSafeInteger", "parseFloat", "parseInt"] })), Math: new Map(Object.entries({ es2015: ["clz32", "imul", "sign", "log10", "log2", "log1p", "expm1", "cosh", "sinh", "tanh", "acosh", "asinh", "atanh", "hypot", "trunc", "fround", "cbrt"] })), Map: new Map(Object.entries({ es2015: ["entries", "keys", "values"] })), Set: new Map(Object.entries({ es2015: ["entries", "keys", "values"] })), PromiseConstructor: new Map(Object.entries({ es2015: ["all", "race", "reject", "resolve"], es2020: ["allSettled"], es2021: ["any"] })), Symbol: new Map(Object.entries({ es2015: ["for", "keyFor"], es2019: ["description"] })), WeakMap: new Map(Object.entries({ es2015: ["entries", "keys", "values"] })), WeakSet: new Map(Object.entries({ es2015: ["entries", "keys", "values"] })), String: new Map(Object.entries({ es2015: ["codePointAt", "includes", "endsWith", "normalize", "repeat", "startsWith", "anchor", "big", "blink", "bold", "fixed", "fontcolor", "fontsize", "italics", "link", "small", "strike", "sub", "sup"], es2017: ["padStart", "padEnd"], es2019: ["trimStart", "trimEnd", "trimLeft", "trimRight"], es2020: ["matchAll"], es2021: ["replaceAll"], es2022: ["at"] })), StringConstructor: new Map(Object.entries({ es2015: ["fromCodePoint", "raw"] })), DateTimeFormat: new Map(Object.entries({ es2017: ["formatToParts"] })), Promise: new Map(Object.entries({ es2015: Je, es2018: ["finally"] })), RegExpMatchArray: new Map(Object.entries({ es2018: ["groups"] })), RegExpExecArray: new Map(Object.entries({ es2018: ["groups"] })), Intl: new Map(Object.entries({ es2018: ["PluralRules"] })), NumberFormat: new Map(Object.entries({ es2018: ["formatToParts"] })), SymbolConstructor: new Map(Object.entries({ es2020: ["matchAll"] })), DataView: new Map(Object.entries({ es2020: ["setBigInt64", "setBigUint64", "getBigInt64", "getBigUint64"] })), BigInt: new Map(Object.entries({ es2020: Je })), RelativeTimeFormat: new Map(Object.entries({ es2020: ["format", "formatToParts", "resolvedOptions"] })), Int8Array: new Map(Object.entries({ es2022: ["at"], es2023: ["findLastIndex", "findLast"] })), Uint8Array: new Map(Object.entries({ es2022: ["at"], es2023: ["findLastIndex", "findLast"] })), Uint8ClampedArray: new Map(Object.entries({ es2022: ["at"], es2023: ["findLastIndex", "findLast"] })), Int16Array: new Map(Object.entries({ es2022: ["at"], es2023: ["findLastIndex", "findLast"] })), Uint16Array: new Map(Object.entries({ es2022: ["at"], es2023: ["findLastIndex", "findLast"] })), Int32Array: new Map(Object.entries({ es2022: ["at"], es2023: ["findLastIndex", "findLast"] })), Uint32Array: new Map(Object.entries({ es2022: ["at"], es2023: ["findLastIndex", "findLast"] })), Float32Array: new Map(Object.entries({ es2022: ["at"], es2023: ["findLastIndex", "findLast"] })), Float64Array: new Map(Object.entries({ es2022: ["at"], es2023: ["findLastIndex", "findLast"] })), BigInt64Array: new Map(Object.entries({ es2020: Je, es2022: ["at"], es2023: ["findLastIndex", "findLast"] })), BigUint64Array: new Map(Object.entries({ es2020: Je, es2022: ["at"], es2023: ["findLastIndex", "findLast"] })), Error: new Map(Object.entries({ es2022: ["cause"] })) })) } function Bse(e, t, r) { var i; if (t && dwe(e, r)) return k0(t, e); switch (e.kind) { case 10: { let o = r & 2 ? qH : r & 1 || Ya(e) & 33554432 ? _S : ER; return e.singleQuote ? "'" + o(e.text, 39) + "'" : '"' + o(e.text, 34) + '"' } case 14: case 15: case 16: case 17: { let o = r & 1 || Ya(e) & 33554432 ? _S : ER, s = (i = e.rawText) != null ? i : Rwe(o(e.text, 96)); switch (e.kind) { case 14: return "`" + s + "`"; case 15: return "`" + s + "${"; case 16: return "}" + s + "${"; case 17: return "}" + s + "`" }break } case 8: case 9: return e.text; case 13: return r & 4 && e.isUnterminated ? e.text + (e.text.charCodeAt(e.text.length - 1) === 92 ? " /" : "/") : e.text }return L.fail(`Literal kind '${e.kind}' not accounted for.`) } function dwe(e, t) { return ws(e) || !e.parent || t & 4 && e.isUnterminated ? !1 : Vf(e) && e.numericLiteralFlags & 512 ? !!(t & 8) : !a3(e) } function Use(e) { return Ta(e) ? '"' + ER(e) + '"' : "" + e } function Vse(e) { return Hl(e).replace(/^(\d)/, "_$1").replace(/\W/g, "_") } function sH(e) { return (G_(e) & 3) !== 0 || cH(e) } function cH(e) { let t = nm(e); return t.kind === 257 && t.parent.kind === 295 } function lu(e) { return Tc(e) && (e.name.kind === 10 || mp(e)) } function b6(e) { return Tc(e) && e.name.kind === 10 } function lH(e) { return Tc(e) && yo(e.name) } function jse(e) { return Tc(e) || Re(e) } function CI(e) { return fwe(e.valueDeclaration) } function fwe(e) { return !!e && e.kind === 264 && !e.body } function Hse(e) { return e.kind === 308 || e.kind === 264 || SA(e) } function mp(e) { return !!(e.flags & 1024) } function D0(e) { return lu(e) && uH(e) } function uH(e) { switch (e.parent.kind) { case 308: return Lc(e.parent); case 265: return lu(e.parent.parent) && Li(e.parent.parent.parent) && !Lc(e.parent.parent.parent) }return !1 } function dH(e) { var t; return (t = e.declarations) == null ? void 0 : t.find(r => !D0(r) && !(Tc(r) && mp(r))) } function _we(e) { return e === 1 || e === 100 || e === 199 } function aS(e, t) { return Lc(e) || d_(t) || _we(Rl(t)) && !!e.commonJsModuleIndicator } function fH(e, t) { switch (e.scriptKind) { case 1: case 3: case 2: case 4: break; default: return !1 }return e.isDeclarationFile ? !1 : Uf(t, "alwaysStrict") || nde(e.statements) ? !0 : Lc(e) || d_(t) ? Rl(t) >= 5 ? !0 : !t.noImplicitUseStrict : !1 } function _H(e) { return !!(e.flags & 16777216) || Mr(e, 2) } function pH(e, t) { switch (e.kind) { case 308: case 266: case 295: case 264: case 245: case 246: case 247: case 173: case 171: case 174: case 175: case 259: case 215: case 216: case 169: case 172: return !0; case 238: return !SA(t) }return !1 } function mH(e) { switch (L.type(e), e.kind) { case 341: case 349: case 326: return !0; default: return hH(e) } } function hH(e) { switch (L.type(e), e.kind) { case 176: case 177: case 170: case 178: case 181: case 182: case 320: case 260: case 228: case 261: case 262: case 348: case 259: case 171: case 173: case 174: case 175: case 215: case 216: return !0; default: return !1 } } function yT(e) { switch (e.kind) { case 269: case 268: return !0; default: return !1 } } function Wse(e) { return yT(e) || N0(e) } function E6(e) { switch (e.kind) { case 269: case 268: case 240: case 260: case 259: case 264: case 262: case 261: case 263: return !0; default: return !1 } } function zse(e) { return Uw(e) || Tc(e) || Mh(e) || Dd(e) } function Uw(e) { return yT(e) || Il(e) } function tm(e) { return jn(e.parent, t => pH(t, t.parent)) } function Jse(e, t) { let r = tm(e); for (; r;)t(r), r = tm(r) } function os(e) { return !e || Fw(e) === 0 ? "(Missing)" : Qc(e) } function Kse(e) { return e.declaration ? os(e.declaration.parameters[0].name) : void 0 } function Vw(e) { return e.kind === 164 && !yf(e.expression) } function T6(e) { var t; switch (e.kind) { case 79: case 80: return (t = e.emitNode) != null && t.autoGenerate ? void 0 : e.escapedText; case 10: case 8: case 14: return Bs(e.text); case 164: return yf(e.expression) ? Bs(e.expression.text) : void 0; default: return L.assertNever(e) } } function wA(e) { return L.checkDefined(T6(e)) } function qd(e) { switch (e.kind) { case 108: return "this"; case 80: case 79: return Fw(e) === 0 ? vr(e) : Qc(e); case 163: return qd(e.left) + "." + qd(e.right); case 208: return Re(e.name) || pi(e.name) ? qd(e.expression) + "." + qd(e.name) : L.assertNever(e.name); case 314: return qd(e.left) + qd(e.right); default: return L.assertNever(e) } } function hr(e, t, r, i, o, s) { let l = Gn(e); return Nu(l, e, t, r, i, o, s) } function RA(e, t, r, i, o, s, l) { let f = xo(e.text, t.pos); return al(e, f, t.end - f, r, i, o, s, l) } function Nu(e, t, r, i, o, s, l) { let f = w0(e, t); return al(e, f.start, f.length, r, i, o, s, l) } function Lh(e, t, r, i) { let o = w0(e, t); return S6(e, o.start, o.length, r, i) } function jw(e, t, r, i) { let o = xo(e.text, t.pos); return S6(e, o, t.end - o, r, i) } function gH(e, t, r) { L.assertGreaterThanOrEqual(t, 0), L.assertGreaterThanOrEqual(r, 0), e && (L.assertLessThanOrEqual(t, e.text.length), L.assertLessThanOrEqual(t + r, e.text.length)) } function S6(e, t, r, i, o) { return gH(e, t, r), { file: e, start: t, length: r, code: i.code, category: i.category, messageText: i.next ? i : i.messageText, relatedInformation: o } } function yH(e, t, r) { return { file: e, start: 0, length: 0, code: t.code, category: t.category, messageText: t.next ? t : t.messageText, relatedInformation: r } } function qse(e) { return typeof e.messageText == "string" ? { code: e.code, category: e.category, messageText: e.messageText, next: e.next } : e.messageText } function vH(e, t, r) { return { file: e, start: t.pos, length: t.end - t.pos, code: r.code, category: r.category, messageText: r.message } } function Pg(e, t) { let r = kg(e.languageVersion, !0, e.languageVariant, e.text, void 0, t); r.scan(); let i = r.getTokenPos(); return Wc(i, r.getTextPos()) } function Xse(e, t) { let r = kg(e.languageVersion, !0, e.languageVariant, e.text, void 0, t); return r.scan(), r.getToken() } function pwe(e, t) { let r = xo(e.text, t.pos); if (t.body && t.body.kind === 238) { let { line: i } = Gs(e, t.body.pos), { line: o } = Gs(e, t.body.end); if (i < o) return il(r, Bw(i, e) - r + 1) } return Wc(r, t.end) } function w0(e, t) { let r = t; switch (t.kind) { case 308: let s = xo(e.text, 0, !1); return s === e.text.length ? il(0, 0) : Pg(e, s); case 257: case 205: case 260: case 228: case 261: case 264: case 263: case 302: case 259: case 215: case 171: case 174: case 175: case 262: case 169: case 168: case 271: r = t.name; break; case 216: return pwe(e, t); case 292: case 293: let l = xo(e.text, t.pos), f = t.statements.length > 0 ? t.statements[0].pos : t.end; return Wc(l, f) }if (r === void 0) return Pg(e, t.pos); L.assert(!dm(r)); let i = rc(r), o = i || CS(t) ? r.pos : xo(e.text, r.pos); return i ? (L.assert(o === r.pos, "This failure could trigger https://github.com/Microsoft/TypeScript/issues/20809"), L.assert(o === r.end, "This failure could trigger https://github.com/Microsoft/TypeScript/issues/20809")) : (L.assert(o >= r.pos, "This failure could trigger https://github.com/Microsoft/TypeScript/issues/20809"), L.assert(o <= r.end, "This failure could trigger https://github.com/Microsoft/TypeScript/issues/20809")), Wc(o, r.end) } function kd(e) { return (e.externalModuleIndicator || e.commonJsModuleIndicator) !== void 0 } function Mf(e) { return e.scriptKind === 6 } function R0(e) { return !!(wg(e) & 2048) } function x6(e) { return !!(wg(e) & 64 && !Ad(e, e.parent)) } function kh(e) { return !!(G_(e) & 2) } function II(e) { return !!(G_(e) & 1) } function OA(e) { return e.kind === 210 && e.expression.kind === 106 } function Dd(e) { return e.kind === 210 && e.expression.kind === 100 } function NA(e) { return TL(e) && e.keywordToken === 100 && e.name.escapedText === "meta" } function ib(e) { return Mh(e) && mb(e.argument) && yo(e.argument.literal) } function B_(e) { return e.kind === 241 && e.expression.kind === 10 } function A6(e) { return !!(Ya(e) & 2097152) } function C6(e) { return A6(e) && Jc(e) } function mwe(e) { return Re(e.name) && !e.initializer } function I6(e) { return A6(e) && Bc(e) && Ji(e.declarationList.declarations, mwe) } function bH(e, t) { return e.kind !== 11 ? Nm(t.text, e.pos) : void 0 } function EH(e, t) { let r = e.kind === 166 || e.kind === 165 || e.kind === 215 || e.kind === 216 || e.kind === 214 || e.kind === 257 || e.kind === 278 ? Qi(eb(t, e.pos), Nm(t, e.pos)) : Nm(t, e.pos); return Pr(r, i => t.charCodeAt(i.pos + 1) === 42 && t.charCodeAt(i.pos + 2) === 42 && t.charCodeAt(i.pos + 3) !== 47) } function Gm(e) { if (179 <= e.kind && e.kind <= 202) return !0; switch (e.kind) { case 131: case 157: case 148: case 160: case 152: case 134: case 153: case 149: case 155: case 144: return !0; case 114: return e.parent.kind !== 219; case 230: return dd(e.parent) && !IR(e); case 165: return e.parent.kind === 197 || e.parent.kind === 192; case 79: (e.parent.kind === 163 && e.parent.right === e || e.parent.kind === 208 && e.parent.name === e) && (e = e.parent), L.assert(e.kind === 79 || e.kind === 163 || e.kind === 208, "'node' was expected to be a qualified name, identifier or property access in 'isPartOfTypeNode'."); case 163: case 208: case 108: { let { parent: t } = e; if (t.kind === 183) return !1; if (t.kind === 202) return !t.isTypeOf; if (179 <= t.kind && t.kind <= 202) return !0; switch (t.kind) { case 230: return dd(t.parent) && !IR(t); case 165: return e === t.constraint; case 348: return e === t.constraint; case 169: case 168: case 166: case 257: return e === t.type; case 259: case 215: case 216: case 173: case 171: case 170: case 174: case 175: return e === t.type; case 176: case 177: case 178: return e === t.type; case 213: return e === t.type; case 210: case 211: return ya(t.typeArguments, e); case 212: return !1 } } }return !1 } function TH(e, t) { for (; e;) { if (e.kind === t) return !0; e = e.parent } return !1 } function vT(e, t) { return r(e); function r(i) { switch (i.kind) { case 250: return t(i); case 266: case 238: case 242: case 243: case 244: case 245: case 246: case 247: case 251: case 252: case 292: case 293: case 253: case 255: case 295: return pa(i, r) } } } function Yse(e, t) { return r(e); function r(i) { switch (i.kind) { case 226: t(i); let o = i.expression; o && r(o); return; case 263: case 261: case 264: case 262: return; default: if (Ia(i)) { if (i.name && i.name.kind === 164) { r(i.name.expression); return } } else Gm(i) || pa(i, r) } } } function SH(e) { return e && e.kind === 185 ? e.elementType : e && e.kind === 180 ? Wp(e.typeArguments) : void 0 } function $se(e) { switch (e.kind) { case 261: case 260: case 228: case 184: return e.members; case 207: return e.properties } } function PA(e) { if (e) switch (e.kind) { case 205: case 302: case 166: case 299: case 169: case 168: case 300: case 257: return !0 }return !1 } function Qse(e) { return PA(e) || rb(e) } function L6(e) { return e.parent.kind === 258 && e.parent.parent.kind === 240 } function Zse(e) { return Yn(e) ? rs(e.parent) && ar(e.parent.parent) && ic(e.parent.parent) === 2 || k6(e.parent) : !1 } function k6(e) { return Yn(e) ? ar(e) && ic(e) === 1 : !1 } function ece(e) { return (wi(e) ? kh(e) && Re(e.name) && L6(e) : Na(e) ? jI(e) && zc(e) : $d(e) && jI(e)) || k6(e) } function tce(e) { switch (e.kind) { case 171: case 170: case 173: case 174: case 175: case 259: case 215: return !0 }return !1 } function xH(e, t) { for (; ;) { if (t && t(e), e.statement.kind !== 253) return e.statement; e = e.statement } } function bT(e) { return e && e.kind === 238 && Ia(e.parent) } function s_(e) { return e && e.kind === 171 && e.parent.kind === 207 } function D6(e) { return (e.kind === 171 || e.kind === 174 || e.kind === 175) && (e.parent.kind === 207 || e.parent.kind === 228) } function nce(e) { return e && e.kind === 1 } function hwe(e) { return e && e.kind === 0 } function MA(e, t, r) { return e.properties.filter(i => { if (i.kind === 299) { let o = T6(i.name); return t === o || !!r && r === o } return !1 }) } function rce(e, t, r) { return ks(MA(e, t), i => fu(i.initializer) ? wr(i.initializer.elements, o => yo(o) && o.text === r) : void 0) } function LI(e) { if (e && e.statements.length) { let t = e.statements[0].expression; return zr(t, rs) } } function w6(e, t, r) { return ks(Hw(e, t), i => fu(i.initializer) ? wr(i.initializer.elements, o => yo(o) && o.text === r) : void 0) } function Hw(e, t) { let r = LI(e); return r ? MA(r, t) : Je } function Xd(e) { return jn(e.parent, Ia) } function ice(e) { return jn(e.parent, Ds) } function Zc(e) { return jn(e.parent, Yr) } function gwe(e) { return jn(e.parent, t => Yr(t) || Ia(t) ? "quit" : oc(t)) } function R6(e) { return jn(e.parent, SA) } function Ku(e, t, r) { for (L.assert(e.kind !== 308); ;) { if (e = e.parent, !e) return L.fail(); switch (e.kind) { case 164: if (r && Yr(e.parent.parent)) return e; e = e.parent.parent; break; case 167: e.parent.kind === 166 && _l(e.parent.parent) ? e = e.parent.parent : _l(e.parent) && (e = e.parent); break; case 216: if (!t) continue; case 259: case 215: case 264: case 172: case 169: case 168: case 171: case 170: case 173: case 174: case 175: case 176: case 177: case 178: case 263: case 308: return e } } } function ace(e) { switch (e.kind) { case 216: case 259: case 215: case 169: return !0; case 238: switch (e.parent.kind) { case 173: case 171: case 174: case 175: return !0; default: return !1 }default: return !1 } } function O6(e) { Re(e) && (sl(e.parent) || Jc(e.parent)) && e.parent.name === e && (e = e.parent); let t = Ku(e, !0, !1); return Li(t) } function oce(e) { let t = Ku(e, !1, !1); if (t) switch (t.kind) { case 173: case 259: case 215: return t } } function Ww(e, t) { for (; ;) { if (e = e.parent, !e) return; switch (e.kind) { case 164: e = e.parent; break; case 259: case 215: case 216: if (!t) continue; case 169: case 168: case 171: case 170: case 173: case 174: case 175: case 172: return e; case 167: e.parent.kind === 166 && _l(e.parent.parent) ? e = e.parent.parent : _l(e.parent) && (e = e.parent); break } } } function ET(e) { if (e.kind === 215 || e.kind === 216) { let t = e, r = e.parent; for (; r.kind === 214;)t = r, r = r.parent; if (r.kind === 210 && r.expression === t) return r } } function ywe(e) { return e.kind === 106 || Pu(e) } function Pu(e) { let t = e.kind; return (t === 208 || t === 209) && e.expression.kind === 106 } function zw(e) { let t = e.kind; return (t === 208 || t === 209) && e.expression.kind === 108 } function N6(e) { var t; return !!e && wi(e) && ((t = e.initializer) == null ? void 0 : t.kind) === 108 } function sce(e) { return !!e && (xf(e) || yl(e)) && ar(e.parent.parent) && e.parent.parent.operatorToken.kind === 63 && e.parent.parent.right.kind === 108 } function Jw(e) { switch (e.kind) { case 180: return e.typeName; case 230: return bc(e.expression) ? e.expression : void 0; case 79: case 163: return e } } function P6(e) { switch (e.kind) { case 212: return e.tag; case 283: case 282: return e.tagName; default: return e.expression } } function M6(e, t, r, i) { if (e && zl(t) && pi(t.name)) return !1; switch (t.kind) { case 260: return !0; case 228: return !e; case 169: return r !== void 0 && (e ? sl(r) : Yr(r) && !B0(t) && !aW(t)); case 174: case 175: case 171: return t.body !== void 0 && r !== void 0 && (e ? sl(r) : Yr(r)); case 166: return e ? r !== void 0 && r.body !== void 0 && (r.kind === 173 || r.kind === 171 || r.kind === 175) && F0(r) !== t && i !== void 0 && i.kind === 260 : !1 }return !1 } function FA(e, t, r, i) { return bf(t) && M6(e, t, r, i) } function Kw(e, t, r, i) { return FA(e, t, r, i) || kI(e, t, r) } function kI(e, t, r) { switch (t.kind) { case 260: return vt(t.members, i => Kw(e, i, t, r)); case 228: return !e && vt(t.members, i => Kw(e, i, t, r)); case 171: case 175: case 173: return vt(t.parameters, i => FA(e, i, t, r)); default: return !1 } } function O0(e, t) { if (FA(e, t)) return !0; let r = Vm(t); return !!r && kI(e, r, t) } function AH(e, t, r) { let i; if (rb(t)) { let { firstAccessor: o, secondAccessor: s, setAccessor: l } = kT(r.members, t), f = bf(o) ? o : s && bf(s) ? s : void 0; if (!f || t !== f) return !1; i = l?.parameters } else Nc(t) && (i = t.parameters); if (FA(e, t, r)) return !0; if (i) { for (let o of i) if (!G0(o) && FA(e, o, t, r)) return !0 } return !1 } function CH(e) { if (e.textSourceNode) { switch (e.textSourceNode.kind) { case 10: return CH(e.textSourceNode); case 14: return e.text === "" }return !1 } return e.text === "" } function DI(e) { let { parent: t } = e; return t.kind === 283 || t.kind === 282 || t.kind === 284 ? t.tagName === e : !1 } function Dh(e) { switch (e.kind) { case 106: case 104: case 110: case 95: case 13: case 206: case 207: case 208: case 209: case 210: case 211: case 212: case 231: case 213: case 235: case 232: case 214: case 215: case 228: case 216: case 219: case 217: case 218: case 221: case 222: case 223: case 224: case 227: case 225: case 229: case 281: case 282: case 285: case 226: case 220: case 233: return !0; case 230: return !dd(e.parent) && !x2(e.parent); case 163: for (; e.parent.kind === 163;)e = e.parent; return e.parent.kind === 183 || iS(e.parent) || IL(e.parent) || gb(e.parent) || DI(e); case 314: for (; gb(e.parent);)e = e.parent; return e.parent.kind === 183 || iS(e.parent) || IL(e.parent) || gb(e.parent) || DI(e); case 80: return ar(e.parent) && e.parent.left === e && e.parent.operatorToken.kind === 101; case 79: if (e.parent.kind === 183 || iS(e.parent) || IL(e.parent) || gb(e.parent) || DI(e)) return !0; case 8: case 9: case 10: case 14: case 108: return F6(e); default: return !1 } } function F6(e) { let { parent: t } = e; switch (t.kind) { case 257: case 166: case 169: case 168: case 302: case 299: case 205: return t.initializer === e; case 241: case 242: case 243: case 244: case 250: case 251: case 252: case 292: case 254: return t.expression === e; case 245: let r = t; return r.initializer === e && r.initializer.kind !== 258 || r.condition === e || r.incrementor === e; case 246: case 247: let i = t; return i.initializer === e && i.initializer.kind !== 258 || i.expression === e; case 213: case 231: return e === t.expression; case 236: return e === t.expression; case 164: return e === t.expression; case 167: case 291: case 290: case 301: return !0; case 230: return t.expression === e && !Gm(t); case 300: return t.objectAssignmentInitializer === e; case 235: return e === t.expression; default: return Dh(t) } } function G6(e) { for (; e.kind === 163 || e.kind === 79;)e = e.parent; return e.kind === 183 } function cce(e) { return qm(e) && !!e.parent.moduleSpecifier } function ab(e) { return e.kind === 268 && e.moduleReference.kind === 280 } function wI(e) { return L.assert(ab(e)), e.moduleReference.expression } function IH(e) { return N0(e) && $I(e.initializer).arguments[0] } function GA(e) { return e.kind === 268 && e.moduleReference.kind !== 280 } function Cu(e) { return Yn(e) } function vwe(e) { return !Yn(e) } function Yn(e) { return !!e && !!(e.flags & 262144) } function B6(e) { return !!e && !!(e.flags & 67108864) } function LH(e) { return !Mf(e) } function qw(e) { return !!e && !!(e.flags & 8388608) } function U6(e) { return m_(e) && Re(e.typeName) && e.typeName.escapedText === "Object" && e.typeArguments && e.typeArguments.length === 2 && (e.typeArguments[0].kind === 152 || e.typeArguments[0].kind === 148) } function qu(e, t) { if (e.kind !== 210) return !1; let { expression: r, arguments: i } = e; if (r.kind !== 79 || r.escapedText !== "require" || i.length !== 1) return !1; let o = i[0]; return !t || es(o) } function kH(e) { return uce(e, !1) } function N0(e) { return uce(e, !0) } function lce(e) { return Wo(e) && N0(e.parent.parent) } function uce(e, t) { return wi(e) && !!e.initializer && qu(t ? $I(e.initializer) : e.initializer, !0) } function DH(e) { return Bc(e) && e.declarationList.declarations.length > 0 && Ji(e.declarationList.declarations, t => kH(t)) } function Xw(e) { return e === 39 || e === 34 } function V6(e, t) { return k0(t, e).charCodeAt(0) === 34 } function RI(e) { return ar(e) || Us(e) || Re(e) || Pa(e) } function Yw(e) { return Yn(e) && e.initializer && ar(e.initializer) && (e.initializer.operatorToken.kind === 56 || e.initializer.operatorToken.kind === 60) && e.name && bc(e.name) && BA(e.name, e.initializer.left) ? e.initializer.right : e.initializer } function $w(e) { let t = Yw(e); return t && ob(t, ub(e.name)) } function bwe(e, t) { return mn(e.properties, r => yl(r) && Re(r.name) && r.name.escapedText === "value" && r.initializer && ob(r.initializer, t)) } function oS(e) { if (e && e.parent && ar(e.parent) && e.parent.operatorToken.kind === 63) { let t = ub(e.parent.left); return ob(e.parent.right, t) || Ewe(e.parent.left, e.parent.right, t) } if (e && Pa(e) && sS(e)) { let t = bwe(e.arguments[2], e.arguments[1].text === "prototype"); if (t) return t } } function ob(e, t) { if (Pa(e)) { let r = vs(e.expression); return r.kind === 215 || r.kind === 216 ? e : void 0 } if (e.kind === 215 || e.kind === 228 || e.kind === 216 || rs(e) && (e.properties.length === 0 || t)) return e } function Ewe(e, t, r) { let i = ar(t) && (t.operatorToken.kind === 56 || t.operatorToken.kind === 60) && ob(t.right, r); if (i && BA(e, t.left)) return i } function dce(e) { let t = wi(e.parent) ? e.parent.name : ar(e.parent) && e.parent.operatorToken.kind === 63 ? e.parent.left : void 0; return t && ob(e.right, ub(t)) && bc(t) && BA(t, e.left) } function wH(e) { if (ar(e.parent)) { let t = (e.parent.operatorToken.kind === 56 || e.parent.operatorToken.kind === 60) && ar(e.parent.parent) ? e.parent.parent : e.parent; if (t.operatorToken.kind === 63 && Re(t.left)) return t.left } else if (wi(e.parent)) return e.parent.name } function BA(e, t) { return c_(e) && c_(t) ? l_(e) === l_(t) : Ah(e) && j6(t) && (t.expression.kind === 108 || Re(t.expression) && (t.expression.escapedText === "window" || t.expression.escapedText === "self" || t.expression.escapedText === "global")) ? BA(e, eR(t)) : j6(e) && j6(t) ? wh(e) === wh(t) && BA(e.expression, t.expression) : !1 } function Qw(e) { for (; Iu(e, !0);)e = e.right; return e } function TT(e) { return Re(e) && e.escapedText === "exports" } function RH(e) { return Re(e) && e.escapedText === "module" } function Bm(e) { return (br(e) || Zw(e)) && RH(e.expression) && wh(e) === "exports" } function ic(e) { let t = Twe(e); return t === 5 || Yn(e) ? t : 0 } function sS(e) { return Fn(e.arguments) === 3 && br(e.expression) && Re(e.expression.expression) && vr(e.expression.expression) === "Object" && vr(e.expression.name) === "defineProperty" && yf(e.arguments[1]) && cS(e.arguments[0], !0) } function j6(e) { return br(e) || Zw(e) } function Zw(e) { return Vs(e) && yf(e.argumentExpression) } function ST(e, t) { return br(e) && (!t && e.expression.kind === 108 || Re(e.name) && cS(e.expression, !0)) || H6(e, t) } function H6(e, t) { return Zw(e) && (!t && e.expression.kind === 108 || bc(e.expression) || ST(e.expression, !0)) } function cS(e, t) { return bc(e) || ST(e, t) } function eR(e) { return br(e) ? e.name : e.argumentExpression } function Twe(e) { if (Pa(e)) { if (!sS(e)) return 0; let t = e.arguments[0]; return TT(t) || Bm(t) ? 8 : ST(t) && wh(t) === "prototype" ? 9 : 7 } return e.operatorToken.kind !== 63 || !Us(e.left) || Swe(Qw(e)) ? 0 : cS(e.left.expression, !0) && wh(e.left) === "prototype" && rs(OH(e)) ? 6 : tR(e.left) } function Swe(e) { return NS(e) && Vf(e.expression) && e.expression.text === "0" } function W6(e) { if (br(e)) return e.name; let t = vs(e.argumentExpression); return Vf(t) || es(t) ? t : e } function wh(e) { let t = W6(e); if (t) { if (Re(t)) return t.escapedText; if (es(t) || Vf(t)) return Bs(t.text) } } function tR(e) { if (e.expression.kind === 108) return 4; if (Bm(e)) return 2; if (cS(e.expression, !0)) { if (ub(e.expression)) return 3; let t = e; for (; !Re(t.expression);)t = t.expression; let r = t.expression; if ((r.escapedText === "exports" || r.escapedText === "module" && wh(t) === "exports") && ST(e)) return 1; if (cS(e, !0) || Vs(e) && Y6(e)) return 5 } return 0 } function OH(e) { for (; ar(e.right);)e = e.right; return e.right } function nR(e) { return ar(e) && ic(e) === 3 } function fce(e) { return Yn(e) && e.parent && e.parent.kind === 241 && (!Vs(e) || Zw(e)) && !!x0(e.parent) } function rR(e, t) { let { valueDeclaration: r } = e; (!r || !(t.flags & 16777216 && !Yn(t) && !(r.flags & 16777216)) && RI(r) && !RI(t) || r.kind !== t.kind && jse(r)) && (e.valueDeclaration = t) } function _ce(e) { if (!e || !e.valueDeclaration) return !1; let t = e.valueDeclaration; return t.kind === 259 || wi(t) && t.initializer && Ia(t.initializer) } function iR(e) { var t, r; switch (e.kind) { case 257: case 205: return (t = jn(e.initializer, i => qu(i, !0))) == null ? void 0 : t.arguments[0]; case 269: return zr(e.moduleSpecifier, es); case 268: return zr((r = zr(e.moduleReference, um)) == null ? void 0 : r.expression, es); case 270: case 277: return zr(e.parent.moduleSpecifier, es); case 271: case 278: return zr(e.parent.parent.moduleSpecifier, es); case 273: return zr(e.parent.parent.parent.moduleSpecifier, es); default: L.assertNever(e) } } function aR(e) { return oR(e) || L.failBadSyntaxKind(e.parent) } function oR(e) { switch (e.parent.kind) { case 269: case 275: return e.parent; case 280: return e.parent.parent; case 210: return Dd(e.parent) || qu(e.parent, !1) ? e.parent : void 0; case 198: return L.assert(yo(e)), zr(e.parent.parent, Mh); default: return } } function UA(e) { switch (e.kind) { case 269: case 275: return e.moduleSpecifier; case 268: return e.moduleReference.kind === 280 ? e.moduleReference.expression : void 0; case 202: return ib(e) ? e.argument.literal : void 0; case 210: return e.arguments[0]; case 264: return e.name.kind === 10 ? e.name : void 0; default: return L.assertNever(e) } } function VA(e) { switch (e.kind) { case 269: return e.importClause && zr(e.importClause.namedBindings, nv); case 268: return e; case 275: return e.exportClause && zr(e.exportClause, qm); default: return L.assertNever(e) } } function lS(e) { return e.kind === 269 && !!e.importClause && !!e.importClause.name } function z6(e, t) { if (e.name) { let r = t(e); if (r) return r } if (e.namedBindings) { let r = nv(e.namedBindings) ? t(e.namedBindings) : mn(e.namedBindings.elements, t); if (r) return r } } function uS(e) { if (e) switch (e.kind) { case 166: case 171: case 170: case 300: case 299: case 169: case 168: return e.questionToken !== void 0 }return !1 } function jA(e) { let t = S2(e) ? Sl(e.parameters) : void 0, r = zr(t && t.name, Re); return !!r && r.escapedText === "new" } function Ff(e) { return e.kind === 349 || e.kind === 341 || e.kind === 343 } function sR(e) { return Ff(e) || Ep(e) } function xwe(e) { return Ol(e) && ar(e.expression) && e.expression.operatorToken.kind === 63 ? Qw(e.expression) : void 0 } function pce(e) { return Ol(e) && ar(e.expression) && ic(e.expression) !== 0 && ar(e.expression.right) && (e.expression.right.operatorToken.kind === 56 || e.expression.right.operatorToken.kind === 60) ? e.expression.right.right : void 0 } function NH(e) { switch (e.kind) { case 240: let t = HA(e); return t && t.initializer; case 169: return e.initializer; case 299: return e.initializer } } function HA(e) { return Bc(e) ? Sl(e.declarationList.declarations) : void 0 } function mce(e) { return Tc(e) && e.body && e.body.kind === 264 ? e.body : void 0 } function cR(e) { if (e.kind >= 240 && e.kind <= 256) return !0; switch (e.kind) { case 79: case 108: case 106: case 163: case 233: case 209: case 208: case 205: case 215: case 216: case 171: case 174: case 175: return !0; default: return !1 } } function lR(e) { switch (e.kind) { case 216: case 223: case 238: case 249: case 176: case 292: case 260: case 228: case 172: case 173: case 182: case 177: case 248: case 256: case 243: case 209: case 239: case 1: case 263: case 302: case 274: case 275: case 278: case 241: case 246: case 247: case 245: case 259: case 215: case 181: case 174: case 79: case 242: case 269: case 268: case 178: case 261: case 320: case 326: case 253: case 171: case 170: case 264: case 199: case 267: case 207: case 166: case 214: case 208: case 299: case 169: case 168: case 250: case 175: case 300: case 301: case 252: case 254: case 255: case 262: case 165: case 257: case 240: case 244: case 251: return !0; default: return !1 } } function PH(e, t) { let r; PA(e) && Jy(e) && Kd(e.initializer) && (r = si(r, hce(e, To(e.initializer.jsDoc)))); let i = e; for (; i && i.parent;) { if (Kd(i) && (r = si(r, hce(e, To(i.jsDoc)))), i.kind === 166) { r = si(r, (t ? joe : fI)(i)); break } if (i.kind === 165) { r = si(r, (t ? zoe : Woe)(i)); break } i = MH(i) } return r || Je } function hce(e, t) { if (dm(t)) { let r = Pr(t.tags, i => gce(e, i)); return t.tags === r ? [t] : r } return gce(e, t) ? [t] : void 0 } function gce(e, t) { return !(DL(t) || v3(t)) || !t.parent || !dm(t.parent) || !ud(t.parent.parent) || t.parent.parent === e } function MH(e) { let t = e.parent; if (t.kind === 299 || t.kind === 274 || t.kind === 169 || t.kind === 241 && e.kind === 208 || t.kind === 250 || mce(t) || ar(e) && e.operatorToken.kind === 63) return t; if (t.parent && (HA(t.parent) === e || ar(t) && t.operatorToken.kind === 63)) return t.parent; if (t.parent && t.parent.parent && (HA(t.parent.parent) || NH(t.parent.parent) === e || pce(t.parent.parent))) return t.parent.parent } function uR(e) { if (e.symbol) return e.symbol; if (!Re(e.name)) return; let t = e.name.escapedText, r = sb(e); if (!r) return; let i = wr(r.parameters, o => o.name.kind === 79 && o.name.escapedText === t); return i && i.symbol } function J6(e) { if (dm(e.parent) && e.parent.tags) { let t = wr(e.parent.tags, Ff); if (t) return t } return sb(e) } function sb(e) { let t = WA(e); if (t) return $d(t) && t.type && Ia(t.type) ? t.type : Ia(t) ? t : void 0 } function WA(e) { let t = dS(e); if (t) return pce(t) || xwe(t) || NH(t) || HA(t) || mce(t) || t } function dS(e) { let t = OI(e); if (!t) return; let r = t.parent; if (r && r.jsDoc && t === Os(r.jsDoc)) return r } function OI(e) { return jn(e.parent, dm) } function yce(e) { let t = e.name.escapedText, { typeParameters: r } = e.parent.parent.parent; return r && wr(r, i => i.name.escapedText === t) } function Awe(e) { return !!e.typeArguments } function xT(e) { let t = e.parent; for (; ;) { switch (t.kind) { case 223: let r = t.operatorToken.kind; return Mg(r) && t.left === e ? r === 63 || HI(r) ? 1 : 2 : 0; case 221: case 222: let i = t.operator; return i === 45 || i === 46 ? 2 : 0; case 246: case 247: return t.initializer === e ? 1 : 0; case 214: case 206: case 227: case 232: e = t; break; case 301: e = t.parent; break; case 300: if (t.name !== e) return 0; e = t.parent; break; case 299: if (t.name === e) return 0; e = t.parent; break; default: return 0 }t = e.parent } } function Um(e) { return xT(e) !== 0 } function vce(e) { switch (e.kind) { case 238: case 240: case 251: case 242: case 252: case 266: case 292: case 293: case 253: case 245: case 246: case 247: case 243: case 244: case 255: case 295: return !0 }return !1 } function bce(e) { return ms(e) || xs(e) || xA(e) || Jc(e) || Ec(e) } function Ece(e, t) { for (; e && e.kind === t;)e = e.parent; return e } function dR(e) { return Ece(e, 193) } function qy(e) { return Ece(e, 214) } function Tce(e) { let t; for (; e && e.kind === 193;)t = e, e = e.parent; return [t, e] } function FH(e) { for (; wS(e);)e = e.type; return e } function vs(e, t) { return ql(e, t ? 17 : 1) } function GH(e) { return e.kind !== 208 && e.kind !== 209 ? !1 : (e = qy(e.parent), e && e.kind === 217) } function AT(e, t) { for (; e;) { if (e === t) return !0; e = e.parent } return !1 } function Rh(e) { return !Li(e) && !La(e) && Kl(e.parent) && e.parent.name === e } function fR(e) { let t = e.parent; switch (e.kind) { case 10: case 14: case 8: if (ts(t)) return t.parent; case 79: if (Kl(t)) return t.name === e ? t : void 0; if (Yu(t)) { let r = t.parent; return xp(r) && r.name === t ? r : void 0 } else { let r = t.parent; return ar(r) && ic(r) !== 0 && (r.left.symbol || r.symbol) && sa(r) === e ? r : void 0 } case 80: return Kl(t) && t.name === e ? t : void 0; default: return } } function _R(e) { return yf(e) && e.parent.kind === 164 && Kl(e.parent.parent) } function Sce(e) { let t = e.parent; switch (t.kind) { case 169: case 168: case 171: case 170: case 174: case 175: case 302: case 299: case 208: return t.name === e; case 163: return t.right === e; case 205: case 273: return t.propertyName === e; case 278: case 288: case 282: case 283: case 284: return !0 }return !1 } function Cwe(e) { return e.kind === 268 || e.kind === 267 || e.kind === 270 && e.name || e.kind === 271 || e.kind === 277 || e.kind === 273 || e.kind === 278 || e.kind === 274 && zA(e) ? !0 : Yn(e) && (ar(e) && ic(e) === 2 && zA(e) || br(e) && ar(e.parent) && e.parent.left === e && e.parent.operatorToken.kind === 63 && pR(e.parent.right)) } function BH(e) { switch (e.parent.kind) { case 270: case 273: case 271: case 278: case 274: case 268: case 277: return e.parent; case 163: do e = e.parent; while (e.parent.kind === 163); return BH(e) } } function pR(e) { return bc(e) || _u(e) } function zA(e) { let t = UH(e); return pR(t) } function UH(e) { return pc(e) ? e.expression : e.right } function xce(e) { return e.kind === 300 ? e.name : e.kind === 299 ? e.initializer : e.parent.right } function hp(e) { let t = P0(e); if (t && Yn(e)) { let r = Koe(e); if (r) return r.class } return t } function P0(e) { let t = mR(e.heritageClauses, 94); return t && t.types.length > 0 ? t.types[0] : void 0 } function JA(e) { if (Yn(e)) return qoe(e).map(t => t.class); { let t = mR(e.heritageClauses, 117); return t?.types } } function NI(e) { return ku(e) ? PI(e) || Je : Yr(e) && Qi(aT(hp(e)), JA(e)) || Je } function PI(e) { let t = mR(e.heritageClauses, 94); return t ? t.types : void 0 } function mR(e, t) { if (e) { for (let r of e) if (r.token === t) return r } } function cb(e, t) { for (; e;) { if (e.kind === t) return e; e = e.parent } } function Xu(e) { return 81 <= e && e <= 162 } function K6(e) { return 126 <= e && e <= 162 } function Ace(e) { return Xu(e) && !K6(e) } function Iwe(e) { return 117 <= e && e <= 125 } function fS(e) { let t = lT(e); return t !== void 0 && Ace(t) } function Lwe(e) { let t = lT(e); return t !== void 0 && Xu(t) } function q6(e) { let t = nb(e); return !!t && !K6(t) } function KA(e) { return 2 <= e && e <= 7 } function pl(e) { if (!e) return 4; let t = 0; switch (e.kind) { case 259: case 215: case 171: e.asteriskToken && (t |= 1); case 216: Mr(e, 512) && (t |= 2); break }return e.body || (t |= 4), t } function qA(e) { switch (e.kind) { case 259: case 215: case 216: case 171: return e.body !== void 0 && e.asteriskToken === void 0 && Mr(e, 512) }return !1 } function yf(e) { return es(e) || Vf(e) } function X6(e) { return tv(e) && (e.operator === 39 || e.operator === 40) && Vf(e.operand) } function Xy(e) { let t = sa(e); return !!t && Y6(t) } function Y6(e) { if (!(e.kind === 164 || e.kind === 209)) return !1; let t = Vs(e) ? vs(e.argumentExpression) : e.expression; return !yf(t) && !X6(t) } function M0(e) { switch (e.kind) { case 79: case 80: return e.escapedText; case 10: case 8: return Bs(e.text); case 164: let t = e.expression; return yf(t) ? Bs(t.text) : X6(t) ? t.operator === 40 ? Xa(t.operator) + t.operand.text : t.operand.text : void 0; default: return L.assertNever(e) } } function c_(e) { switch (e.kind) { case 79: case 10: case 14: case 8: return !0; default: return !1 } } function l_(e) { return Ah(e) ? vr(e) : e.text } function MI(e) { return Ah(e) ? e.escapedText : Bs(e.text) } function kwe(e) { return `__@${$a(e)}@${e.escapedName}` } function hR(e, t) { return `__#${$a(e)}@${t}` } function gR(e) { return na(e.escapedName, "__@") } function Cce(e) { return na(e.escapedName, "__#") } function Dwe(e) { return e.kind === 79 && e.escapedText === "Symbol" } function Ice(e) { return Re(e) ? vr(e) === "__proto__" : yo(e) && e.text === "__proto__" } function FI(e, t) { switch (e = ql(e), e.kind) { case 228: case 215: if (e.name) return !1; break; case 216: break; default: return !1 }return typeof t == "function" ? t(e) : !0 } function VH(e) { switch (e.kind) { case 299: return !Ice(e.name); case 300: return !!e.objectAssignmentInitializer; case 257: return Re(e.name) && !!e.initializer; case 166: return Re(e.name) && !!e.initializer && !e.dotDotDotToken; case 205: return Re(e.name) && !!e.initializer && !e.dotDotDotToken; case 169: return !!e.initializer; case 223: switch (e.operatorToken.kind) { case 63: case 76: case 75: case 77: return Re(e.left) }break; case 274: return !0 }return !1 } function vf(e, t) { if (!VH(e)) return !1; switch (e.kind) { case 299: return FI(e.initializer, t); case 300: return FI(e.objectAssignmentInitializer, t); case 257: case 166: case 205: case 169: return FI(e.initializer, t); case 223: return FI(e.right, t); case 274: return FI(e.expression, t) } } function jH(e) { return e.escapedText === "push" || e.escapedText === "unshift" } function CT(e) { return nm(e).kind === 166 } function nm(e) { for (; e.kind === 205;)e = e.parent.parent; return e } function HH(e) { let t = e.kind; return t === 173 || t === 215 || t === 259 || t === 216 || t === 171 || t === 174 || t === 175 || t === 264 || t === 308 } function ws(e) { return vp(e.pos) || vp(e.end) } function wwe(e) { return ea(e, Li) || e } function WH(e) { let t = JH(e), r = e.kind === 211 && e.arguments !== void 0; return zH(e.kind, t, r) } function zH(e, t, r) { switch (e) { case 211: return r ? 0 : 1; case 221: case 218: case 219: case 217: case 220: case 224: case 226: return 1; case 223: switch (t) { case 42: case 63: case 64: case 65: case 67: case 66: case 68: case 69: case 70: case 71: case 72: case 73: case 78: case 74: case 75: case 76: case 77: return 1 } }return 0 } function $6(e) { let t = JH(e), r = e.kind === 211 && e.arguments !== void 0; return yR(e.kind, t, r) } function JH(e) { return e.kind === 223 ? e.operatorToken.kind : e.kind === 221 || e.kind === 222 ? e.operator : e.kind } function yR(e, t, r) { switch (e) { case 357: return 0; case 227: return 1; case 226: return 2; case 224: return 4; case 223: switch (t) { case 27: return 0; case 63: case 64: case 65: case 67: case 66: case 68: case 69: case 70: case 71: case 72: case 73: case 78: case 74: case 75: case 76: case 77: return 3; default: return vR(t) }case 213: case 232: case 221: case 218: case 219: case 217: case 220: return 16; case 222: return 17; case 210: return 18; case 211: return r ? 19 : 18; case 212: case 208: case 209: case 233: return 19; case 231: case 235: return 11; case 108: case 106: case 79: case 80: case 104: case 110: case 95: case 8: case 9: case 10: case 206: case 207: case 215: case 216: case 228: case 13: case 14: case 225: case 214: case 229: case 281: case 282: case 285: return 20; default: return -1 } } function vR(e) { switch (e) { case 60: return 4; case 56: return 5; case 55: return 6; case 51: return 7; case 52: return 8; case 50: return 9; case 34: case 35: case 36: case 37: return 10; case 29: case 31: case 32: case 33: case 102: case 101: case 128: case 150: return 11; case 47: case 48: case 49: return 12; case 39: case 40: return 13; case 41: case 43: case 44: return 14; case 42: return 15 }return -1 } function bR(e) { return Pr(e, t => { switch (t.kind) { case 291: return !!t.expression; case 11: return !t.containsOnlyTriviaWhiteSpaces; default: return !0 } }) } function XA() { let e = [], t = [], r = new Map, i = !1; return { add: s, lookup: o, getGlobalDiagnostics: l, getDiagnostics: f }; function o(d) { let g; if (d.file ? g = r.get(d.file.fileName) : g = e, !g) return; let m = Py(g, d, Ks, c4); if (m >= 0) return g[m] } function s(d) { let g; d.file ? (g = r.get(d.file.fileName), g || (g = [], r.set(d.file.fileName, g), Ny(t, d.file.fileName, su))) : (i && (i = !1, e = e.slice()), g = e), Ny(g, d, c4) } function l() { return i = !0, e } function f(d) { if (d) return r.get(d) || []; let g = BD(t, m => r.get(m)); return e.length && g.unshift(...e), g } } function Rwe(e) { return e.replace(Jle, "\\${") } function KH(e) { return e && !!(IS(e) ? e.templateFlags : e.head.templateFlags || vt(e.templateSpans, t => !!t.literal.templateFlags)) } function Lce(e) { return "\\u" + ("0000" + e.toString(16).toUpperCase()).slice(-4) } function Owe(e, t, r) { if (e.charCodeAt(0) === 0) { let i = r.charCodeAt(t + e.length); return i >= 48 && i <= 57 ? "\\x00" : "\\0" } return Yle.get(e) || Lce(e.charCodeAt(0)) } function _S(e, t) { let r = t === 96 ? Xle : t === 39 ? qle : Kle; return e.replace(r, Owe) } function ER(e, t) { return e = _S(e, t), ez.test(e) ? e.replace(ez, r => Lce(r.charCodeAt(0))) : e } function Nwe(e) { return "&#x" + e.toString(16).toUpperCase() + ";" } function Pwe(e) { return e.charCodeAt(0) === 0 ? "&#0;" : Zle.get(e) || Nwe(e.charCodeAt(0)) } function qH(e, t) { let r = t === 39 ? Qle : $le; return e.replace(r, Pwe) } function u_(e) { let t = e.length; return t >= 2 && e.charCodeAt(0) === e.charCodeAt(t - 1) && Mwe(e.charCodeAt(0)) ? e.substring(1, t - 1) : e } function Mwe(e) { return e === 39 || e === 34 || e === 96 } function GI(e) { let t = e.charCodeAt(0); return t >= 97 && t <= 122 || jl(e, "-") || jl(e, ":") } function Q6(e) { let t = s2[1]; for (let r = s2.length; r <= e; r++)s2.push(s2[r - 1] + t); return s2[e] } function YA() { return s2[1].length } function TR() { return jl(Rf, "-dev") || jl(Rf, "-insiders") } function SR(e) { var t, r, i, o, s, l = !1; function f(C) { let P = hw(C); P.length > 1 ? (o = o + P.length - 1, s = t.length - C.length + To(P), i = s - t.length === 0) : i = !1 } function d(C) { C && C.length && (i && (C = Q6(r) + C, i = !1), t += C, f(C)) } function g(C) { C && (l = !1), d(C) } function m(C) { C && (l = !0), d(C) } function v() { t = "", r = 0, i = !0, o = 0, s = 0, l = !1 } function S(C) { C !== void 0 && (t += C, f(C), l = !1) } function x(C) { C && C.length && g(C) } function A(C) { (!i || C) && (t += e, o++, s = t.length, i = !0, l = !1) } function w() { return i ? t.length : t.length + e.length } return v(), { write: g, rawWrite: S, writeLiteral: x, writeLine: A, increaseIndent: () => { r++ }, decreaseIndent: () => { r-- }, getIndent: () => r, getTextPos: () => t.length, getLine: () => o, getColumn: () => i ? r * YA() : t.length - s, getText: () => t, isAtStartOfLine: () => i, hasTrailingComment: () => l, hasTrailingWhitespace: () => !!t.length && xh(t.charCodeAt(t.length - 1)), clear: v, writeKeyword: g, writeOperator: g, writeParameter: g, writeProperty: g, writePunctuation: g, writeSpace: g, writeStringLiteral: g, writeSymbol: (C, P) => g(C), writeTrailingSemicolon: g, writeComment: m, getTextPosWithWriteLine: w } } function XH(e) { let t = !1; function r() { t && (e.writeTrailingSemicolon(";"), t = !1) } return { ...e, writeTrailingSemicolon() { t = !0 }, writeLiteral(i) { r(), e.writeLiteral(i) }, writeStringLiteral(i) { r(), e.writeStringLiteral(i) }, writeSymbol(i, o) { r(), e.writeSymbol(i, o) }, writePunctuation(i) { r(), e.writePunctuation(i) }, writeKeyword(i) { r(), e.writeKeyword(i) }, writeOperator(i) { r(), e.writeOperator(i) }, writeParameter(i) { r(), e.writeParameter(i) }, writeSpace(i) { r(), e.writeSpace(i) }, writeProperty(i) { r(), e.writeProperty(i) }, writeComment(i) { r(), e.writeComment(i) }, writeLine() { r(), e.writeLine() }, increaseIndent() { r(), e.increaseIndent() }, decreaseIndent() { r(), e.decreaseIndent() } } } function xR(e) { return e.useCaseSensitiveFileNames ? e.useCaseSensitiveFileNames() : !1 } function lb(e) { return Dl(xR(e)) } function Z6(e, t, r) { return t.moduleName || YH(e, t.fileName, r && r.fileName) } function kce(e, t) { return e.getCanonicalFileName(_a(t, e.getCurrentDirectory())) } function Dce(e, t, r) { let i = t.getExternalModuleFileFromDeclaration(r); if (!i || i.isDeclarationFile) return; let o = UA(r); if (!(o && es(o) && !Jd(o.text) && kce(e, i.path).indexOf(kce(e, cu(e.getCommonSourceDirectory()))) === -1)) return Z6(e, i) } function YH(e, t, r) { let i = d => e.getCanonicalFileName(d), o = Ts(r ? ni(r) : e.getCommonSourceDirectory(), e.getCurrentDirectory(), i), s = _a(t, e.getCurrentDirectory()), l = Q1(o, s, o, i, !1), f = ld(l); return r ? S0(f) : f } function wce(e, t, r) { let i = t.getCompilerOptions(), o; return i.outDir ? o = ld(e4(e, t, i.outDir)) : o = ld(e), o + r } function Rce(e, t) { return $H(e, t.getCompilerOptions(), t.getCurrentDirectory(), t.getCommonSourceDirectory(), r => t.getCanonicalFileName(r)) } function $H(e, t, r, i, o) { let s = t.declarationDir || t.outDir, l = s ? tW(e, s, r, i, o) : e, f = QH(l); return ld(l) + f } function QH(e) { return $c(e, [".mjs", ".mts"]) ? ".d.mts" : $c(e, [".cjs", ".cts"]) ? ".d.cts" : $c(e, [".json"]) ? ".d.json.ts" : ".d.ts" } function Oce(e) { return $c(e, [".d.mts", ".mjs", ".mts"]) ? [".mts", ".mjs"] : $c(e, [".d.cts", ".cjs", ".cts"]) ? [".cts", ".cjs"] : $c(e, [".d.json.ts"]) ? [".json"] : [".tsx", ".ts", ".jsx", ".js"] } function Ss(e) { return e.outFile || e.out } function ZH(e, t) { var r, i; if (e.paths) return (i = e.baseUrl) != null ? i : L.checkDefined(e.pathsBasePath || ((r = t.getCurrentDirectory) == null ? void 0 : r.call(t)), "Encountered 'paths' without a 'baseUrl', config file, or host 'getCurrentDirectory'.") } function eW(e, t, r) { let i = e.getCompilerOptions(); if (Ss(i)) { let o = Rl(i), s = i.emitDeclarationOnly || o === 2 || o === 4; return Pr(e.getSourceFiles(), l => (s || !Lc(l)) && pS(l, e, r)) } else { let o = t === void 0 ? e.getSourceFiles() : [t]; return Pr(o, s => pS(s, e, r)) } } function pS(e, t, r) { return !(t.getCompilerOptions().noEmitForJsFiles && Cu(e)) && !e.isDeclarationFile && !t.isSourceFileFromExternalLibrary(e) && (r || !(Mf(e) && t.getResolvedProjectReferenceToRedirect(e.fileName)) && !t.isSourceOfProjectReferenceRedirect(e.fileName)) } function e4(e, t, r) { return tW(e, r, t.getCurrentDirectory(), t.getCommonSourceDirectory(), i => t.getCanonicalFileName(i)) } function tW(e, t, r, i, o) { let s = _a(e, r); return s = o(s).indexOf(o(i)) === 0 ? s.substring(i.length) : s, vi(t, s) } function BI(e, t, r, i, o, s, l) { e.writeFile(r, i, o, f => { t.add(ps(_.Could_not_write_file_0_Colon_1, r, f)) }, s, l) } function Nce(e, t, r) { if (e.length > _p(e) && !r(e)) { let i = ni(e); Nce(i, t, r), t(e) } } function nW(e, t, r, i, o, s) { try { i(e, t, r) } catch { Nce(ni(So(e)), o, s), i(e, t, r) } } function UI(e, t) { let r = Sh(e); return aI(r, t) } function IT(e, t) { return aI(e, t) } function Vm(e) { return wr(e.members, t => Ec(t) && Pf(t.body)) } function VI(e) { if (e && e.parameters.length > 0) { let t = e.parameters.length === 2 && G0(e.parameters[0]); return e.parameters[t ? 1 : 0] } } function Pce(e) { let t = VI(e); return t && t.type } function F0(e) { if (e.parameters.length && !X0(e)) { let t = e.parameters[0]; if (G0(t)) return t } } function G0(e) { return LT(e.name) } function LT(e) { return !!e && e.kind === 79 && rW(e) } function mS(e) { if (!LT(e)) return !1; for (; Yu(e.parent) && e.parent.left === e;)e = e.parent; return e.parent.kind === 183 } function rW(e) { return e.escapedText === "this" } function kT(e, t) { let r, i, o, s; return Xy(t) ? (r = t, t.kind === 174 ? o = t : t.kind === 175 ? s = t : L.fail("Accessor has wrong kind")) : mn(e, l => { if (rb(l) && Ca(l) === Ca(t)) { let f = M0(l.name), d = M0(t.name); f === d && (r ? i || (i = l) : r = l, l.kind === 174 && !o && (o = l), l.kind === 175 && !s && (s = l)) } }), { firstAccessor: r, secondAccessor: i, getAccessor: o, setAccessor: s } } function Cl(e) { if (!Yn(e) && Jc(e)) return; let t = e.type; return t || !Yn(e) ? t : a6(e) ? e.typeExpression && e.typeExpression.type : Vy(e) } function Mce(e) { return e.type } function U_(e) { return X0(e) ? e.type && e.type.typeExpression && e.type.typeExpression.type : e.type || (Yn(e) ? Aw(e) : void 0) } function t4(e) { return Uo(A0(e), t => Fwe(t) ? t.typeParameters : void 0) } function Fwe(e) { return H_(e) && !(e.parent.kind === 323 && (e.parent.tags.some(Ff) || e.parent.tags.some(kL))) } function Fce(e) { let t = VI(e); return t && Cl(t) } function Gce(e, t, r, i) { Bce(e, t, r.pos, i) } function Bce(e, t, r, i) { i && i.length && r !== i[0].pos && IT(e, r) !== IT(e, i[0].pos) && t.writeLine() } function Uce(e, t, r, i) { r !== i && IT(e, r) !== IT(e, i) && t.writeLine() } function Vce(e, t, r, i, o, s, l, f) { if (i && i.length > 0) { o && r.writeSpace(" "); let d = !1; for (let g of i) d && (r.writeSpace(" "), d = !1), f(e, t, r, g.pos, g.end, l), g.hasTrailingNewLine ? r.writeLine() : d = !0; d && s && r.writeSpace(" ") } } function jce(e, t, r, i, o, s, l) { let f, d; if (l ? o.pos === 0 && (f = Pr(Nm(e, o.pos), g)) : f = Nm(e, o.pos), f) { let m = [], v; for (let S of f) { if (v) { let x = IT(t, v.end); if (IT(t, S.pos) >= x + 2) break } m.push(S), v = S } if (m.length) { let S = IT(t, To(m).end); IT(t, xo(e, o.pos)) >= S + 2 && (Gce(t, r, o, f), Vce(e, t, r, m, !1, !0, s, i), d = { nodePos: o.pos, detachedCommentEndPos: To(m).end }) } } return d; function g(m) { return y6(e, m.pos) } } function $A(e, t, r, i, o, s) { if (e.charCodeAt(i + 1) === 42) { let l = yw(t, i), f = t.length, d; for (let g = i, m = l.line; g < o; m++) { let v = m + 1 === f ? e.length + 1 : t[m + 1]; if (g !== i) { d === void 0 && (d = Hce(e, t[l.line], i)); let x = r.getIndent() * YA() - d + Hce(e, g, v); if (x > 0) { let A = x % YA(), w = Q6((x - A) / YA()); for (r.rawWrite(w); A;)r.rawWrite(" "), A-- } else r.rawWrite("") } Gwe(e, o, r, s, g, v), g = v } } else r.writeComment(e.substring(i, o)) } function Gwe(e, t, r, i, o, s) { let l = Math.min(t, s - 1), f = v0(e.substring(o, l)); f ? (r.writeComment(f), l !== t && r.writeLine()) : r.rawWrite(i) } function Hce(e, t, r) { let i = 0; for (; t < r && Yp(e.charCodeAt(t)); t++)e.charCodeAt(t) === 9 ? i += YA() - i % YA() : i++; return i } function n4(e) { return uu(e) !== 0 } function Wce(e) { return Yy(e) !== 0 } function cd(e, t) { return !!hS(e, t) } function Mr(e, t) { return !!zce(e, t) } function Ca(e) { return _l(e) && zc(e) || oc(e) } function zc(e) { return Mr(e, 32) } function iW(e) { return cd(e, 16384) } function B0(e) { return Mr(e, 256) } function aW(e) { return Mr(e, 2) } function rm(e) { return Mr(e, 128) } function jI(e) { return cd(e, 64) } function bf(e) { return Mr(e, 131072) } function hS(e, t) { return uu(e) & t } function zce(e, t) { return Yy(e) & t } function oW(e, t, r) { return e.kind >= 0 && e.kind <= 162 ? 0 : (e.modifierFlagsCache & 536870912 || (e.modifierFlagsCache = sW(e) | 536870912), t && !(e.modifierFlagsCache & 4096) && (r || Yn(e)) && e.parent && (e.modifierFlagsCache |= Kce(e) | 4096), e.modifierFlagsCache & -536875009) } function uu(e) { return oW(e, !0) } function Jce(e) { return oW(e, !0, !0) } function Yy(e) { return oW(e, !1) } function Kce(e) { let t = 0; return e.parent && !ha(e) && (Yn(e) && (Xoe(e) && (t |= 4), Yoe(e) && (t |= 8), $oe(e) && (t |= 16), Qoe(e) && (t |= 64), Zoe(e) && (t |= 16384)), ese(e) && (t |= 8192)), t } function qce(e) { return sW(e) | Kce(e) } function sW(e) { let t = g_(e) ? im(e.modifiers) : 0; return (e.flags & 4 || e.kind === 79 && e.flags & 2048) && (t |= 1), t } function im(e) { let t = 0; if (e) for (let r of e) t |= gS(r.kind); return t } function gS(e) { switch (e) { case 124: return 32; case 123: return 4; case 122: return 16; case 121: return 8; case 126: return 256; case 127: return 128; case 93: return 1; case 136: return 2; case 85: return 2048; case 88: return 1024; case 132: return 512; case 146: return 64; case 161: return 16384; case 101: return 32768; case 145: return 65536; case 167: return 131072 }return 0 } function Xce(e) { return e === 56 || e === 55 } function Yce(e) { return Xce(e) || e === 53 } function HI(e) { return e === 75 || e === 76 || e === 77 } function cW(e) { return ar(e) && HI(e.operatorToken.kind) } function AR(e) { return Xce(e) || e === 60 } function CR(e) { return ar(e) && AR(e.operatorToken.kind) } function Mg(e) { return e >= 63 && e <= 78 } function lW(e) { let t = uW(e); return t && !t.isImplements ? t.class : void 0 } function uW(e) { if (Vg(e)) { if (dd(e.parent) && Yr(e.parent.parent)) return { class: e.parent.parent, isImplements: e.parent.token === 117 }; if (x2(e.parent)) { let t = WA(e.parent); if (t && Yr(t)) return { class: t, isImplements: !1 } } } } function Iu(e, t) { return ar(e) && (t ? e.operatorToken.kind === 63 : Mg(e.operatorToken.kind)) && Ju(e.left) } function Bwe(e) { return Iu(e.parent) && e.parent.left === e } function Fg(e) { if (Iu(e, !0)) { let t = e.left.kind; return t === 207 || t === 206 } return !1 } function IR(e) { return lW(e) !== void 0 } function bc(e) { return e.kind === 79 || LR(e) } function Yd(e) { switch (e.kind) { case 79: return e; case 163: do e = e.left; while (e.kind !== 79); return e; case 208: do e = e.expression; while (e.kind !== 79); return e } } function WI(e) { return e.kind === 79 || e.kind === 108 || e.kind === 106 || e.kind === 233 || e.kind === 208 && WI(e.expression) || e.kind === 214 && WI(e.expression) } function LR(e) { return br(e) && Re(e.name) && bc(e.expression) } function kR(e) { if (br(e)) { let t = kR(e.expression); if (t !== void 0) return t + "." + qd(e.name) } else if (Vs(e)) { let t = kR(e.expression); if (t !== void 0 && Ys(e.argumentExpression)) return t + "." + M0(e.argumentExpression) } else if (Re(e)) return Gi(e.escapedText) } function ub(e) { return ST(e) && wh(e) === "prototype" } function zI(e) { return e.parent.kind === 163 && e.parent.right === e || e.parent.kind === 208 && e.parent.name === e } function $ce(e) { return br(e.parent) && e.parent.name === e || Vs(e.parent) && e.parent.argumentExpression === e } function Qce(e) { return Yu(e.parent) && e.parent.right === e || br(e.parent) && e.parent.name === e || gb(e.parent) && e.parent.right === e } function dW(e) { return e.kind === 207 && e.properties.length === 0 } function Zce(e) { return e.kind === 206 && e.elements.length === 0 } function QA(e) { if (!(!Uwe(e) || !e.declarations)) { for (let t of e.declarations) if (t.localSymbol) return t.localSymbol } } function Uwe(e) { return e && Fn(e.declarations) > 0 && Mr(e.declarations[0], 1024) } function r4(e) { return wr(iue, t => Gc(e, t)) } function Vwe(e) { let t = [], r = e.length; for (let i = 0; i < r; i++) { let o = e.charCodeAt(i); o < 128 ? t.push(o) : o < 2048 ? (t.push(o >> 6 | 192), t.push(o & 63 | 128)) : o < 65536 ? (t.push(o >> 12 | 224), t.push(o >> 6 & 63 | 128), t.push(o & 63 | 128)) : o < 131072 ? (t.push(o >> 18 | 240), t.push(o >> 12 & 63 | 128), t.push(o >> 6 & 63 | 128), t.push(o & 63 | 128)) : L.assert(!1, "Unexpected code point") } return t } function ele(e) { let t = "", r = Vwe(e), i = 0, o = r.length, s, l, f, d; for (; i < o;)s = r[i] >> 2, l = (r[i] & 3) << 4 | r[i + 1] >> 4, f = (r[i + 1] & 15) << 2 | r[i + 2] >> 6, d = r[i + 2] & 63, i + 1 >= o ? f = d = 64 : i + 2 >= o && (d = 64), t += H0.charAt(s) + H0.charAt(l) + H0.charAt(f) + H0.charAt(d), i += 3; return t } function jwe(e) { let t = "", r = 0, i = e.length; for (; r < i;) { let o = e[r]; if (o < 128) t += String.fromCharCode(o), r++; else if ((o & 192) === 192) { let s = o & 63; r++; let l = e[r]; for (; (l & 192) === 128;)s = s << 6 | l & 63, r++, l = e[r]; t += String.fromCharCode(s) } else t += String.fromCharCode(o), r++ } return t } function tle(e, t) { return e && e.base64encode ? e.base64encode(t) : ele(t) } function nle(e, t) { if (e && e.base64decode) return e.base64decode(t); let r = t.length, i = [], o = 0; for (; o < r && t.charCodeAt(o) !== H0.charCodeAt(64);) { let s = H0.indexOf(t[o]), l = H0.indexOf(t[o + 1]), f = H0.indexOf(t[o + 2]), d = H0.indexOf(t[o + 3]), g = (s & 63) << 2 | l >> 4 & 3, m = (l & 15) << 4 | f >> 2 & 15, v = (f & 3) << 6 | d & 63; m === 0 && f !== 0 ? i.push(g) : v === 0 && d !== 0 ? i.push(g, m) : i.push(g, m, v), o += 4 } return jwe(i) } function fW(e, t) { let r = Ta(t) ? t : t.readFile(e); if (!r) return; let i = vJ(e, r); return i.error ? void 0 : i.config } function JI(e, t) { return fW(e, t) || {} } function gp(e, t) { return !t.directoryExists || t.directoryExists(e) } function db(e) { switch (e.newLine) { case 0: return eue; case 1: case void 0: return tue } } function Gf(e, t = e) { return L.assert(t >= e || t === -1), { pos: e, end: t } } function i4(e, t) { return Gf(e.pos, t) } function fb(e, t) { return Gf(t, e.end) } function $y(e) { let t = g_(e) ? dA(e.modifiers, du) : void 0; return t && !vp(t.end) ? fb(e, t.end) : e } function yp(e) { if (Na(e) || Nc(e)) return fb(e, e.name.pos); let t = g_(e) ? Os(e.modifiers) : void 0; return t && !vp(t.end) ? fb(e, t.end) : $y(e) } function Hwe(e) { return e.pos === e.end } function _W(e, t) { return Gf(e, e + Xa(t).length) } function DT(e, t) { return ile(e, e, t) } function a4(e, t, r) { return Bf(KI(e, r, !1), KI(t, r, !1), r) } function rle(e, t, r) { return Bf(e.end, t.end, r) } function ile(e, t, r) { return Bf(KI(e, r, !1), t.end, r) } function DR(e, t, r) { return Bf(e.end, KI(t, r, !1), r) } function pW(e, t, r, i) { let o = KI(t, r, i); return oI(r, e.end, o) } function Wwe(e, t, r) { return oI(r, e.end, t.end) } function ale(e, t) { return !Bf(e.pos, e.end, t) } function Bf(e, t, r) { return oI(r, e, t) === 0 } function KI(e, t, r) { return vp(e.pos) ? -1 : xo(t.text, e.pos, !1, r) } function ole(e, t, r, i) { let o = xo(r.text, e, !1, i), s = zwe(o, t, r); return oI(r, s ?? t, o) } function sle(e, t, r, i) { let o = xo(r.text, e, !1, i); return oI(r, e, Math.min(t, o)) } function zwe(e, t = 0, r) { for (; e-- > t;)if (!xh(r.text.charCodeAt(e))) return e } function wR(e) { let t = ea(e); if (t) switch (t.parent.kind) { case 263: case 264: return t === t.parent.name }return !1 } function qI(e) { return Pr(e.declarations, mW) } function mW(e) { return wi(e) && e.initializer !== void 0 } function Jwe(e) { return e.watch && fs(e, "watch") } function am(e) { e.close() } function ac(e) { return e.flags & 33554432 ? e.links.checkFlags : 0 } function Ef(e, t = !1) { if (e.valueDeclaration) { let r = t && e.declarations && wr(e.declarations, Sf) || e.flags & 32768 && wr(e.declarations, p_) || e.valueDeclaration, i = wg(r); return e.parent && e.parent.flags & 32 ? i : i & -29 } if (ac(e) & 6) { let r = e.links.checkFlags, i = r & 1024 ? 8 : r & 256 ? 4 : 16, o = r & 2048 ? 32 : 0; return i | o } return e.flags & 4194304 ? 36 : 0 } function wd(e, t) { return e.flags & 2097152 ? t.getAliasedSymbol(e) : e } function XI(e) { return e.exportSymbol ? e.exportSymbol.flags | e.flags : e.flags } function hW(e) { return ZA(e) === 1 } function YI(e) { return ZA(e) !== 0 } function ZA(e) { let { parent: t } = e; if (!t) return 0; switch (t.kind) { case 214: return ZA(t); case 222: case 221: let { operator: i } = t; return i === 45 || i === 46 ? r() : 0; case 223: let { left: o, operatorToken: s } = t; return o === e && Mg(s.kind) ? s.kind === 63 ? 1 : r() : 0; case 208: return t.name !== e ? 0 : ZA(t); case 299: { let l = ZA(t.parent); return e === t.name ? Kwe(l) : l } case 300: return e === t.objectAssignmentInitializer ? 0 : ZA(t.parent); case 206: return ZA(t); default: return 0 }function r() { return t.parent && qy(t.parent).kind === 241 ? 1 : 2 } } function Kwe(e) { switch (e) { case 0: return 1; case 1: return 0; case 2: return 2; default: return L.assertNever(e) } } function gW(e, t) { if (!e || !t || Object.keys(e).length !== Object.keys(t).length) return !1; for (let r in e) if (typeof e[r] == "object") { if (!gW(e[r], t[r])) return !1 } else if (typeof e[r] != "function" && e[r] !== t[r]) return !1; return !0 } function Tf(e, t) { e.forEach(t), e.clear() } function Oh(e, t, r) { let { onDeleteValue: i, onExistingValue: o } = r; e.forEach((s, l) => { let f = t.get(l); f === void 0 ? (e.delete(l), i(s, l)) : o && o(s, f, l) }) } function e2(e, t, r) { Oh(e, t, r); let { createNewValue: i } = r; t.forEach((o, s) => { e.has(s) || e.set(s, i(s, o)) }) } function cle(e) { if (e.flags & 32) { let t = Nh(e); return !!t && Mr(t, 256) } return !1 } function Nh(e) { var t; return (t = e.declarations) == null ? void 0 : t.find(Yr) } function Ur(e) { return e.flags & 3899393 ? e.objectFlags : 0 } function qwe(e, t) { return !!Th(e, r => t(r) ? !0 : void 0) } function o4(e) { return !!e && !!e.declarations && !!e.declarations[0] && gO(e.declarations[0]) } function lle({ moduleSpecifier: e }) { return yo(e) ? e.text : Qc(e) } function yW(e) { let t; return pa(e, r => { Pf(r) && (t = r) }, r => { for (let i = r.length - 1; i >= 0; i--)if (Pf(r[i])) { t = r[i]; break } }), t } function V_(e, t, r = !0) { return e.has(t) ? !1 : (e.set(t, r), !0) } function yS(e) { return Yr(e) || ku(e) || Rd(e) } function vW(e) { return e >= 179 && e <= 202 || e === 131 || e === 157 || e === 148 || e === 160 || e === 149 || e === 134 || e === 152 || e === 153 || e === 114 || e === 155 || e === 144 || e === 139 || e === 230 || e === 315 || e === 316 || e === 317 || e === 318 || e === 319 || e === 320 || e === 321 } function Us(e) { return e.kind === 208 || e.kind === 209 } function ule(e) { return e.kind === 208 ? e.name : (L.assert(e.kind === 209), e.argumentExpression) } function dle(e) { switch (e.kind) { case "text": case "internal": return !0; default: return !1 } } function bW(e) { return e.kind === 272 || e.kind === 276 } function $I(e) { for (; Us(e);)e = e.expression; return e } function Xwe(e, t) { if (Us(e.parent) && $ce(e)) return r(e.parent); function r(i) { if (i.kind === 208) { let o = t(i.name); if (o !== void 0) return o } else if (i.kind === 209) if (Re(i.argumentExpression) || es(i.argumentExpression)) { let o = t(i.argumentExpression); if (o !== void 0) return o } else return; if (Us(i.expression)) return r(i.expression); if (Re(i.expression)) return t(i.expression) } } function QI(e, t) { for (; ;) { switch (e.kind) { case 222: e = e.operand; continue; case 223: e = e.left; continue; case 224: e = e.condition; continue; case 212: e = e.tag; continue; case 210: if (t) return e; case 231: case 209: case 208: case 232: case 356: case 235: e = e.expression; continue }return e } } function Ywe(e, t) { this.flags = e, this.escapedName = t, this.declarations = void 0, this.valueDeclaration = void 0, this.id = 0, this.mergeId = 0, this.parent = void 0, this.members = void 0, this.exports = void 0, this.exportSymbol = void 0, this.constEnumOnlyModule = void 0, this.isReferenced = void 0, this.isAssigned = void 0, this.links = void 0 } function $we(e, t) { this.flags = t, (L.isDebugging || ai) && (this.checker = e) } function Qwe(e, t) { this.flags = t, L.isDebugging && (this.checker = e) } function EW(e, t, r) { this.pos = t, this.end = r, this.kind = e, this.id = 0, this.flags = 0, this.modifierFlagsCache = 0, this.transformFlags = 0, this.parent = void 0, this.original = void 0, this.emitNode = void 0 } function Zwe(e, t, r) { this.pos = t, this.end = r, this.kind = e, this.id = 0, this.flags = 0, this.transformFlags = 0, this.parent = void 0, this.emitNode = void 0 } function eRe(e, t, r) { this.pos = t, this.end = r, this.kind = e, this.id = 0, this.flags = 0, this.transformFlags = 0, this.parent = void 0, this.original = void 0, this.emitNode = void 0 } function tRe(e, t, r) { this.fileName = e, this.text = t, this.skipTrivia = r || (i => i) } function fle(e) { tz.push(e), e(ml) } function _le(e) { Object.assign(ml, e), mn(tz, t => t(ml)) } function jm(e, t, r = 0) { return e.replace(/{(\d+)}/g, (i, o) => "" + L.checkDefined(t[+o + r])) } function ple(e) { qR = e } function mle(e) { !qR && e && (qR = e()) } function uo(e) { return qR && qR[e.key] || e.message } function t2(e, t, r, i) { gH(void 0, t, r); let o = uo(i); return arguments.length > 4 && (o = jm(o, arguments, 4)), { file: void 0, start: t, length: r, messageText: o, category: i.category, code: i.code, reportsUnnecessary: i.reportsUnnecessary, fileName: e } } function nRe(e) { return e.file === void 0 && e.start !== void 0 && e.length !== void 0 && typeof e.fileName == "string" } function hle(e, t) { let r = t.fileName || "", i = t.text.length; L.assertEqual(e.fileName, r), L.assertLessThanOrEqual(e.start, i), L.assertLessThanOrEqual(e.start + e.length, i); let o = { file: t, start: e.start, length: e.length, messageText: e.messageText, category: e.category, code: e.code, reportsUnnecessary: e.reportsUnnecessary }; if (e.relatedInformation) { o.relatedInformation = []; for (let s of e.relatedInformation) nRe(s) && s.fileName === r ? (L.assertLessThanOrEqual(s.start, i), L.assertLessThanOrEqual(s.start + s.length, i), o.relatedInformation.push(hle(s, t))) : o.relatedInformation.push(s) } return o } function vS(e, t) { let r = []; for (let i of e) r.push(hle(i, t)); return r } function al(e, t, r, i) { gH(e, t, r); let o = uo(i); return arguments.length > 4 && (o = jm(o, arguments, 4)), { file: e, start: t, length: r, messageText: o, category: i.category, code: i.code, reportsUnnecessary: i.reportsUnnecessary, reportsDeprecated: i.reportsDeprecated } } function TW(e, t) { let r = uo(t); return arguments.length > 2 && (r = jm(r, arguments, 2)), r } function ps(e) { let t = uo(e); return arguments.length > 1 && (t = jm(t, arguments, 1)), { file: void 0, start: void 0, length: void 0, messageText: t, category: e.category, code: e.code, reportsUnnecessary: e.reportsUnnecessary, reportsDeprecated: e.reportsDeprecated } } function s4(e, t) { return { file: void 0, start: void 0, length: void 0, code: e.code, category: e.category, messageText: e.next ? e : e.messageText, relatedInformation: t } } function da(e, t) { let r = uo(t); return arguments.length > 2 && (r = jm(r, arguments, 2)), { messageText: r, category: t.category, code: t.code, next: e === void 0 || Array.isArray(e) ? e : [e] } } function gle(e, t) { let r = e; for (; r.next;)r = r.next[0]; r.next = [t] } function yle(e) { return e.file ? e.file.path : void 0 } function ZI(e, t) { return c4(e, t) || rRe(e, t) || 0 } function c4(e, t) { return su(yle(e), yle(t)) || Es(e.start, t.start) || Es(e.length, t.length) || Es(e.code, t.code) || vle(e.messageText, t.messageText) || 0 } function rRe(e, t) { return !e.relatedInformation && !t.relatedInformation ? 0 : e.relatedInformation && t.relatedInformation ? Es(e.relatedInformation.length, t.relatedInformation.length) || mn(e.relatedInformation, (r, i) => { let o = t.relatedInformation[i]; return ZI(r, o) }) || 0 : e.relatedInformation ? -1 : 1 } function vle(e, t) { if (typeof e == "string" && typeof t == "string") return su(e, t); if (typeof e == "string") return -1; if (typeof t == "string") return 1; let r = su(e.messageText, t.messageText); if (r) return r; if (!e.next && !t.next) return 0; if (!e.next) return -1; if (!t.next) return 1; let i = Math.min(e.next.length, t.next.length); for (let o = 0; o < i; o++)if (r = vle(e.next[o], t.next[o]), r) return r; return e.next.length < t.next.length ? -1 : e.next.length > t.next.length ? 1 : 0 } function RR(e) { return e === 4 || e === 2 || e === 1 || e === 6 ? 1 : 0 } function ble(e) { if (e.transformFlags & 2) return Au(e) || BS(e) ? e : pa(e, ble) } function iRe(e) { return e.isDeclarationFile ? void 0 : ble(e) } function aRe(e) { return (e.impliedNodeFormat === 99 || $c(e.fileName, [".cjs", ".cts", ".mjs", ".mts"])) && !e.isDeclarationFile ? !0 : void 0 } function OR(e) { switch (Ele(e)) { case 3: return o => { o.externalModuleIndicator = LO(o) || !o.isDeclarationFile || void 0 }; case 1: return o => { o.externalModuleIndicator = LO(o) }; case 2: let t = [LO]; (e.jsx === 4 || e.jsx === 5) && t.push(iRe), t.push(aRe); let r = Kp(...t); return o => void (o.externalModuleIndicator = r(o)) } } function Do(e) { var t; return (t = e.target) != null ? t : e.module === 100 && 9 || e.module === 199 && 99 || 1 } function Rl(e) { return typeof e.module == "number" ? e.module : Do(e) >= 2 ? 5 : 1 } function SW(e) { return e >= 5 && e <= 99 } function $s(e) { let t = e.moduleResolution; if (t === void 0) switch (Rl(e)) { case 1: t = 2; break; case 100: t = 3; break; case 199: t = 99; break; default: t = 1; break }return t } function Ele(e) { return e.moduleDetection || (Rl(e) === 100 || Rl(e) === 199 ? 3 : 2) } function l4(e) { switch (Rl(e)) { case 1: case 2: case 5: case 6: case 7: case 99: case 100: case 199: return !0; default: return !1 } } function d_(e) { return !!(e.isolatedModules || e.verbatimModuleSyntax) } function u4(e) { return e.verbatimModuleSyntax || e.isolatedModules && e.preserveValueImports } function Tle(e) { return e.allowUnreachableCode === !1 } function Sle(e) { return e.allowUnusedLabels === !1 } function d4(e) { return !!(__(e) && e.declarationMap) } function f_(e) { if (e.esModuleInterop !== void 0) return e.esModuleInterop; switch (Rl(e)) { case 100: case 199: return !0 } } function wT(e) { return e.allowSyntheticDefaultImports !== void 0 ? e.allowSyntheticDefaultImports : f_(e) || Rl(e) === 4 || $s(e) === 100 } function bS(e) { return e >= 3 && e <= 99 || e === 100 } function xW(e) { let t = $s(e); if (!bS(t)) return !1; if (e.resolvePackageJsonExports !== void 0) return e.resolvePackageJsonExports; switch (t) { case 3: case 99: case 100: return !0 }return !1 } function oRe(e) { let t = $s(e); if (!bS(t)) return !1; if (e.resolvePackageJsonExports !== void 0) return e.resolvePackageJsonExports; switch (t) { case 3: case 99: case 100: return !0 }return !1 } function RT(e) { return e.resolveJsonModule !== void 0 ? e.resolveJsonModule : $s(e) === 100 } function __(e) { return !!(e.declaration || e.composite) } function U0(e) { return !!(e.preserveConstEnums || d_(e)) } function NR(e) { return !!(e.incremental || e.composite) } function Uf(e, t) { return e[t] === void 0 ? !!e.strict : !!e[t] } function PR(e) { return e.allowJs === void 0 ? !!e.checkJs : e.allowJs } function MR(e) { return e.useDefineForClassFields === void 0 ? Do(e) >= 9 : e.useDefineForClassFields } function xle(e, t) { return LA(t, e, PJ) } function Ale(e, t) { return LA(t, e, MJ) } function Cle(e, t) { return LA(t, e, FJ) } function f4(e, t) { return t.strictFlag ? Uf(e, t.name) : e[t.name] } function AW(e) { let t = e.jsx; return t === 2 || t === 4 || t === 5 } function _4(e, t) { let r = t?.pragmas.get("jsximportsource"), i = ba(r) ? r[r.length - 1] : r; return e.jsx === 4 || e.jsx === 5 || e.jsxImportSource || i ? i?.arguments.factory || e.jsxImportSource || "react" : void 0 } function p4(e, t) { return e ? `${e}/${t.jsx === 5 ? "jsx-dev-runtime" : "jsx-runtime"}` : void 0 } function CW(e) { let t = !1; for (let r = 0; r < e.length; r++)if (e.charCodeAt(r) === 42) if (!t) t = !0; else return !1; return !0 } function Ile(e, t) { let r, i, o, s = !1; return { getSymlinkedFiles: () => o, getSymlinkedDirectories: () => r, getSymlinkedDirectoriesByRealpath: () => i, setSymlinkedFile: (f, d) => (o || (o = new Map)).set(f, d), setSymlinkedDirectory: (f, d) => { let g = Ts(f, e, t); sL(g) || (g = cu(g), d !== !1 && !r?.has(g) && (i || (i = Nf())).add(cu(d.realPath), f), (r || (r = new Map)).set(g, d)) }, setSymlinksFromResolutions(f, d) { var g, m; L.assert(!s), s = !0; for (let v of f) (g = v.resolvedModules) == null || g.forEach(S => l(this, S.resolvedModule)), (m = v.resolvedTypeReferenceDirectiveNames) == null || m.forEach(S => l(this, S.resolvedTypeReferenceDirective)); d.forEach(v => l(this, v.resolvedTypeReferenceDirective)) }, hasProcessedResolutions: () => s }; function l(f, d) { if (!d || !d.originalPath || !d.resolvedFileName) return; let { resolvedFileName: g, originalPath: m } = d; f.setSymlinkedFile(Ts(m, e, t), g); let [v, S] = sRe(g, m, e, t) || Je; v && S && f.setSymlinkedDirectory(S, { real: v, realPath: Ts(v, e, t) }) } } function sRe(e, t, r, i) { let o = Ou(_a(e, r)), s = Ou(_a(t, r)), l = !1; for (; o.length >= 2 && s.length >= 2 && !Lle(o[o.length - 2], i) && !Lle(s[s.length - 2], i) && i(o[o.length - 1]) === i(s[s.length - 1]);)o.pop(), s.pop(), l = !0; return l ? [T0(o), T0(s)] : void 0 } function Lle(e, t) { return e !== void 0 && (t(e) === "node_modules" || na(e, "@")) } function cRe(e) { return sj(e.charCodeAt(0)) ? e.slice(1) : void 0 } function IW(e, t, r) { let i = KU(e, t, r); return i === void 0 ? void 0 : cRe(i) } function lRe(e) { return e.replace(A4, uRe) } function uRe(e) { return "\\" + e } function eL(e, t, r) { let i = m4(e, t, r); return !i || !i.length ? void 0 : `^(${i.map(l => `(${l})`).join("|")})${r === "exclude" ? "($|/)" : "$"}` } function m4(e, t, r) { if (!(e === void 0 || e.length === 0)) return Uo(e, i => i && kle(i, t, r, oz[r])) } function LW(e) { return !/[.*?]/.test(e) } function kW(e, t, r) { let i = e && kle(e, t, r, oz[r]); return i && `^(${i})${r === "exclude" ? "($|/)" : "$"}` } function kle(e, t, r, { singleAsteriskRegexFragment: i, doubleAsteriskRegexFragment: o, replaceWildcardCharacter: s }) { let l = "", f = !1, d = fw(e, t), g = To(d); if (r !== "exclude" && g === "**") return; d[0] = sT(d[0]), LW(g) && d.push("**", "*"); let m = 0; for (let v of d) { if (v === "**") l += o; else if (r === "directories" && (l += "(", m++), f && (l += _s), r !== "exclude") { let S = ""; v.charCodeAt(0) === 42 ? (S += "([^./]" + i + ")?", v = v.substr(1)) : v.charCodeAt(0) === 63 && (S += "[^./]", v = v.substr(1)), S += v.replace(A4, s), S !== v && (l += C4), l += S } else l += v.replace(A4, s); f = !0 } for (; m > 0;)l += ")?", m--; return l } function DW(e, t) { return e === "*" ? t : e === "?" ? "[^/]" : "\\" + e } function tL(e, t, r, i, o) { e = So(e), o = So(o); let s = vi(o, e); return { includeFilePatterns: on(m4(r, s, "files"), l => `^${l}$`), includeFilePattern: eL(r, s, "files"), includeDirectoryPattern: eL(r, s, "directories"), excludePattern: eL(t, s, "exclude"), basePaths: dRe(e, r, i) } } function Qy(e, t) { return new RegExp(e, t ? "" : "i") } function wW(e, t, r, i, o, s, l, f, d) { e = So(e), s = So(s); let g = tL(e, r, i, o, s), m = g.includeFilePatterns && g.includeFilePatterns.map(P => Qy(P, o)), v = g.includeDirectoryPattern && Qy(g.includeDirectoryPattern, o), S = g.excludePattern && Qy(g.excludePattern, o), x = m ? m.map(() => []) : [[]], A = new Map, w = Dl(o); for (let P of g.basePaths) C(P, vi(s, P), l); return t_(x); function C(P, F, B) { let q = w(d(F)); if (A.has(q)) return; A.set(q, !0); let { files: W, directories: Y } = f(P); for (let R of XC(W, su)) { let ie = vi(P, R), $ = vi(F, R); if (!(t && !$c(ie, t)) && !(S && S.test($))) if (!m) x[0].push(ie); else { let fe = Yc(m, Z => Z.test($)); fe !== -1 && x[fe].push(ie) } } if (!(B !== void 0 && (B--, B === 0))) for (let R of XC(Y, su)) { let ie = vi(P, R), $ = vi(F, R); (!v || v.test($)) && (!S || !S.test($)) && C(ie, $, B) } } } function dRe(e, t, r) { let i = [e]; if (t) { let o = []; for (let s of t) { let l = qp(s) ? s : So(vi(e, s)); o.push(fRe(l)) } o.sort(p8(!r)); for (let s of o) Ji(i, l => !Gy(l, s, e, !r)) && i.push(s) } return i } function fRe(e) { let t = cae(e, nue); return t < 0 ? gA(e) ? sT(ni(e)) : e : e.substring(0, e.lastIndexOf(_s, t)) } function h4(e, t) { return t || RW(e) || 3 } function RW(e) { switch (e.substr(e.lastIndexOf(".")).toLowerCase()) { case ".js": case ".cjs": case ".mjs": return 1; case ".jsx": return 2; case ".ts": case ".cts": case ".mts": return 3; case ".tsx": return 4; case ".json": return 6; default: return 0 } } function nL(e, t) { let r = e && PR(e); if (!t || t.length === 0) return r ? XR : c2; let i = r ? XR : c2, o = t_(i); return [...i, ...Zi(t, l => l.scriptKind === 7 || r && _Re(l.scriptKind) && o.indexOf(l.extension) === -1 ? [l.extension] : void 0)] } function FR(e, t) { return !e || !RT(e) ? t : t === XR ? aue : t === c2 ? rue : [...t, [".json"]] } function _Re(e) { return e === 1 || e === 2 } function ES(e) { return vt(dL, t => Gc(e, t)) } function GR(e) { return vt(sz, t => Gc(e, t)) } function Dle({ imports: e }, t = Kp(ES, GR)) { return ks(e, ({ text: r }) => Jd(r) ? t(r) : void 0) || !1 } function OW(e, t, r, i) { if (e === "js" || t === 99) return VL(r) && o() !== 2 ? 3 : 2; if (e === "minimal") return 0; if (e === "index") return 1; if (!VL(r)) return Dle(i) ? 2 : 0; return o(); function o() { let s = !1, l = i.imports.length ? i.imports.map(f => f.text) : Cu(i) ? pRe(i).map(f => f.arguments[0].text) : Je; for (let f of l) if (Jd(f)) { if (GR(f)) return 3; ES(f) && (s = !0) } return s ? 2 : 0 } } function pRe(e) { let t = 0, r; for (let i of e.statements) { if (t > 3) break; DH(i) ? r = Qi(r, i.declarationList.declarations.map(o => o.initializer)) : Ol(i) && qu(i.expression, !0) ? r = Sn(r, i.expression) : t++ } return r || Je } function wle(e, t, r) { if (!e) return !1; let i = nL(t, r); for (let o of t_(FR(t, i))) if (Gc(e, o)) return !0; return !1 } function Rle(e) { let t = e.match(/\//g); return t ? t.length : 0 } function BR(e, t) { return Es(Rle(e), Rle(t)) } function ld(e) { for (let t of k4) { let r = Ole(e, t); if (r !== void 0) return r } return e } function Ole(e, t) { return Gc(e, t) ? UR(e, t) : void 0 } function UR(e, t) { return e.substring(0, e.length - t.length) } function V0(e, t) { return uj(e, t, k4, !1) } function n2(e) { let t = e.indexOf("*"); return t === -1 ? e : e.indexOf("*", t + 1) !== -1 ? void 0 : { prefix: e.substr(0, t), suffix: e.substr(t + 1) } } function g4(e) { return Zi(bh(e), t => n2(t)) } function vp(e) { return !(e >= 0) } function y4(e) { return e === ".ts" || e === ".tsx" || e === ".d.ts" || e === ".cts" || e === ".mts" || e === ".d.mts" || e === ".d.cts" || na(e, ".d.") && Oc(e, ".ts") } function VR(e) { return y4(e) || e === ".json" } function jR(e) { let t = Hm(e); return t !== void 0 ? t : L.fail(`File ${e} has unknown extension.`) } function mRe(e) { return Hm(e) !== void 0 } function Hm(e) { return wr(k4, t => Gc(e, t)) } function HR(e, t) { return e.checkJsDirective ? e.checkJsDirective.enabled : t.checkJs } function NW(e, t) { let r = []; for (let i of e) { if (i === t) return t; Ta(i) || r.push(i) } return JU(r, i => i, t) } function PW(e, t) { let r = e.indexOf(t); return L.assert(r !== -1), e.slice(r) } function Ao(e, ...t) { return t.length && (e.relatedInformation || (e.relatedInformation = []), L.assert(e.relatedInformation !== Je, "Diagnostic had empty array singleton for related info, but is still being constructed!"), e.relatedInformation.push(...t)), e } function Nle(e, t) { L.assert(e.length !== 0); let r = t(e[0]), i = r; for (let o = 1; o < e.length; o++) { let s = t(e[o]); s < r ? r = s : s > i && (i = s) } return { min: r, max: i } } function MW(e) { return { pos: gT(e), end: e.end } } function FW(e, t) { let r = t.pos - 1, i = Math.min(e.text.length, xo(e.text, t.end) + 1); return { pos: r, end: i } } function rL(e, t, r) { return t.skipLibCheck && e.isDeclarationFile || t.skipDefaultLibCheck && e.hasNoDefaultLib || r.isSourceOfProjectReferenceRedirect(e.fileName) } function GW(e, t) { return e === t || typeof e == "object" && e !== null && typeof t == "object" && t !== null && hae(e, t, GW) } function iL(e) { let t; switch (e.charCodeAt(1)) { case 98: case 66: t = 1; break; case 111: case 79: t = 3; break; case 120: case 88: t = 4; break; default: let g = e.length - 1, m = 0; for (; e.charCodeAt(m) === 48;)m++; return e.slice(m, g) || "0" }let r = 2, i = e.length - 1, o = (i - r) * t, s = new Uint16Array((o >>> 4) + (o & 15 ? 1 : 0)); for (let g = i - 1, m = 0; g >= r; g--, m += t) { let v = m >>> 4, S = e.charCodeAt(g), A = (S <= 57 ? S - 48 : 10 + S - (S <= 70 ? 65 : 97)) << (m & 15); s[v] |= A; let w = A >>> 16; w && (s[v + 1] |= w) } let l = "", f = s.length - 1, d = !0; for (; d;) { let g = 0; d = !1; for (let m = f; m >= 0; m--) { let v = g << 16 | s[m], S = v / 10 | 0; s[m] = S, g = v - S * 10, S && !d && (f = m, d = !0) } l = g + l } return l } function j0({ negative: e, base10Value: t }) { return (e && t !== "0" ? "-" : "") + t } function Ple(e) { if (v4(e, !1)) return BW(e) } function BW(e) { let t = e.startsWith("-"), r = iL(`${t ? e.slice(1) : e}n`); return { negative: t, base10Value: r } } function v4(e, t) { if (e === "") return !1; let r = kg(99, !1), i = !0; r.setOnError(() => i = !1), r.setText(e + "n"); let o = r.scan(), s = o === 40; s && (o = r.scan()); let l = r.getTokenFlags(); return i && o === 9 && r.getTextPos() === e.length + 1 && !(l & 512) && (!t || e === j0({ negative: s, base10Value: iL(r.getTokenValue()) })) } function TS(e) { return !!(e.flags & 16777216) || G6(e) || yRe(e) || gRe(e) || !(Dh(e) || hRe(e)) } function hRe(e) { return Re(e) && xf(e.parent) && e.parent.name === e } function gRe(e) { for (; e.kind === 79 || e.kind === 208;)e = e.parent; if (e.kind !== 164) return !1; if (Mr(e.parent, 256)) return !0; let t = e.parent.parent.kind; return t === 261 || t === 184 } function yRe(e) { if (e.kind !== 79) return !1; let t = jn(e.parent, r => { switch (r.kind) { case 294: return !0; case 208: case 230: return !1; default: return "quit" } }); return t?.token === 117 || t?.parent.kind === 261 } function Mle(e) { return m_(e) && Re(e.typeName) } function Fle(e, t = Zv) { if (e.length < 2) return !0; let r = e[0]; for (let i = 1, o = e.length; i < o; i++) { let s = e[i]; if (!t(r, s)) return !1 } return !0 } function aL(e, t) { return e.pos = t, e } function r2(e, t) { return e.end = t, e } function om(e, t, r) { return r2(aL(e, t), r) } function oL(e, t, r) { return om(e, t, t + r) } function Gle(e, t) { return e && (e.flags = t), e } function go(e, t) { return e && t && (e.parent = t), e } function i2(e, t) { if (e) for (let r of e) go(r, t); return e } function Zy(e, t) { if (!e) return e; return kO(e, IA(e) ? r : o), e; function r(s, l) { if (t && s.parent === l) return "skip"; go(s, l) } function i(s) { if (Kd(s)) for (let l of s.jsDoc) r(l, s), kO(l, r) } function o(s, l) { return r(s, l) || i(s) } } function vRe(e) { return !ol(e) } function UW(e) { return fu(e) && Ji(e.elements, vRe) } function Ble(e) { for (L.assertIsDefined(e.parent); ;) { let t = e.parent; if (ud(t)) { e = t; continue } if (Ol(t) || NS(t) || FT(t) && (t.initializer === e || t.incrementor === e)) return !0; if (SL(t)) { if (e !== To(t.elements)) return !0; e = t; continue } if (ar(t) && t.operatorToken.kind === 27) { if (e === t.left) return !0; e = t; continue } return !1 } } function sL(e) { return vt(uw, t => jl(e, t)) } function Ule(e) { if (!e.parent) return; switch (e.kind) { case 165: let { parent: r } = e; return r.kind === 192 ? void 0 : r.typeParameters; case 166: return e.parent.parameters; case 201: return e.parent.templateSpans; case 236: return e.parent.templateSpans; case 167: { let { parent: i } = e; return HS(i) ? i.modifiers : void 0 } case 294: return e.parent.heritageClauses }let { parent: t } = e; if (EI(e)) return LL(e.parent) ? void 0 : e.parent.tags; switch (t.kind) { case 184: case 261: return _T(e) ? t.members : void 0; case 189: case 190: return t.types; case 186: case 206: case 357: case 272: case 276: return t.elements; case 207: case 289: return t.properties; case 210: case 211: return bi(e) ? t.typeArguments : t.expression === e ? void 0 : t.arguments; case 281: case 285: return Pw(e) ? t.children : void 0; case 283: case 282: return bi(e) ? t.typeArguments : void 0; case 238: case 292: case 293: case 265: return t.statements; case 266: return t.clauses; case 260: case 228: return _l(e) ? t.members : void 0; case 263: return q0(e) ? t.members : void 0; case 308: return t.statements } } function b4(e) { if (!e.typeParameters) { if (vt(e.parameters, t => !Cl(t))) return !0; if (e.kind !== 216) { let t = Sl(e.parameters); if (!(t && G0(t))) return !0 } } return !1 } function cL(e) { return e === "Infinity" || e === "-Infinity" || e === "NaN" } function Vle(e) { return e.kind === 257 && e.parent.kind === 295 } function VW(e) { let t = e.valueDeclaration && nm(e.valueDeclaration); return !!t && (ha(t) || Vle(t)) } function a2(e) { return e.kind === 215 || e.kind === 216 } function OT(e) { return e.replace(/\$/gm, () => "\\$") } function Wm(e) { return (+e).toString() === e } function E4(e, t, r, i) { return i_(e, t) ? D.createIdentifier(e) : !i && Wm(e) && +e >= 0 ? D.createNumericLiteral(+e) : D.createStringLiteral(e, !!r) } function lL(e) { return !!(e.flags & 262144 && e.isThisType) } function jW(e) { let t = 0, r = 0, i = 0, o = 0, s; (g => { g[g.BeforeNodeModules = 0] = "BeforeNodeModules", g[g.NodeModules = 1] = "NodeModules", g[g.Scope = 2] = "Scope", g[g.PackageContent = 3] = "PackageContent" })(s || (s = {})); let l = 0, f = 0, d = 0; for (; f >= 0;)switch (l = f, f = e.indexOf("/", l + 1), d) { case 0: e.indexOf(Wg, l) === l && (t = l, r = f, d = 1); break; case 1: case 2: d === 1 && e.charAt(l + 1) === "@" ? d = 2 : (i = f, d = 3); break; case 3: e.indexOf(Wg, l) === l ? d = 1 : d = 3; break }return o = l, d > 1 ? { topLevelNodeModulesIndex: t, topLevelPackageNameIndex: r, packageRootIndex: i, fileNameIndex: o } : void 0 } function bRe(e) { var t; return e.kind === 344 ? (t = e.typeExpression) == null ? void 0 : t.type : e.type } function o2(e) { switch (e.kind) { case 165: case 260: case 261: case 262: case 263: case 349: case 341: case 343: return !0; case 270: return e.isTypeOnly; case 273: case 278: return e.parent.parent.isTypeOnly; default: return !1 } } function WR(e) { return hb(e) || Bc(e) || Jc(e) || sl(e) || ku(e) || o2(e) || Tc(e) && !D0(e) && !mp(e) } function zR(e) { if (!a6(e)) return !1; let { isBracketed: t, typeExpression: r } = e; return t || !!r && r.type.kind === 319 } function HW(e, t) { if (e.length === 0) return !1; let r = e.charCodeAt(0); return r === 35 ? e.length > 1 && Pm(e.charCodeAt(1), t) : Pm(r, t) } function jle(e) { var t; return ((t = bz(e)) == null ? void 0 : t.kind) === 0 } function JR(e) { return Yn(e) && (e.type && e.type.kind === 319 || fI(e).some(({ isBracketed: t, typeExpression: r }) => t || !!r && r.type.kind === 319)) } function WW(e) { switch (e.kind) { case 169: case 168: return !!e.questionToken; case 166: return !!e.questionToken || JR(e); case 351: case 344: return zR(e); default: return !1 } } function Hle(e) { let t = e.kind; return (t === 208 || t === 209) && PS(e.expression) } function zW(e) { return Yn(e) && ud(e) && Kd(e) && !!Lj(e) } function JW(e) { return L.checkDefined(T4(e)) } function T4(e) { let t = Lj(e); return t && t.typeExpression && t.typeExpression.type } var S4, _b, KR, x4, uL, KW, qW, Wle, XW, zle, YW, $W, QW, ZW, Jle, Kle, qle, Xle, Yle, ez, $le, Qle, Zle, s2, H0, eue, tue, ml, tz, qR, A4, nue, nz, C4, rz, iz, az, oz, c2, sz, rue, iue, cz, dL, XR, aue, I4, L4, lz, k4, D4, ERe = gt({
+                "src/compiler/utilities.ts"() {
+                    "use strict"; fa(), S4 = [], _b = "tslib", KR = 160, x4 = 1e6, uL = rwe(), KW = (e => (e[e.None = 0] = "None", e[e.NeverAsciiEscape = 1] = "NeverAsciiEscape", e[e.JsxAttributeEscape = 2] = "JsxAttributeEscape", e[e.TerminateUnterminatedLiterals = 4] = "TerminateUnterminatedLiterals", e[e.AllowNumericSeparator = 8] = "AllowNumericSeparator", e))(KW || {}), qW = /^(\/\/\/\s*<reference\s+path\s*=\s*)(('[^']*')|("[^"]*")).*?\/>/, Wle = /^(\/\/\/\s*<reference\s+types\s*=\s*)(('[^']*')|("[^"]*")).*?\/>/, XW = /^(\/\/\/\s*<amd-dependency\s+path\s*=\s*)(('[^']*')|("[^"]*")).*?\/>/, zle = /^(\/\/\/\s*<reference\s+no-default-lib\s*=\s*)(('[^']*')|("[^"]*"))\s*\/>/, YW = (e => (e[e.None = 0] = "None", e[e.Definite = 1] = "Definite", e[e.Compound = 2] = "Compound", e))(YW || {}), $W = (e => (e[e.Normal = 0] = "Normal", e[e.Generator = 1] = "Generator", e[e.Async = 2] = "Async", e[e.Invalid = 4] = "Invalid", e[e.AsyncGenerator = 3] = "AsyncGenerator", e))($W || {}), QW = (e => (e[e.Left = 0] = "Left", e[e.Right = 1] = "Right", e))(QW || {}), ZW = (e => (e[e.Comma = 0] = "Comma", e[e.Spread = 1] = "Spread", e[e.Yield = 2] = "Yield", e[e.Assignment = 3] = "Assignment", e[e.Conditional = 4] = "Conditional", e[e.Coalesce = 4] = "Coalesce", e[e.LogicalOR = 5] = "LogicalOR", e[e.LogicalAND = 6] = "LogicalAND", e[e.BitwiseOR = 7] = "BitwiseOR", e[e.BitwiseXOR = 8] = "BitwiseXOR", e[e.BitwiseAND = 9] = "BitwiseAND", e[e.Equality = 10] = "Equality", e[e.Relational = 11] = "Relational", e[e.Shift = 12] = "Shift", e[e.Additive = 13] = "Additive", e[e.Multiplicative = 14] = "Multiplicative", e[e.Exponentiation = 15] = "Exponentiation", e[e.Unary = 16] = "Unary", e[e.Update = 17] = "Update", e[e.LeftHandSide = 18] = "LeftHandSide", e[e.Member = 19] = "Member", e[e.Primary = 20] = "Primary", e[e.Highest = 20] = "Highest", e[e.Lowest = 0] = "Lowest", e[e.Invalid = -1] = "Invalid", e))(ZW || {}), Jle = /\$\{/g, Kle = /[\\\"\u0000-\u001f\t\v\f\b\r\n\u2028\u2029\u0085]/g, qle = /[\\\'\u0000-\u001f\t\v\f\b\r\n\u2028\u2029\u0085]/g, Xle = /\r\n|[\\\`\u0000-\u001f\t\v\f\b\r\u2028\u2029\u0085]/g, Yle = new Map(Object.entries({ "	": "\\t", "\v": "\\v", "\f": "\\f", "\b": "\\b", "\r": "\\r", "\n": "\\n", "\\": "\\\\", '"': '\\"', "'": "\\'", "`": "\\`", "\u2028": "\\u2028", "\u2029": "\\u2029", "\x85": "\\u0085", "\r\n": "\\r\\n" })), ez = /[^\u0000-\u007F]/g, $le = /[\"\u0000-\u001f\u2028\u2029\u0085]/g, Qle = /[\'\u0000-\u001f\u2028\u2029\u0085]/g, Zle = new Map(Object.entries({ '"': "&quot;", "'": "&apos;" })), s2 = ["", "    "], H0 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", eue = `\r
+`, tue = `
+`, ml = { getNodeConstructor: () => EW, getTokenConstructor: () => Zwe, getIdentifierConstructor: () => eRe, getPrivateIdentifierConstructor: () => EW, getSourceFileConstructor: () => EW, getSymbolConstructor: () => Ywe, getTypeConstructor: () => $we, getSignatureConstructor: () => Qwe, getSourceMapSourceConstructor: () => tRe }, tz = [], A4 = /[^\w\s\/]/g, nue = [42, 63], nz = ["node_modules", "bower_components", "jspm_packages"], C4 = `(?!(${nz.join("|")})(/|$))`, rz = { singleAsteriskRegexFragment: "([^./]|(\\.(?!min\\.js$))?)*", doubleAsteriskRegexFragment: `(/${C4}[^/.][^/]*)*?`, replaceWildcardCharacter: e => DW(e, rz.singleAsteriskRegexFragment) }, iz = { singleAsteriskRegexFragment: "[^/]*", doubleAsteriskRegexFragment: `(/${C4}[^/.][^/]*)*?`, replaceWildcardCharacter: e => DW(e, iz.singleAsteriskRegexFragment) }, az = { singleAsteriskRegexFragment: "[^/]*", doubleAsteriskRegexFragment: "(/.+?)?", replaceWildcardCharacter: e => DW(e, az.singleAsteriskRegexFragment) }, oz = { files: rz, directories: iz, exclude: az }, c2 = [[".ts", ".tsx", ".d.ts"], [".cts", ".d.cts"], [".mts", ".d.mts"]], sz = t_(c2), rue = [...c2, [".json"]], iue = [".d.ts", ".d.cts", ".d.mts", ".cts", ".mts", ".ts", ".tsx", ".cts", ".mts"], cz = [[".js", ".jsx"], [".mjs"], [".cjs"]], dL = t_(cz), XR = [[".ts", ".tsx", ".d.ts", ".js", ".jsx"], [".cts", ".d.cts", ".cjs"], [".mts", ".d.mts", ".mjs"]], aue = [...XR, [".json"]], I4 = [".d.ts", ".d.cts", ".d.mts"], L4 = [".ts", ".cts", ".mts", ".tsx"], lz = (e => (e[e.Minimal = 0] = "Minimal", e[e.Index = 1] = "Index", e[e.JsExtension = 2] = "JsExtension", e[e.TsExtension = 3] = "TsExtension", e))(lz || {}), k4 = [".d.ts", ".d.mts", ".d.cts", ".mjs", ".mts", ".cjs", ".cts", ".ts", ".js", ".tsx", ".jsx", ".json"], D4 = { files: Je, directories: Je }
+                }
+            }); function oue() { let e, t, r, i, o; return { createBaseSourceFileNode: s, createBaseIdentifierNode: l, createBasePrivateIdentifierNode: f, createBaseTokenNode: d, createBaseNode: g }; function s(m) { return new (o || (o = ml.getSourceFileConstructor()))(m, -1, -1) } function l(m) { return new (r || (r = ml.getIdentifierConstructor()))(m, -1, -1) } function f(m) { return new (i || (i = ml.getPrivateIdentifierConstructor()))(m, -1, -1) } function d(m) { return new (t || (t = ml.getTokenConstructor()))(m, -1, -1) } function g(m) { return new (e || (e = ml.getNodeConstructor()))(m, -1, -1) } } var TRe = gt({ "src/compiler/factory/baseNodeFactory.ts"() { "use strict"; fa() } }); function sue(e) { let t, r; return { getParenthesizeLeftSideOfBinaryForOperator: i, getParenthesizeRightSideOfBinaryForOperator: o, parenthesizeLeftSideOfBinary: g, parenthesizeRightSideOfBinary: m, parenthesizeExpressionOfComputedPropertyName: v, parenthesizeConditionOfConditionalExpression: S, parenthesizeBranchOfConditionalExpression: x, parenthesizeExpressionOfExportDefault: A, parenthesizeExpressionOfNew: w, parenthesizeLeftSideOfAccess: C, parenthesizeOperandOfPostfixUnary: P, parenthesizeOperandOfPrefixUnary: F, parenthesizeExpressionsOfCommaDelimitedList: B, parenthesizeExpressionForDisallowedComma: q, parenthesizeExpressionOfExpressionStatement: W, parenthesizeConciseBodyOfArrowFunction: Y, parenthesizeCheckTypeOfConditionalType: R, parenthesizeExtendsTypeOfConditionalType: ie, parenthesizeConstituentTypesOfUnionType: fe, parenthesizeConstituentTypeOfUnionType: $, parenthesizeConstituentTypesOfIntersectionType: U, parenthesizeConstituentTypeOfIntersectionType: Z, parenthesizeOperandOfTypeOperator: re, parenthesizeOperandOfReadonlyTypeOperator: le, parenthesizeNonArrayTypeOfPostfixType: _e, parenthesizeElementTypesOfTupleType: ge, parenthesizeElementTypeOfTupleType: X, parenthesizeTypeOfOptionalType: we, parenthesizeTypeArguments: Ce, parenthesizeLeadingTypeArgument: ke }; function i(Ie) { t || (t = new Map); let Be = t.get(Ie); return Be || (Be = Ne => g(Ie, Ne), t.set(Ie, Be)), Be } function o(Ie) { r || (r = new Map); let Be = r.get(Ie); return Be || (Be = Ne => m(Ie, void 0, Ne), r.set(Ie, Be)), Be } function s(Ie, Be, Ne, Le) { let Ye = yR(223, Ie), _t = zH(223, Ie), ct = a_(Be); if (!Ne && Be.kind === 216 && Ye > 3) return !0; let Rt = $6(ct); switch (Es(Rt, Ye)) { case -1: return !(!Ne && _t === 1 && Be.kind === 226); case 1: return !1; case 0: if (Ne) return _t === 1; if (ar(ct) && ct.operatorToken.kind === Ie) { if (l(Ie)) return !1; if (Ie === 39) { let qe = Le ? f(Le) : 0; if (gI(qe) && qe === f(ct)) return !1 } } return WH(ct) === 0 } } function l(Ie) { return Ie === 41 || Ie === 51 || Ie === 50 || Ie === 52 || Ie === 27 } function f(Ie) { if (Ie = a_(Ie), gI(Ie.kind)) return Ie.kind; if (Ie.kind === 223 && Ie.operatorToken.kind === 39) { if (Ie.cachedLiteralKind !== void 0) return Ie.cachedLiteralKind; let Be = f(Ie.left), Ne = gI(Be) && Be === f(Ie.right) ? Be : 0; return Ie.cachedLiteralKind = Ne, Ne } return 0 } function d(Ie, Be, Ne, Le) { return a_(Be).kind === 214 ? Be : s(Ie, Be, Ne, Le) ? e.createParenthesizedExpression(Be) : Be } function g(Ie, Be) { return d(Ie, Be, !0) } function m(Ie, Be, Ne) { return d(Ie, Ne, !1, Be) } function v(Ie) { return wL(Ie) ? e.createParenthesizedExpression(Ie) : Ie } function S(Ie) { let Be = yR(224, 57), Ne = a_(Ie), Le = $6(Ne); return Es(Le, Be) !== 1 ? e.createParenthesizedExpression(Ie) : Ie } function x(Ie) { let Be = a_(Ie); return wL(Be) ? e.createParenthesizedExpression(Ie) : Ie } function A(Ie) { let Be = a_(Ie), Ne = wL(Be); if (!Ne) switch (QI(Be, !1).kind) { case 228: case 215: Ne = !0 }return Ne ? e.createParenthesizedExpression(Ie) : Ie } function w(Ie) { let Be = QI(Ie, !0); switch (Be.kind) { case 210: return e.createParenthesizedExpression(Ie); case 211: return Be.arguments ? Ie : e.createParenthesizedExpression(Ie) }return C(Ie) } function C(Ie, Be) { let Ne = a_(Ie); return Ju(Ne) && (Ne.kind !== 211 || Ne.arguments) && (Be || !Jl(Ne)) ? Ie : it(e.createParenthesizedExpression(Ie), Ie) } function P(Ie) { return Ju(Ie) ? Ie : it(e.createParenthesizedExpression(Ie), Ie) } function F(Ie) { return jj(Ie) ? Ie : it(e.createParenthesizedExpression(Ie), Ie) } function B(Ie) { let Be = Tl(Ie, q); return it(e.createNodeArray(Be, Ie.hasTrailingComma), Ie) } function q(Ie) { let Be = a_(Ie), Ne = $6(Be), Le = yR(223, 27); return Ne > Le ? Ie : it(e.createParenthesizedExpression(Ie), Ie) } function W(Ie) { let Be = a_(Ie); if (Pa(Be)) { let Le = Be.expression, Ye = a_(Le).kind; if (Ye === 215 || Ye === 216) { let _t = e.updateCallExpression(Be, it(e.createParenthesizedExpression(Le), Le), Be.typeArguments, Be.arguments); return e.restoreOuterExpressions(Ie, _t, 8) } } let Ne = QI(Be, !1).kind; return Ne === 207 || Ne === 215 ? it(e.createParenthesizedExpression(Ie), Ie) : Ie } function Y(Ie) { return !Va(Ie) && (wL(Ie) || QI(Ie, !1).kind === 207) ? it(e.createParenthesizedExpression(Ie), Ie) : Ie } function R(Ie) { switch (Ie.kind) { case 181: case 182: case 191: return e.createParenthesizedType(Ie) }return Ie } function ie(Ie) { switch (Ie.kind) { case 191: return e.createParenthesizedType(Ie) }return Ie } function $(Ie) { switch (Ie.kind) { case 189: case 190: return e.createParenthesizedType(Ie) }return R(Ie) } function fe(Ie) { return e.createNodeArray(Tl(Ie, $)) } function Z(Ie) { switch (Ie.kind) { case 189: case 190: return e.createParenthesizedType(Ie) }return $(Ie) } function U(Ie) { return e.createNodeArray(Tl(Ie, Z)) } function re(Ie) { switch (Ie.kind) { case 190: return e.createParenthesizedType(Ie) }return Z(Ie) } function le(Ie) { switch (Ie.kind) { case 195: return e.createParenthesizedType(Ie) }return re(Ie) } function _e(Ie) { switch (Ie.kind) { case 192: case 195: case 183: return e.createParenthesizedType(Ie) }return re(Ie) } function ge(Ie) { return e.createNodeArray(Tl(Ie, X)) } function X(Ie) { return Ve(Ie) ? e.createParenthesizedType(Ie) : Ie } function Ve(Ie) { return T2(Ie) ? Ie.postfix : bL(Ie) || Jm(Ie) || yL(Ie) || RS(Ie) ? Ve(Ie.type) : m2(Ie) ? Ve(Ie.falseType) : DS(Ie) || dO(Ie) ? Ve(To(Ie.types)) : h2(Ie) ? !!Ie.typeParameter.constraint && Ve(Ie.typeParameter.constraint) : !1 } function we(Ie) { return Ve(Ie) ? e.createParenthesizedType(Ie) : _e(Ie) } function ke(Ie) { return lse(Ie) && Ie.typeParameters ? e.createParenthesizedType(Ie) : Ie } function Pe(Ie, Be) { return Be === 0 ? ke(Ie) : Ie } function Ce(Ie) { if (vt(Ie)) return e.createNodeArray(Tl(Ie, Pe)) } } var uz, SRe = gt({ "src/compiler/factory/parenthesizerRules.ts"() { "use strict"; fa(), uz = { getParenthesizeLeftSideOfBinaryForOperator: e => Ks, getParenthesizeRightSideOfBinaryForOperator: e => Ks, parenthesizeLeftSideOfBinary: (e, t) => t, parenthesizeRightSideOfBinary: (e, t, r) => r, parenthesizeExpressionOfComputedPropertyName: Ks, parenthesizeConditionOfConditionalExpression: Ks, parenthesizeBranchOfConditionalExpression: Ks, parenthesizeExpressionOfExportDefault: Ks, parenthesizeExpressionOfNew: e => Ga(e, Ju), parenthesizeLeftSideOfAccess: e => Ga(e, Ju), parenthesizeOperandOfPostfixUnary: e => Ga(e, Ju), parenthesizeOperandOfPrefixUnary: e => Ga(e, jj), parenthesizeExpressionsOfCommaDelimitedList: e => Ga(e, C0), parenthesizeExpressionForDisallowedComma: Ks, parenthesizeExpressionOfExpressionStatement: Ks, parenthesizeConciseBodyOfArrowFunction: Ks, parenthesizeCheckTypeOfConditionalType: Ks, parenthesizeExtendsTypeOfConditionalType: Ks, parenthesizeConstituentTypesOfUnionType: e => Ga(e, C0), parenthesizeConstituentTypeOfUnionType: Ks, parenthesizeConstituentTypesOfIntersectionType: e => Ga(e, C0), parenthesizeConstituentTypeOfIntersectionType: Ks, parenthesizeOperandOfTypeOperator: Ks, parenthesizeOperandOfReadonlyTypeOperator: Ks, parenthesizeNonArrayTypeOfPostfixType: Ks, parenthesizeElementTypesOfTupleType: e => Ga(e, C0), parenthesizeElementTypeOfTupleType: Ks, parenthesizeTypeOfOptionalType: Ks, parenthesizeTypeArguments: e => e && Ga(e, C0), parenthesizeLeadingTypeArgument: Ks } } }); function cue(e) { return { convertToFunctionBlock: t, convertToFunctionExpression: r, convertToArrayAssignmentElement: i, convertToObjectAssignmentElement: o, convertToAssignmentPattern: s, convertToObjectAssignmentPattern: l, convertToArrayAssignmentPattern: f, convertToAssignmentElementTarget: d }; function t(g, m) { if (Va(g)) return g; let v = e.createReturnStatement(g); it(v, g); let S = e.createBlock([v], m); return it(S, g), S } function r(g) { if (!g.body) return L.fail("Cannot convert a FunctionDeclaration without a body"); let m = e.createFunctionExpression(uT(g), g.asteriskToken, g.name, g.typeParameters, g.parameters, g.type, g.body); return Ir(m, g), it(m, g), tO(g) && vz(m, !0), m } function i(g) { if (Wo(g)) { if (g.dotDotDotToken) return L.assertNode(g.name, Re), Ir(it(e.createSpreadElement(g.name), g), g); let m = d(g.name); return g.initializer ? Ir(it(e.createAssignment(m, g.initializer), g), g) : m } return Ga(g, ot) } function o(g) { if (Wo(g)) { if (g.dotDotDotToken) return L.assertNode(g.name, Re), Ir(it(e.createSpreadAssignment(g.name), g), g); if (g.propertyName) { let m = d(g.name); return Ir(it(e.createPropertyAssignment(g.propertyName, g.initializer ? e.createAssignment(m, g.initializer) : m), g), g) } return L.assertNode(g.name, Re), Ir(it(e.createShorthandPropertyAssignment(g.name, g.initializer), g), g) } return Ga(g, Og) } function s(g) { switch (g.kind) { case 204: case 206: return f(g); case 203: case 207: return l(g) } } function l(g) { return cm(g) ? Ir(it(e.createObjectLiteralExpression(on(g.elements, o)), g), g) : Ga(g, rs) } function f(g) { return g2(g) ? Ir(it(e.createArrayLiteralExpression(on(g.elements, i)), g), g) : Ga(g, fu) } function d(g) { return La(g) ? s(g) : Ga(g, ot) } } var dz, xRe = gt({ "src/compiler/factory/nodeConverters.ts"() { "use strict"; fa(), dz = { convertToFunctionBlock: Sa, convertToFunctionExpression: Sa, convertToArrayAssignmentElement: Sa, convertToObjectAssignmentElement: Sa, convertToAssignmentPattern: Sa, convertToObjectAssignmentPattern: Sa, convertToArrayAssignmentPattern: Sa, convertToAssignmentElementTarget: Sa } } }); function ARe(e) { hz.push(e) } function YR(e, t) { let r = e & 8 ? CRe : IRe, i = zu(() => e & 1 ? uz : sue(P)), o = zu(() => e & 2 ? dz : cue(P)), s = Jp(y => (I, N) => M(I, y, N)), l = Jp(y => I => Jf(y, I)), f = Jp(y => I => E_(I, y)), d = Jp(y => () => vE(y)), g = Jp(y => I => ty(y, I)), m = Jp(y => (I, N) => cs(y, I, N)), v = Jp(y => (I, N) => A1(y, I, N)), S = Jp(y => (I, N) => bE(y, I, N)), x = Jp(y => (I, N) => ih(y, I, N)), A = Jp(y => (I, N, te) => Cv(y, I, N, te)), w = Jp(y => (I, N, te) => Iv(y, I, N, te)), C = Jp(y => (I, N, te, Me) => Gl(y, I, N, te, Me)), P = { get parenthesizer() { return i() }, get converters() { return o() }, baseFactory: t, flags: e, createNodeArray: F, createNumericLiteral: Y, createBigIntLiteral: R, createStringLiteral: $, createStringLiteralFromNode: fe, createRegularExpressionLiteral: Z, createLiteralLikeNode: U, createIdentifier: _e, createTempVariable: ge, createLoopVariable: X, createUniqueName: Ve, getGeneratedNameForNode: we, createPrivateIdentifier: Pe, createUniquePrivateName: Ie, getGeneratedPrivateNameForNode: Be, createToken: Le, createSuper: Ye, createThis: _t, createNull: ct, createTrue: Rt, createFalse: We, createModifier: qe, createModifiersFromModifierFlags: zt, createQualifiedName: Qt, updateQualifiedName: tn, createComputedPropertyName: kn, updateComputedPropertyName: _n, createTypeParameterDeclaration: Gt, updateTypeParameterDeclaration: $n, createParameterDeclaration: ui, updateParameterDeclaration: Ni, createDecorator: Pi, updateDecorator: gr, createPropertySignature: pt, updatePropertySignature: nn, createPropertyDeclaration: pn, updatePropertyDeclaration: An, createMethodSignature: Kn, updateMethodSignature: hi, createMethodDeclaration: ri, updateMethodDeclaration: vn, createConstructorDeclaration: Se, updateConstructorDeclaration: at, createGetAccessorDeclaration: ve, updateGetAccessorDeclaration: nt, createSetAccessorDeclaration: Q, updateSetAccessorDeclaration: ue, createCallSignature: Oe, updateCallSignature: je, createConstructSignature: Ge, updateConstructSignature: kt, createIndexSignature: Kt, updateIndexSignature: ln, createClassStaticBlockDeclaration: En, updateClassStaticBlockDeclaration: dr, createTemplateLiteralTypeSpan: ir, updateTemplateLiteralTypeSpan: ae, createKeywordTypeNode: rt, createTypePredicateNode: Ot, updateTypePredicateNode: Ke, createTypeReferenceNode: oe, updateTypeReferenceNode: pe, createFunctionTypeNode: z, updateFunctionTypeNode: Te, createConstructorTypeNode: yt, updateConstructorTypeNode: Vt, createTypeQueryNode: ei, updateTypeQueryNode: Kr, createTypeLiteralNode: Si, updateTypeLiteralNode: Ja, createArrayTypeNode: Za, updateArrayTypeNode: Fa, createTupleTypeNode: Hi, updateTupleTypeNode: xi, createNamedTupleMember: Nr, updateNamedTupleMember: Fo, createOptionalTypeNode: Qr, updateOptionalTypeNode: Wi, createRestTypeNode: gn, updateRestTypeNode: Ki, createUnionTypeNode: mc, updateUnionTypeNode: xc, createIntersectionTypeNode: hc, updateIntersectionTypeNode: ro, createConditionalTypeNode: aa, updateConditionalTypeNode: Co, createInferTypeNode: gc, updateInferTypeNode: Ll, createImportTypeNode: bl, updateImportTypeNode: ss, createParenthesizedType: qs, updateParenthesizedType: Rs, createThisTypeNode: As, createTypeOperatorNode: jt, updateTypeOperatorNode: yc, createIndexedAccessTypeNode: Ql, updateIndexedAccessTypeNode: yu, createMappedTypeNode: se, updateMappedTypeNode: ht, createLiteralTypeNode: wt, updateLiteralTypeNode: K, createTemplateLiteralType: md, updateTemplateLiteralType: Pc, createObjectBindingPattern: Xe, updateObjectBindingPattern: ft, createArrayBindingPattern: Yt, updateArrayBindingPattern: pr, createBindingElement: yr, updateBindingElement: ta, createArrayLiteralExpression: Go, updateArrayLiteralExpression: Ka, createObjectLiteralExpression: vo, updateObjectLiteralExpression: ka, createPropertyAccessExpression: e & 4 ? (y, I) => Jn(Uc(y, I), 262144) : Uc, updatePropertyAccessExpression: Gu, createPropertyAccessChain: e & 4 ? (y, I, N) => Jn($o(y, I, N), 262144) : $o, updatePropertyAccessChain: jo, createElementAccessExpression: hd, updateElementAccessExpression: vc, createElementAccessChain: nf, updateElementAccessChain: ye, createCallExpression: bn, updateCallExpression: Ri, createCallChain: io, updateCallChain: ee, createNewExpression: Ze, updateNewExpression: At, createTaggedTemplateExpression: xt, updateTaggedTemplateExpression: qt, createTypeAssertion: Ln, updateTypeAssertion: mr, createParenthesizedExpression: Vr, updateParenthesizedExpression: gi, createFunctionExpression: Ea, updateFunctionExpression: bo, createArrowFunction: Qo, updateArrowFunction: Cs, createDeleteExpression: Bu, updateDeleteExpression: Pd, createTypeOfExpression: Dc, updateTypeOfExpression: gd, createVoidExpression: Zl, updateVoidExpression: Md, createAwaitExpression: zf, updateAwaitExpression: Io, createPrefixUnaryExpression: Jf, updatePrefixUnaryExpression: Fd, createPostfixUnaryExpression: E_, updatePostfixUnaryExpression: Y_, createBinaryExpression: M, updateBinaryExpression: Nt, createConditionalExpression: Pn, updateConditionalExpression: la, createTemplateExpression: oa, updateTemplateExpression: be, createTemplateHead: sn, createTemplateMiddle: Dn, createTemplateTail: kr, createNoSubstitutionTemplateLiteral: ki, createTemplateLiteralLikeNode: rn, createYieldExpression: Vn, updateYieldExpression: $t, createSpreadElement: Xn, updateSpreadElement: ra, createClassExpression: Is, updateClassExpression: Mc, createOmittedExpression: mm, createExpressionWithTypeArguments: Hh, updateExpressionWithTypeArguments: T_, createAsExpression: Cb, updateAsExpression: mv, createNonNullExpression: gx, updateNonNullExpression: _1, createSatisfiesExpression: yx, updateSatisfiesExpression: Wh, createNonNullChain: S_, updateNonNullChain: hv, createMetaProperty: eh, updateMetaProperty: $_, createTemplateSpan: gv, updateTemplateSpan: lE, createSemicolonClassElement: Ib, createBlock: zh, updateBlock: p1, createVariableStatement: uE, updateVariableStatement: dE, createEmptyStatement: fE, createExpressionStatement: yv, updateExpressionStatement: vx, createIfStatement: _E, updateIfStatement: pE, createDoStatement: vv, updateDoStatement: Lb, createWhileStatement: bv, updateWhileStatement: m1, createForStatement: Jh, updateForStatement: Lo, createForInStatement: mE, updateForInStatement: sC, createForOfStatement: Zg, updateForOfStatement: Kh, createContinueStatement: hm, updateContinueStatement: x_, createBreakStatement: Zu, updateBreakStatement: ed, createReturnStatement: td, updateReturnStatement: kb, createWithStatement: Db, updateWithStatement: bx, createSwitchStatement: wb, updateSwitchStatement: qh, createLabeledStatement: Rb, updateLabeledStatement: h1, createThrowStatement: Ob, updateThrowStatement: cC, createTryStatement: Ex, updateTryStatement: Ev, createDebuggerStatement: hE, createVariableDeclaration: Fe, updateVariableDeclaration: ey, createVariableDeclarationList: Ip, updateVariableDeclarationList: Tv, createFunctionDeclaration: Nb, updateFunctionDeclaration: Sv, createClassDeclaration: g1, updateClassDeclaration: wo, createInterfaceDeclaration: A_, updateInterfaceDeclaration: gE, createTypeAliasDeclaration: Kc, updateTypeAliasDeclaration: th, createEnumDeclaration: Pb, updateEnumDeclaration: C_, createModuleDeclaration: Mb, updateModuleDeclaration: Ml, createModuleBlock: Yh, updateModuleBlock: ll, createCaseBlock: y1, updateCaseBlock: lC, createNamespaceExportDeclaration: Ai, updateNamespaceExportDeclaration: Rr, createImportEqualsDeclaration: yd, updateImportEqualsDeclaration: yE, createImportDeclaration: $h, updateImportDeclaration: nh, createImportClause: ym, updateImportClause: zs, createAssertClause: Fb, updateAssertClause: v1, createAssertEntry: Gb, updateAssertEntry: b1, createImportTypeAssertionContainer: Cf, updateImportTypeAssertionContainer: Tx, createNamespaceImport: Sx, updateNamespaceImport: xv, createNamespaceExport: E1, updateNamespaceExport: T1, createNamedImports: xx, updateNamedImports: Bb, createImportSpecifier: S1, updateImportSpecifier: rf, createExportAssignment: Qh, updateExportAssignment: Q_, createExportDeclaration: I_, updateExportDeclaration: Ax, createNamedExports: Lp, updateNamedExports: x1, createExportSpecifier: Uu, updateExportSpecifier: Zh, createMissingDeclaration: kp, createExternalModuleReference: Dp, updateExternalModuleReference: eg, get createJSDocAllType() { return d(315) }, get createJSDocUnknownType() { return d(316) }, get createJSDocNonNullableType() { return v(318) }, get updateJSDocNonNullableType() { return S(318) }, get createJSDocNullableType() { return v(317) }, get updateJSDocNullableType() { return S(317) }, get createJSDocOptionalType() { return g(319) }, get updateJSDocOptionalType() { return m(319) }, get createJSDocVariadicType() { return g(321) }, get updateJSDocVariadicType() { return m(321) }, get createJSDocNamepathType() { return g(322) }, get updateJSDocNamepathType() { return m(322) }, createJSDocFunctionType: ny, updateJSDocFunctionType: Cx, createJSDocTypeLiteral: Vb, updateJSDocTypeLiteral: jb, createJSDocTypeExpression: Ix, updateJSDocTypeExpression: uC, createJSDocSignature: Lx, updateJSDocSignature: Qn, createJSDocTemplateTag: Av, updateJSDocTemplateTag: vm, createJSDocTypedefTag: Wn, updateJSDocTypedefTag: kx, createJSDocParameterTag: ry, updateJSDocParameterTag: nl, createJSDocPropertyTag: Kf, updateJSDocPropertyTag: Z_, createJSDocCallbackTag: iy, updateJSDocCallbackTag: EE, createJSDocOverloadTag: L_, updateJSDocOverloadTag: ay, createJSDocAugmentsTag: Ac, updateJSDocAugmentsTag: wc, createJSDocImplementsTag: tg, updateJSDocImplementsTag: ng, createJSDocSeeTag: Fl, updateJSDocSeeTag: qf, createJSDocNameReference: bm, updateJSDocNameReference: nd, createJSDocMemberName: TE, updateJSDocMemberName: Hb, createJSDocLink: Wb, updateJSDocLink: ep, createJSDocLinkCode: rh, updateJSDocLinkCode: SE, createJSDocLinkPlain: oy, updateJSDocLinkPlain: uc, get createJSDocTypeTag() { return w(347) }, get updateJSDocTypeTag() { return C(347) }, get createJSDocReturnTag() { return w(345) }, get updateJSDocReturnTag() { return C(345) }, get createJSDocThisTag() { return w(346) }, get updateJSDocThisTag() { return C(346) }, get createJSDocAuthorTag() { return x(333) }, get updateJSDocAuthorTag() { return A(333) }, get createJSDocClassTag() { return x(335) }, get updateJSDocClassTag() { return A(335) }, get createJSDocPublicTag() { return x(336) }, get updateJSDocPublicTag() { return A(336) }, get createJSDocPrivateTag() { return x(337) }, get updateJSDocPrivateTag() { return A(337) }, get createJSDocProtectedTag() { return x(338) }, get updateJSDocProtectedTag() { return A(338) }, get createJSDocReadonlyTag() { return x(339) }, get updateJSDocReadonlyTag() { return A(339) }, get createJSDocOverrideTag() { return x(340) }, get updateJSDocOverrideTag() { return A(340) }, get createJSDocDeprecatedTag() { return x(334) }, get updateJSDocDeprecatedTag() { return A(334) }, get createJSDocThrowsTag() { return w(352) }, get updateJSDocThrowsTag() { return C(352) }, get createJSDocSatisfiesTag() { return w(353) }, get updateJSDocSatisfiesTag() { return C(353) }, createJSDocEnumTag: xE, updateJSDocEnumTag: oh, createJSDocUnknownTag: ah, updateJSDocUnknownTag: qc, createJSDocText: zb, updateJSDocText: Vu, createJSDocComment: Em, updateJSDocComment: Jb, createJsxElement: Lv, updateJsxElement: AE, createJsxSelfClosingElement: sy, updateJsxSelfClosingElement: C1, createJsxOpeningElement: kv, updateJsxOpeningElement: rg, createJsxClosingElement: of, updateJsxClosingElement: CE, createJsxFragment: Gd, createJsxText: Dv, updateJsxText: Dx, createJsxOpeningFragment: No, createJsxJsxClosingFragment: fr, updateJsxFragment: sh, createJsxAttribute: vd, updateJsxAttribute: ju, createJsxAttributes: I1, updateJsxAttributes: IE, createJsxSpreadAttribute: cy, updateJsxSpreadAttribute: wx, createJsxExpression: ly, updateJsxExpression: wp, createCaseClause: tp, updateCaseClause: ig, createDefaultClause: wv, updateDefaultClause: ch, createHeritageClause: Rp, updateHeritageClause: L1, createCatchClause: Cc, updateCatchClause: Bd, createPropertyAssignment: Tm, updatePropertyAssignment: rd, createShorthandPropertyAssignment: uy, updateShorthandPropertyAssignment: ag, createSpreadAssignment: sf, updateSpreadAssignment: ls, createEnumMember: kE, updateEnumMember: DE, createSourceFile: og, updateSourceFile: NE, createRedirectedSourceFile: Rv, createBundle: PE, updateBundle: dy, createUnparsedSource: bd, createUnparsedPrologue: dC, createUnparsedPrepend: sg, createUnparsedTextLike: Ox, createUnparsedSyntheticReference: Nx, createInputFiles: E, createSyntheticExpression: ne, createSyntaxList: Ee, createNotEmittedStatement: Wt, createPartiallyEmittedExpression: lr, updatePartiallyEmittedExpression: ci, createCommaListExpression: Ti, updateCommaListExpression: Wa, createEndOfDeclarationMarker: kl, createMergeDeclarationMarker: Ed, createSyntheticReferenceExpression: Ud, updateSyntheticReferenceExpression: fy, cloneNode: Xf, get createComma() { return s(27) }, get createAssignment() { return s(63) }, get createLogicalOr() { return s(56) }, get createLogicalAnd() { return s(55) }, get createBitwiseOr() { return s(51) }, get createBitwiseXor() { return s(52) }, get createBitwiseAnd() { return s(50) }, get createStrictEquality() { return s(36) }, get createStrictInequality() { return s(37) }, get createEquality() { return s(34) }, get createInequality() { return s(35) }, get createLessThan() { return s(29) }, get createLessThanEquals() { return s(32) }, get createGreaterThan() { return s(31) }, get createGreaterThanEquals() { return s(33) }, get createLeftShift() { return s(47) }, get createRightShift() { return s(48) }, get createUnsignedRightShift() { return s(49) }, get createAdd() { return s(39) }, get createSubtract() { return s(40) }, get createMultiply() { return s(41) }, get createDivide() { return s(43) }, get createModulo() { return s(44) }, get createExponent() { return s(42) }, get createPrefixPlus() { return l(39) }, get createPrefixMinus() { return l(40) }, get createPrefixIncrement() { return l(45) }, get createPrefixDecrement() { return l(46) }, get createBitwiseNot() { return l(54) }, get createLogicalNot() { return l(53) }, get createPostfixIncrement() { return f(45) }, get createPostfixDecrement() { return f(46) }, createImmediatelyInvokedFunctionExpression: ME, createImmediatelyInvokedArrowFunction: cf, createVoidZero: Sm, createExportDefault: py, createExternalModuleExport: If, createTypeCheck: FE, createMethodCall: Pv, createGlobalMethodCall: Ro, createFunctionBindCall: Vc, createFunctionCallCall: KP, createFunctionApplyCall: Zo, createArraySliceCall: Px, createArrayConcatCall: Mx, createObjectDefinePropertyCall: V, createObjectGetOwnPropertyDescriptorCall: me, createReflectGetCall: Ue, createReflectSetCall: ut, createPropertyDescriptor: dn, createCallBinding: is, createAssignmentTargetWrapper: ao, inlineExpressions: Oo, getInternalName: np, getLocalName: Op, getExportName: cg, getDeclarationName: Yf, getNamespaceMemberName: my, getExternalModuleOrNamespaceExportName: Fx, restoreOuterExpressions: li, restoreEnclosingLabel: di, createUseStrictPrologue: k_, copyPrologue: GE, copyStandardPrologue: Mv, copyCustomPrologue: _C, ensureUseStrict: lf, liftToBlock: Gx, mergeLexicalEnvironment: jk, updateModifiers: Hk }; return mn(hz, y => y(P)), P; function F(y, I) { if (y === void 0 || y === Je) y = []; else if (C0(y)) { if (I === void 0 || y.hasTrailingComma === I) return y.transformFlags === void 0 && lue(y), L.attachNodeArrayDebugInfo(y), y; let Me = y.slice(); return Me.pos = y.pos, Me.end = y.end, Me.hasTrailingComma = I, Me.transformFlags = y.transformFlags, L.attachNodeArrayDebugInfo(Me), Me } let N = y.length, te = N >= 1 && N <= 4 ? y.slice() : y; return te.pos = -1, te.end = -1, te.hasTrailingComma = !!I, te.transformFlags = 0, lue(te), L.attachNodeArrayDebugInfo(te), te } function B(y) { return t.createBaseNode(y) } function q(y) { let I = B(y); return I.symbol = void 0, I.localSymbol = void 0, I } function W(y, I) { return y !== I && (y.typeArguments = I.typeArguments), r(y, I) } function Y(y, I = 0) { let N = q(8); return N.text = typeof y == "number" ? y + "" : y, N.numericLiteralFlags = I, I & 384 && (N.transformFlags |= 1024), N } function R(y) { let I = Ne(9); return I.text = typeof y == "string" ? y : j0(y) + "n", I.transformFlags |= 4, I } function ie(y, I) { let N = q(10); return N.text = y, N.singleQuote = I, N } function $(y, I, N) { let te = ie(y, I); return te.hasExtendedUnicodeEscape = N, N && (te.transformFlags |= 1024), te } function fe(y) { let I = ie(l_(y), void 0); return I.textSourceNode = y, I } function Z(y) { let I = Ne(13); return I.text = y, I } function U(y, I) { switch (y) { case 8: return Y(I, 0); case 9: return R(I); case 10: return $(I, void 0); case 11: return Dv(I, !1); case 12: return Dv(I, !0); case 13: return Z(I); case 14: return rn(y, I, void 0, 0) } } function re(y) { let I = t.createBaseIdentifierNode(79); return I.escapedText = y, I.jsDoc = void 0, I.flowNode = void 0, I.symbol = void 0, I } function le(y, I, N, te) { let Me = re(Bs(y)); return iO(Me, { flags: I, id: QR, prefix: N, suffix: te }), QR++, Me } function _e(y, I, N) { I === void 0 && y && (I = lT(y)), I === 79 && (I = void 0); let te = re(Bs(y)); return N && (te.flags |= 128), te.escapedText === "await" && (te.transformFlags |= 67108864), te.flags & 128 && (te.transformFlags |= 1024), te } function ge(y, I, N, te) { let Me = 1; I && (Me |= 8); let Pt = le("", Me, N, te); return y && y(Pt), Pt } function X(y) { let I = 2; return y && (I |= 8), le("", I, void 0, void 0) } function Ve(y, I = 0, N, te) { return L.assert(!(I & 7), "Argument out of range: flags"), L.assert((I & 48) !== 32, "GeneratedIdentifierFlags.FileLevel cannot be set without also setting GeneratedIdentifierFlags.Optimistic"), le(y, 3 | I, N, te) } function we(y, I = 0, N, te) { L.assert(!(I & 7), "Argument out of range: flags"); let Me = y ? Ah(y) ? jT(!1, N, y, te, vr) : `generated@${zo(y)}` : ""; (N || te) && (I |= 16); let Pt = le(Me, 4 | I, N, te); return Pt.original = y, Pt } function ke(y) { let I = t.createBasePrivateIdentifierNode(80); return I.escapedText = y, I.transformFlags |= 16777216, I } function Pe(y) { return na(y, "#") || L.fail("First character of private identifier must be #: " + y), ke(Bs(y)) } function Ce(y, I, N, te) { let Me = ke(Bs(y)); return iO(Me, { flags: I, id: QR, prefix: N, suffix: te }), QR++, Me } function Ie(y, I, N) { y && !na(y, "#") && L.fail("First character of private identifier must be #: " + y); let te = 8 | (y ? 3 : 1); return Ce(y ?? "", te, I, N) } function Be(y, I, N) { let te = Ah(y) ? jT(!0, I, y, N, vr) : `#generated@${zo(y)}`, Pt = Ce(te, 4 | (I || N ? 16 : 0), I, N); return Pt.original = y, Pt } function Ne(y) { return t.createBaseTokenNode(y) } function Le(y) { L.assert(y >= 0 && y <= 162, "Invalid token"), L.assert(y <= 14 || y >= 17, "Invalid token. Use 'createTemplateLiteralLikeNode' to create template literals."), L.assert(y <= 8 || y >= 14, "Invalid token. Use 'createLiteralLikeNode' to create literals."), L.assert(y !== 79, "Invalid token. Use 'createIdentifier' to create identifiers"); let I = Ne(y), N = 0; switch (y) { case 132: N = 384; break; case 123: case 121: case 122: case 146: case 126: case 136: case 85: case 131: case 148: case 160: case 144: case 149: case 101: case 145: case 161: case 152: case 134: case 153: case 114: case 157: case 155: N = 1; break; case 106: N = 134218752, I.flowNode = void 0; break; case 124: N = 1024; break; case 127: N = 16777216; break; case 108: N = 16384, I.flowNode = void 0; break }return N && (I.transformFlags |= N), I } function Ye() { return Le(106) } function _t() { return Le(108) } function ct() { return Le(104) } function Rt() { return Le(110) } function We() { return Le(95) } function qe(y) { return Le(y) } function zt(y) { let I = []; return y & 1 && I.push(qe(93)), y & 2 && I.push(qe(136)), y & 1024 && I.push(qe(88)), y & 2048 && I.push(qe(85)), y & 4 && I.push(qe(123)), y & 8 && I.push(qe(121)), y & 16 && I.push(qe(122)), y & 256 && I.push(qe(126)), y & 32 && I.push(qe(124)), y & 16384 && I.push(qe(161)), y & 64 && I.push(qe(146)), y & 128 && I.push(qe(127)), y & 512 && I.push(qe(132)), y & 32768 && I.push(qe(101)), y & 65536 && I.push(qe(145)), I.length ? I : void 0 } function Qt(y, I) { let N = B(163); return N.left = y, N.right = Zs(I), N.transformFlags |= tr(N.left) | fL(N.right), N.flowNode = void 0, N } function tn(y, I, N) { return y.left !== I || y.right !== N ? r(Qt(I, N), y) : y } function kn(y) { let I = B(164); return I.expression = i().parenthesizeExpressionOfComputedPropertyName(y), I.transformFlags |= tr(I.expression) | 1024 | 131072, I } function _n(y, I) { return y.expression !== I ? r(kn(I), y) : y } function Gt(y, I, N, te) { let Me = q(165); return Me.modifiers = oo(y), Me.name = Zs(I), Me.constraint = N, Me.default = te, Me.transformFlags = 1, Me.expression = void 0, Me.jsDoc = void 0, Me } function $n(y, I, N, te, Me) { return y.modifiers !== I || y.name !== N || y.constraint !== te || y.default !== Me ? r(Gt(I, N, te, Me), y) : y } function ui(y, I, N, te, Me, Pt) { var Tr, Fi; let Da = q(166); return Da.modifiers = oo(y), Da.dotDotDotToken = I, Da.name = Zs(N), Da.questionToken = te, Da.type = Me, Da.initializer = gy(Pt), LT(Da.name) ? Da.transformFlags = 1 : Da.transformFlags = fo(Da.modifiers) | tr(Da.dotDotDotToken) | Gg(Da.name) | tr(Da.questionToken) | tr(Da.initializer) | (((Tr = Da.questionToken) != null ? Tr : Da.type) ? 1 : 0) | (((Fi = Da.dotDotDotToken) != null ? Fi : Da.initializer) ? 1024 : 0) | (im(Da.modifiers) & 16476 ? 8192 : 0), Da.jsDoc = void 0, Da } function Ni(y, I, N, te, Me, Pt, Tr) { return y.modifiers !== I || y.dotDotDotToken !== N || y.name !== te || y.questionToken !== Me || y.type !== Pt || y.initializer !== Tr ? r(ui(I, N, te, Me, Pt, Tr), y) : y } function Pi(y) { let I = B(167); return I.expression = i().parenthesizeLeftSideOfAccess(y, !1), I.transformFlags |= tr(I.expression) | 1 | 8192 | 33554432, I } function gr(y, I) { return y.expression !== I ? r(Pi(I), y) : y } function pt(y, I, N, te) { let Me = q(168); return Me.modifiers = oo(y), Me.name = Zs(I), Me.type = te, Me.questionToken = N, Me.transformFlags = 1, Me.initializer = void 0, Me.jsDoc = void 0, Me } function nn(y, I, N, te, Me) { return y.modifiers !== I || y.name !== N || y.questionToken !== te || y.type !== Me ? Dt(pt(I, N, te, Me), y) : y } function Dt(y, I) { return y !== I && (y.initializer = I.initializer), r(y, I) } function pn(y, I, N, te, Me) { let Pt = q(169); Pt.modifiers = oo(y), Pt.name = Zs(I), Pt.questionToken = N && ev(N) ? N : void 0, Pt.exclamationToken = N && lO(N) ? N : void 0, Pt.type = te, Pt.initializer = gy(Me); let Tr = Pt.flags & 16777216 || im(Pt.modifiers) & 2; return Pt.transformFlags = fo(Pt.modifiers) | Gg(Pt.name) | tr(Pt.initializer) | (Tr || Pt.questionToken || Pt.exclamationToken || Pt.type ? 1 : 0) | (ts(Pt.name) || im(Pt.modifiers) & 32 && Pt.initializer ? 8192 : 0) | 16777216, Pt.jsDoc = void 0, Pt } function An(y, I, N, te, Me, Pt) { return y.modifiers !== I || y.name !== N || y.questionToken !== (te !== void 0 && ev(te) ? te : void 0) || y.exclamationToken !== (te !== void 0 && lO(te) ? te : void 0) || y.type !== Me || y.initializer !== Pt ? r(pn(I, N, te, Me, Pt), y) : y } function Kn(y, I, N, te, Me, Pt) { let Tr = q(170); return Tr.modifiers = oo(y), Tr.name = Zs(I), Tr.questionToken = N, Tr.typeParameters = oo(te), Tr.parameters = oo(Me), Tr.type = Pt, Tr.transformFlags = 1, Tr.jsDoc = void 0, Tr.locals = void 0, Tr.nextContainer = void 0, Tr.typeArguments = void 0, Tr } function hi(y, I, N, te, Me, Pt, Tr) { return y.modifiers !== I || y.name !== N || y.questionToken !== te || y.typeParameters !== Me || y.parameters !== Pt || y.type !== Tr ? W(Kn(I, N, te, Me, Pt, Tr), y) : y } function ri(y, I, N, te, Me, Pt, Tr, Fi) { let Da = q(171); if (Da.modifiers = oo(y), Da.asteriskToken = I, Da.name = Zs(N), Da.questionToken = te, Da.exclamationToken = void 0, Da.typeParameters = oo(Me), Da.parameters = F(Pt), Da.type = Tr, Da.body = Fi, !Da.body) Da.transformFlags = 1; else { let Vd = im(Da.modifiers) & 512, lg = !!Da.asteriskToken, ug = Vd && lg; Da.transformFlags = fo(Da.modifiers) | tr(Da.asteriskToken) | Gg(Da.name) | tr(Da.questionToken) | fo(Da.typeParameters) | fo(Da.parameters) | tr(Da.type) | tr(Da.body) & -67108865 | (ug ? 128 : Vd ? 256 : lg ? 2048 : 0) | (Da.questionToken || Da.typeParameters || Da.type ? 1 : 0) | 1024 } return Da.typeArguments = void 0, Da.jsDoc = void 0, Da.locals = void 0, Da.nextContainer = void 0, Da.flowNode = void 0, Da.endFlowNode = void 0, Da.returnFlowNode = void 0, Da } function vn(y, I, N, te, Me, Pt, Tr, Fi, Da) { return y.modifiers !== I || y.asteriskToken !== N || y.name !== te || y.questionToken !== Me || y.typeParameters !== Pt || y.parameters !== Tr || y.type !== Fi || y.body !== Da ? Ht(ri(I, N, te, Me, Pt, Tr, Fi, Da), y) : y } function Ht(y, I) { return y !== I && (y.exclamationToken = I.exclamationToken), r(y, I) } function En(y) { let I = q(172); return I.body = y, I.transformFlags = tr(y) | 16777216, I.modifiers = void 0, I.jsDoc = void 0, I.locals = void 0, I.nextContainer = void 0, I.endFlowNode = void 0, I.returnFlowNode = void 0, I } function dr(y, I) { return y.body !== I ? Cr(En(I), y) : y } function Cr(y, I) { return y !== I && (y.modifiers = I.modifiers), r(y, I) } function Se(y, I, N) { let te = q(173); return te.modifiers = oo(y), te.parameters = F(I), te.body = N, te.transformFlags = fo(te.modifiers) | fo(te.parameters) | tr(te.body) & -67108865 | 1024, te.typeParameters = void 0, te.type = void 0, te.typeArguments = void 0, te.jsDoc = void 0, te.locals = void 0, te.nextContainer = void 0, te.endFlowNode = void 0, te.returnFlowNode = void 0, te } function at(y, I, N, te) { return y.modifiers !== I || y.parameters !== N || y.body !== te ? Tt(Se(I, N, te), y) : y } function Tt(y, I) { return y !== I && (y.typeParameters = I.typeParameters, y.type = I.type), W(y, I) } function ve(y, I, N, te, Me) { let Pt = q(174); return Pt.modifiers = oo(y), Pt.name = Zs(I), Pt.parameters = F(N), Pt.type = te, Pt.body = Me, Pt.body ? Pt.transformFlags = fo(Pt.modifiers) | Gg(Pt.name) | fo(Pt.parameters) | tr(Pt.type) | tr(Pt.body) & -67108865 | (Pt.type ? 1 : 0) : Pt.transformFlags = 1, Pt.typeArguments = void 0, Pt.typeParameters = void 0, Pt.jsDoc = void 0, Pt.locals = void 0, Pt.nextContainer = void 0, Pt.flowNode = void 0, Pt.endFlowNode = void 0, Pt.returnFlowNode = void 0, Pt } function nt(y, I, N, te, Me, Pt) { return y.modifiers !== I || y.name !== N || y.parameters !== te || y.type !== Me || y.body !== Pt ? ce(ve(I, N, te, Me, Pt), y) : y } function ce(y, I) { return y !== I && (y.typeParameters = I.typeParameters), W(y, I) } function Q(y, I, N, te) { let Me = q(175); return Me.modifiers = oo(y), Me.name = Zs(I), Me.parameters = F(N), Me.body = te, Me.body ? Me.transformFlags = fo(Me.modifiers) | Gg(Me.name) | fo(Me.parameters) | tr(Me.body) & -67108865 | (Me.type ? 1 : 0) : Me.transformFlags = 1, Me.typeArguments = void 0, Me.typeParameters = void 0, Me.type = void 0, Me.jsDoc = void 0, Me.locals = void 0, Me.nextContainer = void 0, Me.flowNode = void 0, Me.endFlowNode = void 0, Me.returnFlowNode = void 0, Me } function ue(y, I, N, te, Me) { return y.modifiers !== I || y.name !== N || y.parameters !== te || y.body !== Me ? G(Q(I, N, te, Me), y) : y } function G(y, I) { return y !== I && (y.typeParameters = I.typeParameters, y.type = I.type), W(y, I) } function Oe(y, I, N) { let te = q(176); return te.typeParameters = oo(y), te.parameters = oo(I), te.type = N, te.transformFlags = 1, te.jsDoc = void 0, te.locals = void 0, te.nextContainer = void 0, te.typeArguments = void 0, te } function je(y, I, N, te) { return y.typeParameters !== I || y.parameters !== N || y.type !== te ? W(Oe(I, N, te), y) : y } function Ge(y, I, N) { let te = q(177); return te.typeParameters = oo(y), te.parameters = oo(I), te.type = N, te.transformFlags = 1, te.jsDoc = void 0, te.locals = void 0, te.nextContainer = void 0, te.typeArguments = void 0, te } function kt(y, I, N, te) { return y.typeParameters !== I || y.parameters !== N || y.type !== te ? W(Ge(I, N, te), y) : y } function Kt(y, I, N) { let te = q(178); return te.modifiers = oo(y), te.parameters = oo(I), te.type = N, te.transformFlags = 1, te.jsDoc = void 0, te.locals = void 0, te.nextContainer = void 0, te.typeArguments = void 0, te } function ln(y, I, N, te) { return y.parameters !== N || y.type !== te || y.modifiers !== I ? W(Kt(I, N, te), y) : y } function ir(y, I) { let N = B(201); return N.type = y, N.literal = I, N.transformFlags = 1, N } function ae(y, I, N) { return y.type !== I || y.literal !== N ? r(ir(I, N), y) : y } function rt(y) { return Le(y) } function Ot(y, I, N) { let te = B(179); return te.assertsModifier = y, te.parameterName = Zs(I), te.type = N, te.transformFlags = 1, te } function Ke(y, I, N, te) { return y.assertsModifier !== I || y.parameterName !== N || y.type !== te ? r(Ot(I, N, te), y) : y } function oe(y, I) { let N = B(180); return N.typeName = Zs(y), N.typeArguments = I && i().parenthesizeTypeArguments(F(I)), N.transformFlags = 1, N } function pe(y, I, N) { return y.typeName !== I || y.typeArguments !== N ? r(oe(I, N), y) : y } function z(y, I, N) { let te = q(181); return te.typeParameters = oo(y), te.parameters = oo(I), te.type = N, te.transformFlags = 1, te.modifiers = void 0, te.jsDoc = void 0, te.locals = void 0, te.nextContainer = void 0, te.typeArguments = void 0, te } function Te(y, I, N, te) { return y.typeParameters !== I || y.parameters !== N || y.type !== te ? j(z(I, N, te), y) : y } function j(y, I) { return y !== I && (y.modifiers = I.modifiers), W(y, I) } function yt(...y) { return y.length === 4 ? lt(...y) : y.length === 3 ? Qe(...y) : L.fail("Incorrect number of arguments specified.") } function lt(y, I, N, te) { let Me = q(182); return Me.modifiers = oo(y), Me.typeParameters = oo(I), Me.parameters = oo(N), Me.type = te, Me.transformFlags = 1, Me.jsDoc = void 0, Me.locals = void 0, Me.nextContainer = void 0, Me.typeArguments = void 0, Me } function Qe(y, I, N) { return lt(void 0, y, I, N) } function Vt(...y) { return y.length === 5 ? Hn(...y) : y.length === 4 ? jr(...y) : L.fail("Incorrect number of arguments specified.") } function Hn(y, I, N, te, Me) { return y.modifiers !== I || y.typeParameters !== N || y.parameters !== te || y.type !== Me ? W(yt(I, N, te, Me), y) : y } function jr(y, I, N, te) { return Hn(y, y.modifiers, I, N, te) } function ei(y, I) { let N = B(183); return N.exprName = y, N.typeArguments = I && i().parenthesizeTypeArguments(I), N.transformFlags = 1, N } function Kr(y, I, N) { return y.exprName !== I || y.typeArguments !== N ? r(ei(I, N), y) : y } function Si(y) { let I = q(184); return I.members = F(y), I.transformFlags = 1, I } function Ja(y, I) { return y.members !== I ? r(Si(I), y) : y } function Za(y) { let I = B(185); return I.elementType = i().parenthesizeNonArrayTypeOfPostfixType(y), I.transformFlags = 1, I } function Fa(y, I) { return y.elementType !== I ? r(Za(I), y) : y } function Hi(y) { let I = B(186); return I.elements = F(i().parenthesizeElementTypesOfTupleType(y)), I.transformFlags = 1, I } function xi(y, I) { return y.elements !== I ? r(Hi(I), y) : y } function Nr(y, I, N, te) { let Me = q(199); return Me.dotDotDotToken = y, Me.name = I, Me.questionToken = N, Me.type = te, Me.transformFlags = 1, Me.jsDoc = void 0, Me } function Fo(y, I, N, te, Me) { return y.dotDotDotToken !== I || y.name !== N || y.questionToken !== te || y.type !== Me ? r(Nr(I, N, te, Me), y) : y } function Qr(y) { let I = B(187); return I.type = i().parenthesizeTypeOfOptionalType(y), I.transformFlags = 1, I } function Wi(y, I) { return y.type !== I ? r(Qr(I), y) : y } function gn(y) { let I = B(188); return I.type = y, I.transformFlags = 1, I } function Ki(y, I) { return y.type !== I ? r(gn(I), y) : y } function kc(y, I, N) { let te = B(y); return te.types = P.createNodeArray(N(I)), te.transformFlags = 1, te } function Ps(y, I, N) { return y.types !== I ? r(kc(y.kind, I, N), y) : y } function mc(y) { return kc(189, y, i().parenthesizeConstituentTypesOfUnionType) } function xc(y, I) { return Ps(y, I, i().parenthesizeConstituentTypesOfUnionType) } function hc(y) { return kc(190, y, i().parenthesizeConstituentTypesOfIntersectionType) } function ro(y, I) { return Ps(y, I, i().parenthesizeConstituentTypesOfIntersectionType) } function aa(y, I, N, te) { let Me = B(191); return Me.checkType = i().parenthesizeCheckTypeOfConditionalType(y), Me.extendsType = i().parenthesizeExtendsTypeOfConditionalType(I), Me.trueType = N, Me.falseType = te, Me.transformFlags = 1, Me.locals = void 0, Me.nextContainer = void 0, Me } function Co(y, I, N, te, Me) { return y.checkType !== I || y.extendsType !== N || y.trueType !== te || y.falseType !== Me ? r(aa(I, N, te, Me), y) : y } function gc(y) { let I = B(192); return I.typeParameter = y, I.transformFlags = 1, I } function Ll(y, I) { return y.typeParameter !== I ? r(gc(I), y) : y } function md(y, I) { let N = B(200); return N.head = y, N.templateSpans = F(I), N.transformFlags = 1, N } function Pc(y, I, N) { return y.head !== I || y.templateSpans !== N ? r(md(I, N), y) : y } function bl(y, I, N, te, Me = !1) { let Pt = B(202); return Pt.argument = y, Pt.assertions = I, Pt.qualifier = N, Pt.typeArguments = te && i().parenthesizeTypeArguments(te), Pt.isTypeOf = Me, Pt.transformFlags = 1, Pt } function ss(y, I, N, te, Me, Pt = y.isTypeOf) { return y.argument !== I || y.assertions !== N || y.qualifier !== te || y.typeArguments !== Me || y.isTypeOf !== Pt ? r(bl(I, N, te, Me, Pt), y) : y } function qs(y) { let I = B(193); return I.type = y, I.transformFlags = 1, I } function Rs(y, I) { return y.type !== I ? r(qs(I), y) : y } function As() { let y = B(194); return y.transformFlags = 1, y } function jt(y, I) { let N = B(195); return N.operator = y, N.type = y === 146 ? i().parenthesizeOperandOfReadonlyTypeOperator(I) : i().parenthesizeOperandOfTypeOperator(I), N.transformFlags = 1, N } function yc(y, I) { return y.type !== I ? r(jt(y.operator, I), y) : y } function Ql(y, I) { let N = B(196); return N.objectType = i().parenthesizeNonArrayTypeOfPostfixType(y), N.indexType = I, N.transformFlags = 1, N } function yu(y, I, N) { return y.objectType !== I || y.indexType !== N ? r(Ql(I, N), y) : y } function se(y, I, N, te, Me, Pt) { let Tr = q(197); return Tr.readonlyToken = y, Tr.typeParameter = I, Tr.nameType = N, Tr.questionToken = te, Tr.type = Me, Tr.members = Pt && F(Pt), Tr.transformFlags = 1, Tr.locals = void 0, Tr.nextContainer = void 0, Tr } function ht(y, I, N, te, Me, Pt, Tr) { return y.readonlyToken !== I || y.typeParameter !== N || y.nameType !== te || y.questionToken !== Me || y.type !== Pt || y.members !== Tr ? r(se(I, N, te, Me, Pt, Tr), y) : y } function wt(y) { let I = B(198); return I.literal = y, I.transformFlags = 1, I } function K(y, I) { return y.literal !== I ? r(wt(I), y) : y } function Xe(y) { let I = B(203); return I.elements = F(y), I.transformFlags |= fo(I.elements) | 1024 | 524288, I.transformFlags & 32768 && (I.transformFlags |= 65664), I } function ft(y, I) { return y.elements !== I ? r(Xe(I), y) : y } function Yt(y) { let I = B(204); return I.elements = F(y), I.transformFlags |= fo(I.elements) | 1024 | 524288, I } function pr(y, I) { return y.elements !== I ? r(Yt(I), y) : y } function yr(y, I, N, te) { let Me = q(205); return Me.dotDotDotToken = y, Me.propertyName = Zs(I), Me.name = Zs(N), Me.initializer = gy(te), Me.transformFlags |= tr(Me.dotDotDotToken) | Gg(Me.propertyName) | Gg(Me.name) | tr(Me.initializer) | (Me.dotDotDotToken ? 32768 : 0) | 1024, Me.flowNode = void 0, Me } function ta(y, I, N, te, Me) { return y.propertyName !== N || y.dotDotDotToken !== I || y.name !== te || y.initializer !== Me ? r(yr(I, N, te, Me), y) : y } function Go(y, I) { let N = B(206), te = y && Os(y), Me = F(y, te && ol(te) ? !0 : void 0); return N.elements = i().parenthesizeExpressionsOfCommaDelimitedList(Me), N.multiLine = I, N.transformFlags |= fo(N.elements), N } function Ka(y, I) { return y.elements !== I ? r(Go(I, y.multiLine), y) : y } function vo(y, I) { let N = q(207); return N.properties = F(y), N.multiLine = I, N.transformFlags |= fo(N.properties), N.jsDoc = void 0, N } function ka(y, I) { return y.properties !== I ? r(vo(I, y.multiLine), y) : y } function Hs(y, I, N) { let te = q(208); return te.expression = y, te.questionDotToken = I, te.name = N, te.transformFlags = tr(te.expression) | tr(te.questionDotToken) | (Re(te.name) ? fL(te.name) : tr(te.name) | 536870912), te.jsDoc = void 0, te.flowNode = void 0, te } function Uc(y, I) { let N = Hs(i().parenthesizeLeftSideOfAccess(y, !1), void 0, Zs(I)); return hL(y) && (N.transformFlags |= 384), N } function Gu(y, I, N) { return n6(y) ? jo(y, I, y.questionDotToken, Ga(N, Re)) : y.expression !== I || y.name !== N ? r(Uc(I, N), y) : y } function $o(y, I, N) { let te = Hs(i().parenthesizeLeftSideOfAccess(y, !0), I, Zs(N)); return te.flags |= 32, te.transformFlags |= 32, te } function jo(y, I, N, te) { return L.assert(!!(y.flags & 32), "Cannot update a PropertyAccessExpression using updatePropertyAccessChain. Use updatePropertyAccess instead."), y.expression !== I || y.questionDotToken !== N || y.name !== te ? r($o(I, N, te), y) : y } function Ws(y, I, N) { let te = q(209); return te.expression = y, te.questionDotToken = I, te.argumentExpression = N, te.transformFlags |= tr(te.expression) | tr(te.questionDotToken) | tr(te.argumentExpression), te.jsDoc = void 0, te.flowNode = void 0, te } function hd(y, I) { let N = Ws(i().parenthesizeLeftSideOfAccess(y, !1), void 0, Fv(I)); return hL(y) && (N.transformFlags |= 384), N } function vc(y, I, N) { return Dj(y) ? ye(y, I, y.questionDotToken, N) : y.expression !== I || y.argumentExpression !== N ? r(hd(I, N), y) : y } function nf(y, I, N) { let te = Ws(i().parenthesizeLeftSideOfAccess(y, !0), I, Fv(N)); return te.flags |= 32, te.transformFlags |= 32, te } function ye(y, I, N, te) { return L.assert(!!(y.flags & 32), "Cannot update a ElementAccessExpression using updateElementAccessChain. Use updateElementAccess instead."), y.expression !== I || y.questionDotToken !== N || y.argumentExpression !== te ? r(nf(I, N, te), y) : y } function Et(y, I, N, te) { let Me = q(210); return Me.expression = y, Me.questionDotToken = I, Me.typeArguments = N, Me.arguments = te, Me.transformFlags |= tr(Me.expression) | tr(Me.questionDotToken) | fo(Me.typeArguments) | fo(Me.arguments), Me.typeArguments && (Me.transformFlags |= 1), Pu(Me.expression) && (Me.transformFlags |= 16384), Me } function bn(y, I, N) { let te = Et(i().parenthesizeLeftSideOfAccess(y, !1), void 0, oo(I), i().parenthesizeExpressionsOfCommaDelimitedList(F(N))); return gL(te.expression) && (te.transformFlags |= 8388608), te } function Ri(y, I, N, te) { return dT(y) ? ee(y, I, y.questionDotToken, N, te) : y.expression !== I || y.typeArguments !== N || y.arguments !== te ? r(bn(I, N, te), y) : y } function io(y, I, N, te) { let Me = Et(i().parenthesizeLeftSideOfAccess(y, !0), I, oo(N), i().parenthesizeExpressionsOfCommaDelimitedList(F(te))); return Me.flags |= 32, Me.transformFlags |= 32, Me } function ee(y, I, N, te, Me) { return L.assert(!!(y.flags & 32), "Cannot update a CallExpression using updateCallChain. Use updateCall instead."), y.expression !== I || y.questionDotToken !== N || y.typeArguments !== te || y.arguments !== Me ? r(io(I, N, te, Me), y) : y } function Ze(y, I, N) { let te = q(211); return te.expression = i().parenthesizeExpressionOfNew(y), te.typeArguments = oo(I), te.arguments = N ? i().parenthesizeExpressionsOfCommaDelimitedList(N) : void 0, te.transformFlags |= tr(te.expression) | fo(te.typeArguments) | fo(te.arguments) | 32, te.typeArguments && (te.transformFlags |= 1), te } function At(y, I, N, te) { return y.expression !== I || y.typeArguments !== N || y.arguments !== te ? r(Ze(I, N, te), y) : y } function xt(y, I, N) { let te = B(212); return te.tag = i().parenthesizeLeftSideOfAccess(y, !1), te.typeArguments = oo(I), te.template = N, te.transformFlags |= tr(te.tag) | fo(te.typeArguments) | tr(te.template) | 1024, te.typeArguments && (te.transformFlags |= 1), KH(te.template) && (te.transformFlags |= 128), te } function qt(y, I, N, te) { return y.tag !== I || y.typeArguments !== N || y.template !== te ? r(xt(I, N, te), y) : y } function Ln(y, I) { let N = B(213); return N.expression = i().parenthesizeOperandOfPrefixUnary(I), N.type = y, N.transformFlags |= tr(N.expression) | tr(N.type) | 1, N } function mr(y, I, N) { return y.type !== I || y.expression !== N ? r(Ln(I, N), y) : y } function Vr(y) { let I = B(214); return I.expression = y, I.transformFlags = tr(I.expression), I.jsDoc = void 0, I } function gi(y, I) { return y.expression !== I ? r(Vr(I), y) : y } function Ea(y, I, N, te, Me, Pt, Tr) { let Fi = q(215); Fi.modifiers = oo(y), Fi.asteriskToken = I, Fi.name = Zs(N), Fi.typeParameters = oo(te), Fi.parameters = F(Me), Fi.type = Pt, Fi.body = Tr; let Da = im(Fi.modifiers) & 512, Vd = !!Fi.asteriskToken, lg = Da && Vd; return Fi.transformFlags = fo(Fi.modifiers) | tr(Fi.asteriskToken) | Gg(Fi.name) | fo(Fi.typeParameters) | fo(Fi.parameters) | tr(Fi.type) | tr(Fi.body) & -67108865 | (lg ? 128 : Da ? 256 : Vd ? 2048 : 0) | (Fi.typeParameters || Fi.type ? 1 : 0) | 4194304, Fi.typeArguments = void 0, Fi.jsDoc = void 0, Fi.locals = void 0, Fi.nextContainer = void 0, Fi.flowNode = void 0, Fi.endFlowNode = void 0, Fi.returnFlowNode = void 0, Fi } function bo(y, I, N, te, Me, Pt, Tr, Fi) { return y.name !== te || y.modifiers !== I || y.asteriskToken !== N || y.typeParameters !== Me || y.parameters !== Pt || y.type !== Tr || y.body !== Fi ? W(Ea(I, N, te, Me, Pt, Tr, Fi), y) : y } function Qo(y, I, N, te, Me, Pt) { let Tr = q(216); Tr.modifiers = oo(y), Tr.typeParameters = oo(I), Tr.parameters = F(N), Tr.type = te, Tr.equalsGreaterThanToken = Me ?? Le(38), Tr.body = i().parenthesizeConciseBodyOfArrowFunction(Pt); let Fi = im(Tr.modifiers) & 512; return Tr.transformFlags = fo(Tr.modifiers) | fo(Tr.typeParameters) | fo(Tr.parameters) | tr(Tr.type) | tr(Tr.equalsGreaterThanToken) | tr(Tr.body) & -67108865 | (Tr.typeParameters || Tr.type ? 1 : 0) | (Fi ? 16640 : 0) | 1024, Tr.typeArguments = void 0, Tr.jsDoc = void 0, Tr.locals = void 0, Tr.nextContainer = void 0, Tr.flowNode = void 0, Tr.endFlowNode = void 0, Tr.returnFlowNode = void 0, Tr } function Cs(y, I, N, te, Me, Pt, Tr) { return y.modifiers !== I || y.typeParameters !== N || y.parameters !== te || y.type !== Me || y.equalsGreaterThanToken !== Pt || y.body !== Tr ? W(Qo(I, N, te, Me, Pt, Tr), y) : y } function Bu(y) { let I = B(217); return I.expression = i().parenthesizeOperandOfPrefixUnary(y), I.transformFlags |= tr(I.expression), I } function Pd(y, I) { return y.expression !== I ? r(Bu(I), y) : y } function Dc(y) { let I = B(218); return I.expression = i().parenthesizeOperandOfPrefixUnary(y), I.transformFlags |= tr(I.expression), I } function gd(y, I) { return y.expression !== I ? r(Dc(I), y) : y } function Zl(y) { let I = B(219); return I.expression = i().parenthesizeOperandOfPrefixUnary(y), I.transformFlags |= tr(I.expression), I } function Md(y, I) { return y.expression !== I ? r(Zl(I), y) : y } function zf(y) { let I = B(220); return I.expression = i().parenthesizeOperandOfPrefixUnary(y), I.transformFlags |= tr(I.expression) | 256 | 128 | 2097152, I } function Io(y, I) { return y.expression !== I ? r(zf(I), y) : y } function Jf(y, I) { let N = B(221); return N.operator = y, N.operand = i().parenthesizeOperandOfPrefixUnary(I), N.transformFlags |= tr(N.operand), (y === 45 || y === 46) && Re(N.operand) && !tc(N.operand) && !rv(N.operand) && (N.transformFlags |= 268435456), N } function Fd(y, I) { return y.operand !== I ? r(Jf(y.operator, I), y) : y } function E_(y, I) { let N = B(222); return N.operator = I, N.operand = i().parenthesizeOperandOfPostfixUnary(y), N.transformFlags |= tr(N.operand), Re(N.operand) && !tc(N.operand) && !rv(N.operand) && (N.transformFlags |= 268435456), N } function Y_(y, I) { return y.operand !== I ? r(E_(I, y.operator), y) : y } function M(y, I, N) { let te = q(223), Me = Wk(I), Pt = Me.kind; return te.left = i().parenthesizeLeftSideOfBinary(Pt, y), te.operatorToken = Me, te.right = i().parenthesizeRightSideOfBinary(Pt, te.left, N), te.transformFlags |= tr(te.left) | tr(te.operatorToken) | tr(te.right), Pt === 60 ? te.transformFlags |= 32 : Pt === 63 ? rs(te.left) ? te.transformFlags |= 5248 | He(te.left) : fu(te.left) && (te.transformFlags |= 5120 | He(te.left)) : Pt === 42 || Pt === 67 ? te.transformFlags |= 512 : HI(Pt) && (te.transformFlags |= 16), Pt === 101 && pi(te.left) && (te.transformFlags |= 536870912), te.jsDoc = void 0, te } function He(y) { return IO(y) ? 65536 : 0 } function Nt(y, I, N, te) { return y.left !== I || y.operatorToken !== N || y.right !== te ? r(M(I, N, te), y) : y } function Pn(y, I, N, te, Me) { let Pt = B(224); return Pt.condition = i().parenthesizeConditionOfConditionalExpression(y), Pt.questionToken = I ?? Le(57), Pt.whenTrue = i().parenthesizeBranchOfConditionalExpression(N), Pt.colonToken = te ?? Le(58), Pt.whenFalse = i().parenthesizeBranchOfConditionalExpression(Me), Pt.transformFlags |= tr(Pt.condition) | tr(Pt.questionToken) | tr(Pt.whenTrue) | tr(Pt.colonToken) | tr(Pt.whenFalse), Pt } function la(y, I, N, te, Me, Pt) { return y.condition !== I || y.questionToken !== N || y.whenTrue !== te || y.colonToken !== Me || y.whenFalse !== Pt ? r(Pn(I, N, te, Me, Pt), y) : y } function oa(y, I) { let N = B(225); return N.head = y, N.templateSpans = F(I), N.transformFlags |= tr(N.head) | fo(N.templateSpans) | 1024, N } function be(y, I, N) { return y.head !== I || y.templateSpans !== N ? r(oa(I, N), y) : y } function De(y, I, N, te = 0) { L.assert(!(te & -2049), "Unsupported template flags."); let Me; if (N !== void 0 && N !== I && (Me = LRe(y, N), typeof Me == "object")) return L.fail("Invalid raw text"); if (I === void 0) { if (Me === void 0) return L.fail("Arguments 'text' and 'rawText' may not both be undefined."); I = Me } else Me !== void 0 && L.assert(I === Me, "Expected argument 'text' to be the normalized (i.e. 'cooked') version of argument 'rawText'."); return I } function mt(y) { let I = 1024; return y && (I |= 128), I } function St(y, I, N, te) { let Me = Ne(y); return Me.text = I, Me.rawText = N, Me.templateFlags = te & 2048, Me.transformFlags = mt(Me.templateFlags), Me } function Zt(y, I, N, te) { let Me = q(y); return Me.text = I, Me.rawText = N, Me.templateFlags = te & 2048, Me.transformFlags = mt(Me.templateFlags), Me } function rn(y, I, N, te) { return y === 14 ? Zt(y, I, N, te) : St(y, I, N, te) } function sn(y, I, N) { return y = De(15, y, I, N), rn(15, y, I, N) } function Dn(y, I, N) { return y = De(15, y, I, N), rn(16, y, I, N) } function kr(y, I, N) { return y = De(15, y, I, N), rn(17, y, I, N) } function ki(y, I, N) { return y = De(15, y, I, N), Zt(14, y, I, N) } function Vn(y, I) { L.assert(!y || !!I, "A `YieldExpression` with an asteriskToken must have an expression."); let N = B(226); return N.expression = I && i().parenthesizeExpressionForDisallowedComma(I), N.asteriskToken = y, N.transformFlags |= tr(N.expression) | tr(N.asteriskToken) | 1024 | 128 | 1048576, N } function $t(y, I, N) { return y.expression !== N || y.asteriskToken !== I ? r(Vn(I, N), y) : y } function Xn(y) { let I = B(227); return I.expression = i().parenthesizeExpressionForDisallowedComma(y), I.transformFlags |= tr(I.expression) | 1024 | 32768, I } function ra(y, I) { return y.expression !== I ? r(Xn(I), y) : y } function Is(y, I, N, te, Me) { let Pt = q(228); return Pt.modifiers = oo(y), Pt.name = Zs(I), Pt.typeParameters = oo(N), Pt.heritageClauses = oo(te), Pt.members = F(Me), Pt.transformFlags |= fo(Pt.modifiers) | Gg(Pt.name) | fo(Pt.typeParameters) | fo(Pt.heritageClauses) | fo(Pt.members) | (Pt.typeParameters ? 1 : 0) | 1024, Pt.jsDoc = void 0, Pt } function Mc(y, I, N, te, Me, Pt) { return y.modifiers !== I || y.name !== N || y.typeParameters !== te || y.heritageClauses !== Me || y.members !== Pt ? r(Is(I, N, te, Me, Pt), y) : y } function mm() { return B(229) } function Hh(y, I) { let N = B(230); return N.expression = i().parenthesizeLeftSideOfAccess(y, !1), N.typeArguments = I && i().parenthesizeTypeArguments(I), N.transformFlags |= tr(N.expression) | fo(N.typeArguments) | 1024, N } function T_(y, I, N) { return y.expression !== I || y.typeArguments !== N ? r(Hh(I, N), y) : y } function Cb(y, I) { let N = B(231); return N.expression = y, N.type = I, N.transformFlags |= tr(N.expression) | tr(N.type) | 1, N } function mv(y, I, N) { return y.expression !== I || y.type !== N ? r(Cb(I, N), y) : y } function gx(y) { let I = B(232); return I.expression = i().parenthesizeLeftSideOfAccess(y, !1), I.transformFlags |= tr(I.expression) | 1, I } function _1(y, I) { return i6(y) ? hv(y, I) : y.expression !== I ? r(gx(I), y) : y } function yx(y, I) { let N = B(235); return N.expression = y, N.type = I, N.transformFlags |= tr(N.expression) | tr(N.type) | 1, N } function Wh(y, I, N) { return y.expression !== I || y.type !== N ? r(yx(I, N), y) : y } function S_(y) { let I = B(232); return I.flags |= 32, I.expression = i().parenthesizeLeftSideOfAccess(y, !0), I.transformFlags |= tr(I.expression) | 1, I } function hv(y, I) { return L.assert(!!(y.flags & 32), "Cannot update a NonNullExpression using updateNonNullChain. Use updateNonNullExpression instead."), y.expression !== I ? r(S_(I), y) : y } function eh(y, I) { let N = B(233); switch (N.keywordToken = y, N.name = I, N.transformFlags |= tr(N.name), y) { case 103: N.transformFlags |= 1024; break; case 100: N.transformFlags |= 4; break; default: return L.assertNever(y) }return N.flowNode = void 0, N } function $_(y, I) { return y.name !== I ? r(eh(y.keywordToken, I), y) : y } function gv(y, I) { let N = B(236); return N.expression = y, N.literal = I, N.transformFlags |= tr(N.expression) | tr(N.literal) | 1024, N } function lE(y, I, N) { return y.expression !== I || y.literal !== N ? r(gv(I, N), y) : y } function Ib() { let y = B(237); return y.transformFlags |= 1024, y } function zh(y, I) { let N = B(238); return N.statements = F(y), N.multiLine = I, N.transformFlags |= fo(N.statements), N.jsDoc = void 0, N.locals = void 0, N.nextContainer = void 0, N } function p1(y, I) { return y.statements !== I ? r(zh(I, y.multiLine), y) : y } function uE(y, I) { let N = B(240); return N.modifiers = oo(y), N.declarationList = ba(I) ? Ip(I) : I, N.transformFlags |= fo(N.modifiers) | tr(N.declarationList), im(N.modifiers) & 2 && (N.transformFlags = 1), N.jsDoc = void 0, N.flowNode = void 0, N } function dE(y, I, N) { return y.modifiers !== I || y.declarationList !== N ? r(uE(I, N), y) : y } function fE() { let y = B(239); return y.jsDoc = void 0, y } function yv(y) { let I = B(241); return I.expression = i().parenthesizeExpressionOfExpressionStatement(y), I.transformFlags |= tr(I.expression), I.jsDoc = void 0, I.flowNode = void 0, I } function vx(y, I) { return y.expression !== I ? r(yv(I), y) : y } function _E(y, I, N) { let te = B(242); return te.expression = y, te.thenStatement = ad(I), te.elseStatement = ad(N), te.transformFlags |= tr(te.expression) | tr(te.thenStatement) | tr(te.elseStatement), te.jsDoc = void 0, te.flowNode = void 0, te } function pE(y, I, N, te) { return y.expression !== I || y.thenStatement !== N || y.elseStatement !== te ? r(_E(I, N, te), y) : y } function vv(y, I) { let N = B(243); return N.statement = ad(y), N.expression = I, N.transformFlags |= tr(N.statement) | tr(N.expression), N.jsDoc = void 0, N.flowNode = void 0, N } function Lb(y, I, N) { return y.statement !== I || y.expression !== N ? r(vv(I, N), y) : y } function bv(y, I) { let N = B(244); return N.expression = y, N.statement = ad(I), N.transformFlags |= tr(N.expression) | tr(N.statement), N.jsDoc = void 0, N.flowNode = void 0, N } function m1(y, I, N) { return y.expression !== I || y.statement !== N ? r(bv(I, N), y) : y } function Jh(y, I, N, te) { let Me = B(245); return Me.initializer = y, Me.condition = I, Me.incrementor = N, Me.statement = ad(te), Me.transformFlags |= tr(Me.initializer) | tr(Me.condition) | tr(Me.incrementor) | tr(Me.statement), Me.jsDoc = void 0, Me.locals = void 0, Me.nextContainer = void 0, Me.flowNode = void 0, Me } function Lo(y, I, N, te, Me) { return y.initializer !== I || y.condition !== N || y.incrementor !== te || y.statement !== Me ? r(Jh(I, N, te, Me), y) : y } function mE(y, I, N) { let te = B(246); return te.initializer = y, te.expression = I, te.statement = ad(N), te.transformFlags |= tr(te.initializer) | tr(te.expression) | tr(te.statement), te.jsDoc = void 0, te.locals = void 0, te.nextContainer = void 0, te.flowNode = void 0, te } function sC(y, I, N, te) { return y.initializer !== I || y.expression !== N || y.statement !== te ? r(mE(I, N, te), y) : y } function Zg(y, I, N, te) { let Me = B(247); return Me.awaitModifier = y, Me.initializer = I, Me.expression = i().parenthesizeExpressionForDisallowedComma(N), Me.statement = ad(te), Me.transformFlags |= tr(Me.awaitModifier) | tr(Me.initializer) | tr(Me.expression) | tr(Me.statement) | 1024, y && (Me.transformFlags |= 128), Me.jsDoc = void 0, Me.locals = void 0, Me.nextContainer = void 0, Me.flowNode = void 0, Me } function Kh(y, I, N, te, Me) { return y.awaitModifier !== I || y.initializer !== N || y.expression !== te || y.statement !== Me ? r(Zg(I, N, te, Me), y) : y } function hm(y) { let I = B(248); return I.label = Zs(y), I.transformFlags |= tr(I.label) | 4194304, I.jsDoc = void 0, I.flowNode = void 0, I } function x_(y, I) { return y.label !== I ? r(hm(I), y) : y } function Zu(y) { let I = B(249); return I.label = Zs(y), I.transformFlags |= tr(I.label) | 4194304, I.jsDoc = void 0, I.flowNode = void 0, I } function ed(y, I) { return y.label !== I ? r(Zu(I), y) : y } function td(y) { let I = B(250); return I.expression = y, I.transformFlags |= tr(I.expression) | 128 | 4194304, I.jsDoc = void 0, I.flowNode = void 0, I } function kb(y, I) { return y.expression !== I ? r(td(I), y) : y } function Db(y, I) { let N = B(251); return N.expression = y, N.statement = ad(I), N.transformFlags |= tr(N.expression) | tr(N.statement), N.jsDoc = void 0, N.flowNode = void 0, N } function bx(y, I, N) { return y.expression !== I || y.statement !== N ? r(Db(I, N), y) : y } function wb(y, I) { let N = B(252); return N.expression = i().parenthesizeExpressionForDisallowedComma(y), N.caseBlock = I, N.transformFlags |= tr(N.expression) | tr(N.caseBlock), N.jsDoc = void 0, N.flowNode = void 0, N.possiblyExhaustive = !1, N } function qh(y, I, N) { return y.expression !== I || y.caseBlock !== N ? r(wb(I, N), y) : y } function Rb(y, I) { let N = B(253); return N.label = Zs(y), N.statement = ad(I), N.transformFlags |= tr(N.label) | tr(N.statement), N.jsDoc = void 0, N.flowNode = void 0, N } function h1(y, I, N) { return y.label !== I || y.statement !== N ? r(Rb(I, N), y) : y } function Ob(y) { let I = B(254); return I.expression = y, I.transformFlags |= tr(I.expression), I.jsDoc = void 0, I.flowNode = void 0, I } function cC(y, I) { return y.expression !== I ? r(Ob(I), y) : y } function Ex(y, I, N) { let te = B(255); return te.tryBlock = y, te.catchClause = I, te.finallyBlock = N, te.transformFlags |= tr(te.tryBlock) | tr(te.catchClause) | tr(te.finallyBlock), te.jsDoc = void 0, te.flowNode = void 0, te } function Ev(y, I, N, te) { return y.tryBlock !== I || y.catchClause !== N || y.finallyBlock !== te ? r(Ex(I, N, te), y) : y } function hE() { let y = B(256); return y.jsDoc = void 0, y.flowNode = void 0, y } function Fe(y, I, N, te) { var Me; let Pt = q(257); return Pt.name = Zs(y), Pt.exclamationToken = I, Pt.type = N, Pt.initializer = gy(te), Pt.transformFlags |= Gg(Pt.name) | tr(Pt.initializer) | (((Me = Pt.exclamationToken) != null ? Me : Pt.type) ? 1 : 0), Pt.jsDoc = void 0, Pt } function ey(y, I, N, te, Me) { return y.name !== I || y.type !== te || y.exclamationToken !== N || y.initializer !== Me ? r(Fe(I, N, te, Me), y) : y } function Ip(y, I = 0) { let N = B(258); return N.flags |= I & 3, N.declarations = F(y), N.transformFlags |= fo(N.declarations) | 4194304, I & 3 && (N.transformFlags |= 263168), N } function Tv(y, I) { return y.declarations !== I ? r(Ip(I, y.flags), y) : y } function Nb(y, I, N, te, Me, Pt, Tr) { let Fi = q(259); if (Fi.modifiers = oo(y), Fi.asteriskToken = I, Fi.name = Zs(N), Fi.typeParameters = oo(te), Fi.parameters = F(Me), Fi.type = Pt, Fi.body = Tr, !Fi.body || im(Fi.modifiers) & 2) Fi.transformFlags = 1; else { let Da = im(Fi.modifiers) & 512, Vd = !!Fi.asteriskToken, lg = Da && Vd; Fi.transformFlags = fo(Fi.modifiers) | tr(Fi.asteriskToken) | Gg(Fi.name) | fo(Fi.typeParameters) | fo(Fi.parameters) | tr(Fi.type) | tr(Fi.body) & -67108865 | (lg ? 128 : Da ? 256 : Vd ? 2048 : 0) | (Fi.typeParameters || Fi.type ? 1 : 0) | 4194304 } return Fi.typeArguments = void 0, Fi.jsDoc = void 0, Fi.locals = void 0, Fi.nextContainer = void 0, Fi.endFlowNode = void 0, Fi.returnFlowNode = void 0, Fi } function Sv(y, I, N, te, Me, Pt, Tr, Fi) { return y.modifiers !== I || y.asteriskToken !== N || y.name !== te || y.typeParameters !== Me || y.parameters !== Pt || y.type !== Tr || y.body !== Fi ? Xh(Nb(I, N, te, Me, Pt, Tr, Fi), y) : y } function Xh(y, I) { return y !== I && y.modifiers === I.modifiers && (y.modifiers = I.modifiers), W(y, I) } function g1(y, I, N, te, Me) { let Pt = q(260); return Pt.modifiers = oo(y), Pt.name = Zs(I), Pt.typeParameters = oo(N), Pt.heritageClauses = oo(te), Pt.members = F(Me), im(Pt.modifiers) & 2 ? Pt.transformFlags = 1 : (Pt.transformFlags |= fo(Pt.modifiers) | Gg(Pt.name) | fo(Pt.typeParameters) | fo(Pt.heritageClauses) | fo(Pt.members) | (Pt.typeParameters ? 1 : 0) | 1024, Pt.transformFlags & 8192 && (Pt.transformFlags |= 1)), Pt.jsDoc = void 0, Pt } function wo(y, I, N, te, Me, Pt) { return y.modifiers !== I || y.name !== N || y.typeParameters !== te || y.heritageClauses !== Me || y.members !== Pt ? r(g1(I, N, te, Me, Pt), y) : y } function A_(y, I, N, te, Me) { let Pt = q(261); return Pt.modifiers = oo(y), Pt.name = Zs(I), Pt.typeParameters = oo(N), Pt.heritageClauses = oo(te), Pt.members = F(Me), Pt.transformFlags = 1, Pt.jsDoc = void 0, Pt } function gE(y, I, N, te, Me, Pt) { return y.modifiers !== I || y.name !== N || y.typeParameters !== te || y.heritageClauses !== Me || y.members !== Pt ? r(A_(I, N, te, Me, Pt), y) : y } function Kc(y, I, N, te) { let Me = q(262); return Me.modifiers = oo(y), Me.name = Zs(I), Me.typeParameters = oo(N), Me.type = te, Me.transformFlags = 1, Me.jsDoc = void 0, Me.locals = void 0, Me.nextContainer = void 0, Me } function th(y, I, N, te, Me) { return y.modifiers !== I || y.name !== N || y.typeParameters !== te || y.type !== Me ? r(Kc(I, N, te, Me), y) : y } function Pb(y, I, N) { let te = q(263); return te.modifiers = oo(y), te.name = Zs(I), te.members = F(N), te.transformFlags |= fo(te.modifiers) | tr(te.name) | fo(te.members) | 1, te.transformFlags &= -67108865, te.jsDoc = void 0, te } function C_(y, I, N, te) { return y.modifiers !== I || y.name !== N || y.members !== te ? r(Pb(I, N, te), y) : y } function Mb(y, I, N, te = 0) { let Me = q(264); return Me.modifiers = oo(y), Me.flags |= te & 1044, Me.name = I, Me.body = N, im(Me.modifiers) & 2 ? Me.transformFlags = 1 : Me.transformFlags |= fo(Me.modifiers) | tr(Me.name) | tr(Me.body) | 1, Me.transformFlags &= -67108865, Me.jsDoc = void 0, Me.locals = void 0, Me.nextContainer = void 0, Me } function Ml(y, I, N, te) { return y.modifiers !== I || y.name !== N || y.body !== te ? r(Mb(I, N, te, y.flags), y) : y } function Yh(y) { let I = B(265); return I.statements = F(y), I.transformFlags |= fo(I.statements), I.jsDoc = void 0, I } function ll(y, I) { return y.statements !== I ? r(Yh(I), y) : y } function y1(y) { let I = B(266); return I.clauses = F(y), I.transformFlags |= fo(I.clauses), I.locals = void 0, I.nextContainer = void 0, I } function lC(y, I) { return y.clauses !== I ? r(y1(I), y) : y } function Ai(y) { let I = q(267); return I.name = Zs(y), I.transformFlags |= fL(I.name) | 1, I.modifiers = void 0, I.jsDoc = void 0, I } function Rr(y, I) { return y.name !== I ? gm(Ai(I), y) : y } function gm(y, I) { return y !== I && (y.modifiers = I.modifiers), r(y, I) } function yd(y, I, N, te) { let Me = q(268); return Me.modifiers = oo(y), Me.name = Zs(N), Me.isTypeOnly = I, Me.moduleReference = te, Me.transformFlags |= fo(Me.modifiers) | fL(Me.name) | tr(Me.moduleReference), um(Me.moduleReference) || (Me.transformFlags |= 1), Me.transformFlags &= -67108865, Me.jsDoc = void 0, Me } function yE(y, I, N, te, Me) { return y.modifiers !== I || y.isTypeOnly !== N || y.name !== te || y.moduleReference !== Me ? r(yd(I, N, te, Me), y) : y } function $h(y, I, N, te) { let Me = B(269); return Me.modifiers = oo(y), Me.importClause = I, Me.moduleSpecifier = N, Me.assertClause = te, Me.transformFlags |= tr(Me.importClause) | tr(Me.moduleSpecifier), Me.transformFlags &= -67108865, Me.jsDoc = void 0, Me } function nh(y, I, N, te, Me) { return y.modifiers !== I || y.importClause !== N || y.moduleSpecifier !== te || y.assertClause !== Me ? r($h(I, N, te, Me), y) : y } function ym(y, I, N) { let te = q(270); return te.isTypeOnly = y, te.name = I, te.namedBindings = N, te.transformFlags |= tr(te.name) | tr(te.namedBindings), y && (te.transformFlags |= 1), te.transformFlags &= -67108865, te } function zs(y, I, N, te) { return y.isTypeOnly !== I || y.name !== N || y.namedBindings !== te ? r(ym(I, N, te), y) : y } function Fb(y, I) { let N = B(296); return N.elements = F(y), N.multiLine = I, N.transformFlags |= 4, N } function v1(y, I, N) { return y.elements !== I || y.multiLine !== N ? r(Fb(I, N), y) : y } function Gb(y, I) { let N = B(297); return N.name = y, N.value = I, N.transformFlags |= 4, N } function b1(y, I, N) { return y.name !== I || y.value !== N ? r(Gb(I, N), y) : y } function Cf(y, I) { let N = B(298); return N.assertClause = y, N.multiLine = I, N } function Tx(y, I, N) { return y.assertClause !== I || y.multiLine !== N ? r(Cf(I, N), y) : y } function Sx(y) { let I = q(271); return I.name = y, I.transformFlags |= tr(I.name), I.transformFlags &= -67108865, I } function xv(y, I) { return y.name !== I ? r(Sx(I), y) : y } function E1(y) { let I = q(277); return I.name = y, I.transformFlags |= tr(I.name) | 4, I.transformFlags &= -67108865, I } function T1(y, I) { return y.name !== I ? r(E1(I), y) : y } function xx(y) { let I = B(272); return I.elements = F(y), I.transformFlags |= fo(I.elements), I.transformFlags &= -67108865, I } function Bb(y, I) { return y.elements !== I ? r(xx(I), y) : y } function S1(y, I, N) { let te = q(273); return te.isTypeOnly = y, te.propertyName = I, te.name = N, te.transformFlags |= tr(te.propertyName) | tr(te.name), te.transformFlags &= -67108865, te } function rf(y, I, N, te) { return y.isTypeOnly !== I || y.propertyName !== N || y.name !== te ? r(S1(I, N, te), y) : y } function Qh(y, I, N) { let te = q(274); return te.modifiers = oo(y), te.isExportEquals = I, te.expression = I ? i().parenthesizeRightSideOfBinary(63, void 0, N) : i().parenthesizeExpressionOfExportDefault(N), te.transformFlags |= fo(te.modifiers) | tr(te.expression), te.transformFlags &= -67108865, te.jsDoc = void 0, te } function Q_(y, I, N) { return y.modifiers !== I || y.expression !== N ? r(Qh(I, y.isExportEquals, N), y) : y } function I_(y, I, N, te, Me) { let Pt = q(275); return Pt.modifiers = oo(y), Pt.isTypeOnly = I, Pt.exportClause = N, Pt.moduleSpecifier = te, Pt.assertClause = Me, Pt.transformFlags |= fo(Pt.modifiers) | tr(Pt.exportClause) | tr(Pt.moduleSpecifier), Pt.transformFlags &= -67108865, Pt.jsDoc = void 0, Pt } function Ax(y, I, N, te, Me, Pt) { return y.modifiers !== I || y.isTypeOnly !== N || y.exportClause !== te || y.moduleSpecifier !== Me || y.assertClause !== Pt ? Ub(I_(I, N, te, Me, Pt), y) : y } function Ub(y, I) { return y !== I && y.modifiers === I.modifiers && (y.modifiers = I.modifiers), r(y, I) } function Lp(y) { let I = B(276); return I.elements = F(y), I.transformFlags |= fo(I.elements), I.transformFlags &= -67108865, I } function x1(y, I) { return y.elements !== I ? r(Lp(I), y) : y } function Uu(y, I, N) { let te = B(278); return te.isTypeOnly = y, te.propertyName = Zs(I), te.name = Zs(N), te.transformFlags |= tr(te.propertyName) | tr(te.name), te.transformFlags &= -67108865, te.jsDoc = void 0, te } function Zh(y, I, N, te) { return y.isTypeOnly !== I || y.propertyName !== N || y.name !== te ? r(Uu(I, N, te), y) : y } function kp() { let y = q(279); return y.jsDoc = void 0, y } function Dp(y) { let I = B(280); return I.expression = y, I.transformFlags |= tr(I.expression), I.transformFlags &= -67108865, I } function eg(y, I) { return y.expression !== I ? r(Dp(I), y) : y } function vE(y) { return B(y) } function A1(y, I, N = !1) { let te = ty(y, N ? I && i().parenthesizeNonArrayTypeOfPostfixType(I) : I); return te.postfix = N, te } function ty(y, I) { let N = B(y); return N.type = I, N } function bE(y, I, N) { return I.type !== N ? r(A1(y, N, I.postfix), I) : I } function cs(y, I, N) { return I.type !== N ? r(ty(y, N), I) : I } function ny(y, I) { let N = q(320); return N.parameters = oo(y), N.type = I, N.transformFlags = fo(N.parameters) | (N.type ? 1 : 0), N.jsDoc = void 0, N.locals = void 0, N.nextContainer = void 0, N.typeArguments = void 0, N } function Cx(y, I, N) { return y.parameters !== I || y.type !== N ? r(ny(I, N), y) : y } function Vb(y, I = !1) { let N = q(325); return N.jsDocPropertyTags = oo(y), N.isArrayType = I, N } function jb(y, I, N) { return y.jsDocPropertyTags !== I || y.isArrayType !== N ? r(Vb(I, N), y) : y } function Ix(y) { let I = B(312); return I.type = y, I } function uC(y, I) { return y.type !== I ? r(Ix(I), y) : y } function Lx(y, I, N) { let te = q(326); return te.typeParameters = oo(y), te.parameters = F(I), te.type = N, te.jsDoc = void 0, te.locals = void 0, te.nextContainer = void 0, te } function Qn(y, I, N, te) { return y.typeParameters !== I || y.parameters !== N || y.type !== te ? r(Lx(I, N, te), y) : y } function lc(y) { let I = w4(y.kind); return y.tagName.escapedText === Bs(I) ? y.tagName : _e(I) } function zi(y, I, N) { let te = B(y); return te.tagName = I, te.comment = N, te } function af(y, I, N) { let te = q(y); return te.tagName = I, te.comment = N, te } function Av(y, I, N, te) { let Me = zi(348, y ?? _e("template"), te); return Me.constraint = I, Me.typeParameters = F(N), Me } function vm(y, I = lc(y), N, te, Me) { return y.tagName !== I || y.constraint !== N || y.typeParameters !== te || y.comment !== Me ? r(Av(I, N, te, Me), y) : y } function Wn(y, I, N, te) { let Me = af(349, y ?? _e("typedef"), te); return Me.typeExpression = I, Me.fullName = N, Me.name = iJ(N), Me.locals = void 0, Me.nextContainer = void 0, Me } function kx(y, I = lc(y), N, te, Me) { return y.tagName !== I || y.typeExpression !== N || y.fullName !== te || y.comment !== Me ? r(Wn(I, N, te, Me), y) : y } function ry(y, I, N, te, Me, Pt) { let Tr = af(344, y ?? _e("param"), Pt); return Tr.typeExpression = te, Tr.name = I, Tr.isNameFirst = !!Me, Tr.isBracketed = N, Tr } function nl(y, I = lc(y), N, te, Me, Pt, Tr) { return y.tagName !== I || y.name !== N || y.isBracketed !== te || y.typeExpression !== Me || y.isNameFirst !== Pt || y.comment !== Tr ? r(ry(I, N, te, Me, Pt, Tr), y) : y } function Kf(y, I, N, te, Me, Pt) { let Tr = af(351, y ?? _e("prop"), Pt); return Tr.typeExpression = te, Tr.name = I, Tr.isNameFirst = !!Me, Tr.isBracketed = N, Tr } function Z_(y, I = lc(y), N, te, Me, Pt, Tr) { return y.tagName !== I || y.name !== N || y.isBracketed !== te || y.typeExpression !== Me || y.isNameFirst !== Pt || y.comment !== Tr ? r(Kf(I, N, te, Me, Pt, Tr), y) : y } function iy(y, I, N, te) { let Me = af(341, y ?? _e("callback"), te); return Me.typeExpression = I, Me.fullName = N, Me.name = iJ(N), Me.locals = void 0, Me.nextContainer = void 0, Me } function EE(y, I = lc(y), N, te, Me) { return y.tagName !== I || y.typeExpression !== N || y.fullName !== te || y.comment !== Me ? r(iy(I, N, te, Me), y) : y } function L_(y, I, N) { let te = zi(342, y ?? _e("overload"), N); return te.typeExpression = I, te } function ay(y, I = lc(y), N, te) { return y.tagName !== I || y.typeExpression !== N || y.comment !== te ? r(L_(I, N, te), y) : y } function Ac(y, I, N) { let te = zi(331, y ?? _e("augments"), N); return te.class = I, te } function wc(y, I = lc(y), N, te) { return y.tagName !== I || y.class !== N || y.comment !== te ? r(Ac(I, N, te), y) : y } function tg(y, I, N) { let te = zi(332, y ?? _e("implements"), N); return te.class = I, te } function Fl(y, I, N) { let te = zi(350, y ?? _e("see"), N); return te.name = I, te } function qf(y, I, N, te) { return y.tagName !== I || y.name !== N || y.comment !== te ? r(Fl(I, N, te), y) : y } function bm(y) { let I = B(313); return I.name = y, I } function nd(y, I) { return y.name !== I ? r(bm(I), y) : y } function TE(y, I) { let N = B(314); return N.left = y, N.right = I, N.transformFlags |= tr(N.left) | tr(N.right), N } function Hb(y, I, N) { return y.left !== I || y.right !== N ? r(TE(I, N), y) : y } function Wb(y, I) { let N = B(327); return N.name = y, N.text = I, N } function ep(y, I, N) { return y.name !== I ? r(Wb(I, N), y) : y } function rh(y, I) { let N = B(328); return N.name = y, N.text = I, N } function SE(y, I, N) { return y.name !== I ? r(rh(I, N), y) : y } function oy(y, I) { let N = B(329); return N.name = y, N.text = I, N } function uc(y, I, N) { return y.name !== I ? r(oy(I, N), y) : y } function ng(y, I = lc(y), N, te) { return y.tagName !== I || y.class !== N || y.comment !== te ? r(tg(I, N, te), y) : y } function ih(y, I, N) { return zi(y, I ?? _e(w4(y)), N) } function Cv(y, I, N = lc(I), te) { return I.tagName !== N || I.comment !== te ? r(ih(y, N, te), I) : I } function Iv(y, I, N, te) { let Me = zi(y, I ?? _e(w4(y)), te); return Me.typeExpression = N, Me } function Gl(y, I, N = lc(I), te, Me) { return I.tagName !== N || I.typeExpression !== te || I.comment !== Me ? r(Iv(y, N, te, Me), I) : I } function ah(y, I) { return zi(330, y, I) } function qc(y, I, N) { return y.tagName !== I || y.comment !== N ? r(ah(I, N), y) : y } function xE(y, I, N) { let te = af(343, y ?? _e(w4(343)), N); return te.typeExpression = I, te.locals = void 0, te.nextContainer = void 0, te } function oh(y, I = lc(y), N, te) { return y.tagName !== I || y.typeExpression !== N || y.comment !== te ? r(xE(I, N, te), y) : y } function zb(y) { let I = B(324); return I.text = y, I } function Vu(y, I) { return y.text !== I ? r(zb(I), y) : y } function Em(y, I) { let N = B(323); return N.comment = y, N.tags = oo(I), N } function Jb(y, I, N) { return y.comment !== I || y.tags !== N ? r(Em(I, N), y) : y } function Lv(y, I, N) { let te = B(281); return te.openingElement = y, te.children = F(I), te.closingElement = N, te.transformFlags |= tr(te.openingElement) | fo(te.children) | tr(te.closingElement) | 2, te } function AE(y, I, N, te) { return y.openingElement !== I || y.children !== N || y.closingElement !== te ? r(Lv(I, N, te), y) : y } function sy(y, I, N) { let te = B(282); return te.tagName = y, te.typeArguments = oo(I), te.attributes = N, te.transformFlags |= tr(te.tagName) | fo(te.typeArguments) | tr(te.attributes) | 2, te.typeArguments && (te.transformFlags |= 1), te } function C1(y, I, N, te) { return y.tagName !== I || y.typeArguments !== N || y.attributes !== te ? r(sy(I, N, te), y) : y } function kv(y, I, N) { let te = B(283); return te.tagName = y, te.typeArguments = oo(I), te.attributes = N, te.transformFlags |= tr(te.tagName) | fo(te.typeArguments) | tr(te.attributes) | 2, I && (te.transformFlags |= 1), te } function rg(y, I, N, te) { return y.tagName !== I || y.typeArguments !== N || y.attributes !== te ? r(kv(I, N, te), y) : y } function of(y) { let I = B(284); return I.tagName = y, I.transformFlags |= tr(I.tagName) | 2, I } function CE(y, I) { return y.tagName !== I ? r(of(I), y) : y } function Gd(y, I, N) { let te = B(285); return te.openingFragment = y, te.children = F(I), te.closingFragment = N, te.transformFlags |= tr(te.openingFragment) | fo(te.children) | tr(te.closingFragment) | 2, te } function sh(y, I, N, te) { return y.openingFragment !== I || y.children !== N || y.closingFragment !== te ? r(Gd(I, N, te), y) : y } function Dv(y, I) { let N = B(11); return N.text = y, N.containsOnlyTriviaWhiteSpaces = !!I, N.transformFlags |= 2, N } function Dx(y, I, N) { return y.text !== I || y.containsOnlyTriviaWhiteSpaces !== N ? r(Dv(I, N), y) : y } function No() { let y = B(286); return y.transformFlags |= 2, y } function fr() { let y = B(287); return y.transformFlags |= 2, y } function vd(y, I) { let N = q(288); return N.name = y, N.initializer = I, N.transformFlags |= tr(N.name) | tr(N.initializer) | 2, N } function ju(y, I, N) { return y.name !== I || y.initializer !== N ? r(vd(I, N), y) : y } function I1(y) { let I = q(289); return I.properties = F(y), I.transformFlags |= fo(I.properties) | 2, I } function IE(y, I) { return y.properties !== I ? r(I1(I), y) : y } function cy(y) { let I = B(290); return I.expression = y, I.transformFlags |= tr(I.expression) | 2, I } function wx(y, I) { return y.expression !== I ? r(cy(I), y) : y } function ly(y, I) { let N = B(291); return N.dotDotDotToken = y, N.expression = I, N.transformFlags |= tr(N.dotDotDotToken) | tr(N.expression) | 2, N } function wp(y, I) { return y.expression !== I ? r(ly(y.dotDotDotToken, I), y) : y } function tp(y, I) { let N = B(292); return N.expression = i().parenthesizeExpressionForDisallowedComma(y), N.statements = F(I), N.transformFlags |= tr(N.expression) | fo(N.statements), N.jsDoc = void 0, N } function ig(y, I, N) { return y.expression !== I || y.statements !== N ? r(tp(I, N), y) : y } function wv(y) { let I = B(293); return I.statements = F(y), I.transformFlags = fo(I.statements), I } function ch(y, I) { return y.statements !== I ? r(wv(I), y) : y } function Rp(y, I) { let N = B(294); switch (N.token = y, N.types = F(I), N.transformFlags |= fo(N.types), y) { case 94: N.transformFlags |= 1024; break; case 117: N.transformFlags |= 1; break; default: return L.assertNever(y) }return N } function L1(y, I) { return y.types !== I ? r(Rp(y.token, I), y) : y } function Cc(y, I) { let N = B(295); return N.variableDeclaration = zk(y), N.block = I, N.transformFlags |= tr(N.variableDeclaration) | tr(N.block) | (y ? 0 : 64), N.locals = void 0, N.nextContainer = void 0, N } function Bd(y, I, N) { return y.variableDeclaration !== I || y.block !== N ? r(Cc(I, N), y) : y } function Tm(y, I) { let N = q(299); return N.name = Zs(y), N.initializer = i().parenthesizeExpressionForDisallowedComma(I), N.transformFlags |= Gg(N.name) | tr(N.initializer), N.modifiers = void 0, N.questionToken = void 0, N.exclamationToken = void 0, N.jsDoc = void 0, N } function rd(y, I, N) { return y.name !== I || y.initializer !== N ? LE(Tm(I, N), y) : y } function LE(y, I) { return y !== I && (y.modifiers = I.modifiers, y.questionToken = I.questionToken, y.exclamationToken = I.exclamationToken), r(y, I) } function uy(y, I) { let N = q(300); return N.name = Zs(y), N.objectAssignmentInitializer = I && i().parenthesizeExpressionForDisallowedComma(I), N.transformFlags |= fL(N.name) | tr(N.objectAssignmentInitializer) | 1024, N.equalsToken = void 0, N.modifiers = void 0, N.questionToken = void 0, N.exclamationToken = void 0, N.jsDoc = void 0, N } function ag(y, I, N) { return y.name !== I || y.objectAssignmentInitializer !== N ? Rx(uy(I, N), y) : y } function Rx(y, I) { return y !== I && (y.modifiers = I.modifiers, y.questionToken = I.questionToken, y.exclamationToken = I.exclamationToken, y.equalsToken = I.equalsToken), r(y, I) } function sf(y) { let I = q(301); return I.expression = i().parenthesizeExpressionForDisallowedComma(y), I.transformFlags |= tr(I.expression) | 128 | 65536, I.jsDoc = void 0, I } function ls(y, I) { return y.expression !== I ? r(sf(I), y) : y } function kE(y, I) { let N = q(302); return N.name = Zs(y), N.initializer = I && i().parenthesizeExpressionForDisallowedComma(I), N.transformFlags |= tr(N.name) | tr(N.initializer) | 1, N.jsDoc = void 0, N } function DE(y, I, N) { return y.name !== I || y.initializer !== N ? r(kE(I, N), y) : y } function og(y, I, N) { let te = t.createBaseSourceFileNode(308); return te.statements = F(y), te.endOfFileToken = I, te.flags |= N, te.text = "", te.fileName = "", te.path = "", te.resolvedPath = "", te.originalFileName = "", te.languageVersion = 0, te.languageVariant = 0, te.scriptKind = 0, te.isDeclarationFile = !1, te.hasNoDefaultLib = !1, te.transformFlags |= fo(te.statements) | tr(te.endOfFileToken), te.locals = void 0, te.nextContainer = void 0, te.endFlowNode = void 0, te.nodeCount = 0, te.identifierCount = 0, te.symbolCount = 0, te.parseDiagnostics = void 0, te.bindDiagnostics = void 0, te.bindSuggestionDiagnostics = void 0, te.lineMap = void 0, te.externalModuleIndicator = void 0, te.setExternalModuleIndicator = void 0, te.pragmas = void 0, te.checkJsDirective = void 0, te.referencedFiles = void 0, te.typeReferenceDirectives = void 0, te.libReferenceDirectives = void 0, te.amdDependencies = void 0, te.commentDirectives = void 0, te.identifiers = void 0, te.packageJsonLocations = void 0, te.packageJsonScope = void 0, te.imports = void 0, te.moduleAugmentations = void 0, te.ambientModuleNames = void 0, te.resolvedModules = void 0, te.classifiableNames = void 0, te.impliedNodeFormat = void 0, te } function Rv(y) { let I = Object.create(y.redirectTarget); return Object.defineProperties(I, { id: { get() { return this.redirectInfo.redirectTarget.id }, set(N) { this.redirectInfo.redirectTarget.id = N } }, symbol: { get() { return this.redirectInfo.redirectTarget.symbol }, set(N) { this.redirectInfo.redirectTarget.symbol = N } } }), I.redirectInfo = y, I } function k1(y) { let I = Rv(y.redirectInfo); return I.flags |= y.flags & -9, I.fileName = y.fileName, I.path = y.path, I.resolvedPath = y.resolvedPath, I.originalFileName = y.originalFileName, I.packageJsonLocations = y.packageJsonLocations, I.packageJsonScope = y.packageJsonScope, I.emitNode = void 0, I } function wE(y) { let I = t.createBaseSourceFileNode(308); I.flags |= y.flags & -9; for (let N in y) if (!(fs(I, N) || !fs(y, N))) { if (N === "emitNode") { I.emitNode = void 0; continue } I[N] = y[N] } return I } function RE(y) { let I = y.redirectInfo ? k1(y) : wE(y); return Ir(I, y), I } function OE(y, I, N, te, Me, Pt, Tr) { let Fi = RE(y); return Fi.statements = F(I), Fi.isDeclarationFile = N, Fi.referencedFiles = te, Fi.typeReferenceDirectives = Me, Fi.hasNoDefaultLib = Pt, Fi.libReferenceDirectives = Tr, Fi.transformFlags = fo(Fi.statements) | tr(Fi.endOfFileToken), Fi } function NE(y, I, N = y.isDeclarationFile, te = y.referencedFiles, Me = y.typeReferenceDirectives, Pt = y.hasNoDefaultLib, Tr = y.libReferenceDirectives) { return y.statements !== I || y.isDeclarationFile !== N || y.referencedFiles !== te || y.typeReferenceDirectives !== Me || y.hasNoDefaultLib !== Pt || y.libReferenceDirectives !== Tr ? r(OE(y, I, N, te, Me, Pt, Tr), y) : y } function PE(y, I = Je) { let N = B(309); return N.prepends = I, N.sourceFiles = y, N.syntheticFileReferences = void 0, N.syntheticTypeReferences = void 0, N.syntheticLibReferences = void 0, N.hasNoDefaultLib = void 0, N } function dy(y, I, N = Je) { return y.sourceFiles !== I || y.prepends !== N ? r(PE(I, N), y) : y } function bd(y, I, N) { let te = B(310); return te.prologues = y, te.syntheticReferences = I, te.texts = N, te.fileName = "", te.text = "", te.referencedFiles = Je, te.libReferenceDirectives = Je, te.getLineAndCharacterOfPosition = Me => Gs(te, Me), te } function lh(y, I) { let N = B(y); return N.data = I, N } function dC(y) { return lh(303, y) } function sg(y, I) { let N = lh(304, y); return N.texts = I, N } function Ox(y, I) { return lh(I ? 306 : 305, y) } function Nx(y) { let I = B(307); return I.data = y.data, I.section = y, I } function E() { let y = B(311); return y.javascriptText = "", y.declarationText = "", y } function ne(y, I = !1, N) { let te = B(234); return te.type = y, te.isSpread = I, te.tupleNameSource = N, te } function Ee(y) { let I = B(354); return I._children = y, I } function Wt(y) { let I = B(355); return I.original = y, it(I, y), I } function lr(y, I) { let N = B(356); return N.expression = y, N.original = I, N.transformFlags |= tr(N.expression) | 1, it(N, I), N } function ci(y, I) { return y.expression !== I ? r(lr(I, y.original), y) : y } function qr(y) { if (ws(y) && !dI(y) && !y.original && !y.emitNode && !y.id) { if (SL(y)) return y.elements; if (ar(y) && Cue(y.operatorToken)) return [y.left, y.right] } return y } function Ti(y) { let I = B(357); return I.elements = F(lae(y, qr)), I.transformFlags |= fo(I.elements), I } function Wa(y, I) { return y.elements !== I ? r(Ti(I), y) : y } function kl(y) { let I = B(359); return I.emitNode = {}, I.original = y, I } function Ed(y) { let I = B(358); return I.emitNode = {}, I.original = y, I } function Ud(y, I) { let N = B(360); return N.expression = y, N.thisArg = I, N.transformFlags |= tr(N.expression) | tr(N.thisArg), N } function fy(y, I, N) { return y.expression !== I || y.thisArg !== N ? r(Ud(I, N), y) : y } function Td(y) { let I = re(y.escapedText); return I.flags |= y.flags & -9, I.transformFlags = y.transformFlags, Ir(I, y), iO(I, { ...y.emitNode.autoGenerate }), I } function Ov(y) { let I = re(y.escapedText); I.flags |= y.flags & -9, I.jsDoc = y.jsDoc, I.flowNode = y.flowNode, I.symbol = y.symbol, I.transformFlags = y.transformFlags, Ir(I, y); let N = NT(y); return N && Ug(I, N), I } function Nv(y) { let I = ke(y.escapedText); return I.flags |= y.flags & -9, I.transformFlags = y.transformFlags, Ir(I, y), iO(I, { ...y.emitNode.autoGenerate }), I } function _y(y) { let I = ke(y.escapedText); return I.flags |= y.flags & -9, I.transformFlags = y.transformFlags, Ir(I, y), I } function Xf(y) { if (y === void 0) return y; if (Li(y)) return RE(y); if (tc(y)) return Td(y); if (Re(y)) return Ov(y); if (tS(y)) return Nv(y); if (pi(y)) return _y(y); let I = Iw(y.kind) ? t.createBaseNode(y.kind) : t.createBaseTokenNode(y.kind); I.flags |= y.flags & -9, I.transformFlags = y.transformFlags, Ir(I, y); for (let N in y) fs(I, N) || !fs(y, N) || (I[N] = y[N]); return I } function ME(y, I, N) { return bn(Ea(void 0, void 0, void 0, void 0, I ? [I] : [], void 0, zh(y, !0)), void 0, N ? [N] : []) } function cf(y, I, N) { return bn(Qo(void 0, void 0, I ? [I] : [], void 0, void 0, zh(y, !0)), void 0, N ? [N] : []) } function Sm() { return Zl(Y("0")) } function py(y) { return Qh(void 0, !1, y) } function If(y) { return I_(void 0, !1, Lp([Uu(!1, void 0, y)])) } function FE(y, I) { return I === "undefined" ? P.createStrictEquality(y, Sm()) : P.createStrictEquality(Dc(y), $(I)) } function Pv(y, I, N) { return dT(y) ? io($o(y, void 0, I), void 0, void 0, N) : bn(Uc(y, I), void 0, N) } function Vc(y, I, N) { return Pv(y, "bind", [I, ...N]) } function KP(y, I, N) { return Pv(y, "call", [I, ...N]) } function Zo(y, I, N) { return Pv(y, "apply", [I, N]) } function Ro(y, I, N) { return Pv(_e(y), I, N) } function Px(y, I) { return Pv(y, "slice", I === void 0 ? [] : [Fv(I)]) } function Mx(y, I) { return Pv(y, "concat", I) } function V(y, I, N) { return Ro("Object", "defineProperty", [y, Fv(I), N]) } function me(y, I) { return Ro("Object", "getOwnPropertyDescriptor", [y, Fv(I)]) } function Ue(y, I, N) { return Ro("Reflect", "get", N ? [y, I, N] : [y, I]) } function ut(y, I, N, te) { return Ro("Reflect", "set", te ? [y, I, N, te] : [y, I, N]) } function Lt(y, I, N) { return N ? (y.push(Tm(I, N)), !0) : !1 } function dn(y, I) { let N = []; Lt(N, "enumerable", Fv(y.enumerable)), Lt(N, "configurable", Fv(y.configurable)); let te = Lt(N, "writable", Fv(y.writable)); te = Lt(N, "value", y.value) || te; let Me = Lt(N, "get", y.get); return Me = Lt(N, "set", y.set) || Me, L.assert(!(te && Me), "A PropertyDescriptor may not be both an accessor descriptor and a data descriptor."), vo(N, !I) } function Er(y, I) { switch (y.kind) { case 214: return gi(y, I); case 213: return mr(y, y.type, I); case 231: return mv(y, I, y.type); case 235: return Wh(y, I, y.type); case 232: return _1(y, I); case 356: return ci(y, I) } } function ii(y) { return ud(y) && ws(y) && ws(pb(y)) && ws(sm(y)) && !vt(l2(y)) && !vt(rO(y)) } function li(y, I, N = 15) { return y && S3(y, N) && !ii(y) ? Er(y, li(y.expression, I)) : I } function di(y, I, N) { if (!I) return y; let te = h1(I, I.label, J0(I.statement) ? di(y, I.statement) : y); return N && N(I), te } function ma(y, I) { let N = vs(y); switch (N.kind) { case 79: return I; case 108: case 8: case 9: case 10: return !1; case 206: return N.elements.length !== 0; case 207: return N.properties.length > 0; default: return !0 } } function is(y, I, N, te = !1) { let Me = ql(y, 15), Pt, Tr; return Pu(Me) ? (Pt = _t(), Tr = Me) : hL(Me) ? (Pt = _t(), Tr = N !== void 0 && N < 2 ? it(_e("_super"), Me) : Me) : Ya(Me) & 8192 ? (Pt = Sm(), Tr = i().parenthesizeLeftSideOfAccess(Me, !1)) : br(Me) ? ma(Me.expression, te) ? (Pt = ge(I), Tr = Uc(it(P.createAssignment(Pt, Me.expression), Me.expression), Me.name), it(Tr, Me)) : (Pt = Me.expression, Tr = Me) : Vs(Me) ? ma(Me.expression, te) ? (Pt = ge(I), Tr = hd(it(P.createAssignment(Pt, Me.expression), Me.expression), Me.argumentExpression), it(Tr, Me)) : (Pt = Me.expression, Tr = Me) : (Pt = Sm(), Tr = i().parenthesizeLeftSideOfAccess(y, !1)), { target: Tr, thisArg: Pt } } function ao(y, I) { return Uc(Vr(vo([Q(void 0, "value", [ui(void 0, void 0, y, void 0, void 0, void 0)], zh([yv(I)]))])), "value") } function Oo(y) { return y.length > 10 ? Ti(y) : ou(y, P.createComma) } function id(y, I, N, te = 0) { let Me = sa(y); if (Me && Re(Me) && !tc(Me)) { let Pt = go(it(Xf(Me), Me), Me.parent); return te |= Ya(Me), N || (te |= 96), I || (te |= 3072), te && Jn(Pt, te), Pt } return we(y) } function np(y, I, N) { return id(y, I, N, 98304) } function Op(y, I, N) { return id(y, I, N, 32768) } function cg(y, I, N) { return id(y, I, N, 16384) } function Yf(y, I, N) { return id(y, I, N) } function my(y, I, N, te) { let Me = Uc(y, ws(I) ? I : Xf(I)); it(Me, I); let Pt = 0; return te || (Pt |= 96), N || (Pt |= 3072), Pt && Jn(Me, Pt), Me } function Fx(y, I, N, te) { return y && Mr(I, 1) ? my(y, id(I), N, te) : cg(I, N, te) } function GE(y, I, N, te) { let Me = Mv(y, I, 0, N); return _C(y, I, Me, te) } function fC(y) { return yo(y.expression) && y.expression.text === "use strict" } function k_() { return mu(yv($("use strict"))) } function Mv(y, I, N = 0, te) { L.assert(I.length === 0, "Prologue directives should be at the first statement in the target statements array"); let Me = !1, Pt = y.length; for (; N < Pt;) { let Tr = y[N]; if (B_(Tr)) fC(Tr) && (Me = !0), I.push(Tr); else break; N++ } return te && !Me && I.push(k_()), N } function _C(y, I, N, te, Me = h0) { let Pt = y.length; for (; N !== void 0 && N < Pt;) { let Tr = y[N]; if (Ya(Tr) & 2097152 && Me(Tr)) Sn(I, te ? $e(Tr, te, ca) : Tr); else break; N++ } return N } function lf(y) { return tJ(y) ? y : it(F([k_(), ...y]), y) } function Gx(y) { return L.assert(Ji(y, Ese), "Cannot lift nodes to a Block."), Wp(y) || zh(y) } function hy(y, I, N) { let te = N; for (; te < y.length && I(y[te]);)te++; return te } function jk(y, I) { if (!vt(I)) return y; let N = hy(y, B_, 0), te = hy(y, C6, N), Me = hy(y, I6, te), Pt = hy(I, B_, 0), Tr = hy(I, C6, Pt), Fi = hy(I, I6, Tr), Da = hy(I, A6, Fi); L.assert(Da === I.length, "Expected declarations to be valid standard or custom prologues"); let Vd = C0(y) ? y.slice() : y; if (Da > Fi && Vd.splice(Me, 0, ...I.slice(Fi, Da)), Fi > Tr && Vd.splice(te, 0, ...I.slice(Tr, Fi)), Tr > Pt && Vd.splice(N, 0, ...I.slice(Pt, Tr)), Pt > 0) if (N === 0) Vd.splice(0, 0, ...I.slice(0, Pt)); else { let lg = new Map; for (let ug = 0; ug < N; ug++) { let dg = y[ug]; lg.set(dg.expression.text, !0) } for (let ug = Pt - 1; ug >= 0; ug--) { let dg = I[ug]; lg.has(dg.expression.text) || Vd.unshift(dg) } } return C0(y) ? it(F(Vd, y.hasTrailingComma), y) : y } function Hk(y, I) { var N; let te; return typeof I == "number" ? te = zt(I) : te = I, _c(y) ? $n(y, te, y.name, y.constraint, y.default) : ha(y) ? Ni(y, te, y.dotDotDotToken, y.name, y.questionToken, y.type, y.initializer) : yL(y) ? Hn(y, te, y.typeParameters, y.parameters, y.type) : $d(y) ? nn(y, te, y.name, y.questionToken, y.type) : Na(y) ? An(y, te, y.name, (N = y.questionToken) != null ? N : y.exclamationToken, y.type, y.initializer) : zm(y) ? hi(y, te, y.name, y.questionToken, y.typeParameters, y.parameters, y.type) : Nc(y) ? vn(y, te, y.asteriskToken, y.name, y.questionToken, y.typeParameters, y.parameters, y.type, y.body) : Ec(y) ? at(y, te, y.parameters, y.body) : p_(y) ? nt(y, te, y.name, y.parameters, y.type, y.body) : Sf(y) ? ue(y, te, y.name, y.parameters, y.body) : kS(y) ? ln(y, te, y.parameters, y.type) : ms(y) ? bo(y, te, y.asteriskToken, y.name, y.typeParameters, y.parameters, y.type, y.body) : xs(y) ? Cs(y, te, y.typeParameters, y.parameters, y.type, y.equalsGreaterThanToken, y.body) : _u(y) ? Mc(y, te, y.name, y.typeParameters, y.heritageClauses, y.members) : Bc(y) ? dE(y, te, y.declarationList) : Jc(y) ? Sv(y, te, y.asteriskToken, y.name, y.typeParameters, y.parameters, y.type, y.body) : sl(y) ? wo(y, te, y.name, y.typeParameters, y.heritageClauses, y.members) : ku(y) ? gE(y, te, y.name, y.typeParameters, y.heritageClauses, y.members) : Ep(y) ? th(y, te, y.name, y.typeParameters, y.type) : hb(y) ? C_(y, te, y.name, y.members) : Tc(y) ? Ml(y, te, y.name, y.body) : Nl(y) ? yE(y, te, y.isTypeOnly, y.name, y.moduleReference) : gl(y) ? nh(y, te, y.importClause, y.moduleSpecifier, y.assertClause) : pc(y) ? Q_(y, te, y.expression) : Il(y) ? Ax(y, te, y.isTypeOnly, y.exportClause, y.moduleSpecifier, y.assertClause) : L.assertNever(y) } function oo(y) { return y ? F(y) : void 0 } function Zs(y) { return typeof y == "string" ? _e(y) : y } function Fv(y) { return typeof y == "string" ? $(y) : typeof y == "number" ? Y(y) : typeof y == "boolean" ? y ? Rt() : We() : y } function gy(y) { return y && i().parenthesizeExpressionForDisallowedComma(y) } function Wk(y) { return typeof y == "number" ? Le(y) : y } function ad(y) { return y && Gz(y) ? it(Ir(fE(), y), y) : y } function zk(y) { return typeof y == "string" || y && !wi(y) ? Fe(y, void 0, void 0, void 0) : y } } function CRe(e, t) { return e !== t && it(e, t), e } function IRe(e, t) { return e !== t && (Ir(e, t), it(e, t)), e } function w4(e) { switch (e) { case 347: return "type"; case 345: return "returns"; case 346: return "this"; case 343: return "enum"; case 333: return "author"; case 335: return "class"; case 336: return "public"; case 337: return "private"; case 338: return "protected"; case 339: return "readonly"; case 340: return "override"; case 348: return "template"; case 349: return "typedef"; case 344: return "param"; case 351: return "prop"; case 341: return "callback"; case 342: return "overload"; case 331: return "augments"; case 332: return "implements"; default: return L.fail(`Unsupported kind: ${L.formatSyntaxKind(e)}`) } } function LRe(e, t) { switch (Ph || (Ph = kg(99, !1, 0)), e) { case 14: Ph.setText("`" + t + "`"); break; case 15: Ph.setText("`" + t + "${"); break; case 16: Ph.setText("}" + t + "${"); break; case 17: Ph.setText("}" + t + "`"); break }let r = Ph.scan(); if (r === 19 && (r = Ph.reScanTemplateToken(!1)), Ph.isUnterminated()) return Ph.setText(void 0), gz; let i; switch (r) { case 14: case 15: case 16: case 17: i = Ph.getTokenValue(); break }return i === void 0 || Ph.scan() !== 1 ? (Ph.setText(void 0), gz) : (Ph.setText(void 0), i) } function Gg(e) { return e && Re(e) ? fL(e) : tr(e) } function fL(e) { return tr(e) & -67108865 } function kRe(e, t) { return t | e.transformFlags & 134234112 } function tr(e) { if (!e) return 0; let t = e.transformFlags & ~uue(e.kind); return zl(e) && Ys(e.name) ? kRe(e.name, t) : t } function fo(e) { return e ? e.transformFlags : 0 } function lue(e) { let t = 0; for (let r of e) t |= tr(r); e.transformFlags = t } function uue(e) { if (e >= 179 && e <= 202) return -2; switch (e) { case 210: case 211: case 206: return -2147450880; case 264: return -1941676032; case 166: return -2147483648; case 216: return -2072174592; case 215: case 259: return -1937940480; case 258: return -2146893824; case 260: case 228: return -2147344384; case 173: return -1937948672; case 169: return -2013249536; case 171: case 174: case 175: return -2005057536; case 131: case 148: case 160: case 144: case 152: case 149: case 134: case 153: case 114: case 165: case 168: case 170: case 176: case 177: case 178: case 261: case 262: return -2; case 207: return -2147278848; case 295: return -2147418112; case 203: case 204: return -2147450880; case 213: case 235: case 231: case 356: case 214: case 106: return -2147483648; case 208: case 209: return -2147483648; default: return -2147483648 } } function $R(e) { return e.flags |= 8, e } function fz(e, t, r) { let i, o, s, l, f, d, g, m, v, S; Ta(e) ? (s = "", l = e, f = e.length, d = t, g = r) : (L.assert(t === "js" || t === "dts"), s = (t === "js" ? e.javascriptPath : e.declarationPath) || "", d = t === "js" ? e.javascriptMapPath : e.declarationMapPath, m = () => t === "js" ? e.javascriptText : e.declarationText, v = () => t === "js" ? e.javascriptMapText : e.declarationMapText, f = () => m().length, e.buildInfo && e.buildInfo.bundle && (L.assert(r === void 0 || typeof r == "boolean"), i = r, o = t === "js" ? e.buildInfo.bundle.js : e.buildInfo.bundle.dts, S = e.oldFileOfCurrentEmit)); let x = S ? wRe(L.checkDefined(o)) : DRe(o, i, f); return x.fileName = s, x.sourceMapPath = d, x.oldFileOfCurrentEmit = S, m && v ? (Object.defineProperty(x, "text", { get: m }), Object.defineProperty(x, "sourceMapText", { get: v })) : (L.assert(!S), x.text = l ?? "", x.sourceMapText = g), x } function DRe(e, t, r) { let i, o, s, l, f, d, g, m; for (let S of e ? e.sections : Je) switch (S.kind) { case "prologue": i = Sn(i, it(D.createUnparsedPrologue(S.data), S)); break; case "emitHelpers": o = Sn(o, xz().get(S.data)); break; case "no-default-lib": m = !0; break; case "reference": s = Sn(s, { pos: -1, end: -1, fileName: S.data }); break; case "type": l = Sn(l, { pos: -1, end: -1, fileName: S.data }); break; case "type-import": l = Sn(l, { pos: -1, end: -1, fileName: S.data, resolutionMode: 99 }); break; case "type-require": l = Sn(l, { pos: -1, end: -1, fileName: S.data, resolutionMode: 1 }); break; case "lib": f = Sn(f, { pos: -1, end: -1, fileName: S.data }); break; case "prepend": let x; for (let A of S.texts) (!t || A.kind !== "internal") && (x = Sn(x, it(D.createUnparsedTextLike(A.data, A.kind === "internal"), A))); d = si(d, x), g = Sn(g, D.createUnparsedPrepend(S.data, x ?? Je)); break; case "internal": if (t) { g || (g = []); break } case "text": g = Sn(g, it(D.createUnparsedTextLike(S.data, S.kind === "internal"), S)); break; default: L.assertNever(S) }if (!g) { let S = D.createUnparsedTextLike(void 0, !1); oL(S, 0, typeof r == "function" ? r() : r), g = [S] } let v = fm.createUnparsedSource(i ?? Je, void 0, g); return i2(i, v), i2(g, v), i2(d, v), v.hasNoDefaultLib = m, v.helpers = o, v.referencedFiles = s || Je, v.typeReferenceDirectives = l, v.libReferenceDirectives = f || Je, v } function wRe(e) { let t, r; for (let o of e.sections) switch (o.kind) { case "internal": case "text": t = Sn(t, it(D.createUnparsedTextLike(o.data, o.kind === "internal"), o)); break; case "no-default-lib": case "reference": case "type": case "type-import": case "type-require": case "lib": r = Sn(r, it(D.createUnparsedSyntheticReference(o), o)); break; case "prologue": case "emitHelpers": case "prepend": break; default: L.assertNever(o) }let i = D.createUnparsedSource(Je, r, t ?? Je); return i2(r, i), i2(t, i), i.helpers = on(e.sources && e.sources.helpers, o => xz().get(o)), i } function RRe(e, t, r, i, o, s) { return Ta(e) ? pz(void 0, e, r, i, void 0, t, o, s) : _z(e, t, r, i, o, s) } function _z(e, t, r, i, o, s, l, f) {
+                let d = fm.createInputFiles(); d.javascriptPath = t, d.javascriptMapPath = r, d.declarationPath = i, d.declarationMapPath = o, d.buildInfoPath = s; let g = new Map, m = A => { if (A === void 0) return; let w = g.get(A); return w === void 0 && (w = e(A), g.set(A, w !== void 0 ? w : !1)), w !== !1 ? w : void 0 }, v = A => {
+                    let w = m(A); return w !== void 0 ? w : `/* Input file ${A} was missing */\r
+`}, S; return Object.defineProperties(d, { javascriptText: { get: () => v(t) }, javascriptMapText: { get: () => m(r) }, declarationText: { get: () => v(L.checkDefined(i)) }, declarationMapText: { get: () => m(o) }, buildInfo: { get: () => { var A, w; if (S === void 0 && s) if (l?.getBuildInfo) S = (A = l.getBuildInfo(s, f.configFilePath)) != null ? A : !1; else { let C = m(s); S = C !== void 0 && (w = IF(s, C)) != null ? w : !1 } return S || void 0 } } }), d
+            } function pz(e, t, r, i, o, s, l, f, d, g, m) { let v = fm.createInputFiles(); return v.javascriptPath = e, v.javascriptText = t, v.javascriptMapPath = r, v.javascriptMapText = i, v.declarationPath = o, v.declarationText = s, v.declarationMapPath = l, v.declarationMapText = f, v.buildInfoPath = d, v.buildInfo = g, v.oldFileOfCurrentEmit = m, v } function ORe(e, t, r) { return new (fue || (fue = ml.getSourceMapSourceConstructor()))(e, t, r) } function Ir(e, t) { if (e.original = t, t) { let r = t.emitNode; r && (e.emitNode = NRe(r, e.emitNode)) } return e } function NRe(e, t) { let { flags: r, internalFlags: i, leadingComments: o, trailingComments: s, commentRange: l, sourceMapRange: f, tokenSourceMapRanges: d, constantValue: g, helpers: m, startsOnNewLine: v, snippetElement: S } = e; if (t || (t = {}), o && (t.leadingComments = si(o.slice(), t.leadingComments)), s && (t.trailingComments = si(s.slice(), t.trailingComments)), r && (t.flags = r), i && (t.internalFlags = i & -9), l && (t.commentRange = l), f && (t.sourceMapRange = f), d && (t.tokenSourceMapRanges = PRe(d, t.tokenSourceMapRanges)), g !== void 0 && (t.constantValue = g), m) for (let x of m) t.helpers = xg(t.helpers, x); return v !== void 0 && (t.startsOnNewLine = v), S !== void 0 && (t.snippetElement = S), t } function PRe(e, t) { t || (t = []); for (let r in e) t[r] = e[r]; return t } var QR, mz, hz, Ph, gz, _L, due, D, fue, MRe = gt({ "src/compiler/factory/nodeFactory.ts"() { "use strict"; fa(), QR = 0, mz = (e => (e[e.None = 0] = "None", e[e.NoParenthesizerRules = 1] = "NoParenthesizerRules", e[e.NoNodeConverters = 2] = "NoNodeConverters", e[e.NoIndentationOnFreshPropertyAccess = 4] = "NoIndentationOnFreshPropertyAccess", e[e.NoOriginalNode = 8] = "NoOriginalNode", e))(mz || {}), hz = [], gz = {}, _L = oue(), due = { createBaseSourceFileNode: e => $R(_L.createBaseSourceFileNode(e)), createBaseIdentifierNode: e => $R(_L.createBaseIdentifierNode(e)), createBasePrivateIdentifierNode: e => $R(_L.createBasePrivateIdentifierNode(e)), createBaseTokenNode: e => $R(_L.createBaseTokenNode(e)), createBaseNode: e => $R(_L.createBaseNode(e)) }, D = YR(4, due) } }); function Lu(e) { var t; if (e.emitNode) L.assert(!(e.emitNode.internalFlags & 8), "Invalid attempt to mutate an immutable node."); else { if (dI(e)) { if (e.kind === 308) return e.emitNode = { annotatedNodes: [e] }; let r = (t = Gn(ea(Gn(e)))) != null ? t : L.fail("Could not determine parsed source file."); Lu(r).annotatedNodes.push(e) } e.emitNode = {} } return e.emitNode } function yz(e) { var t, r; let i = (r = (t = Gn(ea(e))) == null ? void 0 : t.emitNode) == null ? void 0 : r.annotatedNodes; if (i) for (let o of i) o.emitNode = void 0 } function ZR(e) { let t = Lu(e); return t.flags |= 3072, t.leadingComments = void 0, t.trailingComments = void 0, e } function Jn(e, t) { return Lu(e).flags = t, e } function bp(e, t) { let r = Lu(e); return r.flags = r.flags | t, e } function eO(e, t) { return Lu(e).internalFlags = t, e } function SS(e, t) { let r = Lu(e); return r.internalFlags = r.internalFlags | t, e } function pb(e) { var t, r; return (r = (t = e.emitNode) == null ? void 0 : t.sourceMapRange) != null ? r : e } function Ho(e, t) { return Lu(e).sourceMapRange = t, e } function FRe(e, t) { var r, i; return (i = (r = e.emitNode) == null ? void 0 : r.tokenSourceMapRanges) == null ? void 0 : i[t] } function _ue(e, t, r) { var i; let o = Lu(e), s = (i = o.tokenSourceMapRanges) != null ? i : o.tokenSourceMapRanges = []; return s[t] = r, e } function tO(e) { var t; return (t = e.emitNode) == null ? void 0 : t.startsOnNewLine } function vz(e, t) { return Lu(e).startsOnNewLine = t, e } function sm(e) { var t, r; return (r = (t = e.emitNode) == null ? void 0 : t.commentRange) != null ? r : e } function hl(e, t) { return Lu(e).commentRange = t, e } function l2(e) { var t; return (t = e.emitNode) == null ? void 0 : t.leadingComments } function W0(e, t) { return Lu(e).leadingComments = t, e } function nO(e, t, r, i) { return W0(e, Sn(l2(e), { kind: t, pos: -1, end: -1, hasTrailingNewLine: i, text: r })) } function rO(e) { var t; return (t = e.emitNode) == null ? void 0 : t.trailingComments } function u2(e, t) { return Lu(e).trailingComments = t, e } function R4(e, t, r, i) { return u2(e, Sn(rO(e), { kind: t, pos: -1, end: -1, hasTrailingNewLine: i, text: r })) } function pue(e, t) { W0(e, l2(t)), u2(e, rO(t)); let r = Lu(t); return r.leadingComments = void 0, r.trailingComments = void 0, e } function mue(e) { var t; return (t = e.emitNode) == null ? void 0 : t.constantValue } function hue(e, t) { let r = Lu(e); return r.constantValue = t, e } function xS(e, t) { let r = Lu(e); return r.helpers = Sn(r.helpers, t), e } function Bg(e, t) { if (vt(t)) { let r = Lu(e); for (let i of t) r.helpers = xg(r.helpers, i) } return e } function GRe(e, t) { var r; let i = (r = e.emitNode) == null ? void 0 : r.helpers; return i ? m8(i, t) : !1 } function O4(e) { var t; return (t = e.emitNode) == null ? void 0 : t.helpers } function gue(e, t, r) { let i = e.emitNode, o = i && i.helpers; if (!vt(o)) return; let s = Lu(t), l = 0; for (let f = 0; f < o.length; f++) { let d = o[f]; r(d) ? (l++, s.helpers = xg(s.helpers, d)) : l > 0 && (o[f - l] = d) } l > 0 && (o.length -= l) } function bz(e) { var t; return (t = e.emitNode) == null ? void 0 : t.snippetElement } function Ez(e, t) { let r = Lu(e); return r.snippetElement = t, e } function Tz(e) { return Lu(e).internalFlags |= 4, e } function yue(e, t) { let r = Lu(e); return r.typeNode = t, e } function vue(e) { var t; return (t = e.emitNode) == null ? void 0 : t.typeNode } function Ug(e, t) { return Lu(e).identifierTypeArguments = t, e } function NT(e) { var t; return (t = e.emitNode) == null ? void 0 : t.identifierTypeArguments } function iO(e, t) { return Lu(e).autoGenerate = t, e } function BRe(e) { var t; return (t = e.emitNode) == null ? void 0 : t.autoGenerate } function bue(e, t) { return Lu(e).generatedImportReference = t, e } function Eue(e) { var t; return (t = e.emitNode) == null ? void 0 : t.generatedImportReference } var URe = gt({ "src/compiler/factory/emitNode.ts"() { "use strict"; fa() } }); function Tue(e) { let t = e.factory, r = zu(() => eO(t.createTrue(), 8)), i = zu(() => eO(t.createFalse(), 8)); return { getUnscopedHelperName: o, createDecorateHelper: s, createMetadataHelper: l, createParamHelper: f, createESDecorateHelper: w, createRunInitializersHelper: C, createAssignHelper: P, createAwaitHelper: F, createAsyncGeneratorHelper: B, createAsyncDelegatorHelper: q, createAsyncValuesHelper: W, createRestHelper: Y, createAwaiterHelper: R, createExtendsHelper: ie, createTemplateObjectHelper: $, createSpreadArrayHelper: fe, createPropKeyHelper: Z, createSetFunctionNameHelper: U, createValuesHelper: re, createReadHelper: le, createGeneratorHelper: _e, createCreateBindingHelper: ge, createImportStarHelper: X, createImportStarCallbackHelper: Ve, createImportDefaultHelper: we, createExportStarHelper: ke, createClassPrivateFieldGetHelper: Pe, createClassPrivateFieldSetHelper: Ce, createClassPrivateFieldInHelper: Ie }; function o(Be) { return Jn(t.createIdentifier(Be), 8196) } function s(Be, Ne, Le, Ye) { e.requestEmitHelper(N4); let _t = []; return _t.push(t.createArrayLiteralExpression(Be, !0)), _t.push(Ne), Le && (_t.push(Le), Ye && _t.push(Ye)), t.createCallExpression(o("__decorate"), void 0, _t) } function l(Be, Ne) { return e.requestEmitHelper(P4), t.createCallExpression(o("__metadata"), void 0, [t.createStringLiteral(Be), Ne]) } function f(Be, Ne, Le) { return e.requestEmitHelper(M4), it(t.createCallExpression(o("__param"), void 0, [t.createNumericLiteral(Ne + ""), Be]), Le) } function d(Be) { return t.createObjectLiteralExpression([t.createPropertyAssignment(t.createIdentifier("kind"), t.createStringLiteral("class")), t.createPropertyAssignment(t.createIdentifier("name"), Be.name)]) } function g(Be) { let Ne = Be.computed ? t.createElementAccessExpression(t.createIdentifier("obj"), Be.name) : t.createPropertyAccessExpression(t.createIdentifier("obj"), Be.name); return t.createPropertyAssignment("get", t.createArrowFunction(void 0, void 0, [t.createParameterDeclaration(void 0, void 0, t.createIdentifier("obj"))], void 0, void 0, Ne)) } function m(Be) { let Ne = Be.computed ? t.createElementAccessExpression(t.createIdentifier("obj"), Be.name) : t.createPropertyAccessExpression(t.createIdentifier("obj"), Be.name); return t.createPropertyAssignment("set", t.createArrowFunction(void 0, void 0, [t.createParameterDeclaration(void 0, void 0, t.createIdentifier("obj")), t.createParameterDeclaration(void 0, void 0, t.createIdentifier("value"))], void 0, void 0, t.createBlock([t.createExpressionStatement(t.createAssignment(Ne, t.createIdentifier("value")))]))) } function v(Be) { let Ne = Be.computed ? Be.name : Re(Be.name) ? t.createStringLiteralFromNode(Be.name) : Be.name; return t.createPropertyAssignment("has", t.createArrowFunction(void 0, void 0, [t.createParameterDeclaration(void 0, void 0, t.createIdentifier("obj"))], void 0, void 0, t.createBinaryExpression(Ne, 101, t.createIdentifier("obj")))) } function S(Be, Ne) { let Le = []; return Le.push(v(Be)), Ne.get && Le.push(g(Be)), Ne.set && Le.push(m(Be)), t.createObjectLiteralExpression(Le) } function x(Be) { return t.createObjectLiteralExpression([t.createPropertyAssignment(t.createIdentifier("kind"), t.createStringLiteral(Be.kind)), t.createPropertyAssignment(t.createIdentifier("name"), Be.name.computed ? Be.name.name : t.createStringLiteralFromNode(Be.name.name)), t.createPropertyAssignment(t.createIdentifier("static"), Be.static ? t.createTrue() : t.createFalse()), t.createPropertyAssignment(t.createIdentifier("private"), Be.private ? t.createTrue() : t.createFalse()), t.createPropertyAssignment(t.createIdentifier("access"), S(Be.name, Be.access))]) } function A(Be) { return Be.kind === "class" ? d(Be) : x(Be) } function w(Be, Ne, Le, Ye, _t, ct) { return e.requestEmitHelper(F4), t.createCallExpression(o("__esDecorate"), void 0, [Be ?? t.createNull(), Ne ?? t.createNull(), Le, A(Ye), _t, ct]) } function C(Be, Ne, Le) { return e.requestEmitHelper(G4), t.createCallExpression(o("__runInitializers"), void 0, Le ? [Be, Ne, Le] : [Be, Ne]) } function P(Be) { return Do(e.getCompilerOptions()) >= 2 ? t.createCallExpression(t.createPropertyAccessExpression(t.createIdentifier("Object"), "assign"), void 0, Be) : (e.requestEmitHelper(B4), t.createCallExpression(o("__assign"), void 0, Be)) } function F(Be) { return e.requestEmitHelper(AS), t.createCallExpression(o("__await"), void 0, [Be]) } function B(Be, Ne) { return e.requestEmitHelper(AS), e.requestEmitHelper(U4), (Be.emitNode || (Be.emitNode = {})).flags |= 1572864, t.createCallExpression(o("__asyncGenerator"), void 0, [Ne ? t.createThis() : t.createVoidZero(), t.createIdentifier("arguments"), Be]) } function q(Be) { return e.requestEmitHelper(AS), e.requestEmitHelper(V4), t.createCallExpression(o("__asyncDelegator"), void 0, [Be]) } function W(Be) { return e.requestEmitHelper(j4), t.createCallExpression(o("__asyncValues"), void 0, [Be]) } function Y(Be, Ne, Le, Ye) { e.requestEmitHelper(H4); let _t = [], ct = 0; for (let Rt = 0; Rt < Ne.length - 1; Rt++) { let We = rJ(Ne[Rt]); if (We) if (ts(We)) { L.assertIsDefined(Le, "Encountered computed property name but 'computedTempVariables' argument was not provided."); let qe = Le[ct]; ct++, _t.push(t.createConditionalExpression(t.createTypeCheck(qe, "symbol"), void 0, qe, void 0, t.createAdd(qe, t.createStringLiteral("")))) } else _t.push(t.createStringLiteralFromNode(We)) } return t.createCallExpression(o("__rest"), void 0, [Be, it(t.createArrayLiteralExpression(_t), Ye)]) } function R(Be, Ne, Le, Ye) { e.requestEmitHelper(W4); let _t = t.createFunctionExpression(void 0, t.createToken(41), void 0, void 0, [], void 0, Ye); return (_t.emitNode || (_t.emitNode = {})).flags |= 1572864, t.createCallExpression(o("__awaiter"), void 0, [Be ? t.createThis() : t.createVoidZero(), Ne ? t.createIdentifier("arguments") : t.createVoidZero(), Le ? EO(t, Le) : t.createVoidZero(), _t]) } function ie(Be) { return e.requestEmitHelper(z4), t.createCallExpression(o("__extends"), void 0, [Be, t.createUniqueName("_super", 48)]) } function $(Be, Ne) { return e.requestEmitHelper(J4), t.createCallExpression(o("__makeTemplateObject"), void 0, [Be, Ne]) } function fe(Be, Ne, Le) { return e.requestEmitHelper(q4), t.createCallExpression(o("__spreadArray"), void 0, [Be, Ne, Le ? r() : i()]) } function Z(Be) { return e.requestEmitHelper(X4), t.createCallExpression(o("__propKey"), void 0, [Be]) } function U(Be, Ne, Le) { return e.requestEmitHelper(Y4), e.factory.createCallExpression(o("__setFunctionName"), void 0, Le ? [Be, Ne, e.factory.createStringLiteral(Le)] : [Be, Ne]) } function re(Be) { return e.requestEmitHelper($4), t.createCallExpression(o("__values"), void 0, [Be]) } function le(Be, Ne) { return e.requestEmitHelper(K4), t.createCallExpression(o("__read"), void 0, Ne !== void 0 ? [Be, t.createNumericLiteral(Ne + "")] : [Be]) } function _e(Be) { return e.requestEmitHelper(Q4), t.createCallExpression(o("__generator"), void 0, [t.createThis(), Be]) } function ge(Be, Ne, Le) { return e.requestEmitHelper(d2), t.createCallExpression(o("__createBinding"), void 0, [t.createIdentifier("exports"), Be, Ne, ...Le ? [Le] : []]) } function X(Be) { return e.requestEmitHelper(aO), t.createCallExpression(o("__importStar"), void 0, [Be]) } function Ve() { return e.requestEmitHelper(aO), o("__importStar") } function we(Be) { return e.requestEmitHelper(e3), t.createCallExpression(o("__importDefault"), void 0, [Be]) } function ke(Be, Ne = t.createIdentifier("exports")) { return e.requestEmitHelper(t3), e.requestEmitHelper(d2), t.createCallExpression(o("__exportStar"), void 0, [Be, Ne]) } function Pe(Be, Ne, Le, Ye) { e.requestEmitHelper(n3); let _t; return Ye ? _t = [Be, Ne, t.createStringLiteral(Le), Ye] : _t = [Be, Ne, t.createStringLiteral(Le)], t.createCallExpression(o("__classPrivateFieldGet"), void 0, _t) } function Ce(Be, Ne, Le, Ye, _t) { e.requestEmitHelper(r3); let ct; return _t ? ct = [Be, Ne, Le, t.createStringLiteral(Ye), _t] : ct = [Be, Ne, Le, t.createStringLiteral(Ye)], t.createCallExpression(o("__classPrivateFieldSet"), void 0, ct) } function Ie(Be, Ne) { return e.requestEmitHelper(i3), t.createCallExpression(o("__classPrivateFieldIn"), void 0, [Be, Ne]) } } function Sue(e, t) { return e === t || e.priority === t.priority ? 0 : e.priority === void 0 ? 1 : t.priority === void 0 ? -1 : Es(e.priority, t.priority) } function Sz(e, ...t) { return r => { let i = ""; for (let o = 0; o < t.length; o++)i += e[o], i += r(t[o]); return i += e[e.length - 1], i } } function xz() { return xue || (xue = p0([N4, P4, M4, F4, G4, B4, AS, U4, V4, j4, H4, W4, z4, J4, q4, $4, K4, X4, Y4, Q4, aO, e3, t3, n3, r3, i3, d2, Z4], e => e.name)) } function pL(e, t) { return Pa(e) && Re(e.expression) && (Ya(e.expression) & 8192) !== 0 && e.expression.escapedText === t } var Az, N4, P4, M4, F4, G4, B4, AS, U4, V4, j4, H4, W4, z4, J4, K4, q4, X4, Y4, $4, Q4, d2, Z4, aO, e3, t3, n3, r3, i3, xue, oO, sO, VRe = gt({
+                "src/compiler/factory/emitHelpers.ts"() {
+                    "use strict"; fa(), Az = (e => (e.Field = "f", e.Method = "m", e.Accessor = "a", e))(Az || {}), N4 = {
+                        name: "typescript:decorate", importName: "__decorate", scoped: !1, priority: 2, text: `
+            var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+                var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+                if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+                else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+                return c > 3 && r && Object.defineProperty(target, key, r), r;
+            };`}, P4 = {
+                            name: "typescript:metadata", importName: "__metadata", scoped: !1, priority: 3, text: `
+            var __metadata = (this && this.__metadata) || function (k, v) {
+                if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+            };`}, M4 = {
+                            name: "typescript:param", importName: "__param", scoped: !1, priority: 4, text: `
+            var __param = (this && this.__param) || function (paramIndex, decorator) {
+                return function (target, key) { decorator(target, key, paramIndex); }
+            };`}, F4 = {
+                            name: "typescript:esDecorate", importName: "__esDecorate", scoped: !1, priority: 2, text: `
+        var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
+            function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
+            var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
+            var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
+            var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
+            var _, done = false;
+            for (var i = decorators.length - 1; i >= 0; i--) {
+                var context = {};
+                for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
+                for (var p in contextIn.access) context.access[p] = contextIn.access[p];
+                context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
+                var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
+                if (kind === "accessor") {
+                    if (result === void 0) continue;
+                    if (result === null || typeof result !== "object") throw new TypeError("Object expected");
+                    if (_ = accept(result.get)) descriptor.get = _;
+                    if (_ = accept(result.set)) descriptor.set = _;
+                    if (_ = accept(result.init)) initializers.push(_);
+                }
+                else if (_ = accept(result)) {
+                    if (kind === "field") initializers.push(_);
+                    else descriptor[key] = _;
+                }
+            }
+            if (target) Object.defineProperty(target, contextIn.name, descriptor);
+            done = true;
+        };`}, G4 = {
+                            name: "typescript:runInitializers", importName: "__runInitializers", scoped: !1, priority: 2, text: `
+        var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
+            var useValue = arguments.length > 2;
+            for (var i = 0; i < initializers.length; i++) {
+                value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
+            }
+            return useValue ? value : void 0;
+        };`}, B4 = {
+                            name: "typescript:assign", importName: "__assign", scoped: !1, priority: 1, text: `
+            var __assign = (this && this.__assign) || function () {
+                __assign = Object.assign || function(t) {
+                    for (var s, i = 1, n = arguments.length; i < n; i++) {
+                        s = arguments[i];
+                        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+                            t[p] = s[p];
+                    }
+                    return t;
+                };
+                return __assign.apply(this, arguments);
+            };`}, AS = {
+                            name: "typescript:await", importName: "__await", scoped: !1, text: `
+            var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }`}, U4 = {
+                            name: "typescript:asyncGenerator", importName: "__asyncGenerator", scoped: !1, dependencies: [AS], text: `
+            var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
+                if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
+                var g = generator.apply(thisArg, _arguments || []), i, q = [];
+                return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
+                function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
+                function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
+                function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
+                function fulfill(value) { resume("next", value); }
+                function reject(value) { resume("throw", value); }
+                function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
+            };`}, V4 = {
+                            name: "typescript:asyncDelegator", importName: "__asyncDelegator", scoped: !1, dependencies: [AS], text: `
+            var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
+                var i, p;
+                return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
+                function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
+            };`}, j4 = {
+                            name: "typescript:asyncValues", importName: "__asyncValues", scoped: !1, text: `
+            var __asyncValues = (this && this.__asyncValues) || function (o) {
+                if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
+                var m = o[Symbol.asyncIterator], i;
+                return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
+                function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
+                function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
+            };`}, H4 = {
+                            name: "typescript:rest", importName: "__rest", scoped: !1, text: `
+            var __rest = (this && this.__rest) || function (s, e) {
+                var t = {};
+                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
+                    t[p] = s[p];
+                if (s != null && typeof Object.getOwnPropertySymbols === "function")
+                    for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
+                        if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
+                            t[p[i]] = s[p[i]];
+                    }
+                return t;
+            };`}, W4 = {
+                            name: "typescript:awaiter", importName: "__awaiter", scoped: !1, priority: 5, text: `
+            var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+                function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+                return new (P || (P = Promise))(function (resolve, reject) {
+                    function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+                    function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+                    function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+                    step((generator = generator.apply(thisArg, _arguments || [])).next());
+                });
+            };`}, z4 = {
+                            name: "typescript:extends", importName: "__extends", scoped: !1, priority: 0, text: `
+            var __extends = (this && this.__extends) || (function () {
+                var extendStatics = function (d, b) {
+                    extendStatics = Object.setPrototypeOf ||
+                        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+                        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+                    return extendStatics(d, b);
+                };
+
+                return function (d, b) {
+                    if (typeof b !== "function" && b !== null)
+                        throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+                    extendStatics(d, b);
+                    function __() { this.constructor = d; }
+                    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+                };
+            })();`}, J4 = {
+                            name: "typescript:makeTemplateObject", importName: "__makeTemplateObject", scoped: !1, priority: 0, text: `
+            var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
+                if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
+                return cooked;
+            };`}, K4 = {
+                            name: "typescript:read", importName: "__read", scoped: !1, text: `
+            var __read = (this && this.__read) || function (o, n) {
+                var m = typeof Symbol === "function" && o[Symbol.iterator];
+                if (!m) return o;
+                var i = m.call(o), r, ar = [], e;
+                try {
+                    while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
+                }
+                catch (error) { e = { error: error }; }
+                finally {
+                    try {
+                        if (r && !r.done && (m = i["return"])) m.call(i);
+                    }
+                    finally { if (e) throw e.error; }
+                }
+                return ar;
+            };`}, q4 = {
+                            name: "typescript:spreadArray", importName: "__spreadArray", scoped: !1, text: `
+            var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
+                if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
+                    if (ar || !(i in from)) {
+                        if (!ar) ar = Array.prototype.slice.call(from, 0, i);
+                        ar[i] = from[i];
+                    }
+                }
+                return to.concat(ar || Array.prototype.slice.call(from));
+            };`}, X4 = {
+                            name: "typescript:propKey", importName: "__propKey", scoped: !1, text: `
+        var __propKey = (this && this.__propKey) || function (x) {
+            return typeof x === "symbol" ? x : "".concat(x);
+        };`}, Y4 = {
+                            name: "typescript:setFunctionName", importName: "__setFunctionName", scoped: !1, text: `
+        var __setFunctionName = (this && this.__setFunctionName) || function (f, name, prefix) {
+            if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
+            return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
+        };`}, $4 = {
+                            name: "typescript:values", importName: "__values", scoped: !1, text: `
+            var __values = (this && this.__values) || function(o) {
+                var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
+                if (m) return m.call(o);
+                if (o && typeof o.length === "number") return {
+                    next: function () {
+                        if (o && i >= o.length) o = void 0;
+                        return { value: o && o[i++], done: !o };
+                    }
+                };
+                throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
+            };`}, Q4 = {
+                            name: "typescript:generator", importName: "__generator", scoped: !1, priority: 6, text: `
+            var __generator = (this && this.__generator) || function (thisArg, body) {
+                var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+                return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+                function verb(n) { return function (v) { return step([n, v]); }; }
+                function step(op) {
+                    if (f) throw new TypeError("Generator is already executing.");
+                    while (g && (g = 0, op[0] && (_ = 0)), _) try {
+                        if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+                        if (y = 0, t) op = [op[0] & 2, t.value];
+                        switch (op[0]) {
+                            case 0: case 1: t = op; break;
+                            case 4: _.label++; return { value: op[1], done: false };
+                            case 5: _.label++; y = op[1]; op = [0]; continue;
+                            case 7: op = _.ops.pop(); _.trys.pop(); continue;
+                            default:
+                                if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+                                if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+                                if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+                                if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+                                if (t[2]) _.ops.pop();
+                                _.trys.pop(); continue;
+                        }
+                        op = body.call(thisArg, _);
+                    } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+                    if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+                }
+            };`}, d2 = {
+                            name: "typescript:commonjscreatebinding", importName: "__createBinding", scoped: !1, priority: 1, text: `
+            var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+                if (k2 === undefined) k2 = k;
+                var desc = Object.getOwnPropertyDescriptor(m, k);
+                if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+                  desc = { enumerable: true, get: function() { return m[k]; } };
+                }
+                Object.defineProperty(o, k2, desc);
+            }) : (function(o, m, k, k2) {
+                if (k2 === undefined) k2 = k;
+                o[k2] = m[k];
+            }));`}, Z4 = {
+                            name: "typescript:commonjscreatevalue", importName: "__setModuleDefault", scoped: !1, priority: 1, text: `
+            var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+                Object.defineProperty(o, "default", { enumerable: true, value: v });
+            }) : function(o, v) {
+                o["default"] = v;
+            });`}, aO = {
+                            name: "typescript:commonjsimportstar", importName: "__importStar", scoped: !1, dependencies: [d2, Z4], priority: 2, text: `
+            var __importStar = (this && this.__importStar) || function (mod) {
+                if (mod && mod.__esModule) return mod;
+                var result = {};
+                if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+                __setModuleDefault(result, mod);
+                return result;
+            };`}, e3 = {
+                            name: "typescript:commonjsimportdefault", importName: "__importDefault", scoped: !1, text: `
+            var __importDefault = (this && this.__importDefault) || function (mod) {
+                return (mod && mod.__esModule) ? mod : { "default": mod };
+            };`}, t3 = {
+                            name: "typescript:export-star", importName: "__exportStar", scoped: !1, dependencies: [d2], priority: 2, text: `
+            var __exportStar = (this && this.__exportStar) || function(m, exports) {
+                for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+            };`}, n3 = {
+                            name: "typescript:classPrivateFieldGet", importName: "__classPrivateFieldGet", scoped: !1, text: `
+            var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
+                if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
+                if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
+                return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
+            };`}, r3 = {
+                            name: "typescript:classPrivateFieldSet", importName: "__classPrivateFieldSet", scoped: !1, text: `
+            var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
+                if (kind === "m") throw new TypeError("Private method is not writable");
+                if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
+                if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
+                return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
+            };`}, i3 = {
+                            name: "typescript:classPrivateFieldIn", importName: "__classPrivateFieldIn", scoped: !1, text: `
+            var __classPrivateFieldIn = (this && this.__classPrivateFieldIn) || function(state, receiver) {
+                if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
+                return typeof state === "function" ? receiver === state : state.has(receiver);
+            };`}, oO = {
+                            name: "typescript:async-super", scoped: !0, text: Sz`
+            const ${"_superIndex"} = name => super[name];`
+                        }, sO = {
+                            name: "typescript:advanced-async-super", scoped: !0, text: Sz`
+            const ${"_superIndex"} = (function (geti, seti) {
+                const cache = Object.create(null);
+                return name => cache[name] || (cache[name] = { get value() { return geti(name); }, set value(v) { seti(name, v); } });
+            })(name => super[name], (name, value) => super[name] = value);`}
+                }
+            }); function Vf(e) { return e.kind === 8 } function a3(e) { return e.kind === 9 } function yo(e) { return e.kind === 10 } function CS(e) { return e.kind === 11 } function Cz(e) { return e.kind === 13 } function IS(e) { return e.kind === 14 } function f2(e) { return e.kind === 15 } function Aue(e) { return e.kind === 16 } function Iz(e) { return e.kind === 17 } function o3(e) { return e.kind === 25 } function Cue(e) { return e.kind === 27 } function Lz(e) { return e.kind === 39 } function kz(e) { return e.kind === 40 } function cO(e) { return e.kind === 41 } function lO(e) { return e.kind === 53 } function ev(e) { return e.kind === 57 } function Iue(e) { return e.kind === 58 } function s3(e) { return e.kind === 28 } function Lue(e) { return e.kind === 38 } function Re(e) { return e.kind === 79 } function pi(e) { return e.kind === 80 } function c3(e) { return e.kind === 93 } function kue(e) { return e.kind === 88 } function mL(e) { return e.kind === 132 } function Due(e) { return e.kind === 129 } function Dz(e) { return e.kind === 133 } function wue(e) { return e.kind === 146 } function LS(e) { return e.kind === 124 } function Rue(e) { return e.kind === 126 } function Oue(e) { return e.kind === 161 } function Nue(e) { return e.kind === 127 } function hL(e) { return e.kind === 106 } function gL(e) { return e.kind === 100 } function Pue(e) { return e.kind === 82 } function Yu(e) { return e.kind === 163 } function ts(e) { return e.kind === 164 } function _c(e) { return e.kind === 165 } function ha(e) { return e.kind === 166 } function du(e) { return e.kind === 167 } function $d(e) { return e.kind === 168 } function Na(e) { return e.kind === 169 } function zm(e) { return e.kind === 170 } function Nc(e) { return e.kind === 171 } function oc(e) { return e.kind === 172 } function Ec(e) { return e.kind === 173 } function p_(e) { return e.kind === 174 } function Sf(e) { return e.kind === 175 } function _2(e) { return e.kind === 176 } function uO(e) { return e.kind === 177 } function kS(e) { return e.kind === 178 } function l3(e) { return e.kind === 179 } function m_(e) { return e.kind === 180 } function Jm(e) { return e.kind === 181 } function yL(e) { return e.kind === 182 } function vL(e) { return e.kind === 183 } function Rd(e) { return e.kind === 184 } function wz(e) { return e.kind === 185 } function p2(e) { return e.kind === 186 } function bL(e) { return e.kind === 199 } function Rz(e) { return e.kind === 187 } function Oz(e) { return e.kind === 188 } function DS(e) { return e.kind === 189 } function dO(e) { return e.kind === 190 } function m2(e) { return e.kind === 191 } function h2(e) { return e.kind === 192 } function wS(e) { return e.kind === 193 } function u3(e) { return e.kind === 194 } function RS(e) { return e.kind === 195 } function OS(e) { return e.kind === 196 } function EL(e) { return e.kind === 197 } function mb(e) { return e.kind === 198 } function Mh(e) { return e.kind === 202 } function Mue(e) { return e.kind === 201 } function jRe(e) { return e.kind === 200 } function cm(e) { return e.kind === 203 } function g2(e) { return e.kind === 204 } function Wo(e) { return e.kind === 205 } function fu(e) { return e.kind === 206 } function rs(e) { return e.kind === 207 } function br(e) { return e.kind === 208 } function Vs(e) { return e.kind === 209 } function Pa(e) { return e.kind === 210 } function z0(e) { return e.kind === 211 } function PT(e) { return e.kind === 212 } function Fue(e) { return e.kind === 213 } function ud(e) { return e.kind === 214 } function ms(e) { return e.kind === 215 } function xs(e) { return e.kind === 216 } function Gue(e) { return e.kind === 217 } function y2(e) { return e.kind === 218 } function NS(e) { return e.kind === 219 } function v2(e) { return e.kind === 220 } function tv(e) { return e.kind === 221 } function Nz(e) { return e.kind === 222 } function ar(e) { return e.kind === 223 } function b2(e) { return e.kind === 224 } function d3(e) { return e.kind === 225 } function f3(e) { return e.kind === 226 } function Km(e) { return e.kind === 227 } function _u(e) { return e.kind === 228 } function ol(e) { return e.kind === 229 } function Vg(e) { return e.kind === 230 } function fO(e) { return e.kind === 231 } function HRe(e) { return e.kind === 235 } function PS(e) { return e.kind === 232 } function TL(e) { return e.kind === 233 } function WRe(e) { return e.kind === 234 } function _3(e) { return e.kind === 356 } function SL(e) { return e.kind === 357 } function xL(e) { return e.kind === 236 } function Bue(e) { return e.kind === 237 } function Va(e) { return e.kind === 238 } function Bc(e) { return e.kind === 240 } function Pz(e) { return e.kind === 239 } function Ol(e) { return e.kind === 241 } function MT(e) { return e.kind === 242 } function zRe(e) { return e.kind === 243 } function JRe(e) { return e.kind === 244 } function FT(e) { return e.kind === 245 } function Mz(e) { return e.kind === 246 } function _O(e) { return e.kind === 247 } function KRe(e) { return e.kind === 248 } function qRe(e) { return e.kind === 249 } function j_(e) { return e.kind === 250 } function Uue(e) { return e.kind === 251 } function pO(e) { return e.kind === 252 } function J0(e) { return e.kind === 253 } function Fz(e) { return e.kind === 254 } function mO(e) { return e.kind === 255 } function XRe(e) { return e.kind === 256 } function wi(e) { return e.kind === 257 } function pu(e) { return e.kind === 258 } function Jc(e) { return e.kind === 259 } function sl(e) { return e.kind === 260 } function ku(e) { return e.kind === 261 } function Ep(e) { return e.kind === 262 } function hb(e) { return e.kind === 263 } function Tc(e) { return e.kind === 264 } function Tp(e) { return e.kind === 265 } function hO(e) { return e.kind === 266 } function gO(e) { return e.kind === 267 } function Nl(e) { return e.kind === 268 } function gl(e) { return e.kind === 269 } function lm(e) { return e.kind === 270 } function Vue(e) { return e.kind === 298 } function p3(e) { return e.kind === 296 } function jue(e) { return e.kind === 297 } function nv(e) { return e.kind === 271 } function qm(e) { return e.kind === 277 } function jg(e) { return e.kind === 272 } function $u(e) { return e.kind === 273 } function pc(e) { return e.kind === 274 } function Il(e) { return e.kind === 275 } function h_(e) { return e.kind === 276 } function Mu(e) { return e.kind === 278 } function YRe(e) { return e.kind === 279 } function Gz(e) { return e.kind === 355 } function MS(e) { return e.kind === 360 } function $Re(e) { return e.kind === 358 } function QRe(e) { return e.kind === 359 } function um(e) { return e.kind === 280 } function Hg(e) { return e.kind === 281 } function FS(e) { return e.kind === 282 } function Xm(e) { return e.kind === 283 } function GS(e) { return e.kind === 284 } function BS(e) { return e.kind === 285 } function US(e) { return e.kind === 286 } function Hue(e) { return e.kind === 287 } function Sp(e) { return e.kind === 288 } function K0(e) { return e.kind === 289 } function GT(e) { return e.kind === 290 } function AL(e) { return e.kind === 291 } function CL(e) { return e.kind === 292 } function yO(e) { return e.kind === 293 } function dd(e) { return e.kind === 294 } function E2(e) { return e.kind === 295 } function yl(e) { return e.kind === 299 } function xf(e) { return e.kind === 300 } function VS(e) { return e.kind === 301 } function q0(e) { return e.kind === 302 } function Wue(e) { return e.kind === 304 } function Li(e) { return e.kind === 308 } function Bz(e) { return e.kind === 309 } function BT(e) { return e.kind === 310 } function UT(e) { return e.kind === 312 } function IL(e) { return e.kind === 313 } function gb(e) { return e.kind === 314 } function zue(e) { return e.kind === 327 } function Jue(e) { return e.kind === 328 } function ZRe(e) { return e.kind === 329 } function Kue(e) { return e.kind === 315 } function que(e) { return e.kind === 316 } function T2(e) { return e.kind === 317 } function m3(e) { return e.kind === 318 } function Uz(e) { return e.kind === 319 } function S2(e) { return e.kind === 320 } function h3(e) { return e.kind === 321 } function eOe(e) { return e.kind === 322 } function dm(e) { return e.kind === 323 } function LL(e) { return e.kind === 325 } function X0(e) { return e.kind === 326 } function x2(e) { return e.kind === 331 } function tOe(e) { return e.kind === 333 } function Xue(e) { return e.kind === 335 } function Vz(e) { return e.kind === 341 } function jz(e) { return e.kind === 336 } function Hz(e) { return e.kind === 337 } function Wz(e) { return e.kind === 338 } function zz(e) { return e.kind === 339 } function g3(e) { return e.kind === 340 } function kL(e) { return e.kind === 342 } function Jz(e) { return e.kind === 334 } function nOe(e) { return e.kind === 350 } function vO(e) { return e.kind === 343 } function xp(e) { return e.kind === 344 } function y3(e) { return e.kind === 345 } function Yue(e) { return e.kind === 346 } function DL(e) { return e.kind === 347 } function H_(e) { return e.kind === 348 } function Kz(e) { return e.kind === 349 } function rOe(e) { return e.kind === 330 } function $ue(e) { return e.kind === 351 } function qz(e) { return e.kind === 332 } function v3(e) { return e.kind === 353 } function iOe(e) { return e.kind === 352 } function A2(e) { return e.kind === 354 } var aOe = gt({ "src/compiler/factory/nodeTests.ts"() { "use strict"; fa() } }); function bO(e) { return e.createExportDeclaration(void 0, !1, e.createNamedExports([]), void 0) } function VT(e, t, r, i) { if (ts(r)) return it(e.createElementAccessExpression(t, r.expression), i); { let o = it(Ah(r) ? e.createPropertyAccessExpression(t, r) : e.createElementAccessExpression(t, r), r); return bp(o, 128), o } } function Xz(e, t) { let r = fm.createIdentifier(e || "React"); return go(r, ea(t)), r } function Yz(e, t, r) { if (Yu(t)) { let i = Yz(e, t.left, r), o = e.createIdentifier(vr(t.right)); return o.escapedText = t.right.escapedText, e.createPropertyAccessExpression(i, o) } else return Xz(vr(t), r) } function $z(e, t, r, i) { return t ? Yz(e, t, i) : e.createPropertyAccessExpression(Xz(r, i), "createElement") } function oOe(e, t, r, i) { return t ? Yz(e, t, i) : e.createPropertyAccessExpression(Xz(r, i), "Fragment") } function Que(e, t, r, i, o, s) { let l = [r]; if (i && l.push(i), o && o.length > 0) if (i || l.push(e.createNull()), o.length > 1) for (let f of o) mu(f), l.push(f); else l.push(o[0]); return it(e.createCallExpression(t, void 0, l), s) } function Zue(e, t, r, i, o, s, l) { let d = [oOe(e, r, i, s), e.createNull()]; if (o && o.length > 0) if (o.length > 1) for (let g of o) mu(g), d.push(g); else d.push(o[0]); return it(e.createCallExpression($z(e, t, i, s), void 0, d), l) } function Qz(e, t, r) { if (pu(t)) { let i = Vo(t.declarations), o = e.updateVariableDeclaration(i, i.name, void 0, void 0, r); return it(e.createVariableStatement(void 0, e.updateVariableDeclarationList(t, [o])), t) } else { let i = it(e.createAssignment(t, r), t); return it(e.createExpressionStatement(i), t) } } function sOe(e, t, r) { return Va(t) ? e.updateBlock(t, it(e.createNodeArray([r, ...t.statements]), t.statements)) : e.createBlock(e.createNodeArray([t, r]), !0) } function EO(e, t) { if (Yu(t)) { let r = EO(e, t.left), i = go(it(e.cloneNode(t.right), t.right), t.right.parent); return it(e.createPropertyAccessExpression(r, i), t) } else return go(it(e.cloneNode(t), t), t.parent) } function Zz(e, t) { return Re(t) ? e.createStringLiteralFromNode(t) : ts(t) ? go(it(e.cloneNode(t.expression), t.expression), t.expression.parent) : go(it(e.cloneNode(t), t), t.parent) } function cOe(e, t, r, i, o) { let { firstAccessor: s, getAccessor: l, setAccessor: f } = kT(t, r); if (r === s) return it(e.createObjectDefinePropertyCall(i, Zz(e, r.name), e.createPropertyDescriptor({ enumerable: e.createFalse(), configurable: !0, get: l && it(Ir(e.createFunctionExpression(uT(l), void 0, void 0, void 0, l.parameters, void 0, l.body), l), l), set: f && it(Ir(e.createFunctionExpression(uT(f), void 0, void 0, void 0, f.parameters, void 0, f.body), f), f) }, !o)), s) } function lOe(e, t, r) { return Ir(it(e.createAssignment(VT(e, r, t.name, t.name), t.initializer), t), t) } function uOe(e, t, r) { return Ir(it(e.createAssignment(VT(e, r, t.name, t.name), e.cloneNode(t.name)), t), t) } function dOe(e, t, r) { return Ir(it(e.createAssignment(VT(e, r, t.name, t.name), Ir(it(e.createFunctionExpression(uT(t), t.asteriskToken, void 0, void 0, t.parameters, void 0, t.body), t), t)), t), t) } function ede(e, t, r, i) { switch (r.name && pi(r.name) && L.failBadSyntaxKind(r.name, "Private identifiers are not allowed in object literals."), r.kind) { case 174: case 175: return cOe(e, t.properties, r, i, !!t.multiLine); case 299: return lOe(e, r, i); case 300: return uOe(e, r, i); case 171: return dOe(e, r, i) } } function b3(e, t, r, i, o) { let s = t.operator; L.assert(s === 45 || s === 46, "Expected 'node' to be a pre- or post-increment or pre- or post-decrement expression"); let l = e.createTempVariable(i); r = e.createAssignment(l, r), it(r, t.operand); let f = tv(t) ? e.createPrefixUnaryExpression(s, l) : e.createPostfixUnaryExpression(l, s); return it(f, t), o && (f = e.createAssignment(o, f), it(f, t)), r = e.createComma(r, f), it(r, t), Nz(t) && (r = e.createComma(r, l), it(r, t)), r } function eJ(e) { return (Ya(e) & 65536) !== 0 } function rv(e) { return (Ya(e) & 32768) !== 0 } function E3(e) { return (Ya(e) & 16384) !== 0 } function tde(e) { return yo(e.expression) && e.expression.text === "use strict" } function tJ(e) { for (let t of e) if (B_(t)) { if (tde(t)) return t } else break } function nde(e) { let t = Sl(e); return t !== void 0 && B_(t) && tde(t) } function TO(e) { return e.kind === 223 && e.operatorToken.kind === 27 } function wL(e) { return TO(e) || SL(e) } function RL(e) { return ud(e) && Yn(e) && !!x0(e) } function T3(e) { let t = Vy(e); return L.assertIsDefined(t), t } function S3(e, t = 15) { switch (e.kind) { case 214: return t & 16 && RL(e) ? !1 : (t & 1) !== 0; case 213: case 231: case 230: case 235: return (t & 2) !== 0; case 232: return (t & 4) !== 0; case 356: return (t & 8) !== 0 }return !1 } function ql(e, t = 15) { for (; S3(e, t);)e = e.expression; return e } function rde(e, t = 15) { let r = e.parent; for (; S3(r, t);)r = r.parent, L.assert(r); return r } function fOe(e) { return ql(e, 6) } function mu(e) { return vz(e, !0) } function SO(e) { let t = ec(e, Li), r = t && t.emitNode; return r && r.externalHelpersModuleName } function ide(e) { let t = ec(e, Li), r = t && t.emitNode; return !!r && (!!r.externalHelpersModuleName || !!r.externalHelpers) } function nJ(e, t, r, i, o, s, l) { if (i.importHelpers && aS(r, i)) { let f, d = Rl(i); if (d >= 5 && d <= 99 || r.impliedNodeFormat === 99) { let g = O4(r); if (g) { let m = []; for (let v of g) if (!v.scoped) { let S = v.importName; S && Of(m, S) } if (vt(m)) { m.sort(su), f = e.createNamedImports(on(m, x => g6(r, x) ? e.createImportSpecifier(!1, void 0, e.createIdentifier(x)) : e.createImportSpecifier(!1, e.createIdentifier(x), t.getUnscopedHelperName(x)))); let v = ec(r, Li), S = Lu(v); S.externalHelpers = !0 } } } else { let g = ade(e, r, i, o, s || l); g && (f = e.createNamespaceImport(g)) } if (f) { let g = e.createImportDeclaration(void 0, e.createImportClause(!1, void 0, f), e.createStringLiteral(_b), void 0); return SS(g, 2), g } } } function ade(e, t, r, i, o) { if (r.importHelpers && aS(t, r)) { let s = SO(t); if (s) return s; let l = Rl(r), f = (i || f_(r) && o) && l !== 4 && (l < 5 || t.impliedNodeFormat === 1); if (!f) { let d = O4(t); if (d) { for (let g of d) if (!g.scoped) { f = !0; break } } } if (f) { let d = ec(t, Li), g = Lu(d); return g.externalHelpersModuleName || (g.externalHelpersModuleName = e.createUniqueName(_b)) } } } function C2(e, t, r) { let i = VA(t); if (i && !lS(t) && !v6(t)) { let o = i.name; return tc(o) ? o : e.createIdentifier(k0(r, o) || vr(o)) } if (t.kind === 269 && t.importClause || t.kind === 275 && t.moduleSpecifier) return e.getGeneratedNameForNode(t) } function jS(e, t, r, i, o, s) { let l = UA(t); if (l && yo(l)) return pOe(t, i, e, o, s) || _Oe(e, l, r) || e.cloneNode(l) } function _Oe(e, t, r) { let i = r.renamedDependencies && r.renamedDependencies.get(t.text); return i ? e.createStringLiteral(i) : void 0 } function xO(e, t, r, i) { if (t) { if (t.moduleName) return e.createStringLiteral(t.moduleName); if (!t.isDeclarationFile && Ss(i)) return e.createStringLiteral(YH(r, t.fileName)) } } function pOe(e, t, r, i, o) { return xO(r, i.getExternalModuleFileFromDeclaration(e), t, o) } function AO(e) { if (Lw(e)) return e.initializer; if (yl(e)) { let t = e.initializer; return Iu(t, !0) ? t.right : void 0 } if (xf(e)) return e.objectAssignmentInitializer; if (Iu(e, !0)) return e.right; if (Km(e)) return AO(e.expression) } function iv(e) { if (Lw(e)) return e.name; if (Og(e)) { switch (e.kind) { case 299: return iv(e.initializer); case 300: return e.name; case 301: return iv(e.expression) }return } return Iu(e, !0) ? iv(e.left) : Km(e) ? iv(e.expression) : e } function x3(e) { switch (e.kind) { case 166: case 205: return e.dotDotDotToken; case 227: case 301: return e } } function rJ(e) { let t = A3(e); return L.assert(!!t || VS(e), "Invalid property name for binding element."), t } function A3(e) { switch (e.kind) { case 205: if (e.propertyName) { let r = e.propertyName; return pi(r) ? L.failBadSyntaxKind(r) : ts(r) && ode(r.expression) ? r.expression : r } break; case 299: if (e.name) { let r = e.name; return pi(r) ? L.failBadSyntaxKind(r) : ts(r) && ode(r.expression) ? r.expression : r } break; case 301: return e.name && pi(e.name) ? L.failBadSyntaxKind(e.name) : e.name }let t = iv(e); if (t && Ys(t)) return t } function ode(e) { let t = e.kind; return t === 10 || t === 8 } function I2(e) { switch (e.kind) { case 203: case 204: case 206: return e.elements; case 207: return e.properties } } function iJ(e) { if (e) { let t = e; for (; ;) { if (Re(t) || !t.body) return Re(t) ? t : t.name; t = t.body } } } function mOe(e) { let t = e.kind; return t === 173 || t === 175 } function sde(e) { let t = e.kind; return t === 173 || t === 174 || t === 175 } function aJ(e) { let t = e.kind; return t === 299 || t === 300 || t === 259 || t === 173 || t === 178 || t === 172 || t === 279 || t === 240 || t === 261 || t === 262 || t === 263 || t === 264 || t === 268 || t === 269 || t === 267 || t === 275 || t === 274 } function cde(e) { let t = e.kind; return t === 172 || t === 299 || t === 300 || t === 279 || t === 267 } function lde(e) { return ev(e) || lO(e) } function ude(e) { return Re(e) || u3(e) } function dde(e) { return wue(e) || Lz(e) || kz(e) } function fde(e) { return ev(e) || Lz(e) || kz(e) } function _de(e) { return Re(e) || yo(e) } function hOe(e) { let t = e.kind; return t === 104 || t === 110 || t === 95 || fT(e) || tv(e) } function gOe(e) { return e === 42 } function yOe(e) { return e === 41 || e === 43 || e === 44 } function vOe(e) { return gOe(e) || yOe(e) } function bOe(e) { return e === 39 || e === 40 } function EOe(e) { return bOe(e) || vOe(e) } function TOe(e) { return e === 47 || e === 48 || e === 49 } function SOe(e) { return TOe(e) || EOe(e) } function xOe(e) { return e === 29 || e === 32 || e === 31 || e === 33 || e === 102 || e === 101 } function AOe(e) { return xOe(e) || SOe(e) } function COe(e) { return e === 34 || e === 36 || e === 35 || e === 37 } function IOe(e) { return COe(e) || AOe(e) } function LOe(e) { return e === 50 || e === 51 || e === 52 } function kOe(e) { return LOe(e) || IOe(e) } function DOe(e) { return e === 55 || e === 56 } function wOe(e) { return DOe(e) || kOe(e) } function ROe(e) { return e === 60 || wOe(e) || Mg(e) } function OOe(e) { return ROe(e) || e === 27 } function pde(e) { return OOe(e.kind) } function C3(e, t, r, i, o, s) { let l = new bde(e, t, r, i, o, s); return f; function f(d, g) { let m = { value: void 0 }, v = [k3.enter], S = [d], x = [void 0], A = 0; for (; v[A] !== k3.done;)A = v[A](l, A, v, S, x, m, g); return L.assertEqual(A, 0), m.value } } function mde(e) { return e === 93 || e === 88 } function oJ(e) { let t = e.kind; return mde(t) } function NOe(e) { let t = e.kind; return Rg(t) && !mde(t) } function hde(e, t) { if (t !== void 0) return t.length === 0 ? t : it(e.createNodeArray([], t.hasTrailingComma), t) } function I3(e) { var t; let r = e.emitNode.autoGenerate; if (r.flags & 4) { let i = r.id, o = e, s = o.original; for (; s;) { o = s; let l = (t = o.emitNode) == null ? void 0 : t.autoGenerate; if (Ah(o) && (l === void 0 || l.flags & 4 && l.id !== i)) break; s = o.original } return o } return e } function L2(e, t) { return typeof e == "object" ? jT(!1, e.prefix, e.node, e.suffix, t) : typeof e == "string" ? e.length > 0 && e.charCodeAt(0) === 35 ? e.slice(1) : e : "" } function POe(e, t) { return typeof e == "string" ? e : MOe(e, L.checkDefined(t)) } function MOe(e, t) { return tS(e) ? t(e).slice(1) : tc(e) ? t(e) : pi(e) ? e.escapedText.slice(1) : vr(e) } function jT(e, t, r, i, o) { return t = L2(t, o), i = L2(i, o), r = POe(r, o), `${e ? "#" : ""}${t}${r}${i}` } function sJ(e, t, r, i) { return e.updatePropertyDeclaration(t, r, e.getGeneratedPrivateNameForNode(t.name, void 0, "_accessor_storage"), void 0, void 0, i) } function gde(e, t, r, i) { return e.createGetAccessorDeclaration(r, i, [], void 0, e.createBlock([e.createReturnStatement(e.createPropertyAccessExpression(e.createThis(), e.getGeneratedPrivateNameForNode(t.name, void 0, "_accessor_storage")))])) } function yde(e, t, r, i) { return e.createSetAccessorDeclaration(r, i, [e.createParameterDeclaration(void 0, void 0, "value")], e.createBlock([e.createExpressionStatement(e.createAssignment(e.createPropertyAccessExpression(e.createThis(), e.getGeneratedPrivateNameForNode(t.name, void 0, "_accessor_storage")), e.createIdentifier("value")))])) } function L3(e) { let t = e.expression; for (; ;) { if (t = ql(t), SL(t)) { t = To(t.elements); continue } if (TO(t)) { t = t.right; continue } if (Iu(t, !0) && tc(t.left)) return t; break } } function FOe(e) { return ud(e) && ws(e) && !e.emitNode } function CO(e, t) { if (FOe(e)) CO(e.expression, t); else if (TO(e)) CO(e.left, t), CO(e.right, t); else if (SL(e)) for (let r of e.elements) CO(r, t); else t.push(e) } function vde(e) { let t = []; return CO(e, t), t } function IO(e) { if (e.transformFlags & 65536) return !0; if (e.transformFlags & 128) for (let t of I2(e)) { let r = iv(t); if (r && vI(r) && (r.transformFlags & 65536 || r.transformFlags & 128 && IO(r))) return !0 } return !1 } var k3, bde, GOe = gt({ "src/compiler/factory/utilities.ts"() { "use strict"; fa(), (e => { function t(m, v, S, x, A, w, C) { let P = v > 0 ? A[v - 1] : void 0; return L.assertEqual(S[v], t), A[v] = m.onEnter(x[v], P, C), S[v] = f(m, t), v } e.enter = t; function r(m, v, S, x, A, w, C) { L.assertEqual(S[v], r), L.assertIsDefined(m.onLeft), S[v] = f(m, r); let P = m.onLeft(x[v].left, A[v], x[v]); return P ? (g(v, x, P), d(v, S, x, A, P)) : v } e.left = r; function i(m, v, S, x, A, w, C) { return L.assertEqual(S[v], i), L.assertIsDefined(m.onOperator), S[v] = f(m, i), m.onOperator(x[v].operatorToken, A[v], x[v]), v } e.operator = i; function o(m, v, S, x, A, w, C) { L.assertEqual(S[v], o), L.assertIsDefined(m.onRight), S[v] = f(m, o); let P = m.onRight(x[v].right, A[v], x[v]); return P ? (g(v, x, P), d(v, S, x, A, P)) : v } e.right = o; function s(m, v, S, x, A, w, C) { L.assertEqual(S[v], s), S[v] = f(m, s); let P = m.onExit(x[v], A[v]); if (v > 0) { if (v--, m.foldState) { let F = S[v] === s ? "right" : "left"; A[v] = m.foldState(A[v], P, F) } } else w.value = P; return v } e.exit = s; function l(m, v, S, x, A, w, C) { return L.assertEqual(S[v], l), v } e.done = l; function f(m, v) { switch (v) { case t: if (m.onLeft) return r; case r: if (m.onOperator) return i; case i: if (m.onRight) return o; case o: return s; case s: return l; case l: return l; default: L.fail("Invalid state") } } e.nextState = f; function d(m, v, S, x, A) { return m++, v[m] = t, S[m] = A, x[m] = void 0, m } function g(m, v, S) { if (L.shouldAssert(2)) for (; m >= 0;)L.assert(v[m] !== S, "Circular traversal detected."), m-- } })(k3 || (k3 = {})), bde = class { constructor(e, t, r, i, o, s) { this.onEnter = e, this.onLeft = t, this.onOperator = r, this.onRight = i, this.onExit = o, this.foldState = s } } } }); function it(e, t) { return t ? om(e, t.pos, t.end) : e } function g_(e) { let t = e.kind; return t === 165 || t === 166 || t === 168 || t === 169 || t === 170 || t === 171 || t === 173 || t === 174 || t === 175 || t === 178 || t === 182 || t === 215 || t === 216 || t === 228 || t === 240 || t === 259 || t === 260 || t === 261 || t === 262 || t === 263 || t === 264 || t === 268 || t === 269 || t === 274 || t === 275 } function HS(e) { let t = e.kind; return t === 166 || t === 169 || t === 171 || t === 174 || t === 175 || t === 228 || t === 260 } var BOe = gt({ "src/compiler/factory/utilitiesPublic.ts"() { "use strict"; fa() } }); function Mt(e, t) { return t && e(t) } function fi(e, t, r) { if (r) { if (t) return t(r); for (let i of r) { let o = e(i); if (o) return o } } } function cJ(e, t) { return e.charCodeAt(t + 1) === 42 && e.charCodeAt(t + 2) === 42 && e.charCodeAt(t + 3) !== 47 } function LO(e) { return mn(e.statements, UOe) || VOe(e) } function UOe(e) { return g_(e) && jOe(e, 93) || Nl(e) && um(e.moduleReference) || gl(e) || pc(e) || Il(e) ? e : void 0 } function VOe(e) { return e.flags & 4194304 ? Ede(e) : void 0 } function Ede(e) { return HOe(e) ? e : pa(e, Ede) } function jOe(e, t) { return vt(e.modifiers, r => r.kind === t) } function HOe(e) { return TL(e) && e.keywordToken === 100 && e.name.escapedText === "meta" } function Tde(e, t, r) { return fi(t, r, e.typeParameters) || fi(t, r, e.parameters) || Mt(t, e.type) } function Sde(e, t, r) { return fi(t, r, e.types) } function xde(e, t, r) { return Mt(t, e.type) } function Ade(e, t, r) { return fi(t, r, e.elements) } function Cde(e, t, r) { return Mt(t, e.expression) || Mt(t, e.questionDotToken) || fi(t, r, e.typeArguments) || fi(t, r, e.arguments) } function Ide(e, t, r) { return fi(t, r, e.statements) } function Lde(e, t, r) { return Mt(t, e.label) } function kde(e, t, r) { return fi(t, r, e.modifiers) || Mt(t, e.name) || fi(t, r, e.typeParameters) || fi(t, r, e.heritageClauses) || fi(t, r, e.members) } function Dde(e, t, r) { return fi(t, r, e.elements) } function wde(e, t, r) { return Mt(t, e.propertyName) || Mt(t, e.name) } function Rde(e, t, r) { return Mt(t, e.tagName) || fi(t, r, e.typeArguments) || Mt(t, e.attributes) } function k2(e, t, r) { return Mt(t, e.type) } function Ode(e, t, r) { return Mt(t, e.tagName) || (e.isNameFirst ? Mt(t, e.name) || Mt(t, e.typeExpression) : Mt(t, e.typeExpression) || Mt(t, e.name)) || (typeof e.comment == "string" ? void 0 : fi(t, r, e.comment)) } function D2(e, t, r) { return Mt(t, e.tagName) || Mt(t, e.typeExpression) || (typeof e.comment == "string" ? void 0 : fi(t, r, e.comment)) } function lJ(e, t, r) { return Mt(t, e.name) } function WS(e, t, r) { return Mt(t, e.tagName) || (typeof e.comment == "string" ? void 0 : fi(t, r, e.comment)) } function WOe(e, t, r) { return Mt(t, e.expression) } function pa(e, t, r) { if (e === void 0 || e.kind <= 162) return; let i = Hde[e.kind]; return i === void 0 ? void 0 : i(e, t, r) } function kO(e, t, r) { let i = Nde(e), o = []; for (; o.length < i.length;)o.push(e); for (; i.length !== 0;) { let s = i.pop(), l = o.pop(); if (ba(s)) { if (r) { let f = r(s, l); if (f) { if (f === "skip") continue; return f } } for (let f = s.length - 1; f >= 0; --f)i.push(s[f]), o.push(l) } else { let f = t(s, l); if (f) { if (f === "skip") continue; return f } if (s.kind >= 163) for (let d of Nde(s)) i.push(d), o.push(s) } } } function Nde(e) { let t = []; return pa(e, r, r), t; function r(i) { t.unshift(i) } } function Pde(e) { e.externalModuleIndicator = LO(e) } function DO(e, t, r, i = !1, o) { var s, l; (s = ai) == null || s.push(ai.Phase.Parse, "createSourceFile", { path: e }, !0), Fs("beforeParse"); let f; fp.logStartParseSourceFile(e); let { languageVersion: d, setExternalModuleIndicator: g, impliedNodeFormat: m } = typeof r == "object" ? r : { languageVersion: r }; if (d === 100) f = av.parseSourceFile(e, t, d, void 0, i, 6, Ba); else { let v = m === void 0 ? g : S => (S.impliedNodeFormat = m, (g || Pde)(S)); f = av.parseSourceFile(e, t, d, void 0, i, o, v) } return fp.logStopParseSourceFile(), Fs("afterParse"), hf("Parse", "beforeParse", "afterParse"), (l = ai) == null || l.pop(), f } function zS(e, t) { return av.parseIsolatedEntityName(e, t) } function wO(e, t) { return av.parseJsonText(e, t) } function Lc(e) { return e.externalModuleIndicator !== void 0 } function uJ(e, t, r, i = !1) { let o = D3.updateSourceFile(e, t, r, i); return o.flags |= e.flags & 6291456, o } function Mde(e, t, r) { let i = av.JSDocParser.parseIsolatedJSDocComment(e, t, r); return i && i.jsDoc && av.fixupParentReferences(i.jsDoc), i } function zOe(e, t, r) { return av.JSDocParser.parseJSDocTypeExpressionForTests(e, t, r) } function Fu(e) { return $c(e, I4) || Gc(e, ".ts") && jl(Hl(e), ".d.") } function JOe(e, t, r, i) { if (e) { if (e === "import") return 99; if (e === "require") return 1; i(t, r - t, _.resolution_mode_should_be_either_require_or_import) } } function dJ(e, t) { let r = []; for (let i of Nm(t, 0) || Je) { let o = t.substring(i.pos, i.end); qOe(r, i, o) } e.pragmas = new Map; for (let i of r) { if (e.pragmas.has(i.name)) { let o = e.pragmas.get(i.name); o instanceof Array ? o.push(i.args) : e.pragmas.set(i.name, [o, i.args]); continue } e.pragmas.set(i.name, i.args) } } function fJ(e, t) { e.checkJsDirective = void 0, e.referencedFiles = [], e.typeReferenceDirectives = [], e.libReferenceDirectives = [], e.amdDependencies = [], e.hasNoDefaultLib = !1, e.pragmas.forEach((r, i) => { switch (i) { case "reference": { let o = e.referencedFiles, s = e.typeReferenceDirectives, l = e.libReferenceDirectives; mn(qD(r), f => { let { types: d, lib: g, path: m, ["resolution-mode"]: v } = f.arguments; if (f.arguments["no-default-lib"]) e.hasNoDefaultLib = !0; else if (d) { let S = JOe(v, d.pos, d.end, t); s.push({ pos: d.pos, end: d.end, fileName: d.value, ...S ? { resolutionMode: S } : {} }) } else g ? l.push({ pos: g.pos, end: g.end, fileName: g.value }) : m ? o.push({ pos: m.pos, end: m.end, fileName: m.value }) : t(f.range.pos, f.range.end - f.range.pos, _.Invalid_reference_directive_syntax) }); break } case "amd-dependency": { e.amdDependencies = on(qD(r), o => ({ name: o.arguments.name, path: o.arguments.path })); break } case "amd-module": { if (r instanceof Array) for (let o of r) e.moduleName && t(o.range.pos, o.range.end - o.range.pos, _.An_AMD_module_cannot_have_multiple_name_assignments), e.moduleName = o.arguments.name; else e.moduleName = r.arguments.name; break } case "ts-nocheck": case "ts-check": { mn(qD(r), o => { (!e.checkJsDirective || o.range.pos > e.checkJsDirective.pos) && (e.checkJsDirective = { enabled: i === "ts-check", end: o.range.end, pos: o.range.pos }) }); break } case "jsx": case "jsxfrag": case "jsximportsource": case "jsxruntime": return; default: L.fail("Unhandled pragma kind") } }) } function KOe(e) { if (w3.has(e)) return w3.get(e); let t = new RegExp(`(\\s${e}\\s*=\\s*)(?:(?:'([^']*)')|(?:"([^"]*)"))`, "im"); return w3.set(e, t), t } function qOe(e, t, r) { let i = t.kind === 2 && Wde.exec(r); if (i) { let s = i[1].toLowerCase(), l = iw[s]; if (!l || !(l.kind & 1)) return; if (l.args) { let f = {}; for (let d of l.args) { let m = KOe(d.name).exec(r); if (!m && !d.optional) return; if (m) { let v = m[2] || m[3]; if (d.captureSpan) { let S = t.pos + m.index + m[1].length + 1; f[d.name] = { value: v, pos: S, end: S + v.length } } else f[d.name] = v } } e.push({ name: s, args: { arguments: f, range: t } }) } else e.push({ name: s, args: { arguments: {}, range: t } }); return } let o = t.kind === 2 && zde.exec(r); if (o) return Fde(e, t, 2, o); if (t.kind === 3) { let s = /@(\S+)(\s+.*)?$/gim, l; for (; l = s.exec(r);)Fde(e, t, 4, l) } } function Fde(e, t, r, i) { if (!i) return; let o = i[1].toLowerCase(), s = iw[o]; if (!s || !(s.kind & r)) return; let l = i[2], f = XOe(s, l); f !== "fail" && e.push({ name: o, args: { arguments: f, range: t } }) } function XOe(e, t) { if (!t) return {}; if (!e.args) return {}; let r = v0(t).split(/\s+/), i = {}; for (let o = 0; o < e.args.length; o++) { let s = e.args[o]; if (!r[o] && !s.optional) return "fail"; if (s.captureSpan) return L.fail("Capture spans not yet implemented for non-xml pragmas"); i[s.name] = r[o] } return i } function yb(e, t) { return e.kind !== t.kind ? !1 : e.kind === 79 ? e.escapedText === t.escapedText : e.kind === 108 ? !0 : e.name.escapedText === t.name.escapedText && yb(e.expression, t.expression) } var Gde, Bde, Ude, Vde, jde, _J, fm, Hde, av, D3, w3, Wde, zde, YOe = gt({
+                "src/compiler/parser.ts"() {
+                    "use strict"; fa(), fa(), E0(), _J = { createBaseSourceFileNode: e => new (jde || (jde = ml.getSourceFileConstructor()))(e, -1, -1), createBaseIdentifierNode: e => new (Ude || (Ude = ml.getIdentifierConstructor()))(e, -1, -1), createBasePrivateIdentifierNode: e => new (Vde || (Vde = ml.getPrivateIdentifierConstructor()))(e, -1, -1), createBaseTokenNode: e => new (Bde || (Bde = ml.getTokenConstructor()))(e, -1, -1), createBaseNode: e => new (Gde || (Gde = ml.getNodeConstructor()))(e, -1, -1) }, fm = YR(1, _J), Hde = { 163: function (t, r, i) { return Mt(r, t.left) || Mt(r, t.right) }, 165: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) || Mt(r, t.constraint) || Mt(r, t.default) || Mt(r, t.expression) }, 300: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) || Mt(r, t.questionToken) || Mt(r, t.exclamationToken) || Mt(r, t.equalsToken) || Mt(r, t.objectAssignmentInitializer) }, 301: function (t, r, i) { return Mt(r, t.expression) }, 166: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.dotDotDotToken) || Mt(r, t.name) || Mt(r, t.questionToken) || Mt(r, t.type) || Mt(r, t.initializer) }, 169: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) || Mt(r, t.questionToken) || Mt(r, t.exclamationToken) || Mt(r, t.type) || Mt(r, t.initializer) }, 168: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) || Mt(r, t.questionToken) || Mt(r, t.type) || Mt(r, t.initializer) }, 299: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) || Mt(r, t.questionToken) || Mt(r, t.exclamationToken) || Mt(r, t.initializer) }, 257: function (t, r, i) { return Mt(r, t.name) || Mt(r, t.exclamationToken) || Mt(r, t.type) || Mt(r, t.initializer) }, 205: function (t, r, i) { return Mt(r, t.dotDotDotToken) || Mt(r, t.propertyName) || Mt(r, t.name) || Mt(r, t.initializer) }, 178: function (t, r, i) { return fi(r, i, t.modifiers) || fi(r, i, t.typeParameters) || fi(r, i, t.parameters) || Mt(r, t.type) }, 182: function (t, r, i) { return fi(r, i, t.modifiers) || fi(r, i, t.typeParameters) || fi(r, i, t.parameters) || Mt(r, t.type) }, 181: function (t, r, i) { return fi(r, i, t.modifiers) || fi(r, i, t.typeParameters) || fi(r, i, t.parameters) || Mt(r, t.type) }, 176: Tde, 177: Tde, 171: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.asteriskToken) || Mt(r, t.name) || Mt(r, t.questionToken) || Mt(r, t.exclamationToken) || fi(r, i, t.typeParameters) || fi(r, i, t.parameters) || Mt(r, t.type) || Mt(r, t.body) }, 170: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) || Mt(r, t.questionToken) || fi(r, i, t.typeParameters) || fi(r, i, t.parameters) || Mt(r, t.type) }, 173: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) || fi(r, i, t.typeParameters) || fi(r, i, t.parameters) || Mt(r, t.type) || Mt(r, t.body) }, 174: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) || fi(r, i, t.typeParameters) || fi(r, i, t.parameters) || Mt(r, t.type) || Mt(r, t.body) }, 175: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) || fi(r, i, t.typeParameters) || fi(r, i, t.parameters) || Mt(r, t.type) || Mt(r, t.body) }, 259: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.asteriskToken) || Mt(r, t.name) || fi(r, i, t.typeParameters) || fi(r, i, t.parameters) || Mt(r, t.type) || Mt(r, t.body) }, 215: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.asteriskToken) || Mt(r, t.name) || fi(r, i, t.typeParameters) || fi(r, i, t.parameters) || Mt(r, t.type) || Mt(r, t.body) }, 216: function (t, r, i) { return fi(r, i, t.modifiers) || fi(r, i, t.typeParameters) || fi(r, i, t.parameters) || Mt(r, t.type) || Mt(r, t.equalsGreaterThanToken) || Mt(r, t.body) }, 172: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.body) }, 180: function (t, r, i) { return Mt(r, t.typeName) || fi(r, i, t.typeArguments) }, 179: function (t, r, i) { return Mt(r, t.assertsModifier) || Mt(r, t.parameterName) || Mt(r, t.type) }, 183: function (t, r, i) { return Mt(r, t.exprName) || fi(r, i, t.typeArguments) }, 184: function (t, r, i) { return fi(r, i, t.members) }, 185: function (t, r, i) { return Mt(r, t.elementType) }, 186: function (t, r, i) { return fi(r, i, t.elements) }, 189: Sde, 190: Sde, 191: function (t, r, i) { return Mt(r, t.checkType) || Mt(r, t.extendsType) || Mt(r, t.trueType) || Mt(r, t.falseType) }, 192: function (t, r, i) { return Mt(r, t.typeParameter) }, 202: function (t, r, i) { return Mt(r, t.argument) || Mt(r, t.assertions) || Mt(r, t.qualifier) || fi(r, i, t.typeArguments) }, 298: function (t, r, i) { return Mt(r, t.assertClause) }, 193: xde, 195: xde, 196: function (t, r, i) { return Mt(r, t.objectType) || Mt(r, t.indexType) }, 197: function (t, r, i) { return Mt(r, t.readonlyToken) || Mt(r, t.typeParameter) || Mt(r, t.nameType) || Mt(r, t.questionToken) || Mt(r, t.type) || fi(r, i, t.members) }, 198: function (t, r, i) { return Mt(r, t.literal) }, 199: function (t, r, i) { return Mt(r, t.dotDotDotToken) || Mt(r, t.name) || Mt(r, t.questionToken) || Mt(r, t.type) }, 203: Ade, 204: Ade, 206: function (t, r, i) { return fi(r, i, t.elements) }, 207: function (t, r, i) { return fi(r, i, t.properties) }, 208: function (t, r, i) { return Mt(r, t.expression) || Mt(r, t.questionDotToken) || Mt(r, t.name) }, 209: function (t, r, i) { return Mt(r, t.expression) || Mt(r, t.questionDotToken) || Mt(r, t.argumentExpression) }, 210: Cde, 211: Cde, 212: function (t, r, i) { return Mt(r, t.tag) || Mt(r, t.questionDotToken) || fi(r, i, t.typeArguments) || Mt(r, t.template) }, 213: function (t, r, i) { return Mt(r, t.type) || Mt(r, t.expression) }, 214: function (t, r, i) { return Mt(r, t.expression) }, 217: function (t, r, i) { return Mt(r, t.expression) }, 218: function (t, r, i) { return Mt(r, t.expression) }, 219: function (t, r, i) { return Mt(r, t.expression) }, 221: function (t, r, i) { return Mt(r, t.operand) }, 226: function (t, r, i) { return Mt(r, t.asteriskToken) || Mt(r, t.expression) }, 220: function (t, r, i) { return Mt(r, t.expression) }, 222: function (t, r, i) { return Mt(r, t.operand) }, 223: function (t, r, i) { return Mt(r, t.left) || Mt(r, t.operatorToken) || Mt(r, t.right) }, 231: function (t, r, i) { return Mt(r, t.expression) || Mt(r, t.type) }, 232: function (t, r, i) { return Mt(r, t.expression) }, 235: function (t, r, i) { return Mt(r, t.expression) || Mt(r, t.type) }, 233: function (t, r, i) { return Mt(r, t.name) }, 224: function (t, r, i) { return Mt(r, t.condition) || Mt(r, t.questionToken) || Mt(r, t.whenTrue) || Mt(r, t.colonToken) || Mt(r, t.whenFalse) }, 227: function (t, r, i) { return Mt(r, t.expression) }, 238: Ide, 265: Ide, 308: function (t, r, i) { return fi(r, i, t.statements) || Mt(r, t.endOfFileToken) }, 240: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.declarationList) }, 258: function (t, r, i) { return fi(r, i, t.declarations) }, 241: function (t, r, i) { return Mt(r, t.expression) }, 242: function (t, r, i) { return Mt(r, t.expression) || Mt(r, t.thenStatement) || Mt(r, t.elseStatement) }, 243: function (t, r, i) { return Mt(r, t.statement) || Mt(r, t.expression) }, 244: function (t, r, i) { return Mt(r, t.expression) || Mt(r, t.statement) }, 245: function (t, r, i) { return Mt(r, t.initializer) || Mt(r, t.condition) || Mt(r, t.incrementor) || Mt(r, t.statement) }, 246: function (t, r, i) { return Mt(r, t.initializer) || Mt(r, t.expression) || Mt(r, t.statement) }, 247: function (t, r, i) { return Mt(r, t.awaitModifier) || Mt(r, t.initializer) || Mt(r, t.expression) || Mt(r, t.statement) }, 248: Lde, 249: Lde, 250: function (t, r, i) { return Mt(r, t.expression) }, 251: function (t, r, i) { return Mt(r, t.expression) || Mt(r, t.statement) }, 252: function (t, r, i) { return Mt(r, t.expression) || Mt(r, t.caseBlock) }, 266: function (t, r, i) { return fi(r, i, t.clauses) }, 292: function (t, r, i) { return Mt(r, t.expression) || fi(r, i, t.statements) }, 293: function (t, r, i) { return fi(r, i, t.statements) }, 253: function (t, r, i) { return Mt(r, t.label) || Mt(r, t.statement) }, 254: function (t, r, i) { return Mt(r, t.expression) }, 255: function (t, r, i) { return Mt(r, t.tryBlock) || Mt(r, t.catchClause) || Mt(r, t.finallyBlock) }, 295: function (t, r, i) { return Mt(r, t.variableDeclaration) || Mt(r, t.block) }, 167: function (t, r, i) { return Mt(r, t.expression) }, 260: kde, 228: kde, 261: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) || fi(r, i, t.typeParameters) || fi(r, i, t.heritageClauses) || fi(r, i, t.members) }, 262: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) || fi(r, i, t.typeParameters) || Mt(r, t.type) }, 263: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) || fi(r, i, t.members) }, 302: function (t, r, i) { return Mt(r, t.name) || Mt(r, t.initializer) }, 264: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) || Mt(r, t.body) }, 268: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) || Mt(r, t.moduleReference) }, 269: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.importClause) || Mt(r, t.moduleSpecifier) || Mt(r, t.assertClause) }, 270: function (t, r, i) { return Mt(r, t.name) || Mt(r, t.namedBindings) }, 296: function (t, r, i) { return fi(r, i, t.elements) }, 297: function (t, r, i) { return Mt(r, t.name) || Mt(r, t.value) }, 267: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.name) }, 271: function (t, r, i) { return Mt(r, t.name) }, 277: function (t, r, i) { return Mt(r, t.name) }, 272: Dde, 276: Dde, 275: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.exportClause) || Mt(r, t.moduleSpecifier) || Mt(r, t.assertClause) }, 273: wde, 278: wde, 274: function (t, r, i) { return fi(r, i, t.modifiers) || Mt(r, t.expression) }, 225: function (t, r, i) { return Mt(r, t.head) || fi(r, i, t.templateSpans) }, 236: function (t, r, i) { return Mt(r, t.expression) || Mt(r, t.literal) }, 200: function (t, r, i) { return Mt(r, t.head) || fi(r, i, t.templateSpans) }, 201: function (t, r, i) { return Mt(r, t.type) || Mt(r, t.literal) }, 164: function (t, r, i) { return Mt(r, t.expression) }, 294: function (t, r, i) { return fi(r, i, t.types) }, 230: function (t, r, i) { return Mt(r, t.expression) || fi(r, i, t.typeArguments) }, 280: function (t, r, i) { return Mt(r, t.expression) }, 279: function (t, r, i) { return fi(r, i, t.modifiers) }, 357: function (t, r, i) { return fi(r, i, t.elements) }, 281: function (t, r, i) { return Mt(r, t.openingElement) || fi(r, i, t.children) || Mt(r, t.closingElement) }, 285: function (t, r, i) { return Mt(r, t.openingFragment) || fi(r, i, t.children) || Mt(r, t.closingFragment) }, 282: Rde, 283: Rde, 289: function (t, r, i) { return fi(r, i, t.properties) }, 288: function (t, r, i) { return Mt(r, t.name) || Mt(r, t.initializer) }, 290: function (t, r, i) { return Mt(r, t.expression) }, 291: function (t, r, i) { return Mt(r, t.dotDotDotToken) || Mt(r, t.expression) }, 284: function (t, r, i) { return Mt(r, t.tagName) }, 187: k2, 188: k2, 312: k2, 318: k2, 317: k2, 319: k2, 321: k2, 320: function (t, r, i) { return fi(r, i, t.parameters) || Mt(r, t.type) }, 323: function (t, r, i) { return (typeof t.comment == "string" ? void 0 : fi(r, i, t.comment)) || fi(r, i, t.tags) }, 350: function (t, r, i) { return Mt(r, t.tagName) || Mt(r, t.name) || (typeof t.comment == "string" ? void 0 : fi(r, i, t.comment)) }, 313: function (t, r, i) { return Mt(r, t.name) }, 314: function (t, r, i) { return Mt(r, t.left) || Mt(r, t.right) }, 344: Ode, 351: Ode, 333: function (t, r, i) { return Mt(r, t.tagName) || (typeof t.comment == "string" ? void 0 : fi(r, i, t.comment)) }, 332: function (t, r, i) { return Mt(r, t.tagName) || Mt(r, t.class) || (typeof t.comment == "string" ? void 0 : fi(r, i, t.comment)) }, 331: function (t, r, i) { return Mt(r, t.tagName) || Mt(r, t.class) || (typeof t.comment == "string" ? void 0 : fi(r, i, t.comment)) }, 348: function (t, r, i) { return Mt(r, t.tagName) || Mt(r, t.constraint) || fi(r, i, t.typeParameters) || (typeof t.comment == "string" ? void 0 : fi(r, i, t.comment)) }, 349: function (t, r, i) { return Mt(r, t.tagName) || (t.typeExpression && t.typeExpression.kind === 312 ? Mt(r, t.typeExpression) || Mt(r, t.fullName) || (typeof t.comment == "string" ? void 0 : fi(r, i, t.comment)) : Mt(r, t.fullName) || Mt(r, t.typeExpression) || (typeof t.comment == "string" ? void 0 : fi(r, i, t.comment))) }, 341: function (t, r, i) { return Mt(r, t.tagName) || Mt(r, t.fullName) || Mt(r, t.typeExpression) || (typeof t.comment == "string" ? void 0 : fi(r, i, t.comment)) }, 345: D2, 347: D2, 346: D2, 343: D2, 353: D2, 352: D2, 342: D2, 326: function (t, r, i) { return mn(t.typeParameters, r) || mn(t.parameters, r) || Mt(r, t.type) }, 327: lJ, 328: lJ, 329: lJ, 325: function (t, r, i) { return mn(t.jsDocPropertyTags, r) }, 330: WS, 335: WS, 336: WS, 337: WS, 338: WS, 339: WS, 334: WS, 340: WS, 356: WOe }, (e => {
+                        var t = kg(99, !0), r = 20480, i, o, s, l, f; function d(V) { return We++, V } var g = { createBaseSourceFileNode: V => d(new f(V, 0, 0)), createBaseIdentifierNode: V => d(new s(V, 0, 0)), createBasePrivateIdentifierNode: V => d(new l(V, 0, 0)), createBaseTokenNode: V => d(new o(V, 0, 0)), createBaseNode: V => d(new i(V, 0, 0)) }, m = YR(11, g), { createNodeArray: v, createNumericLiteral: S, createStringLiteral: x, createLiteralLikeNode: A, createIdentifier: w, createPrivateIdentifier: C, createToken: P, createArrayLiteralExpression: F, createObjectLiteralExpression: B, createPropertyAccessExpression: q, createPropertyAccessChain: W, createElementAccessExpression: Y, createElementAccessChain: R, createCallExpression: ie, createCallChain: $, createNewExpression: fe, createParenthesizedExpression: Z, createBlock: U, createVariableStatement: re, createExpressionStatement: le, createIfStatement: _e, createWhileStatement: ge, createForStatement: X, createForOfStatement: Ve, createVariableDeclaration: we, createVariableDeclarationList: ke } = m, Pe, Ce, Ie, Be, Ne, Le, Ye, _t, ct, Rt, We, qe, zt, Qt, tn, kn, _n = !0, Gt = !1; function $n(V, me, Ue, ut, Lt = !1, dn, Er) { var ii; if (dn = h4(V, dn), dn === 6) { let di = Ni(V, me, Ue, ut, Lt); return PO(di, (ii = di.statements[0]) == null ? void 0 : ii.expression, di.parseDiagnostics, !1, void 0, void 0), di.referencedFiles = Je, di.typeReferenceDirectives = Je, di.libReferenceDirectives = Je, di.amdDependencies = Je, di.hasNoDefaultLib = !1, di.pragmas = b8, di } Pi(V, me, Ue, ut, dn); let li = pt(Ue, Lt, dn, Er || Pde); return gr(), li } e.parseSourceFile = $n; function ui(V, me) { Pi("", V, me, void 0, 1), Qe(); let Ue = Io(!0), ut = j() === 1 && !Ye.length; return gr(), ut ? Ue : void 0 } e.parseIsolatedEntityName = ui; function Ni(V, me, Ue = 2, ut, Lt = !1) { Pi(V, me, Ue, ut, 6), Ce = kn, Qe(); let dn = z(), Er, ii; if (j() === 1) Er = As([], dn, dn), ii = Pc(); else { let ma; for (; j() !== 1;) { let Oo; switch (j()) { case 22: Oo = ay(); break; case 110: case 95: case 104: Oo = Pc(); break; case 40: Nr(() => Qe() === 8 && Qe() !== 58) ? Oo = T1() : Oo = wc(); break; case 8: case 10: if (Nr(() => Qe() !== 58)) { Oo = oa(); break } default: Oo = wc(); break }ma && ba(ma) ? ma.push(Oo) : ma ? ma = [ma, Oo] : (ma = Oo, j() !== 1 && rt(_.Unexpected_token)) } let is = ba(ma) ? jt(F(ma), dn) : L.checkDefined(ma), ao = le(is); jt(ao, dn), Er = As([ao], dn), ii = Ll(1, _.Unexpected_token) } let li = hi(V, 2, 6, !1, Er, ii, Ce, Ba); Lt && Kn(li), li.nodeCount = We, li.identifierCount = zt, li.identifiers = qe, li.parseDiagnostics = vS(Ye, li), _t && (li.jsDocDiagnostics = vS(_t, li)); let di = li; return gr(), di } e.parseJsonText = Ni; function Pi(V, me, Ue, ut, Lt) { switch (i = ml.getNodeConstructor(), o = ml.getTokenConstructor(), s = ml.getIdentifierConstructor(), l = ml.getPrivateIdentifierConstructor(), f = ml.getSourceFileConstructor(), Pe = So(V), Ie = me, Be = Ue, ct = ut, Ne = Lt, Le = RR(Lt), Ye = [], Qt = 0, qe = new Map, zt = 0, We = 0, Ce = 0, _n = !0, Ne) { case 1: case 2: kn = 262144; break; case 6: kn = 67371008; break; default: kn = 0; break }Gt = !1, t.setText(Ie), t.setOnError(pe), t.setScriptTarget(Be), t.setLanguageVariant(Le) } function gr() { t.clearCommentDirectives(), t.setText(""), t.setOnError(void 0), Ie = void 0, Be = void 0, ct = void 0, Ne = void 0, Le = void 0, Ce = 0, Ye = void 0, _t = void 0, Qt = 0, qe = void 0, tn = void 0, _n = !0 } function pt(V, me, Ue, ut) { let Lt = Fu(Pe); Lt && (kn |= 16777216), Ce = kn, Qe(); let dn = ee(0, of); L.assert(j() === 1); let Er = pn(Pc()), ii = hi(Pe, V, Ue, Lt, dn, Er, Ce, ut); return dJ(ii, Ie), fJ(ii, li), ii.commentDirectives = t.getCommentDirectives(), ii.nodeCount = We, ii.identifierCount = zt, ii.identifiers = qe, ii.parseDiagnostics = vS(Ye, ii), _t && (ii.jsDocDiagnostics = vS(_t, ii)), me && Kn(ii), ii; function li(di, ma, is) { Ye.push(t2(Pe, di, ma, is)) } } function nn(V, me) { return me ? pn(V) : V } let Dt = !1; function pn(V) { L.assert(!V.jsDoc); let me = Zi(EH(V, Ie), Ue => Mx.parseJSDocComment(V, Ue.pos, Ue.end - Ue.pos)); return me.length && (V.jsDoc = me), Dt && (Dt = !1, V.flags |= 268435456), V } function An(V) { let me = ct, Ue = D3.createSyntaxCursor(V); ct = { currentNode: ma }; let ut = [], Lt = Ye; Ye = []; let dn = 0, Er = li(V.statements, 0); for (; Er !== -1;) { let is = V.statements[dn], ao = V.statements[Er]; si(ut, V.statements, dn, Er), dn = di(V.statements, Er); let Oo = Yc(Lt, np => np.start >= is.pos), id = Oo >= 0 ? Yc(Lt, np => np.start >= ao.pos, Oo) : -1; Oo >= 0 && si(Ye, Lt, Oo, id >= 0 ? id : void 0), xi(() => { let np = kn; for (kn |= 32768, t.setTextPos(ao.pos), Qe(); j() !== 1;) { let Op = t.getStartPos(), cg = Ze(0, of); if (ut.push(cg), Op === t.getStartPos() && Qe(), dn >= 0) { let Yf = V.statements[dn]; if (cg.end === Yf.pos) break; cg.end > Yf.pos && (dn = di(V.statements, dn + 1)) } } kn = np }, 2), Er = dn >= 0 ? li(V.statements, dn) : -1 } if (dn >= 0) { let is = V.statements[dn]; si(ut, V.statements, dn); let ao = Yc(Lt, Oo => Oo.start >= is.pos); ao >= 0 && si(Ye, Lt, ao) } return ct = me, m.updateSourceFile(V, it(v(ut), V.statements)); function ii(is) { return !(is.flags & 32768) && !!(is.transformFlags & 67108864) } function li(is, ao) { for (let Oo = ao; Oo < is.length; Oo++)if (ii(is[Oo])) return Oo; return -1 } function di(is, ao) { for (let Oo = ao; Oo < is.length; Oo++)if (!ii(is[Oo])) return Oo; return -1 } function ma(is) { let ao = Ue.currentNode(is); return _n && ao && ii(ao) && (ao.intersectsChange = !0), ao } } function Kn(V) { Zy(V, !0) } e.fixupParentReferences = Kn; function hi(V, me, Ue, ut, Lt, dn, Er, ii) { let li = m.createSourceFile(Lt, dn, Er); return oL(li, 0, Ie.length), di(li), !ut && Lc(li) && li.transformFlags & 67108864 && (li = An(li), di(li)), li; function di(ma) { ma.text = Ie, ma.bindDiagnostics = [], ma.bindSuggestionDiagnostics = void 0, ma.languageVersion = me, ma.fileName = V, ma.languageVariant = RR(Ue), ma.isDeclarationFile = ut, ma.scriptKind = Ue, ii(ma), ma.setExternalModuleIndicator = ii } } function ri(V, me) { V ? kn |= me : kn &= ~me } function vn(V) { ri(V, 4096) } function Ht(V) { ri(V, 8192) } function En(V) { ri(V, 16384) } function dr(V) { ri(V, 32768) } function Cr(V, me) { let Ue = V & kn; if (Ue) { ri(!1, Ue); let ut = me(); return ri(!0, Ue), ut } return me() } function Se(V, me) { let Ue = V & ~kn; if (Ue) { ri(!0, Ue); let ut = me(); return ri(!1, Ue), ut } return me() } function at(V) { return Cr(4096, V) } function Tt(V) { return Se(4096, V) } function ve(V) { return Cr(65536, V) } function nt(V) { return Se(65536, V) } function ce(V) { return Se(8192, V) } function Q(V) { return Se(16384, V) } function ue(V) { return Se(32768, V) } function G(V) { return Cr(32768, V) } function Oe(V) { return Se(40960, V) } function je(V) { return Cr(40960, V) } function Ge(V) { return (kn & V) !== 0 } function kt() { return Ge(8192) } function Kt() { return Ge(4096) } function ln() { return Ge(65536) } function ir() { return Ge(16384) } function ae() { return Ge(32768) } function rt(V, me) { return Ke(t.getTokenPos(), t.getTextPos(), V, me) } function Ot(V, me, Ue, ut) { let Lt = Os(Ye), dn; return (!Lt || V !== Lt.start) && (dn = t2(Pe, V, me, Ue, ut), Ye.push(dn)), Gt = !0, dn } function Ke(V, me, Ue, ut) { return Ot(V, me - V, Ue, ut) } function oe(V, me, Ue) { Ke(V.pos, V.end, me, Ue) } function pe(V, me) { Ot(t.getTextPos(), me, V) } function z() { return t.getStartPos() } function Te() { return t.hasPrecedingJSDocComment() } function j() { return Rt } function yt() { return Rt = t.scan() } function lt(V) { return Qe(), V() } function Qe() { return Xu(Rt) && (t.hasUnicodeEscape() || t.hasExtendedUnicodeEscape()) && Ke(t.getTokenPos(), t.getTextPos(), _.Keywords_cannot_contain_escape_characters), yt() } function Vt() { return Rt = t.scanJsDocToken() } function Hn() { return Rt = t.reScanGreaterToken() } function jr() { return Rt = t.reScanSlashToken() } function ei(V) { return Rt = t.reScanTemplateToken(V) } function Kr() { return Rt = t.reScanTemplateHeadOrNoSubstitutionTemplate() } function Si() { return Rt = t.reScanLessThanToken() } function Ja() { return Rt = t.reScanHashToken() } function Za() { return Rt = t.scanJsxIdentifier() } function Fa() { return Rt = t.scanJsxToken() } function Hi() { return Rt = t.scanJsxAttributeValue() } function xi(V, me) { let Ue = Rt, ut = Ye.length, Lt = Gt, dn = kn, Er = me !== 0 ? t.lookAhead(V) : t.tryScan(V); return L.assert(dn === kn), (!Er || me !== 0) && (Rt = Ue, me !== 2 && (Ye.length = ut), Gt = Lt), Er } function Nr(V) { return xi(V, 1) } function Fo(V) { return xi(V, 0) } function Qr() { return j() === 79 ? !0 : j() > 116 } function Wi() { return j() === 79 ? !0 : j() === 125 && kt() || j() === 133 && ae() ? !1 : j() > 116 } function gn(V, me, Ue = !0) { return j() === V ? (Ue && Qe(), !0) : (me ? rt(me) : rt(_._0_expected, Xa(V)), !1) } let Ki = Object.keys(Ew).filter(V => V.length > 2); function kc(V) { var me; if (PT(V)) { Ke(xo(Ie, V.template.pos), V.template.end, _.Module_declaration_names_may_only_use_or_quoted_strings); return } let Ue = Re(V) ? vr(V) : void 0; if (!Ue || !i_(Ue, Be)) { rt(_._0_expected, Xa(26)); return } let ut = xo(Ie, V.pos); switch (Ue) { case "const": case "let": case "var": Ke(ut, V.end, _.Variable_declaration_not_allowed_at_this_location); return; case "declare": return; case "interface": Ps(_.Interface_name_cannot_be_0, _.Interface_must_be_given_a_name, 18); return; case "is": Ke(ut, t.getTextPos(), _.A_type_predicate_is_only_allowed_in_return_type_position_for_functions_and_methods); return; case "module": case "namespace": Ps(_.Namespace_name_cannot_be_0, _.Namespace_must_be_given_a_name, 18); return; case "type": Ps(_.Type_alias_name_cannot_be_0, _.Type_alias_must_be_given_a_name, 63); return }let Lt = (me = $C(Ue, Ki, dn => dn)) != null ? me : mc(Ue); if (Lt) { Ke(ut, V.end, _.Unknown_keyword_or_identifier_Did_you_mean_0, Lt); return } j() !== 0 && Ke(ut, V.end, _.Unexpected_keyword_or_identifier) } function Ps(V, me, Ue) { j() === Ue ? rt(me) : rt(V, t.getTokenValue()) } function mc(V) { for (let me of Ki) if (V.length > me.length + 2 && na(V, me)) return `${me} ${V.slice(me.length)}` } function xc(V, me, Ue) { if (j() === 59 && !t.hasPrecedingLineBreak()) { rt(_.Decorators_must_precede_the_name_and_all_keywords_of_property_declarations); return } if (j() === 20) { rt(_.Cannot_start_a_function_call_in_a_type_annotation), Qe(); return } if (me && !ss()) { Ue ? rt(_._0_expected, Xa(26)) : rt(_.Expected_for_property_initializer); return } if (!qs()) { if (Ue) { rt(_._0_expected, Xa(26)); return } kc(V) } } function hc(V) { return j() === V ? (Vt(), !0) : (rt(_._0_expected, Xa(V)), !1) } function ro(V, me, Ue, ut) { if (j() === me) { Qe(); return } let Lt = rt(_._0_expected, Xa(me)); Ue && Lt && Ao(Lt, t2(Pe, ut, 1, _.The_parser_expected_to_find_a_1_to_match_the_0_token_here, Xa(V), Xa(me))) } function aa(V) { return j() === V ? (Qe(), !0) : !1 } function Co(V) { if (j() === V) return Pc() } function gc(V) { if (j() === V) return bl() } function Ll(V, me, Ue) { return Co(V) || yc(V, !1, me || _._0_expected, Ue || Xa(V)) } function md(V) { return gc(V) || yc(V, !1, _._0_expected, Xa(V)) } function Pc() { let V = z(), me = j(); return Qe(), jt(P(me), V) } function bl() { let V = z(), me = j(); return Vt(), jt(P(me), V) } function ss() { return j() === 26 ? !0 : j() === 19 || j() === 1 || t.hasPrecedingLineBreak() } function qs() { return ss() ? (j() === 26 && Qe(), !0) : !1 } function Rs() { return qs() || gn(26) } function As(V, me, Ue, ut) { let Lt = v(V, ut); return om(Lt, me, Ue ?? t.getStartPos()), Lt } function jt(V, me, Ue) { return om(V, me, Ue ?? t.getStartPos()), kn && (V.flags |= kn), Gt && (Gt = !1, V.flags |= 131072), V } function yc(V, me, Ue, ut) { me ? Ot(t.getStartPos(), 0, Ue, ut) : Ue && rt(Ue, ut); let Lt = z(), dn = V === 79 ? w("", void 0) : Hy(V) ? m.createTemplateLiteralLikeNode(V, "", "", void 0) : V === 8 ? S("", void 0) : V === 10 ? x("", void 0) : V === 279 ? m.createMissingDeclaration() : P(V); return jt(dn, Lt) } function Ql(V) { let me = qe.get(V); return me === void 0 && qe.set(V, me = V), me } function yu(V, me, Ue) { if (V) { zt++; let ii = z(), li = j(), di = Ql(t.getTokenValue()), ma = t.hasExtendedUnicodeEscape(); return yt(), jt(w(di, li, ma), ii) } if (j() === 80) return rt(Ue || _.Private_identifiers_are_not_allowed_outside_class_bodies), yu(!0); if (j() === 0 && t.tryScan(() => t.reScanInvalidIdentifier() === 79)) return yu(!0); zt++; let ut = j() === 1, Lt = t.isReservedWord(), dn = t.getTokenText(), Er = Lt ? _.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here : _.Identifier_expected; return yc(79, ut, me || Er, dn) } function se(V) { return yu(Qr(), void 0, V) } function ht(V, me) { return yu(Wi(), V, me) } function wt(V) { return yu(Su(j()), V) } function K() { return Su(j()) || j() === 10 || j() === 8 } function Xe() { return Su(j()) || j() === 10 } function ft(V) { if (j() === 10 || j() === 8) { let me = oa(); return me.text = Ql(me.text), me } return V && j() === 22 ? pr() : j() === 80 ? yr() : wt() } function Yt() { return ft(!0) } function pr() { let V = z(); gn(22); let me = at(Ml); return gn(23), jt(m.createComputedPropertyName(me), V) } function yr() { let V = z(), me = C(Ql(t.getTokenValue())); return Qe(), jt(me, V) } function ta(V) { return j() === V && Fo(Ka) } function Go() { return Qe(), t.hasPrecedingLineBreak() ? !1 : Uc() } function Ka() { switch (j()) { case 85: return Qe() === 92; case 93: return Qe(), j() === 88 ? Nr(Gu) : j() === 154 ? Nr(ka) : vo(); case 88: return Gu(); case 124: case 137: case 151: return Qe(), Uc(); default: return Go() } } function vo() { return j() === 59 || j() !== 41 && j() !== 128 && j() !== 18 && Uc() } function ka() { return Qe(), vo() } function Hs() { return Rg(j()) && Fo(Ka) } function Uc() { return j() === 22 || j() === 18 || j() === 41 || j() === 25 || K() } function Gu() { return Qe(), j() === 84 || j() === 98 || j() === 118 || j() === 59 || j() === 126 && Nr(Em) || j() === 132 && Nr(Jb) } function $o(V, me) { if (At(V)) return !0; switch (V) { case 0: case 1: case 3: return !(j() === 26 && me) && C1(); case 2: return j() === 82 || j() === 88; case 4: return Nr(dE); case 5: return Nr(rd) || j() === 26 && !me; case 6: return j() === 22 || K(); case 12: switch (j()) { case 22: case 41: case 25: case 24: return !0; default: return K() }case 18: return K(); case 9: return j() === 22 || j() === 25 || K(); case 24: return Xe(); case 7: return j() === 18 ? Nr(jo) : me ? Wi() && !nf() : Pb() && !nf(); case 8: return IE(); case 10: return j() === 27 || j() === 25 || IE(); case 19: return j() === 101 || j() === 85 || Wi(); case 15: switch (j()) { case 27: case 24: return !0 }case 11: return j() === 25 || C_(); case 16: return Cb(!1); case 17: return Cb(!0); case 20: case 21: return j() === 27 || qh(); case 22: return lh(); case 23: return Su(j()); case 13: return Su(j()) || j() === 18; case 14: return !0 }return L.fail("Non-exhaustive case in 'isListElement'.") } function jo() { if (L.assert(j() === 18), Qe() === 19) { let V = Qe(); return V === 27 || V === 18 || V === 94 || V === 117 } return !0 } function Ws() { return Qe(), Wi() } function hd() { return Qe(), Su(j()) } function vc() { return Qe(), moe(j()) } function nf() { return j() === 117 || j() === 94 ? Nr(ye) : !1 } function ye() { return Qe(), C_() } function Et() { return Qe(), qh() } function bn(V) { if (j() === 1) return !0; switch (V) { case 1: case 2: case 4: case 5: case 6: case 12: case 9: case 23: case 24: return j() === 19; case 3: return j() === 19 || j() === 82 || j() === 88; case 7: return j() === 18 || j() === 94 || j() === 117; case 8: return Ri(); case 19: return j() === 31 || j() === 20 || j() === 18 || j() === 94 || j() === 117; case 11: return j() === 21 || j() === 26; case 15: case 21: case 10: return j() === 23; case 17: case 16: case 18: return j() === 21 || j() === 23; case 20: return j() !== 27; case 22: return j() === 18 || j() === 19; case 13: return j() === 31 || j() === 43; case 14: return j() === 29 && Nr(Wa); default: return !1 } } function Ri() { return !!(ss() || b1(j()) || j() === 38) } function io() { for (let V = 0; V < 25; V++)if (Qt & 1 << V && ($o(V, !0) || bn(V))) return !0; return !1 } function ee(V, me) { let Ue = Qt; Qt |= 1 << V; let ut = [], Lt = z(); for (; !bn(V);) { if ($o(V, !1)) { ut.push(Ze(V, me)); continue } if (Bu(V)) break } return Qt = Ue, As(ut, Lt) } function Ze(V, me) { let Ue = At(V); return Ue ? xt(Ue) : me() } function At(V, me) { var Ue; if (!ct || !qt(V) || Gt) return; let ut = ct.currentNode(me ?? t.getStartPos()); if (!(rc(ut) || ut.intersectsChange || Gw(ut) || (ut.flags & 50720768) !== kn) && Ln(ut, V)) return lR(ut) && ((Ue = ut.jsDoc) != null && Ue.jsDocCache) && (ut.jsDoc.jsDocCache = void 0), ut } function xt(V) { return t.setTextPos(V.end), Qe(), V } function qt(V) { switch (V) { case 5: case 2: case 0: case 1: case 3: case 6: case 4: case 8: case 17: case 16: return !0 }return !1 } function Ln(V, me) { switch (me) { case 5: return mr(V); case 2: return Vr(V); case 0: case 1: case 3: return gi(V); case 6: return Ea(V); case 4: return bo(V); case 8: return Qo(V); case 17: case 16: return Cs(V) }return !1 } function mr(V) { if (V) switch (V.kind) { case 173: case 178: case 174: case 175: case 169: case 237: return !0; case 171: let me = V; return !(me.name.kind === 79 && me.name.escapedText === "constructor") }return !1 } function Vr(V) { if (V) switch (V.kind) { case 292: case 293: return !0 }return !1 } function gi(V) { if (V) switch (V.kind) { case 259: case 240: case 238: case 242: case 241: case 254: case 250: case 252: case 249: case 248: case 246: case 247: case 245: case 244: case 251: case 239: case 255: case 253: case 243: case 256: case 269: case 268: case 275: case 274: case 264: case 260: case 261: case 263: case 262: return !0 }return !1 } function Ea(V) { return V.kind === 302 } function bo(V) { if (V) switch (V.kind) { case 177: case 170: case 178: case 168: case 176: return !0 }return !1 } function Qo(V) { return V.kind !== 257 ? !1 : V.initializer === void 0 } function Cs(V) { return V.kind !== 166 ? !1 : V.initializer === void 0 } function Bu(V) { return Pd(V), io() ? !0 : (Qe(), !1) } function Pd(V) { switch (V) { case 0: return j() === 88 ? rt(_._0_expected, Xa(93)) : rt(_.Declaration_or_statement_expected); case 1: return rt(_.Declaration_or_statement_expected); case 2: return rt(_.case_or_default_expected); case 3: return rt(_.Statement_expected); case 18: case 4: return rt(_.Property_or_signature_expected); case 5: return rt(_.Unexpected_token_A_constructor_method_accessor_or_property_was_expected); case 6: return rt(_.Enum_member_expected); case 7: return rt(_.Expression_expected); case 8: return Xu(j()) ? rt(_._0_is_not_allowed_as_a_variable_declaration_name, Xa(j())) : rt(_.Variable_declaration_expected); case 9: return rt(_.Property_destructuring_pattern_expected); case 10: return rt(_.Array_element_destructuring_pattern_expected); case 11: return rt(_.Argument_expression_expected); case 12: return rt(_.Property_assignment_expected); case 15: return rt(_.Expression_or_comma_expected); case 17: return rt(_.Parameter_declaration_expected); case 16: return Xu(j()) ? rt(_._0_is_not_allowed_as_a_parameter_name, Xa(j())) : rt(_.Parameter_declaration_expected); case 19: return rt(_.Type_parameter_declaration_expected); case 20: return rt(_.Type_argument_expected); case 21: return rt(_.Type_expected); case 22: return rt(_.Unexpected_token_expected); case 23: return rt(_.Identifier_expected); case 13: return rt(_.Identifier_expected); case 14: return rt(_.Identifier_expected); case 24: return rt(_.Identifier_or_string_literal_expected); case 25: return L.fail("ParsingContext.Count used as a context"); default: L.assertNever(V) } } function Dc(V, me, Ue) { let ut = Qt; Qt |= 1 << V; let Lt = [], dn = z(), Er = -1; for (; ;) { if ($o(V, !1)) { let ii = t.getStartPos(), li = Ze(V, me); if (!li) { Qt = ut; return } if (Lt.push(li), Er = t.getTokenPos(), aa(27)) continue; if (Er = -1, bn(V)) break; gn(27, gd(V)), Ue && j() === 26 && !t.hasPrecedingLineBreak() && Qe(), ii === t.getStartPos() && Qe(); continue } if (bn(V) || Bu(V)) break } return Qt = ut, As(Lt, dn, void 0, Er >= 0) } function gd(V) { return V === 6 ? _.An_enum_member_name_must_be_followed_by_a_or : void 0 } function Zl() { let V = As([], z()); return V.isMissingList = !0, V } function Md(V) { return !!V.isMissingList } function zf(V, me, Ue, ut) { if (gn(Ue)) { let Lt = Dc(V, me); return gn(ut), Lt } return Zl() } function Io(V, me) { let Ue = z(), ut = V ? wt(me) : ht(me); for (; aa(24) && j() !== 29;)ut = jt(m.createQualifiedName(ut, Fd(V, !1)), Ue); return ut } function Jf(V, me) { return jt(m.createQualifiedName(V, me), V.pos) } function Fd(V, me) { if (t.hasPrecedingLineBreak() && Su(j()) && Nr(Vu)) return yc(79, !0, _.Identifier_expected); if (j() === 80) { let Ue = yr(); return me ? Ue : yc(79, !0, _.Identifier_expected) } return V ? wt() : ht() } function E_(V) { let me = z(), Ue = [], ut; do ut = la(V), Ue.push(ut); while (ut.literal.kind === 16); return As(Ue, me) } function Y_(V) { let me = z(); return jt(m.createTemplateExpression(be(V), E_(V)), me) } function M() { let V = z(); return jt(m.createTemplateLiteralType(be(!1), He()), V) } function He() { let V = z(), me = [], Ue; do Ue = Nt(), me.push(Ue); while (Ue.literal.kind === 16); return As(me, V) } function Nt() { let V = z(); return jt(m.createTemplateLiteralTypeSpan(Kc(), Pn(!1)), V) } function Pn(V) { return j() === 19 ? (ei(V), De()) : Ll(17, _._0_expected, Xa(19)) } function la(V) { let me = z(); return jt(m.createTemplateSpan(at(Ml), Pn(V)), me) } function oa() { return St(j()) } function be(V) { V && Kr(); let me = St(j()); return L.assert(me.kind === 15, "Template head has wrong token kind"), me } function De() { let V = St(j()); return L.assert(V.kind === 16 || V.kind === 17, "Template fragment has wrong token kind"), V } function mt(V) { let me = V === 14 || V === 17, Ue = t.getTokenText(); return Ue.substring(1, Ue.length - (t.isUnterminated() ? 0 : me ? 1 : 2)) } function St(V) { let me = z(), Ue = Hy(V) ? m.createTemplateLiteralLikeNode(V, t.getTokenValue(), mt(V), t.getTokenFlags() & 2048) : V === 8 ? S(t.getTokenValue(), t.getNumericLiteralFlags()) : V === 10 ? x(t.getTokenValue(), void 0, t.hasExtendedUnicodeEscape()) : gI(V) ? A(V, t.getTokenValue()) : L.fail(); return t.hasExtendedUnicodeEscape() && (Ue.hasExtendedUnicodeEscape = !0), t.isUnterminated() && (Ue.isUnterminated = !0), Qe(), jt(Ue, me) } function Zt() { return Io(!0, _.Type_expected) } function rn() { if (!t.hasPrecedingLineBreak() && Si() === 29) return zf(20, Kc, 29, 31) } function sn() { let V = z(); return jt(m.createTypeReferenceNode(Zt(), rn()), V) } function Dn(V) { switch (V.kind) { case 180: return rc(V.typeName); case 181: case 182: { let { parameters: me, type: Ue } = V; return Md(me) || Dn(Ue) } case 193: return Dn(V.type); default: return !1 } } function kr(V) { return Qe(), jt(m.createTypePredicateNode(void 0, V, Kc()), V.pos) } function ki() { let V = z(); return Qe(), jt(m.createThisTypeNode(), V) } function Vn() { let V = z(); return Qe(), jt(m.createJSDocAllType(), V) } function $t() { let V = z(); return Qe(), jt(m.createJSDocNonNullableType(wb(), !1), V) } function Xn() { let V = z(); return Qe(), j() === 27 || j() === 19 || j() === 21 || j() === 31 || j() === 63 || j() === 51 ? jt(m.createJSDocUnknownType(), V) : jt(m.createJSDocNullableType(Kc(), !1), V) } function ra() { let V = z(), me = Te(); if (Nr(qr)) { Qe(); let Ue = $_(36), ut = S_(58, !1); return nn(jt(m.createJSDocFunctionType(Ue, ut), V), me) } return jt(m.createTypeReferenceNode(wt(), void 0), V) } function Is() { let V = z(), me; return (j() === 108 || j() === 103) && (me = wt(), gn(58)), jt(m.createParameterDeclaration(void 0, void 0, me, void 0, Mc(), void 0), V) } function Mc() { t.setInJSDocType(!0); let V = z(); if (aa(142)) { let ut = m.createJSDocNamepathType(void 0); e: for (; ;)switch (j()) { case 19: case 1: case 27: case 5: break e; default: Vt() }return t.setInJSDocType(!1), jt(ut, V) } let me = aa(25), Ue = wo(); return t.setInJSDocType(!1), me && (Ue = jt(m.createJSDocVariadicType(Ue), V)), j() === 63 ? (Qe(), jt(m.createJSDocOptionalType(Ue), V)) : Ue } function mm() { let V = z(); gn(112); let me = Io(!0), Ue = t.hasPrecedingLineBreak() ? void 0 : bd(); return jt(m.createTypeQueryNode(me, Ue), V) } function Hh() { let V = z(), me = ls(!1, !0), Ue = ht(), ut, Lt; aa(94) && (qh() || !C_() ? ut = Kc() : Lt = Q_()); let dn = aa(63) ? Kc() : void 0, Er = m.createTypeParameterDeclaration(me, Ue, ut, dn); return Er.expression = Lt, jt(Er, V) } function T_() { if (j() === 29) return zf(19, Hh, 29, 31) } function Cb(V) { return j() === 25 || IE() || Rg(j()) || j() === 59 || qh(!V) } function mv(V) { let me = cy(_.Private_identifiers_cannot_be_used_as_parameters); return Fw(me) === 0 && !vt(V) && Rg(j()) && Qe(), me } function gx() { return Qr() || j() === 22 || j() === 18 } function _1(V) { return Wh(V) } function yx(V) { return Wh(V, !1) } function Wh(V, me = !0) { let Ue = z(), ut = Te(), Lt = V ? ue(() => ls(!0)) : G(() => ls(!0)); if (j() === 108) { let li = m.createParameterDeclaration(Lt, void 0, yu(!0), void 0, th(), void 0), di = Sl(Lt); return di && oe(di, _.Neither_decorators_nor_modifiers_may_be_applied_to_this_parameters), nn(jt(li, Ue), ut) } let dn = _n; _n = !1; let Er = Co(25); if (!me && !gx()) return; let ii = nn(jt(m.createParameterDeclaration(Lt, Er, mv(Lt), Co(57), th(), Yh()), Ue), ut); return _n = dn, ii } function S_(V, me) { if (hv(V, me)) return ve(wo) } function hv(V, me) { return V === 38 ? (gn(V), !0) : aa(58) ? !0 : me && j() === 38 ? (rt(_._0_expected, Xa(58)), Qe(), !0) : !1 } function eh(V, me) { let Ue = kt(), ut = ae(); Ht(!!(V & 1)), dr(!!(V & 2)); let Lt = V & 32 ? Dc(17, Is) : Dc(16, () => me ? _1(ut) : yx(ut)); return Ht(Ue), dr(ut), Lt } function $_(V) { if (!gn(20)) return Zl(); let me = eh(V, !0); return gn(21), me } function gv() { aa(27) || Rs() } function lE(V) { let me = z(), Ue = Te(); V === 177 && gn(103); let ut = T_(), Lt = $_(4), dn = S_(58, !0); gv(); let Er = V === 176 ? m.createCallSignature(ut, Lt, dn) : m.createConstructSignature(ut, Lt, dn); return nn(jt(Er, me), Ue) } function Ib() { return j() === 22 && Nr(zh) } function zh() { if (Qe(), j() === 25 || j() === 23) return !0; if (Rg(j())) { if (Qe(), Wi()) return !0 } else if (Wi()) Qe(); else return !1; return j() === 58 || j() === 27 ? !0 : j() !== 57 ? !1 : (Qe(), j() === 58 || j() === 27 || j() === 23) } function p1(V, me, Ue) { let ut = zf(16, () => _1(!1), 22, 23), Lt = th(); gv(); let dn = m.createIndexSignature(Ue, ut, Lt); return nn(jt(dn, V), me) } function uE(V, me, Ue) { let ut = Yt(), Lt = Co(57), dn; if (j() === 20 || j() === 29) { let Er = T_(), ii = $_(4), li = S_(58, !0); dn = m.createMethodSignature(Ue, ut, Lt, Er, ii, li) } else { let Er = th(); dn = m.createPropertySignature(Ue, ut, Lt, Er), j() === 63 && (dn.initializer = Yh()) } return gv(), nn(jt(dn, V), me) } function dE() { if (j() === 20 || j() === 29 || j() === 137 || j() === 151) return !0; let V = !1; for (; Rg(j());)V = !0, Qe(); return j() === 22 ? !0 : (K() && (V = !0, Qe()), V ? j() === 20 || j() === 29 || j() === 57 || j() === 58 || j() === 27 || ss() : !1) } function fE() { if (j() === 20 || j() === 29) return lE(176); if (j() === 103 && Nr(yv)) return lE(177); let V = z(), me = Te(), Ue = ls(!1); return ta(137) ? Tm(V, me, Ue, 174, 4) : ta(151) ? Tm(V, me, Ue, 175, 4) : Ib() ? p1(V, me, Ue) : uE(V, me, Ue) } function yv() { return Qe(), j() === 20 || j() === 29 } function vx() { return Qe() === 24 } function _E() { switch (Qe()) { case 20: case 29: case 24: return !0 }return !1 } function pE() { let V = z(); return jt(m.createTypeLiteralNode(vv()), V) } function vv() { let V; return gn(18) ? (V = ee(4, fE), gn(19)) : V = Zl(), V } function Lb() { return Qe(), j() === 39 || j() === 40 ? Qe() === 146 : (j() === 146 && Qe(), j() === 22 && Ws() && Qe() === 101) } function bv() { let V = z(), me = wt(); gn(101); let Ue = Kc(); return jt(m.createTypeParameterDeclaration(void 0, me, Ue, void 0), V) } function m1() { let V = z(); gn(18); let me; (j() === 146 || j() === 39 || j() === 40) && (me = Pc(), me.kind !== 146 && gn(146)), gn(22); let Ue = bv(), ut = aa(128) ? Kc() : void 0; gn(23); let Lt; (j() === 57 || j() === 39 || j() === 40) && (Lt = Pc(), Lt.kind !== 57 && gn(57)); let dn = th(); Rs(); let Er = ee(4, fE); return gn(19), jt(m.createMappedTypeNode(me, Ue, ut, Lt, dn, Er), V) } function Jh() { let V = z(); if (aa(25)) return jt(m.createRestTypeNode(Kc()), V); let me = Kc(); if (T2(me) && me.pos === me.type.pos) { let Ue = m.createOptionalTypeNode(me.type); return it(Ue, me), Ue.flags = me.flags, Ue } return me } function Lo() { return Qe() === 58 || j() === 57 && Qe() === 58 } function mE() { return j() === 25 ? Su(Qe()) && Lo() : Su(j()) && Lo() } function sC() { if (Nr(mE)) { let V = z(), me = Te(), Ue = Co(25), ut = wt(), Lt = Co(57); gn(58); let dn = Jh(), Er = m.createNamedTupleMember(Ue, ut, Lt, dn); return nn(jt(Er, V), me) } return Jh() } function Zg() { let V = z(); return jt(m.createTupleTypeNode(zf(21, sC, 22, 23)), V) } function Kh() { let V = z(); gn(20); let me = Kc(); return gn(21), jt(m.createParenthesizedType(me), V) } function hm() { let V; if (j() === 126) { let me = z(); Qe(); let Ue = jt(P(126), me); V = As([Ue], me) } return V } function x_() { let V = z(), me = Te(), Ue = hm(), ut = aa(103); L.assert(!Ue || ut, "Per isStartOfFunctionOrConstructorType, a function type cannot have modifiers."); let Lt = T_(), dn = $_(4), Er = S_(38, !1), ii = ut ? m.createConstructorTypeNode(Ue, Lt, dn, Er) : m.createFunctionTypeNode(Lt, dn, Er); return nn(jt(ii, V), me) } function Zu() { let V = Pc(); return j() === 24 ? void 0 : V } function ed(V) { let me = z(); V && Qe(); let Ue = j() === 110 || j() === 95 || j() === 104 ? Pc() : St(j()); return V && (Ue = jt(m.createPrefixUnaryExpression(40, Ue), me)), jt(m.createLiteralTypeNode(Ue), me) } function td() { return Qe(), j() === 100 } function kb() { let V = z(), me = t.getTokenPos(); gn(18); let Ue = t.hasPrecedingLineBreak(); gn(130), gn(58); let ut = fy(!0); if (!gn(19)) { let Lt = Os(Ye); Lt && Lt.code === _._0_expected.code && Ao(Lt, t2(Pe, me, 1, _.The_parser_expected_to_find_a_1_to_match_the_0_token_here, "{", "}")) } return jt(m.createImportTypeAssertionContainer(ut, Ue), V) } function Db() { Ce |= 2097152; let V = z(), me = aa(112); gn(100), gn(20); let Ue = Kc(), ut; aa(27) && (ut = kb()), gn(21); let Lt = aa(24) ? Zt() : void 0, dn = rn(); return jt(m.createImportTypeNode(Ue, ut, Lt, dn, me), V) } function bx() { return Qe(), j() === 8 || j() === 9 } function wb() { switch (j()) { case 131: case 157: case 152: case 148: case 160: case 153: case 134: case 155: case 144: case 149: return Fo(Zu) || sn(); case 66: t.reScanAsteriskEqualsToken(); case 41: return Vn(); case 60: t.reScanQuestionToken(); case 57: return Xn(); case 98: return ra(); case 53: return $t(); case 14: case 10: case 8: case 9: case 110: case 95: case 104: return ed(); case 40: return Nr(bx) ? ed(!0) : sn(); case 114: return Pc(); case 108: { let V = ki(); return j() === 140 && !t.hasPrecedingLineBreak() ? kr(V) : V } case 112: return Nr(td) ? Db() : mm(); case 18: return Nr(Lb) ? m1() : pE(); case 22: return Zg(); case 20: return Kh(); case 100: return Db(); case 129: return Nr(Vu) ? gE() : sn(); case 15: return M(); default: return sn() } } function qh(V) { switch (j()) { case 131: case 157: case 152: case 148: case 160: case 134: case 146: case 153: case 156: case 114: case 155: case 104: case 108: case 112: case 144: case 18: case 22: case 29: case 51: case 50: case 103: case 10: case 8: case 9: case 110: case 95: case 149: case 41: case 57: case 53: case 25: case 138: case 100: case 129: case 14: case 15: return !0; case 98: return !V; case 40: return !V && Nr(bx); case 20: return !V && Nr(Rb); default: return Wi() } } function Rb() { return Qe(), j() === 21 || Cb(!1) || qh() } function h1() { let V = z(), me = wb(); for (; !t.hasPrecedingLineBreak();)switch (j()) { case 53: Qe(), me = jt(m.createJSDocNonNullableType(me, !0), V); break; case 57: if (Nr(Et)) return me; Qe(), me = jt(m.createJSDocNullableType(me, !0), V); break; case 22: if (gn(22), qh()) { let Ue = Kc(); gn(23), me = jt(m.createIndexedAccessTypeNode(me, Ue), V) } else gn(23), me = jt(m.createArrayTypeNode(me), V); break; default: return me }return me } function Ob(V) { let me = z(); return gn(V), jt(m.createTypeOperatorNode(V, hE()), me) } function cC() { if (aa(94)) { let V = nt(Kc); if (ln() || j() !== 57) return V } } function Ex() { let V = z(), me = ht(), Ue = Fo(cC), ut = m.createTypeParameterDeclaration(void 0, me, Ue); return jt(ut, V) } function Ev() { let V = z(); return gn(138), jt(m.createInferTypeNode(Ex()), V) } function hE() { let V = j(); switch (V) { case 141: case 156: case 146: return Ob(V); case 138: return Ev() }return ve(h1) } function Fe(V) { if (Sv()) { let me = x_(), Ue; return Jm(me) ? Ue = V ? _.Function_type_notation_must_be_parenthesized_when_used_in_a_union_type : _.Function_type_notation_must_be_parenthesized_when_used_in_an_intersection_type : Ue = V ? _.Constructor_type_notation_must_be_parenthesized_when_used_in_a_union_type : _.Constructor_type_notation_must_be_parenthesized_when_used_in_an_intersection_type, oe(me, Ue), me } } function ey(V, me, Ue) { let ut = z(), Lt = V === 51, dn = aa(V), Er = dn && Fe(Lt) || me(); if (j() === V || dn) { let ii = [Er]; for (; aa(V);)ii.push(Fe(Lt) || me()); Er = jt(Ue(As(ii, ut)), ut) } return Er } function Ip() { return ey(50, hE, m.createIntersectionTypeNode) } function Tv() { return ey(51, Ip, m.createUnionTypeNode) } function Nb() { return Qe(), j() === 103 } function Sv() { return j() === 29 || j() === 20 && Nr(g1) ? !0 : j() === 103 || j() === 126 && Nr(Nb) } function Xh() { if (Rg(j()) && ls(!1), Wi() || j() === 108) return Qe(), !0; if (j() === 22 || j() === 18) { let V = Ye.length; return cy(), V === Ye.length } return !1 } function g1() { return Qe(), !!(j() === 21 || j() === 25 || Xh() && (j() === 58 || j() === 27 || j() === 57 || j() === 63 || j() === 21 && (Qe(), j() === 38))) } function wo() { let V = z(), me = Wi() && Fo(A_), Ue = Kc(); return me ? jt(m.createTypePredicateNode(void 0, me, Ue), V) : Ue } function A_() { let V = ht(); if (j() === 140 && !t.hasPrecedingLineBreak()) return Qe(), V } function gE() { let V = z(), me = Ll(129), Ue = j() === 108 ? ki() : ht(), ut = aa(140) ? Kc() : void 0; return jt(m.createTypePredicateNode(me, Ue, ut), V) } function Kc() { if (kn & 40960) return Cr(40960, Kc); if (Sv()) return x_(); let V = z(), me = Tv(); if (!ln() && !t.hasPrecedingLineBreak() && aa(94)) { let Ue = nt(Kc); gn(57); let ut = ve(Kc); gn(58); let Lt = ve(Kc); return jt(m.createConditionalTypeNode(me, Ue, ut, Lt), V) } return me } function th() { return aa(58) ? Kc() : void 0 } function Pb() { switch (j()) { case 108: case 106: case 104: case 110: case 95: case 8: case 9: case 10: case 14: case 15: case 20: case 22: case 18: case 98: case 84: case 103: case 43: case 68: case 79: return !0; case 100: return Nr(_E); default: return Wi() } } function C_() { if (Pb()) return !0; switch (j()) { case 39: case 40: case 54: case 53: case 89: case 112: case 114: case 45: case 46: case 29: case 133: case 125: case 80: case 59: return !0; default: return Tx() ? !0 : Wi() } } function Mb() { return j() !== 18 && j() !== 98 && j() !== 84 && j() !== 59 && C_() } function Ml() { let V = ir(); V && En(!1); let me = z(), Ue = ll(!0), ut; for (; ut = Co(27);)Ue = xv(Ue, ut, ll(!0), me); return V && En(!0), Ue } function Yh() { return aa(63) ? ll(!0) : void 0 } function ll(V) { if (y1()) return Ai(); let me = gm(V) || nh(V); if (me) return me; let Ue = z(), ut = Gb(0); return ut.kind === 79 && j() === 38 ? Rr(Ue, ut, V, void 0) : Ju(ut) && Mg(Hn()) ? xv(ut, Pc(), ll(V), Ue) : v1(ut, Ue, V) } function y1() { return j() === 125 ? kt() ? !0 : Nr(Lv) : !1 } function lC() { return Qe(), !t.hasPrecedingLineBreak() && Wi() } function Ai() { let V = z(); return Qe(), !t.hasPrecedingLineBreak() && (j() === 41 || C_()) ? jt(m.createYieldExpression(Co(41), ll(!0)), V) : jt(m.createYieldExpression(void 0, void 0), V) } function Rr(V, me, Ue, ut) { L.assert(j() === 38, "parseSimpleArrowFunctionExpression should only have been called if we had a =>"); let Lt = m.createParameterDeclaration(void 0, void 0, me, void 0, void 0, void 0); jt(Lt, me.pos); let dn = As([Lt], Lt.pos, Lt.end), Er = Ll(38), ii = Fb(!!ut, Ue), li = m.createArrowFunction(ut, void 0, dn, void 0, Er, ii); return pn(jt(li, V)) } function gm(V) { let me = yd(); if (me !== 0) return me === 1 ? zs(!0, !0) : Fo(() => $h(V)) } function yd() { return j() === 20 || j() === 29 || j() === 132 ? Nr(yE) : j() === 38 ? 1 : 0 } function yE() { if (j() === 132 && (Qe(), t.hasPrecedingLineBreak() || j() !== 20 && j() !== 29)) return 0; let V = j(), me = Qe(); if (V === 20) { if (me === 21) switch (Qe()) { case 38: case 58: case 18: return 1; default: return 0 }if (me === 22 || me === 18) return 2; if (me === 25) return 1; if (Rg(me) && me !== 132 && Nr(Ws)) return Qe() === 128 ? 0 : 1; if (!Wi() && me !== 108) return 0; switch (Qe()) { case 58: return 1; case 57: return Qe(), j() === 58 || j() === 27 || j() === 63 || j() === 21 ? 1 : 0; case 27: case 63: case 21: return 2 }return 0 } else return L.assert(V === 29), !Wi() && j() !== 85 ? 0 : Le === 1 ? Nr(() => { aa(85); let ut = Qe(); if (ut === 94) switch (Qe()) { case 63: case 31: case 43: return !1; default: return !0 } else if (ut === 27 || ut === 63) return !0; return !1 }) ? 1 : 0 : 2 } function $h(V) { let me = t.getTokenPos(); if (tn?.has(me)) return; let Ue = zs(!1, V); return Ue || (tn || (tn = new Set)).add(me), Ue } function nh(V) { if (j() === 132 && Nr(ym) === 1) { let me = z(), Ue = kE(), ut = Gb(0); return Rr(me, ut, V, Ue) } } function ym() { if (j() === 132) { if (Qe(), t.hasPrecedingLineBreak() || j() === 38) return 0; let V = Gb(0); if (!t.hasPrecedingLineBreak() && V.kind === 79 && j() === 38) return 1 } return 0 } function zs(V, me) { let Ue = z(), ut = Te(), Lt = kE(), dn = vt(Lt, mL) ? 2 : 0, Er = T_(), ii; if (gn(20)) { if (V) ii = eh(dn, V); else { let Op = eh(dn, V); if (!Op) return; ii = Op } if (!gn(21) && !V) return } else { if (!V) return; ii = Zl() } let li = j() === 58, di = S_(58, !1); if (di && !V && Dn(di)) return; let ma = di; for (; ma?.kind === 193;)ma = ma.type; let is = ma && S2(ma); if (!V && j() !== 38 && (is || j() !== 18)) return; let ao = j(), Oo = Ll(38), id = ao === 38 || ao === 18 ? Fb(vt(Lt, mL), me) : ht(); if (!me && li && j() !== 58) return; let np = m.createArrowFunction(Lt, Er, ii, di, Oo, id); return nn(jt(np, Ue), ut) } function Fb(V, me) { if (j() === 18) return nd(V ? 2 : 0); if (j() !== 26 && j() !== 98 && j() !== 84 && C1() && !Mb()) return nd(16 | (V ? 2 : 0)); let Ue = _n; _n = !1; let ut = V ? ue(() => ll(me)) : G(() => ll(me)); return _n = Ue, ut } function v1(V, me, Ue) { let ut = Co(57); if (!ut) return V; let Lt; return jt(m.createConditionalExpression(V, ut, Cr(r, () => ll(!1)), Lt = Ll(58), Pf(Lt) ? ll(Ue) : yc(79, !1, _._0_expected, Xa(58))), me) } function Gb(V) { let me = z(), Ue = Q_(); return Cf(V, Ue, me) } function b1(V) { return V === 101 || V === 162 } function Cf(V, me, Ue) { for (; ;) { Hn(); let ut = vR(j()); if (!(j() === 42 ? ut >= V : ut > V) || j() === 101 && Kt()) break; if (j() === 128 || j() === 150) { if (t.hasPrecedingLineBreak()) break; { let dn = j(); Qe(), me = dn === 150 ? Sx(me, Kc()) : E1(me, Kc()) } } else me = xv(me, Pc(), Gb(ut), Ue) } return me } function Tx() { return Kt() && j() === 101 ? !1 : vR(j()) > 0 } function Sx(V, me) { return jt(m.createSatisfiesExpression(V, me), V.pos) } function xv(V, me, Ue, ut) { return jt(m.createBinaryExpression(V, me, Ue), ut) } function E1(V, me) { return jt(m.createAsExpression(V, me), V.pos) } function T1() { let V = z(); return jt(m.createPrefixUnaryExpression(j(), lt(I_)), V) } function xx() { let V = z(); return jt(m.createDeleteExpression(lt(I_)), V) } function Bb() { let V = z(); return jt(m.createTypeOfExpression(lt(I_)), V) } function S1() { let V = z(); return jt(m.createVoidExpression(lt(I_)), V) } function rf() { return j() === 133 ? ae() ? !0 : Nr(Lv) : !1 } function Qh() { let V = z(); return jt(m.createAwaitExpression(lt(I_)), V) } function Q_() { if (Ax()) { let Ue = z(), ut = Ub(); return j() === 42 ? Cf(vR(j()), ut, Ue) : ut } let V = j(), me = I_(); if (j() === 42) { let Ue = xo(Ie, me.pos), { end: ut } = me; me.kind === 213 ? Ke(Ue, ut, _.A_type_assertion_expression_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Consider_enclosing_the_expression_in_parentheses) : Ke(Ue, ut, _.An_unary_expression_with_the_0_operator_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Consider_enclosing_the_expression_in_parentheses, Xa(V)) } return me } function I_() { switch (j()) { case 39: case 40: case 54: case 53: return T1(); case 89: return xx(); case 112: return Bb(); case 114: return S1(); case 29: return Le === 1 ? Zh(!0) : Ix(); case 133: if (rf()) return Qh(); default: return Ub() } } function Ax() { switch (j()) { case 39: case 40: case 54: case 53: case 89: case 112: case 114: case 133: return !1; case 29: if (Le !== 1) return !1; default: return !0 } } function Ub() { if (j() === 45 || j() === 46) { let me = z(); return jt(m.createPrefixUnaryExpression(j(), lt(Lp)), me) } else if (Le === 1 && j() === 29 && Nr(vc)) return Zh(!0); let V = Lp(); if (L.assert(Ju(V)), (j() === 45 || j() === 46) && !t.hasPrecedingLineBreak()) { let me = j(); return Qe(), jt(m.createPostfixUnaryExpression(V, me), V.pos) } return V } function Lp() { let V = z(), me; return j() === 100 ? Nr(yv) ? (Ce |= 2097152, me = Pc()) : Nr(vx) ? (Qe(), Qe(), me = jt(m.createMetaProperty(100, wt()), V), Ce |= 4194304) : me = x1() : me = j() === 106 ? Uu() : x1(), Wn(V, me) } function x1() { let V = z(), me = Kf(); return af(V, me, !0) } function Uu() { let V = z(), me = Pc(); if (j() === 29) { let Ue = z(), ut = Fo(ry); ut !== void 0 && (Ke(Ue, z(), _.super_may_not_use_type_arguments), Av() || (me = m.createExpressionWithTypeArguments(me, ut))) } return j() === 20 || j() === 24 || j() === 22 ? me : (Ll(24, _.super_must_be_followed_by_an_argument_list_or_member_access), jt(q(me, Fd(!0, !0)), V)) } function Zh(V, me, Ue) { let ut = z(), Lt = A1(V), dn; if (Lt.kind === 283) { let Er = eg(Lt), ii, li = Er[Er.length - 1]; if (li?.kind === 281 && !yb(li.openingElement.tagName, li.closingElement.tagName) && yb(Lt.tagName, li.closingElement.tagName)) { let di = li.children.end, ma = jt(m.createJsxElement(li.openingElement, li.children, jt(m.createJsxClosingElement(jt(w(""), di, di)), di, di)), li.openingElement.pos, di); Er = As([...Er.slice(0, Er.length - 1), ma], Er.pos, di), ii = li.closingElement } else ii = Vb(Lt, V), yb(Lt.tagName, ii.tagName) || (Ue && Xm(Ue) && yb(ii.tagName, Ue.tagName) ? oe(Lt.tagName, _.JSX_element_0_has_no_corresponding_closing_tag, AI(Ie, Lt.tagName)) : oe(ii.tagName, _.Expected_corresponding_JSX_closing_tag_for_0, AI(Ie, Lt.tagName))); dn = jt(m.createJsxElement(Lt, Er, ii), ut) } else Lt.kind === 286 ? dn = jt(m.createJsxFragment(Lt, eg(Lt), jb(V)), ut) : (L.assert(Lt.kind === 282), dn = Lt); if (V && j() === 29) { let Er = typeof me > "u" ? dn.pos : me, ii = Fo(() => Zh(!0, Er)); if (ii) { let li = yc(27, !1); return oL(li, ii.pos, 0), Ke(xo(Ie, Er), ii.end, _.JSX_expressions_must_have_one_parent_element), jt(m.createBinaryExpression(dn, li, ii), ut) } } return dn } function kp() { let V = z(), me = m.createJsxText(t.getTokenValue(), Rt === 12); return Rt = t.scanJsxToken(), jt(me, V) } function Dp(V, me) { switch (me) { case 1: if (US(V)) oe(V, _.JSX_fragment_has_no_corresponding_closing_tag); else { let Ue = V.tagName, ut = xo(Ie, Ue.pos); Ke(ut, Ue.end, _.JSX_element_0_has_no_corresponding_closing_tag, AI(Ie, V.tagName)) } return; case 30: case 7: return; case 11: case 12: return kp(); case 18: return bE(!1); case 29: return Zh(!1, void 0, V); default: return L.assertNever(me) } } function eg(V) { let me = [], Ue = z(), ut = Qt; for (Qt |= 16384; ;) { let Lt = Dp(V, Rt = t.reScanJsxToken()); if (!Lt || (me.push(Lt), Xm(V) && Lt?.kind === 281 && !yb(Lt.openingElement.tagName, Lt.closingElement.tagName) && yb(V.tagName, Lt.closingElement.tagName))) break } return Qt = ut, As(me, Ue) } function vE() { let V = z(); return jt(m.createJsxAttributes(ee(13, cs)), V) } function A1(V) { let me = z(); if (gn(29), j() === 31) return Fa(), jt(m.createJsxOpeningFragment(), me); let Ue = ty(), ut = kn & 262144 ? void 0 : bd(), Lt = vE(), dn; return j() === 31 ? (Fa(), dn = m.createJsxOpeningElement(Ue, ut, Lt)) : (gn(43), gn(31, void 0, !1) && (V ? Qe() : Fa()), dn = m.createJsxSelfClosingElement(Ue, ut, Lt)), jt(dn, me) } function ty() { let V = z(); Za(); let me = j() === 108 ? Pc() : wt(); for (; aa(24);)me = jt(q(me, Fd(!0, !1)), V); return me } function bE(V) { let me = z(); if (!gn(18)) return; let Ue, ut; return j() !== 19 && (Ue = Co(25), ut = Ml()), V ? gn(19) : gn(19, void 0, !1) && Fa(), jt(m.createJsxExpression(Ue, ut), me) } function cs() { if (j() === 18) return Cx(); Za(); let V = z(); return jt(m.createJsxAttribute(wt(), ny()), V) } function ny() { if (j() === 63) { if (Hi() === 10) return oa(); if (j() === 18) return bE(!0); if (j() === 29) return Zh(!0); rt(_.or_JSX_element_expected) } } function Cx() { let V = z(); gn(18), gn(25); let me = Ml(); return gn(19), jt(m.createJsxSpreadAttribute(me), V) } function Vb(V, me) { let Ue = z(); gn(30); let ut = ty(); return gn(31, void 0, !1) && (me || !yb(V.tagName, ut) ? Qe() : Fa()), jt(m.createJsxClosingElement(ut), Ue) } function jb(V) { let me = z(); return gn(30), gn(31, _.Expected_corresponding_closing_tag_for_JSX_fragment, !1) && (V ? Qe() : Fa()), jt(m.createJsxJsxClosingFragment(), me) } function Ix() { L.assert(Le !== 1, "Type assertions should never be parsed in JSX; they should be parsed as comparisons or JSX elements/fragments."); let V = z(); gn(29); let me = Kc(); gn(31); let Ue = I_(); return jt(m.createTypeAssertion(me, Ue), V) } function uC() { return Qe(), Su(j()) || j() === 22 || Av() } function Lx() { return j() === 28 && Nr(uC) } function Qn(V) { if (V.flags & 32) return !0; if (PS(V)) { let me = V.expression; for (; PS(me) && !(me.flags & 32);)me = me.expression; if (me.flags & 32) { for (; PS(V);)V.flags |= 32, V = V.expression; return !0 } } return !1 } function lc(V, me, Ue) { let ut = Fd(!0, !0), Lt = Ue || Qn(me), dn = Lt ? W(me, Ue, ut) : q(me, ut); if (Lt && pi(dn.name) && oe(dn.name, _.An_optional_chain_cannot_contain_private_identifiers), Vg(me) && me.typeArguments) { let Er = me.typeArguments.pos - 1, ii = xo(Ie, me.typeArguments.end) + 1; Ke(Er, ii, _.An_instantiation_expression_cannot_be_followed_by_a_property_access) } return jt(dn, V) } function zi(V, me, Ue) { let ut; if (j() === 23) ut = yc(79, !0, _.An_element_access_expression_should_take_an_argument); else { let dn = at(Ml); yf(dn) && (dn.text = Ql(dn.text)), ut = dn } gn(23); let Lt = Ue || Qn(me) ? R(me, Ue, ut) : Y(me, ut); return jt(Lt, V) } function af(V, me, Ue) { for (; ;) { let ut, Lt = !1; if (Ue && Lx() ? (ut = Ll(28), Lt = Su(j())) : Lt = aa(24), Lt) { me = lc(V, me, ut); continue } if ((ut || !ir()) && aa(22)) { me = zi(V, me, ut); continue } if (Av()) { me = !ut && me.kind === 230 ? vm(V, me.expression, ut, me.typeArguments) : vm(V, me, ut, void 0); continue } if (!ut) { if (j() === 53 && !t.hasPrecedingLineBreak()) { Qe(), me = jt(m.createNonNullExpression(me), V); continue } let dn = Fo(ry); if (dn) { me = jt(m.createExpressionWithTypeArguments(me, dn), V); continue } } return me } } function Av() { return j() === 14 || j() === 15 } function vm(V, me, Ue, ut) { let Lt = m.createTaggedTemplateExpression(me, ut, j() === 14 ? (Kr(), oa()) : Y_(!0)); return (Ue || me.flags & 32) && (Lt.flags |= 32), Lt.questionDotToken = Ue, jt(Lt, V) } function Wn(V, me) { for (; ;) { me = af(V, me, !0); let Ue, ut = Co(28); if (ut && (Ue = Fo(ry), Av())) { me = vm(V, me, ut, Ue); continue } if (Ue || j() === 20) { !ut && me.kind === 230 && (Ue = me.typeArguments, me = me.expression); let Lt = kx(), dn = ut || Qn(me) ? $(me, ut, Ue, Lt) : ie(me, Ue, Lt); me = jt(dn, V); continue } if (ut) { let Lt = yc(79, !1, _.Identifier_expected); me = jt(W(me, ut, Lt), V) } break } return me } function kx() { gn(20); let V = Dc(11, L_); return gn(21), V } function ry() { if (kn & 262144 || Si() !== 29) return; Qe(); let V = Dc(20, Kc); if (Hn() === 31) return Qe(), V && nl() ? V : void 0 } function nl() { switch (j()) { case 20: case 14: case 15: return !0; case 29: case 31: case 39: case 40: return !1 }return t.hasPrecedingLineBreak() || Tx() || !C_() } function Kf() { switch (j()) { case 8: case 9: case 10: case 14: return oa(); case 108: case 106: case 104: case 110: case 95: return Pc(); case 20: return Z_(); case 22: return ay(); case 18: return wc(); case 132: if (!Nr(Jb)) break; return tg(); case 59: return og(); case 84: return Rv(); case 98: return tg(); case 103: return qf(); case 43: case 68: if (jr() === 13) return oa(); break; case 15: return Y_(!1); case 80: return yr() }return ht(_.Expression_expected) } function Z_() { let V = z(), me = Te(); gn(20); let Ue = at(Ml); return gn(21), nn(jt(Z(Ue), V), me) } function iy() { let V = z(); gn(25); let me = ll(!0); return jt(m.createSpreadElement(me), V) } function EE() { return j() === 25 ? iy() : j() === 27 ? jt(m.createOmittedExpression(), z()) : ll(!0) } function L_() { return Cr(r, EE) } function ay() { let V = z(), me = t.getTokenPos(), Ue = gn(22), ut = t.hasPrecedingLineBreak(), Lt = Dc(15, EE); return ro(22, 23, Ue, me), jt(F(Lt, ut), V) } function Ac() { let V = z(), me = Te(); if (Co(25)) { let ma = ll(!0); return nn(jt(m.createSpreadAssignment(ma), V), me) } let Ue = ls(!0); if (ta(137)) return Tm(V, me, Ue, 174, 0); if (ta(151)) return Tm(V, me, Ue, 175, 0); let ut = Co(41), Lt = Wi(), dn = Yt(), Er = Co(57), ii = Co(53); if (ut || j() === 20 || j() === 29) return L1(V, me, Ue, ut, dn, Er, ii); let li; if (Lt && j() !== 58) { let ma = Co(63), is = ma ? at(() => ll(!0)) : void 0; li = m.createShorthandPropertyAssignment(dn, is), li.equalsToken = ma } else { gn(58); let ma = at(() => ll(!0)); li = m.createPropertyAssignment(dn, ma) } return li.modifiers = Ue, li.questionToken = Er, li.exclamationToken = ii, nn(jt(li, V), me) } function wc() { let V = z(), me = t.getTokenPos(), Ue = gn(18), ut = t.hasPrecedingLineBreak(), Lt = Dc(12, Ac, !0); return ro(18, 19, Ue, me), jt(B(Lt, ut), V) } function tg() { let V = ir(); En(!1); let me = z(), Ue = Te(), ut = ls(!1); gn(98); let Lt = Co(41), dn = Lt ? 1 : 0, Er = vt(ut, mL) ? 2 : 0, ii = dn && Er ? Oe(Fl) : dn ? ce(Fl) : Er ? ue(Fl) : Fl(), li = T_(), di = $_(dn | Er), ma = S_(58, !1), is = nd(dn | Er); En(V); let ao = m.createFunctionExpression(ut, Lt, ii, li, di, ma, is); return nn(jt(ao, me), Ue) } function Fl() { return Qr() ? se() : void 0 } function qf() { let V = z(); if (gn(103), aa(24)) { let dn = wt(); return jt(m.createMetaProperty(103, dn), V) } let me = z(), Ue = af(me, Kf(), !1), ut; Ue.kind === 230 && (ut = Ue.typeArguments, Ue = Ue.expression), j() === 28 && rt(_.Invalid_optional_chain_from_new_expression_Did_you_mean_to_call_0, AI(Ie, Ue)); let Lt = j() === 20 ? kx() : void 0; return jt(fe(Ue, ut, Lt), V) } function bm(V, me) { let Ue = z(), ut = Te(), Lt = t.getTokenPos(), dn = gn(18, me); if (dn || V) { let Er = t.hasPrecedingLineBreak(), ii = ee(1, of); ro(18, 19, dn, Lt); let li = nn(jt(U(ii, Er), Ue), ut); return j() === 63 && (rt(_.Declaration_or_statement_expected_This_follows_a_block_of_statements_so_if_you_intended_to_write_a_destructuring_assignment_you_might_need_to_wrap_the_whole_assignment_in_parentheses), Qe()), li } else { let Er = Zl(); return nn(jt(U(Er, void 0), Ue), ut) } } function nd(V, me) { let Ue = kt(); Ht(!!(V & 1)); let ut = ae(); dr(!!(V & 2)); let Lt = _n; _n = !1; let dn = ir(); dn && En(!1); let Er = bm(!!(V & 16), me); return dn && En(!0), _n = Lt, Ht(Ue), dr(ut), Er } function TE() { let V = z(), me = Te(); return gn(26), nn(jt(m.createEmptyStatement(), V), me) } function Hb() { let V = z(), me = Te(); gn(99); let Ue = t.getTokenPos(), ut = gn(20), Lt = at(Ml); ro(20, 21, ut, Ue); let dn = of(), Er = aa(91) ? of() : void 0; return nn(jt(_e(Lt, dn, Er), V), me) } function Wb() { let V = z(), me = Te(); gn(90); let Ue = of(); gn(115); let ut = t.getTokenPos(), Lt = gn(20), dn = at(Ml); return ro(20, 21, Lt, ut), aa(26), nn(jt(m.createDoStatement(Ue, dn), V), me) } function ep() { let V = z(), me = Te(); gn(115); let Ue = t.getTokenPos(), ut = gn(20), Lt = at(Ml); ro(20, 21, ut, Ue); let dn = of(); return nn(jt(ge(Lt, dn), V), me) } function rh() { let V = z(), me = Te(); gn(97); let Ue = Co(133); gn(20); let ut; j() !== 26 && (j() === 113 || j() === 119 || j() === 85 ? ut = wp(!0) : ut = Tt(Ml)); let Lt; if (Ue ? gn(162) : aa(162)) { let dn = at(() => ll(!0)); gn(21), Lt = Ve(Ue, ut, dn, of()) } else if (aa(101)) { let dn = at(Ml); gn(21), Lt = m.createForInStatement(ut, dn, of()) } else { gn(26); let dn = j() !== 26 && j() !== 21 ? at(Ml) : void 0; gn(26); let Er = j() !== 21 ? at(Ml) : void 0; gn(21), Lt = X(ut, dn, Er, of()) } return nn(jt(Lt, V), me) } function SE(V) { let me = z(), Ue = Te(); gn(V === 249 ? 81 : 86); let ut = ss() ? void 0 : ht(); Rs(); let Lt = V === 249 ? m.createBreakStatement(ut) : m.createContinueStatement(ut); return nn(jt(Lt, me), Ue) } function oy() { let V = z(), me = Te(); gn(105); let Ue = ss() ? void 0 : at(Ml); return Rs(), nn(jt(m.createReturnStatement(Ue), V), me) } function uc() { let V = z(), me = Te(); gn(116); let Ue = t.getTokenPos(), ut = gn(20), Lt = at(Ml); ro(20, 21, ut, Ue); let dn = Se(33554432, of); return nn(jt(m.createWithStatement(Lt, dn), V), me) } function ng() { let V = z(), me = Te(); gn(82); let Ue = at(Ml); gn(58); let ut = ee(3, of); return nn(jt(m.createCaseClause(Ue, ut), V), me) } function ih() { let V = z(); gn(88), gn(58); let me = ee(3, of); return jt(m.createDefaultClause(me), V) } function Cv() { return j() === 82 ? ng() : ih() } function Iv() { let V = z(); gn(18); let me = ee(2, Cv); return gn(19), jt(m.createCaseBlock(me), V) } function Gl() { let V = z(), me = Te(); gn(107), gn(20); let Ue = at(Ml); gn(21); let ut = Iv(); return nn(jt(m.createSwitchStatement(Ue, ut), V), me) } function ah() { let V = z(), me = Te(); gn(109); let Ue = t.hasPrecedingLineBreak() ? void 0 : at(Ml); return Ue === void 0 && (zt++, Ue = jt(w(""), z())), qs() || kc(Ue), nn(jt(m.createThrowStatement(Ue), V), me) } function qc() { let V = z(), me = Te(); gn(111); let Ue = bm(!1), ut = j() === 83 ? xE() : void 0, Lt; return (!ut || j() === 96) && (gn(96, _.catch_or_finally_expected), Lt = bm(!1)), nn(jt(m.createTryStatement(Ue, ut, Lt), V), me) } function xE() { let V = z(); gn(83); let me; aa(20) ? (me = ly(), gn(21)) : me = void 0; let Ue = bm(!1); return jt(m.createCatchClause(me, Ue), V) } function oh() { let V = z(), me = Te(); return gn(87), Rs(), nn(jt(m.createDebuggerStatement(), V), me) } function zb() { let V = z(), me = Te(), Ue, ut = j() === 20, Lt = at(Ml); return Re(Lt) && aa(58) ? Ue = m.createLabeledStatement(Lt, of()) : (qs() || kc(Lt), Ue = le(Lt), ut && (me = !1)), nn(jt(Ue, V), me) } function Vu() { return Qe(), Su(j()) && !t.hasPrecedingLineBreak() } function Em() { return Qe(), j() === 84 && !t.hasPrecedingLineBreak() } function Jb() { return Qe(), j() === 98 && !t.hasPrecedingLineBreak() } function Lv() { return Qe(), (Su(j()) || j() === 8 || j() === 9 || j() === 10) && !t.hasPrecedingLineBreak() } function AE() { for (; ;)switch (j()) { case 113: case 119: case 85: case 98: case 84: case 92: return !0; case 118: case 154: return lC(); case 142: case 143: return Dx(); case 126: case 127: case 132: case 136: case 121: case 122: case 123: case 146: if (Qe(), t.hasPrecedingLineBreak()) return !1; continue; case 159: return Qe(), j() === 18 || j() === 79 || j() === 93; case 100: return Qe(), j() === 10 || j() === 41 || j() === 18 || Su(j()); case 93: let V = Qe(); if (V === 154 && (V = Nr(Qe)), V === 63 || V === 41 || V === 18 || V === 88 || V === 128 || V === 59) return !0; continue; case 124: Qe(); continue; default: return !1 } } function sy() { return Nr(AE) } function C1() { switch (j()) { case 59: case 26: case 18: case 113: case 119: case 98: case 84: case 92: case 99: case 90: case 115: case 97: case 86: case 81: case 105: case 116: case 107: case 109: case 111: case 87: case 83: case 96: return !0; case 100: return sy() || Nr(_E); case 85: case 93: return sy(); case 132: case 136: case 118: case 142: case 143: case 154: case 159: return !0; case 127: case 123: case 121: case 122: case 124: case 146: return sy() || !Nr(Vu); default: return C_() } } function kv() { return Qe(), Qr() || j() === 18 || j() === 22 } function rg() { return Nr(kv) } function of() { switch (j()) { case 26: return TE(); case 18: return bm(!1); case 113: return ig(z(), Te(), void 0); case 119: if (rg()) return ig(z(), Te(), void 0); break; case 98: return wv(z(), Te(), void 0); case 84: return k1(z(), Te(), void 0); case 99: return Hb(); case 90: return Wb(); case 115: return ep(); case 97: return rh(); case 86: return SE(248); case 81: return SE(249); case 105: return oy(); case 116: return uc(); case 107: return Gl(); case 109: return ah(); case 111: case 83: case 96: return qc(); case 87: return oh(); case 59: return Gd(); case 132: case 118: case 154: case 142: case 143: case 136: case 85: case 92: case 93: case 100: case 121: case 122: case 123: case 126: case 127: case 124: case 146: case 159: if (sy()) return Gd(); break }return zb() } function CE(V) { return V.kind === 136 } function Gd() { let V = z(), me = Te(), Ue = ls(!0); if (vt(Ue, CE)) { let Lt = sh(V); if (Lt) return Lt; for (let dn of Ue) dn.flags |= 16777216; return Se(16777216, () => Dv(V, me, Ue)) } else return Dv(V, me, Ue) } function sh(V) { return Se(16777216, () => { let me = At(Qt, V); if (me) return xt(me) }) } function Dv(V, me, Ue) { switch (j()) { case 113: case 119: case 85: return ig(V, me, Ue); case 98: return wv(V, me, Ue); case 84: return k1(V, me, Ue); case 118: return sg(V, me, Ue); case 154: return Ox(V, me, Ue); case 92: return E(V, me, Ue); case 159: case 142: case 143: return lr(V, me, Ue); case 100: return Ed(V, me, Ue); case 93: switch (Qe(), j()) { case 88: case 63: return Zo(V, me, Ue); case 128: return kl(V, me, Ue); default: return KP(V, me, Ue) }default: if (Ue) { let ut = yc(279, !0, _.Declaration_expected); return aL(ut, V), ut.modifiers = Ue, ut } return } } function Dx() { return Qe(), !t.hasPrecedingLineBreak() && (Wi() || j() === 10) } function No(V, me) { if (j() !== 18) { if (V & 4) { gv(); return } if (ss()) { Rs(); return } } return nd(V, me) } function fr() { let V = z(); if (j() === 27) return jt(m.createOmittedExpression(), V); let me = Co(25), Ue = cy(), ut = Yh(); return jt(m.createBindingElement(me, void 0, Ue, ut), V) } function vd() { let V = z(), me = Co(25), Ue = Qr(), ut = Yt(), Lt; Ue && j() !== 58 ? (Lt = ut, ut = void 0) : (gn(58), Lt = cy()); let dn = Yh(); return jt(m.createBindingElement(me, ut, Lt, dn), V) } function ju() { let V = z(); gn(18); let me = Dc(9, vd); return gn(19), jt(m.createObjectBindingPattern(me), V) } function I1() { let V = z(); gn(22); let me = Dc(10, fr); return gn(23), jt(m.createArrayBindingPattern(me), V) } function IE() { return j() === 18 || j() === 22 || j() === 80 || Qr() } function cy(V) { return j() === 22 ? I1() : j() === 18 ? ju() : se(V) } function wx() { return ly(!0) } function ly(V) { let me = z(), Ue = Te(), ut = cy(_.Private_identifiers_are_not_allowed_in_variable_declarations), Lt; V && ut.kind === 79 && j() === 53 && !t.hasPrecedingLineBreak() && (Lt = Pc()); let dn = th(), Er = b1(j()) ? void 0 : Yh(), ii = we(ut, Lt, dn, Er); return nn(jt(ii, me), Ue) } function wp(V) { let me = z(), Ue = 0; switch (j()) { case 113: break; case 119: Ue |= 1; break; case 85: Ue |= 2; break; default: L.fail() }Qe(); let ut; if (j() === 162 && Nr(tp)) ut = Zl(); else { let Lt = Kt(); vn(V), ut = Dc(8, V ? ly : wx), vn(Lt) } return jt(ke(ut, Ue), me) } function tp() { return Ws() && Qe() === 21 } function ig(V, me, Ue) { let ut = wp(!1); Rs(); let Lt = re(Ue, ut); return nn(jt(Lt, V), me) } function wv(V, me, Ue) { let ut = ae(), Lt = im(Ue); gn(98); let dn = Co(41), Er = Lt & 1024 ? Fl() : se(), ii = dn ? 1 : 0, li = Lt & 512 ? 2 : 0, di = T_(); Lt & 1 && dr(!0); let ma = $_(ii | li), is = S_(58, !1), ao = No(ii | li, _.or_expected); dr(ut); let Oo = m.createFunctionDeclaration(Ue, dn, Er, di, ma, is, ao); return nn(jt(Oo, V), me) } function ch() { if (j() === 135) return gn(135); if (j() === 10 && Nr(Qe) === 20) return Fo(() => { let V = oa(); return V.text === "constructor" ? V : void 0 }) } function Rp(V, me, Ue) { return Fo(() => { if (ch()) { let ut = T_(), Lt = $_(0), dn = S_(58, !1), Er = No(0, _.or_expected), ii = m.createConstructorDeclaration(Ue, Lt, Er); return ii.typeParameters = ut, ii.type = dn, nn(jt(ii, V), me) } }) } function L1(V, me, Ue, ut, Lt, dn, Er, ii) { let li = ut ? 1 : 0, di = vt(Ue, mL) ? 2 : 0, ma = T_(), is = $_(li | di), ao = S_(58, !1), Oo = No(li | di, ii), id = m.createMethodDeclaration(Ue, ut, Lt, dn, ma, is, ao, Oo); return id.exclamationToken = Er, nn(jt(id, V), me) } function Cc(V, me, Ue, ut, Lt) { let dn = !Lt && !t.hasPrecedingLineBreak() ? Co(53) : void 0, Er = th(), ii = Cr(45056, Yh); xc(ut, Er, ii); let li = m.createPropertyDeclaration(Ue, ut, Lt || dn, Er, ii); return nn(jt(li, V), me) } function Bd(V, me, Ue) { let ut = Co(41), Lt = Yt(), dn = Co(57); return ut || j() === 20 || j() === 29 ? L1(V, me, Ue, ut, Lt, dn, void 0, _.or_expected) : Cc(V, me, Ue, Lt, dn) } function Tm(V, me, Ue, ut, Lt) { let dn = Yt(), Er = T_(), ii = $_(0), li = S_(58, !1), di = No(Lt), ma = ut === 174 ? m.createGetAccessorDeclaration(Ue, dn, ii, li, di) : m.createSetAccessorDeclaration(Ue, dn, ii, di); return ma.typeParameters = Er, Sf(ma) && (ma.type = li), nn(jt(ma, V), me) } function rd() { let V; if (j() === 59) return !0; for (; Rg(j());) { if (V = j(), Gj(V)) return !0; Qe() } if (j() === 41 || (K() && (V = j(), Qe()), j() === 22)) return !0; if (V !== void 0) { if (!Xu(V) || V === 151 || V === 137) return !0; switch (j()) { case 20: case 29: case 53: case 58: case 63: case 57: return !0; default: return ss() } } return !1 } function LE(V, me, Ue) { Ll(124); let ut = uy(), Lt = nn(jt(m.createClassStaticBlockDeclaration(ut), V), me); return Lt.modifiers = Ue, Lt } function uy() { let V = kt(), me = ae(); Ht(!1), dr(!0); let Ue = bm(!1); return Ht(V), dr(me), Ue } function ag() { if (ae() && j() === 133) { let V = z(), me = ht(_.Expression_expected); Qe(); let Ue = af(V, me, !0); return Wn(V, Ue) } return Lp() } function Rx() { let V = z(); if (!aa(59)) return; let me = Q(ag); return jt(m.createDecorator(me), V) } function sf(V, me, Ue) { let ut = z(), Lt = j(); if (j() === 85 && me) { if (!Fo(Go)) return } else { if (Ue && j() === 124 && Nr(Ti)) return; if (V && j() === 124) return; if (!Hs()) return } return jt(P(Lt), ut) } function ls(V, me, Ue) { let ut = z(), Lt, dn, Er, ii = !1, li = !1, di = !1; if (V && j() === 59) for (; dn = Rx();)Lt = Sn(Lt, dn); for (; Er = sf(ii, me, Ue);)Er.kind === 124 && (ii = !0), Lt = Sn(Lt, Er), li = !0; if (li && V && j() === 59) for (; dn = Rx();)Lt = Sn(Lt, dn), di = !0; if (di) for (; Er = sf(ii, me, Ue);)Er.kind === 124 && (ii = !0), Lt = Sn(Lt, Er); return Lt && As(Lt, ut) } function kE() { let V; if (j() === 132) { let me = z(); Qe(); let Ue = jt(P(132), me); V = As([Ue], me) } return V } function DE() { let V = z(); if (j() === 26) return Qe(), jt(m.createSemicolonClassElement(), V); let me = Te(), Ue = ls(!0, !0, !0); if (j() === 124 && Nr(Ti)) return LE(V, me, Ue); if (ta(137)) return Tm(V, me, Ue, 174, 0); if (ta(151)) return Tm(V, me, Ue, 175, 0); if (j() === 135 || j() === 10) { let ut = Rp(V, me, Ue); if (ut) return ut } if (Ib()) return p1(V, me, Ue); if (Su(j()) || j() === 10 || j() === 8 || j() === 41 || j() === 22) if (vt(Ue, CE)) { for (let Lt of Ue) Lt.flags |= 16777216; return Se(16777216, () => Bd(V, me, Ue)) } else return Bd(V, me, Ue); if (Ue) { let ut = yc(79, !0, _.Declaration_expected); return Cc(V, me, Ue, ut, void 0) } return L.fail("Should not have attempted to parse class member declaration.") } function og() { let V = z(), me = Te(), Ue = ls(!0); if (j() === 84) return wE(V, me, Ue, 228); let ut = yc(279, !0, _.Expression_expected); return aL(ut, V), ut.modifiers = Ue, ut } function Rv() { return wE(z(), Te(), void 0, 228) } function k1(V, me, Ue) { return wE(V, me, Ue, 260) } function wE(V, me, Ue, ut) { let Lt = ae(); gn(84); let dn = RE(), Er = T_(); vt(Ue, c3) && dr(!0); let ii = NE(), li; gn(18) ? (li = dC(), gn(19)) : li = Zl(), dr(Lt); let di = ut === 260 ? m.createClassDeclaration(Ue, dn, Er, ii, li) : m.createClassExpression(Ue, dn, Er, ii, li); return nn(jt(di, V), me) } function RE() { return Qr() && !OE() ? yu(Qr()) : void 0 } function OE() { return j() === 117 && Nr(hd) } function NE() { if (lh()) return ee(22, PE) } function PE() { let V = z(), me = j(); L.assert(me === 94 || me === 117), Qe(); let Ue = Dc(7, dy); return jt(m.createHeritageClause(me, Ue), V) } function dy() { let V = z(), me = Lp(); if (me.kind === 230) return me; let Ue = bd(); return jt(m.createExpressionWithTypeArguments(me, Ue), V) } function bd() { return j() === 29 ? zf(20, Kc, 29, 31) : void 0 } function lh() { return j() === 94 || j() === 117 } function dC() { return ee(5, DE) } function sg(V, me, Ue) { gn(118); let ut = ht(), Lt = T_(), dn = NE(), Er = vv(), ii = m.createInterfaceDeclaration(Ue, ut, Lt, dn, Er); return nn(jt(ii, V), me) } function Ox(V, me, Ue) { gn(154); let ut = ht(), Lt = T_(); gn(63); let dn = j() === 139 && Fo(Zu) || Kc(); Rs(); let Er = m.createTypeAliasDeclaration(Ue, ut, Lt, dn); return nn(jt(Er, V), me) } function Nx() { let V = z(), me = Te(), Ue = Yt(), ut = at(Yh); return nn(jt(m.createEnumMember(Ue, ut), V), me) } function E(V, me, Ue) { gn(92); let ut = ht(), Lt; gn(18) ? (Lt = je(() => Dc(6, Nx)), gn(19)) : Lt = Zl(); let dn = m.createEnumDeclaration(Ue, ut, Lt); return nn(jt(dn, V), me) } function ne() { let V = z(), me; return gn(18) ? (me = ee(1, of), gn(19)) : me = Zl(), jt(m.createModuleBlock(me), V) } function Ee(V, me, Ue, ut) { let Lt = ut & 16, dn = ht(), Er = aa(24) ? Ee(z(), !1, void 0, 4 | Lt) : ne(), ii = m.createModuleDeclaration(Ue, dn, Er, ut); return nn(jt(ii, V), me) } function Wt(V, me, Ue) { let ut = 0, Lt; j() === 159 ? (Lt = ht(), ut |= 1024) : (Lt = oa(), Lt.text = Ql(Lt.text)); let dn; j() === 18 ? dn = ne() : Rs(); let Er = m.createModuleDeclaration(Ue, Lt, dn, ut); return nn(jt(Er, V), me) } function lr(V, me, Ue) { let ut = 0; if (j() === 159) return Wt(V, me, Ue); if (aa(143)) ut |= 16; else if (gn(142), j() === 10) return Wt(V, me, Ue); return Ee(V, me, Ue, ut) } function ci() { return j() === 147 && Nr(qr) } function qr() { return Qe() === 20 } function Ti() { return Qe() === 18 } function Wa() { return Qe() === 43 } function kl(V, me, Ue) { gn(128), gn(143); let ut = ht(); Rs(); let Lt = m.createNamespaceExportDeclaration(ut); return Lt.modifiers = Ue, nn(jt(Lt, V), me) } function Ed(V, me, Ue) { gn(100); let ut = t.getStartPos(), Lt; Wi() && (Lt = ht()); let dn = !1; if (j() !== 158 && Lt?.escapedText === "type" && (Wi() || Td()) && (dn = !0, Lt = Wi() ? ht() : void 0), Lt && !Ov()) return Nv(V, me, Ue, Lt, dn); let Er; (Lt || j() === 41 || j() === 18) && (Er = _y(Lt, ut, dn), gn(158)); let ii = cf(), li; j() === 130 && !t.hasPrecedingLineBreak() && (li = fy()), Rs(); let di = m.createImportDeclaration(Ue, Er, ii, li); return nn(jt(di, V), me) } function Ud() { let V = z(), me = Su(j()) ? wt() : St(10); gn(58); let Ue = ll(!0); return jt(m.createAssertEntry(me, Ue), V) } function fy(V) { let me = z(); V || gn(130); let Ue = t.getTokenPos(); if (gn(18)) { let ut = t.hasPrecedingLineBreak(), Lt = Dc(24, Ud, !0); if (!gn(19)) { let dn = Os(Ye); dn && dn.code === _._0_expected.code && Ao(dn, t2(Pe, Ue, 1, _.The_parser_expected_to_find_a_1_to_match_the_0_token_here, "{", "}")) } return jt(m.createAssertClause(Lt, ut), me) } else { let ut = As([], z(), void 0, !1); return jt(m.createAssertClause(ut, !1), me) } } function Td() { return j() === 41 || j() === 18 } function Ov() { return j() === 27 || j() === 158 } function Nv(V, me, Ue, ut, Lt) { gn(63); let dn = Xf(); Rs(); let Er = m.createImportEqualsDeclaration(Ue, Lt, ut, dn); return nn(jt(Er, V), me) } function _y(V, me, Ue) { let ut; return (!V || aa(27)) && (ut = j() === 41 ? Sm() : py(272)), jt(m.createImportClause(Ue, V, ut), me) } function Xf() { return ci() ? ME() : Io(!1) } function ME() { let V = z(); gn(147), gn(20); let me = cf(); return gn(21), jt(m.createExternalModuleReference(me), V) } function cf() { if (j() === 10) { let V = oa(); return V.text = Ql(V.text), V } else return Ml() } function Sm() { let V = z(); gn(41), gn(128); let me = ht(); return jt(m.createNamespaceImport(me), V) } function py(V) { let me = z(), Ue = V === 272 ? m.createNamedImports(zf(23, FE, 18, 19)) : m.createNamedExports(zf(23, If, 18, 19)); return jt(Ue, me) } function If() { let V = Te(); return nn(Pv(278), V) } function FE() { return Pv(273) } function Pv(V) { let me = z(), Ue = Xu(j()) && !Wi(), ut = t.getTokenPos(), Lt = t.getTextPos(), dn = !1, Er, ii = !0, li = wt(); if (li.escapedText === "type") if (j() === 128) { let is = wt(); if (j() === 128) { let ao = wt(); Su(j()) ? (dn = !0, Er = is, li = ma(), ii = !1) : (Er = li, li = ao, ii = !1) } else Su(j()) ? (Er = li, ii = !1, li = ma()) : (dn = !0, li = is) } else Su(j()) && (dn = !0, li = ma()); ii && j() === 128 && (Er = li, gn(128), li = ma()), V === 273 && Ue && Ke(ut, Lt, _.Identifier_expected); let di = V === 273 ? m.createImportSpecifier(dn, Er, li) : m.createExportSpecifier(dn, Er, li); return jt(di, me); function ma() { return Ue = Xu(j()) && !Wi(), ut = t.getTokenPos(), Lt = t.getTextPos(), wt() } } function Vc(V) { return jt(m.createNamespaceExport(wt()), V) } function KP(V, me, Ue) { let ut = ae(); dr(!0); let Lt, dn, Er, ii = aa(154), li = z(); aa(41) ? (aa(128) && (Lt = Vc(li)), gn(158), dn = cf()) : (Lt = py(276), (j() === 158 || j() === 10 && !t.hasPrecedingLineBreak()) && (gn(158), dn = cf())), dn && j() === 130 && !t.hasPrecedingLineBreak() && (Er = fy()), Rs(), dr(ut); let di = m.createExportDeclaration(Ue, ii, Lt, dn, Er); return nn(jt(di, V), me) } function Zo(V, me, Ue) { let ut = ae(); dr(!0); let Lt; aa(63) ? Lt = !0 : gn(88); let dn = ll(!0); Rs(), dr(ut); let Er = m.createExportAssignment(Ue, Lt, dn); return nn(jt(Er, V), me) } let Ro; (V => { V[V.SourceElements = 0] = "SourceElements", V[V.BlockStatements = 1] = "BlockStatements", V[V.SwitchClauses = 2] = "SwitchClauses", V[V.SwitchClauseStatements = 3] = "SwitchClauseStatements", V[V.TypeMembers = 4] = "TypeMembers", V[V.ClassMembers = 5] = "ClassMembers", V[V.EnumMembers = 6] = "EnumMembers", V[V.HeritageClauseElement = 7] = "HeritageClauseElement", V[V.VariableDeclarations = 8] = "VariableDeclarations", V[V.ObjectBindingElements = 9] = "ObjectBindingElements", V[V.ArrayBindingElements = 10] = "ArrayBindingElements", V[V.ArgumentExpressions = 11] = "ArgumentExpressions", V[V.ObjectLiteralMembers = 12] = "ObjectLiteralMembers", V[V.JsxAttributes = 13] = "JsxAttributes", V[V.JsxChildren = 14] = "JsxChildren", V[V.ArrayLiteralMembers = 15] = "ArrayLiteralMembers", V[V.Parameters = 16] = "Parameters", V[V.JSDocParameters = 17] = "JSDocParameters", V[V.RestProperties = 18] = "RestProperties", V[V.TypeParameters = 19] = "TypeParameters", V[V.TypeArguments = 20] = "TypeArguments", V[V.TupleElementTypes = 21] = "TupleElementTypes", V[V.HeritageClauses = 22] = "HeritageClauses", V[V.ImportOrExportSpecifiers = 23] = "ImportOrExportSpecifiers", V[V.AssertEntries = 24] = "AssertEntries", V[V.Count = 25] = "Count" })(Ro || (Ro = {})); let Px; (V => { V[V.False = 0] = "False", V[V.True = 1] = "True", V[V.Unknown = 2] = "Unknown" })(Px || (Px = {})); let Mx; (V => {
+                            function me(di, ma, is) { Pi("file.js", di, 99, void 0, 1), t.setText(di, ma, is), Rt = t.scan(); let ao = Ue(), Oo = hi("file.js", 99, 1, !1, [], P(1), 0, Ba), id = vS(Ye, Oo); return _t && (Oo.jsDocDiagnostics = vS(_t, Oo)), gr(), ao ? { jsDocTypeExpression: ao, diagnostics: id } : void 0 } V.parseJSDocTypeExpressionForTests = me; function Ue(di) { let ma = z(), is = (di ? aa : gn)(18), ao = Se(8388608, Mc); (!di || is) && hc(19); let Oo = m.createJSDocTypeExpression(ao); return Kn(Oo), jt(Oo, ma) } V.parseJSDocTypeExpression = Ue; function ut() { let di = z(), ma = aa(18), is = z(), ao = Io(!1); for (; j() === 80;)Ja(), Vt(), ao = jt(m.createJSDocMemberName(ao, ht()), is); ma && hc(19); let Oo = m.createJSDocNameReference(ao); return Kn(Oo), jt(Oo, di) } V.parseJSDocNameReference = ut; function Lt(di, ma, is) { Pi("", di, 99, void 0, 1); let ao = Se(8388608, () => li(ma, is)), id = vS(Ye, { languageVariant: 0, text: di }); return gr(), ao ? { jsDoc: ao, diagnostics: id } : void 0 } V.parseIsolatedJSDocComment = Lt; function dn(di, ma, is) { let ao = Rt, Oo = Ye.length, id = Gt, np = Se(8388608, () => li(ma, is)); return go(np, di), kn & 262144 && (_t || (_t = []), _t.push(...Ye)), Rt = ao, Ye.length = Oo, Gt = id, np } V.parseJSDocComment = dn; let Er; (di => { di[di.BeginningOfLine = 0] = "BeginningOfLine", di[di.SawAsterisk = 1] = "SawAsterisk", di[di.SavingComments = 2] = "SavingComments", di[di.SavingBackticks = 3] = "SavingBackticks" })(Er || (Er = {})); let ii; (di => { di[di.Property = 1] = "Property", di[di.Parameter = 2] = "Parameter", di[di.CallbackParameter = 4] = "CallbackParameter" })(ii || (ii = {})); function li(di = 0, ma) {
+                                let is = Ie, ao = ma === void 0 ? is.length : di + ma; if (ma = ao - di, L.assert(di >= 0), L.assert(di <= ao), L.assert(ao <= is.length), !cJ(is, di)) return; let Oo, id, np, Op, cg, Yf = [], my = []; return t.scanRange(di + 3, ma - 5, () => {
+                                    let yn = 1, Or, xr = di - (is.lastIndexOf(`
+`, di) + 1) + 4; function Wr(eo) { Or || (Or = xr), Yf.push(eo), xr += eo.length } for (Vt(); D1(5);); D1(4) && (yn = 0, xr = 0); e: for (; ;) { switch (j()) { case 59: yn === 0 || yn === 1 ? (GE(Yf), cg || (cg = z()), Fv(_C(xr)), yn = 0, Or = void 0) : Wr(t.getTokenText()); break; case 4: Yf.push(t.getTokenText()), yn = 0, xr = 0; break; case 41: let eo = t.getTokenText(); yn === 1 || yn === 2 ? (yn = 2, Wr(eo)) : (yn = 1, xr += eo.length); break; case 5: let _o = t.getTokenText(); yn === 2 ? Yf.push(_o) : Or !== void 0 && xr + _o.length > Or && Yf.push(_o.slice(Or - xr)), xr += _o.length; break; case 1: break e; case 18: yn = 2; let jd = t.getStartPos(), D_ = t.getTextPos() - 1, uh = jk(D_); if (uh) { Op || Fx(Yf), my.push(jt(m.createJSDocText(Yf.join("")), Op ?? di, jd)), my.push(uh), Yf = [], Op = t.getTextPos(); break } default: yn = 2, Wr(t.getTokenText()); break }Vt() } GE(Yf), my.length && Yf.length && my.push(jt(m.createJSDocText(Yf.join("")), Op ?? di, cg)), my.length && Oo && L.assertIsDefined(cg, "having parsed tags implies that the end of the comment span should be set"); let Ci = Oo && As(Oo, id, np); return jt(m.createJSDocComment(my.length ? As(my, di, cg) : Yf.length ? Yf.join("") : void 0, Ci), di, ao)
+                                }); function Fx(yn) {
+                                    for (; yn.length && (yn[0] === `
+`|| yn[0] === "\r");)yn.shift()
+                                } function GE(yn) { for (; yn.length && yn[yn.length - 1].trim() === "";)yn.pop() } function fC() { for (; ;) { if (Vt(), j() === 1) return !0; if (!(j() === 5 || j() === 4)) return !1 } } function k_() { if (!((j() === 5 || j() === 4) && Nr(fC))) for (; j() === 5 || j() === 4;)Vt() } function Mv() { if ((j() === 5 || j() === 4) && Nr(fC)) return ""; let yn = t.hasPrecedingLineBreak(), Or = !1, xr = ""; for (; yn && j() === 41 || j() === 5 || j() === 4;)xr += t.getTokenText(), j() === 4 ? (yn = !0, Or = !0, xr = "") : j() === 41 && (yn = !1), Vt(); return Or ? xr : "" } function _C(yn) { L.assert(j() === 59); let Or = t.getTokenPos(); Vt(); let xr = Uv(void 0), Wr = Mv(), Ci; switch (xr.escapedText) { case "author": Ci = Pt(Or, xr, yn, Wr); break; case "implements": Ci = Fi(Or, xr, yn, Wr); break; case "augments": case "extends": Ci = Da(Or, xr, yn, Wr); break; case "class": case "constructor": Ci = dg(Or, m.createJSDocClassTag, xr, yn, Wr); break; case "public": Ci = dg(Or, m.createJSDocPublicTag, xr, yn, Wr); break; case "private": Ci = dg(Or, m.createJSDocPrivateTag, xr, yn, Wr); break; case "protected": Ci = dg(Or, m.createJSDocProtectedTag, xr, yn, Wr); break; case "readonly": Ci = dg(Or, m.createJSDocReadonlyTag, xr, yn, Wr); break; case "override": Ci = dg(Or, m.createJSDocOverrideTag, xr, yn, Wr); break; case "deprecated": Dt = !0, Ci = dg(Or, m.createJSDocDeprecatedTag, xr, yn, Wr); break; case "this": Ci = wte(Or, xr, yn, Wr); break; case "enum": Ci = Rte(Or, xr, yn, Wr); break; case "arg": case "argument": case "param": return zk(Or, xr, 2, yn); case "return": case "returns": Ci = I(Or, xr, yn, Wr); break; case "template": Ci = yy(Or, xr, yn, Wr); break; case "type": Ci = N(Or, xr, yn, Wr); break; case "typedef": Ci = pC(Or, xr, yn, Wr); break; case "callback": Ci = zn(Or, xr, yn, Wr); break; case "overload": Ci = Gv(Or, xr, yn, Wr); break; case "satisfies": Ci = Vd(Or, xr, yn, Wr); break; case "see": Ci = te(Or, xr, yn, Wr); break; case "exception": case "throws": Ci = Me(Or, xr, yn, Wr); break; default: Ci = Zs(Or, xr, yn, Wr); break }return Ci } function lf(yn, Or, xr, Wr) { return Wr || (xr += Or - yn), Gx(xr, Wr.slice(xr)) } function Gx(yn, Or) { let xr = z(), Wr = [], Ci = [], eo, _o = 0, jd = !0, D_; function uh(dh) { D_ || (D_ = yn), Wr.push(dh), yn += dh.length } Or !== void 0 && (Or !== "" && uh(Or), _o = 1); let xm = j(); e: for (; ;) { switch (xm) { case 4: _o = 0, Wr.push(t.getTokenText()), yn = 0; break; case 59: if (_o === 3 || _o === 2 && (!jd || Nr(hy))) { Wr.push(t.getTokenText()); break } t.setTextPos(t.getTextPos() - 1); case 1: break e; case 5: if (_o === 2 || _o === 3) uh(t.getTokenText()); else { let Kb = t.getTokenText(); D_ !== void 0 && yn + Kb.length > D_ && Wr.push(Kb.slice(D_ - yn)), yn += Kb.length } break; case 18: _o = 2; let dh = t.getStartPos(), gC = t.getTextPos() - 1, vu = jk(gC); vu ? (Ci.push(jt(m.createJSDocText(Wr.join("")), eo ?? xr, dh)), Ci.push(vu), Wr = [], eo = t.getTextPos()) : uh(t.getTokenText()); break; case 61: _o === 3 ? _o = 2 : _o = 3, uh(t.getTokenText()); break; case 41: if (_o === 0) { _o = 1, yn += 1; break } default: _o !== 3 && (_o = 2), uh(t.getTokenText()); break }jd = j() === 5, xm = Vt() } if (Fx(Wr), GE(Wr), Ci.length) return Wr.length && Ci.push(jt(m.createJSDocText(Wr.join("")), eo ?? xr)), As(Ci, xr, t.getTextPos()); if (Wr.length) return Wr.join("") } function hy() { let yn = Vt(); return yn === 5 || yn === 4 } function jk(yn) { let Or = Fo(Hk); if (!Or) return; Vt(), k_(); let xr = z(), Wr = Su(j()) ? Io(!0) : void 0; if (Wr) for (; j() === 80;)Ja(), Vt(), Wr = jt(m.createJSDocMemberName(Wr, ht()), xr); let Ci = []; for (; j() !== 19 && j() !== 4 && j() !== 1;)Ci.push(t.getTokenText()), Vt(); let eo = Or === "link" ? m.createJSDocLink : Or === "linkcode" ? m.createJSDocLinkCode : m.createJSDocLinkPlain; return jt(eo(Wr, Ci.join("")), yn, t.getTextPos()) } function Hk() { if (Mv(), j() === 18 && Vt() === 59 && Su(Vt())) { let yn = t.getTokenValue(); if (oo(yn)) return yn } } function oo(yn) { return yn === "link" || yn === "linkcode" || yn === "linkplain" } function Zs(yn, Or, xr, Wr) { return jt(m.createJSDocUnknownTag(Or, lf(yn, z(), xr, Wr)), yn) } function Fv(yn) { yn && (Oo ? Oo.push(yn) : (Oo = [yn], id = yn.pos), np = yn.end) } function gy() { return Mv(), j() === 18 ? Ue() : void 0 } function Wk() { let yn = D1(22); yn && k_(); let Or = D1(61), xr = XP(); return Or && md(61), yn && (k_(), Co(63) && Ml(), gn(23)), { name: xr, isBracketed: yn } } function ad(yn) { switch (yn.kind) { case 149: return !0; case 185: return ad(yn.elementType); default: return m_(yn) && Re(yn.typeName) && yn.typeName.escapedText === "Object" && !yn.typeArguments } } function zk(yn, Or, xr, Wr) { let Ci = gy(), eo = !Ci; Mv(); let { name: _o, isBracketed: jd } = Wk(), D_ = Mv(); eo && !Nr(Hk) && (Ci = gy()); let uh = lf(yn, z(), Wr, D_), xm = xr !== 4 && y(Ci, _o, xr, Wr); xm && (Ci = xm, eo = !0); let dh = xr === 1 ? m.createJSDocPropertyTag(Or, _o, jd, Ci, eo, uh) : m.createJSDocParameterTag(Or, _o, jd, Ci, eo, uh); return jt(dh, yn) } function y(yn, Or, xr, Wr) { if (yn && ad(yn.type)) { let Ci = z(), eo, _o; for (; eo = Fo(() => BE(xr, Wr, Or));)(eo.kind === 344 || eo.kind === 351) && (_o = Sn(_o, eo)); if (_o) { let jd = jt(m.createJSDocTypeLiteral(_o, yn.type.kind === 185), Ci); return jt(m.createJSDocTypeExpression(jd), Ci) } } } function I(yn, Or, xr, Wr) { vt(Oo, y3) && Ke(Or.pos, t.getTokenPos(), _._0_tag_already_specified, Or.escapedText); let Ci = gy(); return jt(m.createJSDocReturnTag(Or, Ci, lf(yn, z(), xr, Wr)), yn) } function N(yn, Or, xr, Wr) { vt(Oo, DL) && Ke(Or.pos, t.getTokenPos(), _._0_tag_already_specified, Or.escapedText); let Ci = Ue(!0), eo = xr !== void 0 && Wr !== void 0 ? lf(yn, z(), xr, Wr) : void 0; return jt(m.createJSDocTypeTag(Or, Ci, eo), yn) } function te(yn, Or, xr, Wr) { let eo = j() === 22 || Nr(() => Vt() === 59 && Su(Vt()) && oo(t.getTokenValue())) ? void 0 : ut(), _o = xr !== void 0 && Wr !== void 0 ? lf(yn, z(), xr, Wr) : void 0; return jt(m.createJSDocSeeTag(Or, eo, _o), yn) } function Me(yn, Or, xr, Wr) { let Ci = gy(), eo = lf(yn, z(), xr, Wr); return jt(m.createJSDocThrowsTag(Or, Ci, eo), yn) } function Pt(yn, Or, xr, Wr) { let Ci = z(), eo = Tr(), _o = t.getStartPos(), jd = lf(yn, _o, xr, Wr); jd || (_o = t.getStartPos()); let D_ = typeof jd != "string" ? As(Qi([jt(eo, Ci, _o)], jd), Ci) : eo.text + jd; return jt(m.createJSDocAuthorTag(Or, D_), yn) } function Tr() { let yn = [], Or = !1, xr = t.getToken(); for (; xr !== 1 && xr !== 4;) { if (xr === 29) Or = !0; else { if (xr === 59 && !Or) break; if (xr === 31 && Or) { yn.push(t.getTokenText()), t.setTextPos(t.getTokenPos() + 1); break } } yn.push(t.getTokenText()), xr = Vt() } return m.createJSDocText(yn.join("")) } function Fi(yn, Or, xr, Wr) { let Ci = lg(); return jt(m.createJSDocImplementsTag(Or, Ci, lf(yn, z(), xr, Wr)), yn) } function Da(yn, Or, xr, Wr) { let Ci = lg(); return jt(m.createJSDocAugmentsTag(Or, Ci, lf(yn, z(), xr, Wr)), yn) } function Vd(yn, Or, xr, Wr) { let Ci = Ue(!1), eo = xr !== void 0 && Wr !== void 0 ? lf(yn, z(), xr, Wr) : void 0; return jt(m.createJSDocSatisfiesTag(Or, Ci, eo), yn) } function lg() { let yn = aa(18), Or = z(), xr = ug(), Wr = bd(), Ci = m.createExpressionWithTypeArguments(xr, Wr), eo = jt(Ci, Or); return yn && gn(19), eo } function ug() { let yn = z(), Or = Uv(); for (; aa(24);) { let xr = Uv(); Or = jt(q(Or, xr), yn) } return Or } function dg(yn, Or, xr, Wr, Ci) { return jt(Or(xr, lf(yn, z(), Wr, Ci)), yn) } function wte(yn, Or, xr, Wr) { let Ci = Ue(!0); return k_(), jt(m.createJSDocThisTag(Or, Ci, lf(yn, z(), xr, Wr)), yn) } function Rte(yn, Or, xr, Wr) { let Ci = Ue(!0); return k_(), jt(m.createJSDocEnumTag(Or, Ci, lf(yn, z(), xr, Wr)), yn) } function pC(yn, Or, xr, Wr) { var Ci; let eo = gy(); Mv(); let _o = Jk(); k_(); let jd = Gx(xr), D_; if (!eo || ad(eo.type)) { let xm, dh, gC, vu = !1; for (; xm = Fo(() => Bx(xr));)if (vu = !0, xm.kind === 347) if (dh) { let Kb = rt(_.A_JSDoc_typedef_comment_may_not_contain_multiple_type_tags); Kb && Ao(Kb, t2(Pe, 0, 0, _.The_tag_was_first_specified_here)); break } else dh = xm; else gC = Sn(gC, xm); if (vu) { let Kb = eo && eo.type.kind === 185, Kk = m.createJSDocTypeLiteral(gC, Kb); eo = dh && dh.typeExpression && !ad(dh.typeExpression.type) ? dh.typeExpression : jt(Kk, yn), D_ = eo.end } } D_ = D_ || jd !== void 0 ? z() : ((Ci = _o ?? eo) != null ? Ci : Or).end, jd || (jd = lf(yn, D_, xr, Wr)); let uh = m.createJSDocTypedefTag(Or, eo, _o, jd); return jt(uh, yn, D_) } function Jk(yn) { let Or = t.getTokenPos(); if (!Su(j())) return; let xr = Uv(); if (aa(24)) { let Wr = Jk(!0), Ci = m.createModuleDeclaration(void 0, xr, Wr, yn ? 4 : void 0); return jt(Ci, Or) } return yn && (xr.flags |= 2048), xr } function Ote(yn) { let Or = z(), xr, Wr; for (; xr = Fo(() => BE(4, yn));)Wr = Sn(Wr, xr); return As(Wr || [], Or) } function mC(yn, Or) { let xr = Ote(Or), Wr = Fo(() => { if (D1(59)) { let Ci = _C(Or); if (Ci && Ci.kind === 345) return Ci } }); return jt(m.createJSDocSignature(void 0, xr, Wr), yn) } function zn(yn, Or, xr, Wr) { let Ci = Jk(); k_(); let eo = Gx(xr), _o = mC(yn, xr); eo || (eo = lf(yn, z(), xr, Wr)); let jd = eo !== void 0 ? z() : _o.end; return jt(m.createJSDocCallbackTag(Or, _o, Ci, eo), yn, jd) } function Gv(yn, Or, xr, Wr) { k_(); let Ci = Gx(xr), eo = mC(yn, xr); Ci || (Ci = lf(yn, z(), xr, Wr)); let _o = Ci !== void 0 ? z() : eo.end; return jt(m.createJSDocOverloadTag(Or, eo, Ci), yn, _o) } function Bv(yn, Or) { for (; !Re(yn) || !Re(Or);)if (!Re(yn) && !Re(Or) && yn.right.escapedText === Or.right.escapedText) yn = yn.left, Or = Or.left; else return !1; return yn.escapedText === Or.escapedText } function Bx(yn) { return BE(1, yn) } function BE(yn, Or, xr) { let Wr = !0, Ci = !1; for (; ;)switch (Vt()) { case 59: if (Wr) { let eo = qP(yn, Or); return eo && (eo.kind === 344 || eo.kind === 351) && yn !== 4 && xr && (Re(eo.name) || !Bv(xr, eo.name.left)) ? !1 : eo } Ci = !1; break; case 4: Wr = !0, Ci = !1; break; case 41: Ci && (Wr = !1), Ci = !0; break; case 79: Wr = !1; break; case 1: return !1 } } function qP(yn, Or) { L.assert(j() === 59); let xr = t.getStartPos(); Vt(); let Wr = Uv(); k_(); let Ci; switch (Wr.escapedText) { case "type": return yn === 1 && N(xr, Wr); case "prop": case "property": Ci = 1; break; case "arg": case "argument": case "param": Ci = 6; break; default: return !1 }return yn & Ci ? zk(xr, Wr, yn, Or) : !1 } function hC() { let yn = z(), Or = D1(22); Or && k_(); let xr = Uv(_.Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces), Wr; if (Or && (k_(), gn(63), Wr = Se(8388608, Mc), gn(23)), !rc(xr)) return jt(m.createTypeParameterDeclaration(void 0, xr, void 0, Wr), yn) } function WG() { let yn = z(), Or = []; do { k_(); let xr = hC(); xr !== void 0 && Or.push(xr), Mv() } while (D1(27)); return As(Or, yn) } function yy(yn, Or, xr, Wr) { let Ci = j() === 18 ? Ue() : void 0, eo = WG(); return jt(m.createJSDocTemplateTag(Or, Ci, eo, lf(yn, z(), xr, Wr)), yn) } function D1(yn) { return j() === yn ? (Vt(), !0) : !1 } function XP() { let yn = Uv(); for (aa(22) && gn(23); aa(24);) { let Or = Uv(); aa(22) && gn(23), yn = Jf(yn, Or) } return yn } function Uv(yn) { if (!Su(j())) return yc(79, !yn, yn || _.Identifier_expected); zt++; let Or = t.getTokenPos(), xr = t.getTextPos(), Wr = j(), Ci = Ql(t.getTokenValue()), eo = jt(w(Ci, Wr), Or, xr); return Vt(), eo }
+                            }
+                        })(Mx = e.JSDocParser || (e.JSDocParser = {}))
+                    })(av || (av = {})), (e => { function t(x, A, w, C) { if (C = C || L.shouldAssert(2), m(x, A, w, C), Moe(w)) return x; if (x.statements.length === 0) return av.parseSourceFile(x.fileName, A, x.languageVersion, void 0, !0, x.scriptKind, x.setExternalModuleIndicator); let P = x; L.assert(!P.hasBeenIncrementallyParsed), P.hasBeenIncrementallyParsed = !0, av.fixupParentReferences(P); let F = x.text, B = v(x), q = d(x, w); m(x, A, q, C), L.assert(q.span.start <= w.span.start), L.assert(wl(q.span) === wl(w.span)), L.assert(wl(uI(q)) === wl(uI(w))); let W = uI(q).length - q.span.length; f(P, q.span.start, wl(q.span), wl(uI(q)), W, F, A, C); let Y = av.parseSourceFile(x.fileName, A, x.languageVersion, B, !0, x.scriptKind, x.setExternalModuleIndicator); return Y.commentDirectives = r(x.commentDirectives, Y.commentDirectives, q.span.start, wl(q.span), W, F, A, C), Y.impliedNodeFormat = x.impliedNodeFormat, Y } e.updateSourceFile = t; function r(x, A, w, C, P, F, B, q) { if (!x) return A; let W, Y = !1; for (let ie of x) { let { range: $, type: fe } = ie; if ($.end < w) W = Sn(W, ie); else if ($.pos > C) { R(); let Z = { range: { pos: $.pos + P, end: $.end + P }, type: fe }; W = Sn(W, Z), q && L.assert(F.substring($.pos, $.end) === B.substring(Z.range.pos, Z.range.end)) } } return R(), W; function R() { Y || (Y = !0, W ? A && W.push(...A) : W = A) } } function i(x, A, w, C, P, F) { A ? q(x) : B(x); return; function B(W) { let Y = ""; if (F && o(W) && (Y = C.substring(W.pos, W.end)), W._children && (W._children = void 0), om(W, W.pos + w, W.end + w), F && o(W) && L.assert(Y === P.substring(W.pos, W.end)), pa(W, B, q), Kd(W)) for (let R of W.jsDoc) B(R); l(W, F) } function q(W) { W._children = void 0, om(W, W.pos + w, W.end + w); for (let Y of W) B(Y) } } function o(x) { switch (x.kind) { case 10: case 8: case 79: return !0 }return !1 } function s(x, A, w, C, P) { L.assert(x.end >= A, "Adjusting an element that was entirely before the change range"), L.assert(x.pos <= w, "Adjusting an element that was entirely after the change range"), L.assert(x.pos <= x.end); let F = Math.min(x.pos, C), B = x.end >= w ? x.end + P : Math.min(x.end, C); L.assert(F <= B), x.parent && (L.assertGreaterThanOrEqual(F, x.parent.pos), L.assertLessThanOrEqual(B, x.parent.end)), om(x, F, B) } function l(x, A) { if (A) { let w = x.pos, C = P => { L.assert(P.pos >= w), w = P.end }; if (Kd(x)) for (let P of x.jsDoc) C(P); pa(x, C), L.assert(w <= x.end) } } function f(x, A, w, C, P, F, B, q) { W(x); return; function W(R) { if (L.assert(R.pos <= R.end), R.pos > w) { i(R, !1, P, F, B, q); return } let ie = R.end; if (ie >= A) { if (R.intersectsChange = !0, R._children = void 0, s(R, A, w, C, P), pa(R, W, Y), Kd(R)) for (let $ of R.jsDoc) W($); l(R, q); return } L.assert(ie < A) } function Y(R) { if (L.assert(R.pos <= R.end), R.pos > w) { i(R, !0, P, F, B, q); return } let ie = R.end; if (ie >= A) { R.intersectsChange = !0, R._children = void 0, s(R, A, w, C, P); for (let $ of R) W($); return } L.assert(ie < A) } } function d(x, A) { let C = A.span.start; for (let B = 0; C > 0 && B <= 1; B++) { let q = g(x, C); L.assert(q.pos <= C); let W = q.pos; C = Math.max(0, W - 1) } let P = Wc(C, wl(A.span)), F = A.newLength + (A.span.start - C); return Sw(P, F) } function g(x, A) { let w = x, C; if (pa(x, F), C) { let B = P(C); B.pos > w.pos && (w = B) } return w; function P(B) { for (; ;) { let q = yW(B); if (q) B = q; else return B } } function F(B) { if (!rc(B)) if (B.pos <= A) { if (B.pos >= w.pos && (w = B), A < B.end) return pa(B, F), !0; L.assert(B.end <= A), C = B } else return L.assert(B.pos > A), !0 } } function m(x, A, w, C) { let P = x.text; if (w && (L.assert(P.length - w.span.length + w.newLength === A.length), C || L.shouldAssert(3))) { let F = P.substr(0, w.span.start), B = A.substr(0, w.span.start); L.assert(F === B); let q = P.substring(wl(w.span), P.length), W = A.substring(wl(uI(w)), A.length); L.assert(q === W) } } function v(x) { let A = x.statements, w = 0; L.assert(w < A.length); let C = A[w], P = -1; return { currentNode(B) { return B !== P && (C && C.end === B && w < A.length - 1 && (w++, C = A[w]), (!C || C.pos !== B) && F(B)), P = B, L.assert(!C || C.pos === B), C } }; function F(B) { A = void 0, w = -1, C = void 0, pa(x, q, W); return; function q(Y) { return B >= Y.pos && B < Y.end ? (pa(Y, q, W), !0) : !1 } function W(Y) { if (B >= Y.pos && B < Y.end) for (let R = 0; R < Y.length; R++) { let ie = Y[R]; if (ie) { if (ie.pos === B) return A = Y, w = R, C = ie, !0; if (ie.pos < B && B < ie.end) return pa(ie, q, W), !0 } } return !1 } } } e.createSyntaxCursor = v; let S; (x => { x[x.Value = -1] = "Value" })(S || (S = {})) })(D3 || (D3 = {})), w3 = new Map, Wde = /^\/\/\/\s*<(\S+)\s.*?\/>/im, zde = /^\/\/\/?\s*@(\S+)\s*(.*)\s*$/im
+                }
+            }); function R3(e) { let t = new Map, r = new Map; return mn(e, i => { t.set(i.name.toLowerCase(), i), i.shortName && r.set(i.shortName, i.name) }), { optionsNameMap: t, shortOptionNames: r } } function w2() { return Efe || (Efe = R3(Fh)) } function pJ(e) { return Jde(e, ps) } function Jde(e, t) { let r = lo(e.type.keys()), i = (e.deprecatedKeys ? r.filter(o => !e.deprecatedKeys.has(o)) : r).map(o => `'${o}'`).join(", "); return t(_.Argument_for_0_option_must_be_Colon_1, `--${e.name}`, i) } function O3(e, t, r) { return mfe(e, v0(t || ""), r) } function Kde(e, t = "", r) { if (t = v0(t), na(t, "-")) return; if (e.type === "listOrElement" && !jl(t, ",")) return HT(e, t, r); if (t === "") return []; let i = t.split(","); switch (e.element.type) { case "number": return Zi(i, o => HT(e.element, parseInt(o), r)); case "string": return Zi(i, o => HT(e.element, o || "", r)); case "boolean": case "object": return L.fail(`List of ${e.element.type} is not yet supported.`); default: return Zi(i, o => O3(e.element, o, r)) } } function qde(e) { return e.name } function mJ(e, t, r, i) { var o; if ((o = t.alternateMode) != null && o.getOptionsNameMap().optionsNameMap.has(e.toLowerCase())) return r(t.alternateMode.diagnostic, e); let s = $C(e, t.optionDeclarations, qde); return s ? r(t.unknownDidYouMeanDiagnostic, i || e, s.name) : r(t.unknownOptionDiagnostic, i || e) } function hJ(e, t, r) { let i = {}, o, s = [], l = []; return f(t), { options: i, watchOptions: o, fileNames: s, errors: l }; function f(g) { let m = 0; for (; m < g.length;) { let v = g[m]; if (m++, v.charCodeAt(0) === 64) d(v.slice(1)); else if (v.charCodeAt(0) === 45) { let S = v.slice(v.charCodeAt(1) === 45 ? 2 : 1), x = yJ(e.getOptionsNameMap, S, !0); if (x) m = Xde(g, m, e, x, i, l); else { let A = yJ(KO.getOptionsNameMap, S, !0); A ? m = Xde(g, m, KO, A, o || (o = {}), l) : l.push(mJ(S, e, ps, v)) } } else s.push(v) } } function d(g) { let m = NO(g, r || (x => xl.readFile(x))); if (!Ta(m)) { l.push(m); return } let v = [], S = 0; for (; ;) { for (; S < m.length && m.charCodeAt(S) <= 32;)S++; if (S >= m.length) break; let x = S; if (m.charCodeAt(x) === 34) { for (S++; S < m.length && m.charCodeAt(S) !== 34;)S++; S < m.length ? (v.push(m.substring(x + 1, S)), S++) : l.push(ps(_.Unterminated_quoted_string_in_response_file_0, g)) } else { for (; m.charCodeAt(S) > 32;)S++; v.push(m.substring(x, S)) } } f(v) } } function Xde(e, t, r, i, o, s) { if (i.isTSConfigOnly) { let l = e[t]; l === "null" ? (o[i.name] = void 0, t++) : i.type === "boolean" ? l === "false" ? (o[i.name] = HT(i, !1, s), t++) : (l === "true" && t++, s.push(ps(_.Option_0_can_only_be_specified_in_tsconfig_json_file_or_set_to_false_or_null_on_command_line, i.name))) : (s.push(ps(_.Option_0_can_only_be_specified_in_tsconfig_json_file_or_set_to_null_on_command_line, i.name)), l && !na(l, "-") && t++) } else if (!e[t] && i.type !== "boolean" && s.push(ps(r.optionTypeMismatchDiagnostic, i.name, OL(i))), e[t] !== "null") switch (i.type) { case "number": o[i.name] = HT(i, parseInt(e[t]), s), t++; break; case "boolean": let l = e[t]; o[i.name] = HT(i, l !== "false", s), (l === "false" || l === "true") && t++; break; case "string": o[i.name] = HT(i, e[t] || "", s), t++; break; case "list": let f = Kde(i, e[t], s); o[i.name] = f || [], f && t++; break; case "listOrElement": L.fail("listOrElement not supported here"); break; default: o[i.name] = O3(i, e[t], s), t++; break } else o[i.name] = void 0, t++; return t } function $Oe(e, t) { return hJ(JO, e, t) } function gJ(e, t) { return yJ(w2, e, t) } function yJ(e, t, r = !1) { t = t.toLowerCase(); let { optionsNameMap: i, shortOptionNames: o } = e(); if (r) { let s = o.get(t); s !== void 0 && (t = s) } return i.get(t) } function Yde() { return Sfe || (Sfe = R3(j3)) } function QOe(e) { let { options: t, watchOptions: r, fileNames: i, errors: o } = hJ(Afe, e), s = t; return i.length === 0 && i.push("."), s.clean && s.force && o.push(ps(_.Options_0_and_1_cannot_be_combined, "clean", "force")), s.clean && s.verbose && o.push(ps(_.Options_0_and_1_cannot_be_combined, "clean", "verbose")), s.clean && s.watch && o.push(ps(_.Options_0_and_1_cannot_be_combined, "clean", "watch")), s.watch && s.dry && o.push(ps(_.Options_0_and_1_cannot_be_combined, "watch", "dry")), { buildOptions: s, watchOptions: r, projects: i, errors: o } } function ZOe(e, ...t) { return ps.apply(void 0, arguments).messageText } function RO(e, t, r, i, o, s) { let l = NO(e, g => r.readFile(g)); if (!Ta(l)) { r.onUnRecoverableConfigFileDiagnostic(l); return } let f = wO(e, l), d = r.getCurrentDirectory(); return f.path = Ts(e, d, Dl(r.useCaseSensitiveFileNames)), f.resolvedPath = f.path, f.originalFileName = f.fileName, MO(f, r, _a(ni(e), d), t, _a(e, d), void 0, s, i, o) } function OO(e, t) { let r = NO(e, t); return Ta(r) ? vJ(e, r) : { config: {}, error: r } } function vJ(e, t) { let r = wO(e, t); return { config: nfe(r, r.parseDiagnostics, !1, void 0), error: r.parseDiagnostics.length ? r.parseDiagnostics[0] : void 0 } } function $de(e, t) { let r = NO(e, t); return Ta(r) ? wO(e, r) : { fileName: e, parseDiagnostics: [r] } } function NO(e, t) { let r; try { r = t(e) } catch (i) { return ps(_.Cannot_read_file_0_Colon_1, e, i.message) } return r === void 0 ? ps(_.Cannot_read_file_0, e) : r } function N3(e) { return p0(e, qde) } function Qde() { return Cfe || (Cfe = R3(HO)) } function Zde() { return Ife || (Ife = N3(Fh)) } function efe() { return Lfe || (Lfe = N3(HO)) } function tfe() { return kfe || (kfe = N3(H3)) } function eNe() { return jJ === void 0 && (jJ = { name: void 0, type: "object", elementOptions: N3([{ name: "compilerOptions", type: "object", elementOptions: Zde(), extraKeyDiagnostics: JO }, { name: "watchOptions", type: "object", elementOptions: efe(), extraKeyDiagnostics: KO }, { name: "typeAcquisition", type: "object", elementOptions: tfe(), extraKeyDiagnostics: VJ }, qO, { name: "references", type: "list", element: { name: "references", type: "object" }, category: _.Projects }, { name: "files", type: "list", element: { name: "files", type: "string" }, category: _.File_Management }, { name: "include", type: "list", element: { name: "include", type: "string" }, category: _.File_Management, defaultValueDescription: _.if_files_is_specified_otherwise_Asterisk_Asterisk_Slash_Asterisk }, { name: "exclude", type: "list", element: { name: "exclude", type: "string" }, category: _.File_Management, defaultValueDescription: _.node_modules_bower_components_jspm_packages_plus_the_value_of_outDir_if_one_is_specified }, UO]) }), jJ } function nfe(e, t, r, i) { var o; let s = (o = e.statements[0]) == null ? void 0 : o.expression, l = r ? eNe() : void 0; if (s && s.kind !== 207) { if (t.push(Nu(e, s, _.The_root_value_of_a_0_file_must_be_an_object, Hl(e.fileName) === "jsconfig.json" ? "jsconfig.json" : "tsconfig.json")), fu(s)) { let f = wr(s.elements, rs); if (f) return PO(e, f, t, !0, l, i) } return {} } return PO(e, s, t, !0, l, i) } function rfe(e, t) { var r; return PO(e, (r = e.statements[0]) == null ? void 0 : r.expression, t, !0, void 0, void 0) } function PO(e, t, r, i, o, s) { if (!t) return i ? {} : void 0; return g(t, o); function l(v) { return o && o.elementOptions === v } function f(v, S, x, A) { let w = i ? {} : void 0; for (let C of v.properties) { if (C.kind !== 299) { r.push(Nu(e, C, _.Property_assignment_expected)); continue } C.questionToken && r.push(Nu(e, C.questionToken, _.The_0_modifier_can_only_be_used_in_TypeScript_files, "?")), m(C.name) || r.push(Nu(e, C.name, _.String_literal_with_double_quotes_expected)); let P = Vw(C.name) ? void 0 : wA(C.name), F = P && Gi(P), B = F && S ? S.get(F) : void 0; F && x && !B && (S ? r.push(mJ(F, x, (W, Y, R) => Nu(e, C.name, W, Y, R))) : r.push(Nu(e, C.name, x.unknownOptionDiagnostic, F))); let q = g(C.initializer, B); if (typeof F < "u" && (i && (w[F] = q), s && (A || l(S)))) { let W = P3(B, q); A ? W && s.onSetValidOptionKeyValueInParent(A, B, q) : l(S) && (W ? s.onSetValidOptionKeyValueInRoot(F, C.name, q, C.initializer) : B || s.onSetUnknownOptionKeyValueInRoot(F, C.name, q, C.initializer)) } } return w } function d(v, S) { if (!i) { v.forEach(x => g(x, S)); return } return Pr(v.map(x => g(x, S)), x => x !== void 0) } function g(v, S) { let x; switch (v.kind) { case 110: return w(S && S.type !== "boolean" && (S.type !== "listOrElement" || S.element.type !== "boolean")), A(!0); case 95: return w(S && S.type !== "boolean" && (S.type !== "listOrElement" || S.element.type !== "boolean")), A(!1); case 104: return w(S && S.name === "extends"), A(null); case 10: m(v) || r.push(Nu(e, v, _.String_literal_with_double_quotes_expected)), w(S && Ta(S.type) && S.type !== "string" && (S.type !== "listOrElement" || Ta(S.element.type) && S.element.type !== "string")); let C = v.text; if (S && L.assert(S.type !== "listOrElement" || S.element.type === "string", "Only string or array of string is handled for now"), S && !Ta(S.type)) { let F = S; F.type.has(C.toLowerCase()) || (r.push(Jde(F, (B, q, W) => Nu(e, v, B, q, W))), x = !0) } return A(C); case 8: return w(S && S.type !== "number" && (S.type !== "listOrElement" || S.element.type !== "number")), A(Number(v.text)); case 221: if (v.operator !== 40 || v.operand.kind !== 8) break; return w(S && S.type !== "number" && (S.type !== "listOrElement" || S.element.type !== "number")), A(-Number(v.operand.text)); case 207: w(S && S.type !== "object" && (S.type !== "listOrElement" || S.element.type !== "object")); let P = v; if (S) { let { elementOptions: F, extraKeyDiagnostics: B, name: q } = S; return A(f(P, F, B, q)) } else return A(f(P, void 0, void 0, void 0)); case 206: return w(S && S.type !== "list" && S.type !== "listOrElement"), A(d(v.elements, S && S.element)) }S ? w(!0) : r.push(Nu(e, v, _.Property_value_can_only_be_string_literal_numeric_literal_true_false_null_object_literal_or_array_literal)); return; function A(C) { var P; if (!x) { let F = (P = S?.extraValidation) == null ? void 0 : P.call(S, C); if (F) { r.push(Nu(e, v, ...F)); return } } return C } function w(C) { C && (r.push(Nu(e, v, _.Compiler_option_0_requires_a_value_of_type_1, S.name, OL(S))), x = !0) } } function m(v) { return yo(v) && V6(v, e) } } function OL(e) { return e.type === "listOrElement" ? `${OL(e.element)} or Array` : e.type === "list" ? "Array" : Ta(e.type) ? e.type : "string" } function P3(e, t) { if (e) { if (R2(t)) return !0; if (e.type === "list") return ba(t); if (e.type === "listOrElement") return ba(t) || P3(e.element, t); let r = Ta(e.type) ? e.type : "string"; return typeof t === r } return !1 } function tNe(e, t, r) { var i, o, s; let l = Dl(r.useCaseSensitiveFileNames), f = on(Pr(e.fileNames, (o = (i = e.options.configFile) == null ? void 0 : i.configFileSpecs) != null && o.validatedIncludeSpecs ? rNe(t, e.options.configFile.configFileSpecs.validatedIncludeSpecs, e.options.configFile.configFileSpecs.validatedExcludeSpecs, r) : h0), v => _w(_a(t, r.getCurrentDirectory()), _a(v, r.getCurrentDirectory()), l)), d = TJ(e.options, { configFilePath: _a(t, r.getCurrentDirectory()), useCaseSensitiveFileNames: r.useCaseSensitiveFileNames }), g = e.watchOptions && iNe(e.watchOptions); return { compilerOptions: { ...bJ(d), showConfig: void 0, configFile: void 0, configFilePath: void 0, help: void 0, init: void 0, listFiles: void 0, listEmittedFiles: void 0, project: void 0, build: void 0, version: void 0 }, watchOptions: g && bJ(g), references: on(e.projectReferences, v => ({ ...v, path: v.originalPath ? v.originalPath : "", originalPath: void 0 })), files: Fn(f) ? f : void 0, ...(s = e.options.configFile) != null && s.configFileSpecs ? { include: nNe(e.options.configFile.configFileSpecs.validatedIncludeSpecs), exclude: e.options.configFile.configFileSpecs.validatedExcludeSpecs } : {}, compileOnSave: e.compileOnSave ? !0 : void 0 } } function bJ(e) { return { ...lo(e.entries()).reduce((t, r) => ({ ...t, [r[0]]: r[1] }), {}) } } function nNe(e) { if (Fn(e)) { if (Fn(e) !== 1) return e; if (e[0] !== z3) return e } } function rNe(e, t, r, i) { if (!t) return h0; let o = tL(e, r, t, i.useCaseSensitiveFileNames, i.getCurrentDirectory()), s = o.excludePattern && Qy(o.excludePattern, i.useCaseSensitiveFileNames), l = o.includeFilePattern && Qy(o.includeFilePattern, i.useCaseSensitiveFileNames); return l ? s ? f => !(l.test(f) && !s.test(f)) : f => !l.test(f) : s ? f => s.test(f) : h0 } function ife(e) { switch (e.type) { case "string": case "number": case "boolean": case "object": return; case "list": case "listOrElement": return ife(e.element); default: return e.type } } function EJ(e, t) { return Ld(t, (r, i) => { if (r === e) return i }) } function TJ(e, t) { return afe(e, w2(), t) } function iNe(e) { return afe(e, Qde()) } function afe(e, { optionsNameMap: t }, r) { let i = new Map, o = r && Dl(r.useCaseSensitiveFileNames); for (let s in e) if (fs(e, s)) { if (t.has(s) && (t.get(s).category === _.Command_line_Options || t.get(s).category === _.Output_Formatting)) continue; let l = e[s], f = t.get(s.toLowerCase()); if (f) { L.assert(f.type !== "listOrElement"); let d = ife(f); d ? f.type === "list" ? i.set(s, l.map(g => EJ(g, d))) : i.set(s, EJ(l, d)) : r && f.isFilePath ? i.set(s, _w(r.configFilePath, _a(l, ni(r.configFilePath)), o)) : i.set(s, l) } } return i } function aNe(e, t) { let r = ofe(e); return o(); function i(s) { return Array(s + 1).join(" ") } function o() { let s = [], l = i(2); return B3.forEach(f => { if (!r.has(f.name)) return; let d = r.get(f.name), g = wJ(f); d !== g ? s.push(`${l}${f.name}: ${d}`) : fs(W3, f.name) && s.push(`${l}${f.name}: ${g}`) }), s.join(t) + t } } function ofe(e) { let t = d8(e, W3); return TJ(t) } function oNe(e, t, r) { let i = ofe(e); return l(); function o(f) { return Array(f + 1).join(" ") } function s({ category: f, name: d, isCommandLineOnly: g }) { let m = [_.Command_line_Options, _.Editor_Support, _.Compiler_Diagnostics, _.Backwards_Compatibility, _.Watch_and_Build_Modes, _.Output_Formatting]; return !g && f !== void 0 && (!m.includes(f) || i.has(d)) } function l() { let f = new Map; f.set(_.Projects, []), f.set(_.Language_and_Environment, []), f.set(_.Modules, []), f.set(_.JavaScript_Support, []), f.set(_.Emit, []), f.set(_.Interop_Constraints, []), f.set(_.Type_Checking, []), f.set(_.Completeness, []); for (let x of Fh) if (s(x)) { let A = f.get(x.category); A || f.set(x.category, A = []), A.push(x) } let d = 0, g = 0, m = []; f.forEach((x, A) => { m.length !== 0 && m.push({ value: "" }), m.push({ value: `/* ${uo(A)} */` }); for (let w of x) { let C; i.has(w.name) ? C = `"${w.name}": ${JSON.stringify(i.get(w.name))}${(g += 1) === i.size ? "" : ","}` : C = `// "${w.name}": ${JSON.stringify(wJ(w))},`, m.push({ value: C, description: `/* ${w.description && uo(w.description) || w.name} */` }), d = Math.max(C.length, d) } }); let v = o(2), S = []; S.push("{"), S.push(`${v}"compilerOptions": {`), S.push(`${v}${v}/* ${uo(_.Visit_https_Colon_Slash_Slashaka_ms_Slashtsconfig_to_read_more_about_this_file)} */`), S.push(""); for (let x of m) { let { value: A, description: w = "" } = x; S.push(A && `${v}${v}${A}${w && o(d - A.length + 2) + w}`) } if (t.length) { S.push(`${v}},`), S.push(`${v}"files": [`); for (let x = 0; x < t.length; x++)S.push(`${v}${v}${JSON.stringify(t[x])}${x === t.length - 1 ? "" : ","}`); S.push(`${v}]`) } else S.push(`${v}}`); return S.push("}"), S.join(r) + r } } function SJ(e, t) { let r = {}, i = w2().optionsNameMap; for (let o in e) fs(e, o) && (r[o] = sNe(i.get(o.toLowerCase()), e[o], t)); return r.configFilePath && (r.configFilePath = t(r.configFilePath)), r } function sNe(e, t, r) { if (e && !R2(t)) { if (e.type === "list") { let i = t; if (e.element.isFilePath && i.length) return i.map(r) } else if (e.isFilePath) return r(t); L.assert(e.type !== "listOrElement") } return t } function cNe(e, t, r, i, o, s, l, f, d) { return sfe(e, void 0, t, r, i, d, o, s, l, f) } function MO(e, t, r, i, o, s, l, f, d) { var g, m; (g = ai) == null || g.push(ai.Phase.Parse, "parseJsonSourceFileConfigFileContent", { path: e.fileName }); let v = sfe(void 0, e, t, r, i, d, o, s, l, f); return (m = ai) == null || m.pop(), v } function xJ(e, t) { t && Object.defineProperty(e, "configFile", { enumerable: !1, writable: !1, value: t }) } function R2(e) { return e == null } function AJ(e, t) { return ni(_a(e, t)) } function sfe(e, t, r, i, o = {}, s, l, f = [], d = [], g) { L.assert(e === void 0 && t !== void 0 || e !== void 0 && t === void 0); let m = [], v = ufe(e, t, r, i, l, f, m, g), { raw: S } = v, x = d8(o, v.options || {}), A = s && v.watchOptions ? d8(s, v.watchOptions) : v.watchOptions || s; x.configFilePath = l && Al(l); let w = P(); t && (t.configFileSpecs = w), xJ(x, t); let C = So(l ? AJ(l, i) : i); return { options: x, watchOptions: A, fileNames: F(C), projectReferences: B(C), typeAcquisition: v.typeAcquisition || F3(), raw: S, errors: m, wildcardDirectories: yNe(w, C, r.useCaseSensitiveFileNames), compileOnSave: !!S.compileOnSave }; function P() { let ie = Y("references", ge => typeof ge == "object", "object"), $ = q(W("files")); if ($) { let ge = ie === "no-prop" || ba(ie) && ie.length === 0, X = fs(S, "extends"); if ($.length === 0 && ge && !X) if (t) { let Ve = l || "tsconfig.json", we = _.The_files_list_in_config_file_0_is_empty, ke = ks(Hw(t, "files"), Ce => Ce.initializer), Pe = ke ? Nu(t, ke, we, Ve) : ps(we, Ve); m.push(Pe) } else R(_.The_files_list_in_config_file_0_is_empty, l || "tsconfig.json") } let fe = q(W("include")), Z = W("exclude"), U = !1, re = q(Z); if (Z === "no-prop" && S.compilerOptions) { let ge = S.compilerOptions.outDir, X = S.compilerOptions.declarationDir; (ge || X) && (re = [ge, X].filter(Ve => !!Ve)) } $ === void 0 && fe === void 0 && (fe = [z3], U = !0); let le, _e; return fe && (le = bfe(fe, m, !0, t, "include")), re && (_e = bfe(re, m, !1, t, "exclude")), { filesSpecs: $, includeSpecs: fe, excludeSpecs: re, validatedFilesSpec: Pr($, Ta), validatedIncludeSpecs: le, validatedExcludeSpecs: _e, pathPatterns: void 0, isDefaultIncludeSpec: U } } function F(ie) { let $ = BO(w, ie, x, r, d); return lfe($, FO(S), f) && m.push(cfe(w, l)), $ } function B(ie) { let $, fe = Y("references", Z => typeof Z == "object", "object"); if (ba(fe)) for (let Z of fe) typeof Z.path != "string" ? R(_.Compiler_option_0_requires_a_value_of_type_1, "reference.path", "string") : ($ || ($ = [])).push({ path: _a(Z.path, ie), originalPath: Z.path, prepend: Z.prepend, circular: Z.circular }); return $ } function q(ie) { return ba(ie) ? ie : void 0 } function W(ie) { return Y(ie, Ta, "string") } function Y(ie, $, fe) { if (fs(S, ie) && !R2(S[ie])) if (ba(S[ie])) { let Z = S[ie]; return !t && !Ji(Z, $) && m.push(ps(_.Compiler_option_0_requires_a_value_of_type_1, ie, fe)), Z } else return R(_.Compiler_option_0_requires_a_value_of_type_1, ie, "Array"), "not-array"; return "no-prop" } function R(ie, $, fe) { t || m.push(ps(ie, $, fe)) } } function lNe(e) { return e.code === _.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2.code } function cfe({ includeSpecs: e, excludeSpecs: t }, r) { return ps(_.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2, r || "tsconfig.json", JSON.stringify(e || []), JSON.stringify(t || [])) } function lfe(e, t, r) { return e.length === 0 && t && (!r || r.length === 0) } function FO(e) { return !fs(e, "files") && !fs(e, "references") } function CJ(e, t, r, i, o) { let s = i.length; return lfe(e, o) ? i.push(cfe(r, t)) : wU(i, l => !lNe(l)), s !== i.length } function uNe(e) { return !!e.options } function ufe(e, t, r, i, o, s, l, f) { var d; i = Al(i); let g = _a(o || "", i); if (s.indexOf(g) >= 0) return l.push(ps(_.Circularity_detected_while_resolving_configuration_Colon_0, [...s, g].join(" -> "))), { raw: e || rfe(t, l) }; let m = e ? dNe(e, r, i, o, l) : fNe(t, r, i, o, l); if ((d = m.options) != null && d.paths && (m.options.pathsBasePath = i), m.extendedConfigPath) { s = s.concat([g]); let S = { options: {} }; Ta(m.extendedConfigPath) ? v(S, m.extendedConfigPath) : m.extendedConfigPath.forEach(x => v(S, x)), !m.raw.include && S.include && (m.raw.include = S.include), !m.raw.exclude && S.exclude && (m.raw.exclude = S.exclude), !m.raw.files && S.files && (m.raw.files = S.files), m.raw.compileOnSave === void 0 && S.compileOnSave && (m.raw.compileOnSave = S.compileOnSave), t && S.extendedSourceFiles && (t.extendedSourceFiles = lo(S.extendedSourceFiles.keys())), m.options = JD(S.options, m.options), m.watchOptions = m.watchOptions && S.watchOptions ? JD(S.watchOptions, m.watchOptions) : m.watchOptions || S.watchOptions } return m; function v(S, x) { let A = _Ne(t, x, r, s, l, f, S); if (A && uNe(A)) { let w = A.raw, C, P = F => { w[F] && (S[F] = on(w[F], B => qp(B) ? B : vi(C || (C = rI(ni(x), i, Dl(r.useCaseSensitiveFileNames))), B))) }; P("include"), P("exclude"), P("files"), w.compileOnSave !== void 0 && (S.compileOnSave = w.compileOnSave), JD(S.options, A.options), S.watchOptions = S.watchOptions && A.watchOptions ? JD({}, S.watchOptions, A.watchOptions) : S.watchOptions || A.watchOptions } } } function dNe(e, t, r, i, o) { fs(e, "excludes") && o.push(ps(_.Unknown_option_excludes_Did_you_mean_exclude)); let s = ffe(e.compilerOptions, r, o, i), l = _fe(e.typeAcquisition, r, o, i), f = gNe(e.watchOptions, r, o); e.compileOnSave = pNe(e, r, o); let d; if (e.extends || e.extends === "") if (!P3(qO, e.extends)) o.push(ps(_.Compiler_option_0_requires_a_value_of_type_1, "extends", OL(qO))); else { let g = i ? AJ(i, r) : r; if (Ta(e.extends)) d = M3(e.extends, t, g, o, ps); else { d = []; for (let m of e.extends) Ta(m) ? d = Sn(d, M3(m, t, g, o, ps)) : o.push(ps(_.Compiler_option_0_requires_a_value_of_type_1, "extends", OL(qO.element))) } } return { raw: e, options: s, watchOptions: f, typeAcquisition: l, extendedConfigPath: d } } function fNe(e, t, r, i, o) { let s = dfe(i), l, f, d, g, v = nfe(e, o, !0, { onSetValidOptionKeyValueInParent(S, x, A) { let w; switch (S) { case "compilerOptions": w = s; break; case "watchOptions": w = f || (f = {}); break; case "typeAcquisition": w = l || (l = F3(i)); break; default: L.fail("Unknown option") }w[x.name] = LJ(x, r, A) }, onSetValidOptionKeyValueInRoot(S, x, A, w) { switch (S) { case "extends": let C = i ? AJ(i, r) : r; if (Ta(A)) d = M3(A, t, C, o, (P, F) => Nu(e, w, P, F)); else { d = []; for (let P = 0; P < A.length; P++) { let F = A[P]; Ta(F) && (d = Sn(d, M3(F, t, C, o, (B, q) => Nu(e, w.elements[P], B, q)))) } } return } }, onSetUnknownOptionKeyValueInRoot(S, x, A, w) { S === "excludes" && o.push(Nu(e, x, _.Unknown_option_excludes_Did_you_mean_exclude)), wr(B3, C => C.name === S) && (g = Sn(g, x)) } }); return l || (l = F3(i)), g && v && v.compilerOptions === void 0 && o.push(Nu(e, g[0], _._0_should_be_set_inside_the_compilerOptions_object_of_the_config_json_file, wA(g[0]))), { raw: v, options: s, watchOptions: f, typeAcquisition: l, extendedConfigPath: d } } function M3(e, t, r, i, o) { if (e = Al(e), qp(e) || na(e, "./") || na(e, "../")) { let l = _a(e, r); if (!t.fileExists(l) && !Oc(l, ".json") && (l = `${l}.json`, !t.fileExists(l))) { i.push(o(_.File_0_not_found, e)); return } return l } let s = Jfe(e, vi(r, "tsconfig.json"), t); if (s.resolvedModule) return s.resolvedModule.resolvedFileName; e === "" ? i.push(o(_.Compiler_option_0_cannot_be_given_an_empty_string, "extends")) : i.push(o(_.File_0_not_found, e)) } function _Ne(e, t, r, i, o, s, l) { var f; let d = r.useCaseSensitiveFileNames ? t : n_(t), g, m, v; if (s && (g = s.get(d)) ? { extendedResult: m, extendedConfig: v } = g : (m = $de(t, S => r.readFile(S)), m.parseDiagnostics.length || (v = ufe(void 0, m, r, ni(t), Hl(t), i, o, s)), s && s.set(d, { extendedResult: m, extendedConfig: v })), e && (((f = l.extendedSourceFiles) != null ? f : l.extendedSourceFiles = new Set).add(m.fileName), m.extendedSourceFiles)) for (let S of m.extendedSourceFiles) l.extendedSourceFiles.add(S); if (m.parseDiagnostics.length) { o.push(...m.parseDiagnostics); return } return v } function pNe(e, t, r) { if (!fs(e, UO.name)) return !1; let i = GO(UO, e.compileOnSave, t, r); return typeof i == "boolean" && i } function mNe(e, t, r) { let i = []; return { options: ffe(e, t, i, r), errors: i } } function hNe(e, t, r) { let i = []; return { options: _fe(e, t, i, r), errors: i } } function dfe(e) { return e && Hl(e) === "jsconfig.json" ? { allowJs: !0, maxNodeModuleJsDepth: 2, allowSyntheticDefaultImports: !0, skipLibCheck: !0, noEmit: !0 } : {} } function ffe(e, t, r, i) { let o = dfe(i); return IJ(Zde(), e, t, o, JO, r), i && (o.configFilePath = Al(i)), o } function F3(e) { return { enable: !!e && Hl(e) === "jsconfig.json", include: [], exclude: [] } } function _fe(e, t, r, i) { let o = F3(i); return IJ(tfe(), e, t, o, VJ, r), o } function gNe(e, t, r) { return IJ(efe(), e, t, void 0, KO, r) } function IJ(e, t, r, i, o, s) { if (t) { for (let l in t) { let f = e.get(l); f ? (i || (i = {}))[f.name] = GO(f, t[l], r, s) : s.push(mJ(l, o, ps)) } return i } } function GO(e, t, r, i) { if (P3(e, t)) { let o = e.type; if (o === "list" && ba(t)) return hfe(e, t, r, i); if (o === "listOrElement") return ba(t) ? hfe(e, t, r, i) : GO(e.element, t, r, i); if (!Ta(e.type)) return mfe(e, t, i); let s = HT(e, t, i); return R2(s) ? s : pfe(e, r, s) } else i.push(ps(_.Compiler_option_0_requires_a_value_of_type_1, e.name, OL(e))) } function LJ(e, t, r) { if (!R2(r)) { if (e.type === "listOrElement" && !ba(r)) return LJ(e.element, t, r); if (e.type === "list" || e.type === "listOrElement") { let i = e; return i.element.isFilePath || !Ta(i.element.type) ? Pr(on(r, o => LJ(i.element, t, o)), o => i.listPreserveFalsyValues ? !0 : !!o) : r } else if (!Ta(e.type)) return e.type.get(Ta(r) ? r.toLowerCase() : r); return pfe(e, t, r) } } function pfe(e, t, r) { return e.isFilePath && (r = _a(r, t), r === "" && (r = ".")), r } function HT(e, t, r) { var i; if (R2(t)) return; let o = (i = e.extraValidation) == null ? void 0 : i.call(e, t); if (!o) return t; r.push(ps(...o)) } function mfe(e, t, r) { if (R2(t)) return; let i = t.toLowerCase(), o = e.type.get(i); if (o !== void 0) return HT(e, o, r); r.push(pJ(e)) } function hfe(e, t, r, i) { return Pr(on(t, o => GO(e.element, o, r, i)), o => e.listPreserveFalsyValues ? !0 : !!o) } function BO(e, t, r, i, o = Je) { t = So(t); let s = Dl(i.useCaseSensitiveFileNames), l = new Map, f = new Map, d = new Map, { validatedFilesSpec: g, validatedIncludeSpecs: m, validatedExcludeSpecs: v } = e, S = nL(r, o), x = FR(r, S); if (g) for (let P of g) { let F = _a(P, t); l.set(s(F), F) } let A; if (m && m.length > 0) for (let P of i.readDirectory(t, t_(x), v, m, void 0)) { if (Gc(P, ".json")) { if (!A) { let q = m.filter(Y => Oc(Y, ".json")), W = on(m4(q, t, "files"), Y => `^${Y}$`); A = W ? W.map(Y => Qy(Y, i.useCaseSensitiveFileNames)) : Je } if (Yc(A, q => q.test(P)) !== -1) { let q = s(P); !l.has(q) && !d.has(q) && d.set(q, P) } continue } if (bNe(P, l, f, S, s)) continue; ENe(P, f, S, s); let F = s(P); !l.has(F) && !f.has(F) && f.set(F, P) } let w = lo(l.values()), C = lo(f.values()); return w.concat(C, lo(d.values())) } function gfe(e, t, r, i, o) { let { validatedFilesSpec: s, validatedIncludeSpecs: l, validatedExcludeSpecs: f } = t; if (!Fn(l) || !Fn(f)) return !1; r = So(r); let d = Dl(i); if (s) { for (let g of s) if (d(_a(g, r)) === e) return !1 } return vfe(e, f, i, o, r) } function yfe(e) { let t = na(e, "**/") ? 0 : e.indexOf("/**/"); return t === -1 ? !1 : (Oc(e, "/..") ? e.length : e.lastIndexOf("/../")) > t } function G3(e, t, r, i) { return vfe(e, Pr(t, o => !yfe(o)), r, i) } function vfe(e, t, r, i, o) { let s = eL(t, vi(So(i), o), "exclude"), l = s && Qy(s, r); return l ? l.test(e) ? !0 : !gA(e) && l.test(cu(e)) : !1 } function bfe(e, t, r, i, o) { return e.filter(l => { if (!Ta(l)) return !1; let f = kJ(l, r); return f !== void 0 && t.push(s(...f)), f === void 0 }); function s(l, f) { let d = w6(i, o, f); return d ? Nu(i, d, l, f) : ps(l, f) } } function kJ(e, t) { if (L.assert(typeof e == "string"), t && Dfe.test(e)) return [_.File_specification_cannot_end_in_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0, e]; if (yfe(e)) return [_.File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0, e] } function yNe({ validatedIncludeSpecs: e, validatedExcludeSpecs: t }, r, i) { let o = eL(t, r, "exclude"), s = o && new RegExp(o, i ? "" : "i"), l = {}; if (e !== void 0) { let f = []; for (let d of e) { let g = So(vi(r, d)); if (s && s.test(g)) continue; let m = vNe(g, i); if (m) { let { key: v, flags: S } = m, x = l[v]; (x === void 0 || x < S) && (l[v] = S, S === 1 && f.push(v)) } } for (let d in l) if (fs(l, d)) for (let g of f) d !== g && Gy(g, d, r, !i) && delete l[d] } return l } function vNe(e, t) { let r = wfe.exec(e); if (r) { let i = e.indexOf("?"), o = e.indexOf("*"), s = e.lastIndexOf(_s); return { key: t ? r[0] : n_(r[0]), flags: i !== -1 && i < s || o !== -1 && o < s ? 1 : 0 } } if (LW(e.substring(e.lastIndexOf(_s) + 1))) return { key: sT(t ? e : n_(e)), flags: 1 } } function bNe(e, t, r, i, o) { let s = mn(i, l => $c(e, l) ? l : void 0); if (!s) return !1; for (let l of s) { if (Gc(e, l)) return !1; let f = o(V0(e, l)); if (t.has(f) || r.has(f)) { if (l === ".d.ts" && (Gc(e, ".js") || Gc(e, ".jsx"))) continue; return !0 } } return !1 } function ENe(e, t, r, i) { let o = mn(r, s => $c(e, s) ? s : void 0); if (o) for (let s = o.length - 1; s >= 0; s--) { let l = o[s]; if (Gc(e, l)) return; let f = i(V0(e, l)); t.delete(f) } } function TNe(e) { let t = {}; for (let r in e) if (fs(e, r)) { let i = gJ(r); i !== void 0 && (t[r] = DJ(e[r], i)) } return t } function DJ(e, t) { switch (t.type) { case "object": return ""; case "string": return ""; case "number": return typeof e == "number" ? e : ""; case "boolean": return typeof e == "boolean" ? e : ""; case "listOrElement": if (!ba(e)) return DJ(e, t.element); case "list": let r = t.element; return ba(e) ? e.map(i => DJ(i, r)) : ""; default: return Ld(t.type, (i, o) => { if (i === e) return o }) } } function wJ(e) { switch (e.type) { case "number": return 1; case "boolean": return !0; case "string": let t = e.defaultValueDescription; return e.isFilePath ? `./${t && typeof t == "string" ? t : ""}` : ""; case "list": return []; case "listOrElement": return wJ(e.element); case "object": return {}; default: let r = u8(e.type.keys()); return r !== void 0 ? r : L.fail("Expected 'option.type' to have entries.") } } var UO, RJ, NL, OJ, VO, jO, HO, WO, zO, NJ, B3, Fh, PJ, MJ, FJ, U3, V3, GJ, BJ, UJ, j3, H3, Efe, Tfe, W3, JO, Sfe, xfe, Afe, VJ, Cfe, KO, Ife, Lfe, kfe, qO, jJ, z3, Dfe, wfe, SNe = gt({ "src/compiler/commandLineParser.ts"() { "use strict"; fa(), UO = { name: "compileOnSave", type: "boolean", defaultValueDescription: !1 }, RJ = new Map(Object.entries({ preserve: 1, "react-native": 3, react: 2, "react-jsx": 4, "react-jsxdev": 5 })), NL = new Map(RU(RJ.entries(), ([e, t]) => ["" + t, e])), OJ = [["es5", "lib.es5.d.ts"], ["es6", "lib.es2015.d.ts"], ["es2015", "lib.es2015.d.ts"], ["es7", "lib.es2016.d.ts"], ["es2016", "lib.es2016.d.ts"], ["es2017", "lib.es2017.d.ts"], ["es2018", "lib.es2018.d.ts"], ["es2019", "lib.es2019.d.ts"], ["es2020", "lib.es2020.d.ts"], ["es2021", "lib.es2021.d.ts"], ["es2022", "lib.es2022.d.ts"], ["es2023", "lib.es2023.d.ts"], ["esnext", "lib.esnext.d.ts"], ["dom", "lib.dom.d.ts"], ["dom.iterable", "lib.dom.iterable.d.ts"], ["webworker", "lib.webworker.d.ts"], ["webworker.importscripts", "lib.webworker.importscripts.d.ts"], ["webworker.iterable", "lib.webworker.iterable.d.ts"], ["scripthost", "lib.scripthost.d.ts"], ["es2015.core", "lib.es2015.core.d.ts"], ["es2015.collection", "lib.es2015.collection.d.ts"], ["es2015.generator", "lib.es2015.generator.d.ts"], ["es2015.iterable", "lib.es2015.iterable.d.ts"], ["es2015.promise", "lib.es2015.promise.d.ts"], ["es2015.proxy", "lib.es2015.proxy.d.ts"], ["es2015.reflect", "lib.es2015.reflect.d.ts"], ["es2015.symbol", "lib.es2015.symbol.d.ts"], ["es2015.symbol.wellknown", "lib.es2015.symbol.wellknown.d.ts"], ["es2016.array.include", "lib.es2016.array.include.d.ts"], ["es2017.object", "lib.es2017.object.d.ts"], ["es2017.sharedmemory", "lib.es2017.sharedmemory.d.ts"], ["es2017.string", "lib.es2017.string.d.ts"], ["es2017.intl", "lib.es2017.intl.d.ts"], ["es2017.typedarrays", "lib.es2017.typedarrays.d.ts"], ["es2018.asyncgenerator", "lib.es2018.asyncgenerator.d.ts"], ["es2018.asynciterable", "lib.es2018.asynciterable.d.ts"], ["es2018.intl", "lib.es2018.intl.d.ts"], ["es2018.promise", "lib.es2018.promise.d.ts"], ["es2018.regexp", "lib.es2018.regexp.d.ts"], ["es2019.array", "lib.es2019.array.d.ts"], ["es2019.object", "lib.es2019.object.d.ts"], ["es2019.string", "lib.es2019.string.d.ts"], ["es2019.symbol", "lib.es2019.symbol.d.ts"], ["es2019.intl", "lib.es2019.intl.d.ts"], ["es2020.bigint", "lib.es2020.bigint.d.ts"], ["es2020.date", "lib.es2020.date.d.ts"], ["es2020.promise", "lib.es2020.promise.d.ts"], ["es2020.sharedmemory", "lib.es2020.sharedmemory.d.ts"], ["es2020.string", "lib.es2020.string.d.ts"], ["es2020.symbol.wellknown", "lib.es2020.symbol.wellknown.d.ts"], ["es2020.intl", "lib.es2020.intl.d.ts"], ["es2020.number", "lib.es2020.number.d.ts"], ["es2021.promise", "lib.es2021.promise.d.ts"], ["es2021.string", "lib.es2021.string.d.ts"], ["es2021.weakref", "lib.es2021.weakref.d.ts"], ["es2021.intl", "lib.es2021.intl.d.ts"], ["es2022.array", "lib.es2022.array.d.ts"], ["es2022.error", "lib.es2022.error.d.ts"], ["es2022.intl", "lib.es2022.intl.d.ts"], ["es2022.object", "lib.es2022.object.d.ts"], ["es2022.sharedmemory", "lib.es2022.sharedmemory.d.ts"], ["es2022.string", "lib.es2022.string.d.ts"], ["es2022.regexp", "lib.es2022.regexp.d.ts"], ["es2023.array", "lib.es2023.array.d.ts"], ["esnext.array", "lib.es2023.array.d.ts"], ["esnext.symbol", "lib.es2019.symbol.d.ts"], ["esnext.asynciterable", "lib.es2018.asynciterable.d.ts"], ["esnext.intl", "lib.esnext.intl.d.ts"], ["esnext.bigint", "lib.es2020.bigint.d.ts"], ["esnext.string", "lib.es2022.string.d.ts"], ["esnext.promise", "lib.es2021.promise.d.ts"], ["esnext.weakref", "lib.es2021.weakref.d.ts"], ["decorators", "lib.decorators.d.ts"], ["decorators.legacy", "lib.decorators.legacy.d.ts"]], VO = OJ.map(e => e[0]), jO = new Map(OJ), HO = [{ name: "watchFile", type: new Map(Object.entries({ fixedpollinginterval: 0, prioritypollinginterval: 1, dynamicprioritypolling: 2, fixedchunksizepolling: 3, usefsevents: 4, usefseventsonparentdirectory: 5 })), category: _.Watch_and_Build_Modes, description: _.Specify_how_the_TypeScript_watch_mode_works, defaultValueDescription: 4 }, { name: "watchDirectory", type: new Map(Object.entries({ usefsevents: 0, fixedpollinginterval: 1, dynamicprioritypolling: 2, fixedchunksizepolling: 3 })), category: _.Watch_and_Build_Modes, description: _.Specify_how_directories_are_watched_on_systems_that_lack_recursive_file_watching_functionality, defaultValueDescription: 0 }, { name: "fallbackPolling", type: new Map(Object.entries({ fixedinterval: 0, priorityinterval: 1, dynamicpriority: 2, fixedchunksize: 3 })), category: _.Watch_and_Build_Modes, description: _.Specify_what_approach_the_watcher_should_use_if_the_system_runs_out_of_native_file_watchers, defaultValueDescription: 1 }, { name: "synchronousWatchDirectory", type: "boolean", category: _.Watch_and_Build_Modes, description: _.Synchronously_call_callbacks_and_update_the_state_of_directory_watchers_on_platforms_that_don_t_support_recursive_watching_natively, defaultValueDescription: !1 }, { name: "excludeDirectories", type: "list", element: { name: "excludeDirectory", type: "string", isFilePath: !0, extraValidation: kJ }, category: _.Watch_and_Build_Modes, description: _.Remove_a_list_of_directories_from_the_watch_process }, { name: "excludeFiles", type: "list", element: { name: "excludeFile", type: "string", isFilePath: !0, extraValidation: kJ }, category: _.Watch_and_Build_Modes, description: _.Remove_a_list_of_files_from_the_watch_mode_s_processing }], WO = [{ name: "help", shortName: "h", type: "boolean", showInSimplifiedHelpView: !0, isCommandLineOnly: !0, category: _.Command_line_Options, description: _.Print_this_message, defaultValueDescription: !1 }, { name: "help", shortName: "?", type: "boolean", isCommandLineOnly: !0, category: _.Command_line_Options, defaultValueDescription: !1 }, { name: "watch", shortName: "w", type: "boolean", showInSimplifiedHelpView: !0, isCommandLineOnly: !0, category: _.Command_line_Options, description: _.Watch_input_files, defaultValueDescription: !1 }, { name: "preserveWatchOutput", type: "boolean", showInSimplifiedHelpView: !1, category: _.Output_Formatting, description: _.Disable_wiping_the_console_in_watch_mode, defaultValueDescription: !1 }, { name: "listFiles", type: "boolean", category: _.Compiler_Diagnostics, description: _.Print_all_of_the_files_read_during_the_compilation, defaultValueDescription: !1 }, { name: "explainFiles", type: "boolean", category: _.Compiler_Diagnostics, description: _.Print_files_read_during_the_compilation_including_why_it_was_included, defaultValueDescription: !1 }, { name: "listEmittedFiles", type: "boolean", category: _.Compiler_Diagnostics, description: _.Print_the_names_of_emitted_files_after_a_compilation, defaultValueDescription: !1 }, { name: "pretty", type: "boolean", showInSimplifiedHelpView: !0, category: _.Output_Formatting, description: _.Enable_color_and_formatting_in_TypeScript_s_output_to_make_compiler_errors_easier_to_read, defaultValueDescription: !0 }, { name: "traceResolution", type: "boolean", category: _.Compiler_Diagnostics, description: _.Log_paths_used_during_the_moduleResolution_process, defaultValueDescription: !1 }, { name: "diagnostics", type: "boolean", category: _.Compiler_Diagnostics, description: _.Output_compiler_performance_information_after_building, defaultValueDescription: !1 }, { name: "extendedDiagnostics", type: "boolean", category: _.Compiler_Diagnostics, description: _.Output_more_detailed_compiler_performance_information_after_building, defaultValueDescription: !1 }, { name: "generateCpuProfile", type: "string", isFilePath: !0, paramType: _.FILE_OR_DIRECTORY, category: _.Compiler_Diagnostics, description: _.Emit_a_v8_CPU_profile_of_the_compiler_run_for_debugging, defaultValueDescription: "profile.cpuprofile" }, { name: "generateTrace", type: "string", isFilePath: !0, isCommandLineOnly: !0, paramType: _.DIRECTORY, category: _.Compiler_Diagnostics, description: _.Generates_an_event_trace_and_a_list_of_types }, { name: "incremental", shortName: "i", type: "boolean", category: _.Projects, description: _.Save_tsbuildinfo_files_to_allow_for_incremental_compilation_of_projects, transpileOptionValue: void 0, defaultValueDescription: _.false_unless_composite_is_set }, { name: "declaration", shortName: "d", type: "boolean", affectsBuildInfo: !0, showInSimplifiedHelpView: !0, category: _.Emit, transpileOptionValue: void 0, description: _.Generate_d_ts_files_from_TypeScript_and_JavaScript_files_in_your_project, defaultValueDescription: _.false_unless_composite_is_set }, { name: "declarationMap", type: "boolean", affectsBuildInfo: !0, showInSimplifiedHelpView: !0, category: _.Emit, transpileOptionValue: void 0, defaultValueDescription: !1, description: _.Create_sourcemaps_for_d_ts_files }, { name: "emitDeclarationOnly", type: "boolean", affectsBuildInfo: !0, showInSimplifiedHelpView: !0, category: _.Emit, description: _.Only_output_d_ts_files_and_not_JavaScript_files, transpileOptionValue: void 0, defaultValueDescription: !1 }, { name: "sourceMap", type: "boolean", affectsBuildInfo: !0, showInSimplifiedHelpView: !0, category: _.Emit, defaultValueDescription: !1, description: _.Create_source_map_files_for_emitted_JavaScript_files }, { name: "inlineSourceMap", type: "boolean", affectsBuildInfo: !0, category: _.Emit, description: _.Include_sourcemap_files_inside_the_emitted_JavaScript, defaultValueDescription: !1 }, { name: "assumeChangesOnlyAffectDirectDependencies", type: "boolean", affectsSemanticDiagnostics: !0, affectsEmit: !0, affectsBuildInfo: !0, category: _.Watch_and_Build_Modes, description: _.Have_recompiles_in_projects_that_use_incremental_and_watch_mode_assume_that_changes_within_a_file_will_only_affect_files_directly_depending_on_it, defaultValueDescription: !1 }, { name: "locale", type: "string", category: _.Command_line_Options, isCommandLineOnly: !0, description: _.Set_the_language_of_the_messaging_from_TypeScript_This_does_not_affect_emit, defaultValueDescription: _.Platform_specific }], zO = { name: "target", shortName: "t", type: new Map(Object.entries({ es3: 0, es5: 1, es6: 2, es2015: 2, es2016: 3, es2017: 4, es2018: 5, es2019: 6, es2020: 7, es2021: 8, es2022: 9, esnext: 99 })), affectsSourceFile: !0, affectsModuleResolution: !0, affectsEmit: !0, affectsBuildInfo: !0, paramType: _.VERSION, showInSimplifiedHelpView: !0, category: _.Language_and_Environment, description: _.Set_the_JavaScript_language_version_for_emitted_JavaScript_and_include_compatible_library_declarations, defaultValueDescription: 1 }, NJ = { name: "module", shortName: "m", type: new Map(Object.entries({ none: 0, commonjs: 1, amd: 2, system: 4, umd: 3, es6: 5, es2015: 5, es2020: 6, es2022: 7, esnext: 99, node16: 100, nodenext: 199 })), affectsModuleResolution: !0, affectsEmit: !0, affectsBuildInfo: !0, paramType: _.KIND, showInSimplifiedHelpView: !0, category: _.Modules, description: _.Specify_what_module_code_is_generated, defaultValueDescription: void 0 }, B3 = [{ name: "all", type: "boolean", showInSimplifiedHelpView: !0, category: _.Command_line_Options, description: _.Show_all_compiler_options, defaultValueDescription: !1 }, { name: "version", shortName: "v", type: "boolean", showInSimplifiedHelpView: !0, category: _.Command_line_Options, description: _.Print_the_compiler_s_version, defaultValueDescription: !1 }, { name: "init", type: "boolean", showInSimplifiedHelpView: !0, category: _.Command_line_Options, description: _.Initializes_a_TypeScript_project_and_creates_a_tsconfig_json_file, defaultValueDescription: !1 }, { name: "project", shortName: "p", type: "string", isFilePath: !0, showInSimplifiedHelpView: !0, category: _.Command_line_Options, paramType: _.FILE_OR_DIRECTORY, description: _.Compile_the_project_given_the_path_to_its_configuration_file_or_to_a_folder_with_a_tsconfig_json }, { name: "build", type: "boolean", shortName: "b", showInSimplifiedHelpView: !0, category: _.Command_line_Options, description: _.Build_one_or_more_projects_and_their_dependencies_if_out_of_date, defaultValueDescription: !1 }, { name: "showConfig", type: "boolean", showInSimplifiedHelpView: !0, category: _.Command_line_Options, isCommandLineOnly: !0, description: _.Print_the_final_configuration_instead_of_building, defaultValueDescription: !1 }, { name: "listFilesOnly", type: "boolean", category: _.Command_line_Options, isCommandLineOnly: !0, description: _.Print_names_of_files_that_are_part_of_the_compilation_and_then_stop_processing, defaultValueDescription: !1 }, zO, NJ, { name: "lib", type: "list", element: { name: "lib", type: jO, defaultValueDescription: void 0 }, affectsProgramStructure: !0, showInSimplifiedHelpView: !0, category: _.Language_and_Environment, description: _.Specify_a_set_of_bundled_library_declaration_files_that_describe_the_target_runtime_environment, transpileOptionValue: void 0 }, { name: "allowJs", type: "boolean", affectsModuleResolution: !0, showInSimplifiedHelpView: !0, category: _.JavaScript_Support, description: _.Allow_JavaScript_files_to_be_a_part_of_your_program_Use_the_checkJS_option_to_get_errors_from_these_files, defaultValueDescription: !1 }, { name: "checkJs", type: "boolean", showInSimplifiedHelpView: !0, category: _.JavaScript_Support, description: _.Enable_error_reporting_in_type_checked_JavaScript_files, defaultValueDescription: !1 }, { name: "jsx", type: RJ, affectsSourceFile: !0, affectsEmit: !0, affectsBuildInfo: !0, affectsModuleResolution: !0, paramType: _.KIND, showInSimplifiedHelpView: !0, category: _.Language_and_Environment, description: _.Specify_what_JSX_code_is_generated, defaultValueDescription: void 0 }, { name: "outFile", type: "string", affectsEmit: !0, affectsBuildInfo: !0, affectsDeclarationPath: !0, isFilePath: !0, paramType: _.FILE, showInSimplifiedHelpView: !0, category: _.Emit, description: _.Specify_a_file_that_bundles_all_outputs_into_one_JavaScript_file_If_declaration_is_true_also_designates_a_file_that_bundles_all_d_ts_output, transpileOptionValue: void 0 }, { name: "outDir", type: "string", affectsEmit: !0, affectsBuildInfo: !0, affectsDeclarationPath: !0, isFilePath: !0, paramType: _.DIRECTORY, showInSimplifiedHelpView: !0, category: _.Emit, description: _.Specify_an_output_folder_for_all_emitted_files }, { name: "rootDir", type: "string", affectsEmit: !0, affectsBuildInfo: !0, affectsDeclarationPath: !0, isFilePath: !0, paramType: _.LOCATION, category: _.Modules, description: _.Specify_the_root_folder_within_your_source_files, defaultValueDescription: _.Computed_from_the_list_of_input_files }, { name: "composite", type: "boolean", affectsBuildInfo: !0, isTSConfigOnly: !0, category: _.Projects, transpileOptionValue: void 0, defaultValueDescription: !1, description: _.Enable_constraints_that_allow_a_TypeScript_project_to_be_used_with_project_references }, { name: "tsBuildInfoFile", type: "string", affectsEmit: !0, affectsBuildInfo: !0, isFilePath: !0, paramType: _.FILE, category: _.Projects, transpileOptionValue: void 0, defaultValueDescription: ".tsbuildinfo", description: _.Specify_the_path_to_tsbuildinfo_incremental_compilation_file }, { name: "removeComments", type: "boolean", affectsEmit: !0, affectsBuildInfo: !0, showInSimplifiedHelpView: !0, category: _.Emit, defaultValueDescription: !1, description: _.Disable_emitting_comments }, { name: "noEmit", type: "boolean", showInSimplifiedHelpView: !0, category: _.Emit, description: _.Disable_emitting_files_from_a_compilation, transpileOptionValue: void 0, defaultValueDescription: !1 }, { name: "importHelpers", type: "boolean", affectsEmit: !0, affectsBuildInfo: !0, category: _.Emit, description: _.Allow_importing_helper_functions_from_tslib_once_per_project_instead_of_including_them_per_file, defaultValueDescription: !1 }, { name: "importsNotUsedAsValues", type: new Map(Object.entries({ remove: 0, preserve: 1, error: 2 })), affectsEmit: !0, affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Emit, description: _.Specify_emit_Slashchecking_behavior_for_imports_that_are_only_used_for_types, defaultValueDescription: 0 }, { name: "downlevelIteration", type: "boolean", affectsEmit: !0, affectsBuildInfo: !0, category: _.Emit, description: _.Emit_more_compliant_but_verbose_and_less_performant_JavaScript_for_iteration, defaultValueDescription: !1 }, { name: "isolatedModules", type: "boolean", category: _.Interop_Constraints, description: _.Ensure_that_each_file_can_be_safely_transpiled_without_relying_on_other_imports, transpileOptionValue: !0, defaultValueDescription: !1 }, { name: "verbatimModuleSyntax", type: "boolean", category: _.Interop_Constraints, description: _.Do_not_transform_or_elide_any_imports_or_exports_not_marked_as_type_only_ensuring_they_are_written_in_the_output_file_s_format_based_on_the_module_setting, defaultValueDescription: !1 }, { name: "strict", type: "boolean", affectsBuildInfo: !0, showInSimplifiedHelpView: !0, category: _.Type_Checking, description: _.Enable_all_strict_type_checking_options, defaultValueDescription: !1 }, { name: "noImplicitAny", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, strictFlag: !0, category: _.Type_Checking, description: _.Enable_error_reporting_for_expressions_and_declarations_with_an_implied_any_type, defaultValueDescription: _.false_unless_strict_is_set }, { name: "strictNullChecks", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, strictFlag: !0, category: _.Type_Checking, description: _.When_type_checking_take_into_account_null_and_undefined, defaultValueDescription: _.false_unless_strict_is_set }, { name: "strictFunctionTypes", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, strictFlag: !0, category: _.Type_Checking, description: _.When_assigning_functions_check_to_ensure_parameters_and_the_return_values_are_subtype_compatible, defaultValueDescription: _.false_unless_strict_is_set }, { name: "strictBindCallApply", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, strictFlag: !0, category: _.Type_Checking, description: _.Check_that_the_arguments_for_bind_call_and_apply_methods_match_the_original_function, defaultValueDescription: _.false_unless_strict_is_set }, { name: "strictPropertyInitialization", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, strictFlag: !0, category: _.Type_Checking, description: _.Check_for_class_properties_that_are_declared_but_not_set_in_the_constructor, defaultValueDescription: _.false_unless_strict_is_set }, { name: "noImplicitThis", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, strictFlag: !0, category: _.Type_Checking, description: _.Enable_error_reporting_when_this_is_given_the_type_any, defaultValueDescription: _.false_unless_strict_is_set }, { name: "useUnknownInCatchVariables", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, strictFlag: !0, category: _.Type_Checking, description: _.Default_catch_clause_variables_as_unknown_instead_of_any, defaultValueDescription: !1 }, { name: "alwaysStrict", type: "boolean", affectsSourceFile: !0, affectsEmit: !0, affectsBuildInfo: !0, strictFlag: !0, category: _.Type_Checking, description: _.Ensure_use_strict_is_always_emitted, defaultValueDescription: _.false_unless_strict_is_set }, { name: "noUnusedLocals", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Type_Checking, description: _.Enable_error_reporting_when_local_variables_aren_t_read, defaultValueDescription: !1 }, { name: "noUnusedParameters", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Type_Checking, description: _.Raise_an_error_when_a_function_parameter_isn_t_read, defaultValueDescription: !1 }, { name: "exactOptionalPropertyTypes", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Type_Checking, description: _.Interpret_optional_property_types_as_written_rather_than_adding_undefined, defaultValueDescription: !1 }, { name: "noImplicitReturns", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Type_Checking, description: _.Enable_error_reporting_for_codepaths_that_do_not_explicitly_return_in_a_function, defaultValueDescription: !1 }, { name: "noFallthroughCasesInSwitch", type: "boolean", affectsBindDiagnostics: !0, affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Type_Checking, description: _.Enable_error_reporting_for_fallthrough_cases_in_switch_statements, defaultValueDescription: !1 }, { name: "noUncheckedIndexedAccess", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Type_Checking, description: _.Add_undefined_to_a_type_when_accessed_using_an_index, defaultValueDescription: !1 }, { name: "noImplicitOverride", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Type_Checking, description: _.Ensure_overriding_members_in_derived_classes_are_marked_with_an_override_modifier, defaultValueDescription: !1 }, { name: "noPropertyAccessFromIndexSignature", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, showInSimplifiedHelpView: !1, category: _.Type_Checking, description: _.Enforces_using_indexed_accessors_for_keys_declared_using_an_indexed_type, defaultValueDescription: !1 }, { name: "moduleResolution", type: new Map(Object.entries({ node10: 2, node: 2, classic: 1, node16: 3, nodenext: 99, bundler: 100 })), deprecatedKeys: new Set(["node"]), affectsModuleResolution: !0, paramType: _.STRATEGY, category: _.Modules, description: _.Specify_how_TypeScript_looks_up_a_file_from_a_given_module_specifier, defaultValueDescription: _.module_AMD_or_UMD_or_System_or_ES6_then_Classic_Otherwise_Node }, { name: "baseUrl", type: "string", affectsModuleResolution: !0, isFilePath: !0, category: _.Modules, description: _.Specify_the_base_directory_to_resolve_non_relative_module_names }, { name: "paths", type: "object", affectsModuleResolution: !0, isTSConfigOnly: !0, category: _.Modules, description: _.Specify_a_set_of_entries_that_re_map_imports_to_additional_lookup_locations, transpileOptionValue: void 0 }, { name: "rootDirs", type: "list", isTSConfigOnly: !0, element: { name: "rootDirs", type: "string", isFilePath: !0 }, affectsModuleResolution: !0, category: _.Modules, description: _.Allow_multiple_folders_to_be_treated_as_one_when_resolving_modules, transpileOptionValue: void 0, defaultValueDescription: _.Computed_from_the_list_of_input_files }, { name: "typeRoots", type: "list", element: { name: "typeRoots", type: "string", isFilePath: !0 }, affectsModuleResolution: !0, category: _.Modules, description: _.Specify_multiple_folders_that_act_like_Slashnode_modules_Slash_types }, { name: "types", type: "list", element: { name: "types", type: "string" }, affectsProgramStructure: !0, showInSimplifiedHelpView: !0, category: _.Modules, description: _.Specify_type_package_names_to_be_included_without_being_referenced_in_a_source_file, transpileOptionValue: void 0 }, { name: "allowSyntheticDefaultImports", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Interop_Constraints, description: _.Allow_import_x_from_y_when_a_module_doesn_t_have_a_default_export, defaultValueDescription: _.module_system_or_esModuleInterop }, { name: "esModuleInterop", type: "boolean", affectsSemanticDiagnostics: !0, affectsEmit: !0, affectsBuildInfo: !0, showInSimplifiedHelpView: !0, category: _.Interop_Constraints, description: _.Emit_additional_JavaScript_to_ease_support_for_importing_CommonJS_modules_This_enables_allowSyntheticDefaultImports_for_type_compatibility, defaultValueDescription: !1 }, { name: "preserveSymlinks", type: "boolean", category: _.Interop_Constraints, description: _.Disable_resolving_symlinks_to_their_realpath_This_correlates_to_the_same_flag_in_node, defaultValueDescription: !1 }, { name: "allowUmdGlobalAccess", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Modules, description: _.Allow_accessing_UMD_globals_from_modules, defaultValueDescription: !1 }, { name: "moduleSuffixes", type: "list", element: { name: "suffix", type: "string" }, listPreserveFalsyValues: !0, affectsModuleResolution: !0, category: _.Modules, description: _.List_of_file_name_suffixes_to_search_when_resolving_a_module }, { name: "allowImportingTsExtensions", type: "boolean", affectsSemanticDiagnostics: !0, category: _.Modules, description: _.Allow_imports_to_include_TypeScript_file_extensions_Requires_moduleResolution_bundler_and_either_noEmit_or_emitDeclarationOnly_to_be_set, defaultValueDescription: !1 }, { name: "resolvePackageJsonExports", type: "boolean", affectsModuleResolution: !0, category: _.Modules, description: _.Use_the_package_json_exports_field_when_resolving_package_imports, defaultValueDescription: _.true_when_moduleResolution_is_node16_nodenext_or_bundler_otherwise_false }, { name: "resolvePackageJsonImports", type: "boolean", affectsModuleResolution: !0, category: _.Modules, description: _.Use_the_package_json_imports_field_when_resolving_imports, defaultValueDescription: _.true_when_moduleResolution_is_node16_nodenext_or_bundler_otherwise_false }, { name: "customConditions", type: "list", element: { name: "condition", type: "string" }, affectsModuleResolution: !0, category: _.Modules, description: _.Conditions_to_set_in_addition_to_the_resolver_specific_defaults_when_resolving_imports }, { name: "sourceRoot", type: "string", affectsEmit: !0, affectsBuildInfo: !0, paramType: _.LOCATION, category: _.Emit, description: _.Specify_the_root_path_for_debuggers_to_find_the_reference_source_code }, { name: "mapRoot", type: "string", affectsEmit: !0, affectsBuildInfo: !0, paramType: _.LOCATION, category: _.Emit, description: _.Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations }, { name: "inlineSources", type: "boolean", affectsEmit: !0, affectsBuildInfo: !0, category: _.Emit, description: _.Include_source_code_in_the_sourcemaps_inside_the_emitted_JavaScript, defaultValueDescription: !1 }, { name: "experimentalDecorators", type: "boolean", affectsEmit: !0, affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Language_and_Environment, description: _.Enable_experimental_support_for_legacy_experimental_decorators, defaultValueDescription: !1 }, { name: "emitDecoratorMetadata", type: "boolean", affectsSemanticDiagnostics: !0, affectsEmit: !0, affectsBuildInfo: !0, category: _.Language_and_Environment, description: _.Emit_design_type_metadata_for_decorated_declarations_in_source_files, defaultValueDescription: !1 }, { name: "jsxFactory", type: "string", category: _.Language_and_Environment, description: _.Specify_the_JSX_factory_function_used_when_targeting_React_JSX_emit_e_g_React_createElement_or_h, defaultValueDescription: "`React.createElement`" }, { name: "jsxFragmentFactory", type: "string", category: _.Language_and_Environment, description: _.Specify_the_JSX_Fragment_reference_used_for_fragments_when_targeting_React_JSX_emit_e_g_React_Fragment_or_Fragment, defaultValueDescription: "React.Fragment" }, { name: "jsxImportSource", type: "string", affectsSemanticDiagnostics: !0, affectsEmit: !0, affectsBuildInfo: !0, affectsModuleResolution: !0, category: _.Language_and_Environment, description: _.Specify_module_specifier_used_to_import_the_JSX_factory_functions_when_using_jsx_Colon_react_jsx_Asterisk, defaultValueDescription: "react" }, { name: "resolveJsonModule", type: "boolean", affectsModuleResolution: !0, category: _.Modules, description: _.Enable_importing_json_files, defaultValueDescription: !1 }, { name: "allowArbitraryExtensions", type: "boolean", affectsProgramStructure: !0, category: _.Modules, description: _.Enable_importing_files_with_any_extension_provided_a_declaration_file_is_present, defaultValueDescription: !1 }, { name: "out", type: "string", affectsEmit: !0, affectsBuildInfo: !0, affectsDeclarationPath: !0, isFilePath: !1, category: _.Backwards_Compatibility, paramType: _.FILE, transpileOptionValue: void 0, description: _.Deprecated_setting_Use_outFile_instead }, { name: "reactNamespace", type: "string", affectsEmit: !0, affectsBuildInfo: !0, category: _.Language_and_Environment, description: _.Specify_the_object_invoked_for_createElement_This_only_applies_when_targeting_react_JSX_emit, defaultValueDescription: "`React`" }, { name: "skipDefaultLibCheck", type: "boolean", affectsBuildInfo: !0, category: _.Completeness, description: _.Skip_type_checking_d_ts_files_that_are_included_with_TypeScript, defaultValueDescription: !1 }, { name: "charset", type: "string", category: _.Backwards_Compatibility, description: _.No_longer_supported_In_early_versions_manually_set_the_text_encoding_for_reading_files, defaultValueDescription: "utf8" }, { name: "emitBOM", type: "boolean", affectsEmit: !0, affectsBuildInfo: !0, category: _.Emit, description: _.Emit_a_UTF_8_Byte_Order_Mark_BOM_in_the_beginning_of_output_files, defaultValueDescription: !1 }, { name: "newLine", type: new Map(Object.entries({ crlf: 0, lf: 1 })), affectsEmit: !0, affectsBuildInfo: !0, paramType: _.NEWLINE, category: _.Emit, description: _.Set_the_newline_character_for_emitting_files, defaultValueDescription: "lf" }, { name: "noErrorTruncation", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Output_Formatting, description: _.Disable_truncating_types_in_error_messages, defaultValueDescription: !1 }, { name: "noLib", type: "boolean", category: _.Language_and_Environment, affectsProgramStructure: !0, description: _.Disable_including_any_library_files_including_the_default_lib_d_ts, transpileOptionValue: !0, defaultValueDescription: !1 }, { name: "noResolve", type: "boolean", affectsModuleResolution: !0, category: _.Modules, description: _.Disallow_import_s_require_s_or_reference_s_from_expanding_the_number_of_files_TypeScript_should_add_to_a_project, transpileOptionValue: !0, defaultValueDescription: !1 }, { name: "stripInternal", type: "boolean", affectsEmit: !0, affectsBuildInfo: !0, category: _.Emit, description: _.Disable_emitting_declarations_that_have_internal_in_their_JSDoc_comments, defaultValueDescription: !1 }, { name: "disableSizeLimit", type: "boolean", affectsProgramStructure: !0, category: _.Editor_Support, description: _.Remove_the_20mb_cap_on_total_source_code_size_for_JavaScript_files_in_the_TypeScript_language_server, defaultValueDescription: !1 }, { name: "disableSourceOfProjectReferenceRedirect", type: "boolean", isTSConfigOnly: !0, category: _.Projects, description: _.Disable_preferring_source_files_instead_of_declaration_files_when_referencing_composite_projects, defaultValueDescription: !1 }, { name: "disableSolutionSearching", type: "boolean", isTSConfigOnly: !0, category: _.Projects, description: _.Opt_a_project_out_of_multi_project_reference_checking_when_editing, defaultValueDescription: !1 }, { name: "disableReferencedProjectLoad", type: "boolean", isTSConfigOnly: !0, category: _.Projects, description: _.Reduce_the_number_of_projects_loaded_automatically_by_TypeScript, defaultValueDescription: !1 }, { name: "noImplicitUseStrict", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Backwards_Compatibility, description: _.Disable_adding_use_strict_directives_in_emitted_JavaScript_files, defaultValueDescription: !1 }, { name: "noEmitHelpers", type: "boolean", affectsEmit: !0, affectsBuildInfo: !0, category: _.Emit, description: _.Disable_generating_custom_helper_functions_like_extends_in_compiled_output, defaultValueDescription: !1 }, { name: "noEmitOnError", type: "boolean", affectsEmit: !0, affectsBuildInfo: !0, category: _.Emit, transpileOptionValue: void 0, description: _.Disable_emitting_files_if_any_type_checking_errors_are_reported, defaultValueDescription: !1 }, { name: "preserveConstEnums", type: "boolean", affectsEmit: !0, affectsBuildInfo: !0, category: _.Emit, description: _.Disable_erasing_const_enum_declarations_in_generated_code, defaultValueDescription: !1 }, { name: "declarationDir", type: "string", affectsEmit: !0, affectsBuildInfo: !0, affectsDeclarationPath: !0, isFilePath: !0, paramType: _.DIRECTORY, category: _.Emit, transpileOptionValue: void 0, description: _.Specify_the_output_directory_for_generated_declaration_files }, { name: "skipLibCheck", type: "boolean", affectsBuildInfo: !0, category: _.Completeness, description: _.Skip_type_checking_all_d_ts_files, defaultValueDescription: !1 }, { name: "allowUnusedLabels", type: "boolean", affectsBindDiagnostics: !0, affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Type_Checking, description: _.Disable_error_reporting_for_unused_labels, defaultValueDescription: void 0 }, { name: "allowUnreachableCode", type: "boolean", affectsBindDiagnostics: !0, affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Type_Checking, description: _.Disable_error_reporting_for_unreachable_code, defaultValueDescription: void 0 }, { name: "suppressExcessPropertyErrors", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Backwards_Compatibility, description: _.Disable_reporting_of_excess_property_errors_during_the_creation_of_object_literals, defaultValueDescription: !1 }, { name: "suppressImplicitAnyIndexErrors", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Backwards_Compatibility, description: _.Suppress_noImplicitAny_errors_when_indexing_objects_that_lack_index_signatures, defaultValueDescription: !1 }, { name: "forceConsistentCasingInFileNames", type: "boolean", affectsModuleResolution: !0, category: _.Interop_Constraints, description: _.Ensure_that_casing_is_correct_in_imports, defaultValueDescription: !0 }, { name: "maxNodeModuleJsDepth", type: "number", affectsModuleResolution: !0, category: _.JavaScript_Support, description: _.Specify_the_maximum_folder_depth_used_for_checking_JavaScript_files_from_node_modules_Only_applicable_with_allowJs, defaultValueDescription: 0 }, { name: "noStrictGenericChecks", type: "boolean", affectsSemanticDiagnostics: !0, affectsBuildInfo: !0, category: _.Backwards_Compatibility, description: _.Disable_strict_checking_of_generic_signatures_in_function_types, defaultValueDescription: !1 }, { name: "useDefineForClassFields", type: "boolean", affectsSemanticDiagnostics: !0, affectsEmit: !0, affectsBuildInfo: !0, category: _.Language_and_Environment, description: _.Emit_ECMAScript_standard_compliant_class_fields, defaultValueDescription: _.true_for_ES2022_and_above_including_ESNext }, { name: "preserveValueImports", type: "boolean", affectsEmit: !0, affectsBuildInfo: !0, category: _.Emit, description: _.Preserve_unused_imported_values_in_the_JavaScript_output_that_would_otherwise_be_removed, defaultValueDescription: !1 }, { name: "keyofStringsOnly", type: "boolean", category: _.Backwards_Compatibility, description: _.Make_keyof_only_return_strings_instead_of_string_numbers_or_symbols_Legacy_option, defaultValueDescription: !1 }, { name: "plugins", type: "list", isTSConfigOnly: !0, element: { name: "plugin", type: "object" }, description: _.Specify_a_list_of_language_service_plugins_to_include, category: _.Editor_Support }, { name: "moduleDetection", type: new Map(Object.entries({ auto: 2, legacy: 1, force: 3 })), affectsModuleResolution: !0, description: _.Control_what_method_is_used_to_detect_module_format_JS_files, category: _.Language_and_Environment, defaultValueDescription: _.auto_Colon_Treat_files_with_imports_exports_import_meta_jsx_with_jsx_Colon_react_jsx_or_esm_format_with_module_Colon_node16_as_modules }, { name: "ignoreDeprecations", type: "string", defaultValueDescription: void 0 }], Fh = [...WO, ...B3], PJ = Fh.filter(e => !!e.affectsSemanticDiagnostics), MJ = Fh.filter(e => !!e.affectsEmit), FJ = Fh.filter(e => !!e.affectsDeclarationPath), U3 = Fh.filter(e => !!e.affectsModuleResolution), V3 = Fh.filter(e => !!e.affectsSourceFile || !!e.affectsModuleResolution || !!e.affectsBindDiagnostics), GJ = Fh.filter(e => !!e.affectsProgramStructure), BJ = Fh.filter(e => fs(e, "transpileOptionValue")), UJ = [{ name: "verbose", shortName: "v", category: _.Command_line_Options, description: _.Enable_verbose_logging, type: "boolean", defaultValueDescription: !1 }, { name: "dry", shortName: "d", category: _.Command_line_Options, description: _.Show_what_would_be_built_or_deleted_if_specified_with_clean, type: "boolean", defaultValueDescription: !1 }, { name: "force", shortName: "f", category: _.Command_line_Options, description: _.Build_all_projects_including_those_that_appear_to_be_up_to_date, type: "boolean", defaultValueDescription: !1 }, { name: "clean", category: _.Command_line_Options, description: _.Delete_the_outputs_of_all_projects, type: "boolean", defaultValueDescription: !1 }], j3 = [...WO, ...UJ], H3 = [{ name: "enable", type: "boolean", defaultValueDescription: !1 }, { name: "include", type: "list", element: { name: "include", type: "string" } }, { name: "exclude", type: "list", element: { name: "exclude", type: "string" } }, { name: "disableFilenameBasedTypeAcquisition", type: "boolean", defaultValueDescription: !1 }], Tfe = { diagnostic: _.Compiler_option_0_may_only_be_used_with_build, getOptionsNameMap: Yde }, W3 = { module: 1, target: 3, strict: !0, esModuleInterop: !0, forceConsistentCasingInFileNames: !0, skipLibCheck: !0 }, JO = { alternateMode: Tfe, getOptionsNameMap: w2, optionDeclarations: Fh, unknownOptionDiagnostic: _.Unknown_compiler_option_0, unknownDidYouMeanDiagnostic: _.Unknown_compiler_option_0_Did_you_mean_1, optionTypeMismatchDiagnostic: _.Compiler_option_0_expects_an_argument }, xfe = { diagnostic: _.Compiler_option_0_may_not_be_used_with_build, getOptionsNameMap: w2 }, Afe = { alternateMode: xfe, getOptionsNameMap: Yde, optionDeclarations: j3, unknownOptionDiagnostic: _.Unknown_build_option_0, unknownDidYouMeanDiagnostic: _.Unknown_build_option_0_Did_you_mean_1, optionTypeMismatchDiagnostic: _.Build_option_0_requires_a_value_of_type_1 }, VJ = { optionDeclarations: H3, unknownOptionDiagnostic: _.Unknown_type_acquisition_option_0, unknownDidYouMeanDiagnostic: _.Unknown_type_acquisition_option_0_Did_you_mean_1 }, KO = { getOptionsNameMap: Qde, optionDeclarations: HO, unknownOptionDiagnostic: _.Unknown_watch_option_0, unknownDidYouMeanDiagnostic: _.Unknown_watch_option_0_Did_you_mean_1, optionTypeMismatchDiagnostic: _.Watch_option_0_requires_a_value_of_type_1 }, qO = { name: "extends", type: "listOrElement", element: { name: "extends", type: "string" }, category: _.File_Management }, z3 = "**/*", Dfe = /(^|\/)\*\*\/?$/, wfe = /^[^*?]*(?=\/[^/]*[*?])/ } }); function Xi(e) { e.trace(TW.apply(void 0, arguments)) } function ov(e, t) { return !!e.traceResolution && t.trace !== void 0 } function O2(e, t) { let r; if (t && e) { let i = e.contents.packageJsonContent; typeof i.name == "string" && typeof i.version == "string" && (r = { name: i.name, subModuleName: t.path.slice(e.packageDirectory.length + _s.length), version: i.version }) } return t && { path: t.path, extension: t.ext, packageId: r, resolvedUsingTsExtension: t.resolvedUsingTsExtension } } function J3(e) { return O2(void 0, e) } function Rfe(e) { if (e) return L.assert(e.packageId === void 0), { path: e.path, ext: e.extension, resolvedUsingTsExtension: e.resolvedUsingTsExtension } } function Ofe(e) { let t = []; return e & 1 && t.push("TypeScript"), e & 2 && t.push("JavaScript"), e & 4 && t.push("Declaration"), e & 8 && t.push("JSON"), t.join(", ") } function Nfe(e) { if (e) return L.assert(y4(e.extension)), { fileName: e.path, packageId: e.packageId } } function Pfe(e, t, r, i, o, s, l, f) { if (!l.resultFromCache && !l.compilerOptions.preserveSymlinks && t && r && !t.originalPath && !fl(e)) { let { resolvedFileName: d, originalPath: g } = Gfe(t.path, l.host, l.traceEnabled); g && (t = { ...t, path: d, originalPath: g }) } return Mfe(t, r, i, o, s, l.resultFromCache, f) } function Mfe(e, t, r, i, o, s, l) { return s ? (s.failedLookupLocations = N2(s.failedLookupLocations, r), s.affectingLocations = N2(s.affectingLocations, i), s.resolutionDiagnostics = N2(s.resolutionDiagnostics, o), s) : { resolvedModule: e && { resolvedFileName: e.path, originalPath: e.originalPath === !0 ? void 0 : e.originalPath, extension: e.extension, isExternalLibraryImport: t, packageId: e.packageId, resolvedUsingTsExtension: !!e.resolvedUsingTsExtension }, failedLookupLocations: PL(r), affectingLocations: PL(i), resolutionDiagnostics: PL(o), node10Result: l } } function PL(e) { return e.length ? e : void 0 } function N2(e, t) { return t?.length ? e?.length ? (e.push(...t), e) : t : e } function Ffe(e, t, r, i) { if (!fs(e, t)) { i.traceEnabled && Xi(i.host, _.package_json_does_not_have_a_0_field, t); return } let o = e[t]; if (typeof o !== r || o === null) { i.traceEnabled && Xi(i.host, _.Expected_type_of_0_field_in_package_json_to_be_1_got_2, t, r, o === null ? "null" : typeof o); return } return o } function K3(e, t, r, i) { let o = Ffe(e, t, "string", i); if (o === void 0) return; if (!o) { i.traceEnabled && Xi(i.host, _.package_json_had_a_falsy_0_field, t); return } let s = So(vi(r, o)); return i.traceEnabled && Xi(i.host, _.package_json_has_0_field_1_that_references_2, t, o, s), s } function xNe(e, t, r) { return K3(e, "typings", t, r) || K3(e, "types", t, r) } function ANe(e, t, r) { return K3(e, "tsconfig", t, r) } function CNe(e, t, r) { return K3(e, "main", t, r) } function INe(e, t) { let r = Ffe(e, "typesVersions", "object", t); if (r !== void 0) return t.traceEnabled && Xi(t.host, _.package_json_has_a_typesVersions_field_with_version_specific_path_mappings), r } function LNe(e, t) { let r = INe(e, t); if (r === void 0) return; if (t.traceEnabled) for (let l in r) fs(r, l) && !mA.tryParse(l) && Xi(t.host, _.package_json_has_a_typesVersions_entry_0_that_is_not_a_valid_semver_range, l); let i = q3(r); if (!i) { t.traceEnabled && Xi(t.host, _.package_json_does_not_have_a_typesVersions_entry_that_matches_version_0, Sg); return } let { version: o, paths: s } = i; if (typeof s != "object") { t.traceEnabled && Xi(t.host, _.Expected_type_of_0_field_in_package_json_to_be_1_got_2, `typesVersions['${o}']`, "object", typeof s); return } return i } function q3(e) { rK || (rK = new r_(Rf)); for (let t in e) { if (!fs(e, t)) continue; let r = mA.tryParse(t); if (r !== void 0 && r.test(rK)) return { version: t, paths: e[t] } } } function XO(e, t) { if (e.typeRoots) return e.typeRoots; let r; if (e.configFilePath ? r = ni(e.configFilePath) : t.getCurrentDirectory && (r = t.getCurrentDirectory()), r !== void 0) return kNe(r, t) } function kNe(e, t) { if (!t.directoryExists) return [vi(e, iK)]; let r; return Th(So(e), i => { let o = vi(i, iK); t.directoryExists(o) && (r || (r = [])).push(o) }), r } function DNe(e, t, r) { let i = typeof r.useCaseSensitiveFileNames == "function" ? r.useCaseSensitiveFileNames() : r.useCaseSensitiveFileNames; return cT(e, t, !i) === 0 } function Gfe(e, t, r) { let i = WNe(e, t, r), o = DNe(e, i, t); return { resolvedFileName: o ? e : i, originalPath: o ? void 0 : e } } function HJ(e, t, r, i, o, s, l) { L.assert(typeof e == "string", "Non-string value passed to `ts.resolveTypeReferenceDirective`, likely by a wrapping package working with an outdated `resolveTypeReferenceDirectives` signature. This is probably not a problem in TS itself."); let f = ov(r, i); o && (r = o.commandLine.options); let d = t ? ni(t) : void 0, g = d ? s?.getFromDirectoryCache(e, l, d, o) : void 0; if (!g && d && !fl(e) && (g = s?.getFromNonRelativeNameCache(e, l, d, o)), g) return f && (Xi(i, _.Resolving_type_reference_directive_0_containing_file_1, e, t), o && Xi(i, _.Using_compiler_options_of_project_reference_redirect_0, o.sourceFile.fileName), Xi(i, _.Resolution_for_type_reference_directive_0_was_found_in_cache_from_location_1, e, d), q(g)), g; let m = XO(r, i); f && (t === void 0 ? m === void 0 ? Xi(i, _.Resolving_type_reference_directive_0_containing_file_not_set_root_directory_not_set, e) : Xi(i, _.Resolving_type_reference_directive_0_containing_file_not_set_root_directory_1, e, m) : m === void 0 ? Xi(i, _.Resolving_type_reference_directive_0_containing_file_1_root_directory_not_set, e, t) : Xi(i, _.Resolving_type_reference_directive_0_containing_file_1_root_directory_2, e, t, m), o && Xi(i, _.Using_compiler_options_of_project_reference_redirect_0, o.sourceFile.fileName)); let v = [], S = [], x = WJ(r); l === 99 && ($s(r) === 3 || $s(r) === 99) && (x |= 32); let A = x & 8 ? P2(r, !!(x & 32)) : [], w = [], C = { compilerOptions: r, host: i, traceEnabled: f, failedLookupLocations: v, affectingLocations: S, packageJsonInfoCache: s, features: x, conditions: A, requestContainingDirectory: d, reportDiagnostic: R => void w.push(R), isConfigLookup: !1, candidateIsFromPackageJsonField: !1 }, P = W(), F = !0; P || (P = Y(), F = !1); let B; if (P) { let { fileName: R, packageId: ie } = P, $ = R, fe; r.preserveSymlinks || ({ resolvedFileName: $, originalPath: fe } = Gfe(R, i, f)), B = { primary: F, resolvedFileName: $, originalPath: fe, packageId: ie, isExternalLibraryImport: JS(R) } } return g = { resolvedTypeReferenceDirective: B, failedLookupLocations: PL(v), affectingLocations: PL(S), resolutionDiagnostics: PL(w) }, d && (s?.getOrCreateCacheForDirectory(d, o).set(e, l, g), fl(e) || s?.getOrCreateCacheForNonRelativeName(e, l, o).set(d, g)), f && q(g), g; function q(R) { var ie; (ie = R.resolvedTypeReferenceDirective) != null && ie.resolvedFileName ? R.resolvedTypeReferenceDirective.packageId ? Xi(i, _.Type_reference_directive_0_was_successfully_resolved_to_1_with_Package_ID_2_primary_Colon_3, e, R.resolvedTypeReferenceDirective.resolvedFileName, hT(R.resolvedTypeReferenceDirective.packageId), R.resolvedTypeReferenceDirective.primary) : Xi(i, _.Type_reference_directive_0_was_successfully_resolved_to_1_primary_Colon_2, e, R.resolvedTypeReferenceDirective.resolvedFileName, R.resolvedTypeReferenceDirective.primary) : Xi(i, _.Type_reference_directive_0_was_not_resolved, e) } function W() { if (m && m.length) return f && Xi(i, _.Resolving_with_primary_search_path_0, m.join(", ")), ks(m, R => { let ie = vi(R, e), $ = ni(ie), fe = gp($, i); return !fe && f && Xi(i, _.Directory_0_does_not_exist_skipping_all_lookups_in_it, $), Nfe(Qfe(4, ie, !fe, C)) }); f && Xi(i, _.Root_directory_cannot_be_determined_skipping_primary_search_paths) } function Y() { let R = t && ni(t); if (R !== void 0) { f && Xi(i, _.Looking_up_in_node_modules_folder_initial_location_0, R); let ie; if (fl(e)) { let { path: $ } = Kfe(R, e); ie = Q3(4, $, !1, C, !0) } else { let $ = t_e(4, e, R, C, void 0, void 0); ie = $ && $.value } return Nfe(ie) } else f && Xi(i, _.Containing_file_is_not_specified_and_root_directory_cannot_be_determined_skipping_lookup_in_node_modules_folder) } } function WJ(e) { let t = 0; switch ($s(e)) { case 3: t = 30; break; case 99: t = 30; break; case 100: t = 30; break }return e.resolvePackageJsonExports ? t |= 8 : e.resolvePackageJsonExports === !1 && (t &= -9), e.resolvePackageJsonImports ? t |= 2 : e.resolvePackageJsonImports === !1 && (t &= -3), t } function P2(e, t) { let r = t || $s(e) === 100 ? ["import"] : ["require"]; return e.noDtsResolution || r.push("types"), $s(e) !== 100 && r.push("node"), Qi(r, e.customConditions) } function wNe(e, t, r, i, o) { let s = Z3(o?.getPackageJsonInfoCache(), i, r); return Th(t, l => { if (Hl(l) !== "node_modules") { let f = vi(l, "node_modules"), d = vi(f, e); return KS(d, !1, s) } }) } function X3(e, t) { if (e.types) return e.types; let r = []; if (t.directoryExists && t.getDirectories) { let i = XO(e, t); if (i) { for (let o of i) if (t.directoryExists(o)) for (let s of t.getDirectories(o)) { let l = So(s), f = vi(o, l, "package.json"); if (!(t.fileExists(f) && JI(f, t).typings === null)) { let g = Hl(l); g.charCodeAt(0) !== 46 && r.push(g) } } } } return r } function zJ(e) { var t; if (e === null || typeof e != "object") return "" + e; if (ba(e)) return `[${(t = e.map(i => zJ(i))) == null ? void 0 : t.join(",")}]`; let r = "{"; for (let i in e) fs(e, i) && (r += `${i}: ${zJ(e[i])}`); return r + "}" } function JJ(e, t) { return t.map(r => zJ(f4(e, r))).join("|") + (e.pathsBasePath ? `|${e.pathsBasePath}` : void 0) } function KJ(e) { let t = new Map, r = new Map, i = new Map, o = new Map; return e && t.set(e, o), { getMapOfCacheRedirects: s, getOrCreateMapOfCacheRedirects: l, update: f, clear: g }; function s(v) { return v ? d(v.commandLine.options, !1) : o } function l(v) { return v ? d(v.commandLine.options, !0) : o } function f(v) { e !== v && (e ? o = d(v, !0) : t.set(v, o), e = v) } function d(v, S) { let x = t.get(v); if (x) return x; let A = m(v); if (x = i.get(A), !x) { if (e) { let w = m(e); w === A ? x = o : i.has(w) || i.set(w, o) } S && (x ?? (x = new Map)), x && i.set(A, x) } return x && t.set(v, x), x } function g() { let v = e && r.get(e); o.clear(), t.clear(), r.clear(), i.clear(), e && (v && r.set(e, v), t.set(e, o)) } function m(v) { let S = r.get(v); return S || r.set(v, S = JJ(v, U3)), S } } function RNe(e, t) { let r; return { getPackageJsonInfo: i, setPackageJsonInfo: o, clear: s, entries: l, getInternalMap: f }; function i(d) { return r?.get(Ts(d, e, t)) } function o(d, g) { (r || (r = new Map)).set(Ts(d, e, t), g) } function s() { r = void 0 } function l() { let d = r?.entries(); return d ? lo(d) : [] } function f() { return r } } function Bfe(e, t, r, i) { let o = e.getOrCreateMapOfCacheRedirects(t), s = o.get(r); return s || (s = i(), o.set(r, s)), s } function ONe(e, t, r) { let i = KJ(r); return { getFromDirectoryCache: f, getOrCreateCacheForDirectory: l, clear: o, update: s }; function o() { i.clear() } function s(d) { i.update(d) } function l(d, g) { let m = Ts(d, e, t); return Bfe(i, g, m, () => WT()) } function f(d, g, m, v) { var S, x; let A = Ts(m, e, t); return (x = (S = i.getMapOfCacheRedirects(v)) == null ? void 0 : S.get(A)) == null ? void 0 : x.get(d, g) } } function ML(e, t) { return t === void 0 ? e : `${t}|${e}` } function WT() { let e = new Map, t = new Map, r = { get(o, s) { return e.get(i(o, s)) }, set(o, s, l) { return e.set(i(o, s), l), r }, delete(o, s) { return e.delete(i(o, s)), r }, has(o, s) { return e.has(i(o, s)) }, forEach(o) { return e.forEach((s, l) => { let [f, d] = t.get(l); return o(s, f, d) }) }, size() { return e.size } }; return r; function i(o, s) { let l = ML(o, s); return t.set(l, [o, s]), l } } function qJ(e, t, r, i) { L.assert(t.length === r.length); let o = WT(); for (let s = 0; s < t.length; ++s) { let l = t[s]; o.set(i.getName(l), i.getMode(l, e), r[s]) } return o } function NNe(e) { return e.resolvedModule && (e.resolvedModule.originalPath || e.resolvedModule.resolvedFileName) } function PNe(e) { return e.resolvedTypeReferenceDirective && (e.resolvedTypeReferenceDirective.originalPath || e.resolvedTypeReferenceDirective.resolvedFileName) } function MNe(e, t, r, i) { let o = KJ(r); return { getFromNonRelativeNameCache: f, getOrCreateCacheForNonRelativeName: d, clear: s, update: l }; function s() { o.clear() } function l(m) { o.update(m) } function f(m, v, S, x) { var A, w; return L.assert(!fl(m)), (w = (A = o.getMapOfCacheRedirects(x)) == null ? void 0 : A.get(ML(m, v))) == null ? void 0 : w.get(S) } function d(m, v, S) { return L.assert(!fl(m)), Bfe(o, S, ML(m, v), g) } function g() { let m = new Map; return { get: v, set: S }; function v(A) { return m.get(Ts(A, e, t)) } function S(A, w) { let C = Ts(A, e, t); if (m.has(C)) return; m.set(C, w); let P = i(w), F = P && x(C, P), B = C; for (; B !== F;) { let q = ni(B); if (q === B || m.has(q)) break; m.set(q, w), B = q } } function x(A, w) { let C = Ts(ni(w), e, t), P = 0, F = Math.min(A.length, C.length); for (; P < F && A.charCodeAt(P) === C.charCodeAt(P);)P++; if (P === A.length && (C.length === P || C[P] === _s)) return A; let B = _p(A); if (P < B) return; let q = A.lastIndexOf(_s, P - 1); if (q !== -1) return A.substr(0, Math.max(q, B)) } } } function Ufe(e, t, r, i, o) { let s = ONe(e, t, r), l = MNe(e, t, r, o); return i ?? (i = RNe(e, t)), { ...i, ...s, ...l, clear: f, update: g, getPackageJsonInfoCache: () => i, clearAllExceptPackageJsonInfoCache: d }; function f() { d(), i.clear() } function d() { s.clear(), l.clear() } function g(m) { s.update(m), l.update(m) } } function Y3(e, t, r) { let i = Ufe(e, t, r, void 0, NNe); return i.getOrCreateCacheForModuleName = (o, s, l) => i.getOrCreateCacheForNonRelativeName(o, s, l), i } function $3(e, t, r, i) { return Ufe(e, t, r, i, PNe) } function FNe(e, t, r, i) { let o = ni(t); return r.getFromDirectoryCache(e, i, o, void 0) } function FL(e, t, r, i, o, s, l) { let f = ov(r, i); s && (r = s.commandLine.options), f && (Xi(i, _.Resolving_module_0_from_1, e, t), s && Xi(i, _.Using_compiler_options_of_project_reference_redirect_0, s.sourceFile.fileName)); let d = ni(t), g = o?.getFromDirectoryCache(e, l, d, s); if (g) f && Xi(i, _.Resolution_for_module_0_was_found_in_cache_from_location_1, e, d); else { let m = r.moduleResolution; if (m === void 0) { switch (Rl(r)) { case 1: m = 2; break; case 100: m = 3; break; case 199: m = 99; break; default: m = 1; break }f && Xi(i, _.Module_resolution_kind_is_not_specified_using_0, rw[m]) } else f && Xi(i, _.Explicitly_specified_module_resolution_kind_Colon_0, rw[m]); switch (fp.logStartResolveModule(e), m) { case 3: g = VNe(e, t, r, i, o, s, l); break; case 99: g = jNe(e, t, r, i, o, s, l); break; case 2: g = zfe(e, t, r, i, o, s); break; case 1: g = o_e(e, t, r, i, o, s); break; case 100: g = Wfe(e, t, r, i, o, s); break; default: return L.fail(`Unexpected moduleResolution: ${m}`) }g && g.resolvedModule && fp.logInfoEvent(`Module "${e}" resolved to "${g.resolvedModule.resolvedFileName}"`), fp.logStopResolveModule(g && g.resolvedModule ? "" + g.resolvedModule.resolvedFileName : "null"), o?.getOrCreateCacheForDirectory(d, s).set(e, l, g), fl(e) || o?.getOrCreateCacheForNonRelativeName(e, l, s).set(d, g) } return f && (g.resolvedModule ? g.resolvedModule.packageId ? Xi(i, _.Module_name_0_was_successfully_resolved_to_1_with_Package_ID_2, e, g.resolvedModule.resolvedFileName, hT(g.resolvedModule.packageId)) : Xi(i, _.Module_name_0_was_successfully_resolved_to_1, e, g.resolvedModule.resolvedFileName) : Xi(i, _.Module_name_0_was_not_resolved, e)), g } function Vfe(e, t, r, i, o) { let s = GNe(e, t, i, o); return s ? s.value : fl(t) ? BNe(e, t, r, i, o) : UNe(e, t, i, o) } function GNe(e, t, r, i) { var o; let { baseUrl: s, paths: l, configFile: f } = i.compilerOptions; if (l && !Jd(t)) { i.traceEnabled && (s && Xi(i.host, _.baseUrl_option_is_set_to_0_using_this_value_to_resolve_non_relative_module_name_1, s, t), Xi(i.host, _.paths_option_is_specified_looking_for_a_pattern_to_match_module_name_0, t)); let d = ZH(i.compilerOptions, i.host), g = f?.configFileSpecs ? (o = f.configFileSpecs).pathPatterns || (o.pathPatterns = g4(l)) : void 0; return nK(e, t, d, l, g, r, !1, i) } } function BNe(e, t, r, i, o) { if (!o.compilerOptions.rootDirs) return; o.traceEnabled && Xi(o.host, _.rootDirs_option_is_set_using_it_to_resolve_relative_module_name_0, t); let s = So(vi(r, t)), l, f; for (let d of o.compilerOptions.rootDirs) { let g = So(d); Oc(g, _s) || (g += _s); let m = na(s, g) && (f === void 0 || f.length < g.length); o.traceEnabled && Xi(o.host, _.Checking_if_0_is_the_longest_matching_prefix_for_1_2, g, s, m), m && (f = g, l = d) } if (f) { o.traceEnabled && Xi(o.host, _.Longest_matching_prefix_for_0_is_1, s, f); let d = s.substr(f.length); o.traceEnabled && Xi(o.host, _.Loading_0_from_the_root_dir_1_candidate_location_2, d, f, s); let g = i(e, s, !gp(r, o.host), o); if (g) return g; o.traceEnabled && Xi(o.host, _.Trying_other_entries_in_rootDirs); for (let m of o.compilerOptions.rootDirs) { if (m === l) continue; let v = vi(So(m), d); o.traceEnabled && Xi(o.host, _.Loading_0_from_the_root_dir_1_candidate_location_2, d, m, v); let S = ni(v), x = i(e, v, !gp(S, o.host), o); if (x) return x } o.traceEnabled && Xi(o.host, _.Module_resolution_using_rootDirs_has_failed) } } function UNe(e, t, r, i) { let { baseUrl: o } = i.compilerOptions; if (!o) return; i.traceEnabled && Xi(i.host, _.baseUrl_option_is_set_to_0_using_this_value_to_resolve_non_relative_module_name_1, o, t); let s = So(vi(o, t)); return i.traceEnabled && Xi(i.host, _.Resolving_module_name_0_relative_to_base_url_1_2, t, o, s), r(e, s, !gp(ni(s), i.host), i) } function jfe(e, t, r) { let { resolvedModule: i, failedLookupLocations: o } = HNe(e, t, r); if (!i) throw new Error(`Could not resolve JS module '${e}' starting at '${t}'. Looked in: ${o?.join(", ")}`); return i.resolvedFileName } function VNe(e, t, r, i, o, s, l) { return Hfe(30, e, t, r, i, o, s, l) } function jNe(e, t, r, i, o, s, l) { return Hfe(30, e, t, r, i, o, s, l) } function Hfe(e, t, r, i, o, s, l, f) { let d = ni(r), g = f === 99 ? 32 : 0, m = i.noDtsResolution ? 3 : 7; return RT(i) && (m |= 8), GL(e | g, t, d, i, o, s, m, !1, l) } function HNe(e, t, r) { return GL(0, e, t, { moduleResolution: 2, allowJs: !0 }, r, void 0, 2, !1, void 0) } function Wfe(e, t, r, i, o, s) { let l = ni(t), f = r.noDtsResolution ? 3 : 7; return RT(r) && (f |= 8), GL(WJ(r), e, l, r, i, o, f, !1, s) } function zfe(e, t, r, i, o, s, l) { let f; return l ? f = 8 : r.noDtsResolution ? (f = 3, RT(r) && (f |= 8)) : f = RT(r) ? 15 : 7, GL(0, e, ni(t), r, i, o, f, !!l, s) } function Jfe(e, t, r) { return GL(8, e, ni(t), { moduleResolution: 99 }, r, void 0, 8, !0, void 0) } function GL(e, t, r, i, o, s, l, f, d) { var g, m, v, S; let x = ov(i, o), A = [], w = [], C = P2(i, !!(e & 32)), P = [], F = { compilerOptions: i, host: o, traceEnabled: x, failedLookupLocations: A, affectingLocations: w, packageJsonInfoCache: s, features: e, conditions: C, requestContainingDirectory: r, reportDiagnostic: Y => void P.push(Y), isConfigLookup: f, candidateIsFromPackageJsonField: !1 }; x && bS($s(i)) && Xi(o, _.Resolving_in_0_mode_with_conditions_1, e & 32 ? "ESM" : "CJS", C.map(Y => `'${Y}'`).join(", ")); let B; if ($s(i) === 2) { let Y = l & 5, R = l & -6; B = Y && W(Y, F) || R && W(R, F) || void 0 } else B = W(l, F); let q; if ((g = B?.value) != null && g.isExternalLibraryImport && !f && l & 5 && e & 8 && !fl(t) && !QJ(5, B.value.resolved.extension) && C.indexOf("import") > -1) { Y0(F, _.Resolution_of_non_relative_name_failed_trying_with_modern_Node_resolution_features_disabled_to_see_if_npm_library_needs_configuration_update); let Y = { ...F, features: F.features & -9, failedLookupLocations: [], affectingLocations: [], reportDiagnostic: Ba }, R = W(l & 5, Y); (m = R?.value) != null && m.isExternalLibraryImport && (q = R.value.resolved.path) } return Pfe(t, (v = B?.value) == null ? void 0 : v.resolved, (S = B?.value) == null ? void 0 : S.isExternalLibraryImport, A, w, P, F, q); function W(Y, R) { let $ = Vfe(Y, t, r, (fe, Z, U, re) => Q3(fe, Z, U, re, !0), R); if ($) return Af({ resolved: $, isExternalLibraryImport: JS($.path) }); if (fl(t)) { let { path: fe, parts: Z } = Kfe(r, t), U = Q3(Y, fe, !1, R, !0); return U && Af({ resolved: U, isExternalLibraryImport: ya(Z, "node_modules") }) } else { let fe; return e & 2 && na(t, "#") && (fe = YNe(Y, t, r, R, s, d)), !fe && e & 4 && (fe = XNe(Y, t, r, R, s, d)), fe || (x && Xi(o, _.Loading_module_0_from_node_modules_folder_target_file_types_Colon_1, t, Ofe(Y)), fe = t_e(Y, t, r, R, s, d)), fe && { value: fe.value && { resolved: fe.value, isExternalLibraryImport: !0 } } } } } function Kfe(e, t) { let r = vi(e, t), i = Ou(r), o = Os(i); return { path: o === "." || o === ".." ? cu(So(r)) : So(r), parts: i } } function WNe(e, t, r) { if (!t.realpath) return e; let i = So(t.realpath(e)); return r && Xi(t, _.Resolving_real_path_for_0_result_1, e, i), L.assert(t.fileExists(i), `${e} linked to nonexistent file ${i}`), i } function Q3(e, t, r, i, o) { if (i.traceEnabled && Xi(i.host, _.Loading_module_as_file_Slash_folder_candidate_module_location_0_target_file_types_Colon_1, t, Ofe(e)), !My(t)) { if (!r) { let l = ni(t); gp(l, i.host) || (i.traceEnabled && Xi(i.host, _.Directory_0_does_not_exist_skipping_all_lookups_in_it, l), r = !0) } let s = BL(e, t, r, i); if (s) { let l = o ? XJ(s.path) : void 0, f = l ? KS(l, !1, i) : void 0; return O2(f, s) } } if (r || gp(t, i.host) || (i.traceEnabled && Xi(i.host, _.Directory_0_does_not_exist_skipping_all_lookups_in_it, t), r = !0), !(i.features & 32)) return Qfe(e, t, r, i, o) } function JS(e) { return jl(e, Wg) } function XJ(e) { let t = So(e), r = t.lastIndexOf(Wg); if (r === -1) return; let i = r + Wg.length, o = qfe(t, i); return t.charCodeAt(i) === 64 && (o = qfe(t, o)), t.slice(0, o) } function qfe(e, t) { let r = e.indexOf(_s, t + 1); return r === -1 ? t : r } function YJ(e, t, r, i) { return J3(BL(e, t, r, i)) } function BL(e, t, r, i) { let o = Xfe(e, t, r, i); if (o) return o; if (!(i.features & 32)) { let s = Yfe(t, e, "", r, i); if (s) return s } } function Xfe(e, t, r, i) { if (Hl(t).indexOf(".") === -1) return; let s = ld(t); s === t && (s = t.substring(0, t.lastIndexOf("."))); let l = t.substring(s.length); return i.traceEnabled && Xi(i.host, _.File_name_0_has_a_1_extension_stripping_it, t, l), Yfe(s, e, l, r, i) } function $J(e, t, r, i) { return e & 1 && $c(t, L4) || e & 4 && $c(t, I4) ? YO(t, r, i) !== void 0 ? { path: t, ext: r4(t), resolvedUsingTsExtension: void 0 } : void 0 : i.isConfigLookup && e === 8 && Gc(t, ".json") ? YO(t, r, i) !== void 0 ? { path: t, ext: ".json", resolvedUsingTsExtension: void 0 } : void 0 : Xfe(e, t, r, i) } function Yfe(e, t, r, i, o) { if (!i) { let l = ni(e); l && (i = !gp(l, o.host)) } switch (r) { case ".mjs": case ".mts": case ".d.mts": return t & 1 && s(".mts", r === ".mts" || r === ".d.mts") || t & 4 && s(".d.mts", r === ".mts" || r === ".d.mts") || t & 2 && s(".mjs") || void 0; case ".cjs": case ".cts": case ".d.cts": return t & 1 && s(".cts", r === ".cts" || r === ".d.cts") || t & 4 && s(".d.cts", r === ".cts" || r === ".d.cts") || t & 2 && s(".cjs") || void 0; case ".json": return t & 4 && s(".d.json.ts") || t & 8 && s(".json") || void 0; case ".tsx": case ".jsx": return t & 1 && (s(".tsx", r === ".tsx") || s(".ts", r === ".tsx")) || t & 4 && s(".d.ts", r === ".tsx") || t & 2 && (s(".jsx") || s(".js")) || void 0; case ".ts": case ".d.ts": case ".js": case "": return t & 1 && (s(".ts", r === ".ts" || r === ".d.ts") || s(".tsx", r === ".ts" || r === ".d.ts")) || t & 4 && s(".d.ts", r === ".ts" || r === ".d.ts") || t & 2 && (s(".js") || s(".jsx")) || o.isConfigLookup && s(".json") || void 0; default: return t & 4 && !Fu(e + r) && s(`.d${r}.ts`) || void 0 }function s(l, f) { let d = YO(e + l, i, o); return d === void 0 ? void 0 : { path: d, ext: l, resolvedUsingTsExtension: !o.candidateIsFromPackageJsonField && f } } } function YO(e, t, r) { var i, o; if (!((i = r.compilerOptions.moduleSuffixes) != null && i.length)) return $fe(e, t, r); let s = (o = Hm(e)) != null ? o : "", l = s ? UR(e, s) : e; return mn(r.compilerOptions.moduleSuffixes, f => $fe(l + f + s, t, r)) } function $fe(e, t, r) { if (!t) { if (r.host.fileExists(e)) return r.traceEnabled && Xi(r.host, _.File_0_exists_use_it_as_a_name_resolution_result, e), e; r.traceEnabled && Xi(r.host, _.File_0_does_not_exist, e) } r.failedLookupLocations.push(e) } function Qfe(e, t, r, i, o = !0) { let s = o ? KS(t, r, i) : void 0, l = s && s.contents.packageJsonContent, f = s && $O(s, i); return O2(s, tF(e, t, r, i, l, f)) } function zNe(e, t, r, i, o) { if (!o && e.contents.resolvedEntrypoints !== void 0) return e.contents.resolvedEntrypoints; let s, l = 5 | (o ? 2 : 0), f = WJ(t), d = Z3(i?.getPackageJsonInfoCache(), r, t); d.conditions = P2(t), d.requestContainingDirectory = e.packageDirectory; let g = tF(l, e.packageDirectory, !1, d, e.contents.packageJsonContent, $O(e, d)); if (s = Sn(s, g?.path), f & 8 && e.contents.packageJsonContent.exports) { let m = fA([P2(t, !0), P2(t, !1)], up); for (let v of m) { let S = { ...d, failedLookupLocations: [], conditions: v }, x = JNe(e, e.contents.packageJsonContent.exports, S, l); if (x) for (let A of x) s = xg(s, A.path) } } return e.contents.resolvedEntrypoints = s || !1 } function JNe(e, t, r, i) { let o; if (ba(t)) for (let l of t) s(l); else if (typeof t == "object" && t !== null && nF(t)) for (let l in t) s(t[l]); else s(t); return o; function s(l) { var f, d; if (typeof l == "string" && na(l, "./") && l.indexOf("*") === -1) { let g = Ou(l).slice(2); if (g.indexOf("..") >= 0 || g.indexOf(".") >= 0 || g.indexOf("node_modules") >= 0) return !1; let m = vi(e.packageDirectory, l), v = _a(m, (d = (f = r.host).getCurrentDirectory) == null ? void 0 : d.call(f)), S = $J(i, v, !1, r); if (S) return o = xg(o, S, (x, A) => x.path === A.path), !0 } else if (Array.isArray(l)) { for (let g of l) if (s(g)) return !0 } else if (typeof l == "object" && l !== null) return mn(bh(l), g => { if (g === "default" || ya(r.conditions, g) || QO(r.conditions, g)) return s(l[g]), !0 }) } } function Z3(e, t, r) { return { host: t, compilerOptions: r, traceEnabled: ov(r, t), failedLookupLocations: E8, affectingLocations: E8, packageJsonInfoCache: e, features: 0, conditions: Je, requestContainingDirectory: void 0, reportDiagnostic: Ba, isConfigLookup: !1, candidateIsFromPackageJsonField: !1 } } function eF(e, t) { let r = Ou(e); for (r.pop(); r.length > 0;) { let i = KS(T0(r), !1, t); if (i) return i; r.pop() } } function $O(e, t) { return e.contents.versionPaths === void 0 && (e.contents.versionPaths = LNe(e.contents.packageJsonContent, t) || !1), e.contents.versionPaths || void 0 } function KS(e, t, r) { var i, o, s; let { host: l, traceEnabled: f } = r, d = vi(e, "package.json"); if (t) { r.failedLookupLocations.push(d); return } let g = (i = r.packageJsonInfoCache) == null ? void 0 : i.getPackageJsonInfo(d); if (g !== void 0) { if (typeof g != "boolean") return f && Xi(l, _.File_0_exists_according_to_earlier_cached_lookups, d), r.affectingLocations.push(d), g.packageDirectory === e ? g : { packageDirectory: e, contents: g.contents }; g && f && Xi(l, _.File_0_does_not_exist_according_to_earlier_cached_lookups, d), r.failedLookupLocations.push(d); return } let m = gp(e, l); if (m && l.fileExists(d)) { let v = JI(d, l); f && Xi(l, _.Found_package_json_at_0, d); let S = { packageDirectory: e, contents: { packageJsonContent: v, versionPaths: void 0, resolvedEntrypoints: void 0 } }; return (o = r.packageJsonInfoCache) == null || o.setPackageJsonInfo(d, S), r.affectingLocations.push(d), S } else m && f && Xi(l, _.File_0_does_not_exist, d), (s = r.packageJsonInfoCache) == null || s.setPackageJsonInfo(d, m), r.failedLookupLocations.push(d) } function tF(e, t, r, i, o, s) { let l; o && (i.isConfigLookup ? l = ANe(o, t, i) : l = e & 4 && xNe(o, t, i) || e & 7 && CNe(o, t, i) || void 0); let f = (S, x, A, w) => { let C = YO(x, A, w); if (C) { let W = KNe(S, C); if (W) return J3(W); w.traceEnabled && Xi(w.host, _.File_0_has_an_unsupported_extension_so_skipping_it, C) } let P = S === 4 ? 5 : S, F = w.features, B = w.candidateIsFromPackageJsonField; w.candidateIsFromPackageJsonField = !0, o?.type !== "module" && (w.features &= -33); let q = Q3(P, x, A, w, !1); return w.features = F, w.candidateIsFromPackageJsonField = B, q }, d = l ? !gp(ni(l), i.host) : void 0, g = r || !gp(t, i.host), m = vi(t, i.isConfigLookup ? "tsconfig" : "index"); if (s && (!l || Gy(t, l))) { let S = Xp(t, l || m, !1); i.traceEnabled && Xi(i.host, _.package_json_has_a_typesVersions_entry_0_that_matches_compiler_version_1_looking_for_a_pattern_to_match_module_name_2, s.version, Rf, S); let x = nK(e, S, t, s.paths, void 0, f, d || g, i); if (x) return Rfe(x.value) } let v = l && Rfe(f(e, l, d, i)); if (v) return v; if (!(i.features & 32)) return BL(e, m, g, i) } function KNe(e, t, r) { let i = Hm(t); return i !== void 0 && QJ(e, i) ? { path: t, ext: i, resolvedUsingTsExtension: r } : void 0 } function QJ(e, t) { return e & 2 && (t === ".js" || t === ".jsx" || t === ".mjs" || t === ".cjs") || e & 1 && (t === ".ts" || t === ".tsx" || t === ".mts" || t === ".cts") || e & 4 && (t === ".d.ts" || t === ".d.mts" || t === ".d.cts") || e & 8 && t === ".json" || !1 } function ZJ(e) { let t = e.indexOf(_s); return e[0] === "@" && (t = e.indexOf(_s, t + 1)), t === -1 ? { packageName: e, rest: "" } : { packageName: e.slice(0, t), rest: e.slice(t + 1) } } function nF(e) { return Ji(bh(e), t => na(t, ".")) } function qNe(e) { return !vt(bh(e), t => na(t, ".")) } function XNe(e, t, r, i, o, s) { var l, f; let d = _a(vi(r, "dummy"), (f = (l = i.host).getCurrentDirectory) == null ? void 0 : f.call(l)), g = eF(d, i); if (!g || !g.contents.packageJsonContent.exports || typeof g.contents.packageJsonContent.name != "string") return; let m = Ou(t), v = Ou(g.contents.packageJsonContent.name); if (!Ji(v, (C, P) => m[P] === C)) return; let S = m.slice(v.length), x = Fn(S) ? `.${_s}${S.join(_s)}` : ".", A = e & 5, w = e & -6; return eK(g, A, x, i, o, s) || eK(g, w, x, i, o, s) } function eK(e, t, r, i, o, s) { if (e.contents.packageJsonContent.exports) { if (r === ".") { let l; if (typeof e.contents.packageJsonContent.exports == "string" || Array.isArray(e.contents.packageJsonContent.exports) || typeof e.contents.packageJsonContent.exports == "object" && qNe(e.contents.packageJsonContent.exports) ? l = e.contents.packageJsonContent.exports : fs(e.contents.packageJsonContent.exports, ".") && (l = e.contents.packageJsonContent.exports["."]), l) return e_e(t, i, o, s, r, e, !1)(l, "", !1, ".") } else if (nF(e.contents.packageJsonContent.exports)) { if (typeof e.contents.packageJsonContent.exports != "object") return i.traceEnabled && Xi(i.host, _.Export_specifier_0_does_not_exist_in_package_json_scope_at_path_1, r, e.packageDirectory), Af(void 0); let l = Zfe(t, i, o, s, r, e.contents.packageJsonContent.exports, e, !1); if (l) return l } return i.traceEnabled && Xi(i.host, _.Export_specifier_0_does_not_exist_in_package_json_scope_at_path_1, r, e.packageDirectory), Af(void 0) } } function YNe(e, t, r, i, o, s) { var l, f; if (t === "#" || na(t, "#/")) return i.traceEnabled && Xi(i.host, _.Invalid_import_specifier_0_has_no_possible_resolutions, t), Af(void 0); let d = _a(vi(r, "dummy"), (f = (l = i.host).getCurrentDirectory) == null ? void 0 : f.call(l)), g = eF(d, i); if (!g) return i.traceEnabled && Xi(i.host, _.Directory_0_has_no_containing_package_json_scope_Imports_will_not_resolve, d), Af(void 0); if (!g.contents.packageJsonContent.imports) return i.traceEnabled && Xi(i.host, _.package_json_scope_0_has_no_imports_defined, g.packageDirectory), Af(void 0); let m = Zfe(e, i, o, s, t, g.contents.packageJsonContent.imports, g, !0); return m || (i.traceEnabled && Xi(i.host, _.Import_specifier_0_does_not_exist_in_package_json_scope_at_path_1, t, g.packageDirectory), Af(void 0)) } function tK(e, t) { let r = e.indexOf("*"), i = t.indexOf("*"), o = r === -1 ? e.length : r + 1, s = i === -1 ? t.length : i + 1; return o > s ? -1 : s > o || r === -1 ? 1 : i === -1 || e.length > t.length ? -1 : t.length > e.length ? 1 : 0 } function Zfe(e, t, r, i, o, s, l, f) { let d = e_e(e, t, r, i, o, l, f); if (!Oc(o, _s) && o.indexOf("*") === -1 && fs(s, o)) { let v = s[o]; return d(v, "", !1, o) } let g = XC(Pr(bh(s), v => v.indexOf("*") !== -1 || Oc(v, "/")), tK); for (let v of g) if (t.features & 16 && m(v, o)) { let S = s[v], x = v.indexOf("*"), A = o.substring(v.substring(0, x).length, o.length - (v.length - 1 - x)); return d(S, A, !0, v) } else if (Oc(v, "*") && na(o, v.substring(0, v.length - 1))) { let S = s[v], x = o.substring(v.length - 1); return d(S, x, !0, v) } else if (na(o, v)) { let S = s[v], x = o.substring(v.length); return d(S, x, !1, v) } function m(v, S) { if (Oc(v, "*")) return !1; let x = v.indexOf("*"); return x === -1 ? !1 : na(S, v.substring(0, x)) && Oc(S, v.substring(x + 1)) } } function e_e(e, t, r, i, o, s, l) { return f; function f(d, g, m, v) { if (typeof d == "string") { if (!m && g.length > 0 && !Oc(d, "/")) return t.traceEnabled && Xi(t.host, _.package_json_scope_0_has_invalid_type_for_target_of_specifier_1, s.packageDirectory, o), Af(void 0); if (!na(d, "./")) { if (l && !na(d, "../") && !na(d, "/") && !qp(d)) { let Y = m ? d.replace(/\*/g, g) : d + g; Y0(t, _.Using_0_subpath_1_with_target_2, "imports", v, Y), Y0(t, _.Resolving_module_0_from_1, Y, s.packageDirectory + "/"); let R = GL(t.features, Y, s.packageDirectory + "/", t.compilerOptions, t.host, r, e, !1, i); return Af(R.resolvedModule ? { path: R.resolvedModule.resolvedFileName, extension: R.resolvedModule.extension, packageId: R.resolvedModule.packageId, originalPath: R.resolvedModule.originalPath, resolvedUsingTsExtension: R.resolvedModule.resolvedUsingTsExtension } : void 0) } return t.traceEnabled && Xi(t.host, _.package_json_scope_0_has_invalid_type_for_target_of_specifier_1, s.packageDirectory, o), Af(void 0) } let P = (Jd(d) ? Ou(d).slice(1) : Ou(d)).slice(1); if (P.indexOf("..") >= 0 || P.indexOf(".") >= 0 || P.indexOf("node_modules") >= 0) return t.traceEnabled && Xi(t.host, _.package_json_scope_0_has_invalid_type_for_target_of_specifier_1, s.packageDirectory, o), Af(void 0); let F = vi(s.packageDirectory, d), B = Ou(g); if (B.indexOf("..") >= 0 || B.indexOf(".") >= 0 || B.indexOf("node_modules") >= 0) return t.traceEnabled && Xi(t.host, _.package_json_scope_0_has_invalid_type_for_target_of_specifier_1, s.packageDirectory, o), Af(void 0); t.traceEnabled && Xi(t.host, _.Using_0_subpath_1_with_target_2, l ? "imports" : "exports", v, m ? d.replace(/\*/g, g) : d + g); let q = S(m ? F.replace(/\*/g, g) : F + g), W = w(q, g, vi(s.packageDirectory, "package.json"), l); return W || Af(O2(s, $J(e, q, !1, t))) } else if (typeof d == "object" && d !== null) if (Array.isArray(d)) { if (!Fn(d)) return t.traceEnabled && Xi(t.host, _.package_json_scope_0_has_invalid_type_for_target_of_specifier_1, s.packageDirectory, o), Af(void 0); for (let C of d) { let P = f(C, g, m, v); if (P) return P } } else { Y0(t, _.Entering_conditional_exports); for (let C of bh(d)) if (C === "default" || t.conditions.indexOf(C) >= 0 || QO(t.conditions, C)) { Y0(t, _.Matched_0_condition_1, l ? "imports" : "exports", C); let P = d[C], F = f(P, g, m, v); if (F) return Y0(t, _.Resolved_under_condition_0, C), Y0(t, _.Exiting_conditional_exports), F; Y0(t, _.Failed_to_resolve_under_condition_0, C) } else Y0(t, _.Saw_non_matching_condition_0, C); Y0(t, _.Exiting_conditional_exports); return } else if (d === null) return t.traceEnabled && Xi(t.host, _.package_json_scope_0_explicitly_maps_specifier_1_to_null, s.packageDirectory, o), Af(void 0); return t.traceEnabled && Xi(t.host, _.package_json_scope_0_has_invalid_type_for_target_of_specifier_1, s.packageDirectory, o), Af(void 0); function S(C) { var P, F; return C === void 0 ? C : _a(C, (F = (P = t.host).getCurrentDirectory) == null ? void 0 : F.call(P)) } function x(C, P) { return cu(vi(C, P)) } function A() { return t.host.useCaseSensitiveFileNames ? typeof t.host.useCaseSensitiveFileNames == "boolean" ? t.host.useCaseSensitiveFileNames : t.host.useCaseSensitiveFileNames() : !0 } function w(C, P, F, B) { var q, W, Y, R; if (!t.isConfigLookup && (t.compilerOptions.declarationDir || t.compilerOptions.outDir) && C.indexOf("/node_modules/") === -1 && (!t.compilerOptions.configFile || Gy(s.packageDirectory, S(t.compilerOptions.configFile.fileName), !A()))) { let $ = lb({ useCaseSensitiveFileNames: A }), fe = []; if (t.compilerOptions.rootDir || t.compilerOptions.composite && t.compilerOptions.configFilePath) { let Z = S(uN(t.compilerOptions, () => [], ((W = (q = t.host).getCurrentDirectory) == null ? void 0 : W.call(q)) || "", $)); fe.push(Z) } else if (t.requestContainingDirectory) { let Z = S(vi(t.requestContainingDirectory, "index.ts")), U = S(uN(t.compilerOptions, () => [Z, S(F)], ((R = (Y = t.host).getCurrentDirectory) == null ? void 0 : R.call(Y)) || "", $)); fe.push(U); let re = cu(U); for (; re && re.length > 1;) { let le = Ou(re); le.pop(); let _e = T0(le); fe.unshift(_e), re = cu(_e) } } fe.length > 1 && t.reportDiagnostic(ps(B ? _.The_project_root_is_ambiguous_but_is_required_to_resolve_import_map_entry_0_in_file_1_Supply_the_rootDir_compiler_option_to_disambiguate : _.The_project_root_is_ambiguous_but_is_required_to_resolve_export_map_entry_0_in_file_1_Supply_the_rootDir_compiler_option_to_disambiguate, P === "" ? "." : P, F)); for (let Z of fe) { let U = ie(Z); for (let re of U) if (Gy(re, C, !A())) { let le = C.slice(re.length + 1), _e = vi(Z, le), ge = [".mjs", ".cjs", ".js", ".json", ".d.mts", ".d.cts", ".d.ts"]; for (let X of ge) if (Gc(_e, X)) { let Ve = Oce(_e); for (let we of Ve) { if (!QJ(e, we)) continue; let ke = uj(_e, we, X, !A()); if (t.host.fileExists(ke)) return Af(O2(s, $J(e, ke, !1, t))) } } } } } return; function ie($) { var fe, Z; let U = t.compilerOptions.configFile ? ((Z = (fe = t.host).getCurrentDirectory) == null ? void 0 : Z.call(fe)) || "" : $, re = []; return t.compilerOptions.declarationDir && re.push(S(x(U, t.compilerOptions.declarationDir))), t.compilerOptions.outDir && t.compilerOptions.outDir !== t.compilerOptions.declarationDir && re.push(S(x(U, t.compilerOptions.outDir))), re } } } } function QO(e, t) { if (e.indexOf("types") === -1 || !na(t, "types@")) return !1; let r = mA.tryParse(t.substring(6)); return r ? r.test(Rf) : !1 } function t_e(e, t, r, i, o, s) { return n_e(e, t, r, i, !1, o, s) } function $Ne(e, t, r) { return n_e(4, e, t, r, !0, void 0, void 0) } function n_e(e, t, r, i, o, s, l) { let f = i.features === 0 ? void 0 : i.features & 32 ? 99 : 1, d = e & 5, g = e & -6; if (d) { let v = m(d); if (v) return v } if (g && !o) return m(g); function m(v) { return Th(Al(r), S => { if (Hl(S) !== "node_modules") { let x = a_e(s, t, f, S, l, i); return x || Af(r_e(v, t, S, i, o, s, l)) } }) } } function r_e(e, t, r, i, o, s, l) { let f = vi(r, "node_modules"), d = gp(f, i.host); if (!d && i.traceEnabled && Xi(i.host, _.Directory_0_does_not_exist_skipping_all_lookups_in_it, f), !o) { let g = i_e(e, t, f, d, i, s, l); if (g) return g } if (e & 4) { let g = vi(f, "@types"), m = d; return d && !gp(g, i.host) && (i.traceEnabled && Xi(i.host, _.Directory_0_does_not_exist_skipping_all_lookups_in_it, g), m = !1), i_e(4, QNe(t, i), g, m, i, s, l) } } function i_e(e, t, r, i, o, s, l) { var f, d, g; let m = So(vi(r, t)), { packageName: v, rest: S } = ZJ(t), x = vi(r, v), A, w = KS(m, !i, o); if (S !== "" && w && (!(o.features & 8) || !fs((d = (f = A = KS(x, !i, o)) == null ? void 0 : f.contents.packageJsonContent) != null ? d : Je, "exports"))) { let F = BL(e, m, !i, o); if (F) return J3(F); let B = tF(e, m, !i, o, w.contents.packageJsonContent, $O(w, o)); return O2(w, B) } let C = (F, B, q, W) => { let Y = BL(F, B, q, W) || tF(F, B, q, W, w && w.contents.packageJsonContent, w && $O(w, W)); return !Y && w && (w.contents.packageJsonContent.exports === void 0 || w.contents.packageJsonContent.exports === null) && W.features & 32 && (Y = BL(F, vi(B, "index.js"), q, W)), O2(w, Y) }; if (S !== "" && (w = A ?? KS(x, !i, o)), w && w.contents.packageJsonContent.exports && o.features & 8) return (g = eK(w, e, vi(".", S), o, s, l)) == null ? void 0 : g.value; let P = S !== "" && w ? $O(w, o) : void 0; if (P) { o.traceEnabled && Xi(o.host, _.package_json_has_a_typesVersions_entry_0_that_matches_compiler_version_1_looking_for_a_pattern_to_match_module_name_2, P.version, Rf, S); let F = i && gp(x, o.host), B = nK(e, S, x, P.paths, void 0, C, !F, o); if (B) return B.value } return C(e, m, !i, o) } function nK(e, t, r, i, o, s, l, f) { o || (o = g4(i)); let d = NW(o, t); if (d) { let g = Ta(d) ? void 0 : Dae(d, t), m = Ta(d) ? d : kae(d); return f.traceEnabled && Xi(f.host, _.Module_name_0_matched_pattern_1, t, m), { value: mn(i[m], S => { let x = g ? S.replace("*", g) : S, A = So(vi(r, x)); f.traceEnabled && Xi(f.host, _.Trying_substitution_0_candidate_module_location_Colon_1, S, x); let w = Hm(S); if (w !== void 0) { let C = YO(A, l, f); if (C !== void 0) return J3({ path: C, ext: w, resolvedUsingTsExtension: void 0 }) } return s(e, A, l || !gp(ni(A), f.host), f) }) } } } function QNe(e, t) { let r = UL(e); return t.traceEnabled && r !== e && Xi(t.host, _.Scoped_package_detected_looking_in_0, r), r } function rF(e) { return `@types/${UL(e)}` } function UL(e) { if (na(e, "@")) { let t = e.replace(_s, aF); if (t !== e) return t.slice(1) } return e } function ZO(e) { let t = QC(e, "@types/"); return t !== e ? iF(t) : e } function iF(e) { return jl(e, aF) ? "@" + e.replace(aF, _s) : e } function a_e(e, t, r, i, o, s) { let l = e && e.getFromNonRelativeNameCache(t, r, i, o); if (l) return s.traceEnabled && Xi(s.host, _.Resolution_for_module_0_was_found_in_cache_from_location_1, t, i), s.resultFromCache = l, { value: l.resolvedModule && { path: l.resolvedModule.resolvedFileName, originalPath: l.resolvedModule.originalPath || !0, extension: l.resolvedModule.extension, packageId: l.resolvedModule.packageId, resolvedUsingTsExtension: l.resolvedModule.resolvedUsingTsExtension } } } function o_e(e, t, r, i, o, s) { let l = ov(r, i), f = [], d = [], g = ni(t), m = [], v = { compilerOptions: r, host: i, traceEnabled: l, failedLookupLocations: f, affectingLocations: d, packageJsonInfoCache: o, features: 0, conditions: [], requestContainingDirectory: g, reportDiagnostic: A => void m.push(A), isConfigLookup: !1, candidateIsFromPackageJsonField: !1 }, S = x(5) || x(2 | (r.resolveJsonModule ? 8 : 0)); return Pfe(e, S && S.value, S?.value && JS(S.value.path), f, d, m, v); function x(A) { let w = Vfe(A, e, g, YJ, v); if (w) return { value: w }; if (fl(e)) { let C = So(vi(g, e)); return Af(YJ(A, C, !1, v)) } else { let C = Th(g, P => { let F = a_e(o, e, void 0, P, s, v); if (F) return F; let B = So(vi(P, e)); return Af(YJ(A, B, !1, v)) }); if (C) return C; if (A & 5) return $Ne(e, g, v) } } } function VL(e, t) { return !!e.allowImportingTsExtensions || t && Fu(t) } function s_e(e, t, r, i, o, s) { let l = ov(r, i); l && Xi(i, _.Auto_discovery_for_typings_is_enabled_in_project_0_Running_extra_resolution_pass_for_module_1_using_cache_location_2, t, e, o); let f = [], d = [], g = [], m = { compilerOptions: r, host: i, traceEnabled: l, failedLookupLocations: f, affectingLocations: d, packageJsonInfoCache: s, features: 0, conditions: [], requestContainingDirectory: void 0, reportDiagnostic: S => void g.push(S), isConfigLookup: !1, candidateIsFromPackageJsonField: !1 }, v = r_e(4, e, o, m, !1, void 0, void 0); return Mfe(v, !0, f, d, g, m.resultFromCache) } function Af(e) { return e !== void 0 ? { value: e } : void 0 } function Y0(e, t, ...r) { e.traceEnabled && Xi(e.host, t, ...r) } var rK, iK, aK, Wg, aF, ZNe = gt({ "src/compiler/moduleNameResolver.ts"() { "use strict"; fa(), iK = vi("node_modules", "@types"), aK = (e => (e[e.None = 0] = "None", e[e.Imports = 2] = "Imports", e[e.SelfName = 4] = "SelfName", e[e.Exports = 8] = "Exports", e[e.ExportsPatternTrailers = 16] = "ExportsPatternTrailers", e[e.AllFeatures = 30] = "AllFeatures", e[e.Node16Default = 30] = "Node16Default", e[e.NodeNextDefault = 30] = "NodeNextDefault", e[e.BundlerDefault = 30] = "BundlerDefault", e[e.EsmMode = 32] = "EsmMode", e))(aK || {}), Wg = "/node_modules/", aF = "__" } }); function Gh(e, t) { return e.body && !e.body.parent && (go(e.body, e), Zy(e.body, !1)), e.body ? oK(e.body, t) : 1 } function oK(e, t = new Map) { let r = zo(e); if (t.has(r)) return t.get(r) || 0; t.set(r, void 0); let i = ePe(e, t); return t.set(r, i), i } function ePe(e, t) { switch (e.kind) { case 261: case 262: return 0; case 263: if (R0(e)) return 2; break; case 269: case 268: if (!Mr(e, 1)) return 0; break; case 275: let r = e; if (!r.moduleSpecifier && r.exportClause && r.exportClause.kind === 276) { let i = 0; for (let o of r.exportClause.elements) { let s = tPe(o, t); if (s > i && (i = s), i === 1) return i } return i } break; case 265: { let i = 0; return pa(e, o => { let s = oK(o, t); switch (s) { case 0: return; case 2: i = 2; return; case 1: return i = 1, !0; default: L.assertNever(s) } }), i } case 264: return Gh(e, t); case 79: if (e.flags & 2048) return 0 }return 1 } function tPe(e, t) { let r = e.propertyName || e.name, i = e.parent; for (; i;) { if (Va(i) || Tp(i) || Li(i)) { let o = i.statements, s; for (let l of o) if (xw(l, r)) { l.parent || (go(l, i), Zy(l, !1)); let f = oK(l, t); if ((s === void 0 || f > s) && (s = f), s === 1) return s } if (s !== void 0) return s } i = i.parent } return 1 } function zT(e) { return L.attachFlowNodeDebugInfo(e), e } function c_e(e, t) { Fs("beforeBind"), fp.logStartBindFile("" + e.fileName), d_e(e, t), fp.logStopBindFile(), Fs("afterBind"), hf("Bind", "beforeBind", "afterBind") } function nPe() { var e, t, r, i, o, s, l, f, d, g, m, v, S, x, A, w, C, P, F, B, q, W, Y = !1, R = 0, ie, $, fe = { flags: 1 }, Z = { flags: 1 }, U = Ot(); return le; function re(M, He, Nt, Pn, la) { return Nu(Gn(M) || e, M, He, Nt, Pn, la) } function le(M, He) { var Nt, Pn; e = M, t = He, r = Do(t), W = _e(e, He), $ = new Set, R = 0, ie = ml.getSymbolConstructor(), L.attachFlowNodeDebugInfo(fe), L.attachFlowNodeDebugInfo(Z), e.locals || ((Nt = ai) == null || Nt.push(ai.Phase.Bind, "bindSourceFile", { path: e.path }, !0), ft(e), (Pn = ai) == null || Pn.pop(), e.symbolCount = R, e.classifiableNames = $, hc()), e = void 0, t = void 0, r = void 0, i = void 0, o = void 0, s = void 0, l = void 0, f = void 0, d = void 0, g = !1, m = void 0, v = void 0, S = void 0, x = void 0, A = void 0, w = void 0, C = void 0, F = void 0, B = !1, Y = !1, q = 0 } function _e(M, He) { return Uf(He, "alwaysStrict") && !M.isDeclarationFile ? !0 : !!M.externalModuleIndicator } function ge(M, He) { return R++, new ie(M, He) } function X(M, He, Nt) { M.flags |= Nt, He.symbol = M, M.declarations = xg(M.declarations, He), Nt & 1955 && !M.exports && (M.exports = Ua()), Nt & 6240 && !M.members && (M.members = Ua()), M.constEnumOnlyModule && M.flags & 304 && (M.constEnumOnlyModule = !1), Nt & 111551 && rR(M, He) } function Ve(M) { if (M.kind === 274) return M.isExportEquals ? "export=" : "default"; let He = sa(M); if (He) { if (lu(M)) { let Nt = l_(He); return mp(M) ? "__global" : `"${Nt}"` } if (He.kind === 164) { let Nt = He.expression; if (yf(Nt)) return Bs(Nt.text); if (X6(Nt)) return Xa(Nt.operator) + Nt.operand.text; L.fail("Only computed properties with literal names have declaration names") } if (pi(He)) { let Nt = Zc(M); if (!Nt) return; let Pn = Nt.symbol; return hR(Pn, He.escapedText) } return c_(He) ? MI(He) : void 0 } switch (M.kind) { case 173: return "__constructor"; case 181: case 176: case 326: return "__call"; case 182: case 177: return "__new"; case 178: return "__index"; case 275: return "__export"; case 308: return "export="; case 223: if (ic(M) === 2) return "export="; L.fail("Unknown binary declaration kind"); break; case 320: return jA(M) ? "__new" : "__call"; case 166: return L.assert(M.parent.kind === 320, "Impossible parameter parent kind", () => `parent is: ${L.formatSyntaxKind(M.parent.kind)}, expected JSDocFunctionType`), "arg" + M.parent.parameters.indexOf(M) } } function we(M) { return zl(M) ? os(M.name) : Gi(L.checkDefined(Ve(M))) } function ke(M, He, Nt, Pn, la, oa, be) { L.assert(be || !Xy(Nt)); let De = Mr(Nt, 1024) || Mu(Nt) && Nt.name.escapedText === "default", mt = be ? "__computed" : De && He ? "default" : Ve(Nt), St; if (mt === void 0) St = ge(0, "__missing"); else if (St = M.get(mt), Pn & 2885600 && $.add(mt), !St) M.set(mt, St = ge(0, mt)), oa && (St.isReplaceableByMethod = !0); else { if (oa && !St.isReplaceableByMethod) return St; if (St.flags & la) { if (St.isReplaceableByMethod) M.set(mt, St = ge(0, mt)); else if (!(Pn & 3 && St.flags & 67108864)) { zl(Nt) && go(Nt.name, Nt); let Zt = St.flags & 2 ? _.Cannot_redeclare_block_scoped_variable_0 : _.Duplicate_identifier_0, rn = !0; (St.flags & 384 || Pn & 384) && (Zt = _.Enum_declarations_can_only_merge_with_namespace_or_other_enum_declarations, rn = !1); let sn = !1; Fn(St.declarations) && (De || St.declarations && St.declarations.length && Nt.kind === 274 && !Nt.isExportEquals) && (Zt = _.A_module_cannot_have_multiple_default_exports, rn = !1, sn = !0); let Dn = []; Ep(Nt) && rc(Nt.type) && Mr(Nt, 1) && St.flags & 2887656 && Dn.push(re(Nt, _.Did_you_mean_0, `export type { ${Gi(Nt.name.escapedText)} }`)); let kr = sa(Nt) || Nt; mn(St.declarations, (Vn, $t) => { let Xn = sa(Vn) || Vn, ra = re(Xn, Zt, rn ? we(Vn) : void 0); e.bindDiagnostics.push(sn ? Ao(ra, re(kr, $t === 0 ? _.Another_export_default_is_here : _.and_here)) : ra), sn && Dn.push(re(Xn, _.The_first_export_default_is_here)) }); let ki = re(kr, Zt, rn ? we(Nt) : void 0); e.bindDiagnostics.push(Ao(ki, ...Dn)), St = ge(0, mt) } } } return X(St, Nt, Pn), St.parent ? L.assert(St.parent === He, "Existing symbol parent should match new one") : St.parent = He, St } function Pe(M, He, Nt) { let Pn = !!(wg(M) & 1) || Ce(M); if (He & 2097152) return M.kind === 278 || M.kind === 268 && Pn ? ke(o.symbol.exports, o.symbol, M, He, Nt) : (L.assertNode(o, Qp), ke(o.locals, void 0, M, He, Nt)); if (Ff(M) && L.assert(Yn(M)), !lu(M) && (Pn || o.flags & 64)) { if (!Qp(o) || !o.locals || Mr(M, 1024) && !Ve(M)) return ke(o.symbol.exports, o.symbol, M, He, Nt); let la = He & 111551 ? 1048576 : 0, oa = ke(o.locals, void 0, M, la, Nt); return oa.exportSymbol = ke(o.symbol.exports, o.symbol, M, He, Nt), M.localSymbol = oa, oa } else return L.assertNode(o, Qp), ke(o.locals, void 0, M, He, Nt) } function Ce(M) { if (M.parent && Tc(M) && (M = M.parent), !Ff(M)) return !1; if (!vO(M) && M.fullName) return !0; let He = sa(M); return He ? !!(LR(He.parent) && Vr(He.parent) || Kl(He.parent) && wg(He.parent) & 1) : !1 } function Ie(M, He) { let Nt = o, Pn = s, la = l; if (He & 1 ? (M.kind !== 216 && (s = o), o = l = M, He & 32 && (o.locals = Ua(), Za(o))) : He & 2 && (l = M, He & 32 && (l.locals = void 0)), He & 4) { let oa = m, be = v, De = S, mt = x, St = C, Zt = F, rn = B, sn = He & 16 && !Mr(M, 512) && !M.asteriskToken && !!ET(M) || M.kind === 172; sn || (m = zT({ flags: 2 }), He & 144 && (m.node = M)), x = sn || M.kind === 173 || Yn(M) && (M.kind === 259 || M.kind === 215) ? tn() : void 0, C = void 0, v = void 0, S = void 0, F = void 0, B = !1, Ye(M), M.flags &= -2817, !(m.flags & 1) && He & 8 && Pf(M.body) && (M.flags |= 256, B && (M.flags |= 512), M.endFlowNode = m), M.kind === 308 && (M.flags |= q, M.endFlowNode = m), x && ($n(x, m), m = pt(x), (M.kind === 173 || M.kind === 172 || Yn(M) && (M.kind === 259 || M.kind === 215)) && (M.returnFlowNode = m)), sn || (m = oa), v = be, S = De, x = mt, C = St, F = Zt, B = rn } else He & 64 ? (g = !1, Ye(M), L.assertNotNode(M, Re), M.flags = g ? M.flags | 128 : M.flags & -129) : Ye(M); o = Nt, s = Pn, l = la } function Be(M) { Ne(M, He => He.kind === 259 ? ft(He) : void 0), Ne(M, He => He.kind !== 259 ? ft(He) : void 0) } function Ne(M, He = ft) { M !== void 0 && mn(M, He) } function Le(M) { pa(M, ft, Ne) } function Ye(M) { let He = Y; if (Y = !1, Y_(M)) { Le(M), Yt(M), Y = He; return } switch (M.kind >= 240 && M.kind <= 256 && !t.allowUnreachableCode && (M.flowNode = m), M.kind) { case 244: Ht(M); break; case 243: En(M); break; case 245: dr(M); break; case 246: case 247: Cr(M); break; case 242: Se(M); break; case 250: case 254: at(M); break; case 249: case 248: nt(M); break; case 255: ce(M); break; case 252: Q(M); break; case 266: ue(M); break; case 292: G(M); break; case 241: Oe(M); break; case 253: Ge(M); break; case 221: ir(M); break; case 222: ae(M); break; case 223: if (Fg(M)) { Y = He, rt(M); return } U(M); break; case 217: Ke(M); break; case 224: oe(M); break; case 257: z(M); break; case 208: case 209: Si(M); break; case 210: Ja(M); break; case 232: Kr(M); break; case 349: case 341: case 343: lt(M); break; case 308: { Be(M.statements), ft(M.endOfFileToken); break } case 238: case 265: Be(M.statements); break; case 205: Te(M); break; case 166: j(M); break; case 207: case 206: case 299: case 227: Y = He; default: Le(M); break }Yt(M), Y = He } function _t(M) { switch (M.kind) { case 79: case 80: case 108: case 208: case 209: return Rt(M); case 210: return We(M); case 214: case 232: return _t(M.expression); case 223: return zt(M); case 221: return M.operator === 53 && _t(M.operand); case 218: return _t(M.expression) }return !1 } function ct(M) { return WI(M) || (br(M) || PS(M) || ud(M)) && ct(M.expression) || ar(M) && M.operatorToken.kind === 27 && ct(M.right) || Vs(M) && (yf(M.argumentExpression) || bc(M.argumentExpression)) && ct(M.expression) || Iu(M) && ct(M.left) } function Rt(M) { return ct(M) || Jl(M) && Rt(M.expression) } function We(M) { if (M.arguments) { for (let He of M.arguments) if (Rt(He)) return !0 } return !!(M.expression.kind === 208 && Rt(M.expression.expression)) } function qe(M, He) { return y2(M) && Qt(M.expression) && es(He) } function zt(M) { switch (M.operatorToken.kind) { case 63: case 75: case 76: case 77: return Rt(M.left); case 34: case 35: case 36: case 37: return Qt(M.left) || Qt(M.right) || qe(M.right, M.left) || qe(M.left, M.right); case 102: return Qt(M.left); case 101: return _t(M.right); case 27: return _t(M.right) }return !1 } function Qt(M) { switch (M.kind) { case 214: return Qt(M.expression); case 223: switch (M.operatorToken.kind) { case 63: return Qt(M.left); case 27: return Qt(M.right) } }return Rt(M) } function tn() { return zT({ flags: 4, antecedents: void 0 }) } function kn() { return zT({ flags: 8, antecedents: void 0 }) } function _n(M, He, Nt) { return zT({ flags: 1024, target: M, antecedents: He, antecedent: Nt }) } function Gt(M) { M.flags |= M.flags & 2048 ? 4096 : 2048 } function $n(M, He) { !(He.flags & 1) && !ya(M.antecedents, He) && ((M.antecedents || (M.antecedents = [])).push(He), Gt(He)) } function ui(M, He, Nt) { return He.flags & 1 ? He : Nt ? (Nt.kind === 110 && M & 64 || Nt.kind === 95 && M & 32) && !r6(Nt) && !wj(Nt.parent) ? fe : _t(Nt) ? (Gt(He), zT({ flags: M, antecedent: He, node: Nt })) : He : M & 32 ? He : fe } function Ni(M, He, Nt, Pn) { return Gt(M), zT({ flags: 128, antecedent: M, switchStatement: He, clauseStart: Nt, clauseEnd: Pn }) } function Pi(M, He, Nt) { Gt(He); let Pn = zT({ flags: M, antecedent: He, node: Nt }); return C && $n(C, Pn), Pn } function gr(M, He) { return Gt(M), zT({ flags: 512, antecedent: M, node: He }) } function pt(M) { let He = M.antecedents; return He ? He.length === 1 ? He[0] : M : fe } function nn(M) { let He = M.parent; switch (He.kind) { case 242: case 244: case 243: return He.expression === M; case 245: case 224: return He.condition === M }return !1 } function Dt(M) { for (; ;)if (M.kind === 214) M = M.expression; else if (M.kind === 221 && M.operator === 53) M = M.operand; else return CR(M) } function pn(M) { return cW(vs(M)) } function An(M) { for (; ud(M.parent) || tv(M.parent) && M.parent.operator === 53;)M = M.parent; return !nn(M) && !Dt(M.parent) && !(Jl(M.parent) && M.parent.expression === M) } function Kn(M, He, Nt, Pn) { let la = A, oa = w; A = Nt, w = Pn, M(He), A = la, w = oa } function hi(M, He, Nt) { Kn(ft, M, He, Nt), (!M || !pn(M) && !Dt(M) && !(Jl(M) && mI(M))) && ($n(He, ui(32, m, M)), $n(Nt, ui(64, m, M))) } function ri(M, He, Nt) { let Pn = v, la = S; v = He, S = Nt, ft(M), v = Pn, S = la } function vn(M, He) { let Nt = F; for (; Nt && M.parent.kind === 253;)Nt.continueTarget = He, Nt = Nt.next, M = M.parent; return He } function Ht(M) { let He = vn(M, kn()), Nt = tn(), Pn = tn(); $n(He, m), m = He, hi(M.expression, Nt, Pn), m = pt(Nt), ri(M.statement, Pn, He), $n(He, m), m = pt(Pn) } function En(M) { let He = kn(), Nt = vn(M, tn()), Pn = tn(); $n(He, m), m = He, ri(M.statement, Pn, Nt), $n(Nt, m), m = pt(Nt), hi(M.expression, He, Pn), m = pt(Pn) } function dr(M) { let He = vn(M, kn()), Nt = tn(), Pn = tn(); ft(M.initializer), $n(He, m), m = He, hi(M.condition, Nt, Pn), m = pt(Nt), ri(M.statement, Pn, He), ft(M.incrementor), $n(He, m), m = pt(Pn) } function Cr(M) { let He = vn(M, kn()), Nt = tn(); ft(M.expression), $n(He, m), m = He, M.kind === 247 && ft(M.awaitModifier), $n(Nt, m), ft(M.initializer), M.initializer.kind !== 258 && Kt(M.initializer), ri(M.statement, Nt, He), $n(He, m), m = pt(Nt) } function Se(M) { let He = tn(), Nt = tn(), Pn = tn(); hi(M.expression, He, Nt), m = pt(He), ft(M.thenStatement), $n(Pn, m), m = pt(Nt), ft(M.elseStatement), $n(Pn, m), m = pt(Pn) } function at(M) { ft(M.expression), M.kind === 250 && (B = !0, x && $n(x, m)), m = fe } function Tt(M) { for (let He = F; He; He = He.next)if (He.name === M) return He } function ve(M, He, Nt) { let Pn = M.kind === 249 ? He : Nt; Pn && ($n(Pn, m), m = fe) } function nt(M) { if (ft(M.label), M.label) { let He = Tt(M.label.escapedText); He && (He.referenced = !0, ve(M, He.breakTarget, He.continueTarget)) } else ve(M, v, S) } function ce(M) { let He = x, Nt = C, Pn = tn(), la = tn(), oa = tn(); if (M.finallyBlock && (x = la), $n(oa, m), C = oa, ft(M.tryBlock), $n(Pn, m), M.catchClause && (m = pt(oa), oa = tn(), $n(oa, m), C = oa, ft(M.catchClause), $n(Pn, m)), x = He, C = Nt, M.finallyBlock) { let be = tn(); be.antecedents = Qi(Qi(Pn.antecedents, oa.antecedents), la.antecedents), m = be, ft(M.finallyBlock), m.flags & 1 ? m = fe : (x && la.antecedents && $n(x, _n(be, la.antecedents, m)), C && oa.antecedents && $n(C, _n(be, oa.antecedents, m)), m = Pn.antecedents ? _n(be, Pn.antecedents, m) : fe) } else m = pt(Pn) } function Q(M) { let He = tn(); ft(M.expression); let Nt = v, Pn = P; v = He, P = m, ft(M.caseBlock), $n(He, m); let la = mn(M.caseBlock.clauses, oa => oa.kind === 293); M.possiblyExhaustive = !la && !He.antecedents, la || $n(He, Ni(P, M, 0, 0)), v = Nt, P = Pn, m = pt(He) } function ue(M) { let He = M.clauses, Nt = _t(M.parent.expression), Pn = fe; for (let la = 0; la < He.length; la++) { let oa = la; for (; !He[la].statements.length && la + 1 < He.length;)ft(He[la]), la++; let be = tn(); $n(be, Nt ? Ni(P, M.parent, oa, la + 1) : P), $n(be, Pn), m = pt(be); let De = He[la]; ft(De), Pn = m, !(m.flags & 1) && la !== He.length - 1 && t.noFallthroughCasesInSwitch && (De.fallthroughFlowNode = m) } } function G(M) { let He = m; m = P, ft(M.expression), m = He, Ne(M.statements) } function Oe(M) { ft(M.expression), je(M.expression) } function je(M) { if (M.kind === 210) { let He = M; He.expression.kind !== 106 && WI(He.expression) && (m = gr(m, He)) } } function Ge(M) { let He = tn(); F = { next: F, name: M.label.escapedText, breakTarget: He, continueTarget: void 0, referenced: !1 }, ft(M.label), ft(M.statement), !F.referenced && !t.allowUnusedLabels && wt(Sle(t), M.label, _.Unused_label), F = F.next, $n(He, m), m = pt(He) } function kt(M) { M.kind === 223 && M.operatorToken.kind === 63 ? Kt(M.left) : Kt(M) } function Kt(M) { if (ct(M)) m = Pi(16, m, M); else if (M.kind === 206) for (let He of M.elements) He.kind === 227 ? Kt(He.expression) : kt(He); else if (M.kind === 207) for (let He of M.properties) He.kind === 299 ? kt(He.initializer) : He.kind === 300 ? Kt(He.name) : He.kind === 301 && Kt(He.expression) } function ln(M, He, Nt) { let Pn = tn(); M.operatorToken.kind === 55 || M.operatorToken.kind === 76 ? hi(M.left, Pn, Nt) : hi(M.left, He, Pn), m = pt(Pn), ft(M.operatorToken), HI(M.operatorToken.kind) ? (Kn(ft, M.right, He, Nt), Kt(M.left), $n(He, ui(32, m, M)), $n(Nt, ui(64, m, M))) : hi(M.right, He, Nt) } function ir(M) { if (M.operator === 53) { let He = A; A = w, w = He, Le(M), w = A, A = He } else Le(M), (M.operator === 45 || M.operator === 46) && Kt(M.operand) } function ae(M) { Le(M), (M.operator === 45 || M.operator === 46) && Kt(M.operand) } function rt(M) { Y ? (Y = !1, ft(M.operatorToken), ft(M.right), Y = !0, ft(M.left)) : (Y = !0, ft(M.left), Y = !1, ft(M.operatorToken), ft(M.right)), Kt(M.left) } function Ot() { return C3(M, He, Nt, Pn, la, void 0); function M(be, De) { if (De) { De.stackIndex++, go(be, i); let St = W; ta(be); let Zt = i; i = be, De.skip = !1, De.inStrictModeStack[De.stackIndex] = St, De.parentStack[De.stackIndex] = Zt } else De = { stackIndex: 0, skip: !1, inStrictModeStack: [void 0], parentStack: [void 0] }; let mt = be.operatorToken.kind; if (AR(mt) || HI(mt)) { if (An(be)) { let St = tn(); ln(be, St, St), m = pt(St) } else ln(be, A, w); De.skip = !0 } return De } function He(be, De, mt) { if (!De.skip) { let St = oa(be); return mt.operatorToken.kind === 27 && je(be), St } } function Nt(be, De, mt) { De.skip || ft(be) } function Pn(be, De, mt) { if (!De.skip) { let St = oa(be); return mt.operatorToken.kind === 27 && je(be), St } } function la(be, De) { if (!De.skip) { let Zt = be.operatorToken.kind; if (Mg(Zt) && !Um(be) && (Kt(be.left), Zt === 63 && be.left.kind === 209)) { let rn = be.left; Qt(rn.expression) && (m = Pi(256, m, be)) } } let mt = De.inStrictModeStack[De.stackIndex], St = De.parentStack[De.stackIndex]; mt !== void 0 && (W = mt), St !== void 0 && (i = St), De.skip = !1, De.stackIndex-- } function oa(be) { if (be && ar(be) && !Fg(be)) return be; ft(be) } } function Ke(M) { Le(M), M.expression.kind === 208 && Kt(M.expression) } function oe(M) { let He = tn(), Nt = tn(), Pn = tn(); hi(M.condition, He, Nt), m = pt(He), ft(M.questionToken), ft(M.whenTrue), $n(Pn, m), m = pt(Nt), ft(M.colonToken), ft(M.whenFalse), $n(Pn, m), m = pt(Pn) } function pe(M) { let He = ol(M) ? void 0 : M.name; if (La(He)) for (let Nt of He.elements) pe(Nt); else m = Pi(16, m, M) } function z(M) { Le(M), (M.initializer || CA(M.parent.parent)) && pe(M) } function Te(M) { ft(M.dotDotDotToken), ft(M.propertyName), yt(M.initializer), ft(M.name) } function j(M) { Ne(M.modifiers), ft(M.dotDotDotToken), ft(M.questionToken), ft(M.type), yt(M.initializer), ft(M.name) } function yt(M) { if (!M) return; let He = m; if (ft(M), He === fe || He === m) return; let Nt = tn(); $n(Nt, He), $n(Nt, m), m = pt(Nt) } function lt(M) { ft(M.tagName), M.kind !== 343 && M.fullName && (go(M.fullName, M), Zy(M.fullName, !1)), typeof M.comment != "string" && Ne(M.comment) } function Qe(M) { Le(M); let He = sb(M); He && He.kind !== 171 && X(He.symbol, He, 32) } function Vt(M, He, Nt) { Kn(ft, M, He, Nt), (!Jl(M) || mI(M)) && ($n(He, ui(32, m, M)), $n(Nt, ui(64, m, M))) } function Hn(M) { switch (M.kind) { case 208: ft(M.questionDotToken), ft(M.name); break; case 209: ft(M.questionDotToken), ft(M.argumentExpression); break; case 210: ft(M.questionDotToken), Ne(M.typeArguments), Ne(M.arguments); break } } function jr(M, He, Nt) { let Pn = pI(M) ? tn() : void 0; Vt(M.expression, Pn || He, Nt), Pn && (m = pt(Pn)), Kn(Hn, M, He, Nt), mI(M) && ($n(He, ui(32, m, M)), $n(Nt, ui(64, m, M))) } function ei(M) { if (An(M)) { let He = tn(); jr(M, He, He), m = pt(He) } else jr(M, A, w) } function Kr(M) { Jl(M) ? ei(M) : Le(M) } function Si(M) { Jl(M) ? ei(M) : Le(M) } function Ja(M) { if (Jl(M)) ei(M); else { let He = vs(M.expression); He.kind === 215 || He.kind === 216 ? (Ne(M.typeArguments), Ne(M.arguments), ft(M.expression)) : (Le(M), M.expression.kind === 106 && (m = gr(m, M))) } if (M.expression.kind === 208) { let He = M.expression; Re(He.name) && Qt(He.expression) && jH(He.name) && (m = Pi(256, m, M)) } } function Za(M) { f && (f.nextContainer = M), f = M } function Fa(M, He, Nt) { switch (o.kind) { case 264: return Pe(M, He, Nt); case 308: return xi(M, He, Nt); case 228: case 260: return Hi(M, He, Nt); case 263: return ke(o.symbol.exports, o.symbol, M, He, Nt); case 184: case 325: case 207: case 261: case 289: return ke(o.symbol.members, o.symbol, M, He, Nt); case 181: case 182: case 176: case 177: case 326: case 178: case 171: case 170: case 173: case 174: case 175: case 259: case 215: case 216: case 320: case 172: case 262: case 197: return o.locals && L.assertNode(o, Qp), ke(o.locals, void 0, M, He, Nt) } } function Hi(M, He, Nt) { return Ca(M) ? ke(o.symbol.exports, o.symbol, M, He, Nt) : ke(o.symbol.members, o.symbol, M, He, Nt) } function xi(M, He, Nt) { return Lc(e) ? Pe(M, He, Nt) : ke(e.locals, void 0, M, He, Nt) } function Nr(M) { let He = Li(M) ? M : zr(M.body, Tp); return !!He && He.statements.some(Nt => Il(Nt) || pc(Nt)) } function Fo(M) { M.flags & 16777216 && !Nr(M) ? M.flags |= 64 : M.flags &= -65 } function Qr(M) { if (Fo(M), lu(M)) if (Mr(M, 1) && ht(M, _.export_modifier_cannot_be_applied_to_ambient_modules_and_module_augmentations_since_they_are_always_visible), uH(M)) Wi(M); else { let He; if (M.name.kind === 10) { let { text: Pn } = M.name; He = n2(Pn), He === void 0 && ht(M.name, _.Pattern_0_can_have_at_most_one_Asterisk_character, Pn) } let Nt = Fa(M, 512, 110735); e.patternAmbientModules = Sn(e.patternAmbientModules, He && !Ta(He) ? { pattern: He, symbol: Nt } : void 0) } else { let He = Wi(M); if (He !== 0) { let { symbol: Nt } = M; Nt.constEnumOnlyModule = !(Nt.flags & 304) && He === 2 && Nt.constEnumOnlyModule !== !1 } } } function Wi(M) { let He = Gh(M), Nt = He !== 0; return Fa(M, Nt ? 512 : 1024, Nt ? 110735 : 0), He } function gn(M) { let He = ge(131072, Ve(M)); X(He, M, 131072); let Nt = ge(2048, "__type"); X(Nt, M, 2048), Nt.members = Ua(), Nt.members.set(He.escapedName, He) } function Ki(M) { return mc(M, 4096, "__object") } function kc(M) { return mc(M, 4096, "__jsxAttributes") } function Ps(M, He, Nt) { return Fa(M, He, Nt) } function mc(M, He, Nt) { let Pn = ge(He, Nt); return He & 106508 && (Pn.parent = o.symbol), X(Pn, M, He), Pn } function xc(M, He, Nt) { switch (l.kind) { case 264: Pe(M, He, Nt); break; case 308: if (kd(o)) { Pe(M, He, Nt); break } default: L.assertNode(l, Qp), l.locals || (l.locals = Ua(), Za(l)), ke(l.locals, void 0, M, He, Nt) } } function hc() { if (!d) return; let M = o, He = f, Nt = l, Pn = i, la = m; for (let oa of d) { let be = oa.parent.parent; o = jn(be.parent, mt => !!(u_e(mt) & 1)) || e, l = tm(be) || e, m = zT({ flags: 2 }), i = oa, ft(oa.typeExpression); let De = sa(oa); if ((vO(oa) || !oa.fullName) && De && LR(De.parent)) { let mt = Vr(De.parent); if (mt) { Ln(e.symbol, De.parent, mt, !!jn(De, Zt => br(Zt) && Zt.name.escapedText === "prototype"), !1); let St = o; switch (tR(De.parent)) { case 1: case 2: kd(e) ? o = e : o = void 0; break; case 4: o = De.parent.expression; break; case 3: o = De.parent.expression.name; break; case 5: o = $0(e, De.parent.expression) ? e : br(De.parent.expression) ? De.parent.expression.name : De.parent.expression; break; case 0: return L.fail("Shouldn't have detected typedef or enum on non-assignment declaration") }o && Pe(oa, 524288, 788968), o = St } } else vO(oa) || !oa.fullName || oa.fullName.kind === 79 ? (i = oa.parent, xc(oa, 524288, 788968)) : ft(oa.fullName) } o = M, f = He, l = Nt, i = Pn, m = la } function ro(M) { if (!e.parseDiagnostics.length && !(M.flags & 16777216) && !(M.flags & 8388608) && !Sce(M)) { let He = nb(M); if (He === void 0) return; W && He >= 117 && He <= 125 ? e.bindDiagnostics.push(re(M, aa(M), os(M))) : He === 133 ? Lc(e) && O6(M) ? e.bindDiagnostics.push(re(M, _.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, os(M))) : M.flags & 32768 && e.bindDiagnostics.push(re(M, _.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, os(M))) : He === 125 && M.flags & 8192 && e.bindDiagnostics.push(re(M, _.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, os(M))) } } function aa(M) { return Zc(M) ? _.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode : e.externalModuleIndicator ? _.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode : _.Identifier_expected_0_is_a_reserved_word_in_strict_mode } function Co(M) { M.escapedText === "#constructor" && (e.parseDiagnostics.length || e.bindDiagnostics.push(re(M, _.constructor_is_a_reserved_word, os(M)))) } function gc(M) { W && Ju(M.left) && Mg(M.operatorToken.kind) && bl(M, M.left) } function Ll(M) { W && M.variableDeclaration && bl(M, M.variableDeclaration.name) } function md(M) { if (W && M.expression.kind === 79) { let He = w0(e, M.expression); e.bindDiagnostics.push(al(e, He.start, He.length, _.delete_cannot_be_called_on_an_identifier_in_strict_mode)) } } function Pc(M) { return Re(M) && (M.escapedText === "eval" || M.escapedText === "arguments") } function bl(M, He) { if (He && He.kind === 79) { let Nt = He; if (Pc(Nt)) { let Pn = w0(e, He); e.bindDiagnostics.push(al(e, Pn.start, Pn.length, ss(M), vr(Nt))) } } } function ss(M) { return Zc(M) ? _.Code_contained_in_a_class_is_evaluated_in_JavaScript_s_strict_mode_which_does_not_allow_this_use_of_0_For_more_information_see_https_Colon_Slash_Slashdeveloper_mozilla_org_Slashen_US_Slashdocs_SlashWeb_SlashJavaScript_SlashReference_SlashStrict_mode : e.externalModuleIndicator ? _.Invalid_use_of_0_Modules_are_automatically_in_strict_mode : _.Invalid_use_of_0_in_strict_mode } function qs(M) { W && bl(M, M.name) } function Rs(M) { return Zc(M) ? _.Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Class_definitions_are_automatically_in_strict_mode : e.externalModuleIndicator ? _.Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Modules_are_automatically_in_strict_mode : _.Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5 } function As(M) { if (r < 2 && l.kind !== 308 && l.kind !== 264 && !SA(l)) { let He = w0(e, M); e.bindDiagnostics.push(al(e, He.start, He.length, Rs(M))) } } function jt(M) { r < 1 && W && M.numericLiteralFlags & 32 && e.bindDiagnostics.push(re(M, _.Octal_literals_are_not_allowed_in_strict_mode)) } function yc(M) { W && bl(M, M.operand) } function Ql(M) { W && (M.operator === 45 || M.operator === 46) && bl(M, M.operand) } function yu(M) { W && ht(M, _.with_statements_are_not_allowed_in_strict_mode) } function se(M) { W && Do(t) >= 2 && (bse(M.statement) || Bc(M.statement)) && ht(M.label, _.A_label_is_not_allowed_here) } function ht(M, He, Nt, Pn, la) { let oa = Pg(e, M.pos); e.bindDiagnostics.push(al(e, oa.start, oa.length, He, Nt, Pn, la)) } function wt(M, He, Nt) { K(M, He, He, Nt) } function K(M, He, Nt, Pn) { Xe(M, { pos: gT(He, e), end: Nt.end }, Pn) } function Xe(M, He, Nt) { let Pn = al(e, He.pos, He.end - He.pos, Nt); M ? e.bindDiagnostics.push(Pn) : e.bindSuggestionDiagnostics = Sn(e.bindSuggestionDiagnostics, { ...Pn, category: 2 }) } function ft(M) { if (!M) return; go(M, i), ai && (M.tracingPath = e.path); let He = W; if (ta(M), M.kind > 162) { let Nt = i; i = M; let Pn = u_e(M); Pn === 0 ? Ye(M) : Ie(M, Pn), i = Nt } else { let Nt = i; M.kind === 1 && (i = M), Yt(M), i = Nt } W = He } function Yt(M) { if (Kd(M)) if (Yn(M)) for (let He of M.jsDoc) ft(He); else for (let He of M.jsDoc) go(He, M), Zy(He, !1) } function pr(M) { if (!W) for (let He of M) { if (!B_(He)) return; if (yr(He)) { W = !0; return } } } function yr(M) { let He = k0(e, M.expression); return He === '"use strict"' || He === "'use strict'" } function ta(M) { switch (M.kind) { case 79: if (M.flags & 2048) { let be = M.parent; for (; be && !Ff(be);)be = be.parent; xc(be, 524288, 788968); break } case 108: return m && (ot(M) || i.kind === 300) && (M.flowNode = m), ro(M); case 163: m && G6(M) && (M.flowNode = m); break; case 233: case 106: M.flowNode = m; break; case 80: return Co(M); case 208: case 209: let He = M; m && ct(He) && (He.flowNode = m), fce(He) && Ri(He), Yn(He) && e.commonJsModuleIndicator && Bm(He) && !eN(l, "module") && ke(e.locals, void 0, He.expression, 134217729, 111550); break; case 223: switch (ic(M)) { case 1: hd(M); break; case 2: vc(M); break; case 3: Ze(M.left, M); break; case 6: io(M); break; case 4: ye(M); break; case 5: let be = M.left.expression; if (Yn(M) && Re(be)) { let De = eN(l, be.escapedText); if (N6(De?.valueDeclaration)) { ye(M); break } } xt(M); break; case 0: break; default: L.fail("Unknown binary expression special property assignment kind") }return gc(M); case 295: return Ll(M); case 217: return md(M); case 8: return jt(M); case 222: return yc(M); case 221: return Ql(M); case 251: return yu(M); case 253: return se(M); case 194: g = !0; return; case 179: break; case 165: return Fd(M); case 166: return Zl(M); case 257: return gd(M); case 205: return M.flowNode = m, gd(M); case 169: case 168: return Go(M); case 299: case 300: return Io(M, 4, 0); case 302: return Io(M, 8, 900095); case 176: case 177: case 178: return Fa(M, 131072, 0); case 171: case 170: return Io(M, 8192 | (M.questionToken ? 16777216 : 0), s_(M) ? 0 : 103359); case 259: return Md(M); case 173: return Fa(M, 16384, 0); case 174: return Io(M, 32768, 46015); case 175: return Io(M, 65536, 78783); case 181: case 320: case 326: case 182: return gn(M); case 184: case 325: case 197: return Ka(M); case 335: return Qe(M); case 207: return Ki(M); case 215: case 216: return zf(M); case 210: switch (ic(M)) { case 7: return At(M); case 8: return Ws(M); case 9: return ee(M); case 0: break; default: return L.fail("Unknown call expression assignment declaration kind") }Yn(M) && Bu(M); break; case 228: case 260: return W = !0, Pd(M); case 261: return xc(M, 64, 788872); case 262: return xc(M, 524288, 788968); case 263: return Dc(M); case 264: return Qr(M); case 289: return kc(M); case 288: return Ps(M, 4, 0); case 268: case 271: case 273: case 278: return Fa(M, 2097152, 2097152); case 267: return Uc(M); case 270: return $o(M); case 275: return Gu(M); case 274: return Hs(M); case 308: return pr(M.statements), vo(); case 238: if (!SA(M.parent)) return; case 265: return pr(M.statements); case 344: if (M.parent.kind === 326) return Zl(M); if (M.parent.kind !== 325) break; case 351: let la = M, oa = la.isBracketed || la.typeExpression && la.typeExpression.type.kind === 319 ? 16777220 : 4; return Fa(la, oa, 0); case 349: case 341: case 343: return (d || (d = [])).push(M); case 342: return ft(M.typeExpression) } } function Go(M) { let He = Id(M), Nt = He ? 98304 : 4, Pn = He ? 13247 : 0; return Io(M, Nt | (M.questionToken ? 16777216 : 0), Pn) } function Ka(M) { return mc(M, 2048, "__type") } function vo() { if (Fo(e), Lc(e)) ka(); else if (Mf(e)) { ka(); let M = e.symbol; ke(e.symbol.exports, e.symbol, e, 4, 67108863), e.symbol = M } } function ka() { mc(e, 512, `"${ld(e.fileName)}"`) } function Hs(M) { if (!o.symbol || !o.symbol.exports) mc(M, 111551, Ve(M)); else { let He = zA(M) ? 2097152 : 4, Nt = ke(o.symbol.exports, o.symbol, M, He, 67108863); M.isExportEquals && rR(Nt, M) } } function Uc(M) { vt(M.modifiers) && e.bindDiagnostics.push(re(M, _.Modifiers_cannot_appear_here)); let He = Li(M.parent) ? Lc(M.parent) ? M.parent.isDeclarationFile ? void 0 : _.Global_module_exports_may_only_appear_in_declaration_files : _.Global_module_exports_may_only_appear_in_module_files : _.Global_module_exports_may_only_appear_at_top_level; He ? e.bindDiagnostics.push(re(M, He)) : (e.symbol.globalExports = e.symbol.globalExports || Ua(), ke(e.symbol.globalExports, e.symbol, M, 2097152, 2097152)) } function Gu(M) { !o.symbol || !o.symbol.exports ? mc(M, 8388608, Ve(M)) : M.exportClause ? qm(M.exportClause) && (go(M.exportClause, M), ke(o.symbol.exports, o.symbol, M.exportClause, 2097152, 2097152)) : ke(o.symbol.exports, o.symbol, M, 8388608, 0) } function $o(M) { M.name && Fa(M, 2097152, 2097152) } function jo(M) { return e.externalModuleIndicator && e.externalModuleIndicator !== !0 ? !1 : (e.commonJsModuleIndicator || (e.commonJsModuleIndicator = M, e.externalModuleIndicator || ka()), !0) } function Ws(M) { if (!jo(M)) return; let He = Cs(M.arguments[0], void 0, (Nt, Pn) => (Pn && X(Pn, Nt, 67110400), Pn)); He && ke(He.exports, He, M, 1048580, 0) } function hd(M) { if (!jo(M)) return; let He = Cs(M.left.expression, void 0, (Nt, Pn) => (Pn && X(Pn, Nt, 67110400), Pn)); if (He) { let Pn = pR(M.right) && (TT(M.left.expression) || Bm(M.left.expression)) ? 2097152 : 1048580; go(M.left, M), ke(He.exports, He, M.left, Pn, 0) } } function vc(M) { if (!jo(M)) return; let He = Qw(M.right); if (dW(He) || o === e && $0(e, He)) return; if (rs(He) && Ji(He.properties, xf)) { mn(He.properties, nf); return } let Nt = zA(M) ? 2097152 : 1049092, Pn = ke(e.symbol.exports, e.symbol, M, Nt | 67108864, 0); rR(Pn, M) } function nf(M) { ke(e.symbol.exports, e.symbol, M, 69206016, 0) } function ye(M) { if (L.assert(Yn(M)), ar(M) && br(M.left) && pi(M.left.name) || br(M) && pi(M.name)) return; let Nt = Ku(M, !1, !1); switch (Nt.kind) { case 259: case 215: let Pn = Nt.symbol; if (ar(Nt.parent) && Nt.parent.operatorToken.kind === 63) { let be = Nt.parent.left; ST(be) && ub(be.expression) && (Pn = Qo(be.expression.expression, s)) } Pn && Pn.valueDeclaration && (Pn.members = Pn.members || Ua(), Xy(M) ? Et(M, Pn, Pn.members) : ke(Pn.members, Pn, M, 67108868, 0), X(Pn, Pn.valueDeclaration, 32)); break; case 173: case 169: case 171: case 174: case 175: case 172: let la = Nt.parent, oa = Ca(Nt) ? la.symbol.exports : la.symbol.members; Xy(M) ? Et(M, la.symbol, oa) : ke(oa, la.symbol, M, 67108868, 0, !0); break; case 308: if (Xy(M)) break; Nt.commonJsModuleIndicator ? ke(Nt.symbol.exports, Nt.symbol, M, 1048580, 0) : Fa(M, 1, 111550); break; default: L.failBadSyntaxKind(Nt) } } function Et(M, He, Nt) { ke(Nt, He, M, 4, 0, !0, !0), bn(M, He) } function bn(M, He) { He && (He.assignmentDeclarationMembers || (He.assignmentDeclarationMembers = new Map)).set(zo(M), M) } function Ri(M) { M.expression.kind === 108 ? ye(M) : ST(M) && M.parent.parent.kind === 308 && (ub(M.expression) ? Ze(M, M.parent) : qt(M)) } function io(M) { go(M.left, M), go(M.right, M), gi(M.left.expression, M.left, !1, !0) } function ee(M) { let He = Qo(M.arguments[0].expression); He && He.valueDeclaration && X(He, He.valueDeclaration, 32), mr(M, He, !0) } function Ze(M, He) { let Nt = M.expression, Pn = Nt.expression; go(Pn, Nt), go(Nt, M), go(M, He), gi(Pn, M, !0, !0) } function At(M) { let He = Qo(M.arguments[0]), Nt = M.parent.parent.kind === 308; He = Ln(He, M.arguments[0], Nt, !1, !1), mr(M, He, !1) } function xt(M) { var He; let Nt = Qo(M.left.expression, o) || Qo(M.left.expression, l); if (!Yn(M) && !_ce(Nt)) return; let Pn = $I(M.left); if (!(Re(Pn) && ((He = eN(o, Pn.escapedText)) == null ? void 0 : He.flags) & 2097152)) if (go(M.left, M), go(M.right, M), Re(M.left.expression) && o === e && $0(e, M.left.expression)) hd(M); else if (Xy(M)) { mc(M, 67108868, "__computed"); let la = Ln(Nt, M.left.expression, Vr(M.left), !1, !1); bn(M, la) } else qt(Ga(M.left, cS)) } function qt(M) { L.assert(!Re(M)), go(M.expression, M), gi(M.expression, M, !1, !1) } function Ln(M, He, Nt, Pn, la) { return M?.flags & 2097152 || (Nt && !Pn && (M = Cs(He, M, (De, mt, St) => { if (mt) return X(mt, De, 67110400), mt; { let Zt = St ? St.exports : e.jsGlobalAugmentations || (e.jsGlobalAugmentations = Ua()); return ke(Zt, St, De, 67110400, 110735) } })), la && M && M.valueDeclaration && X(M, M.valueDeclaration, 32)), M } function mr(M, He, Nt) { if (!He || !Ea(He)) return; let Pn = Nt ? He.members || (He.members = Ua()) : He.exports || (He.exports = Ua()), la = 0, oa = 0; Ds(oS(M)) ? (la = 8192, oa = 103359) : Pa(M) && sS(M) && (vt(M.arguments[2].properties, be => { let De = sa(be); return !!De && Re(De) && vr(De) === "set" }) && (la |= 65540, oa |= 78783), vt(M.arguments[2].properties, be => { let De = sa(be); return !!De && Re(De) && vr(De) === "get" }) && (la |= 32772, oa |= 46015)), la === 0 && (la = 4, oa = 0), ke(Pn, He, M, la | 67108864, oa & -67108865) } function Vr(M) { return ar(M.parent) ? bo(M.parent).parent.kind === 308 : M.parent.parent.kind === 308 } function gi(M, He, Nt, Pn) { let la = Qo(M, o) || Qo(M, l), oa = Vr(He); la = Ln(la, He.expression, oa, Nt, Pn), mr(He, la, Nt) } function Ea(M) { if (M.flags & 1072) return !0; let He = M.valueDeclaration; if (He && Pa(He)) return !!oS(He); let Nt = He ? wi(He) ? He.initializer : ar(He) ? He.right : br(He) && ar(He.parent) ? He.parent.right : void 0 : void 0; if (Nt = Nt && Qw(Nt), Nt) { let Pn = ub(wi(He) ? He.name : ar(He) ? He.left : He); return !!ob(ar(Nt) && (Nt.operatorToken.kind === 56 || Nt.operatorToken.kind === 60) ? Nt.right : Nt, Pn) } return !1 } function bo(M) { for (; ar(M.parent);)M = M.parent; return M.parent } function Qo(M, He = o) { if (Re(M)) return eN(He, M.escapedText); { let Nt = Qo(M.expression); return Nt && Nt.exports && Nt.exports.get(wh(M)) } } function Cs(M, He, Nt) { if ($0(e, M)) return e.symbol; if (Re(M)) return Nt(M, Qo(M), He); { let Pn = Cs(M.expression, He, Nt), la = eR(M); return pi(la) && L.fail("unexpected PrivateIdentifier"), Nt(la, Pn && Pn.exports && Pn.exports.get(wh(M)), Pn) } } function Bu(M) { !e.commonJsModuleIndicator && qu(M, !1) && jo(M) } function Pd(M) { if (M.kind === 260) xc(M, 32, 899503); else { let la = M.name ? M.name.escapedText : "__class"; mc(M, 32, la), M.name && $.add(M.name.escapedText) } let { symbol: He } = M, Nt = ge(4194308, "prototype"), Pn = He.exports.get(Nt.escapedName); Pn && (M.name && go(M.name, M), e.bindDiagnostics.push(re(Pn.declarations[0], _.Duplicate_identifier_0, fc(Nt)))), He.exports.set(Nt.escapedName, Nt), Nt.parent = He } function Dc(M) { return R0(M) ? xc(M, 128, 899967) : xc(M, 256, 899327) } function gd(M) { if (W && bl(M, M.name), !La(M.name)) { let He = M.kind === 257 ? M : M.parent.parent; Yn(M) && $s(t) !== 100 && N0(He) && !x0(M) && !(wg(M) & 1) ? Fa(M, 2097152, 2097152) : sH(M) ? xc(M, 2, 111551) : CT(M) ? Fa(M, 1, 111551) : Fa(M, 1, 111550) } } function Zl(M) { if (!(M.kind === 344 && o.kind !== 326) && (W && !(M.flags & 16777216) && bl(M, M.name), La(M.name) ? mc(M, 1, "__" + M.parent.parameters.indexOf(M)) : Fa(M, 1, 111551), Ad(M, M.parent))) { let He = M.parent.parent; ke(He.symbol.members, He.symbol, M, 4 | (M.questionToken ? 16777216 : 0), 0) } } function Md(M) { !e.isDeclarationFile && !(M.flags & 16777216) && qA(M) && (q |= 2048), qs(M), W ? (As(M), xc(M, 16, 110991)) : Fa(M, 16, 110991) } function zf(M) { !e.isDeclarationFile && !(M.flags & 16777216) && qA(M) && (q |= 2048), m && (M.flowNode = m), qs(M); let He = M.name ? M.name.escapedText : "__function"; return mc(M, 16, He) } function Io(M, He, Nt) { return !e.isDeclarationFile && !(M.flags & 16777216) && qA(M) && (q |= 2048), m && D6(M) && (M.flowNode = m), Xy(M) ? mc(M, He, "__computed") : Fa(M, He, Nt) } function Jf(M) { let He = jn(M, Nt => Nt.parent && m2(Nt.parent) && Nt.parent.extendsType === Nt); return He && He.parent } function Fd(M) { var He, Nt; if (H_(M.parent)) { let Pn = J6(M.parent); Pn ? (L.assertNode(Pn, Qp), (He = Pn.locals) != null || (Pn.locals = Ua()), ke(Pn.locals, void 0, M, 262144, 526824)) : Fa(M, 262144, 526824) } else if (M.parent.kind === 192) { let Pn = Jf(M.parent); Pn ? (L.assertNode(Pn, Qp), (Nt = Pn.locals) != null || (Pn.locals = Ua()), ke(Pn.locals, void 0, M, 262144, 526824)) : mc(M, 262144, Ve(M)) } else Fa(M, 262144, 526824) } function E_(M) { let He = Gh(M); return He === 1 || He === 2 && U0(t) } function Y_(M) { if (!(m.flags & 1)) return !1; if (m === fe && (Nw(M) && M.kind !== 239 || M.kind === 260 || M.kind === 264 && E_(M)) && (m = Z, !t.allowUnreachableCode)) { let Nt = Tle(t) && !(M.flags & 16777216) && (!Bc(M) || !!(G_(M.declarationList) & 3) || M.declarationList.declarations.some(Pn => !!Pn.initializer)); rPe(M, (Pn, la) => K(Nt, Pn, la, _.Unreachable_code_detected)) } return !0 } } function rPe(e, t) { if (ca(e) && l_e(e) && Va(e.parent)) { let { statements: r } = e.parent, i = PW(r, e); PU(i, l_e, (o, s) => t(i[o], i[s - 1])) } else t(e, e) } function l_e(e) { return !Jc(e) && !iPe(e) && !hb(e) && !(Bc(e) && !(G_(e) & 3) && e.declarationList.declarations.some(t => !t.initializer)) } function iPe(e) { switch (e.kind) { case 261: case 262: return !0; case 264: return Gh(e) !== 1; case 263: return Mr(e, 2048); default: return !1 } } function $0(e, t) { let r = 0, i = HU(); for (i.enqueue(t); !i.isEmpty() && r < 100;) { if (r++, t = i.dequeue(), TT(t) || Bm(t)) return !0; if (Re(t)) { let o = eN(e, t.escapedText); if (o && o.valueDeclaration && wi(o.valueDeclaration) && o.valueDeclaration.initializer) { let s = o.valueDeclaration.initializer; i.enqueue(s), Iu(s, !0) && (i.enqueue(s.left), i.enqueue(s.right)) } } } return !1 } function u_e(e) { switch (e.kind) { case 228: case 260: case 263: case 207: case 184: case 325: case 289: return 1; case 261: return 65; case 264: case 262: case 197: case 178: return 33; case 308: return 37; case 174: case 175: case 171: if (D6(e)) return 173; case 173: case 259: case 170: case 176: case 326: case 320: case 181: case 177: case 182: case 172: return 45; case 215: case 216: return 61; case 265: return 4; case 169: return e.initializer ? 4 : 0; case 295: case 245: case 246: case 247: case 266: return 34; case 238: return Ia(e.parent) || oc(e.parent) ? 0 : 34 }return 0 } function eN(e, t) { var r, i, o, s, l; let f = (i = (r = zr(e, Qp)) == null ? void 0 : r.locals) == null ? void 0 : i.get(t); if (f) return (o = f.exportSymbol) != null ? o : f; if (Li(e) && e.jsGlobalAugmentations && e.jsGlobalAugmentations.has(t)) return e.jsGlobalAugmentations.get(t); if ($p(e)) return (l = (s = e.symbol) == null ? void 0 : s.exports) == null ? void 0 : l.get(t) } var sK, d_e, aPe = gt({ "src/compiler/binder.ts"() { "use strict"; fa(), E0(), sK = (e => (e[e.NonInstantiated = 0] = "NonInstantiated", e[e.Instantiated = 1] = "Instantiated", e[e.ConstEnumOnly = 2] = "ConstEnumOnly", e))(sK || {}), d_e = nPe() } }); function f_e(e, t, r, i, o, s, l, f, d, g) { return m; function m(v = () => !0) { let S = [], x = []; return { walkType: $ => { try { return A($), { visitedTypes: H1(S), visitedSymbols: H1(x) } } finally { Om(S), Om(x) } }, walkSymbol: $ => { try { return ie($), { visitedTypes: H1(S), visitedSymbols: H1(x) } } finally { Om(S), Om(x) } } }; function A($) { if (!(!$ || S[$.id] || (S[$.id] = $, ie($.symbol)))) { if ($.flags & 524288) { let Z = $, U = Z.objectFlags; U & 4 && w($), U & 32 && q($), U & 3 && Y($), U & 24 && R(Z) } $.flags & 262144 && C($), $.flags & 3145728 && P($), $.flags & 4194304 && F($), $.flags & 8388608 && B($) } } function w($) { A($.target), mn(g($), A) } function C($) { A(f($)) } function P($) { mn($.types, A) } function F($) { A($.type) } function B($) { A($.objectType), A($.indexType), A($.constraint) } function q($) { A($.typeParameter), A($.constraintType), A($.templateType), A($.modifiersType) } function W($) { let fe = t($); fe && A(fe.type), mn($.typeParameters, A); for (let Z of $.parameters) ie(Z); A(e($)), A(r($)) } function Y($) { R($), mn($.typeParameters, A), mn(i($), A), A($.thisType) } function R($) { let fe = o($); for (let Z of fe.indexInfos) A(Z.keyType), A(Z.type); for (let Z of fe.callSignatures) W(Z); for (let Z of fe.constructSignatures) W(Z); for (let Z of fe.properties) ie(Z) } function ie($) { if (!$) return !1; let fe = $a($); if (x[fe]) return !1; if (x[fe] = $, !v($)) return !0; let Z = s($); return A(Z), $.exports && $.exports.forEach(ie), mn($.declarations, U => { if (U.type && U.type.kind === 183) { let re = U.type, le = l(d(re.exprName)); ie(le) } }), !1 } } } var oPe = gt({ "src/compiler/symbolWalker.ts"() { "use strict"; fa() } }); function oF({ importModuleSpecifierPreference: e, importModuleSpecifierEnding: t }, r, i, o) { let s = l(); return { relativePreference: o !== void 0 ? fl(o) ? 0 : 1 : e === "relative" ? 0 : e === "non-relative" ? 1 : e === "project-relative" ? 3 : 2, getAllowedEndingsInPreferredOrder: f => { if ((f ?? i.impliedNodeFormat) === 99) return VL(r, i.fileName) ? [3, 2] : [2]; if ($s(r) === 1) return [1, 2]; switch (s) { case 2: return [2, 0, 1]; case 3: return [3, 0, 2, 1]; case 1: return [1, 0, 2]; case 0: return [0, 1, 2]; default: L.assertNever(s) } } }; function l() { if (o !== void 0) { if (ES(o)) return 2; if (Oc(o, "/index")) return 1 } return OW(t, i.impliedNodeFormat, r, i) } } function sPe(e, t, r, i, o, s, l = {}) { let f = __e(e, t, r, i, o, oF({}, e, t, s), {}, l); if (f !== s) return f } function sF(e, t, r, i, o, s = {}) { return __e(e, t, r, i, o, oF({}, e, t), {}, s) } function cPe(e, t, r, i, o, s = {}) { let l = cK(t.path, i), f = E_e(t.path, r, i, o, s); return ks(f, d => lK(d, l, t, i, e, o, !0, s.overrideImportMode)) } function __e(e, t, r, i, o, s, l, f = {}) { let d = cK(r, o), g = E_e(r, i, o, l, f); return ks(g, m => lK(m, d, t, o, e, l, void 0, f.overrideImportMode)) || g_e(i, d, e, o, f.overrideImportMode || t.impliedNodeFormat, s) } function lPe(e, t, r, i, o = {}) { return p_e(e, t, r, i, o)[0] } function p_e(e, t, r, i, o = {}) { var s; let l = m6(e); if (!l) return Je; let f = (s = r.getModuleSpecifierCache) == null ? void 0 : s.call(r), d = f?.get(t.path, l.path, i, o); return [d?.moduleSpecifiers, l, d?.modulePaths, f] } function m_e(e, t, r, i, o, s, l = {}) { return h_e(e, t, r, i, o, s, l).moduleSpecifiers } function h_e(e, t, r, i, o, s, l = {}) { let f = !1, d = dPe(e, t); if (d) return { moduleSpecifiers: [d], computedWithoutCache: f }; let [g, m, v, S] = p_e(e, i, o, s, l); if (g) return { moduleSpecifiers: g, computedWithoutCache: f }; if (!m) return { moduleSpecifiers: Je, computedWithoutCache: f }; f = !0, v || (v = T_e(i.path, m.originalFileName, o)); let x = uPe(v, r, i, o, s, l); return S?.set(i.path, m.path, s, l, v, x), { moduleSpecifiers: x, computedWithoutCache: f } } function uPe(e, t, r, i, o, s = {}) { let l = cK(r.path, i), f = oF(o, t, r), d = mn(e, A => mn(i.getFileIncludeReasons().get(Ts(A.path, i.getCurrentDirectory(), l.getCanonicalFileName)), w => { if (w.kind !== 3 || w.file !== r.path || r.impliedNodeFormat && r.impliedNodeFormat !== aq(r, w.index)) return; let C = GF(r, w.index).text; return f.relativePreference !== 1 || !Jd(C) ? C : void 0 })); if (d) return [d]; let g = vt(e, A => A.isInNodeModules), m, v, S, x; for (let A of e) { let w = A.isInNodeModules ? lK(A, l, r, i, t, o, void 0, s.overrideImportMode) : void 0; if (m = Sn(m, w), w && A.isRedirect) return m; if (!w) { let C = g_e(A.path, l, t, i, s.overrideImportMode || r.impliedNodeFormat, f, A.isRedirect); if (!C) continue; A.isRedirect ? S = Sn(S, C) : cj(C) ? v = Sn(v, C) : (!g || A.isInNodeModules) && (x = Sn(x, C)) } } return v?.length ? v : S?.length ? S : m?.length ? m : L.checkDefined(x) } function cK(e, t) { let r = Dl(t.useCaseSensitiveFileNames ? t.useCaseSensitiveFileNames() : !0), i = ni(e); return { getCanonicalFileName: r, importingSourceFileName: e, sourceDirectory: i } } function g_e(e, t, r, i, o, { getAllowedEndingsInPreferredOrder: s, relativePreference: l }, f) { let { baseUrl: d, paths: g, rootDirs: m } = r; if (f && !g) return; let { sourceDirectory: v, getCanonicalFileName: S } = t, x = s(o), A = m && fPe(m, e, v, S, x, r) || jL(S0(Xp(v, e, S)), x, r); if (!d && !g || l === 0) return f ? void 0 : A; let w = _a(ZH(r, i) || d, i.getCurrentDirectory()), C = C_e(e, w, S); if (!C) return f ? void 0 : A; let P = g && S_e(C, g, x, i, r); if (f) return P; let F = P === void 0 && d !== void 0 ? jL(C, x, r) : P; if (!F) return A; if (l === 1 && !Jd(F)) return F; if (l === 3 && !Jd(F)) { let B = r.configFilePath ? Ts(ni(r.configFilePath), i.getCurrentDirectory(), t.getCanonicalFileName) : t.getCanonicalFileName(i.getCurrentDirectory()), q = Ts(e, B, S), W = na(v, B), Y = na(q, B); if (W && !Y || !W && Y) return F; let R = v_e(i, ni(q)); return v_e(i, v) !== R ? F : A } return I_e(F) || tN(A) < tN(F) ? A : F } function tN(e) { let t = 0; for (let r = na(e, "./") ? 2 : 0; r < e.length; r++)e.charCodeAt(r) === 47 && t++; return t } function y_e(e, t) { return g0(t.isRedirect, e.isRedirect) || BR(e.path, t.path) } function v_e(e, t) { return e.getNearestAncestorDirectoryWithPackageJson ? e.getNearestAncestorDirectoryWithPackageJson(t) : !!Th(t, r => e.fileExists(vi(r, "package.json")) ? !0 : void 0) } function b_e(e, t, r, i, o) { var s; let l = lb(r), f = r.getCurrentDirectory(), d = r.isSourceOfProjectReferenceRedirect(t) ? r.getProjectReferenceRedirect(t) : void 0, g = Ts(t, f, l), m = r.redirectTargetsMap.get(g) || Je, S = [...d ? [d] : Je, t, ...m].map(P => _a(P, f)), x = !Ji(S, sL); if (!i) { let P = mn(S, F => !(x && sL(F)) && o(F, d === F)); if (P) return P } let A = (s = r.getSymlinkCache) == null ? void 0 : s.call(r).getSymlinkedDirectoriesByRealpath(), w = _a(t, f); return A && Th(ni(w), P => { let F = A.get(cu(Ts(P, f, l))); if (F) return fj(e, P, l) ? !1 : mn(S, B => { if (!fj(B, P, l)) return; let q = Xp(P, B, l); for (let W of F) { let Y = Fy(W, q), R = o(Y, B === d); if (x = !0, R) return R } }) }) || (i ? mn(S, P => x && sL(P) ? void 0 : o(P, P === d)) : void 0) } function E_e(e, t, r, i, o = {}) { var s; let l = Ts(t, r.getCurrentDirectory(), lb(r)), f = (s = r.getModuleSpecifierCache) == null ? void 0 : s.call(r); if (f) { let g = f.get(e, l, i, o); if (g?.modulePaths) return g.modulePaths } let d = T_e(e, t, r); return f && f.setModulePaths(e, l, i, o, d), d } function T_e(e, t, r) { let i = lb(r), o = new Map, s = !1; b_e(e, t, r, !0, (f, d) => { let g = JS(f); o.set(f, { path: i(f), isRedirect: d, isInNodeModules: g }), s = s || g }); let l = []; for (let f = ni(e); o.size !== 0;) { let d = cu(f), g; o.forEach(({ path: v, isRedirect: S, isInNodeModules: x }, A) => { na(v, d) && ((g || (g = [])).push({ path: A, isRedirect: S, isInNodeModules: x }), o.delete(A)) }), g && (g.length > 1 && g.sort(y_e), l.push(...g)); let m = ni(f); if (m === f) break; f = m } if (o.size) { let f = lo(o.values()); f.length > 1 && f.sort(y_e), l.push(...f) } return l } function dPe(e, t) { var r; let i = (r = e.declarations) == null ? void 0 : r.find(l => lH(l) && (!D0(l) || !fl(l_(l.name)))); if (i) return i.name.text; let s = Zi(e.declarations, l => { var f, d, g, m; if (!Tc(l)) return; let v = w(l); if (!((f = v?.parent) != null && f.parent && Tp(v.parent) && lu(v.parent.parent) && Li(v.parent.parent.parent))) return; let S = (m = (g = (d = v.parent.parent.symbol.exports) == null ? void 0 : d.get("export=")) == null ? void 0 : g.valueDeclaration) == null ? void 0 : m.expression; if (!S) return; let x = t.getSymbolAtLocation(S); if (!x) return; if ((x?.flags & 2097152 ? t.getAliasedSymbol(x) : x) === l.symbol) return v.parent.parent; function w(C) { for (; C.flags & 4;)C = C.parent; return C } })[0]; if (s) return s.name.text } function S_e(e, t, r, i, o) { for (let l in t) for (let f of t[l]) { let d = So(f), g = d.indexOf("*"), m = r.map(v => ({ ending: v, value: jL(e, [v], o) })); if (Hm(d) && m.push({ ending: void 0, value: e }), g !== -1) { let v = d.substring(0, g), S = d.substring(g + 1); for (let { ending: x, value: A } of m) if (A.length >= v.length + S.length && na(A, v) && Oc(A, S) && s({ ending: x, value: A })) { let w = A.substring(v.length, A.length - S.length); return l.replace("*", w) } } else if (vt(m, v => v.ending !== 0 && d === v.value) || vt(m, v => v.ending === 0 && d === v.value && s(v))) return l } function s({ ending: l, value: f }) { return l !== 0 || f === jL(e, [l], o, i) } } function cF(e, t, r, i, o, s, l = 0) { if (typeof o == "string") { let f = _a(vi(r, o), void 0), d = GR(t) ? ld(t) + lF(t, e) : void 0; switch (l) { case 0: if (cT(t, f) === 0 || d && cT(d, f) === 0) return { moduleFileToTry: i }; break; case 1: if (Gy(f, t)) { let S = Xp(f, t, !1); return { moduleFileToTry: _a(vi(vi(i, o), S), void 0) } } break; case 2: let g = f.indexOf("*"), m = f.slice(0, g), v = f.slice(g + 1); if (na(t, m) && Oc(t, v)) { let S = t.slice(m.length, t.length - v.length); return { moduleFileToTry: i.replace("*", S) } } if (d && na(d, m) && Oc(d, v)) { let S = d.slice(m.length, d.length - v.length); return { moduleFileToTry: i.replace("*", S) } } break } } else { if (Array.isArray(o)) return mn(o, f => cF(e, t, r, i, f, s)); if (typeof o == "object" && o !== null) { if (nF(o)) return mn(bh(o), f => { let d = _a(vi(i, f), void 0), g = Oc(f, "/") ? 1 : jl(f, "*") ? 2 : 0; return cF(e, t, r, d, o[f], s, g) }); for (let f of bh(o)) if (f === "default" || s.indexOf(f) >= 0 || QO(s, f)) { let d = o[f], g = cF(e, t, r, i, d, s); if (g) return g } } } } function fPe(e, t, r, i, o, s) { let l = x_e(t, e, i); if (l === void 0) return; let f = x_e(r, e, i), d = Uo(f, m => on(l, v => S0(Xp(m, v, i)))), g = WU(d, BR); if (g) return jL(g, o, s) } function lK({ path: e, isRedirect: t }, { getCanonicalFileName: r, sourceDirectory: i }, o, s, l, f, d, g) { if (!s.fileExists || !s.readFile) return; let m = jW(e); if (!m) return; let S = oF(f, l, o).getAllowedEndingsInPreferredOrder(), x = e, A = !1; if (!d) { let q = m.packageRootIndex, W; for (; ;) { let { moduleFileToTry: Y, packageRootPath: R, blockedByExports: ie, verbatimFromExports: $ } = B(q); if ($s(l) !== 1) { if (ie) return; if ($) return Y } if (R) { x = R, A = !0; break } if (W || (W = Y), q = e.indexOf(_s, q + 1), q === -1) { x = jL(W, S, l, s); break } } } if (t && !A) return; let w = s.getGlobalTypingsCacheLocation && s.getGlobalTypingsCacheLocation(), C = r(x.substring(0, m.topLevelNodeModulesIndex)); if (!(na(i, C) || w && na(r(w), C))) return; let P = x.substring(m.topLevelPackageNameIndex + 1), F = ZO(P); return $s(l) === 1 && F === P ? void 0 : F; function B(q) { var W, Y; let R = e.substring(0, q), ie = vi(R, "package.json"), $ = e, fe = !1, Z = (Y = (W = s.getPackageJsonInfoCache) == null ? void 0 : W.call(s)) == null ? void 0 : Y.getPackageJsonInfo(ie); if (typeof Z == "object" || Z === void 0 && s.fileExists(ie)) { let U = Z?.contents.packageJsonContent || JSON.parse(s.readFile(ie)), re = g || o.impliedNodeFormat; if (xW(l)) { let ge = R.substring(m.topLevelPackageNameIndex + 1), X = ZO(ge), Ve = P2(l, re === 99), we = U.exports ? cF(l, e, R, X, U.exports, Ve) : void 0; if (we) return { ...GR(we.moduleFileToTry) ? { moduleFileToTry: ld(we.moduleFileToTry) + lF(we.moduleFileToTry, l) } : we, verbatimFromExports: !0 }; if (U.exports) return { moduleFileToTry: e, blockedByExports: !0 } } let le = U.typesVersions ? q3(U.typesVersions) : void 0; if (le) { let ge = e.slice(R.length + 1), X = S_e(ge, le.paths, S, s, l); X === void 0 ? fe = !0 : $ = vi(R, X) } let _e = U.typings || U.types || U.main || "index.js"; if (Ta(_e) && !(fe && NW(g4(le.paths), _e))) { let ge = Ts(_e, R, r); if (ld(ge) === ld(r($))) return { packageRootPath: R, moduleFileToTry: $ } } } else { let U = r($.substring(m.packageRootIndex + 1)); if (U === "index.d.ts" || U === "index.js" || U === "index.ts" || U === "index.tsx") return { moduleFileToTry: $, packageRootPath: R } } return { moduleFileToTry: $ } } } function _Pe(e, t) { if (!e.fileExists) return; let r = t_(nL({ allowJs: !0 }, [{ extension: "node", isMixedContent: !1 }, { extension: "json", isMixedContent: !1, scriptKind: 6 }])); for (let i of r) { let o = t + i; if (e.fileExists(o)) return o } } function x_e(e, t, r) { return Zi(t, i => { let o = C_e(e, i, r); return o !== void 0 && I_e(o) ? void 0 : o }) } function jL(e, t, r, i) { if ($c(e, [".json", ".mjs", ".cjs"])) return e; let o = ld(e); if (e === o) return e; if ($c(e, [".d.mts", ".mts", ".d.cts", ".cts"])) return o + uK(e, r); if (!$c(e, [".d.ts"]) && $c(e, [".ts"]) && jl(e, ".d.")) return A_e(e); switch (t[0]) { case 0: let s = pA(o, "/index"); return i && s !== o && _Pe(i, s) ? o : s; case 1: return o; case 2: return o + uK(e, r); case 3: if (Fu(e)) { let l = t.findIndex(d => d === 0 || d === 1), f = t.indexOf(2); return l !== -1 && l < f ? o : o + uK(e, r) } return e; default: return L.assertNever(t[0]) } } function A_e(e) { let t = Hl(e); if (!Oc(e, ".ts") || !jl(t, ".d.") || $c(t, [".d.ts"])) return; let r = UR(e, ".ts"), i = r.substring(r.lastIndexOf(".")); return r.substring(0, r.indexOf(".d.")) + i } function uK(e, t) { var r; return (r = lF(e, t)) != null ? r : L.fail(`Extension ${jR(e)} is unsupported:: FileName:: ${e}`) } function lF(e, t) { let r = Hm(e); switch (r) { case ".ts": case ".d.ts": return ".js"; case ".tsx": return t.jsx === 1 ? ".jsx" : ".js"; case ".js": case ".jsx": case ".json": return r; case ".d.mts": case ".mts": case ".mjs": return ".mjs"; case ".d.cts": case ".cts": case ".cjs": return ".cjs"; default: return } } function C_e(e, t, r) { let i = Q1(t, e, t, r, !1); return qp(i) ? void 0 : i } function I_e(e) { return na(e, "..") } var L_e = gt({ "src/compiler/moduleSpecifiers.ts"() { "use strict"; fa() } }), Q0 = {}; Mo(Q0, { countPathComponents: () => tN, forEachFileNameOfModule: () => b_e, getModuleSpecifier: () => sF, getModuleSpecifiers: () => m_e, getModuleSpecifiersWithCacheInfo: () => h_e, getNodeModulesPackageName: () => cPe, tryGetJSExtensionForFile: () => lF, tryGetModuleSpecifiersFromCache: () => lPe, tryGetRealFileNameForNonJsDeclarationFileName: () => A_e, updateModuleSpecifier: () => sPe }); var dK = gt({ "src/compiler/_namespaces/ts.moduleSpecifiers.ts"() { "use strict"; L_e() } }); function pPe() { this.flags = 0 } function zo(e) { return e.id || (e.id = mK, mK++), e.id } function $a(e) { return e.id || (e.id = pK, pK++), e.id } function fK(e, t) { let r = Gh(e); return r === 1 || t && r === 2 } function k_e(e) {
+                var t = zu(() => { var n = new Map; return e.getSourceFiles().forEach(a => { a.resolvedModules && a.resolvedModules.forEach(({ resolvedModule: c }) => { c?.packageId && n.set(c.packageId.name, c.extension === ".d.ts" || !!n.get(c.packageId.name)) }) }), n }), r = [], i = n => { r.push(n) }, o, s = new Set, l, f, d = ml.getSymbolConstructor(), g = ml.getTypeConstructor(), m = ml.getSignatureConstructor(), v = 0, S = 0, x = 0, A = 0, w = 0, C = 0, P, F, B = !1, q = Ua(), W = [1], Y = e.getCompilerOptions(), R = Do(Y), ie = Rl(Y), $ = !!Y.experimentalDecorators, fe = MR(Y), Z = wT(Y), U = Uf(Y, "strictNullChecks"), re = Uf(Y, "strictFunctionTypes"), le = Uf(Y, "strictBindCallApply"), _e = Uf(Y, "strictPropertyInitialization"), ge = Uf(Y, "noImplicitAny"), X = Uf(Y, "noImplicitThis"), Ve = Uf(Y, "useUnknownInCatchVariables"), we = !!Y.keyofStringsOnly, ke = Y.suppressExcessPropertyErrors ? 0 : 8192, Pe = Y.exactOptionalPropertyTypes, Ce = FZe(), Ie = hrt(), Be = Wa(), Ne = Ua(), Le = wo(4, "undefined"); Le.declarations = []; var Ye = wo(1536, "globalThis", 8); Ye.exports = Ne, Ye.declarations = [], Ne.set(Ye.escapedName, Ye); var _t = wo(4, "arguments"), ct = wo(4, "require"), Rt = Y.verbatimModuleSyntax ? "verbatimModuleSyntax" : "isolatedModules", We; let qe = { getNodeCount: () => ou(e.getSourceFiles(), (n, a) => n + a.nodeCount, 0), getIdentifierCount: () => ou(e.getSourceFiles(), (n, a) => n + a.identifierCount, 0), getSymbolCount: () => ou(e.getSourceFiles(), (n, a) => n + a.symbolCount, S), getTypeCount: () => v, getInstantiationCount: () => x, getRelationCacheSizes: () => ({ assignable: Zu.size, identity: td.size, subtype: hm.size, strictSubtype: x_.size }), isUndefinedSymbol: n => n === Le, isArgumentsSymbol: n => n === _t, isUnknownSymbol: n => n === Ht, getMergedSymbol: No, getDiagnostics: HLe, getGlobalDiagnostics: Nnt, getRecursionIdentity: AC, getUnmatchedProperties: lre, getTypeOfSymbolAtLocation: (n, a) => { let c = ea(a); return c ? RYe(n, c) : ve }, getTypeOfSymbol: zn, getSymbolsOfParameterPropertyDeclaration: (n, a) => { let c = ea(n, ha); return c === void 0 ? L.fail("Cannot get symbols of a synthetic parameter that cannot be resolved to a parse-tree node.") : (L.assert(Ad(c, c.parent)), yE(c, Bs(a))) }, getDeclaredTypeOfSymbol: gs, getPropertiesOfType: Jo, getPropertyOfType: (n, a) => ja(n, Bs(a)), getPrivateIdentifierPropertyOfType: (n, a, c) => { let u = ea(c); if (!u) return; let p = Bs(a), h = JB(p, u); return h ? zre(n, h) : void 0 }, getTypeOfPropertyOfType: (n, a) => Vc(n, Bs(a)), getIndexInfoOfType: (n, a) => Cm(n, a === 0 ? ae : rt), getIndexInfosOfType: tu, getIndexInfosOfIndexSymbol: one, getSignaturesOfType: xa, getIndexTypeOfType: (n, a) => fg(n, a === 0 ? ae : rt), getIndexType: n => Gp(n), getBaseTypes: _o, getBaseTypeOfLiteralType: ky, getWidenedType: Sd, getTypeFromTypeNode: n => { let a = ea(n, bi); return a ? $r(a) : ve }, getParameterType: P_, getParameterIdentifierNameAtPosition: ZQe, getPromisedTypeOfPromise: wD, getAwaitedType: n => rT(n), getReturnTypeOfSignature: qo, isNullableType: zB, getNullableType: TB, getNonNullableType: yg, getNonOptionalType: ere, getTypeArguments: Ko, typeToTypeNode: Be.typeToTypeNode, indexInfoToIndexSignatureDeclaration: Be.indexInfoToIndexSignatureDeclaration, signatureToSignatureDeclaration: Be.signatureToSignatureDeclaration, symbolToEntityName: Be.symbolToEntityName, symbolToExpression: Be.symbolToExpression, symbolToNode: Be.symbolToNode, symbolToTypeParameterDeclarations: Be.symbolToTypeParameterDeclarations, symbolToParameterDeclaration: Be.symbolToParameterDeclaration, typeParameterToDeclaration: Be.typeParameterToDeclaration, getSymbolsInScope: (n, a) => { let c = ea(n); return c ? Pnt(c, a) : [] }, getSymbolAtLocation: n => { let a = ea(n); return a ? Zf(a, !0) : void 0 }, getIndexInfosAtLocation: n => { let a = ea(n); return a ? jnt(a) : void 0 }, getShorthandAssignmentValueSymbol: n => { let a = ea(n); return a ? Hnt(a) : void 0 }, getExportSpecifierLocalTargetSymbol: n => { let a = ea(n, Mu); return a ? Wnt(a) : void 0 }, getExportSymbolOfSymbol(n) { return No(n.exportSymbol || n) }, getTypeAtLocation: n => { let a = ea(n); return a ? G1(a) : ve }, getTypeOfAssignmentPattern: n => { let a = ea(n, vI); return a && bU(a) || ve }, getPropertySymbolOfDestructuringAssignment: n => { let a = ea(n, Re); return a ? znt(a) : void 0 }, signatureToString: (n, a, c, u) => ne(n, ea(a), c, u), typeToString: (n, a, c) => Ee(n, ea(a), c), symbolToString: (n, a, c, u) => E(n, ea(a), c, u), typePredicateToString: (n, a, c) => kl(n, ea(a), c), writeSignature: (n, a, c, u, p) => ne(n, ea(a), c, u, p), writeType: (n, a, c, u) => Ee(n, ea(a), c, u), writeSymbol: (n, a, c, u, p) => E(n, ea(a), c, u, p), writeTypePredicate: (n, a, c, u) => kl(n, ea(a), c, u), getAugmentedPropertiesOfType: Wie, getRootSymbols: YLe, getSymbolOfExpando: eU, getContextualType: (n, a) => { let c = ea(n, ot); if (c) return a & 4 ? Qt(c, () => Ru(c, a)) : Ru(c, a) }, getContextualTypeForObjectLiteralElement: n => { let a = ea(n, Og); return a ? Rre(a, void 0) : void 0 }, getContextualTypeForArgumentAtIndex: (n, a) => { let c = ea(n, rS); return c && wre(c, a) }, getContextualTypeForJsxAttribute: n => { let a = ea(n, d6); return a && _Ce(a, void 0) }, isContextSensitive: $f, getTypeOfPropertyOfContextualType: eT, getFullyQualifiedName: rh, getResolvedSignature: (n, a, c) => tn(n, a, c, 0), getResolvedSignatureForStringLiteralCompletions: (n, a, c) => Qt(a, () => tn(n, c, void 0, 32)), getResolvedSignatureForSignatureHelp: (n, a, c) => zt(n, () => tn(n, a, c, 16)), getExpandedParameters: Txe, hasEffectiveRestParameter: jp, containsArgumentsReference: nne, getConstantValue: n => { let a = ea(n, tke); return a ? zie(a) : void 0 }, isValidPropertyAccess: (n, a) => { let c = ea(n, dse); return !!c && dQe(c, Bs(a)) }, isValidPropertyAccessForCompletions: (n, a, c) => { let u = ea(n, br); return !!u && HCe(u, a, c) }, getSignatureFromDeclaration: n => { let a = ea(n, Ia); return a ? ip(a) : void 0 }, isImplementationOfOverload: n => { let a = ea(n, Ia); return a ? ZLe(a) : void 0 }, getImmediateAliasedSymbol: Mre, getAliasedSymbol: wc, getEmitResolver: cC, getExportsOfModule: sy, getExportsAndPropertiesOfModule: C1, forEachExportAndPropertyOfModule: kv, getSymbolWalker: f_e(tKe, Lf, qo, _o, R_, zn, Qf, eu, Yd, Ko), getAmbientModules: oit, getJsxIntrinsicTagNamesAt: W$e, isOptionalParameter: n => { let a = ea(n, ha); return a ? Qk(a) : !1 }, tryGetMemberInModuleExports: (n, a) => rg(Bs(n), a), tryGetMemberInModuleExportsAndProperties: (n, a) => of(Bs(n), a), tryFindAmbientModule: n => tne(n, !0), tryFindAmbientModuleWithoutAugmentations: n => tne(n, !1), getApparentType: Eu, getUnionType: Gr, isTypeAssignableTo: to, createAnonymousType: ls, createSignature: Am, createSymbol: wo, createIndexInfo: Fp, getAnyType: () => Se, getStringType: () => ae, getNumberType: () => rt, createPromiseType: jM, createArrayType: nu, getElementTypeOfArrayType: Xne, getBooleanType: () => Te, getFalseType: n => n ? Ke : oe, getTrueType: n => n ? pe : z, getVoidType: () => yt, getUndefinedType: () => Oe, getNullType: () => ln, getESSymbolType: () => j, getNeverType: () => lt, getOptionalType: () => Kt, getPromiseType: () => oM(!1), getPromiseLikeType: () => aAe(!1), getAsyncIterableType: () => { let n = ZG(!1); if (n !== ro) return n }, isSymbolAccessible: dy, isArrayType: _f, isTupleType: po, isArrayLikeType: Kv, isEmptyAnonymousObjectType: hh, isTypeInvalidDueToUnionDiscriminant: FJe, getExactOptionalProperties: cXe, getAllPossiblePropertiesOfTypes: GJe, getSuggestedSymbolForNonexistentProperty: qre, getSuggestionForNonexistentProperty: Xre, getSuggestedSymbolForNonexistentJSXAttribute: VCe, getSuggestedSymbolForNonexistentSymbol: (n, a, c) => Yre(n, Bs(a), c), getSuggestionForNonexistentSymbol: (n, a, c) => sQe(n, Bs(a), c), getSuggestedSymbolForNonexistentModule: qB, getSuggestionForNonexistentExport: cQe, getSuggestedSymbolForNonexistentClassMember: UCe, getBaseConstraintOfType: bu, getDefaultFromTypeParameter: n => n && n.flags & 262144 ? jE(n) : void 0, resolveName(n, a, c, u) { return zs(a, Bs(n), c, void 0, void 0, !1, u) }, getJsxNamespace: n => Gi(Rb(n)), getJsxFragmentFactory: n => { let a = Kie(n); return a && Gi(Yd(a).escapedText) }, getAccessibleSymbolChain: Rv, getTypePredicateOfSignature: Lf, resolveExternalModuleName: n => { let a = ea(n, ot); return a && Gl(a, a, !0) }, resolveExternalModuleSymbol: Vu, tryGetThisTypeAt: (n, a, c) => { let u = ea(n); return u && Cre(u, a, c) }, getTypeArgumentConstraint: n => { let a = ea(n, bi); return a && get(a) }, getSuggestionDiagnostics: (n, a) => { let c = ea(n, Li) || L.fail("Could not determine parsed source file."); if (rL(c, Y, e)) return Je; let u; try { return o = a, jie(c), L.assert(!!(Rr(c).flags & 1)), u = si(u, mE.getDiagnostics(c.fileName)), rLe(jLe(c), (p, h, T) => { !Gw(p) && !VLe(h, !!(p.flags & 16777216)) && (u || (u = [])).push({ ...T, category: 2 }) }), u || Je } finally { o = void 0 } }, runWithCancellationToken: (n, a) => { try { return o = n, a(qe) } finally { o = void 0 } }, getLocalTypeParametersOfClassOrInterfaceOrTypeAlias: yy, isDeclarationVisible: Xf, isPropertyAccessible: Qre, getTypeOnlyAliasDeclaration: nd, getMemberOverrideModifierStatus: Xtt, isTypeParameterPossiblyReferenced: fM, typeHasCallOrConstructSignatures: EU }; function zt(n, a) { let c = jn(n, rS), u = c && Rr(c).resolvedSignature; c && (Rr(c).resolvedSignature = void 0); let p = a(); return c && (Rr(c).resolvedSignature = u), p } function Qt(n, a) { let c = jn(n, rS); if (c) { let p = n; do Rr(p).skipDirectInference = !0, p = p.parent; while (p && p !== c) } B = !0; let u = zt(n, a); if (B = !1, c) { let p = n; do Rr(p).skipDirectInference = void 0, p = p.parent; while (p && p !== c) } return u } function tn(n, a, c, u) { let p = ea(n, rS); We = c; let h = p ? MC(p, a, u) : void 0; return We = void 0, h } var kn = new Map, _n = new Map, Gt = new Map, $n = new Map, ui = new Map, Ni = new Map, Pi = new Map, gr = new Map, pt = new Map, nn = new Map, Dt = new Map, pn = new Map, An = new Map, Kn = new Map, hi = [], ri = new Map, vn = new Set, Ht = wo(4, "unknown"), En = wo(0, "__resolving__"), dr = new Map, Cr = new Map, Se = Cc(1, "any"), at = Cc(1, "any", 262144), Tt = Cc(1, "any"), ve = Cc(1, "error"), nt = Cc(1, "unresolved"), ce = Cc(1, "any", 65536), Q = Cc(1, "intrinsic"), ue = Cc(2, "unknown"), G = Cc(2, "unknown"), Oe = Cc(32768, "undefined"), je = U ? Oe : Cc(32768, "undefined", 65536), Ge = Cc(32768, "undefined"), kt = Pe ? Ge : Oe, Kt = Cc(32768, "undefined"), ln = Cc(65536, "null"), ir = U ? ln : Cc(65536, "null", 65536), ae = Cc(4, "string"), rt = Cc(8, "number"), Ot = Cc(64, "bigint"), Ke = Cc(512, "false"), oe = Cc(512, "false"), pe = Cc(512, "true"), z = Cc(512, "true"); pe.regularType = z, pe.freshType = pe, z.regularType = z, z.freshType = pe, Ke.regularType = oe, Ke.freshType = Ke, oe.regularType = oe, oe.freshType = Ke; var Te = Gr([oe, z]), j = Cc(4096, "symbol"), yt = Cc(16384, "void"), lt = Cc(131072, "never"), Qe = Cc(131072, "never", 262144), Vt = Cc(131072, "never"), Hn = Cc(131072, "never"), jr = Cc(67108864, "object"), ei = Gr([ae, rt]), Kr = Gr([ae, rt, j]), Si = we ? ae : Kr, Ja = Gr([rt, Ot]), Za = Gr([ae, rt, Te, Ot, ln, Oe]), Fa = WE(["", ""], [rt]), Hi = dM(n => n.flags & 262144 ? Pqe(n) : n, () => "(restrictive mapper)"), xi = dM(n => n.flags & 262144 ? Tt : n, () => "(permissive mapper)"), Nr = Cc(131072, "never"), Fo = dM(n => n.flags & 262144 ? Nr : n, () => "(unique literal mapper)"), Qr, Wi = dM(n => (Qr && (n === md || n === Pc || n === bl) && Qr(!0), n), () => "(unmeasurable reporter)"), gn = dM(n => (Qr && (n === md || n === Pc || n === bl) && Qr(!1), n), () => "(unreliable reporter)"), Ki = ls(void 0, q, Je, Je, Je), kc = ls(void 0, q, Je, Je, Je); kc.objectFlags |= 2048; var Ps = wo(2048, "__type"); Ps.members = Ua(); var mc = ls(Ps, q, Je, Je, Je), xc = ls(void 0, q, Je, Je, Je), hc = U ? Gr([Oe, ln, xc]) : ue, ro = ls(void 0, q, Je, Je, Je); ro.instantiations = new Map; var aa = ls(void 0, q, Je, Je, Je); aa.objectFlags |= 262144; var Co = ls(void 0, q, Je, Je, Je), gc = ls(void 0, q, Je, Je, Je), Ll = ls(void 0, q, Je, Je, Je), md = rd(), Pc = rd(); Pc.constraint = md; var bl = rd(), ss = rd(), qs = rd(); qs.constraint = ss; var Rs = iM(1, "<<unresolved>>", 0, Se), As = Am(void 0, void 0, void 0, Je, Se, void 0, 0, 0), jt = Am(void 0, void 0, void 0, Je, ve, void 0, 0, 0), yc = Am(void 0, void 0, void 0, Je, Se, void 0, 0, 0), Ql = Am(void 0, void 0, void 0, Je, Qe, void 0, 0, 0), yu = Fp(rt, ae, !0), se = new Map, ht = { get yieldType() { return L.fail("Not supported") }, get returnType() { return L.fail("Not supported") }, get nextType() { return L.fail("Not supported") } }, wt = Eg(Se, Se, Se), K = Eg(Se, Se, ue), Xe = Eg(lt, Se, Oe), ft = { iterableCacheKey: "iterationTypesOfAsyncIterable", iteratorCacheKey: "iterationTypesOfAsyncIterator", iteratorSymbolName: "asyncIterator", getGlobalIteratorType: hKe, getGlobalIterableType: ZG, getGlobalIterableIteratorType: gKe, getGlobalGeneratorType: yKe, resolveIterationType: rT, mustHaveANextMethodDiagnostic: _.An_async_iterator_must_have_a_next_method, mustBeAMethodDiagnostic: _.The_0_property_of_an_async_iterator_must_be_a_method, mustHaveAValueDiagnostic: _.The_type_returned_by_the_0_method_of_an_async_iterator_must_be_a_promise_for_a_type_with_a_value_property }, Yt = { iterableCacheKey: "iterationTypesOfIterable", iteratorCacheKey: "iterationTypesOfIterator", iteratorSymbolName: "iterator", getGlobalIteratorType: vKe, getGlobalIterableType: pne, getGlobalIterableIteratorType: bKe, getGlobalGeneratorType: EKe, resolveIterationType: (n, a) => n, mustHaveANextMethodDiagnostic: _.An_iterator_must_have_a_next_method, mustBeAMethodDiagnostic: _.The_0_property_of_an_iterator_must_be_a_method, mustHaveAValueDiagnostic: _.The_type_returned_by_the_0_method_of_an_iterator_must_have_a_value_property }, pr, yr = new Map, ta = !1, Go, Ka, vo, ka, Hs, Uc, Gu, $o, jo, Ws, hd, vc, nf, ye, Et, bn, Ri, io, ee, Ze, At, xt, qt, Ln, mr, Vr, gi, Ea, bo, Qo, Cs, Bu, Pd, Dc, gd, Zl, Md, zf, Io, Jf, Fd, E_, Y_, M, He, Nt, Pn, la, oa, be, De, mt, St, Zt, rn = new Map, sn = 0, Dn = 0, kr = 0, ki = !1, Vn = 0, $t, Xn, ra, Is = [], Mc = [], mm = [], Hh = 0, T_ = [], Cb = [], mv = 0, gx = ff(""), _1 = op(0), yx = aB({ negative: !1, base10Value: "0" }), Wh = [], S_ = [], hv = [], eh = 0, $_ = 10, gv = [], lE = [], Ib = [], zh = [], p1 = [], uE = [], dE = [], fE = [], yv = [], vx = [], _E = [], pE = [], vv = [], Lb = [], bv = [], m1 = [], Jh = [], Lo = XA(), mE = XA(), sC = Tm(), Zg, Kh, hm = new Map, x_ = new Map, Zu = new Map, ed = new Map, td = new Map, kb = new Map, Db = Ua(); Db.set(Le.escapedName, Le); var bx = [[".mts", ".mjs"], [".ts", ".js"], [".cts", ".cjs"], [".mjs", ".mjs"], [".js", ".js"], [".cjs", ".cjs"], [".tsx", Y.jsx === 1 ? ".jsx" : ".js"], [".jsx", ".jsx"], [".json", ".json"]]; return grt(), qe; function wb(n) { return n ? Kn.get(n) : void 0 } function qh(n, a) { return n && Kn.set(n, a), a } function Rb(n) { if (n) { let a = Gn(n); if (a) if (US(n)) { if (a.localJsxFragmentNamespace) return a.localJsxFragmentNamespace; let c = a.pragmas.get("jsxfrag"); if (c) { let p = ba(c) ? c[0] : c; if (a.localJsxFragmentFactory = zS(p.arguments.factory, R), $e(a.localJsxFragmentFactory, Ob, Cd), a.localJsxFragmentFactory) return a.localJsxFragmentNamespace = Yd(a.localJsxFragmentFactory).escapedText } let u = Kie(n); if (u) return a.localJsxFragmentFactory = u, a.localJsxFragmentNamespace = Yd(u).escapedText } else { let c = h1(a); if (c) return a.localJsxNamespace = c } } return Zg || (Zg = "React", Y.jsxFactory ? (Kh = zS(Y.jsxFactory, R), $e(Kh, Ob), Kh && (Zg = Yd(Kh).escapedText)) : Y.reactNamespace && (Zg = Bs(Y.reactNamespace))), Kh || (Kh = D.createQualifiedName(D.createIdentifier(Gi(Zg)), "createElement")), Zg } function h1(n) { if (n.localJsxNamespace) return n.localJsxNamespace; let a = n.pragmas.get("jsx"); if (a) { let c = ba(a) ? a[0] : a; if (n.localJsxFactory = zS(c.arguments.factory, R), $e(n.localJsxFactory, Ob, Cd), n.localJsxFactory) return n.localJsxNamespace = Yd(n.localJsxFactory).escapedText } } function Ob(n) { return om(n, -1, -1), xn(n, Ob, Bh) } function cC(n, a) { return HLe(n, a), Ie } function Ex(n, a, c, u, p, h) { let T = n ? hr(n, a, c, u, p, h) : ps(a, c, u, p, h), k = Lo.lookup(T); return k || (Lo.add(T), T) } function Ev(n, a, c, u, p, h, T) { let k = Fe(a, c, u, p, h, T); return k.skippedOn = n, k } function hE(n, a, c, u, p, h) { return n ? hr(n, a, c, u, p, h) : ps(a, c, u, p, h) } function Fe(n, a, c, u, p, h) { let T = hE(n, a, c, u, p, h); return Lo.add(T), T } function ey(n, a) { n ? Lo.add(a) : mE.add({ ...a, category: 2 }) } function Ip(n, a, c, u, p, h, T) { if (a.pos < 0 || a.end < 0) { if (!n) return; let k = Gn(a); ey(n, "message" in c ? al(k, 0, 0, c, u, p, h, T) : yH(k, c)); return } ey(n, "message" in c ? hr(a, c, u, p, h, T) : Lh(Gn(a), a, c)) } function Tv(n, a, c, u, p, h, T) { let k = Fe(n, c, u, p, h, T); if (a) { let O = hr(n, _.Did_you_forget_to_use_await); Ao(k, O) } return k } function Nb(n, a) { let c = Array.isArray(n) ? mn(n, Cj) : Cj(n); return c && Ao(a, hr(c, _.The_declaration_was_marked_as_deprecated_here)), mE.add(a), a } function Sv(n) { if (Fn(n.declarations) > 1) { let a = ju(n); if (a && a.flags & 64) return vt(n.declarations, c => !!(G_(c) & 268435456)) } return !!(WB(n) & 268435456) } function Xh(n, a, c) { let u = hr(n, _._0_is_deprecated, c); return Nb(a, u) } function g1(n, a, c, u) { let p = c ? hr(n, _.The_signature_0_of_1_is_deprecated, u, c) : hr(n, _._0_is_deprecated, u); return Nb(a, p) } function wo(n, a, c) { S++; let u = new d(n | 33554432, a); return u.links = new yK, u.links.checkFlags = c || 0, u } function A_(n, a) { let c = wo(1, n); return c.links.type = a, c } function gE(n, a) { let c = wo(4, n); return c.links.type = a, c } function Kc(n) { let a = 0; return n & 2 && (a |= 111551), n & 1 && (a |= 111550), n & 4 && (a |= 0), n & 8 && (a |= 900095), n & 16 && (a |= 110991), n & 32 && (a |= 899503), n & 64 && (a |= 788872), n & 256 && (a |= 899327), n & 128 && (a |= 899967), n & 512 && (a |= 110735), n & 8192 && (a |= 103359), n & 32768 && (a |= 46015), n & 65536 && (a |= 78783), n & 262144 && (a |= 526824), n & 524288 && (a |= 788968), n & 2097152 && (a |= 2097152), a } function th(n, a) { a.mergeId || (a.mergeId = hK, hK++), gv[a.mergeId] = n } function Pb(n) { let a = wo(n.flags, n.escapedName); return a.declarations = n.declarations ? n.declarations.slice() : [], a.parent = n.parent, n.valueDeclaration && (a.valueDeclaration = n.valueDeclaration), n.constEnumOnlyModule && (a.constEnumOnlyModule = !0), n.members && (a.members = new Map(n.members)), n.exports && (a.exports = new Map(n.exports)), th(a, n), a } function C_(n, a, c = !1) { if (!(n.flags & Kc(a.flags)) || (a.flags | n.flags) & 67108864) { if (a === n) return n; if (!(n.flags & 33554432)) { let p = Ac(n); if (p === Ht) return a; n = Pb(p) } a.flags & 512 && n.flags & 512 && n.constEnumOnlyModule && !a.constEnumOnlyModule && (n.constEnumOnlyModule = !1), n.flags |= a.flags, a.valueDeclaration && rR(n, a.valueDeclaration), si(n.declarations, a.declarations), a.members && (n.members || (n.members = Ua()), ll(n.members, a.members, c)), a.exports && (n.exports || (n.exports = Ua()), ll(n.exports, a.exports, c)), c || th(n, a) } else if (n.flags & 1024) n !== Ye && Fe(a.declarations && sa(a.declarations[0]), _.Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity, E(n)); else { let p = !!(n.flags & 384 || a.flags & 384), h = !!(n.flags & 2 || a.flags & 2), T = p ? _.Enum_declarations_can_only_merge_with_namespace_or_other_enum_declarations : h ? _.Cannot_redeclare_block_scoped_variable_0 : _.Duplicate_identifier_0, k = a.declarations && Gn(a.declarations[0]), O = n.declarations && Gn(n.declarations[0]), H = h6(k, Y.checkJs), J = h6(O, Y.checkJs), de = E(a); if (k && O && pr && !p && k !== O) { let Ae = cT(k.path, O.path) === -1 ? k : O, xe = Ae === k ? O : k, tt = VD(pr, `${Ae.path}|${xe.path}`, () => ({ firstFile: Ae, secondFile: xe, conflictingSymbols: new Map })), It = VD(tt.conflictingSymbols, de, () => ({ isBlockScoped: h, firstFileLocations: [], secondFileLocations: [] })); H || u(It.firstFileLocations, a), J || u(It.secondFileLocations, n) } else H || Mb(a, T, de, n), J || Mb(n, T, de, a) } return n; function u(p, h) { if (h.declarations) for (let T of h.declarations) Of(p, T) } } function Mb(n, a, c, u) { mn(n.declarations, p => { Ml(p, a, c, u.declarations) }) } function Ml(n, a, c, u) { let p = (ob(n, !1) ? wH(n) : sa(n)) || n, h = Ex(p, a, c); for (let T of u || Je) { let k = (ob(T, !1) ? wH(T) : sa(T)) || T; if (k === p) continue; h.relatedInformation = h.relatedInformation || []; let O = hr(k, _._0_was_also_declared_here, c), H = hr(k, _.and_here); Fn(h.relatedInformation) >= 5 || vt(h.relatedInformation, J => ZI(J, H) === 0 || ZI(J, O) === 0) || Ao(h, Fn(h.relatedInformation) ? H : O) } } function Yh(n, a) { if (!n?.size) return a; if (!a?.size) return n; let c = Ua(); return ll(c, n), ll(c, a), c } function ll(n, a, c = !1) { a.forEach((u, p) => { let h = n.get(p); n.set(p, h ? C_(h, u, c) : No(u)) }) } function y1(n) { var a, c, u; let p = n.parent; if (((a = p.symbol.declarations) == null ? void 0 : a[0]) !== p) { L.assert(p.symbol.declarations.length > 1); return } if (mp(p)) ll(Ne, p.symbol.exports); else { let h = n.parent.parent.flags & 16777216 ? void 0 : _.Invalid_module_name_in_augmentation_module_0_cannot_be_found, T = ah(n, n, h, !0); if (!T) return; if (T = Vu(T), T.flags & 1920) if (vt(Ka, k => T === k.symbol)) { let k = C_(p.symbol, T, !0); vo || (vo = new Map), vo.set(n.text, k) } else { if ((c = T.exports) != null && c.get("__export") && ((u = p.symbol.exports) != null && u.size)) { let k = Mte(T, "resolvedExports"); for (let [O, H] of lo(p.symbol.exports.entries())) k.has(O) && !T.exports.has(O) && C_(k.get(O), H) } C_(T, p.symbol) } else Fe(n, _.Cannot_augment_module_0_because_it_resolves_to_a_non_module_entity, n.text) } } function lC(n, a, c) { a.forEach((p, h) => { let T = n.get(h); T ? mn(T.declarations, u(Gi(h), c)) : n.set(h, p) }); function u(p, h) { return T => Lo.add(hr(T, h, p)) } } function Ai(n) { var a; if (n.flags & 33554432) return n.links; let c = $a(n); return (a = lE[c]) != null ? a : lE[c] = new yK } function Rr(n) { let a = zo(n); return Ib[a] || (Ib[a] = new pPe) } function gm(n) { return n.kind === 308 && !kd(n) } function yd(n, a, c) { if (c) { let u = No(n.get(a)); if (u && (L.assert((ac(u) & 1) === 0, "Should never get an instantiated symbol here."), u.flags & c || u.flags & 2097152 && Fl(u) & c)) return u } } function yE(n, a) { let c = n.parent, u = n.parent.parent, p = yd(c.locals, a, 111551), h = yd(vy(u.symbol), a, 111551); return p && h ? [p, h] : L.fail("There should exist two symbols, one as property declaration and one as parameter declaration") } function $h(n, a) { let c = Gn(n), u = Gn(a), p = tm(n); if (c !== u) { if (ie && (c.externalModuleIndicator || u.externalModuleIndicator) || !Ss(Y) || kC(a) || n.flags & 16777216 || T(a, n)) return !0; let O = e.getSourceFiles(); return O.indexOf(c) <= O.indexOf(u) } if (n.pos <= a.pos && !(Na(n) && zw(a.parent) && !n.initializer && !n.exclamationToken)) { if (n.kind === 205) { let O = cb(a, 205); return O ? jn(O, Wo) !== jn(n, Wo) || n.pos < O.pos : $h(cb(n, 257), a) } else { if (n.kind === 257) return !h(n, a); if (sl(n)) return !jn(a, O => ts(O) && O.parent.parent === n); if (Na(n)) return !k(n, a, !1); if (Ad(n, n.parent)) return !(Do(Y) === 99 && fe && Zc(n) === Zc(a) && T(a, n)) } return !0 } if (a.parent.kind === 278 || a.parent.kind === 274 && a.parent.isExportEquals || a.kind === 274 && a.isExportEquals || a.flags & 8388608 || kC(a) || k2e(a)) return !0; if (T(a, n)) return Do(Y) === 99 && fe && Zc(n) && (Na(n) || Ad(n, n.parent)) ? !k(n, a, !0) : !0; return !1; function h(O, H) { switch (O.parent.parent.kind) { case 240: case 245: case 247: if (Lp(H, O, p)) return !0; break }let J = O.parent.parent; return CA(J) && Lp(H, J.expression, p) } function T(O, H) { return !!jn(O, J => { if (J === p) return "quit"; if (Ia(J)) return !0; if (oc(J)) return H.pos < O.pos; let de = zr(J.parent, Na); if (de && de.initializer === J) { if (Ca(J.parent)) { if (H.kind === 171) return !0; if (Na(H) && Zc(O) === Zc(H)) { let xe = H.name; if (Re(xe) || pi(xe)) { let tt = zn(fr(H)), It = Pr(H.parent.members, oc); if (tnt(xe, tt, It, H.parent.pos, J.pos)) return !0 } } } else if (!(H.kind === 169 && !Ca(H)) || Zc(O) !== Zc(H)) return !0 } return !1 }) } function k(O, H, J) { return H.end > O.end ? !1 : jn(H, Ae => { if (Ae === O) return "quit"; switch (Ae.kind) { case 216: return !0; case 169: return J && (Na(O) && Ae.parent === O.parent || Ad(O, O.parent) && Ae.parent === O.parent.parent) ? "quit" : !0; case 238: switch (Ae.parent.kind) { case 174: case 171: case 175: return !0; default: return !1 }default: return !1 } }) === void 0 } } function nh(n, a, c) { let u = Do(Y), p = a; if (ha(c) && p.body && n.valueDeclaration && n.valueDeclaration.pos >= p.body.pos && n.valueDeclaration.end <= p.body.end && u >= 2) { let k = Rr(p); return k.declarationRequiresScopeChange === void 0 && (k.declarationRequiresScopeChange = mn(p.parameters, h) || !1), !k.declarationRequiresScopeChange } return !1; function h(k) { return T(k.name) || !!k.initializer && T(k.initializer) } function T(k) { switch (k.kind) { case 216: case 215: case 259: case 173: return !1; case 171: case 174: case 175: case 299: return T(k.name); case 169: return zc(k) ? u < 99 || !fe : T(k.name); default: return wj(k) || Jl(k) ? u < 7 : Wo(k) && k.dotDotDotToken && cm(k.parent) ? u < 4 : bi(k) ? !1 : pa(k, T) || !1 } } } function ym(n) { return pT(n) && Ch(n.type) || DL(n) && Ch(n.typeExpression) } function zs(n, a, c, u, p, h, T = !1, k = !0) { return Fb(n, a, c, u, p, h, T, k, yd) } function Fb(n, a, c, u, p, h, T, k, O) { var H, J, de; let Ae = n, xe, tt, It, Tn, un, Nn = !1, en = n, cn, rr = !1; e: for (; n;) { if (a === "const" && ym(n)) return; if (Qp(n) && n.locals && !gm(n) && (xe = O(n.locals, a, c))) { let Cn = !0; if (Ia(n) && tt && tt !== n.body ? (c & xe.flags & 788968 && tt.kind !== 323 && (Cn = xe.flags & 262144 ? tt === n.type || tt.kind === 166 || tt.kind === 344 || tt.kind === 345 || tt.kind === 165 : !1), c & xe.flags & 3 && (nh(xe, n, tt) ? Cn = !1 : xe.flags & 1 && (Cn = tt.kind === 166 || tt === n.type && !!jn(xe.valueDeclaration, ha)))) : n.kind === 191 && (Cn = tt === n.trueType), Cn) break e; xe = void 0 } switch (Nn = Nn || Gb(n, tt), n.kind) { case 308: if (!kd(n)) break; rr = !0; case 264: let Cn = ((H = fr(n)) == null ? void 0 : H.exports) || q; if (n.kind === 308 || Tc(n) && n.flags & 16777216 && !mp(n)) { if (xe = Cn.get("default")) { let Hr = QA(xe); if (Hr && xe.flags & c && Hr.escapedName === a) break e; xe = void 0 } let Br = Cn.get(a); if (Br && Br.flags === 2097152 && (nc(Br, 278) || nc(Br, 277))) break } if (a !== "default" && (xe = O(Cn, a, c & 2623475))) if (Li(n) && n.commonJsModuleIndicator && !((J = xe.declarations) != null && J.some(Ff))) xe = void 0; else break e; break; case 263: if (xe = O(((de = fr(n)) == null ? void 0 : de.exports) || q, a, c & 8)) { u && d_(Y) && !(n.flags & 16777216) && Gn(n) !== Gn(xe.valueDeclaration) && Fe(en, _.Cannot_access_0_from_another_file_without_qualification_when_1_is_enabled_Use_2_instead, Gi(a), Rt, `${Gi(vd(n).escapedName)}.${Gi(a)}`); break e } break; case 169: if (!Ca(n)) { let Br = wv(n.parent); Br && Br.locals && O(Br.locals, a, c & 111551) && (L.assertNode(n, Na), Tn = n) } break; case 260: case 228: case 261: if (xe = O(fr(n).members || q, a, c & 788968)) { if (!Tx(xe, n)) { xe = void 0; break } if (tt && Ca(tt)) { u && Fe(en, _.Static_members_cannot_reference_class_type_parameters); return } break e } if (_u(n) && c & 32) { let Br = n.name; if (Br && a === Br.escapedText) { xe = n.symbol; break e } } break; case 230: if (tt === n.expression && n.parent.token === 94) { let Br = n.parent.parent; if (Yr(Br) && (xe = O(fr(Br).members, a, c & 788968))) { u && Fe(en, _.Base_class_expressions_cannot_reference_class_type_parameters); return } } break; case 164: if (cn = n.parent.parent, (Yr(cn) || cn.kind === 261) && (xe = O(fr(cn).members, a, c & 788968))) { u && Fe(en, _.A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type); return } break; case 216: if (Do(Y) >= 2) break; case 171: case 173: case 174: case 175: case 259: if (c & 3 && a === "arguments") { xe = _t; break e } break; case 215: if (c & 3 && a === "arguments") { xe = _t; break e } if (c & 16) { let Br = n.name; if (Br && a === Br.escapedText) { xe = n.symbol; break e } } break; case 167: n.parent && n.parent.kind === 166 && (n = n.parent), n.parent && (_l(n.parent) || n.parent.kind === 260) && (n = n.parent); break; case 349: case 341: case 343: let Rn = OI(n); Rn && (n = Rn.parent); break; case 166: tt && (tt === n.initializer || tt === n.name && La(tt)) && (un || (un = n)); break; case 205: tt && (tt === n.initializer || tt === n.name && La(tt)) && CT(n) && !un && (un = n); break; case 192: if (c & 262144) { let Br = n.typeParameter.name; if (Br && a === Br.escapedText) { xe = n.typeParameter.symbol; break e } } break }b1(n) && (It = n), tt = n, n = H_(n) ? J6(n) || n.parent : (xp(n) || y3(n)) && sb(n) || n.parent } if (h && xe && (!It || xe !== It.symbol) && (xe.isReferenced |= c), !xe) { if (tt && (L.assertNode(tt, Li), tt.commonJsModuleIndicator && a === "exports" && c & tt.symbol.flags)) return tt.symbol; T || (xe = O(Ne, a, c)) } if (!xe && Ae && Yn(Ae) && Ae.parent && qu(Ae.parent, !1)) return ct; function Jt() { return Tn && !(fe && Do(Y) >= 9) ? (Fe(en, en && Tn.type && Y8(Tn.type, en.pos) ? _.Type_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor : _.Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor, os(Tn.name), Cf(p)), !0) : !1 } if (xe) { if (u && Jt()) return } else { u && i(() => { if (!en || !Sx(en, a, p) && !Jt() && !xv(en) && !T1(en, a, c) && !S1(en, a) && !Ax(en, a, c) && !rf(en, a, c) && !xx(en, a, c)) { let Cn, Rn; if (p && (Rn = aQe(p), Rn && Fe(en, u, Cf(p), Rn)), !Rn && k && eh < $_ && (Cn = Yre(Ae, a, c), Cn?.valueDeclaration && lu(Cn.valueDeclaration) && mp(Cn.valueDeclaration) && (Cn = void 0), Cn)) { let Hr = E(Cn), qi = Kre(Ae, Cn, !1), wa = c === 1920 || p && typeof p != "string" && ws(p) ? _.Cannot_find_namespace_0_Did_you_mean_1 : qi ? _.Could_not_find_name_0_Did_you_mean_1 : _.Cannot_find_name_0_Did_you_mean_1, Xc = hE(en, wa, Cf(p), Hr); ey(!qi, Xc), Cn.valueDeclaration && Ao(Xc, hr(Cn.valueDeclaration, _._0_is_declared_here, Hr)) } !Cn && !Rn && p && Fe(en, u, Cf(p)), eh++ } }); return } return u && i(() => { if (en && (c & 2 || (c & 32 || c & 384) && (c & 111551) === 111551)) { let Cn = tp(xe); (Cn.flags & 2 || Cn.flags & 32 || Cn.flags & 384) && Ub(Cn, en) } if (xe && rr && (c & 111551) === 111551 && !(Ae.flags & 8388608)) { let Cn = No(xe); Fn(Cn.declarations) && Ji(Cn.declarations, Rn => gO(Rn) || Li(Rn) && !!Rn.symbol.globalExports) && Ip(!Y.allowUmdGlobalAccess, en, _._0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead, Gi(a)) } if (xe && un && !Nn && (c & 111551) === 111551) { let Cn = No(zG(xe)), Rn = nm(un); Cn === fr(un) ? Fe(en, _.Parameter_0_cannot_reference_itself, os(un.name)) : Cn.valueDeclaration && Cn.valueDeclaration.pos > un.pos && Rn.parent.locals && O(Rn.parent.locals, Cn.escapedName, c) === Cn && Fe(en, _.Parameter_0_cannot_reference_identifier_1_declared_after_it, os(un.name), os(en)) } if (xe && en && c & 111551 && xe.flags & 2097152 && !(xe.flags & 111551) && !TS(en)) { let Cn = nd(xe, 111551); if (Cn) { let Rn = Cn.kind === 278 || Cn.kind === 275 || Cn.kind === 277 ? _._0_cannot_be_used_as_a_value_because_it_was_exported_using_export_type : _._0_cannot_be_used_as_a_value_because_it_was_imported_using_import_type, Br = Gi(a); v1(Fe(en, Rn, Br), Cn, Br) } } }), xe } function v1(n, a, c) { return a ? Ao(n, hr(a, a.kind === 278 || a.kind === 275 || a.kind === 277 ? _._0_was_exported_here : _._0_was_imported_here, c)) : n } function Gb(n, a) { return n.kind !== 216 && n.kind !== 215 ? vL(n) || (Ds(n) || n.kind === 169 && !Ca(n)) && (!a || a !== n.name) : a && a === n.name ? !1 : n.asteriskToken || Mr(n, 512) ? !0 : !ET(n) } function b1(n) { switch (n.kind) { case 259: case 260: case 261: case 263: case 262: case 264: return !0; default: return !1 } } function Cf(n) { return Ta(n) ? Gi(n) : os(n) } function Tx(n, a) { if (n.declarations) { for (let c of n.declarations) if (c.kind === 165 && (H_(c.parent) ? dS(c.parent) : c.parent) === a) return !(H_(c.parent) && wr(c.parent.parent.tags, Ff)) } return !1 } function Sx(n, a, c) { if (!Re(n) || n.escapedText !== a || WLe(n) || kC(n)) return !1; let u = Ku(n, !1, !1), p = u; for (; p;) { if (Yr(p.parent)) { let h = fr(p.parent); if (!h) break; let T = zn(h); if (ja(T, a)) return Fe(n, _.Cannot_find_name_0_Did_you_mean_the_static_member_1_0, Cf(c), E(h)), !0; if (p === u && !Ca(p)) { let k = gs(h).thisType; if (ja(k, a)) return Fe(n, _.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0, Cf(c)), !0 } } p = p.parent } return !1 } function xv(n) { let a = E1(n); return a && uc(a, 64, !0) ? (Fe(n, _.Cannot_extend_an_interface_0_Did_you_mean_implements, Qc(a)), !0) : !1 } function E1(n) { switch (n.kind) { case 79: case 208: return n.parent ? E1(n.parent) : void 0; case 230: if (bc(n.expression)) return n.expression; default: return } } function T1(n, a, c) { let u = 1920 | (Yn(n) ? 111551 : 0); if (c === u) { let p = Ac(zs(n, a, 788968 & ~u, void 0, void 0, !1)), h = n.parent; if (p) { if (Yu(h)) { L.assert(h.left === n, "Should only be resolving left side of qualified name as a namespace"); let T = h.right.escapedText; if (ja(gs(p), T)) return Fe(h, _.Cannot_access_0_1_because_0_is_a_type_but_not_a_namespace_Did_you_mean_to_retrieve_the_type_of_the_property_1_in_0_with_0_1, Gi(a), Gi(T)), !0 } return Fe(n, _._0_only_refers_to_a_type_but_is_being_used_as_a_namespace_here, Gi(a)), !0 } } return !1 } function xx(n, a, c) { if (c & 788584) { let u = Ac(zs(n, a, 111127, void 0, void 0, !1)); if (u && !(u.flags & 1920)) return Fe(n, _._0_refers_to_a_value_but_is_being_used_as_a_type_here_Did_you_mean_typeof_0, Gi(a)), !0 } return !1 } function Bb(n) { return n === "any" || n === "string" || n === "number" || n === "boolean" || n === "never" || n === "unknown" } function S1(n, a) { return Bb(a) && n.parent.kind === 278 ? (Fe(n, _.Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module, a), !0) : !1 } function rf(n, a, c) { if (c & 111551) { if (Bb(a)) return Qh(n) ? Fe(n, _.An_interface_cannot_extend_a_primitive_type_like_0_an_interface_can_only_extend_named_types_and_classes, Gi(a)) : Fe(n, _._0_only_refers_to_a_type_but_is_being_used_as_a_value_here, Gi(a)), !0; let u = Ac(zs(n, a, 788544, void 0, void 0, !1)), p = u && Fl(u); if (u && p !== void 0 && !(p & 111551)) { let h = Gi(a); return I_(a) ? Fe(n, _._0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_es2015_or_later, h) : Q_(n, u) ? Fe(n, _._0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Did_you_mean_to_use_1_in_0, h, h === "K" ? "P" : "K") : Fe(n, _._0_only_refers_to_a_type_but_is_being_used_as_a_value_here, h), !0 } } return !1 } function Qh(n) { let a = n.parent.parent, c = a.parent; if (a && c) { let u = dd(a) && a.token === 94, p = ku(c); return u && p } return !1 } function Q_(n, a) { let c = jn(n.parent, u => ts(u) || $d(u) ? !1 : Rd(u) || "quit"); if (c && c.members.length === 1) { let u = gs(a); return !!(u.flags & 1048576) && zM(u, 384, !0) } return !1 } function I_(n) { switch (n) { case "Promise": case "Symbol": case "Map": case "WeakMap": case "Set": case "WeakSet": return !0 }return !1 } function Ax(n, a, c) { if (c & 111127) { if (Ac(zs(n, a, 1024, void 0, void 0, !1))) return Fe(n, _.Cannot_use_namespace_0_as_a_value, Gi(a)), !0 } else if (c & 788544 && Ac(zs(n, a, 1536, void 0, void 0, !1))) return Fe(n, _.Cannot_use_namespace_0_as_a_type, Gi(a)), !0; return !1 } function Ub(n, a) { var c; if (L.assert(!!(n.flags & 2 || n.flags & 32 || n.flags & 384)), n.flags & 67108881 && n.flags & 32) return; let u = (c = n.declarations) == null ? void 0 : c.find(p => sH(p) || Yr(p) || p.kind === 263); if (u === void 0) return L.fail("checkResolvedBlockScopedVariable could not find block-scoped declaration"); if (!(u.flags & 16777216) && !$h(u, a)) { let p, h = os(sa(u)); n.flags & 2 ? p = Fe(a, _.Block_scoped_variable_0_used_before_its_declaration, h) : n.flags & 32 ? p = Fe(a, _.Class_0_used_before_its_declaration, h) : n.flags & 256 ? p = Fe(a, _.Enum_0_used_before_its_declaration, h) : (L.assert(!!(n.flags & 128)), U0(Y) && (p = Fe(a, _.Enum_0_used_before_its_declaration, h))), p && Ao(p, hr(u, _._0_is_declared_here, h)) } } function Lp(n, a, c) { return !!a && !!jn(n, u => u === a || (u === c || Ia(u) && (!ET(u) || qA(u)) ? "quit" : !1)) } function x1(n) { switch (n.kind) { case 268: return n; case 270: return n.parent; case 271: return n.parent.parent; case 273: return n.parent.parent.parent; default: return } } function Uu(n) { return n.declarations && dA(n.declarations, Zh) } function Zh(n) { return n.kind === 268 || n.kind === 267 || n.kind === 270 && !!n.name || n.kind === 271 || n.kind === 277 || n.kind === 273 || n.kind === 278 || n.kind === 274 && zA(n) || ar(n) && ic(n) === 2 && zA(n) || Us(n) && ar(n.parent) && n.parent.left === n && n.parent.operatorToken.kind === 63 && kp(n.parent.right) || n.kind === 300 || n.kind === 299 && kp(n.initializer) || n.kind === 257 && N0(n) || n.kind === 205 && N0(n.parent.parent) } function kp(n) { return pR(n) || ms(n) && cp(n) } function Dp(n, a) { let c = ry(n); if (c) { let p = $I(c.expression).arguments[0]; return Re(c.name) ? Ac(ja(Fxe(p), c.name.escapedText)) : void 0 } if (wi(n) || n.moduleReference.kind === 280) { let p = Gl(n, IH(n) || wI(n)), h = Vu(p); return qf(n, p, h, !1), h } let u = ep(n.moduleReference, a); return eg(n, u), u } function eg(n, a) { if (qf(n, void 0, a, !1) && !n.isTypeOnly) { let c = nd(fr(n)), u = c.kind === 278 || c.kind === 275, p = u ? _.An_import_alias_cannot_reference_a_declaration_that_was_exported_using_export_type : _.An_import_alias_cannot_reference_a_declaration_that_was_imported_using_import_type, h = u ? _._0_was_exported_here : _._0_was_imported_here, T = c.kind === 275 ? "*" : Gi(c.name.escapedText); Ao(Fe(n.moduleReference, p), hr(c, h, T)) } } function vE(n, a, c, u) { let p = n.exports.get("export="), h = p ? ja(zn(p), a, !0) : n.exports.get(a), T = Ac(h, u); return qf(c, h, T, !1), T } function A1(n) { return pc(n) && !n.isExportEquals || Mr(n, 1024) || Mu(n) } function ty(n) { return es(n) ? W_(Gn(n), n) : void 0 } function bE(n, a) { return n === 99 && a === 1 } function cs(n) { return ty(n) === 99 && Oc(n.text, ".json") } function ny(n, a, c, u) { let p = n && ty(u); if (n && p !== void 0) { let h = bE(p, n.impliedNodeFormat); if (p === 99 || h) return h } if (!Z) return !1; if (!n || n.isDeclarationFile) { let h = vE(a, "default", void 0, !0); return !(h && vt(h.declarations, A1) || vE(a, Bs("__esModule"), void 0, c)) } return Cu(n) ? typeof n.externalModuleIndicator != "object" && !vE(a, Bs("__esModule"), void 0, c) : AE(a) } function Cx(n, a) { let c = Gl(n, n.parent.moduleSpecifier); if (c) return Vb(c, n, a) } function Vb(n, a, c) { var u; let p; CI(n) ? p = n : p = vE(n, "default", a, c); let h = (u = n.declarations) == null ? void 0 : u.find(Li), T = jb(a); if (!T) return p; let k = cs(T), O = ny(h, n, c, T); if (!p && !O && !k) if (AE(n) && !(wT(Y) || f_(Y))) { let H = ie >= 5 ? "allowSyntheticDefaultImports" : "esModuleInterop", de = n.exports.get("export=").valueDeclaration, Ae = Fe(a.name, _.Module_0_can_only_be_default_imported_using_the_1_flag, E(n), H); de && Ao(Ae, hr(de, _.This_module_is_declared_with_export_and_can_only_be_used_with_a_default_import_when_using_the_0_flag, H)) } else lm(a) ? Ix(n, a) : Av(n, n, a, eS(a) && a.propertyName || a.name); else if (O || k) { let H = Vu(n, c) || Ac(n, c); return qf(a, n, H, !1), H } return qf(a, p, void 0, !1), p } function jb(n) { switch (n.kind) { case 270: return n.parent.moduleSpecifier; case 268: return um(n.moduleReference) ? n.moduleReference.expression : void 0; case 271: return n.parent.parent.moduleSpecifier; case 273: return n.parent.parent.parent.moduleSpecifier; case 278: return n.parent.parent.moduleSpecifier; default: return L.assertNever(n) } } function Ix(n, a) { var c, u, p; if ((c = n.exports) != null && c.has(a.symbol.escapedName)) Fe(a.name, _.Module_0_has_no_default_export_Did_you_mean_to_use_import_1_from_0_instead, E(n), E(a.symbol)); else { let h = Fe(a.name, _.Module_0_has_no_default_export, E(n)), T = (u = n.exports) == null ? void 0 : u.get("__export"); if (T) { let k = (p = T.declarations) == null ? void 0 : p.find(O => { var H, J; return !!(Il(O) && O.moduleSpecifier && ((J = (H = Gl(O, O.moduleSpecifier)) == null ? void 0 : H.exports) != null && J.has("default"))) }); k && Ao(h, hr(k, _.export_Asterisk_does_not_re_export_a_default)) } } } function uC(n, a) { let c = n.parent.parent.moduleSpecifier, u = Gl(n, c), p = Jb(u, c, a, !1); return qf(n, u, p, !1), p } function Lx(n, a) { let c = n.parent.moduleSpecifier, u = c && Gl(n, c), p = c && Jb(u, c, a, !1); return qf(n, u, p, !1), p } function Qn(n, a) { if (n === Ht && a === Ht) return Ht; if (n.flags & 790504) return n; let c = wo(n.flags | a.flags, n.escapedName); return L.assert(n.declarations || a.declarations), c.declarations = fA(Qi(n.declarations, a.declarations), Zv), c.parent = n.parent || a.parent, n.valueDeclaration && (c.valueDeclaration = n.valueDeclaration), a.members && (c.members = new Map(a.members)), n.exports && (c.exports = new Map(n.exports)), c } function lc(n, a, c, u) { var p; if (n.flags & 1536) { let h = Gd(n).get(a.escapedText), T = Ac(h, u), k = (p = Ai(n).typeOnlyExportStarMap) == null ? void 0 : p.get(a.escapedText); return qf(c, h, T, !1, k, a.escapedText), T } } function zi(n, a) { if (n.flags & 3) { let c = n.valueDeclaration.type; if (c) return Ac(ja($r(c), a)) } } function af(n, a, c = !1) { var u; let p = IH(n) || n.moduleSpecifier, h = Gl(n, p), T = !br(a) && a.propertyName || a.name; if (!Re(T)) return; let k = T.escapedText === "default" && !!(Y.allowSyntheticDefaultImports || f_(Y)), O = Jb(h, p, !1, k); if (O && T.escapedText) { if (CI(h)) return h; let H; h && h.exports && h.exports.get("export=") ? H = ja(zn(O), T.escapedText, !0) : H = zi(O, T.escapedText), H = Ac(H, c); let J = lc(O, T, a, c); if (J === void 0 && T.escapedText === "default") { let Ae = (u = h.declarations) == null ? void 0 : u.find(Li); (cs(p) || ny(Ae, h, c, p)) && (J = Vu(h, c) || Ac(h, c)) } let de = J && H && J !== H ? Qn(H, J) : J || H; return de || Av(h, O, n, T), de } } function Av(n, a, c, u) { var p; let h = rh(n, c), T = os(u), k = qB(u, a); if (k !== void 0) { let O = E(k), H = Fe(u, _._0_has_no_exported_member_named_1_Did_you_mean_2, h, T, O); k.valueDeclaration && Ao(H, hr(k.valueDeclaration, _._0_is_declared_here, O)) } else (p = n.exports) != null && p.has("default") ? Fe(u, _.Module_0_has_no_exported_member_1_Did_you_mean_to_use_import_1_from_0_instead, h, T) : vm(c, u, T, n, h) } function vm(n, a, c, u, p) { var h, T; let k = (T = (h = zr(u.valueDeclaration, Qp)) == null ? void 0 : h.locals) == null ? void 0 : T.get(a.escapedText), O = u.exports; if (k) { let H = O?.get("export="); if (H) wp(H, k) ? Wn(n, a, c, p) : Fe(a, _.Module_0_has_no_exported_member_1, p, c); else { let J = O ? wr(ene(O), Ae => !!wp(Ae, k)) : void 0, de = J ? Fe(a, _.Module_0_declares_1_locally_but_it_is_exported_as_2, p, c, E(J)) : Fe(a, _.Module_0_declares_1_locally_but_it_is_not_exported, p, c); k.declarations && Ao(de, ...on(k.declarations, (Ae, xe) => hr(Ae, xe === 0 ? _._0_is_declared_here : _.and_here, c))) } } else Fe(a, _.Module_0_has_no_exported_member_1, p, c) } function Wn(n, a, c, u) { if (ie >= 5) { let p = f_(Y) ? _._0_can_only_be_imported_by_using_a_default_import : _._0_can_only_be_imported_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import; Fe(a, p, c) } else if (Yn(n)) { let p = f_(Y) ? _._0_can_only_be_imported_by_using_a_require_call_or_by_using_a_default_import : _._0_can_only_be_imported_by_using_a_require_call_or_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import; Fe(a, p, c) } else { let p = f_(Y) ? _._0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import : _._0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import; Fe(a, p, c, c, u) } } function kx(n, a) { if ($u(n) && vr(n.propertyName || n.name) === "default") { let T = jb(n), k = T && Gl(n, T); if (k) return Vb(k, n, a) } let c = Wo(n) ? nm(n) : n.parent.parent.parent, u = ry(c), p = af(c, u || n, a), h = n.propertyName || n.name; return u && p && Re(h) ? Ac(ja(zn(p), h.escapedText), a) : (qf(n, void 0, p, !1), p) } function ry(n) { if (wi(n) && n.initializer && br(n.initializer)) return n.initializer } function nl(n, a) { if ($p(n.parent)) { let c = Vu(n.parent.symbol, a); return qf(n, void 0, c, !1), c } } function Kf(n, a, c) { if (vr(n.propertyName || n.name) === "default") { let p = jb(n), h = p && Gl(n, p); if (h) return Vb(h, n, !!c) } let u = n.parent.parent.moduleSpecifier ? af(n.parent.parent, n, c) : uc(n.propertyName || n.name, a, !1, c); return qf(n, void 0, u, !1), u } function Z_(n, a) { let c = pc(n) ? n.expression : n.right, u = iy(c, a); return qf(n, void 0, u, !1), u } function iy(n, a) { if (_u(n)) return Ic(n).symbol; if (!Cd(n) && !bc(n)) return; let c = uc(n, 901119, !0, a); return c || (Ic(n), Rr(n).resolvedSymbol) } function EE(n, a) { if (ar(n.parent) && n.parent.left === n && n.parent.operatorToken.kind === 63) return iy(n.parent.right, a) } function L_(n, a = !1) { switch (n.kind) { case 268: case 257: return Dp(n, a); case 270: return Cx(n, a); case 271: return uC(n, a); case 277: return Lx(n, a); case 273: case 205: return kx(n, a); case 278: return Kf(n, 901119, a); case 274: case 223: return Z_(n, a); case 267: return nl(n, a); case 300: return uc(n.name, 901119, !0, a); case 299: return iy(n.initializer, a); case 209: case 208: return EE(n, a); default: return L.fail() } } function ay(n, a = 901119) { return n ? (n.flags & (2097152 | a)) === 2097152 || !!(n.flags & 2097152 && n.flags & 67108864) : !1 } function Ac(n, a) { return !a && ay(n) ? wc(n) : n } function wc(n) { L.assert((n.flags & 2097152) !== 0, "Should only get Alias here."); let a = Ai(n); if (a.aliasTarget) a.aliasTarget === En && (a.aliasTarget = Ht); else { a.aliasTarget = En; let c = Uu(n); if (!c) return L.fail(); let u = L_(c); a.aliasTarget === En ? a.aliasTarget = u || Ht : Fe(c, _.Circular_definition_of_import_alias_0, E(n)) } return a.aliasTarget } function tg(n) { if (Ai(n).aliasTarget !== En) return wc(n) } function Fl(n) { let a = n.flags, c; for (; n.flags & 2097152;) { let u = wc(n); if (u === Ht) return 67108863; if (u === n || c?.has(u)) break; u.flags & 2097152 && (c ? c.add(u) : c = new Set([n, u])), a |= u.flags, n = u } return a } function qf(n, a, c, u, p, h) { if (!n || br(n)) return !1; let T = fr(n); if (I0(n)) { let O = Ai(T); return O.typeOnlyDeclaration = n, !0 } if (p) { let O = Ai(T); return O.typeOnlyDeclaration = p, T.escapedName !== h && (O.typeOnlyExportStarName = h), !0 } let k = Ai(T); return bm(k, a, u) || bm(k, c, u) } function bm(n, a, c) { var u, p, h; if (a && (n.typeOnlyDeclaration === void 0 || c && n.typeOnlyDeclaration === !1)) { let T = (p = (u = a.exports) == null ? void 0 : u.get("export=")) != null ? p : a, k = T.declarations && wr(T.declarations, I0); n.typeOnlyDeclaration = (h = k ?? Ai(T).typeOnlyDeclaration) != null ? h : !1 } return !!n.typeOnlyDeclaration } function nd(n, a) { if (!(n.flags & 2097152)) return; let c = Ai(n); if (a === void 0) return c.typeOnlyDeclaration || void 0; if (c.typeOnlyDeclaration) { let u = c.typeOnlyDeclaration.kind === 275 ? Ac(sh(c.typeOnlyDeclaration.symbol.parent).get(c.typeOnlyExportStarName || n.escapedName)) : wc(c.typeOnlyDeclaration.symbol); return Fl(u) & a ? c.typeOnlyDeclaration : void 0 } } function TE(n) { if (Y.verbatimModuleSyntax) return; let a = fr(n), c = wc(a); c && (c === Ht || Fl(c) & 111551 && !MD(c) && !nd(a, 111551)) && Hb(a) } function Hb(n) { L.assert(!Y.verbatimModuleSyntax); let a = Ai(n); if (!a.referenced) { a.referenced = !0; let c = Uu(n); if (!c) return L.fail(); GA(c) && Fl(Ac(n)) & 111551 && Ic(c.moduleReference) } } function Wb(n) { let a = Ai(n); a.constEnumReferenced || (a.constEnumReferenced = !0) } function ep(n, a) { return n.kind === 79 && zI(n) && (n = n.parent), n.kind === 79 || n.parent.kind === 163 ? uc(n, 1920, !1, a) : (L.assert(n.parent.kind === 268), uc(n, 901119, !1, a)) } function rh(n, a) { return n.parent ? rh(n.parent, a) + "." + E(n) : E(n, a, void 0, 36) } function SE(n) { for (; Yu(n.parent);)n = n.parent; return n } function oy(n) { let a = Yd(n), c = zs(a, a.escapedText, 111551, void 0, a, !0); if (c) { for (; Yu(a.parent);) { let u = zn(c); if (c = ja(u, a.parent.right.escapedText), !c) return; a = a.parent } return c } } function uc(n, a, c, u, p) { if (rc(n)) return; let h = 1920 | (Yn(n) ? a & 111551 : 0), T; if (n.kind === 79) { let k = a === h || ws(n) ? _.Cannot_find_namespace_0 : L2e(Yd(n)), O = Yn(n) && !ws(n) ? ng(n, a) : void 0; if (T = No(zs(p || n, n.escapedText, a, c || O ? void 0 : k, n, !0, !1)), !T) return No(O) } else if (n.kind === 163 || n.kind === 208) { let k = n.kind === 163 ? n.left : n.expression, O = n.kind === 163 ? n.right : n.name, H = uc(k, h, c, !1, p); if (!H || rc(O)) return; if (H === Ht) return H; if (H.valueDeclaration && Yn(H.valueDeclaration) && $s(Y) !== 100 && wi(H.valueDeclaration) && H.valueDeclaration.initializer && dIe(H.valueDeclaration.initializer)) { let J = H.valueDeclaration.initializer.arguments[0], de = Gl(J, J); if (de) { let Ae = Vu(de); Ae && (H = Ae) } } if (T = No(yd(Gd(H), O.escapedText, a)), !T) { if (!c) { let J = rh(H), de = os(O), Ae = qB(O, H); if (Ae) { Fe(O, _._0_has_no_exported_member_named_1_Did_you_mean_2, J, de, E(Ae)); return } let xe = Yu(n) && SE(n); if (ka && a & 788968 && xe && !y2(xe.parent) && oy(xe)) { Fe(xe, _._0_refers_to_a_value_but_is_being_used_as_a_type_here_Did_you_mean_typeof_0, qd(xe)); return } if (a & 1920 && Yu(n.parent)) { let It = No(yd(Gd(H), O.escapedText, 788968)); if (It) { Fe(n.parent.right, _.Cannot_access_0_1_because_0_is_a_type_but_not_a_namespace_Did_you_mean_to_retrieve_the_type_of_the_property_1_in_0_with_0_1, E(It), Gi(n.parent.right.escapedText)); return } } Fe(O, _.Namespace_0_has_no_exported_member_1, J, de) } return } } else throw L.assertNever(n, "Unknown entity name kind."); return L.assert((ac(T) & 1) === 0, "Should never get an instantiated symbol here."), !ws(n) && Cd(n) && (T.flags & 2097152 || n.parent.kind === 274) && qf(BH(n), T, void 0, !0), T.flags & a || u ? T : wc(T) } function ng(n, a) { if ($G(n.parent)) { let c = ih(n.parent); if (c) return zs(c, n.escapedText, a, void 0, n, !0) } } function ih(n) { if (jn(n, p => IA(p) || p.flags & 8388608 ? Ff(p) : "quit")) return; let c = dS(n); if (c && Ol(c) && nR(c.expression)) { let p = fr(c.expression.left); if (p) return Cv(p) } if (c && ms(c) && nR(c.parent) && Ol(c.parent.parent)) { let p = fr(c.parent.left); if (p) return Cv(p) } if (c && (s_(c) || yl(c)) && ar(c.parent.parent) && ic(c.parent.parent) === 6) { let p = fr(c.parent.parent.left); if (p) return Cv(p) } let u = WA(n); if (u && Ia(u)) { let p = fr(u); return p && p.valueDeclaration } } function Cv(n) { let a = n.parent.valueDeclaration; return a ? (RI(a) ? oS(a) : mT(a) ? $w(a) : void 0) || a : void 0 } function Iv(n) { let a = n.valueDeclaration; if (!a || !Yn(a) || n.flags & 524288 || ob(a, !1)) return; let c = wi(a) ? $w(a) : oS(a); if (c) { let u = vd(c); if (u) return oie(u, n) } } function Gl(n, a, c) { let p = $s(Y) === 1 ? _.Cannot_find_module_0_Did_you_mean_to_set_the_moduleResolution_option_to_nodenext_or_to_add_aliases_to_the_paths_option : _.Cannot_find_module_0_or_its_corresponding_type_declarations; return ah(n, a, c ? void 0 : p) } function ah(n, a, c, u = !1) { return es(a) ? qc(n, a.text, c, a, u) : void 0 } function qc(n, a, c, u, p = !1) { var h, T, k, O, H, J, de, Ae, xe; if (na(a, "@types/")) { let Cn = _.Cannot_import_type_declaration_files_Consider_importing_0_instead_of_1, Rn = QC(a, "@types/"); Fe(u, Cn, Rn, a) } let tt = tne(a, !0); if (tt) return tt; let It = Gn(n), Tn = es(n) ? n : ((h = jn(n, Dd)) == null ? void 0 : h.arguments[0]) || ((T = jn(n, gl)) == null ? void 0 : T.moduleSpecifier) || ((k = jn(n, ab)) == null ? void 0 : k.moduleReference.expression) || ((O = jn(n, Il)) == null ? void 0 : O.moduleSpecifier) || ((H = Tc(n) ? n : n.parent && Tc(n.parent) && n.parent.name === n ? n.parent : void 0) == null ? void 0 : H.name) || ((J = ib(n) ? n : void 0) == null ? void 0 : J.argument.literal), un = Tn && es(Tn) ? W_(It, Tn) : It.impliedNodeFormat, Nn = $s(Y), en = kA(It, a, un), cn = en && _q(Y, en, It), rr = en && (!cn || cn === _.Module_0_was_resolved_to_1_but_jsx_is_not_set) && e.getSourceFile(en.resolvedFileName); if (rr) { if (cn && Fe(u, cn, a, en.resolvedFileName), en.resolvedUsingTsExtension && Fu(a)) { let Cn = ((de = jn(n, gl)) == null ? void 0 : de.importClause) || jn(n, Kp(Nl, Il)); (Cn && !Cn.isTypeOnly || jn(n, Dd)) && Fe(u, _.A_declaration_file_cannot_be_imported_without_import_type_Did_you_mean_to_import_an_implementation_file_0_instead, Jt(L.checkDefined(r4(a)))) } else if (en.resolvedUsingTsExtension && !VL(Y, It.fileName)) { let Cn = L.checkDefined(r4(a)); Fe(u, _.An_import_path_can_only_end_with_a_0_extension_when_allowImportingTsExtensions_is_enabled, Cn) } if (rr.symbol) { if (en.isExternalLibraryImport && !VR(en.extension) && xE(!1, u, It, un, en, a), Nn === 3 || Nn === 99) { let Cn = It.impliedNodeFormat === 1 && !jn(n, Dd) || !!jn(n, Nl), Rn = jn(n, Hr => Mh(Hr) || Il(Hr) || gl(Hr)), Br = Rn && Mh(Rn) ? (Ae = Rn.assertions) == null ? void 0 : Ae.assertClause : Rn?.assertClause; if (Cn && rr.impliedNodeFormat === 99 && !qS(Br)) if (jn(n, Nl)) Fe(u, _.Module_0_cannot_be_imported_using_this_construct_The_specifier_only_resolves_to_an_ES_module_which_cannot_be_imported_with_require_Use_an_ECMAScript_import_instead, a); else { let Hr, qi = Hm(It.fileName); if (qi === ".ts" || qi === ".js" || qi === ".tsx" || qi === ".jsx") { let wa = It.packageJsonScope, Xc = qi === ".ts" ? ".mts" : qi === ".js" ? ".mjs" : void 0; wa && !wa.contents.packageJsonContent.type ? Xc ? Hr = da(void 0, _.To_convert_this_file_to_an_ECMAScript_module_change_its_file_extension_to_0_or_add_the_field_type_Colon_module_to_1, Xc, vi(wa.packageDirectory, "package.json")) : Hr = da(void 0, _.To_convert_this_file_to_an_ECMAScript_module_add_the_field_type_Colon_module_to_0, vi(wa.packageDirectory, "package.json")) : Xc ? Hr = da(void 0, _.To_convert_this_file_to_an_ECMAScript_module_change_its_file_extension_to_0_or_create_a_local_package_json_file_with_type_Colon_module, Xc) : Hr = da(void 0, _.To_convert_this_file_to_an_ECMAScript_module_create_a_local_package_json_file_with_type_Colon_module) } Lo.add(Lh(Gn(u), u, da(Hr, _.The_current_file_is_a_CommonJS_module_whose_imports_will_produce_require_calls_however_the_referenced_file_is_an_ECMAScript_module_and_cannot_be_imported_with_require_Consider_writing_a_dynamic_import_0_call_instead, a))) } } return No(rr.symbol) } c && Fe(u, _.File_0_is_not_a_module, rr.fileName); return } if (Ka) { let Cn = JU(Ka, Rn => Rn.pattern, a); if (Cn) { let Rn = vo && vo.get(a); return No(Rn || Cn.symbol) } } if (en && !VR(en.extension) && cn === void 0 || cn === _.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type) { if (p) { let Cn = _.Invalid_module_name_in_augmentation_Module_0_resolves_to_an_untyped_module_at_1_which_cannot_be_augmented; Fe(u, Cn, a, en.resolvedFileName) } else xE(ge && !!c, u, It, un, en, a); return } if (c) { if (en) { let Cn = e.getProjectReferenceRedirect(en.resolvedFileName); if (Cn) { Fe(u, _.Output_file_0_has_not_been_built_from_source_file_1, Cn, en.resolvedFileName); return } } if (cn) Fe(u, cn, a, en.resolvedFileName); else { let Cn = Jd(a) && !gA(a), Rn = Nn === 3 || Nn === 99; if (!RT(Y) && Gc(a, ".json") && Nn !== 1 && l4(Y)) Fe(u, _.Cannot_find_module_0_Consider_using_resolveJsonModule_to_import_module_with_json_extension, a); else if (un === 99 && Rn && Cn) { let Br = _a(a, ni(It.path)), Hr = (xe = bx.find(([qi, wa]) => e.fileExists(Br + qi))) == null ? void 0 : xe[1]; Hr ? Fe(u, _.Relative_import_paths_need_explicit_file_extensions_in_EcmaScript_imports_when_moduleResolution_is_node16_or_nodenext_Did_you_mean_0, a + Hr) : Fe(u, _.Relative_import_paths_need_explicit_file_extensions_in_EcmaScript_imports_when_moduleResolution_is_node16_or_nodenext_Consider_adding_an_extension_to_the_import_path) } else Fe(u, c, a) } } return; function Jt(Cn) { let Rn = UR(a, Cn); if (SW(ie) || un === 99) { let Br = Fu(a) && VL(Y); return Rn + (Cn === ".mts" || Cn === ".d.mts" ? Br ? ".mts" : ".mjs" : Cn === ".cts" || Cn === ".d.mts" ? Br ? ".cts" : ".cjs" : Br ? ".ts" : ".js") } return Rn } } function xE(n, a, c, u, { packageId: p, resolvedFileName: h }, T) { var k, O; let H; if (!fl(T) && p) { let J = (O = (k = c.resolvedModules) == null ? void 0 : k.get(T, u)) == null ? void 0 : O.node10Result; H = J ? da(void 0, _.There_are_types_at_0_but_this_result_could_not_be_resolved_when_respecting_package_json_exports_The_1_library_may_need_to_update_its_package_json_or_typings, J, J.indexOf(Wg + "@types/") > -1 ? `@types/${UL(p.name)}` : p.name) : oh(p.name) ? da(void 0, _.If_the_0_package_actually_exposes_this_module_consider_sending_a_pull_request_to_amend_https_Colon_Slash_Slashgithub_com_SlashDefinitelyTyped_SlashDefinitelyTyped_Slashtree_Slashmaster_Slashtypes_Slash_1, p.name, UL(p.name)) : zb(p.name) ? da(void 0, _.If_the_0_package_actually_exposes_this_module_try_adding_a_new_declaration_d_ts_file_containing_declare_module_1, p.name, T) : da(void 0, _.Try_npm_i_save_dev_types_Slash_1_if_it_exists_or_add_a_new_declaration_d_ts_file_containing_declare_module_0, T, UL(p.name)) } Ip(n, a, da(H, _.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type, T, h)) } function oh(n) { return t().has(rF(n)) } function zb(n) { return !!t().get(n) } function Vu(n, a) { if (n?.exports) { let c = Ac(n.exports.get("export="), a), u = Em(No(c), No(n)); return No(u) || n } } function Em(n, a) { if (!n || n === Ht || n === a || a.exports.size === 1 || n.flags & 2097152) return n; let c = Ai(n); if (c.cjsExportMerged) return c.cjsExportMerged; let u = n.flags & 33554432 ? n : Pb(n); return u.flags = u.flags | 512, u.exports === void 0 && (u.exports = Ua()), a.exports.forEach((p, h) => { h !== "export=" && u.exports.set(h, u.exports.has(h) ? C_(u.exports.get(h), p) : p) }), Ai(u).cjsExportMerged = u, c.cjsExportMerged = u } function Jb(n, a, c, u) { var p; let h = Vu(n, c); if (!c && h) { if (!u && !(h.flags & 1539) && !nc(h, 308)) { let k = ie >= 5 ? "allowSyntheticDefaultImports" : "esModuleInterop"; return Fe(a, _.This_module_can_only_be_referenced_with_ECMAScript_imports_Slashexports_by_turning_on_the_0_flag_and_referencing_its_default_export, k), h } let T = a.parent; if (gl(T) && VA(T) || Dd(T)) { let k = Dd(T) ? T.arguments[0] : T.moduleSpecifier, O = zn(h), H = lIe(O, h, n, k); if (H) return Lv(h, H, T); let J = (p = n?.declarations) == null ? void 0 : p.find(Li), de = J && bE(ty(k), J.impliedNodeFormat); if (f_(Y) || de) { let Ae = nM(O, 0); if ((!Ae || !Ae.length) && (Ae = nM(O, 1)), Ae && Ae.length || ja(O, "default", !0) || de) { let xe = uIe(O, h, n, k); return Lv(h, xe, T) } } } } return h } function Lv(n, a, c) { let u = wo(n.flags, n.escapedName); u.declarations = n.declarations ? n.declarations.slice() : [], u.parent = n.parent, u.links.target = n, u.links.originatingImport = c, n.valueDeclaration && (u.valueDeclaration = n.valueDeclaration), n.constEnumOnlyModule && (u.constEnumOnlyModule = !0), n.members && (u.members = new Map(n.members)), n.exports && (u.exports = new Map(n.exports)); let p = R_(a); return u.links.type = ls(u, p.members, Je, Je, p.indexInfos), u } function AE(n) { return n.exports.get("export=") !== void 0 } function sy(n) { return ene(sh(n)) } function C1(n) { let a = sy(n), c = Vu(n); if (c !== n) { let u = zn(c); CE(u) && si(a, Jo(u)) } return a } function kv(n, a) { sh(n).forEach((p, h) => { LE(h) || a(p, h) }); let u = Vu(n); if (u !== n) { let p = zn(u); CE(p) && MJe(p, (h, T) => { a(h, T) }) } } function rg(n, a) { let c = sh(a); if (c) return c.get(n) } function of(n, a) { let c = rg(n, a); if (c) return c; let u = Vu(a); if (u === a) return; let p = zn(u); return CE(p) ? ja(p, n) : void 0 } function CE(n) { return !(n.flags & 134348796 || Ur(n) & 1 || _f(n) || po(n)) } function Gd(n) { return n.flags & 6256 ? Mte(n, "resolvedExports") : n.flags & 1536 ? sh(n) : n.exports || q } function sh(n) { let a = Ai(n); if (!a.resolvedExports) { let { exports: c, typeOnlyExportStarMap: u } = Dx(n); a.resolvedExports = c, a.typeOnlyExportStarMap = u } return a.resolvedExports } function Dv(n, a, c, u) { a && a.forEach((p, h) => { if (h === "default") return; let T = n.get(h); if (!T) n.set(h, p), c && u && c.set(h, { specifierText: Qc(u.moduleSpecifier) }); else if (c && u && T && Ac(T) !== Ac(p)) { let k = c.get(h); k.exportsWithDuplicate ? k.exportsWithDuplicate.push(u) : k.exportsWithDuplicate = [u] } }) } function Dx(n) { let a = [], c, u = new Set; n = Vu(n); let p = h(n) || q; return c && u.forEach(T => c.delete(T)), { exports: p, typeOnlyExportStarMap: c }; function h(T, k, O) { if (!O && T?.exports && T.exports.forEach((de, Ae) => u.add(Ae)), !(T && T.exports && Of(a, T))) return; let H = new Map(T.exports), J = T.exports.get("__export"); if (J) { let de = Ua(), Ae = new Map; if (J.declarations) for (let xe of J.declarations) { let tt = Gl(xe, xe.moduleSpecifier), It = h(tt, xe, O || xe.isTypeOnly); Dv(de, It, Ae, xe) } Ae.forEach(({ exportsWithDuplicate: xe }, tt) => { if (!(tt === "export=" || !(xe && xe.length) || H.has(tt))) for (let It of xe) Lo.add(hr(It, _.Module_0_has_already_exported_a_member_named_1_Consider_explicitly_re_exporting_to_resolve_the_ambiguity, Ae.get(tt).specifierText, Gi(tt))) }), Dv(H, de) } return k?.isTypeOnly && (c ?? (c = new Map), H.forEach((de, Ae) => c.set(Ae, k))), H } } function No(n) { let a; return n && n.mergeId && (a = gv[n.mergeId]) ? a : n } function fr(n) { return No(n.symbol && zG(n.symbol)) } function vd(n) { return $p(n) ? fr(n) : void 0 } function ju(n) { return No(n.parent && zG(n.parent)) } function I1(n, a) { let c = Gn(a), u = zo(c), p = Ai(n), h; if (p.extendedContainersByFile && (h = p.extendedContainersByFile.get(u))) return h; if (c && c.imports) { for (let k of c.imports) { if (ws(k)) continue; let O = Gl(a, k, !0); !O || !ly(O, n) || (h = Sn(h, O)) } if (Fn(h)) return (p.extendedContainersByFile || (p.extendedContainersByFile = new Map)).set(u, h), h } if (p.extendedContainers) return p.extendedContainers; let T = e.getSourceFiles(); for (let k of T) { if (!Lc(k)) continue; let O = fr(k); ly(O, n) && (h = Sn(h, O)) } return p.extendedContainers = h || Je } function IE(n, a, c) { let u = ju(n); if (u && !(n.flags & 262144)) { let T = Zi(u.declarations, h), k = a && I1(n, a), O = cy(u, c); if (a && u.flags & og(c) && Rv(u, a, 1920, !1)) return Sn(Qi(Qi([u], T), k), O); let H = !(u.flags & og(c)) && u.flags & 788968 && gs(u).flags & 524288 && c === 111551 ? DE(a, de => Ld(de, Ae => { if (Ae.flags & og(c) && zn(Ae) === gs(u)) return Ae })) : void 0, J = H ? [H, ...T, u] : [...T, u]; return J = Sn(J, O), J = si(J, k), J } let p = Zi(n.declarations, T => { if (!lu(T) && T.parent) { if (sg(T.parent)) return fr(T.parent); if (Tp(T.parent) && T.parent.parent && Vu(fr(T.parent.parent)) === n) return fr(T.parent.parent) } if (_u(T) && ar(T.parent) && T.parent.operatorToken.kind === 63 && Us(T.parent.left) && bc(T.parent.left.expression)) return Bm(T.parent.left) || TT(T.parent.left.expression) ? fr(Gn(T)) : (Ic(T.parent.left.expression), Rr(T.parent.left.expression).resolvedSymbol) }); if (!Fn(p)) return; return Zi(p, T => ly(T, n) ? T : void 0); function h(T) { return u && wx(T, u) } } function cy(n, a) { let c = !!Fn(n.declarations) && Vo(n.declarations); if (a & 111551 && c && c.parent && wi(c.parent) && (rs(c) && c === c.parent.initializer || Rd(c) && c === c.parent.type)) return fr(c.parent) } function wx(n, a) { let c = lh(n), u = c && c.exports && c.exports.get("export="); return u && wp(u, a) ? c : void 0 } function ly(n, a) { if (n === ju(a)) return a; let c = n.exports && n.exports.get("export="); if (c && wp(c, a)) return n; let u = Gd(n), p = u.get(a.escapedName); return p && wp(p, a) ? p : Ld(u, h => { if (wp(h, a)) return h }) } function wp(n, a) { if (No(Ac(No(n))) === No(Ac(No(a)))) return n } function tp(n) { return No(n && (n.flags & 1048576) !== 0 && n.exportSymbol || n) } function ig(n, a) { return !!(n.flags & 111551 || n.flags & 2097152 && Fl(n) & 111551 && (a || !nd(n))) } function wv(n) { let a = n.members; for (let c of a) if (c.kind === 173 && Pf(c.body)) return c } function ch(n) { var a; let c = new g(qe, n); return v++, c.id = v, (a = ai) == null || a.recordType(c), c } function Rp(n, a) { let c = ch(n); return c.symbol = a, c } function L1(n) { return new g(qe, n) } function Cc(n, a, c = 0) { let u = ch(n); return u.intrinsicName = a, u.objectFlags = c, u } function Bd(n, a) { let c = Rp(524288, a); return c.objectFlags = n, c.members = void 0, c.properties = void 0, c.callSignatures = void 0, c.constructSignatures = void 0, c.indexInfos = void 0, c } function Tm() { return Gr(lo(fF.keys(), ff)) } function rd(n) { return Rp(262144, n) } function LE(n) { return n.charCodeAt(0) === 95 && n.charCodeAt(1) === 95 && n.charCodeAt(2) !== 95 && n.charCodeAt(2) !== 64 && n.charCodeAt(2) !== 35 } function uy(n) { let a; return n.forEach((c, u) => { ag(c, u) && (a || (a = [])).push(c) }), a || Je } function ag(n, a) { return !LE(a) && ig(n) } function Rx(n) { let a = uy(n), c = ane(n); return c ? Qi(a, [c]) : a } function sf(n, a, c, u, p) { let h = n; return h.members = a, h.properties = Je, h.callSignatures = c, h.constructSignatures = u, h.indexInfos = p, a !== q && (h.properties = uy(a)), h } function ls(n, a, c, u, p) { return sf(Bd(16, n), a, c, u, p) } function kE(n) { if (n.constructSignatures.length === 0) return n; if (n.objectTypeWithoutAbstractConstructSignatures) return n.objectTypeWithoutAbstractConstructSignatures; let a = Pr(n.constructSignatures, u => !(u.flags & 4)); if (n.constructSignatures === a) return n; let c = ls(n.symbol, n.members, n.callSignatures, vt(a) ? a : Je, n.indexInfos); return n.objectTypeWithoutAbstractConstructSignatures = c, c.objectTypeWithoutAbstractConstructSignatures = c, c } function DE(n, a) { let c; for (let u = n; u; u = u.parent) { if (Qp(u) && u.locals && !gm(u) && (c = a(u.locals, void 0, !0, u))) return c; switch (u.kind) { case 308: if (!kd(u)) break; case 264: let p = fr(u); if (c = a(p?.exports || q, void 0, !0, u)) return c; break; case 260: case 228: case 261: let h; if ((fr(u).members || q).forEach((T, k) => { T.flags & 788968 && (h || (h = Ua())).set(k, T) }), h && (c = a(h, void 0, !1, u))) return c; break } } return a(Ne, void 0, !0) } function og(n) { return n === 111551 ? 111551 : 1920 } function Rv(n, a, c, u, p = new Map) { if (!(n && !wE(n))) return; let h = Ai(n), T = h.accessibleChainCache || (h.accessibleChainCache = new Map), k = DE(a, (un, Nn, en, cn) => cn), O = `${u ? 0 : 1}|${k && zo(k)}|${c}`; if (T.has(O)) return T.get(O); let H = $a(n), J = p.get(H); J || p.set(H, J = []); let de = DE(a, Ae); return T.set(O, de), de; function Ae(un, Nn, en) { if (!Of(J, un)) return; let cn = It(un, Nn, en); return J.pop(), cn } function xe(un, Nn) { return !k1(un, a, Nn) || !!Rv(un.parent, a, og(Nn), u, p) } function tt(un, Nn, en) { return (n === (Nn || un) || No(n) === No(Nn || un)) && !vt(un.declarations, sg) && (en || xe(No(un), c)) } function It(un, Nn, en) { return tt(un.get(n.escapedName), void 0, Nn) ? [n] : Ld(un, rr => { if (rr.flags & 2097152 && rr.escapedName !== "export=" && rr.escapedName !== "default" && !(o4(rr) && a && Lc(Gn(a))) && (!u || vt(rr.declarations, ab)) && (!en || !vt(rr.declarations, cce)) && (Nn || !nc(rr, 278))) { let Jt = wc(rr), Cn = Tn(rr, Jt, Nn); if (Cn) return Cn } if (rr.escapedName === n.escapedName && rr.exportSymbol && tt(No(rr.exportSymbol), void 0, Nn)) return [n] }) || (un === Ne ? Tn(Ye, Ye, Nn) : void 0) } function Tn(un, Nn, en) { if (tt(un, Nn, en)) return [un]; let cn = Gd(Nn), rr = cn && Ae(cn, !0); if (rr && xe(un, og(c))) return [un].concat(rr) } } function k1(n, a, c) { let u = !1; return DE(a, p => { let h = No(p.get(n.escapedName)); if (!h) return !1; if (h === n) return !0; let T = h.flags & 2097152 && !nc(h, 278); return h = T ? wc(h) : h, (T ? Fl(h) : h.flags) & c ? (u = !0, !0) : !1 }), u } function wE(n) { if (n.declarations && n.declarations.length) { for (let a of n.declarations) switch (a.kind) { case 169: case 171: case 174: case 175: continue; default: return !1 }return !0 } return !1 } function RE(n, a) { return bd(n, a, 788968, !1, !0).accessibility === 0 } function OE(n, a) { return bd(n, a, 111551, !1, !0).accessibility === 0 } function NE(n, a, c) { return bd(n, a, c, !1, !1).accessibility === 0 } function PE(n, a, c, u, p, h) { if (!Fn(n)) return; let T, k = !1; for (let O of n) { let H = Rv(O, a, u, !1); if (H) { T = O; let Ae = Ox(H[0], p); if (Ae) return Ae } if (h && vt(O.declarations, sg)) { if (p) { k = !0; continue } return { accessibility: 0 } } let J = IE(O, a, u), de = PE(J, a, c, c === O ? og(u) : u, p, h); if (de) return de } if (k) return { accessibility: 0 }; if (T) return { accessibility: 1, errorSymbolName: E(c, a, u), errorModuleName: T !== c ? E(T, a, 1920) : void 0 } } function dy(n, a, c, u) { return bd(n, a, c, u, !0) } function bd(n, a, c, u, p) { if (n && a) { let h = PE([n], a, n, c, u, p); if (h) return h; let T = mn(n.declarations, lh); if (T) { let k = lh(a); if (T !== k) return { accessibility: 2, errorSymbolName: E(n, a, c), errorModuleName: E(T), errorNode: Yn(a) ? a : void 0 } } return { accessibility: 1, errorSymbolName: E(n, a, c) } } return { accessibility: 0 } } function lh(n) { let a = jn(n, dC); return a && fr(a) } function dC(n) { return lu(n) || n.kind === 308 && kd(n) } function sg(n) { return b6(n) || n.kind === 308 && kd(n) } function Ox(n, a) { let c; if (!Ji(Pr(n.declarations, h => h.kind !== 79), u)) return; return { accessibility: 0, aliasesToMakeVisible: c }; function u(h) { var T, k; if (!Xf(h)) { let O = x1(h); if (O && !Mr(O, 1) && Xf(O.parent)) return p(h, O); if (wi(h) && Bc(h.parent.parent) && !Mr(h.parent.parent, 1) && Xf(h.parent.parent.parent)) return p(h, h.parent.parent); if (E6(h) && !Mr(h, 1) && Xf(h.parent)) return p(h, h); if (Wo(h)) { if (n.flags & 2097152 && Yn(h) && ((T = h.parent) != null && T.parent) && wi(h.parent.parent) && ((k = h.parent.parent.parent) != null && k.parent) && Bc(h.parent.parent.parent.parent) && !Mr(h.parent.parent.parent.parent, 1) && h.parent.parent.parent.parent.parent && Xf(h.parent.parent.parent.parent.parent)) return p(h, h.parent.parent.parent.parent); if (n.flags & 2) { let H = jn(h, Bc); return Mr(H, 1) ? !0 : Xf(H.parent) ? p(h, H) : !1 } } return !1 } return !0 } function p(h, T) { return a && (Rr(h).isVisible = !0, c = xg(c, T)), !0 } } function Nx(n, a) { let c; n.parent.kind === 183 || n.parent.kind === 230 && !Gm(n.parent) || n.parent.kind === 164 ? c = 1160127 : n.kind === 163 || n.kind === 208 || n.parent.kind === 268 ? c = 1920 : c = 788968; let u = Yd(n), p = zs(a, u.escapedText, c, void 0, void 0, !1); return p && p.flags & 262144 && c & 788968 ? { accessibility: 0 } : !p && LT(u) && dy(fr(Ku(u, !1, !1)), u, c, !1).accessibility === 0 ? { accessibility: 0 } : p && Ox(p, !0) || { accessibility: 1, errorSymbolName: Qc(u), errorNode: u } } function E(n, a, c, u = 4, p) { let h = 70221824; u & 2 && (h |= 128), u & 1 && (h |= 512), u & 8 && (h |= 16384), u & 32 && (h |= 134217728), u & 16 && (h |= 1073741824); let T = u & 4 ? Be.symbolToNode : Be.symbolToEntityName; return p ? k(p).getText() : SI(k); function k(O) { let H = T(n, c, a, h), J = a?.kind === 308 ? XK() : rE(), de = a && Gn(a); return J.writeNode(4, H, de, O), O } } function ne(n, a, c = 0, u, p) { return p ? h(p).getText() : SI(h); function h(T) { let k; c & 262144 ? k = u === 1 ? 182 : 181 : k = u === 1 ? 177 : 176; let O = Be.signatureToSignatureDeclaration(n, k, a, qr(c) | 70221824 | 512), H = fN(), J = a && Gn(a); return H.writeNode(4, O, J, XH(T)), T } } function Ee(n, a, c = 1064960, u = SR("")) { let p = Y.noErrorTruncation || c & 1, h = Be.typeToTypeNode(n, a, qr(c) | 70221824 | (p ? 1 : 0)); if (h === void 0) return L.fail("should always get typenode"); let T = n !== nt ? rE() : qK(), k = a && Gn(a); T.writeNode(4, h, k, u); let O = u.getText(), H = p ? x4 * 2 : KR * 2; return H && O && O.length >= H ? O.substr(0, H - 3) + "..." : O } function Wt(n, a) { let c = ci(n.symbol) ? Ee(n, n.symbol.valueDeclaration) : Ee(n), u = ci(a.symbol) ? Ee(a, a.symbol.valueDeclaration) : Ee(a); return c === u && (c = lr(n), u = lr(a)), [c, u] } function lr(n) { return Ee(n, void 0, 64) } function ci(n) { return n && !!n.valueDeclaration && ot(n.valueDeclaration) && !$f(n.valueDeclaration) } function qr(n = 0) { return n & 848330091 } function Ti(n) { return !!n.symbol && !!(n.symbol.flags & 32) && (n === vu(n.symbol) || !!(n.flags & 524288) && !!(Ur(n) & 16777216)) } function Wa() {
+                    return { typeToTypeNode: (et, he, Bn, Mn) => a(he, Bn, Mn, or => u(et, or)), indexInfoToIndexSignatureDeclaration: (et, he, Bn, Mn) => a(he, Bn, Mn, or => J(et, or, void 0)), signatureToSignatureDeclaration: (et, he, Bn, Mn, or) => a(Bn, Mn, or, _r => de(et, he, _r)), symbolToEntityName: (et, he, Bn, Mn, or) => a(Bn, Mn, or, _r => qi(et, _r, he, !1)), symbolToExpression: (et, he, Bn, Mn, or) => a(Bn, Mn, or, _r => wa(et, _r, he)), symbolToTypeParameterDeclarations: (et, he, Bn, Mn) => a(he, Bn, Mn, or => en(et, or)), symbolToParameterDeclaration: (et, he, Bn, Mn) => a(he, Bn, Mn, or => It(et, or)), typeParameterToDeclaration: (et, he, Bn, Mn) => a(he, Bn, Mn, or => tt(et, or)), symbolTableToDeclarationStatements: (et, he, Bn, Mn, or) => a(he, Bn, Mn, _r => Tu(et, _r, or)), symbolToNode: (et, he, Bn, Mn, or) => a(Bn, Mn, or, _r => n(et, _r, he)) }; function n(et, he, Bn) { if (he.flags & 1073741824) { if (et.valueDeclaration) { let or = sa(et.valueDeclaration); if (or && ts(or)) return or } let Mn = Ai(et).nameType; if (Mn && Mn.flags & 9216) return he.enclosingDeclaration = Mn.symbol.valueDeclaration, D.createComputedPropertyName(wa(Mn.symbol, he, Bn)) } return wa(et, he, Bn) } function a(et, he, Bn, Mn) { L.assert(et === void 0 || (et.flags & 8) === 0); let or = Bn?.trackSymbol ? Bn.moduleResolverHost : he & 134217728 ? hPe(e) : void 0, _r = { enclosingDeclaration: et, flags: he || 0, tracker: void 0, encounteredError: !1, reportedDiagnostic: !1, visitedTypes: void 0, symbolDepth: void 0, inferTypeParameters: void 0, approximateLength: 0 }; _r.tracker = new iN(_r, Bn, or); let ua = Mn(_r); return _r.truncating && _r.flags & 1 && _r.tracker.reportTruncationError(), _r.encounteredError ? void 0 : ua } function c(et) { return et.truncating ? et.truncating : et.truncating = et.approximateLength > (et.flags & 1 ? x4 : KR) } function u(et, he) { let Bn = he.flags, Mn = p(et, he); return he.flags = Bn, Mn } function p(et, he) { var Bn, Mn; o && o.throwIfCancellationRequested && o.throwIfCancellationRequested(); let or = he.flags & 8388608; if (he.flags &= -8388609, !et) { if (!(he.flags & 262144)) { he.encounteredError = !0; return } return he.approximateLength += 3, D.createKeywordTypeNode(131) } if (he.flags & 536870912 || (et = O_(et)), et.flags & 1) return et.aliasSymbol ? D.createTypeReferenceNode(Cn(et.aliasSymbol), O(et.aliasTypeArguments, he)) : et === nt ? nO(D.createKeywordTypeNode(131), 3, "unresolved") : (he.approximateLength += 3, D.createKeywordTypeNode(et === Q ? 139 : 131)); if (et.flags & 2) return D.createKeywordTypeNode(157); if (et.flags & 4) return he.approximateLength += 6, D.createKeywordTypeNode(152); if (et.flags & 8) return he.approximateLength += 6, D.createKeywordTypeNode(148); if (et.flags & 64) return he.approximateLength += 6, D.createKeywordTypeNode(160); if (et.flags & 16 && !et.aliasSymbol) return he.approximateLength += 7, D.createKeywordTypeNode(134); if (et.flags & 1056) { if (et.symbol.flags & 8) { let Xt = ju(et.symbol), er = Rn(Xt, he, 788968); if (gs(Xt) === et) return er; let Sr = fc(et.symbol); return i_(Sr, 0) ? Un(er, D.createTypeReferenceNode(Sr, void 0)) : Mh(er) ? (er.isTypeOf = !0, D.createIndexedAccessTypeNode(er, D.createLiteralTypeNode(D.createStringLiteral(Sr)))) : m_(er) ? D.createIndexedAccessTypeNode(D.createTypeQueryNode(er.typeName), D.createLiteralTypeNode(D.createStringLiteral(Sr))) : L.fail("Unhandled type node kind returned from `symbolToTypeNode`.") } return Rn(et.symbol, he, 788968) } if (et.flags & 128) return he.approximateLength += et.value.length + 2, D.createLiteralTypeNode(Jn(D.createStringLiteral(et.value, !!(he.flags & 268435456)), 33554432)); if (et.flags & 256) { let Xt = et.value; return he.approximateLength += ("" + Xt).length, D.createLiteralTypeNode(Xt < 0 ? D.createPrefixUnaryExpression(40, D.createNumericLiteral(-Xt)) : D.createNumericLiteral(Xt)) } if (et.flags & 2048) return he.approximateLength += j0(et.value).length + 1, D.createLiteralTypeNode(D.createBigIntLiteral(et.value)); if (et.flags & 512) return he.approximateLength += et.intrinsicName.length, D.createLiteralTypeNode(et.intrinsicName === "true" ? D.createTrue() : D.createFalse()); if (et.flags & 8192) { if (!(he.flags & 1048576)) { if (OE(et.symbol, he.enclosingDeclaration)) return he.approximateLength += 6, Rn(et.symbol, he, 111551); he.tracker.reportInaccessibleUniqueSymbolError && he.tracker.reportInaccessibleUniqueSymbolError() } return he.approximateLength += 13, D.createTypeOperatorNode(156, D.createKeywordTypeNode(153)) } if (et.flags & 16384) return he.approximateLength += 4, D.createKeywordTypeNode(114); if (et.flags & 32768) return he.approximateLength += 9, D.createKeywordTypeNode(155); if (et.flags & 65536) return he.approximateLength += 4, D.createLiteralTypeNode(D.createNull()); if (et.flags & 131072) return he.approximateLength += 5, D.createKeywordTypeNode(144); if (et.flags & 4096) return he.approximateLength += 6, D.createKeywordTypeNode(153); if (et.flags & 67108864) return he.approximateLength += 6, D.createKeywordTypeNode(149); if (lL(et)) return he.flags & 4194304 && (!he.encounteredError && !(he.flags & 32768) && (he.encounteredError = !0), (Mn = (Bn = he.tracker).reportInaccessibleThisError) == null || Mn.call(Bn)), he.approximateLength += 4, D.createThisTypeNode(); if (!or && et.aliasSymbol && (he.flags & 16384 || RE(et.aliasSymbol, he.enclosingDeclaration))) { let Xt = O(et.aliasTypeArguments, he); return LE(et.aliasSymbol.escapedName) && !(et.aliasSymbol.flags & 32) ? D.createTypeReferenceNode(D.createIdentifier(""), Xt) : Fn(Xt) === 1 && et.aliasSymbol === $o.symbol ? D.createArrayTypeNode(Xt[0]) : Rn(et.aliasSymbol, he, 788968, Xt) } let _r = Ur(et); if (_r & 4) return L.assert(!!(et.flags & 524288)), et.node ? Bt(et, hn) : hn(et); if (et.flags & 262144 || _r & 3) { if (et.flags & 262144 && ya(he.inferTypeParameters, et)) { he.approximateLength += fc(et.symbol).length + 6; let er, Sr = eu(et); if (Sr) { let Dr = jxe(et, !0); Dr && ph(Sr, Dr) || (he.approximateLength += 9, er = Sr && u(Sr, he)) } return D.createInferTypeNode(xe(et, he, er)) } if (he.flags & 4 && et.flags & 262144 && !RE(et.symbol, he.enclosingDeclaration)) { let er = Hr(et, he); return he.approximateLength += vr(er).length, D.createTypeReferenceNode(D.createIdentifier(vr(er)), void 0) } if (et.symbol) return Rn(et.symbol, he, 788968); let Xt = (et === ss || et === qs) && F && F.symbol ? (et === qs ? "sub-" : "super-") + fc(F.symbol) : "?"; return D.createTypeReferenceNode(D.createIdentifier(Xt), void 0) } if (et.flags & 1048576 && et.origin && (et = et.origin), et.flags & 3145728) { let Xt = et.flags & 1048576 ? Ed(et.types) : et.types; if (Fn(Xt) === 1) return u(Xt[0], he); let er = O(Xt, he, !0); if (er && er.length > 0) return et.flags & 1048576 ? D.createUnionTypeNode(er) : D.createIntersectionTypeNode(er); !he.encounteredError && !(he.flags & 262144) && (he.encounteredError = !0); return } if (_r & 48) return L.assert(!!(et.flags & 524288)), Ct(et); if (et.flags & 4194304) { let Xt = et.type; he.approximateLength += 6; let er = u(Xt, he); return D.createTypeOperatorNode(141, er) } if (et.flags & 134217728) { let Xt = et.texts, er = et.types, Sr = D.createTemplateHead(Xt[0]), Dr = D.createNodeArray(on(er, (Ii, Bo) => D.createTemplateLiteralTypeSpan(u(Ii, he), (Bo < er.length - 1 ? D.createTemplateMiddle : D.createTemplateTail)(Xt[Bo + 1])))); return he.approximateLength += 2, D.createTemplateLiteralType(Sr, Dr) } if (et.flags & 268435456) { let Xt = u(et.type, he); return Rn(et.symbol, he, 788968, [Xt]) } if (et.flags & 8388608) { let Xt = u(et.objectType, he), er = u(et.indexType, he); return he.approximateLength += 2, D.createIndexedAccessTypeNode(Xt, er) } if (et.flags & 16777216) return Bt(et, Xt => ua(Xt)); if (et.flags & 33554432) return u(et.baseType, he); return L.fail("Should be unreachable."); function ua(Xt) { let er = u(Xt.checkType, he); if (he.approximateLength += 15, he.flags & 4 && Xt.root.isDistributive && !(Xt.checkType.flags & 262144)) { let ys = rd(wo(262144, "T")), ds = Hr(ys, he), Bl = D.createTypeReferenceNode(ds); he.approximateLength += 37; let ze = O1(Xt.root.checkType, ys, Xt.mapper), dt = he.inferTypeParameters; he.inferTypeParameters = Xt.root.inferTypeParameters; let Ut = u(Oi(Xt.root.extendsType, ze), he); he.inferTypeParameters = dt; let wn = _i(Oi($r(Xt.root.node.trueType), ze)), Zn = _i(Oi($r(Xt.root.node.falseType), ze)); return D.createConditionalTypeNode(er, D.createInferTypeNode(D.createTypeParameterDeclaration(void 0, D.cloneNode(Bl.typeName))), D.createConditionalTypeNode(D.createTypeReferenceNode(D.cloneNode(ds)), u(Xt.checkType, he), D.createConditionalTypeNode(Bl, Ut, wn, Zn), D.createKeywordTypeNode(144)), D.createKeywordTypeNode(144)) } let Sr = he.inferTypeParameters; he.inferTypeParameters = Xt.root.inferTypeParameters; let Dr = u(Xt.extendsType, he); he.inferTypeParameters = Sr; let Ii = _i(Hv(Xt)), Bo = _i(Wv(Xt)); return D.createConditionalTypeNode(er, Dr, Ii, Bo) } function _i(Xt) { var er, Sr, Dr; return Xt.flags & 1048576 ? (er = he.visitedTypes) != null && er.has(ru(Xt)) ? (he.flags & 131072 || (he.encounteredError = !0, (Dr = (Sr = he.tracker) == null ? void 0 : Sr.reportCyclicStructureError) == null || Dr.call(Sr)), h(he)) : Bt(Xt, Ii => u(Ii, he)) : u(Xt, he) } function ur(Xt) { return Yk(Xt) && !(yC(Xt).flags & 262144) } function st(Xt) { L.assert(!!(Xt.flags & 524288)); let er = Xt.declaration.readonlyToken ? D.createToken(Xt.declaration.readonlyToken.kind) : void 0, Sr = Xt.declaration.questionToken ? D.createToken(Xt.declaration.questionToken.kind) : void 0, Dr, Ii; if (Yk(Xt)) { if (ur(Xt) && he.flags & 4) { let dt = rd(wo(262144, "T")), Ut = Hr(dt, he); Ii = D.createTypeReferenceNode(Ut) } Dr = D.createTypeOperatorNode(141, Ii || u(yC(Xt), he)) } else Dr = u(rp(Xt), he); let Bo = xe(w_(Xt), he, Dr), ys = Xt.declaration.nameType ? u(by(Xt), he) : void 0, ds = u(KE(_h(Xt), !!(Pp(Xt) & 4)), he), Bl = D.createMappedTypeNode(er, Bo, ys, Sr, ds, void 0); he.approximateLength += 10; let ze = Jn(Bl, 1); if (ur(Xt) && he.flags & 4) { let dt = Oi(eu($r(Xt.declaration.typeParameter.constraint.type)) || ue, Xt.mapper); return D.createConditionalTypeNode(u(yC(Xt), he), D.createInferTypeNode(D.createTypeParameterDeclaration(void 0, D.cloneNode(Ii.typeName), dt.flags & 2 ? void 0 : u(dt, he))), ze, D.createKeywordTypeNode(144)) } return ze } function Ct(Xt) { var er, Sr; let Dr = Xt.id, Ii = Xt.symbol; if (Ii) { let ys = Ti(Xt) ? 788968 : 111551; if (cp(Ii.valueDeclaration)) return Rn(Ii, he, ys); if (Ii.flags & 32 && !Da(Ii) && !(Ii.valueDeclaration && Yr(Ii.valueDeclaration) && he.flags & 2048 && (!sl(Ii.valueDeclaration) || dy(Ii, he.enclosingDeclaration, ys, !1).accessibility !== 0)) || Ii.flags & 896 || Bo()) return Rn(Ii, he, ys); if ((er = he.visitedTypes) != null && er.has(Dr)) { let ds = fy(Xt); return ds ? Rn(ds, he, 788968) : h(he) } else return Bt(Xt, Ft) } else { if (!!(Ur(Xt) & 8388608)) { let ds = Xt; if (vL(ds.node)) { let Bl = no(he, ds.node); if (Bl) return Bl } return (Sr = he.visitedTypes) != null && Sr.has(Dr) ? h(he) : Bt(Xt, Ft) } return Ft(Xt) } function Bo() { var ys; let ds = !!(Ii.flags & 8192) && vt(Ii.declarations, ze => Ca(ze)), Bl = !!(Ii.flags & 16) && (Ii.parent || mn(Ii.declarations, ze => ze.parent.kind === 308 || ze.parent.kind === 265)); if (ds || Bl) return (!!(he.flags & 4096) || ((ys = he.visitedTypes) == null ? void 0 : ys.has(Dr))) && (!(he.flags & 8) || OE(Ii, he.enclosingDeclaration)) } } function Bt(Xt, er) { var Sr, Dr; let Ii = Xt.id, Bo = Ur(Xt) & 16 && Xt.symbol && Xt.symbol.flags & 32, ys = Ur(Xt) & 4 && Xt.node ? "N" + zo(Xt.node) : Xt.flags & 16777216 ? "N" + zo(Xt.root.node) : Xt.symbol ? (Bo ? "+" : "") + $a(Xt.symbol) : void 0; he.visitedTypes || (he.visitedTypes = new Set), ys && !he.symbolDepth && (he.symbolDepth = new Map); let ds = he.enclosingDeclaration && Rr(he.enclosingDeclaration), Bl = `${ru(Xt)}|${he.flags}`; ds && (ds.serializedTypes || (ds.serializedTypes = new Map)); let ze = (Sr = ds?.serializedTypes) == null ? void 0 : Sr.get(Bl); if (ze) return ze.truncating && (he.truncating = !0), he.approximateLength += ze.addedLength, fn(ze.node); let dt; if (ys) { if (dt = he.symbolDepth.get(ys) || 0, dt > 10) return h(he); he.symbolDepth.set(ys, dt + 1) } he.visitedTypes.add(Ii); let Ut = he.approximateLength, wn = er(Xt), Zn = he.approximateLength - Ut; return !he.reportedDiagnostic && !he.encounteredError && ((Dr = ds?.serializedTypes) == null || Dr.set(Bl, { node: wn, truncating: he.truncating, addedLength: Zn })), he.visitedTypes.delete(Ii), ys && he.symbolDepth.set(ys, dt), wn; function fn(Ar) { return !ws(Ar) && ea(Ar) === Ar ? Ar : it(D.cloneNode(xn(Ar, fn, Bh, sr)), Ar) } function sr(Ar, Ei, ia, Aa, Ra) { return Ar && Ar.length === 0 ? it(D.createNodeArray(void 0, Ar.hasTrailingComma), Ar) : On(Ar, Ei, ia, Aa, Ra) } } function Ft(Xt) { if (df(Xt) || Xt.containsError) return st(Xt); let er = R_(Xt); if (!er.properties.length && !er.indexInfos.length) { if (!er.callSignatures.length && !er.constructSignatures.length) return he.approximateLength += 2, Jn(D.createTypeLiteralNode(void 0), 1); if (er.callSignatures.length === 1 && !er.constructSignatures.length) { let ys = er.callSignatures[0]; return de(ys, 181, he) } if (er.constructSignatures.length === 1 && !er.callSignatures.length) { let ys = er.constructSignatures[0]; return de(ys, 182, he) } } let Sr = Pr(er.constructSignatures, ys => !!(ys.flags & 4)); if (vt(Sr)) { let ys = on(Sr, HE); return er.callSignatures.length + (er.constructSignatures.length - Sr.length) + er.indexInfos.length + (he.flags & 2048 ? Oy(er.properties, Bl => !(Bl.flags & 4194304)) : Fn(er.properties)) && ys.push(kE(er)), u(so(ys), he) } let Dr = he.flags; he.flags |= 4194304; let Ii = Di(er); he.flags = Dr; let Bo = D.createTypeLiteralNode(Ii); return he.approximateLength += 2, Jn(Bo, he.flags & 1024 ? 0 : 1), Bo } function hn(Xt) { let er = Ko(Xt); if (Xt.target === $o || Xt.target === jo) { if (he.flags & 2) { let Ii = u(er[0], he); return D.createTypeReferenceNode(Xt.target === $o ? "Array" : "ReadonlyArray", [Ii]) } let Sr = u(er[0], he), Dr = D.createArrayTypeNode(Sr); return Xt.target === $o ? Dr : D.createTypeOperatorNode(146, Dr) } else if (Xt.target.objectFlags & 8) { if (er = Tl(er, (Sr, Dr) => KE(Sr, !!(Xt.target.elementFlags[Dr] & 2))), er.length > 0) { let Sr = Vv(Xt), Dr = O(er.slice(0, Sr), he); if (Dr) { if (Xt.target.labeledElementDeclarations) for (let Bo = 0; Bo < Dr.length; Bo++) { let ys = Xt.target.elementFlags[Bo]; Dr[Bo] = D.createNamedTupleMember(ys & 12 ? D.createToken(25) : void 0, D.createIdentifier(Gi(nU(Xt.target.labeledElementDeclarations[Bo]))), ys & 2 ? D.createToken(57) : void 0, ys & 4 ? D.createArrayTypeNode(Dr[Bo]) : Dr[Bo]) } else for (let Bo = 0; Bo < Math.min(Sr, Dr.length); Bo++) { let ys = Xt.target.elementFlags[Bo]; Dr[Bo] = ys & 12 ? D.createRestTypeNode(ys & 4 ? D.createArrayTypeNode(Dr[Bo]) : Dr[Bo]) : ys & 2 ? D.createOptionalTypeNode(Dr[Bo]) : Dr[Bo] } let Ii = Jn(D.createTupleTypeNode(Dr), 1); return Xt.target.readonly ? D.createTypeOperatorNode(146, Ii) : Ii } } if (he.encounteredError || he.flags & 524288) { let Sr = Jn(D.createTupleTypeNode([]), 1); return Xt.target.readonly ? D.createTypeOperatorNode(146, Sr) : Sr } he.encounteredError = !0; return } else { if (he.flags & 2048 && Xt.symbol.valueDeclaration && Yr(Xt.symbol.valueDeclaration) && !OE(Xt.symbol, he.enclosingDeclaration)) return Ct(Xt); { let Sr = Xt.target.outerTypeParameters, Dr = 0, Ii; if (Sr) { let Bl = Sr.length; for (; Dr < Bl;) { let ze = Dr, dt = Hxe(Sr[Dr]); do Dr++; while (Dr < Bl && Hxe(Sr[Dr]) === dt); if (!GU(Sr, er, ze, Dr)) { let Ut = O(er.slice(ze, Dr), he), wn = he.flags; he.flags |= 16; let Zn = Rn(dt, he, 788968, Ut); he.flags = wn, Ii = Ii ? Un(Ii, Zn) : Zn } } } let Bo; if (er.length > 0) { let Bl = (Xt.target.typeParameters || Je).length; Bo = O(er.slice(Dr, Bl), he) } let ys = he.flags; he.flags |= 16; let ds = Rn(Xt.symbol, he, 788968, Bo); return he.flags = ys, Ii ? Un(Ii, ds) : ds } } } function Un(Xt, er) { if (Mh(Xt)) { let Sr = Xt.typeArguments, Dr = Xt.qualifier; Dr && (Re(Dr) ? Sr !== NT(Dr) && (Dr = Ug(D.cloneNode(Dr), Sr)) : Sr !== NT(Dr.right) && (Dr = D.updateQualifiedName(Dr, Dr.left, Ug(D.cloneNode(Dr.right), Sr)))), Sr = er.typeArguments; let Ii = yi(er); for (let Bo of Ii) Dr = Dr ? D.createQualifiedName(Dr, Bo) : Bo; return D.updateImportTypeNode(Xt, Xt.argument, Xt.assertions, Dr, Sr, Xt.isTypeOf) } else { let Sr = Xt.typeArguments, Dr = Xt.typeName; Re(Dr) ? Sr !== NT(Dr) && (Dr = Ug(D.cloneNode(Dr), Sr)) : Sr !== NT(Dr.right) && (Dr = D.updateQualifiedName(Dr, Dr.left, Ug(D.cloneNode(Dr.right), Sr))), Sr = er.typeArguments; let Ii = yi(er); for (let Bo of Ii) Dr = D.createQualifiedName(Dr, Bo); return D.updateTypeReferenceNode(Xt, Dr, Sr) } } function yi(Xt) { let er = Xt.typeName, Sr = []; for (; !Re(er);)Sr.unshift(er.right), er = er.left; return Sr.unshift(er), Sr } function Di(Xt) { if (c(he)) return [D.createPropertySignature(void 0, "...", void 0, void 0)]; let er = []; for (let Ii of Xt.callSignatures) er.push(de(Ii, 176, he)); for (let Ii of Xt.constructSignatures) Ii.flags & 4 || er.push(de(Ii, 177, he)); for (let Ii of Xt.indexInfos) er.push(J(Ii, he, Xt.objectFlags & 1024 ? h(he) : void 0)); let Sr = Xt.properties; if (!Sr) return er; let Dr = 0; for (let Ii of Sr) { if (Dr++, he.flags & 2048) { if (Ii.flags & 4194304) continue; Ef(Ii) & 24 && he.tracker.reportPrivateInBaseOfClassExpression && he.tracker.reportPrivateInBaseOfClassExpression(Gi(Ii.escapedName)) } if (c(he) && Dr + 2 < Sr.length - 1) { er.push(D.createPropertySignature(void 0, `... ${Sr.length - Dr} more ...`, void 0, void 0)), k(Sr[Sr.length - 1], he, er); break } k(Ii, he, er) } return er.length ? er : void 0 } } function h(et) { return et.approximateLength += 3, et.flags & 1 ? D.createKeywordTypeNode(131) : D.createTypeReferenceNode(D.createIdentifier("..."), void 0) } function T(et, he) { var Bn; return !!(ac(et) & 8192) && (ya(he.reverseMappedStack, et) || ((Bn = he.reverseMappedStack) == null ? void 0 : Bn[0]) && !(Ur(To(he.reverseMappedStack).links.propertyType) & 16)) } function k(et, he, Bn) {
+                        var Mn; let or = !!(ac(et) & 8192), _r = T(et, he) ? Se : Gv(et), ua = he.enclosingDeclaration; if (he.enclosingDeclaration = void 0, he.tracker.canTrackSymbol && qk(et.escapedName)) if (et.declarations) { let Ct = Vo(et.declarations); if ($P(Ct)) if (ar(Ct)) { let Bt = sa(Ct); Bt && Vs(Bt) && LR(Bt.argumentExpression) && Tn(Bt.argumentExpression, ua, he) } else Tn(Ct.name.expression, ua, he) } else he.tracker.reportNonSerializableProperty(E(et)); he.enclosingDeclaration = et.valueDeclaration || ((Mn = et.declarations) == null ? void 0 : Mn[0]) || ua; let _i = Hd(et, he); he.enclosingDeclaration = ua, he.approximateLength += fc(et).length + 1; let ur = et.flags & 16777216 ? D.createToken(57) : void 0; if (et.flags & 8208 && !Ey(_r).length && !M_(et)) { let Ct = xa(jc(_r, Bt => !(Bt.flags & 32768)), 0); for (let Bt of Ct) { let Ft = de(Bt, 170, he, { name: _i, questionToken: ur }); Bn.push(st(Ft)) } } else { let Ct; T(et, he) ? Ct = h(he) : (or && (he.reverseMappedStack || (he.reverseMappedStack = []), he.reverseMappedStack.push(et)), Ct = _r ? Bi(he, _r, et, ua) : D.createKeywordTypeNode(131), or && he.reverseMappedStack.pop()); let Bt = M_(et) ? [D.createToken(146)] : void 0; Bt && (he.approximateLength += 9); let Ft = D.createPropertySignature(Bt, _i, ur, Ct); Bn.push(st(Ft)) } function st(Ct) {
+                            var Bt; if (vt(et.declarations, Ft => Ft.kind === 351)) {
+                                let Ft = (Bt = et.declarations) == null ? void 0 : Bt.find(Un => Un.kind === 351), hn = Cw(Ft.comment); hn && W0(Ct, [{
+                                    kind: 3, text: `*
+ * `+ hn.replace(/\n/g, `
+ * `) + `
+ `, pos: -1, end: -1, hasTrailingNewLine: !0
+                                }])
+                            } else et.valueDeclaration && hl(Ct, et.valueDeclaration); return Ct
+                        }
+                    } function O(et, he, Bn) { if (vt(et)) { if (c(he)) if (Bn) { if (et.length > 2) return [u(et[0], he), D.createTypeReferenceNode(`... ${et.length - 2} more ...`, void 0), u(et[et.length - 1], he)] } else return [D.createTypeReferenceNode("...", void 0)]; let or = !(he.flags & 64) ? vae() : void 0, _r = [], ua = 0; for (let _i of et) { if (ua++, c(he) && ua + 2 < et.length - 1) { _r.push(D.createTypeReferenceNode(`... ${et.length - ua} more ...`, void 0)); let st = u(et[et.length - 1], he); st && _r.push(st); break } he.approximateLength += 2; let ur = u(_i, he); ur && (_r.push(ur), or && Mle(ur) && or.add(ur.typeName.escapedText, [_i, _r.length - 1])) } if (or) { let _i = he.flags; he.flags |= 64, or.forEach(ur => { if (!Fle(ur, ([st], [Ct]) => H(st, Ct))) for (let [st, Ct] of ur) _r[Ct] = u(st, he) }), he.flags = _i } return _r } } function H(et, he) { return et === he || !!et.symbol && et.symbol === he.symbol || !!et.aliasSymbol && et.aliasSymbol === he.aliasSymbol } function J(et, he, Bn) { let Mn = Kse(et) || "x", or = u(et.keyType, he), _r = D.createParameterDeclaration(void 0, void 0, Mn, void 0, or, void 0); return Bn || (Bn = u(et.type || Se, he)), !et.type && !(he.flags & 2097152) && (he.encounteredError = !0), he.approximateLength += Mn.length + 4, D.createIndexSignature(et.isReadonly ? [D.createToken(146)] : void 0, [_r], Bn) } function de(et, he, Bn, Mn) { var or, _r, ua, _i, ur; let st = Bn.flags & 256; st && (Bn.flags &= -257), Bn.approximateLength += 3; let Ct, Bt; Bn.flags & 32 && et.target && et.mapper && et.target.typeParameters ? Bt = et.target.typeParameters.map(Ii => u(Oi(Ii, et.mapper), Bn)) : Ct = et.typeParameters && et.typeParameters.map(Ii => tt(Ii, Bn)); let Ft = Txe(et, !0)[0], hn; if (Bn.enclosingDeclaration && et.declaration && et.declaration !== Bn.enclosingDeclaration && !Yn(et.declaration) && vt(Ft)) { let Ii = Rr(Bn.enclosingDeclaration).fakeScopeForSignatureDeclaration ? Bn.enclosingDeclaration : void 0; L.assertOptionalNode(Ii, Va); let Bo = (or = Ii?.locals) != null ? or : Ua(), ys; for (let ds of Ft) Bo.has(ds.escapedName) || (ys = Sn(ys, ds.escapedName), Bo.set(ds.escapedName, ds)); if (ys) { let ds = function () { mn(ys, Bl => Bo.delete(Bl)) }; var Un = ds; if (Ii) hn = ds; else { let Bl = fm.createBlock(Je); Rr(Bl).fakeScopeForSignatureDeclaration = !0, Bl.locals = Bo; let ze = Bn.enclosingDeclaration; go(Bl, ze), Bn.enclosingDeclaration = Bl, hn = () => { Bn.enclosingDeclaration = ze, ds() } } } } let yi = (vt(Ft, Ii => Ii !== Ft[Ft.length - 1] && !!(ac(Ii) & 32768)) ? et.parameters : Ft).map(Ii => It(Ii, Bn, he === 173, Mn?.privateSymbolVisitor, Mn?.bundledImports)), Di = Bn.flags & 33554432 ? void 0 : Ae(et, Bn); Di && yi.unshift(Di); let Xt, er = Lf(et); if (er) { let Ii = er.kind === 2 || er.kind === 3 ? D.createToken(129) : void 0, Bo = er.kind === 1 || er.kind === 3 ? Jn(D.createIdentifier(er.parameterName), 33554432) : D.createThisTypeNode(), ys = er.type && u(er.type, Bn); Xt = D.createTypePredicateNode(Ii, Bo, ys) } else { let Ii = qo(et); Ii && !(st && Zo(Ii)) ? Xt = us(Bn, Ii, et, Mn?.privateSymbolVisitor, Mn?.bundledImports) : st || (Xt = D.createKeywordTypeNode(131)) } let Sr = Mn?.modifiers; if (he === 182 && et.flags & 4) { let Ii = im(Sr); Sr = D.createModifiersFromModifierFlags(Ii | 256) } let Dr = he === 176 ? D.createCallSignature(Ct, yi, Xt) : he === 177 ? D.createConstructSignature(Ct, yi, Xt) : he === 170 ? D.createMethodSignature(Sr, (_r = Mn?.name) != null ? _r : D.createIdentifier(""), Mn?.questionToken, Ct, yi, Xt) : he === 171 ? D.createMethodDeclaration(Sr, void 0, (ua = Mn?.name) != null ? ua : D.createIdentifier(""), void 0, Ct, yi, Xt, void 0) : he === 173 ? D.createConstructorDeclaration(Sr, yi, void 0) : he === 174 ? D.createGetAccessorDeclaration(Sr, (_i = Mn?.name) != null ? _i : D.createIdentifier(""), yi, Xt, void 0) : he === 175 ? D.createSetAccessorDeclaration(Sr, (ur = Mn?.name) != null ? ur : D.createIdentifier(""), yi, void 0) : he === 178 ? D.createIndexSignature(Sr, yi, Xt) : he === 320 ? D.createJSDocFunctionType(yi, Xt) : he === 181 ? D.createFunctionTypeNode(Ct, yi, Xt ?? D.createTypeReferenceNode(D.createIdentifier(""))) : he === 182 ? D.createConstructorTypeNode(Sr, Ct, yi, Xt ?? D.createTypeReferenceNode(D.createIdentifier(""))) : he === 259 ? D.createFunctionDeclaration(Sr, void 0, Mn?.name ? Ga(Mn.name, Re) : D.createIdentifier(""), Ct, yi, Xt, void 0) : he === 215 ? D.createFunctionExpression(Sr, void 0, Mn?.name ? Ga(Mn.name, Re) : D.createIdentifier(""), Ct, yi, Xt, D.createBlock([])) : he === 216 ? D.createArrowFunction(Sr, Ct, yi, Xt, void 0, D.createBlock([])) : L.assertNever(he); return Bt && (Dr.typeArguments = D.createNodeArray(Bt)), hn?.(), Dr } function Ae(et, he) { if (et.thisParameter) return It(et.thisParameter, he); if (et.declaration && Yn(et.declaration)) { let Bn = e6(et.declaration); if (Bn && Bn.typeExpression) return D.createParameterDeclaration(void 0, void 0, "this", void 0, u($r(Bn.typeExpression), he)) } } function xe(et, he, Bn) { let Mn = he.flags; he.flags &= -513; let or = D.createModifiersFromModifierFlags(Jne(et)), _r = Hr(et, he), ua = jE(et), _i = ua && u(ua, he); return he.flags = Mn, D.createTypeParameterDeclaration(or, _r, Bn, _i) } function tt(et, he, Bn = eu(et)) { let Mn = Bn && u(Bn, he); return xe(et, he, Mn) } function It(et, he, Bn, Mn, or) { let _r = nc(et, 166); !_r && !Zp(et) && (_r = nc(et, 344)); let ua = zn(et); _r && eke(_r) && (ua = gg(ua)); let _i = Bi(he, ua, et, he.enclosingDeclaration, Mn, or), ur = !(he.flags & 8192) && Bn && _r && g_(_r) ? on(uT(_r), D.cloneNode) : void 0, Ct = _r && Fm(_r) || ac(et) & 32768 ? D.createToken(25) : void 0, Bt = _r && _r.name ? _r.name.kind === 79 ? Jn(D.cloneNode(_r.name), 33554432) : _r.name.kind === 163 ? Jn(D.cloneNode(_r.name.right), 33554432) : yi(_r.name) : fc(et), hn = _r && Qk(_r) || ac(et) & 16384 ? D.createToken(57) : void 0, Un = D.createParameterDeclaration(ur, Ct, Bt, hn, _i, void 0); return he.approximateLength += fc(et).length + 3, Un; function yi(Di) { return Xt(Di); function Xt(er) { he.tracker.canTrackSymbol && ts(er) && Pte(er) && Tn(er.expression, he.enclosingDeclaration, he); let Sr = xn(er, Xt, Bh, void 0, Xt); return Wo(Sr) && (Sr = D.updateBindingElement(Sr, Sr.dotDotDotToken, Sr.propertyName, Sr.name, void 0)), ws(Sr) || (Sr = D.cloneNode(Sr)), Jn(Sr, 33554433) } } } function Tn(et, he, Bn) { if (!Bn.tracker.canTrackSymbol) return; let Mn = Yd(et), or = zs(Mn, Mn.escapedText, 1160127, void 0, void 0, !0); or && Bn.tracker.trackSymbol(or, he, 111551) } function un(et, he, Bn, Mn) { return he.tracker.trackSymbol(et, he.enclosingDeclaration, Bn), Nn(et, he, Bn, Mn) } function Nn(et, he, Bn, Mn) { let or; return !(et.flags & 262144) && (he.enclosingDeclaration || he.flags & 64) && !(he.flags & 134217728) ? (or = L.checkDefined(ua(et, Bn, !0)), L.assert(or && or.length > 0)) : or = [et], or; function ua(_i, ur, st) { let Ct = Rv(_i, he.enclosingDeclaration, ur, !!(he.flags & 128)), Bt; if (!Ct || k1(Ct[0], he.enclosingDeclaration, Ct.length === 1 ? ur : og(ur))) { let hn = IE(Ct ? Ct[0] : _i, he.enclosingDeclaration, ur); if (Fn(hn)) { Bt = hn.map(Di => vt(Di.declarations, sg) ? Jt(Di, he) : void 0); let Un = hn.map((Di, Xt) => Xt); Un.sort(Ft); let yi = Un.map(Di => hn[Di]); for (let Di of yi) { let Xt = ua(Di, og(ur), !1); if (Xt) { if (Di.exports && Di.exports.get("export=") && wp(Di.exports.get("export="), _i)) { Ct = Xt; break } Ct = Xt.concat(Ct || [ly(Di, _i) || _i]); break } } } } if (Ct) return Ct; if (st || !(_i.flags & 6144)) return !st && !Mn && mn(_i.declarations, sg) ? void 0 : [_i]; function Ft(hn, Un) { let yi = Bt[hn], Di = Bt[Un]; if (yi && Di) { let Xt = Jd(Di); return Jd(yi) === Xt ? tN(yi) - tN(Di) : Xt ? -1 : 1 } return 0 } } } function en(et, he) { let Bn; return oA(et).flags & 524384 && (Bn = D.createNodeArray(on(yy(et), or => tt(or, he)))), Bn } function cn(et, he, Bn) { var Mn; L.assert(et && 0 <= he && he < et.length); let or = et[he], _r = $a(or); if ((Mn = Bn.typeParameterSymbolList) != null && Mn.has(_r)) return; (Bn.typeParameterSymbolList || (Bn.typeParameterSymbolList = new Set)).add(_r); let ua; if (Bn.flags & 512 && he < et.length - 1) { let _i = or, ur = et[he + 1]; if (ac(ur) & 1) { let st = D1(_i.flags & 2097152 ? wc(_i) : _i); ua = O(on(st, Ct => zv(Ct, ur.links.mapper)), Bn) } else ua = en(or, Bn) } return ua } function rr(et) { return OS(et.objectType) ? rr(et.objectType) : et } function Jt(et, he, Bn) { var Mn; let or = nc(et, 308); if (!or) { let Ct = ks(et.declarations, Bt => wx(Bt, et)); Ct && (or = nc(Ct, 308)) } if (or && or.moduleName !== void 0) return or.moduleName; if (!or) { if (he.tracker.trackReferencedAmbientModule) { let Ct = Pr(et.declarations, lu); if (Fn(Ct)) for (let Bt of Ct) he.tracker.trackReferencedAmbientModule(Bt, et) } if (uF.test(et.escapedName)) return et.escapedName.substring(1, et.escapedName.length - 1) } if (!he.enclosingDeclaration || !he.tracker.moduleResolverHost) return uF.test(et.escapedName) ? et.escapedName.substring(1, et.escapedName.length - 1) : Gn(dH(et)).fileName; let _r = Gn(ec(he.enclosingDeclaration)), ua = Bn || _r?.impliedNodeFormat, _i = ML(_r.path, ua), ur = Ai(et), st = ur.specifierCache && ur.specifierCache.get(_i); if (!st) { let Ct = !!Ss(Y), { moduleResolverHost: Bt } = he.tracker, Ft = Ct ? { ...Y, baseUrl: Bt.getCommonSourceDirectory() } : Y; st = Vo(m_e(et, qe, Ft, _r, Bt, { importModuleSpecifierPreference: Ct ? "non-relative" : "project-relative", importModuleSpecifierEnding: Ct ? "minimal" : ua === 99 ? "js" : void 0 }, { overrideImportMode: Bn })), (Mn = ur.specifierCache) != null || (ur.specifierCache = new Map), ur.specifierCache.set(_i, st) } return st } function Cn(et) { let he = D.createIdentifier(Gi(et.escapedName)); return et.parent ? D.createQualifiedName(Cn(et.parent), he) : he } function Rn(et, he, Bn, Mn) { var or, _r, ua, _i; let ur = un(et, he, Bn, !(he.flags & 16384)), st = Bn === 111551; if (vt(ur[0].declarations, sg)) { let Ft = ur.length > 1 ? Bt(ur, ur.length - 1, 1) : void 0, hn = Mn || cn(ur, 0, he), Un = Gn(ec(he.enclosingDeclaration)), yi = m6(ur[0]), Di, Xt; if (($s(Y) === 3 || $s(Y) === 99) && yi?.impliedNodeFormat === 99 && yi.impliedNodeFormat !== Un?.impliedNodeFormat && (Di = Jt(ur[0], he, 99), Xt = D.createImportTypeAssertionContainer(D.createAssertClause(D.createNodeArray([D.createAssertEntry(D.createStringLiteral("resolution-mode"), D.createStringLiteral("import"))]))), (_r = (or = he.tracker).reportImportTypeNodeResolutionModeOverride) == null || _r.call(or)), Di || (Di = Jt(ur[0], he)), !(he.flags & 67108864) && $s(Y) !== 1 && Di.indexOf("/node_modules/") >= 0) { let Sr = Di; if ($s(Y) === 3 || $s(Y) === 99) { let Dr = Un?.impliedNodeFormat === 99 ? 1 : 99; Di = Jt(ur[0], he, Dr), Di.indexOf("/node_modules/") >= 0 ? Di = Sr : (Xt = D.createImportTypeAssertionContainer(D.createAssertClause(D.createNodeArray([D.createAssertEntry(D.createStringLiteral("resolution-mode"), D.createStringLiteral(Dr === 99 ? "import" : "require"))]))), (_i = (ua = he.tracker).reportImportTypeNodeResolutionModeOverride) == null || _i.call(ua)) } Xt || (he.encounteredError = !0, he.tracker.reportLikelyUnsafeImportRequiredError && he.tracker.reportLikelyUnsafeImportRequiredError(Sr)) } let er = D.createLiteralTypeNode(D.createStringLiteral(Di)); if (he.tracker.trackExternalModuleSymbolOfImportTypeNode && he.tracker.trackExternalModuleSymbolOfImportTypeNode(ur[0]), he.approximateLength += Di.length + 10, !Ft || Cd(Ft)) { if (Ft) { let Sr = Re(Ft) ? Ft : Ft.right; Ug(Sr, void 0) } return D.createImportTypeNode(er, Xt, Ft, hn, st) } else { let Sr = rr(Ft), Dr = Sr.objectType.typeName; return D.createIndexedAccessTypeNode(D.createImportTypeNode(er, Xt, Dr, hn, st), Sr.indexType) } } let Ct = Bt(ur, ur.length - 1, 0); if (OS(Ct)) return Ct; if (st) return D.createTypeQueryNode(Ct); { let Ft = Re(Ct) ? Ct : Ct.right, hn = NT(Ft); return Ug(Ft, void 0), D.createTypeReferenceNode(Ct, hn) } function Bt(Ft, hn, Un) { let yi = hn === Ft.length - 1 ? Mn : cn(Ft, hn, he), Di = Ft[hn], Xt = Ft[hn - 1], er; if (hn === 0) he.flags |= 16777216, er = _y(Di, he), he.approximateLength += (er ? er.length : 0) + 1, he.flags ^= 16777216; else if (Xt && Gd(Xt)) { let Dr = Gd(Xt); Ld(Dr, (Ii, Bo) => { if (wp(Ii, Di) && !qk(Bo) && Bo !== "export=") return er = Gi(Bo), !0 }) } if (er === void 0) { let Dr = ks(Di.declarations, sa); if (Dr && ts(Dr) && Cd(Dr.expression)) { let Ii = Bt(Ft, hn - 1, Un); return Cd(Ii) ? D.createIndexedAccessTypeNode(D.createParenthesizedType(D.createTypeQueryNode(Ii)), D.createTypeQueryNode(Dr.expression)) : Ii } er = _y(Di, he) } if (he.approximateLength += er.length + 1, !(he.flags & 16) && Xt && vy(Xt) && vy(Xt).get(Di.escapedName) && wp(vy(Xt).get(Di.escapedName), Di)) { let Dr = Bt(Ft, hn - 1, Un); return OS(Dr) ? D.createIndexedAccessTypeNode(Dr, D.createLiteralTypeNode(D.createStringLiteral(er))) : D.createIndexedAccessTypeNode(D.createTypeReferenceNode(Dr, yi), D.createLiteralTypeNode(D.createStringLiteral(er))) } let Sr = Jn(D.createIdentifier(er), 33554432); if (yi && Ug(Sr, D.createNodeArray(yi)), Sr.symbol = Di, hn > Un) { let Dr = Bt(Ft, hn - 1, Un); return Cd(Dr) ? D.createQualifiedName(Dr, Sr) : L.fail("Impossible construct - an export of an indexed access cannot be reachable") } return Sr } } function Br(et, he, Bn) { let Mn = zs(he.enclosingDeclaration, et, 788968, void 0, et, !1); return Mn ? !(Mn.flags & 262144 && Mn === Bn.symbol) : !1 } function Hr(et, he) { var Bn, Mn; if (he.flags & 4 && he.typeParameterNames) { let _r = he.typeParameterNames.get(ru(et)); if (_r) return _r } let or = qi(et.symbol, he, 788968, !0); if (!(or.kind & 79)) return D.createIdentifier("(Missing type parameter)"); if (he.flags & 4) { let _r = or.escapedText, ua = ((Bn = he.typeParameterNamesByTextNextNameCount) == null ? void 0 : Bn.get(_r)) || 0, _i = _r; for (; (Mn = he.typeParameterNamesByText) != null && Mn.has(_i) || Br(_i, he, et);)ua++, _i = `${_r}_${ua}`; if (_i !== _r) { let ur = NT(or); or = D.createIdentifier(_i), Ug(or, ur) } (he.typeParameterNamesByTextNextNameCount || (he.typeParameterNamesByTextNextNameCount = new Map)).set(_r, ua), (he.typeParameterNames || (he.typeParameterNames = new Map)).set(ru(et), or), (he.typeParameterNamesByText || (he.typeParameterNamesByText = new Set)).add(_r) } return or } function qi(et, he, Bn, Mn) { let or = un(et, he, Bn); return Mn && or.length !== 1 && !he.encounteredError && !(he.flags & 65536) && (he.encounteredError = !0), _r(or, or.length - 1); function _r(ua, _i) { let ur = cn(ua, _i, he), st = ua[_i]; _i === 0 && (he.flags |= 16777216); let Ct = _y(st, he); _i === 0 && (he.flags ^= 16777216); let Bt = Jn(D.createIdentifier(Ct), 33554432); return ur && Ug(Bt, D.createNodeArray(ur)), Bt.symbol = st, _i > 0 ? D.createQualifiedName(_r(ua, _i - 1), Bt) : Bt } } function wa(et, he, Bn) { let Mn = un(et, he, Bn); return or(Mn, Mn.length - 1); function or(_r, ua) { let _i = cn(_r, ua, he), ur = _r[ua]; ua === 0 && (he.flags |= 16777216); let st = _y(ur, he); ua === 0 && (he.flags ^= 16777216); let Ct = st.charCodeAt(0); if (Xw(Ct) && vt(ur.declarations, sg)) return D.createStringLiteral(Jt(ur, he)); if (ua === 0 || HW(st, R)) { let Bt = Jn(D.createIdentifier(st), 33554432); return _i && Ug(Bt, D.createNodeArray(_i)), Bt.symbol = ur, ua > 0 ? D.createPropertyAccessExpression(or(_r, ua - 1), Bt) : Bt } else { Ct === 91 && (st = st.substring(1, st.length - 1), Ct = st.charCodeAt(0)); let Bt; if (Xw(Ct) && !(ur.flags & 8) ? Bt = D.createStringLiteral(u_(st).replace(/\\./g, Ft => Ft.substring(1)), Ct === 39) : "" + +st === st && (Bt = D.createNumericLiteral(+st)), !Bt) { let Ft = Jn(D.createIdentifier(st), 33554432); _i && Ug(Ft, D.createNodeArray(_i)), Ft.symbol = ur, Bt = Ft } return D.createElementAccessExpression(or(_r, ua - 1), Bt) } } } function Xc(et) { let he = sa(et); return !!he && yo(he) } function pf(et) { let he = sa(et); return !!(he && yo(he) && (he.singleQuote || !ws(he) && na(Qc(he, !1), "'"))) } function Hd(et, he) { let Bn = !!Fn(et.declarations) && Ji(et.declarations, Xc), Mn = !!Fn(et.declarations) && Ji(et.declarations, pf), or = ji(et, he, Mn, Bn); if (or) return or; let _r = Gi(et.escapedName); return E4(_r, Do(Y), Mn, Bn) } function ji(et, he, Bn, Mn) { let or = Ai(et).nameType; if (or) { if (or.flags & 384) { let _r = "" + or.value; return !i_(_r, Do(Y)) && (Mn || !Wm(_r)) ? D.createStringLiteral(_r, !!Bn) : Wm(_r) && na(_r, "-") ? D.createComputedPropertyName(D.createNumericLiteral(+_r)) : E4(_r, Do(Y)) } if (or.flags & 8192) return D.createComputedPropertyName(wa(or.symbol, he, 111551)) } } function In(et) { let he = { ...et }; return he.typeParameterNames && (he.typeParameterNames = new Map(he.typeParameterNames)), he.typeParameterNamesByText && (he.typeParameterNamesByText = new Set(he.typeParameterNamesByText)), he.typeParameterSymbolList && (he.typeParameterSymbolList = new Set(he.typeParameterSymbolList)), he.tracker = new iN(he, he.tracker.inner, he.tracker.moduleResolverHost), he } function qn(et, he) { return et.declarations && wr(et.declarations, Bn => !!Cl(Bn) && (!he || !!jn(Bn, Mn => Mn === he))) } function Mi(et, he) { return !(Ur(he) & 4) || !m_(et) || Fn(et.typeArguments) >= Mp(he.target.typeParameters) } function ga(et) { return Rr(et).fakeScopeForSignatureDeclaration ? et.parent : et } function Bi(et, he, Bn, Mn, or, _r) { if (!Ro(he) && Mn) { let ur = qn(Bn, ga(Mn)); if (ur && !Ds(ur) && !p_(ur)) { let st = Cl(ur); if (ko(st, ur, he) && Mi(st, he)) { let Ct = no(et, st, or, _r); if (Ct) return Ct } } } let ua = et.flags; he.flags & 8192 && he.symbol === Bn && (!et.enclosingDeclaration || vt(Bn.declarations, ur => Gn(ur) === Gn(et.enclosingDeclaration))) && (et.flags |= 1048576); let _i = u(he, et); return et.flags = ua, _i } function ko(et, he, Bn) { let Mn = $r(et); return Mn === Bn ? !0 : ha(he) && he.questionToken ? wf(Bn, 524288) === Mn : !1 } function us(et, he, Bn, Mn, or) { if (!Ro(he) && et.enclosingDeclaration) { let _r = Bn.declaration && U_(Bn.declaration), ua = ga(et.enclosingDeclaration); if (jn(_r, _i => _i === ua) && _r) { let _i = $r(_r); if ((_i.flags & 262144 && _i.isThisType ? Oi(_i, Bn.mapper) : _i) === he && Mi(_r, he)) { let st = no(et, _r, Mn, or); if (st) return st } } } return u(he, et) } function Xs(et, he, Bn) { let Mn = !1, or = Yd(et); if (Yn(et) && (TT(or) || Bm(or.parent) || Yu(or.parent) && RH(or.parent.left) && TT(or.parent.right))) return Mn = !0, { introducesError: Mn, node: et }; let _r = uc(or, 67108863, !0, !0); if (_r && (dy(_r, he.enclosingDeclaration, 67108863, !1).accessibility !== 0 ? Mn = !0 : (he.tracker.trackSymbol(_r, he.enclosingDeclaration, 67108863), Bn?.(_r)), Re(et))) { let ua = gs(_r), _i = _r.flags & 262144 && !RE(ua.symbol, he.enclosingDeclaration) ? Hr(ua, he) : D.cloneNode(et); return _i.symbol = _r, { introducesError: Mn, node: Jn(Ir(_i, et), 33554432) } } return { introducesError: Mn, node: et } } function no(et, he, Bn, Mn) { o && o.throwIfCancellationRequested && o.throwIfCancellationRequested(); let or = !1, _r = Gn(he), ua = $e(he, _i, bi); if (or) return; return ua === he ? it(D.cloneNode(he), he) : ua; function _i(ur) { if (Kue(ur) || ur.kind === 322) return D.createKeywordTypeNode(131); if (que(ur)) return D.createKeywordTypeNode(157); if (T2(ur)) return D.createUnionTypeNode([$e(ur.type, _i, bi), D.createLiteralTypeNode(D.createNull())]); if (Uz(ur)) return D.createUnionTypeNode([$e(ur.type, _i, bi), D.createKeywordTypeNode(155)]); if (m3(ur)) return $e(ur.type, _i); if (h3(ur)) return D.createArrayTypeNode($e(ur.type, _i, bi)); if (LL(ur)) return D.createTypeLiteralNode(on(ur.jsDocPropertyTags, Ft => { let hn = Re(Ft.name) ? Ft.name : Ft.name.right, Un = Vc($r(ur), hn.escapedText), yi = Un && Ft.typeExpression && $r(Ft.typeExpression.type) !== Un ? u(Un, et) : void 0; return D.createPropertySignature(void 0, hn, Ft.isBracketed || Ft.typeExpression && Uz(Ft.typeExpression.type) ? D.createToken(57) : void 0, yi || Ft.typeExpression && $e(Ft.typeExpression.type, _i, bi) || D.createKeywordTypeNode(131)) })); if (m_(ur) && Re(ur.typeName) && ur.typeName.escapedText === "") return Ir(D.createKeywordTypeNode(131), ur); if ((Vg(ur) || m_(ur)) && U6(ur)) return D.createTypeLiteralNode([D.createIndexSignature(void 0, [D.createParameterDeclaration(void 0, void 0, "x", void 0, $e(ur.typeArguments[0], _i, bi))], $e(ur.typeArguments[1], _i, bi))]); if (S2(ur)) if (jA(ur)) { let Ft; return D.createConstructorTypeNode(void 0, On(ur.typeParameters, _i, _c), Zi(ur.parameters, (hn, Un) => hn.name && Re(hn.name) && hn.name.escapedText === "new" ? (Ft = hn.type, void 0) : D.createParameterDeclaration(void 0, st(hn), Ct(hn, Un), hn.questionToken, $e(hn.type, _i, bi), void 0)), $e(Ft || ur.type, _i, bi) || D.createKeywordTypeNode(131)) } else return D.createFunctionTypeNode(On(ur.typeParameters, _i, _c), on(ur.parameters, (Ft, hn) => D.createParameterDeclaration(void 0, st(Ft), Ct(Ft, hn), Ft.questionToken, $e(Ft.type, _i, bi), void 0)), $e(ur.type, _i, bi) || D.createKeywordTypeNode(131)); if (m_(ur) && qw(ur) && (!Mi(ur, $r(ur)) || Yxe(ur) || Ht === Kx(ur, 788968, !0))) return Ir(u($r(ur), et), ur); if (ib(ur)) { let Ft = Rr(ur).resolvedSymbol; return qw(ur) && Ft && (!ur.isTypeOf && !(Ft.flags & 788968) || !(Fn(ur.typeArguments) >= Mp(yy(Ft)))) ? Ir(u($r(ur), et), ur) : D.updateImportTypeNode(ur, D.updateLiteralTypeNode(ur.argument, Bt(ur, ur.argument.literal)), ur.assertions, ur.qualifier, On(ur.typeArguments, _i, bi), ur.isTypeOf) } if (Cd(ur) || bc(ur)) { let { introducesError: Ft, node: hn } = Xs(ur, et, Bn); if (or = or || Ft, hn !== ur) return hn } return _r && p2(ur) && Gs(_r, ur.pos).line === Gs(_r, ur.end).line && Jn(ur, 1), xn(ur, _i, Bh); function st(Ft) { return Ft.dotDotDotToken || (Ft.type && h3(Ft.type) ? D.createToken(25) : void 0) } function Ct(Ft, hn) { return Ft.name && Re(Ft.name) && Ft.name.escapedText === "this" ? "this" : st(Ft) ? "args" : `arg${hn}` } function Bt(Ft, hn) { if (Mn) { if (et.tracker && et.tracker.moduleResolverHost) { let Un = qie(Ft); if (Un) { let Di = { getCanonicalFileName: Dl(!!e.useCaseSensitiveFileNames), getCurrentDirectory: () => et.tracker.moduleResolverHost.getCurrentDirectory(), getCommonSourceDirectory: () => et.tracker.moduleResolverHost.getCommonSourceDirectory() }, Xt = Z6(Di, Un); return D.createStringLiteral(Xt) } } } else if (et.tracker && et.tracker.trackExternalModuleSymbolOfImportTypeNode) { let Un = ah(hn, hn, void 0); Un && et.tracker.trackExternalModuleSymbolOfImportTypeNode(Un) } return hn } } } function Tu(et, he, Bn) {
+                        let Mn = F_(D.createPropertyDeclaration, 171, !0), or = F_((bt, cr, oi, Jr) => D.createPropertySignature(bt, cr, oi, Jr), 170, !1), _r = he.enclosingDeclaration, ua = [], _i = new Set, ur = [], st = he; he = { ...st, usedSymbolNames: new Set(st.usedSymbolNames), remappedSymbolNames: new Map, tracker: void 0 }; let Ct = { ...st.tracker.inner, trackSymbol: (bt, cr, oi) => { var Jr; if (dy(bt, cr, oi, !1).accessibility === 0) { let Po = Nn(bt, he, oi); bt.flags & 4 || ds(Po[0]) } else if ((Jr = st.tracker.inner) != null && Jr.trackSymbol) return st.tracker.inner.trackSymbol(bt, cr, oi); return !1 } }; he.tracker = new iN(he, Ct, st.tracker.moduleResolverHost), Ld(et, (bt, cr) => { let oi = Gi(cr); sd(bt, oi) }); let Bt = !Bn, Ft = et.get("export="); return Ft && et.size > 1 && Ft.flags & 2097152 && (et = Ua(), et.set("export=", Ft)), Ii(et), er(ua); function hn(bt) { return !!bt && bt.kind === 79 } function Un(bt) { return Bc(bt) ? Pr(on(bt.declarationList.declarations, sa), hn) : Pr([sa(bt)], hn) } function yi(bt) { let cr = wr(bt, pc), oi = Yc(bt, Tc), Jr = oi !== -1 ? bt[oi] : void 0; if (Jr && cr && cr.isExportEquals && Re(cr.expression) && Re(Jr.name) && vr(Jr.name) === vr(cr.expression) && Jr.body && Tp(Jr.body)) { let Xr = Pr(bt, Ui => !!(uu(Ui) & 1)), Po = Jr.name, va = Jr.body; if (Fn(Xr) && (Jr = D.updateModuleDeclaration(Jr, Jr.modifiers, Jr.name, va = D.updateModuleBlock(va, D.createNodeArray([...Jr.body.statements, D.createExportDeclaration(void 0, !1, D.createNamedExports(on(Uo(Xr, Ui => Un(Ui)), Ui => D.createExportSpecifier(!1, void 0, Ui))), void 0)]))), bt = [...bt.slice(0, oi), Jr, ...bt.slice(oi + 1)]), !wr(bt, Ui => Ui !== Jr && xw(Ui, Po))) { ua = []; let Ui = !vt(va.statements, Eo => Mr(Eo, 1) || pc(Eo) || Il(Eo)); mn(va.statements, Eo => { ze(Eo, Ui ? 1 : 0) }), bt = [...Pr(bt, Eo => Eo !== Jr && Eo !== cr), ...ua] } } return bt } function Di(bt) { let cr = Pr(bt, Jr => Il(Jr) && !Jr.moduleSpecifier && !!Jr.exportClause && h_(Jr.exportClause)); Fn(cr) > 1 && (bt = [...Pr(bt, Xr => !Il(Xr) || !!Xr.moduleSpecifier || !Xr.exportClause), D.createExportDeclaration(void 0, !1, D.createNamedExports(Uo(cr, Xr => Ga(Xr.exportClause, h_).elements)), void 0)]); let oi = Pr(bt, Jr => Il(Jr) && !!Jr.moduleSpecifier && !!Jr.exportClause && h_(Jr.exportClause)); if (Fn(oi) > 1) { let Jr = YC(oi, Xr => yo(Xr.moduleSpecifier) ? ">" + Xr.moduleSpecifier.text : ">"); if (Jr.length !== oi.length) for (let Xr of Jr) Xr.length > 1 && (bt = [...Pr(bt, Po => Xr.indexOf(Po) === -1), D.createExportDeclaration(void 0, !1, D.createNamedExports(Uo(Xr, Po => Ga(Po.exportClause, h_).elements)), Xr[0].moduleSpecifier)]) } return bt } function Xt(bt) { let cr = Yc(bt, oi => Il(oi) && !oi.moduleSpecifier && !oi.assertClause && !!oi.exportClause && h_(oi.exportClause)); if (cr >= 0) { let oi = bt[cr], Jr = Zi(oi.exportClause.elements, Xr => { if (!Xr.propertyName) { let Po = jD(bt), va = Pr(Po, Ui => xw(bt[Ui], Xr.name)); if (Fn(va) && Ji(va, Ui => WR(bt[Ui]))) { for (let Ui of va) bt[Ui] = Sr(bt[Ui]); return } } return Xr }); Fn(Jr) ? bt[cr] = D.updateExportDeclaration(oi, oi.modifiers, oi.isTypeOnly, D.updateNamedExports(oi.exportClause, Jr), oi.moduleSpecifier, oi.assertClause) : y0(bt, cr) } return bt } function er(bt) { return bt = yi(bt), bt = Di(bt), bt = Xt(bt), _r && (Li(_r) && kd(_r) || Tc(_r)) && (!vt(bt, Rw) || !yse(bt) && vt(bt, l6)) && bt.push(bO(D)), bt } function Sr(bt) { let cr = (uu(bt) | 1) & -3; return D.updateModifiers(bt, cr) } function Dr(bt) { let cr = uu(bt) & -2; return D.updateModifiers(bt, cr) } function Ii(bt, cr, oi) { cr || ur.push(new Map), bt.forEach(Jr => { Bo(Jr, !1, !!oi) }), cr || (ur[ur.length - 1].forEach(Jr => { Bo(Jr, !0, !!oi) }), ur.pop()) } function Bo(bt, cr, oi) { let Jr = No(bt); if (_i.has($a(Jr))) return; if (_i.add($a(Jr)), !cr || Fn(bt.declarations) && vt(bt.declarations, Po => !!jn(Po, va => va === _r))) { let Po = he; he = In(he), ys(bt, cr, oi), he.reportedDiagnostic && (st.reportedDiagnostic = he.reportedDiagnostic), he = Po } } function ys(bt, cr, oi) { var Jr, Xr, Po, va; let Ui = Gi(bt.escapedName), Eo = bt.escapedName === "default"; if (cr && !(he.flags & 131072) && fS(Ui) && !Eo) { he.encounteredError = !0; return } let Xo = Eo && !!(bt.flags & -113 || bt.flags & 16 && Fn(Jo(zn(bt)))) && !(bt.flags & 2097152), Rc = !Xo && !cr && fS(Ui) && !Eo; (Xo || Rc) && (cr = !0); let rl = (cr ? 0 : 1) | (Eo && !Xo ? 1024 : 0), Wd = bt.flags & 1536 && bt.flags & 7 && bt.escapedName !== "export=", Vl = Wd && Ul(zn(bt), bt); if ((bt.flags & 8208 || Vl) && Ar(zn(bt), bt, sd(bt, Ui), rl), bt.flags & 524288 && dt(bt, Ui, rl), bt.flags & 7 && bt.escapedName !== "export=" && !(bt.flags & 4194304) && !(bt.flags & 32) && !(bt.flags & 8192) && !Vl) if (oi) as(bt) && (Rc = !1, Xo = !1); else { let bs = zn(bt), dc = sd(bt, Ui); if (!(bt.flags & 16) && Ul(bs, bt)) Ar(bs, bt, dc, rl); else { let Tg = bt.flags & 2 ? wC(bt) ? 2 : 1 : (Jr = bt.parent) != null && Jr.valueDeclaration && Li((Xr = bt.parent) == null ? void 0 : Xr.valueDeclaration) ? 2 : void 0, wm = Xo || !(bt.flags & 4) ? dc : lA(dc, bt), Rm = bt.declarations && wr(bt.declarations, Ry => wi(Ry)); Rm && pu(Rm.parent) && Rm.parent.declarations.length === 1 && (Rm = Rm.parent.parent); let V1 = (Po = bt.declarations) == null ? void 0 : Po.find(br); if (V1 && ar(V1.parent) && Re(V1.parent.right) && ((va = bs.symbol) != null && va.valueDeclaration) && Li(bs.symbol.valueDeclaration)) { let Ry = dc === V1.parent.right.escapedText ? void 0 : V1.parent.right; ze(D.createExportDeclaration(void 0, !1, D.createNamedExports([D.createExportSpecifier(!1, Ry, dc)])), 0), he.tracker.trackSymbol(bs.symbol, he.enclosingDeclaration, 111551) } else { let Ry = it(D.createVariableStatement(void 0, D.createVariableDeclarationList([D.createVariableDeclaration(wm, void 0, Bi(he, bs, bt, _r, ds, Bn))], Tg)), Rm); ze(Ry, wm !== dc ? rl & -2 : rl), wm !== dc && !cr && (ze(D.createExportDeclaration(void 0, !1, D.createNamedExports([D.createExportSpecifier(!1, wm, dc)])), 0), Rc = !1, Xo = !1) } } } if (bt.flags & 384 && sr(bt, Ui, rl), bt.flags & 32 && (bt.flags & 4 && bt.valueDeclaration && ar(bt.valueDeclaration.parent) && _u(bt.valueDeclaration.parent.right) ? mo(bt, sd(bt, Ui), rl) : Zr(bt, sd(bt, Ui), rl)), (bt.flags & 1536 && (!Wd || Zn(bt)) || Vl) && fn(bt, Ui, rl), bt.flags & 64 && !(bt.flags & 32) && Ut(bt, Ui, rl), bt.flags & 2097152 && mo(bt, sd(bt, Ui), rl), bt.flags & 4 && bt.escapedName === "export=" && as(bt), bt.flags & 8388608 && bt.declarations) for (let bs of bt.declarations) { let dc = Gl(bs, bs.moduleSpecifier); dc && ze(D.createExportDeclaration(void 0, bs.isTypeOnly, void 0, D.createStringLiteral(Jt(dc, he))), 0) } Xo ? ze(D.createExportAssignment(void 0, !1, D.createIdentifier(sd(bt, Ui))), 0) : Rc && ze(D.createExportDeclaration(void 0, !1, D.createNamedExports([D.createExportSpecifier(!1, sd(bt, Ui), Ui)])), 0) } function ds(bt) { if (vt(bt.declarations, CT)) return; L.assertIsDefined(ur[ur.length - 1]), lA(Gi(bt.escapedName), bt); let cr = !!(bt.flags & 2097152) && !vt(bt.declarations, oi => !!jn(oi, Il) || qm(oi) || Nl(oi) && !um(oi.moduleReference)); ur[cr ? 0 : ur.length - 1].set($a(bt), bt) } function Bl(bt) { return Li(bt) && (kd(bt) || Mf(bt)) || lu(bt) && !mp(bt) } function ze(bt, cr) { if (g_(bt)) { let oi = 0, Jr = he.enclosingDeclaration && (Ff(he.enclosingDeclaration) ? Gn(he.enclosingDeclaration) : he.enclosingDeclaration); cr & 1 && Jr && (Bl(Jr) || Tc(Jr)) && WR(bt) && (oi |= 1), Bt && !(oi & 1) && (!Jr || !(Jr.flags & 16777216)) && (hb(bt) || Bc(bt) || Jc(bt) || sl(bt) || Tc(bt)) && (oi |= 2), cr & 1024 && (sl(bt) || ku(bt) || Jc(bt)) && (oi |= 1024), oi && (bt = D.updateModifiers(bt, oi | uu(bt))) } ua.push(bt) } function dt(bt, cr, oi) {
+                            var Jr; let Xr = Kb(bt), Po = Ai(bt).typeParameters, va = on(Po, Wd => tt(Wd, he)), Ui = (Jr = bt.declarations) == null ? void 0 : Jr.find(Ff), Eo = Cw(Ui ? Ui.comment || Ui.parent.comment : void 0), Xo = he.flags; he.flags |= 8388608; let Rc = he.enclosingDeclaration; he.enclosingDeclaration = Ui; let rl = Ui && Ui.typeExpression && UT(Ui.typeExpression) && no(he, Ui.typeExpression.type, ds, Bn) || u(Xr, he); ze(W0(D.createTypeAliasDeclaration(void 0, sd(bt, cr), va, rl), Eo ? [{
+                                kind: 3, text: `*
+ * `+ Eo.replace(/\n/g, `
+ * `) + `
+ `, pos: -1, end: -1, hasTrailingNewLine: !0
+                            }] : []), oi), he.flags = Xo, he.enclosingDeclaration = Rc
+                        } function Ut(bt, cr, oi) { let Jr = vu(bt), Xr = yy(bt), Po = on(Xr, Vl => tt(Vl, he)), va = _o(Jr), Ui = Fn(va) ? so(va) : void 0, Eo = Uo(Jo(Jr), Vl => Dm(Vl, Ui)), Xo = $v(0, Jr, Ui, 176), Rc = $v(1, Jr, Ui, 177), rl = U1(Jr, Ui), Wd = Fn(va) ? [D.createHeritageClause(94, Zi(va, Vl => Hp(Vl, 111551)))] : void 0; ze(D.createInterfaceDeclaration(void 0, sd(bt, cr), Po, Wd, [...rl, ...Rc, ...Xo, ...Eo]), oi) } function wn(bt) { return bt.exports ? Pr(lo(bt.exports.values()), Aa) : [] } function Zn(bt) { return Ji(wn(bt), cr => !(Fl(Ac(cr)) & 111551)) } function fn(bt, cr, oi) { let Jr = wn(bt), Xr = KD(Jr, Ui => Ui.parent && Ui.parent === bt ? "real" : "merged"), Po = Xr.get("real") || Je, va = Xr.get("merged") || Je; if (Fn(Po)) { let Ui = sd(bt, cr); ia(Po, Ui, oi, !!(bt.flags & 67108880)) } if (Fn(va)) { let Ui = Gn(he.enclosingDeclaration), Eo = sd(bt, cr), Xo = D.createModuleBlock([D.createExportDeclaration(void 0, !1, D.createNamedExports(Zi(Pr(va, Rc => Rc.escapedName !== "export="), Rc => { var rl, Wd; let Vl = Gi(Rc.escapedName), bs = sd(Rc, Vl), dc = Rc.declarations && Uu(Rc); if (Ui && (dc ? Ui !== Gn(dc) : !vt(Rc.declarations, Rm => Gn(Rm) === Ui))) { (Wd = (rl = he.tracker) == null ? void 0 : rl.reportNonlocalAugmentation) == null || Wd.call(rl, Ui, bt, Rc); return } let Tg = dc && L_(dc, !0); ds(Tg || Rc); let wm = Tg ? sd(Tg, Gi(Tg.escapedName)) : bs; return D.createExportSpecifier(!1, Vl === wm ? void 0 : wm, Vl) })))]); ze(D.createModuleDeclaration(void 0, D.createIdentifier(Eo), Xo, 16), 0) } } function sr(bt, cr, oi) { ze(D.createEnumDeclaration(D.createModifiersFromModifierFlags(gie(bt) ? 2048 : 0), sd(bt, cr), on(Pr(Jo(zn(bt)), Jr => !!(Jr.flags & 8)), Jr => { let Xr = Jr.declarations && Jr.declarations[0] && q0(Jr.declarations[0]) ? zie(Jr.declarations[0]) : void 0; return D.createEnumMember(Gi(Jr.escapedName), Xr === void 0 ? void 0 : typeof Xr == "string" ? D.createStringLiteral(Xr) : D.createNumericLiteral(Xr)) })), oi) } function Ar(bt, cr, oi, Jr) { let Xr = xa(bt, 0); for (let Po of Xr) { let va = de(Po, 259, he, { name: D.createIdentifier(oi), privateSymbolVisitor: ds, bundledImports: Bn }); ze(it(va, Ei(Po)), Jr) } if (!(cr.flags & 1536 && cr.exports && cr.exports.size)) { let Po = Pr(Jo(bt), Aa); ia(Po, oi, Jr, !0) } } function Ei(bt) { if (bt.declaration && bt.declaration.parent) { if (ar(bt.declaration.parent) && ic(bt.declaration.parent) === 5) return bt.declaration.parent; if (wi(bt.declaration.parent) && bt.declaration.parent.parent) return bt.declaration.parent.parent } return bt.declaration } function ia(bt, cr, oi, Jr) { if (Fn(bt)) { let Po = KD(bt, bs => !Fn(bs.declarations) || vt(bs.declarations, dc => Gn(dc) === Gn(he.enclosingDeclaration)) ? "local" : "remote").get("local") || Je, va = fm.createModuleDeclaration(void 0, D.createIdentifier(cr), D.createModuleBlock([]), 16); go(va, _r), va.locals = Ua(bt), va.symbol = bt[0].parent; let Ui = ua; ua = []; let Eo = Bt; Bt = !1; let Xo = { ...he, enclosingDeclaration: va }, Rc = he; he = Xo, Ii(Ua(Po), Jr, !0), he = Rc, Bt = Eo; let rl = ua; ua = Ui; let Wd = on(rl, bs => pc(bs) && !bs.isExportEquals && Re(bs.expression) ? D.createExportDeclaration(void 0, !1, D.createNamedExports([D.createExportSpecifier(!1, bs.expression, D.createIdentifier("default"))])) : bs), Vl = Ji(Wd, bs => Mr(bs, 1)) ? on(Wd, Dr) : Wd; va = D.updateModuleDeclaration(va, va.modifiers, va.name, D.createModuleBlock(Vl)), ze(va, oi) } } function Aa(bt) { return !!(bt.flags & 2887656) || !(bt.flags & 4194304 || bt.escapedName === "prototype" || bt.valueDeclaration && Ca(bt.valueDeclaration) && Yr(bt.valueDeclaration.parent)) } function Ra(bt) { let cr = Zi(bt, oi => { let Jr = he.enclosingDeclaration; he.enclosingDeclaration = oi; let Xr = oi.expression; if (bc(Xr)) { if (Re(Xr) && vr(Xr) === "") return Po(void 0); let va; if ({ introducesError: va, node: Xr } = Xs(Xr, he, ds), va) return Po(void 0) } return Po(D.createExpressionWithTypeArguments(Xr, on(oi.typeArguments, va => no(he, va, ds, Bn) || u($r(va), he)))); function Po(va) { return he.enclosingDeclaration = Jr, va } }); if (cr.length === bt.length) return cr } function Zr(bt, cr, oi) { var Jr, Xr; let Po = (Jr = bt.declarations) == null ? void 0 : Jr.find(Yr), va = he.enclosingDeclaration; he.enclosingDeclaration = Po || va; let Ui = yy(bt), Eo = on(Ui, lp => tt(lp, he)), Xo = vu(bt), Rc = _o(Xo), rl = Po && JA(Po), Wd = rl && Ra(rl) || Zi(Ci(Xo), cA), Vl = zn(bt), bs = !!((Xr = Vl.symbol) != null && Xr.valueDeclaration) && Yr(Vl.symbol.valueDeclaration), dc = bs ? Wr(Vl) : Se, Tg = [...Fn(Rc) ? [D.createHeritageClause(94, on(Rc, lp => KC(lp, dc, cr)))] : [], ...Fn(Wd) ? [D.createHeritageClause(117, Wd)] : []], wm = Qtt(Xo, Rc, Jo(Xo)), Rm = Pr(wm, lp => { let qC = lp.valueDeclaration; return !!qC && !(zl(qC) && pi(qC.name)) }), Ry = vt(wm, lp => { let qC = lp.valueDeclaration; return !!qC && zl(qC) && pi(qC.name) }) ? [D.createPropertyDeclaration(void 0, D.createPrivateIdentifier("#private"), void 0, void 0, void 0)] : Je, tae = Uo(Rm, lp => Mn(lp, !1, Rc[0])), nae = Uo(Pr(Jo(Vl), lp => !(lp.flags & 4194304) && lp.escapedName !== "prototype" && !Aa(lp)), lp => Mn(lp, !0, dc)), pit = !bs && !!bt.valueDeclaration && Yn(bt.valueDeclaration) && !vt(xa(Vl, 1)) ? [D.createConstructorDeclaration(D.createModifiersFromModifierFlags(8), [], void 0)] : $v(1, Vl, dc, 173), mit = U1(Xo, Rc[0]); he.enclosingDeclaration = va, ze(it(D.createClassDeclaration(void 0, cr, Eo, Tg, [...mit, ...nae, ...pit, ...tae, ...Ry]), bt.declarations && Pr(bt.declarations, lp => sl(lp) || _u(lp))[0]), oi) } function Oa(bt) { return ks(bt, cr => { if ($u(cr) || Mu(cr)) return vr(cr.propertyName || cr.name); if (ar(cr) || pc(cr)) { let oi = pc(cr) ? cr.expression : cr.right; if (br(oi)) return vr(oi.name) } if (Zh(cr)) { let oi = sa(cr); if (oi && Re(oi)) return vr(oi) } }) } function mo(bt, cr, oi) { var Jr, Xr, Po, va, Ui; let Eo = Uu(bt); if (!Eo) return L.fail(); let Xo = No(L_(Eo, !0)); if (!Xo) return; let Rc = CI(Xo) && Oa(bt.declarations) || Gi(Xo.escapedName); Rc === "export=" && (f_(Y) || Y.allowSyntheticDefaultImports) && (Rc = "default"); let rl = sd(Xo, Rc); switch (ds(Xo), Eo.kind) { case 205: if (((Xr = (Jr = Eo.parent) == null ? void 0 : Jr.parent) == null ? void 0 : Xr.kind) === 257) { let bs = Jt(Xo.parent || Xo, he), { propertyName: dc } = Eo; ze(D.createImportDeclaration(void 0, D.createImportClause(!1, void 0, D.createNamedImports([D.createImportSpecifier(!1, dc && Re(dc) ? D.createIdentifier(vr(dc)) : void 0, D.createIdentifier(cr))])), D.createStringLiteral(bs), void 0), 0); break } L.failBadSyntaxKind(((Po = Eo.parent) == null ? void 0 : Po.parent) || Eo, "Unhandled binding element grandparent kind in declaration serialization"); break; case 300: ((Ui = (va = Eo.parent) == null ? void 0 : va.parent) == null ? void 0 : Ui.kind) === 223 && co(Gi(bt.escapedName), rl); break; case 257: if (br(Eo.initializer)) { let bs = Eo.initializer, dc = D.createUniqueName(cr), Tg = Jt(Xo.parent || Xo, he); ze(D.createImportEqualsDeclaration(void 0, !1, dc, D.createExternalModuleReference(D.createStringLiteral(Tg))), 0), ze(D.createImportEqualsDeclaration(void 0, !1, D.createIdentifier(cr), D.createQualifiedName(dc, bs.name)), oi); break } case 268: if (Xo.escapedName === "export=" && vt(Xo.declarations, bs => Li(bs) && Mf(bs))) { as(bt); break } let Wd = !(Xo.flags & 512) && !wi(Eo); ze(D.createImportEqualsDeclaration(void 0, !1, D.createIdentifier(cr), Wd ? qi(Xo, he, 67108863, !1) : D.createExternalModuleReference(D.createStringLiteral(Jt(Xo, he)))), Wd ? oi : 0); break; case 267: ze(D.createNamespaceExportDeclaration(vr(Eo.name)), 0); break; case 270: { let bs = Jt(Xo.parent || Xo, he), dc = Bn ? D.createStringLiteral(bs) : Eo.parent.moduleSpecifier; ze(D.createImportDeclaration(void 0, D.createImportClause(!1, D.createIdentifier(cr), void 0), dc, Eo.parent.assertClause), 0); break } case 271: { let bs = Jt(Xo.parent || Xo, he), dc = Bn ? D.createStringLiteral(bs) : Eo.parent.parent.moduleSpecifier; ze(D.createImportDeclaration(void 0, D.createImportClause(!1, void 0, D.createNamespaceImport(D.createIdentifier(cr))), dc, Eo.parent.parent.assertClause), 0); break } case 277: ze(D.createExportDeclaration(void 0, !1, D.createNamespaceExport(D.createIdentifier(cr)), D.createStringLiteral(Jt(Xo, he))), 0); break; case 273: { let bs = Jt(Xo.parent || Xo, he), dc = Bn ? D.createStringLiteral(bs) : Eo.parent.parent.parent.moduleSpecifier; ze(D.createImportDeclaration(void 0, D.createImportClause(!1, void 0, D.createNamedImports([D.createImportSpecifier(!1, cr !== Rc ? D.createIdentifier(Rc) : void 0, D.createIdentifier(cr))])), dc, Eo.parent.parent.parent.assertClause), 0); break } case 278: let Vl = Eo.parent.parent.moduleSpecifier; co(Gi(bt.escapedName), Vl ? Rc : rl, Vl && es(Vl) ? D.createStringLiteral(Vl.text) : void 0); break; case 274: as(bt); break; case 223: case 208: case 209: bt.escapedName === "default" || bt.escapedName === "export=" ? as(bt) : co(cr, rl); break; default: return L.failBadSyntaxKind(Eo, "Unhandled alias declaration kind in symbol serializer!") } } function co(bt, cr, oi) { ze(D.createExportDeclaration(void 0, !1, D.createNamedExports([D.createExportSpecifier(!1, bt !== cr ? cr : void 0, bt)]), oi), 0) } function as(bt) { if (bt.flags & 4194304) return !1; let cr = Gi(bt.escapedName), oi = cr === "export=", Xr = oi || cr === "default", Po = bt.declarations && Uu(bt), va = Po && L_(Po, !0); if (va && Fn(va.declarations) && vt(va.declarations, Ui => Gn(Ui) === Gn(_r))) { let Ui = Po && (pc(Po) || ar(Po) ? UH(Po) : xce(Po)), Eo = Ui && bc(Ui) ? _nt(Ui) : void 0, Xo = Eo && uc(Eo, 67108863, !0, !0, _r); (Xo || va) && ds(Xo || va); let Rc = he.tracker.disableTrackSymbol; if (he.tracker.disableTrackSymbol = !0, Xr) ua.push(D.createExportAssignment(void 0, oi, wa(va, he, 67108863))); else if (Eo === Ui && Eo) co(cr, vr(Eo)); else if (Ui && _u(Ui)) co(cr, sd(va, fc(va))); else { let rl = lA(cr, bt); ze(D.createImportEqualsDeclaration(void 0, !1, D.createIdentifier(rl), qi(va, he, 67108863, !1)), 0), co(cr, rl) } return he.tracker.disableTrackSymbol = Rc, !0 } else { let Ui = lA(cr, bt), Eo = Sd(zn(No(bt))); if (Ul(Eo, bt)) Ar(Eo, bt, Ui, Xr ? 0 : 1); else { let Xo = D.createVariableStatement(void 0, D.createVariableDeclarationList([D.createVariableDeclaration(Ui, void 0, Bi(he, Eo, bt, _r, ds, Bn))], 2)); ze(Xo, va && va.flags & 4 && va.escapedName === "export=" ? 2 : cr === Ui ? 1 : 0) } return Xr ? (ua.push(D.createExportAssignment(void 0, oi, D.createIdentifier(Ui))), !0) : cr !== Ui ? (co(cr, Ui), !0) : !1 } } function Ul(bt, cr) { let oi = Gn(he.enclosingDeclaration); return Ur(bt) & 48 && !Fn(tu(bt)) && !Ti(bt) && !!(Fn(Pr(Jo(bt), Aa)) || Fn(xa(bt, 0))) && !Fn(xa(bt, 1)) && !qn(cr, _r) && !(bt.symbol && vt(bt.symbol.declarations, Jr => Gn(Jr) !== oi)) && !vt(Jo(bt), Jr => qk(Jr.escapedName)) && !vt(Jo(bt), Jr => vt(Jr.declarations, Xr => Gn(Xr) !== oi)) && Ji(Jo(bt), Jr => i_(fc(Jr), R)) } function F_(bt, cr, oi) { return function (Xr, Po, va) { var Ui, Eo, Xo, Rc, rl; let Wd = Ef(Xr), Vl = !!(Wd & 8); if (Po && Xr.flags & 2887656) return []; if (Xr.flags & 4194304 || va && ja(va, Xr.escapedName) && M_(ja(va, Xr.escapedName)) === M_(Xr) && (Xr.flags & 16777216) === (ja(va, Xr.escapedName).flags & 16777216) && ph(zn(Xr), Vc(va, Xr.escapedName))) return []; let bs = Wd & -513 | (Po ? 32 : 0), dc = Hd(Xr, he), Tg = (Ui = Xr.declarations) == null ? void 0 : Ui.find(Kp(Na, rb, wi, $d, ar, br)); if (Xr.flags & 98304 && oi) { let wm = []; if (Xr.flags & 65536 && wm.push(it(D.createSetAccessorDeclaration(D.createModifiersFromModifierFlags(bs), dc, [D.createParameterDeclaration(void 0, void 0, "arg", void 0, Vl ? void 0 : Bi(he, zn(Xr), Xr, _r, ds, Bn))], void 0), ((Eo = Xr.declarations) == null ? void 0 : Eo.find(Ng)) || Tg)), Xr.flags & 32768) { let Rm = Wd & 8; wm.push(it(D.createGetAccessorDeclaration(D.createModifiersFromModifierFlags(bs), dc, [], Rm ? void 0 : Bi(he, zn(Xr), Xr, _r, ds, Bn), void 0), ((Xo = Xr.declarations) == null ? void 0 : Xo.find(zy)) || Tg)) } return wm } else if (Xr.flags & 98311) return it(bt(D.createModifiersFromModifierFlags((M_(Xr) ? 64 : 0) | bs), dc, Xr.flags & 16777216 ? D.createToken(57) : void 0, Vl ? void 0 : Bi(he, mC(Xr), Xr, _r, ds, Bn), void 0), ((Rc = Xr.declarations) == null ? void 0 : Rc.find(Kp(Na, wi))) || Tg); if (Xr.flags & 8208) { let wm = zn(Xr), Rm = xa(wm, 0); if (bs & 8) return it(bt(D.createModifiersFromModifierFlags((M_(Xr) ? 64 : 0) | bs), dc, Xr.flags & 16777216 ? D.createToken(57) : void 0, void 0, void 0), ((rl = Xr.declarations) == null ? void 0 : rl.find(Ds)) || Rm[0] && Rm[0].declaration || Xr.declarations && Xr.declarations[0]); let V1 = []; for (let Ry of Rm) { let tae = de(Ry, cr, he, { name: dc, questionToken: Xr.flags & 16777216 ? D.createToken(57) : void 0, modifiers: bs ? D.createModifiersFromModifierFlags(bs) : void 0 }), nae = Ry.declaration && nR(Ry.declaration.parent) ? Ry.declaration.parent : Ry.declaration; V1.push(it(tae, nae)) } return V1 } return L.fail(`Unhandled class member kind! ${Xr.__debugFlags || Xr.flags}`) } } function Dm(bt, cr) { return or(bt, !1, cr) } function $v(bt, cr, oi, Jr) { let Xr = xa(cr, bt); if (bt === 1) { if (!oi && Ji(Xr, Ui => Fn(Ui.parameters) === 0)) return []; if (oi) { let Ui = xa(oi, 1); if (!Fn(Ui) && Ji(Xr, Eo => Fn(Eo.parameters) === 0)) return []; if (Ui.length === Xr.length) { let Eo = !1; for (let Xo = 0; Xo < Ui.length; Xo++)if (!vM(Xr[Xo], Ui[Xo], !1, !1, !0, sD)) { Eo = !0; break } if (!Eo) return [] } } let va = 0; for (let Ui of Xr) Ui.declaration && (va |= hS(Ui.declaration, 24)); if (va) return [it(D.createConstructorDeclaration(D.createModifiersFromModifierFlags(va), [], void 0), Xr[0].declaration)] } let Po = []; for (let va of Xr) { let Ui = de(va, Jr, he); Po.push(it(Ui, va.declaration)) } return Po } function U1(bt, cr) { let oi = []; for (let Jr of tu(bt)) { if (cr) { let Xr = Cm(cr, Jr.keyType); if (Xr && ph(Jr.type, Xr.type)) continue } oi.push(J(Jr, he, void 0)) } return oi } function KC(bt, cr, oi) { let Jr = Hp(bt, 111551); if (Jr) return Jr; let Xr = lA(`${oi}_base`), Po = D.createVariableStatement(void 0, D.createVariableDeclarationList([D.createVariableDeclaration(Xr, void 0, u(cr, he))], 2)); return ze(Po, 0), D.createExpressionWithTypeArguments(D.createIdentifier(Xr), void 0) } function Hp(bt, cr) { let oi, Jr; if (bt.target && NE(bt.target.symbol, _r, cr) ? (oi = on(Ko(bt), Xr => u(Xr, he)), Jr = wa(bt.target.symbol, he, 788968)) : bt.symbol && NE(bt.symbol, _r, cr) && (Jr = wa(bt.symbol, he, 788968)), Jr) return D.createExpressionWithTypeArguments(Jr, oi) } function cA(bt) { let cr = Hp(bt, 788968); if (cr) return cr; if (bt.symbol) return D.createExpressionWithTypeArguments(wa(bt.symbol, he, 788968), void 0) } function lA(bt, cr) { var oi, Jr; let Xr = cr ? $a(cr) : void 0; if (Xr && he.remappedSymbolNames.has(Xr)) return he.remappedSymbolNames.get(Xr); cr && (bt = iT(cr, bt)); let Po = 0, va = bt; for (; (oi = he.usedSymbolNames) != null && oi.has(bt);)Po++, bt = `${va}_${Po}`; return (Jr = he.usedSymbolNames) == null || Jr.add(bt), Xr && he.remappedSymbolNames.set(Xr, bt), bt } function iT(bt, cr) { if (cr === "default" || cr === "__class" || cr === "__function") { let oi = he.flags; he.flags |= 16777216; let Jr = _y(bt, he); he.flags = oi, cr = Jr.length > 0 && Xw(Jr.charCodeAt(0)) ? u_(Jr) : Jr } return cr === "default" ? cr = "_default" : cr === "export=" && (cr = "_exports"), cr = i_(cr, R) && !fS(cr) ? cr : "_" + cr.replace(/[^a-zA-Z0-9]/g, "_"), cr } function sd(bt, cr) { let oi = $a(bt); return he.remappedSymbolNames.has(oi) ? he.remappedSymbolNames.get(oi) : (cr = iT(bt, cr), he.remappedSymbolNames.set(oi, cr), cr) }
+                    }
+                } function kl(n, a, c = 16384, u) { return u ? p(u).getText() : SI(p); function p(h) { let T = D.createTypePredicateNode(n.kind === 2 || n.kind === 3 ? D.createToken(129) : void 0, n.kind === 1 || n.kind === 3 ? D.createIdentifier(n.parameterName) : D.createThisTypeNode(), n.type && Be.typeToTypeNode(n.type, a, qr(c) | 70221824 | 512)), k = rE(), O = a && Gn(a); return k.writeNode(4, T, O, h), h } } function Ed(n) { let a = [], c = 0; for (let u = 0; u < n.length; u++) { let p = n[u]; if (c |= p.flags, !(p.flags & 98304)) { if (p.flags & 1568) { let h = p.flags & 512 ? Te : Kk(p); if (h.flags & 1048576) { let T = h.types.length; if (u + T <= n.length && Hu(n[u + T - 1]) === Hu(h.types[T - 1])) { a.push(h), u += T - 1; continue } } } a.push(p) } } return c & 65536 && a.push(ln), c & 32768 && a.push(Oe), a || n } function Ud(n) { return n === 8 ? "private" : n === 16 ? "protected" : "public" } function fy(n) { if (n.symbol && n.symbol.flags & 2048 && n.symbol.declarations) { let a = dR(n.symbol.declarations[0].parent); if (Ep(a)) return fr(a) } } function Td(n) { return n && n.parent && n.parent.kind === 265 && D0(n.parent.parent) } function Ov(n) { return n.kind === 308 || lu(n) } function Nv(n, a) { let c = Ai(n).nameType; if (c) { if (c.flags & 384) { let u = "" + c.value; return !i_(u, Do(Y)) && !Wm(u) ? `"${_S(u, 34)}"` : Wm(u) && na(u, "-") ? `[${u}]` : u } if (c.flags & 8192) return `[${_y(c.symbol, a)}]` } } function _y(n, a) { if (a && n.escapedName === "default" && !(a.flags & 16384) && (!(a.flags & 16777216) || !n.declarations || a.enclosingDeclaration && jn(n.declarations[0], Ov) !== jn(a.enclosingDeclaration, Ov))) return "default"; if (n.declarations && n.declarations.length) { let u = ks(n.declarations, h => sa(h) ? h : void 0), p = u && sa(u); if (u && p) { if (Pa(u) && sS(u)) return fc(n); if (ts(p) && !(ac(n) & 4096)) { let h = Ai(n).nameType; if (h && h.flags & 384) { let T = Nv(n, a); if (T !== void 0) return T } } return os(p) } if (u || (u = n.declarations[0]), u.parent && u.parent.kind === 257) return os(u.parent.name); switch (u.kind) { case 228: case 215: case 216: return a && !a.encounteredError && !(a.flags & 131072) && (a.encounteredError = !0), u.kind === 228 ? "(Anonymous class)" : "(Anonymous function)" } } let c = Nv(n, a); return c !== void 0 ? c : fc(n) } function Xf(n) { if (n) { let c = Rr(n); return c.isVisible === void 0 && (c.isVisible = !!a()), c.isVisible } return !1; function a() { switch (n.kind) { case 341: case 349: case 343: return !!(n.parent && n.parent.parent && n.parent.parent.parent && Li(n.parent.parent.parent)); case 205: return Xf(n.parent.parent); case 257: if (La(n.name) && !n.name.elements.length) return !1; case 264: case 260: case 261: case 262: case 259: case 263: case 268: if (D0(n)) return !0; let c = FE(n); return !(wg(n) & 1) && !(n.kind !== 268 && c.kind !== 308 && c.flags & 16777216) ? gm(c) : Xf(c); case 169: case 168: case 174: case 175: case 171: case 170: if (cd(n, 24)) return !1; case 173: case 177: case 176: case 178: case 166: case 265: case 181: case 182: case 184: case 180: case 185: case 186: case 189: case 190: case 193: case 199: return Xf(n.parent); case 270: case 271: case 273: return !1; case 165: case 308: case 267: return !0; case 274: return !1; default: return !1 } } } function ME(n, a) { let c; n.parent && n.parent.kind === 274 ? c = zs(n, n.escapedText, 2998271, void 0, n, !1) : n.parent.kind === 278 && (c = Kf(n.parent, 2998271)); let u, p; return c && (p = new Set, p.add($a(c)), h(c.declarations)), u; function h(T) { mn(T, k => { let O = x1(k) || k; if (a ? Rr(k).isVisible = !0 : (u = u || [], Of(u, O)), GA(k)) { let H = k.moduleReference, J = Yd(H), de = zs(k, J.escapedText, 901119, void 0, void 0, !1); de && p && _0(p, $a(de)) && h(de.declarations) } }) } } function cf(n, a) { let c = Sm(n, a); if (c >= 0) { let { length: u } = Wh; for (let p = c; p < u; p++)S_[p] = !1; return !1 } return Wh.push(n), S_.push(!0), hv.push(a), !0 } function Sm(n, a) { for (let c = Wh.length - 1; c >= 0; c--) { if (py(Wh[c], hv[c])) return -1; if (Wh[c] === n && hv[c] === a) return c } return -1 } function py(n, a) { switch (a) { case 0: return !!Ai(n).type; case 5: return !!Rr(n).resolvedEnumType; case 2: return !!Ai(n).declaredType; case 1: return !!n.resolvedBaseConstructorType; case 3: return !!n.resolvedReturnType; case 4: return !!n.immediateBaseConstraint; case 6: return !!n.resolvedTypeArguments; case 7: return !!n.baseTypesResolved; case 8: return !!Ai(n).writeType; case 9: return Rr(n).parameterInitializerContainsUndefined !== void 0 }return L.assertNever(a) } function If() { return Wh.pop(), hv.pop(), S_.pop() } function FE(n) { return jn(nm(n), a => { switch (a.kind) { case 257: case 258: case 273: case 272: case 271: case 270: return !1; default: return !0 } }).parent } function Pv(n) { let a = gs(ju(n)); return a.typeParameters ? _g(a, on(a.typeParameters, c => Se)) : a } function Vc(n, a) { let c = ja(n, a); return c ? zn(c) : void 0 } function KP(n, a) { var c; return Vc(n, a) || ((c = jx(n, a)) == null ? void 0 : c.type) || ue } function Zo(n) { return n && (n.flags & 1) !== 0 } function Ro(n) { return n === ve || !!(n.flags & 1 && n.aliasSymbol) } function Px(n, a) { if (a !== 0) return Oo(n, !1, a); let c = fr(n); return c && Ai(c).type || Oo(n, !1, a) } function Mx(n, a, c) { if (n = jc(n, O => !(O.flags & 98304)), n.flags & 131072) return Ki; if (n.flags & 1048576) return Ls(n, O => Mx(O, a, c)); let u = Gr(on(a, pg)), p = [], h = []; for (let O of Jo(n)) { let H = TC(O, 8576); !to(H, u) && !(Ef(O) & 24) && iB(O) ? p.push(O) : h.push(H) } if (Zb(n) || jv(u)) { if (h.length && (u = Gr([u, ...h])), u.flags & 131072) return n; let O = AKe(); return O ? Jx(O, [n, u]) : ve } let T = Ua(); for (let O of p) T.set(O.escapedName, Dne(O, !1)); let k = ls(c, T, Je, Je, tu(n)); return k.objectFlags |= 4194304, k } function V(n) { return !!(n.flags & 465829888) && Js(bu(n) || ue, 32768) } function me(n) { let a = yh(n, V) ? Ls(n, c => c.flags & 465829888 ? Ty(c) : c) : n; return wf(a, 524288) } function Ue(n, a) { let c = ut(n); return c ? Yv(c, a) : a } function ut(n) { let a = Lt(n); if (a && cR(a) && a.flowNode) { let c = dn(n); if (c) { let u = it(fm.createStringLiteral(c), n), p = Ju(a) ? a : fm.createParenthesizedExpression(a), h = it(fm.createElementAccessExpression(p, u), n); return go(u, h), go(h, n), p !== a && go(p, h), h.flowNode = a.flowNode, h } } } function Lt(n) { let a = n.parent.parent; switch (a.kind) { case 205: case 299: return ut(a); case 206: return ut(n.parent); case 257: return a.initializer; case 223: return a.right } } function dn(n) { let a = n.parent; return n.kind === 205 && a.kind === 203 ? Er(n.propertyName || n.name) : n.kind === 299 || n.kind === 300 ? Er(n.name) : "" + a.elements.indexOf(n) } function Er(n) { let a = pg(n); return a.flags & 384 ? "" + a.value : void 0 } function ii(n) { let a = n.dotDotDotToken ? 64 : 0, c = Px(n.parent.parent, a); return c && li(n, c) } function li(n, a) { if (Zo(a)) return a; let c = n.parent; U && n.flags & 16777216 && CT(n) ? a = yg(a) : U && c.parent.initializer && !(iu(V2e(c.parent.initializer)) & 65536) && (a = wf(a, 524288)); let u; if (c.kind === 203) if (n.dotDotDotToken) { if (a = O_(a), a.flags & 2 || !RM(a)) return Fe(n, _.Rest_types_may_only_be_created_from_object_types), ve; let p = []; for (let h of c.elements) h.dotDotDotToken || p.push(h.propertyName || h.name); u = Mx(a, p, n.symbol) } else { let p = n.propertyName || n.name, h = pg(p), T = od(a, h, 32, p); u = Ue(n, T) } else { let p = wy(65 | (n.dotDotDotToken ? 0 : 128), a, Oe, c), h = c.elements.indexOf(n); if (n.dotDotDotToken) { let T = Ty(a); u = Im(T, po) ? Ls(T, k => EC(k, h)) : nu(p) } else if (Kv(a)) { let T = op(h), k = 32 | (RC(n) ? 16 : 0), O = Ay(a, T, k, n.name) || ve; u = Ue(n, O) } else u = p } return n.initializer ? Cl(bA(n)) ? U && !(iu(ID(n, 0)) & 16777216) ? me(u) : u : vie(n, Gr([me(u), ID(n, 0)], 2)) : u } function di(n) { let a = Vy(n); if (a) return $r(a) } function ma(n) { let a = vs(n, !0); return a.kind === 104 || a.kind === 79 && Qf(a) === Le } function is(n) { let a = vs(n, !0); return a.kind === 206 && a.elements.length === 0 } function ao(n, a = !1, c = !0) { return U && c ? gg(n, a) : n } function Oo(n, a, c) { if (wi(n) && n.parent.parent.kind === 246) { let T = Gp(Wre(Yi(n.parent.parent.expression, c))); return T.flags & 4456448 ? AAe(T) : ae } if (wi(n) && n.parent.parent.kind === 247) { let T = n.parent.parent; return e8(T) || Se } if (La(n.parent)) return ii(n); let u = Na(n) && !rm(n) || $d(n) || $ue(n), p = a && WW(n), h = ad(n); if (cH(n)) return h ? Zo(h) || h === ue ? h : ve : Ve ? ue : Se; if (h) return ao(h, u, p); if ((ge || Yn(n)) && wi(n) && !La(n.name) && !(wg(n) & 1) && !(n.flags & 16777216)) { if (!(G_(n) & 2) && (!n.initializer || ma(n.initializer))) return at; if (n.initializer && is(n.initializer)) return bn } if (ha(n)) { let T = n.parent; if (T.kind === 175 && Ux(T)) { let H = nc(fr(n.parent), 174); if (H) { let J = ip(H), de = Qie(T); return de && n === de ? (L.assert(!de.type), zn(J.thisParameter)) : qo(J) } } let k = QJe(T, n); if (k) return k; let O = n.symbol.escapedName === "this" ? oCe(T) : sCe(n); if (O) return ao(O, !1, p) } if (mT(n) && n.initializer) { if (Yn(n) && !ha(n)) { let k = fC(n, fr(n), $w(n)); if (k) return k } let T = vie(n, ID(n, c)); return ao(T, u, p) } if (Na(n) && (ge || Yn(n))) if (zc(n)) { let T = Pr(n.parent.members, oc), k = T.length ? Yf(n.symbol, T) : uu(n) & 2 ? yB(n.symbol) : void 0; return k && ao(k, !0, p) } else { let T = wv(n.parent), k = T ? my(n.symbol, T) : uu(n) & 2 ? yB(n.symbol) : void 0; return k && ao(k, !0, p) } if (Sp(n)) return pe; if (La(n.name)) return oo(n.name, !1, !0) } function id(n) { if (n.valueDeclaration && ar(n.valueDeclaration)) { let a = Ai(n); return a.isConstructorDeclaredProperty === void 0 && (a.isConstructorDeclaredProperty = !1, a.isConstructorDeclaredProperty = !!Op(n) && Ji(n.declarations, c => ar(c) && GB(c) && (c.left.kind !== 209 || yf(c.left.argumentExpression)) && !k_(void 0, c, n, c))), a.isConstructorDeclaredProperty } return !1 } function np(n) { let a = n.valueDeclaration; return a && Na(a) && !Cl(a) && !a.initializer && (ge || Yn(a)) } function Op(n) { if (n.declarations) for (let a of n.declarations) { let c = Ku(a, !1, !1); if (c && (c.kind === 173 || cp(c))) return c } } function cg(n) { let a = Gn(n.declarations[0]), c = Gi(n.escapedName), u = n.declarations.every(h => Yn(h) && Us(h) && Bm(h.expression)), p = u ? D.createPropertyAccessExpression(D.createPropertyAccessExpression(D.createIdentifier("module"), D.createIdentifier("exports")), c) : D.createPropertyAccessExpression(D.createIdentifier("exports"), c); return u && go(p.expression.expression, p.expression), go(p.expression, p), go(p, a), p.flowNode = a.endFlowNode, Yv(p, at, Oe) } function Yf(n, a) { let c = na(n.escapedName, "__#") ? D.createPrivateIdentifier(n.escapedName.split("@")[1]) : Gi(n.escapedName); for (let u of a) { let p = D.createPropertyAccessExpression(D.createThis(), c); go(p.expression, p), go(p, u), p.flowNode = u.returnFlowNode; let h = Fx(p, n); if (ge && (h === at || h === bn) && Fe(n.valueDeclaration, _.Member_0_implicitly_has_an_1_type, E(n), Ee(h)), !Im(h, zB)) return PD(h) } } function my(n, a) { let c = na(n.escapedName, "__#") ? D.createPrivateIdentifier(n.escapedName.split("@")[1]) : Gi(n.escapedName), u = D.createPropertyAccessExpression(D.createThis(), c); go(u.expression, u), go(u, a), u.flowNode = a.returnFlowNode; let p = Fx(u, n); return ge && (p === at || p === bn) && Fe(n.valueDeclaration, _.Member_0_implicitly_has_an_1_type, E(n), Ee(p)), Im(p, zB) ? void 0 : PD(p) } function Fx(n, a) { let c = a?.valueDeclaration && (!np(a) || uu(a.valueDeclaration) & 2) && yB(a) || Oe; return Yv(n, at, c) } function GE(n, a) { let c = oS(n.valueDeclaration); if (c) { let k = Yn(c) ? x0(c) : void 0; return k && k.typeExpression ? $r(k.typeExpression) : n.valueDeclaration && fC(n.valueDeclaration, n, c) || i0(Ic(c)) } let u, p = !1, h = !1; if (id(n) && (u = my(n, Op(n))), !u) { let k; if (n.declarations) { let O; for (let H of n.declarations) { let J = ar(H) || Pa(H) ? H : Us(H) ? ar(H.parent) ? H.parent : H : void 0; if (!J) continue; let de = Us(J) ? tR(J) : ic(J); (de === 4 || ar(J) && GB(J, de)) && (lf(J) ? p = !0 : h = !0), Pa(J) || (O = k_(O, J, n, H)), O || (k || (k = [])).push(ar(J) || Pa(J) ? Mv(n, a, J, de) : lt) } u = O } if (!u) { if (!Fn(k)) return ve; let O = p && n.declarations ? Gx(k, n.declarations) : void 0; if (h) { let J = yB(n); J && ((O || (O = [])).push(J), p = !0) } let H = vt(O, J => !!(J.flags & -98305)) ? O : k; u = Gr(H) } } let T = Sd(ao(u, !1, h && !p)); return n.valueDeclaration && jc(T, k => !!(k.flags & -98305)) === lt ? (qv(n.valueDeclaration, Se), Se) : T } function fC(n, a, c) { var u, p; if (!Yn(n) || !c || !rs(c) || c.properties.length) return; let h = Ua(); for (; ar(n) || br(n);) { let O = vd(n); (u = O?.exports) != null && u.size && ll(h, O.exports), n = ar(n) ? n.parent : n.parent.parent } let T = vd(n); (p = T?.exports) != null && p.size && ll(h, T.exports); let k = ls(a, h, Je, Je, Je); return k.objectFlags |= 4096, k } function k_(n, a, c, u) { var p; let h = Cl(a.parent); if (h) { let T = Sd($r(h)); if (n) !Ro(n) && !Ro(T) && !ph(n, T) && cLe(void 0, n, u, T); else return T } if ((p = c.parent) != null && p.valueDeclaration) { let T = Cl(c.parent.valueDeclaration); if (T) { let k = ja($r(T), c.escapedName); if (k) return Gv(k) } } return n } function Mv(n, a, c, u) { if (Pa(c)) { if (a) return zn(a); let T = Ic(c.arguments[2]), k = Vc(T, "value"); if (k) return k; let O = Vc(T, "get"); if (O) { let J = F1(O); if (J) return qo(J) } let H = Vc(T, "set"); if (H) { let J = F1(H); if (J) return uie(J) } return Se } if (_C(c.left, c.right)) return Se; let p = u === 1 && (br(c.left) || Vs(c.left)) && (Bm(c.left.expression) || Re(c.left.expression) && TT(c.left.expression)), h = a ? zn(a) : p ? Hu(Ic(c.right)) : i0(Ic(c.right)); if (h.flags & 524288 && u === 2 && n.escapedName === "export=") { let T = R_(h), k = Ua(); Mw(T.members, k); let O = k.size; a && !a.exports && (a.exports = Ua()), (a || n).exports.forEach((J, de) => { var Ae; let xe = k.get(de); if (xe && xe !== J && !(J.flags & 2097152)) if (J.flags & 111551 && xe.flags & 111551) { if (J.valueDeclaration && xe.valueDeclaration && Gn(J.valueDeclaration) !== Gn(xe.valueDeclaration)) { let It = Gi(J.escapedName), Tn = ((Ae = zr(xe.valueDeclaration, zl)) == null ? void 0 : Ae.name) || xe.valueDeclaration; Ao(Fe(J.valueDeclaration, _.Duplicate_identifier_0, It), hr(Tn, _._0_was_also_declared_here, It)), Ao(Fe(Tn, _.Duplicate_identifier_0, It), hr(J.valueDeclaration, _._0_was_also_declared_here, It)) } let tt = wo(J.flags | xe.flags, de); tt.links.type = Gr([zn(J), zn(xe)]), tt.valueDeclaration = xe.valueDeclaration, tt.declarations = Qi(xe.declarations, J.declarations), k.set(de, tt) } else k.set(de, C_(J, xe)); else k.set(de, J) }); let H = ls(O !== k.size ? void 0 : T.symbol, k, T.callSignatures, T.constructSignatures, T.indexInfos); if (O === k.size && (h.aliasSymbol && (H.aliasSymbol = h.aliasSymbol, H.aliasTypeArguments = h.aliasTypeArguments), Ur(h) & 4)) { H.aliasSymbol = h.symbol; let J = Ko(h); H.aliasTypeArguments = Fn(J) ? J : void 0 } return H.objectFlags |= Ur(h) & 4096, H.symbol && H.symbol.flags & 32 && h === vu(H.symbol) && (H.objectFlags |= 16777216), H } return bB(h) ? (qv(c, Et), Et) : h } function _C(n, a) { return br(n) && n.expression.kind === 108 && kO(a, c => El(n, c)) } function lf(n) { let a = Ku(n, !1, !1); return a.kind === 173 || a.kind === 259 || a.kind === 215 && !nR(a.parent) } function Gx(n, a) { return L.assert(n.length === a.length), n.filter((c, u) => { let p = a[u], h = ar(p) ? p : ar(p.parent) ? p.parent : void 0; return h && lf(h) }) } function hy(n, a, c) { if (n.initializer) { let u = La(n.name) ? oo(n.name, !0, !1) : ue; return ao(vie(n, ID(n, 0, u))) } return La(n.name) ? oo(n.name, a, c) : (c && !Wk(n) && qv(n, Se), a ? ce : Se) } function jk(n, a, c) { let u = Ua(), p, h = 131200; mn(n.elements, k => { let O = k.propertyName || k.name; if (k.dotDotDotToken) { p = Fp(ae, Se, !1); return } let H = pg(O); if (!fh(H)) { h |= 512; return } let J = Np(H), de = 4 | (k.initializer ? 16777216 : 0), Ae = wo(de, J); Ae.links.type = hy(k, a, c), Ae.links.bindingElement = k, u.set(Ae.escapedName, Ae) }); let T = ls(void 0, u, Je, Je, p ? [p] : Je); return T.objectFlags |= h, a && (T.pattern = n, T.objectFlags |= 131072), T } function Hk(n, a, c) { let u = n.elements, p = Os(u), h = p && p.kind === 205 && p.dotDotDotToken ? p : void 0; if (u.length === 0 || u.length === 1 && h) return R >= 2 ? cAe(Se) : Et; let T = on(u, J => ol(J) ? Se : hy(J, a, c)), k = s8(u, J => !(J === h || ol(J) || RC(J)), u.length - 1) + 1, O = on(u, (J, de) => J === h ? 4 : de >= k ? 2 : 1), H = ap(T, O); return a && (H = Wxe(H), H.pattern = n, H.objectFlags |= 131072), H } function oo(n, a = !1, c = !1) { return n.kind === 203 ? jk(n, a, c) : Hk(n, a, c) } function Zs(n, a) { return gy(Oo(n, !0, 0), n, a) } function Fv(n) { let a = vd(n), c = pKe(!1); return c && a && a === c } function gy(n, a, c) { return n ? (n.flags & 4096 && Fv(a.parent) && (n = wne(a)), c && CB(a, n), n.flags & 8192 && (Wo(a) || !a.type) && n.symbol !== fr(a) && (n = j), Sd(n)) : (n = ha(a) && a.dotDotDotToken ? Et : Se, c && (Wk(a) || qv(a, n)), n) } function Wk(n) { let a = nm(n), c = a.kind === 166 ? a.parent : a; return qM(c) } function ad(n) { let a = Cl(n); if (a) return $r(a) } function zk(n) { let a = n.valueDeclaration; return a ? (Wo(a) && (a = bA(a)), ha(a) ? fB(a.parent) : !1) : !1 } function y(n) { let a = Ai(n); if (!a.type) { let c = I(n); return !a.type && !zk(n) && (a.type = c), c } return a.type } function I(n) { if (n.flags & 4194304) return Pv(n); if (n === ct) return Se; if (n.flags & 134217728 && n.valueDeclaration) { let u = fr(Gn(n.valueDeclaration)), p = wo(u.flags, "exports"); p.declarations = u.declarations ? u.declarations.slice() : [], p.parent = n, p.links.target = u, u.valueDeclaration && (p.valueDeclaration = u.valueDeclaration), u.members && (p.members = new Map(u.members)), u.exports && (p.exports = new Map(u.exports)); let h = Ua(); return h.set("exports", p), ls(n, h, Je, Je, Je) } L.assertIsDefined(n.valueDeclaration); let a = n.valueDeclaration; if (Li(a) && Mf(a)) return a.statements.length ? Sd(i0(Yi(a.statements[0].expression))) : Ki; if (rb(a)) return Tr(n); if (!cf(n, 0)) return n.flags & 512 && !(n.flags & 67108864) ? Vd(n) : pC(n); let c; if (a.kind === 274) c = gy(ad(a) || Ic(a.expression), a); else if (ar(a) || Yn(a) && (Pa(a) || (br(a) || H6(a)) && ar(a.parent))) c = GE(n); else if (br(a) || Vs(a) || Re(a) || es(a) || Vf(a) || sl(a) || Jc(a) || Nc(a) && !s_(a) || zm(a) || Li(a)) { if (n.flags & 9136) return Vd(n); c = ar(a.parent) ? GE(n) : ad(a) || Se } else if (yl(a)) c = ad(a) || NIe(a); else if (Sp(a)) c = ad(a) || bCe(a); else if (xf(a)) c = ad(a) || BC(a.name, 0); else if (s_(a)) c = ad(a) || PIe(a, 0); else if (ha(a) || Na(a) || $d(a) || wi(a) || Wo(a) || a6(a)) c = Zs(a, !0); else if (hb(a)) c = Vd(n); else if (q0(a)) c = ug(n); else return L.fail("Unhandled declaration kind! " + L.formatSyntaxKind(a.kind) + " for " + L.formatSymbol(n)); return If() ? c : n.flags & 512 && !(n.flags & 67108864) ? Vd(n) : pC(n) } function N(n) { if (n) switch (n.kind) { case 174: return U_(n); case 175: return Fce(n); case 169: return L.assert(rm(n)), Cl(n) } } function te(n) { let a = N(n); return a && $r(a) } function Me(n) { let a = Qie(n); return a && a.symbol } function Pt(n) { return Yb(ip(n)) } function Tr(n) { let a = Ai(n); if (!a.type) { if (!cf(n, 0)) return ve; let c = nc(n, 174), u = nc(n, 175), p = zr(nc(n, 169), Id), h = c && Yn(c) && di(c) || te(c) || te(u) || te(p) || c && c.body && rU(c) || p && p.initializer && Zs(p, !0); h || (u && !qM(u) ? Ip(ge, u, _.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation, E(n)) : c && !qM(c) ? Ip(ge, c, _.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation, E(n)) : p && !qM(p) && Ip(ge, p, _.Member_0_implicitly_has_an_1_type, E(n), "any"), h = Se), If() || (N(c) ? Fe(c, _._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, E(n)) : N(u) || N(p) ? Fe(u, _._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, E(n)) : c && ge && Fe(c, _._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, E(n)), h = Se), a.type = h } return a.type } function Fi(n) { var a; let c = Ai(n); if (!c.writeType) { if (!cf(n, 8)) return ve; let u = (a = nc(n, 175)) != null ? a : zr(nc(n, 169), Id), p = te(u); If() || (N(u) && Fe(u, _._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, E(n)), p = Se), c.writeType = p || Tr(n) } return c.writeType } function Da(n) { let a = Wr(vu(n)); return a.flags & 8650752 ? a : a.flags & 2097152 ? wr(a.types, c => !!(c.flags & 8650752)) : void 0 } function Vd(n) { let a = Ai(n), c = a; if (!a.type) { let u = n.valueDeclaration && eU(n.valueDeclaration, !1); if (u) { let p = oie(n, u); p && (n = p, a = p.links) } c.type = a.type = lg(n) } return a.type } function lg(n) { let a = n.valueDeclaration; if (n.flags & 1536 && CI(n)) return Se; if (a && (a.kind === 223 || Us(a) && a.parent.kind === 223)) return GE(n); if (n.flags & 512 && a && Li(a) && a.commonJsModuleIndicator) { let u = Vu(n); if (u !== n) { if (!cf(n, 0)) return ve; let p = No(n.exports.get("export=")), h = GE(p, p === u ? void 0 : u); return If() ? h : pC(n) } } let c = Bd(16, n); if (n.flags & 32) { let u = Da(n); return u ? so([c, u]) : c } else return U && n.flags & 16777216 ? gg(c) : c } function ug(n) { let a = Ai(n); return a.type || (a.type = _xe(n)) } function dg(n) { let a = Ai(n); if (!a.type) { let c = wc(n), u = n.declarations && L_(Uu(n), !0), p = ks(u?.declarations, h => pc(h) ? ad(h) : void 0); a.type = u?.declarations && yU(u.declarations) && n.declarations.length ? cg(u) : yU(n.declarations) ? at : p || (Fl(c) & 111551 ? zn(c) : ve) } return a.type } function wte(n) { let a = Ai(n); return a.type || (a.type = Oi(zn(a.target), a.mapper)) } function Rte(n) { let a = Ai(n); return a.writeType || (a.writeType = Oi(mC(a.target), a.mapper)) } function pC(n) { let a = n.valueDeclaration; return Cl(a) ? (Fe(n.valueDeclaration, _._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, E(n)), ve) : (ge && (a.kind !== 166 || a.initializer) && Fe(n.valueDeclaration, _._0_implicitly_has_type_any_because_it_does_not_have_a_type_annotation_and_is_referenced_directly_or_indirectly_in_its_own_initializer, E(n)), Se) } function Jk(n) { let a = Ai(n); return a.type || (L.assertIsDefined(a.deferralParent), L.assertIsDefined(a.deferralConstituents), a.type = a.deferralParent.flags & 1048576 ? Gr(a.deferralConstituents) : so(a.deferralConstituents)), a.type } function Ote(n) { let a = Ai(n); return !a.writeType && a.deferralWriteConstituents && (L.assertIsDefined(a.deferralParent), L.assertIsDefined(a.deferralConstituents), a.writeType = a.deferralParent.flags & 1048576 ? Gr(a.deferralWriteConstituents) : so(a.deferralWriteConstituents)), a.writeType } function mC(n) { let a = ac(n); return n.flags & 4 ? a & 2 ? a & 65536 ? Ote(n) || Jk(n) : n.links.writeType || n.links.type : zn(n) : n.flags & 98304 ? a & 1 ? Rte(n) : Fi(n) : zn(n) } function zn(n) { let a = ac(n); return a & 65536 ? Jk(n) : a & 1 ? wte(n) : a & 262144 ? NJe(n) : a & 8192 ? JXe(n) : n.flags & 7 ? y(n) : n.flags & 9136 ? Vd(n) : n.flags & 8 ? ug(n) : n.flags & 98304 ? Tr(n) : n.flags & 2097152 ? dg(n) : ve } function Gv(n) { return KE(zn(n), !!(n.flags & 16777216)) } function Bv(n, a) { return n !== void 0 && a !== void 0 && (Ur(n) & 4) !== 0 && n.target === a } function Bx(n) { return Ur(n) & 4 ? n.target : n } function BE(n, a) { return c(n); function c(u) { if (Ur(u) & 7) { let p = Bx(u); return p === a || vt(_o(p), c) } else if (u.flags & 2097152) return vt(u.types, c); return !1 } } function qP(n, a) { for (let c of a) n = xg(n, UE(fr(c))); return n } function hC(n, a) { for (; ;) { if (n = n.parent, n && ar(n)) { let c = ic(n); if (c === 6 || c === 3) { let u = fr(n.left); u && u.parent && !jn(u.parent.valueDeclaration, p => n === p) && (n = u.parent.valueDeclaration) } } if (!n) return; switch (n.kind) { case 260: case 228: case 261: case 176: case 177: case 170: case 181: case 182: case 320: case 259: case 171: case 215: case 216: case 262: case 348: case 349: case 343: case 341: case 197: case 191: { let u = hC(n, a); if (n.kind === 197) return Sn(u, UE(fr(n.typeParameter))); if (n.kind === 191) return Qi(u, PAe(n)); let p = qP(u, jy(n)), h = a && (n.kind === 260 || n.kind === 228 || n.kind === 261 || cp(n)) && vu(fr(n)).thisType; return h ? Sn(p, h) : p } case 344: let c = uR(n); c && (n = c.valueDeclaration); break; case 323: { let u = hC(n, a); return n.tags ? qP(u, Uo(n.tags, p => H_(p) ? p.typeParameters : void 0)) : u } } } } function WG(n) { var a; let c = n.flags & 32 || n.flags & 16 ? n.valueDeclaration : (a = n.declarations) == null ? void 0 : a.find(u => { if (u.kind === 261) return !0; if (u.kind !== 257) return !1; let p = u.initializer; return !!p && (p.kind === 215 || p.kind === 216) }); return L.assert(!!c, "Class was missing valueDeclaration -OR- non-class had no interface declarations"), hC(c) } function yy(n) { if (!n.declarations) return; let a; for (let c of n.declarations) (c.kind === 261 || c.kind === 260 || c.kind === 228 || cp(c) || sR(c)) && (a = qP(a, jy(c))); return a } function D1(n) { return Qi(WG(n), yy(n)) } function XP(n) { let a = xa(n, 1); if (a.length === 1) { let c = a[0]; if (!c.typeParameters && c.parameters.length === 1 && Xl(c)) { let u = UM(c.parameters[0]); return Zo(u) || Xne(u) === Se } } return !1 } function Uv(n) { if (xa(n, 1).length > 0) return !0; if (n.flags & 8650752) { let a = bu(n); return !!a && XP(a) } return !1 } function yn(n) { let a = Nh(n.symbol); return a && hp(a) } function Or(n, a, c) { let u = Fn(a), p = Yn(c); return Pr(xa(n, 1), h => (p || u >= Mp(h.typeParameters)) && u <= Fn(h.typeParameters)) } function xr(n, a, c) { let u = Or(n, a, c), p = on(a, $r); return Tl(u, h => vt(h.typeParameters) ? eD(h, p, Yn(c)) : h) } function Wr(n) { if (!n.resolvedBaseConstructorType) { let a = Nh(n.symbol), c = a && hp(a), u = yn(n); if (!u) return n.resolvedBaseConstructorType = Oe; if (!cf(n, 1)) return ve; let p = Yi(u.expression); if (c && u !== c && (L.assert(!c.typeArguments), Yi(c.expression)), p.flags & 2621440 && R_(p), !If()) return Fe(n.symbol.valueDeclaration, _._0_is_referenced_directly_or_indirectly_in_its_own_base_expression, E(n.symbol)), n.resolvedBaseConstructorType = ve; if (!(p.flags & 1) && p !== ir && !Uv(p)) { let h = Fe(u.expression, _.Type_0_is_not_a_constructor_function_type, Ee(p)); if (p.flags & 262144) { let T = bC(p), k = ue; if (T) { let O = xa(T, 1); O[0] && (k = qo(O[0])) } p.symbol.declarations && Ao(h, hr(p.symbol.declarations[0], _.Did_you_mean_for_0_to_be_constrained_to_type_new_args_Colon_any_1, E(p.symbol), Ee(k))) } return n.resolvedBaseConstructorType = ve } n.resolvedBaseConstructorType = p } return n.resolvedBaseConstructorType } function Ci(n) { let a = Je; if (n.symbol.declarations) for (let c of n.symbol.declarations) { let u = JA(c); if (u) for (let p of u) { let h = $r(p); Ro(h) || (a === Je ? a = [h] : a.push(h)) } } return a } function eo(n, a) { Fe(n, _.Type_0_recursively_references_itself_as_a_base_type, Ee(a, void 0, 2)) } function _o(n) { if (!n.baseTypesResolved) { if (cf(n, 7) && (n.objectFlags & 8 ? n.resolvedBaseTypes = [jd(n)] : n.symbol.flags & 96 ? (n.symbol.flags & 32 && D_(n), n.symbol.flags & 64 && dh(n)) : L.fail("type must be class or interface"), !If() && n.symbol.declarations)) for (let a of n.symbol.declarations) (a.kind === 260 || a.kind === 261) && eo(a, n); n.baseTypesResolved = !0 } return n.resolvedBaseTypes } function jd(n) { let a = Tl(n.typeParameters, (c, u) => n.elementFlags[u] & 8 ? od(c, rt) : c); return nu(Gr(a || Je), n.readonly) } function D_(n) { n.resolvedBaseTypes = S4; let a = Eu(Wr(n)); if (!(a.flags & 2621441)) return n.resolvedBaseTypes = Je; let c = yn(n), u, p = a.symbol ? gs(a.symbol) : void 0; if (a.symbol && a.symbol.flags & 32 && uh(p)) u = zxe(c, a.symbol); else if (a.flags & 1) u = a; else { let T = xr(a, c.typeArguments, c); if (!T.length) return Fe(c.expression, _.No_base_constructor_has_the_specified_number_of_type_arguments), n.resolvedBaseTypes = Je; u = qo(T[0]) } if (Ro(u)) return n.resolvedBaseTypes = Je; let h = O_(u); if (!xm(h)) { let T = Xte(void 0, u), k = da(T, _.Base_constructor_return_type_0_is_not_an_object_type_or_intersection_of_object_types_with_statically_known_members, Ee(h)); return Lo.add(Lh(Gn(c.expression), c.expression, k)), n.resolvedBaseTypes = Je } return n === h || BE(h, n) ? (Fe(n.symbol.valueDeclaration, _.Type_0_recursively_references_itself_as_a_base_type, Ee(n, void 0, 2)), n.resolvedBaseTypes = Je) : (n.resolvedBaseTypes === S4 && (n.members = void 0), n.resolvedBaseTypes = [h]) } function uh(n) { let a = n.outerTypeParameters; if (a) { let c = a.length - 1, u = Ko(n); return a[c].symbol !== u[c].symbol } return !0 } function xm(n) { if (n.flags & 262144) { let a = bu(n); if (a) return xm(a) } return !!(n.flags & 67633153 && !df(n) || n.flags & 2097152 && Ji(n.types, xm)) } function dh(n) { if (n.resolvedBaseTypes = n.resolvedBaseTypes || Je, n.symbol.declarations) { for (let a of n.symbol.declarations) if (a.kind === 261 && PI(a)) for (let c of PI(a)) { let u = O_($r(c)); Ro(u) || (xm(u) ? n !== u && !BE(u, n) ? n.resolvedBaseTypes === Je ? n.resolvedBaseTypes = [u] : n.resolvedBaseTypes.push(u) : eo(a, n) : Fe(c, _.An_interface_can_only_extend_an_object_type_or_intersection_of_object_types_with_statically_known_members)) } } } function gC(n) { if (!n.declarations) return !0; for (let a of n.declarations) if (a.kind === 261) { if (a.flags & 128) return !1; let c = PI(a); if (c) { for (let u of c) if (bc(u.expression)) { let p = uc(u.expression, 788968, !0); if (!p || !(p.flags & 64) || vu(p).thisType) return !1 } } } return !0 } function vu(n) { let a = Ai(n), c = a; if (!a.declaredType) { let u = n.flags & 32 ? 1 : 2, p = oie(n, n.valueDeclaration && jQe(n.valueDeclaration)); p && (n = p, a = p.links); let h = c.declaredType = a.declaredType = Bd(u, n), T = WG(n), k = yy(n); (T || k || u === 1 || !gC(n)) && (h.objectFlags |= 4, h.typeParameters = Qi(T, k), h.outerTypeParameters = T, h.localTypeParameters = k, h.instantiations = new Map, h.instantiations.set(kf(h.typeParameters), h), h.target = h, h.resolvedTypeArguments = h.typeParameters, h.thisType = rd(n), h.thisType.isThisType = !0, h.thisType.constraint = h) } return a.declaredType } function Kb(n) { var a; let c = Ai(n); if (!c.declaredType) { if (!cf(n, 2)) return ve; let u = L.checkDefined((a = n.declarations) == null ? void 0 : a.find(sR), "Type alias symbol with no valid declaration found"), p = Ff(u) ? u.typeExpression : u.type, h = p ? $r(p) : ve; if (If()) { let T = yy(n); T && (c.typeParameters = T, c.instantiations = new Map, c.instantiations.set(kf(T), h)) } else h = ve, u.kind === 343 ? Fe(u.typeExpression.type, _.Type_alias_0_circularly_references_itself, E(n)) : Fe(zl(u) && u.name || u, _.Type_alias_0_circularly_references_itself, E(n)); c.declaredType = h } return c.declaredType } function Kk(n) { return n.flags & 1056 && n.symbol.flags & 8 ? gs(ju(n.symbol)) : n } function dxe(n) { let a = Ai(n); if (!a.declaredType) { let c = []; if (n.declarations) { for (let p of n.declarations) if (p.kind === 263) { for (let h of p.members) if (Ux(h)) { let T = fr(h), k = xU(h), O = Yx(k !== void 0 ? Iqe(k, $a(n), T) : fxe(T)); Ai(T).declaredType = O, c.push(Hu(O)) } } } let u = c.length ? Gr(c, 1, n, void 0) : fxe(n); u.flags & 1048576 && (u.flags |= 1024, u.symbol = n), a.declaredType = u } return a.declaredType } function fxe(n) { let a = Rp(32, n), c = Rp(32, n); return a.regularType = a, a.freshType = c, c.regularType = a, c.freshType = c, a } function _xe(n) { let a = Ai(n); if (!a.declaredType) { let c = dxe(ju(n)); a.declaredType || (a.declaredType = c) } return a.declaredType } function UE(n) { let a = Ai(n); return a.declaredType || (a.declaredType = rd(n)) } function fJe(n) { let a = Ai(n); return a.declaredType || (a.declaredType = gs(wc(n))) } function gs(n) { return pxe(n) || ve } function pxe(n) { if (n.flags & 96) return vu(n); if (n.flags & 524288) return Kb(n); if (n.flags & 262144) return UE(n); if (n.flags & 384) return dxe(n); if (n.flags & 8) return _xe(n); if (n.flags & 2097152) return fJe(n) } function YP(n) { switch (n.kind) { case 131: case 157: case 152: case 148: case 160: case 134: case 153: case 149: case 114: case 155: case 144: case 198: return !0; case 185: return YP(n.elementType); case 180: return !n.typeArguments || n.typeArguments.every(YP) }return !1 } function _Je(n) { let a = EA(n); return !a || YP(a) } function mxe(n) { let a = Cl(n); return a ? YP(a) : !Jy(n) } function pJe(n) { let a = U_(n), c = jy(n); return (n.kind === 173 || !!a && YP(a)) && n.parameters.every(mxe) && c.every(_Je) } function mJe(n) { if (n.declarations && n.declarations.length === 1) { let a = n.declarations[0]; if (a) switch (a.kind) { case 169: case 168: return mxe(a); case 171: case 170: case 173: case 174: case 175: return pJe(a) } } return !1 } function hxe(n, a, c) { let u = Ua(); for (let p of n) u.set(p.escapedName, c && mJe(p) ? p : One(p, a)); return u } function gxe(n, a) { for (let c of a) !n.has(c.escapedName) && !yxe(c) && n.set(c.escapedName, c) } function yxe(n) { return !!n.valueDeclaration && xu(n.valueDeclaration) && Ca(n.valueDeclaration) } function Nte(n) { if (!n.declaredProperties) { let a = n.symbol, c = vy(a); n.declaredProperties = uy(c), n.declaredCallSignatures = Je, n.declaredConstructSignatures = Je, n.declaredIndexInfos = Je, n.declaredCallSignatures = Xb(c.get("__call")), n.declaredConstructSignatures = Xb(c.get("__new")), n.declaredIndexInfos = Vxe(a) } return n } function fh(n) { return !!(n.flags & 8576) } function Pte(n) { if (!ts(n) && !Vs(n)) return !1; let a = ts(n) ? n.expression : n.argumentExpression; return bc(a) && fh(ts(n) ? vg(n) : Ic(a)) } function qk(n) { return n.charCodeAt(0) === 95 && n.charCodeAt(1) === 95 && n.charCodeAt(2) === 64 } function $P(n) { let a = sa(n); return !!a && Pte(a) } function Ux(n) { return !Xy(n) || $P(n) } function hJe(n) { return Y6(n) && !Pte(n) } function Np(n) { return n.flags & 8192 ? n.escapedName : n.flags & 384 ? Bs("" + n.value) : L.fail() } function gJe(n, a, c) { L.assert(!!(ac(n) & 4096), "Expected a late-bound symbol."), n.flags |= c, Ai(a.symbol).lateSymbol = n, n.declarations ? a.symbol.isReplaceableByMethod || n.declarations.push(a) : n.declarations = [a], c & 111551 && (!n.valueDeclaration || n.valueDeclaration.kind !== a.kind) && (n.valueDeclaration = a) } function vxe(n, a, c, u) { L.assert(!!u.symbol, "The member is expected to have a symbol."); let p = Rr(u); if (!p.resolvedSymbol) { p.resolvedSymbol = u.symbol; let h = ar(u) ? u.left : u.name, T = Vs(h) ? Ic(h.argumentExpression) : vg(h); if (fh(T)) { let k = Np(T), O = u.symbol.flags, H = c.get(k); H || c.set(k, H = wo(0, k, 4096)); let J = a && a.get(k); if (H.flags & Kc(O) || J) { let de = J ? Qi(J.declarations, H.declarations) : H.declarations, Ae = !(T.flags & 8192) && Gi(k) || os(h); mn(de, xe => Fe(sa(xe) || xe, _.Property_0_was_also_declared_here, Ae)), Fe(h || u, _.Duplicate_property_0, Ae), H = wo(0, k, 4096) } return H.links.nameType = T, gJe(H, u, O), H.parent ? L.assert(H.parent === n, "Existing symbol parent should match new one") : H.parent = n, p.resolvedSymbol = H } } return p.resolvedSymbol } function Mte(n, a) { let c = Ai(n); if (!c[a]) { let u = a === "resolvedExports", p = u ? n.flags & 1536 ? Dx(n).exports : n.exports : n.members; c[a] = p || q; let h = Ua(); for (let k of n.declarations || Je) { let O = $se(k); if (O) for (let H of O) u === zc(H) && $P(H) && vxe(n, p, h, H) } let T = n.assignmentDeclarationMembers; if (T) { let k = lo(T.values()); for (let O of k) { let H = ic(O), J = H === 3 || ar(O) && GB(O, H) || H === 9 || H === 6; u === !J && $P(O) && vxe(n, p, h, O) } } c[a] = Yh(p, h) || q } return c[a] } function vy(n) { return n.flags & 6256 ? Mte(n, "resolvedMembers") : n.members || q } function zG(n) { if (n.flags & 106500 && n.escapedName === "__computed") { let a = Ai(n); if (!a.lateSymbol && vt(n.declarations, $P)) { let c = No(n.parent); vt(n.declarations, zc) ? Gd(c) : vy(c) } return a.lateSymbol || (a.lateSymbol = n) } return n } function uf(n, a, c) { if (Ur(n) & 4) { let u = n.target, p = Ko(n); if (Fn(u.typeParameters) === Fn(p)) { let h = _g(u, Qi(p, [a || u.thisType])); return c ? Eu(h) : h } } else if (n.flags & 2097152) { let u = Tl(n.types, p => uf(p, a, c)); return u !== n.types ? so(u) : n } return c ? Eu(n) : n } function bxe(n, a, c, u) { let p, h, T, k, O; GU(c, u, 0, c.length) ? (h = a.symbol ? vy(a.symbol) : Ua(a.declaredProperties), T = a.declaredCallSignatures, k = a.declaredConstructSignatures, O = a.declaredIndexInfos) : (p = Wu(c, u), h = hxe(a.declaredProperties, p, c.length === 1), T = cB(a.declaredCallSignatures, p), k = cB(a.declaredConstructSignatures, p), O = VAe(a.declaredIndexInfos, p)); let H = _o(a); if (H.length) { a.symbol && h === vy(a.symbol) && (h = Ua(a.declaredProperties)), sf(n, h, T, k, O); let J = Os(u); for (let de of H) { let Ae = J ? uf(Oi(de, p), J) : de; gxe(h, Jo(Ae)), T = Qi(T, xa(Ae, 0)), k = Qi(k, xa(Ae, 1)); let xe = Ae !== Se ? tu(Ae) : [Fp(ae, Se, !1)]; O = Qi(O, Pr(xe, tt => !Yte(O, tt.keyType))) } } sf(n, h, T, k, O) } function yJe(n) { bxe(n, Nte(n), Je, Je) } function vJe(n) { let a = Nte(n.target), c = Qi(a.typeParameters, [a.thisType]), u = Ko(n), p = u.length === c.length ? u : Qi(u, [n]); bxe(n, a, c, p) } function Am(n, a, c, u, p, h, T, k) { let O = new m(qe, k); return O.declaration = n, O.typeParameters = a, O.parameters = u, O.thisParameter = c, O.resolvedReturnType = p, O.resolvedTypePredicate = h, O.minArgumentCount = T, O.resolvedMinArgumentCount = void 0, O.target = void 0, O.mapper = void 0, O.compositeSignatures = void 0, O.compositeKind = void 0, O } function Xk(n) { let a = Am(n.declaration, n.typeParameters, n.thisParameter, n.parameters, void 0, void 0, n.minArgumentCount, n.flags & 39); return a.target = n.target, a.mapper = n.mapper, a.compositeSignatures = n.compositeSignatures, a.compositeKind = n.compositeKind, a } function Exe(n, a) { let c = Xk(n); return c.compositeSignatures = a, c.compositeKind = 1048576, c.target = void 0, c.mapper = void 0, c } function bJe(n, a) { if ((n.flags & 24) === a) return n; n.optionalCallSignatureCache || (n.optionalCallSignatureCache = {}); let c = a === 8 ? "inner" : "outer"; return n.optionalCallSignatureCache[c] || (n.optionalCallSignatureCache[c] = EJe(n, a)) } function EJe(n, a) { L.assert(a === 8 || a === 16, "An optional call signature can either be for an inner call chain or an outer call chain, but not both."); let c = Xk(n); return c.flags |= a, c } function Txe(n, a) { if (Xl(n)) { let u = n.parameters.length - 1, p = zn(n.parameters[u]); if (po(p)) return [c(p, u)]; if (!a && p.flags & 1048576 && Ji(p.types, po)) return on(p.types, h => c(h, u)) } return [n.parameters]; function c(u, p) { let h = Ko(u), T = u.target.labeledElementDeclarations, k = on(h, (O, H) => { let de = !!T && nU(T[H]) || FC(n, p + H, u), Ae = u.target.elementFlags[H], xe = Ae & 12 ? 32768 : Ae & 2 ? 16384 : 0, tt = wo(1, de, xe); return tt.links.type = Ae & 4 ? nu(O) : O, tt }); return Qi(n.parameters.slice(0, p), k) } } function TJe(n) { let a = Wr(n), c = xa(a, 1), u = Nh(n.symbol), p = !!u && Mr(u, 256); if (c.length === 0) return [Am(void 0, n.localTypeParameters, void 0, Je, n, void 0, 0, p ? 4 : 0)]; let h = yn(n), T = Yn(h), k = aM(h), O = Fn(k), H = []; for (let J of c) { let de = Mp(J.typeParameters), Ae = Fn(J.typeParameters); if (T || O >= de && O <= Ae) { let xe = Ae ? JG(J, Sy(k, J.typeParameters, de, T)) : Xk(J); xe.typeParameters = n.localTypeParameters, xe.resolvedReturnType = n, xe.flags = p ? xe.flags | 4 : xe.flags & -5, H.push(xe) } } return H } function Fte(n, a, c, u, p) { for (let h of n) if (vM(h, a, c, u, p, c ? Kqe : sD)) return h } function SJe(n, a, c) { if (a.typeParameters) { if (c > 0) return; for (let p = 1; p < n.length; p++)if (!Fte(n[p], a, !1, !1, !1)) return; return [a] } let u; for (let p = 0; p < n.length; p++) { let h = p === c ? a : Fte(n[p], a, !0, !1, !0); if (!h) return; u = xg(u, h) } return u } function Gte(n) { let a, c; for (let u = 0; u < n.length; u++) { if (n[u].length === 0) return Je; n[u].length > 1 && (c = c === void 0 ? u : -1); for (let p of n[u]) if (!a || !Fte(a, p, !1, !1, !0)) { let h = SJe(n, p, u); if (h) { let T = p; if (h.length > 1) { let k = p.thisParameter, O = mn(h, H => H.thisParameter); if (O) { let H = so(Zi(h, J => J.thisParameter && zn(J.thisParameter))); k = qE(O, H) } T = Exe(p, h), T.thisParameter = k } (a || (a = [])).push(T) } } } if (!Fn(a) && c !== -1) { let u = n[c !== void 0 ? c : 0], p = u.slice(); for (let h of n) if (h !== u) { let T = h[0]; if (L.assert(!!T, "getUnionSignatures bails early on empty signature lists and should not have empty lists on second pass"), p = T.typeParameters && vt(p, k => !!k.typeParameters && !Sxe(T.typeParameters, k.typeParameters)) ? void 0 : on(p, k => CJe(k, T)), !p) break } a = p } return a || Je } function Sxe(n, a) { if (Fn(n) !== Fn(a)) return !1; if (!n || !a) return !0; let c = Wu(a, n); for (let u = 0; u < n.length; u++) { let p = n[u], h = a[u]; if (p !== h && !ph(bC(p) || ue, Oi(bC(h) || ue, c))) return !1 } return !0 } function xJe(n, a, c) { if (!n || !a) return n || a; let u = so([zn(n), Oi(zn(a), c)]); return qE(n, u) } function AJe(n, a, c) { let u = xd(n), p = xd(a), h = u >= p ? n : a, T = h === n ? a : n, k = h === n ? u : p, O = jp(n) || jp(a), H = O && !jp(h), J = new Array(k + (H ? 1 : 0)); for (let de = 0; de < k; de++) { let Ae = tT(h, de); h === a && (Ae = Oi(Ae, c)); let xe = tT(T, de) || ue; T === a && (xe = Oi(xe, c)); let tt = so([Ae, xe]), It = O && !H && de === k - 1, Tn = de >= Vp(h) && de >= Vp(T), un = de >= u ? void 0 : FC(n, de), Nn = de >= p ? void 0 : FC(a, de), en = un === Nn ? un : un ? Nn ? void 0 : un : Nn, cn = wo(1 | (Tn && !It ? 16777216 : 0), en || `arg${de}`); cn.links.type = It ? nu(tt) : tt, J[de] = cn } if (H) { let de = wo(1, "args"); de.links.type = nu(P_(T, k)), T === a && (de.links.type = Oi(de.links.type, c)), J[k] = de } return J } function CJe(n, a) { let c = n.typeParameters || a.typeParameters, u; n.typeParameters && a.typeParameters && (u = Wu(a.typeParameters, n.typeParameters)); let p = n.declaration, h = AJe(n, a, u), T = xJe(n.thisParameter, a.thisParameter, u), k = Math.max(n.minArgumentCount, a.minArgumentCount), O = Am(p, c, T, h, void 0, void 0, k, (n.flags | a.flags) & 39); return O.compositeKind = 1048576, O.compositeSignatures = Qi(n.compositeKind !== 2097152 && n.compositeSignatures || [n], [a]), u && (O.mapper = n.compositeKind !== 2097152 && n.mapper && n.compositeSignatures ? Jv(n.mapper, u) : u), O } function xxe(n) { let a = tu(n[0]); if (a) { let c = []; for (let u of a) { let p = u.keyType; Ji(n, h => !!Cm(h, p)) && c.push(Fp(p, Gr(on(n, h => fg(h, p))), vt(n, h => Cm(h, p).isReadonly))) } return c } return Je } function IJe(n) { let a = Gte(on(n.types, p => p === Hs ? [jt] : xa(p, 0))), c = Gte(on(n.types, p => xa(p, 1))), u = xxe(n.types); sf(n, q, a, c, u) } function QP(n, a) { return n ? a ? so([n, a]) : n : a } function Axe(n) { let a = Oy(n, u => xa(u, 1).length > 0), c = on(n, XP); if (a > 0 && a === Oy(c, u => u)) { let u = c.indexOf(!0); c[u] = !1 } return c } function LJe(n, a, c, u) { let p = []; for (let h = 0; h < a.length; h++)h === u ? p.push(n) : c[h] && p.push(qo(xa(a[h], 1)[0])); return so(p) } function kJe(n) { let a, c, u, p = n.types, h = Axe(p), T = Oy(h, k => k); for (let k = 0; k < p.length; k++) { let O = n.types[k]; if (!h[k]) { let H = xa(O, 1); H.length && T > 0 && (H = on(H, J => { let de = Xk(J); return de.resolvedReturnType = LJe(qo(J), p, h, k), de })), c = Cxe(c, H) } a = Cxe(a, xa(O, 0)), u = ou(tu(O), (H, J) => Ixe(H, J, !1), u) } sf(n, q, a || Je, c || Je, u || Je) } function Cxe(n, a) { for (let c of a) (!n || Ji(n, u => !vM(u, c, !1, !1, !1, sD))) && (n = Sn(n, c)); return n } function Ixe(n, a, c) { if (n) for (let u = 0; u < n.length; u++) { let p = n[u]; if (p.keyType === a.keyType) return n[u] = Fp(p.keyType, c ? Gr([p.type, a.type]) : so([p.type, a.type]), c ? p.isReadonly || a.isReadonly : p.isReadonly && a.isReadonly), n } return Sn(n, a) } function DJe(n) { if (n.target) { sf(n, q, Je, Je, Je); let T = hxe(Ey(n.target), n.mapper, !1), k = cB(xa(n.target, 0), n.mapper), O = cB(xa(n.target, 1), n.mapper), H = VAe(tu(n.target), n.mapper); sf(n, T, k, O, H); return } let a = No(n.symbol); if (a.flags & 2048) { sf(n, q, Je, Je, Je); let T = vy(a), k = Xb(T.get("__call")), O = Xb(T.get("__new")), H = Vxe(a); sf(n, T, k, O, H); return } let c = q, u; if (a.exports && (c = Gd(a), a === Ye)) { let T = new Map; c.forEach(k => { var O; !(k.flags & 418) && !(k.flags & 512 && ((O = k.declarations) != null && O.length) && Ji(k.declarations, lu)) && T.set(k.escapedName, k) }), c = T } let p; if (sf(n, c, Je, Je, Je), a.flags & 32) { let T = vu(a), k = Wr(T); k.flags & 11272192 ? (c = Ua(Rx(c)), gxe(c, Jo(k))) : k === Se && (p = Fp(ae, Se, !1)) } let h = ane(c); if (h ? u = one(h) : (p && (u = Sn(u, p)), a.flags & 384 && (gs(a).flags & 32 || vt(n.properties, T => !!(zn(T).flags & 296))) && (u = Sn(u, yu))), sf(n, c, Je, Je, u || Je), a.flags & 8208 && (n.callSignatures = Xb(a)), a.flags & 32) { let T = vu(a), k = a.members ? Xb(a.members.get("__constructor")) : Je; a.flags & 16 && (k = si(k.slice(), Zi(n.callSignatures, O => cp(O.declaration) ? Am(O.declaration, O.typeParameters, O.thisParameter, O.parameters, T, void 0, O.minArgumentCount, O.flags & 39) : void 0))), k.length || (k = TJe(T)), n.constructSignatures = k } } function wJe(n, a, c) { return Oi(n, Wu([a.indexType, a.objectType], [op(0), ap([c])])) } function RJe(n) { let a = Cm(n.source, ae), c = Pp(n.mappedType), u = !(c & 1), p = c & 4 ? 0 : 16777216, h = a ? [Fp(ae, LB(a.type, n.mappedType, n.constraintType), u && a.isReadonly)] : Je, T = Ua(); for (let k of Jo(n.source)) { let O = 8192 | (u && M_(k) ? 8 : 0), H = wo(4 | k.flags & p, k.escapedName, O); if (H.declarations = k.declarations, H.links.nameType = Ai(k).nameType, H.links.propertyType = zn(k), n.constraintType.type.flags & 8388608 && n.constraintType.type.objectType.flags & 262144 && n.constraintType.type.indexType.flags & 262144) { let J = n.constraintType.type.objectType, de = wJe(n.mappedType, n.constraintType.type, J); H.links.mappedType = de, H.links.constraintType = Gp(J) } else H.links.mappedType = n.mappedType, H.links.constraintType = n.constraintType; T.set(k.escapedName, H) } sf(n, T, Je, Je, h) } function ZP(n) { if (n.flags & 4194304) { let a = Eu(n.type); return Qx(a) ? _Ae(a) : Gp(a) } if (n.flags & 16777216) { if (n.root.isDistributive) { let a = n.checkType, c = ZP(a); if (c !== a) return Fne(n, O1(n.root.checkType, c, n.mapper)) } return n } if (n.flags & 1048576) return Ls(n, ZP, !0); if (n.flags & 2097152) { let a = n.types; return a.length === 2 && a[0].flags & 76 && a[1] === mc ? n : so(Tl(n.types, ZP)) } return n } function Bte(n) { return ac(n) & 4096 } function Ute(n, a, c, u) { for (let p of Jo(n)) u(TC(p, a)); if (n.flags & 1) u(ae); else for (let p of tu(n)) (!c || p.keyType.flags & 134217732) && u(p.keyType) } function OJe(n) { let a = Ua(), c; sf(n, q, Je, Je, Je); let u = w_(n), p = rp(n), h = by(n.target || n), T = h && to(h, u), k = _h(n.target || n), O = Eu(yC(n)), H = Pp(n), J = we ? 128 : 8576; Yk(n) ? Ute(O, J, we, de) : QE(ZP(p), de), sf(n, a, Je, Je, c || Je); function de(xe) { let tt = h ? Oi(h, oD(n.mapper, u, xe)) : xe; QE(tt, It => Ae(xe, It)) } function Ae(xe, tt) { if (fh(tt)) { let It = Np(tt), Tn = a.get(It); if (Tn) Tn.links.nameType = Gr([Tn.links.nameType, tt]), Tn.links.keyType = Gr([Tn.links.keyType, xe]); else { let un = fh(xe) ? ja(O, Np(xe)) : void 0, Nn = !!(H & 4 || !(H & 8) && un && un.flags & 16777216), en = !!(H & 1 || !(H & 2) && un && M_(un)), cn = U && !Nn && un && un.flags & 16777216, rr = un ? Bte(un) : 0, Jt = wo(4 | (Nn ? 16777216 : 0), It, rr | 262144 | (en ? 8 : 0) | (cn ? 524288 : 0)); Jt.links.mappedType = n, Jt.links.nameType = tt, Jt.links.keyType = xe, un && (Jt.links.syntheticOrigin = un, Jt.declarations = !h || T ? un.declarations : void 0), a.set(It, Jt) } } else if (KG(tt) || tt.flags & 33) { let It = tt.flags & 5 ? ae : tt.flags & 40 ? rt : tt, Tn = Oi(k, oD(n.mapper, u, xe)), un = Fp(It, Tn, !!(H & 1)); c = Ixe(c, un, !0) } } } function NJe(n) { if (!n.links.type) { let a = n.links.mappedType; if (!cf(n, 0)) return a.containsError = !0, ve; let c = _h(a.target || a), u = oD(a.mapper, w_(a), n.links.keyType), p = Oi(c, u), h = U && n.flags & 16777216 && !Js(p, 49152) ? gg(p, !0) : n.links.checkFlags & 524288 ? tre(p) : p; If() || (Fe(P, _.Type_of_property_0_circularly_references_itself_in_mapped_type_1, E(n), Ee(a)), h = ve), n.links.type = h } return n.links.type } function w_(n) { return n.typeParameter || (n.typeParameter = UE(fr(n.declaration.typeParameter))) } function rp(n) { return n.constraintType || (n.constraintType = eu(w_(n)) || ve) } function by(n) { return n.declaration.nameType ? n.nameType || (n.nameType = Oi($r(n.declaration.nameType), n.mapper)) : void 0 } function _h(n) { return n.templateType || (n.templateType = n.declaration.type ? Oi(ao($r(n.declaration.type), !0, !!(Pp(n) & 4)), n.mapper) : ve) } function Lxe(n) { return EA(n.declaration.typeParameter) } function Yk(n) { let a = Lxe(n); return a.kind === 195 && a.operator === 141 } function yC(n) { if (!n.modifiersType) if (Yk(n)) n.modifiersType = Oi($r(Lxe(n).type), n.mapper); else { let a = Cne(n.declaration), c = rp(a), u = c && c.flags & 262144 ? eu(c) : c; n.modifiersType = u && u.flags & 4194304 ? Oi(u.type, n.mapper) : ue } return n.modifiersType } function Pp(n) { let a = n.declaration; return (a.readonlyToken ? a.readonlyToken.kind === 40 ? 2 : 1 : 0) | (a.questionToken ? a.questionToken.kind === 40 ? 8 : 4 : 0) } function kxe(n) { let a = Pp(n); return a & 8 ? -1 : a & 4 ? 1 : 0 } function Vte(n) { let a = kxe(n), c = yC(n); return a || (df(c) ? kxe(c) : 0) } function PJe(n) { return !!(Ur(n) & 32 && Pp(n) & 4) } function df(n) { if (Ur(n) & 32) { let a = rp(n); if (jv(a)) return !0; let c = by(n); if (c && jv(Oi(c, n0(w_(n), a)))) return !0 } return !1 } function R_(n) { return n.members || (n.flags & 524288 ? n.objectFlags & 4 ? vJe(n) : n.objectFlags & 3 ? yJe(n) : n.objectFlags & 1024 ? RJe(n) : n.objectFlags & 16 ? DJe(n) : n.objectFlags & 32 ? OJe(n) : L.fail("Unhandled object type " + L.formatObjectFlags(n.objectFlags)) : n.flags & 1048576 ? IJe(n) : n.flags & 2097152 ? kJe(n) : L.fail("Unhandled type " + L.formatTypeFlags(n.flags))), n } function Ey(n) { return n.flags & 524288 ? R_(n).properties : Je } function qb(n, a) { if (n.flags & 524288) { let u = R_(n).members.get(a); if (u && ig(u)) return u } } function eM(n) { if (!n.resolvedProperties) { let a = Ua(); for (let c of n.types) { for (let u of Jo(c)) if (!a.has(u.escapedName)) { let p = qte(n, u.escapedName); p && a.set(u.escapedName, p) } if (n.flags & 1048576 && tu(c).length === 0) break } n.resolvedProperties = uy(a) } return n.resolvedProperties } function Jo(n) { return n = vC(n), n.flags & 3145728 ? eM(n) : Ey(n) } function MJe(n, a) { n = vC(n), n.flags & 3670016 && R_(n).members.forEach((c, u) => { ag(c, u) && a(c, u) }) } function FJe(n, a) { return a.properties.some(u => { let p = u.name && pg(u.name), h = p && fh(p) ? Np(p) : void 0, T = h === void 0 ? void 0 : Vc(n, h); return !!T && uD(T) && !to(G1(u), T) }) } function GJe(n) { let a = Gr(n); if (!(a.flags & 1048576)) return Wie(a); let c = Ua(); for (let u of n) for (let { escapedName: p } of Wie(u)) if (!c.has(p)) { let h = Oxe(a, p); h && c.set(p, h) } return lo(c.values()) } function VE(n) { return n.flags & 262144 ? eu(n) : n.flags & 8388608 ? BJe(n) : n.flags & 16777216 ? VJe(n) : bu(n) } function eu(n) { return $k(n) ? bC(n) : void 0 } function tM(n) { var a; return !!(n.flags & 262144 && vt((a = n.symbol) == null ? void 0 : a.declarations, c => Mr(c, 2048)) || Qx(n) && Yc(Ko(n), (c, u) => !!(n.target.elementFlags[u] & 8) && tM(c)) >= 0 || n.flags & 8388608 && tM(n.objectType)) } function BJe(n) { return $k(n) ? UJe(n) : void 0 } function jte(n) { let a = mg(n, !1); return a !== n ? a : VE(n) } function UJe(n) { if (Jte(n)) return nB(n.objectType, n.indexType); let a = jte(n.indexType); if (a && a !== n.indexType) { let u = Ay(n.objectType, a, n.accessFlags); if (u) return u } let c = jte(n.objectType); if (c && c !== n.objectType) return Ay(c, n.indexType, n.accessFlags) } function Hte(n) { if (!n.resolvedDefaultConstraint) { let a = Eqe(n), c = Wv(n); n.resolvedDefaultConstraint = Zo(a) ? c : Zo(c) ? a : Gr([a, c]) } return n.resolvedDefaultConstraint } function Dxe(n) { if (n.root.isDistributive && n.restrictiveInstantiation !== n) { let a = mg(n.checkType, !1), c = a === n.checkType ? VE(a) : a; if (c && c !== n.checkType) { let u = Fne(n, O1(n.root.checkType, c, n.mapper)); if (!(u.flags & 131072)) return u } } } function wxe(n) { return Dxe(n) || Hte(n) } function VJe(n) { return $k(n) ? wxe(n) : void 0 } function jJe(n, a) { let c, u = !1; for (let p of n) if (p.flags & 465829888) { let h = VE(p); for (; h && h.flags & 21233664;)h = VE(h); h && (c = Sn(c, h), a && (c = Sn(c, p))) } else (p.flags & 469892092 || hh(p)) && (u = !0); if (c && (a || u)) { if (u) for (let p of n) (p.flags & 469892092 || hh(p)) && (c = Sn(c, p)); return mM(so(c), !1) } } function bu(n) { if (n.flags & 464781312) { let a = Wte(n); return a !== Co && a !== gc ? a : void 0 } return n.flags & 4194304 ? Si : void 0 } function Ty(n) { return bu(n) || n } function $k(n) { return Wte(n) !== gc } function Wte(n) { if (n.resolvedBaseConstraint) return n.resolvedBaseConstraint; let a = []; return n.resolvedBaseConstraint = uf(c(n), n); function c(h) { if (!h.immediateBaseConstraint) { if (!cf(h, 4)) return gc; let T, k = AC(h); if ((a.length < 10 || a.length < 50 && !ya(a, k)) && (a.push(k), T = p(mg(h, !1)), a.pop()), !If()) { if (h.flags & 262144) { let O = sne(h); if (O) { let H = Fe(O, _.Type_parameter_0_has_a_circular_constraint, Ee(h)); P && !AT(O, P) && !AT(P, O) && Ao(H, hr(P, _.Circularity_originates_in_type_at_this_location)) } } T = gc } h.immediateBaseConstraint = T || Co } return h.immediateBaseConstraint } function u(h) { let T = c(h); return T !== Co && T !== gc ? T : void 0 } function p(h) { if (h.flags & 262144) { let T = bC(h); return h.isThisType || !T ? T : u(T) } if (h.flags & 3145728) { let T = h.types, k = [], O = !1; for (let H of T) { let J = u(H); J ? (J !== H && (O = !0), k.push(J)) : O = !0 } return O ? h.flags & 1048576 && k.length === T.length ? Gr(k) : h.flags & 2097152 && k.length ? so(k) : void 0 : h } if (h.flags & 4194304) return Si; if (h.flags & 134217728) { let T = h.types, k = Zi(T, u); return k.length === T.length ? WE(h.texts, k) : ae } if (h.flags & 268435456) { let T = u(h.type); return T && T !== h.type ? w1(h.symbol, T) : ae } if (h.flags & 8388608) { if (Jte(h)) return u(nB(h.objectType, h.indexType)); let T = u(h.objectType), k = u(h.indexType), O = T && k && Ay(T, k, h.accessFlags); return O && u(O) } if (h.flags & 16777216) { let T = wxe(h); return T && u(T) } return h.flags & 33554432 ? u(une(h)) : h } } function HJe(n) { return n.resolvedApparentType || (n.resolvedApparentType = uf(n, n, !0)) } function zte(n) { if (n.default) n.default === Ll && (n.default = gc); else if (n.target) { let a = zte(n.target); n.default = a ? Oi(a, n.mapper) : Co } else { n.default = Ll; let a = n.symbol && mn(n.symbol.declarations, u => _c(u) && u.default), c = a ? $r(a) : Co; n.default === Ll && (n.default = c) } return n.default } function jE(n) { let a = zte(n); return a !== Co && a !== gc ? a : void 0 } function WJe(n) { return zte(n) !== gc } function Rxe(n) { return !!(n.symbol && mn(n.symbol.declarations, a => _c(a) && a.default)) } function zJe(n) { return n.resolvedApparentType || (n.resolvedApparentType = JJe(n)) } function JJe(n) { let a = Nne(n); if (a && !n.declaration.nameType) { let c = eu(a); if (c && JE(c)) return Oi(n, O1(a, c, n.mapper)) } return n } function Jte(n) { let a; return !!(n.flags & 8388608 && Ur(a = n.objectType) & 32 && !df(a) && jv(n.indexType) && !(Pp(a) & 8) && !a.declaration.nameType) } function Eu(n) { let a = n.flags & 465829888 ? bu(n) || ue : n; return Ur(a) & 32 ? zJe(a) : a.flags & 2097152 ? HJe(a) : a.flags & 402653316 ? Ws : a.flags & 296 ? hd : a.flags & 2112 ? CKe() : a.flags & 528 ? vc : a.flags & 12288 ? iAe() : a.flags & 67108864 ? Ki : a.flags & 4194304 ? Si : a.flags & 2 && !U ? Ki : a } function vC(n) { return O_(Eu(O_(n))) } function Oxe(n, a, c) { var u, p, h; let T, k, O, H = n.flags & 1048576, J, de = 4, Ae = H ? 0 : 8, xe = !1; for (let Cn of n.types) { let Rn = Eu(Cn); if (!(Ro(Rn) || Rn.flags & 131072)) { let Br = ja(Rn, a, c), Hr = Br ? Ef(Br) : 0; if (Br) { if (Br.flags & 106500 && (J ?? (J = H ? 0 : 16777216), H ? J |= Br.flags & 16777216 : J &= Br.flags), !T) T = Br; else if (Br !== T) if ((oA(Br) || Br) === (oA(T) || T) && qne(T, Br, (wa, Xc) => wa === Xc ? -1 : 0) === -1) xe = !!T.parent && !!Fn(yy(T.parent)); else { k || (k = new Map, k.set($a(T), T)); let wa = $a(Br); k.has(wa) || k.set(wa, Br) } H && M_(Br) ? Ae |= 8 : !H && !M_(Br) && (Ae &= -9), Ae |= (Hr & 24 ? 0 : 256) | (Hr & 16 ? 512 : 0) | (Hr & 8 ? 1024 : 0) | (Hr & 32 ? 2048 : 0), jre(Br) || (de = 2) } else if (H) { let qi = !qk(a) && jx(Rn, a); qi ? (Ae |= 32 | (qi.isReadonly ? 8 : 0), O = Sn(O, po(Rn) ? bM(Rn) || Oe : qi.type)) : Xv(Rn) && !(Ur(Rn) & 2097152) ? (Ae |= 32, O = Sn(O, Oe)) : Ae |= 16 } } } if (!T || H && (k || Ae & 48) && Ae & 1536 && !(k && KJe(k.values()))) return; if (!k && !(Ae & 16) && !O) if (xe) { let Cn = (u = zr(T, Zp)) == null ? void 0 : u.links, Rn = qE(T, Cn?.type); return Rn.parent = (h = (p = T.valueDeclaration) == null ? void 0 : p.symbol) == null ? void 0 : h.parent, Rn.links.containingType = n, Rn.links.mapper = Cn?.mapper, Rn } else return T; let tt = k ? lo(k.values()) : [T], It, Tn, un, Nn = [], en, cn, rr = !1; for (let Cn of tt) { cn ? Cn.valueDeclaration && Cn.valueDeclaration !== cn && (rr = !0) : cn = Cn.valueDeclaration, It = si(It, Cn.declarations); let Rn = zn(Cn); Tn || (Tn = Rn, un = Ai(Cn).nameType); let Br = mC(Cn); en || Br !== Rn ? en = Sn(en || Nn.slice(), Br) : Rn !== Tn && (Ae |= 64), (uD(Rn) || qx(Rn) || Rn === Nr) && (Ae |= 128), Rn.flags & 131072 && Rn !== Nr && (Ae |= 131072), Nn.push(Rn) } si(Nn, O); let Jt = wo(4 | (J ?? 0), a, de | Ae); return Jt.links.containingType = n, !rr && cn && (Jt.valueDeclaration = cn, cn.symbol.parent && (Jt.parent = cn.symbol.parent)), Jt.declarations = It, Jt.links.nameType = un, Nn.length > 2 ? (Jt.links.checkFlags |= 65536, Jt.links.deferralParent = n, Jt.links.deferralConstituents = Nn, Jt.links.deferralWriteConstituents = en) : (Jt.links.type = H ? Gr(Nn) : so(Nn), en && (Jt.links.writeType = H ? Gr(en) : so(en))), Jt } function Kte(n, a, c) { var u, p; let h = (u = n.propertyCacheWithoutObjectFunctionPropertyAugment) != null && u.get(a) || !c ? (p = n.propertyCache) == null ? void 0 : p.get(a) : void 0; return h || (h = Oxe(n, a, c), h && (c ? n.propertyCacheWithoutObjectFunctionPropertyAugment || (n.propertyCacheWithoutObjectFunctionPropertyAugment = Ua()) : n.propertyCache || (n.propertyCache = Ua())).set(a, h)), h } function KJe(n) { let a; for (let c of n) { if (!c.declarations) return; if (!a) { a = new Set(c.declarations); continue } if (a.forEach(u => { ya(c.declarations, u) || a.delete(u) }), a.size === 0) return } return a } function qte(n, a, c) { let u = Kte(n, a, c); return u && !(ac(u) & 16) ? u : void 0 } function O_(n) { return n.flags & 1048576 && n.objectFlags & 16777216 ? n.resolvedReducedType || (n.resolvedReducedType = qJe(n)) : n.flags & 2097152 ? (n.objectFlags & 16777216 || (n.objectFlags |= 16777216 | (vt(eM(n), XJe) ? 33554432 : 0)), n.objectFlags & 33554432 ? lt : n) : n } function qJe(n) { let a = Tl(n.types, O_); if (a === n.types) return n; let c = Gr(a); return c.flags & 1048576 && (c.resolvedReducedType = c), c } function XJe(n) { return Nxe(n) || Pxe(n) } function Nxe(n) { return !(n.flags & 16777216) && (ac(n) & 131264) === 192 && !!(zn(n).flags & 131072) } function Pxe(n) { return !n.valueDeclaration && !!(ac(n) & 1024) } function Xte(n, a) { if (a.flags & 2097152 && Ur(a) & 33554432) { let c = wr(eM(a), Nxe); if (c) return da(n, _.The_intersection_0_was_reduced_to_never_because_property_1_has_conflicting_types_in_some_constituents, Ee(a, void 0, 536870912), E(c)); let u = wr(eM(a), Pxe); if (u) return da(n, _.The_intersection_0_was_reduced_to_never_because_property_1_exists_in_multiple_constituents_and_is_private_in_some, Ee(a, void 0, 536870912), E(u)) } return n } function ja(n, a, c, u) { if (n = vC(n), n.flags & 524288) { let p = R_(n), h = p.members.get(a); if (h && ig(h, u)) return h; if (c) return; let T = p === aa ? Hs : p.callSignatures.length ? Uc : p.constructSignatures.length ? Gu : void 0; if (T) { let k = qb(T, a); if (k) return k } return qb(ka, a) } if (n.flags & 3145728) return qte(n, a, c) } function nM(n, a) { if (n.flags & 3670016) { let c = R_(n); return a === 0 ? c.callSignatures : c.constructSignatures } return Je } function xa(n, a) { return nM(vC(n), a) } function Yte(n, a) { return wr(n, c => c.keyType === a) } function $te(n, a) { let c, u, p; for (let h of n) h.keyType === ae ? c = h : Vx(a, h.keyType) && (u ? (p || (p = [u])).push(h) : u = h); return p ? Fp(ue, so(on(p, h => h.type)), ou(p, (h, T) => h && T.isReadonly, !0)) : u || (c && Vx(a, ae) ? c : void 0) } function Vx(n, a) { return to(n, a) || a === ae && to(n, rt) || a === rt && (n === Fa || !!(n.flags & 128) && Wm(n.value)) } function Qte(n) { return n.flags & 3670016 ? R_(n).indexInfos : Je } function tu(n) { return Qte(vC(n)) } function Cm(n, a) { return Yte(tu(n), a) } function fg(n, a) { var c; return (c = Cm(n, a)) == null ? void 0 : c.type } function Zte(n, a) { return tu(n).filter(c => Vx(a, c.keyType)) } function rM(n, a) { return $te(tu(n), a) } function jx(n, a) { return rM(n, qk(a) ? j : ff(Gi(a))) } function Mxe(n) { var a; let c; for (let u of jy(n)) c = xg(c, UE(u.symbol)); return c?.length ? c : Jc(n) ? (a = Zk(n)) == null ? void 0 : a.typeParameters : void 0 } function ene(n) { let a = []; return n.forEach((c, u) => { LE(u) || a.push(c) }), a } function tne(n, a) { if (fl(n)) return; let c = yd(Ne, '"' + n + '"', 512); return c && a ? No(c) : c } function Qk(n) { if (uS(n) || zR(n) || JR(n)) return !0; if (n.initializer) { let c = ip(n.parent), u = n.parent.parameters.indexOf(n); return L.assert(u >= 0), u >= Vp(c, 3) } let a = ET(n.parent); return a ? !n.type && !n.dotDotDotToken && n.parent.parameters.indexOf(n) >= a.arguments.length : !1 } function YJe(n) { return Na(n) && !rm(n) && n.questionToken } function iM(n, a, c, u) { return { kind: n, parameterName: a, parameterIndex: c, type: u } } function Mp(n) { let a = 0; if (n) for (let c = 0; c < n.length; c++)Rxe(n[c]) || (a = c + 1); return a } function Sy(n, a, c, u) { let p = Fn(a); if (!p) return []; let h = Fn(n); if (u || h >= c && h <= p) { let T = n ? n.slice() : []; for (let O = h; O < p; O++)T[O] = ve; let k = hre(u); for (let O = h; O < p; O++) { let H = jE(a[O]); u && H && (ph(H, ue) || ph(H, Ki)) && (H = Se), T[O] = H ? Oi(H, Wu(a, T)) : k } return T.length = a.length, T } return n && n.slice() } function ip(n) { let a = Rr(n); if (!a.resolvedSignature) { let c = [], u = 0, p = 0, h, T = !1, k = ET(n), O = jA(n); !k && Yn(n) && bce(n) && !Joe(n) && !Vy(n) && (u |= 32); for (let Ae = O ? 1 : 0; Ae < n.parameters.length; Ae++) { let xe = n.parameters[Ae], tt = xe.symbol, It = xp(xe) ? xe.typeExpression && xe.typeExpression.type : xe.type; tt && tt.flags & 4 && !La(xe.name) && (tt = zs(xe, tt.escapedName, 111551, void 0, void 0, !1)), Ae === 0 && tt.escapedName === "this" ? (T = !0, h = xe.symbol) : c.push(tt), It && It.kind === 198 && (u |= 2), zR(xe) || xe.initializer || xe.questionToken || Fm(xe) || k && c.length > k.arguments.length && !It || JR(xe) || (p = c.length) } if ((n.kind === 174 || n.kind === 175) && Ux(n) && (!T || !h)) { let Ae = n.kind === 174 ? 175 : 174, xe = nc(fr(n), Ae); xe && (h = Me(xe)) } if (Yn(n)) { let Ae = e6(n); Ae && Ae.typeExpression && (h = qE(wo(1, "this"), $r(Ae.typeExpression))) } let J = n.kind === 173 ? vu(No(n.parent.symbol)) : void 0, de = J ? J.localTypeParameters : Mxe(n); (Yj(n) || Yn(n) && $Je(n, c)) && (u |= 1), (yL(n) && Mr(n, 256) || Ec(n) && Mr(n.parent, 256)) && (u |= 4), a.resolvedSignature = Am(n, de, h, c, void 0, void 0, p, u) } return a.resolvedSignature } function $Je(n, a) { if (X0(n) || !nne(n)) return !1; let c = Os(n.parameters), u = c ? fI(c) : A0(n).filter(xp), p = ks(u, T => T.typeExpression && h3(T.typeExpression.type) ? T.typeExpression.type : void 0), h = wo(3, "args", 32768); return p ? h.links.type = nu($r(p.type)) : (h.links.checkFlags |= 65536, h.links.deferralParent = lt, h.links.deferralConstituents = [Et], h.links.deferralWriteConstituents = [Et]), p && a.pop(), a.push(h), !0 } function Zk(n) { if (!(Yn(n) && Ds(n))) return; let a = x0(n); return a?.typeExpression && F1($r(a.typeExpression)) } function QJe(n, a) { let c = Zk(n); if (!c) return; let u = n.parameters.indexOf(a); return a.dotDotDotToken ? SD(c, u) : P_(c, u) } function ZJe(n) { let a = Zk(n); return a && qo(a) } function nne(n) { let a = Rr(n); return a.containsArgumentsReference === void 0 && (a.flags & 512 ? a.containsArgumentsReference = !0 : a.containsArgumentsReference = c(n.body)), a.containsArgumentsReference; function c(u) { if (!u) return !1; switch (u.kind) { case 79: return u.escapedText === _t.escapedName && i8(u) === _t; case 169: case 171: case 174: case 175: return u.name.kind === 164 && c(u.name); case 208: case 209: return c(u.expression); case 299: return c(u.initializer); default: return !HH(u) && !Gm(u) && !!pa(u, c) } } } function Xb(n) { if (!n || !n.declarations) return Je; let a = []; for (let c = 0; c < n.declarations.length; c++) { let u = n.declarations[c]; if (Ia(u)) { if (c > 0 && u.body) { let p = n.declarations[c - 1]; if (u.parent === p.parent && u.kind === p.kind && u.pos === p.end) continue } if (Yn(u) && u.jsDoc) { let p = !1; for (let h of u.jsDoc) if (h.tags) { for (let T of h.tags) if (kL(T)) { let k = T.typeExpression; k.type === void 0 && !Ec(u) && qv(k, Se), a.push(ip(k)), p = !0 } } if (p) continue } a.push(!a2(u) && !s_(u) && Zk(u) || ip(u)) } } return a } function Fxe(n) { let a = Gl(n, n); if (a) { let c = Vu(a); if (c) return zn(c) } return Se } function Yb(n) { if (n.thisParameter) return zn(n.thisParameter) } function Lf(n) { if (!n.resolvedTypePredicate) { if (n.target) { let a = Lf(n.target); n.resolvedTypePredicate = a ? Mqe(a, n.mapper) : Rs } else if (n.compositeSignatures) n.resolvedTypePredicate = qKe(n.compositeSignatures, n.compositeKind) || Rs; else { let a = n.declaration && U_(n.declaration), c; if (!a) { let u = Zk(n.declaration); u && n !== u && (c = Lf(u)) } n.resolvedTypePredicate = a && l3(a) ? eKe(a, n) : c || Rs } L.assert(!!n.resolvedTypePredicate) } return n.resolvedTypePredicate === Rs ? void 0 : n.resolvedTypePredicate } function eKe(n, a) { let c = n.parameterName, u = n.type && $r(n.type); return c.kind === 194 ? iM(n.assertsModifier ? 2 : 0, void 0, void 0, u) : iM(n.assertsModifier ? 3 : 1, c.escapedText, Yc(a.parameters, p => p.escapedName === c.escapedText), u) } function Gxe(n, a, c) { return a !== 2097152 ? Gr(n, c) : so(n) } function qo(n) { if (!n.resolvedReturnType) { if (!cf(n, 3)) return ve; let a = n.target ? Oi(qo(n.target), n.mapper) : n.compositeSignatures ? Oi(Gxe(on(n.compositeSignatures, qo), n.compositeKind, 2), n.mapper) : Hx(n.declaration) || (rc(n.declaration.body) ? Se : rU(n.declaration)); if (n.flags & 8 ? a = h2e(a) : n.flags & 16 && (a = gg(a)), !If()) { if (n.declaration) { let c = U_(n.declaration); if (c) Fe(c, _.Return_type_annotation_circularly_references_itself); else if (ge) { let u = n.declaration, p = sa(u); p ? Fe(p, _._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, os(p)) : Fe(u, _.Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions) } } a = Se } n.resolvedReturnType = a } return n.resolvedReturnType } function Hx(n) { if (n.kind === 173) return vu(No(n.parent.symbol)); if (X0(n)) { let c = OI(n); if (c && Ec(c.parent)) return vu(No(c.parent.parent.symbol)) } if (jA(n)) return $r(n.parameters[0].type); let a = U_(n); if (a) return $r(a); if (n.kind === 174 && Ux(n)) { let c = Yn(n) && di(n); if (c) return c; let u = nc(fr(n), 175), p = te(u); if (p) return p } return ZJe(n) } function rne(n) { return !n.resolvedReturnType && Sm(n, 3) >= 0 } function tKe(n) { return Bxe(n) || Se } function Bxe(n) { if (Xl(n)) { let a = zn(n.parameters[n.parameters.length - 1]), c = po(a) ? bM(a) : a; return c && fg(c, rt) } } function eD(n, a, c, u) { let p = ine(n, Sy(a, n.typeParameters, Mp(n.typeParameters), c)); if (u) { let h = KCe(qo(p)); if (h) { let T = Xk(h); T.typeParameters = u; let k = Xk(p); return k.resolvedReturnType = HE(T), k } } return p } function ine(n, a) { let c = n.instantiations || (n.instantiations = new Map), u = kf(a), p = c.get(u); return p || c.set(u, p = JG(n, a)), p } function JG(n, a) { return $x(n, nKe(n, a), !0) } function nKe(n, a) { return Wu(n.typeParameters, a) } function tD(n) { return n.typeParameters ? n.erasedSignatureCache || (n.erasedSignatureCache = rKe(n)) : n } function rKe(n) { return $x(n, jAe(n.typeParameters), !0) } function iKe(n) { return n.typeParameters ? n.canonicalSignatureCache || (n.canonicalSignatureCache = aKe(n)) : n } function aKe(n) { return eD(n, on(n.typeParameters, a => a.target && !eu(a.target) ? a.target : a), Yn(n.declaration)) } function oKe(n) { let a = n.typeParameters; if (a) { if (n.baseSignatureCache) return n.baseSignatureCache; let c = jAe(a), u = Wu(a, on(a, h => eu(h) || ue)), p = on(a, h => Oi(h, u) || ue); for (let h = 0; h < a.length - 1; h++)p = hg(p, u); return p = hg(p, c), n.baseSignatureCache = $x(n, Wu(a, p), !0) } return n } function HE(n) { var a; if (!n.isolatedSignatureType) { let c = (a = n.declaration) == null ? void 0 : a.kind, u = c === void 0 || c === 173 || c === 177 || c === 182, p = Bd(16); p.members = q, p.properties = Je, p.callSignatures = u ? Je : [n], p.constructSignatures = u ? [n] : Je, p.indexInfos = Je, n.isolatedSignatureType = p } return n.isolatedSignatureType } function Uxe(n) { return n.members ? ane(n.members) : void 0 } function ane(n) { return n.get("__index") } function Fp(n, a, c, u) { return { keyType: n, type: a, isReadonly: c, declaration: u } } function Vxe(n) { let a = Uxe(n); return a ? one(a) : Je } function one(n) { if (n.declarations) { let a = []; for (let c of n.declarations) if (c.parameters.length === 1) { let u = c.parameters[0]; u.type && QE($r(u.type), p => { KG(p) && !Yte(a, p) && a.push(Fp(p, c.type ? $r(c.type) : Se, cd(c, 64), c)) }) } return a } return Je } function KG(n) { return !!(n.flags & 4108) || qx(n) || !!(n.flags & 2097152) && !SC(n) && vt(n.types, KG) } function sne(n) { return Zi(Pr(n.symbol && n.symbol.declarations, _c), EA)[0] } function jxe(n, a) { var c; let u; if ((c = n.symbol) != null && c.declarations) { for (let p of n.symbol.declarations) if (p.parent.kind === 192) { let [h = p.parent, T] = Tce(p.parent.parent); if (T.kind === 180 && !a) { let k = T, O = xie(k); if (O) { let H = k.typeArguments.indexOf(h); if (H < O.length) { let J = eu(O[H]); if (J) { let de = Rne(O, O.map((xe, tt) => () => met(k, O, tt))), Ae = Oi(J, de); Ae !== n && (u = Sn(u, Ae)) } } } } else if (T.kind === 166 && T.dotDotDotToken || T.kind === 188 || T.kind === 199 && T.dotDotDotToken) u = Sn(u, nu(ue)); else if (T.kind === 201) u = Sn(u, ae); else if (T.kind === 165 && T.parent.kind === 197) u = Sn(u, Si); else if (T.kind === 197 && T.type && vs(T.type) === p.parent && T.parent.kind === 191 && T.parent.extendsType === T && T.parent.checkType.kind === 197 && T.parent.checkType.type) { let k = T.parent.checkType, O = $r(k.type); u = Sn(u, Oi(O, n0(UE(fr(k.typeParameter)), k.typeParameter.constraint ? $r(k.typeParameter.constraint) : Si))) } } } return u && so(u) } function bC(n) { if (!n.constraint) if (n.target) { let a = eu(n.target); n.constraint = a ? Oi(a, n.mapper) : Co } else { let a = sne(n); if (!a) n.constraint = jxe(n) || Co; else { let c = $r(a); c.flags & 1 && !Ro(c) && (c = a.parent.parent.kind === 197 ? Si : ue), n.constraint = c } } return n.constraint === Co ? void 0 : n.constraint } function Hxe(n) { let a = nc(n.symbol, 165), c = H_(a.parent) ? J6(a.parent) : a.parent; return c && vd(c) } function kf(n) { let a = ""; if (n) { let c = n.length, u = 0; for (; u < c;) { let p = n[u].id, h = 1; for (; u + h < c && n[u + h].id === p + h;)h++; a.length && (a += ","), a += p, h > 1 && (a += ":" + h), u += h } } return a } function Wx(n, a) { return n ? `@${$a(n)}` + (a ? `:${kf(a)}` : "") : "" } function qG(n, a) { let c = 0; for (let u of n) (a === void 0 || !(u.flags & a)) && (c |= Ur(u)); return c & 458752 } function zx(n, a) { return vt(a) && n === ro ? ue : _g(n, a) } function _g(n, a) { let c = kf(a), u = n.instantiations.get(c); return u || (u = Bd(4, n.symbol), n.instantiations.set(c, u), u.objectFlags |= a ? qG(a) : 0, u.target = n, u.resolvedTypeArguments = a), u } function Wxe(n) { let a = Rp(n.flags, n.symbol); return a.objectFlags = n.objectFlags, a.target = n.target, a.resolvedTypeArguments = n.resolvedTypeArguments, a } function cne(n, a, c, u, p) { if (!u) { u = R1(a); let T = Xx(u); p = c ? hg(T, c) : T } let h = Bd(4, n.symbol); return h.target = n, h.node = a, h.mapper = c, h.aliasSymbol = u, h.aliasTypeArguments = p, h } function Ko(n) { var a, c; if (!n.resolvedTypeArguments) { if (!cf(n, 6)) return ((a = n.target.localTypeParameters) == null ? void 0 : a.map(() => ve)) || Je; let u = n.node, p = u ? u.kind === 180 ? Qi(n.target.outerTypeParameters, oU(u, n.target.localTypeParameters)) : u.kind === 185 ? [$r(u.elementType)] : on(u.elements, $r) : Je; If() ? n.resolvedTypeArguments = n.mapper ? hg(p, n.mapper) : p : (n.resolvedTypeArguments = ((c = n.target.localTypeParameters) == null ? void 0 : c.map(() => ve)) || Je, Fe(n.node || P, n.target.symbol ? _.Type_arguments_for_0_circularly_reference_themselves : _.Tuple_type_arguments_circularly_reference_themselves, n.target.symbol && E(n.target.symbol))) } return n.resolvedTypeArguments } function Vv(n) { return Fn(n.target.typeParameters) } function zxe(n, a) { let c = gs(No(a)), u = c.localTypeParameters; if (u) { let p = Fn(n.typeArguments), h = Mp(u), T = Yn(n); if (!(!ge && T) && (p < h || p > u.length)) { let H = T && Vg(n) && !x2(n.parent), J = h === u.length ? H ? _.Expected_0_type_arguments_provide_these_with_an_extends_tag : _.Generic_type_0_requires_1_type_argument_s : H ? _.Expected_0_1_type_arguments_provide_these_with_an_extends_tag : _.Generic_type_0_requires_between_1_and_2_type_arguments, de = Ee(c, void 0, 2); if (Fe(n, J, de, h, u.length), !T) return ve } if (n.kind === 180 && uAe(n, Fn(n.typeArguments) !== u.length)) return cne(c, n, void 0); let O = Qi(c.outerTypeParameters, Sy(aM(n), u, h, T)); return _g(c, O) } return $b(n, a) ? c : ve } function Jx(n, a, c, u) { let p = gs(n); if (p === Q && rN.has(n.escapedName) && a && a.length === 1) return w1(n, a[0]); let h = Ai(n), T = h.typeParameters, k = kf(a) + Wx(c, u), O = h.instantiations.get(k); return O || h.instantiations.set(k, O = zAe(p, Wu(T, Sy(a, T, Mp(T), Yn(n.valueDeclaration))), c, u)), O } function sKe(n, a) { if (ac(a) & 1048576) { let p = aM(n), h = Wx(a, p), T = Cr.get(h); return T || (T = Cc(1, "error"), T.aliasSymbol = a, T.aliasTypeArguments = p, Cr.set(h, T)), T } let c = gs(a), u = Ai(a).typeParameters; if (u) { let p = Fn(n.typeArguments), h = Mp(u); if (p < h || p > u.length) return Fe(n, h === u.length ? _.Generic_type_0_requires_1_type_argument_s : _.Generic_type_0_requires_between_1_and_2_type_arguments, E(a), h, u.length), ve; let T = R1(n), k = T && (Jxe(a) || !Jxe(T)) ? T : void 0, O; if (k) O = Xx(k); else if (_6(n)) { let H = Kx(n, 2097152, !0); if (H && H !== Ht) { let J = wc(H); J && J.flags & 524288 && (k = J, O = aM(n) || (u ? [] : void 0)) } } return Jx(a, aM(n), k, O) } return $b(n, a) ? c : ve } function Jxe(n) { var a; let c = (a = n.declarations) == null ? void 0 : a.find(sR); return !!(c && Xd(c)) } function cKe(n) { switch (n.kind) { case 180: return n.typeName; case 230: let a = n.expression; if (bc(a)) return a } } function Kxe(n) { return n.parent ? `${Kxe(n.parent)}.${n.escapedName}` : n.escapedName } function XG(n) { let c = (n.kind === 163 ? n.right : n.kind === 208 ? n.name : n).escapedText; if (c) { let u = n.kind === 163 ? XG(n.left) : n.kind === 208 ? XG(n.expression) : void 0, p = u ? `${Kxe(u)}.${c}` : c, h = dr.get(p); return h || (dr.set(p, h = wo(524288, c, 1048576)), h.parent = u, h.links.declaredType = nt), h } return Ht } function Kx(n, a, c) { let u = cKe(n); if (!u) return Ht; let p = uc(u, a, c); return p && p !== Ht ? p : c ? Ht : XG(u) } function YG(n, a) { if (a === Ht) return ve; if (a = Iv(a) || a, a.flags & 96) return zxe(n, a); if (a.flags & 524288) return sKe(n, a); let c = pxe(a); if (c) return $b(n, a) ? Hu(c) : ve; if (a.flags & 111551 && $G(n)) { let u = lKe(n, a); return u || (Kx(n, 788968), zn(a)) } return ve } function lKe(n, a) { let c = Rr(n); if (!c.resolvedJSDocType) { let u = zn(a), p = u; if (a.valueDeclaration) { let h = n.kind === 202 && n.qualifier; u.symbol && u.symbol !== a && h && (p = YG(n, u.symbol)) } c.resolvedJSDocType = p } return c.resolvedJSDocType } function lne(n, a) { if (a.flags & 3 || a === n || n.flags & 1) return n; let c = `${ru(n)}>${ru(a)}`, u = Dt.get(c); if (u) return u; let p = ch(33554432); return p.baseType = n, p.constraint = a, Dt.set(c, p), p } function une(n) { return so([n.constraint, n.baseType]) } function qxe(n) { return n.kind === 186 && n.elements.length === 1 } function Xxe(n, a, c) { return qxe(a) && qxe(c) ? Xxe(n, a.elements[0], c.elements[0]) : Cy($r(a)) === Cy(n) ? $r(c) : void 0 } function uKe(n, a) { let c, u = !0; for (; a && !ca(a) && a.kind !== 323;) { let p = a.parent; if (p.kind === 166 && (u = !u), (u || n.flags & 8650752) && p.kind === 191 && a === p.trueType) { let h = Xxe(n, p.checkType, p.extendsType); h && (c = Sn(c, h)) } else if (n.flags & 262144 && p.kind === 197 && a === p.type) { let h = $r(p); if (w_(h) === Cy(n)) { let T = Nne(h); if (T) { let k = eu(T); k && Im(k, JE) && (c = Sn(c, Gr([rt, Fa]))) } } } a = p } return c ? lne(n, so(c)) : n } function $G(n) { return !!(n.flags & 8388608) && (n.kind === 180 || n.kind === 202) } function $b(n, a) { return n.typeArguments ? (Fe(n, _.Type_0_is_not_generic, a ? E(a) : n.typeName ? os(n.typeName) : nN), !1) : !0 } function Yxe(n) { if (Re(n.typeName)) { let a = n.typeArguments; switch (n.typeName.escapedText) { case "String": return $b(n), ae; case "Number": return $b(n), rt; case "Boolean": return $b(n), Te; case "Void": return $b(n), yt; case "Undefined": return $b(n), Oe; case "Null": return $b(n), ln; case "Function": case "function": return $b(n), Hs; case "array": return (!a || !a.length) && !ge ? Et : void 0; case "promise": return (!a || !a.length) && !ge ? jM(Se) : void 0; case "Object": if (a && a.length === 2) { if (U6(n)) { let c = $r(a[0]), u = $r(a[1]), p = c === ae || c === rt ? [Fp(c, u, !1)] : Je; return ls(void 0, q, Je, Je, p) } return Se } return $b(n), ge ? void 0 : Se } } } function dKe(n) { let a = $r(n.type); return U ? TB(a, 65536) : a } function dne(n) { let a = Rr(n); if (!a.resolvedType) { if (Ch(n) && pT(n.parent)) return a.resolvedSymbol = Ht, a.resolvedType = Ic(n.parent.expression); let c, u, p = 788968; $G(n) && (u = Yxe(n), u || (c = Kx(n, p, !0), c === Ht ? c = Kx(n, p | 111551) : Kx(n, p), u = YG(n, c))), u || (c = Kx(n, p), u = YG(n, c)), a.resolvedSymbol = c, a.resolvedType = u } return a.resolvedType } function aM(n) { return on(n.typeArguments, $r) } function $xe(n) { let a = Rr(n); if (!a.resolvedType) { let c = _Ie(n); a.resolvedType = Hu(Sd(c)) } return a.resolvedType } function Qxe(n, a) { function c(p) { let h = p.declarations; if (h) for (let T of h) switch (T.kind) { case 260: case 261: case 263: return T } } if (!n) return a ? ro : Ki; let u = gs(n); return u.flags & 524288 ? Fn(u.typeParameters) !== a ? (Fe(c(n), _.Global_type_0_must_have_1_type_parameter_s, fc(n), a), a ? ro : Ki) : u : (Fe(c(n), _.Global_type_0_must_be_a_class_or_interface_type, fc(n)), a ? ro : Ki) } function fne(n, a) { return nD(n, 111551, a ? _.Cannot_find_global_value_0 : void 0) } function Zxe(n, a) { return nD(n, 788968, a ? _.Cannot_find_global_type_0 : void 0) } function QG(n, a, c) { let u = nD(n, 788968, c ? _.Cannot_find_global_type_0 : void 0); if (u && (gs(u), Fn(Ai(u).typeParameters) !== a)) { let p = u.declarations && wr(u.declarations, Ep); Fe(p, _.Global_type_0_must_have_1_type_parameter_s, fc(u), a); return } return u } function nD(n, a, c) { return zs(void 0, n, a, c, n, !1, !1, !1) } function Fc(n, a, c) { let u = Zxe(n, c); return u || c ? Qxe(u, a) : void 0 } function fKe() { return xt || (xt = Fc("TypedPropertyDescriptor", 1, !0) || ro) } function _Ke() { return Md || (Md = Fc("TemplateStringsArray", 0, !0) || Ki) } function eAe() { return zf || (zf = Fc("ImportMeta", 0, !0) || Ki) } function tAe() { if (!Io) { let n = wo(0, "ImportMetaExpression"), a = eAe(), c = wo(4, "meta", 8); c.parent = n, c.links.type = a; let u = Ua([c]); n.members = u, Io = ls(n, u, Je, Je, Je) } return Io } function nAe(n) { return Jf || (Jf = Fc("ImportCallOptions", 0, n)) || Ki } function rAe(n) { return ee || (ee = fne("Symbol", n)) } function pKe(n) { return Ze || (Ze = Zxe("SymbolConstructor", n)) } function iAe() { return At || (At = Fc("Symbol", 0, !1)) || Ki } function oM(n) { return qt || (qt = Fc("Promise", 1, n)) || ro } function aAe(n) { return Ln || (Ln = Fc("PromiseLike", 1, n)) || ro } function _ne(n) { return mr || (mr = fne("Promise", n)) } function mKe(n) { return Vr || (Vr = Fc("PromiseConstructorLike", 0, n)) || Ki } function ZG(n) { return Pd || (Pd = Fc("AsyncIterable", 1, n)) || ro } function hKe(n) { return Dc || (Dc = Fc("AsyncIterator", 3, n)) || ro } function gKe(n) { return gd || (gd = Fc("AsyncIterableIterator", 1, n)) || ro } function yKe(n) { return Zl || (Zl = Fc("AsyncGenerator", 3, n)) || ro } function pne(n) { return gi || (gi = Fc("Iterable", 1, n)) || ro } function vKe(n) { return Ea || (Ea = Fc("Iterator", 3, n)) || ro } function bKe(n) { return bo || (bo = Fc("IterableIterator", 1, n)) || ro } function EKe(n) { return Qo || (Qo = Fc("Generator", 3, n)) || ro } function TKe(n) { return Cs || (Cs = Fc("IteratorYieldResult", 1, n)) || ro } function SKe(n) { return Bu || (Bu = Fc("IteratorReturnResult", 1, n)) || ro } function oAe(n, a = 0) { let c = nD(n, 788968, void 0); return c && Qxe(c, a) } function xKe() { return Fd || (Fd = QG("Extract", 2, !0) || Ht), Fd === Ht ? void 0 : Fd } function AKe() { return E_ || (E_ = QG("Omit", 2, !0) || Ht), E_ === Ht ? void 0 : E_ } function mne(n) { return Y_ || (Y_ = QG("Awaited", 1, n) || (n ? Ht : void 0)), Y_ === Ht ? void 0 : Y_ } function CKe() { return M || (M = Fc("BigInt", 0, !1)) || Ki } function IKe(n) { var a; return (a = Pn ?? (Pn = Fc("ClassDecoratorContext", 1, n))) != null ? a : ro } function LKe(n) { var a; return (a = la ?? (la = Fc("ClassMethodDecoratorContext", 2, n))) != null ? a : ro } function kKe(n) { var a; return (a = oa ?? (oa = Fc("ClassGetterDecoratorContext", 2, n))) != null ? a : ro } function DKe(n) { var a; return (a = be ?? (be = Fc("ClassSetterDecoratorContext", 2, n))) != null ? a : ro } function wKe(n) { var a; return (a = De ?? (De = Fc("ClassAccessorDecoratorContext", 2, n))) != null ? a : ro } function RKe(n) { var a; return (a = mt ?? (mt = Fc("ClassAccessorDecoratorTarget", 2, n))) != null ? a : ro } function OKe(n) { var a; return (a = St ?? (St = Fc("ClassAccessorDecoratorResult", 2, n))) != null ? a : ro } function NKe(n) { var a; return (a = Zt ?? (Zt = Fc("ClassFieldDecoratorContext", 2, n))) != null ? a : ro } function PKe() { return He || (He = fne("NaN", !1)) } function MKe() { return Nt || (Nt = QG("Record", 2, !0) || Ht), Nt === Ht ? void 0 : Nt } function rD(n, a) { return n !== ro ? _g(n, a) : Ki } function sAe(n) { return rD(fKe(), [n]) } function cAe(n) { return rD(pne(!0), [n]) } function nu(n, a) { return rD(a ? jo : $o, [n]) } function hne(n) { switch (n.kind) { case 187: return 2; case 188: return lAe(n); case 199: return n.questionToken ? 2 : n.dotDotDotToken ? lAe(n) : 1; default: return 1 } } function lAe(n) { return uM(n.type) ? 4 : 8 } function FKe(n) { let a = BKe(n.parent); if (uM(n)) return a ? jo : $o; let u = on(n.elements, hne), p = vt(n.elements, h => h.kind !== 199); return gne(u, a, p ? void 0 : n.elements) } function uAe(n, a) { return !!R1(n) || dAe(n) && (n.kind === 185 ? xy(n.elementType) : n.kind === 186 ? vt(n.elements, xy) : a || vt(n.typeArguments, xy)) } function dAe(n) { let a = n.parent; switch (a.kind) { case 193: case 199: case 180: case 189: case 190: case 196: case 191: case 195: case 185: case 186: return dAe(a); case 262: return !0 }return !1 } function xy(n) { switch (n.kind) { case 180: return $G(n) || !!(Kx(n, 788968).flags & 524288); case 183: return !0; case 195: return n.operator !== 156 && xy(n.type); case 193: case 187: case 199: case 319: case 317: case 318: case 312: return xy(n.type); case 188: return n.type.kind !== 185 || xy(n.type.elementType); case 189: case 190: return vt(n.types, xy); case 196: return xy(n.objectType) || xy(n.indexType); case 191: return xy(n.checkType) || xy(n.extendsType) || xy(n.trueType) || xy(n.falseType) }return !1 } function GKe(n) { let a = Rr(n); if (!a.resolvedType) { let c = FKe(n); if (c === ro) a.resolvedType = Ki; else if (!(n.kind === 186 && vt(n.elements, u => !!(hne(u) & 8))) && uAe(n)) a.resolvedType = n.kind === 186 && n.elements.length === 0 ? c : cne(c, n, void 0); else { let u = n.kind === 185 ? [$r(n.elementType)] : on(n.elements, $r); a.resolvedType = yne(c, u) } } return a.resolvedType } function BKe(n) { return RS(n) && n.operator === 146 } function ap(n, a, c = !1, u) { let p = gne(a || on(n, h => 1), c, u); return p === ro ? Ki : n.length ? yne(p, n) : p } function gne(n, a, c) { if (n.length === 1 && n[0] & 4) return a ? jo : $o; let u = on(n, h => h & 1 ? "#" : h & 2 ? "?" : h & 4 ? "." : "*").join() + (a ? "R" : "") + (c && c.length ? "," + on(c, zo).join(",") : ""), p = kn.get(u); return p || kn.set(u, p = UKe(n, a, c)), p } function UKe(n, a, c) { let u = n.length, p = Oy(n, de => !!(de & 9)), h, T = [], k = 0; if (u) { h = new Array(u); for (let de = 0; de < u; de++) { let Ae = h[de] = rd(), xe = n[de]; if (k |= xe, !(k & 12)) { let tt = wo(4 | (xe & 2 ? 16777216 : 0), "" + de, a ? 8 : 0); tt.links.tupleLabelDeclaration = c?.[de], tt.links.type = Ae, T.push(tt) } } } let O = T.length, H = wo(4, "length", a ? 8 : 0); if (k & 12) H.links.type = rt; else { let de = []; for (let Ae = p; Ae <= u; Ae++)de.push(op(Ae)); H.links.type = Gr(de) } T.push(H); let J = Bd(12); return J.typeParameters = h, J.outerTypeParameters = void 0, J.localTypeParameters = h, J.instantiations = new Map, J.instantiations.set(kf(J.typeParameters), J), J.target = J, J.resolvedTypeArguments = J.typeParameters, J.thisType = rd(), J.thisType.isThisType = !0, J.thisType.constraint = J, J.declaredProperties = T, J.declaredCallSignatures = Je, J.declaredConstructSignatures = Je, J.declaredIndexInfos = Je, J.elementFlags = n, J.minLength = p, J.fixedLength = O, J.hasRestElement = !!(k & 12), J.combinedFlags = k, J.readonly = a, J.labeledElementDeclarations = c, J } function yne(n, a) { return n.objectFlags & 8 ? fAe(n, a) : _g(n, a) } function fAe(n, a) { var c, u, p; if (!(n.combinedFlags & 14)) return _g(n, a); if (n.combinedFlags & 8) { let xe = Yc(a, (tt, It) => !!(n.elementFlags[It] & 8 && tt.flags & 1179648)); if (xe >= 0) return cM(on(a, (tt, It) => n.elementFlags[It] & 8 ? tt : ue)) ? Ls(a[xe], tt => fAe(n, UU(a, xe, tt))) : ve } let h = [], T = [], k = [], O = -1, H = -1, J = -1; for (let xe = 0; xe < a.length; xe++) { let tt = a[xe], It = n.elementFlags[xe]; if (It & 8) if (tt.flags & 58982400 || df(tt)) Ae(tt, 8, (c = n.labeledElementDeclarations) == null ? void 0 : c[xe]); else if (po(tt)) { let Tn = Ko(tt); if (Tn.length + h.length >= 1e4) return Fe(P, Gm(P) ? _.Type_produces_a_tuple_type_that_is_too_large_to_represent : _.Expression_produces_a_tuple_type_that_is_too_large_to_represent), ve; mn(Tn, (un, Nn) => { var en; return Ae(un, tt.target.elementFlags[Nn], (en = tt.target.labeledElementDeclarations) == null ? void 0 : en[Nn]) }) } else Ae(Kv(tt) && fg(tt, rt) || ve, 4, (u = n.labeledElementDeclarations) == null ? void 0 : u[xe]); else Ae(tt, It, (p = n.labeledElementDeclarations) == null ? void 0 : p[xe]) } for (let xe = 0; xe < O; xe++)T[xe] & 2 && (T[xe] = 1); H >= 0 && H < J && (h[H] = Gr(Tl(h.slice(H, J + 1), (xe, tt) => T[H + tt] & 8 ? od(xe, rt) : xe)), h.splice(H + 1, J - H), T.splice(H + 1, J - H), k?.splice(H + 1, J - H)); let de = gne(T, n.readonly, k); return de === ro ? Ki : T.length ? _g(de, h) : de; function Ae(xe, tt, It) { tt & 1 && (O = T.length), tt & 4 && H < 0 && (H = T.length), tt & 6 && (J = T.length), h.push(tt & 2 ? ao(xe, !0) : xe), T.push(tt), k && It ? k.push(It) : k = void 0 } } function EC(n, a, c = 0) { let u = n.target, p = Vv(n) - c; return a > u.fixedLength ? IXe(n) || ap(Je) : ap(Ko(n).slice(a, p), u.elementFlags.slice(a, p), !1, u.labeledElementDeclarations && u.labeledElementDeclarations.slice(a, p)) } function _Ae(n) { return Gr(Sn(mae(n.target.fixedLength, a => ff("" + a)), Gp(n.target.readonly ? jo : $o))) } function VKe(n, a) { let c = Yc(n.elementFlags, u => !(u & a)); return c >= 0 ? c : n.elementFlags.length } function sM(n, a) { return n.elementFlags.length - s8(n.elementFlags, c => !(c & a)) - 1 } function jKe(n) { return ao($r(n.type), !0) } function ru(n) { return n.id } function Qb(n, a) { return Py(n, a, ru, Es) >= 0 } function vne(n, a) { let c = Py(n, a, ru, Es); return c < 0 ? (n.splice(~c, 0, a), !0) : !1 } function HKe(n, a, c) { let u = c.flags; if (u & 1048576) return pAe(n, a | (KKe(c) ? 1048576 : 0), c.types); if (!(u & 131072)) if (a |= u & 205258751, u & 465829888 && (a |= 33554432), c === Tt && (a |= 8388608), !U && u & 98304) Ur(c) & 65536 || (a |= 4194304); else { let p = n.length, h = p && c.id > n[p - 1].id ? ~p : Py(n, c, ru, Es); h < 0 && n.splice(~h, 0, c) } return a } function pAe(n, a, c) { for (let u of c) a = HKe(n, a, u); return a } function WKe(n, a) { var c; if (n.length < 2) return n; let u = kf(n), p = pn.get(u); if (p) return p; let h = a && vt(n, H => !!(H.flags & 524288) && !df(H) && Vne(R_(H))), T = n.length, k = T, O = 0; for (; k > 0;) { k--; let H = n[k]; if (h || H.flags & 469499904) { let J = H.flags & 61603840 ? wr(Jo(H), Ae => N_(zn(Ae))) : void 0, de = J && Hu(zn(J)); for (let Ae of n) if (H !== Ae) { if (O === 1e5 && O / (T - k) * T > 1e6) { (c = ai) == null || c.instant(ai.Phase.CheckTypes, "removeSubtypes_DepthLimit", { typeIds: n.map(tt => tt.id) }), Fe(P, _.Expression_produces_a_union_type_that_is_too_complex_to_represent); return } if (O++, J && Ae.flags & 61603840) { let xe = Vc(Ae, J.escapedName); if (xe && N_(xe) && Hu(xe) !== de) continue } if (Bp(H, Ae, x_) && (!(Ur(Bx(H)) & 1) || !(Ur(Bx(Ae)) & 1) || r0(H, Ae))) { y0(n, k); break } } } } return pn.set(u, n), n } function zKe(n, a, c) { let u = n.length; for (; u > 0;) { u--; let p = n[u], h = p.flags; (h & 402653312 && a & 4 || h & 256 && a & 8 || h & 2048 && a & 64 || h & 8192 && a & 4096 || c && h & 32768 && a & 16384 || t0(p) && Qb(n, p.regularType)) && y0(n, u) } } function JKe(n) { let a = Pr(n, c => !!(c.flags & 134217728) && qx(c)); if (a.length) { let c = n.length; for (; c > 0;) { c--; let u = n[c]; u.flags & 128 && vt(a, p => _re(u, p)) && y0(n, c) } } } function KKe(n) { return !!(n.flags & 1048576 && (n.aliasSymbol || n.origin)) } function mAe(n, a) { for (let c of a) if (c.flags & 1048576) { let u = c.origin; c.aliasSymbol || u && !(u.flags & 1048576) ? Of(n, c) : u && u.flags & 1048576 && mAe(n, u.types) } } function bne(n, a) { let c = L1(n); return c.types = a, c } function Gr(n, a = 1, c, u, p) { if (n.length === 0) return lt; if (n.length === 1) return n[0]; let h = [], T = pAe(h, 0, n); if (a !== 0) { if (T & 3) return T & 1 ? T & 8388608 ? Tt : Se : T & 65536 || Qb(h, ue) ? ue : G; if (T & 32768 && h.length >= 2 && h[0] === Oe && h[1] === Ge && y0(h, 1), (T & 402664352 || T & 16384 && T & 32768) && zKe(h, T, !!(a & 2)), T & 128 && T & 134217728 && JKe(h), a === 2 && (h = WKe(h, !!(T & 524288)), !h)) return ve; if (h.length === 0) return T & 65536 ? T & 4194304 ? ln : ir : T & 32768 ? T & 4194304 ? Oe : je : lt } if (!p && T & 1048576) { let O = []; mAe(O, n); let H = []; for (let de of h) vt(O, Ae => Qb(Ae.types, de)) || H.push(de); if (!c && O.length === 1 && H.length === 0) return O[0]; if (ou(O, (de, Ae) => de + Ae.types.length, 0) + H.length === h.length) { for (let de of O) vne(H, de); p = bne(1048576, H) } } let k = (T & 36323363 ? 0 : 32768) | (T & 2097152 ? 16777216 : 0); return Tne(h, k, c, u, p) } function qKe(n, a) { let c, u = []; for (let h of n) { let T = Lf(h); if (!T || T.kind === 2 || T.kind === 3) { if (a !== 2097152) continue; return } if (c) { if (!Ene(c, T)) return } else c = T; u.push(T.type) } if (!c) return; let p = Gxe(u, a); return iM(c.kind, c.parameterName, c.parameterIndex, p) } function Ene(n, a) { return n.kind === a.kind && n.parameterIndex === a.parameterIndex } function Tne(n, a, c, u, p) { if (n.length === 0) return lt; if (n.length === 1) return n[0]; let T = (p ? p.flags & 1048576 ? `|${kf(p.types)}` : p.flags & 2097152 ? `&${kf(p.types)}` : `#${p.type.id}|${kf(n)}` : kf(n)) + Wx(c, u), k = _n.get(T); return k || (k = ch(1048576), k.objectFlags = a | qG(n, 98304), k.types = n, k.origin = p, k.aliasSymbol = c, k.aliasTypeArguments = u, n.length === 2 && n[0].flags & 512 && n[1].flags & 512 && (k.flags |= 16, k.intrinsicName = "boolean"), _n.set(T, k)), k } function XKe(n) { let a = Rr(n); if (!a.resolvedType) { let c = R1(n); a.resolvedType = Gr(on(n.types, $r), 1, c, Xx(c)) } return a.resolvedType } function YKe(n, a, c) { let u = c.flags; return u & 2097152 ? hAe(n, a, c.types) : (hh(c) ? a & 16777216 || (a |= 16777216, n.set(c.id.toString(), c)) : (u & 3 ? c === Tt && (a |= 8388608) : (U || !(u & 98304)) && (c === Ge && (a |= 262144, c = Oe), n.has(c.id.toString()) || (c.flags & 109472 && a & 109472 && (a |= 67108864), n.set(c.id.toString(), c))), a |= u & 205258751), a) } function hAe(n, a, c) { for (let u of c) a = YKe(n, a, Hu(u)); return a } function $Ke(n, a) { let c = n.length; for (; c > 0;) { c--; let u = n[c]; (u.flags & 4 && a & 402653312 || u.flags & 8 && a & 256 || u.flags & 64 && a & 2048 || u.flags & 4096 && a & 8192 || u.flags & 16384 && a & 32768 || hh(u) && a & 470302716) && y0(n, c) } } function QKe(n, a) { for (let c of n) if (!Qb(c.types, a)) { let u = a.flags & 128 ? ae : a.flags & 256 ? rt : a.flags & 2048 ? Ot : a.flags & 8192 ? j : void 0; if (!u || !Qb(c.types, u)) return !1 } return !0 } function ZKe(n) { let a = n.length, c = Pr(n, u => !!(u.flags & 128)); for (; a > 0;) { a--; let u = n[a]; if (u.flags & 134217728) { for (let p of c) if (Iy(p, u)) { y0(n, a); break } else if (qx(u)) return !0 } } return !1 } function gAe(n, a) { return Ji(n, c => !!(c.flags & 1048576) && vt(c.types, u => !!(u.flags & a))) } function yAe(n, a) { for (let c = 0; c < n.length; c++)n[c] = jc(n[c], u => !(u.flags & a)) } function eqe(n) { let a, c = Yc(n, T => !!(Ur(T) & 32768)); if (c < 0) return !1; let u = c + 1; for (; u < n.length;) { let T = n[u]; Ur(T) & 32768 ? ((a || (a = [n[c]])).push(T), y0(n, u)) : u++ } if (!a) return !1; let p = [], h = []; for (let T of a) for (let k of T.types) vne(p, k) && QKe(a, k) && vne(h, k); return n[c] = Tne(h, 32768), !0 } function tqe(n, a, c) { let u = ch(2097152); return u.objectFlags = qG(n, 98304), u.types = n, u.aliasSymbol = a, u.aliasTypeArguments = c, u } function so(n, a, c, u) { let p = new Map, h = hAe(p, 0, n), T = lo(p.values()); if (h & 131072) return ya(T, Qe) ? Qe : lt; if (U && h & 98304 && h & 84410368 || h & 67108864 && h & 402783228 || h & 402653316 && h & 67238776 || h & 296 && h & 469891796 || h & 2112 && h & 469889980 || h & 12288 && h & 469879804 || h & 49152 && h & 469842940 || h & 134217728 && h & 128 && ZKe(T)) return lt; if (h & 1) return h & 8388608 ? Tt : Se; if (!U && h & 98304) return h & 16777216 ? lt : h & 32768 ? Oe : ln; if ((h & 4 && h & 402653312 || h & 8 && h & 256 || h & 64 && h & 2048 || h & 4096 && h & 8192 || h & 16384 && h & 32768 || h & 16777216 && h & 470302716) && (u || $Ke(T, h)), h & 262144 && (T[T.indexOf(Oe)] = Ge), T.length === 0) return ue; if (T.length === 1) return T[0]; let k = kf(T) + Wx(a, c), O = Gt.get(k); if (!O) { if (h & 1048576) if (eqe(T)) O = so(T, a, c); else if (gAe(T, 32768)) { let H = vt(T, fD) ? Ge : Oe; yAe(T, 32768), O = Gr([so(T), H], 1, a, c) } else if (gAe(T, 65536)) yAe(T, 65536), O = Gr([so(T), ln], 1, a, c); else { if (!cM(T)) return ve; let H = nqe(T), J = vt(H, de => !!(de.flags & 2097152)) && Sne(H) > Sne(T) ? bne(2097152, T) : void 0; O = Gr(H, 1, a, c, J) } else O = tqe(T, a, c); Gt.set(k, O) } return O } function vAe(n) { return ou(n, (a, c) => c.flags & 1048576 ? a * c.types.length : c.flags & 131072 ? 0 : a, 1) } function cM(n) { var a; let c = vAe(n); return c >= 1e5 ? ((a = ai) == null || a.instant(ai.Phase.CheckTypes, "checkCrossProductUnion_DepthLimit", { typeIds: n.map(u => u.id), size: c }), Fe(P, _.Expression_produces_a_union_type_that_is_too_complex_to_represent), !1) : !0 } function nqe(n) { let a = vAe(n), c = []; for (let u = 0; u < a; u++) { let p = n.slice(), h = u; for (let k = n.length - 1; k >= 0; k--)if (n[k].flags & 1048576) { let O = n[k].types, H = O.length; p[k] = O[h % H], h = Math.floor(h / H) } let T = so(p); T.flags & 131072 || c.push(T) } return c } function bAe(n) { return !(n.flags & 3145728) || n.aliasSymbol ? 1 : n.flags & 1048576 && n.origin ? bAe(n.origin) : Sne(n.types) } function Sne(n) { return ou(n, (a, c) => a + bAe(c), 0) } function rqe(n) { let a = Rr(n); if (!a.resolvedType) { let c = R1(n), u = on(n.types, $r), p = u.length === 2 && !!(u[0].flags & 76) && u[1] === mc; a.resolvedType = so(u, c, Xx(c), p) } return a.resolvedType } function EAe(n, a) { let c = ch(4194304); return c.type = n, c.stringsOnly = a, c } function iqe(n) { let a = L1(4194304); return a.type = n, a } function TAe(n, a) { return a ? n.resolvedStringIndexType || (n.resolvedStringIndexType = EAe(n, !0)) : n.resolvedIndexType || (n.resolvedIndexType = EAe(n, !1)) } function aqe(n, a, c) { let u = w_(n), p = rp(n), h = by(n.target || n); if (!h && !c) return p; let T = []; if (Yk(n)) { if (jv(p)) return TAe(n, a); { let H = Eu(yC(n)); Ute(H, 8576, a, O) } } else QE(ZP(p), O); jv(p) && QE(p, O); let k = c ? jc(Gr(T), H => !(H.flags & 5)) : Gr(T); if (k.flags & 1048576 && p.flags & 1048576 && kf(k.types) === kf(p.types)) return p; return k; function O(H) { let J = h ? Oi(h, oD(n.mapper, u, H)) : H; T.push(J === ae ? ei : J) } } function oqe(n) { let a = w_(n); return c(by(n) || a); function c(u) { return u.flags & 202375167 ? !0 : u.flags & 16777216 ? u.root.isDistributive && u.checkType === a : u.flags & 137363456 ? Ji(u.types, c) : u.flags & 8388608 ? c(u.objectType) && c(u.indexType) : u.flags & 33554432 ? c(u.baseType) && c(u.constraint) : u.flags & 268435456 ? c(u.type) : !1 } } function pg(n) { return pi(n) ? lt : Re(n) ? ff(Gi(n.escapedText)) : Hu(ts(n) ? vg(n) : Yi(n)) } function TC(n, a, c) { if (c || !(Ef(n) & 24)) { let u = Ai(zG(n)).nameType; if (!u) { let p = sa(n.valueDeclaration); u = n.escapedName === "default" ? ff("default") : p && pg(p) || (gR(n) ? void 0 : ff(fc(n))) } if (u && u.flags & a) return u } return lt } function SAe(n, a) { return !!(n.flags & a || n.flags & 2097152 && vt(n.types, c => SAe(c, a))) } function sqe(n, a, c) { let u = c && (Ur(n) & 7 || n.aliasSymbol) ? iqe(n) : void 0, p = on(Jo(n), T => TC(T, a)), h = on(tu(n), T => T !== yu && SAe(T.keyType, a) ? T.keyType === ae && a & 8 ? ei : T.keyType : lt); return Gr(Qi(p, h), 1, void 0, void 0, u) } function cqe(n) { let a = Wqe(n); return O_(a) !== a } function xAe(n) { return !!(n.flags & 58982400 || Qx(n) || df(n) && !oqe(n) || n.flags & 1048576 && vt(n.types, cqe) || n.flags & 2097152 && Js(n, 465829888) && vt(n.types, hh)) } function Gp(n, a = we, c) { return n = O_(n), xAe(n) ? TAe(n, a) : n.flags & 1048576 ? so(on(n.types, u => Gp(u, a, c))) : n.flags & 2097152 ? Gr(on(n.types, u => Gp(u, a, c))) : Ur(n) & 32 ? aqe(n, a, c) : n === Tt ? Tt : n.flags & 2 ? lt : n.flags & 131073 ? Si : sqe(n, (c ? 128 : 402653316) | (a ? 0 : 12584), a === we && !c) } function AAe(n) { if (we) return n; let a = xKe(); return a ? Jx(a, [n, ae]) : ae } function lqe(n) { let a = AAe(Gp(n)); return a.flags & 131072 ? ae : a } function uqe(n) { let a = Rr(n); if (!a.resolvedType) switch (n.operator) { case 141: a.resolvedType = Gp($r(n.type)); break; case 156: a.resolvedType = n.type.kind === 153 ? wne(dR(n.parent)) : ve; break; case 146: a.resolvedType = $r(n.type); break; default: throw L.assertNever(n.operator) }return a.resolvedType } function dqe(n) { let a = Rr(n); return a.resolvedType || (a.resolvedType = WE([n.head.text, ...on(n.templateSpans, c => c.literal.text)], on(n.templateSpans, c => $r(c.type)))), a.resolvedType } function WE(n, a) { let c = Yc(a, H => !!(H.flags & 1179648)); if (c >= 0) return cM(a) ? Ls(a[c], H => WE(n, UU(a, c, H))) : ve; if (ya(a, Tt)) return Tt; let u = [], p = [], h = n[0]; if (!O(n, a)) return ae; if (u.length === 0) return ff(h); if (p.push(h), Ji(p, H => H === "")) { if (Ji(u, H => !!(H.flags & 4))) return ae; if (u.length === 1 && qx(u[0])) return u[0] } let T = `${kf(u)}|${on(p, H => H.length).join(",")}|${p.join("")}`, k = pt.get(T); return k || pt.set(T, k = _qe(p, u)), k; function O(H, J) { let de = ba(H); for (let Ae = 0; Ae < J.length; Ae++) { let xe = J[Ae], tt = de ? H[Ae + 1] : H; if (xe.flags & 101248) { if (h += fqe(xe) || "", h += tt, !de) return !0 } else if (xe.flags & 134217728) { if (h += xe.texts[0], !O(xe.texts, xe.types)) return !1; if (h += tt, !de) return !0 } else if (jv(xe) || tB(xe)) u.push(xe), p.push(h), h = tt; else if (xe.flags & 2097152) { if (!O(H[Ae + 1], xe.types)) return !1 } else if (de) return !1 } return !0 } } function fqe(n) { return n.flags & 128 ? n.value : n.flags & 256 ? "" + n.value : n.flags & 2048 ? j0(n.value) : n.flags & 98816 ? n.intrinsicName : void 0 } function _qe(n, a) { let c = ch(134217728); return c.texts = n, c.types = a, c } function w1(n, a) { return a.flags & 1179648 ? Ls(a, c => w1(n, c)) : a.flags & 128 ? ff(CAe(n, a.value)) : a.flags & 134217728 ? WE(...pqe(n, a.texts, a.types)) : a.flags & 268435456 && n === a.symbol ? a : a.flags & 268435461 || jv(a) ? IAe(n, a) : tB(a) ? IAe(n, WE(["", ""], [a])) : a } function CAe(n, a) { switch (rN.get(n.escapedName)) { case 0: return a.toUpperCase(); case 1: return a.toLowerCase(); case 2: return a.charAt(0).toUpperCase() + a.slice(1); case 3: return a.charAt(0).toLowerCase() + a.slice(1) }return a } function pqe(n, a, c) { switch (rN.get(n.escapedName)) { case 0: return [a.map(u => u.toUpperCase()), c.map(u => w1(n, u))]; case 1: return [a.map(u => u.toLowerCase()), c.map(u => w1(n, u))]; case 2: return [a[0] === "" ? a : [a[0].charAt(0).toUpperCase() + a[0].slice(1), ...a.slice(1)], a[0] === "" ? [w1(n, c[0]), ...c.slice(1)] : c]; case 3: return [a[0] === "" ? a : [a[0].charAt(0).toLowerCase() + a[0].slice(1), ...a.slice(1)], a[0] === "" ? [w1(n, c[0]), ...c.slice(1)] : c] }return [a, c] } function IAe(n, a) { let c = `${$a(n)},${ru(a)}`, u = nn.get(c); return u || nn.set(c, u = mqe(n, a)), u } function mqe(n, a) { let c = Rp(268435456, n); return c.type = a, c } function hqe(n, a, c, u, p) { let h = ch(8388608); return h.objectType = n, h.indexType = a, h.accessFlags = c, h.aliasSymbol = u, h.aliasTypeArguments = p, h } function iD(n) { if (ge) return !1; if (Ur(n) & 4096) return !0; if (n.flags & 1048576) return Ji(n.types, iD); if (n.flags & 2097152) return vt(n.types, iD); if (n.flags & 465829888) { let a = Wte(n); return a !== n && iD(a) } return !1 } function eB(n, a) { return fh(n) ? Np(n) : a && Ys(a) ? M0(a) : void 0 } function xne(n, a) { if (a.flags & 8208) { let c = jn(n.parent, u => !Us(u)) || n.parent; return rS(c) ? Ih(c) && Re(n) && P2e(c, n) : Ji(a.declarations, u => !Ia(u) || !!(G_(u) & 268435456)) } return !0 } function LAe(n, a, c, u, p, h) { var T; let k = p && p.kind === 209 ? p : void 0, O = p && pi(p) ? void 0 : eB(c, p); if (O !== void 0) { if (h & 256) return eT(a, O) || Se; let J = ja(a, O); if (J) { if (h & 64 && p && J.declarations && Sv(J) && xne(p, J)) { let Ae = (T = k?.argumentExpression) != null ? T : OS(p) ? p.indexType : p; Xh(Ae, J.declarations, O) } if (k) { if (MM(J, k, jCe(k.expression, a.symbol)), LIe(k, J, xT(k))) { Fe(k.argumentExpression, _.Cannot_assign_to_0_because_it_is_a_read_only_property, E(J)); return } if (h & 8 && (Rr(p).resolvedSymbol = J), PCe(k, J)) return at } let de = zn(J); return k && xT(k) !== 1 ? Yv(k, de) : p && OS(p) && fD(de) ? Gr([de, Oe]) : de } if (Im(a, po) && Wm(O)) { let de = +O; if (p && Im(a, Ae => !Ae.target.hasRestElement) && !(h & 16)) { let Ae = Ane(p); if (po(a)) { if (de < 0) return Fe(Ae, _.A_tuple_type_cannot_be_indexed_with_a_negative_value), Oe; Fe(Ae, _.Tuple_type_0_of_length_1_has_no_element_at_index_2, Ee(a), Vv(a), Gi(O)) } else Fe(Ae, _.Property_0_does_not_exist_on_type_1, Gi(O), Ee(a)) } if (de >= 0) return H(Cm(a, rt)), Ls(a, Ae => { let xe = bM(Ae) || Oe; return h & 1 ? Gr([xe, Ge]) : xe }) } } if (!(c.flags & 98304) && ul(c, 402665900)) { if (a.flags & 131073) return a; let J = rM(a, c) || Cm(a, ae); if (J) { if (h & 2 && J.keyType !== rt) { k && Fe(k, _.Type_0_cannot_be_used_to_index_type_1, Ee(c), Ee(n)); return } if (p && J.keyType === ae && !ul(c, 12)) { let de = Ane(p); return Fe(de, _.Type_0_cannot_be_used_as_an_index_type, Ee(c)), h & 1 ? Gr([J.type, Ge]) : J.type } return H(J), h & 1 && !(a.symbol && a.symbol.flags & 384 && c.symbol && c.flags & 1024 && ju(c.symbol) === a.symbol) ? Gr([J.type, Ge]) : J.type } if (c.flags & 131072) return lt; if (iD(a)) return Se; if (k && !hie(a)) { if (Xv(a)) { if (ge && c.flags & 384) return Lo.add(hr(k, _.Property_0_does_not_exist_on_type_1, c.value, Ee(a))), Oe; if (c.flags & 12) { let de = on(a.properties, Ae => zn(Ae)); return Gr(Sn(de, Oe)) } } if (a.symbol === Ye && O !== void 0 && Ye.exports.has(O) && Ye.exports.get(O).flags & 418) Fe(k, _.Property_0_does_not_exist_on_type_1, Gi(O), Ee(a)); else if (ge && !Y.suppressImplicitAnyIndexErrors && !(h & 128)) if (O !== void 0 && BCe(O, a)) { let de = Ee(a); Fe(k, _.Property_0_does_not_exist_on_type_1_Did_you_mean_to_access_the_static_member_2_instead, O, de, de + "[" + Qc(k.argumentExpression) + "]") } else if (fg(a, rt)) Fe(k.argumentExpression, _.Element_implicitly_has_an_any_type_because_index_expression_is_not_of_type_number); else { let de; if (O !== void 0 && (de = Xre(O, a))) de !== void 0 && Fe(k.argumentExpression, _.Property_0_does_not_exist_on_type_1_Did_you_mean_2, O, Ee(a), de); else { let Ae = lQe(a, k, c); if (Ae !== void 0) Fe(k, _.Element_implicitly_has_an_any_type_because_type_0_has_no_index_signature_Did_you_mean_to_call_1, Ee(a), Ae); else { let xe; if (c.flags & 1024) xe = da(void 0, _.Property_0_does_not_exist_on_type_1, "[" + Ee(c) + "]", Ee(a)); else if (c.flags & 8192) { let tt = rh(c.symbol, k); xe = da(void 0, _.Property_0_does_not_exist_on_type_1, "[" + tt + "]", Ee(a)) } else c.flags & 128 || c.flags & 256 ? xe = da(void 0, _.Property_0_does_not_exist_on_type_1, c.value, Ee(a)) : c.flags & 12 && (xe = da(void 0, _.No_index_signature_with_a_parameter_of_type_0_was_found_on_type_1, Ee(c), Ee(a))); xe = da(xe, _.Element_implicitly_has_an_any_type_because_expression_of_type_0_can_t_be_used_to_index_type_1, Ee(u), Ee(a)), Lo.add(Lh(Gn(k), k, xe)) } } } return } } if (iD(a)) return Se; if (p) { let J = Ane(p); c.flags & 384 ? Fe(J, _.Property_0_does_not_exist_on_type_1, "" + c.value, Ee(a)) : c.flags & 12 ? Fe(J, _.Type_0_has_no_matching_index_signature_for_type_1, Ee(a), Ee(c)) : Fe(J, _.Type_0_cannot_be_used_as_an_index_type, Ee(c)) } if (Zo(c)) return c; return; function H(J) { J && J.isReadonly && k && (Um(k) || GH(k)) && Fe(k, _.Index_signature_in_type_0_only_permits_reading, Ee(a)) } } function Ane(n) { return n.kind === 209 ? n.argumentExpression : n.kind === 196 ? n.indexType : n.kind === 164 ? n.expression : n } function tB(n) { return !!(n.flags & 77) || qx(n) } function qx(n) { return !!(n.flags & 134217728) && Ji(n.types, tB) || !!(n.flags & 268435456) && tB(n.type) } function SC(n) { return !!aD(n) } function Zb(n) { return !!(aD(n) & 4194304) } function jv(n) { return !!(aD(n) & 8388608) } function aD(n) { return n.flags & 3145728 ? (n.objectFlags & 2097152 || (n.objectFlags |= 2097152 | ou(n.types, (a, c) => a | aD(c), 0)), n.objectFlags & 12582912) : n.flags & 33554432 ? (n.objectFlags & 2097152 || (n.objectFlags |= 2097152 | aD(n.baseType) | aD(n.constraint)), n.objectFlags & 12582912) : (n.flags & 58982400 || df(n) || Qx(n) ? 4194304 : 0) | (n.flags & 465829888 && !qx(n) ? 8388608 : 0) } function mg(n, a) { return n.flags & 8388608 ? yqe(n, a) : n.flags & 16777216 ? vqe(n, a) : n } function kAe(n, a, c) { if (n.flags & 1048576 || n.flags & 2097152 && !xAe(n)) { let u = on(n.types, p => mg(od(p, a), c)); return n.flags & 2097152 || c ? so(u) : Gr(u) } } function gqe(n, a, c) { if (a.flags & 1048576) { let u = on(a.types, p => mg(od(n, p), c)); return c ? so(u) : Gr(u) } } function yqe(n, a) { let c = a ? "simplifiedForWriting" : "simplifiedForReading"; if (n[c]) return n[c] === gc ? n : n[c]; n[c] = gc; let u = mg(n.objectType, a), p = mg(n.indexType, a), h = gqe(u, p, a); if (h) return n[c] = h; if (!(p.flags & 465829888)) { let T = kAe(u, p, a); if (T) return n[c] = T } if (Qx(u) && p.flags & 296) { let T = LC(u, p.flags & 8 ? 0 : u.target.fixedLength, 0, a); if (T) return n[c] = T } if (df(u)) { let T = by(u); if (!T || to(T, w_(u))) return n[c] = Ls(nB(u, n.indexType), k => mg(k, a)) } return n[c] = n } function vqe(n, a) { let c = n.checkType, u = n.extendsType, p = Hv(n), h = Wv(n); if (h.flags & 131072 && Cy(p) === Cy(c)) { if (c.flags & 1 || to(zE(c), zE(u))) return mg(p, a); if (DAe(c, u)) return lt } else if (p.flags & 131072 && Cy(h) === Cy(c)) { if (!(c.flags & 1) && to(zE(c), zE(u))) return lt; if (c.flags & 1 || DAe(c, u)) return mg(h, a) } return n } function DAe(n, a) { return !!(Gr([QP(n, a), lt]).flags & 131072) } function nB(n, a) { let c = Wu([w_(n)], [a]), u = Jv(n.mapper, c); return Oi(_h(n.target || n), u) } function od(n, a, c = 0, u, p, h) { return Ay(n, a, c, u, p, h) || (u ? ve : ue) } function wAe(n, a) { return Im(n, c => { if (c.flags & 384) { let u = Np(c); if (Wm(u)) { let p = +u; return p >= 0 && p < a } } return !1 }) } function Ay(n, a, c = 0, u, p, h) { if (n === Tt || a === Tt) return Tt; if (t2e(n) && !(a.flags & 98304) && ul(a, 12) && (a = ae), Y.noUncheckedIndexedAccess && c & 32 && (c |= 1), jv(a) || (u && u.kind !== 196 ? Qx(n) && !wAe(a, n.target.fixedLength) : Zb(n) && !(po(n) && wAe(a, n.target.fixedLength)))) { if (n.flags & 3) return n; let k = c & 1, O = n.id + "," + a.id + "," + k + Wx(p, h), H = gr.get(O); return H || gr.set(O, H = hqe(n, a, k, p, h)), H } let T = vC(n); if (a.flags & 1048576 && !(a.flags & 16)) { let k = [], O = !1; for (let H of a.types) { let J = LAe(n, T, H, a, u, c | (O ? 128 : 0)); if (J) k.push(J); else if (u) O = !0; else return } return O ? void 0 : c & 4 ? so(k, p, h) : Gr(k, 1, p, h) } return LAe(n, T, a, a, u, c | 8 | 64) } function RAe(n) { let a = Rr(n); if (!a.resolvedType) { let c = $r(n.objectType), u = $r(n.indexType), p = R1(n); a.resolvedType = od(c, u, 0, n, p, Xx(p)) } return a.resolvedType } function Cne(n) { let a = Rr(n); if (!a.resolvedType) { let c = Bd(32, n.symbol); c.declaration = n, c.aliasSymbol = R1(n), c.aliasTypeArguments = Xx(c.aliasSymbol), a.resolvedType = c, rp(c) } return a.resolvedType } function Cy(n) { return n.flags & 33554432 ? Cy(n.baseType) : n.flags & 8388608 && (n.objectType.flags & 33554432 || n.indexType.flags & 33554432) ? od(Cy(n.objectType), Cy(n.indexType)) : n } function bqe(n) { let a = eu(n); return a && (Zb(a) || jv(a)) ? uB(n) : n } function OAe(n) { return p2(n) && Fn(n.elements) > 0 && !vt(n.elements, a => Rz(a) || Oz(a) || bL(a) && !!(a.questionToken || a.dotDotDotToken)) } function NAe(n, a) { return SC(n) || a && po(n) && vt(Ko(n), SC) } function Ine(n, a, c, u) { let p, h, T = 0; for (; ;) { if (T === 1e3) { Fe(P, _.Type_instantiation_is_excessively_deep_and_possibly_infinite), p = ve; break } let O = OAe(n.node.checkType) && OAe(n.node.extendsType) && Fn(n.node.checkType.elements) === Fn(n.node.extendsType.elements), H = Oi(Cy(n.checkType), a), J = NAe(H, O), de = Oi(n.extendsType, a); if (H === Tt || de === Tt) return Tt; let Ae; if (n.inferTypeParameters) { let tt = Tl(n.inferTypeParameters, bqe), It = tt !== n.inferTypeParameters ? Wu(n.inferTypeParameters, tt) : void 0, Tn = _D(tt, void 0, 0); if (It) { let Nn = Jv(a, It); for (let en of tt) n.inferTypeParameters.indexOf(en) === -1 && (en.mapper = Nn) } J || gh(Tn.inferences, H, Oi(de, It), 1536); let un = Jv(It, Tn.mapper); Ae = a ? Jv(un, a) : un } let xe = Ae ? Oi(n.extendsType, Ae) : de; if (!J && !NAe(xe, O)) { if (!(xe.flags & 3) && (H.flags & 1 || !to(dB(H), dB(xe)))) { H.flags & 1 && (h || (h = [])).push(Oi($r(n.node.trueType), Ae || a)); let tt = $r(n.node.falseType); if (tt.flags & 16777216) { let It = tt.root; if (It.node.parent === n.node && (!It.isDistributive || It.checkType === n.checkType)) { n = It; continue } if (k(tt, a)) continue } p = Oi(tt, a); break } if (xe.flags & 3 || to(zE(H), zE(xe))) { let tt = $r(n.node.trueType), It = Ae || a; if (k(tt, It)) continue; p = Oi(tt, It); break } } p = ch(16777216), p.root = n, p.checkType = Oi(n.checkType, a), p.extendsType = Oi(n.extendsType, a), p.mapper = a, p.combinedMapper = Ae, p.aliasSymbol = c || n.aliasSymbol, p.aliasTypeArguments = c ? u : hg(n.aliasTypeArguments, a); break } return h ? Gr(Sn(h, p)) : p; function k(O, H) { if (O.flags & 16777216 && H) { let J = O.root; if (J.outerTypeParameters) { let de = Jv(O.mapper, H), Ae = on(J.outerTypeParameters, It => zv(It, de)), xe = Wu(J.outerTypeParameters, Ae), tt = J.isDistributive ? zv(J.checkType, xe) : void 0; if (!tt || tt === J.checkType || !(tt.flags & 1179648)) return n = J, a = xe, c = void 0, u = void 0, J.aliasSymbol && T++, !0 } } return !1 } } function Hv(n) { return n.resolvedTrueType || (n.resolvedTrueType = Oi($r(n.root.node.trueType), n.mapper)) } function Wv(n) { return n.resolvedFalseType || (n.resolvedFalseType = Oi($r(n.root.node.falseType), n.mapper)) } function Eqe(n) { return n.resolvedInferredTrueType || (n.resolvedInferredTrueType = n.combinedMapper ? Oi($r(n.root.node.trueType), n.combinedMapper) : Hv(n)) } function PAe(n) { let a; return n.locals && n.locals.forEach(c => { c.flags & 262144 && (a = Sn(a, gs(c))) }), a } function Tqe(n) { return n.isDistributive && (fM(n.checkType, n.node.trueType) || fM(n.checkType, n.node.falseType)) } function Sqe(n) { let a = Rr(n); if (!a.resolvedType) { let c = $r(n.checkType), u = R1(n), p = Xx(u), h = hC(n, !0), T = p ? h : Pr(h, O => fM(O, n)), k = { node: n, checkType: c, extendsType: $r(n.extendsType), isDistributive: !!(c.flags & 262144), inferTypeParameters: PAe(n), outerTypeParameters: T, instantiations: void 0, aliasSymbol: u, aliasTypeArguments: p }; a.resolvedType = Ine(k, void 0), T && (k.instantiations = new Map, k.instantiations.set(kf(T), a.resolvedType)) } return a.resolvedType } function xqe(n) { let a = Rr(n); return a.resolvedType || (a.resolvedType = UE(fr(n.typeParameter))), a.resolvedType } function MAe(n) { return Re(n) ? [n] : Sn(MAe(n.left), n.right) } function Aqe(n) { var a; let c = Rr(n); if (!c.resolvedType) { if (!ib(n)) return Fe(n.argument, _.String_literal_expected), c.resolvedSymbol = Ht, c.resolvedType = ve; let u = n.isTypeOf ? 111551 : n.flags & 8388608 ? 900095 : 788968, p = Gl(n, n.argument.literal); if (!p) return c.resolvedSymbol = Ht, c.resolvedType = ve; let h = !!((a = p.exports) != null && a.get("export=")), T = Vu(p, !1); if (rc(n.qualifier)) if (T.flags & u) c.resolvedType = FAe(n, c, T, u); else { let k = u === 111551 ? _.Module_0_does_not_refer_to_a_value_but_is_used_as_a_value_here : _.Module_0_does_not_refer_to_a_type_but_is_used_as_a_type_here_Did_you_mean_typeof_import_0; Fe(n, k, n.argument.literal.text), c.resolvedSymbol = Ht, c.resolvedType = ve } else { let k = MAe(n.qualifier), O = T, H; for (; H = k.shift();) { let J = k.length ? 1920 : u, de = No(Ac(O)), Ae = n.isTypeOf || Yn(n) && h ? ja(zn(de), H.escapedText, !1, !0) : void 0, xe = n.isTypeOf ? void 0 : yd(Gd(de), H.escapedText, J), tt = xe ?? Ae; if (!tt) return Fe(H, _.Namespace_0_has_no_exported_member_1, rh(O), os(H)), c.resolvedType = ve; Rr(H).resolvedSymbol = tt, Rr(H.parent).resolvedSymbol = tt, O = tt } c.resolvedType = FAe(n, c, O, u) } } return c.resolvedType } function FAe(n, a, c, u) { let p = Ac(c); return a.resolvedSymbol = p, u === 111551 ? pIe(zn(c), n) : YG(n, p) } function GAe(n) { let a = Rr(n); if (!a.resolvedType) { let c = R1(n); if (vy(n.symbol).size === 0 && !c) a.resolvedType = mc; else { let u = Bd(16, n.symbol); u.aliasSymbol = c, u.aliasTypeArguments = Xx(c), LL(n) && n.isArrayType && (u = nu(u)), a.resolvedType = u } } return a.resolvedType } function R1(n) { let a = n.parent; for (; wS(a) || UT(a) || RS(a) && a.operator === 146;)a = a.parent; return sR(a) ? fr(a) : void 0 } function Xx(n) { return n ? yy(n) : void 0 } function rB(n) { return !!(n.flags & 524288) && !df(n) } function Lne(n) { return mh(n) || !!(n.flags & 474058748) } function kne(n, a) { if (!(n.flags & 1048576)) return n; if (Ji(n.types, Lne)) return wr(n.types, mh) || Ki; let c = wr(n.types, h => !Lne(h)); if (!c || wr(n.types, h => h !== c && !Lne(h))) return n; return p(c); function p(h) { let T = Ua(); for (let O of Jo(h)) if (!(Ef(O) & 24)) { if (iB(O)) { let H = O.flags & 65536 && !(O.flags & 32768), de = wo(16777220, O.escapedName, Bte(O) | (a ? 8 : 0)); de.links.type = H ? Oe : ao(zn(O), !0), de.declarations = O.declarations, de.links.nameType = Ai(O).nameType, de.links.syntheticOrigin = O, T.set(O.escapedName, de) } } let k = ls(h.symbol, T, Je, Je, tu(h)); return k.objectFlags |= 131200, k } } function e0(n, a, c, u, p) { if (n.flags & 1 || a.flags & 1) return Se; if (n.flags & 2 || a.flags & 2) return ue; if (n.flags & 131072) return a; if (a.flags & 131072) return n; if (n = kne(n, p), n.flags & 1048576) return cM([n, a]) ? Ls(n, H => e0(H, a, c, u, p)) : ve; if (a = kne(a, p), a.flags & 1048576) return cM([n, a]) ? Ls(a, H => e0(n, H, c, u, p)) : ve; if (a.flags & 473960444) return n; if (Zb(n) || Zb(a)) { if (mh(n)) return a; if (n.flags & 2097152) { let H = n.types, J = H[H.length - 1]; if (rB(J) && rB(a)) return so(Qi(H.slice(0, H.length - 1), [e0(J, a, c, u, p)])) } return so([n, a]) } let h = Ua(), T = new Set, k = n === Ki ? tu(a) : xxe([n, a]); for (let H of Jo(a)) Ef(H) & 24 ? T.add(H.escapedName) : iB(H) && h.set(H.escapedName, Dne(H, p)); for (let H of Jo(n)) if (!(T.has(H.escapedName) || !iB(H))) if (h.has(H.escapedName)) { let J = h.get(H.escapedName), de = zn(J); if (J.flags & 16777216) { let Ae = Qi(H.declarations, J.declarations), xe = 4 | H.flags & 16777216, tt = wo(xe, H.escapedName); tt.links.type = Gr([zn(H), tre(de)], 2), tt.links.leftSpread = H, tt.links.rightSpread = J, tt.declarations = Ae, tt.links.nameType = Ai(H).nameType, h.set(H.escapedName, tt) } } else h.set(H.escapedName, Dne(H, p)); let O = ls(c, h, Je, Je, Tl(k, H => Cqe(H, p))); return O.objectFlags |= 2228352 | u, O } function iB(n) { var a; return !vt(n.declarations, xu) && (!(n.flags & 106496) || !((a = n.declarations) != null && a.some(c => Yr(c.parent)))) } function Dne(n, a) { let c = n.flags & 65536 && !(n.flags & 32768); if (!c && a === M_(n)) return n; let u = 4 | n.flags & 16777216, p = wo(u, n.escapedName, Bte(n) | (a ? 8 : 0)); return p.links.type = c ? Oe : zn(n), p.declarations = n.declarations, p.links.nameType = Ai(n).nameType, p.links.syntheticOrigin = n, p } function Cqe(n, a) { return n.isReadonly !== a ? Fp(n.keyType, n.type, a, n.declaration) : n } function lM(n, a, c, u) { let p = Rp(n, c); return p.value = a, p.regularType = u || p, p } function Yx(n) { if (n.flags & 2976) { if (!n.freshType) { let a = lM(n.flags, n.value, n.symbol, n); a.freshType = a, n.freshType = a } return n.freshType } return n } function Hu(n) { return n.flags & 2976 ? n.regularType : n.flags & 1048576 ? n.regularType || (n.regularType = Ls(n, Hu)) : n } function t0(n) { return !!(n.flags & 2976) && n.freshType === n } function ff(n) { let a; return $n.get(n) || ($n.set(n, a = lM(128, n)), a) } function op(n) { let a; return ui.get(n) || (ui.set(n, a = lM(256, n)), a) } function aB(n) { let a, c = j0(n); return Ni.get(c) || (Ni.set(c, a = lM(2048, n)), a) } function Iqe(n, a, c) { let u, p = `${a}${typeof n == "string" ? "@" : "#"}${n}`, h = 1024 | (typeof n == "string" ? 128 : 256); return Pi.get(p) || (Pi.set(p, u = lM(h, n, c)), u) } function Lqe(n) { if (n.literal.kind === 104) return ln; let a = Rr(n); return a.resolvedType || (a.resolvedType = Hu(Yi(n.literal))), a.resolvedType } function kqe(n) { let a = Rp(8192, n); return a.escapedName = `__@${a.symbol.escapedName}@${$a(a.symbol)}`, a } function wne(n) { if (ece(n)) { let a = k6(n) ? vd(n.left) : vd(n); if (a) { let c = Ai(a); return c.uniqueESSymbolType || (c.uniqueESSymbolType = kqe(a)) } } return j } function Dqe(n) { let a = Ku(n, !1, !1), c = a && a.parent; if (c && (Yr(c) || c.kind === 261) && !Ca(a) && (!Ec(a) || AT(n, a.body))) return vu(fr(c)).thisType; if (c && rs(c) && ar(c.parent) && ic(c.parent) === 6) return vu(vd(c.parent.left).parent).thisType; let u = n.flags & 8388608 ? sb(n) : void 0; return u && ms(u) && ar(u.parent) && ic(u.parent) === 3 ? vu(vd(u.parent.left).parent).thisType : cp(a) && AT(n, a.body) ? vu(fr(a)).thisType : (Fe(n, _.A_this_type_is_available_only_in_a_non_static_member_of_a_class_or_interface), ve) } function oB(n) { let a = Rr(n); return a.resolvedType || (a.resolvedType = Dqe(n)), a.resolvedType } function BAe(n) { return $r(uM(n.type) || n.type) } function uM(n) { switch (n.kind) { case 193: return uM(n.type); case 186: if (n.elements.length === 1 && (n = n.elements[0], n.kind === 188 || n.kind === 199 && n.dotDotDotToken)) return uM(n.type); break; case 185: return n.elementType } } function wqe(n) { let a = Rr(n); return a.resolvedType || (a.resolvedType = n.dotDotDotToken ? BAe(n) : ao($r(n.type), !0, !!n.questionToken)) } function $r(n) { return uKe(UAe(n), n) } function UAe(n) { switch (n.kind) { case 131: case 315: case 316: return Se; case 157: return ue; case 152: return ae; case 148: return rt; case 160: return Ot; case 134: return Te; case 153: return j; case 114: return yt; case 155: return Oe; case 104: return ln; case 144: return lt; case 149: return n.flags & 262144 && !ge ? Se : jr; case 139: return Q; case 194: case 108: return oB(n); case 198: return Lqe(n); case 180: return dne(n); case 179: return n.assertsModifier ? yt : Te; case 230: return dne(n); case 183: return $xe(n); case 185: case 186: return GKe(n); case 187: return jKe(n); case 189: return XKe(n); case 190: return rqe(n); case 317: return dKe(n); case 319: return ao($r(n.type)); case 199: return wqe(n); case 193: case 318: case 312: return $r(n.type); case 188: return BAe(n); case 321: return Lnt(n); case 181: case 182: case 184: case 325: case 320: case 326: return GAe(n); case 195: return uqe(n); case 196: return RAe(n); case 197: return Cne(n); case 191: return Sqe(n); case 192: return xqe(n); case 200: return dqe(n); case 202: return Aqe(n); case 79: case 163: case 208: let a = Zf(n); return a ? gs(a) : ve; default: return ve } } function sB(n, a, c) { if (n && n.length) for (let u = 0; u < n.length; u++) { let p = n[u], h = c(p, a); if (p !== h) { let T = u === 0 ? [] : n.slice(0, u); for (T.push(h), u++; u < n.length; u++)T.push(c(n[u], a)); return T } } return n } function hg(n, a) { return sB(n, a, Oi) } function cB(n, a) { return sB(n, a, $x) } function VAe(n, a) { return sB(n, a, zqe) } function Wu(n, a) { return n.length === 1 ? n0(n[0], a ? a[0] : Se) : Rqe(n, a) } function zv(n, a) { switch (a.kind) { case 0: return n === a.source ? a.target : n; case 1: { let u = a.sources, p = a.targets; for (let h = 0; h < u.length; h++)if (n === u[h]) return p ? p[h] : Se; return n } case 2: { let u = a.sources, p = a.targets; for (let h = 0; h < u.length; h++)if (n === u[h]) return p[h](); return n } case 3: return a.func(n); case 4: case 5: let c = zv(n, a.mapper1); return c !== n && a.kind === 4 ? Oi(c, a.mapper2) : zv(c, a.mapper2) } } function n0(n, a) { return L.attachDebugPrototypeIfDebug({ kind: 0, source: n, target: a }) } function Rqe(n, a) { return L.attachDebugPrototypeIfDebug({ kind: 1, sources: n, targets: a }) } function dM(n, a) { return L.attachDebugPrototypeIfDebug({ kind: 3, func: n, debugInfo: L.isDebugging ? a : void 0 }) } function Rne(n, a) { return L.attachDebugPrototypeIfDebug({ kind: 2, sources: n, targets: a }) } function lB(n, a, c) { return L.attachDebugPrototypeIfDebug({ kind: n, mapper1: a, mapper2: c }) } function jAe(n) { return Wu(n, void 0) } function Oqe(n, a) { let c = n.inferences.slice(a); return Wu(on(c, u => u.typeParameter), on(c, () => ue)) } function Jv(n, a) { return n ? lB(4, n, a) : a } function Nqe(n, a) { return n ? lB(5, n, a) : a } function O1(n, a, c) { return c ? lB(5, n0(n, a), c) : n0(n, a) } function oD(n, a, c) { return n ? lB(5, n, n0(a, c)) : n0(a, c) } function Pqe(n) { return !n.constraint && !sne(n) || n.constraint === Co ? n : n.restrictiveInstantiation || (n.restrictiveInstantiation = rd(n.symbol), n.restrictiveInstantiation.constraint = Co, n.restrictiveInstantiation) } function uB(n) { let a = rd(n.symbol); return a.target = n, a } function Mqe(n, a) { return iM(n.kind, n.parameterName, n.parameterIndex, Oi(n.type, a)) } function $x(n, a, c) { let u; if (n.typeParameters && !c) { u = on(n.typeParameters, uB), a = Jv(Wu(n.typeParameters, u), a); for (let h of u) h.mapper = a } let p = Am(n.declaration, u, n.thisParameter && One(n.thisParameter, a), sB(n.parameters, a, One), void 0, void 0, n.minArgumentCount, n.flags & 39); return p.target = n, p.mapper = a, p } function One(n, a) { let c = Ai(n); if (c.type && !XE(c.type)) return n; ac(n) & 1 && (n = c.target, a = Jv(c.mapper, a)); let u = wo(n.flags, n.escapedName, 1 | ac(n) & 53256); return u.declarations = n.declarations, u.parent = n.parent, u.links.target = n, u.links.mapper = a, n.valueDeclaration && (u.valueDeclaration = n.valueDeclaration), c.nameType && (u.links.nameType = c.nameType), u } function Fqe(n, a, c, u) { let p = n.objectFlags & 4 || n.objectFlags & 8388608 ? n.node : n.symbol.declarations[0], h = Rr(p), T = n.objectFlags & 4 ? h.resolvedType : n.objectFlags & 64 ? n.target : n, k = h.outerTypeParameters; if (!k) { let O = hC(p, !0); if (cp(p)) { let J = Mxe(p); O = si(O, J) } k = O || Je; let H = n.objectFlags & 8388612 ? [p] : n.symbol.declarations; k = (T.objectFlags & 8388612 || T.symbol.flags & 8192 || T.symbol.flags & 2048) && !T.aliasTypeArguments ? Pr(k, J => vt(H, de => fM(J, de))) : k, h.outerTypeParameters = k } if (k.length) { let O = Jv(n.mapper, a), H = on(k, tt => zv(tt, O)), J = c || n.aliasSymbol, de = c ? u : hg(n.aliasTypeArguments, a), Ae = kf(H) + Wx(J, de); T.instantiations || (T.instantiations = new Map, T.instantiations.set(kf(k) + Wx(T.aliasSymbol, T.aliasTypeArguments), T)); let xe = T.instantiations.get(Ae); if (!xe) { let tt = Wu(k, H); xe = T.objectFlags & 4 ? cne(n.target, n.node, tt, J, de) : T.objectFlags & 32 ? HAe(T, tt, J, de) : Mne(T, tt, J, de), T.instantiations.set(Ae, xe) } return xe } return n } function Gqe(n) { return !(n.parent.kind === 180 && n.parent.typeArguments && n === n.parent.typeName || n.parent.kind === 202 && n.parent.typeArguments && n === n.parent.qualifier) } function fM(n, a) { if (n.symbol && n.symbol.declarations && n.symbol.declarations.length === 1) { let u = n.symbol.declarations[0].parent; for (let p = a; p !== u; p = p.parent)if (!p || p.kind === 238 || p.kind === 191 && pa(p.extendsType, c)) return !0; return c(a) } return !0; function c(u) { switch (u.kind) { case 194: return !!n.isThisType; case 79: return !n.isThisType && Gm(u) && Gqe(u) && UAe(u) === n; case 183: let p = u.exprName, h = Yd(p), T = Qf(h), k = n.symbol.declarations[0], O; if (k.kind === 165) O = k.parent; else if (n.isThisType) O = k; else return !0; return T.declarations ? vt(T.declarations, H => AT(H, O)) || vt(u.typeArguments, c) : !0; case 171: case 170: return !u.type && !!u.body || vt(u.typeParameters, c) || vt(u.parameters, c) || !!u.type && c(u.type) }return !!pa(u, c) } } function Nne(n) { let a = rp(n); if (a.flags & 4194304) { let c = Cy(a.type); if (c.flags & 262144) return c } } function HAe(n, a, c, u) { let p = Nne(n); if (p) { let h = Oi(p, a); if (p !== h) return z2e(O_(h), T => { if (T.flags & 61603843 && T !== Tt && !Ro(T)) { if (!n.declaration.nameType) { let k; if (_f(T) || T.flags & 1 && Sm(p, 4) < 0 && (k = eu(p)) && Im(k, JE)) return Uqe(T, n, O1(p, T, a)); if (Qx(T)) return Bqe(T, n, p, a); if (po(T)) return Vqe(T, n, O1(p, T, a)) } return Mne(n, O1(p, T, a)) } return T }, c, u) } return Oi(rp(n), a) === Tt ? Tt : Mne(n, a, c, u) } function Pne(n, a) { return a & 1 ? !0 : a & 2 ? !1 : n } function Bqe(n, a, c, u) { let p = n.target.elementFlags, h = on(Ko(n), (k, O) => { let H = p[O] & 8 ? k : p[O] & 4 ? nu(k) : ap([k], [p[O]]); return HAe(a, O1(c, H, u)) }), T = Pne(n.target.readonly, Pp(a)); return ap(h, on(h, k => 8), T) } function Uqe(n, a, c) { let u = WAe(a, rt, !0, c); return Ro(u) ? ve : nu(u, Pne(CC(n), Pp(a))) } function Vqe(n, a, c) { let u = n.target.elementFlags, p = on(Ko(n), (O, H) => WAe(a, ff("" + H), !!(u[H] & 2), c)), h = Pp(a), T = h & 4 ? on(u, O => O & 1 ? 2 : O) : h & 8 ? on(u, O => O & 2 ? 1 : O) : u, k = Pne(n.target.readonly, h); return ya(p, ve) ? ve : ap(p, T, k, n.target.labeledElementDeclarations) } function WAe(n, a, c, u) { let p = oD(u, w_(n), a), h = Oi(_h(n.target || n), p), T = Pp(n); return U && T & 4 && !Js(h, 49152) ? gg(h, !0) : U && T & 8 && c ? wf(h, 524288) : h } function Mne(n, a, c, u) { let p = Bd(n.objectFlags | 64, n.symbol); if (n.objectFlags & 32) { p.declaration = n.declaration; let h = w_(n), T = uB(h); p.typeParameter = T, a = Jv(n0(h, T), a), T.mapper = a } return n.objectFlags & 8388608 && (p.node = n.node), p.target = n, p.mapper = a, p.aliasSymbol = c || n.aliasSymbol, p.aliasTypeArguments = c ? u : hg(n.aliasTypeArguments, a), p.objectFlags |= p.aliasTypeArguments ? qG(p.aliasTypeArguments) : 0, p } function Fne(n, a, c, u) { let p = n.root; if (p.outerTypeParameters) { let h = on(p.outerTypeParameters, O => zv(O, a)), T = kf(h) + Wx(c, u), k = p.instantiations.get(T); if (!k) { let O = Wu(p.outerTypeParameters, h), H = p.checkType, J = p.isDistributive ? zv(H, O) : void 0; k = J && H !== J && J.flags & 1179648 ? z2e(O_(J), de => Ine(p, O1(H, de, O)), c, u) : Ine(p, O, c, u), p.instantiations.set(T, k) } return k } return n } function Oi(n, a) { return n && a ? zAe(n, a, void 0, void 0) : n } function zAe(n, a, c, u) { var p; if (!XE(n)) return n; if (w === 100 || A >= 5e6) return (p = ai) == null || p.instant(ai.Phase.CheckTypes, "instantiateType_DepthLimit", { typeId: n.id, instantiationDepth: w, instantiationCount: A }), Fe(P, _.Type_instantiation_is_excessively_deep_and_possibly_infinite), ve; x++, A++, w++; let h = jqe(n, a, c, u); return w--, h } function jqe(n, a, c, u) { let p = n.flags; if (p & 262144) return zv(n, a); if (p & 524288) { let h = n.objectFlags; if (h & 52) { if (h & 4 && !n.node) { let T = n.resolvedTypeArguments, k = hg(T, a); return k !== T ? yne(n.target, k) : n } return h & 1024 ? Hqe(n, a) : Fqe(n, a, c, u) } return n } if (p & 3145728) { let h = n.flags & 1048576 ? n.origin : void 0, T = h && h.flags & 3145728 ? h.types : n.types, k = hg(T, a); if (k === T && c === n.aliasSymbol) return n; let O = c || n.aliasSymbol, H = c ? u : hg(n.aliasTypeArguments, a); return p & 2097152 || h && h.flags & 2097152 ? so(k, O, H) : Gr(k, 1, O, H) } if (p & 4194304) return Gp(Oi(n.type, a)); if (p & 134217728) return WE(n.texts, hg(n.types, a)); if (p & 268435456) return w1(n.symbol, Oi(n.type, a)); if (p & 8388608) { let h = c || n.aliasSymbol, T = c ? u : hg(n.aliasTypeArguments, a); return od(Oi(n.objectType, a), Oi(n.indexType, a), n.accessFlags, void 0, h, T) } if (p & 16777216) return Fne(n, Jv(n.mapper, a), c, u); if (p & 33554432) { let h = Oi(n.baseType, a), T = Oi(n.constraint, a); return h.flags & 8650752 && SC(T) ? lne(h, T) : T.flags & 3 || to(zE(h), zE(T)) ? h : h.flags & 8650752 ? lne(h, T) : so([T, h]) } return n } function Hqe(n, a) { let c = Oi(n.mappedType, a); if (!(Ur(c) & 32)) return n; let u = Oi(n.constraintType, a); if (!(u.flags & 4194304)) return n; let p = T2e(Oi(n.source, a), c, u); return p || n } function Wqe(n) { return n.flags & 134479871 ? n : n.uniqueLiteralFilledInstantiation || (n.uniqueLiteralFilledInstantiation = Oi(n, Fo)) } function dB(n) { return n.flags & 134479871 ? n : n.permissiveInstantiation || (n.permissiveInstantiation = Oi(n, xi)) } function zE(n) { return n.flags & 134479871 ? n : (n.restrictiveInstantiation || (n.restrictiveInstantiation = Oi(n, Hi), n.restrictiveInstantiation.restrictiveInstantiation = n.restrictiveInstantiation), n.restrictiveInstantiation) } function zqe(n, a) { return Fp(n.keyType, Oi(n.type, a), n.isReadonly, n.declaration) } function $f(n) { switch (L.assert(n.kind !== 171 || s_(n)), n.kind) { case 215: case 216: case 171: case 259: return JAe(n); case 207: return vt(n.properties, $f); case 206: return vt(n.elements, $f); case 224: return $f(n.whenTrue) || $f(n.whenFalse); case 223: return (n.operatorToken.kind === 56 || n.operatorToken.kind === 60) && ($f(n.left) || $f(n.right)); case 299: return $f(n.initializer); case 214: return $f(n.expression); case 289: return vt(n.properties, $f) || Xm(n.parent) && vt(n.parent.parent.children, $f); case 288: { let { initializer: a } = n; return !!a && $f(a) } case 291: { let { expression: a } = n; return !!a && $f(a) } }return !1 } function JAe(n) { return b4(n) || Jqe(n) } function Jqe(n) { return !n.typeParameters && !U_(n) && !!n.body && n.body.kind !== 238 && $f(n.body) } function fB(n) { return (a2(n) || s_(n)) && JAe(n) } function KAe(n) { if (n.flags & 524288) { let a = R_(n); if (a.constructSignatures.length || a.callSignatures.length) { let c = Bd(16, n.symbol); return c.members = a.members, c.properties = a.properties, c.callSignatures = Je, c.constructSignatures = Je, c.indexInfos = Je, c } } else if (n.flags & 2097152) return so(on(n.types, KAe)); return n } function ph(n, a) { return Bp(n, a, td) } function sD(n, a) { return Bp(n, a, td) ? -1 : 0 } function Gne(n, a) { return Bp(n, a, Zu) ? -1 : 0 } function Kqe(n, a) { return Bp(n, a, hm) ? -1 : 0 } function Iy(n, a) { return Bp(n, a, hm) } function qAe(n, a) { return Bp(n, a, x_) } function to(n, a) { return Bp(n, a, Zu) } function r0(n, a) { return n.flags & 1048576 ? Ji(n.types, c => r0(c, a)) : a.flags & 1048576 ? vt(a.types, c => r0(n, c)) : n.flags & 2097152 ? vt(n.types, c => r0(c, a)) : n.flags & 58982400 ? r0(bu(n) || ue, a) : hh(a) ? !!(n.flags & 67633152) : a === ka ? !!(n.flags & 67633152) && !hh(n) : a === Hs ? !!(n.flags & 524288) && vre(n) : BE(n, Bx(a)) || _f(a) && !CC(a) && r0(n, jo) } function _B(n, a) { return Bp(n, a, ed) } function _M(n, a) { return _B(n, a) || _B(a, n) } function wu(n, a, c, u, p, h) { return Df(n, a, Zu, c, u, p, h) } function Ly(n, a, c, u, p, h) { return Bne(n, a, Zu, c, u, p, h, void 0) } function Bne(n, a, c, u, p, h, T, k) { return Bp(n, a, c) ? !0 : !u || !cD(p, n, a, c, h, T, k) ? Df(n, a, c, u, h, T, k) : !1 } function XAe(n) { return !!(n.flags & 16777216 || n.flags & 2097152 && vt(n.types, XAe)) } function cD(n, a, c, u, p, h, T) { if (!n || XAe(c)) return !1; if (!Df(a, c, u, void 0) && qqe(n, a, c, u, p, h, T)) return !0; switch (n.kind) { case 291: case 214: return cD(n.expression, a, c, u, p, h, T); case 223: switch (n.operatorToken.kind) { case 63: case 27: return cD(n.right, a, c, u, p, h, T) }break; case 207: return nXe(n, a, c, u, h, T); case 206: return eXe(n, a, c, u, h, T); case 289: return Zqe(n, a, c, u, h, T); case 216: return Xqe(n, a, c, u, h, T) }return !1 } function qqe(n, a, c, u, p, h, T) { let k = xa(a, 0), O = xa(a, 1); for (let H of [O, k]) if (vt(H, J => { let de = qo(J); return !(de.flags & 131073) && Df(de, c, u, void 0) })) { let J = T || {}; wu(a, c, n, p, h, J); let de = J.errors[J.errors.length - 1]; return Ao(de, hr(n, H === O ? _.Did_you_mean_to_use_new_with_this_expression : _.Did_you_mean_to_call_this_expression)), !0 } return !1 } function Xqe(n, a, c, u, p, h) { if (Va(n.body) || vt(n.parameters, f6)) return !1; let T = F1(a); if (!T) return !1; let k = xa(c, 0); if (!Fn(k)) return !1; let O = n.body, H = qo(T), J = Gr(on(k, qo)); if (!Df(H, J, u, void 0)) { let de = O && cD(O, H, J, u, void 0, p, h); if (de) return de; let Ae = h || {}; if (Df(H, J, u, O, void 0, p, Ae), Ae.errors) return c.symbol && Fn(c.symbol.declarations) && Ao(Ae.errors[Ae.errors.length - 1], hr(c.symbol.declarations[0], _.The_expected_type_comes_from_the_return_type_of_this_signature)), !(pl(n) & 2) && !Vc(H, "then") && Df(jM(H), J, u, void 0) && Ao(Ae.errors[Ae.errors.length - 1], hr(n, _.Did_you_mean_to_mark_this_function_as_async)), !0 } return !1 } function YAe(n, a, c) { let u = Ay(a, c); if (u) return u; if (a.flags & 1048576) { let p = i2e(n, a); if (p) return Ay(p, c) } } function $Ae(n, a) { wM(n, a, !1); let c = BC(n, 1); return vD(), c } function pM(n, a, c, u, p, h) { let T = !1; for (let k of n) { let { errorNode: O, innerExpression: H, nameType: J, errorMessage: de } = k, Ae = YAe(a, c, J); if (!Ae || Ae.flags & 8388608) continue; let xe = Ay(a, J); if (!xe) continue; let tt = eB(J, void 0); if (!Df(xe, Ae, u, void 0)) { let It = H && cD(H, xe, Ae, u, void 0, p, h); if (T = !0, !It) { let Tn = h || {}, un = H ? $Ae(H, xe) : xe; if (Pe && mB(un, Ae)) { let Nn = hr(O, _.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_type_of_the_target, Ee(un), Ee(Ae)); Lo.add(Nn), Tn.errors = [Nn] } else { let Nn = !!(tt && (ja(c, tt) || Ht).flags & 16777216), en = !!(tt && (ja(a, tt) || Ht).flags & 16777216); Ae = KE(Ae, Nn), xe = KE(xe, Nn && en), Df(un, Ae, u, O, de, p, Tn) && un !== xe && Df(xe, Ae, u, O, de, p, Tn) } if (Tn.errors) { let Nn = Tn.errors[Tn.errors.length - 1], en = fh(J) ? Np(J) : void 0, cn = en !== void 0 ? ja(c, en) : void 0, rr = !1; if (!cn) { let Jt = rM(c, J); Jt && Jt.declaration && !Gn(Jt.declaration).hasNoDefaultLib && (rr = !0, Ao(Nn, hr(Jt.declaration, _.The_expected_type_comes_from_this_index_signature))) } if (!rr && (cn && Fn(cn.declarations) || c.symbol && Fn(c.symbol.declarations))) { let Jt = cn && Fn(cn.declarations) ? cn.declarations[0] : c.symbol.declarations[0]; Gn(Jt).hasNoDefaultLib || Ao(Nn, hr(Jt, _.The_expected_type_comes_from_property_0_which_is_declared_here_on_type_1, en && !(J.flags & 8192) ? Gi(en) : Ee(J), Ee(c))) } } } } } return T } function Yqe(n, a, c, u, p, h) { let T = jc(c, EB), k = jc(c, J => !EB(J)), O = k !== lt ? Oie(13, 0, k, void 0) : void 0, H = !1; for (let J = n.next(); !J.done; J = n.next()) { let { errorNode: de, innerExpression: Ae, nameType: xe, errorMessage: tt } = J.value, It = O, Tn = T !== lt ? YAe(a, T, xe) : void 0; if (Tn && !(Tn.flags & 8388608) && (It = O ? Gr([O, Tn]) : Tn), !It) continue; let un = Ay(a, xe); if (!un) continue; let Nn = eB(xe, void 0); if (!Df(un, It, u, void 0)) { let en = Ae && cD(Ae, un, It, u, void 0, p, h); if (H = !0, !en) { let cn = h || {}, rr = Ae ? $Ae(Ae, un) : un; if (Pe && mB(rr, It)) { let Jt = hr(de, _.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_type_of_the_target, Ee(rr), Ee(It)); Lo.add(Jt), cn.errors = [Jt] } else { let Jt = !!(Nn && (ja(T, Nn) || Ht).flags & 16777216), Cn = !!(Nn && (ja(a, Nn) || Ht).flags & 16777216); It = KE(It, Jt), un = KE(un, Jt && Cn), Df(rr, It, u, de, tt, p, cn) && rr !== un && Df(un, It, u, de, tt, p, cn) } } } } return H } function* $qe(n) { if (Fn(n.properties)) for (let a of n.properties) GT(a) || Fre(vr(a.name)) || (yield { errorNode: a.name, innerExpression: a.initializer, nameType: ff(vr(a.name)) }) } function* Qqe(n, a) { if (!Fn(n.children)) return; let c = 0; for (let u = 0; u < n.children.length; u++) { let p = n.children[u], h = op(u - c), T = QAe(p, h, a); T ? yield T : c++ } } function QAe(n, a, c) { switch (n.kind) { case 291: return { errorNode: n, innerExpression: n.expression, nameType: a }; case 11: if (n.containsOnlyTriviaWhiteSpaces) break; return { errorNode: n, innerExpression: void 0, nameType: a, errorMessage: c() }; case 281: case 282: case 285: return { errorNode: n, innerExpression: n, nameType: a }; default: return L.assertNever(n, "Found invalid jsx child") } } function Zqe(n, a, c, u, p, h) { let T = pM($qe(n), a, c, u, p, h), k; if (Xm(n.parent) && Hg(n.parent.parent)) { let H = n.parent.parent, J = HB(tA(n)), de = J === void 0 ? "children" : Gi(J), Ae = ff(de), xe = od(c, Ae), tt = bR(H.children); if (!Fn(tt)) return T; let It = Fn(tt) > 1, Tn, un; if (pne(!1) !== ro) { let en = cAe(Se); Tn = jc(xe, cn => to(cn, en)), un = jc(xe, cn => !to(cn, en)) } else Tn = jc(xe, EB), un = jc(xe, en => !EB(en)); if (It) { if (Tn !== lt) { let en = ap(jB(H, 0)), cn = Qqe(H, O); T = Yqe(cn, en, Tn, u, p, h) || T } else if (!Bp(od(a, Ae), xe, u)) { T = !0; let en = Fe(H.openingElement.tagName, _.This_JSX_tag_s_0_prop_expects_a_single_child_of_type_1_but_multiple_children_were_provided, de, Ee(xe)); h && h.skipLogging && (h.errors || (h.errors = [])).push(en) } } else if (un !== lt) { let en = tt[0], cn = QAe(en, Ae, O); cn && (T = pM(function* () { yield cn }(), a, c, u, p, h) || T) } else if (!Bp(od(a, Ae), xe, u)) { T = !0; let en = Fe(H.openingElement.tagName, _.This_JSX_tag_s_0_prop_expects_type_1_which_requires_multiple_children_but_only_a_single_child_was_provided, de, Ee(xe)); h && h.skipLogging && (h.errors || (h.errors = [])).push(en) } } return T; function O() { if (!k) { let H = Qc(n.parent.tagName), J = HB(tA(n)), de = J === void 0 ? "children" : Gi(J), Ae = od(c, ff(de)), xe = _._0_components_don_t_accept_text_as_child_elements_Text_in_JSX_has_the_type_string_but_the_expected_type_of_1_is_2; k = { ...xe, key: "!!ALREADY FORMATTED!!", message: TW(void 0, xe, H, de, Ee(Ae)) } } return k } } function* ZAe(n, a) { let c = Fn(n.elements); if (c) for (let u = 0; u < c; u++) { if (IC(a) && !ja(a, "" + u)) continue; let p = n.elements[u]; if (ol(p)) continue; let h = op(u); yield { errorNode: p, innerExpression: p, nameType: h } } } function eXe(n, a, c, u, p, h) { if (c.flags & 134479868) return !1; if (IC(a)) return pM(ZAe(n, c), a, c, u, p, h); wM(n, c, !1); let T = gCe(n, 1, !0); return vD(), IC(T) ? pM(ZAe(n, c), T, c, u, p, h) : !1 } function* tXe(n) { if (Fn(n.properties)) for (let a of n.properties) { if (VS(a)) continue; let c = TC(fr(a), 8576); if (!(!c || c.flags & 131072)) switch (a.kind) { case 175: case 174: case 171: case 300: yield { errorNode: a.name, innerExpression: void 0, nameType: c }; break; case 299: yield { errorNode: a.name, innerExpression: a.initializer, nameType: c, errorMessage: Vw(a.name) ? _.Type_of_computed_property_s_value_is_0_which_is_not_assignable_to_type_1 : void 0 }; break; default: L.assertNever(a) } } } function nXe(n, a, c, u, p, h) { return c.flags & 134479868 ? !1 : pM(tXe(n), a, c, u, p, h) } function e2e(n, a, c, u, p) { return Df(n, a, ed, c, u, p) } function rXe(n, a, c) { return Une(n, a, c ? 4 : 0, !1, void 0, void 0, Gne, void 0) !== 0 } function pB(n) { if (!n.typeParameters && (!n.thisParameter || Zo(UM(n.thisParameter))) && n.parameters.length === 1 && Xl(n)) { let a = UM(n.parameters[0]); return !!((_f(a) ? Ko(a)[0] : a).flags & 131073 && qo(n).flags & 3) } return !1 } function Une(n, a, c, u, p, h, T, k) { if (n === a || !(c & 16 && pB(n)) && pB(a)) return -1; if (c & 16 && pB(n) && !pB(a)) return 0; let O = xd(a); if (!jp(a) && (c & 8 ? jp(n) || xd(n) > O : Vp(n) > O)) return 0; n.typeParameters && n.typeParameters !== a.typeParameters && (a = iKe(a), n = qCe(n, a, void 0, T)); let J = xd(n), de = AD(n), Ae = AD(a); (de || Ae) && Oi(de || Ae, k); let xe = a.declaration ? a.declaration.kind : 0, tt = !(c & 3) && re && xe !== 171 && xe !== 170 && xe !== 173, It = -1, Tn = Yb(n); if (Tn && Tn !== yt) { let en = Yb(a); if (en) { let cn = !tt && T(Tn, en, !1) || T(en, Tn, u); if (!cn) return u && p(_.The_this_types_of_each_signature_are_incompatible), 0; It &= cn } } let un = de || Ae ? Math.min(J, O) : Math.max(J, O), Nn = de || Ae ? un - 1 : -1; for (let en = 0; en < un; en++) { let cn = en === Nn ? SD(n, en) : tT(n, en), rr = en === Nn ? SD(a, en) : tT(a, en); if (cn && rr) { let Jt = c & 3 ? void 0 : F1(yg(cn)), Cn = c & 3 ? void 0 : F1(yg(rr)), Br = Jt && Cn && !Lf(Jt) && !Lf(Cn) && (iu(cn) & 50331648) === (iu(rr) & 50331648) ? Une(Cn, Jt, c & 8 | (tt ? 2 : 1), u, p, h, T, k) : !(c & 3) && !tt && T(cn, rr, !1) || T(rr, cn, u); if (Br && c & 8 && en >= Vp(n) && en < Vp(a) && T(cn, rr, !1) && (Br = 0), !Br) return u && p(_.Types_of_parameters_0_and_1_are_incompatible, Gi(FC(n, en)), Gi(FC(a, en))), 0; It &= Br } } if (!(c & 4)) { let en = rne(a) ? Se : a.declaration && cp(a.declaration) ? vu(No(a.declaration.symbol)) : qo(a); if (en === yt || en === Se) return It; let cn = rne(n) ? Se : n.declaration && cp(n.declaration) ? vu(No(n.declaration.symbol)) : qo(n), rr = Lf(a); if (rr) { let Jt = Lf(n); if (Jt) It &= iXe(Jt, rr, u, p, T); else if (nce(rr)) return u && p(_.Signature_0_must_be_a_type_predicate, ne(n)), 0 } else It &= c & 1 && T(en, cn, !1) || T(cn, en, u), !It && u && h && h(cn, en) } return It } function iXe(n, a, c, u, p) { if (n.kind !== a.kind) return c && (u(_.A_this_based_type_guard_is_not_compatible_with_a_parameter_based_type_guard), u(_.Type_predicate_0_is_not_assignable_to_1, kl(n), kl(a))), 0; if ((n.kind === 1 || n.kind === 3) && n.parameterIndex !== a.parameterIndex) return c && (u(_.Parameter_0_is_not_in_the_same_position_as_parameter_1, n.parameterName, a.parameterName), u(_.Type_predicate_0_is_not_assignable_to_1, kl(n), kl(a))), 0; let h = n.type === a.type ? -1 : n.type && a.type ? p(n.type, a.type, c) : 0; return h === 0 && c && u(_.Type_predicate_0_is_not_assignable_to_1, kl(n), kl(a)), h } function aXe(n, a) { let c = tD(n), u = tD(a), p = qo(c), h = qo(u); return h === yt || Bp(h, p, Zu) || Bp(p, h, Zu) ? rXe(c, u, !0) : !1 } function Vne(n) { return n !== aa && n.properties.length === 0 && n.callSignatures.length === 0 && n.constructSignatures.length === 0 && n.indexInfos.length === 0 } function mh(n) { return n.flags & 524288 ? !df(n) && Vne(R_(n)) : n.flags & 67108864 ? !0 : n.flags & 1048576 ? vt(n.types, mh) : n.flags & 2097152 ? Ji(n.types, mh) : !1 } function hh(n) { return !!(Ur(n) & 16 && (n.members && Vne(n) || n.symbol && n.symbol.flags & 2048 && vy(n.symbol).size === 0)) } function oXe(n) { if (U && n.flags & 1048576) { if (!(n.objectFlags & 33554432)) { let a = n.types; n.objectFlags |= 33554432 | (a.length >= 3 && a[0].flags & 32768 && a[1].flags & 65536 && vt(a, hh) ? 67108864 : 0) } return !!(n.objectFlags & 67108864) } return !1 } function xC(n) { return !!((n.flags & 1048576 ? n.types[0] : n).flags & 32768) } function t2e(n) { return n.flags & 524288 && !df(n) && Jo(n).length === 0 && tu(n).length === 1 && !!Cm(n, ae) || n.flags & 3145728 && Ji(n.types, t2e) || !1 } function jne(n, a, c) { let u = n.flags & 8 ? ju(n) : n, p = a.flags & 8 ? ju(a) : a; if (u === p) return !0; if (u.escapedName !== p.escapedName || !(u.flags & 256) || !(p.flags & 256)) return !1; let h = $a(u) + "," + $a(p), T = kb.get(h); if (T !== void 0 && !(!(T & 4) && T & 2 && c)) return !!(T & 1); let k = zn(p); for (let O of Jo(zn(u))) if (O.flags & 8) { let H = ja(k, O.escapedName); if (!H || !(H.flags & 8)) return c ? (c(_.Property_0_is_missing_in_type_1, fc(O), Ee(gs(p), void 0, 64)), kb.set(h, 6)) : kb.set(h, 2), !1 } return kb.set(h, 1), !0 } function lD(n, a, c, u) { let p = n.flags, h = a.flags; return h & 1 || p & 131072 || n === Tt || h & 2 && !(c === x_ && p & 1) ? !0 : h & 131072 ? !1 : !!(p & 402653316 && h & 4 || p & 128 && p & 1024 && h & 128 && !(h & 1024) && n.value === a.value || p & 296 && h & 8 || p & 256 && p & 1024 && h & 256 && !(h & 1024) && n.value === a.value || p & 2112 && h & 64 || p & 528 && h & 16 || p & 12288 && h & 4096 || p & 32 && h & 32 && n.symbol.escapedName === a.symbol.escapedName && jne(n.symbol, a.symbol, u) || p & 1024 && h & 1024 && (p & 1048576 && h & 1048576 && jne(n.symbol, a.symbol, u) || p & 2944 && h & 2944 && n.value === a.value && jne(n.symbol, a.symbol, u)) || p & 32768 && (!U && !(h & 3145728) || h & 49152) || p & 65536 && (!U && !(h & 3145728) || h & 65536) || p & 524288 && h & 67108864 && !(c === x_ && hh(n) && !(Ur(n) & 8192)) || (c === Zu || c === ed) && (p & 1 || p & 8 && (h & 32 || h & 256 && h & 1024) || p & 256 && !(p & 1024) && (h & 32 || h & 256 && h & 1024 && n.value === a.value) || oXe(a))) } function Bp(n, a, c) { if (t0(n) && (n = n.regularType), t0(a) && (a = a.regularType), n === a) return !0; if (c !== td) { if (c === ed && !(a.flags & 131072) && lD(a, n, c) || lD(n, a, c)) return !0 } else if (!((n.flags | a.flags) & 61865984)) { if (n.flags !== a.flags) return !1; if (n.flags & 67358815) return !0 } if (n.flags & 524288 && a.flags & 524288) { let u = c.get(Kne(n, a, 0, c, !1)); if (u !== void 0) return !!(u & 1) } return n.flags & 469499904 || a.flags & 469499904 ? Df(n, a, c, void 0) : !1 } function n2e(n, a) { return Ur(n) & 2048 && Fre(a.escapedName) } function mM(n, a) { for (; ;) { let c = t0(n) ? n.regularType : Ur(n) & 4 ? n.node ? _g(n.target, Ko(n)) : Yne(n) || n : n.flags & 3145728 ? sXe(n, a) : n.flags & 33554432 ? a ? n.baseType : une(n) : n.flags & 25165824 ? mg(n, a) : n; if (c === n) return c; n = c } } function sXe(n, a) { let c = O_(n); if (c !== n) return c; if (n.flags & 2097152 && vt(n.types, hh)) { let u = Tl(n.types, p => mM(p, a)); if (u !== n.types) return so(u) } return n } function Df(n, a, c, u, p, h, T) { var k; let O, H, J, de, Ae, xe = 0, tt = 0, It = 0, Tn = 0, un = !1, Nn = 0, en, cn; L.assert(c !== td || !u, "no error reporting in identity checking"); let rr = ji(n, a, 3, !!u, p); if (cn && Br(), un) { (k = ai) == null || k.instant(ai.Phase.CheckTypes, "checkTypeRelatedTo_DepthLimit", { sourceId: n.id, targetId: a.id, depth: tt, targetDepth: It }); let ze = Fe(u || P, _.Excessive_stack_depth_comparing_types_0_and_1, Ee(n), Ee(a)); T && (T.errors || (T.errors = [])).push(ze) } else if (O) { if (h) { let Ut = h(); Ut && (gle(Ut, O), O = Ut) } let ze; if (p && u && !rr && n.symbol) { let Ut = Ai(n.symbol); if (Ut.originatingImport && !Dd(Ut.originatingImport) && Df(zn(Ut.target), a, c, void 0)) { let Zn = hr(Ut.originatingImport, _.Type_originates_at_this_import_A_namespace_style_import_cannot_be_called_or_constructed_and_will_cause_a_failure_at_runtime_Consider_using_a_default_import_or_import_require_here_instead); ze = Sn(ze, Zn) } } let dt = Lh(Gn(u), u, O, ze); H && Ao(dt, ...H), T && (T.errors || (T.errors = [])).push(dt), (!T || !T.skipLogging) && Lo.add(dt) } return u && T && T.skipLogging && rr === 0 && L.assert(!!T.errors, "missed opportunity to interact with error."), rr !== 0; function Jt(ze) { O = ze.errorInfo, en = ze.lastSkippedInfo, cn = ze.incompatibleStack, Nn = ze.overrideNextErrorInfo, H = ze.relatedInfo } function Cn() { return { errorInfo: O, lastSkippedInfo: en, incompatibleStack: cn?.slice(), overrideNextErrorInfo: Nn, relatedInfo: H?.slice() } } function Rn(ze, dt, Ut, wn, Zn) { Nn++, en = void 0, (cn || (cn = [])).push([ze, dt, Ut, wn, Zn]) } function Br() { let ze = cn || []; cn = void 0; let dt = en; if (en = void 0, ze.length === 1) { Hr(...ze[0]), dt && wa(void 0, ...dt); return } let Ut = "", wn = []; for (; ze.length;) { let [Zn, ...fn] = ze.pop(); switch (Zn.code) { case _.Types_of_property_0_are_incompatible.code: { Ut.indexOf("new ") === 0 && (Ut = `(${Ut})`); let sr = "" + fn[0]; Ut.length === 0 ? Ut = `${sr}` : i_(sr, Do(Y)) ? Ut = `${Ut}.${sr}` : sr[0] === "[" && sr[sr.length - 1] === "]" ? Ut = `${Ut}${sr}` : Ut = `${Ut}[${sr}]`; break } case _.Call_signature_return_types_0_and_1_are_incompatible.code: case _.Construct_signature_return_types_0_and_1_are_incompatible.code: case _.Call_signatures_with_no_arguments_have_incompatible_return_types_0_and_1.code: case _.Construct_signatures_with_no_arguments_have_incompatible_return_types_0_and_1.code: { if (Ut.length === 0) { let sr = Zn; Zn.code === _.Call_signatures_with_no_arguments_have_incompatible_return_types_0_and_1.code ? sr = _.Call_signature_return_types_0_and_1_are_incompatible : Zn.code === _.Construct_signatures_with_no_arguments_have_incompatible_return_types_0_and_1.code && (sr = _.Construct_signature_return_types_0_and_1_are_incompatible), wn.unshift([sr, fn[0], fn[1]]) } else { let sr = Zn.code === _.Construct_signature_return_types_0_and_1_are_incompatible.code || Zn.code === _.Construct_signatures_with_no_arguments_have_incompatible_return_types_0_and_1.code ? "new " : "", Ar = Zn.code === _.Call_signatures_with_no_arguments_have_incompatible_return_types_0_and_1.code || Zn.code === _.Construct_signatures_with_no_arguments_have_incompatible_return_types_0_and_1.code ? "" : "..."; Ut = `${sr}${Ut}(${Ar})` } break } case _.Type_at_position_0_in_source_is_not_compatible_with_type_at_position_1_in_target.code: { wn.unshift([_.Type_at_position_0_in_source_is_not_compatible_with_type_at_position_1_in_target, fn[0], fn[1]]); break } case _.Type_at_positions_0_through_1_in_source_is_not_compatible_with_type_at_position_2_in_target.code: { wn.unshift([_.Type_at_positions_0_through_1_in_source_is_not_compatible_with_type_at_position_2_in_target, fn[0], fn[1], fn[2]]); break } default: return L.fail(`Unhandled Diagnostic: ${Zn.code}`) } } Ut ? Hr(Ut[Ut.length - 1] === ")" ? _.The_types_returned_by_0_are_incompatible_between_these_types : _.The_types_of_0_are_incompatible_between_these_types, Ut) : wn.shift(); for (let [Zn, ...fn] of wn) { let sr = Zn.elidedInCompatabilityPyramid; Zn.elidedInCompatabilityPyramid = !1, Hr(Zn, ...fn), Zn.elidedInCompatabilityPyramid = sr } dt && wa(void 0, ...dt) } function Hr(ze, dt, Ut, wn, Zn) { L.assert(!!u), cn && Br(), !ze.elidedInCompatabilityPyramid && (O = da(O, ze, dt, Ut, wn, Zn)) } function qi(ze) { L.assert(!!O), H ? H.push(ze) : H = [ze] } function wa(ze, dt, Ut) { cn && Br(); let [wn, Zn] = Wt(dt, Ut), fn = dt, sr = wn; if (uD(dt) && !Hne(Ut) && (fn = ky(dt), L.assert(!to(fn, Ut), "generalized source shouldn't be assignable"), sr = lr(fn)), (Ut.flags & 8388608 && !(dt.flags & 8388608) ? Ut.objectType.flags : Ut.flags) & 262144 && Ut !== ss && Ut !== qs) { let Ei = bu(Ut), ia; Ei && (to(fn, Ei) || (ia = to(dt, Ei))) ? Hr(_._0_is_assignable_to_the_constraint_of_type_1_but_1_could_be_instantiated_with_a_different_subtype_of_constraint_2, ia ? wn : sr, Zn, Ee(Ei)) : (O = void 0, Hr(_._0_could_be_instantiated_with_an_arbitrary_type_which_could_be_unrelated_to_1, Zn, sr)) } if (ze) ze === _.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1 && Pe && r2e(dt, Ut).length && (ze = _.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties); else if (c === ed) ze = _.Type_0_is_not_comparable_to_type_1; else if (wn === Zn) ze = _.Type_0_is_not_assignable_to_type_1_Two_different_types_with_this_name_exist_but_they_are_unrelated; else if (Pe && r2e(dt, Ut).length) ze = _.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties; else { if (dt.flags & 128 && Ut.flags & 1048576) { let Ei = uQe(dt, Ut); if (Ei) { Hr(_.Type_0_is_not_assignable_to_type_1_Did_you_mean_2, sr, Zn, Ee(Ei)); return } } ze = _.Type_0_is_not_assignable_to_type_1 } Hr(ze, sr, Zn) } function Xc(ze, dt) { let Ut = ci(ze.symbol) ? Ee(ze, ze.symbol.valueDeclaration) : Ee(ze), wn = ci(dt.symbol) ? Ee(dt, dt.symbol.valueDeclaration) : Ee(dt); (Ws === ze && ae === dt || hd === ze && rt === dt || vc === ze && Te === dt || iAe() === ze && j === dt) && Hr(_._0_is_a_primitive_but_1_is_a_wrapper_object_Prefer_using_0_when_possible, wn, Ut) } function pf(ze, dt, Ut) { return po(ze) ? ze.target.readonly && vB(dt) ? (Ut && Hr(_.The_type_0_is_readonly_and_cannot_be_assigned_to_the_mutable_type_1, Ee(ze), Ee(dt)), !1) : JE(dt) : CC(ze) && vB(dt) ? (Ut && Hr(_.The_type_0_is_readonly_and_cannot_be_assigned_to_the_mutable_type_1, Ee(ze), Ee(dt)), !1) : po(dt) ? _f(ze) : !0 } function Hd(ze, dt, Ut) { return ji(ze, dt, 3, Ut) } function ji(ze, dt, Ut = 3, wn = !1, Zn, fn = 0) { if (ze.flags & 524288 && dt.flags & 134348796) return c === ed && !(dt.flags & 131072) && lD(dt, ze, c) || lD(ze, dt, c, wn ? Hr : void 0) ? -1 : (wn && In(ze, dt, ze, dt, Zn), 0); let sr = mM(ze, !1), Ar = mM(dt, !0); if (sr === Ar) return -1; if (c === td) return sr.flags !== Ar.flags ? 0 : sr.flags & 67358815 ? -1 : (qn(sr, Ar), Mn(sr, Ar, !1, 0, Ut)); if (sr.flags & 262144 && VE(sr) === Ar) return -1; if (sr.flags & 470302716 && Ar.flags & 1048576) { let Ei = Ar.types, ia = Ei.length === 2 && Ei[0].flags & 98304 ? Ei[1] : Ei.length === 3 && Ei[0].flags & 98304 && Ei[1].flags & 98304 ? Ei[2] : void 0; if (ia && !(ia.flags & 98304) && (Ar = mM(ia, !0), sr === Ar)) return -1 } if (c === ed && !(Ar.flags & 131072) && lD(Ar, sr, c) || lD(sr, Ar, c, wn ? Hr : void 0)) return -1; if (sr.flags & 469499904 || Ar.flags & 469499904) { if (!(fn & 2) && Xv(sr) && Ur(sr) & 8192 && ga(sr, Ar, wn)) return wn && wa(Zn, sr, dt.aliasSymbol ? dt : Ar), 0; let ia = (c !== ed || N_(sr)) && !(fn & 2) && sr.flags & 136970236 && sr !== ka && Ar.flags & 2621440 && a2e(Ar) && (Jo(sr).length > 0 || EU(sr)), Aa = !!(Ur(sr) & 2048); if (ia && !lXe(sr, Ar, Aa)) { if (wn) { let Oa = Ee(ze.aliasSymbol ? ze : sr), mo = Ee(dt.aliasSymbol ? dt : Ar), co = xa(sr, 0), as = xa(sr, 1); co.length > 0 && ji(qo(co[0]), Ar, 1, !1) || as.length > 0 && ji(qo(as[0]), Ar, 1, !1) ? Hr(_.Value_of_type_0_has_no_properties_in_common_with_type_1_Did_you_mean_to_call_it, Oa, mo) : Hr(_.Type_0_has_no_properties_in_common_with_type_1, Oa, mo) } return 0 } qn(sr, Ar); let Zr = sr.flags & 1048576 && sr.types.length < 4 && !(Ar.flags & 1048576) || Ar.flags & 1048576 && Ar.types.length < 4 && !(sr.flags & 469499904) ? ko(sr, Ar, wn, fn) : Mn(sr, Ar, wn, fn, Ut); if (Zr) return Zr } return wn && In(ze, dt, sr, Ar, Zn), 0 } function In(ze, dt, Ut, wn, Zn) { var fn, sr; let Ar = !!Yne(ze), Ei = !!Yne(dt); Ut = ze.aliasSymbol || Ar ? ze : Ut, wn = dt.aliasSymbol || Ei ? dt : wn; let ia = Nn > 0; if (ia && Nn--, Ut.flags & 524288 && wn.flags & 524288) { let Aa = O; pf(Ut, wn, !0), O !== Aa && (ia = !!O) } if (Ut.flags & 524288 && wn.flags & 134348796) Xc(Ut, wn); else if (Ut.symbol && Ut.flags & 524288 && ka === Ut) Hr(_.The_Object_type_is_assignable_to_very_few_other_types_Did_you_mean_to_use_the_any_type_instead); else if (Ur(Ut) & 2048 && wn.flags & 2097152) { let Aa = wn.types, Ra = s0(Qd.IntrinsicAttributes, u), Zr = s0(Qd.IntrinsicClassAttributes, u); if (!Ro(Ra) && !Ro(Zr) && (ya(Aa, Ra) || ya(Aa, Zr))) return } else O = Xte(O, dt); if (!Zn && ia) { en = [Ut, wn]; return } if (wa(Zn, Ut, wn), Ut.flags & 262144 && ((sr = (fn = Ut.symbol) == null ? void 0 : fn.declarations) != null && sr[0]) && !VE(Ut)) { let Aa = uB(Ut); if (Aa.constraint = Oi(wn, n0(Ut, Aa)), $k(Aa)) { let Ra = Ee(wn, Ut.symbol.declarations[0]); qi(hr(Ut.symbol.declarations[0], _.This_type_parameter_might_need_an_extends_0_constraint, Ra)) } } } function qn(ze, dt) { if (ai && ze.flags & 3145728 && dt.flags & 3145728) { let Ut = ze, wn = dt; if (Ut.objectFlags & wn.objectFlags & 32768) return; let Zn = Ut.types.length, fn = wn.types.length; Zn * fn > 1e6 && ai.instant(ai.Phase.CheckTypes, "traceUnionsOrIntersectionsTooLarge_DepthLimit", { sourceId: ze.id, sourceSize: Zn, targetId: dt.id, targetSize: fn, pos: u?.pos, end: u?.end }) } } function Mi(ze, dt) { return Gr(ou(ze, (wn, Zn) => { var fn; Zn = Eu(Zn); let sr = Zn.flags & 3145728 ? qte(Zn, dt) : qb(Zn, dt), Ar = sr && zn(sr) || ((fn = jx(Zn, dt)) == null ? void 0 : fn.type) || Oe; return Sn(wn, Ar) }, void 0) || Je) } function ga(ze, dt, Ut) { var wn; if (!NM(dt) || !ge && Ur(dt) & 4096) return !1; let Zn = !!(Ur(ze) & 2048); if ((c === Zu || c === ed) && (gD(ka, dt) || !Zn && mh(dt))) return !1; let fn = dt, sr; dt.flags & 1048576 && (fn = mke(ze, dt, ji) || _it(dt), sr = fn.flags & 1048576 ? fn.types : [fn]); for (let Ar of Jo(ze)) if (Bi(Ar, ze.symbol) && !n2e(ze, Ar)) { if (!Vre(fn, Ar.escapedName, Zn)) { if (Ut) { let Ei = jc(fn, NM); if (!u) return L.fail(); if (K0(u) || Au(u) || Au(u.parent)) { Ar.valueDeclaration && Sp(Ar.valueDeclaration) && Gn(u) === Gn(Ar.valueDeclaration.name) && (u = Ar.valueDeclaration.name); let ia = E(Ar), Aa = VCe(ia, Ei), Ra = Aa ? E(Aa) : void 0; Ra ? Hr(_.Property_0_does_not_exist_on_type_1_Did_you_mean_2, ia, Ee(Ei), Ra) : Hr(_.Property_0_does_not_exist_on_type_1, ia, Ee(Ei)) } else { let ia = ((wn = ze.symbol) == null ? void 0 : wn.declarations) && Sl(ze.symbol.declarations), Aa; if (Ar.valueDeclaration && jn(Ar.valueDeclaration, Ra => Ra === ia) && Gn(ia) === Gn(u)) { let Ra = Ar.valueDeclaration; L.assertNode(Ra, Og), u = Ra; let Zr = Ra.name; Re(Zr) && (Aa = Xre(Zr, Ei)) } Aa !== void 0 ? Hr(_.Object_literal_may_only_specify_known_properties_but_0_does_not_exist_in_type_1_Did_you_mean_to_write_2, E(Ar), Ee(Ei), Aa) : Hr(_.Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1, E(Ar), Ee(Ei)) } } return !0 } if (sr && !ji(zn(Ar), Mi(sr, Ar.escapedName), 3, Ut)) return Ut && Rn(_.Types_of_property_0_are_incompatible, E(Ar)), !0 } return !1 } function Bi(ze, dt) { return ze.valueDeclaration && dt.valueDeclaration && ze.valueDeclaration.parent === dt.valueDeclaration } function ko(ze, dt, Ut, wn) { if (ze.flags & 1048576) return c === ed ? Tu(ze, dt, Ut && !(ze.flags & 134348796), wn) : he(ze, dt, Ut && !(ze.flags & 134348796), wn); if (dt.flags & 1048576) return Xs(EM(ze), dt, Ut && !(ze.flags & 134348796) && !(dt.flags & 134348796)); if (dt.flags & 2097152) return no(ze, dt, Ut, 2); if (c === ed && dt.flags & 134348796) { let Zn = Tl(ze.types, fn => fn.flags & 465829888 ? bu(fn) || ue : fn); if (Zn !== ze.types) { if (ze = so(Zn), ze.flags & 131072) return 0; if (!(ze.flags & 2097152)) return ji(ze, dt, 1, !1) || ji(dt, ze, 1, !1) } } return Tu(ze, dt, !1, 1) } function us(ze, dt) { let Ut = -1, wn = ze.types; for (let Zn of wn) { let fn = Xs(Zn, dt, !1); if (!fn) return 0; Ut &= fn } return Ut } function Xs(ze, dt, Ut) { let wn = dt.types; if (dt.flags & 1048576) { if (Qb(wn, ze)) return -1; let Zn = O2e(dt, ze); if (Zn) { let fn = ji(ze, Zn, 2, !1); if (fn) return fn } } for (let Zn of wn) { let fn = ji(ze, Zn, 2, !1); if (fn) return fn } if (Ut) { let Zn = i2e(ze, dt, ji); Zn && ji(ze, Zn, 2, !0) } return 0 } function no(ze, dt, Ut, wn) { let Zn = -1, fn = dt.types; for (let sr of fn) { let Ar = ji(ze, sr, 2, Ut, void 0, wn); if (!Ar) return 0; Zn &= Ar } return Zn } function Tu(ze, dt, Ut, wn) { let Zn = ze.types; if (ze.flags & 1048576 && Qb(Zn, dt)) return -1; let fn = Zn.length; for (let sr = 0; sr < fn; sr++) { let Ar = ji(Zn[sr], dt, 1, Ut && sr === fn - 1, void 0, wn); if (Ar) return Ar } return 0 } function et(ze, dt) { return ze.flags & 1048576 && dt.flags & 1048576 && !(ze.types[0].flags & 32768) && dt.types[0].flags & 32768 ? DC(dt, -32769) : dt } function he(ze, dt, Ut, wn) { let Zn = -1, fn = ze.types, sr = et(ze, dt); for (let Ar = 0; Ar < fn.length; Ar++) { let Ei = fn[Ar]; if (sr.flags & 1048576 && fn.length >= sr.types.length && fn.length % sr.types.length === 0) { let Aa = ji(Ei, sr.types[Ar % sr.types.length], 3, !1, void 0, wn); if (Aa) { Zn &= Aa; continue } } let ia = ji(Ei, dt, 1, Ut, void 0, wn); if (!ia) return 0; Zn &= ia } return Zn } function Bn(ze = Je, dt = Je, Ut = Je, wn, Zn) { if (ze.length !== dt.length && c === td) return 0; let fn = ze.length <= dt.length ? ze.length : dt.length, sr = -1; for (let Ar = 0; Ar < fn; Ar++) { let Ei = Ar < Ut.length ? Ut[Ar] : 1, ia = Ei & 7; if (ia !== 4) { let Aa = ze[Ar], Ra = dt[Ar], Zr = -1; if (Ei & 8 ? Zr = c === td ? ji(Aa, Ra, 3, !1) : sD(Aa, Ra) : ia === 1 ? Zr = ji(Aa, Ra, 3, wn, void 0, Zn) : ia === 2 ? Zr = ji(Ra, Aa, 3, wn, void 0, Zn) : ia === 3 ? (Zr = ji(Ra, Aa, 3, !1), Zr || (Zr = ji(Aa, Ra, 3, wn, void 0, Zn))) : (Zr = ji(Aa, Ra, 3, wn, void 0, Zn), Zr && (Zr &= ji(Ra, Aa, 3, wn, void 0, Zn))), !Zr) return 0; sr &= Zr } } return sr } function Mn(ze, dt, Ut, wn, Zn) { var fn, sr, Ar; if (un) return 0; let Ei = Kne(ze, dt, wn, c, !1), ia = c.get(Ei); if (ia !== void 0 && !(Ut && ia & 2 && !(ia & 4))) { if (Qr) { let co = ia & 24; co & 8 && Oi(ze, gn), co & 16 && Oi(ze, Wi) } return ia & 1 ? -1 : 0 } if (!J) J = [], de = [], Ae = []; else { let co = Ei.startsWith("*") ? Kne(ze, dt, wn, c, !0) : void 0; for (let as = 0; as < xe; as++)if (Ei === J[as] || co && co === J[as]) return 3; if (tt === 100 || It === 100) return un = !0, 0 } let Aa = xe; J[xe] = Ei, xe++; let Ra = Tn; Zn & 1 && (de[tt] = ze, tt++, !(Tn & 1) && yM(ze, de, tt) && (Tn |= 1)), Zn & 2 && (Ae[It] = dt, It++, !(Tn & 2) && yM(dt, Ae, It) && (Tn |= 2)); let Zr, Oa = 0; Qr && (Zr = Qr, Qr = co => (Oa |= co ? 16 : 8, Zr(co))); let mo; if (Tn === 3 ? ((fn = ai) == null || fn.instant(ai.Phase.CheckTypes, "recursiveTypeRelatedTo_DepthLimit", { sourceId: ze.id, sourceIdStack: de.map(co => co.id), targetId: dt.id, targetIdStack: Ae.map(co => co.id), depth: tt, targetDepth: It }), mo = 3) : ((sr = ai) == null || sr.push(ai.Phase.CheckTypes, "structuredTypeRelatedTo", { sourceId: ze.id, targetId: dt.id }), mo = or(ze, dt, Ut, wn), (Ar = ai) == null || Ar.pop()), Qr && (Qr = Zr), Zn & 1 && tt--, Zn & 2 && It--, Tn = Ra, mo) { if (mo === -1 || tt === 0 && It === 0) { if (mo === -1 || mo === 3) for (let co = Aa; co < xe; co++)c.set(J[co], 1 | Oa); xe = Aa } } else c.set(Ei, (Ut ? 4 : 0) | 2 | Oa), xe = Aa; return mo } function or(ze, dt, Ut, wn) { let Zn = Cn(), fn = _r(ze, dt, Ut, wn, Zn); if (c !== td) { if (!fn && (ze.flags & 2097152 || ze.flags & 262144 && dt.flags & 1048576)) { let sr = jJe(ze.flags & 2097152 ? ze.types : [ze], !!(dt.flags & 1048576)); sr && Im(sr, Ar => Ar !== ze) && (fn = ji(sr, dt, 1, !1, void 0, wn)) } fn && !(wn & 2) && dt.flags & 2097152 && !Zb(dt) && ze.flags & 2621440 ? (fn &= Ft(ze, dt, Ut, void 0, !1, 0), fn && Xv(ze) && Ur(ze) & 8192 && (fn &= Bo(ze, dt, !1, Ut, 0))) : fn && rB(dt) && !JE(dt) && ze.flags & 2097152 && Eu(ze).flags & 3670016 && !vt(ze.types, sr => sr === dt || !!(Ur(sr) & 262144)) && (fn &= Ft(ze, dt, Ut, void 0, !0, wn)) } return fn && Jt(Zn), fn } function _r(ze, dt, Ut, wn, Zn) { let fn, sr, Ar = !1, Ei = ze.flags, ia = dt.flags; if (c === td) { if (Ei & 3145728) { let Zr = us(ze, dt); return Zr && (Zr &= us(dt, ze)), Zr } if (Ei & 4194304) return ji(ze.type, dt.type, 3, !1); if (Ei & 8388608 && (fn = ji(ze.objectType, dt.objectType, 3, !1)) && (fn &= ji(ze.indexType, dt.indexType, 3, !1)) || Ei & 16777216 && ze.root.isDistributive === dt.root.isDistributive && (fn = ji(ze.checkType, dt.checkType, 3, !1)) && (fn &= ji(ze.extendsType, dt.extendsType, 3, !1)) && (fn &= ji(Hv(ze), Hv(dt), 3, !1)) && (fn &= ji(Wv(ze), Wv(dt), 3, !1)) || Ei & 33554432 && (fn = ji(ze.baseType, dt.baseType, 3, !1)) && (fn &= ji(ze.constraint, dt.constraint, 3, !1))) return fn; if (!(Ei & 524288)) return 0 } else if (Ei & 3145728 || ia & 3145728) { if (fn = ko(ze, dt, Ut, wn)) return fn; if (!(Ei & 465829888 || Ei & 524288 && ia & 1048576 || Ei & 2097152 && ia & 467402752)) return 0 } if (Ei & 17301504 && ze.aliasSymbol && ze.aliasTypeArguments && ze.aliasSymbol === dt.aliasSymbol && !(hB(ze) || hB(dt))) { let Zr = o2e(ze.aliasSymbol); if (Zr === Je) return 1; let Oa = Ai(ze.aliasSymbol).typeParameters, mo = Mp(Oa), co = Sy(ze.aliasTypeArguments, Oa, mo, Yn(ze.aliasSymbol.valueDeclaration)), as = Sy(dt.aliasTypeArguments, Oa, mo, Yn(ze.aliasSymbol.valueDeclaration)), Ul = Ra(co, as, Zr, wn); if (Ul !== void 0) return Ul } if (_2e(ze) && !ze.target.readonly && (fn = ji(Ko(ze)[0], dt, 1)) || _2e(dt) && (dt.target.readonly || vB(bu(ze) || ze)) && (fn = ji(ze, Ko(dt)[0], 2))) return fn; if (ia & 262144) { if (Ur(ze) & 32 && !ze.declaration.nameType && ji(Gp(dt), rp(ze), 3) && !(Pp(ze) & 4)) { let Zr = _h(ze), Oa = od(dt, w_(ze)); if (fn = ji(Zr, Oa, 3, Ut)) return fn } if (c === ed && Ei & 262144) { let Zr = eu(ze); if (Zr && $k(ze)) for (; Zr && yh(Zr, Oa => !!(Oa.flags & 262144));) { if (fn = ji(Zr, dt, 1, !1)) return fn; Zr = eu(Zr) } return 0 } } else if (ia & 4194304) { let Zr = dt.type; if (Ei & 4194304 && (fn = ji(Zr, ze.type, 3, !1))) return fn; if (po(Zr)) { if (fn = ji(ze, _Ae(Zr), 2, Ut)) return fn } else { let Oa = jte(Zr); if (Oa) { if (ji(ze, Gp(Oa, dt.stringsOnly), 2, Ut) === -1) return -1 } else if (df(Zr)) { let mo = by(Zr), co = rp(Zr), as; if (mo && Yk(Zr)) { let Ul = Eu(yC(Zr)), F_ = []; Ute(Ul, 8576, !1, Dm => void F_.push(Oi(mo, oD(Zr.mapper, w_(Zr), Dm)))), as = Gr([...F_, mo]) } else as = mo || co; if (ji(ze, as, 2, Ut) === -1) return -1 } } } else if (ia & 8388608) { if (Ei & 8388608) { if ((fn = ji(ze.objectType, dt.objectType, 3, Ut)) && (fn &= ji(ze.indexType, dt.indexType, 3, Ut)), fn) return fn; Ut && (sr = O) } if (c === Zu || c === ed) { let Zr = dt.objectType, Oa = dt.indexType, mo = bu(Zr) || Zr, co = bu(Oa) || Oa; if (!Zb(mo) && !jv(co)) { let as = 4 | (mo !== Zr ? 2 : 0), Ul = Ay(mo, co, as); if (Ul) { if (Ut && sr && Jt(Zn), fn = ji(ze, Ul, 2, Ut, void 0, wn)) return fn; Ut && sr && O && (O = Aa([sr]) <= Aa([O]) ? sr : O) } } } Ut && (sr = void 0) } else if (df(dt) && c !== td) { let Zr = !!dt.declaration.nameType, Oa = _h(dt), mo = Pp(dt); if (!(mo & 8)) { if (!Zr && Oa.flags & 8388608 && Oa.objectType === ze && Oa.indexType === w_(dt)) return -1; if (!df(ze)) { let co = Zr ? by(dt) : rp(dt), as = Gp(ze, void 0, !0), Ul = mo & 4, F_ = Ul ? QP(co, as) : void 0; if (Ul ? !(F_.flags & 131072) : ji(co, as, 3)) { let Dm = _h(dt), $v = w_(dt), U1 = DC(Dm, -98305); if (!Zr && U1.flags & 8388608 && U1.indexType === $v) { if (fn = ji(ze, U1.objectType, 2, Ut)) return fn } else { let KC = Zr ? F_ || co : F_ ? so([F_, $v]) : $v, Hp = od(ze, KC); if (fn = ji(Hp, Dm, 3, Ut)) return fn } } sr = O, Jt(Zn) } } } else if (ia & 16777216) { if (yM(dt, Ae, It, 10)) return 3; let Zr = dt; if (!Zr.root.inferTypeParameters && !Tqe(Zr.root)) { let Oa = !to(dB(Zr.checkType), dB(Zr.extendsType)), mo = !Oa && to(zE(Zr.checkType), zE(Zr.extendsType)); if ((fn = Oa ? -1 : ji(ze, Hv(Zr), 2, !1, void 0, wn)) && (fn &= mo ? -1 : ji(ze, Wv(Zr), 2, !1, void 0, wn), fn)) return fn } } else if (ia & 134217728) { if (Ei & 134217728) { if (c === ed) return XXe(ze, dt) ? 0 : -1; Oi(ze, Wi) } if (_re(ze, dt)) return -1 } else if (dt.flags & 268435456 && !(ze.flags & 268435456) && fre(ze, dt)) return -1; if (Ei & 8650752) { if (!(Ei & 8388608 && ia & 8388608)) { let Zr = VE(ze) || ue; if (fn = ji(Zr, dt, 1, !1, void 0, wn)) return fn; if (fn = ji(uf(Zr, ze), dt, 1, Ut && Zr !== ue && !(ia & Ei & 262144), void 0, wn)) return fn; if (Jte(ze)) { let Oa = VE(ze.indexType); if (Oa && (fn = ji(od(ze.objectType, Oa), dt, 1, Ut))) return fn } } } else if (Ei & 4194304) { if (fn = ji(Si, dt, 1, Ut)) return fn } else if (Ei & 134217728 && !(ia & 524288)) { if (!(ia & 134217728)) { let Zr = bu(ze); if (Zr && Zr !== ze && (fn = ji(Zr, dt, 1, Ut))) return fn } } else if (Ei & 268435456) if (ia & 268435456) { if (ze.symbol !== dt.symbol) return 0; if (fn = ji(ze.type, dt.type, 3, Ut)) return fn } else { let Zr = bu(ze); if (Zr && (fn = ji(Zr, dt, 1, Ut))) return fn } else if (Ei & 16777216) { if (yM(ze, de, tt, 10)) return 3; if (ia & 16777216) { let Oa = ze.root.inferTypeParameters, mo = ze.extendsType, co; if (Oa) { let as = _D(Oa, void 0, 0, Hd); gh(as.inferences, dt.extendsType, mo, 1536), mo = Oi(mo, as.mapper), co = as.mapper } if (ph(mo, dt.extendsType) && (ji(ze.checkType, dt.checkType, 3) || ji(dt.checkType, ze.checkType, 3)) && ((fn = ji(Oi(Hv(ze), co), Hv(dt), 3, Ut)) && (fn &= ji(Wv(ze), Wv(dt), 3, Ut)), fn)) return fn } else { let Oa = $k(ze) ? Dxe(ze) : void 0; if (Oa && (fn = ji(Oa, dt, 1, Ut))) return fn } let Zr = Hte(ze); if (Zr && (fn = ji(Zr, dt, 1, Ut))) return fn } else { if (c !== hm && c !== x_ && PJe(dt) && mh(ze)) return -1; if (df(dt)) return df(ze) && (fn = ua(ze, dt, Ut)) ? fn : 0; let Zr = !!(Ei & 134348796); if (c !== td) ze = Eu(ze), Ei = ze.flags; else if (df(ze)) return 0; if (Ur(ze) & 4 && Ur(dt) & 4 && ze.target === dt.target && !po(ze) && !(hB(ze) || hB(dt))) { if (bB(ze)) return -1; let Oa = zne(ze.target); if (Oa === Je) return 1; let mo = Ra(Ko(ze), Ko(dt), Oa, wn); if (mo !== void 0) return mo } else { if (CC(dt) ? JE(ze) : _f(dt) && po(ze) && !ze.target.readonly) return c !== td ? ji(fg(ze, rt) || Se, fg(dt, rt) || Se, 3, Ut) : 0; if ((c === hm || c === x_) && mh(dt) && Ur(dt) & 8192 && !mh(ze)) return 0 } if (Ei & 2621440 && ia & 524288) { let Oa = Ut && O === Zn.errorInfo && !Zr; if (fn = Ft(ze, dt, Oa, void 0, !1, wn), fn && (fn &= Un(ze, dt, 0, Oa, wn), fn && (fn &= Un(ze, dt, 1, Oa, wn), fn && (fn &= Bo(ze, dt, Zr, Oa, wn)))), Ar && fn) O = sr || O || Zn.errorInfo; else if (fn) return fn } if (Ei & 2621440 && ia & 1048576) { let Oa = DC(dt, 36175872); if (Oa.flags & 1048576) { let mo = _i(ze, Oa); if (mo) return mo } } } return 0; function Aa(Zr) { return Zr ? ou(Zr, (Oa, mo) => Oa + 1 + Aa(mo.next), 0) : 0 } function Ra(Zr, Oa, mo, co) { if (fn = Bn(Zr, Oa, mo, Ut, co)) return fn; if (vt(mo, Ul => !!(Ul & 24))) { sr = void 0, Jt(Zn); return } let as = Oa && uXe(Oa, mo); if (Ar = !as, mo !== Je && !as) { if (Ar && !(Ut && vt(mo, Ul => (Ul & 7) === 0))) return 0; sr = O, Jt(Zn) } } } function ua(ze, dt, Ut) { if (c === ed || (c === td ? Pp(ze) === Pp(dt) : Vte(ze) <= Vte(dt))) { let Zn, fn = rp(dt), sr = Oi(rp(ze), Vte(ze) < 0 ? gn : Wi); if (Zn = ji(fn, sr, 3, Ut)) { let Ar = Wu([w_(ze)], [w_(dt)]); if (Oi(by(ze), Ar) === Oi(by(dt), Ar)) return Zn & ji(Oi(_h(ze), Ar), _h(dt), 3, Ut) } } return 0 } function _i(ze, dt) { var Ut; let wn = Jo(ze), Zn = R2e(wn, dt); if (!Zn) return 0; let fn = 1; for (let Ra of Zn) if (fn *= SYe(Gv(Ra)), fn > 25) return (Ut = ai) == null || Ut.instant(ai.Phase.CheckTypes, "typeRelatedToDiscriminatedType_DepthLimit", { sourceId: ze.id, targetId: dt.id, numCombinations: fn }), 0; let sr = new Array(Zn.length), Ar = new Set; for (let Ra = 0; Ra < Zn.length; Ra++) { let Zr = Zn[Ra], Oa = Gv(Zr); sr[Ra] = Oa.flags & 1048576 ? Oa.types : [Oa], Ar.add(Zr.escapedName) } let Ei = Rae(sr), ia = []; for (let Ra of Ei) { let Zr = !1; e: for (let Oa of dt.types) { for (let mo = 0; mo < Zn.length; mo++) { let co = Zn[mo], as = ja(Oa, co.escapedName); if (!as) continue e; if (co === as) continue; if (!Ct(ze, dt, co, as, F_ => Ra[mo], !1, 0, U || c === ed)) continue e } Of(ia, Oa, Zv), Zr = !0 } if (!Zr) return 0 } let Aa = -1; for (let Ra of ia) if (Aa &= Ft(ze, Ra, !1, Ar, !1, 0), Aa && (Aa &= Un(ze, Ra, 0, !1, 0), Aa && (Aa &= Un(ze, Ra, 1, !1, 0), Aa && !(po(ze) && po(Ra)) && (Aa &= Bo(ze, Ra, !1, !1, 0)))), !Aa) return Aa; return Aa } function ur(ze, dt) { if (!dt || ze.length === 0) return ze; let Ut; for (let wn = 0; wn < ze.length; wn++)dt.has(ze[wn].escapedName) ? Ut || (Ut = ze.slice(0, wn)) : Ut && Ut.push(ze[wn]); return Ut || ze } function st(ze, dt, Ut, wn, Zn) { let fn = U && !!(ac(dt) & 48), sr = ao(Gv(dt), !1, fn), Ar = Ut(ze); return ji(Ar, sr, 3, wn, void 0, Zn) } function Ct(ze, dt, Ut, wn, Zn, fn, sr, Ar) { let Ei = Ef(Ut), ia = Ef(wn); if (Ei & 8 || ia & 8) { if (Ut.valueDeclaration !== wn.valueDeclaration) return fn && (Ei & 8 && ia & 8 ? Hr(_.Types_have_separate_declarations_of_a_private_property_0, E(wn)) : Hr(_.Property_0_is_private_in_type_1_but_not_in_type_2, E(wn), Ee(Ei & 8 ? ze : dt), Ee(Ei & 8 ? dt : ze))), 0 } else if (ia & 16) { if (!mXe(Ut, wn)) return fn && Hr(_.Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2, E(wn), Ee(N1(Ut) || ze), Ee(N1(wn) || dt)), 0 } else if (Ei & 16) return fn && Hr(_.Property_0_is_protected_in_type_1_but_public_in_type_2, E(wn), Ee(ze), Ee(dt)), 0; if (c === x_ && M_(Ut) && !M_(wn)) return 0; let Aa = st(Ut, wn, Zn, fn, sr); return Aa ? !Ar && Ut.flags & 16777216 && wn.flags & 106500 && !(wn.flags & 16777216) ? (fn && Hr(_.Property_0_is_optional_in_type_1_but_required_in_type_2, E(wn), Ee(ze), Ee(dt)), 0) : Aa : (fn && Rn(_.Types_of_property_0_are_incompatible, E(wn)), 0) } function Bt(ze, dt, Ut, wn) { let Zn = !1; if (Ut.valueDeclaration && zl(Ut.valueDeclaration) && pi(Ut.valueDeclaration.name) && ze.symbol && ze.symbol.flags & 32) { let sr = Ut.valueDeclaration.name.escapedText, Ar = hR(ze.symbol, sr); if (Ar && ja(ze, Ar)) { let Ei = D.getDeclarationName(ze.symbol.valueDeclaration), ia = D.getDeclarationName(dt.symbol.valueDeclaration); Hr(_.Property_0_in_type_1_refers_to_a_different_member_that_cannot_be_accessed_from_within_type_2, Cf(sr), Cf(Ei.escapedText === "" ? nN : Ei), Cf(ia.escapedText === "" ? nN : ia)); return } } let fn = lo(lre(ze, dt, wn, !1)); if ((!p || p.code !== _.Class_0_incorrectly_implements_interface_1.code && p.code !== _.Class_0_incorrectly_implements_class_1_Did_you_mean_to_extend_1_and_inherit_its_members_as_a_subclass.code) && (Zn = !0), fn.length === 1) { let sr = E(Ut, void 0, 0, 20); Hr(_.Property_0_is_missing_in_type_1_but_required_in_type_2, sr, ...Wt(ze, dt)), Fn(Ut.declarations) && qi(hr(Ut.declarations[0], _._0_is_declared_here, sr)), Zn && O && Nn++ } else pf(ze, dt, !1) && (fn.length > 5 ? Hr(_.Type_0_is_missing_the_following_properties_from_type_1_Colon_2_and_3_more, Ee(ze), Ee(dt), on(fn.slice(0, 4), sr => E(sr)).join(", "), fn.length - 4) : Hr(_.Type_0_is_missing_the_following_properties_from_type_1_Colon_2, Ee(ze), Ee(dt), on(fn, sr => E(sr)).join(", ")), Zn && O && Nn++) } function Ft(ze, dt, Ut, wn, Zn, fn) { if (c === td) return hn(ze, dt, wn); let sr = -1; if (po(dt)) { if (JE(ze)) { if (!dt.target.readonly && (CC(ze) || po(ze) && ze.target.readonly)) return 0; let Ra = Vv(ze), Zr = Vv(dt), Oa = po(ze) ? ze.target.combinedFlags & 4 : 4, mo = dt.target.combinedFlags & 4, co = po(ze) ? ze.target.minLength : 0, as = dt.target.minLength; if (!Oa && Ra < as) return Ut && Hr(_.Source_has_0_element_s_but_target_requires_1, Ra, as), 0; if (!mo && Zr < co) return Ut && Hr(_.Source_has_0_element_s_but_target_allows_only_1, co, Zr), 0; if (!mo && (Oa || Zr < Ra)) return Ut && (co < as ? Hr(_.Target_requires_0_element_s_but_source_may_have_fewer, as) : Hr(_.Target_allows_only_0_element_s_but_source_may_have_more, Zr)), 0; let Ul = Ko(ze), F_ = Ko(dt), Dm = VKe(dt.target, 11), $v = sM(dt.target, 11), U1 = dt.target.hasRestElement, KC = !!wn; for (let Hp = 0; Hp < Ra; Hp++) { let cA = po(ze) ? ze.target.elementFlags[Hp] : 4, lA = Ra - 1 - Hp, iT = U1 && Hp >= Dm ? Zr - 1 - Math.min(lA, $v) : Hp, sd = dt.target.elementFlags[iT]; if (sd & 8 && !(cA & 8)) return Ut && Hr(_.Source_provides_no_match_for_variadic_element_at_position_0_in_target, iT), 0; if (cA & 8 && !(sd & 12)) return Ut && Hr(_.Variadic_element_at_position_0_in_source_does_not_match_element_at_position_1_in_target, Hp, iT), 0; if (sd & 1 && !(cA & 1)) return Ut && Hr(_.Source_provides_no_match_for_required_element_at_position_0_in_target, iT), 0; if (KC && ((cA & 12 || sd & 12) && (KC = !1), KC && wn?.has("" + Hp))) continue; let bt = KE(Ul[Hp], !!(cA & sd & 2)), cr = F_[iT], oi = cA & 8 && sd & 4 ? nu(cr) : KE(cr, !!(sd & 2)), Jr = ji(bt, oi, 3, Ut, void 0, fn); if (!Jr) return Ut && (Zr > 1 || Ra > 1) && (U1 && Hp >= Dm && lA >= $v && Dm !== Ra - $v - 1 ? Rn(_.Type_at_positions_0_through_1_in_source_is_not_compatible_with_type_at_position_2_in_target, Dm, Ra - $v - 1, iT) : Rn(_.Type_at_position_0_in_source_is_not_compatible_with_type_at_position_1_in_target, Hp, iT)), 0; sr &= Jr } return sr } if (dt.target.combinedFlags & 12) return 0 } let Ar = (c === hm || c === x_) && !Xv(ze) && !bB(ze) && !po(ze), Ei = ure(ze, dt, Ar, !1); if (Ei) return Ut && yi(ze, dt) && Bt(ze, dt, Ei, Ar), 0; if (Xv(dt)) { for (let Ra of ur(Jo(ze), wn)) if (!qb(dt, Ra.escapedName) && !(zn(Ra).flags & 32768)) return Ut && Hr(_.Property_0_does_not_exist_on_type_1, E(Ra), Ee(dt)), 0 } let ia = Jo(dt), Aa = po(ze) && po(dt); for (let Ra of ur(ia, wn)) { let Zr = Ra.escapedName; if (!(Ra.flags & 4194304) && (!Aa || Wm(Zr) || Zr === "length") && (!Zn || Ra.flags & 16777216)) { let Oa = ja(ze, Zr); if (Oa && Oa !== Ra) { let mo = Ct(ze, dt, Oa, Ra, Gv, Ut, fn, c === ed); if (!mo) return 0; sr &= mo } } } return sr } function hn(ze, dt, Ut) { if (!(ze.flags & 524288 && dt.flags & 524288)) return 0; let wn = ur(Ey(ze), Ut), Zn = ur(Ey(dt), Ut); if (wn.length !== Zn.length) return 0; let fn = -1; for (let sr of wn) { let Ar = qb(dt, sr.escapedName); if (!Ar) return 0; let Ei = qne(sr, Ar, ji); if (!Ei) return 0; fn &= Ei } return fn } function Un(ze, dt, Ut, wn, Zn) { var fn, sr; if (c === td) return Sr(ze, dt, Ut); if (dt === aa || ze === aa) return -1; let Ar = ze.symbol && cp(ze.symbol.valueDeclaration), Ei = dt.symbol && cp(dt.symbol.valueDeclaration), ia = xa(ze, Ar && Ut === 1 ? 0 : Ut), Aa = xa(dt, Ei && Ut === 1 ? 0 : Ut); if (Ut === 1 && ia.length && Aa.length) { let co = !!(ia[0].flags & 4), as = !!(Aa[0].flags & 4); if (co && !as) return wn && Hr(_.Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type), 0; if (!Bl(ia[0], Aa[0], wn)) return 0 } let Ra = -1, Zr = Ut === 1 ? Xt : Di, Oa = Ur(ze), mo = Ur(dt); if (Oa & 64 && mo & 64 && ze.symbol === dt.symbol || Oa & 4 && mo & 4 && ze.target === dt.target) for (let co = 0; co < Aa.length; co++) { let as = er(ia[co], Aa[co], !0, wn, Zn, Zr(ia[co], Aa[co])); if (!as) return 0; Ra &= as } else if (ia.length === 1 && Aa.length === 1) { let co = c === ed || !!Y.noStrictGenericChecks, as = Vo(ia), Ul = Vo(Aa); if (Ra = er(as, Ul, co, wn, Zn, Zr(as, Ul)), !Ra && wn && Ut === 1 && Oa & mo && (((fn = Ul.declaration) == null ? void 0 : fn.kind) === 173 || ((sr = as.declaration) == null ? void 0 : sr.kind) === 173)) { let F_ = Dm => ne(Dm, void 0, 262144, Ut); return Hr(_.Type_0_is_not_assignable_to_type_1, F_(as), F_(Ul)), Hr(_.Types_of_construct_signatures_are_incompatible), Ra } } else e: for (let co of Aa) { let as = Cn(), Ul = wn; for (let F_ of ia) { let Dm = er(F_, co, !0, Ul, Zn, Zr(F_, co)); if (Dm) { Ra &= Dm, Jt(as); continue e } Ul = !1 } return Ul && Hr(_.Type_0_provides_no_match_for_the_signature_1, Ee(ze), ne(co, void 0, void 0, Ut)), 0 } return Ra } function yi(ze, dt) { let Ut = nM(ze, 0), wn = nM(ze, 1), Zn = Ey(ze); return (Ut.length || wn.length) && !Zn.length ? !!(xa(dt, 0).length && Ut.length || xa(dt, 1).length && wn.length) : !0 } function Di(ze, dt) { return ze.parameters.length === 0 && dt.parameters.length === 0 ? (Ut, wn) => Rn(_.Call_signatures_with_no_arguments_have_incompatible_return_types_0_and_1, Ee(Ut), Ee(wn)) : (Ut, wn) => Rn(_.Call_signature_return_types_0_and_1_are_incompatible, Ee(Ut), Ee(wn)) } function Xt(ze, dt) { return ze.parameters.length === 0 && dt.parameters.length === 0 ? (Ut, wn) => Rn(_.Construct_signatures_with_no_arguments_have_incompatible_return_types_0_and_1, Ee(Ut), Ee(wn)) : (Ut, wn) => Rn(_.Construct_signature_return_types_0_and_1_are_incompatible, Ee(Ut), Ee(wn)) } function er(ze, dt, Ut, wn, Zn, fn) { let sr = c === hm ? 16 : c === x_ ? 24 : 0; return Une(Ut ? tD(ze) : ze, Ut ? tD(dt) : dt, sr, wn, Hr, fn, Ar, Wi); function Ar(Ei, ia, Aa) { return ji(Ei, ia, 3, Aa, void 0, Zn) } } function Sr(ze, dt, Ut) { let wn = xa(ze, Ut), Zn = xa(dt, Ut); if (wn.length !== Zn.length) return 0; let fn = -1; for (let sr = 0; sr < wn.length; sr++) { let Ar = vM(wn[sr], Zn[sr], !1, !1, !1, ji); if (!Ar) return 0; fn &= Ar } return fn } function Dr(ze, dt, Ut, wn) { let Zn = -1, fn = dt.keyType, sr = ze.flags & 2097152 ? eM(ze) : Ey(ze); for (let Ar of sr) if (!n2e(ze, Ar) && Vx(TC(Ar, 8576), fn)) { let Ei = Gv(Ar), ia = Pe || Ei.flags & 32768 || fn === rt || !(Ar.flags & 16777216) ? Ei : wf(Ei, 524288), Aa = ji(ia, dt.type, 3, Ut, void 0, wn); if (!Aa) return Ut && Hr(_.Property_0_is_incompatible_with_index_signature, E(Ar)), 0; Zn &= Aa } for (let Ar of tu(ze)) if (Vx(Ar.keyType, fn)) { let Ei = Ii(Ar, dt, Ut, wn); if (!Ei) return 0; Zn &= Ei } return Zn } function Ii(ze, dt, Ut, wn) { let Zn = ji(ze.type, dt.type, 3, Ut, void 0, wn); return !Zn && Ut && (ze.keyType === dt.keyType ? Hr(_._0_index_signatures_are_incompatible, Ee(ze.keyType)) : Hr(_._0_and_1_index_signatures_are_incompatible, Ee(ze.keyType), Ee(dt.keyType))), Zn } function Bo(ze, dt, Ut, wn, Zn) { if (c === td) return ds(ze, dt); let fn = tu(dt), sr = vt(fn, Ei => Ei.keyType === ae), Ar = -1; for (let Ei of fn) { let ia = !Ut && sr && Ei.type.flags & 1 ? -1 : df(ze) && sr ? ji(_h(ze), Ei.type, 3, wn) : ys(ze, Ei, wn, Zn); if (!ia) return 0; Ar &= ia } return Ar } function ys(ze, dt, Ut, wn) { let Zn = rM(ze, dt.keyType); return Zn ? Ii(Zn, dt, Ut, wn) : !(wn & 1) && (c !== x_ || Ur(ze) & 8192) && xB(ze) ? Dr(ze, dt, Ut, wn) : (Ut && Hr(_.Index_signature_for_type_0_is_missing_in_type_1, Ee(dt.keyType), Ee(ze)), 0) } function ds(ze, dt) { let Ut = tu(ze), wn = tu(dt); if (Ut.length !== wn.length) return 0; for (let Zn of wn) { let fn = Cm(ze, Zn.keyType); if (!(fn && ji(fn.type, Zn.type, 3) && fn.isReadonly === Zn.isReadonly)) return 0 } return -1 } function Bl(ze, dt, Ut) { if (!ze.declaration || !dt.declaration) return !0; let wn = hS(ze.declaration, 24), Zn = hS(dt.declaration, 24); return Zn === 8 || Zn === 16 && wn !== 8 || Zn !== 16 && !wn ? !0 : (Ut && Hr(_.Cannot_assign_a_0_constructor_type_to_a_1_constructor_type, Ud(wn), Ud(Zn)), !1) } } function Hne(n) { if (n.flags & 16) return !1; if (n.flags & 3145728) return !!mn(n.types, Hne); if (n.flags & 465829888) { let a = VE(n); if (a && a !== n) return Hne(a) } return N_(n) || !!(n.flags & 134217728) || !!(n.flags & 268435456) } function r2e(n, a) { return po(n) && po(a) ? Je : Jo(a).filter(c => mB(Vc(n, c.escapedName), zn(c))) } function mB(n, a) { return !!n && !!a && Js(n, 32768) && !!fD(a) } function cXe(n) { return Jo(n).filter(a => fD(zn(a))) } function i2e(n, a, c = Gne) { return mke(n, a, c, !0) || lit(n, a) || uit(n, a) || dit(n, a) || fit(n, a) } function Wne(n, a, c, u, p) { let h = n.types.map(O => { }); for (let [O, H] of a) { let J = Kte(n, H); if (p && J && ac(J) & 16) continue; let de = 0; for (let Ae of n.types) { let xe = Vc(Ae, H); xe && c(O(), xe) ? h[de] = h[de] === void 0 ? !0 : h[de] : h[de] = !1, de++ } } let T = h.indexOf(!0); if (T === -1) return u; let k = h.indexOf(!0, T + 1); for (; k !== -1;) { if (!ph(n.types[T], n.types[k])) return u; k = h.indexOf(!0, k + 1) } return n.types[T] } function a2e(n) { if (n.flags & 524288) { let a = R_(n); return a.callSignatures.length === 0 && a.constructSignatures.length === 0 && a.indexInfos.length === 0 && a.properties.length > 0 && Ji(a.properties, c => !!(c.flags & 16777216)) } return n.flags & 2097152 ? Ji(n.types, a2e) : !1 } function lXe(n, a, c) { for (let u of Jo(n)) if (Vre(a, u.escapedName, c)) return !0; return !1 } function zne(n) { return n === $o || n === jo || n.objectFlags & 8 ? W : s2e(n.symbol, n.typeParameters) } function o2e(n) { return s2e(n, Ai(n).typeParameters) } function s2e(n, a = Je) { var c, u; let p = Ai(n); if (!p.variances) { (c = ai) == null || c.push(ai.Phase.CheckTypes, "getVariancesWorker", { arity: a.length, id: ru(gs(n)) }), p.variances = Je; let h = []; for (let T of a) { let k = Jne(T), O = k & 65536 ? k & 32768 ? 0 : 1 : k & 32768 ? 2 : void 0; if (O === void 0) { let H = !1, J = !1, de = Qr; Qr = tt => tt ? J = !0 : H = !0; let Ae = hM(n, T, md), xe = hM(n, T, Pc); O = (to(xe, Ae) ? 1 : 0) | (to(Ae, xe) ? 2 : 0), O === 3 && to(hM(n, T, bl), Ae) && (O = 4), Qr = de, (H || J) && (H && (O |= 8), J && (O |= 16)) } h.push(O) } p.variances = h, (u = ai) == null || u.pop({ variances: h.map(L.formatVariance) }) } return p.variances } function hM(n, a, c) { let u = n0(a, c), p = gs(n); if (Ro(p)) return p; let h = n.flags & 524288 ? Jx(n, hg(Ai(n).typeParameters, u)) : _g(p, hg(p.typeParameters, u)); return vn.add(ru(h)), h } function hB(n) { return vn.has(ru(n)) } function Jne(n) { var a; return ou((a = n.symbol) == null ? void 0 : a.declarations, (c, u) => c | uu(u), 0) & 100352 } function uXe(n, a) { for (let c = 0; c < a.length; c++)if ((a[c] & 7) === 1 && n[c].flags & 16384) return !0; return !1 } function dXe(n) { return n.flags & 262144 && !eu(n) } function fXe(n) { return !!(Ur(n) & 4) && !n.node } function gB(n) { return fXe(n) && vt(Ko(n), a => !!(a.flags & 262144) || gB(a)) } function _Xe(n, a, c, u) { let p = [], h = "", T = O(n, 0), k = O(a, 0); return `${h}${T},${k}${c}`; function O(H, J = 0) { let de = "" + H.target.id; for (let Ae of Ko(H)) { if (Ae.flags & 262144) { if (u || dXe(Ae)) { let xe = p.indexOf(Ae); xe < 0 && (xe = p.length, p.push(Ae)), de += "=" + xe; continue } h = "*" } else if (J < 4 && gB(Ae)) { de += "<" + O(Ae, J + 1) + ">"; continue } de += "-" + Ae.id } return de } } function Kne(n, a, c, u, p) { if (u === td && n.id > a.id) { let T = n; n = a, a = T } let h = c ? ":" + c : ""; return gB(n) && gB(a) ? _Xe(n, a, h, p) : `${n.id},${a.id}${h}` } function gM(n, a) { if (ac(n) & 6) { for (let c of n.links.containingType.types) { let u = ja(c, n.escapedName), p = u && gM(u, a); if (p) return p } return } return a(n) } function N1(n) { return n.parent && n.parent.flags & 32 ? gs(ju(n)) : void 0 } function yB(n) { let a = N1(n), c = a && _o(a)[0]; return c && Vc(c, n.escapedName) } function pXe(n, a) { return gM(n, c => { let u = N1(c); return u ? BE(u, a) : !1 }) } function mXe(n, a) { return !gM(a, c => Ef(c) & 16 ? !pXe(n, N1(c)) : !1) } function c2e(n, a, c) { return gM(a, u => Ef(u, c) & 16 ? !BE(n, N1(u)) : !1) ? void 0 : n } function yM(n, a, c, u = 3) { if (c >= u) { if (n.flags & 2097152) return vt(n.types, k => yM(k, a, c, u)); let p = AC(n), h = 0, T = 0; for (let k = 0; k < c; k++) { let O = a[k]; if (O.flags & 2097152 ? vt(O.types, H => AC(H) === p) : AC(O) === p) { if (O.id >= T && (h++, h >= u)) return !0; T = O.id } } } return !1 } function AC(n) { if (n.flags & 524288 && !pre(n)) { if (Ur(n) && n.node) return n.node; if (n.symbol && !(Ur(n) & 16 && n.symbol.flags & 32)) return n.symbol; if (po(n)) return n.target } if (n.flags & 262144) return n.symbol; if (n.flags & 8388608) { do n = n.objectType; while (n.flags & 8388608); return n } return n.flags & 16777216 ? n.root : n } function hXe(n, a) { return qne(n, a, sD) !== 0 } function qne(n, a, c) { if (n === a) return -1; let u = Ef(n) & 24, p = Ef(a) & 24; if (u !== p) return 0; if (u) { if (oA(n) !== oA(a)) return 0 } else if ((n.flags & 16777216) !== (a.flags & 16777216)) return 0; return M_(n) !== M_(a) ? 0 : c(zn(n), zn(a)) } function gXe(n, a, c) { let u = xd(n), p = xd(a), h = Vp(n), T = Vp(a), k = jp(n), O = jp(a); return !!(u === p && h === T && k === O || c && h <= T) } function vM(n, a, c, u, p, h) { if (n === a) return -1; if (!gXe(n, a, c) || Fn(n.typeParameters) !== Fn(a.typeParameters)) return 0; if (a.typeParameters) { let O = Wu(n.typeParameters, a.typeParameters); for (let H = 0; H < a.typeParameters.length; H++) { let J = n.typeParameters[H], de = a.typeParameters[H]; if (!(J === de || h(Oi(bC(J), O) || ue, bC(de) || ue) && h(Oi(jE(J), O) || ue, jE(de) || ue))) return 0 } n = $x(n, O, !0) } let T = -1; if (!u) { let O = Yb(n); if (O) { let H = Yb(a); if (H) { let J = h(O, H); if (!J) return 0; T &= J } } } let k = xd(a); for (let O = 0; O < k; O++) { let H = P_(n, O), J = P_(a, O), de = h(J, H); if (!de) return 0; T &= de } if (!p) { let O = Lf(n), H = Lf(a); T &= O || H ? yXe(O, H, h) : h(qo(n), qo(a)) } return T } function yXe(n, a, c) { return n && a && Ene(n, a) ? n.type === a.type ? -1 : n.type && a.type ? c(n.type, a.type) : 0 : 0 } function vXe(n) { let a; for (let c of n) if (!(c.flags & 131072)) { let u = ky(c); if (a ?? (a = u), u === c || u !== a) return !1 } return !0 } function l2e(n) { return ou(n, (a, c) => a | (c.flags & 1048576 ? l2e(c.types) : c.flags), 0) } function bXe(n) { if (n.length === 1) return n[0]; let a = U ? Tl(n, u => jc(u, p => !(p.flags & 98304))) : n, c = vXe(a) ? Gr(a) : ou(a, (u, p) => Iy(u, p) ? p : u); return a === n ? c : TB(c, l2e(n) & 98304) } function EXe(n) { return ou(n, (a, c) => Iy(c, a) ? c : a) } function _f(n) { return !!(Ur(n) & 4) && (n.target === $o || n.target === jo) } function CC(n) { return !!(Ur(n) & 4) && n.target === jo } function JE(n) { return _f(n) || po(n) } function vB(n) { return _f(n) && !CC(n) || po(n) && !n.target.readonly } function Xne(n) { return _f(n) ? Ko(n)[0] : void 0 } function Kv(n) { return _f(n) || !(n.flags & 98304) && to(n, Ri) } function Yne(n) { if (!(Ur(n) & 4) || !(Ur(n.target) & 3)) return; if (Ur(n) & 33554432) return Ur(n) & 67108864 ? n.cachedEquivalentBaseType : void 0; n.objectFlags |= 33554432; let a = n.target; if (Ur(a) & 1) { let p = yn(a); if (p && p.expression.kind !== 79 && p.expression.kind !== 208) return } let c = _o(a); if (c.length !== 1 || vy(n.symbol).size) return; let u = Fn(a.typeParameters) ? Oi(c[0], Wu(a.typeParameters, Ko(n).slice(0, a.typeParameters.length))) : c[0]; return Fn(Ko(n)) > Fn(a.typeParameters) && (u = uf(u, To(Ko(n)))), n.objectFlags |= 67108864, n.cachedEquivalentBaseType = u } function u2e(n) { return U ? n === Vt : n === je } function bB(n) { let a = Xne(n); return !!a && u2e(a) } function IC(n) { return po(n) || !!ja(n, "0") } function EB(n) { return Kv(n) || IC(n) } function TXe(n, a) { let c = Vc(n, "" + a); if (c) return c; if (Im(n, po)) return Ls(n, u => { let p = u, h = bM(p); return h ? Y.noUncheckedIndexedAccess && a >= p.target.fixedLength + sM(p.target, 3) ? Gr([h, Oe]) : h : Oe }) } function SXe(n) { return !(n.flags & 240544) } function N_(n) { return !!(n.flags & 109472) } function d2e(n) { let a = Ty(n); return a.flags & 2097152 ? vt(a.types, N_) : N_(a) } function xXe(n) { return n.flags & 2097152 && wr(n.types, N_) || n } function uD(n) { return n.flags & 16 ? !0 : n.flags & 1048576 ? n.flags & 1024 ? !0 : Ji(n.types, N_) : N_(n) } function ky(n) { return n.flags & 1056 ? Kk(n) : n.flags & 402653312 ? ae : n.flags & 256 ? rt : n.flags & 2048 ? Ot : n.flags & 512 ? Te : n.flags & 1048576 ? AXe(n) : n } function AXe(n) { var a; let c = `B${ru(n)}`; return (a = wb(c)) != null ? a : qh(c, Ls(n, ky)) } function $ne(n) { return n.flags & 402653312 ? ae : n.flags & 288 ? rt : n.flags & 2048 ? Ot : n.flags & 512 ? Te : n.flags & 1048576 ? Ls(n, $ne) : n } function i0(n) { return n.flags & 1056 && t0(n) ? Kk(n) : n.flags & 128 && t0(n) ? ae : n.flags & 256 && t0(n) ? rt : n.flags & 2048 && t0(n) ? Ot : n.flags & 512 && t0(n) ? Te : n.flags & 1048576 ? Ls(n, i0) : n } function f2e(n) { return n.flags & 8192 ? j : n.flags & 1048576 ? Ls(n, f2e) : n } function Qne(n, a) { return aU(n, a) || (n = f2e(i0(n))), Hu(n) } function CXe(n, a, c) { if (n && N_(n)) { let u = a ? c ? wD(a) : a : void 0; n = Qne(n, u) } return n } function Zne(n, a, c, u) { if (n && N_(n)) { let p = a ? c0(c, a, u) : void 0; n = Qne(n, p) } return n } function po(n) { return !!(Ur(n) & 4 && n.target.objectFlags & 8) } function Qx(n) { return po(n) && !!(n.target.combinedFlags & 8) } function _2e(n) { return Qx(n) && n.target.elementFlags.length === 1 } function bM(n) { return LC(n, n.target.fixedLength) } function IXe(n) { let a = bM(n); return a && nu(a) } function LC(n, a, c = 0, u = !1, p = !1) { let h = Vv(n) - c; if (a < h) { let T = Ko(n), k = []; for (let O = a; O < h; O++) { let H = T[O]; k.push(n.target.elementFlags[O] & 8 ? od(H, rt) : H) } return u ? so(k) : Gr(k, p ? 0 : 1) } } function LXe(n, a) { return Vv(n) === Vv(a) && Ji(n.target.elementFlags, (c, u) => (c & 12) === (a.target.elementFlags[u] & 12)) } function p2e({ value: n }) { return n.base10Value === "0" } function m2e(n) { return jc(n, a => !!(iu(a) & 4194304)) } function kXe(n) { return Ls(n, DXe) } function DXe(n) { return n.flags & 4 ? gx : n.flags & 8 ? _1 : n.flags & 64 ? yx : n === oe || n === Ke || n.flags & 114691 || n.flags & 128 && n.value === "" || n.flags & 256 && n.value === 0 || n.flags & 2048 && p2e(n) ? n : lt } function TB(n, a) { let c = a & ~n.flags & 98304; return c === 0 ? n : Gr(c === 32768 ? [n, Oe] : c === 65536 ? [n, ln] : [n, Oe, ln]) } function gg(n, a = !1) { L.assert(U); let c = a ? kt : Oe; return n === c || n.flags & 1048576 && n.types[0] === c ? n : Gr([n, c]) } function wXe(n) { return io || (io = nD("NonNullable", 524288, void 0) || Ht), io !== Ht ? Jx(io, [n]) : so([n, Ki]) } function yg(n) { return U ? $E(n, 2097152) : n } function h2e(n) { return U ? Gr([n, Kt]) : n } function ere(n) { return U ? wB(n, Kt) : n } function SB(n, a, c) { return c ? mI(a) ? gg(n) : h2e(n) : n } function dD(n, a) { return r6(a) ? yg(n) : Jl(a) ? ere(n) : n } function KE(n, a) { return Pe && a ? wB(n, Ge) : n } function fD(n) { return n === Ge || !!(n.flags & 1048576) && n.types[0] === Ge } function tre(n) { return Pe ? wB(n, Ge) : wf(n, 524288) } function RXe(n, a) { return (n.flags & 524) !== 0 && (a.flags & 28) !== 0 } function xB(n) { let a = Ur(n); return n.flags & 2097152 ? Ji(n.types, xB) : !!(n.symbol && n.symbol.flags & 7040 && !(n.symbol.flags & 32) && !EU(n)) || !!(a & 4194304) || !!(a & 1024 && xB(n.source)) } function qE(n, a) { let c = wo(n.flags, n.escapedName, ac(n) & 8); c.declarations = n.declarations, c.parent = n.parent, c.links.type = a, c.links.target = n, n.valueDeclaration && (c.valueDeclaration = n.valueDeclaration); let u = Ai(n).nameType; return u && (c.links.nameType = u), c } function OXe(n, a) { let c = Ua(); for (let u of Ey(n)) { let p = zn(u), h = a(p); c.set(u.escapedName, h === p ? u : qE(u, h)) } return c } function EM(n) { if (!(Xv(n) && Ur(n) & 8192)) return n; let a = n.regularType; if (a) return a; let c = n, u = OXe(n, EM), p = ls(c.symbol, u, c.callSignatures, c.constructSignatures, c.indexInfos); return p.flags = c.flags, p.objectFlags |= c.objectFlags & -8193, n.regularType = p, p } function g2e(n, a, c) { return { parent: n, propertyName: a, siblings: c, resolvedProperties: void 0 } } function y2e(n) { if (!n.siblings) { let a = []; for (let c of y2e(n.parent)) if (Xv(c)) { let u = qb(c, n.propertyName); u && QE(zn(u), p => { a.push(p) }) } n.siblings = a } return n.siblings } function NXe(n) { if (!n.resolvedProperties) { let a = new Map; for (let c of y2e(n)) if (Xv(c) && !(Ur(c) & 2097152)) for (let u of Jo(c)) a.set(u.escapedName, u); n.resolvedProperties = lo(a.values()) } return n.resolvedProperties } function PXe(n, a) { if (!(n.flags & 4)) return n; let c = zn(n), u = a && g2e(a, n.escapedName, void 0), p = nre(c, u); return p === c ? n : qE(n, p) } function MXe(n) { let a = ri.get(n.escapedName); if (a) return a; let c = qE(n, kt); return c.flags |= 16777216, ri.set(n.escapedName, c), c } function FXe(n, a) { let c = Ua(); for (let p of Ey(n)) c.set(p.escapedName, PXe(p, a)); if (a) for (let p of NXe(a)) c.has(p.escapedName) || c.set(p.escapedName, MXe(p)); let u = ls(n.symbol, c, Je, Je, Tl(tu(n), p => Fp(p.keyType, Sd(p.type), p.isReadonly))); return u.objectFlags |= Ur(n) & 266240, u } function Sd(n) { return nre(n, void 0) } function nre(n, a) { if (Ur(n) & 196608) { if (a === void 0 && n.widened) return n.widened; let c; if (n.flags & 98305) c = Se; else if (Xv(n)) c = FXe(n, a); else if (n.flags & 1048576) { let u = a || g2e(void 0, void 0, n.types), p = Tl(n.types, h => h.flags & 98304 ? h : nre(h, u)); c = Gr(p, vt(p, mh) ? 2 : 1) } else n.flags & 2097152 ? c = so(Tl(n.types, Sd)) : JE(n) && (c = _g(n.target, Tl(Ko(n), Sd))); return c && a === void 0 && (n.widened = c), c || n } return n } function AB(n) { let a = !1; if (Ur(n) & 65536) { if (n.flags & 1048576) if (vt(n.types, mh)) a = !0; else for (let c of n.types) AB(c) && (a = !0); if (JE(n)) for (let c of Ko(n)) AB(c) && (a = !0); if (Xv(n)) for (let c of Ey(n)) { let u = zn(c); Ur(u) & 65536 && (AB(u) || Fe(c.valueDeclaration, _.Object_literal_s_property_0_implicitly_has_an_1_type, E(c), Ee(Sd(u))), a = !0) } } return a } function qv(n, a, c) { let u = Ee(Sd(a)); if (Yn(n) && !HR(Gn(n), Y)) return; let p; switch (n.kind) { case 223: case 169: case 168: p = ge ? _.Member_0_implicitly_has_an_1_type : _.Member_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage; break; case 166: let h = n; if (Re(h.name)) { let T = nb(h.name); if ((_2(h.parent) || zm(h.parent) || Jm(h.parent)) && h.parent.parameters.indexOf(h) > -1 && (zs(h, h.name.escapedText, 788968, void 0, h.name.escapedText, !0) || T && vW(T))) { let k = "arg" + h.parent.parameters.indexOf(h), O = os(h.name) + (h.dotDotDotToken ? "[]" : ""); Ip(ge, n, _.Parameter_has_a_name_but_no_type_Did_you_mean_0_Colon_1, k, O); return } } p = n.dotDotDotToken ? ge ? _.Rest_parameter_0_implicitly_has_an_any_type : _.Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage : ge ? _.Parameter_0_implicitly_has_an_1_type : _.Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage; break; case 205: if (p = _.Binding_element_0_implicitly_has_an_1_type, !ge) return; break; case 320: Fe(n, _.Function_type_which_lacks_return_type_annotation_implicitly_has_an_0_return_type, u); return; case 326: ge && kL(n.parent) && Fe(n.parent.tagName, _.This_overload_implicitly_returns_the_type_0_because_it_lacks_a_return_type_annotation, u); return; case 259: case 171: case 170: case 174: case 175: case 215: case 216: if (ge && !n.name) { c === 3 ? Fe(n, _.Generator_implicitly_has_yield_type_0_because_it_does_not_yield_any_values_Consider_supplying_a_return_type_annotation, u) : Fe(n, _.Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type, u); return } p = ge ? c === 3 ? _._0_which_lacks_return_type_annotation_implicitly_has_an_1_yield_type : _._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type : _._0_implicitly_has_an_1_return_type_but_a_better_type_may_be_inferred_from_usage; break; case 197: ge && Fe(n, _.Mapped_object_type_implicitly_has_an_any_template_type); return; default: p = ge ? _.Variable_0_implicitly_has_an_1_type : _.Variable_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage }Ip(ge, n, p, os(sa(n)), u) } function CB(n, a, c) { i(() => { ge && Ur(a) & 65536 && (!c || !Nre(n)) && (AB(a) || qv(n, a, c)) }) } function rre(n, a, c) { let u = xd(n), p = xd(a), h = xD(n), T = xD(a), k = T ? p - 1 : p, O = h ? k : Math.min(u, k), H = Yb(n); if (H) { let J = Yb(a); J && c(H, J) } for (let J = 0; J < O; J++)c(P_(n, J), P_(a, J)); T && c(SD(n, O), T) } function ire(n, a, c) { let u = Lf(n), p = Lf(a); u && p && Ene(u, p) && u.type && p.type ? c(u.type, p.type) : c(qo(n), qo(a)) } function _D(n, a, c, u) { return are(n.map(ore), a, c, u || Gne) } function GXe(n, a = 0) { return n && are(on(n.inferences, b2e), n.signature, n.flags | a, n.compareTypes) } function are(n, a, c, u) { let p = { inferences: n, signature: a, flags: c, compareTypes: u, mapper: gn, nonFixingMapper: gn }; return p.mapper = BXe(p), p.nonFixingMapper = UXe(p), p } function BXe(n) { return Rne(on(n.inferences, a => a.typeParameter), on(n.inferences, (a, c) => () => (a.isFixed || (VXe(n), IB(n.inferences), a.isFixed = !0), mre(n, c)))) } function UXe(n) { return Rne(on(n.inferences, a => a.typeParameter), on(n.inferences, (a, c) => () => mre(n, c))) } function IB(n) { for (let a of n) a.isFixed || (a.inferredType = void 0) } function v2e(n, a, c) { var u; ((u = n.intraExpressionInferenceSites) != null ? u : n.intraExpressionInferenceSites = []).push({ node: a, type: c }) } function VXe(n) { if (n.intraExpressionInferenceSites) { for (let { node: a, type: c } of n.intraExpressionInferenceSites) { let u = a.kind === 171 ? dCe(a, 2) : Ru(a, 2); u && gh(n.inferences, c, u) } n.intraExpressionInferenceSites = void 0 } } function ore(n) { return { typeParameter: n, candidates: void 0, contraCandidates: void 0, inferredType: void 0, priority: void 0, topLevel: !0, isFixed: !1, impliedArity: void 0 } } function b2e(n) { return { typeParameter: n.typeParameter, candidates: n.candidates && n.candidates.slice(), contraCandidates: n.contraCandidates && n.contraCandidates.slice(), inferredType: n.inferredType, priority: n.priority, topLevel: n.topLevel, isFixed: n.isFixed, impliedArity: n.impliedArity } } function jXe(n) { let a = Pr(n.inferences, iA); return a.length ? are(on(a, b2e), n.signature, n.flags, n.compareTypes) : void 0 } function sre(n) { return n && n.mapper } function XE(n) { let a = Ur(n); if (a & 524288) return !!(a & 1048576); let c = !!(n.flags & 465829888 || n.flags & 524288 && !E2e(n) && (a & 4 && (n.node || mn(Ko(n), XE)) || a & 16 && n.symbol && n.symbol.flags & 14384 && n.symbol.declarations || a & 12583968) || n.flags & 3145728 && !(n.flags & 1024) && !E2e(n) && vt(n.types, XE)); return n.flags & 3899393 && (n.objectFlags |= 524288 | (c ? 1048576 : 0)), c } function E2e(n) { if (n.aliasSymbol && !n.aliasTypeArguments) { let a = nc(n.aliasSymbol, 262); return !!(a && jn(a.parent, c => c.kind === 308 ? !0 : c.kind === 264 ? !1 : "quit")) } return !1 } function pD(n, a, c = 0) { return !!(n === a || n.flags & 3145728 && vt(n.types, u => pD(u, a, c)) || c < 3 && n.flags & 16777216 && (pD(Hv(n), a, c + 1) || pD(Wv(n), a, c + 1))) } function HXe(n, a) { let c = Lf(n); return c ? !!c.type && pD(c.type, a) : pD(qo(n), a) } function WXe(n) { let a = Ua(); QE(n, u => { if (!(u.flags & 128)) return; let p = Bs(u.value), h = wo(4, p); h.links.type = Se, u.symbol && (h.declarations = u.symbol.declarations, h.valueDeclaration = u.symbol.valueDeclaration), a.set(p, h) }); let c = n.flags & 4 ? [Fp(ae, Ki, !1)] : Je; return ls(void 0, a, Je, Je, c) } function T2e(n, a, c) { if (ta) return; let u = n.id + "," + a.id + "," + c.id; if (yr.has(u)) return yr.get(u); ta = !0; let p = zXe(n, a, c); return ta = !1, yr.set(u, p), p } function cre(n) { return !(Ur(n) & 262144) || Xv(n) && vt(Jo(n), a => cre(zn(a))) || po(n) && vt(Ko(n), cre) } function zXe(n, a, c) { if (!(Cm(n, ae) || Jo(n).length !== 0 && cre(n))) return; if (_f(n)) return nu(LB(Ko(n)[0], a, c), CC(n)); if (po(n)) { let p = on(Ko(n), T => LB(T, a, c)), h = Pp(a) & 4 ? Tl(n.target.elementFlags, T => T & 2 ? 1 : T) : n.target.elementFlags; return ap(p, h, n.target.readonly, n.target.labeledElementDeclarations) } let u = Bd(1040, void 0); return u.source = n, u.mappedType = a, u.constraintType = c, u } function JXe(n) { let a = Ai(n); return a.type || (a.type = LB(n.links.propertyType, n.links.mappedType, n.links.constraintType)), a.type } function LB(n, a, c) { let u = od(c.type, w_(a)), p = _h(a), h = ore(u); return gh([h], n, p), S2e(h) || ue } function* lre(n, a, c, u) { let p = Jo(a); for (let h of p) if (!yxe(h) && (c || !(h.flags & 16777216 || ac(h) & 48))) { let T = ja(n, h.escapedName); if (!T) yield h; else if (u) { let k = zn(h); if (k.flags & 109472) { let O = zn(T); O.flags & 1 || Hu(O) === Hu(k) || (yield h) } } } } function ure(n, a, c, u) { return u8(lre(n, a, c, u)) } function KXe(n, a) { return !(a.target.combinedFlags & 8) && a.target.minLength > n.target.minLength || !a.target.hasRestElement && (n.target.hasRestElement || a.target.fixedLength < n.target.fixedLength) } function qXe(n, a) { return po(n) && po(a) ? KXe(n, a) : !!ure(n, a, !1, !0) && !!ure(a, n, !1, !1) } function S2e(n) { return n.candidates ? Gr(n.candidates, 2) : n.contraCandidates ? so(n.contraCandidates) : void 0 } function dre(n) { return !!Rr(n).skipDirectInference } function x2e(n) { return !!(n.symbol && vt(n.symbol.declarations, dre)) } function XXe(n, a) { let c = n.texts[0], u = a.texts[0], p = n.texts[n.texts.length - 1], h = a.texts[a.texts.length - 1], T = Math.min(c.length, u.length), k = Math.min(p.length, h.length); return c.slice(0, T) !== u.slice(0, T) || p.slice(p.length - k) !== h.slice(h.length - k) } function A2e(n, a) { if (n === "") return !1; let c = +n; return isFinite(c) && (!a || "" + c === n) } function YXe(n) { return aB(BW(n)) } function fre(n, a) { if (a.flags & 1) return !0; if (a.flags & 134217732) return to(n, a); if (a.flags & 268435456) { let c = []; for (; a.flags & 268435456;)c.unshift(a.symbol), a = a.type; return ou(c, (p, h) => w1(h, p), n) === n && fre(n, a) } return !1 } function $Xe(n, a) { if (n === a || a.flags & 5) return !0; if (n.flags & 128) { let c = n.value; return !!(a.flags & 8 && A2e(c, !1) || a.flags & 64 && v4(c, !1) || a.flags & 98816 && c === a.intrinsicName || a.flags & 268435456 && fre(ff(c), a)) } if (n.flags & 134217728) { let c = n.texts; return c.length === 2 && c[0] === "" && c[1] === "" && to(n.types[0], a) } return to(n, a) } function C2e(n, a) { return n.flags & 128 ? I2e([n.value], Je, a) : n.flags & 134217728 ? GD(n.texts, a.texts) ? on(n.types, QXe) : I2e(n.texts, n.types, a) : void 0 } function _re(n, a) { let c = C2e(n, a); return !!c && Ji(c, (u, p) => $Xe(u, a.types[p])) } function QXe(n) { return n.flags & 402653317 ? n : WE(["", ""], [n]) } function I2e(n, a, c) { let u = n.length - 1, p = n[0], h = n[u], T = c.texts, k = T.length - 1, O = T[0], H = T[k]; if (u === 0 && p.length < O.length + H.length || !p.startsWith(O) || !h.endsWith(H)) return; let J = h.slice(0, h.length - H.length), de = [], Ae = 0, xe = O.length; for (let Tn = 1; Tn < k; Tn++) { let un = T[Tn]; if (un.length > 0) { let Nn = Ae, en = xe; for (; en = tt(Nn).indexOf(un, en), !(en >= 0);) { if (Nn++, Nn === n.length) return; en = 0 } It(Nn, en), xe += un.length } else if (xe < tt(Ae).length) It(Ae, xe + 1); else if (Ae < u) It(Ae + 1, 0); else return } return It(u, tt(u).length), de; function tt(Tn) { return Tn < u ? n[Tn] : J } function It(Tn, un) { let Nn = Tn === Ae ? ff(tt(Tn).slice(xe, un)) : WE([n[Ae].slice(xe), ...n.slice(Ae + 1, Tn), tt(Tn).slice(0, un)], a.slice(Ae, Tn)); de.push(Nn), Ae = Tn, xe = un } } function gh(n, a, c, u = 0, p = !1) { let h = !1, T, k = 2048, O = !0, H, J, de, Ae = 0; xe(a, c); function xe(In, qn) { if (XE(qn)) { if (In === Tt) { let Mi = T; T = In, xe(qn, qn), T = Mi; return } if (In.aliasSymbol && In.aliasSymbol === qn.aliasSymbol) { if (In.aliasTypeArguments) { let Mi = Ai(In.aliasSymbol).typeParameters, ga = Mp(Mi), Bi = Sy(In.aliasTypeArguments, Mi, ga, Yn(In.aliasSymbol.valueDeclaration)), ko = Sy(qn.aliasTypeArguments, Mi, ga, Yn(In.aliasSymbol.valueDeclaration)); en(Bi, ko, o2e(In.aliasSymbol)) } return } if (In === qn && In.flags & 3145728) { for (let Mi of In.types) xe(Mi, Mi); return } if (qn.flags & 1048576) { let [Mi, ga] = Nn(In.flags & 1048576 ? In.types : [In], qn.types, ZXe), [Bi, ko] = Nn(Mi, ga, eYe); if (ko.length === 0) return; if (qn = Gr(ko), Bi.length === 0) { tt(In, qn, 1); return } In = Gr(Bi) } else if (qn.flags & 2097152 && !Ji(qn.types, rB)) { if (!(In.flags & 1048576)) { let [Mi, ga] = Nn(In.flags & 2097152 ? In.types : [In], qn.types, ph); if (Mi.length === 0 || ga.length === 0) return; In = so(Mi), qn = so(ga) } } else qn.flags & 41943040 && (qn = Cy(qn)); if (qn.flags & 8650752) { if (x2e(In)) return; let Mi = Jt(qn); if (Mi) { if (Ur(In) & 262144 || In === ce) return; if (!Mi.isFixed) { if ((Mi.priority === void 0 || u < Mi.priority) && (Mi.candidates = void 0, Mi.contraCandidates = void 0, Mi.topLevel = !0, Mi.priority = u), u === Mi.priority) { let Bi = T || In; p && !h ? ya(Mi.contraCandidates, Bi) || (Mi.contraCandidates = Sn(Mi.contraCandidates, Bi), IB(n)) : ya(Mi.candidates, Bi) || (Mi.candidates = Sn(Mi.candidates, Bi), IB(n)) } !(u & 128) && qn.flags & 262144 && Mi.topLevel && !pD(c, qn) && (Mi.topLevel = !1, IB(n)) } k = Math.min(k, u); return } let ga = mg(qn, !1); if (ga !== qn) xe(In, ga); else if (qn.flags & 8388608) { let Bi = mg(qn.indexType, !1); if (Bi.flags & 465829888) { let ko = kAe(mg(qn.objectType, !1), Bi, !1); ko && ko !== qn && xe(In, ko) } } } if (Ur(In) & 4 && Ur(qn) & 4 && (In.target === qn.target || _f(In) && _f(qn)) && !(In.node && qn.node)) en(Ko(In), Ko(qn), zne(In.target)); else if (In.flags & 4194304 && qn.flags & 4194304) cn(In.type, qn.type); else if ((uD(In) || In.flags & 4) && qn.flags & 4194304) { let Mi = WXe(In); It(Mi, qn.type, 256) } else if (In.flags & 8388608 && qn.flags & 8388608) xe(In.objectType, qn.objectType), xe(In.indexType, qn.indexType); else if (In.flags & 268435456 && qn.flags & 268435456) In.symbol === qn.symbol && xe(In.type, qn.type); else if (In.flags & 33554432) xe(In.baseType, qn), tt(une(In), qn, 4); else if (qn.flags & 16777216) un(In, qn, Hr); else if (qn.flags & 3145728) Rn(In, qn.types, qn.flags); else if (In.flags & 1048576) { let Mi = In.types; for (let ga of Mi) xe(ga, qn) } else if (qn.flags & 134217728) qi(In, qn); else { if (In = O_(In), !(u & 512 && In.flags & 467927040)) { let Mi = Eu(In); if (Mi !== In && O && !(Mi.flags & 2621440)) return O = !1, xe(Mi, qn); In = Mi } In.flags & 2621440 && un(In, qn, wa) } } } function tt(In, qn, Mi) { let ga = u; u |= Mi, xe(In, qn), u = ga } function It(In, qn, Mi) { let ga = u; u |= Mi, cn(In, qn), u = ga } function Tn(In, qn, Mi, ga) { let Bi = u; u |= ga, Rn(In, qn, Mi), u = Bi } function un(In, qn, Mi) { let ga = In.id + "," + qn.id, Bi = H && H.get(ga); if (Bi !== void 0) { k = Math.min(k, Bi); return } (H || (H = new Map)).set(ga, -1); let ko = k; k = 2048; let us = Ae, Xs = AC(In), no = AC(qn); ya(J, Xs) && (Ae |= 1), ya(de, no) && (Ae |= 2), Ae !== 3 ? ((J || (J = [])).push(Xs), (de || (de = [])).push(no), Mi(In, qn), de.pop(), J.pop()) : k = -1, Ae = us, H.set(ga, k), k = Math.min(k, ko) } function Nn(In, qn, Mi) { let ga, Bi; for (let ko of qn) for (let us of In) Mi(us, ko) && (xe(us, ko), ga = xg(ga, us), Bi = xg(Bi, ko)); return [ga ? Pr(In, ko => !ya(ga, ko)) : In, Bi ? Pr(qn, ko => !ya(Bi, ko)) : qn] } function en(In, qn, Mi) { let ga = In.length < qn.length ? In.length : qn.length; for (let Bi = 0; Bi < ga; Bi++)Bi < Mi.length && (Mi[Bi] & 7) === 2 ? cn(In[Bi], qn[Bi]) : xe(In[Bi], qn[Bi]) } function cn(In, qn) { p = !p, xe(In, qn), p = !p } function rr(In, qn) { re || u & 1024 ? cn(In, qn) : xe(In, qn) } function Jt(In) { if (In.flags & 8650752) { for (let qn of n) if (In === qn.typeParameter) return qn } } function Cn(In) { let qn; for (let Mi of In) { let ga = Mi.flags & 2097152 && wr(Mi.types, Bi => !!Jt(Bi)); if (!ga || qn && ga !== qn) return; qn = ga } return qn } function Rn(In, qn, Mi) { let ga = 0; if (Mi & 1048576) { let Bi, ko = In.flags & 1048576 ? In.types : [In], us = new Array(ko.length), Xs = !1; for (let no of qn) if (Jt(no)) Bi = no, ga++; else for (let Tu = 0; Tu < ko.length; Tu++) { let et = k; k = 2048, xe(ko[Tu], no), k === u && (us[Tu] = !0), Xs = Xs || k === -1, k = Math.min(k, et) } if (ga === 0) { let no = Cn(qn); no && tt(In, no, 1); return } if (ga === 1 && !Xs) { let no = Uo(ko, (Tu, et) => us[et] ? void 0 : Tu); if (no.length) { xe(Gr(no), Bi); return } } } else for (let Bi of qn) Jt(Bi) ? ga++ : xe(In, Bi); if (Mi & 2097152 ? ga === 1 : ga > 0) for (let Bi of qn) Jt(Bi) && tt(In, Bi, 1) } function Br(In, qn, Mi) { if (Mi.flags & 1048576) { let ga = !1; for (let Bi of Mi.types) ga = Br(In, qn, Bi) || ga; return ga } if (Mi.flags & 4194304) { let ga = Jt(Mi.type); if (ga && !ga.isFixed && !x2e(In)) { let Bi = T2e(In, qn, Mi); Bi && tt(Bi, ga.typeParameter, Ur(In) & 262144 ? 16 : 8) } return !0 } if (Mi.flags & 262144) { tt(Gp(In), Mi, 32); let ga = VE(Mi); if (ga && Br(In, qn, ga)) return !0; let Bi = on(Jo(In), zn), ko = on(tu(In), us => us !== yu ? us.type : lt); return xe(Gr(Qi(Bi, ko)), _h(qn)), !0 } return !1 } function Hr(In, qn) { if (In.flags & 16777216) xe(In.checkType, qn.checkType), xe(In.extendsType, qn.extendsType), xe(Hv(In), Hv(qn)), xe(Wv(In), Wv(qn)); else { let Mi = [Hv(qn), Wv(qn)]; Tn(In, Mi, qn.flags, p ? 64 : 0) } } function qi(In, qn) { let Mi = C2e(In, qn), ga = qn.types; if (Mi || Ji(qn.texts, Bi => Bi.length === 0)) for (let Bi = 0; Bi < ga.length; Bi++) { let ko = Mi ? Mi[Bi] : lt, us = ga[Bi]; if (ko.flags & 128 && us.flags & 8650752) { let Xs = Jt(us), no = Xs ? bu(Xs.typeParameter) : void 0; if (no && !Zo(no)) { let Tu = no.flags & 1048576 ? no.types : [no], et = ou(Tu, (he, Bn) => he | Bn.flags, 0); if (!(et & 4)) { let he = ko.value; et & 296 && !A2e(he, !0) && (et &= -297), et & 2112 && !v4(he, !0) && (et &= -2113); let Bn = ou(Tu, (Mn, or) => or.flags & et ? Mn.flags & 4 ? Mn : or.flags & 4 ? ko : Mn.flags & 134217728 ? Mn : or.flags & 134217728 && _re(ko, or) ? ko : Mn.flags & 268435456 ? Mn : or.flags & 268435456 && he === CAe(or.symbol, he) ? ko : Mn.flags & 128 ? Mn : or.flags & 128 && or.value === he ? or : Mn.flags & 8 ? Mn : or.flags & 8 ? op(+he) : Mn.flags & 32 ? Mn : or.flags & 32 ? op(+he) : Mn.flags & 256 ? Mn : or.flags & 256 && or.value === +he ? or : Mn.flags & 64 ? Mn : or.flags & 64 ? YXe(he) : Mn.flags & 2048 ? Mn : or.flags & 2048 && j0(or.value) === he ? or : Mn.flags & 16 ? Mn : or.flags & 16 ? he === "true" ? pe : he === "false" ? Ke : Te : Mn.flags & 512 ? Mn : or.flags & 512 && or.intrinsicName === he ? or : Mn.flags & 32768 ? Mn : or.flags & 32768 && or.intrinsicName === he ? or : Mn.flags & 65536 ? Mn : or.flags & 65536 && or.intrinsicName === he ? or : Mn : Mn, lt); if (!(Bn.flags & 131072)) { xe(Bn, us); continue } } } } xe(ko, us) } } function wa(In, qn) { var Mi, ga; if (Ur(In) & 4 && Ur(qn) & 4 && (In.target === qn.target || _f(In) && _f(qn))) { en(Ko(In), Ko(qn), zne(In.target)); return } if (df(In) && df(qn)) { xe(rp(In), rp(qn)), xe(_h(In), _h(qn)); let Bi = by(In), ko = by(qn); Bi && ko && xe(Bi, ko) } if (Ur(qn) & 32 && !qn.declaration.nameType) { let Bi = rp(qn); if (Br(In, qn, Bi)) return } if (!qXe(In, qn)) { if (JE(In)) { if (po(qn)) { let Bi = Vv(In), ko = Vv(qn), us = Ko(qn), Xs = qn.target.elementFlags; if (po(In) && LXe(In, qn)) { for (let et = 0; et < ko; et++)xe(Ko(In)[et], us[et]); return } let no = po(In) ? Math.min(In.target.fixedLength, qn.target.fixedLength) : 0, Tu = Math.min(po(In) ? sM(In.target, 3) : 0, qn.target.hasRestElement ? sM(qn.target, 3) : 0); for (let et = 0; et < no; et++)xe(Ko(In)[et], us[et]); if (!po(In) || Bi - no - Tu === 1 && In.target.elementFlags[no] & 4) { let et = Ko(In)[no]; for (let he = no; he < ko - Tu; he++)xe(Xs[he] & 8 ? nu(et) : et, us[he]) } else { let et = ko - no - Tu; if (et === 2) { if (Xs[no] & Xs[no + 1] & 8) { let he = Jt(us[no]); he && he.impliedArity !== void 0 && (xe(EC(In, no, Tu + Bi - he.impliedArity), us[no]), xe(EC(In, no + he.impliedArity, Tu), us[no + 1])) } else if (Xs[no] & 8 && Xs[no + 1] & 4) { let he = (Mi = Jt(us[no])) == null ? void 0 : Mi.typeParameter, Bn = he && bu(he); if (Bn && po(Bn) && !Bn.target.hasRestElement) { let Mn = Bn.target.fixedLength; xe(EC(In, no, Bi - (no + Mn)), us[no]), xe(LC(In, no + Mn, Tu), us[no + 1]) } } else if (Xs[no] & 4 && Xs[no + 1] & 8) { let he = (ga = Jt(us[no + 1])) == null ? void 0 : ga.typeParameter, Bn = he && bu(he); if (Bn && po(Bn) && !Bn.target.hasRestElement) { let Mn = Bn.target.fixedLength, or = Bi - sM(qn.target, 3), _r = or - Mn, ua = ap(Ko(In).slice(_r, or), In.target.elementFlags.slice(_r, or), !1, In.target.labeledElementDeclarations && In.target.labeledElementDeclarations.slice(_r, or)); xe(LC(In, no, Tu + Mn), us[no]), xe(ua, us[no + 1]) } } } else if (et === 1 && Xs[no] & 8) { let he = qn.target.elementFlags[ko - 1] & 2, Bn = EC(In, no, Tu); tt(Bn, us[no], he ? 2 : 0) } else if (et === 1 && Xs[no] & 4) { let he = LC(In, no, Tu); he && xe(he, us[no]) } } for (let et = 0; et < Tu; et++)xe(Ko(In)[Bi - et - 1], us[ko - et - 1]); return } if (_f(qn)) { ji(In, qn); return } } Xc(In, qn), pf(In, qn, 0), pf(In, qn, 1), ji(In, qn) } } function Xc(In, qn) { let Mi = Ey(qn); for (let ga of Mi) { let Bi = ja(In, ga.escapedName); Bi && !vt(Bi.declarations, dre) && xe(zn(Bi), zn(ga)) } } function pf(In, qn, Mi) { let ga = xa(In, Mi), Bi = xa(qn, Mi), ko = ga.length, us = Bi.length, Xs = ko < us ? ko : us; for (let no = 0; no < Xs; no++)Hd(oKe(ga[ko - Xs + no]), tD(Bi[us - Xs + no])) } function Hd(In, qn) { let Mi = h, ga = qn.declaration ? qn.declaration.kind : 0; h = h || ga === 171 || ga === 170 || ga === 173, rre(In, qn, rr), h = Mi, ire(In, qn, xe) } function ji(In, qn) { let Mi = Ur(In) & Ur(qn) & 32 ? 8 : 0, ga = tu(qn); if (xB(In)) for (let Bi of ga) { let ko = []; for (let us of Jo(In)) if (Vx(TC(us, 8576), Bi.keyType)) { let Xs = zn(us); ko.push(us.flags & 16777216 ? tre(Xs) : Xs) } for (let us of tu(In)) Vx(us.keyType, Bi.keyType) && ko.push(us.type); ko.length && tt(Gr(ko), Bi.type, Mi) } for (let Bi of ga) { let ko = rM(In, Bi.keyType); ko && tt(ko.type, Bi.type, Mi) } } } function ZXe(n, a) { return a === Ge ? n === a : ph(n, a) || !!(a.flags & 4 && n.flags & 128 || a.flags & 8 && n.flags & 256) } function eYe(n, a) { return !!(n.flags & 524288 && a.flags & 524288 && n.symbol && n.symbol === a.symbol || n.aliasSymbol && n.aliasTypeArguments && n.aliasSymbol === a.aliasSymbol) } function tYe(n) { let a = eu(n); return !!a && Js(a.flags & 16777216 ? Hte(a) : a, 406978556) } function Xv(n) { return !!(Ur(n) & 128) } function pre(n) { return !!(Ur(n) & 16512) } function nYe(n) { if (n.length > 1) { let a = Pr(n, pre); if (a.length) { let c = Gr(a, 2); return Qi(Pr(n, u => !pre(u)), [c]) } } return n } function rYe(n) { return n.priority & 416 ? so(n.contraCandidates) : EXe(n.contraCandidates) } function iYe(n, a) { let c = nYe(n.candidates), u = tYe(n.typeParameter) || tM(n.typeParameter), p = !u && n.topLevel && (n.isFixed || !HXe(a, n.typeParameter)), h = u ? Tl(c, Hu) : p ? Tl(c, i0) : c, T = n.priority & 416 ? Gr(h, 2) : bXe(h); return Sd(T) } function mre(n, a) { let c = n.inferences[a]; if (!c.inferredType) { let u, p = n.signature; if (p) { let T = c.candidates ? iYe(c, p) : void 0; if (c.contraCandidates) u = T && !(T.flags & 131072) && vt(c.contraCandidates, O => Iy(T, O)) && Ji(n.inferences, O => O !== c && eu(O.typeParameter) !== c.typeParameter || Ji(O.candidates, H => Iy(H, T))) ? T : rYe(c); else if (T) u = T; else if (n.flags & 1) u = Qe; else { let k = jE(c.typeParameter); k && (u = Oi(k, Nqe(Oqe(n, a), n.nonFixingMapper))) } } else u = S2e(c); c.inferredType = u || hre(!!(n.flags & 2)); let h = eu(c.typeParameter); if (h) { let T = Oi(h, n.nonFixingMapper); (!u || !n.compareTypes(u, uf(T, u))) && (c.inferredType = u = T) } } return c.inferredType } function hre(n) { return n ? Se : ue } function gre(n) { let a = []; for (let c = 0; c < n.inferences.length; c++)a.push(mre(n, c)); return a } function L2e(n) { switch (n.escapedText) { case "document": case "console": return _.Cannot_find_name_0_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_include_dom; case "$": return Y.types ? _.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slashjquery_and_then_add_jquery_to_the_types_field_in_your_tsconfig : _.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slashjquery; case "describe": case "suite": case "it": case "test": return Y.types ? _.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_types_Slashjest_or_npm_i_save_dev_types_Slashmocha_and_then_add_jest_or_mocha_to_the_types_field_in_your_tsconfig : _.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_types_Slashjest_or_npm_i_save_dev_types_Slashmocha; case "process": case "require": case "Buffer": case "module": return Y.types ? _.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode_and_then_add_node_to_the_types_field_in_your_tsconfig : _.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode; case "Map": case "Set": case "Promise": case "Symbol": case "WeakMap": case "WeakSet": case "Iterator": case "AsyncIterator": case "SharedArrayBuffer": case "Atomics": case "AsyncIterable": case "AsyncIterableIterator": case "AsyncGenerator": case "AsyncGeneratorFunction": case "BigInt": case "Reflect": case "BigInt64Array": case "BigUint64Array": return _.Cannot_find_name_0_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_1_or_later; case "await": if (Pa(n.parent)) return _.Cannot_find_name_0_Did_you_mean_to_write_this_in_an_async_function; default: return n.parent.kind === 300 ? _.No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer : _.Cannot_find_name_0 } } function Qf(n) { let a = Rr(n); return a.resolvedSymbol || (a.resolvedSymbol = !rc(n) && zs(n, n.escapedText, 1160127, L2e(n), n, !hW(n), !1) || Ht), a.resolvedSymbol } function kC(n) { return !!jn(n, a => a.kind === 183 ? !0 : a.kind === 79 || a.kind === 163 ? !1 : "quit") } function k2e(n) { return !!(n.flags & 16777216 || jn(n, a => ku(a) || Rd(a))) } function kB(n, a, c, u) { switch (n.kind) { case 79: if (!mS(n)) { let T = Qf(n); return T !== Ht ? `${u ? zo(u) : "-1"}|${ru(a)}|${ru(c)}|${$a(T)}` : void 0 } case 108: return `0|${u ? zo(u) : "-1"}|${ru(a)}|${ru(c)}`; case 232: case 214: return kB(n.expression, a, c, u); case 163: let p = kB(n.left, a, c, u); return p && p + "." + n.right.escapedText; case 208: case 209: let h = YE(n); if (h !== void 0) { let T = kB(n.expression, a, c, u); return T && T + "." + h } break; case 203: case 204: case 259: case 215: case 216: case 171: return `${zo(n)}#${ru(a)}` } } function El(n, a) { switch (a.kind) { case 214: case 232: return El(n, a.expression); case 223: return Iu(a) && El(n, a.left) || ar(a) && a.operatorToken.kind === 27 && El(n, a.right) }switch (n.kind) { case 233: return a.kind === 233 && n.keywordToken === a.keywordToken && n.name.escapedText === a.name.escapedText; case 79: case 80: return mS(n) ? a.kind === 108 : a.kind === 79 && Qf(n) === Qf(a) || (wi(a) || Wo(a)) && tp(Qf(n)) === fr(a); case 108: return a.kind === 108; case 106: return a.kind === 106; case 232: case 214: return El(n.expression, a); case 208: case 209: let c = YE(n), u = Us(a) ? YE(a) : void 0; return c !== void 0 && u !== void 0 && u === c && El(n.expression, a.expression); case 163: return Us(a) && n.right.escapedText === YE(a) && El(n.left, a.expression); case 223: return ar(n) && n.operatorToken.kind === 27 && El(n.right, a) }return !1 } function YE(n) { if (br(n)) return n.name.escapedText; if (Vs(n)) return aYe(n); if (Wo(n)) { let a = dn(n); return a ? Bs(a) : void 0 } if (ha(n)) return "" + n.parent.parameters.indexOf(n) } function D2e(n) { return n.flags & 8192 ? n.escapedName : n.flags & 384 ? Bs("" + n.value) : void 0 } function aYe(n) { if (yf(n.argumentExpression)) return Bs(n.argumentExpression.text); if (bc(n.argumentExpression)) { let a = uc(n.argumentExpression, 111551, !0); if (!a || !(wC(a) || a.flags & 8)) return; let c = a.valueDeclaration; if (c === void 0) return; let u = ad(c); if (u) { let p = D2e(u); if (p !== void 0) return p } if (mT(c) && $h(c, n.argumentExpression)) { let p = Yw(c); if (p) return D2e(au(p)); if (q0(c)) return wA(c.name) } } } function w2e(n, a) { for (; Us(n);)if (n = n.expression, El(n, a)) return !0; return !1 } function P1(n, a) { for (; Jl(n);)if (n = n.expression, El(n, a)) return !0; return !1 } function mD(n, a) { if (n && n.flags & 1048576) { let c = Kte(n, a); if (c && ac(c) & 2) return c.links.isDiscriminantProperty === void 0 && (c.links.isDiscriminantProperty = (c.links.checkFlags & 192) === 192 && !SC(zn(c))), !!c.links.isDiscriminantProperty } return !1 } function R2e(n, a) { let c; for (let u of n) if (mD(a, u.escapedName)) { if (c) { c.push(u); continue } c = [u] } return c } function oYe(n, a) { let c = new Map, u = 0; for (let p of n) if (p.flags & 61603840) { let h = Vc(p, a); if (h) { if (!uD(h)) return; let T = !1; QE(h, k => { let O = ru(Hu(k)), H = c.get(O); H ? H !== ue && (c.set(O, ue), T = !0) : c.set(O, p) }), T || u++ } } return u >= 10 && u * 2 >= n.length ? c : void 0 } function TM(n) { let a = n.types; if (!(a.length < 10 || Ur(n) & 32768 || Oy(a, c => !!(c.flags & 59506688)) < 10)) { if (n.keyPropertyName === void 0) { let c = mn(a, p => p.flags & 59506688 ? mn(Jo(p), h => N_(zn(h)) ? h.escapedName : void 0) : void 0), u = c && oYe(a, c); n.keyPropertyName = u ? c : "", n.constituentMap = u } return n.keyPropertyName.length ? n.keyPropertyName : void 0 } } function SM(n, a) { var c; let u = (c = n.constituentMap) == null ? void 0 : c.get(ru(Hu(a))); return u !== ue ? u : void 0 } function O2e(n, a) { let c = TM(n), u = c && Vc(a, c); return u && SM(n, u) } function sYe(n, a) { let c = TM(n), u = c && wr(a.properties, h => h.symbol && h.kind === 299 && h.symbol.escapedName === c && DM(h.initializer)), p = u && KM(u.initializer); return p && SM(n, p) } function N2e(n, a) { return El(n, a) || w2e(n, a) } function P2e(n, a) { if (n.arguments) { for (let c of n.arguments) if (N2e(a, c)) return !0 } return !!(n.expression.kind === 208 && N2e(a, n.expression.expression)) } function yre(n) { return (!n.id || n.id < 0) && (n.id = gK, gK++), n.id } function cYe(n, a) { if (!(n.flags & 1048576)) return to(n, a); for (let c of n.types) if (to(c, a)) return !0; return !1 } function lYe(n, a) { var c; if (n === a) return n; if (a.flags & 131072) return a; let u = `A${ru(n)},${ru(a)}`; return (c = wb(u)) != null ? c : qh(u, uYe(n, a)) } function uYe(n, a) { let c = jc(n, p => cYe(a, p)), u = a.flags & 512 && t0(a) ? Ls(c, Yx) : c; return to(a, u) ? u : n } function vre(n) { let a = R_(n); return !!(a.callSignatures.length || a.constructSignatures.length || a.members.get("bind") && Iy(n, Hs)) } function iu(n) { n.flags & 467927040 && (n = bu(n) || ue); let a = n.flags; if (a & 268435460) return U ? 16317953 : 16776705; if (a & 134217856) { let c = a & 128 && n.value === ""; return U ? c ? 12123649 : 7929345 : c ? 12582401 : 16776705 } if (a & 40) return U ? 16317698 : 16776450; if (a & 256) { let c = n.value === 0; return U ? c ? 12123394 : 7929090 : c ? 12582146 : 16776450 } if (a & 64) return U ? 16317188 : 16775940; if (a & 2048) { let c = p2e(n); return U ? c ? 12122884 : 7928580 : c ? 12581636 : 16775940 } return a & 16 ? U ? 16316168 : 16774920 : a & 528 ? U ? n === Ke || n === oe ? 12121864 : 7927560 : n === Ke || n === oe ? 12580616 : 16774920 : a & 524288 ? Ur(n) & 16 && mh(n) ? U ? 83427327 : 83886079 : vre(n) ? U ? 7880640 : 16728e3 : U ? 7888800 : 16736160 : a & 16384 ? 9830144 : a & 32768 ? 26607360 : a & 65536 ? 42917664 : a & 12288 ? U ? 7925520 : 16772880 : a & 67108864 ? U ? 7888800 : 16736160 : a & 131072 ? 0 : a & 1048576 ? ou(n.types, (c, u) => c | iu(u), 0) : a & 2097152 ? dYe(n) : 83886079 } function dYe(n) { let a = Js(n, 134348796), c = 0, u = 134217727; for (let p of n.types) if (!(a && p.flags & 524288)) { let h = iu(p); c |= h, u &= h } return c & 8256 | u & 134209471 } function wf(n, a) { return jc(n, c => (iu(c) & a) !== 0) } function $E(n, a) { let c = M2e(wf(U && n.flags & 2 ? hc : n, a)); if (U) switch (a) { case 524288: return Ls(c, u => iu(u) & 65536 ? so([u, iu(u) & 131072 && !Js(c, 65536) ? Gr([Ki, ln]) : Ki]) : u); case 1048576: return Ls(c, u => iu(u) & 131072 ? so([u, iu(u) & 65536 && !Js(c, 32768) ? Gr([Ki, Oe]) : Ki]) : u); case 2097152: case 4194304: return Ls(c, u => iu(u) & 262144 ? wXe(u) : u) }return c } function M2e(n) { return n === hc ? ue : n } function bre(n, a) { return a ? Gr([me(n), au(a)]) : n } function F2e(n, a) { var c; let u = pg(a); if (!fh(u)) return ve; let p = Np(u); return Vc(n, p) || hD((c = jx(n, p)) == null ? void 0 : c.type) || ve } function G2e(n, a) { return Im(n, IC) && TXe(n, a) || hD(wy(65, n, Oe, void 0)) || ve } function hD(n) { return n && (Y.noUncheckedIndexedAccess ? Gr([n, Ge]) : n) } function B2e(n) { return nu(wy(65, n, Oe, void 0) || ve) } function fYe(n) { return n.parent.kind === 206 && Ere(n.parent) || n.parent.kind === 299 && Ere(n.parent.parent) ? bre(xM(n), n.right) : au(n.right) } function Ere(n) { return n.parent.kind === 223 && n.parent.left === n || n.parent.kind === 247 && n.parent.initializer === n } function _Ye(n, a) { return G2e(xM(n), n.elements.indexOf(a)) } function pYe(n) { return B2e(xM(n.parent)) } function U2e(n) { return F2e(xM(n.parent), n.name) } function mYe(n) { return bre(U2e(n), n.objectAssignmentInitializer) } function xM(n) { let { parent: a } = n; switch (a.kind) { case 246: return ae; case 247: return e8(a) || ve; case 223: return fYe(a); case 217: return Oe; case 206: return _Ye(a, n); case 227: return pYe(a); case 299: return U2e(a); case 300: return mYe(a) }return ve } function hYe(n) { let a = n.parent, c = j2e(a.parent), u = a.kind === 203 ? F2e(c, n.propertyName || n.name) : n.dotDotDotToken ? B2e(c) : G2e(c, a.elements.indexOf(n)); return bre(u, n.initializer) } function V2e(n) { return Rr(n).resolvedType || au(n) } function gYe(n) { return n.initializer ? V2e(n.initializer) : n.parent.parent.kind === 246 ? ae : n.parent.parent.kind === 247 && e8(n.parent.parent) || ve } function j2e(n) { return n.kind === 257 ? gYe(n) : hYe(n) } function yYe(n) { return n.kind === 257 && n.initializer && is(n.initializer) || n.kind !== 205 && n.parent.kind === 223 && is(n.parent.right) } function a0(n) { switch (n.kind) { case 214: return a0(n.expression); case 223: switch (n.operatorToken.kind) { case 63: case 75: case 76: case 77: return a0(n.left); case 27: return a0(n.right) } }return n } function H2e(n) { let { parent: a } = n; return a.kind === 214 || a.kind === 223 && a.operatorToken.kind === 63 && a.left === n || a.kind === 223 && a.operatorToken.kind === 27 && a.right === n ? H2e(a) : n } function vYe(n) { return n.kind === 292 ? Hu(au(n.expression)) : lt } function DB(n) { let a = Rr(n); if (!a.switchTypes) { a.switchTypes = []; for (let c of n.caseBlock.clauses) a.switchTypes.push(vYe(c)) } return a.switchTypes } function W2e(n) { if (vt(n.caseBlock.clauses, c => c.kind === 292 && !es(c.expression))) return; let a = []; for (let c of n.caseBlock.clauses) { let u = c.kind === 292 ? c.expression.text : void 0; a.push(u && !ya(a, u) ? u : void 0) } return a } function bYe(n, a) { return n.flags & 1048576 ? !mn(n.types, c => !ya(a, c)) : ya(a, n) } function gD(n, a) { return n === a || a.flags & 1048576 && EYe(n, a) } function EYe(n, a) { if (n.flags & 1048576) { for (let c of n.types) if (!Qb(a.types, c)) return !1; return !0 } return n.flags & 1056 && Kk(n) === a ? !0 : Qb(a.types, n) } function QE(n, a) { return n.flags & 1048576 ? mn(n.types, a) : a(n) } function yh(n, a) { return n.flags & 1048576 ? vt(n.types, a) : a(n) } function Im(n, a) { return n.flags & 1048576 ? Ji(n.types, a) : a(n) } function TYe(n, a) { return n.flags & 3145728 ? Ji(n.types, a) : a(n) } function jc(n, a) { if (n.flags & 1048576) { let c = n.types, u = Pr(c, a); if (u === c) return n; let p = n.origin, h; if (p && p.flags & 1048576) { let T = p.types, k = Pr(T, O => !!(O.flags & 1048576) || a(O)); if (T.length - k.length === c.length - u.length) { if (k.length === 1) return k[0]; h = bne(1048576, k) } } return Tne(u, n.objectFlags & 16809984, void 0, void 0, h) } return n.flags & 131072 || a(n) ? n : lt } function wB(n, a) { return jc(n, c => c !== a) } function SYe(n) { return n.flags & 1048576 ? n.types.length : 1 } function Ls(n, a, c) { if (n.flags & 131072) return n; if (!(n.flags & 1048576)) return a(n); let u = n.origin, p = u && u.flags & 1048576 ? u.types : n.types, h, T = !1; for (let k of p) { let O = k.flags & 1048576 ? Ls(k, a, c) : a(k); T || (T = k !== O), O && (h ? h.push(O) : h = [O]) } return T ? h && Gr(h, c ? 0 : 1) : n } function z2e(n, a, c, u) { return n.flags & 1048576 && c ? Gr(on(n.types, a), 1, c, u) : Ls(n, a) } function DC(n, a) { return jc(n, c => (c.flags & a) !== 0) } function J2e(n, a) { return Js(n, 134217804) && Js(a, 402655616) ? Ls(n, c => c.flags & 4 ? DC(a, 402653316) : qx(c) && !Js(a, 402653188) ? DC(a, 128) : c.flags & 8 ? DC(a, 264) : c.flags & 64 ? DC(a, 2112) : c) : n } function Zx(n) { return n.flags === 0 } function ZE(n) { return n.flags === 0 ? n.type : n } function eA(n, a) { return a ? { flags: 0, type: n.flags & 131072 ? Qe : n } : n } function xYe(n) { let a = Bd(256); return a.elementType = n, a } function Tre(n) { return hi[n.id] || (hi[n.id] = xYe(n)) } function K2e(n, a) { let c = EM(ky(KM(a))); return gD(c, n.elementType) ? n : Tre(Gr([n.elementType, c])) } function AYe(n) { return n.flags & 131072 ? bn : nu(n.flags & 1048576 ? Gr(n.types, 2) : n) } function CYe(n) { return n.finalArrayType || (n.finalArrayType = AYe(n.elementType)) } function AM(n) { return Ur(n) & 256 ? CYe(n) : n } function IYe(n) { return Ur(n) & 256 ? n.elementType : lt } function LYe(n) { let a = !1; for (let c of n) if (!(c.flags & 131072)) { if (!(Ur(c) & 256)) return !1; a = !0 } return a } function q2e(n) { let a = H2e(n), c = a.parent, u = br(c) && (c.name.escapedText === "length" || c.parent.kind === 210 && Re(c.name) && jH(c.name)), p = c.kind === 209 && c.expression === a && c.parent.kind === 223 && c.parent.operatorToken.kind === 63 && c.parent.left === c && !Um(c.parent) && ul(au(c.argumentExpression), 296); return u || p } function kYe(n) { return (wi(n) || Na(n) || $d(n) || ha(n)) && !!(Cl(n) || Yn(n) && Jy(n) && n.initializer && a2(n.initializer) && U_(n.initializer)) } function RB(n, a) { if (n = Ac(n), n.flags & 8752) return zn(n); if (n.flags & 7) { if (ac(n) & 262144) { let u = n.links.syntheticOrigin; if (u && RB(u)) return zn(n) } let c = n.valueDeclaration; if (c) { if (kYe(c)) return zn(n); if (wi(c) && c.parent.parent.kind === 247) { let u = c.parent.parent, p = CM(u.expression, void 0); if (p) { let h = u.awaitModifier ? 15 : 13; return wy(h, p, Oe, void 0) } } a && Ao(a, hr(c, _._0_needs_an_explicit_type_annotation, E(n))) } } } function CM(n, a) { if (!(n.flags & 33554432)) switch (n.kind) { case 79: let c = tp(Qf(n)); return RB(c, a); case 108: return qYe(n); case 106: return Ire(n); case 208: { let u = CM(n.expression, a); if (u) { let p = n.name, h; if (pi(p)) { if (!u.symbol) return; h = ja(u, hR(u.symbol, p.escapedText)) } else h = ja(u, p.escapedText); return h && RB(h, a) } return } case 214: return CM(n.expression, a) } } function OB(n) { let a = Rr(n), c = a.effectsSignature; if (c === void 0) { let u; n.parent.kind === 241 ? u = CM(n.expression, void 0) : n.expression.kind !== 106 && (Jl(n) ? u = sp(dD(Yi(n.expression), n.expression), n.expression) : u = NC(n.expression)); let p = xa(u && Eu(u) || ue, 0), h = p.length === 1 && !p[0].typeParameters ? p[0] : vt(p, X2e) ? MC(n) : void 0; c = a.effectsSignature = h && X2e(h) ? h : jt } return c === jt ? void 0 : c } function X2e(n) { return !!(Lf(n) || n.declaration && (Hx(n.declaration) || ue).flags & 131072) } function DYe(n, a) { if (n.kind === 1 || n.kind === 3) return a.arguments[n.parameterIndex]; let c = vs(a.expression); return Us(c) ? vs(c.expression) : void 0 } function wYe(n) { let a = jn(n, Bj), c = Gn(n), u = Pg(c, a.statements.pos); Lo.add(al(c, u.start, u.length, _.The_containing_function_or_module_body_is_too_large_for_control_flow_analysis)) } function IM(n) { let a = NB(n, !1); return $t = n, Xn = a, a } function LM(n) { let a = vs(n, !0); return a.kind === 95 || a.kind === 223 && (a.operatorToken.kind === 55 && (LM(a.left) || LM(a.right)) || a.operatorToken.kind === 56 && LM(a.left) && LM(a.right)) } function NB(n, a) { for (; ;) { if (n === $t) return Xn; let c = n.flags; if (c & 4096) { if (!a) { let u = yre(n), p = vx[u]; return p !== void 0 ? p : vx[u] = NB(n, !0) } a = !1 } if (c & 368) n = n.antecedent; else if (c & 512) { let u = OB(n.node); if (u) { let p = Lf(u); if (p && p.kind === 3 && !p.type) { let h = n.node.arguments[p.parameterIndex]; if (h && LM(h)) return !1 } if (qo(u).flags & 131072) return !1 } n = n.antecedent } else { if (c & 4) return vt(n.antecedents, u => NB(u, !1)); if (c & 8) { let u = n.antecedents; if (u === void 0 || u.length === 0) return !1; n = u[0] } else if (c & 128) { if (n.clauseStart === n.clauseEnd && xIe(n.switchStatement)) return !1; n = n.antecedent } else if (c & 1024) { $t = void 0; let u = n.target, p = u.antecedents; u.antecedents = n.antecedents; let h = NB(n.antecedent, !1); return u.antecedents = p, h } else return !(c & 1) } } } function PB(n, a) { for (; ;) { let c = n.flags; if (c & 4096) { if (!a) { let u = yre(n), p = _E[u]; return p !== void 0 ? p : _E[u] = PB(n, !0) } a = !1 } if (c & 496) n = n.antecedent; else if (c & 512) { if (n.node.expression.kind === 106) return !0; n = n.antecedent } else { if (c & 4) return Ji(n.antecedents, u => PB(u, !1)); if (c & 8) n = n.antecedents[0]; else if (c & 1024) { let u = n.target, p = u.antecedents; u.antecedents = n.antecedents; let h = PB(n.antecedent, !1); return u.antecedents = p, h } else return !!(c & 1) } } } function Y2e(n) { switch (n.kind) { case 79: if (!mS(n)) { let a = Qf(n); return wC(a) || VW(a) && !MB(a) } break; case 208: case 209: return Y2e(n.expression) && M_(Rr(n).resolvedSymbol || Ht) }return !1 } function Yv(n, a, c = a, u, p = (h => (h = zr(n, cR)) == null ? void 0 : h.flowNode)()) { let h, T = !1, k = 0; if (ki) return ve; if (!p) return a; Vn++; let O = kr, H = ZE(Ae(p)); kr = O; let J = Ur(H) & 256 && q2e(n) ? bn : AM(H); if (J === Hn || n.parent && n.parent.kind === 232 && !(J.flags & 131072) && wf(J, 2097152).flags & 131072) return a; return J === G ? ue : J; function de() { return T ? h : (T = !0, h = kB(n, a, c, u)) } function Ae(st) { var Ct; if (k === 2e3) return (Ct = ai) == null || Ct.instant(ai.Phase.CheckTypes, "getTypeAtFlowNode_DepthLimit", { flowId: st.id }), ki = !0, wYe(n), ve; k++; let Bt; for (; ;) { let Ft = st.flags; if (Ft & 4096) { for (let Un = O; Un < kr; Un++)if (fE[Un] === st) return k--, yv[Un]; Bt = st } let hn; if (Ft & 16) { if (hn = tt(st), !hn) { st = st.antecedent; continue } } else if (Ft & 512) { if (hn = Tn(st), !hn) { st = st.antecedent; continue } } else if (Ft & 96) hn = Nn(st); else if (Ft & 128) hn = en(st); else if (Ft & 12) { if (st.antecedents.length === 1) { st = st.antecedents[0]; continue } hn = Ft & 4 ? cn(st) : rr(st) } else if (Ft & 256) { if (hn = un(st), !hn) { st = st.antecedent; continue } } else if (Ft & 1024) { let Un = st.target, yi = Un.antecedents; Un.antecedents = st.antecedents, hn = Ae(st.antecedent), Un.antecedents = yi } else if (Ft & 2) { let Un = st.node; if (Un && Un !== u && n.kind !== 208 && n.kind !== 209 && n.kind !== 108) { st = Un.flowNode; continue } hn = c } else hn = PD(a); return Bt && (fE[kr] = Bt, yv[kr] = hn, kr++), k--, hn } } function xe(st) { let Ct = st.node; return Sre(Ct.kind === 257 || Ct.kind === 205 ? j2e(Ct) : xM(Ct), n) } function tt(st) { let Ct = st.node; if (El(n, Ct)) { if (!IM(st)) return Hn; if (xT(Ct) === 2) { let Bt = Ae(st.antecedent); return eA(ky(ZE(Bt)), Zx(Bt)) } if (a === at || a === bn) { if (yYe(Ct)) return Tre(lt); let Bt = i0(xe(st)); return to(Bt, a) ? Bt : Et } return a.flags & 1048576 ? lYe(a, xe(st)) : a } if (w2e(n, Ct)) { if (!IM(st)) return Hn; if (wi(Ct) && (Yn(Ct) || kh(Ct))) { let Bt = $w(Ct); if (Bt && (Bt.kind === 215 || Bt.kind === 216)) return Ae(st.antecedent) } return a } if (wi(Ct) && Ct.parent.parent.kind === 246 && (El(n, Ct.parent.parent.expression) || P1(Ct.parent.parent.expression, n))) return Wre(AM(ZE(Ae(st.antecedent)))) } function It(st, Ct) { let Bt = vs(Ct, !0); if (Bt.kind === 95) return Hn; if (Bt.kind === 223) { if (Bt.operatorToken.kind === 55) return It(It(st, Bt.left), Bt.right); if (Bt.operatorToken.kind === 56) return Gr([It(st, Bt.left), It(st, Bt.right)]) } return _i(st, Bt, !0) } function Tn(st) { let Ct = OB(st.node); if (Ct) { let Bt = Lf(Ct); if (Bt && (Bt.kind === 2 || Bt.kind === 3)) { let Ft = Ae(st.antecedent), hn = AM(ZE(Ft)), Un = Bt.type ? ua(hn, Bt, st.node, !0) : Bt.kind === 3 && Bt.parameterIndex >= 0 && Bt.parameterIndex < st.node.arguments.length ? It(hn, st.node.arguments[Bt.parameterIndex]) : hn; return Un === hn ? Ft : eA(Un, Zx(Ft)) } if (qo(Ct).flags & 131072) return Hn } } function un(st) { if (a === at || a === bn) { let Ct = st.node, Bt = Ct.kind === 210 ? Ct.expression.expression : Ct.left.expression; if (El(n, a0(Bt))) { let Ft = Ae(st.antecedent), hn = ZE(Ft); if (Ur(hn) & 256) { let Un = hn; if (Ct.kind === 210) for (let yi of Ct.arguments) Un = K2e(Un, yi); else { let yi = KM(Ct.left.argumentExpression); ul(yi, 296) && (Un = K2e(Un, Ct.right)) } return Un === hn ? Ft : eA(Un, Zx(Ft)) } return Ft } } } function Nn(st) { let Ct = Ae(st.antecedent), Bt = ZE(Ct); if (Bt.flags & 131072) return Ct; let Ft = (st.flags & 32) !== 0, hn = AM(Bt), Un = _i(hn, st.node, Ft); return Un === hn ? Ct : eA(Un, Zx(Ct)) } function en(st) { let Ct = st.switchStatement.expression, Bt = Ae(st.antecedent), Ft = ZE(Bt); if (El(n, Ct)) Ft = ko(Ft, st.switchStatement, st.clauseStart, st.clauseEnd); else if (Ct.kind === 218 && El(n, Ct.expression)) Ft = no(Ft, st.switchStatement, st.clauseStart, st.clauseEnd); else { U && (P1(Ct, n) ? Ft = Bi(Ft, st.switchStatement, st.clauseStart, st.clauseEnd, Un => !(Un.flags & 163840)) : Ct.kind === 218 && P1(Ct.expression, n) && (Ft = Bi(Ft, st.switchStatement, st.clauseStart, st.clauseEnd, Un => !(Un.flags & 131072 || Un.flags & 128 && Un.value === "undefined")))); let hn = Rn(Ct, Ft); hn && (Ft = qi(Ft, hn, st.switchStatement, st.clauseStart, st.clauseEnd)) } return eA(Ft, Zx(Bt)) } function cn(st) { let Ct = [], Bt = !1, Ft = !1, hn; for (let Un of st.antecedents) { if (!hn && Un.flags & 128 && Un.clauseStart === Un.clauseEnd) { hn = Un; continue } let yi = Ae(Un), Di = ZE(yi); if (Di === a && a === c) return Di; Of(Ct, Di), gD(Di, a) || (Bt = !0), Zx(yi) && (Ft = !0) } if (hn) { let Un = Ae(hn), yi = ZE(Un); if (!(yi.flags & 131072) && !ya(Ct, yi) && !xIe(hn.switchStatement)) { if (yi === a && a === c) return yi; Ct.push(yi), gD(yi, a) || (Bt = !0), Zx(Un) && (Ft = !0) } } return eA(Jt(Ct, Bt ? 2 : 1), Ft) } function rr(st) { let Ct = yre(st), Bt = zh[Ct] || (zh[Ct] = new Map), Ft = de(); if (!Ft) return a; let hn = Bt.get(Ft); if (hn) return hn; for (let er = sn; er < Dn; er++)if (p1[er] === st && uE[er] === Ft && dE[er].length) return eA(Jt(dE[er], 1), !0); let Un = [], yi = !1, Di; for (let er of st.antecedents) { let Sr; if (!Di) Sr = Di = Ae(er); else { p1[Dn] = st, uE[Dn] = Ft, dE[Dn] = Un, Dn++; let Ii = ra; ra = void 0, Sr = Ae(er), ra = Ii, Dn--; let Bo = Bt.get(Ft); if (Bo) return Bo } let Dr = ZE(Sr); if (Of(Un, Dr), gD(Dr, a) || (yi = !0), Dr === a) break } let Xt = Jt(Un, yi ? 2 : 1); return Zx(Di) ? eA(Xt, !0) : (Bt.set(Ft, Xt), Xt) } function Jt(st, Ct) { if (LYe(st)) return Tre(Gr(on(st, IYe))); let Bt = M2e(Gr(Tl(st, AM), Ct)); return Bt !== a && Bt.flags & a.flags & 1048576 && GD(Bt.types, a.types) ? a : Bt } function Cn(st) { if (La(n) || a2(n) || s_(n)) { if (Re(st)) { let Bt = Qf(st).valueDeclaration; if (Bt && (Wo(Bt) || ha(Bt)) && n === Bt.parent && !Bt.initializer && !Bt.dotDotDotToken) return Bt } } else if (Us(st)) { if (El(n, st.expression)) return st } else if (Re(st)) { let Ct = Qf(st); if (wC(Ct)) { let Bt = Ct.valueDeclaration; if (wi(Bt) && !Bt.type && Bt.initializer && Us(Bt.initializer) && El(n, Bt.initializer.expression)) return Bt.initializer; if (Wo(Bt) && !Bt.initializer) { let Ft = Bt.parent.parent; if (wi(Ft) && !Ft.type && Ft.initializer && (Re(Ft.initializer) || Us(Ft.initializer)) && El(n, Ft.initializer)) return Bt } } } } function Rn(st, Ct) { let Bt = a.flags & 1048576 ? a : Ct; if (Bt.flags & 1048576) { let Ft = Cn(st); if (Ft) { let hn = YE(Ft); if (hn && mD(Bt, hn)) return Ft } } } function Br(st, Ct, Bt) { let Ft = YE(Ct); if (Ft === void 0) return st; let hn = Jl(Ct), Un = U && (hn || Hle(Ct)) && Js(st, 98304), yi = Vc(Un ? wf(st, 2097152) : st, Ft); if (!yi) return st; yi = Un && hn ? gg(yi) : yi; let Di = Bt(yi); return jc(st, Xt => { let er = KP(Xt, Ft); return !(er.flags & 131072) && !(Di.flags & 131072) && _M(Di, er) }) } function Hr(st, Ct, Bt, Ft, hn) { if ((Bt === 36 || Bt === 37) && st.flags & 1048576) { let Un = TM(st); if (Un && Un === YE(Ct)) { let yi = SM(st, au(Ft)); if (yi) return Bt === (hn ? 36 : 37) ? yi : N_(Vc(yi, Un) || ue) ? wB(st, yi) : st } } return Br(st, Ct, Un => qn(Un, Bt, Ft, hn)) } function qi(st, Ct, Bt, Ft, hn) { if (Ft < hn && st.flags & 1048576 && TM(st) === YE(Ct)) { let Un = DB(Bt).slice(Ft, hn), yi = Gr(on(Un, Di => SM(st, Di) || ue)); if (yi !== ue) return yi } return Br(st, Ct, Un => ko(Un, Bt, Ft, hn)) } function wa(st, Ct, Bt) { if (El(n, Ct)) return $E(st, Bt ? 4194304 : 8388608); U && Bt && P1(Ct, n) && (st = $E(st, 2097152)); let Ft = Rn(Ct, st); return Ft ? Br(st, Ft, hn => wf(hn, Bt ? 4194304 : 8388608)) : st } function Xc(st, Ct, Bt) { let Ft = ja(st, Ct); return Ft ? !!(Ft.flags & 16777216) || Bt : !!jx(st, Ct) || !Bt } function pf(st, Ct, Bt) { let Ft = Np(Ct); if (yh(st, Un => Xc(Un, Ft, !0))) return jc(st, Un => Xc(Un, Ft, Bt)); if (Bt) { let Un = MKe(); if (Un) return so([st, Jx(Un, [Ct, ue])]) } return st } function Hd(st, Ct, Bt) { switch (Ct.operatorToken.kind) { case 63: case 75: case 76: case 77: return wa(_i(st, Ct.right, Bt), Ct.left, Bt); case 34: case 35: case 36: case 37: let Ft = Ct.operatorToken.kind, hn = a0(Ct.left), Un = a0(Ct.right); if (hn.kind === 218 && es(Un)) return Mi(st, hn, Ft, Un, Bt); if (Un.kind === 218 && es(hn)) return Mi(st, Un, Ft, hn, Bt); if (El(n, hn)) return qn(st, Ft, Un, Bt); if (El(n, Un)) return qn(st, Ft, hn, Bt); U && (P1(hn, n) ? st = In(st, Ft, Un, Bt) : P1(Un, n) && (st = In(st, Ft, hn, Bt))); let yi = Rn(hn, st); if (yi) return Hr(st, yi, Ft, Un, Bt); let Di = Rn(Un, st); if (Di) return Hr(st, Di, Ft, hn, Bt); if (Tu(hn)) return et(st, Ft, Un, Bt); if (Tu(Un)) return et(st, Ft, hn, Bt); break; case 102: return he(st, Ct, Bt); case 101: if (pi(Ct.left)) return ji(st, Ct, Bt); let Xt = a0(Ct.right), er = au(Ct.left); if (er.flags & 8576) { if (fD(st) && Us(n) && El(n.expression, Xt) && YE(n) === Np(er)) return wf(st, Bt ? 524288 : 65536); if (El(n, Xt)) return pf(st, er, Bt) } break; case 27: return _i(st, Ct.right, Bt); case 55: return Bt ? _i(_i(st, Ct.left, !0), Ct.right, !0) : Gr([_i(st, Ct.left, !1), _i(st, Ct.right, !1)]); case 56: return Bt ? Gr([_i(st, Ct.left, !0), _i(st, Ct.right, !0)]) : _i(_i(st, Ct.left, !1), Ct.right, !1) }return st } function ji(st, Ct, Bt) { let Ft = a0(Ct.right); if (!El(n, Ft)) return st; L.assertNode(Ct.left, pi); let hn = KB(Ct.left); if (hn === void 0) return st; let Un = hn.parent, yi = zc(L.checkDefined(hn.valueDeclaration, "should always have a declaration")) ? zn(Un) : gs(Un); return Mn(st, yi, Bt, !0) } function In(st, Ct, Bt, Ft) { let hn = Ct === 34 || Ct === 36, Un = Ct === 34 || Ct === 35 ? 98304 : 32768, yi = au(Bt); return hn !== Ft && Im(yi, Xt => !!(Xt.flags & Un)) || hn === Ft && Im(yi, Xt => !(Xt.flags & (3 | Un))) ? $E(st, 2097152) : st } function qn(st, Ct, Bt, Ft) { if (st.flags & 1) return st; (Ct === 35 || Ct === 37) && (Ft = !Ft); let hn = au(Bt), Un = Ct === 34 || Ct === 35; if (hn.flags & 98304) { if (!U) return st; let yi = Un ? Ft ? 262144 : 2097152 : hn.flags & 65536 ? Ft ? 131072 : 1048576 : Ft ? 65536 : 524288; return $E(st, yi) } if (Ft) { if (!Un && (st.flags & 2 || yh(st, hh))) { if (hn.flags & 201457660 || hh(hn)) return hn; if (hn.flags & 524288) return jr } let yi = jc(st, Di => _M(Di, hn) || Un && RXe(Di, hn)); return J2e(yi, hn) } return N_(hn) ? jc(st, yi => !(d2e(yi) && _M(yi, hn))) : st } function Mi(st, Ct, Bt, Ft, hn) { (Bt === 35 || Bt === 37) && (hn = !hn); let Un = a0(Ct.expression); if (!El(n, Un)) { U && P1(Un, n) && hn === (Ft.text !== "undefined") && (st = $E(st, 2097152)); let yi = Rn(Un, st); return yi ? Br(st, yi, Di => ga(Di, Ft, hn)) : st } return ga(st, Ft, hn) } function ga(st, Ct, Bt) { return Bt ? us(st, Ct.text) : $E(st, fF.get(Ct.text) || 32768) } function Bi(st, Ct, Bt, Ft, hn) { return Bt !== Ft && Ji(DB(Ct).slice(Bt, Ft), hn) ? wf(st, 2097152) : st } function ko(st, Ct, Bt, Ft) { let hn = DB(Ct); if (!hn.length) return st; let Un = hn.slice(Bt, Ft), yi = Bt === Ft || ya(Un, lt); if (st.flags & 2 && !yi) { let Sr; for (let Dr = 0; Dr < Un.length; Dr += 1) { let Ii = Un[Dr]; if (Ii.flags & 201457660) Sr !== void 0 && Sr.push(Ii); else if (Ii.flags & 524288) Sr === void 0 && (Sr = Un.slice(0, Dr)), Sr.push(jr); else return st } return Gr(Sr === void 0 ? Un : Sr) } let Di = Gr(Un), Xt = Di.flags & 131072 ? lt : J2e(jc(st, Sr => _M(Di, Sr)), Di); if (!yi) return Xt; let er = jc(st, Sr => !(d2e(Sr) && ya(hn, Hu(xXe(Sr))))); return Xt.flags & 131072 ? er : Gr([Xt, er]) } function us(st, Ct) { switch (Ct) { case "string": return Xs(st, ae, 1); case "number": return Xs(st, rt, 2); case "bigint": return Xs(st, Ot, 4); case "boolean": return Xs(st, Te, 8); case "symbol": return Xs(st, j, 16); case "object": return st.flags & 1 ? st : Gr([Xs(st, jr, 32), Xs(st, ln, 131072)]); case "function": return st.flags & 1 ? st : Xs(st, Hs, 64); case "undefined": return Xs(st, Oe, 65536) }return Xs(st, jr, 128) } function Xs(st, Ct, Bt) { return Ls(st, Ft => Bp(Ft, Ct, x_) ? iu(Ft) & Bt ? Ft : lt : Iy(Ct, Ft) ? Ct : iu(Ft) & Bt ? so([Ft, Ct]) : lt) } function no(st, Ct, Bt, Ft) { let hn = W2e(Ct); if (!hn) return st; let Un = Yc(Ct.caseBlock.clauses, Xt => Xt.kind === 293); if (Bt === Ft || Un >= Bt && Un < Ft) { let Xt = SIe(Bt, Ft, hn); return jc(st, er => (iu(er) & Xt) === Xt) } let Di = hn.slice(Bt, Ft); return Gr(on(Di, Xt => Xt ? us(st, Xt) : lt)) } function Tu(st) { return (br(st) && vr(st.name) === "constructor" || Vs(st) && es(st.argumentExpression) && st.argumentExpression.text === "constructor") && El(n, st.expression) } function et(st, Ct, Bt, Ft) { if (Ft ? Ct !== 34 && Ct !== 36 : Ct !== 35 && Ct !== 37) return st; let hn = au(Bt); if (!Jie(hn) && !Uv(hn)) return st; let Un = ja(hn, "prototype"); if (!Un) return st; let yi = zn(Un), Di = Zo(yi) ? void 0 : yi; if (!Di || Di === ka || Di === Hs) return st; if (Zo(st)) return Di; return jc(st, er => Xt(er, Di)); function Xt(er, Sr) { return er.flags & 524288 && Ur(er) & 1 || Sr.flags & 524288 && Ur(Sr) & 1 ? er.symbol === Sr.symbol : Iy(er, Sr) } } function he(st, Ct, Bt) { let Ft = a0(Ct.left); if (!El(n, Ft)) return Bt && U && P1(Ft, n) ? $E(st, 2097152) : st; let hn = au(Ct.right); if (!r0(hn, Hs)) return st; let Un = Ls(hn, Bn); return Zo(st) && (Un === ka || Un === Hs) || !Bt && !(Un.flags & 524288 && !hh(Un)) ? st : Mn(st, Un, Bt, !0) } function Bn(st) { let Ct = Vc(st, "prototype"); if (Ct && !Zo(Ct)) return Ct; let Bt = xa(st, 1); return Bt.length ? Gr(on(Bt, Ft => qo(tD(Ft)))) : Ki } function Mn(st, Ct, Bt, Ft) { var hn; let Un = st.flags & 1048576 ? `N${ru(st)},${ru(Ct)},${(Bt ? 1 : 0) | (Ft ? 2 : 0)}` : void 0; return (hn = wb(Un)) != null ? hn : qh(Un, or(st, Ct, Bt, Ft)) } function or(st, Ct, Bt, Ft) { if (!Bt) { if (Ft) return jc(st, Xt => !r0(Xt, Ct)); let Di = Mn(st, Ct, !0, !1); return jc(st, Xt => !gD(Xt, Di)) } if (st.flags & 3) return Ct; let hn = Ft ? r0 : Iy, Un = st.flags & 1048576 ? TM(st) : void 0, yi = Ls(Ct, Di => { let Xt = Un && Vc(Di, Un), er = Xt && SM(st, Xt), Sr = Ls(er || st, Ft ? Dr => r0(Dr, Di) ? Dr : r0(Di, Dr) ? Di : lt : Dr => qAe(Dr, Di) ? Dr : qAe(Di, Dr) ? Di : Iy(Dr, Di) ? Dr : Iy(Di, Dr) ? Di : lt); return Sr.flags & 131072 ? Ls(st, Dr => Js(Dr, 465829888) && hn(Di, bu(Dr) || ue) ? so([Dr, Di]) : lt) : Sr }); return yi.flags & 131072 ? Iy(Ct, st) ? Ct : to(st, Ct) ? st : to(Ct, st) ? Ct : so([st, Ct]) : yi } function _r(st, Ct, Bt) { if (P2e(Ct, n)) { let Ft = Bt || !dT(Ct) ? OB(Ct) : void 0, hn = Ft && Lf(Ft); if (hn && (hn.kind === 0 || hn.kind === 1)) return ua(st, hn, Ct, Bt) } if (fD(st) && Us(n) && br(Ct.expression)) { let Ft = Ct.expression; if (El(n.expression, a0(Ft.expression)) && Re(Ft.name) && Ft.name.escapedText === "hasOwnProperty" && Ct.arguments.length === 1) { let hn = Ct.arguments[0]; if (es(hn) && YE(n) === Bs(hn.text)) return wf(st, Bt ? 524288 : 65536) } } return st } function ua(st, Ct, Bt, Ft) { if (Ct.type && !(Zo(st) && (Ct.type === ka || Ct.type === Hs))) { let hn = DYe(Ct, Bt); if (hn) { if (El(n, hn)) return Mn(st, Ct.type, Ft, !1); U && Ft && P1(hn, n) && !(iu(Ct.type) & 65536) && (st = $E(st, 2097152)); let Un = Rn(hn, st); if (Un) return Br(st, Un, yi => Mn(yi, Ct.type, Ft, !1)) } } return st } function _i(st, Ct, Bt) { if (r6(Ct) || ar(Ct.parent) && (Ct.parent.operatorToken.kind === 60 || Ct.parent.operatorToken.kind === 77) && Ct.parent.left === Ct) return ur(st, Ct, Bt); switch (Ct.kind) { case 79: if (!El(n, Ct) && C < 5) { let Ft = Qf(Ct); if (wC(Ft)) { let hn = Ft.valueDeclaration; if (hn && wi(hn) && !hn.type && hn.initializer && Y2e(n)) { C++; let Un = _i(st, hn.initializer, Bt); return C--, Un } } } case 108: case 106: case 208: case 209: return wa(st, Ct, Bt); case 210: return _r(st, Ct, Bt); case 214: case 232: return _i(st, Ct.expression, Bt); case 223: return Hd(st, Ct, Bt); case 221: if (Ct.operator === 53) return _i(st, Ct.operand, !Bt); break }return st } function ur(st, Ct, Bt) { if (El(n, Ct)) return $E(st, Bt ? 2097152 : 262144); let Ft = Rn(Ct, st); return Ft ? Br(st, Ft, hn => wf(hn, Bt ? 2097152 : 262144)) : st } } function RYe(n, a) { if (n = tp(n), (a.kind === 79 || a.kind === 80) && (zI(a) && (a = a.parent), Dh(a) && (!Um(a) || YI(a)))) { let c = au(a); if (tp(Rr(a).resolvedSymbol) === n) return c } return Rh(a) && Ng(a.parent) && N(a.parent) ? Fi(a.parent.symbol) : Gv(n) } function yD(n) { return jn(n.parent, a => Ia(a) && !ET(a) || a.kind === 265 || a.kind === 308 || a.kind === 169) } function MB(n) { if (!n.valueDeclaration) return !1; let a = nm(n.valueDeclaration).parent, c = Rr(a); return c.flags & 524288 || (c.flags |= 524288, OYe(a) || $2e(a)), n.isAssigned || !1 } function OYe(n) { return !!jn(n.parent, a => (Ia(a) || E2(a)) && !!(Rr(a).flags & 524288)) } function $2e(n) { if (n.kind === 79) { if (Um(n)) { let a = Qf(n); VW(a) && (a.isAssigned = !0) } } else pa(n, $2e) } function wC(n) { return n.flags & 3 && (WB(n) & 2) !== 0 } function NYe(n) { let a = Rr(n); if (a.parameterInitializerContainsUndefined === void 0) { if (!cf(n, 9)) return pC(n.symbol), !0; let c = !!(iu(ID(n, 0)) & 16777216); if (!If()) return pC(n.symbol), !0; a.parameterInitializerContainsUndefined = c } return a.parameterInitializerContainsUndefined } function PYe(n, a) { return U && a.kind === 166 && a.initializer && iu(n) & 16777216 && !NYe(a) ? wf(n, 524288) : n } function MYe(n, a) { let c = a.parent; return c.kind === 208 || c.kind === 163 || c.kind === 210 && c.expression === a || c.kind === 209 && c.expression === a && !(yh(n, Z2e) && jv(au(c.argumentExpression))) } function Q2e(n) { return n.flags & 2097152 ? vt(n.types, Q2e) : !!(n.flags & 465829888 && Ty(n).flags & 1146880) } function Z2e(n) { return n.flags & 2097152 ? vt(n.types, Z2e) : !!(n.flags & 465829888 && !Js(Ty(n), 98304)) } function FYe(n, a) { let c = (Re(n) || br(n) || Vs(n)) && !((Xm(n.parent) || FS(n.parent)) && n.parent.tagName === n) && (a && a & 64 ? Ru(n, 8) : Ru(n, void 0)); return c && !SC(c) } function Sre(n, a, c) { return !(c && c & 2) && yh(n, Q2e) && (MYe(n, a) || FYe(a, c)) ? Ls(n, Ty) : n } function eCe(n) { return !!jn(n, a => { let c = a.parent; return c === void 0 ? "quit" : pc(c) ? c.expression === a && bc(a) : Mu(c) ? c.name === a || c.propertyName === a : !1 }) } function FB(n, a) { if (!Y.verbatimModuleSyntax && ay(n, 111551) && !kC(a) && !nd(n, 111551)) { let c = wc(n); Fl(c) & 1160127 && (d_(Y) || U0(Y) && eCe(a) || !MD(tp(c)) ? Hb(n) : Wb(n)) } } function GYe(n, a) { var c; let u = zn(n), p = n.valueDeclaration; if (p) { if (Wo(p) && !p.initializer && !p.dotDotDotToken && p.parent.elements.length >= 2) { let h = p.parent.parent; if (h.kind === 257 && G_(p) & 2 || h.kind === 166) { let T = Rr(h); if (!(T.flags & 16777216)) { T.flags |= 16777216; let k = Px(h, 0), O = k && Ls(k, Ty); if (T.flags &= -16777217, O && O.flags & 1048576 && !(h.kind === 166 && MB(n))) { let H = p.parent, J = Yv(H, O, O, void 0, a.flowNode); return J.flags & 131072 ? lt : li(p, J) } } } } if (ha(p) && !p.type && !p.initializer && !p.dotDotDotToken) { let h = p.parent; if (h.parameters.length >= 2 && fB(h)) { let T = bD(h); if (T && T.parameters.length === 1 && Xl(T)) { let k = vC(Oi(zn(T.parameters[0]), (c = M1(h)) == null ? void 0 : c.nonFixingMapper)); if (k.flags & 1048576 && Im(k, po) && !MB(n)) { let O = Yv(h, k, k, void 0, a.flowNode), H = h.parameters.indexOf(p) - (F0(h) ? 1 : 0); return od(O, op(H)) } } } } } return u } function BYe(n, a) { if (mS(n)) return kM(n); let c = Qf(n); if (c === Ht) return ve; if (c === _t) { if (FCe(n)) return Fe(n, _.arguments_cannot_be_referenced_in_property_initializers), ve; let Nn = Xd(n); return R < 2 && (Nn.kind === 216 ? Fe(n, _.The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_standard_function_expression) : Mr(Nn, 512) && Fe(n, _.The_arguments_object_cannot_be_referenced_in_an_async_function_or_method_in_ES3_and_ES5_Consider_using_a_standard_function_or_method)), Rr(Nn).flags |= 512, zn(c) } VYe(n) && FB(c, n); let u = tp(c), p = MLe(u, n); Sv(p) && xne(n, p) && p.declarations && Xh(n, p.declarations, n.escapedText); let h = u.valueDeclaration; if (h && u.flags & 32) { if (h.kind === 260 && FA($, h)) { let Nn = Zc(n); for (; Nn !== void 0;) { if (Nn === h && Nn.name !== n) { Rr(h).flags |= 1048576, Rr(n).flags |= 2097152; break } Nn = Zc(Nn) } } else if (h.kind === 228) { let Nn = Ku(n, !1, !1); for (; Nn.kind !== 308;) { if (Nn.parent === h) { (Na(Nn) && Ca(Nn) || oc(Nn)) && (Rr(h).flags |= 1048576, Rr(n).flags |= 2097152); break } Nn = Ku(Nn, !1, !1) } } } WYe(n, c); let T = GYe(u, n), k = xT(n); if (k) { if (!(u.flags & 3) && !(Yn(n) && u.flags & 512)) { let Nn = u.flags & 384 ? _.Cannot_assign_to_0_because_it_is_an_enum : u.flags & 32 ? _.Cannot_assign_to_0_because_it_is_a_class : u.flags & 1536 ? _.Cannot_assign_to_0_because_it_is_a_namespace : u.flags & 16 ? _.Cannot_assign_to_0_because_it_is_a_function : u.flags & 2097152 ? _.Cannot_assign_to_0_because_it_is_an_import : _.Cannot_assign_to_0_because_it_is_not_a_variable; return Fe(n, Nn, E(c)), ve } if (M_(u)) return u.flags & 3 ? Fe(n, _.Cannot_assign_to_0_because_it_is_a_constant, E(c)) : Fe(n, _.Cannot_assign_to_0_because_it_is_a_read_only_property, E(c)), ve } let O = u.flags & 2097152; if (u.flags & 3) { if (k === 1) return T } else if (O) h = Uu(c); else return T; if (!h) return T; T = Sre(T, n, a); let H = nm(h).kind === 166, J = yD(h), de = yD(n), Ae = de !== J, xe = n.parent && n.parent.parent && VS(n.parent) && Ere(n.parent.parent), tt = c.flags & 134217728; for (; de !== J && (de.kind === 215 || de.kind === 216 || D6(de)) && (wC(u) && T !== bn || H && !MB(u));)de = yD(de); let It = H || O || Ae || xe || tt || UYe(n, h) || T !== at && T !== bn && (!U || (T.flags & 16387) !== 0 || kC(n) || k2e(n) || n.parent.kind === 278) || n.parent.kind === 232 || h.kind === 257 && h.exclamationToken || h.flags & 16777216, Tn = It ? H ? PYe(T, h) : T : T === at || T === bn ? Oe : gg(T), un = Yv(n, T, Tn, de); if (!q2e(n) && (T === at || T === bn)) { if (un === at || un === bn) return ge && (Fe(sa(h), _.Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined, E(c), Ee(un)), Fe(n, _.Variable_0_implicitly_has_an_1_type, E(c), Ee(un))), PD(un) } else if (!It && !xC(T) && xC(un)) return Fe(n, _.Variable_0_is_used_before_being_assigned, E(c)), T; return k ? ky(un) : un } function UYe(n, a) { if (Wo(a)) { let c = jn(n, Wo); return c && nm(c) === nm(a) } } function VYe(n) { var a; let c = n.parent; if (c) { if (br(c) && c.expression === n || Mu(c) && c.isTypeOnly) return !1; let u = (a = c.parent) == null ? void 0 : a.parent; if (u && Il(u) && u.isTypeOnly) return !1 } return !0 } function jYe(n, a) { return !!jn(n, c => c === a ? "quit" : Ia(c) || c.parent && Na(c.parent) && !zc(c.parent) && c.parent.initializer === c) } function HYe(n, a) { return jn(n, c => c === a ? "quit" : c === a.initializer || c === a.condition || c === a.incrementor || c === a.statement) } function xre(n) { return jn(n, a => !a || HH(a) ? "quit" : Wy(a, !1)) } function WYe(n, a) { if (R >= 2 || !(a.flags & 34) || !a.valueDeclaration || Li(a.valueDeclaration) || a.valueDeclaration.parent.kind === 295) return; let c = tm(a.valueDeclaration), u = jYe(n, c), p = xre(c); if (p) { if (u) { let h = !0; if (FT(c)) { let T = cb(a.valueDeclaration, 258); if (T && T.parent === c) { let k = HYe(n.parent, c); if (k) { let O = Rr(k); O.flags |= 8192; let H = O.capturedBlockScopeBindings || (O.capturedBlockScopeBindings = []); Of(H, a), k === c.initializer && (h = !1) } } } h && (Rr(p).flags |= 4096) } if (FT(c)) { let h = cb(a.valueDeclaration, 258); h && h.parent === c && JYe(n, c) && (Rr(a.valueDeclaration).flags |= 262144) } Rr(a.valueDeclaration).flags |= 32768 } u && (Rr(a.valueDeclaration).flags |= 16384) } function zYe(n, a) { let c = Rr(n); return !!c && ya(c.capturedBlockScopeBindings, fr(a)) } function JYe(n, a) { let c = n; for (; c.parent.kind === 214;)c = c.parent; let u = !1; if (Um(c)) u = !0; else if (c.parent.kind === 221 || c.parent.kind === 222) { let p = c.parent; u = p.operator === 45 || p.operator === 46 } return u ? !!jn(c, p => p === a ? "quit" : p === a.statement) : !1 } function Are(n, a) { if (Rr(n).flags |= 2, a.kind === 169 || a.kind === 173) { let c = a.parent; Rr(c).flags |= 4 } else Rr(a).flags |= 4 } function tCe(n) { return OA(n) ? n : Ia(n) ? void 0 : pa(n, tCe) } function nCe(n) { let a = fr(n), c = gs(a); return Wr(c) === ir } function rCe(n, a, c) { let u = a.parent; P0(u) && !nCe(u) && cR(n) && n.flowNode && !PB(n.flowNode, !1) && Fe(n, c) } function KYe(n, a) { Na(a) && zc(a) && $ && a.initializer && Y8(a.initializer, n.pos) && bf(a.parent) && Fe(n, _.Cannot_use_this_in_a_static_property_initializer_of_a_decorated_class) } function kM(n) { let a = kC(n), c = Ku(n, !0, !0), u = !1, p = !1; for (c.kind === 173 && rCe(n, c, _.super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class); ;) { if (c.kind === 216 && (c = Ku(c, !1, !p), u = !0), c.kind === 164) { c = Ku(c, !u, !1), p = !0; continue } break } if (KYe(n, c), p) Fe(n, _.this_cannot_be_referenced_in_a_computed_property_name); else switch (c.kind) { case 264: Fe(n, _.this_cannot_be_referenced_in_a_module_or_namespace_body); break; case 263: Fe(n, _.this_cannot_be_referenced_in_current_location); break; case 173: iCe(n, c) && Fe(n, _.this_cannot_be_referenced_in_constructor_arguments); break }!a && u && R < 2 && Are(n, c); let h = Cre(n, !0, c); if (X) { let T = zn(Ye); if (h === T && u) Fe(n, _.The_containing_arrow_function_captures_the_global_value_of_this); else if (!h) { let k = Fe(n, _.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation); if (!Li(c)) { let O = Cre(c); O && O !== T && Ao(k, hr(c, _.An_outer_value_of_this_is_shadowed_by_this_container)) } } } return h || Se } function Cre(n, a = !0, c = Ku(n, !1, !1)) { let u = Yn(n); if (Ia(c) && (!kre(n) || F0(c))) { let p = Pt(c) || u && YYe(c); if (!p) { let h = XYe(c); if (u && h) { let T = Yi(h).symbol; T && T.members && T.flags & 16 && (p = gs(T).thisType) } else cp(c) && (p = gs(No(c.symbol)).thisType); p || (p = oCe(c)) } if (p) return Yv(n, p) } if (Yr(c.parent)) { let p = fr(c.parent), h = Ca(c) ? zn(p) : gs(p).thisType; return Yv(n, h) } if (Li(c)) if (c.commonJsModuleIndicator) { let p = fr(c); return p && zn(p) } else { if (c.externalModuleIndicator) return Oe; if (a) return zn(Ye) } } function qYe(n) { let a = Ku(n, !1, !1); if (Ia(a)) { let c = ip(a); if (c.thisParameter) return RB(c.thisParameter) } if (Yr(a.parent)) { let c = fr(a.parent); return Ca(a) ? zn(c) : gs(c).thisType } } function XYe(n) { if (n.kind === 215 && ar(n.parent) && ic(n.parent) === 3) return n.parent.left.expression.expression; if (n.kind === 171 && n.parent.kind === 207 && ar(n.parent.parent) && ic(n.parent.parent) === 6) return n.parent.parent.left.expression; if (n.kind === 215 && n.parent.kind === 299 && n.parent.parent.kind === 207 && ar(n.parent.parent.parent) && ic(n.parent.parent.parent) === 6) return n.parent.parent.parent.left.expression; if (n.kind === 215 && yl(n.parent) && Re(n.parent.name) && (n.parent.name.escapedText === "value" || n.parent.name.escapedText === "get" || n.parent.name.escapedText === "set") && rs(n.parent.parent) && Pa(n.parent.parent.parent) && n.parent.parent.parent.arguments[2] === n.parent.parent && ic(n.parent.parent.parent) === 9) return n.parent.parent.parent.arguments[0].expression; if (Nc(n) && Re(n.name) && (n.name.escapedText === "value" || n.name.escapedText === "get" || n.name.escapedText === "set") && rs(n.parent) && Pa(n.parent.parent) && n.parent.parent.arguments[2] === n.parent && ic(n.parent.parent) === 9) return n.parent.parent.arguments[0].expression } function YYe(n) { let a = Vy(n); if (a && a.kind === 320) { let u = a; if (u.parameters.length > 0 && u.parameters[0].name && u.parameters[0].name.escapedText === "this") return $r(u.parameters[0].type) } let c = e6(n); if (c && c.typeExpression) return $r(c.typeExpression) } function iCe(n, a) { return !!jn(n, c => Ds(c) ? "quit" : c.kind === 166 && c.parent === a) } function Ire(n) { let a = n.parent.kind === 210 && n.parent.expression === n, c = Ww(n, !0), u = c, p = !1, h = !1; if (!a) { for (; u && u.kind === 216;)Mr(u, 512) && (h = !0), u = Ww(u, !0), p = R < 2; u && Mr(u, 512) && (h = !0) } let T = 0; if (!u || !J(u)) { let de = jn(n, Ae => Ae === u ? "quit" : Ae.kind === 164); return de && de.kind === 164 ? Fe(n, _.super_cannot_be_referenced_in_a_computed_property_name) : a ? Fe(n, _.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors) : !u || !u.parent || !(Yr(u.parent) || u.parent.kind === 207) ? Fe(n, _.super_can_only_be_referenced_in_members_of_derived_classes_or_object_literal_expressions) : Fe(n, _.super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class), ve } if (!a && c.kind === 173 && rCe(n, u, _.super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class), Ca(u) || a ? (T = 32, !a && R >= 2 && R <= 8 && (Na(u) || oc(u)) && Jse(n.parent, de => { (!Li(de) || kd(de)) && (Rr(de).flags |= 8388608) })) : T = 16, Rr(n).flags |= T, u.kind === 171 && h && (Pu(n.parent) && Um(n.parent) ? Rr(u).flags |= 256 : Rr(u).flags |= 128), p && Are(n.parent, u), u.parent.kind === 207) return R < 2 ? (Fe(n, _.super_is_only_allowed_in_members_of_object_literal_expressions_when_option_target_is_ES2015_or_higher), ve) : Se; let k = u.parent; if (!P0(k)) return Fe(n, _.super_can_only_be_referenced_in_a_derived_class), ve; let O = gs(fr(k)), H = O && _o(O)[0]; if (!H) return ve; if (u.kind === 173 && iCe(n, u)) return Fe(n, _.super_cannot_be_referenced_in_constructor_arguments), ve; return T === 32 ? Wr(O) : uf(H, O.thisType); function J(de) { return a ? de.kind === 173 : Yr(de.parent) || de.parent.kind === 207 ? Ca(de) ? de.kind === 171 || de.kind === 170 || de.kind === 174 || de.kind === 175 || de.kind === 169 || de.kind === 172 : de.kind === 171 || de.kind === 170 || de.kind === 174 || de.kind === 175 || de.kind === 169 || de.kind === 168 || de.kind === 173 : !1 } } function $Ye(n) { return (n.kind === 171 || n.kind === 174 || n.kind === 175) && n.parent.kind === 207 ? n.parent : n.kind === 215 && n.parent.kind === 299 ? n.parent.parent : void 0 } function aCe(n) { return Ur(n) & 4 && n.target === ye ? Ko(n)[0] : void 0 } function QYe(n) { return Ls(n, a => a.flags & 2097152 ? mn(a.types, aCe) : aCe(a)) } function oCe(n) { if (n.kind === 216) return; if (fB(n)) { let c = bD(n); if (c) { let u = c.thisParameter; if (u) return zn(u) } } let a = Yn(n); if (X || a) { let c = $Ye(n); if (c) { let p = o0(c, void 0), h = c, T = p; for (; T;) { let k = QYe(T); if (k) return Oi(k, sre(M1(c))); if (h.parent.kind !== 299) break; h = h.parent.parent, T = o0(h, void 0) } return Sd(p ? yg(p) : Ic(c)) } let u = qy(n.parent); if (u.kind === 223 && u.operatorToken.kind === 63) { let p = u.left; if (Us(p)) { let { expression: h } = p; if (a && Re(h)) { let T = Gn(u); if (T.commonJsModuleIndicator && Qf(h) === T.symbol) return } return Sd(Ic(h)) } } } } function sCe(n) { let a = n.parent; if (!fB(a)) return; let c = ET(a); if (c && c.arguments) { let p = rie(c), h = a.parameters.indexOf(n); if (n.dotDotDotToken) return tie(p, h, p.length, Se, void 0, 0); let T = Rr(c), k = T.resolvedSignature; T.resolvedSignature = As; let O = h < p.length ? i0(Yi(p[h])) : n.initializer ? void 0 : je; return T.resolvedSignature = k, O } let u = bD(a); if (u) { let p = a.parameters.indexOf(n) - (F0(a) ? 1 : 0); return n.dotDotDotToken && Os(a.parameters) === n ? SD(u, p) : tT(u, p) } } function Lre(n, a) { let c = Cl(n) || (Yn(n) ? T4(n) : void 0); if (c) return $r(c); switch (n.kind) { case 166: return sCe(n); case 205: return ZYe(n, a); case 169: if (Ca(n)) return e$e(n, a) } } function ZYe(n, a) { let c = n.parent.parent, u = n.propertyName || n.name, p = Lre(c, a) || c.kind !== 205 && c.initializer && ID(c, n.dotDotDotToken ? 64 : 0); if (!p || La(u) || Vw(u)) return; if (c.name.kind === 204) { let T = DA(n.parent.elements, n); return T < 0 ? void 0 : fCe(p, T) } let h = pg(u); if (fh(h)) { let T = Np(h); return Vc(p, T) } } function e$e(n, a) { let c = ot(n.parent) && Ru(n.parent, a); if (c) return eT(c, fr(n).escapedName) } function t$e(n, a) { let c = n.parent; if (Jy(c) && n === c.initializer) { let u = Lre(c, a); if (u) return u; if (!(a & 8) && La(c.name) && c.name.elements.length > 0) return oo(c.name, !0, !1) } } function n$e(n, a) { let c = Xd(n); if (c) { let u = Dre(c, a); if (u) { let p = pl(c); if (p & 1) { let h = (p & 2) !== 0; u.flags & 1048576 && (u = jc(u, k => !!c0(1, k, h))); let T = c0(1, u, (p & 2) !== 0); if (!T) return; u = T } if (p & 2) { let h = Ls(u, bg); return h && Gr([h, bIe(h)]) } return u } } } function r$e(n, a) { let c = Ru(n, a); if (c) { let u = bg(c); return u && Gr([u, bIe(u)]) } } function i$e(n, a) { let c = Xd(n); if (c) { let u = pl(c), p = Dre(c, a); if (p) { let h = (u & 2) !== 0; return !n.asteriskToken && p.flags & 1048576 && (p = jc(p, T => !!c0(1, T, h))), n.asteriskToken ? p : c0(0, p, h) } } } function kre(n) { let a = !1; for (; n.parent && !Ia(n.parent);) { if (ha(n.parent) && (a || n.parent.initializer === n)) return !0; Wo(n.parent) && n.parent.initializer === n && (a = !0), n = n.parent } return !1 } function cCe(n, a) { let c = !!(pl(a) & 2), u = Dre(a, void 0); if (u) return c0(n, u, c) || void 0 } function Dre(n, a) { let c = Hx(n); if (c) return c; let u = Nre(n); if (u && !rne(u)) return qo(u); let p = ET(n); if (p) return Ru(p, a) } function lCe(n, a) { let u = rie(n).indexOf(a); return u === -1 ? void 0 : wre(n, u) } function wre(n, a) { if (Dd(n)) return a === 0 ? ae : a === 1 ? nAe(!1) : Se; let c = Rr(n).resolvedSignature === yc ? yc : MC(n); if (Au(n) && a === 0) return VB(c, n); let u = c.parameters.length - 1; return Xl(c) && a >= u ? od(zn(c.parameters[u]), op(a - u), 256) : P_(c, a) } function a$e(n) { let a = _ie(n); return a ? HE(a) : void 0 } function o$e(n, a) { if (n.parent.kind === 212) return lCe(n.parent, a) } function s$e(n, a) { let c = n.parent, { left: u, operatorToken: p, right: h } = c; switch (p.kind) { case 63: case 76: case 75: case 77: return n === h ? l$e(c) : void 0; case 56: case 60: let T = Ru(c, a); return n === h && (T && T.pattern || !T && !dce(c)) ? au(u) : T; case 55: case 27: return n === h ? Ru(c, a) : void 0; default: return } } function c$e(n) { if ($p(n) && n.symbol) return n.symbol; if (Re(n)) return Qf(n); if (br(n)) { let c = au(n.expression); return pi(n.name) ? a(c, n.name) : ja(c, n.name.escapedText) } if (Vs(n)) { let c = Ic(n.argumentExpression); if (!fh(c)) return; let u = au(n.expression); return ja(u, Np(c)) } return; function a(c, u) { let p = JB(u.escapedText, u); return p && zre(c, p) } } function l$e(n) { var a, c; let u = ic(n); switch (u) { case 0: case 4: let p = c$e(n.left), h = p && p.valueDeclaration; if (h && (Na(h) || $d(h))) { let O = Cl(h); return O && Oi($r(O), Ai(p).mapper) || (Na(h) ? h.initializer && au(n.left) : void 0) } return u === 0 ? au(n.left) : uCe(n); case 5: if (GB(n, u)) return uCe(n); if (!$p(n.left) || !n.left.symbol) return au(n.left); { let O = n.left.symbol.valueDeclaration; if (!O) return; let H = Ga(n.left, Us), J = Cl(O); if (J) return $r(J); if (Re(H.expression)) { let de = H.expression, Ae = zs(de, de.escapedText, 111551, void 0, de.escapedText, !0); if (Ae) { let xe = Ae.valueDeclaration && Cl(Ae.valueDeclaration); if (xe) { let tt = wh(H); if (tt !== void 0) return eT($r(xe), tt) } return } } return Yn(O) ? void 0 : au(n.left) } case 1: case 6: case 3: case 2: let T; u !== 2 && (T = $p(n.left) ? (a = n.left.symbol) == null ? void 0 : a.valueDeclaration : void 0), T || (T = (c = n.symbol) == null ? void 0 : c.valueDeclaration); let k = T && Cl(T); return k ? $r(k) : void 0; case 7: case 8: case 9: return L.fail("Does not apply"); default: return L.assertNever(u) } } function GB(n, a = ic(n)) { if (a === 4) return !0; if (!Yn(n) || a !== 5 || !Re(n.left.expression)) return !1; let c = n.left.expression.escapedText, u = zs(n.left, c, 111551, void 0, void 0, !0, !0); return N6(u?.valueDeclaration) } function uCe(n) { if (!n.symbol) return au(n.left); if (n.symbol.valueDeclaration) { let p = Cl(n.symbol.valueDeclaration); if (p) { let h = $r(p); if (h) return h } } let a = Ga(n.left, Us); if (!s_(Ku(a.expression, !1, !1))) return; let c = kM(a.expression), u = wh(a); return u !== void 0 && eT(c, u) || void 0 } function u$e(n) { return !!(ac(n) & 262144 && !n.links.type && Sm(n, 0) >= 0) } function eT(n, a, c) { return Ls(n, u => { var p; if (df(u) && !u.declaration.nameType) { let h = rp(u), T = bu(h) || h, k = c || ff(Gi(a)); if (to(k, T)) return nB(u, k) } else if (u.flags & 3670016) { let h = ja(u, a); if (h) return u$e(h) ? void 0 : zn(h); if (po(u) && Wm(a) && +a >= 0) { let T = LC(u, u.target.fixedLength, 0, !1, !0); if (T) return T } return (p = $te(Qte(u), c || ff(Gi(a)))) == null ? void 0 : p.type } }, !0) } function dCe(n, a) { if (L.assert(s_(n)), !(n.flags & 33554432)) return Rre(n, a) } function Rre(n, a) { let c = n.parent, u = yl(n) && Lre(n, a); if (u) return u; let p = o0(c, a); if (p) { if (Ux(n)) { let h = fr(n); return eT(p, h.escapedName, Ai(h).nameType) } if (n.name) { let h = pg(n.name); return Ls(p, T => { var k; return (k = $te(Qte(T), h)) == null ? void 0 : k.type }, !0) } } } function fCe(n, a) { return n && (a >= 0 && eT(n, "" + a) || Ls(n, c => po(c) ? LC(c, 0, 0, !1, !0) : Rie(1, c, Oe, void 0, !1), !0)) } function d$e(n, a) { let c = n.parent; return n === c.whenTrue || n === c.whenFalse ? Ru(c, a) : void 0 } function f$e(n, a, c) { let u = o0(n.openingElement.tagName, c), p = HB(tA(n)); if (!(u && !Zo(u) && p && p !== "")) return; let h = bR(n.children), T = h.indexOf(a), k = eT(u, p); return k && (h.length === 1 ? k : Ls(k, O => Kv(O) ? od(O, op(T)) : O, !0)) } function _$e(n, a) { let c = n.parent; return d6(c) ? Ru(n, a) : Hg(c) ? f$e(c, n, a) : void 0 } function _Ce(n, a) { if (Sp(n)) { let c = o0(n.parent, a); return !c || Zo(c) ? void 0 : eT(c, n.name.escapedText) } else return Ru(n.parent, a) } function DM(n) { switch (n.kind) { case 10: case 8: case 9: case 14: case 110: case 95: case 104: case 79: case 155: return !0; case 208: case 214: return DM(n.expression); case 291: return !n.expression || DM(n.expression) }return !1 } function p$e(n, a) { return sYe(a, n) || Wne(a, Qi(on(Pr(n.properties, c => !!c.symbol && c.kind === 299 && DM(c.initializer) && mD(a, c.symbol.escapedName)), c => [() => KM(c.initializer), c.symbol.escapedName]), on(Pr(Jo(a), c => { var u; return !!(c.flags & 16777216) && !!((u = n?.symbol) != null && u.members) && !n.symbol.members.has(c.escapedName) && mD(a, c.escapedName) }), c => [() => Oe, c.escapedName])), to, a) } function m$e(n, a) { return Wne(a, Qi(on(Pr(n.properties, c => !!c.symbol && c.kind === 288 && mD(a, c.symbol.escapedName) && (!c.initializer || DM(c.initializer))), c => [c.initializer ? () => KM(c.initializer) : () => pe, c.symbol.escapedName]), on(Pr(Jo(a), c => { var u; return !!(c.flags & 16777216) && !!((u = n?.symbol) != null && u.members) && !n.symbol.members.has(c.escapedName) && mD(a, c.escapedName) }), c => [() => Oe, c.escapedName])), to, a) } function o0(n, a) { let c = s_(n) ? dCe(n, a) : Ru(n, a), u = BB(c, n, a); if (u && !(a && a & 2 && u.flags & 8650752)) { let p = Ls(u, Eu, !0); return p.flags & 1048576 && rs(n) ? p$e(n, p) : p.flags & 1048576 && K0(n) ? m$e(n, p) : p } } function BB(n, a, c) { if (n && Js(n, 465829888)) { let u = M1(a); if (u && c & 1 && vt(u.inferences, qZe)) return UB(n, u.nonFixingMapper); if (u?.returnMapper) { let p = UB(n, u.returnMapper); return p.flags & 1048576 && Qb(p.types, oe) && Qb(p.types, z) ? jc(p, h => h !== oe && h !== z) : p } } return n } function UB(n, a) { return n.flags & 465829888 ? Oi(n, a) : n.flags & 1048576 ? Gr(on(n.types, c => UB(c, a)), 0) : n.flags & 2097152 ? so(on(n.types, c => UB(c, a))) : n } function Ru(n, a) { var c, u; if (n.flags & 33554432) return; let p = mCe(n, !a); if (p >= 0) return Mc[p]; let { parent: h } = n; switch (h.kind) { case 257: case 166: case 169: case 168: case 205: return t$e(n, a); case 216: case 250: return n$e(n, a); case 226: return i$e(h, a); case 220: return r$e(h, a); case 210: case 211: return lCe(h, n); case 167: return a$e(h); case 213: case 231: return Ch(h.type) ? Ru(h, a) : $r(h.type); case 223: return s$e(n, a); case 299: case 300: return Rre(h, a); case 301: return Ru(h.parent, a); case 206: { let T = h, k = o0(T, a), O = (u = (c = Rr(T)).firstSpreadIndex) != null ? u : c.firstSpreadIndex = Yc(T.elements, Km), H = DA(T.elements, n); return fCe(k, O < 0 || H < O ? H : -1) } case 224: return d$e(n, a); case 236: return L.assert(h.parent.kind === 225), o$e(h.parent, n); case 214: { if (Yn(h)) { if (zW(h)) return $r(JW(h)); let T = x0(h); if (T && !Ch(T.typeExpression.type)) return $r(T.typeExpression.type) } return Ru(h, a) } case 232: return Ru(h, a); case 235: return $r(h.type); case 274: return ad(h); case 291: return _$e(h, a); case 288: case 290: return _Ce(h, a); case 283: case 282: return y$e(h, a) } } function pCe(n) { wM(n, Ru(n, void 0), !0) } function wM(n, a, c) { Is[Hh] = n, Mc[Hh] = a, mm[Hh] = c, Hh++ } function vD() { Hh-- } function mCe(n, a) { for (let c = Hh - 1; c >= 0; c--)if (n === Is[c] && (a || !mm[c])) return c; return -1 } function h$e(n, a) { T_[mv] = n, Cb[mv] = a, mv++ } function g$e() { mv-- } function M1(n) { for (let a = mv - 1; a >= 0; a--)if (AT(n, T_[a])) return Cb[a] } function y$e(n, a) { if (Xm(n) && a !== 4) { let c = mCe(n.parent, !a); if (c >= 0) return Mc[c] } return wre(n, 0) } function VB(n, a) { return $Ce(a) !== 0 ? v$e(n, a) : T$e(n, a) } function v$e(n, a) { let c = die(n, ue); c = hCe(a, tA(a), c); let u = s0(Qd.IntrinsicAttributes, a); return Ro(u) || (c = QP(u, c)), c } function b$e(n, a) { if (n.compositeSignatures) { let u = []; for (let p of n.compositeSignatures) { let h = qo(p); if (Zo(h)) return h; let T = Vc(h, a); if (!T) return; u.push(T) } return so(u) } let c = qo(n); return Zo(c) ? c : Vc(c, a) } function E$e(n) { if (OC(n.tagName)) { let c = ACe(n), u = ZB(n, c); return HE(u) } let a = Ic(n.tagName); if (a.flags & 128) { let c = xCe(a, n); if (!c) return ve; let u = ZB(n, c); return HE(u) } return a } function hCe(n, a, c) { let u = V$e(a); if (u) { let p = gs(u), h = E$e(n); if (u.flags & 524288) { let T = Ai(u).typeParameters; if (Fn(T) >= 2) { let k = Sy([h, c], T, 2, Yn(n)); return Jx(u, k) } } if (Fn(p.typeParameters) >= 2) { let T = Sy([h, c], p.typeParameters, 2, Yn(n)); return _g(p, T) } } return c } function T$e(n, a) { let c = tA(a), u = j$e(c), p = u === void 0 ? die(n, ue) : u === "" ? qo(n) : b$e(n, u); if (!p) return u && Fn(a.attributes.properties) && Fe(a, _.JSX_element_class_does_not_support_attributes_because_it_does_not_have_a_0_property, Gi(u)), ue; if (p = hCe(a, c, p), Zo(p)) return p; { let h = p, T = s0(Qd.IntrinsicClassAttributes, a); if (!Ro(T)) { let O = yy(T.symbol), H = qo(n), J; if (O) { let de = Sy([H], O, Mp(O), Yn(a)); J = Oi(T, Wu(O, de)) } else J = T; h = QP(J, h) } let k = s0(Qd.IntrinsicAttributes, a); return Ro(k) || (h = QP(k, h)), h } } function S$e(n) { return Uf(Y, "noImplicitAny") ? ou(n, (a, c) => a === c || !a ? a : Sxe(a.typeParameters, c.typeParameters) ? C$e(a, c) : void 0) : void 0 } function x$e(n, a, c) { if (!n || !a) return n || a; let u = Gr([zn(n), Oi(zn(a), c)]); return qE(n, u) } function A$e(n, a, c) { let u = xd(n), p = xd(a), h = u >= p ? n : a, T = h === n ? a : n, k = h === n ? u : p, O = jp(n) || jp(a), H = O && !jp(h), J = new Array(k + (H ? 1 : 0)); for (let de = 0; de < k; de++) { let Ae = tT(h, de); h === a && (Ae = Oi(Ae, c)); let xe = tT(T, de) || ue; T === a && (xe = Oi(xe, c)); let tt = Gr([Ae, xe]), It = O && !H && de === k - 1, Tn = de >= Vp(h) && de >= Vp(T), un = de >= u ? void 0 : FC(n, de), Nn = de >= p ? void 0 : FC(a, de), en = un === Nn ? un : un ? Nn ? void 0 : un : Nn, cn = wo(1 | (Tn && !It ? 16777216 : 0), en || `arg${de}`); cn.links.type = It ? nu(tt) : tt, J[de] = cn } if (H) { let de = wo(1, "args"); de.links.type = nu(P_(T, k)), T === a && (de.links.type = Oi(de.links.type, c)), J[k] = de } return J } function C$e(n, a) { let c = n.typeParameters || a.typeParameters, u; n.typeParameters && a.typeParameters && (u = Wu(a.typeParameters, n.typeParameters)); let p = n.declaration, h = A$e(n, a, u), T = x$e(n.thisParameter, a.thisParameter, u), k = Math.max(n.minArgumentCount, a.minArgumentCount), O = Am(p, c, T, h, void 0, void 0, k, (n.flags | a.flags) & 39); return O.compositeKind = 2097152, O.compositeSignatures = Qi(n.compositeKind === 2097152 && n.compositeSignatures || [n], [a]), u && (O.mapper = n.compositeKind === 2097152 && n.mapper && n.compositeSignatures ? Jv(n.mapper, u) : u), O } function Ore(n, a) { let c = xa(n, 0), u = Pr(c, p => !I$e(p, a)); return u.length === 1 ? u[0] : S$e(u) } function I$e(n, a) { let c = 0; for (; c < a.parameters.length; c++) { let u = a.parameters[c]; if (u.initializer || u.questionToken || u.dotDotDotToken || JR(u)) break } return a.parameters.length && G0(a.parameters[0]) && c--, !jp(n) && xd(n) < c } function Nre(n) { return a2(n) || s_(n) ? bD(n) : void 0 } function bD(n) { L.assert(n.kind !== 171 || s_(n)); let a = Zk(n); if (a) return a; let c = o0(n, 1); if (!c) return; if (!(c.flags & 1048576)) return Ore(c, n); let u, p = c.types; for (let h of p) { let T = Ore(h, n); if (T) if (!u) u = [T]; else if (vM(u[0], T, !1, !0, !0, sD)) u.push(T); else return } if (u) return u.length === 1 ? u[0] : Exe(u[0], u) } function L$e(n, a) { R < 2 && Hc(n, Y.downlevelIteration ? 1536 : 1024); let c = Yi(n.expression, a); return wy(33, c, Oe, n.expression) } function k$e(n) { return n.isSpread ? od(n.type, rt) : n.type } function RC(n) { return n.kind === 205 && !!n.initializer || n.kind === 223 && n.operatorToken.kind === 63 } function gCe(n, a, c) { let u = n.elements, p = u.length, h = [], T = []; pCe(n); let k = Um(n), O = GC(n), H = o0(n, void 0), J = !!H && yh(H, IC), de = !1; for (let Ae = 0; Ae < p; Ae++) { let xe = u[Ae]; if (xe.kind === 227) { R < 2 && Hc(xe, Y.downlevelIteration ? 1536 : 1024); let tt = Yi(xe.expression, a, c); if (Kv(tt)) h.push(tt), T.push(8); else if (k) { let It = fg(tt, rt) || Rie(65, tt, Oe, void 0, !1) || ue; h.push(It), T.push(4) } else h.push(wy(33, tt, Oe, xe.expression)), T.push(4) } else if (Pe && xe.kind === 229) de = !0, h.push(kt), T.push(2); else { let tt = BC(xe, a, c); if (h.push(ao(tt, !0, de)), T.push(de ? 2 : 1), J && a && a & 2 && !(a & 4) && $f(xe)) { let It = M1(n); L.assert(It), v2e(It, xe, tt) } } } return vD(), k ? ap(h, T) : yCe(c || O || J ? ap(h, T, O) : nu(h.length ? Gr(Tl(h, (Ae, xe) => T[xe] & 8 ? Ay(Ae, rt) || Se : Ae), 2) : U ? Vt : je, O)) } function yCe(n) { if (!(Ur(n) & 4)) return n; let a = n.literalType; return a || (a = n.literalType = Wxe(n), a.objectFlags |= 147456), a } function D$e(n) { switch (n.kind) { case 164: return w$e(n); case 79: return Wm(n.escapedText); case 8: case 10: return Wm(n.text); default: return !1 } } function w$e(n) { return ul(vg(n), 296) } function vg(n) { let a = Rr(n.expression); if (!a.resolvedType) { if ((Rd(n.parent.parent) || Yr(n.parent.parent) || ku(n.parent.parent)) && ar(n.expression) && n.expression.operatorToken.kind === 101 && n.parent.kind !== 174 && n.parent.kind !== 175) return a.resolvedType = ve; if (a.resolvedType = Yi(n.expression), Na(n.parent) && !zc(n.parent) && _u(n.parent.parent)) { let c = tm(n.parent.parent), u = xre(c); u && (Rr(u).flags |= 4096, Rr(n).flags |= 32768, Rr(n.parent.parent).flags |= 32768) } (a.resolvedType.flags & 98304 || !ul(a.resolvedType, 402665900) && !to(a.resolvedType, Kr)) && Fe(n, _.A_computed_property_name_must_be_of_type_string_number_symbol_or_any) } return a.resolvedType } function R$e(n) { var a; let c = (a = n.declarations) == null ? void 0 : a[0]; return Wm(n.escapedName) || c && zl(c) && D$e(c.name) } function vCe(n) { var a; let c = (a = n.declarations) == null ? void 0 : a[0]; return gR(n) || c && zl(c) && ts(c.name) && ul(vg(c.name), 4096) } function Pre(n, a, c, u) { let p = []; for (let T = a; T < c.length; T++) { let k = c[T]; (u === ae && !vCe(k) || u === rt && R$e(k) || u === j && vCe(k)) && p.push(zn(c[T])) } let h = p.length ? Gr(p, 2) : Oe; return Fp(u, h, GC(n)) } function Mre(n) { L.assert((n.flags & 2097152) !== 0, "Should only get Alias here."); let a = Ai(n); if (!a.immediateTarget) { let c = Uu(n); if (!c) return L.fail(); a.immediateTarget = L_(c, !0) } return a.immediateTarget } function O$e(n, a) { var c; let u = Um(n); Mrt(n, u); let p = U ? Ua() : void 0, h = Ua(), T = [], k = Ki; pCe(n); let O = o0(n, void 0), H = O && O.pattern && (O.pattern.kind === 203 || O.pattern.kind === 207), J = GC(n), de = J ? 8 : 0, Ae = Yn(n) && !B6(n), xe = Ij(n), tt = !O && Ae && !xe, It = ke, Tn = !1, un = !1, Nn = !1, en = !1; for (let Jt of n.properties) Jt.name && ts(Jt.name) && vg(Jt.name); let cn = 0; for (let Jt of n.properties) { let Cn = fr(Jt), Rn = Jt.name && Jt.name.kind === 164 ? vg(Jt.name) : void 0; if (Jt.kind === 299 || Jt.kind === 300 || s_(Jt)) { let Br = Jt.kind === 299 ? NIe(Jt, a) : Jt.kind === 300 ? BC(!u && Jt.objectAssignmentInitializer ? Jt.objectAssignmentInitializer : Jt.name, a) : PIe(Jt, a); if (Ae) { let wa = di(Jt); wa ? (wu(Br, wa, Jt), Br = wa) : xe && xe.typeExpression && wu(Br, $r(xe.typeExpression), Jt) } It |= Ur(Br) & 458752; let Hr = Rn && fh(Rn) ? Rn : void 0, qi = Hr ? wo(4 | Cn.flags, Np(Hr), de | 4096) : wo(4 | Cn.flags, Cn.escapedName, de); if (Hr && (qi.links.nameType = Hr), u) (Jt.kind === 299 && RC(Jt.initializer) || Jt.kind === 300 && Jt.objectAssignmentInitializer) && (qi.flags |= 16777216); else if (H && !(Ur(O) & 512)) { let wa = ja(O, Cn.escapedName); wa ? qi.flags |= wa.flags & 16777216 : !Y.suppressExcessPropertyErrors && !Cm(O, ae) && Fe(Jt.name, _.Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1, E(Cn), Ee(O)) } if (qi.declarations = Cn.declarations, qi.parent = Cn.parent, Cn.valueDeclaration && (qi.valueDeclaration = Cn.valueDeclaration), qi.links.type = Br, qi.links.target = Cn, Cn = qi, p?.set(qi.escapedName, qi), O && a && a & 2 && !(a & 4) && (Jt.kind === 299 || Jt.kind === 171) && $f(Jt)) { let wa = M1(n); L.assert(wa); let Xc = Jt.kind === 299 ? Jt.initializer : Jt; v2e(wa, Xc, Br) } } else if (Jt.kind === 301) { R < 2 && Hc(Jt, 2), T.length > 0 && (k = e0(k, rr(), n.symbol, It, J), T = [], h = Ua(), un = !1, Nn = !1, en = !1); let Br = O_(Yi(Jt.expression)); if (RM(Br)) { let Hr = kne(Br, J); if (p && ECe(Hr, p, Jt), cn = T.length, Ro(k)) continue; k = e0(k, Hr, n.symbol, It, J) } else Fe(Jt, _.Spread_types_may_only_be_created_from_object_types), k = ve; continue } else L.assert(Jt.kind === 174 || Jt.kind === 175), zC(Jt); Rn && !(Rn.flags & 8576) ? to(Rn, Kr) && (to(Rn, rt) ? Nn = !0 : to(Rn, j) ? en = !0 : un = !0, u && (Tn = !0)) : h.set(Cn.escapedName, Cn), T.push(Cn) } if (vD(), H) { let Jt = jn(O.pattern.parent, Rn => Rn.kind === 257 || Rn.kind === 223 || Rn.kind === 166); if (jn(n, Rn => Rn === Jt || Rn.kind === 301).kind !== 301) for (let Rn of Jo(O)) !h.get(Rn.escapedName) && !ja(k, Rn.escapedName) && (Rn.flags & 16777216 || Fe(Rn.valueDeclaration || ((c = zr(Rn, Zp)) == null ? void 0 : c.links.bindingElement), _.Initializer_provides_no_value_for_this_binding_element_and_the_binding_element_has_no_default_value), h.set(Rn.escapedName, Rn), T.push(Rn)) } if (Ro(k)) return ve; if (k !== Ki) return T.length > 0 && (k = e0(k, rr(), n.symbol, It, J), T = [], h = Ua(), un = !1, Nn = !1), Ls(k, Jt => Jt === Ki ? rr() : Jt); return rr(); function rr() { let Jt = []; un && Jt.push(Pre(n, cn, T, ae)), Nn && Jt.push(Pre(n, cn, T, rt)), en && Jt.push(Pre(n, cn, T, j)); let Cn = ls(n.symbol, h, Je, Je, Jt); return Cn.objectFlags |= It | 128 | 131072, tt && (Cn.objectFlags |= 4096), Tn && (Cn.objectFlags |= 512), u && (Cn.pattern = n), Cn } } function RM(n) { let a = m2e(Ls(n, Ty)); return !!(a.flags & 126615553 || a.flags & 3145728 && Ji(a.types, RM)) } function N$e(n) { Ure(n) } function P$e(n, a) { return zC(n), OM(n) || Se } function M$e(n) { Ure(n.openingElement), OC(n.closingElement.tagName) ? Gre(n.closingElement) : Yi(n.closingElement.tagName), jB(n) } function F$e(n, a) { return zC(n), OM(n) || Se } function G$e(n) { Ure(n.openingFragment); let a = Gn(n); return AW(Y) && (Y.jsxFactory || a.pragmas.has("jsx")) && !Y.jsxFragmentFactory && !a.pragmas.has("jsxfrag") && Fe(n, Y.jsxFactory ? _.The_jsxFragmentFactory_compiler_option_must_be_provided_to_use_JSX_fragments_with_the_jsxFactory_compiler_option : _.An_jsxFrag_pragma_is_required_when_using_an_jsx_pragma_with_JSX_fragments), jB(n), OM(n) || Se } function Fre(n) { return jl(n, "-") } function OC(n) { return n.kind === 79 && GI(n.escapedText) } function bCe(n, a) { return n.initializer ? BC(n.initializer, a) : pe } function B$e(n, a) { let c = n.attributes, u = Ru(c, 0), p = U ? Ua() : void 0, h = Ua(), T = kc, k = !1, O, H = !1, J = 2048, de = HB(tA(n)); for (let tt of c.properties) { let It = tt.symbol; if (Sp(tt)) { let Tn = bCe(tt, a); J |= Ur(Tn) & 458752; let un = wo(4 | It.flags, It.escapedName); if (un.declarations = It.declarations, un.parent = It.parent, It.valueDeclaration && (un.valueDeclaration = It.valueDeclaration), un.links.type = Tn, un.links.target = It, h.set(un.escapedName, un), p?.set(un.escapedName, un), tt.name.escapedText === de && (H = !0), u) { let Nn = ja(u, It.escapedName); Nn && Nn.declarations && Sv(Nn) && Xh(tt.name, Nn.declarations, tt.name.escapedText) } } else { L.assert(tt.kind === 290), h.size > 0 && (T = e0(T, xe(), c.symbol, J, !1), h = Ua()); let Tn = O_(Ic(tt.expression, a)); Zo(Tn) && (k = !0), RM(Tn) ? (T = e0(T, Tn, c.symbol, J, !1), p && ECe(Tn, p, tt)) : (Fe(tt.expression, _.Spread_types_may_only_be_created_from_object_types), O = O ? so([O, Tn]) : Tn) } } k || h.size > 0 && (T = e0(T, xe(), c.symbol, J, !1)); let Ae = n.parent.kind === 281 ? n.parent : void 0; if (Ae && Ae.openingElement === n && Ae.children.length > 0) { let tt = jB(Ae, a); if (!k && de && de !== "") { H && Fe(c, _._0_are_specified_twice_The_attribute_named_0_will_be_overwritten, Gi(de)); let It = o0(n.attributes, void 0), Tn = It && eT(It, de), un = wo(4, de); un.links.type = tt.length === 1 ? tt[0] : Tn && yh(Tn, IC) ? ap(tt) : nu(Gr(tt)), un.valueDeclaration = D.createPropertySignature(void 0, Gi(de), void 0, void 0), go(un.valueDeclaration, c), un.valueDeclaration.symbol = un; let Nn = Ua(); Nn.set(de, un), T = e0(T, ls(c.symbol, Nn, Je, Je, Je), c.symbol, J, !1) } } if (k) return Se; if (O && T !== kc) return so([O, T]); return O || (T === kc ? xe() : T); function xe() { J |= ke; let tt = ls(c.symbol, h, Je, Je, Je); return tt.objectFlags |= J | 128 | 131072, tt } } function jB(n, a) { let c = []; for (let u of n.children) if (u.kind === 11) u.containsOnlyTriviaWhiteSpaces || c.push(ae); else { if (u.kind === 291 && !u.expression) continue; c.push(BC(u, a)) } return c } function ECe(n, a, c) { for (let u of Jo(n)) if (!(u.flags & 16777216)) { let p = a.get(u.escapedName); if (p) { let h = Fe(p.valueDeclaration, _._0_is_specified_more_than_once_so_this_usage_will_be_overwritten, Gi(p.escapedName)); Ao(h, hr(c, _.This_spread_always_overwrites_this_property)) } } } function U$e(n, a) { return B$e(n.parent, a) } function s0(n, a) { let c = tA(a), u = c && Gd(c), p = u && yd(u, n, 788968); return p ? gs(p) : ve } function Gre(n) { let a = Rr(n); if (!a.resolvedSymbol) { let c = s0(Qd.IntrinsicElements, n); if (Ro(c)) return ge && Fe(n, _.JSX_element_implicitly_has_type_any_because_no_interface_JSX_0_exists, Gi(Qd.IntrinsicElements)), a.resolvedSymbol = Ht; { if (!Re(n.tagName)) return L.fail(); let u = ja(c, n.tagName.escapedText); return u ? (a.jsxFlags |= 1, a.resolvedSymbol = u) : fg(c, ae) ? (a.jsxFlags |= 2, a.resolvedSymbol = c.symbol) : (Fe(n, _.Property_0_does_not_exist_on_type_1, vr(n.tagName), "JSX." + Qd.IntrinsicElements), a.resolvedSymbol = Ht) } } return a.resolvedSymbol } function Bre(n) { let a = n && Gn(n), c = a && Rr(a); if (c && c.jsxImplicitImportContainer === !1) return; if (c && c.jsxImplicitImportContainer) return c.jsxImplicitImportContainer; let u = p4(_4(Y, a), Y); if (!u) return; let h = $s(Y) === 1 ? _.Cannot_find_module_0_Did_you_mean_to_set_the_moduleResolution_option_to_nodenext_or_to_add_aliases_to_the_paths_option : _.Cannot_find_module_0_or_its_corresponding_type_declarations, T = qc(n, u, h, n), k = T && T !== Ht ? No(Ac(T)) : void 0; return c && (c.jsxImplicitImportContainer = k || !1), k } function tA(n) { let a = n && Rr(n); if (a && a.jsxNamespace) return a.jsxNamespace; if (!a || a.jsxNamespace !== !1) { let u = Bre(n); if (!u || u === Ht) { let p = Rb(n); u = zs(n, p, 1920, void 0, p, !1) } if (u) { let p = Ac(yd(Gd(Ac(u)), Qd.JSX, 1920)); if (p && p !== Ht) return a && (a.jsxNamespace = p), p } a && (a.jsxNamespace = !1) } let c = Ac(nD(Qd.JSX, 1920, void 0)); if (c !== Ht) return c } function TCe(n, a) { let c = a && yd(a.exports, n, 788968), u = c && gs(c), p = u && Jo(u); if (p) { if (p.length === 0) return ""; if (p.length === 1) return p[0].escapedName; p.length > 1 && c.declarations && Fe(c.declarations[0], _.The_global_type_JSX_0_may_not_have_more_than_one_property, Gi(n)) } } function V$e(n) { return n && yd(n.exports, Qd.LibraryManagedAttributes, 788968) } function j$e(n) { return TCe(Qd.ElementAttributesPropertyNameContainer, n) } function HB(n) { return TCe(Qd.ElementChildrenAttributeNameContainer, n) } function SCe(n, a) { if (n.flags & 4) return [As]; if (n.flags & 128) { let p = xCe(n, a); return p ? [ZB(a, p)] : (Fe(a, _.Property_0_does_not_exist_on_type_1, n.value, "JSX." + Qd.IntrinsicElements), Je) } let c = Eu(n), u = xa(c, 1); return u.length === 0 && (u = xa(c, 0)), u.length === 0 && c.flags & 1048576 && (u = Gte(on(c.types, p => SCe(p, a)))), u } function xCe(n, a) { let c = s0(Qd.IntrinsicElements, a); if (!Ro(c)) { let u = n.value, p = ja(c, Bs(u)); if (p) return zn(p); let h = fg(c, ae); return h || void 0 } return Se } function H$e(n, a, c) { if (n === 1) { let p = ICe(c); p && Df(a, p, Zu, c.tagName, _.Its_return_type_0_is_not_a_valid_JSX_element, u) } else if (n === 0) { let p = CCe(c); p && Df(a, p, Zu, c.tagName, _.Its_instance_type_0_is_not_a_valid_JSX_element, u) } else { let p = ICe(c), h = CCe(c); if (!p || !h) return; let T = Gr([p, h]); Df(a, T, Zu, c.tagName, _.Its_element_type_0_is_not_a_valid_JSX_element, u) } function u() { let p = Qc(c.tagName); return da(void 0, _._0_cannot_be_used_as_a_JSX_component, p) } } function ACe(n) { L.assert(OC(n.tagName)); let a = Rr(n); if (!a.resolvedJsxElementAttributesType) { let c = Gre(n); return a.jsxFlags & 1 ? a.resolvedJsxElementAttributesType = zn(c) || ve : a.jsxFlags & 2 ? a.resolvedJsxElementAttributesType = fg(s0(Qd.IntrinsicElements, n), ae) || ve : a.resolvedJsxElementAttributesType = ve } return a.resolvedJsxElementAttributesType } function CCe(n) { let a = s0(Qd.ElementClass, n); if (!Ro(a)) return a } function OM(n) { return s0(Qd.Element, n) } function ICe(n) { let a = OM(n); if (a) return Gr([a, ln]) } function W$e(n) { let a = s0(Qd.IntrinsicElements, n); return a ? Jo(a) : Je } function z$e(n) { (Y.jsx || 0) === 0 && Fe(n, _.Cannot_use_JSX_unless_the_jsx_flag_is_provided), OM(n) === void 0 && ge && Fe(n, _.JSX_element_implicitly_has_type_any_because_the_global_type_JSX_Element_does_not_exist) } function Ure(n) { let a = Au(n); if (a && Frt(n), z$e(n), !Bre(n)) { let c = Lo && Y.jsx === 2 ? _.Cannot_find_name_0 : void 0, u = Rb(n), p = a ? n.tagName : n, h; if (US(n) && u === "null" || (h = zs(p, u, 111551, c, u, !0)), h && (h.isReferenced = 67108863, !Y.verbatimModuleSyntax && h.flags & 2097152 && !nd(h) && Hb(h)), US(n)) { let T = Gn(n), k = h1(T); k && zs(p, k, 111551, c, k, !0) } } if (a) { let c = n, u = MC(c); tU(u, n), H$e($Ce(c), qo(u), c) } } function Vre(n, a, c) { if (n.flags & 524288) { if (qb(n, a) || jx(n, a) || qk(a) && Cm(n, ae) || c && Fre(a)) return !0 } else if (n.flags & 3145728 && NM(n)) { for (let u of n.types) if (Vre(u, a, c)) return !0 } return !1 } function NM(n) { return !!(n.flags & 524288 && !(Ur(n) & 512) || n.flags & 67108864 || n.flags & 1048576 && vt(n.types, NM) || n.flags & 2097152 && Ji(n.types, NM)) } function J$e(n, a) { if (Brt(n), n.expression) { let c = Yi(n.expression, a); return n.dotDotDotToken && c !== Se && !_f(c) && Fe(n, _.JSX_spread_child_must_be_an_array_type), c } else return ve } function WB(n) { return n.valueDeclaration ? G_(n.valueDeclaration) : 0 } function jre(n) { if (n.flags & 8192 || ac(n) & 4) return !0; if (Yn(n.valueDeclaration)) { let a = n.valueDeclaration.parent; return a && ar(a) && ic(a) === 3 } } function Hre(n, a, c, u, p, h = !0) { let T = h ? n.kind === 163 ? n.right : n.kind === 202 ? n : n.kind === 205 && n.propertyName ? n.propertyName : n.name : void 0; return LCe(n, a, c, u, p, T) } function LCe(n, a, c, u, p, h) { let T = Ef(p, c); if (a) { if (R < 2 && kCe(p)) return h && Fe(h, _.Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword), !1; if (T & 256) return h && Fe(h, _.Abstract_method_0_in_class_1_cannot_be_accessed_via_super_expression, E(p), Ee(N1(p))), !1 } if (T & 256 && kCe(p) && (zw(n) || sce(n) || cm(n.parent) && N6(n.parent.parent))) { let O = Nh(ju(p)); if (O && Gnt(n)) return h && Fe(h, _.Abstract_property_0_in_class_1_cannot_be_accessed_in_the_constructor, E(p), l_(O.name)), !1 } if (!(T & 24)) return !0; if (T & 8) { let O = Nh(ju(p)); return Hie(n, O) ? !0 : (h && Fe(h, _.Property_0_is_private_and_only_accessible_within_class_1, E(p), Ee(N1(p))), !1) } if (a) return !0; let k = zLe(n, O => { let H = gs(fr(O)); return c2e(H, p, c) }); return !k && (k = K$e(n), k = k && c2e(k, p, c), T & 32 || !k) ? (h && Fe(h, _.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, E(p), Ee(N1(p) || u)), !1) : T & 32 ? !0 : (u.flags & 262144 && (u = u.isThisType ? eu(u) : bu(u)), !u || !BE(u, k) ? (h && Fe(h, _.Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1_This_is_an_instance_of_class_2, E(p), Ee(k), Ee(u)), !1) : !0) } function K$e(n) { let a = q$e(n), c = a?.type && $r(a.type); if (c && c.flags & 262144 && (c = eu(c)), c && Ur(c) & 7) return Bx(c) } function q$e(n) { let a = Ku(n, !1, !1); return a && Ia(a) ? F0(a) : void 0 } function kCe(n) { return !!gM(n, a => !(a.flags & 8192)) } function NC(n) { return sp(Yi(n), n) } function zB(n) { return !!(iu(n) & 50331648) } function Wre(n) { return zB(n) ? yg(n) : n } function X$e(n, a) { let c = bc(n) ? qd(n) : void 0; if (n.kind === 104) { Fe(n, _.The_value_0_cannot_be_used_here, "null"); return } if (c !== void 0 && c.length < 100) { if (Re(n) && c === "undefined") { Fe(n, _.The_value_0_cannot_be_used_here, "undefined"); return } Fe(n, a & 16777216 ? a & 33554432 ? _._0_is_possibly_null_or_undefined : _._0_is_possibly_undefined : _._0_is_possibly_null, c) } else Fe(n, a & 16777216 ? a & 33554432 ? _.Object_is_possibly_null_or_undefined : _.Object_is_possibly_undefined : _.Object_is_possibly_null) } function Y$e(n, a) { Fe(n, a & 16777216 ? a & 33554432 ? _.Cannot_invoke_an_object_which_is_possibly_null_or_undefined : _.Cannot_invoke_an_object_which_is_possibly_undefined : _.Cannot_invoke_an_object_which_is_possibly_null) } function DCe(n, a, c) { if (U && n.flags & 2) { if (bc(a)) { let p = qd(a); if (p.length < 100) return Fe(a, _._0_is_of_type_unknown, p), ve } return Fe(a, _.Object_is_of_type_unknown), ve } let u = iu(n); if (u & 50331648) { c(a, u); let p = yg(n); return p.flags & 229376 ? ve : p } return n } function sp(n, a) { return DCe(n, a, X$e) } function wCe(n, a) { let c = sp(n, a); if (c.flags & 16384) { if (bc(a)) { let u = qd(a); if (Re(a) && u === "undefined") return Fe(a, _.The_value_0_cannot_be_used_here, u), c; if (u.length < 100) return Fe(a, _._0_is_possibly_undefined, u), c } Fe(a, _.Object_is_possibly_undefined) } return c } function RCe(n, a) { return n.flags & 32 ? $$e(n, a) : Jre(n, n.expression, NC(n.expression), n.name, a) } function $$e(n, a) { let c = Yi(n.expression), u = dD(c, n.expression); return SB(Jre(n, n.expression, sp(u, n.expression), n.name, a), n, u !== c) } function OCe(n, a) { let c = G6(n) && LT(n.left) ? sp(kM(n.left), n.left) : NC(n.left); return Jre(n, n.left, c, n.right, a) } function NCe(n) { for (; n.parent.kind === 214;)n = n.parent; return Ih(n.parent) && n.parent.expression === n } function JB(n, a) { for (let c = Zc(a); c; c = Zc(c)) { let { symbol: u } = c, p = hR(u, n), h = u.members && u.members.get(p) || u.exports && u.exports.get(p); if (h) return h } } function Q$e(n) { if (!Zc(n)) return an(n, _.Private_identifiers_are_not_allowed_outside_class_bodies); if (!Mz(n.parent)) { if (!Dh(n)) return an(n, _.Private_identifiers_are_only_allowed_in_class_bodies_and_may_only_be_used_as_part_of_a_class_member_declaration_property_access_or_on_the_left_hand_side_of_an_in_expression); let a = ar(n.parent) && n.parent.operatorToken.kind === 101; if (!KB(n) && !a) return an(n, _.Cannot_find_name_0, vr(n)) } return !1 } function Z$e(n) { Q$e(n); let a = KB(n); return a && MM(a, void 0, !1), Se } function KB(n) { if (!Dh(n)) return; let a = Rr(n); return a.resolvedSymbol === void 0 && (a.resolvedSymbol = JB(n.escapedText, n)), a.resolvedSymbol } function zre(n, a) { return ja(n, a.escapedName) } function eQe(n, a, c) { let u, p = Jo(n); p && mn(p, T => { let k = T.valueDeclaration; if (k && zl(k) && pi(k.name) && k.name.escapedText === a.escapedText) return u = T, !0 }); let h = Cf(a); if (u) { let T = L.checkDefined(u.valueDeclaration), k = L.checkDefined(Zc(T)); if (c?.valueDeclaration) { let O = c.valueDeclaration, H = Zc(O); if (L.assert(!!H), jn(H, J => k === J)) { let J = Fe(a, _.The_property_0_cannot_be_accessed_on_type_1_within_this_class_because_it_is_shadowed_by_another_private_identifier_with_the_same_spelling, h, Ee(n)); return Ao(J, hr(O, _.The_shadowing_declaration_of_0_is_defined_here, h), hr(T, _.The_declaration_of_0_that_you_probably_intended_to_use_is_defined_here, h)), !0 } } return Fe(a, _.Property_0_is_not_accessible_outside_class_1_because_it_has_a_private_identifier, h, Cf(k.name || nN)), !0 } return !1 } function PCe(n, a) { return (id(a) || zw(n) && np(a)) && Ku(n, !0, !1) === Op(a) } function Jre(n, a, c, u, p) { let h = Rr(a).resolvedSymbol, T = xT(n), k = Eu(T !== 0 || NCe(n) ? Sd(c) : c), O = Zo(k) || k === Qe, H; if (pi(u)) { R < 99 && (T !== 0 && Hc(n, 1048576), T !== 1 && Hc(n, 524288)); let de = JB(u.escapedText, u); if (T && de && de.valueDeclaration && Nc(de.valueDeclaration) && an(u, _.Cannot_assign_to_private_method_0_Private_methods_are_not_writable, vr(u)), O) { if (de) return Ro(k) ? ve : k; if (!Zc(u)) return an(u, _.Private_identifiers_are_not_allowed_outside_class_bodies), Se } if (H = de ? zre(c, de) : void 0, !H && eQe(c, u, de)) return ve; H && H.flags & 65536 && !(H.flags & 32768) && T !== 1 && Fe(n, _.Private_accessor_was_defined_without_a_getter) } else { if (O) return Re(a) && h && FB(h, n), Ro(k) ? ve : k; H = ja(k, u.escapedText, !1, n.kind === 163) } Re(a) && h && (d_(Y) || !(H && (MD(H) || H.flags & 8 && n.parent.kind === 302)) || U0(Y) && eCe(n)) && FB(h, n); let J; if (H) { Sv(H) && xne(n, H) && H.declarations && Xh(u, H.declarations, u.escapedText), tQe(H, n, u), MM(H, n, jCe(a, h)), Rr(n).resolvedSymbol = H; let de = YI(n); if (Hre(n, a.kind === 106, de, k, H), LIe(n, H, T)) return Fe(u, _.Cannot_assign_to_0_because_it_is_a_read_only_property, vr(u)), ve; J = PCe(n, H) ? at : de ? mC(H) : zn(H) } else { let de = !pi(u) && (T === 0 || !Zb(c) || lL(c)) ? jx(k, u.escapedText) : void 0; if (!(de && de.type)) { let Ae = Kre(n, c.symbol, !0); return !Ae && iD(c) ? Se : c.symbol === Ye ? (Ye.exports.has(u.escapedText) && Ye.exports.get(u.escapedText).flags & 418 ? Fe(u, _.Property_0_does_not_exist_on_type_1, Gi(u.escapedText), Ee(c)) : ge && Fe(u, _.Element_implicitly_has_an_any_type_because_type_0_has_no_index_signature, Ee(c)), Se) : (u.escapedText && !xv(n) && GCe(u, lL(c) ? k : c, Ae), ve) } de.isReadonly && (Um(n) || GH(n)) && Fe(n, _.Index_signature_in_type_0_only_permits_reading, Ee(k)), J = Y.noUncheckedIndexedAccess && !Um(n) ? Gr([de.type, Ge]) : de.type, Y.noPropertyAccessFromIndexSignature && br(n) && Fe(u, _.Property_0_comes_from_an_index_signature_so_it_must_be_accessed_with_0, Gi(u.escapedText)), de.declaration && G_(de.declaration) & 268435456 && Xh(u, [de.declaration], u.escapedText) } return MCe(n, H, J, u, p) } function Kre(n, a, c) { let u = Gn(n); if (u && Y.checkJs === void 0 && u.checkJsDirective === void 0 && (u.scriptKind === 1 || u.scriptKind === 2)) { let p = mn(a?.declarations, Gn); return !(u !== p && p && gm(p)) && !(c && a && a.flags & 32) && !(n && c && br(n) && n.expression.kind === 108) } return !1 } function MCe(n, a, c, u, p) { let h = xT(n); if (h === 1) return KE(c, !!(a && a.flags & 16777216)); if (a && !(a.flags & 98311) && !(a.flags & 8192 && c.flags & 1048576) && !yU(a.declarations)) return c; if (c === at) return Fx(n, a); c = Sre(c, n, p); let T = !1; if (U && _e && Us(n) && n.expression.kind === 108) { let O = a && a.valueDeclaration; if (O && wLe(O) && !Ca(O)) { let H = yD(n); H.kind === 173 && H.parent === O.parent && !(O.flags & 16777216) && (T = !0) } } else U && a && a.valueDeclaration && br(a.valueDeclaration) && tR(a.valueDeclaration) && yD(n) === yD(a.valueDeclaration) && (T = !0); let k = Yv(n, c, T ? gg(c) : c); return T && !xC(c) && xC(k) ? (Fe(u, _.Property_0_is_used_before_being_assigned, E(a)), c) : h ? ky(k) : k } function tQe(n, a, c) { let { valueDeclaration: u } = n; if (!u || Gn(a).isDeclarationFile) return; let p, h = vr(c); FCe(a) && !YJe(u) && !(Us(a) && Us(a.expression)) && !$h(u, c) && !(Nc(u) && wg(u) & 32) && (Y.useDefineForClassFields || !nQe(n)) ? p = Fe(c, _.Property_0_is_used_before_its_initialization, h) : u.kind === 260 && a.parent.kind !== 180 && !(u.flags & 16777216) && !$h(u, c) && (p = Fe(c, _.Class_0_used_before_its_declaration, h)), p && Ao(p, hr(u, _._0_is_declared_here, h)) } function FCe(n) { return !!jn(n, a => { switch (a.kind) { case 169: return !0; case 299: case 171: case 174: case 175: case 301: case 164: case 236: case 291: case 288: case 289: case 290: case 283: case 230: case 294: return !1; case 216: case 241: return Va(a.parent) && oc(a.parent.parent) ? !0 : "quit"; default: return Dh(a) ? !1 : "quit" } }) } function nQe(n) { if (!(n.parent.flags & 32)) return !1; let a = zn(n.parent); for (; ;) { if (a = a.symbol && rQe(a), !a) return !1; let c = ja(a, n.escapedName); if (c && c.valueDeclaration) return !0 } } function rQe(n) { let a = _o(n); if (a.length !== 0) return so(a) } function GCe(n, a, c) { let u, p; if (!pi(n) && a.flags & 1048576 && !(a.flags & 134348796)) { for (let T of a.types) if (!ja(T, n.escapedText) && !jx(T, n.escapedText)) { u = da(u, _.Property_0_does_not_exist_on_type_1, os(n), Ee(T)); break } } if (BCe(n.escapedText, a)) { let T = os(n), k = Ee(a); u = da(u, _.Property_0_does_not_exist_on_type_1_Did_you_mean_to_access_the_static_member_2_instead, T, k, k + "." + T) } else { let T = wD(a); if (T && ja(T, n.escapedText)) u = da(u, _.Property_0_does_not_exist_on_type_1, os(n), Ee(a)), p = hr(n, _.Did_you_forget_to_use_await); else { let k = os(n), O = Ee(a), H = oQe(k, a); if (H !== void 0) u = da(u, _.Property_0_does_not_exist_on_type_1_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_2_or_later, k, O, H); else { let J = qre(n, a); if (J !== void 0) { let de = fc(J), Ae = c ? _.Property_0_may_not_exist_on_type_1_Did_you_mean_2 : _.Property_0_does_not_exist_on_type_1_Did_you_mean_2; u = da(u, Ae, k, O, de), p = J.valueDeclaration && hr(J.valueDeclaration, _._0_is_declared_here, de) } else { let de = iQe(a) ? _.Property_0_does_not_exist_on_type_1_Try_changing_the_lib_compiler_option_to_include_dom : _.Property_0_does_not_exist_on_type_1; u = da(Xte(u, a), de, k, O) } } } } let h = Lh(Gn(n), n, u); p && Ao(h, p), ey(!c || u.code !== _.Property_0_may_not_exist_on_type_1_Did_you_mean_2.code, h) } function iQe(n) { return Y.lib && !Y.lib.includes("dom") && TYe(n, a => a.symbol && /^(EventTarget|Node|((HTML[a-zA-Z]*)?Element))$/.test(Gi(a.symbol.escapedName))) && mh(n) } function BCe(n, a) { let c = a.symbol && ja(zn(a.symbol), n); return c !== void 0 && !!c.valueDeclaration && Ca(c.valueDeclaration) } function aQe(n) { let a = Cf(n), u = oH().get(a); return u && pae(u.keys()) } function oQe(n, a) { let c = Eu(a).symbol; if (!c) return; let u = fc(c), h = oH().get(u); if (h) { for (let [T, k] of h) if (ya(k, n)) return T } } function UCe(n, a) { return PM(n, Jo(a), 106500) } function qre(n, a) { let c = Jo(a); if (typeof n != "string") { let u = n.parent; br(u) && (c = Pr(c, p => HCe(u, a, p))), n = vr(n) } return PM(n, c, 111551) } function VCe(n, a) { let c = Ta(n) ? n : vr(n), u = Jo(a), p = c === "for" ? wr(u, h => fc(h) === "htmlFor") : c === "class" ? wr(u, h => fc(h) === "className") : void 0; return p ?? PM(c, u, 111551) } function Xre(n, a) { let c = qre(n, a); return c && fc(c) } function Yre(n, a, c) { return L.assert(a !== void 0, "outername should always be defined"), Fb(n, a, c, void 0, a, !1, !1, !0, (p, h, T) => { L.assertEqual(a, h, "name should equal outerName"); let k = yd(p, h, T); if (k) return k; let O; return p === Ne ? O = Zi(["string", "number", "boolean", "object", "bigint", "symbol"], J => p.has(J.charAt(0).toUpperCase() + J.slice(1)) ? wo(524288, J) : void 0).concat(lo(p.values())) : O = lo(p.values()), PM(Gi(h), O, T) }) } function sQe(n, a, c) { let u = Yre(n, a, c); return u && fc(u) } function qB(n, a) { return a.exports && PM(vr(n), sy(a), 2623475) } function cQe(n, a) { let c = qB(n, a); return c && fc(c) } function lQe(n, a, c) { function u(T) { let k = qb(n, T); if (k) { let O = F1(zn(k)); return !!O && Vp(O) >= 1 && to(c, P_(O, 0)) } return !1 } let p = Um(a) ? "set" : "get"; if (!u(p)) return; let h = kR(a.expression); return h === void 0 ? h = p : h += "." + p, h } function uQe(n, a) { let c = a.types.filter(u => !!(u.flags & 128)); return $C(n.value, c, u => u.value) } function PM(n, a, c) { return $C(n, a, u); function u(p) { let h = fc(p); if (!na(h, '"')) { if (p.flags & c) return h; if (p.flags & 2097152) { let T = tg(p); if (T && T.flags & c) return h } } } } function MM(n, a, c) { let u = n && n.flags & 106500 && n.valueDeclaration; if (!u) return; let p = cd(u, 8), h = n.valueDeclaration && zl(n.valueDeclaration) && pi(n.valueDeclaration.name); if (!(!p && !h) && !(a && hW(a) && !(n.flags & 65536))) { if (c) { let T = jn(a, Ds); if (T && T.symbol === n) return } (ac(n) & 1 ? Ai(n).target : n).isReferenced = 67108863 } } function jCe(n, a) { return n.kind === 108 || !!a && bc(n) && a === Qf(Yd(n)) } function dQe(n, a) { switch (n.kind) { case 208: return $re(n, n.expression.kind === 106, a, Sd(Yi(n.expression))); case 163: return $re(n, !1, a, Sd(Yi(n.left))); case 202: return $re(n, !1, a, $r(n)) } } function HCe(n, a, c) { return Qre(n, n.kind === 208 && n.expression.kind === 106, !1, a, c) } function $re(n, a, c, u) { if (Zo(u)) return !0; let p = ja(u, c); return !!p && Qre(n, a, !1, u, p) } function Qre(n, a, c, u, p) { if (Zo(u)) return !0; if (p.valueDeclaration && xu(p.valueDeclaration)) { let h = Zc(p.valueDeclaration); return !Jl(n) && !!jn(n, T => T === h) } return LCe(n, a, c, u, p) } function fQe(n) { let a = n.initializer; if (a.kind === 258) { let c = a.declarations[0]; if (c && !La(c.name)) return fr(c) } else if (a.kind === 79) return Qf(a) } function _Qe(n) { return tu(n).length === 1 && !!Cm(n, rt) } function pQe(n) { let a = vs(n); if (a.kind === 79) { let c = Qf(a); if (c.flags & 3) { let u = n, p = n.parent; for (; p;) { if (p.kind === 246 && u === p.statement && fQe(p) === c && _Qe(au(p.expression))) return !0; u = p, p = p.parent } } } return !1 } function mQe(n, a) { return n.flags & 32 ? hQe(n, a) : WCe(n, NC(n.expression), a) } function hQe(n, a) { let c = Yi(n.expression), u = dD(c, n.expression); return SB(WCe(n, sp(u, n.expression), a), n, u !== c) } function WCe(n, a, c) { let u = xT(n) !== 0 || NCe(n) ? Sd(a) : a, p = n.argumentExpression, h = Yi(p); if (Ro(u) || u === Qe) return u; if (hie(u) && !es(p)) return Fe(p, _.A_const_enum_member_can_only_be_accessed_using_a_string_literal), ve; let T = pQe(p) ? rt : h, k = Um(n) ? 4 | (Zb(u) && !lL(u) ? 2 : 0) : 32, O = Ay(u, T, k, n) || ve; return qIe(MCe(n, Rr(n).resolvedSymbol, O, p, c), n) } function zCe(n) { return Ih(n) || PT(n) || Au(n) } function nA(n) { return zCe(n) && mn(n.typeArguments, qa), n.kind === 212 ? Yi(n.template) : Au(n) ? Yi(n.attributes) : n.kind !== 167 && mn(n.arguments, a => { Yi(a) }), As } function Up(n) { return nA(n), jt } function gQe(n, a, c) { let u, p, h = 0, T, k = -1, O; L.assert(!a.length); for (let H of n) { let J = H.declaration && fr(H.declaration), de = H.declaration && H.declaration.parent; !p || J === p ? u && de === u ? T = T + 1 : (u = de, T = h) : (T = h = a.length, u = de), p = J, _K(H) ? (k++, O = k, h++) : O = T, a.splice(O, 0, c ? bJe(H, c) : H) } } function XB(n) { return !!n && (n.kind === 227 || n.kind === 234 && n.isSpread) } function YB(n) { return Yc(n, XB) } function JCe(n) { return !!(n.flags & 16384) } function yQe(n) { return !!(n.flags & 49155) } function $B(n, a, c, u = !1) { let p, h = !1, T = xd(c), k = Vp(c); if (n.kind === 212) if (p = a.length, n.template.kind === 225) { let O = To(n.template.templateSpans); h = rc(O.literal) || !!O.literal.isUnterminated } else { let O = n.template; L.assert(O.kind === 14), h = !!O.isUnterminated } else if (n.kind === 167) p = ZCe(n, c); else if (Au(n)) { if (h = n.attributes.end === n.end, h) return !0; p = k === 0 ? a.length : 1, T = a.length === 0 ? T : 1, k = Math.min(k, 1) } else if (n.arguments) { p = u ? a.length + 1 : a.length, h = n.arguments.end === n.end; let O = YB(a); if (O >= 0) return O >= Vp(c) && (jp(c) || O < xd(c)) } else return L.assert(n.kind === 211), Vp(c) === 0; if (!jp(c) && p > T) return !1; if (h || p >= k) return !0; for (let O = p; O < k; O++) { let H = P_(c, O); if (jc(H, Yn(n) && !U ? yQe : JCe).flags & 131072) return !1 } return !0 } function Zre(n, a) { let c = Fn(n.typeParameters), u = Mp(n.typeParameters); return !vt(a) || a.length >= u && a.length <= c } function F1(n) { return ED(n, 0, !1) } function KCe(n) { return ED(n, 0, !1) || ED(n, 1, !1) } function ED(n, a, c) { if (n.flags & 524288) { let u = R_(n); if (c || u.properties.length === 0 && u.indexInfos.length === 0) { if (a === 0 && u.callSignatures.length === 1 && u.constructSignatures.length === 0) return u.callSignatures[0]; if (a === 1 && u.constructSignatures.length === 1 && u.callSignatures.length === 0) return u.constructSignatures[0] } } } function qCe(n, a, c, u) { let p = _D(n.typeParameters, n, 0, u), h = xD(a), T = c && (h && h.flags & 262144 ? c.nonFixingMapper : c.mapper), k = T ? $x(a, T) : a; return rre(k, n, (O, H) => { gh(p.inferences, O, H) }), c || ire(a, n, (O, H) => { gh(p.inferences, O, H, 128) }), eD(n, gre(p), Yn(a.declaration)) } function vQe(n, a, c, u) { let p = VB(a, n), h = rA(n.attributes, p, u, c); return gh(u.inferences, h, p), gre(u) } function XCe(n) { if (!n) return yt; let a = Yi(n); return pI(n.parent) ? yg(a) : Jl(n.parent) ? ere(a) : a } function eie(n, a, c, u, p) { if (Au(n)) return vQe(n, a, u, p); if (n.kind !== 167) { let O = Ji(a.typeParameters, J => !!jE(J)), H = Ru(n, O ? 8 : 0); if (H) { let J = qo(a); if (XE(J)) { let de = M1(n); if (!(!O && Ru(n, 8) !== H)) { let It = sre(GXe(de, 1)), Tn = Oi(H, It), un = F1(Tn), Nn = un && un.typeParameters ? HE(ine(un, un.typeParameters)) : Tn; gh(p.inferences, Nn, J, 128) } let xe = _D(a.typeParameters, a, p.flags), tt = Oi(H, de && de.returnMapper); gh(xe.inferences, tt, J), p.returnMapper = vt(xe.inferences, iA) ? sre(jXe(xe)) : void 0 } } } let h = AD(a), T = h ? Math.min(xd(a) - 1, c.length) : c.length; if (h && h.flags & 262144) { let O = wr(p.inferences, H => H.typeParameter === h); O && (O.impliedArity = Yc(c, XB, T) < 0 ? c.length - T : void 0) } let k = Yb(a); if (k && XE(k)) { let O = QCe(n); gh(p.inferences, XCe(O), k) } for (let O = 0; O < T; O++) { let H = c[O]; if (H.kind !== 229 && !(u & 32 && dre(H))) { let J = P_(a, O); if (XE(J)) { let de = rA(H, J, p, u); gh(p.inferences, de, J) } } } if (h && XE(h)) { let O = tie(c, T, c.length, h, p, u); gh(p.inferences, O, h) } return gre(p) } function YCe(n) { return n.flags & 1048576 ? Ls(n, YCe) : n.flags & 1 || vB(bu(n) || n) ? n : po(n) ? ap(Ko(n), n.target.elementFlags, !1, n.target.labeledElementDeclarations) : ap([n], [8]) } function tie(n, a, c, u, p, h) { if (a >= c - 1) { let J = n[c - 1]; if (XB(J)) return YCe(J.kind === 234 ? J.type : rA(J.expression, u, p, h)) } let T = [], k = [], O = [], H = tM(u); for (let J = a; J < c; J++) { let de = n[J]; if (XB(de)) { let Ae = de.kind === 234 ? de.type : Yi(de.expression); Kv(Ae) ? (T.push(Ae), k.push(8)) : (T.push(wy(33, Ae, Oe, de.kind === 227 ? de.expression : de)), k.push(4)) } else { let Ae = od(u, op(J - a), 256), xe = rA(de, Ae, p, h), tt = H || Js(Ae, 406978556); T.push(tt ? Hu(xe) : i0(xe)), k.push(1) } de.kind === 234 && de.tupleNameSource && O.push(de.tupleNameSource) } return ap(T, k, H, Fn(O) === Fn(T) ? O : void 0) } function nie(n, a, c, u) { let p = Yn(n.declaration), h = n.typeParameters, T = Sy(on(a, $r), h, Mp(h), p), k; for (let O = 0; O < a.length; O++) { L.assert(h[O] !== void 0, "Should not call checkTypeArguments with too many type arguments"); let H = eu(h[O]); if (H) { let J = c && u ? () => da(void 0, _.Type_0_does_not_satisfy_the_constraint_1) : void 0, de = u || _.Type_0_does_not_satisfy_the_constraint_1; k || (k = Wu(h, T)); let Ae = T[O]; if (!wu(Ae, uf(Oi(H, k), Ae), c ? a[O] : void 0, de, J)) return } } return T } function $Ce(n) { if (OC(n.tagName)) return 2; let a = Eu(Yi(n.tagName)); return Fn(xa(a, 1)) ? 0 : Fn(xa(a, 0)) ? 1 : 2 } function bQe(n, a, c, u, p, h, T) { let k = VB(a, n), O = rA(n.attributes, k, void 0, u); return H() && Bne(O, k, c, p ? n.tagName : void 0, n.attributes, void 0, h, T); function H() { var J; if (Bre(n)) return !0; let de = Xm(n) || FS(n) && !OC(n.tagName) ? Yi(n.tagName) : void 0; if (!de) return !0; let Ae = xa(de, 0); if (!Fn(Ae)) return !0; let xe = nke(n); if (!xe) return !0; let tt = uc(xe, 111551, !0, !1, n); if (!tt) return !0; let It = zn(tt), Tn = xa(It, 0); if (!Fn(Tn)) return !0; let un = !1, Nn = 0; for (let cn of Tn) { let rr = P_(cn, 0), Jt = xa(rr, 0); if (Fn(Jt)) for (let Cn of Jt) { if (un = !0, jp(Cn)) return !0; let Rn = xd(Cn); Rn > Nn && (Nn = Rn) } } if (!un) return !0; let en = 1 / 0; for (let cn of Ae) { let rr = Vp(cn); rr < en && (en = rr) } if (en <= Nn) return !0; if (p) { let cn = hr(n.tagName, _.Tag_0_expects_at_least_1_arguments_but_the_JSX_factory_2_provides_at_most_3, qd(n.tagName), en, qd(xe), Nn), rr = (J = Zf(n.tagName)) == null ? void 0 : J.valueDeclaration; rr && Ao(cn, hr(rr, _._0_is_declared_here, qd(n.tagName))), T && T.skipLogging && (T.errors || (T.errors = [])).push(cn), T.skipLogging || Lo.add(cn) } return !1 } } function FM(n, a, c, u, p, h, T) { let k = { errors: void 0, skipLogging: !0 }; if (Au(n)) return bQe(n, c, u, p, h, T, k) ? void 0 : (L.assert(!h || !!k.errors, "jsx should have errors when reporting errors"), k.errors || Je); let O = Yb(c); if (O && O !== yt && !(z0(n) || Pa(n) && Pu(n.expression))) { let xe = QCe(n), tt = XCe(xe), It = h ? xe || n : void 0, Tn = _.The_this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1; if (!Df(tt, O, u, It, Tn, T, k)) return L.assert(!h || !!k.errors, "this parameter should have errors when reporting errors"), k.errors || Je } let H = _.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1, J = AD(c), de = J ? Math.min(xd(c) - 1, a.length) : a.length; for (let xe = 0; xe < de; xe++) { let tt = a[xe]; if (tt.kind !== 229) { let It = P_(c, xe), Tn = rA(tt, It, void 0, p), un = p & 4 ? EM(Tn) : Tn; if (!Bne(un, It, u, h ? tt : void 0, tt, H, T, k)) return L.assert(!h || !!k.errors, "parameter should have errors when reporting errors"), Ae(tt, un, It), k.errors || Je } } if (J) { let xe = tie(a, de, a.length, J, void 0, p), tt = a.length - de, It = h ? tt === 0 ? n : tt === 1 ? a[de] : om(GM(n, xe), a[de].pos, a[a.length - 1].end) : void 0; if (!Df(xe, J, u, It, H, void 0, k)) return L.assert(!h || !!k.errors, "rest parameter should have errors when reporting errors"), Ae(It, xe, J), k.errors || Je } return; function Ae(xe, tt, It) { if (xe && h && k.errors && k.errors.length) { if (DD(It)) return; let Tn = DD(tt); Tn && Bp(Tn, It, u) && Ao(k.errors[0], hr(xe, _.Did_you_forget_to_use_await)) } } } function QCe(n) { let a = n.kind === 210 ? n.expression : n.kind === 212 ? n.tag : void 0; if (a) { let c = ql(a); if (Us(c)) return c.expression } } function GM(n, a, c, u) { let p = fm.createSyntheticExpression(a, c, u); return it(p, n), go(p, n), p } function rie(n) { if (n.kind === 212) { let u = n.template, p = [GM(u, _Ke())]; return u.kind === 225 && mn(u.templateSpans, h => { p.push(h.expression) }), p } if (n.kind === 167) return EQe(n); if (Au(n)) return n.attributes.properties.length > 0 || Xm(n) && n.parent.children.length > 0 ? [n.attributes] : Je; let a = n.arguments || Je, c = YB(a); if (c >= 0) { let u = a.slice(0, c); for (let p = c; p < a.length; p++) { let h = a[p], T = h.kind === 227 && (Dn ? Yi(h.expression) : Ic(h.expression)); T && po(T) ? mn(Ko(T), (k, O) => { var H; let J = T.target.elementFlags[O], de = GM(h, J & 4 ? nu(k) : k, !!(J & 12), (H = T.target.labeledElementDeclarations) == null ? void 0 : H[O]); u.push(de) }) : u.push(h) } return u } return a } function EQe(n) { let a = n.expression, c = _ie(n); if (c) { let u = []; for (let p of c.parameters) { let h = zn(p); u.push(GM(a, h)) } return u } return L.fail() } function ZCe(n, a) { return Y.experimentalDecorators ? TQe(n, a) : 2 } function TQe(n, a) { switch (n.parent.kind) { case 260: case 228: return 1; case 169: return rm(n.parent) ? 3 : 2; case 171: case 174: case 175: return R === 0 || a.parameters.length <= 2 ? 2 : 3; case 166: return 3; default: return L.fail() } } function eIe(n, a) { let c, u, p = Gn(n); if (br(n.expression)) { let h = w0(p, n.expression.name); c = h.start, u = a ? h.length : n.end - c } else { let h = w0(p, n.expression); c = h.start, u = a ? h.length : n.end - c } return { start: c, length: u, sourceFile: p } } function TD(n, a, c, u, p, h) { if (Pa(n)) { let { sourceFile: T, start: k, length: O } = eIe(n); return "message" in a ? al(T, k, O, a, c, u, p, h) : yH(T, a) } else return "message" in a ? hr(n, a, c, u, p, h) : Lh(Gn(n), n, a) } function SQe(n) { if (!Pa(n) || !Re(n.expression)) return !1; let a = zs(n.expression, n.expression.escapedText, 111551, void 0, void 0, !1), c = a?.valueDeclaration; if (!c || !ha(c) || !a2(c.parent) || !z0(c.parent.parent) || !Re(c.parent.parent.expression)) return !1; let u = _ne(!1); return u ? Zf(c.parent.parent.expression, !0) === u : !1 } function tIe(n, a, c, u) { var p; let h = YB(c); if (h > -1) return hr(c[h], _.A_spread_argument_must_either_have_a_tuple_type_or_be_passed_to_a_rest_parameter); let T = Number.POSITIVE_INFINITY, k = Number.NEGATIVE_INFINITY, O = Number.NEGATIVE_INFINITY, H = Number.POSITIVE_INFINITY, J; for (let It of a) { let Tn = Vp(It), un = xd(It); Tn < T && (T = Tn, J = It), k = Math.max(k, un), Tn < c.length && Tn > O && (O = Tn), c.length < un && un < H && (H = un) } let de = vt(a, jp), Ae = de ? T : T < k ? T + "-" + k : T, xe = !de && Ae === 1 && c.length === 0 && SQe(n); if (xe && Yn(n)) return TD(n, _.Expected_1_argument_but_got_0_new_Promise_needs_a_JSDoc_hint_to_produce_a_resolve_that_can_be_called_without_arguments); let tt = du(n) ? de ? _.The_runtime_will_invoke_the_decorator_with_1_arguments_but_the_decorator_expects_at_least_0 : _.The_runtime_will_invoke_the_decorator_with_1_arguments_but_the_decorator_expects_0 : de ? _.Expected_at_least_0_arguments_but_got_1 : xe ? _.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise : _.Expected_0_arguments_but_got_1; if (T < c.length && c.length < k) { if (u) { let It = da(void 0, _.No_overload_expects_0_arguments_but_overloads_do_exist_that_expect_either_1_or_2_arguments, c.length, O, H); return It = da(It, u), TD(n, It) } return TD(n, _.No_overload_expects_0_arguments_but_overloads_do_exist_that_expect_either_1_or_2_arguments, c.length, O, H) } else if (c.length < T) { let It; if (u) { let un = da(void 0, tt, Ae, c.length); un = da(un, u), It = TD(n, un) } else It = TD(n, tt, Ae, c.length); let Tn = (p = J?.declaration) == null ? void 0 : p.parameters[J.thisParameter ? c.length + 1 : c.length]; if (Tn) { let un = hr(Tn, La(Tn.name) ? _.An_argument_matching_this_binding_pattern_was_not_provided : Fm(Tn) ? _.Arguments_for_the_rest_parameter_0_were_not_provided : _.An_argument_for_0_was_not_provided, Tn.name ? La(Tn.name) ? void 0 : vr(Yd(Tn.name)) : c.length); return Ao(It, un) } return It } else { let It = D.createNodeArray(c.slice(k)), Tn = Vo(It).pos, un = To(It).end; if (un === Tn && un++, om(It, Tn, un), u) { let Nn = da(void 0, tt, Ae, c.length); return Nn = da(Nn, u), jw(Gn(n), It, Nn) } return RA(Gn(n), It, tt, Ae, c.length) } } function xQe(n, a, c, u) { let p = c.length; if (a.length === 1) { let k = a[0], O = Mp(k.typeParameters), H = Fn(k.typeParameters); if (u) { let J = da(void 0, _.Expected_0_type_arguments_but_got_1, O < H ? O + "-" + H : O, p); return J = da(J, u), jw(Gn(n), c, J) } return RA(Gn(n), c, _.Expected_0_type_arguments_but_got_1, O < H ? O + "-" + H : O, p) } let h = -1 / 0, T = 1 / 0; for (let k of a) { let O = Mp(k.typeParameters), H = Fn(k.typeParameters); O > p ? T = Math.min(T, O) : H < p && (h = Math.max(h, H)) } if (h !== -1 / 0 && T !== 1 / 0) { if (u) { let k = da(void 0, _.No_overload_expects_0_type_arguments_but_overloads_do_exist_that_expect_either_1_or_2_type_arguments, p, h, T); return k = da(k, u), jw(Gn(n), c, k) } return RA(Gn(n), c, _.No_overload_expects_0_type_arguments_but_overloads_do_exist_that_expect_either_1_or_2_type_arguments, p, h, T) } if (u) { let k = da(void 0, _.Expected_0_type_arguments_but_got_1, h === -1 / 0 ? T : h, p); return k = da(k, u), jw(Gn(n), c, k) } return RA(Gn(n), c, _.Expected_0_type_arguments_but_got_1, h === -1 / 0 ? T : h, p) } function PC(n, a, c, u, p, h) { let T = n.kind === 212, k = n.kind === 167, O = Au(n), H = !B && !c, J; !k && !OA(n) && (J = n.typeArguments, (T || O || n.expression.kind !== 106) && mn(J, qa)); let de = c || []; if (gQe(a, de, p), !de.length) return H && Lo.add(TD(n, _.Call_target_does_not_contain_any_signatures)), Up(n); let Ae = rie(n), xe = de.length === 1 && !de[0].typeParameters, tt = !k && !xe && vt(Ae, $f) ? 4 : 0; tt |= u & 32; let It, Tn, un, Nn, en = !!(u & 16) && n.kind === 210 && n.arguments.hasTrailingComma; if (de.length > 1 && (Nn = rr(de, hm, xe, en)), Nn || (Nn = rr(de, Zu, xe, en)), Nn) return Nn; if (Nn = AQe(n, de, Ae, !!c, u), Rr(n).resolvedSignature = Nn, H) if (It) if (It.length === 1 || It.length > 3) { let Jt = It[It.length - 1], Cn; It.length > 3 && (Cn = da(Cn, _.The_last_overload_gave_the_following_error), Cn = da(Cn, _.No_overload_matches_this_call)), h && (Cn = da(Cn, h)); let Rn = FM(n, Ae, Jt, Zu, 0, !0, () => Cn); if (Rn) for (let Br of Rn) Jt.declaration && It.length > 3 && Ao(Br, hr(Jt.declaration, _.The_last_overload_is_declared_here)), cn(Jt, Br), Lo.add(Br); else L.fail("No error for last overload signature") } else { let Jt = [], Cn = 0, Rn = Number.MAX_VALUE, Br = 0, Hr = 0; for (let Hd of It) { let In = FM(n, Ae, Hd, Zu, 0, !0, () => da(void 0, _.Overload_0_of_1_2_gave_the_following_error, Hr + 1, de.length, ne(Hd))); In ? (In.length <= Rn && (Rn = In.length, Br = Hr), Cn = Math.max(Cn, In.length), Jt.push(In)) : L.fail("No error for 3 or fewer overload signatures"), Hr++ } let qi = Cn > 1 ? Jt[Br] : t_(Jt); L.assert(qi.length > 0, "No errors reported for 3 or fewer overload signatures"); let wa = da(on(qi, qse), _.No_overload_matches_this_call); h && (wa = da(wa, h)); let Xc = [...Uo(qi, Hd => Hd.relatedInformation)], pf; if (Ji(qi, Hd => Hd.start === qi[0].start && Hd.length === qi[0].length && Hd.file === qi[0].file)) { let { file: Hd, start: ji, length: In } = qi[0]; pf = { file: Hd, start: ji, length: In, code: wa.code, category: wa.category, messageText: wa, relatedInformation: Xc } } else pf = Lh(Gn(n), n, wa, Xc); cn(It[0], pf), Lo.add(pf) } else if (Tn) Lo.add(tIe(n, [Tn], Ae, h)); else if (un) nie(un, n.typeArguments, !0, h); else { let Jt = Pr(a, Cn => Zre(Cn, J)); Jt.length === 0 ? Lo.add(xQe(n, a, J, h)) : Lo.add(tIe(n, Jt, Ae, h)) } return Nn; function cn(Jt, Cn) { var Rn, Br; let Hr = It, qi = Tn, wa = un, Xc = ((Br = (Rn = Jt.declaration) == null ? void 0 : Rn.symbol) == null ? void 0 : Br.declarations) || Je, Hd = Xc.length > 1 ? wr(Xc, ji => Ds(ji) && Pf(ji.body)) : void 0; if (Hd) { let ji = ip(Hd), In = !ji.typeParameters; rr([ji], Zu, In) && Ao(Cn, hr(Hd, _.The_call_would_have_succeeded_against_this_implementation_but_implementation_signatures_of_overloads_are_not_externally_visible)) } It = Hr, Tn = qi, un = wa } function rr(Jt, Cn, Rn, Br = !1) { if (It = void 0, Tn = void 0, un = void 0, Rn) { let Hr = Jt[0]; if (vt(J) || !$B(n, Ae, Hr, Br)) return; if (FM(n, Ae, Hr, Cn, 0, !1, void 0)) { It = [Hr]; return } return Hr } for (let Hr = 0; Hr < Jt.length; Hr++) { let qi = Jt[Hr]; if (!Zre(qi, J) || !$B(n, Ae, qi, Br)) continue; let wa, Xc; if (qi.typeParameters) { let pf; if (vt(J)) { if (pf = nie(qi, J, !1), !pf) { un = qi; continue } } else Xc = _D(qi.typeParameters, qi, Yn(n) ? 2 : 0), pf = eie(n, qi, Ae, tt | 8, Xc), tt |= Xc.flags & 4 ? 8 : 0; if (wa = eD(qi, pf, Yn(qi.declaration), Xc && Xc.inferredTypeParameters), AD(qi) && !$B(n, Ae, wa, Br)) { Tn = wa; continue } } else wa = qi; if (FM(n, Ae, wa, Cn, tt, !1, void 0)) { (It || (It = [])).push(wa); continue } if (tt) { if (tt = u & 32, Xc) { let pf = eie(n, qi, Ae, tt, Xc); if (wa = eD(qi, pf, Yn(qi.declaration), Xc.inferredTypeParameters), AD(qi) && !$B(n, Ae, wa, Br)) { Tn = wa; continue } } if (FM(n, Ae, wa, Cn, tt, !1, void 0)) { (It || (It = [])).push(wa); continue } } return Jt[Hr] = wa, wa } } } function AQe(n, a, c, u, p) { return L.assert(a.length > 0), zC(n), u || a.length === 1 || a.some(h => !!h.typeParameters) ? LQe(n, a, c, p) : CQe(a) } function CQe(n) { let a = Zi(n, O => O.thisParameter), c; a.length && (c = nIe(a, a.map(UM))); let { min: u, max: p } = Nle(n, IQe), h = []; for (let O = 0; O < p; O++) { let H = Zi(n, J => Xl(J) ? O < J.parameters.length - 1 ? J.parameters[O] : To(J.parameters) : O < J.parameters.length ? J.parameters[O] : void 0); L.assert(H.length !== 0), h.push(nIe(H, Zi(n, J => tT(J, O)))) } let T = Zi(n, O => Xl(O) ? To(O.parameters) : void 0), k = 0; if (T.length !== 0) { let O = nu(Gr(Zi(n, Bxe), 2)); h.push(rIe(T, O)), k |= 1 } return n.some(_K) && (k |= 2), Am(n[0].declaration, void 0, c, h, so(n.map(qo)), void 0, u, k) } function IQe(n) { let a = n.parameters.length; return Xl(n) ? a - 1 : a } function nIe(n, a) { return rIe(n, Gr(a, 2)) } function rIe(n, a) { return qE(Vo(n), a) } function LQe(n, a, c, u) { let p = wQe(a, We === void 0 ? c.length : We), h = a[p], { typeParameters: T } = h; if (!T) return h; let k = zCe(n) ? n.typeArguments : void 0, O = k ? JG(h, kQe(k, T, Yn(n))) : DQe(n, T, h, c, u); return a[p] = O, O } function kQe(n, a, c) { let u = n.map(G1); for (; u.length > a.length;)u.pop(); for (; u.length < a.length;)u.push(jE(a[u.length]) || eu(a[u.length]) || hre(c)); return u } function DQe(n, a, c, u, p) { let h = _D(a, c, Yn(n) ? 2 : 0), T = eie(n, c, u, p | 4 | 8, h); return JG(c, T) } function wQe(n, a) { let c = -1, u = -1; for (let p = 0; p < n.length; p++) { let h = n[p], T = xd(h); if (jp(h) || T >= a) return p; T > u && (u = T, c = p) } return c } function RQe(n, a, c) { if (n.expression.kind === 106) { let O = Ire(n.expression); if (Zo(O)) { for (let H of n.arguments) Yi(H); return As } if (!Ro(O)) { let H = hp(Zc(n)); if (H) { let J = xr(O, H.typeArguments, H); return PC(n, J, a, c, 0) } } return nA(n) } let u, p = Yi(n.expression); if (dT(n)) { let O = dD(p, n.expression); u = O === p ? 0 : mI(n) ? 16 : 8, p = O } else u = 0; if (p = DCe(p, n.expression, Y$e), p === Qe) return Ql; let h = Eu(p); if (Ro(h)) return Up(n); let T = xa(h, 0), k = xa(h, 1).length; if (QB(p, h, T.length, k)) return !Ro(p) && n.typeArguments && Fe(n, _.Untyped_function_calls_may_not_accept_type_arguments), nA(n); if (!T.length) { if (k) Fe(n, _.Value_of_type_0_is_not_callable_Did_you_mean_to_include_new, Ee(p)); else { let O; if (n.arguments.length === 1) { let H = Gn(n).text; Wl(H.charCodeAt(xo(H, n.expression.end, !0) - 1)) && (O = hr(n.expression, _.Are_you_missing_a_semicolon)) } aie(n.expression, h, 0, O) } return Up(n) } return c & 8 && !n.typeArguments && T.some(OQe) ? (FIe(n, c), yc) : T.some(O => Yn(O.declaration) && !!Aj(O.declaration)) ? (Fe(n, _.Value_of_type_0_is_not_callable_Did_you_mean_to_include_new, Ee(p)), Up(n)) : PC(n, T, a, c, u) } function OQe(n) { return !!(n.typeParameters && Jie(qo(n))) } function QB(n, a, c, u) { return Zo(n) || Zo(a) && !!(n.flags & 262144) || !c && !u && !(a.flags & 1048576) && !(O_(a).flags & 131072) && to(n, Hs) } function NQe(n, a, c) { if (n.arguments && R < 1) { let T = YB(n.arguments); T >= 0 && Fe(n.arguments[T], _.Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_5_and_higher) } let u = NC(n.expression); if (u === Qe) return Ql; if (u = Eu(u), Ro(u)) return Up(n); if (Zo(u)) return n.typeArguments && Fe(n, _.Untyped_function_calls_may_not_accept_type_arguments), nA(n); let p = xa(u, 1); if (p.length) { if (!PQe(n, p[0])) return Up(n); if (iIe(p, k => !!(k.flags & 4))) return Fe(n, _.Cannot_create_an_instance_of_an_abstract_class), Up(n); let T = u.symbol && Nh(u.symbol); return T && Mr(T, 256) ? (Fe(n, _.Cannot_create_an_instance_of_an_abstract_class), Up(n)) : PC(n, p, a, c, 0) } let h = xa(u, 0); if (h.length) { let T = PC(n, h, a, c, 0); return ge || (T.declaration && !cp(T.declaration) && qo(T) !== yt && Fe(n, _.Only_a_void_function_can_be_called_with_the_new_keyword), Yb(T) === yt && Fe(n, _.A_function_that_is_called_with_the_new_keyword_cannot_have_a_this_type_that_is_void)), T } return aie(n.expression, u, 1), Up(n) } function iIe(n, a) { return ba(n) ? vt(n, c => iIe(c, a)) : n.compositeKind === 1048576 ? vt(n.compositeSignatures, a) : a(n) } function iie(n, a) { let c = _o(a); if (!Fn(c)) return !1; let u = c[0]; if (u.flags & 2097152) { let p = u.types, h = Axe(p), T = 0; for (let k of u.types) { if (!h[T] && Ur(k) & 3 && (k.symbol === n || iie(n, k))) return !0; T++ } return !1 } return u.symbol === n ? !0 : iie(n, u) } function PQe(n, a) { if (!a || !a.declaration) return !0; let c = a.declaration, u = hS(c, 24); if (!u || c.kind !== 173) return !0; let p = Nh(c.parent.symbol), h = gs(c.parent.symbol); if (!Hie(n, p)) { let T = Zc(n); if (T && u & 16) { let k = G1(T); if (iie(c.parent.symbol, k)) return !0 } return u & 8 && Fe(n, _.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration, Ee(h)), u & 16 && Fe(n, _.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration, Ee(h)), !1 } return !0 } function aIe(n, a, c) { let u, p = c === 0, h = rT(a), T = h && xa(h, c).length > 0; if (a.flags & 1048576) { let O = a.types, H = !1; for (let J of O) if (xa(J, c).length !== 0) { if (H = !0, u) break } else if (u || (u = da(u, p ? _.Type_0_has_no_call_signatures : _.Type_0_has_no_construct_signatures, Ee(J)), u = da(u, p ? _.Not_all_constituents_of_type_0_are_callable : _.Not_all_constituents_of_type_0_are_constructable, Ee(a))), H) break; H || (u = da(void 0, p ? _.No_constituent_of_type_0_is_callable : _.No_constituent_of_type_0_is_constructable, Ee(a))), u || (u = da(u, p ? _.Each_member_of_the_union_type_0_has_signatures_but_none_of_those_signatures_are_compatible_with_each_other : _.Each_member_of_the_union_type_0_has_construct_signatures_but_none_of_those_signatures_are_compatible_with_each_other, Ee(a))) } else u = da(u, p ? _.Type_0_has_no_call_signatures : _.Type_0_has_no_construct_signatures, Ee(a)); let k = p ? _.This_expression_is_not_callable : _.This_expression_is_not_constructable; if (Pa(n.parent) && n.parent.arguments.length === 0) { let { resolvedSymbol: O } = Rr(n); O && O.flags & 32768 && (k = _.This_expression_is_not_callable_because_it_is_a_get_accessor_Did_you_mean_to_use_it_without) } return { messageChain: da(u, k), relatedMessage: T ? _.Did_you_forget_to_use_await : void 0 } } function aie(n, a, c, u) { let { messageChain: p, relatedMessage: h } = aIe(n, a, c), T = Lh(Gn(n), n, p); if (h && Ao(T, hr(n, h)), Pa(n.parent)) { let { start: k, length: O } = eIe(n.parent, !0); T.start = k, T.length = O } Lo.add(T), oIe(a, c, u ? Ao(T, u) : T) } function oIe(n, a, c) { if (!n.symbol) return; let u = Ai(n.symbol).originatingImport; if (u && !Dd(u)) { let p = xa(zn(Ai(n.symbol).target), a); if (!p || !p.length) return; Ao(c, hr(u, _.Type_originates_at_this_import_A_namespace_style_import_cannot_be_called_or_constructed_and_will_cause_a_failure_at_runtime_Consider_using_a_default_import_or_import_require_here_instead)) } } function MQe(n, a, c) { let u = Yi(n.tag), p = Eu(u); if (Ro(p)) return Up(n); let h = xa(p, 0), T = xa(p, 1).length; if (QB(u, p, h.length, T)) return nA(n); if (!h.length) { if (fu(n.parent)) { let k = hr(n.tag, _.It_is_likely_that_you_are_missing_a_comma_to_separate_these_two_template_expressions_They_form_a_tagged_template_expression_which_cannot_be_invoked); return Lo.add(k), Up(n) } return aie(n.tag, p, 0), Up(n) } return PC(n, h, a, c, 0) } function FQe(n) { switch (n.parent.kind) { case 260: case 228: return _.Unable_to_resolve_signature_of_class_decorator_when_called_as_an_expression; case 166: return _.Unable_to_resolve_signature_of_parameter_decorator_when_called_as_an_expression; case 169: return _.Unable_to_resolve_signature_of_property_decorator_when_called_as_an_expression; case 171: case 174: case 175: return _.Unable_to_resolve_signature_of_method_decorator_when_called_as_an_expression; default: return L.fail() } } function GQe(n, a, c) { let u = Yi(n.expression), p = Eu(u); if (Ro(p)) return Up(n); let h = xa(p, 0), T = xa(p, 1).length; if (QB(u, p, h.length, T)) return nA(n); if (UQe(n, h) && !ud(n.expression)) { let O = Qc(n.expression, !1); return Fe(n, _._0_accepts_too_few_arguments_to_be_used_as_a_decorator_here_Did_you_mean_to_call_it_first_and_write_0, O), Up(n) } let k = FQe(n); if (!h.length) { let O = aIe(n.expression, p, 0), H = da(O.messageChain, k), J = Lh(Gn(n.expression), n.expression, H); return O.relatedMessage && Ao(J, hr(n.expression, O.relatedMessage)), Lo.add(J), oIe(p, 0, J), Up(n) } return PC(n, h, a, c, 0, k) } function ZB(n, a) { let c = tA(n), u = c && Gd(c), p = u && yd(u, Qd.Element, 788968), h = p && Be.symbolToEntityName(p, 788968, n), T = D.createFunctionTypeNode(void 0, [D.createParameterDeclaration(void 0, void 0, "props", void 0, Be.typeToTypeNode(a, n))], h ? D.createTypeReferenceNode(h, void 0) : D.createKeywordTypeNode(131)), k = wo(1, "props"); return k.links.type = a, Am(T, void 0, void 0, [k], p ? gs(p) : ve, void 0, 1, 0) } function BQe(n, a, c) { if (OC(n.tagName)) { let T = ACe(n), k = ZB(n, T); return Ly(rA(n.attributes, VB(k, n), void 0, 0), T, n.tagName, n.attributes), Fn(n.typeArguments) && (mn(n.typeArguments, qa), Lo.add(RA(Gn(n), n.typeArguments, _.Expected_0_type_arguments_but_got_1, 0, Fn(n.typeArguments)))), k } let u = Yi(n.tagName), p = Eu(u); if (Ro(p)) return Up(n); let h = SCe(u, n); return QB(u, p, h.length, 0) ? nA(n) : h.length === 0 ? (Fe(n.tagName, _.JSX_element_type_0_does_not_have_any_construct_or_call_signatures, Qc(n.tagName)), Up(n)) : PC(n, h, a, c, 0) } function UQe(n, a) { return a.length && Ji(a, c => c.minArgumentCount === 0 && !Xl(c) && c.parameters.length < ZCe(n, c)) } function VQe(n, a, c) { switch (n.kind) { case 210: return RQe(n, a, c); case 211: return NQe(n, a, c); case 212: return MQe(n, a, c); case 167: return GQe(n, a, c); case 283: case 282: return BQe(n, a, c) }throw L.assertNever(n, "Branch in 'resolveSignature' should be unreachable.") } function MC(n, a, c) { let u = Rr(n), p = u.resolvedSignature; if (p && p !== yc && !a) return p; u.resolvedSignature = yc; let h = VQe(n, a, c || 0); return h !== yc && (u.resolvedSignature = sn === Dn ? h : p), h } function cp(n) { var a; if (!n || !Yn(n)) return !1; let c = Jc(n) || ms(n) ? n : (wi(n) || yl(n)) && n.initializer && ms(n.initializer) ? n.initializer : void 0; if (c) { if (Aj(n)) return !0; if (yl(qy(c.parent))) return !1; let u = fr(c); return !!((a = u?.members) != null && a.size) } return !1 } function oie(n, a) { var c, u; if (a) { let p = Ai(a); if (!p.inferredClassSymbol || !p.inferredClassSymbol.has($a(n))) { let h = Zp(n) ? n : Pb(n); return h.exports = h.exports || Ua(), h.members = h.members || Ua(), h.flags |= a.flags & 32, (c = a.exports) != null && c.size && ll(h.exports, a.exports), (u = a.members) != null && u.size && ll(h.members, a.members), (p.inferredClassSymbol || (p.inferredClassSymbol = new Map)).set($a(h), h), h } return p.inferredClassSymbol.get($a(n)) } } function jQe(n) { var a; let c = n && eU(n, !0), u = (a = c?.exports) == null ? void 0 : a.get("prototype"), p = u?.valueDeclaration && HQe(u.valueDeclaration); return p ? fr(p) : void 0 } function eU(n, a) { if (!n.parent) return; let c, u; if (wi(n.parent) && n.parent.initializer === n) { if (!Yn(n) && !(kh(n.parent) && Ds(n))) return; c = n.parent.name, u = n.parent } else if (ar(n.parent)) { let p = n.parent, h = n.parent.operatorToken.kind; if (h === 63 && (a || p.right === n)) c = p.left, u = c; else if ((h === 56 || h === 60) && (wi(p.parent) && p.parent.initializer === p ? (c = p.parent.name, u = p.parent) : ar(p.parent) && p.parent.operatorToken.kind === 63 && (a || p.parent.right === p) && (c = p.parent.left, u = c), !c || !cS(c) || !BA(c, p.left))) return } else a && Jc(n) && (c = n.name, u = n); if (!(!u || !c || !a && !ob(n, ub(c)))) return vd(u) } function HQe(n) { if (!n.parent) return !1; let a = n.parent; for (; a && a.kind === 208;)a = a.parent; if (a && ar(a) && ub(a.left) && a.operatorToken.kind === 63) { let c = OH(a); return rs(c) && c } } function WQe(n, a) { var c, u, p; a8(n, n.typeArguments); let h = MC(n, void 0, a); if (h === yc) return Qe; if (tU(h, n), n.expression.kind === 106) return yt; if (n.kind === 211) { let k = h.declaration; if (k && k.kind !== 173 && k.kind !== 177 && k.kind !== 182 && !(X0(k) && ((u = (c = OI(k)) == null ? void 0 : c.parent) == null ? void 0 : u.kind) === 173) && !jA(k) && !cp(k)) return ge && Fe(n, _.new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type), Se } if (Yn(n) && $s(Y) !== 100 && dIe(n)) return Fxe(n.arguments[0]); let T = qo(h); if (T.flags & 12288 && sIe(n)) return wne(qy(n.parent)); if (n.kind === 210 && !n.questionDotToken && n.parent.kind === 241 && T.flags & 16384 && Lf(h)) { if (!WI(n.expression)) Fe(n.expression, _.Assertions_require_the_call_target_to_be_an_identifier_or_qualified_name); else if (!OB(n)) { let k = Fe(n.expression, _.Assertions_require_every_name_in_the_call_target_to_be_declared_with_an_explicit_type_annotation); CM(n.expression, k) } } if (Yn(n)) { let k = eU(n, !1); if ((p = k?.exports) != null && p.size) { let O = ls(k, k.exports, Je, Je, Je); return O.objectFlags |= 4096, so([T, O]) } } return T } function tU(n, a) { if (n.declaration && n.declaration.flags & 268435456) { let c = BM(a), u = kR(P6(a)); g1(c, n.declaration, u, ne(n)) } } function BM(n) { switch (n = vs(n), n.kind) { case 210: case 167: case 211: return BM(n.expression); case 212: return BM(n.tag); case 283: case 282: return BM(n.tagName); case 209: return n.argumentExpression; case 208: return n.name; case 180: let a = n; return Yu(a.typeName) ? a.typeName.right : a; default: return n } } function sIe(n) { if (!Pa(n)) return !1; let a = n.expression; if (br(a) && a.name.escapedText === "for" && (a = a.expression), !Re(a) || a.escapedText !== "Symbol") return !1; let c = rAe(!1); return c ? c === zs(a, "Symbol", 111551, void 0, void 0, !1) : !1 } function zQe(n) { if (cit(n), n.arguments.length === 0) return HM(n, Se); let a = n.arguments[0], c = Ic(a), u = n.arguments.length > 1 ? Ic(n.arguments[1]) : void 0; for (let h = 2; h < n.arguments.length; ++h)Ic(n.arguments[h]); if ((c.flags & 32768 || c.flags & 65536 || !to(c, ae)) && Fe(a, _.Dynamic_import_s_specifier_must_be_of_type_string_but_here_has_type_0, Ee(c)), u) { let h = nAe(!0); h !== Ki && wu(u, TB(h, 32768), n.arguments[1]) } let p = Gl(n, a); if (p) { let h = Jb(p, a, !0, !1); if (h) return HM(n, lIe(zn(h), h, p, a) || uIe(zn(h), h, p, a)) } return HM(n, Se) } function cIe(n, a, c) { let u = Ua(), p = wo(2097152, "default"); return p.parent = a, p.links.nameType = ff("default"), p.links.aliasTarget = Ac(n), u.set("default", p), ls(c, u, Je, Je, Je) } function lIe(n, a, c, u) { if (cs(u) && n && !Ro(n)) { let h = n; if (!h.defaultOnlyType) { let T = cIe(a, c); h.defaultOnlyType = T } return h.defaultOnlyType } } function uIe(n, a, c, u) { var p; if (Z && n && !Ro(n)) { let h = n; if (!h.syntheticType) { let T = (p = c.declarations) == null ? void 0 : p.find(Li); if (ny(T, c, !1, u)) { let O = wo(2048, "__type"), H = cIe(a, c, O); O.links.type = H, h.syntheticType = RM(n) ? e0(n, H, O, 0, !1) : H } else h.syntheticType = n } return h.syntheticType } return n } function dIe(n) { if (!qu(n, !0)) return !1; if (!Re(n.expression)) return L.fail(); let a = zs(n.expression, n.expression.escapedText, 111551, void 0, void 0, !0); if (a === ct) return !0; if (a.flags & 2097152) return !1; let c = a.flags & 16 ? 259 : a.flags & 3 ? 257 : 0; if (c !== 0) { let u = nc(a, c); return !!u && !!(u.flags & 16777216) } return !1 } function JQe(n) { Ort(n) || a8(n, n.typeArguments), R < 2 && Hc(n, 262144); let a = MC(n); return tU(a, n), qo(a) } function KQe(n) { if (n.kind === 213) { let a = Gn(n); a && $c(a.fileName, [".cts", ".mts"]) && an(n, _.This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Use_an_as_expression_instead) } return fIe(n, n.type, n.expression) } function sie(n) { switch (n.kind) { case 10: case 14: case 8: case 9: case 110: case 95: case 206: case 207: case 225: return !0; case 214: return sie(n.expression); case 221: let a = n.operator, c = n.operand; return a === 40 && (c.kind === 8 || c.kind === 9) || a === 39 && c.kind === 8; case 208: case 209: let u = vs(n.expression), p = bc(u) ? uc(u, 111551, !0) : void 0; return !!(p && p.flags & 384) }return !1 } function fIe(n, a, c, u) { let p = Yi(c, u); if (Ch(a)) return sie(c) || Fe(c, _.A_const_assertions_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array_or_object_literals), Hu(p); qa(a), p = EM(ky(p)); let h = $r(a); return Ro(h) || i(() => { let T = Sd(p); _B(h, T) || e2e(p, h, n, _.Conversion_of_type_0_to_type_1_may_be_a_mistake_because_neither_type_sufficiently_overlaps_with_the_other_If_this_was_intentional_convert_the_expression_to_unknown_first) }), h } function qQe(n) { let a = Yi(n.expression), c = dD(a, n.expression); return SB(yg(c), n, c !== a) } function XQe(n) { return n.flags & 32 ? qQe(n) : yg(Yi(n.expression)) } function _Ie(n) { ake(n), mn(n.typeArguments, qa); let a = n.kind === 230 ? Yi(n.expression) : LT(n.exprName) ? kM(n.exprName) : Yi(n.exprName); return pIe(a, n) } function pIe(n, a) { let c = a.typeArguments; if (n === Qe || Ro(n) || !vt(c)) return n; let u = !1, p, h = k(n), T = u ? p : n; return T && Lo.add(RA(Gn(a), c, _.Type_0_has_no_signatures_for_which_the_type_argument_list_is_applicable, Ee(T))), h; function k(H) { let J = !1, de = !1, Ae = xe(H); return u || (u = de), J && !de && (p ?? (p = H)), Ae; function xe(tt) { if (tt.flags & 524288) { let It = R_(tt), Tn = O(It.callSignatures), un = O(It.constructSignatures); if (J || (J = It.callSignatures.length !== 0 || It.constructSignatures.length !== 0), de || (de = Tn.length !== 0 || un.length !== 0), Tn !== It.callSignatures || un !== It.constructSignatures) { let Nn = ls(void 0, It.members, Tn, un, It.indexInfos); return Nn.objectFlags |= 8388608, Nn.node = a, Nn } } else if (tt.flags & 58982400) { let It = bu(tt); if (It) { let Tn = xe(It); if (Tn !== It) return Tn } } else { if (tt.flags & 1048576) return Ls(tt, k); if (tt.flags & 2097152) return so(Tl(tt.types, xe)) } return tt } } function O(H) { let J = Pr(H, de => !!de.typeParameters && Zre(de, c)); return Tl(J, de => { let Ae = nie(de, c, !0); return Ae ? eD(de, Ae, Yn(de.declaration)) : de }) } } function YQe(n) { return qa(n.type), cie(n.expression, n.type) } function cie(n, a, c) { let u = Yi(n, c), p = $r(a); return Ro(p) ? p : (Ly(u, p, a, n, _.Type_0_does_not_satisfy_the_expected_type_1), u) } function $Qe(n) { return Xrt(n), n.keywordToken === 103 ? lie(n) : n.keywordToken === 100 ? QQe(n) : L.assertNever(n.keywordToken) } function mIe(n) { switch (n.keywordToken) { case 100: return tAe(); case 103: let a = lie(n); return Ro(a) ? ve : hZe(a); default: L.assertNever(n.keywordToken) } } function lie(n) { let a = oce(n); if (a) if (a.kind === 173) { let c = fr(a.parent); return zn(c) } else { let c = fr(a); return zn(c) } else return Fe(n, _.Meta_property_0_is_only_allowed_in_the_body_of_a_function_declaration_function_expression_or_constructor, "new.target"), ve } function QQe(n) { ie === 100 || ie === 199 ? Gn(n).impliedNodeFormat !== 99 && Fe(n, _.The_import_meta_meta_property_is_not_allowed_in_files_which_will_build_into_CommonJS_output) : ie < 6 && ie !== 4 && Fe(n, _.The_import_meta_meta_property_is_only_allowed_when_the_module_option_is_es2020_es2022_esnext_system_node16_or_nodenext); let a = Gn(n); return L.assert(!!(a.flags & 4194304), "Containing file is missing import meta node flag."), n.name.escapedText === "meta" ? eAe() : ve } function UM(n) { let a = zn(n); if (U) { let c = n.valueDeclaration; if (c && Jy(c)) return gg(a) } return a } function nU(n) { return L.assert(Re(n.name)), n.name.escapedText } function FC(n, a, c) { let u = n.parameters.length - (Xl(n) ? 1 : 0); if (a < u) return n.parameters[a].escapedName; let p = n.parameters[u] || Ht, h = c || zn(p); if (po(h)) { let T = h.target.labeledElementDeclarations, k = a - u; return T && nU(T[k]) || p.escapedName + "_" + k } return p.escapedName } function ZQe(n, a) { var c; if (((c = n.declaration) == null ? void 0 : c.kind) === 320) return; let u = n.parameters.length - (Xl(n) ? 1 : 0); if (a < u) { let T = n.parameters[a]; return hIe(T) ? [T.escapedName, !1] : void 0 } let p = n.parameters[u] || Ht; if (!hIe(p)) return; let h = zn(p); if (po(h)) { let T = h.target.labeledElementDeclarations, k = a - u, O = T?.[k], H = !!O?.dotDotDotToken; return O ? [nU(O), H] : void 0 } if (a === u) return [p.escapedName, !0] } function hIe(n) { return n.valueDeclaration && ha(n.valueDeclaration) && Re(n.valueDeclaration.name) } function gIe(n) { return n.kind === 199 || ha(n) && n.name && Re(n.name) } function eZe(n, a) { let c = n.parameters.length - (Xl(n) ? 1 : 0); if (a < c) { let h = n.parameters[a].valueDeclaration; return h && gIe(h) ? h : void 0 } let u = n.parameters[c] || Ht, p = zn(u); if (po(p)) { let h = p.target.labeledElementDeclarations, T = a - c; return h && h[T] } return u.valueDeclaration && gIe(u.valueDeclaration) ? u.valueDeclaration : void 0 } function P_(n, a) { return tT(n, a) || Se } function tT(n, a) { let c = n.parameters.length - (Xl(n) ? 1 : 0); if (a < c) return UM(n.parameters[a]); if (Xl(n)) { let u = zn(n.parameters[c]), p = a - c; if (!po(u) || u.target.hasRestElement || p < u.target.fixedLength) return od(u, op(p)) } } function SD(n, a) { let c = xd(n), u = Vp(n), p = xD(n); if (p && a >= c - 1) return a === c - 1 ? p : nu(od(p, rt)); let h = [], T = [], k = []; for (let O = a; O < c; O++) { !p || O < c - 1 ? (h.push(P_(n, O)), T.push(O < u ? 1 : 2)) : (h.push(p), T.push(8)); let H = eZe(n, O); H && k.push(H) } return ap(h, T, !1, Fn(k) === Fn(h) ? k : void 0) } function xd(n) { let a = n.parameters.length; if (Xl(n)) { let c = zn(n.parameters[a - 1]); if (po(c)) return a + c.target.fixedLength - (c.target.hasRestElement ? 0 : 1) } return a } function Vp(n, a) { let c = a & 1, u = a & 2; if (u || n.resolvedMinArgumentCount === void 0) { let p; if (Xl(n)) { let h = zn(n.parameters[n.parameters.length - 1]); if (po(h)) { let T = Yc(h.target.elementFlags, O => !(O & 1)), k = T < 0 ? h.target.fixedLength : T; k > 0 && (p = n.parameters.length - 1 + k) } } if (p === void 0) { if (!c && n.flags & 32) return 0; p = n.minArgumentCount } if (u) return p; for (let h = p - 1; h >= 0; h--) { let T = P_(n, h); if (jc(T, JCe).flags & 131072) break; p = h } n.resolvedMinArgumentCount = p } return n.resolvedMinArgumentCount } function jp(n) { if (Xl(n)) { let a = zn(n.parameters[n.parameters.length - 1]); return !po(a) || a.target.hasRestElement } return !1 } function xD(n) { if (Xl(n)) { let a = zn(n.parameters[n.parameters.length - 1]); if (!po(a)) return a; if (a.target.hasRestElement) return EC(a, a.target.fixedLength) } } function AD(n) { let a = xD(n); return a && !_f(a) && !Zo(a) && !(O_(a).flags & 131072) ? a : void 0 } function uie(n) { return die(n, lt) } function die(n, a) { return n.parameters.length > 0 ? P_(n, 0) : a } function tZe(n, a, c) { let u = n.parameters.length - (Xl(n) ? 1 : 0); for (let p = 0; p < u; p++) { let h = n.parameters[p].valueDeclaration; if (h.type) { let T = Cl(h); T && gh(c.inferences, $r(T), P_(a, p)) } } } function nZe(n, a) { if (a.typeParameters) if (!n.typeParameters) n.typeParameters = a.typeParameters; else return; if (a.thisParameter) { let u = n.thisParameter; (!u || u.valueDeclaration && !u.valueDeclaration.type) && (u || (n.thisParameter = qE(a.thisParameter, void 0)), VM(n.thisParameter, zn(a.thisParameter))) } let c = n.parameters.length - (Xl(n) ? 1 : 0); for (let u = 0; u < c; u++) { let p = n.parameters[u]; if (!Cl(p.valueDeclaration)) { let h = tT(a, u); VM(p, h) } } if (Xl(n)) { let u = To(n.parameters); if (u.valueDeclaration ? !Cl(u.valueDeclaration) : ac(u) & 65536) { let p = SD(a, c); VM(u, p) } } } function rZe(n) { n.thisParameter && VM(n.thisParameter); for (let a of n.parameters) VM(a) } function VM(n, a) { let c = Ai(n); if (c.type) a && L.assertEqual(c.type, a, "Parameter symbol already has a cached type which differs from newly assigned type"); else { let u = n.valueDeclaration; c.type = a || (u ? Zs(u, !0) : zn(n)), u && u.name.kind !== 79 && (c.type === ue && (c.type = oo(u.name)), yIe(u.name, c.type)) } } function yIe(n, a) { for (let c of n.elements) if (!ol(c)) { let u = li(c, a); c.name.kind === 79 ? Ai(fr(c)).type = u : yIe(c.name, u) } } function iZe(n) { return zx(IKe(!0), [n]) } function aZe(n, a) { return zx(LKe(!0), [n, a]) } function oZe(n, a) { return zx(kKe(!0), [n, a]) } function sZe(n, a) { return zx(DKe(!0), [n, a]) } function cZe(n, a) { return zx(wKe(!0), [n, a]) } function lZe(n, a) { return zx(NKe(!0), [n, a]) } function uZe(n, a, c) { let u = `${a ? "p" : "P"}${c ? "s" : "S"}${n.id}`, p = An.get(u); if (!p) { let h = Ua(); h.set("name", gE("name", n)), h.set("private", gE("private", a ? pe : Ke)), h.set("static", gE("static", c ? pe : Ke)), p = ls(void 0, h, Je, Je, Je), An.set(u, p) } return p } function vIe(n, a, c) { let u = zc(n), p = pi(n.name), h = p ? ff(vr(n.name)) : pg(n.name), T = Nc(n) ? aZe(a, c) : p_(n) ? oZe(a, c) : Sf(n) ? sZe(a, c) : Id(n) ? cZe(a, c) : Na(n) ? lZe(a, c) : L.failBadSyntaxKind(n), k = uZe(h, p, u); return so([T, k]) } function dZe(n, a) { return zx(RKe(!0), [n, a]) } function fZe(n, a) { return zx(OKe(!0), [n, a]) } function _Ze(n, a) { let c = A_("this", n), u = A_("value", a); return Cie(void 0, c, [u], a, void 0, 1) } function fie(n, a, c) { let u = A_("target", n), p = A_("context", a), h = Gr([c, yt]); return OD(void 0, void 0, [u, p], h) } function pZe(n) { let { parent: a } = n, c = Rr(a); if (!c.decoratorSignature) switch (c.decoratorSignature = As, a.kind) { case 260: case 228: { let p = zn(fr(a)), h = iZe(p); c.decoratorSignature = fie(p, h, p); break } case 171: case 174: case 175: { let u = a; if (!Yr(u.parent)) break; let p = Nc(u) ? HE(ip(u)) : G1(u), h = zc(u) ? zn(fr(u.parent)) : vu(fr(u.parent)), T = p_(u) ? $Ie(p) : Sf(u) ? QIe(p) : p, k = vIe(u, h, p), O = p_(u) ? $Ie(p) : Sf(u) ? QIe(p) : p; c.decoratorSignature = fie(T, k, O); break } case 169: { let u = a; if (!Yr(u.parent)) break; let p = G1(u), h = zc(u) ? zn(fr(u.parent)) : vu(fr(u.parent)), T = rm(u) ? dZe(h, p) : Oe, k = vIe(u, h, p), O = rm(u) ? fZe(h, p) : _Ze(h, p); c.decoratorSignature = fie(T, k, O); break } }return c.decoratorSignature === As ? void 0 : c.decoratorSignature } function mZe(n) { let { parent: a } = n, c = Rr(a); if (!c.decoratorSignature) switch (c.decoratorSignature = As, a.kind) { case 260: case 228: { let p = zn(fr(a)), h = A_("target", p); c.decoratorSignature = OD(void 0, void 0, [h], Gr([p, yt])); break } case 166: { let u = a; if (!Ec(u.parent) && !(Nc(u.parent) || Sf(u.parent) && Yr(u.parent.parent)) || F0(u.parent) === u) break; let p = F0(u.parent) ? u.parent.parameters.indexOf(u) - 1 : u.parent.parameters.indexOf(u); L.assert(p >= 0); let h = Ec(u.parent) ? zn(fr(u.parent.parent)) : qLe(u.parent), T = Ec(u.parent) ? Oe : XLe(u.parent), k = op(p), O = A_("target", h), H = A_("propertyKey", T), J = A_("parameterIndex", k); c.decoratorSignature = OD(void 0, void 0, [O, H, J], yt); break } case 171: case 174: case 175: case 169: { let u = a; if (!Yr(u.parent)) break; let p = qLe(u), h = A_("target", p), T = XLe(u), k = A_("propertyKey", T), O = Na(u) ? yt : sAe(G1(u)); if (R !== 0 && (!Na(a) || rm(a))) { let J = sAe(G1(u)), de = A_("descriptor", J); c.decoratorSignature = OD(void 0, void 0, [h, k, de], Gr([O, yt])) } else c.decoratorSignature = OD(void 0, void 0, [h, k], Gr([O, yt])); break } }return c.decoratorSignature === As ? void 0 : c.decoratorSignature } function _ie(n) { return $ ? mZe(n) : pZe(n) } function jM(n) { let a = oM(!0); return a !== ro ? (n = bg(UC(n)) || ue, _g(a, [n])) : ue } function bIe(n) { let a = aAe(!0); return a !== ro ? (n = bg(UC(n)) || ue, _g(a, [n])) : ue } function HM(n, a) { let c = jM(a); return c === ue ? (Fe(n, Dd(n) ? _.A_dynamic_import_call_returns_a_Promise_Make_sure_you_have_a_declaration_for_Promise_or_include_ES2015_in_your_lib_option : _.An_async_function_or_method_must_return_a_Promise_Make_sure_you_have_a_declaration_for_Promise_or_include_ES2015_in_your_lib_option), ve) : (_ne(!0) || Fe(n, Dd(n) ? _.A_dynamic_import_call_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option : _.An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option), c) } function hZe(n) { let a = wo(0, "NewTargetExpression"), c = wo(4, "target", 8); c.parent = a, c.links.type = n; let u = Ua([c]); return a.members = u, ls(a, u, Je, Je, Je) } function rU(n, a) { if (!n.body) return ve; let c = pl(n), u = (c & 2) !== 0, p = (c & 1) !== 0, h, T, k, O = yt; if (n.body.kind !== 238) h = Ic(n.body, a && a & -9), u && (h = UC(RD(h, !1, n, _.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member))); else if (p) { let H = CIe(n, a); H ? H.length > 0 && (h = Gr(H, 2)) : O = lt; let { yieldTypes: J, nextTypes: de } = gZe(n, a); T = vt(J) ? Gr(J, 2) : void 0, k = vt(de) ? so(de) : void 0 } else { let H = CIe(n, a); if (!H) return c & 2 ? HM(n, lt) : lt; if (H.length === 0) return c & 2 ? HM(n, yt) : yt; h = Gr(H, 2) } if (h || T || k) { if (T && CB(n, T, 3), h && CB(n, h, 1), k && CB(n, k, 2), h && N_(h) || T && N_(T) || k && N_(k)) { let H = Nre(n), J = H ? H === ip(n) ? p ? void 0 : h : BB(qo(H), n, void 0) : void 0; p ? (T = Zne(T, J, 0, u), h = Zne(h, J, 1, u), k = Zne(k, J, 2, u)) : h = CXe(h, J, u) } T && (T = Sd(T)), h && (h = Sd(h)), k && (k = Sd(k)) } return p ? EIe(T || lt, h || O, k || cCe(2, n) || ue, u) : u ? jM(h || O) : h || O } function EIe(n, a, c, u) { let p = u ? ft : Yt, h = p.getGlobalGeneratorType(!1); if (n = p.resolveIterationType(n, void 0) || ue, a = p.resolveIterationType(a, void 0) || ue, c = p.resolveIterationType(c, void 0) || ue, h === ro) { let T = p.getGlobalIterableIteratorType(!1), k = T !== ro ? pLe(T, p) : void 0, O = k ? k.returnType : Se, H = k ? k.nextType : Oe; return to(a, O) && to(H, c) ? T !== ro ? rD(T, [n]) : (p.getGlobalIterableIteratorType(!0), Ki) : (p.getGlobalGeneratorType(!0), Ki) } return rD(h, [n, a, c]) } function gZe(n, a) { let c = [], u = [], p = (pl(n) & 2) !== 0; return Yse(n.body, h => { let T = h.expression ? Yi(h.expression, a) : je; Of(c, TIe(h, T, Se, p)); let k; if (h.asteriskToken) { let O = _U(T, p ? 19 : 17, h.expression); k = O && O.nextType } else k = Ru(h, void 0); k && Of(u, k) }), { yieldTypes: c, nextTypes: u } } function TIe(n, a, c, u) { let p = n.expression || n, h = n.asteriskToken ? wy(u ? 19 : 17, a, c, p) : a; return u ? rT(h, p, n.asteriskToken ? _.Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member : _.Type_of_yield_operand_in_an_async_generator_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member) : h } function SIe(n, a, c) { let u = 0; for (let p = 0; p < c.length; p++) { let h = p < n || p >= a ? c[p] : void 0; u |= h !== void 0 ? fF.get(h) || 32768 : 0 } return u } function xIe(n) { let a = Rr(n); if (a.isExhaustive === void 0) { a.isExhaustive = 0; let c = yZe(n); a.isExhaustive === 0 && (a.isExhaustive = c) } else a.isExhaustive === 0 && (a.isExhaustive = !1); return a.isExhaustive } function yZe(n) { if (n.expression.kind === 218) { let u = W2e(n); if (!u) return !1; let p = Ty(Ic(n.expression.expression)), h = SIe(0, 0, u); return p.flags & 3 ? (556800 & h) === 556800 : !yh(p, T => (iu(T) & h) === h) } let a = Ic(n.expression); if (!uD(a)) return !1; let c = DB(n); return !c.length || vt(c, SXe) ? !1 : bYe(Ls(a, Hu), c) } function AIe(n) { return n.endFlowNode && IM(n.endFlowNode) } function CIe(n, a) { let c = pl(n), u = [], p = AIe(n), h = !1; if (vT(n.body, T => { let k = T.expression; if (k) { let O = Ic(k, a && a & -9); c & 2 && (O = UC(RD(O, !1, n, _.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member))), O.flags & 131072 && (h = !0), Of(u, O) } else p = !0 }), !(u.length === 0 && !p && (h || vZe(n)))) return U && u.length && p && !(cp(n) && u.some(T => T.symbol === n.symbol)) && Of(u, Oe), u } function vZe(n) { switch (n.kind) { case 215: case 216: return !0; case 171: return n.parent.kind === 207; default: return !1 } } function pie(n, a) { i(c); return; function c() { let u = pl(n), p = a && pU(a, u); if (p && Js(p, 16385) || n.kind === 170 || rc(n.body) || n.body.kind !== 238 || !AIe(n)) return; let h = n.flags & 512, T = U_(n) || n; if (p && p.flags & 131072) Fe(T, _.A_function_returning_never_cannot_have_a_reachable_end_point); else if (p && !h) Fe(T, _.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value); else if (p && U && !to(Oe, p)) Fe(T, _.Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined); else if (Y.noImplicitReturns) { if (!p) { if (!h) return; let k = qo(ip(n)); if (ELe(n, k)) return } Fe(T, _.Not_all_code_paths_return_a_value) } } } function IIe(n, a) { if (L.assert(n.kind !== 171 || s_(n)), zC(n), ms(n) && jC(n, n.name), a && a & 4 && $f(n)) { if (!U_(n) && !b4(n)) { let u = bD(n); if (u && XE(qo(u))) { let p = Rr(n); if (p.contextFreeType) return p.contextFreeType; let h = rU(n, a), T = Am(void 0, void 0, void 0, Je, h, void 0, 0, 0), k = ls(n.symbol, q, [T], Je, Je); return k.objectFlags |= 262144, p.contextFreeType = k } } return aa } return !AU(n) && n.kind === 215 && Yie(n), bZe(n, a), zn(fr(n)) } function bZe(n, a) { let c = Rr(n); if (!(c.flags & 64)) { let u = bD(n); if (!(c.flags & 64)) { c.flags |= 64; let p = Sl(xa(zn(fr(n)), 0)); if (!p) return; if ($f(n)) if (u) { let h = M1(n), T; if (a && a & 2) { tZe(p, u, h); let k = xD(u); k && k.flags & 262144 && (T = $x(u, h.nonFixingMapper)) } T || (T = h ? $x(u, h.mapper) : u), nZe(p, T) } else rZe(p); if (u && !Hx(n) && !p.resolvedReturnType) { let h = rU(n, a); p.resolvedReturnType || (p.resolvedReturnType = h) } LD(n) } } } function EZe(n) { L.assert(n.kind !== 171 || s_(n)); let a = pl(n), c = Hx(n); if (pie(n, c), n.body) if (U_(n) || qo(ip(n)), n.body.kind === 238) qa(n.body); else { let u = Yi(n.body), p = c && pU(c, a); if (p) if ((a & 3) === 2) { let h = RD(u, !1, n.body, _.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); Ly(h, p, n.body, n.body) } else Ly(u, p, n.body, n.body) } } function iU(n, a, c, u = !1) { if (!to(a, Ja)) { let p = u && DD(a); return Tv(n, !!p && to(p, Ja), c), !1 } return !0 } function TZe(n) { if (!Pa(n) || !sS(n)) return !1; let a = Ic(n.arguments[2]); if (Vc(a, "value")) { let p = ja(a, "writable"), h = p && zn(p); if (!h || h === Ke || h === oe) return !0; if (p && p.valueDeclaration && yl(p.valueDeclaration)) { let T = p.valueDeclaration.initializer, k = Yi(T); if (k === Ke || k === oe) return !0 } return !1 } return !ja(a, "set") } function M_(n) { return !!(ac(n) & 8 || n.flags & 4 && Ef(n) & 64 || n.flags & 3 && WB(n) & 2 || n.flags & 98304 && !(n.flags & 65536) || n.flags & 8 || vt(n.declarations, TZe)) } function LIe(n, a, c) { var u, p; if (c === 0) return !1; if (M_(a)) { if (a.flags & 4 && Us(n) && n.expression.kind === 108) { let h = Xd(n); if (!(h && (h.kind === 173 || cp(h)))) return !0; if (a.valueDeclaration) { let T = ar(a.valueDeclaration), k = h.parent === a.valueDeclaration.parent, O = h === a.valueDeclaration.parent, H = T && ((u = a.parent) == null ? void 0 : u.valueDeclaration) === h.parent, J = T && ((p = a.parent) == null ? void 0 : p.valueDeclaration) === h; return !(k || O || H || J) } } return !0 } if (Us(n)) { let h = vs(n.expression); if (h.kind === 79) { let T = Rr(h).resolvedSymbol; if (T.flags & 2097152) { let k = Uu(T); return !!k && k.kind === 271 } } } return !1 } function CD(n, a, c) { let u = ql(n, 7); return u.kind !== 79 && !Us(u) ? (Fe(n, a), !1) : u.flags & 32 ? (Fe(n, c), !1) : !0 } function SZe(n) { Yi(n.expression); let a = vs(n.expression); if (!Us(a)) return Fe(a, _.The_operand_of_a_delete_operator_must_be_a_property_reference), Te; br(a) && pi(a.name) && Fe(a, _.The_operand_of_a_delete_operator_cannot_be_a_private_identifier); let c = Rr(a), u = tp(c.resolvedSymbol); return u && (M_(u) && Fe(a, _.The_operand_of_a_delete_operator_cannot_be_a_read_only_property), xZe(a, u)), Te } function xZe(n, a) { let c = zn(a); U && !(c.flags & 131075) && !(Pe ? a.flags & 16777216 : iu(c) & 16777216) && Fe(n, _.The_operand_of_a_delete_operator_must_be_optional) } function AZe(n) { return Yi(n.expression), sC } function CZe(n) { return Yi(n.expression), je } function IZe(n) { let a = R6(n); if (a && oc(a)) Fe(n, _.Await_expression_cannot_be_used_inside_a_class_static_block); else if (!(n.flags & 32768)) if (O6(n)) { let c = Gn(n); if (!l0(c)) { let u; if (!aS(c, Y)) { u ?? (u = Pg(c, n.pos)); let p = al(c, u.start, u.length, _.await_expressions_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_has_no_imports_or_exports_Consider_adding_an_empty_export_to_make_this_file_a_module); Lo.add(p) } switch (ie) { case 100: case 199: if (c.impliedNodeFormat === 1) { u ?? (u = Pg(c, n.pos)), Lo.add(al(c, u.start, u.length, _.The_current_file_is_a_CommonJS_module_and_cannot_use_await_at_the_top_level)); break } case 7: case 99: case 4: if (R >= 4) break; default: u ?? (u = Pg(c, n.pos)), Lo.add(al(c, u.start, u.length, _.Top_level_await_expressions_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_or_nodenext_and_the_target_option_is_set_to_es2017_or_higher)); break } } } else { let c = Gn(n); if (!l0(c)) { let u = Pg(c, n.pos), p = al(c, u.start, u.length, _.await_expressions_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules); if (a && a.kind !== 173 && !(pl(a) & 2)) { let h = hr(a, _.Did_you_mean_to_mark_this_function_as_async); Ao(p, h) } Lo.add(p) } } kre(n) && Fe(n, _.await_expressions_cannot_be_used_in_a_parameter_initializer) } function LZe(n) { i(() => IZe(n)); let a = Yi(n.expression), c = RD(a, !0, n, _.Type_of_await_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); return c === a && !Ro(c) && !(a.flags & 3) && ey(!1, hr(n, _.await_has_no_effect_on_the_type_of_this_expression)), c } function kZe(n) { let a = Yi(n.operand); if (a === Qe) return Qe; switch (n.operand.kind) { case 8: switch (n.operator) { case 40: return Yx(op(-n.operand.text)); case 39: return Yx(op(+n.operand.text)) }break; case 9: if (n.operator === 40) return Yx(aB({ negative: !0, base10Value: iL(n.operand.text) })) }switch (n.operator) { case 39: case 40: case 54: return sp(a, n.operand), WM(a, 12288) && Fe(n.operand, _.The_0_operator_cannot_be_applied_to_type_symbol, Xa(n.operator)), n.operator === 39 ? (WM(a, 2112) && Fe(n.operand, _.Operator_0_cannot_be_applied_to_type_1, Xa(n.operator), Ee(ky(a))), rt) : mie(a); case 53: aA(n.operand); let c = iu(a) & 12582912; return c === 4194304 ? Ke : c === 8388608 ? pe : Te; case 45: case 46: return iU(n.operand, sp(a, n.operand), _.An_arithmetic_operand_must_be_of_type_any_number_bigint_or_an_enum_type) && CD(n.operand, _.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access, _.The_operand_of_an_increment_or_decrement_operator_may_not_be_an_optional_property_access), mie(a) }return ve } function DZe(n) { let a = Yi(n.operand); return a === Qe ? Qe : (iU(n.operand, sp(a, n.operand), _.An_arithmetic_operand_must_be_of_type_any_number_bigint_or_an_enum_type) && CD(n.operand, _.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access, _.The_operand_of_an_increment_or_decrement_operator_may_not_be_an_optional_property_access), mie(a)) } function mie(n) { return Js(n, 2112) ? ul(n, 3) || Js(n, 296) ? Ja : Ot : rt } function WM(n, a) { if (Js(n, a)) return !0; let c = Ty(n); return !!c && Js(c, a) } function Js(n, a) { if (n.flags & a) return !0; if (n.flags & 3145728) { let c = n.types; for (let u of c) if (Js(u, a)) return !0 } return !1 } function ul(n, a, c) { return n.flags & a ? !0 : c && n.flags & 114691 ? !1 : !!(a & 296) && to(n, rt) || !!(a & 2112) && to(n, Ot) || !!(a & 402653316) && to(n, ae) || !!(a & 528) && to(n, Te) || !!(a & 16384) && to(n, yt) || !!(a & 131072) && to(n, lt) || !!(a & 65536) && to(n, ln) || !!(a & 32768) && to(n, Oe) || !!(a & 4096) && to(n, j) || !!(a & 67108864) && to(n, jr) } function zM(n, a, c) { return n.flags & 1048576 ? Ji(n.types, u => zM(u, a, c)) : ul(n, a, c) } function hie(n) { return !!(Ur(n) & 16) && !!n.symbol && gie(n.symbol) } function gie(n) { return (n.flags & 128) !== 0 } function wZe(n, a, c, u) { return c === Qe || u === Qe ? Qe : (!Zo(c) && zM(c, 134348796) && Fe(n, _.The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter), Zo(u) || EU(u) || Iy(u, Hs) || Fe(a, _.The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_Function_interface_type), Te) } function RZe(n) { return yh(n, a => a === xc || !!(a.flags & 2097152) && hh(Ty(a))) } function OZe(n, a, c, u) { if (c === Qe || u === Qe) return Qe; if (pi(n)) { if (R < 99 && Hc(n, 2097152), !Rr(n).resolvedSymbol && Zc(n)) { let p = Kre(n, u.symbol, !0); GCe(n, u, p) } } else wu(sp(c, n), Kr, n); return wu(sp(u, a), jr, a) && RZe(u) && Fe(a, _.Type_0_may_represent_a_primitive_value_which_is_not_permitted_as_the_right_operand_of_the_in_operator, Ee(u)), Te } function NZe(n, a, c) { let u = n.properties; if (U && u.length === 0) return sp(a, n); for (let p = 0; p < u.length; p++)kIe(n, a, p, u, c); return a } function kIe(n, a, c, u, p = !1) { let h = n.properties, T = h[c]; if (T.kind === 299 || T.kind === 300) { let k = T.name, O = pg(k); if (fh(O)) { let de = Np(O), Ae = ja(a, de); Ae && (MM(Ae, T, p), Hre(T, !1, !0, a, Ae)) } let H = od(a, O, 32, k), J = Ue(T, H); return nT(T.kind === 300 ? T : T.initializer, J) } else if (T.kind === 301) if (c < h.length - 1) Fe(T, _.A_rest_element_must_be_last_in_a_destructuring_pattern); else { R < 99 && Hc(T, 4); let k = []; if (u) for (let H of u) VS(H) || k.push(H.name); let O = Mx(a, k, a.symbol); return B1(u, _.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma), nT(T.expression, O) } else Fe(T, _.Property_assignment_expected) } function PZe(n, a, c) { let u = n.elements; R < 2 && Y.downlevelIteration && Hc(n, 512); let p = wy(193, a, Oe, n) || ve, h = Y.noUncheckedIndexedAccess ? void 0 : p; for (let T = 0; T < u.length; T++) { let k = p; n.elements[T].kind === 227 && (k = h = h ?? (wy(65, a, Oe, n) || ve)), DIe(n, a, T, k, c) } return a } function DIe(n, a, c, u, p) { let h = n.elements, T = h[c]; if (T.kind !== 229) { if (T.kind !== 227) { let k = op(c); if (Kv(a)) { let O = 32 | (RC(T) ? 16 : 0), H = Ay(a, k, O, GM(T, k)) || ve, J = RC(T) ? wf(H, 524288) : H, de = Ue(T, J); return nT(T, de, p) } return nT(T, u, p) } if (c < h.length - 1) Fe(T, _.A_rest_element_must_be_last_in_a_destructuring_pattern); else { let k = T.expression; if (k.kind === 223 && k.operatorToken.kind === 63) Fe(k.operatorToken, _.A_rest_element_cannot_have_an_initializer); else { B1(n.elements, _.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma); let O = Im(a, po) ? Ls(a, H => EC(H, c)) : nu(u); return nT(k, O, p) } } } } function nT(n, a, c, u) { let p; if (n.kind === 300) { let h = n; h.objectAssignmentInitializer && (U && !(iu(Yi(h.objectAssignmentInitializer)) & 16777216) && (a = wf(a, 524288)), BZe(h.name, h.equalsToken, h.objectAssignmentInitializer, c)), p = n.name } else p = n; return p.kind === 223 && p.operatorToken.kind === 63 && (Ce(p, c), p = p.left, U && (a = wf(a, 524288))), p.kind === 207 ? NZe(p, a, u) : p.kind === 206 ? PZe(p, a, c) : MZe(p, a, c) } function MZe(n, a, c) { let u = Yi(n, c), p = n.parent.kind === 301 ? _.The_target_of_an_object_rest_assignment_must_be_a_variable_or_a_property_access : _.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access, h = n.parent.kind === 301 ? _.The_target_of_an_object_rest_assignment_may_not_be_an_optional_property_access : _.The_left_hand_side_of_an_assignment_expression_may_not_be_an_optional_property_access; return CD(n, p, h) && Ly(a, u, n, n), TA(n) && Hc(n.parent, 1048576), a } function JM(n) { switch (n = vs(n), n.kind) { case 79: case 10: case 13: case 212: case 225: case 14: case 8: case 9: case 110: case 95: case 104: case 155: case 215: case 228: case 216: case 206: case 207: case 218: case 232: case 282: case 281: return !0; case 224: return JM(n.whenTrue) && JM(n.whenFalse); case 223: return Mg(n.operatorToken.kind) ? !1 : JM(n.left) && JM(n.right); case 221: case 222: switch (n.operator) { case 53: case 39: case 40: case 54: return !0 }return !1; case 219: case 213: case 231: default: return !1 } } function yie(n, a) { return (a.flags & 98304) !== 0 || _B(n, a) } function FZe() { let n = C3(a, c, u, p, h, T); return (Ae, xe) => { let tt = n(Ae, xe); return L.assertIsDefined(tt), tt }; function a(Ae, xe, tt) { return xe ? (xe.stackIndex++, xe.skip = !1, H(xe, void 0), de(xe, void 0)) : xe = { checkMode: tt, skip: !1, stackIndex: 0, typeStack: [void 0, void 0] }, Yn(Ae) && oS(Ae) ? (xe.skip = !0, de(xe, Yi(Ae.right, tt)), xe) : (GZe(Ae), Ae.operatorToken.kind === 63 && (Ae.left.kind === 207 || Ae.left.kind === 206) && (xe.skip = !0, de(xe, nT(Ae.left, Yi(Ae.right, tt), tt, Ae.right.kind === 108))), xe) } function c(Ae, xe, tt) { if (!xe.skip) return k(xe, Ae) } function u(Ae, xe, tt) { if (!xe.skip) { let It = J(xe); L.assertIsDefined(It), H(xe, It), de(xe, void 0); let Tn = Ae.kind; if (AR(Tn)) { let un = tt.parent; for (; un.kind === 214 || CR(un);)un = un.parent; (Tn === 55 || MT(un)) && wie(tt.left, It, MT(un) ? un.thenStatement : void 0), uLe(It, tt.left) } } } function p(Ae, xe, tt) { if (!xe.skip) return k(xe, Ae) } function h(Ae, xe) { let tt; if (xe.skip) tt = J(xe); else { let It = O(xe); L.assertIsDefined(It); let Tn = J(xe); L.assertIsDefined(Tn), tt = wIe(Ae.left, Ae.operatorToken, Ae.right, It, Tn, Ae) } return xe.skip = !1, H(xe, void 0), de(xe, void 0), xe.stackIndex--, tt } function T(Ae, xe, tt) { return de(Ae, xe), Ae } function k(Ae, xe) { if (ar(xe)) return xe; de(Ae, Yi(xe, Ae.checkMode)) } function O(Ae) { return Ae.typeStack[Ae.stackIndex] } function H(Ae, xe) { Ae.typeStack[Ae.stackIndex] = xe } function J(Ae) { return Ae.typeStack[Ae.stackIndex + 1] } function de(Ae, xe) { Ae.typeStack[Ae.stackIndex + 1] = xe } } function GZe(n) { let { left: a, operatorToken: c, right: u } = n; c.kind === 60 && (ar(a) && (a.operatorToken.kind === 56 || a.operatorToken.kind === 55) && an(a, _._0_and_1_operations_cannot_be_mixed_without_parentheses, Xa(a.operatorToken.kind), Xa(c.kind)), ar(u) && (u.operatorToken.kind === 56 || u.operatorToken.kind === 55) && an(u, _._0_and_1_operations_cannot_be_mixed_without_parentheses, Xa(u.operatorToken.kind), Xa(c.kind))) } function BZe(n, a, c, u, p) { let h = a.kind; if (h === 63 && (n.kind === 207 || n.kind === 206)) return nT(n, Yi(c, u), u, c.kind === 108); let T; AR(h) ? T = aA(n, u) : T = Yi(n, u); let k = Yi(c, u); return wIe(n, a, c, T, k, p) } function wIe(n, a, c, u, p, h) { let T = a.kind; switch (T) { case 41: case 42: case 66: case 67: case 43: case 68: case 44: case 69: case 40: case 65: case 47: case 70: case 48: case 71: case 49: case 72: case 51: case 74: case 52: case 78: case 50: case 73: if (u === Qe || p === Qe) return Qe; u = sp(u, n), p = sp(p, c); let en; if (u.flags & 528 && p.flags & 528 && (en = de(a.kind)) !== void 0) return Fe(h || a, _.The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead, Xa(a.kind), Xa(en)), rt; { let Jt = iU(n, u, _.The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type, !0), Cn = iU(c, p, _.The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type, !0), Rn; if (ul(u, 3) && ul(p, 3) || !(Js(u, 2112) || Js(p, 2112))) Rn = rt; else if (k(u, p)) { switch (T) { case 49: case 72: It(); break; case 42: case 67: R < 3 && Fe(h, _.Exponentiation_cannot_be_performed_on_bigint_values_unless_the_target_option_is_set_to_es2016_or_later) }Rn = Ot } else It(k), Rn = ve; return Jt && Cn && Ae(Rn), Rn } case 39: case 64: if (u === Qe || p === Qe) return Qe; !ul(u, 402653316) && !ul(p, 402653316) && (u = sp(u, n), p = sp(p, c)); let cn; return ul(u, 296, !0) && ul(p, 296, !0) ? cn = rt : ul(u, 2112, !0) && ul(p, 2112, !0) ? cn = Ot : ul(u, 402653316, !0) || ul(p, 402653316, !0) ? cn = ae : (Zo(u) || Zo(p)) && (cn = Ro(u) || Ro(p) ? ve : Se), cn && !J(T) ? cn : cn ? (T === 64 && Ae(cn), cn) : (It((Cn, Rn) => ul(Cn, 402655727) && ul(Rn, 402655727)), Se); case 29: case 31: case 32: case 33: return J(T) && (u = $ne(sp(u, n)), p = $ne(sp(p, c)), tt((Jt, Cn) => { if (Zo(Jt) || Zo(Cn)) return !0; let Rn = to(Jt, Ja), Br = to(Cn, Ja); return Rn && Br || !Rn && !Br && _M(Jt, Cn) })), Te; case 34: case 35: case 36: case 37: if (Pj(n) || Pj(c)) { let Jt = T === 34 || T === 36; Fe(h, _.This_condition_will_always_return_0_since_JavaScript_compares_objects_by_reference_not_value, Jt ? "false" : "true") } return un(h, T, n, c), tt((Jt, Cn) => yie(Jt, Cn) || yie(Cn, Jt)), Te; case 102: return wZe(n, c, u, p); case 101: return OZe(n, c, u, p); case 55: case 76: { let Jt = iu(u) & 4194304 ? Gr([kXe(U ? u : ky(p)), p]) : u; return T === 76 && Ae(p), Jt } case 56: case 75: { let Jt = iu(u) & 8388608 ? Gr([yg(m2e(u)), p], 2) : u; return T === 75 && Ae(p), Jt } case 60: case 77: { let Jt = iu(u) & 262144 ? Gr([yg(u), p], 2) : u; return T === 77 && Ae(p), Jt } case 63: let rr = ar(n.parent) ? ic(n.parent) : 0; return O(rr, p), xe(rr) ? ((!(p.flags & 524288) || rr !== 2 && rr !== 6 && !mh(p) && !vre(p) && !(Ur(p) & 1)) && Ae(p), u) : (Ae(p), p); case 27: if (!Y.allowUnreachableCode && JM(n) && !H(n.parent)) { let Jt = Gn(n), Cn = Jt.text, Rn = xo(Cn, n.pos); Jt.parseDiagnostics.some(Hr => Hr.code !== _.JSX_expressions_must_have_one_parent_element.code ? !1 : bj(Hr, Rn)) || Fe(n, _.Left_side_of_comma_operator_is_unused_and_has_no_side_effects) } return p; default: return L.fail() }function k(en, cn) { return ul(en, 2112) && ul(cn, 2112) } function O(en, cn) { if (en === 2) for (let rr of Ey(cn)) { let Jt = zn(rr); if (Jt.symbol && Jt.symbol.flags & 32) { let Cn = rr.escapedName, Rn = zs(rr.valueDeclaration, Cn, 788968, void 0, Cn, !1); Rn?.declarations && Rn.declarations.some(Kz) && (Mb(Rn, _.Duplicate_identifier_0, Gi(Cn), rr), Mb(rr, _.Duplicate_identifier_0, Gi(Cn), Rn)) } } } function H(en) { return en.parent.kind === 214 && Vf(en.left) && en.left.text === "0" && (Pa(en.parent.parent) && en.parent.parent.expression === en.parent || en.parent.parent.kind === 212) && (Us(en.right) || Re(en.right) && en.right.escapedText === "eval") } function J(en) { let cn = WM(u, 12288) ? n : WM(p, 12288) ? c : void 0; return cn ? (Fe(cn, _.The_0_operator_cannot_be_applied_to_type_symbol, Xa(en)), !1) : !0 } function de(en) { switch (en) { case 51: case 74: return 56; case 52: case 78: return 37; case 50: case 73: return 55; default: return } } function Ae(en) { Mg(T) && i(cn); function cn() { if (CD(n, _.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access, _.The_left_hand_side_of_an_assignment_expression_may_not_be_an_optional_property_access)) { let rr; if (Pe && br(n) && Js(en, 32768)) { let Jt = Vc(au(n.expression), n.name.escapedText); mB(en, Jt) && (rr = _.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_type_of_the_target) } Ly(en, u, n, c, rr) } } } function xe(en) { var cn; switch (en) { case 2: return !0; case 1: case 5: case 6: case 3: case 4: let rr = vd(n), Jt = oS(c); return !!Jt && rs(Jt) && !!((cn = rr?.exports) != null && cn.size); default: return !1 } } function tt(en) { return en(u, p) ? !1 : (It(en), !0) } function It(en) { let cn = !1, rr = h || a; if (en) { let Hr = bg(u), qi = bg(p); cn = !(Hr === u && qi === p) && !!(Hr && qi) && en(Hr, qi) } let Jt = u, Cn = p; !cn && en && ([Jt, Cn] = UZe(u, p, en)); let [Rn, Br] = Wt(Jt, Cn); Tn(rr, cn, Rn, Br) || Tv(rr, cn, _.Operator_0_cannot_be_applied_to_types_1_and_2, Xa(a.kind), Rn, Br) } function Tn(en, cn, rr, Jt) { switch (a.kind) { case 36: case 34: case 37: case 35: return Tv(en, cn, _.This_comparison_appears_to_be_unintentional_because_the_types_0_and_1_have_no_overlap, rr, Jt); default: return } } function un(en, cn, rr, Jt) { let Cn = Nn(vs(rr)), Rn = Nn(vs(Jt)); if (Cn || Rn) { let Br = Fe(en, _.This_condition_will_always_return_0, Xa(cn === 36 || cn === 34 ? 95 : 110)); if (Cn && Rn) return; let Hr = cn === 37 || cn === 35 ? Xa(53) : "", qi = Cn ? Jt : rr, wa = vs(qi); Ao(Br, hr(qi, _.Did_you_mean_0, `${Hr}Number.isNaN(${bc(wa) ? qd(wa) : "..."})`)) } } function Nn(en) { if (Re(en) && en.escapedText === "NaN") { let cn = PKe(); return !!cn && cn === Qf(en) } return !1 } } function UZe(n, a, c) { let u = n, p = a, h = ky(n), T = ky(a); return c(h, T) || (u = h, p = T), [u, p] } function VZe(n) { i(Ae); let a = Xd(n); if (!a) return Se; let c = pl(a); if (!(c & 1)) return Se; let u = (c & 2) !== 0; n.asteriskToken && (u && R < 99 && Hc(n, 26624), !u && R < 2 && Y.downlevelIteration && Hc(n, 256)); let p = Hx(a), h = p && bLe(p, u), T = h && h.yieldType || Se, k = h && h.nextType || Se, O = u ? rT(k) || Se : k, H = n.expression ? Yi(n.expression) : je, J = TIe(n, H, O, u); if (p && J && Ly(J, T, n.expression || n, n.expression), n.asteriskToken) return Oie(u ? 19 : 17, 1, H, n.expression) || Se; if (p) return c0(2, p, u) || Se; let de = cCe(2, a); return de || (de = Se, i(() => { if (ge && !Ble(n)) { let xe = Ru(n, void 0); (!xe || Zo(xe)) && Fe(n, _.yield_expression_implicitly_results_in_an_any_type_because_its_containing_generator_lacks_a_return_type_annotation) } })), de; function Ae() { n.flags & 8192 || dl(n, _.A_yield_expression_is_only_allowed_in_a_generator_body), kre(n) && Fe(n, _.yield_expressions_cannot_be_used_in_a_parameter_initializer) } } function jZe(n, a) { let c = aA(n.condition); wie(n.condition, c, n.whenTrue); let u = Yi(n.whenTrue, a), p = Yi(n.whenFalse, a); return Gr([u, p], 2) } function RIe(n) { let a = n.parent; return ud(a) && RIe(a) || Vs(a) && a.argumentExpression === n } function HZe(n) { let a = [n.head.text], c = []; for (let u of n.templateSpans) { let p = Yi(u.expression); WM(p, 12288) && Fe(u.expression, _.Implicit_conversion_of_a_symbol_to_a_string_will_fail_at_runtime_Consider_wrapping_this_expression_in_String), a.push(u.literal.text), c.push(to(p, Za) ? p : ae) } return GC(n) || RIe(n) || yh(Ru(n, void 0) || ue, WZe) ? WE(a, c) : ae } function WZe(n) { return !!(n.flags & 134217856 || n.flags & 58982400 && Js(bu(n) || ue, 402653316)) } function zZe(n) { return K0(n) && !FS(n.parent) ? n.parent.parent : n } function rA(n, a, c, u) { let p = zZe(n); wM(p, a, !1), h$e(p, c); let h = Yi(n, u | 1 | (c ? 2 : 0)); c && c.intraExpressionInferenceSites && (c.intraExpressionInferenceSites = void 0); let T = Js(h, 2944) && aU(h, BB(a, n, void 0)) ? Hu(h) : h; return g$e(), vD(), T } function Ic(n, a) { if (a) return Yi(n, a); let c = Rr(n); if (!c.resolvedType) { let u = sn, p = ra; sn = Dn, ra = void 0, c.resolvedType = Yi(n, a), ra = p, sn = u } return c.resolvedType } function OIe(n) { return n = vs(n, !0), n.kind === 213 || n.kind === 231 || RL(n) } function ID(n, a, c) { let u = Yw(n); if (Yn(n)) { let h = T4(n); if (h) return cie(u, h, a) } let p = Eie(u) || (c ? rA(u, c, void 0, a || 0) : Ic(u, a)); return ha(n) && n.name.kind === 204 && po(p) && !p.target.hasRestElement && Vv(p) < n.name.elements.length ? JZe(p, n.name) : p } function JZe(n, a) { let c = a.elements, u = Ko(n).slice(), p = n.target.elementFlags.slice(); for (let h = Vv(n); h < c.length; h++) { let T = c[h]; (h < c.length - 1 || !(T.kind === 205 && T.dotDotDotToken)) && (u.push(!ol(T) && RC(T) ? hy(T, !1, !1) : Se), p.push(2), !ol(T) && !RC(T) && qv(T, Se)) } return ap(u, p, n.target.readonly) } function vie(n, a) { let c = G_(n) & 2 || x6(n) ? a : i0(a); if (Yn(n)) { if (u2e(c)) return qv(n, Se), Se; if (bB(c)) return qv(n, Et), Et } return c } function aU(n, a) { if (a) { if (a.flags & 3145728) { let c = a.types; return vt(c, u => aU(n, u)) } if (a.flags & 58982400) { let c = bu(a) || ue; return Js(c, 4) && Js(n, 128) || Js(c, 8) && Js(n, 256) || Js(c, 64) && Js(n, 2048) || Js(c, 4096) && Js(n, 8192) || aU(n, c) } return !!(a.flags & 406847616 && Js(n, 128) || a.flags & 256 && Js(n, 256) || a.flags & 2048 && Js(n, 2048) || a.flags & 512 && Js(n, 512) || a.flags & 8192 && Js(n, 8192)) } return !1 } function GC(n) { let a = n.parent; return pT(a) && Ch(a.type) || RL(a) && Ch(T3(a)) || sie(n) && KZe(n) || (ud(a) || fu(a) || Km(a)) && GC(a) || (yl(a) || xf(a) || xL(a)) && GC(a.parent) } function KZe(n) { let a = Ru(n, 0); return !!a && yh(a, tM) } function BC(n, a, c) { let u = Yi(n, a, c); return GC(n) || Zse(n) ? Hu(u) : OIe(n) ? u : Qne(u, BB(Ru(n, void 0), n, void 0)) } function NIe(n, a) { return n.name.kind === 164 && vg(n.name), BC(n.initializer, a) } function PIe(n, a) { cke(n), n.name.kind === 164 && vg(n.name); let c = IIe(n, a); return MIe(n, c, a) } function MIe(n, a, c) { if (c && c & 10) { let u = ED(a, 0, !0), p = ED(a, 1, !0), h = u || p; if (h && h.typeParameters) { let T = o0(n, 2); if (T) { let k = ED(yg(T), u ? 0 : 1, !1); if (k && !k.typeParameters) { if (c & 8) return FIe(n, c), aa; let O = M1(n), H = O.signature && qo(O.signature), J = H && KCe(H); if (J && !J.typeParameters && !Ji(O.inferences, iA)) { let de = $Ze(O, h.typeParameters), Ae = ine(h, de), xe = on(O.inferences, tt => ore(tt.typeParameter)); if (rre(Ae, k, (tt, It) => { gh(xe, tt, It, 0, !0) }), vt(xe, iA) && (ire(Ae, k, (tt, It) => { gh(xe, tt, It) }), !XZe(O.inferences, xe))) return YZe(O.inferences, xe), O.inferredTypeParameters = Qi(O.inferredTypeParameters, de), HE(Ae) } return HE(qCe(h, k, O)) } } } } return a } function FIe(n, a) { if (a & 2) { let c = M1(n); c.flags |= 4 } } function iA(n) { return !!(n.candidates || n.contraCandidates) } function qZe(n) { return !!(n.candidates || n.contraCandidates || Rxe(n.typeParameter)) } function XZe(n, a) { for (let c = 0; c < n.length; c++)if (iA(n[c]) && iA(a[c])) return !0; return !1 } function YZe(n, a) { for (let c = 0; c < n.length; c++)!iA(n[c]) && iA(a[c]) && (n[c] = a[c]) } function $Ze(n, a) { let c = [], u, p; for (let h of a) { let T = h.symbol.escapedName; if (bie(n.inferredTypeParameters, T) || bie(c, T)) { let k = QZe(Qi(n.inferredTypeParameters, c), T), O = wo(262144, k), H = rd(O); H.target = h, u = Sn(u, h), p = Sn(p, H), c.push(H) } else c.push(h) } if (p) { let h = Wu(u, p); for (let T of p) T.mapper = h } return c } function bie(n, a) { return vt(n, c => c.symbol.escapedName === a) } function QZe(n, a) { let c = a.length; for (; c > 1 && a.charCodeAt(c - 1) >= 48 && a.charCodeAt(c - 1) <= 57;)c--; let u = a.slice(0, c); for (let p = 1; ; p++) { let h = u + p; if (!bie(n, h)) return h } } function GIe(n) { let a = F1(n); if (a && !a.typeParameters) return qo(a) } function ZZe(n) { let a = Yi(n.expression), c = dD(a, n.expression), u = GIe(a); return u && SB(u, n, c !== a) } function au(n) { let a = Eie(n); if (a) return a; if (n.flags & 134217728 && ra) { let p = ra[zo(n)]; if (p) return p } let c = Vn, u = Yi(n); if (Vn !== c) { let p = ra || (ra = []); p[zo(n)] = u, Gle(n, n.flags | 134217728) } return u } function Eie(n) { let a = vs(n, !0); if (RL(a)) { let c = T3(a); if (!Ch(c)) return $r(c) } if (a = vs(n), v2(a)) { let c = Eie(a.expression); return c ? rT(c) : void 0 } if (Pa(a) && a.expression.kind !== 106 && !qu(a, !0) && !sIe(a)) return dT(a) ? ZZe(a) : GIe(NC(a.expression)); if (pT(a) && !Ch(a.type)) return $r(a.type); if (fT(n) || ose(n)) return Yi(n) } function KM(n) { let a = Rr(n); if (a.contextFreeType) return a.contextFreeType; wM(n, Se, !1); let c = a.contextFreeType = Yi(n, 4); return vD(), c } function Yi(n, a, c) { var u, p; (u = ai) == null || u.push(ai.Phase.Check, "checkExpression", { kind: n.kind, pos: n.pos, end: n.end, path: n.tracingPath }); let h = P; P = n, A = 0; let T = net(n, a, c), k = MIe(n, T, a); return hie(k) && eet(n, k), P = h, (p = ai) == null || p.pop(), k } function eet(n, a) { n.parent.kind === 208 && n.parent.expression === n || n.parent.kind === 209 && n.parent.expression === n || (n.kind === 79 || n.kind === 163) && vU(n) || n.parent.kind === 183 && n.parent.exprName === n || n.parent.kind === 278 || Fe(n, _.const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_import_declaration_or_export_assignment_or_type_query), d_(Y) && (L.assert(!!(a.symbol.flags & 128)), a.symbol.valueDeclaration.flags & 16777216 && Fe(n, _.Cannot_access_ambient_const_enums_when_0_is_enabled, Rt)) } function tet(n, a) { if (Kd(n)) { if (zW(n)) return cie(n.expression, JW(n), a); if (RL(n)) { let c = T3(n); return fIe(c, c, n.expression, a) } } return Yi(n.expression, a) } function net(n, a, c) { let u = n.kind; if (o) switch (u) { case 228: case 215: case 216: o.throwIfCancellationRequested() }switch (u) { case 79: return BYe(n, a); case 80: return Z$e(n); case 108: return kM(n); case 106: return Ire(n); case 104: return ir; case 14: case 10: return Yx(ff(n.text)); case 8: return eae(n), Yx(op(+n.text)); case 9: return iit(n), Yx(aB({ negative: !1, base10Value: iL(n.text) })); case 110: return pe; case 95: return Ke; case 225: return HZe(n); case 13: return nf; case 206: return gCe(n, a, c); case 207: return O$e(n, a); case 208: return RCe(n, a); case 163: return OCe(n, a); case 209: return mQe(n, a); case 210: if (n.expression.kind === 100) return zQe(n); case 211: return WQe(n, a); case 212: return JQe(n); case 214: return tet(n, a); case 228: return Wtt(n); case 215: case 216: return IIe(n, a); case 218: return AZe(n); case 213: case 231: return KQe(n); case 232: return XQe(n); case 230: return _Ie(n); case 235: return YQe(n); case 233: return $Qe(n); case 217: return SZe(n); case 219: return CZe(n); case 220: return LZe(n); case 221: return kZe(n); case 222: return DZe(n); case 223: return Ce(n, a); case 224: return jZe(n, a); case 227: return L$e(n, a); case 229: return je; case 226: return VZe(n); case 234: return k$e(n); case 291: return J$e(n, a); case 281: return F$e(n, a); case 282: return P$e(n, a); case 285: return G$e(n); case 289: return U$e(n, a); case 283: L.fail("Shouldn't ever directly check a JsxOpeningElement") }return ve } function BIe(n) { km(n), n.expression && dl(n.expression, _.Type_expected), qa(n.constraint), qa(n.default); let a = UE(fr(n)); bu(a), WJe(a) || Fe(n.default, _.Type_parameter_0_has_a_circular_default, Ee(a)); let c = eu(a), u = jE(a); c && u && wu(u, uf(Oi(c, n0(a, u)), u), n.default, _.Type_0_does_not_satisfy_the_constraint_1), zC(n), i(() => HC(n.name, _.Type_parameter_name_cannot_be_0)) } function ret(n) { var a, c; if (ku(n.parent) || Yr(n.parent) || Ep(n.parent)) { let u = UE(fr(n)), p = Jne(u) & 98304; if (p) { let h = fr(n.parent); if (Ep(n.parent) && !(Ur(gs(h)) & 48)) Fe(n, _.Variance_annotations_are_only_supported_in_type_aliases_for_object_function_constructor_and_mapped_types); else if (p === 32768 || p === 65536) { (a = ai) == null || a.push(ai.Phase.CheckTypes, "checkTypeParameterDeferred", { parent: ru(gs(h)), id: ru(u) }); let T = hM(h, u, p === 65536 ? qs : ss), k = hM(h, u, p === 65536 ? ss : qs), O = u; F = u, wu(T, k, n, _.Type_0_is_not_assignable_to_type_1_as_implied_by_variance_annotation), F = O, (c = ai) == null || c.pop() } } } } function UIe(n) { km(n), ZM(n); let a = Xd(n); Mr(n, 16476) && (a.kind === 173 && Pf(a.body) || Fe(n, _.A_parameter_property_is_only_allowed_in_a_constructor_implementation), a.kind === 173 && Re(n.name) && n.name.escapedText === "constructor" && Fe(n.name, _.constructor_cannot_be_used_as_a_parameter_property_name)), !n.initializer && WW(n) && La(n.name) && a.body && Fe(n, _.A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature), n.name && Re(n.name) && (n.name.escapedText === "this" || n.name.escapedText === "new") && (a.parameters.indexOf(n) !== 0 && Fe(n, _.A_0_parameter_must_be_the_first_parameter, n.name.escapedText), (a.kind === 173 || a.kind === 177 || a.kind === 182) && Fe(n, _.A_constructor_cannot_have_a_this_parameter), a.kind === 216 && Fe(n, _.An_arrow_function_cannot_have_a_this_parameter), (a.kind === 174 || a.kind === 175) && Fe(n, _.get_and_set_accessors_cannot_declare_this_parameters)), n.dotDotDotToken && !La(n.name) && !to(O_(zn(n.symbol)), Ri) && Fe(n, _.A_rest_parameter_must_be_of_an_array_type) } function iet(n) { let a = aet(n); if (!a) { Fe(n, _.A_type_predicate_is_only_allowed_in_return_type_position_for_functions_and_methods); return } let c = ip(a), u = Lf(c); if (!u) return; qa(n.type); let { parameterName: p } = n; if (u.kind === 0 || u.kind === 2) oB(p); else if (u.parameterIndex >= 0) { if (Xl(c) && u.parameterIndex === c.parameters.length - 1) Fe(p, _.A_type_predicate_cannot_reference_a_rest_parameter); else if (u.type) { let h = () => da(void 0, _.A_type_predicate_s_type_must_be_assignable_to_its_parameter_s_type); wu(u.type, zn(c.parameters[u.parameterIndex]), n.type, void 0, h) } } else if (p) { let h = !1; for (let { name: T } of a.parameters) if (La(T) && VIe(T, p, u.parameterName)) { h = !0; break } h || Fe(n.parameterName, _.Cannot_find_parameter_0, u.parameterName) } } function aet(n) { switch (n.parent.kind) { case 216: case 176: case 259: case 215: case 181: case 171: case 170: let a = n.parent; if (n === a.type) return a } } function VIe(n, a, c) { for (let u of n.elements) { if (ol(u)) continue; let p = u.name; if (p.kind === 79 && p.escapedText === c) return Fe(a, _.A_type_predicate_cannot_reference_element_0_in_a_binding_pattern, c), !0; if ((p.kind === 204 || p.kind === 203) && VIe(p, a, c)) return !0 } } function LD(n) { n.kind === 178 ? wrt(n) : (n.kind === 181 || n.kind === 259 || n.kind === 182 || n.kind === 176 || n.kind === 173 || n.kind === 177) && AU(n); let a = pl(n); a & 4 || ((a & 3) === 3 && R < 99 && Hc(n, 6144), (a & 3) === 2 && R < 4 && Hc(n, 64), a & 3 && R < 2 && Hc(n, 128)), t8(jy(n)), Vtt(n), mn(n.parameters, UIe), n.type && qa(n.type), i(c); function c() { itt(n); let u = U_(n); if (ge && !u) switch (n.kind) { case 177: Fe(n, _.Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type); break; case 176: Fe(n, _.Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type); break }if (u) { let p = pl(n); if ((p & 5) === 1) { let h = $r(u); if (h === yt) Fe(u, _.A_generator_cannot_have_a_void_type_annotation); else { let T = c0(0, h, (p & 2) !== 0) || Se, k = c0(1, h, (p & 2) !== 0) || T, O = c0(2, h, (p & 2) !== 0) || ue, H = EIe(T, k, O, !!(p & 2)); wu(H, h, u) } } else (p & 3) === 2 && Get(n, u) } n.kind !== 178 && n.kind !== 320 && Dy(n) } } function oet(n) { let a = new Map, c = new Map, u = new Map; for (let h of n.members) if (h.kind === 173) for (let T of h.parameters) Ad(T, h) && !La(T.name) && p(a, T.name, T.name.escapedText, 3); else { let T = Ca(h), k = h.name; if (!k) continue; let O = pi(k), H = O && T ? 16 : 0, J = O ? u : T ? c : a, de = k && M0(k); if (de) switch (h.kind) { case 174: p(J, k, de, 1 | H); break; case 175: p(J, k, de, 2 | H); break; case 169: p(J, k, de, 3 | H); break; case 171: p(J, k, de, 8 | H); break } } function p(h, T, k, O) { let H = h.get(k); if (H) if ((H & 16) !== (O & 16)) Fe(T, _.Duplicate_identifier_0_Static_and_instance_elements_cannot_share_the_same_private_name, Qc(T)); else { let J = !!(H & 8), de = !!(O & 8); J || de ? J !== de && Fe(T, _.Duplicate_identifier_0, Qc(T)) : H & O & -17 ? Fe(T, _.Duplicate_identifier_0, Qc(T)) : h.set(k, H | O) } else h.set(k, O) } } function set(n) { for (let a of n.members) { let c = a.name; if (Ca(a) && c) { let p = M0(c); switch (p) { case "name": case "length": case "caller": case "arguments": case "prototype": let h = _.Static_property_0_conflicts_with_built_in_property_Function_0_of_constructor_function_1, T = _y(fr(n)); Fe(c, h, p, T); break } } } } function jIe(n) { let a = new Map; for (let c of n.members) if (c.kind === 168) { let u, p = c.name; switch (p.kind) { case 10: case 8: u = p.text; break; case 79: u = vr(p); break; default: continue }a.get(u) ? (Fe(sa(c.symbol.valueDeclaration), _.Duplicate_identifier_0, u), Fe(c.name, _.Duplicate_identifier_0, u)) : a.set(u, !0) } } function Tie(n) { if (n.kind === 261) { let c = fr(n); if (c.declarations && c.declarations.length > 0 && c.declarations[0] !== n) return } let a = Uxe(fr(n)); if (a?.declarations) { let c = new Map; for (let u of a.declarations) u.parameters.length === 1 && u.parameters[0].type && QE($r(u.parameters[0].type), p => { let h = c.get(ru(p)); h ? h.declarations.push(u) : c.set(ru(p), { type: p, declarations: [u] }) }); c.forEach(u => { if (u.declarations.length > 1) for (let p of u.declarations) Fe(p, _.Duplicate_index_signature_for_type_0, Ee(u.type)) }) } } function HIe(n) { !km(n) && !Zrt(n) && CU(n.name), ZM(n), Sie(n), Mr(n, 256) && n.kind === 169 && n.initializer && Fe(n, _.Property_0_cannot_have_an_initializer_because_it_is_marked_abstract, os(n.name)) } function cet(n) { return pi(n.name) && Fe(n, _.Private_identifiers_are_not_allowed_outside_class_bodies), HIe(n) } function uet(n) { cke(n) || CU(n.name), Nc(n) && n.asteriskToken && Re(n.name) && vr(n.name) === "constructor" && Fe(n.name, _.Class_constructor_may_not_be_a_generator), nLe(n), Mr(n, 256) && n.kind === 171 && n.body && Fe(n, _.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract, os(n.name)), pi(n.name) && !Zc(n) && Fe(n, _.Private_identifiers_are_not_allowed_outside_class_bodies), Sie(n) } function Sie(n) { if (pi(n.name) && R < 99) { for (let a = tm(n); a; a = tm(a))Rr(a).flags |= 4194304; if (_u(n.parent)) { let a = xre(n.parent); a && (Rr(n.name).flags |= 32768, Rr(a).flags |= 4096) } } } function det(n) { km(n), pa(n, qa) } function fet(n) { LD(n), $rt(n) || Qrt(n), qa(n.body); let a = fr(n), c = nc(a, n.kind); if (n === c && cU(a), rc(n.body)) return; i(p); return; function u(h) { return xu(h) ? !0 : h.kind === 169 && !Ca(h) && !!h.initializer } function p() { let h = n.parent; if (P0(h)) { Are(n.parent, h); let T = nCe(h), k = tCe(n.body); if (k) { if (T && Fe(k, _.A_constructor_cannot_contain_a_super_call_when_its_class_extends_null), (Do(Y) !== 99 || !fe) && (vt(n.parent.members, u) || vt(n.parameters, H => Mr(H, 16476)))) if (!_et(k, n.body)) Fe(k, _.A_super_call_must_be_a_root_level_statement_within_a_constructor_of_a_derived_class_that_contains_initialized_properties_parameter_properties_or_private_identifiers); else { let H; for (let J of n.body.statements) { if (Ol(J) && OA(ql(J.expression))) { H = J; break } if (WIe(J)) break } H === void 0 && Fe(n, _.A_super_call_must_be_the_first_statement_in_the_constructor_to_refer_to_super_or_this_when_a_derived_class_contains_initialized_properties_parameter_properties_or_private_identifiers) } } else T || Fe(n, _.Constructors_for_derived_classes_must_contain_a_super_call) } } } function _et(n, a) { let c = qy(n.parent); return Ol(c) && c.parent === a } function WIe(n) { return n.kind === 106 || n.kind === 108 ? !0 : ace(n) ? !1 : !!pa(n, WIe) } function zIe(n) { Re(n.name) && vr(n.name) === "constructor" && Fe(n.name, _.Class_constructor_may_not_be_an_accessor), i(a), qa(n.body), Sie(n); function a() { if (!AU(n) && !Urt(n) && CU(n.name), XM(n), LD(n), n.kind === 174 && !(n.flags & 16777216) && Pf(n.body) && n.flags & 256 && (n.flags & 512 || Fe(n.name, _.A_get_accessor_must_return_a_value)), n.name.kind === 164 && vg(n.name), Ux(n)) { let u = fr(n), p = nc(u, 174), h = nc(u, 175); if (p && h && !(sA(p) & 1)) { Rr(p).flags |= 1; let T = uu(p), k = uu(h); (T & 256) !== (k & 256) && (Fe(p.name, _.Accessors_must_both_be_abstract_or_non_abstract), Fe(h.name, _.Accessors_must_both_be_abstract_or_non_abstract)), (T & 16 && !(k & 24) || T & 8 && !(k & 8)) && (Fe(p.name, _.A_get_accessor_must_be_at_least_as_accessible_as_the_setter), Fe(h.name, _.A_get_accessor_must_be_at_least_as_accessible_as_the_setter)); let O = te(p), H = te(h); O && H && wu(O, H, p, _.The_return_type_of_a_get_accessor_must_be_assignable_to_its_set_accessor_type) } } let c = Tr(fr(n)); n.kind === 174 && pie(n, c) } } function pet(n) { XM(n) } function met(n, a, c) { return n.typeArguments && c < n.typeArguments.length ? $r(n.typeArguments[c]) : oU(n, a)[c] } function oU(n, a) { return Sy(on(n.typeArguments, $r), a, Mp(a), Yn(n)) } function JIe(n, a) { let c, u, p = !0; for (let h = 0; h < a.length; h++) { let T = eu(a[h]); T && (c || (c = oU(n, a), u = Wu(a, c)), p = p && wu(c[h], Oi(T, u), n.typeArguments[h], _.Type_0_does_not_satisfy_the_constraint_1)) } return p } function het(n, a) { if (!Ro(n)) return a.flags & 524288 && Ai(a).typeParameters || (Ur(n) & 4 ? n.target.localTypeParameters : void 0) } function xie(n) { let a = $r(n); if (!Ro(a)) { let c = Rr(n).resolvedSymbol; if (c) return het(a, c) } } function Aie(n) { if (a8(n, n.typeArguments), n.kind === 180 && !Yn(n) && !qw(n) && n.typeArguments && n.typeName.end !== n.typeArguments.pos) { let a = Gn(n); Xse(a, n.typeName.end) === 24 && u0(n, xo(a.text, n.typeName.end), 1, _.JSDoc_types_can_only_be_used_inside_documentation_comments) } mn(n.typeArguments, qa), KIe(n) } function KIe(n) { let a = $r(n); if (!Ro(a)) { n.typeArguments && i(() => { let u = xie(n); u && JIe(n, u) }); let c = Rr(n).resolvedSymbol; c && vt(c.declarations, u => o2(u) && !!(u.flags & 268435456)) && Xh(BM(n), c.declarations, c.escapedName) } } function get(n) { let a = zr(n.parent, _6); if (!a) return; let c = xie(a); if (!c) return; let u = eu(c[a.typeArguments.indexOf(n)]); return u && Oi(u, Wu(c, oU(a, c))) } function yet(n) { $xe(n) } function vet(n) { mn(n.members, qa), i(a); function a() { let c = GAe(n); mU(c, c.symbol), Tie(n), jIe(n) } } function bet(n) { qa(n.elementType) } function Eet(n) { let a = n.elements, c = !1, u = !1, p = vt(a, bL); for (let h of a) { if (h.kind !== 199 && p) { an(h, _.Tuple_members_must_all_have_names_or_all_not_have_names); break } let T = hne(h); if (T & 8) { let k = $r(h.type); if (!Kv(k)) { Fe(h, _.A_rest_element_type_must_be_an_array_type); break } (_f(k) || po(k) && k.target.combinedFlags & 4) && (u = !0) } else if (T & 4) { if (u) { an(h, _.A_rest_element_cannot_follow_another_rest_element); break } u = !0 } else if (T & 2) { if (u) { an(h, _.An_optional_element_cannot_follow_a_rest_element); break } c = !0 } else if (c) { an(h, _.A_required_element_cannot_follow_an_optional_element); break } } mn(n.elements, qa), $r(n) } function Tet(n) { mn(n.types, qa), $r(n) } function qIe(n, a) { if (!(n.flags & 8388608)) return n; let c = n.objectType, u = n.indexType; if (to(u, Gp(c, !1))) return a.kind === 209 && Um(a) && Ur(c) & 32 && Pp(c) & 1 && Fe(a, _.Index_signature_in_type_0_only_permits_reading, Ee(c)), n; let p = Eu(c); if (Cm(p, rt) && ul(u, 296)) return n; if (Zb(c)) { let h = eB(u, a); if (h) { let T = QE(p, k => ja(k, h)); if (T && Ef(T) & 24) return Fe(a, _.Private_or_protected_member_0_cannot_be_accessed_on_a_type_parameter, Gi(h)), ve } } return Fe(a, _.Type_0_cannot_be_used_to_index_type_1, Ee(u), Ee(c)), ve } function xet(n) { qa(n.objectType), qa(n.indexType), qIe(RAe(n), n) } function Aet(n) { Cet(n), qa(n.typeParameter), qa(n.nameType), qa(n.type), n.type || qv(n, Se); let a = Cne(n), c = by(a); if (c) wu(c, Si, n.nameType); else { let u = rp(a); wu(u, Si, EA(n.typeParameter)) } } function Cet(n) { var a; if ((a = n.members) != null && a.length) return an(n.members[0], _.A_mapped_type_may_not_declare_properties_or_methods) } function Iet(n) { oB(n) } function Let(n) { jrt(n), qa(n.type) } function ket(n) { pa(n, qa) } function Det(n) { jn(n, c => c.parent && c.parent.kind === 191 && c.parent.extendsType === c) || an(n, _.infer_declarations_are_only_permitted_in_the_extends_clause_of_a_conditional_type), qa(n.typeParameter); let a = fr(n.typeParameter); if (a.declarations && a.declarations.length > 1) { let c = Ai(a); if (!c.typeParametersChecked) { c.typeParametersChecked = !0; let u = UE(a), p = Ase(a, 165); if (!xLe(p, [u], h => [h])) { let h = E(a); for (let T of p) Fe(T.name, _.All_declarations_of_0_must_have_identical_constraints, h) } } } Dy(n) } function wet(n) { for (let a of n.templateSpans) { qa(a.type); let c = $r(a.type); wu(c, Za, a.type) } $r(n) } function Ret(n) { qa(n.argument), n.assertions && qS(n.assertions.assertClause, an) && (TR() || an(n.assertions.assertClause, _.resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next), $s(Y) !== 3 && $s(Y) !== 99 && an(n.assertions.assertClause, _.resolution_mode_assertions_are_only_supported_when_moduleResolution_is_node16_or_nodenext)), KIe(n) } function Oet(n) { n.dotDotDotToken && n.questionToken && an(n, _.A_tuple_member_cannot_be_both_optional_and_rest), n.type.kind === 187 && an(n.type, _.A_labeled_tuple_element_is_declared_as_optional_with_a_question_mark_after_the_name_and_before_the_colon_rather_than_after_the_type), n.type.kind === 188 && an(n.type, _.A_labeled_tuple_element_is_declared_as_rest_with_a_before_the_name_rather_than_before_the_type), qa(n.type), $r(n) } function qM(n) { return (cd(n, 8) || xu(n)) && !!(n.flags & 16777216) } function sU(n, a) { let c = wg(n); return n.parent.kind !== 261 && n.parent.kind !== 260 && n.parent.kind !== 228 && n.flags & 16777216 && (!(c & 2) && !(Tp(n.parent) && Tc(n.parent.parent) && mp(n.parent.parent)) && (c |= 1), c |= 2), c & a } function cU(n) { i(() => Net(n)) } function Net(n) { function a(cn, rr) { return rr !== void 0 && rr.parent === cn[0].parent ? rr : cn[0] } function c(cn, rr, Jt, Cn, Rn) { if ((Cn ^ Rn) !== 0) { let Hr = sU(a(cn, rr), Jt); mn(cn, qi => { let wa = sU(qi, Jt) ^ Hr; wa & 1 ? Fe(sa(qi), _.Overload_signatures_must_all_be_exported_or_non_exported) : wa & 2 ? Fe(sa(qi), _.Overload_signatures_must_all_be_ambient_or_non_ambient) : wa & 24 ? Fe(sa(qi) || qi, _.Overload_signatures_must_all_be_public_private_or_protected) : wa & 256 && Fe(sa(qi), _.Overload_signatures_must_all_be_abstract_or_non_abstract) }) } } function u(cn, rr, Jt, Cn) { if (Jt !== Cn) { let Rn = uS(a(cn, rr)); mn(cn, Br => { uS(Br) !== Rn && Fe(sa(Br), _.Overload_signatures_must_all_be_optional_or_required) }) } } let p = 283, h = 0, T = p, k = !1, O = !0, H = !1, J, de, Ae, xe = n.declarations, tt = (n.flags & 16384) !== 0; function It(cn) { if (cn.name && rc(cn.name)) return; let rr = !1, Jt = pa(cn.parent, Rn => { if (rr) return Rn; rr = Rn === cn }); if (Jt && Jt.pos === cn.end && Jt.kind === cn.kind) { let Rn = Jt.name || Jt, Br = Jt.name; if (cn.name && Br && (pi(cn.name) && pi(Br) && cn.name.escapedText === Br.escapedText || ts(cn.name) && ts(Br) || c_(cn.name) && c_(Br) && MI(cn.name) === MI(Br))) { if ((cn.kind === 171 || cn.kind === 170) && Ca(cn) !== Ca(Jt)) { let qi = Ca(cn) ? _.Function_overload_must_be_static : _.Function_overload_must_not_be_static; Fe(Rn, qi) } return } if (Pf(Jt.body)) { Fe(Rn, _.Function_implementation_name_must_be_0, os(cn.name)); return } } let Cn = cn.name || cn; tt ? Fe(Cn, _.Constructor_implementation_is_missing) : Mr(cn, 256) ? Fe(Cn, _.All_declarations_of_an_abstract_method_must_be_consecutive) : Fe(Cn, _.Function_implementation_is_missing_or_not_immediately_following_the_declaration) } let Tn = !1, un = !1, Nn = !1, en = []; if (xe) for (let cn of xe) { let rr = cn, Jt = rr.flags & 16777216, Cn = rr.parent && (rr.parent.kind === 261 || rr.parent.kind === 184) || Jt; if (Cn && (Ae = void 0), (rr.kind === 260 || rr.kind === 228) && !Jt && (Nn = !0), rr.kind === 259 || rr.kind === 171 || rr.kind === 170 || rr.kind === 173) { en.push(rr); let Rn = sU(rr, p); h |= Rn, T &= Rn, k = k || uS(rr), O = O && uS(rr); let Br = Pf(rr.body); Br && J ? tt ? un = !0 : Tn = !0 : Ae?.parent === rr.parent && Ae.end !== rr.pos && It(Ae), Br ? J || (J = rr) : H = !0, Ae = rr, Cn || (de = rr) } if (Yn(cn) && Ia(cn) && cn.jsDoc) { for (let Rn of cn.jsDoc) if (Rn.tags) for (let Br of Rn.tags) kL(Br) && (H = !0) } } if (un && mn(en, cn => { Fe(cn, _.Multiple_constructor_implementations_are_not_allowed) }), Tn && mn(en, cn => { Fe(sa(cn) || cn, _.Duplicate_function_implementation) }), Nn && !tt && n.flags & 16 && xe) { let cn = Pr(xe, rr => rr.kind === 260).map(rr => hr(rr, _.Consider_adding_a_declare_modifier_to_this_class)); mn(xe, rr => { let Jt = rr.kind === 260 ? _.Class_declaration_cannot_implement_overload_list_for_0 : rr.kind === 259 ? _.Function_with_bodies_can_only_merge_with_classes_that_are_ambient : void 0; Jt && Ao(Fe(sa(rr) || rr, Jt, fc(n)), ...cn) }) } if (de && !de.body && !Mr(de, 256) && !de.questionToken && It(de), H && (xe && (c(xe, J, p, h, T), u(xe, J, k, O)), J)) { let cn = Xb(n), rr = ip(J); for (let Jt of cn) if (!aXe(rr, Jt)) { let Cn = Jt.declaration && X0(Jt.declaration) ? Jt.declaration.parent.tagName : Jt.declaration; Ao(Fe(Cn, _.This_overload_signature_is_not_compatible_with_its_implementation_signature), hr(J, _.The_implementation_signature_is_declared_here)); break } } } function kD(n) { i(() => Pet(n)) } function Pet(n) { let a = n.localSymbol; if (!a && (a = fr(n), !a.exportSymbol) || nc(a, n.kind) !== n) return; let c = 0, u = 0, p = 0; for (let H of a.declarations) { let J = O(H), de = sU(H, 1025); de & 1 ? de & 1024 ? p |= J : c |= J : u |= J } let h = c | u, T = c & u, k = p & h; if (T || k) for (let H of a.declarations) { let J = O(H), de = sa(H); J & k ? Fe(de, _.Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_default_0_declaration_instead, os(de)) : J & T && Fe(de, _.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local, os(de)) } function O(H) { let J = H; switch (J.kind) { case 261: case 262: case 349: case 341: case 343: return 2; case 264: return lu(J) || Gh(J) !== 0 ? 5 : 4; case 260: case 263: case 302: return 3; case 308: return 7; case 274: case 223: let de = J, Ae = pc(de) ? de.expression : de.right; if (!bc(Ae)) return 1; J = Ae; case 268: case 271: case 270: let xe = 0, tt = wc(fr(J)); return mn(tt.declarations, It => { xe |= O(It) }), xe; case 257: case 205: case 259: case 273: case 79: return 1; case 170: case 168: return 2; default: return L.failBadSyntaxKind(J) } } } function DD(n, a, c, u) { let p = wD(n, a); return p && rT(p, a, c, u) } function wD(n, a, c) { if (Zo(n)) return; let u = n; if (u.promisedTypeOfPromise) return u.promisedTypeOfPromise; if (Bv(n, oM(!1))) return u.promisedTypeOfPromise = Ko(n)[0]; if (zM(Ty(n), 134479868)) return; let p = Vc(n, "then"); if (Zo(p)) return; let h = p ? xa(p, 0) : Je; if (h.length === 0) { a && Fe(a, _.A_promise_must_have_a_then_method); return } let T, k; for (let J of h) { let de = Yb(J); de && de !== yt && !Bp(n, de, hm) ? T = de : k = Sn(k, J) } if (!k) { L.assertIsDefined(T), c && (c.value = T), a && Fe(a, _.The_this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1, Ee(n), Ee(T)); return } let O = wf(Gr(on(k, uie)), 2097152); if (Zo(O)) return; let H = xa(O, 0); if (H.length === 0) { a && Fe(a, _.The_first_parameter_of_the_then_method_of_a_promise_must_be_a_callback); return } return u.promisedTypeOfPromise = Gr(on(H, uie), 2) } function RD(n, a, c, u, p) { return (a ? rT(n, c, u, p) : bg(n, c, u, p)) || ve } function XIe(n) { if (zM(Ty(n), 134479868)) return !1; let a = Vc(n, "then"); return !!a && xa(wf(a, 2097152), 0).length > 0 } function lU(n) { var a; if (n.flags & 16777216) { let c = mne(!1); return !!c && n.aliasSymbol === c && ((a = n.aliasTypeArguments) == null ? void 0 : a.length) === 1 } return !1 } function UC(n) { return n.flags & 1048576 ? Ls(n, UC) : lU(n) ? n.aliasTypeArguments[0] : n } function YIe(n) { if (Zo(n) || lU(n)) return !1; if (Zb(n)) { let a = bu(n); if (a ? a.flags & 3 || mh(a) || yh(a, XIe) : Js(n, 8650752)) return !0 } return !1 } function Met(n) { let a = mne(!0); if (a) return Jx(a, [UC(n)]) } function Fet(n) { if (YIe(n)) { let a = Met(n); if (a) return a } return L.assert(lU(n) || wD(n) === void 0, "type provided should not be a non-generic 'promise'-like."), n } function rT(n, a, c, u) { let p = bg(n, a, c, u); return p && Fet(p) } function bg(n, a, c, u) { if (Zo(n) || lU(n)) return n; let p = n; if (p.awaitedTypeOfType) return p.awaitedTypeOfType; if (n.flags & 1048576) { if (Jh.lastIndexOf(n.id) >= 0) { a && Fe(a, _.Type_is_referenced_directly_or_indirectly_in_the_fulfillment_callback_of_its_own_then_method); return } let k = a ? H => bg(H, a, c, u) : bg; Jh.push(n.id); let O = Ls(n, k); return Jh.pop(), p.awaitedTypeOfType = O } if (YIe(n)) return p.awaitedTypeOfType = n; let h = { value: void 0 }, T = wD(n, void 0, h); if (T) { if (n.id === T.id || Jh.lastIndexOf(T.id) >= 0) { a && Fe(a, _.Type_is_referenced_directly_or_indirectly_in_the_fulfillment_callback_of_its_own_then_method); return } Jh.push(n.id); let k = bg(T, a, c, u); return Jh.pop(), k ? p.awaitedTypeOfType = k : void 0 } if (XIe(n)) { if (a) { L.assertIsDefined(c); let k; h.value && (k = da(k, _.The_this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1, Ee(n), Ee(h.value))), k = da(k, c, u), Lo.add(Lh(Gn(a), a, k)) } return } return p.awaitedTypeOfType = n } function Get(n, a) { let c = $r(a); if (R >= 2) { if (Ro(c)) return; let u = oM(!0); if (u !== ro && !Bv(c, u)) { Fe(a, _.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type_Did_you_mean_to_write_Promise_0, Ee(bg(c) || yt)); return } } else { if (Uet(a), Ro(c)) return; let u = Jw(a); if (u === void 0) { Fe(a, _.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, Ee(c)); return } let p = uc(u, 111551, !0), h = p ? zn(p) : ve; if (Ro(h)) { u.kind === 79 && u.escapedText === "Promise" && Bx(c) === oM(!1) ? Fe(a, _.An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option) : Fe(a, _.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, qd(u)); return } let T = mKe(!0); if (T === Ki) { Fe(a, _.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, qd(u)); return } if (!wu(h, T, a, _.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value)) return; let k = u && Yd(u), O = yd(n.locals, k.escapedText, 111551); if (O) { Fe(O.valueDeclaration, _.Duplicate_identifier_0_Compiler_uses_declaration_1_to_support_async_functions, vr(k), qd(u)); return } } RD(c, !1, n, _.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member) } function Bet(n) { let a = MC(n); tU(a, n); let c = qo(a); if (c.flags & 1) return; let u = _ie(n); if (!u?.resolvedReturnType) return; let p, h = u.resolvedReturnType; switch (n.parent.kind) { case 260: case 228: p = _.Decorator_function_return_type_0_is_not_assignable_to_type_1; break; case 169: if (!$) { p = _.Decorator_function_return_type_0_is_not_assignable_to_type_1; break } case 166: p = _.Decorator_function_return_type_is_0_but_is_expected_to_be_void_or_any; break; case 171: case 174: case 175: p = _.Decorator_function_return_type_0_is_not_assignable_to_type_1; break; default: return L.failBadSyntaxKind(n.parent) }wu(c, h, n.expression, p) } function OD(n, a, c, u, p, h = c.length, T = 0) { let k = D.createFunctionTypeNode(void 0, Je, D.createKeywordTypeNode(131)); return Am(k, n, a, c, u, p, h, T) } function Cie(n, a, c, u, p, h, T) { let k = OD(n, a, c, u, p, h, T); return HE(k) } function $Ie(n) { return Cie(void 0, void 0, Je, n) } function QIe(n) { let a = A_("value", n); return Cie(void 0, void 0, [a], yt) } function Uet(n) { ZIe(n && Jw(n), !1) } function ZIe(n, a) { if (!n) return; let c = Yd(n), u = (n.kind === 79 ? 788968 : 1920) | 2097152, p = zs(c, c.escapedText, u, void 0, void 0, !0); if (p && p.flags & 2097152) { if (!Y.verbatimModuleSyntax && ig(p) && !MD(wc(p)) && !nd(p)) Hb(p); else if (a && d_(Y) && Rl(Y) >= 5 && !ig(p) && !vt(p.declarations, I0)) { let h = Fe(n, _.A_type_referenced_in_a_decorated_signature_must_be_imported_with_import_type_or_a_namespace_import_when_isolatedModules_and_emitDecoratorMetadata_are_enabled), T = wr(p.declarations || Je, Zh); T && Ao(h, hr(T, _._0_was_imported_here, vr(c))) } } } function VC(n) { let a = Iie(n); a && Cd(a) && ZIe(a, !0) } function Iie(n) { if (n) switch (n.kind) { case 190: case 189: return eLe(n.types); case 191: return eLe([n.trueType, n.falseType]); case 193: case 199: return Iie(n.type); case 180: return n.typeName } } function eLe(n) { let a; for (let c of n) { for (; c.kind === 193 || c.kind === 199;)c = c.type; if (c.kind === 144 || !U && (c.kind === 198 && c.literal.kind === 104 || c.kind === 155)) continue; let u = Iie(c); if (!u) return; if (a) { if (!Re(a) || !Re(u) || a.escapedText !== u.escapedText) return } else a = u } return a } function uU(n) { let a = Cl(n); return Fm(n) ? SH(a) : a } function XM(n) { if (!HS(n) || !bf(n) || !n.modifiers || !M6($, n, n.parent, n.parent.parent)) return; let a = wr(n.modifiers, du); if (a) { if ($ ? (Hc(a, 8), n.kind === 166 && Hc(a, 32)) : R < 99 && (Hc(a, 8), sl(n) ? n.name ? ALe(n) && Hc(a, 8388608) : Hc(a, 8388608) : _u(n) || (pi(n.name) && (Nc(n) || rb(n) || Id(n)) && Hc(a, 8388608), ts(n.name) && Hc(a, 16777216))), Y.emitDecoratorMetadata) switch (Hc(a, 16), n.kind) { case 260: let c = Vm(n); if (c) for (let T of c.parameters) VC(uU(T)); break; case 174: case 175: let u = n.kind === 174 ? 175 : 174, p = nc(fr(n), u); VC(N(n) || p && N(p)); break; case 171: for (let T of n.parameters) VC(uU(T)); VC(U_(n)); break; case 169: VC(Cl(n)); break; case 166: VC(uU(n)); let h = n.parent; for (let T of h.parameters) VC(uU(T)); break }for (let c of n.modifiers) du(c) && Bet(c) } } function Vet(n) { i(a); function a() { nLe(n), Yie(n), jC(n, n.name) } } function jet(n) { n.typeExpression || Fe(n.name, _.JSDoc_typedef_tag_should_either_have_a_type_annotation_or_be_followed_by_property_or_member_tags), n.name && HC(n.name, _.Type_alias_name_cannot_be_0), qa(n.typeExpression), t8(jy(n)) } function Het(n) { qa(n.constraint); for (let a of n.typeParameters) qa(a) } function Wet(n) { qa(n.typeExpression) } function zet(n) { qa(n.typeExpression); let a = WA(n); if (a) { let c = kj(a, v3); if (Fn(c) > 1) for (let u = 1; u < Fn(c); u++) { let p = c[u].tagName; Fe(p, _._0_tag_already_specified, vr(p)) } } } function Jet(n) { n.name && r8(n.name, !0) } function Ket(n) { qa(n.typeExpression) } function qet(n) { qa(n.typeExpression) } function Xet(n) { i(a), LD(n); function a() { !n.type && !jA(n) && qv(n, Se) } } function Yet(n) { let a = WA(n); (!a || !sl(a) && !_u(a)) && Fe(a, _.JSDoc_0_is_not_attached_to_a_class, vr(n.tagName)) } function $et(n) { let a = WA(n); if (!a || !sl(a) && !_u(a)) { Fe(a, _.JSDoc_0_is_not_attached_to_a_class, vr(n.tagName)); return } let c = A0(a).filter(x2); L.assert(c.length > 0), c.length > 1 && Fe(c[1], _.Class_declarations_cannot_have_more_than_one_augments_or_extends_tag); let u = tLe(n.class.expression), p = P0(a); if (p) { let h = tLe(p.expression); h && u.escapedText !== h.escapedText && Fe(u, _.JSDoc_0_1_does_not_match_the_extends_2_clause, vr(n.tagName), vr(u), vr(h)) } } function Qet(n) { let a = dS(n); a && xu(a) && Fe(n, _.An_accessibility_modifier_cannot_be_used_with_a_private_identifier) } function tLe(n) { switch (n.kind) { case 79: return n; case 208: return n.name; default: return } } function nLe(n) { var a; XM(n), LD(n); let c = pl(n); if (n.name && n.name.kind === 164 && vg(n.name), Ux(n)) { let h = fr(n), T = n.localSymbol || h, k = (a = T.declarations) == null ? void 0 : a.find(O => O.kind === n.kind && !(O.flags & 262144)); n === k && cU(T), h.parent && cU(h) } let u = n.kind === 170 ? void 0 : n.body; if (qa(u), pie(n, Hx(n)), i(p), Yn(n)) { let h = x0(n); h && h.typeExpression && !Ore($r(h.typeExpression), n) && Fe(h.typeExpression.type, _.The_type_of_a_function_declaration_must_match_the_function_s_signature) } function p() { U_(n) || (rc(u) && !qM(n) && qv(n, Se), c & 1 && Pf(u) && qo(ip(n))) } } function Dy(n) { i(a); function a() { let c = Gn(n), u = rn.get(c.path); u || (u = [], rn.set(c.path, u)), u.push(n) } } function rLe(n, a) { for (let c of n) switch (c.kind) { case 260: case 228: Zet(c, a), Lie(c, a); break; case 308: case 264: case 238: case 266: case 245: case 246: case 247: oLe(c, a); break; case 173: case 215: case 259: case 216: case 171: case 174: case 175: c.body && oLe(c, a), Lie(c, a); break; case 170: case 176: case 177: case 181: case 182: case 262: case 261: Lie(c, a); break; case 192: ett(c, a); break; default: L.assertNever(c, "Node should not have been registered for unused identifiers check") } } function iLe(n, a, c) { let u = sa(n) || n, p = o2(n) ? _._0_is_declared_but_never_used : _._0_is_declared_but_its_value_is_never_read; c(n, 0, hr(u, p, a)) } function YM(n) { return Re(n) && vr(n).charCodeAt(0) === 95 } function Zet(n, a) { for (let c of n.members) switch (c.kind) { case 171: case 169: case 174: case 175: if (c.kind === 175 && c.symbol.flags & 32768) break; let u = fr(c); !u.isReferenced && (cd(c, 8) || zl(c) && pi(c.name)) && !(c.flags & 16777216) && a(c, 0, hr(c.name, _._0_is_declared_but_its_value_is_never_read, E(u))); break; case 173: for (let p of c.parameters) !p.symbol.isReferenced && Mr(p, 8) && a(p, 0, hr(p.name, _.Property_0_is_declared_but_its_value_is_never_read, fc(p.symbol))); break; case 178: case 237: case 172: break; default: L.fail("Unexpected class member") } } function ett(n, a) { let { typeParameter: c } = n; kie(c) && a(n, 1, hr(n, _._0_is_declared_but_its_value_is_never_read, vr(c.name))) } function Lie(n, a) { let c = fr(n).declarations; if (!c || To(c) !== n) return; let u = jy(n), p = new Set; for (let h of u) { if (!kie(h)) continue; let T = vr(h.name), { parent: k } = h; if (k.kind !== 192 && k.typeParameters.every(kie)) { if (_0(p, k)) { let O = Gn(k), H = H_(k) ? MW(k) : FW(O, k.typeParameters), J = k.typeParameters.length === 1, de = J ? _._0_is_declared_but_its_value_is_never_read : _.All_type_parameters_are_unused, Ae = J ? T : void 0; a(h, 1, al(O, H.pos, H.end - H.pos, de, Ae)) } } else a(h, 1, hr(h, _._0_is_declared_but_its_value_is_never_read, T)) } } function kie(n) { return !(No(n.symbol).isReferenced & 262144) && !YM(n.name) } function $M(n, a, c, u) { let p = String(u(a)), h = n.get(p); h ? h[1].push(c) : n.set(p, [a, [c]]) } function aLe(n) { return zr(nm(n), ha) } function ttt(n) { return Wo(n) ? cm(n.parent) ? !!(n.propertyName && YM(n.name)) : YM(n.name) : lu(n) || (wi(n) && CA(n.parent.parent) || sLe(n)) && YM(n.name) } function oLe(n, a) { let c = new Map, u = new Map, p = new Map; n.locals.forEach(h => { if (!(h.flags & 262144 ? !(h.flags & 3 && !(h.isReferenced & 3)) : h.isReferenced || h.exportSymbol) && h.declarations) { for (let T of h.declarations) if (!ttt(T)) if (sLe(T)) $M(c, rtt(T), T, zo); else if (Wo(T) && cm(T.parent)) { let k = To(T.parent.elements); (T === k || !To(T.parent.elements).dotDotDotToken) && $M(u, T.parent, T, zo) } else if (wi(T)) $M(p, T.parent, T, zo); else { let k = h.valueDeclaration && aLe(h.valueDeclaration), O = h.valueDeclaration && sa(h.valueDeclaration); k && O ? !Ad(k, k.parent) && !G0(k) && !YM(O) && (Wo(T) && g2(T.parent) ? $M(u, T.parent, T, zo) : a(k, 1, hr(O, _._0_is_declared_but_its_value_is_never_read, fc(h)))) : iLe(T, fc(h), a) } } }), c.forEach(([h, T]) => { let k = h.parent; if ((h.name ? 1 : 0) + (h.namedBindings ? h.namedBindings.kind === 271 ? 1 : h.namedBindings.elements.length : 0) === T.length) a(k, 0, T.length === 1 ? hr(k, _._0_is_declared_but_its_value_is_never_read, vr(Vo(T).name)) : hr(k, _.All_imports_in_import_declaration_are_unused)); else for (let H of T) iLe(H, vr(H.name), a) }), u.forEach(([h, T]) => { let k = aLe(h.parent) ? 1 : 0; if (h.elements.length === T.length) T.length === 1 && h.parent.kind === 257 && h.parent.parent.kind === 258 ? $M(p, h.parent.parent, h.parent, zo) : a(h, k, T.length === 1 ? hr(h, _._0_is_declared_but_its_value_is_never_read, QM(Vo(T).name)) : hr(h, _.All_destructured_elements_are_unused)); else for (let O of T) a(O, k, hr(O, _._0_is_declared_but_its_value_is_never_read, QM(O.name))) }), p.forEach(([h, T]) => { if (h.declarations.length === T.length) a(h, 0, T.length === 1 ? hr(Vo(T).name, _._0_is_declared_but_its_value_is_never_read, QM(Vo(T).name)) : hr(h.parent.kind === 240 ? h.parent : h, _.All_variables_are_unused)); else for (let k of T) a(k, 0, hr(k, _._0_is_declared_but_its_value_is_never_read, QM(k.name))) }) } function ntt() { var n; for (let a of m1) if (!((n = fr(a)) != null && n.isReferenced)) { let c = bA(a); L.assert(CT(c), "Only parameter declaration should be checked here"); let u = hr(a.name, _._0_is_an_unused_renaming_of_1_Did_you_intend_to_use_it_as_a_type_annotation, os(a.name), os(a.propertyName)); c.type || Ao(u, al(Gn(c), c.end, 1, _.We_can_only_write_a_type_for_0_by_adding_a_type_for_the_entire_parameter_here, os(a.propertyName))), Lo.add(u) } } function QM(n) { switch (n.kind) { case 79: return vr(n); case 204: case 203: return QM(Ga(Vo(n.elements), Wo).name); default: return L.assertNever(n) } } function sLe(n) { return n.kind === 270 || n.kind === 273 || n.kind === 271 } function rtt(n) { return n.kind === 270 ? n : n.kind === 271 ? n.parent : n.parent.parent } function dU(n) { if (n.kind === 238 && vh(n), Bj(n)) { let a = ki; mn(n.statements, qa), ki = a } else mn(n.statements, qa); n.locals && Dy(n) } function itt(n) { R >= 2 || !Yj(n) || n.flags & 16777216 || rc(n.body) || mn(n.parameters, a => { a.name && !La(a.name) && a.name.escapedText === _t.escapedName && Ev("noEmit", a, _.Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters) }) } function ND(n, a, c) { if (a?.escapedText !== c || n.kind === 169 || n.kind === 168 || n.kind === 171 || n.kind === 170 || n.kind === 174 || n.kind === 175 || n.kind === 299 || n.flags & 16777216 || (lm(n) || Nl(n) || $u(n)) && I0(n)) return !1; let u = nm(n); return !(ha(u) && rc(u.parent.body)) } function att(n) { jn(n, a => sA(a) & 4 ? (n.kind !== 79 ? Fe(sa(n), _.Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference) : Fe(n, _.Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference), !0) : !1) } function ott(n) { jn(n, a => sA(a) & 8 ? (n.kind !== 79 ? Fe(sa(n), _.Duplicate_identifier_newTarget_Compiler_uses_variable_declaration_newTarget_to_capture_new_target_meta_property_reference) : Fe(n, _.Expression_resolves_to_variable_declaration_newTarget_that_compiler_uses_to_capture_new_target_meta_property_reference), !0) : !1) } function stt(n, a) { if (ie >= 5 && !(ie >= 100 && Gn(n).impliedNodeFormat === 1) || !a || !ND(n, a, "require") && !ND(n, a, "exports") || Tc(n) && Gh(n) !== 1) return; let c = FE(n); c.kind === 308 && kd(c) && Ev("noEmit", a, _.Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module, os(a), os(a)) } function ctt(n, a) { if (!a || R >= 4 || !ND(n, a, "Promise") || Tc(n) && Gh(n) !== 1) return; let c = FE(n); c.kind === 308 && kd(c) && c.flags & 2048 && Ev("noEmit", a, _.Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module_containing_async_functions, os(a), os(a)) } function ltt(n, a) { R <= 8 && (ND(n, a, "WeakMap") || ND(n, a, "WeakSet")) && Lb.push(n) } function utt(n) { let a = tm(n); sA(a) & 4194304 && (L.assert(zl(n) && Re(n.name) && typeof n.name.escapedText == "string", "The target of a WeakMap/WeakSet collision check should be an identifier"), Ev("noEmit", n, _.Compiler_reserves_name_0_when_emitting_private_identifier_downlevel, n.name.escapedText)) } function dtt(n, a) { a && R >= 2 && R <= 8 && ND(n, a, "Reflect") && bv.push(n) } function ftt(n) { let a = !1; if (_u(n)) { for (let c of n.members) if (sA(c) & 8388608) { a = !0; break } } else if (ms(n)) sA(n) & 8388608 && (a = !0); else { let c = tm(n); c && sA(c) & 8388608 && (a = !0) } a && (L.assert(zl(n) && Re(n.name), "The target of a Reflect collision check should be an identifier"), Ev("noEmit", n, _.Duplicate_identifier_0_Compiler_reserves_name_1_when_emitting_super_references_in_static_initializers, os(n.name), "Reflect")) } function jC(n, a) { a && (stt(n, a), ctt(n, a), ltt(n, a), dtt(n, a), Yr(n) ? (HC(a, _.Class_name_cannot_be_0), n.flags & 16777216 || Utt(a)) : hb(n) && HC(a, _.Enum_name_cannot_be_0)) } function _tt(n) { if (G_(n) & 3 || CT(n) || n.kind === 257 && !n.initializer) return; let a = fr(n); if (a.flags & 1) { if (!Re(n.name)) return L.fail(); let c = zs(n, n.name.escapedText, 3, void 0, void 0, !1); if (c && c !== a && c.flags & 2 && WB(c) & 3) { let u = cb(c.valueDeclaration, 258), p = u.parent.kind === 240 && u.parent.parent ? u.parent.parent : void 0; if (!(p && (p.kind === 238 && Ia(p.parent) || p.kind === 265 || p.kind === 264 || p.kind === 308))) { let T = E(c); Fe(n, _.Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1, T, T) } } } } function PD(n) { return n === at ? Se : n === bn ? Et : n } function ZM(n) { var a; if (XM(n), Wo(n) || qa(n.type), !n.name) return; if (n.name.kind === 164 && (vg(n.name), mT(n) && n.initializer && Ic(n.initializer)), Wo(n)) { if (n.propertyName && Re(n.name) && CT(n) && rc(Xd(n).body)) { m1.push(n); return } cm(n.parent) && n.dotDotDotToken && R < 5 && Hc(n, 4), n.propertyName && n.propertyName.kind === 164 && vg(n.propertyName); let p = n.parent.parent, h = n.dotDotDotToken ? 64 : 0, T = Px(p, h), k = n.propertyName || n.name; if (T && !La(k)) { let O = pg(k); if (fh(O)) { let H = Np(O), J = ja(T, H); J && (MM(J, void 0, !1), Hre(n, !!p.initializer && p.initializer.kind === 106, !1, T, J)) } } } if (La(n.name) && (n.name.kind === 204 && R < 2 && Y.downlevelIteration && Hc(n, 512), mn(n.name.elements, qa)), ha(n) && n.initializer && rc(Xd(n).body)) { Fe(n, _.A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation); return } if (La(n.name)) { let p = mT(n) && n.initializer && n.parent.parent.kind !== 246, h = !vt(n.name.elements, y8(ol)); if (p || h) { let T = Zs(n); if (p) { let k = Ic(n.initializer); U && h ? wCe(k, n) : Ly(k, Zs(n), n, n.initializer) } h && (g2(n.name) ? wy(65, T, Oe, n) : U && wCe(T, n)) } return } let c = fr(n); if (c.flags & 2097152 && (N0(n) || lce(n))) { hU(n); return } let u = PD(zn(c)); if (n === c.valueDeclaration) { let p = mT(n) && Yw(n); p && !(Yn(n) && rs(p) && (p.properties.length === 0 || ub(n.name)) && ((a = c.exports) != null && a.size)) && n.parent.parent.kind !== 246 && Ly(Ic(p), u, n, p, void 0), c.declarations && c.declarations.length > 1 && vt(c.declarations, h => h !== n && PA(h) && !lLe(h, n)) && Fe(n.name, _.All_declarations_of_0_must_have_identical_modifiers, os(n.name)) } else { let p = PD(Zs(n)); !Ro(u) && !Ro(p) && !ph(u, p) && !(c.flags & 67108864) && cLe(c.valueDeclaration, u, n, p), mT(n) && n.initializer && Ly(Ic(n.initializer), p, n, n.initializer, void 0), c.valueDeclaration && !lLe(n, c.valueDeclaration) && Fe(n.name, _.All_declarations_of_0_must_have_identical_modifiers, os(n.name)) } n.kind !== 169 && n.kind !== 168 && (kD(n), (n.kind === 257 || n.kind === 205) && _tt(n), jC(n, n.name)) } function cLe(n, a, c, u) { let p = sa(c), h = c.kind === 169 || c.kind === 168 ? _.Subsequent_property_declarations_must_have_the_same_type_Property_0_must_be_of_type_1_but_here_has_type_2 : _.Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_type_2, T = os(p), k = Fe(p, h, T, Ee(a), Ee(u)); n && Ao(k, hr(n, _._0_was_also_declared_here, T)) } function lLe(n, a) { if (n.kind === 166 && a.kind === 257 || n.kind === 257 && a.kind === 166) return !0; if (uS(n) !== uS(a)) return !1; let c = 888; return hS(n, c) === hS(a, c) } function Die(n) { var a, c; (a = ai) == null || a.push(ai.Phase.Check, "checkVariableDeclaration", { kind: n.kind, pos: n.pos, end: n.end, path: n.tracingPath }), Krt(n), ZM(n), (c = ai) == null || c.pop() } function ptt(n) { return Wrt(n), ZM(n) } function mtt(n) { !km(n) && !Zie(n.declarationList) && qrt(n), mn(n.declarationList.declarations, qa) } function htt(n) { vh(n), Yi(n.expression) } function gtt(n) { vh(n); let a = aA(n.expression); wie(n.expression, a, n.thenStatement), qa(n.thenStatement), n.thenStatement.kind === 239 && Fe(n.thenStatement, _.The_body_of_an_if_statement_cannot_be_the_empty_statement), qa(n.elseStatement) } function wie(n, a, c) { if (!U) return; u(n, c); function u(h, T) { for (h = vs(h), p(h, T); ar(h) && (h.operatorToken.kind === 56 || h.operatorToken.kind === 60);)h = vs(h.left), p(h, T) } function p(h, T) { let k = CR(h) ? vs(h.right) : h; if (Bm(k)) return; if (CR(k)) { u(k, T); return } let O = k === h ? a : aA(k), H = br(k) && OIe(k.expression); if (!(iu(O) & 4194304) || H) return; let J = xa(O, 0), de = !!DD(O); if (J.length === 0 && !de) return; let Ae = Re(k) ? k : br(k) ? k.name : void 0, xe = Ae && Zf(Ae); if (!xe && !de) return; xe && ar(h.parent) && vtt(h.parent, xe) || xe && T && ytt(h, T, Ae, xe) || (de ? Tv(k, !0, _.This_condition_will_always_return_true_since_this_0_is_always_defined, lr(O)) : Fe(k, _.This_condition_will_always_return_true_since_this_function_is_always_defined_Did_you_mean_to_call_it_instead)) } } function ytt(n, a, c, u) { return !!pa(a, function p(h) { if (Re(h)) { let T = Zf(h); if (T && T === u) { if (Re(n) || Re(c) && ar(c.parent)) return !0; let k = c.parent, O = h.parent; for (; k && O;) { if (Re(k) && Re(O) || k.kind === 108 && O.kind === 108) return Zf(k) === Zf(O); if (br(k) && br(O)) { if (Zf(k.name) !== Zf(O.name)) return !1; O = O.expression, k = k.expression } else if (Pa(k) && Pa(O)) O = O.expression, k = k.expression; else return !1 } } } return pa(h, p) }) } function vtt(n, a) { for (; ar(n) && n.operatorToken.kind === 55;) { if (pa(n.right, function u(p) { if (Re(p)) { let h = Zf(p); if (h && h === a) return !0 } return pa(p, u) })) return !0; n = n.parent } return !1 } function btt(n) { vh(n), qa(n.statement), aA(n.expression) } function Ett(n) { vh(n), aA(n.expression), qa(n.statement) } function uLe(n, a) { return n.flags & 16384 && Fe(a, _.An_expression_of_type_void_cannot_be_tested_for_truthiness), n } function aA(n, a) { return uLe(Yi(n, a), n) } function Ttt(n) { vh(n) || n.initializer && n.initializer.kind === 258 && Zie(n.initializer), n.initializer && (n.initializer.kind === 258 ? mn(n.initializer.declarations, Die) : Yi(n.initializer)), n.condition && aA(n.condition), n.incrementor && Yi(n.incrementor), qa(n.statement), n.locals && Dy(n) } function Stt(n) { ske(n); let a = R6(n); if (n.awaitModifier ? a && oc(a) ? an(n.awaitModifier, _.For_await_loops_cannot_be_used_inside_a_class_static_block) : (pl(a) & 6) === 2 && R < 99 && Hc(n, 16384) : Y.downlevelIteration && R < 2 && Hc(n, 256), n.initializer.kind === 258) dLe(n); else { let c = n.initializer, u = e8(n); if (c.kind === 206 || c.kind === 207) nT(c, u || ve); else { let p = Yi(c); CD(c, _.The_left_hand_side_of_a_for_of_statement_must_be_a_variable_or_a_property_access, _.The_left_hand_side_of_a_for_of_statement_may_not_be_an_optional_property_access), u && Ly(u, p, c, n.expression) } } qa(n.statement), n.locals && Dy(n) } function xtt(n) { ske(n); let a = Wre(Yi(n.expression)); if (n.initializer.kind === 258) { let c = n.initializer.declarations[0]; c && La(c.name) && Fe(c.name, _.The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern), dLe(n) } else { let c = n.initializer, u = Yi(c); c.kind === 206 || c.kind === 207 ? Fe(c, _.The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern) : to(lqe(a), u) ? CD(c, _.The_left_hand_side_of_a_for_in_statement_must_be_a_variable_or_a_property_access, _.The_left_hand_side_of_a_for_in_statement_may_not_be_an_optional_property_access) : Fe(c, _.The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any) } (a === lt || !ul(a, 126091264)) && Fe(n.expression, _.The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter_but_here_has_type_0, Ee(a)), qa(n.statement), n.locals && Dy(n) } function dLe(n) { let a = n.initializer; if (a.declarations.length >= 1) { let c = a.declarations[0]; Die(c) } } function e8(n) { let a = n.awaitModifier ? 15 : 13; return wy(a, NC(n.expression), Oe, n.expression) } function wy(n, a, c, u) { return Zo(a) ? a : Rie(n, a, c, u, !0) || Se } function Rie(n, a, c, u, p) { let h = (n & 2) !== 0; if (a === lt) { Fie(u, a, h); return } let T = R >= 2, k = !T && Y.downlevelIteration, O = Y.noUncheckedIndexedAccess && !!(n & 128); if (T || k || h) { let tt = _U(a, n, T ? u : void 0); if (p && tt) { let It = n & 8 ? _.Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_for_of_will_always_send_0 : n & 32 ? _.Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_array_spread_will_always_send_0 : n & 64 ? _.Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_array_destructuring_will_always_send_0 : n & 16 ? _.Cannot_delegate_iteration_to_value_because_the_next_method_of_its_iterator_expects_type_1_but_the_containing_generator_will_always_send_0 : void 0; It && wu(c, tt.nextType, u, It) } if (tt || T) return O ? hD(tt && tt.yieldType) : tt && tt.yieldType } let H = a, J = !1, de = !1; if (n & 4) { if (H.flags & 1048576) { let tt = a.types, It = Pr(tt, Tn => !(Tn.flags & 402653316)); It !== tt && (H = Gr(It, 2)) } else H.flags & 402653316 && (H = lt); if (de = H !== a, de && (R < 1 && u && (Fe(u, _.Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher), J = !0), H.flags & 131072)) return O ? hD(ae) : ae } if (!Kv(H)) { if (u && !J) { let tt = !!(n & 4) && !de, [It, Tn] = xe(tt, k); Tv(u, Tn && !!DD(H), It, Ee(H)) } return de ? O ? hD(ae) : ae : void 0 } let Ae = fg(H, rt); if (de && Ae) return Ae.flags & 402653316 && !Y.noUncheckedIndexedAccess ? ae : Gr(O ? [Ae, ae, Oe] : [Ae, ae], 2); return n & 128 ? hD(Ae) : Ae; function xe(tt, It) { var Tn; return It ? tt ? [_.Type_0_is_not_an_array_type_or_a_string_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator, !0] : [_.Type_0_is_not_an_array_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator, !0] : Oie(n, 0, a, void 0) ? [_.Type_0_can_only_be_iterated_through_when_using_the_downlevelIteration_flag_or_with_a_target_of_es2015_or_higher, !1] : Att((Tn = a.symbol) == null ? void 0 : Tn.escapedName) ? [_.Type_0_can_only_be_iterated_through_when_using_the_downlevelIteration_flag_or_with_a_target_of_es2015_or_higher, !0] : tt ? [_.Type_0_is_not_an_array_type_or_a_string_type, !0] : [_.Type_0_is_not_an_array_type, !0] } } function Att(n) { switch (n) { case "Float32Array": case "Float64Array": case "Int16Array": case "Int32Array": case "Int8Array": case "NodeList": case "Uint16Array": case "Uint32Array": case "Uint8Array": case "Uint8ClampedArray": return !0 }return !1 } function Oie(n, a, c, u) { if (Zo(c)) return; let p = _U(c, n, u); return p && p[R_e(a)] } function Eg(n = lt, a = lt, c = ue) { if (n.flags & 67359327 && a.flags & 180227 && c.flags & 180227) { let u = kf([n, a, c]), p = se.get(u); return p || (p = { yieldType: n, returnType: a, nextType: c }, se.set(u, p)), p } return { yieldType: n, returnType: a, nextType: c } } function fLe(n) { let a, c, u; for (let p of n) if (!(p === void 0 || p === ht)) { if (p === wt) return wt; a = Sn(a, p.yieldType), c = Sn(c, p.returnType), u = Sn(u, p.nextType) } return a || c || u ? Eg(a && Gr(a), c && Gr(c), u && so(u)) : ht } function fU(n, a) { return n[a] } function Lm(n, a, c) { return n[a] = c } function _U(n, a, c) { var u, p; if (Zo(n)) return wt; if (!(n.flags & 1048576)) { let H = c ? { errors: void 0 } : void 0, J = _Le(n, a, c, H); if (J === ht) { if (c) { let de = Fie(c, n, !!(a & 2)); H?.errors && Ao(de, ...H.errors) } return } else if ((u = H?.errors) != null && u.length) for (let de of H.errors) Lo.add(de); return J } let h = a & 2 ? "iterationTypesOfAsyncIterable" : "iterationTypesOfIterable", T = fU(n, h); if (T) return T === ht ? void 0 : T; let k; for (let H of n.types) { let J = c ? { errors: void 0 } : void 0, de = _Le(H, a, c, J); if (de === ht) { if (c) { let Ae = Fie(c, n, !!(a & 2)); J?.errors && Ao(Ae, ...J.errors) } Lm(n, h, ht); return } else if ((p = J?.errors) != null && p.length) for (let Ae of J.errors) Lo.add(Ae); k = Sn(k, de) } let O = k ? fLe(k) : ht; return Lm(n, h, O), O === ht ? void 0 : O } function Nie(n, a) { if (n === ht) return ht; if (n === wt) return wt; let { yieldType: c, returnType: u, nextType: p } = n; return a && mne(!0), Eg(rT(c, a) || Se, rT(u, a) || Se, p) } function _Le(n, a, c, u) { if (Zo(n)) return wt; let p = !1; if (a & 2) { let h = Pie(n, ft) || mLe(n, ft); if (h) if (h === ht && c) p = !0; else return a & 8 ? Nie(h, c) : h } if (a & 1) { let h = Pie(n, Yt) || mLe(n, Yt); if (h) if (h === ht && c) p = !0; else if (a & 2) { if (h !== ht) return h = Nie(h, c), p ? h : Lm(n, "iterationTypesOfAsyncIterable", h) } else return h } if (a & 2) { let h = Mie(n, ft, c, u, p); if (h !== ht) return h } if (a & 1) { let h = Mie(n, Yt, c, u, p); if (h !== ht) return a & 2 ? (h = Nie(h, c), p ? h : Lm(n, "iterationTypesOfAsyncIterable", h)) : h } return ht } function Pie(n, a) { return fU(n, a.iterableCacheKey) } function pLe(n, a) { let c = Pie(n, a) || Mie(n, a, void 0, void 0, !1); return c === ht ? Xe : c } function mLe(n, a) { let c; if (Bv(n, c = a.getGlobalIterableType(!1)) || Bv(n, c = a.getGlobalIterableIteratorType(!1))) { let [u] = Ko(n), { returnType: p, nextType: h } = pLe(c, a); return Lm(n, a.iterableCacheKey, Eg(a.resolveIterationType(u, void 0) || u, a.resolveIterationType(p, void 0) || p, h)) } if (Bv(n, a.getGlobalGeneratorType(!1))) { let [u, p, h] = Ko(n); return Lm(n, a.iterableCacheKey, Eg(a.resolveIterationType(u, void 0) || u, a.resolveIterationType(p, void 0) || p, h)) } } function Ctt(n) { let a = rAe(!1), c = a && Vc(zn(a), Bs(n)); return c && fh(c) ? Np(c) : `__@${n}` } function Mie(n, a, c, u, p) { var h; let T = ja(n, Ctt(a.iteratorSymbolName)), k = T && !(T.flags & 16777216) ? zn(T) : void 0; if (Zo(k)) return p ? wt : Lm(n, a.iterableCacheKey, wt); let O = k ? xa(k, 0) : void 0; if (!vt(O)) return p ? ht : Lm(n, a.iterableCacheKey, ht); let H = so(on(O, qo)), J = (h = hLe(H, a, c, u, p)) != null ? h : ht; return p ? J : Lm(n, a.iterableCacheKey, J) } function Fie(n, a, c) { let u = c ? _.Type_0_must_have_a_Symbol_asyncIterator_method_that_returns_an_async_iterator : _.Type_0_must_have_a_Symbol_iterator_method_that_returns_an_iterator, p = !!DD(a) || !c && _O(n.parent) && n.parent.expression === n && ZG(!1) !== ro && to(a, ZG(!1)); return Tv(n, p, u, Ee(a)) } function Itt(n, a, c, u) { return hLe(n, a, c, u, !1) } function hLe(n, a, c, u, p) { if (Zo(n)) return wt; let h = gLe(n, a) || Ltt(n, a); return h === ht && c && (h = void 0, p = !0), h ?? (h = vLe(n, a, c, u, p)), h === ht ? void 0 : h } function gLe(n, a) { return fU(n, a.iteratorCacheKey) } function Ltt(n, a) { let c = a.getGlobalIterableIteratorType(!1); if (Bv(n, c)) { let [u] = Ko(n), p = gLe(c, a) || vLe(c, a, void 0, void 0, !1), { returnType: h, nextType: T } = p === ht ? Xe : p; return Lm(n, a.iteratorCacheKey, Eg(u, h, T)) } if (Bv(n, a.getGlobalIteratorType(!1)) || Bv(n, a.getGlobalGeneratorType(!1))) { let [u, p, h] = Ko(n); return Lm(n, a.iteratorCacheKey, Eg(u, p, h)) } } function yLe(n, a) { let c = Vc(n, "done") || Ke; return to(a === 0 ? Ke : pe, c) } function ktt(n) { return yLe(n, 0) } function Dtt(n) { return yLe(n, 1) } function wtt(n) { if (Zo(n)) return wt; let a = fU(n, "iterationTypesOfIteratorResult"); if (a) return a; if (Bv(n, TKe(!1))) { let T = Ko(n)[0]; return Lm(n, "iterationTypesOfIteratorResult", Eg(T, void 0, void 0)) } if (Bv(n, SKe(!1))) { let T = Ko(n)[0]; return Lm(n, "iterationTypesOfIteratorResult", Eg(void 0, T, void 0)) } let c = jc(n, ktt), u = c !== lt ? Vc(c, "value") : void 0, p = jc(n, Dtt), h = p !== lt ? Vc(p, "value") : void 0; return !u && !h ? Lm(n, "iterationTypesOfIteratorResult", ht) : Lm(n, "iterationTypesOfIteratorResult", Eg(u, h || yt, void 0)) } function Gie(n, a, c, u, p) { var h, T, k, O, H, J; let de = ja(n, c); if (!de && c !== "next") return; let Ae = de && !(c === "next" && de.flags & 16777216) ? c === "next" ? zn(de) : wf(zn(de), 2097152) : void 0; if (Zo(Ae)) return c === "next" ? wt : K; let xe = Ae ? xa(Ae, 0) : Je; if (xe.length === 0) { if (u) { let Jt = c === "next" ? a.mustHaveANextMethodDiagnostic : a.mustBeAMethodDiagnostic; p ? ((h = p.errors) != null || (p.errors = []), p.errors.push(hr(u, Jt, c))) : Fe(u, Jt, c) } return c === "next" ? ht : void 0 } if (Ae?.symbol && xe.length === 1) { let Jt = a.getGlobalGeneratorType(!1), Cn = a.getGlobalIteratorType(!1), Rn = ((k = (T = Jt.symbol) == null ? void 0 : T.members) == null ? void 0 : k.get(c)) === Ae.symbol, Br = !Rn && ((H = (O = Cn.symbol) == null ? void 0 : O.members) == null ? void 0 : H.get(c)) === Ae.symbol; if (Rn || Br) { let Hr = Rn ? Jt : Cn, { mapper: qi } = Ae; return Eg(zv(Hr.typeParameters[0], qi), zv(Hr.typeParameters[1], qi), c === "next" ? zv(Hr.typeParameters[2], qi) : void 0) } } let tt, It; for (let Jt of xe) c !== "throw" && vt(Jt.parameters) && (tt = Sn(tt, P_(Jt, 0))), It = Sn(It, qo(Jt)); let Tn, un; if (c !== "throw") { let Jt = tt ? Gr(tt) : ue; if (c === "next") un = Jt; else if (c === "return") { let Cn = a.resolveIterationType(Jt, u) || Se; Tn = Sn(Tn, Cn) } } let Nn, en = It ? so(It) : lt, cn = a.resolveIterationType(en, u) || Se, rr = wtt(cn); return rr === ht ? (u && (p ? ((J = p.errors) != null || (p.errors = []), p.errors.push(hr(u, a.mustHaveAValueDiagnostic, c))) : Fe(u, a.mustHaveAValueDiagnostic, c)), Nn = Se, Tn = Sn(Tn, Se)) : (Nn = rr.yieldType, Tn = Sn(Tn, rr.returnType)), Eg(Nn, Gr(Tn), un) } function vLe(n, a, c, u, p) { let h = fLe([Gie(n, a, "next", c, u), Gie(n, a, "return", c, u), Gie(n, a, "throw", c, u)]); return p ? h : Lm(n, a.iteratorCacheKey, h) } function c0(n, a, c) { if (Zo(a)) return; let u = bLe(a, c); return u && u[R_e(n)] } function bLe(n, a) { if (Zo(n)) return wt; let c = a ? 2 : 1, u = a ? ft : Yt; return _U(n, c, void 0) || Itt(n, u, void 0, void 0) } function Rtt(n) { vh(n) || Hrt(n) } function pU(n, a) { let c = !!(a & 1), u = !!(a & 2); if (c) { let p = c0(1, n, u); return p ? u ? bg(UC(p)) : p : ve } return u ? bg(n) || ve : n } function ELe(n, a) { let c = pU(a, pl(n)); return !!c && Js(c, 16387) } function Ott(n) { var a; if (vh(n)) return; let c = R6(n); if (c && oc(c)) { dl(n, _.A_return_statement_cannot_be_used_inside_a_class_static_block); return } if (!c) { dl(n, _.A_return_statement_can_only_be_used_within_a_function_body); return } let u = ip(c), p = qo(u), h = pl(c); if (U || n.expression || p.flags & 131072) { let T = n.expression ? Ic(n.expression) : Oe; if (c.kind === 175) n.expression && Fe(n, _.Setters_cannot_return_a_value); else if (c.kind === 173) n.expression && !Ly(T, p, n, n.expression) && Fe(n, _.Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class); else if (Hx(c)) { let k = (a = pU(p, h)) != null ? a : p, O = h & 2 ? RD(T, !1, n, _.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member) : T; k && Ly(O, k, n, n.expression) } } else c.kind !== 173 && Y.noImplicitReturns && !ELe(c, p) && Fe(n, _.Not_all_code_paths_return_a_value) } function Ntt(n) { vh(n) || n.flags & 32768 && dl(n, _.with_statements_are_not_allowed_in_an_async_function_block), Yi(n.expression); let a = Gn(n); if (!l0(a)) { let c = Pg(a, n.pos).start, u = n.statement.pos; u0(a, c, u - c, _.The_with_statement_is_not_supported_All_symbols_in_a_with_block_will_have_type_any) } } function Ptt(n) { vh(n); let a, c = !1, u = Yi(n.expression); mn(n.caseBlock.clauses, p => { p.kind === 293 && !c && (a === void 0 ? a = p : (an(p, _.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement), c = !0)), p.kind === 292 && i(h(p)), mn(p.statements, qa), Y.noFallthroughCasesInSwitch && p.fallthroughFlowNode && IM(p.fallthroughFlowNode) && Fe(p, _.Fallthrough_case_in_switch); function h(T) { return () => { let k = Yi(T.expression); yie(u, k) || e2e(k, u, T.expression, void 0) } } }), n.caseBlock.locals && Dy(n.caseBlock) } function Mtt(n) { vh(n) || jn(n.parent, a => Ia(a) ? "quit" : a.kind === 253 && a.label.escapedText === n.label.escapedText ? (an(n.label, _.Duplicate_label_0, Qc(n.label)), !0) : !1), qa(n.statement) } function Ftt(n) { vh(n) || Re(n.expression) && !n.expression.escapedText && ait(n, _.Line_break_not_permitted_here), n.expression && Yi(n.expression) } function Gtt(n) { vh(n), dU(n.tryBlock); let a = n.catchClause; if (a) { if (a.variableDeclaration) { let c = a.variableDeclaration; ZM(c); let u = Cl(c); if (u) { let p = $r(u); p && !(p.flags & 3) && dl(u, _.Catch_clause_variable_type_annotation_must_be_any_or_unknown_if_specified) } else if (c.initializer) dl(c.initializer, _.Catch_clause_variable_cannot_have_an_initializer); else { let p = a.block.locals; p && TI(a.locals, h => { let T = p.get(h); T?.valueDeclaration && T.flags & 2 && an(T.valueDeclaration, _.Cannot_redeclare_identifier_0_in_catch_clause, h) }) } } dU(a.block) } n.finallyBlock && dU(n.finallyBlock) } function mU(n, a, c) { let u = tu(n); if (u.length === 0) return; for (let h of Ey(n)) c && h.flags & 4194304 || TLe(n, h, TC(h, 8576, !0), Gv(h)); let p = a.valueDeclaration; if (p && Yr(p)) { for (let h of p.members) if (!Ca(h) && !Ux(h)) { let T = fr(h); TLe(n, T, au(h.name.expression), Gv(T)) } } if (u.length > 1) for (let h of u) Btt(n, h) } function TLe(n, a, c, u) { let p = a.valueDeclaration, h = sa(p); if (h && pi(h)) return; let T = Zte(n, c), k = Ur(n) & 2 ? nc(n.symbol, 261) : void 0, O = p && p.kind === 223 || h && h.kind === 164 ? p : void 0, H = ju(a) === n.symbol ? p : void 0; for (let J of T) { let de = J.declaration && ju(fr(J.declaration)) === n.symbol ? J.declaration : void 0, Ae = H || de || (k && !vt(_o(n), xe => !!qb(xe, a.escapedName) && !!fg(xe, J.keyType)) ? k : void 0); if (Ae && !to(u, J.type)) { let xe = hE(Ae, _.Property_0_of_type_1_is_not_assignable_to_2_index_type_3, E(a), Ee(u), Ee(J.keyType), Ee(J.type)); O && Ae !== O && Ao(xe, hr(O, _._0_is_declared_here, E(a))), Lo.add(xe) } } } function Btt(n, a) { let c = a.declaration, u = Zte(n, a.keyType), p = Ur(n) & 2 ? nc(n.symbol, 261) : void 0, h = c && ju(fr(c)) === n.symbol ? c : void 0; for (let T of u) { if (T === a) continue; let k = T.declaration && ju(fr(T.declaration)) === n.symbol ? T.declaration : void 0, O = h || k || (p && !vt(_o(n), H => !!Cm(H, a.keyType) && !!fg(H, T.keyType)) ? p : void 0); O && !to(a.type, T.type) && Fe(O, _._0_index_type_1_is_not_assignable_to_2_index_type_3, Ee(a.keyType), Ee(a.type), Ee(T.keyType), Ee(T.type)) } } function HC(n, a) { switch (n.escapedText) { case "any": case "unknown": case "never": case "number": case "bigint": case "boolean": case "string": case "symbol": case "void": case "object": Fe(n, a, n.escapedText) } } function Utt(n) { R >= 1 && n.escapedText === "Object" && (ie < 5 || Gn(n).impliedNodeFormat === 1) && Fe(n, _.Class_name_cannot_be_Object_when_targeting_ES5_with_module_0, F8[ie]) } function Vtt(n) { let a = Pr(A0(n), xp); if (!Fn(a)) return; let c = Yn(n), u = new Set, p = new Set; if (mn(n.parameters, ({ name: T }, k) => { Re(T) && u.add(T.escapedText), La(T) && p.add(k) }), nne(n)) { let T = a.length - 1, k = a[T]; c && k && Re(k.name) && k.typeExpression && k.typeExpression.type && !u.has(k.name.escapedText) && !p.has(T) && !_f($r(k.typeExpression.type)) && Fe(k.name, _.JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name_It_would_match_arguments_if_it_had_an_array_type, vr(k.name)) } else mn(a, ({ name: T, isNameFirst: k }, O) => { p.has(O) || Re(T) && u.has(T.escapedText) || (Yu(T) ? c && Fe(T, _.Qualified_name_0_is_not_allowed_without_a_leading_param_object_1, qd(T), qd(T.left)) : k || Ip(c, T, _.JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name, vr(T))) }) } function t8(n) { let a = !1; if (n) for (let u = 0; u < n.length; u++) { let p = n[u]; BIe(p), i(c(p, u)) } function c(u, p) { return () => { u.default ? (a = !0, jtt(u.default, n, p)) : a && Fe(u, _.Required_type_parameters_may_not_follow_optional_type_parameters); for (let h = 0; h < p; h++)n[h].symbol === u.symbol && Fe(u.name, _.Duplicate_identifier_0, os(u.name)) } } } function jtt(n, a, c) { u(n); function u(p) { if (p.kind === 180) { let h = dne(p); if (h.flags & 262144) for (let T = c; T < a.length; T++)h.symbol === fr(a[T]) && Fe(p, _.Type_parameter_defaults_can_only_reference_previously_declared_type_parameters) } pa(p, u) } } function SLe(n) { if (n.declarations && n.declarations.length === 1) return; let a = Ai(n); if (!a.typeParametersChecked) { a.typeParametersChecked = !0; let c = Ytt(n); if (!c || c.length <= 1) return; let u = gs(n); if (!xLe(c, u.localTypeParameters, jy)) { let p = E(n); for (let h of c) Fe(h.name, _.All_declarations_of_0_must_have_identical_type_parameters, p) } } } function xLe(n, a, c) { let u = Fn(a), p = Mp(a); for (let h of n) { let T = c(h), k = T.length; if (k < p || k > u) return !1; for (let O = 0; O < k; O++) { let H = T[O], J = a[O]; if (H.name.escapedText !== J.symbol.escapedName) return !1; let de = EA(H), Ae = de && $r(de), xe = eu(J); if (Ae && xe && !ph(Ae, xe)) return !1; let tt = H.default && $r(H.default), It = jE(J); if (tt && It && !ph(tt, It)) return !1 } } return !0 } function ALe(n) { var a; let c = !$ && R < 99 && O0(!1, n), u = R <= 9, p = !fe || R < 9; if (c || u) for (let h of n.members) { if (c && AH(!1, h, n)) return (a = Sl(Uy(n))) != null ? a : n; if (u) { if (oc(h)) return h; if (Ca(h) && (xu(h) || p && sN(h))) return h } } } function Htt(n) { var a; if (n.name) return; let c = rde(n); if (!VH(c)) return; let u = !$ && R < 99, p; u && O0(!1, n) ? p = (a = Sl(Uy(n))) != null ? a : n : p = ALe(n), p && (Hc(p, 8388608), (yl(c) || Na(c) || Wo(c)) && ts(c.name) && Hc(p, 16777216)) } function Wtt(n) { return CLe(n), zC(n), Htt(n), zn(fr(n)) } function ztt(n) { mn(n.members, qa), Dy(n) } function Jtt(n) { let a = wr(n.modifiers, du); $ && a && vt(n.members, c => zc(c) && xu(c)) && an(a, _.Class_decorators_can_t_be_used_with_static_private_identifier_Consider_removing_the_experimental_decorator), !n.name && !Mr(n, 1024) && dl(n, _.A_class_declaration_without_the_default_modifier_must_have_a_name), CLe(n), mn(n.members, qa), Dy(n) } function CLe(n) { Lrt(n), XM(n), jC(n, n.name), t8(jy(n)), kD(n); let a = fr(n), c = gs(a), u = uf(c), p = zn(a); SLe(a), cU(a), oet(n), !!(n.flags & 16777216) || set(n); let T = hp(n); if (T) { mn(T.typeArguments, qa), R < 2 && Hc(T.parent, 1); let H = P0(n); H && H !== T && Yi(H.expression); let J = _o(c); J.length && i(() => { let de = J[0], Ae = Wr(c), xe = Eu(Ae); if (qtt(xe, T), qa(T.expression), vt(T.typeArguments)) { mn(T.typeArguments, qa); for (let It of Or(xe, T.typeArguments, T)) if (!JIe(T, It.typeParameters)) break } let tt = uf(de, c.thisType); if (wu(u, tt, void 0) ? wu(p, KAe(xe), n.name || n, _.Class_static_side_0_incorrectly_extends_base_class_static_side_1) : kLe(n, u, tt, _.Class_0_incorrectly_extends_base_class_1), Ae.flags & 8650752 && (XP(p) ? xa(Ae, 1).some(Tn => Tn.flags & 4) && !Mr(n, 256) && Fe(n.name || n, _.A_mixin_class_that_extends_from_a_type_variable_containing_an_abstract_construct_signature_must_also_be_declared_abstract) : Fe(n.name || n, _.A_mixin_class_must_have_a_constructor_with_a_single_rest_parameter_of_type_any)), !(xe.symbol && xe.symbol.flags & 32) && !(Ae.flags & 8650752)) { let It = xr(xe, T.typeArguments, T); mn(It, Tn => !cp(Tn.declaration) && !ph(qo(Tn), de)) && Fe(T.expression, _.Base_constructors_must_all_have_the_same_return_type) } $tt(c, de) }) } Ktt(n, c, u, p); let k = JA(n); if (k) for (let H of k) (!bc(H.expression) || Jl(H.expression)) && Fe(H.expression, _.A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments), Aie(H), i(O(H)); i(() => { mU(c, a), mU(p, a, !0), Tie(n), ent(n) }); function O(H) { return () => { let J = O_($r(H)); if (!Ro(J)) if (xm(J)) { let de = J.symbol && J.symbol.flags & 32 ? _.Class_0_incorrectly_implements_class_1_Did_you_mean_to_extend_1_and_inherit_its_members_as_a_subclass : _.Class_0_incorrectly_implements_interface_1, Ae = uf(J, c.thisType); wu(u, Ae, void 0) || kLe(n, u, Ae, de) } else Fe(H, _.A_class_can_only_implement_an_object_type_or_intersection_of_object_types_with_statically_known_members) } } } function Ktt(n, a, c, u) { let h = hp(n) && _o(a), T = h?.length ? uf(Vo(h), a.thisType) : void 0, k = Wr(a); for (let O of n.members) aW(O) || (Ec(O) && mn(O.parameters, H => { Ad(H, O) && ILe(n, u, k, T, a, c, H, !0) }), ILe(n, u, k, T, a, c, O, !1)) } function ILe(n, a, c, u, p, h, T, k, O = !0) { let H = T.name && Zf(T.name) || Zf(T); return H ? LLe(n, a, c, u, p, h, iW(T), B0(T), Ca(T), k, fc(H), O ? T : void 0) : 0 } function LLe(n, a, c, u, p, h, T, k, O, H, J, de) { let Ae = Yn(n), xe = !!(n.flags & 16777216); if (u && (T || Y.noImplicitOverride)) { let tt = Bs(J), It = O ? a : h, Tn = O ? c : u, un = ja(It, tt), Nn = ja(Tn, tt), en = Ee(u); if (un && !Nn && T) { if (de) { let cn = UCe(J, Tn); cn ? Fe(de, Ae ? _.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1 : _.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1, en, E(cn)) : Fe(de, Ae ? _.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0 : _.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0, en) } return 2 } else if (un && Nn?.declarations && Y.noImplicitOverride && !xe) { let cn = vt(Nn.declarations, B0); if (T) return 0; if (cn) { if (k && cn) return de && Fe(de, _.This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0, en), 1 } else { if (de) { let rr = H ? Ae ? _.This_parameter_property_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0 : _.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0 : Ae ? _.This_member_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0 : _.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0; Fe(de, rr, en) } return 1 } } } else if (T) { if (de) { let tt = Ee(p); Fe(de, Ae ? _.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_extend_another_class : _.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class, tt) } return 2 } return 0 } function kLe(n, a, c, u) { let p = !1; for (let h of n.members) { if (Ca(h)) continue; let T = h.name && Zf(h.name) || Zf(h); if (T) { let k = ja(a, T.escapedName), O = ja(c, T.escapedName); if (k && O) { let H = () => da(void 0, _.Property_0_in_type_1_is_not_assignable_to_the_same_property_in_base_type_2, E(T), Ee(a), Ee(c)); wu(zn(k), zn(O), h.name || h, void 0, H) || (p = !0) } } } p || wu(a, c, n.name || n, u) } function qtt(n, a) { let c = xa(n, 1); if (c.length) { let u = c[0].declaration; if (u && cd(u, 8)) { let p = Nh(n.symbol); Hie(a, p) || Fe(a, _.Cannot_extend_a_class_0_Class_constructor_is_marked_as_private, rh(n.symbol)) } } } function Xtt(n, a, c) { if (!a.name) return 0; let u = fr(n), p = gs(u), h = uf(p), T = zn(u), O = hp(n) && _o(p), H = O?.length ? uf(Vo(O), p.thisType) : void 0, J = Wr(p), de = a.parent ? iW(a) : Mr(a, 16384); return LLe(n, T, J, H, p, h, de, B0(a), Ca(a), !1, fc(c)) } function oA(n) { return ac(n) & 1 ? n.links.target : n } function Ytt(n) { return Pr(n.declarations, a => a.kind === 260 || a.kind === 261) } function $tt(n, a) { var c, u, p, h; let T = Jo(a); e: for (let k of T) { let O = oA(k); if (O.flags & 4194304) continue; let H = qb(n, O.escapedName); if (!H) continue; let J = oA(H), de = Ef(O); if (L.assert(!!J, "derived should point to something, even if it is the base class' declaration."), J === O) { let Ae = Nh(n.symbol); if (de & 256 && (!Ae || !Mr(Ae, 256))) { for (let xe of _o(n)) { if (xe === a) continue; let tt = qb(xe, O.escapedName), It = tt && oA(tt); if (It && It !== O) continue e } Ae.kind === 228 ? Fe(Ae, _.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1, E(k), Ee(a)) : Fe(Ae, _.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2, Ee(n), E(k), Ee(a)) } } else { let Ae = Ef(J); if (de & 8 || Ae & 8) continue; let xe, tt = O.flags & 98308, It = J.flags & 98308; if (tt && It) { if ((ac(O) & 6 ? (c = O.declarations) != null && c.some(Nn => DLe(Nn, de)) : (u = O.declarations) != null && u.every(Nn => DLe(Nn, de))) || ac(O) & 262144 || J.valueDeclaration && ar(J.valueDeclaration)) continue; let Tn = tt !== 4 && It === 4; if (Tn || tt === 4 && It !== 4) { let Nn = Tn ? _._0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property : _._0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor; Fe(sa(J.valueDeclaration) || J.valueDeclaration, Nn, E(O), Ee(a), Ee(n)) } else if (fe) { let Nn = (p = J.declarations) == null ? void 0 : p.find(en => en.kind === 169 && !en.initializer); if (Nn && !(J.flags & 33554432) && !(de & 256) && !(Ae & 256) && !((h = J.declarations) != null && h.some(en => !!(en.flags & 16777216)))) { let en = wv(Nh(n.symbol)), cn = Nn.name; if (Nn.exclamationToken || !en || !Re(cn) || !U || !RLe(cn, n, en)) { let rr = _.Property_0_will_overwrite_the_base_property_in_1_If_this_is_intentional_add_an_initializer_Otherwise_add_a_declare_modifier_or_remove_the_redundant_declaration; Fe(sa(J.valueDeclaration) || J.valueDeclaration, rr, E(O), Ee(a)) } } } continue } else if (jre(O)) { if (jre(J) || J.flags & 4) continue; L.assert(!!(J.flags & 98304)), xe = _.Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_accessor } else O.flags & 98304 ? xe = _.Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function : xe = _.Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_function; Fe(sa(J.valueDeclaration) || J.valueDeclaration, xe, Ee(a), E(O), Ee(n)) } } } function DLe(n, a) { return a & 256 && (!Na(n) || !n.initializer) || ku(n.parent) } function Qtt(n, a, c) { if (!Fn(a)) return c; let u = new Map; mn(c, p => { u.set(p.escapedName, p) }); for (let p of a) { let h = Jo(uf(p, n.thisType)); for (let T of h) { let k = u.get(T.escapedName); k && T.parent === k.parent && u.delete(T.escapedName) } } return lo(u.values()) } function Ztt(n, a) { let c = _o(n); if (c.length < 2) return !0; let u = new Map; mn(Nte(n).declaredProperties, h => { u.set(h.escapedName, { prop: h, containingType: n }) }); let p = !0; for (let h of c) { let T = Jo(uf(h, n.thisType)); for (let k of T) { let O = u.get(k.escapedName); if (!O) u.set(k.escapedName, { prop: k, containingType: h }); else if (O.containingType !== n && !hXe(O.prop, k)) { p = !1; let J = Ee(O.containingType), de = Ee(h), Ae = da(void 0, _.Named_property_0_of_types_1_and_2_are_not_identical, E(k), J, de); Ae = da(Ae, _.Interface_0_cannot_simultaneously_extend_types_1_and_2, Ee(n), J, de), Lo.add(Lh(Gn(a), a, Ae)) } } } return p } function ent(n) { if (!U || !_e || n.flags & 16777216) return; let a = wv(n); for (let c of n.members) if (!(uu(c) & 2) && !Ca(c) && wLe(c)) { let u = c.name; if (Re(u) || pi(u) || ts(u)) { let p = zn(fr(c)); p.flags & 3 || xC(p) || (!a || !RLe(u, p, a)) && Fe(c.name, _.Property_0_has_no_initializer_and_is_not_definitely_assigned_in_the_constructor, os(u)) } } } function wLe(n) { return n.kind === 169 && !B0(n) && !n.exclamationToken && !n.initializer } function tnt(n, a, c, u, p) { for (let h of c) if (h.pos >= u && h.pos <= p) { let T = D.createPropertyAccessExpression(D.createThis(), n); go(T.expression, T), go(T, h), T.flowNode = h.returnFlowNode; let k = Yv(T, a, gg(a)); if (!xC(k)) return !0 } return !1 } function RLe(n, a, c) { let u = ts(n) ? D.createElementAccessExpression(D.createThis(), n.expression) : D.createPropertyAccessExpression(D.createThis(), n); go(u.expression, u), go(u, c), u.flowNode = c.returnFlowNode; let p = Yv(u, a, gg(a)); return !xC(p) } function nnt(n) { km(n) || Prt(n), t8(n.typeParameters), i(() => { HC(n.name, _.Interface_name_cannot_be_0), kD(n); let a = fr(n); SLe(a); let c = nc(a, 261); if (n === c) { let u = gs(a), p = uf(u); if (Ztt(u, n.name)) { for (let h of _o(u)) wu(p, uf(h, u.thisType), n.name, _.Interface_0_incorrectly_extends_interface_1); mU(u, a) } } jIe(n) }), mn(PI(n), a => { (!bc(a.expression) || Jl(a.expression)) && Fe(a.expression, _.An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments), Aie(a) }), mn(n.members, qa), i(() => { Tie(n), Dy(n) }) } function rnt(n) { km(n), HC(n.name, _.Type_alias_name_cannot_be_0), kD(n), t8(n.typeParameters), n.type.kind === 139 ? (!rN.has(n.name.escapedText) || Fn(n.typeParameters) !== 1) && Fe(n.type, _.The_intrinsic_keyword_can_only_be_used_to_declare_compiler_provided_intrinsic_types) : (qa(n.type), Dy(n)) } function OLe(n) { let a = Rr(n); if (!(a.flags & 1024)) { a.flags |= 1024; let c = 0; for (let u of n.members) { let p = int(u, c); Rr(u).enumMemberValue = p, c = typeof p == "number" ? p + 1 : void 0 } } } function int(n, a) { if (Vw(n.name)) Fe(n.name, _.Computed_property_names_are_not_allowed_in_enums); else { let c = wA(n.name); Wm(c) && !cL(c) && Fe(n.name, _.An_enum_member_cannot_have_a_numeric_name) } if (n.initializer) return ant(n); if (!(n.parent.flags & 16777216 && !R0(n.parent))) { if (a !== void 0) return a; Fe(n.name, _.Enum_member_must_have_initializer) } } function ant(n) { let a = R0(n.parent), c = n.initializer, u = WC(c, n); return u !== void 0 ? a && typeof u == "number" && !isFinite(u) && Fe(c, isNaN(u) ? _.const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN : _.const_enum_member_initializer_was_evaluated_to_a_non_finite_value) : a ? Fe(c, _.const_enum_member_initializers_must_be_constant_expressions) : n.parent.flags & 16777216 ? Fe(c, _.In_ambient_enum_declarations_member_initializer_must_be_constant_expression) : wu(Yi(c), rt, c, _.Type_0_is_not_assignable_to_type_1_as_required_for_computed_enum_member_values), u } function WC(n, a) { switch (n.kind) { case 221: let c = WC(n.operand, a); if (typeof c == "number") switch (n.operator) { case 39: return c; case 40: return -c; case 54: return ~c }break; case 223: let u = WC(n.left, a), p = WC(n.right, a); if (typeof u == "number" && typeof p == "number") switch (n.operatorToken.kind) { case 51: return u | p; case 50: return u & p; case 48: return u >> p; case 49: return u >>> p; case 47: return u << p; case 52: return u ^ p; case 41: return u * p; case 43: return u / p; case 39: return u + p; case 40: return u - p; case 44: return u % p; case 42: return u ** p } else if ((typeof u == "string" || typeof u == "number") && (typeof p == "string" || typeof p == "number") && n.operatorToken.kind === 39) return "" + u + p; break; case 10: case 14: return n.text; case 225: return ont(n, a); case 8: return eae(n), +n.text; case 214: return WC(n.expression, a); case 79: if (cL(n.escapedText)) return +n.escapedText; case 208: if (bc(n)) { let T = uc(n, 111551, !0); if (T) { if (T.flags & 8) return NLe(n, T, a); if (wC(T)) { let k = T.valueDeclaration; if (k && !k.type && k.initializer && k !== a && $h(k, a)) return WC(k.initializer, k) } } } break; case 209: let h = n.expression; if (bc(h) && es(n.argumentExpression)) { let T = uc(h, 111551, !0); if (T && T.flags & 384) { let k = Bs(n.argumentExpression.text), O = T.exports.get(k); if (O) return NLe(n, O, a) } } break } } function NLe(n, a, c) { let u = a.valueDeclaration; if (!u || u === c) { Fe(n, _.Property_0_is_used_before_being_assigned, E(a)); return } return $h(u, c) ? xU(u) : (Fe(n, _.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums), 0) } function ont(n, a) { let c = n.head.text; for (let u of n.templateSpans) { let p = WC(u.expression, a); if (p === void 0) return; c += p, c += u.literal.text } return c } function snt(n) { i(() => cnt(n)) } function cnt(n) { km(n), jC(n, n.name), kD(n), n.members.forEach(lnt), OLe(n); let a = fr(n), c = nc(a, n.kind); if (n === c) { if (a.declarations && a.declarations.length > 1) { let p = R0(n); mn(a.declarations, h => { hb(h) && R0(h) !== p && Fe(sa(h), _.Enum_declarations_must_all_be_const_or_non_const) }) } let u = !1; mn(a.declarations, p => { if (p.kind !== 263) return !1; let h = p; if (!h.members.length) return !1; let T = h.members[0]; T.initializer || (u ? Fe(T.name, _.In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enum_element) : u = !0) }) } } function lnt(n) { pi(n.name) && Fe(n, _.An_enum_member_cannot_be_named_with_a_private_identifier), n.initializer && Yi(n.initializer) } function unt(n) { let a = n.declarations; if (a) { for (let c of a) if ((c.kind === 260 || c.kind === 259 && Pf(c.body)) && !(c.flags & 16777216)) return c } } function dnt(n, a) { let c = tm(n), u = tm(a); return gm(c) ? gm(u) : gm(u) ? !1 : c === u } function fnt(n) { n.body && (qa(n.body), mp(n) || Dy(n)), i(a); function a() { var c, u; let p = mp(n), h = n.flags & 16777216; p && !h && Fe(n.name, _.Augmentations_for_the_global_scope_should_have_declare_modifier_unless_they_appear_in_already_ambient_context); let T = lu(n), k = T ? _.An_ambient_module_declaration_is_only_allowed_at_the_top_level_in_a_file : _.A_namespace_declaration_is_only_allowed_at_the_top_level_of_a_namespace_or_module; if (n8(n, k)) return; km(n) || !h && n.name.kind === 10 && an(n.name, _.Only_ambient_modules_can_use_quoted_names), Re(n.name) && jC(n, n.name), kD(n); let O = fr(n); if (O.flags & 512 && !h && fK(n, U0(Y))) { if (d_(Y) && !Gn(n).externalModuleIndicator && Fe(n.name, _.Namespaces_are_not_allowed_in_global_script_files_when_0_is_enabled_If_this_file_is_not_intended_to_be_a_global_script_set_moduleDetection_to_force_or_add_an_empty_export_statement, Rt), ((c = O.declarations) == null ? void 0 : c.length) > 1) { let H = unt(O); H && (Gn(n) !== Gn(H) ? Fe(n.name, _.A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merged) : n.pos < H.pos && Fe(n.name, _.A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged)); let J = nc(O, 260); J && dnt(n, J) && (Rr(n).flags |= 2048) } if (Y.verbatimModuleSyntax && n.parent.kind === 308 && (ie === 1 || n.parent.impliedNodeFormat === 1)) { let H = (u = n.modifiers) == null ? void 0 : u.find(J => J.kind === 93); H && Fe(H, _.A_top_level_export_modifier_cannot_be_used_on_value_declarations_in_a_CommonJS_module_when_verbatimModuleSyntax_is_enabled) } } if (T) if (D0(n)) { if ((p || fr(n).flags & 33554432) && n.body) for (let J of n.body.statements) Bie(J, p) } else gm(n.parent) ? p ? Fe(n.name, _.Augmentations_for_the_global_scope_can_only_be_directly_nested_in_external_modules_or_ambient_module_declarations) : fl(l_(n.name)) && Fe(n.name, _.Ambient_module_declaration_cannot_specify_relative_module_name) : p ? Fe(n.name, _.Augmentations_for_the_global_scope_can_only_be_directly_nested_in_external_modules_or_ambient_module_declarations) : Fe(n.name, _.Ambient_modules_cannot_be_nested_in_other_modules_or_namespaces) } } function Bie(n, a) { switch (n.kind) { case 240: for (let u of n.declarationList.declarations) Bie(u, a); break; case 274: case 275: dl(n, _.Exports_and_export_assignments_are_not_permitted_in_module_augmentations); break; case 268: case 269: dl(n, _.Imports_are_not_permitted_in_module_augmentations_Consider_moving_them_to_the_enclosing_external_module); break; case 205: case 257: let c = n.name; if (La(c)) { for (let u of c.elements) Bie(u, a); break } case 260: case 263: case 259: case 261: case 264: case 262: if (a) return; break } } function _nt(n) { switch (n.kind) { case 79: return n; case 163: do n = n.left; while (n.kind !== 79); return n; case 208: do { if (Bm(n.expression) && !pi(n.name)) return n.name; n = n.expression } while (n.kind !== 79); return n } } function Uie(n) { let a = UA(n); if (!a || rc(a)) return !1; if (!yo(a)) return Fe(a, _.String_literal_expected), !1; let c = n.parent.kind === 265 && lu(n.parent.parent); if (n.parent.kind !== 308 && !c) return Fe(a, n.kind === 275 ? _.Export_declarations_are_not_permitted_in_a_namespace : _.Import_declarations_in_a_namespace_cannot_reference_a_module), !1; if (c && fl(a.text) && !Td(n)) return Fe(n, _.Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relative_module_name), !1; if (!Nl(n) && n.assertClause) { let u = !1; for (let p of n.assertClause.elements) yo(p.value) || (u = !0, Fe(p.value, _.Import_assertion_values_must_be_string_literal_expressions)); return !u } return !0 } function hU(n) { var a, c, u, p, h; let T = fr(n), k = wc(T); if (k !== Ht) { if (T = No(T.exportSymbol || T), Yn(n) && !(k.flags & 111551) && !I0(n)) { let J = eS(n) ? n.propertyName || n.name : zl(n) ? n.name : n; if (L.assert(n.kind !== 277), n.kind === 278) { let de = Fe(J, _.Types_cannot_appear_in_export_declarations_in_JavaScript_files), Ae = (c = (a = Gn(n).symbol) == null ? void 0 : a.exports) == null ? void 0 : c.get((n.propertyName || n.name).escapedText); if (Ae === k) { let xe = (u = Ae.declarations) == null ? void 0 : u.find(IA); xe && Ao(de, hr(xe, _._0_is_automatically_exported_here, Gi(Ae.escapedName))) } } else { L.assert(n.kind !== 257); let de = jn(n, Kp(gl, Nl)), Ae = (h = de && ((p = iR(de)) == null ? void 0 : p.text)) != null ? h : "...", xe = Gi(Re(J) ? J.escapedText : T.escapedName); Fe(J, _._0_is_a_type_and_cannot_be_imported_in_JavaScript_files_Use_1_in_a_JSDoc_type_annotation, xe, `import("${Ae}").${xe}`) } return } let O = Fl(k), H = (T.flags & 1160127 ? 111551 : 0) | (T.flags & 788968 ? 788968 : 0) | (T.flags & 1920 ? 1920 : 0); if (O & H) { let J = n.kind === 278 ? _.Export_declaration_conflicts_with_exported_declaration_of_0 : _.Import_declaration_conflicts_with_local_declaration_of_0; Fe(n, J, E(T)) } if (d_(Y) && !I0(n) && !(n.flags & 16777216)) { let J = nd(T), de = !(O & 111551); if (de || J) switch (n.kind) { case 270: case 273: case 268: { if (Y.preserveValueImports || Y.verbatimModuleSyntax) { L.assertIsDefined(n.name, "An ImportClause with a symbol should have a name"); let Ae = Y.verbatimModuleSyntax && GA(n) ? _.An_import_alias_cannot_resolve_to_a_type_or_type_only_declaration_when_verbatimModuleSyntax_is_enabled : de ? Y.verbatimModuleSyntax ? _._0_is_a_type_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled : _._0_is_a_type_and_must_be_imported_using_a_type_only_import_when_preserveValueImports_and_isolatedModules_are_both_enabled : Y.verbatimModuleSyntax ? _._0_resolves_to_a_type_only_declaration_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled : _._0_resolves_to_a_type_only_declaration_and_must_be_imported_using_a_type_only_import_when_preserveValueImports_and_isolatedModules_are_both_enabled, xe = vr(n.kind === 273 && n.propertyName || n.name); v1(Fe(n, Ae, xe), de ? void 0 : J, xe) } de && n.kind === 268 && cd(n, 1) && Fe(n, _.Cannot_use_export_import_on_a_type_or_type_only_namespace_when_0_is_enabled, Rt); break } case 278: if (Y.verbatimModuleSyntax || Gn(J) !== Gn(n)) { let Ae = vr(n.propertyName || n.name), xe = de ? Fe(n, _.Re_exporting_a_type_when_0_is_enabled_requires_using_export_type, Rt) : Fe(n, _._0_resolves_to_a_type_only_declaration_and_must_be_re_exported_using_a_type_only_re_export_when_1_is_enabled, Ae, Rt); v1(xe, de ? void 0 : J, Ae); break } }Y.verbatimModuleSyntax && n.kind !== 268 && !Yn(n) && (ie === 1 || Gn(n).impliedNodeFormat === 1) && Fe(n, _.ESM_syntax_is_not_allowed_in_a_CommonJS_module_when_verbatimModuleSyntax_is_enabled) } if ($u(n)) { let J = MLe(T, n); PLe(J) && J.declarations && Xh(n, J.declarations, J.escapedName) } } } function PLe(n) { return !!n.declarations && Ji(n.declarations, a => !!(G_(a) & 268435456)) } function MLe(n, a) { if (!(n.flags & 2097152)) return n; let c = wc(n); if (c === Ht) return c; for (; n.flags & 2097152;) { let u = Mre(n); if (u) { if (u === c) break; if (u.declarations && Fn(u.declarations)) if (PLe(u)) { Xh(a, u.declarations, u.escapedName); break } else { if (n === c) break; n = u } } else break } return c } function gU(n) { jC(n, n.name), hU(n), n.kind === 273 && vr(n.propertyName || n.name) === "default" && f_(Y) && ie !== 4 && (ie < 5 || Gn(n).impliedNodeFormat === 1) && Hc(n, 131072) } function FLe(n) { var a; if (n.assertClause) { let c = oq(n), u = qS(n.assertClause, c ? an : void 0); if (c && u) return TR() || an(n.assertClause, _.resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next), $s(Y) !== 3 && $s(Y) !== 99 ? an(n.assertClause, _.resolution_mode_assertions_are_only_supported_when_moduleResolution_is_node16_or_nodenext) : void 0; if ((ie === 199 && n.moduleSpecifier && ty(n.moduleSpecifier)) !== 99 && ie !== 99) return an(n.assertClause, ie === 199 ? _.Import_assertions_are_not_allowed_on_statements_that_transpile_to_commonjs_require_calls : _.Import_assertions_are_only_supported_when_the_module_option_is_set_to_esnext_or_nodenext); if (gl(n) ? (a = n.importClause) != null && a.isTypeOnly : n.isTypeOnly) return an(n.assertClause, _.Import_assertions_cannot_be_used_with_type_only_imports_or_exports); if (u) return an(n.assertClause, _.resolution_mode_can_only_be_set_for_type_only_imports) } } function pnt(n) { if (!n8(n, Yn(n) ? _.An_import_declaration_can_only_be_used_at_the_top_level_of_a_module : _.An_import_declaration_can_only_be_used_at_the_top_level_of_a_namespace_or_module)) { if (!km(n) && n4(n) && dl(n, _.An_import_declaration_cannot_have_modifiers), Uie(n)) { let a = n.importClause; a && !sit(a) && (a.name && gU(a), a.namedBindings && (a.namedBindings.kind === 271 ? (gU(a.namedBindings), ie !== 4 && (ie < 5 || Gn(n).impliedNodeFormat === 1) && f_(Y) && Hc(n, 65536)) : Gl(n, n.moduleSpecifier) && mn(a.namedBindings.elements, gU))) } FLe(n) } } function mnt(n) { if (!n8(n, Yn(n) ? _.An_import_declaration_can_only_be_used_at_the_top_level_of_a_module : _.An_import_declaration_can_only_be_used_at_the_top_level_of_a_namespace_or_module) && (km(n), GA(n) || Uie(n))) if (gU(n), Mr(n, 1) && TE(n), n.moduleReference.kind !== 280) { let a = wc(fr(n)); if (a !== Ht) { let c = Fl(a); if (c & 111551) { let u = Yd(n.moduleReference); uc(u, 112575).flags & 1920 || Fe(u, _.Module_0_is_hidden_by_a_local_declaration_with_the_same_name, os(u)) } c & 788968 && HC(n.name, _.Import_name_cannot_be_0) } n.isTypeOnly && an(n, _.An_import_alias_cannot_use_import_type) } else ie >= 5 && Gn(n).impliedNodeFormat === void 0 && !n.isTypeOnly && !(n.flags & 16777216) && an(n, _.Import_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_import_d_from_mod_or_another_module_format_instead) } function hnt(n) { if (!n8(n, Yn(n) ? _.An_export_declaration_can_only_be_used_at_the_top_level_of_a_module : _.An_export_declaration_can_only_be_used_at_the_top_level_of_a_namespace_or_module)) { if (!km(n) && Wce(n) && dl(n, _.An_export_declaration_cannot_have_modifiers), n.moduleSpecifier && n.exportClause && h_(n.exportClause) && Fn(n.exportClause.elements) && R === 0 && Hc(n, 4194304), gnt(n), !n.moduleSpecifier || Uie(n)) if (n.exportClause && !qm(n.exportClause)) { mn(n.exportClause.elements, Snt); let a = n.parent.kind === 265 && lu(n.parent.parent), c = !a && n.parent.kind === 265 && !n.moduleSpecifier && n.flags & 16777216; n.parent.kind !== 308 && !a && !c && Fe(n, _.Export_declarations_are_not_permitted_in_a_namespace) } else { let a = Gl(n, n.moduleSpecifier); a && AE(a) ? Fe(n.moduleSpecifier, _.Module_0_uses_export_and_cannot_be_used_with_export_Asterisk, E(a)) : n.exportClause && hU(n.exportClause), ie !== 4 && (ie < 5 || Gn(n).impliedNodeFormat === 1) && (n.exportClause ? f_(Y) && Hc(n, 65536) : Hc(n, 32768)) } FLe(n) } } function gnt(n) { var a; return n.isTypeOnly && ((a = n.exportClause) == null ? void 0 : a.kind) === 276 ? pke(n.exportClause) : !1 } function n8(n, a) { let c = n.parent.kind === 308 || n.parent.kind === 265 || n.parent.kind === 264; return c || dl(n, a), !c } function ynt(n) { return z6(n, a => !!fr(a).isReferenced) } function vnt(n) { return z6(n, a => !!Ai(fr(a)).constEnumReferenced) } function bnt(n) { return gl(n) && n.importClause && !n.importClause.isTypeOnly && ynt(n.importClause) && !SU(n.importClause, !0) && !vnt(n.importClause) } function Ent(n) { return Nl(n) && um(n.moduleReference) && !n.isTypeOnly && fr(n).isReferenced && !SU(n, !1) && !Ai(fr(n)).constEnumReferenced } function Tnt(n) { for (let a of n.statements) (bnt(a) || Ent(a)) && Fe(a, _.This_import_is_never_used_as_a_value_and_must_use_import_type_because_importsNotUsedAsValues_is_set_to_error) } function Snt(n) { if (hU(n), __(Y) && ME(n.propertyName || n.name, !0), n.parent.parent.moduleSpecifier) f_(Y) && ie !== 4 && (ie < 5 || Gn(n).impliedNodeFormat === 1) && vr(n.propertyName || n.name) === "default" && Hc(n, 131072); else { let a = n.propertyName || n.name, c = zs(a, a.escapedText, 2998271, void 0, void 0, !0); if (c && (c === Le || c === Ye || c.declarations && gm(FE(c.declarations[0])))) Fe(a, _.Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module, vr(a)); else { !n.isTypeOnly && !n.parent.parent.isTypeOnly && TE(n); let u = c && (c.flags & 2097152 ? wc(c) : c); (!u || Fl(u) & 111551) && Ic(n.propertyName || n.name) } } } function xnt(n) { let a = n.isExportEquals ? _.An_export_assignment_must_be_at_the_top_level_of_a_file_or_module_declaration : _.A_default_export_must_be_at_the_top_level_of_a_file_or_module_declaration; if (n8(n, a)) return; let c = n.parent.kind === 308 ? n.parent : n.parent.parent; if (c.kind === 264 && !lu(c)) { n.isExportEquals ? Fe(n, _.An_export_assignment_cannot_be_used_in_a_namespace) : Fe(n, _.A_default_export_can_only_be_used_in_an_ECMAScript_style_module); return } !km(n) && n4(n) && dl(n, _.An_export_assignment_cannot_have_modifiers); let u = Cl(n); u && wu(Ic(n.expression), $r(u), n.expression); let p = !n.isExportEquals && !(n.flags & 16777216) && Y.verbatimModuleSyntax && (ie === 1 || Gn(n).impliedNodeFormat === 1); if (n.expression.kind === 79) { let h = n.expression, T = tp(uc(h, 67108863, !0, !0, n)); T ? (FB(T, h), Fl(T) & 111551 ? (Ic(h), !p && Y.verbatimModuleSyntax && nd(T, 111551) && Fe(h, n.isExportEquals ? _.An_export_declaration_must_reference_a_real_value_when_verbatimModuleSyntax_is_enabled_but_0_resolves_to_a_type_only_declaration : _.An_export_default_must_reference_a_real_value_when_verbatimModuleSyntax_is_enabled_but_0_resolves_to_a_type_only_declaration, vr(h))) : !p && Y.verbatimModuleSyntax && Fe(h, n.isExportEquals ? _.An_export_declaration_must_reference_a_value_when_verbatimModuleSyntax_is_enabled_but_0_only_refers_to_a_type : _.An_export_default_must_reference_a_value_when_verbatimModuleSyntax_is_enabled_but_0_only_refers_to_a_type, vr(h))) : Ic(h), __(Y) && ME(h, !0) } else Ic(n.expression); p && Fe(n, _.ESM_syntax_is_not_allowed_in_a_CommonJS_module_when_verbatimModuleSyntax_is_enabled), GLe(c), n.flags & 16777216 && !bc(n.expression) && an(n.expression, _.The_expression_of_an_export_assignment_must_be_an_identifier_or_qualified_name_in_an_ambient_context), n.isExportEquals && (ie >= 5 && (n.flags & 16777216 && Gn(n).impliedNodeFormat === 99 || !(n.flags & 16777216) && Gn(n).impliedNodeFormat !== 1) ? an(n, _.Export_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_export_default_or_another_module_format_instead) : ie === 4 && !(n.flags & 16777216) && an(n, _.Export_assignment_is_not_supported_when_module_flag_is_system)) } function Ant(n) { return Ld(n.exports, (a, c) => c !== "export=") } function GLe(n) { let a = fr(n), c = Ai(a); if (!c.exportsChecked) { let u = a.exports.get("export="); if (u && Ant(a)) { let h = Uu(u) || u.valueDeclaration; h && !Td(h) && !Yn(h) && Fe(h, _.An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements) } let p = sh(a); p && p.forEach(({ declarations: h, flags: T }, k) => { if (k === "__export" || T & 1920) return; let O = Oy(h, g8(O_e, y8(ku))); if (!(T & 524288 && O <= 2) && O > 1 && !yU(h)) for (let H of h) D_e(H) && Lo.add(hr(H, _.Cannot_redeclare_exported_variable_0, Gi(k))) }), c.exportsChecked = !0 } } function yU(n) { return n && n.length > 1 && n.every(a => Yn(a) && Us(a) && (TT(a.expression) || Bm(a.expression))) } function qa(n) { if (n) { let a = P; P = n, A = 0, Cnt(n), P = a } } function Cnt(n) { lR(n) && mn(n.jsDoc, ({ comment: c, tags: u }) => { BLe(c), mn(u, p => { BLe(p.comment), Yn(n) && qa(p) }) }); let a = n.kind; if (o) switch (a) { case 264: case 260: case 261: case 259: o.throwIfCancellationRequested() }switch (a >= 240 && a <= 256 && cR(n) && n.flowNode && !IM(n.flowNode) && Ip(Y.allowUnreachableCode === !1, n, _.Unreachable_code_detected), a) { case 165: return BIe(n); case 166: return UIe(n); case 169: return HIe(n); case 168: return cet(n); case 182: case 181: case 176: case 177: case 178: return LD(n); case 171: case 170: return uet(n); case 172: return det(n); case 173: return fet(n); case 174: case 175: return zIe(n); case 180: return Aie(n); case 179: return iet(n); case 183: return yet(n); case 184: return vet(n); case 185: return bet(n); case 186: return Eet(n); case 189: case 190: return Tet(n); case 193: case 187: case 188: return qa(n.type); case 194: return Iet(n); case 195: return Let(n); case 191: return ket(n); case 192: return Det(n); case 200: return wet(n); case 202: return Ret(n); case 199: return Oet(n); case 331: return $et(n); case 332: return Yet(n); case 349: case 341: case 343: return jet(n); case 348: return Het(n); case 347: return Wet(n); case 327: case 328: case 329: return Jet(n); case 344: return Ket(n); case 351: return qet(n); case 320: Xet(n); case 318: case 317: case 315: case 316: case 325: ULe(n), pa(n, qa); return; case 321: Int(n); return; case 312: return qa(n.type); case 336: case 338: case 337: return Qet(n); case 353: return zet(n); case 196: return xet(n); case 197: return Aet(n); case 259: return Vet(n); case 238: case 265: return dU(n); case 240: return mtt(n); case 241: return htt(n); case 242: return gtt(n); case 243: return btt(n); case 244: return Ett(n); case 245: return Ttt(n); case 246: return xtt(n); case 247: return Stt(n); case 248: case 249: return Rtt(n); case 250: return Ott(n); case 251: return Ntt(n); case 252: return Ptt(n); case 253: return Mtt(n); case 254: return Ftt(n); case 255: return Gtt(n); case 257: return Die(n); case 205: return ptt(n); case 260: return Jtt(n); case 261: return nnt(n); case 262: return rnt(n); case 263: return snt(n); case 264: return fnt(n); case 269: return pnt(n); case 268: return mnt(n); case 275: return hnt(n); case 274: return xnt(n); case 239: case 256: vh(n); return; case 279: return pet(n) } } function BLe(n) { ba(n) && mn(n, a => { iS(a) && qa(a) }) } function ULe(n) { if (!Yn(n)) if (m3(n) || T2(n)) { let a = Xa(m3(n) ? 53 : 57), c = n.postfix ? _._0_at_the_end_of_a_type_is_not_valid_TypeScript_syntax_Did_you_mean_to_write_1 : _._0_at_the_start_of_a_type_is_not_valid_TypeScript_syntax_Did_you_mean_to_write_1, u = n.type, p = $r(u); an(n, c, a, Ee(T2(n) && !(p === lt || p === yt) ? Gr(Sn([p, Oe], n.postfix ? void 0 : ln)) : p)) } else an(n, _.JSDoc_types_can_only_be_used_inside_documentation_comments) } function Int(n) { ULe(n), qa(n.type); let { parent: a } = n; if (ha(a) && S2(a.parent)) { To(a.parent.parameters) !== a && Fe(n, _.A_rest_parameter_must_be_last_in_a_parameter_list); return } UT(a) || Fe(n, _.JSDoc_may_only_appear_in_the_last_parameter_of_a_signature); let c = n.parent.parent; if (!xp(c)) { Fe(n, _.JSDoc_may_only_appear_in_the_last_parameter_of_a_signature); return } let u = uR(c); if (!u) return; let p = sb(c); (!p || To(p.parameters).symbol !== u) && Fe(n, _.A_rest_parameter_must_be_last_in_a_parameter_list) } function Lnt(n) { let a = $r(n.type), { parent: c } = n, u = n.parent.parent; if (UT(n.parent) && xp(u)) { let p = sb(u), h = Vz(u.parent.parent); if (p || h) { let T = Os(h ? u.parent.parent.typeExpression.parameters : p.parameters), k = uR(u); if (!T || k && T.symbol === k && Fm(T)) return nu(a) } } return ha(c) && S2(c.parent) ? nu(a) : ao(a) } function zC(n) { let a = Gn(n), c = Rr(a); c.flags & 1 ? L.assert(!c.deferredNodes, "A type-checked file should have no deferred nodes.") : (c.deferredNodes || (c.deferredNodes = new Set), c.deferredNodes.add(n)) } function knt(n) { let a = Rr(n); a.deferredNodes && a.deferredNodes.forEach(Dnt), a.deferredNodes = void 0 } function Dnt(n) { var a, c; (a = ai) == null || a.push(ai.Phase.Check, "checkDeferredNode", { kind: n.kind, pos: n.pos, end: n.end, path: n.tracingPath }); let u = P; switch (P = n, A = 0, n.kind) { case 210: case 211: case 212: case 167: case 283: nA(n); break; case 215: case 216: case 171: case 170: EZe(n); break; case 174: case 175: zIe(n); break; case 228: ztt(n); break; case 165: ret(n); break; case 282: N$e(n); break; case 281: M$e(n); break }P = u, (c = ai) == null || c.pop() } function wnt(n) { var a, c; (a = ai) == null || a.push(ai.Phase.Check, "checkSourceFile", { path: n.path }, !0), Fs("beforeCheck"), Rnt(n), Fs("afterCheck"), hf("Check", "beforeCheck", "afterCheck"), (c = ai) == null || c.pop() } function VLe(n, a) { if (a) return !1; switch (n) { case 0: return !!Y.noUnusedLocals; case 1: return !!Y.noUnusedParameters; default: return L.assertNever(n) } } function jLe(n) { return rn.get(n.path) || Je } function Rnt(n) { let a = Rr(n); if (!(a.flags & 1)) { if (rL(n, Y, e)) return; nit(n), Om(pE), Om(vv), Om(Lb), Om(bv), Om(m1), mn(n.statements, qa), qa(n.endOfFileToken), knt(n), kd(n) && Dy(n), i(() => { !n.isDeclarationFile && (Y.noUnusedLocals || Y.noUnusedParameters) && rLe(jLe(n), (c, u, p) => { !Gw(c) && VLe(u, !!(c.flags & 16777216)) && Lo.add(p) }), n.isDeclarationFile || ntt() }), Y.importsNotUsedAsValues === 2 && !n.isDeclarationFile && Lc(n) && Tnt(n), kd(n) && GLe(n), pE.length && (mn(pE, att), Om(pE)), vv.length && (mn(vv, ott), Om(vv)), Lb.length && (mn(Lb, utt), Om(Lb)), bv.length && (mn(bv, ftt), Om(bv)), a.flags |= 1 } } function HLe(n, a) { try { return o = a, Ont(n) } finally { o = void 0 } } function Vie() { for (let n of r) n(); r = [] } function jie(n) { Vie(); let a = i; i = c => c(), wnt(n), i = a } function Ont(n) { if (n) { Vie(); let a = Lo.getGlobalDiagnostics(), c = a.length; jie(n); let u = Lo.getDiagnostics(n.fileName), p = Lo.getGlobalDiagnostics(); if (p !== a) { let h = fae(a, p, ZI); return Qi(h, u) } else if (c === 0 && p.length > 0) return Qi(p, u); return u } return mn(e.getSourceFiles(), jie), Lo.getDiagnostics() } function Nnt() { return Vie(), Lo.getGlobalDiagnostics() } function Pnt(n, a) { if (n.flags & 33554432) return []; let c = Ua(), u = !1; return p(), c.delete("this"), ene(c); function p() { for (; n;) { switch (Qp(n) && n.locals && !gm(n) && T(n.locals, a), n.kind) { case 308: if (!Lc(n)) break; case 264: k(fr(n).exports, a & 2623475); break; case 263: T(fr(n).exports, a & 8); break; case 228: n.name && h(n.symbol, a); case 260: case 261: u || T(vy(fr(n)), a & 788968); break; case 215: n.name && h(n.symbol, a); break }tce(n) && h(_t, a), u = Ca(n), n = n.parent } T(Ne, a) } function h(O, H) { if (XI(O) & H) { let J = O.escapedName; c.has(J) || c.set(J, O) } } function T(O, H) { H && O.forEach(J => { h(J, H) }) } function k(O, H) { H && O.forEach(J => { !nc(J, 278) && !nc(J, 277) && h(J, H) }) } } function Mnt(n) { return n.kind === 79 && o2(n.parent) && sa(n.parent) === n } function WLe(n) { for (; n.parent.kind === 163;)n = n.parent; return n.parent.kind === 180 } function Fnt(n) { for (; n.parent.kind === 208;)n = n.parent; return n.parent.kind === 230 } function zLe(n, a) { let c, u = Zc(n); for (; u && !(c = a(u));)u = Zc(u); return c } function Gnt(n) { return !!jn(n, a => Ec(a) && Pf(a.body) || Na(a) ? !0 : Yr(a) || Ds(a) ? "quit" : !1) } function Hie(n, a) { return !!zLe(n, c => c === a) } function Bnt(n) { for (; n.parent.kind === 163;)n = n.parent; if (n.parent.kind === 268) return n.parent.moduleReference === n ? n.parent : void 0; if (n.parent.kind === 274) return n.parent.expression === n ? n.parent : void 0 } function vU(n) { return Bnt(n) !== void 0 } function Unt(n) { switch (ic(n.parent.parent)) { case 1: case 3: return vd(n.parent); case 4: case 2: case 5: return fr(n.parent.parent) } } function Vnt(n) { let a = n.parent; for (; Yu(a);)n = a, a = a.parent; if (a && a.kind === 202 && a.qualifier === n) return a } function JLe(n) { if (Rh(n)) return vd(n.parent); if (Yn(n) && n.parent.kind === 208 && n.parent === n.parent.parent.left && !pi(n) && !gb(n)) { let a = Unt(n); if (a) return a } if (n.parent.kind === 274 && bc(n)) { let a = uc(n, 2998271, !0); if (a && a !== Ht) return a } else if (Cd(n) && vU(n)) { let a = cb(n, 268); return L.assert(a !== void 0), ep(n, !0) } if (Cd(n)) { let a = Vnt(n); if (a) { $r(a); let c = Rr(n).resolvedSymbol; return c === Ht ? void 0 : c } } for (; Qce(n);)n = n.parent; if (Fnt(n)) { let a = 0; n.parent.kind === 230 ? (a = Gm(n) ? 788968 : 111551, IR(n.parent) && (a |= 111551)) : a = 1920, a |= 2097152; let c = bc(n) ? uc(n, a) : void 0; if (c) return c } if (n.parent.kind === 344) return uR(n.parent); if (n.parent.kind === 165 && n.parent.parent.kind === 348) { L.assert(!Yn(n)); let a = yce(n.parent); return a && a.symbol } if (Dh(n)) { if (rc(n)) return; let a = jn(n, Kp(iS, IL, gb)), c = a ? 901119 : 111551; if (n.kind === 79) { if (DI(n) && OC(n)) { let p = Gre(n.parent); return p === Ht ? void 0 : p } let u = uc(n, c, !1, !0, sb(n)); if (!u && a) { let p = jn(n, Kp(Yr, ku)); if (p) return r8(n, !1, fr(p)) } if (u && a) { let p = dS(n); if (p && q0(p) && p === u.valueDeclaration) return uc(n, c, !0, !0, Gn(p)) || u } return u } else { if (pi(n)) return KB(n); if (n.kind === 208 || n.kind === 163) { let u = Rr(n); if (u.resolvedSymbol) return u.resolvedSymbol; if (n.kind === 208) { if (RCe(n, 0), !u.resolvedSymbol) { let p = Ic(n.expression), h = Zte(p, pg(n.name)); if (h.length && p.members) { let k = R_(p).members.get("__index"); if (h === tu(p)) u.resolvedSymbol = k; else if (k) { let O = Ai(k), H = Zi(h, de => de.declaration), J = on(H, zo).join(","); if (O.filteredIndexSymbolCache || (O.filteredIndexSymbolCache = new Map), O.filteredIndexSymbolCache.has(J)) u.resolvedSymbol = O.filteredIndexSymbolCache.get(J); else { let de = wo(131072, "__index"); de.declarations = Zi(h, Ae => Ae.declaration), de.parent = p.aliasSymbol ? p.aliasSymbol : p.symbol ? p.symbol : Zf(de.declarations[0].parent), O.filteredIndexSymbolCache.set(J, de), u.resolvedSymbol = O.filteredIndexSymbolCache.get(J) } } } } } else OCe(n, 0); return !u.resolvedSymbol && a && Yu(n) ? r8(n) : u.resolvedSymbol } else if (gb(n)) return r8(n) } } else if (WLe(n)) { let a = n.parent.kind === 180 ? 788968 : 1920, c = uc(n, a, !1, !0); return c && c !== Ht ? c : XG(n) } if (n.parent.kind === 179) return uc(n, 1) } function r8(n, a, c) { if (Cd(n)) { let T = uc(n, 901119, a, !0, sb(n)); if (!T && Re(n) && c && (T = No(yd(Gd(c), n.escapedText, 901119))), T) return T } let u = Re(n) ? c : r8(n.left, a, c), p = Re(n) ? n.escapedText : n.right.escapedText; if (u) { let h = u.flags & 111551 && ja(zn(u), "prototype"), T = h ? zn(h) : gs(u); return ja(T, p) } } function Zf(n, a) { if (Li(n)) return Lc(n) ? No(n.symbol) : void 0; let { parent: c } = n, u = c.parent; if (!(n.flags & 33554432)) { if (w_e(n)) { let p = fr(c); return eS(n.parent) && n.parent.propertyName === n ? Mre(p) : p } else if (_R(n)) return fr(c.parent); if (n.kind === 79) { if (vU(n)) return JLe(n); if (c.kind === 205 && u.kind === 203 && n === c.propertyName) { let p = G1(u), h = ja(p, n.escapedText); if (h) return h } else if (TL(c) && c.name === n) return c.keywordToken === 103 && vr(n) === "target" ? lie(c).symbol : c.keywordToken === 100 && vr(n) === "meta" ? tAe().members.get("meta") : void 0 } switch (n.kind) { case 79: case 80: case 208: case 163: if (!mS(n)) return JLe(n); case 108: let p = Ku(n, !1, !1); if (Ia(p)) { let k = ip(p); if (k.thisParameter) return k.thisParameter } if (F6(n)) return Yi(n).symbol; case 194: return oB(n).symbol; case 106: return Yi(n).symbol; case 135: let h = n.parent; return h && h.kind === 173 ? h.parent.symbol : void 0; case 10: case 14: if (ab(n.parent.parent) && wI(n.parent.parent) === n || (n.parent.kind === 269 || n.parent.kind === 275) && n.parent.moduleSpecifier === n || Yn(n) && $s(Y) !== 100 && qu(n.parent, !1) || Dd(n.parent) || mb(n.parent) && ib(n.parent.parent) && n.parent.parent.argument === n.parent) return Gl(n, n, a); if (Pa(c) && sS(c) && c.arguments[1] === n) return fr(c); case 8: let T = Vs(c) ? c.argumentExpression === n ? au(c.expression) : void 0 : mb(c) && OS(u) ? $r(u.objectType) : void 0; return T && ja(T, Bs(n.text)); case 88: case 98: case 38: case 84: return vd(n.parent); case 202: return ib(n) ? Zf(n.argument.literal, a) : void 0; case 93: return pc(n.parent) ? L.checkDefined(n.parent.symbol) : void 0; case 100: case 103: return TL(n.parent) ? mIe(n.parent).symbol : void 0; case 233: return Yi(n).symbol; default: return } } } function jnt(n) { if (Re(n) && br(n.parent) && n.parent.name === n) { let a = pg(n), c = au(n.parent.expression), u = c.flags & 1048576 ? c.types : [c]; return Uo(u, p => Pr(tu(p), h => Vx(a, h.keyType))) } } function Hnt(n) { if (n && n.kind === 300) return uc(n.name, 2208703) } function Wnt(n) { return Mu(n) ? n.parent.parent.moduleSpecifier ? af(n.parent.parent, n) : uc(n.propertyName || n.name, 2998271) : uc(n, 2998271) } function G1(n) { if (Li(n) && !Lc(n) || n.flags & 33554432) return ve; let a = uW(n), c = a && vu(fr(a.class)); if (Gm(n)) { let u = $r(n); return c ? uf(u, c.thisType) : u } if (Dh(n)) return KLe(n); if (c && !a.isImplements) { let u = Sl(_o(c)); return u ? uf(u, c.thisType) : ve } if (o2(n)) { let u = fr(n); return gs(u) } if (Mnt(n)) { let u = Zf(n); return u ? gs(u) : ve } if (Kl(n)) { let u = fr(n); return u ? zn(u) : ve } if (w_e(n)) { let u = Zf(n); return u ? zn(u) : ve } if (La(n)) return Oo(n.parent, !0, 0) || ve; if (vU(n)) { let u = Zf(n); if (u) { let p = gs(u); return Ro(p) ? zn(u) : p } } return TL(n.parent) && n.parent.keywordToken === n.kind ? mIe(n.parent) : ve } function bU(n) { if (L.assert(n.kind === 207 || n.kind === 206), n.parent.kind === 247) { let p = e8(n.parent); return nT(n, p || ve) } if (n.parent.kind === 223) { let p = au(n.parent.right); return nT(n, p || ve) } if (n.parent.kind === 299) { let p = Ga(n.parent.parent, rs), h = bU(p) || ve, T = DA(p.properties, n.parent); return kIe(p, h, T) } let a = Ga(n.parent, fu), c = bU(a) || ve, u = wy(65, c, Oe, n.parent) || ve; return DIe(a, c, a.elements.indexOf(n), u) } function znt(n) { let a = bU(Ga(n.parent.parent, vI)); return a && ja(a, n.escapedText) } function KLe(n) { return zI(n) && (n = n.parent), Hu(au(n)) } function qLe(n) { let a = vd(n.parent); return Ca(n) ? zn(a) : gs(a) } function XLe(n) { let a = n.name; switch (a.kind) { case 79: return ff(vr(a)); case 8: case 10: return ff(a.text); case 164: let c = vg(a); return ul(c, 12288) ? c : ae; default: return L.fail("Unsupported property name.") } } function Wie(n) { n = Eu(n); let a = Ua(Jo(n)), c = xa(n, 0).length ? Uc : xa(n, 1).length ? Gu : void 0; return c && mn(Jo(c), u => { a.has(u.escapedName) || a.set(u.escapedName, u) }), uy(a) } function EU(n) { return xa(n, 0).length !== 0 || xa(n, 1).length !== 0 } function YLe(n) { let a = Jnt(n); return a ? Uo(a, YLe) : [n] } function Jnt(n) { if (ac(n) & 6) return Zi(Ai(n).containingType.types, a => ja(a, n.escapedName)); if (n.flags & 33554432) { let { links: { leftSpread: a, rightSpread: c, syntheticOrigin: u } } = n; return a ? [a, c] : u ? [u] : aT(Knt(n)) } } function Knt(n) { let a, c = n; for (; c = Ai(c).target;)a = c; return a } function qnt(n) { if (tc(n)) return !1; let a = ea(n, Re); if (!a) return !1; let c = a.parent; return c ? !((br(c) || yl(c)) && c.name === a) && i8(a) === _t : !1 } function Xnt(n) { let a = Gl(n.parent, n); if (!a || CI(a)) return !0; let c = AE(a); a = Vu(a); let u = Ai(a); return u.exportsSomeValue === void 0 && (u.exportsSomeValue = c ? !!(a.flags & 111551) : Ld(sh(a), p)), u.exportsSomeValue; function p(h) { return h = Ac(h), h && !!(Fl(h) & 111551) } } function Ynt(n) { return Ow(n.parent) && n === n.parent.name } function $nt(n, a) { var c; let u = ea(n, Re); if (u) { let p = i8(u, Ynt(u)); if (p) { if (p.flags & 1048576) { let T = No(p.exportSymbol); if (!a && T.flags & 944 && !(T.flags & 3)) return; p = T } let h = ju(p); if (h) { if (h.flags & 512 && ((c = h.valueDeclaration) == null ? void 0 : c.kind) === 308) { let T = h.valueDeclaration, k = Gn(u); return T !== k ? void 0 : T } return jn(u.parent, T => Ow(T) && fr(T) === h) } } } } function Qnt(n) { let a = Eue(n); if (a) return a; let c = ea(n, Re); if (c) { let u = drt(c); if (ay(u, 111551) && !nd(u, 111551)) return Uu(u) } } function Znt(n) { return n.valueDeclaration && Wo(n.valueDeclaration) && bA(n.valueDeclaration).parent.kind === 295 } function $Le(n) { if (n.flags & 418 && n.valueDeclaration && !Li(n.valueDeclaration)) { let a = Ai(n); if (a.isDeclarationWithCollidingName === void 0) { let c = tm(n.valueDeclaration); if (Ose(c) || Znt(n)) { let u = Rr(n.valueDeclaration); if (zs(c.parent, n.escapedName, 111551, void 0, void 0, !1)) a.isDeclarationWithCollidingName = !0; else if (u.flags & 16384) { let p = u.flags & 32768, h = Wy(c, !1), T = c.kind === 238 && Wy(c.parent, !1); a.isDeclarationWithCollidingName = !Hse(c) && (!p || !h && !T) } else a.isDeclarationWithCollidingName = !1 } } return a.isDeclarationWithCollidingName } return !1 } function ert(n) { if (!tc(n)) { let a = ea(n, Re); if (a) { let c = i8(a); if (c && $Le(c)) return c.valueDeclaration } } } function trt(n) { let a = ea(n, Kl); if (a) { let c = fr(a); if (c) return $Le(c) } return !1 } function QLe(n) { switch (L.assert(!Y.verbatimModuleSyntax), n.kind) { case 268: return TU(fr(n)); case 270: case 271: case 273: case 278: let a = fr(n); return !!a && TU(a) && !nd(a, 111551); case 275: let c = n.exportClause; return !!c && (qm(c) || vt(c.elements, QLe)); case 274: return n.expression && n.expression.kind === 79 ? TU(fr(n)) : !0 }return !1 } function nrt(n) { let a = ea(n, Nl); return a === void 0 || a.parent.kind !== 308 || !GA(a) ? !1 : TU(fr(a)) && a.moduleReference && !rc(a.moduleReference) } function TU(n) { var a; if (!n) return !1; let c = tp(wc(n)); return c === Ht ? !0 : !!(((a = Fl(c)) != null ? a : -1) & 111551) && (U0(Y) || !MD(c)) } function MD(n) { return gie(n) || !!n.constEnumOnlyModule } function SU(n, a) { if (L.assert(!Y.verbatimModuleSyntax), Zh(n)) { let c = fr(n), u = c && Ai(c); if (u?.referenced) return !0; let p = Ai(c).aliasTarget; if (p && uu(n) & 1 && Fl(p) & 111551 && (U0(Y) || !MD(p))) return !0 } return a ? !!pa(n, c => SU(c, a)) : !1 } function ZLe(n) { if (Pf(n.body)) { if (zy(n) || Ng(n)) return !1; let a = fr(n), c = Xb(a); return c.length > 1 || c.length === 1 && c[0].declaration !== n } return !1 } function eke(n) { return !!U && !Qk(n) && !xp(n) && !!n.initializer && !Mr(n, 16476) } function rrt(n) { return U && Qk(n) && !n.initializer && Mr(n, 16476) } function irt(n) { let a = ea(n, Jc); if (!a) return !1; let c = fr(a); return !c || !(c.flags & 16) ? !1 : !!Ld(Gd(c), u => u.flags & 111551 && u.valueDeclaration && br(u.valueDeclaration)) } function art(n) { let a = ea(n, Jc); if (!a) return Je; let c = fr(a); return c && Jo(zn(c)) || Je } function sA(n) { var a; let c = n.id || 0; return c < 0 || c >= Ib.length ? 0 : ((a = Ib[c]) == null ? void 0 : a.flags) || 0 } function xU(n) { return OLe(n.parent), Rr(n).enumMemberValue } function tke(n) { switch (n.kind) { case 302: case 208: case 209: return !0 }return !1 } function zie(n) { if (n.kind === 302) return xU(n); let a = Rr(n).resolvedSymbol; if (a && a.flags & 8) { let c = a.valueDeclaration; if (R0(c.parent)) return xU(c) } } function Jie(n) { return !!(n.flags & 524288) && xa(n, 0).length > 0 } function ort(n, a) { var c; let u = ea(n, Cd); if (!u || a && (a = ea(a), !a)) return 0; let p = !1; if (Yu(u)) { let H = uc(Yd(u), 111551, !0, !0, a); p = !!((c = H?.declarations) != null && c.every(I0)) } let h = uc(u, 111551, !0, !0, a), T = h && h.flags & 2097152 ? wc(h) : h; p || (p = !!(h && nd(h, 111551))); let k = uc(u, 788968, !0, !1, a); if (T && T === k) { let H = _ne(!1); if (H && T === H) return 9; let J = zn(T); if (J && Uv(J)) return p ? 10 : 1 } if (!k) return p ? 11 : 0; let O = gs(k); return Ro(O) ? p ? 11 : 0 : O.flags & 3 ? 11 : ul(O, 245760) ? 2 : ul(O, 528) ? 6 : ul(O, 296) ? 3 : ul(O, 2112) ? 4 : ul(O, 402653316) ? 5 : po(O) ? 7 : ul(O, 12288) ? 8 : Jie(O) ? 10 : _f(O) ? 7 : 11 } function srt(n, a, c, u, p) { let h = ea(n, Qse); if (!h) return D.createToken(131); let T = fr(h), k = T && !(T.flags & 133120) ? i0(zn(T)) : ve; return k.flags & 8192 && k.symbol === T && (c |= 1048576), p && (k = gg(k)), Be.typeToTypeNode(k, a, c | 1024, u) } function crt(n, a, c, u) { let p = ea(n, Ia); if (!p) return D.createToken(131); let h = ip(p); return Be.typeToTypeNode(qo(h), a, c | 1024, u) } function lrt(n, a, c, u) { let p = ea(n, ot); if (!p) return D.createToken(131); let h = Sd(KLe(p)); return Be.typeToTypeNode(h, a, c | 1024, u) } function urt(n) { return Ne.has(Bs(n)) } function i8(n, a) { let c = Rr(n).resolvedSymbol; if (c) return c; let u = n; if (a) { let p = n.parent; Kl(p) && n === p.name && (u = FE(p)) } return zs(u, n.escapedText, 3257279, void 0, void 0, !0) } function drt(n) { let a = Rr(n).resolvedSymbol; return a && a !== Ht ? a : zs(n, n.escapedText, 3257279, void 0, void 0, !0, void 0, void 0) } function frt(n) { if (!tc(n)) { let a = ea(n, Re); if (a) { let c = i8(a); if (c) return tp(c).valueDeclaration } } } function _rt(n) { return x6(n) || wi(n) && kh(n) ? t0(zn(fr(n))) : !1 } function prt(n, a, c) { let u = n.flags & 1056 ? Be.symbolToExpression(n.symbol, 111551, a, void 0, c) : n === pe ? D.createTrue() : n === Ke && D.createFalse(); if (u) return u; let p = n.value; return typeof p == "object" ? D.createBigIntLiteral(p) : typeof p == "number" ? D.createNumericLiteral(p) : D.createStringLiteral(p) } function mrt(n, a) { let c = zn(fr(n)); return prt(c, n, a) } function nke(n) { return n ? (Rb(n), Gn(n).localJsxFactory || Kh) : Kh } function Kie(n) { if (n) { let a = Gn(n); if (a) { if (a.localJsxFragmentFactory) return a.localJsxFragmentFactory; let c = a.pragmas.get("jsxfrag"), u = ba(c) ? c[0] : c; if (u) return a.localJsxFragmentFactory = zS(u.arguments.factory, R), a.localJsxFragmentFactory } } if (Y.jsxFragmentFactory) return zS(Y.jsxFragmentFactory, R) } function hrt() { let n = e.getResolvedTypeReferenceDirectives(), a; return n && (a = new Map, n.forEach(({ resolvedTypeReferenceDirective: O }, H, J) => { if (!O?.resolvedFileName) return; let de = e.getSourceFile(O.resolvedFileName); de && k(de, H, J) })), { getReferencedExportContainer: $nt, getReferencedImportDeclaration: Qnt, getReferencedDeclarationWithCollidingName: ert, isDeclarationWithCollidingName: trt, isValueAliasDeclaration: O => { let H = ea(O); return H ? QLe(H) : !0 }, hasGlobalName: urt, isReferencedAliasDeclaration: (O, H) => { let J = ea(O); return J ? SU(J, H) : !0 }, getNodeCheckFlags: O => { let H = ea(O); return H ? sA(H) : 0 }, isTopLevelValueImportEqualsWithEntityName: nrt, isDeclarationVisible: Xf, isImplementationOfOverload: ZLe, isRequiredInitializedParameter: eke, isOptionalUninitializedParameterProperty: rrt, isExpandoFunctionDeclaration: irt, getPropertiesOfContainerFunction: art, createTypeOfDeclaration: srt, createReturnTypeOfSignatureDeclaration: crt, createTypeOfExpression: lrt, createLiteralConstValue: mrt, isSymbolAccessible: dy, isEntityNameVisible: Nx, getConstantValue: O => { let H = ea(O, tke); return H ? zie(H) : void 0 }, collectLinkedAliases: ME, getReferencedValueDeclaration: frt, getTypeReferenceSerializationKind: ort, isOptionalParameter: Qk, moduleExportsSomeValue: Xnt, isArgumentsLocalBinding: qnt, getExternalModuleFileFromDeclaration: O => { let H = ea(O, zse); return H && qie(H) }, getTypeReferenceDirectivesForEntityName: p, getTypeReferenceDirectivesForSymbol: h, isLiteralConstDeclaration: _rt, isLateBound: O => { let H = ea(O, Kl), J = H && fr(H); return !!(J && ac(J) & 4096) }, getJsxFactoryEntity: nke, getJsxFragmentFactoryEntity: Kie, getAllAccessorDeclarations(O) { O = ea(O, t6); let H = O.kind === 175 ? 174 : 175, J = nc(fr(O), H), de = J && J.pos < O.pos ? J : O, Ae = J && J.pos < O.pos ? O : J, xe = O.kind === 175 ? O : J, tt = O.kind === 174 ? O : J; return { firstAccessor: de, secondAccessor: Ae, setAccessor: xe, getAccessor: tt } }, getSymbolOfExternalModuleSpecifier: O => ah(O, O, void 0), isBindingCapturedByNode: (O, H) => { let J = ea(O), de = ea(H); return !!J && !!de && (wi(de) || Wo(de)) && zYe(J, de) }, getDeclarationStatementsForSourceFile: (O, H, J, de) => { let Ae = ea(O); L.assert(Ae && Ae.kind === 308, "Non-sourcefile node passed into getDeclarationsForSourceFile"); let xe = fr(O); return xe ? xe.exports ? Be.symbolTableToDeclarationStatements(xe.exports, O, H, J, de) : [] : O.locals ? Be.symbolTableToDeclarationStatements(O.locals, O, H, J, de) : [] }, isImportRequiredByAugmentation: c }; function c(O) { let H = Gn(O); if (!H.symbol) return !1; let J = qie(O); if (!J || J === H) return !1; let de = sh(H.symbol); for (let Ae of lo(de.values())) if (Ae.mergeId) { let xe = No(Ae); if (xe.declarations) { for (let tt of xe.declarations) if (Gn(tt) === J) return !0 } } return !1 } function u(O) { return O.parent && O.parent.kind === 230 && O.parent.parent && O.parent.parent.kind === 294 } function p(O) { if (!a) return; let H; O.parent.kind === 164 ? H = 1160127 : (H = 790504, (O.kind === 79 && kC(O) || O.kind === 208 && !u(O)) && (H = 1160127)); let J = uc(O, H, !0); return J && J !== Ht ? h(J, H) : void 0 } function h(O, H) { if (!a || !T(O)) return; let J; for (let de of O.declarations) if (de.symbol && de.symbol.flags & H) { let Ae = Gn(de), xe = a.get(Ae.path); if (xe) (J || (J = [])).push(xe); else return } return J } function T(O) { if (!O.declarations) return !1; let H = O; for (; ;) { let J = ju(H); if (J) H = J; else break } if (H.valueDeclaration && H.valueDeclaration.kind === 308 && H.flags & 512) return !1; for (let J of O.declarations) { let de = Gn(J); if (a.has(de.path)) return !0 } return !1 } function k(O, H, J) { if (!a.has(O.path)) { a.set(O.path, [H, J]); for (let { fileName: de, resolutionMode: Ae } of O.referencedFiles) { let xe = wF(de, O.fileName), tt = e.getSourceFile(xe); tt && k(tt, H, Ae || O.impliedNodeFormat) } } } } function qie(n) { let a = n.kind === 264 ? zr(n.name, yo) : UA(n), c = ah(a, a, void 0); if (c) return nc(c, 308) } function grt() { for (let a of e.getSourceFiles()) c_e(a, Y); pr = new Map; let n; for (let a of e.getSourceFiles()) if (!a.redirectInfo) { if (!kd(a)) { let c = a.locals.get("globalThis"); if (c?.declarations) for (let u of c.declarations) Lo.add(hr(u, _.Declaration_name_conflicts_with_built_in_global_identifier_0, "globalThis")); ll(Ne, a.locals) } a.jsGlobalAugmentations && ll(Ne, a.jsGlobalAugmentations), a.patternAmbientModules && a.patternAmbientModules.length && (Ka = Qi(Ka, a.patternAmbientModules)), a.moduleAugmentations.length && (n || (n = [])).push(a.moduleAugmentations), a.symbol && a.symbol.globalExports && a.symbol.globalExports.forEach((u, p) => { Ne.has(p) || Ne.set(p, u) }) } if (n) for (let a of n) for (let c of a) mp(c.parent) && y1(c); if (lC(Ne, Db, _.Declaration_name_conflicts_with_built_in_global_identifier_0), Ai(Le).type = je, Ai(_t).type = Fc("IArguments", 0, !0), Ai(Ht).type = ve, Ai(Ye).type = Bd(16, Ye), $o = Fc("Array", 1, !0), ka = Fc("Object", 0, !0), Hs = Fc("Function", 0, !0), Uc = le && Fc("CallableFunction", 0, !0) || Hs, Gu = le && Fc("NewableFunction", 0, !0) || Hs, Ws = Fc("String", 0, !0), hd = Fc("Number", 0, !0), vc = Fc("Boolean", 0, !0), nf = Fc("RegExp", 0, !0), Et = nu(Se), bn = nu(at), bn === Ki && (bn = ls(void 0, q, Je, Je, Je)), jo = oAe("ReadonlyArray", 1) || $o, Ri = jo ? rD(jo, [Se]) : Et, ye = oAe("ThisType", 1), n) for (let a of n) for (let c of a) mp(c.parent) || y1(c); pr.forEach(({ firstFile: a, secondFile: c, conflictingSymbols: u }) => { if (u.size < 8) u.forEach(({ isBlockScoped: p, firstFileLocations: h, secondFileLocations: T }, k) => { let O = p ? _.Cannot_redeclare_block_scoped_variable_0 : _.Duplicate_identifier_0; for (let H of h) Ml(H, O, k, T); for (let H of T) Ml(H, O, k, h) }); else { let p = lo(u.keys()).join(", "); Lo.add(Ao(hr(a, _.Definitions_of_the_following_identifiers_conflict_with_those_in_another_file_Colon_0, p), hr(c, _.Conflicts_are_in_this_file))), Lo.add(Ao(hr(c, _.Definitions_of_the_following_identifiers_conflict_with_those_in_another_file_Colon_0, p), hr(a, _.Conflicts_are_in_this_file))) } }), pr = void 0 } function Hc(n, a) { if ((l & a) !== a && Y.importHelpers) { let c = Gn(n); if (aS(c, Y) && !(n.flags & 16777216)) { let u = vrt(c, n); if (u !== Ht) { let p = a & ~l; for (let h = 1; h <= 16777216; h <<= 1)if (p & h) for (let T of yrt(h)) { if (s.has(T)) continue; s.add(T); let k = yd(u.exports, Bs(T), 111551); k ? h & 524288 ? vt(Xb(k), O => xd(O) > 3) || Fe(n, _.This_syntax_requires_an_imported_helper_named_1_with_2_parameters_which_is_not_compatible_with_the_one_in_0_Consider_upgrading_your_version_of_0, _b, T, 4) : h & 1048576 ? vt(Xb(k), O => xd(O) > 4) || Fe(n, _.This_syntax_requires_an_imported_helper_named_1_with_2_parameters_which_is_not_compatible_with_the_one_in_0_Consider_upgrading_your_version_of_0, _b, T, 5) : h & 1024 && (vt(Xb(k), O => xd(O) > 2) || Fe(n, _.This_syntax_requires_an_imported_helper_named_1_with_2_parameters_which_is_not_compatible_with_the_one_in_0_Consider_upgrading_your_version_of_0, _b, T, 3)) : Fe(n, _.This_syntax_requires_an_imported_helper_named_1_which_does_not_exist_in_0_Consider_upgrading_your_version_of_0, _b, T) } } l |= a } } } function yrt(n) { switch (n) { case 1: return ["__extends"]; case 2: return ["__assign"]; case 4: return ["__rest"]; case 8: return $ ? ["__decorate"] : ["__esDecorate", "__runInitializers"]; case 16: return ["__metadata"]; case 32: return ["__param"]; case 64: return ["__awaiter"]; case 128: return ["__generator"]; case 256: return ["__values"]; case 512: return ["__read"]; case 1024: return ["__spreadArray"]; case 2048: return ["__await"]; case 4096: return ["__asyncGenerator"]; case 8192: return ["__asyncDelegator"]; case 16384: return ["__asyncValues"]; case 32768: return ["__exportStar"]; case 65536: return ["__importStar"]; case 131072: return ["__importDefault"]; case 262144: return ["__makeTemplateObject"]; case 524288: return ["__classPrivateFieldGet"]; case 1048576: return ["__classPrivateFieldSet"]; case 2097152: return ["__classPrivateFieldIn"]; case 4194304: return ["__createBinding"]; case 8388608: return ["__setFunctionName"]; case 16777216: return ["__propKey"]; default: return L.fail("Unrecognized helper") } } function vrt(n, a) { return f || (f = qc(n, _b, _.This_syntax_requires_an_imported_helper_but_module_0_cannot_be_found, a) || Ht), f } function km(n) { let a = Trt(n) || brt(n); if (a !== void 0) return a; if (ha(n) && G0(n)) return dl(n, _.Neither_decorators_nor_modifiers_may_be_applied_to_this_parameters); let c, u, p, h, T, k = 0, O = !1, H = !1; for (let J of n.modifiers) if (du(J)) { if (M6($, n, n.parent, n.parent.parent)) { if ($ && (n.kind === 174 || n.kind === 175)) { let de = kT(n.parent.members, n); if (bf(de.firstAccessor) && n === de.secondAccessor) return dl(n, _.Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name) } } else return n.kind === 171 && !Pf(n.body) ? dl(n, _.A_decorator_can_only_decorate_a_method_implementation_not_an_overload) : dl(n, _.Decorators_are_not_valid_here); if (k & -132098) return an(J, _.Decorators_are_not_valid_here); if (H && k & 126975) { L.assertIsDefined(T); let de = Gn(J); return l0(de) ? !1 : (Ao(Fe(J, _.Decorators_may_not_appear_after_export_or_export_default_if_they_also_appear_before_export), hr(T, _.Decorator_used_before_export_here)), !0) } k |= 131072, k & 126975 ? k & 1 && (O = !0) : H = !0, T ?? (T = J) } else { if (J.kind !== 146) { if (n.kind === 168 || n.kind === 170) return an(J, _._0_modifier_cannot_appear_on_a_type_member, Xa(J.kind)); if (n.kind === 178 && (J.kind !== 124 || !Yr(n.parent))) return an(J, _._0_modifier_cannot_appear_on_an_index_signature, Xa(J.kind)) } if (J.kind !== 101 && J.kind !== 145 && J.kind !== 85 && n.kind === 165) return an(J, _._0_modifier_cannot_appear_on_a_type_parameter, Xa(J.kind)); switch (J.kind) { case 85: if (n.kind !== 263 && n.kind !== 165) return an(n, _.A_class_member_cannot_have_the_0_keyword, Xa(85)); let de = n.parent; if (n.kind === 165 && !(Ds(de) || Yr(de) || Jm(de) || yL(de) || _2(de) || uO(de) || zm(de))) return an(J, _._0_modifier_can_only_appear_on_a_type_parameter_of_a_function_method_or_class, Xa(J.kind)); break; case 161: if (k & 16384) return an(J, _._0_modifier_already_seen, "override"); if (k & 2) return an(J, _._0_modifier_cannot_be_used_with_1_modifier, "override", "declare"); if (k & 64) return an(J, _._0_modifier_must_precede_1_modifier, "override", "readonly"); if (k & 128) return an(J, _._0_modifier_must_precede_1_modifier, "override", "accessor"); if (k & 512) return an(J, _._0_modifier_must_precede_1_modifier, "override", "async"); k |= 16384, h = J; break; case 123: case 122: case 121: let Ae = Ud(gS(J.kind)); if (k & 28) return an(J, _.Accessibility_modifier_already_seen); if (k & 16384) return an(J, _._0_modifier_must_precede_1_modifier, Ae, "override"); if (k & 32) return an(J, _._0_modifier_must_precede_1_modifier, Ae, "static"); if (k & 128) return an(J, _._0_modifier_must_precede_1_modifier, Ae, "accessor"); if (k & 64) return an(J, _._0_modifier_must_precede_1_modifier, Ae, "readonly"); if (k & 512) return an(J, _._0_modifier_must_precede_1_modifier, Ae, "async"); if (n.parent.kind === 265 || n.parent.kind === 308) return an(J, _._0_modifier_cannot_appear_on_a_module_or_namespace_element, Ae); if (k & 256) return J.kind === 121 ? an(J, _._0_modifier_cannot_be_used_with_1_modifier, Ae, "abstract") : an(J, _._0_modifier_must_precede_1_modifier, Ae, "abstract"); if (xu(n)) return an(J, _.An_accessibility_modifier_cannot_be_used_with_a_private_identifier); k |= gS(J.kind); break; case 124: if (k & 32) return an(J, _._0_modifier_already_seen, "static"); if (k & 64) return an(J, _._0_modifier_must_precede_1_modifier, "static", "readonly"); if (k & 512) return an(J, _._0_modifier_must_precede_1_modifier, "static", "async"); if (k & 128) return an(J, _._0_modifier_must_precede_1_modifier, "static", "accessor"); if (n.parent.kind === 265 || n.parent.kind === 308) return an(J, _._0_modifier_cannot_appear_on_a_module_or_namespace_element, "static"); if (n.kind === 166) return an(J, _._0_modifier_cannot_appear_on_a_parameter, "static"); if (k & 256) return an(J, _._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract"); if (k & 16384) return an(J, _._0_modifier_must_precede_1_modifier, "static", "override"); k |= 32, c = J; break; case 127: if (k & 128) return an(J, _._0_modifier_already_seen, "accessor"); if (k & 64) return an(J, _._0_modifier_cannot_be_used_with_1_modifier, "accessor", "readonly"); if (k & 2) return an(J, _._0_modifier_cannot_be_used_with_1_modifier, "accessor", "declare"); if (n.kind !== 169) return an(J, _.accessor_modifier_can_only_appear_on_a_property_declaration); k |= 128; break; case 146: if (k & 64) return an(J, _._0_modifier_already_seen, "readonly"); if (n.kind !== 169 && n.kind !== 168 && n.kind !== 178 && n.kind !== 166) return an(J, _.readonly_modifier_can_only_appear_on_a_property_declaration_or_index_signature); if (k & 128) return an(J, _._0_modifier_cannot_be_used_with_1_modifier, "readonly", "accessor"); k |= 64; break; case 93: if (Y.verbatimModuleSyntax && !(n.flags & 16777216) && n.kind !== 262 && n.kind !== 261 && n.kind !== 264 && n.parent.kind === 308 && (ie === 1 || Gn(n).impliedNodeFormat === 1)) return an(J, _.A_top_level_export_modifier_cannot_be_used_on_value_declarations_in_a_CommonJS_module_when_verbatimModuleSyntax_is_enabled); if (k & 1) return an(J, _._0_modifier_already_seen, "export"); if (k & 2) return an(J, _._0_modifier_must_precede_1_modifier, "export", "declare"); if (k & 256) return an(J, _._0_modifier_must_precede_1_modifier, "export", "abstract"); if (k & 512) return an(J, _._0_modifier_must_precede_1_modifier, "export", "async"); if (Yr(n.parent)) return an(J, _._0_modifier_cannot_appear_on_class_elements_of_this_kind, "export"); if (n.kind === 166) return an(J, _._0_modifier_cannot_appear_on_a_parameter, "export"); k |= 1; break; case 88: let xe = n.parent.kind === 308 ? n.parent : n.parent.parent; if (xe.kind === 264 && !lu(xe)) return an(J, _.A_default_export_can_only_be_used_in_an_ECMAScript_style_module); if (k & 1) { if (O) return an(T, _.Decorators_are_not_valid_here) } else return an(J, _._0_modifier_must_precede_1_modifier, "export", "default"); k |= 1024; break; case 136: if (k & 2) return an(J, _._0_modifier_already_seen, "declare"); if (k & 512) return an(J, _._0_modifier_cannot_be_used_in_an_ambient_context, "async"); if (k & 16384) return an(J, _._0_modifier_cannot_be_used_in_an_ambient_context, "override"); if (Yr(n.parent) && !Na(n)) return an(J, _._0_modifier_cannot_appear_on_class_elements_of_this_kind, "declare"); if (n.kind === 166) return an(J, _._0_modifier_cannot_appear_on_a_parameter, "declare"); if (n.parent.flags & 16777216 && n.parent.kind === 265) return an(J, _.A_declare_modifier_cannot_be_used_in_an_already_ambient_context); if (xu(n)) return an(J, _._0_modifier_cannot_be_used_with_a_private_identifier, "declare"); if (k & 128) return an(J, _._0_modifier_cannot_be_used_with_1_modifier, "declare", "accessor"); k |= 2, u = J; break; case 126: if (k & 256) return an(J, _._0_modifier_already_seen, "abstract"); if (n.kind !== 260 && n.kind !== 182) { if (n.kind !== 171 && n.kind !== 169 && n.kind !== 174 && n.kind !== 175) return an(J, _.abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration); if (!(n.parent.kind === 260 && Mr(n.parent, 256))) return an(J, _.Abstract_methods_can_only_appear_within_an_abstract_class); if (k & 32) return an(J, _._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract"); if (k & 8) return an(J, _._0_modifier_cannot_be_used_with_1_modifier, "private", "abstract"); if (k & 512 && p) return an(p, _._0_modifier_cannot_be_used_with_1_modifier, "async", "abstract"); if (k & 16384) return an(J, _._0_modifier_must_precede_1_modifier, "abstract", "override"); if (k & 128) return an(J, _._0_modifier_must_precede_1_modifier, "abstract", "accessor") } if (zl(n) && n.name.kind === 80) return an(J, _._0_modifier_cannot_be_used_with_a_private_identifier, "abstract"); k |= 256; break; case 132: if (k & 512) return an(J, _._0_modifier_already_seen, "async"); if (k & 2 || n.parent.flags & 16777216) return an(J, _._0_modifier_cannot_be_used_in_an_ambient_context, "async"); if (n.kind === 166) return an(J, _._0_modifier_cannot_appear_on_a_parameter, "async"); if (k & 256) return an(J, _._0_modifier_cannot_be_used_with_1_modifier, "async", "abstract"); k |= 512, p = J; break; case 101: case 145: let tt = J.kind === 101 ? 32768 : 65536, It = J.kind === 101 ? "in" : "out"; if (n.kind !== 165 || !(ku(n.parent) || Yr(n.parent) || Ep(n.parent))) return an(J, _._0_modifier_can_only_appear_on_a_type_parameter_of_a_class_interface_or_type_alias, It); if (k & tt) return an(J, _._0_modifier_already_seen, It); if (tt & 32768 && k & 65536) return an(J, _._0_modifier_must_precede_1_modifier, "in", "out"); k |= tt; break } } return n.kind === 173 ? k & 32 ? an(c, _._0_modifier_cannot_appear_on_a_constructor_declaration, "static") : k & 16384 ? an(h, _._0_modifier_cannot_appear_on_a_constructor_declaration, "override") : k & 512 ? an(p, _._0_modifier_cannot_appear_on_a_constructor_declaration, "async") : !1 : (n.kind === 269 || n.kind === 268) && k & 2 ? an(u, _.A_0_modifier_cannot_be_used_with_an_import_declaration, "declare") : n.kind === 166 && k & 16476 && La(n.name) ? an(n, _.A_parameter_property_may_not_be_declared_using_a_binding_pattern) : n.kind === 166 && k & 16476 && n.dotDotDotToken ? an(n, _.A_parameter_property_cannot_be_declared_using_a_rest_parameter) : k & 512 ? xrt(n, p) : !1 } function brt(n) { if (!n.modifiers) return !1; let a = Ert(n); return a && dl(a, _.Modifiers_cannot_appear_here) } function Xie(n, a) { let c = wr(n.modifiers, Ha); return c && c.kind !== a ? c : void 0 } function Ert(n) { switch (n.kind) { case 174: case 175: case 173: case 169: case 168: case 171: case 170: case 178: case 264: case 269: case 268: case 275: case 274: case 215: case 216: case 166: case 165: return; case 172: case 299: case 300: case 267: case 279: return wr(n.modifiers, Ha); default: if (n.parent.kind === 265 || n.parent.kind === 308) return; switch (n.kind) { case 259: return Xie(n, 132); case 260: case 182: return Xie(n, 126); case 228: case 261: case 240: case 262: return wr(n.modifiers, Ha); case 263: return Xie(n, 85); default: L.assertNever(n) } } } function Trt(n) { let a = Srt(n); return a && dl(a, _.Decorators_are_not_valid_here) } function Srt(n) { return aJ(n) ? wr(n.modifiers, du) : void 0 } function xrt(n, a) { switch (n.kind) { case 171: case 259: case 215: case 216: return !1 }return an(a, _._0_modifier_cannot_be_used_here, "async") } function B1(n, a = _.Trailing_comma_not_allowed) { return n && n.hasTrailingComma ? u0(n[0], n.end - 1, 1, a) : !1 } function rke(n, a) { if (n && n.length === 0) { let c = n.pos - 1, u = xo(a.text, n.end) + 1; return u0(a, c, u - c, _.Type_parameter_list_cannot_be_empty) } return !1 } function Art(n) { let a = !1, c = n.length; for (let u = 0; u < c; u++) { let p = n[u]; if (p.dotDotDotToken) { if (u !== c - 1) return an(p.dotDotDotToken, _.A_rest_parameter_must_be_last_in_a_parameter_list); if (p.flags & 16777216 || B1(n, _.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma), p.questionToken) return an(p.questionToken, _.A_rest_parameter_cannot_be_optional); if (p.initializer) return an(p.name, _.A_rest_parameter_cannot_have_an_initializer) } else if (Qk(p)) { if (a = !0, p.questionToken && p.initializer) return an(p.name, _.Parameter_cannot_have_question_mark_and_initializer) } else if (a && !p.initializer) return an(p.name, _.A_required_parameter_cannot_follow_an_optional_parameter) } } function Crt(n) { return Pr(n, a => !!a.initializer || La(a.name) || Fm(a)) } function Irt(n) { if (R >= 3) { let a = n.body && Va(n.body) && tJ(n.body.statements); if (a) { let c = Crt(n.parameters); if (Fn(c)) { mn(c, p => { Ao(Fe(p, _.This_parameter_is_not_allowed_with_use_strict_directive), hr(a, _.use_strict_directive_used_here)) }); let u = c.map((p, h) => h === 0 ? hr(p, _.Non_simple_parameter_declared_here) : hr(p, _.and_here)); return Ao(Fe(a, _.use_strict_directive_cannot_be_used_with_non_simple_parameter_list), ...u), !0 } } } return !1 } function AU(n) { let a = Gn(n); return km(n) || rke(n.typeParameters, a) || Art(n.parameters) || krt(n, a) || Ds(n) && Irt(n) } function Lrt(n) { let a = Gn(n); return Nrt(n) || rke(n.typeParameters, a) } function krt(n, a) { if (!xs(n)) return !1; n.typeParameters && !(Fn(n.typeParameters) > 1 || n.typeParameters.hasTrailingComma || n.typeParameters[0].constraint) && a && $c(a.fileName, [".mts", ".cts"]) && an(n.typeParameters[0], _.This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Add_a_trailing_comma_or_explicit_constraint); let { equalsGreaterThanToken: c } = n, u = Gs(a, c.pos).line, p = Gs(a, c.end).line; return u !== p && an(c, _.Line_terminator_not_permitted_before_arrow) } function Drt(n) { let a = n.parameters[0]; if (n.parameters.length !== 1) return an(a ? a.name : n, _.An_index_signature_must_have_exactly_one_parameter); if (B1(n.parameters, _.An_index_signature_cannot_have_a_trailing_comma), a.dotDotDotToken) return an(a.dotDotDotToken, _.An_index_signature_cannot_have_a_rest_parameter); if (n4(a)) return an(a.name, _.An_index_signature_parameter_cannot_have_an_accessibility_modifier); if (a.questionToken) return an(a.questionToken, _.An_index_signature_parameter_cannot_have_a_question_mark); if (a.initializer) return an(a.name, _.An_index_signature_parameter_cannot_have_an_initializer); if (!a.type) return an(a.name, _.An_index_signature_parameter_must_have_a_type_annotation); let c = $r(a.type); return yh(c, u => !!(u.flags & 8576)) || SC(c) ? an(a.name, _.An_index_signature_parameter_type_cannot_be_a_literal_type_or_generic_type_Consider_using_a_mapped_object_type_instead) : Im(c, KG) ? n.type ? !1 : an(n, _.An_index_signature_must_have_a_type_annotation) : an(a.name, _.An_index_signature_parameter_type_must_be_string_number_symbol_or_a_template_literal_type) } function wrt(n) { return km(n) || Drt(n) } function Rrt(n, a) { if (a && a.length === 0) { let c = Gn(n), u = a.pos - 1, p = xo(c.text, a.end) + 1; return u0(c, u, p - u, _.Type_argument_list_cannot_be_empty) } return !1 } function a8(n, a) { return B1(a) || Rrt(n, a) } function Ort(n) { return n.questionDotToken || n.flags & 32 ? an(n.template, _.Tagged_template_expressions_are_not_permitted_in_an_optional_chain) : !1 } function ike(n) { let a = n.types; if (B1(a)) return !0; if (a && a.length === 0) { let c = Xa(n.token); return u0(n, a.pos, 0, _._0_list_cannot_be_empty, c) } return vt(a, ake) } function ake(n) { return Vg(n) && gL(n.expression) && n.typeArguments ? an(n, _.This_use_of_import_is_invalid_import_calls_can_be_written_but_they_must_have_parentheses_and_cannot_have_type_arguments) : a8(n, n.typeArguments) } function Nrt(n) { let a = !1, c = !1; if (!km(n) && n.heritageClauses) for (let u of n.heritageClauses) { if (u.token === 94) { if (a) return dl(u, _.extends_clause_already_seen); if (c) return dl(u, _.extends_clause_must_precede_implements_clause); if (u.types.length > 1) return dl(u.types[1], _.Classes_can_only_extend_a_single_class); a = !0 } else { if (L.assert(u.token === 117), c) return dl(u, _.implements_clause_already_seen); c = !0 } ike(u) } } function Prt(n) { let a = !1; if (n.heritageClauses) for (let c of n.heritageClauses) { if (c.token === 94) { if (a) return dl(c, _.extends_clause_already_seen); a = !0 } else return L.assert(c.token === 117), dl(c, _.Interface_declaration_cannot_have_implements_clause); ike(c) } return !1 } function CU(n) { if (n.kind !== 164) return !1; let a = n; return a.expression.kind === 223 && a.expression.operatorToken.kind === 27 ? an(a.expression, _.A_comma_expression_is_not_allowed_in_a_computed_property_name) : !1 } function Yie(n) { if (n.asteriskToken) { if (L.assert(n.kind === 259 || n.kind === 215 || n.kind === 171), n.flags & 16777216) return an(n.asteriskToken, _.Generators_are_not_allowed_in_an_ambient_context); if (!n.body) return an(n.asteriskToken, _.An_overload_signature_cannot_be_declared_as_a_generator) } } function $ie(n, a) { return !!n && an(n, a) } function oke(n, a) { return !!n && an(n, a) } function Mrt(n, a) { let c = new Map; for (let u of n.properties) { if (u.kind === 301) { if (a) { let T = vs(u.expression); if (fu(T) || rs(T)) return an(u.expression, _.A_rest_element_cannot_contain_a_binding_pattern) } continue } let p = u.name; if (p.kind === 164 && CU(p), u.kind === 300 && !a && u.objectAssignmentInitializer && an(u.equalsToken, _.Did_you_mean_to_use_a_Colon_An_can_only_follow_a_property_name_when_the_containing_object_literal_is_part_of_a_destructuring_pattern), p.kind === 80 && an(p, _.Private_identifiers_are_not_allowed_outside_class_bodies), g_(u) && u.modifiers) for (let T of u.modifiers) Ha(T) && (T.kind !== 132 || u.kind !== 171) && an(T, _._0_modifier_cannot_be_used_here, Qc(T)); else if (cde(u) && u.modifiers) for (let T of u.modifiers) Ha(T) && an(T, _._0_modifier_cannot_be_used_here, Qc(T)); let h; switch (u.kind) { case 300: case 299: oke(u.exclamationToken, _.A_definite_assignment_assertion_is_not_permitted_in_this_context), $ie(u.questionToken, _.An_object_member_cannot_be_declared_optional), p.kind === 8 && eae(p), h = 4; break; case 171: h = 8; break; case 174: h = 1; break; case 175: h = 2; break; default: throw L.assertNever(u, "Unexpected syntax kind:" + u.kind) }if (!a) { let T = M0(p); if (T === void 0) continue; let k = c.get(T); if (!k) c.set(T, h); else if (h & 8 && k & 8) an(p, _.Duplicate_identifier_0, Qc(p)); else if (h & 4 && k & 4) an(p, _.An_object_literal_cannot_have_multiple_properties_with_the_same_name, Qc(p)); else if (h & 3 && k & 3) if (k !== 3 && h !== k) c.set(T, h | k); else return an(p, _.An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name); else return an(p, _.An_object_literal_cannot_have_property_and_accessor_with_the_same_name) } } } function Frt(n) { Grt(n.tagName), a8(n, n.typeArguments); let a = new Map; for (let c of n.attributes.properties) { if (c.kind === 290) continue; let { name: u, initializer: p } = c; if (!a.get(u.escapedText)) a.set(u.escapedText, !0); else return an(u, _.JSX_elements_cannot_have_multiple_attributes_with_the_same_name); if (p && p.kind === 291 && !p.expression) return an(p, _.JSX_attributes_must_only_be_assigned_a_non_empty_expression) } } function Grt(n) { if (br(n)) { let c = n; do { let p = a(c.name); if (p) return p; c = c.expression } while (br(c)); let u = a(c); if (u) return u } function a(c) { if (Re(c) && vr(c).indexOf(":") !== -1) return an(c, _.JSX_property_access_expressions_cannot_include_JSX_namespace_names) } } function Brt(n) { if (n.expression && wL(n.expression)) return an(n.expression, _.JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array) } function ske(n) { if (vh(n)) return !0; if (n.kind === 247 && n.awaitModifier && !(n.flags & 32768)) { let a = Gn(n); if (O6(n)) { if (!l0(a)) switch (aS(a, Y) || Lo.add(hr(n.awaitModifier, _.for_await_loops_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_has_no_imports_or_exports_Consider_adding_an_empty_export_to_make_this_file_a_module)), ie) { case 100: case 199: if (a.impliedNodeFormat === 1) { Lo.add(hr(n.awaitModifier, _.The_current_file_is_a_CommonJS_module_and_cannot_use_await_at_the_top_level)); break } case 7: case 99: case 4: if (R >= 4) break; default: Lo.add(hr(n.awaitModifier, _.Top_level_for_await_loops_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_or_nodenext_and_the_target_option_is_set_to_es2017_or_higher)); break } } else if (!l0(a)) { let c = hr(n.awaitModifier, _.for_await_loops_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules), u = Xd(n); if (u && u.kind !== 173) { L.assert((pl(u) & 2) === 0, "Enclosing function should never be an async function."); let p = hr(u, _.Did_you_mean_to_mark_this_function_as_async); Ao(c, p) } return Lo.add(c), !0 } return !1 } if (_O(n) && !(n.flags & 32768) && Re(n.initializer) && n.initializer.escapedText === "async") return an(n.initializer, _.The_left_hand_side_of_a_for_of_statement_may_not_be_async), !1; if (n.initializer.kind === 258) { let a = n.initializer; if (!Zie(a)) { let c = a.declarations; if (!c.length) return !1; if (c.length > 1) { let p = n.kind === 246 ? _.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement : _.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement; return dl(a.declarations[1], p) } let u = c[0]; if (u.initializer) { let p = n.kind === 246 ? _.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer : _.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer; return an(u.name, p) } if (u.type) { let p = n.kind === 246 ? _.The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation : _.The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation; return an(u, p) } } } return !1 } function Urt(n) { if (!(n.flags & 16777216) && n.parent.kind !== 184 && n.parent.kind !== 261) { if (R < 1) return an(n.name, _.Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher); if (R < 2 && pi(n.name)) return an(n.name, _.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher); if (n.body === void 0 && !Mr(n, 256)) return u0(n, n.end - 1, 1, _._0_expected, "{") } if (n.body) { if (Mr(n, 256)) return an(n, _.An_abstract_accessor_cannot_have_an_implementation); if (n.parent.kind === 184 || n.parent.kind === 261) return an(n.body, _.An_implementation_cannot_be_declared_in_ambient_contexts) } if (n.typeParameters) return an(n.name, _.An_accessor_cannot_have_type_parameters); if (!Vrt(n)) return an(n.name, n.kind === 174 ? _.A_get_accessor_cannot_have_parameters : _.A_set_accessor_must_have_exactly_one_parameter); if (n.kind === 175) { if (n.type) return an(n.name, _.A_set_accessor_cannot_have_a_return_type_annotation); let a = L.checkDefined(VI(n), "Return value does not match parameter count assertion."); if (a.dotDotDotToken) return an(a.dotDotDotToken, _.A_set_accessor_cannot_have_rest_parameter); if (a.questionToken) return an(a.questionToken, _.A_set_accessor_cannot_have_an_optional_parameter); if (a.initializer) return an(n.name, _.A_set_accessor_parameter_cannot_have_an_initializer) } return !1 } function Vrt(n) { return Qie(n) || n.parameters.length === (n.kind === 174 ? 0 : 1) } function Qie(n) { if (n.parameters.length === (n.kind === 174 ? 1 : 2)) return F0(n) } function jrt(n) { if (n.operator === 156) { if (n.type.kind !== 153) return an(n.type, _._0_expected, Xa(153)); let a = dR(n.parent); if (Yn(a) && UT(a)) { let c = dS(a); c && (a = HA(c) || c) } switch (a.kind) { case 257: let c = a; if (c.name.kind !== 79) return an(n, _.unique_symbol_types_may_not_be_used_on_a_variable_declaration_with_a_binding_name); if (!L6(c)) return an(n, _.unique_symbol_types_are_only_allowed_on_variables_in_a_variable_statement); if (!(c.parent.flags & 2)) return an(a.name, _.A_variable_whose_type_is_a_unique_symbol_type_must_be_const); break; case 169: if (!Ca(a) || !jI(a)) return an(a.name, _.A_property_of_a_class_whose_type_is_a_unique_symbol_type_must_be_both_static_and_readonly); break; case 168: if (!Mr(a, 64)) return an(a.name, _.A_property_of_an_interface_or_type_literal_whose_type_is_a_unique_symbol_type_must_be_readonly); break; default: return an(n, _.unique_symbol_types_are_not_allowed_here) } } else if (n.operator === 146 && n.type.kind !== 185 && n.type.kind !== 186) return dl(n, _.readonly_type_modifier_is_only_permitted_on_array_and_tuple_literal_types, Xa(153)) } function JC(n, a) { if (hJe(n)) return an(n, a) } function cke(n) { if (AU(n)) return !0; if (n.kind === 171) { if (n.parent.kind === 207) { if (n.modifiers && !(n.modifiers.length === 1 && Vo(n.modifiers).kind === 132)) return dl(n, _.Modifiers_cannot_appear_here); if ($ie(n.questionToken, _.An_object_member_cannot_be_declared_optional)) return !0; if (oke(n.exclamationToken, _.A_definite_assignment_assertion_is_not_permitted_in_this_context)) return !0; if (n.body === void 0) return u0(n, n.end - 1, 1, _._0_expected, "{") } if (Yie(n)) return !0 } if (Yr(n.parent)) { if (R < 2 && pi(n.name)) return an(n.name, _.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher); if (n.flags & 16777216) return JC(n.name, _.A_computed_property_name_in_an_ambient_context_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type); if (n.kind === 171 && !n.body) return JC(n.name, _.A_computed_property_name_in_a_method_overload_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type) } else { if (n.parent.kind === 261) return JC(n.name, _.A_computed_property_name_in_an_interface_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type); if (n.parent.kind === 184) return JC(n.name, _.A_computed_property_name_in_a_type_literal_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type) } } function Hrt(n) { let a = n; for (; a;) { if (SA(a)) return an(n, _.Jump_target_cannot_cross_function_boundary); switch (a.kind) { case 253: if (n.label && a.label.escapedText === n.label.escapedText) return n.kind === 248 && !Wy(a.statement, !0) ? an(n, _.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement) : !1; break; case 252: if (n.kind === 249 && !n.label) return !1; break; default: if (Wy(a, !1) && !n.label) return !1; break }a = a.parent } if (n.label) { let c = n.kind === 249 ? _.A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement : _.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement; return an(n, c) } else { let c = n.kind === 249 ? _.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement : _.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement; return an(n, c) } } function Wrt(n) { if (n.dotDotDotToken) { let a = n.parent.elements; if (n !== To(a)) return an(n, _.A_rest_element_must_be_last_in_a_destructuring_pattern); if (B1(a, _.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma), n.propertyName) return an(n.name, _.A_rest_element_cannot_have_a_property_name) } if (n.dotDotDotToken && n.initializer) return u0(n, n.initializer.pos - 1, 1, _.A_rest_element_cannot_have_an_initializer) } function lke(n) { return yf(n) || n.kind === 221 && n.operator === 40 && n.operand.kind === 8 } function zrt(n) { return n.kind === 9 || n.kind === 221 && n.operator === 40 && n.operand.kind === 9 } function Jrt(n) { if ((br(n) || Vs(n) && lke(n.argumentExpression)) && bc(n.expression)) return !!(Ic(n).flags & 1056) } function uke(n) { let a = n.initializer; if (a) { let c = !(lke(a) || Jrt(a) || a.kind === 110 || a.kind === 95 || zrt(a)); if ((x6(n) || wi(n) && kh(n)) && !n.type) { if (c) return an(a, _.A_const_initializer_in_an_ambient_context_must_be_a_string_or_numeric_literal_or_literal_enum_reference) } else return an(a, _.Initializers_are_not_allowed_in_ambient_contexts) } } function Krt(n) { if (n.parent.parent.kind !== 246 && n.parent.parent.kind !== 247) { if (n.flags & 16777216) uke(n); else if (!n.initializer) { if (La(n.name) && !La(n.parent)) return an(n, _.A_destructuring_declaration_must_have_an_initializer); if (kh(n)) return an(n, _.const_declarations_must_be_initialized) } } if (n.exclamationToken && (n.parent.parent.kind !== 240 || !n.type || n.initializer || n.flags & 16777216)) { let c = n.initializer ? _.Declarations_with_initializers_cannot_also_have_definite_assignment_assertions : n.type ? _.A_definite_assignment_assertion_is_not_permitted_in_this_context : _.Declarations_with_definite_assignment_assertions_must_also_have_type_annotations; return an(n.exclamationToken, c) } return (ie < 5 || Gn(n).impliedNodeFormat === 1) && ie !== 4 && !(n.parent.parent.flags & 16777216) && Mr(n.parent.parent, 1) && dke(n.name), (II(n) || kh(n)) && fke(n.name) } function dke(n) { if (n.kind === 79) { if (vr(n) === "__esModule") return Yrt("noEmit", n, _.Identifier_expected_esModule_is_reserved_as_an_exported_marker_when_transforming_ECMAScript_modules) } else { let a = n.elements; for (let c of a) if (!ol(c)) return dke(c.name) } return !1 } function fke(n) { if (n.kind === 79) { if (n.escapedText === "let") return an(n, _.let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations) } else { let a = n.elements; for (let c of a) ol(c) || fke(c.name) } return !1 } function Zie(n) { let a = n.declarations; return B1(n.declarations) ? !0 : n.declarations.length ? !1 : u0(n, a.pos, a.end - a.pos, _.Variable_declaration_list_cannot_be_empty) } function _ke(n) { switch (n.kind) { case 242: case 243: case 244: case 251: case 245: case 246: case 247: return !1; case 253: return _ke(n.parent) }return !0 } function qrt(n) { if (!_ke(n.parent)) { if (II(n.declarationList)) return an(n, _.let_declarations_can_only_be_declared_inside_a_block); if (kh(n.declarationList)) return an(n, _.const_declarations_can_only_be_declared_inside_a_block) } } function Xrt(n) { let a = n.name.escapedText; switch (n.keywordToken) { case 103: if (a !== "target") return an(n.name, _._0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2, n.name.escapedText, Xa(n.keywordToken), "target"); break; case 100: if (a !== "meta") return an(n.name, _._0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2, n.name.escapedText, Xa(n.keywordToken), "meta"); break } } function l0(n) { return n.parseDiagnostics.length > 0 } function dl(n, a, c, u, p) { let h = Gn(n); if (!l0(h)) { let T = Pg(h, n.pos); return Lo.add(al(h, T.start, T.length, a, c, u, p)), !0 } return !1 } function u0(n, a, c, u, p, h, T) { let k = Gn(n); return l0(k) ? !1 : (Lo.add(al(k, a, c, u, p, h, T)), !0) } function Yrt(n, a, c, u, p, h) { let T = Gn(a); return l0(T) ? !1 : (Ev(n, a, c, u, p, h), !0) } function an(n, a, c, u, p) { let h = Gn(n); return l0(h) ? !1 : (Lo.add(hr(n, a, c, u, p)), !0) } function $rt(n) { let a = Yn(n) ? t4(n) : void 0, c = n.typeParameters || a && Sl(a); if (c) { let u = c.pos === c.end ? c.pos : xo(Gn(n).text, c.pos); return u0(n, u, c.end - u, _.Type_parameters_cannot_appear_on_a_constructor_declaration) } } function Qrt(n) { let a = n.type || U_(n); if (a) return an(a, _.Type_annotation_cannot_appear_on_a_constructor_declaration) } function Zrt(n) { if (ts(n.name) && ar(n.name.expression) && n.name.expression.operatorToken.kind === 101) return an(n.parent.members[0], _.A_mapped_type_may_not_declare_properties_or_methods); if (Yr(n.parent)) { if (yo(n.name) && n.name.text === "constructor") return an(n.name, _.Classes_may_not_have_a_field_named_constructor); if (JC(n.name, _.A_computed_property_name_in_a_class_property_declaration_must_have_a_simple_literal_type_or_a_unique_symbol_type)) return !0; if (R < 2 && pi(n.name)) return an(n.name, _.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher); if (R < 2 && Id(n)) return an(n.name, _.Properties_with_the_accessor_modifier_are_only_available_when_targeting_ECMAScript_2015_and_higher); if (Id(n) && $ie(n.questionToken, _.An_accessor_property_cannot_be_declared_optional)) return !0 } else if (n.parent.kind === 261) { if (JC(n.name, _.A_computed_property_name_in_an_interface_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type)) return !0; if (L.assertNode(n, $d), n.initializer) return an(n.initializer, _.An_interface_property_cannot_have_an_initializer) } else if (Rd(n.parent)) { if (JC(n.name, _.A_computed_property_name_in_a_type_literal_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type)) return !0; if (L.assertNode(n, $d), n.initializer) return an(n.initializer, _.A_type_literal_property_cannot_have_an_initializer) } if (n.flags & 16777216 && uke(n), Na(n) && n.exclamationToken && (!Yr(n.parent) || !n.type || n.initializer || n.flags & 16777216 || Ca(n) || B0(n))) { let a = n.initializer ? _.Declarations_with_initializers_cannot_also_have_definite_assignment_assertions : n.type ? _.A_definite_assignment_assertion_is_not_permitted_in_this_context : _.Declarations_with_definite_assignment_assertions_must_also_have_type_annotations; return an(n.exclamationToken, a) } } function eit(n) { return n.kind === 261 || n.kind === 262 || n.kind === 269 || n.kind === 268 || n.kind === 275 || n.kind === 274 || n.kind === 267 || Mr(n, 1027) ? !1 : dl(n, _.Top_level_declarations_in_d_ts_files_must_start_with_either_a_declare_or_export_modifier) } function tit(n) { for (let a of n.statements) if ((Kl(a) || a.kind === 240) && eit(a)) return !0; return !1 } function nit(n) { return !!(n.flags & 16777216) && tit(n) } function vh(n) { if (n.flags & 16777216) { if (!Rr(n).hasReportedStatementInAmbientContext && (Ia(n.parent) || rb(n.parent))) return Rr(n).hasReportedStatementInAmbientContext = dl(n, _.An_implementation_cannot_be_declared_in_ambient_contexts); if (n.parent.kind === 238 || n.parent.kind === 265 || n.parent.kind === 308) { let c = Rr(n.parent); if (!c.hasReportedStatementInAmbientContext) return c.hasReportedStatementInAmbientContext = dl(n, _.Statements_are_not_allowed_in_ambient_contexts) } } return !1 } function eae(n) { if (n.numericLiteralFlags & 32) { let a; if (R >= 1 ? a = _.Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher_Use_the_syntax_0 : TH(n, 198) ? a = _.Octal_literal_types_must_use_ES2015_syntax_Use_the_syntax_0 : TH(n, 302) && (a = _.Octal_literals_are_not_allowed_in_enums_members_initializer_Use_the_syntax_0), a) { let c = tv(n.parent) && n.parent.operator === 40, u = (c ? "-" : "") + "0o" + n.text; return an(c ? n.parent : n, a, u) } } return rit(n), !1 } function rit(n) { let a = Qc(n).indexOf(".") !== -1, c = n.numericLiteralFlags & 16; a || c || +n.text <= 2 ** 53 - 1 || ey(!1, hr(n, _.Numeric_literals_with_absolute_values_equal_to_2_53_or_greater_are_too_large_to_be_represented_accurately_as_integers)) } function iit(n) { return !!(!(mb(n.parent) || tv(n.parent) && mb(n.parent.parent)) && R < 7 && an(n, _.BigInt_literals_are_not_available_when_targeting_lower_than_ES2020)) } function ait(n, a, c, u, p) { let h = Gn(n); if (!l0(h)) { let T = Pg(h, n.pos); return Lo.add(al(h, wl(T), 0, a, c, u, p)), !0 } return !1 } function oit() { return Go || (Go = [], Ne.forEach((n, a) => { uF.test(a) && Go.push(n) })), Go } function sit(n) { var a; return n.isTypeOnly && n.name && n.namedBindings ? an(n, _.A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both) : n.isTypeOnly && ((a = n.namedBindings) == null ? void 0 : a.kind) === 272 ? pke(n.namedBindings) : !1 } function pke(n) { return !!mn(n.elements, a => { if (a.isTypeOnly) return dl(a, a.kind === 273 ? _.The_type_modifier_cannot_be_used_on_a_named_import_when_import_type_is_used_on_its_import_statement : _.The_type_modifier_cannot_be_used_on_a_named_export_when_export_type_is_used_on_its_export_statement) }) } function cit(n) { if (Y.verbatimModuleSyntax && ie === 1) return an(n, _.ESM_syntax_is_not_allowed_in_a_CommonJS_module_when_verbatimModuleSyntax_is_enabled); if (ie === 5) return an(n, _.Dynamic_imports_are_only_supported_when_the_module_flag_is_set_to_es2020_es2022_esnext_commonjs_amd_system_umd_node16_or_nodenext); if (n.typeArguments) return an(n, _.This_use_of_import_is_invalid_import_calls_can_be_written_but_they_must_have_parentheses_and_cannot_have_type_arguments); let a = n.arguments; if (ie !== 99 && ie !== 199 && ie !== 100 && (B1(a), a.length > 1)) { let u = a[1]; return an(u, _.Dynamic_imports_only_support_a_second_argument_when_the_module_option_is_set_to_esnext_node16_or_nodenext) } if (a.length === 0 || a.length > 2) return an(n, _.Dynamic_imports_can_only_accept_a_module_specifier_and_an_optional_assertion_as_arguments); let c = wr(a, Km); return c ? an(c, _.Argument_of_dynamic_import_cannot_be_spread_element) : !1 } function lit(n, a) { let c = Ur(n); if (c & 20 && a.flags & 1048576) return wr(a.types, u => { if (u.flags & 524288) { let p = c & Ur(u); if (p & 4) return n.target === u.target; if (p & 16) return !!n.aliasSymbol && n.aliasSymbol === u.aliasSymbol } return !1 }) } function uit(n, a) { if (Ur(n) & 128 && yh(a, Kv)) return wr(a.types, c => !Kv(c)) } function dit(n, a) { let c = 0; if (xa(n, c).length > 0 || (c = 1, xa(n, c).length > 0)) return wr(a.types, p => xa(p, c).length > 0) } function fit(n, a) { let c; if (!(n.flags & 406978556)) { let u = 0; for (let p of a.types) if (!(p.flags & 406978556)) { let h = so([Gp(n), Gp(p)]); if (h.flags & 4194304) return p; if (N_(h) || h.flags & 1048576) { let T = h.flags & 1048576 ? Oy(h.types, N_) : 1; T >= u && (c = p, u = T) } } } return c } function _it(n) { if (Js(n, 67108864)) { let a = jc(n, c => !(c.flags & 134348796)); if (!(a.flags & 131072)) return a } return n } function mke(n, a, c, u) { if (a.flags & 1048576 && n.flags & 2621440) { let p = O2e(a, n); if (p) return p; let h = Jo(n); if (h) { let T = R2e(h, a); if (T) return Wne(a, on(T, k => [() => zn(k), k.escapedName]), c, void 0, u) } } }
+            } function mPe(e) { return !rb(e) } function D_e(e) { return e.kind !== 259 && e.kind !== 171 || !!e.body } function w_e(e) { switch (e.parent.kind) { case 273: case 278: return Re(e); default: return Rh(e) } } function R_e(e) { switch (e) { case 0: return "yieldType"; case 1: return "returnType"; case 2: return "nextType" } } function Xl(e) { return !!(e.flags & 1) } function _K(e) { return !!(e.flags & 2) } function hPe(e) { return { getCommonSourceDirectory: e.getCommonSourceDirectory ? () => e.getCommonSourceDirectory() : () => "", getCurrentDirectory: () => e.getCurrentDirectory(), getSymlinkCache: ho(e, e.getSymlinkCache), getPackageJsonInfoCache: () => { var t; return (t = e.getPackageJsonInfoCache) == null ? void 0 : t.call(e) }, useCaseSensitiveFileNames: ho(e, e.useCaseSensitiveFileNames), redirectTargetsMap: e.redirectTargetsMap, getProjectReferenceRedirect: t => e.getProjectReferenceRedirect(t), isSourceOfProjectReferenceRedirect: t => e.isSourceOfProjectReferenceRedirect(t), fileExists: t => e.fileExists(t), getFileIncludeReasons: () => e.getFileIncludeReasons(), readFile: e.readFile ? t => e.readFile(t) : void 0 } } var uF, nN, pK, mK, hK, gK, dF, fF, _F, pF, O_e, rN, yK, Qd, iN, gPe = gt({ "src/compiler/checker.ts"() { "use strict"; fa(), dK(), E0(), uF = /^".+"$/, nN = "(anonymous)", pK = 1, mK = 1, hK = 1, gK = 1, dF = (e => (e[e.None = 0] = "None", e[e.TypeofEQString = 1] = "TypeofEQString", e[e.TypeofEQNumber = 2] = "TypeofEQNumber", e[e.TypeofEQBigInt = 4] = "TypeofEQBigInt", e[e.TypeofEQBoolean = 8] = "TypeofEQBoolean", e[e.TypeofEQSymbol = 16] = "TypeofEQSymbol", e[e.TypeofEQObject = 32] = "TypeofEQObject", e[e.TypeofEQFunction = 64] = "TypeofEQFunction", e[e.TypeofEQHostObject = 128] = "TypeofEQHostObject", e[e.TypeofNEString = 256] = "TypeofNEString", e[e.TypeofNENumber = 512] = "TypeofNENumber", e[e.TypeofNEBigInt = 1024] = "TypeofNEBigInt", e[e.TypeofNEBoolean = 2048] = "TypeofNEBoolean", e[e.TypeofNESymbol = 4096] = "TypeofNESymbol", e[e.TypeofNEObject = 8192] = "TypeofNEObject", e[e.TypeofNEFunction = 16384] = "TypeofNEFunction", e[e.TypeofNEHostObject = 32768] = "TypeofNEHostObject", e[e.EQUndefined = 65536] = "EQUndefined", e[e.EQNull = 131072] = "EQNull", e[e.EQUndefinedOrNull = 262144] = "EQUndefinedOrNull", e[e.NEUndefined = 524288] = "NEUndefined", e[e.NENull = 1048576] = "NENull", e[e.NEUndefinedOrNull = 2097152] = "NEUndefinedOrNull", e[e.Truthy = 4194304] = "Truthy", e[e.Falsy = 8388608] = "Falsy", e[e.IsUndefined = 16777216] = "IsUndefined", e[e.IsNull = 33554432] = "IsNull", e[e.IsUndefinedOrNull = 50331648] = "IsUndefinedOrNull", e[e.All = 134217727] = "All", e[e.BaseStringStrictFacts = 3735041] = "BaseStringStrictFacts", e[e.BaseStringFacts = 12582401] = "BaseStringFacts", e[e.StringStrictFacts = 16317953] = "StringStrictFacts", e[e.StringFacts = 16776705] = "StringFacts", e[e.EmptyStringStrictFacts = 12123649] = "EmptyStringStrictFacts", e[e.EmptyStringFacts = 12582401] = "EmptyStringFacts", e[e.NonEmptyStringStrictFacts = 7929345] = "NonEmptyStringStrictFacts", e[e.NonEmptyStringFacts = 16776705] = "NonEmptyStringFacts", e[e.BaseNumberStrictFacts = 3734786] = "BaseNumberStrictFacts", e[e.BaseNumberFacts = 12582146] = "BaseNumberFacts", e[e.NumberStrictFacts = 16317698] = "NumberStrictFacts", e[e.NumberFacts = 16776450] = "NumberFacts", e[e.ZeroNumberStrictFacts = 12123394] = "ZeroNumberStrictFacts", e[e.ZeroNumberFacts = 12582146] = "ZeroNumberFacts", e[e.NonZeroNumberStrictFacts = 7929090] = "NonZeroNumberStrictFacts", e[e.NonZeroNumberFacts = 16776450] = "NonZeroNumberFacts", e[e.BaseBigIntStrictFacts = 3734276] = "BaseBigIntStrictFacts", e[e.BaseBigIntFacts = 12581636] = "BaseBigIntFacts", e[e.BigIntStrictFacts = 16317188] = "BigIntStrictFacts", e[e.BigIntFacts = 16775940] = "BigIntFacts", e[e.ZeroBigIntStrictFacts = 12122884] = "ZeroBigIntStrictFacts", e[e.ZeroBigIntFacts = 12581636] = "ZeroBigIntFacts", e[e.NonZeroBigIntStrictFacts = 7928580] = "NonZeroBigIntStrictFacts", e[e.NonZeroBigIntFacts = 16775940] = "NonZeroBigIntFacts", e[e.BaseBooleanStrictFacts = 3733256] = "BaseBooleanStrictFacts", e[e.BaseBooleanFacts = 12580616] = "BaseBooleanFacts", e[e.BooleanStrictFacts = 16316168] = "BooleanStrictFacts", e[e.BooleanFacts = 16774920] = "BooleanFacts", e[e.FalseStrictFacts = 12121864] = "FalseStrictFacts", e[e.FalseFacts = 12580616] = "FalseFacts", e[e.TrueStrictFacts = 7927560] = "TrueStrictFacts", e[e.TrueFacts = 16774920] = "TrueFacts", e[e.SymbolStrictFacts = 7925520] = "SymbolStrictFacts", e[e.SymbolFacts = 16772880] = "SymbolFacts", e[e.ObjectStrictFacts = 7888800] = "ObjectStrictFacts", e[e.ObjectFacts = 16736160] = "ObjectFacts", e[e.FunctionStrictFacts = 7880640] = "FunctionStrictFacts", e[e.FunctionFacts = 16728e3] = "FunctionFacts", e[e.VoidFacts = 9830144] = "VoidFacts", e[e.UndefinedFacts = 26607360] = "UndefinedFacts", e[e.NullFacts = 42917664] = "NullFacts", e[e.EmptyObjectStrictFacts = 83427327] = "EmptyObjectStrictFacts", e[e.EmptyObjectFacts = 83886079] = "EmptyObjectFacts", e[e.UnknownFacts = 83886079] = "UnknownFacts", e[e.AllTypeofNE = 556800] = "AllTypeofNE", e[e.OrFactsMask = 8256] = "OrFactsMask", e[e.AndFactsMask = 134209471] = "AndFactsMask", e))(dF || {}), fF = new Map(Object.entries({ string: 256, number: 512, bigint: 1024, boolean: 2048, symbol: 4096, undefined: 524288, object: 8192, function: 16384 })), _F = (e => (e[e.Normal = 0] = "Normal", e[e.Contextual = 1] = "Contextual", e[e.Inferential = 2] = "Inferential", e[e.SkipContextSensitive = 4] = "SkipContextSensitive", e[e.SkipGenericFunctions = 8] = "SkipGenericFunctions", e[e.IsForSignatureHelp = 16] = "IsForSignatureHelp", e[e.IsForStringLiteralArgumentCompletions = 32] = "IsForStringLiteralArgumentCompletions", e[e.RestBindingElement = 64] = "RestBindingElement", e))(_F || {}), pF = (e => (e[e.None = 0] = "None", e[e.BivariantCallback = 1] = "BivariantCallback", e[e.StrictCallback = 2] = "StrictCallback", e[e.IgnoreReturnTypes = 4] = "IgnoreReturnTypes", e[e.StrictArity = 8] = "StrictArity", e[e.StrictTopSignature = 16] = "StrictTopSignature", e[e.Callback = 3] = "Callback", e))(pF || {}), O_e = g8(D_e, mPe), rN = new Map(Object.entries({ Uppercase: 0, Lowercase: 1, Capitalize: 2, Uncapitalize: 3 })), yK = class { }, (e => { e.JSX = "JSX", e.IntrinsicElements = "IntrinsicElements", e.ElementClass = "ElementClass", e.ElementAttributesPropertyNameContainer = "ElementAttributesProperty", e.ElementChildrenAttributeNameContainer = "ElementChildrenAttribute", e.Element = "Element", e.IntrinsicAttributes = "IntrinsicAttributes", e.IntrinsicClassAttributes = "IntrinsicClassAttributes", e.LibraryManagedAttributes = "LibraryManagedAttributes" })(Qd || (Qd = {})), iN = class { constructor(e, t, r) { this.moduleResolverHost = void 0, this.inner = void 0, this.disableTrackSymbol = !1; for (var i; t instanceof iN;)t = t.inner; this.inner = t, this.moduleResolverHost = r, this.context = e, this.canTrackSymbol = !!((i = this.inner) != null && i.trackSymbol) } trackSymbol(e, t, r) { var i; return (i = this.inner) != null && i.trackSymbol && !this.disableTrackSymbol && this.inner.trackSymbol(e, t, r) ? (this.onDiagnosticReported(), !0) : !1 } reportInaccessibleThisError() { var e; (e = this.inner) != null && e.reportInaccessibleThisError && (this.onDiagnosticReported(), this.inner.reportInaccessibleThisError()) } reportPrivateInBaseOfClassExpression(e) { var t; (t = this.inner) != null && t.reportPrivateInBaseOfClassExpression && (this.onDiagnosticReported(), this.inner.reportPrivateInBaseOfClassExpression(e)) } reportInaccessibleUniqueSymbolError() { var e; (e = this.inner) != null && e.reportInaccessibleUniqueSymbolError && (this.onDiagnosticReported(), this.inner.reportInaccessibleUniqueSymbolError()) } reportCyclicStructureError() { var e; (e = this.inner) != null && e.reportCyclicStructureError && (this.onDiagnosticReported(), this.inner.reportCyclicStructureError()) } reportLikelyUnsafeImportRequiredError(e) { var t; (t = this.inner) != null && t.reportLikelyUnsafeImportRequiredError && (this.onDiagnosticReported(), this.inner.reportLikelyUnsafeImportRequiredError(e)) } reportTruncationError() { var e; (e = this.inner) != null && e.reportTruncationError && (this.onDiagnosticReported(), this.inner.reportTruncationError()) } trackReferencedAmbientModule(e, t) { var r; (r = this.inner) != null && r.trackReferencedAmbientModule && (this.onDiagnosticReported(), this.inner.trackReferencedAmbientModule(e, t)) } trackExternalModuleSymbolOfImportTypeNode(e) { var t; (t = this.inner) != null && t.trackExternalModuleSymbolOfImportTypeNode && (this.onDiagnosticReported(), this.inner.trackExternalModuleSymbolOfImportTypeNode(e)) } reportNonlocalAugmentation(e, t, r) { var i; (i = this.inner) != null && i.reportNonlocalAugmentation && (this.onDiagnosticReported(), this.inner.reportNonlocalAugmentation(e, t, r)) } reportNonSerializableProperty(e) { var t; (t = this.inner) != null && t.reportNonSerializableProperty && (this.onDiagnosticReported(), this.inner.reportNonSerializableProperty(e)) } reportImportTypeNodeResolutionModeOverride() { var e; (e = this.inner) != null && e.reportImportTypeNodeResolutionModeOverride && (this.onDiagnosticReported(), this.inner.reportImportTypeNodeResolutionModeOverride()) } onDiagnosticReported() { this.context.reportedDiagnostic = !0 } } } }); function $e(e, t, r, i) { if (e === void 0) return e; let o = t(e), s; if (o !== void 0) return ba(o) ? s = (i || TPe)(o) : s = o, L.assertNode(s, r), s } function On(e, t, r, i, o) { if (e === void 0) return e; let s = e.length; (i === void 0 || i < 0) && (i = 0), (o === void 0 || o > s - i) && (o = s - i); let l, f = -1, d = -1; i > 0 || o < s ? l = e.hasTrailingComma && i + o === s : (f = e.pos, d = e.end, l = e.hasTrailingComma); let g = N_e(e, t, r, i, o); if (g !== e) { let m = D.createNodeArray(g, l); return om(m, f, d), m } return e } function vK(e, t, r, i, o) { if (e === void 0) return e; let s = e.length; return (i === void 0 || i < 0) && (i = 0), (o === void 0 || o > s - i) && (o = s - i), N_e(e, t, r, i, o) } function N_e(e, t, r, i, o) { let s, l = e.length; (i > 0 || o < l) && (s = []); for (let f = 0; f < o; f++) { let d = e[f + i], g = d !== void 0 ? t ? t(d) : d : void 0; if ((s !== void 0 || g === void 0 || g !== d) && (s === void 0 && (s = e.slice(0, f), L.assertEachNode(s, r)), g)) if (ba(g)) for (let m of g) L.assertNode(m, r), s.push(m); else L.assertNode(g, r), s.push(g) } return s || (L.assertEachNode(e, r), e) } function mF(e, t, r, i, o, s = On) { return r.startLexicalEnvironment(), e = s(e, t, ca, i), o && (e = r.factory.ensureUseStrict(e)), D.mergeLexicalEnvironment(e, r.endLexicalEnvironment()) } function Sc(e, t, r, i = On) { let o; return r.startLexicalEnvironment(), e && (r.setLexicalEnvironmentFlags(1, !0), o = i(e, t, ha), r.getLexicalEnvironmentFlags() & 2 && Do(r.getCompilerOptions()) >= 2 && (o = yPe(o, r)), r.setLexicalEnvironmentFlags(1, !1)), r.suspendLexicalEnvironment(), o } function yPe(e, t) { let r; for (let i = 0; i < e.length; i++) { let o = e[i], s = vPe(o, t); (r || s !== o) && (r || (r = e.slice(0, i)), r[i] = s) } return r ? it(t.factory.createNodeArray(r, e.hasTrailingComma), e) : e } function vPe(e, t) { return e.dotDotDotToken ? e : La(e.name) ? bPe(e, t) : e.initializer ? EPe(e, e.name, e.initializer, t) : e } function bPe(e, t) { let { factory: r } = t; return t.addInitializationStatement(r.createVariableStatement(void 0, r.createVariableDeclarationList([r.createVariableDeclaration(e.name, void 0, e.type, e.initializer ? r.createConditionalExpression(r.createStrictEquality(r.getGeneratedNameForNode(e), r.createVoidZero()), void 0, e.initializer, void 0, r.getGeneratedNameForNode(e)) : r.getGeneratedNameForNode(e))]))), r.updateParameterDeclaration(e, e.modifiers, e.dotDotDotToken, r.getGeneratedNameForNode(e), e.questionToken, e.type, void 0) } function EPe(e, t, r, i) { let o = i.factory; return i.addInitializationStatement(o.createIfStatement(o.createTypeCheck(o.cloneNode(t), "undefined"), Jn(it(o.createBlock([o.createExpressionStatement(Jn(it(o.createAssignment(Jn(o.cloneNode(t), 96), Jn(r, 96 | Ya(r) | 3072)), e), 3072))]), e), 3905))), o.updateParameterDeclaration(e, e.modifiers, e.dotDotDotToken, e.name, e.questionToken, e.type, void 0) } function Zd(e, t, r, i = $e) { r.resumeLexicalEnvironment(); let o = i(e, t, u6), s = r.endLexicalEnvironment(); if (vt(s)) { if (!o) return r.factory.createBlock(s); let l = r.factory.converters.convertToFunctionBlock(o), f = D.mergeLexicalEnvironment(l.statements, s); return r.factory.updateBlock(l, f) } return o } function jf(e, t, r, i = $e) { r.startBlockScope(); let o = i(e, t, ca, r.factory.liftToBlock); L.assert(o); let s = r.endBlockScope(); return vt(s) ? Va(o) ? (s.push(...o.statements), r.factory.updateBlock(o, s)) : (s.push(o), r.factory.createBlock(s)) : o } function aN(e, t, r = t) { if (r === t || e.length <= 1) return On(e, t, ot); let i = 0, o = e.length; return On(e, s => { let l = i < o - 1; return i++, l ? r(s) : t(s) }, ot) } function xn(e, t, r, i = On, o, s = $e) { if (e === void 0) return; let l = P_e[e.kind]; return l === void 0 ? e : l(e, t, r, i, s, o) } function TPe(e) { return L.assert(e.length <= 1, "Too many nodes written to output."), Wp(e) } var P_e, SPe = gt({ "src/compiler/visitorPublic.ts"() { "use strict"; fa(), P_e = { 163: function (t, r, i, o, s, l) { return i.factory.updateQualifiedName(t, L.checkDefined(s(t.left, r, Cd)), L.checkDefined(s(t.right, r, Re))) }, 164: function (t, r, i, o, s, l) { return i.factory.updateComputedPropertyName(t, L.checkDefined(s(t.expression, r, ot))) }, 165: function (t, r, i, o, s, l) { return i.factory.updateTypeParameterDeclaration(t, o(t.modifiers, r, Ha), L.checkDefined(s(t.name, r, Re)), s(t.constraint, r, bi), s(t.default, r, bi)) }, 166: function (t, r, i, o, s, l) { return i.factory.updateParameterDeclaration(t, o(t.modifiers, r, Ns), l ? s(t.dotDotDotToken, l, o3) : t.dotDotDotToken, L.checkDefined(s(t.name, r, Mm)), l ? s(t.questionToken, l, ev) : t.questionToken, s(t.type, r, bi), s(t.initializer, r, ot)) }, 167: function (t, r, i, o, s, l) { return i.factory.updateDecorator(t, L.checkDefined(s(t.expression, r, ot))) }, 168: function (t, r, i, o, s, l) { return i.factory.updatePropertySignature(t, o(t.modifiers, r, Ha), L.checkDefined(s(t.name, r, Ys)), l ? s(t.questionToken, l, ev) : t.questionToken, s(t.type, r, bi)) }, 169: function (t, r, i, o, s, l) { var f, d; return i.factory.updatePropertyDeclaration(t, o(t.modifiers, r, Ns), L.checkDefined(s(t.name, r, Ys)), l ? s((f = t.questionToken) != null ? f : t.exclamationToken, l, lde) : (d = t.questionToken) != null ? d : t.exclamationToken, s(t.type, r, bi), s(t.initializer, r, ot)) }, 170: function (t, r, i, o, s, l) { return i.factory.updateMethodSignature(t, o(t.modifiers, r, Ha), L.checkDefined(s(t.name, r, Ys)), l ? s(t.questionToken, l, ev) : t.questionToken, o(t.typeParameters, r, _c), o(t.parameters, r, ha), s(t.type, r, bi)) }, 171: function (t, r, i, o, s, l) { return i.factory.updateMethodDeclaration(t, o(t.modifiers, r, Ns), l ? s(t.asteriskToken, l, cO) : t.asteriskToken, L.checkDefined(s(t.name, r, Ys)), l ? s(t.questionToken, l, ev) : t.questionToken, o(t.typeParameters, r, _c), Sc(t.parameters, r, i, o), s(t.type, r, bi), Zd(t.body, r, i, s)) }, 173: function (t, r, i, o, s, l) { return i.factory.updateConstructorDeclaration(t, o(t.modifiers, r, Ns), Sc(t.parameters, r, i, o), Zd(t.body, r, i, s)) }, 174: function (t, r, i, o, s, l) { return i.factory.updateGetAccessorDeclaration(t, o(t.modifiers, r, Ns), L.checkDefined(s(t.name, r, Ys)), Sc(t.parameters, r, i, o), s(t.type, r, bi), Zd(t.body, r, i, s)) }, 175: function (t, r, i, o, s, l) { return i.factory.updateSetAccessorDeclaration(t, o(t.modifiers, r, Ns), L.checkDefined(s(t.name, r, Ys)), Sc(t.parameters, r, i, o), Zd(t.body, r, i, s)) }, 172: function (t, r, i, o, s, l) { return i.startLexicalEnvironment(), i.suspendLexicalEnvironment(), i.factory.updateClassStaticBlockDeclaration(t, Zd(t.body, r, i, s)) }, 176: function (t, r, i, o, s, l) { return i.factory.updateCallSignature(t, o(t.typeParameters, r, _c), o(t.parameters, r, ha), s(t.type, r, bi)) }, 177: function (t, r, i, o, s, l) { return i.factory.updateConstructSignature(t, o(t.typeParameters, r, _c), o(t.parameters, r, ha), s(t.type, r, bi)) }, 178: function (t, r, i, o, s, l) { return i.factory.updateIndexSignature(t, o(t.modifiers, r, Ns), o(t.parameters, r, ha), L.checkDefined(s(t.type, r, bi))) }, 179: function (t, r, i, o, s, l) { return i.factory.updateTypePredicateNode(t, s(t.assertsModifier, r, Due), L.checkDefined(s(t.parameterName, r, ude)), s(t.type, r, bi)) }, 180: function (t, r, i, o, s, l) { return i.factory.updateTypeReferenceNode(t, L.checkDefined(s(t.typeName, r, Cd)), o(t.typeArguments, r, bi)) }, 181: function (t, r, i, o, s, l) { return i.factory.updateFunctionTypeNode(t, o(t.typeParameters, r, _c), o(t.parameters, r, ha), L.checkDefined(s(t.type, r, bi))) }, 182: function (t, r, i, o, s, l) { return i.factory.updateConstructorTypeNode(t, o(t.modifiers, r, Ha), o(t.typeParameters, r, _c), o(t.parameters, r, ha), L.checkDefined(s(t.type, r, bi))) }, 183: function (t, r, i, o, s, l) { return i.factory.updateTypeQueryNode(t, L.checkDefined(s(t.exprName, r, Cd)), o(t.typeArguments, r, bi)) }, 184: function (t, r, i, o, s, l) { return i.factory.updateTypeLiteralNode(t, o(t.members, r, _T)) }, 185: function (t, r, i, o, s, l) { return i.factory.updateArrayTypeNode(t, L.checkDefined(s(t.elementType, r, bi))) }, 186: function (t, r, i, o, s, l) { return i.factory.updateTupleTypeNode(t, o(t.elements, r, bi)) }, 187: function (t, r, i, o, s, l) { return i.factory.updateOptionalTypeNode(t, L.checkDefined(s(t.type, r, bi))) }, 188: function (t, r, i, o, s, l) { return i.factory.updateRestTypeNode(t, L.checkDefined(s(t.type, r, bi))) }, 189: function (t, r, i, o, s, l) { return i.factory.updateUnionTypeNode(t, o(t.types, r, bi)) }, 190: function (t, r, i, o, s, l) { return i.factory.updateIntersectionTypeNode(t, o(t.types, r, bi)) }, 191: function (t, r, i, o, s, l) { return i.factory.updateConditionalTypeNode(t, L.checkDefined(s(t.checkType, r, bi)), L.checkDefined(s(t.extendsType, r, bi)), L.checkDefined(s(t.trueType, r, bi)), L.checkDefined(s(t.falseType, r, bi))) }, 192: function (t, r, i, o, s, l) { return i.factory.updateInferTypeNode(t, L.checkDefined(s(t.typeParameter, r, _c))) }, 202: function (t, r, i, o, s, l) { return i.factory.updateImportTypeNode(t, L.checkDefined(s(t.argument, r, bi)), s(t.assertions, r, Vue), s(t.qualifier, r, Cd), o(t.typeArguments, r, bi), t.isTypeOf) }, 298: function (t, r, i, o, s, l) { return i.factory.updateImportTypeAssertionContainer(t, L.checkDefined(s(t.assertClause, r, p3)), t.multiLine) }, 199: function (t, r, i, o, s, l) { return i.factory.updateNamedTupleMember(t, l ? s(t.dotDotDotToken, l, o3) : t.dotDotDotToken, L.checkDefined(s(t.name, r, Re)), l ? s(t.questionToken, l, ev) : t.questionToken, L.checkDefined(s(t.type, r, bi))) }, 193: function (t, r, i, o, s, l) { return i.factory.updateParenthesizedType(t, L.checkDefined(s(t.type, r, bi))) }, 195: function (t, r, i, o, s, l) { return i.factory.updateTypeOperatorNode(t, L.checkDefined(s(t.type, r, bi))) }, 196: function (t, r, i, o, s, l) { return i.factory.updateIndexedAccessTypeNode(t, L.checkDefined(s(t.objectType, r, bi)), L.checkDefined(s(t.indexType, r, bi))) }, 197: function (t, r, i, o, s, l) { return i.factory.updateMappedTypeNode(t, l ? s(t.readonlyToken, l, dde) : t.readonlyToken, L.checkDefined(s(t.typeParameter, r, _c)), s(t.nameType, r, bi), l ? s(t.questionToken, l, fde) : t.questionToken, s(t.type, r, bi), o(t.members, r, _T)) }, 198: function (t, r, i, o, s, l) { return i.factory.updateLiteralTypeNode(t, L.checkDefined(s(t.literal, r, hse))) }, 200: function (t, r, i, o, s, l) { return i.factory.updateTemplateLiteralType(t, L.checkDefined(s(t.head, r, f2)), o(t.templateSpans, r, Mue)) }, 201: function (t, r, i, o, s, l) { return i.factory.updateTemplateLiteralTypeSpan(t, L.checkDefined(s(t.type, r, bi)), L.checkDefined(s(t.literal, r, o6))) }, 203: function (t, r, i, o, s, l) { return i.factory.updateObjectBindingPattern(t, o(t.elements, r, Wo)) }, 204: function (t, r, i, o, s, l) { return i.factory.updateArrayBindingPattern(t, o(t.elements, r, c6)) }, 205: function (t, r, i, o, s, l) { return i.factory.updateBindingElement(t, l ? s(t.dotDotDotToken, l, o3) : t.dotDotDotToken, s(t.propertyName, r, Ys), L.checkDefined(s(t.name, r, Mm)), s(t.initializer, r, ot)) }, 206: function (t, r, i, o, s, l) { return i.factory.updateArrayLiteralExpression(t, o(t.elements, r, ot)) }, 207: function (t, r, i, o, s, l) { return i.factory.updateObjectLiteralExpression(t, o(t.properties, r, Og)) }, 208: function (t, r, i, o, s, l) { return n6(t) ? i.factory.updatePropertyAccessChain(t, L.checkDefined(s(t.expression, r, ot)), l ? s(t.questionDotToken, l, s3) : t.questionDotToken, L.checkDefined(s(t.name, r, Ah))) : i.factory.updatePropertyAccessExpression(t, L.checkDefined(s(t.expression, r, ot)), L.checkDefined(s(t.name, r, Ah))) }, 209: function (t, r, i, o, s, l) { return Dj(t) ? i.factory.updateElementAccessChain(t, L.checkDefined(s(t.expression, r, ot)), l ? s(t.questionDotToken, l, s3) : t.questionDotToken, L.checkDefined(s(t.argumentExpression, r, ot))) : i.factory.updateElementAccessExpression(t, L.checkDefined(s(t.expression, r, ot)), L.checkDefined(s(t.argumentExpression, r, ot))) }, 210: function (t, r, i, o, s, l) { return dT(t) ? i.factory.updateCallChain(t, L.checkDefined(s(t.expression, r, ot)), l ? s(t.questionDotToken, l, s3) : t.questionDotToken, o(t.typeArguments, r, bi), o(t.arguments, r, ot)) : i.factory.updateCallExpression(t, L.checkDefined(s(t.expression, r, ot)), o(t.typeArguments, r, bi), o(t.arguments, r, ot)) }, 211: function (t, r, i, o, s, l) { return i.factory.updateNewExpression(t, L.checkDefined(s(t.expression, r, ot)), o(t.typeArguments, r, bi), o(t.arguments, r, ot)) }, 212: function (t, r, i, o, s, l) { return i.factory.updateTaggedTemplateExpression(t, L.checkDefined(s(t.tag, r, ot)), o(t.typeArguments, r, bi), L.checkDefined(s(t.template, r, AA))) }, 213: function (t, r, i, o, s, l) { return i.factory.updateTypeAssertion(t, L.checkDefined(s(t.type, r, bi)), L.checkDefined(s(t.expression, r, ot))) }, 214: function (t, r, i, o, s, l) { return i.factory.updateParenthesizedExpression(t, L.checkDefined(s(t.expression, r, ot))) }, 215: function (t, r, i, o, s, l) { return i.factory.updateFunctionExpression(t, o(t.modifiers, r, Ha), l ? s(t.asteriskToken, l, cO) : t.asteriskToken, s(t.name, r, Re), o(t.typeParameters, r, _c), Sc(t.parameters, r, i, o), s(t.type, r, bi), Zd(t.body, r, i, s)) }, 216: function (t, r, i, o, s, l) { return i.factory.updateArrowFunction(t, o(t.modifiers, r, Ha), o(t.typeParameters, r, _c), Sc(t.parameters, r, i, o), s(t.type, r, bi), l ? L.checkDefined(s(t.equalsGreaterThanToken, l, Lue)) : t.equalsGreaterThanToken, Zd(t.body, r, i, s)) }, 217: function (t, r, i, o, s, l) { return i.factory.updateDeleteExpression(t, L.checkDefined(s(t.expression, r, ot))) }, 218: function (t, r, i, o, s, l) { return i.factory.updateTypeOfExpression(t, L.checkDefined(s(t.expression, r, ot))) }, 219: function (t, r, i, o, s, l) { return i.factory.updateVoidExpression(t, L.checkDefined(s(t.expression, r, ot))) }, 220: function (t, r, i, o, s, l) { return i.factory.updateAwaitExpression(t, L.checkDefined(s(t.expression, r, ot))) }, 221: function (t, r, i, o, s, l) { return i.factory.updatePrefixUnaryExpression(t, L.checkDefined(s(t.operand, r, ot))) }, 222: function (t, r, i, o, s, l) { return i.factory.updatePostfixUnaryExpression(t, L.checkDefined(s(t.operand, r, ot))) }, 223: function (t, r, i, o, s, l) { return i.factory.updateBinaryExpression(t, L.checkDefined(s(t.left, r, ot)), l ? L.checkDefined(s(t.operatorToken, l, pde)) : t.operatorToken, L.checkDefined(s(t.right, r, ot))) }, 224: function (t, r, i, o, s, l) { return i.factory.updateConditionalExpression(t, L.checkDefined(s(t.condition, r, ot)), l ? L.checkDefined(s(t.questionToken, l, ev)) : t.questionToken, L.checkDefined(s(t.whenTrue, r, ot)), l ? L.checkDefined(s(t.colonToken, l, Iue)) : t.colonToken, L.checkDefined(s(t.whenFalse, r, ot))) }, 225: function (t, r, i, o, s, l) { return i.factory.updateTemplateExpression(t, L.checkDefined(s(t.head, r, f2)), o(t.templateSpans, r, xL)) }, 226: function (t, r, i, o, s, l) { return i.factory.updateYieldExpression(t, l ? s(t.asteriskToken, l, cO) : t.asteriskToken, s(t.expression, r, ot)) }, 227: function (t, r, i, o, s, l) { return i.factory.updateSpreadElement(t, L.checkDefined(s(t.expression, r, ot))) }, 228: function (t, r, i, o, s, l) { return i.factory.updateClassExpression(t, o(t.modifiers, r, Ns), s(t.name, r, Re), o(t.typeParameters, r, _c), o(t.heritageClauses, r, dd), o(t.members, r, _l)) }, 230: function (t, r, i, o, s, l) { return i.factory.updateExpressionWithTypeArguments(t, L.checkDefined(s(t.expression, r, ot)), o(t.typeArguments, r, bi)) }, 231: function (t, r, i, o, s, l) { return i.factory.updateAsExpression(t, L.checkDefined(s(t.expression, r, ot)), L.checkDefined(s(t.type, r, bi))) }, 235: function (t, r, i, o, s, l) { return i.factory.updateSatisfiesExpression(t, L.checkDefined(s(t.expression, r, ot)), L.checkDefined(s(t.type, r, bi))) }, 232: function (t, r, i, o, s, l) { return Jl(t) ? i.factory.updateNonNullChain(t, L.checkDefined(s(t.expression, r, ot))) : i.factory.updateNonNullExpression(t, L.checkDefined(s(t.expression, r, ot))) }, 233: function (t, r, i, o, s, l) { return i.factory.updateMetaProperty(t, L.checkDefined(s(t.name, r, Re))) }, 236: function (t, r, i, o, s, l) { return i.factory.updateTemplateSpan(t, L.checkDefined(s(t.expression, r, ot)), L.checkDefined(s(t.literal, r, o6))) }, 238: function (t, r, i, o, s, l) { return i.factory.updateBlock(t, o(t.statements, r, ca)) }, 240: function (t, r, i, o, s, l) { return i.factory.updateVariableStatement(t, o(t.modifiers, r, Ns), L.checkDefined(s(t.declarationList, r, pu))) }, 241: function (t, r, i, o, s, l) { return i.factory.updateExpressionStatement(t, L.checkDefined(s(t.expression, r, ot))) }, 242: function (t, r, i, o, s, l) { return i.factory.updateIfStatement(t, L.checkDefined(s(t.expression, r, ot)), L.checkDefined(s(t.thenStatement, r, ca, i.factory.liftToBlock)), s(t.elseStatement, r, ca, i.factory.liftToBlock)) }, 243: function (t, r, i, o, s, l) { return i.factory.updateDoStatement(t, jf(t.statement, r, i, s), L.checkDefined(s(t.expression, r, ot))) }, 244: function (t, r, i, o, s, l) { return i.factory.updateWhileStatement(t, L.checkDefined(s(t.expression, r, ot)), jf(t.statement, r, i, s)) }, 245: function (t, r, i, o, s, l) { return i.factory.updateForStatement(t, s(t.initializer, r, pp), s(t.condition, r, ot), s(t.incrementor, r, ot), jf(t.statement, r, i, s)) }, 246: function (t, r, i, o, s, l) { return i.factory.updateForInStatement(t, L.checkDefined(s(t.initializer, r, pp)), L.checkDefined(s(t.expression, r, ot)), jf(t.statement, r, i, s)) }, 247: function (t, r, i, o, s, l) { return i.factory.updateForOfStatement(t, l ? s(t.awaitModifier, l, Dz) : t.awaitModifier, L.checkDefined(s(t.initializer, r, pp)), L.checkDefined(s(t.expression, r, ot)), jf(t.statement, r, i, s)) }, 248: function (t, r, i, o, s, l) { return i.factory.updateContinueStatement(t, s(t.label, r, Re)) }, 249: function (t, r, i, o, s, l) { return i.factory.updateBreakStatement(t, s(t.label, r, Re)) }, 250: function (t, r, i, o, s, l) { return i.factory.updateReturnStatement(t, s(t.expression, r, ot)) }, 251: function (t, r, i, o, s, l) { return i.factory.updateWithStatement(t, L.checkDefined(s(t.expression, r, ot)), L.checkDefined(s(t.statement, r, ca, i.factory.liftToBlock))) }, 252: function (t, r, i, o, s, l) { return i.factory.updateSwitchStatement(t, L.checkDefined(s(t.expression, r, ot)), L.checkDefined(s(t.caseBlock, r, hO))) }, 253: function (t, r, i, o, s, l) { return i.factory.updateLabeledStatement(t, L.checkDefined(s(t.label, r, Re)), L.checkDefined(s(t.statement, r, ca, i.factory.liftToBlock))) }, 254: function (t, r, i, o, s, l) { return i.factory.updateThrowStatement(t, L.checkDefined(s(t.expression, r, ot))) }, 255: function (t, r, i, o, s, l) { return i.factory.updateTryStatement(t, L.checkDefined(s(t.tryBlock, r, Va)), s(t.catchClause, r, E2), s(t.finallyBlock, r, Va)) }, 257: function (t, r, i, o, s, l) { return i.factory.updateVariableDeclaration(t, L.checkDefined(s(t.name, r, Mm)), l ? s(t.exclamationToken, l, lO) : t.exclamationToken, s(t.type, r, bi), s(t.initializer, r, ot)) }, 258: function (t, r, i, o, s, l) { return i.factory.updateVariableDeclarationList(t, o(t.declarations, r, wi)) }, 259: function (t, r, i, o, s, l) { return i.factory.updateFunctionDeclaration(t, o(t.modifiers, r, Ha), l ? s(t.asteriskToken, l, cO) : t.asteriskToken, s(t.name, r, Re), o(t.typeParameters, r, _c), Sc(t.parameters, r, i, o), s(t.type, r, bi), Zd(t.body, r, i, s)) }, 260: function (t, r, i, o, s, l) { return i.factory.updateClassDeclaration(t, o(t.modifiers, r, Ns), s(t.name, r, Re), o(t.typeParameters, r, _c), o(t.heritageClauses, r, dd), o(t.members, r, _l)) }, 261: function (t, r, i, o, s, l) { return i.factory.updateInterfaceDeclaration(t, o(t.modifiers, r, Ns), L.checkDefined(s(t.name, r, Re)), o(t.typeParameters, r, _c), o(t.heritageClauses, r, dd), o(t.members, r, _T)) }, 262: function (t, r, i, o, s, l) { return i.factory.updateTypeAliasDeclaration(t, o(t.modifiers, r, Ns), L.checkDefined(s(t.name, r, Re)), o(t.typeParameters, r, _c), L.checkDefined(s(t.type, r, bi))) }, 263: function (t, r, i, o, s, l) { return i.factory.updateEnumDeclaration(t, o(t.modifiers, r, Ns), L.checkDefined(s(t.name, r, Re)), o(t.members, r, q0)) }, 264: function (t, r, i, o, s, l) { return i.factory.updateModuleDeclaration(t, o(t.modifiers, r, Ns), L.checkDefined(s(t.name, r, _de)), s(t.body, r, vse)) }, 265: function (t, r, i, o, s, l) { return i.factory.updateModuleBlock(t, o(t.statements, r, ca)) }, 266: function (t, r, i, o, s, l) { return i.factory.updateCaseBlock(t, o(t.clauses, r, Kj)) }, 267: function (t, r, i, o, s, l) { return i.factory.updateNamespaceExportDeclaration(t, L.checkDefined(s(t.name, r, Re))) }, 268: function (t, r, i, o, s, l) { return i.factory.updateImportEqualsDeclaration(t, o(t.modifiers, r, Ns), t.isTypeOnly, L.checkDefined(s(t.name, r, Re)), L.checkDefined(s(t.moduleReference, r, Tse))) }, 269: function (t, r, i, o, s, l) { return i.factory.updateImportDeclaration(t, o(t.modifiers, r, Ns), s(t.importClause, r, lm), L.checkDefined(s(t.moduleSpecifier, r, ot)), s(t.assertClause, r, p3)) }, 296: function (t, r, i, o, s, l) { return i.factory.updateAssertClause(t, o(t.elements, r, jue), t.multiLine) }, 297: function (t, r, i, o, s, l) { return i.factory.updateAssertEntry(t, L.checkDefined(s(t.name, r, ase)), L.checkDefined(s(t.value, r, ot))) }, 270: function (t, r, i, o, s, l) { return i.factory.updateImportClause(t, t.isTypeOnly, s(t.name, r, Re), s(t.namedBindings, r, Wj)) }, 271: function (t, r, i, o, s, l) { return i.factory.updateNamespaceImport(t, L.checkDefined(s(t.name, r, Re))) }, 277: function (t, r, i, o, s, l) { return i.factory.updateNamespaceExport(t, L.checkDefined(s(t.name, r, Re))) }, 272: function (t, r, i, o, s, l) { return i.factory.updateNamedImports(t, o(t.elements, r, $u)) }, 273: function (t, r, i, o, s, l) { return i.factory.updateImportSpecifier(t, t.isTypeOnly, s(t.propertyName, r, Re), L.checkDefined(s(t.name, r, Re))) }, 274: function (t, r, i, o, s, l) { return i.factory.updateExportAssignment(t, o(t.modifiers, r, Ns), L.checkDefined(s(t.expression, r, ot))) }, 275: function (t, r, i, o, s, l) { return i.factory.updateExportDeclaration(t, o(t.modifiers, r, Ns), t.isTypeOnly, s(t.exportClause, r, Rj), s(t.moduleSpecifier, r, ot), s(t.assertClause, r, p3)) }, 276: function (t, r, i, o, s, l) { return i.factory.updateNamedExports(t, o(t.elements, r, Mu)) }, 278: function (t, r, i, o, s, l) { return i.factory.updateExportSpecifier(t, t.isTypeOnly, s(t.propertyName, r, Re), L.checkDefined(s(t.name, r, Re))) }, 280: function (t, r, i, o, s, l) { return i.factory.updateExternalModuleReference(t, L.checkDefined(s(t.expression, r, ot))) }, 281: function (t, r, i, o, s, l) { return i.factory.updateJsxElement(t, L.checkDefined(s(t.openingElement, r, Xm)), o(t.children, r, Pw), L.checkDefined(s(t.closingElement, r, GS))) }, 282: function (t, r, i, o, s, l) { return i.factory.updateJsxSelfClosingElement(t, L.checkDefined(s(t.tagName, r, bI)), o(t.typeArguments, r, bi), L.checkDefined(s(t.attributes, r, K0))) }, 283: function (t, r, i, o, s, l) { return i.factory.updateJsxOpeningElement(t, L.checkDefined(s(t.tagName, r, bI)), o(t.typeArguments, r, bi), L.checkDefined(s(t.attributes, r, K0))) }, 284: function (t, r, i, o, s, l) { return i.factory.updateJsxClosingElement(t, L.checkDefined(s(t.tagName, r, bI))) }, 285: function (t, r, i, o, s, l) { return i.factory.updateJsxFragment(t, L.checkDefined(s(t.openingFragment, r, US)), o(t.children, r, Pw), L.checkDefined(s(t.closingFragment, r, Hue))) }, 288: function (t, r, i, o, s, l) { return i.factory.updateJsxAttribute(t, L.checkDefined(s(t.name, r, Re)), s(t.initializer, r, Sse)) }, 289: function (t, r, i, o, s, l) { return i.factory.updateJsxAttributes(t, o(t.properties, r, d6)) }, 290: function (t, r, i, o, s, l) { return i.factory.updateJsxSpreadAttribute(t, L.checkDefined(s(t.expression, r, ot))) }, 291: function (t, r, i, o, s, l) { return i.factory.updateJsxExpression(t, s(t.expression, r, ot)) }, 292: function (t, r, i, o, s, l) { return i.factory.updateCaseClause(t, L.checkDefined(s(t.expression, r, ot)), o(t.statements, r, ca)) }, 293: function (t, r, i, o, s, l) { return i.factory.updateDefaultClause(t, o(t.statements, r, ca)) }, 294: function (t, r, i, o, s, l) { return i.factory.updateHeritageClause(t, o(t.types, r, Vg)) }, 295: function (t, r, i, o, s, l) { return i.factory.updateCatchClause(t, s(t.variableDeclaration, r, wi), L.checkDefined(s(t.block, r, Va))) }, 299: function (t, r, i, o, s, l) { return i.factory.updatePropertyAssignment(t, L.checkDefined(s(t.name, r, Ys)), L.checkDefined(s(t.initializer, r, ot))) }, 300: function (t, r, i, o, s, l) { return i.factory.updateShorthandPropertyAssignment(t, L.checkDefined(s(t.name, r, Re)), s(t.objectAssignmentInitializer, r, ot)) }, 301: function (t, r, i, o, s, l) { return i.factory.updateSpreadAssignment(t, L.checkDefined(s(t.expression, r, ot))) }, 302: function (t, r, i, o, s, l) { return i.factory.updateEnumMember(t, L.checkDefined(s(t.name, r, Ys)), s(t.initializer, r, ot)) }, 308: function (t, r, i, o, s, l) { return i.factory.updateSourceFile(t, mF(t.statements, r, i)) }, 356: function (t, r, i, o, s, l) { return i.factory.updatePartiallyEmittedExpression(t, L.checkDefined(s(t.expression, r, ot))) }, 357: function (t, r, i, o, s, l) { return i.factory.updateCommaListExpression(t, o(t.elements, r, ot)) } } } }); function M_e(e, t, r, i, o) { var { enter: s, exit: l } = o.extendedDiagnostics ? x8("Source Map", "beforeSourcemap", "afterSourcemap") : A8, f = [], d = [], g = new Map, m, v = [], S, x = [], A = "", w = 0, C = 0, P = 0, F = 0, B = 0, q = 0, W = !1, Y = 0, R = 0, ie = 0, $ = 0, fe = 0, Z = 0, U = !1, re = !1, le = !1; return { getSources: () => f, addSource: _e, setSourceContent: ge, addName: X, addMapping: ke, appendSourceMap: Pe, toJSON: Le, toString: () => JSON.stringify(Le()) }; function _e(_t) { s(); let ct = Q1(i, _t, e.getCurrentDirectory(), e.getCanonicalFileName, !0), Rt = g.get(ct); return Rt === void 0 && (Rt = d.length, d.push(ct), f.push(_t), g.set(ct, Rt)), l(), Rt } function ge(_t, ct) { if (s(), ct !== null) { for (m || (m = []); m.length < _t;)m.push(null); m[_t] = ct } l() } function X(_t) { s(), S || (S = new Map); let ct = S.get(_t); return ct === void 0 && (ct = v.length, v.push(_t), S.set(_t, ct)), l(), ct } function Ve(_t, ct) { return !U || Y !== _t || R !== ct } function we(_t, ct, Rt) { return _t !== void 0 && ct !== void 0 && Rt !== void 0 && ie === _t && ($ > ct || $ === ct && fe > Rt) } function ke(_t, ct, Rt, We, qe, zt) { L.assert(_t >= Y, "generatedLine cannot backtrack"), L.assert(ct >= 0, "generatedCharacter cannot be negative"), L.assert(Rt === void 0 || Rt >= 0, "sourceIndex cannot be negative"), L.assert(We === void 0 || We >= 0, "sourceLine cannot be negative"), L.assert(qe === void 0 || qe >= 0, "sourceCharacter cannot be negative"), s(), (Ve(_t, ct) || we(Rt, We, qe)) && (Be(), Y = _t, R = ct, re = !1, le = !1, U = !0), Rt !== void 0 && We !== void 0 && qe !== void 0 && (ie = Rt, $ = We, fe = qe, re = !0, zt !== void 0 && (Z = zt, le = !0)), l() } function Pe(_t, ct, Rt, We, qe, zt) { L.assert(_t >= Y, "generatedLine cannot backtrack"), L.assert(ct >= 0, "generatedCharacter cannot be negative"), s(); let Qt = [], tn, kn = EK(Rt.mappings); for (let _n of kn) { if (zt && (_n.generatedLine > zt.line || _n.generatedLine === zt.line && _n.generatedCharacter > zt.character)) break; if (qe && (_n.generatedLine < qe.line || qe.line === _n.generatedLine && _n.generatedCharacter < qe.character)) continue; let Gt, $n, ui, Ni; if (_n.sourceIndex !== void 0) { if (Gt = Qt[_n.sourceIndex], Gt === void 0) { let Dt = Rt.sources[_n.sourceIndex], pn = Rt.sourceRoot ? vi(Rt.sourceRoot, Dt) : Dt, An = vi(ni(We), pn); Qt[_n.sourceIndex] = Gt = _e(An), Rt.sourcesContent && typeof Rt.sourcesContent[_n.sourceIndex] == "string" && ge(Gt, Rt.sourcesContent[_n.sourceIndex]) } $n = _n.sourceLine, ui = _n.sourceCharacter, Rt.names && _n.nameIndex !== void 0 && (tn || (tn = []), Ni = tn[_n.nameIndex], Ni === void 0 && (tn[_n.nameIndex] = Ni = X(Rt.names[_n.nameIndex]))) } let Pi = _n.generatedLine - (qe ? qe.line : 0), gr = Pi + _t, pt = qe && qe.line === _n.generatedLine ? _n.generatedCharacter - qe.character : _n.generatedCharacter, nn = Pi === 0 ? pt + ct : pt; ke(gr, nn, Gt, $n, ui, Ni) } l() } function Ce() { return !W || w !== Y || C !== R || P !== ie || F !== $ || B !== fe || q !== Z } function Ie(_t) { x.push(_t), x.length >= 1024 && Ne() } function Be() { if (!(!U || !Ce())) { if (s(), w < Y) { do Ie(59), w++; while (w < Y); C = 0 } else L.assertEqual(w, Y, "generatedLine cannot backtrack"), W && Ie(44); Ye(R - C), C = R, re && (Ye(ie - P), P = ie, Ye($ - F), F = $, Ye(fe - B), B = fe, le && (Ye(Z - q), q = Z)), W = !0, l() } } function Ne() { x.length > 0 && (A += String.fromCharCode.apply(void 0, x), x.length = 0) } function Le() { return Be(), Ne(), { version: 3, file: t, sourceRoot: r, sources: d, names: v, mappings: A, sourcesContent: m } } function Ye(_t) { _t < 0 ? _t = (-_t << 1) + 1 : _t = _t << 1; do { let ct = _t & 31; _t = _t >> 5, _t > 0 && (ct = ct | 32), Ie(CPe(ct)) } while (_t > 0) } } function F_e(e, t) { return { getLineCount: () => t.length, getLineText: r => e.substring(t[r], t[r + 1]) } } function G_e(e) { for (let t = e.getLineCount() - 1; t >= 0; t--) { let r = e.getLineText(t), i = hF.exec(r); if (i) return $D(i[1]); if (!r.match(gF)) break } } function xPe(e) { return typeof e == "string" || e === null } function B_e(e) { return e !== null && typeof e == "object" && e.version === 3 && typeof e.file == "string" && typeof e.mappings == "string" && ba(e.sources) && Ji(e.sources, Ta) && (e.sourceRoot === void 0 || e.sourceRoot === null || typeof e.sourceRoot == "string") && (e.sourcesContent === void 0 || e.sourcesContent === null || ba(e.sourcesContent) && Ji(e.sourcesContent, xPe)) && (e.names === void 0 || e.names === null || ba(e.names) && Ji(e.names, Ta)) } function bK(e) { try { let t = JSON.parse(e); if (B_e(t)) return t } catch { } } function EK(e) { let t = !1, r = 0, i = 0, o = 0, s = 0, l = 0, f = 0, d = 0, g; return { get pos() { return r }, get error() { return g }, get state() { return m(!0, !0) }, next() { for (; !t && r < e.length;) { let P = e.charCodeAt(r); if (P === 59) { i++, o = 0, r++; continue } if (P === 44) { r++; continue } let F = !1, B = !1; if (o += C(), A()) return v(); if (o < 0) return x("Invalid generatedCharacter found"); if (!w()) { if (F = !0, s += C(), A()) return v(); if (s < 0) return x("Invalid sourceIndex found"); if (w()) return x("Unsupported Format: No entries after sourceIndex"); if (l += C(), A()) return v(); if (l < 0) return x("Invalid sourceLine found"); if (w()) return x("Unsupported Format: No entries after sourceLine"); if (f += C(), A()) return v(); if (f < 0) return x("Invalid sourceCharacter found"); if (!w()) { if (B = !0, d += C(), A()) return v(); if (d < 0) return x("Invalid nameIndex found"); if (!w()) return x("Unsupported Error Format: Entries after nameIndex") } } return { value: m(F, B), done: t } } return v() }, [Symbol.iterator]() { return this } }; function m(P, F) { return { generatedLine: i, generatedCharacter: o, sourceIndex: P ? s : void 0, sourceLine: P ? l : void 0, sourceCharacter: P ? f : void 0, nameIndex: F ? d : void 0 } } function v() { return t = !0, { value: void 0, done: !0 } } function S(P) { g === void 0 && (g = P) } function x(P) { return S(P), v() } function A() { return g !== void 0 } function w() { return r === e.length || e.charCodeAt(r) === 44 || e.charCodeAt(r) === 59 } function C() { let P = !0, F = 0, B = 0; for (; P; r++) { if (r >= e.length) return S("Error in decoding base64VLQFormatDecode, past the mapping string"), -1; let q = IPe(e.charCodeAt(r)); if (q === -1) return S("Invalid character in VLQ"), -1; P = (q & 32) !== 0, B = B | (q & 31) << F, F += 5 } return B & 1 ? (B = B >> 1, B = -B) : B = B >> 1, B } } function APe(e, t) { return e === t || e.generatedLine === t.generatedLine && e.generatedCharacter === t.generatedCharacter && e.sourceIndex === t.sourceIndex && e.sourceLine === t.sourceLine && e.sourceCharacter === t.sourceCharacter && e.nameIndex === t.nameIndex } function U_e(e) { return e.sourceIndex !== void 0 && e.sourceLine !== void 0 && e.sourceCharacter !== void 0 } function CPe(e) { return e >= 0 && e < 26 ? 65 + e : e >= 26 && e < 52 ? 97 + e - 26 : e >= 52 && e < 62 ? 48 + e - 52 : e === 62 ? 43 : e === 63 ? 47 : L.fail(`${e}: not a base64 value`) } function IPe(e) { return e >= 65 && e <= 90 ? e - 65 : e >= 97 && e <= 122 ? e - 97 + 26 : e >= 48 && e <= 57 ? e - 48 + 52 : e === 43 ? 62 : e === 47 ? 63 : -1 } function V_e(e) { return e.sourceIndex !== void 0 && e.sourcePosition !== void 0 } function j_e(e, t) { return e.generatedPosition === t.generatedPosition && e.sourceIndex === t.sourceIndex && e.sourcePosition === t.sourcePosition } function LPe(e, t) { return L.assert(e.sourceIndex === t.sourceIndex), Es(e.sourcePosition, t.sourcePosition) } function kPe(e, t) { return Es(e.generatedPosition, t.generatedPosition) } function DPe(e) { return e.sourcePosition } function wPe(e) { return e.generatedPosition } function H_e(e, t, r) { let i = ni(r), o = t.sourceRoot ? _a(t.sourceRoot, i) : i, s = _a(t.file, i), l = e.getSourceFileLike(s), f = t.sources.map(F => _a(F, o)), d = new Map(f.map((F, B) => [e.getCanonicalFileName(F), B])), g, m, v; return { getSourcePosition: P, getGeneratedPosition: C }; function S(F) { let B = l !== void 0 ? gw(l, F.generatedLine, F.generatedCharacter, !0) : -1, q, W; if (U_e(F)) { let Y = e.getSourceFileLike(f[F.sourceIndex]); q = t.sources[F.sourceIndex], W = Y !== void 0 ? gw(Y, F.sourceLine, F.sourceCharacter, !0) : -1 } return { generatedPosition: B, source: q, sourceIndex: F.sourceIndex, sourcePosition: W, nameIndex: F.nameIndex } } function x() { if (g === void 0) { let F = EK(t.mappings), B = lo(F, S); F.error !== void 0 ? (e.log && e.log(`Encountered error while decoding sourcemap: ${F.error}`), g = Je) : g = B } return g } function A(F) { if (v === void 0) { let B = []; for (let q of x()) { if (!V_e(q)) continue; let W = B[q.sourceIndex]; W || (B[q.sourceIndex] = W = []), W.push(q) } v = B.map(q => HD(q, LPe, j_e)) } return v[F] } function w() { if (m === void 0) { let F = []; for (let B of x()) F.push(B); m = HD(F, kPe, j_e) } return m } function C(F) { let B = d.get(e.getCanonicalFileName(F.fileName)); if (B === void 0) return F; let q = A(B); if (!vt(q)) return F; let W = j1(q, F.pos, DPe, Es); W < 0 && (W = ~W); let Y = q[W]; return Y === void 0 || Y.sourceIndex !== B ? F : { fileName: s, pos: Y.generatedPosition } } function P(F) { let B = w(); if (!vt(B)) return F; let q = j1(B, F.pos, wPe, Es); q < 0 && (q = ~q); let W = B[q]; return W === void 0 || !V_e(W) ? F : { fileName: f[W.sourceIndex], pos: W.sourcePosition } } } var TK, hF, gF, yF, RPe = gt({ "src/compiler/sourcemap.ts"() { "use strict"; fa(), E0(), TK = /\/\/[@#] source[M]appingURL=(.+)\r?\n?$/, hF = /^\/\/[@#] source[M]appingURL=(.+)\r?\n?$/, gF = /^\s*(\/\/[@#] .*)?$/, yF = { getSourcePosition: Ks, getGeneratedPosition: Ks } } }); function sc(e) { return e = ec(e), e ? zo(e) : 0 } function OPe(e) { return !e || !jg(e) ? !1 : vt(e.elements, W_e) } function W_e(e) { return e.propertyName !== void 0 && e.propertyName.escapedText === "default" } function y_(e, t) { return r; function r(o) { return o.kind === 308 ? t(o) : i(o) } function i(o) { return e.factory.createBundle(on(o.sourceFiles, t), o.prepends) } } function z_e(e) { return !!VA(e) } function vF(e) { if (VA(e)) return !0; let t = e.importClause && e.importClause.namedBindings; if (!t || !jg(t)) return !1; let r = 0; for (let i of t.elements) W_e(i) && r++; return r > 0 && r !== t.elements.length || !!(t.elements.length - r) && lS(e) } function SK(e) { return !vF(e) && (lS(e) || !!e.importClause && jg(e.importClause.namedBindings) && OPe(e.importClause.namedBindings)) } function xK(e, t, r, i) { let o = [], s = Nf(), l = [], f = new Map, d, g = !1, m, v = !1, S = !1, x = !1; for (let C of t.statements) switch (C.kind) { case 269: o.push(C), !S && vF(C) && (S = !0), !x && SK(C) && (x = !0); break; case 268: C.moduleReference.kind === 280 && o.push(C); break; case 275: if (C.moduleSpecifier) if (!C.exportClause) o.push(C), v = !0; else if (o.push(C), h_(C.exportClause)) w(C); else { let P = C.exportClause.name; f.get(vr(P)) || (HL(l, sc(C), P), f.set(vr(P), !0), d = Sn(d, P)), S = !0 } else w(C); break; case 274: C.isExportEquals && !m && (m = C); break; case 240: if (Mr(C, 1)) for (let P of C.declarationList.declarations) d = J_e(P, f, d); break; case 259: if (Mr(C, 1)) if (Mr(C, 1024)) g || (HL(l, sc(C), e.factory.getDeclarationName(C)), g = !0); else { let P = C.name; f.get(vr(P)) || (HL(l, sc(C), P), f.set(vr(P), !0), d = Sn(d, P)) } break; case 260: if (Mr(C, 1)) if (Mr(C, 1024)) g || (HL(l, sc(C), e.factory.getDeclarationName(C)), g = !0); else { let P = C.name; P && !f.get(vr(P)) && (HL(l, sc(C), P), f.set(vr(P), !0), d = Sn(d, P)) } break }let A = nJ(e.factory, e.getEmitHelperFactory(), t, i, v, S, x); return A && o.unshift(A), { externalImports: o, exportSpecifiers: s, exportEquals: m, hasExportStarsToExportValues: v, exportedBindings: l, exportedNames: d, externalHelpersImportDeclaration: A }; function w(C) { for (let P of Ga(C.exportClause, h_).elements) if (!f.get(vr(P.name))) { let F = P.propertyName || P.name; C.moduleSpecifier || s.add(vr(F), P); let B = r.getReferencedImportDeclaration(F) || r.getReferencedValueDeclaration(F); B && HL(l, sc(B), P.name), f.set(vr(P.name), !0), d = Sn(d, P.name) } } } function J_e(e, t, r) { if (La(e.name)) for (let i of e.name.elements) ol(i) || (r = J_e(i, t, r)); else if (!tc(e.name)) { let i = vr(e.name); t.get(i) || (t.set(i, !0), r = Sn(r, e.name)) } return r } function HL(e, t, r) { let i = e[t]; return i ? i.push(r) : e[t] = i = [r], i } function Z0(e) { return es(e) || e.kind === 8 || Xu(e.kind) || Re(e) } function Ap(e) { return !Re(e) && Z0(e) } function oN(e) { return e >= 64 && e <= 78 } function WL(e) { switch (e) { case 64: return 39; case 65: return 40; case 66: return 41; case 67: return 42; case 68: return 43; case 69: return 44; case 70: return 47; case 71: return 48; case 72: return 49; case 73: return 50; case 74: return 51; case 78: return 52; case 75: return 56; case 76: return 55; case 77: return 60 } } function AK(e) { if (!Ol(e)) return; let t = vs(e.expression); return OA(t) ? t : void 0 } function bF(e, t) { for (let r = t; r < e.length; r += 1) { let i = e[r]; if (AK(i)) return r } return -1 } function CK(e, t, r) { return Pr(e.members, i => PPe(i, t, r)) } function NPe(e) { return MPe(e) || oc(e) } function EF(e) { return Pr(e.members, NPe) } function PPe(e, t, r) { return Na(e) && (!!e.initializer || !t) && zc(e) === r } function MPe(e) { return Na(e) && zc(e) } function sN(e) { return e.kind === 169 && e.initializer !== void 0 } function K_e(e) { return !Ca(e) && (xA(e) || Id(e)) && pi(e.name) } function IK(e) { let t; if (e) { let r = e.parameters, i = r.length > 0 && G0(r[0]), o = i ? 1 : 0, s = i ? r.length - 1 : r.length; for (let l = 0; l < s; l++) { let f = r[l + o]; (t || bf(f)) && (t || (t = new Array(s)), t[l] = Uy(f)) } } return t } function LK(e) { let t = Uy(e), r = IK(Vm(e)); if (!(!vt(t) && !vt(r))) return { decorators: t, parameters: r } } function TF(e, t, r) { switch (e.kind) { case 174: case 175: return r ? FPe(e, t) : q_e(e); case 171: return q_e(e); case 169: return GPe(e); default: return } } function FPe(e, t) { if (!e.body) return; let { firstAccessor: r, secondAccessor: i, getAccessor: o, setAccessor: s } = kT(t.members, e), l = bf(r) ? r : i && bf(i) ? i : void 0; if (!l || e !== l) return; let f = Uy(l), d = IK(s); if (!(!vt(f) && !vt(d))) return { decorators: f, parameters: d, getDecorators: o && Uy(o), setDecorators: s && Uy(s) } } function q_e(e) { if (!e.body) return; let t = Uy(e), r = IK(e); if (!(!vt(t) && !vt(r))) return { decorators: t, parameters: r } } function GPe(e) { let t = Uy(e); if (vt(t)) return { decorators: t } } function X_e(e, t) { for (; e;) { let r = t(e); if (r !== void 0) return r; e = e.previous } } function Y_e(e) { return { data: e } } function kK(e, t) { var r, i; return tS(t) ? (r = e?.generatedIdentifiers) == null ? void 0 : r.get(I3(t)) : (i = e?.identifiers) == null ? void 0 : i.get(t.escapedText) } function JT(e, t, r) { var i, o; tS(t) ? ((i = e.generatedIdentifiers) != null || (e.generatedIdentifiers = new Map), e.generatedIdentifiers.set(I3(t), r)) : ((o = e.identifiers) != null || (e.identifiers = new Map), e.identifiers.set(t.escapedText, r)) } function $_e(e, t) { return X_e(e, r => kK(r.privateEnv, t)) } var BPe = gt({ "src/compiler/transformers/utilities.ts"() { "use strict"; fa() } }); function KT(e, t, r, i, o, s) { let l = e, f; if (Fg(e)) for (f = e.right; Zce(e.left) || dW(e.left);)if (Fg(f)) l = e = f, f = e.right; else return L.checkDefined($e(f, t, ot)); let d, g = { context: r, level: i, downlevelIteration: !!r.getCompilerOptions().downlevelIteration, hoistTempVariables: !0, emitExpression: m, emitBindingOrAssignment: v, createArrayBindingOrAssignmentPattern: S => KPe(r.factory, S), createObjectBindingOrAssignmentPattern: S => XPe(r.factory, S), createArrayBindingOrAssignmentElement: $Pe, visitor: t }; if (f && (f = $e(f, t, ot), L.assert(f), Re(f) && DK(e, f.escapedText) || wK(e) ? f = qT(g, f, !1, l) : o ? f = qT(g, f, !0, l) : ws(e) && (l = f)), M2(g, e, f, l, Fg(e)), f && o) { if (!vt(d)) return f; d.push(f) } return r.factory.inlineExpressions(d) || r.factory.createOmittedExpression(); function m(S) { d = Sn(d, S) } function v(S, x, A, w) { L.assertNode(S, s ? Re : ot); let C = s ? s(S, x, A) : it(r.factory.createAssignment(L.checkDefined($e(S, t, ot)), x), A); C.original = w, m(C) } } function DK(e, t) { let r = iv(e); return kw(r) ? UPe(r, t) : Re(r) ? r.escapedText === t : !1 } function UPe(e, t) { let r = I2(e); for (let i of r) if (DK(i, t)) return !0; return !1 } function wK(e) { let t = A3(e); if (t && ts(t) && !fT(t.expression)) return !0; let r = iv(e); return !!r && kw(r) && VPe(r) } function VPe(e) { return !!mn(I2(e), wK) } function eE(e, t, r, i, o, s = !1, l) { let f, d = [], g = [], m = { context: r, level: i, downlevelIteration: !!r.getCompilerOptions().downlevelIteration, hoistTempVariables: s, emitExpression: v, emitBindingOrAssignment: S, createArrayBindingOrAssignmentPattern: x => JPe(r.factory, x), createObjectBindingOrAssignmentPattern: x => qPe(r.factory, x), createArrayBindingOrAssignmentElement: x => YPe(r.factory, x), visitor: t }; if (wi(e)) { let x = AO(e); x && (Re(x) && DK(e, x.escapedText) || wK(e)) && (x = qT(m, L.checkDefined($e(x, m.visitor, ot)), !1, x), e = r.factory.updateVariableDeclaration(e, e.name, void 0, void 0, x)) } if (M2(m, e, o, e, l), f) { let x = r.factory.createTempVariable(void 0); if (s) { let A = r.factory.inlineExpressions(f); f = void 0, S(x, A, void 0, void 0) } else { r.hoistVariableDeclaration(x); let A = To(d); A.pendingExpressions = Sn(A.pendingExpressions, r.factory.createAssignment(x, A.value)), si(A.pendingExpressions, f), A.value = x } } for (let { pendingExpressions: x, name: A, value: w, location: C, original: P } of d) { let F = r.factory.createVariableDeclaration(A, void 0, void 0, x ? r.factory.inlineExpressions(Sn(x, w)) : w); F.original = P, it(F, C), g.push(F) } return g; function v(x) { f = Sn(f, x) } function S(x, A, w, C) { L.assertNode(x, Mm), f && (A = r.factory.inlineExpressions(Sn(f, A)), f = void 0), d.push({ pendingExpressions: f, name: x, value: A, location: w, original: C }) } } function M2(e, t, r, i, o) { let s = iv(t); if (!o) { let l = $e(AO(t), e.visitor, ot); l ? r ? (r = WPe(e, r, l, i), !Ap(l) && kw(s) && (r = qT(e, r, !0, i))) : r = l : r || (r = e.context.factory.createVoidZero()) } Uj(s) ? jPe(e, t, s, r, i) : Vj(s) ? HPe(e, t, s, r, i) : e.emitBindingOrAssignment(s, r, i, t) } function jPe(e, t, r, i, o) { let s = I2(r), l = s.length; if (l !== 1) { let g = !Lw(t) || l !== 0; i = qT(e, i, g, o) } let f, d; for (let g = 0; g < l; g++) { let m = s[g]; if (x3(m)) { if (g === l - 1) { f && (e.emitBindingOrAssignment(e.createObjectBindingOrAssignmentPattern(f), i, o, r), f = void 0); let v = e.context.getEmitHelperFactory().createRestHelper(i, s, d, r); M2(e, m, v, m) } } else { let v = rJ(m); if (e.level >= 1 && !(m.transformFlags & 98304) && !(iv(m).transformFlags & 98304) && !ts(v)) f = Sn(f, $e(m, e.visitor, use)); else { f && (e.emitBindingOrAssignment(e.createObjectBindingOrAssignmentPattern(f), i, o, r), f = void 0); let S = zPe(e, i, v); ts(v) && (d = Sn(d, S.argumentExpression)), M2(e, m, S, m) } } } f && e.emitBindingOrAssignment(e.createObjectBindingOrAssignmentPattern(f), i, o, r) } function HPe(e, t, r, i, o) { let s = I2(r), l = s.length; if (e.level < 1 && e.downlevelIteration) i = qT(e, it(e.context.getEmitHelperFactory().createReadHelper(i, l > 0 && x3(s[l - 1]) ? void 0 : l), o), !1, o); else if (l !== 1 && (e.level < 1 || l === 0) || Ji(s, ol)) { let g = !Lw(t) || l !== 0; i = qT(e, i, g, o) } let f, d; for (let g = 0; g < l; g++) { let m = s[g]; if (e.level >= 1) if (m.transformFlags & 65536 || e.hasTransformedPriorElement && !Q_e(m)) { e.hasTransformedPriorElement = !0; let v = e.context.factory.createTempVariable(void 0); e.hoistTempVariables && e.context.hoistVariableDeclaration(v), d = Sn(d, [v, m]), f = Sn(f, e.createArrayBindingOrAssignmentElement(v)) } else f = Sn(f, m); else { if (ol(m)) continue; if (x3(m)) { if (g === l - 1) { let v = e.context.factory.createArraySliceCall(i, g); M2(e, m, v, m) } } else { let v = e.context.factory.createElementAccessExpression(i, g); M2(e, m, v, m) } } } if (f && e.emitBindingOrAssignment(e.createArrayBindingOrAssignmentPattern(f), i, o, r), d) for (let [g, m] of d) M2(e, m, g, m) } function Q_e(e) { let t = iv(e); if (!t || ol(t)) return !0; let r = A3(e); if (r && !c_(r)) return !1; let i = AO(e); return i && !Ap(i) ? !1 : kw(t) ? Ji(I2(t), Q_e) : Re(t) } function WPe(e, t, r, i) { return t = qT(e, t, !0, i), e.context.factory.createConditionalExpression(e.context.factory.createTypeCheck(t, "undefined"), void 0, r, void 0, t) } function zPe(e, t, r) { if (ts(r)) { let i = qT(e, L.checkDefined($e(r.expression, e.visitor, ot)), !1, r); return e.context.factory.createElementAccessExpression(t, i) } else if (yf(r)) { let i = D.cloneNode(r); return e.context.factory.createElementAccessExpression(t, i) } else { let i = e.context.factory.createIdentifier(vr(r)); return e.context.factory.createPropertyAccessExpression(t, i) } } function qT(e, t, r, i) { if (Re(t) && r) return t; { let o = e.context.factory.createTempVariable(void 0); return e.hoistTempVariables ? (e.context.hoistVariableDeclaration(o), e.emitExpression(it(e.context.factory.createAssignment(o, t), i))) : e.emitBindingOrAssignment(o, t, i, void 0), o } } function JPe(e, t) { return L.assertEachNode(t, c6), e.createArrayBindingPattern(t) } function KPe(e, t) { return L.assertEachNode(t, ww), e.createArrayLiteralExpression(on(t, e.converters.convertToArrayAssignmentElement)) } function qPe(e, t) { return L.assertEachNode(t, Wo), e.createObjectBindingPattern(t) } function XPe(e, t) { return L.assertEachNode(t, Dw), e.createObjectLiteralExpression(on(t, e.converters.convertToObjectAssignmentElement)) } function YPe(e, t) { return e.createBindingElement(void 0, void 0, t) } function $Pe(e) { return e } var RK, QPe = gt({ "src/compiler/transformers/destructuring.ts"() { "use strict"; fa(), RK = (e => (e[e.All = 0] = "All", e[e.ObjectRest = 1] = "ObjectRest", e))(RK || {}) } }); function OK(e, t, r, i, o, s) { let l = $e(t.tag, r, ot); L.assert(l); let f = [void 0], d = [], g = [], m = t.template; if (s === 0 && !KH(m)) return xn(t, r, e); if (IS(m)) d.push(NK(m)), g.push(PK(m, i)); else { d.push(NK(m.head)), g.push(PK(m.head, i)); for (let S of m.templateSpans) d.push(NK(S.literal)), g.push(PK(S.literal, i)), f.push(L.checkDefined($e(S.expression, r, ot))) } let v = e.getEmitHelperFactory().createTemplateObjectHelper(D.createArrayLiteralExpression(d), D.createArrayLiteralExpression(g)); if (Lc(i)) { let S = D.createUniqueName("templateObject"); o(S), f[0] = D.createLogicalOr(S, D.createAssignment(S, v)) } else f[0] = v; return D.createCallExpression(l, void 0, f) } function NK(e) { return e.templateFlags ? D.createVoidZero() : D.createStringLiteral(e.text) } function PK(e, t) {
+                let r = e.rawText; if (r === void 0) { L.assertIsDefined(t, "Template literal node is missing 'rawText' and does not have a source file. Possibly bad transform."), r = k0(t, e); let i = e.kind === 14 || e.kind === 17; r = r.substring(1, r.length - (i ? 1 : 2)) } return r = r.replace(/\r\n?/g, `
+`), it(D.createStringLiteral(r), e)
+            } var MK, ZPe = gt({ "src/compiler/transformers/taggedTemplate.ts"() { "use strict"; fa(), MK = (e => (e[e.LiftRestriction = 0] = "LiftRestriction", e[e.All = 1] = "All", e))(MK || {}) } }); function Z_e(e) { let { factory: t, getEmitHelperFactory: r, startLexicalEnvironment: i, resumeLexicalEnvironment: o, endLexicalEnvironment: s, hoistVariableDeclaration: l } = e, f = e.getEmitResolver(), d = e.getCompilerOptions(), g = Do(d), m = Rl(d), v = !!d.experimentalDecorators, S = d.emitDecoratorMetadata ? npe(e) : void 0, x = e.onEmitNode, A = e.onSubstituteNode; e.onEmitNode = bl, e.onSubstituteNode = ss, e.enableSubstitution(208), e.enableSubstitution(209); let w, C, P, F, B, q, W, Y; return R; function R(K) { return K.kind === 309 ? ie(K) : $(K) } function ie(K) { return t.createBundle(K.sourceFiles.map($), Zi(K.prepends, Xe => Xe.kind === 311 ? fz(Xe, "js") : Xe)) } function $(K) { if (K.isDeclarationFile) return K; w = K; let Xe = fe(K, Ye); return Bg(Xe, e.readEmitHelpers()), w = void 0, Xe } function fe(K, Xe) { let ft = F, Yt = B, pr = q; Z(K); let yr = Xe(K); return F !== ft && (B = Yt), F = ft, q = pr, yr } function Z(K) { switch (K.kind) { case 308: case 266: case 265: case 238: F = K, B = void 0; break; case 260: case 259: if (Mr(K, 2)) break; K.name ? Te(K) : L.assert(K.kind === 260 || Mr(K, 1024)); break } } function U(K) { return fe(K, re) } function re(K) { return K.transformFlags & 1 ? Le(K) : K } function le(K) { return fe(K, _e) } function _e(K) { switch (K.kind) { case 269: case 268: case 274: case 275: return ge(K); default: return re(K) } } function ge(K) { if (ea(K) !== K) return K.transformFlags & 1 ? xn(K, U, e) : K; switch (K.kind) { case 269: return jr(K); case 268: return Qr(K); case 274: return Ja(K); case 275: return Za(K); default: L.fail("Unhandled ellided statement") } } function X(K) { return fe(K, Ve) } function Ve(K) { if (!(K.kind === 275 || K.kind === 269 || K.kind === 270 || K.kind === 268 && K.moduleReference.kind === 280)) return K.transformFlags & 1 || Mr(K, 1) ? Le(K) : K } function we(K) { return Xe => fe(Xe, ft => ke(ft, K)) } function ke(K, Xe) { switch (K.kind) { case 173: return hi(K); case 169: return Kn(K, Xe); case 174: return dr(K, Xe); case 175: return Cr(K, Xe); case 171: return Ht(K, Xe); case 172: return xn(K, U, e); case 237: return K; case 178: return; default: return L.failBadSyntaxKind(K) } } function Pe(K) { return Xe => fe(Xe, ft => Ce(ft, K)) } function Ce(K, Xe) { switch (K.kind) { case 299: case 300: case 301: return U(K); case 174: return dr(K, Xe); case 175: return Cr(K, Xe); case 171: return Ht(K, Xe); default: return L.failBadSyntaxKind(K) } } function Ie(K) { return du(K) ? void 0 : U(K) } function Be(K) { return Ha(K) ? void 0 : U(K) } function Ne(K) { if (!du(K) && !(gS(K.kind) & 117086) && !(C && K.kind === 93)) return K } function Le(K) { if (ca(K) && Mr(K, 2)) return t.createNotEmittedStatement(K); switch (K.kind) { case 93: case 88: return C ? void 0 : K; case 123: case 121: case 122: case 126: case 161: case 85: case 136: case 146: case 101: case 145: case 185: case 186: case 187: case 188: case 184: case 179: case 165: case 131: case 157: case 134: case 152: case 148: case 144: case 114: case 153: case 182: case 181: case 183: case 180: case 189: case 190: case 191: case 193: case 194: case 195: case 196: case 197: case 198: case 178: return; case 262: return t.createNotEmittedStatement(K); case 267: return; case 261: return t.createNotEmittedStatement(K); case 260: return qe(K); case 228: return Qt(K); case 294: return Dt(K); case 230: return pn(K); case 207: return _t(K); case 173: case 169: case 171: case 174: case 175: case 172: return L.fail("Class and object literal elements must be visited with their respective visitors"); case 259: return Se(K); case 215: return at(K); case 216: return Tt(K); case 166: return ve(K); case 214: return ue(K); case 213: case 231: return G(K); case 235: return je(K); case 210: return Ge(K); case 211: return kt(K); case 212: return Kt(K); case 232: return Oe(K); case 263: return rt(K); case 240: return nt(K); case 257: return Q(K); case 264: return Qe(K); case 268: return Qr(K); case 282: return ln(K); case 283: return ir(K); default: return xn(K, U, e) } } function Ye(K) { let Xe = Uf(d, "alwaysStrict") && !(Lc(K) && m >= 5) && !Mf(K); return t.updateSourceFile(K, mF(K.statements, le, e, 0, Xe)) } function _t(K) { return t.updateObjectLiteralExpression(K, On(K.properties, Pe(K), Og)) } function ct(K) { let Xe = 0; vt(CK(K, !0, !0)) && (Xe |= 1); let ft = hp(K); return ft && ql(ft.expression).kind !== 104 && (Xe |= 64), O0(v, K) && (Xe |= 2), kI(v, K) && (Xe |= 4), Wi(K) ? Xe |= 8 : kc(K) ? Xe |= 32 : Ki(K) && (Xe |= 16), Xe } function Rt(K) { return !!(K.transformFlags & 8192) } function We(K) { return bf(K) || vt(K.typeParameters) || vt(K.heritageClauses, Rt) || vt(K.members, Rt) } function qe(K) { var Xe; let ft = ct(K), Yt = g <= 1 && !!(ft & 7); if (!We(K) && !O0(v, K) && !Wi(K)) return t.updateClassDeclaration(K, On(K.modifiers, Ne, Ha), K.name, void 0, On(K.heritageClauses, U, dd), On(K.members, we(K), _l)); Yt && e.startLexicalEnvironment(); let pr = Yt || ft & 8 || ft & 2 && v || ft & 1, yr = pr ? On(K.modifiers, Be, Ns) : On(K.modifiers, U, Ns); ft & 2 && (yr = kn(yr, K)); let Go = pr && !K.name || ft & 4 || ft & 1 ? (Xe = K.name) != null ? Xe : t.getGeneratedNameForNode(K) : K.name, Ka = t.updateClassDeclaration(K, yr, Go, void 0, On(K.heritageClauses, U, dd), tn(K)), vo = Ya(K); ft & 1 && (vo |= 64), Jn(Ka, vo); let ka; if (Yt) { let Hs = [Ka], Uc = _W(xo(w.text, K.members.end), 19), Gu = t.getInternalName(K), $o = t.createPartiallyEmittedExpression(Gu); r2($o, Uc.end), Jn($o, 3072); let jo = t.createReturnStatement($o); aL(jo, Uc.pos), Jn(jo, 3840), Hs.push(jo), em(Hs, e.endLexicalEnvironment()); let Ws = t.createImmediatelyInvokedArrowFunction(Hs); eO(Ws, 1); let hd = ft & 16 ? t.createModifiersFromModifierFlags(1) : void 0, vc = t.createVariableStatement(hd, t.createVariableDeclarationList([t.createVariableDeclaration(t.getLocalName(K, !1, !1), void 0, void 0, Ws)], 1)); Ir(vc, K), hl(vc, K), Ho(vc, $y(K)), mu(vc), ka = vc } else ka = Ka; if (pr) { if (ft & 8) return zt(ka, Ps(K)); if (ft & 32) return zt(ka, t.createExportDefault(t.getLocalName(K, !1, !0))); if (ft & 16 && !Yt) return zt(ka, t.createExternalModuleExport(t.getLocalName(K, !1, !0))) } return ka } function zt(K, Xe) { return bp(K, 8388608), [K, Xe, t.createEndOfDeclarationMarker(K)] } function Qt(K) { let Xe = On(K.modifiers, Be, Ns); return O0(v, K) && (Xe = kn(Xe, K)), t.updateClassExpression(K, Xe, K.name, void 0, On(K.heritageClauses, U, dd), tn(K)) } function tn(K) { let Xe = On(K.members, we(K), _l), ft, Yt = Vm(K), pr = Yt && Pr(Yt.parameters, yr => Ad(yr, Yt)); if (pr) for (let yr of pr) { let ta = t.createPropertyDeclaration(void 0, yr.name, void 0, void 0, void 0); Ir(ta, yr), ft = Sn(ft, ta) } return ft ? (ft = si(ft, Xe), it(t.createNodeArray(ft), K.members)) : Xe } function kn(K, Xe) { let ft = Gt(Xe, Xe); if (vt(ft)) { let Yt = []; si(Yt, v8(K, oJ)), si(Yt, Pr(K, du)), si(Yt, ft), si(Yt, Pr(Nae(K, oJ), Ha)), K = it(t.createNodeArray(Yt), K) } return K } function _n(K, Xe, ft) { if (Yr(ft) && AH(v, Xe, ft)) { let Yt = Gt(Xe, ft); if (vt(Yt)) { let pr = []; si(pr, Pr(K, du)), si(pr, Yt), si(pr, Pr(K, Ha)), K = it(t.createNodeArray(pr), K) } } return K } function Gt(K, Xe) { if (v) return epe ? ui(K, Xe) : $n(K, Xe) } function $n(K, Xe) { if (S) { let ft; if (Ni(K)) { let Yt = r().createMetadataHelper("design:type", S.serializeTypeOfNode({ currentLexicalScope: F, currentNameScope: Xe }, K)); ft = Sn(ft, t.createDecorator(Yt)) } if (gr(K)) { let Yt = r().createMetadataHelper("design:paramtypes", S.serializeParameterTypesOfNode({ currentLexicalScope: F, currentNameScope: Xe }, K, Xe)); ft = Sn(ft, t.createDecorator(Yt)) } if (Pi(K)) { let Yt = r().createMetadataHelper("design:returntype", S.serializeReturnTypeOfNode({ currentLexicalScope: F, currentNameScope: Xe }, K)); ft = Sn(ft, t.createDecorator(Yt)) } return ft } } function ui(K, Xe) { if (S) { let ft; if (Ni(K)) { let Yt = t.createPropertyAssignment("type", t.createArrowFunction(void 0, void 0, [], void 0, t.createToken(38), S.serializeTypeOfNode({ currentLexicalScope: F, currentNameScope: Xe }, K))); ft = Sn(ft, Yt) } if (gr(K)) { let Yt = t.createPropertyAssignment("paramTypes", t.createArrowFunction(void 0, void 0, [], void 0, t.createToken(38), S.serializeParameterTypesOfNode({ currentLexicalScope: F, currentNameScope: Xe }, K, Xe))); ft = Sn(ft, Yt) } if (Pi(K)) { let Yt = t.createPropertyAssignment("returnType", t.createArrowFunction(void 0, void 0, [], void 0, t.createToken(38), S.serializeReturnTypeOfNode({ currentLexicalScope: F, currentNameScope: Xe }, K))); ft = Sn(ft, Yt) } if (ft) { let Yt = r().createMetadataHelper("design:typeinfo", t.createObjectLiteralExpression(ft, !0)); return [t.createDecorator(Yt)] } } } function Ni(K) { let Xe = K.kind; return Xe === 171 || Xe === 174 || Xe === 175 || Xe === 169 } function Pi(K) { return K.kind === 171 } function gr(K) { switch (K.kind) { case 260: case 228: return Vm(K) !== void 0; case 171: case 174: case 175: return !0 }return !1 } function pt(K, Xe) { let ft = K.name; return pi(ft) ? t.createIdentifier("") : ts(ft) ? Xe && !Ap(ft.expression) ? t.getGeneratedNameForNode(ft) : ft.expression : Re(ft) ? t.createStringLiteral(vr(ft)) : t.cloneNode(ft) } function nn(K) { let Xe = K.name; if (ts(Xe) && (!zc(K) && q || bf(K) && v)) { let ft = $e(Xe.expression, U, ot); L.assert(ft); let Yt = a_(ft); if (!Ap(Yt)) { let pr = t.getGeneratedNameForNode(Xe); return l(pr), t.updateComputedPropertyName(Xe, t.createAssignment(pr, ft)) } } return L.checkDefined($e(Xe, U, Ys)) } function Dt(K) { if (K.token !== 117) return xn(K, U, e) } function pn(K) { return t.updateExpressionWithTypeArguments(K, L.checkDefined($e(K.expression, U, Ju)), void 0) } function An(K) { return !rc(K.body) } function Kn(K, Xe) { let ft = K.flags & 16777216 || Mr(K, 256); if (ft && !(v && bf(K))) return; let Yt = Yr(Xe) ? ft ? On(K.modifiers, Be, Ns) : On(K.modifiers, U, Ns) : On(K.modifiers, Ie, Ns); return Yt = _n(Yt, K, Xe), ft ? t.updatePropertyDeclaration(K, Qi(Yt, t.createModifiersFromModifierFlags(2)), L.checkDefined($e(K.name, U, Ys)), void 0, void 0, void 0) : t.updatePropertyDeclaration(K, Yt, nn(K), void 0, void 0, $e(K.initializer, U, ot)) } function hi(K) { if (An(K)) return t.updateConstructorDeclaration(K, void 0, Sc(K.parameters, U, e), ri(K.body, K)) } function ri(K, Xe) { let ft = Xe && Pr(Xe.parameters, vo => Ad(vo, Xe)); if (!vt(ft)) return Zd(K, U, e); let Yt = []; o(); let pr = t.copyPrologue(K.statements, Yt, !1, U), yr = bF(K.statements, pr); yr >= 0 && si(Yt, On(K.statements, U, ca, pr, yr + 1 - pr)); let ta = Zi(ft, vn); yr >= 0 ? si(Yt, ta) : Yt = [...Yt.slice(0, pr), ...ta, ...Yt.slice(pr)]; let Go = yr >= 0 ? yr + 1 : pr; si(Yt, On(K.statements, U, ca, Go)), Yt = t.mergeLexicalEnvironment(Yt, s()); let Ka = t.createBlock(it(t.createNodeArray(Yt), K.statements), !0); return it(Ka, K), Ir(Ka, K), Ka } function vn(K) { let Xe = K.name; if (!Re(Xe)) return; let ft = go(it(t.cloneNode(Xe), Xe), Xe.parent); Jn(ft, 3168); let Yt = go(it(t.cloneNode(Xe), Xe), Xe.parent); return Jn(Yt, 3072), mu(ZR(it(Ir(t.createExpressionStatement(t.createAssignment(it(t.createPropertyAccessExpression(t.createThis(), ft), K.name), Yt)), K), fb(K, -1)))) } function Ht(K, Xe) { if (!(K.transformFlags & 1)) return K; if (!An(K)) return; let ft = Yr(Xe) ? On(K.modifiers, U, Ns) : On(K.modifiers, Ie, Ns); return ft = _n(ft, K, Xe), t.updateMethodDeclaration(K, ft, K.asteriskToken, nn(K), void 0, void 0, Sc(K.parameters, U, e), void 0, Zd(K.body, U, e)) } function En(K) { return !(rc(K.body) && Mr(K, 256)) } function dr(K, Xe) { if (!(K.transformFlags & 1)) return K; if (!En(K)) return; let ft = Yr(Xe) ? On(K.modifiers, U, Ns) : On(K.modifiers, Ie, Ns); return ft = _n(ft, K, Xe), t.updateGetAccessorDeclaration(K, ft, nn(K), Sc(K.parameters, U, e), void 0, Zd(K.body, U, e) || t.createBlock([])) } function Cr(K, Xe) { if (!(K.transformFlags & 1)) return K; if (!En(K)) return; let ft = Yr(Xe) ? On(K.modifiers, U, Ns) : On(K.modifiers, Ie, Ns); return ft = _n(ft, K, Xe), t.updateSetAccessorDeclaration(K, ft, nn(K), Sc(K.parameters, U, e), Zd(K.body, U, e) || t.createBlock([])) } function Se(K) { if (!An(K)) return t.createNotEmittedStatement(K); let Xe = t.updateFunctionDeclaration(K, On(K.modifiers, Ne, Ha), K.asteriskToken, K.name, void 0, Sc(K.parameters, U, e), void 0, Zd(K.body, U, e) || t.createBlock([])); if (Wi(K)) { let ft = [Xe]; return mc(ft, K), ft } return Xe } function at(K) { return An(K) ? t.updateFunctionExpression(K, On(K.modifiers, Ne, Ha), K.asteriskToken, K.name, void 0, Sc(K.parameters, U, e), void 0, Zd(K.body, U, e) || t.createBlock([])) : t.createOmittedExpression() } function Tt(K) { return t.updateArrowFunction(K, On(K.modifiers, Ne, Ha), void 0, Sc(K.parameters, U, e), void 0, K.equalsGreaterThanToken, Zd(K.body, U, e)) } function ve(K) { if (G0(K)) return; let Xe = t.updateParameterDeclaration(K, On(K.modifiers, ft => du(ft) ? U(ft) : void 0, Ns), K.dotDotDotToken, L.checkDefined($e(K.name, U, Mm)), void 0, void 0, $e(K.initializer, U, ot)); return Xe !== K && (hl(Xe, K), it(Xe, yp(K)), Ho(Xe, yp(K)), Jn(Xe.name, 64)), Xe } function nt(K) { if (Wi(K)) { let Xe = qI(K.declarationList); return Xe.length === 0 ? void 0 : it(t.createExpressionStatement(t.inlineExpressions(on(Xe, ce))), K) } else return xn(K, U, e) } function ce(K) { let Xe = K.name; return La(Xe) ? KT(K, U, e, 0, !1, hc) : it(t.createAssignment(ro(Xe), L.checkDefined($e(K.initializer, U, ot))), K) } function Q(K) { let Xe = t.updateVariableDeclaration(K, L.checkDefined($e(K.name, U, Mm)), void 0, void 0, $e(K.initializer, U, ot)); return K.type && yue(Xe.name, K.type), Xe } function ue(K) { let Xe = ql(K.expression, -7); if (pT(Xe)) { let ft = $e(K.expression, U, ot); return L.assert(ft), t.createPartiallyEmittedExpression(ft, K) } return xn(K, U, e) } function G(K) { let Xe = $e(K.expression, U, ot); return L.assert(Xe), t.createPartiallyEmittedExpression(Xe, K) } function Oe(K) { let Xe = $e(K.expression, U, Ju); return L.assert(Xe), t.createPartiallyEmittedExpression(Xe, K) } function je(K) { let Xe = $e(K.expression, U, ot); return L.assert(Xe), t.createPartiallyEmittedExpression(Xe, K) } function Ge(K) { return t.updateCallExpression(K, L.checkDefined($e(K.expression, U, ot)), void 0, On(K.arguments, U, ot)) } function kt(K) { return t.updateNewExpression(K, L.checkDefined($e(K.expression, U, ot)), void 0, On(K.arguments, U, ot)) } function Kt(K) { return t.updateTaggedTemplateExpression(K, L.checkDefined($e(K.tag, U, ot)), void 0, L.checkDefined($e(K.template, U, AA))) } function ln(K) { return t.updateJsxSelfClosingElement(K, L.checkDefined($e(K.tagName, U, bI)), void 0, L.checkDefined($e(K.attributes, U, K0))) } function ir(K) { return t.updateJsxOpeningElement(K, L.checkDefined($e(K.tagName, U, bI)), void 0, L.checkDefined($e(K.attributes, U, K0))) } function ae(K) { return !R0(K) || U0(d) } function rt(K) { if (!ae(K)) return t.createNotEmittedStatement(K); let Xe = [], ft = 4, Yt = lt(Xe, K); Yt && (m !== 4 || F !== w) && (ft |= 1024); let pr = aa(K), yr = Co(K), ta = Mr(K, 1) ? t.getExternalModuleOrNamespaceExportName(P, K, !1, !0) : t.getLocalName(K, !1, !0), Go = t.createLogicalOr(ta, t.createAssignment(ta, t.createObjectLiteralExpression())); if (z(K)) { let vo = t.getLocalName(K, !1, !0); Go = t.createAssignment(vo, Go) } let Ka = t.createExpressionStatement(t.createCallExpression(t.createFunctionExpression(void 0, void 0, void 0, void 0, [t.createParameterDeclaration(void 0, void 0, pr)], void 0, Ot(K, yr)), void 0, [Go])); return Ir(Ka, K), Yt && (W0(Ka, void 0), u2(Ka, void 0)), it(Ka, K), bp(Ka, ft), Xe.push(Ka), Xe.push(t.createEndOfDeclarationMarker(K)), Xe } function Ot(K, Xe) { let ft = P; P = Xe; let Yt = []; i(); let pr = on(K.members, Ke); return em(Yt, s()), si(Yt, pr), P = ft, t.createBlock(it(t.createNodeArray(Yt), K.members), !0) } function Ke(K) { let Xe = pt(K, !1), ft = oe(K), Yt = t.createAssignment(t.createElementAccessExpression(P, Xe), ft), pr = ft.kind === 10 ? Yt : t.createAssignment(t.createElementAccessExpression(P, Yt), Xe); return it(t.createExpressionStatement(it(pr, K)), K) } function oe(K) { let Xe = f.getConstantValue(K); return Xe !== void 0 ? typeof Xe == "string" ? t.createStringLiteral(Xe) : t.createNumericLiteral(Xe) : (gc(), K.initializer ? L.checkDefined($e(K.initializer, U, ot)) : t.createVoidZero()) } function pe(K) { let Xe = ea(K, Tc); return Xe ? fK(Xe, U0(d)) : !0 } function z(K) { return Wi(K) || gn(K) && m !== 5 && m !== 6 && m !== 7 && m !== 99 && m !== 4 } function Te(K) { B || (B = new Map); let Xe = yt(K); B.has(Xe) || B.set(Xe, K) } function j(K) { if (B) { let Xe = yt(K); return B.get(Xe) === K } return !0 } function yt(K) { return L.assertNode(K.name, Re), K.name.escapedText } function lt(K, Xe) { let ft = t.createVariableStatement(On(Xe.modifiers, Ne, Ha), t.createVariableDeclarationList([t.createVariableDeclaration(t.getLocalName(Xe, !1, !0))], F.kind === 308 ? 0 : 1)); if (Ir(ft, Xe), Te(Xe), j(Xe)) return Xe.kind === 263 ? Ho(ft.declarationList, Xe) : Ho(ft, Xe), hl(ft, Xe), bp(ft, 8390656), K.push(ft), !0; { let Yt = t.createMergeDeclarationMarker(ft); return Jn(Yt, 8391680), K.push(Yt), !1 } } function Qe(K) { if (!pe(K)) return t.createNotEmittedStatement(K); L.assertNode(K.name, Re, "A TypeScript namespace should have an Identifier name."), Ll(); let Xe = [], ft = 4, Yt = lt(Xe, K); Yt && (m !== 4 || F !== w) && (ft |= 1024); let pr = aa(K), yr = Co(K), ta = Mr(K, 1) ? t.getExternalModuleOrNamespaceExportName(P, K, !1, !0) : t.getLocalName(K, !1, !0), Go = t.createLogicalOr(ta, t.createAssignment(ta, t.createObjectLiteralExpression())); if (z(K)) { let vo = t.getLocalName(K, !1, !0); Go = t.createAssignment(vo, Go) } let Ka = t.createExpressionStatement(t.createCallExpression(t.createFunctionExpression(void 0, void 0, void 0, void 0, [t.createParameterDeclaration(void 0, void 0, pr)], void 0, Vt(K, yr)), void 0, [Go])); return Ir(Ka, K), Yt && (W0(Ka, void 0), u2(Ka, void 0)), it(Ka, K), bp(Ka, ft), Xe.push(Ka), Xe.push(t.createEndOfDeclarationMarker(K)), Xe } function Vt(K, Xe) { let ft = P, Yt = C, pr = B; P = Xe, C = K, B = void 0; let yr = []; i(); let ta, Go; if (K.body) if (K.body.kind === 265) fe(K.body, vo => si(yr, On(vo.statements, X, ca))), ta = K.body.statements, Go = K.body; else { let vo = Qe(K.body); vo && (ba(vo) ? si(yr, vo) : yr.push(vo)); let ka = Hn(K).body; ta = fb(ka.statements, -1) } em(yr, s()), P = ft, C = Yt, B = pr; let Ka = t.createBlock(it(t.createNodeArray(yr), ta), !0); return it(Ka, Go), (!K.body || K.body.kind !== 265) && Jn(Ka, Ya(Ka) | 3072), Ka } function Hn(K) { if (K.body.kind === 264) return Hn(K.body) || K.body } function jr(K) { if (!K.importClause) return K; if (K.importClause.isTypeOnly) return; let Xe = $e(K.importClause, ei, lm); return Xe || d.importsNotUsedAsValues === 1 || d.importsNotUsedAsValues === 2 ? t.updateImportDeclaration(K, void 0, Xe, K.moduleSpecifier, K.assertClause) : void 0 } function ei(K) { L.assert(!K.isTypeOnly); let Xe = wt(K) ? K.name : void 0, ft = $e(K.namedBindings, Kr, Wj); return Xe || ft ? t.updateImportClause(K, !1, Xe, ft) : void 0 } function Kr(K) { if (K.kind === 271) return wt(K) ? K : void 0; { let Xe = d.verbatimModuleSyntax || d.preserveValueImports && (d.importsNotUsedAsValues === 1 || d.importsNotUsedAsValues === 2), ft = On(K.elements, Si, $u); return Xe || vt(ft) ? t.updateNamedImports(K, ft) : void 0 } } function Si(K) { return !K.isTypeOnly && wt(K) ? K : void 0 } function Ja(K) { return d.verbatimModuleSyntax || f.isValueAliasDeclaration(K) ? xn(K, U, e) : void 0 } function Za(K) { if (K.isTypeOnly) return; if (!K.exportClause || qm(K.exportClause)) return K; let Xe = d.verbatimModuleSyntax || !!K.moduleSpecifier && (d.importsNotUsedAsValues === 1 || d.importsNotUsedAsValues === 2), ft = $e(K.exportClause, Yt => xi(Yt, Xe), Rj); return ft ? t.updateExportDeclaration(K, void 0, K.isTypeOnly, ft, K.moduleSpecifier, K.assertClause) : void 0 } function Fa(K, Xe) { let ft = On(K.elements, Nr, Mu); return Xe || vt(ft) ? t.updateNamedExports(K, ft) : void 0 } function Hi(K) { return t.updateNamespaceExport(K, L.checkDefined($e(K.name, U, Re))) } function xi(K, Xe) { return qm(K) ? Hi(K) : Fa(K, Xe) } function Nr(K) { return !K.isTypeOnly && (d.verbatimModuleSyntax || f.isValueAliasDeclaration(K)) ? K : void 0 } function Fo(K) { return wt(K) || !Lc(w) && f.isTopLevelValueImportEqualsWithEntityName(K) } function Qr(K) { if (K.isTypeOnly) return; if (ab(K)) { let ft = wt(K); return !ft && d.importsNotUsedAsValues === 1 ? Ir(it(t.createImportDeclaration(void 0, void 0, K.moduleReference.expression, void 0), K), K) : ft ? xn(K, U, e) : void 0 } if (!Fo(K)) return; let Xe = EO(t, K.moduleReference); return Jn(Xe, 7168), Ki(K) || !Wi(K) ? Ir(it(t.createVariableStatement(On(K.modifiers, Ne, Ha), t.createVariableDeclarationList([Ir(t.createVariableDeclaration(K.name, void 0, void 0, Xe), K)])), K), K) : Ir(xc(K.name, Xe, K), K) } function Wi(K) { return C !== void 0 && Mr(K, 1) } function gn(K) { return C === void 0 && Mr(K, 1) } function Ki(K) { return gn(K) && !Mr(K, 1024) } function kc(K) { return gn(K) && Mr(K, 1024) } function Ps(K) { let Xe = t.createAssignment(t.getExternalModuleOrNamespaceExportName(P, K, !1, !0), t.getLocalName(K)); Ho(Xe, Gf(K.name ? K.name.pos : K.pos, K.end)); let ft = t.createExpressionStatement(Xe); return Ho(ft, Gf(-1, K.end)), ft } function mc(K, Xe) { K.push(Ps(Xe)) } function xc(K, Xe, ft) { return it(t.createExpressionStatement(t.createAssignment(t.getNamespaceMemberName(P, K, !1, !0), Xe)), ft) } function hc(K, Xe, ft) { return it(t.createAssignment(ro(K), Xe), ft) } function ro(K) { return t.getNamespaceMemberName(P, K, !1, !0) } function aa(K) { let Xe = t.getGeneratedNameForNode(K); return Ho(Xe, K.name), Xe } function Co(K) { return t.getGeneratedNameForNode(K) } function gc() { W & 8 || (W |= 8, e.enableSubstitution(79)) } function Ll() { W & 2 || (W |= 2, e.enableSubstitution(79), e.enableSubstitution(300), e.enableEmitNotification(264)) } function md(K) { return ec(K).kind === 264 } function Pc(K) { return ec(K).kind === 263 } function bl(K, Xe, ft) { let Yt = Y, pr = w; Li(Xe) && (w = Xe), W & 2 && md(Xe) && (Y |= 2), W & 8 && Pc(Xe) && (Y |= 8), x(K, Xe, ft), Y = Yt, w = pr } function ss(K, Xe) { return Xe = A(K, Xe), K === 1 ? Rs(Xe) : xf(Xe) ? qs(Xe) : Xe } function qs(K) { if (W & 2) { let Xe = K.name, ft = jt(Xe); if (ft) { if (K.objectAssignmentInitializer) { let Yt = t.createAssignment(ft, K.objectAssignmentInitializer); return it(t.createPropertyAssignment(Xe, Yt), K) } return it(t.createPropertyAssignment(Xe, ft), K) } } return K } function Rs(K) { switch (K.kind) { case 79: return As(K); case 208: return yc(K); case 209: return Ql(K) }return K } function As(K) { return jt(K) || K } function jt(K) { if (W & Y && !tc(K) && !rv(K)) { let Xe = f.getReferencedExportContainer(K, !1); if (Xe && Xe.kind !== 308 && (Y & 2 && Xe.kind === 264 || Y & 8 && Xe.kind === 263)) return it(t.createPropertyAccessExpression(t.getGeneratedNameForNode(Xe), K), K) } } function yc(K) { return se(K) } function Ql(K) { return se(K) } function yu(K) { return K.replace(/\*\//g, "*_/") } function se(K) { let Xe = ht(K); if (Xe !== void 0) { hue(K, Xe); let ft = typeof Xe == "string" ? t.createStringLiteral(Xe) : t.createNumericLiteral(Xe); if (!d.removeComments) { let Yt = ec(K, Us); R4(ft, 3, ` ${yu(Qc(Yt))} `) } return ft } return K } function ht(K) { if (!d_(d)) return br(K) || Vs(K) ? f.getConstantValue(K) : void 0 } function wt(K) { return d.verbatimModuleSyntax || Yn(K) || (d.preserveValueImports ? f.isValueAliasDeclaration(K) : f.isReferencedAliasDeclaration(K)) } } var epe, eMe = gt({ "src/compiler/transformers/ts.ts"() { "use strict"; fa(), epe = !1 } }); function tpe(e) { let { factory: t, getEmitHelperFactory: r, hoistVariableDeclaration: i, endLexicalEnvironment: o, startLexicalEnvironment: s, resumeLexicalEnvironment: l, addBlockScopedVariable: f } = e, d = e.getEmitResolver(), g = e.getCompilerOptions(), m = Do(g), v = MR(g), S = !!g.experimentalDecorators, x = !v, A = v && m < 9, w = x || A, C = m < 9, P = m < 99 ? -1 : v ? 0 : 3, F = m < 9, B = F && m >= 2, q = w || C || P === -1, W = e.onSubstituteNode; e.onSubstituteNode = As; let Y = e.onEmitNode; e.onEmitNode = Rs; let R = !1, ie, $, fe, Z, U, re = new Map, le, _e, ge = !1, X = !1; return y_(e, Ve); function Ve(se) { if (se.isDeclarationFile || (U = void 0, R = !!(o_(se) & 32), !q && !R)) return se; let ht = xn(se, ke, e); return Bg(ht, e.readEmitHelpers()), ht } function we(se) { switch (se.kind) { case 127: return Kn() ? void 0 : se; default: return zr(se, Ha) } } function ke(se) { if (!(se.transformFlags & 16777216) && !(se.transformFlags & 134234112)) return se; switch (se.kind) { case 127: return L.fail("Use `modifierVisitor` instead."); case 260: return ae(se); case 228: return Ot(se, void 0); case 172: case 169: return L.fail("Use `classElementVisitor` instead."); case 299: return We(se); case 240: return qe(se); case 257: return Qt(se); case 166: return tn(se); case 205: return kn(se); case 274: return _n(se); case 80: return ct(se); case 208: return Ht(se); case 209: return En(se); case 221: case 222: return dr(se, !1); case 223: return Q(se, !1); case 214: return G(se, !1, void 0); case 210: return Tt(se); case 241: return Se(se); case 212: return ve(se); case 245: return Cr(se); case 259: case 215: case 173: case 171: case 174: case 175: return gr(void 0, Pe, se); default: return Pe(se) } } function Pe(se) { return xn(se, ke, e) } function Ce(se, ht) { switch (se.kind) { case 356: return Oe(se, !1, ht); case 214: return G(se, !1, ht); case 228: return Ot(se, ht); default: return ke(se) } } function Ie(se) { switch (se.kind) { case 221: case 222: return dr(se, !0); case 223: return Q(se, !0); case 357: return ue(se, !0); case 214: return G(se, !0, void 0); default: return ke(se) } } function Be(se) { switch (se.kind) { case 294: return xn(se, Be, e); case 230: return ln(se); default: return ke(se) } } function Ne(se) { switch (se.kind) { case 207: case 206: return qs(se); default: return ke(se) } } function Le(se) { switch (se.kind) { case 173: return ui(se); case 174: case 175: case 171: return gr(void 0, Pi, se); case 169: return gr(void 0, hi, se); case 172: return oe(se); case 164: return $n(se); case 237: return se; default: return Ns(se) ? we(se) : ke(se) } } function Ye(se) { switch (se.kind) { case 164: return $n(se); default: return ke(se) } } function _t(se) { switch (se.kind) { case 169: return An(se); case 174: case 175: return Le(se); default: L.assertMissingNode(se, "Expected node to either be a PropertyDeclaration, GetAccessorDeclaration, or SetAccessorDeclaration"); break } } function ct(se) { return !C || ca(se.parent) ? se : Ir(t.createIdentifier(""), se) } function Rt(se) { let ht = hc(se.left); if (ht) { let wt = $e(se.right, ke, ot); return Ir(r().createClassPrivateFieldInHelper(ht.brandCheckIdentifier, wt), se) } return xn(se, ke, e) } function We(se) { if (vf(se, ce)) { let { referencedName: ht, name: wt } = je(se.name), K = $e(se.initializer, Xe => Ce(Xe, ht), ot); return t.updatePropertyAssignment(se, wt, K) } return xn(se, ke, e) } function qe(se) { let ht = Z; Z = []; let wt = xn(se, ke, e), K = vt(Z) ? [wt, ...Z] : wt; return Z = ht, K } function zt(se, ht) { let wt = ec(ht, Yr); return wt && !wt.name && Mr(wt, 1024) ? t.createStringLiteral("default") : t.createStringLiteralFromNode(se) } function Qt(se) { if (vf(se, ce)) { let ht = zt(se.name, se.initializer), wt = $e(se.name, ke, Mm), K = $e(se.initializer, Xe => Ce(Xe, ht), ot); return t.updateVariableDeclaration(se, wt, void 0, void 0, K) } return xn(se, ke, e) } function tn(se) { if (vf(se, ce)) { let ht = zt(se.name, se.initializer), wt = $e(se.name, ke, Mm), K = $e(se.initializer, Xe => Ce(Xe, ht), ot); return t.updateParameterDeclaration(se, void 0, void 0, wt, void 0, void 0, K) } return xn(se, ke, e) } function kn(se) { if (vf(se, ce)) { let ht = zt(se.name, se.initializer), wt = $e(se.propertyName, ke, Ys), K = $e(se.name, ke, Mm), Xe = $e(se.initializer, ft => Ce(ft, ht), ot); return t.updateBindingElement(se, void 0, wt, K, Xe) } return xn(se, ke, e) } function _n(se) { if (vf(se, ce)) { let ht = t.createStringLiteral(se.isExportEquals ? "" : "default"), wt = On(se.modifiers, we, Ha), K = $e(se.expression, Xe => Ce(Xe, ht), ot); return t.updateExportAssignment(se, wt, K) } return xn(se, ke, e) } function Gt(se) { return vt(fe) && (ud(se) ? (fe.push(se.expression), se = t.updateParenthesizedExpression(se, t.inlineExpressions(fe))) : (fe.push(se), se = t.inlineExpressions(fe)), fe = void 0), se } function $n(se) { let ht = $e(se.expression, ke, ot); return t.updateComputedPropertyName(se, Gt(ht)) } function ui(se) { return le ? Te(se, le) : Pe(se) } function Ni(se) { return !!(C || zc(se) && o_(se) & 32) } function Pi(se) { if (L.assert(!bf(se)), !xu(se) || !Ni(se)) return xn(se, Le, e); let ht = hc(se.name); if (L.assert(ht, "Undeclared private name for property declaration."), !ht.isValid) return se; let wt = pt(se); wt && Nr().push(t.createAssignment(wt, t.createFunctionExpression(Pr(se.modifiers, K => Ha(K) && !LS(K) && !Nue(K)), se.asteriskToken, wt, void 0, Sc(se.parameters, ke, e), void 0, Zd(se.body, ke, e)))) } function gr(se, ht, wt) { let K = _e; _e = se; let Xe = ht(wt); return _e = K, Xe } function pt(se) { L.assert(pi(se.name)); let ht = hc(se.name); if (L.assert(ht, "Undeclared private name for property declaration."), ht.kind === "m") return ht.methodName; if (ht.kind === "a") { if (zy(se)) return ht.getterName; if (Ng(se)) return ht.setterName } } function nn(se) { let ht = sm(se), wt = pb(se), K = se.name, Xe = K, ft = K; if (ts(K) && !Ap(K.expression)) { let Go = L3(K); if (Go) Xe = t.updateComputedPropertyName(K, $e(K.expression, ke, ot)), ft = t.updateComputedPropertyName(K, Go.left); else { let Ka = t.createTempVariable(i); Ho(Ka, K.expression); let vo = $e(K.expression, ke, ot), ka = t.createAssignment(Ka, vo); Ho(ka, K.expression), Xe = t.updateComputedPropertyName(K, ka), ft = t.updateComputedPropertyName(K, Ka) } } let Yt = On(se.modifiers, we, Ha), pr = sJ(t, se, Yt, se.initializer); Ir(pr, se), Jn(pr, 3072), Ho(pr, wt); let yr = gde(t, se, Yt, Xe); Ir(yr, se), hl(yr, ht), Ho(yr, wt); let ta = yde(t, se, Yt, ft); return Ir(ta, se), Jn(ta, 3072), Ho(ta, wt), vK([pr, yr, ta], _t, _l) } function Dt(se) { if (Ni(se)) { let ht = hc(se.name); if (L.assert(ht, "Undeclared private name for property declaration."), !ht.isValid) return se; if (ht.isStatic && !C) { let wt = lt(se, t.createThis()); if (wt) return t.createClassStaticBlockDeclaration(t.createBlock([wt], !0)) } return } if (x && !Ca(se) && U?.data && U.data.facts & 16) return t.updatePropertyDeclaration(se, On(se.modifiers, ke, Ns), se.name, void 0, void 0, void 0); if (vf(se, ce)) { let { referencedName: ht, name: wt } = je(se.name); return t.updatePropertyDeclaration(se, On(se.modifiers, we, Ha), wt, void 0, void 0, $e(se.initializer, K => Ce(K, ht), ot)) } return t.updatePropertyDeclaration(se, On(se.modifiers, we, Ha), $e(se.name, Ye, Ys), void 0, void 0, $e(se.initializer, ke, ot)) } function pn(se) { if (w && !Id(se)) { let ht = Ja(se.name, !!se.initializer || v, vf(se, ce)); if (ht && Nr().push(...vde(ht)), Ca(se) && !C) { let wt = lt(se, t.createThis()); if (wt) { let K = t.createClassStaticBlockDeclaration(t.createBlock([wt])); return Ir(K, se), hl(K, se), hl(wt, { pos: -1, end: -1 }), W0(wt, void 0), u2(wt, void 0), K } } return } return t.updatePropertyDeclaration(se, On(se.modifiers, we, Ha), $e(se.name, Ye, Ys), void 0, void 0, $e(se.initializer, ke, ot)) } function An(se) { return L.assert(!bf(se), "Decorators should already have been transformed and elided."), xu(se) ? Dt(se) : pn(se) } function Kn() { return P === -1 || P === 3 && !!U?.data && !!(U.data.facts & 16) } function hi(se) { return Id(se) && (Kn() || zc(se) && o_(se) & 32) ? nn(se) : An(se) } function ri(se, ht) { return vn(se, $e(ht, ke, ot)) } function vn(se, ht) { switch (hl(ht, fb(ht, -1)), se.kind) { case "a": return r().createClassPrivateFieldGetHelper(ht, se.brandCheckIdentifier, se.kind, se.getterName); case "m": return r().createClassPrivateFieldGetHelper(ht, se.brandCheckIdentifier, se.kind, se.methodName); case "f": return r().createClassPrivateFieldGetHelper(ht, se.brandCheckIdentifier, se.kind, se.isStatic ? se.variableName : void 0); case "untransformed": return L.fail("Access helpers should not be created for untransformed private elements"); default: L.assertNever(se, "Unknown private element type") } } function Ht(se) { if (pi(se.name)) { let ht = hc(se.name); if (ht) return it(Ir(ri(ht, se.expression), se), se) } if (B && Pu(se) && Re(se.name) && _e && U?.data) { let { classConstructor: ht, superClassReference: wt, facts: K } = U.data; if (K & 1) return Si(se); if (ht && wt) { let Xe = t.createReflectGetCall(wt, t.createStringLiteralFromNode(se.name), ht); return Ir(Xe, se.expression), it(Xe, se.expression), Xe } } return xn(se, ke, e) } function En(se) { if (B && Pu(se) && _e && U?.data) { let { classConstructor: ht, superClassReference: wt, facts: K } = U.data; if (K & 1) return Si(se); if (ht && wt) { let Xe = t.createReflectGetCall(wt, $e(se.argumentExpression, ke, ot), ht); return Ir(Xe, se.expression), it(Xe, se.expression), Xe } } return xn(se, ke, e) } function dr(se, ht) { if (se.operator === 45 || se.operator === 46) { let wt = vs(se.operand); if (TA(wt)) { let K; if (K = hc(wt.name)) { let Xe = $e(wt.expression, ke, ot), { readExpression: ft, initializeExpression: Yt } = at(Xe), pr = ri(K, ft), yr = tv(se) || ht ? void 0 : t.createTempVariable(i); return pr = b3(t, se, pr, i, yr), pr = Ge(K, Yt || ft, pr, 63), Ir(pr, se), it(pr, se), yr && (pr = t.createComma(pr, yr), it(pr, se)), pr } } else if (B && Pu(wt) && _e && U?.data) { let { classConstructor: K, superClassReference: Xe, facts: ft } = U.data; if (ft & 1) { let Yt = Si(wt); return tv(se) ? t.updatePrefixUnaryExpression(se, Yt) : t.updatePostfixUnaryExpression(se, Yt) } if (K && Xe) { let Yt, pr; if (br(wt) ? Re(wt.name) && (pr = Yt = t.createStringLiteralFromNode(wt.name)) : Ap(wt.argumentExpression) ? pr = Yt = wt.argumentExpression : (pr = t.createTempVariable(i), Yt = t.createAssignment(pr, $e(wt.argumentExpression, ke, ot))), Yt && pr) { let yr = t.createReflectGetCall(Xe, pr, K); it(yr, wt); let ta = ht ? void 0 : t.createTempVariable(i); return yr = b3(t, se, yr, i, ta), yr = t.createReflectSetCall(Xe, Yt, yr, K), Ir(yr, se), it(yr, se), ta && (yr = t.createComma(yr, ta), it(yr, se)), yr } } } } return xn(se, ke, e) } function Cr(se) { return t.updateForStatement(se, $e(se.initializer, Ie, pp), $e(se.condition, ke, ot), $e(se.incrementor, Ie, ot), jf(se.statement, ke, e)) } function Se(se) { return t.updateExpressionStatement(se, $e(se.expression, Ie, ot)) } function at(se) { let ht = ws(se) ? se : t.cloneNode(se); if (Ap(se)) return { readExpression: ht, initializeExpression: void 0 }; let wt = t.createTempVariable(i), K = t.createAssignment(wt, ht); return { readExpression: wt, initializeExpression: K } } function Tt(se) { var ht; if (TA(se.expression) && hc(se.expression.name)) { let { thisArg: wt, target: K } = t.createCallBinding(se.expression, i, m); return dT(se) ? t.updateCallChain(se, t.createPropertyAccessChain($e(K, ke, ot), se.questionDotToken, "call"), void 0, void 0, [$e(wt, ke, ot), ...On(se.arguments, ke, ot)]) : t.updateCallExpression(se, t.createPropertyAccessExpression($e(K, ke, ot), "call"), void 0, [$e(wt, ke, ot), ...On(se.arguments, ke, ot)]) } if (B && Pu(se.expression) && _e && ((ht = U?.data) != null && ht.classConstructor)) { let wt = t.createFunctionCallCall($e(se.expression, ke, ot), U.data.classConstructor, On(se.arguments, ke, ot)); return Ir(wt, se), it(wt, se), wt } return xn(se, ke, e) } function ve(se) { var ht; if (TA(se.tag) && hc(se.tag.name)) { let { thisArg: wt, target: K } = t.createCallBinding(se.tag, i, m); return t.updateTaggedTemplateExpression(se, t.createCallExpression(t.createPropertyAccessExpression($e(K, ke, ot), "bind"), void 0, [$e(wt, ke, ot)]), void 0, $e(se.template, ke, AA)) } if (B && Pu(se.tag) && _e && ((ht = U?.data) != null && ht.classConstructor)) { let wt = t.createFunctionBindCall($e(se.tag, ke, ot), U.data.classConstructor, []); return Ir(wt, se), it(wt, se), t.updateTaggedTemplateExpression(se, wt, void 0, $e(se.template, ke, AA)) } return xn(se, ke, e) } function nt(se) { if (U && re.set(ec(se), U), C) { s(); let ht = gr(se, K => On(K, ke, ca), se.body.statements); ht = t.mergeLexicalEnvironment(ht, o()); let wt = t.createImmediatelyInvokedArrowFunction(ht); return Ir(wt, se), it(wt, se), bp(wt, 4), wt } } function ce(se) { if (_u(se) && !se.name) { let ht = EF(se), wt = wr(ht, oc); if (wt) { for (let Xe of wt.body.statements) if (Ol(Xe) && pL(Xe.expression, "___setFunctionName")) return !1 } return (C || !!o_(se)) && vt(ht, Xe => oc(Xe) || xu(Xe) || w && sN(Xe)) } return !1 } function Q(se, ht) { if (Fg(se)) { let wt = fe; fe = void 0, se = t.updateBinaryExpression(se, $e(se.left, Ne, ot), se.operatorToken, $e(se.right, ke, ot)); let K = vt(fe) ? t.inlineExpressions(WD([...fe, se])) : se; return fe = wt, K } if (Iu(se)) { if (vf(se, ce)) { let wt = zt(se.left, se.right), K = $e(se.left, ke, ot), Xe = $e(se.right, ft => Ce(ft, wt), ot); return t.updateBinaryExpression(se, K, se.operatorToken, Xe) } if (TA(se.left)) { let wt = hc(se.left.name); if (wt) return it(Ir(Ge(wt, se.left.expression, se.right, se.operatorToken.kind), se), se) } else if (B && Pu(se.left) && _e && U?.data) { let { classConstructor: wt, superClassReference: K, facts: Xe } = U.data; if (Xe & 1) return t.updateBinaryExpression(se, Si(se.left), se.operatorToken, $e(se.right, ke, ot)); if (wt && K) { let ft = Vs(se.left) ? $e(se.left.argumentExpression, ke, ot) : Re(se.left.name) ? t.createStringLiteralFromNode(se.left.name) : void 0; if (ft) { let Yt = $e(se.right, ke, ot); if (oN(se.operatorToken.kind)) { let yr = ft; Ap(ft) || (yr = t.createTempVariable(i), ft = t.createAssignment(yr, ft)); let ta = t.createReflectGetCall(K, yr, wt); Ir(ta, se.left), it(ta, se.left), Yt = t.createBinaryExpression(ta, WL(se.operatorToken.kind), Yt), it(Yt, se) } let pr = ht ? void 0 : t.createTempVariable(i); return pr && (Yt = t.createAssignment(pr, Yt), it(pr, se)), Yt = t.createReflectSetCall(K, ft, Yt, wt), Ir(Yt, se), it(Yt, se), pr && (Yt = t.createComma(Yt, pr), it(Yt, se)), Yt } } } } return aMe(se) ? Rt(se) : xn(se, ke, e) } function ue(se, ht) { let wt = ht ? aN(se.elements, Ie) : aN(se.elements, ke, Ie); return t.updateCommaListExpression(se, wt) } function G(se, ht, wt) { let K = ht ? Ie : wt ? ft => Ce(ft, wt) : ke, Xe = $e(se.expression, K, ot); return t.updateParenthesizedExpression(se, Xe) } function Oe(se, ht, wt) { let K = ht ? Ie : wt ? ft => Ce(ft, wt) : ke, Xe = $e(se.expression, K, ot); return t.updatePartiallyEmittedExpression(se, Xe) } function je(se) { if (c_(se) || pi(se)) { let ft = t.createStringLiteralFromNode(se), Yt = $e(se, ke, Ys); return { referencedName: ft, name: Yt } } if (c_(se.expression) && !Re(se.expression)) { let ft = t.createStringLiteralFromNode(se.expression), Yt = $e(se, ke, Ys); return { referencedName: ft, name: Yt } } let ht = t.createTempVariable(i), wt = r().createPropKeyHelper($e(se.expression, ke, ot)), K = t.createAssignment(ht, wt), Xe = t.updateComputedPropertyName(se, Gt(K)); return { referencedName: ht, name: Xe } } function Ge(se, ht, wt, K) { if (ht = $e(ht, ke, ot), wt = $e(wt, ke, ot), oN(K)) { let { readExpression: Xe, initializeExpression: ft } = at(ht); ht = ft || Xe, wt = t.createBinaryExpression(vn(se, Xe), WL(K), wt) } switch (hl(ht, fb(ht, -1)), se.kind) { case "a": return r().createClassPrivateFieldSetHelper(ht, se.brandCheckIdentifier, wt, se.kind, se.setterName); case "m": return r().createClassPrivateFieldSetHelper(ht, se.brandCheckIdentifier, wt, se.kind, void 0); case "f": return r().createClassPrivateFieldSetHelper(ht, se.brandCheckIdentifier, wt, se.kind, se.isStatic ? se.variableName : void 0); case "untransformed": return L.fail("Access helpers should not be created for untransformed private elements"); default: L.assertNever(se, "Unknown private element type") } } function kt(se) { return Pr(se.members, K_e) } function Kt(se) { let ht = 0, wt = ec(se); sl(wt) && O0(S, wt) && (ht |= 1); let K = !1, Xe = !1, ft = !1, Yt = !1; for (let yr of se.members) Ca(yr) ? (yr.name && (pi(yr.name) || Id(yr)) && C && (ht |= 2), (Na(yr) || oc(yr)) && (F && yr.transformFlags & 16384 && (ht |= 8, ht & 1 || (ht |= 2)), B && yr.transformFlags & 134217728 && (ht & 1 || (ht |= 6)))) : B0(ec(yr)) || (Id(yr) ? (Yt = !0, ft || (ft = xu(yr))) : xu(yr) ? ft = !0 : Na(yr) && (K = !0, Xe || (Xe = !!yr.initializer))); return (A && K || x && Xe || C && ft || C && Yt && P === -1) && (ht |= 16), ht } function ln(se) { var ht; if ((((ht = U?.data) == null ? void 0 : ht.facts) || 0) & 4) { let K = t.createTempVariable(i, !0); return Hi().superClassReference = K, t.updateExpressionWithTypeArguments(se, t.createAssignment(K, $e(se.expression, ke, ot)), void 0) } return xn(se, ke, e) } function ir(se, ht, wt) { let K = le, Xe = fe, ft = U; le = se, fe = void 0, Za(); let Yt = o_(se) & 32; if (C || Yt) { let ta = sa(se); ta && Re(ta) && (xi().data.className = ta) } if (C) { let ta = kt(se); vt(ta) && (xi().data.weakSetName = mc("instances", ta[0].name)) } let pr = Kt(se); pr && (Hi().facts = pr), pr & 8 && ei(); let yr = wt(se, pr, ht); return Fa(), L.assert(U === ft), le = K, fe = Xe, yr } function ae(se) { return ir(se, void 0, rt) } function rt(se, ht) { var wt, K; let Xe; if (ht & 2) { if (C && ((wt = se.emitNode) != null && wt.classThis)) Hi().classConstructor = se.emitNode.classThis, Xe = t.createAssignment(se.emitNode.classThis, t.getInternalName(se)); else { let Ka = t.createTempVariable(i, !0); Hi().classConstructor = t.cloneNode(Ka), Xe = t.createAssignment(Ka, t.getInternalName(se)) } (K = se.emitNode) != null && K.classThis && (Hi().classThis = se.emitNode.classThis) } let ft = On(se.modifiers, we, Ha), Yt = On(se.heritageClauses, Be, dd), { members: pr, prologue: yr } = pe(se), ta = t.updateClassDeclaration(se, ft, se.name, void 0, Yt, pr), Go = []; if (yr && Go.push(t.createExpressionStatement(yr)), Go.push(ta), Xe && Nr().unshift(Xe), vt(fe) && Go.push(t.createExpressionStatement(t.inlineExpressions(fe))), x || C || o_(se) & 32) { let Ka = EF(se); vt(Ka) && yt(Go, Ka, t.getInternalName(se)) } return Go } function Ot(se, ht) { return ir(se, ht, Ke) } function Ke(se, ht, wt) { var K, Xe, ft, Yt, pr, yr; let ta = !!(ht & 1), Go = EF(se), Ka = d.getNodeCheckFlags(se) & 1048576, vo; function ka() { var vc; if (C && ((vc = se.emitNode) != null && vc.classThis)) return Hi().classConstructor = se.emitNode.classThis; let nf = d.getNodeCheckFlags(se), ye = nf & 1048576, Et = nf & 32768, bn = t.createTempVariable(Et ? f : i, !!ye); return Hi().classConstructor = t.cloneNode(bn), bn } (K = se.emitNode) != null && K.classThis && (Hi().classThis = se.emitNode.classThis), ht & 2 && (vo ?? (vo = ka())); let Hs = On(se.modifiers, we, Ha), Uc = On(se.heritageClauses, Be, dd), { members: Gu, prologue: $o } = pe(se), jo = t.updateClassExpression(se, Hs, se.name, void 0, Uc, Gu), Ws = []; if ($o && Ws.push($o), (C || o_(se) & 32) && vt(Go, vc => oc(vc) || xu(vc) || w && sN(vc)) || vt(fe) || wt) if (ta) { if (L.assertIsDefined(Z, "Decorated classes transformed by TypeScript are expected to be within a variable declaration."), vt(fe) && si(Z, on(fe, t.createExpressionStatement)), wt) if (C) { let vc = r().createSetFunctionNameHelper((ft = vo ?? ((Xe = se.emitNode) == null ? void 0 : Xe.classThis)) != null ? ft : t.getInternalName(se), wt); Z.push(t.createExpressionStatement(vc)) } else { let vc = r().createSetFunctionNameHelper(t.createThis(), wt); jo = t.updateClassExpression(jo, jo.modifiers, jo.name, jo.typeParameters, jo.heritageClauses, [t.createClassStaticBlockDeclaration(t.createBlock([t.createExpressionStatement(vc)])), ...jo.members]) } vt(Go) && yt(Z, Go, (pr = (Yt = se.emitNode) == null ? void 0 : Yt.classThis) != null ? pr : t.getInternalName(se)), vo ? Ws.push(t.createAssignment(vo, jo)) : C && ((yr = se.emitNode) != null && yr.classThis) ? Ws.push(t.createAssignment(se.emitNode.classThis, jo)) : Ws.push(jo) } else { if (vo ?? (vo = ka()), Ka) { jr(); let vc = t.cloneNode(vo); vc.emitNode.autoGenerate.flags &= -9, $[sc(se)] = vc } Ws.push(t.createAssignment(vo, jo)), si(Ws, fe), wt && Ws.push(r().createSetFunctionNameHelper(vo, wt)), si(Ws, Qe(Go, vo)), Ws.push(t.cloneNode(vo)) } else Ws.push(jo); return Ws.length > 1 && (bp(jo, 131072), Ws.forEach(mu)), t.inlineExpressions(Ws) } function oe(se) { if (!C) return xn(se, ke, e) } function pe(se) { let ht = !!(o_(se) & 32); if (C || R) { for (let Yt of se.members) if (xu(Yt)) if (Ni(Yt)) Ps(Yt, Yt.name, Fo); else { let pr = xi(); JT(pr, Yt.name, { kind: "untransformed" }) } if (C && vt(kt(se)) && z(), Kn()) { for (let Yt of se.members) if (Id(Yt)) { let pr = t.getGeneratedPrivateNameForNode(Yt.name, void 0, "_accessor_storage"); if (C || ht && zc(Yt)) Ps(Yt, pr, Qr); else { let yr = xi(); JT(yr, pr, { kind: "untransformed" }) } } } } let wt = On(se.members, Le, _l), K; vt(wt, Ec) || (K = Te(void 0, se)); let Xe, ft; if (!C && vt(fe)) { let Yt = t.createExpressionStatement(t.inlineExpressions(fe)); if (Yt.transformFlags & 134234112) { let yr = t.createTempVariable(i), ta = t.createArrowFunction(void 0, void 0, [], void 0, void 0, t.createBlock([Yt])); Xe = t.createAssignment(yr, ta), Yt = t.createExpressionStatement(t.createCallExpression(yr, void 0, [])) } let pr = t.createBlock([Yt]); ft = t.createClassStaticBlockDeclaration(pr), fe = void 0 } if (K || ft) { let Yt; Yt = Sn(Yt, K), Yt = Sn(Yt, ft), Yt = si(Yt, wt), wt = it(t.createNodeArray(Yt), se.members) } return { members: wt, prologue: Xe } } function z() { let { weakSetName: se } = xi().data; L.assert(se, "weakSetName should be set in private identifier environment"), Nr().push(t.createAssignment(se, t.createNewExpression(t.createIdentifier("WeakSet"), void 0, []))) } function Te(se, ht) { if (se = $e(se, ke, Ec), !U?.data || !(U.data.facts & 16)) return se; let wt = hp(ht), K = !!(wt && ql(wt.expression).kind !== 104), Xe = Sc(se ? se.parameters : void 0, ke, e), ft = j(ht, se, K); return ft ? se ? (L.assert(Xe), t.updateConstructorDeclaration(se, void 0, Xe, ft)) : mu(Ir(it(t.createConstructorDeclaration(void 0, Xe ?? [], ft), se || ht), se)) : se } function j(se, ht, wt) { var K, Xe; let ft = CK(se, !1, !1), Yt = ft; v || (Yt = Pr(Yt, $o => !!$o.initializer || pi($o.name) || rm($o))); let pr = kt(se), yr = vt(Yt) || vt(pr); if (!ht && !yr) return Zd(void 0, ke, e); l(); let ta = !ht && wt, Go = 0, Ka = 0, vo = -1, ka = []; (K = ht?.body) != null && K.statements && (Ka = t.copyPrologue(ht.body.statements, ka, !1, ke), vo = bF(ht.body.statements, Ka), vo >= 0 ? (Go = vo + 1, ka = [...ka.slice(0, Ka), ...On(ht.body.statements, ke, ca, Ka, Go - Ka), ...ka.slice(Ka)]) : Ka >= 0 && (Go = Ka)), ta && ka.push(t.createExpressionStatement(t.createCallExpression(t.createSuper(), void 0, [t.createSpreadElement(t.createIdentifier("arguments"))]))); let Hs = 0; if (ht?.body) { for (let $o = Go; $o < ht.body.statements.length; $o++) { let jo = ht.body.statements[$o]; if (Ad(ec(jo), ht)) Hs++; else break } Hs > 0 && (Go += Hs) } let Uc = t.createThis(); if (Kr(ka, pr, Uc), ht) { let $o = Pr(ft, Ws => Ad(ec(Ws), ht)), jo = Pr(Yt, Ws => !Ad(ec(Ws), ht)); yt(ka, $o, Uc), yt(ka, jo, Uc) } else yt(ka, Yt, Uc); if (ht && si(ka, On(ht.body.statements, ke, ca, Go)), ka = t.mergeLexicalEnvironment(ka, o()), ka.length === 0 && !ht) return; let Gu = ht?.body && ht.body.statements.length >= ka.length && (Xe = ht.body.multiLine) != null ? Xe : ka.length > 0; return it(t.createBlock(it(t.createNodeArray(ka), ht ? ht.body.statements : se.members), Gu), ht ? ht.body : void 0) } function yt(se, ht, wt) { for (let K of ht) { if (Ca(K) && !C) continue; let Xe = lt(K, wt); Xe && se.push(Xe) } } function lt(se, ht) { let wt = oc(se) ? nt(se) : Vt(se, ht); if (!wt) return; let K = t.createExpressionStatement(wt); Ir(K, se), bp(K, Ya(se) & 3072), hl(K, se); let Xe = ec(se); return ha(Xe) ? (Ho(K, Xe), ZR(K)) : Ho(K, yp(se)), W0(wt, void 0), u2(wt, void 0), rm(Xe) && bp(K, 3072), K } function Qe(se, ht) { let wt = []; for (let K of se) { let Xe = oc(K) ? nt(K) : Vt(K, ht); Xe && (mu(Xe), Ir(Xe, K), bp(Xe, Ya(K) & 3072), Ho(Xe, yp(K)), hl(Xe, K), wt.push(Xe)) } return wt } function Vt(se, ht) { var wt; let K = _e, Xe = Hn(se, ht); return Xe && zc(se) && ((wt = U?.data) != null && wt.facts) && (Ir(Xe, se), bp(Xe, 4), Ho(Xe, pb(se.name)), re.set(ec(se), U)), _e = K, Xe } function Hn(se, ht) { let wt = !v, K; vf(se, ce) && (c_(se.name) || pi(se.name) ? K = t.createStringLiteralFromNode(se.name) : c_(se.name.expression) && !Re(se.name.expression) ? K = t.createStringLiteralFromNode(se.name.expression) : K = t.getGeneratedNameForNode(se.name)); let Xe = rm(se) ? t.getGeneratedPrivateNameForNode(se.name) : ts(se.name) && !Ap(se.name.expression) ? t.updateComputedPropertyName(se.name, t.getGeneratedNameForNode(se.name)) : se.name; zc(se) && (_e = se); let ft = K ? yr => Ce(yr, K) : ke; if (pi(Xe) && Ni(se)) { let yr = hc(Xe); if (yr) return yr.kind === "f" ? yr.isStatic ? tMe(yr.variableName, $e(se.initializer, ft, ot)) : nMe(ht, $e(se.initializer, ft, ot), yr.brandCheckIdentifier) : void 0; L.fail("Undeclared private name for property declaration.") } if ((pi(Xe) || zc(se)) && !se.initializer) return; let Yt = ec(se); if (Mr(Yt, 256)) return; let pr = $e(se.initializer, ft, ot); if (Ad(Yt, Yt.parent) && Re(Xe)) { let yr = t.cloneNode(Xe); pr ? (ud(pr) && TO(pr.expression) && pL(pr.expression.left, "___runInitializers") && NS(pr.expression.right) && Vf(pr.expression.right.expression) && (pr = pr.expression.left), pr = t.inlineExpressions([pr, yr])) : pr = yr, Jn(Xe, 3168), Ho(yr, Yt.name), Jn(yr, 3072) } else pr ?? (pr = t.createVoidZero()); if (wt || pi(Xe)) { let yr = VT(t, ht, Xe, Xe); return bp(yr, 1024), t.createAssignment(yr, pr) } else { let yr = ts(Xe) ? Xe.expression : Re(Xe) ? t.createStringLiteral(Gi(Xe.escapedText)) : Xe, ta = t.createPropertyDescriptor({ value: pr, configurable: !0, writable: !0, enumerable: !0 }); return t.createObjectDefinePropertyCall(ht, yr, ta) } } function jr() { ie & 1 || (ie |= 1, e.enableSubstitution(79), $ = []) } function ei() { ie & 2 || (ie |= 2, e.enableSubstitution(108), e.enableEmitNotification(259), e.enableEmitNotification(215), e.enableEmitNotification(173), e.enableEmitNotification(174), e.enableEmitNotification(175), e.enableEmitNotification(171), e.enableEmitNotification(169), e.enableEmitNotification(164)) } function Kr(se, ht, wt) { if (!C || !vt(ht)) return; let { weakSetName: K } = xi().data; L.assert(K, "weakSetName should be set in private identifier environment"), se.push(t.createExpressionStatement(rMe(wt, K))) } function Si(se) { return br(se) ? t.updatePropertyAccessExpression(se, t.createVoidZero(), se.name) : t.updateElementAccessExpression(se, t.createVoidZero(), $e(se.argumentExpression, ke, ot)) } function Ja(se, ht, wt) { if (ts(se)) { let K = L3(se), Xe = $e(se.expression, ke, ot), ft = a_(Xe), Yt = Ap(ft); if (!(!!K || Iu(ft) && tc(ft.left)) && !Yt && ht) { let yr = t.getGeneratedNameForNode(se); return d.getNodeCheckFlags(se) & 32768 ? f(yr) : i(yr), wt && (Xe = r().createPropKeyHelper(Xe)), t.createAssignment(yr, Xe) } return Yt || Re(ft) ? void 0 : Xe } } function Za() { U = { previous: U, data: void 0 } } function Fa() { U = U?.previous } function Hi() { var se; return L.assert(U), (se = U.data) != null ? se : U.data = { facts: 0, classConstructor: void 0, classThis: void 0, superClassReference: void 0 } } function xi() { var se; return L.assert(U), (se = U.privateEnv) != null ? se : U.privateEnv = Y_e({ className: void 0, weakSetName: void 0 }) } function Nr() { return fe ?? (fe = []) } function Fo(se, ht, wt, K, Xe, ft, Yt) { Id(se) ? kc(se, ht, wt, K, Xe, ft, Yt) : Na(se) ? Qr(se, ht, wt, K, Xe, ft, Yt) : Nc(se) ? Wi(se, ht, wt, K, Xe, ft, Yt) : p_(se) ? gn(se, ht, wt, K, Xe, ft, Yt) : Sf(se) && Ki(se, ht, wt, K, Xe, ft, Yt) } function Qr(se, ht, wt, K, Xe, ft, Yt) { var pr; if (Xe) { let yr = L.checkDefined((pr = wt.classThis) != null ? pr : wt.classConstructor, "classConstructor should be set in private identifier environment"), ta = xc(ht); JT(K, ht, { kind: "f", isStatic: !0, brandCheckIdentifier: yr, variableName: ta, isValid: ft }) } else { let yr = xc(ht); JT(K, ht, { kind: "f", isStatic: !1, brandCheckIdentifier: yr, isValid: ft }), Nr().push(t.createAssignment(yr, t.createNewExpression(t.createIdentifier("WeakMap"), void 0, []))) } } function Wi(se, ht, wt, K, Xe, ft, Yt) { var pr; let yr = xc(ht), ta = Xe ? L.checkDefined((pr = wt.classThis) != null ? pr : wt.classConstructor, "classConstructor should be set in private identifier environment") : L.checkDefined(K.data.weakSetName, "weakSetName should be set in private identifier environment"); JT(K, ht, { kind: "m", methodName: yr, brandCheckIdentifier: ta, isStatic: Xe, isValid: ft }) } function gn(se, ht, wt, K, Xe, ft, Yt) { var pr; let yr = xc(ht, "_get"), ta = Xe ? L.checkDefined((pr = wt.classThis) != null ? pr : wt.classConstructor, "classConstructor should be set in private identifier environment") : L.checkDefined(K.data.weakSetName, "weakSetName should be set in private identifier environment"); Yt?.kind === "a" && Yt.isStatic === Xe && !Yt.getterName ? Yt.getterName = yr : JT(K, ht, { kind: "a", getterName: yr, setterName: void 0, brandCheckIdentifier: ta, isStatic: Xe, isValid: ft }) } function Ki(se, ht, wt, K, Xe, ft, Yt) { var pr; let yr = xc(ht, "_set"), ta = Xe ? L.checkDefined((pr = wt.classThis) != null ? pr : wt.classConstructor, "classConstructor should be set in private identifier environment") : L.checkDefined(K.data.weakSetName, "weakSetName should be set in private identifier environment"); Yt?.kind === "a" && Yt.isStatic === Xe && !Yt.setterName ? Yt.setterName = yr : JT(K, ht, { kind: "a", getterName: void 0, setterName: yr, brandCheckIdentifier: ta, isStatic: Xe, isValid: ft }) } function kc(se, ht, wt, K, Xe, ft, Yt) { var pr; let yr = xc(ht, "_get"), ta = xc(ht, "_set"), Go = Xe ? L.checkDefined((pr = wt.classThis) != null ? pr : wt.classConstructor, "classConstructor should be set in private identifier environment") : L.checkDefined(K.data.weakSetName, "weakSetName should be set in private identifier environment"); JT(K, ht, { kind: "a", getterName: yr, setterName: ta, brandCheckIdentifier: Go, isStatic: Xe, isValid: ft }) } function Ps(se, ht, wt) { let K = Hi(), Xe = xi(), ft = kK(Xe, ht), Yt = zc(se), pr = !iMe(ht) && ft === void 0; wt(se, ht, K, Xe, Yt, pr, ft) } function mc(se, ht, wt) { let { className: K } = xi().data, Xe = K ? { prefix: "_", node: K, suffix: "_" } : "_", ft = typeof se == "object" ? t.getGeneratedNameForNode(se, 24, Xe, wt) : typeof se == "string" ? t.createUniqueName(se, 16, Xe, wt) : t.createTempVariable(void 0, !0, Xe, wt); return d.getNodeCheckFlags(ht) & 32768 ? f(ft) : i(ft), ft } function xc(se, ht) { var wt; let K = T6(se); return mc((wt = K?.substring(1)) != null ? wt : se, se, ht) } function hc(se) { let ht = $_e(U, se); return ht?.kind === "untransformed" ? void 0 : ht } function ro(se) { let ht = t.getGeneratedNameForNode(se), wt = hc(se.name); if (!wt) return xn(se, ke, e); let K = se.expression; return (zw(se) || Pu(se) || !Z0(se.expression)) && (K = t.createTempVariable(i, !0), Nr().push(t.createBinaryExpression(K, 63, $e(se.expression, ke, ot)))), t.createAssignmentTargetWrapper(ht, Ge(wt, K, ht, 63)) } function aa(se) { if (rs(se) || fu(se)) return qs(se); if (TA(se)) return ro(se); if (B && Pu(se) && _e && U?.data) { let { classConstructor: ht, superClassReference: wt, facts: K } = U.data; if (K & 1) return Si(se); if (ht && wt) { let Xe = Vs(se) ? $e(se.argumentExpression, ke, ot) : Re(se.name) ? t.createStringLiteralFromNode(se.name) : void 0; if (Xe) { let ft = t.createTempVariable(void 0); return t.createAssignmentTargetWrapper(ft, t.createReflectSetCall(wt, Xe, ft, ht)) } } } return xn(se, ke, e) } function Co(se) { if (vf(se, ce)) { let ht = aa(se.left), wt = zt(se.left, se.right), K = $e(se.right, Xe => Ce(Xe, wt), ot); return t.updateBinaryExpression(se, ht, se.operatorToken, K) } if (Iu(se, !0)) { let ht = aa(se.left), wt = $e(se.right, ke, ot); return t.updateBinaryExpression(se, ht, se.operatorToken, wt) } return aa(se) } function gc(se) { if (Ju(se.expression)) { let ht = aa(se.expression); return t.updateSpreadElement(se, ht) } return xn(se, ke, e) } function Ll(se) { return L.assertNode(se, ww), Km(se) ? gc(se) : ol(se) ? xn(se, ke, e) : Co(se) } function md(se) { let ht = $e(se.name, ke, Ys); if (Iu(se.initializer, !0)) { let wt = Co(se.initializer); return t.updatePropertyAssignment(se, ht, wt) } if (Ju(se.initializer)) { let wt = aa(se.initializer); return t.updatePropertyAssignment(se, ht, wt) } return xn(se, ke, e) } function Pc(se) { if (vf(se, ce)) { let ht = zt(se.name, se.objectAssignmentInitializer), wt = $e(se.objectAssignmentInitializer, K => Ce(K, ht), ot); return t.updateShorthandPropertyAssignment(se, se.name, wt) } return xn(se, ke, e) } function bl(se) { if (Ju(se.expression)) { let ht = aa(se.expression); return t.updateSpreadAssignment(se, ht) } return xn(se, ke, e) } function ss(se) { return L.assertNode(se, Dw), VS(se) ? bl(se) : xf(se) ? Pc(se) : yl(se) ? md(se) : xn(se, ke, e) } function qs(se) { return fu(se) ? t.updateArrayLiteralExpression(se, On(se.elements, Ll, ot)) : t.updateObjectLiteralExpression(se, On(se.properties, ss, Og)) } function Rs(se, ht, wt) { let K = ec(ht), Xe = re.get(K); if (Xe) { let ft = U, Yt = X; U = Xe, X = ge, ge = !oc(K) || !(o_(K) & 32), Y(se, ht, wt), ge = X, X = Yt, U = ft; return } switch (ht.kind) { case 215: if (xs(K) || Ya(ht) & 524288) break; case 259: case 173: case 174: case 175: case 171: case 169: { let ft = U, Yt = X; U = void 0, X = ge, ge = !1, Y(se, ht, wt), ge = X, X = Yt, U = ft; return } case 164: { let ft = U, Yt = ge; U = U?.previous, ge = X, Y(se, ht, wt), ge = Yt, U = ft; return } }Y(se, ht, wt) } function As(se, ht) { return ht = W(se, ht), se === 1 ? jt(ht) : ht } function jt(se) { switch (se.kind) { case 79: return Ql(se); case 108: return yc(se) }return se } function yc(se) { if (ie & 2 && U?.data) { let { facts: ht, classConstructor: wt, classThis: K } = U.data; if (ht & 1 && S) return t.createParenthesizedExpression(t.createVoidZero()); let Xe = ge ? K ?? wt : wt; if (Xe) return it(Ir(t.cloneNode(Xe), se), se) } return se } function Ql(se) { return yu(se) || se } function yu(se) { if (ie & 1 && d.getNodeCheckFlags(se) & 2097152) { let ht = d.getReferencedValueDeclaration(se); if (ht) { let wt = $[ht.id]; if (wt) { let K = t.cloneNode(wt); return Ho(K, se), hl(K, se), K } } } } } function tMe(e, t) { return D.createAssignment(e, D.createObjectLiteralExpression([D.createPropertyAssignment("value", t || D.createVoidZero())])) } function nMe(e, t, r) { return D.createCallExpression(D.createPropertyAccessExpression(r, "set"), void 0, [e, t || D.createVoidZero()]) } function rMe(e, t) { return D.createCallExpression(D.createPropertyAccessExpression(t, "add"), void 0, [e]) } function iMe(e) { return !tS(e) && e.escapedText === "#constructor" } function aMe(e) { return pi(e.left) && e.operatorToken.kind === 101 } var oMe = gt({ "src/compiler/transformers/classFields.ts"() { "use strict"; fa() } }); function npe(e) { let { hoistVariableDeclaration: t } = e, r = e.getEmitResolver(), i = e.getCompilerOptions(), o = Do(i), s = Uf(i, "strictNullChecks"), l, f; return { serializeTypeNode: ($, fe) => d($, A, fe), serializeTypeOfNode: ($, fe) => d($, m, fe), serializeParameterTypesOfNode: ($, fe, Z) => d($, v, fe, Z), serializeReturnTypeOfNode: ($, fe) => d($, x, fe) }; function d($, fe, Z, U) { let re = l, le = f; l = $.currentLexicalScope, f = $.currentNameScope; let _e = U === void 0 ? fe(Z) : fe(Z, U); return l = re, f = le, _e } function g($) { let fe = r.getAllAccessorDeclarations($); return fe.setAccessor && Pce(fe.setAccessor) || fe.getAccessor && U_(fe.getAccessor) } function m($) { switch ($.kind) { case 169: case 166: return A($.type); case 175: case 174: return A(g($)); case 260: case 228: case 171: return D.createIdentifier("Function"); default: return D.createVoidZero() } } function v($, fe) { let Z = Yr($) ? Vm($) : Ia($) && Pf($.body) ? $ : void 0, U = []; if (Z) { let re = S(Z, fe), le = re.length; for (let _e = 0; _e < le; _e++) { let ge = re[_e]; _e === 0 && Re(ge.name) && ge.name.escapedText === "this" || (ge.dotDotDotToken ? U.push(A(SH(ge.type))) : U.push(m(ge))) } } return D.createArrayLiteralExpression(U) } function S($, fe) { if (fe && $.kind === 174) { let { setAccessor: Z } = kT(fe.members, $); if (Z) return Z.parameters } return $.parameters } function x($) { return Ia($) && $.type ? A($.type) : qA($) ? D.createIdentifier("Promise") : D.createVoidZero() } function A($) { if ($ === void 0) return D.createIdentifier("Object"); switch ($ = FH($), $.kind) { case 114: case 155: case 144: return D.createVoidZero(); case 181: case 182: return D.createIdentifier("Function"); case 185: case 186: return D.createIdentifier("Array"); case 179: return $.assertsModifier ? D.createVoidZero() : D.createIdentifier("Boolean"); case 134: return D.createIdentifier("Boolean"); case 200: case 152: return D.createIdentifier("String"); case 149: return D.createIdentifier("Object"); case 198: return w($.literal); case 148: return D.createIdentifier("Number"); case 160: return ie("BigInt", 7); case 153: return ie("Symbol", 2); case 180: return F($); case 190: return C($.types, !0); case 189: return C($.types, !1); case 191: return C([$.trueType, $.falseType], !1); case 195: if ($.operator === 146) return A($.type); break; case 183: case 196: case 197: case 184: case 131: case 157: case 194: case 202: break; case 315: case 316: case 320: case 321: case 322: break; case 317: case 318: case 319: return A($.type); default: return L.failBadSyntaxKind($) }return D.createIdentifier("Object") } function w($) { switch ($.kind) { case 10: case 14: return D.createIdentifier("String"); case 221: { let fe = $.operand; switch (fe.kind) { case 8: case 9: return w(fe); default: return L.failBadSyntaxKind(fe) } } case 8: return D.createIdentifier("Number"); case 9: return ie("BigInt", 7); case 110: case 95: return D.createIdentifier("Boolean"); case 104: return D.createVoidZero(); default: return L.failBadSyntaxKind($) } } function C($, fe) { let Z; for (let U of $) { if (U = FH(U), U.kind === 144) { if (fe) return D.createVoidZero(); continue } if (U.kind === 157) { if (!fe) return D.createIdentifier("Object"); continue } if (U.kind === 131) return D.createIdentifier("Object"); if (!s && (mb(U) && U.literal.kind === 104 || U.kind === 155)) continue; let re = A(U); if (Re(re) && re.escapedText === "Object") return re; if (Z) { if (!P(Z, re)) return D.createIdentifier("Object") } else Z = re } return Z ?? D.createVoidZero() } function P($, fe) { return tc($) ? tc(fe) : Re($) ? Re(fe) && $.escapedText === fe.escapedText : br($) ? br(fe) && P($.expression, fe.expression) && P($.name, fe.name) : NS($) ? NS(fe) && Vf($.expression) && $.expression.text === "0" && Vf(fe.expression) && fe.expression.text === "0" : yo($) ? yo(fe) && $.text === fe.text : y2($) ? y2(fe) && P($.expression, fe.expression) : ud($) ? ud(fe) && P($.expression, fe.expression) : b2($) ? b2(fe) && P($.condition, fe.condition) && P($.whenTrue, fe.whenTrue) && P($.whenFalse, fe.whenFalse) : ar($) ? ar(fe) && $.operatorToken.kind === fe.operatorToken.kind && P($.left, fe.left) && P($.right, fe.right) : !1 } function F($) { let fe = r.getTypeReferenceSerializationKind($.typeName, f ?? l); switch (fe) { case 0: if (jn($, re => re.parent && m2(re.parent) && (re.parent.trueType === re || re.parent.falseType === re))) return D.createIdentifier("Object"); let Z = q($.typeName), U = D.createTempVariable(t); return D.createConditionalExpression(D.createTypeCheck(D.createAssignment(U, Z), "function"), void 0, U, void 0, D.createIdentifier("Object")); case 1: return W($.typeName); case 2: return D.createVoidZero(); case 4: return ie("BigInt", 7); case 6: return D.createIdentifier("Boolean"); case 3: return D.createIdentifier("Number"); case 5: return D.createIdentifier("String"); case 7: return D.createIdentifier("Array"); case 8: return ie("Symbol", 2); case 10: return D.createIdentifier("Function"); case 9: return D.createIdentifier("Promise"); case 11: return D.createIdentifier("Object"); default: return L.assertNever(fe) } } function B($, fe) { return D.createLogicalAnd(D.createStrictInequality(D.createTypeOfExpression($), D.createStringLiteral("undefined")), fe) } function q($) { if ($.kind === 79) { let U = W($); return B(U, U) } if ($.left.kind === 79) return B(W($.left), W($)); let fe = q($.left), Z = D.createTempVariable(t); return D.createLogicalAnd(D.createLogicalAnd(fe.left, D.createStrictInequality(D.createAssignment(Z, fe.right), D.createVoidZero())), D.createPropertyAccessExpression(Z, $.right)) } function W($) { switch ($.kind) { case 79: let fe = go(it(fm.cloneNode($), $), $.parent); return fe.original = void 0, go(fe, ea(l)), fe; case 163: return Y($) } } function Y($) { return D.createPropertyAccessExpression(W($.left), $.right) } function R($) { return D.createConditionalExpression(D.createTypeCheck(D.createIdentifier($), "function"), void 0, D.createIdentifier($), void 0, D.createIdentifier("Object")) } function ie($, fe) { return o < fe ? R($) : D.createIdentifier($) } } var sMe = gt({ "src/compiler/transformers/typeSerializer.ts"() { "use strict"; fa() } }); function rpe(e) { let { factory: t, getEmitHelperFactory: r, hoistVariableDeclaration: i } = e, o = e.getEmitResolver(), s = e.getCompilerOptions(), l = Do(s), f = e.onSubstituteNode; e.onSubstituteNode = Ye; let d; return y_(e, g); function g(We) { let qe = xn(We, v, e); return Bg(qe, e.readEmitHelpers()), qe } function m(We) { return du(We) ? void 0 : We } function v(We) { if (!(We.transformFlags & 33554432)) return We; switch (We.kind) { case 167: return; case 260: return S(We); case 228: return B(We); case 173: return q(We); case 171: return Y(We); case 175: return ie(We); case 174: return R(We); case 169: return $(We); case 166: return fe(We); default: return xn(We, v, e) } } function S(We) { if (!(O0(!0, We) || kI(!0, We))) return xn(We, v, e); let qe = O0(!0, We) ? F(We, We.name) : P(We, We.name); return qe.length > 1 && (qe.push(t.createEndOfDeclarationMarker(We)), Jn(qe[0], Ya(qe[0]) | 8388608)), zp(qe) } function x(We) { return !!(We.transformFlags & 536870912) } function A(We) { return vt(We, x) } function w(We) { for (let qe of We.members) { if (!HS(qe)) continue; let zt = TF(qe, We, !0); if (vt(zt?.decorators, x) || vt(zt?.parameters, A)) return !0 } return !1 } function C(We, qe) { let zt = []; return re(zt, We, !1), re(zt, We, !0), w(We) && (qe = it(t.createNodeArray([...qe, t.createClassStaticBlockDeclaration(t.createBlock(zt, !0))]), qe), zt = void 0), { decorationStatements: zt, members: qe } } function P(We, qe) { let zt = On(We.modifiers, m, Ha), Qt = On(We.heritageClauses, v, dd), tn = On(We.members, v, _l), kn = []; ({ members: tn, decorationStatements: kn } = C(We, tn)); let _n = t.updateClassDeclaration(We, zt, qe, void 0, Qt, tn); return si([_n], kn) } function F(We, qe) { let zt = yp(We), Qt = Be(We), tn = l <= 2 ? t.getInternalName(We, !1, !0) : t.getLocalName(We, !1, !0), kn = On(We.heritageClauses, v, dd), _n = On(We.members, v, _l), Gt = []; ({ members: _n, decorationStatements: Gt } = C(We, _n)); let $n = t.createClassExpression(void 0, qe && tc(qe) ? void 0 : qe, void 0, kn, _n); Ir($n, We), it($n, zt); let ui = t.createVariableStatement(void 0, t.createVariableDeclarationList([t.createVariableDeclaration(tn, void 0, void 0, Qt ? t.createAssignment(Qt, $n) : $n)], 1)); Ir(ui, We), it(ui, zt), hl(ui, We); let Ni = [ui]; return si(Ni, Gt), Ve(Ni, We), Ni } function B(We) { return t.updateClassExpression(We, On(We.modifiers, m, Ha), We.name, void 0, On(We.heritageClauses, v, dd), On(We.members, v, _l)) } function q(We) { return t.updateConstructorDeclaration(We, On(We.modifiers, m, Ha), On(We.parameters, v, ha), $e(We.body, v, Va)) } function W(We, qe) { return We !== qe && (hl(We, qe), Ho(We, yp(qe))), We } function Y(We) { return W(t.updateMethodDeclaration(We, On(We.modifiers, m, Ha), We.asteriskToken, L.checkDefined($e(We.name, v, Ys)), void 0, void 0, On(We.parameters, v, ha), void 0, $e(We.body, v, Va)), We) } function R(We) { return W(t.updateGetAccessorDeclaration(We, On(We.modifiers, m, Ha), L.checkDefined($e(We.name, v, Ys)), On(We.parameters, v, ha), void 0, $e(We.body, v, Va)), We) } function ie(We) { return W(t.updateSetAccessorDeclaration(We, On(We.modifiers, m, Ha), L.checkDefined($e(We.name, v, Ys)), On(We.parameters, v, ha), $e(We.body, v, Va)), We) } function $(We) { if (!(We.flags & 16777216 || Mr(We, 2))) return W(t.updatePropertyDeclaration(We, On(We.modifiers, m, Ha), L.checkDefined($e(We.name, v, Ys)), void 0, void 0, $e(We.initializer, v, ot)), We) } function fe(We) { let qe = t.updateParameterDeclaration(We, hde(t, We.modifiers), We.dotDotDotToken, L.checkDefined($e(We.name, v, Mm)), void 0, void 0, $e(We.initializer, v, ot)); return qe !== We && (hl(qe, We), it(qe, yp(We)), Ho(qe, yp(We)), Jn(qe.name, 64)), qe } function Z(We) { return pL(We.expression, "___metadata") } function U(We) { if (!We) return; let { false: qe, true: zt } = yae(We.decorators, Z), Qt = []; return si(Qt, on(qe, ke)), si(Qt, Uo(We.parameters, Pe)), si(Qt, on(zt, ke)), Qt } function re(We, qe, zt) { si(We, on(ge(qe, zt), Qt => t.createExpressionStatement(Qt))) } function le(We, qe, zt) { return Kw(!0, We, zt) && qe === Ca(We) } function _e(We, qe) { return Pr(We.members, zt => le(zt, qe, We)) } function ge(We, qe) { let zt = _e(We, qe), Qt; for (let tn of zt) Qt = Sn(Qt, X(We, tn)); return Qt } function X(We, qe) { let zt = TF(qe, We, !0), Qt = U(zt); if (!Qt) return; let tn = Le(We, qe), kn = Ce(qe, !Mr(qe, 2)), _n = l > 0 ? Na(qe) && !rm(qe) ? t.createVoidZero() : t.createNull() : void 0, Gt = r().createDecorateHelper(Qt, tn, kn, _n); return Jn(Gt, 3072), Ho(Gt, yp(qe)), Gt } function Ve(We, qe) { let zt = we(qe); zt && We.push(Ir(t.createExpressionStatement(zt), qe)) } function we(We) { let qe = LK(We), zt = U(qe); if (!zt) return; let Qt = d && d[sc(We)], tn = l <= 2 ? t.getInternalName(We, !1, !0) : t.getLocalName(We, !1, !0), kn = r().createDecorateHelper(zt, tn), _n = t.createAssignment(tn, Qt ? t.createAssignment(Qt, kn) : kn); return Jn(_n, 3072), Ho(_n, yp(We)), _n } function ke(We) { return L.checkDefined($e(We.expression, v, ot)) } function Pe(We, qe) { let zt; if (We) { zt = []; for (let Qt of We) { let tn = r().createParamHelper(ke(Qt), qe); it(tn, Qt.expression), Jn(tn, 3072), zt.push(tn) } } return zt } function Ce(We, qe) { let zt = We.name; return pi(zt) ? t.createIdentifier("") : ts(zt) ? qe && !Ap(zt.expression) ? t.getGeneratedNameForNode(zt) : zt.expression : Re(zt) ? t.createStringLiteral(vr(zt)) : t.cloneNode(zt) } function Ie() { d || (e.enableSubstitution(79), d = []) } function Be(We) { if (o.getNodeCheckFlags(We) & 1048576) { Ie(); let qe = t.createUniqueName(We.name && !tc(We.name) ? vr(We.name) : "default"); return d[sc(We)] = qe, i(qe), qe } } function Ne(We) { return t.createPropertyAccessExpression(t.getDeclarationName(We), "prototype") } function Le(We, qe) { return Ca(qe) ? t.getDeclarationName(We) : Ne(We) } function Ye(We, qe) { return qe = f(We, qe), We === 1 ? _t(qe) : qe } function _t(We) { switch (We.kind) { case 79: return ct(We) }return We } function ct(We) { var qe; return (qe = Rt(We)) != null ? qe : We } function Rt(We) { if (d && o.getNodeCheckFlags(We) & 2097152) { let qe = o.getReferencedValueDeclaration(We); if (qe) { let zt = d[qe.id]; if (zt) { let Qt = t.cloneNode(zt); return Ho(Qt, We), hl(Qt, We), Qt } } } } } var cMe = gt({ "src/compiler/transformers/legacyDecorators.ts"() { "use strict"; fa() } }); function ipe(e) { let { factory: t, getEmitHelperFactory: r, startLexicalEnvironment: i, endLexicalEnvironment: o, hoistVariableDeclaration: s } = e, l, f, d, g, m, v; return y_(e, S); function S(ae) { l = void 0, v = !1; let rt = xn(ae, R, e); return Bg(rt, e.readEmitHelpers()), v && (SS(rt, 32), v = !1), rt } function x() { switch (f = void 0, d = void 0, g = void 0, l?.kind) { case "class": f = l.classInfo; break; case "class-element": f = l.next.classInfo, d = l.classThis, g = l.classSuper; break; case "name": let ae = l.next.next.next; ae?.kind === "class-element" && (f = ae.next.classInfo, d = ae.classThis, g = ae.classSuper); break } } function A(ae) { l = { kind: "class", next: l, classInfo: ae, savedPendingExpressions: m }, m = void 0, x() } function w() { L.assert(l?.kind === "class", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class' but got '${l?.kind}' instead.`), m = l.savedPendingExpressions, l = l.next, x() } function C(ae) { var rt, Ot; L.assert(l?.kind === "class", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class' but got '${l?.kind}' instead.`), l = { kind: "class-element", next: l }, (oc(ae) || Na(ae) && zc(ae)) && (l.classThis = (rt = l.next.classInfo) == null ? void 0 : rt.classThis, l.classSuper = (Ot = l.next.classInfo) == null ? void 0 : Ot.classSuper), x() } function P() { var ae; L.assert(l?.kind === "class-element", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class-element' but got '${l?.kind}' instead.`), L.assert(((ae = l.next) == null ? void 0 : ae.kind) === "class", "Incorrect value for top.next.kind.", () => { var rt; return `Expected top.next.kind to be 'class' but got '${(rt = l.next) == null ? void 0 : rt.kind}' instead.` }), l = l.next, x() } function F() { L.assert(l?.kind === "class-element", "Incorrect value for top.kind.", () => `Expected top.kind to be 'class-element' but got '${l?.kind}' instead.`), l = { kind: "name", next: l }, x() } function B() { L.assert(l?.kind === "name", "Incorrect value for top.kind.", () => `Expected top.kind to be 'name' but got '${l?.kind}' instead.`), l = l.next, x() } function q() { l?.kind === "other" ? (L.assert(!m), l.depth++) : (l = { kind: "other", next: l, depth: 0, savedPendingExpressions: m }, m = void 0, x()) } function W() { L.assert(l?.kind === "other", "Incorrect value for top.kind.", () => `Expected top.kind to be 'other' but got '${l?.kind}' instead.`), l.depth > 0 ? (L.assert(!m), l.depth--) : (m = l.savedPendingExpressions, l = l.next, x()) } function Y(ae) { return !!(ae.transformFlags & 33554432) || !!d && !!(ae.transformFlags & 16384) || !!d && !!g && !!(ae.transformFlags & 134217728) } function R(ae) { if (!Y(ae)) return ae; switch (ae.kind) { case 167: return L.fail("Use `modifierVisitor` instead."); case 260: return ke(ae); case 228: return Pe(ae, void 0); case 173: case 169: case 172: return L.fail("Not supported outside of a class. Use 'classElementVisitor' instead."); case 166: return kn(ae); case 223: return ui(ae, !1); case 299: return Dt(ae); case 257: return pn(ae); case 205: return An(ae); case 274: return at(ae); case 108: return We(ae); case 245: return Gt(ae); case 241: return $n(ae); case 357: return Pi(ae, !1); case 214: return Tt(ae, !1, void 0); case 356: return ve(ae, !1, void 0); case 210: return qe(ae); case 212: return zt(ae); case 221: case 222: return Ni(ae, !1); case 208: return Qt(ae); case 209: return tn(ae); case 164: return nn(ae); case 171: case 175: case 174: case 215: case 259: { q(); let rt = xn(ae, ie, e); return W(), rt } default: return xn(ae, ie, e) } } function ie(ae) { switch (ae.kind) { case 167: return; default: return R(ae) } } function $(ae) { switch (ae.kind) { case 167: return; default: return ae } } function fe(ae) { switch (ae.kind) { case 173: return Ie(ae); case 171: return Le(ae); case 174: return Ye(ae); case 175: return _t(ae); case 169: return Rt(ae); case 172: return ct(ae); default: return R(ae) } } function Z(ae, rt) { switch (ae.kind) { case 356: return ve(ae, !1, rt); case 214: return Tt(ae, !1, rt); case 228: return Pe(ae, rt); default: return R(ae) } } function U(ae) { switch (ae.kind) { case 221: case 222: return Ni(ae, !0); case 223: return ui(ae, !0); case 357: return Pi(ae, !0); case 214: return Tt(ae, !0, void 0); default: return R(ae) } } function re(ae) { let rt = ae.name && Re(ae.name) && !tc(ae.name) ? vr(ae.name) : ae.name && pi(ae.name) && !tc(ae.name) ? vr(ae.name).slice(1) : ae.name && yo(ae.name) && i_(ae.name.text, 99) ? ae.name.text : Yr(ae) ? "class" : "member"; return zy(ae) && (rt = `get_${rt}`), Ng(ae) && (rt = `set_${rt}`), ae.name && pi(ae.name) && (rt = `private_${rt}`), Ca(ae) && (rt = `static_${rt}`), "_" + rt } function le(ae, rt) { return t.createUniqueName(`${re(ae)}_${rt}`, 24) } function _e(ae, rt) { return t.createVariableStatement(void 0, t.createVariableDeclarationList([t.createVariableDeclaration(ae, void 0, void 0, rt)], 1)) } function ge(ae) { let rt, Ot, Ke = !1, oe = !1, pe = !1; for (let z of ae.members) if (cse(z) && Kw(!1, z, ae) && (zc(z) ? Ot ?? (Ot = t.createUniqueName("_staticExtraInitializers", 16)) : rt ?? (rt = t.createUniqueName("_instanceExtraInitializers", 16))), oc(z) ? Ke = !0 : Na(z) && (zc(z) ? Ke || (Ke = !!z.initializer || bf(z)) : oe || (oe = !_H(z))), (xu(z) || Id(z)) && zc(z) && (pe = !0), Ot && rt && Ke && oe && pe) break; return { class: ae, instanceExtraInitializersName: rt, staticExtraInitializersName: Ot, hasStaticInitializers: Ke, hasNonAmbientInstanceFields: oe, hasStaticPrivateClassElements: pe } } function X(ae) { for (let rt of ae.members) if ((oc(rt) || Na(rt) && zc(rt)) && rt.transformFlags & 134217728) return !0; return !1 } function Ve(ae, rt) { var Ot, Ke, oe, pe, z; i(); let Te = (Ot = ae.name) != null ? Ot : t.getGeneratedNameForNode(ae), j = ge(ae), yt = [], lt, Qe, Vt, Hn, jr = !1, ei = ce(LK(ae)); if (ei && (j.classDecoratorsName = t.createUniqueName("_classDecorators", 16), j.classDescriptorName = t.createUniqueName("_classDescriptor", 16), j.classExtraInitializersName = t.createUniqueName("_classExtraInitializers", 16), j.classThis = t.createUniqueName("_classThis", 16), yt.push(_e(j.classDecoratorsName, t.createArrayLiteralExpression(ei)), _e(j.classDescriptorName), _e(j.classExtraInitializersName, t.createArrayLiteralExpression()), _e(j.classThis)), j.hasStaticPrivateClassElements && (jr = !0, v = !0)), ei && X(ae)) { let xi = mR(ae.heritageClauses, 94), Nr = xi && Sl(xi.types), Fo = Nr && $e(Nr.expression, R, ot); if (Fo) { j.classSuper = t.createUniqueName("_classSuper", 16); let Qr = ql(Fo), Wi = _u(Qr) && !Qr.name || ms(Qr) && !Qr.name || xs(Qr) ? t.createComma(t.createNumericLiteral(0), Fo) : Fo; yt.push(_e(j.classSuper, Wi)); let gn = t.updateExpressionWithTypeArguments(Nr, j.classSuper, void 0), Ki = t.updateHeritageClause(xi, [gn]); Hn = t.createNodeArray([Ki]) } } else Hn = On(ae.heritageClauses, R, dd); let Kr = (Ke = j.classThis) != null ? Ke : t.createThis(); if (!((oe = ec(ae, Yr)) != null && oe.name) && (ei || !yo(rt) || !CH(rt))) { let xi = r().createSetFunctionNameHelper(t.createThis(), rt); lt = Sn(lt, t.createExpressionStatement(xi)) } A(j); let Ja = On(ae.members, fe, _l); if (m) { let xi; for (let Nr of m) { Nr = $e(Nr, function Qr(Wi) { if (!(Wi.transformFlags & 16384)) return Wi; switch (Wi.kind) { case 108: return xi || (xi = t.createUniqueName("_outerThis", 16), yt.unshift(_e(xi, t.createThis()))), xi; default: return xn(Wi, Qr, e) } }, ot); let Fo = t.createExpressionStatement(Nr); lt = Sn(lt, Fo) } m = void 0 } if (w(), j.instanceExtraInitializersName && !Vm(ae)) { let xi = Ce(ae, j); if (xi) { let Nr = hp(ae), Fo = !!(Nr && ql(Nr.expression).kind !== 104), Qr = []; if (Fo) { let gn = t.createSpreadElement(t.createIdentifier("arguments")), Ki = t.createCallExpression(t.createSuper(), void 0, [gn]); Qr.push(t.createExpressionStatement(Ki)) } si(Qr, xi); let Wi = t.createBlock(Qr, !0); Vt = t.createConstructorDeclaration(void 0, [], Wi) } } if (j.staticExtraInitializersName && yt.push(_e(j.staticExtraInitializersName, t.createArrayLiteralExpression())), j.instanceExtraInitializersName && yt.push(_e(j.instanceExtraInitializersName, t.createArrayLiteralExpression())), j.memberInfos && Ld(j.memberInfos, (xi, Nr) => { Ca(Nr) && (yt.push(_e(xi.memberDecoratorsName)), xi.memberInitializersName && yt.push(_e(xi.memberInitializersName, t.createArrayLiteralExpression())), xi.memberDescriptorName && yt.push(_e(xi.memberDescriptorName))) }), j.memberInfos && Ld(j.memberInfos, (xi, Nr) => { Ca(Nr) || (yt.push(_e(xi.memberDecoratorsName)), xi.memberInitializersName && yt.push(_e(xi.memberInitializersName, t.createArrayLiteralExpression())), xi.memberDescriptorName && yt.push(_e(xi.memberDescriptorName))) }), lt = si(lt, j.staticNonFieldDecorationStatements), lt = si(lt, j.nonStaticNonFieldDecorationStatements), lt = si(lt, j.staticFieldDecorationStatements), lt = si(lt, j.nonStaticFieldDecorationStatements), j.classDescriptorName && j.classDecoratorsName && j.classExtraInitializersName && j.classThis) { lt ?? (lt = []); let xi = t.createPropertyAssignment("value", t.createThis()), Nr = t.createObjectLiteralExpression([xi]), Fo = t.createAssignment(j.classDescriptorName, Nr), Qr = t.createPropertyAccessExpression(t.createThis(), "name"), Wi = r().createESDecorateHelper(t.createNull(), Fo, j.classDecoratorsName, { kind: "class", name: Qr }, t.createNull(), j.classExtraInitializersName), gn = t.createExpressionStatement(Wi); Ho(gn, $y(ae)), lt.push(gn); let Ki = t.createPropertyAccessExpression(j.classDescriptorName, "value"), kc = t.createAssignment(j.classThis, Ki), Ps = t.createAssignment(Te, kc); lt.push(t.createExpressionStatement(Ps)) } if (j.staticExtraInitializersName) { let xi = r().createRunInitializersHelper(Kr, j.staticExtraInitializersName), Nr = t.createExpressionStatement(xi); Ho(Nr, (pe = ae.name) != null ? pe : $y(ae)), lt = Sn(lt, Nr) } if (j.classExtraInitializersName) { let xi = r().createRunInitializersHelper(Kr, j.classExtraInitializersName), Nr = t.createExpressionStatement(xi); Ho(Nr, (z = ae.name) != null ? z : $y(ae)), Qe = Sn(Qe, Nr) } lt && Qe && !j.hasStaticInitializers && (si(lt, Qe), Qe = void 0); let Za = Ja; if (lt) { let xi = t.createBlock(lt, !0), Nr = t.createClassStaticBlockDeclaration(xi); jr && eO(Nr, 32), Za = [Nr, ...Za] } if (Vt && (Za = [...Za, Vt]), Qe) { let xi = t.createBlock(Qe, !0), Nr = t.createClassStaticBlockDeclaration(xi); Za = [...Za, Nr] } Za !== Ja && (Ja = it(t.createNodeArray(Za), Ja)); let Fa = o(), Hi; if (ei) { Hi = t.createClassExpression(void 0, void 0, void 0, Hn, Ja); let xi = t.createVariableDeclaration(Te, void 0, void 0, Hi), Nr = t.createVariableDeclarationList([xi]), Fo = j.classThis ? t.createAssignment(Te, j.classThis) : Te; yt.push(t.createVariableStatement(void 0, Nr), t.createReturnStatement(Fo)) } else Hi = t.createClassExpression(void 0, ae.name, void 0, Hn, Ja), yt.push(t.createReturnStatement(Hi)); if (jr) { SS(Hi, 32); for (let xi of Hi.members) (xu(xi) || Id(xi)) && zc(xi) && SS(xi, 32) } return Ir(Hi, ae), Lu(Hi).classThis = j.classThis, t.createImmediatelyInvokedArrowFunction(t.mergeLexicalEnvironment(yt, Fa)) } function we(ae) { return O0(!1, ae) || kI(!1, ae) } function ke(ae) { var rt; if (we(ae)) if (Mr(ae, 1) && Mr(ae, 1024)) { let Ot = (rt = ec(ae, Yr)) != null ? rt : ae, Ke = Ot.name ? t.createStringLiteralFromNode(Ot.name) : t.createStringLiteral("default"), oe = Ve(ae, Ke), pe = t.createExportDefault(oe); return Ir(pe, ae), hl(pe, sm(ae)), Ho(pe, $y(ae)), pe } else { L.assertIsDefined(ae.name, "A class declaration that is not a default export must have a name."); let Ot = Ve(ae, t.createStringLiteralFromNode(ae.name)), Ke = On(ae.modifiers, $, Ha), oe = t.createVariableDeclaration(ae.name, void 0, void 0, Ot), pe = t.createVariableDeclarationList([oe], 1), z = t.createVariableStatement(Ke, pe); return Ir(z, ae), hl(z, sm(ae)), z } else { let Ot = On(ae.modifiers, $, Ha), Ke = On(ae.heritageClauses, R, dd); A(void 0); let oe = On(ae.members, fe, _l); return w(), t.updateClassDeclaration(ae, Ot, ae.name, void 0, Ke, oe) } } function Pe(ae, rt) { if (we(ae)) { let Ot = ae.name ? t.createStringLiteralFromNode(ae.name) : rt ?? t.createStringLiteral(""), Ke = Ve(ae, Ot); return Ir(Ke, ae), Ke } else { let Ot = On(ae.modifiers, $, Ha), Ke = On(ae.heritageClauses, R, dd); A(void 0); let oe = On(ae.members, fe, _l); return w(), t.updateClassExpression(ae, Ot, ae.name, void 0, Ke, oe) } } function Ce(ae, rt) { if (rt.instanceExtraInitializersName && !rt.hasNonAmbientInstanceFields) { let Ot = []; return Ot.push(t.createExpressionStatement(r().createRunInitializersHelper(t.createThis(), rt.instanceExtraInitializersName))), Ot } } function Ie(ae) { C(ae); let rt = On(ae.modifiers, $, Ha), Ot = On(ae.parameters, R, ha), Ke; if (ae.body && f) { let oe = Ce(f.class, f); if (oe) { let pe = [], z = t.copyPrologue(ae.body.statements, pe, !1, R), Te = bF(ae.body.statements, z), j = Te >= 0 ? Te + 1 : void 0; si(pe, On(ae.body.statements, R, ca, z, j ? j - z : void 0)), si(pe, oe), si(pe, On(ae.body.statements, R, ca, j)), Ke = t.createBlock(pe, !0), Ir(Ke, ae.body), it(Ke, ae.body) } } return Ke ?? (Ke = $e(ae.body, R, Va)), P(), t.updateConstructorDeclaration(ae, rt, Ot, Ke) } function Be(ae, rt) { return ae !== rt && (hl(ae, rt), Ho(ae, $y(rt))), ae } function Ne(ae, rt, Ot, Ke) { var oe, pe, z, Te, j, yt, lt, Qe; let Vt, Hn, jr, ei, Kr; if (!Ot) { let Za = On(ae.modifiers, $, Ha); return F(), rt ? { referencedName: Vt, name: Hn } = gr(ae.name) : Hn = pt(ae.name), B(), { modifiers: Za, referencedName: Vt, name: Hn, initializersName: jr, descriptorName: Kr, thisArg: ei } } let Si = ce(TF(ae, Ot.class, !1)), Ja = On(ae.modifiers, $, Ha); if (Si) { let Za = le(ae, "decorators"), Fa = t.createArrayLiteralExpression(Si), Hi = t.createAssignment(Za, Fa), xi = { memberDecoratorsName: Za }; (oe = Ot.memberInfos) != null || (Ot.memberInfos = new Map), Ot.memberInfos.set(ae, xi), m ?? (m = []), m.push(Hi); let Nr = xA(ae) || Id(ae) ? Ca(ae) ? (pe = Ot.staticNonFieldDecorationStatements) != null ? pe : Ot.staticNonFieldDecorationStatements = [] : (z = Ot.nonStaticNonFieldDecorationStatements) != null ? z : Ot.nonStaticNonFieldDecorationStatements = [] : Na(ae) && !Id(ae) ? Ca(ae) ? (Te = Ot.staticFieldDecorationStatements) != null ? Te : Ot.staticFieldDecorationStatements = [] : (j = Ot.nonStaticFieldDecorationStatements) != null ? j : Ot.nonStaticFieldDecorationStatements = [] : L.fail(), Fo = p_(ae) ? "getter" : Sf(ae) ? "setter" : Nc(ae) ? "method" : Id(ae) ? "accessor" : Na(ae) ? "field" : L.fail(), Qr; if (Re(ae.name) || pi(ae.name)) Qr = { computed: !1, name: ae.name }; else if (c_(ae.name)) Qr = { computed: !0, name: t.createStringLiteralFromNode(ae.name) }; else { let Ki = ae.name.expression; c_(Ki) && !Re(Ki) ? Qr = { computed: !0, name: t.createStringLiteralFromNode(Ki) } : (F(), { referencedName: Vt, name: Hn } = gr(ae.name), Qr = { computed: !0, name: Vt }, B()) } let Wi = { kind: Fo, name: Qr, static: Ca(ae), private: pi(ae.name), access: { get: Na(ae) || p_(ae) || Nc(ae), set: Na(ae) || Sf(ae) } }, gn = Ca(ae) ? (yt = Ot.staticExtraInitializersName) != null ? yt : Ot.staticExtraInitializersName = t.createUniqueName("_staticExtraInitializers", 16) : (lt = Ot.instanceExtraInitializersName) != null ? lt : Ot.instanceExtraInitializersName = t.createUniqueName("_instanceExtraInitializers", 16); if (xA(ae)) { let Ki; xu(ae) && Ke && (Ki = Ke(ae, On(Ja, mc => zr(mc, mL), Ha)), xi.memberDescriptorName = Kr = le(ae, "descriptor"), Ki = t.createAssignment(Kr, Ki)); let kc = r().createESDecorateHelper(t.createThis(), Ki ?? t.createNull(), Za, Wi, t.createNull(), gn), Ps = t.createExpressionStatement(kc); Ho(Ps, $y(ae)), Nr.push(Ps) } else if (Na(ae)) { jr = (Qe = xi.memberInitializersName) != null ? Qe : xi.memberInitializersName = le(ae, "initializers"), Ca(ae) && (ei = Ot.classThis); let Ki; xu(ae) && rm(ae) && Ke && (Ki = Ke(ae, void 0), xi.memberDescriptorName = Kr = le(ae, "descriptor"), Ki = t.createAssignment(Kr, Ki)); let kc = r().createESDecorateHelper(Id(ae) ? t.createThis() : t.createNull(), Ki ?? t.createNull(), Za, Wi, jr, gn), Ps = t.createExpressionStatement(kc); Ho(Ps, $y(ae)), Nr.push(Ps) } } return Hn === void 0 && (F(), rt ? { referencedName: Vt, name: Hn } = gr(ae.name) : Hn = pt(ae.name), B()), !vt(Ja) && (Nc(ae) || Na(ae)) && Jn(Hn, 1024), { modifiers: Ja, referencedName: Vt, name: Hn, initializersName: jr, descriptorName: Kr, thisArg: ei } } function Le(ae) { C(ae); let { modifiers: rt, name: Ot, descriptorName: Ke } = Ne(ae, !1, f, G); if (Ke) return P(), Be(kt(rt, Ot, Ke), ae); { let oe = On(ae.parameters, R, ha), pe = $e(ae.body, R, Va); return P(), Be(t.updateMethodDeclaration(ae, rt, ae.asteriskToken, Ot, void 0, void 0, oe, void 0, pe), ae) } } function Ye(ae) { C(ae); let { modifiers: rt, name: Ot, descriptorName: Ke } = Ne(ae, !1, f, Oe); if (Ke) return P(), Be(Kt(rt, Ot, Ke), ae); { let oe = On(ae.parameters, R, ha), pe = $e(ae.body, R, Va); return P(), Be(t.updateGetAccessorDeclaration(ae, rt, Ot, oe, void 0, pe), ae) } } function _t(ae) { C(ae); let { modifiers: rt, name: Ot, descriptorName: Ke } = Ne(ae, !1, f, je); if (Ke) return P(), Be(ln(rt, Ot, Ke), ae); { let oe = On(ae.parameters, R, ha), pe = $e(ae.body, R, Va); return P(), Be(t.updateSetAccessorDeclaration(ae, rt, Ot, oe, pe), ae) } } function ct(ae) { C(ae), f && (f.hasStaticInitializers = !0); let rt = xn(ae, R, e); return P(), rt } function Rt(ae) { C(ae), L.assert(!_H(ae), "Not yet implemented."); let rt = vf(ae, _n), { modifiers: Ot, name: Ke, referencedName: oe, initializersName: pe, descriptorName: z, thisArg: Te } = Ne(ae, rt, f, rm(ae) ? Ge : void 0); i(); let j = oe ? $e(ae.initializer, lt => Z(lt, oe), ot) : $e(ae.initializer, R, ot); pe && (j = r().createRunInitializersHelper(Te ?? t.createThis(), pe, j ?? t.createVoidZero())), !Ca(ae) && f?.instanceExtraInitializersName && !f?.hasInjectedInstanceInitializers && (f.hasInjectedInstanceInitializers = !0, j ?? (j = t.createVoidZero()), j = t.createParenthesizedExpression(t.createComma(r().createRunInitializersHelper(t.createThis(), f.instanceExtraInitializersName), j))), Ca(ae) && f && j && (f.hasStaticInitializers = !0); let yt = o(); if (vt(yt) && (j = t.createImmediatelyInvokedArrowFunction([...yt, t.createReturnStatement(j)])), P(), rm(ae) && z) { let lt = sm(ae), Qe = pb(ae), Vt = ae.name, Hn = Vt, jr = Vt; if (ts(Vt) && !Ap(Vt.expression)) { let Za = L3(Vt); if (Za) Hn = t.updateComputedPropertyName(Vt, $e(Vt.expression, R, ot)), jr = t.updateComputedPropertyName(Vt, Za.left); else { let Fa = t.createTempVariable(s); Ho(Fa, Vt.expression); let Hi = $e(Vt.expression, R, ot), xi = t.createAssignment(Fa, Hi); Ho(xi, Vt.expression), Hn = t.updateComputedPropertyName(Vt, xi), jr = t.updateComputedPropertyName(Vt, Fa) } } let ei = On(Ot, Za => Za.kind !== 127 ? Za : void 0, Ha), Kr = sJ(t, ae, ei, j); Ir(Kr, ae), Jn(Kr, 3072), Ho(Kr, Qe), Ho(Kr.name, ae.name); let Si = Kt(ei, Hn, z); Ir(Si, ae), hl(Si, lt), Ho(Si, Qe); let Ja = ln(ei, jr, z); return Ir(Ja, ae), Jn(Ja, 3072), Ho(Ja, Qe), [Kr, Si, Ja] } return Be(t.updatePropertyDeclaration(ae, Ot, Ke, void 0, void 0, j), ae) } function We(ae) { return d ?? ae } function qe(ae) { if (Pu(ae.expression) && d) { let rt = $e(ae.expression, R, ot), Ot = On(ae.arguments, R, ot), Ke = t.createFunctionCallCall(rt, d, Ot); return Ir(Ke, ae), it(Ke, ae), Ke } return xn(ae, R, e) } function zt(ae) { if (Pu(ae.tag) && d) { let rt = $e(ae.tag, R, ot), Ot = t.createFunctionBindCall(rt, d, []); Ir(Ot, ae), it(Ot, ae); let Ke = $e(ae.template, R, AA); return t.updateTaggedTemplateExpression(ae, Ot, void 0, Ke) } return xn(ae, R, e) } function Qt(ae) { if (Pu(ae) && Re(ae.name) && d && g) { let rt = t.createStringLiteralFromNode(ae.name), Ot = t.createReflectGetCall(g, rt, d); return Ir(Ot, ae.expression), it(Ot, ae.expression), Ot } return xn(ae, R, e) } function tn(ae) { if (Pu(ae) && d && g) { let rt = $e(ae.argumentExpression, R, ot), Ot = t.createReflectGetCall(g, rt, d); return Ir(Ot, ae.expression), it(Ot, ae.expression), Ot } return xn(ae, R, e) } function kn(ae) { let rt; if (vf(ae, _n)) { let Ot = ir(ae.name, ae.initializer), Ke = $e(ae.name, R, Mm), oe = $e(ae.initializer, pe => Z(pe, Ot), ot); rt = t.updateParameterDeclaration(ae, void 0, void 0, Ke, void 0, void 0, oe) } else rt = t.updateParameterDeclaration(ae, void 0, ae.dotDotDotToken, $e(ae.name, R, Mm), void 0, void 0, $e(ae.initializer, R, ot)); return rt !== ae && (hl(rt, ae), it(rt, yp(ae)), Ho(rt, yp(ae)), Jn(rt.name, 64)), rt } function _n(ae) { return _u(ae) && !ae.name && we(ae) } function Gt(ae) { return t.updateForStatement(ae, $e(ae.initializer, U, pp), $e(ae.condition, R, ot), $e(ae.incrementor, U, ot), jf(ae.statement, R, e)) } function $n(ae) { return xn(ae, U, e) } function ui(ae, rt) { if (Fg(ae)) { let Ot = Se(ae.left), Ke = $e(ae.right, R, ot); return t.updateBinaryExpression(ae, Ot, ae.operatorToken, Ke) } if (Iu(ae)) { if (vf(ae, _n)) { let Ot = ir(ae.left, ae.right), Ke = $e(ae.left, R, ot), oe = $e(ae.right, pe => Z(pe, Ot), ot); return t.updateBinaryExpression(ae, Ke, ae.operatorToken, oe) } if (Pu(ae.left) && d && g) { let Ot = Vs(ae.left) ? $e(ae.left.argumentExpression, R, ot) : Re(ae.left.name) ? t.createStringLiteralFromNode(ae.left.name) : void 0; if (Ot) { let Ke = $e(ae.right, R, ot); if (oN(ae.operatorToken.kind)) { let pe = Ot; Ap(Ot) || (pe = t.createTempVariable(s), Ot = t.createAssignment(pe, Ot)); let z = t.createReflectGetCall(g, pe, d); Ir(z, ae.left), it(z, ae.left), Ke = t.createBinaryExpression(z, WL(ae.operatorToken.kind), Ke), it(Ke, ae) } let oe = rt ? void 0 : t.createTempVariable(s); return oe && (Ke = t.createAssignment(oe, Ke), it(oe, ae)), Ke = t.createReflectSetCall(g, Ot, Ke, d), Ir(Ke, ae), it(Ke, ae), oe && (Ke = t.createComma(Ke, oe), it(Ke, ae)), Ke } } } if (ae.operatorToken.kind === 27) { let Ot = $e(ae.left, U, ot), Ke = $e(ae.right, rt ? U : R, ot); return t.updateBinaryExpression(ae, Ot, ae.operatorToken, Ke) } return xn(ae, R, e) } function Ni(ae, rt) { if (ae.operator === 45 || ae.operator === 46) { let Ot = vs(ae.operand); if (Pu(Ot) && d && g) { let Ke = Vs(Ot) ? $e(Ot.argumentExpression, R, ot) : Re(Ot.name) ? t.createStringLiteralFromNode(Ot.name) : void 0; if (Ke) { let oe = Ke; Ap(Ke) || (oe = t.createTempVariable(s), Ke = t.createAssignment(oe, Ke)); let pe = t.createReflectGetCall(g, oe, d); Ir(pe, ae), it(pe, ae); let z = rt ? void 0 : t.createTempVariable(s); return pe = b3(t, ae, pe, s, z), pe = t.createReflectSetCall(g, Ke, pe, d), Ir(pe, ae), it(pe, ae), z && (pe = t.createComma(pe, z), it(pe, ae)), pe } } } return xn(ae, R, e) } function Pi(ae, rt) { let Ot = rt ? aN(ae.elements, U) : aN(ae.elements, R, U); return t.updateCommaListExpression(ae, Ot) } function gr(ae) { if (c_(ae) || pi(ae)) { let pe = t.createStringLiteralFromNode(ae), z = $e(ae, R, Ys); return { referencedName: pe, name: z } } if (c_(ae.expression) && !Re(ae.expression)) { let pe = t.createStringLiteralFromNode(ae.expression), z = $e(ae, R, Ys); return { referencedName: pe, name: z } } let rt = t.getGeneratedNameForNode(ae); s(rt); let Ot = r().createPropKeyHelper($e(ae.expression, R, ot)), Ke = t.createAssignment(rt, Ot), oe = t.updateComputedPropertyName(ae, nt(Ke)); return { referencedName: rt, name: oe } } function pt(ae) { return ts(ae) ? nn(ae) : $e(ae, R, Ys) } function nn(ae) { let rt = $e(ae.expression, R, ot); return Ap(rt) || (rt = nt(rt)), t.updateComputedPropertyName(ae, rt) } function Dt(ae) { if (vf(ae, _n)) { let { referencedName: rt, name: Ot } = gr(ae.name), Ke = $e(ae.initializer, oe => Z(oe, rt), ot); return t.updatePropertyAssignment(ae, Ot, Ke) } return xn(ae, R, e) } function pn(ae) { if (vf(ae, _n)) { let rt = ir(ae.name, ae.initializer), Ot = $e(ae.name, R, Mm), Ke = $e(ae.initializer, oe => Z(oe, rt), ot); return t.updateVariableDeclaration(ae, Ot, void 0, void 0, Ke) } return xn(ae, R, e) } function An(ae) { if (vf(ae, _n)) { let rt = ir(ae.name, ae.initializer), Ot = $e(ae.propertyName, R, Ys), Ke = $e(ae.name, R, Mm), oe = $e(ae.initializer, pe => Z(pe, rt), ot); return t.updateBindingElement(ae, void 0, Ot, Ke, oe) } return xn(ae, R, e) } function Kn(ae) { if (rs(ae) || fu(ae)) return Se(ae); if (Pu(ae) && d && g) { let rt = Vs(ae) ? $e(ae.argumentExpression, R, ot) : Re(ae.name) ? t.createStringLiteralFromNode(ae.name) : void 0; if (rt) { let Ot = t.createTempVariable(void 0), Ke = t.createAssignmentTargetWrapper(Ot, t.createReflectSetCall(g, rt, Ot, d)); return Ir(Ke, ae), it(Ke, ae), Ke } } return xn(ae, R, e) } function hi(ae) { if (Iu(ae, !0)) { let rt = Kn(ae.left), Ot; if (vf(ae, _n)) { let Ke = ir(ae.left, ae.right); Ot = $e(ae.right, oe => Z(oe, Ke), ot) } else Ot = $e(ae.right, R, ot); return t.updateBinaryExpression(ae, rt, ae.operatorToken, Ot) } else return Kn(ae) } function ri(ae) { if (Ju(ae.expression)) { let rt = Kn(ae.expression); return t.updateSpreadElement(ae, rt) } return xn(ae, R, e) } function vn(ae) { return L.assertNode(ae, ww), Km(ae) ? ri(ae) : ol(ae) ? xn(ae, R, e) : hi(ae) } function Ht(ae) { let rt = $e(ae.name, R, Ys); if (Iu(ae.initializer, !0)) { let Ot = hi(ae.initializer); return t.updatePropertyAssignment(ae, rt, Ot) } if (Ju(ae.initializer)) { let Ot = Kn(ae.initializer); return t.updatePropertyAssignment(ae, rt, Ot) } return xn(ae, R, e) } function En(ae) { if (vf(ae, _n)) { let rt = ir(ae.name, ae.objectAssignmentInitializer), Ot = $e(ae.name, R, Re), Ke = $e(ae.objectAssignmentInitializer, oe => Z(oe, rt), ot); return t.updateShorthandPropertyAssignment(ae, Ot, Ke) } return xn(ae, R, e) } function dr(ae) { if (Ju(ae.expression)) { let rt = Kn(ae.expression); return t.updateSpreadAssignment(ae, rt) } return xn(ae, R, e) } function Cr(ae) { return L.assertNode(ae, Dw), VS(ae) ? dr(ae) : xf(ae) ? En(ae) : yl(ae) ? Ht(ae) : xn(ae, R, e) } function Se(ae) { if (fu(ae)) { let rt = On(ae.elements, vn, ot); return t.updateArrayLiteralExpression(ae, rt) } else { let rt = On(ae.properties, Cr, Og); return t.updateObjectLiteralExpression(ae, rt) } } function at(ae) { if (vf(ae, _n)) { let rt = t.createStringLiteral(ae.isExportEquals ? "" : "default"), Ot = On(ae.modifiers, $, Ha), Ke = $e(ae.expression, oe => Z(oe, rt), ot); return t.updateExportAssignment(ae, Ot, Ke) } return xn(ae, R, e) } function Tt(ae, rt, Ot) { let Ke = rt ? U : Ot ? pe => Z(pe, Ot) : R, oe = $e(ae.expression, Ke, ot); return t.updateParenthesizedExpression(ae, oe) } function ve(ae, rt, Ot) { let Ke = rt ? U : Ot ? pe => Z(pe, Ot) : R, oe = $e(ae.expression, Ke, ot); return t.updatePartiallyEmittedExpression(ae, oe) } function nt(ae) { return vt(m) && (ud(ae) ? (m.push(ae.expression), ae = t.updateParenthesizedExpression(ae, t.inlineExpressions(m))) : (m.push(ae), ae = t.inlineExpressions(m)), m = void 0), ae } function ce(ae) { if (!ae) return; let rt = []; return si(rt, on(ae.decorators, Q)), rt } function Q(ae) { let rt = $e(ae.expression, R, ot); return Jn(rt, 3072), rt } function ue(ae, rt, Ot, Ke, oe, pe, z) { let Te = t.createFunctionExpression(Ot, Ke, void 0, void 0, pe, void 0, z ?? t.createBlock([])); Ir(Te, ae), Ho(Te, $y(ae)), Jn(Te, 3072); let j = oe === "get" || oe === "set" ? oe : void 0, yt = t.createStringLiteralFromNode(rt, void 0), lt = r().createSetFunctionNameHelper(Te, yt, j), Qe = t.createPropertyAssignment(t.createIdentifier(oe), lt); return Ir(Qe, ae), Ho(Qe, $y(ae)), Jn(Qe, 3072), Qe } function G(ae, rt) { return t.createObjectLiteralExpression([ue(ae, ae.name, rt, ae.asteriskToken, "value", On(ae.parameters, R, ha), $e(ae.body, R, Va))]) } function Oe(ae, rt) { return t.createObjectLiteralExpression([ue(ae, ae.name, rt, void 0, "get", [], $e(ae.body, R, Va))]) } function je(ae, rt) { return t.createObjectLiteralExpression([ue(ae, ae.name, rt, void 0, "set", On(ae.parameters, R, ha), $e(ae.body, R, Va))]) } function Ge(ae, rt) { return t.createObjectLiteralExpression([ue(ae, ae.name, rt, void 0, "get", [], t.createBlock([t.createReturnStatement(t.createPropertyAccessExpression(t.createThis(), t.getGeneratedPrivateNameForNode(ae.name)))])), ue(ae, ae.name, rt, void 0, "set", [t.createParameterDeclaration(void 0, void 0, "value")], t.createBlock([t.createExpressionStatement(t.createAssignment(t.createPropertyAccessExpression(t.createThis(), t.getGeneratedPrivateNameForNode(ae.name)), t.createIdentifier("value")))]))]) } function kt(ae, rt, Ot) { return ae = On(ae, Ke => LS(Ke) ? Ke : void 0, Ha), t.createGetAccessorDeclaration(ae, rt, [], void 0, t.createBlock([t.createReturnStatement(t.createPropertyAccessExpression(Ot, t.createIdentifier("value")))])) } function Kt(ae, rt, Ot) { return ae = On(ae, Ke => LS(Ke) ? Ke : void 0, Ha), t.createGetAccessorDeclaration(ae, rt, [], void 0, t.createBlock([t.createReturnStatement(t.createFunctionCallCall(t.createPropertyAccessExpression(Ot, t.createIdentifier("get")), t.createThis(), []))])) } function ln(ae, rt, Ot) { return ae = On(ae, Ke => LS(Ke) ? Ke : void 0, Ha), t.createSetAccessorDeclaration(ae, rt, [t.createParameterDeclaration(void 0, void 0, "value")], t.createBlock([t.createReturnStatement(t.createFunctionCallCall(t.createPropertyAccessExpression(Ot, t.createIdentifier("set")), t.createThis(), [t.createIdentifier("value")]))])) } function ir(ae, rt) { let Ot = ec(rt, Yr); return Ot && !Ot.name && Mr(Ot, 1024) ? t.createStringLiteral("default") : t.createStringLiteralFromNode(ae) } } var lMe = gt({ "src/compiler/transformers/esDecorators.ts"() { "use strict"; fa() } }); function ape(e) { let { factory: t, getEmitHelperFactory: r, resumeLexicalEnvironment: i, endLexicalEnvironment: o, hoistVariableDeclaration: s } = e, l = e.getEmitResolver(), f = e.getCompilerOptions(), d = Do(f), g, m = 0, v, S, x, A = [], w = 0, C = e.onEmitNode, P = e.onSubstituteNode; return e.onEmitNode = kn, e.onSubstituteNode = _n, y_(e, F); function F(pt) { if (pt.isDeclarationFile) return pt; B(1, !1), B(2, !fH(pt, f)); let nn = xn(pt, $, e); return Bg(nn, e.readEmitHelpers()), nn } function B(pt, nn) { w = nn ? w | pt : w & ~pt } function q(pt) { return (w & pt) !== 0 } function W() { return !q(1) } function Y() { return q(2) } function R(pt, nn, Dt) { let pn = pt & ~w; if (pn) { B(pn, !0); let An = nn(Dt); return B(pn, !1), An } return nn(Dt) } function ie(pt) { return xn(pt, $, e) } function $(pt) { if (!(pt.transformFlags & 256)) return pt; switch (pt.kind) { case 132: return; case 220: return ge(pt); case 171: return R(3, Ve, pt); case 259: return R(3, Pe, pt); case 215: return R(3, Ce, pt); case 216: return R(1, Ie, pt); case 208: return S && br(pt) && pt.expression.kind === 106 && S.add(pt.name.escapedText), xn(pt, $, e); case 209: return S && pt.expression.kind === 106 && (x = !0), xn(pt, $, e); case 174: return R(3, we, pt); case 175: return R(3, ke, pt); case 173: return R(3, X, pt); case 260: case 228: return R(3, ie, pt); default: return xn(pt, $, e) } } function fe(pt) { if (vce(pt)) switch (pt.kind) { case 240: return U(pt); case 245: return _e(pt); case 246: return re(pt); case 247: return le(pt); case 295: return Z(pt); case 238: case 252: case 266: case 292: case 293: case 255: case 243: case 244: case 242: case 251: case 253: return xn(pt, fe, e); default: return L.assertNever(pt, "Unhandled node.") }return $(pt) } function Z(pt) { let nn = new Set; Be(pt.variableDeclaration, nn); let Dt; if (nn.forEach((pn, An) => { v.has(An) && (Dt || (Dt = new Set(v)), Dt.delete(An)) }), Dt) { let pn = v; v = Dt; let An = xn(pt, fe, e); return v = pn, An } else return xn(pt, fe, e) } function U(pt) { if (Ne(pt.declarationList)) { let nn = Le(pt.declarationList, !1); return nn ? t.createExpressionStatement(nn) : void 0 } return xn(pt, $, e) } function re(pt) { return t.updateForInStatement(pt, Ne(pt.initializer) ? Le(pt.initializer, !0) : L.checkDefined($e(pt.initializer, $, pp)), L.checkDefined($e(pt.expression, $, ot)), jf(pt.statement, fe, e)) } function le(pt) { return t.updateForOfStatement(pt, $e(pt.awaitModifier, $, Dz), Ne(pt.initializer) ? Le(pt.initializer, !0) : L.checkDefined($e(pt.initializer, $, pp)), L.checkDefined($e(pt.expression, $, ot)), jf(pt.statement, fe, e)) } function _e(pt) { let nn = pt.initializer; return t.updateForStatement(pt, Ne(nn) ? Le(nn, !1) : $e(pt.initializer, $, pp), $e(pt.condition, $, ot), $e(pt.incrementor, $, ot), jf(pt.statement, fe, e)) } function ge(pt) { return W() ? xn(pt, $, e) : Ir(it(t.createYieldExpression(void 0, $e(pt.expression, $, ot)), pt), pt) } function X(pt) { return t.updateConstructorDeclaration(pt, On(pt.modifiers, $, Ha), Sc(pt.parameters, $, e), We(pt)) } function Ve(pt) { return t.updateMethodDeclaration(pt, On(pt.modifiers, $, Ns), pt.asteriskToken, pt.name, void 0, void 0, Sc(pt.parameters, $, e), void 0, pl(pt) & 2 ? qe(pt) : We(pt)) } function we(pt) { return t.updateGetAccessorDeclaration(pt, On(pt.modifiers, $, Ns), pt.name, Sc(pt.parameters, $, e), void 0, We(pt)) } function ke(pt) { return t.updateSetAccessorDeclaration(pt, On(pt.modifiers, $, Ns), pt.name, Sc(pt.parameters, $, e), We(pt)) } function Pe(pt) { return t.updateFunctionDeclaration(pt, On(pt.modifiers, $, Ns), pt.asteriskToken, pt.name, void 0, Sc(pt.parameters, $, e), void 0, pl(pt) & 2 ? qe(pt) : Zd(pt.body, $, e)) } function Ce(pt) { return t.updateFunctionExpression(pt, On(pt.modifiers, $, Ha), pt.asteriskToken, pt.name, void 0, Sc(pt.parameters, $, e), void 0, pl(pt) & 2 ? qe(pt) : Zd(pt.body, $, e)) } function Ie(pt) { return t.updateArrowFunction(pt, On(pt.modifiers, $, Ha), void 0, Sc(pt.parameters, $, e), void 0, pt.equalsGreaterThanToken, pl(pt) & 2 ? qe(pt) : Zd(pt.body, $, e)) } function Be({ name: pt }, nn) { if (Re(pt)) nn.add(pt.escapedText); else for (let Dt of pt.elements) ol(Dt) || Be(Dt, nn) } function Ne(pt) { return !!pt && pu(pt) && !(pt.flags & 3) && pt.declarations.some(Rt) } function Le(pt, nn) { Ye(pt); let Dt = qI(pt); return Dt.length === 0 ? nn ? $e(t.converters.convertToAssignmentElementTarget(pt.declarations[0].name), $, ot) : void 0 : t.inlineExpressions(on(Dt, ct)) } function Ye(pt) { mn(pt.declarations, _t) } function _t({ name: pt }) { if (Re(pt)) s(pt); else for (let nn of pt.elements) ol(nn) || _t(nn) } function ct(pt) { let nn = Ho(t.createAssignment(t.converters.convertToAssignmentElementTarget(pt.name), pt.initializer), pt); return L.checkDefined($e(nn, $, ot)) } function Rt({ name: pt }) { if (Re(pt)) return v.has(pt.escapedText); for (let nn of pt.elements) if (!ol(nn) && Rt(nn)) return !0; return !1 } function We(pt) { L.assertIsDefined(pt.body); let nn = S, Dt = x; S = new Set, x = !1; let pn = Zd(pt.body, $, e), An = ec(pt, Ds); if (d >= 2 && l.getNodeCheckFlags(pt) & 384 && (pl(An) & 3) !== 3) { if (tn(), S.size) { let hi = SF(t, l, pt, S); A[zo(hi)] = !0; let ri = pn.statements.slice(); em(ri, [hi]), pn = t.updateBlock(pn, ri) } x && (l.getNodeCheckFlags(pt) & 256 ? xS(pn, sO) : l.getNodeCheckFlags(pt) & 128 && xS(pn, oO)) } return S = nn, x = Dt, pn } function qe(pt) { i(); let Dt = ec(pt, Ia).type, pn = d < 2 ? Qt(Dt) : void 0, An = pt.kind === 216, Kn = (l.getNodeCheckFlags(pt) & 512) !== 0, hi = v; v = new Set; for (let En of pt.parameters) Be(En, v); let ri = S, vn = x; An || (S = new Set, x = !1); let Ht; if (An) { let En = r().createAwaiterHelper(Y(), Kn, pn, zt(pt.body)), dr = o(); if (vt(dr)) { let Cr = t.converters.convertToFunctionBlock(En); Ht = t.updateBlock(Cr, it(t.createNodeArray(Qi(dr, Cr.statements)), Cr.statements)) } else Ht = En } else { let En = [], dr = t.copyPrologue(pt.body.statements, En, !1, $); En.push(t.createReturnStatement(r().createAwaiterHelper(Y(), Kn, pn, zt(pt.body, dr)))), em(En, o()); let Cr = d >= 2 && l.getNodeCheckFlags(pt) & 384; if (Cr && (tn(), S.size)) { let at = SF(t, l, pt, S); A[zo(at)] = !0, em(En, [at]) } let Se = t.createBlock(En, !0); it(Se, pt.body), Cr && x && (l.getNodeCheckFlags(pt) & 256 ? xS(Se, sO) : l.getNodeCheckFlags(pt) & 128 && xS(Se, oO)), Ht = Se } return v = hi, An || (S = ri, x = vn), Ht } function zt(pt, nn) { return Va(pt) ? t.updateBlock(pt, On(pt.statements, fe, ca, nn)) : t.converters.convertToFunctionBlock(L.checkDefined($e(pt, fe, u6))) } function Qt(pt) { let nn = pt && Jw(pt); if (nn && Cd(nn)) { let Dt = l.getTypeReferenceSerializationKind(nn); if (Dt === 1 || Dt === 0) return nn } } function tn() { g & 1 || (g |= 1, e.enableSubstitution(210), e.enableSubstitution(208), e.enableSubstitution(209), e.enableEmitNotification(260), e.enableEmitNotification(171), e.enableEmitNotification(174), e.enableEmitNotification(175), e.enableEmitNotification(173), e.enableEmitNotification(240)) } function kn(pt, nn, Dt) { if (g & 1 && Pi(nn)) { let pn = l.getNodeCheckFlags(nn) & 384; if (pn !== m) { let An = m; m = pn, C(pt, nn, Dt), m = An; return } } else if (g && A[zo(nn)]) { let pn = m; m = 0, C(pt, nn, Dt), m = pn; return } C(pt, nn, Dt) } function _n(pt, nn) { return nn = P(pt, nn), pt === 1 && m ? Gt(nn) : nn } function Gt(pt) { switch (pt.kind) { case 208: return $n(pt); case 209: return ui(pt); case 210: return Ni(pt) }return pt } function $n(pt) { return pt.expression.kind === 106 ? it(t.createPropertyAccessExpression(t.createUniqueName("_super", 48), pt.name), pt) : pt } function ui(pt) { return pt.expression.kind === 106 ? gr(pt.argumentExpression, pt) : pt } function Ni(pt) { let nn = pt.expression; if (Pu(nn)) { let Dt = br(nn) ? $n(nn) : ui(nn); return t.createCallExpression(t.createPropertyAccessExpression(Dt, "call"), void 0, [t.createThis(), ...pt.arguments]) } return pt } function Pi(pt) { let nn = pt.kind; return nn === 260 || nn === 173 || nn === 171 || nn === 174 || nn === 175 } function gr(pt, nn) { return m & 256 ? it(t.createPropertyAccessExpression(t.createCallExpression(t.createUniqueName("_superIndex", 48), void 0, [pt]), "value"), nn) : it(t.createCallExpression(t.createUniqueName("_superIndex", 48), void 0, [pt]), nn) } } function SF(e, t, r, i) { let o = (t.getNodeCheckFlags(r) & 256) !== 0, s = []; return i.forEach((l, f) => { let d = Gi(f), g = []; g.push(e.createPropertyAssignment("get", e.createArrowFunction(void 0, void 0, [], void 0, void 0, Jn(e.createPropertyAccessExpression(Jn(e.createSuper(), 8), d), 8)))), o && g.push(e.createPropertyAssignment("set", e.createArrowFunction(void 0, void 0, [e.createParameterDeclaration(void 0, void 0, "v", void 0, void 0, void 0)], void 0, void 0, e.createAssignment(Jn(e.createPropertyAccessExpression(Jn(e.createSuper(), 8), d), 8), e.createIdentifier("v"))))), s.push(e.createPropertyAssignment(d, e.createObjectLiteralExpression(g))) }), e.createVariableStatement(void 0, e.createVariableDeclarationList([e.createVariableDeclaration(e.createUniqueName("_super", 48), void 0, void 0, e.createCallExpression(e.createPropertyAccessExpression(e.createIdentifier("Object"), "create"), void 0, [e.createNull(), e.createObjectLiteralExpression(s, !0)]))], 2)) } var uMe = gt({ "src/compiler/transformers/es2017.ts"() { "use strict"; fa() } }); function ope(e) { let { factory: t, getEmitHelperFactory: r, resumeLexicalEnvironment: i, endLexicalEnvironment: o, hoistVariableDeclaration: s } = e, l = e.getEmitResolver(), f = e.getCompilerOptions(), d = Do(f), g = e.onEmitNode; e.onEmitNode = En; let m = e.onSubstituteNode; e.onSubstituteNode = dr; let v = !1, S, x, A, w = 0, C = 0, P, F, B, q, W = []; return y_(e, fe); function Y(ce, Q) { return C !== (C & ~ce | Q) } function R(ce, Q) { let ue = C; return C = (C & ~ce | Q) & 3, ue } function ie(ce) { C = ce } function $(ce) { F = Sn(F, t.createVariableDeclaration(ce)) } function fe(ce) { if (ce.isDeclarationFile) return ce; P = ce; let Q = Ne(ce); return Bg(Q, e.readEmitHelpers()), P = void 0, F = void 0, Q } function Z(ce) { return ge(ce, !1) } function U(ce) { return ge(ce, !0) } function re(ce) { if (ce.kind !== 132) return ce } function le(ce, Q, ue, G) { if (Y(ue, G)) { let Oe = R(ue, G), je = ce(Q); return ie(Oe), je } return ce(Q) } function _e(ce) { return xn(ce, Z, e) } function ge(ce, Q) { if (!(ce.transformFlags & 128)) return ce; switch (ce.kind) { case 220: return X(ce); case 226: return Ve(ce); case 250: return we(ce); case 253: return ke(ce); case 207: return Ce(ce); case 223: return Ye(ce, Q); case 357: return _t(ce, Q); case 295: return ct(ce); case 240: return Rt(ce); case 257: return We(ce); case 243: case 244: case 246: return le(_e, ce, 0, 2); case 247: return tn(ce, void 0); case 245: return le(zt, ce, 0, 2); case 219: return Qt(ce); case 173: return le(gr, ce, 2, 1); case 171: return le(Dt, ce, 2, 1); case 174: return le(pt, ce, 2, 1); case 175: return le(nn, ce, 2, 1); case 259: return le(pn, ce, 2, 1); case 215: return le(Kn, ce, 2, 1); case 216: return le(An, ce, 2, 0); case 166: return Ni(ce); case 241: return Ie(ce); case 214: return Be(ce, Q); case 212: return Le(ce); case 208: return B && br(ce) && ce.expression.kind === 106 && B.add(ce.name.escapedText), xn(ce, Z, e); case 209: return B && ce.expression.kind === 106 && (q = !0), xn(ce, Z, e); case 260: case 228: return le(_e, ce, 2, 1); default: return xn(ce, Z, e) } } function X(ce) { return x & 2 && x & 1 ? Ir(it(t.createYieldExpression(void 0, r().createAwaitHelper($e(ce.expression, Z, ot))), ce), ce) : xn(ce, Z, e) } function Ve(ce) { if (x & 2 && x & 1) { if (ce.asteriskToken) { let Q = $e(L.checkDefined(ce.expression), Z, ot); return Ir(it(t.createYieldExpression(void 0, r().createAwaitHelper(t.updateYieldExpression(ce, ce.asteriskToken, it(r().createAsyncDelegatorHelper(it(r().createAsyncValuesHelper(Q), Q)), Q)))), ce), ce) } return Ir(it(t.createYieldExpression(void 0, Gt(ce.expression ? $e(ce.expression, Z, ot) : t.createVoidZero())), ce), ce) } return xn(ce, Z, e) } function we(ce) { return x & 2 && x & 1 ? t.updateReturnStatement(ce, Gt(ce.expression ? $e(ce.expression, Z, ot) : t.createVoidZero())) : xn(ce, Z, e) } function ke(ce) { if (x & 2) { let Q = xH(ce); return Q.kind === 247 && Q.awaitModifier ? tn(Q, ce) : t.restoreEnclosingLabel($e(Q, Z, ca, t.liftToBlock), ce) } return xn(ce, Z, e) } function Pe(ce) { let Q, ue = []; for (let G of ce) if (G.kind === 301) { Q && (ue.push(t.createObjectLiteralExpression(Q)), Q = void 0); let Oe = G.expression; ue.push($e(Oe, Z, ot)) } else Q = Sn(Q, G.kind === 299 ? t.createPropertyAssignment(G.name, $e(G.initializer, Z, ot)) : $e(G, Z, Og)); return Q && ue.push(t.createObjectLiteralExpression(Q)), ue } function Ce(ce) { if (ce.transformFlags & 65536) { let Q = Pe(ce.properties); Q.length && Q[0].kind !== 207 && Q.unshift(t.createObjectLiteralExpression()); let ue = Q[0]; if (Q.length > 1) { for (let G = 1; G < Q.length; G++)ue = r().createAssignHelper([ue, Q[G]]); return ue } else return r().createAssignHelper(Q) } return xn(ce, Z, e) } function Ie(ce) { return xn(ce, U, e) } function Be(ce, Q) { return xn(ce, Q ? U : Z, e) } function Ne(ce) { let Q = R(2, fH(ce, f) ? 0 : 1); v = !1; let ue = xn(ce, Z, e), G = Qi(ue.statements, F && [t.createVariableStatement(void 0, t.createVariableDeclarationList(F))]), Oe = t.updateSourceFile(ue, it(t.createNodeArray(G), ce.statements)); return ie(Q), Oe } function Le(ce) { return OK(e, ce, Z, P, $, 0) } function Ye(ce, Q) { return Fg(ce) && IO(ce.left) ? KT(ce, Z, e, 1, !Q) : ce.operatorToken.kind === 27 ? t.updateBinaryExpression(ce, $e(ce.left, U, ot), ce.operatorToken, $e(ce.right, Q ? U : Z, ot)) : xn(ce, Z, e) } function _t(ce, Q) { if (Q) return xn(ce, U, e); let ue; for (let Oe = 0; Oe < ce.elements.length; Oe++) { let je = ce.elements[Oe], Ge = $e(je, Oe < ce.elements.length - 1 ? U : Z, ot); (ue || Ge !== je) && (ue || (ue = ce.elements.slice(0, Oe)), ue.push(Ge)) } let G = ue ? it(t.createNodeArray(ue), ce.elements) : ce.elements; return t.updateCommaListExpression(ce, G) } function ct(ce) { if (ce.variableDeclaration && La(ce.variableDeclaration.name) && ce.variableDeclaration.name.transformFlags & 65536) { let Q = t.getGeneratedNameForNode(ce.variableDeclaration.name), ue = t.updateVariableDeclaration(ce.variableDeclaration, ce.variableDeclaration.name, void 0, void 0, Q), G = eE(ue, Z, e, 1), Oe = $e(ce.block, Z, Va); return vt(G) && (Oe = t.updateBlock(Oe, [t.createVariableStatement(void 0, G), ...Oe.statements])), t.updateCatchClause(ce, t.updateVariableDeclaration(ce.variableDeclaration, Q, void 0, void 0, void 0), Oe) } return xn(ce, Z, e) } function Rt(ce) { if (Mr(ce, 1)) { let Q = v; v = !0; let ue = xn(ce, Z, e); return v = Q, ue } return xn(ce, Z, e) } function We(ce) { if (v) { let Q = v; v = !1; let ue = qe(ce, !0); return v = Q, ue } return qe(ce, !1) } function qe(ce, Q) { return La(ce.name) && ce.name.transformFlags & 65536 ? eE(ce, Z, e, 1, void 0, Q) : xn(ce, Z, e) } function zt(ce) { return t.updateForStatement(ce, $e(ce.initializer, U, pp), $e(ce.condition, Z, ot), $e(ce.incrementor, U, ot), jf(ce.statement, Z, e)) } function Qt(ce) { return xn(ce, U, e) } function tn(ce, Q) { let ue = R(0, 2); (ce.initializer.transformFlags & 65536 || vI(ce.initializer) && IO(ce.initializer)) && (ce = kn(ce)); let G = ce.awaitModifier ? $n(ce, Q, ue) : t.restoreEnclosingLabel(xn(ce, Z, e), Q); return ie(ue), G } function kn(ce) { let Q = vs(ce.initializer); if (pu(Q) || vI(Q)) { let ue, G, Oe = t.createTempVariable(void 0), je = [Qz(t, Q, Oe)]; return Va(ce.statement) ? (si(je, ce.statement.statements), ue = ce.statement, G = ce.statement.statements) : ce.statement && (Sn(je, ce.statement), ue = ce.statement, G = ce.statement), t.updateForOfStatement(ce, ce.awaitModifier, it(t.createVariableDeclarationList([it(t.createVariableDeclaration(Oe), ce.initializer)], 1), ce.initializer), ce.expression, it(t.createBlock(it(t.createNodeArray(je), G), !0), ue)) } return ce } function _n(ce, Q, ue) { let G = t.createTempVariable(s), Oe = t.createAssignment(G, Q), je = t.createExpressionStatement(Oe); Ho(je, ce.expression); let Ge = t.createAssignment(ue, t.createFalse()), kt = t.createExpressionStatement(Ge); Ho(kt, ce.expression); let Kt = t.createAssignment(ue, t.createTrue()), ln = t.createExpressionStatement(Kt); Ho(kt, ce.expression); let ir = [], ae = Qz(t, ce.initializer, G); ir.push($e(ae, Z, ca)); let rt, Ot, Ke = jf(ce.statement, Z, e); Va(Ke) ? (si(ir, Ke.statements), rt = Ke, Ot = Ke.statements) : ir.push(Ke); let oe = Jn(it(t.createBlock(it(t.createNodeArray(ir), Ot), !0), rt), 864); return t.createBlock([je, kt, t.createTryStatement(oe, void 0, t.createBlock([ln]))]) } function Gt(ce) { return x & 1 ? t.createYieldExpression(void 0, r().createAwaitHelper(ce)) : t.createAwaitExpression(ce) } function $n(ce, Q, ue) { let G = $e(ce.expression, Z, ot), Oe = Re(G) ? t.getGeneratedNameForNode(G) : t.createTempVariable(void 0), je = Re(G) ? t.getGeneratedNameForNode(Oe) : t.createTempVariable(void 0), Ge = t.createTempVariable(void 0), kt = t.createTempVariable(s), Kt = t.createUniqueName("e"), ln = t.getGeneratedNameForNode(Kt), ir = t.createTempVariable(void 0), ae = it(r().createAsyncValuesHelper(G), ce.expression), rt = t.createCallExpression(t.createPropertyAccessExpression(Oe, "next"), void 0, []), Ot = t.createPropertyAccessExpression(je, "done"), Ke = t.createPropertyAccessExpression(je, "value"), oe = t.createFunctionCallCall(ir, Oe, []); s(Kt), s(ir); let pe = ue & 2 ? t.inlineExpressions([t.createAssignment(Kt, t.createVoidZero()), ae]) : ae, z = Jn(it(t.createForStatement(Jn(it(t.createVariableDeclarationList([t.createVariableDeclaration(Ge, void 0, void 0, t.createTrue()), it(t.createVariableDeclaration(Oe, void 0, void 0, pe), ce.expression), t.createVariableDeclaration(je)]), ce.expression), 4194304), t.inlineExpressions([t.createAssignment(je, Gt(rt)), t.createAssignment(kt, Ot), t.createLogicalNot(kt)]), void 0, _n(ce, Ke, Ge)), ce), 512); return Ir(z, ce), t.createTryStatement(t.createBlock([t.restoreEnclosingLabel(z, Q)]), t.createCatchClause(t.createVariableDeclaration(ln), Jn(t.createBlock([t.createExpressionStatement(t.createAssignment(Kt, t.createObjectLiteralExpression([t.createPropertyAssignment("error", ln)])))]), 1)), t.createBlock([t.createTryStatement(t.createBlock([Jn(t.createIfStatement(t.createLogicalAnd(t.createLogicalAnd(t.createLogicalNot(Ge), t.createLogicalNot(kt)), t.createAssignment(ir, t.createPropertyAccessExpression(Oe, "return"))), t.createExpressionStatement(Gt(oe))), 1)]), void 0, Jn(t.createBlock([Jn(t.createIfStatement(Kt, t.createThrowStatement(t.createPropertyAccessExpression(Kt, "error"))), 1)]), 1))])) } function ui(ce) { return L.assertNode(ce, ha), Ni(ce) } function Ni(ce) { return A?.has(ce) ? t.updateParameterDeclaration(ce, void 0, ce.dotDotDotToken, La(ce.name) ? t.getGeneratedNameForNode(ce) : ce.name, void 0, void 0, void 0) : ce.transformFlags & 65536 ? t.updateParameterDeclaration(ce, void 0, ce.dotDotDotToken, t.getGeneratedNameForNode(ce), void 0, void 0, $e(ce.initializer, Z, ot)) : xn(ce, Z, e) } function Pi(ce) { let Q; for (let ue of ce.parameters) Q ? Q.add(ue) : ue.transformFlags & 65536 && (Q = new Set); return Q } function gr(ce) { let Q = x, ue = A; x = pl(ce), A = Pi(ce); let G = t.updateConstructorDeclaration(ce, ce.modifiers, Sc(ce.parameters, ui, e), ri(ce)); return x = Q, A = ue, G } function pt(ce) { let Q = x, ue = A; x = pl(ce), A = Pi(ce); let G = t.updateGetAccessorDeclaration(ce, ce.modifiers, $e(ce.name, Z, Ys), Sc(ce.parameters, ui, e), void 0, ri(ce)); return x = Q, A = ue, G } function nn(ce) { let Q = x, ue = A; x = pl(ce), A = Pi(ce); let G = t.updateSetAccessorDeclaration(ce, ce.modifiers, $e(ce.name, Z, Ys), Sc(ce.parameters, ui, e), ri(ce)); return x = Q, A = ue, G } function Dt(ce) { let Q = x, ue = A; x = pl(ce), A = Pi(ce); let G = t.updateMethodDeclaration(ce, x & 1 ? On(ce.modifiers, re, Ns) : ce.modifiers, x & 2 ? void 0 : ce.asteriskToken, $e(ce.name, Z, Ys), $e(void 0, Z, ev), void 0, Sc(ce.parameters, ui, e), void 0, x & 2 && x & 1 ? hi(ce) : ri(ce)); return x = Q, A = ue, G } function pn(ce) { let Q = x, ue = A; x = pl(ce), A = Pi(ce); let G = t.updateFunctionDeclaration(ce, x & 1 ? On(ce.modifiers, re, Ha) : ce.modifiers, x & 2 ? void 0 : ce.asteriskToken, ce.name, void 0, Sc(ce.parameters, ui, e), void 0, x & 2 && x & 1 ? hi(ce) : ri(ce)); return x = Q, A = ue, G } function An(ce) { let Q = x, ue = A; x = pl(ce), A = Pi(ce); let G = t.updateArrowFunction(ce, ce.modifiers, void 0, Sc(ce.parameters, ui, e), void 0, ce.equalsGreaterThanToken, ri(ce)); return x = Q, A = ue, G } function Kn(ce) { let Q = x, ue = A; x = pl(ce), A = Pi(ce); let G = t.updateFunctionExpression(ce, x & 1 ? On(ce.modifiers, re, Ha) : ce.modifiers, x & 2 ? void 0 : ce.asteriskToken, ce.name, void 0, Sc(ce.parameters, ui, e), void 0, x & 2 && x & 1 ? hi(ce) : ri(ce)); return x = Q, A = ue, G } function hi(ce) { i(); let Q = [], ue = t.copyPrologue(ce.body.statements, Q, !1, Z); vn(Q, ce); let G = B, Oe = q; B = new Set, q = !1; let je = t.createReturnStatement(r().createAsyncGeneratorHelper(t.createFunctionExpression(void 0, t.createToken(41), ce.name && t.getGeneratedNameForNode(ce.name), void 0, [], void 0, t.updateBlock(ce.body, mF(ce.body.statements, Z, e, ue))), !!(C & 1))), Ge = d >= 2 && l.getNodeCheckFlags(ce) & 384; if (Ge) { Ht(); let Kt = SF(t, l, ce, B); W[zo(Kt)] = !0, em(Q, [Kt]) } Q.push(je), em(Q, o()); let kt = t.updateBlock(ce.body, Q); return Ge && q && (l.getNodeCheckFlags(ce) & 256 ? xS(kt, sO) : l.getNodeCheckFlags(ce) & 128 && xS(kt, oO)), B = G, q = Oe, kt } function ri(ce) { var Q; i(); let ue = 0, G = [], Oe = (Q = $e(ce.body, Z, u6)) != null ? Q : t.createBlock([]); Va(Oe) && (ue = t.copyPrologue(Oe.statements, G, !1, Z)), si(G, vn(void 0, ce)); let je = o(); if (ue > 0 || vt(G) || vt(je)) { let Ge = t.converters.convertToFunctionBlock(Oe, !0); return em(G, je), si(G, Ge.statements.slice(ue)), t.updateBlock(Ge, it(t.createNodeArray(G), Ge.statements)) } return Oe } function vn(ce, Q) { let ue = !1; for (let G of Q.parameters) if (ue) { if (La(G.name)) { if (G.name.elements.length > 0) { let Oe = eE(G, Z, e, 0, t.getGeneratedNameForNode(G)); if (vt(Oe)) { let je = t.createVariableDeclarationList(Oe), Ge = t.createVariableStatement(void 0, je); Jn(Ge, 2097152), ce = Sn(ce, Ge) } } else if (G.initializer) { let Oe = t.getGeneratedNameForNode(G), je = $e(G.initializer, Z, ot), Ge = t.createAssignment(Oe, je), kt = t.createExpressionStatement(Ge); Jn(kt, 2097152), ce = Sn(ce, kt) } } else if (G.initializer) { let Oe = t.cloneNode(G.name); it(Oe, G.name), Jn(Oe, 96); let je = $e(G.initializer, Z, ot); bp(je, 3168); let Ge = t.createAssignment(Oe, je); it(Ge, G), Jn(Ge, 3072); let kt = t.createBlock([t.createExpressionStatement(Ge)]); it(kt, G), Jn(kt, 3905); let Kt = t.createTypeCheck(t.cloneNode(G.name), "undefined"), ln = t.createIfStatement(Kt, kt); mu(ln), it(ln, G), Jn(ln, 2101056), ce = Sn(ce, ln) } } else if (G.transformFlags & 65536) { ue = !0; let Oe = eE(G, Z, e, 1, t.getGeneratedNameForNode(G), !1, !0); if (vt(Oe)) { let je = t.createVariableDeclarationList(Oe), Ge = t.createVariableStatement(void 0, je); Jn(Ge, 2097152), ce = Sn(ce, Ge) } } return ce } function Ht() { S & 1 || (S |= 1, e.enableSubstitution(210), e.enableSubstitution(208), e.enableSubstitution(209), e.enableEmitNotification(260), e.enableEmitNotification(171), e.enableEmitNotification(174), e.enableEmitNotification(175), e.enableEmitNotification(173), e.enableEmitNotification(240)) } function En(ce, Q, ue) { if (S & 1 && ve(Q)) { let G = l.getNodeCheckFlags(Q) & 384; if (G !== w) { let Oe = w; w = G, g(ce, Q, ue), w = Oe; return } } else if (S && W[zo(Q)]) { let G = w; w = 0, g(ce, Q, ue), w = G; return } g(ce, Q, ue) } function dr(ce, Q) { return Q = m(ce, Q), ce === 1 && w ? Cr(Q) : Q } function Cr(ce) { switch (ce.kind) { case 208: return Se(ce); case 209: return at(ce); case 210: return Tt(ce) }return ce } function Se(ce) { return ce.expression.kind === 106 ? it(t.createPropertyAccessExpression(t.createUniqueName("_super", 48), ce.name), ce) : ce } function at(ce) { return ce.expression.kind === 106 ? nt(ce.argumentExpression, ce) : ce } function Tt(ce) { let Q = ce.expression; if (Pu(Q)) { let ue = br(Q) ? Se(Q) : at(Q); return t.createCallExpression(t.createPropertyAccessExpression(ue, "call"), void 0, [t.createThis(), ...ce.arguments]) } return ce } function ve(ce) { let Q = ce.kind; return Q === 260 || Q === 173 || Q === 171 || Q === 174 || Q === 175 } function nt(ce, Q) { return w & 256 ? it(t.createPropertyAccessExpression(t.createCallExpression(t.createIdentifier("_superIndex"), void 0, [ce]), "value"), Q) : it(t.createCallExpression(t.createIdentifier("_superIndex"), void 0, [ce]), Q) } } var dMe = gt({ "src/compiler/transformers/es2018.ts"() { "use strict"; fa() } }); function spe(e) { let t = e.factory; return y_(e, r); function r(s) { return s.isDeclarationFile ? s : xn(s, i, e) } function i(s) { if (!(s.transformFlags & 64)) return s; switch (s.kind) { case 295: return o(s); default: return xn(s, i, e) } } function o(s) { return s.variableDeclaration ? xn(s, i, e) : t.updateCatchClause(s, t.createVariableDeclaration(t.createTempVariable(void 0)), $e(s.block, i, Va)) } } var fMe = gt({ "src/compiler/transformers/es2019.ts"() { "use strict"; fa() } }); function cpe(e) { let { factory: t, hoistVariableDeclaration: r } = e; return y_(e, i); function i(A) { return A.isDeclarationFile ? A : xn(A, o, e) } function o(A) { if (!(A.transformFlags & 32)) return A; switch (A.kind) { case 210: { let w = d(A, !1); return L.assertNotNode(w, MS), w } case 208: case 209: if (Jl(A)) { let w = m(A, !1, !1); return L.assertNotNode(w, MS), w } return xn(A, o, e); case 223: return A.operatorToken.kind === 60 ? S(A) : xn(A, o, e); case 217: return x(A); default: return xn(A, o, e) } } function s(A) { L.assertNotNode(A, i6); let w = [A]; for (; !A.questionDotToken && !PT(A);)A = Ga(a_(A.expression), Jl), L.assertNotNode(A, i6), w.unshift(A); return { expression: A.expression, chain: w } } function l(A, w, C) { let P = g(A.expression, w, C); return MS(P) ? t.createSyntheticReferenceExpression(t.updateParenthesizedExpression(A, P.expression), P.thisArg) : t.updateParenthesizedExpression(A, P) } function f(A, w, C) { if (Jl(A)) return m(A, w, C); let P = $e(A.expression, o, ot); L.assertNotNode(P, MS); let F; return w && (Z0(P) ? F = P : (F = t.createTempVariable(r), P = t.createAssignment(F, P))), P = A.kind === 208 ? t.updatePropertyAccessExpression(A, P, $e(A.name, o, Re)) : t.updateElementAccessExpression(A, P, $e(A.argumentExpression, o, ot)), F ? t.createSyntheticReferenceExpression(P, F) : P } function d(A, w) { if (Jl(A)) return m(A, w, !1); if (ud(A.expression) && Jl(vs(A.expression))) { let C = l(A.expression, !0, !1), P = On(A.arguments, o, ot); return MS(C) ? it(t.createFunctionCallCall(C.expression, C.thisArg, P), A) : t.updateCallExpression(A, C, void 0, P) } return xn(A, o, e) } function g(A, w, C) { switch (A.kind) { case 214: return l(A, w, C); case 208: case 209: return f(A, w, C); case 210: return d(A, w); default: return $e(A, o, ot) } } function m(A, w, C) { let { expression: P, chain: F } = s(A), B = g(a_(P), dT(F[0]), !1), q = MS(B) ? B.thisArg : void 0, W = MS(B) ? B.expression : B, Y = t.restoreOuterExpressions(P, W, 8); Z0(W) || (W = t.createTempVariable(r), Y = t.createAssignment(W, Y)); let R = W, ie; for (let fe = 0; fe < F.length; fe++) { let Z = F[fe]; switch (Z.kind) { case 208: case 209: fe === F.length - 1 && w && (Z0(R) ? ie = R : (ie = t.createTempVariable(r), R = t.createAssignment(ie, R))), R = Z.kind === 208 ? t.createPropertyAccessExpression(R, $e(Z.name, o, Re)) : t.createElementAccessExpression(R, $e(Z.argumentExpression, o, ot)); break; case 210: fe === 0 && q ? (tc(q) || (q = t.cloneNode(q), bp(q, 3072)), R = t.createFunctionCallCall(R, q.kind === 106 ? t.createThis() : q, On(Z.arguments, o, ot))) : R = t.createCallExpression(R, void 0, On(Z.arguments, o, ot)); break }Ir(R, Z) } let $ = C ? t.createConditionalExpression(v(Y, W, !0), void 0, t.createTrue(), void 0, t.createDeleteExpression(R)) : t.createConditionalExpression(v(Y, W, !0), void 0, t.createVoidZero(), void 0, R); return it($, A), ie ? t.createSyntheticReferenceExpression($, ie) : $ } function v(A, w, C) { return t.createBinaryExpression(t.createBinaryExpression(A, t.createToken(C ? 36 : 37), t.createNull()), t.createToken(C ? 56 : 55), t.createBinaryExpression(w, t.createToken(C ? 36 : 37), t.createVoidZero())) } function S(A) { let w = $e(A.left, o, ot), C = w; return Z0(w) || (C = t.createTempVariable(r), w = t.createAssignment(C, w)), it(t.createConditionalExpression(v(w, C), void 0, C, void 0, $e(A.right, o, ot)), A) } function x(A) { return Jl(vs(A.expression)) ? Ir(g(A.expression, !1, !0), A) : t.updateDeleteExpression(A, $e(A.expression, o, ot)) } } var _Me = gt({ "src/compiler/transformers/es2020.ts"() { "use strict"; fa() } }); function lpe(e) { let { hoistVariableDeclaration: t, factory: r } = e; return y_(e, i); function i(l) { return l.isDeclarationFile ? l : xn(l, o, e) } function o(l) { return l.transformFlags & 16 ? cW(l) ? s(l) : xn(l, o, e) : l } function s(l) { let f = l.operatorToken, d = WL(f.kind), g = vs($e(l.left, o, Ju)), m = g, v = vs($e(l.right, o, ot)); if (Us(g)) { let S = Z0(g.expression), x = S ? g.expression : r.createTempVariable(t), A = S ? g.expression : r.createAssignment(x, g.expression); if (br(g)) m = r.createPropertyAccessExpression(x, g.name), g = r.createPropertyAccessExpression(A, g.name); else { let w = Z0(g.argumentExpression), C = w ? g.argumentExpression : r.createTempVariable(t); m = r.createElementAccessExpression(x, C), g = r.createElementAccessExpression(A, w ? g.argumentExpression : r.createAssignment(C, g.argumentExpression)) } } return r.createBinaryExpression(g, d, r.createParenthesizedExpression(r.createAssignment(m, v))) } } var pMe = gt({ "src/compiler/transformers/es2021.ts"() { "use strict"; fa() } }); function upe(e) { return y_(e, t); function t(i) { return i.isDeclarationFile ? i : xn(i, r, e) } function r(i) { if (!(i.transformFlags & 4)) return i; switch (i.kind) { default: return xn(i, r, e) } } } var mMe = gt({ "src/compiler/transformers/esnext.ts"() { "use strict"; fa() } }); function dpe(e) { let { factory: t, getEmitHelperFactory: r } = e, i = e.getCompilerOptions(), o, s; return y_(e, v); function l() { if (s.filenameDeclaration) return s.filenameDeclaration.name; let Le = t.createVariableDeclaration(t.createUniqueName("_jsxFileName", 48), void 0, void 0, t.createStringLiteral(o.fileName)); return s.filenameDeclaration = Le, s.filenameDeclaration.name } function f(Le) { return i.jsx === 5 ? "jsxDEV" : Le ? "jsxs" : "jsx" } function d(Le) { let Ye = f(Le); return m(Ye) } function g() { return m("Fragment") } function m(Le) { var Ye, _t; let ct = Le === "createElement" ? s.importSpecifier : p4(s.importSpecifier, i), Rt = (_t = (Ye = s.utilizedImplicitRuntimeImports) == null ? void 0 : Ye.get(ct)) == null ? void 0 : _t.get(Le); if (Rt) return Rt.name; s.utilizedImplicitRuntimeImports || (s.utilizedImplicitRuntimeImports = new Map); let We = s.utilizedImplicitRuntimeImports.get(ct); We || (We = new Map, s.utilizedImplicitRuntimeImports.set(ct, We)); let qe = t.createUniqueName(`_${Le}`, 112), zt = t.createImportSpecifier(!1, t.createIdentifier(Le), qe); return bue(qe, zt), We.set(Le, zt), qe } function v(Le) { if (Le.isDeclarationFile) return Le; o = Le, s = {}, s.importSpecifier = _4(i, Le); let Ye = xn(Le, S, e); Bg(Ye, e.readEmitHelpers()); let _t = Ye.statements; if (s.filenameDeclaration && (_t = L0(_t.slice(), t.createVariableStatement(void 0, t.createVariableDeclarationList([s.filenameDeclaration], 2)))), s.utilizedImplicitRuntimeImports) { for (let [ct, Rt] of lo(s.utilizedImplicitRuntimeImports.entries())) if (Lc(Le)) { let We = t.createImportDeclaration(void 0, t.createImportClause(!1, void 0, t.createNamedImports(lo(Rt.values()))), t.createStringLiteral(ct), void 0); Zy(We, !1), _t = L0(_t.slice(), We) } else if (kd(Le)) { let We = t.createVariableStatement(void 0, t.createVariableDeclarationList([t.createVariableDeclaration(t.createObjectBindingPattern(lo(Rt.values(), qe => t.createBindingElement(void 0, qe.propertyName, qe.name))), void 0, void 0, t.createCallExpression(t.createIdentifier("require"), void 0, [t.createStringLiteral(ct)]))], 2)); Zy(We, !1), _t = L0(_t.slice(), We) } } return _t !== Ye.statements && (Ye = t.updateSourceFile(Ye, _t)), s = void 0, Ye } function S(Le) { return Le.transformFlags & 2 ? x(Le) : Le } function x(Le) { switch (Le.kind) { case 281: return P(Le, !1); case 282: return F(Le, !1); case 285: return B(Le, !1); case 291: return Ne(Le); default: return xn(Le, S, e) } } function A(Le) { switch (Le.kind) { case 11: return Ve(Le); case 291: return Ne(Le); case 281: return P(Le, !0); case 282: return F(Le, !0); case 285: return B(Le, !0); default: return L.failBadSyntaxKind(Le) } } function w(Le) { let Ye = !1; for (let _t of Le.attributes.properties) if (GT(_t)) Ye = !0; else if (Ye && Sp(_t) && _t.name.escapedText === "key") return !0; return !1 } function C(Le) { return s.importSpecifier === void 0 || w(Le) } function P(Le, Ye) { return (C(Le.openingElement) ? ie : Y)(Le.openingElement, Le.children, Ye, Le) } function F(Le, Ye) { return (C(Le) ? ie : Y)(Le, void 0, Ye, Le) } function B(Le, Ye) { return (s.importSpecifier === void 0 ? fe : $)(Le.openingFragment, Le.children, Ye, Le) } function q(Le) { let Ye = W(Le); return Ye && t.createObjectLiteralExpression([Ye]) } function W(Le) { let Ye = bR(Le); if (Fn(Ye) === 1 && !Ye[0].dotDotDotToken) { let ct = A(Ye[0]); return ct && t.createPropertyAssignment("children", ct) } let _t = Zi(Le, A); return Fn(_t) ? t.createPropertyAssignment("children", t.createArrayLiteralExpression(_t)) : void 0 } function Y(Le, Ye, _t, ct) { let Rt = Ie(Le), We = Ye && Ye.length ? W(Ye) : void 0, qe = wr(Le.attributes.properties, tn => !!tn.name && Re(tn.name) && tn.name.escapedText === "key"), zt = qe ? Pr(Le.attributes.properties, tn => tn !== qe) : Le.attributes.properties, Qt = Fn(zt) ? U(zt, We) : t.createObjectLiteralExpression(We ? [We] : Je); return R(Rt, Qt, qe, Ye || Je, _t, ct) } function R(Le, Ye, _t, ct, Rt, We) { var qe; let zt = bR(ct), Qt = Fn(zt) > 1 || !!((qe = zt[0]) != null && qe.dotDotDotToken), tn = [Le, Ye]; if (_t && tn.push(X(_t.initializer)), i.jsx === 5) { let _n = ec(o); if (_n && Li(_n)) { _t === void 0 && tn.push(t.createVoidZero()), tn.push(Qt ? t.createTrue() : t.createFalse()); let Gt = Gs(_n, We.pos); tn.push(t.createObjectLiteralExpression([t.createPropertyAssignment("fileName", l()), t.createPropertyAssignment("lineNumber", t.createNumericLiteral(Gt.line + 1)), t.createPropertyAssignment("columnNumber", t.createNumericLiteral(Gt.character + 1))])), tn.push(t.createThis()) } } let kn = it(t.createCallExpression(d(Qt), void 0, tn), We); return Rt && mu(kn), kn } function ie(Le, Ye, _t, ct) { let Rt = Ie(Le), We = Le.attributes.properties, qe = Fn(We) ? U(We) : t.createNull(), zt = s.importSpecifier === void 0 ? $z(t, e.getEmitResolver().getJsxFactoryEntity(o), i.reactNamespace, Le) : m("createElement"), Qt = Que(t, zt, Rt, qe, Zi(Ye, A), ct); return _t && mu(Qt), Qt } function $(Le, Ye, _t, ct) { let Rt; if (Ye && Ye.length) { let We = q(Ye); We && (Rt = We) } return R(g(), Rt || t.createObjectLiteralExpression([]), void 0, Ye, _t, ct) } function fe(Le, Ye, _t, ct) { let Rt = Zue(t, e.getEmitResolver().getJsxFactoryEntity(o), e.getEmitResolver().getJsxFragmentFactoryEntity(o), i.reactNamespace, Zi(Ye, A), Le, ct); return _t && mu(Rt), Rt } function Z(Le) { return t.createSpreadAssignment(L.checkDefined($e(Le.expression, S, ot))) } function U(Le, Ye) { let _t = Do(i); return _t && _t >= 5 ? t.createObjectLiteralExpression(re(Le, Ye)) : le(Le, Ye) } function re(Le, Ye) { let _t = t_(c8(Le, GT, (ct, Rt) => on(ct, We => Rt ? Z(We) : ge(We)))); return Ye && _t.push(Ye), _t } function le(Le, Ye) { let _t = t_(c8(Le, GT, (ct, Rt) => Rt ? on(ct, _e) : t.createObjectLiteralExpression(on(ct, ge)))); return GT(Le[0]) && _t.unshift(t.createObjectLiteralExpression()), Ye && _t.push(t.createObjectLiteralExpression([Ye])), Wp(_t) || r().createAssignHelper(_t) } function _e(Le) { return L.checkDefined($e(Le.expression, S, ot)) } function ge(Le) { let Ye = Be(Le), _t = X(Le.initializer); return t.createPropertyAssignment(Ye, _t) } function X(Le) { if (Le === void 0) return t.createTrue(); if (Le.kind === 10) { let Ye = Le.singleQuote !== void 0 ? Le.singleQuote : !V6(Le, o), _t = t.createStringLiteral(Ce(Le.text) || Le.text, Ye); return it(_t, Le) } return Le.kind === 291 ? Le.expression === void 0 ? t.createTrue() : L.checkDefined($e(Le.expression, S, ot)) : Hg(Le) ? P(Le, !1) : FS(Le) ? F(Le, !1) : BS(Le) ? B(Le, !1) : L.failBadSyntaxKind(Le) } function Ve(Le) { let Ye = we(Le.text); return Ye === void 0 ? void 0 : t.createStringLiteral(Ye) } function we(Le) { let Ye, _t = 0, ct = -1; for (let Rt = 0; Rt < Le.length; Rt++) { let We = Le.charCodeAt(Rt); Wl(We) ? (_t !== -1 && ct !== -1 && (Ye = ke(Ye, Le.substr(_t, ct - _t + 1))), _t = -1) : Yp(We) || (ct = Rt, _t === -1 && (_t = Rt)) } return _t !== -1 ? ke(Ye, Le.substr(_t)) : Ye } function ke(Le, Ye) { let _t = Pe(Ye); return Le === void 0 ? _t : Le + " " + _t } function Pe(Le) { return Le.replace(/&((#((\d+)|x([\da-fA-F]+)))|(\w+));/g, (Ye, _t, ct, Rt, We, qe, zt) => { if (We) return lI(parseInt(We, 10)); if (qe) return lI(parseInt(qe, 16)); { let Qt = fpe.get(zt); return Qt ? lI(Qt) : Ye } }) } function Ce(Le) { let Ye = Pe(Le); return Ye === Le ? void 0 : Ye } function Ie(Le) { if (Le.kind === 281) return Ie(Le.openingElement); { let Ye = Le.tagName; return Re(Ye) && GI(Ye.escapedText) ? t.createStringLiteral(vr(Ye)) : EO(t, Ye) } } function Be(Le) { let Ye = Le.name, _t = vr(Ye); return /^[A-Za-z_]\w*$/.test(_t) ? Ye : t.createStringLiteral(_t) } function Ne(Le) { let Ye = $e(Le.expression, S, ot); return Le.dotDotDotToken ? t.createSpreadElement(Ye) : Ye } } var fpe, hMe = gt({ "src/compiler/transformers/jsx.ts"() { "use strict"; fa(), fpe = new Map(Object.entries({ quot: 34, amp: 38, apos: 39, lt: 60, gt: 62, nbsp: 160, iexcl: 161, cent: 162, pound: 163, curren: 164, yen: 165, brvbar: 166, sect: 167, uml: 168, copy: 169, ordf: 170, laquo: 171, not: 172, shy: 173, reg: 174, macr: 175, deg: 176, plusmn: 177, sup2: 178, sup3: 179, acute: 180, micro: 181, para: 182, middot: 183, cedil: 184, sup1: 185, ordm: 186, raquo: 187, frac14: 188, frac12: 189, frac34: 190, iquest: 191, Agrave: 192, Aacute: 193, Acirc: 194, Atilde: 195, Auml: 196, Aring: 197, AElig: 198, Ccedil: 199, Egrave: 200, Eacute: 201, Ecirc: 202, Euml: 203, Igrave: 204, Iacute: 205, Icirc: 206, Iuml: 207, ETH: 208, Ntilde: 209, Ograve: 210, Oacute: 211, Ocirc: 212, Otilde: 213, Ouml: 214, times: 215, Oslash: 216, Ugrave: 217, Uacute: 218, Ucirc: 219, Uuml: 220, Yacute: 221, THORN: 222, szlig: 223, agrave: 224, aacute: 225, acirc: 226, atilde: 227, auml: 228, aring: 229, aelig: 230, ccedil: 231, egrave: 232, eacute: 233, ecirc: 234, euml: 235, igrave: 236, iacute: 237, icirc: 238, iuml: 239, eth: 240, ntilde: 241, ograve: 242, oacute: 243, ocirc: 244, otilde: 245, ouml: 246, divide: 247, oslash: 248, ugrave: 249, uacute: 250, ucirc: 251, uuml: 252, yacute: 253, thorn: 254, yuml: 255, OElig: 338, oelig: 339, Scaron: 352, scaron: 353, Yuml: 376, fnof: 402, circ: 710, tilde: 732, Alpha: 913, Beta: 914, Gamma: 915, Delta: 916, Epsilon: 917, Zeta: 918, Eta: 919, Theta: 920, Iota: 921, Kappa: 922, Lambda: 923, Mu: 924, Nu: 925, Xi: 926, Omicron: 927, Pi: 928, Rho: 929, Sigma: 931, Tau: 932, Upsilon: 933, Phi: 934, Chi: 935, Psi: 936, Omega: 937, alpha: 945, beta: 946, gamma: 947, delta: 948, epsilon: 949, zeta: 950, eta: 951, theta: 952, iota: 953, kappa: 954, lambda: 955, mu: 956, nu: 957, xi: 958, omicron: 959, pi: 960, rho: 961, sigmaf: 962, sigma: 963, tau: 964, upsilon: 965, phi: 966, chi: 967, psi: 968, omega: 969, thetasym: 977, upsih: 978, piv: 982, ensp: 8194, emsp: 8195, thinsp: 8201, zwnj: 8204, zwj: 8205, lrm: 8206, rlm: 8207, ndash: 8211, mdash: 8212, lsquo: 8216, rsquo: 8217, sbquo: 8218, ldquo: 8220, rdquo: 8221, bdquo: 8222, dagger: 8224, Dagger: 8225, bull: 8226, hellip: 8230, permil: 8240, prime: 8242, Prime: 8243, lsaquo: 8249, rsaquo: 8250, oline: 8254, frasl: 8260, euro: 8364, image: 8465, weierp: 8472, real: 8476, trade: 8482, alefsym: 8501, larr: 8592, uarr: 8593, rarr: 8594, darr: 8595, harr: 8596, crarr: 8629, lArr: 8656, uArr: 8657, rArr: 8658, dArr: 8659, hArr: 8660, forall: 8704, part: 8706, exist: 8707, empty: 8709, nabla: 8711, isin: 8712, notin: 8713, ni: 8715, prod: 8719, sum: 8721, minus: 8722, lowast: 8727, radic: 8730, prop: 8733, infin: 8734, ang: 8736, and: 8743, or: 8744, cap: 8745, cup: 8746, int: 8747, there4: 8756, sim: 8764, cong: 8773, asymp: 8776, ne: 8800, equiv: 8801, le: 8804, ge: 8805, sub: 8834, sup: 8835, nsub: 8836, sube: 8838, supe: 8839, oplus: 8853, otimes: 8855, perp: 8869, sdot: 8901, lceil: 8968, rceil: 8969, lfloor: 8970, rfloor: 8971, lang: 9001, rang: 9002, loz: 9674, spades: 9824, clubs: 9827, hearts: 9829, diams: 9830 })) } }); function _pe(e) { let { factory: t, hoistVariableDeclaration: r } = e; return y_(e, i); function i(d) { return d.isDeclarationFile ? d : xn(d, o, e) } function o(d) { if (!(d.transformFlags & 512)) return d; switch (d.kind) { case 223: return s(d); default: return xn(d, o, e) } } function s(d) { switch (d.operatorToken.kind) { case 67: return l(d); case 42: return f(d); default: return xn(d, o, e) } } function l(d) { let g, m, v = $e(d.left, o, ot), S = $e(d.right, o, ot); if (Vs(v)) { let x = t.createTempVariable(r), A = t.createTempVariable(r); g = it(t.createElementAccessExpression(it(t.createAssignment(x, v.expression), v.expression), it(t.createAssignment(A, v.argumentExpression), v.argumentExpression)), v), m = it(t.createElementAccessExpression(x, A), v) } else if (br(v)) { let x = t.createTempVariable(r); g = it(t.createPropertyAccessExpression(it(t.createAssignment(x, v.expression), v.expression), v.name), v), m = it(t.createPropertyAccessExpression(x, v.name), v) } else g = v, m = v; return it(t.createAssignment(g, it(t.createGlobalMethodCall("Math", "pow", [m, S]), d)), d) } function f(d) { let g = $e(d.left, o, ot), m = $e(d.right, o, ot); return it(t.createGlobalMethodCall("Math", "pow", [g, m]), d) } } var gMe = gt({ "src/compiler/transformers/es2016.ts"() { "use strict"; fa() } }); function ppe(e, t) { return { kind: e, expression: t } } function mpe(e) { let { factory: t, getEmitHelperFactory: r, startLexicalEnvironment: i, resumeLexicalEnvironment: o, endLexicalEnvironment: s, hoistVariableDeclaration: l } = e, f = e.getCompilerOptions(), d = e.getEmitResolver(), g = e.onSubstituteNode, m = e.onEmitNode; e.onEmitNode = Gu, e.onSubstituteNode = Ws; let v, S, x, A; function w(ee) { A = Sn(A, t.createVariableDeclaration(ee)) } let C, P; return y_(e, F); function F(ee) { if (ee.isDeclarationFile) return ee; v = ee, S = ee.text; let Ze = re(ee); return Bg(Ze, e.readEmitHelpers()), v = void 0, S = void 0, A = void 0, x = 0, Ze } function B(ee, Ze) { let At = x; return x = (x & ~ee | Ze) & 32767, At } function q(ee, Ze, At) { x = (x & ~Ze | At) & -32768 | ee } function W(ee) { return (x & 8192) !== 0 && ee.kind === 250 && !ee.expression } function Y(ee) { return ee.transformFlags & 4194304 && (j_(ee) || MT(ee) || Uue(ee) || pO(ee) || hO(ee) || CL(ee) || yO(ee) || mO(ee) || E2(ee) || J0(ee) || Wy(ee, !1) || Va(ee)) } function R(ee) { return (ee.transformFlags & 1024) !== 0 || C !== void 0 || x & 8192 && Y(ee) || Wy(ee, !1) && jr(ee) || (o_(ee) & 1) !== 0 } function ie(ee) { return R(ee) ? U(ee, !1) : ee } function $(ee) { return R(ee) ? U(ee, !0) : ee } function fe(ee) { if (R(ee)) { let Ze = ec(ee); if (Na(Ze) && zc(Ze)) { let At = B(32670, 16449), xt = U(ee, !1); return q(At, 98304, 0), xt } return U(ee, !1) } return ee } function Z(ee) { return ee.kind === 106 ? Hs(!0) : ie(ee) } function U(ee, Ze) { switch (ee.kind) { case 124: return; case 260: return Ce(ee); case 228: return Ie(ee); case 166: return tn(ee); case 259: return Ht(ee); case 216: return ri(ee); case 215: return vn(ee); case 257: return je(ee); case 79: return ke(ee); case 258: return Q(ee); case 252: return le(ee); case 266: return _e(ee); case 238: return Cr(ee, !1); case 249: case 248: return Pe(ee); case 253: return Kt(ee); case 243: case 244: return ae(ee, void 0); case 245: return rt(ee, void 0); case 246: return Ke(ee, void 0); case 247: return oe(ee, void 0); case 241: return Se(ee); case 207: return yt(ee); case 295: return Pc(ee); case 300: return Rs(ee); case 164: return As(ee); case 206: return yc(ee); case 210: return Ql(ee); case 211: return wt(ee); case 214: return at(ee, Ze); case 223: return Tt(ee, Ze); case 357: return ve(ee, Ze); case 14: case 15: case 16: case 17: return ta(ee); case 10: return Go(ee); case 8: return Ka(ee); case 212: return vo(ee); case 225: return ka(ee); case 226: return jt(ee); case 227: return yr(ee); case 106: return Hs(!1); case 108: return Ve(ee); case 233: return Uc(ee); case 171: return ss(ee); case 174: case 175: return qs(ee); case 240: return ce(ee); case 250: return X(ee); case 219: return we(ee); default: return xn(ee, ie, e) } } function re(ee) { let Ze = B(8064, 64), At = [], xt = []; i(); let qt = t.copyPrologue(ee.statements, At, !1, ie); return si(xt, On(ee.statements, ie, ca, qt)), A && xt.push(t.createVariableStatement(void 0, t.createVariableDeclarationList(A))), t.mergeLexicalEnvironment(At, s()), Pi(At, ee), q(Ze, 0, 0), t.updateSourceFile(ee, it(t.createNodeArray(Qi(At, xt)), ee.statements)) } function le(ee) { if (C !== void 0) { let Ze = C.allowedNonLabeledJumps; C.allowedNonLabeledJumps |= 2; let At = xn(ee, ie, e); return C.allowedNonLabeledJumps = Ze, At } return xn(ee, ie, e) } function _e(ee) { let Ze = B(7104, 0), At = xn(ee, ie, e); return q(Ze, 0, 0), At } function ge(ee) { return Ir(t.createReturnStatement(t.createUniqueName("_this", 48)), ee) } function X(ee) { return C ? (C.nonLocalJumps |= 8, W(ee) && (ee = ge(ee)), t.createReturnStatement(t.createObjectLiteralExpression([t.createPropertyAssignment(t.createIdentifier("value"), ee.expression ? L.checkDefined($e(ee.expression, ie, ot)) : t.createVoidZero())]))) : W(ee) ? ge(ee) : xn(ee, ie, e) } function Ve(ee) { return x & 2 && !(x & 16384) && (x |= 65536), C ? x & 2 ? (C.containsLexicalThis = !0, ee) : C.thisName || (C.thisName = t.createUniqueName("this")) : ee } function we(ee) { return xn(ee, $, e) } function ke(ee) { return C && d.isArgumentsLocalBinding(ee) ? C.argumentsName || (C.argumentsName = t.createUniqueName("arguments")) : ee.flags & 128 ? Ir(it(t.createIdentifier(Gi(ee.escapedText)), ee), ee) : ee } function Pe(ee) { if (C) { let Ze = ee.kind === 249 ? 2 : 4; if (!(ee.label && C.labels && C.labels.get(vr(ee.label)) || !ee.label && C.allowedNonLabeledJumps & Ze)) { let xt, qt = ee.label; qt ? ee.kind === 249 ? (xt = `break-${qt.escapedText}`, hc(C, !0, vr(qt), xt)) : (xt = `continue-${qt.escapedText}`, hc(C, !1, vr(qt), xt)) : ee.kind === 249 ? (C.nonLocalJumps |= 2, xt = "break") : (C.nonLocalJumps |= 4, xt = "continue"); let Ln = t.createStringLiteral(xt); if (C.loopOutParameters.length) { let mr = C.loopOutParameters, Vr; for (let gi = 0; gi < mr.length; gi++) { let Ea = kc(mr[gi], 1); gi === 0 ? Vr = Ea : Vr = t.createBinaryExpression(Vr, 27, Ea) } Ln = t.createBinaryExpression(Vr, 27, Ln) } return t.createReturnStatement(Ln) } } return xn(ee, ie, e) } function Ce(ee) { let Ze = t.createVariableDeclaration(t.getLocalName(ee, !0), void 0, void 0, Be(ee)); Ir(Ze, ee); let At = [], xt = t.createVariableStatement(void 0, t.createVariableDeclarationList([Ze])); if (Ir(xt, ee), it(xt, ee), mu(xt), At.push(xt), Mr(ee, 1)) { let Ln = Mr(ee, 1024) ? t.createExportDefault(t.getLocalName(ee)) : t.createExternalModuleExport(t.getLocalName(ee)); Ir(Ln, xt), At.push(Ln) } let qt = Ya(ee); return qt & 8388608 || (At.push(t.createEndOfDeclarationMarker(ee)), Jn(xt, qt | 8388608)), zp(At) } function Ie(ee) { return Be(ee) } function Be(ee) { ee.name && $o(); let Ze = P0(ee), At = t.createFunctionExpression(void 0, void 0, void 0, void 0, Ze ? [t.createParameterDeclaration(void 0, void 0, t.createUniqueName("_super", 48))] : [], void 0, Ne(ee, Ze)); Jn(At, Ya(ee) & 131072 | 1048576); let xt = t.createPartiallyEmittedExpression(At); r2(xt, ee.end), Jn(xt, 3072); let qt = t.createPartiallyEmittedExpression(xt); r2(qt, xo(S, ee.pos)), Jn(qt, 3072); let Ln = t.createParenthesizedExpression(t.createCallExpression(qt, void 0, Ze ? [L.checkDefined($e(Ze.expression, ie, ot))] : [])); return nO(Ln, 3, "* @class "), Ln } function Ne(ee, Ze) { let At = [], xt = t.getInternalName(ee), qt = q6(xt) ? t.getGeneratedNameForNode(xt) : xt; i(), Le(At, ee, Ze), Ye(At, ee, qt, Ze), Dt(At, ee); let Ln = _W(xo(S, ee.members.end), 19), mr = t.createPartiallyEmittedExpression(qt); r2(mr, Ln.end), Jn(mr, 3072); let Vr = t.createReturnStatement(mr); aL(Vr, Ln.pos), Jn(Vr, 3840), At.push(Vr), em(At, s()); let gi = t.createBlock(it(t.createNodeArray(At), ee.members), !0); return Jn(gi, 3072), gi } function Le(ee, Ze, At) { At && ee.push(it(t.createExpressionStatement(r().createExtendsHelper(t.getInternalName(Ze))), At)) } function Ye(ee, Ze, At, xt) { let qt = C; C = void 0; let Ln = B(32662, 73), mr = Vm(Ze), Vr = io(mr, xt !== void 0), gi = t.createFunctionDeclaration(void 0, void 0, At, void 0, _t(mr, Vr), void 0, Rt(mr, Ze, xt, Vr)); it(gi, mr || Ze), xt && Jn(gi, 16), ee.push(gi), q(Ln, 98304, 0), C = qt } function _t(ee, Ze) { return Sc(ee && !Ze ? ee.parameters : void 0, ie, e) || [] } function ct(ee, Ze) { let At = []; o(), t.mergeLexicalEnvironment(At, s()), Ze && At.push(t.createReturnStatement(Qt())); let xt = t.createNodeArray(At); it(xt, ee.members); let qt = t.createBlock(xt, !0); return it(qt, ee), Jn(qt, 3072), qt } function Rt(ee, Ze, At, xt) { let qt = !!At && ql(At.expression).kind !== 104; if (!ee) return ct(Ze, qt); let Ln = [], mr = []; o(); let Vr = v8(ee.body.statements, B_), { superCall: gi, superStatementIndex: Ea } = We(ee.body.statements, Vr), bo = Ea === -1 ? Vr.length : Ea + 1, Qo = bo; xt || (Qo = t.copyStandardPrologue(ee.body.statements, Ln, Qo, !1)), xt || (Qo = t.copyCustomPrologue(ee.body.statements, mr, Qo, ie, void 0)); let Cs; if (xt ? Cs = Qt() : gi && (Cs = se(gi)), Cs && (x |= 8192), _n(Ln, ee), Ni(Ln, ee, xt), si(mr, On(ee.body.statements, ie, ca, Qo)), t.mergeLexicalEnvironment(Ln, s()), nn(Ln, ee, !1), qt || Cs) if (Cs && bo === ee.body.statements.length && !(ee.body.transformFlags & 16384)) { let Pd = Ga(Ga(Cs, ar).left, Pa), Dc = t.createReturnStatement(Cs); hl(Dc, sm(Pd)), Jn(Pd, 3072), mr.push(Dc) } else Ea <= Vr.length ? pt(mr, ee, Cs || zt()) : (pt(Ln, ee, zt()), Cs && gr(mr, Cs)), qe(ee.body) || mr.push(t.createReturnStatement(t.createUniqueName("_this", 48))); else Pi(Ln, ee); let Bu = t.createBlock(it(t.createNodeArray([...Vr, ...Ln, ...Ea <= Vr.length ? Je : On(ee.body.statements, ie, ca, Vr.length, Ea - Vr.length), ...mr]), ee.body.statements), !0); return it(Bu, ee.body), Bu } function We(ee, Ze) { for (let At = Ze.length; At < ee.length; At += 1) { let xt = AK(ee[At]); if (xt) return { superCall: xt, superStatementIndex: At } } return { superStatementIndex: -1 } } function qe(ee) { if (ee.kind === 250) return !0; if (ee.kind === 242) { let Ze = ee; if (Ze.elseStatement) return qe(Ze.thenStatement) && qe(Ze.elseStatement) } else if (ee.kind === 238) { let Ze = Os(ee.statements); if (Ze && qe(Ze)) return !0 } return !1 } function zt() { return Jn(t.createThis(), 8) } function Qt() { return t.createLogicalOr(t.createLogicalAnd(t.createStrictInequality(t.createUniqueName("_super", 48), t.createNull()), t.createFunctionApplyCall(t.createUniqueName("_super", 48), zt(), t.createIdentifier("arguments"))), zt()) } function tn(ee) { if (!ee.dotDotDotToken) return La(ee.name) ? Ir(it(t.createParameterDeclaration(void 0, void 0, t.getGeneratedNameForNode(ee), void 0, void 0, void 0), ee), ee) : ee.initializer ? Ir(it(t.createParameterDeclaration(void 0, void 0, ee.name, void 0, void 0, void 0), ee), ee) : ee } function kn(ee) { return ee.initializer !== void 0 || La(ee.name) } function _n(ee, Ze) { if (!vt(Ze.parameters, kn)) return !1; let At = !1; for (let xt of Ze.parameters) { let { name: qt, initializer: Ln, dotDotDotToken: mr } = xt; mr || (La(qt) ? At = Gt(ee, xt, qt, Ln) || At : Ln && ($n(ee, xt, qt, Ln), At = !0)) } return At } function Gt(ee, Ze, At, xt) { return At.elements.length > 0 ? (L0(ee, Jn(t.createVariableStatement(void 0, t.createVariableDeclarationList(eE(Ze, ie, e, 0, t.getGeneratedNameForNode(Ze)))), 2097152)), !0) : xt ? (L0(ee, Jn(t.createExpressionStatement(t.createAssignment(t.getGeneratedNameForNode(Ze), L.checkDefined($e(xt, ie, ot)))), 2097152)), !0) : !1 } function $n(ee, Ze, At, xt) { xt = L.checkDefined($e(xt, ie, ot)); let qt = t.createIfStatement(t.createTypeCheck(t.cloneNode(At), "undefined"), Jn(it(t.createBlock([t.createExpressionStatement(Jn(it(t.createAssignment(Jn(go(it(t.cloneNode(At), At), At.parent), 96), Jn(xt, 96 | Ya(xt) | 3072)), Ze), 3072))]), Ze), 3905)); mu(qt), it(qt, Ze), Jn(qt, 2101056), L0(ee, qt) } function ui(ee, Ze) { return !!(ee && ee.dotDotDotToken && !Ze) } function Ni(ee, Ze, At) { let xt = [], qt = Os(Ze.parameters); if (!ui(qt, At)) return !1; let Ln = qt.name.kind === 79 ? go(it(t.cloneNode(qt.name), qt.name), qt.name.parent) : t.createTempVariable(void 0); Jn(Ln, 96); let mr = qt.name.kind === 79 ? t.cloneNode(qt.name) : Ln, Vr = Ze.parameters.length - 1, gi = t.createLoopVariable(); xt.push(Jn(it(t.createVariableStatement(void 0, t.createVariableDeclarationList([t.createVariableDeclaration(Ln, void 0, void 0, t.createArrayLiteralExpression([]))])), qt), 2097152)); let Ea = t.createForStatement(it(t.createVariableDeclarationList([t.createVariableDeclaration(gi, void 0, void 0, t.createNumericLiteral(Vr))]), qt), it(t.createLessThan(gi, t.createPropertyAccessExpression(t.createIdentifier("arguments"), "length")), qt), it(t.createPostfixIncrement(gi), qt), t.createBlock([mu(it(t.createExpressionStatement(t.createAssignment(t.createElementAccessExpression(mr, Vr === 0 ? gi : t.createSubtract(gi, t.createNumericLiteral(Vr))), t.createElementAccessExpression(t.createIdentifier("arguments"), gi))), qt))])); return Jn(Ea, 2097152), mu(Ea), xt.push(Ea), qt.name.kind !== 79 && xt.push(Jn(it(t.createVariableStatement(void 0, t.createVariableDeclarationList(eE(qt, ie, e, 0, mr))), qt), 2097152)), rH(ee, xt), !0 } function Pi(ee, Ze) { return x & 65536 && Ze.kind !== 216 ? (pt(ee, Ze, t.createThis()), !0) : !1 } function gr(ee, Ze) { jo(); let At = t.createExpressionStatement(t.createBinaryExpression(t.createThis(), 63, Ze)); L0(ee, At), hl(At, ec(Ze).parent) } function pt(ee, Ze, At) { jo(); let xt = t.createVariableStatement(void 0, t.createVariableDeclarationList([t.createVariableDeclaration(t.createUniqueName("_this", 48), void 0, void 0, At)])); Jn(xt, 2100224), Ho(xt, Ze), L0(ee, xt) } function nn(ee, Ze, At) { if (x & 32768) { let xt; switch (Ze.kind) { case 216: return ee; case 171: case 174: case 175: xt = t.createVoidZero(); break; case 173: xt = t.createPropertyAccessExpression(Jn(t.createThis(), 8), "constructor"); break; case 259: case 215: xt = t.createConditionalExpression(t.createLogicalAnd(Jn(t.createThis(), 8), t.createBinaryExpression(Jn(t.createThis(), 8), 102, t.getLocalName(Ze))), void 0, t.createPropertyAccessExpression(Jn(t.createThis(), 8), "constructor"), void 0, t.createVoidZero()); break; default: return L.failBadSyntaxKind(Ze) }let qt = t.createVariableStatement(void 0, t.createVariableDeclarationList([t.createVariableDeclaration(t.createUniqueName("_newTarget", 48), void 0, void 0, xt)])); Jn(qt, 2100224), At && (ee = ee.slice()), L0(ee, qt) } return ee } function Dt(ee, Ze) { for (let At of Ze.members) switch (At.kind) { case 237: ee.push(pn(At)); break; case 171: ee.push(An(Ri(Ze, At), At, Ze)); break; case 174: case 175: let xt = kT(Ze.members, At); At === xt.firstAccessor && ee.push(Kn(Ri(Ze, At), xt, Ze)); break; case 173: case 172: break; default: L.failBadSyntaxKind(At, v && v.fileName); break } } function pn(ee) { return it(t.createEmptyStatement(), ee) } function An(ee, Ze, At) { let xt = sm(Ze), qt = pb(Ze), Ln = En(Ze, Ze, void 0, At), mr = $e(Ze.name, ie, Ys); L.assert(mr); let Vr; if (!pi(mr) && MR(e.getCompilerOptions())) { let Ea = ts(mr) ? mr.expression : Re(mr) ? t.createStringLiteral(Gi(mr.escapedText)) : mr; Vr = t.createObjectDefinePropertyCall(ee, Ea, t.createPropertyDescriptor({ value: Ln, enumerable: !1, writable: !0, configurable: !0 })) } else { let Ea = VT(t, ee, mr, Ze.name); Vr = t.createAssignment(Ea, Ln) } Jn(Ln, 3072), Ho(Ln, qt); let gi = it(t.createExpressionStatement(Vr), Ze); return Ir(gi, Ze), hl(gi, xt), Jn(gi, 96), gi } function Kn(ee, Ze, At) { let xt = t.createExpressionStatement(hi(ee, Ze, At, !1)); return Jn(xt, 3072), Ho(xt, pb(Ze.firstAccessor)), xt } function hi(ee, { firstAccessor: Ze, getAccessor: At, setAccessor: xt }, qt, Ln) { let mr = go(it(t.cloneNode(ee), ee), ee.parent); Jn(mr, 3136), Ho(mr, Ze.name); let Vr = $e(Ze.name, ie, Ys); if (L.assert(Vr), pi(Vr)) return L.failBadSyntaxKind(Vr, "Encountered unhandled private identifier while transforming ES2015."); let gi = Zz(t, Vr); Jn(gi, 3104), Ho(gi, Ze.name); let Ea = []; if (At) { let Qo = En(At, void 0, void 0, qt); Ho(Qo, pb(At)), Jn(Qo, 1024); let Cs = t.createPropertyAssignment("get", Qo); hl(Cs, sm(At)), Ea.push(Cs) } if (xt) { let Qo = En(xt, void 0, void 0, qt); Ho(Qo, pb(xt)), Jn(Qo, 1024); let Cs = t.createPropertyAssignment("set", Qo); hl(Cs, sm(xt)), Ea.push(Cs) } Ea.push(t.createPropertyAssignment("enumerable", At || xt ? t.createFalse() : t.createTrue()), t.createPropertyAssignment("configurable", t.createTrue())); let bo = t.createCallExpression(t.createPropertyAccessExpression(t.createIdentifier("Object"), "defineProperty"), void 0, [mr, gi, t.createObjectLiteralExpression(Ea, !0)]); return Ln && mu(bo), bo } function ri(ee) { ee.transformFlags & 16384 && !(x & 16384) && (x |= 65536); let Ze = C; C = void 0; let At = B(15232, 66), xt = t.createFunctionExpression(void 0, void 0, void 0, void 0, Sc(ee.parameters, ie, e), void 0, dr(ee)); return it(xt, ee), Ir(xt, ee), Jn(xt, 16), q(At, 0, 0), C = Ze, xt } function vn(ee) { let Ze = Ya(ee) & 524288 ? B(32662, 69) : B(32670, 65), At = C; C = void 0; let xt = Sc(ee.parameters, ie, e), qt = dr(ee), Ln = x & 32768 ? t.getLocalName(ee) : ee.name; return q(Ze, 98304, 0), C = At, t.updateFunctionExpression(ee, void 0, ee.asteriskToken, Ln, void 0, xt, void 0, qt) } function Ht(ee) { let Ze = C; C = void 0; let At = B(32670, 65), xt = Sc(ee.parameters, ie, e), qt = dr(ee), Ln = x & 32768 ? t.getLocalName(ee) : ee.name; return q(At, 98304, 0), C = Ze, t.updateFunctionDeclaration(ee, On(ee.modifiers, ie, Ha), ee.asteriskToken, Ln, void 0, xt, void 0, qt) } function En(ee, Ze, At, xt) { let qt = C; C = void 0; let Ln = xt && Yr(xt) && !Ca(ee) ? B(32670, 73) : B(32670, 65), mr = Sc(ee.parameters, ie, e), Vr = dr(ee); return x & 32768 && !At && (ee.kind === 259 || ee.kind === 215) && (At = t.getGeneratedNameForNode(ee)), q(Ln, 98304, 0), C = qt, Ir(it(t.createFunctionExpression(void 0, ee.asteriskToken, At, void 0, mr, void 0, Vr), Ze), ee) } function dr(ee) { let Ze = !1, At = !1, xt, qt, Ln = [], mr = [], Vr = ee.body, gi; if (o(), Va(Vr) && (gi = t.copyStandardPrologue(Vr.statements, Ln, 0, !1), gi = t.copyCustomPrologue(Vr.statements, mr, gi, ie, C6), gi = t.copyCustomPrologue(Vr.statements, mr, gi, ie, I6)), Ze = _n(mr, ee) || Ze, Ze = Ni(mr, ee, !1) || Ze, Va(Vr)) gi = t.copyCustomPrologue(Vr.statements, mr, gi, ie), xt = Vr.statements, si(mr, On(Vr.statements, ie, ca, gi)), !Ze && Vr.multiLine && (Ze = !0); else { L.assert(ee.kind === 216), xt = i4(Vr, -1); let bo = ee.equalsGreaterThanToken; !ws(bo) && !ws(Vr) && (DR(bo, Vr, v) ? At = !0 : Ze = !0); let Qo = $e(Vr, ie, ot), Cs = t.createReturnStatement(Qo); it(Cs, Vr), pue(Cs, Vr), Jn(Cs, 2880), mr.push(Cs), qt = Vr } if (t.mergeLexicalEnvironment(Ln, s()), nn(Ln, ee, !1), Pi(Ln, ee), vt(Ln) && (Ze = !0), mr.unshift(...Ln), Va(Vr) && up(mr, Vr.statements)) return Vr; let Ea = t.createBlock(it(t.createNodeArray(mr), xt), Ze); return it(Ea, ee.body), !Ze && At && Jn(Ea, 1), qt && _ue(Ea, 19, qt), Ir(Ea, ee.body), Ea } function Cr(ee, Ze) { if (Ze) return xn(ee, ie, e); let At = x & 256 ? B(7104, 512) : B(6976, 128), xt = xn(ee, ie, e); return q(At, 0, 0), xt } function Se(ee) { return xn(ee, $, e) } function at(ee, Ze) { return xn(ee, Ze ? $ : ie, e) } function Tt(ee, Ze) { return Fg(ee) ? KT(ee, ie, e, 0, !Ze) : ee.operatorToken.kind === 27 ? t.updateBinaryExpression(ee, L.checkDefined($e(ee.left, $, ot)), ee.operatorToken, L.checkDefined($e(ee.right, Ze ? $ : ie, ot))) : xn(ee, ie, e) } function ve(ee, Ze) { if (Ze) return xn(ee, $, e); let At; for (let qt = 0; qt < ee.elements.length; qt++) { let Ln = ee.elements[qt], mr = $e(Ln, qt < ee.elements.length - 1 ? $ : ie, ot); (At || mr !== Ln) && (At || (At = ee.elements.slice(0, qt)), L.assert(mr), At.push(mr)) } let xt = At ? it(t.createNodeArray(At), ee.elements) : ee.elements; return t.updateCommaListExpression(ee, xt) } function nt(ee) { return ee.declarationList.declarations.length === 1 && !!ee.declarationList.declarations[0].initializer && !!(o_(ee.declarationList.declarations[0].initializer) & 1) } function ce(ee) { let Ze = B(0, Mr(ee, 1) ? 32 : 0), At; if (C && !(ee.declarationList.flags & 3) && !nt(ee)) { let xt; for (let qt of ee.declarationList.declarations) if (Kr(C, qt), qt.initializer) { let Ln; La(qt.name) ? Ln = KT(qt, ie, e, 0) : (Ln = t.createBinaryExpression(qt.name, 63, L.checkDefined($e(qt.initializer, ie, ot))), it(Ln, qt)), xt = Sn(xt, Ln) } xt ? At = it(t.createExpressionStatement(t.inlineExpressions(xt)), ee) : At = void 0 } else At = xn(ee, ie, e); return q(Ze, 0, 0), At } function Q(ee) { if (ee.flags & 3 || ee.transformFlags & 524288) { ee.flags & 3 && $o(); let Ze = On(ee.declarations, ee.flags & 1 ? Oe : je, wi), At = t.createVariableDeclarationList(Ze); return Ir(At, ee), it(At, ee), hl(At, ee), ee.transformFlags & 524288 && (La(ee.declarations[0].name) || La(To(ee.declarations).name)) && Ho(At, ue(Ze)), At } return xn(ee, ie, e) } function ue(ee) { let Ze = -1, At = -1; for (let xt of ee) Ze = Ze === -1 ? xt.pos : xt.pos === -1 ? Ze : Math.min(Ze, xt.pos), At = Math.max(At, xt.end); return Gf(Ze, At) } function G(ee) { let Ze = d.getNodeCheckFlags(ee), At = Ze & 16384, xt = Ze & 32768; return !((x & 64) !== 0 || At && xt && (x & 512) !== 0) && (x & 4096) === 0 && (!d.isDeclarationWithCollidingName(ee) || xt && !At && (x & 6144) === 0) } function Oe(ee) { let Ze = ee.name; return La(Ze) ? je(ee) : !ee.initializer && G(ee) ? t.updateVariableDeclaration(ee, ee.name, void 0, void 0, t.createVoidZero()) : xn(ee, ie, e) } function je(ee) { let Ze = B(32, 0), At; return La(ee.name) ? At = eE(ee, ie, e, 0, void 0, (Ze & 32) !== 0) : At = xn(ee, ie, e), q(Ze, 0, 0), At } function Ge(ee) { C.labels.set(vr(ee.label), !0) } function kt(ee) { C.labels.set(vr(ee.label), !1) } function Kt(ee) { C && !C.labels && (C.labels = new Map); let Ze = xH(ee, C && Ge); return Wy(Ze, !1) ? ln(Ze, ee) : t.restoreEnclosingLabel(L.checkDefined($e(Ze, ie, ca, t.liftToBlock)), ee, C && kt) } function ln(ee, Ze) { switch (ee.kind) { case 243: case 244: return ae(ee, Ze); case 245: return rt(ee, Ze); case 246: return Ke(ee, Ze); case 247: return oe(ee, Ze) } } function ir(ee, Ze, At, xt, qt) { let Ln = B(ee, Ze), mr = Si(At, xt, Ln, qt); return q(Ln, 0, 0), mr } function ae(ee, Ze) { return ir(0, 1280, ee, Ze) } function rt(ee, Ze) { return ir(5056, 3328, ee, Ze) } function Ot(ee) { return t.updateForStatement(ee, $e(ee.initializer, $, pp), $e(ee.condition, ie, ot), $e(ee.incrementor, $, ot), L.checkDefined($e(ee.statement, ie, ca, t.liftToBlock))) } function Ke(ee, Ze) { return ir(3008, 5376, ee, Ze) } function oe(ee, Ze) { return ir(3008, 5376, ee, Ze, f.downlevelIteration ? j : Te) } function pe(ee, Ze, At) { let xt = [], qt = ee.initializer; if (pu(qt)) { ee.initializer.flags & 3 && $o(); let Ln = Sl(qt.declarations); if (Ln && La(Ln.name)) { let mr = eE(Ln, ie, e, 0, Ze), Vr = it(t.createVariableDeclarationList(mr), ee.initializer); Ir(Vr, ee.initializer), Ho(Vr, Gf(mr[0].pos, To(mr).end)), xt.push(t.createVariableStatement(void 0, Vr)) } else xt.push(it(t.createVariableStatement(void 0, Ir(it(t.createVariableDeclarationList([t.createVariableDeclaration(Ln ? Ln.name : t.createTempVariable(void 0), void 0, void 0, Ze)]), fb(qt, -1)), qt)), i4(qt, -1))) } else { let Ln = t.createAssignment(qt, Ze); Fg(Ln) ? xt.push(t.createExpressionStatement(Tt(Ln, !0))) : (r2(Ln, qt.end), xt.push(it(t.createExpressionStatement(L.checkDefined($e(Ln, ie, ot))), i4(qt, -1)))) } if (At) return z(si(xt, At)); { let Ln = $e(ee.statement, ie, ca, t.liftToBlock); return L.assert(Ln), Va(Ln) ? t.updateBlock(Ln, it(t.createNodeArray(Qi(xt, Ln.statements)), Ln.statements)) : (xt.push(Ln), z(xt)) } } function z(ee) { return Jn(t.createBlock(t.createNodeArray(ee), !0), 864) } function Te(ee, Ze, At) { let xt = $e(ee.expression, ie, ot); L.assert(xt); let qt = t.createLoopVariable(), Ln = Re(xt) ? t.getGeneratedNameForNode(xt) : t.createTempVariable(void 0); Jn(xt, 96 | Ya(xt)); let mr = it(t.createForStatement(Jn(it(t.createVariableDeclarationList([it(t.createVariableDeclaration(qt, void 0, void 0, t.createNumericLiteral(0)), fb(ee.expression, -1)), it(t.createVariableDeclaration(Ln, void 0, void 0, xt), ee.expression)]), ee.expression), 4194304), it(t.createLessThan(qt, t.createPropertyAccessExpression(Ln, "length")), ee.expression), it(t.createPostfixIncrement(qt), ee.expression), pe(ee, t.createElementAccessExpression(Ln, qt), At)), ee); return Jn(mr, 512), it(mr, ee), t.restoreEnclosingLabel(mr, Ze, C && kt) } function j(ee, Ze, At, xt) { let qt = $e(ee.expression, ie, ot); L.assert(qt); let Ln = Re(qt) ? t.getGeneratedNameForNode(qt) : t.createTempVariable(void 0), mr = Re(qt) ? t.getGeneratedNameForNode(Ln) : t.createTempVariable(void 0), Vr = t.createUniqueName("e"), gi = t.getGeneratedNameForNode(Vr), Ea = t.createTempVariable(void 0), bo = it(r().createValuesHelper(qt), ee.expression), Qo = t.createCallExpression(t.createPropertyAccessExpression(Ln, "next"), void 0, []); l(Vr), l(Ea); let Cs = xt & 1024 ? t.inlineExpressions([t.createAssignment(Vr, t.createVoidZero()), bo]) : bo, Bu = Jn(it(t.createForStatement(Jn(it(t.createVariableDeclarationList([it(t.createVariableDeclaration(Ln, void 0, void 0, Cs), ee.expression), t.createVariableDeclaration(mr, void 0, void 0, Qo)]), ee.expression), 4194304), t.createLogicalNot(t.createPropertyAccessExpression(mr, "done")), t.createAssignment(mr, Qo), pe(ee, t.createPropertyAccessExpression(mr, "value"), At)), ee), 512); return t.createTryStatement(t.createBlock([t.restoreEnclosingLabel(Bu, Ze, C && kt)]), t.createCatchClause(t.createVariableDeclaration(gi), Jn(t.createBlock([t.createExpressionStatement(t.createAssignment(Vr, t.createObjectLiteralExpression([t.createPropertyAssignment("error", gi)])))]), 1)), t.createBlock([t.createTryStatement(t.createBlock([Jn(t.createIfStatement(t.createLogicalAnd(t.createLogicalAnd(mr, t.createLogicalNot(t.createPropertyAccessExpression(mr, "done"))), t.createAssignment(Ea, t.createPropertyAccessExpression(Ln, "return"))), t.createExpressionStatement(t.createFunctionCallCall(Ea, Ln, []))), 1)]), void 0, Jn(t.createBlock([Jn(t.createIfStatement(Vr, t.createThrowStatement(t.createPropertyAccessExpression(Vr, "error"))), 1)]), 1))])) } function yt(ee) { let Ze = ee.properties, At = -1, xt = !1; for (let Vr = 0; Vr < Ze.length; Vr++) { let gi = Ze[Vr]; if (gi.transformFlags & 1048576 && x & 4 || (xt = L.checkDefined(gi.name).kind === 164)) { At = Vr; break } } if (At < 0) return xn(ee, ie, e); let qt = t.createTempVariable(l), Ln = [], mr = t.createAssignment(qt, Jn(t.createObjectLiteralExpression(On(Ze, ie, Og, 0, At), ee.multiLine), xt ? 131072 : 0)); return ee.multiLine && mu(mr), Ln.push(mr), Co(Ln, ee, qt, At), Ln.push(ee.multiLine ? mu(go(it(t.cloneNode(qt), qt), qt.parent)) : qt), t.inlineExpressions(Ln) } function lt(ee) { return (d.getNodeCheckFlags(ee) & 8192) !== 0 } function Qe(ee) { return FT(ee) && !!ee.initializer && lt(ee.initializer) } function Vt(ee) { return FT(ee) && !!ee.condition && lt(ee.condition) } function Hn(ee) { return FT(ee) && !!ee.incrementor && lt(ee.incrementor) } function jr(ee) { return ei(ee) || Qe(ee) } function ei(ee) { return (d.getNodeCheckFlags(ee) & 4096) !== 0 } function Kr(ee, Ze) { ee.hoistedLocalVariables || (ee.hoistedLocalVariables = []), At(Ze.name); function At(xt) { if (xt.kind === 79) ee.hoistedLocalVariables.push(xt); else for (let qt of xt.elements) ol(qt) || At(qt.name) } } function Si(ee, Ze, At, xt) { if (!jr(ee)) { let bo; C && (bo = C.allowedNonLabeledJumps, C.allowedNonLabeledJumps = 6); let Qo = xt ? xt(ee, Ze, void 0, At) : t.restoreEnclosingLabel(FT(ee) ? Ot(ee) : xn(ee, ie, e), Ze, C && kt); return C && (C.allowedNonLabeledJumps = bo), Qo } let qt = Fo(ee), Ln = [], mr = C; C = qt; let Vr = Qe(ee) ? gn(ee, qt) : void 0, gi = ei(ee) ? Ki(ee, qt, mr) : void 0; C = mr, Vr && Ln.push(Vr.functionDeclaration), gi && Ln.push(gi.functionDeclaration), Qr(Ln, qt, mr), Vr && Ln.push(mc(Vr.functionName, Vr.containsYield)); let Ea; if (gi) if (xt) Ea = xt(ee, Ze, gi.part, At); else { let bo = Ja(ee, Vr, t.createBlock(gi.part, !0)); Ea = t.restoreEnclosingLabel(bo, Ze, C && kt) } else { let bo = Ja(ee, Vr, L.checkDefined($e(ee.statement, ie, ca, t.liftToBlock))); Ea = t.restoreEnclosingLabel(bo, Ze, C && kt) } return Ln.push(Ea), Ln } function Ja(ee, Ze, At) { switch (ee.kind) { case 245: return Za(ee, Ze, At); case 246: return Hi(ee, At); case 247: return Fa(ee, At); case 243: return xi(ee, At); case 244: return Nr(ee, At); default: return L.failBadSyntaxKind(ee, "IterationStatement expected") } } function Za(ee, Ze, At) { let xt = ee.condition && lt(ee.condition), qt = xt || ee.incrementor && lt(ee.incrementor); return t.updateForStatement(ee, $e(Ze ? Ze.part : ee.initializer, $, pp), $e(xt ? void 0 : ee.condition, ie, ot), $e(qt ? void 0 : ee.incrementor, $, ot), At) } function Fa(ee, Ze) { return t.updateForOfStatement(ee, void 0, L.checkDefined($e(ee.initializer, ie, pp)), L.checkDefined($e(ee.expression, ie, ot)), Ze) } function Hi(ee, Ze) { return t.updateForInStatement(ee, L.checkDefined($e(ee.initializer, ie, pp)), L.checkDefined($e(ee.expression, ie, ot)), Ze) } function xi(ee, Ze) { return t.updateDoStatement(ee, Ze, L.checkDefined($e(ee.expression, ie, ot))) } function Nr(ee, Ze) { return t.updateWhileStatement(ee, L.checkDefined($e(ee.expression, ie, ot)), Ze) } function Fo(ee) { let Ze; switch (ee.kind) { case 245: case 246: case 247: let Ln = ee.initializer; Ln && Ln.kind === 258 && (Ze = Ln); break }let At = [], xt = []; if (Ze && G_(Ze) & 3) { let Ln = Qe(ee) || Vt(ee) || Hn(ee); for (let mr of Ze.declarations) aa(ee, mr, At, xt, Ln) } let qt = { loopParameters: At, loopOutParameters: xt }; return C && (C.argumentsName && (qt.argumentsName = C.argumentsName), C.thisName && (qt.thisName = C.thisName), C.hoistedLocalVariables && (qt.hoistedLocalVariables = C.hoistedLocalVariables)), qt } function Qr(ee, Ze, At) { let xt; if (Ze.argumentsName && (At ? At.argumentsName = Ze.argumentsName : (xt || (xt = [])).push(t.createVariableDeclaration(Ze.argumentsName, void 0, void 0, t.createIdentifier("arguments")))), Ze.thisName && (At ? At.thisName = Ze.thisName : (xt || (xt = [])).push(t.createVariableDeclaration(Ze.thisName, void 0, void 0, t.createIdentifier("this")))), Ze.hoistedLocalVariables) if (At) At.hoistedLocalVariables = Ze.hoistedLocalVariables; else { xt || (xt = []); for (let qt of Ze.hoistedLocalVariables) xt.push(t.createVariableDeclaration(qt)) } if (Ze.loopOutParameters.length) { xt || (xt = []); for (let qt of Ze.loopOutParameters) xt.push(t.createVariableDeclaration(qt.outParamName)) } Ze.conditionVariable && (xt || (xt = []), xt.push(t.createVariableDeclaration(Ze.conditionVariable, void 0, void 0, t.createFalse()))), xt && ee.push(t.createVariableStatement(void 0, t.createVariableDeclarationList(xt))) } function Wi(ee) { return t.createVariableDeclaration(ee.originalName, void 0, void 0, ee.outParamName) } function gn(ee, Ze) { let At = t.createUniqueName("_loop_init"), xt = (ee.initializer.transformFlags & 1048576) !== 0, qt = 0; Ze.containsLexicalThis && (qt |= 16), xt && x & 4 && (qt |= 524288); let Ln = []; Ln.push(t.createVariableStatement(void 0, ee.initializer)), Ps(Ze.loopOutParameters, 2, 1, Ln); let mr = t.createVariableStatement(void 0, Jn(t.createVariableDeclarationList([t.createVariableDeclaration(At, void 0, void 0, Jn(t.createFunctionExpression(void 0, xt ? t.createToken(41) : void 0, void 0, void 0, void 0, void 0, L.checkDefined($e(t.createBlock(Ln, !0), ie, Va))), qt))]), 4194304)), Vr = t.createVariableDeclarationList(on(Ze.loopOutParameters, Wi)); return { functionName: At, containsYield: xt, functionDeclaration: mr, part: Vr } } function Ki(ee, Ze, At) { let xt = t.createUniqueName("_loop"); i(); let qt = $e(ee.statement, ie, ca, t.liftToBlock), Ln = s(), mr = []; (Vt(ee) || Hn(ee)) && (Ze.conditionVariable = t.createUniqueName("inc"), ee.incrementor ? mr.push(t.createIfStatement(Ze.conditionVariable, t.createExpressionStatement(L.checkDefined($e(ee.incrementor, ie, ot))), t.createExpressionStatement(t.createAssignment(Ze.conditionVariable, t.createTrue())))) : mr.push(t.createIfStatement(t.createLogicalNot(Ze.conditionVariable), t.createExpressionStatement(t.createAssignment(Ze.conditionVariable, t.createTrue())))), Vt(ee) && mr.push(t.createIfStatement(t.createPrefixUnaryExpression(53, L.checkDefined($e(ee.condition, ie, ot))), L.checkDefined($e(t.createBreakStatement(), ie, ca))))), L.assert(qt), Va(qt) ? si(mr, qt.statements) : mr.push(qt), Ps(Ze.loopOutParameters, 1, 1, mr), em(mr, Ln); let Vr = t.createBlock(mr, !0); Va(qt) && Ir(Vr, qt); let gi = (ee.statement.transformFlags & 1048576) !== 0, Ea = 1048576; Ze.containsLexicalThis && (Ea |= 16), gi && x & 4 && (Ea |= 524288); let bo = t.createVariableStatement(void 0, Jn(t.createVariableDeclarationList([t.createVariableDeclaration(xt, void 0, void 0, Jn(t.createFunctionExpression(void 0, gi ? t.createToken(41) : void 0, void 0, void 0, Ze.loopParameters, void 0, Vr), Ea))]), 4194304)), Qo = xc(xt, Ze, At, gi); return { functionName: xt, containsYield: gi, functionDeclaration: bo, part: Qo } } function kc(ee, Ze) { let At = Ze === 0 ? ee.outParamName : ee.originalName, xt = Ze === 0 ? ee.originalName : ee.outParamName; return t.createBinaryExpression(xt, 63, At) } function Ps(ee, Ze, At, xt) { for (let qt of ee) qt.flags & Ze && xt.push(t.createExpressionStatement(kc(qt, At))) } function mc(ee, Ze) { let At = t.createCallExpression(ee, void 0, []), xt = Ze ? t.createYieldExpression(t.createToken(41), Jn(At, 16777216)) : At; return t.createExpressionStatement(xt) } function xc(ee, Ze, At, xt) { let qt = [], Ln = !(Ze.nonLocalJumps & -5) && !Ze.labeledNonLocalBreaks && !Ze.labeledNonLocalContinues, mr = t.createCallExpression(ee, void 0, on(Ze.loopParameters, gi => gi.name)), Vr = xt ? t.createYieldExpression(t.createToken(41), Jn(mr, 16777216)) : mr; if (Ln) qt.push(t.createExpressionStatement(Vr)), Ps(Ze.loopOutParameters, 1, 0, qt); else { let gi = t.createUniqueName("state"), Ea = t.createVariableStatement(void 0, t.createVariableDeclarationList([t.createVariableDeclaration(gi, void 0, void 0, Vr)])); if (qt.push(Ea), Ps(Ze.loopOutParameters, 1, 0, qt), Ze.nonLocalJumps & 8) { let bo; At ? (At.nonLocalJumps |= 8, bo = t.createReturnStatement(gi)) : bo = t.createReturnStatement(t.createPropertyAccessExpression(gi, "value")), qt.push(t.createIfStatement(t.createTypeCheck(gi, "object"), bo)) } if (Ze.nonLocalJumps & 2 && qt.push(t.createIfStatement(t.createStrictEquality(gi, t.createStringLiteral("break")), t.createBreakStatement())), Ze.labeledNonLocalBreaks || Ze.labeledNonLocalContinues) { let bo = []; ro(Ze.labeledNonLocalBreaks, !0, gi, At, bo), ro(Ze.labeledNonLocalContinues, !1, gi, At, bo), qt.push(t.createSwitchStatement(gi, t.createCaseBlock(bo))) } } return qt } function hc(ee, Ze, At, xt) { Ze ? (ee.labeledNonLocalBreaks || (ee.labeledNonLocalBreaks = new Map), ee.labeledNonLocalBreaks.set(At, xt)) : (ee.labeledNonLocalContinues || (ee.labeledNonLocalContinues = new Map), ee.labeledNonLocalContinues.set(At, xt)) } function ro(ee, Ze, At, xt, qt) { ee && ee.forEach((Ln, mr) => { let Vr = []; if (!xt || xt.labels && xt.labels.get(mr)) { let gi = t.createIdentifier(mr); Vr.push(Ze ? t.createBreakStatement(gi) : t.createContinueStatement(gi)) } else hc(xt, Ze, mr, Ln), Vr.push(t.createReturnStatement(At)); qt.push(t.createCaseClause(t.createStringLiteral(Ln), Vr)) }) } function aa(ee, Ze, At, xt, qt) { let Ln = Ze.name; if (La(Ln)) for (let mr of Ln.elements) ol(mr) || aa(ee, mr, At, xt, qt); else { At.push(t.createParameterDeclaration(void 0, void 0, Ln)); let mr = d.getNodeCheckFlags(Ze); if (mr & 262144 || qt) { let Vr = t.createUniqueName("out_" + vr(Ln)), gi = 0; mr & 262144 && (gi |= 1), FT(ee) && (ee.initializer && d.isBindingCapturedByNode(ee.initializer, Ze) && (gi |= 2), (ee.condition && d.isBindingCapturedByNode(ee.condition, Ze) || ee.incrementor && d.isBindingCapturedByNode(ee.incrementor, Ze)) && (gi |= 1)), xt.push({ flags: gi, originalName: Ln, outParamName: Vr }) } } } function Co(ee, Ze, At, xt) { let qt = Ze.properties, Ln = qt.length; for (let mr = xt; mr < Ln; mr++) { let Vr = qt[mr]; switch (Vr.kind) { case 174: case 175: let gi = kT(Ze.properties, Vr); Vr === gi.firstAccessor && ee.push(hi(At, gi, Ze, !!Ze.multiLine)); break; case 171: ee.push(md(Vr, At, Ze, Ze.multiLine)); break; case 299: ee.push(gc(Vr, At, Ze.multiLine)); break; case 300: ee.push(Ll(Vr, At, Ze.multiLine)); break; default: L.failBadSyntaxKind(Ze); break } } } function gc(ee, Ze, At) { let xt = t.createAssignment(VT(t, Ze, L.checkDefined($e(ee.name, ie, Ys))), L.checkDefined($e(ee.initializer, ie, ot))); return it(xt, ee), At && mu(xt), xt } function Ll(ee, Ze, At) { let xt = t.createAssignment(VT(t, Ze, L.checkDefined($e(ee.name, ie, Ys))), t.cloneNode(ee.name)); return it(xt, ee), At && mu(xt), xt } function md(ee, Ze, At, xt) { let qt = t.createAssignment(VT(t, Ze, L.checkDefined($e(ee.name, ie, Ys))), En(ee, ee, void 0, At)); return it(qt, ee), xt && mu(qt), qt } function Pc(ee) { let Ze = B(7104, 0), At; if (L.assert(!!ee.variableDeclaration, "Catch clause variable should always be present when downleveling ES2015."), La(ee.variableDeclaration.name)) { let xt = t.createTempVariable(void 0), qt = t.createVariableDeclaration(xt); it(qt, ee.variableDeclaration); let Ln = eE(ee.variableDeclaration, ie, e, 0, xt), mr = t.createVariableDeclarationList(Ln); it(mr, ee.variableDeclaration); let Vr = t.createVariableStatement(void 0, mr); At = t.updateCatchClause(ee, qt, bl(ee.block, Vr)) } else At = xn(ee, ie, e); return q(Ze, 0, 0), At } function bl(ee, Ze) { let At = On(ee.statements, ie, ca); return t.updateBlock(ee, [Ze, ...At]) } function ss(ee) { L.assert(!ts(ee.name)); let Ze = En(ee, fb(ee, -1), void 0, void 0); return Jn(Ze, 1024 | Ya(Ze)), it(t.createPropertyAssignment(ee.name, Ze), ee) } function qs(ee) { L.assert(!ts(ee.name)); let Ze = C; C = void 0; let At = B(32670, 65), xt, qt = Sc(ee.parameters, ie, e), Ln = dr(ee); return ee.kind === 174 ? xt = t.updateGetAccessorDeclaration(ee, ee.modifiers, ee.name, qt, ee.type, Ln) : xt = t.updateSetAccessorDeclaration(ee, ee.modifiers, ee.name, qt, Ln), q(At, 98304, 0), C = Ze, xt } function Rs(ee) { return it(t.createPropertyAssignment(ee.name, ke(t.cloneNode(ee.name))), ee) } function As(ee) { return xn(ee, ie, e) } function jt(ee) { return xn(ee, ie, e) } function yc(ee) { return vt(ee.elements, Km) ? K(ee.elements, !1, !!ee.multiLine, !!ee.elements.hasTrailingComma) : xn(ee, ie, e) } function Ql(ee) { if (o_(ee) & 1) return yu(ee); let Ze = ql(ee.expression); return Ze.kind === 106 || Pu(Ze) || vt(ee.arguments, Km) ? ht(ee, !0) : t.updateCallExpression(ee, L.checkDefined($e(ee.expression, Z, ot)), void 0, On(ee.arguments, ie, ot)) } function yu(ee) { let Ze = Ga(Ga(ql(ee.expression), xs).body, Va), At = Md => Bc(Md) && !!Vo(Md.declarationList.declarations).initializer, xt = C; C = void 0; let qt = On(Ze.statements, fe, ca); C = xt; let Ln = Pr(qt, At), mr = Pr(qt, Md => !At(Md)), gi = Ga(Vo(Ln), Bc).declarationList.declarations[0], Ea = ql(gi.initializer), bo = zr(Ea, Iu); !bo && ar(Ea) && Ea.operatorToken.kind === 27 && (bo = zr(Ea.left, Iu)); let Qo = Ga(bo ? ql(bo.right) : Ea, Pa), Cs = Ga(ql(Qo.expression), ms), Bu = Cs.body.statements, Pd = 0, Dc = -1, gd = []; if (bo) { let Md = zr(Bu[Pd], Ol); Md && (gd.push(Md), Pd++), gd.push(Bu[Pd]), Pd++, gd.push(t.createExpressionStatement(t.createAssignment(bo.left, Ga(gi.name, Re)))) } for (; !j_(Ig(Bu, Dc));)Dc--; si(gd, Bu, Pd, Dc), Dc < -1 && si(gd, Bu, Dc + 1); let Zl = zr(Ig(Bu, Dc), j_); for (let Md of mr) j_(Md) && Zl?.expression && !Re(Zl.expression) ? gd.push(Zl) : gd.push(Md); return si(gd, Ln, 1), t.restoreOuterExpressions(ee.expression, t.restoreOuterExpressions(gi.initializer, t.restoreOuterExpressions(bo && bo.right, t.updateCallExpression(Qo, t.restoreOuterExpressions(Qo.expression, t.updateFunctionExpression(Cs, void 0, void 0, void 0, void 0, Cs.parameters, void 0, t.updateBlock(Cs.body, gd))), void 0, Qo.arguments)))) } function se(ee) { return ht(ee, !1) } function ht(ee, Ze) { if (ee.transformFlags & 32768 || ee.expression.kind === 106 || Pu(ql(ee.expression))) { let { target: At, thisArg: xt } = t.createCallBinding(ee.expression, l); ee.expression.kind === 106 && Jn(xt, 8); let qt; if (ee.transformFlags & 32768 ? qt = t.createFunctionApplyCall(L.checkDefined($e(At, Z, ot)), ee.expression.kind === 106 ? xt : L.checkDefined($e(xt, ie, ot)), K(ee.arguments, !0, !1, !1)) : qt = it(t.createFunctionCallCall(L.checkDefined($e(At, Z, ot)), ee.expression.kind === 106 ? xt : L.checkDefined($e(xt, ie, ot)), On(ee.arguments, ie, ot)), ee), ee.expression.kind === 106) { let Ln = t.createLogicalOr(qt, zt()); qt = Ze ? t.createAssignment(t.createUniqueName("_this", 48), Ln) : Ln } return Ir(qt, ee) } return xn(ee, ie, e) } function wt(ee) { if (vt(ee.arguments, Km)) { let { target: Ze, thisArg: At } = t.createCallBinding(t.createPropertyAccessExpression(ee.expression, "bind"), l); return t.createNewExpression(t.createFunctionApplyCall(L.checkDefined($e(Ze, ie, ot)), At, K(t.createNodeArray([t.createVoidZero(), ...ee.arguments]), !0, !1, !1)), void 0, []) } return xn(ee, ie, e) } function K(ee, Ze, At, xt) { let qt = ee.length, Ln = t_(c8(ee, Xe, (Ea, bo, Qo, Cs) => bo(Ea, At, xt && Cs === qt))); if (Ln.length === 1) { let Ea = Ln[0]; if (Ze && !f.downlevelIteration || UW(Ea.expression) || pL(Ea.expression, "___spreadArray")) return Ea.expression } let mr = r(), Vr = Ln[0].kind !== 0, gi = Vr ? t.createArrayLiteralExpression() : Ln[0].expression; for (let Ea = Vr ? 0 : 1; Ea < Ln.length; Ea++) { let bo = Ln[Ea]; gi = mr.createSpreadArrayHelper(gi, bo.expression, bo.kind === 1 && !Ze) } return gi } function Xe(ee) { return Km(ee) ? ft : pr } function ft(ee) { return on(ee, Yt) } function Yt(ee) { L.assertNode(ee, Km); let Ze = $e(ee.expression, ie, ot); L.assert(Ze); let At = pL(Ze, "___read"), xt = At || UW(Ze) ? 2 : 1; return f.downlevelIteration && xt === 1 && !fu(Ze) && !At && (Ze = r().createReadHelper(Ze, void 0), xt = 2), ppe(xt, Ze) } function pr(ee, Ze, At) { let xt = t.createArrayLiteralExpression(On(t.createNodeArray(ee, At), ie, ot), Ze); return ppe(0, xt) } function yr(ee) { return $e(ee.expression, ie, ot) } function ta(ee) { return it(t.createStringLiteral(ee.text), ee) } function Go(ee) { return ee.hasExtendedUnicodeEscape ? it(t.createStringLiteral(ee.text), ee) : ee } function Ka(ee) { return ee.numericLiteralFlags & 384 ? it(t.createNumericLiteral(ee.text), ee) : ee } function vo(ee) { return OK(e, ee, ie, v, w, 1) } function ka(ee) { let Ze = t.createStringLiteral(ee.head.text); for (let At of ee.templateSpans) { let xt = [L.checkDefined($e(At.expression, ie, ot))]; At.literal.text.length > 0 && xt.push(t.createStringLiteral(At.literal.text)), Ze = t.createCallExpression(t.createPropertyAccessExpression(Ze, "concat"), void 0, xt) } return it(Ze, ee) } function Hs(ee) { return x & 8 && !ee ? t.createPropertyAccessExpression(t.createUniqueName("_super", 48), "prototype") : t.createUniqueName("_super", 48) } function Uc(ee) { return ee.keywordToken === 103 && ee.name.escapedText === "target" ? (x |= 32768, t.createUniqueName("_newTarget", 48)) : ee } function Gu(ee, Ze, At) { if (P & 1 && Ia(Ze)) { let xt = B(32670, Ya(Ze) & 16 ? 81 : 65); m(ee, Ze, At), q(xt, 0, 0); return } m(ee, Ze, At) } function $o() { P & 2 || (P |= 2, e.enableSubstitution(79)) } function jo() { P & 1 || (P |= 1, e.enableSubstitution(108), e.enableEmitNotification(173), e.enableEmitNotification(171), e.enableEmitNotification(174), e.enableEmitNotification(175), e.enableEmitNotification(216), e.enableEmitNotification(215), e.enableEmitNotification(259)) } function Ws(ee, Ze) { return Ze = g(ee, Ze), ee === 1 ? nf(Ze) : Re(Ze) ? hd(Ze) : Ze } function hd(ee) { if (P & 2 && !eJ(ee)) { let Ze = ea(ee, Re); if (Ze && vc(Ze)) return it(t.getGeneratedNameForNode(Ze), ee) } return ee } function vc(ee) { switch (ee.parent.kind) { case 205: case 260: case 263: case 257: return ee.parent.name === ee && d.isDeclarationWithCollidingName(ee.parent) }return !1 } function nf(ee) { switch (ee.kind) { case 79: return ye(ee); case 108: return bn(ee) }return ee } function ye(ee) { if (P & 2 && !eJ(ee)) { let Ze = d.getReferencedDeclarationWithCollidingName(ee); if (Ze && !(Yr(Ze) && Et(Ze, ee))) return it(t.getGeneratedNameForNode(sa(Ze)), ee) } return ee } function Et(ee, Ze) { let At = ea(Ze); if (!At || At === ee || At.end <= ee.pos || At.pos >= ee.end) return !1; let xt = tm(ee); for (; At;) { if (At === xt || At === ee) return !1; if (_l(At) && At.parent === ee) return !0; At = At.parent } return !1 } function bn(ee) { return P & 1 && x & 16 ? it(t.createUniqueName("_this", 48), ee) : ee } function Ri(ee, Ze) { return Ca(Ze) ? t.getInternalName(ee) : t.createPropertyAccessExpression(t.getInternalName(ee), "prototype") } function io(ee, Ze) { if (!ee || !Ze || vt(ee.parameters)) return !1; let At = Sl(ee.body.statements); if (!At || !ws(At) || At.kind !== 241) return !1; let xt = At.expression; if (!ws(xt) || xt.kind !== 210) return !1; let qt = xt.expression; if (!ws(qt) || qt.kind !== 106) return !1; let Ln = Wp(xt.arguments); if (!Ln || !ws(Ln) || Ln.kind !== 227) return !1; let mr = Ln.expression; return Re(mr) && mr.escapedText === "arguments" } } var yMe = gt({ "src/compiler/transformers/es2015.ts"() { "use strict"; fa() } }); function hpe(e) { let { factory: t } = e, r = e.getCompilerOptions(), i, o; (r.jsx === 1 || r.jsx === 3) && (i = e.onEmitNode, e.onEmitNode = f, e.enableEmitNotification(283), e.enableEmitNotification(284), e.enableEmitNotification(282), o = []); let s = e.onSubstituteNode; return e.onSubstituteNode = d, e.enableSubstitution(208), e.enableSubstitution(299), y_(e, l); function l(S) { return S } function f(S, x, A) { switch (x.kind) { case 283: case 284: case 282: let w = x.tagName; o[sc(w)] = !0; break }i(S, x, A) } function d(S, x) { return x.id && o && o[x.id] ? s(S, x) : (x = s(S, x), br(x) ? g(x) : yl(x) ? m(x) : x) } function g(S) { if (pi(S.name)) return S; let x = v(S.name); return x ? it(t.createElementAccessExpression(S.expression, x), S) : S } function m(S) { let x = Re(S.name) && v(S.name); return x ? t.updatePropertyAssignment(S, x, S.initializer) : S } function v(S) { let x = nb(S); if (x !== void 0 && x >= 81 && x <= 116) return it(t.createStringLiteralFromNode(S), S) } } var vMe = gt({ "src/compiler/transformers/es5.ts"() { "use strict"; fa() } }); function bMe(e) { switch (e) { case 2: return "return"; case 3: return "break"; case 4: return "yield"; case 5: return "yield*"; case 7: return "endfinally"; default: return } } function gpe(e) { let { factory: t, getEmitHelperFactory: r, resumeLexicalEnvironment: i, endLexicalEnvironment: o, hoistFunctionDeclaration: s, hoistVariableDeclaration: l } = e, f = e.getCompilerOptions(), d = Do(f), g = e.getEmitResolver(), m = e.onSubstituteNode; e.onSubstituteNode = oe; let v, S, x, A, w, C, P, F, B, q, W = 1, Y, R, ie, $, fe = 0, Z = 0, U, re, le, _e, ge, X, Ve, we; return y_(e, ke); function ke(ye) { if (ye.isDeclarationFile || !(ye.transformFlags & 2048)) return ye; let Et = xn(ye, Pe, e); return Bg(Et, e.readEmitHelpers()), Et } function Pe(ye) { let Et = ye.transformFlags; return A ? Ce(ye) : x ? Ie(ye) : Ds(ye) && ye.asteriskToken ? Ne(ye) : Et & 2048 ? xn(ye, Pe, e) : ye } function Ce(ye) { switch (ye.kind) { case 243: return dr(ye); case 244: return Se(ye); case 252: return Kt(ye); case 253: return ir(ye); default: return Ie(ye) } } function Ie(ye) { switch (ye.kind) { case 259: return Le(ye); case 215: return Ye(ye); case 174: case 175: return _t(ye); case 240: return Rt(ye); case 245: return Tt(ye); case 246: return nt(ye); case 249: return G(ye); case 248: return Q(ye); case 250: return je(ye); default: return ye.transformFlags & 1048576 ? Be(ye) : ye.transformFlags & 4196352 ? xn(ye, Pe, e) : ye } } function Be(ye) { switch (ye.kind) { case 223: return We(ye); case 357: return tn(ye); case 224: return _n(ye); case 226: return Gt(ye); case 206: return $n(ye); case 207: return Ni(ye); case 209: return Pi(ye); case 210: return gr(ye); case 211: return pt(ye); default: return xn(ye, Pe, e) } } function Ne(ye) { switch (ye.kind) { case 259: return Le(ye); case 215: return Ye(ye); default: return L.failBadSyntaxKind(ye) } } function Le(ye) { if (ye.asteriskToken) ye = Ir(it(t.createFunctionDeclaration(ye.modifiers, void 0, ye.name, void 0, Sc(ye.parameters, Pe, e), void 0, ct(ye.body)), ye), ye); else { let Et = x, bn = A; x = !1, A = !1, ye = xn(ye, Pe, e), x = Et, A = bn } if (x) { s(ye); return } else return ye } function Ye(ye) { if (ye.asteriskToken) ye = Ir(it(t.createFunctionExpression(void 0, void 0, ye.name, void 0, Sc(ye.parameters, Pe, e), void 0, ct(ye.body)), ye), ye); else { let Et = x, bn = A; x = !1, A = !1, ye = xn(ye, Pe, e), x = Et, A = bn } return ye } function _t(ye) { let Et = x, bn = A; return x = !1, A = !1, ye = xn(ye, Pe, e), x = Et, A = bn, ye } function ct(ye) { let Et = [], bn = x, Ri = A, io = w, ee = C, Ze = P, At = F, xt = B, qt = q, Ln = W, mr = Y, Vr = R, gi = ie, Ea = $; x = !0, A = !1, w = void 0, C = void 0, P = void 0, F = void 0, B = void 0, q = void 0, W = 1, Y = void 0, R = void 0, ie = void 0, $ = t.createTempVariable(void 0), i(); let bo = t.copyPrologue(ye.statements, Et, !1, Pe); nn(ye.statements, bo); let Qo = K(); return em(Et, o()), Et.push(t.createReturnStatement(Qo)), x = bn, A = Ri, w = io, C = ee, P = Ze, F = At, B = xt, q = qt, W = Ln, Y = mr, R = Vr, ie = gi, $ = Ea, it(t.createBlock(Et, ye.multiLine), ye) } function Rt(ye) { if (ye.transformFlags & 1048576) { ri(ye.declarationList); return } else { if (Ya(ye) & 2097152) return ye; for (let bn of ye.declarationList.declarations) l(bn.name); let Et = qI(ye.declarationList); return Et.length === 0 ? void 0 : Ho(t.createExpressionStatement(t.inlineExpressions(on(Et, vn))), ye) } } function We(ye) { let Et = WH(ye); switch (Et) { case 0: return zt(ye); case 1: return qe(ye); default: return L.assertNever(Et) } } function qe(ye) { let { left: Et, right: bn } = ye; if (Ot(bn)) { let Ri; switch (Et.kind) { case 208: Ri = t.updatePropertyAccessExpression(Et, Te(L.checkDefined($e(Et.expression, Pe, Ju))), Et.name); break; case 209: Ri = t.updateElementAccessExpression(Et, Te(L.checkDefined($e(Et.expression, Pe, Ju))), Te(L.checkDefined($e(Et.argumentExpression, Pe, ot)))); break; default: Ri = L.checkDefined($e(Et, Pe, ot)); break }let io = ye.operatorToken.kind; return oN(io) ? it(t.createAssignment(Ri, it(t.createBinaryExpression(Te(Ri), WL(io), L.checkDefined($e(bn, Pe, ot))), ye)), ye) : t.updateBinaryExpression(ye, Ri, ye.operatorToken, L.checkDefined($e(bn, Pe, ot))) } return xn(ye, Pe, e) } function zt(ye) { return Ot(ye.right) ? Yce(ye.operatorToken.kind) ? kn(ye) : ye.operatorToken.kind === 27 ? Qt(ye) : t.updateBinaryExpression(ye, Te(L.checkDefined($e(ye.left, Pe, ot))), ye.operatorToken, L.checkDefined($e(ye.right, Pe, ot))) : xn(ye, Pe, e) } function Qt(ye) { let Et = []; return bn(ye.left), bn(ye.right), t.inlineExpressions(Et); function bn(Ri) { ar(Ri) && Ri.operatorToken.kind === 27 ? (bn(Ri.left), bn(Ri.right)) : (Ot(Ri) && Et.length > 0 && (wt(1, [t.createExpressionStatement(t.inlineExpressions(Et))]), Et = []), Et.push(L.checkDefined($e(Ri, Pe, ot)))) } } function tn(ye) { let Et = []; for (let bn of ye.elements) ar(bn) && bn.operatorToken.kind === 27 ? Et.push(Qt(bn)) : (Ot(bn) && Et.length > 0 && (wt(1, [t.createExpressionStatement(t.inlineExpressions(Et))]), Et = []), Et.push(L.checkDefined($e(bn, Pe, ot)))); return t.inlineExpressions(Et) } function kn(ye) { let Et = yt(), bn = j(); return qs(bn, L.checkDefined($e(ye.left, Pe, ot)), ye.left), ye.operatorToken.kind === 55 ? jt(Et, bn, ye.left) : As(Et, bn, ye.left), qs(bn, L.checkDefined($e(ye.right, Pe, ot)), ye.right), lt(Et), bn } function _n(ye) { if (Ot(ye.whenTrue) || Ot(ye.whenFalse)) { let Et = yt(), bn = yt(), Ri = j(); return jt(Et, L.checkDefined($e(ye.condition, Pe, ot)), ye.condition), qs(Ri, L.checkDefined($e(ye.whenTrue, Pe, ot)), ye.whenTrue), Rs(bn), lt(Et), qs(Ri, L.checkDefined($e(ye.whenFalse, Pe, ot)), ye.whenFalse), lt(bn), Ri } return xn(ye, Pe, e) } function Gt(ye) { let Et = yt(), bn = $e(ye.expression, Pe, ot); if (ye.asteriskToken) { let Ri = Ya(ye.expression) & 16777216 ? bn : it(r().createValuesHelper(bn), ye); yc(Ri, ye) } else Ql(bn, ye); return lt(Et), Pc(ye) } function $n(ye) { return ui(ye.elements, void 0, void 0, ye.multiLine) } function ui(ye, Et, bn, Ri) { let io = Ke(ye), ee; if (io > 0) { ee = j(); let xt = On(ye, Pe, ot, 0, io); qs(ee, t.createArrayLiteralExpression(Et ? [Et, ...xt] : xt)), Et = void 0 } let Ze = ou(ye, At, [], io); return ee ? t.createArrayConcatCall(ee, [t.createArrayLiteralExpression(Ze, Ri)]) : it(t.createArrayLiteralExpression(Et ? [Et, ...Ze] : Ze, Ri), bn); function At(xt, qt) { if (Ot(qt) && xt.length > 0) { let Ln = ee !== void 0; ee || (ee = j()), qs(ee, Ln ? t.createArrayConcatCall(ee, [t.createArrayLiteralExpression(xt, Ri)]) : t.createArrayLiteralExpression(Et ? [Et, ...xt] : xt, Ri)), Et = void 0, xt = [] } return xt.push(L.checkDefined($e(qt, Pe, ot))), xt } } function Ni(ye) { let Et = ye.properties, bn = ye.multiLine, Ri = Ke(Et), io = j(); qs(io, t.createObjectLiteralExpression(On(Et, Pe, Og, 0, Ri), bn)); let ee = ou(Et, Ze, [], Ri); return ee.push(bn ? mu(go(it(t.cloneNode(io), io), io.parent)) : io), t.inlineExpressions(ee); function Ze(At, xt) { Ot(xt) && At.length > 0 && (ss(t.createExpressionStatement(t.inlineExpressions(At))), At = []); let qt = ede(t, ye, xt, io), Ln = $e(qt, Pe, ot); return Ln && (bn && mu(Ln), At.push(Ln)), At } } function Pi(ye) { return Ot(ye.argumentExpression) ? t.updateElementAccessExpression(ye, Te(L.checkDefined($e(ye.expression, Pe, Ju))), L.checkDefined($e(ye.argumentExpression, Pe, ot))) : xn(ye, Pe, e) } function gr(ye) { if (!Dd(ye) && mn(ye.arguments, Ot)) { let { target: Et, thisArg: bn } = t.createCallBinding(ye.expression, l, d, !0); return Ir(it(t.createFunctionApplyCall(Te(L.checkDefined($e(Et, Pe, Ju))), bn, ui(ye.arguments)), ye), ye) } return xn(ye, Pe, e) } function pt(ye) { if (mn(ye.arguments, Ot)) { let { target: Et, thisArg: bn } = t.createCallBinding(t.createPropertyAccessExpression(ye.expression, "bind"), l); return Ir(it(t.createNewExpression(t.createFunctionApplyCall(Te(L.checkDefined($e(Et, Pe, ot))), bn, ui(ye.arguments, t.createVoidZero())), void 0, []), ye), ye) } return xn(ye, Pe, e) } function nn(ye, Et = 0) { let bn = ye.length; for (let Ri = Et; Ri < bn; Ri++)pn(ye[Ri]) } function Dt(ye) { Va(ye) ? nn(ye.statements) : pn(ye) } function pn(ye) { let Et = A; A || (A = Ot(ye)), An(ye), A = Et } function An(ye) { switch (ye.kind) { case 238: return Kn(ye); case 241: return hi(ye); case 242: return Ht(ye); case 243: return En(ye); case 244: return Cr(ye); case 245: return at(ye); case 246: return ve(ye); case 248: return ce(ye); case 249: return ue(ye); case 250: return Oe(ye); case 251: return Ge(ye); case 252: return kt(ye); case 253: return ln(ye); case 254: return ae(ye); case 255: return rt(ye); default: return ss($e(ye, Pe, ca)) } } function Kn(ye) { Ot(ye) ? nn(ye.statements) : ss($e(ye, Pe, ca)) } function hi(ye) { ss($e(ye, Pe, ca)) } function ri(ye) { for (let ee of ye.declarations) { let Ze = t.cloneNode(ee.name); hl(Ze, ee.name), l(Ze) } let Et = qI(ye), bn = Et.length, Ri = 0, io = []; for (; Ri < bn;) { for (let ee = Ri; ee < bn; ee++) { let Ze = Et[ee]; if (Ot(Ze.initializer) && io.length > 0) break; io.push(vn(Ze)) } io.length && (ss(t.createExpressionStatement(t.inlineExpressions(io))), Ri += io.length, io = []) } } function vn(ye) { return Ho(t.createAssignment(Ho(t.cloneNode(ye.name), ye.name), L.checkDefined($e(ye.initializer, Pe, ot))), ye) } function Ht(ye) { if (Ot(ye)) if (Ot(ye.thenStatement) || Ot(ye.elseStatement)) { let Et = yt(), bn = ye.elseStatement ? yt() : void 0; jt(ye.elseStatement ? bn : Et, L.checkDefined($e(ye.expression, Pe, ot)), ye.expression), Dt(ye.thenStatement), ye.elseStatement && (Rs(Et), lt(bn), Dt(ye.elseStatement)), lt(Et) } else ss($e(ye, Pe, ca)); else ss($e(ye, Pe, ca)) } function En(ye) { if (Ot(ye)) { let Et = yt(), bn = yt(); xi(Et), lt(bn), Dt(ye.statement), lt(Et), As(bn, L.checkDefined($e(ye.expression, Pe, ot))), Nr() } else ss($e(ye, Pe, ca)) } function dr(ye) { return A ? (Hi(), ye = xn(ye, Pe, e), Nr(), ye) : xn(ye, Pe, e) } function Cr(ye) { if (Ot(ye)) { let Et = yt(), bn = xi(Et); lt(Et), jt(bn, L.checkDefined($e(ye.expression, Pe, ot))), Dt(ye.statement), Rs(Et), Nr() } else ss($e(ye, Pe, ca)) } function Se(ye) { return A ? (Hi(), ye = xn(ye, Pe, e), Nr(), ye) : xn(ye, Pe, e) } function at(ye) { if (Ot(ye)) { let Et = yt(), bn = yt(), Ri = xi(bn); if (ye.initializer) { let io = ye.initializer; pu(io) ? ri(io) : ss(it(t.createExpressionStatement(L.checkDefined($e(io, Pe, ot))), io)) } lt(Et), ye.condition && jt(Ri, L.checkDefined($e(ye.condition, Pe, ot))), Dt(ye.statement), lt(bn), ye.incrementor && ss(it(t.createExpressionStatement(L.checkDefined($e(ye.incrementor, Pe, ot))), ye.incrementor)), Rs(Et), Nr() } else ss($e(ye, Pe, ca)) } function Tt(ye) { A && Hi(); let Et = ye.initializer; if (Et && pu(Et)) { for (let Ri of Et.declarations) l(Ri.name); let bn = qI(Et); ye = t.updateForStatement(ye, bn.length > 0 ? t.inlineExpressions(on(bn, vn)) : void 0, $e(ye.condition, Pe, ot), $e(ye.incrementor, Pe, ot), jf(ye.statement, Pe, e)) } else ye = xn(ye, Pe, e); return A && Nr(), ye } function ve(ye) { if (Ot(ye)) { let Et = j(), bn = j(), Ri = j(), io = t.createLoopVariable(), ee = ye.initializer; l(io), qs(Et, L.checkDefined($e(ye.expression, Pe, ot))), qs(bn, t.createArrayLiteralExpression()), ss(t.createForInStatement(Ri, Et, t.createExpressionStatement(t.createCallExpression(t.createPropertyAccessExpression(bn, "push"), void 0, [Ri])))), qs(io, t.createNumericLiteral(0)); let Ze = yt(), At = yt(), xt = xi(At); lt(Ze), jt(xt, t.createLessThan(io, t.createPropertyAccessExpression(bn, "length"))), qs(Ri, t.createElementAccessExpression(bn, io)), jt(At, t.createBinaryExpression(Ri, 101, Et)); let qt; if (pu(ee)) { for (let Ln of ee.declarations) l(Ln.name); qt = t.cloneNode(ee.declarations[0].name) } else qt = L.checkDefined($e(ee, Pe, ot)), L.assert(Ju(qt)); qs(qt, Ri), Dt(ye.statement), lt(At), ss(t.createExpressionStatement(t.createPostfixIncrement(io))), Rs(Ze), Nr() } else ss($e(ye, Pe, ca)) } function nt(ye) { A && Hi(); let Et = ye.initializer; if (pu(Et)) { for (let bn of Et.declarations) l(bn.name); ye = t.updateForInStatement(ye, Et.declarations[0].name, L.checkDefined($e(ye.expression, Pe, ot)), L.checkDefined($e(ye.statement, Pe, ca, t.liftToBlock))) } else ye = xn(ye, Pe, e); return A && Nr(), ye } function ce(ye) { let Et = aa(ye.label ? vr(ye.label) : void 0); Et > 0 ? Rs(Et, ye) : ss(ye) } function Q(ye) { if (A) { let Et = aa(ye.label && vr(ye.label)); if (Et > 0) return Ll(Et, ye) } return xn(ye, Pe, e) } function ue(ye) { let Et = ro(ye.label ? vr(ye.label) : void 0); Et > 0 ? Rs(Et, ye) : ss(ye) } function G(ye) { if (A) { let Et = ro(ye.label && vr(ye.label)); if (Et > 0) return Ll(Et, ye) } return xn(ye, Pe, e) } function Oe(ye) { yu($e(ye.expression, Pe, ot), ye) } function je(ye) { return md($e(ye.expression, Pe, ot), ye) } function Ge(ye) { Ot(ye) ? (ei(Te(L.checkDefined($e(ye.expression, Pe, ot)))), Dt(ye.statement), Kr()) : ss($e(ye, Pe, ca)) } function kt(ye) { if (Ot(ye.caseBlock)) { let Et = ye.caseBlock, bn = Et.clauses.length, Ri = Qr(), io = Te(L.checkDefined($e(ye.expression, Pe, ot))), ee = [], Ze = -1; for (let qt = 0; qt < bn; qt++) { let Ln = Et.clauses[qt]; ee.push(yt()), Ln.kind === 293 && Ze === -1 && (Ze = qt) } let At = 0, xt = []; for (; At < bn;) { let qt = 0; for (let Ln = At; Ln < bn; Ln++) { let mr = Et.clauses[Ln]; if (mr.kind === 292) { if (Ot(mr.expression) && xt.length > 0) break; xt.push(t.createCaseClause(L.checkDefined($e(mr.expression, Pe, ot)), [Ll(ee[Ln], mr.expression)])) } else qt++ } xt.length && (ss(t.createSwitchStatement(io, t.createCaseBlock(xt))), At += xt.length, xt = []), qt > 0 && (At += qt, qt = 0) } Ze >= 0 ? Rs(ee[Ze]) : Rs(Ri); for (let qt = 0; qt < bn; qt++)lt(ee[qt]), nn(Et.clauses[qt].statements); Wi() } else ss($e(ye, Pe, ca)) } function Kt(ye) { return A && Fo(), ye = xn(ye, Pe, e), A && Wi(), ye } function ln(ye) { Ot(ye) ? (Ki(vr(ye.label)), Dt(ye.statement), kc()) : ss($e(ye, Pe, ca)) } function ir(ye) { return A && gn(vr(ye.label)), ye = xn(ye, Pe, e), A && kc(), ye } function ae(ye) { var Et; se(L.checkDefined($e((Et = ye.expression) != null ? Et : t.createVoidZero(), Pe, ot)), ye) } function rt(ye) { Ot(ye) ? (Si(), Dt(ye.tryBlock), ye.catchClause && (Ja(ye.catchClause.variableDeclaration), Dt(ye.catchClause.block)), ye.finallyBlock && (Za(), Dt(ye.finallyBlock)), Fa()) : ss(xn(ye, Pe, e)) } function Ot(ye) { return !!ye && (ye.transformFlags & 1048576) !== 0 } function Ke(ye) { let Et = ye.length; for (let bn = 0; bn < Et; bn++)if (Ot(ye[bn])) return bn; return -1 } function oe(ye, Et) { return Et = m(ye, Et), ye === 1 ? pe(Et) : Et } function pe(ye) { return Re(ye) ? z(ye) : ye } function z(ye) { if (!tc(ye) && v && v.has(vr(ye))) { let Et = ec(ye); if (Re(Et) && Et.parent) { let bn = g.getReferencedValueDeclaration(Et); if (bn) { let Ri = S[sc(bn)]; if (Ri) { let io = go(it(t.cloneNode(Ri), Ri), Ri.parent); return Ho(io, ye), hl(io, ye), io } } } } return ye } function Te(ye) { if (tc(ye) || Ya(ye) & 8192) return ye; let Et = t.createTempVariable(l); return qs(Et, ye, ye), Et } function j(ye) { let Et = ye ? t.createUniqueName(ye) : t.createTempVariable(void 0); return l(Et), Et } function yt() { B || (B = []); let ye = W; return W++, B[ye] = -1, ye } function lt(ye) { L.assert(B !== void 0, "No labels were defined."), B[ye] = Y ? Y.length : 0 } function Qe(ye) { w || (w = [], P = [], C = [], F = []); let Et = P.length; return P[Et] = 0, C[Et] = Y ? Y.length : 0, w[Et] = ye, F.push(ye), Et } function Vt() { let ye = Hn(); if (ye === void 0) return L.fail("beginBlock was never called."); let Et = P.length; return P[Et] = 1, C[Et] = Y ? Y.length : 0, w[Et] = ye, F.pop(), ye } function Hn() { return Os(F) } function jr() { let ye = Hn(); return ye && ye.kind } function ei(ye) { let Et = yt(), bn = yt(); lt(Et), Qe({ kind: 1, expression: ye, startLabel: Et, endLabel: bn }) } function Kr() { L.assert(jr() === 1); let ye = Vt(); lt(ye.endLabel) } function Si() { let ye = yt(), Et = yt(); return lt(ye), Qe({ kind: 0, state: 0, startLabel: ye, endLabel: Et }), bl(), Et } function Ja(ye) { L.assert(jr() === 0); let Et; if (tc(ye.name)) Et = ye.name, l(ye.name); else { let ee = vr(ye.name); Et = j(ee), v || (v = new Map, S = [], e.enableSubstitution(79)), v.set(ee, !0), S[sc(ye)] = Et } let bn = Hn(); L.assert(bn.state < 1); let Ri = bn.endLabel; Rs(Ri); let io = yt(); lt(io), bn.state = 1, bn.catchVariable = Et, bn.catchLabel = io, qs(Et, t.createCallExpression(t.createPropertyAccessExpression($, "sent"), void 0, [])), bl() } function Za() { L.assert(jr() === 0); let ye = Hn(); L.assert(ye.state < 2); let Et = ye.endLabel; Rs(Et); let bn = yt(); lt(bn), ye.state = 2, ye.finallyLabel = bn } function Fa() { L.assert(jr() === 0); let ye = Vt(); ye.state < 2 ? Rs(ye.endLabel) : ht(), lt(ye.endLabel), bl(), ye.state = 3 } function Hi() { Qe({ kind: 3, isScript: !0, breakLabel: -1, continueLabel: -1 }) } function xi(ye) { let Et = yt(); return Qe({ kind: 3, isScript: !1, breakLabel: Et, continueLabel: ye }), Et } function Nr() { L.assert(jr() === 3); let ye = Vt(), Et = ye.breakLabel; ye.isScript || lt(Et) } function Fo() { Qe({ kind: 2, isScript: !0, breakLabel: -1 }) } function Qr() { let ye = yt(); return Qe({ kind: 2, isScript: !1, breakLabel: ye }), ye } function Wi() { L.assert(jr() === 2); let ye = Vt(), Et = ye.breakLabel; ye.isScript || lt(Et) } function gn(ye) { Qe({ kind: 4, isScript: !0, labelText: ye, breakLabel: -1 }) } function Ki(ye) { let Et = yt(); Qe({ kind: 4, isScript: !1, labelText: ye, breakLabel: Et }) } function kc() { L.assert(jr() === 4); let ye = Vt(); ye.isScript || lt(ye.breakLabel) } function Ps(ye) { return ye.kind === 2 || ye.kind === 3 } function mc(ye) { return ye.kind === 4 } function xc(ye) { return ye.kind === 3 } function hc(ye, Et) { for (let bn = Et; bn >= 0; bn--) { let Ri = F[bn]; if (mc(Ri)) { if (Ri.labelText === ye) return !0 } else break } return !1 } function ro(ye) { if (F) if (ye) for (let Et = F.length - 1; Et >= 0; Et--) { let bn = F[Et]; if (mc(bn) && bn.labelText === ye) return bn.breakLabel; if (Ps(bn) && hc(ye, Et - 1)) return bn.breakLabel } else for (let Et = F.length - 1; Et >= 0; Et--) { let bn = F[Et]; if (Ps(bn)) return bn.breakLabel } return 0 } function aa(ye) { if (F) if (ye) for (let Et = F.length - 1; Et >= 0; Et--) { let bn = F[Et]; if (xc(bn) && hc(ye, Et - 1)) return bn.continueLabel } else for (let Et = F.length - 1; Et >= 0; Et--) { let bn = F[Et]; if (xc(bn)) return bn.continueLabel } return 0 } function Co(ye) { if (ye !== void 0 && ye > 0) { q === void 0 && (q = []); let Et = t.createNumericLiteral(-1); return q[ye] === void 0 ? q[ye] = [Et] : q[ye].push(Et), Et } return t.createOmittedExpression() } function gc(ye) { let Et = t.createNumericLiteral(ye); return R4(Et, 3, bMe(ye)), Et } function Ll(ye, Et) { return L.assertLessThan(0, ye, "Invalid label"), it(t.createReturnStatement(t.createArrayLiteralExpression([gc(3), Co(ye)])), Et) } function md(ye, Et) { return it(t.createReturnStatement(t.createArrayLiteralExpression(ye ? [gc(2), ye] : [gc(2)])), Et) } function Pc(ye) { return it(t.createCallExpression(t.createPropertyAccessExpression($, "sent"), void 0, []), ye) } function bl() { wt(0) } function ss(ye) { ye ? wt(1, [ye]) : bl() } function qs(ye, Et, bn) { wt(2, [ye, Et], bn) } function Rs(ye, Et) { wt(3, [ye], Et) } function As(ye, Et, bn) { wt(4, [ye, Et], bn) } function jt(ye, Et, bn) { wt(5, [ye, Et], bn) } function yc(ye, Et) { wt(7, [ye], Et) } function Ql(ye, Et) { wt(6, [ye], Et) } function yu(ye, Et) { wt(8, [ye], Et) } function se(ye, Et) { wt(9, [ye], Et) } function ht() { wt(10) } function wt(ye, Et, bn) { Y === void 0 && (Y = [], R = [], ie = []), B === void 0 && lt(yt()); let Ri = Y.length; Y[Ri] = ye, R[Ri] = Et, ie[Ri] = bn } function K() { fe = 0, Z = 0, U = void 0, re = !1, le = !1, _e = void 0, ge = void 0, X = void 0, Ve = void 0, we = void 0; let ye = Xe(); return r().createGeneratorHelper(Jn(t.createFunctionExpression(void 0, void 0, void 0, void 0, [t.createParameterDeclaration(void 0, void 0, $)], void 0, t.createBlock(ye, ye.length > 0)), 1048576)) } function Xe() { if (Y) { for (let ye = 0; ye < Y.length; ye++)vo(ye); Yt(Y.length) } else Yt(0); if (_e) { let ye = t.createPropertyAccessExpression($, "label"), Et = t.createSwitchStatement(ye, t.createCaseBlock(_e)); return [mu(Et)] } return ge || [] } function ft() { ge && (yr(!re), re = !1, le = !1, Z++) } function Yt(ye) { pr(ye) && (ta(ye), we = void 0, Gu(void 0, void 0)), ge && _e && yr(!1), Go() } function pr(ye) { if (!le) return !0; if (!B || !q) return !1; for (let Et = 0; Et < B.length; Et++)if (B[Et] === ye && q[Et]) return !0; return !1 } function yr(ye) { if (_e || (_e = []), ge) { if (we) for (let Et = we.length - 1; Et >= 0; Et--) { let bn = we[Et]; ge = [t.createWithStatement(bn.expression, t.createBlock(ge))] } if (Ve) { let { startLabel: Et, catchLabel: bn, finallyLabel: Ri, endLabel: io } = Ve; ge.unshift(t.createExpressionStatement(t.createCallExpression(t.createPropertyAccessExpression(t.createPropertyAccessExpression($, "trys"), "push"), void 0, [t.createArrayLiteralExpression([Co(Et), Co(bn), Co(Ri), Co(io)])]))), Ve = void 0 } ye && ge.push(t.createExpressionStatement(t.createAssignment(t.createPropertyAccessExpression($, "label"), t.createNumericLiteral(Z + 1)))) } _e.push(t.createCaseClause(t.createNumericLiteral(Z), ge || [])), ge = void 0 } function ta(ye) { if (B) for (let Et = 0; Et < B.length; Et++)B[Et] === ye && (ft(), U === void 0 && (U = []), U[Z] === void 0 ? U[Z] = [Et] : U[Z].push(Et)) } function Go() { if (q !== void 0 && U !== void 0) for (let ye = 0; ye < U.length; ye++) { let Et = U[ye]; if (Et !== void 0) for (let bn of Et) { let Ri = q[bn]; if (Ri !== void 0) for (let io of Ri) io.text = String(ye) } } } function Ka(ye) { if (w) for (; fe < P.length && C[fe] <= ye; fe++) { let Et = w[fe], bn = P[fe]; switch (Et.kind) { case 0: bn === 0 ? (X || (X = []), ge || (ge = []), X.push(Ve), Ve = Et) : bn === 1 && (Ve = X.pop()); break; case 1: bn === 0 ? (we || (we = []), we.push(Et)) : bn === 1 && we.pop(); break } } } function vo(ye) { if (ta(ye), Ka(ye), re) return; re = !1, le = !1; let Et = Y[ye]; if (Et === 0) return; if (Et === 10) return nf(); let bn = R[ye]; if (Et === 1) return ka(bn[0]); let Ri = ie[ye]; switch (Et) { case 2: return Hs(bn[0], bn[1], Ri); case 3: return $o(bn[0], Ri); case 4: return jo(bn[0], bn[1], Ri); case 5: return Ws(bn[0], bn[1], Ri); case 6: return hd(bn[0], Ri); case 7: return vc(bn[0], Ri); case 8: return Gu(bn[0], Ri); case 9: return Uc(bn[0], Ri) } } function ka(ye) { ye && (ge ? ge.push(ye) : ge = [ye]) } function Hs(ye, Et, bn) { ka(it(t.createExpressionStatement(t.createAssignment(ye, Et)), bn)) } function Uc(ye, Et) { re = !0, le = !0, ka(it(t.createThrowStatement(ye), Et)) } function Gu(ye, Et) { re = !0, le = !0, ka(Jn(it(t.createReturnStatement(t.createArrayLiteralExpression(ye ? [gc(2), ye] : [gc(2)])), Et), 768)) } function $o(ye, Et) { re = !0, ka(Jn(it(t.createReturnStatement(t.createArrayLiteralExpression([gc(3), Co(ye)])), Et), 768)) } function jo(ye, Et, bn) { ka(Jn(t.createIfStatement(Et, Jn(it(t.createReturnStatement(t.createArrayLiteralExpression([gc(3), Co(ye)])), bn), 768)), 1)) } function Ws(ye, Et, bn) { ka(Jn(t.createIfStatement(t.createLogicalNot(Et), Jn(it(t.createReturnStatement(t.createArrayLiteralExpression([gc(3), Co(ye)])), bn), 768)), 1)) } function hd(ye, Et) { re = !0, ka(Jn(it(t.createReturnStatement(t.createArrayLiteralExpression(ye ? [gc(4), ye] : [gc(4)])), Et), 768)) } function vc(ye, Et) { re = !0, ka(Jn(it(t.createReturnStatement(t.createArrayLiteralExpression([gc(5), ye])), Et), 768)) } function nf() { re = !0, ka(t.createReturnStatement(t.createArrayLiteralExpression([gc(7)]))) } } var EMe = gt({ "src/compiler/transformers/generators.ts"() { "use strict"; fa() } }); function FK(e) { function t(Q) { switch (Q) { case 2: return R; case 3: return ie; default: return Y } } let { factory: r, getEmitHelperFactory: i, startLexicalEnvironment: o, endLexicalEnvironment: s, hoistVariableDeclaration: l } = e, f = e.getCompilerOptions(), d = e.getEmitResolver(), g = e.getEmitHost(), m = Do(f), v = Rl(f), S = e.onSubstituteNode, x = e.onEmitNode; e.onSubstituteNode = dr, e.onEmitNode = En, e.enableSubstitution(210), e.enableSubstitution(212), e.enableSubstitution(79), e.enableSubstitution(223), e.enableSubstitution(300), e.enableEmitNotification(308); let A = [], w = [], C, P, F = [], B; return y_(e, q); function q(Q) { if (Q.isDeclarationFile || !(aS(Q, f) || Q.transformFlags & 8388608 || Mf(Q) && l4(f) && Ss(f))) return Q; C = Q, P = xK(e, Q, d, f), A[sc(Q)] = P; let G = t(v)(Q); return C = void 0, P = void 0, B = !1, G } function W() { return !!(!P.exportEquals && Lc(C)) } function Y(Q) { o(); let ue = [], G = Uf(f, "alwaysStrict") || !f.noImplicitUseStrict && Lc(C), Oe = r.copyPrologue(Q.statements, ue, G && !Mf(Q), re); if (W() && Sn(ue, hi()), Fn(P.exportedNames)) for (let kt = 0; kt < P.exportedNames.length; kt += 50)Sn(ue, r.createExpressionStatement(ou(P.exportedNames.slice(kt, kt + 50), (Kt, ln) => r.createAssignment(r.createPropertyAccessExpression(r.createIdentifier("exports"), r.createIdentifier(vr(ln))), Kt), r.createVoidZero()))); Sn(ue, $e(P.externalHelpersImportDeclaration, re, ca)), si(ue, On(Q.statements, re, ca, Oe)), U(ue, !1), em(ue, s()); let je = r.updateSourceFile(Q, it(r.createNodeArray(ue), Q.statements)); return Bg(je, e.readEmitHelpers()), je } function R(Q) { let ue = r.createIdentifier("define"), G = xO(r, Q, g, f), Oe = Mf(Q) && Q, { aliasedModuleNames: je, unaliasedModuleNames: Ge, importAliasNames: kt } = $(Q, !0), Kt = r.updateSourceFile(Q, it(r.createNodeArray([r.createExpressionStatement(r.createCallExpression(ue, void 0, [...G ? [G] : [], r.createArrayLiteralExpression(Oe ? Je : [r.createStringLiteral("require"), r.createStringLiteral("exports"), ...je, ...Ge]), Oe ? Oe.statements.length ? Oe.statements[0].expression : r.createObjectLiteralExpression() : r.createFunctionExpression(void 0, void 0, void 0, void 0, [r.createParameterDeclaration(void 0, void 0, "require"), r.createParameterDeclaration(void 0, void 0, "exports"), ...kt], void 0, Z(Q))]))]), Q.statements)); return Bg(Kt, e.readEmitHelpers()), Kt } function ie(Q) { let { aliasedModuleNames: ue, unaliasedModuleNames: G, importAliasNames: Oe } = $(Q, !1), je = xO(r, Q, g, f), Ge = r.createFunctionExpression(void 0, void 0, void 0, void 0, [r.createParameterDeclaration(void 0, void 0, "factory")], void 0, it(r.createBlock([r.createIfStatement(r.createLogicalAnd(r.createTypeCheck(r.createIdentifier("module"), "object"), r.createTypeCheck(r.createPropertyAccessExpression(r.createIdentifier("module"), "exports"), "object")), r.createBlock([r.createVariableStatement(void 0, [r.createVariableDeclaration("v", void 0, void 0, r.createCallExpression(r.createIdentifier("factory"), void 0, [r.createIdentifier("require"), r.createIdentifier("exports")]))]), Jn(r.createIfStatement(r.createStrictInequality(r.createIdentifier("v"), r.createIdentifier("undefined")), r.createExpressionStatement(r.createAssignment(r.createPropertyAccessExpression(r.createIdentifier("module"), "exports"), r.createIdentifier("v")))), 1)]), r.createIfStatement(r.createLogicalAnd(r.createTypeCheck(r.createIdentifier("define"), "function"), r.createPropertyAccessExpression(r.createIdentifier("define"), "amd")), r.createBlock([r.createExpressionStatement(r.createCallExpression(r.createIdentifier("define"), void 0, [...je ? [je] : [], r.createArrayLiteralExpression([r.createStringLiteral("require"), r.createStringLiteral("exports"), ...ue, ...G]), r.createIdentifier("factory")]))])))], !0), void 0)), kt = r.updateSourceFile(Q, it(r.createNodeArray([r.createExpressionStatement(r.createCallExpression(Ge, void 0, [r.createFunctionExpression(void 0, void 0, void 0, void 0, [r.createParameterDeclaration(void 0, void 0, "require"), r.createParameterDeclaration(void 0, void 0, "exports"), ...Oe], void 0, Z(Q))]))]), Q.statements)); return Bg(kt, e.readEmitHelpers()), kt } function $(Q, ue) { let G = [], Oe = [], je = []; for (let Ge of Q.amdDependencies) Ge.name ? (G.push(r.createStringLiteral(Ge.path)), je.push(r.createParameterDeclaration(void 0, void 0, Ge.name))) : Oe.push(r.createStringLiteral(Ge.path)); for (let Ge of P.externalImports) { let kt = jS(r, Ge, C, g, d, f), Kt = C2(r, Ge, C); kt && (ue && Kt ? (Jn(Kt, 8), G.push(kt), je.push(r.createParameterDeclaration(void 0, void 0, Kt))) : Oe.push(kt)) } return { aliasedModuleNames: G, unaliasedModuleNames: Oe, importAliasNames: je } } function fe(Q) { if (Nl(Q) || Il(Q) || !jS(r, Q, C, g, d, f)) return; let ue = C2(r, Q, C), G = ct(Q, ue); if (G !== ue) return r.createExpressionStatement(r.createAssignment(ue, G)) } function Z(Q) { o(); let ue = [], G = r.copyPrologue(Q.statements, ue, !f.noImplicitUseStrict, re); W() && Sn(ue, hi()), Fn(P.exportedNames) && Sn(ue, r.createExpressionStatement(ou(P.exportedNames, (je, Ge) => r.createAssignment(r.createPropertyAccessExpression(r.createIdentifier("exports"), r.createIdentifier(vr(Ge))), je), r.createVoidZero()))), Sn(ue, $e(P.externalHelpersImportDeclaration, re, ca)), v === 2 && si(ue, Zi(P.externalImports, fe)), si(ue, On(Q.statements, re, ca, G)), U(ue, !0), em(ue, s()); let Oe = r.createBlock(ue, !0); return B && xS(Oe, ype), Oe } function U(Q, ue) { if (P.exportEquals) { let G = $e(P.exportEquals.expression, _e, ot); if (G) if (ue) { let Oe = r.createReturnStatement(G); it(Oe, P.exportEquals), Jn(Oe, 3840), Q.push(Oe) } else { let Oe = r.createExpressionStatement(r.createAssignment(r.createPropertyAccessExpression(r.createIdentifier("module"), "exports"), G)); it(Oe, P.exportEquals), Jn(Oe, 3072), Q.push(Oe) } } } function re(Q) { switch (Q.kind) { case 269: return Rt(Q); case 268: return qe(Q); case 275: return zt(Q); case 274: return Qt(Q); case 240: return _n(Q); case 259: return tn(Q); case 260: return kn(Q); case 358: return ui(Q); case 359: return Pi(Q); default: return _e(Q) } } function le(Q, ue) { if (!(Q.transformFlags & 276828160)) return Q; switch (Q.kind) { case 245: return we(Q); case 241: return ke(Q); case 214: return Pe(Q, ue); case 356: return Ce(Q, ue); case 210: if (Dd(Q) && C.impliedNodeFormat === void 0) return Be(Q); break; case 223: if (Fg(Q)) return Ve(Q, ue); break; case 221: case 222: return Ie(Q, ue) }return xn(Q, _e, e) } function _e(Q) { return le(Q, !1) } function ge(Q) { return le(Q, !0) } function X(Q) { if (rs(Q)) for (let ue of Q.properties) switch (ue.kind) { case 299: if (X(ue.initializer)) return !0; break; case 300: if (X(ue.name)) return !0; break; case 301: if (X(ue.expression)) return !0; break; case 171: case 174: case 175: return !1; default: L.assertNever(ue, "Unhandled object member kind") } else if (fu(Q)) { for (let ue of Q.elements) if (Km(ue)) { if (X(ue.expression)) return !0 } else if (X(ue)) return !0 } else if (Re(Q)) return Fn(ce(Q)) > (E3(Q) ? 1 : 0); return !1 } function Ve(Q, ue) { return X(Q.left) ? KT(Q, _e, e, 0, !ue, Gt) : xn(Q, _e, e) } function we(Q) { return r.updateForStatement(Q, $e(Q.initializer, ge, pp), $e(Q.condition, _e, ot), $e(Q.incrementor, ge, ot), jf(Q.statement, _e, e)) } function ke(Q) { return r.updateExpressionStatement(Q, $e(Q.expression, ge, ot)) } function Pe(Q, ue) { return r.updateParenthesizedExpression(Q, $e(Q.expression, ue ? ge : _e, ot)) } function Ce(Q, ue) { return r.updatePartiallyEmittedExpression(Q, $e(Q.expression, ue ? ge : _e, ot)) } function Ie(Q, ue) { if ((Q.operator === 45 || Q.operator === 46) && Re(Q.operand) && !tc(Q.operand) && !rv(Q.operand) && !wR(Q.operand)) { let G = ce(Q.operand); if (G) { let Oe, je = $e(Q.operand, _e, ot); tv(Q) ? je = r.updatePrefixUnaryExpression(Q, je) : (je = r.updatePostfixUnaryExpression(Q, je), ue || (Oe = r.createTempVariable(l), je = r.createAssignment(Oe, je), it(je, Q)), je = r.createComma(je, r.cloneNode(Q.operand)), it(je, Q)); for (let Ge of G) F[zo(je)] = !0, je = vn(Ge, je), it(je, Q); return Oe && (F[zo(je)] = !0, je = r.createComma(je, Oe), it(je, Q)), je } } return xn(Q, _e, e) } function Be(Q) { if (v === 0 && m >= 7) return xn(Q, _e, e); let ue = jS(r, Q, C, g, d, f), G = $e(Sl(Q.arguments), _e, ot), Oe = ue && (!G || !yo(G) || G.text !== ue.text) ? ue : G, je = !!(Q.transformFlags & 16384); switch (f.module) { case 2: return Le(Oe, je); case 3: return Ne(Oe ?? r.createVoidZero(), je); case 1: default: return Ye(Oe) } } function Ne(Q, ue) { if (B = !0, Z0(Q)) { let G = tc(Q) ? Q : yo(Q) ? r.createStringLiteralFromNode(Q) : Jn(it(r.cloneNode(Q), Q), 3072); return r.createConditionalExpression(r.createIdentifier("__syncRequire"), void 0, Ye(Q), void 0, Le(G, ue)) } else { let G = r.createTempVariable(l); return r.createComma(r.createAssignment(G, Q), r.createConditionalExpression(r.createIdentifier("__syncRequire"), void 0, Ye(G, !0), void 0, Le(G, ue))) } } function Le(Q, ue) { let G = r.createUniqueName("resolve"), Oe = r.createUniqueName("reject"), je = [r.createParameterDeclaration(void 0, void 0, G), r.createParameterDeclaration(void 0, void 0, Oe)], Ge = r.createBlock([r.createExpressionStatement(r.createCallExpression(r.createIdentifier("require"), void 0, [r.createArrayLiteralExpression([Q || r.createOmittedExpression()]), G, Oe]))]), kt; m >= 2 ? kt = r.createArrowFunction(void 0, void 0, je, void 0, void 0, Ge) : (kt = r.createFunctionExpression(void 0, void 0, void 0, void 0, je, void 0, Ge), ue && Jn(kt, 16)); let Kt = r.createNewExpression(r.createIdentifier("Promise"), void 0, [kt]); return f_(f) ? r.createCallExpression(r.createPropertyAccessExpression(Kt, r.createIdentifier("then")), void 0, [i().createImportStarCallbackHelper()]) : Kt } function Ye(Q, ue) { let G = Q && !Ap(Q) && !ue, Oe = r.createCallExpression(r.createPropertyAccessExpression(r.createIdentifier("Promise"), "resolve"), void 0, G ? m >= 2 ? [r.createTemplateExpression(r.createTemplateHead(""), [r.createTemplateSpan(Q, r.createTemplateTail(""))])] : [r.createCallExpression(r.createPropertyAccessExpression(r.createStringLiteral(""), "concat"), void 0, [Q])] : []), je = r.createCallExpression(r.createIdentifier("require"), void 0, G ? [r.createIdentifier("s")] : Q ? [Q] : []); f_(f) && (je = i().createImportStarHelper(je)); let Ge = G ? [r.createParameterDeclaration(void 0, void 0, "s")] : [], kt; return m >= 2 ? kt = r.createArrowFunction(void 0, void 0, Ge, void 0, void 0, je) : kt = r.createFunctionExpression(void 0, void 0, void 0, void 0, Ge, void 0, r.createBlock([r.createReturnStatement(je)])), r.createCallExpression(r.createPropertyAccessExpression(Oe, "then"), void 0, [kt]) } function _t(Q, ue) { return !f_(f) || o_(Q) & 2 ? ue : z_e(Q) ? i().createImportStarHelper(ue) : ue } function ct(Q, ue) { return !f_(f) || o_(Q) & 2 ? ue : vF(Q) ? i().createImportStarHelper(ue) : SK(Q) ? i().createImportDefaultHelper(ue) : ue } function Rt(Q) { let ue, G = VA(Q); if (v !== 2) if (Q.importClause) { let Oe = []; G && !lS(Q) ? Oe.push(r.createVariableDeclaration(r.cloneNode(G.name), void 0, void 0, ct(Q, We(Q)))) : (Oe.push(r.createVariableDeclaration(r.getGeneratedNameForNode(Q), void 0, void 0, ct(Q, We(Q)))), G && lS(Q) && Oe.push(r.createVariableDeclaration(r.cloneNode(G.name), void 0, void 0, r.getGeneratedNameForNode(Q)))), ue = Sn(ue, Ir(it(r.createVariableStatement(void 0, r.createVariableDeclarationList(Oe, m >= 2 ? 2 : 0)), Q), Q)) } else return Ir(it(r.createExpressionStatement(We(Q)), Q), Q); else G && lS(Q) && (ue = Sn(ue, r.createVariableStatement(void 0, r.createVariableDeclarationList([Ir(it(r.createVariableDeclaration(r.cloneNode(G.name), void 0, void 0, r.getGeneratedNameForNode(Q)), Q), Q)], m >= 2 ? 2 : 0)))); if (Ni(Q)) { let Oe = sc(Q); w[Oe] = gr(w[Oe], Q) } else ue = gr(ue, Q); return zp(ue) } function We(Q) { let ue = jS(r, Q, C, g, d, f), G = []; return ue && G.push(ue), r.createCallExpression(r.createIdentifier("require"), void 0, G) } function qe(Q) { L.assert(ab(Q), "import= for internal module references should be handled in an earlier transformer."); let ue; if (v !== 2 ? Mr(Q, 1) ? ue = Sn(ue, Ir(it(r.createExpressionStatement(vn(Q.name, We(Q))), Q), Q)) : ue = Sn(ue, Ir(it(r.createVariableStatement(void 0, r.createVariableDeclarationList([r.createVariableDeclaration(r.cloneNode(Q.name), void 0, void 0, We(Q))], m >= 2 ? 2 : 0)), Q), Q)) : Mr(Q, 1) && (ue = Sn(ue, Ir(it(r.createExpressionStatement(vn(r.getExportName(Q), r.getLocalName(Q))), Q), Q))), Ni(Q)) { let G = sc(Q); w[G] = pt(w[G], Q) } else ue = pt(ue, Q); return zp(ue) } function zt(Q) { if (!Q.moduleSpecifier) return; let ue = r.getGeneratedNameForNode(Q); if (Q.exportClause && h_(Q.exportClause)) { let G = []; v !== 2 && G.push(Ir(it(r.createVariableStatement(void 0, r.createVariableDeclarationList([r.createVariableDeclaration(ue, void 0, void 0, We(Q))])), Q), Q)); for (let Oe of Q.exportClause.elements) if (m === 0) G.push(Ir(it(r.createExpressionStatement(i().createCreateBindingHelper(ue, r.createStringLiteralFromNode(Oe.propertyName || Oe.name), Oe.propertyName ? r.createStringLiteralFromNode(Oe.name) : void 0)), Oe), Oe)); else { let je = !!f_(f) && !(o_(Q) & 2) && vr(Oe.propertyName || Oe.name) === "default", Ge = r.createPropertyAccessExpression(je ? i().createImportDefaultHelper(ue) : ue, Oe.propertyName || Oe.name); G.push(Ir(it(r.createExpressionStatement(vn(r.getExportName(Oe), Ge, void 0, !0)), Oe), Oe)) } return zp(G) } else if (Q.exportClause) { let G = []; return G.push(Ir(it(r.createExpressionStatement(vn(r.cloneNode(Q.exportClause.name), _t(Q, v !== 2 ? We(Q) : v6(Q) ? ue : r.createIdentifier(vr(Q.exportClause.name))))), Q), Q)), zp(G) } else return Ir(it(r.createExpressionStatement(i().createExportStarHelper(v !== 2 ? We(Q) : ue)), Q), Q) } function Qt(Q) { if (Q.isExportEquals) return; let ue, G = Q.original; if (G && Ni(G)) { let Oe = sc(Q); w[Oe] = Kn(w[Oe], r.createIdentifier("default"), $e(Q.expression, _e, ot), Q, !0) } else ue = Kn(ue, r.createIdentifier("default"), $e(Q.expression, _e, ot), Q, !0); return zp(ue) } function tn(Q) { let ue; if (Mr(Q, 1) ? ue = Sn(ue, Ir(it(r.createFunctionDeclaration(On(Q.modifiers, Ht, Ha), Q.asteriskToken, r.getDeclarationName(Q, !0, !0), void 0, On(Q.parameters, _e, ha), void 0, xn(Q.body, _e, e)), Q), Q)) : ue = Sn(ue, xn(Q, _e, e)), Ni(Q)) { let G = sc(Q); w[G] = pn(w[G], Q) } else ue = pn(ue, Q); return zp(ue) } function kn(Q) { let ue; if (Mr(Q, 1) ? ue = Sn(ue, Ir(it(r.createClassDeclaration(On(Q.modifiers, Ht, Ns), r.getDeclarationName(Q, !0, !0), void 0, On(Q.heritageClauses, _e, dd), On(Q.members, _e, _l)), Q), Q)) : ue = Sn(ue, xn(Q, _e, e)), Ni(Q)) { let G = sc(Q); w[G] = pn(w[G], Q) } else ue = pn(ue, Q); return zp(ue) } function _n(Q) { let ue, G, Oe; if (Mr(Q, 1)) { let je, Ge = !1; for (let kt of Q.declarationList.declarations) if (Re(kt.name) && rv(kt.name)) if (je || (je = On(Q.modifiers, Ht, Ha)), kt.initializer) { let Kt = r.updateVariableDeclaration(kt, kt.name, void 0, void 0, vn(kt.name, $e(kt.initializer, _e, ot))); G = Sn(G, Kt) } else G = Sn(G, kt); else if (kt.initializer) if (!La(kt.name) && (xs(kt.initializer) || ms(kt.initializer) || _u(kt.initializer))) { let Kt = r.createAssignment(it(r.createPropertyAccessExpression(r.createIdentifier("exports"), kt.name), kt.name), r.createIdentifier(l_(kt.name))), ln = r.createVariableDeclaration(kt.name, kt.exclamationToken, kt.type, $e(kt.initializer, _e, ot)); G = Sn(G, ln), Oe = Sn(Oe, Kt), Ge = !0 } else Oe = Sn(Oe, $n(kt)); if (G && (ue = Sn(ue, r.updateVariableStatement(Q, je, r.updateVariableDeclarationList(Q.declarationList, G)))), Oe) { let kt = Ir(it(r.createExpressionStatement(r.inlineExpressions(Oe)), Q), Q); Ge && ZR(kt), ue = Sn(ue, kt) } } else ue = Sn(ue, xn(Q, _e, e)); if (Ni(Q)) { let je = sc(Q); w[je] = nn(w[je], Q) } else ue = nn(ue, Q); return zp(ue) } function Gt(Q, ue, G) { let Oe = ce(Q); if (Oe) { let je = E3(Q) ? ue : r.createAssignment(Q, ue); for (let Ge of Oe) Jn(je, 8), je = vn(Ge, je, G); return je } return r.createAssignment(Q, ue) } function $n(Q) { return La(Q.name) ? KT($e(Q, _e, mW), _e, e, 0, !1, Gt) : r.createAssignment(it(r.createPropertyAccessExpression(r.createIdentifier("exports"), Q.name), Q.name), Q.initializer ? $e(Q.initializer, _e, ot) : r.createVoidZero()) } function ui(Q) { if (Ni(Q) && Q.original.kind === 240) { let ue = sc(Q); w[ue] = nn(w[ue], Q.original) } return Q } function Ni(Q) { return (Ya(Q) & 8388608) !== 0 } function Pi(Q) { let ue = sc(Q), G = w[ue]; return G ? (delete w[ue], Sn(G, Q)) : Q } function gr(Q, ue) { if (P.exportEquals) return Q; let G = ue.importClause; if (!G) return Q; G.name && (Q = An(Q, G)); let Oe = G.namedBindings; if (Oe) switch (Oe.kind) { case 271: Q = An(Q, Oe); break; case 272: for (let je of Oe.elements) Q = An(Q, je, !0); break }return Q } function pt(Q, ue) { return P.exportEquals ? Q : An(Q, ue) } function nn(Q, ue) { if (P.exportEquals) return Q; for (let G of ue.declarationList.declarations) Q = Dt(Q, G); return Q } function Dt(Q, ue) { if (P.exportEquals) return Q; if (La(ue.name)) for (let G of ue.name.elements) ol(G) || (Q = Dt(Q, G)); else tc(ue.name) || (Q = An(Q, ue)); return Q } function pn(Q, ue) { if (P.exportEquals) return Q; if (Mr(ue, 1)) { let G = Mr(ue, 1024) ? r.createIdentifier("default") : r.getDeclarationName(ue); Q = Kn(Q, G, r.getLocalName(ue), ue) } return ue.name && (Q = An(Q, ue)), Q } function An(Q, ue, G) { let Oe = r.getDeclarationName(ue), je = P.exportSpecifiers.get(vr(Oe)); if (je) for (let Ge of je) Q = Kn(Q, Ge.name, Oe, Ge.name, void 0, G); return Q } function Kn(Q, ue, G, Oe, je, Ge) { return Q = Sn(Q, ri(ue, G, Oe, je, Ge)), Q } function hi() { let Q; return m === 0 ? Q = r.createExpressionStatement(vn(r.createIdentifier("__esModule"), r.createTrue())) : Q = r.createExpressionStatement(r.createCallExpression(r.createPropertyAccessExpression(r.createIdentifier("Object"), "defineProperty"), void 0, [r.createIdentifier("exports"), r.createStringLiteral("__esModule"), r.createObjectLiteralExpression([r.createPropertyAssignment("value", r.createTrue())])])), Jn(Q, 2097152), Q } function ri(Q, ue, G, Oe, je) { let Ge = it(r.createExpressionStatement(vn(Q, ue, void 0, je)), G); return mu(Ge), Oe || Jn(Ge, 3072), Ge } function vn(Q, ue, G, Oe) { return it(Oe && m !== 0 ? r.createCallExpression(r.createPropertyAccessExpression(r.createIdentifier("Object"), "defineProperty"), void 0, [r.createIdentifier("exports"), r.createStringLiteralFromNode(Q), r.createObjectLiteralExpression([r.createPropertyAssignment("enumerable", r.createTrue()), r.createPropertyAssignment("get", r.createFunctionExpression(void 0, void 0, void 0, void 0, [], void 0, r.createBlock([r.createReturnStatement(ue)])))])]) : r.createAssignment(r.createPropertyAccessExpression(r.createIdentifier("exports"), r.cloneNode(Q)), ue), G) } function Ht(Q) { switch (Q.kind) { case 93: case 88: return }return Q } function En(Q, ue, G) { ue.kind === 308 ? (C = ue, P = A[sc(C)], x(Q, ue, G), C = void 0, P = void 0) : x(Q, ue, G) } function dr(Q, ue) { return ue = S(Q, ue), ue.id && F[ue.id] ? ue : Q === 1 ? Se(ue) : xf(ue) ? Cr(ue) : ue } function Cr(Q) { let ue = Q.name, G = ve(ue); if (G !== ue) { if (Q.objectAssignmentInitializer) { let Oe = r.createAssignment(G, Q.objectAssignmentInitializer); return it(r.createPropertyAssignment(ue, Oe), Q) } return it(r.createPropertyAssignment(ue, G), Q) } return Q } function Se(Q) { switch (Q.kind) { case 79: return ve(Q); case 210: return at(Q); case 212: return Tt(Q); case 223: return nt(Q) }return Q } function at(Q) { if (Re(Q.expression)) { let ue = ve(Q.expression); if (F[zo(ue)] = !0, !Re(ue) && !(Ya(Q.expression) & 8192)) return SS(r.updateCallExpression(Q, ue, void 0, Q.arguments), 16) } return Q } function Tt(Q) { if (Re(Q.tag)) { let ue = ve(Q.tag); if (F[zo(ue)] = !0, !Re(ue) && !(Ya(Q.tag) & 8192)) return SS(r.updateTaggedTemplateExpression(Q, ue, void 0, Q.template), 16) } return Q } function ve(Q) { var ue, G; if (Ya(Q) & 8192) { let Oe = SO(C); return Oe ? r.createPropertyAccessExpression(Oe, Q) : Q } else if (!(tc(Q) && !(Q.emitNode.autoGenerate.flags & 64)) && !rv(Q)) { let Oe = d.getReferencedExportContainer(Q, E3(Q)); if (Oe && Oe.kind === 308) return it(r.createPropertyAccessExpression(r.createIdentifier("exports"), r.cloneNode(Q)), Q); let je = d.getReferencedImportDeclaration(Q); if (je) { if (lm(je)) return it(r.createPropertyAccessExpression(r.getGeneratedNameForNode(je.parent), r.createIdentifier("default")), Q); if ($u(je)) { let Ge = je.propertyName || je.name; return it(r.createPropertyAccessExpression(r.getGeneratedNameForNode(((G = (ue = je.parent) == null ? void 0 : ue.parent) == null ? void 0 : G.parent) || je), r.cloneNode(Ge)), Q) } } } return Q } function nt(Q) { if (Mg(Q.operatorToken.kind) && Re(Q.left) && !tc(Q.left) && !rv(Q.left) && !wR(Q.left)) { let ue = ce(Q.left); if (ue) { let G = Q; for (let Oe of ue) F[zo(G)] = !0, G = vn(Oe, G, Q); return G } } return Q } function ce(Q) { if (!tc(Q)) { let ue = d.getReferencedImportDeclaration(Q) || d.getReferencedValueDeclaration(Q); if (ue) return P && P.exportedBindings[sc(ue)] } } } var ype, TMe = gt({
+                "src/compiler/transformers/module/module.ts"() {
+                    "use strict"; fa(), ype = {
+                        name: "typescript:dynamicimport-sync-require", scoped: !0, text: `
+            var __syncRequire = typeof module === "object" && typeof module.exports === "object";`}
+                }
+            }); function vpe(e) { let { factory: t, startLexicalEnvironment: r, endLexicalEnvironment: i, hoistVariableDeclaration: o } = e, s = e.getCompilerOptions(), l = e.getEmitResolver(), f = e.getEmitHost(), d = e.onSubstituteNode, g = e.onEmitNode; e.onSubstituteNode = je, e.onEmitNode = Oe, e.enableSubstitution(79), e.enableSubstitution(300), e.enableSubstitution(223), e.enableSubstitution(233), e.enableEmitNotification(308); let m = [], v = [], S = [], x = [], A = [], w, C, P, F, B, q, W; return y_(e, Y); function Y(oe) { if (oe.isDeclarationFile || !(aS(oe, s) || oe.transformFlags & 8388608)) return oe; let pe = sc(oe); w = oe, q = oe, C = m[pe] = xK(e, oe, l, s), P = t.createUniqueName("exports"), S[pe] = P, F = A[pe] = t.createUniqueName("context"); let z = R(C.externalImports), Te = ie(oe, z), j = t.createFunctionExpression(void 0, void 0, void 0, void 0, [t.createParameterDeclaration(void 0, void 0, P), t.createParameterDeclaration(void 0, void 0, F)], void 0, Te), yt = xO(t, oe, f, s), lt = t.createArrayLiteralExpression(on(z, Vt => Vt.name)), Qe = Jn(t.updateSourceFile(oe, it(t.createNodeArray([t.createExpressionStatement(t.createCallExpression(t.createPropertyAccessExpression(t.createIdentifier("System"), "register"), void 0, yt ? [yt, lt, j] : [lt, j]))]), oe.statements)), 2048); return Ss(s) || gue(Qe, Te, Vt => !Vt.scoped), W && (x[pe] = W, W = void 0), w = void 0, C = void 0, P = void 0, F = void 0, B = void 0, q = void 0, Qe } function R(oe) { let pe = new Map, z = []; for (let Te of oe) { let j = jS(t, Te, w, f, l, s); if (j) { let yt = j.text, lt = pe.get(yt); lt !== void 0 ? z[lt].externalImports.push(Te) : (pe.set(yt, z.length), z.push({ name: j, externalImports: [Te] })) } } return z } function ie(oe, pe) { let z = []; r(); let Te = Uf(s, "alwaysStrict") || !s.noImplicitUseStrict && Lc(w), j = t.copyPrologue(oe.statements, z, Te, U); z.push(t.createVariableStatement(void 0, t.createVariableDeclarationList([t.createVariableDeclaration("__moduleName", void 0, void 0, t.createLogicalAnd(F, t.createPropertyAccessExpression(F, "id")))]))), $e(C.externalHelpersImportDeclaration, U, ca); let yt = On(oe.statements, U, ca, j); si(z, B), em(z, i()); let lt = $(z), Qe = oe.transformFlags & 2097152 ? t.createModifiersFromModifierFlags(512) : void 0, Vt = t.createObjectLiteralExpression([t.createPropertyAssignment("setters", Z(lt, pe)), t.createPropertyAssignment("execute", t.createFunctionExpression(Qe, void 0, void 0, void 0, [], void 0, t.createBlock(yt, !0)))], !0); return z.push(t.createReturnStatement(Vt)), t.createBlock(z, !0) } function $(oe) { if (!C.hasExportStarsToExportValues) return; if (!C.exportedNames && C.exportSpecifiers.size === 0) { let j = !1; for (let yt of C.externalImports) if (yt.kind === 275 && yt.exportClause) { j = !0; break } if (!j) { let yt = fe(void 0); return oe.push(yt), yt.name } } let pe = []; if (C.exportedNames) for (let j of C.exportedNames) j.escapedText !== "default" && pe.push(t.createPropertyAssignment(t.createStringLiteralFromNode(j), t.createTrue())); let z = t.createUniqueName("exportedNames"); oe.push(t.createVariableStatement(void 0, t.createVariableDeclarationList([t.createVariableDeclaration(z, void 0, void 0, t.createObjectLiteralExpression(pe, !0))]))); let Te = fe(z); return oe.push(Te), Te.name } function fe(oe) { let pe = t.createUniqueName("exportStar"), z = t.createIdentifier("m"), Te = t.createIdentifier("n"), j = t.createIdentifier("exports"), yt = t.createStrictInequality(Te, t.createStringLiteral("default")); return oe && (yt = t.createLogicalAnd(yt, t.createLogicalNot(t.createCallExpression(t.createPropertyAccessExpression(oe, "hasOwnProperty"), void 0, [Te])))), t.createFunctionDeclaration(void 0, void 0, pe, void 0, [t.createParameterDeclaration(void 0, void 0, z)], void 0, t.createBlock([t.createVariableStatement(void 0, t.createVariableDeclarationList([t.createVariableDeclaration(j, void 0, void 0, t.createObjectLiteralExpression([]))])), t.createForInStatement(t.createVariableDeclarationList([t.createVariableDeclaration(Te)]), z, t.createBlock([Jn(t.createIfStatement(yt, t.createExpressionStatement(t.createAssignment(t.createElementAccessExpression(j, Te), t.createElementAccessExpression(z, Te)))), 1)])), t.createExpressionStatement(t.createCallExpression(P, void 0, [j]))], !0)) } function Z(oe, pe) { let z = []; for (let Te of pe) { let j = mn(Te.externalImports, Qe => C2(t, Qe, w)), yt = j ? t.getGeneratedNameForNode(j) : t.createUniqueName(""), lt = []; for (let Qe of Te.externalImports) { let Vt = C2(t, Qe, w); switch (Qe.kind) { case 269: if (!Qe.importClause) break; case 268: L.assert(Vt !== void 0), lt.push(t.createExpressionStatement(t.createAssignment(Vt, yt))), Mr(Qe, 1) && lt.push(t.createExpressionStatement(t.createCallExpression(P, void 0, [t.createStringLiteral(vr(Vt)), yt]))); break; case 275: if (L.assert(Vt !== void 0), Qe.exportClause) if (h_(Qe.exportClause)) { let Hn = []; for (let jr of Qe.exportClause.elements) Hn.push(t.createPropertyAssignment(t.createStringLiteral(vr(jr.name)), t.createElementAccessExpression(yt, t.createStringLiteral(vr(jr.propertyName || jr.name))))); lt.push(t.createExpressionStatement(t.createCallExpression(P, void 0, [t.createObjectLiteralExpression(Hn, !0)]))) } else lt.push(t.createExpressionStatement(t.createCallExpression(P, void 0, [t.createStringLiteral(vr(Qe.exportClause.name)), yt]))); else lt.push(t.createExpressionStatement(t.createCallExpression(oe, void 0, [yt]))); break } } z.push(t.createFunctionExpression(void 0, void 0, void 0, void 0, [t.createParameterDeclaration(void 0, void 0, yt)], void 0, t.createBlock(lt, !0))) } return t.createArrayLiteralExpression(z, !0) } function U(oe) { switch (oe.kind) { case 269: return re(oe); case 268: return _e(oe); case 275: return le(oe); case 274: return ge(oe); default: return Gt(oe) } } function re(oe) { let pe; if (oe.importClause && o(C2(t, oe, w)), Ye(oe)) { let z = sc(oe); v[z] = ct(v[z], oe) } else pe = ct(pe, oe); return zp(pe) } function le(oe) { L.assertIsDefined(oe) } function _e(oe) { L.assert(ab(oe), "import= for internal module references should be handled in an earlier transformer."); let pe; if (o(C2(t, oe, w)), Ye(oe)) { let z = sc(oe); v[z] = Rt(v[z], oe) } else pe = Rt(pe, oe); return zp(pe) } function ge(oe) { if (oe.isExportEquals) return; let pe = $e(oe.expression, Cr, ot), z = oe.original; if (z && Ye(z)) { let Te = sc(oe); v[Te] = tn(v[Te], t.createIdentifier("default"), pe, !0) } else return kn(t.createIdentifier("default"), pe, !0) } function X(oe) { if (Mr(oe, 1) ? B = Sn(B, t.updateFunctionDeclaration(oe, On(oe.modifiers, G, Ns), oe.asteriskToken, t.getDeclarationName(oe, !0, !0), void 0, On(oe.parameters, Cr, ha), void 0, $e(oe.body, Cr, Va))) : B = Sn(B, xn(oe, Cr, e)), Ye(oe)) { let pe = sc(oe); v[pe] = zt(v[pe], oe) } else B = zt(B, oe) } function Ve(oe) { let pe, z = t.getLocalName(oe); if (o(z), pe = Sn(pe, it(t.createExpressionStatement(t.createAssignment(z, it(t.createClassExpression(On(oe.modifiers, G, Ns), oe.name, void 0, On(oe.heritageClauses, Cr, dd), On(oe.members, Cr, _l)), oe))), oe)), Ye(oe)) { let Te = sc(oe); v[Te] = zt(v[Te], oe) } else pe = zt(pe, oe); return zp(pe) } function we(oe) { if (!Pe(oe.declarationList)) return $e(oe, Cr, ca); let pe, z = Mr(oe, 1), Te = Ye(oe); for (let yt of oe.declarationList.declarations) yt.initializer ? pe = Sn(pe, Ce(yt, z && !Te)) : ke(yt); let j; if (pe && (j = Sn(j, it(t.createExpressionStatement(t.inlineExpressions(pe)), oe))), Te) { let yt = sc(oe); v[yt] = We(v[yt], oe, z) } else j = We(j, oe, !1); return zp(j) } function ke(oe) { if (La(oe.name)) for (let pe of oe.name.elements) ol(pe) || ke(pe); else o(t.cloneNode(oe.name)) } function Pe(oe) { return (Ya(oe) & 4194304) === 0 && (q.kind === 308 || (ec(oe).flags & 3) === 0) } function Ce(oe, pe) { let z = pe ? Ie : Be; return La(oe.name) ? KT(oe, Cr, e, 0, !1, z) : oe.initializer ? z(oe.name, $e(oe.initializer, Cr, ot)) : oe.name } function Ie(oe, pe, z) { return Ne(oe, pe, z, !0) } function Be(oe, pe, z) { return Ne(oe, pe, z, !1) } function Ne(oe, pe, z, Te) { return o(t.cloneNode(oe)), Te ? _n(oe, Ot(it(t.createAssignment(oe, pe), z))) : Ot(it(t.createAssignment(oe, pe), z)) } function Le(oe) { if (Ye(oe) && oe.original.kind === 240) { let pe = sc(oe), z = Mr(oe.original, 1); v[pe] = We(v[pe], oe.original, z) } return oe } function Ye(oe) { return (Ya(oe) & 8388608) !== 0 } function _t(oe) { let pe = sc(oe), z = v[pe]; if (z) return delete v[pe], Sn(z, oe); { let Te = ec(oe); if (Ow(Te)) return Sn(Qt(z, Te), oe) } return oe } function ct(oe, pe) { if (C.exportEquals) return oe; let z = pe.importClause; if (!z) return oe; z.name && (oe = Qt(oe, z)); let Te = z.namedBindings; if (Te) switch (Te.kind) { case 271: oe = Qt(oe, Te); break; case 272: for (let j of Te.elements) oe = Qt(oe, j); break }return oe } function Rt(oe, pe) { return C.exportEquals ? oe : Qt(oe, pe) } function We(oe, pe, z) { if (C.exportEquals) return oe; for (let Te of pe.declarationList.declarations) (Te.initializer || z) && (oe = qe(oe, Te, z)); return oe } function qe(oe, pe, z) { if (C.exportEquals) return oe; if (La(pe.name)) for (let Te of pe.name.elements) ol(Te) || (oe = qe(oe, Te, z)); else if (!tc(pe.name)) { let Te; z && (oe = tn(oe, pe.name, t.getLocalName(pe)), Te = vr(pe.name)), oe = Qt(oe, pe, Te) } return oe } function zt(oe, pe) { if (C.exportEquals) return oe; let z; if (Mr(pe, 1)) { let Te = Mr(pe, 1024) ? t.createStringLiteral("default") : pe.name; oe = tn(oe, Te, t.getLocalName(pe)), z = l_(Te) } return pe.name && (oe = Qt(oe, pe, z)), oe } function Qt(oe, pe, z) { if (C.exportEquals) return oe; let Te = t.getDeclarationName(pe), j = C.exportSpecifiers.get(vr(Te)); if (j) for (let yt of j) yt.name.escapedText !== z && (oe = tn(oe, yt.name, Te)); return oe } function tn(oe, pe, z, Te) { return oe = Sn(oe, kn(pe, z, Te)), oe } function kn(oe, pe, z) { let Te = t.createExpressionStatement(_n(oe, pe)); return mu(Te), z || Jn(Te, 3072), Te } function _n(oe, pe) { let z = Re(oe) ? t.createStringLiteralFromNode(oe) : oe; return Jn(pe, Ya(pe) | 3072), hl(t.createCallExpression(P, void 0, [z, pe]), pe) } function Gt(oe) { switch (oe.kind) { case 240: return we(oe); case 259: return X(oe); case 260: return Ve(oe); case 245: return $n(oe, !0); case 246: return ui(oe); case 247: return Ni(oe); case 243: return pt(oe); case 244: return nn(oe); case 253: return Dt(oe); case 251: return pn(oe); case 252: return An(oe); case 266: return Kn(oe); case 292: return hi(oe); case 293: return ri(oe); case 255: return vn(oe); case 295: return Ht(oe); case 238: return En(oe); case 358: return Le(oe); case 359: return _t(oe); default: return Cr(oe) } } function $n(oe, pe) { let z = q; return q = oe, oe = t.updateForStatement(oe, $e(oe.initializer, pe ? gr : Se, pp), $e(oe.condition, Cr, ot), $e(oe.incrementor, Se, ot), jf(oe.statement, pe ? Gt : Cr, e)), q = z, oe } function ui(oe) { let pe = q; return q = oe, oe = t.updateForInStatement(oe, gr(oe.initializer), $e(oe.expression, Cr, ot), jf(oe.statement, Gt, e)), q = pe, oe } function Ni(oe) { let pe = q; return q = oe, oe = t.updateForOfStatement(oe, oe.awaitModifier, gr(oe.initializer), $e(oe.expression, Cr, ot), jf(oe.statement, Gt, e)), q = pe, oe } function Pi(oe) { return pu(oe) && Pe(oe) } function gr(oe) { if (Pi(oe)) { let pe; for (let z of oe.declarations) pe = Sn(pe, Ce(z, !1)), z.initializer || ke(z); return pe ? t.inlineExpressions(pe) : t.createOmittedExpression() } else return $e(oe, Se, pp) } function pt(oe) { return t.updateDoStatement(oe, jf(oe.statement, Gt, e), $e(oe.expression, Cr, ot)) } function nn(oe) { return t.updateWhileStatement(oe, $e(oe.expression, Cr, ot), jf(oe.statement, Gt, e)) } function Dt(oe) { return t.updateLabeledStatement(oe, oe.label, L.checkDefined($e(oe.statement, Gt, ca, t.liftToBlock))) } function pn(oe) { return t.updateWithStatement(oe, $e(oe.expression, Cr, ot), L.checkDefined($e(oe.statement, Gt, ca, t.liftToBlock))) } function An(oe) { return t.updateSwitchStatement(oe, $e(oe.expression, Cr, ot), L.checkDefined($e(oe.caseBlock, Gt, hO))) } function Kn(oe) { let pe = q; return q = oe, oe = t.updateCaseBlock(oe, On(oe.clauses, Gt, Kj)), q = pe, oe } function hi(oe) { return t.updateCaseClause(oe, $e(oe.expression, Cr, ot), On(oe.statements, Gt, ca)) } function ri(oe) { return xn(oe, Gt, e) } function vn(oe) { return xn(oe, Gt, e) } function Ht(oe) { let pe = q; return q = oe, oe = t.updateCatchClause(oe, oe.variableDeclaration, L.checkDefined($e(oe.block, Gt, Va))), q = pe, oe } function En(oe) { let pe = q; return q = oe, oe = xn(oe, Gt, e), q = pe, oe } function dr(oe, pe) { if (!(oe.transformFlags & 276828160)) return oe; switch (oe.kind) { case 245: return $n(oe, !1); case 241: return at(oe); case 214: return Tt(oe, pe); case 356: return ve(oe, pe); case 223: if (Fg(oe)) return ce(oe, pe); break; case 210: if (Dd(oe)) return nt(oe); break; case 221: case 222: return ue(oe, pe) }return xn(oe, Cr, e) } function Cr(oe) { return dr(oe, !1) } function Se(oe) { return dr(oe, !0) } function at(oe) { return t.updateExpressionStatement(oe, $e(oe.expression, Se, ot)) } function Tt(oe, pe) { return t.updateParenthesizedExpression(oe, $e(oe.expression, pe ? Se : Cr, ot)) } function ve(oe, pe) { return t.updatePartiallyEmittedExpression(oe, $e(oe.expression, pe ? Se : Cr, ot)) } function nt(oe) { let pe = jS(t, oe, w, f, l, s), z = $e(Sl(oe.arguments), Cr, ot), Te = pe && (!z || !yo(z) || z.text !== pe.text) ? pe : z; return t.createCallExpression(t.createPropertyAccessExpression(F, t.createIdentifier("import")), void 0, Te ? [Te] : []) } function ce(oe, pe) { return Q(oe.left) ? KT(oe, Cr, e, 0, !pe) : xn(oe, Cr, e) } function Q(oe) { if (Iu(oe, !0)) return Q(oe.left); if (Km(oe)) return Q(oe.expression); if (rs(oe)) return vt(oe.properties, Q); if (fu(oe)) return vt(oe.elements, Q); if (xf(oe)) return Q(oe.name); if (yl(oe)) return Q(oe.initializer); if (Re(oe)) { let pe = l.getReferencedExportContainer(oe); return pe !== void 0 && pe.kind === 308 } else return !1 } function ue(oe, pe) { if ((oe.operator === 45 || oe.operator === 46) && Re(oe.operand) && !tc(oe.operand) && !rv(oe.operand) && !wR(oe.operand)) { let z = rt(oe.operand); if (z) { let Te, j = $e(oe.operand, Cr, ot); tv(oe) ? j = t.updatePrefixUnaryExpression(oe, j) : (j = t.updatePostfixUnaryExpression(oe, j), pe || (Te = t.createTempVariable(o), j = t.createAssignment(Te, j), it(j, oe)), j = t.createComma(j, t.cloneNode(oe.operand)), it(j, oe)); for (let yt of z) j = _n(yt, Ot(j)); return Te && (j = t.createComma(j, Te), it(j, oe)), j } } return xn(oe, Cr, e) } function G(oe) { switch (oe.kind) { case 93: case 88: return }return oe } function Oe(oe, pe, z) { if (pe.kind === 308) { let Te = sc(pe); w = pe, C = m[Te], P = S[Te], W = x[Te], F = A[Te], W && delete x[Te], g(oe, pe, z), w = void 0, C = void 0, P = void 0, F = void 0, W = void 0 } else g(oe, pe, z) } function je(oe, pe) { return pe = d(oe, pe), Ke(pe) ? pe : oe === 1 ? Kt(pe) : oe === 4 ? Ge(pe) : pe } function Ge(oe) { switch (oe.kind) { case 300: return kt(oe) }return oe } function kt(oe) { var pe, z; let Te = oe.name; if (!tc(Te) && !rv(Te)) { let j = l.getReferencedImportDeclaration(Te); if (j) { if (lm(j)) return it(t.createPropertyAssignment(t.cloneNode(Te), t.createPropertyAccessExpression(t.getGeneratedNameForNode(j.parent), t.createIdentifier("default"))), oe); if ($u(j)) return it(t.createPropertyAssignment(t.cloneNode(Te), t.createPropertyAccessExpression(t.getGeneratedNameForNode(((z = (pe = j.parent) == null ? void 0 : pe.parent) == null ? void 0 : z.parent) || j), t.cloneNode(j.propertyName || j.name))), oe) } } return oe } function Kt(oe) { switch (oe.kind) { case 79: return ln(oe); case 223: return ir(oe); case 233: return ae(oe) }return oe } function ln(oe) { var pe, z; if (Ya(oe) & 8192) { let Te = SO(w); return Te ? t.createPropertyAccessExpression(Te, oe) : oe } if (!tc(oe) && !rv(oe)) { let Te = l.getReferencedImportDeclaration(oe); if (Te) { if (lm(Te)) return it(t.createPropertyAccessExpression(t.getGeneratedNameForNode(Te.parent), t.createIdentifier("default")), oe); if ($u(Te)) return it(t.createPropertyAccessExpression(t.getGeneratedNameForNode(((z = (pe = Te.parent) == null ? void 0 : pe.parent) == null ? void 0 : z.parent) || Te), t.cloneNode(Te.propertyName || Te.name)), oe) } } return oe } function ir(oe) { if (Mg(oe.operatorToken.kind) && Re(oe.left) && !tc(oe.left) && !rv(oe.left) && !wR(oe.left)) { let pe = rt(oe.left); if (pe) { let z = oe; for (let Te of pe) z = _n(Te, Ot(z)); return z } } return oe } function ae(oe) { return NA(oe) ? t.createPropertyAccessExpression(F, t.createIdentifier("meta")) : oe } function rt(oe) { let pe; if (!tc(oe)) { let z = l.getReferencedImportDeclaration(oe) || l.getReferencedValueDeclaration(oe); if (z) { let Te = l.getReferencedExportContainer(oe, !1); Te && Te.kind === 308 && (pe = Sn(pe, t.getDeclarationName(z))), pe = si(pe, C && C.exportedBindings[sc(z)]) } } return pe } function Ot(oe) { return W === void 0 && (W = []), W[zo(oe)] = !0, oe } function Ke(oe) { return W && oe.id && W[oe.id] } } var SMe = gt({ "src/compiler/transformers/module/system.ts"() { "use strict"; fa() } }); function GK(e) { let { factory: t, getEmitHelperFactory: r } = e, i = e.getEmitHost(), o = e.getEmitResolver(), s = e.getCompilerOptions(), l = Do(s), f = e.onEmitNode, d = e.onSubstituteNode; e.onEmitNode = q, e.onSubstituteNode = W, e.enableEmitNotification(308), e.enableSubstitution(79); let g, m, v; return y_(e, S); function S(R) { if (R.isDeclarationFile) return R; if (Lc(R) || d_(s)) { m = R, v = void 0; let ie = x(R); return m = void 0, v && (ie = t.updateSourceFile(ie, it(t.createNodeArray(rH(ie.statements.slice(), v)), ie.statements))), !Lc(R) || vt(ie.statements, Rw) ? ie : t.updateSourceFile(ie, it(t.createNodeArray([...ie.statements, bO(t)]), ie.statements)) } return R } function x(R) { let ie = nJ(t, r(), R, s); if (ie) { let $ = [], fe = t.copyPrologue(R.statements, $); return Sn($, ie), si($, On(R.statements, A, ca, fe)), t.updateSourceFile(R, it(t.createNodeArray($), R.statements)) } else return xn(R, A, e) } function A(R) { switch (R.kind) { case 268: return Rl(s) >= 100 ? C(R) : void 0; case 274: return F(R); case 275: return B(R) }return R } function w(R) { let ie = jS(t, R, L.checkDefined(m), i, o, s), $ = []; if (ie && $.push(ie), !v) { let Z = t.createUniqueName("_createRequire", 48), U = t.createImportDeclaration(void 0, t.createImportClause(!1, void 0, t.createNamedImports([t.createImportSpecifier(!1, t.createIdentifier("createRequire"), Z)])), t.createStringLiteral("module")), re = t.createUniqueName("__require", 48), le = t.createVariableStatement(void 0, t.createVariableDeclarationList([t.createVariableDeclaration(re, void 0, void 0, t.createCallExpression(t.cloneNode(Z), void 0, [t.createPropertyAccessExpression(t.createMetaProperty(100, t.createIdentifier("meta")), t.createIdentifier("url"))]))], l >= 2 ? 2 : 0)); v = [U, le] } let fe = v[1].declarationList.declarations[0].name; return L.assertNode(fe, Re), t.createCallExpression(t.cloneNode(fe), void 0, $) } function C(R) { L.assert(ab(R), "import= for internal module references should be handled in an earlier transformer."); let ie; return ie = Sn(ie, Ir(it(t.createVariableStatement(void 0, t.createVariableDeclarationList([t.createVariableDeclaration(t.cloneNode(R.name), void 0, void 0, w(R))], l >= 2 ? 2 : 0)), R), R)), ie = P(ie, R), zp(ie) } function P(R, ie) { return Mr(ie, 1) && (R = Sn(R, t.createExportDeclaration(void 0, ie.isTypeOnly, t.createNamedExports([t.createExportSpecifier(!1, void 0, vr(ie.name))])))), R } function F(R) { return R.isExportEquals ? void 0 : R } function B(R) { if (s.module !== void 0 && s.module > 5 || !R.exportClause || !qm(R.exportClause) || !R.moduleSpecifier) return R; let ie = R.exportClause.name, $ = t.getGeneratedNameForNode(ie), fe = t.createImportDeclaration(void 0, t.createImportClause(!1, void 0, t.createNamespaceImport($)), R.moduleSpecifier, R.assertClause); Ir(fe, R.exportClause); let Z = v6(R) ? t.createExportDefault($) : t.createExportDeclaration(void 0, !1, t.createNamedExports([t.createExportSpecifier(!1, $, ie)])); return Ir(Z, R), [fe, Z] } function q(R, ie, $) { Li(ie) ? ((Lc(ie) || d_(s)) && s.importHelpers && (g = new Map), f(R, ie, $), g = void 0) : f(R, ie, $) } function W(R, ie) { return ie = d(R, ie), g && Re(ie) && Ya(ie) & 8192 ? Y(ie) : ie } function Y(R) { let ie = vr(R), $ = g.get(ie); return $ || g.set(ie, $ = t.createUniqueName(ie, 48)), $ } } var xMe = gt({ "src/compiler/transformers/module/esnextAnd2015.ts"() { "use strict"; fa() } }); function bpe(e) { let t = e.onSubstituteNode, r = e.onEmitNode, i = GK(e), o = e.onSubstituteNode, s = e.onEmitNode; e.onSubstituteNode = t, e.onEmitNode = r; let l = FK(e), f = e.onSubstituteNode, d = e.onEmitNode; e.onSubstituteNode = m, e.onEmitNode = v, e.enableSubstitution(308), e.enableEmitNotification(308); let g; return A; function m(C, P) { return Li(P) ? (g = P, t(C, P)) : g ? g.impliedNodeFormat === 99 ? o(C, P) : f(C, P) : t(C, P) } function v(C, P, F) { return Li(P) && (g = P), g ? g.impliedNodeFormat === 99 ? s(C, P, F) : d(C, P, F) : r(C, P, F) } function S(C) { return C.impliedNodeFormat === 99 ? i : l } function x(C) { if (C.isDeclarationFile) return C; g = C; let P = S(C)(C); return g = void 0, L.assert(Li(P)), P } function A(C) { return C.kind === 308 ? x(C) : w(C) } function w(C) { return e.factory.createBundle(on(C.sourceFiles, x), C.prepends) } } var AMe = gt({ "src/compiler/transformers/module/node.ts"() { "use strict"; fa() } }); function xF(e) { return wi(e) || Na(e) || $d(e) || Wo(e) || Ng(e) || zy(e) || uO(e) || _2(e) || Nc(e) || zm(e) || Jc(e) || ha(e) || _c(e) || Vg(e) || Nl(e) || Ep(e) || Ec(e) || kS(e) || br(e) || Ff(e) } function Epe(e) { if (Ng(e) || zy(e)) return t; return zm(e) || Nc(e) ? i : zg(e); function t(s) { let l = r(s); return l !== void 0 ? { diagnosticMessage: l, errorNode: e, typeName: e.name } : void 0 } function r(s) { return Ca(e) ? s.errorModuleName ? s.accessibility === 2 ? _.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : _.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : _.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1 : e.parent.kind === 260 ? s.errorModuleName ? s.accessibility === 2 ? _.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : _.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : _.Public_property_0_of_exported_class_has_or_is_using_private_name_1 : s.errorModuleName ? _.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : _.Property_0_of_exported_interface_has_or_is_using_private_name_1 } function i(s) { let l = o(s); return l !== void 0 ? { diagnosticMessage: l, errorNode: e, typeName: e.name } : void 0 } function o(s) { return Ca(e) ? s.errorModuleName ? s.accessibility === 2 ? _.Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : _.Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : _.Public_static_method_0_of_exported_class_has_or_is_using_private_name_1 : e.parent.kind === 260 ? s.errorModuleName ? s.accessibility === 2 ? _.Public_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : _.Public_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : _.Public_method_0_of_exported_class_has_or_is_using_private_name_1 : s.errorModuleName ? _.Method_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : _.Method_0_of_exported_interface_has_or_is_using_private_name_1 } } function zg(e) { if (wi(e) || Na(e) || $d(e) || br(e) || Wo(e) || Ec(e)) return r; return Ng(e) || zy(e) ? i : uO(e) || _2(e) || Nc(e) || zm(e) || Jc(e) || kS(e) ? o : ha(e) ? Ad(e, e.parent) && Mr(e.parent, 8) ? r : s : _c(e) ? f : Vg(e) ? d : Nl(e) ? g : Ep(e) || Ff(e) ? m : L.assertNever(e, `Attempted to set a declaration diagnostic context for unhandled node kind: ${L.formatSyntaxKind(e.kind)}`); function t(v) { if (e.kind === 257 || e.kind === 205) return v.errorModuleName ? v.accessibility === 2 ? _.Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : _.Exported_variable_0_has_or_is_using_name_1_from_private_module_2 : _.Exported_variable_0_has_or_is_using_private_name_1; if (e.kind === 169 || e.kind === 208 || e.kind === 168 || e.kind === 166 && Mr(e.parent, 8)) return Ca(e) ? v.errorModuleName ? v.accessibility === 2 ? _.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : _.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : _.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1 : e.parent.kind === 260 || e.kind === 166 ? v.errorModuleName ? v.accessibility === 2 ? _.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : _.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : _.Public_property_0_of_exported_class_has_or_is_using_private_name_1 : v.errorModuleName ? _.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : _.Property_0_of_exported_interface_has_or_is_using_private_name_1 } function r(v) { let S = t(v); return S !== void 0 ? { diagnosticMessage: S, errorNode: e, typeName: e.name } : void 0 } function i(v) { let S; return e.kind === 175 ? Ca(e) ? S = v.errorModuleName ? _.Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : _.Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_private_name_1 : S = v.errorModuleName ? _.Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : _.Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_private_name_1 : Ca(e) ? S = v.errorModuleName ? v.accessibility === 2 ? _.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : _.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : _.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_private_name_1 : S = v.errorModuleName ? v.accessibility === 2 ? _.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : _.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : _.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_private_name_1, { diagnosticMessage: S, errorNode: e.name, typeName: e.name } } function o(v) { let S; switch (e.kind) { case 177: S = v.errorModuleName ? _.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : _.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0; break; case 176: S = v.errorModuleName ? _.Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : _.Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0; break; case 178: S = v.errorModuleName ? _.Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : _.Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0; break; case 171: case 170: Ca(e) ? S = v.errorModuleName ? v.accessibility === 2 ? _.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : _.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 : _.Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0 : e.parent.kind === 260 ? S = v.errorModuleName ? v.accessibility === 2 ? _.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : _.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 : _.Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0 : S = v.errorModuleName ? _.Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : _.Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0; break; case 259: S = v.errorModuleName ? v.accessibility === 2 ? _.Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : _.Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1 : _.Return_type_of_exported_function_has_or_is_using_private_name_0; break; default: return L.fail("This is unknown kind for signature: " + e.kind) }return { diagnosticMessage: S, errorNode: e.name || e } } function s(v) { let S = l(v); return S !== void 0 ? { diagnosticMessage: S, errorNode: e, typeName: e.name } : void 0 } function l(v) { switch (e.parent.kind) { case 173: return v.errorModuleName ? v.accessibility === 2 ? _.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : _.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2 : _.Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1; case 177: case 182: return v.errorModuleName ? _.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : _.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1; case 176: return v.errorModuleName ? _.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : _.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1; case 178: return v.errorModuleName ? _.Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : _.Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_private_name_1; case 171: case 170: return Ca(e.parent) ? v.errorModuleName ? v.accessibility === 2 ? _.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : _.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 : _.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1 : e.parent.parent.kind === 260 ? v.errorModuleName ? v.accessibility === 2 ? _.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : _.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 : _.Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1 : v.errorModuleName ? _.Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : _.Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1; case 259: case 181: return v.errorModuleName ? v.accessibility === 2 ? _.Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : _.Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2 : _.Parameter_0_of_exported_function_has_or_is_using_private_name_1; case 175: case 174: return v.errorModuleName ? v.accessibility === 2 ? _.Parameter_0_of_accessor_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : _.Parameter_0_of_accessor_has_or_is_using_name_1_from_private_module_2 : _.Parameter_0_of_accessor_has_or_is_using_private_name_1; default: return L.fail(`Unknown parent for parameter: ${L.formatSyntaxKind(e.parent.kind)}`) } } function f() { let v; switch (e.parent.kind) { case 260: v = _.Type_parameter_0_of_exported_class_has_or_is_using_private_name_1; break; case 261: v = _.Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1; break; case 197: v = _.Type_parameter_0_of_exported_mapped_object_type_is_using_private_name_1; break; case 182: case 177: v = _.Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1; break; case 176: v = _.Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1; break; case 171: case 170: Ca(e.parent) ? v = _.Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1 : e.parent.parent.kind === 260 ? v = _.Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1 : v = _.Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1; break; case 181: case 259: v = _.Type_parameter_0_of_exported_function_has_or_is_using_private_name_1; break; case 192: v = _.Extends_clause_for_inferred_type_0_has_or_is_using_private_name_1; break; case 262: v = _.Type_parameter_0_of_exported_type_alias_has_or_is_using_private_name_1; break; default: return L.fail("This is unknown parent for type parameter: " + e.parent.kind) }return { diagnosticMessage: v, errorNode: e, typeName: e.name } } function d() { let v; return sl(e.parent.parent) ? v = dd(e.parent) && e.parent.token === 117 ? _.Implements_clause_of_exported_class_0_has_or_is_using_private_name_1 : e.parent.parent.name ? _.extends_clause_of_exported_class_0_has_or_is_using_private_name_1 : _.extends_clause_of_exported_class_has_or_is_using_private_name_0 : v = _.extends_clause_of_exported_interface_0_has_or_is_using_private_name_1, { diagnosticMessage: v, errorNode: e, typeName: sa(e.parent.parent) } } function g() { return { diagnosticMessage: _.Import_declaration_0_is_using_private_name_1, errorNode: e, typeName: e.name } } function m(v) { return { diagnosticMessage: v.errorModuleName ? _.Exported_type_alias_0_has_or_is_using_private_name_1_from_module_2 : _.Exported_type_alias_0_has_or_is_using_private_name_1, errorNode: Ff(e) ? L.checkDefined(e.typeExpression) : e.type, typeName: Ff(e) ? sa(e) : e.name } } } var CMe = gt({ "src/compiler/transformers/declarations/diagnostics.ts"() { "use strict"; fa() } }); function Tpe(e, t, r) { let i = e.getCompilerOptions(); return lN(t, e, D, i, r ? [r] : Pr(e.getSourceFiles(), LH), [UK], !1).diagnostics } function Spe(e, t) { let r = t.text.substring(e.pos, e.end); return jl(r, "@internal") } function BK(e, t) { let r = ea(e); if (r && r.kind === 166) { let o = r.parent.parameters.indexOf(r), s = o > 0 ? r.parent.parameters[o - 1] : void 0, l = t.text, f = s ? Qi(eb(l, xo(l, s.end + 1, !1, !0)), Nm(l, e.pos)) : eb(l, xo(l, e.pos, !1, !0)); return f && f.length && Spe(To(f), t) } let i = r && bH(r, t); return !!mn(i, o => Spe(o, t)) } function UK(e) { let t = () => L.fail("Diagnostic emitted without context"), r = t, i = !0, o = !1, s = !1, l = !1, f = !1, d, g, m, v, S, x, { factory: A } = e, w = e.getEmitHost(), C = { trackSymbol: _e, reportInaccessibleThisError: ke, reportInaccessibleUniqueSymbolError: Ve, reportCyclicStructureError: we, reportPrivateInBaseOfClassExpression: ge, reportLikelyUnsafeImportRequiredError: Pe, reportTruncationError: Ce, moduleResolverHost: w, trackReferencedAmbientModule: U, trackExternalModuleSymbolOfImportTypeNode: le, reportNonlocalAugmentation: Ie, reportNonSerializableProperty: Be, reportImportTypeNodeResolutionModeOverride: Ne }, P, F, B, q, W, Y, R = e.getEmitResolver(), ie = e.getCompilerOptions(), { noResolve: $, stripInternal: fe } = ie; return Ye; function Z(G) { if (G) { g = g || new Set; for (let Oe of G) g.add(Oe) } } function U(G, Oe) { let je = R.getTypeReferenceDirectivesForSymbol(Oe, 67108863); if (Fn(je)) return Z(je); let Ge = Gn(G); q.set(sc(Ge), Ge) } function re(G) { if (G.accessibility === 0) { if (G && G.aliasesToMakeVisible) if (!m) m = G.aliasesToMakeVisible; else for (let Oe of G.aliasesToMakeVisible) Of(m, Oe) } else { let Oe = r(G); if (Oe) return Oe.typeName ? e.addDiagnostic(hr(G.errorNode || Oe.errorNode, Oe.diagnosticMessage, Qc(Oe.typeName), G.errorSymbolName, G.errorModuleName)) : e.addDiagnostic(hr(G.errorNode || Oe.errorNode, Oe.diagnosticMessage, G.errorSymbolName, G.errorModuleName)), !0 } return !1 } function le(G) { o || (x || (x = [])).push(G) } function _e(G, Oe, je) { if (G.flags & 262144) return !1; let Ge = re(R.isSymbolAccessible(G, Oe, je, !0)); return Z(R.getTypeReferenceDirectivesForSymbol(G, je)), Ge } function ge(G) { (P || F) && e.addDiagnostic(hr(P || F, _.Property_0_of_exported_class_expression_may_not_be_private_or_protected, G)) } function X() { return P ? os(P) : F && sa(F) ? os(sa(F)) : F && pc(F) ? F.isExportEquals ? "export=" : "default" : "(Missing)" } function Ve() { (P || F) && e.addDiagnostic(hr(P || F, _.The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary, X(), "unique symbol")) } function we() { (P || F) && e.addDiagnostic(hr(P || F, _.The_inferred_type_of_0_references_a_type_with_a_cyclic_structure_which_cannot_be_trivially_serialized_A_type_annotation_is_necessary, X())) } function ke() { (P || F) && e.addDiagnostic(hr(P || F, _.The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary, X(), "this")) } function Pe(G) { (P || F) && e.addDiagnostic(hr(P || F, _.The_inferred_type_of_0_cannot_be_named_without_a_reference_to_1_This_is_likely_not_portable_A_type_annotation_is_necessary, X(), G)) } function Ce() { (P || F) && e.addDiagnostic(hr(P || F, _.The_inferred_type_of_this_node_exceeds_the_maximum_length_the_compiler_will_serialize_An_explicit_type_annotation_is_needed)) } function Ie(G, Oe, je) { var Ge; let kt = (Ge = Oe.declarations) == null ? void 0 : Ge.find(ln => Gn(ln) === G), Kt = Pr(je.declarations, ln => Gn(ln) !== G); if (kt && Kt) for (let ln of Kt) e.addDiagnostic(Ao(hr(ln, _.Declaration_augments_declaration_in_another_file_This_cannot_be_serialized), hr(kt, _.This_is_the_declaration_being_augmented_Consider_moving_the_augmenting_declaration_into_the_same_file))) } function Be(G) { (P || F) && e.addDiagnostic(hr(P || F, _.The_type_of_this_node_cannot_be_serialized_because_its_property_0_cannot_be_serialized, G)) } function Ne() { !TR() && (P || F) && e.addDiagnostic(hr(P || F, _.The_type_of_this_expression_cannot_be_named_without_a_resolution_mode_assertion_which_is_an_unstable_feature_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next)) } function Le(G, Oe) { let je = r; r = kt => kt.errorNode && xF(kt.errorNode) ? zg(kt.errorNode)(kt) : { diagnosticMessage: kt.errorModuleName ? _.Declaration_emit_for_this_file_requires_using_private_name_0_from_module_1_An_explicit_type_annotation_may_unblock_declaration_emit : _.Declaration_emit_for_this_file_requires_using_private_name_0_An_explicit_type_annotation_may_unblock_declaration_emit, errorNode: kt.errorNode || G }; let Ge = R.getDeclarationStatementsForSourceFile(G, tE, C, Oe); return r = je, Ge } function Ye(G) { if (G.kind === 308 && G.isDeclarationFile) return G; if (G.kind === 309) { o = !0, q = new Map, W = new Map; let Ot = !1, Ke = A.createBundle(on(G.sourceFiles, z => { if (z.isDeclarationFile) return; if (Ot = Ot || z.hasNoDefaultLib, B = z, d = z, m = void 0, S = !1, v = new Map, r = t, l = !1, f = !1, _t(z, q), ct(z, W), kd(z) || Mf(z)) { s = !1, i = !1; let j = Cu(z) ? A.createNodeArray(Le(z, !0)) : On(z.statements, ri, ca); return A.updateSourceFile(z, [A.createModuleDeclaration([A.createModifier(136)], A.createStringLiteral(Z6(e.getEmitHost(), z)), A.createModuleBlock(it(A.createNodeArray(An(j)), z.statements)))], !0, [], [], !1, []) } i = !0; let Te = Cu(z) ? A.createNodeArray(Le(z)) : On(z.statements, ri, ca); return A.updateSourceFile(z, An(Te), !0, [], [], !1, []) }), Zi(G.prepends, z => { if (z.kind === 311) { let Te = fz(z, "dts", fe); return Ot = Ot || !!Te.hasNoDefaultLib, _t(Te, q), Z(on(Te.typeReferenceDirectives, j => [j.fileName, j.resolutionMode])), ct(Te, W), Te } return z })); Ke.syntheticFileReferences = [], Ke.syntheticTypeReferences = ir(), Ke.syntheticLibReferences = ln(), Ke.hasNoDefaultLib = Ot; let oe = ni(Al(KL(G, w, !0).declarationFilePath)), pe = rt(Ke.syntheticFileReferences, oe); return q.forEach(pe), Ke } i = !0, l = !1, f = !1, d = G, B = G, r = t, o = !1, s = !1, S = !1, m = void 0, v = new Map, g = void 0, q = _t(B, new Map), W = ct(B, new Map); let Oe = [], je = ni(Al(KL(G, w, !0).declarationFilePath)), Ge = rt(Oe, je), kt; if (Cu(B)) kt = A.createNodeArray(Le(G)), q.forEach(Ge), Y = Pr(kt, yT); else { let Ot = On(G.statements, ri, ca); kt = it(A.createNodeArray(An(Ot)), G.statements), q.forEach(Ge), Y = Pr(kt, yT), Lc(G) && (!s || l && !f) && (kt = it(A.createNodeArray([...kt, bO(A)]), kt)) } let Kt = A.updateSourceFile(G, kt, !0, Oe, ir(), G.hasNoDefaultLib, ln()); return Kt.exportedModulesFromDeclarationEmit = x, Kt; function ln() { return lo(W.keys(), Ot => ({ fileName: Ot, pos: -1, end: -1 })) } function ir() { return g ? Zi(lo(g.keys()), ae) : [] } function ae([Ot, Ke]) { if (Y) { for (let oe of Y) if (Nl(oe) && um(oe.moduleReference)) { let pe = oe.moduleReference.expression; if (es(pe) && pe.text === Ot) return } else if (gl(oe) && yo(oe.moduleSpecifier) && oe.moduleSpecifier.text === Ot) return } return { fileName: Ot, pos: -1, end: -1, ...Ke ? { resolutionMode: Ke } : void 0 } } function rt(Ot, Ke) { return oe => { let pe; if (oe.isDeclarationFile) pe = oe.fileName; else { if (o && ya(G.sourceFiles, oe)) return; let z = KL(oe, w, !0); pe = z.declarationFilePath || z.jsFilePath || oe.fileName } if (pe) { let z = sF(ie, B, Ts(Ke, w.getCurrentDirectory(), w.getCanonicalFileName), Ts(pe, w.getCurrentDirectory(), w.getCanonicalFileName), w); if (!Jd(z)) { Z([[z, void 0]]); return } let Te = Q1(Ke, pe, w.getCurrentDirectory(), w.getCanonicalFileName, !1); if (na(Te, "./") && gA(Te) && (Te = Te.substring(2)), na(Te, "node_modules/") || JS(Te)) return; Ot.push({ pos: -1, end: -1, fileName: Te }) } } } } function _t(G, Oe) { return $ || !BT(G) && Cu(G) || mn(G.referencedFiles, je => { let Ge = w.getSourceFileFromReference(G, je); Ge && Oe.set(sc(Ge), Ge) }), Oe } function ct(G, Oe) { return mn(G.libReferenceDirectives, je => { w.getLibFileFromReference(je) && Oe.set(n_(je.fileName), !0) }), Oe } function Rt(G) { if (G.kind === 79) return G; return G.kind === 204 ? A.updateArrayBindingPattern(G, On(G.elements, Oe, c6)) : A.updateObjectBindingPattern(G, On(G.elements, Oe, Wo)); function Oe(je) { return je.kind === 229 ? je : je.propertyName && Re(je.propertyName) && Re(je.name) && !je.symbol.isReferenced && !q6(je.propertyName) ? A.updateBindingElement(je, je.dotDotDotToken, void 0, je.propertyName, qe(je) ? je.initializer : void 0) : A.updateBindingElement(je, je.dotDotDotToken, je.propertyName, Rt(je.name), qe(je) ? je.initializer : void 0) } } function We(G, Oe, je) { let Ge; S || (Ge = r, r = zg(G)); let kt = A.updateParameterDeclaration(G, LMe(G, Oe), G.dotDotDotToken, Rt(G.name), R.isOptionalParameter(G) ? G.questionToken || A.createToken(57) : void 0, Qt(G, je || G.type, !0), zt(G)); return S || (r = Ge), kt } function qe(G) { return kMe(G) && R.isLiteralConstDeclaration(ea(G)) } function zt(G) { if (qe(G)) return R.createLiteralConstValue(ea(G), C) } function Qt(G, Oe, je) { if (!je && cd(G, 8) || qe(G)) return; let Ge = G.kind === 166 && (R.isRequiredInitializedParameter(G) || R.isOptionalUninitializedParameterProperty(G)); if (Oe && !Ge) return $e(Oe, Kn, bi); if (!ea(G)) return Oe ? $e(Oe, Kn, bi) : A.createKeywordTypeNode(131); if (G.kind === 175) return A.createKeywordTypeNode(131); P = G.name; let kt; if (S || (kt = r, r = zg(G)), G.kind === 257 || G.kind === 205) return Kt(R.createTypeOfDeclaration(G, d, tE, C)); if (G.kind === 166 || G.kind === 169 || G.kind === 168) return $d(G) || !G.initializer ? Kt(R.createTypeOfDeclaration(G, d, tE, C, Ge)) : Kt(R.createTypeOfDeclaration(G, d, tE, C, Ge) || R.createTypeOfExpression(G.initializer, d, tE, C)); return Kt(R.createReturnTypeOfSignatureDeclaration(G, d, tE, C)); function Kt(ln) { return P = void 0, S || (r = kt), ln || A.createKeywordTypeNode(131) } } function tn(G) { switch (G = ea(G), G.kind) { case 259: case 264: case 261: case 260: case 262: case 263: return !R.isDeclarationVisible(G); case 257: return !_n(G); case 268: case 269: case 275: case 274: return !1; case 172: return !0 }return !1 } function kn(G) { var Oe; if (G.body) return !0; let je = (Oe = G.symbol.declarations) == null ? void 0 : Oe.filter(Ge => Jc(Ge) && !Ge.body); return !je || je.indexOf(G) === je.length - 1 } function _n(G) { return ol(G) ? !1 : La(G.name) ? vt(G.name.elements, _n) : R.isDeclarationVisible(G) } function Gt(G, Oe, je) { if (cd(G, 8)) return A.createNodeArray(); let Ge = on(Oe, kt => We(kt, je)); return Ge ? A.createNodeArray(Ge, Oe.hasTrailingComma) : A.createNodeArray() } function $n(G, Oe) { let je; if (!Oe) { let Ge = F0(G); Ge && (je = [We(Ge)]) } if (Sf(G)) { let Ge; if (!Oe) { let kt = VI(G); if (kt) { let Kt = Q(G, R.getAllAccessorDeclarations(G)); Ge = We(kt, void 0, Kt) } } Ge || (Ge = A.createParameterDeclaration(void 0, void 0, "value")), je = Sn(je, Ge) } return A.createNodeArray(je || Je) } function ui(G, Oe) { return cd(G, 8) ? void 0 : On(Oe, Kn, _c) } function Ni(G) { return Li(G) || Ep(G) || Tc(G) || sl(G) || ku(G) || Ia(G) || kS(G) || EL(G) } function Pi(G, Oe) { let je = R.isEntityNameVisible(G, Oe); re(je), Z(R.getTypeReferenceDirectivesForEntityName(G)) } function gr(G, Oe) { return Kd(G) && Kd(Oe) && (G.jsDoc = Oe.jsDoc), hl(G, sm(Oe)) } function pt(G, Oe) { if (Oe) { if (s = s || G.kind !== 264 && G.kind !== 202, es(Oe)) if (o) { let je = Dce(e.getEmitHost(), R, G); if (je) return A.createStringLiteral(je) } else { let je = R.getSymbolOfExternalModuleSpecifier(Oe); je && (x || (x = [])).push(je) } return Oe } } function nn(G) { if (R.isDeclarationVisible(G)) if (G.moduleReference.kind === 280) { let Oe = wI(G); return A.updateImportEqualsDeclaration(G, G.modifiers, G.isTypeOnly, G.name, A.updateExternalModuleReference(G.moduleReference, pt(G, Oe))) } else { let Oe = r; return r = zg(G), Pi(G.moduleReference, d), r = Oe, G } } function Dt(G) { if (!G.importClause) return A.updateImportDeclaration(G, G.modifiers, G.importClause, pt(G, G.moduleSpecifier), pn(G.assertClause)); let Oe = G.importClause && G.importClause.name && R.isDeclarationVisible(G.importClause) ? G.importClause.name : void 0; if (!G.importClause.namedBindings) return Oe && A.updateImportDeclaration(G, G.modifiers, A.updateImportClause(G.importClause, G.importClause.isTypeOnly, Oe, void 0), pt(G, G.moduleSpecifier), pn(G.assertClause)); if (G.importClause.namedBindings.kind === 271) { let Ge = R.isDeclarationVisible(G.importClause.namedBindings) ? G.importClause.namedBindings : void 0; return Oe || Ge ? A.updateImportDeclaration(G, G.modifiers, A.updateImportClause(G.importClause, G.importClause.isTypeOnly, Oe, Ge), pt(G, G.moduleSpecifier), pn(G.assertClause)) : void 0 } let je = Zi(G.importClause.namedBindings.elements, Ge => R.isDeclarationVisible(Ge) ? Ge : void 0); if (je && je.length || Oe) return A.updateImportDeclaration(G, G.modifiers, A.updateImportClause(G.importClause, G.importClause.isTypeOnly, Oe, je && je.length ? A.updateNamedImports(G.importClause.namedBindings, je) : void 0), pt(G, G.moduleSpecifier), pn(G.assertClause)); if (R.isImportRequiredByAugmentation(G)) return A.updateImportDeclaration(G, G.modifiers, void 0, pt(G, G.moduleSpecifier), pn(G.assertClause)) } function pn(G) { if (qS(G) !== void 0) return TR() || e.addDiagnostic(hr(G, _.resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next)), G } function An(G) { for (; Fn(m);) { let je = m.shift(); if (!E6(je)) return L.fail(`Late replaced statement was found which is not handled by the declaration transformer!: ${L.formatSyntaxKind(je.kind)}`); let Ge = i; i = je.parent && Li(je.parent) && !(Lc(je.parent) && o); let kt = Ht(je); i = Ge, v.set(sc(je), kt) } return On(G, Oe, ca); function Oe(je) { if (E6(je)) { let Ge = sc(je); if (v.has(Ge)) { let kt = v.get(Ge); return v.delete(Ge), kt && ((ba(kt) ? vt(kt, l6) : l6(kt)) && (l = !0), Li(je.parent) && (ba(kt) ? vt(kt, Rw) : Rw(kt)) && (s = !0)), kt } } return je } } function Kn(G) { if (at(G) || Kl(G) && (tn(G) || Xy(G) && !R.isLateBound(ea(G))) || Ia(G) && R.isImplementationOfOverload(G) || Bue(G)) return; let Oe; Ni(G) && (Oe = d, d = G); let je = r, Ge = xF(G), kt = S, Kt = (G.kind === 184 || G.kind === 197) && G.parent.kind !== 262; if ((Nc(G) || zm(G)) && cd(G, 8)) return G.symbol && G.symbol.declarations && G.symbol.declarations[0] !== G ? void 0 : ln(A.createPropertyDeclaration(nt(G), G.name, void 0, void 0, void 0)); if (Ge && !S && (r = zg(G)), vL(G) && Pi(G.exprName, d), Kt && (S = !0), wMe(G)) switch (G.kind) { case 230: { (Cd(G.expression) || bc(G.expression)) && Pi(G.expression, d); let ir = xn(G, Kn, e); return ln(A.updateExpressionWithTypeArguments(ir, ir.expression, ir.typeArguments)) } case 180: { Pi(G.typeName, d); let ir = xn(G, Kn, e); return ln(A.updateTypeReferenceNode(ir, ir.typeName, ir.typeArguments)) } case 177: return ln(A.updateConstructSignature(G, ui(G, G.typeParameters), Gt(G, G.parameters), Qt(G, G.type))); case 173: { let ir = A.createConstructorDeclaration(nt(G), Gt(G, G.parameters, 0), void 0); return ln(ir) } case 171: { if (pi(G.name)) return ln(void 0); let ir = A.createMethodDeclaration(nt(G), void 0, G.name, G.questionToken, ui(G, G.typeParameters), Gt(G, G.parameters), Qt(G, G.type), void 0); return ln(ir) } case 174: { if (pi(G.name)) return ln(void 0); let ir = Q(G, R.getAllAccessorDeclarations(G)); return ln(A.updateGetAccessorDeclaration(G, nt(G), G.name, $n(G, cd(G, 8)), Qt(G, ir), void 0)) } case 175: return pi(G.name) ? ln(void 0) : ln(A.updateSetAccessorDeclaration(G, nt(G), G.name, $n(G, cd(G, 8)), void 0)); case 169: return pi(G.name) ? ln(void 0) : ln(A.updatePropertyDeclaration(G, nt(G), G.name, G.questionToken, Qt(G, G.type), zt(G))); case 168: return pi(G.name) ? ln(void 0) : ln(A.updatePropertySignature(G, nt(G), G.name, G.questionToken, Qt(G, G.type))); case 170: return pi(G.name) ? ln(void 0) : ln(A.updateMethodSignature(G, nt(G), G.name, G.questionToken, ui(G, G.typeParameters), Gt(G, G.parameters), Qt(G, G.type))); case 176: return ln(A.updateCallSignature(G, ui(G, G.typeParameters), Gt(G, G.parameters), Qt(G, G.type))); case 178: return ln(A.updateIndexSignature(G, nt(G), Gt(G, G.parameters), $e(G.type, Kn, bi) || A.createKeywordTypeNode(131))); case 257: return La(G.name) ? dr(G.name) : (Kt = !0, S = !0, ln(A.updateVariableDeclaration(G, G.name, void 0, Qt(G, G.type), zt(G)))); case 165: return hi(G) && (G.default || G.constraint) ? ln(A.updateTypeParameterDeclaration(G, G.modifiers, G.name, void 0, void 0)) : ln(xn(G, Kn, e)); case 191: { let ir = $e(G.checkType, Kn, bi), ae = $e(G.extendsType, Kn, bi), rt = d; d = G.trueType; let Ot = $e(G.trueType, Kn, bi); d = rt; let Ke = $e(G.falseType, Kn, bi); return L.assert(ir), L.assert(ae), L.assert(Ot), L.assert(Ke), ln(A.updateConditionalTypeNode(G, ir, ae, Ot, Ke)) } case 181: return ln(A.updateFunctionTypeNode(G, On(G.typeParameters, Kn, _c), Gt(G, G.parameters), L.checkDefined($e(G.type, Kn, bi)))); case 182: return ln(A.updateConstructorTypeNode(G, nt(G), On(G.typeParameters, Kn, _c), Gt(G, G.parameters), L.checkDefined($e(G.type, Kn, bi)))); case 202: return ib(G) ? ln(A.updateImportTypeNode(G, A.updateLiteralTypeNode(G.argument, pt(G, G.argument.literal)), G.assertions, G.qualifier, On(G.typeArguments, Kn, bi), G.isTypeOf)) : ln(G); default: L.assertNever(G, `Attempted to process unhandled node kind: ${L.formatSyntaxKind(G.kind)}`) }return p2(G) && Gs(B, G.pos).line === Gs(B, G.end).line && Jn(G, 1), ln(xn(G, Kn, e)); function ln(ir) { return ir && Ge && Xy(G) && Se(G), Ni(G) && (d = Oe), Ge && !S && (r = je), Kt && (S = kt), ir === G ? ir : ir && Ir(gr(ir, G), G) } } function hi(G) { return G.parent.kind === 171 && cd(G.parent, 8) } function ri(G) { if (!DMe(G) || at(G)) return; switch (G.kind) { case 275: return Li(G.parent) && (s = !0), f = !0, A.updateExportDeclaration(G, G.modifiers, G.isTypeOnly, G.exportClause, pt(G, G.moduleSpecifier), qS(G.assertClause) ? G.assertClause : void 0); case 274: { if (Li(G.parent) && (s = !0), f = !0, G.expression.kind === 79) return G; { let je = A.createUniqueName("_default", 16); r = () => ({ diagnosticMessage: _.Default_export_of_the_module_has_or_is_using_private_name_0, errorNode: G }), F = G; let Ge = A.createVariableDeclaration(je, void 0, R.createTypeOfExpression(G.expression, G, tE, C), void 0); F = void 0; let kt = A.createVariableStatement(i ? [A.createModifier(136)] : [], A.createVariableDeclarationList([Ge], 2)); return gr(kt, G), ZR(G), [kt, A.updateExportAssignment(G, G.modifiers, je)] } } }let Oe = Ht(G); return v.set(sc(G), Oe), G } function vn(G) { if (Nl(G) || cd(G, 1024) || !g_(G)) return G; let Oe = A.createModifiersFromModifierFlags(uu(G) & 258046); return A.updateModifiers(G, Oe) } function Ht(G) { if (m) for (; m8(m, G);); if (at(G)) return; switch (G.kind) { case 268: return nn(G); case 269: return Dt(G) }if (Kl(G) && tn(G) || Ia(G) && R.isImplementationOfOverload(G)) return; let Oe; Ni(G) && (Oe = d, d = G); let je = xF(G), Ge = r; je && (r = zg(G)); let kt = i; switch (G.kind) { case 262: { i = !1; let ln = Kt(A.updateTypeAliasDeclaration(G, nt(G), G.name, On(G.typeParameters, Kn, _c), L.checkDefined($e(G.type, Kn, bi)))); return i = kt, ln } case 261: return Kt(A.updateInterfaceDeclaration(G, nt(G), G.name, ui(G, G.typeParameters), ue(G.heritageClauses), On(G.members, Kn, _T))); case 259: { let ln = Kt(A.updateFunctionDeclaration(G, nt(G), void 0, G.name, ui(G, G.typeParameters), Gt(G, G.parameters), Qt(G, G.type), void 0)); if (ln && R.isExpandoFunctionDeclaration(G) && kn(G)) { let ir = R.getPropertiesOfContainerFunction(G), ae = fm.createModuleDeclaration(void 0, ln.name || A.createIdentifier("_default"), A.createModuleBlock([]), 16); go(ae, d), ae.locals = Ua(ir), ae.symbol = ir[0].parent; let rt = [], Ot = Zi(ir, j => { if (!j.valueDeclaration || !br(j.valueDeclaration)) return; r = zg(j.valueDeclaration); let yt = R.createTypeOfDeclaration(j.valueDeclaration, ae, tE, C); r = Ge; let lt = Gi(j.escapedName), Qe = fS(lt), Vt = Qe ? A.getGeneratedNameForNode(j.valueDeclaration) : A.createIdentifier(lt); Qe && rt.push([Vt, lt]); let Hn = A.createVariableDeclaration(Vt, void 0, yt, void 0); return A.createVariableStatement(Qe ? void 0 : [A.createToken(93)], A.createVariableDeclarationList([Hn])) }); rt.length ? Ot.push(A.createExportDeclaration(void 0, !1, A.createNamedExports(on(rt, ([j, yt]) => A.createExportSpecifier(!1, j, yt))))) : Ot = Zi(Ot, j => A.updateModifiers(j, 0)); let Ke = A.createModuleDeclaration(nt(G), G.name, A.createModuleBlock(Ot), 16); if (!cd(ln, 1024)) return [ln, Ke]; let oe = A.createModifiersFromModifierFlags(uu(ln) & -1026 | 2), pe = A.updateFunctionDeclaration(ln, oe, void 0, ln.name, ln.typeParameters, ln.parameters, ln.type, void 0), z = A.updateModuleDeclaration(Ke, oe, Ke.name, Ke.body), Te = A.createExportAssignment(void 0, !1, Ke.name); return Li(G.parent) && (s = !0), f = !0, [pe, z, Te] } else return ln } case 264: { i = !1; let ln = G.body; if (ln && ln.kind === 265) { let ir = l, ae = f; f = !1, l = !1; let rt = On(ln.statements, ri, ca), Ot = An(rt); G.flags & 16777216 && (l = !1), !mp(G) && !ve(Ot) && !f && (l ? Ot = A.createNodeArray([...Ot, bO(A)]) : Ot = On(Ot, vn, ca)); let Ke = A.updateModuleBlock(ln, Ot); i = kt, l = ir, f = ae; let oe = nt(G); return Kt(A.updateModuleDeclaration(G, oe, D0(G) ? pt(G, G.name) : G.name, Ke)) } else { i = kt; let ir = nt(G); i = !1, $e(ln, ri); let ae = sc(ln), rt = v.get(ae); return v.delete(ae), Kt(A.updateModuleDeclaration(G, ir, G.name, rt)) } } case 260: { P = G.name, F = G; let ln = A.createNodeArray(nt(G)), ir = ui(G, G.typeParameters), ae = Vm(G), rt; if (ae) { let Te = r; rt = WD(Uo(ae.parameters, j => { if (!Mr(j, 16476) || at(j)) return; if (r = zg(j), j.name.kind === 79) return gr(A.createPropertyDeclaration(nt(j), j.name, j.questionToken, Qt(j, j.type), zt(j)), j); return yt(j.name); function yt(lt) { let Qe; for (let Vt of lt.elements) ol(Vt) || (La(Vt.name) && (Qe = Qi(Qe, yt(Vt.name))), Qe = Qe || [], Qe.push(A.createPropertyDeclaration(nt(j), Vt.name, void 0, Qt(Vt, void 0), void 0))); return Qe } })), r = Te } let Ke = vt(G.members, Te => !!Te.name && pi(Te.name)) ? [A.createPropertyDeclaration(void 0, A.createPrivateIdentifier("#private"), void 0, void 0, void 0)] : void 0, oe = Qi(Qi(Ke, rt), On(G.members, Kn, _l)), pe = A.createNodeArray(oe), z = hp(G); if (z && !bc(z.expression) && z.expression.kind !== 104) { let Te = G.name ? Gi(G.name.escapedText) : "default", j = A.createUniqueName(`${Te}_base`, 16); r = () => ({ diagnosticMessage: _.extends_clause_of_exported_class_0_has_or_is_using_private_name_1, errorNode: z, typeName: G.name }); let yt = A.createVariableDeclaration(j, void 0, R.createTypeOfExpression(z.expression, G, tE, C), void 0), lt = A.createVariableStatement(i ? [A.createModifier(136)] : [], A.createVariableDeclarationList([yt], 2)), Qe = A.createNodeArray(on(G.heritageClauses, Vt => { if (Vt.token === 94) { let Hn = r; r = zg(Vt.types[0]); let jr = A.updateHeritageClause(Vt, on(Vt.types, ei => A.updateExpressionWithTypeArguments(ei, j, On(ei.typeArguments, Kn, bi)))); return r = Hn, jr } return A.updateHeritageClause(Vt, On(A.createNodeArray(Pr(Vt.types, Hn => bc(Hn.expression) || Hn.expression.kind === 104)), Kn, Vg)) })); return [lt, Kt(A.updateClassDeclaration(G, ln, G.name, ir, Qe, pe))] } else { let Te = ue(G.heritageClauses); return Kt(A.updateClassDeclaration(G, ln, G.name, ir, Te, pe)) } } case 240: return Kt(En(G)); case 263: return Kt(A.updateEnumDeclaration(G, A.createNodeArray(nt(G)), G.name, A.createNodeArray(Zi(G.members, ln => { if (at(ln)) return; let ir = R.getConstantValue(ln); return gr(A.updateEnumMember(ln, ln.name, ir !== void 0 ? typeof ir == "string" ? A.createStringLiteral(ir) : A.createNumericLiteral(ir) : void 0), ln) })))) }return L.assertNever(G, `Unhandled top-level node in declaration emit: ${L.formatSyntaxKind(G.kind)}`); function Kt(ln) { return Ni(G) && (d = Oe), je && (r = Ge), G.kind === 264 && (i = kt), ln === G ? ln : (F = void 0, P = void 0, ln && Ir(gr(ln, G), G)) } } function En(G) { if (!mn(G.declarationList.declarations, _n)) return; let Oe = On(G.declarationList.declarations, Kn, wi); if (Fn(Oe)) return A.updateVariableStatement(G, A.createNodeArray(nt(G)), A.updateVariableDeclarationList(G.declarationList, Oe)) } function dr(G) { return t_(Zi(G.elements, Oe => Cr(Oe))) } function Cr(G) { if (G.kind !== 229 && G.name) return _n(G) ? La(G.name) ? dr(G.name) : A.createVariableDeclaration(G.name, void 0, Qt(G, void 0), void 0) : void 0 } function Se(G) { let Oe; S || (Oe = r, r = Epe(G)), P = G.name, L.assert(R.isLateBound(ea(G))); let Ge = G.name.expression; Pi(Ge, d), S || (r = Oe), P = void 0 } function at(G) { return !!fe && !!G && BK(G, B) } function Tt(G) { return pc(G) || Il(G) } function ve(G) { return vt(G, Tt) } function nt(G) { let Oe = uu(G), je = ce(G); return Oe === je ? vK(G.modifiers, Ge => zr(Ge, Ha), Ha) : A.createModifiersFromModifierFlags(je) } function ce(G) { let Oe = 241147, je = i && !IMe(G) ? 2 : 0, Ge = G.parent.kind === 308; return (!Ge || o && Ge && Lc(G.parent)) && (Oe ^= 2, je = 0), xpe(G, Oe, je) } function Q(G, Oe) { let je = VK(G); return !je && G !== Oe.firstAccessor && (je = VK(Oe.firstAccessor), r = zg(Oe.firstAccessor)), !je && Oe.secondAccessor && G !== Oe.secondAccessor && (je = VK(Oe.secondAccessor), r = zg(Oe.secondAccessor)), je } function ue(G) { return A.createNodeArray(Pr(on(G, Oe => A.updateHeritageClause(Oe, On(A.createNodeArray(Pr(Oe.types, je => bc(je.expression) || Oe.token === 94 && je.expression.kind === 104)), Kn, Vg))), Oe => Oe.types && !!Oe.types.length)) } } function IMe(e) { return e.kind === 261 } function LMe(e, t, r) { return D.createModifiersFromModifierFlags(xpe(e, t, r)) } function xpe(e, t = 258043, r = 0) { let i = uu(e) & t | r; return i & 1024 && !(i & 1) && (i ^= 1), i & 1024 && i & 2 && (i ^= 2), i } function VK(e) { if (e) return e.kind === 174 ? e.type : e.parameters.length > 0 ? e.parameters[0].type : void 0 } function kMe(e) { switch (e.kind) { case 169: case 168: return !cd(e, 8); case 166: case 257: return !0 }return !1 } function DMe(e) { switch (e.kind) { case 259: case 264: case 268: case 261: case 260: case 262: case 263: case 240: case 269: case 275: case 274: return !0 }return !1 } function wMe(e) { switch (e.kind) { case 177: case 173: case 171: case 174: case 175: case 169: case 168: case 170: case 176: case 178: case 257: case 165: case 230: case 180: case 191: case 181: case 182: case 202: return !0 }return !1 } var tE, RMe = gt({ "src/compiler/transformers/declarations.ts"() { "use strict"; fa(), dK(), tE = 531469 } }); function OMe(e) { switch (e) { case 99: case 7: case 6: case 5: return GK; case 4: return vpe; case 100: case 199: return bpe; default: return FK } } function jK(e, t, r) { return { scriptTransformers: NMe(e, t, r), declarationTransformers: PMe(t) } } function NMe(e, t, r) { if (r) return Je; let i = Do(e), o = Rl(e), s = MR(e), l = []; return si(l, t && on(t.before, Cpe)), l.push(Z_e), e.experimentalDecorators ? l.push(rpe) : (i < 99 || !s) && l.push(ipe), l.push(tpe), AW(e) && l.push(dpe), i < 99 && l.push(upe), i < 8 && l.push(lpe), i < 7 && l.push(cpe), i < 6 && l.push(spe), i < 5 && l.push(ope), i < 4 && l.push(ape), i < 3 && l.push(_pe), i < 2 && (l.push(mpe), l.push(gpe)), l.push(OMe(o)), i < 1 && l.push(hpe), si(l, t && on(t.after, Cpe)), l } function PMe(e) { let t = []; return t.push(UK), si(t, e && on(e.afterDeclarations, FMe)), t } function MMe(e) { return t => Bz(t) ? e.transformBundle(t) : e.transformSourceFile(t) } function Ape(e, t) { return r => { let i = e(r); return typeof i == "function" ? t(r, i) : MMe(i) } } function Cpe(e) { return Ape(e, y_) } function FMe(e) { return Ape(e, (t, r) => r) } function zL(e, t) { return t } function cN(e, t, r) { r(e, t) } function lN(e, t, r, i, o, s, l) { var f, d; let g = new Array(361), m, v, S, x = 0, A = [], w = [], C = [], P = [], F = 0, B = !1, q = [], W = 0, Y, R, ie = zL, $ = cN, fe = 0, Z = [], U = { factory: r, getCompilerOptions: () => i, getEmitResolver: () => e, getEmitHost: () => t, getEmitHelperFactory: zu(() => Tue(U)), startLexicalEnvironment: Le, suspendLexicalEnvironment: Ye, resumeLexicalEnvironment: _t, endLexicalEnvironment: ct, setLexicalEnvironmentFlags: Rt, getLexicalEnvironmentFlags: We, hoistVariableDeclaration: Ie, hoistFunctionDeclaration: Be, addInitializationStatement: Ne, startBlockScope: qe, endBlockScope: zt, addBlockScopedVariable: Qt, requestEmitHelper: tn, readEmitHelpers: kn, enableSubstitution: X, enableEmitNotification: ke, isSubstitutionEnabled: Ve, isEmitNotificationEnabled: Pe, get onSubstituteNode() { return ie }, set onSubstituteNode(Gt) { L.assert(fe < 1, "Cannot modify transformation hooks after initialization has completed."), L.assert(Gt !== void 0, "Value must not be 'undefined'"), ie = Gt }, get onEmitNode() { return $ }, set onEmitNode(Gt) { L.assert(fe < 1, "Cannot modify transformation hooks after initialization has completed."), L.assert(Gt !== void 0, "Value must not be 'undefined'"), $ = Gt }, addDiagnostic(Gt) { Z.push(Gt) } }; for (let Gt of o) yz(Gn(ea(Gt))); Fs("beforeTransform"); let re = s.map(Gt => Gt(U)), le = Gt => { for (let $n of re) Gt = $n(Gt); return Gt }; fe = 1; let _e = []; for (let Gt of o) (f = ai) == null || f.push(ai.Phase.Emit, "transformNodes", Gt.kind === 308 ? { path: Gt.path } : { kind: Gt.kind, pos: Gt.pos, end: Gt.end }), _e.push((l ? le : ge)(Gt)), (d = ai) == null || d.pop(); return fe = 2, Fs("afterTransform"), hf("transformTime", "beforeTransform", "afterTransform"), { transformed: _e, substituteNode: we, emitNodeWithNotification: Ce, isEmitNotificationEnabled: Pe, dispose: _n, diagnostics: Z }; function ge(Gt) { return Gt && (!Li(Gt) || !Gt.isDeclarationFile) ? le(Gt) : Gt } function X(Gt) { L.assert(fe < 2, "Cannot modify the transformation context after transformation has completed."), g[Gt] |= 1 } function Ve(Gt) { return (g[Gt.kind] & 1) !== 0 && (Ya(Gt) & 8) === 0 } function we(Gt, $n) { return L.assert(fe < 3, "Cannot substitute a node after the result is disposed."), $n && Ve($n) && ie(Gt, $n) || $n } function ke(Gt) { L.assert(fe < 2, "Cannot modify the transformation context after transformation has completed."), g[Gt] |= 2 } function Pe(Gt) { return (g[Gt.kind] & 2) !== 0 || (Ya(Gt) & 4) !== 0 } function Ce(Gt, $n, ui) { L.assert(fe < 3, "Cannot invoke TransformationResult callbacks after the result is disposed."), $n && (Pe($n) ? $(Gt, $n, ui) : ui(Gt, $n)) } function Ie(Gt) { L.assert(fe > 0, "Cannot modify the lexical environment during initialization."), L.assert(fe < 2, "Cannot modify the lexical environment after transformation has completed."); let $n = Jn(r.createVariableDeclaration(Gt), 128); m ? m.push($n) : m = [$n], x & 1 && (x |= 2) } function Be(Gt) { L.assert(fe > 0, "Cannot modify the lexical environment during initialization."), L.assert(fe < 2, "Cannot modify the lexical environment after transformation has completed."), Jn(Gt, 2097152), v ? v.push(Gt) : v = [Gt] } function Ne(Gt) { L.assert(fe > 0, "Cannot modify the lexical environment during initialization."), L.assert(fe < 2, "Cannot modify the lexical environment after transformation has completed."), Jn(Gt, 2097152), S ? S.push(Gt) : S = [Gt] } function Le() { L.assert(fe > 0, "Cannot modify the lexical environment during initialization."), L.assert(fe < 2, "Cannot modify the lexical environment after transformation has completed."), L.assert(!B, "Lexical environment is suspended."), A[F] = m, w[F] = v, C[F] = S, P[F] = x, F++, m = void 0, v = void 0, S = void 0, x = 0 } function Ye() { L.assert(fe > 0, "Cannot modify the lexical environment during initialization."), L.assert(fe < 2, "Cannot modify the lexical environment after transformation has completed."), L.assert(!B, "Lexical environment is already suspended."), B = !0 } function _t() { L.assert(fe > 0, "Cannot modify the lexical environment during initialization."), L.assert(fe < 2, "Cannot modify the lexical environment after transformation has completed."), L.assert(B, "Lexical environment is not suspended."), B = !1 } function ct() { L.assert(fe > 0, "Cannot modify the lexical environment during initialization."), L.assert(fe < 2, "Cannot modify the lexical environment after transformation has completed."), L.assert(!B, "Lexical environment is suspended."); let Gt; if (m || v || S) { if (v && (Gt = [...v]), m) { let $n = r.createVariableStatement(void 0, r.createVariableDeclarationList(m)); Jn($n, 2097152), Gt ? Gt.push($n) : Gt = [$n] } S && (Gt ? Gt = [...Gt, ...S] : Gt = [...S]) } return F--, m = A[F], v = w[F], S = C[F], x = P[F], F === 0 && (A = [], w = [], C = [], P = []), Gt } function Rt(Gt, $n) { x = $n ? x | Gt : x & ~Gt } function We() { return x } function qe() { L.assert(fe > 0, "Cannot start a block scope during initialization."), L.assert(fe < 2, "Cannot start a block scope after transformation has completed."), q[W] = Y, W++, Y = void 0 } function zt() { L.assert(fe > 0, "Cannot end a block scope during initialization."), L.assert(fe < 2, "Cannot end a block scope after transformation has completed."); let Gt = vt(Y) ? [r.createVariableStatement(void 0, r.createVariableDeclarationList(Y.map($n => r.createVariableDeclaration($n)), 1))] : void 0; return W--, Y = q[W], W === 0 && (q = []), Gt } function Qt(Gt) { L.assert(W > 0, "Cannot add a block scoped variable outside of an iteration body."), (Y || (Y = [])).push(Gt) } function tn(Gt) { if (L.assert(fe > 0, "Cannot modify the transformation context during initialization."), L.assert(fe < 2, "Cannot modify the transformation context after transformation has completed."), L.assert(!Gt.scoped, "Cannot request a scoped emit helper."), Gt.dependencies) for (let $n of Gt.dependencies) tn($n); R = Sn(R, Gt) } function kn() { L.assert(fe > 0, "Cannot modify the transformation context during initialization."), L.assert(fe < 2, "Cannot modify the transformation context after transformation has completed."); let Gt = R; return R = void 0, Gt } function _n() { if (fe < 3) { for (let Gt of o) yz(Gn(ea(Gt))); m = void 0, A = void 0, v = void 0, w = void 0, ie = void 0, $ = void 0, R = void 0, fe = 3 } } } var HK, Bh, GMe = gt({ "src/compiler/transformer.ts"() { "use strict"; fa(), E0(), HK = { scriptTransformers: Je, declarationTransformers: Je }, Bh = { factory: D, getCompilerOptions: () => ({}), getEmitResolver: Sa, getEmitHost: Sa, getEmitHelperFactory: Sa, startLexicalEnvironment: Ba, resumeLexicalEnvironment: Ba, suspendLexicalEnvironment: Ba, endLexicalEnvironment: Qv, setLexicalEnvironmentFlags: Ba, getLexicalEnvironmentFlags: () => 0, hoistVariableDeclaration: Ba, hoistFunctionDeclaration: Ba, addInitializationStatement: Ba, startBlockScope: Ba, endBlockScope: Qv, addBlockScopedVariable: Ba, requestEmitHelper: Ba, readEmitHelpers: Sa, enableSubstitution: Ba, enableEmitNotification: Ba, isSubstitutionEnabled: Sa, isEmitNotificationEnabled: Sa, onSubstituteNode: zL, onEmitNode: cN, addDiagnostic: Ba } } }); function Ipe(e) { return Gc(e, ".tsbuildinfo") } function WK(e, t, r, i = !1, o, s) { let l = ba(r) ? r : eW(e, r, i), f = e.getCompilerOptions(); if (Ss(f)) { let d = e.getPrependNodes(); if (l.length || d.length) { let g = D.createBundle(l, d), m = t(KL(g, e, i), g); if (m) return m } } else { if (!o) for (let d of l) { let g = t(KL(d, e, i), d); if (g) return g } if (s) { let d = Jg(f); if (d) return t({ buildInfoPath: d }, void 0) } } } function Jg(e) { let t = e.configFilePath; if (!NR(e)) return; if (e.tsBuildInfoFile) return e.tsBuildInfoFile; let r = Ss(e), i; if (r) i = ld(r); else { if (!t) return; let o = ld(t); i = e.outDir ? e.rootDir ? Fy(e.outDir, Xp(e.rootDir, o, !0)) : vi(e.outDir, Hl(o)) : o } return i + ".tsbuildinfo" } function JL(e, t) { let r = Ss(e), i = e.emitDeclarationOnly ? void 0 : r, o = i && Lpe(i, e), s = t || __(e) ? ld(r) + ".d.ts" : void 0, l = s && d4(e) ? s + ".map" : void 0, f = Jg(e); return { jsFilePath: i, sourceMapFilePath: o, declarationFilePath: s, declarationMapPath: l, buildInfoPath: f } } function KL(e, t, r) { let i = t.getCompilerOptions(); if (e.kind === 309) return JL(i, r); { let o = wce(e.fileName, t, zK(e.fileName, i)), s = Mf(e), l = s && cT(e.fileName, o, t.getCurrentDirectory(), !t.useCaseSensitiveFileNames()) === 0, f = i.emitDeclarationOnly || l ? void 0 : o, d = !f || Mf(e) ? void 0 : Lpe(f, i), g = r || __(i) && !s ? Rce(e.fileName, t) : void 0, m = g && d4(i) ? g + ".map" : void 0; return { jsFilePath: f, sourceMapFilePath: d, declarationFilePath: g, declarationMapPath: m, buildInfoPath: void 0 } } } function Lpe(e, t) { return t.sourceMap && !t.inlineSourceMap ? e + ".map" : void 0 } function zK(e, t) { return Gc(e, ".json") ? ".json" : t.jsx === 1 && $c(e, [".jsx", ".tsx"]) ? ".jsx" : $c(e, [".mts", ".mjs"]) ? ".mjs" : $c(e, [".cts", ".cjs"]) ? ".cjs" : ".js" } function kpe(e, t, r, i, o) { return i ? Fy(i, Xp(o ? o() : XL(t, r), e, r)) : e } function qL(e, t, r, i) { return V0(kpe(e, t, r, t.options.declarationDir || t.options.outDir, i), QH(e)) } function Dpe(e, t, r, i) { if (t.options.emitDeclarationOnly) return; let o = Gc(e, ".json"), s = V0(kpe(e, t, r, t.options.outDir, i), zK(e, t.options)); return !o || cT(e, s, L.checkDefined(t.options.configFilePath), r) !== 0 ? s : void 0 } function wpe() { let e; return { addOutput: t, getOutputs: r }; function t(i) { i && (e || (e = [])).push(i) } function r() { return e || Je } } function Rpe(e, t) { let { jsFilePath: r, sourceMapFilePath: i, declarationFilePath: o, declarationMapPath: s, buildInfoPath: l } = JL(e.options, !1); t(r), t(i), t(o), t(s), t(l) } function Ope(e, t, r, i, o) { if (Fu(t)) return; let s = Dpe(t, e, r, o); if (i(s), !Gc(t, ".json") && (s && e.options.sourceMap && i(`${s}.map`), __(e.options))) { let l = qL(t, e, r, o); i(l), e.options.declarationMap && i(`${l}.map`) } } function uN(e, t, r, i, o) { let s; return e.rootDir ? (s = _a(e.rootDir, r), o?.(e.rootDir)) : e.composite && e.configFilePath ? (s = ni(Al(e.configFilePath)), o?.(s)) : s = jpe(t(), r, i), s && s[s.length - 1] !== _s && (s += _s), s } function XL({ options: e, fileNames: t }, r) { return uN(e, () => Pr(t, i => !(e.noEmitForJsFiles && $c(i, dL)) && !Fu(i)), ni(Al(L.checkDefined(e.configFilePath))), Dl(!r)) } function AF(e, t) { let { addOutput: r, getOutputs: i } = wpe(); if (Ss(e.options)) Rpe(e, r); else { let o = zu(() => XL(e, t)); for (let s of e.fileNames) Ope(e, s, t, r, o); r(Jg(e.options)) } return i() } function BMe(e, t, r) { t = So(t), L.assert(ya(e.fileNames, t), "Expected fileName to be present in command line"); let { addOutput: i, getOutputs: o } = wpe(); return Ss(e.options) ? Rpe(e, i) : Ope(e, t, r, i), o() } function JK(e, t) { if (Ss(e.options)) { let { jsFilePath: o, declarationFilePath: s } = JL(e.options, !1); return L.checkDefined(o || s, `project ${e.options.configFilePath} expected to have at least one output`) } let r = zu(() => XL(e, t)); for (let o of e.fileNames) { if (Fu(o)) continue; let s = Dpe(o, e, t, r); if (s) return s; if (!Gc(o, ".json") && __(e.options)) return qL(o, e, t, r) } let i = Jg(e.options); return i || L.fail(`project ${e.options.configFilePath} expected to have at least one output`) } function CF(e, t, r, { scriptTransformers: i, declarationTransformers: o }, s, l, f) { var d = t.getCompilerOptions(), g = d.sourceMap || d.inlineSourceMap || d4(d) ? [] : void 0, m = d.listEmittedFiles ? [] : void 0, v = XA(), S = db(d), x = SR(S), { enter: A, exit: w } = x8("printTime", "beforePrint", "afterPrint"), C, P = !1; return A(), WK(t, F, eW(t, r, f), f, l, !r), w(), { emitSkipped: P, diagnostics: v.getDiagnostics(), emittedFiles: m, sourceMaps: g }; function F({ jsFilePath: U, sourceMapFilePath: re, declarationFilePath: le, declarationMapPath: _e, buildInfoPath: ge }, X) { var Ve, we, ke, Pe, Ce, Ie; let Be; ge && X && Bz(X) && (Be = ni(_a(ge, t.getCurrentDirectory())), C = { commonSourceDirectory: Ne(t.getCommonSourceDirectory()), sourceFiles: X.sourceFiles.map(Le => Ne(_a(Le.fileName, t.getCurrentDirectory()))) }), (Ve = ai) == null || Ve.push(ai.Phase.Emit, "emitJsFileOrBundle", { jsFilePath: U }), q(X, U, re, Ne), (we = ai) == null || we.pop(), (ke = ai) == null || ke.push(ai.Phase.Emit, "emitDeclarationFileOrBundle", { declarationFilePath: le }), W(X, le, _e, Ne), (Pe = ai) == null || Pe.pop(), (Ce = ai) == null || Ce.push(ai.Phase.Emit, "emitBuildInfo", { buildInfoPath: ge }), B(C, ge), (Ie = ai) == null || Ie.pop(), !P && m && (s || (U && m.push(U), re && m.push(re), ge && m.push(ge)), s !== 0 && (le && m.push(le), _e && m.push(_e))); function Ne(Le) { return S0(Xp(Be, Le, t.getCanonicalFileName)) } } function B(U, re) { if (!re || r || P) return; if (t.isEmitBlocked(re)) { P = !0; return } let le = t.getBuildInfo(U) || dN(void 0, U); BI(t, v, re, Npe(le), !1, void 0, { buildInfo: le }) } function q(U, re, le, _e) { if (!U || s || !re) return; if (t.isEmitBlocked(re) || d.noEmit) { P = !0; return } let ge = lN(e, t, D, d, [U], i, !1), X = { removeComments: d.removeComments, newLine: d.newLine, noEmitHelpers: d.noEmitHelpers, module: d.module, target: d.target, sourceMap: d.sourceMap, inlineSourceMap: d.inlineSourceMap, inlineSources: d.inlineSources, extendedDiagnostics: d.extendedDiagnostics, writeBundleFileInfo: !!C, relativeToBuildInfo: _e }, Ve = nE(X, { hasGlobalName: e.hasGlobalName, onEmitNode: ge.emitNodeWithNotification, isEmitNotificationEnabled: ge.isEmitNotificationEnabled, substituteNode: ge.substituteNode }); L.assert(ge.transformed.length === 1, "Should only see one output from the transform"), R(re, le, ge, Ve, d), ge.dispose(), C && (C.js = Ve.bundleFileInfo) } function W(U, re, le, _e) { if (!U || s === 0) return; if (!re) { (s || d.emitDeclarationOnly) && (P = !0); return } let ge = Li(U) ? [U] : U.sourceFiles, X = f ? ge : Pr(ge, LH), Ve = Ss(d) ? [D.createBundle(X, Li(U) ? void 0 : U.prepends)] : X; s && !__(d) && X.forEach(Y); let we = lN(e, t, D, d, Ve, o, !1); if (Fn(we.diagnostics)) for (let Ie of we.diagnostics) v.add(Ie); let ke = { removeComments: d.removeComments, newLine: d.newLine, noEmitHelpers: !0, module: d.module, target: d.target, sourceMap: !f && d.declarationMap, inlineSourceMap: d.inlineSourceMap, extendedDiagnostics: d.extendedDiagnostics, onlyPrintJsDocStyle: !0, writeBundleFileInfo: !!C, recordInternalSection: !!C, relativeToBuildInfo: _e }, Pe = nE(ke, { hasGlobalName: e.hasGlobalName, onEmitNode: we.emitNodeWithNotification, isEmitNotificationEnabled: we.isEmitNotificationEnabled, substituteNode: we.substituteNode }), Ce = !!we.diagnostics && !!we.diagnostics.length || !!t.isEmitBlocked(re) || !!d.noEmit; P = P || Ce, (!Ce || f) && (L.assert(we.transformed.length === 1, "Should only see one output from the decl transform"), R(re, le, we, Pe, { sourceMap: ke.sourceMap, sourceRoot: d.sourceRoot, mapRoot: d.mapRoot, extendedDiagnostics: d.extendedDiagnostics })), we.dispose(), C && (C.dts = Pe.bundleFileInfo) } function Y(U) { if (pc(U)) { U.expression.kind === 79 && e.collectLinkedAliases(U.expression, !0); return } else if (Mu(U)) { e.collectLinkedAliases(U.propertyName || U.name, !0); return } pa(U, Y) } function R(U, re, le, _e, ge) { let X = le.transformed[0], Ve = X.kind === 309 ? X : void 0, we = X.kind === 308 ? X : void 0, ke = Ve ? Ve.sourceFiles : [we], Pe; ie(ge, X) && (Pe = M_e(t, Hl(Al(U)), $(ge), fe(ge, U, we), ge)), Ve ? _e.writeBundle(Ve, x, Pe) : _e.writeFile(we, x, Pe); let Ce; if (Pe) { g && g.push({ inputSourceFileNames: Pe.getSources(), sourceMap: Pe.toJSON() }); let Be = Z(ge, Pe, U, re, we); if (Be && (x.isAtStartOfLine() || x.rawWrite(S), Ce = x.getTextPos(), x.writeComment(`//# sourceMappingURL=${Be}`)), re) { let Ne = Pe.toString(); BI(t, v, re, Ne, !1, ke), _e.bundleFileInfo && (_e.bundleFileInfo.mapHash = YT(Ne, t)) } } else x.writeLine(); let Ie = x.getText(); BI(t, v, U, Ie, !!d.emitBOM, ke, { sourceMapUrlPos: Ce, diagnostics: le.diagnostics }), _e.bundleFileInfo && (_e.bundleFileInfo.hash = YT(Ie, t)), x.clear() } function ie(U, re) { return (U.sourceMap || U.inlineSourceMap) && (re.kind !== 308 || !Gc(re.fileName, ".json")) } function $(U) { let re = Al(U.sourceRoot || ""); return re && cu(re) } function fe(U, re, le) { if (U.sourceRoot) return t.getCommonSourceDirectory(); if (U.mapRoot) { let _e = Al(U.mapRoot); return le && (_e = ni(e4(le.fileName, t, _e))), _p(_e) === 0 && (_e = vi(t.getCommonSourceDirectory(), _e)), _e } return ni(So(re)) } function Z(U, re, le, _e, ge) { if (U.inlineSourceMap) { let Ve = re.toString(); return `data:application/json;base64,${tle(xl, Ve)}` } let X = Hl(Al(L.checkDefined(_e))); if (U.mapRoot) { let Ve = Al(U.mapRoot); return ge && (Ve = ni(e4(ge.fileName, t, Ve))), _p(Ve) === 0 ? (Ve = vi(t.getCommonSourceDirectory(), Ve), encodeURI(Q1(ni(So(le)), vi(Ve, X), t.getCurrentDirectory(), t.getCanonicalFileName, !0))) : encodeURI(vi(Ve, X)) } return encodeURI(X) } } function dN(e, t) { return { bundle: t, program: e, version: Rf } } function Npe(e) { return JSON.stringify(e) } function IF(e, t) { return fW(e, t) } function UMe(e, t, r) { var i; let o = L.checkDefined(e.js), s = ((i = o.sources) == null ? void 0 : i.prologues) && p0(o.sources.prologues, l => l.file); return e.sourceFiles.map((l, f) => { var d, g; let m = s?.get(f), v = m?.directives.map(A => { let w = it(D.createStringLiteral(A.expression.text), A.expression), C = it(D.createExpressionStatement(w), A); return go(w, C), C }), S = D.createToken(1), x = D.createSourceFile(v ?? [], S, 0); return x.fileName = Xp(r.getCurrentDirectory(), _a(l, t), !r.useCaseSensitiveFileNames()), x.text = (d = m?.text) != null ? d : "", oL(x, 0, (g = m?.text.length) != null ? g : 0), i2(x.statements, x), oL(S, x.end, 0), go(S, x), x }) } function Ppe(e, t, r, i) { var o, s; (o = ai) == null || o.push(ai.Phase.Emit, "emitUsingBuildInfo", {}, !0), ZD.mark("beforeEmit"); let l = VMe(e, t, r, i); return ZD.mark("afterEmit"), ZD.measure("Emit", "beforeEmit", "afterEmit"), (s = ai) == null || s.pop(), l } function VMe(e, t, r, i) { let { buildInfoPath: o, jsFilePath: s, sourceMapFilePath: l, declarationFilePath: f, declarationMapPath: d } = JL(e.options, !1), g = t.getBuildInfo(o, e.options.configFilePath); if (!g || !g.bundle || !g.bundle.js || f && !g.bundle.dts) return o; let m = t.readFile(L.checkDefined(s)); if (!m || YT(m, t) !== g.bundle.js.hash) return s; let v = l && t.readFile(l); if (l && !v || e.options.inlineSourceMap) return l || "inline sourcemap decoding"; if (l && YT(v, t) !== g.bundle.js.mapHash) return l; let S = f && t.readFile(f); if (f && !S || f && YT(S, t) !== g.bundle.dts.hash) return f; let x = d && t.readFile(d); if (d && !x || e.options.inlineSourceMap) return d || "inline sourcemap decoding"; if (d && YT(x, t) !== g.bundle.dts.mapHash) return d; let A = ni(_a(o, t.getCurrentDirectory())), w = pz(s, m, l, v, f, S, d, x, o, g, !0), C = [], P = fq(e.projectReferences, r, Y => t.readFile(Y), t), F = UMe(g.bundle, A, t), B, q, W = { getPrependNodes: zu(() => [...P, w]), getCanonicalFileName: t.getCanonicalFileName, getCommonSourceDirectory: () => _a(g.bundle.commonSourceDirectory, A), getCompilerOptions: () => e.options, getCurrentDirectory: () => t.getCurrentDirectory(), getSourceFile: Qv, getSourceFileByPath: Qv, getSourceFiles: () => F, getLibFileFromReference: Sa, isSourceFileFromExternalLibrary: m0, getResolvedProjectReferenceToRedirect: Qv, getProjectReferenceRedirect: Qv, isSourceOfProjectReferenceRedirect: m0, writeFile: (Y, R, ie, $, fe, Z) => { switch (Y) { case s: if (m === R) return; break; case l: if (v === R) return; break; case o: break; case f: if (S === R) return; B = R, q = Z; break; case d: if (x === R) return; break; default: L.fail(`Unexpected path: ${Y}`) }C.push({ name: Y, text: R, writeByteOrderMark: ie, data: Z }) }, isEmitBlocked: m0, readFile: Y => t.readFile(Y), fileExists: Y => t.fileExists(Y), useCaseSensitiveFileNames: () => t.useCaseSensitiveFileNames(), getBuildInfo: Y => { let R = g.program; R && B !== void 0 && e.options.composite && (R.outSignature = YT(B, t, q)); let { js: ie, dts: $, sourceFiles: fe } = g.bundle; return Y.js.sources = ie.sources, $ && (Y.dts.sources = $.sources), Y.sourceFiles = fe, dN(R, Y) }, getSourceFileFromReference: Qv, redirectTargetsMap: Nf(), getFileIncludeReasons: Sa, createHash: ho(t, t.createHash) }; return CF(LF, W, void 0, jK(e.options, i)), C } function nE(e = {}, t = {}) { var { hasGlobalName: r, onEmitNode: i = cN, isEmitNotificationEnabled: o, substituteNode: s = zL, onBeforeEmitNode: l, onAfterEmitNode: f, onBeforeEmitNodeArray: d, onAfterEmitNodeArray: g, onBeforeEmitToken: m, onAfterEmitToken: v } = t, S = !!e.extendedDiagnostics, x = db(e), A = Rl(e), w = new Map, C, P, F, B, q, W, Y, R, ie, $, fe, Z, U, re, le, _e = e.preserveSourceNewlines, ge, X, Ve, we = uC, ke, Pe = e.writeBundleFileInfo ? { sections: [] } : void 0, Ce = Pe ? L.checkDefined(e.relativeToBuildInfo) : void 0, Ie = e.recordInternalSection, Be = 0, Ne = "text", Le = !0, Ye, _t, ct = -1, Rt, We = -1, qe = -1, zt = -1, Qt = -1, tn, kn, _n = !1, Gt = !!e.removeComments, $n, ui, { enter: Ni, exit: Pi } = Zae(S, "commentTime", "beforeComment", "afterComment"), gr = D.parenthesizer, pt = { select: E => E === 0 ? gr.parenthesizeLeadingTypeArgument : void 0 }, nn = Dc(); return Oe(), { printNode: Dt, printList: pn, printFile: Kn, printBundle: An, writeNode: ri, writeList: vn, writeFile: ve, writeBundle: at, bundleFileInfo: Pe }; function Dt(E, ne, Ee) { switch (E) { case 0: L.assert(Li(ne), "Expected a SourceFile node."); break; case 2: L.assert(Re(ne), "Expected an Identifier node."); break; case 1: L.assert(ot(ne), "Expected an Expression node."); break }switch (ne.kind) { case 308: return Kn(ne); case 309: return An(ne); case 310: return hi(ne) }return ri(E, ne, Ee, nt()), ce() } function pn(E, ne, Ee) { return vn(E, ne, Ee, nt()), ce() } function An(E) { return at(E, nt(), void 0), ce() } function Kn(E) { return ve(E, nt(), void 0), ce() } function hi(E) { return Tt(E, nt()), ce() } function ri(E, ne, Ee, Wt) { let lr = X; G(Wt, void 0), Q(E, ne, Ee), Oe(), X = lr } function vn(E, ne, Ee, Wt) { let lr = X; G(Wt, void 0), Ee && ue(Ee), cs(void 0, ne, E), Oe(), X = lr } function Ht() { return X.getTextPosWithWriteLine ? X.getTextPosWithWriteLine() : X.getTextPos() } function En(E, ne, Ee) { let Wt = Os(Pe.sections); Wt && Wt.kind === Ee ? Wt.end = ne : Pe.sections.push({ pos: E, end: ne, kind: Ee }) } function dr(E) { if (Ie && Pe && C && (Kl(E) || Bc(E)) && BK(E, C) && Ne !== "internal") { let ne = Ne; return Se(X.getTextPos()), Be = Ht(), Ne = "internal", ne } } function Cr(E) { E && (Se(X.getTextPos()), Be = Ht(), Ne = E) } function Se(E) { return Be < E ? (En(Be, E, Ne), !0) : !1 } function at(E, ne, Ee) { ke = !1; let Wt = X; G(ne, Ee), Bb(E), T1(E), Vt(E), v1(E); for (let lr of E.prepends) { nl(); let ci = X.getTextPos(), qr = Pe && Pe.sections; if (qr && (Pe.sections = []), Q(4, lr, void 0), Pe) { let Ti = Pe.sections; Pe.sections = qr, lr.oldFileOfCurrentEmit ? Pe.sections.push(...Ti) : (Ti.forEach(Wa => L.assert(dle(Wa))), Pe.sections.push({ pos: ci, end: X.getTextPos(), kind: "prepend", data: Ce(lr.fileName), texts: Ti })) } } Be = Ht(); for (let lr of E.sourceFiles) Q(0, lr, lr); if (Pe && E.sourceFiles.length) { let lr = X.getTextPos(); if (Se(lr)) { let ci = xx(E); ci && (Pe.sources || (Pe.sources = {}), Pe.sources.prologues = ci); let qr = Qe(E); qr && (Pe.sources || (Pe.sources = {}), Pe.sources.helpers = qr) } } Oe(), X = Wt } function Tt(E, ne) { let Ee = X; G(ne, void 0), Q(4, E, void 0), Oe(), X = Ee } function ve(E, ne, Ee) { ke = !0; let Wt = X; G(ne, Ee), Bb(E), T1(E), Q(0, E, E), Oe(), X = Wt } function nt() { return Ve || (Ve = SR(x)) } function ce() { let E = Ve.getText(); return Ve.clear(), E } function Q(E, ne, Ee) { Ee && ue(Ee), rt(E, ne, void 0) } function ue(E) { C = E, tn = void 0, kn = void 0, E && sg(E) } function G(E, ne) { E && e.omitTrailingSemicolon && (E = XH(E)), X = E, Ye = ne, Le = !X || !Ye } function Oe() { P = [], F = [], B = [], q = new Set, W = [], Y = new Map, R = [], ie = 0, $ = [], fe = 0, Z = [], U = void 0, re = [], le = void 0, C = void 0, tn = void 0, kn = void 0, G(void 0, void 0) } function je() { return tn || (tn = Sh(L.checkDefined(C))) } function Ge(E, ne) { if (E === void 0) return; let Ee = dr(E); rt(4, E, ne), Cr(Ee) } function kt(E) { E !== void 0 && rt(2, E, void 0) } function Kt(E, ne) { E !== void 0 && rt(1, E, ne) } function ln(E) { rt(yo(E) ? 6 : 4, E) } function ir(E) { _e && o_(E) & 4 && (_e = !1) } function ae(E) { _e = E } function rt(E, ne, Ee) { ui = Ee, oe(0, E, ne)(E, ne), ui = void 0 } function Ot(E) { return !Gt && !Li(E) } function Ke(E) { return !Le && !Li(E) && !B6(E) && !BT(E) && !Wue(E) } function oe(E, ne, Ee) { switch (E) { case 0: if (i !== cN && (!o || o(Ee))) return z; case 1: if (s !== zL && ($n = s(ne, Ee) || Ee) !== Ee) return ui && ($n = ui($n)), lt; case 2: if (Ot(Ee)) return vd; case 3: if (Ke(Ee)) return OE; case 4: return Te; default: return L.assertNever(E) } } function pe(E, ne, Ee) { return oe(E + 1, ne, Ee) } function z(E, ne) { let Ee = pe(0, E, ne); i(E, ne, Ee) } function Te(E, ne) { if (l?.(ne), _e) { let Ee = _e; ir(ne), j(E, ne), ae(Ee) } else j(E, ne); f?.(ne), ui = void 0 } function j(E, ne, Ee = !0) { if (Ee) { let Wt = bz(ne); if (Wt) return Fa(E, ne, Wt) } if (E === 0) return Fb(Ga(ne, Li)); if (E === 2) return Nr(Ga(ne, Re)); if (E === 6) return ei(Ga(ne, yo), !0); if (E === 3) return yt(Ga(ne, _c)); if (E === 5) return L.assertNode(ne, Pz), oa(!0); if (E === 4) { switch (ne.kind) { case 15: case 16: case 17: return ei(ne, !1); case 79: return Nr(ne); case 80: return Fo(ne); case 163: return Qr(ne); case 164: return gn(ne); case 165: return Ki(ne); case 166: return kc(ne); case 167: return Ps(ne); case 168: return mc(ne); case 169: return xc(ne); case 170: return hc(ne); case 171: return ro(ne); case 172: return aa(ne); case 173: return Co(ne); case 174: case 175: return gc(ne); case 176: return Ll(ne); case 177: return md(ne); case 178: return Pc(ne); case 179: return qs(ne); case 180: return Rs(ne); case 181: return As(ne); case 182: return se(ne); case 183: return ht(ne); case 184: return wt(ne); case 185: return K(ne); case 186: return ft(ne); case 187: return pr(ne); case 189: return yr(ne); case 190: return ta(ne); case 191: return Go(ne); case 192: return Ka(ne); case 193: return vo(ne); case 230: return Jf(ne); case 194: return ka(); case 195: return Hs(ne); case 196: return Uc(ne); case 197: return Gu(ne); case 198: return $o(ne); case 199: return Yt(ne); case 200: return jo(ne); case 201: return bl(ne); case 202: return Ws(ne); case 203: return hd(ne); case 204: return vc(ne); case 205: return nf(ne); case 236: return He(ne); case 237: return ss(); case 238: return Nt(ne); case 240: return la(ne); case 239: return oa(!1); case 241: return be(ne); case 242: return De(ne); case 243: return St(ne); case 244: return Zt(ne); case 245: return rn(ne); case 246: return sn(ne); case 247: return Dn(ne); case 248: return ki(ne); case 249: return Vn(ne); case 250: return mm(ne); case 251: return Hh(ne); case 252: return T_(ne); case 253: return Cb(ne); case 254: return mv(ne); case 255: return gx(ne); case 256: return _1(ne); case 257: return yx(ne); case 258: return Wh(ne); case 259: return S_(ne); case 260: return p1(ne); case 261: return dE(ne); case 262: return fE(ne); case 263: return yv(ne); case 264: return vx(ne); case 265: return _E(ne); case 266: return pE(ne); case 267: return x_(ne); case 268: return vv(ne); case 269: return bv(ne); case 270: return m1(ne); case 271: return Jh(ne); case 277: return Zu(ne); case 272: return Lo(ne); case 273: return mE(ne); case 274: return sC(ne); case 275: return Zg(ne); case 276: return ed(ne); case 278: return td(ne); case 296: return Kh(ne); case 297: return hm(ne); case 279: return; case 280: return bx(ne); case 11: return Ob(ne); case 283: case 286: return h1(ne); case 284: case 287: return cC(ne); case 288: return Ev(ne); case 289: return Ex(ne); case 290: return hE(ne); case 291: return Tv(ne); case 292: return Sv(ne); case 293: return Xh(ne); case 294: return wo(ne); case 295: return A_(ne); case 299: return gE(ne); case 300: return Kc(ne); case 301: return th(ne); case 302: return Pb(ne); case 303: return Si(ne); case 310: case 304: return Kr(ne); case 305: case 306: return Ja(ne); case 307: return Za(ne); case 308: return Fb(ne); case 309: return L.fail("Bundles should be printed using printBundle"); case 311: return L.fail("InputFiles should not be printed"); case 312: return zs(ne); case 313: return Yh(ne); case 315: return Qn("*"); case 316: return Qn("?"); case 317: return yc(ne); case 318: return Ql(ne); case 319: return yu(ne); case 320: return jt(ne); case 188: case 321: return Xe(ne); case 322: return; case 323: return C_(ne); case 325: return yd(ne); case 326: return yE(ne); case 330: case 335: case 340: return gm(ne); case 331: case 332: return ll(ne); case 333: case 334: return; case 336: case 337: case 338: case 339: return; case 341: return Ai(ne); case 342: return Rr(ne); case 344: case 351: return $h(ne); case 343: case 345: case 346: case 347: case 352: case 353: return Mb(ne); case 348: return y1(ne); case 349: return lC(ne); case 350: return Ml(ne); case 355: case 359: case 358: return }if (ot(ne) && (E = 1, s !== zL)) { let Wt = s(E, ne) || ne; Wt !== ne && (ne = Wt, ui && (ne = ui(ne))) } } if (E === 1) switch (ne.kind) { case 8: case 9: return jr(ne); case 10: case 13: case 14: return ei(ne, !1); case 79: return Nr(ne); case 80: return Fo(ne); case 206: return ye(ne); case 207: return Et(ne); case 208: return bn(ne); case 209: return io(ne); case 210: return ee(ne); case 211: return Ze(ne); case 212: return At(ne); case 213: return xt(ne); case 214: return qt(ne); case 215: return Ln(ne); case 216: return mr(ne); case 217: return gi(ne); case 218: return Ea(ne); case 219: return bo(ne); case 220: return Qo(ne); case 221: return Cs(ne); case 222: return Pd(ne); case 223: return nn(ne); case 224: return gd(ne); case 225: return Zl(ne); case 226: return Md(ne); case 227: return zf(ne); case 228: return Io(ne); case 229: return; case 231: return Fd(ne); case 232: return E_(ne); case 230: return Jf(ne); case 235: return Y_(ne); case 233: return M(ne); case 234: return L.fail("SyntheticExpression should never be printed."); case 279: return; case 281: return wb(ne); case 282: return qh(ne); case 285: return Rb(ne); case 354: return L.fail("SyntaxList should not be printed"); case 355: return; case 356: return Tx(ne); case 357: return Sx(ne); case 358: case 359: return; case 360: return L.fail("SyntheticReferenceExpression should not be printed") }if (Xu(ne.kind)) return EE(ne, zi); if (Nj(ne.kind)) return EE(ne, Qn); L.fail(`Unhandled SyntaxKind: ${L.formatSyntaxKind(ne.kind)}.`) } function yt(E) { Ge(E.name), Wn(), zi("in"), Wn(), Ge(E.constraint) } function lt(E, ne) { let Ee = pe(1, E, ne); L.assertIsDefined($n), ne = $n, $n = void 0, Ee(E, ne) } function Qe(E) { let ne; if (A === 0 || e.noEmitHelpers) return; let Ee = new Map; for (let Wt of E.sourceFiles) { let lr = SO(Wt) !== void 0, ci = Hn(Wt); if (ci) for (let qr of ci) !qr.scoped && !lr && !Ee.get(qr.name) && (Ee.set(qr.name, !0), (ne || (ne = [])).push(qr.name)) } return ne } function Vt(E) { let ne = !1, Ee = E.kind === 309 ? E : void 0; if (Ee && A === 0) return; let Wt = Ee ? Ee.prepends.length : 0, lr = Ee ? Ee.sourceFiles.length + Wt : 1; for (let ci = 0; ci < lr; ci++) { let qr = Ee ? ci < Wt ? Ee.prepends[ci] : Ee.sourceFiles[ci - Wt] : E, Ti = Li(qr) ? qr : BT(qr) ? void 0 : C, Wa = e.noEmitHelpers || !!Ti && ide(Ti), kl = (Li(qr) || BT(qr)) && !ke, Ed = BT(qr) ? qr.helpers : Hn(qr); if (Ed) for (let Ud of Ed) { if (Ud.scoped) { if (Ee) continue } else { if (Wa) continue; if (kl) { if (w.get(Ud.name)) continue; w.set(Ud.name, !0) } } let fy = Ht(); typeof Ud.text == "string" ? Ac(Ud.text) : Ac(Ud.text(of)), Pe && Pe.sections.push({ pos: fy, end: X.getTextPos(), kind: "emitHelpers", data: Ud.name }), ne = !0 } } return ne } function Hn(E) { let ne = O4(E); return ne && Ag(ne, Sue) } function jr(E) { ei(E, !1) } function ei(E, ne) { let Ee = uc(E, e.neverAsciiEscape, ne); (e.sourceMap || e.inlineSourceMap) && (E.kind === 10 || Hy(E.kind)) ? jb(Ee) : Ix(Ee) } function Kr(E) { for (let ne of E.texts) nl(), Ge(ne) } function Si(E) { X.rawWrite(E.parent.text.substring(E.pos, E.end)) } function Ja(E) { let ne = Ht(); Si(E), Pe && En(ne, X.getTextPos(), E.kind === 305 ? "text" : "internal") } function Za(E) { let ne = Ht(); if (Si(E), Pe) { let Ee = VU(E.section); Ee.pos = ne, Ee.end = X.getTextPos(), Pe.sections.push(Ee) } } function Fa(E, ne, Ee) { switch (Ee.kind) { case 1: Hi(E, ne, Ee); break; case 0: xi(E, ne, Ee); break } } function Hi(E, ne, Ee) { ry(`\${${Ee.order}:`), j(E, ne, !1), ry("}") } function xi(E, ne, Ee) { L.assert(ne.kind === 239, `A tab stop cannot be attached to a node of kind ${L.formatSyntaxKind(ne.kind)}.`), L.assert(E !== 5, "A tab stop cannot be attached to an embedded statement."), ry(`$${Ee.order}`) } function Nr(E) { (E.symbol ? Lx : we)(oy(E, !1), E.symbol), cs(E, NT(E), 53776) } function Fo(E) { we(oy(E, !1)) } function Qr(E) { Wi(E.left), Qn("."), Ge(E.right) } function Wi(E) { E.kind === 79 ? Kt(E) : Ge(E) } function gn(E) { let ne = ie, Ee = le; Gl(), Qn("["), Kt(E.expression, gr.parenthesizeExpressionOfComputedPropertyName), Qn("]"), Iv(ne, Ee) } function Ki(E) { Qh(E, E.modifiers), Ge(E.name), E.constraint && (Wn(), zi("extends"), Wn(), Ge(E.constraint)), E.default && (Wn(), af("="), Wn(), Ge(E.default)) } function kc(E) { rf(E, E.modifiers, !0), Ge(E.dotDotDotToken), S1(E.name, Av), Ge(E.questionToken), E.parent && E.parent.kind === 320 && !E.name ? Ge(E.type) : Q_(E.type), I_(E.initializer, E.type ? E.type.end : E.questionToken ? E.questionToken.end : E.name ? E.name.end : E.modifiers ? E.modifiers.end : E.pos, E, gr.parenthesizeExpressionForDisallowedComma) } function Ps(E) { Qn("@"), Kt(E.expression, gr.parenthesizeLeftSideOfAccess) } function mc(E) { Qh(E, E.modifiers), S1(E.name, kx), Ge(E.questionToken), Q_(E.type), lc() } function xc(E) { rf(E, E.modifiers, !0), Ge(E.name), Ge(E.questionToken), Ge(E.exclamationToken), Q_(E.type), I_(E.initializer, E.type ? E.type.end : E.questionToken ? E.questionToken.end : E.name.end, E), lc() } function hc(E) { ng(E), Qh(E, E.modifiers), Ge(E.name), Ge(E.questionToken), Dp(E, E.typeParameters), eg(E, E.parameters), Q_(E.type), lc(), ih(E) } function ro(E) { rf(E, E.modifiers, !0), Ge(E.asteriskToken), Ge(E.name), Ge(E.questionToken), eh(E, $_) } function aa(E) { zi("static"), lE(E.body) } function Co(E) { rf(E, E.modifiers, !1), zi("constructor"), eh(E, $_) } function gc(E) { let ne = rf(E, E.modifiers, !0), Ee = E.kind === 174 ? 137 : 151; $t(Ee, ne, zi, E), Wn(), Ge(E.name), eh(E, $_) } function Ll(E) { ng(E), Dp(E, E.typeParameters), eg(E, E.parameters), Q_(E.type), lc(), ih(E) } function md(E) { ng(E), zi("new"), Wn(), Dp(E, E.typeParameters), eg(E, E.parameters), Q_(E.type), lc(), ih(E) } function Pc(E) { rf(E, E.modifiers, !1), ty(E, E.parameters), Q_(E.type), lc() } function bl(E) { Ge(E.type), Ge(E.literal) } function ss() { lc() } function qs(E) { E.assertsModifier && (Ge(E.assertsModifier), Wn()), Ge(E.parameterName), E.type && (Wn(), zi("is"), Wn(), Ge(E.type)) } function Rs(E) { Ge(E.typeName), kp(E, E.typeArguments) } function As(E) { ng(E), Dp(E, E.typeParameters), A1(E, E.parameters), Wn(), Qn("=>"), Wn(), Ge(E.type), ih(E) } function jt(E) { zi("function"), eg(E, E.parameters), Qn(":"), Ge(E.type) } function yc(E) { Qn("?"), Ge(E.type) } function Ql(E) { Qn("!"), Ge(E.type) } function yu(E) { Ge(E.type), Qn("=") } function se(E) { ng(E), Qh(E, E.modifiers), zi("new"), Wn(), Dp(E, E.typeParameters), eg(E, E.parameters), Wn(), Qn("=>"), Wn(), Ge(E.type), ih(E) } function ht(E) { zi("typeof"), Wn(), Ge(E.exprName), kp(E, E.typeArguments) } function wt(E) { Iv(0, void 0), Qn("{"); let ne = Ya(E) & 1 ? 768 : 32897; cs(E, E.members, ne | 524288), Qn("}"), Gl() } function K(E) { Ge(E.elementType, gr.parenthesizeNonArrayTypeOfPostfixType), Qn("["), Qn("]") } function Xe(E) { Qn("..."), Ge(E.type) } function ft(E) { $t(22, E.pos, Qn, E); let ne = Ya(E) & 1 ? 528 : 657; cs(E, E.elements, ne | 524288, gr.parenthesizeElementTypeOfTupleType), $t(23, E.elements.end, Qn, E) } function Yt(E) { Ge(E.dotDotDotToken), Ge(E.name), Ge(E.questionToken), $t(58, E.name.end, Qn, E), Wn(), Ge(E.type) } function pr(E) { Ge(E.type, gr.parenthesizeTypeOfOptionalType), Qn("?") } function yr(E) { cs(E, E.types, 516, gr.parenthesizeConstituentTypeOfUnionType) } function ta(E) { cs(E, E.types, 520, gr.parenthesizeConstituentTypeOfIntersectionType) } function Go(E) { Ge(E.checkType, gr.parenthesizeCheckTypeOfConditionalType), Wn(), zi("extends"), Wn(), Ge(E.extendsType, gr.parenthesizeExtendsTypeOfConditionalType), Wn(), Qn("?"), Wn(), Ge(E.trueType), Wn(), Qn(":"), Wn(), Ge(E.falseType) } function Ka(E) { zi("infer"), Wn(), Ge(E.typeParameter) } function vo(E) { Qn("("), Ge(E.type), Qn(")") } function ka() { zi("this") } function Hs(E) { L_(E.operator, zi), Wn(); let ne = E.operator === 146 ? gr.parenthesizeOperandOfReadonlyTypeOperator : gr.parenthesizeOperandOfTypeOperator; Ge(E.type, ne) } function Uc(E) { Ge(E.objectType, gr.parenthesizeNonArrayTypeOfPostfixType), Qn("["), Ge(E.indexType), Qn("]") } function Gu(E) { let ne = Ya(E); Qn("{"), ne & 1 ? Wn() : (nl(), Kf()), E.readonlyToken && (Ge(E.readonlyToken), E.readonlyToken.kind !== 146 && zi("readonly"), Wn()), Qn("["), rt(3, E.typeParameter), E.nameType && (Wn(), zi("as"), Wn(), Ge(E.nameType)), Qn("]"), E.questionToken && (Ge(E.questionToken), E.questionToken.kind !== 57 && Qn("?")), Qn(":"), Wn(), Ge(E.type), lc(), ne & 1 ? Wn() : (nl(), Z_()), cs(E, E.members, 2), Qn("}") } function $o(E) { Kt(E.literal) } function jo(E) { Ge(E.head), cs(E, E.templateSpans, 262144) } function Ws(E) { if (E.isTypeOf && (zi("typeof"), Wn()), zi("import"), Qn("("), Ge(E.argument), E.assertions) { Qn(","), Wn(), Qn("{"), Wn(), zi("assert"), Qn(":"), Wn(); let ne = E.assertions.assertClause.elements; cs(E.assertions.assertClause, ne, 526226), Wn(), Qn("}") } Qn(")"), E.qualifier && (Qn("."), Ge(E.qualifier)), kp(E, E.typeArguments) } function hd(E) { Qn("{"), cs(E, E.elements, 525136), Qn("}") } function vc(E) { Qn("["), cs(E, E.elements, 524880), Qn("]") } function nf(E) { Ge(E.dotDotDotToken), E.propertyName && (Ge(E.propertyName), Qn(":"), Wn()), Ge(E.name), I_(E.initializer, E.name.end, E, gr.parenthesizeExpressionForDisallowedComma) } function ye(E) { let ne = E.elements, Ee = E.multiLine ? 65536 : 0; ny(E, ne, 8914 | Ee, gr.parenthesizeExpressionForDisallowedComma) } function Et(E) { Iv(0, void 0), mn(E.properties, xE); let ne = Ya(E) & 131072; ne && Kf(); let Ee = E.multiLine ? 65536 : 0, Wt = C && C.languageVersion >= 1 && !Mf(C) ? 64 : 0; cs(E, E.properties, 526226 | Wt | Ee), ne && Z_(), Gl() } function bn(E) { Kt(E.expression, gr.parenthesizeLeftSideOfAccess); let ne = E.questionDotToken || om(D.createToken(24), E.expression.end, E.name.pos), Ee = ep(E, E.expression, ne), Wt = ep(E, ne, E.name); wc(Ee, !1), ne.kind !== 28 && Ri(E.expression) && !X.hasTrailingComment() && !X.hasTrailingWhitespace() && Qn("."), E.questionDotToken ? Ge(ne) : $t(ne.kind, E.expression.end, Qn, E), wc(Wt, !1), Ge(E.name), tg(Ee, Wt) } function Ri(E) { if (E = a_(E), Vf(E)) { let ne = uc(E, !0, !1); return !E.numericLiteralFlags && !jl(ne, Xa(24)) } else if (Us(E)) { let ne = mue(E); return typeof ne == "number" && isFinite(ne) && Math.floor(ne) === ne } } function io(E) { Kt(E.expression, gr.parenthesizeLeftSideOfAccess), Ge(E.questionDotToken), $t(22, E.expression.end, Qn, E), Kt(E.argumentExpression), $t(23, E.argumentExpression.end, Qn, E) } function ee(E) { let ne = o_(E) & 16; ne && (Qn("("), jb("0"), Qn(","), Wn()), Kt(E.expression, gr.parenthesizeLeftSideOfAccess), ne && Qn(")"), Ge(E.questionDotToken), kp(E, E.typeArguments), ny(E, E.arguments, 2576, gr.parenthesizeExpressionForDisallowedComma) } function Ze(E) { $t(103, E.pos, zi, E), Wn(), Kt(E.expression, gr.parenthesizeExpressionOfNew), kp(E, E.typeArguments), ny(E, E.arguments, 18960, gr.parenthesizeExpressionForDisallowedComma) } function At(E) { let ne = o_(E) & 16; ne && (Qn("("), jb("0"), Qn(","), Wn()), Kt(E.tag, gr.parenthesizeLeftSideOfAccess), ne && Qn(")"), kp(E, E.typeArguments), Wn(), Kt(E.template) } function xt(E) { Qn("<"), Ge(E.type), Qn(">"), Kt(E.expression, gr.parenthesizeOperandOfPrefixUnary) } function qt(E) { let ne = $t(20, E.pos, Qn, E), Ee = TE(E.expression, E); Kt(E.expression, void 0), Hb(E.expression, E), tg(Ee), $t(21, E.expression ? E.expression.end : ne, Qn, E) } function Ln(E) { oh(E.name), hv(E) } function mr(E) { Qh(E, E.modifiers), eh(E, Vr) } function Vr(E) { Dp(E, E.typeParameters), A1(E, E.parameters), Q_(E.type), Wn(), Ge(E.equalsGreaterThanToken) } function gi(E) { $t(89, E.pos, zi, E), Wn(), Kt(E.expression, gr.parenthesizeOperandOfPrefixUnary) } function Ea(E) { $t(112, E.pos, zi, E), Wn(), Kt(E.expression, gr.parenthesizeOperandOfPrefixUnary) } function bo(E) { $t(114, E.pos, zi, E), Wn(), Kt(E.expression, gr.parenthesizeOperandOfPrefixUnary) } function Qo(E) { $t(133, E.pos, zi, E), Wn(), Kt(E.expression, gr.parenthesizeOperandOfPrefixUnary) } function Cs(E) { L_(E.operator, af), Bu(E) && Wn(), Kt(E.operand, gr.parenthesizeOperandOfPrefixUnary) } function Bu(E) { let ne = E.operand; return ne.kind === 221 && (E.operator === 39 && (ne.operator === 39 || ne.operator === 45) || E.operator === 40 && (ne.operator === 40 || ne.operator === 46)) } function Pd(E) { Kt(E.operand, gr.parenthesizeOperandOfPostfixUnary), L_(E.operator, af) } function Dc() { return C3(E, ne, Ee, Wt, lr, void 0); function E(qr, Ti) { if (Ti) { Ti.stackIndex++, Ti.preserveSourceNewlinesStack[Ti.stackIndex] = _e, Ti.containerPosStack[Ti.stackIndex] = qe, Ti.containerEndStack[Ti.stackIndex] = zt, Ti.declarationListContainerEndStack[Ti.stackIndex] = Qt; let Wa = Ti.shouldEmitCommentsStack[Ti.stackIndex] = Ot(qr), kl = Ti.shouldEmitSourceMapsStack[Ti.stackIndex] = Ke(qr); l?.(qr), Wa && ju(qr), kl && NE(qr), ir(qr) } else Ti = { stackIndex: 0, preserveSourceNewlinesStack: [void 0], containerPosStack: [-1], containerEndStack: [-1], declarationListContainerEndStack: [-1], shouldEmitCommentsStack: [!1], shouldEmitSourceMapsStack: [!1] }; return Ti } function ne(qr, Ti, Wa) { return ci(qr, Wa, "left") } function Ee(qr, Ti, Wa) { let kl = qr.kind !== 27, Ed = ep(Wa, Wa.left, qr), Ud = ep(Wa, qr, Wa.right); wc(Ed, kl), rd(qr.pos), EE(qr, qr.kind === 101 ? zi : af), ag(qr.end, !0), wc(Ud, !0) } function Wt(qr, Ti, Wa) { return ci(qr, Wa, "right") } function lr(qr, Ti) { let Wa = ep(qr, qr.left, qr.operatorToken), kl = ep(qr, qr.operatorToken, qr.right); if (tg(Wa, kl), Ti.stackIndex > 0) { let Ed = Ti.preserveSourceNewlinesStack[Ti.stackIndex], Ud = Ti.containerPosStack[Ti.stackIndex], fy = Ti.containerEndStack[Ti.stackIndex], Td = Ti.declarationListContainerEndStack[Ti.stackIndex], Ov = Ti.shouldEmitCommentsStack[Ti.stackIndex], Nv = Ti.shouldEmitSourceMapsStack[Ti.stackIndex]; ae(Ed), Nv && PE(qr), Ov && I1(qr, Ud, fy, Td), f?.(qr), Ti.stackIndex-- } } function ci(qr, Ti, Wa) { let kl = Wa === "left" ? gr.getParenthesizeLeftSideOfBinaryForOperator(Ti.operatorToken.kind) : gr.getParenthesizeRightSideOfBinaryForOperator(Ti.operatorToken.kind), Ed = oe(0, 1, qr); if (Ed === lt && (L.assertIsDefined($n), qr = kl(Ga($n, ot)), Ed = pe(1, 1, qr), $n = void 0), (Ed === vd || Ed === OE || Ed === Te) && ar(qr)) return qr; ui = kl, Ed(1, qr) } } function gd(E) { let ne = ep(E, E.condition, E.questionToken), Ee = ep(E, E.questionToken, E.whenTrue), Wt = ep(E, E.whenTrue, E.colonToken), lr = ep(E, E.colonToken, E.whenFalse); Kt(E.condition, gr.parenthesizeConditionOfConditionalExpression), wc(ne, !0), Ge(E.questionToken), wc(Ee, !0), Kt(E.whenTrue, gr.parenthesizeBranchOfConditionalExpression), tg(ne, Ee), wc(Wt, !0), Ge(E.colonToken), wc(lr, !0), Kt(E.whenFalse, gr.parenthesizeBranchOfConditionalExpression), tg(Wt, lr) } function Zl(E) { Ge(E.head), cs(E, E.templateSpans, 262144) } function Md(E) { $t(125, E.pos, zi, E), Ge(E.asteriskToken), Lp(E.expression && Is(E.expression), Mc) } function zf(E) { $t(25, E.pos, Qn, E), Kt(E.expression, gr.parenthesizeExpressionForDisallowedComma) } function Io(E) { oh(E.name), uE(E) } function Jf(E) { Kt(E.expression, gr.parenthesizeLeftSideOfAccess), kp(E, E.typeArguments) } function Fd(E) { Kt(E.expression, void 0), E.type && (Wn(), zi("as"), Wn(), Ge(E.type)) } function E_(E) { Kt(E.expression, gr.parenthesizeLeftSideOfAccess), af("!") } function Y_(E) { Kt(E.expression, void 0), E.type && (Wn(), zi("satisfies"), Wn(), Ge(E.type)) } function M(E) { iy(E.keywordToken, E.pos, Qn), Qn("."), Ge(E.name) } function He(E) { Kt(E.expression), Ge(E.literal) } function Nt(E) { Pn(E, !E.multiLine && rh(E)) } function Pn(E, ne) { $t(18, E.pos, Qn, E); let Ee = ne || Ya(E) & 1 ? 768 : 129; cs(E, E.statements, Ee), $t(19, E.statements.end, Qn, E, !!(Ee & 1)) } function la(E) { rf(E, E.modifiers, !1), Ge(E.declarationList), lc() } function oa(E) { E ? Qn(";") : lc() } function be(E) { Kt(E.expression, gr.parenthesizeExpressionOfExpressionStatement), (!C || !Mf(C) || ws(E.expression)) && lc() } function De(E) { let ne = $t(99, E.pos, zi, E); Wn(), $t(20, ne, Qn, E), Kt(E.expression), $t(21, E.expression.end, Qn, E), Uu(E, E.thenStatement), E.elseStatement && (ay(E, E.thenStatement, E.elseStatement), $t(91, E.thenStatement.end, zi, E), E.elseStatement.kind === 242 ? (Wn(), Ge(E.elseStatement)) : Uu(E, E.elseStatement)) } function mt(E, ne) { let Ee = $t(115, ne, zi, E); Wn(), $t(20, Ee, Qn, E), Kt(E.expression), $t(21, E.expression.end, Qn, E) } function St(E) { $t(90, E.pos, zi, E), Uu(E, E.statement), Va(E.statement) && !_e ? Wn() : ay(E, E.statement, E.expression), mt(E, E.statement.end), lc() } function Zt(E) { mt(E, E.pos), Uu(E, E.statement) } function rn(E) { let ne = $t(97, E.pos, zi, E); Wn(); let Ee = $t(20, ne, Qn, E); kr(E.initializer), Ee = $t(26, E.initializer ? E.initializer.end : Ee, Qn, E), Lp(E.condition), Ee = $t(26, E.condition ? E.condition.end : Ee, Qn, E), Lp(E.incrementor), $t(21, E.incrementor ? E.incrementor.end : Ee, Qn, E), Uu(E, E.statement) } function sn(E) { let ne = $t(97, E.pos, zi, E); Wn(), $t(20, ne, Qn, E), kr(E.initializer), Wn(), $t(101, E.initializer.end, zi, E), Wn(), Kt(E.expression), $t(21, E.expression.end, Qn, E), Uu(E, E.statement) } function Dn(E) { let ne = $t(97, E.pos, zi, E); Wn(), x1(E.awaitModifier), $t(20, ne, Qn, E), kr(E.initializer), Wn(), $t(162, E.initializer.end, zi, E), Wn(), Kt(E.expression), $t(21, E.expression.end, Qn, E), Uu(E, E.statement) } function kr(E) { E !== void 0 && (E.kind === 258 ? Ge(E) : Kt(E)) } function ki(E) { $t(86, E.pos, zi, E), Ub(E.label), lc() } function Vn(E) { $t(81, E.pos, zi, E), Ub(E.label), lc() } function $t(E, ne, Ee, Wt, lr) { let ci = ea(Wt), qr = ci && ci.kind === Wt.kind, Ti = ne; if (qr && C && (ne = xo(C.text, ne)), qr && Wt.pos !== Ti) { let Wa = lr && C && !Bf(Ti, ne, C); Wa && Kf(), rd(Ti), Wa && Z_() } if (ne = L_(E, Ee, ne), qr && Wt.end !== ne) { let Wa = Wt.kind === 291; ag(ne, !Wa, Wa) } return ne } function Xn(E) { return E.kind === 2 || !!E.hasTrailingNewLine } function ra(E) { return C ? vt(Nm(C.text, E.pos), Xn) || vt(l2(E), Xn) ? !0 : _3(E) ? E.pos !== E.expression.pos && vt(eb(C.text, E.expression.pos), Xn) ? !0 : ra(E.expression) : !1 : !1 } function Is(E) { if (!Gt && _3(E) && ra(E)) { let ne = ea(E); if (ne && ud(ne)) { let Ee = D.createParenthesizedExpression(E.expression); return Ir(Ee, E), it(Ee, ne), Ee } return D.createParenthesizedExpression(E) } return E } function Mc(E) { return Is(gr.parenthesizeExpressionForDisallowedComma(E)) } function mm(E) { $t(105, E.pos, zi, E), Lp(E.expression && Is(E.expression), Is), lc() } function Hh(E) { let ne = $t(116, E.pos, zi, E); Wn(), $t(20, ne, Qn, E), Kt(E.expression), $t(21, E.expression.end, Qn, E), Uu(E, E.statement) } function T_(E) { let ne = $t(107, E.pos, zi, E); Wn(), $t(20, ne, Qn, E), Kt(E.expression), $t(21, E.expression.end, Qn, E), Wn(), Ge(E.caseBlock) } function Cb(E) { Ge(E.label), $t(58, E.label.end, Qn, E), Wn(), Ge(E.statement) } function mv(E) { $t(109, E.pos, zi, E), Lp(Is(E.expression), Is), lc() } function gx(E) { $t(111, E.pos, zi, E), Wn(), Ge(E.tryBlock), E.catchClause && (ay(E, E.tryBlock, E.catchClause), Ge(E.catchClause)), E.finallyBlock && (ay(E, E.catchClause || E.tryBlock, E.finallyBlock), $t(96, (E.catchClause || E.tryBlock).end, zi, E), Wn(), Ge(E.finallyBlock)) } function _1(E) { iy(87, E.pos, zi), lc() } function yx(E) { var ne, Ee, Wt, lr, ci; Ge(E.name), Ge(E.exclamationToken), Q_(E.type), I_(E.initializer, (ci = (lr = (ne = E.type) == null ? void 0 : ne.end) != null ? lr : (Wt = (Ee = E.name.emitNode) == null ? void 0 : Ee.typeNode) == null ? void 0 : Wt.end) != null ? ci : E.name.end, E, gr.parenthesizeExpressionForDisallowedComma) } function Wh(E) { zi(II(E) ? "let" : kh(E) ? "const" : "var"), Wn(), cs(E, E.declarations, 528) } function S_(E) { hv(E) } function hv(E) { rf(E, E.modifiers, !1), zi("function"), Ge(E.asteriskToken), Wn(), kt(E.name), eh(E, $_) } function eh(E, ne) { let Ee = E.body; if (Ee) if (Va(Ee)) { let Wt = Ya(E) & 131072; Wt && Kf(), ng(E), mn(E.parameters, qc), qc(E.body), ne(E), lE(Ee), ih(E), Wt && Z_() } else ne(E), Wn(), Kt(Ee, gr.parenthesizeConciseBodyOfArrowFunction); else ne(E), lc() } function $_(E) { Dp(E, E.typeParameters), eg(E, E.parameters), Q_(E.type) } function gv(E) { if (Ya(E) & 1) return !0; if (E.multiLine || !ws(E) && C && !DT(E, C) || Fl(E, Sl(E.statements), 2) || bm(E, Os(E.statements), 2, E.statements)) return !1; let ne; for (let Ee of E.statements) { if (qf(ne, Ee, 2) > 0) return !1; ne = Ee } return !0 } function lE(E) { l?.(E), Wn(), Qn("{"), Kf(); let ne = gv(E) ? Ib : zh; ig(E, E.statements, ne), Z_(), iy(19, E.statements.end, Qn, E), f?.(E) } function Ib(E) { zh(E, !0) } function zh(E, ne) { let Ee = xv(E.statements), Wt = X.getTextPos(); Vt(E), Ee === 0 && Wt === X.getTextPos() && ne ? (Z_(), cs(E, E.statements, 768), Kf()) : cs(E, E.statements, 1, void 0, Ee) } function p1(E) { uE(E) } function uE(E) { Iv(0, void 0), mn(E.members, xE), rf(E, E.modifiers, !0), $t(84, yp(E).pos, zi, E), E.name && (Wn(), kt(E.name)); let ne = Ya(E) & 131072; ne && Kf(), Dp(E, E.typeParameters), cs(E, E.heritageClauses, 0), Wn(), Qn("{"), cs(E, E.members, 129), Qn("}"), ne && Z_(), Gl() } function dE(E) { Iv(0, void 0), rf(E, E.modifiers, !1), zi("interface"), Wn(), Ge(E.name), Dp(E, E.typeParameters), cs(E, E.heritageClauses, 512), Wn(), Qn("{"), cs(E, E.members, 129), Qn("}"), Gl() } function fE(E) { rf(E, E.modifiers, !1), zi("type"), Wn(), Ge(E.name), Dp(E, E.typeParameters), Wn(), Qn("="), Wn(), Ge(E.type), lc() } function yv(E) { rf(E, E.modifiers, !1), zi("enum"), Wn(), Ge(E.name), Wn(), Qn("{"), cs(E, E.members, 145), Qn("}") } function vx(E) { rf(E, E.modifiers, !1), ~E.flags & 1024 && (zi(E.flags & 16 ? "namespace" : "module"), Wn()), Ge(E.name); let ne = E.body; if (!ne) return lc(); for (; ne && Tc(ne);)Qn("."), Ge(ne.name), ne = ne.body; Wn(), Ge(ne) } function _E(E) { ng(E), mn(E.statements, qc), Pn(E, rh(E)), ih(E) } function pE(E) { $t(18, E.pos, Qn, E), cs(E, E.clauses, 129), $t(19, E.clauses.end, Qn, E, !0) } function vv(E) { rf(E, E.modifiers, !1), $t(100, E.modifiers ? E.modifiers.end : E.pos, zi, E), Wn(), E.isTypeOnly && ($t(154, E.pos, zi, E), Wn()), Ge(E.name), Wn(), $t(63, E.name.end, Qn, E), Wn(), Lb(E.moduleReference), lc() } function Lb(E) { E.kind === 79 ? Kt(E) : Ge(E) } function bv(E) { rf(E, E.modifiers, !1), $t(100, E.modifiers ? E.modifiers.end : E.pos, zi, E), Wn(), E.importClause && (Ge(E.importClause), Wn(), $t(158, E.importClause.end, zi, E), Wn()), Kt(E.moduleSpecifier), E.assertClause && Ub(E.assertClause), lc() } function m1(E) { E.isTypeOnly && ($t(154, E.pos, zi, E), Wn()), Ge(E.name), E.name && E.namedBindings && ($t(27, E.name.end, Qn, E), Wn()), Ge(E.namedBindings) } function Jh(E) { let ne = $t(41, E.pos, Qn, E); Wn(), $t(128, ne, zi, E), Wn(), Ge(E.name) } function Lo(E) { kb(E) } function mE(E) { Db(E) } function sC(E) { let ne = $t(93, E.pos, zi, E); Wn(), E.isExportEquals ? $t(63, ne, af, E) : $t(88, ne, zi, E), Wn(), Kt(E.expression, E.isExportEquals ? gr.getParenthesizeRightSideOfBinaryForOperator(63) : gr.parenthesizeExpressionOfExportDefault), lc() } function Zg(E) { rf(E, E.modifiers, !1); let ne = $t(93, E.pos, zi, E); if (Wn(), E.isTypeOnly && (ne = $t(154, ne, zi, E), Wn()), E.exportClause ? Ge(E.exportClause) : ne = $t(41, ne, Qn, E), E.moduleSpecifier) { Wn(); let Ee = E.exportClause ? E.exportClause.end : ne; $t(158, Ee, zi, E), Wn(), Kt(E.moduleSpecifier) } E.assertClause && Ub(E.assertClause), lc() } function Kh(E) { $t(130, E.pos, zi, E), Wn(); let ne = E.elements; cs(E, ne, 526226) } function hm(E) { Ge(E.name), Qn(":"), Wn(); let ne = E.value; if (!(Ya(ne) & 1024)) { let Ee = sm(ne); ag(Ee.pos) } Ge(ne) } function x_(E) { let ne = $t(93, E.pos, zi, E); Wn(), ne = $t(128, ne, zi, E), Wn(), ne = $t(143, ne, zi, E), Wn(), Ge(E.name), lc() } function Zu(E) { let ne = $t(41, E.pos, Qn, E); Wn(), $t(128, ne, zi, E), Wn(), Ge(E.name) } function ed(E) { kb(E) } function td(E) { Db(E) } function kb(E) { Qn("{"), cs(E, E.elements, 525136), Qn("}") } function Db(E) { E.isTypeOnly && (zi("type"), Wn()), E.propertyName && (Ge(E.propertyName), Wn(), $t(128, E.propertyName.end, zi, E), Wn()), Ge(E.name) } function bx(E) { zi("require"), Qn("("), Kt(E.expression), Qn(")") } function wb(E) { Ge(E.openingElement), cs(E, E.children, 262144), Ge(E.closingElement) } function qh(E) { Qn("<"), Nb(E.tagName), kp(E, E.typeArguments), Wn(), Ge(E.attributes), Qn("/>") } function Rb(E) { Ge(E.openingFragment), cs(E, E.children, 262144), Ge(E.closingFragment) } function h1(E) { if (Qn("<"), Xm(E)) { let ne = TE(E.tagName, E); Nb(E.tagName), kp(E, E.typeArguments), E.attributes.properties && E.attributes.properties.length > 0 && Wn(), Ge(E.attributes), Hb(E.attributes, E), tg(ne) } Qn(">") } function Ob(E) { X.writeLiteral(E.text) } function cC(E) { Qn("</"), GS(E) && Nb(E.tagName), Qn(">") } function Ex(E) { cs(E, E.properties, 262656) } function Ev(E) { Ge(E.name), Ax("=", Qn, E.initializer, ln) } function hE(E) { Qn("{..."), Kt(E.expression), Qn("}") } function Fe(E) { let ne = !1; return bw(C?.text || "", E + 1, () => ne = !0), ne } function ey(E) { let ne = !1; return vw(C?.text || "", E + 1, () => ne = !0), ne } function Ip(E) { return Fe(E) || ey(E) } function Tv(E) { var ne; if (E.expression || !Gt && !ws(E) && Ip(E.pos)) { let Ee = C && !ws(E) && Gs(C, E.pos).line !== Gs(C, E.end).line; Ee && X.increaseIndent(); let Wt = $t(18, E.pos, Qn, E); Ge(E.dotDotDotToken), Kt(E.expression), $t(19, ((ne = E.expression) == null ? void 0 : ne.end) || Wt, Qn, E), Ee && X.decreaseIndent() } } function Nb(E) { E.kind === 79 ? Kt(E) : Ge(E) } function Sv(E) { $t(82, E.pos, zi, E), Wn(), Kt(E.expression, gr.parenthesizeExpressionForDisallowedComma), g1(E, E.statements, E.expression.end) } function Xh(E) { let ne = $t(88, E.pos, zi, E); g1(E, E.statements, ne) } function g1(E, ne, Ee) { let Wt = ne.length === 1 && (!C || ws(E) || ws(ne[0]) || a4(E, ne[0], C)), lr = 163969; Wt ? (iy(58, Ee, Qn, E), Wn(), lr &= -130) : $t(58, Ee, Qn, E), cs(E, ne, lr) } function wo(E) { Wn(), L_(E.token, zi), Wn(), cs(E, E.types, 528) } function A_(E) { let ne = $t(83, E.pos, zi, E); Wn(), E.variableDeclaration && ($t(20, ne, Qn, E), Ge(E.variableDeclaration), $t(21, E.variableDeclaration.end, Qn, E), Wn()), Ge(E.block) } function gE(E) { Ge(E.name), Qn(":"), Wn(); let ne = E.initializer; if (!(Ya(ne) & 1024)) { let Ee = sm(ne); ag(Ee.pos) } Kt(ne, gr.parenthesizeExpressionForDisallowedComma) } function Kc(E) { Ge(E.name), E.objectAssignmentInitializer && (Wn(), Qn("="), Wn(), Kt(E.objectAssignmentInitializer, gr.parenthesizeExpressionForDisallowedComma)) } function th(E) { E.expression && ($t(25, E.pos, Qn, E), Kt(E.expression, gr.parenthesizeExpressionForDisallowedComma)) } function Pb(E) { Ge(E.name), I_(E.initializer, E.name.end, E, gr.parenthesizeExpressionForDisallowedComma) } function C_(E) { if (we("/**"), E.comment) { let ne = Cw(E.comment); if (ne) { let Ee = ne.split(/\r\n?|\n/g); for (let Wt of Ee) nl(), Wn(), Qn("*"), Wn(), we(Wt) } } E.tags && (E.tags.length === 1 && E.tags[0].kind === 347 && !E.comment ? (Wn(), Ge(E.tags[0])) : cs(E, E.tags, 33)), Wn(), we("*/") } function Mb(E) { nh(E.tagName), zs(E.typeExpression), ym(E.comment) } function Ml(E) { nh(E.tagName), Ge(E.name), ym(E.comment) } function Yh(E) { Wn(), Qn("{"), Ge(E.name), Qn("}") } function ll(E) { nh(E.tagName), Wn(), Qn("{"), Ge(E.class), Qn("}"), ym(E.comment) } function y1(E) { nh(E.tagName), zs(E.constraint), Wn(), cs(E, E.typeParameters, 528), ym(E.comment) } function lC(E) { nh(E.tagName), E.typeExpression && (E.typeExpression.kind === 312 ? zs(E.typeExpression) : (Wn(), Qn("{"), we("Object"), E.typeExpression.isArrayType && (Qn("["), Qn("]")), Qn("}"))), E.fullName && (Wn(), Ge(E.fullName)), ym(E.comment), E.typeExpression && E.typeExpression.kind === 325 && yd(E.typeExpression) } function Ai(E) { nh(E.tagName), E.name && (Wn(), Ge(E.name)), ym(E.comment), yE(E.typeExpression) } function Rr(E) { ym(E.comment), yE(E.typeExpression) } function gm(E) { nh(E.tagName), ym(E.comment) } function yd(E) { cs(E, D.createNodeArray(E.jsDocPropertyTags), 33) } function yE(E) { E.typeParameters && cs(E, D.createNodeArray(E.typeParameters), 33), E.parameters && cs(E, D.createNodeArray(E.parameters), 33), E.type && (nl(), Wn(), Qn("*"), Wn(), Ge(E.type)) } function $h(E) { nh(E.tagName), zs(E.typeExpression), Wn(), E.isBracketed && Qn("["), Ge(E.name), E.isBracketed && Qn("]"), ym(E.comment) } function nh(E) { Qn("@"), Ge(E) } function ym(E) { let ne = Cw(E); ne && (Wn(), we(ne)) } function zs(E) { E && (Wn(), Qn("{"), Ge(E.type), Qn("}")) } function Fb(E) { nl(); let ne = E.statements; if (ne.length === 0 || !B_(ne[0]) || ws(ne[0])) { ig(E, ne, Cf); return } Cf(E) } function v1(E) { b1(!!E.hasNoDefaultLib, E.syntheticFileReferences || [], E.syntheticTypeReferences || [], E.syntheticLibReferences || []); for (let ne of E.prepends) if (BT(ne) && ne.syntheticReferences) for (let Ee of ne.syntheticReferences) Ge(Ee), nl() } function Gb(E) { E.isDeclarationFile && b1(E.hasNoDefaultLib, E.referencedFiles, E.typeReferenceDirectives, E.libReferenceDirectives) } function b1(E, ne, Ee, Wt) { if (E) { let lr = X.getTextPos(); vm('/// <reference no-default-lib="true"/>'), Pe && Pe.sections.push({ pos: lr, end: X.getTextPos(), kind: "no-default-lib" }), nl() } if (C && C.moduleName && (vm(`/// <amd-module name="${C.moduleName}" />`), nl()), C && C.amdDependencies) for (let lr of C.amdDependencies) lr.name ? vm(`/// <amd-dependency name="${lr.name}" path="${lr.path}" />`) : vm(`/// <amd-dependency path="${lr.path}" />`), nl(); for (let lr of ne) { let ci = X.getTextPos(); vm(`/// <reference path="${lr.fileName}" />`), Pe && Pe.sections.push({ pos: ci, end: X.getTextPos(), kind: "reference", data: lr.fileName }), nl() } for (let lr of Ee) { let ci = X.getTextPos(), qr = lr.resolutionMode && lr.resolutionMode !== C?.impliedNodeFormat ? `resolution-mode="${lr.resolutionMode === 99 ? "import" : "require"}"` : ""; vm(`/// <reference types="${lr.fileName}" ${qr}/>`), Pe && Pe.sections.push({ pos: ci, end: X.getTextPos(), kind: lr.resolutionMode ? lr.resolutionMode === 99 ? "type-import" : "type-require" : "type", data: lr.fileName }), nl() } for (let lr of Wt) { let ci = X.getTextPos(); vm(`/// <reference lib="${lr.fileName}" />`), Pe && Pe.sections.push({ pos: ci, end: X.getTextPos(), kind: "lib", data: lr.fileName }), nl() } } function Cf(E) { let ne = E.statements; ng(E), mn(E.statements, qc), Vt(E); let Ee = Yc(ne, Wt => !B_(Wt)); Gb(E), cs(E, ne, 1, void 0, Ee === -1 ? ne.length : Ee), ih(E) } function Tx(E) { let ne = Ya(E); !(ne & 1024) && E.pos !== E.expression.pos && ag(E.expression.pos), Kt(E.expression), !(ne & 2048) && E.end !== E.expression.end && rd(E.expression.end) } function Sx(E) { ny(E, E.elements, 528, void 0) } function xv(E, ne, Ee, Wt) { let lr = !!ne; for (let ci = 0; ci < E.length; ci++) { let qr = E[ci]; if (B_(qr)) { if (Ee ? !Ee.has(qr.expression.text) : !0) { lr && (lr = !1, ue(ne)), nl(); let Wa = X.getTextPos(); Ge(qr), Wt && Pe && Pe.sections.push({ pos: Wa, end: X.getTextPos(), kind: "prologue", data: qr.expression.text }), Ee && Ee.add(qr.expression.text) } } else return ci } return E.length } function E1(E, ne) { for (let Ee of E) if (!ne.has(Ee.data)) { nl(); let Wt = X.getTextPos(); Ge(Ee), Pe && Pe.sections.push({ pos: Wt, end: X.getTextPos(), kind: "prologue", data: Ee.data }), ne && ne.add(Ee.data) } } function T1(E) { if (Li(E)) xv(E.statements, E); else { let ne = new Set; for (let Ee of E.prepends) E1(Ee.prologues, ne); for (let Ee of E.sourceFiles) xv(Ee.statements, Ee, ne, !0); ue(void 0) } } function xx(E) { let ne = new Set, Ee; for (let Wt = 0; Wt < E.sourceFiles.length; Wt++) { let lr = E.sourceFiles[Wt], ci, qr = 0; for (let Ti of lr.statements) { if (!B_(Ti)) break; ne.has(Ti.expression.text) || (ne.add(Ti.expression.text), (ci || (ci = [])).push({ pos: Ti.pos, end: Ti.end, expression: { pos: Ti.expression.pos, end: Ti.expression.end, text: Ti.expression.text } }), qr = qr < Ti.end ? Ti.end : qr) } ci && (Ee || (Ee = [])).push({ file: Wt, text: lr.text.substring(0, qr), directives: ci }) } return Ee } function Bb(E) { if (Li(E) || BT(E)) { let ne = K8(E.text); if (ne) return vm(ne), nl(), !0 } else { for (let ne of E.prepends) if (L.assertNode(ne, BT), Bb(ne)) return !0; for (let ne of E.sourceFiles) if (Bb(ne)) return !0 } } function S1(E, ne) { if (!E) return; let Ee = we; we = ne, Ge(E), we = Ee } function rf(E, ne, Ee) { if (ne?.length) { if (Ji(ne, Ha)) return Qh(E, ne); if (Ji(ne, du)) return Ee ? Zh(E, ne) : E.pos; d?.(ne); let Wt, lr, ci = 0, qr = 0, Ti; for (; ci < ne.length;) { for (; qr < ne.length;) { if (Ti = ne[qr], lr = du(Ti) ? "decorators" : "modifiers", Wt === void 0) Wt = lr; else if (lr !== Wt) break; qr++ } let Wa = { pos: -1, end: -1 }; ci === 0 && (Wa.pos = ne.pos), qr === ne.length - 1 && (Wa.end = ne.end), (Wt === "modifiers" || Ee) && Vb(Ge, E, ne, Wt === "modifiers" ? 2359808 : 2146305, void 0, ci, qr - ci, !1, Wa), ci = qr, Wt = lr, qr++ } if (g?.(ne), Ti && !vp(Ti.end)) return Ti.end } return E.pos } function Qh(E, ne) { cs(E, ne, 2359808); let Ee = Os(ne); return Ee && !vp(Ee.end) ? Ee.end : E.pos } function Q_(E) { E && (Qn(":"), Wn(), Ge(E)) } function I_(E, ne, Ee, Wt) { E && (Wn(), $t(63, ne, af, Ee), Wn(), Kt(E, Wt)) } function Ax(E, ne, Ee, Wt) { Ee && (ne(E), Wt(Ee)) } function Ub(E) { E && (Wn(), Ge(E)) } function Lp(E, ne) { E && (Wn(), Kt(E, ne)) } function x1(E) { E && (Ge(E), Wn()) } function Uu(E, ne) { Va(ne) || Ya(E) & 1 ? (Wn(), Ge(ne)) : (nl(), Kf(), Pz(ne) ? rt(5, ne) : Ge(ne), Z_()) } function Zh(E, ne) { cs(E, ne, 2146305); let Ee = Os(ne); return Ee && !vp(Ee.end) ? Ee.end : E.pos } function kp(E, ne) { cs(E, ne, 53776, pt) } function Dp(E, ne) { if (Ia(E) && E.typeArguments) return kp(E, E.typeArguments); cs(E, ne, 53776) } function eg(E, ne) { cs(E, ne, 2576) } function vE(E, ne) { let Ee = Wp(ne); return Ee && Ee.pos === E.pos && xs(E) && !E.type && !vt(E.modifiers) && !vt(E.typeParameters) && !vt(Ee.modifiers) && !Ee.dotDotDotToken && !Ee.questionToken && !Ee.type && !Ee.initializer && Re(Ee.name) } function A1(E, ne) { vE(E, ne) ? cs(E, ne, 528) : eg(E, ne) } function ty(E, ne) { cs(E, ne, 8848) } function bE(E) { switch (E & 60) { case 0: break; case 16: Qn(","); break; case 4: Wn(), Qn("|"); break; case 32: Wn(), Qn("*"), Wn(); break; case 8: Wn(), Qn("&"); break } } function cs(E, ne, Ee, Wt, lr, ci) { Cx(Ge, E, ne, Ee | (E && Ya(E) & 2 ? 65536 : 0), Wt, lr, ci) } function ny(E, ne, Ee, Wt, lr, ci) { Cx(Kt, E, ne, Ee, Wt, lr, ci) } function Cx(E, ne, Ee, Wt, lr, ci = 0, qr = Ee ? Ee.length - ci : 0) { if (Ee === void 0 && Wt & 16384) return; let Wa = Ee === void 0 || ci >= Ee.length || qr === 0; if (Wa && Wt & 32768) { d?.(Ee), g?.(Ee); return } Wt & 15360 && (Qn(HMe(Wt)), Wa && Ee && ag(Ee.pos, !0)), d?.(Ee), Wa ? Wt & 1 && !(_e && (!ne || C && DT(ne, C))) ? nl() : Wt & 256 && !(Wt & 524288) && Wn() : Vb(E, ne, Ee, Wt, lr, ci, qr, Ee.hasTrailingComma, Ee), g?.(Ee), Wt & 15360 && (Wa && Ee && rd(Ee.end), Qn(WMe(Wt))) } function Vb(E, ne, Ee, Wt, lr, ci, qr, Ti, Wa) { let kl = (Wt & 262144) === 0, Ed = kl, Ud = Fl(ne, Ee[ci], Wt); Ud ? (nl(Ud), Ed = !1) : Wt & 256 && Wn(), Wt & 128 && Kf(); let fy = qMe(E, lr), Td, Ov, Nv = !1; for (let Sm = 0; Sm < qr; Sm++) { let py = Ee[ci + Sm]; if (Wt & 32) nl(), bE(Wt); else if (Td) { Wt & 60 && Td.end !== (ne ? ne.end : -1) && (Ya(Td) & 2048 || rd(Td.end)), bE(Wt), Cr(Ov); let If = qf(Td, py, Wt); If > 0 ? (Wt & 131 || (Kf(), Nv = !0), nl(If), Ed = !1) : Td && Wt & 512 && Wn() } if (Ov = dr(py), Ed) { let If = sm(py); ag(If.pos) } else Ed = kl; ge = py.pos, fy(py, E, lr, Sm), Nv && (Z_(), Nv = !1), Td = py } let _y = Td ? Ya(Td) : 0, Xf = Gt || !!(_y & 2048), ME = Ti && Wt & 64 && Wt & 16; ME && (Td && !Xf ? $t(27, Td.end, Qn, Td) : Qn(",")), Td && (ne ? ne.end : -1) !== Td.end && Wt & 60 && !Xf && rd(ME && Wa?.end ? Wa.end : Td.end), Wt & 128 && Z_(), Cr(Ov); let cf = bm(ne, Ee[ci + qr - 1], Wt, Wa); cf ? nl(cf) : Wt & 2097408 && Wn() } function jb(E) { X.writeLiteral(E) } function Ix(E) { X.writeStringLiteral(E) } function uC(E) { X.write(E) } function Lx(E, ne) { X.writeSymbol(E, ne) } function Qn(E) { X.writePunctuation(E) } function lc() { X.writeTrailingSemicolon(";") } function zi(E) { X.writeKeyword(E) } function af(E) { X.writeOperator(E) } function Av(E) { X.writeParameter(E) } function vm(E) { X.writeComment(E) } function Wn() { X.writeSpace(" ") } function kx(E) { X.writeProperty(E) } function ry(E) { X.nonEscapingWrite ? X.nonEscapingWrite(E) : X.write(E) } function nl(E = 1) { for (let ne = 0; ne < E; ne++)X.writeLine(ne > 0) } function Kf() { X.increaseIndent() } function Z_() { X.decreaseIndent() } function iy(E, ne, Ee, Wt) { return Le ? L_(E, Ee, ne) : dC(Wt, E, Ee, ne, L_) } function EE(E, ne) { m && m(E), ne(Xa(E.kind)), v && v(E) } function L_(E, ne, Ee) { let Wt = Xa(E); return ne(Wt), Ee < 0 ? Ee : Ee + Wt.length } function ay(E, ne, Ee) { if (Ya(E) & 1) Wn(); else if (_e) { let Wt = ep(E, ne, Ee); Wt ? nl(Wt) : Wn() } else nl() } function Ac(E) { let ne = E.split(/\r\n?|\n/g), Ee = xse(ne); for (let Wt of ne) { let lr = Ee ? Wt.slice(Ee) : Wt; lr.length && (nl(), we(lr)) } } function wc(E, ne) { E ? (Kf(), nl(E)) : ne && Wn() } function tg(E, ne) { E && Z_(), ne && Z_() } function Fl(E, ne, Ee) { if (Ee & 2 || _e) { if (Ee & 65536) return 1; if (ne === void 0) return !E || C && DT(E, C) ? 0 : 1; if (ne.pos === ge || ne.kind === 11) return 0; if (C && E && !vp(E.pos) && !ws(ne) && (!ne.parent || ec(ne.parent) === ec(E))) return _e ? nd(Wt => ole(ne.pos, E.pos, C, Wt)) : a4(E, ne, C) ? 0 : 1; if (Wb(ne, Ee)) return 1 } return Ee & 1 ? 1 : 0 } function qf(E, ne, Ee) { if (Ee & 2 || _e) { if (E === void 0 || ne === void 0 || ne.kind === 11) return 0; if (C && !ws(E) && !ws(ne)) return _e && ch(E, ne) ? nd(Wt => pW(E, ne, C, Wt)) : !_e && wv(E, ne) ? DR(E, ne, C) ? 0 : 1 : Ee & 65536 ? 1 : 0; if (Wb(E, Ee) || Wb(ne, Ee)) return 1 } else if (tO(ne)) return 1; return Ee & 1 ? 1 : 0 } function bm(E, ne, Ee, Wt) { if (Ee & 2 || _e) { if (Ee & 65536) return 1; if (ne === void 0) return !E || C && DT(E, C) ? 0 : 1; if (C && E && !vp(E.pos) && !ws(ne) && (!ne.parent || ne.parent === E)) { if (_e) { let lr = Wt && !vp(Wt.end) ? Wt.end : ne.end; return nd(ci => sle(lr, E.end, C, ci)) } return rle(E, ne, C) ? 0 : 1 } if (Wb(ne, Ee)) return 1 } return Ee & 1 && !(Ee & 131072) ? 1 : 0 } function nd(E) { L.assert(!!_e); let ne = E(!0); return ne === 0 ? E(!1) : ne } function TE(E, ne) { let Ee = _e && Fl(ne, E, 0); return Ee && wc(Ee, !1), !!Ee } function Hb(E, ne) { let Ee = _e && bm(ne, E, 0, void 0); Ee && nl(Ee) } function Wb(E, ne) { if (ws(E)) { let Ee = tO(E); return Ee === void 0 ? (ne & 65536) !== 0 : Ee } return (ne & 65536) !== 0 } function ep(E, ne, Ee) { return Ya(E) & 262144 ? 0 : (E = SE(E), ne = SE(ne), Ee = SE(Ee), tO(Ee) ? 1 : C && !ws(E) && !ws(ne) && !ws(Ee) ? _e ? nd(Wt => pW(ne, Ee, C, Wt)) : DR(ne, Ee, C) ? 0 : 1 : 0) } function rh(E) { return E.statements.length === 0 && (!C || DR(E, E, C)) } function SE(E) { for (; E.kind === 214 && ws(E);)E = E.expression; return E } function oy(E, ne) { if (tc(E) || tS(E)) return zb(E); if (yo(E) && E.textSourceNode) return oy(E.textSourceNode, ne); let Ee = C, Wt = !!Ee && !!E.parent && !ws(E); if (Ah(E)) { if (!Wt || Gn(E) !== ec(Ee)) return vr(E) } else if (L.assertNode(E, fT), !Wt) return E.text; return k0(Ee, E, ne) } function uc(E, ne, Ee) { if (E.kind === 10 && E.textSourceNode) { let lr = E.textSourceNode; if (Re(lr) || pi(lr) || Vf(lr)) { let ci = Vf(lr) ? lr.text : oy(lr); return Ee ? `"${qH(ci)}"` : ne || Ya(E) & 33554432 ? `"${_S(ci)}"` : `"${ER(ci)}"` } else return uc(lr, ne, Ee) } let Wt = (ne ? 1 : 0) | (Ee ? 2 : 0) | (e.terminateUnterminatedLiterals ? 4 : 0) | (e.target && e.target === 99 ? 8 : 0); return Bse(E, C, Wt) } function ng(E) { E && Ya(E) & 1048576 || ($.push(fe), fe = 0, W.push(Y), Y = void 0, Z.push(U)) } function ih(E) { E && Ya(E) & 1048576 || (fe = $.pop(), Y = W.pop(), U = Z.pop()) } function Cv(E) { (!U || U === Os(Z)) && (U = new Set), U.add(E) } function Iv(E, ne) { R.push(ie), ie = E, re.push(U), le = ne } function Gl() { ie = R.pop(), le = re.pop() } function ah(E) { (!le || le === Os(re)) && (le = new Set), le.add(E) } function qc(E) { if (E) switch (E.kind) { case 238: mn(E.statements, qc); break; case 253: case 251: case 243: case 244: qc(E.statement); break; case 242: qc(E.thenStatement), qc(E.elseStatement); break; case 245: case 247: case 246: qc(E.initializer), qc(E.statement); break; case 252: qc(E.caseBlock); break; case 266: mn(E.clauses, qc); break; case 292: case 293: mn(E.statements, qc); break; case 255: qc(E.tryBlock), qc(E.catchClause), qc(E.finallyBlock); break; case 295: qc(E.variableDeclaration), qc(E.block); break; case 240: qc(E.declarationList); break; case 258: mn(E.declarations, qc); break; case 257: case 166: case 205: case 260: oh(E.name); break; case 259: oh(E.name), Ya(E) & 1048576 && (mn(E.parameters, qc), qc(E.body)); break; case 203: case 204: mn(E.elements, qc); break; case 269: qc(E.importClause); break; case 270: oh(E.name), qc(E.namedBindings); break; case 271: oh(E.name); break; case 277: oh(E.name); break; case 272: mn(E.elements, qc); break; case 273: oh(E.propertyName || E.name); break } } function xE(E) { if (E) switch (E.kind) { case 299: case 300: case 169: case 171: case 174: case 175: oh(E.name); break } } function oh(E) { E && (tc(E) || tS(E) ? zb(E) : La(E) && qc(E)) } function zb(E) { let ne = E.emitNode.autoGenerate; if ((ne.flags & 7) === 4) return Vu(I3(E), pi(E), ne.flags, ne.prefix, ne.suffix); { let Ee = ne.id; return B[Ee] || (B[Ee] = fr(E)) } } function Vu(E, ne, Ee, Wt, lr) { let ci = zo(E), qr = ne ? F : P; return qr[ci] || (qr[ci] = No(E, ne, Ee ?? 0, L2(Wt, zb), L2(lr))) } function Em(E, ne) { return Lv(E, ne) && !Jb(E, ne) && !q.has(E) } function Jb(E, ne) { return ne ? !!le?.has(E) : !!U?.has(E) } function Lv(E, ne) { return C ? g6(C, E, r) : !0 } function AE(E, ne) { for (let Ee = ne; Ee && AT(Ee, ne); Ee = Ee.nextContainer)if (Qp(Ee) && Ee.locals) { let Wt = Ee.locals.get(Bs(E)); if (Wt && Wt.flags & 3257279) return !1 } return !0 } function sy(E) { var ne; switch (E) { case "": return fe; case "#": return ie; default: return (ne = Y?.get(E)) != null ? ne : 0 } } function C1(E, ne) { switch (E) { case "": fe = ne; break; case "#": ie = ne; break; default: Y ?? (Y = new Map), Y.set(E, ne); break } } function kv(E, ne, Ee, Wt, lr) { Wt.length > 0 && Wt.charCodeAt(0) === 35 && (Wt = Wt.slice(1)); let ci = jT(Ee, Wt, "", lr), qr = sy(ci); if (E && !(qr & E)) { let Wa = jT(Ee, Wt, E === 268435456 ? "_i" : "_n", lr); if (Em(Wa, Ee)) return qr |= E, Ee ? ah(Wa) : ne && Cv(Wa), C1(ci, qr), Wa } for (; ;) { let Ti = qr & 268435455; if (qr++, Ti !== 8 && Ti !== 13) { let Wa = Ti < 26 ? "_" + String.fromCharCode(97 + Ti) : "_" + (Ti - 26), kl = jT(Ee, Wt, Wa, lr); if (Em(kl, Ee)) return Ee ? ah(kl) : ne && Cv(kl), C1(ci, qr), kl } } } function rg(E, ne = Em, Ee, Wt, lr, ci, qr) { if (E.length > 0 && E.charCodeAt(0) === 35 && (E = E.slice(1)), ci.length > 0 && ci.charCodeAt(0) === 35 && (ci = ci.slice(1)), Ee) { let Wa = jT(lr, ci, E, qr); if (ne(Wa, lr)) return lr ? ah(Wa) : Wt ? Cv(Wa) : q.add(Wa), Wa } E.charCodeAt(E.length - 1) !== 95 && (E += "_"); let Ti = 1; for (; ;) { let Wa = jT(lr, ci, E + Ti, qr); if (ne(Wa, lr)) return lr ? ah(Wa) : Wt ? Cv(Wa) : q.add(Wa), Wa; Ti++ } } function of(E) { return rg(E, Lv, !0, !1, !1, "", "") } function CE(E) { let ne = oy(E.name); return AE(ne, zr(E, Qp)) ? ne : rg(ne, Em, !1, !1, !1, "", "") } function Gd(E) { let ne = UA(E), Ee = yo(ne) ? Vse(ne.text) : "module"; return rg(Ee, Em, !1, !1, !1, "", "") } function sh() { return rg("default", Em, !1, !1, !1, "", "") } function Dv() { return rg("class", Em, !1, !1, !1, "", "") } function Dx(E, ne, Ee, Wt) { return Re(E.name) ? Vu(E.name, ne) : kv(0, !1, ne, Ee, Wt) } function No(E, ne, Ee, Wt, lr) { switch (E.kind) { case 79: case 80: return rg(oy(E), Em, !!(Ee & 16), !!(Ee & 8), ne, Wt, lr); case 264: case 263: return L.assert(!Wt && !lr && !ne), CE(E); case 269: case 275: return L.assert(!Wt && !lr && !ne), Gd(E); case 259: case 260: { L.assert(!Wt && !lr && !ne); let ci = E.name; return ci && !tc(ci) ? No(ci, !1, Ee, Wt, lr) : sh() } case 274: return L.assert(!Wt && !lr && !ne), sh(); case 228: return L.assert(!Wt && !lr && !ne), Dv(); case 171: case 174: case 175: return Dx(E, ne, Wt, lr); case 164: return kv(0, !0, ne, Wt, lr); default: return kv(0, !1, ne, Wt, lr) } } function fr(E) { let ne = E.emitNode.autoGenerate, Ee = L2(ne.prefix, zb), Wt = L2(ne.suffix); switch (ne.flags & 7) { case 1: return kv(0, !!(ne.flags & 8), pi(E), Ee, Wt); case 2: return L.assertNode(E, Re), kv(268435456, !!(ne.flags & 8), !1, Ee, Wt); case 3: return rg(vr(E), ne.flags & 32 ? Lv : Em, !!(ne.flags & 16), !!(ne.flags & 8), pi(E), Ee, Wt) }return L.fail(`Unsupported GeneratedIdentifierKind: ${L.formatEnum(ne.flags & 7, w8, !0)}.`) } function vd(E, ne) { let Ee = pe(2, E, ne), Wt = qe, lr = zt, ci = Qt; ju(ne), Ee(E, ne), I1(ne, Wt, lr, ci) } function ju(E) { let ne = Ya(E), Ee = sm(E); IE(E, ne, Ee.pos, Ee.end), ne & 4096 && (Gt = !0) } function I1(E, ne, Ee, Wt) { let lr = Ya(E), ci = sm(E); lr & 4096 && (Gt = !1), cy(E, lr, ci.pos, ci.end, ne, Ee, Wt); let qr = vue(E); qr && cy(E, lr, qr.pos, qr.end, ne, Ee, Wt) } function IE(E, ne, Ee, Wt) { Ni(), _n = !1; let lr = Ee < 0 || (ne & 1024) !== 0 || E.kind === 11, ci = Wt < 0 || (ne & 2048) !== 0 || E.kind === 11; (Ee > 0 || Wt > 0) && Ee !== Wt && (lr || Rp(Ee, E.kind !== 355), (!lr || Ee >= 0 && ne & 1024) && (qe = Ee), (!ci || Wt >= 0 && ne & 2048) && (zt = Wt, E.kind === 258 && (Qt = Wt))), mn(l2(E), wx), Pi() } function cy(E, ne, Ee, Wt, lr, ci, qr) { Ni(); let Ti = Wt < 0 || (ne & 2048) !== 0 || E.kind === 11; mn(rO(E), ly), (Ee > 0 || Wt > 0) && Ee !== Wt && (qe = lr, zt = ci, Qt = qr, !Ti && E.kind !== 355 && LE(Wt)), Pi() } function wx(E) { (E.hasLeadingNewline || E.kind === 2) && X.writeLine(), wp(E), E.hasTrailingNewLine || E.kind === 2 ? X.writeLine() : X.writeSpace(" ") } function ly(E) { X.isAtStartOfLine() || X.writeSpace(" "), wp(E), E.hasTrailingNewLine && X.writeLine() } function wp(E) { let ne = tp(E), Ee = E.kind === 3 ? hw(ne) : void 0; $A(ne, Ee, X, 0, ne.length, x) } function tp(E) { return E.kind === 3 ? `/*${E.text}*/` : `//${E.text}` } function ig(E, ne, Ee) { Ni(); let { pos: Wt, end: lr } = ne, ci = Ya(E), qr = Wt < 0 || (ci & 1024) !== 0, Ti = Gt || lr < 0 || (ci & 2048) !== 0; qr || Rv(ne), Pi(), ci & 4096 && !Gt ? (Gt = !0, Ee(E), Gt = !1) : Ee(E), Ni(), Ti || (Rp(ne.end, !0), _n && !X.isAtStartOfLine() && X.writeLine()), Pi() } function wv(E, ne) { return E = ec(E), E.parent && E.parent === ec(ne).parent } function ch(E, ne) { if (ne.pos < E.end) return !1; E = ec(E), ne = ec(ne); let Ee = E.parent; if (!Ee || Ee !== ne.parent) return !1; let Wt = Ule(E), lr = Wt?.indexOf(E); return lr !== void 0 && lr > -1 && Wt.indexOf(ne) === lr + 1 } function Rp(E, ne) { _n = !1, ne ? E === 0 && C?.isDeclarationFile ? ls(E, Cc) : ls(E, Tm) : E === 0 && ls(E, L1) } function L1(E, ne, Ee, Wt, lr) { wE(E, ne) && Tm(E, ne, Ee, Wt, lr) } function Cc(E, ne, Ee, Wt, lr) { wE(E, ne) || Tm(E, ne, Ee, Wt, lr) } function Bd(E, ne) { return e.onlyPrintJsDocStyle ? cJ(E, ne) || y6(E, ne) : !0 } function Tm(E, ne, Ee, Wt, lr) { !C || !Bd(C.text, E) || (_n || (Uce(je(), X, lr, E), _n = !0), bd(E), $A(C.text, je(), X, E, ne, x), bd(ne), Wt ? X.writeLine() : Ee === 3 && X.writeSpace(" ")) } function rd(E) { Gt || E === -1 || Rp(E, !0) } function LE(E) { kE(E, uy) } function uy(E, ne, Ee, Wt) { !C || !Bd(C.text, E) || (X.isAtStartOfLine() || X.writeSpace(" "), bd(E), $A(C.text, je(), X, E, ne, x), bd(ne), Wt && X.writeLine()) } function ag(E, ne, Ee) { Gt || (Ni(), kE(E, ne ? uy : Ee ? Rx : sf), Pi()) } function Rx(E, ne, Ee) { C && (bd(E), $A(C.text, je(), X, E, ne, x), bd(ne), Ee === 2 && X.writeLine()) } function sf(E, ne, Ee, Wt) { C && (bd(E), $A(C.text, je(), X, E, ne, x), bd(ne), Wt ? X.writeLine() : X.writeSpace(" ")) } function ls(E, ne) { C && (qe === -1 || E !== qe) && (DE(E) ? og(ne) : vw(C.text, E, ne, E)) } function kE(E, ne) { C && (zt === -1 || E !== zt && E !== Qt) && bw(C.text, E, ne) } function DE(E) { return kn !== void 0 && To(kn).nodePos === E } function og(E) { if (!C) return; let ne = To(kn).detachedCommentEndPos; kn.length - 1 ? kn.pop() : kn = void 0, vw(C.text, ne, E, ne) } function Rv(E) { let ne = C && jce(C.text, je(), X, k1, E, x, Gt); ne && (kn ? kn.push(ne) : kn = [ne]) } function k1(E, ne, Ee, Wt, lr, ci) { !C || !Bd(C.text, Wt) || (bd(Wt), $A(E, ne, Ee, Wt, lr, ci), bd(lr)) } function wE(E, ne) { return !!C && iH(C.text, E, ne) } function RE(E) { return E.parsedSourceMap === void 0 && E.sourceMapText !== void 0 && (E.parsedSourceMap = bK(E.sourceMapText) || !1), E.parsedSourceMap || void 0 } function OE(E, ne) { let Ee = pe(3, E, ne); NE(ne), Ee(E, ne), PE(ne) } function NE(E) { let ne = Ya(E), Ee = pb(E); if (Oj(E)) { L.assertIsDefined(E.parent, "UnparsedNodes must have parent pointers"); let Wt = RE(E.parent); Wt && Ye && Ye.appendSourceMap(X.getLine(), X.getColumn(), Wt, E.parent.sourceMapPath, E.parent.getLineAndCharacterOfPosition(E.pos), E.parent.getLineAndCharacterOfPosition(E.end)) } else { let Wt = Ee.source || _t; E.kind !== 355 && !(ne & 32) && Ee.pos >= 0 && lh(Ee.source || _t, dy(Wt, Ee.pos)), ne & 128 && (Le = !0) } } function PE(E) { let ne = Ya(E), Ee = pb(E); Oj(E) || (ne & 128 && (Le = !1), E.kind !== 355 && !(ne & 64) && Ee.end >= 0 && lh(Ee.source || _t, Ee.end)) } function dy(E, ne) { return E.skipTrivia ? E.skipTrivia(ne) : xo(E.text, ne) } function bd(E) { if (Le || vp(E) || Nx(_t)) return; let { line: ne, character: Ee } = Gs(_t, E); Ye.addMapping(X.getLine(), X.getColumn(), ct, ne, Ee, void 0) } function lh(E, ne) { if (E !== _t) { let Ee = _t, Wt = ct; sg(E), bd(ne), Ox(Ee, Wt) } else bd(ne) } function dC(E, ne, Ee, Wt, lr) { if (Le || E && B6(E)) return lr(ne, Ee, Wt); let ci = E && E.emitNode, qr = ci && ci.flags || 0, Ti = ci && ci.tokenSourceMapRanges && ci.tokenSourceMapRanges[ne], Wa = Ti && Ti.source || _t; return Wt = dy(Wa, Ti ? Ti.pos : Wt), !(qr & 256) && Wt >= 0 && lh(Wa, Wt), Wt = lr(ne, Ee, Wt), Ti && (Wt = Ti.end), !(qr & 512) && Wt >= 0 && lh(Wa, Wt), Wt } function sg(E) { if (!Le) { if (_t = E, E === Rt) { ct = We; return } Nx(E) || (ct = Ye.addSource(E.fileName), e.inlineSources && Ye.setSourceContent(ct, E.text), Rt = E, We = ct) } } function Ox(E, ne) { _t = E, ct = ne } function Nx(E) { return Gc(E.fileName, ".json") } } function jMe() { let e = []; return e[1024] = ["{", "}"], e[2048] = ["(", ")"], e[4096] = ["<", ">"], e[8192] = ["[", "]"], e } function HMe(e) { return KK[e & 15360][0] } function WMe(e) { return KK[e & 15360][1] } function zMe(e, t, r, i) { t(e) } function JMe(e, t, r, i) { t(e, r.select(i)) } function KMe(e, t, r, i) { t(e, r) } function qMe(e, t) { return e.length === 1 ? zMe : typeof t == "object" ? JMe : KMe } var KK, LF, qK, rE, XK, fN, XMe = gt({ "src/compiler/emitter.ts"() { "use strict"; fa(), fa(), E0(), KK = jMe(), LF = { hasGlobalName: Sa, getReferencedExportContainer: Sa, getReferencedImportDeclaration: Sa, getReferencedDeclarationWithCollidingName: Sa, isDeclarationWithCollidingName: Sa, isValueAliasDeclaration: Sa, isReferencedAliasDeclaration: Sa, isTopLevelValueImportEqualsWithEntityName: Sa, getNodeCheckFlags: Sa, isDeclarationVisible: Sa, isLateBound: e => !1, collectLinkedAliases: Sa, isImplementationOfOverload: Sa, isRequiredInitializedParameter: Sa, isOptionalUninitializedParameterProperty: Sa, isExpandoFunctionDeclaration: Sa, getPropertiesOfContainerFunction: Sa, createTypeOfDeclaration: Sa, createReturnTypeOfSignatureDeclaration: Sa, createTypeOfExpression: Sa, createLiteralConstValue: Sa, isSymbolAccessible: Sa, isEntityNameVisible: Sa, getConstantValue: Sa, getReferencedValueDeclaration: Sa, getTypeReferenceSerializationKind: Sa, isOptionalParameter: Sa, moduleExportsSomeValue: Sa, isArgumentsLocalBinding: Sa, getExternalModuleFileFromDeclaration: Sa, getTypeReferenceDirectivesForEntityName: Sa, getTypeReferenceDirectivesForSymbol: Sa, isLiteralConstDeclaration: Sa, getJsxFactoryEntity: Sa, getJsxFragmentFactoryEntity: Sa, getAllAccessorDeclarations: Sa, getSymbolOfExternalModuleSpecifier: Sa, isBindingCapturedByNode: Sa, getDeclarationStatementsForSourceFile: Sa, isImportRequiredByAugmentation: Sa }, qK = zu(() => nE({})), rE = zu(() => nE({ removeComments: !0 })), XK = zu(() => nE({ removeComments: !0, neverAsciiEscape: !0 })), fN = zu(() => nE({ removeComments: !0, omitTrailingSemicolon: !0 })) } }); function Mpe(e, t, r) { if (!e.getDirectories || !e.readDirectory) return; let i = new Map, o = Dl(r); return { useCaseSensitiveFileNames: r, fileExists: x, readFile: (R, ie) => e.readFile(R, ie), directoryExists: e.directoryExists && A, getDirectories: C, readDirectory: P, createDirectory: e.createDirectory && w, writeFile: e.writeFile && S, addOrDeleteFileOrDirectory: B, addOrDeleteFile: q, clearCache: Y, realpath: e.realpath && F }; function s(R) { return Ts(R, t, o) } function l(R) { return i.get(cu(R)) } function f(R) { let ie = l(ni(R)); return ie && (ie.sortedAndCanonicalizedFiles || (ie.sortedAndCanonicalizedFiles = ie.files.map(o).sort(), ie.sortedAndCanonicalizedDirectories = ie.directories.map(o).sort()), ie) } function d(R) { return Hl(So(R)) } function g(R, ie) { var $; if (!e.realpath || cu(s(e.realpath(R))) === ie) { let fe = { files: on(e.readDirectory(R, void 0, void 0, ["*.*"]), d) || [], directories: e.getDirectories(R) || [] }; return i.set(cu(ie), fe), fe } if (($ = e.directoryExists) != null && $.call(e, R)) return i.set(ie, !1), !1 } function m(R, ie) { ie = cu(ie); let $ = l(ie); if ($) return $; try { return g(R, ie) } catch { L.assert(!i.has(cu(ie))); return } } function v(R, ie) { return Py(R, ie, Ks, su) >= 0 } function S(R, ie, $) { let fe = s(R), Z = f(fe); return Z && W(Z, d(R), !0), e.writeFile(R, ie, $) } function x(R) { let ie = s(R), $ = f(ie); return $ && v($.sortedAndCanonicalizedFiles, o(d(R))) || e.fileExists(R) } function A(R) { let ie = s(R); return i.has(cu(ie)) || e.directoryExists(R) } function w(R) { let ie = s(R), $ = f(ie); if ($) { let fe = d(R), Z = o(fe), U = $.sortedAndCanonicalizedDirectories; Ny(U, Z, su) && $.directories.push(fe) } e.createDirectory(R) } function C(R) { let ie = s(R), $ = m(R, ie); return $ ? $.directories.slice() : e.getDirectories(R) } function P(R, ie, $, fe, Z) { let U = s(R), re = m(R, U), le; if (re !== void 0) return wW(R, ie, $, fe, r, t, Z, _e, F); return e.readDirectory(R, ie, $, fe, Z); function _e(X) { let Ve = s(X); if (Ve === U) return re || ge(X, Ve); let we = m(X, Ve); return we !== void 0 ? we || ge(X, Ve) : D4 } function ge(X, Ve) { if (le && Ve === U) return le; let we = { files: on(e.readDirectory(X, void 0, void 0, ["*.*"]), d) || Je, directories: e.getDirectories(X) || Je }; return Ve === U && (le = we), we } } function F(R) { return e.realpath ? e.realpath(R) : R } function B(R, ie) { if (l(ie) !== void 0) { Y(); return } let fe = f(ie); if (!fe) return; if (!e.directoryExists) { Y(); return } let Z = d(R), U = { fileExists: e.fileExists(ie), directoryExists: e.directoryExists(ie) }; return U.directoryExists || v(fe.sortedAndCanonicalizedDirectories, o(Z)) ? Y() : W(fe, Z, U.fileExists), U } function q(R, ie, $) { if ($ === 1) return; let fe = f(ie); fe && W(fe, d(R), $ === 0) } function W(R, ie, $) { let fe = R.sortedAndCanonicalizedFiles, Z = o(ie); if ($) Ny(fe, Z, su) && R.files.push(ie); else { let U = Py(fe, Z, Ks, su); if (U >= 0) { fe.splice(U, 1); let re = R.files.findIndex(le => o(le) === Z); R.files.splice(re, 1) } } } function Y() { i.clear() } } function YK(e, t, r, i, o) { var s; let l = p0(((s = t?.configFile) == null ? void 0 : s.extendedSourceFiles) || Je, o); r.forEach((f, d) => { l.has(d) || (f.projects.delete(e), f.close()) }), l.forEach((f, d) => { let g = r.get(d); g ? g.projects.add(e) : r.set(d, { projects: new Set([e]), watcher: i(f, d), close: () => { let m = r.get(d); !m || m.projects.size !== 0 || (m.watcher.close(), r.delete(d)) } }) }) } function Fpe(e, t) { t.forEach(r => { r.projects.delete(e) && r.close() }) } function $K(e, t, r) { e.delete(t) && e.forEach(({ extendedResult: i }, o) => { var s; (s = i.extendedSourceFiles) != null && s.some(l => r(l) === t) && $K(e, o, r) }) } function YMe(e, t, r) { let i = new Map(e); e2(t, i, { createNewValue: r, onDeleteValue: am }) } function Gpe(e, t, r) { let i = e.getMissingFilePaths(), o = p0(i, Ks, h0); e2(t, o, { createNewValue: r, onDeleteValue: am }) } function kF(e, t, r) { e2(e, t, { createNewValue: i, onDeleteValue: _m, onExistingValue: o }); function i(s, l) { return { watcher: r(s, l), flags: l } } function o(s, l, f) { s.flags !== l && (s.watcher.close(), e.set(f, i(f, l))) } } function DF({ watchedDirPath: e, fileOrDirectory: t, fileOrDirectoryPath: r, configFileName: i, options: o, program: s, extraFileExtensions: l, currentDirectory: f, useCaseSensitiveFileNames: d, writeLog: g, toPath: m }) { let v = Dq(r); if (!v) return g(`Project: ${i} Detected ignored path: ${t}`), !0; if (r = v, r === e) return !1; if (gA(r) && !wle(t, o, l)) return g(`Project: ${i} Detected file add/remove of non supported extension: ${t}`), !0; if (gfe(t, o.configFile.configFileSpecs, _a(ni(i), f), d, f)) return g(`Project: ${i} Detected excluded file: ${t}`), !0; if (!s || Ss(o) || o.outDir) return !1; if (Fu(r)) { if (o.declarationDir) return !1 } else if (!$c(r, dL)) return !1; let S = ld(r), x = ba(s) ? void 0 : $Me(s) ? s.getProgramOrUndefined() : s, A = !x && !ba(s) ? s : void 0; if (w(S + ".ts") || w(S + ".tsx")) return g(`Project: ${i} Detected output file: ${t}`), !0; return !1; function w(C) { return x ? !!x.getSourceFileByPath(C) : A ? A.getState().fileInfos.has(C) : !!wr(s, P => m(P) === C) } } function $Me(e) { return !!e.getState } function Bpe(e, t) { return e ? e.isEmittedFile(t) : !1 } function Upe(e, t, r, i) { ooe(t === 2 ? r : Ba); let o = { watchFile: (w, C, P, F) => e.watchFile(w, C, P, F), watchDirectory: (w, C, P, F) => e.watchDirectory(w, C, (P & 1) !== 0, F) }, s = t !== 0 ? { watchFile: x("watchFile"), watchDirectory: x("watchDirectory") } : void 0, l = t === 2 ? { watchFile: v, watchDirectory: S } : s || o, f = t === 2 ? m : TN; return { watchFile: d("watchFile"), watchDirectory: d("watchDirectory") }; function d(w) { return (C, P, F, B, q, W) => { var Y; return G3(C, w === "watchFile" ? B?.excludeFiles : B?.excludeDirectories, g(), ((Y = e.getCurrentDirectory) == null ? void 0 : Y.call(e)) || "") ? f(C, F, B, q, W) : l[w].call(void 0, C, P, F, B, q, W) } } function g() { return typeof e.useCaseSensitiveFileNames == "boolean" ? e.useCaseSensitiveFileNames : e.useCaseSensitiveFileNames() } function m(w, C, P, F, B) { return r(`ExcludeWatcher:: Added:: ${A(w, C, P, F, B, i)}`), { close: () => r(`ExcludeWatcher:: Close:: ${A(w, C, P, F, B, i)}`) } } function v(w, C, P, F, B, q) { r(`FileWatcher:: Added:: ${A(w, P, F, B, q, i)}`); let W = s.watchFile(w, C, P, F, B, q); return { close: () => { r(`FileWatcher:: Close:: ${A(w, P, F, B, q, i)}`), W.close() } } } function S(w, C, P, F, B, q) { let W = `DirectoryWatcher:: Added:: ${A(w, P, F, B, q, i)}`; r(W); let Y = Ms(), R = s.watchDirectory(w, C, P, F, B, q), ie = Ms() - Y; return r(`Elapsed:: ${ie}ms ${W}`), { close: () => { let $ = `DirectoryWatcher:: Close:: ${A(w, P, F, B, q, i)}`; r($); let fe = Ms(); R.close(); let Z = Ms() - fe; r(`Elapsed:: ${Z}ms ${$}`) } } } function x(w) { return (C, P, F, B, q, W) => o[w].call(void 0, C, (...Y) => { let R = `${w === "watchFile" ? "FileWatcher" : "DirectoryWatcher"}:: Triggered with ${Y[0]} ${Y[1] !== void 0 ? Y[1] : ""}:: ${A(C, F, B, q, W, i)}`; r(R); let ie = Ms(); P.call(void 0, ...Y); let $ = Ms() - ie; r(`Elapsed:: ${$}ms ${R}`) }, F, B, q, W) } function A(w, C, P, F, B, q) { return `WatchInfo: ${w} ${C} ${JSON.stringify(P)} ${q ? q(F, B) : B === void 0 ? F : `${F} ${B}`}` } } function _N(e) { let t = e?.fallbackPolling; return { watchFile: t !== void 0 ? t : 1 } } function _m(e) { e.watcher.close() } var QK, ZK, QMe = gt({ "src/compiler/watchUtilities.ts"() { "use strict"; fa(), fa(), QK = (e => (e[e.None = 0] = "None", e[e.Partial = 1] = "Partial", e[e.Full = 2] = "Full", e))(QK || {}), ZK = (e => (e[e.None = 0] = "None", e[e.TriggerOnly = 1] = "TriggerOnly", e[e.Verbose = 2] = "Verbose", e))(ZK || {}) } }); function Vpe(e, t, r = "tsconfig.json") { return Th(e, i => { let o = vi(i, r); return t(o) ? o : void 0 }) } function wF(e, t) { let r = ni(t), i = qp(e) ? e : vi(r, e); return So(i) } function jpe(e, t, r) { let i; return mn(e, s => { let l = fw(s, t); if (l.pop(), !i) { i = l; return } let f = Math.min(i.length, l.length); for (let d = 0; d < f; d++)if (r(i[d]) !== r(l[d])) { if (d === 0) return !0; i.length = d; break } l.length < i.length && (i.length = l.length) }) ? "" : i ? T0(i) : t } function Hpe(e, t) { return nq(e, t) } function eq(e, t, r) { return (i, o, s) => { let l; try { Fs("beforeIORead"), l = e(i, t().charset), Fs("afterIORead"), hf("I/O Read", "beforeIORead", "afterIORead") } catch (f) { s && s(f.message), l = "" } return l !== void 0 ? DO(i, l, o, r) : void 0 } } function tq(e, t, r) { return (i, o, s, l) => { try { Fs("beforeIOWrite"), nW(i, o, s, e, t, r), Fs("afterIOWrite"), hf("I/O Write", "beforeIOWrite", "afterIOWrite") } catch (f) { l && l(f.message) } } } function nq(e, t, r = xl) { let i = new Map, o = Dl(r.useCaseSensitiveFileNames); function s(m) { return i.has(m) ? !0 : (g.directoryExists || r.directoryExists)(m) ? (i.set(m, !0), !0) : !1 } function l() { return ni(So(r.getExecutingFilePath())) } let f = db(e), d = r.realpath && (m => r.realpath(m)), g = { getSourceFile: eq(m => g.readFile(m), () => e, t), getDefaultLibLocation: l, getDefaultLibFileName: m => vi(l(), X8(m)), writeFile: tq((m, v, S) => r.writeFile(m, v, S), m => (g.createDirectory || r.createDirectory)(m), m => s(m)), getCurrentDirectory: zu(() => r.getCurrentDirectory()), useCaseSensitiveFileNames: () => r.useCaseSensitiveFileNames, getCanonicalFileName: o, getNewLine: () => f, fileExists: m => r.fileExists(m), readFile: m => r.readFile(m), trace: m => r.write(m + f), directoryExists: m => r.directoryExists(m), getEnvironmentVariable: m => r.getEnvironmentVariable ? r.getEnvironmentVariable(m) : "", getDirectories: m => r.getDirectories(m), realpath: d, readDirectory: (m, v, S, x, A) => r.readDirectory(m, v, S, x, A), createDirectory: m => r.createDirectory(m), createHash: ho(r, r.createHash) }; return g } function pN(e, t, r) { let i = e.readFile, o = e.fileExists, s = e.directoryExists, l = e.createDirectory, f = e.writeFile, d = new Map, g = new Map, m = new Map, v = new Map, S = w => { let C = t(w), P = d.get(C); return P !== void 0 ? P !== !1 ? P : void 0 : x(C, w) }, x = (w, C) => { let P = i.call(e, C); return d.set(w, P !== void 0 ? P : !1), P }; e.readFile = w => { let C = t(w), P = d.get(C); return P !== void 0 ? P !== !1 ? P : void 0 : !Gc(w, ".json") && !Ipe(w) ? i.call(e, w) : x(C, w) }; let A = r ? (w, C, P, F) => { let B = t(w), q = typeof C == "object" ? C.impliedNodeFormat : void 0, W = v.get(q), Y = W?.get(B); if (Y) return Y; let R = r(w, C, P, F); return R && (Fu(w) || Gc(w, ".json")) && v.set(q, (W || new Map).set(B, R)), R } : void 0; return e.fileExists = w => { let C = t(w), P = g.get(C); if (P !== void 0) return P; let F = o.call(e, w); return g.set(C, !!F), F }, f && (e.writeFile = (w, C, ...P) => { let F = t(w); g.delete(F); let B = d.get(F); B !== void 0 && B !== C ? (d.delete(F), v.forEach(q => q.delete(F))) : A && v.forEach(q => { let W = q.get(F); W && W.text !== C && q.delete(F) }), f.call(e, w, C, ...P) }), s && (e.directoryExists = w => { let C = t(w), P = m.get(C); if (P !== void 0) return P; let F = s.call(e, w); return m.set(C, !!F), F }, l && (e.createDirectory = w => { let C = t(w); m.delete(C), l.call(e, w) })), { originalReadFile: i, originalFileExists: o, originalDirectoryExists: s, originalCreateDirectory: l, originalWriteFile: f, getSourceFileWithCache: A, readFileWithCache: S } } function ZMe(e, t, r) { let i; return i = si(i, e.getConfigFileParsingDiagnostics()), i = si(i, e.getOptionsDiagnostics(r)), i = si(i, e.getSyntacticDiagnostics(t, r)), i = si(i, e.getGlobalDiagnostics(r)), i = si(i, e.getSemanticDiagnostics(t, r)), __(e.getCompilerOptions()) && (i = si(i, e.getDeclarationDiagnostics(t, r))), vA(i || Je) } function e8e(e, t) { let r = ""; for (let i of e) r += rq(i, t); return r } function rq(e, t) { let r = `${C8(e)} TS${e.code}: ${sv(e.messageText, t.getNewLine())}${t.getNewLine()}`; if (e.file) { let { line: i, character: o } = Gs(e.file, e.start), s = e.file.fileName; return `${rI(s, t.getCurrentDirectory(), f => t.getCanonicalFileName(f))}(${i + 1},${o + 1}): ` + r } return r } function Wpe(e) { switch (e) { case 1: return "\x1B[91m"; case 0: return "\x1B[93m"; case 2: return L.fail("Should never get an Info diagnostic on the command line."); case 3: return "\x1B[94m" } } function iE(e, t) { return t + e + mq } function zpe(e, t, r, i, o, s) { let { line: l, character: f } = Gs(e, t), { line: d, character: g } = Gs(e, t + r), m = Gs(e, e.text.length).line, v = d - l >= 4, S = (d + 1 + "").length; v && (S = Math.max(hq.length, S)); let x = ""; for (let A = l; A <= d; A++) { x += s.getNewLine(), v && l + 1 < A && A < d - 1 && (x += i + iE(J1(hq, S), BF) + UF + s.getNewLine(), A = d - 1); let w = gw(e, A, 0), C = A < m ? gw(e, A + 1, 0) : e.text.length, P = e.text.slice(w, C); if (P = $D(P), P = P.replace(/\t/g, " "), x += i + iE(J1(A + 1 + "", S), BF) + UF, x += P + s.getNewLine(), x += i + iE(J1("", S), BF) + UF, x += o, A === l) { let F = A === d ? g : void 0; x += P.slice(0, f).replace(/\S/g, " "), x += P.slice(f, F).replace(/./g, "~") } else A === d ? x += P.slice(0, g).replace(/./g, "~") : x += P.replace(/./g, "~"); x += mq } return x } function iq(e, t, r, i = iE) { let { line: o, character: s } = Gs(e, t), l = r ? rI(e.fileName, r.getCurrentDirectory(), d => r.getCanonicalFileName(d)) : e.fileName, f = ""; return f += i(l, "\x1B[96m"), f += ":", f += i(`${o + 1}`, "\x1B[93m"), f += ":", f += i(`${s + 1}`, "\x1B[93m"), f } function Jpe(e, t) { let r = ""; for (let i of e) { if (i.file) { let { file: o, start: s } = i; r += iq(o, s, t), r += " - " } if (r += iE(C8(i), Wpe(i.category)), r += iE(` TS${i.code}: `, "\x1B[90m"), r += sv(i.messageText, t.getNewLine()), i.file && (r += t.getNewLine(), r += zpe(i.file, i.start, i.length, "", Wpe(i.category), t)), i.relatedInformation) { r += t.getNewLine(); for (let { file: o, start: s, length: l, messageText: f } of i.relatedInformation) o && (r += t.getNewLine(), r += Xpe + iq(o, s, t), r += zpe(o, s, l, gq, "\x1B[96m", t)), r += t.getNewLine(), r += gq + sv(f, t.getNewLine()) } r += t.getNewLine() } return r } function sv(e, t, r = 0) { if (Ta(e)) return e; if (e === void 0) return ""; let i = ""; if (r) { i += t; for (let o = 0; o < r; o++)i += "  " } if (i += e.messageText, r++, e.next) for (let o of e.next) i += sv(o, t, r); return i } function mN(e, t) { return (Ta(e) ? t : e.resolutionMode) || t } function aq(e, t) { if (e.impliedNodeFormat !== void 0) return W_(e, GF(e, t)) } function oq(e) { var t; return Il(e) ? e.isTypeOnly : !!((t = e.importClause) != null && t.isTypeOnly) } function W_(e, t) { var r, i; if (e.impliedNodeFormat === void 0) return; if ((gl(t.parent) || Il(t.parent)) && oq(t.parent)) { let l = qS(t.parent.assertClause); if (l) return l } if (t.parent.parent && Mh(t.parent.parent)) { let s = qS((r = t.parent.parent.assertions) == null ? void 0 : r.assertClause); if (s) return s } if (e.impliedNodeFormat !== 99) return Dd(qy(t.parent)) ? 99 : 1; let o = (i = qy(t.parent)) == null ? void 0 : i.parent; return o && Nl(o) ? 1 : 99 } function qS(e, t) { if (!e) return; if (Fn(e.elements) !== 1) { t?.(e, _.Type_import_assertions_should_have_exactly_one_key_resolution_mode_with_value_import_or_require); return } let r = e.elements[0]; if (es(r.name)) { if (r.name.text !== "resolution-mode") { t?.(r.name, _.resolution_mode_is_the_only_valid_key_for_type_import_assertions); return } if (es(r.value)) { if (r.value.text !== "import" && r.value.text !== "require") { t?.(r.value, _.resolution_mode_should_be_either_require_or_import); return } return r.value.text === "import" ? 99 : 1 } } } function sq(e) { return e.text } function cq(e, t, r, i, o) { return { nameAndMode: QL, resolve: (s, l) => FL(s, e, r, i, o, t, l) } } function RF(e) { return Ta(e) ? e : n_(e.fileName) } function OF(e, t, r, i, o) { return { nameAndMode: yN, resolve: (s, l) => HJ(s, e, r, i, t, o, l) } } function hN(e, t, r, i, o, s, l, f) { if (e.length === 0) return Je; let d = [], g = new Map, m = f(t, r, i, s, l); for (let v of e) { let S = m.nameAndMode.getName(v), x = m.nameAndMode.getMode(v, o), A = ML(S, x), w = g.get(A); w || g.set(A, w = m.resolve(S, x)), d.push(w) } return d } function Kpe(e, t) { return gN(void 0, e, (r, i) => r && t(r, i)) } function gN(e, t, r, i) { let o; return s(e, t, void 0); function s(l, f, d) { if (i) { let g = i(l, d); if (g) return g } return mn(f, (g, m) => { if (g && o?.has(g.sourceFile.path)) return; let v = r(g, d, m); return v || !g ? v : ((o || (o = new Set)).add(g.sourceFile.path), s(g.commandLine.projectReferences, g.references, g)) }) } } function vb(e) { switch (e?.kind) { case 3: case 4: case 5: case 7: return !0; default: return !1 } } function F2(e) { return e.pos !== void 0 } function YL(e, t) { var r, i, o, s, l, f; let d = L.checkDefined(e(t.file)), { kind: g, index: m } = t, v, S, x, A; switch (g) { case 3: let w = GF(d, m); if (x = (o = (i = (r = d.resolvedModules) == null ? void 0 : r.get(w.text, aq(d, m))) == null ? void 0 : i.resolvedModule) == null ? void 0 : o.packageId, w.pos === -1) return { file: d, packageId: x, text: w.text }; v = xo(d.text, w.pos), S = w.end; break; case 4: ({ pos: v, end: S } = d.referencedFiles[m]); break; case 5: ({ pos: v, end: S, resolutionMode: A } = d.typeReferenceDirectives[m]), x = (f = (l = (s = d.resolvedTypeReferenceDirectiveNames) == null ? void 0 : s.get(n_(d.typeReferenceDirectives[m].fileName), A || d.impliedNodeFormat)) == null ? void 0 : l.resolvedTypeReferenceDirective) == null ? void 0 : f.packageId; break; case 7: ({ pos: v, end: S } = d.libReferenceDirectives[m]); break; default: return L.assertNever(g) }return { file: d, pos: v, end: S, packageId: x } } function lq(e, t, r, i, o, s, l, f, d) { if (!e || l?.() || !up(e.getRootFileNames(), t)) return !1; let g; if (!up(e.getProjectReferences(), d, x) || e.getSourceFiles().some(v) || e.getMissingFilePaths().some(o)) return !1; let m = e.getCompilerOptions(); if (!gW(m, r)) return !1; if (m.configFile && r.configFile) return m.configFile.text === r.configFile.text; return !0; function v(w) { return !S(w) || s(w.path) } function S(w) { return w.version === i(w.resolvedPath, w.fileName) } function x(w, C, P) { return tH(w, C) && A(e.getResolvedProjectReferences()[P], w) } function A(w, C) { if (w) { if (ya(g, w)) return !0; let F = $L(C), B = f(F); return !B || w.commandLine.options.configFile !== B.options.configFile || !up(w.commandLine.fileNames, B.fileNames) ? !1 : ((g || (g = [])).push(w), !mn(w.references, (q, W) => !A(q, w.commandLine.projectReferences[W]))) } let P = $L(C); return !f(P) } } function XT(e) { return e.options.configFile ? [...e.options.configFile.parseDiagnostics, ...e.errors] : e.errors } function NF(e, t, r, i) { let o = uq(e, t, r, i); return typeof o == "object" ? o.impliedNodeFormat : o } function uq(e, t, r, i) { switch ($s(i)) { case 3: case 99: return $c(e, [".d.mts", ".mts", ".mjs"]) ? 99 : $c(e, [".d.cts", ".cts", ".cjs"]) ? 1 : $c(e, [".d.ts", ".ts", ".tsx", ".js", ".jsx"]) ? o() : void 0; default: return }function o() { let s = Z3(t, r, i), l = []; s.failedLookupLocations = l, s.affectingLocations = l; let f = eF(e, s); return { impliedNodeFormat: f?.contents.packageJsonContent.type === "module" ? 99 : 1, packageJsonLocations: l, packageJsonScope: f } } } function t8e(e, t) { return e ? LA(e.getCompilerOptions(), t, V3) : !1 } function n8e(e, t, r, i, o, s) { return { rootNames: e, options: t, host: r, oldProgram: i, configFileParsingDiagnostics: o, typeScriptVersion: s } } function PF(e, t, r, i, o) { var s, l, f, d, g, m, v, S, x, A, w, C, P, F, B, q; let W = ba(e) ? n8e(e, t, r, i, o) : e, { rootNames: Y, options: R, configFileParsingDiagnostics: ie, projectReferences: $, typeScriptVersion: fe } = W, { oldProgram: Z } = W, U = zu(() => Jf("ignoreDeprecations", _.Invalid_value_for_ignoreDeprecations)), re, le, _e, ge, X, Ve, we, ke = new Map, Pe = Nf(), Ce = {}, Ie = {}, Be = WT(), Ne, Le, Ye, _t = typeof R.maxNodeModuleJsDepth == "number" ? R.maxNodeModuleJsDepth : 0, ct = 0, Rt = new Map, We = new Map; (s = ai) == null || s.push(ai.Phase.Program, "createProgram", { configFilePath: R.configFilePath, rootDir: R.rootDir }, !0), Fs("beforeProgram"); let qe = W.host || Hpe(R), zt = FF(qe), Qt = R.noLib, tn = zu(() => qe.getDefaultLibFileName(R)), kn = qe.getDefaultLibLocation ? qe.getDefaultLibLocation() : ni(tn()), _n = XA(), Gt = qe.getCurrentDirectory(), $n = nL(R), ui = FR(R, $n), Ni = new Map, Pi, gr, pt, nn = qe.hasInvalidatedResolutions || m0; qe.resolveModuleNameLiterals ? (pt = qe.resolveModuleNameLiterals.bind(qe), gr = (l = qe.getModuleResolutionCache) == null ? void 0 : l.call(qe)) : qe.resolveModuleNames ? (pt = (be, De, mt, St, Zt, rn) => qe.resolveModuleNames(be.map(sq), De, rn?.map(sq), mt, St, Zt).map(sn => sn ? sn.extension !== void 0 ? { resolvedModule: sn } : { resolvedModule: { ...sn, extension: jR(sn.resolvedFileName) } } : yq), gr = (f = qe.getModuleResolutionCache) == null ? void 0 : f.call(qe)) : (gr = Y3(Gt, ee, R), pt = (be, De, mt, St, Zt) => hN(be, De, mt, St, Zt, qe, gr, cq)); let Dt; if (qe.resolveTypeReferenceDirectiveReferences) Dt = qe.resolveTypeReferenceDirectiveReferences.bind(qe); else if (qe.resolveTypeReferenceDirectives) Dt = (be, De, mt, St, Zt) => qe.resolveTypeReferenceDirectives(be.map(RF), De, mt, St, Zt?.impliedNodeFormat).map(rn => ({ resolvedTypeReferenceDirective: rn })); else { let be = $3(Gt, ee, void 0, gr?.getPackageJsonInfoCache()); Dt = (De, mt, St, Zt, rn) => hN(De, mt, St, Zt, rn, qe, be, OF) } let pn = new Map, An = new Map, Kn = Nf(), hi = !1, ri = new Map, vn, Ht = qe.useCaseSensitiveFileNames() ? new Map : void 0, En, dr, Cr, Se, at = !!((d = qe.useSourceOfProjectReferenceRedirect) != null && d.call(qe)) && !R.disableSourceOfProjectReferenceRedirect, { onProgramCreateComplete: Tt, fileExists: ve, directoryExists: nt } = r8e({ compilerHost: qe, getSymlinkCache: oa, useSourceOfProjectReferenceRedirect: at, toPath: rt, getResolvedProjectReferences: Qe, getSourceOfProjectReferenceRedirect: Ws, forEachResolvedProjectReference: jo }), ce = qe.readFile.bind(qe); (g = ai) == null || g.push(ai.Phase.Program, "shouldProgramCreateNewSourceFiles", { hasOldProgram: !!Z }); let Q = t8e(Z, R); (m = ai) == null || m.pop(); let ue; if ((v = ai) == null || v.push(ai.Phase.Program, "tryReuseStructureFromOldProgram", {}), ue = Te(), (S = ai) == null || S.pop(), ue !== 2) { if (re = [], le = [], $ && (En || (En = $.map(xt)), Y.length && En?.forEach((be, De) => { if (!be) return; let mt = Ss(be.commandLine.options); if (at) { if (mt || Rl(be.commandLine.options) === 0) for (let St of be.commandLine.fileNames) Yt(St, { kind: 1, index: De }) } else if (mt) Yt(V0(mt, ".d.ts"), { kind: 2, index: De }); else if (Rl(be.commandLine.options) === 0) { let St = zu(() => XL(be.commandLine, !qe.useCaseSensitiveFileNames())); for (let Zt of be.commandLine.fileNames) !Fu(Zt) && !Gc(Zt, ".json") && Yt(qL(Zt, be.commandLine, !qe.useCaseSensitiveFileNames(), St), { kind: 2, index: De }) } })), (x = ai) == null || x.push(ai.Phase.Program, "processRootFiles", { count: Y.length }), mn(Y, (be, De) => yc(be, !1, !1, { kind: 0, index: De })), (A = ai) == null || A.pop(), Le ?? (Le = Y.length ? X3(R, qe) : Je), Ye = WT(), Le.length) { (w = ai) == null || w.push(ai.Phase.Program, "processTypeReferences", { count: Le.length }); let be = R.configFilePath ? ni(R.configFilePath) : qe.getCurrentDirectory(), De = vi(be, VF), mt = pe(Le, De); for (let St = 0; St < Le.length; St++)Ye.set(Le[St], void 0, mt[St]), Et(Le[St], void 0, mt[St], { kind: 8, typeReference: Le[St], packageId: (P = (C = mt[St]) == null ? void 0 : C.resolvedTypeReferenceDirective) == null ? void 0 : P.packageId }); (F = ai) == null || F.pop() } if (Y.length && !Qt) { let be = tn(); !R.lib && be ? yc(be, !0, !1, { kind: 6 }) : mn(R.lib, (De, mt) => { yc(Ri(De), !0, !1, { kind: 6, index: mt }) }) } vn = lo(UD(ri.entries(), ([be, De]) => De === void 0 ? be : void 0)), _e = Ag(re, ir).concat(le), re = void 0, le = void 0 } if (L.assert(!!vn), Z && qe.onReleaseOldSourceFile) { let be = Z.getSourceFiles(); for (let De of be) { let mt = Hi(De.resolvedPath); (Q || !mt || mt.impliedNodeFormat !== De.impliedNodeFormat || De.resolvedPath === De.path && mt.resolvedPath !== De.path) && qe.onReleaseOldSourceFile(De, Z.getCompilerOptions(), !!Hi(De.path)) } qe.getParsedCommandLine || Z.forEachResolvedProjectReference(De => { vc(De.sourceFile.path) || qe.onReleaseOldSourceFile(De.sourceFile, Z.getCompilerOptions(), !1) }) } Z && qe.onReleaseParsedCommandLine && gN(Z.getProjectReferences(), Z.getResolvedProjectReferences(), (be, De, mt) => { let St = De?.commandLine.projectReferences[mt] || Z.getProjectReferences()[mt], Zt = $L(St); dr?.has(rt(Zt)) || qe.onReleaseParsedCommandLine(Zt, be, Z.getCompilerOptions()) }), Z = void 0; let G = { getRootFileNames: () => Y, getSourceFile: Fa, getSourceFileByPath: Hi, getSourceFiles: () => _e, getMissingFilePaths: () => vn, getModuleResolutionCache: () => gr, getFilesByNameMap: () => ri, getCompilerOptions: () => R, getSyntacticDiagnostics: Nr, getOptionsDiagnostics: qs, getGlobalDiagnostics: As, getSemanticDiagnostics: Fo, getCachedSemanticDiagnostics: Qr, getSuggestionDiagnostics: Co, getDeclarationDiagnostics: Ki, getBindAndCheckDiagnostics: Wi, getProgramDiagnostics: gn, getTypeChecker: Kr, getClassifiableNames: Ke, getCommonSourceDirectory: Ot, emit: Si, getCurrentDirectory: () => Gt, getNodeCount: () => Kr().getNodeCount(), getIdentifierCount: () => Kr().getIdentifierCount(), getSymbolCount: () => Kr().getSymbolCount(), getTypeCount: () => Kr().getTypeCount(), getInstantiationCount: () => Kr().getInstantiationCount(), getRelationCacheSizes: () => Kr().getRelationCacheSizes(), getFileProcessingDiagnostics: () => Ne, getResolvedTypeReferenceDirectives: () => Be, getAutomaticTypeDirectiveNames: () => Le, getAutomaticTypeDirectiveResolutions: () => Ye, isSourceFileFromExternalLibrary: jr, isSourceFileDefaultLibrary: ei, getSourceFileFromReference: K, getLibFileFromReference: wt, sourceFileToPackageName: An, redirectTargetsMap: Kn, usesUriStyleNodeCoreModules: hi, isEmittedFile: Pn, getConfigFileParsingDiagnostics: jt, getProjectReferences: Vt, getResolvedProjectReferences: Qe, getProjectReferenceRedirect: Hs, getResolvedProjectReferenceToRedirect: $o, getResolvedProjectReferenceByPath: vc, forEachResolvedProjectReference: jo, isSourceOfProjectReferenceRedirect: hd, emitBuildInfo: lt, fileExists: ve, readFile: ce, directoryExists: nt, getSymlinkCache: oa, realpath: (B = qe.realpath) == null ? void 0 : B.bind(qe), useCaseSensitiveFileNames: () => qe.useCaseSensitiveFileNames(), getCanonicalFileName: ee, getFileIncludeReasons: () => Pe, structureIsReused: ue, writeFile: yt }; return Tt(), Ne?.forEach(be => { switch (be.kind) { case 1: return _n.add(Ea(be.file && Hi(be.file), be.fileProcessingReason, be.diagnostic, be.args || Je)); case 0: let { file: De, pos: mt, end: St } = YL(Hi, be.reason); return _n.add(al(De, L.checkDefined(mt), L.checkDefined(St) - mt, be.diagnostic, ...be.args || Je)); case 2: return be.diagnostics.forEach(Zt => _n.add(Zt)); default: L.assertNever(be) } }), qt(), Fs("afterProgram"), hf("Program", "beforeProgram", "afterProgram"), (q = ai) == null || q.pop(), G; function Oe(be) { var De; (De = be.resolutionDiagnostics) != null && De.length && (Ne ?? (Ne = [])).push({ kind: 2, diagnostics: be.resolutionDiagnostics }) } function je(be, De, mt, St) { if (qe.resolveModuleNameLiterals || !qe.resolveModuleNames) return Oe(mt); if (!gr || fl(De)) return; let Zt = _a(be.originalFileName, Gt), rn = ni(Zt), sn = Kt(be), Dn = gr.getFromNonRelativeNameCache(De, St, rn, sn); Dn && Oe(Dn) } function Ge(be, De, mt) { var St, Zt; if (!be.length) return Je; let rn = _a(De.originalFileName, Gt), sn = Kt(De); (St = ai) == null || St.push(ai.Phase.Program, "resolveModuleNamesWorker", { containingFileName: rn }), Fs("beforeResolveModule"); let Dn = pt(be, rn, sn, R, De, mt); return Fs("afterResolveModule"), hf("ResolveModule", "beforeResolveModule", "afterResolveModule"), (Zt = ai) == null || Zt.pop(), Dn } function kt(be, De, mt) { var St, Zt; if (!be.length) return []; let rn = Ta(De) ? void 0 : De, sn = Ta(De) ? De : _a(De.originalFileName, Gt), Dn = rn && Kt(rn); (St = ai) == null || St.push(ai.Phase.Program, "resolveTypeReferenceDirectiveNamesWorker", { containingFileName: sn }), Fs("beforeResolveTypeReference"); let kr = Dt(be, sn, Dn, R, rn, mt); return Fs("afterResolveTypeReference"), hf("ResolveTypeReference", "beforeResolveTypeReference", "afterResolveTypeReference"), (Zt = ai) == null || Zt.pop(), kr } function Kt(be) { let De = $o(be.originalFileName); if (De || !Fu(be.originalFileName)) return De; let mt = ln(be.path); if (mt) return mt; if (!qe.realpath || !R.preserveSymlinks || !jl(be.originalFileName, Wg)) return; let St = rt(qe.realpath(be.originalFileName)); return St === be.path ? void 0 : ln(St) } function ln(be) { let De = Ws(be); if (Ta(De)) return $o(De); if (De) return jo(mt => { let St = Ss(mt.commandLine.options); if (St) return rt(St) === be ? mt : void 0 }) } function ir(be, De) { return Es(ae(be), ae(De)) } function ae(be) { if (Gy(kn, be.fileName, !1)) { let De = Hl(be.fileName); if (De === "lib.d.ts" || De === "lib.es6.d.ts") return 0; let mt = pA(QC(De, "lib."), ".d.ts"), St = VO.indexOf(mt); if (St !== -1) return St + 1 } return VO.length + 2 } function rt(be) { return Ts(be, Gt, ee) } function Ot() { if (X === void 0) { let be = Pr(_e, De => pS(De, G)); X = uN(R, () => Zi(be, De => De.isDeclarationFile ? void 0 : De.fileName), Gt, ee, De => At(be, De)) } return X } function Ke() { var be; if (!we) { Kr(), we = new Set; for (let De of _e) (be = De.classifiableNames) == null || be.forEach(mt => we.add(mt)) } return we } function oe(be, De) { var mt; if (ue === 0 && !De.ambientModuleNames.length) return Ge(be, De, void 0); let St = Z && Z.getSourceFile(De.fileName); if (St !== De && De.resolvedModules) { let $t = []; for (let Xn of be) { let ra = De.resolvedModules.get(Xn.text, W_(De, Xn)); $t.push(ra) } return $t } let Zt, rn, sn, Dn = yq; for (let $t = 0; $t < be.length; $t++) { let Xn = be[$t]; if (De === St && !nn(St.path)) { let Is = W_(De, Xn), Mc = (mt = St.resolvedModules) == null ? void 0 : mt.get(Xn.text, Is); if (Mc?.resolvedModule) { ov(R, qe) && Xi(qe, Mc.resolvedModule.packageId ? _.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : _.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2, Xn.text, _a(De.originalFileName, Gt), Mc.resolvedModule.resolvedFileName, Mc.resolvedModule.packageId && hT(Mc.resolvedModule.packageId)), (rn ?? (rn = new Array(be.length)))[$t] = Mc, (sn ?? (sn = [])).push(Xn); continue } } let ra = !1; ya(De.ambientModuleNames, Xn.text) ? (ra = !0, ov(R, qe) && Xi(qe, _.Module_0_was_resolved_as_locally_declared_ambient_module_in_file_1, Xn.text, _a(De.originalFileName, Gt))) : ra = Vn(Xn), ra ? (rn || (rn = new Array(be.length)))[$t] = Dn : (Zt ?? (Zt = [])).push(Xn) } let kr = Zt && Zt.length ? Ge(Zt, De, sn) : Je; if (!rn) return L.assert(kr.length === be.length), kr; let ki = 0; for (let $t = 0; $t < rn.length; $t++)rn[$t] || (rn[$t] = kr[ki], ki++); return L.assert(ki === kr.length), rn; function Vn($t) { let Xn = kA(St, $t.text, W_(De, $t)), ra = Xn && Z.getSourceFile(Xn.resolvedFileName); if (Xn && ra) return !1; let Is = ke.get($t.text); return Is ? (ov(R, qe) && Xi(qe, _.Module_0_was_resolved_as_ambient_module_declared_in_1_since_this_file_was_not_modified, $t.text, Is), !0) : !1 } } function pe(be, De) { var mt; if (ue === 0) return kt(be, De, void 0); let St = Ta(De) ? void 0 : Z && Z.getSourceFile(De.fileName); if (!Ta(De) && St !== De && De.resolvedTypeReferenceDirectiveNames) { let $t = []; for (let Xn of be) { let ra = De.resolvedTypeReferenceDirectiveNames.get(RF(Xn), mN(Xn, De.impliedNodeFormat)); $t.push(ra) } return $t } let Zt, rn, sn, Dn = Ta(De) ? void 0 : De, kr = Ta(De) ? !nn(rt(De)) : De === St && !nn(St.path); for (let $t = 0; $t < be.length; $t++) { let Xn = be[$t]; if (kr) { let ra = RF(Xn), Is = mN(Xn, Dn?.impliedNodeFormat), Mc = (mt = Ta(De) ? Z?.getAutomaticTypeDirectiveResolutions() : St?.resolvedTypeReferenceDirectiveNames) == null ? void 0 : mt.get(ra, Is); if (Mc?.resolvedTypeReferenceDirective) { ov(R, qe) && Xi(qe, Mc.resolvedTypeReferenceDirective.packageId ? _.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : _.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2, ra, Ta(De) ? De : _a(De.originalFileName, Gt), Mc.resolvedTypeReferenceDirective.resolvedFileName, Mc.resolvedTypeReferenceDirective.packageId && hT(Mc.resolvedTypeReferenceDirective.packageId)), (rn ?? (rn = new Array(be.length)))[$t] = Mc, (sn ?? (sn = [])).push(Xn); continue } } (Zt ?? (Zt = [])).push(Xn) } if (!Zt) return rn || Je; let ki = kt(Zt, De, sn); if (!rn) return L.assert(ki.length === be.length), ki; let Vn = 0; for (let $t = 0; $t < rn.length; $t++)rn[$t] || (rn[$t] = ki[Vn], Vn++); return L.assert(Vn === ki.length), rn } function z() { return !gN(Z.getProjectReferences(), Z.getResolvedProjectReferences(), (be, De, mt) => { let St = (De ? De.commandLine.projectReferences : $)[mt], Zt = xt(St); return be ? !Zt || Zt.sourceFile !== be.sourceFile || !up(be.commandLine.fileNames, Zt.commandLine.fileNames) : Zt !== void 0 }, (be, De) => { let mt = De ? vc(De.sourceFile.path).commandLine.projectReferences : $; return !up(be, mt, tH) }) } function Te() { var be; if (!Z) return 0; let De = Z.getCompilerOptions(); if (eH(De, R)) return 0; let mt = Z.getRootFileNames(); if (!up(mt, Y) || !z()) return 0; $ && (En = $.map(xt)); let St = [], Zt = []; if (ue = 2, Z.getMissingFilePaths().some(Vn => qe.fileExists(Vn))) return 0; let rn = Z.getSourceFiles(), sn; (Vn => { Vn[Vn.Exists = 0] = "Exists", Vn[Vn.Modified = 1] = "Modified" })(sn || (sn = {})); let Dn = new Map; for (let Vn of rn) { let $t = Go(Vn.fileName, gr, qe, R), Xn = qe.getSourceFileByPath ? qe.getSourceFileByPath(Vn.fileName, Vn.resolvedPath, $t, void 0, Q || $t.impliedNodeFormat !== Vn.impliedNodeFormat) : qe.getSourceFile(Vn.fileName, $t, void 0, Q || $t.impliedNodeFormat !== Vn.impliedNodeFormat); if (!Xn) return 0; Xn.packageJsonLocations = (be = $t.packageJsonLocations) != null && be.length ? $t.packageJsonLocations : void 0, Xn.packageJsonScope = $t.packageJsonScope, L.assert(!Xn.redirectInfo, "Host should not return a redirect source file from `getSourceFile`"); let ra; if (Vn.redirectInfo) { if (Xn !== Vn.redirectInfo.unredirected) return 0; ra = !1, Xn = Vn } else if (Z.redirectTargetsMap.has(Vn.path)) { if (Xn !== Vn) return 0; ra = !1 } else ra = Xn !== Vn; Xn.path = Vn.path, Xn.originalFileName = Vn.originalFileName, Xn.resolvedPath = Vn.resolvedPath, Xn.fileName = Vn.fileName; let Is = Z.sourceFileToPackageName.get(Vn.path); if (Is !== void 0) { let Mc = Dn.get(Is), mm = ra ? 1 : 0; if (Mc !== void 0 && mm === 1 || Mc === 1) return 0; Dn.set(Is, mm) } ra ? (Vn.impliedNodeFormat !== Xn.impliedNodeFormat ? ue = 1 : up(Vn.libReferenceDirectives, Xn.libReferenceDirectives, Ql) ? Vn.hasNoDefaultLib !== Xn.hasNoDefaultLib ? ue = 1 : up(Vn.referencedFiles, Xn.referencedFiles, Ql) ? (ht(Xn), up(Vn.imports, Xn.imports, yu) && up(Vn.moduleAugmentations, Xn.moduleAugmentations, yu) ? (Vn.flags & 6291456) !== (Xn.flags & 6291456) ? ue = 1 : up(Vn.typeReferenceDirectives, Xn.typeReferenceDirectives, Ql) || (ue = 1) : ue = 1) : ue = 1 : ue = 1, Zt.push({ oldFile: Vn, newFile: Xn })) : nn(Vn.path) && (ue = 1, Zt.push({ oldFile: Vn, newFile: Xn })), St.push(Xn) } if (ue !== 2) return ue; let kr = Zt.map(Vn => Vn.oldFile); for (let Vn of rn) if (!ya(kr, Vn)) for (let $t of Vn.ambientModuleNames) ke.set($t, Vn.fileName); for (let { oldFile: Vn, newFile: $t } of Zt) { let Xn = qpe($t), ra = oe(Xn, $t); nH(Xn, $t, ra, Vn.resolvedModules, wse, QL) ? (ue = 1, $t.resolvedModules = qJ($t, Xn, ra, QL)) : $t.resolvedModules = Vn.resolvedModules; let Mc = $t.typeReferenceDirectives, mm = pe(Mc, $t); nH(Mc, $t, mm, Vn.resolvedTypeReferenceDirectiveNames, Rse, yN) ? (ue = 1, $t.resolvedTypeReferenceDirectiveNames = qJ($t, Mc, mm, yN)) : $t.resolvedTypeReferenceDirectiveNames = Vn.resolvedTypeReferenceDirectiveNames } if (ue !== 2) return ue; if (Ise(De, R)) return 1; if (qe.hasChangedAutomaticTypeDirectiveNames) { if (qe.hasChangedAutomaticTypeDirectiveNames()) return 1 } else if (Le = X3(R, qe), !up(Z.getAutomaticTypeDirectiveNames(), Le)) return 1; vn = Z.getMissingFilePaths(), L.assert(St.length === Z.getSourceFiles().length); for (let Vn of St) ri.set(Vn.path, Vn); return Z.getFilesByNameMap().forEach((Vn, $t) => { if (!Vn) { ri.set($t, Vn); return } if (Vn.path === $t) { Z.isSourceFileFromExternalLibrary(Vn) && We.set(Vn.path, !0); return } ri.set($t, ri.get(Vn.path)) }), _e = St, Pe = Z.getFileIncludeReasons(), Ne = Z.getFileProcessingDiagnostics(), Be = Z.getResolvedTypeReferenceDirectives(), Le = Z.getAutomaticTypeDirectiveNames(), Ye = Z.getAutomaticTypeDirectiveResolutions(), An = Z.sourceFileToPackageName, Kn = Z.redirectTargetsMap, hi = Z.usesUriStyleNodeCoreModules, 2 } function j(be) { return { getPrependNodes: Hn, getCanonicalFileName: ee, getCommonSourceDirectory: G.getCommonSourceDirectory, getCompilerOptions: G.getCompilerOptions, getCurrentDirectory: () => Gt, getSourceFile: G.getSourceFile, getSourceFileByPath: G.getSourceFileByPath, getSourceFiles: G.getSourceFiles, getLibFileFromReference: G.getLibFileFromReference, isSourceFileFromExternalLibrary: jr, getResolvedProjectReferenceToRedirect: $o, getProjectReferenceRedirect: Hs, isSourceOfProjectReferenceRedirect: hd, getSymlinkCache: oa, writeFile: be || yt, isEmitBlocked: Ja, readFile: De => qe.readFile(De), fileExists: De => { let mt = rt(De); return Hi(mt) ? !0 : ya(vn, mt) ? !1 : qe.fileExists(De) }, useCaseSensitiveFileNames: () => qe.useCaseSensitiveFileNames(), getBuildInfo: De => { var mt; return (mt = G.getBuildInfo) == null ? void 0 : mt.call(G, De) }, getSourceFileFromReference: (De, mt) => G.getSourceFileFromReference(De, mt), redirectTargetsMap: Kn, getFileIncludeReasons: G.getFileIncludeReasons, createHash: ho(qe, qe.createHash) } } function yt(be, De, mt, St, Zt, rn) { qe.writeFile(be, De, mt, St, Zt, rn) } function lt(be) { var De, mt; L.assert(!Ss(R)), (De = ai) == null || De.push(ai.Phase.Emit, "emitBuildInfo", {}, !0), Fs("beforeEmit"); let St = CF(LF, j(be), void 0, HK, !1, !0); return Fs("afterEmit"), hf("Emit", "beforeEmit", "afterEmit"), (mt = ai) == null || mt.pop(), St } function Qe() { return En } function Vt() { return $ } function Hn() { return fq($, (be, De) => { var mt; return (mt = En[De]) == null ? void 0 : mt.commandLine }, be => { let De = rt(be), mt = Hi(De); return mt ? mt.text : ri.has(De) ? void 0 : qe.readFile(De) }, qe) } function jr(be) { return !!We.get(be.path) } function ei(be) { if (!be.isDeclarationFile) return !1; if (be.hasNoDefaultLib) return !0; if (!R.noLib) return !1; let De = qe.useCaseSensitiveFileNames() ? z1 : W1; return R.lib ? vt(R.lib, mt => De(be.fileName, Ri(mt))) : De(be.fileName, tn()) } function Kr() { return Ve || (Ve = k_e(G)) } function Si(be, De, mt, St, Zt, rn) { var sn, Dn; (sn = ai) == null || sn.push(ai.Phase.Emit, "emit", { path: be?.path }, !0); let kr = Ps(() => Za(G, be, De, mt, St, Zt, rn)); return (Dn = ai) == null || Dn.pop(), kr } function Ja(be) { return Ni.has(rt(be)) } function Za(be, De, mt, St, Zt, rn, sn) { if (!sn) { let ki = dq(be, De, mt, St); if (ki) return ki } let Dn = Kr().getEmitResolver(Ss(R) ? void 0 : De, St); Fs("beforeEmit"); let kr = CF(Dn, j(mt), De, jK(R, rn, Zt), Zt, !1, sn); return Fs("afterEmit"), hf("Emit", "beforeEmit", "afterEmit"), kr } function Fa(be) { return Hi(rt(be)) } function Hi(be) { return ri.get(be) || void 0 } function xi(be, De, mt) { return vA(be ? De(be, mt) : Uo(G.getSourceFiles(), St => (mt && mt.throwIfCancellationRequested(), De(St, mt)))) } function Nr(be, De) { return xi(be, kc, De) } function Fo(be, De) { return xi(be, mc, De) } function Qr(be) { var De; return be ? (De = Ce.perFile) == null ? void 0 : De.get(be.path) : Ce.allDiagnostics } function Wi(be, De) { return xc(be, De) } function gn(be) { var De; if (rL(be, R, G)) return Je; let mt = _n.getDiagnostics(be.fileName); return (De = be.commentDirectives) != null && De.length ? aa(be, be.commentDirectives, mt).diagnostics : mt } function Ki(be, De) { let mt = G.getCompilerOptions(); return !be || Ss(mt) ? md(be, De) : xi(be, ss, De) } function kc(be) { return Cu(be) ? (be.additionalSyntacticDiagnostics || (be.additionalSyntacticDiagnostics = Ll(be)), Qi(be.additionalSyntacticDiagnostics, be.parseDiagnostics)) : be.parseDiagnostics } function Ps(be) { try { return be() } catch (De) { throw De instanceof tI && (Ve = void 0), De } } function mc(be, De) { return Qi(MF(xc(be, De), R), gn(be)) } function xc(be, De) { return bl(be, De, Ce, hc) } function hc(be, De) { return Ps(() => { if (rL(be, R, G)) return Je; let mt = Kr(); L.assert(!!be.bindDiagnostics); let Zt = (be.scriptKind === 1 || be.scriptKind === 2) && HR(be, R), rn = h6(be, R.checkJs), Dn = !(!!be.checkJsDirective && be.checkJsDirective.enabled === !1) && (be.scriptKind === 3 || be.scriptKind === 4 || be.scriptKind === 5 || rn || Zt || be.scriptKind === 7), kr = Dn ? be.bindDiagnostics : Je, ki = Dn ? mt.getDiagnostics(be, De) : Je; return rn && (kr = Pr(kr, Vn => jF.has(Vn.code)), ki = Pr(ki, Vn => jF.has(Vn.code))), ro(be, Dn && !rn, kr, ki, Zt ? be.jsDocDiagnostics : void 0) }) } function ro(be, De, ...mt) { var St; let Zt = t_(mt); if (!De || !((St = be.commentDirectives) != null && St.length)) return Zt; let { diagnostics: rn, directives: sn } = aa(be, be.commentDirectives, Zt); for (let Dn of sn.getUnusedExpectations()) rn.push(vH(be, Dn.range, _.Unused_ts_expect_error_directive)); return rn } function aa(be, De, mt) { let St = Gse(be, De); return { diagnostics: mt.filter(rn => gc(rn, St) === -1), directives: St } } function Co(be, De) { return Ps(() => Kr().getSuggestionDiagnostics(be, De)) } function gc(be, De) { let { file: mt, start: St } = be; if (!mt) return -1; let Zt = Sh(mt), rn = yw(Zt, St).line - 1; for (; rn >= 0;) { if (De.markUsed(rn)) return rn; let sn = mt.text.slice(Zt[rn], Zt[rn + 1]).trim(); if (sn !== "" && !/^(\s*)\/\/(.*)$/.test(sn)) return -1; rn-- } return -1 } function Ll(be) { return Ps(() => { let De = []; return mt(be, be), kO(be, mt, St), De; function mt(Dn, kr) { switch (kr.kind) { case 166: case 169: case 171: if (kr.questionToken === Dn) return De.push(sn(Dn, _.The_0_modifier_can_only_be_used_in_TypeScript_files, "?")), "skip"; case 170: case 173: case 174: case 175: case 215: case 259: case 216: case 257: if (kr.type === Dn) return De.push(sn(Dn, _.Type_annotations_can_only_be_used_in_TypeScript_files)), "skip" }switch (Dn.kind) { case 270: if (Dn.isTypeOnly) return De.push(sn(kr, _._0_declarations_can_only_be_used_in_TypeScript_files, "import type")), "skip"; break; case 275: if (Dn.isTypeOnly) return De.push(sn(Dn, _._0_declarations_can_only_be_used_in_TypeScript_files, "export type")), "skip"; break; case 273: case 278: if (Dn.isTypeOnly) return De.push(sn(Dn, _._0_declarations_can_only_be_used_in_TypeScript_files, $u(Dn) ? "import...type" : "export...type")), "skip"; break; case 268: return De.push(sn(Dn, _.import_can_only_be_used_in_TypeScript_files)), "skip"; case 274: if (Dn.isExportEquals) return De.push(sn(Dn, _.export_can_only_be_used_in_TypeScript_files)), "skip"; break; case 294: if (Dn.token === 117) return De.push(sn(Dn, _.implements_clauses_can_only_be_used_in_TypeScript_files)), "skip"; break; case 261: let Vn = Xa(118); return L.assertIsDefined(Vn), De.push(sn(Dn, _._0_declarations_can_only_be_used_in_TypeScript_files, Vn)), "skip"; case 264: let $t = Dn.flags & 16 ? Xa(143) : Xa(142); return L.assertIsDefined($t), De.push(sn(Dn, _._0_declarations_can_only_be_used_in_TypeScript_files, $t)), "skip"; case 262: return De.push(sn(Dn, _.Type_aliases_can_only_be_used_in_TypeScript_files)), "skip"; case 263: let Xn = L.checkDefined(Xa(92)); return De.push(sn(Dn, _._0_declarations_can_only_be_used_in_TypeScript_files, Xn)), "skip"; case 232: return De.push(sn(Dn, _.Non_null_assertions_can_only_be_used_in_TypeScript_files)), "skip"; case 231: return De.push(sn(Dn.type, _.Type_assertion_expressions_can_only_be_used_in_TypeScript_files)), "skip"; case 235: return De.push(sn(Dn.type, _.Type_satisfaction_expressions_can_only_be_used_in_TypeScript_files)), "skip"; case 213: L.fail() } } function St(Dn, kr) { if (aJ(kr)) { let ki = wr(kr.modifiers, du); ki && De.push(sn(ki, _.Decorators_are_not_valid_here)) } else if (HS(kr) && kr.modifiers) { let ki = Yc(kr.modifiers, du); if (ki >= 0) { if (ha(kr) && !R.experimentalDecorators) De.push(sn(kr.modifiers[ki], _.Decorators_are_not_valid_here)); else if (sl(kr)) { let Vn = Yc(kr.modifiers, c3); if (Vn >= 0) { let $t = Yc(kr.modifiers, kue); if (ki > Vn && $t >= 0 && ki < $t) De.push(sn(kr.modifiers[ki], _.Decorators_are_not_valid_here)); else if (Vn >= 0 && ki < Vn) { let Xn = Yc(kr.modifiers, du, Vn); Xn >= 0 && De.push(Ao(sn(kr.modifiers[Xn], _.Decorators_may_not_appear_after_export_or_export_default_if_they_also_appear_before_export), sn(kr.modifiers[ki], _.Decorator_used_before_export_here))) } } } } } switch (kr.kind) { case 260: case 228: case 171: case 173: case 174: case 175: case 215: case 259: case 216: if (Dn === kr.typeParameters) return De.push(rn(Dn, _.Type_parameter_declarations_can_only_be_used_in_TypeScript_files)), "skip"; case 240: if (Dn === kr.modifiers) return Zt(kr.modifiers, kr.kind === 240), "skip"; break; case 169: if (Dn === kr.modifiers) { for (let ki of Dn) Ha(ki) && ki.kind !== 124 && ki.kind !== 127 && De.push(sn(ki, _.The_0_modifier_can_only_be_used_in_TypeScript_files, Xa(ki.kind))); return "skip" } break; case 166: if (Dn === kr.modifiers && vt(Dn, Ha)) return De.push(rn(Dn, _.Parameter_modifiers_can_only_be_used_in_TypeScript_files)), "skip"; break; case 210: case 211: case 230: case 282: case 283: case 212: if (Dn === kr.typeArguments) return De.push(rn(Dn, _.Type_arguments_can_only_be_used_in_TypeScript_files)), "skip"; break } } function Zt(Dn, kr) { for (let ki of Dn) switch (ki.kind) { case 85: if (kr) continue; case 123: case 121: case 122: case 146: case 136: case 126: case 161: case 101: case 145: De.push(sn(ki, _.The_0_modifier_can_only_be_used_in_TypeScript_files, Xa(ki.kind))); break; case 124: case 93: case 88: case 127: } } function rn(Dn, kr, ki, Vn, $t) { let Xn = Dn.pos; return al(be, Xn, Dn.end - Xn, kr, ki, Vn, $t) } function sn(Dn, kr, ki, Vn, $t) { return Nu(be, Dn, kr, ki, Vn, $t) } }) } function md(be, De) { return bl(be, De, Ie, Pc) } function Pc(be, De) { return Ps(() => { let mt = Kr().getEmitResolver(be, De); return Tpe(j(Ba), mt, be) || Je }) } function bl(be, De, mt, St) { var Zt; let rn = be ? (Zt = mt.perFile) == null ? void 0 : Zt.get(be.path) : mt.allDiagnostics; if (rn) return rn; let sn = St(be, De); return be ? (mt.perFile || (mt.perFile = new Map)).set(be.path, sn) : mt.allDiagnostics = sn, sn } function ss(be, De) { return be.isDeclarationFile ? [] : md(be, De) } function qs() { return vA(Qi(_n.getGlobalDiagnostics(), Rs())) } function Rs() { if (!R.configFile) return Je; let be = _n.getDiagnostics(R.configFile.fileName); return jo(De => { be = Qi(be, _n.getDiagnostics(De.sourceFile.fileName)) }), be } function As() { return Y.length ? vA(Kr().getGlobalDiagnostics().slice()) : Je } function jt() { return ie || Je } function yc(be, De, mt, St) { ft(So(be), De, mt, void 0, St) } function Ql(be, De) { return be.fileName === De.fileName } function yu(be, De) { return be.kind === 79 ? De.kind === 79 && be.escapedText === De.escapedText : De.kind === 10 && be.text === De.text } function se(be, De) { let mt = D.createStringLiteral(be), St = D.createImportDeclaration(void 0, void 0, mt, void 0); return SS(St, 2), go(mt, St), go(St, De), mt.flags &= -9, St.flags &= -9, mt } function ht(be) { if (be.imports) return; let De = Cu(be), mt = Lc(be), St, Zt, rn; if ((d_(R) || mt) && !be.isDeclarationFile) { R.importHelpers && (St = [se(_b, be)]); let Vn = p4(_4(R, be), R); Vn && (St || (St = [])).push(se(Vn, be)) } for (let Vn of be.statements) Dn(Vn, !1); let sn = De && $s(R) !== 100; (be.flags & 2097152 || sn) && kr(be), be.imports = St || Je, be.moduleAugmentations = Zt || Je, be.ambientModuleNames = rn || Je; return; function Dn(Vn, $t) { if (Uw(Vn)) { let Xn = UA(Vn); Xn && yo(Xn) && Xn.text && (!$t || !fl(Xn.text)) && (Zy(Vn, !1), St = Sn(St, Xn), !hi && ct === 0 && !be.isDeclarationFile && (hi = na(Xn.text, "node:"))) } else if (Tc(Vn) && lu(Vn) && ($t || Mr(Vn, 2) || be.isDeclarationFile)) { Vn.name.parent = Vn; let Xn = l_(Vn.name); if (mt || $t && !fl(Xn)) (Zt || (Zt = [])).push(Vn.name); else if (!$t) { be.isDeclarationFile && (rn || (rn = [])).push(Xn); let ra = Vn.body; if (ra) for (let Is of ra.statements) Dn(Is, !0) } } } function kr(Vn) { let $t = /import|require/g; for (; $t.exec(Vn.text) !== null;) { let Xn = ki(Vn, $t.lastIndex); sn && qu(Xn, !0) || Dd(Xn) && Xn.arguments.length >= 1 && es(Xn.arguments[0]) ? (Zy(Xn, !1), St = Sn(St, Xn.arguments[0])) : ib(Xn) && (Zy(Xn, !1), St = Sn(St, Xn.argument.literal)) } } function ki(Vn, $t) { let Xn = Vn, ra = Is => { if (Is.pos <= $t && ($t < Is.end || $t === Is.end && Is.kind === 1)) return Is }; for (; ;) { let Is = De && Kd(Xn) && mn(Xn.jsDoc, ra) || pa(Xn, ra); if (!Is) return Xn; Xn = Is } } } function wt(be) { let De = n_(be.fileName), mt = jO.get(De); if (mt) return Fa(Ri(mt)) } function K(be, De) { return Xe(wF(De.fileName, be.fileName), Fa) } function Xe(be, De, mt, St) { if (gA(be)) { let Zt = qe.getCanonicalFileName(be); if (!R.allowNonTsExtensions && !mn(t_(ui), sn => Gc(Zt, sn))) { mt && (ES(Zt) ? mt(_.File_0_is_a_JavaScript_file_Did_you_mean_to_enable_the_allowJs_option, be) : mt(_.File_0_has_an_unsupported_extension_The_only_supported_extensions_are_1, be, "'" + t_($n).join("', '") + "'")); return } let rn = De(be); if (mt) if (rn) vb(St) && Zt === qe.getCanonicalFileName(Hi(St.file).fileName) && mt(_.A_file_cannot_have_a_reference_to_itself); else { let sn = Hs(be); sn ? mt(_.Output_file_0_has_not_been_built_from_source_file_1, sn, be) : mt(_.File_0_not_found, be) } return rn } else { let Zt = R.allowNonTsExtensions && De(be); if (Zt) return Zt; if (mt && R.allowNonTsExtensions) { mt(_.File_0_not_found, be); return } let rn = mn($n[0], sn => De(be + sn)); return mt && !rn && mt(_.Could_not_resolve_the_path_0_with_the_extensions_Colon_1, be, "'" + t_($n).join("', '") + "'"), rn } } function ft(be, De, mt, St, Zt) { Xe(be, rn => ta(rn, De, mt, Zt, St), (rn, ...sn) => bo(void 0, Zt, rn, sn), Zt) } function Yt(be, De) { return ft(be, !1, !1, void 0, De) } function pr(be, De, mt) { !vb(mt) && vt(Pe.get(De.path), vb) ? bo(De, mt, _.Already_included_file_name_0_differs_from_file_name_1_only_in_casing, [De.fileName, be]) : bo(De, mt, _.File_name_0_differs_from_already_included_file_name_1_only_in_casing, [be, De.fileName]) } function yr(be, De, mt, St, Zt, rn, sn) { var Dn; let kr = fm.createRedirectedSourceFile({ redirectTarget: be, unredirected: De }); return kr.fileName = mt, kr.path = St, kr.resolvedPath = Zt, kr.originalFileName = rn, kr.packageJsonLocations = (Dn = sn.packageJsonLocations) != null && Dn.length ? sn.packageJsonLocations : void 0, kr.packageJsonScope = sn.packageJsonScope, We.set(St, ct > 0), kr } function ta(be, De, mt, St, Zt) { var rn, sn; (rn = ai) == null || rn.push(ai.Phase.Program, "findSourceFile", { fileName: be, isDefaultLib: De || void 0, fileIncludeKind: R8[St.kind] }); let Dn = Ka(be, De, mt, St, Zt); return (sn = ai) == null || sn.pop(), Dn } function Go(be, De, mt, St) { let Zt = uq(_a(be, Gt), De?.getPackageJsonInfoCache(), mt, St), rn = Do(St), sn = OR(St); return typeof Zt == "object" ? { ...Zt, languageVersion: rn, setExternalModuleIndicator: sn } : { languageVersion: rn, impliedNodeFormat: Zt, setExternalModuleIndicator: sn } } function Ka(be, De, mt, St, Zt) { var rn, sn; let Dn = rt(be); if (at) { let Xn = Ws(Dn); if (!Xn && qe.realpath && R.preserveSymlinks && Fu(be) && jl(be, Wg)) { let ra = rt(qe.realpath(be)); ra !== Dn && (Xn = Ws(ra)) } if (Xn) { let ra = Ta(Xn) ? ta(Xn, De, mt, St, Zt) : void 0; return ra && ka(ra, Dn, void 0), ra } } let kr = be; if (ri.has(Dn)) { let Xn = ri.get(Dn); if (vo(Xn || void 0, St), Xn && R.forceConsistentCasingInFileNames !== !1) { let ra = Xn.fileName; rt(ra) !== rt(be) && (be = Hs(be) || be); let Mc = lj(ra, Gt), mm = lj(be, Gt); Mc !== mm && pr(be, Xn, St) } return Xn && We.get(Xn.path) && ct === 0 ? (We.set(Xn.path, !1), R.noResolve || (nf(Xn, De), ye(Xn)), R.noLib || io(Xn), Rt.set(Xn.path, !1), Ze(Xn)) : Xn && Rt.get(Xn.path) && ct < _t && (Rt.set(Xn.path, !1), Ze(Xn)), Xn || void 0 } let ki; if (vb(St) && !at) { let Xn = Uc(be); if (Xn) { if (Ss(Xn.commandLine.options)) return; let ra = Gu(Xn, be); be = ra, ki = rt(ra) } } let Vn = Go(be, gr, qe, R), $t = qe.getSourceFile(be, Vn, Xn => bo(void 0, St, _.Cannot_read_file_0_Colon_1, [be, Xn]), Q || ((rn = Z?.getSourceFileByPath(rt(be))) == null ? void 0 : rn.impliedNodeFormat) !== Vn.impliedNodeFormat); if (Zt) { let Xn = hT(Zt), ra = pn.get(Xn); if (ra) { let Is = yr(ra, $t, be, Dn, rt(be), kr, Vn); return Kn.add(ra.path, be), ka(Is, Dn, ki), vo(Is, St), An.set(Dn, p6(Zt)), le.push(Is), Is } else $t && (pn.set(Xn, $t), An.set(Dn, p6(Zt))) } if (ka($t, Dn, ki), $t) { if (We.set(Dn, ct > 0), $t.fileName = be, $t.path = Dn, $t.resolvedPath = rt(be), $t.originalFileName = kr, $t.packageJsonLocations = (sn = Vn.packageJsonLocations) != null && sn.length ? Vn.packageJsonLocations : void 0, $t.packageJsonScope = Vn.packageJsonScope, vo($t, St), qe.useCaseSensitiveFileNames()) { let Xn = n_(Dn), ra = Ht.get(Xn); ra ? pr(be, ra, St) : Ht.set(Xn, $t) } Qt = Qt || $t.hasNoDefaultLib && !mt, R.noResolve || (nf($t, De), ye($t)), R.noLib || io($t), Ze($t), De ? re.push($t) : le.push($t) } return $t } function vo(be, De) { be && Pe.add(be.path, De) } function ka(be, De, mt) { mt ? (ri.set(mt, be), ri.set(De, be || !1)) : ri.set(De, be) } function Hs(be) { let De = Uc(be); return De && Gu(De, be) } function Uc(be) { if (!(!En || !En.length || Fu(be) || Gc(be, ".json"))) return $o(be) } function Gu(be, De) { let mt = Ss(be.commandLine.options); return mt ? V0(mt, ".d.ts") : qL(De, be.commandLine, !qe.useCaseSensitiveFileNames()) } function $o(be) { Cr === void 0 && (Cr = new Map, jo(mt => { rt(R.configFilePath) !== mt.sourceFile.path && mt.commandLine.fileNames.forEach(St => Cr.set(rt(St), mt.sourceFile.path)) })); let De = Cr.get(rt(be)); return De && vc(De) } function jo(be) { return Kpe(En, be) } function Ws(be) { if (Fu(be)) return Se === void 0 && (Se = new Map, jo(De => { let mt = Ss(De.commandLine.options); if (mt) { let St = V0(mt, ".d.ts"); Se.set(rt(St), !0) } else { let St = zu(() => XL(De.commandLine, !qe.useCaseSensitiveFileNames())); mn(De.commandLine.fileNames, Zt => { if (!Fu(Zt) && !Gc(Zt, ".json")) { let rn = qL(Zt, De.commandLine, !qe.useCaseSensitiveFileNames(), St); Se.set(rt(rn), Zt) } }) } })), Se.get(be) } function hd(be) { return at && !!$o(be) } function vc(be) { if (dr) return dr.get(be) || void 0 } function nf(be, De) { mn(be.referencedFiles, (mt, St) => { ft(wF(mt.fileName, be.fileName), De, !1, void 0, { kind: 4, file: be.path, index: St }) }) } function ye(be) { let De = be.typeReferenceDirectives; if (!De.length) { be.resolvedTypeReferenceDirectiveNames = void 0; return } let mt = pe(De, be); for (let St = 0; St < De.length; St++) { let Zt = be.typeReferenceDirectives[St], rn = mt[St], sn = n_(Zt.fileName); Dse(be, sn, rn, mN(Zt, be.impliedNodeFormat)); let Dn = Zt.resolutionMode || be.impliedNodeFormat; Dn && $s(R) !== 3 && $s(R) !== 99 && (Ne ?? (Ne = [])).push({ kind: 2, diagnostics: [vH(be, Zt, _.resolution_mode_assertions_are_only_supported_when_moduleResolution_is_node16_or_nodenext)] }), Et(sn, Dn, rn, { kind: 5, file: be.path, index: St }) } } function Et(be, De, mt, St) { var Zt, rn; (Zt = ai) == null || Zt.push(ai.Phase.Program, "processTypeReferenceDirective", { directive: be, hasResolved: !!mt.resolvedTypeReferenceDirective, refKind: St.kind, refPath: vb(St) ? St.file : void 0 }), bn(be, De, mt, St), (rn = ai) == null || rn.pop() } function bn(be, De, mt, St) { var Zt; Oe(mt); let rn = (Zt = Be.get(be, De)) == null ? void 0 : Zt.resolvedTypeReferenceDirective; if (rn && rn.primary) return; let sn = !0, { resolvedTypeReferenceDirective: Dn } = mt; if (Dn) { if (Dn.isExternalLibraryImport && ct++, Dn.primary) ft(Dn.resolvedFileName, !1, !1, Dn.packageId, St); else if (rn) { if (Dn.resolvedFileName !== rn.resolvedFileName) { let kr = qe.readFile(Dn.resolvedFileName), ki = Fa(rn.resolvedFileName); kr !== ki.text && bo(ki, St, _.Conflicting_definitions_for_0_found_at_1_and_2_Consider_installing_a_specific_version_of_this_library_to_resolve_the_conflict, [be, Dn.resolvedFileName, rn.resolvedFileName]) } sn = !1 } else ft(Dn.resolvedFileName, !1, !1, Dn.packageId, St); Dn.isExternalLibraryImport && ct-- } else bo(void 0, St, _.Cannot_find_type_definition_file_for_0, [be]); sn && Be.set(be, De, mt) } function Ri(be) { let De = be.split("."), mt = De[1], St = 2; for (; De[St] && De[St] !== "d";)mt += (St === 2 ? "/" : "-") + De[St], St++; let Zt = vi(Gt, `__lib_node_modules_lookup_${be}__.ts`), rn = FL("@typescript/lib-" + mt, Zt, { moduleResolution: 2 }, qe, gr); return rn?.resolvedModule ? rn.resolvedModule.resolvedFileName : vi(kn, be) } function io(be) { mn(be.libReferenceDirectives, (De, mt) => { let St = n_(De.fileName), Zt = jO.get(St); if (Zt) yc(Ri(Zt), !0, !0, { kind: 7, file: be.path, index: mt }); else { let rn = pA(QC(St, "lib."), ".d.ts"), sn = $C(rn, VO, Ks), Dn = sn ? _.Cannot_find_lib_definition_for_0_Did_you_mean_1 : _.Cannot_find_lib_definition_for_0; (Ne || (Ne = [])).push({ kind: 0, reason: { kind: 7, file: be.path, index: mt }, diagnostic: Dn, args: [St, sn] }) } }) } function ee(be) { return qe.getCanonicalFileName(be) } function Ze(be) { var De; if (ht(be), be.imports.length || be.moduleAugmentations.length) { let mt = qpe(be), St = oe(mt, be); L.assert(St.length === mt.length); let Zt = (at ? (De = Kt(be)) == null ? void 0 : De.commandLine.options : void 0) || R; for (let rn = 0; rn < mt.length; rn++) { let sn = St[rn].resolvedModule, Dn = mt[rn].text, kr = W_(be, mt[rn]); if (kse(be, Dn, St[rn], kr), je(be, Dn, St[rn], kr), !sn) continue; let ki = sn.isExternalLibraryImport, Vn = !VR(sn.extension), $t = ki && Vn, Xn = sn.resolvedFileName; ki && ct++; let ra = $t && ct > _t, Is = Xn && !_q(Zt, sn, be) && !Zt.noResolve && rn < be.imports.length && !ra && !(Vn && !PR(Zt)) && (Yn(be.imports[rn]) || !(be.imports[rn].flags & 8388608)); ra ? Rt.set(be.path, !0) : Is && ta(Xn, !1, !1, { kind: 3, file: be.path, index: rn }, sn.packageId), ki && ct-- } } else be.resolvedModules = void 0 } function At(be, De) { let mt = !0, St = qe.getCanonicalFileName(_a(De, Gt)); for (let Zt of be) Zt.isDeclarationFile || qe.getCanonicalFileName(_a(Zt.fileName, Gt)).indexOf(St) !== 0 && (Qo(Zt, _.File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files, [Zt.fileName, De]), mt = !1); return mt } function xt(be) { dr || (dr = new Map); let De = $L(be), mt = rt(De), St = dr.get(mt); if (St !== void 0) return St || void 0; let Zt, rn; if (qe.getParsedCommandLine) { if (Zt = qe.getParsedCommandLine(De), !Zt) { ka(void 0, mt, void 0), dr.set(mt, !1); return } rn = L.checkDefined(Zt.options.configFile), L.assert(!rn.path || rn.path === mt), ka(rn, mt, void 0) } else { let Dn = _a(ni(De), qe.getCurrentDirectory()); if (rn = qe.getSourceFile(De, 100), ka(rn, mt, void 0), rn === void 0) { dr.set(mt, !1); return } Zt = MO(rn, zt, Dn, void 0, De) } rn.fileName = De, rn.path = mt, rn.resolvedPath = mt, rn.originalFileName = De; let sn = { commandLine: Zt, sourceFile: rn }; return dr.set(mt, sn), Zt.projectReferences && (sn.references = Zt.projectReferences.map(xt)), sn } function qt() { R.strictPropertyInitialization && !Uf(R, "strictNullChecks") && Io(_.Option_0_cannot_be_specified_without_specifying_option_1, "strictPropertyInitialization", "strictNullChecks"), R.exactOptionalPropertyTypes && !Uf(R, "strictNullChecks") && Io(_.Option_0_cannot_be_specified_without_specifying_option_1, "exactOptionalPropertyTypes", "strictNullChecks"), (R.isolatedModules || R.verbatimModuleSyntax) && (R.out && Io(_.Option_0_cannot_be_specified_with_option_1, "out", R.verbatimModuleSyntax ? "verbatimModuleSyntax" : "isolatedModules"), R.outFile && Io(_.Option_0_cannot_be_specified_with_option_1, "outFile", R.verbatimModuleSyntax ? "verbatimModuleSyntax" : "isolatedModules")), R.inlineSourceMap && (R.sourceMap && Io(_.Option_0_cannot_be_specified_with_option_1, "sourceMap", "inlineSourceMap"), R.mapRoot && Io(_.Option_0_cannot_be_specified_with_option_1, "mapRoot", "inlineSourceMap")), R.composite && (R.declaration === !1 && Io(_.Composite_projects_may_not_disable_declaration_emit, "declaration"), R.incremental === !1 && Io(_.Composite_projects_may_not_disable_incremental_compilation, "declaration")); let be = Ss(R); if (R.tsBuildInfoFile ? NR(R) || Io(_.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "tsBuildInfoFile", "incremental", "composite") : R.incremental && !be && !R.configFilePath && _n.add(ps(_.Option_incremental_can_only_be_specified_using_tsconfig_emitting_to_single_file_or_when_option_tsBuildInfoFile_is_specified)), Vr(), Bu(), R.composite) { let sn = new Set(Y.map(rt)); for (let Dn of _e) pS(Dn, G) && !sn.has(Dn.path) && Qo(Dn, _.File_0_is_not_listed_within_the_file_list_of_project_1_Projects_must_list_all_files_or_use_an_include_pattern, [Dn.fileName, R.configFilePath || ""]) } if (R.paths) { for (let sn in R.paths) if (fs(R.paths, sn)) if (CW(sn) || Dc(!0, sn, _.Pattern_0_can_have_at_most_one_Asterisk_character, sn), ba(R.paths[sn])) { let Dn = R.paths[sn].length; Dn === 0 && Dc(!1, sn, _.Substitutions_for_pattern_0_shouldn_t_be_an_empty_array, sn); for (let kr = 0; kr < Dn; kr++) { let ki = R.paths[sn][kr], Vn = typeof ki; Vn === "string" ? (CW(ki) || Pd(sn, kr, _.Substitution_0_in_pattern_1_can_have_at_most_one_Asterisk_character, ki, sn), !R.baseUrl && !Jd(ki) && !nI(ki) && Pd(sn, kr, _.Non_relative_paths_are_not_allowed_when_baseUrl_is_not_set_Did_you_forget_a_leading_Slash)) : Pd(sn, kr, _.Substitution_0_for_pattern_1_has_incorrect_type_expected_string_got_2, ki, sn, Vn) } } else Dc(!1, sn, _.Substitutions_for_pattern_0_should_be_an_array, sn) } !R.sourceMap && !R.inlineSourceMap && (R.inlineSources && Io(_.Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided, "inlineSources"), R.sourceRoot && Io(_.Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided, "sourceRoot")), R.out && R.outFile && Io(_.Option_0_cannot_be_specified_with_option_1, "out", "outFile"), R.mapRoot && !(R.sourceMap || R.declarationMap) && Io(_.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "mapRoot", "sourceMap", "declarationMap"), R.declarationDir && (__(R) || Io(_.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "declarationDir", "declaration", "composite"), be && Io(_.Option_0_cannot_be_specified_with_option_1, "declarationDir", R.out ? "out" : "outFile")), R.declarationMap && !__(R) && Io(_.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "declarationMap", "declaration", "composite"), R.lib && R.noLib && Io(_.Option_0_cannot_be_specified_with_option_1, "lib", "noLib"), R.noImplicitUseStrict && Uf(R, "alwaysStrict") && Io(_.Option_0_cannot_be_specified_with_option_1, "noImplicitUseStrict", "alwaysStrict"); let De = Do(R), mt = wr(_e, sn => Lc(sn) && !sn.isDeclarationFile); if (R.isolatedModules || R.verbatimModuleSyntax) R.module === 0 && De < 2 && R.isolatedModules && Io(_.Option_isolatedModules_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES2015_or_higher, "isolatedModules", "target"), R.preserveConstEnums === !1 && Io(_.Option_preserveConstEnums_cannot_be_disabled_when_0_is_enabled, R.verbatimModuleSyntax ? "verbatimModuleSyntax" : "isolatedModules", "preserveConstEnums"); else if (mt && De < 2 && R.module === 0) { let sn = w0(mt, typeof mt.externalModuleIndicator == "boolean" ? mt : mt.externalModuleIndicator); _n.add(al(mt, sn.start, sn.length, _.Cannot_use_imports_exports_or_module_augmentations_when_module_is_none)) } if (be && !R.emitDeclarationOnly) { if (R.module && !(R.module === 2 || R.module === 4)) Io(_.Only_amd_and_system_modules_are_supported_alongside_0, R.out ? "out" : "outFile", "module"); else if (R.module === void 0 && mt) { let sn = w0(mt, typeof mt.externalModuleIndicator == "boolean" ? mt : mt.externalModuleIndicator); _n.add(al(mt, sn.start, sn.length, _.Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system, R.out ? "out" : "outFile")) } } if (RT(R) && ($s(R) === 1 ? Io(_.Option_resolveJsonModule_cannot_be_specified_when_moduleResolution_is_set_to_classic, "resolveJsonModule") : l4(R) || Io(_.Option_resolveJsonModule_can_only_be_specified_when_module_code_generation_is_commonjs_amd_es2015_or_esNext, "resolveJsonModule", "module")), R.outDir || R.rootDir || R.sourceRoot || R.mapRoot) { let sn = Ot(); R.outDir && sn === "" && _e.some(Dn => _p(Dn.fileName) > 1) && Io(_.Cannot_find_the_common_subdirectory_path_for_the_input_files, "outDir") } R.useDefineForClassFields && De === 0 && Io(_.Option_0_cannot_be_specified_when_option_target_is_ES3, "useDefineForClassFields"), R.checkJs && !PR(R) && _n.add(ps(_.Option_0_cannot_be_specified_without_specifying_option_1, "checkJs", "allowJs")), R.emitDeclarationOnly && (__(R) || Io(_.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "emitDeclarationOnly", "declaration", "composite"), R.noEmit && Io(_.Option_0_cannot_be_specified_with_option_1, "emitDeclarationOnly", "noEmit")), R.emitDecoratorMetadata && !R.experimentalDecorators && Io(_.Option_0_cannot_be_specified_without_specifying_option_1, "emitDecoratorMetadata", "experimentalDecorators"), R.jsxFactory ? (R.reactNamespace && Io(_.Option_0_cannot_be_specified_with_option_1, "reactNamespace", "jsxFactory"), (R.jsx === 4 || R.jsx === 5) && Io(_.Option_0_cannot_be_specified_when_option_jsx_is_1, "jsxFactory", NL.get("" + R.jsx)), zS(R.jsxFactory, De) || Jf("jsxFactory", _.Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name, R.jsxFactory)) : R.reactNamespace && !i_(R.reactNamespace, De) && Jf("reactNamespace", _.Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier, R.reactNamespace), R.jsxFragmentFactory && (R.jsxFactory || Io(_.Option_0_cannot_be_specified_without_specifying_option_1, "jsxFragmentFactory", "jsxFactory"), (R.jsx === 4 || R.jsx === 5) && Io(_.Option_0_cannot_be_specified_when_option_jsx_is_1, "jsxFragmentFactory", NL.get("" + R.jsx)), zS(R.jsxFragmentFactory, De) || Jf("jsxFragmentFactory", _.Invalid_value_for_jsxFragmentFactory_0_is_not_a_valid_identifier_or_qualified_name, R.jsxFragmentFactory)), R.reactNamespace && (R.jsx === 4 || R.jsx === 5) && Io(_.Option_0_cannot_be_specified_when_option_jsx_is_1, "reactNamespace", NL.get("" + R.jsx)), R.jsxImportSource && R.jsx === 2 && Io(_.Option_0_cannot_be_specified_when_option_jsx_is_1, "jsxImportSource", NL.get("" + R.jsx)), R.preserveValueImports && Rl(R) < 5 && Io(_.Option_0_can_only_be_used_when_module_is_set_to_es2015_or_later, "preserveValueImports"); let St = Rl(R); R.verbatimModuleSyntax && ((St === 2 || St === 3 || St === 4) && Io(_.Option_verbatimModuleSyntax_cannot_be_used_when_module_is_set_to_UMD_AMD_or_System, "verbatimModuleSyntax"), R.isolatedModules && He("isolatedModules", "verbatimModuleSyntax"), R.preserveValueImports && He("preserveValueImports", "verbatimModuleSyntax"), R.importsNotUsedAsValues && He("importsNotUsedAsValues", "verbatimModuleSyntax")), R.allowImportingTsExtensions && !(R.noEmit || R.emitDeclarationOnly) && Jf("allowImportingTsExtensions", _.Option_allowImportingTsExtensions_can_only_be_used_when_either_noEmit_or_emitDeclarationOnly_is_set); let Zt = $s(R); if (R.resolvePackageJsonExports && !bS(Zt) && Io(_.Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler, "resolvePackageJsonExports"), R.resolvePackageJsonImports && !bS(Zt) && Io(_.Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler, "resolvePackageJsonImports"), R.customConditions && !bS(Zt) && Io(_.Option_0_can_only_be_used_when_moduleResolution_is_set_to_node16_nodenext_or_bundler, "customConditions"), Zt === 100 && !SW(St) && Jf("moduleResolution", _.Option_0_can_only_be_used_when_module_is_set_to_es2015_or_later, "bundler"), !R.noEmit && !R.suppressOutputPathCheck) { let sn = j(), Dn = new Set; WK(sn, kr => { R.emitDeclarationOnly || rn(kr.jsFilePath, Dn), rn(kr.declarationFilePath, Dn) }) } function rn(sn, Dn) { if (sn) { let kr = rt(sn); if (ri.has(kr)) { let Vn; R.configFilePath || (Vn = da(void 0, _.Adding_a_tsconfig_json_file_will_help_organize_projects_that_contain_both_TypeScript_and_JavaScript_files_Learn_more_at_https_Colon_Slash_Slashaka_ms_Slashtsconfig)), Vn = da(Vn, _.Cannot_write_file_0_because_it_would_overwrite_input_file, sn), Nt(sn, s4(Vn)) } let ki = qe.useCaseSensitiveFileNames() ? kr : n_(kr); Dn.has(ki) ? Nt(sn, ps(_.Cannot_write_file_0_because_it_would_be_overwritten_by_multiple_input_files, sn)) : Dn.add(ki) } } } function Ln() { let be = R.ignoreDeprecations; if (be) { if (be === "5.0") return new r_(be); U() } return r_.zero } function mr(be, De, mt, St) { let Zt = new r_(be), rn = new r_(De), sn = new r_(fe || Sg), Dn = Ln(), kr = rn.compareTo(sn) !== 1, ki = !kr && Dn.compareTo(Zt) === -1; (kr || ki) && St((Vn, $t, Xn) => { kr ? $t === void 0 ? mt(Vn, $t, Xn, _.Option_0_has_been_removed_Please_remove_it_from_your_configuration, Vn) : mt(Vn, $t, Xn, _.Option_0_1_has_been_removed_Please_remove_it_from_your_configuration, Vn, $t) : $t === void 0 ? mt(Vn, $t, Xn, _.Option_0_is_deprecated_and_will_stop_functioning_in_TypeScript_1_Specify_compilerOption_ignoreDeprecations_Colon_2_to_silence_this_error, Vn, De, be) : mt(Vn, $t, Xn, _.Option_0_1_is_deprecated_and_will_stop_functioning_in_TypeScript_2_Specify_compilerOption_ignoreDeprecations_Colon_3_to_silence_this_error, Vn, $t, De, be) }) } function Vr() { function be(De, mt, St, Zt, rn, sn, Dn, kr) { if (St) { let ki = da(void 0, _.Use_0_instead, St), Vn = da(ki, Zt, rn, sn, Dn, kr); E_(!mt, De, void 0, Vn) } else E_(!mt, De, void 0, Zt, rn, sn, Dn, kr) } mr("5.0", "5.5", be, De => { R.target === 0 && De("target", "ES3"), R.noImplicitUseStrict && De("noImplicitUseStrict"), R.keyofStringsOnly && De("keyofStringsOnly"), R.suppressExcessPropertyErrors && De("suppressExcessPropertyErrors"), R.suppressImplicitAnyIndexErrors && De("suppressImplicitAnyIndexErrors"), R.noStrictGenericChecks && De("noStrictGenericChecks"), R.charset && De("charset"), R.out && De("out", void 0, "outFile"), R.importsNotUsedAsValues && De("importsNotUsedAsValues", void 0, "verbatimModuleSyntax"), R.preserveValueImports && De("preserveValueImports", void 0, "verbatimModuleSyntax") }) } function gi(be, De, mt) { function St(Zt, rn, sn, Dn, kr, ki, Vn, $t) { Fd(De, mt, Dn, kr, ki, Vn, $t) } mr("5.0", "5.5", St, Zt => { be.prepend && Zt("prepend") }) } function Ea(be, De, mt, St) { var Zt; let rn, sn, Dn = vb(De) ? De : void 0; be && ((Zt = Pe.get(be.path)) == null || Zt.forEach(Xn)), De && Xn(De), Dn && rn?.length === 1 && (rn = void 0); let kr = Dn && YL(Hi, Dn), ki = rn && da(rn, _.The_file_is_in_the_program_because_Colon), Vn = be && Oq(be), $t = da(Vn ? ki ? [ki, ...Vn] : Vn : ki, mt, ...St || Je); return kr && F2(kr) ? S6(kr.file, kr.pos, kr.end - kr.pos, $t, sn) : s4($t, sn); function Xn(ra) { (rn || (rn = [])).push(Mq(G, ra)), !Dn && vb(ra) ? Dn = ra : Dn !== ra && (sn = Sn(sn, Cs(ra))), ra === De && (De = void 0) } } function bo(be, De, mt, St) { (Ne || (Ne = [])).push({ kind: 1, file: be && be.path, fileProcessingReason: De, diagnostic: mt, args: St }) } function Qo(be, De, mt) { _n.add(Ea(be, void 0, De, mt)) } function Cs(be) { if (vb(be)) { let St = YL(Hi, be), Zt; switch (be.kind) { case 3: Zt = _.File_is_included_via_import_here; break; case 4: Zt = _.File_is_included_via_reference_here; break; case 5: Zt = _.File_is_included_via_type_library_reference_here; break; case 7: Zt = _.File_is_included_via_library_reference_here; break; default: L.assertNever(be) }return F2(St) ? al(St.file, St.pos, St.end - St.pos, Zt) : void 0 } if (!R.configFile) return; let De, mt; switch (be.kind) { case 0: if (!R.configFile.configFileSpecs) return; let St = _a(Y[be.index], Gt), Zt = Nq(G, St); if (Zt) { De = w6(R.configFile, "files", Zt), mt = _.File_is_matched_by_files_list_specified_here; break } let rn = Pq(G, St); if (!rn || !Ta(rn)) return; De = w6(R.configFile, "include", rn), mt = _.File_is_matched_by_include_pattern_specified_here; break; case 1: case 2: let sn = L.checkDefined(En?.[be.index]), Dn = gN($, En, (Xn, ra, Is) => Xn === sn ? { sourceFile: ra?.sourceFile || R.configFile, index: Is } : void 0); if (!Dn) return; let { sourceFile: kr, index: ki } = Dn, Vn = ks(Hw(kr, "references"), Xn => fu(Xn.initializer) ? Xn.initializer : void 0); return Vn && Vn.elements.length > ki ? Nu(kr, Vn.elements[ki], be.kind === 2 ? _.File_is_output_from_referenced_project_specified_here : _.File_is_source_from_referenced_project_specified_here) : void 0; case 8: if (!R.types) return; De = zf("types", be.typeReference), mt = _.File_is_entry_point_of_type_library_specified_here; break; case 6: if (be.index !== void 0) { De = zf("lib", R.lib[be.index]), mt = _.File_is_library_specified_here; break } let $t = Ld(zO.type, (Xn, ra) => Xn === Do(R) ? ra : void 0); De = $t ? Md("target", $t) : void 0, mt = _.File_is_default_library_for_target_specified_here; break; default: L.assertNever(be) }return De && Nu(R.configFile, De, mt) } function Bu() { let be = R.suppressOutputPathCheck ? void 0 : Jg(R); gN($, En, (De, mt, St) => { let Zt = (mt ? mt.commandLine.projectReferences : $)[St], rn = mt && mt.sourceFile; if (gi(Zt, rn, St), !De) { Fd(rn, St, _.File_0_not_found, Zt.path); return } let sn = De.commandLine.options; if ((!sn.composite || sn.noEmit) && (mt ? mt.commandLine.fileNames : Y).length && (sn.composite || Fd(rn, St, _.Referenced_project_0_must_have_setting_composite_Colon_true, Zt.path), sn.noEmit && Fd(rn, St, _.Referenced_project_0_may_not_disable_emit, Zt.path)), Zt.prepend) { let Dn = Ss(sn); Dn ? qe.fileExists(Dn) || Fd(rn, St, _.Output_file_0_from_project_1_does_not_exist, Dn, Zt.path) : Fd(rn, St, _.Cannot_prepend_project_0_because_it_does_not_have_outFile_set, Zt.path) } !mt && be && be === Jg(sn) && (Fd(rn, St, _.Cannot_write_file_0_because_it_will_overwrite_tsbuildinfo_file_generated_by_referenced_project_1, be, Zt.path), Ni.set(rt(be), !0)) }) } function Pd(be, De, mt, St, Zt, rn) { let sn = !0, Dn = Zl(); for (let kr of Dn) if (rs(kr.initializer)) for (let ki of MA(kr.initializer, be)) { let Vn = ki.initializer; fu(Vn) && Vn.elements.length > De && (_n.add(Nu(R.configFile, Vn.elements[De], mt, St, Zt, rn)), sn = !1) } sn && _n.add(ps(mt, St, Zt, rn)) } function Dc(be, De, mt, St) { let Zt = !0, rn = Zl(); for (let sn of rn) rs(sn.initializer) && M(sn.initializer, be, De, void 0, mt, St) && (Zt = !1); Zt && _n.add(ps(mt, St)) } function gd(be) { let De = Y_(); return De && MA(De, be) } function Zl() { return gd("paths") || Je } function Md(be, De) { let mt = gd(be); return mt && ks(mt, St => yo(St.initializer) && St.initializer.text === De ? St.initializer : void 0) } function zf(be, De) { let mt = Y_(); return mt && rce(mt, be, De) } function Io(be, De, mt, St) { E_(!0, De, mt, be, De, mt, St) } function Jf(be, De, mt, St) { E_(!1, be, void 0, De, mt, St) } function Fd(be, De, mt, St, Zt, rn, sn) { let Dn = ks(Hw(be || R.configFile, "references"), kr => fu(kr.initializer) ? kr.initializer : void 0); Dn && Dn.elements.length > De ? _n.add(Nu(be || R.configFile, Dn.elements[De], mt, St, Zt, rn, sn)) : _n.add(ps(mt, St, Zt, rn, sn)) } function E_(be, De, mt, St, Zt, rn, sn, Dn) { let kr = Y_(); (!kr || !M(kr, be, De, mt, St, Zt, rn, sn, Dn)) && ("messageText" in St ? _n.add(s4(St)) : _n.add(ps(St, Zt, rn, sn, Dn))) } function Y_() { if (Pi === void 0) { Pi = !1; let be = LI(R.configFile); if (be) { for (let De of MA(be, "compilerOptions")) if (rs(De.initializer)) { Pi = De.initializer; break } } } return Pi || void 0 } function M(be, De, mt, St, Zt, rn, sn, Dn, kr) { let ki = MA(be, mt, St); for (let Vn of ki) "messageText" in Zt ? _n.add(Lh(R.configFile, De ? Vn.name : Vn.initializer, Zt)) : _n.add(Nu(R.configFile, De ? Vn.name : Vn.initializer, Zt, rn, sn, Dn, kr)); return !!ki.length } function He(be, De) { let mt = Y_(); mt ? M(mt, !0, be, void 0, _.Option_0_is_redundant_and_cannot_be_specified_with_option_1, be, De) : Io(_.Option_0_is_redundant_and_cannot_be_specified_with_option_1, be, De) } function Nt(be, De) { Ni.set(rt(be), !0), _n.add(De) } function Pn(be) { if (R.noEmit) return !1; let De = rt(be); if (Hi(De)) return !1; let mt = Ss(R); if (mt) return la(De, mt) || la(De, ld(mt) + ".d.ts"); if (R.declarationDir && Gy(R.declarationDir, De, Gt, !qe.useCaseSensitiveFileNames())) return !0; if (R.outDir) return Gy(R.outDir, De, Gt, !qe.useCaseSensitiveFileNames()); if ($c(De, dL) || Fu(De)) { let St = ld(De); return !!Hi(St + ".ts") || !!Hi(St + ".tsx") } return !1 } function la(be, De) { return cT(be, De, Gt, !qe.useCaseSensitiveFileNames()) === 0 } function oa() { return qe.getSymlinkCache ? qe.getSymlinkCache() : (ge || (ge = Ile(Gt, ee)), _e && Ye && !ge.hasProcessedResolutions() && ge.setSymlinksFromResolutions(_e, Ye), ge) } } function r8e(e) { let t, r = e.compilerHost.fileExists, i = e.compilerHost.directoryExists, o = e.compilerHost.getDirectories, s = e.compilerHost.realpath; if (!e.useSourceOfProjectReferenceRedirect) return { onProgramCreateComplete: Ba, fileExists: d }; e.compilerHost.fileExists = d; let l; return i && (l = e.compilerHost.directoryExists = x => i.call(e.compilerHost, x) ? (v(x), !0) : e.getResolvedProjectReferences() ? (t || (t = new Set, e.forEachResolvedProjectReference(A => { let w = Ss(A.commandLine.options); if (w) t.add(ni(e.toPath(w))); else { let C = A.commandLine.options.declarationDir || A.commandLine.options.outDir; C && t.add(e.toPath(C)) } })), S(x, !1)) : !1), o && (e.compilerHost.getDirectories = x => !e.getResolvedProjectReferences() || i && i.call(e.compilerHost, x) ? o.call(e.compilerHost, x) : []), s && (e.compilerHost.realpath = x => { var A; return ((A = e.getSymlinkCache().getSymlinkedFiles()) == null ? void 0 : A.get(e.toPath(x))) || s.call(e.compilerHost, x) }), { onProgramCreateComplete: f, fileExists: d, directoryExists: l }; function f() { e.compilerHost.fileExists = r, e.compilerHost.directoryExists = i, e.compilerHost.getDirectories = o } function d(x) { return r.call(e.compilerHost, x) ? !0 : !e.getResolvedProjectReferences() || !Fu(x) ? !1 : S(x, !0) } function g(x) { let A = e.getSourceOfProjectReferenceRedirect(e.toPath(x)); return A !== void 0 ? Ta(A) ? r.call(e.compilerHost, A) : !0 : void 0 } function m(x) { let A = e.toPath(x), w = `${A}${_s}`; return TI(t, C => A === C || na(C, w) || na(A, `${C}/`)) } function v(x) { var A; if (!e.getResolvedProjectReferences() || sL(x) || !s || !jl(x, Wg)) return; let w = e.getSymlinkCache(), C = cu(e.toPath(x)); if ((A = w.getSymlinkedDirectories()) != null && A.has(C)) return; let P = So(s.call(e.compilerHost, x)), F; if (P === x || (F = cu(e.toPath(P))) === C) { w.setSymlinkedDirectory(C, !1); return } w.setSymlinkedDirectory(x, { real: cu(P), realPath: F }) } function S(x, A) { var w; let C = A ? W => g(W) : W => m(W), P = C(x); if (P !== void 0) return P; let F = e.getSymlinkCache(), B = F.getSymlinkedDirectories(); if (!B) return !1; let q = e.toPath(x); return jl(q, Wg) ? A && ((w = F.getSymlinkedFiles()) != null && w.has(q)) ? !0 : FD(B.entries(), ([W, Y]) => { if (!Y || !na(q, W)) return; let R = C(q.replace(W, Y.realPath)); if (A && R) { let ie = _a(x, e.compilerHost.getCurrentDirectory()); F.setSymlinkedFile(q, `${Y.real}${ie.replace(new RegExp(W, "i"), "")}`) } return R }) || !1 : !1 } } function dq(e, t, r, i) { let o = e.getCompilerOptions(); if (o.noEmit) return e.getSemanticDiagnostics(t, i), t || Ss(o) ? HF : e.emitBuildInfo(r, i); if (!o.noEmitOnError) return; let s = [...e.getOptionsDiagnostics(i), ...e.getSyntacticDiagnostics(t, i), ...e.getGlobalDiagnostics(i), ...e.getSemanticDiagnostics(t, i)]; if (s.length === 0 && __(e.getCompilerOptions()) && (s = e.getDeclarationDiagnostics(void 0, i)), !s.length) return; let l; if (!t && !Ss(o)) { let f = e.emitBuildInfo(r, i); f.diagnostics && (s = [...s, ...f.diagnostics]), l = f.emittedFiles } return { diagnostics: s, sourceMaps: void 0, emittedFiles: l, emitSkipped: !0 } } function MF(e, t) { return Pr(e, r => !r.skippedOn || !t[r.skippedOn]) } function FF(e, t = e) { return { fileExists: r => t.fileExists(r), readDirectory(r, i, o, s, l) { return L.assertIsDefined(t.readDirectory, "'CompilerHost.readDirectory' must be implemented to correctly process 'projectReferences'"), t.readDirectory(r, i, o, s, l) }, readFile: r => t.readFile(r), useCaseSensitiveFileNames: e.useCaseSensitiveFileNames(), getCurrentDirectory: () => e.getCurrentDirectory(), onUnRecoverableConfigFileDiagnostic: e.onUnRecoverableConfigFileDiagnostic || Qv, trace: e.trace ? r => e.trace(r) : void 0 } } function fq(e, t, r, i) { if (!e) return Je; let o; for (let s = 0; s < e.length; s++) { let l = e[s], f = t(l, s); if (l.prepend && f && f.options) { if (!Ss(f.options)) continue; let { jsFilePath: g, sourceMapFilePath: m, declarationFilePath: v, declarationMapPath: S, buildInfoPath: x } = JL(f.options, !0), A = _z(r, g, m, v, S, x, i, f.options); (o || (o = [])).push(A) } } return o || Je } function $L(e) { return Hq(e.path) } function _q(e, { extension: t }, { isDeclarationFile: r }) { switch (t) { case ".ts": case ".d.ts": case ".mts": case ".d.mts": case ".cts": case ".d.cts": return; case ".tsx": return i(); case ".jsx": return i() || o(); case ".js": case ".mjs": case ".cjs": return o(); case ".json": return s(); default: return l() }function i() { return e.jsx ? void 0 : _.Module_0_was_resolved_to_1_but_jsx_is_not_set } function o() { return PR(e) || !Uf(e, "noImplicitAny") ? void 0 : _.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type } function s() { return RT(e) ? void 0 : _.Module_0_was_resolved_to_1_but_resolveJsonModule_is_not_used } function l() { return r || e.allowArbitraryExtensions ? void 0 : _.Module_0_was_resolved_to_1_but_allowArbitraryExtensions_is_not_set } } function qpe({ imports: e, moduleAugmentations: t }) { let r = e.map(i => i); for (let i of t) i.kind === 10 && r.push(i); return r } function GF({ imports: e, moduleAugmentations: t }, r) { if (r < e.length) return e[r]; let i = e.length; for (let o of t) if (o.kind === 10) { if (r === i) return o; i++ } L.fail("should never ask for module name at index higher than possible module name") } var pq, BF, UF, mq, hq, Xpe, gq, yq, QL, yN, VF, jF, HF, i8e = gt({ "src/compiler/program.ts"() { "use strict"; fa(), fa(), E0(), pq = (e => (e.Grey = "\x1B[90m", e.Red = "\x1B[91m", e.Yellow = "\x1B[93m", e.Blue = "\x1B[94m", e.Cyan = "\x1B[96m", e))(pq || {}), BF = "\x1B[7m", UF = " ", mq = "\x1B[0m", hq = "...", Xpe = "  ", gq = "    ", yq = { resolvedModule: void 0, resolvedTypeReferenceDirective: void 0 }, QL = { getName: sq, getMode: (e, t) => W_(t, e) }, yN = { getName: RF, getMode: (e, t) => mN(e, t?.impliedNodeFormat) }, VF = "__inferred type names__.ts", jF = new Set([_.Cannot_redeclare_block_scoped_variable_0.code, _.A_module_cannot_have_multiple_default_exports.code, _.Another_export_default_is_here.code, _.The_first_export_default_is_here.code, _.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module.code, _.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode.code, _.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here.code, _.constructor_is_a_reserved_word.code, _.delete_cannot_be_called_on_an_identifier_in_strict_mode.code, _.Code_contained_in_a_class_is_evaluated_in_JavaScript_s_strict_mode_which_does_not_allow_this_use_of_0_For_more_information_see_https_Colon_Slash_Slashdeveloper_mozilla_org_Slashen_US_Slashdocs_SlashWeb_SlashJavaScript_SlashReference_SlashStrict_mode.code, _.Invalid_use_of_0_Modules_are_automatically_in_strict_mode.code, _.Invalid_use_of_0_in_strict_mode.code, _.A_label_is_not_allowed_here.code, _.Octal_literals_are_not_allowed_in_strict_mode.code, _.with_statements_are_not_allowed_in_strict_mode.code, _.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement.code, _.A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement.code, _.A_class_declaration_without_the_default_modifier_must_have_a_name.code, _.A_class_member_cannot_have_the_0_keyword.code, _.A_comma_expression_is_not_allowed_in_a_computed_property_name.code, _.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement.code, _.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement.code, _.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement.code, _.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement.code, _.A_default_export_must_be_at_the_top_level_of_a_file_or_module_declaration.code, _.A_definite_assignment_assertion_is_not_permitted_in_this_context.code, _.A_destructuring_declaration_must_have_an_initializer.code, _.A_get_accessor_cannot_have_parameters.code, _.A_rest_element_cannot_contain_a_binding_pattern.code, _.A_rest_element_cannot_have_a_property_name.code, _.A_rest_element_cannot_have_an_initializer.code, _.A_rest_element_must_be_last_in_a_destructuring_pattern.code, _.A_rest_parameter_cannot_have_an_initializer.code, _.A_rest_parameter_must_be_last_in_a_parameter_list.code, _.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma.code, _.A_return_statement_cannot_be_used_inside_a_class_static_block.code, _.A_set_accessor_cannot_have_rest_parameter.code, _.A_set_accessor_must_have_exactly_one_parameter.code, _.An_export_declaration_can_only_be_used_at_the_top_level_of_a_module.code, _.An_export_declaration_cannot_have_modifiers.code, _.An_import_declaration_can_only_be_used_at_the_top_level_of_a_module.code, _.An_import_declaration_cannot_have_modifiers.code, _.An_object_member_cannot_be_declared_optional.code, _.Argument_of_dynamic_import_cannot_be_spread_element.code, _.Cannot_assign_to_private_method_0_Private_methods_are_not_writable.code, _.Cannot_redeclare_identifier_0_in_catch_clause.code, _.Catch_clause_variable_cannot_have_an_initializer.code, _.Class_decorators_can_t_be_used_with_static_private_identifier_Consider_removing_the_experimental_decorator.code, _.Classes_can_only_extend_a_single_class.code, _.Classes_may_not_have_a_field_named_constructor.code, _.Did_you_mean_to_use_a_Colon_An_can_only_follow_a_property_name_when_the_containing_object_literal_is_part_of_a_destructuring_pattern.code, _.Duplicate_label_0.code, _.Dynamic_imports_can_only_accept_a_module_specifier_and_an_optional_assertion_as_arguments.code, _.For_await_loops_cannot_be_used_inside_a_class_static_block.code, _.JSX_attributes_must_only_be_assigned_a_non_empty_expression.code, _.JSX_elements_cannot_have_multiple_attributes_with_the_same_name.code, _.JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array.code, _.JSX_property_access_expressions_cannot_include_JSX_namespace_names.code, _.Jump_target_cannot_cross_function_boundary.code, _.Line_terminator_not_permitted_before_arrow.code, _.Modifiers_cannot_appear_here.code, _.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement.code, _.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement.code, _.Private_identifiers_are_not_allowed_outside_class_bodies.code, _.Private_identifiers_are_only_allowed_in_class_bodies_and_may_only_be_used_as_part_of_a_class_member_declaration_property_access_or_on_the_left_hand_side_of_an_in_expression.code, _.Property_0_is_not_accessible_outside_class_1_because_it_has_a_private_identifier.code, _.Tagged_template_expressions_are_not_permitted_in_an_optional_chain.code, _.The_left_hand_side_of_a_for_of_statement_may_not_be_async.code, _.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer.code, _.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer.code, _.Trailing_comma_not_allowed.code, _.Variable_declaration_list_cannot_be_empty.code, _._0_and_1_operations_cannot_be_mixed_without_parentheses.code, _._0_expected.code, _._0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2.code, _._0_list_cannot_be_empty.code, _._0_modifier_already_seen.code, _._0_modifier_cannot_appear_on_a_constructor_declaration.code, _._0_modifier_cannot_appear_on_a_module_or_namespace_element.code, _._0_modifier_cannot_appear_on_a_parameter.code, _._0_modifier_cannot_appear_on_class_elements_of_this_kind.code, _._0_modifier_cannot_be_used_here.code, _._0_modifier_must_precede_1_modifier.code, _.const_declarations_can_only_be_declared_inside_a_block.code, _.const_declarations_must_be_initialized.code, _.extends_clause_already_seen.code, _.let_declarations_can_only_be_declared_inside_a_block.code, _.let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations.code, _.Class_constructor_may_not_be_a_generator.code, _.Class_constructor_may_not_be_an_accessor.code, _.await_expressions_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules.code]), HF = { diagnostics: Je, sourceMaps: void 0, emittedFiles: void 0, emitSkipped: !0 } } }), a8e = gt({ "src/compiler/builderStatePublic.ts"() { "use strict" } }); function Ype(e, t, r, i, o, s) { let l = [], { emitSkipped: f, diagnostics: d } = e.emit(t, g, i, r, o, s); return { outputFiles: l, emitSkipped: f, diagnostics: d }; function g(m, v, S) { l.push({ name: m, writeByteOrderMark: S, text: v }) } } var pm, o8e = gt({ "src/compiler/builderState.ts"() { "use strict"; fa(), (e => { function t() { function Z(U, re, le) { let _e = { getKeys: ge => re.get(ge), getValues: ge => U.get(ge), keys: () => U.keys(), deleteKey: ge => { (le || (le = new Set)).add(ge); let X = U.get(ge); return X ? (X.forEach(Ve => i(re, Ve, ge)), U.delete(ge), !0) : !1 }, set: (ge, X) => { le?.delete(ge); let Ve = U.get(ge); return U.set(ge, X), Ve?.forEach(we => { X.has(we) || i(re, we, ge) }), X.forEach(we => { Ve?.has(we) || r(re, we, ge) }), _e } }; return _e } return Z(new Map, new Map, void 0) } e.createManyToManyPathMap = t; function r(Z, U, re) { let le = Z.get(U); le || (le = new Set, Z.set(U, le)), le.add(re) } function i(Z, U, re) { let le = Z.get(U); return le?.delete(re) ? (le.size || Z.delete(U), !0) : !1 } function o(Z) { return Zi(Z.declarations, U => { var re; return (re = Gn(U)) == null ? void 0 : re.resolvedPath }) } function s(Z, U) { let re = Z.getSymbolAtLocation(U); return re && o(re) } function l(Z, U, re, le) { return Ts(Z.getProjectReferenceRedirect(U) || U, re, le) } function f(Z, U, re) { let le; if (U.imports && U.imports.length > 0) { let Ve = Z.getTypeChecker(); for (let we of U.imports) { let ke = s(Ve, we); ke?.forEach(X) } } let _e = ni(U.resolvedPath); if (U.referencedFiles && U.referencedFiles.length > 0) for (let Ve of U.referencedFiles) { let we = l(Z, Ve.fileName, _e, re); X(we) } if (U.resolvedTypeReferenceDirectiveNames && U.resolvedTypeReferenceDirectiveNames.forEach(({ resolvedTypeReferenceDirective: Ve }) => { if (!Ve) return; let we = Ve.resolvedFileName, ke = l(Z, we, _e, re); X(ke) }), U.moduleAugmentations.length) { let Ve = Z.getTypeChecker(); for (let we of U.moduleAugmentations) { if (!yo(we)) continue; let ke = Ve.getSymbolAtLocation(we); ke && ge(ke) } } for (let Ve of Z.getTypeChecker().getAmbientModules()) Ve.declarations && Ve.declarations.length > 1 && ge(Ve); return le; function ge(Ve) { if (Ve.declarations) for (let we of Ve.declarations) { let ke = Gn(we); ke && ke !== U && X(ke.resolvedPath) } } function X(Ve) { (le || (le = new Set)).add(Ve) } } function d(Z, U) { return U && !U.referencedMap == !Z } e.canReuseOldState = d; function g(Z, U, re) { var le, _e, ge; let X = new Map, Ve = Z.getCompilerOptions(), we = Ss(Ve), ke = Ve.module !== 0 && !we ? t() : void 0, Pe = ke ? t() : void 0, Ce = d(ke, U); Z.getTypeChecker(); for (let Ie of Z.getSourceFiles()) { let Be = L.checkDefined(Ie.version, "Program intended to be used with Builder should have source files with versions set"), Ne = Ce ? (le = U.oldSignatures) == null ? void 0 : le.get(Ie.resolvedPath) : void 0, Le = Ne === void 0 ? Ce ? (_e = U.fileInfos.get(Ie.resolvedPath)) == null ? void 0 : _e.signature : void 0 : Ne || void 0; if (ke) { let Ye = f(Z, Ie, Z.getCanonicalFileName); if (Ye && ke.set(Ie.resolvedPath, Ye), Ce) { let _t = (ge = U.oldExportedModulesMap) == null ? void 0 : ge.get(Ie.resolvedPath), ct = _t === void 0 ? U.exportedModulesMap.getValues(Ie.resolvedPath) : _t || void 0; ct && Pe.set(Ie.resolvedPath, ct) } } X.set(Ie.resolvedPath, { version: Be, signature: Le, affectsGlobalScope: we ? void 0 : R(Ie) || void 0, impliedFormat: Ie.impliedNodeFormat }) } return { fileInfos: X, referencedMap: ke, exportedModulesMap: Pe, useFileVersionAsSignature: !re && !Ce } } e.create = g; function m(Z) { Z.allFilesExcludingDefaultLibraryFile = void 0, Z.allFileNames = void 0 } e.releaseCache = m; function v(Z, U, re, le, _e) { var ge, X; let Ve = S(Z, U, re, le, _e); return (ge = Z.oldSignatures) == null || ge.clear(), (X = Z.oldExportedModulesMap) == null || X.clear(), Ve } e.getFilesAffectedBy = v; function S(Z, U, re, le, _e) { let ge = U.getSourceFileByPath(re); return ge ? w(Z, U, ge, le, _e) ? (Z.referencedMap ? fe : $)(Z, U, ge, le, _e) : [ge] : Je } e.getFilesAffectedByWithOldState = S; function x(Z, U, re) { Z.fileInfos.get(re).signature = U, (Z.hasCalledUpdateShapeSignature || (Z.hasCalledUpdateShapeSignature = new Set)).add(re) } e.updateSignatureOfFile = x; function A(Z, U, re, le, _e) { Z.emit(U, (ge, X, Ve, we, ke, Pe) => { L.assert(Fu(ge), `File extension for signature expected to be dts: Got:: ${ge}`), _e(Tq(Z, U, X, le, Pe), ke) }, re, !0, void 0, !0) } e.computeDtsSignature = A; function w(Z, U, re, le, _e, ge = Z.useFileVersionAsSignature) { var X; if ((X = Z.hasCalledUpdateShapeSignature) != null && X.has(re.resolvedPath)) return !1; let Ve = Z.fileInfos.get(re.resolvedPath), we = Ve.signature, ke; if (!re.isDeclarationFile && !ge && A(U, re, le, _e, (Pe, Ce) => { ke = Pe, ke !== we && C(Z, re, Ce[0].exportedModulesFromDeclarationEmit) }), ke === void 0 && (ke = re.version, Z.exportedModulesMap && ke !== we)) { (Z.oldExportedModulesMap || (Z.oldExportedModulesMap = new Map)).set(re.resolvedPath, Z.exportedModulesMap.getValues(re.resolvedPath) || !1); let Pe = Z.referencedMap ? Z.referencedMap.getValues(re.resolvedPath) : void 0; Pe ? Z.exportedModulesMap.set(re.resolvedPath, Pe) : Z.exportedModulesMap.deleteKey(re.resolvedPath) } return (Z.oldSignatures || (Z.oldSignatures = new Map)).set(re.resolvedPath, we || !1), (Z.hasCalledUpdateShapeSignature || (Z.hasCalledUpdateShapeSignature = new Set)).add(re.resolvedPath), Ve.signature = ke, ke !== we } e.updateShapeSignature = w; function C(Z, U, re) { if (!Z.exportedModulesMap) return; (Z.oldExportedModulesMap || (Z.oldExportedModulesMap = new Map)).set(U.resolvedPath, Z.exportedModulesMap.getValues(U.resolvedPath) || !1); let le = P(re); le ? Z.exportedModulesMap.set(U.resolvedPath, le) : Z.exportedModulesMap.deleteKey(U.resolvedPath) } e.updateExportedModules = C; function P(Z) { let U; return Z?.forEach(re => o(re).forEach(le => (U ?? (U = new Set)).add(le))), U } e.getExportedModules = P; function F(Z, U, re) { let le = U.getCompilerOptions(); if (Ss(le) || !Z.referencedMap || R(re)) return B(Z, U); let _e = new Set, ge = [re.resolvedPath]; for (; ge.length;) { let X = ge.pop(); if (!_e.has(X)) { _e.add(X); let Ve = Z.referencedMap.getValues(X); if (Ve) for (let we of Ve.keys()) ge.push(we) } } return lo(UD(_e.keys(), X => { var Ve, we; return (we = (Ve = U.getSourceFileByPath(X)) == null ? void 0 : Ve.fileName) != null ? we : X })) } e.getAllDependencies = F; function B(Z, U) { if (!Z.allFileNames) { let re = U.getSourceFiles(); Z.allFileNames = re === Je ? Je : re.map(le => le.fileName) } return Z.allFileNames } function q(Z, U) { let re = Z.referencedMap.getKeys(U); return re ? lo(re.keys()) : [] } e.getReferencedByPaths = q; function W(Z) { for (let U of Z.statements) if (!b6(U)) return !1; return !0 } function Y(Z) { return vt(Z.moduleAugmentations, U => mp(U.parent)) } function R(Z) { return Y(Z) || !kd(Z) && !Mf(Z) && !W(Z) } function ie(Z, U, re) { if (Z.allFilesExcludingDefaultLibraryFile) return Z.allFilesExcludingDefaultLibraryFile; let le; re && _e(re); for (let ge of U.getSourceFiles()) ge !== re && _e(ge); return Z.allFilesExcludingDefaultLibraryFile = le || Je, Z.allFilesExcludingDefaultLibraryFile; function _e(ge) { U.isSourceFileDefaultLibrary(ge) || (le || (le = [])).push(ge) } } e.getAllFilesExcludingDefaultLibraryFile = ie; function $(Z, U, re) { let le = U.getCompilerOptions(); return le && Ss(le) ? [re] : ie(Z, U, re) } function fe(Z, U, re, le, _e) { if (R(re)) return ie(Z, U, re); let ge = U.getCompilerOptions(); if (ge && (d_(ge) || Ss(ge))) return [re]; let X = new Map; X.set(re.resolvedPath, re); let Ve = q(Z, re.resolvedPath); for (; Ve.length > 0;) { let we = Ve.pop(); if (!X.has(we)) { let ke = U.getSourceFileByPath(we); X.set(we, ke), ke && w(Z, U, ke, le, _e) && Ve.push(...q(Z, ke.resolvedPath)) } } return lo(UD(X.values(), we => we)) } })(pm || (pm = {})) } }); function cv(e) { let t = 1; return e.sourceMap && (t = t | 2), e.inlineSourceMap && (t = t | 4), __(e) && (t = t | 8), e.declarationMap && (t = t | 16), e.emitDeclarationOnly && (t = t & 24), t } function G2(e, t) { let r = t && (Cg(t) ? t : cv(t)), i = Cg(e) ? e : cv(e); if (r === i) return 0; if (!r || !i) return i; let o = r ^ i, s = 0; return o & 7 && (s = i & 7), o & 24 && (s = s | i & 24), s } function s8e(e, t) { return e === t || e !== void 0 && t !== void 0 && e.size === t.size && !TI(e, r => !t.has(r)) } function c8e(e, t) { var r, i; let o = pm.create(e, t, !1); o.program = e; let s = e.getCompilerOptions(); o.compilerOptions = s; let l = Ss(s); l ? s.composite && t?.outSignature && l === Ss(t?.compilerOptions) && (o.outSignature = t.outSignature && Qpe(s, t.compilerOptions, t.outSignature)) : o.semanticDiagnosticsPerFile = new Map, o.changedFilesSet = new Set, o.latestChangedDtsFile = s.composite ? t?.latestChangedDtsFile : void 0; let f = pm.canReuseOldState(o.referencedMap, t), d = f ? t.compilerOptions : void 0, g = f && t.semanticDiagnosticsPerFile && !!o.semanticDiagnosticsPerFile && !xle(s, d), m = s.composite && t?.emitSignatures && !l && !Cle(s, t.compilerOptions); f ? ((r = t.changedFilesSet) == null || r.forEach(w => o.changedFilesSet.add(w)), !l && ((i = t.affectedFilesPendingEmit) != null && i.size) && (o.affectedFilesPendingEmit = new Map(t.affectedFilesPendingEmit), o.seenAffectedFiles = new Set), o.programEmitPending = t.programEmitPending) : o.buildInfoEmitPending = !0; let v = o.referencedMap, S = f ? t.referencedMap : void 0, x = g && !s.skipLibCheck == !d.skipLibCheck, A = x && !s.skipDefaultLibCheck == !d.skipDefaultLibCheck; if (o.fileInfos.forEach((w, C) => { var P; let F, B; if (!f || !(F = t.fileInfos.get(C)) || F.version !== w.version || F.impliedFormat !== w.impliedFormat || !s8e(B = v && v.getValues(C), S && S.getValues(C)) || B && TI(B, q => !o.fileInfos.has(q) && t.fileInfos.has(q))) $pe(o, C); else if (g) { let q = e.getSourceFileByPath(C); if (q.isDeclarationFile && !x || q.hasNoDefaultLib && !A) return; let W = t.semanticDiagnosticsPerFile.get(C); W && (o.semanticDiagnosticsPerFile.set(C, t.hasReusableDiagnostic ? l8e(W, e) : W), o.semanticDiagnosticsFromOldState || (o.semanticDiagnosticsFromOldState = new Set), o.semanticDiagnosticsFromOldState.add(C)) } if (m) { let q = t.emitSignatures.get(C); q && ((P = o.emitSignatures) != null ? P : o.emitSignatures = new Map).set(C, Qpe(s, t.compilerOptions, q)) } }), f && Ld(t.fileInfos, (w, C) => o.fileInfos.has(C) ? !1 : l || w.affectsGlobalScope ? !0 : (o.buildInfoEmitPending = !0, !1))) pm.getAllFilesExcludingDefaultLibraryFile(o, e, void 0).forEach(w => $pe(o, w.resolvedPath)); else if (d) { let w = Ale(s, d) ? cv(s) : G2(s, d); w !== 0 && (l ? o.programEmitPending = o.programEmitPending ? o.programEmitPending | w : w : (e.getSourceFiles().forEach(C => { o.changedFilesSet.has(C.resolvedPath) || xq(o, C.resolvedPath, w) }), L.assert(!o.seenAffectedFiles || !o.seenAffectedFiles.size), o.seenAffectedFiles = o.seenAffectedFiles || new Set, o.buildInfoEmitPending = !0)) } return l && !o.changedFilesSet.size && (f && (o.bundle = t.bundle), vt(e.getProjectReferences(), w => !!w.prepend) && (o.programEmitPending = cv(s))), o } function $pe(e, t) { e.changedFilesSet.add(t), e.buildInfoEmitPending = !0, e.programEmitPending = void 0 } function Qpe(e, t, r) { return !!e.declarationMap == !!t.declarationMap ? r : Ta(r) ? [r] : r[0] } function l8e(e, t) { if (!e.length) return Je; let r; return e.map(o => { let s = Zpe(o, t, i); s.reportsUnnecessary = o.reportsUnnecessary, s.reportsDeprecated = o.reportDeprecated, s.source = o.source, s.skippedOn = o.skippedOn; let { relatedInformation: l } = o; return s.relatedInformation = l ? l.length ? l.map(f => Zpe(f, t, i)) : [] : void 0, s }); function i(o) { return r ?? (r = ni(_a(Jg(t.getCompilerOptions()), t.getCurrentDirectory()))), Ts(o, r, t.getCanonicalFileName) } } function Zpe(e, t, r) { let { file: i } = e; return { ...e, file: i ? t.getSourceFileByPath(r(i)) : void 0 } } function u8e(e) { pm.releaseCache(e), e.program = void 0 } function d8e(e) { let t = Ss(e.compilerOptions); return L.assert(!e.changedFilesSet.size || t), { affectedFilesPendingEmit: e.affectedFilesPendingEmit && new Map(e.affectedFilesPendingEmit), seenEmittedFiles: e.seenEmittedFiles && new Map(e.seenEmittedFiles), programEmitPending: e.programEmitPending, emitSignatures: e.emitSignatures && new Map(e.emitSignatures), outSignature: e.outSignature, latestChangedDtsFile: e.latestChangedDtsFile, hasChangedEmitSignature: e.hasChangedEmitSignature, changedFilesSet: t ? new Set(e.changedFilesSet) : void 0 } } function f8e(e, t) { e.affectedFilesPendingEmit = t.affectedFilesPendingEmit, e.seenEmittedFiles = t.seenEmittedFiles, e.programEmitPending = t.programEmitPending, e.emitSignatures = t.emitSignatures, e.outSignature = t.outSignature, e.latestChangedDtsFile = t.latestChangedDtsFile, e.hasChangedEmitSignature = t.hasChangedEmitSignature, t.changedFilesSet && (e.changedFilesSet = t.changedFilesSet) } function eme(e, t) { L.assert(!t || !e.affectedFiles || e.affectedFiles[e.affectedFilesIndex - 1] !== t || !e.semanticDiagnosticsPerFile.has(t.resolvedPath)) } function tme(e, t, r) { for (var i, o; ;) { let { affectedFiles: s } = e; if (s) { let g = e.seenAffectedFiles, m = e.affectedFilesIndex; for (; m < s.length;) { let v = s[m]; if (!g.has(v.resolvedPath)) return e.affectedFilesIndex = m, xq(e, v.resolvedPath, cv(e.compilerOptions)), m8e(e, v, t, r), v; m++ } e.changedFilesSet.delete(e.currentChangedFilePath), e.currentChangedFilePath = void 0, (i = e.oldSignatures) == null || i.clear(), (o = e.oldExportedModulesMap) == null || o.clear(), e.affectedFiles = void 0 } let l = e.changedFilesSet.keys().next(); if (l.done) return; let f = L.checkDefined(e.program), d = f.getCompilerOptions(); if (Ss(d)) return L.assert(!e.semanticDiagnosticsPerFile), f; e.affectedFiles = pm.getFilesAffectedByWithOldState(e, f, l.value, t, r), e.currentChangedFilePath = l.value, e.affectedFilesIndex = 0, e.seenAffectedFiles || (e.seenAffectedFiles = new Set) } } function _8e(e, t) { var r; if ((r = e.affectedFilesPendingEmit) != null && r.size) { if (!t) return e.affectedFilesPendingEmit = void 0; e.affectedFilesPendingEmit.forEach((i, o) => { let s = i & 7; s ? e.affectedFilesPendingEmit.set(o, s) : e.affectedFilesPendingEmit.delete(o) }) } } function p8e(e, t) { var r; if ((r = e.affectedFilesPendingEmit) != null && r.size) return Ld(e.affectedFilesPendingEmit, (i, o) => { var s; let l = e.program.getSourceFileByPath(o); if (!l || !pS(l, e.program)) { e.affectedFilesPendingEmit.delete(o); return } let f = (s = e.seenEmittedFiles) == null ? void 0 : s.get(l.resolvedPath), d = G2(i, f); if (t && (d = d & 24), d) return { affectedFile: l, emitKind: d } }) } function nme(e) { if (!e.cleanedDiagnosticsOfLibFiles) { e.cleanedDiagnosticsOfLibFiles = !0; let t = L.checkDefined(e.program), r = t.getCompilerOptions(); mn(t.getSourceFiles(), i => t.isSourceFileDefaultLibrary(i) && !rL(i, r, t) && vq(e, i.resolvedPath)) } } function m8e(e, t, r, i) { if (vq(e, t.resolvedPath), e.allFilesExcludingDefaultLibraryFile === e.affectedFiles) { nme(e), pm.updateShapeSignature(e, L.checkDefined(e.program), t, r, i); return } e.compilerOptions.assumeChangesOnlyAffectDirectDependencies || h8e(e, t, r, i) } function WF(e, t, r, i) { if (vq(e, t), !e.changedFilesSet.has(t)) { let o = L.checkDefined(e.program), s = o.getSourceFileByPath(t); s && (pm.updateShapeSignature(e, o, s, r, i, !0), __(e.compilerOptions) && xq(e, t, e.compilerOptions.declarationMap ? 24 : 8)) } } function vq(e, t) { return e.semanticDiagnosticsFromOldState ? (e.semanticDiagnosticsFromOldState.delete(t), e.semanticDiagnosticsPerFile.delete(t), !e.semanticDiagnosticsFromOldState.size) : !0 } function rme(e, t) { let r = L.checkDefined(e.oldSignatures).get(t) || void 0; return L.checkDefined(e.fileInfos.get(t)).signature !== r } function bq(e, t, r, i) { var o; return (o = e.fileInfos.get(t)) != null && o.affectsGlobalScope ? (pm.getAllFilesExcludingDefaultLibraryFile(e, e.program, void 0).forEach(s => WF(e, s.resolvedPath, r, i)), nme(e), !0) : !1 } function h8e(e, t, r, i) { var o; if (!e.exportedModulesMap || !e.changedFilesSet.has(t.resolvedPath) || !rme(e, t.resolvedPath)) return; if (d_(e.compilerOptions)) { let l = new Map; l.set(t.resolvedPath, !0); let f = pm.getReferencedByPaths(e, t.resolvedPath); for (; f.length > 0;) { let d = f.pop(); if (!l.has(d)) { if (l.set(d, !0), bq(e, d, r, i)) return; if (WF(e, d, r, i), rme(e, d)) { let g = L.checkDefined(e.program).getSourceFileByPath(d); f.push(...pm.getReferencedByPaths(e, g.resolvedPath)) } } } } let s = new Set; (o = e.exportedModulesMap.getKeys(t.resolvedPath)) == null || o.forEach(l => { if (bq(e, l, r, i)) return !0; let f = e.referencedMap.getKeys(l); return f && TI(f, d => ime(e, d, s, r, i)) }) } function ime(e, t, r, i, o) { var s, l; if (_0(r, t)) { if (bq(e, t, i, o)) return !0; WF(e, t, i, o), (s = e.exportedModulesMap.getKeys(t)) == null || s.forEach(f => ime(e, f, r, i, o)), (l = e.referencedMap.getKeys(t)) == null || l.forEach(f => !r.has(f) && WF(e, f, i, o)) } } function Eq(e, t, r) { return Qi(g8e(e, t, r), L.checkDefined(e.program).getProgramDiagnostics(t)) } function g8e(e, t, r) { let i = t.resolvedPath; if (e.semanticDiagnosticsPerFile) { let s = e.semanticDiagnosticsPerFile.get(i); if (s) return MF(s, e.compilerOptions) } let o = L.checkDefined(e.program).getBindAndCheckDiagnostics(t, r); return e.semanticDiagnosticsPerFile && e.semanticDiagnosticsPerFile.set(i, o), MF(o, e.compilerOptions) } function ame(e) { return !!Ss(e.options || {}) } function y8e(e, t) { var r, i, o; let s = L.checkDefined(e.program).getCurrentDirectory(), l = ni(_a(Jg(e.compilerOptions), s)), f = e.latestChangedDtsFile ? W(e.latestChangedDtsFile) : void 0, d = [], g = new Map, m = []; if (Ss(e.compilerOptions)) { let Z = lo(e.fileInfos.entries(), ([X, Ve]) => { let we = R(X); return $(X, we), Ve.impliedFormat ? { version: Ve.version, impliedFormat: Ve.impliedFormat, signature: void 0, affectsGlobalScope: void 0 } : Ve.version }), U = { fileNames: d, fileInfos: Z, root: m, options: fe(e.compilerOptions), outSignature: e.outSignature, latestChangedDtsFile: f, pendingEmit: e.programEmitPending ? e.programEmitPending === cv(e.compilerOptions) ? !1 : e.programEmitPending : void 0 }, { js: re, dts: le, commonSourceDirectory: _e, sourceFiles: ge } = t; return e.bundle = t = { commonSourceDirectory: _e, sourceFiles: ge, js: re || (e.compilerOptions.emitDeclarationOnly || (r = e.bundle) == null ? void 0 : r.js), dts: le || (__(e.compilerOptions) ? (i = e.bundle) == null ? void 0 : i.dts : void 0) }, dN(U, t) } let v, S, x, A = lo(e.fileInfos.entries(), ([Z, U]) => { var re, le; let _e = R(Z); $(Z, _e), L.assert(d[_e - 1] === Y(Z)); let ge = (re = e.oldSignatures) == null ? void 0 : re.get(Z), X = ge !== void 0 ? ge || void 0 : U.signature; if (e.compilerOptions.composite) { let Ve = e.program.getSourceFileByPath(Z); if (!Mf(Ve) && pS(Ve, e.program)) { let we = (le = e.emitSignatures) == null ? void 0 : le.get(Z); we !== X && (x || (x = [])).push(we === void 0 ? _e : [_e, !Ta(we) && we[0] === X ? Je : we]) } } return U.version === X ? U.affectsGlobalScope || U.impliedFormat ? { version: U.version, signature: void 0, affectsGlobalScope: U.affectsGlobalScope, impliedFormat: U.impliedFormat } : U.version : X !== void 0 ? ge === void 0 ? U : { version: U.version, signature: X, affectsGlobalScope: U.affectsGlobalScope, impliedFormat: U.impliedFormat } : { version: U.version, signature: !1, affectsGlobalScope: U.affectsGlobalScope, impliedFormat: U.impliedFormat } }), w; e.referencedMap && (w = lo(e.referencedMap.keys()).sort(su).map(Z => [R(Z), ie(e.referencedMap.getValues(Z))])); let C; e.exportedModulesMap && (C = Zi(lo(e.exportedModulesMap.keys()).sort(su), Z => { var U; let re = (U = e.oldExportedModulesMap) == null ? void 0 : U.get(Z); if (re === void 0) return [R(Z), ie(e.exportedModulesMap.getValues(Z))]; if (re) return [R(Z), ie(re)] })); let P; if (e.semanticDiagnosticsPerFile) for (let Z of lo(e.semanticDiagnosticsPerFile.keys()).sort(su)) { let U = e.semanticDiagnosticsPerFile.get(Z); (P || (P = [])).push(U.length ? [R(Z), b8e(U, Y)] : R(Z)) } let F; if ((o = e.affectedFilesPendingEmit) != null && o.size) { let Z = cv(e.compilerOptions), U = new Set; for (let re of lo(e.affectedFilesPendingEmit.keys()).sort(su)) if (_0(U, re)) { let le = e.program.getSourceFileByPath(re); if (!le || !pS(le, e.program)) continue; let _e = R(re), ge = e.affectedFilesPendingEmit.get(re); (F || (F = [])).push(ge === Z ? _e : ge === 8 ? [_e] : [_e, ge]) } } let B; if (e.changedFilesSet.size) for (let Z of lo(e.changedFilesSet.keys()).sort(su)) (B || (B = [])).push(R(Z)); let q = { fileNames: d, fileInfos: A, root: m, options: fe(e.compilerOptions), fileIdsList: v, referencedMap: w, exportedModulesMap: C, semanticDiagnosticsPerFile: P, affectedFilesPendingEmit: F, changeFileSet: B, emitSignatures: x, latestChangedDtsFile: f }; return dN(q, t); function W(Z) { return Y(_a(Z, s)) } function Y(Z) { return S0(Xp(l, Z, e.program.getCanonicalFileName)) } function R(Z) { let U = g.get(Z); return U === void 0 && (d.push(Y(Z)), g.set(Z, U = d.length)), U } function ie(Z) { let U = lo(Z.keys(), R).sort(Es), re = U.join(), le = S?.get(re); return le === void 0 && ((v || (v = [])).push(U), (S || (S = new Map)).set(re, le = v.length)), le } function $(Z, U) { let re = e.program.getSourceFile(Z); if (!e.program.getFileIncludeReasons().get(re.path).some(X => X.kind === 0)) return; if (!m.length) return m.push(U); let le = m[m.length - 1], _e = ba(le); if (_e && le[1] === U - 1) return le[1] = U; if (_e || m.length === 1 || le !== U - 1) return m.push(U); let ge = m[m.length - 2]; return !Cg(ge) || ge !== le - 1 ? m.push(U) : (m[m.length - 2] = [ge, U], m.length = m.length - 1) } function fe(Z) { let U, { optionsNameMap: re } = w2(); for (let le of bh(Z).sort(su)) { let _e = re.get(le.toLowerCase()); _e?.affectsBuildInfo && ((U || (U = {}))[le] = v8e(_e, Z[le], W)) } return U } } function v8e(e, t, r) { if (e) { if (L.assert(e.type !== "listOrElement"), e.type === "list") { let i = t; if (e.element.isFilePath && i.length) return i.map(r) } else if (e.isFilePath) return r(t) } return t } function b8e(e, t) { return L.assert(!!e.length), e.map(r => { let i = ome(r, t); i.reportsUnnecessary = r.reportsUnnecessary, i.reportDeprecated = r.reportsDeprecated, i.source = r.source, i.skippedOn = r.skippedOn; let { relatedInformation: o } = r; return i.relatedInformation = o ? o.length ? o.map(s => ome(s, t)) : [] : void 0, i }) } function ome(e, t) { let { file: r } = e; return { ...e, file: r ? t(r.resolvedPath) : void 0 } } function zF(e, t, r, i, o, s) { let l, f, d; return e === void 0 ? (L.assert(t === void 0), l = r, d = i, L.assert(!!d), f = d.getProgram()) : ba(e) ? (d = i, f = PF({ rootNames: e, options: t, host: r, oldProgram: d && d.getProgramOrUndefined(), configFileParsingDiagnostics: o, projectReferences: s }), l = r) : (f = e, l = t, d = r, o = i), { host: l, newProgram: f, oldProgram: d, configFileParsingDiagnostics: o || Je } } function sme(e, t) { return t?.sourceMapUrlPos !== void 0 ? e.substring(0, t.sourceMapUrlPos) : e } function Tq(e, t, r, i, o) {
+                var s, l; r = sme(r, o); let f; return (s = o?.diagnostics) != null && s.length && (r += o.diagnostics.map(m => `${g(m)}${nw[m.category]}${m.code}: ${d(m.messageText)}`).join(`
+`)), ((l = i.createHash) != null ? l : aw)(r); function d(m) {
+                    return Ta(m) ? m : m === void 0 ? "" : m.next ? m.messageText + m.next.map(d).join(`
+`) : m.messageText
+                } function g(m) { return m.file.resolvedPath === t.resolvedPath ? `(${m.start},${m.length})` : (f === void 0 && (f = ni(t.resolvedPath)), `${S0(Xp(f, m.file.resolvedPath, e.getCanonicalFileName))}(${m.start},${m.length})`) }
+            } function YT(e, t, r) { var i; return ((i = t.createHash) != null ? i : aw)(sme(e, r)) } function Sq(e, { newProgram: t, host: r, oldProgram: i, configFileParsingDiagnostics: o }) { let s = i && i.getState(); if (s && t === s.program && o === t.getConfigFileParsingDiagnostics()) return t = void 0, s = void 0, i; let l = c8e(t, s); t.getBuildInfo = w => y8e(l, w), t = void 0, i = void 0, s = void 0; let f = () => l, d = Cq(f, o); return d.getState = f, d.saveEmitState = () => d8e(l), d.restoreEmitState = w => f8e(l, w), d.hasChangedEmitSignature = () => !!l.hasChangedEmitSignature, d.getAllDependencies = w => pm.getAllDependencies(l, L.checkDefined(l.program), w), d.getSemanticDiagnostics = A, d.emit = S, d.releaseProgram = () => u8e(l), e === 0 ? d.getSemanticDiagnosticsOfNextAffectedFile = x : e === 1 ? (d.getSemanticDiagnosticsOfNextAffectedFile = x, d.emitNextAffectedFile = m, d.emitBuildInfo = g) : Sa(), d; function g(w, C) { if (l.buildInfoEmitPending) { let P = L.checkDefined(l.program).emitBuildInfo(w || ho(r, r.writeFile), C); return l.buildInfoEmitPending = !1, P } return HF } function m(w, C, P, F) { var B, q, W, Y, R; let ie = tme(l, C, r), $ = cv(l.compilerOptions), fe = P ? $ & 24 : $; if (!ie) if (Ss(l.compilerOptions)) { if (!l.programEmitPending || (fe = l.programEmitPending, P && (fe = fe & 24), !fe)) return; ie = l.program } else { let re = p8e(l, P); if (!re) { if (!l.buildInfoEmitPending) return; let le = l.program, _e = le.emitBuildInfo(w || ho(r, r.writeFile), C); return l.buildInfoEmitPending = !1, { result: _e, affected: le } } ({ affectedFile: ie, emitKind: fe } = re) } let Z; fe & 7 && (Z = 0), fe & 24 && (Z = Z === void 0 ? 1 : void 0), ie === l.program && (l.programEmitPending = l.changedFilesSet.size ? G2($, fe) : l.programEmitPending ? G2(l.programEmitPending, fe) : void 0); let U = l.program.emit(ie === l.program ? void 0 : ie, v(w, F), C, Z, F); if (ie !== l.program) { let re = ie; l.seenAffectedFiles.add(re.resolvedPath), l.affectedFilesIndex !== void 0 && l.affectedFilesIndex++, l.buildInfoEmitPending = !0; let le = ((B = l.seenEmittedFiles) == null ? void 0 : B.get(re.resolvedPath)) || 0; ((q = l.seenEmittedFiles) != null ? q : l.seenEmittedFiles = new Map).set(re.resolvedPath, fe | le); let _e = ((W = l.affectedFilesPendingEmit) == null ? void 0 : W.get(re.resolvedPath)) || $, ge = G2(_e, fe | le); ge ? ((Y = l.affectedFilesPendingEmit) != null ? Y : l.affectedFilesPendingEmit = new Map).set(re.resolvedPath, ge) : (R = l.affectedFilesPendingEmit) == null || R.delete(re.resolvedPath) } else l.changedFilesSet.clear(); return { result: U, affected: ie } } function v(w, C) { return __(l.compilerOptions) ? (P, F, B, q, W, Y) => { var R, ie, $, fe, Z, U, re; if (Fu(P)) if (Ss(l.compilerOptions)) { if (l.compilerOptions.composite) { let _e = le(l.outSignature, void 0); if (!_e) return; l.outSignature = _e } } else { L.assert(W?.length === 1); let _e; if (!C) { let ge = W[0], X = l.fileInfos.get(ge.resolvedPath); if (X.signature === ge.version) { let Ve = Tq(l.program, ge, F, r, Y); (R = Y?.diagnostics) != null && R.length || (_e = Ve), Ve !== ge.version && (r.storeFilesChangingSignatureDuringEmit && ((ie = l.filesChangingSignature) != null ? ie : l.filesChangingSignature = new Set).add(ge.resolvedPath), l.exportedModulesMap && pm.updateExportedModules(l, ge, ge.exportedModulesFromDeclarationEmit), l.affectedFiles ? ((($ = l.oldSignatures) == null ? void 0 : $.get(ge.resolvedPath)) === void 0 && ((fe = l.oldSignatures) != null ? fe : l.oldSignatures = new Map).set(ge.resolvedPath, X.signature || !1), X.signature = Ve) : (X.signature = Ve, (Z = l.oldExportedModulesMap) == null || Z.clear())) } } if (l.compilerOptions.composite) { let ge = W[0].resolvedPath; if (_e = le((U = l.emitSignatures) == null ? void 0 : U.get(ge), _e), !_e) return; ((re = l.emitSignatures) != null ? re : l.emitSignatures = new Map).set(ge, _e) } } w ? w(P, F, B, q, W, Y) : r.writeFile ? r.writeFile(P, F, B, q, W, Y) : l.program.writeFile(P, F, B, q, W, Y); function le(_e, ge) { let X = !_e || Ta(_e) ? _e : _e[0]; if (ge ?? (ge = YT(F, r, Y)), ge === X) { if (_e === X) return; Y ? Y.differsOnlyInMap = !0 : Y = { differsOnlyInMap: !0 } } else l.hasChangedEmitSignature = !0, l.latestChangedDtsFile = P; return ge } } : w || ho(r, r.writeFile) } function S(w, C, P, F, B) { e === 1 && eme(l, w); let q = dq(d, w, C, P); if (q) return q; if (!w) if (e === 1) { let W = [], Y = !1, R, ie = [], $; for (; $ = m(C, P, F, B);)Y = Y || $.result.emitSkipped, R = si(R, $.result.diagnostics), ie = si(ie, $.result.emittedFiles), W = si(W, $.result.sourceMaps); return { emitSkipped: Y, diagnostics: R || Je, emittedFiles: ie, sourceMaps: W } } else _8e(l, F); return L.checkDefined(l.program).emit(w, v(C, B), P, F, B) } function x(w, C) { for (; ;) { let P = tme(l, w, r), F; if (P) if (P !== l.program) { let B = P; if ((!C || !C(B)) && (F = Eq(l, B, w)), l.seenAffectedFiles.add(B.resolvedPath), l.affectedFilesIndex++, l.buildInfoEmitPending = !0, !F) continue } else F = l.program.getSemanticDiagnostics(void 0, w), l.changedFilesSet.clear(), l.programEmitPending = cv(l.compilerOptions); else return; return { result: F, affected: P } } } function A(w, C) { eme(l, w); let P = L.checkDefined(l.program).getCompilerOptions(); if (Ss(P)) return L.assert(!l.semanticDiagnosticsPerFile), L.checkDefined(l.program).getSemanticDiagnostics(w, C); if (w) return Eq(l, w, C); for (; x(C);); let F; for (let B of L.checkDefined(l.program).getSourceFiles()) F = si(F, Eq(l, B, C)); return F || Je } } function xq(e, t, r) { var i, o; let s = ((i = e.affectedFilesPendingEmit) == null ? void 0 : i.get(t)) || 0; ((o = e.affectedFilesPendingEmit) != null ? o : e.affectedFilesPendingEmit = new Map).set(t, s | r) } function cme(e) { return Ta(e) ? { version: e, signature: e, affectsGlobalScope: void 0, impliedFormat: void 0 } : Ta(e.signature) ? e : { version: e.version, signature: e.signature === !1 ? void 0 : e.version, affectsGlobalScope: e.affectsGlobalScope, impliedFormat: e.impliedFormat } } function lme(e, t) { return Cg(e) ? t : e[1] || 8 } function ume(e, t) { return e || cv(t || {}) } function dme(e, t, r) { var i, o, s, l; let f = e.program, d = ni(_a(t, r.getCurrentDirectory())), g = Dl(r.useCaseSensitiveFileNames()), m, v = (i = f.fileNames) == null ? void 0 : i.map(A), S, x = f.latestChangedDtsFile ? w(f.latestChangedDtsFile) : void 0; if (ame(f)) { let B = new Map; f.fileInfos.forEach((q, W) => { let Y = C(W + 1); B.set(Y, Ta(q) ? { version: q, signature: void 0, affectsGlobalScope: void 0, impliedFormat: void 0 } : q) }), m = { fileInfos: B, compilerOptions: f.options ? SJ(f.options, w) : {}, latestChangedDtsFile: x, outSignature: f.outSignature, programEmitPending: f.pendingEmit === void 0 ? void 0 : ume(f.pendingEmit, f.options), bundle: e.bundle } } else { S = (o = f.fileIdsList) == null ? void 0 : o.map(Y => new Set(Y.map(C))); let B = new Map, q = (s = f.options) != null && s.composite && !Ss(f.options) ? new Map : void 0; f.fileInfos.forEach((Y, R) => { let ie = C(R + 1), $ = cme(Y); B.set(ie, $), q && $.signature && q.set(ie, $.signature) }), (l = f.emitSignatures) == null || l.forEach(Y => { if (Cg(Y)) q.delete(C(Y)); else { let R = C(Y[0]); q.set(R, !Ta(Y[1]) && !Y[1].length ? [q.get(R)] : Y[1]) } }); let W = f.affectedFilesPendingEmit ? cv(f.options || {}) : void 0; m = { fileInfos: B, compilerOptions: f.options ? SJ(f.options, w) : {}, referencedMap: F(f.referencedMap), exportedModulesMap: F(f.exportedModulesMap), semanticDiagnosticsPerFile: f.semanticDiagnosticsPerFile && p0(f.semanticDiagnosticsPerFile, Y => C(Cg(Y) ? Y : Y[0]), Y => Cg(Y) ? Je : Y[1]), hasReusableDiagnostic: !0, affectedFilesPendingEmit: f.affectedFilesPendingEmit && p0(f.affectedFilesPendingEmit, Y => C(Cg(Y) ? Y : Y[0]), Y => lme(Y, W)), changedFilesSet: new Set(on(f.changeFileSet, C)), latestChangedDtsFile: x, emitSignatures: q?.size ? q : void 0 } } return { getState: () => m, saveEmitState: Ba, restoreEmitState: Ba, getProgram: Sa, getProgramOrUndefined: Qv, releaseProgram: Ba, getCompilerOptions: () => m.compilerOptions, getSourceFile: Sa, getSourceFiles: Sa, getOptionsDiagnostics: Sa, getGlobalDiagnostics: Sa, getConfigFileParsingDiagnostics: Sa, getSyntacticDiagnostics: Sa, getDeclarationDiagnostics: Sa, getSemanticDiagnostics: Sa, emit: Sa, getAllDependencies: Sa, getCurrentDirectory: Sa, emitNextAffectedFile: Sa, getSemanticDiagnosticsOfNextAffectedFile: Sa, emitBuildInfo: Sa, close: Ba, hasChangedEmitSignature: m0 }; function A(B) { return Ts(B, d, g) } function w(B) { return _a(B, d) } function C(B) { return v[B - 1] } function P(B) { return S[B - 1] } function F(B) { if (!B) return; let q = pm.createManyToManyPathMap(); return B.forEach(([W, Y]) => q.set(C(W), P(Y))), q } } function Aq(e, t, r) { let i = ni(_a(t, r.getCurrentDirectory())), o = Dl(r.useCaseSensitiveFileNames()), s = new Map, l = 0, f = []; return e.fileInfos.forEach((d, g) => { let m = Ts(e.fileNames[g], i, o), v = Ta(d) ? d : d.version; if (s.set(m, v), l < e.root.length) { let S = e.root[l], x = g + 1; ba(S) ? S[0] <= x && x <= S[1] && (f.push(m), S[1] === x && l++) : S === x && (f.push(m), l++) } }), { fileInfos: s, roots: f } } function Cq(e, t) { return { getState: Sa, saveEmitState: Ba, restoreEmitState: Ba, getProgram: r, getProgramOrUndefined: () => e().program, releaseProgram: () => e().program = void 0, getCompilerOptions: () => e().compilerOptions, getSourceFile: i => r().getSourceFile(i), getSourceFiles: () => r().getSourceFiles(), getOptionsDiagnostics: i => r().getOptionsDiagnostics(i), getGlobalDiagnostics: i => r().getGlobalDiagnostics(i), getConfigFileParsingDiagnostics: () => t, getSyntacticDiagnostics: (i, o) => r().getSyntacticDiagnostics(i, o), getDeclarationDiagnostics: (i, o) => r().getDeclarationDiagnostics(i, o), getSemanticDiagnostics: (i, o) => r().getSemanticDiagnostics(i, o), emit: (i, o, s, l, f) => r().emit(i, o, s, l, f), emitBuildInfo: (i, o) => r().emitBuildInfo(i, o), getAllDependencies: Sa, getCurrentDirectory: () => r().getCurrentDirectory(), close: Ba }; function r() { return L.checkDefined(e().program) } } var Iq, Lq, E8e = gt({ "src/compiler/builder.ts"() { "use strict"; fa(), fa(), Iq = (e => (e[e.None = 0] = "None", e[e.Js = 1] = "Js", e[e.JsMap = 2] = "JsMap", e[e.JsInlineMap = 4] = "JsInlineMap", e[e.Dts = 8] = "Dts", e[e.DtsMap = 16] = "DtsMap", e[e.AllJs = 7] = "AllJs", e[e.AllDts = 24] = "AllDts", e[e.All = 31] = "All", e))(Iq || {}), Lq = (e => (e[e.SemanticDiagnosticsBuilderProgram = 0] = "SemanticDiagnosticsBuilderProgram", e[e.EmitAndSemanticDiagnosticsBuilderProgram = 1] = "EmitAndSemanticDiagnosticsBuilderProgram", e))(Lq || {}) } }); function T8e(e, t, r, i, o, s) { return Sq(0, zF(e, t, r, i, o, s)) } function kq(e, t, r, i, o, s) { return Sq(1, zF(e, t, r, i, o, s)) } function S8e(e, t, r, i, o, s) { let { newProgram: l, configFileParsingDiagnostics: f } = zF(e, t, r, i, o, s); return Cq(() => ({ program: l, compilerOptions: l.getCompilerOptions() }), f) } var x8e = gt({ "src/compiler/builderPublic.ts"() { "use strict"; fa() } }); function Dq(e) { return Oc(e, "/node_modules/.staging") ? pA(e, "/.staging") : vt(uw, t => jl(e, t)) ? void 0 : e } function vN(e) { let t = _p(e); if (e.length === t) return !1; let r = e.indexOf(_s, t); if (r === -1) return !1; let i = e.substring(t, r + 1), o = t > 1 || e.charCodeAt(0) !== 47; if (o && e.search(/[a-zA-Z]:/) !== 0 && i.search(/[a-zA-Z]\$\//) === 0) { if (r = e.indexOf(_s, r + 1), r === -1) return !1; i = e.substring(t + i.length, r + 1) } if (o && i.search(/users\//i) !== 0) return !0; for (let s = r + 1, l = 2; l > 0; l--)if (s = e.indexOf(_s, s) + 1, s === 0) return !1; return !0 } function fme(e, t, r) { let i, o, s, l = Nf(), f = new Set, d = new Set, g = new Map, m = new Map, v = !1, S, x, A, w, C, P = zu(() => e.getCurrentDirectory()), F = e.getCachedDirectoryStructureHost(), B = new Map, q = Y3(P(), e.getCanonicalFileName, e.getCompilationSettings()), W = new Map, Y = $3(P(), e.getCanonicalFileName, e.getCompilationSettings(), q.getPackageJsonInfoCache()), R = [".ts", ".tsx", ".js", ".jsx", ".json"], ie = new Map, $ = new Map, fe = new Map, Z = t && sT(_a(t, P())), U = Z && e.toPath(Z), re = U !== void 0 ? U.split(_s).length : 0, le = new Map; return { getModuleResolutionCache: () => q, startRecordingFilesWithChangedResolutions: we, finishRecordingFilesWithChangedResolutions: ke, startCachingPerDirectoryResolution: Ie, finishCachingPerDirectoryResolution: Be, resolveModuleNameLiterals: ct, resolveTypeReferenceDirectiveReferences: _t, resolveSingleModuleNameWithoutWatching: Rt, removeResolutionsFromProjectReferenceRedirects: nn, removeResolutionsOfFile: Dt, hasChangedAutomaticTypeDirectiveNames: () => v, invalidateResolutionOfFile: An, invalidateResolutionsOfFailedLookupLocations: ri, setFilesWithInvalidatedNonRelativeUnresolvedImports: Kn, createHasInvalidatedResolutions: Ce, isFileWithInvalidatedNonRelativeUnresolvedImports: Pe, updateTypeRootsWatch: at, closeTypeRootsWatch: dr, clear: Ve }; function _e(ve) { return ve.resolvedModule } function ge(ve) { return ve.resolvedTypeReferenceDirective } function X(ve, nt) { return ve === void 0 || nt.length <= ve.length ? !1 : na(nt, ve) && nt[ve.length] === _s } function Ve() { Tf($, _m), Tf(fe, _m), ie.clear(), l.clear(), dr(), B.clear(), W.clear(), g.clear(), f.clear(), d.clear(), A = void 0, w = void 0, C = void 0, x = void 0, S = void 0, q.clear(), Y.clear(), q.update(e.getCompilationSettings()), Y.update(e.getCompilationSettings()), m.clear(), v = !1 } function we() { i = [] } function ke() { let ve = i; return i = void 0, ve } function Pe(ve) { if (!s) return !1; let nt = s.get(ve); return !!nt && !!nt.length } function Ce(ve) { ri(); let nt = o; return o = void 0, ce => ve(ce) || !!nt?.has(ce) || Pe(ce) } function Ie() { q.clearAllExceptPackageJsonInfoCache(), Y.clearAllExceptPackageJsonInfoCache(), l.forEach($n), l.clear() } function Be(ve, nt) { s = void 0, l.forEach($n), l.clear(), ve !== nt && (ve?.getSourceFiles().forEach(ce => { var Q, ue, G; let Oe = kd(ce) && (ue = (Q = ce.packageJsonLocations) == null ? void 0 : Q.length) != null ? ue : 0, je = (G = m.get(ce.path)) != null ? G : Je; for (let Ge = je.length; Ge < Oe; Ge++)Gt(ce.packageJsonLocations[Ge], !1); if (je.length > Oe) for (let Ge = Oe; Ge < je.length; Ge++)fe.get(je[Ge]).files--; Oe ? m.set(ce.path, ce.packageJsonLocations) : m.delete(ce.path) }), m.forEach((ce, Q) => { ve?.getSourceFileByPath(Q) || (ce.forEach(ue => fe.get(ue).files--), m.delete(Q)) })), $.forEach((ce, Q) => { ce.refCount === 0 && ($.delete(Q), ce.watcher.close()) }), fe.forEach((ce, Q) => { ce.files === 0 && ce.resolutions === 0 && (fe.delete(Q), ce.watcher.close()) }), v = !1 } function Ne(ve, nt, ce, Q, ue) { var G; let Oe = ((G = e.getCompilerHost) == null ? void 0 : G.call(e)) || e, je = FL(ve, nt, ce, Oe, q, Q, ue); if (!e.getGlobalCache) return je; let Ge = e.getGlobalCache(); if (Ge !== void 0 && !fl(ve) && !(je.resolvedModule && y4(je.resolvedModule.extension))) { let { resolvedModule: kt, failedLookupLocations: Kt, affectingLocations: ln, resolutionDiagnostics: ir } = s_e(L.checkDefined(e.globalCacheResolutionModuleName)(ve), e.projectName, ce, Oe, Ge, q); if (kt) return je.resolvedModule = kt, je.failedLookupLocations = N2(je.failedLookupLocations, Kt), je.affectingLocations = N2(je.affectingLocations, ln), je.resolutionDiagnostics = N2(je.resolutionDiagnostics, ir), je } return je } function Le(ve, nt, ce) { return { nameAndMode: QL, resolve: (Q, ue) => Ne(Q, ve, ce, nt, ue) } } function Ye({ entries: ve, containingFile: nt, containingSourceFile: ce, redirectedReference: Q, options: ue, perFileCache: G, reusedNames: Oe, loader: je, getResolutionWithResolvedFileName: Ge, shouldRetryResolution: kt, logChanges: Kt }) { var ln; let ir = e.toPath(nt), ae = G.get(ir) || G.set(ir, WT()).get(ir), rt = [], Ot = Kt && Pe(ir), Ke = e.getCurrentProgram(), oe = Ke && Ke.getResolvedProjectReferenceToRedirect(nt), pe = oe ? !Q || Q.sourceFile.path !== oe.sourceFile.path : !!Q, z = WT(); for (let j of ve) { let yt = je.nameAndMode.getName(j), lt = je.nameAndMode.getMode(j, ce), Qe = ae.get(yt, lt); if (!z.has(yt, lt) && pe || !Qe || Qe.isInvalidated || Ot && !fl(yt) && kt(Qe)) { let Vt = Qe; Qe = je.resolve(yt, lt), e.onDiscoveredSymlink && A8e(Qe) && e.onDiscoveredSymlink(), ae.set(yt, lt, Qe), tn(yt, Qe, ir, Ge), Vt && Ni(Vt, ir, Ge), Kt && i && !Te(Vt, Qe) && (i.push(ir), Kt = !1) } else { let Vt = ((ln = e.getCompilerHost) == null ? void 0 : ln.call(e)) || e; if (ov(ue, Vt) && !z.has(yt, lt)) { let Hn = Ge(Qe); Xi(Vt, G === B ? Hn?.resolvedFileName ? Hn.packageId ? _.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : _.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2 : _.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_not_resolved : Hn?.resolvedFileName ? Hn.packageId ? _.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : _.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2 : _.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_not_resolved, yt, nt, Hn?.resolvedFileName, Hn?.packageId && hT(Hn.packageId)) } } L.assert(Qe !== void 0 && !Qe.isInvalidated), z.set(yt, lt, !0), rt.push(Qe) } return Oe?.forEach(j => z.set(je.nameAndMode.getName(j), je.nameAndMode.getMode(j, ce), !0)), ae.size() !== z.size() && ae.forEach((j, yt, lt) => { z.has(yt, lt) || (Ni(j, ir, Ge), ae.delete(yt, lt)) }), rt; function Te(j, yt) { if (j === yt) return !0; if (!j || !yt) return !1; let lt = Ge(j), Qe = Ge(yt); return lt === Qe ? !0 : !lt || !Qe ? !1 : lt.resolvedFileName === Qe.resolvedFileName } } function _t(ve, nt, ce, Q, ue, G) { var Oe; return Ye({ entries: ve, containingFile: nt, containingSourceFile: ue, redirectedReference: ce, options: Q, reusedNames: G, perFileCache: W, loader: OF(nt, ce, Q, ((Oe = e.getCompilerHost) == null ? void 0 : Oe.call(e)) || e, Y), getResolutionWithResolvedFileName: ge, shouldRetryResolution: je => je.resolvedTypeReferenceDirective === void 0 }) } function ct(ve, nt, ce, Q, ue, G) { return Ye({ entries: ve, containingFile: nt, containingSourceFile: ue, redirectedReference: ce, options: Q, reusedNames: G, perFileCache: B, loader: Le(nt, ce, Q), getResolutionWithResolvedFileName: _e, shouldRetryResolution: Oe => !Oe.resolvedModule || !VR(Oe.resolvedModule.extension), logChanges: r }) } function Rt(ve, nt) { let ce = e.toPath(nt), Q = B.get(ce), ue = Q?.get(ve, void 0); return ue && !ue.isInvalidated ? ue : Ne(ve, nt, e.getCompilationSettings()) } function We(ve) { return Oc(ve, "/node_modules/@types") } function qe(ve, nt) { if (X(U, nt)) { ve = qp(ve) ? So(ve) : _a(ve, P()); let ce = nt.split(_s), Q = ve.split(_s); return L.assert(Q.length === ce.length, `FailedLookup: ${ve} failedLookupLocationPath: ${nt}`), ce.length > re + 1 ? { dir: Q.slice(0, re + 1).join(_s), dirPath: ce.slice(0, re + 1).join(_s) } : { dir: Z, dirPath: U, nonRecursive: !1 } } return zt(ni(_a(ve, P())), ni(nt)) } function zt(ve, nt) { for (; JS(nt);)ve = ni(ve), nt = ni(nt); if (H8(nt)) return vN(ni(nt)) ? { dir: ve, dirPath: nt } : void 0; let ce = !0, Q, ue; if (U !== void 0) for (; !X(nt, U);) { let G = ni(nt); if (G === nt) break; ce = !1, Q = nt, ue = ve, nt = G, ve = ni(ve) } return vN(nt) ? { dir: ue || ve, dirPath: Q || nt, nonRecursive: ce } : void 0 } function Qt(ve) { return $c(ve, R) } function tn(ve, nt, ce, Q) { var ue, G; if (nt.refCount) nt.refCount++, L.assertIsDefined(nt.files); else { nt.refCount = 1, L.assert(!((ue = nt.files) != null && ue.size)), fl(ve) ? kn(nt) : l.add(ve, nt); let Oe = Q(nt); if (Oe && Oe.resolvedFileName) { let je = e.toPath(Oe.resolvedFileName), Ge = g.get(je); Ge || g.set(je, Ge = new Set), Ge.add(nt) } } ((G = nt.files) != null ? G : nt.files = new Set).add(ce) } function kn(ve) { L.assert(!!ve.refCount); let { failedLookupLocations: nt, affectingLocations: ce } = ve; if (!nt?.length && !ce?.length) return; nt?.length && f.add(ve); let Q = !1; if (nt) { for (let ue of nt) { let G = e.toPath(ue), Oe = qe(ue, G); if (Oe) { let { dir: je, dirPath: Ge, nonRecursive: kt } = Oe; if (!Qt(G)) { let Kt = ie.get(G) || 0; ie.set(G, Kt + 1) } Ge === U ? (L.assert(!kt), Q = !0) : ui(je, Ge, kt) } } Q && ui(Z, U, !0) } _n(ve, !nt?.length) } function _n(ve, nt) { L.assert(!!ve.refCount); let { affectingLocations: ce } = ve; if (ce?.length) { nt && d.add(ve); for (let Q of ce) Gt(Q, !0) } } function Gt(ve, nt) { let ce = fe.get(ve); if (ce) { nt ? ce.resolutions++ : ce.files++; return } let Q = ve; if (e.realpath && (Q = e.realpath(ve), ve !== Q)) { let je = fe.get(Q); if (je) { nt ? je.resolutions++ : je.files++, je.paths.add(ve), fe.set(ve, je); return } } let ue = new Set; ue.add(Q); let G = vN(e.toPath(Q)) ? e.watchAffectingFileLocation(Q, (je, Ge) => { F?.addOrDeleteFile(je, e.toPath(Q), Ge); let kt = q.getPackageJsonInfoCache().getInternalMap(); ue.forEach(Kt => { Oe.resolutions && (x ?? (x = new Set)).add(Kt), Oe.files && (S ?? (S = new Set)).add(Kt), kt?.delete(e.toPath(Kt)) }), e.scheduleInvalidateResolutionsOfFailedLookupLocations() }) : B2, Oe = { watcher: G !== B2 ? { close: () => { G.close(), G = B2 } } : G, resolutions: nt ? 1 : 0, files: nt ? 0 : 1, paths: ue }; fe.set(Q, Oe), ve !== Q && (fe.set(ve, Oe), ue.add(ve)) } function $n(ve, nt) { let ce = e.getCurrentProgram(); !ce || !ce.getTypeChecker().tryFindAmbientModuleWithoutAugmentations(nt) ? ve.forEach(kn) : ve.forEach(Q => _n(Q, !0)) } function ui(ve, nt, ce) { let Q = $.get(nt); Q ? (L.assert(!!ce == !!Q.nonRecursive), Q.refCount++) : $.set(nt, { watcher: gr(ve, nt, ce), refCount: 1, nonRecursive: ce }) } function Ni(ve, nt, ce) { if (L.checkDefined(ve.files).delete(nt), ve.refCount--, ve.refCount) return; let Q = ce(ve); if (Q && Q.resolvedFileName) { let Oe = e.toPath(Q.resolvedFileName), je = g.get(Oe); je?.delete(ve) && !je.size && g.delete(Oe) } let { failedLookupLocations: ue, affectingLocations: G } = ve; if (f.delete(ve)) { let Oe = !1; for (let je of ue) { let Ge = e.toPath(je), kt = qe(je, Ge); if (kt) { let { dirPath: Kt } = kt, ln = ie.get(Ge); ln && (ln === 1 ? ie.delete(Ge) : (L.assert(ln > 1), ie.set(Ge, ln - 1))), Kt === U ? Oe = !0 : Pi(Kt) } } Oe && Pi(U) } else G?.length && d.delete(ve); if (G) for (let Oe of G) { let je = fe.get(Oe); je.resolutions-- } } function Pi(ve) { let nt = $.get(ve); nt.refCount-- } function gr(ve, nt, ce) { return e.watchDirectoryOfFailedLookupLocation(ve, Q => { let ue = e.toPath(Q); F && F.addOrDeleteFileOrDirectory(Q, ue), hi(ue, nt === ue) }, ce ? 0 : 1) } function pt(ve, nt, ce) { let Q = ve.get(nt); Q && (Q.forEach(ue => Ni(ue, nt, ce)), ve.delete(nt)) } function nn(ve) { if (!Gc(ve, ".json")) return; let nt = e.getCurrentProgram(); if (!nt) return; let ce = nt.getResolvedProjectReferenceByPath(ve); ce && ce.commandLine.fileNames.forEach(Q => Dt(e.toPath(Q))) } function Dt(ve) { pt(B, ve, _e), pt(W, ve, ge) } function pn(ve, nt) { if (!ve) return !1; let ce = !1; return ve.forEach(Q => { if (!(Q.isInvalidated || !nt(Q))) { Q.isInvalidated = ce = !0; for (let ue of L.checkDefined(Q.files)) (o ?? (o = new Set)).add(ue), v = v || Oc(ue, VF) } }), ce } function An(ve) { Dt(ve); let nt = v; pn(g.get(ve), h0) && v && !nt && e.onChangedAutomaticTypeDirectiveNames() } function Kn(ve) { L.assert(s === ve || s === void 0), s = ve } function hi(ve, nt) { if (nt) (C || (C = new Set)).add(ve); else { let ce = Dq(ve); if (!ce || (ve = ce, e.fileIsOpen(ve))) return !1; let Q = ni(ve); if (We(ve) || H8(ve) || We(Q) || H8(Q)) (A || (A = new Set)).add(ve), (w || (w = new Set)).add(ve); else { if (!Qt(ve) && !ie.has(ve) || Bpe(e.getCurrentProgram(), ve)) return !1; (A || (A = new Set)).add(ve); let ue = XJ(ve); ue && (w || (w = new Set)).add(ue) } } e.scheduleInvalidateResolutionsOfFailedLookupLocations() } function ri() { var ve; let nt = !1; if (S && ((ve = e.getCurrentProgram()) == null || ve.getSourceFiles().forEach(Q => { vt(Q.packageJsonLocations, ue => S.has(ue)) && ((o ?? (o = new Set)).add(Q.path), nt = !0) }), S = void 0), !A && !w && !C && !x) return nt; nt = pn(f, vn) || nt; let ce = q.getPackageJsonInfoCache().getInternalMap(); return ce && (A || w || C) && ce.forEach((Q, ue) => Ht(ue) ? ce.delete(ue) : void 0), A = void 0, w = void 0, C = void 0, nt = pn(d, En) || nt, x = void 0, nt } function vn(ve) { var nt; return En(ve) ? !0 : !A && !w && !C ? !1 : (nt = ve.failedLookupLocations) == null ? void 0 : nt.some(ce => Ht(e.toPath(ce))) } function Ht(ve) { return A?.has(ve) || FD(w?.keys() || [], nt => na(ve, nt) ? !0 : void 0) || FD(C?.keys() || [], nt => X(nt, ve) ? !0 : void 0) } function En(ve) { var nt; return !!x && ((nt = ve.affectingLocations) == null ? void 0 : nt.some(ce => x.has(ce))) } function dr() { Tf(le, am) } function Cr(ve, nt) { if (X(U, nt)) return U; let ce = zt(ve, nt); return ce && $.has(ce.dirPath) ? ce.dirPath : void 0 } function Se(ve, nt) { return e.watchTypeRootsDirectory(nt, ce => { let Q = e.toPath(ce); F && F.addOrDeleteFileOrDirectory(ce, Q), v = !0, e.onChangedAutomaticTypeDirectiveNames(); let ue = Cr(nt, ve); ue && hi(Q, ue === Q) }, 1) } function at() { let ve = e.getCompilationSettings(); if (ve.types) { dr(); return } let nt = XO(ve, { directoryExists: Tt, getCurrentDirectory: P }); nt ? e2(le, p0(nt, ce => e.toPath(ce)), { createNewValue: Se, onDeleteValue: am }) : dr() } function Tt(ve) { let nt = ni(ni(ve)), ce = e.toPath(nt); return ce === U || vN(ce) } } function A8e(e) { var t, r; return !!((t = e.resolvedModule) != null && t.originalPath || (r = e.resolvedTypeReferenceDirective) != null && r.originalPath) } var C8e = gt({ "src/compiler/resolutionCache.ts"() { "use strict"; fa(), fa() } }); function bN(e, t) { let r = e === xl && Vq ? Vq : { getCurrentDirectory: () => e.getCurrentDirectory(), getNewLine: () => e.newLine, getCanonicalFileName: Dl(e.useCaseSensitiveFileNames) }; if (!t) return o => e.write(rq(o, r)); let i = new Array(1); return o => { i[0] = o, e.write(Jpe(i, r) + r.getNewLine()), i[0] = void 0 } } function _me(e, t, r) { return e.clearScreen && !r.preserveWatchOutput && !r.extendedDiagnostics && !r.diagnostics && ya($F, t.code) ? (e.clearScreen(), !0) : !1 } function I8e(e, t) { return ya($F, e.code) ? t + t : t } function EN(e) { return e.now ? e.now().toLocaleTimeString("en-US", { timeZone: "UTC" }).replace("\u202F", " ") : new Date().toLocaleTimeString() } function pme(e, t) { return t ? (r, i, o) => { _me(e, r, o); let s = `[${iE(EN(e), "\x1B[90m")}] `; s += `${sv(r.messageText, e.newLine)}${i + i}`, e.write(s) } : (r, i, o) => { let s = ""; _me(e, r, o) || (s += i), s += `${EN(e)} - `, s += `${sv(r.messageText, e.newLine)}${I8e(r, i)}`, e.write(s) } } function L8e(e, t, r, i, o, s) { let l = o; l.onUnRecoverableConfigFileDiagnostic = d => Eme(o, s, d); let f = RO(e, t, l, r, i); return l.onUnRecoverableConfigFileDiagnostic = void 0, f } function JF(e) { return Oy(e, t => t.category === 1) } function KF(e) { return Pr(e, r => r.category === 1).map(r => { if (r.file !== void 0) return `${r.file.fileName}` }).map(r => { if (r === void 0) return; let i = wr(e, o => o.file !== void 0 && o.file.fileName === r); if (i !== void 0) { let { line: o } = Gs(i.file, i.start); return { fileName: r, line: o + 1 } } }) } function wq(e) { return e === 1 ? _.Found_1_error_Watching_for_file_changes : _.Found_0_errors_Watching_for_file_changes } function mme(e, t) { let r = iE(":" + e.line, "\x1B[90m"); return nI(e.fileName) && nI(t) ? Xp(t, e.fileName, !1) + r : e.fileName + r } function hme(e, t, r, i) { if (e === 0) return ""; let o = t.filter(g => g !== void 0), s = o.map(g => `${g.fileName}:${g.line}`).filter((g, m, v) => v.indexOf(g) === m), l = o[0] && mme(o[0], i.getCurrentDirectory()), f = e === 1 ? ps(t[0] !== void 0 ? _.Found_1_error_in_1 : _.Found_1_error, e, l) : ps(s.length === 0 ? _.Found_0_errors : s.length === 1 ? _.Found_0_errors_in_the_same_file_starting_at_Colon_1 : _.Found_0_errors_in_1_files, e, s.length === 1 ? l : s.length), d = s.length > 1 ? k8e(o, i) : ""; return `${r}${sv(f.messageText, r)}${r}${r}${d}` } function k8e(e, t) {
+                let r = e.filter((v, S, x) => S === x.findIndex(A => A?.fileName === v?.fileName)); if (r.length === 0) return ""; let i = v => Math.log(v) * Math.LOG10E + 1, o = r.map(v => [v, Oy(e, S => S.fileName === v.fileName)]), s = o.reduce((v, S) => Math.max(v, S[1] || 0), 0), l = _.Errors_Files.message, f = l.split(" ")[0].length, d = Math.max(f, i(s)), g = Math.max(i(s) - f, 0), m = ""; return m += " ".repeat(g) + l + `
+`, o.forEach(v => {
+                    let [S, x] = v, A = Math.log(x) * Math.LOG10E + 1 | 0, w = A < d ? " ".repeat(d - A) : "", C = mme(S, t.getCurrentDirectory()); m += `${w}${x}  ${C}
+`}), m
+            } function gme(e) { return !!e.getState } function Rq(e, t) { let r = e.getCompilerOptions(); r.explainFiles ? yme(gme(e) ? e.getProgram() : e, t) : (r.listFiles || r.listFilesOnly) && mn(e.getSourceFiles(), i => { t(i.fileName) }) } function yme(e, t) { var r, i; let o = e.getFileIncludeReasons(), s = l => rI(l, e.getCurrentDirectory(), e.getCanonicalFileName); for (let l of e.getSourceFiles()) t(`${XS(l, s)}`), (r = o.get(l.path)) == null || r.forEach(f => t(`  ${Mq(e, f, s).messageText}`)), (i = Oq(l, s)) == null || i.forEach(f => t(`  ${f.messageText}`)) } function Oq(e, t) { var r; let i; if (e.path !== e.resolvedPath && (i ?? (i = [])).push(da(void 0, _.File_is_output_of_project_reference_source_0, XS(e.originalFileName, t))), e.redirectInfo && (i ?? (i = [])).push(da(void 0, _.File_redirects_to_file_0, XS(e.redirectInfo.redirectTarget, t))), kd(e)) switch (e.impliedNodeFormat) { case 99: e.packageJsonScope && (i ?? (i = [])).push(da(void 0, _.File_is_ECMAScript_module_because_0_has_field_type_with_value_module, XS(To(e.packageJsonLocations), t))); break; case 1: e.packageJsonScope ? (i ?? (i = [])).push(da(void 0, e.packageJsonScope.contents.packageJsonContent.type ? _.File_is_CommonJS_module_because_0_has_field_type_whose_value_is_not_module : _.File_is_CommonJS_module_because_0_does_not_have_field_type, XS(To(e.packageJsonLocations), t))) : (r = e.packageJsonLocations) != null && r.length && (i ?? (i = [])).push(da(void 0, _.File_is_CommonJS_module_because_package_json_was_not_found)); break }return i } function Nq(e, t) { var r; let i = e.getCompilerOptions().configFile; if (!((r = i?.configFileSpecs) != null && r.validatedFilesSpec)) return; let o = e.getCanonicalFileName(t), s = ni(_a(i.fileName, e.getCurrentDirectory())); return wr(i.configFileSpecs.validatedFilesSpec, l => e.getCanonicalFileName(_a(l, s)) === o) } function Pq(e, t) { var r, i; let o = e.getCompilerOptions().configFile; if (!((r = o?.configFileSpecs) != null && r.validatedIncludeSpecs)) return; if (o.configFileSpecs.isDefaultIncludeSpec) return !0; let s = Gc(t, ".json"), l = ni(_a(o.fileName, e.getCurrentDirectory())), f = e.useCaseSensitiveFileNames(); return wr((i = o?.configFileSpecs) == null ? void 0 : i.validatedIncludeSpecs, d => { if (s && !Oc(d, ".json")) return !1; let g = kW(d, l, "files"); return !!g && Qy(`(${g})$`, f).test(t) }) } function Mq(e, t, r) { var i, o; let s = e.getCompilerOptions(); if (vb(t)) { let l = YL(g => e.getSourceFileByPath(g), t), f = F2(l) ? l.file.text.substring(l.pos, l.end) : `"${l.text}"`, d; switch (L.assert(F2(l) || t.kind === 3, "Only synthetic references are imports"), t.kind) { case 3: F2(l) ? d = l.packageId ? _.Imported_via_0_from_file_1_with_packageId_2 : _.Imported_via_0_from_file_1 : l.text === _b ? d = l.packageId ? _.Imported_via_0_from_file_1_with_packageId_2_to_import_importHelpers_as_specified_in_compilerOptions : _.Imported_via_0_from_file_1_to_import_importHelpers_as_specified_in_compilerOptions : d = l.packageId ? _.Imported_via_0_from_file_1_with_packageId_2_to_import_jsx_and_jsxs_factory_functions : _.Imported_via_0_from_file_1_to_import_jsx_and_jsxs_factory_functions; break; case 4: L.assert(!l.packageId), d = _.Referenced_via_0_from_file_1; break; case 5: d = l.packageId ? _.Type_library_referenced_via_0_from_file_1_with_packageId_2 : _.Type_library_referenced_via_0_from_file_1; break; case 7: L.assert(!l.packageId), d = _.Library_referenced_via_0_from_file_1; break; default: L.assertNever(t) }return da(void 0, d, f, XS(l.file, r), l.packageId && hT(l.packageId)) } switch (t.kind) { case 0: if (!((i = s.configFile) != null && i.configFileSpecs)) return da(void 0, _.Root_file_specified_for_compilation); let l = _a(e.getRootFileNames()[t.index], e.getCurrentDirectory()); if (Nq(e, l)) return da(void 0, _.Part_of_files_list_in_tsconfig_json); let d = Pq(e, l); return Ta(d) ? da(void 0, _.Matched_by_include_pattern_0_in_1, d, XS(s.configFile, r)) : da(void 0, d ? _.Matched_by_default_include_pattern_Asterisk_Asterisk_Slash_Asterisk : _.Root_file_specified_for_compilation); case 1: case 2: let g = t.kind === 2, m = L.checkDefined((o = e.getResolvedProjectReferences()) == null ? void 0 : o[t.index]); return da(void 0, Ss(s) ? g ? _.Output_from_referenced_project_0_included_because_1_specified : _.Source_from_referenced_project_0_included_because_1_specified : g ? _.Output_from_referenced_project_0_included_because_module_is_specified_as_none : _.Source_from_referenced_project_0_included_because_module_is_specified_as_none, XS(m.sourceFile.fileName, r), s.outFile ? "--outFile" : "--out"); case 8: return da(void 0, s.types ? t.packageId ? _.Entry_point_of_type_library_0_specified_in_compilerOptions_with_packageId_1 : _.Entry_point_of_type_library_0_specified_in_compilerOptions : t.packageId ? _.Entry_point_for_implicit_type_library_0_with_packageId_1 : _.Entry_point_for_implicit_type_library_0, t.typeReference, t.packageId && hT(t.packageId)); case 6: if (t.index !== void 0) return da(void 0, _.Library_0_specified_in_compilerOptions, s.lib[t.index]); let v = Ld(zO.type, (S, x) => S === Do(s) ? x : void 0); return da(void 0, v ? _.Default_library_for_target_0 : _.Default_library, v); default: L.assertNever(t) } } function XS(e, t) { let r = Ta(e) ? e : e.fileName; return t ? t(r) : r } function qF(e, t, r, i, o, s, l, f) { let d = !!e.getCompilerOptions().listFilesOnly, g = e.getConfigFileParsingDiagnostics().slice(), m = g.length; si(g, e.getSyntacticDiagnostics(void 0, s)), g.length === m && (si(g, e.getOptionsDiagnostics(s)), d || (si(g, e.getGlobalDiagnostics(s)), g.length === m && si(g, e.getSemanticDiagnostics(void 0, s)))); let v = d ? { emitSkipped: !0, diagnostics: Je } : e.emit(void 0, o, s, l, f), { emittedFiles: S, diagnostics: x } = v; si(g, x); let A = vA(g); if (A.forEach(t), r) { let w = e.getCurrentDirectory(); mn(S, C => { let P = _a(C, w); r(`TSFILE: ${P}`) }), Rq(e, r) } return i && i(JF(A), KF(A)), { emitResult: v, diagnostics: A } } function vme(e, t, r, i, o, s, l, f) { let { emitResult: d, diagnostics: g } = qF(e, t, r, i, o, s, l, f); return d.emitSkipped && g.length > 0 ? 1 : g.length > 0 ? 2 : 0 } function Fq(e = xl, t) { return { onWatchStatusChange: t || pme(e), watchFile: ho(e, e.watchFile) || TN, watchDirectory: ho(e, e.watchDirectory) || TN, setTimeout: ho(e, e.setTimeout) || Ba, clearTimeout: ho(e, e.clearTimeout) || Ba } } function Gq(e, t) { let r = e.trace ? t.extendedDiagnostics ? 2 : t.diagnostics ? 1 : 0 : 0, i = r !== 0 ? s => e.trace(s) : Ba, o = Upe(e, r, i); return o.writeLog = i, o } function Bq(e, t, r = e) { let i = e.useCaseSensitiveFileNames(), o = { getSourceFile: eq((s, l) => l ? e.readFile(s, l) : o.readFile(s), t, void 0), getDefaultLibLocation: ho(e, e.getDefaultLibLocation), getDefaultLibFileName: s => e.getDefaultLibFileName(s), writeFile: tq((s, l, f) => e.writeFile(s, l, f), s => e.createDirectory(s), s => e.directoryExists(s)), getCurrentDirectory: zu(() => e.getCurrentDirectory()), useCaseSensitiveFileNames: () => i, getCanonicalFileName: Dl(i), getNewLine: () => db(t()), fileExists: s => e.fileExists(s), readFile: s => e.readFile(s), trace: ho(e, e.trace), directoryExists: ho(r, r.directoryExists), getDirectories: ho(r, r.getDirectories), realpath: ho(e, e.realpath), getEnvironmentVariable: ho(e, e.getEnvironmentVariable) || (() => ""), createHash: ho(e, e.createHash), readDirectory: ho(e, e.readDirectory), storeFilesChangingSignatureDuringEmit: e.storeFilesChangingSignatureDuringEmit }; return o } function XF(e, t) { if (t.match(TK)) { let r = t.length, i = r; for (let o = r - 1; o >= 0; o--) { let s = t.charCodeAt(o); switch (s) { case 10: o && t.charCodeAt(o - 1) === 13 && o--; case 13: break; default: if (s < 127 || !Wl(s)) { i = o; continue } break }let l = t.substring(i, r); if (l.match(hF)) { t = t.substring(0, i); break } else if (!l.match(gF)) break; r = i } } return (e.createHash || aw)(t) } function YF(e) { let t = e.getSourceFile; e.getSourceFile = (...r) => { let i = t.call(e, ...r); return i && (i.version = XF(e, i.text)), i } } function Uq(e, t) { let r = zu(() => ni(So(e.getExecutingFilePath()))); return { useCaseSensitiveFileNames: () => e.useCaseSensitiveFileNames, getNewLine: () => e.newLine, getCurrentDirectory: zu(() => e.getCurrentDirectory()), getDefaultLibLocation: r, getDefaultLibFileName: i => vi(r(), X8(i)), fileExists: i => e.fileExists(i), readFile: (i, o) => e.readFile(i, o), directoryExists: i => e.directoryExists(i), getDirectories: i => e.getDirectories(i), readDirectory: (i, o, s, l, f) => e.readDirectory(i, o, s, l, f), realpath: ho(e, e.realpath), getEnvironmentVariable: ho(e, e.getEnvironmentVariable), trace: i => e.write(i + e.newLine), createDirectory: i => e.createDirectory(i), writeFile: (i, o, s) => e.writeFile(i, o, s), createHash: ho(e, e.createHash), createProgram: t || kq, storeFilesChangingSignatureDuringEmit: e.storeFilesChangingSignatureDuringEmit, now: ho(e, e.now) } } function bme(e = xl, t, r, i) { let o = l => e.write(l + e.newLine), s = Uq(e, t); return jU(s, Fq(e, i)), s.afterProgramCreate = l => { let f = l.getCompilerOptions(), d = db(f); qF(l, r, o, g => s.onWatchStatusChange(ps(wq(g), g), d, f, g)) }, s } function Eme(e, t, r) { t(r), e.exit(1) } function Tme({ configFileName: e, optionsToExtend: t, watchOptionsToExtend: r, extraFileExtensions: i, system: o, createProgram: s, reportDiagnostic: l, reportWatchStatus: f }) { let d = l || bN(o), g = bme(o, s, d, f); return g.onUnRecoverableConfigFileDiagnostic = m => Eme(o, d, m), g.configFileName = e, g.optionsToExtend = t, g.watchOptionsToExtend = r, g.extraFileExtensions = i, g } function Sme({ rootFiles: e, options: t, watchOptions: r, projectReferences: i, system: o, createProgram: s, reportDiagnostic: l, reportWatchStatus: f }) { let d = bme(o, s, l || bN(o), f); return d.rootFiles = e, d.options = t, d.watchOptions = r, d.projectReferences = i, d } function D8e(e) { let t = e.system || xl, r = e.host || (e.host = jq(e.options, t)), i = xme(e), o = vme(i, e.reportDiagnostic || bN(t), s => r.trace && r.trace(s), e.reportErrorSummary || e.options.pretty ? (s, l) => t.write(hme(s, l, t.newLine, r)) : void 0); return e.afterProgramEmitAndDiagnostics && e.afterProgramEmitAndDiagnostics(i), o } var Vq, $F, B2, TN, Hf, w8e = gt({ "src/compiler/watch.ts"() { "use strict"; fa(), Vq = xl ? { getCurrentDirectory: () => xl.getCurrentDirectory(), getNewLine: () => xl.newLine, getCanonicalFileName: Dl(xl.useCaseSensitiveFileNames) } : void 0, $F = [_.Starting_compilation_in_watch_mode.code, _.File_change_detected_Starting_incremental_compilation.code], B2 = { close: Ba }, TN = () => B2, Hf = { ConfigFile: "Config file", ExtendedConfigFile: "Extended config file", SourceFile: "Source file", MissingFile: "Missing file", WildcardDirectory: "Wild card directory", FailedLookupLocations: "Failed Lookup Locations", AffectingFileLocation: "File location affecting resolution", TypeRoots: "Type roots", ConfigFileOfReferencedProject: "Config file of referened project", ExtendedConfigOfReferencedProject: "Extended config file of referenced project", WildcardDirectoryOfReferencedProject: "Wild card directory of referenced project", PackageJson: "package.json file", ClosedScriptInfo: "Closed Script info", ConfigFileForInferredRoot: "Config file for the inferred project root", NodeModules: "node_modules for closed script infos and package.jsons affecting module specifier cache", MissingSourceMapFile: "Missing source map file", NoopConfigFileForInferredRoot: "Noop Config file for the inferred project root", MissingGeneratedFile: "Missing generated file", NodeModulesForModuleSpecifierCache: "node_modules for module specifier cache invalidation" } } }); function QF(e, t) { let r = Jg(e); if (!r) return; let i; if (t.getBuildInfo) i = t.getBuildInfo(r, e.configFilePath); else { let o = t.readFile(r); if (!o) return; i = IF(r, o) } if (!(!i || i.version !== Rf || !i.program)) return dme(i, r, t) } function jq(e, t = xl) { let r = nq(e, void 0, t); return r.createHash = ho(t, t.createHash), r.storeFilesChangingSignatureDuringEmit = t.storeFilesChangingSignatureDuringEmit, YF(r), pN(r, i => Ts(i, r.getCurrentDirectory(), r.getCanonicalFileName)), r } function xme({ rootNames: e, options: t, configFileParsingDiagnostics: r, projectReferences: i, host: o, createProgram: s }) { o = o || jq(t), s = s || kq; let l = QF(t, o); return s(e, t, o, l, r, i) } function R8e(e, t, r, i, o, s, l, f) { return ba(e) ? Sme({ rootFiles: e, options: t, watchOptions: f, projectReferences: l, system: r, createProgram: i, reportDiagnostic: o, reportWatchStatus: s }) : Tme({ configFileName: e, optionsToExtend: t, watchOptionsToExtend: l, extraFileExtensions: f, system: r, createProgram: i, reportDiagnostic: o, reportWatchStatus: s }) } function O8e(e) { let t, r, i, o, s, l, f, d, g = e.extendedConfigCache, m = !1, v = new Map, S, x = !1, A = e.useCaseSensitiveFileNames(), w = e.getCurrentDirectory(), { configFileName: C, optionsToExtend: P = {}, watchOptionsToExtend: F, extraFileExtensions: B, createProgram: q } = e, { rootFiles: W, options: Y, watchOptions: R, projectReferences: ie } = e, $, fe, Z = !1, U = !1, re = C === void 0 ? void 0 : Mpe(e, w, A), le = re || e, _e = FF(e, le), ge = zt(); C && e.configFileParsingResult && (En(e.configFileParsingResult), ge = zt()), Pi(_.Starting_compilation_in_watch_mode), C && !e.configFileParsingResult && (ge = db(P), L.assert(!W), Ht(), ge = zt()), L.assert(Y), L.assert(W); let { watchFile: X, watchDirectory: Ve, writeLog: we } = Gq(e, Y), ke = Dl(A); we(`Current directory: ${w} CaseSensitiveFileNames: ${A}`); let Pe; C && (Pe = X(C, An, 2e3, R, Hf.ConfigFile)); let Ce = Bq(e, () => Y, le); YF(Ce); let Ie = Ce.getSourceFile; Ce.getSourceFile = (je, ...Ge) => Gt(je, Qt(je), ...Ge), Ce.getSourceFileByPath = Gt, Ce.getNewLine = () => ge, Ce.fileExists = _n, Ce.onReleaseOldSourceFile = Ni, Ce.onReleaseParsedCommandLine = Se, Ce.toPath = Qt, Ce.getCompilationSettings = () => Y, Ce.useSourceOfProjectReferenceRedirect = ho(e, e.useSourceOfProjectReferenceRedirect), Ce.watchDirectoryOfFailedLookupLocation = (je, Ge, kt) => Ve(je, Ge, kt, R, Hf.FailedLookupLocations), Ce.watchAffectingFileLocation = (je, Ge) => X(je, Ge, 2e3, R, Hf.AffectingFileLocation), Ce.watchTypeRootsDirectory = (je, Ge, kt) => Ve(je, Ge, kt, R, Hf.TypeRoots), Ce.getCachedDirectoryStructureHost = () => re, Ce.scheduleInvalidateResolutionsOfFailedLookupLocations = nn, Ce.onInvalidatedResolution = pn, Ce.onChangedAutomaticTypeDirectiveNames = pn, Ce.fileIsOpen = m0, Ce.getCurrentProgram = ct, Ce.writeLog = we, Ce.getParsedCommandLine = dr; let Be = fme(Ce, C ? ni(_a(C, w)) : w, !1); Ce.resolveModuleNameLiterals = ho(e, e.resolveModuleNameLiterals), Ce.resolveModuleNames = ho(e, e.resolveModuleNames), !Ce.resolveModuleNameLiterals && !Ce.resolveModuleNames && (Ce.resolveModuleNameLiterals = Be.resolveModuleNameLiterals.bind(Be)), Ce.resolveTypeReferenceDirectiveReferences = ho(e, e.resolveTypeReferenceDirectiveReferences), Ce.resolveTypeReferenceDirectives = ho(e, e.resolveTypeReferenceDirectives), !Ce.resolveTypeReferenceDirectiveReferences && !Ce.resolveTypeReferenceDirectives && (Ce.resolveTypeReferenceDirectiveReferences = Be.resolveTypeReferenceDirectiveReferences.bind(Be)), Ce.getModuleResolutionCache = e.resolveModuleNameLiterals || e.resolveModuleNames ? ho(e, e.getModuleResolutionCache) : () => Be.getModuleResolutionCache(); let Le = !!e.resolveModuleNameLiterals || !!e.resolveTypeReferenceDirectiveReferences || !!e.resolveModuleNames || !!e.resolveTypeReferenceDirectives ? ho(e, e.hasInvalidatedResolutions) || h0 : m0; return t = QF(Y, Ce), Rt(), Q(), C && G(Qt(C), Y, R, Hf.ExtendedConfigFile), C ? { getCurrentProgram: _t, getProgram: hi, close: Ye } : { getCurrentProgram: _t, getProgram: hi, updateRootFileNames: qe, close: Ye }; function Ye() { pt(), Be.clear(), Tf(v, je => { je && je.fileWatcher && (je.fileWatcher.close(), je.fileWatcher = void 0) }), Pe && (Pe.close(), Pe = void 0), g?.clear(), g = void 0, d && (Tf(d, _m), d = void 0), o && (Tf(o, _m), o = void 0), i && (Tf(i, am), i = void 0), f && (Tf(f, je => { var Ge; (Ge = je.watcher) == null || Ge.close(), je.watcher = void 0, je.watchedDirectories && Tf(je.watchedDirectories, _m), je.watchedDirectories = void 0 }), f = void 0) } function _t() { return t } function ct() { return t && t.getProgramOrUndefined() } function Rt() { we("Synchronizing program"), L.assert(Y), L.assert(W), pt(); let je = _t(); x && (ge = zt(), je && eH(je.getCompilerOptions(), Y) && Be.clear()); let Ge = Be.createHasInvalidatedResolutions(Le), { originalReadFile: kt, originalFileExists: Kt, originalDirectoryExists: ln, originalCreateDirectory: ir, originalWriteFile: ae, readFileWithCache: rt } = pN(Ce, Qt); return lq(ct(), W, Y, Ot => ui(Ot, rt), Ot => Ce.fileExists(Ot), Ge, gr, dr, ie) ? U && (m && Pi(_.File_change_detected_Starting_incremental_compilation), t = q(void 0, void 0, Ce, t, fe, ie), U = !1) : (m && Pi(_.File_change_detected_Starting_incremental_compilation), We(Ge)), m = !1, e.afterProgramCreate && je !== t && e.afterProgramCreate(t), Ce.readFile = kt, Ce.fileExists = Kt, Ce.directoryExists = ln, Ce.createDirectory = ir, Ce.writeFile = ae, t } function We(je) { we("CreatingProgramWith::"), we(`  roots: ${JSON.stringify(W)}`), we(`  options: ${JSON.stringify(Y)}`), ie && we(`  projectReferences: ${JSON.stringify(ie)}`); let Ge = x || !ct(); x = !1, U = !1, Be.startCachingPerDirectoryResolution(), Ce.hasInvalidatedResolutions = je, Ce.hasChangedAutomaticTypeDirectiveNames = gr; let kt = ct(); if (t = q(W, Y, Ce, t, fe, ie), Be.finishCachingPerDirectoryResolution(t.getProgram(), kt), Gpe(t.getProgram(), i || (i = new Map), nt), Ge && Be.updateTypeRootsWatch(), S) { for (let Kt of S) i.has(Kt) || v.delete(Kt); S = void 0 } } function qe(je) { L.assert(!C, "Cannot update root file names with config file watch mode"), W = je, pn() } function zt() { return db(Y || P) } function Qt(je) { return Ts(je, w, ke) } function tn(je) { return typeof je == "boolean" } function kn(je) { return typeof je.version == "boolean" } function _n(je) { let Ge = Qt(je); return tn(v.get(Ge)) ? !1 : le.fileExists(je) } function Gt(je, Ge, kt, Kt, ln) { let ir = v.get(Ge); if (!tn(ir)) { if (ir === void 0 || ln || kn(ir)) { let ae = Ie(je, kt, Kt); if (ir) ae ? (ir.sourceFile = ae, ir.version = ae.version, ir.fileWatcher || (ir.fileWatcher = at(Ge, je, Tt, 250, R, Hf.SourceFile))) : (ir.fileWatcher && ir.fileWatcher.close(), v.set(Ge, !1)); else if (ae) { let rt = at(Ge, je, Tt, 250, R, Hf.SourceFile); v.set(Ge, { sourceFile: ae, version: ae.version, fileWatcher: rt }) } else v.set(Ge, !1); return ae } return ir.sourceFile } } function $n(je) { let Ge = v.get(je); Ge !== void 0 && (tn(Ge) ? v.set(je, { version: !1 }) : Ge.version = !1) } function ui(je, Ge) { let kt = v.get(je); if (!kt) return; if (kt.version) return kt.version; let Kt = Ge(je); return Kt !== void 0 ? XF(Ce, Kt) : void 0 } function Ni(je, Ge, kt) { let Kt = v.get(je.resolvedPath); Kt !== void 0 && (tn(Kt) ? (S || (S = [])).push(je.path) : Kt.sourceFile === je && (Kt.fileWatcher && Kt.fileWatcher.close(), v.delete(je.resolvedPath), kt || Be.removeResolutionsOfFile(je.path))) } function Pi(je) { e.onWatchStatusChange && e.onWatchStatusChange(ps(je), ge, Y || P) } function gr() { return Be.hasChangedAutomaticTypeDirectiveNames() } function pt() { return l ? (e.clearTimeout(l), l = void 0, !0) : !1 } function nn() { if (!e.setTimeout || !e.clearTimeout) return Be.invalidateResolutionsOfFailedLookupLocations(); let je = pt(); we(`Scheduling invalidateFailedLookup${je ? ", Cancelled earlier one" : ""}`), l = e.setTimeout(Dt, 250) } function Dt() { l = void 0, Be.invalidateResolutionsOfFailedLookupLocations() && pn() } function pn() { !e.setTimeout || !e.clearTimeout || (s && e.clearTimeout(s), we("Scheduling update"), s = e.setTimeout(Kn, 250)) } function An() { L.assert(!!C), r = 2, pn() } function Kn() { s = void 0, m = !0, hi() } function hi() { switch (r) { case 1: fp.logStartUpdateProgram("PartialConfigReload"), ri(); break; case 2: fp.logStartUpdateProgram("FullConfigReload"), vn(); break; default: fp.logStartUpdateProgram("SynchronizeProgram"), Rt(); break }return fp.logStopUpdateProgram("Done"), _t() } function ri() { we("Reloading new file names and options"), L.assert(Y), L.assert(C), r = 0, W = BO(Y.configFile.configFileSpecs, _a(ni(C), w), Y, _e, B), CJ(W, _a(C, w), Y.configFile.configFileSpecs, fe, Z) && (U = !0), Rt() } function vn() { L.assert(C), we(`Reloading config file: ${C}`), r = 0, re && re.clearCache(), Ht(), x = !0, Rt(), Q(), G(Qt(C), Y, R, Hf.ExtendedConfigFile) } function Ht() { L.assert(C), En(RO(C, P, _e, g || (g = new Map), F, B)) } function En(je) { W = je.fileNames, Y = je.options, R = je.watchOptions, ie = je.projectReferences, $ = je.wildcardDirectories, fe = XT(je).slice(), Z = FO(je.raw), U = !0 } function dr(je) { let Ge = Qt(je), kt = f?.get(Ge); if (kt) { if (!kt.reloadLevel) return kt.parsedCommandLine; if (kt.parsedCommandLine && kt.reloadLevel === 1 && !e.getParsedCommandLine) { we("Reloading new file names and options"), L.assert(Y); let ln = BO(kt.parsedCommandLine.options.configFile.configFileSpecs, _a(ni(je), w), Y, _e); return kt.parsedCommandLine = { ...kt.parsedCommandLine, fileNames: ln }, kt.reloadLevel = void 0, kt.parsedCommandLine } } we(`Loading config file: ${je}`); let Kt = e.getParsedCommandLine ? e.getParsedCommandLine(je) : Cr(je); return kt ? (kt.parsedCommandLine = Kt, kt.reloadLevel = void 0) : (f || (f = new Map)).set(Ge, kt = { parsedCommandLine: Kt }), Oe(je, Ge, kt), Kt } function Cr(je) { let Ge = _e.onUnRecoverableConfigFileDiagnostic; _e.onUnRecoverableConfigFileDiagnostic = Ba; let kt = RO(je, void 0, _e, g || (g = new Map), F); return _e.onUnRecoverableConfigFileDiagnostic = Ge, kt } function Se(je) { var Ge; let kt = Qt(je), Kt = f?.get(kt); Kt && (f.delete(kt), Kt.watchedDirectories && Tf(Kt.watchedDirectories, _m), (Ge = Kt.watcher) == null || Ge.close(), Fpe(kt, d)) } function at(je, Ge, kt, Kt, ln, ir) { return X(Ge, (ae, rt) => kt(ae, rt, je), Kt, ln, ir) } function Tt(je, Ge, kt) { ve(je, kt, Ge), Ge === 2 && v.has(kt) && Be.invalidateResolutionOfFile(kt), $n(kt), pn() } function ve(je, Ge, kt) { re && re.addOrDeleteFile(je, Ge, kt) } function nt(je) { return f?.has(je) ? B2 : at(je, je, ce, 500, R, Hf.MissingFile) } function ce(je, Ge, kt) { ve(je, kt, Ge), Ge === 0 && i.has(kt) && (i.get(kt).close(), i.delete(kt), $n(kt), pn()) } function Q() { $ ? kF(o || (o = new Map), new Map(Object.entries($)), ue) : o && Tf(o, _m) } function ue(je, Ge) { return Ve(je, kt => { L.assert(C), L.assert(Y); let Kt = Qt(kt); re && re.addOrDeleteFileOrDirectory(kt, Kt), $n(Kt), !DF({ watchedDirPath: Qt(je), fileOrDirectory: kt, fileOrDirectoryPath: Kt, configFileName: C, extraFileExtensions: B, options: Y, program: _t() || W, currentDirectory: w, useCaseSensitiveFileNames: A, writeLog: we, toPath: Qt }) && r !== 2 && (r = 1, pn()) }, Ge, R, Hf.WildcardDirectory) } function G(je, Ge, kt, Kt) { L.assert(C), YK(je, Ge, d || (d = new Map), (ln, ir) => X(ln, (ae, rt) => { var Ot; ve(ln, ir, rt), g && $K(g, ir, Qt); let Ke = (Ot = d.get(ir)) == null ? void 0 : Ot.projects; Ke?.size && Ke.forEach(oe => { if (Qt(C) === oe) r = 2; else { let pe = f?.get(oe); pe && (pe.reloadLevel = 2), Be.removeResolutionsFromProjectReferenceRedirects(oe) } pn() }) }, 2e3, kt, Kt), Qt) } function Oe(je, Ge, kt) { var Kt, ln, ir, ae, rt; kt.watcher || (kt.watcher = X(je, (Ot, Ke) => { ve(je, Ge, Ke); let oe = f?.get(Ge); oe && (oe.reloadLevel = 2), Be.removeResolutionsFromProjectReferenceRedirects(Ge), pn() }, 2e3, ((Kt = kt.parsedCommandLine) == null ? void 0 : Kt.watchOptions) || R, Hf.ConfigFileOfReferencedProject)), (ln = kt.parsedCommandLine) != null && ln.wildcardDirectories ? kF(kt.watchedDirectories || (kt.watchedDirectories = new Map), new Map(Object.entries((ir = kt.parsedCommandLine) == null ? void 0 : ir.wildcardDirectories)), (Ot, Ke) => { var oe; return Ve(Ot, pe => { let z = Qt(pe); re && re.addOrDeleteFileOrDirectory(pe, z), $n(z); let Te = f?.get(Ge); Te?.parsedCommandLine && (DF({ watchedDirPath: Qt(Ot), fileOrDirectory: pe, fileOrDirectoryPath: z, configFileName: je, options: Te.parsedCommandLine.options, program: Te.parsedCommandLine.fileNames, currentDirectory: w, useCaseSensitiveFileNames: A, writeLog: we, toPath: Qt }) || Te.reloadLevel !== 2 && (Te.reloadLevel = 1, pn())) }, Ke, ((oe = kt.parsedCommandLine) == null ? void 0 : oe.watchOptions) || R, Hf.WildcardDirectoryOfReferencedProject) }) : kt.watchedDirectories && (Tf(kt.watchedDirectories, _m), kt.watchedDirectories = void 0), G(Ge, (ae = kt.parsedCommandLine) == null ? void 0 : ae.options, ((rt = kt.parsedCommandLine) == null ? void 0 : rt.watchOptions) || R, Hf.ExtendedConfigOfReferencedProject) } } var N8e = gt({ "src/compiler/watchPublic.ts"() { "use strict"; fa(), fa() } }); function Hq(e) { return Gc(e, ".json") ? e : vi(e, "tsconfig.json") } var Wq, P8e = gt({ "src/compiler/tsbuild.ts"() { "use strict"; fa(), Wq = (e => (e[e.Unbuildable = 0] = "Unbuildable", e[e.UpToDate = 1] = "UpToDate", e[e.UpToDateWithUpstreamTypes = 2] = "UpToDateWithUpstreamTypes", e[e.OutOfDateWithPrepend = 3] = "OutOfDateWithPrepend", e[e.OutputMissing = 4] = "OutputMissing", e[e.ErrorReadingFile = 5] = "ErrorReadingFile", e[e.OutOfDateWithSelf = 6] = "OutOfDateWithSelf", e[e.OutOfDateWithUpstream = 7] = "OutOfDateWithUpstream", e[e.OutOfDateBuildInfo = 8] = "OutOfDateBuildInfo", e[e.OutOfDateOptions = 9] = "OutOfDateOptions", e[e.OutOfDateRoots = 10] = "OutOfDateRoots", e[e.UpstreamOutOfDate = 11] = "UpstreamOutOfDate", e[e.UpstreamBlocked = 12] = "UpstreamBlocked", e[e.ComputingUpstream = 13] = "ComputingUpstream", e[e.TsVersionOutputOfDate = 14] = "TsVersionOutputOfDate", e[e.UpToDateWithInputFileText = 15] = "UpToDateWithInputFileText", e[e.ContainerOnly = 16] = "ContainerOnly", e[e.ForceBuild = 17] = "ForceBuild", e))(Wq || {}) } }); function M8e(e, t, r) { let i = e.get(t), o; return i || (o = r(), e.set(t, o)), i || o } function zq(e, t) { return M8e(e, t, () => new Map) } function SN(e) { return e.now ? e.now() : new Date } function YS(e) { return !!e && !!e.buildOrder } function ZF(e) { return YS(e) ? e.buildOrder : e } function Ame(e, t) { return r => { let i = t ? `[${iE(EN(e), "\x1B[90m")}] ` : `${EN(e)} - `; i += `${sv(r.messageText, e.newLine)}${e.newLine + e.newLine}`, e.write(i) } } function Cme(e, t, r, i) { let o = Uq(e, t); return o.getModifiedTime = e.getModifiedTime ? s => e.getModifiedTime(s) : Qv, o.setModifiedTime = e.setModifiedTime ? (s, l) => e.setModifiedTime(s, l) : Ba, o.deleteFile = e.deleteFile ? s => e.deleteFile(s) : Ba, o.reportDiagnostic = r || bN(e), o.reportSolutionBuilderStatus = i || Ame(e), o.now = ho(e, e.now), o } function F8e(e = xl, t, r, i, o) { let s = Cme(e, t, r, i); return s.reportErrorSummary = o, s } function G8e(e = xl, t, r, i, o) { let s = Cme(e, t, r, i), l = Fq(e, o); return jU(s, l), s } function B8e(e) { let t = {}; return WO.forEach(r => { fs(e, r.name) && (t[r.name] = e[r.name]) }), t } function U8e(e, t, r) { return Xme(!1, e, t, r) } function V8e(e, t, r, i) { return Xme(!0, e, t, r, i) } function j8e(e, t, r, i, o) { let s = t, l = t, f = B8e(i), d = Bq(s, () => A.projectCompilerOptions); YF(d), d.getParsedCommandLine = w => $T(A, w, z_(A, w)), d.resolveModuleNameLiterals = ho(s, s.resolveModuleNameLiterals), d.resolveTypeReferenceDirectiveReferences = ho(s, s.resolveTypeReferenceDirectiveReferences), d.resolveModuleNames = ho(s, s.resolveModuleNames), d.resolveTypeReferenceDirectives = ho(s, s.resolveTypeReferenceDirectives), d.getModuleResolutionCache = ho(s, s.getModuleResolutionCache); let g, m; !d.resolveModuleNameLiterals && !d.resolveModuleNames && (g = Y3(d.getCurrentDirectory(), d.getCanonicalFileName), d.resolveModuleNameLiterals = (w, C, P, F, B) => hN(w, C, P, F, B, s, g, cq), d.getModuleResolutionCache = () => g), !d.resolveTypeReferenceDirectiveReferences && !d.resolveTypeReferenceDirectives && (m = $3(d.getCurrentDirectory(), d.getCanonicalFileName, void 0, g?.getPackageJsonInfoCache()), d.resolveTypeReferenceDirectiveReferences = (w, C, P, F, B) => hN(w, C, P, F, B, s, m, OF)), d.getBuildInfo = (w, C) => Ume(A, w, z_(A, C), void 0); let { watchFile: v, watchDirectory: S, writeLog: x } = Gq(l, i), A = { host: s, hostWithWatch: l, parseConfigFileHost: FF(s), write: ho(s, s.trace), options: i, baseCompilerOptions: f, rootNames: r, baseWatchOptions: o, resolvedConfigFilePaths: new Map, configFileCache: new Map, projectStatus: new Map, extendedConfigCache: new Map, buildInfoCache: new Map, outputTimeStamps: new Map, builderPrograms: new Map, diagnostics: new Map, projectPendingBuild: new Map, projectErrorsReported: new Map, compilerHost: d, moduleResolutionCache: g, typeReferenceDirectiveResolutionCache: m, buildOrder: void 0, readFileWithCache: w => s.readFile(w), projectCompilerOptions: f, cache: void 0, allProjectBuildPending: !0, needsSummary: !0, watchAllProjectsPending: e, watch: e, allWatchedWildcardDirectories: new Map, allWatchedInputFiles: new Map, allWatchedConfigFiles: new Map, allWatchedExtendedConfigFiles: new Map, allWatchedPackageJsonFiles: new Map, filesWatched: new Map, lastCachedPackageJsonLookups: new Map, timerToBuildInvalidatedProject: void 0, reportFileChangeDetected: !1, watchFile: v, watchDirectory: S, writeLog: x }; return A } function fd(e, t) { return Ts(t, e.compilerHost.getCurrentDirectory(), e.compilerHost.getCanonicalFileName) } function z_(e, t) { let { resolvedConfigFilePaths: r } = e, i = r.get(t); if (i !== void 0) return i; let o = fd(e, t); return r.set(t, o), o } function Ime(e) { return !!e.options } function H8e(e, t) { let r = e.configFileCache.get(t); return r && Ime(r) ? r : void 0 } function $T(e, t, r) { let { configFileCache: i } = e, o = i.get(r); if (o) return Ime(o) ? o : void 0; Fs("SolutionBuilder::beforeConfigFileParsing"); let s, { parseConfigFileHost: l, baseCompilerOptions: f, baseWatchOptions: d, extendedConfigCache: g, host: m } = e, v; return m.getParsedCommandLine ? (v = m.getParsedCommandLine(t), v || (s = ps(_.File_0_not_found, t))) : (l.onUnRecoverableConfigFileDiagnostic = S => s = S, v = RO(t, f, l, g, d), l.onUnRecoverableConfigFileDiagnostic = Ba), i.set(r, v || s), Fs("SolutionBuilder::afterConfigFileParsing"), hf("SolutionBuilder::Config file parsing", "SolutionBuilder::beforeConfigFileParsing", "SolutionBuilder::afterConfigFileParsing"), v } function U2(e, t) { return Hq(Fy(e.compilerHost.getCurrentDirectory(), t)) } function Lme(e, t) {
+                let r = new Map, i = new Map, o = [], s, l; for (let d of t) f(d); return l ? { buildOrder: s || Je, circularDiagnostics: l } : s || Je; function f(d, g) {
+                    let m = z_(e, d); if (i.has(m)) return; if (r.has(m)) {
+                        g || (l || (l = [])).push(ps(_.Project_references_may_not_form_a_circular_graph_Cycle_detected_Colon_0, o.join(`\r
+`))); return
+                    } r.set(m, !0), o.push(d); let v = $T(e, d, m); if (v && v.projectReferences) for (let S of v.projectReferences) { let x = U2(e, S.path); f(x, g || S.circular) } o.pop(), i.set(m, !0), (s || (s = [])).push(d)
+                }
+            } function xN(e) { return e.buildOrder || W8e(e) } function W8e(e) { let t = Lme(e, e.rootNames.map(o => U2(e, o))); e.resolvedConfigFilePaths.clear(); let r = new Map(ZF(t).map(o => [z_(e, o), !0])), i = { onDeleteValue: Ba }; return Oh(e.configFileCache, r, i), Oh(e.projectStatus, r, i), Oh(e.builderPrograms, r, i), Oh(e.diagnostics, r, i), Oh(e.projectPendingBuild, r, i), Oh(e.projectErrorsReported, r, i), Oh(e.buildInfoCache, r, i), Oh(e.outputTimeStamps, r, i), e.watch && (Oh(e.allWatchedConfigFiles, r, { onDeleteValue: am }), e.allWatchedExtendedConfigFiles.forEach(o => { o.projects.forEach(s => { r.has(s) || o.projects.delete(s) }), o.close() }), Oh(e.allWatchedWildcardDirectories, r, { onDeleteValue: o => o.forEach(_m) }), Oh(e.allWatchedInputFiles, r, { onDeleteValue: o => o.forEach(am) }), Oh(e.allWatchedPackageJsonFiles, r, { onDeleteValue: o => o.forEach(am) })), e.buildOrder = t } function kme(e, t, r) { let i = t && U2(e, t), o = xN(e); if (YS(o)) return o; if (i) { let l = z_(e, i); if (Yc(o, d => z_(e, d) === l) === -1) return } let s = i ? Lme(e, [i]) : o; return L.assert(!YS(s)), L.assert(!r || i !== void 0), L.assert(!r || s[s.length - 1] === i), r ? s.slice(0, s.length - 1) : s } function Dme(e) { e.cache && Jq(e); let { compilerHost: t, host: r } = e, i = e.readFileWithCache, o = t.getSourceFile, { originalReadFile: s, originalFileExists: l, originalDirectoryExists: f, originalCreateDirectory: d, originalWriteFile: g, getSourceFileWithCache: m, readFileWithCache: v } = pN(r, S => fd(e, S), (...S) => o.call(t, ...S)); e.readFileWithCache = v, t.getSourceFile = m, e.cache = { originalReadFile: s, originalFileExists: l, originalDirectoryExists: f, originalCreateDirectory: d, originalWriteFile: g, originalReadFileWithCache: i, originalGetSourceFile: o } } function Jq(e) { if (!e.cache) return; let { cache: t, host: r, compilerHost: i, extendedConfigCache: o, moduleResolutionCache: s, typeReferenceDirectiveResolutionCache: l } = e; r.readFile = t.originalReadFile, r.fileExists = t.originalFileExists, r.directoryExists = t.originalDirectoryExists, r.createDirectory = t.originalCreateDirectory, r.writeFile = t.originalWriteFile, i.getSourceFile = t.originalGetSourceFile, e.readFileWithCache = t.originalReadFileWithCache, o.clear(), s?.clear(), l?.clear(), e.cache = void 0 } function wme(e, t) { e.projectStatus.delete(t), e.diagnostics.delete(t) } function Rme({ projectPendingBuild: e }, t, r) { let i = e.get(t); (i === void 0 || i < r) && e.set(t, r) } function Ome(e, t) { if (!e.allProjectBuildPending) return; e.allProjectBuildPending = !1, e.options.watch && iX(e, _.Starting_compilation_in_watch_mode), Dme(e), ZF(xN(e)).forEach(i => e.projectPendingBuild.set(z_(e, i), 0)), t && t.throwIfCancellationRequested() } function Nme(e, t) { return e.projectPendingBuild.delete(t), e.diagnostics.has(t) ? 1 : 0 } function z8e(e, t, r, i, o) { let s = !0; return { kind: 2, project: t, projectPath: r, buildOrder: o, getCompilerOptions: () => i.options, getCurrentDirectory: () => e.compilerHost.getCurrentDirectory(), updateOutputFileStatmps: () => { jme(e, i, r), s = !1 }, done: () => (s && jme(e, i, r), Fs("SolutionBuilder::Timestamps only updates"), Nme(e, r)) } } function Pme(e, t, r, i, o, s, l) { let f = e === 0 ? 0 : 4, d, g, m; return e === 0 ? { kind: e, project: r, projectPath: i, buildOrder: l, getCompilerOptions: () => s.options, getCurrentDirectory: () => t.compilerHost.getCurrentDirectory(), getBuilderProgram: () => S(Ks), getProgram: () => S(R => R.getProgramOrUndefined()), getSourceFile: R => S(ie => ie.getSourceFile(R)), getSourceFiles: () => x(R => R.getSourceFiles()), getOptionsDiagnostics: R => x(ie => ie.getOptionsDiagnostics(R)), getGlobalDiagnostics: R => x(ie => ie.getGlobalDiagnostics(R)), getConfigFileParsingDiagnostics: () => x(R => R.getConfigFileParsingDiagnostics()), getSyntacticDiagnostics: (R, ie) => x($ => $.getSyntacticDiagnostics(R, ie)), getAllDependencies: R => x(ie => ie.getAllDependencies(R)), getSemanticDiagnostics: (R, ie) => x($ => $.getSemanticDiagnostics(R, ie)), getSemanticDiagnosticsOfNextAffectedFile: (R, ie) => S($ => $.getSemanticDiagnosticsOfNextAffectedFile && $.getSemanticDiagnosticsOfNextAffectedFile(R, ie)), emit: (R, ie, $, fe, Z) => { if (R || fe) return S(U => { var re, le; return U.emit(R, ie, $, fe, Z || ((le = (re = t.host).getCustomTransformers) == null ? void 0 : le.call(re, r))) }); if (Y(2, $), f === 5) return B(ie, $); if (f === 3) return F(ie, $, Z) }, done: v } : { kind: e, project: r, projectPath: i, buildOrder: l, getCompilerOptions: () => s.options, getCurrentDirectory: () => t.compilerHost.getCurrentDirectory(), emit: (R, ie) => f !== 4 ? m : W(R, ie), done: v }; function v(R, ie, $) { return Y(8, R, ie, $), Fs(e === 0 ? "SolutionBuilder::Projects built" : "SolutionBuilder::Bundles updated"), Nme(t, i) } function S(R) { return Y(0), d && R(d) } function x(R) { return S(R) || Je } function A() { var R, ie; if (L.assert(d === void 0), t.options.dry) { hu(t, _.A_non_dry_build_would_build_project_0, r), g = 1, f = 7; return } if (t.options.verbose && hu(t, _.Building_project_0, r), s.fileNames.length === 0) { V2(t, i, XT(s)), g = 0, f = 7; return } let { host: $, compilerHost: fe } = t; t.projectCompilerOptions = s.options, (R = t.moduleResolutionCache) == null || R.update(s.options), (ie = t.typeReferenceDirectiveResolutionCache) == null || ie.update(s.options), d = $.createProgram(s.fileNames, s.options, fe, K8e(t, i, s), XT(s), s.projectReferences), t.watch && (t.lastCachedPackageJsonLookups.set(i, t.moduleResolutionCache && on(t.moduleResolutionCache.getPackageJsonInfoCache().entries(), ([Z, U]) => [t.host.realpath && U ? fd(t, t.host.realpath(Z)) : Z, U])), t.builderPrograms.set(i, d)), f++ } function w(R, ie, $) { R.length ? { buildResult: g, step: f } = Xq(t, i, d, s, R, ie, $) : f++ } function C(R) { L.assertIsDefined(d), w([...d.getConfigFileParsingDiagnostics(), ...d.getOptionsDiagnostics(R), ...d.getGlobalDiagnostics(R), ...d.getSyntacticDiagnostics(void 0, R)], 8, "Syntactic") } function P(R) { w(L.checkDefined(d).getSemanticDiagnostics(void 0, R), 16, "Semantic") } function F(R, ie, $) { var fe, Z, U; L.assertIsDefined(d), L.assert(f === 3); let re = d.saveEmitState(), le, _e = Ye => (le || (le = [])).push(Ye), ge = [], { emitResult: X } = qF(d, _e, void 0, void 0, (Ye, _t, ct, Rt, We, qe) => ge.push({ name: Ye, text: _t, writeByteOrderMark: ct, data: qe }), ie, !1, $ || ((Z = (fe = t.host).getCustomTransformers) == null ? void 0 : Z.call(fe, r))); if (le) return d.restoreEmitState(re), { buildResult: g, step: f } = Xq(t, i, d, s, le, 32, "Declaration file"), { emitSkipped: !0, diagnostics: X.diagnostics }; let { host: Ve, compilerHost: we } = t, ke = (U = d.hasChangedEmitSignature) != null && U.call(d) ? 0 : 2, Pe = XA(), Ce = new Map, Ie = d.getCompilerOptions(), Be = NR(Ie), Ne, Le; return ge.forEach(({ name: Ye, text: _t, writeByteOrderMark: ct, data: Rt }) => { let We = fd(t, Ye); Ce.set(fd(t, Ye), Ye), Rt?.buildInfo && $q(t, Rt.buildInfo, i, Ie, ke); let qe = Rt?.differsOnlyInMap ? $1(t.host, Ye) : void 0; BI(R ? { writeFile: R } : we, Pe, Ye, _t, ct), Rt?.differsOnlyInMap ? t.host.setModifiedTime(Ye, qe) : !Be && t.watch && (Ne || (Ne = Yq(t, i))).set(We, Le || (Le = SN(t.host))) }), q(Pe, Ce, ge.length ? ge[0].name : JK(s, !Ve.useCaseSensitiveFileNames()), ke), X } function B(R, ie) { L.assertIsDefined(d), L.assert(f === 5); let $ = d.emitBuildInfo((fe, Z, U, re, le, _e) => { _e?.buildInfo && $q(t, _e.buildInfo, i, d.getCompilerOptions(), 2), R ? R(fe, Z, U, re, le, _e) : t.compilerHost.writeFile(fe, Z, U, re, le, _e) }, ie); return $.diagnostics.length && (CN(t, $.diagnostics), t.diagnostics.set(i, [...t.diagnostics.get(i), ...$.diagnostics]), g = 64 & g), $.emittedFiles && t.write && $.emittedFiles.forEach(fe => Gme(t, s, fe)), qq(t, d, s), f = 7, $ } function q(R, ie, $, fe) { let Z = R.getDiagnostics(); return Z.length ? ({ buildResult: g, step: f } = Xq(t, i, d, s, Z, 64, "Emit"), Z) : (t.write && ie.forEach(U => Gme(t, s, U)), Vme(t, s, i, _.Updating_unchanged_output_timestamps_of_project_0, ie), t.diagnostics.delete(i), t.projectStatus.set(i, { type: 1, oldestOutputFileName: $ }), qq(t, d, s), f = 7, g = fe, Z) } function W(R, ie) { var $, fe, Z, U; if (L.assert(e === 1), t.options.dry) { hu(t, _.A_non_dry_build_would_update_output_of_project_0, r), g = 1, f = 7; return } t.options.verbose && hu(t, _.Updating_output_of_project_0, r); let { compilerHost: re } = t; t.projectCompilerOptions = s.options, (fe = ($ = t.host).beforeEmitBundle) == null || fe.call($, s); let le = Ppe(s, re, ke => { let Pe = U2(t, ke.path); return $T(t, Pe, z_(t, Pe)) }, ie || ((U = (Z = t.host).getCustomTransformers) == null ? void 0 : U.call(Z, r))); if (Ta(le)) return hu(t, _.Cannot_update_output_of_project_0_because_there_was_error_reading_file_1, r, cl(t, le)), f = 6, m = Pme(0, t, r, i, o, s, l); L.assert(!!le.length); let _e = XA(), ge = new Map, X = 2, Ve = t.buildInfoCache.get(i).buildInfo || void 0; return le.forEach(({ name: ke, text: Pe, writeByteOrderMark: Ce, data: Ie }) => { var Be, Ne; ge.set(fd(t, ke), ke), Ie?.buildInfo && (((Be = Ie.buildInfo.program) == null ? void 0 : Be.outSignature) !== ((Ne = Ve?.program) == null ? void 0 : Ne.outSignature) && (X &= -3), $q(t, Ie.buildInfo, i, s.options, X)), BI(R ? { writeFile: R } : re, _e, ke, Pe, Ce) }), { emitSkipped: !1, diagnostics: q(_e, ge, le[0].name, X) } } function Y(R, ie, $, fe) { for (; f <= R && f < 8;) { let Z = f; switch (f) { case 0: A(); break; case 1: C(ie); break; case 2: P(ie); break; case 3: F($, ie, fe); break; case 5: B($, ie); break; case 4: W($, fe); break; case 6: L.checkDefined(m).done(ie, $, fe), f = 8; break; case 7: $8e(t, r, i, o, s, l, L.checkDefined(g)), f++; break; case 8: default: }L.assert(f > Z) } } } function J8e({ options: e }, t, r) { return t.type !== 3 || e.force ? !0 : r.fileNames.length === 0 || !!XT(r).length || !NR(r.options) } function Mme(e, t, r) { if (!e.projectPendingBuild.size || YS(t)) return; let { options: i, projectPendingBuild: o } = e; for (let s = 0; s < t.length; s++) { let l = t[s], f = z_(e, l), d = e.projectPendingBuild.get(f); if (d === void 0) continue; r && (r = !1, Qme(e, t)); let g = $T(e, l, f); if (!g) { Yme(e, f), o.delete(f); continue } d === 2 ? (Jme(e, l, f, g), Kme(e, f, g), qme(e, l, f, g), nX(e, l, f, g), rX(e, l, f, g)) : d === 1 && (g.fileNames = BO(g.options.configFile.configFileSpecs, ni(l), g.options, e.parseConfigFileHost), CJ(g.fileNames, l, g.options.configFile.configFileSpecs, g.errors, FO(g.raw)), nX(e, l, f, g), rX(e, l, f, g)); let m = eX(e, g, f); if (!i.force) { if (m.type === 1) { n7(e, l, m), V2(e, f, XT(g)), o.delete(f), i.dry && hu(e, _.Project_0_is_up_to_date, l); continue } if (m.type === 2 || m.type === 15) return V2(e, f, XT(g)), { kind: 2, status: m, project: l, projectPath: f, projectIndex: s, config: g } } if (m.type === 12) { n7(e, l, m), V2(e, f, XT(g)), o.delete(f), i.verbose && hu(e, m.upstreamProjectBlocked ? _.Skipping_build_of_project_0_because_its_dependency_1_was_not_built : _.Skipping_build_of_project_0_because_its_dependency_1_has_errors, l, m.upstreamProjectName); continue } if (m.type === 16) { n7(e, l, m), V2(e, f, XT(g)), o.delete(f); continue } return { kind: J8e(e, m, g) ? 0 : 1, status: m, project: l, projectPath: f, projectIndex: s, config: g } } } function Fme(e, t, r) { return n7(e, t.project, t.status), t.kind !== 2 ? Pme(t.kind, e, t.project, t.projectPath, t.projectIndex, t.config, r) : z8e(e, t.project, t.projectPath, t.config, r) } function Kq(e, t, r) { let i = Mme(e, t, r); return i && Fme(e, i, t) } function Gme({ write: e }, t, r) { e && t.options.listEmittedFiles && e(`TSFILE: ${r}`) } function K8e({ options: e, builderPrograms: t, compilerHost: r }, i, o) { if (e.force) return; let s = t.get(i); return s || QF(o.options, r) } function qq(e, t, r) { t ? (e.write && Rq(t, e.write), e.host.afterProgramEmitAndDiagnostics && e.host.afterProgramEmitAndDiagnostics(t), t.releaseProgram()) : e.host.afterEmitBundle && e.host.afterEmitBundle(r), e.projectCompilerOptions = e.baseCompilerOptions } function Xq(e, t, r, i, o, s, l) { let f = r && !Ss(r.getCompilerOptions()); return V2(e, t, o), e.projectStatus.set(t, { type: 0, reason: `${l} errors` }), f ? { buildResult: s, step: 5 } : (qq(e, r, i), { buildResult: s, step: 7 }) } function e7(e) { return !!e.watcher } function Bme(e, t) { let r = fd(e, t), i = e.filesWatched.get(r); if (e.watch && i) { if (!e7(i)) return i; if (i.modifiedTime) return i.modifiedTime } let o = $1(e.host, t); return e.watch && (i ? i.modifiedTime = o : e.filesWatched.set(r, o)), o } function t7(e, t, r, i, o, s, l) { let f = fd(e, t), d = e.filesWatched.get(f); if (d && e7(d)) d.callbacks.push(r); else { let g = e.watchFile(t, (m, v, S) => { let x = L.checkDefined(e.filesWatched.get(f)); L.assert(e7(x)), x.modifiedTime = S, x.callbacks.forEach(A => A(m, v, S)) }, i, o, s, l); e.filesWatched.set(f, { callbacks: [r], watcher: g, modifiedTime: d }) } return { close: () => { let g = L.checkDefined(e.filesWatched.get(f)); L.assert(e7(g)), g.callbacks.length === 1 ? (e.filesWatched.delete(f), _m(g)) : YD(g.callbacks, r) } } } function Yq(e, t) { if (!e.watch) return; let r = e.outputTimeStamps.get(t); return r || e.outputTimeStamps.set(t, r = new Map), r } function $q(e, t, r, i, o) { let s = Jg(i), l = Qq(e, s, r), f = SN(e.host); l ? (l.buildInfo = t, l.modifiedTime = f, o & 2 || (l.latestChangedDtsTime = f)) : e.buildInfoCache.set(r, { path: fd(e, s), buildInfo: t, modifiedTime: f, latestChangedDtsTime: o & 2 ? void 0 : f }) } function Qq(e, t, r) { let i = fd(e, t), o = e.buildInfoCache.get(r); return o?.path === i ? o : void 0 } function Ume(e, t, r, i) { let o = fd(e, t), s = e.buildInfoCache.get(r); if (s !== void 0 && s.path === o) return s.buildInfo || void 0; let l = e.readFileWithCache(t), f = l ? IF(t, l) : void 0; return e.buildInfoCache.set(r, { path: o, buildInfo: f || !1, modifiedTime: i || Eh }), f } function Zq(e, t, r, i) { let o = Bme(e, t); if (r < o) return { type: 6, outOfDateOutputFileName: i, newerInputFileName: t } } function q8e(e, t, r) { var i, o; if (!t.fileNames.length && !FO(t.raw)) return { type: 16 }; let s, l = !!e.options.force; if (t.projectReferences) { e.projectStatus.set(r, { type: 13 }); for (let $ of t.projectReferences) { let fe = $L($), Z = z_(e, fe), U = $T(e, fe, Z), re = eX(e, U, Z); if (!(re.type === 13 || re.type === 16)) { if (re.type === 0 || re.type === 12) return { type: 12, upstreamProjectName: $.path, upstreamProjectBlocked: re.type === 12 }; if (re.type !== 1) return { type: 11, upstreamProjectName: $.path }; l || (s || (s = [])).push({ ref: $, refStatus: re, resolvedRefPath: Z, resolvedConfig: U }) } } } if (l) return { type: 17 }; let { host: f } = e, d = Jg(t.options), g, m = ehe, v, S, x; if (d) { let $ = Qq(e, d, r); if (v = $?.modifiedTime || $1(f, d), v === Eh) return $ || e.buildInfoCache.set(r, { path: fd(e, d), buildInfo: !1, modifiedTime: v }), { type: 4, missingOutputFileName: d }; let fe = Ume(e, d, r, v); if (!fe) return { type: 5, fileName: d }; if ((fe.bundle || fe.program) && fe.version !== Rf) return { type: 14, version: fe.version }; if (fe.program) { if ((i = fe.program.changeFileSet) != null && i.length || (t.options.noEmit ? vt(fe.program.semanticDiagnosticsPerFile, ba) : (o = fe.program.affectedFilesPendingEmit) != null && o.length)) return { type: 8, buildInfoFile: d }; if (!t.options.noEmit && G2(t.options, fe.program.options || {})) return { type: 9, buildInfoFile: d }; S = fe.program } m = v, g = d } let A, w = Zme, C = !1, P = new Set; for (let $ of t.fileNames) { let fe = Bme(e, $); if (fe === Eh) return { type: 0, reason: `${$} does not exist` }; if (v && v < fe) { let Z, U; if (S) { x || (x = Aq(S, d, f)), Z = x.fileInfos.get(fd(e, $)); let re = Z ? e.readFileWithCache($) : void 0; U = re !== void 0 ? XF(f, re) : void 0, Z && Z === U && (C = !0) } if (!Z || Z !== U) return { type: 6, outOfDateOutputFileName: d, newerInputFileName: $ } } fe > w && (A = $, w = fe), S && P.add(fd(e, $)) } if (S) { x || (x = Aq(S, d, f)); for (let $ of x.roots) if (!P.has($)) return { type: 10, buildInfoFile: d, inputFile: $ } } if (!d) { let $ = AF(t, !f.useCaseSensitiveFileNames()), fe = Yq(e, r); for (let Z of $) { let U = fd(e, Z), re = fe?.get(U); if (re || (re = $1(e.host, Z), fe?.set(U, re)), re === Eh) return { type: 4, missingOutputFileName: Z }; if (re < w) return { type: 6, outOfDateOutputFileName: Z, newerInputFileName: A }; re < m && (m = re, g = Z) } } let F = e.buildInfoCache.get(r), B = !1, q = !1, W; if (s) for (let { ref: $, refStatus: fe, resolvedConfig: Z, resolvedRefPath: U } of s) { if (q = q || !!$.prepend, fe.newestInputFileTime && fe.newestInputFileTime <= m) continue; if (F && X8e(e, F, U)) return { type: 7, outOfDateOutputFileName: d, newerProjectName: $.path }; let re = Y8e(e, Z.options, U); if (re && re <= m) { B = !0, W = $.path; continue } return L.assert(g !== void 0, "Should have an oldest output filename here"), { type: 7, outOfDateOutputFileName: g, newerProjectName: $.path } } let Y = Zq(e, t.options.configFilePath, m, g); if (Y) return Y; let R = mn(t.options.configFile.extendedSourceFiles || Je, $ => Zq(e, $, m, g)); if (R) return R; let ie = mn(e.lastCachedPackageJsonLookups.get(r) || Je, ([$]) => Zq(e, $, m, g)); return ie || (q && B ? { type: 3, outOfDateOutputFileName: g, newerProjectName: W } : { type: B ? 2 : C ? 15 : 1, newestInputFileTime: w, newestInputFileName: A, oldestOutputFileName: g }) } function X8e(e, t, r) { return e.buildInfoCache.get(r).path === t.path } function eX(e, t, r) { if (t === void 0) return { type: 0, reason: "File deleted mid-build" }; let i = e.projectStatus.get(r); if (i !== void 0) return i; Fs("SolutionBuilder::beforeUpToDateCheck"); let o = q8e(e, t, r); return Fs("SolutionBuilder::afterUpToDateCheck"), hf("SolutionBuilder::Up-to-date check", "SolutionBuilder::beforeUpToDateCheck", "SolutionBuilder::afterUpToDateCheck"), e.projectStatus.set(r, o), o } function Vme(e, t, r, i, o) { if (t.options.noEmit) return; let s, l = Jg(t.options); if (l) { o?.has(fd(e, l)) || (e.options.verbose && hu(e, i, t.options.configFilePath), e.host.setModifiedTime(l, s = SN(e.host)), Qq(e, l, r).modifiedTime = s), e.outputTimeStamps.delete(r); return } let { host: f } = e, d = AF(t, !f.useCaseSensitiveFileNames()), g = Yq(e, r), m = g ? new Set : void 0; if (!o || d.length !== o.size) { let v = !!e.options.verbose; for (let S of d) { let x = fd(e, S); o?.has(x) || (v && (v = !1, hu(e, i, t.options.configFilePath)), f.setModifiedTime(S, s || (s = SN(e.host))), g && (g.set(x, s), m.add(x))) } } g?.forEach((v, S) => { !o?.has(S) && !m.has(S) && g.delete(S) }) } function Y8e(e, t, r) { if (!t.composite) return; let i = L.checkDefined(e.buildInfoCache.get(r)); if (i.latestChangedDtsTime !== void 0) return i.latestChangedDtsTime || void 0; let o = i.buildInfo && i.buildInfo.program && i.buildInfo.program.latestChangedDtsFile ? e.host.getModifiedTime(_a(i.buildInfo.program.latestChangedDtsFile, ni(i.path))) : void 0; return i.latestChangedDtsTime = o || !1, o } function jme(e, t, r) { if (e.options.dry) return hu(e, _.A_non_dry_build_would_update_timestamps_for_output_of_project_0, t.options.configFilePath); Vme(e, t, r, _.Updating_output_timestamps_of_project_0), e.projectStatus.set(r, { type: 1, oldestOutputFileName: JK(t, !e.host.useCaseSensitiveFileNames()) }) } function $8e(e, t, r, i, o, s, l) { if (!(l & 124) && o.options.composite) for (let f = i + 1; f < s.length; f++) { let d = s[f], g = z_(e, d); if (e.projectPendingBuild.has(g)) continue; let m = $T(e, d, g); if (!(!m || !m.projectReferences)) for (let v of m.projectReferences) { let S = U2(e, v.path); if (z_(e, S) !== r) continue; let x = e.projectStatus.get(g); if (x) switch (x.type) { case 1: if (l & 2) { v.prepend ? e.projectStatus.set(g, { type: 3, outOfDateOutputFileName: x.oldestOutputFileName, newerProjectName: t }) : x.type = 2; break } case 15: case 2: case 3: l & 2 || e.projectStatus.set(g, { type: 7, outOfDateOutputFileName: x.type === 3 ? x.outOfDateOutputFileName : x.oldestOutputFileName, newerProjectName: t }); break; case 12: z_(e, U2(e, x.upstreamProjectName)) === r && wme(e, g); break }Rme(e, g, 0); break } } } function Hme(e, t, r, i, o, s) { Fs("SolutionBuilder::beforeBuild"); let l = Q8e(e, t, r, i, o, s); return Fs("SolutionBuilder::afterBuild"), hf("SolutionBuilder::Build", "SolutionBuilder::beforeBuild", "SolutionBuilder::afterBuild"), l } function Q8e(e, t, r, i, o, s) { let l = kme(e, t, s); if (!l) return 3; Ome(e, r); let f = !0, d = 0; for (; ;) { let g = Kq(e, l, f); if (!g) break; f = !1, g.done(r, i, o?.(g.project)), e.diagnostics.has(g.projectPath) || d++ } return Jq(e), $me(e, l), n6e(e, l), YS(l) ? 4 : l.some(g => e.diagnostics.has(z_(e, g))) ? d ? 2 : 1 : 0 } function Wme(e, t, r) { Fs("SolutionBuilder::beforeClean"); let i = Z8e(e, t, r); return Fs("SolutionBuilder::afterClean"), hf("SolutionBuilder::Clean", "SolutionBuilder::beforeClean", "SolutionBuilder::afterClean"), i } function Z8e(e, t, r) {
+                let i = kme(e, t, r); if (!i) return 3; if (YS(i)) return CN(e, i.circularDiagnostics), 4; let { options: o, host: s } = e, l = o.dry ? [] : void 0; for (let f of i) { let d = z_(e, f), g = $T(e, f, d); if (g === void 0) { Yme(e, d); continue } let m = AF(g, !s.useCaseSensitiveFileNames()); if (!m.length) continue; let v = new Set(g.fileNames.map(S => fd(e, S))); for (let S of m) v.has(fd(e, S)) || s.fileExists(S) && (l ? l.push(S) : (s.deleteFile(S), tX(e, d, 0))) } return l && hu(e, _.A_non_dry_build_would_delete_the_following_files_Colon_0, l.map(f => `\r
+ * ${f}`).join("")), 0
+            } function tX(e, t, r) { e.host.getParsedCommandLine && r === 1 && (r = 2), r === 2 && (e.configFileCache.delete(t), e.buildOrder = void 0), e.needsSummary = !0, wme(e, t), Rme(e, t, r), Dme(e) } function AN(e, t, r) { e.reportFileChangeDetected = !0, tX(e, t, r), zme(e, 250, !0) } function zme(e, t, r) { let { hostWithWatch: i } = e; !i.setTimeout || !i.clearTimeout || (e.timerToBuildInvalidatedProject && i.clearTimeout(e.timerToBuildInvalidatedProject), e.timerToBuildInvalidatedProject = i.setTimeout(e6e, t, e, r)) } function e6e(e, t) { Fs("SolutionBuilder::beforeBuild"); let r = t6e(e, t); Fs("SolutionBuilder::afterBuild"), hf("SolutionBuilder::Build", "SolutionBuilder::beforeBuild", "SolutionBuilder::afterBuild"), r && $me(e, r) } function t6e(e, t) { e.timerToBuildInvalidatedProject = void 0, e.reportFileChangeDetected && (e.reportFileChangeDetected = !1, e.projectErrorsReported.clear(), iX(e, _.File_change_detected_Starting_incremental_compilation)); let r = 0, i = xN(e), o = Kq(e, i, !1); if (o) for (o.done(), r++; e.projectPendingBuild.size;) { if (e.timerToBuildInvalidatedProject) return; let s = Mme(e, i, !1); if (!s) break; if (s.kind !== 2 && (t || r === 5)) { zme(e, 100, !1); return } Fme(e, s, i).done(), s.kind !== 2 && r++ } return Jq(e), i } function Jme(e, t, r, i) { !e.watch || e.allWatchedConfigFiles.has(r) || e.allWatchedConfigFiles.set(r, t7(e, t, () => AN(e, r, 2), 2e3, i?.watchOptions, Hf.ConfigFile, t)) } function Kme(e, t, r) { YK(t, r?.options, e.allWatchedExtendedConfigFiles, (i, o) => t7(e, i, () => { var s; return (s = e.allWatchedExtendedConfigFiles.get(o)) == null ? void 0 : s.projects.forEach(l => AN(e, l, 2)) }, 2e3, r?.watchOptions, Hf.ExtendedConfigFile), i => fd(e, i)) } function qme(e, t, r, i) { e.watch && kF(zq(e.allWatchedWildcardDirectories, r), new Map(Object.entries(i.wildcardDirectories)), (o, s) => e.watchDirectory(o, l => { var f; DF({ watchedDirPath: fd(e, o), fileOrDirectory: l, fileOrDirectoryPath: fd(e, l), configFileName: t, currentDirectory: e.compilerHost.getCurrentDirectory(), options: i.options, program: e.builderPrograms.get(r) || ((f = H8e(e, r)) == null ? void 0 : f.fileNames), useCaseSensitiveFileNames: e.parseConfigFileHost.useCaseSensitiveFileNames, writeLog: d => e.writeLog(d), toPath: d => fd(e, d) }) || AN(e, r, 1) }, s, i?.watchOptions, Hf.WildcardDirectory, t)) } function nX(e, t, r, i) { e.watch && e2(zq(e.allWatchedInputFiles, r), p0(i.fileNames, o => fd(e, o)), { createNewValue: (o, s) => t7(e, s, () => AN(e, r, 0), 250, i?.watchOptions, Hf.SourceFile, t), onDeleteValue: am }) } function rX(e, t, r, i) { !e.watch || !e.lastCachedPackageJsonLookups || e2(zq(e.allWatchedPackageJsonFiles, r), new Map(e.lastCachedPackageJsonLookups.get(r)), { createNewValue: (o, s) => t7(e, o, () => AN(e, r, 0), 2e3, i?.watchOptions, Hf.PackageJson, t), onDeleteValue: am }) } function n6e(e, t) { if (e.watchAllProjectsPending) { Fs("SolutionBuilder::beforeWatcherCreation"), e.watchAllProjectsPending = !1; for (let r of ZF(t)) { let i = z_(e, r), o = $T(e, r, i); Jme(e, r, i, o), Kme(e, i, o), o && (qme(e, r, i, o), nX(e, r, i, o), rX(e, r, i, o)) } Fs("SolutionBuilder::afterWatcherCreation"), hf("SolutionBuilder::Watcher creation", "SolutionBuilder::beforeWatcherCreation", "SolutionBuilder::afterWatcherCreation") } } function r6e(e) { Tf(e.allWatchedConfigFiles, am), Tf(e.allWatchedExtendedConfigFiles, _m), Tf(e.allWatchedWildcardDirectories, t => Tf(t, _m)), Tf(e.allWatchedInputFiles, t => Tf(t, am)), Tf(e.allWatchedPackageJsonFiles, t => Tf(t, am)) } function Xme(e, t, r, i, o) { let s = j8e(e, t, r, i, o); return { build: (l, f, d, g) => Hme(s, l, f, d, g), clean: l => Wme(s, l), buildReferences: (l, f, d, g) => Hme(s, l, f, d, g, !0), cleanReferences: l => Wme(s, l, !0), getNextInvalidatedProject: l => (Ome(s, l), Kq(s, xN(s), !1)), getBuildOrder: () => xN(s), getUpToDateStatusOfProject: l => { let f = U2(s, l), d = z_(s, f); return eX(s, $T(s, f, d), d) }, invalidateProject: (l, f) => tX(s, l, f || 0), close: () => r6e(s) } } function cl(e, t) { return rI(t, e.compilerHost.getCurrentDirectory(), e.compilerHost.getCanonicalFileName) } function hu(e, t, ...r) { e.host.reportSolutionBuilderStatus(ps(t, ...r)) } function iX(e, t, ...r) { var i, o; (o = (i = e.hostWithWatch).onWatchStatusChange) == null || o.call(i, ps(t, ...r), e.host.getNewLine(), e.baseCompilerOptions) } function CN({ host: e }, t) { t.forEach(r => e.reportDiagnostic(r)) } function V2(e, t, r) { CN(e, r), e.projectErrorsReported.set(t, !0), r.length && e.diagnostics.set(t, r) } function Yme(e, t) { V2(e, t, [e.configFileCache.get(t)]) } function $me(e, t) { if (!e.needsSummary) return; e.needsSummary = !1; let r = e.watch || !!e.host.reportErrorSummary, { diagnostics: i } = e, o = 0, s = []; YS(t) ? (Qme(e, t.buildOrder), CN(e, t.circularDiagnostics), r && (o += JF(t.circularDiagnostics)), r && (s = [...s, ...KF(t.circularDiagnostics)])) : (t.forEach(l => { let f = z_(e, l); e.projectErrorsReported.has(f) || CN(e, i.get(f) || Je) }), r && i.forEach(l => o += JF(l)), r && i.forEach(l => [...s, ...KF(l)])), e.watch ? iX(e, wq(o), o) : e.host.reportErrorSummary && e.host.reportErrorSummary(o, s) } function Qme(e, t) {
+                e.options.verbose && hu(e, _.Projects_in_this_build_Colon_0, t.map(r => `\r
+    * `+ cl(e, r)).join(""))
+            } function i6e(e, t, r) { switch (r.type) { case 6: return hu(e, _.Project_0_is_out_of_date_because_output_1_is_older_than_input_2, cl(e, t), cl(e, r.outOfDateOutputFileName), cl(e, r.newerInputFileName)); case 7: return hu(e, _.Project_0_is_out_of_date_because_output_1_is_older_than_input_2, cl(e, t), cl(e, r.outOfDateOutputFileName), cl(e, r.newerProjectName)); case 4: return hu(e, _.Project_0_is_out_of_date_because_output_file_1_does_not_exist, cl(e, t), cl(e, r.missingOutputFileName)); case 5: return hu(e, _.Project_0_is_out_of_date_because_there_was_error_reading_file_1, cl(e, t), cl(e, r.fileName)); case 8: return hu(e, _.Project_0_is_out_of_date_because_buildinfo_file_1_indicates_that_some_of_the_changes_were_not_emitted, cl(e, t), cl(e, r.buildInfoFile)); case 9: return hu(e, _.Project_0_is_out_of_date_because_buildinfo_file_1_indicates_there_is_change_in_compilerOptions, cl(e, t), cl(e, r.buildInfoFile)); case 10: return hu(e, _.Project_0_is_out_of_date_because_buildinfo_file_1_indicates_that_file_2_was_root_file_of_compilation_but_not_any_more, cl(e, t), cl(e, r.buildInfoFile), cl(e, r.inputFile)); case 1: if (r.newestInputFileTime !== void 0) return hu(e, _.Project_0_is_up_to_date_because_newest_input_1_is_older_than_output_2, cl(e, t), cl(e, r.newestInputFileName || ""), cl(e, r.oldestOutputFileName || "")); break; case 3: return hu(e, _.Project_0_is_out_of_date_because_output_of_its_dependency_1_has_changed, cl(e, t), cl(e, r.newerProjectName)); case 2: return hu(e, _.Project_0_is_up_to_date_with_d_ts_files_from_its_dependencies, cl(e, t)); case 15: return hu(e, _.Project_0_is_up_to_date_but_needs_to_update_timestamps_of_output_files_that_are_older_than_input_files, cl(e, t)); case 11: return hu(e, _.Project_0_is_out_of_date_because_its_dependency_1_is_out_of_date, cl(e, t), cl(e, r.upstreamProjectName)); case 12: return hu(e, r.upstreamProjectBlocked ? _.Project_0_can_t_be_built_because_its_dependency_1_was_not_built : _.Project_0_can_t_be_built_because_its_dependency_1_has_errors, cl(e, t), cl(e, r.upstreamProjectName)); case 0: return hu(e, _.Failed_to_parse_file_0_Colon_1, cl(e, t), r.reason); case 14: return hu(e, _.Project_0_is_out_of_date_because_output_for_it_was_generated_with_version_1_that_differs_with_current_version_2, cl(e, t), r.version, Rf); case 17: return hu(e, _.Project_0_is_being_forcibly_rebuilt, cl(e, t)); case 16: case 13: break; default: } } function n7(e, t, r) { e.options.verbose && i6e(e, t, r) } var Zme, ehe, aX, a6e = gt({ "src/compiler/tsbuildPublic.ts"() { "use strict"; fa(), fa(), E0(), Zme = new Date(-864e13), ehe = new Date(864e13), aX = (e => (e[e.Build = 0] = "Build", e[e.UpdateBundle = 1] = "UpdateBundle", e[e.UpdateOutputFileStamps = 2] = "UpdateOutputFileStamps", e))(aX || {}) } }), fa = gt({ "src/compiler/_namespaces/ts.ts"() { "use strict"; gke(), Gke(), Bke(), Xke(), Qke(), Zke(), uDe(), noe(), EDe(), kDe(), DDe(), PDe(), nwe(), ERe(), TRe(), SRe(), xRe(), MRe(), URe(), VRe(), aOe(), GOe(), BOe(), YOe(), SNe(), ZNe(), aPe(), oPe(), gPe(), SPe(), RPe(), BPe(), QPe(), ZPe(), eMe(), oMe(), sMe(), cMe(), lMe(), uMe(), dMe(), fMe(), _Me(), pMe(), mMe(), hMe(), gMe(), yMe(), vMe(), EMe(), TMe(), SMe(), xMe(), AMe(), CMe(), RMe(), GMe(), XMe(), QMe(), i8e(), a8e(), o8e(), E8e(), x8e(), C8e(), w8e(), N8e(), P8e(), a6e(), dK(), E0() } }); function the(e, t) { return new r_(zD(t, `ts${Sg}`) || zD(t, "latest")).compareTo(e.version) <= 0 } function nhe(e) { return uX.has(e) ? "node" : e } function o6e(e, t) { let r = OO(t, i => e.readFile(i)); return new Map(Object.entries(r.config)) } function s6e(e, t) { var r; let i = OO(t, o => e.readFile(o)); if ((r = i.config) != null && r.simpleMap) return new Map(Object.entries(i.config.simpleMap)) } function c6e(e, t, r, i, o, s, l, f, d, g) { if (!l || !l.enable) return { cachedTypingPaths: [], newTypingNames: [], filesToWatch: [] }; let m = new Map; r = Zi(r, q => { let W = So(q); if (ES(W)) return W }); let v = []; l.include && P(l.include, "Explicitly included types"); let S = l.exclude || []; if (!g.types) { let q = new Set(r.map(ni)); q.add(i), q.forEach(W => { F(W, "bower.json", "bower_components", v), F(W, "package.json", "node_modules", v) }) } if (l.disableFilenameBasedTypeAcquisition || B(r), f) { let q = fA(f.map(nhe), z1, su); P(q, "Inferred typings from unresolved imports") } s.forEach((q, W) => { let Y = d.get(W); m.has(W) && m.get(W) === void 0 && Y !== void 0 && the(q, Y) && m.set(W, q.typingLocation) }); for (let q of S) m.delete(q) && t && t(`Typing for ${q} is in exclude list, will be ignored.`); let x = [], A = []; m.forEach((q, W) => { q !== void 0 ? A.push(q) : x.push(W) }); let w = { cachedTypingPaths: A, newTypingNames: x, filesToWatch: v }; return t && t(`Result: ${JSON.stringify(w)}`), w; function C(q) { m.has(q) || m.set(q, void 0) } function P(q, W) { t && t(`${W}: ${JSON.stringify(q)}`), mn(q, C) } function F(q, W, Y, R) { let ie = vi(q, W), $, fe; e.fileExists(ie) && (R.push(ie), $ = OO(ie, le => e.readFile(le)).config, fe = Uo([$.dependencies, $.devDependencies, $.optionalDependencies, $.peerDependencies], bh), P(fe, `Typing names in '${ie}' dependencies`)); let Z = vi(q, Y); if (R.push(Z), !e.directoryExists(Z)) return; let U = [], re = fe ? fe.map(le => vi(Z, le, W)) : e.readDirectory(Z, [".json"], void 0, void 0, 3).filter(le => { if (Hl(le) !== W) return !1; let _e = Ou(So(le)), ge = _e[_e.length - 3][0] === "@"; return ge && n_(_e[_e.length - 4]) === Y || !ge && n_(_e[_e.length - 3]) === Y }); t && t(`Searching for typing names in ${Z}; all files: ${JSON.stringify(re)}`); for (let le of re) { let _e = So(le), X = OO(_e, we => e.readFile(we)).config; if (!X.name) continue; let Ve = X.types || X.typings; if (Ve) { let we = _a(Ve, ni(_e)); e.fileExists(we) ? (t && t(`    Package '${X.name}' provides its own types.`), m.set(X.name, we)) : t && t(`    Package '${X.name}' provides its own types but they are missing.`) } else U.push(X.name) } P(U, "    Found package names") } function B(q) { let W = Zi(q, R => { if (!ES(R)) return; let ie = ld(n_(Hl(R))), $ = Lae(ie); return o.get($) }); W.length && P(W, "Inferred typings from file names"), vt(q, R => Gc(R, ".jsx")) && (t && t("Inferred 'react' typings due to presence of '.jsx' extension"), C("react")) } } function l6e(e) { return oX(e, !0) } function oX(e, t) { if (!e) return 1; if (e.length > fX) return 2; if (e.charCodeAt(0) === 46) return 3; if (e.charCodeAt(0) === 95) return 4; if (t) { let r = /^@([^/]+)\/([^/]+)$/.exec(e); if (r) { let i = oX(r[1], !1); if (i !== 0) return { name: r[1], isScopeName: !0, result: i }; let o = oX(r[2], !1); return o !== 0 ? { name: r[2], isScopeName: !1, result: o } : 0 } } return encodeURIComponent(e) !== e ? 5 : 0 } function u6e(e, t) { return typeof e == "object" ? rhe(t, e.result, e.name, e.isScopeName) : rhe(t, e, t, !1) } function rhe(e, t, r, i) { let o = i ? "Scope" : "Package"; switch (t) { case 1: return `'${e}':: ${o} name '${r}' cannot be empty`; case 2: return `'${e}':: ${o} name '${r}' should be less than ${fX} characters`; case 3: return `'${e}':: ${o} name '${r}' cannot start with '.'`; case 4: return `'${e}':: ${o} name '${r}' cannot start with '_'`; case 5: return `'${e}':: ${o} name '${r}' contains non URI safe characters`; case 0: return L.fail(); default: throw L.assertNever(t) } } var sX, cX, lX, uX, dX, fX, d6e = gt({ "src/jsTyping/jsTyping.ts"() { "use strict"; r7(), sX = ["assert", "assert/strict", "async_hooks", "buffer", "child_process", "cluster", "console", "constants", "crypto", "dgram", "diagnostics_channel", "dns", "dns/promises", "domain", "events", "fs", "fs/promises", "http", "https", "http2", "inspector", "module", "net", "os", "path", "perf_hooks", "process", "punycode", "querystring", "readline", "repl", "stream", "stream/promises", "string_decoder", "timers", "timers/promises", "tls", "trace_events", "tty", "url", "util", "util/types", "v8", "vm", "wasi", "worker_threads", "zlib"], cX = sX.map(e => `node:${e}`), lX = [...sX, ...cX], uX = new Set(lX), dX = (e => (e[e.Ok = 0] = "Ok", e[e.EmptyName = 1] = "EmptyName", e[e.NameTooLong = 2] = "NameTooLong", e[e.NameStartsWithDot = 3] = "NameStartsWithDot", e[e.NameStartsWithUnderscore = 4] = "NameStartsWithUnderscore", e[e.NameContainsNonURISafeCharacters = 5] = "NameContainsNonURISafeCharacters", e))(dX || {}), fX = 214 } }), QT = {}; Mo(QT, { NameValidationResult: () => dX, discoverTypings: () => c6e, isTypingUpToDate: () => the, loadSafeList: () => o6e, loadTypesMap: () => s6e, nodeCoreModuleList: () => lX, nodeCoreModules: () => uX, nonRelativeModuleNameForTypingCache: () => nhe, prefixedNodeCoreModuleList: () => cX, renderPackageNameValidationFailure: () => u6e, validatePackageName: () => l6e }); var f6e = gt({ "src/jsTyping/_namespaces/ts.JsTyping.ts"() { "use strict"; d6e() } }); function _6e(e) { return xl.args.indexOf(e) >= 0 } function p6e(e) { let t = xl.args.indexOf(e); return t >= 0 && t < xl.args.length - 1 ? xl.args[t + 1] : void 0 } function m6e() { let e = new Date; return `${J1(e.getHours().toString(), 2, "0")}:${J1(e.getMinutes().toString(), 2, "0")}:${J1(e.getSeconds().toString(), 2, "0")}.${J1(e.getMilliseconds().toString(), 3, "0")}` } var ihe, ahe, ohe, she, che, lhe, uhe, _X, h6e = gt({ "src/jsTyping/shared.ts"() { "use strict"; r7(), ihe = "action::set", ahe = "action::invalidate", ohe = "action::packageInstalled", she = "event::typesRegistry", che = "event::beginInstallTypes", lhe = "event::endInstallTypes", uhe = "event::initializationFailed", (e => { e.GlobalCacheLocation = "--globalTypingsCacheLocation", e.LogFile = "--logFile", e.EnableTelemetry = "--enableTelemetry", e.TypingSafeListLocation = "--typingSafeListLocation", e.TypesMapLocation = "--typesMapLocation", e.NpmLocation = "--npmLocation", e.ValidateDefaultNpmLocation = "--validateDefaultNpmLocation" })(_X || (_X = {})) } }), g6e = gt({ "src/jsTyping/types.ts"() { "use strict" } }), dhe = {}; Mo(dhe, { ActionInvalidate: () => ahe, ActionPackageInstalled: () => ohe, ActionSet: () => ihe, Arguments: () => _X, EventBeginInstallTypes: () => che, EventEndInstallTypes: () => lhe, EventInitializationFailed: () => uhe, EventTypesRegistry: () => she, findArgument: () => p6e, hasArgument: () => _6e, nowString: () => m6e }); var y6e = gt({ "src/jsTyping/_namespaces/ts.server.ts"() { "use strict"; h6e(), g6e() } }), r7 = gt({ "src/jsTyping/_namespaces/ts.ts"() { "use strict"; fa(), f6e(), y6e() } }); function fhe(e) {
+                return {
+                    indentSize: 4, tabSize: 4, newLineCharacter: e || `
+`, convertTabsToSpaces: !0, indentStyle: 2, insertSpaceAfterConstructor: !1, insertSpaceAfterCommaDelimiter: !0, insertSpaceAfterSemicolonInForStatements: !0, insertSpaceBeforeAndAfterBinaryOperators: !0, insertSpaceAfterKeywordsInControlFlowStatements: !0, insertSpaceAfterFunctionKeywordForAnonymousFunctions: !1, insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: !1, insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: !1, insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: !0, insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: !1, insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces: !1, insertSpaceBeforeFunctionParenthesis: !1, placeOpenBraceOnNewLineForFunctions: !1, placeOpenBraceOnNewLineForControlBlocks: !1, semicolons: "ignore", trimTrailingWhitespace: !0
+                }
+            } var pX, mX, hX, gX, Cp, yX, vX, bX, EX, TX, SX, xX, _he, IN, AX, CX, IX, LX, kX, DX, wX, RX, OX, v6e = gt({
+                "src/services/types.ts"() {
+                    "use strict"; (e => { class t { constructor(o) { this.text = o } getText(o, s) { return o === 0 && s === this.text.length ? this.text : this.text.substring(o, s) } getLength() { return this.text.length } getChangeRange() { } } function r(i) { return new t(i) } e.fromString = r })(pX || (pX = {})), mX = (e => (e[e.Dependencies = 1] = "Dependencies", e[e.DevDependencies = 2] = "DevDependencies", e[e.PeerDependencies = 4] = "PeerDependencies", e[e.OptionalDependencies = 8] = "OptionalDependencies", e[e.All = 15] = "All", e))(mX || {}), hX = (e => (e[e.Off = 0] = "Off", e[e.On = 1] = "On", e[e.Auto = 2] = "Auto", e))(hX || {}), gX = (e => (e[e.Semantic = 0] = "Semantic", e[e.PartialSemantic = 1] = "PartialSemantic", e[e.Syntactic = 2] = "Syntactic", e))(gX || {}), Cp = {}, yX = (e => (e.Original = "original", e.TwentyTwenty = "2020", e))(yX || {}), vX = (e => (e.All = "All", e.SortAndCombine = "SortAndCombine", e.RemoveUnused = "RemoveUnused", e))(vX || {}), bX = (e => (e[e.Invoked = 1] = "Invoked", e[e.TriggerCharacter = 2] = "TriggerCharacter", e[e.TriggerForIncompleteCompletions = 3] = "TriggerForIncompleteCompletions", e))(bX || {}), EX = (e => (e.Type = "Type", e.Parameter = "Parameter", e.Enum = "Enum", e))(EX || {}), TX = (e => (e.none = "none", e.definition = "definition", e.reference = "reference", e.writtenReference = "writtenReference", e))(TX || {}), SX = (e => (e[e.None = 0] = "None", e[e.Block = 1] = "Block", e[e.Smart = 2] = "Smart", e))(SX || {}), xX = (e => (e.Ignore = "ignore", e.Insert = "insert", e.Remove = "remove", e))(xX || {}), _he = fhe(`
+`), IN = (e => (e[e.aliasName = 0] = "aliasName", e[e.className = 1] = "className", e[e.enumName = 2] = "enumName", e[e.fieldName = 3] = "fieldName", e[e.interfaceName = 4] = "interfaceName", e[e.keyword = 5] = "keyword", e[e.lineBreak = 6] = "lineBreak", e[e.numericLiteral = 7] = "numericLiteral", e[e.stringLiteral = 8] = "stringLiteral", e[e.localName = 9] = "localName", e[e.methodName = 10] = "methodName", e[e.moduleName = 11] = "moduleName", e[e.operator = 12] = "operator", e[e.parameterName = 13] = "parameterName", e[e.propertyName = 14] = "propertyName", e[e.punctuation = 15] = "punctuation", e[e.space = 16] = "space", e[e.text = 17] = "text", e[e.typeParameterName = 18] = "typeParameterName", e[e.enumMemberName = 19] = "enumMemberName", e[e.functionName = 20] = "functionName", e[e.regularExpressionLiteral = 21] = "regularExpressionLiteral", e[e.link = 22] = "link", e[e.linkName = 23] = "linkName", e[e.linkText = 24] = "linkText", e))(IN || {}), AX = (e => (e[e.None = 0] = "None", e[e.MayIncludeAutoImports = 1] = "MayIncludeAutoImports", e[e.IsImportStatementCompletion = 2] = "IsImportStatementCompletion", e[e.IsContinuation = 4] = "IsContinuation", e[e.ResolvedModuleSpecifiers = 8] = "ResolvedModuleSpecifiers", e[e.ResolvedModuleSpecifiersBeyondLimit = 16] = "ResolvedModuleSpecifiersBeyondLimit", e[e.MayIncludeMethodSnippets = 32] = "MayIncludeMethodSnippets", e))(AX || {}), CX = (e => (e.Comment = "comment", e.Region = "region", e.Code = "code", e.Imports = "imports", e))(CX || {}), IX = (e => (e[e.JavaScript = 0] = "JavaScript", e[e.SourceMap = 1] = "SourceMap", e[e.Declaration = 2] = "Declaration", e))(IX || {}), LX = (e => (e[e.None = 0] = "None", e[e.InMultiLineCommentTrivia = 1] = "InMultiLineCommentTrivia", e[e.InSingleQuoteStringLiteral = 2] = "InSingleQuoteStringLiteral", e[e.InDoubleQuoteStringLiteral = 3] = "InDoubleQuoteStringLiteral", e[e.InTemplateHeadOrNoSubstitutionTemplate = 4] = "InTemplateHeadOrNoSubstitutionTemplate", e[e.InTemplateMiddleOrTail = 5] = "InTemplateMiddleOrTail", e[e.InTemplateSubstitutionPosition = 6] = "InTemplateSubstitutionPosition", e))(LX || {}), kX = (e => (e[e.Punctuation = 0] = "Punctuation", e[e.Keyword = 1] = "Keyword", e[e.Operator = 2] = "Operator", e[e.Comment = 3] = "Comment", e[e.Whitespace = 4] = "Whitespace", e[e.Identifier = 5] = "Identifier", e[e.NumberLiteral = 6] = "NumberLiteral", e[e.BigIntLiteral = 7] = "BigIntLiteral", e[e.StringLiteral = 8] = "StringLiteral", e[e.RegExpLiteral = 9] = "RegExpLiteral", e))(kX || {}), DX = (e => (e.unknown = "", e.warning = "warning", e.keyword = "keyword", e.scriptElement = "script", e.moduleElement = "module", e.classElement = "class", e.localClassElement = "local class", e.interfaceElement = "interface", e.typeElement = "type", e.enumElement = "enum", e.enumMemberElement = "enum member", e.variableElement = "var", e.localVariableElement = "local var", e.functionElement = "function", e.localFunctionElement = "local function", e.memberFunctionElement = "method", e.memberGetAccessorElement = "getter", e.memberSetAccessorElement = "setter", e.memberVariableElement = "property", e.memberAccessorVariableElement = "accessor", e.constructorImplementationElement = "constructor", e.callSignatureElement = "call", e.indexSignatureElement = "index", e.constructSignatureElement = "construct", e.parameterElement = "parameter", e.typeParameterElement = "type parameter", e.primitiveType = "primitive type", e.label = "label", e.alias = "alias", e.constElement = "const", e.letElement = "let", e.directory = "directory", e.externalModuleName = "external module name", e.jsxAttribute = "JSX attribute", e.string = "string", e.link = "link", e.linkName = "link name", e.linkText = "link text", e))(DX || {}), wX = (e => (e.none = "", e.publicMemberModifier = "public", e.privateMemberModifier = "private", e.protectedMemberModifier = "protected", e.exportedModifier = "export", e.ambientModifier = "declare", e.staticModifier = "static", e.abstractModifier = "abstract", e.optionalModifier = "optional", e.deprecatedModifier = "deprecated", e.dtsModifier = ".d.ts", e.tsModifier = ".ts", e.tsxModifier = ".tsx", e.jsModifier = ".js", e.jsxModifier = ".jsx", e.jsonModifier = ".json", e.dmtsModifier = ".d.mts", e.mtsModifier = ".mts", e.mjsModifier = ".mjs", e.dctsModifier = ".d.cts", e.ctsModifier = ".cts", e.cjsModifier = ".cjs", e))(wX || {}), RX = (e => (e.comment = "comment", e.identifier = "identifier", e.keyword = "keyword", e.numericLiteral = "number", e.bigintLiteral = "bigint", e.operator = "operator", e.stringLiteral = "string", e.whiteSpace = "whitespace", e.text = "text", e.punctuation = "punctuation", e.className = "class name", e.enumName = "enum name", e.interfaceName = "interface name", e.moduleName = "module name", e.typeParameterName = "type parameter name", e.typeAliasName = "type alias name", e.parameterName = "parameter name", e.docCommentTagName = "doc comment tag name", e.jsxOpenTagName = "jsx open tag name", e.jsxCloseTagName = "jsx close tag name", e.jsxSelfClosingTagName = "jsx self closing tag name", e.jsxAttribute = "jsx attribute", e.jsxText = "jsx text", e.jsxAttributeStringLiteralValue = "jsx attribute string literal value", e))(RX || {}), OX = (e => (e[e.comment = 1] = "comment", e[e.identifier = 2] = "identifier", e[e.keyword = 3] = "keyword", e[e.numericLiteral = 4] = "numericLiteral", e[e.operator = 5] = "operator", e[e.stringLiteral = 6] = "stringLiteral", e[e.regularExpressionLiteral = 7] = "regularExpressionLiteral", e[e.whiteSpace = 8] = "whiteSpace", e[e.text = 9] = "text", e[e.punctuation = 10] = "punctuation", e[e.className = 11] = "className", e[e.enumName = 12] = "enumName", e[e.interfaceName = 13] = "interfaceName", e[e.moduleName = 14] = "moduleName", e[e.typeParameterName = 15] = "typeParameterName", e[e.typeAliasName = 16] = "typeAliasName", e[e.parameterName = 17] = "parameterName", e[e.docCommentTagName = 18] = "docCommentTagName", e[e.jsxOpenTagName = 19] = "jsxOpenTagName", e[e.jsxCloseTagName = 20] = "jsxCloseTagName", e[e.jsxSelfClosingTagName = 21] = "jsxSelfClosingTagName", e[e.jsxAttribute = 22] = "jsxAttribute", e[e.jsxText = 23] = "jsxText", e[e.jsxAttributeStringLiteralValue = 24] = "jsxAttributeStringLiteralValue", e[e.bigintLiteral = 25] = "bigintLiteral", e))(OX || {})
+                }
+            }); function LN(e) { switch (e.kind) { case 257: return Yn(e) && Ij(e) ? 7 : 1; case 166: case 205: case 169: case 168: case 299: case 300: case 171: case 170: case 173: case 174: case 175: case 259: case 215: case 216: case 295: case 288: return 1; case 165: case 261: case 262: case 184: return 2; case 349: return e.name === void 0 ? 3 : 2; case 302: case 260: return 3; case 264: return lu(e) || Gh(e) === 1 ? 5 : 4; case 263: case 272: case 273: case 268: case 269: case 274: case 275: return 7; case 308: return 5 }return 7 } function ZT(e) { e = zX(e); let t = e.parent; return e.kind === 308 ? 1 : pc(t) || Mu(t) || um(t) || $u(t) || lm(t) || Nl(t) && e === t.name ? 7 : i7(e) ? b6e(e) : Rh(e) ? LN(t) : Cd(e) && jn(e, Kp(IL, iS, gb)) ? 7 : x6e(e) ? 2 : E6e(e) ? 4 : _c(t) ? (L.assert(H_(t.parent)), 2) : mb(t) ? 3 : 1 } function b6e(e) { let t = e.kind === 163 ? e : Yu(e.parent) && e.parent.right === e ? e.parent : void 0; return t && t.parent.kind === 268 ? 7 : 4 } function i7(e) { for (; e.parent.kind === 163;)e = e.parent; return GA(e.parent) && e.parent.moduleReference === e } function E6e(e) { return T6e(e) || S6e(e) } function T6e(e) { let t = e, r = !0; if (t.parent.kind === 163) { for (; t.parent && t.parent.kind === 163;)t = t.parent; r = t.right === e } return t.parent.kind === 180 && !r } function S6e(e) { let t = e, r = !0; if (t.parent.kind === 208) { for (; t.parent && t.parent.kind === 208;)t = t.parent; r = t.name === e } if (!r && t.parent.kind === 230 && t.parent.parent.kind === 294) { let i = t.parent.parent.parent; return i.kind === 260 && t.parent.parent.token === 117 || i.kind === 261 && t.parent.parent.token === 94 } return !1 } function x6e(e) { switch (zI(e) && (e = e.parent), e.kind) { case 108: return !Dh(e); case 194: return !0 }switch (e.parent.kind) { case 180: return !0; case 202: return !e.parent.isTypeOf; case 230: return Gm(e.parent) }return !1 } function NX(e, t = !1, r = !1) { return ek(e, Pa, a7, t, r) } function ZL(e, t = !1, r = !1) { return ek(e, z0, a7, t, r) } function PX(e, t = !1, r = !1) { return ek(e, Ih, a7, t, r) } function phe(e, t = !1, r = !1) { return ek(e, PT, A6e, t, r) } function mhe(e, t = !1, r = !1) { return ek(e, du, a7, t, r) } function hhe(e, t = !1, r = !1) { return ek(e, Au, C6e, t, r) } function a7(e) { return e.expression } function A6e(e) { return e.tag } function C6e(e) { return e.tagName } function ek(e, t, r, i, o) { let s = i ? ghe(e) : o7(e); return o && (s = ql(s)), !!s && !!s.parent && t(s.parent) && r(s.parent) === s } function o7(e) { return j2(e) ? e.parent : e } function ghe(e) { return j2(e) || BX(e) ? e.parent : e } function s7(e, t) { for (; e;) { if (e.kind === 253 && e.label.escapedText === t) return e.label; e = e.parent } } function kN(e, t) { return br(e.expression) ? e.expression.name.text === t : !1 } function DN(e) { var t; return Re(e) && ((t = zr(e.parent, hI)) == null ? void 0 : t.label) === e } function MX(e) { var t; return Re(e) && ((t = zr(e.parent, J0)) == null ? void 0 : t.label) === e } function FX(e) { return MX(e) || DN(e) } function GX(e) { var t; return ((t = zr(e.parent, EI)) == null ? void 0 : t.tagName) === e } function yhe(e) { var t; return ((t = zr(e.parent, Yu)) == null ? void 0 : t.right) === e } function j2(e) { var t; return ((t = zr(e.parent, br)) == null ? void 0 : t.name) === e } function BX(e) { var t; return ((t = zr(e.parent, Vs)) == null ? void 0 : t.argumentExpression) === e } function UX(e) { var t; return ((t = zr(e.parent, Tc)) == null ? void 0 : t.name) === e } function VX(e) { var t; return Re(e) && ((t = zr(e.parent, Ia)) == null ? void 0 : t.name) === e } function c7(e) { switch (e.parent.kind) { case 169: case 168: case 299: case 302: case 171: case 170: case 174: case 175: case 264: return sa(e.parent) === e; case 209: return e.parent.argumentExpression === e; case 164: return !0; case 198: return e.parent.parent.kind === 196; default: return !1 } } function vhe(e) { return ab(e.parent.parent) && wI(e.parent.parent) === e } function e1(e) { for (Ff(e) && (e = e.parent.parent); ;) { if (e = e.parent, !e) return; switch (e.kind) { case 308: case 171: case 170: case 259: case 215: case 174: case 175: case 260: case 261: case 263: case 264: return e } } } function aE(e) { switch (e.kind) { case 308: return Lc(e) ? "module" : "script"; case 264: return "module"; case 260: case 228: return "class"; case 261: return "interface"; case 262: case 341: case 349: return "type"; case 263: return "enum"; case 257: return t(e); case 205: return t(nm(e)); case 216: case 259: case 215: return "function"; case 174: return "getter"; case 175: return "setter"; case 171: case 170: return "method"; case 299: let { initializer: r } = e; return Ia(r) ? "method" : "property"; case 169: case 168: case 300: case 301: return "property"; case 178: return "index"; case 177: return "construct"; case 176: return "call"; case 173: case 172: return "constructor"; case 165: return "type parameter"; case 302: return "enum member"; case 166: return Mr(e, 16476) ? "property" : "parameter"; case 268: case 273: case 278: case 271: case 277: return "alias"; case 223: let i = ic(e), { right: o } = e; switch (i) { case 7: case 8: case 9: case 0: return ""; case 1: case 2: let l = aE(o); return l === "" ? "const" : l; case 3: return ms(o) ? "method" : "property"; case 4: return "property"; case 5: return ms(o) ? "method" : "property"; case 6: return "local class"; default: return "" }case 79: return lm(e.parent) ? "alias" : ""; case 274: let s = aE(e.expression); return s === "" ? "const" : s; default: return "" }function t(r) { return kh(r) ? "const" : II(r) ? "let" : "var" } } function H2(e) { switch (e.kind) { case 108: return !0; case 79: return rW(e) && e.parent.kind === 166; default: return !1 } } function Wf(e, t) { let r = Sh(t), i = t.getLineAndCharacterOfPosition(e).line; return r[i] } function Od(e, t) { return jX(e.pos, e.end, t) } function bhe(e, t) { return RN(e, t.pos) && RN(e, t.end) } function wN(e, t) { return e.pos <= t && t <= e.end } function RN(e, t) { return e.pos < t && t < e.end } function jX(e, t, r) { return e <= r.pos && t >= r.end } function ON(e, t, r) { return e.pos <= t && e.end >= r } function tk(e, t, r) { return l7(e.pos, e.end, t, r) } function HX(e, t, r, i) { return l7(e.getStart(t), e.end, r, i) } function l7(e, t, r, i) { let o = Math.max(e, r), s = Math.min(t, i); return o < s } function WX(e, t, r) { return L.assert(e.pos <= t), t < e.end || !v_(e, r) } function v_(e, t) { if (e === void 0 || rc(e)) return !1; switch (e.kind) { case 260: case 261: case 263: case 207: case 203: case 184: case 238: case 265: case 266: case 272: case 276: return u7(e, 19, t); case 295: return v_(e.block, t); case 211: if (!e.arguments) return !0; case 210: case 214: case 193: return u7(e, 21, t); case 181: case 182: return v_(e.type, t); case 173: case 174: case 175: case 259: case 215: case 171: case 170: case 177: case 176: case 216: return e.body ? v_(e.body, t) : e.type ? v_(e.type, t) : NN(e, 21, t); case 264: return !!e.body && v_(e.body, t); case 242: return e.elseStatement ? v_(e.elseStatement, t) : v_(e.thenStatement, t); case 241: return v_(e.expression, t) || NN(e, 26, t); case 206: case 204: case 209: case 164: case 186: return u7(e, 23, t); case 178: return e.type ? v_(e.type, t) : NN(e, 23, t); case 292: case 293: return !1; case 245: case 246: case 247: case 244: return v_(e.statement, t); case 243: return NN(e, 115, t) ? u7(e, 21, t) : v_(e.statement, t); case 183: return v_(e.exprName, t); case 218: case 217: case 219: case 226: case 227: return v_(e.expression, t); case 212: return v_(e.template, t); case 225: let i = Os(e.templateSpans); return v_(i, t); case 236: return Pf(e.literal); case 275: case 269: return Pf(e.moduleSpecifier); case 221: return v_(e.operand, t); case 223: return v_(e.right, t); case 224: return v_(e.whenFalse, t); default: return !0 } } function u7(e, t, r) { let i = e.getChildren(r); if (i.length) { let o = To(i); if (o.kind === t) return !0; if (o.kind === 26 && i.length !== 1) return i[i.length - 2].kind === t } return !1 } function Ehe(e) { let t = d7(e); if (!t) return; let r = t.getChildren(); return { listItemIndex: DA(r, e), list: t } } function NN(e, t, r) { return !!Yo(e, t, r) } function Yo(e, t, r) { return wr(e.getChildren(r), i => i.kind === t) } function d7(e) { let t = wr(e.parent.getChildren(), r => A2(r) && Od(r, e)); return L.assert(!t || ya(t.getChildren(), e)), t } function The(e) { return e.kind === 88 } function I6e(e) { return e.kind === 84 } function L6e(e) { return e.kind === 98 } function k6e(e) { if (zl(e)) return e.name; if (sl(e)) { let t = e.modifiers && wr(e.modifiers, The); if (t) return t } if (_u(e)) { let t = wr(e.getChildren(), I6e); if (t) return t } } function D6e(e) { if (zl(e)) return e.name; if (Jc(e)) { let t = wr(e.modifiers, The); if (t) return t } if (ms(e)) { let t = wr(e.getChildren(), L6e); if (t) return t } } function w6e(e) { let t; return jn(e, r => (bi(r) && (t = r), !Yu(r.parent) && !bi(r.parent) && !_T(r.parent))), t } function f7(e, t) { if (e.flags & 8388608) return; let r = w7(e, t); if (r) return r; let i = w6e(e); return i && t.getTypeAtLocation(i) } function R6e(e, t) { if (!t) switch (e.kind) { case 260: case 228: return k6e(e); case 259: case 215: return D6e(e); case 173: return e }if (zl(e)) return e.name } function She(e, t) { if (e.importClause) { if (e.importClause.name && e.importClause.namedBindings) return; if (e.importClause.name) return e.importClause.name; if (e.importClause.namedBindings) { if (jg(e.importClause.namedBindings)) { let r = Wp(e.importClause.namedBindings.elements); return r ? r.name : void 0 } else if (nv(e.importClause.namedBindings)) return e.importClause.namedBindings.name } } if (!t) return e.moduleSpecifier } function xhe(e, t) { if (e.exportClause) { if (h_(e.exportClause)) return Wp(e.exportClause.elements) ? e.exportClause.elements[0].name : void 0; if (qm(e.exportClause)) return e.exportClause.name } if (!t) return e.moduleSpecifier } function O6e(e) { if (e.types.length === 1) return e.types[0].expression } function Ahe(e, t) { let { parent: r } = e; if (Ha(e) && (t || e.kind !== 88) ? g_(r) && ya(r.modifiers, e) : e.kind === 84 ? sl(r) || _u(e) : e.kind === 98 ? Jc(r) || ms(e) : e.kind === 118 ? ku(r) : e.kind === 92 ? hb(r) : e.kind === 154 ? Ep(r) : e.kind === 143 || e.kind === 142 ? Tc(r) : e.kind === 100 ? Nl(r) : e.kind === 137 ? p_(r) : e.kind === 151 && Sf(r)) { let i = R6e(r, t); if (i) return i } if ((e.kind === 113 || e.kind === 85 || e.kind === 119) && pu(r) && r.declarations.length === 1) { let i = r.declarations[0]; if (Re(i.name)) return i.name } if (e.kind === 154) { if (lm(r) && r.isTypeOnly) { let i = She(r.parent, t); if (i) return i } if (Il(r) && r.isTypeOnly) { let i = xhe(r, t); if (i) return i } } if (e.kind === 128) { if ($u(r) && r.propertyName || Mu(r) && r.propertyName || nv(r) || qm(r)) return r.name; if (Il(r) && r.exportClause && qm(r.exportClause)) return r.exportClause.name } if (e.kind === 100 && gl(r)) { let i = She(r, t); if (i) return i } if (e.kind === 93) { if (Il(r)) { let i = xhe(r, t); if (i) return i } if (pc(r)) return ql(r.expression) } if (e.kind === 147 && um(r)) return r.expression; if (e.kind === 158 && (gl(r) || Il(r)) && r.moduleSpecifier) return r.moduleSpecifier; if ((e.kind === 94 || e.kind === 117) && dd(r) && r.token === e.kind) { let i = O6e(r); if (i) return i } if (e.kind === 94) { if (_c(r) && r.constraint && m_(r.constraint)) return r.constraint.typeName; if (m2(r) && m_(r.extendsType)) return r.extendsType.typeName } if (e.kind === 138 && h2(r)) return r.typeParameter.name; if (e.kind === 101 && _c(r) && EL(r.parent)) return r.name; if (e.kind === 141 && RS(r) && r.operator === 141 && m_(r.type)) return r.type.typeName; if (e.kind === 146 && RS(r) && r.operator === 146 && wz(r.type) && m_(r.type.elementType)) return r.type.elementType.typeName; if (!t) { if ((e.kind === 103 && z0(r) || e.kind === 114 && NS(r) || e.kind === 112 && y2(r) || e.kind === 133 && v2(r) || e.kind === 125 && f3(r) || e.kind === 89 && Gue(r)) && r.expression) return ql(r.expression); if ((e.kind === 101 || e.kind === 102) && ar(r) && r.operatorToken === e) return ql(r.right); if (e.kind === 128 && fO(r) && m_(r.type)) return r.type.typeName; if (e.kind === 101 && Mz(r) || e.kind === 162 && _O(r)) return ql(r.expression) } return e } function zX(e) { return Ahe(e, !1) } function _7(e) { return Ahe(e, !0) } function ef(e, t) { return nk(e, t, r => c_(r) || Xu(r.kind) || pi(r)) } function nk(e, t, r) { return Che(e, t, !1, r, !1) } function Vi(e, t) { return Che(e, t, !0, void 0, !1) } function Che(e, t, r, i, o) { let s = e, l; e: for (; ;) { let d = s.getChildren(e), g = j1(d, t, (m, v) => v, (m, v) => { let S = d[m].getEnd(); if (S < t) return -1; let x = r ? d[m].getFullStart() : d[m].getStart(e, !0); return x > t ? 1 : f(d[m], x, S) ? d[m - 1] && f(d[m - 1]) ? 1 : 0 : i && x === t && d[m - 1] && d[m - 1].getEnd() === t && f(d[m - 1]) ? 1 : -1 }); if (l) return l; if (g >= 0 && d[g]) { s = d[g]; continue e } return s } function f(d, g, m) { if (m ?? (m = d.getEnd()), m < t || (g ?? (g = r ? d.getFullStart() : d.getStart(e, !0)), g > t)) return !1; if (t < m || t === m && (d.kind === 1 || o)) return !0; if (i && m === t) { let v = el(t, e, d); if (v && i(v)) return l = v, !0 } return !1 } } function Ihe(e, t) { let r = Vi(e, t); for (; PN(r);) { let i = t1(r, r.parent, e); if (!i) return; r = i } return r } function p7(e, t) { let r = Vi(e, t); return Z1(r) && t > r.getStart(e) && t < r.getEnd() ? r : el(t, e) } function t1(e, t, r) { return i(t); function i(o) { return Z1(o) && o.pos === e.end ? o : ks(o.getChildren(r), s => (s.pos <= e.pos && s.end > e.end || s.pos === e.end) && $X(s, r) ? i(s) : void 0) } } function el(e, t, r, i) { let o = s(r || t); return L.assert(!(o && PN(o))), o; function s(l) { if (Lhe(l) && l.kind !== 1) return l; let f = l.getChildren(t), d = j1(f, e, (m, v) => v, (m, v) => e < f[m].end ? !f[m - 1] || e >= f[m - 1].end ? 0 : 1 : -1); if (d >= 0 && f[d]) { let m = f[d]; if (e < m.end) if (m.getStart(t, !i) >= e || !$X(m, t) || PN(m)) { let x = KX(f, d, t, l.kind); return x && JX(x, t) } else return s(m) } L.assert(r !== void 0 || l.kind === 308 || l.kind === 1 || qj(l)); let g = KX(f, f.length, t, l.kind); return g && JX(g, t) } } function Lhe(e) { return Z1(e) && !PN(e) } function JX(e, t) { if (Lhe(e)) return e; let r = e.getChildren(t); if (r.length === 0) return e; let i = KX(r, r.length, t, e.kind); return i && JX(i, t) } function KX(e, t, r, i) { for (let o = t - 1; o >= 0; o--) { let s = e[o]; if (PN(s)) o === 0 && (i === 11 || i === 282) && L.fail("`JsxText` tokens should not be the first child of `JsxElement | JsxSelfClosingElement`"); else if ($X(e[o], r)) return e[o] } } function n1(e, t, r = el(t, e)) { if (r && Fj(r)) { let i = r.getStart(e), o = r.getEnd(); if (i < t && t < o) return !0; if (t === o) return !!r.isUnterminated } return !1 } function khe(e, t) { let r = Vi(e, t); return r ? !!(r.kind === 11 || r.kind === 29 && r.parent.kind === 11 || r.kind === 29 && r.parent.kind === 291 || r && r.kind === 19 && r.parent.kind === 291 || r.kind === 29 && r.parent.kind === 284) : !1 } function PN(e) { return CS(e) && e.containsOnlyTriviaWhiteSpaces } function qX(e, t) { let r = Vi(e, t); return Hy(r.kind) && t > r.getStart(e) } function Dhe(e, t) { let r = Vi(e, t); return !!(CS(r) || r.kind === 18 && AL(r.parent) && Hg(r.parent.parent) || r.kind === 29 && Au(r.parent) && Hg(r.parent.parent)) } function m7(e, t) { function r(i) { for (; i;)if (i.kind >= 282 && i.kind <= 291 || i.kind === 11 || i.kind === 29 || i.kind === 31 || i.kind === 79 || i.kind === 19 || i.kind === 18 || i.kind === 43) i = i.parent; else if (i.kind === 281) { if (t > i.getStart(e)) return !0; i = i.parent } else return !1; return !1 } return r(Vi(e, t)) } function h7(e, t, r) { let i = Xa(e.kind), o = Xa(t), s = e.getFullStart(), l = r.text.lastIndexOf(o, s); if (l === -1) return; if (r.text.lastIndexOf(i, s - 1) < l) { let g = el(l + 1, r); if (g && g.kind === t) return g } let f = e.kind, d = 0; for (; ;) { let g = el(e.getFullStart(), r); if (!g) return; if (e = g, e.kind === t) { if (d === 0) return e; d-- } else e.kind === f && d++ } } function whe(e, t, r) { return t ? e.getNonNullableType() : r ? e.getNonOptionalType() : e } function MN(e, t, r) { let i = YX(e, t); return i !== void 0 && (Gm(i.called) || XX(i.called, i.nTypeArguments, r).length !== 0 || MN(i.called, t, r)) } function XX(e, t, r) { let i = r.getTypeAtLocation(e); return Jl(e.parent) && (i = whe(i, pI(e.parent), !0)), (z0(e.parent) ? i.getConstructSignatures() : i.getCallSignatures()).filter(s => !!s.typeParameters && s.typeParameters.length >= t) } function YX(e, t) { if (t.text.lastIndexOf("<", e ? e.pos : t.text.length) === -1) return; let r = e, i = 0, o = 0; for (; r;) { switch (r.kind) { case 29: if (r = el(r.getFullStart(), t), r && r.kind === 28 && (r = el(r.getFullStart(), t)), !r || !Re(r)) return; if (!i) return Rh(r) ? void 0 : { called: r, nTypeArguments: o }; i--; break; case 49: i = 3; break; case 48: i = 2; break; case 31: i++; break; case 19: if (r = h7(r, 18, t), !r) return; break; case 21: if (r = h7(r, 20, t), !r) return; break; case 23: if (r = h7(r, 22, t), !r) return; break; case 27: o++; break; case 38: case 79: case 10: case 8: case 9: case 110: case 95: case 112: case 94: case 141: case 24: case 51: case 57: case 58: break; default: if (bi(r)) break; return }r = el(r.getFullStart(), t) } } function Kg(e, t, r) { return tl.getRangeOfEnclosingComment(e, t, void 0, r) } function Rhe(e, t) { let r = Vi(e, t); return !!jn(r, dm) } function $X(e, t) { return e.kind === 1 ? !!e.jsDoc : e.getWidth(t) !== 0 } function rk(e, t = 0) { let r = [], i = Kl(e) ? Tj(e) & ~t : 0; return i & 8 && r.push("private"), i & 16 && r.push("protected"), i & 4 && r.push("public"), (i & 32 || oc(e)) && r.push("static"), i & 256 && r.push("abstract"), i & 1 && r.push("export"), i & 8192 && r.push("deprecated"), e.flags & 16777216 && r.push("declare"), e.kind === 274 && r.push("export"), r.length > 0 ? r.join(",") : "" } function Ohe(e) { if (e.kind === 180 || e.kind === 210) return e.typeArguments; if (Ia(e) || e.kind === 260 || e.kind === 261) return e.typeParameters } function g7(e) { return e === 2 || e === 3 } function QX(e) { return !!(e === 10 || e === 13 || Hy(e)) } function Nhe(e) { if (!e.isIntersection()) return !1; let { types: t, checker: r } = e; return t.length === 2 && t[0].flags & 4 && r.isEmptyAnonymousObjectType(t[1]) } function Phe(e) { return 18 <= e && e <= 78 } function FN(e, t, r) { return Hy(e.kind) && e.getStart(r) < t && t < e.end || !!e.isUnterminated && t === e.end } function ZX(e) { switch (e) { case 123: case 121: case 122: return !0 }return !1 } function Mhe(e) { let t = VU(e); return xJ(t, e && e.configFile), t } function qg(e) { return !!((e.kind === 206 || e.kind === 207) && (e.parent.kind === 223 && e.parent.left === e && e.parent.operatorToken.kind === 63 || e.parent.kind === 247 && e.parent.initializer === e || qg(e.parent.kind === 299 ? e.parent.parent : e.parent))) } function Fhe(e, t) { return Bhe(e, t, !0) } function Ghe(e, t) { return Bhe(e, t, !1) } function Bhe(e, t, r) { let i = Kg(e, t, void 0); return !!i && r === bge.test(e.text.substring(i.pos, i.end)) } function eY(e) { if (e) switch (e.kind) { case 10: case 14: return tY(e); default: return Du(e) } } function Du(e, t, r) { return Wc(e.getStart(t), (r || e).getEnd()) } function tY(e) { if (!e.isUnterminated) return Wc(e.getStart() + 1, e.getEnd() - 1) } function nY(e, t) { return Gf(e.getStart(t), e.end) } function lv(e) { return Wc(e.pos, e.end) } function y7(e) { return Gf(e.start, e.start + e.length) } function v7(e, t, r) { return GN(il(e, t), r) } function GN(e, t) { return { span: e, newText: t } } function ik(e) { return ya(K7, e) } function rY(e) { return e.kind === 154 } function b7(e) { return rY(e) || Re(e) && e.text === "type" } function BN(e) { return !!(e.flags & 1536) && e.name.charCodeAt(0) === 34 } function W2() { let e = []; return t => { let r = zo(t); return !e[r] && (e[r] = !0) } } function E7(e) { return e.getText(0, e.getLength()) } function UN(e, t) { let r = ""; for (let i = 0; i < t; i++)r += e; return r } function iY(e) { return e.isTypeParameter() && e.getConstraint() || e } function VN(e) { return e.kind === 164 ? yf(e.expression) ? e.expression.text : void 0 : pi(e) ? vr(e) : l_(e) } function Uhe(e) { return e.getSourceFiles().some(t => !t.isDeclarationFile && !e.isSourceFileFromExternalLibrary(t) && !!(t.externalModuleIndicator || t.commonJsModuleIndicator)) } function Vhe(e) { return e.getSourceFiles().some(t => !t.isDeclarationFile && !e.isSourceFileFromExternalLibrary(t) && !!t.externalModuleIndicator) } function aY(e) { return !!e.module || Do(e) >= 2 || !!e.noEmit } function $S(e, t) { return { fileExists: r => e.fileExists(r), getCurrentDirectory: () => t.getCurrentDirectory(), readFile: ho(t, t.readFile), useCaseSensitiveFileNames: ho(t, t.useCaseSensitiveFileNames), getSymlinkCache: ho(t, t.getSymlinkCache) || e.getSymlinkCache, getModuleSpecifierCache: ho(t, t.getModuleSpecifierCache), getPackageJsonInfoCache: () => { var r; return (r = e.getModuleResolutionCache()) == null ? void 0 : r.getPackageJsonInfoCache() }, getGlobalTypingsCacheLocation: ho(t, t.getGlobalTypingsCacheLocation), redirectTargetsMap: e.redirectTargetsMap, getProjectReferenceRedirect: r => e.getProjectReferenceRedirect(r), isSourceOfProjectReferenceRedirect: r => e.isSourceOfProjectReferenceRedirect(r), getNearestAncestorDirectoryWithPackageJson: ho(t, t.getNearestAncestorDirectoryWithPackageJson), getFileIncludeReasons: () => e.getFileIncludeReasons() } } function oY(e, t) { return { ...$S(e, t), getCommonSourceDirectory: () => e.getCommonSourceDirectory() } } function T7(e) { return e === 2 || e >= 3 && e <= 99 || e === 100 } function jhe(e, t, r, i) { return e || t && t.length ? Xg(e, t, r, i) : void 0 } function Xg(e, t, r, i, o) { return D.createImportDeclaration(void 0, e || t ? D.createImportClause(!!o, e, t && t.length ? D.createNamedImports(t) : void 0) : void 0, typeof r == "string" ? S7(r, i) : r, void 0) } function S7(e, t) { return D.createStringLiteral(e, t === 0) } function sY(e, t) { return V6(e, t) ? 1 : 0 } function J_(e, t) { if (t.quotePreference && t.quotePreference !== "auto") return t.quotePreference === "single" ? 0 : 1; { let r = e.imports && wr(e.imports, i => yo(i) && !ws(i.parent)); return r ? sY(r, e) : 1 } } function Hhe(e) { switch (e) { case 0: return "'"; case 1: return '"'; default: return L.assertNever(e) } } function x7(e) { let t = A7(e); return t === void 0 ? void 0 : Gi(t) } function A7(e) { return e.escapedName !== "default" ? e.escapedName : ks(e.declarations, t => { let r = sa(t); return r && r.kind === 79 ? r.escapedText : void 0 }) } function C7(e) { return es(e) && (um(e.parent) || gl(e.parent) || qu(e.parent, !1) && e.parent.arguments[0] === e || Dd(e.parent) && e.parent.arguments[0] === e) } function jN(e) { return Wo(e) && cm(e.parent) && Re(e.name) && !e.propertyName } function I7(e, t) { let r = e.getTypeAtLocation(t.parent); return r && e.getPropertyOfType(r, t.name.text) } function HN(e, t, r) { if (e) for (; e.parent;) { if (Li(e.parent) || !N6e(r, e.parent, t)) return e; e = e.parent } } function N6e(e, t, r) { return bj(e, t.getStart(r)) && t.getEnd() <= wl(e) } function z2(e, t) { return g_(e) ? wr(e.modifiers, r => r.kind === t) : void 0 } function L7(e, t, r, i, o) { let l = (ba(r) ? r[0] : r).kind === 240 ? DH : yT, f = Pr(t.statements, l), d = ba(r) ? b_.detectImportDeclarationSorting(r, o) : 3, g = b_.getOrganizeImportsComparer(o, d === 2), m = ba(r) ? Ag(r, (v, S) => b_.compareImportsOrRequireStatements(v, S, g)) : [r]; if (!f.length) e.insertNodesAtTopOfFile(t, m, i); else if (f && (d = b_.detectImportDeclarationSorting(f, o))) { let v = b_.getOrganizeImportsComparer(o, d === 2); for (let S of m) { let x = b_.getImportDeclarationInsertionIndex(f, S, v); if (x === 0) { let A = f[0] === t.statements[0] ? { leadingTriviaOption: nr.LeadingTriviaOption.Exclude } : {}; e.insertNodeBefore(t, f[0], S, !1, A) } else { let A = f[x - 1]; e.insertNodeAfter(t, A, S) } } } else { let v = Os(f); v ? e.insertNodesAfter(t, v, m) : e.insertNodesAtTopOfFile(t, m, i) } } function cY(e, t) { return L.assert(e.isTypeOnly), Ga(e.getChildAt(0, t), rY) } function J2(e, t) { return !!e && !!t && e.start === t.start && e.length === t.length } function P6e(e, t) { return e.fileName === t.fileName && J2(e.textSpan, t.textSpan) } function lY(e, t) { if (e) { for (let r = 0; r < e.length; r++)if (e.indexOf(e[r]) === r) { let i = t(e[r], r); if (i) return i } } } function Whe(e, t, r) { for (let i = t; i < r; i++)if (!xh(e.charCodeAt(i))) return !1; return !0 } function WN(e, t, r) { let i = t.tryGetSourcePosition(e); return i && (!r || r(So(i.fileName)) ? i : void 0) } function uY(e, t, r) { let { fileName: i, textSpan: o } = e, s = WN({ fileName: i, pos: o.start }, t, r); if (!s) return; let l = WN({ fileName: i, pos: o.start + o.length }, t, r), f = l ? l.pos - s.pos : o.length; return { fileName: s.fileName, textSpan: { start: s.pos, length: f }, originalFileName: e.fileName, originalTextSpan: e.textSpan, contextSpan: zhe(e, t, r), originalContextSpan: e.contextSpan } } function zhe(e, t, r) { let i = e.contextSpan && WN({ fileName: e.fileName, pos: e.contextSpan.start }, t, r), o = e.contextSpan && WN({ fileName: e.fileName, pos: e.contextSpan.start + e.contextSpan.length }, t, r); return i && o ? { start: i.pos, length: o.pos - i.pos } : void 0 } function dY(e) { let t = e.declarations ? Sl(e.declarations) : void 0; return !!jn(t, r => ha(r) ? !0 : Wo(r) || cm(r) || g2(r) ? !1 : "quit") } function M6e() { let e = KR * 10, t, r, i, o; m(); let s = v => f(v, 17); return { displayParts: () => { let v = t.length && t[t.length - 1].text; return o > e && v && v !== "..." && (xh(v.charCodeAt(v.length - 1)) || t.push(Qu(" ", 16)), t.push(Qu("...", 15))), t }, writeKeyword: v => f(v, 5), writeOperator: v => f(v, 12), writePunctuation: v => f(v, 15), writeTrailingSemicolon: v => f(v, 15), writeSpace: v => f(v, 16), writeStringLiteral: v => f(v, 8), writeParameter: v => f(v, 13), writeProperty: v => f(v, 14), writeLiteral: v => f(v, 8), writeSymbol: d, writeLine: g, write: s, writeComment: s, getText: () => "", getTextPos: () => 0, getColumn: () => 0, getLine: () => 0, isAtStartOfLine: () => !1, hasTrailingWhitespace: () => !1, hasTrailingComment: () => !1, rawWrite: Sa, getIndent: () => i, increaseIndent: () => { i++ }, decreaseIndent: () => { i-- }, clear: m }; function l() { if (!(o > e) && r) { let v = Q6(i); v && (o += v.length, t.push(Qu(v, 16))), r = !1 } } function f(v, S) { o > e || (l(), o += v.length, t.push(Qu(v, S))) } function d(v, S) { o > e || (l(), o += v.length, t.push(Jhe(v, S))) } function g() { o > e || (o += 1, t.push(K2()), r = !0) } function m() { t = [], r = !0, i = 0, o = 0 } } function Jhe(e, t) { return Qu(e, r(t)); function r(i) { let o = i.flags; return o & 3 ? dY(i) ? 13 : 9 : o & 4 || o & 32768 || o & 65536 ? 14 : o & 8 ? 19 : o & 16 ? 20 : o & 32 ? 1 : o & 64 ? 4 : o & 384 ? 2 : o & 1536 ? 11 : o & 8192 ? 10 : o & 262144 ? 18 : o & 524288 || o & 2097152 ? 0 : 17 } } function Qu(e, t) { return { text: e, kind: IN[t] } } function Qs() { return Qu(" ", 16) } function _d(e) { return Qu(Xa(e), 5) } function Yl(e) { return Qu(Xa(e), 15) } function ak(e) { return Qu(Xa(e), 12) } function Khe(e) { return Qu(e, 13) } function qhe(e) { return Qu(e, 14) } function fY(e) { let t = lT(e); return t === void 0 ? tf(e) : _d(t) } function tf(e) { return Qu(e, 17) } function Xhe(e) { return Qu(e, 0) } function Yhe(e) { return Qu(e, 18) } function k7(e) { return Qu(e, 24) } function $he(e, t) { return { text: e, kind: IN[23], target: { fileName: Gn(t).fileName, textSpan: Du(t) } } } function _Y(e) { return Qu(e, 22) } function Qhe(e, t) { var r; let i = zue(e) ? "link" : Jue(e) ? "linkcode" : "linkplain", o = [_Y(`{@${i} `)]; if (!e.name) e.text && o.push(k7(e.text)); else { let s = t?.getSymbolAtLocation(e.name), l = G6e(e.text), f = Qc(e.name) + e.text.slice(0, l), d = F6e(e.text.slice(l)), g = s?.valueDeclaration || ((r = s?.declarations) == null ? void 0 : r[0]); g ? (o.push($he(f, g)), d && o.push(k7(d))) : o.push(k7(f + (l ? "" : " ") + d)) } return o.push(_Y("}")), o } function F6e(e) { let t = 0; if (e.charCodeAt(t++) === 124) { for (; t < e.length && e.charCodeAt(t) === 32;)t++; return e.slice(t) } return e } function G6e(e) { let t = e.indexOf("://"); if (t === 0) { for (; t < e.length && e.charCodeAt(t) !== 124;)t++; return t } if (e.indexOf("()") === 0) return 2; if (e.charAt(0) === "<") { let r = 0, i = 0; for (; i < e.length;)if (e[i] === "<" && r++, e[i] === ">" && r--, i++, !r) return i } return 0 } function bb(e, t) { var r; return t?.newLineCharacter || ((r = e.getNewLine) == null ? void 0 : r.call(e)) || Ege } function K2() {
+                return Qu(`
+`, 6)
+            } function uv(e) { try { return e(q7), q7.displayParts() } finally { q7.clear() } } function zN(e, t, r, i = 0) { return uv(o => { e.writeType(t, r, i | 1024 | 16384, o) }) } function ok(e, t, r, i, o = 0) { return uv(s => { e.writeSymbol(t, r, i, o | 8, s) }) } function pY(e, t, r, i = 0) { return i |= 25632, uv(o => { e.writeSignature(t, r, i, void 0, o) }) } function B6e(e, t) { let r = t.getSourceFile(); return uv(i => { fN().writeNode(4, e, r, i) }) } function Zhe(e) { return !!e.parent && eS(e.parent) && e.parent.propertyName === e } function mY(e, t) { return h4(e, t.getScriptKind && t.getScriptKind(e)) } function ege(e, t) { let r = e; for (; U6e(r) || Zp(r) && r.links.target;)Zp(r) && r.links.target ? r = r.links.target : r = wd(r, t); return r } function U6e(e) { return (e.flags & 2097152) !== 0 } function tge(e, t) { return $a(wd(e, t)) } function nge(e, t) { for (; xh(e.charCodeAt(t));)t += 1; return t } function hY(e, t) { for (; t > -1 && Yp(e.charCodeAt(t));)t -= 1; return t + 1 } function cc(e, t = !0) { let r = e && rge(e); return r && !t && pd(r), r } function JN(e, t, r) { let i = r(e); return i ? Ir(i, e) : i = rge(e, r), i && !t && pd(i), i } function rge(e, t) { let r = t ? s => JN(s, !0, t) : cc, o = xn(e, r, Bh, t ? s => s && gY(s, !0, t) : s => s && oE(s), r); if (o === e) { let s = yo(e) ? Ir(D.createStringLiteralFromNode(e), e) : Vf(e) ? Ir(D.createNumericLiteral(e.text, e.numericLiteralFlags), e) : D.cloneNode(e); return it(s, e) } return o.parent = void 0, o } function oE(e, t = !0) { return e && D.createNodeArray(e.map(r => cc(r, t)), e.hasTrailingComma) } function gY(e, t, r) { return D.createNodeArray(e.map(i => JN(i, t, r)), e.hasTrailingComma) } function pd(e) { D7(e), ige(e) } function D7(e) { yY(e, 1024, j6e) } function ige(e) { yY(e, 2048, yW) } function r1(e, t) { let r = e.getSourceFile(), i = r.text; V6e(e, i) ? q2(e, t, r) : qN(e, t, r), sk(e, t, r) } function V6e(e, t) { let r = e.getFullStart(), i = e.getStart(); for (let o = r; o < i; o++)if (t.charCodeAt(o) === 10) return !0; return !1 } function yY(e, t, r) { bp(e, t); let i = r(e); i && yY(i, t, r) } function j6e(e) { return e.forEachChild(t => t) } function i1(e, t) { let r = e; for (let i = 1; !g6(t, r); i++)r = `${e}_${i}`; return r } function KN(e, t, r, i) { let o = 0, s = -1; for (let { fileName: l, textChanges: f } of e) { L.assert(l === t); for (let d of f) { let { span: g, newText: m } = d, v = H6e(m, _S(r)); if (v !== -1 && (s = g.start + o + v, !i)) return s; o += m.length - g.length } } return L.assert(i), L.assert(s >= 0), s } function q2(e, t, r, i, o) { vw(r.text, e.pos, vY(t, r, i, o, nO)) } function sk(e, t, r, i, o) { bw(r.text, e.end, vY(t, r, i, o, R4)) } function qN(e, t, r, i, o) { bw(r.text, e.pos, vY(t, r, i, o, nO)) } function vY(e, t, r, i, o) { return (s, l, f, d) => { f === 3 ? (s += 2, l -= 2) : s += 2, o(e, r || f, t.text.slice(s, l), i !== void 0 ? i : d) } } function H6e(e, t) { if (na(e, t)) return 0; let r = e.indexOf(" " + t); return r === -1 && (r = e.indexOf("." + t)), r === -1 && (r = e.indexOf('"' + t)), r === -1 ? -1 : r + 1 } function bY(e) { return ar(e) && e.operatorToken.kind === 27 || rs(e) || fO(e) && rs(e.expression) } function w7(e, t, r) { let i = qy(e.parent); switch (i.kind) { case 211: return t.getContextualType(i, r); case 223: { let { left: o, operatorToken: s, right: l } = i; return R7(s.kind) ? t.getTypeAtLocation(e === l ? o : l) : t.getContextualType(e, r) } case 292: return TY(i, t); default: return t.getContextualType(e, r) } } function ck(e, t, r) { let i = J_(e, t), o = JSON.stringify(r); return i === 0 ? `'${u_(o).replace(/'/g, "\\'").replace(/\\"/g, '"')}'` : o } function R7(e) { switch (e) { case 36: case 34: case 37: case 35: return !0; default: return !1 } } function age(e) { switch (e.kind) { case 10: case 14: case 225: case 212: return !0; default: return !1 } } function EY(e) { return !!e.getStringIndexType() || !!e.getNumberIndexType() } function TY(e, t) { return t.getTypeAtLocation(e.parent.parent.expression) } function lk(e, t, r, i) { let o = r.getTypeChecker(), s = !0, l = () => s = !1, f = o.typeToTypeNode(e, t, 1, { trackSymbol: (d, g, m) => (s = s && o.isSymbolAccessible(d, g, m, !1).accessibility === 0, !s), reportInaccessibleThisError: l, reportPrivateInBaseOfClassExpression: l, reportInaccessibleUniqueSymbolError: l, moduleResolverHost: oY(r, i) }); return s ? f : void 0 } function SY(e) { return e === 176 || e === 177 || e === 178 || e === 168 || e === 170 } function oge(e) { return e === 259 || e === 173 || e === 171 || e === 174 || e === 175 } function sge(e) { return e === 264 } function O7(e) { return e === 240 || e === 241 || e === 243 || e === 248 || e === 249 || e === 250 || e === 254 || e === 256 || e === 169 || e === 262 || e === 269 || e === 268 || e === 275 || e === 267 || e === 274 } function W6e(e, t) { let r = e.getLastToken(t); if (r && r.kind === 26) return !1; if (SY(e.kind)) { if (r && r.kind === 27) return !1 } else if (sge(e.kind)) { let f = To(e.getChildren(t)); if (f && Tp(f)) return !1 } else if (oge(e.kind)) { let f = To(e.getChildren(t)); if (f && bT(f)) return !1 } else if (!O7(e.kind)) return !1; if (e.kind === 243) return !0; let i = jn(e, f => !f.parent), o = t1(e, i, t); if (!o || o.kind === 19) return !0; let s = t.getLineAndCharacterOfPosition(e.getEnd()).line, l = t.getLineAndCharacterOfPosition(o.getStart(t)).line; return s !== l } function N7(e, t, r) { let i = jn(t, o => o.end !== e ? "quit" : NY(o.kind)); return !!i && W6e(i, r) } function P7(e) { let t = 0, r = 0, i = 5; return pa(e, function o(s) { if (O7(s.kind)) { let l = s.getLastToken(e); l?.kind === 26 ? t++ : r++ } else if (SY(s.kind)) { let l = s.getLastToken(e); if (l?.kind === 26) t++; else if (l && l.kind !== 27) { let f = Gs(e, l.getStart(e)).line, d = Gs(e, Pg(e, l.end).start).line; f !== d && r++ } } return t + r >= i ? !0 : pa(s, o) }), t === 0 && r <= 1 ? !0 : t / r > 1 / i } function M7(e, t) { return U7(e, e.getDirectories, t) || [] } function xY(e, t, r, i, o) { return U7(e, e.readDirectory, t, r, i, o) || Je } function F7(e, t) { return U7(e, e.fileExists, t) } function G7(e, t) { return B7(() => gp(t, e)) || !1 } function B7(e) { try { return e() } catch { return } } function U7(e, t, ...r) { return B7(() => t && t.apply(e, r)) } function AY(e, t, r) { let i = []; return Th(e, o => { if (o === r) return !0; let s = vi(o, "package.json"); F7(t, s) && i.push(s) }), i } function cge(e, t) { let r; return Th(e, i => { if (i === "node_modules" || (r = Vpe(i, o => F7(t, o), "package.json"), r)) return !0 }), r } function lge(e, t) { if (!t.fileExists) return []; let r = []; return Th(ni(e), i => { let o = vi(i, "package.json"); if (t.fileExists(o)) { let s = uge(o, t); s && r.push(s) } }), r } function uge(e, t) { if (!t.readFile) return; let r = ["dependencies", "devDependencies", "optionalDependencies", "peerDependencies"], i = t.readFile(e) || "", o = z6e(i), s = {}; if (o) for (let d of r) { let g = o[d]; if (!g) continue; let m = new Map; for (let v in g) m.set(v, g[v]); s[d] = m } let l = [[1, s.dependencies], [2, s.devDependencies], [8, s.optionalDependencies], [4, s.peerDependencies]]; return { ...s, parseable: !!o, fileName: e, get: f, has(d, g) { return !!f(d, g) } }; function f(d, g = 15) { for (let [m, v] of l) if (v && g & m) { let S = v.get(d); if (S !== void 0) return S } } } function uk(e, t, r) { let i = (r.getPackageJsonsVisibleToFile && r.getPackageJsonsVisibleToFile(e.fileName) || lge(e.fileName, r)).filter(A => A.parseable), o, s, l; return { allowsImportingAmbientModule: d, allowsImportingSourceFile: g, allowsImportingSpecifier: m }; function f(A) { let w = x(A); for (let C of i) if (C.has(w) || C.has(rF(w))) return !0; return !1 } function d(A, w) { if (!i.length || !A.valueDeclaration) return !0; if (!s) s = new Map; else { let q = s.get(A); if (q !== void 0) return q } let C = u_(A.getName()); if (v(C)) return s.set(A, !0), !0; let P = A.valueDeclaration.getSourceFile(), F = S(P.fileName, w); if (typeof F > "u") return s.set(A, !0), !0; let B = f(F) || f(C); return s.set(A, B), B } function g(A, w) { if (!i.length) return !0; if (!l) l = new Map; else { let F = l.get(A); if (F !== void 0) return F } let C = S(A.fileName, w); if (!C) return l.set(A, !0), !0; let P = f(C); return l.set(A, P), P } function m(A) { return !i.length || v(A) || Jd(A) || qp(A) ? !0 : f(A) } function v(A) { return !!(Cu(e) && QT.nodeCoreModules.has(A) && (o === void 0 && (o = V7(e)), o)) } function S(A, w) { if (!jl(A, "node_modules")) return; let C = Q0.getNodeModulesPackageName(r.getCompilationSettings(), e, A, w, t); if (C && !Jd(C) && !qp(C)) return x(C) } function x(A) { let w = Ou(ZO(A)).slice(1); return na(w[0], "@") ? `${w[0]}/${w[1]}` : w[0] } } function z6e(e) { try { return JSON.parse(e) } catch { return } } function V7(e) { return vt(e.imports, ({ text: t }) => QT.nodeCoreModules.has(t)) } function dge(e) { return ya(Ou(e), "node_modules") } function CY(e) { return e.file !== void 0 && e.start !== void 0 && e.length !== void 0 } function fge(e, t) { let r = Du(e), i = j1(t, r, Ks, f8); if (i >= 0) { let o = t[i]; return L.assertEqual(o.file, e.getSourceFile(), "Diagnostics proided to 'findDiagnosticForNode' must be from a single SourceFile"), Ga(o, CY) } } function _ge(e, t) { var r; let i = j1(t, e.start, l => l.start, Es); for (i < 0 && (i = ~i); ((r = t[i - 1]) == null ? void 0 : r.start) === e.start;)i--; let o = [], s = wl(e); for (; ;) { let l = zr(t[i], CY); if (!l || l.start > s) break; Roe(e, l) && o.push(l), i++ } return o } function QS({ startPosition: e, endPosition: t }) { return Wc(e, t === void 0 ? e : t) } function IY(e, t) { let r = Vi(e, t.start); return jn(r, o => o.getStart(e) < t.start || o.getEnd() > wl(t) ? "quit" : ot(o) && J2(t, Du(o, e))) } function pge(e, t, r = Ks) { return e ? ba(e) ? r(on(e, t)) : t(e, 0) : void 0 } function LY(e) { return ba(e) ? Vo(e) : e } function mge(e, t) { if (hge(e)) { let r = gge(e); if (r) return r; let i = gu.moduleSymbolToValidIdentifier(kY(e), t, !1), o = gu.moduleSymbolToValidIdentifier(kY(e), t, !0); return i === o ? i : [i, o] } return e.name } function j7(e, t, r) { return hge(e) ? gge(e) || gu.moduleSymbolToValidIdentifier(kY(e), t, !!r) : e.name } function hge(e) { return !(e.flags & 33554432) && (e.escapedName === "export=" || e.escapedName === "default") } function gge(e) { return ks(e.declarations, t => { var r, i; return pc(t) ? (r = zr(ql(t.expression), Re)) == null ? void 0 : r.text : (i = zr(sa(t), Re)) == null ? void 0 : i.text }) } function kY(e) { var t; return L.checkDefined(e.parent, `Symbol parent was undefined. Flags: ${L.formatSymbolFlags(e.flags)}. Declarations: ${(t = e.declarations) == null ? void 0 : t.map(r => { let i = L.formatSyntaxKind(r.kind), o = Yn(r), { expression: s } = r; return (o ? "[JS]" : "") + i + (s ? ` (expression: ${L.formatSyntaxKind(s.kind)})` : "") }).join(", ")}.`) } function yge(e, t, r) { let i = t.length; if (i + r > e.length) return !1; for (let o = 0; o < i; o++)if (t.charCodeAt(o) !== e.charCodeAt(o + r)) return !1; return !0 } function DY(e) { return e.charCodeAt(0) === 95 } function J6e(e) { return !vge(e) } function vge(e) { let t = e.getSourceFile(); return !t.externalModuleIndicator && !t.commonJsModuleIndicator ? !1 : Yn(e) || !jn(e, r => Tc(r) && mp(r)) } function H7(e) { return !!(Tj(e) & 8192) } function W7(e, t) { let r = ks(e.imports, i => { if (QT.nodeCoreModules.has(i.text)) return na(i.text, "node:") }); return r ?? t.usesUriStyleNodeCoreModules } function XN(e) {
+                return e === `
+`? 1 : 0
+            } function ZS(e) { return ba(e) ? jm(uo(e[0]), e.slice(1)) : uo(e) } function z7({ options: e }, t) { let r = !e.semicolons || e.semicolons === "ignore", i = e.semicolons === "remove" || r && !P7(t); return { ...e, semicolons: i ? "remove" : "ignore" } } function wY(e) { return e === 2 || e === 3 } function dk(e, t) { return e.isSourceFileFromExternalLibrary(t) || e.isSourceFileDefaultLibrary(t) } function J7(e, t) { let r = new Set, i = new Set, o = new Set; for (let f of t) if (!yO(f)) { let d = vs(f.expression); if (fT(d)) switch (d.kind) { case 14: case 10: r.add(d.text); break; case 8: i.add(parseInt(d.text)); break; case 9: let g = Ple(Oc(d.text, "n") ? d.text.slice(0, -1) : d.text); g && o.add(j0(g)); break } else { let g = e.getSymbolAtLocation(f.expression); if (g && g.valueDeclaration && q0(g.valueDeclaration)) { let m = e.getConstantValue(g.valueDeclaration); m !== void 0 && s(m) } } } return { addValue: s, hasValue: l }; function s(f) { switch (typeof f) { case "string": r.add(f); break; case "number": i.add(f) } } function l(f) { switch (typeof f) { case "string": return r.has(f); case "number": return i.has(f); case "object": return o.has(j0(f)) } } } var $l, RY, bge, K7, OY, q7, Ege, X7, NY, K6e = gt({
+                "src/services/utilities.ts"() {
+                    "use strict"; Fr(), $l = kg(99, !0), RY = (e => (e[e.None = 0] = "None", e[e.Value = 1] = "Value", e[e.Type = 2] = "Type", e[e.Namespace = 4] = "Namespace", e[e.All = 7] = "All", e))(RY || {}), bge = /^\/\/\/\s*</, K7 = [131, 129, 160, 134, 95, 138, 141, 144, 104, 148, 149, 146, 152, 153, 110, 114, 155, 156, 157], OY = (e => (e[e.Single = 0] = "Single", e[e.Double = 1] = "Double", e))(OY || {}), q7 = M6e(), Ege = `
+`, X7 = "anonymous function", NY = Kp(SY, oge, sge, O7)
+                }
+            }); function Tge(e) { let t = 1, r = Nf(), i = new Map, o = new Map, s, l = { isUsableByFile: x => x === s, isEmpty: () => !r.size, clear: () => { r.clear(), i.clear(), s = void 0 }, add: (x, A, w, C, P, F, B, q) => { x !== s && (l.clear(), s = x); let W; if (P) { let ge = jW(P.fileName); if (ge) { let { topLevelNodeModulesIndex: X, topLevelPackageNameIndex: Ve, packageRootIndex: we } = ge; if (W = iF(ZO(P.fileName.substring(Ve + 1, we))), na(x, P.path.substring(0, X))) { let ke = o.get(W), Pe = P.fileName.substring(0, Ve + 1); if (ke) { let Ce = ke.indexOf(Wg); X > Ce && o.set(W, Pe) } else o.set(W, Pe) } } } let R = F === 1 && QA(A) || A, ie = F === 0 || BN(R) ? Gi(w) : mge(R, void 0), $ = typeof ie == "string" ? ie : ie[0], fe = typeof ie == "string" ? void 0 : ie[1], Z = u_(C.name), U = t++, re = wd(A, q), le = A.flags & 33554432 ? void 0 : A, _e = C.flags & 33554432 ? void 0 : C; (!le || !_e) && i.set(U, [A, C]), r.add(d($, A, fl(Z) ? void 0 : Z, q), { id: U, symbolTableKey: w, symbolName: $, capitalizedSymbolName: fe, moduleName: Z, moduleFile: P, moduleFileName: P?.fileName, packageName: W, exportKind: F, targetFlags: re.flags, isFromPackageJson: B, symbol: le, moduleSymbol: _e }) }, get: (x, A) => { if (x !== s) return; let w = r.get(A); return w?.map(f) }, search: (x, A, w, C) => { if (x === s) return Ld(r, (P, F) => { let { symbolName: B, ambientModuleName: q } = g(F), W = A && P[0].capitalizedSymbolName || B; if (w(W, P[0].targetFlags)) { let R = P.map(f).filter((ie, $) => S(ie, P[$].packageName)); if (R.length) { let ie = C(R, W, !!q, F); if (ie !== void 0) return ie } } }) }, releaseSymbols: () => { i.clear() }, onFileChanged: (x, A, w) => m(x) && m(A) ? !1 : s && s !== A.path || w && V7(x) !== V7(A) || !up(x.moduleAugmentations, A.moduleAugmentations) || !v(x, A) ? (l.clear(), !0) : (s = A.path, !1) }; return L.isDebugging && Object.defineProperty(l, "__cache", { get: () => r }), l; function f(x) { if (x.symbol && x.moduleSymbol) return x; let { id: A, exportKind: w, targetFlags: C, isFromPackageJson: P, moduleFileName: F } = x, [B, q] = i.get(A) || Je; if (B && q) return { symbol: B, moduleSymbol: q, moduleFileName: F, exportKind: w, targetFlags: C, isFromPackageJson: P }; let W = (P ? e.getPackageJsonAutoImportProvider() : e.getCurrentProgram()).getTypeChecker(), Y = x.moduleSymbol || q || L.checkDefined(x.moduleFile ? W.getMergedSymbol(x.moduleFile.symbol) : W.tryFindAmbientModule(x.moduleName)), R = x.symbol || B || L.checkDefined(w === 2 ? W.resolveExternalModuleSymbol(Y) : W.tryGetMemberInModuleExportsAndProperties(Gi(x.symbolTableKey), Y), `Could not find symbol '${x.symbolName}' by key '${x.symbolTableKey}' in module ${Y.name}`); return i.set(A, [R, Y]), { symbol: R, moduleSymbol: Y, moduleFileName: F, exportKind: w, targetFlags: C, isFromPackageJson: P } } function d(x, A, w, C) { let P = w || ""; return `${x}|${$a(wd(A, C))}|${P}` } function g(x) { let A = x.substring(0, x.indexOf("|")), w = x.substring(x.lastIndexOf("|") + 1); return { symbolName: A, ambientModuleName: w === "" ? void 0 : w } } function m(x) { return !x.commonJsModuleIndicator && !x.externalModuleIndicator && !x.moduleAugmentations && !x.ambientModuleNames } function v(x, A) { if (!up(x.ambientModuleNames, A.ambientModuleNames)) return !1; let w = -1, C = -1; for (let P of A.ambientModuleNames) { let F = B => lH(B) && B.name.text === P; if (w = Yc(x.statements, F, w + 1), C = Yc(A.statements, F, C + 1), x.statements[w] !== A.statements[C]) return !1 } return !0 } function S(x, A) { if (!A || !x.moduleFileName) return !0; let w = e.getGlobalTypingsCacheLocation(); if (w && na(x.moduleFileName, w)) return !0; let C = o.get(A); return !C || na(x.moduleFileName, C) } } function PY(e, t, r, i, o, s, l) { var f; if (t === r) return !1; let d = l?.get(t.path, r.path, i, {}); if (d?.isBlockedByPackageJsonDependencies !== void 0) return !d.isBlockedByPackageJsonDependencies; let g = lb(s), m = (f = s.getGlobalTypingsCacheLocation) == null ? void 0 : f.call(s), v = !!Q0.forEachFileNameOfModule(t.fileName, r.fileName, s, !1, S => { let x = e.getSourceFile(S); return (x === r || !x) && q6e(t.fileName, S, g, m) }); if (o) { let S = v && o.allowsImportingSourceFile(r, s); return l?.setBlockedByPackageJsonDependencies(t.path, r.path, i, {}, !S), S } return v } function q6e(e, t, r, i) { let o = Th(t, l => Hl(l) === "node_modules" ? l : void 0), s = o && ni(r(o)); return s === void 0 || na(r(e), s) || !!i && na(r(i), s) } function MY(e, t, r, i, o) { var s, l; let f = xR(t), d = r.autoImportFileExcludePatterns && Zi(r.autoImportFileExcludePatterns, m => { let v = kW(m, "", "exclude"); return v ? Qy(v, f) : void 0 }); Sge(e.getTypeChecker(), e.getSourceFiles(), d, (m, v) => o(m, v, e, !1)); let g = i && ((s = t.getPackageJsonAutoImportProvider) == null ? void 0 : s.call(t)); if (g) { let m = Ms(), v = e.getTypeChecker(); Sge(g.getTypeChecker(), g.getSourceFiles(), d, (S, x) => { (x && !e.getSourceFile(x.fileName) || !x && !v.resolveName(S.name, void 0, 1536, !1)) && o(S, x, g, !0) }), (l = t.log) == null || l.call(t, `forEachExternalModuleToImportFrom autoImportProvider: ${Ms() - m}`) } } function Sge(e, t, r, i) { var o; let s = r && (l => r.some(f => f.test(l))); for (let l of e.getAmbientModules()) !jl(l.name, "*") && !(r && ((o = l.declarations) != null && o.every(f => s(f.getSourceFile().fileName)))) && i(l, void 0); for (let l of t) kd(l) && !s?.(l.fileName) && i(e.getMergedSymbol(l.symbol), l) } function YN(e, t, r, i, o) { var s, l, f, d, g; let m = Ms(); (s = t.getPackageJsonAutoImportProvider) == null || s.call(t); let v = ((l = t.getCachedExportInfoMap) == null ? void 0 : l.call(t)) || Tge({ getCurrentProgram: () => r, getPackageJsonAutoImportProvider: () => { var A; return (A = t.getPackageJsonAutoImportProvider) == null ? void 0 : A.call(t) }, getGlobalTypingsCacheLocation: () => { var A; return (A = t.getGlobalTypingsCacheLocation) == null ? void 0 : A.call(t) } }); if (v.isUsableByFile(e.path)) return (f = t.log) == null || f.call(t, "getExportInfoMap: cache hit"), v; (d = t.log) == null || d.call(t, "getExportInfoMap: cache miss or empty; calculating new results"); let S = r.getCompilerOptions(), x = 0; try { MY(r, t, i, !0, (A, w, C, P) => { ++x % 100 === 0 && o?.throwIfCancellationRequested(); let F = new Map, B = C.getTypeChecker(), q = Y7(A, B, S); q && xge(q.symbol, B) && v.add(e.path, q.symbol, q.exportKind === 1 ? "default" : "export=", A, w, q.exportKind, P, B), B.forEachExportAndPropertyOfModule(A, (W, Y) => { W !== q?.symbol && xge(W, B) && V_(F, Y) && v.add(e.path, W, Y, A, w, 0, P, B) }) }) } catch (A) { throw v.clear(), A } return (g = t.log) == null || g.call(t, `getExportInfoMap: done in ${Ms() - m} ms`), v } function Y7(e, t, r) { let i = X6e(e, t); if (!i) return; let { symbol: o, exportKind: s } = i, l = $7(o, t, r); return l && { symbol: o, exportKind: s, ...l } } function xge(e, t) { return !t.isUndefinedSymbol(e) && !t.isUnknownSymbol(e) && !gR(e) && !Cce(e) } function X6e(e, t) { let r = t.resolveExternalModuleSymbol(e); if (r !== e) return { symbol: r, exportKind: 2 }; let i = t.tryGetMemberInModuleExports("default", e); if (i) return { symbol: i, exportKind: 1 } } function $7(e, t, r) { let i = QA(e); if (i) return { resolvedSymbol: i, name: i.name }; let o = Y6e(e); if (o !== void 0) return { resolvedSymbol: e, name: o }; if (e.flags & 2097152) { let s = t.getImmediateAliasedSymbol(e); if (s && s.parent) return $7(s, t, r) } return e.escapedName !== "default" && e.escapedName !== "export=" ? { resolvedSymbol: e, name: e.getName() } : { resolvedSymbol: e, name: j7(e, r.target) } } function Y6e(e) { return e.declarations && ks(e.declarations, t => { var r; if (pc(t)) return (r = zr(ql(t.expression), Re)) == null ? void 0 : r.text; if (Mu(t)) return L.assert(t.name.text === "default", "Expected the specifier to be a default export"), t.propertyName && t.propertyName.text }) } var FY, GY, $6e = gt({ "src/services/exportInfoMap.ts"() { "use strict"; Fr(), FY = (e => (e[e.Named = 0] = "Named", e[e.Default = 1] = "Default", e[e.Namespace = 2] = "Namespace", e[e.CommonJS = 3] = "CommonJS", e))(FY || {}), GY = (e => (e[e.Named = 0] = "Named", e[e.Default = 1] = "Default", e[e.ExportEquals = 2] = "ExportEquals", e[e.UMD = 3] = "UMD", e))(GY || {}) } }); function Age() { let e = kg(99, !1); function t(i, o, s) { return e4e(r(i, o, s), i) } function r(i, o, s) { let l = 0, f = 0, d = [], { prefix: g, pushTemplate: m } = r4e(o); i = g + i; let v = g.length; m && d.push(15), e.setText(i); let S = 0, x = [], A = 0; do { l = e.scan(), KA(l) || (w(), f = l); let C = e.getTextPos(); if (Z6e(e.getTokenPos(), C, v, o4e(l), x), C >= i.length) { let P = Q6e(e, l, Os(d)); P !== void 0 && (S = P) } } while (l !== 1); function w() { switch (l) { case 43: case 68: !wge[f] && e.reScanSlashToken() === 13 && (l = 13); break; case 29: f === 79 && A++; break; case 31: A > 0 && A--; break; case 131: case 152: case 148: case 134: case 153: A > 0 && !s && (l = 79); break; case 15: d.push(l); break; case 18: d.length > 0 && d.push(l); break; case 19: if (d.length > 0) { let C = Os(d); C === 15 ? (l = e.reScanTemplateToken(!1), l === 17 ? d.pop() : L.assertEqual(l, 16, "Should have been a template middle.")) : (L.assertEqual(C, 18, "Should have been an open brace"), d.pop()) } break; default: if (!Xu(l)) break; (f === 24 || Xu(f) && Xu(l) && !n4e(f, l)) && (l = 79) } } return { endOfLineState: S, spans: x } } return { getClassificationsForLine: t, getEncodedLexicalClassifications: r } } function Q6e(e, t, r) { switch (t) { case 10: { if (!e.isUnterminated()) return; let i = e.getTokenText(), o = i.length - 1, s = 0; for (; i.charCodeAt(o - s) === 92;)s++; return s & 1 ? i.charCodeAt(0) === 34 ? 3 : 2 : void 0 } case 3: return e.isUnterminated() ? 1 : void 0; default: if (Hy(t)) { if (!e.isUnterminated()) return; switch (t) { case 17: return 5; case 14: return 4; default: return L.fail("Only 'NoSubstitutionTemplateLiteral's and 'TemplateTail's can be unterminated; got SyntaxKind #" + t) } } return r === 15 ? 6 : void 0 } } function Z6e(e, t, r, i, o) { if (i === 8) return; e === 0 && r > 0 && (e += r); let s = t - e; s > 0 && o.push(e - r, s, i) } function e4e(e, t) { let r = [], i = e.spans, o = 0; for (let l = 0; l < i.length; l += 3) { let f = i[l], d = i[l + 1], g = i[l + 2]; if (o >= 0) { let m = f - o; m > 0 && r.push({ length: m, classification: 4 }) } r.push({ length: d, classification: t4e(g) }), o = f + d } let s = t.length - o; return s > 0 && r.push({ length: s, classification: 4 }), { entries: r, finalLexState: e.endOfLineState } } function t4e(e) { switch (e) { case 1: return 3; case 3: return 1; case 4: return 6; case 25: return 7; case 5: return 2; case 6: return 8; case 8: return 4; case 10: return 0; case 2: case 11: case 12: case 13: case 14: case 15: case 16: case 9: case 17: return 5; default: return } } function n4e(e, t) { if (!ZX(e)) return !0; switch (t) { case 137: case 151: case 135: case 124: case 127: return !0; default: return !1 } } function r4e(e) {
+                switch (e) {
+                    case 3: return {
+                        prefix: `"\\
+`}; case 2: return {
+                        prefix: `'\\
+`}; case 1: return {
+                        prefix: `/*
+`}; case 4: return { prefix: "`\n" }; case 5: return {
+                        prefix: `}
+`, pushTemplate: !0
+                    }; case 6: return { prefix: "", pushTemplate: !0 }; case 0: return { prefix: "" }; default: return L.assertNever(e)
+                }
+            } function i4e(e) { switch (e) { case 41: case 43: case 44: case 39: case 40: case 47: case 48: case 49: case 29: case 31: case 32: case 33: case 102: case 101: case 128: case 150: case 34: case 35: case 36: case 37: case 50: case 52: case 51: case 55: case 56: case 74: case 73: case 78: case 70: case 71: case 72: case 64: case 65: case 66: case 68: case 69: case 63: case 27: case 60: case 75: case 76: case 77: return !0; default: return !1 } } function a4e(e) { switch (e) { case 39: case 40: case 54: case 53: case 45: case 46: return !0; default: return !1 } } function o4e(e) { if (Xu(e)) return 3; if (i4e(e) || a4e(e)) return 5; if (e >= 18 && e <= 78) return 10; switch (e) { case 8: return 4; case 9: return 25; case 10: return 6; case 13: return 7; case 7: case 3: case 2: return 1; case 5: case 4: return 8; case 79: default: return Hy(e) ? 6 : 2 } } function Cge(e, t, r, i, o) { return kge(BY(e, t, r, i, o)) } function Ige(e, t) { switch (t) { case 264: case 260: case 261: case 259: case 228: case 215: case 216: e.throwIfCancellationRequested() } } function BY(e, t, r, i, o) { let s = []; return r.forEachChild(function f(d) { if (!(!d || !$8(o, d.pos, d.getFullWidth()))) { if (Ige(t, d.kind), Re(d) && !rc(d) && i.has(d.escapedText)) { let g = e.getSymbolAtLocation(d), m = g && Lge(g, ZT(d), e); m && l(d.getStart(r), d.getEnd(), m) } d.forEachChild(f) } }), { spans: s, endOfLineState: 0 }; function l(f, d, g) { let m = d - f; L.assert(m > 0, `Classification had non-positive length of ${m}`), s.push(f), s.push(m), s.push(g) } } function Lge(e, t, r) { let i = e.getFlags(); if (i & 2885600) return i & 32 ? 11 : i & 384 ? 12 : i & 524288 ? 16 : i & 1536 ? t & 4 || t & 1 && s4e(e) ? 14 : void 0 : i & 2097152 ? Lge(r.getAliasedSymbol(e), t, r) : t & 2 ? i & 64 ? 13 : i & 262144 ? 15 : void 0 : void 0 } function s4e(e) { return vt(e.declarations, t => Tc(t) && Gh(t) === 1) } function c4e(e) { switch (e) { case 1: return "comment"; case 2: return "identifier"; case 3: return "keyword"; case 4: return "number"; case 25: return "bigint"; case 5: return "operator"; case 6: return "string"; case 8: return "whitespace"; case 9: return "text"; case 10: return "punctuation"; case 11: return "class name"; case 12: return "enum name"; case 13: return "interface name"; case 14: return "module name"; case 15: return "type parameter name"; case 16: return "type alias name"; case 17: return "parameter name"; case 18: return "doc comment tag name"; case 19: return "jsx open tag name"; case 20: return "jsx close tag name"; case 21: return "jsx self closing tag name"; case 22: return "jsx attribute"; case 23: return "jsx text"; case 24: return "jsx attribute string literal value"; default: return } } function kge(e) { L.assert(e.spans.length % 3 === 0); let t = e.spans, r = []; for (let i = 0; i < t.length; i += 3)r.push({ textSpan: il(t[i], t[i + 1]), classificationType: c4e(t[i + 2]) }); return r } function Dge(e, t, r) { return kge(UY(e, t, r)) } function UY(e, t, r) { let i = r.start, o = r.length, s = kg(99, !1, t.languageVariant, t.text), l = kg(99, !1, t.languageVariant, t.text), f = []; return q(t), { spans: f, endOfLineState: 0 }; function d(W, Y, R) { f.push(W), f.push(Y), f.push(R) } function g(W) { for (s.setTextPos(W.pos); ;) { let Y = s.getTextPos(); if (!hoe(t.text, Y)) return Y; let R = s.scan(), ie = s.getTextPos(), $ = ie - Y; if (!KA(R)) return Y; switch (R) { case 4: case 5: continue; case 2: case 3: m(W, R, Y, $), s.setTextPos(ie); continue; case 7: let fe = t.text, Z = fe.charCodeAt(Y); if (Z === 60 || Z === 62) { d(Y, $, 1); continue } L.assert(Z === 124 || Z === 61), w(fe, Y, ie); break; case 6: break; default: L.assertNever(R) } } } function m(W, Y, R, ie) { if (Y === 3) { let $ = Mde(t.text, R, ie); if ($ && $.jsDoc) { go($.jsDoc, W), S($.jsDoc); return } } else if (Y === 2 && x(R, ie)) return; v(R, ie) } function v(W, Y) { d(W, Y, 1) } function S(W) { var Y, R, ie, $, fe, Z, U, re; let le = W.pos; if (W.tags) for (let ge of W.tags) { ge.pos !== le && v(le, ge.pos - le), d(ge.pos, 1, 10), d(ge.tagName.pos, ge.tagName.end - ge.tagName.pos, 18), le = ge.tagName.end; let X = ge.tagName.end; switch (ge.kind) { case 344: let Ve = ge; _e(Ve), X = Ve.isNameFirst && ((Y = Ve.typeExpression) == null ? void 0 : Y.end) || Ve.name.end; break; case 351: let we = ge; X = we.isNameFirst && ((R = we.typeExpression) == null ? void 0 : R.end) || we.name.end; break; case 348: A(ge), le = ge.end, X = ge.typeParameters.end; break; case 349: let ke = ge; X = ((ie = ke.typeExpression) == null ? void 0 : ie.kind) === 312 && (($ = ke.fullName) == null ? void 0 : $.end) || ((fe = ke.typeExpression) == null ? void 0 : fe.end) || X; break; case 341: X = ge.typeExpression.end; break; case 347: q(ge.typeExpression), le = ge.end, X = ge.typeExpression.end; break; case 346: case 343: X = ge.typeExpression.end; break; case 345: q(ge.typeExpression), le = ge.end, X = ((Z = ge.typeExpression) == null ? void 0 : Z.end) || X; break; case 350: X = ((U = ge.name) == null ? void 0 : U.end) || X; break; case 331: case 332: X = ge.class.end; break; case 352: q(ge.typeExpression), le = ge.end, X = ((re = ge.typeExpression) == null ? void 0 : re.end) || X; break }typeof ge.comment == "object" ? v(ge.comment.pos, ge.comment.end - ge.comment.pos) : typeof ge.comment == "string" && v(X, ge.end - X) } le !== W.end && v(le, W.end - le); return; function _e(ge) { ge.isNameFirst && (v(le, ge.name.pos - le), d(ge.name.pos, ge.name.end - ge.name.pos, 17), le = ge.name.end), ge.typeExpression && (v(le, ge.typeExpression.pos - le), q(ge.typeExpression), le = ge.typeExpression.end), ge.isNameFirst || (v(le, ge.name.pos - le), d(ge.name.pos, ge.name.end - ge.name.pos, 17), le = ge.name.end) } } function x(W, Y) { let R = /^(\/\/\/\s*)(<)(?:(\S+)((?:[^/]|\/[^>])*)(\/>)?)?/im, ie = /(\s)(\S+)(\s*)(=)(\s*)('[^']+'|"[^"]+")/img, $ = t.text.substr(W, Y), fe = R.exec($); if (!fe || !fe[3] || !(fe[3] in iw)) return !1; let Z = W; v(Z, fe[1].length), Z += fe[1].length, d(Z, fe[2].length, 10), Z += fe[2].length, d(Z, fe[3].length, 21), Z += fe[3].length; let U = fe[4], re = Z; for (; ;) { let _e = ie.exec(U); if (!_e) break; let ge = Z + _e.index + _e[1].length; ge > re && (v(re, ge - re), re = ge), d(re, _e[2].length, 22), re += _e[2].length, _e[3].length && (v(re, _e[3].length), re += _e[3].length), d(re, _e[4].length, 5), re += _e[4].length, _e[5].length && (v(re, _e[5].length), re += _e[5].length), d(re, _e[6].length, 24), re += _e[6].length } Z += fe[4].length, Z > re && v(re, Z - re), fe[5] && (d(Z, fe[5].length, 10), Z += fe[5].length); let le = W + Y; return Z < le && v(Z, le - Z), !0 } function A(W) { for (let Y of W.getChildren()) q(Y) } function w(W, Y, R) { let ie; for (ie = Y; ie < R && !Wl(W.charCodeAt(ie)); ie++); for (d(Y, ie - Y, 1), l.setTextPos(ie); l.getTextPos() < R;)C() } function C() { let W = l.getTextPos(), Y = l.scan(), R = l.getTextPos(), ie = B(Y); ie && d(W, R - W, ie) } function P(W) { if (dm(W) || rc(W)) return !0; let Y = F(W); if (!Z1(W) && W.kind !== 11 && Y === void 0) return !1; let R = W.kind === 11 ? W.pos : g(W), ie = W.end - R; if (L.assert(ie >= 0), ie > 0) { let $ = Y || B(W.kind, W); $ && d(R, ie, $) } return !0 } function F(W) { switch (W.parent && W.parent.kind) { case 283: if (W.parent.tagName === W) return 19; break; case 284: if (W.parent.tagName === W) return 20; break; case 282: if (W.parent.tagName === W) return 21; break; case 288: if (W.parent.name === W) return 22; break } } function B(W, Y) { if (Xu(W)) return 3; if ((W === 29 || W === 31) && Y && Ohe(Y.parent)) return 10; if (Phe(W)) { if (Y) { let R = Y.parent; if (W === 63 && (R.kind === 257 || R.kind === 169 || R.kind === 166 || R.kind === 288) || R.kind === 223 || R.kind === 221 || R.kind === 222 || R.kind === 224) return 5 } return 10 } else { if (W === 8) return 4; if (W === 9) return 25; if (W === 10) return Y && Y.parent.kind === 288 ? 24 : 6; if (W === 13) return 6; if (Hy(W)) return 6; if (W === 11) return 23; if (W === 79) { if (Y) { switch (Y.parent.kind) { case 260: return Y.parent.name === Y ? 11 : void 0; case 165: return Y.parent.name === Y ? 15 : void 0; case 261: return Y.parent.name === Y ? 13 : void 0; case 263: return Y.parent.name === Y ? 12 : void 0; case 264: return Y.parent.name === Y ? 14 : void 0; case 166: return Y.parent.name === Y ? LT(Y) ? 3 : 17 : void 0 }if (Ch(Y.parent)) return 3 } return 2 } } } function q(W) { if (W && Q8(i, o, W.pos, W.getFullWidth())) { Ige(e, W.kind); for (let Y of W.getChildren(t)) P(Y) || q(Y) } } } var wge, l4e = gt({ "src/services/classifier.ts"() { "use strict"; Fr(), wge = gae([79, 10, 8, 9, 13, 108, 45, 46, 21, 23, 19, 110, 95], e => e, () => !0) } }), Q7, u4e = gt({ "src/services/documentHighlights.ts"() { "use strict"; Fr(), (e => { function t(Z, U, re, le, _e) { let ge = ef(re, le); if (ge.parent && (Xm(ge.parent) && ge.parent.tagName === ge || GS(ge.parent))) { let { openingElement: X, closingElement: Ve } = ge.parent.parent, we = [X, Ve].map(({ tagName: ke }) => r(ke, re)); return [{ fileName: re.fileName, highlightSpans: we }] } return i(le, ge, Z, U, _e) || o(ge, re) } e.getDocumentHighlights = t; function r(Z, U) { return { fileName: U.fileName, textSpan: Du(Z, U), kind: "none" } } function i(Z, U, re, le, _e) { let ge = new Set(_e.map(ke => ke.fileName)), X = js.getReferenceEntriesForNode(Z, U, re, _e, le, void 0, ge); if (!X) return; let Ve = KD(X.map(js.toHighlightSpan), ke => ke.fileName, ke => ke.span), we = Dl(re.useCaseSensitiveFileNames()); return lo(UD(Ve.entries(), ([ke, Pe]) => { if (!ge.has(ke)) { if (!re.redirectTargetsMap.has(Ts(ke, re.getCurrentDirectory(), we))) return; let Ce = re.getSourceFile(ke); ke = wr(_e, Be => !!Be.redirectInfo && Be.redirectInfo.redirectTarget === Ce).fileName, L.assert(ge.has(ke)) } return { fileName: ke, highlightSpans: Pe } })) } function o(Z, U) { let re = s(Z, U); return re && [{ fileName: U.fileName, highlightSpans: re }] } function s(Z, U) { switch (Z.kind) { case 99: case 91: return MT(Z.parent) ? ie(Z.parent, U) : void 0; case 105: return le(Z.parent, j_, q); case 109: return le(Z.parent, Fz, B); case 111: case 83: case 96: let ge = Z.kind === 83 ? Z.parent.parent : Z.parent; return le(ge, mO, F); case 107: return le(Z.parent, pO, P); case 82: case 88: return yO(Z.parent) || CL(Z.parent) ? le(Z.parent.parent.parent, pO, P) : void 0; case 81: case 86: return le(Z.parent, hI, C); case 97: case 115: case 90: return le(Z.parent, X => Wy(X, !0), w); case 135: return re(Ec, [135]); case 137: case 151: return re(rb, [137, 151]); case 133: return le(Z.parent, v2, W); case 132: return _e(W(Z)); case 125: return _e(Y(Z)); case 101: return; default: return Rg(Z.kind) && (Kl(Z.parent) || Bc(Z.parent)) ? _e(S(Z.kind, Z.parent)) : void 0 }function re(ge, X) { return le(Z.parent, ge, Ve => { var we; return Zi((we = zr(Ve, $p)) == null ? void 0 : we.symbol.declarations, ke => ge(ke) ? wr(ke.getChildren(U), Pe => ya(X, Pe.kind)) : void 0) }) } function le(ge, X, Ve) { return X(ge) ? _e(Ve(ge, U)) : void 0 } function _e(ge) { return ge && ge.map(X => r(X, U)) } } function l(Z) { return Fz(Z) ? [Z] : mO(Z) ? Qi(Z.catchClause ? l(Z.catchClause) : Z.tryBlock && l(Z.tryBlock), Z.finallyBlock && l(Z.finallyBlock)) : Ia(Z) ? void 0 : g(Z, l) } function f(Z) { let U = Z; for (; U.parent;) { let re = U.parent; if (bT(re) || re.kind === 308) return re; if (mO(re) && re.tryBlock === U && re.catchClause) return U; U = re } } function d(Z) { return hI(Z) ? [Z] : Ia(Z) ? void 0 : g(Z, d) } function g(Z, U) { let re = []; return Z.forEachChild(le => { let _e = U(le); _e !== void 0 && re.push(...qD(_e)) }), re } function m(Z, U) { let re = v(U); return !!re && re === Z } function v(Z) { return jn(Z, U => { switch (U.kind) { case 252: if (Z.kind === 248) return !1; case 245: case 246: case 247: case 244: case 243: return !Z.label || fe(U, Z.label.escapedText); default: return Ia(U) && "quit" } }) } function S(Z, U) { return Zi(x(U, gS(Z)), re => z2(re, Z)) } function x(Z, U) { let re = Z.parent; switch (re.kind) { case 265: case 308: case 238: case 292: case 293: return U & 256 && sl(Z) ? [...Z.members, Z] : re.statements; case 173: case 171: case 259: return [...re.parameters, ...Yr(re.parent) ? re.parent.members : []]; case 260: case 228: case 261: case 184: let le = re.members; if (U & 92) { let _e = wr(re.members, Ec); if (_e) return [...le, ..._e.parameters] } else if (U & 256) return [...le, re]; return le; case 207: return; default: L.assertNever(re, "Invalid container kind.") } } function A(Z, U, ...re) { return U && ya(re, U.kind) ? (Z.push(U), !0) : !1 } function w(Z) { let U = []; if (A(U, Z.getFirstToken(), 97, 115, 90) && Z.kind === 243) { let re = Z.getChildren(); for (let le = re.length - 1; le >= 0 && !A(U, re[le], 115); le--); } return mn(d(Z.statement), re => { m(Z, re) && A(U, re.getFirstToken(), 81, 86) }), U } function C(Z) { let U = v(Z); if (U) switch (U.kind) { case 245: case 246: case 247: case 243: case 244: return w(U); case 252: return P(U) } } function P(Z) { let U = []; return A(U, Z.getFirstToken(), 107), mn(Z.caseBlock.clauses, re => { A(U, re.getFirstToken(), 82, 88), mn(d(re), le => { m(Z, le) && A(U, le.getFirstToken(), 81) }) }), U } function F(Z, U) { let re = []; if (A(re, Z.getFirstToken(), 111), Z.catchClause && A(re, Z.catchClause.getFirstToken(), 83), Z.finallyBlock) { let le = Yo(Z, 96, U); A(re, le, 96) } return re } function B(Z, U) { let re = f(Z); if (!re) return; let le = []; return mn(l(re), _e => { le.push(Yo(_e, 109, U)) }), bT(re) && vT(re, _e => { le.push(Yo(_e, 105, U)) }), le } function q(Z, U) { let re = Xd(Z); if (!re) return; let le = []; return vT(Ga(re.body, Va), _e => { le.push(Yo(_e, 105, U)) }), mn(l(re.body), _e => { le.push(Yo(_e, 109, U)) }), le } function W(Z) { let U = Xd(Z); if (!U) return; let re = []; return U.modifiers && U.modifiers.forEach(le => { A(re, le, 132) }), pa(U, le => { R(le, _e => { v2(_e) && A(re, _e.getFirstToken(), 133) }) }), re } function Y(Z) { let U = Xd(Z); if (!U) return; let re = []; return pa(U, le => { R(le, _e => { f3(_e) && A(re, _e.getFirstToken(), 125) }) }), re } function R(Z, U) { U(Z), !Ia(Z) && !Yr(Z) && !ku(Z) && !Tc(Z) && !Ep(Z) && !bi(Z) && pa(Z, re => R(re, U)) } function ie(Z, U) { let re = $(Z, U), le = []; for (let _e = 0; _e < re.length; _e++) { if (re[_e].kind === 91 && _e < re.length - 1) { let ge = re[_e], X = re[_e + 1], Ve = !0; for (let we = X.getStart(U) - 1; we >= ge.end; we--)if (!Yp(U.text.charCodeAt(we))) { Ve = !1; break } if (Ve) { le.push({ fileName: U.fileName, textSpan: Wc(ge.getStart(), X.end), kind: "reference" }), _e++; continue } } le.push(r(re[_e], U)) } return le } function $(Z, U) { let re = []; for (; MT(Z.parent) && Z.parent.elseStatement === Z;)Z = Z.parent; for (; ;) { let le = Z.getChildren(U); A(re, le[0], 99); for (let _e = le.length - 1; _e >= 0 && !A(re, le[_e], 91); _e--); if (!Z.elseStatement || !MT(Z.elseStatement)) break; Z = Z.elseStatement } return re } function fe(Z, U) { return !!jn(Z.parent, re => J0(re) ? re.label.escapedText === U : "quit") } })(Q7 || (Q7 = {})) } }); function Z7(e) { return !!e.sourceFile } function VY(e, t) { return Rge(e, t) } function Rge(e, t = "", r) { let i = new Map, o = Dl(!!e); function s() { let C = lo(i.keys()).filter(P => P && P.charAt(0) === "_").map(P => { let F = i.get(P), B = []; return F.forEach((q, W) => { Z7(q) ? B.push({ name: W, scriptKind: q.sourceFile.scriptKind, refCount: q.languageServiceRefCount }) : q.forEach((Y, R) => B.push({ name: W, scriptKind: R, refCount: Y.languageServiceRefCount })) }), B.sort((q, W) => W.refCount - q.refCount), { bucket: P, sourceFiles: B } }); return JSON.stringify(C, void 0, 2) } function l(C) { return typeof C.getCompilationSettings == "function" ? C.getCompilationSettings() : C } function f(C, P, F, B, q, W) { let Y = Ts(C, t, o), R = e5(l(P)); return d(C, Y, P, R, F, B, q, W) } function d(C, P, F, B, q, W, Y, R) { return S(C, P, F, B, q, W, !0, Y, R) } function g(C, P, F, B, q, W) { let Y = Ts(C, t, o), R = e5(l(P)); return m(C, Y, P, R, F, B, q, W) } function m(C, P, F, B, q, W, Y, R) { return S(C, P, l(F), B, q, W, !1, Y, R) } function v(C, P) { let F = Z7(C) ? C : C.get(L.checkDefined(P, "If there are more than one scriptKind's for same document the scriptKind should be provided")); return L.assert(P === void 0 || !F || F.sourceFile.scriptKind === P, `Script kind should match provided ScriptKind:${P} and sourceFile.scriptKind: ${F?.sourceFile.scriptKind}, !entry: ${!F}`), F } function S(C, P, F, B, q, W, Y, R, ie) { var $, fe, Z, U; R = h4(C, R); let re = l(F), le = F === re ? void 0 : F, _e = R === 6 ? 100 : Do(re), ge = typeof ie == "object" ? ie : { languageVersion: _e, impliedNodeFormat: le && NF(P, (U = (Z = (fe = ($ = le.getCompilerHost) == null ? void 0 : $.call(le)) == null ? void 0 : fe.getModuleResolutionCache) == null ? void 0 : Z.call(fe)) == null ? void 0 : U.getPackageJsonInfoCache(), le, re), setExternalModuleIndicator: OR(re) }; ge.languageVersion = _e; let X = i.size, Ve = Oge(B, ge.impliedNodeFormat), we = VD(i, Ve, () => new Map); if (ai) { i.size > X && ai.instant(ai.Phase.Session, "createdDocumentRegistryBucket", { configFilePath: re.configFilePath, key: Ve }); let Ie = !Fu(P) && Ld(i, (Be, Ne) => Ne !== Ve && Be.has(P) && Ne); Ie && ai.instant(ai.Phase.Session, "documentRegistryBucketOverlap", { path: P, key1: Ie, key2: Ve }) } let ke = we.get(P), Pe = ke && v(ke, R); if (!Pe && r) { let Ie = r.getDocument(Ve, P); Ie && (L.assert(Y), Pe = { sourceFile: Ie, languageServiceRefCount: 0 }, Ce()) } if (Pe) Pe.sourceFile.version !== W && (Pe.sourceFile = _$(Pe.sourceFile, q, W, q.getChangeRange(Pe.sourceFile.scriptSnapshot)), r && r.setDocument(Ve, P, Pe.sourceFile)), Y && Pe.languageServiceRefCount++; else { let Ie = f5(C, q, ge, W, !1, R); r && r.setDocument(Ve, P, Ie), Pe = { sourceFile: Ie, languageServiceRefCount: 1 }, Ce() } return L.assert(Pe.languageServiceRefCount !== 0), Pe.sourceFile; function Ce() { if (!ke) we.set(P, Pe); else if (Z7(ke)) { let Ie = new Map; Ie.set(ke.sourceFile.scriptKind, ke), Ie.set(R, Pe), we.set(P, Ie) } else ke.set(R, Pe) } } function x(C, P, F, B) { let q = Ts(C, t, o), W = e5(P); return A(q, W, F, B) } function A(C, P, F, B) { let q = L.checkDefined(i.get(Oge(P, B))), W = q.get(C), Y = v(W, F); Y.languageServiceRefCount--, L.assert(Y.languageServiceRefCount >= 0), Y.languageServiceRefCount === 0 && (Z7(W) ? q.delete(C) : (W.delete(F), W.size === 1 && q.set(C, FD(W.values(), Ks)))) } function w(C, P) { return lo(i.entries(), ([F, B]) => { let q = B.get(C), W = q && v(q, P); return [F, W && W.languageServiceRefCount] }) } return { acquireDocument: f, acquireDocumentWithKey: d, updateDocument: g, updateDocumentWithKey: m, releaseDocument: x, releaseDocumentWithKey: A, getLanguageServiceRefCounts: w, reportStats: s, getKeyForCompilationSettings: e5 } } function e5(e) { return JJ(e, V3) } function Oge(e, t) { return t ? `${e}|${t}` : e } var d4e = gt({ "src/services/documentRegistry.ts"() { "use strict"; Fr() } }); function Nge(e, t, r, i, o, s, l) { let f = xR(i), d = Dl(f), g = jY(t, r, d, l), m = jY(r, t, d, l); return nr.ChangeTracker.with({ host: i, formatContext: o, preferences: s }, v => { _4e(e, v, g, t, r, i.getCurrentDirectory(), f), p4e(e, v, g, m, i, d) }) } function jY(e, t, r, i) { let o = r(e); return l => { let f = i && i.tryGetSourcePosition({ fileName: l, pos: 0 }), d = s(f ? f.fileName : l); return f ? d === void 0 ? void 0 : f4e(f.fileName, d, l, r) : d }; function s(l) { if (r(l) === o) return t; let f = IW(l, o, r); return f === void 0 ? void 0 : t + "/" + f } } function f4e(e, t, r, i) { let o = _w(e, t, i); return HY(ni(r), o) } function _4e(e, t, r, i, o, s, l) { let { configFile: f } = e.getCompilerOptions(); if (!f) return; let d = ni(f.fileName), g = LI(f); if (!g) return; WY(g, (x, A) => { switch (A) { case "files": case "include": case "exclude": { if (m(x) || A !== "include" || !fu(x.initializer)) return; let C = Zi(x.initializer.elements, F => yo(F) ? F.text : void 0); if (C.length === 0) return; let P = tL(d, [], C, l, s); Qy(L.checkDefined(P.includeFilePattern), l).test(i) && !Qy(L.checkDefined(P.includeFilePattern), l).test(o) && t.insertNodeAfter(f, To(x.initializer.elements), D.createStringLiteral(S(o))); return } case "compilerOptions": WY(x.initializer, (w, C) => { let P = gJ(C); L.assert(P?.type !== "listOrElement"), P && (P.isFilePath || P.type === "list" && P.element.isFilePath) ? m(w) : C === "paths" && WY(w.initializer, F => { if (fu(F.initializer)) for (let B of F.initializer.elements) v(B) }) }); return } }); function m(x) { let A = fu(x.initializer) ? x.initializer.elements : [x.initializer], w = !1; for (let C of A) w = v(C) || w; return w } function v(x) { if (!yo(x)) return !1; let A = HY(d, x.text), w = r(A); return w !== void 0 ? (t.replaceRangeWithText(f, Mge(x, f), S(w)), !0) : !1 } function S(x) { return Xp(d, x, !l) } } function p4e(e, t, r, i, o, s) { let l = e.getSourceFiles(); for (let f of l) { let d = r(f.fileName), g = d ?? f.fileName, m = ni(g), v = i(f.fileName), S = v || f.fileName, x = ni(S), A = d !== void 0 || v !== void 0; g4e(f, t, w => { if (!Jd(w)) return; let C = HY(x, w), P = r(C); return P === void 0 ? void 0 : S0(Xp(m, P, s)) }, w => { let C = e.getTypeChecker().getSymbolAtLocation(w); if (C?.declarations && C.declarations.some(F => lu(F))) return; let P = v !== void 0 ? Pge(w, FL(w.text, S, e.getCompilerOptions(), o), r, l) : h4e(C, w, f, e, o, r); return P !== void 0 && (P.updated || A && Jd(w.text)) ? Q0.updateModuleSpecifier(e.getCompilerOptions(), f, s(g), P.newFileName, $S(e, o), w.text) : void 0 }) } } function m4e(e, t) { return So(vi(e, t)) } function HY(e, t) { return S0(m4e(e, t)) } function h4e(e, t, r, i, o, s) { var l; if (e) { let f = wr(e.declarations, Li).fileName, d = s(f); return d === void 0 ? { newFileName: f, updated: !1 } : { newFileName: d, updated: !0 } } else { let f = W_(r, t), d = o.resolveModuleNameLiterals || !o.resolveModuleNames ? (l = r.resolvedModules) == null ? void 0 : l.get(t.text, f) : o.getResolvedModuleWithFailedLookupLocationsFromCache && o.getResolvedModuleWithFailedLookupLocationsFromCache(t.text, r.fileName, f); return Pge(t, d, s, i.getSourceFiles()) } } function Pge(e, t, r, i) { if (!t) return; if (t.resolvedModule) { let d = f(t.resolvedModule.resolvedFileName); if (d) return d } let o = mn(t.failedLookupLocations, s) || Jd(e.text) && mn(t.failedLookupLocations, l); if (o) return o; return t.resolvedModule && { newFileName: t.resolvedModule.resolvedFileName, updated: !1 }; function s(d) { let g = r(d); return g && wr(i, m => m.fileName === g) ? l(d) : void 0 } function l(d) { return Oc(d, "/package.json") ? void 0 : f(d) } function f(d) { let g = r(d); return g && { newFileName: g, updated: !0 } } } function g4e(e, t, r, i) { for (let o of e.referencedFiles || Je) { let s = r(o.fileName); s !== void 0 && s !== e.text.slice(o.pos, o.end) && t.replaceRangeWithText(e, o, s) } for (let o of e.imports) { let s = i(o); s !== void 0 && s !== o.text && t.replaceRangeWithText(e, Mge(o, e), s) } } function Mge(e, t) { return Gf(e.getStart(t) + 1, e.end - 1) } function WY(e, t) { if (rs(e)) for (let r of e.properties) yl(r) && yo(r.name) && t(r, r.name.text) } var y4e = gt({ "src/services/getEditsForFileRename.ts"() { "use strict"; Fr() } }); function $N(e, t) { return { kind: e, isCaseSensitive: t } } function Fge(e) { let t = new Map, r = e.trim().split(".").map(i => T4e(i.trim())); if (!r.some(i => !i.subWordTextChunks.length)) return { getFullMatch: (i, o) => v4e(i, o, r, t), getMatchForLastSegmentOfPattern: i => zY(i, To(r), t), patternContainsDots: r.length > 1 } } function v4e(e, t, r, i) { if (!zY(t, To(r), i) || r.length - 1 > e.length) return; let s; for (let l = r.length - 2, f = e.length - 1; l >= 0; l -= 1, f -= 1)s = Uge(s, zY(e[f], r[l], i)); return s } function Gge(e, t) { let r = t.get(e); return r || t.set(e, r = Wge(e)), r } function Bge(e, t, r) { let i = S4e(e, t.textLowerCase); if (i === 0) return $N(t.text.length === e.length ? 0 : 1, na(e, t.text)); if (t.isLowerCase) { if (i === -1) return; let o = Gge(e, r); for (let s of o) if (JY(e, s, t.text, !0)) return $N(2, JY(e, s, t.text, !1)); if (t.text.length < e.length && ex(e.charCodeAt(i))) return $N(2, !1) } else { if (e.indexOf(t.text) > 0) return $N(2, !0); if (t.characterSpans.length > 0) { let o = Gge(e, r), s = Vge(e, o, t, !1) ? !0 : Vge(e, o, t, !0) ? !1 : void 0; if (s !== void 0) return $N(3, s) } } } function zY(e, t, r) { if (t5(t.totalTextChunk.text, s => s !== 32 && s !== 42)) { let s = Bge(e, t.totalTextChunk, r); if (s) return s } let i = t.subWordTextChunks, o; for (let s of i) o = Uge(o, Bge(e, s, r)); return o } function Uge(e, t) { return WU([e, t], b4e) } function b4e(e, t) { return e === void 0 ? 1 : t === void 0 ? -1 : Es(e.kind, t.kind) || g0(!e.isCaseSensitive, !t.isCaseSensitive) } function JY(e, t, r, i, o = { start: 0, length: r.length }) { return o.length <= t.length && Kge(0, o.length, s => E4e(r.charCodeAt(o.start + s), e.charCodeAt(t.start + s), i)) } function E4e(e, t, r) { return r ? KY(e) === KY(t) : e === t } function Vge(e, t, r, i) { let o = r.characterSpans, s = 0, l = 0, f, d; for (; ;) { if (l === o.length) return !0; if (s === t.length) return !1; let g = t[s], m = !1; for (; l < o.length; l++) { let v = o[l]; if (m && (!ex(r.text.charCodeAt(o[l - 1].start)) || !ex(r.text.charCodeAt(o[l].start))) || !JY(e, g, r.text, i, v)) break; m = !0, f = f === void 0 ? s : f, d = d === void 0 ? !0 : d, g = il(g.start + v.length, g.length - v.length) } !m && d !== void 0 && (d = !1), s++ } } function T4e(e) { return { totalTextChunk: XY(e), subWordTextChunks: A4e(e) } } function ex(e) { if (e >= 65 && e <= 90) return !0; if (e < 127 || !W8(e, 99)) return !1; let t = String.fromCharCode(e); return t === t.toUpperCase() } function jge(e) { if (e >= 97 && e <= 122) return !0; if (e < 127 || !W8(e, 99)) return !1; let t = String.fromCharCode(e); return t === t.toLowerCase() } function S4e(e, t) { let r = e.length - t.length; for (let i = 0; i <= r; i++)if (t5(t, (o, s) => KY(e.charCodeAt(s + i)) === o)) return i; return -1 } function KY(e) { return e >= 65 && e <= 90 ? 97 + (e - 65) : e < 127 ? e : String.fromCharCode(e).toLowerCase().charCodeAt(0) } function qY(e) { return e >= 48 && e <= 57 } function x4e(e) { return ex(e) || jge(e) || qY(e) || e === 95 || e === 36 } function A4e(e) { let t = [], r = 0, i = 0; for (let o = 0; o < e.length; o++) { let s = e.charCodeAt(o); x4e(s) ? (i === 0 && (r = o), i++) : i > 0 && (t.push(XY(e.substr(r, i))), i = 0) } return i > 0 && t.push(XY(e.substr(r, i))), t } function XY(e) { let t = e.toLowerCase(); return { text: e, textLowerCase: t, isLowerCase: e === t, characterSpans: Hge(e) } } function Hge(e) { return zge(e, !1) } function Wge(e) { return zge(e, !0) } function zge(e, t) { let r = [], i = 0; for (let o = 1; o < e.length; o++) { let s = qY(e.charCodeAt(o - 1)), l = qY(e.charCodeAt(o)), f = I4e(e, t, o), d = t && C4e(e, o, i); (YY(e.charCodeAt(o - 1)) || YY(e.charCodeAt(o)) || s !== l || f || d) && (Jge(e, i, o) || r.push(il(i, o - i)), i = o) } return Jge(e, i, e.length) || r.push(il(i, e.length - i)), r } function YY(e) { switch (e) { case 33: case 34: case 35: case 37: case 38: case 39: case 40: case 41: case 42: case 44: case 45: case 46: case 47: case 58: case 59: case 63: case 64: case 91: case 92: case 93: case 95: case 123: case 125: return !0 }return !1 } function Jge(e, t, r) { return t5(e, i => YY(i) && i !== 95, t, r) } function C4e(e, t, r) { return t !== r && t + 1 < e.length && ex(e.charCodeAt(t)) && jge(e.charCodeAt(t + 1)) && t5(e, ex, r, t) } function I4e(e, t, r) { let i = ex(e.charCodeAt(r - 1)); return ex(e.charCodeAt(r)) && (!t || !i) } function Kge(e, t, r) { for (let i = e; i < t; i++)if (!r(i)) return !1; return !0 } function t5(e, t, r = 0, i = e.length) { return Kge(r, i, o => t(e.charCodeAt(o), o)) } var n5, L4e = gt({ "src/services/patternMatcher.ts"() { "use strict"; Fr(), n5 = (e => (e[e.exact = 0] = "exact", e[e.prefix = 1] = "prefix", e[e.substring = 2] = "substring", e[e.camelCase = 3] = "camelCase", e))(n5 || {}) } }); function qge(e, t = !0, r = !1) { let i = { languageVersion: 1, pragmas: void 0, checkJsDirective: void 0, referencedFiles: [], typeReferenceDirectives: [], libReferenceDirectives: [], amdDependencies: [], hasNoDefaultLib: void 0, moduleName: void 0 }, o = [], s, l, f, d = 0, g = !1; function m() { return l = f, f = $l.scan(), f === 18 ? d++ : f === 19 && d--, f } function v() { let W = $l.getTokenValue(), Y = $l.getTokenPos(); return { fileName: W, pos: Y, end: Y + W.length } } function S() { s || (s = []), s.push({ ref: v(), depth: d }) } function x() { o.push(v()), A() } function A() { d === 0 && (g = !0) } function w() { let W = $l.getToken(); return W === 136 ? (W = m(), W === 142 && (W = m(), W === 10 && S()), !0) : !1 } function C() { if (l === 24) return !1; let W = $l.getToken(); if (W === 100) { if (W = m(), W === 20) { if (W = m(), W === 10 || W === 14) return x(), !0 } else { if (W === 10) return x(), !0; if (W === 154 && $l.lookAhead(() => { let R = $l.scan(); return R !== 158 && (R === 41 || R === 18 || R === 79 || Xu(R)) }) && (W = m()), W === 79 || Xu(W)) if (W = m(), W === 158) { if (W = m(), W === 10) return x(), !0 } else if (W === 63) { if (F(!0)) return !0 } else if (W === 27) W = m(); else return !0; if (W === 18) { for (W = m(); W !== 19 && W !== 1;)W = m(); W === 19 && (W = m(), W === 158 && (W = m(), W === 10 && x())) } else W === 41 && (W = m(), W === 128 && (W = m(), (W === 79 || Xu(W)) && (W = m(), W === 158 && (W = m(), W === 10 && x())))) } return !0 } return !1 } function P() { let W = $l.getToken(); if (W === 93) { if (A(), W = m(), W === 154 && $l.lookAhead(() => { let R = $l.scan(); return R === 41 || R === 18 }) && (W = m()), W === 18) { for (W = m(); W !== 19 && W !== 1;)W = m(); W === 19 && (W = m(), W === 158 && (W = m(), W === 10 && x())) } else if (W === 41) W = m(), W === 158 && (W = m(), W === 10 && x()); else if (W === 100 && (W = m(), W === 154 && $l.lookAhead(() => { let R = $l.scan(); return R === 79 || Xu(R) }) && (W = m()), (W === 79 || Xu(W)) && (W = m(), W === 63 && F(!0)))) return !0; return !0 } return !1 } function F(W, Y = !1) { let R = W ? m() : $l.getToken(); return R === 147 ? (R = m(), R === 20 && (R = m(), (R === 10 || Y && R === 14) && x()), !0) : !1 } function B() { let W = $l.getToken(); if (W === 79 && $l.getTokenValue() === "define") { if (W = m(), W !== 20) return !0; if (W = m(), W === 10 || W === 14) if (W = m(), W === 27) W = m(); else return !0; if (W !== 22) return !0; for (W = m(); W !== 23 && W !== 1;)(W === 10 || W === 14) && x(), W = m(); return !0 } return !1 } function q() { for ($l.setText(e), m(); $l.getToken() !== 1;) { if ($l.getToken() === 15) { let W = [$l.getToken()]; e: for (; Fn(W);) { let Y = $l.scan(); switch (Y) { case 1: break e; case 100: C(); break; case 15: W.push(Y); break; case 18: Fn(W) && W.push(Y); break; case 19: Fn(W) && (Os(W) === 15 ? $l.reScanTemplateToken(!1) === 17 && W.pop() : W.pop()); break } } m() } w() || C() || P() || r && (F(!1, !0) || B()) || m() } $l.setText(void 0) } if (t && q(), dJ(i, e), fJ(i, Ba), g) { if (s) for (let W of s) o.push(W.ref); return { referencedFiles: i.referencedFiles, typeReferenceDirectives: i.typeReferenceDirectives, libReferenceDirectives: i.libReferenceDirectives, importedFiles: o, isLibFile: !!i.hasNoDefaultLib, ambientExternalModules: void 0 } } else { let W; if (s) for (let Y of s) Y.depth === 0 ? (W || (W = []), W.push(Y.ref.fileName)) : o.push(Y.ref); return { referencedFiles: i.referencedFiles, typeReferenceDirectives: i.typeReferenceDirectives, libReferenceDirectives: i.libReferenceDirectives, importedFiles: o, isLibFile: !!i.hasNoDefaultLib, ambientExternalModules: W } } } var k4e = gt({ "src/services/preProcess.ts"() { "use strict"; Fr() } }); function Xge(e) { let t = Dl(e.useCaseSensitiveFileNames()), r = e.getCurrentDirectory(), i = new Map, o = new Map; return { tryGetSourcePosition: f, tryGetGeneratedPosition: d, toLineColumnOffset: S, clearCache: x }; function s(A) { return Ts(A, r, t) } function l(A, w) { let C = s(A), P = o.get(C); if (P) return P; let F; if (e.getDocumentPositionMapper) F = e.getDocumentPositionMapper(A, w); else if (e.readFile) { let B = v(A); F = B && Yge({ getSourceFileLike: v, getCanonicalFileName: t, log: q => e.log(q) }, A, F_e(B.text, Sh(B)), q => !e.fileExists || e.fileExists(q) ? e.readFile(q) : void 0) } return o.set(C, F || yF), F || yF } function f(A) { if (!Fu(A.fileName) || !g(A.fileName)) return; let C = l(A.fileName).getSourcePosition(A); return !C || C === A ? void 0 : f(C) || C } function d(A) { if (Fu(A.fileName)) return; let w = g(A.fileName); if (!w) return; let C = e.getProgram(); if (C.isSourceOfProjectReferenceRedirect(w.fileName)) return; let P = C.getCompilerOptions(), F = Ss(P), B = F ? ld(F) + ".d.ts" : $H(A.fileName, C.getCompilerOptions(), r, C.getCommonSourceDirectory(), t); if (B === void 0) return; let q = l(B, A.fileName).getGeneratedPosition(A); return q === A ? void 0 : q } function g(A) { let w = e.getProgram(); if (!w) return; let C = s(A), P = w.getSourceFileByPath(C); return P && P.resolvedPath === C ? P : void 0 } function m(A) { let w = s(A), C = i.get(w); if (C !== void 0) return C || void 0; if (!e.readFile || e.fileExists && !e.fileExists(w)) { i.set(w, !1); return } let P = e.readFile(w), F = P ? D4e(P) : !1; return i.set(w, F), F || void 0 } function v(A) { return e.getSourceFileLike ? e.getSourceFileLike(A) : g(A) || m(A) } function S(A, w) { return v(A).getLineAndCharacterOfPosition(w) } function x() { i.clear(), o.clear() } } function Yge(e, t, r, i) { let o = G_e(r); if (o) { let f = Qge.exec(o); if (f) { if (f[1]) { let d = f[1]; return $ge(e, nle(xl, d), t) } o = void 0 } } let s = []; o && s.push(o), s.push(t + ".map"); let l = o && _a(o, ni(t)); for (let f of s) { let d = _a(f, ni(t)), g = i(d, l); if (Ta(g)) return $ge(e, g, d); if (g !== void 0) return g || void 0 } } function $ge(e, t, r) { let i = bK(t); if (!(!i || !i.sources || !i.file || !i.mappings) && !(i.sourcesContent && i.sourcesContent.some(Ta))) return H_e(e, i, r) } function D4e(e, t) { return { text: e, lineMap: t, getLineAndCharacterOfPosition(r) { return yw(Sh(this), r) } } } var Qge, w4e = gt({ "src/services/sourcemaps.ts"() { "use strict"; Fr(), Fr(), Qge = /^data:(?:application\/json(?:;charset=[uU][tT][fF]-8);base64,([A-Za-z0-9+\/=]+)$)?/ } }); function $Y(e, t, r) { t.getSemanticDiagnostics(e, r); let i = [], o = t.getTypeChecker(); !(e.impliedNodeFormat === 1 || $c(e.fileName, [".cts", ".cjs"])) && e.commonJsModuleIndicator && (Vhe(t) || aY(t.getCompilerOptions())) && R4e(e) && i.push(hr(M4e(e.commonJsModuleIndicator), _.File_is_a_CommonJS_module_it_may_be_converted_to_an_ES_module)); let l = Cu(e); if (i5.clear(), f(e), wT(t.getCompilerOptions())) for (let d of e.imports) { let g = aR(d), m = O4e(g); if (!m) continue; let v = kA(e, d.text, W_(e, d)), S = v && t.getSourceFile(v.resolvedFileName); S && S.externalModuleIndicator && S.externalModuleIndicator !== !0 && pc(S.externalModuleIndicator) && S.externalModuleIndicator.isExportEquals && i.push(hr(m, _.Import_may_be_converted_to_a_default_import)) } return si(i, e.bindSuggestionDiagnostics), si(i, t.getSuggestionDiagnostics(e, r)), i.sort((d, g) => d.start - g.start); function f(d) { if (l) G4e(d, o) && i.push(hr(wi(d.parent) ? d.parent.name : d, _.This_constructor_function_may_be_converted_to_a_class_declaration)); else { if (Bc(d) && d.parent === e && d.declarationList.flags & 2 && d.declarationList.declarations.length === 1) { let g = d.declarationList.declarations[0].initializer; g && qu(g, !0) && i.push(hr(g, _.require_call_may_be_converted_to_an_import)) } gu.parameterShouldGetTypeFromJSDoc(d) && i.push(hr(d.name || d, _.JSDoc_types_may_be_moved_to_TypeScript_types)) } e$(d) && N4e(d, o, i), d.forEachChild(f) } } function R4e(e) { return e.statements.some(t => { switch (t.kind) { case 240: return t.declarationList.declarations.some(r => !!r.initializer && qu(Zge(r.initializer), !0)); case 241: { let { expression: r } = t; if (!ar(r)) return qu(r, !0); let i = ic(r); return i === 1 || i === 2 } default: return !1 } }) } function Zge(e) { return br(e) ? Zge(e.expression) : e } function O4e(e) { switch (e.kind) { case 269: let { importClause: t, moduleSpecifier: r } = e; return t && !t.name && t.namedBindings && t.namedBindings.kind === 271 && yo(r) ? t.namedBindings.name : void 0; case 268: return e.name; default: return } } function N4e(e, t, r) { P4e(e, t) && !i5.has(rye(e)) && r.push(hr(!e.name && wi(e.parent) && Re(e.parent.name) ? e.parent.name : e, _.This_may_be_converted_to_an_async_function)) } function P4e(e, t) { return !qA(e) && e.body && Va(e.body) && F4e(e.body, t) && QY(e, t) } function QY(e, t) { let r = t.getSignatureFromDeclaration(e), i = r ? t.getReturnTypeOfSignature(r) : void 0; return !!i && !!t.getPromisedTypeOfPromise(i) } function M4e(e) { return ar(e) ? e.left : e } function F4e(e, t) { return !!vT(e, r => r5(r, t)) } function r5(e, t) { return j_(e) && !!e.expression && ZY(e.expression, t) } function ZY(e, t) { if (!eye(e) || !tye(e) || !e.arguments.every(i => nye(i, t))) return !1; let r = e.expression.expression; for (; eye(r) || br(r);)if (Pa(r)) { if (!tye(r) || !r.arguments.every(i => nye(i, t))) return !1; r = r.expression.expression } else r = r.expression; return !0 } function eye(e) { return Pa(e) && (kN(e, "then") || kN(e, "catch") || kN(e, "finally")) } function tye(e) { let t = e.expression.name.text, r = t === "then" ? 2 : t === "catch" || t === "finally" ? 1 : 0; return e.arguments.length > r ? !1 : e.arguments.length < r ? !0 : r === 1 || vt(e.arguments, i => i.kind === 104 || Re(i) && i.text === "undefined") } function nye(e, t) { switch (e.kind) { case 259: case 215: if (pl(e) & 1) return !1; case 216: i5.set(rye(e), !0); case 104: return !0; case 79: case 208: { let i = t.getSymbolAtLocation(e); return i ? t.isUndefinedSymbol(i) || vt(wd(i, t).declarations, o => Ia(o) || Jy(o) && !!o.initializer && Ia(o.initializer)) : !1 } default: return !1 } } function rye(e) { return `${e.pos.toString()}:${e.end.toString()}` } function G4e(e, t) { var r, i, o, s; if (ms(e)) { if (wi(e.parent) && ((r = e.symbol.members) != null && r.size)) return !0; let l = t.getSymbolOfExpando(e, !1); return !!(l && ((i = l.exports) != null && i.size || (o = l.members) != null && o.size)) } return Jc(e) ? !!((s = e.symbol.members) != null && s.size) : !1 } function e$(e) { switch (e.kind) { case 259: case 171: case 215: case 216: return !0; default: return !1 } } var i5, B4e = gt({ "src/services/suggestionDiagnostics.ts"() { "use strict"; Fr(), i5 = new Map } }); function iye(e, t) { let r = [], i = t.compilerOptions ? t$(t.compilerOptions, r) : {}, o = d5(); for (let S in o) fs(o, S) && i[S] === void 0 && (i[S] = o[S]); for (let S of BJ) i.verbatimModuleSyntax && aye.has(S.name) || (i[S.name] = S.transpileOptionValue); i.suppressOutputPathCheck = !0, i.allowNonTsExtensions = !0; let s = db(i), l = { getSourceFile: S => S === So(f) ? d : void 0, writeFile: (S, x) => { Gc(S, ".map") ? (L.assertEqual(m, void 0, "Unexpected multiple source map outputs, file:", S), m = x) : (L.assertEqual(g, void 0, "Unexpected multiple outputs, file:", S), g = x) }, getDefaultLibFileName: () => "lib.d.ts", useCaseSensitiveFileNames: () => !1, getCanonicalFileName: S => S, getCurrentDirectory: () => "", getNewLine: () => s, fileExists: S => S === f, readFile: () => "", directoryExists: () => !0, getDirectories: () => [] }, f = t.fileName || (t.compilerOptions && t.compilerOptions.jsx ? "module.tsx" : "module.ts"), d = DO(f, e, { languageVersion: Do(i), impliedNodeFormat: NF(Ts(f, "", l.getCanonicalFileName), void 0, l, i), setExternalModuleIndicator: OR(i) }); t.moduleName && (d.moduleName = t.moduleName), t.renamedDependencies && (d.renamedDependencies = new Map(Object.entries(t.renamedDependencies))); let g, m, v = PF([f], i, l); return t.reportDiagnostics && (si(r, v.getSyntacticDiagnostics(d)), si(r, v.getOptionsDiagnostics())), v.emit(void 0, void 0, void 0, void 0, t.transformers), g === void 0 ? L.fail("Output generation failed") : { outputText: g, diagnostics: r, sourceMapText: m } } function U4e(e, t, r, i, o) { let s = iye(e, { compilerOptions: t, fileName: r, reportDiagnostics: !!i, moduleName: o }); return si(i, s.diagnostics), s.outputText } function t$(e, t) { n$ = n$ || Pr(Fh, r => typeof r.type == "object" && !Ld(r.type, i => typeof i != "number")), e = Mhe(e); for (let r of n$) { if (!fs(e, r.name)) continue; let i = e[r.name]; Ta(i) ? e[r.name] = O3(r, i, t) : Ld(r.type, o => o === i) || t.push(pJ(r)) } return e } var aye, n$, V4e = gt({ "src/services/transpile.ts"() { "use strict"; Fr(), aye = new Set(["isolatedModules", "preserveValueImports", "importsNotUsedAsValues"]) } }); function oye(e, t, r, i, o, s) { let l = Fge(i); if (!l) return Je; let f = []; for (let d of e) r.throwIfCancellationRequested(), !(s && d.isDeclarationFile) && d.getNamedDeclarations().forEach((g, m) => { j4e(l, m, g, t, d.fileName, f) }); return f.sort(J4e), (o === void 0 ? f : f.slice(0, o)).map(K4e) } function j4e(e, t, r, i, o, s) { let l = e.getMatchForLastSegmentOfPattern(t); if (l) { for (let f of r) if (H4e(f, i)) if (e.patternContainsDots) { let d = e.getFullMatch(z4e(f), t); d && s.push({ name: t, fileName: o, matchKind: d.kind, isCaseSensitive: d.isCaseSensitive, declaration: f }) } else s.push({ name: t, fileName: o, matchKind: l.kind, isCaseSensitive: l.isCaseSensitive, declaration: f }) } } function H4e(e, t) { switch (e.kind) { case 270: case 273: case 268: let r = t.getSymbolAtLocation(e.name), i = t.getAliasedSymbol(r); return r.escapedName !== i.escapedName; default: return !0 } } function W4e(e, t) { let r = sa(e); return !!r && (sye(r, t) || r.kind === 164 && r$(r.expression, t)) } function r$(e, t) { return sye(e, t) || br(e) && (t.push(e.name.text), !0) && r$(e.expression, t) } function sye(e, t) { return c_(e) && (t.push(l_(e)), !0) } function z4e(e) { let t = [], r = sa(e); if (r && r.kind === 164 && !r$(r.expression, t)) return Je; t.shift(); let i = e1(e); for (; i;) { if (!W4e(i, t)) return Je; i = e1(i) } return t.reverse() } function J4e(e, t) { return Es(e.matchKind, t.matchKind) || XD(e.name, t.name) } function K4e(e) { let t = e.declaration, r = e1(t), i = r && sa(r); return { name: e.name, kind: aE(t), kindModifiers: rk(t), matchKind: n5[e.matchKind], isCaseSensitive: e.isCaseSensitive, fileName: e.fileName, textSpan: Du(t), containerName: i ? i.text : "", containerKind: i ? aE(r) : "" } } var q4e = gt({ "src/services/navigateTo.ts"() { "use strict"; Fr() } }), cye = {}; Mo(cye, { getNavigateToItems: () => oye }); var lye = gt({ "src/services/_namespaces/ts.NavigateTo.ts"() { "use strict"; q4e() } }); function uye(e, t) { c5 = t, fk = e; try { return on(Z4e(pye(e)), e3e) } finally { fye() } } function dye(e, t) { c5 = t, fk = e; try { return Sye(pye(e)) } finally { fye() } } function fye() { fk = void 0, c5 = void 0, _k = [], Uh = void 0, l5 = [] } function QN(e) { return X2(e.getText(fk)) } function a5(e) { return e.node.kind } function _ye(e, t) { e.children ? e.children.push(t) : e.children = [t] } function pye(e) { L.assert(!_k.length); let t = { node: e, name: void 0, additionalNodes: void 0, parent: void 0, children: void 0, indent: 0 }; Uh = t; for (let r of e.statements) a1(r); return dv(), L.assert(!Uh && !_k.length), t } function Eb(e, t) { _ye(Uh, i$(e, t)) } function i$(e, t) { return { node: e, name: t || (Kl(e) || ot(e) ? sa(e) : void 0), additionalNodes: void 0, parent: Uh, children: void 0, indent: Uh.indent + 1 } } function mye(e) { tx || (tx = new Map), tx.set(e, !0) } function hye(e) { for (let t = 0; t < e; t++)dv() } function gye(e, t) { let r = []; for (; !c_(t);) { let i = eR(t), o = wh(t); t = t.expression, !(o === "prototype" || pi(i)) && r.push(i) } r.push(t); for (let i = r.length - 1; i > 0; i--) { let o = r[i]; Tb(e, o) } return [r.length - 1, r[0]] } function Tb(e, t) { let r = i$(e, t); _ye(Uh, r), _k.push(Uh), f$.push(tx), tx = void 0, Uh = r } function dv() { Uh.children && (o5(Uh.children, Uh), s$(Uh.children)), Uh = _k.pop(), tx = f$.pop() } function fv(e, t, r) { Tb(e, r), a1(t), dv() } function yye(e) { e.initializer && n3e(e.initializer) ? (Tb(e), pa(e.initializer, a1), dv()) : fv(e, e.initializer) } function a$(e) { return !Xy(e) || e.kind !== 223 && br(e.name.expression) && Re(e.name.expression.expression) && vr(e.name.expression.expression) === "Symbol" } function a1(e) { if (c5.throwIfCancellationRequested(), !(!e || Z1(e))) switch (e.kind) { case 173: let t = e; fv(t, t.body); for (let l of t.parameters) Ad(l, t) && Eb(l); break; case 171: case 174: case 175: case 170: a$(e) && fv(e, e.body); break; case 169: a$(e) && yye(e); break; case 168: a$(e) && Eb(e); break; case 270: let r = e; r.name && Eb(r.name); let { namedBindings: i } = r; if (i) if (i.kind === 271) Eb(i); else for (let l of i.elements) Eb(l); break; case 300: fv(e, e.name); break; case 301: let { expression: o } = e; Re(o) ? Eb(e, o) : Eb(e); break; case 205: case 299: case 257: { let l = e; La(l.name) ? a1(l.name) : yye(l); break } case 259: let s = e.name; s && Re(s) && mye(s.text), fv(e, e.body); break; case 216: case 215: fv(e, e.body); break; case 263: Tb(e); for (let l of e.members) t3e(l) || Eb(l); dv(); break; case 260: case 228: case 261: Tb(e); for (let l of e.members) a1(l); dv(); break; case 264: fv(e, Aye(e).body); break; case 274: { let l = e.expression, f = rs(l) || Pa(l) ? l : xs(l) || ms(l) ? l.body : void 0; f ? (Tb(e), a1(f), dv()) : Eb(e); break } case 278: case 268: case 178: case 176: case 177: case 262: Eb(e); break; case 210: case 223: { let l = ic(e); switch (l) { case 1: case 2: fv(e, e.right); return; case 6: case 3: { let f = e, d = f.left, g = l === 3 ? d.expression : d, m = 0, v; Re(g.expression) ? (mye(g.expression.text), v = g.expression) : [m, v] = gye(f, g.expression), l === 6 ? rs(f.right) && f.right.properties.length > 0 && (Tb(f, v), pa(f.right, a1), dv()) : ms(f.right) || xs(f.right) ? fv(e, f.right, v) : (Tb(f, v), fv(e, f.right, d.name), dv()), hye(m); return } case 7: case 9: { let f = e, d = l === 7 ? f.arguments[0] : f.arguments[0].expression, g = f.arguments[1], [m, v] = gye(e, d); Tb(e, v), Tb(e, it(D.createIdentifier(g.text), g)), a1(e.arguments[2]), dv(), dv(), hye(m); return } case 5: { let f = e, d = f.left, g = d.expression; if (Re(g) && wh(d) !== "prototype" && tx && tx.has(g.text)) { ms(f.right) || xs(f.right) ? fv(e, f.right, g) : ST(d) && (Tb(f, g), fv(f.left, f.right, eR(d)), dv()); return } break } case 4: case 0: case 8: break; default: L.assertNever(l) } } default: Kd(e) && mn(e.jsDoc, l => { mn(l.tags, f => { Ff(f) && Eb(f) }) }), pa(e, a1) } } function o5(e, t) { let r = new Map; wU(e, (i, o) => { let s = i.name || sa(i.node), l = s && QN(s); if (!l) return !0; let f = r.get(l); if (!f) return r.set(l, i), !0; if (f instanceof Array) { for (let d of f) if (vye(d, i, o, t)) return !1; return f.push(i), !0 } else { let d = f; return vye(d, i, o, t) ? !1 : (r.set(l, [d, i]), !0) } }) } function X4e(e, t, r, i) { function o(f) { return ms(f) || Jc(f) || wi(f) } let s = ar(t.node) || Pa(t.node) ? ic(t.node) : 0, l = ar(e.node) || Pa(e.node) ? ic(e.node) : 0; if (Y2[s] && Y2[l] || o(e.node) && Y2[s] || o(t.node) && Y2[l] || sl(e.node) && o$(e.node) && Y2[s] || sl(t.node) && Y2[l] || sl(e.node) && o$(e.node) && o(t.node) || sl(t.node) && o(e.node) && o$(e.node)) { let f = e.additionalNodes && Os(e.additionalNodes) || e.node; if (!sl(e.node) && !sl(t.node) || o(e.node) || o(t.node)) { let g = o(e.node) ? e.node : o(t.node) ? t.node : void 0; if (g !== void 0) { let m = it(D.createConstructorDeclaration(void 0, [], void 0), g), v = i$(m); v.indent = e.indent + 1, v.children = e.node === g ? e.children : t.children, e.children = e.node === g ? Qi([v], t.children || [t]) : Qi(e.children || [{ ...e }], [v]) } else (e.children || t.children) && (e.children = Qi(e.children || [{ ...e }], t.children || [t]), e.children && (o5(e.children, e), s$(e.children))); f = e.node = it(D.createClassDeclaration(void 0, e.name || D.createIdentifier("__class__"), void 0, void 0, []), e.node) } else e.children = Qi(e.children, t.children), e.children && o5(e.children, e); let d = t.node; return i.children[r - 1].node.end === f.end ? it(f, { pos: f.pos, end: d.end }) : (e.additionalNodes || (e.additionalNodes = []), e.additionalNodes.push(it(D.createClassDeclaration(void 0, e.name || D.createIdentifier("__class__"), void 0, void 0, []), t.node))), !0 } return s !== 0 } function vye(e, t, r, i) { return X4e(e, t, r, i) ? !0 : Y4e(e.node, t.node, i) ? ($4e(e, t), !0) : !1 } function Y4e(e, t, r) { if (e.kind !== t.kind || e.parent !== t.parent && !(bye(e, r) && bye(t, r))) return !1; switch (e.kind) { case 169: case 171: case 174: case 175: return Ca(e) === Ca(t); case 264: return Eye(e, t) && u$(e) === u$(t); default: return !0 } } function o$(e) { return !!(e.flags & 8) } function bye(e, t) { let r = Tp(e.parent) ? e.parent.parent : e.parent; return r === t.node || ya(t.additionalNodes, r) } function Eye(e, t) { return !e.body || !t.body ? e.body === t.body : e.body.kind === t.body.kind && (e.body.kind !== 264 || Eye(e.body, t.body)) } function $4e(e, t) { e.additionalNodes = e.additionalNodes || [], e.additionalNodes.push(t.node), t.additionalNodes && e.additionalNodes.push(...t.additionalNodes), e.children = Qi(e.children, t.children), e.children && (o5(e.children, e), s$(e.children)) } function s$(e) { e.sort(Q4e) } function Q4e(e, t) { return XD(Tye(e.node), Tye(t.node)) || Es(a5(e), a5(t)) } function Tye(e) { if (e.kind === 264) return xye(e); let t = sa(e); if (t && Ys(t)) { let r = M0(t); return r && Gi(r) } switch (e.kind) { case 215: case 216: case 228: return Iye(e); default: return } } function c$(e, t) { if (e.kind === 264) return X2(xye(e)); if (t) { let r = Re(t) ? t.text : Vs(t) ? `[${QN(t.argumentExpression)}]` : QN(t); if (r.length > 0) return X2(r) } switch (e.kind) { case 308: let r = e; return Lc(r) ? `"${_S(Hl(ld(So(r.fileName))))}"` : "<global>"; case 274: return pc(e) && e.isExportEquals ? "export=" : "default"; case 216: case 259: case 215: case 260: case 228: return Yy(e) & 1024 ? "default" : Iye(e); case 173: return "constructor"; case 177: return "new()"; case 176: return "()"; case 178: return "[]"; default: return "<unknown>" } } function Z4e(e) { let t = []; function r(o) { if (i(o) && (t.push(o), o.children)) for (let s of o.children) r(s) } return r(e), t; function i(o) { if (o.children) return !0; switch (a5(o)) { case 260: case 228: case 263: case 261: case 264: case 308: case 262: case 349: case 341: return !0; case 216: case 259: case 215: return s(o); default: return !1 }function s(l) { if (!l.node.body) return !1; switch (a5(l.parent)) { case 265: case 308: case 171: case 173: return !0; default: return !1 } } } } function Sye(e) { return { text: c$(e.node, e.name), kind: aE(e.node), kindModifiers: Cye(e.node), spans: l$(e), nameSpan: e.name && d$(e.name), childItems: on(e.children, Sye) } } function e3e(e) { return { text: c$(e.node, e.name), kind: aE(e.node), kindModifiers: Cye(e.node), spans: l$(e), childItems: on(e.children, t) || l5, indent: e.indent, bolded: !1, grayed: !1 }; function t(r) { return { text: c$(r.node, r.name), kind: aE(r.node), kindModifiers: rk(r.node), spans: l$(r), childItems: l5, indent: 0, bolded: !1, grayed: !1 } } } function l$(e) { let t = [d$(e.node)]; if (e.additionalNodes) for (let r of e.additionalNodes) t.push(d$(r)); return t } function xye(e) { return lu(e) ? Qc(e.name) : u$(e) } function u$(e) { let t = [l_(e.name)]; for (; e.body && e.body.kind === 264;)e = e.body, t.push(l_(e.name)); return t.join(".") } function Aye(e) { return e.body && Tc(e.body) ? Aye(e.body) : e } function t3e(e) { return !e.name || e.name.kind === 164 } function d$(e) { return e.kind === 308 ? lv(e) : Du(e, fk) } function Cye(e) { return e.parent && e.parent.kind === 257 && (e = e.parent), rk(e) } function Iye(e) { let { parent: t } = e; if (e.name && Fw(e.name) > 0) return X2(os(e.name)); if (wi(t)) return X2(os(t.name)); if (ar(t) && t.operatorToken.kind === 63) return QN(t.left).replace(kye, ""); if (yl(t)) return QN(t.name); if (Yy(e) & 1024) return "default"; if (Yr(e)) return "<class>"; if (Pa(t)) { let r = Lye(t.expression); if (r !== void 0) { if (r = X2(r), r.length > s5) return `${r} callback`; let i = X2(Zi(t.arguments, o => es(o) ? o.getText(fk) : void 0).join(", ")); return `${r}(${i}) callback` } } return "<function>" } function Lye(e) { if (Re(e)) return e.text; if (br(e)) { let t = Lye(e.expression), r = e.name.text; return t === void 0 ? r : `${t}.${r}` } else return } function n3e(e) { switch (e.kind) { case 216: case 215: case 228: return !0; default: return !1 } } function X2(e) { return e = e.length > s5 ? e.substring(0, s5) + "..." : e, e.replace(/\\?(\r?\n|\r|\u2028|\u2029)/g, "") } var kye, s5, c5, fk, _k, Uh, f$, tx, l5, Y2, r3e = gt({ "src/services/navigationBar.ts"() { "use strict"; Fr(), kye = /\s+/g, s5 = 150, _k = [], f$ = [], l5 = [], Y2 = { 5: !0, 3: !0, 7: !0, 9: !0, 0: !1, 1: !1, 2: !1, 8: !1, 6: !0, 4: !1 } } }), Dye = {}; Mo(Dye, { getNavigationBarItems: () => uye, getNavigationTree: () => dye }); var wye = gt({ "src/services/_namespaces/ts.NavigationBar.ts"() { "use strict"; r3e() } }); function Rye(e, t, r, i) { let o = Iw(e) ? new p5(e, t, r) : e === 79 ? new h5(79, t, r) : e === 80 ? new g5(80, t, r) : new h$(e, t, r); return o.parent = i, o.flags = i.flags & 50720768, o } function i3e(e, t) { if (!Iw(e.kind)) return Je; let r = []; if (qj(e)) return e.forEachChild(l => { r.push(l) }), r; $l.setText((t || e.getSourceFile()).text); let i = e.pos, o = l => { ZN(r, i, l.pos, e), r.push(l), i = l.end }, s = l => { ZN(r, i, l.pos, e), r.push(a3e(l, e)), i = l.end }; return mn(e.jsDoc, o), i = e.pos, e.forEachChild(o, s), ZN(r, i, e.end, e), $l.setText(void 0), r } function ZN(e, t, r, i) { for ($l.setTextPos(t); t < r;) { let o = $l.scan(), s = $l.getTextPos(); if (s <= r) { if (o === 79) { if (jle(i)) continue; L.fail(`Did not expect ${L.formatSyntaxKind(i.kind)} to have an Identifier in its trivia`) } e.push(Rye(o, t, s, i)) } if (t = s, o === 1) break } } function a3e(e, t) { let r = Rye(354, e.pos, e.end, t); r._children = []; let i = e.pos; for (let o of e) ZN(r._children, i, o.pos, t), r._children.push(o), i = o.end; return ZN(r._children, i, e.end, t), r } function Oye(e) { return A0(e).some(t => t.tagName.text === "inheritDoc" || t.tagName.text === "inheritdoc") } function u5(e, t) { if (!e) return Je; let r = xb.getJsDocTagsFromDeclarations(e, t); if (t && (r.length === 0 || e.some(Oye))) { let i = new Set; for (let o of e) { let s = Nye(t, o, l => { var f; if (!i.has(l)) return i.add(l), o.kind === 174 || o.kind === 175 ? l.getContextualJsDocTags(o, t) : ((f = l.declarations) == null ? void 0 : f.length) === 1 ? l.getJsDocTags() : void 0 }); s && (r = [...s, ...r]) } } return r } function eP(e, t) { if (!e) return Je; let r = xb.getJsDocCommentsFromDeclarations(e, t); if (t && (r.length === 0 || e.some(Oye))) { let i = new Set; for (let o of e) { let s = Nye(t, o, l => { if (!i.has(l)) return i.add(l), o.kind === 174 || o.kind === 175 ? l.getContextualDocumentationComment(o, t) : l.getDocumentationComment(t) }); s && (r = r.length === 0 ? s.slice() : s.concat(K2(), r)) } } return r } function Nye(e, t, r) { var i; let o = ((i = t.parent) == null ? void 0 : i.kind) === 173 ? t.parent.parent : t.parent; if (!o) return; let s = zc(t); return ks(NI(o), l => { let f = e.getTypeAtLocation(l), d = s && f.symbol ? e.getTypeOfSymbol(f.symbol) : f, g = e.getPropertyOfType(d, t.symbol.name); return g ? r(g) : void 0 }) } function o3e() { return { getNodeConstructor: () => p5, getTokenConstructor: () => h$, getIdentifierConstructor: () => h5, getPrivateIdentifierConstructor: () => g5, getSourceFileConstructor: () => Hye, getSymbolConstructor: () => Uye, getTypeConstructor: () => Vye, getSignatureConstructor: () => jye, getSourceMapSourceConstructor: () => Wye } } function tP(e) { let t = !0; for (let i in e) if (fs(e, i) && !Pye(i)) { t = !1; break } if (t) return e; let r = {}; for (let i in e) if (fs(e, i)) { let o = Pye(i) ? i : i.charAt(0).toLowerCase() + i.substr(1); r[o] = e[i] } return r } function Pye(e) { return !e.length || e.charAt(0) === e.charAt(0).toLowerCase() } function Mye(e) { return e ? on(e, t => t.text).join("") : "" } function d5() { return { target: 1, jsx: 1 } } function Fye() { return gu.getSupportedErrorCodes() } function Gye(e, t, r) { e.version = r, e.scriptSnapshot = t } function f5(e, t, r, i, o, s) { let l = DO(e, E7(t), r, o, s); return Gye(l, t, i), l } function _$(e, t, r, i, o) { if (i && r !== e.version) { let l, f = i.span.start !== 0 ? e.text.substr(0, i.span.start) : "", d = wl(i.span) !== e.text.length ? e.text.substr(wl(i.span)) : ""; if (i.newLength === 0) l = f && d ? f + d : f || d; else { let m = t.getText(i.span.start, i.span.start + i.newLength); l = f && d ? f + m + d : f ? f + m : m + d } let g = uJ(e, l, i, o); return Gye(g, t, r), g.nameTable = void 0, e !== g && e.scriptSnapshot && (e.scriptSnapshot.dispose && e.scriptSnapshot.dispose(), e.scriptSnapshot = void 0), g } let s = { languageVersion: e.languageVersion, impliedNodeFormat: e.impliedNodeFormat, setExternalModuleIndicator: e.setExternalModuleIndicator }; return f5(e.fileName, t, s, r, !0, e.scriptKind) } function Bye(e, t = VY(e.useCaseSensitiveFileNames && e.useCaseSensitiveFileNames(), e.getCurrentDirectory()), r) {
+                var i; let o; r === void 0 ? o = 0 : typeof r == "boolean" ? o = r ? 2 : 0 : o = r; let s = new zye(e), l, f, d = 0, g = e.getCancellationToken ? new Kye(e.getCancellationToken()) : Jye, m = e.getCurrentDirectory(); mle((i = e.getLocalizedDiagnosticMessages) == null ? void 0 : i.bind(e)); function v(Ke) { e.log && e.log(Ke) } let S = xR(e), x = Dl(S), A = Xge({ useCaseSensitiveFileNames: () => S, getCurrentDirectory: () => m, getProgram: P, fileExists: ho(e, e.fileExists), readFile: ho(e, e.readFile), getDocumentPositionMapper: ho(e, e.getDocumentPositionMapper), getSourceFileLike: ho(e, e.getSourceFileLike), log: v }); function w(Ke) { let oe = l.getSourceFile(Ke); if (!oe) { let pe = new Error(`Could not find source file: '${Ke}'.`); throw pe.ProgramFiles = l.getSourceFiles().map(z => z.fileName), pe } return oe } function C() { var Ke, oe, pe; if (L.assert(o !== 2), e.getProjectVersion) { let Qr = e.getProjectVersion(); if (Qr) { if (f === Qr && !((Ke = e.hasChangedAutomaticTypeDirectiveNames) != null && Ke.call(e))) return; f = Qr } } let z = e.getTypeRootsVersion ? e.getTypeRootsVersion() : 0; d !== z && (v("TypeRoots version has changed; provide new program"), l = void 0, d = z); let Te = e.getScriptFileNames().slice(), j = e.getCompilationSettings() || d5(), yt = e.hasInvalidatedResolutions || m0, lt = ho(e, e.hasChangedAutomaticTypeDirectiveNames), Qe = (oe = e.getProjectReferences) == null ? void 0 : oe.call(e), Vt, Hn = { getSourceFile: Nr, getSourceFileByPath: Fo, getCancellationToken: () => g, getCanonicalFileName: x, useCaseSensitiveFileNames: () => S, getNewLine: () => db(j), getDefaultLibFileName: Qr => e.getDefaultLibFileName(Qr), writeFile: Ba, getCurrentDirectory: () => m, fileExists: Qr => e.fileExists(Qr), readFile: Qr => e.readFile && e.readFile(Qr), getSymlinkCache: ho(e, e.getSymlinkCache), realpath: ho(e, e.realpath), directoryExists: Qr => gp(Qr, e), getDirectories: Qr => e.getDirectories ? e.getDirectories(Qr) : [], readDirectory: (Qr, Wi, gn, Ki, kc) => (L.checkDefined(e.readDirectory, "'LanguageServiceHost.readDirectory' must be implemented to correctly process 'projectReferences'"), e.readDirectory(Qr, Wi, gn, Ki, kc)), onReleaseOldSourceFile: xi, onReleaseParsedCommandLine: Hi, hasInvalidatedResolutions: yt, hasChangedAutomaticTypeDirectiveNames: lt, trace: ho(e, e.trace), resolveModuleNames: ho(e, e.resolveModuleNames), getModuleResolutionCache: ho(e, e.getModuleResolutionCache), createHash: ho(e, e.createHash), resolveTypeReferenceDirectives: ho(e, e.resolveTypeReferenceDirectives), resolveModuleNameLiterals: ho(e, e.resolveModuleNameLiterals), resolveTypeReferenceDirectiveReferences: ho(e, e.resolveTypeReferenceDirectiveReferences), useSourceOfProjectReferenceRedirect: ho(e, e.useSourceOfProjectReferenceRedirect), getParsedCommandLine: Za }, jr = Hn.getSourceFile, { getSourceFileWithCache: ei } = pN(Hn, Qr => Ts(Qr, m, x), (...Qr) => jr.call(Hn, ...Qr)); Hn.getSourceFile = ei, (pe = e.setCompilerHost) == null || pe.call(e, Hn); let Kr = { useCaseSensitiveFileNames: S, fileExists: Qr => Hn.fileExists(Qr), readFile: Qr => Hn.readFile(Qr), readDirectory: (...Qr) => Hn.readDirectory(...Qr), trace: Hn.trace, getCurrentDirectory: Hn.getCurrentDirectory, onUnRecoverableConfigFileDiagnostic: Ba }, Si = t.getKeyForCompilationSettings(j); if (lq(l, Te, j, (Qr, Wi) => e.getScriptVersion(Wi), Qr => Hn.fileExists(Qr), yt, lt, Za, Qe)) return; l = PF({ rootNames: Te, options: j, host: Hn, oldProgram: l, projectReferences: Qe }), Hn = void 0, Vt = void 0, A.clearCache(), l.getTypeChecker(); return; function Za(Qr) { let Wi = Ts(Qr, m, x), gn = Vt?.get(Wi); if (gn !== void 0) return gn || void 0; let Ki = e.getParsedCommandLine ? e.getParsedCommandLine(Qr) : Fa(Qr); return (Vt || (Vt = new Map)).set(Wi, Ki || !1), Ki } function Fa(Qr) { let Wi = Nr(Qr, 100); if (Wi) return Wi.path = Ts(Qr, m, x), Wi.resolvedPath = Wi.path, Wi.originalFileName = Wi.fileName, MO(Wi, Kr, _a(ni(Qr), m), void 0, _a(Qr, m)) } function Hi(Qr, Wi, gn) { var Ki; e.getParsedCommandLine ? (Ki = e.onReleaseParsedCommandLine) == null || Ki.call(e, Qr, Wi, gn) : Wi && xi(Wi.sourceFile, gn) } function xi(Qr, Wi) { let gn = t.getKeyForCompilationSettings(Wi); t.releaseDocumentWithKey(Qr.resolvedPath, gn, Qr.scriptKind, Qr.impliedNodeFormat) } function Nr(Qr, Wi, gn, Ki) { return Fo(Qr, Ts(Qr, m, x), Wi, gn, Ki) } function Fo(Qr, Wi, gn, Ki, kc) { L.assert(Hn, "getOrCreateSourceFileByPath called after typical CompilerHost lifetime, check the callstack something with a reference to an old host."); let Ps = e.getScriptSnapshot(Qr); if (!Ps) return; let mc = mY(Qr, e), xc = e.getScriptVersion(Qr); if (!kc) { let hc = l && l.getSourceFileByPath(Wi); if (hc) { if (mc === hc.scriptKind) return t.updateDocumentWithKey(Qr, Wi, e, Si, Ps, xc, mc, gn); t.releaseDocumentWithKey(hc.resolvedPath, t.getKeyForCompilationSettings(l.getCompilerOptions()), hc.scriptKind, hc.impliedNodeFormat) } } return t.acquireDocumentWithKey(Qr, Wi, e, Si, Ps, xc, mc, gn) } } function P() { if (o === 2) { L.assert(l === void 0); return } return C(), l } function F() { var Ke; return (Ke = e.getPackageJsonAutoImportProvider) == null ? void 0 : Ke.call(e) } function B(Ke, oe) { let pe = l.getTypeChecker(), z = Te(); if (!z) return !1; for (let yt of Ke) for (let lt of yt.references) { let Qe = j(lt); if (L.assertIsDefined(Qe), oe.has(lt) || js.isDeclarationOfSymbol(Qe, z)) { oe.add(lt), lt.isDefinition = !0; let Vt = uY(lt, A, ho(e, e.fileExists)); Vt && oe.add(Vt) } else lt.isDefinition = !1 } return !0; function Te() { for (let yt of Ke) for (let lt of yt.references) { if (oe.has(lt)) { let Vt = j(lt); return L.assertIsDefined(Vt), pe.getSymbolAtLocation(Vt) } let Qe = uY(lt, A, ho(e, e.fileExists)); if (Qe && oe.has(Qe)) { let Vt = j(Qe); if (Vt) return pe.getSymbolAtLocation(Vt) } } } function j(yt) { let lt = l.getSourceFile(yt.fileName); if (!lt) return; let Qe = ef(lt, yt.textSpan.start); return js.Core.getAdjustedNode(Qe, { use: js.FindReferencesUse.References }) } } function q() { l = void 0 } function W() { if (l) { let Ke = t.getKeyForCompilationSettings(l.getCompilerOptions()); mn(l.getSourceFiles(), oe => t.releaseDocumentWithKey(oe.resolvedPath, Ke, oe.scriptKind, oe.impliedNodeFormat)), l = void 0 } e = void 0 } function Y(Ke) { return C(), l.getSyntacticDiagnostics(w(Ke), g).slice() } function R(Ke) { C(); let oe = w(Ke), pe = l.getSemanticDiagnostics(oe, g); if (!__(l.getCompilerOptions())) return pe.slice(); let z = l.getDeclarationDiagnostics(oe, g); return [...pe, ...z] } function ie(Ke) { return C(), $Y(w(Ke), l, g) } function $() { return C(), [...l.getOptionsDiagnostics(g), ...l.getGlobalDiagnostics(g)] } function fe(Ke, oe, pe = Cp, z) { let Te = { ...pe, includeCompletionsForModuleExports: pe.includeCompletionsForModuleExports || pe.includeExternalModuleExports, includeCompletionsWithInsertText: pe.includeCompletionsWithInsertText || pe.includeInsertTextCompletions }; return C(), lx.getCompletionsAtPosition(e, l, v, w(Ke), oe, Te, pe.triggerCharacter, pe.triggerKind, g, z && tl.getFormatContext(z, e), pe.includeSymbol) } function Z(Ke, oe, pe, z, Te, j = Cp, yt) { return C(), lx.getCompletionEntryDetails(l, v, w(Ke), oe, { name: pe, source: Te, data: yt }, e, z && tl.getFormatContext(z, e), j, g) } function U(Ke, oe, pe, z, Te = Cp) { return C(), lx.getCompletionEntrySymbol(l, v, w(Ke), oe, { name: pe, source: z }, e, Te) } function re(Ke, oe) { C(); let pe = w(Ke), z = ef(pe, oe); if (z === pe) return; let Te = l.getTypeChecker(), j = le(z), yt = u3e(j, Te); if (!yt || Te.isUnknownSymbol(yt)) { let jr = _e(pe, j, oe) ? Te.getTypeAtLocation(j) : void 0; return jr && { kind: "", kindModifiers: "", textSpan: Du(j, pe), displayParts: Te.runWithCancellationToken(g, ei => zN(ei, jr, e1(j))), documentation: jr.symbol ? jr.symbol.getDocumentationComment(Te) : void 0, tags: jr.symbol ? jr.symbol.getJsDocTags(Te) : void 0 } } let { symbolKind: lt, displayParts: Qe, documentation: Vt, tags: Hn } = Te.runWithCancellationToken(g, jr => $g.getSymbolDisplayPartsDocumentationAndSymbolKind(jr, yt, pe, e1(j), j)); return { kind: lt, kindModifiers: $g.getSymbolModifiers(Te, yt), textSpan: Du(j, pe), displayParts: Qe, documentation: Vt, tags: Hn } } function le(Ke) { return z0(Ke.parent) && Ke.pos === Ke.parent.pos ? Ke.parent.expression : bL(Ke.parent) && Ke.pos === Ke.parent.pos || NA(Ke.parent) && Ke.parent.name === Ke ? Ke.parent : Ke } function _e(Ke, oe, pe) { switch (oe.kind) { case 79: return !FX(oe) && !GX(oe) && !Ch(oe.parent); case 208: case 163: return !Kg(Ke, pe); case 108: case 194: case 106: case 199: return !0; case 233: return NA(oe); default: return !1 } } function ge(Ke, oe, pe, z) { return C(), xk.getDefinitionAtPosition(l, w(Ke), oe, pe, z) } function X(Ke, oe) { return C(), xk.getDefinitionAndBoundSpan(l, w(Ke), oe) } function Ve(Ke, oe) { return C(), xk.getTypeDefinitionAtPosition(l.getTypeChecker(), w(Ke), oe) } function we(Ke, oe) { return C(), js.getImplementationsAtPosition(l, g, l.getSourceFiles(), w(Ke), oe) } function ke(Ke, oe) { return Uo(Pe(Ke, oe, [Ke]), pe => pe.highlightSpans.map(z => ({ fileName: pe.fileName, textSpan: z.textSpan, isWriteAccess: z.kind === "writtenReference", ...z.isInString && { isInString: !0 }, ...z.contextSpan && { contextSpan: z.contextSpan } }))) } function Pe(Ke, oe, pe) { let z = So(Ke); L.assert(pe.some(yt => So(yt) === z)), C(); let Te = Zi(pe, yt => l.getSourceFile(yt)), j = w(Ke); return Q7.getDocumentHighlights(l, g, j, oe, Te) } function Ce(Ke, oe, pe, z, Te) { C(); let j = w(Ke), yt = _7(ef(j, oe)); if (RG.nodeIsEligibleForRename(yt)) if (Re(yt) && (Xm(yt.parent) || GS(yt.parent)) && GI(yt.escapedText)) { let { openingElement: lt, closingElement: Qe } = yt.parent.parent; return [lt, Qe].map(Vt => { let Hn = Du(Vt.tagName, j); return { fileName: j.fileName, textSpan: Hn, ...js.toContextSpan(Hn, j, Vt.parent) } }) } else return Be(yt, oe, { findInStrings: pe, findInComments: z, providePrefixAndSuffixTextForRename: Te, use: js.FindReferencesUse.Rename }, (lt, Qe, Vt) => js.toRenameLocation(lt, Qe, Vt, Te || !1)) } function Ie(Ke, oe) { return C(), Be(ef(w(Ke), oe), oe, { use: js.FindReferencesUse.References }, js.toReferenceEntry) } function Be(Ke, oe, pe, z) { C(); let Te = pe && pe.use === js.FindReferencesUse.Rename ? l.getSourceFiles().filter(j => !l.isSourceFileDefaultLibrary(j)) : l.getSourceFiles(); return js.findReferenceOrRenameEntries(l, g, Te, Ke, oe, pe, z) } function Ne(Ke, oe) { return C(), js.findReferencedSymbols(l, g, l.getSourceFiles(), w(Ke), oe) } function Le(Ke) { return C(), js.Core.getReferencesForFileName(Ke, l, l.getSourceFiles()).map(js.toReferenceEntry) } function Ye(Ke, oe, pe, z = !1) { C(); let Te = pe ? [w(pe)] : l.getSourceFiles(); return oye(Te, l.getTypeChecker(), g, Ke, oe, z) } function _t(Ke, oe, pe) { C(); let z = w(Ke), Te = e.getCustomTransformers && e.getCustomTransformers(); return Ype(l, z, !!oe, g, Te, pe) } function ct(Ke, oe, { triggerReason: pe } = Cp) { C(); let z = w(Ke); return BP.getSignatureHelpItems(l, z, oe, pe, g) } function Rt(Ke) { return s.getCurrentSourceFile(Ke) } function We(Ke, oe, pe) { let z = s.getCurrentSourceFile(Ke), Te = ef(z, oe); if (Te === z) return; switch (Te.kind) { case 208: case 163: case 10: case 95: case 110: case 104: case 106: case 108: case 194: case 79: break; default: return }let j = Te; for (; ;)if (j2(j) || yhe(j)) j = j.parent; else if (UX(j)) if (j.parent.parent.kind === 264 && j.parent.parent.body === j.parent) j = j.parent.parent.name; else break; else break; return Wc(j.getStart(), Te.getEnd()) } function qe(Ke, oe) { let pe = s.getCurrentSourceFile(Ke); return x$.spanInSourceFileAtLocation(pe, oe) } function zt(Ke) { return uye(s.getCurrentSourceFile(Ke), g) } function Qt(Ke) { return dye(s.getCurrentSourceFile(Ke), g) } function tn(Ke, oe, pe) { return C(), (pe || "original") === "2020" ? T5.v2020.getSemanticClassifications(l, g, w(Ke), oe) : Cge(l.getTypeChecker(), g, w(Ke), l.getClassifiableNames(), oe) } function kn(Ke, oe, pe) { return C(), (pe || "original") === "original" ? BY(l.getTypeChecker(), g, w(Ke), l.getClassifiableNames(), oe) : T5.v2020.getEncodedSemanticClassifications(l, g, w(Ke), oe) } function _n(Ke, oe) { return Dge(g, s.getCurrentSourceFile(Ke), oe) } function Gt(Ke, oe) { return UY(g, s.getCurrentSourceFile(Ke), oe) } function $n(Ke) { let oe = s.getCurrentSourceFile(Ke); return See.collectElements(oe, g) } let ui = new Map(Object.entries({ 18: 19, 20: 21, 22: 23, 31: 29 })); ui.forEach((Ke, oe) => ui.set(Ke.toString(), Number(oe))); function Ni(Ke, oe) { let pe = s.getCurrentSourceFile(Ke), z = nk(pe, oe), Te = z.getStart(pe) === oe ? ui.get(z.kind.toString()) : void 0, j = Te && Yo(z.parent, Te, pe); return j ? [Du(z, pe), Du(j, pe)].sort((yt, lt) => yt.start - lt.start) : Je } function Pi(Ke, oe, pe) { let z = Ms(), Te = tP(pe), j = s.getCurrentSourceFile(Ke); v("getIndentationAtPosition: getCurrentSourceFile: " + (Ms() - z)), z = Ms(); let yt = tl.SmartIndenter.getIndentation(oe, j, Te); return v("getIndentationAtPosition: computeIndentation  : " + (Ms() - z)), yt } function gr(Ke, oe, pe, z) { let Te = s.getCurrentSourceFile(Ke); return tl.formatSelection(oe, pe, Te, tl.getFormatContext(tP(z), e)) } function pt(Ke, oe) { return tl.formatDocument(s.getCurrentSourceFile(Ke), tl.getFormatContext(tP(oe), e)) } function nn(Ke, oe, pe, z) {
+                    let Te = s.getCurrentSourceFile(Ke), j = tl.getFormatContext(tP(z), e); if (!Kg(Te, oe)) switch (pe) {
+                        case "{": return tl.formatOnOpeningCurly(oe, Te, j); case "}": return tl.formatOnClosingCurly(oe, Te, j); case ";": return tl.formatOnSemicolon(oe, Te, j); case `
+`: return tl.formatOnEnter(oe, Te, j)
+                    }return []
+                } function Dt(Ke, oe, pe, z, Te, j = Cp) { C(); let yt = w(Ke), lt = Wc(oe, pe), Qe = tl.getFormatContext(Te, e); return Uo(fA(z, Zv, Es), Vt => (g.throwIfCancellationRequested(), gu.getFixes({ errorCode: Vt, sourceFile: yt, span: lt, program: l, host: e, cancellationToken: g, formatContext: Qe, preferences: j }))) } function pn(Ke, oe, pe, z = Cp) { C(), L.assert(Ke.type === "file"); let Te = w(Ke.fileName), j = tl.getFormatContext(pe, e); return gu.getAllFixes({ fixId: oe, sourceFile: Te, program: l, host: e, cancellationToken: g, formatContext: j, preferences: z }) } function An(Ke, oe, pe = Cp) { var z; C(), L.assert(Ke.type === "file"); let Te = w(Ke.fileName), j = tl.getFormatContext(oe, e), yt = (z = Ke.mode) != null ? z : Ke.skipDestructiveCodeActions ? "SortAndCombine" : "All"; return b_.organizeImports(Te, j, e, l, pe, yt) } function Kn(Ke, oe, pe, z = Cp) { return Nge(P(), Ke, oe, e, tl.getFormatContext(pe, e), z, A) } function hi(Ke, oe) { let pe = typeof Ke == "string" ? oe : Ke; return ba(pe) ? Promise.all(pe.map(z => ri(z))) : ri(pe) } function ri(Ke) { let oe = pe => Ts(pe, m, x); return L.assertEqual(Ke.type, "install package"), e.installPackage ? e.installPackage({ fileName: oe(Ke.file), packageName: Ke.packageName }) : Promise.reject("Host does not implement `installPackage`") } function vn(Ke, oe, pe, z) { let Te = z ? tl.getFormatContext(z, e).options : void 0; return xb.getDocCommentTemplateAtPosition(bb(e, Te), s.getCurrentSourceFile(Ke), oe, pe) } function Ht(Ke, oe, pe) { if (pe === 60) return !1; let z = s.getCurrentSourceFile(Ke); if (n1(z, oe)) return !1; if (khe(z, oe)) return pe === 123; if (qX(z, oe)) return !1; switch (pe) { case 39: case 34: case 96: return !Kg(z, oe) }return !0 } function En(Ke, oe) { let pe = s.getCurrentSourceFile(Ke), z = el(oe, pe); if (!z) return; let Te = z.kind === 31 && Xm(z.parent) ? z.parent.parent : CS(z) && Hg(z.parent) ? z.parent : void 0; if (Te && ve(Te)) return { newText: `</${Te.openingElement.tagName.getText(pe)}>` }; let j = z.kind === 31 && US(z.parent) ? z.parent.parent : CS(z) && BS(z.parent) ? z.parent : void 0; if (j && nt(j)) return { newText: "</>" } } function dr(Ke, oe) { return { lineStarts: Ke.getLineStarts(), firstLine: Ke.getLineAndCharacterOfPosition(oe.pos).line, lastLine: Ke.getLineAndCharacterOfPosition(oe.end).line } } function Cr(Ke, oe, pe) { let z = s.getCurrentSourceFile(Ke), Te = [], { lineStarts: j, firstLine: yt, lastLine: lt } = dr(z, oe), Qe = pe || !1, Vt = Number.MAX_VALUE, Hn = new Map, jr = new RegExp(/\S/), ei = m7(z, j[yt]), Kr = ei ? "{/*" : "//"; for (let Si = yt; Si <= lt; Si++) { let Ja = z.text.substring(j[Si], z.getLineEndOfPosition(j[Si])), Za = jr.exec(Ja); Za && (Vt = Math.min(Vt, Za.index), Hn.set(Si.toString(), Za.index), Ja.substr(Za.index, Kr.length) !== Kr && (Qe = pe === void 0 || pe)) } for (let Si = yt; Si <= lt; Si++) { if (yt !== lt && j[Si] === oe.end) continue; let Ja = Hn.get(Si.toString()); Ja !== void 0 && (ei ? Te.push.apply(Te, Se(Ke, { pos: j[Si] + Vt, end: z.getLineEndOfPosition(j[Si]) }, Qe, ei)) : Qe ? Te.push({ newText: Kr, span: { length: 0, start: j[Si] + Vt } }) : z.text.substr(j[Si] + Ja, Kr.length) === Kr && Te.push({ newText: "", span: { length: Kr.length, start: j[Si] + Ja } })) } return Te } function Se(Ke, oe, pe, z) { var Te; let j = s.getCurrentSourceFile(Ke), yt = [], { text: lt } = j, Qe = !1, Vt = pe || !1, Hn = [], { pos: jr } = oe, ei = z !== void 0 ? z : m7(j, jr), Kr = ei ? "{/*" : "/*", Si = ei ? "*/}" : "*/", Ja = ei ? "\\{\\/\\*" : "\\/\\*", Za = ei ? "\\*\\/\\}" : "\\*\\/"; for (; jr <= oe.end;) { let Fa = lt.substr(jr, Kr.length) === Kr ? Kr.length : 0, Hi = Kg(j, jr + Fa); if (Hi) ei && (Hi.pos--, Hi.end++), Hn.push(Hi.pos), Hi.kind === 3 && Hn.push(Hi.end), Qe = !0, jr = Hi.end + 1; else { let xi = lt.substring(jr, oe.end).search(`(${Ja})|(${Za})`); Vt = pe !== void 0 ? pe : Vt || !Whe(lt, jr, xi === -1 ? oe.end : jr + xi), jr = xi === -1 ? oe.end + 1 : jr + xi + Si.length } } if (Vt || !Qe) { ((Te = Kg(j, oe.pos)) == null ? void 0 : Te.kind) !== 2 && Ny(Hn, oe.pos, Es), Ny(Hn, oe.end, Es); let Fa = Hn[0]; lt.substr(Fa, Kr.length) !== Kr && yt.push({ newText: Kr, span: { length: 0, start: Fa } }); for (let Hi = 1; Hi < Hn.length - 1; Hi++)lt.substr(Hn[Hi] - Si.length, Si.length) !== Si && yt.push({ newText: Si, span: { length: 0, start: Hn[Hi] } }), lt.substr(Hn[Hi], Kr.length) !== Kr && yt.push({ newText: Kr, span: { length: 0, start: Hn[Hi] } }); yt.length % 2 !== 0 && yt.push({ newText: Si, span: { length: 0, start: Hn[Hn.length - 1] } }) } else for (let Fa of Hn) { let Hi = Fa - Si.length > 0 ? Fa - Si.length : 0, xi = lt.substr(Hi, Si.length) === Si ? Si.length : 0; yt.push({ newText: "", span: { length: Kr.length, start: Fa - xi } }) } return yt } function at(Ke, oe) { let pe = s.getCurrentSourceFile(Ke), { firstLine: z, lastLine: Te } = dr(pe, oe); return z === Te && oe.pos !== oe.end ? Se(Ke, oe, !0) : Cr(Ke, oe, !0) } function Tt(Ke, oe) { let pe = s.getCurrentSourceFile(Ke), z = [], { pos: Te } = oe, { end: j } = oe; Te === j && (j += m7(pe, Te) ? 2 : 1); for (let yt = Te; yt <= j; yt++) { let lt = Kg(pe, yt); if (lt) { switch (lt.kind) { case 2: z.push.apply(z, Cr(Ke, { end: lt.end, pos: lt.pos + 1 }, !1)); break; case 3: z.push.apply(z, Se(Ke, { end: lt.end, pos: lt.pos + 1 }, !1)) }yt = lt.end + 1 } } return z } function ve({ openingElement: Ke, closingElement: oe, parent: pe }) { return !yb(Ke.tagName, oe.tagName) || Hg(pe) && yb(Ke.tagName, pe.openingElement.tagName) && ve(pe) } function nt({ closingFragment: Ke, parent: oe }) { return !!(Ke.flags & 131072) || BS(oe) && nt(oe) } function ce(Ke, oe, pe) { let z = s.getCurrentSourceFile(Ke), Te = tl.getRangeOfEnclosingComment(z, oe); return Te && (!pe || Te.kind === 3) ? lv(Te) : void 0 } function Q(Ke, oe) { C(); let pe = w(Ke); g.throwIfCancellationRequested(); let z = pe.text, Te = []; if (oe.length > 0 && !Qe(pe.fileName)) { let Vt = yt(), Hn; for (; Hn = Vt.exec(z);) { g.throwIfCancellationRequested(); let jr = 3; L.assert(Hn.length === oe.length + jr); let ei = Hn[1], Kr = Hn.index + ei.length; if (!Kg(pe, Kr)) continue; let Si; for (let Za = 0; Za < oe.length; Za++)Hn[Za + jr] && (Si = oe[Za]); if (Si === void 0) return L.fail(); if (lt(z.charCodeAt(Kr + Si.text.length))) continue; let Ja = Hn[2]; Te.push({ descriptor: Si, message: Ja, position: Kr }) } } return Te; function j(Vt) { return Vt.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") } function yt() { let Vt = /(?:\/\/+\s*)/.source, Hn = /(?:\/\*+\s*)/.source, ei = "(" + /(?:^(?:\s|\*)*)/.source + "|" + Vt + "|" + Hn + ")", Kr = "(?:" + on(oe, Hi => "(" + j(Hi.text) + ")").join("|") + ")", Si = /(?:$|\*\/)/.source, Ja = /(?:.*?)/.source, Za = "(" + Kr + Ja + ")", Fa = ei + Za + Si; return new RegExp(Fa, "gim") } function lt(Vt) { return Vt >= 97 && Vt <= 122 || Vt >= 65 && Vt <= 90 || Vt >= 48 && Vt <= 57 } function Qe(Vt) { return jl(Vt, "/node_modules/") } } function ue(Ke, oe, pe) { return C(), RG.getRenameInfo(l, w(Ke), oe, pe || {}) } function G(Ke, oe, pe, z, Te, j) { let [yt, lt] = typeof oe == "number" ? [oe, void 0] : [oe.pos, oe.end]; return { file: Ke, startPosition: yt, endPosition: lt, program: P(), host: e, formatContext: tl.getFormatContext(z, e), cancellationToken: g, preferences: pe, triggerReason: Te, kind: j } } function Oe(Ke, oe, pe) { return { file: Ke, program: P(), host: e, span: oe, preferences: pe, cancellationToken: g } } function je(Ke, oe) { return ete.getSmartSelectionRange(oe, s.getCurrentSourceFile(Ke)) } function Ge(Ke, oe, pe = Cp, z, Te) { C(); let j = w(Ke); return Ok.getApplicableRefactors(G(j, oe, pe, Cp, z, Te)) } function kt(Ke, oe, pe, z, Te, j = Cp) { C(); let yt = w(Ke); return Ok.getEditsForRefactor(G(yt, pe, j, oe), z, Te) } function Kt(Ke, oe) { return oe === 0 ? { line: 0, character: 0 } : A.toLineColumnOffset(Ke, oe) } function ln(Ke, oe) { C(); let pe = rx.resolveCallHierarchyDeclaration(l, ef(w(Ke), oe)); return pe && pge(pe, z => rx.createCallHierarchyItem(l, z)) } function ir(Ke, oe) { C(); let pe = w(Ke), z = LY(rx.resolveCallHierarchyDeclaration(l, oe === 0 ? pe : ef(pe, oe))); return z ? rx.getIncomingCalls(l, z, g) : [] } function ae(Ke, oe) { C(); let pe = w(Ke), z = LY(rx.resolveCallHierarchyDeclaration(l, oe === 0 ? pe : ef(pe, oe))); return z ? rx.getOutgoingCalls(l, z) : [] } function rt(Ke, oe, pe = Cp) { C(); let z = w(Ke); return fee.provideInlayHints(Oe(z, oe, pe)) } let Ot = { dispose: W, cleanupSemanticCache: q, getSyntacticDiagnostics: Y, getSemanticDiagnostics: R, getSuggestionDiagnostics: ie, getCompilerOptionsDiagnostics: $, getSyntacticClassifications: _n, getSemanticClassifications: tn, getEncodedSyntacticClassifications: Gt, getEncodedSemanticClassifications: kn, getCompletionsAtPosition: fe, getCompletionEntryDetails: Z, getCompletionEntrySymbol: U, getSignatureHelpItems: ct, getQuickInfoAtPosition: re, getDefinitionAtPosition: ge, getDefinitionAndBoundSpan: X, getImplementationAtPosition: we, getTypeDefinitionAtPosition: Ve, getReferencesAtPosition: Ie, findReferences: Ne, getFileReferences: Le, getOccurrencesAtPosition: ke, getDocumentHighlights: Pe, getNameOrDottedNameSpan: We, getBreakpointStatementAtPosition: qe, getNavigateToItems: Ye, getRenameInfo: ue, getSmartSelectionRange: je, findRenameLocations: Ce, getNavigationBarItems: zt, getNavigationTree: Qt, getOutliningSpans: $n, getTodoComments: Q, getBraceMatchingAtPosition: Ni, getIndentationAtPosition: Pi, getFormattingEditsForRange: gr, getFormattingEditsForDocument: pt, getFormattingEditsAfterKeystroke: nn, getDocCommentTemplateAtPosition: vn, isValidBraceCompletionAtPosition: Ht, getJsxClosingTagAtPosition: En, getSpanOfEnclosingComment: ce, getCodeFixesAtPosition: Dt, getCombinedCodeFix: pn, applyCodeActionCommand: hi, organizeImports: An, getEditsForFileRename: Kn, getEmitOutput: _t, getNonBoundSourceFile: Rt, getProgram: P, getCurrentProgram: () => l, getAutoImportProvider: F, updateIsDefinitionOfReferencedSymbols: B, getApplicableRefactors: Ge, getEditsForRefactor: kt, toLineColumnOffset: Kt, getSourceMapper: () => A, clearSourceMapperCache: () => A.clearCache(), prepareCallHierarchy: ln, provideCallHierarchyIncomingCalls: ir, provideCallHierarchyOutgoingCalls: ae, toggleLineComment: Cr, toggleMultilineComment: Se, commentSelection: at, uncommentSelection: Tt, provideInlayHints: rt, getSupportedCodeFixes: Fye }; switch (o) { case 0: break; case 1: y$.forEach(Ke => Ot[Ke] = () => { throw new Error(`LanguageService Operation: ${Ke} not allowed in LanguageServiceMode.PartialSemantic`) }); break; case 2: qye.forEach(Ke => Ot[Ke] = () => { throw new Error(`LanguageService Operation: ${Ke} not allowed in LanguageServiceMode.Syntactic`) }); break; default: L.assertNever(o) }return Ot
+            } function p$(e) { return e.nameTable || s3e(e), e.nameTable } function s3e(e) { let t = e.nameTable = new Map; e.forEachChild(function r(i) { if (Re(i) && !GX(i) && i.escapedText || yf(i) && c3e(i)) { let o = MI(i); t.set(o, t.get(o) === void 0 ? i.pos : -1) } else if (pi(i)) { let o = i.escapedText; t.set(o, t.get(o) === void 0 ? i.pos : -1) } if (pa(i, r), Kd(i)) for (let o of i.jsDoc) pa(o, r) }) } function c3e(e) { return Rh(e) || e.parent.kind === 280 || d3e(e) || _R(e) } function nP(e) { let t = l3e(e); return t && (rs(t.parent) || K0(t.parent)) ? t : void 0 } function l3e(e) { switch (e.kind) { case 10: case 14: case 8: if (e.parent.kind === 164) return Xj(e.parent.parent) ? e.parent.parent : void 0; case 79: return Xj(e.parent) && (e.parent.parent.kind === 207 || e.parent.parent.kind === 289) && e.parent.name === e ? e.parent : void 0 } } function u3e(e, t) { let r = nP(e); if (r) { let i = t.getContextualType(r.parent), o = i && _5(r, t, i, !1); if (o && o.length === 1) return Vo(o) } return t.getSymbolAtLocation(e) } function _5(e, t, r, i) { let o = VN(e.name); if (!o) return Je; if (!r.isUnion()) { let l = r.getProperty(o); return l ? [l] : Je } let s = Zi(r.types, l => (rs(e.parent) || K0(e.parent)) && t.isTypeInvalidDueToUnionDiscriminant(l, e.parent) ? void 0 : l.getProperty(o)); if (i && (s.length === 0 || s.length === r.types.length)) { let l = r.getProperty(o); if (l) return [l] } return s.length === 0 ? Zi(r.types, l => l.getProperty(o)) : s } function d3e(e) { return e && e.parent && e.parent.kind === 209 && e.parent.argumentExpression === e } function f3e(e) { if (xl) return vi(ni(So(xl.getExecutingFilePath())), X8(e)); throw new Error("getDefaultLibFilePath is only supported when consumed as a node module. ") } var m$, p5, m5, Uye, h$, h5, g5, Vye, jye, Hye, Wye, zye, Jye, Kye, g$, y$, qye, _3e = gt({
+                "src/services/services.ts"() {
+                    "use strict"; Fr(), Fr(), lye(), wye(), m$ = "0.8", p5 = class { constructor(e, t, r) { this.pos = t, this.end = r, this.flags = 0, this.modifierFlagsCache = 0, this.transformFlags = 0, this.parent = void 0, this.kind = e } assertHasRealPosition(e) { L.assert(!vp(this.pos) && !vp(this.end), e || "Node must have a real position for this operation") } getSourceFile() { return Gn(this) } getStart(e, t) { return this.assertHasRealPosition(), gT(this, e, t) } getFullStart() { return this.assertHasRealPosition(), this.pos } getEnd() { return this.assertHasRealPosition(), this.end } getWidth(e) { return this.assertHasRealPosition(), this.getEnd() - this.getStart(e) } getFullWidth() { return this.assertHasRealPosition(), this.end - this.pos } getLeadingTriviaWidth(e) { return this.assertHasRealPosition(), this.getStart(e) - this.pos } getFullText(e) { return this.assertHasRealPosition(), (e || this.getSourceFile()).text.substring(this.pos, this.end) } getText(e) { return this.assertHasRealPosition(), e || (e = this.getSourceFile()), e.text.substring(this.getStart(e), this.getEnd()) } getChildCount(e) { return this.getChildren(e).length } getChildAt(e, t) { return this.getChildren(t)[e] } getChildren(e) { return this.assertHasRealPosition("Node without a real position cannot be scanned and thus has no token nodes - use forEachChild and collect the result if that's fine"), this._children || (this._children = i3e(this, e)) } getFirstToken(e) { this.assertHasRealPosition(); let t = this.getChildren(e); if (!t.length) return; let r = wr(t, i => i.kind < 312 || i.kind > 353); return r.kind < 163 ? r : r.getFirstToken(e) } getLastToken(e) { this.assertHasRealPosition(); let t = this.getChildren(e), r = Os(t); if (r) return r.kind < 163 ? r : r.getLastToken(e) } forEachChild(e, t) { return pa(this, e, t) } }, m5 = class { constructor(e, t) { this.pos = e, this.end = t, this.flags = 0, this.modifierFlagsCache = 0, this.transformFlags = 0, this.parent = void 0 } getSourceFile() { return Gn(this) } getStart(e, t) { return gT(this, e, t) } getFullStart() { return this.pos } getEnd() { return this.end } getWidth(e) { return this.getEnd() - this.getStart(e) } getFullWidth() { return this.end - this.pos } getLeadingTriviaWidth(e) { return this.getStart(e) - this.pos } getFullText(e) { return (e || this.getSourceFile()).text.substring(this.pos, this.end) } getText(e) { return e || (e = this.getSourceFile()), e.text.substring(this.getStart(e), this.getEnd()) } getChildCount() { return this.getChildren().length } getChildAt(e) { return this.getChildren()[e] } getChildren() { return this.kind === 1 && this.jsDoc || Je } getFirstToken() { } getLastToken() { } forEachChild() { } }, Uye = class { constructor(e, t) { this.id = 0, this.mergeId = 0, this.flags = e, this.escapedName = t } getFlags() { return this.flags } get name() { return fc(this) } getEscapedName() { return this.escapedName } getName() { return this.name } getDeclarations() { return this.declarations } getDocumentationComment(e) { if (!this.documentationComment) if (this.documentationComment = Je, !this.declarations && Zp(this) && this.links.target && Zp(this.links.target) && this.links.target.links.tupleLabelDeclaration) { let t = this.links.target.links.tupleLabelDeclaration; this.documentationComment = eP([t], e) } else this.documentationComment = eP(this.declarations, e); return this.documentationComment } getContextualDocumentationComment(e, t) { if (e) { if (zy(e) && (this.contextualGetAccessorDocumentationComment || (this.contextualGetAccessorDocumentationComment = eP(Pr(this.declarations, zy), t)), Fn(this.contextualGetAccessorDocumentationComment))) return this.contextualGetAccessorDocumentationComment; if (Ng(e) && (this.contextualSetAccessorDocumentationComment || (this.contextualSetAccessorDocumentationComment = eP(Pr(this.declarations, Ng), t)), Fn(this.contextualSetAccessorDocumentationComment))) return this.contextualSetAccessorDocumentationComment } return this.getDocumentationComment(t) } getJsDocTags(e) { return this.tags === void 0 && (this.tags = u5(this.declarations, e)), this.tags } getContextualJsDocTags(e, t) { if (e) { if (zy(e) && (this.contextualGetAccessorTags || (this.contextualGetAccessorTags = u5(Pr(this.declarations, zy), t)), Fn(this.contextualGetAccessorTags))) return this.contextualGetAccessorTags; if (Ng(e) && (this.contextualSetAccessorTags || (this.contextualSetAccessorTags = u5(Pr(this.declarations, Ng), t)), Fn(this.contextualSetAccessorTags))) return this.contextualSetAccessorTags } return this.getJsDocTags(t) } }, h$ = class extends m5 { constructor(e, t, r) { super(t, r), this.kind = e } }, h5 = class extends m5 { constructor(e, t, r) { super(t, r), this.kind = 79 } get text() { return vr(this) } }, h5.prototype.kind = 79, g5 = class extends m5 { constructor(e, t, r) { super(t, r), this.kind = 80 } get text() { return vr(this) } }, g5.prototype.kind = 80, Vye = class { constructor(e, t) { this.checker = e, this.flags = t } getFlags() { return this.flags } getSymbol() { return this.symbol } getProperties() { return this.checker.getPropertiesOfType(this) } getProperty(e) { return this.checker.getPropertyOfType(this, e) } getApparentProperties() { return this.checker.getAugmentedPropertiesOfType(this) } getCallSignatures() { return this.checker.getSignaturesOfType(this, 0) } getConstructSignatures() { return this.checker.getSignaturesOfType(this, 1) } getStringIndexType() { return this.checker.getIndexTypeOfType(this, 0) } getNumberIndexType() { return this.checker.getIndexTypeOfType(this, 1) } getBaseTypes() { return this.isClassOrInterface() ? this.checker.getBaseTypes(this) : void 0 } isNullableType() { return this.checker.isNullableType(this) } getNonNullableType() { return this.checker.getNonNullableType(this) } getNonOptionalType() { return this.checker.getNonOptionalType(this) } getConstraint() { return this.checker.getBaseConstraintOfType(this) } getDefault() { return this.checker.getDefaultFromTypeParameter(this) } isUnion() { return !!(this.flags & 1048576) } isIntersection() { return !!(this.flags & 2097152) } isUnionOrIntersection() { return !!(this.flags & 3145728) } isLiteral() { return !!(this.flags & 2432) } isStringLiteral() { return !!(this.flags & 128) } isNumberLiteral() { return !!(this.flags & 256) } isTypeParameter() { return !!(this.flags & 262144) } isClassOrInterface() { return !!(Ur(this) & 3) } isClass() { return !!(Ur(this) & 1) } isIndexType() { return !!(this.flags & 4194304) } get typeArguments() { if (Ur(this) & 4) return this.checker.getTypeArguments(this) } }, jye = class { constructor(e, t) { this.checker = e, this.flags = t } getDeclaration() { return this.declaration } getTypeParameters() { return this.typeParameters } getParameters() { return this.parameters } getReturnType() { return this.checker.getReturnTypeOfSignature(this) } getTypeParameterAtPosition(e) { let t = this.checker.getParameterType(this, e); if (t.isIndexType() && lL(t.type)) { let r = t.type.getConstraint(); if (r) return this.checker.getIndexType(r) } return t } getDocumentationComment() { return this.documentationComment || (this.documentationComment = eP(aT(this.declaration), this.checker)) } getJsDocTags() { return this.jsDocTags || (this.jsDocTags = u5(aT(this.declaration), this.checker)) } }, Hye = class extends p5 {
+                        constructor(e, t, r) { super(e, t, r), this.kind = 308 } update(e, t) { return uJ(this, e, t) } getLineAndCharacterOfPosition(e) { return Gs(this, e) } getLineStarts() { return Sh(this) } getPositionOfLineAndCharacter(e, t, r) { return mj(Sh(this), e, t, this.text, r) } getLineEndOfPosition(e) {
+                            let { line: t } = this.getLineAndCharacterOfPosition(e), r = this.getLineStarts(), i; t + 1 >= r.length && (i = this.getEnd()), i || (i = r[t + 1] - 1); let o = this.getFullText(); return o[i] === `
+`&& o[i - 1] === "\r" ? i - 1 : i
+                        } getNamedDeclarations() { return this.namedDeclarations || (this.namedDeclarations = this.computeNamedDeclarations()), this.namedDeclarations } computeNamedDeclarations() { let e = Nf(); return this.forEachChild(o), e; function t(s) { let l = i(s); l && e.add(l, s) } function r(s) { let l = e.get(s); return l || e.set(s, l = []), l } function i(s) { let l = Sj(s); return l && (ts(l) && br(l.expression) ? l.expression.name.text : Ys(l) ? VN(l) : void 0) } function o(s) { switch (s.kind) { case 259: case 215: case 171: case 170: let l = s, f = i(l); if (f) { let m = r(f), v = Os(m); v && l.parent === v.parent && l.symbol === v.symbol ? l.body && !v.body && (m[m.length - 1] = l) : m.push(l) } pa(s, o); break; case 260: case 228: case 261: case 262: case 263: case 264: case 268: case 278: case 273: case 270: case 271: case 174: case 175: case 184: t(s), pa(s, o); break; case 166: if (!Mr(s, 16476)) break; case 257: case 205: { let m = s; if (La(m.name)) { pa(m.name, o); break } m.initializer && o(m.initializer) } case 302: case 169: case 168: t(s); break; case 275: let d = s; d.exportClause && (h_(d.exportClause) ? mn(d.exportClause.elements, o) : o(d.exportClause.name)); break; case 269: let g = s.importClause; g && (g.name && t(g.name), g.namedBindings && (g.namedBindings.kind === 271 ? t(g.namedBindings) : mn(g.namedBindings.elements, o))); break; case 223: ic(s) !== 0 && t(s); default: pa(s, o) } } }
+                    }, Wye = class { constructor(e, t, r) { this.fileName = e, this.text = t, this.skipTrivia = r } getLineAndCharacterOfPosition(e) { return Gs(this, e) } }, zye = class { constructor(e) { this.host = e } getCurrentSourceFile(e) { var t, r, i, o, s, l, f, d; let g = this.host.getScriptSnapshot(e); if (!g) throw new Error("Could not find file: '" + e + "'."); let m = mY(e, this.host), v = this.host.getScriptVersion(e), S; if (this.currentFileName !== e) { let x = { languageVersion: 99, impliedNodeFormat: NF(Ts(e, this.host.getCurrentDirectory(), ((i = (r = (t = this.host).getCompilerHost) == null ? void 0 : r.call(t)) == null ? void 0 : i.getCanonicalFileName) || lb(this.host)), (d = (f = (l = (s = (o = this.host).getCompilerHost) == null ? void 0 : s.call(o)) == null ? void 0 : l.getModuleResolutionCache) == null ? void 0 : f.call(l)) == null ? void 0 : d.getPackageJsonInfoCache(), this.host, this.host.getCompilationSettings()), setExternalModuleIndicator: OR(this.host.getCompilationSettings()) }; S = f5(e, g, x, v, !0, m) } else if (this.currentFileVersion !== v) { let x = g.getChangeRange(this.currentFileScriptSnapshot); S = _$(this.currentSourceFile, g, v, x) } return S && (this.currentFileVersion = v, this.currentFileName = e, this.currentFileScriptSnapshot = g, this.currentSourceFile = S), this.currentSourceFile } }, Jye = { isCancellationRequested: m0, throwIfCancellationRequested: Ba }, Kye = class { constructor(e) { this.cancellationToken = e } isCancellationRequested() { return this.cancellationToken.isCancellationRequested() } throwIfCancellationRequested() { var e; if (this.isCancellationRequested()) throw (e = ai) == null || e.instant(ai.Phase.Session, "cancellationThrown", { kind: "CancellationTokenObject" }), new tI } }, g$ = class { constructor(e, t = 20) { this.hostCancellationToken = e, this.throttleWaitMilliseconds = t, this.lastCancellationCheckTime = 0 } isCancellationRequested() { let e = Ms(); return Math.abs(e - this.lastCancellationCheckTime) >= this.throttleWaitMilliseconds ? (this.lastCancellationCheckTime = e, this.hostCancellationToken.isCancellationRequested()) : !1 } throwIfCancellationRequested() { var e; if (this.isCancellationRequested()) throw (e = ai) == null || e.instant(ai.Phase.Session, "cancellationThrown", { kind: "ThrottledCancellationToken" }), new tI } }, y$ = ["getSemanticDiagnostics", "getSuggestionDiagnostics", "getCompilerOptionsDiagnostics", "getSemanticClassifications", "getEncodedSemanticClassifications", "getCodeFixesAtPosition", "getCombinedCodeFix", "applyCodeActionCommand", "organizeImports", "getEditsForFileRename", "getEmitOutput", "getApplicableRefactors", "getEditsForRefactor", "prepareCallHierarchy", "provideCallHierarchyIncomingCalls", "provideCallHierarchyOutgoingCalls", "provideInlayHints", "getSupportedCodeFixes"], qye = [...y$, "getCompletionsAtPosition", "getCompletionEntryDetails", "getCompletionEntrySymbol", "getSignatureHelpItems", "getQuickInfoAtPosition", "getDefinitionAtPosition", "getDefinitionAndBoundSpan", "getImplementationAtPosition", "getTypeDefinitionAtPosition", "getReferencesAtPosition", "findReferences", "getOccurrencesAtPosition", "getDocumentHighlights", "getNavigateToItems", "getRenameInfo", "findRenameLocations", "getApplicableRefactors"], _le(o3e())
+                }
+            }); function p3e(e, t, r) { let i = []; r = t$(r, i); let o = ba(e) ? e : [e], s = lN(void 0, void 0, D, r, o, t, !0); return s.diagnostics = Qi(s.diagnostics, i), s } var m3e = gt({ "src/services/transform.ts"() { "use strict"; Fr() } }); function y5(e, t) { e && e.log("*INTERNAL ERROR* - Exception in typescript services: " + t.message) } function h3e(e, t, r, i) { let o; i && (e.log(t), o = Ms()); let s = r(); if (i) { let l = Ms(); if (e.log(`${t} completed in ${l - o} msec`), Ta(s)) { let f = s; f.length > 128 && (f = f.substring(0, 128) + "..."), e.log(`  result.length=${f.length}, result='${JSON.stringify(f)}'`) } } return s } function v$(e, t, r, i) { return Xye(e, t, !0, r, i) } function Xye(e, t, r, i, o) { try { let s = h3e(e, t, i, o); return r ? JSON.stringify({ result: s }) : s } catch (s) { return s instanceof tI ? JSON.stringify({ canceled: !0 }) : (y5(e, s), s.description = t, JSON.stringify({ error: s })) } } function b$(e, t) { return e.map(r => g3e(r, t)) } function g3e(e, t) { return { message: sv(e.messageText, t), start: e.start, length: e.length, category: C8(e), code: e.code, reportsUnnecessary: e.reportsUnnecessary, reportsDeprecated: e.reportsDeprecated } } function E$(e) { return { spans: e.spans.join(","), endOfLineState: e.endOfLineState } } var v5, Yye, T$, S$, b5, $ye, Qye, Zye, eve, y3e = gt({
+                "src/services/shims.ts"() {
+                    "use strict"; Fr(), v5 = function () { return this }(), Yye = class { constructor(e) { this.scriptSnapshotShim = e } getText(e, t) { return this.scriptSnapshotShim.getText(e, t) } getLength() { return this.scriptSnapshotShim.getLength() } getChangeRange(e) { let t = e, r = this.scriptSnapshotShim.getChangeRange(t.scriptSnapshotShim); if (r === null) return null; let i = JSON.parse(r); return Sw(il(i.span.start, i.span.length), i.newLength) } dispose() { "dispose" in this.scriptSnapshotShim && this.scriptSnapshotShim.dispose() } }, T$ = class { constructor(e) { this.shimHost = e, this.loggingEnabled = !1, this.tracingEnabled = !1, "getModuleResolutionsForFile" in this.shimHost && (this.resolveModuleNames = (t, r) => { let i = JSON.parse(this.shimHost.getModuleResolutionsForFile(r)); return on(t, o => { let s = zD(i, o); return s ? { resolvedFileName: s, extension: jR(s), isExternalLibraryImport: !1 } : void 0 }) }), "directoryExists" in this.shimHost && (this.directoryExists = t => this.shimHost.directoryExists(t)), "getTypeReferenceDirectiveResolutionsForFile" in this.shimHost && (this.resolveTypeReferenceDirectives = (t, r) => { let i = JSON.parse(this.shimHost.getTypeReferenceDirectiveResolutionsForFile(r)); return on(t, o => zD(i, Ta(o) ? o : n_(o.fileName))) }) } log(e) { this.loggingEnabled && this.shimHost.log(e) } trace(e) { this.tracingEnabled && this.shimHost.trace(e) } error(e) { this.shimHost.error(e) } getProjectVersion() { if (this.shimHost.getProjectVersion) return this.shimHost.getProjectVersion() } getTypeRootsVersion() { return this.shimHost.getTypeRootsVersion ? this.shimHost.getTypeRootsVersion() : 0 } useCaseSensitiveFileNames() { return this.shimHost.useCaseSensitiveFileNames ? this.shimHost.useCaseSensitiveFileNames() : !1 } getCompilationSettings() { let e = this.shimHost.getCompilationSettings(); if (e === null || e === "") throw Error("LanguageServiceShimHostAdapter.getCompilationSettings: empty compilationSettings"); let t = JSON.parse(e); return t.allowNonTsExtensions = !0, t } getScriptFileNames() { let e = this.shimHost.getScriptFileNames(); return JSON.parse(e) } getScriptSnapshot(e) { let t = this.shimHost.getScriptSnapshot(e); return t && new Yye(t) } getScriptKind(e) { return "getScriptKind" in this.shimHost ? this.shimHost.getScriptKind(e) : 0 } getScriptVersion(e) { return this.shimHost.getScriptVersion(e) } getLocalizedDiagnosticMessages() { let e = this.shimHost.getLocalizedDiagnosticMessages(); if (e === null || e === "") return null; try { return JSON.parse(e) } catch (t) { return this.log(t.description || "diagnosticMessages.generated.json has invalid JSON format"), null } } getCancellationToken() { let e = this.shimHost.getCancellationToken(); return new g$(e) } getCurrentDirectory() { return this.shimHost.getCurrentDirectory() } getDirectories(e) { return JSON.parse(this.shimHost.getDirectories(e)) } getDefaultLibFileName(e) { return this.shimHost.getDefaultLibFileName(JSON.stringify(e)) } readDirectory(e, t, r, i, o) { let s = tL(e, r, i, this.shimHost.useCaseSensitiveFileNames(), this.shimHost.getCurrentDirectory()); return JSON.parse(this.shimHost.readDirectory(e, JSON.stringify(t), JSON.stringify(s.basePaths), s.excludePattern, s.includeFilePattern, s.includeDirectoryPattern, o)) } readFile(e, t) { return this.shimHost.readFile(e, t) } fileExists(e) { return this.shimHost.fileExists(e) } }, S$ = class { constructor(e) { this.shimHost = e, this.useCaseSensitiveFileNames = this.shimHost.useCaseSensitiveFileNames ? this.shimHost.useCaseSensitiveFileNames() : !1, "directoryExists" in this.shimHost ? this.directoryExists = t => this.shimHost.directoryExists(t) : this.directoryExists = void 0, "realpath" in this.shimHost ? this.realpath = t => this.shimHost.realpath(t) : this.realpath = void 0 } readDirectory(e, t, r, i, o) { let s = tL(e, r, i, this.shimHost.useCaseSensitiveFileNames(), this.shimHost.getCurrentDirectory()); return JSON.parse(this.shimHost.readDirectory(e, JSON.stringify(t), JSON.stringify(s.basePaths), s.excludePattern, s.includeFilePattern, s.includeDirectoryPattern, o)) } fileExists(e) { return this.shimHost.fileExists(e) } readFile(e) { return this.shimHost.readFile(e) } getDirectories(e) { return JSON.parse(this.shimHost.getDirectories(e)) } }, b5 = class { constructor(e) { this.factory = e, e.registerShim(this) } dispose(e) { this.factory.unregisterShim(this) } }, $ye = class extends b5 { constructor(e, t, r) { super(e), this.host = t, this.languageService = r, this.logPerformance = !1, this.logger = this.host } forwardJSONCall(e, t) { return v$(this.logger, e, t, this.logPerformance) } dispose(e) { this.logger.log("dispose()"), this.languageService.dispose(), this.languageService = null, v5 && v5.CollectGarbage && (v5.CollectGarbage(), this.logger.log("CollectGarbage()")), this.logger = null, super.dispose(e) } refresh(e) { this.forwardJSONCall(`refresh(${e})`, () => null) } cleanupSemanticCache() { this.forwardJSONCall("cleanupSemanticCache()", () => (this.languageService.cleanupSemanticCache(), null)) } realizeDiagnostics(e) { let t = bb(this.host, void 0); return b$(e, t) } getSyntacticClassifications(e, t, r) { return this.forwardJSONCall(`getSyntacticClassifications('${e}', ${t}, ${r})`, () => this.languageService.getSyntacticClassifications(e, il(t, r))) } getSemanticClassifications(e, t, r) { return this.forwardJSONCall(`getSemanticClassifications('${e}', ${t}, ${r})`, () => this.languageService.getSemanticClassifications(e, il(t, r))) } getEncodedSyntacticClassifications(e, t, r) { return this.forwardJSONCall(`getEncodedSyntacticClassifications('${e}', ${t}, ${r})`, () => E$(this.languageService.getEncodedSyntacticClassifications(e, il(t, r)))) } getEncodedSemanticClassifications(e, t, r) { return this.forwardJSONCall(`getEncodedSemanticClassifications('${e}', ${t}, ${r})`, () => E$(this.languageService.getEncodedSemanticClassifications(e, il(t, r)))) } getSyntacticDiagnostics(e) { return this.forwardJSONCall(`getSyntacticDiagnostics('${e}')`, () => { let t = this.languageService.getSyntacticDiagnostics(e); return this.realizeDiagnostics(t) }) } getSemanticDiagnostics(e) { return this.forwardJSONCall(`getSemanticDiagnostics('${e}')`, () => { let t = this.languageService.getSemanticDiagnostics(e); return this.realizeDiagnostics(t) }) } getSuggestionDiagnostics(e) { return this.forwardJSONCall(`getSuggestionDiagnostics('${e}')`, () => this.realizeDiagnostics(this.languageService.getSuggestionDiagnostics(e))) } getCompilerOptionsDiagnostics() { return this.forwardJSONCall("getCompilerOptionsDiagnostics()", () => { let e = this.languageService.getCompilerOptionsDiagnostics(); return this.realizeDiagnostics(e) }) } getQuickInfoAtPosition(e, t) { return this.forwardJSONCall(`getQuickInfoAtPosition('${e}', ${t})`, () => this.languageService.getQuickInfoAtPosition(e, t)) } getNameOrDottedNameSpan(e, t, r) { return this.forwardJSONCall(`getNameOrDottedNameSpan('${e}', ${t}, ${r})`, () => this.languageService.getNameOrDottedNameSpan(e, t, r)) } getBreakpointStatementAtPosition(e, t) { return this.forwardJSONCall(`getBreakpointStatementAtPosition('${e}', ${t})`, () => this.languageService.getBreakpointStatementAtPosition(e, t)) } getSignatureHelpItems(e, t, r) { return this.forwardJSONCall(`getSignatureHelpItems('${e}', ${t})`, () => this.languageService.getSignatureHelpItems(e, t, r)) } getDefinitionAtPosition(e, t) { return this.forwardJSONCall(`getDefinitionAtPosition('${e}', ${t})`, () => this.languageService.getDefinitionAtPosition(e, t)) } getDefinitionAndBoundSpan(e, t) { return this.forwardJSONCall(`getDefinitionAndBoundSpan('${e}', ${t})`, () => this.languageService.getDefinitionAndBoundSpan(e, t)) } getTypeDefinitionAtPosition(e, t) { return this.forwardJSONCall(`getTypeDefinitionAtPosition('${e}', ${t})`, () => this.languageService.getTypeDefinitionAtPosition(e, t)) } getImplementationAtPosition(e, t) { return this.forwardJSONCall(`getImplementationAtPosition('${e}', ${t})`, () => this.languageService.getImplementationAtPosition(e, t)) } getRenameInfo(e, t, r) { return this.forwardJSONCall(`getRenameInfo('${e}', ${t})`, () => this.languageService.getRenameInfo(e, t, r)) } getSmartSelectionRange(e, t) { return this.forwardJSONCall(`getSmartSelectionRange('${e}', ${t})`, () => this.languageService.getSmartSelectionRange(e, t)) } findRenameLocations(e, t, r, i, o) { return this.forwardJSONCall(`findRenameLocations('${e}', ${t}, ${r}, ${i}, ${o})`, () => this.languageService.findRenameLocations(e, t, r, i, o)) } getBraceMatchingAtPosition(e, t) { return this.forwardJSONCall(`getBraceMatchingAtPosition('${e}', ${t})`, () => this.languageService.getBraceMatchingAtPosition(e, t)) } isValidBraceCompletionAtPosition(e, t, r) { return this.forwardJSONCall(`isValidBraceCompletionAtPosition('${e}', ${t}, ${r})`, () => this.languageService.isValidBraceCompletionAtPosition(e, t, r)) } getSpanOfEnclosingComment(e, t, r) { return this.forwardJSONCall(`getSpanOfEnclosingComment('${e}', ${t})`, () => this.languageService.getSpanOfEnclosingComment(e, t, r)) } getIndentationAtPosition(e, t, r) { return this.forwardJSONCall(`getIndentationAtPosition('${e}', ${t})`, () => { let i = JSON.parse(r); return this.languageService.getIndentationAtPosition(e, t, i) }) } getReferencesAtPosition(e, t) { return this.forwardJSONCall(`getReferencesAtPosition('${e}', ${t})`, () => this.languageService.getReferencesAtPosition(e, t)) } findReferences(e, t) { return this.forwardJSONCall(`findReferences('${e}', ${t})`, () => this.languageService.findReferences(e, t)) } getFileReferences(e) { return this.forwardJSONCall(`getFileReferences('${e})`, () => this.languageService.getFileReferences(e)) } getOccurrencesAtPosition(e, t) { return this.forwardJSONCall(`getOccurrencesAtPosition('${e}', ${t})`, () => this.languageService.getOccurrencesAtPosition(e, t)) } getDocumentHighlights(e, t, r) { return this.forwardJSONCall(`getDocumentHighlights('${e}', ${t})`, () => { let i = this.languageService.getDocumentHighlights(e, t, JSON.parse(r)), o = n_(Al(e)); return Pr(i, s => n_(Al(s.fileName)) === o) }) } getCompletionsAtPosition(e, t, r, i) { return this.forwardJSONCall(`getCompletionsAtPosition('${e}', ${t}, ${r}, ${i})`, () => this.languageService.getCompletionsAtPosition(e, t, r, i)) } getCompletionEntryDetails(e, t, r, i, o, s, l) { return this.forwardJSONCall(`getCompletionEntryDetails('${e}', ${t}, '${r}')`, () => { let f = i === void 0 ? void 0 : JSON.parse(i); return this.languageService.getCompletionEntryDetails(e, t, r, f, o, s, l) }) } getFormattingEditsForRange(e, t, r, i) { return this.forwardJSONCall(`getFormattingEditsForRange('${e}', ${t}, ${r})`, () => { let o = JSON.parse(i); return this.languageService.getFormattingEditsForRange(e, t, r, o) }) } getFormattingEditsForDocument(e, t) { return this.forwardJSONCall(`getFormattingEditsForDocument('${e}')`, () => { let r = JSON.parse(t); return this.languageService.getFormattingEditsForDocument(e, r) }) } getFormattingEditsAfterKeystroke(e, t, r, i) { return this.forwardJSONCall(`getFormattingEditsAfterKeystroke('${e}', ${t}, '${r}')`, () => { let o = JSON.parse(i); return this.languageService.getFormattingEditsAfterKeystroke(e, t, r, o) }) } getDocCommentTemplateAtPosition(e, t, r, i) { return this.forwardJSONCall(`getDocCommentTemplateAtPosition('${e}', ${t})`, () => this.languageService.getDocCommentTemplateAtPosition(e, t, r, i)) } getNavigateToItems(e, t, r) { return this.forwardJSONCall(`getNavigateToItems('${e}', ${t}, ${r})`, () => this.languageService.getNavigateToItems(e, t, r)) } getNavigationBarItems(e) { return this.forwardJSONCall(`getNavigationBarItems('${e}')`, () => this.languageService.getNavigationBarItems(e)) } getNavigationTree(e) { return this.forwardJSONCall(`getNavigationTree('${e}')`, () => this.languageService.getNavigationTree(e)) } getOutliningSpans(e) { return this.forwardJSONCall(`getOutliningSpans('${e}')`, () => this.languageService.getOutliningSpans(e)) } getTodoComments(e, t) { return this.forwardJSONCall(`getTodoComments('${e}')`, () => this.languageService.getTodoComments(e, JSON.parse(t))) } prepareCallHierarchy(e, t) { return this.forwardJSONCall(`prepareCallHierarchy('${e}', ${t})`, () => this.languageService.prepareCallHierarchy(e, t)) } provideCallHierarchyIncomingCalls(e, t) { return this.forwardJSONCall(`provideCallHierarchyIncomingCalls('${e}', ${t})`, () => this.languageService.provideCallHierarchyIncomingCalls(e, t)) } provideCallHierarchyOutgoingCalls(e, t) { return this.forwardJSONCall(`provideCallHierarchyOutgoingCalls('${e}', ${t})`, () => this.languageService.provideCallHierarchyOutgoingCalls(e, t)) } provideInlayHints(e, t, r) { return this.forwardJSONCall(`provideInlayHints('${e}', '${JSON.stringify(t)}', ${JSON.stringify(r)})`, () => this.languageService.provideInlayHints(e, t, r)) } getEmitOutput(e) { return this.forwardJSONCall(`getEmitOutput('${e}')`, () => { let { diagnostics: t, ...r } = this.languageService.getEmitOutput(e); return { ...r, diagnostics: this.realizeDiagnostics(t) } }) } getEmitOutputObject(e) { return Xye(this.logger, `getEmitOutput('${e}')`, !1, () => this.languageService.getEmitOutput(e), this.logPerformance) } toggleLineComment(e, t) { return this.forwardJSONCall(`toggleLineComment('${e}', '${JSON.stringify(t)}')`, () => this.languageService.toggleLineComment(e, t)) } toggleMultilineComment(e, t) { return this.forwardJSONCall(`toggleMultilineComment('${e}', '${JSON.stringify(t)}')`, () => this.languageService.toggleMultilineComment(e, t)) } commentSelection(e, t) { return this.forwardJSONCall(`commentSelection('${e}', '${JSON.stringify(t)}')`, () => this.languageService.commentSelection(e, t)) } uncommentSelection(e, t) { return this.forwardJSONCall(`uncommentSelection('${e}', '${JSON.stringify(t)}')`, () => this.languageService.uncommentSelection(e, t)) } }, Qye = class extends b5 {
+                        constructor(e, t) { super(e), this.logger = t, this.logPerformance = !1, this.classifier = Age() } getEncodedLexicalClassifications(e, t, r = !1) { return v$(this.logger, "getEncodedLexicalClassifications", () => E$(this.classifier.getEncodedLexicalClassifications(e, t, r)), this.logPerformance) } getClassificationsForLine(e, t, r = !1) {
+                            let i = this.classifier.getClassificationsForLine(e, t, r), o = ""; for (let s of i.entries) o += s.length + `
+`, o += s.classification + `
+`; return o += i.finalLexState, o
+                        }
+                    }, Zye = class extends b5 {
+                        constructor(e, t, r) { super(e), this.logger = t, this.host = r, this.logPerformance = !1 } forwardJSONCall(e, t) { return v$(this.logger, e, t, this.logPerformance) } resolveModuleName(e, t, r) { return this.forwardJSONCall(`resolveModuleName('${e}')`, () => { let i = JSON.parse(r), o = FL(t, Al(e), i, this.host), s = o.resolvedModule ? o.resolvedModule.resolvedFileName : void 0; return o.resolvedModule && o.resolvedModule.extension !== ".ts" && o.resolvedModule.extension !== ".tsx" && o.resolvedModule.extension !== ".d.ts" && (s = void 0), { resolvedFileName: s, failedLookupLocations: o.failedLookupLocations, affectingLocations: o.affectingLocations } }) } resolveTypeReferenceDirective(e, t, r) { return this.forwardJSONCall(`resolveTypeReferenceDirective(${e})`, () => { let i = JSON.parse(r), o = HJ(t, Al(e), i, this.host); return { resolvedFileName: o.resolvedTypeReferenceDirective ? o.resolvedTypeReferenceDirective.resolvedFileName : void 0, primary: o.resolvedTypeReferenceDirective ? o.resolvedTypeReferenceDirective.primary : !0, failedLookupLocations: o.failedLookupLocations } }) } getPreProcessedFileInfo(e, t) { return this.forwardJSONCall(`getPreProcessedFileInfo('${e}')`, () => { let r = qge(E7(t), !0, !0); return { referencedFiles: this.convertFileReferences(r.referencedFiles), importedFiles: this.convertFileReferences(r.importedFiles), ambientExternalModules: r.ambientExternalModules, isLibFile: r.isLibFile, typeReferenceDirectives: this.convertFileReferences(r.typeReferenceDirectives), libReferenceDirectives: this.convertFileReferences(r.libReferenceDirectives) } }) } getAutomaticTypeDirectiveNames(e) { return this.forwardJSONCall(`getAutomaticTypeDirectiveNames('${e}')`, () => { let t = JSON.parse(e); return X3(t, this.host) }) } convertFileReferences(e) { if (!e) return; let t = []; for (let r of e) t.push({ path: Al(r.fileName), position: r.pos, length: r.end - r.pos }); return t } getTSConfigFileInfo(e, t) {
+                            return this.forwardJSONCall(`getTSConfigFileInfo('${e}')`, () => {
+                                let r = wO(e, E7(t)), i = Al(e), o = MO(r, this.host, ni(i), {}, i); return {
+                                    options: o.options, typeAcquisition: o.typeAcquisition, files: o.fileNames, raw: o.raw, errors: b$([...r.parseDiagnostics, ...o.errors], `\r
+`)
+                                }
+                            })
+                        } getDefaultCompilationSettings() { return this.forwardJSONCall("getDefaultCompilationSettings()", () => d5()) } discoverTypings(e) { let t = Dl(!1); return this.forwardJSONCall("discoverTypings()", () => { let r = JSON.parse(e); return this.safeList === void 0 && (this.safeList = QT.loadSafeList(this.host, Ts(r.safeListPath, r.safeListPath, t))), QT.discoverTypings(this.host, i => this.logger.log(i), r.fileNames, Ts(r.projectRootPath, r.projectRootPath, t), this.safeList, r.packageNameToTypingLocation, r.typeAcquisition, r.unresolvedImports, r.typesRegistry, Cp) }) }
+                    }, eve = class { constructor() { this._shims = [] } getServicesVersion() { return m$ } createLanguageServiceShim(e) { try { this.documentRegistry === void 0 && (this.documentRegistry = VY(e.useCaseSensitiveFileNames && e.useCaseSensitiveFileNames(), e.getCurrentDirectory())); let t = new T$(e), r = Bye(t, this.documentRegistry, !1); return new $ye(this, e, r) } catch (t) { throw y5(e, t), t } } createClassifierShim(e) { try { return new Qye(this, e) } catch (t) { throw y5(e, t), t } } createCoreServicesShim(e) { try { let t = new S$(e); return new Zye(this, e, t) } catch (t) { throw y5(e, t), t } } close() { Om(this._shims), this.documentRegistry = void 0 } registerShim(e) { this._shims.push(e) } unregisterShim(e) { for (let t = 0; t < this._shims.length; t++)if (this._shims[t] === e) { delete this._shims[t]; return } throw new Error("Invalid operation") } }
+                }
+            }); function v3e(e, t) { if (e.isDeclarationFile) return; let r = Vi(e, t), i = e.getLineAndCharacterOfPosition(t).line; if (e.getLineAndCharacterOfPosition(r.getStart(e)).line > i) { let v = el(r.pos, e); if (!v || e.getLineAndCharacterOfPosition(v.getEnd()).line !== i) return; r = v } if (r.flags & 16777216) return; return m(r); function o(v, S) { let x = HS(v) ? dA(v.modifiers, du) : void 0, A = x ? xo(e.text, x.end) : v.getStart(e); return Wc(A, (S || v).getEnd()) } function s(v, S) { return o(v, t1(S, S.parent, e)) } function l(v, S) { return v && i === e.getLineAndCharacterOfPosition(v.getStart(e)).line ? m(v) : m(S) } function f(v, S, x) { if (v) { let A = v.indexOf(S); if (A >= 0) { let w = A, C = A + 1; for (; w > 0 && x(v[w - 1]);)w--; for (; C < v.length && x(v[C]);)C++; return Wc(xo(e.text, v[w].pos), v[C - 1].end) } } return o(S) } function d(v) { return m(el(v.pos, e)) } function g(v) { return m(t1(v, v.parent, e)) } function m(v) { if (v) { let { parent: X } = v; switch (v.kind) { case 240: return x(v.declarationList.declarations[0]); case 257: case 169: case 168: return x(v); case 166: return w(v); case 259: case 171: case 170: case 174: case 175: case 173: case 215: case 216: return P(v); case 238: if (bT(v)) return F(v); case 265: return B(v); case 295: return B(v.block); case 241: return o(v.expression); case 250: return o(v.getChildAt(0), v.expression); case 244: return s(v, v.expression); case 243: return m(v.statement); case 256: return o(v.getChildAt(0)); case 242: return s(v, v.expression); case 253: return m(v.statement); case 249: case 248: return o(v.getChildAt(0), v.label); case 245: return W(v); case 246: return s(v, v.expression); case 247: return q(v); case 252: return s(v, v.expression); case 292: case 293: return m(v.statements[0]); case 255: return B(v.tryBlock); case 254: return o(v, v.expression); case 274: return o(v, v.expression); case 268: return o(v, v.moduleReference); case 269: return o(v, v.moduleSpecifier); case 275: return o(v, v.moduleSpecifier); case 264: if (Gh(v) !== 1) return; case 260: case 263: case 302: case 205: return o(v); case 251: return m(v.statement); case 167: return f(X.modifiers, v, du); case 203: case 204: return Y(v); case 261: case 262: return; case 26: case 1: return l(el(v.pos, e)); case 27: return d(v); case 18: return ie(v); case 19: return $(v); case 23: return fe(v); case 20: return Z(v); case 21: return U(v); case 58: return re(v); case 31: case 29: return le(v); case 115: return _e(v); case 91: case 83: case 96: return g(v); case 162: return ge(v); default: if (qg(v)) return R(v); if ((v.kind === 79 || v.kind === 227 || v.kind === 299 || v.kind === 300) && qg(X)) return o(v); if (v.kind === 223) { let { left: Ve, operatorToken: we } = v; if (qg(Ve)) return R(Ve); if (we.kind === 63 && qg(v.parent)) return o(v); if (we.kind === 27) return m(Ve) } if (Dh(v)) switch (X.kind) { case 243: return d(v); case 167: return m(v.parent); case 245: case 247: return o(v); case 223: if (v.parent.operatorToken.kind === 27) return o(v); break; case 216: if (v.parent.body === v) return o(v); break }switch (v.parent.kind) { case 299: if (v.parent.name === v && !qg(v.parent.parent)) return m(v.parent.initializer); break; case 213: if (v.parent.type === v) return g(v.parent.type); break; case 257: case 166: { let { initializer: Ve, type: we } = v.parent; if (Ve === v || we === v || Mg(v.kind)) return d(v); break } case 223: { let { left: Ve } = v.parent; if (qg(Ve) && v !== Ve) return d(v); break } default: if (Ia(v.parent) && v.parent.type === v) return d(v) }return m(v.parent) } } function S(X) { return pu(X.parent) && X.parent.declarations[0] === X ? o(el(X.pos, e, X.parent), X) : o(X) } function x(X) { if (X.parent.parent.kind === 246) return m(X.parent.parent); let Ve = X.parent; if (La(X.name)) return Y(X.name); if (mT(X) && X.initializer || Mr(X, 1) || Ve.parent.kind === 247) return S(X); if (pu(X.parent) && X.parent.declarations[0] !== X) return m(el(X.pos, e, X.parent)) } function A(X) { return !!X.initializer || X.dotDotDotToken !== void 0 || Mr(X, 12) } function w(X) { if (La(X.name)) return Y(X.name); if (A(X)) return o(X); { let Ve = X.parent, we = Ve.parameters.indexOf(X); return L.assert(we !== -1), we !== 0 ? w(Ve.parameters[we - 1]) : m(Ve.body) } } function C(X) { return Mr(X, 1) || X.parent.kind === 260 && X.kind !== 173 } function P(X) { if (X.body) return C(X) ? o(X) : m(X.body) } function F(X) { let Ve = X.statements.length ? X.statements[0] : X.getLastToken(); return C(X.parent) ? l(X.parent, Ve) : m(Ve) } function B(X) { switch (X.parent.kind) { case 264: if (Gh(X.parent) !== 1) return; case 244: case 242: case 246: return l(X.parent, X.statements[0]); case 245: case 247: return l(el(X.pos, e, X.parent), X.statements[0]) }return m(X.statements[0]) } function q(X) { if (X.initializer.kind === 258) { let Ve = X.initializer; if (Ve.declarations.length > 0) return m(Ve.declarations[0]) } else return m(X.initializer) } function W(X) { if (X.initializer) return q(X); if (X.condition) return o(X.condition); if (X.incrementor) return o(X.incrementor) } function Y(X) { let Ve = mn(X.elements, we => we.kind !== 229 ? we : void 0); return Ve ? m(Ve) : X.parent.kind === 205 ? o(X.parent) : S(X.parent) } function R(X) { L.assert(X.kind !== 204 && X.kind !== 203); let Ve = X.kind === 206 ? X.elements : X.properties, we = mn(Ve, ke => ke.kind !== 229 ? ke : void 0); return we ? m(we) : o(X.parent.kind === 223 ? X.parent : X) } function ie(X) { switch (X.parent.kind) { case 263: let Ve = X.parent; return l(el(X.pos, e, X.parent), Ve.members.length ? Ve.members[0] : Ve.getLastToken(e)); case 260: let we = X.parent; return l(el(X.pos, e, X.parent), we.members.length ? we.members[0] : we.getLastToken(e)); case 266: return l(X.parent.parent, X.parent.clauses[0]) }return m(X.parent) } function $(X) { switch (X.parent.kind) { case 265: if (Gh(X.parent.parent) !== 1) return; case 263: case 260: return o(X); case 238: if (bT(X.parent)) return o(X); case 295: return m(Os(X.parent.statements)); case 266: let Ve = X.parent, we = Os(Ve.clauses); return we ? m(Os(we.statements)) : void 0; case 203: let ke = X.parent; return m(Os(ke.elements) || ke); default: if (qg(X.parent)) { let Pe = X.parent; return o(Os(Pe.properties) || Pe) } return m(X.parent) } } function fe(X) { switch (X.parent.kind) { case 204: let Ve = X.parent; return o(Os(Ve.elements) || Ve); default: if (qg(X.parent)) { let we = X.parent; return o(Os(we.elements) || we) } return m(X.parent) } } function Z(X) { return X.parent.kind === 243 || X.parent.kind === 210 || X.parent.kind === 211 ? d(X) : X.parent.kind === 214 ? g(X) : m(X.parent) } function U(X) { switch (X.parent.kind) { case 215: case 259: case 216: case 171: case 170: case 174: case 175: case 173: case 244: case 243: case 245: case 247: case 210: case 211: case 214: return d(X); default: return m(X.parent) } } function re(X) { return Ia(X.parent) || X.parent.kind === 299 || X.parent.kind === 166 ? d(X) : m(X.parent) } function le(X) { return X.parent.kind === 213 ? g(X) : m(X.parent) } function _e(X) { return X.parent.kind === 243 ? s(X, X.parent.expression) : m(X.parent) } function ge(X) { return X.parent.kind === 247 ? g(X) : m(X.parent) } } } var b3e = gt({ "src/services/breakpoints.ts"() { "use strict"; Fr() } }), x$ = {}; Mo(x$, { spanInSourceFileAtLocation: () => v3e }); var E3e = gt({ "src/services/_namespaces/ts.BreakpointResolver.ts"() { "use strict"; b3e() } }); function T3e(e) { return (ms(e) || _u(e)) && zl(e) } function pk(e) { return (ms(e) || xs(e) || _u(e)) && wi(e.parent) && e === e.parent.initializer && Re(e.parent.name) && !!(G_(e.parent) & 2) } function tve(e) { return Li(e) || Tc(e) || Jc(e) || ms(e) || sl(e) || _u(e) || oc(e) || Nc(e) || zm(e) || p_(e) || Sf(e) } function nx(e) { return Li(e) || Tc(e) && Re(e.name) || Jc(e) || sl(e) || oc(e) || Nc(e) || zm(e) || p_(e) || Sf(e) || T3e(e) || pk(e) } function nve(e) { return Li(e) ? e : zl(e) ? e.name : pk(e) ? e.parent.name : L.checkDefined(e.modifiers && wr(e.modifiers, rve)) } function rve(e) { return e.kind === 88 } function ive(e, t) { let r = nve(t); return r && e.getSymbolAtLocation(r) } function S3e(e, t) { if (Li(t)) return { text: t.fileName, pos: 0, end: 0 }; if ((Jc(t) || sl(t)) && !zl(t)) { let o = t.modifiers && wr(t.modifiers, rve); if (o) return { text: "default", pos: o.getStart(), end: o.getEnd() } } if (oc(t)) { let o = t.getSourceFile(), s = xo(o.text, yp(t).pos), l = s + 6, f = e.getTypeChecker(), d = f.getSymbolAtLocation(t.parent); return { text: `${d ? `${f.symbolToString(d, t.parent)} ` : ""}static {}`, pos: s, end: l } } let r = pk(t) ? t.parent.name : L.checkDefined(sa(t), "Expected call hierarchy item to have a name"), i = Re(r) ? vr(r) : yf(r) ? r.text : ts(r) && yf(r.expression) ? r.expression.text : void 0; if (i === void 0) { let o = e.getTypeChecker(), s = o.getSymbolAtLocation(r); s && (i = o.symbolToString(s, t)) } if (i === void 0) { let o = fN(); i = SI(s => o.writeNode(4, t, t.getSourceFile(), s)) } return { text: i, pos: r.getStart(), end: r.getEnd() } } function x3e(e) { var t, r; if (pk(e)) return Tp(e.parent.parent.parent.parent) && Re(e.parent.parent.parent.parent.parent.name) ? e.parent.parent.parent.parent.parent.name.getText() : void 0; switch (e.kind) { case 174: case 175: case 171: return e.parent.kind === 207 ? (t = xj(e.parent)) == null ? void 0 : t.getText() : (r = sa(e.parent)) == null ? void 0 : r.getText(); case 259: case 260: case 264: if (Tp(e.parent) && Re(e.parent.parent.name)) return e.parent.parent.name.getText() } } function ave(e, t) { if (t.body) return t; if (Ec(t)) return Vm(t.parent); if (Jc(t) || Nc(t)) { let r = ive(e, t); return r && r.valueDeclaration && Ds(r.valueDeclaration) && r.valueDeclaration.body ? r.valueDeclaration : void 0 } return t } function ove(e, t) { let r = ive(e, t), i; if (r && r.declarations) { let o = jD(r.declarations), s = on(r.declarations, d => ({ file: d.getSourceFile().fileName, pos: d.pos })); o.sort((d, g) => su(s[d].file, s[g].file) || s[d].pos - s[g].pos); let l = on(o, d => r.declarations[d]), f; for (let d of l) nx(d) && ((!f || f.parent !== d.parent || f.end !== d.pos) && (i = Sn(i, d)), f = d) } return i } function E5(e, t) { var r, i, o; return oc(t) ? t : Ds(t) ? (i = (r = ave(e, t)) != null ? r : ove(e, t)) != null ? i : t : (o = ove(e, t)) != null ? o : t } function sve(e, t) { let r = e.getTypeChecker(), i = !1; for (; ;) { if (nx(t)) return E5(r, t); if (tve(t)) { let o = jn(t, nx); return o && E5(r, o) } if (Rh(t)) { if (nx(t.parent)) return E5(r, t.parent); if (tve(t.parent)) { let o = jn(t.parent, nx); return o && E5(r, o) } return wi(t.parent) && t.parent.initializer && pk(t.parent.initializer) ? t.parent.initializer : void 0 } if (Ec(t)) return nx(t.parent) ? t.parent : void 0; if (t.kind === 124 && oc(t.parent)) { t = t.parent; continue } if (wi(t) && t.initializer && pk(t.initializer)) return t.initializer; if (!i) { let o = r.getSymbolAtLocation(t); if (o && (o.flags & 2097152 && (o = r.getAliasedSymbol(o)), o.valueDeclaration)) { i = !0, t = o.valueDeclaration; continue } } return } } function A$(e, t) { let r = t.getSourceFile(), i = S3e(e, t), o = x3e(t), s = aE(t), l = rk(t), f = Wc(xo(r.text, t.getFullStart(), !1, !0), t.getEnd()), d = Wc(i.pos, i.end); return { file: r.fileName, kind: s, kindModifiers: l, name: i.text, containerName: o, span: f, selectionSpan: d } } function A3e(e) { return e !== void 0 } function C3e(e) { if (e.kind === js.EntryKind.Node) { let { node: t } = e; if (PX(t, !0, !0) || phe(t, !0, !0) || mhe(t, !0, !0) || hhe(t, !0, !0) || j2(t) || BX(t)) { let r = t.getSourceFile(); return { declaration: jn(t, nx) || r, range: nY(t, r) } } } } function cve(e) { return zo(e.declaration) } function I3e(e, t) { return { from: e, fromSpans: t } } function L3e(e, t) { return I3e(A$(e, t[0].declaration), on(t, r => lv(r.range))) } function k3e(e, t, r) { if (Li(t) || Tc(t) || oc(t)) return []; let i = nve(t), o = Pr(js.findReferenceOrRenameEntries(e, r, e.getSourceFiles(), i, 0, { use: js.FindReferencesUse.References }, C3e), A3e); return o ? YC(o, cve, s => L3e(e, s)) : [] } function D3e(e, t) { function r(o) { let s = PT(o) ? o.tag : Au(o) ? o.tagName : Us(o) || oc(o) ? o : o.expression, l = sve(e, s); if (l) { let f = nY(s, o.getSourceFile()); if (ba(l)) for (let d of l) t.push({ declaration: d, range: f }); else t.push({ declaration: l, range: f }) } } function i(o) { if (o && !(o.flags & 16777216)) { if (nx(o)) { if (Yr(o)) for (let s of o.members) s.name && ts(s.name) && i(s.name.expression); return } switch (o.kind) { case 79: case 268: case 269: case 275: case 261: case 262: return; case 172: r(o); return; case 213: case 231: i(o.expression); return; case 257: case 166: i(o.name), i(o.initializer); return; case 210: r(o), i(o.expression), mn(o.arguments, i); return; case 211: r(o), i(o.expression), mn(o.arguments, i); return; case 212: r(o), i(o.tag), i(o.template); return; case 283: case 282: r(o), i(o.tagName), i(o.attributes); return; case 167: r(o), i(o.expression); return; case 208: case 209: r(o), pa(o, i); break; case 235: i(o.expression); return }Gm(o) || pa(o, i) } } return i } function w3e(e, t) { mn(e.statements, t) } function R3e(e, t) { !Mr(e, 2) && e.body && Tp(e.body) && mn(e.body.statements, t) } function O3e(e, t, r) { let i = ave(e, t); i && (mn(i.parameters, r), r(i.body)) } function N3e(e, t) { t(e.body) } function P3e(e, t) { mn(e.modifiers, t); let r = P0(e); r && t(r.expression); for (let i of e.members) g_(i) && mn(i.modifiers, t), Na(i) ? t(i.initializer) : Ec(i) && i.body ? (mn(i.parameters, t), t(i.body)) : oc(i) && t(i) } function M3e(e, t) { let r = [], i = D3e(e, r); switch (t.kind) { case 308: w3e(t, i); break; case 264: R3e(t, i); break; case 259: case 215: case 216: case 171: case 174: case 175: O3e(e.getTypeChecker(), t, i); break; case 260: case 228: P3e(t, i); break; case 172: N3e(t, i); break; default: L.assertNever(t) }return r } function F3e(e, t) { return { to: e, fromSpans: t } } function G3e(e, t) { return F3e(A$(e, t[0].declaration), on(t, r => lv(r.range))) } function B3e(e, t) { return t.flags & 16777216 || zm(t) ? [] : YC(M3e(e, t), cve, r => G3e(e, r)) } var U3e = gt({ "src/services/callHierarchy.ts"() { "use strict"; Fr() } }), rx = {}; Mo(rx, { createCallHierarchyItem: () => A$, getIncomingCalls: () => k3e, getOutgoingCalls: () => B3e, resolveCallHierarchyDeclaration: () => sve }); var V3e = gt({ "src/services/_namespaces/ts.CallHierarchy.ts"() { "use strict"; U3e() } }); function j3e(e, t, r, i) { let o = lve(e, t, r, i); L.assert(o.spans.length % 3 === 0); let s = o.spans, l = []; for (let f = 0; f < s.length; f += 3)l.push({ textSpan: il(s[f], s[f + 1]), classificationType: s[f + 2] }); return l } function lve(e, t, r, i) { return { spans: H3e(e, r, i, t), endOfLineState: 0 } } function H3e(e, t, r, i) { let o = []; return e && t && W3e(e, t, r, (l, f, d) => { o.push(l.getStart(t), l.getWidth(t), (f + 1 << 8) + d) }, i), o } function W3e(e, t, r, i, o) { let s = e.getTypeChecker(), l = !1; function f(d) { switch (d.kind) { case 264: case 260: case 261: case 259: case 228: case 215: case 216: o.throwIfCancellationRequested() }if (!d || !$8(r, d.pos, d.getFullWidth()) || d.getFullWidth() === 0) return; let g = l; if ((Hg(d) || FS(d)) && (l = !0), AL(d) && (l = !1), Re(d) && !l && !q3e(d) && !cL(d.escapedText)) { let m = s.getSymbolAtLocation(d); if (m) { m.flags & 2097152 && (m = s.getAliasedSymbol(m)); let v = z3e(m, ZT(d)); if (v !== void 0) { let S = 0; d.parent && (Wo(d.parent) || k$.get(d.parent.kind) === v) && d.parent.name === d && (S = 1), v === 6 && dve(d) && (v = 9), v = J3e(s, d, v); let x = m.valueDeclaration; if (x) { let A = wg(x), w = G_(x); A & 32 && (S |= 2), A & 512 && (S |= 4), v !== 0 && v !== 2 && (A & 64 || w & 2 || m.getFlags() & 8) && (S |= 8), (v === 7 || v === 10) && K3e(x, t) && (S |= 32), e.isSourceFileDefaultLibrary(x.getSourceFile()) && (S |= 16) } else m.declarations && m.declarations.some(A => e.isSourceFileDefaultLibrary(A.getSourceFile())) && (S |= 16); i(d, v, S) } } } pa(d, f), l = g } f(t) } function z3e(e, t) { let r = e.getFlags(); if (r & 32) return 0; if (r & 384) return 1; if (r & 524288) return 5; if (r & 64) { if (t & 2) return 2 } else if (r & 262144) return 4; let i = e.valueDeclaration || e.declarations && e.declarations[0]; return i && Wo(i) && (i = uve(i)), i && k$.get(i.kind) } function J3e(e, t, r) { if (r === 7 || r === 9 || r === 6) { let i = e.getTypeAtLocation(t); if (i) { let o = s => s(i) || i.isUnion() && i.types.some(s); if (r !== 6 && o(s => s.getConstructSignatures().length > 0)) return 0; if (o(s => s.getCallSignatures().length > 0) && !o(s => s.getProperties().length > 0) || X3e(t)) return r === 9 ? 11 : 10 } } return r } function K3e(e, t) { return Wo(e) && (e = uve(e)), wi(e) ? (!Li(e.parent.parent.parent) || E2(e.parent)) && e.getSourceFile() === t : Jc(e) ? !Li(e.parent) && e.getSourceFile() === t : !1 } function uve(e) { for (; ;)if (Wo(e.parent.parent)) e = e.parent.parent; else return e.parent.parent } function q3e(e) { let t = e.parent; return t && (lm(t) || $u(t) || nv(t)) } function X3e(e) { for (; dve(e);)e = e.parent; return Pa(e.parent) && e.parent.expression === e } function dve(e) { return Yu(e.parent) && e.parent.right === e || br(e.parent) && e.parent.name === e } var C$, I$, L$, k$, Y3e = gt({ "src/services/classifier2020.ts"() { "use strict"; Fr(), C$ = (e => (e[e.typeOffset = 8] = "typeOffset", e[e.modifierMask = 255] = "modifierMask", e))(C$ || {}), I$ = (e => (e[e.class = 0] = "class", e[e.enum = 1] = "enum", e[e.interface = 2] = "interface", e[e.namespace = 3] = "namespace", e[e.typeParameter = 4] = "typeParameter", e[e.type = 5] = "type", e[e.parameter = 6] = "parameter", e[e.variable = 7] = "variable", e[e.enumMember = 8] = "enumMember", e[e.property = 9] = "property", e[e.function = 10] = "function", e[e.member = 11] = "member", e))(I$ || {}), L$ = (e => (e[e.declaration = 0] = "declaration", e[e.static = 1] = "static", e[e.async = 2] = "async", e[e.readonly = 3] = "readonly", e[e.defaultLibrary = 4] = "defaultLibrary", e[e.local = 5] = "local", e))(L$ || {}), k$ = new Map([[257, 7], [166, 6], [169, 9], [264, 3], [263, 1], [302, 8], [260, 0], [171, 11], [259, 10], [215, 10], [170, 11], [174, 9], [175, 9], [168, 9], [261, 2], [262, 5], [165, 4], [299, 9], [300, 9]]) } }), fve = {}; Mo(fve, { TokenEncodingConsts: () => C$, TokenModifier: () => L$, TokenType: () => I$, getEncodedSemanticClassifications: () => lve, getSemanticClassifications: () => j3e }); var $3e = gt({ "src/services/_namespaces/ts.classifier.v2020.ts"() { "use strict"; Y3e() } }), T5 = {}; Mo(T5, { v2020: () => fve }); var Q3e = gt({ "src/services/_namespaces/ts.classifier.ts"() { "use strict"; $3e() } }); function K_(e, t, r) { return w$(e, ZS(r), t, void 0, void 0) } function Ma(e, t, r, i, o, s) { return w$(e, ZS(r), t, i, ZS(o), s) } function D$(e, t, r, i, o, s) { return w$(e, ZS(r), t, i, o && ZS(o), s) } function w$(e, t, r, i, o, s) { return { fixName: e, description: t, changes: r, fixId: i, fixAllDescription: o, commands: s ? [s] : void 0 } } function za(e) { for (let t of e.errorCodes) S5.add(String(t), e); if (e.fixIds) for (let t of e.fixIds) L.assert(!x5.has(t)), x5.set(t, e) } function Z3e() { return lo(S5.keys()) } function eFe(e, t) { let { errorCodes: r } = e, i = 0; for (let s of t) if (ya(r, s.code) && i++, i > 1) break; let o = i < 2; return ({ fixId: s, fixAllDescription: l, ...f }) => o ? f : { ...f, fixId: s, fixAllDescription: l } } function tFe(e) { let t = pve(e), r = S5.get(String(e.errorCode)); return Uo(r, i => on(i.getCodeActions(e), eFe(i, t))) } function nFe(e) { return x5.get(Ga(e.fixId, Ta)).getAllCodeActions(e) } function ix(e, t) { return { changes: e, commands: t } } function _ve(e, t) { return { fileName: e, textChanges: t } } function ns(e, t, r) { let i = [], o = nr.ChangeTracker.with(e, s => ax(e, t, l => r(s, l, i))); return ix(o, i.length === 0 ? void 0 : i) } function ax(e, t, r) { for (let i of pve(e)) ya(t, i.code) && r(i) } function pve({ program: e, sourceFile: t, cancellationToken: r }) { return [...e.getSemanticDiagnostics(t, r), ...e.getSyntacticDiagnostics(t, r), ...$Y(t, e, r)] } var S5, x5, rFe = gt({ "src/services/codeFixProvider.ts"() { "use strict"; Fr(), S5 = Nf(), x5 = new Map } }); function mve(e, t, r) { let i = fO(r) ? D.createAsExpression(r.expression, D.createKeywordTypeNode(157)) : D.createTypeAssertion(D.createKeywordTypeNode(157), r.expression); e.replaceNode(t, r.expression, i) } function hve(e, t) { if (!Yn(e)) return jn(Vi(e, t), r => fO(r) || Fue(r)) } var A5, R$, iFe = gt({ "src/services/codefixes/addConvertToUnknownForNonOverlappingTypes.ts"() { "use strict"; Fr(), Qa(), A5 = "addConvertToUnknownForNonOverlappingTypes", R$ = [_.Conversion_of_type_0_to_type_1_may_be_a_mistake_because_neither_type_sufficiently_overlaps_with_the_other_If_this_was_intentional_convert_the_expression_to_unknown_first.code], za({ errorCodes: R$, getCodeActions: function (t) { let r = hve(t.sourceFile, t.span.start); if (r === void 0) return; let i = nr.ChangeTracker.with(t, o => mve(o, t.sourceFile, r)); return [Ma(A5, i, _.Add_unknown_conversion_for_non_overlapping_types, A5, _.Add_unknown_to_all_conversions_of_non_overlapping_types)] }, fixIds: [A5], getAllCodeActions: e => ns(e, R$, (t, r) => { let i = hve(r.file, r.start); i && mve(t, r.file, i) }) }) } }), aFe = gt({ "src/services/codefixes/addEmptyExportDeclaration.ts"() { "use strict"; Fr(), Qa(), za({ errorCodes: [_.await_expressions_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_has_no_imports_or_exports_Consider_adding_an_empty_export_to_make_this_file_a_module.code, _.for_await_loops_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_has_no_imports_or_exports_Consider_adding_an_empty_export_to_make_this_file_a_module.code], getCodeActions: function (t) { let { sourceFile: r } = t, i = nr.ChangeTracker.with(t, o => { let s = D.createExportDeclaration(void 0, !1, D.createNamedExports([]), void 0); o.insertNodeAtEndOfScope(r, r, s) }); return [K_("addEmptyExportDeclaration", i, _.Add_export_to_make_this_file_into_a_module)] } }) } }); function gve(e, t, r, i) { let o = r(s => oFe(s, e.sourceFile, t, i)); return Ma(C5, o, _.Add_async_modifier_to_containing_function, C5, _.Add_all_missing_async_modifiers) } function oFe(e, t, r, i) { if (i && i.has(zo(r))) return; i?.add(zo(r)); let o = D.updateModifiers(cc(r, !0), D.createNodeArray(D.createModifiersFromModifierFlags(Yy(r) | 512))); e.replaceNode(t, r, o) } function yve(e, t) { if (!t) return; let r = Vi(e, t.start); return jn(r, o => o.getStart(e) < t.start || o.getEnd() > wl(t) ? "quit" : (xs(o) || Nc(o) || ms(o) || Jc(o)) && J2(t, Du(o, e))) } function sFe(e, t) { return ({ start: r, length: i, relatedInformation: o, code: s }) => Cg(r) && Cg(i) && J2({ start: r, length: i }, e) && s === t && !!o && vt(o, l => l.code === _.Did_you_mean_to_mark_this_function_as_async.code) } var C5, O$, cFe = gt({ "src/services/codefixes/addMissingAsync.ts"() { "use strict"; Fr(), Qa(), C5 = "addMissingAsync", O$ = [_.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code, _.Type_0_is_not_assignable_to_type_1.code, _.Type_0_is_not_comparable_to_type_1.code], za({ fixIds: [C5], errorCodes: O$, getCodeActions: function (t) { let { sourceFile: r, errorCode: i, cancellationToken: o, program: s, span: l } = t, f = wr(s.getTypeChecker().getDiagnostics(r, o), sFe(l, i)), d = f && f.relatedInformation && wr(f.relatedInformation, v => v.code === _.Did_you_mean_to_mark_this_function_as_async.code), g = yve(r, d); return g ? [gve(t, g, v => nr.ChangeTracker.with(t, v))] : void 0 }, getAllCodeActions: e => { let { sourceFile: t } = e, r = new Set; return ns(e, O$, (i, o) => { let s = o.relatedInformation && wr(o.relatedInformation, d => d.code === _.Did_you_mean_to_mark_this_function_as_async.code), l = yve(t, s); return l ? gve(e, l, d => (d(i), []), r) : void 0 }) } }) } }); function vve(e, t, r, i, o) { let s = IY(e, r); return s && lFe(e, t, r, i, o) && Tve(s) ? s : void 0 } function bve(e, t, r, i, o, s) { let { sourceFile: l, program: f, cancellationToken: d } = e, g = uFe(t, l, d, f, i); if (g) { let m = o(v => { mn(g.initializers, ({ expression: S }) => N$(v, r, l, i, S, s)), s && g.needsSecondPassForFixAll && N$(v, r, l, i, t, s) }); return K_("addMissingAwaitToInitializer", m, g.initializers.length === 1 ? [_.Add_await_to_initializer_for_0, g.initializers[0].declarationSymbol.name] : _.Add_await_to_initializers) } } function Eve(e, t, r, i, o, s) { let l = o(f => N$(f, r, e.sourceFile, i, t, s)); return Ma(I5, l, _.Add_await, I5, _.Fix_all_expressions_possibly_missing_await) } function lFe(e, t, r, i, o) { let l = o.getTypeChecker().getDiagnostics(e, i); return vt(l, ({ start: f, length: d, relatedInformation: g, code: m }) => Cg(f) && Cg(d) && J2({ start: f, length: d }, r) && m === t && !!g && vt(g, v => v.code === _.Did_you_forget_to_use_await.code)) } function uFe(e, t, r, i, o) { let s = dFe(e, o); if (!s) return; let l = s.isCompleteFix, f; for (let d of s.identifiers) { let g = o.getSymbolAtLocation(d); if (!g) continue; let m = zr(g.valueDeclaration, wi), v = m && zr(m.name, Re), S = cb(m, 240); if (!m || !S || m.type || !m.initializer || S.getSourceFile() !== t || Mr(S, 1) || !v || !Tve(m.initializer)) { l = !1; continue } let x = i.getSemanticDiagnostics(t, r); if (js.Core.eachSymbolReferenceInFile(v, o, t, w => d !== w && !fFe(w, x, t, o))) { l = !1; continue } (f || (f = [])).push({ expression: m.initializer, declarationSymbol: g }) } return f && { initializers: f, needsSecondPassForFixAll: !l } } function dFe(e, t) { if (br(e.parent) && Re(e.parent.expression)) return { identifiers: [e.parent.expression], isCompleteFix: !0 }; if (Re(e)) return { identifiers: [e], isCompleteFix: !0 }; if (ar(e)) { let r, i = !0; for (let o of [e.left, e.right]) { let s = t.getTypeAtLocation(o); if (t.getPromisedTypeOfPromise(s)) { if (!Re(o)) { i = !1; continue } (r || (r = [])).push(o) } } return r && { identifiers: r, isCompleteFix: i } } } function fFe(e, t, r, i) { let o = br(e.parent) ? e.parent.name : ar(e.parent) ? e.parent : e, s = wr(t, l => l.start === o.getStart(r) && l.start + l.length === o.getEnd()); return s && ya(L5, s.code) || i.getTypeAtLocation(o).flags & 1 } function Tve(e) { return e.kind & 32768 || !!jn(e, t => t.parent && xs(t.parent) && t.parent.body === t || Va(t) && (t.parent.kind === 259 || t.parent.kind === 215 || t.parent.kind === 216 || t.parent.kind === 171)) } function N$(e, t, r, i, o, s) { if (_O(o.parent) && !o.parent.awaitModifier) { let l = i.getTypeAtLocation(o), f = i.getAsyncIterableType(); if (f && i.isTypeAssignableTo(l, f)) { let d = o.parent; e.replaceNode(r, d, D.updateForOfStatement(d, D.createToken(133), d.initializer, d.expression, d.statement)); return } } if (ar(o)) for (let l of [o.left, o.right]) { if (s && Re(l)) { let g = i.getSymbolAtLocation(l); if (g && s.has($a(g))) continue } let f = i.getTypeAtLocation(l), d = i.getPromisedTypeOfPromise(f) ? D.createAwaitExpression(l) : l; e.replaceNode(r, l, d) } else if (t === P$ && br(o.parent)) { if (s && Re(o.parent.expression)) { let l = i.getSymbolAtLocation(o.parent.expression); if (l && s.has($a(l))) return } e.replaceNode(r, o.parent.expression, D.createParenthesizedExpression(D.createAwaitExpression(o.parent.expression))), Sve(e, o.parent.expression, r) } else if (ya(M$, t) && Ih(o.parent)) { if (s && Re(o)) { let l = i.getSymbolAtLocation(o); if (l && s.has($a(l))) return } e.replaceNode(r, o, D.createParenthesizedExpression(D.createAwaitExpression(o))), Sve(e, o, r) } else { if (s && wi(o.parent) && Re(o.parent.name)) { let l = i.getSymbolAtLocation(o.parent.name); if (l && !_0(s, $a(l))) return } e.replaceNode(r, o, D.createAwaitExpression(o)) } } function Sve(e, t, r) { let i = el(t.pos, r); i && N7(i.end, i.parent, r) && e.insertText(r, t.getStart(r), ";") } var I5, P$, M$, L5, _Fe = gt({ "src/services/codefixes/addMissingAwait.ts"() { "use strict"; Fr(), Qa(), I5 = "addMissingAwait", P$ = _.Property_0_does_not_exist_on_type_1.code, M$ = [_.This_expression_is_not_callable.code, _.This_expression_is_not_constructable.code], L5 = [_.An_arithmetic_operand_must_be_of_type_any_number_bigint_or_an_enum_type.code, _.The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type.code, _.The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type.code, _.Operator_0_cannot_be_applied_to_type_1.code, _.Operator_0_cannot_be_applied_to_types_1_and_2.code, _.This_comparison_appears_to_be_unintentional_because_the_types_0_and_1_have_no_overlap.code, _.This_condition_will_always_return_true_since_this_0_is_always_defined.code, _.Type_0_is_not_an_array_type.code, _.Type_0_is_not_an_array_type_or_a_string_type.code, _.Type_0_can_only_be_iterated_through_when_using_the_downlevelIteration_flag_or_with_a_target_of_es2015_or_higher.code, _.Type_0_is_not_an_array_type_or_a_string_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator.code, _.Type_0_is_not_an_array_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator.code, _.Type_0_must_have_a_Symbol_iterator_method_that_returns_an_iterator.code, _.Type_0_must_have_a_Symbol_asyncIterator_method_that_returns_an_async_iterator.code, _.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code, P$, ...M$], za({ fixIds: [I5], errorCodes: L5, getCodeActions: function (t) { let { sourceFile: r, errorCode: i, span: o, cancellationToken: s, program: l } = t, f = vve(r, i, o, s, l); if (!f) return; let d = t.program.getTypeChecker(), g = m => nr.ChangeTracker.with(t, m); return WD([bve(t, f, i, d, g), Eve(t, f, i, d, g)]) }, getAllCodeActions: e => { let { sourceFile: t, program: r, cancellationToken: i } = e, o = e.program.getTypeChecker(), s = new Set; return ns(e, L5, (l, f) => { let d = vve(t, f.code, f, i, r); if (!d) return; let g = m => (m(l), []); return bve(e, d, f.code, o, g, s) || Eve(e, d, f.code, o, g, s) }) } }) } }); function xve(e, t, r, i, o) { let s = Vi(t, r), l = jn(s, g => CA(g.parent) ? g.parent.initializer === g : pFe(g) ? !1 : "quit"); if (l) return k5(e, l, t, o); let f = s.parent; if (ar(f) && f.operatorToken.kind === 63 && Ol(f.parent)) return k5(e, s, t, o); if (fu(f)) { let g = i.getTypeChecker(); return Ji(f.elements, m => mFe(m, g)) ? k5(e, f, t, o) : void 0 } let d = jn(s, g => Ol(g.parent) ? !0 : hFe(g) ? !1 : "quit"); if (d) { let g = i.getTypeChecker(); return Ave(d, g) ? k5(e, d, t, o) : void 0 } } function k5(e, t, r, i) { (!i || _0(i, t)) && e.insertModifierBefore(r, 85, t) } function pFe(e) { switch (e.kind) { case 79: case 206: case 207: case 299: case 300: return !0; default: return !1 } } function mFe(e, t) { let r = Re(e) ? e : Iu(e, !0) && Re(e.left) ? e.left : void 0; return !!r && !t.getSymbolAtLocation(r) } function hFe(e) { switch (e.kind) { case 79: case 223: case 27: return !0; default: return !1 } } function Ave(e, t) { return ar(e) ? e.operatorToken.kind === 27 ? Ji([e.left, e.right], r => Ave(r, t)) : e.operatorToken.kind === 63 && Re(e.left) && !t.getSymbolAtLocation(e.left) : !1 } var D5, F$, gFe = gt({ "src/services/codefixes/addMissingConst.ts"() { "use strict"; Fr(), Qa(), D5 = "addMissingConst", F$ = [_.Cannot_find_name_0.code, _.No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer.code], za({ errorCodes: F$, getCodeActions: function (t) { let r = nr.ChangeTracker.with(t, i => xve(i, t.sourceFile, t.span.start, t.program)); if (r.length > 0) return [Ma(D5, r, _.Add_const_to_unresolved_variable, D5, _.Add_const_to_all_unresolved_variables)] }, fixIds: [D5], getAllCodeActions: e => { let t = new Set; return ns(e, F$, (r, i) => xve(r, i.file, i.start, e.program, t)) } }) } }); function Cve(e, t, r, i) { let o = Vi(t, r); if (!Re(o)) return; let s = o.parent; s.kind === 169 && (!i || _0(i, s)) && e.insertModifierBefore(t, 136, s) } var w5, G$, yFe = gt({ "src/services/codefixes/addMissingDeclareProperty.ts"() { "use strict"; Fr(), Qa(), w5 = "addMissingDeclareProperty", G$ = [_.Property_0_will_overwrite_the_base_property_in_1_If_this_is_intentional_add_an_initializer_Otherwise_add_a_declare_modifier_or_remove_the_redundant_declaration.code], za({ errorCodes: G$, getCodeActions: function (t) { let r = nr.ChangeTracker.with(t, i => Cve(i, t.sourceFile, t.span.start)); if (r.length > 0) return [Ma(w5, r, _.Prefix_with_declare, w5, _.Prefix_all_incorrect_property_declarations_with_declare)] }, fixIds: [w5], getAllCodeActions: e => { let t = new Set; return ns(e, G$, (r, i) => Cve(r, i.file, i.start, t)) } }) } }); function Ive(e, t, r) { let i = Vi(t, r), o = jn(i, du); L.assert(!!o, "Expected position to be owned by a decorator."); let s = D.createCallExpression(o.expression, void 0, void 0); e.replaceNode(t, o.expression, s) } var R5, B$, vFe = gt({ "src/services/codefixes/addMissingInvocationForDecorator.ts"() { "use strict"; Fr(), Qa(), R5 = "addMissingInvocationForDecorator", B$ = [_._0_accepts_too_few_arguments_to_be_used_as_a_decorator_here_Did_you_mean_to_call_it_first_and_write_0.code], za({ errorCodes: B$, getCodeActions: function (t) { let r = nr.ChangeTracker.with(t, i => Ive(i, t.sourceFile, t.span.start)); return [Ma(R5, r, _.Call_decorator_expression, R5, _.Add_to_all_uncalled_decorators)] }, fixIds: [R5], getAllCodeActions: e => ns(e, B$, (t, r) => Ive(t, r.file, r.start)) }) } }); function Lve(e, t, r) { let i = Vi(t, r), o = i.parent; if (!ha(o)) return L.fail("Tried to add a parameter name to a non-parameter: " + L.formatSyntaxKind(i.kind)); let s = o.parent.parameters.indexOf(o); L.assert(!o.type, "Tried to add a parameter name to a parameter that already had one."), L.assert(s > -1, "Parameter not found in parent parameter list."); let l = D.createTypeReferenceNode(o.name, void 0), f = D.createParameterDeclaration(o.modifiers, o.dotDotDotToken, "arg" + s, o.questionToken, o.dotDotDotToken ? D.createArrayTypeNode(l) : l, o.initializer); e.replaceNode(t, o, f) } var O5, U$, bFe = gt({ "src/services/codefixes/addNameToNamelessParameter.ts"() { "use strict"; Fr(), Qa(), O5 = "addNameToNamelessParameter", U$ = [_.Parameter_has_a_name_but_no_type_Did_you_mean_0_Colon_1.code], za({ errorCodes: U$, getCodeActions: function (t) { let r = nr.ChangeTracker.with(t, i => Lve(i, t.sourceFile, t.span.start)); return [Ma(O5, r, _.Add_parameter_name, O5, _.Add_names_to_all_parameters_without_names)] }, fixIds: [O5], getAllCodeActions: e => ns(e, U$, (t, r) => Lve(t, r.file, r.start)) }) } }); function EFe(e, t, r) { var i, o; let s = kve(IY(e, t), r); if (!s) return Je; let { source: l, target: f } = s, d = TFe(l, f, r) ? r.getTypeAtLocation(f.expression) : r.getTypeAtLocation(f); return (o = (i = d.symbol) == null ? void 0 : i.declarations) != null && o.some(g => Gn(g).fileName.match(/\.d\.ts$/)) ? Je : r.getExactOptionalProperties(d) } function TFe(e, t, r) { return br(t) && !!r.getExactOptionalProperties(r.getTypeAtLocation(t.expression)).length && r.getTypeAtLocation(e) === r.getUndefinedType() } function kve(e, t) { var r; if (e) { if (ar(e.parent) && e.parent.operatorToken.kind === 63) return { source: e.parent.right, target: e.parent.left }; if (wi(e.parent) && e.parent.initializer) return { source: e.parent.initializer, target: e.parent.name }; if (Pa(e.parent)) { let i = t.getSymbolAtLocation(e.parent.expression); if (!i?.valueDeclaration || !nS(i.valueDeclaration.kind) || !ot(e)) return; let o = e.parent.arguments.indexOf(e); if (o === -1) return; let s = i.valueDeclaration.parameters[o].name; if (Re(s)) return { source: e, target: s } } else if (yl(e.parent) && Re(e.parent.name) || xf(e.parent)) { let i = kve(e.parent.parent, t); if (!i) return; let o = t.getPropertyOfType(t.getTypeAtLocation(i.target), e.parent.name.text), s = (r = o?.declarations) == null ? void 0 : r[0]; return s ? { source: yl(e.parent) ? e.parent.initializer : e.parent.name, target: s } : void 0 } } else return } function SFe(e, t) { for (let r of t) { let i = r.valueDeclaration; if (i && ($d(i) || Na(i)) && i.type) { let o = D.createUnionTypeNode([...i.type.kind === 189 ? i.type.types : [i.type], D.createTypeReferenceNode("undefined")]); e.replaceNode(i.getSourceFile(), i.type, o) } } } var V$, Dve, xFe = gt({ "src/services/codefixes/addOptionalPropertyUndefined.ts"() { "use strict"; Fr(), Qa(), V$ = "addOptionalPropertyUndefined", Dve = [_.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_type_of_the_target.code, _.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties.code, _.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties.code], za({ errorCodes: Dve, getCodeActions(e) { let t = e.program.getTypeChecker(), r = EFe(e.sourceFile, e.span, t); if (!r.length) return; let i = nr.ChangeTracker.with(e, o => SFe(o, r)); return [K_(V$, i, _.Add_undefined_to_optional_property_type)] }, fixIds: [V$] }) } }); function wve(e, t) { let r = Vi(e, t); return zr(ha(r.parent) ? r.parent.parent : r.parent, Rve) } function Rve(e) { return AFe(e) && Ove(e) } function Ove(e) { return Ds(e) ? e.parameters.some(Ove) || !e.type && !!Aw(e) : !e.type && !!Vy(e) } function Nve(e, t, r) { if (Ds(r) && (Aw(r) || r.parameters.some(i => !!Vy(i)))) { if (!r.typeParameters) { let o = t4(r); o.length && e.insertTypeParameters(t, r, o) } let i = xs(r) && !Yo(r, 20, t); i && e.insertNodeBefore(t, Vo(r.parameters), D.createToken(20)); for (let o of r.parameters) if (!o.type) { let s = Vy(o); s && e.tryInsertTypeAnnotation(t, o, $e(s, Sb, bi)) } if (i && e.insertNodeAfter(t, To(r.parameters), D.createToken(21)), !r.type) { let o = Aw(r); o && e.tryInsertTypeAnnotation(t, r, $e(o, Sb, bi)) } } else { let i = L.checkDefined(Vy(r), "A JSDocType for this declaration should exist"); L.assert(!r.type, "The JSDocType decl should have a type"), e.tryInsertTypeAnnotation(t, r, $e(i, Sb, bi)) } } function AFe(e) { return Ds(e) || e.kind === 257 || e.kind === 168 || e.kind === 169 } function Sb(e) { switch (e.kind) { case 315: case 316: return D.createTypeReferenceNode("any", Je); case 319: return IFe(e); case 318: return Sb(e.type); case 317: return LFe(e); case 321: return kFe(e); case 320: return DFe(e); case 180: return RFe(e); case 325: return CFe(e); default: let t = xn(e, Sb, Bh); return Jn(t, 1), t } } function CFe(e) { let t = D.createTypeLiteralNode(on(e.jsDocPropertyTags, r => D.createPropertySignature(void 0, Re(r.name) ? r.name : r.name.right, zR(r) ? D.createToken(57) : void 0, r.typeExpression && $e(r.typeExpression.type, Sb, bi) || D.createKeywordTypeNode(131)))); return Jn(t, 1), t } function IFe(e) { return D.createUnionTypeNode([$e(e.type, Sb, bi), D.createTypeReferenceNode("undefined", Je)]) } function LFe(e) { return D.createUnionTypeNode([$e(e.type, Sb, bi), D.createTypeReferenceNode("null", Je)]) } function kFe(e) { return D.createArrayTypeNode($e(e.type, Sb, bi)) } function DFe(e) { var t; return D.createFunctionTypeNode(Je, e.parameters.map(wFe), (t = e.type) != null ? t : D.createKeywordTypeNode(131)) } function wFe(e) { let t = e.parent.parameters.indexOf(e), r = e.type.kind === 321 && t === e.parent.parameters.length - 1, i = e.name || (r ? "rest" : "arg" + t), o = r ? D.createToken(25) : e.dotDotDotToken; return D.createParameterDeclaration(e.modifiers, o, i, e.questionToken, $e(e.type, Sb, bi), e.initializer) } function RFe(e) { let t = e.typeName, r = e.typeArguments; if (Re(e.typeName)) { if (U6(e)) return OFe(e); let i = e.typeName.text; switch (e.typeName.text) { case "String": case "Boolean": case "Object": case "Number": i = i.toLowerCase(); break; case "array": case "date": case "promise": i = i[0].toUpperCase() + i.slice(1); break }t = D.createIdentifier(i), (i === "Array" || i === "Promise") && !e.typeArguments ? r = D.createNodeArray([D.createTypeReferenceNode("any", Je)]) : r = On(e.typeArguments, Sb, bi) } return D.createTypeReferenceNode(t, r) } function OFe(e) { let t = D.createParameterDeclaration(void 0, void 0, e.typeArguments[0].kind === 148 ? "n" : "s", void 0, D.createTypeReferenceNode(e.typeArguments[0].kind === 148 ? "number" : "string", []), void 0), r = D.createTypeLiteralNode([D.createIndexSignature(void 0, [t], e.typeArguments[1])]); return Jn(r, 1), r } var N5, j$, NFe = gt({ "src/services/codefixes/annotateWithTypeFromJSDoc.ts"() { "use strict"; Fr(), Qa(), N5 = "annotateWithTypeFromJSDoc", j$ = [_.JSDoc_types_may_be_moved_to_TypeScript_types.code], za({ errorCodes: j$, getCodeActions(e) { let t = wve(e.sourceFile, e.span.start); if (!t) return; let r = nr.ChangeTracker.with(e, i => Nve(i, e.sourceFile, t)); return [Ma(N5, r, _.Annotate_with_type_from_JSDoc, N5, _.Annotate_everything_with_types_from_JSDoc)] }, fixIds: [N5], getAllCodeActions: e => ns(e, j$, (t, r) => { let i = wve(r.file, r.start); i && Nve(t, r.file, i) }) }) } }); function Pve(e, t, r, i, o, s) { let l = i.getSymbolAtLocation(Vi(t, r)); if (!l || !l.valueDeclaration || !(l.flags & 19)) return; let f = l.valueDeclaration; if (Jc(f) || ms(f)) e.replaceNode(t, f, m(f)); else if (wi(f)) { let v = g(f); if (!v) return; let S = f.parent.parent; pu(f.parent) && f.parent.declarations.length > 1 ? (e.delete(t, f), e.insertNodeAfter(t, S, v)) : e.replaceNode(t, S, v) } function d(v) { let S = []; return v.exports && v.exports.forEach(w => { if (w.name === "prototype" && w.declarations) { let C = w.declarations[0]; if (w.declarations.length === 1 && br(C) && ar(C.parent) && C.parent.operatorToken.kind === 63 && rs(C.parent.right)) { let P = C.parent.right; A(P.symbol, void 0, S) } } else A(w, [D.createToken(124)], S) }), v.members && v.members.forEach((w, C) => { var P, F, B, q; if (C === "constructor" && w.valueDeclaration) { let W = (q = (B = (F = (P = v.exports) == null ? void 0 : P.get("prototype")) == null ? void 0 : F.declarations) == null ? void 0 : B[0]) == null ? void 0 : q.parent; W && ar(W) && rs(W.right) && vt(W.right.properties, M5) || e.delete(t, w.valueDeclaration.parent); return } A(w, void 0, S) }), S; function x(w, C) { return Us(w) ? br(w) && M5(w) ? !0 : Ia(C) : Ji(w.properties, P => !!(Nc(P) || t6(P) || yl(P) && ms(P.initializer) && P.name || M5(P))) } function A(w, C, P) { if (!(w.flags & 8192) && !(w.flags & 4096)) return; let F = w.valueDeclaration, B = F.parent, q = B.right; if (!x(F, q) || vt(P, $ => { let fe = sa($); return !!(fe && Re(fe) && vr(fe) === fc(w)) })) return; let W = B.parent && B.parent.kind === 241 ? B.parent : B; if (e.delete(t, W), !q) { P.push(D.createPropertyDeclaration(C, w.name, void 0, void 0, void 0)); return } if (Us(F) && (ms(q) || xs(q))) { let $ = J_(t, o), fe = PFe(F, s, $); fe && Y(P, q, fe); return } else if (rs(q)) { mn(q.properties, $ => { (Nc($) || t6($)) && P.push($), yl($) && ms($.initializer) && Y(P, $.initializer, $.name), M5($) }); return } else { if (Cu(t) || !br(F)) return; let $ = D.createPropertyDeclaration(C, F.name, void 0, void 0, q); q2(B.parent, $, t), P.push($); return } function Y($, fe, Z) { return ms(fe) ? R($, fe, Z) : ie($, fe, Z) } function R($, fe, Z) { let U = Qi(C, P5(fe, 132)), re = D.createMethodDeclaration(U, void 0, Z, void 0, void 0, fe.parameters, void 0, fe.body); q2(B, re, t), $.push(re) } function ie($, fe, Z) { let U = fe.body, re; U.kind === 238 ? re = U : re = D.createBlock([D.createReturnStatement(U)]); let le = Qi(C, P5(fe, 132)), _e = D.createMethodDeclaration(le, void 0, Z, void 0, void 0, fe.parameters, void 0, re); q2(B, _e, t), $.push(_e) } } } function g(v) { let S = v.initializer; if (!S || !ms(S) || !Re(v.name)) return; let x = d(v.symbol); S.body && x.unshift(D.createConstructorDeclaration(void 0, S.parameters, S.body)); let A = P5(v.parent.parent, 93); return D.createClassDeclaration(A, v.name, void 0, void 0, x) } function m(v) { let S = d(l); v.body && S.unshift(D.createConstructorDeclaration(void 0, v.parameters, v.body)); let x = P5(v, 93); return D.createClassDeclaration(x, v.name, void 0, void 0, S) } } function P5(e, t) { return g_(e) ? Pr(e.modifiers, r => r.kind === t) : void 0 } function M5(e) { return e.name ? !!(Re(e.name) && e.name.text === "constructor") : !1 } function PFe(e, t, r) { if (br(e)) return e.name; let i = e.argumentExpression; if (Vf(i)) return i; if (es(i)) return i_(i.text, Do(t)) ? D.createIdentifier(i.text) : IS(i) ? D.createStringLiteral(i.text, r === 0) : i } var F5, H$, MFe = gt({ "src/services/codefixes/convertFunctionToEs6Class.ts"() { "use strict"; Fr(), Qa(), F5 = "convertFunctionToEs6Class", H$ = [_.This_constructor_function_may_be_converted_to_a_class_declaration.code], za({ errorCodes: H$, getCodeActions(e) { let t = nr.ChangeTracker.with(e, r => Pve(r, e.sourceFile, e.span.start, e.program.getTypeChecker(), e.preferences, e.program.getCompilerOptions())); return [Ma(F5, t, _.Convert_function_to_an_ES2015_class, F5, _.Convert_all_constructor_functions_to_classes)] }, fixIds: [F5], getAllCodeActions: e => ns(e, H$, (t, r) => Pve(t, r.file, r.start, e.program.getTypeChecker(), e.preferences, e.program.getCompilerOptions())) }) } }); function Mve(e, t, r, i) { let o = Vi(t, r), s; if (Re(o) && wi(o.parent) && o.parent.initializer && Ds(o.parent.initializer) ? s = o.parent.initializer : s = zr(Xd(Vi(t, r)), e$), !s) return; let l = new Map, f = Yn(s), d = GFe(s, i), g = BFe(s, i, l); if (!QY(g, i)) return; let m = g.body && Va(g.body) ? FFe(g.body, i) : Je, v = { checker: i, synthNamesMap: l, setOfExpressionsToReturn: d, isInJSFile: f }; if (!m.length) return; let S = xo(t.text, yp(s).pos); e.insertModifierAt(t, S, 132, { suffix: " " }); for (let x of m) if (pa(x, function A(w) { if (Pa(w)) { let C = ox(w, w, v, !1); if (o1()) return !0; e.replaceNodeWithNodes(t, x, C) } else if (!Ia(w) && (pa(w, A), o1())) return !0 }), o1()) return } function FFe(e, t) { let r = []; return vT(e, i => { r5(i, t) && r.push(i) }), r } function GFe(e, t) { if (!e.body) return new Set; let r = new Set; return pa(e.body, function i(o) { mk(o, t, "then") ? (r.add(zo(o)), mn(o.arguments, i)) : mk(o, t, "catch") || mk(o, t, "finally") ? (r.add(zo(o)), pa(o, i)) : Gve(o, t) ? r.add(zo(o)) : pa(o, i) }), r } function mk(e, t, r) { if (!Pa(e)) return !1; let o = kN(e, r) && t.getTypeAtLocation(e); return !!(o && t.getPromisedTypeOfPromise(o)) } function Fve(e, t) { return (Ur(e) & 4) !== 0 && e.target === t } function G5(e, t, r) { if (e.expression.name.escapedText === "finally") return; let i = r.getTypeAtLocation(e.expression.expression); if (Fve(i, r.getPromiseType()) || Fve(i, r.getPromiseLikeType())) if (e.expression.name.escapedText === "then") { if (t === Ig(e.arguments, 0)) return Ig(e.typeArguments, 0); if (t === Ig(e.arguments, 1)) return Ig(e.typeArguments, 1) } else return Ig(e.typeArguments, 0) } function Gve(e, t) { return ot(e) ? !!t.getPromisedTypeOfPromise(t.getTypeAtLocation(e)) : !1 } function BFe(e, t, r) { let i = new Map, o = Nf(); return pa(e, function s(l) { if (!Re(l)) { pa(l, s); return } let f = t.getSymbolAtLocation(l); if (f) { let d = t.getTypeAtLocation(l), g = Wve(d, t), m = $a(f).toString(); if (g && !ha(l.parent) && !Ds(l.parent) && !r.has(m)) { let v = Sl(g.parameters), S = v?.valueDeclaration && ha(v.valueDeclaration) && zr(v.valueDeclaration.name, Re) || D.createUniqueName("result", 16), x = Bve(S, o); r.set(m, x), o.add(S.text, f) } else if (l.parent && (ha(l.parent) || wi(l.parent) || Wo(l.parent))) { let v = l.text, S = o.get(v); if (S && S.some(x => x !== f)) { let x = Bve(l, o); i.set(m, x.identifier), r.set(m, x), o.add(v, f) } else { let x = cc(l); r.set(m, $2(x)), o.add(v, f) } } } }), JN(e, !0, s => { if (Wo(s) && Re(s.name) && cm(s.parent)) { let l = t.getSymbolAtLocation(s.name), f = l && i.get(String($a(l))); if (f && f.text !== (s.name || s.propertyName).getText()) return D.createBindingElement(s.dotDotDotToken, s.propertyName || s.name, f, s.initializer) } else if (Re(s)) { let l = t.getSymbolAtLocation(s), f = l && i.get(String($a(l))); if (f) return D.createIdentifier(f.text) } }) } function Bve(e, t) { let r = (t.get(e.text) || Je).length, i = r === 0 ? e : D.createIdentifier(e.text + "_" + r); return $2(i) } function o1() { return !iP } function _v() { return iP = !1, Je } function ox(e, t, r, i, o) { if (mk(t, r.checker, "then")) return jFe(t, Ig(t.arguments, 0), Ig(t.arguments, 1), r, i, o); if (mk(t, r.checker, "catch")) return jve(t, Ig(t.arguments, 0), r, i, o); if (mk(t, r.checker, "finally")) return VFe(t, Ig(t.arguments, 0), r, i, o); if (br(t)) return ox(e, t.expression, r, i, o); let s = r.checker.getTypeAtLocation(t); return s && r.checker.getPromisedTypeOfPromise(s) ? (L.assertNode(ec(t).parent, br), HFe(e, t, r, i, o)) : _v() } function B5({ checker: e }, t) { if (t.kind === 104) return !0; if (Re(t) && !tc(t) && vr(t) === "undefined") { let r = e.getSymbolAtLocation(t); return !r || e.isUndefinedSymbol(r) } return !1 } function UFe(e) { let t = D.createUniqueName(e.identifier.text, 16); return $2(t) } function Uve(e, t, r) { let i; return r && !gk(e, t) && (hk(r) ? (i = r, t.synthNamesMap.forEach((o, s) => { if (o.identifier.text === r.identifier.text) { let l = UFe(r); t.synthNamesMap.set(s, l) } })) : i = $2(D.createUniqueName("result", 16), r.types), K$(i)), i } function Vve(e, t, r, i, o) { let s = [], l; if (i && !gk(e, t)) { l = cc(K$(i)); let f = i.types, d = t.checker.getUnionType(f, 2), g = t.isInJSFile ? void 0 : t.checker.typeToTypeNode(d, void 0, void 0), m = [D.createVariableDeclaration(l, void 0, g)], v = D.createVariableStatement(void 0, D.createVariableDeclarationList(m, 1)); s.push(v) } return s.push(r), o && l && JFe(o) && s.push(D.createVariableStatement(void 0, D.createVariableDeclarationList([D.createVariableDeclaration(cc(qve(o)), void 0, void 0, l)], 2))), s } function VFe(e, t, r, i, o) { if (!t || B5(r, t)) return ox(e, e.expression.expression, r, i, o); let s = Uve(e, r, o), l = ox(e, e.expression.expression, r, !0, s); if (o1()) return _v(); let f = z$(t, i, void 0, void 0, e, r); if (o1()) return _v(); let d = D.createBlock(l), g = D.createBlock(f), m = D.createTryStatement(d, void 0, g); return Vve(e, r, m, s, o) } function jve(e, t, r, i, o) { if (!t || B5(r, t)) return ox(e, e.expression.expression, r, i, o); let s = Jve(t, r), l = Uve(e, r, o), f = ox(e, e.expression.expression, r, !0, l); if (o1()) return _v(); let d = z$(t, i, l, s, e, r); if (o1()) return _v(); let g = D.createBlock(f), m = D.createCatchClause(s && cc(rP(s)), D.createBlock(d)), v = D.createTryStatement(g, m, void 0); return Vve(e, r, v, l, o) } function jFe(e, t, r, i, o, s) { if (!t || B5(i, t)) return jve(e, r, i, o, s); if (r && !B5(i, r)) return _v(); let l = Jve(t, i), f = ox(e.expression.expression, e.expression.expression, i, !0, l); if (o1()) return _v(); let d = z$(t, o, s, l, e, i); return o1() ? _v() : Qi(f, d) } function HFe(e, t, r, i, o) { if (gk(e, r)) { let s = cc(t); return i && (s = D.createAwaitExpression(s)), [D.createReturnStatement(s)] } return U5(o, D.createAwaitExpression(t), void 0) } function U5(e, t, r) { return !e || Kve(e) ? [D.createExpressionStatement(t)] : hk(e) && e.hasBeenDeclared ? [D.createExpressionStatement(D.createAssignment(cc(J$(e)), t))] : [D.createVariableStatement(void 0, D.createVariableDeclarationList([D.createVariableDeclaration(cc(rP(e)), void 0, r, t)], 2))] } function W$(e, t) { if (t && e) { let r = D.createUniqueName("result", 16); return [...U5($2(r), e, t), D.createReturnStatement(r)] } return [D.createReturnStatement(e)] } function z$(e, t, r, i, o, s) { var l; switch (e.kind) { case 104: break; case 208: case 79: if (!i) break; let f = D.createCallExpression(cc(e), void 0, hk(i) ? [J$(i)] : []); if (gk(o, s)) return W$(f, G5(o, e, s.checker)); let d = s.checker.getTypeAtLocation(e), g = s.checker.getSignaturesOfType(d, 0); if (!g.length) return _v(); let m = g[0].getReturnType(), v = U5(r, D.createAwaitExpression(f), G5(o, e, s.checker)); return r && r.types.push(s.checker.getAwaitedType(m) || m), v; case 215: case 216: { let S = e.body, x = (l = Wve(s.checker.getTypeAtLocation(e), s.checker)) == null ? void 0 : l.getReturnType(); if (Va(S)) { let A = [], w = !1; for (let C of S.statements) if (j_(C)) if (w = !0, r5(C, s.checker)) A = A.concat(zve(s, C, t, r)); else { let P = x && C.expression ? Hve(s.checker, x, C.expression) : C.expression; A.push(...W$(P, G5(o, e, s.checker))) } else { if (t && vT(C, h0)) return _v(); A.push(C) } return gk(o, s) ? A.map(C => cc(C)) : WFe(A, r, s, w) } else { let A = ZY(S, s.checker) ? zve(s, D.createReturnStatement(S), t, r) : Je; if (A.length > 0) return A; if (x) { let w = Hve(s.checker, x, S); if (gk(o, s)) return W$(w, G5(o, e, s.checker)); { let C = U5(r, w, void 0); return r && r.types.push(s.checker.getAwaitedType(x) || x), C } } else return _v() } } default: return _v() }return Je } function Hve(e, t, r) { let i = cc(r); return e.getPromisedTypeOfPromise(t) ? D.createAwaitExpression(i) : i } function Wve(e, t) { let r = t.getSignaturesOfType(e, 0); return Os(r) } function WFe(e, t, r, i) { let o = []; for (let s of e) if (j_(s)) { if (s.expression) { let l = Gve(s.expression, r.checker) ? D.createAwaitExpression(s.expression) : s.expression; t === void 0 ? o.push(D.createExpressionStatement(l)) : hk(t) && t.hasBeenDeclared ? o.push(D.createExpressionStatement(D.createAssignment(J$(t), l))) : o.push(D.createVariableStatement(void 0, D.createVariableDeclarationList([D.createVariableDeclaration(rP(t), void 0, void 0, l)], 2))) } } else o.push(cc(s)); return !i && t !== void 0 && o.push(D.createVariableStatement(void 0, D.createVariableDeclarationList([D.createVariableDeclaration(rP(t), void 0, void 0, D.createIdentifier("undefined"))], 2))), o } function zve(e, t, r, i) { let o = []; return pa(t, function s(l) { if (Pa(l)) { let f = ox(l, l, e, r, i); if (o = o.concat(f), o.length > 0) return } else Ia(l) || pa(l, s) }), o } function Jve(e, t) { let r = [], i; if (Ds(e)) { if (e.parameters.length > 0) { let d = e.parameters[0].name; i = o(d) } } else Re(e) ? i = s(e) : br(e) && Re(e.name) && (i = s(e.name)); if (!i || "identifier" in i && i.identifier.text === "undefined") return; return i; function o(d) { if (Re(d)) return s(d); let g = Uo(d.elements, m => ol(m) ? [] : [o(m.name)]); return zFe(d, g) } function s(d) { let g = f(d), m = l(g); return m && t.synthNamesMap.get($a(m).toString()) || $2(d, r) } function l(d) { var g, m; return (m = (g = zr(d, $p)) == null ? void 0 : g.symbol) != null ? m : t.checker.getSymbolAtLocation(d) } function f(d) { return d.original ? d.original : d } } function Kve(e) { return e ? hk(e) ? !e.identifier.text : Ji(e.elements, Kve) : !0 } function $2(e, t = []) { return { kind: 0, identifier: e, types: t, hasBeenDeclared: !1, hasBeenReferenced: !1 } } function zFe(e, t = Je, r = []) { return { kind: 1, bindingPattern: e, elements: t, types: r } } function J$(e) { return e.hasBeenReferenced = !0, e.identifier } function rP(e) { return hk(e) ? K$(e) : qve(e) } function qve(e) { for (let t of e.elements) rP(t); return e.bindingPattern } function K$(e) { return e.hasBeenDeclared = !0, e.identifier } function hk(e) { return e.kind === 0 } function JFe(e) { return e.kind === 1 } function gk(e, t) { return !!e.original && t.setOfExpressionsToReturn.has(zo(e.original)) } var V5, q$, iP, KFe = gt({ "src/services/codefixes/convertToAsyncFunction.ts"() { "use strict"; Fr(), Qa(), V5 = "convertToAsyncFunction", q$ = [_.This_may_be_converted_to_an_async_function.code], iP = !0, za({ errorCodes: q$, getCodeActions(e) { iP = !0; let t = nr.ChangeTracker.with(e, r => Mve(r, e.sourceFile, e.span.start, e.program.getTypeChecker())); return iP ? [Ma(V5, t, _.Convert_to_async_function, V5, _.Convert_all_to_async_functions)] : [] }, fixIds: [V5], getAllCodeActions: e => ns(e, q$, (t, r) => Mve(t, r.file, r.start, e.program.getTypeChecker())) }) } }); function qFe(e, t, r, i) { for (let o of e.imports) { let s = kA(e, o.text, W_(e, o)); if (!s || s.resolvedFileName !== t.fileName) continue; let l = aR(o); switch (l.kind) { case 268: r.replaceNode(e, l, Xg(l.name, void 0, o, i)); break; case 210: qu(l, !1) && r.replaceNode(e, l, D.createPropertyAccessExpression(cc(l), "default")); break } } } function XFe(e, t, r, i, o) { let s = { original: c7e(e), additional: new Set }, l = YFe(e, t, s); $Fe(e, l, r); let f = !1, d; for (let g of Pr(e.statements, Bc)) { let m = Yve(e, g, r, t, s, i, o); m && Mw(m, d ?? (d = new Map)) } for (let g of Pr(e.statements, m => !Bc(m))) { let m = QFe(e, g, t, r, s, i, l, d, o); f = f || m } return d?.forEach((g, m) => { r.replaceNode(e, m, g) }), f } function YFe(e, t, r) { let i = new Map; return Xve(e, o => { let { text: s } = o.name; !i.has(s) && (q6(o.name) || t.resolveName(s, o, 111551, !0)) && i.set(s, j5(`_${s}`, r)) }), i } function $Fe(e, t, r) { Xve(e, (i, o) => { if (o) return; let { text: s } = i.name; r.replaceNode(e, i, D.createIdentifier(t.get(s) || s)) }) } function Xve(e, t) { e.forEachChild(function r(i) { if (br(i) && $0(e, i.expression) && Re(i.name)) { let { parent: o } = i; t(i, ar(o) && o.left === i && o.operatorToken.kind === 63) } i.forEachChild(r) }) } function QFe(e, t, r, i, o, s, l, f, d) { switch (t.kind) { case 240: return Yve(e, t, i, r, o, s, d), !1; case 241: { let { expression: g } = t; switch (g.kind) { case 210: return qu(g, !0) && i.replaceNode(e, t, Xg(void 0, void 0, g.arguments[0], d)), !1; case 223: { let { operatorToken: m } = g; return m.kind === 63 && e7e(e, r, g, i, l, f) } } } default: return !1 } } function Yve(e, t, r, i, o, s, l) { let { declarationList: f } = t, d = !1, g = on(f.declarations, m => { let { name: v, initializer: S } = m; if (S) { if ($0(e, S)) return d = !0, Q2([]); if (qu(S, !0)) return d = !0, o7e(v, S.arguments[0], i, o, s, l); if (br(S) && qu(S.expression, !0)) return d = !0, ZFe(v, S.name.text, S.expression.arguments[0], o, l) } return Q2([D.createVariableStatement(void 0, D.createVariableDeclarationList([m], f.flags))]) }); if (d) { r.replaceNodeWithNodes(e, t, Uo(g, v => v.newImports)); let m; return mn(g, v => { v.useSitesToUnqualify && Mw(v.useSitesToUnqualify, m ?? (m = new Map)) }), m } } function ZFe(e, t, r, i, o) { switch (e.kind) { case 203: case 204: { let s = j5(t, i); return Q2([ebe(s, t, r, o), H5(void 0, e, D.createIdentifier(s))]) } case 79: return Q2([ebe(e.text, t, r, o)]); default: return L.assertNever(e, `Convert to ES module got invalid syntax form ${e.kind}`) } } function e7e(e, t, r, i, o, s) { let { left: l, right: f } = r; if (!br(l)) return !1; if ($0(e, l)) if ($0(e, f)) i.delete(e, r.parent); else { let d = rs(f) ? t7e(f, s) : qu(f, !0) ? r7e(f.arguments[0], t) : void 0; return d ? (i.replaceNodeWithNodes(e, r.parent, d[0]), d[1]) : (i.replaceRangeWithText(e, Gf(l.getStart(e), f.pos), "export default"), !0) } else $0(e, l.expression) && n7e(e, r, i, o); return !1 } function t7e(e, t) { let r = NU(e.properties, i => { switch (i.kind) { case 174: case 175: case 300: case 301: return; case 299: return Re(i.name) ? a7e(i.name.text, i.initializer, t) : void 0; case 171: return Re(i.name) ? Zve(i.name.text, [D.createToken(93)], i, t) : void 0; default: L.assertNever(i, `Convert to ES6 got invalid prop kind ${i.kind}`) } }); return r && [r, !1] } function n7e(e, t, r, i) { let { text: o } = t.left.name, s = i.get(o); if (s !== void 0) { let l = [H5(void 0, s, t.right), $$([D.createExportSpecifier(!1, s, o)])]; r.replaceNodeWithNodes(e, t.parent, l) } else i7e(t, e, r) } function r7e(e, t) { let r = e.text, i = t.getSymbolAtLocation(e), o = i ? i.exports : b8; return o.has("export=") ? [[X$(r)], !0] : o.has("default") ? o.size > 1 ? [[$ve(r), X$(r)], !0] : [[X$(r)], !0] : [[$ve(r)], !1] } function $ve(e) { return $$(void 0, e) } function X$(e) { return $$([D.createExportSpecifier(!1, void 0, "default")], e) } function i7e({ left: e, right: t, parent: r }, i, o) { let s = e.name.text; if ((ms(t) || xs(t) || _u(t)) && (!t.name || t.name.text === s)) { o.replaceRange(i, { pos: e.getStart(i), end: t.getStart(i) }, D.createToken(93), { suffix: " " }), t.name || o.insertName(i, t, s); let l = Yo(r, 26, i); l && o.delete(i, l) } else o.replaceNodeRangeWithNodes(i, e.expression, Yo(e, 24, i), [D.createToken(93), D.createToken(85)], { joiner: " ", suffix: " " }) } function a7e(e, t, r) { let i = [D.createToken(93)]; switch (t.kind) { case 215: { let { name: s } = t; if (s && s.text !== e) return o() } case 216: return Zve(e, i, t, r); case 228: return u7e(e, i, t, r); default: return o() }function o() { return H5(i, D.createIdentifier(e), Y$(t, r)) } } function Y$(e, t) { if (!t || !vt(lo(t.keys()), i => Od(e, i))) return e; return ba(e) ? gY(e, !0, r) : JN(e, !0, r); function r(i) { if (i.kind === 208) { let o = t.get(i); return t.delete(i), o } } } function o7e(e, t, r, i, o, s) { switch (e.kind) { case 203: { let l = NU(e.elements, f => f.dotDotDotToken || f.initializer || f.propertyName && !Re(f.propertyName) || !Re(f.name) ? void 0 : tbe(f.propertyName && f.propertyName.text, f.name.text)); if (l) return Q2([Xg(void 0, l, t, s)]) } case 204: { let l = j5(cQ(t.text, o), i); return Q2([Xg(D.createIdentifier(l), void 0, t, s), H5(void 0, cc(e), D.createIdentifier(l))]) } case 79: return s7e(e, t, r, i, s); default: return L.assertNever(e, `Convert to ES module got invalid name kind ${e.kind}`) } } function s7e(e, t, r, i, o) { let s = r.getSymbolAtLocation(e), l = new Map, f = !1, d; for (let m of i.original.get(e.text)) { if (r.getSymbolAtLocation(m) !== s || m === e) continue; let { parent: v } = m; if (br(v)) { let { name: { text: S } } = v; if (S === "default") { f = !0; let x = m.getText(); (d ?? (d = new Map)).set(v, D.createIdentifier(x)) } else { L.assert(v.expression === m, "Didn't expect expression === use"); let x = l.get(S); x === void 0 && (x = j5(S, i), l.set(S, x)), (d ?? (d = new Map)).set(v, D.createIdentifier(x)) } } else f = !0 } let g = l.size === 0 ? void 0 : lo(RU(l.entries(), ([m, v]) => D.createImportSpecifier(!1, m === v ? void 0 : D.createIdentifier(m), D.createIdentifier(v)))); return g || (f = !0), Q2([Xg(f ? cc(e) : void 0, g, t, o)], d) } function j5(e, t) { for (; t.original.has(e) || t.additional.has(e);)e = `_${e}`; return t.additional.add(e), e } function c7e(e) { let t = Nf(); return Qve(e, r => t.add(r.text, r)), t } function Qve(e, t) { Re(e) && l7e(e) && t(e), e.forEachChild(r => Qve(r, t)) } function l7e(e) { let { parent: t } = e; switch (t.kind) { case 208: return t.name !== e; case 205: return t.propertyName !== e; case 273: return t.propertyName !== e; default: return !0 } } function Zve(e, t, r, i) { return D.createFunctionDeclaration(Qi(t, oE(r.modifiers)), cc(r.asteriskToken), e, oE(r.typeParameters), oE(r.parameters), cc(r.type), D.converters.convertToFunctionBlock(Y$(r.body, i))) } function u7e(e, t, r, i) { return D.createClassDeclaration(Qi(t, oE(r.modifiers)), e, oE(r.typeParameters), oE(r.heritageClauses), Y$(r.members, i)) } function ebe(e, t, r, i) { return t === "default" ? Xg(D.createIdentifier(e), void 0, r, i) : Xg(void 0, [tbe(t, e)], r, i) } function tbe(e, t) { return D.createImportSpecifier(!1, e !== void 0 && e !== t ? D.createIdentifier(e) : void 0, D.createIdentifier(t)) } function H5(e, t, r) { return D.createVariableStatement(e, D.createVariableDeclarationList([D.createVariableDeclaration(t, void 0, void 0, r)], 2)) } function $$(e, t) { return D.createExportDeclaration(void 0, !1, e && D.createNamedExports(e), t === void 0 ? void 0 : D.createStringLiteral(t)) } function Q2(e, t) { return { newImports: e, useSitesToUnqualify: t } } var d7e = gt({ "src/services/codefixes/convertToEsModule.ts"() { "use strict"; Fr(), Qa(), za({ errorCodes: [_.File_is_a_CommonJS_module_it_may_be_converted_to_an_ES_module.code], getCodeActions(e) { let { sourceFile: t, program: r, preferences: i } = e, o = nr.ChangeTracker.with(e, s => { if (XFe(t, r.getTypeChecker(), s, Do(r.getCompilerOptions()), J_(t, i))) for (let f of r.getSourceFiles()) qFe(f, t, s, J_(f, i)) }); return [K_("convertToEsModule", o, _.Convert_to_ES_module)] } }) } }); function nbe(e, t) { let r = jn(Vi(e, t), Yu); return L.assert(!!r, "Expected position to be owned by a qualified name."), Re(r.left) ? r : void 0 } function rbe(e, t, r) { let i = r.right.text, o = D.createIndexedAccessTypeNode(D.createTypeReferenceNode(r.left, void 0), D.createLiteralTypeNode(D.createStringLiteral(i))); e.replaceNode(t, r, o) } var W5, Q$, f7e = gt({ "src/services/codefixes/correctQualifiedNameToIndexedAccessType.ts"() { "use strict"; Fr(), Qa(), W5 = "correctQualifiedNameToIndexedAccessType", Q$ = [_.Cannot_access_0_1_because_0_is_a_type_but_not_a_namespace_Did_you_mean_to_retrieve_the_type_of_the_property_1_in_0_with_0_1.code], za({ errorCodes: Q$, getCodeActions(e) { let t = nbe(e.sourceFile, e.span.start); if (!t) return; let r = nr.ChangeTracker.with(e, o => rbe(o, e.sourceFile, t)), i = `${t.left.text}["${t.right.text}"]`; return [Ma(W5, r, [_.Rewrite_as_the_indexed_access_type_0, i], W5, _.Rewrite_all_as_indexed_access_types)] }, fixIds: [W5], getAllCodeActions: e => ns(e, Q$, (t, r) => { let i = nbe(r.file, r.start); i && rbe(t, r.file, i) }) }) } }); function ibe(e, t) { return zr(Vi(t, e.start).parent, Mu) } function abe(e, t, r) { if (!t) return; let i = t.parent, o = i.parent, s = _7e(t, r); if (s.length === i.elements.length) e.insertModifierBefore(r.sourceFile, 154, i); else { let l = D.updateExportDeclaration(o, o.modifiers, !1, D.updateNamedExports(i, Pr(i.elements, d => !ya(s, d))), o.moduleSpecifier, void 0), f = D.createExportDeclaration(void 0, !0, D.createNamedExports(s), o.moduleSpecifier, void 0); e.replaceNode(r.sourceFile, o, l, { leadingTriviaOption: nr.LeadingTriviaOption.IncludeAll, trailingTriviaOption: nr.TrailingTriviaOption.Exclude }), e.insertNodeAfter(r.sourceFile, o, f) } } function _7e(e, t) { let r = e.parent; if (r.elements.length === 1) return r.elements; let i = _ge(Du(r), t.program.getSemanticDiagnostics(t.sourceFile, t.cancellationToken)); return Pr(r.elements, o => { var s; return o === e || ((s = fge(o, i)) == null ? void 0 : s.code) === z5[0] }) } var z5, J5, p7e = gt({ "src/services/codefixes/convertToTypeOnlyExport.ts"() { "use strict"; Fr(), Qa(), z5 = [_.Re_exporting_a_type_when_0_is_enabled_requires_using_export_type.code], J5 = "convertToTypeOnlyExport", za({ errorCodes: z5, getCodeActions: function (t) { let r = nr.ChangeTracker.with(t, i => abe(i, ibe(t.span, t.sourceFile), t)); if (r.length) return [Ma(J5, r, _.Convert_to_type_only_export, J5, _.Convert_all_re_exported_types_to_type_only_exports)] }, fixIds: [J5], getAllCodeActions: function (t) { let r = new Map; return ns(t, z5, (i, o) => { let s = ibe(o, t.sourceFile); s && V_(r, zo(s.parent.parent)) && abe(i, s, t) }) } }) } }); function obe(e, t) { let { parent: r } = Vi(e, t); return $u(r) || gl(r) && r.importClause ? r : void 0 } function sbe(e, t, r) { if ($u(r)) e.replaceNode(t, r, D.updateImportSpecifier(r, !0, r.propertyName, r.name)); else { let i = r.importClause; if (i.name && i.namedBindings) e.replaceNodeWithNodes(t, r, [D.createImportDeclaration(oE(r.modifiers, !0), D.createImportClause(!0, cc(i.name, !0), void 0), cc(r.moduleSpecifier, !0), cc(r.assertClause, !0)), D.createImportDeclaration(oE(r.modifiers, !0), D.createImportClause(!0, void 0, cc(i.namedBindings, !0)), cc(r.moduleSpecifier, !0), cc(r.assertClause, !0))]); else { let o = D.updateImportDeclaration(r, r.modifiers, D.updateImportClause(i, !0, i.name, i.namedBindings), r.moduleSpecifier, r.assertClause); e.replaceNode(t, r, o) } } } var Z$, K5, m7e = gt({ "src/services/codefixes/convertToTypeOnlyImport.ts"() { "use strict"; Fr(), Qa(), Z$ = [_.This_import_is_never_used_as_a_value_and_must_use_import_type_because_importsNotUsedAsValues_is_set_to_error.code, _._0_is_a_type_and_must_be_imported_using_a_type_only_import_when_verbatimModuleSyntax_is_enabled.code], K5 = "convertToTypeOnlyImport", za({ errorCodes: Z$, getCodeActions: function (t) { let r = obe(t.sourceFile, t.span.start); if (r) { let i = nr.ChangeTracker.with(t, o => sbe(o, t.sourceFile, r)); return [Ma(K5, i, _.Convert_to_type_only_import, K5, _.Convert_all_imports_not_used_as_a_value_to_type_only_imports)] } }, fixIds: [K5], getAllCodeActions: function (t) { return ns(t, Z$, (r, i) => { let o = obe(i.file, i.start); o && sbe(r, i.file, o) }) } }) } }); function cbe(e, t) { let r = Vi(e, t); if (Re(r)) { let i = Ga(r.parent.parent, $d), o = r.getText(e); return { container: Ga(i.parent, Rd), typeNode: i.type, constraint: o, name: o === "K" ? "P" : "K" } } } function lbe(e, t, { container: r, typeNode: i, constraint: o, name: s }) { e.replaceNode(t, r, D.createMappedTypeNode(void 0, D.createTypeParameterDeclaration(void 0, s, D.createTypeReferenceNode(o)), void 0, void 0, i, void 0)) } var q5, eQ, h7e = gt({ "src/services/codefixes/convertLiteralTypeToMappedType.ts"() { "use strict"; Fr(), Qa(), q5 = "convertLiteralTypeToMappedType", eQ = [_._0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Did_you_mean_to_use_1_in_0.code], za({ errorCodes: eQ, getCodeActions: function (t) { let { sourceFile: r, span: i } = t, o = cbe(r, i.start); if (!o) return; let { name: s, constraint: l } = o, f = nr.ChangeTracker.with(t, d => lbe(d, r, o)); return [Ma(q5, f, [_.Convert_0_to_1_in_0, l, s], q5, _.Convert_all_type_literals_to_mapped_type)] }, fixIds: [q5], getAllCodeActions: e => ns(e, eQ, (t, r) => { let i = cbe(r.file, r.start); i && lbe(t, r.file, i) }) }) } }); function ube(e, t) { return L.checkDefined(Zc(Vi(e, t)), "There should be a containing class") } function dbe(e) { return !e.valueDeclaration || !(uu(e.valueDeclaration) & 8) } function fbe(e, t, r, i, o, s) { let l = e.program.getTypeChecker(), f = g7e(i, l), d = l.getTypeAtLocation(t), m = l.getPropertiesOfType(d).filter(g8(dbe, C => !f.has(C.escapedName))), v = l.getTypeAtLocation(i), S = wr(i.members, C => Ec(C)); v.getNumberIndexType() || A(d, 1), v.getStringIndexType() || A(d, 0); let x = s1(r, e.program, s, e.host); oZ(i, m, r, e, s, x, C => w(r, i, C)), x.writeFixes(o); function A(C, P) { let F = l.getIndexInfoOfType(C, P); F && w(r, i, l.indexInfoToIndexSignatureDeclaration(F, i, void 0, sx(e))) } function w(C, P, F) { S ? o.insertNodeAfter(C, S, F) : o.insertMemberAtStart(C, P, F) } } function g7e(e, t) { let r = hp(e); if (!r) return Ua(); let i = t.getTypeAtLocation(r), o = t.getPropertiesOfType(i); return Ua(o.filter(dbe)) } var tQ, X5, y7e = gt({ "src/services/codefixes/fixClassIncorrectlyImplementsInterface.ts"() { "use strict"; Fr(), Qa(), tQ = [_.Class_0_incorrectly_implements_interface_1.code, _.Class_0_incorrectly_implements_class_1_Did_you_mean_to_extend_1_and_inherit_its_members_as_a_subclass.code], X5 = "fixClassIncorrectlyImplementsInterface", za({ errorCodes: tQ, getCodeActions(e) { let { sourceFile: t, span: r } = e, i = ube(t, r.start); return Zi(JA(i), o => { let s = nr.ChangeTracker.with(e, l => fbe(e, o, t, i, l, e.preferences)); return s.length === 0 ? void 0 : Ma(X5, s, [_.Implement_interface_0, o.getText(t)], X5, _.Implement_all_unimplemented_interfaces) }) }, fixIds: [X5], getAllCodeActions(e) { let t = new Map; return ns(e, tQ, (r, i) => { let o = ube(i.file, i.start); if (V_(t, zo(o))) for (let s of JA(o)) fbe(e, s, i.file, o, r, e.preferences) }) } }) } }); function s1(e, t, r, i, o) { return _be(e, t, !1, r, i, o) } function _be(e, t, r, i, o, s) { let l = t.getCompilerOptions(), f = [], d = [], g = new Map, m = new Map; return { addImportFromDiagnostic: v, addImportFromExportedSymbol: S, writeFixes: A, hasFixes: w }; function v(C, P) { let F = vbe(P, C.code, C.start, r); !F || !F.length || x(Vo(F)) } function S(C, P) { let F = L.checkDefined(C.parent), B = j7(C, Do(l)), q = t.getTypeChecker(), W = q.getMergedSymbol(wd(C, q)), Y = hbe(e, W, B, F, !1, t, o, i, s), R = $5(e, t), ie = pbe(e, L.checkDefined(Y), t, void 0, !!P, R, o, i); ie && x({ fix: ie, symbolName: B, errorIdentifierText: void 0 }) } function x(C) { var P, F; let { fix: B, symbolName: q } = C; switch (B.kind) { case 0: f.push(B); break; case 1: d.push(B); break; case 2: { let { importClauseOrBindingPattern: ie, importKind: $, addAsTypeOnly: fe } = B, Z = String(zo(ie)), U = g.get(Z); if (U || g.set(Z, U = { importClauseOrBindingPattern: ie, defaultImport: void 0, namedImports: new Map }), $ === 0) { let re = U?.namedImports.get(q); U.namedImports.set(q, W(re, fe)) } else L.assert(U.defaultImport === void 0 || U.defaultImport.name === q, "(Add to Existing) Default import should be missing or match symbolName"), U.defaultImport = { name: q, addAsTypeOnly: W((P = U.defaultImport) == null ? void 0 : P.addAsTypeOnly, fe) }; break } case 3: { let { moduleSpecifier: ie, importKind: $, useRequire: fe, addAsTypeOnly: Z } = B, U = Y(ie, $, fe, Z); switch (L.assert(U.useRequire === fe, "(Add new) Tried to add an `import` and a `require` for the same module"), $) { case 1: L.assert(U.defaultImport === void 0 || U.defaultImport.name === q, "(Add new) Default import should be missing or match symbolName"), U.defaultImport = { name: q, addAsTypeOnly: W((F = U.defaultImport) == null ? void 0 : F.addAsTypeOnly, Z) }; break; case 0: let re = (U.namedImports || (U.namedImports = new Map)).get(q); U.namedImports.set(q, W(re, Z)); break; case 3: case 2: L.assert(U.namespaceLikeImport === void 0 || U.namespaceLikeImport.name === q, "Namespacelike import shoudl be missing or match symbolName"), U.namespaceLikeImport = { importKind: $, name: q, addAsTypeOnly: Z }; break }break } case 4: break; default: L.assertNever(B, `fix wasn't never - got kind ${B.kind}`) }function W(ie, $) { return Math.max(ie ?? 0, $) } function Y(ie, $, fe, Z) { let U = R(ie, !0), re = R(ie, !1), le = m.get(U), _e = m.get(re), ge = { defaultImport: void 0, namedImports: void 0, namespaceLikeImport: void 0, useRequire: fe }; return $ === 1 && Z === 2 ? le || (m.set(U, ge), ge) : Z === 1 && (le || _e) ? le || _e : _e || (m.set(re, ge), ge) } function R(ie, $) { return `${$ ? 1 : 0}|${ie}` } } function A(C) { let P = J_(e, i); for (let B of f) oQ(C, e, B); for (let B of d) Cbe(C, e, B, P); g.forEach(({ importClauseOrBindingPattern: B, defaultImport: q, namedImports: W }) => { Abe(C, e, B, q, lo(W.entries(), ([Y, R]) => ({ addAsTypeOnly: R, name: Y })), l, i) }); let F; m.forEach(({ useRequire: B, defaultImport: q, namedImports: W, namespaceLikeImport: Y }, R) => { let ie = R.slice(2), fe = (B ? kbe : Lbe)(ie, P, q, W && lo(W.entries(), ([Z, U]) => ({ addAsTypeOnly: U, name: Z })), Y, l); F = _A(F, fe) }), F && L7(C, e, F, !0, i) } function w() { return f.length > 0 || d.length > 0 || g.size > 0 || m.size > 0 } } function v7e(e, t, r, i) { let o = uk(e, i, r), s = gbe(t.getTypeChecker(), e, t.getCompilerOptions()); return { getModuleSpecifierForBestExportInfo: l }; function l(f, d, g, m) { let { fixes: v, computedWithoutCacheCount: S } = Y5(f, d, g, !1, t, e, r, i, s, m), x = bbe(v, e, t, o, r); return x && { ...x, computedWithoutCacheCount: S } } } function b7e(e, t, r, i, o, s, l, f, d, g, m, v) { let S = f.getCompilerOptions(), x; r ? (x = YN(i, l, f, m, v).get(i.path, r), L.assertIsDefined(x, "Some exportInfo should match the specified exportMapKey")) : (x = cj(u_(t.name)) ? [T7e(e, o, t, f, l)] : hbe(i, e, o, t, s, f, l, m, v), L.assertIsDefined(x, "Some exportInfo should match the specified symbol / moduleSymbol")); let A = $5(i, f), w = TS(Vi(i, g)), C = L.checkDefined(pbe(i, x, f, g, w, A, l, m)); return { moduleSpecifier: C.moduleSpecifier, codeAction: mbe(aQ({ host: l, formatContext: d, preferences: m }, i, o, C, !1, S, m)) } } function E7e(e, t, r, i, o, s) { let l = r.getCompilerOptions(), f = BU(iQ(e, r.getTypeChecker(), t, l)), d = Sbe(e, t, f, r), g = f !== t.text; return d && mbe(aQ({ host: i, formatContext: o, preferences: s }, e, f, d, g, l, s)) } function pbe(e, t, r, i, o, s, l, f) { let d = uk(e, f, l); return bbe(Y5(t, i, o, s, r, e, l, f).fixes, e, r, d, l) } function mbe({ description: e, changes: t, commands: r }) { return { description: e, changes: t, commands: r } } function hbe(e, t, r, i, o, s, l, f, d) { let g = ybe(s, l); return YN(e, l, s, f, d).search(e.path, o, m => m === r, m => { if (wd(m[0].symbol, g(m[0].isFromPackageJson)) === t && m.some(v => v.moduleSymbol === i || v.symbol.parent === i)) return m }) } function T7e(e, t, r, i, o) { var s, l; let f = i.getCompilerOptions(), d = m(i.getTypeChecker(), !1); if (d) return d; let g = (l = (s = o.getPackageJsonAutoImportProvider) == null ? void 0 : s.call(o)) == null ? void 0 : l.getTypeChecker(); return L.checkDefined(g && m(g, !0), "Could not find symbol in specified module for code actions"); function m(v, S) { let x = Y7(r, v, f); if (x && wd(x.symbol, v) === e) return { symbol: x.symbol, moduleSymbol: r, moduleFileName: void 0, exportKind: x.exportKind, targetFlags: wd(e, v).flags, isFromPackageJson: S }; let A = v.tryGetMemberInModuleExportsAndProperties(t, r); if (A && wd(A, v) === e) return { symbol: A, moduleSymbol: r, moduleFileName: void 0, exportKind: 0, targetFlags: wd(e, v).flags, isFromPackageJson: S } } } function Y5(e, t, r, i, o, s, l, f, d = gbe(o.getTypeChecker(), s, o.getCompilerOptions()), g) { let m = o.getTypeChecker(), v = Uo(e, d.getImportsForExportInfo), S = t !== void 0 && S7e(v, t), x = A7e(v, r, m, o.getCompilerOptions()); if (x) return { computedWithoutCacheCount: 0, fixes: [...S ? [S] : Je, x] }; let { fixes: A, computedWithoutCacheCount: w = 0 } = I7e(e, v, o, s, t, r, i, l, f, g); return { computedWithoutCacheCount: w, fixes: [...S ? [S] : Je, ...A] } } function S7e(e, t) { return ks(e, ({ declaration: r, importKind: i }) => { var o; if (i !== 0) return; let s = x7e(r), l = s && ((o = iR(r)) == null ? void 0 : o.text); if (l) return { kind: 0, namespacePrefix: s, usagePosition: t, moduleSpecifier: l } }) } function x7e(e) { var t, r, i; switch (e.kind) { case 257: return (t = zr(e.name, Re)) == null ? void 0 : t.text; case 268: return e.name.text; case 269: return (i = zr((r = e.importClause) == null ? void 0 : r.namedBindings, nv)) == null ? void 0 : i.name.text; default: return L.assertNever(e) } } function nQ(e, t, r, i, o, s) { return e ? t && s.importsNotUsedAsValues === 2 || u4(s) && (!(i & 111551) || o.getTypeOnlyAliasDeclaration(r)) ? 2 : 1 : 4 } function A7e(e, t, r, i) { return ks(e, ({ declaration: o, importKind: s, symbol: l, targetFlags: f }) => { if (s === 3 || s === 2 || o.kind === 268) return; if (o.kind === 257) return (s === 0 || s === 1) && o.name.kind === 203 ? { kind: 2, importClauseOrBindingPattern: o.name, importKind: s, moduleSpecifier: o.initializer.arguments[0].text, addAsTypeOnly: 4 } : void 0; let { importClause: d } = o; if (!d || !es(o.moduleSpecifier)) return; let { name: g, namedBindings: m } = d; if (d.isTypeOnly && !(s === 0 && m)) return; let v = nQ(t, !1, l, f, r, i); if (!(s === 1 && (g || v === 2 && m)) && !(s === 0 && m?.kind === 271)) return { kind: 2, importClauseOrBindingPattern: d, importKind: s, moduleSpecifier: o.moduleSpecifier.text, addAsTypeOnly: v } }) } function gbe(e, t, r) { let i; for (let o of t.imports) { let s = aR(o); if (kH(s.parent)) { let l = e.resolveExternalModuleName(o); l && (i || (i = Nf())).add($a(l), s.parent) } else if (s.kind === 269 || s.kind === 268) { let l = e.getSymbolAtLocation(o); l && (i || (i = Nf())).add($a(l), s) } } return { getImportsForExportInfo: ({ moduleSymbol: o, exportKind: s, targetFlags: l, symbol: f }) => { if (!(l & 111551) && Cu(t)) return Je; let d = i?.get($a(o)); if (!d) return Je; let g = rQ(t, s, r); return d.map(m => ({ declaration: m, importKind: g, symbol: f, targetFlags: l })) } } } function $5(e, t) { if (!Cu(e)) return !1; if (e.commonJsModuleIndicator && !e.externalModuleIndicator) return !0; if (e.externalModuleIndicator && !e.commonJsModuleIndicator) return !1; let r = t.getCompilerOptions(); if (r.configFile) return Rl(r) < 5; for (let i of t.getSourceFiles()) if (!(i === e || !Cu(i) || t.isSourceFileFromExternalLibrary(i))) { if (i.commonJsModuleIndicator && !i.externalModuleIndicator) return !0; if (i.externalModuleIndicator && !i.commonJsModuleIndicator) return !1 } return !0 } function ybe(e, t) { return Jp(r => r ? t.getPackageJsonAutoImportProvider().getTypeChecker() : e.getTypeChecker()) } function C7e(e, t, r, i, o, s, l, f, d) { let g = Cu(t), m = e.getCompilerOptions(), v = $S(e, l), S = ybe(e, l), x = $s(m), A = T7(x), w = d ? F => ({ moduleSpecifiers: Q0.tryGetModuleSpecifiersFromCache(F, t, v, f), computedWithoutCache: !1 }) : (F, B) => Q0.getModuleSpecifiersWithCacheInfo(F, B, m, t, v, f), C = 0, P = Uo(s, (F, B) => { let q = S(F.isFromPackageJson), { computedWithoutCache: W, moduleSpecifiers: Y } = w(F.moduleSymbol, q), R = !!(F.targetFlags & 111551), ie = nQ(i, !0, F.symbol, F.targetFlags, q, m); return C += W ? 1 : 0, Zi(Y, $ => { var fe; if (A && JS($)) return; if (!R && g && r !== void 0) return { kind: 1, moduleSpecifier: $, usagePosition: r, exportInfo: F, isReExport: B > 0 }; let Z = rQ(t, F.exportKind, m), U; if (r !== void 0 && Z === 3 && F.exportKind === 0) { let re = q.resolveExternalModuleSymbol(F.moduleSymbol), le; re !== F.moduleSymbol && (le = (fe = $7(re, q, m)) == null ? void 0 : fe.name), le || (le = sQ(F.moduleSymbol, Do(m), !1)), U = { namespacePrefix: le, usagePosition: r } } return { kind: 3, moduleSpecifier: $, importKind: Z, useRequire: o, addAsTypeOnly: ie, exportInfo: F, isReExport: B > 0, qualification: U } }) }); return { computedWithoutCacheCount: C, fixes: P } } function I7e(e, t, r, i, o, s, l, f, d, g) { let m = ks(t, v => L7e(v, s, l, r.getTypeChecker(), r.getCompilerOptions())); return m ? { fixes: [m] } : C7e(r, i, o, s, l, e, f, d, g) } function L7e({ declaration: e, importKind: t, symbol: r, targetFlags: i }, o, s, l, f) { var d; let g = (d = iR(e)) == null ? void 0 : d.text; if (g) { let m = s ? 4 : nQ(o, !0, r, i, l, f); return { kind: 3, moduleSpecifier: g, importKind: t, addAsTypeOnly: m, useRequire: s } } } function vbe(e, t, r, i) { let o = Vi(e.sourceFile, r), s; if (t === _._0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead.code) s = R7e(e, o); else if (Re(o)) if (t === _._0_cannot_be_used_as_a_value_because_it_was_imported_using_import_type.code) { let f = BU(iQ(e.sourceFile, e.program.getTypeChecker(), o, e.program.getCompilerOptions())), d = Sbe(e.sourceFile, o, f, e.program); return d && [{ fix: d, symbolName: f, errorIdentifierText: o.text }] } else s = P7e(e, o, i); else return; let l = uk(e.sourceFile, e.preferences, e.host); return s && k7e(s, e.sourceFile, e.program, l, e.host) } function k7e(e, t, r, i, o) { let s = l => Ts(l, o.getCurrentDirectory(), lb(o)); return XC(e, (l, f) => g0(!!l.isJsxNamespaceFix, !!f.isJsxNamespaceFix) || Es(l.fix.kind, f.fix.kind) || Ebe(l.fix, f.fix, t, r, i.allowsImportingSpecifier, s)) } function bbe(e, t, r, i, o) { if (vt(e)) return e[0].kind === 0 || e[0].kind === 2 ? e[0] : e.reduce((s, l) => Ebe(l, s, t, r, i.allowsImportingSpecifier, f => Ts(f, o.getCurrentDirectory(), lb(o))) === -1 ? l : s) } function Ebe(e, t, r, i, o, s) { return e.kind !== 0 && t.kind !== 0 ? g0(o(t.moduleSpecifier), o(e.moduleSpecifier)) || w7e(e.moduleSpecifier, t.moduleSpecifier, r, i) || g0(Tbe(e, r, i.getCompilerOptions(), s), Tbe(t, r, i.getCompilerOptions(), s)) || BR(e.moduleSpecifier, t.moduleSpecifier) : 0 } function Tbe(e, t, r, i) { var o; if (e.isReExport && ((o = e.exportInfo) != null && o.moduleFileName) && $s(r) === 2 && D7e(e.exportInfo.moduleFileName)) { let s = i(ni(e.exportInfo.moduleFileName)); return na(t.path, s) } return !1 } function D7e(e) { return Hl(e, [".js", ".jsx", ".d.ts", ".ts", ".tsx"], !0) === "index" } function w7e(e, t, r, i) { return na(e, "node:") && !na(t, "node:") ? W7(r, i) ? -1 : 1 : na(t, "node:") && !na(e, "node:") ? W7(r, i) ? 1 : -1 : 0 } function R7e({ sourceFile: e, program: t, host: r, preferences: i }, o) { let s = t.getTypeChecker(), l = O7e(o, s); if (!l) return; let f = s.getAliasedSymbol(l), d = l.name, g = [{ symbol: l, moduleSymbol: f, moduleFileName: void 0, exportKind: 3, targetFlags: f.flags, isFromPackageJson: !1 }], m = $5(e, t); return Y5(g, void 0, !1, m, t, e, r, i).fixes.map(S => { var x; return { fix: S, symbolName: d, errorIdentifierText: (x = zr(o, Re)) == null ? void 0 : x.text } }) } function O7e(e, t) { let r = Re(e) ? t.getSymbolAtLocation(e) : void 0; if (o4(r)) return r; let { parent: i } = e; if (Au(i) && i.tagName === e || US(i)) { let o = t.resolveName(t.getJsxNamespace(i), Au(i) ? e : i, 111551, !1); if (o4(o)) return o } } function rQ(e, t, r, i) { if (r.verbatimModuleSyntax && (Rl(r) === 1 || e.impliedNodeFormat === 1)) return 3; switch (t) { case 0: return 0; case 1: return 1; case 2: return G7e(e, r, !!i); case 3: return N7e(e, r, !!i); default: return L.assertNever(t) } } function N7e(e, t, r) { if (wT(t)) return 1; let i = Rl(t); switch (i) { case 2: case 1: case 3: return Yn(e) && (Lc(e) || r) ? 2 : 3; case 4: case 5: case 6: case 7: case 99: case 0: return 2; case 100: case 199: return e.impliedNodeFormat === 99 ? 2 : 3; default: return L.assertNever(i, `Unexpected moduleKind ${i}`) } } function P7e({ sourceFile: e, program: t, cancellationToken: r, host: i, preferences: o }, s, l) { let f = t.getTypeChecker(), d = t.getCompilerOptions(); return Uo(iQ(e, f, s, d), g => { if (g === "default") return; let m = TS(s), v = $5(e, t), S = F7e(g, DI(s), ZT(s), r, e, t, l, i, o); return lo(OU(S.values(), x => Y5(x, s.getStart(e), m, v, t, e, i, o).fixes), x => ({ fix: x, symbolName: g, errorIdentifierText: s.text, isJsxNamespaceFix: g !== s.text })) }) } function Sbe(e, t, r, i) { let o = i.getTypeChecker(), s = o.resolveName(r, t, 111551, !0); if (!s) return; let l = o.getTypeOnlyAliasDeclaration(s); if (!(!l || Gn(l) !== e)) return { kind: 4, typeOnlyAliasDeclaration: l } } function iQ(e, t, r, i) { let o = r.parent; if ((Au(o) || GS(o)) && o.tagName === r && wY(i.jsx)) { let s = t.getJsxNamespace(e); if (M7e(s, r, t)) return !GI(r.text) && !t.resolveName(r.text, r, 111551, !1) ? [r.text, s] : [s] } return [r.text] } function M7e(e, t, r) { if (GI(t.text)) return !0; let i = r.resolveName(e, t, 111551, !0); return !i || vt(i.declarations, I0) && !(i.flags & 111551) } function F7e(e, t, r, i, o, s, l, f, d) { var g; let m = Nf(), v = uk(o, d, f), S = (g = f.getModuleSpecifierCache) == null ? void 0 : g.call(f), x = Jp(w => $S(w ? f.getPackageJsonAutoImportProvider() : s, f)); function A(w, C, P, F, B, q) { let W = x(q); if (C && PY(B, o, C, d, v, W, S) || !C && v.allowsImportingAmbientModule(w, W)) { let Y = B.getTypeChecker(); m.add(tge(P, Y).toString(), { symbol: P, moduleSymbol: w, moduleFileName: C?.fileName, exportKind: F, targetFlags: wd(P, Y).flags, isFromPackageJson: q }) } } return MY(s, f, d, l, (w, C, P, F) => { let B = P.getTypeChecker(); i.throwIfCancellationRequested(); let q = P.getCompilerOptions(), W = Y7(w, B, q); W && (W.name === e || sQ(w, Do(q), t) === e) && wbe(W.resolvedSymbol, r) && A(w, C, W.symbol, W.exportKind, P, F); let Y = B.tryGetMemberInModuleExportsAndProperties(e, w); Y && wbe(Y, r) && A(w, C, Y, 0, P, F) }), m } function G7e(e, t, r) { let i = wT(t), o = Yn(e); if (!o && Rl(t) >= 5) return i ? 1 : 2; if (o) return Lc(e) || r ? i ? 1 : 2 : 3; for (let s of e.statements) if (Nl(s) && !rc(s.moduleReference)) return 3; return i ? 1 : 3 } function aQ(e, t, r, i, o, s, l) { let f, d = nr.ChangeTracker.with(e, g => { f = B7e(g, t, r, i, o, s, l) }); return Ma(lQ, d, f, uQ, _.Add_all_missing_imports) } function B7e(e, t, r, i, o, s, l) { let f = J_(t, l); switch (i.kind) { case 0: return oQ(e, t, i), [_.Change_0_to_1, r, `${i.namespacePrefix}.${r}`]; case 1: return Cbe(e, t, i, f), [_.Change_0_to_1, r, Ibe(i.moduleSpecifier, f) + r]; case 2: { let { importClauseOrBindingPattern: d, importKind: g, addAsTypeOnly: m, moduleSpecifier: v } = i; Abe(e, t, d, g === 1 ? { name: r, addAsTypeOnly: m } : void 0, g === 0 ? [{ name: r, addAsTypeOnly: m }] : Je, s, l); let S = u_(v); return o ? [_.Import_0_from_1, r, S] : [_.Update_import_from_0, S] } case 3: { let { importKind: d, moduleSpecifier: g, addAsTypeOnly: m, useRequire: v, qualification: S } = i, x = v ? kbe : Lbe, A = d === 1 ? { name: r, addAsTypeOnly: m } : void 0, w = d === 0 ? [{ name: r, addAsTypeOnly: m }] : void 0, C = d === 2 || d === 3 ? { importKind: d, name: S?.namespacePrefix || r, addAsTypeOnly: m } : void 0; return L7(e, t, x(g, f, A, w, C, s), !0, l), S && oQ(e, t, S), o ? [_.Import_0_from_1, r, g] : [_.Add_import_from_0, g] } case 4: { let { typeOnlyAliasDeclaration: d } = i, g = U7e(e, d, s, t, l); return g.kind === 273 ? [_.Remove_type_from_import_of_0_from_1, r, xbe(g.parent.parent)] : [_.Remove_type_from_import_declaration_from_0, xbe(g)] } default: return L.assertNever(i, `Unexpected fix kind ${i.kind}`) } } function xbe(e) { var t, r; return e.kind === 268 ? ((r = zr((t = zr(e.moduleReference, um)) == null ? void 0 : t.expression, es)) == null ? void 0 : r.text) || e.moduleReference.getText() : Ga(e.parent.moduleSpecifier, yo).text } function U7e(e, t, r, i, o) { let s = u4(r); switch (t.kind) { case 273: if (t.isTypeOnly) { let f = b_.detectImportSpecifierSorting(t.parent.elements, o); if (t.parent.elements.length > 1 && f) { e.delete(i, t); let d = D.updateImportSpecifier(t, !1, t.propertyName, t.name), g = b_.getOrganizeImportsComparer(o, f === 2), m = b_.getImportSpecifierInsertionIndex(t.parent.elements, d, g); e.insertImportSpecifierAtIndex(i, d, t.parent, m) } else e.deleteRange(i, t.getFirstToken()); return t } else return L.assert(t.parent.parent.isTypeOnly), l(t.parent.parent), t.parent.parent; case 270: return l(t), t; case 271: return l(t.parent), t.parent; case 268: return e.deleteRange(i, t.getChildAt(1)), t; default: L.failBadSyntaxKind(t) }function l(f) { if (e.delete(i, cY(f, i)), s) { let d = zr(f.namedBindings, jg); if (d && d.elements.length > 1) { b_.detectImportSpecifierSorting(d.elements, o) && t.kind === 273 && d.elements.indexOf(t) !== 0 && (e.delete(i, t), e.insertImportSpecifierAtIndex(i, t, d, 0)); for (let g of d.elements) g !== t && !g.isTypeOnly && e.insertModifierBefore(i, 154, g) } } } } function Abe(e, t, r, i, o, s, l) { var f; if (r.kind === 203) { i && v(r, i.name, "default"); for (let S of o) v(r, S.name, void 0); return } let d = r.isTypeOnly && vt([i, ...o], S => S?.addAsTypeOnly === 4), g = r.namedBindings && ((f = zr(r.namedBindings, jg)) == null ? void 0 : f.elements), m = d && u4(s); if (i && (L.assert(!r.name, "Cannot add a default import to an import clause that already has one"), e.insertNodeAt(t, r.getStart(t), D.createIdentifier(i.name), { suffix: ", " })), o.length) { let S; if (typeof l.organizeImportsIgnoreCase == "boolean") S = l.organizeImportsIgnoreCase; else if (g) { let C = b_.detectImportSpecifierSorting(g, l); C !== 3 && (S = C === 2) } S === void 0 && (S = b_.detectSorting(t, l) === 2); let x = b_.getOrganizeImportsComparer(l, S), A = Ag(o.map(C => D.createImportSpecifier((!r.isTypeOnly || d) && aP(C), void 0, D.createIdentifier(C.name))), (C, P) => b_.compareImportOrExportSpecifiers(C, P, x)), w = g?.length && b_.detectImportSpecifierSorting(g, l); if (w && !(S && w === 1)) for (let C of A) { let P = m && !C.isTypeOnly ? 0 : b_.getImportSpecifierInsertionIndex(g, C, x); e.insertImportSpecifierAtIndex(t, C, r.namedBindings, P) } else if (g?.length) for (let C of A) e.insertNodeInListAfter(t, To(g), C, g); else if (A.length) { let C = D.createNamedImports(A); r.namedBindings ? e.replaceNode(t, r.namedBindings, C) : e.insertNodeAfter(t, L.checkDefined(r.name, "Import clause must have either named imports or a default import"), C) } } if (d && (e.delete(t, cY(r, t)), m && g)) for (let S of g) e.insertModifierBefore(t, 154, S); function v(S, x, A) { let w = D.createBindingElement(void 0, A, x); S.elements.length ? e.insertNodeInListAfter(t, To(S.elements), w) : e.replaceNode(t, S, D.createObjectBindingPattern([w])) } } function oQ(e, t, { namespacePrefix: r, usagePosition: i }) { e.insertText(t, i, r + ".") } function Cbe(e, t, { moduleSpecifier: r, usagePosition: i }, o) { e.insertText(t, i, Ibe(r, o)) } function Ibe(e, t) { let r = Hhe(t); return `import(${r}${e}${r}).` } function aP({ addAsTypeOnly: e }) { return e === 2 } function Lbe(e, t, r, i, o, s) { let l = S7(e, t), f; if (r !== void 0 || i?.length) { let d = (!r || aP(r)) && Ji(i, aP) || s.verbatimModuleSyntax && r?.addAsTypeOnly !== 4 && !vt(i, g => g.addAsTypeOnly === 4); f = _A(f, Xg(r && D.createIdentifier(r.name), i?.map(({ addAsTypeOnly: g, name: m }) => D.createImportSpecifier(!d && g === 2, void 0, D.createIdentifier(m))), e, t, d)) } if (o) { let d = o.importKind === 3 ? D.createImportEqualsDeclaration(void 0, aP(o), D.createIdentifier(o.name), D.createExternalModuleReference(l)) : D.createImportDeclaration(void 0, D.createImportClause(aP(o), void 0, D.createNamespaceImport(D.createIdentifier(o.name))), l, void 0); f = _A(f, d) } return L.checkDefined(f) } function kbe(e, t, r, i, o) { let s = S7(e, t), l; if (r || i?.length) { let f = i?.map(({ name: g }) => D.createBindingElement(void 0, void 0, g)) || []; r && f.unshift(D.createBindingElement(void 0, "default", r.name)); let d = Dbe(D.createObjectBindingPattern(f), s); l = _A(l, d) } if (o) { let f = Dbe(o.name, s); l = _A(l, f) } return L.checkDefined(l) } function Dbe(e, t) { return D.createVariableStatement(void 0, D.createVariableDeclarationList([D.createVariableDeclaration(typeof e == "string" ? D.createIdentifier(e) : e, void 0, void 0, D.createCallExpression(D.createIdentifier("require"), void 0, [t]))], 2)) } function wbe({ declarations: e }, t) { return vt(e, r => !!(LN(r) & t)) } function sQ(e, t, r) { return cQ(ld(u_(e.name)), t, r) } function cQ(e, t, r) { let i = Hl(pA(e, "/index")), o = "", s = !0, l = i.charCodeAt(0); Pm(l, t) ? (o += String.fromCharCode(l), r && (o = o.toUpperCase())) : s = !1; for (let f = 1; f < i.length; f++) { let d = i.charCodeAt(f), g = tb(d, t); if (g) { let m = String.fromCharCode(d); s || (m = m.toUpperCase()), o += m } s = g } return fS(o) ? `_${o}` : o || "_" } var lQ, uQ, dQ, V7e = gt({ "src/services/codefixes/importFixes.ts"() { "use strict"; Fr(), Qa(), lQ = "import", uQ = "fixMissingImport", dQ = [_.Cannot_find_name_0.code, _.Cannot_find_name_0_Did_you_mean_1.code, _.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0.code, _.Cannot_find_name_0_Did_you_mean_the_static_member_1_0.code, _.Cannot_find_namespace_0.code, _._0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead.code, _._0_only_refers_to_a_type_but_is_being_used_as_a_value_here.code, _.No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer.code, _._0_cannot_be_used_as_a_value_because_it_was_imported_using_import_type.code], za({ errorCodes: dQ, getCodeActions(e) { let { errorCode: t, preferences: r, sourceFile: i, span: o, program: s } = e, l = vbe(e, t, o.start, !0); if (l) return l.map(({ fix: f, symbolName: d, errorIdentifierText: g }) => aQ(e, i, d, f, d !== g, s.getCompilerOptions(), r)) }, fixIds: [uQ], getAllCodeActions: e => { let { sourceFile: t, program: r, preferences: i, host: o, cancellationToken: s } = e, l = _be(t, r, !0, i, o, s); return ax(e, dQ, f => l.addImportFromDiagnostic(f, e)), ix(nr.ChangeTracker.with(e, l.writeFixes)) } }) } }); function Rbe(e, t, r) { let i = wr(e.getSemanticDiagnostics(t), l => l.start === r.start && l.length === r.length); if (i === void 0 || i.relatedInformation === void 0) return; let o = wr(i.relatedInformation, l => l.code === _.This_type_parameter_might_need_an_extends_0_constraint.code); if (o === void 0 || o.file === void 0 || o.start === void 0 || o.length === void 0) return; let s = _Z(o.file, il(o.start, o.length)); if (s !== void 0 && (Re(s) && _c(s.parent) && (s = s.parent), _c(s))) { if (EL(s.parent)) return; let l = Vi(t, r.start), f = e.getTypeChecker(); return { constraint: H7e(f, l) || j7e(o.messageText), declaration: s, token: l } } } function Obe(e, t, r, i, o, s) { let { declaration: l, constraint: f } = s, d = t.getTypeChecker(); if (Ta(f)) e.insertText(o, l.name.end, ` extends ${f}`); else { let g = Do(t.getCompilerOptions()), m = sx({ program: t, host: i }), v = s1(o, t, r, i), S = N9(d, v, f, void 0, g, void 0, m); S && (e.replaceNode(o, l, D.updateTypeParameterDeclaration(l, void 0, l.name, S, l.default)), v.writeFixes(e)) } } function j7e(e) {
+                let [t, r] = sv(e, `
+`, 0).match(/`extends (.*)`/) || []; return r
+            } function H7e(e, t) { return bi(t.parent) ? e.getTypeArgumentConstraint(t.parent) : (ot(t) ? e.getContextualType(t) : void 0) || e.getTypeAtLocation(t) } var Q5, fQ, W7e = gt({ "src/services/codefixes/fixAddMissingConstraint.ts"() { "use strict"; Fr(), Qa(), Q5 = "addMissingConstraint", fQ = [_.Type_0_is_not_comparable_to_type_1.code, _.Type_0_is_not_assignable_to_type_1_Two_different_types_with_this_name_exist_but_they_are_unrelated.code, _.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties.code, _.Type_0_is_not_assignable_to_type_1.code, _.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties.code, _.Property_0_is_incompatible_with_index_signature.code, _.Property_0_in_type_1_is_not_assignable_to_type_2.code, _.Type_0_does_not_satisfy_the_constraint_1.code], za({ errorCodes: fQ, getCodeActions(e) { let { sourceFile: t, span: r, program: i, preferences: o, host: s } = e, l = Rbe(i, t, r); if (l === void 0) return; let f = nr.ChangeTracker.with(e, d => Obe(d, i, o, s, t, l)); return [Ma(Q5, f, _.Add_extends_constraint, Q5, _.Add_extends_constraint_to_all_type_parameters)] }, fixIds: [Q5], getAllCodeActions: e => { let { program: t, preferences: r, host: i } = e, o = new Map; return ix(nr.ChangeTracker.with(e, s => { ax(e, fQ, l => { let f = Rbe(t, l.file, il(l.start, l.length)); if (f && V_(o, zo(f.declaration))) return Obe(s, t, r, i, l.file, f) }) })) } }) } }); function Nbe(e, t, r, i) { switch (r) { case _.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0.code: case _.This_member_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0.code: case _.This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0.code: case _.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0.code: case _.This_parameter_property_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0.code: return z7e(e, t.sourceFile, i); case _.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0.code: case _.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0.code: case _.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class.code: case _.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_extend_another_class.code: return J7e(e, t.sourceFile, i); default: L.fail("Unexpected error code: " + r) } } function z7e(e, t, r) { let i = Mbe(t, r); if (Cu(t)) { e.addJSDocTags(t, i, [D.createJSDocOverrideTag(D.createIdentifier("override"))]); return } let o = i.modifiers || Je, s = wr(o, LS), l = wr(o, Rue), f = wr(o, v => ZX(v.kind)), d = dA(o, du), g = l ? l.end : s ? s.end : f ? f.end : d ? xo(t.text, d.end) : i.getStart(t), m = f || s || l ? { prefix: " " } : { suffix: " " }; e.insertModifierAt(t, g, 161, m) } function J7e(e, t, r) { let i = Mbe(t, r); if (Cu(t)) { e.filterJSDocTags(t, i, y8(g3)); return } let o = wr(i.modifiers, Oue); L.assertIsDefined(o), e.deleteModifier(t, o) } function Pbe(e) { switch (e.kind) { case 173: case 169: case 171: case 174: case 175: return !0; case 166: return Ad(e, e.parent); default: return !1 } } function Mbe(e, t) { let r = Vi(e, t), i = jn(r, o => Yr(o) ? "quit" : Pbe(o)); return L.assert(i && Pbe(i)), i } var _Q, Z2, yk, pQ, mQ, K7e = gt({ "src/services/codefixes/fixOverrideModifier.ts"() { "use strict"; Fr(), Qa(), _Q = "fixOverrideModifier", Z2 = "fixAddOverrideModifier", yk = "fixRemoveOverrideModifier", pQ = [_.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0.code, _.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class.code, _.This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0.code, _.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0.code, _.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0.code, _.This_member_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0.code, _.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_extend_another_class.code, _.This_parameter_property_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0.code, _.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0.code], mQ = { [_.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0.code]: { descriptions: _.Add_override_modifier, fixId: Z2, fixAllDescriptions: _.Add_all_missing_override_modifiers }, [_.This_member_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0.code]: { descriptions: _.Add_override_modifier, fixId: Z2, fixAllDescriptions: _.Add_all_missing_override_modifiers }, [_.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class.code]: { descriptions: _.Remove_override_modifier, fixId: yk, fixAllDescriptions: _.Remove_all_unnecessary_override_modifiers }, [_.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_extend_another_class.code]: { descriptions: _.Remove_override_modifier, fixId: yk, fixAllDescriptions: _.Remove_override_modifier }, [_.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0.code]: { descriptions: _.Add_override_modifier, fixId: Z2, fixAllDescriptions: _.Add_all_missing_override_modifiers }, [_.This_parameter_property_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0.code]: { descriptions: _.Add_override_modifier, fixId: Z2, fixAllDescriptions: _.Add_all_missing_override_modifiers }, [_.This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0.code]: { descriptions: _.Add_override_modifier, fixId: Z2, fixAllDescriptions: _.Remove_all_unnecessary_override_modifiers }, [_.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0.code]: { descriptions: _.Remove_override_modifier, fixId: yk, fixAllDescriptions: _.Remove_all_unnecessary_override_modifiers }, [_.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0.code]: { descriptions: _.Remove_override_modifier, fixId: yk, fixAllDescriptions: _.Remove_all_unnecessary_override_modifiers } }, za({ errorCodes: pQ, getCodeActions: function (t) { let { errorCode: r, span: i } = t, o = mQ[r]; if (!o) return Je; let { descriptions: s, fixId: l, fixAllDescriptions: f } = o, d = nr.ChangeTracker.with(t, g => Nbe(g, t, r, i.start)); return [D$(_Q, d, s, l, f)] }, fixIds: [_Q, Z2, yk], getAllCodeActions: e => ns(e, pQ, (t, r) => { let { code: i, start: o } = r, s = mQ[i]; !s || s.fixId !== e.fixId || Nbe(t, e, i, o) }) }) } }); function Fbe(e, t, r, i) { let o = J_(t, i), s = D.createStringLiteral(r.name.text, o === 0); e.replaceNode(t, r, n6(r) ? D.createElementAccessChain(r.expression, r.questionDotToken, s) : D.createElementAccessExpression(r.expression, s)) } function Gbe(e, t) { return Ga(Vi(e, t).parent, br) } var Z5, hQ, q7e = gt({ "src/services/codefixes/fixNoPropertyAccessFromIndexSignature.ts"() { "use strict"; Fr(), Qa(), Z5 = "fixNoPropertyAccessFromIndexSignature", hQ = [_.Property_0_comes_from_an_index_signature_so_it_must_be_accessed_with_0.code], za({ errorCodes: hQ, fixIds: [Z5], getCodeActions(e) { let { sourceFile: t, span: r, preferences: i } = e, o = Gbe(t, r.start), s = nr.ChangeTracker.with(e, l => Fbe(l, e.sourceFile, o, i)); return [Ma(Z5, s, [_.Use_element_access_for_0, o.name.text], Z5, _.Use_element_access_for_all_undeclared_properties)] }, getAllCodeActions: e => ns(e, hQ, (t, r) => Fbe(t, r.file, Gbe(r.file, r.start), e.preferences)) }) } }); function Bbe(e, t, r, i) { let o = Vi(t, r); if (!H2(o)) return; let s = Ku(o, !1, !1); if (!(!Jc(s) && !ms(s)) && !Li(Ku(s, !1, !1))) { let l = L.checkDefined(Yo(s, 98, t)), { name: f } = s, d = L.checkDefined(s.body); return ms(s) ? f && js.Core.isSymbolReferencedInFile(f, i, t, d) ? void 0 : (e.delete(t, l), f && e.delete(t, f), e.insertText(t, d.pos, " =>"), [_.Convert_function_expression_0_to_arrow_function, f ? f.text : X7]) : (e.replaceNode(t, l, D.createToken(85)), e.insertText(t, f.end, " = "), e.insertText(t, d.pos, " =>"), [_.Convert_function_declaration_0_to_arrow_function, f.text]) } } var e9, gQ, X7e = gt({ "src/services/codefixes/fixImplicitThis.ts"() { "use strict"; Fr(), Qa(), e9 = "fixImplicitThis", gQ = [_.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation.code], za({ errorCodes: gQ, getCodeActions: function (t) { let { sourceFile: r, program: i, span: o } = t, s, l = nr.ChangeTracker.with(t, f => { s = Bbe(f, r, o.start, i.getTypeChecker()) }); return s ? [Ma(e9, l, s, e9, _.Fix_all_implicit_this_errors)] : Je }, fixIds: [e9], getAllCodeActions: e => ns(e, gQ, (t, r) => { Bbe(t, r.file, r.start, e.program.getTypeChecker()) }) }) } }); function Ube(e, t, r) { var i; let o = Vi(e, t); if (Re(o)) { let s = jn(o, gl); if (s === void 0) return; let l = yo(s.moduleSpecifier) ? s.moduleSpecifier.text : void 0; if (l === void 0) return; let f = kA(e, l, void 0); if (f === void 0) return; let d = r.getSourceFile(f.resolvedFileName); if (d === void 0 || dk(r, d)) return; let g = d.symbol, m = (i = zr(g.valueDeclaration, Qp)) == null ? void 0 : i.locals; if (m === void 0) return; let v = m.get(o.escapedText); if (v === void 0) return; let S = $7e(v); return S === void 0 ? void 0 : { exportName: { node: o, isTypeOnly: o2(S) }, node: S, moduleSourceFile: d, moduleSpecifier: l } } } function Y7e(e, t, { exportName: r, node: i, moduleSourceFile: o }) { let s = t9(o, r.isTypeOnly); s ? Vbe(e, t, o, s, [r]) : WR(i) ? e.insertExportModifier(o, i) : jbe(e, t, o, [r]) } function yQ(e, t, r, i, o) { Fn(i) && (o ? Vbe(e, t, r, o, i) : jbe(e, t, r, i)) } function t9(e, t) { let r = i => Il(i) && (t && i.isTypeOnly || !i.isTypeOnly); return dA(e.statements, r) } function Vbe(e, t, r, i, o) { let s = i.exportClause && h_(i.exportClause) ? i.exportClause.elements : D.createNodeArray([]), l = !i.isTypeOnly && !!(d_(t.getCompilerOptions()) || wr(s, f => f.isTypeOnly)); e.replaceNode(r, i, D.updateExportDeclaration(i, i.modifiers, i.isTypeOnly, D.createNamedExports(D.createNodeArray([...s, ...Hbe(o, l)], s.hasTrailingComma)), i.moduleSpecifier, i.assertClause)) } function jbe(e, t, r, i) { e.insertNodeAtEndOfScope(r, r, D.createExportDeclaration(void 0, !1, D.createNamedExports(Hbe(i, d_(t.getCompilerOptions()))), void 0, void 0)) } function Hbe(e, t) { return D.createNodeArray(on(e, r => D.createExportSpecifier(t && r.isTypeOnly, void 0, r.node))) } function $7e(e) { if (e.valueDeclaration === void 0) return Sl(e.declarations); let t = e.valueDeclaration, r = wi(t) ? zr(t.parent.parent, Bc) : void 0; return r && Fn(r.declarationList.declarations) === 1 ? r : t } var n9, vQ, Q7e = gt({ "src/services/codefixes/fixImportNonExportedMember.ts"() { "use strict"; Fr(), Qa(), n9 = "fixImportNonExportedMember", vQ = [_.Module_0_declares_1_locally_but_it_is_not_exported.code], za({ errorCodes: vQ, fixIds: [n9], getCodeActions(e) { let { sourceFile: t, span: r, program: i } = e, o = Ube(t, r.start, i); if (o === void 0) return; let s = nr.ChangeTracker.with(e, l => Y7e(l, i, o)); return [Ma(n9, s, [_.Export_0_from_module_1, o.exportName.node.text, o.moduleSpecifier], n9, _.Export_all_referenced_locals)] }, getAllCodeActions(e) { let { program: t } = e; return ix(nr.ChangeTracker.with(e, r => { let i = new Map; ax(e, vQ, o => { let s = Ube(o.file, o.start, t); if (s === void 0) return; let { exportName: l, node: f, moduleSourceFile: d } = s; if (t9(d, l.isTypeOnly) === void 0 && WR(f)) r.insertExportModifier(d, f); else { let g = i.get(d) || { typeOnlyExports: [], exports: [] }; l.isTypeOnly ? g.typeOnlyExports.push(l) : g.exports.push(l), i.set(d, g) } }), i.forEach((o, s) => { let l = t9(s, !0); l && l.isTypeOnly ? (yQ(r, t, s, o.typeOnlyExports, l), yQ(r, t, s, o.exports, t9(s, !1))) : yQ(r, t, s, [...o.exports, ...o.typeOnlyExports], l) }) })) } }) } }); function Z7e(e, t) { let r = Vi(e, t); return jn(r, i => i.kind === 199) } function e5e(e, t, r) { if (!r) return; let i = r.type, o = !1, s = !1; for (; i.kind === 187 || i.kind === 188 || i.kind === 193;)i.kind === 187 ? o = !0 : i.kind === 188 && (s = !0), i = i.type; let l = D.updateNamedTupleMember(r, r.dotDotDotToken || (s ? D.createToken(25) : void 0), r.name, r.questionToken || (o ? D.createToken(57) : void 0), i); l !== r && e.replaceNode(t, r, l) } var r9, Wbe, t5e = gt({ "src/services/codefixes/fixIncorrectNamedTupleSyntax.ts"() { "use strict"; Fr(), Qa(), r9 = "fixIncorrectNamedTupleSyntax", Wbe = [_.A_labeled_tuple_element_is_declared_as_optional_with_a_question_mark_after_the_name_and_before_the_colon_rather_than_after_the_type.code, _.A_labeled_tuple_element_is_declared_as_rest_with_a_before_the_name_rather_than_before_the_type.code], za({ errorCodes: Wbe, getCodeActions: function (t) { let { sourceFile: r, span: i } = t, o = Z7e(r, i.start), s = nr.ChangeTracker.with(t, l => e5e(l, r, o)); return [Ma(r9, s, _.Move_labeled_tuple_element_modifiers_to_labels, r9, _.Move_labeled_tuple_element_modifiers_to_labels)] }, fixIds: [r9] }) } }); function zbe(e, t, r, i) { let o = Vi(e, t), s = o.parent; if ((i === _.No_overload_matches_this_call.code || i === _.Type_0_is_not_assignable_to_type_1.code) && !Sp(s)) return; let l = r.program.getTypeChecker(), f; if (br(s) && s.name === o) { L.assert(Ah(o), "Expected an identifier for spelling (property access)"); let d = l.getTypeAtLocation(s.expression); s.flags & 32 && (d = l.getNonNullableType(d)), f = l.getSuggestedSymbolForNonexistentProperty(o, d) } else if (ar(s) && s.operatorToken.kind === 101 && s.left === o && pi(o)) { let d = l.getTypeAtLocation(s.right); f = l.getSuggestedSymbolForNonexistentProperty(o, d) } else if (Yu(s) && s.right === o) { let d = l.getSymbolAtLocation(s.left); d && d.flags & 1536 && (f = l.getSuggestedSymbolForNonexistentModule(s.right, d)) } else if ($u(s) && s.name === o) { L.assertNode(o, Re, "Expected an identifier for spelling (import)"); let d = jn(o, gl), g = r5e(e, r, d); g && g.symbol && (f = l.getSuggestedSymbolForNonexistentModule(o, g.symbol)) } else if (Sp(s) && s.name === o) { L.assertNode(o, Re, "Expected an identifier for JSX attribute"); let d = jn(o, Au), g = l.getContextualTypeForArgumentAtIndex(d, 0); f = l.getSuggestedSymbolForNonexistentJSXAttribute(o, g) } else if (Mr(s, 16384) && _l(s) && s.name === o) { let d = jn(o, Yr), g = d ? hp(d) : void 0, m = g ? l.getTypeAtLocation(g) : void 0; m && (f = l.getSuggestedSymbolForNonexistentClassMember(Qc(o), m)) } else { let d = ZT(o), g = Qc(o); L.assert(g !== void 0, "name should be defined"), f = l.getSuggestedSymbolForNonexistentSymbol(o, g, n5e(d)) } return f === void 0 ? void 0 : { node: o, suggestedSymbol: f } } function Jbe(e, t, r, i, o) { let s = fc(i); if (!i_(s, o) && br(r.parent)) { let l = i.valueDeclaration; l && zl(l) && pi(l.name) ? e.replaceNode(t, r, D.createIdentifier(s)) : e.replaceNode(t, r.parent, D.createElementAccessExpression(r.parent.expression, D.createStringLiteral(s))) } else e.replaceNode(t, r, D.createIdentifier(s)) } function n5e(e) { let t = 0; return e & 4 && (t |= 1920), e & 2 && (t |= 788968), e & 1 && (t |= 111551), t } function r5e(e, t, r) { if (!r || !es(r.moduleSpecifier)) return; let i = kA(e, r.moduleSpecifier.text, W_(e, r.moduleSpecifier)); if (i) return t.program.getSourceFile(i.resolvedFileName) } var bQ, EQ, i5e = gt({ "src/services/codefixes/fixSpelling.ts"() { "use strict"; Fr(), Qa(), bQ = "fixSpelling", EQ = [_.Property_0_does_not_exist_on_type_1_Did_you_mean_2.code, _.Property_0_may_not_exist_on_type_1_Did_you_mean_2.code, _.Cannot_find_name_0_Did_you_mean_1.code, _.Could_not_find_name_0_Did_you_mean_1.code, _.Cannot_find_namespace_0_Did_you_mean_1.code, _.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0.code, _.Cannot_find_name_0_Did_you_mean_the_static_member_1_0.code, _._0_has_no_exported_member_named_1_Did_you_mean_2.code, _.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1.code, _.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1.code, _.No_overload_matches_this_call.code, _.Type_0_is_not_assignable_to_type_1.code], za({ errorCodes: EQ, getCodeActions(e) { let { sourceFile: t, errorCode: r } = e, i = zbe(t, e.span.start, e, r); if (!i) return; let { node: o, suggestedSymbol: s } = i, l = Do(e.host.getCompilationSettings()), f = nr.ChangeTracker.with(e, d => Jbe(d, t, o, s, l)); return [Ma("spelling", f, [_.Change_spelling_to_0, fc(s)], bQ, _.Fix_all_detected_spelling_errors)] }, fixIds: [bQ], getAllCodeActions: e => ns(e, EQ, (t, r) => { let i = zbe(r.file, r.start, e, r.code), o = Do(e.host.getCompilationSettings()); i && Jbe(t, e.sourceFile, i.node, i.suggestedSymbol, o) }) }) } }); function Kbe(e, t, r) { let i = e.createSymbol(4, t.escapedText); i.links.type = e.getTypeAtLocation(r); let o = Ua([i]); return e.createAnonymousType(void 0, o, [], [], []) } function TQ(e, t, r, i) { if (!t.body || !Va(t.body) || Fn(t.body.statements) !== 1) return; let o = Vo(t.body.statements); if (Ol(o) && SQ(e, t, e.getTypeAtLocation(o.expression), r, i)) return { declaration: t, kind: 0, expression: o.expression, statement: o, commentSource: o.expression }; if (J0(o) && Ol(o.statement)) { let s = D.createObjectLiteralExpression([D.createPropertyAssignment(o.label, o.statement.expression)]), l = Kbe(e, o.label, o.statement.expression); if (SQ(e, t, l, r, i)) return xs(t) ? { declaration: t, kind: 1, expression: s, statement: o, commentSource: o.statement.expression } : { declaration: t, kind: 0, expression: s, statement: o, commentSource: o.statement.expression } } else if (Va(o) && Fn(o.statements) === 1) { let s = Vo(o.statements); if (J0(s) && Ol(s.statement)) { let l = D.createObjectLiteralExpression([D.createPropertyAssignment(s.label, s.statement.expression)]), f = Kbe(e, s.label, s.statement.expression); if (SQ(e, t, f, r, i)) return { declaration: t, kind: 0, expression: l, statement: o, commentSource: s } } } } function SQ(e, t, r, i, o) { if (o) { let s = e.getSignatureFromDeclaration(t); if (s) { Mr(t, 512) && (r = e.createPromiseType(r)); let l = e.createSignature(t, s.typeParameters, s.thisParameter, s.parameters, r, void 0, s.minArgumentCount, s.flags); r = e.createAnonymousType(void 0, Ua(), [l], [], []) } else r = e.getAnyType() } return e.isTypeAssignableTo(r, i) } function qbe(e, t, r, i) { let o = Vi(t, r); if (!o.parent) return; let s = jn(o.parent, Ds); switch (i) { case _.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value.code: return !s || !s.body || !s.type || !Od(s.type, o) ? void 0 : TQ(e, s, e.getTypeFromTypeNode(s.type), !1); case _.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code: if (!s || !Pa(s.parent) || !s.body) return; let l = s.parent.arguments.indexOf(s), f = e.getContextualTypeForArgumentAtIndex(s.parent, l); return f ? TQ(e, s, f, !0) : void 0; case _.Type_0_is_not_assignable_to_type_1.code: if (!Rh(o) || !PA(o.parent) && !Sp(o.parent)) return; let d = a5e(o.parent); return !d || !Ds(d) || !d.body ? void 0 : TQ(e, d, e.getTypeAtLocation(o.parent), !0) } } function a5e(e) { switch (e.kind) { case 257: case 166: case 205: case 169: case 299: return e.initializer; case 288: return e.initializer && (AL(e.initializer) ? e.initializer.expression : void 0); case 300: case 168: case 302: case 351: case 344: return } } function Xbe(e, t, r, i) { pd(r); let o = P7(t); e.replaceNode(t, i, D.createReturnStatement(r), { leadingTriviaOption: nr.LeadingTriviaOption.Exclude, trailingTriviaOption: nr.TrailingTriviaOption.Exclude, suffix: o ? ";" : void 0 }) } function Ybe(e, t, r, i, o, s) { let l = s || bY(i) ? D.createParenthesizedExpression(i) : i; pd(o), r1(o, l), e.replaceNode(t, r.body, l) } function $be(e, t, r, i) { e.replaceNode(t, r.body, D.createParenthesizedExpression(i)) } function o5e(e, t, r) { let i = nr.ChangeTracker.with(e, o => Xbe(o, e.sourceFile, t, r)); return Ma(i9, i, _.Add_a_return_statement, a9, _.Add_all_missing_return_statement) } function s5e(e, t, r, i) { let o = nr.ChangeTracker.with(e, s => Ybe(s, e.sourceFile, t, r, i, !1)); return Ma(i9, o, _.Remove_braces_from_arrow_function_body, o9, _.Remove_braces_from_all_arrow_function_bodies_with_relevant_issues) } function c5e(e, t, r) { let i = nr.ChangeTracker.with(e, o => $be(o, e.sourceFile, t, r)); return Ma(i9, i, _.Wrap_the_following_body_with_parentheses_which_should_be_an_object_literal, s9, _.Wrap_all_object_literal_with_parentheses) } var i9, a9, o9, s9, xQ, l5e = gt({ "src/services/codefixes/returnValueCorrect.ts"() { "use strict"; Fr(), Qa(), i9 = "returnValueCorrect", a9 = "fixAddReturnStatement", o9 = "fixRemoveBracesFromArrowFunctionBody", s9 = "fixWrapTheBlockWithParen", xQ = [_.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value.code, _.Type_0_is_not_assignable_to_type_1.code, _.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code], za({ errorCodes: xQ, fixIds: [a9, o9, s9], getCodeActions: function (t) { let { program: r, sourceFile: i, span: { start: o }, errorCode: s } = t, l = qbe(r.getTypeChecker(), i, o, s); if (l) return l.kind === 0 ? Sn([o5e(t, l.expression, l.statement)], xs(l.declaration) ? s5e(t, l.declaration, l.expression, l.commentSource) : void 0) : [c5e(t, l.declaration, l.expression)] }, getAllCodeActions: e => ns(e, xQ, (t, r) => { let i = qbe(e.program.getTypeChecker(), r.file, r.start, r.code); if (i) switch (e.fixId) { case a9: Xbe(t, r.file, i.expression, i.statement); break; case o9: if (!xs(i.declaration)) return; Ybe(t, r.file, i.declaration, i.expression, i.commentSource, !1); break; case s9: if (!xs(i.declaration)) return; $be(t, r.file, i.declaration, i.expression); break; default: L.fail(JSON.stringify(e.fixId)) } }) }) } }); function Qbe(e, t, r, i, o) { var s; let l = Vi(e, t), f = l.parent; if (r === _.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code) { if (!(l.kind === 18 && rs(f) && Pa(f.parent))) return; let x = Yc(f.parent.arguments, P => P === f); if (x < 0) return; let A = i.getResolvedSignature(f.parent); if (!(A && A.declaration && A.parameters[x])) return; let w = A.parameters[x].valueDeclaration; if (!(w && ha(w) && Re(w.name))) return; let C = lo(i.getUnmatchedProperties(i.getTypeAtLocation(f), i.getParameterType(A, x), !1, !1)); return Fn(C) ? { kind: 3, token: w.name, properties: C, parentDeclaration: f } : void 0 } if (!Ah(l)) return; if (Re(l) && Jy(f) && f.initializer && rs(f.initializer)) { let x = lo(i.getUnmatchedProperties(i.getTypeAtLocation(f.initializer), i.getTypeAtLocation(l), !1, !1)); return Fn(x) ? { kind: 3, token: l, properties: x, parentDeclaration: f.initializer } : void 0 } if (Re(l) && Au(l.parent)) { let x = Do(o.getCompilerOptions()), A = h5e(i, x, l.parent); return Fn(A) ? { kind: 4, token: l, attributes: A, parentDeclaration: l.parent } : void 0 } if (Re(l)) { let x = (s = i.getContextualType(l)) == null ? void 0 : s.getNonNullableType(); if (x && Ur(x) & 16) { let A = Sl(i.getSignaturesOfType(x, 0)); return A === void 0 ? void 0 : { kind: 5, token: l, signature: A, sourceFile: e, parentDeclaration: l0e(l) } } if (Pa(f) && f.expression === l) return { kind: 2, token: l, call: f, sourceFile: e, modifierFlags: 0, parentDeclaration: l0e(l) } } if (!br(f)) return; let d = iY(i.getTypeAtLocation(f.expression)), g = d.symbol; if (!g || !g.declarations) return; if (Re(l) && Pa(f.parent)) { let x = wr(g.declarations, Tc), A = x?.getSourceFile(); if (x && A && !dk(o, A)) return { kind: 2, token: l, call: f.parent, sourceFile: e, modifierFlags: 1, parentDeclaration: x }; let w = wr(g.declarations, Li); if (e.commonJsModuleIndicator) return; if (w && !dk(o, w)) return { kind: 2, token: l, call: f.parent, sourceFile: w, modifierFlags: 1, parentDeclaration: w } } let m = wr(g.declarations, Yr); if (!m && pi(l)) return; let v = m || wr(g.declarations, x => ku(x) || Rd(x)); if (v && !dk(o, v.getSourceFile())) { let x = !Rd(v) && (d.target || d) !== i.getDeclaredTypeOfSymbol(g); if (x && (pi(l) || ku(v))) return; let A = v.getSourceFile(), w = Rd(v) ? 0 : (x ? 32 : 0) | (DY(l.text) ? 8 : 0), C = Cu(A), P = zr(f.parent, Pa); return { kind: 0, token: l, call: P, modifierFlags: w, parentDeclaration: v, declSourceFile: A, isJSFile: C } } let S = wr(g.declarations, hb); if (S && !(d.flags & 1056) && !pi(l) && !dk(o, S.getSourceFile())) return { kind: 1, token: l, parentDeclaration: S } } function u5e(e, t) { return t.isJSFile ? aT(d5e(e, t)) : f5e(e, t) } function d5e(e, { parentDeclaration: t, declSourceFile: r, modifierFlags: i, token: o }) { if (ku(t) || Rd(t)) return; let s = nr.ChangeTracker.with(e, f => Zbe(f, r, t, o, !!(i & 32))); if (s.length === 0) return; let l = i & 32 ? _.Initialize_static_property_0 : pi(o) ? _.Declare_a_private_field_named_0 : _.Initialize_property_0_in_the_constructor; return Ma(Yg, s, [l, o.text], Yg, _.Add_all_missing_members) } function Zbe(e, t, r, i, o) { let s = i.text; if (o) { if (r.kind === 228) return; let l = r.name.getText(), f = e0e(D.createIdentifier(l), s); e.insertNodeAfter(t, r, f) } else if (pi(i)) { let l = D.createPropertyDeclaration(void 0, s, void 0, void 0, void 0), f = r0e(r); f ? e.insertNodeAfter(t, f, l) : e.insertMemberAtStart(t, r, l) } else { let l = Vm(r); if (!l) return; let f = e0e(D.createThis(), s); e.insertNodeAtConstructorEnd(t, l, f) } } function e0e(e, t) { return D.createExpressionStatement(D.createAssignment(D.createPropertyAccessExpression(e, t), c1())) } function f5e(e, { parentDeclaration: t, declSourceFile: r, modifierFlags: i, token: o }) { let s = o.text, l = i & 32, f = t0e(e.program.getTypeChecker(), t, o), d = m => nr.ChangeTracker.with(e, v => n0e(v, r, t, s, f, m)), g = [Ma(Yg, d(i & 32), [l ? _.Declare_static_property_0 : _.Declare_property_0, s], Yg, _.Add_all_missing_members)]; return l || pi(o) || (i & 8 && g.unshift(K_(Yg, d(8), [_.Declare_private_property_0, s])), g.push(_5e(e, r, t, o.text, f))), g } function t0e(e, t, r) { let i; if (r.parent.parent.kind === 223) { let o = r.parent.parent, s = r.parent === o.left ? o.right : o.left, l = e.getWidenedType(e.getBaseTypeOfLiteralType(e.getTypeAtLocation(s))); i = e.typeToTypeNode(l, t, 1) } else { let o = e.getContextualType(r.parent); i = o ? e.typeToTypeNode(o, void 0, 1) : void 0 } return i || D.createKeywordTypeNode(131) } function n0e(e, t, r, i, o, s) { let l = s ? D.createNodeArray(D.createModifiersFromModifierFlags(s)) : void 0, f = Yr(r) ? D.createPropertyDeclaration(l, i, void 0, o, void 0) : D.createPropertySignature(void 0, i, void 0, o), d = r0e(r); d ? e.insertNodeAfter(t, d, f) : e.insertMemberAtStart(t, r, f) } function r0e(e) { let t; for (let r of e.members) { if (!Na(r)) break; t = r } return t } function _5e(e, t, r, i, o) { let s = D.createKeywordTypeNode(152), l = D.createParameterDeclaration(void 0, void 0, "x", void 0, s, void 0), f = D.createIndexSignature(void 0, [l], o), d = nr.ChangeTracker.with(e, g => g.insertMemberAtStart(t, r, f)); return K_(Yg, d, [_.Add_index_signature_for_property_0, i]) } function p5e(e, t) { let { parentDeclaration: r, declSourceFile: i, modifierFlags: o, token: s, call: l } = t; if (l === void 0 || pi(s)) return; let f = s.text, d = m => nr.ChangeTracker.with(e, v => i0e(e, v, l, s, m, r, i)), g = [Ma(Yg, d(o & 32), [o & 32 ? _.Declare_static_method_0 : _.Declare_method_0, f], Yg, _.Add_all_missing_members)]; return o & 8 && g.unshift(K_(Yg, d(8), [_.Declare_private_method_0, f])), g } function i0e(e, t, r, i, o, s, l) { let f = s1(l, e.program, e.preferences, e.host), d = Yr(s) ? 171 : 170, g = sZ(d, e, f, r, i, o, s), m = g5e(s, r); m ? t.insertNodeAfter(l, m, g) : t.insertMemberAtStart(l, s, g), f.writeFixes(t) } function a0e(e, t, { token: r, parentDeclaration: i }) { let o = vt(i.members, l => { let f = t.getTypeAtLocation(l); return !!(f && f.flags & 402653316) }), s = D.createEnumMember(r, o ? D.createStringLiteral(r.text) : void 0); e.replaceNode(i.getSourceFile(), i, D.updateEnumDeclaration(i, i.modifiers, i.name, Qi(i.members, aT(s))), { leadingTriviaOption: nr.LeadingTriviaOption.IncludeAll, trailingTriviaOption: nr.TrailingTriviaOption.Exclude }) } function o0e(e, t, r) { let i = J_(t.sourceFile, t.preferences), o = s1(t.sourceFile, t.program, t.preferences, t.host), s = r.kind === 2 ? sZ(259, t, o, r.call, vr(r.token), r.modifierFlags, r.parentDeclaration) : O9(259, t, i, r.signature, fP(_.Function_not_implemented.message, i), r.token, void 0, void 0, void 0, o); s === void 0 && L.fail("fixMissingFunctionDeclaration codefix got unexpected error."), j_(r.parentDeclaration) ? e.insertNodeBefore(r.sourceFile, r.parentDeclaration, s, !0) : e.insertNodeAtEndOfScope(r.sourceFile, r.parentDeclaration, s), o.writeFixes(e) } function s0e(e, t, r) { let i = s1(t.sourceFile, t.program, t.preferences, t.host), o = J_(t.sourceFile, t.preferences), s = t.program.getTypeChecker(), l = r.parentDeclaration.attributes, f = vt(l.properties, GT), d = on(r.attributes, v => { let S = c9(t, s, i, o, s.getTypeOfSymbol(v), r.parentDeclaration), x = D.createIdentifier(v.name), A = D.createJsxAttribute(x, D.createJsxExpression(void 0, S)); return go(x, A), A }), g = D.createJsxAttributes(f ? [...d, ...l.properties] : [...l.properties, ...d]), m = { prefix: l.pos === l.end ? " " : void 0 }; e.replaceNode(t.sourceFile, l, g, m), i.writeFixes(e) } function c0e(e, t, r) { let i = s1(t.sourceFile, t.program, t.preferences, t.host), o = J_(t.sourceFile, t.preferences), s = Do(t.program.getCompilerOptions()), l = t.program.getTypeChecker(), f = on(r.properties, g => { let m = c9(t, l, i, o, l.getTypeOfSymbol(g), r.parentDeclaration); return D.createPropertyAssignment(y5e(g, s, o, l), m) }), d = { leadingTriviaOption: nr.LeadingTriviaOption.Exclude, trailingTriviaOption: nr.TrailingTriviaOption.Exclude, indentation: r.indentation }; e.replaceNode(t.sourceFile, r.parentDeclaration, D.createObjectLiteralExpression([...r.parentDeclaration.properties, ...f], !0), d), i.writeFixes(e) } function c9(e, t, r, i, o, s) { if (o.flags & 3) return c1(); if (o.flags & 134217732) return D.createStringLiteral("", i === 0); if (o.flags & 8) return D.createNumericLiteral(0); if (o.flags & 64) return D.createBigIntLiteral("0n"); if (o.flags & 16) return D.createFalse(); if (o.flags & 1056) { let l = o.symbol.exports ? u8(o.symbol.exports.values()) : o.symbol, f = t.symbolToExpression(o.symbol.parent ? o.symbol.parent : o.symbol, 111551, void 0, void 0); return l === void 0 || f === void 0 ? D.createNumericLiteral(0) : D.createPropertyAccessExpression(f, t.symbolToString(l)) } if (o.flags & 256) return D.createNumericLiteral(o.value); if (o.flags & 2048) return D.createBigIntLiteral(o.value); if (o.flags & 128) return D.createStringLiteral(o.value, i === 0); if (o.flags & 512) return o === t.getFalseType() || o === t.getFalseType(!0) ? D.createFalse() : D.createTrue(); if (o.flags & 65536) return D.createNull(); if (o.flags & 1048576) { let l = ks(o.types, f => c9(e, t, r, i, f, s)); return l ?? c1() } if (t.isArrayLikeType(o)) return D.createArrayLiteralExpression(); if (m5e(o)) { let l = on(t.getPropertiesOfType(o), f => { let d = c9(e, t, r, i, t.getTypeOfSymbol(f), s); return D.createPropertyAssignment(f.name, d) }); return D.createObjectLiteralExpression(l, !0) } if (Ur(o) & 16) { if (wr(o.symbol.declarations || Je, Kp(Jm, zm, Nc)) === void 0) return c1(); let f = t.getSignaturesOfType(o, 0); if (f === void 0) return c1(); let d = O9(215, e, i, f[0], fP(_.Function_not_implemented.message, i), void 0, void 0, void 0, s, r); return d ?? c1() } if (Ur(o) & 1) { let l = Nh(o.symbol); if (l === void 0 || B0(l)) return c1(); let f = Vm(l); return f && Fn(f.parameters) ? c1() : D.createNewExpression(D.createIdentifier(o.symbol.name), void 0, void 0) } return c1() } function c1() { return D.createIdentifier("undefined") } function m5e(e) { return e.flags & 524288 && (Ur(e) & 128 || e.symbol && zr(Wp(e.symbol.declarations), Rd)) } function h5e(e, t, r) { let i = e.getContextualType(r.attributes); if (i === void 0) return Je; let o = i.getProperties(); if (!Fn(o)) return Je; let s = new Set; for (let l of r.attributes.properties) if (Sp(l) && s.add(l.name.escapedText), GT(l)) { let f = e.getTypeAtLocation(l.expression); for (let d of f.getProperties()) s.add(d.escapedName) } return Pr(o, l => i_(l.name, t, 1) && !(l.flags & 16777216 || ac(l) & 48 || s.has(l.escapedName))) } function g5e(e, t) { if (Rd(e)) return; let r = jn(t, i => Nc(i) || Ec(i)); return r && r.parent === e ? r : void 0 } function y5e(e, t, r, i) { if (Zp(e)) { let o = i.symbolToNode(e, 111551, void 0, 1073741824); if (o && ts(o)) return o } return E4(e.name, t, r === 0) } function l0e(e) { if (jn(e, AL)) { let t = jn(e.parent, j_); if (t) return t } return Gn(e) } var Yg, oP, sP, cP, AQ, v5e = gt({ "src/services/codefixes/fixAddMissingMember.ts"() { "use strict"; Fr(), Qa(), Yg = "fixMissingMember", oP = "fixMissingProperties", sP = "fixMissingAttributes", cP = "fixMissingFunctionDeclaration", AQ = [_.Property_0_does_not_exist_on_type_1.code, _.Property_0_does_not_exist_on_type_1_Did_you_mean_2.code, _.Property_0_is_missing_in_type_1_but_required_in_type_2.code, _.Type_0_is_missing_the_following_properties_from_type_1_Colon_2.code, _.Type_0_is_missing_the_following_properties_from_type_1_Colon_2_and_3_more.code, _.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code, _.Cannot_find_name_0.code], za({ errorCodes: AQ, getCodeActions(e) { let t = e.program.getTypeChecker(), r = Qbe(e.sourceFile, e.span.start, e.errorCode, t, e.program); if (r) { if (r.kind === 3) { let i = nr.ChangeTracker.with(e, o => c0e(o, e, r)); return [Ma(oP, i, _.Add_missing_properties, oP, _.Add_all_missing_properties)] } if (r.kind === 4) { let i = nr.ChangeTracker.with(e, o => s0e(o, e, r)); return [Ma(sP, i, _.Add_missing_attributes, sP, _.Add_all_missing_attributes)] } if (r.kind === 2 || r.kind === 5) { let i = nr.ChangeTracker.with(e, o => o0e(o, e, r)); return [Ma(cP, i, [_.Add_missing_function_declaration_0, r.token.text], cP, _.Add_all_missing_function_declarations)] } if (r.kind === 1) { let i = nr.ChangeTracker.with(e, o => a0e(o, e.program.getTypeChecker(), r)); return [Ma(Yg, i, [_.Add_missing_enum_member_0, r.token.text], Yg, _.Add_all_missing_members)] } return Qi(p5e(e, r), u5e(e, r)) } }, fixIds: [Yg, cP, oP, sP], getAllCodeActions: e => { let { program: t, fixId: r } = e, i = t.getTypeChecker(), o = new Map, s = new Map; return ix(nr.ChangeTracker.with(e, l => { ax(e, AQ, f => { let d = Qbe(f.file, f.start, f.code, i, e.program); if (!(!d || !V_(o, zo(d.parentDeclaration) + "#" + d.token.text))) { if (r === cP && (d.kind === 2 || d.kind === 5)) o0e(l, e, d); else if (r === oP && d.kind === 3) c0e(l, e, d); else if (r === sP && d.kind === 4) s0e(l, e, d); else if (d.kind === 1 && a0e(l, i, d), d.kind === 0) { let { parentDeclaration: g, token: m } = d, v = VD(s, g, () => []); v.some(S => S.token.text === m.text) || v.push(d) } } }), s.forEach((f, d) => { let g = Rd(d) ? void 0 : mZ(d, i); for (let m of f) { if (g?.some(P => { let F = s.get(P); return !!F && F.some(({ token: B }) => B.text === m.token.text) })) continue; let { parentDeclaration: v, declSourceFile: S, modifierFlags: x, token: A, call: w, isJSFile: C } = m; if (w && !pi(A)) i0e(e, l, w, A, x & 32, v, S); else if (C && !ku(v) && !Rd(v)) Zbe(l, S, v, A, !!(x & 32)); else { let P = t0e(i, v, A); n0e(l, S, v, A.text, P, x & 32) } } }) })) } }) } }); function u0e(e, t, r) { let i = Ga(b5e(t, r), Pa), o = D.createNewExpression(i.expression, i.typeArguments, i.arguments); e.replaceNode(t, i, o) } function b5e(e, t) { let r = Vi(e, t.start), i = wl(t); for (; r.end < i;)r = r.parent; return r } var l9, CQ, E5e = gt({ "src/services/codefixes/fixAddMissingNewOperator.ts"() { "use strict"; Fr(), Qa(), l9 = "addMissingNewOperator", CQ = [_.Value_of_type_0_is_not_callable_Did_you_mean_to_include_new.code], za({ errorCodes: CQ, getCodeActions(e) { let { sourceFile: t, span: r } = e, i = nr.ChangeTracker.with(e, o => u0e(o, t, r)); return [Ma(l9, i, _.Add_missing_new_operator_to_call, l9, _.Add_missing_new_operator_to_all_calls)] }, fixIds: [l9], getAllCodeActions: e => ns(e, CQ, (t, r) => u0e(t, e.sourceFile, r)) }) } }); function d0e(e, t) { return { type: "install package", file: e, packageName: t } } function f0e(e, t) { let r = zr(Vi(e, t), yo); if (!r) return; let i = r.text, { packageName: o } = ZJ(i); return fl(o) ? void 0 : o } function _0e(e, t, r) { var i; return r === IQ ? QT.nodeCoreModules.has(e) ? "@types/node" : void 0 : (i = t.isKnownTypesPackageName) != null && i.call(t, e) ? rF(e) : void 0 } var p0e, u9, IQ, LQ, T5e = gt({ "src/services/codefixes/fixCannotFindModule.ts"() { "use strict"; Fr(), Qa(), p0e = "fixCannotFindModule", u9 = "installTypesPackage", IQ = _.Cannot_find_module_0_or_its_corresponding_type_declarations.code, LQ = [IQ, _.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type.code], za({ errorCodes: LQ, getCodeActions: function (t) { let { host: r, sourceFile: i, span: { start: o } } = t, s = f0e(i, o); if (s === void 0) return; let l = _0e(s, r, t.errorCode); return l === void 0 ? [] : [Ma(p0e, [], [_.Install_0, l], u9, _.Install_all_missing_types_packages, d0e(i.fileName, l))] }, fixIds: [u9], getAllCodeActions: e => ns(e, LQ, (t, r, i) => { let o = f0e(r.file, r.start); if (o !== void 0) switch (e.fixId) { case u9: { let s = _0e(o, e.host, r.code); s && i.push(d0e(r.file.fileName, s)); break } default: L.fail(`Bad fixId: ${e.fixId}`) } }) }) } }); function m0e(e, t) { let r = Vi(e, t); return Ga(r.parent, Yr) } function h0e(e, t, r, i, o) { let s = hp(e), l = r.program.getTypeChecker(), f = l.getTypeAtLocation(s), d = l.getPropertiesOfType(f).filter(S5e), g = s1(t, r.program, o, r.host); oZ(e, d, t, r, o, g, m => i.insertMemberAtStart(t, e, m)), g.writeFixes(i) } function S5e(e) { let t = Yy(Vo(e.getDeclarations())); return !(t & 8) && !!(t & 256) } var kQ, d9, x5e = gt({ "src/services/codefixes/fixClassDoesntImplementInheritedAbstractMember.ts"() { "use strict"; Fr(), Qa(), kQ = [_.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2.code, _.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1.code], d9 = "fixClassDoesntImplementInheritedAbstractMember", za({ errorCodes: kQ, getCodeActions: function (t) { let { sourceFile: r, span: i } = t, o = nr.ChangeTracker.with(t, s => h0e(m0e(r, i.start), r, t, s, t.preferences)); return o.length === 0 ? void 0 : [Ma(d9, o, _.Implement_inherited_abstract_class, d9, _.Implement_all_inherited_abstract_classes)] }, fixIds: [d9], getAllCodeActions: function (t) { let r = new Map; return ns(t, kQ, (i, o) => { let s = m0e(o.file, o.start); V_(r, zo(s)) && h0e(s, t.sourceFile, t, i, t.preferences) }) } }) } }); function g0e(e, t, r, i) { e.insertNodeAtConstructorStart(t, r, i), e.delete(t, i) } function y0e(e, t) { let r = Vi(e, t); if (r.kind !== 108) return; let i = Xd(r), o = v0e(i.body); return o && !o.expression.arguments.some(s => br(s) && s.expression === r) ? { constructor: i, superCall: o } : void 0 } function v0e(e) { return Ol(e) && OA(e.expression) ? e : Ia(e) ? void 0 : pa(e, v0e) } var f9, DQ, A5e = gt({ "src/services/codefixes/fixClassSuperMustPrecedeThisAccess.ts"() { "use strict"; Fr(), Qa(), f9 = "classSuperMustPrecedeThisAccess", DQ = [_.super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class.code], za({ errorCodes: DQ, getCodeActions(e) { let { sourceFile: t, span: r } = e, i = y0e(t, r.start); if (!i) return; let { constructor: o, superCall: s } = i, l = nr.ChangeTracker.with(e, f => g0e(f, t, o, s)); return [Ma(f9, l, _.Make_super_call_the_first_statement_in_the_constructor, f9, _.Make_all_super_calls_the_first_statement_in_their_constructor)] }, fixIds: [f9], getAllCodeActions(e) { let { sourceFile: t } = e, r = new Map; return ns(e, DQ, (i, o) => { let s = y0e(o.file, o.start); if (!s) return; let { constructor: l, superCall: f } = s; V_(r, zo(l.parent)) && g0e(i, t, l, f) }) } }) } }); function b0e(e, t) { let r = Vi(e, t); return L.assert(Ec(r.parent), "token should be at the constructor declaration"), r.parent } function E0e(e, t, r) { let i = D.createExpressionStatement(D.createCallExpression(D.createSuper(), void 0, Je)); e.insertNodeAtConstructorStart(t, r, i) } var _9, wQ, C5e = gt({ "src/services/codefixes/fixConstructorForDerivedNeedSuperCall.ts"() { "use strict"; Fr(), Qa(), _9 = "constructorForDerivedNeedSuperCall", wQ = [_.Constructors_for_derived_classes_must_contain_a_super_call.code], za({ errorCodes: wQ, getCodeActions(e) { let { sourceFile: t, span: r } = e, i = b0e(t, r.start), o = nr.ChangeTracker.with(e, s => E0e(s, t, i)); return [Ma(_9, o, _.Add_missing_super_call, _9, _.Add_all_missing_super_calls)] }, fixIds: [_9], getAllCodeActions: e => ns(e, wQ, (t, r) => E0e(t, e.sourceFile, b0e(r.file, r.start))) }) } }); function T0e(e, t) { dZ(e, t, "jsx", D.createStringLiteral("react")) } var RQ, OQ, I5e = gt({ "src/services/codefixes/fixEnableJsxFlag.ts"() { "use strict"; Fr(), Qa(), RQ = "fixEnableJsxFlag", OQ = [_.Cannot_use_JSX_unless_the_jsx_flag_is_provided.code], za({ errorCodes: OQ, getCodeActions: function (t) { let { configFile: r } = t.program.getCompilerOptions(); if (r === void 0) return; let i = nr.ChangeTracker.with(t, o => T0e(o, r)); return [K_(RQ, i, _.Enable_the_jsx_flag_in_your_configuration_file)] }, fixIds: [RQ], getAllCodeActions: e => ns(e, OQ, t => { let { configFile: r } = e.program.getCompilerOptions(); r !== void 0 && T0e(t, r) }) }) } }); function S0e(e, t, r) { let i = wr(e.getSemanticDiagnostics(t), l => l.start === r.start && l.length === r.length); if (i === void 0 || i.relatedInformation === void 0) return; let o = wr(i.relatedInformation, l => l.code === _.Did_you_mean_0.code); if (o === void 0 || o.file === void 0 || o.start === void 0 || o.length === void 0) return; let s = _Z(o.file, il(o.start, o.length)); if (s !== void 0 && ot(s) && ar(s.parent)) return { suggestion: L5e(o.messageText), expression: s.parent, arg: s } } function x0e(e, t, r, i) { let o = D.createCallExpression(D.createPropertyAccessExpression(D.createIdentifier("Number"), D.createIdentifier("isNaN")), void 0, [r]), s = i.operatorToken.kind; e.replaceNode(t, i, s === 37 || s === 35 ? D.createPrefixUnaryExpression(53, o) : o) } function L5e(e) {
+                let [t, r] = sv(e, `
+`, 0).match(/\'(.*)\'/) || []; return r
+            } var p9, NQ, k5e = gt({ "src/services/codefixes/fixNaNEquality.ts"() { "use strict"; Fr(), Qa(), p9 = "fixNaNEquality", NQ = [_.This_condition_will_always_return_0.code], za({ errorCodes: NQ, getCodeActions(e) { let { sourceFile: t, span: r, program: i } = e, o = S0e(i, t, r); if (o === void 0) return; let { suggestion: s, expression: l, arg: f } = o, d = nr.ChangeTracker.with(e, g => x0e(g, t, f, l)); return [Ma(p9, d, [_.Use_0, s], p9, _.Use_Number_isNaN_in_all_conditions)] }, fixIds: [p9], getAllCodeActions: e => ns(e, NQ, (t, r) => { let i = S0e(e.program, r.file, il(r.start, r.length)); i && x0e(t, r.file, i.arg, i.expression) }) }) } }), D5e = gt({ "src/services/codefixes/fixModuleAndTargetOptions.ts"() { "use strict"; Fr(), Qa(), za({ errorCodes: [_.Top_level_await_expressions_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_or_nodenext_and_the_target_option_is_set_to_es2017_or_higher.code, _.Top_level_for_await_loops_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_node16_or_nodenext_and_the_target_option_is_set_to_es2017_or_higher.code], getCodeActions: function (t) { let r = t.program.getCompilerOptions(), { configFile: i } = r; if (i === void 0) return; let o = [], s = Rl(r); if (s >= 5 && s < 99) { let g = nr.ChangeTracker.with(t, m => { dZ(m, i, "module", D.createStringLiteral("esnext")) }); o.push(K_("fixModuleOption", g, [_.Set_the_module_option_in_your_configuration_file_to_0, "esnext"])) } let f = Do(r); if (f < 4 || f > 99) { let g = nr.ChangeTracker.with(t, m => { if (!LI(i)) return; let S = [["target", D.createStringLiteral("es2017")]]; s === 1 && S.push(["module", D.createStringLiteral("commonjs")]), uZ(m, i, S) }); o.push(K_("fixTargetOption", g, [_.Set_the_target_option_in_your_configuration_file_to_0, "es2017"])) } return o.length ? o : void 0 } }) } }); function A0e(e, t, r) { e.replaceNode(t, r, D.createPropertyAssignment(r.name, r.objectAssignmentInitializer)) } function C0e(e, t) { return Ga(Vi(e, t).parent, xf) } var m9, PQ, w5e = gt({ "src/services/codefixes/fixPropertyAssignment.ts"() { "use strict"; Fr(), Qa(), m9 = "fixPropertyAssignment", PQ = [_.Did_you_mean_to_use_a_Colon_An_can_only_follow_a_property_name_when_the_containing_object_literal_is_part_of_a_destructuring_pattern.code], za({ errorCodes: PQ, fixIds: [m9], getCodeActions(e) { let { sourceFile: t, span: r } = e, i = C0e(t, r.start), o = nr.ChangeTracker.with(e, s => A0e(s, e.sourceFile, i)); return [Ma(m9, o, [_.Change_0_to_1, "=", ":"], m9, [_.Switch_each_misused_0_to_1, "=", ":"])] }, getAllCodeActions: e => ns(e, PQ, (t, r) => A0e(t, r.file, C0e(r.file, r.start))) }) } }); function I0e(e, t) { let r = Vi(e, t), i = Zc(r).heritageClauses, o = i[0].getFirstToken(); return o.kind === 94 ? { extendsToken: o, heritageClauses: i } : void 0 } function L0e(e, t, r, i) { if (e.replaceNode(t, r, D.createToken(117)), i.length === 2 && i[0].token === 94 && i[1].token === 117) { let o = i[1].getFirstToken(), s = o.getFullStart(); e.replaceRange(t, { pos: s, end: s }, D.createToken(27)); let l = t.text, f = o.end; for (; f < l.length && Yp(l.charCodeAt(f));)f++; e.deleteRange(t, { pos: o.getStart(), end: f }) } } var h9, MQ, R5e = gt({ "src/services/codefixes/fixExtendsInterfaceBecomesImplements.ts"() { "use strict"; Fr(), Qa(), h9 = "extendsInterfaceBecomesImplements", MQ = [_.Cannot_extend_an_interface_0_Did_you_mean_implements.code], za({ errorCodes: MQ, getCodeActions(e) { let { sourceFile: t } = e, r = I0e(t, e.span.start); if (!r) return; let { extendsToken: i, heritageClauses: o } = r, s = nr.ChangeTracker.with(e, l => L0e(l, t, i, o)); return [Ma(h9, s, _.Change_extends_to_implements, h9, _.Change_all_extended_interfaces_to_implements)] }, fixIds: [h9], getAllCodeActions: e => ns(e, MQ, (t, r) => { let i = I0e(r.file, r.start); i && L0e(t, r.file, i.extendsToken, i.heritageClauses) }) }) } }); function k0e(e, t, r) { let i = Vi(e, t); if (Re(i) || pi(i)) return { node: i, className: r === FQ ? Zc(i).name.text : void 0 } } function D0e(e, t, { node: r, className: i }) { pd(r), e.replaceNode(t, r, D.createPropertyAccessExpression(i ? D.createIdentifier(i) : D.createThis(), r)) } var g9, FQ, GQ, O5e = gt({ "src/services/codefixes/fixForgottenThisPropertyAccess.ts"() { "use strict"; Fr(), Qa(), g9 = "forgottenThisPropertyAccess", FQ = _.Cannot_find_name_0_Did_you_mean_the_static_member_1_0.code, GQ = [_.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0.code, _.Private_identifiers_are_only_allowed_in_class_bodies_and_may_only_be_used_as_part_of_a_class_member_declaration_property_access_or_on_the_left_hand_side_of_an_in_expression.code, FQ], za({ errorCodes: GQ, getCodeActions(e) { let { sourceFile: t } = e, r = k0e(t, e.span.start, e.errorCode); if (!r) return; let i = nr.ChangeTracker.with(e, o => D0e(o, t, r)); return [Ma(g9, i, [_.Add_0_to_unresolved_variable, r.className || "this"], g9, _.Add_qualifier_to_all_unresolved_variables_matching_a_member_name)] }, fixIds: [g9], getAllCodeActions: e => ns(e, GQ, (t, r) => { let i = k0e(r.file, r.start, r.code); i && D0e(t, e.sourceFile, i) }) }) } }); function N5e(e) { return fs(VQ, e) } function BQ(e, t, r, i, o) { let s = r.getText()[i]; if (!N5e(s)) return; let l = o ? VQ[s] : `{${ck(r, t, s)}}`; e.replaceRangeWithText(r, { pos: i, end: i + 1 }, l) } var y9, lP, UQ, VQ, P5e = gt({ "src/services/codefixes/fixInvalidJsxCharacters.ts"() { "use strict"; Fr(), Qa(), y9 = "fixInvalidJsxCharacters_expression", lP = "fixInvalidJsxCharacters_htmlEntity", UQ = [_.Unexpected_token_Did_you_mean_or_gt.code, _.Unexpected_token_Did_you_mean_or_rbrace.code], za({ errorCodes: UQ, fixIds: [y9, lP], getCodeActions(e) { let { sourceFile: t, preferences: r, span: i } = e, o = nr.ChangeTracker.with(e, l => BQ(l, r, t, i.start, !1)), s = nr.ChangeTracker.with(e, l => BQ(l, r, t, i.start, !0)); return [Ma(y9, o, _.Wrap_invalid_character_in_an_expression_container, y9, _.Wrap_all_invalid_characters_in_an_expression_container), Ma(lP, s, _.Convert_invalid_character_to_its_html_entity_code, lP, _.Convert_all_invalid_characters_to_HTML_entity_code)] }, getAllCodeActions(e) { return ns(e, UQ, (t, r) => BQ(t, e.preferences, r.file, r.start, e.fixId === lP)) } }), VQ = { ">": "&gt;", "}": "&rbrace;" } } }); function M5e(e, { name: t, jsDocHost: r, jsDocParameterTag: i }) { let o = nr.ChangeTracker.with(e, s => s.filterJSDocTags(e.sourceFile, r, l => l !== i)); return Ma(uP, o, [_.Delete_unused_param_tag_0, t.getText(e.sourceFile)], uP, _.Delete_all_unused_param_tags) } function F5e(e, { name: t, jsDocHost: r, signature: i, jsDocParameterTag: o }) { if (!Fn(i.parameters)) return; let s = e.sourceFile, l = A0(i), f = new Set; for (let v of l) xp(v) && Re(v.name) && f.add(v.name.escapedText); let d = ks(i.parameters, v => Re(v.name) && !f.has(v.name.escapedText) ? v.name.getText(s) : void 0); if (d === void 0) return; let g = D.updateJSDocParameterTag(o, o.tagName, D.createIdentifier(d), o.isBracketed, o.typeExpression, o.isNameFirst, o.comment), m = nr.ChangeTracker.with(e, v => v.replaceJSDocComment(s, r, on(l, S => S === o ? g : S))); return K_(jQ, m, [_.Rename_param_tag_name_0_to_1, t.getText(s), d]) } function w0e(e, t) { let r = Vi(e, t); if (r.parent && xp(r.parent) && Re(r.parent.name)) { let i = r.parent, o = dS(i), s = sb(i); if (o && s) return { jsDocHost: o, signature: s, name: r.parent.name, jsDocParameterTag: i } } } var uP, jQ, HQ, G5e = gt({ "src/services/codefixes/fixUnmatchedParameter.ts"() { "use strict"; Fr(), Qa(), uP = "deleteUnmatchedParameter", jQ = "renameUnmatchedParameter", HQ = [_.JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name.code], za({ fixIds: [uP, jQ], errorCodes: HQ, getCodeActions: function (t) { let { sourceFile: r, span: i } = t, o = [], s = w0e(r, i.start); if (s) return Sn(o, M5e(t, s)), Sn(o, F5e(t, s)), o }, getAllCodeActions: function (t) { let r = new Map; return ix(nr.ChangeTracker.with(t, i => { ax(t, HQ, ({ file: o, start: s }) => { let l = w0e(o, s); l && r.set(l.signature, Sn(r.get(l.signature), l.jsDocParameterTag)) }), r.forEach((o, s) => { if (t.fixId === uP) { let l = new Set(o); i.filterJSDocTags(s.getSourceFile(), s, f => !l.has(f)) } }) })) } }) } }); function B5e(e, t, r) { let i = zr(Vi(e, r), Re); if (!i || i.parent.kind !== 180) return; let s = t.getTypeChecker().getSymbolAtLocation(i); return wr(s?.declarations || Je, Kp(lm, $u, Nl)) } function U5e(e, t, r, i) { if (r.kind === 268) { e.insertModifierBefore(t, 154, r.name); return } let o = r.kind === 270 ? r : r.parent.parent; if (o.name && o.namedBindings) return; let s = i.getTypeChecker(); z6(o, f => { if (wd(f.symbol, s).flags & 111551) return !0 }) || e.insertModifierBefore(t, 154, o) } function V5e(e, t, r, i) { Ok.doChangeNamedToNamespaceOrDefault(t, i, e, r.parent) } var v9, R0e, j5e = gt({ "src/services/codefixes/fixUnreferenceableDecoratorMetadata.ts"() { "use strict"; Fr(), Qa(), v9 = "fixUnreferenceableDecoratorMetadata", R0e = [_.A_type_referenced_in_a_decorated_signature_must_be_imported_with_import_type_or_a_namespace_import_when_isolatedModules_and_emitDecoratorMetadata_are_enabled.code], za({ errorCodes: R0e, getCodeActions: e => { let t = B5e(e.sourceFile, e.program, e.span.start); if (!t) return; let r = nr.ChangeTracker.with(e, s => t.kind === 273 && V5e(s, e.sourceFile, t, e.program)), i = nr.ChangeTracker.with(e, s => U5e(s, e.sourceFile, t, e.program)), o; return r.length && (o = Sn(o, K_(v9, r, _.Convert_named_imports_to_namespace_import))), i.length && (o = Sn(o, K_(v9, i, _.Convert_to_type_only_import))), o }, fixIds: [v9] }) } }); function O0e(e, t, r) { e.replaceNode(t, r.parent, D.createKeywordTypeNode(157)) } function vk(e, t) { return Ma(bk, e, t, T9, _.Delete_all_unused_declarations) } function N0e(e, t, r) { e.delete(t, L.checkDefined(Ga(r.parent, hH).typeParameters, "The type parameter to delete should exist")) } function WQ(e) { return e.kind === 100 || e.kind === 79 && (e.parent.kind === 273 || e.parent.kind === 270) } function P0e(e) { return e.kind === 100 ? zr(e.parent, gl) : void 0 } function M0e(e, t) { return pu(t.parent) && Vo(t.parent.getChildren(e)) === t } function F0e(e, t, r) { e.delete(t, r.parent.kind === 240 ? r.parent : r) } function H5e(e, t, r) { mn(r.elements, i => e.delete(t, i)) } function G0e(e, t, r, i) { t !== _.Property_0_is_declared_but_its_value_is_never_read.code && (i.kind === 138 && (i = Ga(i.parent, h2).typeParameter.name), Re(i) && W5e(i) && (e.replaceNode(r, i, D.createIdentifier(`_${i.text}`)), ha(i.parent) && fI(i.parent).forEach(o => { Re(o.name) && e.replaceNode(r, o.name, D.createIdentifier(`_${o.name.text}`)) }))) } function W5e(e) { switch (e.parent.kind) { case 166: case 165: return !0; case 257: switch (e.parent.parent.parent.kind) { case 247: case 246: return !0 } }return !1 } function b9(e, t, r, i, o, s, l, f) { z5e(t, r, e, i, o, s, l, f), Re(t) && js.Core.eachSymbolReferenceInFile(t, i, e, d => { br(d.parent) && d.parent.name === d && (d = d.parent), !f && X5e(d) && r.delete(e, d.parent.parent) }) } function z5e(e, t, r, i, o, s, l, f) { let { parent: d } = e; if (ha(d)) J5e(t, r, d, i, o, s, l, f); else if (!(f && Re(e) && js.Core.isSymbolReferencedInFile(e, i, r))) { let g = lm(d) ? e : ts(d) ? d.parent : d; L.assert(g !== r, "should not delete whole source file"), t.delete(r, g) } } function J5e(e, t, r, i, o, s, l, f = !1) { if (K5e(i, t, r, o, s, l, f)) if (r.modifiers && r.modifiers.length > 0 && (!Re(r.name) || js.Core.isSymbolReferencedInFile(r.name, i, t))) for (let d of r.modifiers) Ha(d) && e.deleteModifier(t, d); else !r.initializer && B0e(r, i, o) && e.delete(t, r) } function B0e(e, t, r) { let i = e.parent.parameters.indexOf(e); return !js.Core.someSignatureUsage(e.parent, r, t, (o, s) => !s || s.arguments.length > i) } function K5e(e, t, r, i, o, s, l) { let { parent: f } = r; switch (f.kind) { case 171: case 173: let d = f.parameters.indexOf(r), g = Nc(f) ? f.name : f, m = js.Core.getReferencedSymbolsForNode(f.pos, g, o, i, s); if (m) { for (let v of m) for (let S of v.references) if (S.kind === js.EntryKind.Node) { let x = hL(S.node) && Pa(S.node.parent) && S.node.parent.arguments.length > d, A = br(S.node.parent) && hL(S.node.parent.expression) && Pa(S.node.parent.parent) && S.node.parent.parent.arguments.length > d, w = (Nc(S.node.parent) || zm(S.node.parent)) && S.node.parent !== r.parent && S.node.parent.parameters.length > d; if (x || A || w) return !1 } } return !0; case 259: return f.name && q5e(e, t, f.name) ? U0e(f, r, l) : !0; case 215: case 216: return U0e(f, r, l); case 175: return !1; case 174: return !0; default: return L.failBadSyntaxKind(f) } } function q5e(e, t, r) { return !!js.Core.eachSymbolReferenceInFile(r, e, t, i => Re(i) && Pa(i.parent) && i.parent.arguments.indexOf(i) >= 0) } function U0e(e, t, r) { let i = e.parameters, o = i.indexOf(t); return L.assert(o !== -1, "The parameter should already be in the list"), r ? i.slice(o + 1).every(s => Re(s.name) && !s.symbol.isReferenced) : o === i.length - 1 } function X5e(e) { return (ar(e.parent) && e.parent.left === e || (Nz(e.parent) || tv(e.parent)) && e.parent.operand === e) && Ol(e.parent.parent) } var bk, E9, T9, dP, S9, zQ, Y5e = gt({ "src/services/codefixes/fixUnusedIdentifier.ts"() { "use strict"; Fr(), Qa(), bk = "unusedIdentifier", E9 = "unusedIdentifier_prefix", T9 = "unusedIdentifier_delete", dP = "unusedIdentifier_deleteImports", S9 = "unusedIdentifier_infer", zQ = [_._0_is_declared_but_its_value_is_never_read.code, _._0_is_declared_but_never_used.code, _.Property_0_is_declared_but_its_value_is_never_read.code, _.All_imports_in_import_declaration_are_unused.code, _.All_destructured_elements_are_unused.code, _.All_variables_are_unused.code, _.All_type_parameters_are_unused.code], za({ errorCodes: zQ, getCodeActions(e) { let { errorCode: t, sourceFile: r, program: i, cancellationToken: o } = e, s = i.getTypeChecker(), l = i.getSourceFiles(), f = Vi(r, e.span.start); if (H_(f)) return [vk(nr.ChangeTracker.with(e, v => v.delete(r, f)), _.Remove_template_tag)]; if (f.kind === 29) { let v = nr.ChangeTracker.with(e, S => N0e(S, r, f)); return [vk(v, _.Remove_type_parameters)] } let d = P0e(f); if (d) { let v = nr.ChangeTracker.with(e, S => S.delete(r, d)); return [Ma(bk, v, [_.Remove_import_from_0, lle(d)], dP, _.Delete_all_unused_imports)] } else if (WQ(f)) { let v = nr.ChangeTracker.with(e, S => b9(r, f, S, s, l, i, o, !1)); if (v.length) return [Ma(bk, v, [_.Remove_unused_declaration_for_Colon_0, f.getText(r)], dP, _.Delete_all_unused_imports)] } if (cm(f.parent) || g2(f.parent)) { if (ha(f.parent.parent)) { let v = f.parent.elements, S = [v.length > 1 ? _.Remove_unused_declarations_for_Colon_0 : _.Remove_unused_declaration_for_Colon_0, on(v, x => x.getText(r)).join(", ")]; return [vk(nr.ChangeTracker.with(e, x => H5e(x, r, f.parent)), S)] } return [vk(nr.ChangeTracker.with(e, v => v.delete(r, f.parent.parent)), _.Remove_unused_destructuring_declaration)] } if (M0e(r, f)) return [vk(nr.ChangeTracker.with(e, v => F0e(v, r, f.parent)), _.Remove_variable_statement)]; let g = []; if (f.kind === 138) { let v = nr.ChangeTracker.with(e, x => O0e(x, r, f)), S = Ga(f.parent, h2).typeParameter.name.text; g.push(Ma(bk, v, [_.Replace_infer_0_with_unknown, S], S9, _.Replace_all_unused_infer_with_unknown)) } else { let v = nr.ChangeTracker.with(e, S => b9(r, f, S, s, l, i, o, !1)); if (v.length) { let S = ts(f.parent) ? f.parent : f; g.push(vk(v, [_.Remove_unused_declaration_for_Colon_0, S.getText(r)])) } } let m = nr.ChangeTracker.with(e, v => G0e(v, t, r, f)); return m.length && g.push(Ma(bk, m, [_.Prefix_0_with_an_underscore, f.getText(r)], E9, _.Prefix_all_unused_declarations_with_where_possible)), g }, fixIds: [E9, T9, dP, S9], getAllCodeActions: e => { let { sourceFile: t, program: r, cancellationToken: i } = e, o = r.getTypeChecker(), s = r.getSourceFiles(); return ns(e, zQ, (l, f) => { let d = Vi(t, f.start); switch (e.fixId) { case E9: G0e(l, f.code, t, d); break; case dP: { let g = P0e(d); g ? l.delete(t, g) : WQ(d) && b9(t, d, l, o, s, r, i, !0); break } case T9: { if (d.kind === 138 || WQ(d)) break; if (H_(d)) l.delete(t, d); else if (d.kind === 29) N0e(l, t, d); else if (cm(d.parent)) { if (d.parent.parent.initializer) break; (!ha(d.parent.parent) || B0e(d.parent.parent, o, s)) && l.delete(t, d.parent.parent) } else { if (g2(d.parent.parent) && d.parent.parent.parent.initializer) break; M0e(t, d) ? F0e(l, t, d.parent) : b9(t, d, l, o, s, r, i, !0) } break } case S9: d.kind === 138 && O0e(l, t, d); break; default: L.fail(JSON.stringify(e.fixId)) } }) } }) } }); function V0e(e, t, r, i, o) { let s = Vi(t, r), l = jn(s, ca); if (l.getStart(t) !== s.getStart(t)) { let d = JSON.stringify({ statementKind: L.formatSyntaxKind(l.kind), tokenKind: L.formatSyntaxKind(s.kind), errorCode: o, start: r, length: i }); L.fail("Token and statement should start at the same point. " + d) } let f = (Va(l.parent) ? l.parent : l).parent; if (!Va(l.parent) || l === Vo(l.parent.statements)) switch (f.kind) { case 242: if (f.elseStatement) { if (Va(l.parent)) break; e.replaceNode(t, l, D.createBlock(Je)); return } case 244: case 245: e.delete(t, f); return }if (Va(l.parent)) { let d = r + i, g = L.checkDefined($5e(PW(l.parent.statements, l), m => m.pos < d), "Some statement should be last"); e.deleteNodeRange(t, l, g) } else e.delete(t, l) } function $5e(e, t) { let r; for (let i of e) { if (!t(i)) break; r = i } return r } var x9, JQ, Q5e = gt({ "src/services/codefixes/fixUnreachableCode.ts"() { "use strict"; Fr(), Qa(), x9 = "fixUnreachableCode", JQ = [_.Unreachable_code_detected.code], za({ errorCodes: JQ, getCodeActions(e) { if (e.program.getSyntacticDiagnostics(e.sourceFile, e.cancellationToken).length) return; let r = nr.ChangeTracker.with(e, i => V0e(i, e.sourceFile, e.span.start, e.span.length, e.errorCode)); return [Ma(x9, r, _.Remove_unreachable_code, x9, _.Remove_all_unreachable_code)] }, fixIds: [x9], getAllCodeActions: e => ns(e, JQ, (t, r) => V0e(t, r.file, r.start, r.length, r.code)) }) } }); function j0e(e, t, r) { let i = Vi(t, r), o = Ga(i.parent, J0), s = i.getStart(t), l = o.statement.getStart(t), f = Bf(s, l, t) ? l : xo(t.text, Yo(o, 58, t).end, !0); e.deleteRange(t, { pos: s, end: f }) } var A9, KQ, Z5e = gt({ "src/services/codefixes/fixUnusedLabel.ts"() { "use strict"; Fr(), Qa(), A9 = "fixUnusedLabel", KQ = [_.Unused_label.code], za({ errorCodes: KQ, getCodeActions(e) { let t = nr.ChangeTracker.with(e, r => j0e(r, e.sourceFile, e.span.start)); return [Ma(A9, t, _.Remove_unused_label, A9, _.Remove_all_unused_labels)] }, fixIds: [A9], getAllCodeActions: e => ns(e, KQ, (t, r) => j0e(t, r.file, r.start)) }) } }); function H0e(e, t, r, i, o) { e.replaceNode(t, r, o.typeToTypeNode(i, r, void 0)) } function W0e(e, t, r) { let i = jn(Vi(e, t), e9e), o = i && i.type; return o && { typeNode: o, type: t9e(r, o) } } function e9e(e) { switch (e.kind) { case 231: case 176: case 177: case 259: case 174: case 178: case 197: case 171: case 170: case 166: case 169: case 168: case 175: case 262: case 213: case 257: return !0; default: return !1 } } function t9e(e, t) { if (T2(t)) { let r = e.getTypeFromTypeNode(t.type); return r === e.getNeverType() || r === e.getVoidType() ? r : e.getUnionType(Sn([r, e.getUndefinedType()], t.postfix ? void 0 : e.getNullType())) } return e.getTypeFromTypeNode(t) } var qQ, C9, XQ, n9e = gt({ "src/services/codefixes/fixJSDocTypes.ts"() { "use strict"; Fr(), Qa(), qQ = "fixJSDocTypes_plain", C9 = "fixJSDocTypes_nullable", XQ = [_.JSDoc_types_can_only_be_used_inside_documentation_comments.code, _._0_at_the_end_of_a_type_is_not_valid_TypeScript_syntax_Did_you_mean_to_write_1.code, _._0_at_the_start_of_a_type_is_not_valid_TypeScript_syntax_Did_you_mean_to_write_1.code], za({ errorCodes: XQ, getCodeActions(e) { let { sourceFile: t } = e, r = e.program.getTypeChecker(), i = W0e(t, e.span.start, r); if (!i) return; let { typeNode: o, type: s } = i, l = o.getText(t), f = [d(s, qQ, _.Change_all_jsdoc_style_types_to_TypeScript)]; return o.kind === 317 && f.push(d(s, C9, _.Change_all_jsdoc_style_types_to_TypeScript_and_add_undefined_to_nullable_types)), f; function d(g, m, v) { let S = nr.ChangeTracker.with(e, x => H0e(x, t, o, g, r)); return Ma("jdocTypes", S, [_.Change_0_to_1, l, r.typeToString(g)], m, v) } }, fixIds: [qQ, C9], getAllCodeActions(e) { let { fixId: t, program: r, sourceFile: i } = e, o = r.getTypeChecker(); return ns(e, XQ, (s, l) => { let f = W0e(l.file, l.start, o); if (!f) return; let { typeNode: d, type: g } = f, m = d.kind === 317 && t === C9 ? o.getNullableType(g, 32768) : g; H0e(s, i, d, m, o) }) } }) } }); function z0e(e, t, r) { e.replaceNodeWithText(t, r, `${r.text}()`) } function J0e(e, t) { let r = Vi(e, t); if (br(r.parent)) { let i = r.parent; for (; br(i.parent);)i = i.parent; return i.name } if (Re(r)) return r } var I9, YQ, r9e = gt({ "src/services/codefixes/fixMissingCallParentheses.ts"() { "use strict"; Fr(), Qa(), I9 = "fixMissingCallParentheses", YQ = [_.This_condition_will_always_return_true_since_this_function_is_always_defined_Did_you_mean_to_call_it_instead.code], za({ errorCodes: YQ, fixIds: [I9], getCodeActions(e) { let { sourceFile: t, span: r } = e, i = J0e(t, r.start); if (!i) return; let o = nr.ChangeTracker.with(e, s => z0e(s, e.sourceFile, i)); return [Ma(I9, o, _.Add_missing_call_parentheses, I9, _.Add_all_missing_call_parentheses)] }, getAllCodeActions: e => ns(e, YQ, (t, r) => { let i = J0e(r.file, r.start); i && z0e(t, r.file, i) }) }) } }); function i9e(e) { if (e.type) return e.type; if (wi(e.parent) && e.parent.type && Jm(e.parent.type)) return e.parent.type.type } function K0e(e, t) { let r = Vi(e, t), i = Xd(r); if (!i) return; let o; switch (i.kind) { case 171: o = i.name; break; case 259: case 215: o = Yo(i, 98, e); break; case 216: let s = i.typeParameters ? 29 : 20; o = Yo(i, s, e) || Vo(i.parameters); break; default: return }return o && { insertBefore: o, returnType: i9e(i) } } function q0e(e, t, { insertBefore: r, returnType: i }) { if (i) { let o = Jw(i); (!o || o.kind !== 79 || o.text !== "Promise") && e.replaceNode(t, i, D.createTypeReferenceNode("Promise", D.createNodeArray([i]))) } e.insertModifierBefore(t, 132, r) } var L9, $Q, a9e = gt({ "src/services/codefixes/fixAwaitInSyncFunction.ts"() { "use strict"; Fr(), Qa(), L9 = "fixAwaitInSyncFunction", $Q = [_.await_expressions_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules.code, _.for_await_loops_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules.code, _.Cannot_find_name_0_Did_you_mean_to_write_this_in_an_async_function.code], za({ errorCodes: $Q, getCodeActions(e) { let { sourceFile: t, span: r } = e, i = K0e(t, r.start); if (!i) return; let o = nr.ChangeTracker.with(e, s => q0e(s, t, i)); return [Ma(L9, o, _.Add_async_modifier_to_containing_function, L9, _.Add_all_missing_async_modifiers)] }, fixIds: [L9], getAllCodeActions: function (t) { let r = new Map; return ns(t, $Q, (i, o) => { let s = K0e(o.file, o.start); !s || !V_(r, zo(s.insertBefore)) || q0e(i, t.sourceFile, s) }) } }) } }); function X0e(e, t, r, i, o) { let s, l; if (i === _._0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property.code) s = t, l = t + r; else if (i === _._0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor.code) { let f = o.program.getTypeChecker(), d = Vi(e, t).parent; L.assert(rb(d), "error span of fixPropertyOverrideAccessor should only be on an accessor"); let g = d.parent; L.assert(Yr(g), "erroneous accessors should only be inside classes"); let m = Wp(mZ(g, f)); if (!m) return []; let v = Gi(wA(d.name)), S = f.getPropertyOfType(f.getTypeAtLocation(m), v); if (!S || !S.valueDeclaration) return []; s = S.valueDeclaration.pos, l = S.valueDeclaration.end, e = Gn(S.valueDeclaration) } else L.fail("fixPropertyOverrideAccessor codefix got unexpected error code " + i); return uEe(e, o.program, s, l, o, _.Generate_get_and_set_accessors.message) } var QQ, k9, o9e = gt({ "src/services/codefixes/fixPropertyOverrideAccessor.ts"() { "use strict"; Fr(), Qa(), QQ = [_._0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property.code, _._0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor.code], k9 = "fixPropertyOverrideAccessor", za({ errorCodes: QQ, getCodeActions(e) { let t = X0e(e.sourceFile, e.span.start, e.span.length, e.errorCode, e); if (t) return [Ma(k9, t, _.Generate_get_and_set_accessors, k9, _.Generate_get_and_set_accessors_for_all_overriding_properties)] }, fixIds: [k9], getAllCodeActions: e => ns(e, QQ, (t, r) => { let i = X0e(r.file, r.start, r.length, r.code, e); if (i) for (let o of i) t.pushRaw(e.sourceFile, o) }) }) } }); function s9e(e, t) { switch (e) { case _.Parameter_0_implicitly_has_an_1_type.code: case _.Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code: return Sf(Xd(t)) ? _.Infer_type_of_0_from_usage : _.Infer_parameter_types_from_usage; case _.Rest_parameter_0_implicitly_has_an_any_type.code: case _.Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage.code: return _.Infer_parameter_types_from_usage; case _.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation.code: return _.Infer_this_type_of_0_from_usage; default: return _.Infer_type_of_0_from_usage } } function c9e(e) { switch (e) { case _.Variable_0_implicitly_has_type_1_in_some_locations_but_a_better_type_may_be_inferred_from_usage.code: return _.Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined.code; case _.Variable_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code: return _.Variable_0_implicitly_has_an_1_type.code; case _.Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code: return _.Parameter_0_implicitly_has_an_1_type.code; case _.Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage.code: return _.Rest_parameter_0_implicitly_has_an_any_type.code; case _.Property_0_implicitly_has_type_any_but_a_better_type_for_its_get_accessor_may_be_inferred_from_usage.code: return _.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation.code; case _._0_implicitly_has_an_1_return_type_but_a_better_type_may_be_inferred_from_usage.code: return _._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type.code; case _.Property_0_implicitly_has_type_any_but_a_better_type_for_its_set_accessor_may_be_inferred_from_usage.code: return _.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation.code; case _.Member_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code: return _.Member_0_implicitly_has_an_1_type.code }return e } function Y0e(e, t, r, i, o, s, l, f, d) { if (!yI(r.kind) && r.kind !== 79 && r.kind !== 25 && r.kind !== 108) return; let { parent: g } = r, m = s1(t, o, d, f); switch (i = c9e(i), i) { case _.Member_0_implicitly_has_an_1_type.code: case _.Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined.code: if (wi(g) && l(g) || Na(g) || $d(g)) return $0e(e, m, t, g, o, f, s), m.writeFixes(e), g; if (br(g)) { let x = Ek(g.name, o, s), A = lk(x, g, o, f); if (A) { let w = D.createJSDocTypeTag(void 0, D.createJSDocTypeExpression(A), void 0); e.addJSDocTags(t, Ga(g.parent.parent, Ol), [w]) } return m.writeFixes(e), g } return; case _.Variable_0_implicitly_has_an_1_type.code: { let x = o.getTypeChecker().getSymbolAtLocation(r); return x && x.valueDeclaration && wi(x.valueDeclaration) && l(x.valueDeclaration) ? ($0e(e, m, Gn(x.valueDeclaration), x.valueDeclaration, o, f, s), m.writeFixes(e), x.valueDeclaration) : void 0 } }let v = Xd(r); if (v === void 0) return; let S; switch (i) { case _.Parameter_0_implicitly_has_an_1_type.code: if (Sf(v)) { Q0e(e, m, t, v, o, f, s), S = v; break } case _.Rest_parameter_0_implicitly_has_an_any_type.code: if (l(v)) { let x = Ga(g, ha); l9e(e, m, t, x, v, o, f, s), S = x } break; case _.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation.code: case _._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type.code: p_(v) && Re(v.name) && (D9(e, m, t, v, Ek(v.name, o, s), o, f), S = v); break; case _.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation.code: Sf(v) && (Q0e(e, m, t, v, o, f, s), S = v); break; case _.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation.code: nr.isThisTypeAnnotatable(v) && l(v) && (u9e(e, t, v, o, f, s), S = v); break; default: return L.fail(String(i)) }return m.writeFixes(e), S } function $0e(e, t, r, i, o, s, l) { Re(i.name) && D9(e, t, r, i, Ek(i.name, o, l), o, s) } function l9e(e, t, r, i, o, s, l, f) { if (!Re(i.name)) return; let d = _9e(o, r, s, f); if (L.assert(o.parameters.length === d.length, "Parameter count and inference count should match"), Yn(o)) Z0e(e, r, d, s, l); else { let g = xs(o) && !Yo(o, 20, r); g && e.insertNodeBefore(r, Vo(o.parameters), D.createToken(20)); for (let { declaration: m, type: v } of d) m && !m.type && !m.initializer && D9(e, t, r, m, v, s, l); g && e.insertNodeAfter(r, To(o.parameters), D.createToken(21)) } } function u9e(e, t, r, i, o, s) { let l = eEe(r, t, i, s); if (!l || !l.length) return; let f = eZ(i, l, s).thisParameter(), d = lk(f, r, i, o); d && (Yn(r) ? d9e(e, t, r, d) : e.tryInsertThisTypeAnnotation(t, r, d)) } function d9e(e, t, r, i) { e.addJSDocTags(t, r, [D.createJSDocThisTag(void 0, D.createJSDocTypeExpression(i))]) } function Q0e(e, t, r, i, o, s, l) { let f = Sl(i.parameters); if (f && Re(i.name) && Re(f.name)) { let d = Ek(i.name, o, l); d === o.getTypeChecker().getAnyType() && (d = Ek(f.name, o, l)), Yn(i) ? Z0e(e, r, [{ declaration: f, type: d }], o, s) : D9(e, t, r, f, d, o, s) } } function D9(e, t, r, i, o, s, l) { let f = lk(o, i, s, l); if (f) if (Yn(r) && i.kind !== 168) { let d = wi(i) ? zr(i.parent.parent, Bc) : i; if (!d) return; let g = D.createJSDocTypeExpression(f), m = p_(i) ? D.createJSDocReturnTag(void 0, g, void 0) : D.createJSDocTypeTag(void 0, g, void 0); e.addJSDocTags(r, d, [m]) } else f9e(f, i, r, e, t, Do(s.getCompilerOptions())) || e.tryInsertTypeAnnotation(r, i, f) } function f9e(e, t, r, i, o, s) { let l = l1(e, s); return l && i.tryInsertTypeAnnotation(r, t, l.typeNode) ? (mn(l.symbols, f => o.addImportFromExportedSymbol(f, !0)), !0) : !1 } function Z0e(e, t, r, i, o) { let s = r.length && r[0].declaration.parent; if (!s) return; let l = Zi(r, f => { let d = f.declaration; if (d.initializer || Vy(d) || !Re(d.name)) return; let g = f.type && lk(f.type, d, i, o); if (g) { let m = D.cloneNode(d.name); return Jn(m, 7168), { name: D.cloneNode(d.name), param: d, isOptional: !!f.isOptional, typeNode: g } } }); if (l.length) if (xs(s) || ms(s)) { let f = xs(s) && !Yo(s, 20, t); f && e.insertNodeBefore(t, Vo(s.parameters), D.createToken(20)), mn(l, ({ typeNode: d, param: g }) => { let m = D.createJSDocTypeTag(void 0, D.createJSDocTypeExpression(d)), v = D.createJSDocComment(void 0, [m]); e.insertNodeAt(t, g.getStart(t), v, { suffix: " " }) }), f && e.insertNodeAfter(t, To(s.parameters), D.createToken(21)) } else { let f = on(l, ({ name: d, typeNode: g, isOptional: m }) => D.createJSDocParameterTag(void 0, d, !!m, D.createJSDocTypeExpression(g), !1, void 0)); e.addJSDocTags(t, s, f) } } function ZQ(e, t, r) { return Zi(js.getReferenceEntriesForNode(-1, e, t, t.getSourceFiles(), r), i => i.kind !== js.EntryKind.Span ? zr(i.node, Re) : void 0) } function Ek(e, t, r) { let i = ZQ(e, t, r); return eZ(t, i, r).single() } function _9e(e, t, r, i) { let o = eEe(e, t, r, i); return o && eZ(r, o, i).parameters(e) || e.parameters.map(s => ({ declaration: s, type: Re(s.name) ? Ek(s.name, r, i) : r.getTypeChecker().getAnyType() })) } function eEe(e, t, r, i) { let o; switch (e.kind) { case 173: o = Yo(e, 135, t); break; case 216: case 215: let s = e.parent; o = (wi(s) || Na(s)) && Re(s.name) ? s.name : e.name; break; case 259: case 171: case 170: o = e.name; break }if (o) return ZQ(o, r, i) } function eZ(e, t, r) { let i = e.getTypeChecker(), o = { string: () => i.getStringType(), number: () => i.getNumberType(), Array: Ce => i.createArrayType(Ce), Promise: Ce => i.createPromiseType(Ce) }, s = [i.getStringType(), i.getNumberType(), i.createArrayType(i.getAnyType()), i.createPromiseType(i.getAnyType())]; return { single: d, parameters: g, thisParameter: m }; function l() { return { isNumber: void 0, isString: void 0, isNumberOrString: void 0, candidateTypes: void 0, properties: void 0, calls: void 0, constructs: void 0, numberIndex: void 0, stringIndex: void 0, candidateThisTypes: void 0, inferredTypes: void 0 } } function f(Ce) { let Ie = new Map; for (let Ne of Ce) Ne.properties && Ne.properties.forEach((Le, Ye) => { Ie.has(Ye) || Ie.set(Ye, []), Ie.get(Ye).push(Le) }); let Be = new Map; return Ie.forEach((Ne, Le) => { Be.set(Le, f(Ne)) }), { isNumber: Ce.some(Ne => Ne.isNumber), isString: Ce.some(Ne => Ne.isString), isNumberOrString: Ce.some(Ne => Ne.isNumberOrString), candidateTypes: Uo(Ce, Ne => Ne.candidateTypes), properties: Be, calls: Uo(Ce, Ne => Ne.calls), constructs: Uo(Ce, Ne => Ne.constructs), numberIndex: mn(Ce, Ne => Ne.numberIndex), stringIndex: mn(Ce, Ne => Ne.stringIndex), candidateThisTypes: Uo(Ce, Ne => Ne.candidateThisTypes), inferredTypes: void 0 } } function d() { return $(v(t)) } function g(Ce) { if (t.length === 0 || !Ce.parameters) return; let Ie = l(); for (let Ne of t) r.throwIfCancellationRequested(), S(Ne, Ie); let Be = [...Ie.constructs || [], ...Ie.calls || []]; return Ce.parameters.map((Ne, Le) => { let Ye = [], _t = Fm(Ne), ct = !1; for (let We of Be) if (We.argumentTypes.length <= Le) ct = Yn(Ce), Ye.push(i.getUndefinedType()); else if (_t) for (let qe = Le; qe < We.argumentTypes.length; qe++)Ye.push(i.getBaseTypeOfLiteralType(We.argumentTypes[qe])); else Ye.push(i.getBaseTypeOfLiteralType(We.argumentTypes[Le])); if (Re(Ne.name)) { let We = v(ZQ(Ne.name, e, r)); Ye.push(..._t ? Zi(We, i.getElementTypeOfArrayType) : We) } let Rt = $(Ye); return { type: _t ? i.createArrayType(Rt) : Rt, isOptional: ct && !_t, declaration: Ne } }) } function m() { let Ce = l(); for (let Ie of t) r.throwIfCancellationRequested(), S(Ie, Ce); return $(Ce.candidateThisTypes || Je) } function v(Ce) { let Ie = l(); for (let Be of Ce) r.throwIfCancellationRequested(), S(Be, Ie); return Z(Ie) } function S(Ce, Ie) { for (; zI(Ce);)Ce = Ce.parent; switch (Ce.parent.kind) { case 241: A(Ce, Ie); break; case 222: Ie.isNumber = !0; break; case 221: w(Ce.parent, Ie); break; case 223: C(Ce, Ce.parent, Ie); break; case 292: case 293: P(Ce.parent, Ie); break; case 210: case 211: Ce.parent.expression === Ce ? F(Ce.parent, Ie) : x(Ce, Ie); break; case 208: B(Ce.parent, Ie); break; case 209: q(Ce.parent, Ce, Ie); break; case 299: case 300: W(Ce.parent, Ie); break; case 169: Y(Ce.parent, Ie); break; case 257: { let { name: Be, initializer: Ne } = Ce.parent; if (Ce === Be) { Ne && ke(Ie, i.getTypeAtLocation(Ne)); break } } default: return x(Ce, Ie) } } function x(Ce, Ie) { Dh(Ce) && ke(Ie, i.getContextualType(Ce)) } function A(Ce, Ie) { ke(Ie, Pa(Ce) ? i.getVoidType() : i.getAnyType()) } function w(Ce, Ie) { switch (Ce.operator) { case 45: case 46: case 40: case 54: Ie.isNumber = !0; break; case 39: Ie.isNumberOrString = !0; break } } function C(Ce, Ie, Be) { switch (Ie.operatorToken.kind) { case 42: case 41: case 43: case 44: case 47: case 48: case 49: case 50: case 51: case 52: case 65: case 67: case 66: case 68: case 69: case 73: case 74: case 78: case 70: case 72: case 71: case 40: case 29: case 32: case 31: case 33: let Ne = i.getTypeAtLocation(Ie.left === Ce ? Ie.right : Ie.left); Ne.flags & 1056 ? ke(Be, Ne) : Be.isNumber = !0; break; case 64: case 39: let Le = i.getTypeAtLocation(Ie.left === Ce ? Ie.right : Ie.left); Le.flags & 1056 ? ke(Be, Le) : Le.flags & 296 ? Be.isNumber = !0 : Le.flags & 402653316 ? Be.isString = !0 : Le.flags & 1 || (Be.isNumberOrString = !0); break; case 63: case 34: case 36: case 37: case 35: ke(Be, i.getTypeAtLocation(Ie.left === Ce ? Ie.right : Ie.left)); break; case 101: Ce === Ie.left && (Be.isString = !0); break; case 56: case 60: Ce === Ie.left && (Ce.parent.parent.kind === 257 || Iu(Ce.parent.parent, !0)) && ke(Be, i.getTypeAtLocation(Ie.right)); break; case 55: case 27: case 102: break } } function P(Ce, Ie) { ke(Ie, i.getTypeAtLocation(Ce.parent.parent.expression)) } function F(Ce, Ie) { let Be = { argumentTypes: [], return_: l() }; if (Ce.arguments) for (let Ne of Ce.arguments) Be.argumentTypes.push(i.getTypeAtLocation(Ne)); S(Ce, Be.return_), Ce.kind === 210 ? (Ie.calls || (Ie.calls = [])).push(Be) : (Ie.constructs || (Ie.constructs = [])).push(Be) } function B(Ce, Ie) { let Be = Bs(Ce.name.text); Ie.properties || (Ie.properties = new Map); let Ne = Ie.properties.get(Be) || l(); S(Ce, Ne), Ie.properties.set(Be, Ne) } function q(Ce, Ie, Be) { if (Ie === Ce.argumentExpression) { Be.isNumberOrString = !0; return } else { let Ne = i.getTypeAtLocation(Ce.argumentExpression), Le = l(); S(Ce, Le), Ne.flags & 296 ? Be.numberIndex = Le : Be.stringIndex = Le } } function W(Ce, Ie) { let Be = wi(Ce.parent.parent) ? Ce.parent.parent : Ce.parent; Pe(Ie, i.getTypeAtLocation(Be)) } function Y(Ce, Ie) { Pe(Ie, i.getTypeAtLocation(Ce.parent)) } function R(Ce, Ie) { let Be = []; for (let Ne of Ce) for (let { high: Le, low: Ye } of Ie) Le(Ne) && (L.assert(!Ye(Ne), "Priority can't have both low and high"), Be.push(Ye)); return Ce.filter(Ne => Be.every(Le => !Le(Ne))) } function ie(Ce) { return $(Z(Ce)) } function $(Ce) { if (!Ce.length) return i.getAnyType(); let Ie = i.getUnionType([i.getStringType(), i.getNumberType()]), Ne = R(Ce, [{ high: Ye => Ye === i.getStringType() || Ye === i.getNumberType(), low: Ye => Ye === Ie }, { high: Ye => !(Ye.flags & 16385), low: Ye => !!(Ye.flags & 16385) }, { high: Ye => !(Ye.flags & 114689) && !(Ur(Ye) & 16), low: Ye => !!(Ur(Ye) & 16) }]), Le = Ne.filter(Ye => Ur(Ye) & 16); return Le.length && (Ne = Ne.filter(Ye => !(Ur(Ye) & 16)), Ne.push(fe(Le))), i.getWidenedType(i.getUnionType(Ne.map(i.getBaseTypeOfLiteralType), 2)) } function fe(Ce) { if (Ce.length === 1) return Ce[0]; let Ie = [], Be = [], Ne = [], Le = [], Ye = !1, _t = !1, ct = Nf(); for (let qe of Ce) { for (let tn of i.getPropertiesOfType(qe)) ct.add(tn.name, tn.valueDeclaration ? i.getTypeOfSymbolAtLocation(tn, tn.valueDeclaration) : i.getAnyType()); Ie.push(...i.getSignaturesOfType(qe, 0)), Be.push(...i.getSignaturesOfType(qe, 1)); let zt = i.getIndexInfoOfType(qe, 0); zt && (Ne.push(zt.type), Ye = Ye || zt.isReadonly); let Qt = i.getIndexInfoOfType(qe, 1); Qt && (Le.push(Qt.type), _t = _t || Qt.isReadonly) } let Rt = uae(ct, (qe, zt) => { let Qt = zt.length < Ce.length ? 16777216 : 0, tn = i.createSymbol(4 | Qt, qe); return tn.links.type = i.getUnionType(zt), [qe, tn] }), We = []; return Ne.length && We.push(i.createIndexInfo(i.getStringType(), i.getUnionType(Ne), Ye)), Le.length && We.push(i.createIndexInfo(i.getNumberType(), i.getUnionType(Le), _t)), i.createAnonymousType(Ce[0].symbol, Rt, Ie, Be, We) } function Z(Ce) { var Ie, Be, Ne; let Le = []; Ce.isNumber && Le.push(i.getNumberType()), Ce.isString && Le.push(i.getStringType()), Ce.isNumberOrString && Le.push(i.getUnionType([i.getStringType(), i.getNumberType()])), Ce.numberIndex && Le.push(i.createArrayType(ie(Ce.numberIndex))), ((Ie = Ce.properties) != null && Ie.size || (Be = Ce.constructs) != null && Be.length || Ce.stringIndex) && Le.push(U(Ce)); let Ye = (Ce.candidateTypes || []).map(ct => i.getBaseTypeOfLiteralType(ct)), _t = (Ne = Ce.calls) != null && Ne.length ? U(Ce) : void 0; return _t && Ye ? Le.push(i.getUnionType([_t, ...Ye], 2)) : (_t && Le.push(_t), Fn(Ye) && Le.push(...Ye)), Le.push(...re(Ce)), Le } function U(Ce) { let Ie = new Map; Ce.properties && Ce.properties.forEach((Ye, _t) => { let ct = i.createSymbol(4, _t); ct.links.type = ie(Ye), Ie.set(_t, ct) }); let Be = Ce.calls ? [we(Ce.calls)] : [], Ne = Ce.constructs ? [we(Ce.constructs)] : [], Le = Ce.stringIndex ? [i.createIndexInfo(i.getStringType(), ie(Ce.stringIndex), !1)] : []; return i.createAnonymousType(void 0, Ie, Be, Ne, Le) } function re(Ce) { if (!Ce.properties || !Ce.properties.size) return []; let Ie = s.filter(Be => le(Be, Ce)); return 0 < Ie.length && Ie.length < 3 ? Ie.map(Be => _e(Be, Ce)) : [] } function le(Ce, Ie) { return Ie.properties ? !Ld(Ie.properties, (Be, Ne) => { let Le = i.getTypeOfPropertyOfType(Ce, Ne); return Le ? Be.calls ? !i.getSignaturesOfType(Le, 0).length || !i.isTypeAssignableTo(Le, Ve(Be.calls)) : !i.isTypeAssignableTo(Le, ie(Be)) : !0 }) : !1 } function _e(Ce, Ie) { if (!(Ur(Ce) & 4) || !Ie.properties) return Ce; let Be = Ce.target, Ne = Wp(Be.typeParameters); if (!Ne) return Ce; let Le = []; return Ie.properties.forEach((Ye, _t) => { let ct = i.getTypeOfPropertyOfType(Be, _t); L.assert(!!ct, "generic should have all the properties of its reference."), Le.push(...ge(ct, ie(Ye), Ne)) }), o[Ce.symbol.escapedName]($(Le)) } function ge(Ce, Ie, Be) { if (Ce === Be) return [Ie]; if (Ce.flags & 3145728) return Uo(Ce.types, Ye => ge(Ye, Ie, Be)); if (Ur(Ce) & 4 && Ur(Ie) & 4) { let Ye = i.getTypeArguments(Ce), _t = i.getTypeArguments(Ie), ct = []; if (Ye && _t) for (let Rt = 0; Rt < Ye.length; Rt++)_t[Rt] && ct.push(...ge(Ye[Rt], _t[Rt], Be)); return ct } let Ne = i.getSignaturesOfType(Ce, 0), Le = i.getSignaturesOfType(Ie, 0); return Ne.length === 1 && Le.length === 1 ? X(Ne[0], Le[0], Be) : [] } function X(Ce, Ie, Be) { var Ne; let Le = []; for (let ct = 0; ct < Ce.parameters.length; ct++) { let Rt = Ce.parameters[ct], We = Ie.parameters[ct], qe = Ce.declaration && Fm(Ce.declaration.parameters[ct]); if (!We) break; let zt = Rt.valueDeclaration ? i.getTypeOfSymbolAtLocation(Rt, Rt.valueDeclaration) : i.getAnyType(), Qt = qe && i.getElementTypeOfArrayType(zt); Qt && (zt = Qt); let tn = ((Ne = zr(We, Zp)) == null ? void 0 : Ne.links.type) || (We.valueDeclaration ? i.getTypeOfSymbolAtLocation(We, We.valueDeclaration) : i.getAnyType()); Le.push(...ge(zt, tn, Be)) } let Ye = i.getReturnTypeOfSignature(Ce), _t = i.getReturnTypeOfSignature(Ie); return Le.push(...ge(Ye, _t, Be)), Le } function Ve(Ce) { return i.createAnonymousType(void 0, Ua(), [we(Ce)], Je, Je) } function we(Ce) { let Ie = [], Be = Math.max(...Ce.map(Le => Le.argumentTypes.length)); for (let Le = 0; Le < Be; Le++) { let Ye = i.createSymbol(1, Bs(`arg${Le}`)); Ye.links.type = $(Ce.map(_t => _t.argumentTypes[Le] || i.getUndefinedType())), Ce.some(_t => _t.argumentTypes[Le] === void 0) && (Ye.flags |= 16777216), Ie.push(Ye) } let Ne = ie(f(Ce.map(Le => Le.return_))); return i.createSignature(void 0, void 0, void 0, Ie, Ne, void 0, Be, 0) } function ke(Ce, Ie) { Ie && !(Ie.flags & 1) && !(Ie.flags & 131072) && (Ce.candidateTypes || (Ce.candidateTypes = [])).push(Ie) } function Pe(Ce, Ie) { Ie && !(Ie.flags & 1) && !(Ie.flags & 131072) && (Ce.candidateThisTypes || (Ce.candidateThisTypes = [])).push(Ie) } } var w9, tZ, p9e = gt({ "src/services/codefixes/inferFromUsage.ts"() { "use strict"; Fr(), Qa(), w9 = "inferFromUsage", tZ = [_.Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined.code, _.Variable_0_implicitly_has_an_1_type.code, _.Parameter_0_implicitly_has_an_1_type.code, _.Rest_parameter_0_implicitly_has_an_any_type.code, _.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation.code, _._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type.code, _.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation.code, _.Member_0_implicitly_has_an_1_type.code, _.Variable_0_implicitly_has_type_1_in_some_locations_but_a_better_type_may_be_inferred_from_usage.code, _.Variable_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code, _.Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code, _.Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage.code, _.Property_0_implicitly_has_type_any_but_a_better_type_for_its_get_accessor_may_be_inferred_from_usage.code, _._0_implicitly_has_an_1_return_type_but_a_better_type_may_be_inferred_from_usage.code, _.Property_0_implicitly_has_type_any_but_a_better_type_for_its_set_accessor_may_be_inferred_from_usage.code, _.Member_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code, _.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation.code], za({ errorCodes: tZ, getCodeActions(e) { let { sourceFile: t, program: r, span: { start: i }, errorCode: o, cancellationToken: s, host: l, preferences: f } = e, d = Vi(t, i), g, m = nr.ChangeTracker.with(e, S => { g = Y0e(S, t, d, o, r, s, h0, l, f) }), v = g && sa(g); return !v || m.length === 0 ? void 0 : [Ma(w9, m, [s9e(o, d), Qc(v)], w9, _.Infer_all_types_from_usage)] }, fixIds: [w9], getAllCodeActions(e) { let { sourceFile: t, program: r, cancellationToken: i, host: o, preferences: s } = e, l = W2(); return ns(e, tZ, (f, d) => { Y0e(f, t, Vi(d.file, d.start), d.code, r, i, l, o, s) }) } }) } }); function tEe(e, t, r) { if (Yn(e)) return; let i = Vi(e, r), o = jn(i, Ds), s = o?.type; if (!s) return; let l = t.getTypeFromTypeNode(s), f = t.getAwaitedType(l) || t.getVoidType(), d = t.typeToTypeNode(f, s, void 0); if (d) return { returnTypeNode: s, returnType: l, promisedTypeNode: d, promisedType: f } } function nEe(e, t, r, i) { e.replaceNode(t, r, D.createTypeReferenceNode("Promise", [i])) } var R9, nZ, m9e = gt({ "src/services/codefixes/fixReturnTypeInAsyncFunction.ts"() { "use strict"; Fr(), Qa(), R9 = "fixReturnTypeInAsyncFunction", nZ = [_.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type_Did_you_mean_to_write_Promise_0.code], za({ errorCodes: nZ, fixIds: [R9], getCodeActions: function (t) { let { sourceFile: r, program: i, span: o } = t, s = i.getTypeChecker(), l = tEe(r, i.getTypeChecker(), o.start); if (!l) return; let { returnTypeNode: f, returnType: d, promisedTypeNode: g, promisedType: m } = l, v = nr.ChangeTracker.with(t, S => nEe(S, r, f, g)); return [Ma(R9, v, [_.Replace_0_with_Promise_1, s.typeToString(d), s.typeToString(m)], R9, _.Fix_all_incorrect_return_type_of_an_async_functions)] }, getAllCodeActions: e => ns(e, nZ, (t, r) => { let i = tEe(r.file, e.program.getTypeChecker(), r.start); i && nEe(t, r.file, i.returnTypeNode, i.promisedTypeNode) }) }) } }); function rEe(e, t, r, i) { let { line: o } = Gs(t, r); (!i || _0(i, o)) && e.insertCommentBeforeLine(t, o, r, " @ts-ignore") } var rZ, iZ, aZ, h9e = gt({ "src/services/codefixes/disableJsDiagnostics.ts"() { "use strict"; Fr(), Qa(), rZ = "disableJsDiagnostics", iZ = "disableJsDiagnostics", aZ = Zi(Object.keys(_), e => { let t = _[e]; return t.category === 1 ? t.code : void 0 }), za({ errorCodes: aZ, getCodeActions: function (t) { let { sourceFile: r, program: i, span: o, host: s, formatContext: l } = t; if (!Yn(r) || !HR(r, i.getCompilerOptions())) return; let f = r.checkJsDirective ? "" : bb(s, l.options), d = [K_(rZ, [_ve(r.fileName, [GN(r.checkJsDirective ? Wc(r.checkJsDirective.pos, r.checkJsDirective.end) : il(0, 0), `// @ts-nocheck${f}`)])], _.Disable_checking_for_this_file)]; return nr.isValidLocationToAddComment(r, o.start) && d.unshift(Ma(rZ, nr.ChangeTracker.with(t, g => rEe(g, r, o.start)), _.Ignore_this_error_message, iZ, _.Add_ts_ignore_to_all_error_messages)), d }, fixIds: [iZ], getAllCodeActions: e => { let t = new Set; return ns(e, aZ, (r, i) => { nr.isValidLocationToAddComment(i.file, i.start) && rEe(r, i.file, i.start, t) }) } }) } }); function oZ(e, t, r, i, o, s, l) { let f = e.symbol.members; for (let d of t) f.has(d.escapedName) || iEe(d, e, r, i, o, s, l, void 0) } function sx(e) { return { trackSymbol: () => !1, moduleResolverHost: oY(e.program, e.host) } } function iEe(e, t, r, i, o, s, l, f, d = 3, g = !1) { var m; let v = e.getDeclarations(), S = v?.[0], x = i.program.getTypeChecker(), A = Do(i.program.getCompilerOptions()), w = (m = S?.kind) != null ? m : 168, C = cc(sa(S), !1), P = S ? uu(S) : 0, F = P & 4 ? 4 : P & 16 ? 16 : 0; S && Id(S) && (F |= 128); let B = $(), q = x.getWidenedType(x.getTypeOfSymbolAtLocation(e, t)), W = !!(e.flags & 16777216), Y = !!(t.flags & 16777216) || g, R = J_(r, o); switch (w) { case 168: case 169: let le = R === 0 ? 268435456 : void 0, _e = x.typeToTypeNode(q, t, le, sx(i)); if (s) { let X = l1(_e, A); X && (_e = X.typeNode, cx(s, X.symbols)) } l(D.createPropertyDeclaration(B, S ? Z(C) : e.getName(), W && d & 2 ? D.createToken(57) : void 0, _e, void 0)); break; case 174: case 175: { L.assertIsDefined(v); let X = x.typeToTypeNode(q, t, void 0, sx(i)), Ve = kT(v, S), we = Ve.secondAccessor ? [Ve.firstAccessor, Ve.secondAccessor] : [Ve.firstAccessor]; if (s) { let ke = l1(X, A); ke && (X = ke.typeNode, cx(s, ke.symbols)) } for (let ke of we) if (p_(ke)) l(D.createGetAccessorDeclaration(B, Z(C), Je, re(X), U(f, R, Y))); else { L.assertNode(ke, Sf, "The counterpart to a getter should be a setter"); let Pe = VI(ke), Ce = Pe && Re(Pe.name) ? vr(Pe.name) : void 0; l(D.createSetAccessorDeclaration(B, Z(C), cZ(1, [Ce], [re(X)], 1, !1), U(f, R, Y))) } break } case 170: case 171: L.assertIsDefined(v); let ge = q.isUnion() ? Uo(q.types, X => X.getCallSignatures()) : q.getCallSignatures(); if (!vt(ge)) break; if (v.length === 1) { L.assert(ge.length === 1, "One declaration implies one signature"); let X = ge[0]; ie(R, X, B, Z(C), U(f, R, Y)); break } for (let X of ge) ie(R, X, B, Z(C)); if (!Y) if (v.length > ge.length) { let X = x.getSignatureFromDeclaration(v[v.length - 1]); ie(R, X, B, Z(C), U(f, R)) } else L.assert(v.length === ge.length, "Declarations and signatures should match count"), l(v9e(x, i, t, ge, Z(C), W && !!(d & 1), B, R, f)); break }function ie(le, _e, ge, X, Ve) { let we = O9(171, i, le, _e, Ve, X, ge, W && !!(d & 1), t, s); we && l(we) } function $() { let le; return F && (le = _A(le, D.createModifiersFromModifierFlags(F))), fe() && (le = Sn(le, D.createToken(161))), le && D.createNodeArray(le) } function fe() { return !!(i.program.getCompilerOptions().noImplicitOverride && S && B0(S)) } function Z(le) { return Re(le) && le.escapedText === "constructor" ? D.createComputedPropertyName(D.createStringLiteral(vr(le), R === 0)) : cc(le, !1) } function U(le, _e, ge) { return ge ? void 0 : cc(le, !1) || lZ(_e) } function re(le) { return cc(le, !1) } } function O9(e, t, r, i, o, s, l, f, d, g) { let m = t.program, v = m.getTypeChecker(), S = Do(m.getCompilerOptions()), x = Yn(d), A = 524545 | (r === 0 ? 268435456 : 0), w = v.signatureToSignatureDeclaration(i, e, d, A, sx(t)); if (!w) return; let C = x ? void 0 : w.typeParameters, P = w.parameters, F = x ? void 0 : w.type; if (g) { if (C) { let Y = Tl(C, R => { let ie = R.constraint, $ = R.default; if (ie) { let fe = l1(ie, S); fe && (ie = fe.typeNode, cx(g, fe.symbols)) } if ($) { let fe = l1($, S); fe && ($ = fe.typeNode, cx(g, fe.symbols)) } return D.updateTypeParameterDeclaration(R, R.modifiers, R.name, ie, $) }); C !== Y && (C = it(D.createNodeArray(Y, C.hasTrailingComma), C)) } let W = Tl(P, Y => { let R = x ? void 0 : Y.type; if (R) { let ie = l1(R, S); ie && (R = ie.typeNode, cx(g, ie.symbols)) } return D.updateParameterDeclaration(Y, Y.modifiers, Y.dotDotDotToken, Y.name, x ? void 0 : Y.questionToken, R, Y.initializer) }); if (P !== W && (P = it(D.createNodeArray(W, P.hasTrailingComma), P)), F) { let Y = l1(F, S); Y && (F = Y.typeNode, cx(g, Y.symbols)) } } let B = f ? D.createToken(57) : void 0, q = w.asteriskToken; if (ms(w)) return D.updateFunctionExpression(w, l, w.asteriskToken, zr(s, Re), C, P, F, o ?? w.body); if (xs(w)) return D.updateArrowFunction(w, l, C, P, F, w.equalsGreaterThanToken, o ?? w.body); if (Nc(w)) return D.updateMethodDeclaration(w, l, q, s ?? D.createIdentifier(""), B, C, P, F, o); if (Jc(w)) return D.updateFunctionDeclaration(w, l, w.asteriskToken, zr(s, Re), C, P, F, o ?? w.body) } function sZ(e, t, r, i, o, s, l) { let f = J_(t.sourceFile, t.preferences), d = Do(t.program.getCompilerOptions()), g = sx(t), m = t.program.getTypeChecker(), v = Yn(l), { typeArguments: S, arguments: x, parent: A } = i, w = v ? void 0 : m.getContextualType(i), C = on(x, $ => Re($) ? $.text : br($) && Re($.name) ? $.name.text : void 0), P = v ? [] : on(x, $ => m.getTypeAtLocation($)), { argumentTypeNodes: F, argumentTypeParameters: B } = sEe(m, r, P, l, d, void 0, g), q = s ? D.createNodeArray(D.createModifiersFromModifierFlags(s)) : void 0, W = f3(A) ? D.createToken(41) : void 0, Y = v ? void 0 : g9e(m, B, S), R = cZ(x.length, C, F, void 0, v), ie = v || w === void 0 ? void 0 : m.typeToTypeNode(w, l, void 0, g); switch (e) { case 171: return D.createMethodDeclaration(q, W, o, void 0, Y, R, ie, lZ(f)); case 170: return D.createMethodSignature(q, o, void 0, Y, R, ie === void 0 ? D.createKeywordTypeNode(157) : ie); case 259: return D.createFunctionDeclaration(q, W, o, Y, R, ie, fP(_.Function_not_implemented.message, f)); default: L.fail("Unexpected kind") } } function g9e(e, t, r) { let i = new Set(t.map(s => s[0])), o = new Map(t); if (r) { let s = r.filter(f => !t.some(d => { var g; return e.getTypeAtLocation(f) === ((g = d[1]) == null ? void 0 : g.argumentType) })), l = i.size + s.length; for (let f = 0; i.size < l; f += 1)i.add(aEe(f)) } return lo(i.values(), s => { var l; return D.createTypeParameterDeclaration(void 0, s, (l = o.get(s)) == null ? void 0 : l.constraint) }) } function aEe(e) { return 84 + e <= 90 ? String.fromCharCode(84 + e) : `T${e}` } function N9(e, t, r, i, o, s, l) { let f = e.typeToTypeNode(r, i, s, l); if (f && Mh(f)) { let d = l1(f, o); d && (cx(t, d.symbols), f = d.typeNode) } return cc(f) } function oEe(e) { return e.isUnionOrIntersection() ? e.types.some(oEe) : e.flags & 262144 } function sEe(e, t, r, i, o, s, l) { let f = [], d = new Map; for (let g = 0; g < r.length; g += 1) { let m = r[g]; if (m.isUnionOrIntersection() && m.types.some(oEe)) { let w = aEe(g); f.push(D.createTypeReferenceNode(w)), d.set(w, void 0); continue } let v = e.getBaseTypeOfLiteralType(m), S = N9(e, t, v, i, o, s, l); if (!S) continue; f.push(S); let x = cEe(m), A = m.isTypeParameter() && m.constraint && !y9e(m.constraint) ? N9(e, t, m.constraint, i, o, s, l) : void 0; x && d.set(x, { argumentType: m, constraint: A }) } return { argumentTypeNodes: f, argumentTypeParameters: lo(d.entries()) } } function y9e(e) { return e.flags & 524288 && e.objectFlags === 16 } function cEe(e) { var t; if (e.flags & 3145728) for (let r of e.types) { let i = cEe(r); if (i) return i } return e.flags & 262144 ? (t = e.getSymbol()) == null ? void 0 : t.getName() : void 0 } function cZ(e, t, r, i, o) { let s = [], l = new Map; for (let f = 0; f < e; f++) { let d = t?.[f] || `arg${f}`, g = l.get(d); l.set(d, (g || 0) + 1); let m = D.createParameterDeclaration(void 0, void 0, d + (g || ""), i !== void 0 && f >= i ? D.createToken(57) : void 0, o ? void 0 : r?.[f] || D.createKeywordTypeNode(157), void 0); s.push(m) } return s } function v9e(e, t, r, i, o, s, l, f, d) { let g = i[0], m = i[0].minArgumentCount, v = !1; for (let w of i) m = Math.min(w.minArgumentCount, m), Xl(w) && (v = !0), w.parameters.length >= g.parameters.length && (!Xl(w) || Xl(g)) && (g = w); let S = g.parameters.length - (Xl(g) ? 1 : 0), x = g.parameters.map(w => w.name), A = cZ(S, x, void 0, m, !1); if (v) { let w = D.createParameterDeclaration(void 0, D.createToken(25), x[S] || "rest", S >= m ? D.createToken(57) : void 0, D.createArrayTypeNode(D.createKeywordTypeNode(157)), void 0); A.push(w) } return E9e(l, o, s, void 0, A, b9e(i, e, t, r), f, d) } function b9e(e, t, r, i) { if (Fn(e)) { let o = t.getUnionType(on(e, t.getReturnTypeOfSignature)); return t.typeToTypeNode(o, i, 1, sx(r)) } } function E9e(e, t, r, i, o, s, l, f) { return D.createMethodDeclaration(e, void 0, t, r ? D.createToken(57) : void 0, i, o, s, f || lZ(l)) } function lZ(e) { return fP(_.Method_not_implemented.message, e) } function fP(e, t) { return D.createBlock([D.createThrowStatement(D.createNewExpression(D.createIdentifier("Error"), void 0, [D.createStringLiteral(e, t === 0)]))], !0) } function uZ(e, t, r) { let i = LI(t); if (!i) return; let o = fZ(i, "compilerOptions"); if (o === void 0) { e.insertNodeAtObjectStart(t, i, P9("compilerOptions", D.createObjectLiteralExpression(r.map(([l, f]) => P9(l, f)), !0))); return } let s = o.initializer; if (rs(s)) for (let [l, f] of r) { let d = fZ(s, l); d === void 0 ? e.insertNodeAtObjectStart(t, s, P9(l, f)) : e.replaceNode(t, d.initializer, f) } } function dZ(e, t, r, i) { uZ(e, t, [[r, i]]) } function P9(e, t) { return D.createPropertyAssignment(D.createStringLiteral(e), t) } function fZ(e, t) { return wr(e.properties, r => yl(r) && !!r.name && yo(r.name) && r.name.text === t) } function l1(e, t) { let r, i = $e(e, o, bi); if (r && i) return { typeNode: i, symbols: r }; function o(s) { if (ib(s) && s.qualifier) { let l = Yd(s.qualifier), f = j7(l.symbol, t), d = f !== l.text ? lEe(s.qualifier, D.createIdentifier(f)) : s.qualifier; r = Sn(r, l.symbol); let g = On(s.typeArguments, o, bi); return D.createTypeReferenceNode(d, g) } return xn(s, o, Bh) } } function lEe(e, t) { return e.kind === 79 ? t : D.createQualifiedName(lEe(e.left, t), e.right) } function cx(e, t) { t.forEach(r => e.addImportFromExportedSymbol(r, !0)) } function _Z(e, t) { let r = wl(t), i = Vi(e, t.start); for (; i.end < r;)i = i.parent; return i } var pZ, T9e = gt({ "src/services/codefixes/helpers.ts"() { "use strict"; Fr(), pZ = (e => (e[e.Method = 1] = "Method", e[e.Property = 2] = "Property", e[e.All = 3] = "All", e))(pZ || {}) } }); function uEe(e, t, r, i, o, s) { let l = _Ee(e, t, r, i); if (!l || Ok.isRefactorErrorInfo(l)) return; let f = nr.ChangeTracker.fromContext(o), { isStatic: d, isReadonly: g, fieldName: m, accessorName: v, originalName: S, type: x, container: A, declaration: w } = l; pd(m), pd(v), pd(w), pd(A); let C, P; if (Yr(A)) { let B = uu(w); if (Cu(e)) { let q = D.createModifiersFromModifierFlags(B); C = q, P = q } else C = D.createModifiersFromModifierFlags(A9e(B)), P = D.createModifiersFromModifierFlags(C9e(B)); HS(w) && (P = Qi(Uy(w), P)) } w9e(f, e, w, x, m, P); let F = I9e(m, v, x, C, d, A); if (pd(F), pEe(f, e, F, w, A), g) { let B = Vm(A); B && R9e(f, e, B, m.text, S) } else { let B = L9e(m, v, x, C, d, A); pd(B), pEe(f, e, B, w, A) } return f.getChanges() } function S9e(e) { return Re(e) || yo(e) } function x9e(e) { return Ad(e, e.parent) || Na(e) || yl(e) } function dEe(e, t) { return Re(t) ? D.createIdentifier(e) : D.createStringLiteral(e) } function fEe(e, t, r) { let i = t ? r.name : D.createThis(); return Re(e) ? D.createPropertyAccessExpression(i, e) : D.createElementAccessExpression(i, D.createStringLiteralFromNode(e)) } function A9e(e) { return e &= -65, e &= -9, e & 16 || (e |= 4), e } function C9e(e) { return e &= -5, e &= -17, e |= 8, e } function _Ee(e, t, r, i, o = !0) { let s = Vi(e, r), l = r === i && o, f = jn(s.parent, x9e), d = 124; if (!f || !(HX(f.name, e, r, i) || l)) return { error: uo(_.Could_not_find_property_for_which_to_generate_accessor) }; if (!S9e(f.name)) return { error: uo(_.Name_is_not_valid) }; if ((uu(f) & 126975 | d) !== d) return { error: uo(_.Can_only_convert_property_with_modifier) }; let g = f.name.text, m = DY(g), v = dEe(m ? g : i1(`_${g}`, e), f.name), S = dEe(m ? i1(g.substring(1), e) : g, f.name); return { isStatic: zc(f), isReadonly: jI(f), type: O9e(f, t), container: f.kind === 166 ? f.parent.parent : f.parent, originalName: f.name.text, declaration: f, fieldName: v, accessorName: S, renameAccessor: m } } function I9e(e, t, r, i, o, s) { return D.createGetAccessorDeclaration(i, t, [], r, D.createBlock([D.createReturnStatement(fEe(e, o, s))], !0)) } function L9e(e, t, r, i, o, s) { return D.createSetAccessorDeclaration(i, t, [D.createParameterDeclaration(void 0, void 0, D.createIdentifier("value"), void 0, r)], D.createBlock([D.createExpressionStatement(D.createAssignment(fEe(e, o, s), D.createIdentifier("value")))], !0)) } function k9e(e, t, r, i, o, s) { let l = D.updatePropertyDeclaration(r, s, o, r.questionToken || r.exclamationToken, i, r.initializer); e.replaceNode(t, r, l) } function D9e(e, t, r, i) { let o = D.updatePropertyAssignment(r, i, r.initializer); (o.modifiers || o.questionToken || o.exclamationToken) && (o === r && (o = D.cloneNode(o)), o.modifiers = void 0, o.questionToken = void 0, o.exclamationToken = void 0), e.replacePropertyAssignment(t, r, o) } function w9e(e, t, r, i, o, s) { Na(r) ? k9e(e, t, r, i, o, s) : yl(r) ? D9e(e, t, r, o) : e.replaceNode(t, r, D.updateParameterDeclaration(r, s, r.dotDotDotToken, Ga(o, Re), r.questionToken, r.type, r.initializer)) } function pEe(e, t, r, i, o) { Ad(i, i.parent) ? e.insertMemberAtStart(t, o, r) : yl(i) ? e.insertNodeAfterComma(t, i, r) : e.insertNodeAfter(t, i, r) } function R9e(e, t, r, i, o) { r.body && r.body.forEachChild(function s(l) { Vs(l) && l.expression.kind === 108 && yo(l.argumentExpression) && l.argumentExpression.text === o && YI(l) && e.replaceNode(t, l.argumentExpression, D.createStringLiteral(i)), br(l) && l.expression.kind === 108 && l.name.text === o && YI(l) && e.replaceNode(t, l.name, D.createIdentifier(i)), !Ia(l) && !Yr(l) && l.forEachChild(s) }) } function O9e(e, t) { let r = Mce(e); if (Na(e) && r && e.questionToken) { let i = t.getTypeChecker(), o = i.getTypeFromTypeNode(r); if (!i.isTypeAssignableTo(i.getUndefinedType(), o)) { let s = DS(r) ? r.types : [r]; return D.createUnionTypeNode([...s, D.createKeywordTypeNode(155)]) } } return r } function mZ(e, t) { let r = []; for (; e;) { let i = P0(e), o = i && t.getSymbolAtLocation(i.expression); if (!o) break; let s = o.flags & 2097152 ? t.getAliasedSymbol(o) : o, l = s.declarations && wr(s.declarations, Yr); if (!l) break; r.push(l), e = l } return r } var N9e = gt({ "src/services/codefixes/generateAccessors.ts"() { "use strict"; Fr() } }); function P9e(e, t) { let r = Gn(t), i = VA(t), o = e.program.getCompilerOptions(), s = []; return s.push(mEe(e, r, t, Xg(i.name, void 0, t.moduleSpecifier, J_(r, e.preferences)))), Rl(o) === 1 && s.push(mEe(e, r, t, D.createImportEqualsDeclaration(void 0, !1, i.name, D.createExternalModuleReference(t.moduleSpecifier)))), s } function mEe(e, t, r, i) { let o = nr.ChangeTracker.with(e, s => s.replaceNode(t, r, i)); return K_(hZ, o, [_.Replace_import_with_0, o[0].textChanges[0].newText]) } function M9e(e) { let t = e.sourceFile, r = _.This_expression_is_not_callable.code === e.errorCode ? 210 : 211, i = jn(Vi(t, e.span.start), s => s.kind === r); if (!i) return []; let o = i.expression; return hEe(e, o) } function F9e(e) { let t = e.sourceFile, r = jn(Vi(t, e.span.start), i => i.getStart() === e.span.start && i.getEnd() === e.span.start + e.span.length); return r ? hEe(e, r) : [] } function hEe(e, t) { let r = e.program.getTypeChecker().getTypeAtLocation(t); if (!(r.symbol && Zp(r.symbol) && r.symbol.links.originatingImport)) return []; let i = [], o = r.symbol.links.originatingImport; if (Dd(o) || si(i, P9e(e, o)), ot(t) && !(zl(t.parent) && t.parent.name === t)) { let s = e.sourceFile, l = nr.ChangeTracker.with(e, f => f.replaceNode(s, t, D.createPropertyAccessExpression(t, "default"), {})); i.push(K_(hZ, l, _.Use_synthetic_default_member)) } return i } var hZ, G9e = gt({ "src/services/codefixes/fixInvalidImportSyntax.ts"() { "use strict"; Fr(), Qa(), hZ = "invalidImportSyntax", za({ errorCodes: [_.This_expression_is_not_callable.code, _.This_expression_is_not_constructable.code], getCodeActions: M9e }), za({ errorCodes: [_.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code, _.Type_0_does_not_satisfy_the_constraint_1.code, _.Type_0_is_not_assignable_to_type_1.code, _.Type_0_is_not_assignable_to_type_1_Two_different_types_with_this_name_exist_but_they_are_unrelated.code, _.Type_predicate_0_is_not_assignable_to_1.code, _.Property_0_of_type_1_is_not_assignable_to_2_index_type_3.code, _._0_index_type_1_is_not_assignable_to_2_index_type_3.code, _.Property_0_in_type_1_is_not_assignable_to_the_same_property_in_base_type_2.code, _.Property_0_in_type_1_is_not_assignable_to_type_2.code, _.Property_0_of_JSX_spread_attribute_is_not_assignable_to_target_property.code, _.The_this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1.code], getCodeActions: F9e }) } }); function gEe(e, t) { let r = Vi(e, t); if (Re(r) && Na(r.parent)) { let i = Cl(r.parent); if (i) return { type: i, prop: r.parent, isJs: Yn(r.parent) } } } function B9e(e, t) { if (t.isJs) return; let r = nr.ChangeTracker.with(e, i => yEe(i, e.sourceFile, t.prop)); return Ma(M9, r, [_.Add_definite_assignment_assertion_to_property_0, t.prop.getText()], F9, _.Add_definite_assignment_assertions_to_all_uninitialized_properties) } function yEe(e, t, r) { pd(r); let i = D.updatePropertyDeclaration(r, r.modifiers, r.name, D.createToken(53), r.type, r.initializer); e.replaceNode(t, r, i) } function U9e(e, t) { let r = nr.ChangeTracker.with(e, i => vEe(i, e.sourceFile, t)); return Ma(M9, r, [_.Add_undefined_type_to_property_0, t.prop.name.getText()], G9, _.Add_undefined_type_to_all_uninitialized_properties) } function vEe(e, t, r) { let i = D.createKeywordTypeNode(155), o = DS(r.type) ? r.type.types.concat(i) : [r.type, i], s = D.createUnionTypeNode(o); r.isJs ? e.addJSDocTags(t, r.prop, [D.createJSDocTypeTag(void 0, D.createJSDocTypeExpression(s))]) : e.replaceNode(t, r.type, s) } function V9e(e, t) { if (t.isJs) return; let r = e.program.getTypeChecker(), i = EEe(r, t.prop); if (!i) return; let o = nr.ChangeTracker.with(e, s => bEe(s, e.sourceFile, t.prop, i)); return Ma(M9, o, [_.Add_initializer_to_property_0, t.prop.name.getText()], B9, _.Add_initializers_to_all_uninitialized_properties) } function bEe(e, t, r, i) { pd(r); let o = D.updatePropertyDeclaration(r, r.modifiers, r.name, r.questionToken, r.type, i); e.replaceNode(t, r, o) } function EEe(e, t) { return TEe(e, e.getTypeFromTypeNode(t.type)) } function TEe(e, t) { if (t.flags & 512) return t === e.getFalseType() || t === e.getFalseType(!0) ? D.createFalse() : D.createTrue(); if (t.isStringLiteral()) return D.createStringLiteral(t.value); if (t.isNumberLiteral()) return D.createNumericLiteral(t.value); if (t.flags & 2048) return D.createBigIntLiteral(t.value); if (t.isUnion()) return ks(t.types, r => TEe(e, r)); if (t.isClass()) { let r = Nh(t.symbol); if (!r || Mr(r, 256)) return; let i = Vm(r); return i && i.parameters.length ? void 0 : D.createNewExpression(D.createIdentifier(t.symbol.name), void 0, void 0) } else if (e.isArrayLikeType(t)) return D.createArrayLiteralExpression() } var M9, F9, G9, B9, gZ, j9e = gt({ "src/services/codefixes/fixStrictClassInitialization.ts"() { "use strict"; Fr(), Qa(), M9 = "strictClassInitialization", F9 = "addMissingPropertyDefiniteAssignmentAssertions", G9 = "addMissingPropertyUndefinedType", B9 = "addMissingPropertyInitializer", gZ = [_.Property_0_has_no_initializer_and_is_not_definitely_assigned_in_the_constructor.code], za({ errorCodes: gZ, getCodeActions: function (t) { let r = gEe(t.sourceFile, t.span.start); if (!r) return; let i = []; return Sn(i, U9e(t, r)), Sn(i, B9e(t, r)), Sn(i, V9e(t, r)), i }, fixIds: [F9, G9, B9], getAllCodeActions: e => ns(e, gZ, (t, r) => { let i = gEe(r.file, r.start); if (i) switch (e.fixId) { case F9: yEe(t, r.file, i.prop); break; case G9: vEe(t, r.file, i); break; case B9: let o = e.program.getTypeChecker(), s = EEe(o, i.prop); if (!s) return; bEe(t, r.file, i.prop, s); break; default: L.fail(JSON.stringify(e.fixId)) } }) }) } }); function SEe(e, t, r) { let { allowSyntheticDefaults: i, defaultImportName: o, namedImports: s, statement: l, required: f } = r; e.replaceNode(t, l, o && !i ? D.createImportEqualsDeclaration(void 0, !1, o, D.createExternalModuleReference(f)) : D.createImportDeclaration(void 0, D.createImportClause(!1, o, s), f, void 0)) } function xEe(e, t, r) { let { parent: i } = Vi(e, r); if (!qu(i, !0)) throw L.failBadSyntaxKind(i); let o = Ga(i.parent, wi), s = zr(o.name, Re), l = cm(o.name) ? H9e(o.name) : void 0; if (s || l) return { allowSyntheticDefaults: wT(t.getCompilerOptions()), defaultImportName: s, namedImports: l, statement: Ga(o.parent.parent, Bc), required: Vo(i.arguments) } } function H9e(e) { let t = []; for (let r of e.elements) { if (!Re(r.name) || r.initializer) return; t.push(D.createImportSpecifier(!1, zr(r.propertyName, Re), r.name)) } if (t.length) return D.createNamedImports(t) } var U9, yZ, W9e = gt({ "src/services/codefixes/requireInTs.ts"() { "use strict"; Fr(), Qa(), U9 = "requireInTs", yZ = [_.require_call_may_be_converted_to_an_import.code], za({ errorCodes: yZ, getCodeActions(e) { let t = xEe(e.sourceFile, e.program, e.span.start); if (!t) return; let r = nr.ChangeTracker.with(e, i => SEe(i, e.sourceFile, t)); return [Ma(U9, r, _.Convert_require_to_import, U9, _.Convert_all_require_to_import)] }, fixIds: [U9], getAllCodeActions: e => ns(e, yZ, (t, r) => { let i = xEe(r.file, e.program, r.start); i && SEe(t, e.sourceFile, i) }) }) } }); function AEe(e, t) { let r = Vi(e, t); if (!Re(r)) return; let { parent: i } = r; if (Nl(i) && um(i.moduleReference)) return { importNode: i, name: r, moduleSpecifier: i.moduleReference.expression }; if (nv(i)) { let o = i.parent.parent; return { importNode: o, name: r, moduleSpecifier: o.moduleSpecifier } } } function CEe(e, t, r, i) { e.replaceNode(t, r.importNode, Xg(r.name, void 0, r.moduleSpecifier, J_(t, i))) } var V9, vZ, z9e = gt({ "src/services/codefixes/useDefaultImport.ts"() { "use strict"; Fr(), Qa(), V9 = "useDefaultImport", vZ = [_.Import_may_be_converted_to_a_default_import.code], za({ errorCodes: vZ, getCodeActions(e) { let { sourceFile: t, span: { start: r } } = e, i = AEe(t, r); if (!i) return; let o = nr.ChangeTracker.with(e, s => CEe(s, t, i, e.preferences)); return [Ma(V9, o, _.Convert_to_default_import, V9, _.Convert_all_to_default_imports)] }, fixIds: [V9], getAllCodeActions: e => ns(e, vZ, (t, r) => { let i = AEe(r.file, r.start); i && CEe(t, r.file, i, e.preferences) }) }) } }); function IEe(e, t, r) { let i = zr(Vi(t, r.start), Vf); if (!i) return; let o = i.getText(t) + "n"; e.replaceNode(t, i, D.createBigIntLiteral(o)) } var j9, bZ, J9e = gt({ "src/services/codefixes/useBigintLiteral.ts"() { "use strict"; Fr(), Qa(), j9 = "useBigintLiteral", bZ = [_.Numeric_literals_with_absolute_values_equal_to_2_53_or_greater_are_too_large_to_be_represented_accurately_as_integers.code], za({ errorCodes: bZ, getCodeActions: function (t) { let r = nr.ChangeTracker.with(t, i => IEe(i, t.sourceFile, t.span)); if (r.length > 0) return [Ma(j9, r, _.Convert_to_a_bigint_numeric_literal, j9, _.Convert_all_to_bigint_numeric_literals)] }, fixIds: [j9], getAllCodeActions: e => ns(e, bZ, (t, r) => IEe(t, r.file, r)) }) } }); function LEe(e, t) { let r = Vi(e, t); return L.assert(r.kind === 100, "This token should be an ImportKeyword"), L.assert(r.parent.kind === 202, "Token parent should be an ImportType"), r.parent } function kEe(e, t, r) { let i = D.updateImportTypeNode(r, r.argument, r.assertions, r.qualifier, r.typeArguments, !0); e.replaceNode(t, r, i) } var DEe, H9, EZ, K9e = gt({ "src/services/codefixes/fixAddModuleReferTypeMissingTypeof.ts"() { "use strict"; Fr(), Qa(), DEe = "fixAddModuleReferTypeMissingTypeof", H9 = DEe, EZ = [_.Module_0_does_not_refer_to_a_type_but_is_used_as_a_type_here_Did_you_mean_typeof_import_0.code], za({ errorCodes: EZ, getCodeActions: function (t) { let { sourceFile: r, span: i } = t, o = LEe(r, i.start), s = nr.ChangeTracker.with(t, l => kEe(l, r, o)); return [Ma(H9, s, _.Add_missing_typeof, H9, _.Add_missing_typeof)] }, fixIds: [H9], getAllCodeActions: e => ns(e, EZ, (t, r) => kEe(t, e.sourceFile, LEe(r.file, r.start))) }) } }); function wEe(e, t) { let o = Vi(e, t).parent.parent; if (!(!ar(o) && (o = o.parent, !ar(o))) && rc(o.operatorToken)) return o } function REe(e, t, r) { let i = q9e(r); i && e.replaceNode(t, r, D.createJsxFragment(D.createJsxOpeningFragment(), i, D.createJsxJsxClosingFragment())) } function q9e(e) { let t = [], r = e; for (; ;)if (ar(r) && rc(r.operatorToken) && r.operatorToken.kind === 27) { if (t.push(r.left), Pw(r.right)) return t.push(r.right), t; if (ar(r.right)) { r = r.right; continue } else return } else return } var W9, TZ, X9e = gt({ "src/services/codefixes/wrapJsxInFragment.ts"() { "use strict"; Fr(), Qa(), W9 = "wrapJsxInFragment", TZ = [_.JSX_expressions_must_have_one_parent_element.code], za({ errorCodes: TZ, getCodeActions: function (t) { let { sourceFile: r, span: i } = t, o = wEe(r, i.start); if (!o) return; let s = nr.ChangeTracker.with(t, l => REe(l, r, o)); return [Ma(W9, s, _.Wrap_in_JSX_fragment, W9, _.Wrap_all_unparented_JSX_in_JSX_fragment)] }, fixIds: [W9], getAllCodeActions: e => ns(e, TZ, (t, r) => { let i = wEe(e.sourceFile, r.start); i && REe(t, e.sourceFile, i) }) }) } }); function OEe(e, t) { let r = Vi(e, t), i = zr(r.parent.parent, kS); if (!i) return; let o = ku(i.parent) ? i.parent : zr(i.parent.parent, Ep); if (o) return { indexSignature: i, container: o } } function Y9e(e, t) { return D.createTypeAliasDeclaration(e.modifiers, e.name, e.typeParameters, t) } function NEe(e, t, { indexSignature: r, container: i }) { let s = (ku(i) ? i.members : i.type.members).filter(m => !kS(m)), l = Vo(r.parameters), f = D.createTypeParameterDeclaration(void 0, Ga(l.name, Re), l.type), d = D.createMappedTypeNode(jI(r) ? D.createModifier(146) : void 0, f, void 0, r.questionToken, r.type, void 0), g = D.createIntersectionTypeNode([...NI(i), d, ...s.length ? [D.createTypeLiteralNode(s)] : Je]); e.replaceNode(t, i, Y9e(i, g)) } var z9, SZ, $9e = gt({ "src/services/codefixes/convertToMappedObjectType.ts"() { "use strict"; Fr(), Qa(), z9 = "fixConvertToMappedObjectType", SZ = [_.An_index_signature_parameter_type_cannot_be_a_literal_type_or_generic_type_Consider_using_a_mapped_object_type_instead.code], za({ errorCodes: SZ, getCodeActions: function (t) { let { sourceFile: r, span: i } = t, o = OEe(r, i.start); if (!o) return; let s = nr.ChangeTracker.with(t, f => NEe(f, r, o)), l = vr(o.container.name); return [Ma(z9, s, [_.Convert_0_to_mapped_object_type, l], z9, [_.Convert_0_to_mapped_object_type, l])] }, fixIds: [z9], getAllCodeActions: e => ns(e, SZ, (t, r) => { let i = OEe(r.file, r.start); i && NEe(t, r.file, i) }) }) } }), xZ, PEe, Q9e = gt({ "src/services/codefixes/removeAccidentalCallParentheses.ts"() { "use strict"; Fr(), Qa(), xZ = "removeAccidentalCallParentheses", PEe = [_.This_expression_is_not_callable_because_it_is_a_get_accessor_Did_you_mean_to_use_it_without.code], za({ errorCodes: PEe, getCodeActions(e) { let t = jn(Vi(e.sourceFile, e.span.start), Pa); if (!t) return; let r = nr.ChangeTracker.with(e, i => { i.deleteRange(e.sourceFile, { pos: t.expression.end, end: t.end }) }); return [K_(xZ, r, _.Remove_parentheses)] }, fixIds: [xZ] }) } }); function MEe(e, t, r) { let i = zr(Vi(t, r.start), f => f.kind === 133), o = i && zr(i.parent, v2); if (!o) return; let s = o; if (ud(o.parent)) { let f = QI(o.expression, !1); if (Re(f)) { let d = el(o.parent.pos, t); d && d.kind !== 103 && (s = o.parent) } } e.replaceNode(t, s, o.expression) } var J9, AZ, Z9e = gt({ "src/services/codefixes/removeUnnecessaryAwait.ts"() { "use strict"; Fr(), Qa(), J9 = "removeUnnecessaryAwait", AZ = [_.await_has_no_effect_on_the_type_of_this_expression.code], za({ errorCodes: AZ, getCodeActions: function (t) { let r = nr.ChangeTracker.with(t, i => MEe(i, t.sourceFile, t.span)); if (r.length > 0) return [Ma(J9, r, _.Remove_unnecessary_await, J9, _.Remove_all_unnecessary_uses_of_await)] }, fixIds: [J9], getAllCodeActions: e => ns(e, AZ, (t, r) => MEe(t, r.file, r)) }) } }); function FEe(e, t) { return jn(Vi(e, t.start), gl) } function GEe(e, t, r) { if (!t) return; let i = L.checkDefined(t.importClause); e.replaceNode(r.sourceFile, t, D.updateImportDeclaration(t, t.modifiers, D.updateImportClause(i, i.isTypeOnly, i.name, void 0), t.moduleSpecifier, t.assertClause)), e.insertNodeAfter(r.sourceFile, t, D.createImportDeclaration(void 0, D.updateImportClause(i, i.isTypeOnly, void 0, i.namedBindings), t.moduleSpecifier, t.assertClause)) } var CZ, K9, eGe = gt({ "src/services/codefixes/splitTypeOnlyImport.ts"() { "use strict"; Fr(), Qa(), CZ = [_.A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both.code], K9 = "splitTypeOnlyImport", za({ errorCodes: CZ, fixIds: [K9], getCodeActions: function (t) { let r = nr.ChangeTracker.with(t, i => GEe(i, FEe(t.sourceFile, t.span), t)); if (r.length) return [Ma(K9, r, _.Split_into_two_separate_import_declarations, K9, _.Split_all_invalid_type_only_imports)] }, getAllCodeActions: e => ns(e, CZ, (t, r) => { GEe(t, FEe(e.sourceFile, r), e) }) }) } }); function BEe(e, t, r) { var i; let s = r.getTypeChecker().getSymbolAtLocation(Vi(e, t)); if (s === void 0) return; let l = zr((i = s?.valueDeclaration) == null ? void 0 : i.parent, pu); if (l === void 0) return; let f = Yo(l, 85, e); if (f !== void 0) return { symbol: s, token: f } } function UEe(e, t, r) { e.replaceNode(t, r, D.createToken(119)) } var q9, IZ, tGe = gt({ "src/services/codefixes/convertConstToLet.ts"() { "use strict"; Fr(), Qa(), q9 = "fixConvertConstToLet", IZ = [_.Cannot_assign_to_0_because_it_is_a_constant.code], za({ errorCodes: IZ, getCodeActions: function (t) { let { sourceFile: r, span: i, program: o } = t, s = BEe(r, i.start, o); if (s === void 0) return; let l = nr.ChangeTracker.with(t, f => UEe(f, r, s.token)); return [D$(q9, l, _.Convert_const_to_let, q9, _.Convert_all_const_to_let)] }, getAllCodeActions: e => { let { program: t } = e, r = new Map; return ix(nr.ChangeTracker.with(e, i => { ax(e, IZ, o => { let s = BEe(o.file, o.start, t); if (s && V_(r, $a(s.symbol))) return UEe(i, o.file, s.token) }) })) }, fixIds: [q9] }) } }); function VEe(e, t, r) { let i = Vi(e, t); return i.kind === 26 && i.parent && (rs(i.parent) || fu(i.parent)) ? { node: i } : void 0 } function jEe(e, t, { node: r }) { let i = D.createToken(27); e.replaceNode(t, r, i) } var X9, HEe, LZ, nGe = gt({ "src/services/codefixes/fixExpectedComma.ts"() { "use strict"; Fr(), Qa(), X9 = "fixExpectedComma", HEe = _._0_expected.code, LZ = [HEe], za({ errorCodes: LZ, getCodeActions(e) { let { sourceFile: t } = e, r = VEe(t, e.span.start, e.errorCode); if (!r) return; let i = nr.ChangeTracker.with(e, o => jEe(o, t, r)); return [Ma(X9, i, [_.Change_0_to_1, ";", ","], X9, [_.Change_0_to_1, ";", ","])] }, fixIds: [X9], getAllCodeActions: e => ns(e, LZ, (t, r) => { let i = VEe(r.file, r.start, r.code); i && jEe(t, e.sourceFile, i) }) }) } }); function WEe(e, t, r, i, o) { let s = Vi(t, r.start); if (!Re(s) || !Pa(s.parent) || s.parent.expression !== s || s.parent.arguments.length !== 0) return; let l = i.getTypeChecker(), f = l.getSymbolAtLocation(s), d = f?.valueDeclaration; if (!d || !ha(d) || !z0(d.parent.parent) || o?.has(d)) return; o?.add(d); let g = rGe(d.parent.parent); if (vt(g)) { let m = g[0], v = !DS(m) && !wS(m) && wS(D.createUnionTypeNode([m, D.createKeywordTypeNode(114)]).types[0]); v && e.insertText(t, m.pos, "("), e.insertText(t, m.end, v ? ") | void" : " | void") } else { let m = l.getResolvedSignature(s.parent), v = m?.parameters[0], S = v && l.getTypeOfSymbolAtLocation(v, d.parent.parent); Yn(d) ? (!S || S.flags & 3) && (e.insertText(t, d.parent.parent.end, ")"), e.insertText(t, xo(t.text, d.parent.parent.pos), "/** @type {Promise<void>} */(")) : (!S || S.flags & 2) && e.insertText(t, d.parent.parent.expression.end, "<void>") } } function rGe(e) { var t; if (Yn(e)) { if (ud(e.parent)) { let r = (t = x0(e.parent)) == null ? void 0 : t.typeExpression.type; if (r && m_(r) && Re(r.typeName) && vr(r.typeName) === "Promise") return r.typeArguments } } else return e.typeArguments } var zEe, kZ, DZ, iGe = gt({ "src/services/codefixes/fixAddVoidToPromise.ts"() { "use strict"; Fr(), Qa(), zEe = "addVoidToPromise", kZ = "addVoidToPromise", DZ = [_.Expected_1_argument_but_got_0_new_Promise_needs_a_JSDoc_hint_to_produce_a_resolve_that_can_be_called_without_arguments.code, _.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise.code], za({ errorCodes: DZ, fixIds: [kZ], getCodeActions(e) { let t = nr.ChangeTracker.with(e, r => WEe(r, e.sourceFile, e.span, e.program)); if (t.length > 0) return [Ma(zEe, t, _.Add_void_to_Promise_resolved_without_a_value, kZ, _.Add_void_to_all_Promises_resolved_without_a_value)] }, getAllCodeActions(e) { return ns(e, DZ, (t, r) => WEe(t, r.file, r, e.program, new Set)) } }) } }), gu = {}; Mo(gu, { PreserveOptionalFlags: () => pZ, addNewNodeForMemberSymbol: () => iEe, codeFixAll: () => ns, createCodeFixAction: () => Ma, createCodeFixActionMaybeFixAll: () => D$, createCodeFixActionWithoutFixAll: () => K_, createCombinedCodeActions: () => ix, createFileTextChanges: () => _ve, createImportAdder: () => s1, createImportSpecifierResolver: () => v7e, createJsonPropertyAssignment: () => P9, createMissingMemberNodes: () => oZ, createSignatureDeclarationFromCallExpression: () => sZ, createSignatureDeclarationFromSignature: () => O9, createStubbedBody: () => fP, eachDiagnostic: () => ax, findAncestorMatchingSpan: () => _Z, findJsonProperty: () => fZ, generateAccessorFromProperty: () => uEe, getAccessorConvertiblePropertyAtPosition: () => _Ee, getAllFixes: () => nFe, getAllSupers: () => mZ, getArgumentTypesAndTypeParameters: () => sEe, getFixes: () => tFe, getImportCompletionAction: () => b7e, getImportKind: () => rQ, getNoopSymbolTrackerWithResolver: () => sx, getPromoteTypeOnlyCompletionAction: () => E7e, getSupportedErrorCodes: () => Z3e, importFixName: () => lQ, importSymbols: () => cx, moduleSpecifierToValidIdentifier: () => cQ, moduleSymbolToValidIdentifier: () => sQ, parameterShouldGetTypeFromJSDoc: () => Rve, registerCodeFix: () => za, setJsonCompilerOptionValue: () => dZ, setJsonCompilerOptionValues: () => uZ, tryGetAutoImportableReferenceFromTypeNode: () => l1, typeToAutoImportableTypeNode: () => N9 }); var Qa = gt({ "src/services/_namespaces/ts.codefix.ts"() { "use strict"; rFe(), iFe(), aFe(), cFe(), _Fe(), gFe(), yFe(), vFe(), bFe(), xFe(), NFe(), MFe(), KFe(), d7e(), f7e(), p7e(), m7e(), h7e(), y7e(), V7e(), W7e(), K7e(), q7e(), X7e(), Q7e(), t5e(), i5e(), l5e(), v5e(), E5e(), T5e(), x5e(), A5e(), C5e(), I5e(), k5e(), D5e(), w5e(), R5e(), O5e(), P5e(), G5e(), j5e(), Y5e(), Q5e(), Z5e(), n9e(), r9e(), a9e(), o9e(), p9e(), m9e(), h9e(), T9e(), N9e(), G9e(), j9e(), W9e(), z9e(), J9e(), K9e(), X9e(), $9e(), Q9e(), Z9e(), eGe(), tGe(), nGe(), iGe() } }); function aGe(e) { return !!(e.kind & 1) } function oGe(e) { return !!(e.kind & 2) } function _P(e) { return !!(e && e.kind & 4) } function eC(e) { return !!(e && e.kind === 32) } function sGe(e) { return _P(e) || eC(e) || wZ(e) } function cGe(e) { return (_P(e) || eC(e)) && !!e.isFromPackageJson } function lGe(e) { return !!(e.kind & 8) } function uGe(e) { return !!(e.kind & 16) } function JEe(e) { return !!(e && e.kind & 64) } function KEe(e) { return !!(e && e.kind & 128) } function dGe(e) { return !!(e && e.kind & 256) } function wZ(e) { return !!(e && e.kind & 512) } function qEe(e, t, r, i, o, s, l, f, d) { var g, m, v; let S = Ms(), x = l || bS($s(i.getCompilerOptions())), A = !1, w = 0, C = 0, P = 0, F = 0, B = d({ tryResolve: W, skippedAny: () => A, resolvedAny: () => C > 0, resolvedBeyondLimit: () => C > iG }), q = F ? ` (${(P / F * 100).toFixed(1)}% hit rate)` : ""; return (g = t.log) == null || g.call(t, `${e}: resolved ${C} module specifiers, plus ${w} ambient and ${P} from cache${q}`), (m = t.log) == null || m.call(t, `${e}: response is ${A ? "incomplete" : "complete"}`), (v = t.log) == null || v.call(t, `${e}: ${Ms() - S}`), B; function W(Y, R) { if (R) { let Z = r.getModuleSpecifierForBestExportInfo(Y, o, f); return Z && w++, Z || "failed" } let ie = x || s.allowIncompleteCompletions && C < iG, $ = !ie && s.allowIncompleteCompletions && F < jZ, fe = ie || $ ? r.getModuleSpecifierForBestExportInfo(Y, o, f, $) : void 0; return (!ie && !$ || $ && !fe) && (A = !0), C += fe?.computedWithoutCacheCount || 0, P += Y.length - (fe?.computedWithoutCacheCount || 0), $ && F++, fe || (x ? "failed" : "skipped") } } function fGe(e, t, r, i, o, s, l, f, d, g, m = !1) { var v; let { previousToken: S } = Q9(o, i); if (l && !n1(i, o, S) && !JGe(i, l, S, o)) return; if (l === " ") return s.includeCompletionsForImportStatements && s.includeCompletionsWithInsertText ? { isGlobalCompletion: !0, isMemberCompletion: !1, isNewIdentifierLocation: !0, isIncomplete: !0, entries: [] } : void 0; let x = t.getCompilerOptions(), A = s.allowIncompleteCompletions ? (v = e.getIncompleteCompletionsCache) == null ? void 0 : v.call(e) : void 0; if (A && f === 3 && S && Re(S)) { let P = _Ge(A, i, S, t, e, s, d, o); if (P) return P } else A?.clear(); let w = aG.getStringLiteralCompletions(i, o, S, x, e, t, r, s, m); if (w) return w; if (S && hI(S.parent) && (S.kind === 81 || S.kind === 86 || S.kind === 79)) return wGe(S.parent); let C = iTe(t, r, i, x, o, s, void 0, e, g, d); if (C) switch (C.kind) { case 0: let P = gGe(i, e, t, x, r, C, s, g, o, m); return P?.isIncomplete && A?.set(P), P; case 1: return RZ(xb.getJSDocTagNameCompletions()); case 2: return RZ(xb.getJSDocTagCompletions()); case 3: return RZ(xb.getJSDocParameterNameCompletions(C.tag)); case 4: return mGe(C.keywordCompletions, C.isNewIdentifierLocation); default: return L.assertNever(C) } } function pP(e, t) { var r, i; let o = XD(e.sortText, t.sortText); return o === 0 && (o = XD(e.name, t.name)), o === 0 && ((r = e.data) != null && r.moduleSpecifier) && ((i = t.data) != null && i.moduleSpecifier) && (o = BR(e.data.moduleSpecifier, t.data.moduleSpecifier)), o === 0 ? -1 : o } function XEe(e) { return !!e?.moduleSpecifier } function _Ge(e, t, r, i, o, s, l, f) { let d = e.get(); if (!d) return; let g = ef(t, f), m = r.text.toLowerCase(), v = YN(t, o, i, s, l), S = qEe("continuePreviousIncompleteResponse", o, gu.createImportSpecifierResolver(t, i, o, s), i, r.getStart(), s, !1, TS(r), x => { let A = Zi(d.entries, w => { var C; if (!w.hasAction || !w.source || !w.data || XEe(w.data)) return w; if (!gTe(w.name, m)) return; let { origin: P } = L.checkDefined(aTe(w.name, w.data, i, o)), F = v.get(t.path, w.data.exportMapKey), B = F && x.tryResolve(F, !fl(u_(P.moduleSymbol.name))); if (B === "skipped") return w; if (!B || B === "failed") { (C = o.log) == null || C.call(o, `Unexpected failure resolving auto import for '${w.name}' from '${w.source}'`); return } let q = { ...P, kind: 32, moduleSpecifier: B.moduleSpecifier }; return w.data = tTe(q), w.source = PZ(q), w.sourceDisplay = [tf(q.moduleSpecifier)], w }); return x.skippedAny() || (d.isIncomplete = void 0), A }); return d.entries = S, d.flags = (d.flags || 0) | 4, d.optionalReplacementSpan = $Ee(g), d } function RZ(e) { return { isGlobalCompletion: !1, isMemberCompletion: !1, isNewIdentifierLocation: !1, entries: e } } function pGe(e) { return { name: Xa(e), kind: "keyword", kindModifiers: "", sortText: Pl.GlobalsOrKeywords } } function mGe(e, t) { return { isGlobalCompletion: !1, isMemberCompletion: !1, isNewIdentifierLocation: t, entries: e.slice() } } function YEe(e, t, r) { return { kind: 4, keywordCompletions: oTe(e, t), isNewIdentifierLocation: r } } function hGe(e) { switch (e) { case 154: return 8; default: L.fail("Unknown mapping from SyntaxKind to KeywordCompletionFilters") } } function $Ee(e) { return e?.kind === 79 ? Du(e) : void 0 } function gGe(e, t, r, i, o, s, l, f, d, g) { let { symbols: m, contextToken: v, completionKind: S, isInSnippetScope: x, isNewIdentifierLocation: A, location: w, propertyAccessToConvert: C, keywordFilters: P, symbolToOriginInfoMap: F, recommendedCompletion: B, isJsxInitializer: q, isTypeOnlyLocation: W, isJsxIdentifierExpected: Y, isRightOfOpenTag: R, isRightOfDotOrQuestionDot: ie, importStatementCompletion: $, insideJsDocTagTypeExpression: fe, symbolToSortTextMap: Z, hasUnresolvedAutoImports: U } = s, re = s.literals, le = r.getTypeChecker(); if (RR(e.scriptKind) === 1) { let ke = vGe(w, e); if (ke) return ke } let _e = jn(v, CL); if (_e && (Pue(v) || AT(v, _e.expression))) { let ke = J7(le, _e.parent.clauses); re = re.filter(Pe => !ke.hasValue(Pe)), m.forEach((Pe, Ce) => { if (Pe.valueDeclaration && q0(Pe.valueDeclaration)) { let Ie = le.getConstantValue(Pe.valueDeclaration); Ie !== void 0 && ke.hasValue(Ie) && (F[Ce] = { kind: 256 }) } }) } let ge = MU(), X = QEe(e, i); if (X && !A && (!m || m.length === 0) && P === 0) return; let Ve = MZ(m, ge, void 0, v, w, d, e, t, r, Do(i), o, S, l, i, f, W, C, Y, q, $, B, F, Z, Y, R, g); if (P !== 0) for (let ke of oTe(P, !fe && Cu(e))) (W && ik(lT(ke.name)) || !Ve.has(ke.name)) && (Ve.add(ke.name), Ny(ge, ke, pP, !0)); for (let ke of VGe(v, d)) Ve.has(ke.name) || (Ve.add(ke.name), Ny(ge, ke, pP, !0)); for (let ke of re) { let Pe = EGe(e, l, ke); Ve.add(Pe.name), Ny(ge, Pe, pP, !0) } X || bGe(e, w.pos, Ve, Do(i), ge); let we; if (l.includeCompletionsWithInsertText && v && !R && !ie && (we = jn(v, hO))) { let ke = ZEe(we, e, l, i, t, r, f); ke && ge.push(ke.entry) } return { flags: s.flags, isGlobalCompletion: x, isIncomplete: l.allowIncompleteCompletions && U ? !0 : void 0, isMemberCompletion: yGe(S), isNewIdentifierLocation: A, optionalReplacementSpan: $Ee(w), entries: ge } } function QEe(e, t) { return !Cu(e) || !!HR(e, t) } function ZEe(e, t, r, i, o, s, l) { let f = e.clauses, d = s.getTypeChecker(), g = d.getTypeAtLocation(e.parent.expression); if (g && g.isUnion() && Ji(g.types, m => m.isLiteral())) { let m = J7(d, f), v = Do(i), S = J_(t, r), x = gu.createImportAdder(t, s, r, o), A = []; for (let W of g.types) if (W.flags & 1024) { L.assert(W.symbol, "An enum member type should have a symbol"), L.assert(W.symbol.parent, "An enum member type should have a parent symbol (the enum symbol)"); let Y = W.symbol.valueDeclaration && d.getConstantValue(W.symbol.valueDeclaration); if (Y !== void 0) { if (m.hasValue(Y)) continue; m.addValue(Y) } let R = gu.typeToAutoImportableTypeNode(d, x, W, e, v); if (!R) return; let ie = Y9(R, v, S); if (!ie) return; A.push(ie) } else if (!m.hasValue(W.value)) switch (typeof W.value) { case "object": A.push(W.value.negative ? D.createPrefixUnaryExpression(40, D.createBigIntLiteral({ negative: !1, base10Value: W.value.base10Value })) : D.createBigIntLiteral(W.value)); break; case "number": A.push(W.value < 0 ? D.createPrefixUnaryExpression(40, D.createNumericLiteral(-W.value)) : D.createNumericLiteral(W.value)); break; case "string": A.push(D.createStringLiteral(W.value, S === 0)); break }if (A.length === 0) return; let w = on(A, W => D.createCaseClause(W, [])), C = bb(o, l?.options), P = NZ({ removeComments: !0, module: i.module, target: i.target, newLine: XN(C) }), F = l ? W => P.printAndFormatNode(4, W, t, l) : W => P.printNode(4, W, t), B = on(w, (W, Y) => r.includeCompletionsWithSnippetText ? `${F(W)}$${Y + 1}` : `${F(W)}`).join(C); return { entry: { name: `${P.printNode(4, w[0], t)} ...`, kind: "", sortText: Pl.GlobalsOrKeywords, insertText: B, hasAction: x.hasFixes() || void 0, source: "SwitchCases/", isSnippet: r.includeCompletionsWithSnippetText ? !0 : void 0 }, importAdder: x } } } function Y9(e, t, r) { switch (e.kind) { case 180: let i = e.typeName; return $9(i, t, r); case 196: let o = Y9(e.objectType, t, r), s = Y9(e.indexType, t, r); return o && s && D.createElementAccessExpression(o, s); case 198: let l = e.literal; switch (l.kind) { case 10: return D.createStringLiteral(l.text, r === 0); case 8: return D.createNumericLiteral(l.text, l.numericLiteralFlags) }return; case 193: let f = Y9(e.type, t, r); return f && (Re(f) ? f : D.createParenthesizedExpression(f)); case 183: return $9(e.exprName, t, r); case 202: L.fail("We should not get an import type after calling 'codefix.typeToAutoImportableTypeNode'.") } } function $9(e, t, r) { if (Re(e)) return e; let i = Gi(e.right.escapedText); return HW(i, t) ? D.createPropertyAccessExpression($9(e.left, t, r), i) : D.createElementAccessExpression($9(e.left, t, r), D.createStringLiteral(i, r === 0)) } function yGe(e) { switch (e) { case 0: case 3: case 2: return !0; default: return !1 } } function vGe(e, t) { let r = jn(e, i => { switch (i.kind) { case 284: return !0; case 43: case 31: case 79: case 208: return !1; default: return "quit" } }); if (r) { let i = !!Yo(r, 31, t), l = r.parent.openingElement.tagName.getText(t) + (i ? "" : ">"), f = Du(r.tagName), d = { name: l, kind: "class", kindModifiers: void 0, sortText: Pl.LocationPriority }; return { isGlobalCompletion: !1, isMemberCompletion: !0, isNewIdentifierLocation: !1, optionalReplacementSpan: f, entries: [d] } } } function bGe(e, t, r, i, o) { p$(e).forEach((s, l) => { if (s === t) return; let f = Gi(l); !r.has(f) && i_(f, i) && (r.add(f), Ny(o, { name: f, kind: "warning", kindModifiers: "", sortText: Pl.JavascriptIdentifiers, isFromUncheckedFile: !0 }, pP)) }) } function OZ(e, t, r) { return typeof r == "object" ? j0(r) + "n" : Ta(r) ? ck(e, t, r) : JSON.stringify(r) } function EGe(e, t, r) { return { name: OZ(e, t, r), kind: "string", kindModifiers: "", sortText: Pl.LocationPriority } } function TGe(e, t, r, i, o, s, l, f, d, g, m, v, S, x, A, w, C, P, F, B, q, W, Y, R) { let ie, $ = eY(r), fe, Z, U = PZ(v), re, le, _e, ge = d.getTypeChecker(), X = v && uGe(v), Ve = v && oGe(v) || m; if (v && aGe(v)) ie = m ? `this${X ? "?." : ""}[${nTe(l, F, g)}]` : `this${X ? "?." : "."}${g}`; else if ((Ve || X) && x) { ie = Ve ? m ? `[${nTe(l, F, g)}]` : `[${g}]` : g, (X || x.questionDotToken) && (ie = `?.${ie}`); let we = Yo(x, 24, l) || Yo(x, 28, l); if (!we) return; let ke = na(g, x.name.text) ? x.name.end : we.end; $ = Wc(we.getStart(l), ke) } if (A && (ie === void 0 && (ie = g), ie = `{${ie}}`, typeof A != "boolean" && ($ = Du(A, l))), v && lGe(v) && x) { ie === void 0 && (ie = g); let we = el(x.pos, l), ke = ""; we && N7(we.end, we.parent, l) && (ke = ";"), ke += `(await ${x.expression.getText()})`, ie = m ? `${ke}${ie}` : `${ke}${X ? "?." : "."}${ie}`; let Ce = zr(x.parent, v2) ? x.parent : x.expression; $ = Wc(Ce.getStart(l), x.end) } if (eC(v) && (re = [tf(v.moduleSpecifier)], w && ({ insertText: ie, replacementSpan: $ } = kGe(g, w, v, C, l, P, F), Z = F.includeCompletionsWithSnippetText ? !0 : void 0)), v?.kind === 64 && (le = !0), F.includeCompletionsWithClassMemberSnippets && F.includeCompletionsWithInsertText && B === 3 && SGe(e, o, l)) { let we; ({ insertText: ie, isSnippet: Z, importAdder: we, replacementSpan: $ } = eTe(f, d, P, F, g, e, o, s, i, q)), t = Pl.ClassMemberSnippets, we?.hasFixes() && (le = !0, U = "ClassMemberSnippet/") } if (v && KEe(v) && ({ insertText: ie, isSnippet: Z, labelDetails: _e } = v, F.useLabelDetailsInCompletionEntries || (g = g + _e.detail, _e = void 0), U = "ObjectLiteralMethodSnippet/", t = Pl.SortBelow(t)), W && !Y && F.includeCompletionsWithSnippetText && F.jsxAttributeCompletionStyle && F.jsxAttributeCompletionStyle !== "none" && !(Sp(o.parent) && o.parent.initializer)) { let we = F.jsxAttributeCompletionStyle === "braces", ke = ge.getTypeOfSymbolAtLocation(e, o); F.jsxAttributeCompletionStyle === "auto" && !(ke.flags & 528) && !(ke.flags & 1048576 && wr(ke.types, Pe => !!(Pe.flags & 528))) && (ke.flags & 402653316 || ke.flags & 1048576 && Ji(ke.types, Pe => !!(Pe.flags & 402686084 || Nhe(Pe))) ? (ie = `${OT(g)}=${ck(l, F, "$1")}`, Z = !0) : we = !0), we && (ie = `${OT(g)}={$1}`, Z = !0) } if (!(ie !== void 0 && !F.includeCompletionsWithInsertText)) return (_P(v) || eC(v)) && (fe = tTe(v), le = !w), { name: g, kind: $g.getSymbolKind(ge, e, o), kindModifiers: $g.getSymbolModifiers(ge, e), sortText: t, source: U, hasAction: le ? !0 : void 0, isRecommended: DGe(e, S, ge) || void 0, insertText: ie, replacementSpan: $, sourceDisplay: re, labelDetails: _e, isSnippet: Z, isPackageJsonImport: cGe(v) || void 0, isImportStatementCompletion: !!w || void 0, data: fe, ...R ? { symbol: e } : void 0 } } function SGe(e, t, r) { return Yn(t) ? !1 : !!(e.flags & 106500) && (Yr(t) || t.parent && t.parent.parent && _l(t.parent) && t === t.parent.name && t.parent.getLastToken(r) === t.parent.name && Yr(t.parent.parent) || t.parent && A2(t) && Yr(t.parent)) } function eTe(e, t, r, i, o, s, l, f, d, g) { let m = jn(l, Yr); if (!m) return { insertText: o }; let v, S, x = o, A = t.getTypeChecker(), w = l.getSourceFile(), C = NZ({ removeComments: !0, module: r.module, target: r.target, omitTrailingSemicolon: !1, newLine: XN(bb(e, g?.options)) }), P = gu.createImportAdder(w, t, i, e), F; if (i.includeCompletionsWithSnippetText) { v = !0; let ie = D.createEmptyStatement(); F = D.createBlock([ie], !0), Ez(ie, { kind: 0, order: 0 }) } else F = D.createBlock([], !0); let B = 0, { modifiers: q, span: W } = xGe(d, w, f), Y = !!(q & 256), R = []; return gu.addNewNodeForMemberSymbol(s, m, w, { program: t, host: e }, i, P, ie => { let $ = 0; Y && ($ |= 256), _l(ie) && A.getMemberOverrideModifierStatus(m, ie, s) === 1 && ($ |= 16384), R.length || (B = ie.modifierFlagsCache | $ | q), ie = D.updateModifiers(ie, B), R.push(ie) }, F, gu.PreserveOptionalFlags.Property, Y), R.length && (S = W, g ? x = C.printAndFormatSnippetList(131073, D.createNodeArray(R), w, g) : x = C.printSnippetList(131073, D.createNodeArray(R), w)), { insertText: x, isSnippet: v, importAdder: P, replacementSpan: S } } function xGe(e, t, r) { if (!e || Gs(t, r).line > Gs(t, e.getEnd()).line) return { modifiers: 0 }; let i = 0, o, s; return (s = AGe(e)) && (i |= gS(s), o = Du(e)), Na(e.parent) && (i |= im(e.parent.modifiers) & 126975, o = Du(e.parent)), { modifiers: i, span: o } } function AGe(e) { if (Ha(e)) return e.kind; if (Re(e)) { let t = nb(e); if (t && Rg(t)) return t } } function CGe(e, t, r, i, o, s, l, f) { let d = l.includeCompletionsWithSnippetText || void 0, g = t, m = r.getSourceFile(), v = IGe(e, r, m, i, o, l); if (!v) return; let S = NZ({ removeComments: !0, module: s.module, target: s.target, omitTrailingSemicolon: !1, newLine: XN(bb(o, f?.options)) }); f ? g = S.printAndFormatSnippetList(80, D.createNodeArray([v], !0), m, f) : g = S.printSnippetList(80, D.createNodeArray([v], !0), m); let x = nE({ removeComments: !0, module: s.module, target: s.target, omitTrailingSemicolon: !0 }), A = D.createMethodSignature(void 0, "", v.questionToken, v.typeParameters, v.parameters, v.type), w = { detail: x.printNode(4, A, m) }; return { isSnippet: d, insertText: g, labelDetails: w } } function IGe(e, t, r, i, o, s) { let l = e.getDeclarations(); if (!(l && l.length)) return; let f = i.getTypeChecker(), d = l[0], g = cc(sa(d), !1), m = f.getWidenedType(f.getTypeOfSymbolAtLocation(e, t)), S = 33554432 | (J_(r, s) === 0 ? 268435456 : 0); switch (d.kind) { case 168: case 169: case 170: case 171: { let x = m.flags & 1048576 && m.types.length < 10 ? f.getUnionType(m.types, 2) : m; if (x.flags & 1048576) { let F = Pr(x.types, B => f.getSignaturesOfType(B, 0).length > 0); if (F.length === 1) x = F[0]; else return } if (f.getSignaturesOfType(x, 0).length !== 1) return; let w = f.typeToTypeNode(x, t, S, gu.getNoopSymbolTrackerWithResolver({ program: i, host: o })); if (!w || !Jm(w)) return; let C; if (s.includeCompletionsWithSnippetText) { let F = D.createEmptyStatement(); C = D.createBlock([F], !0), Ez(F, { kind: 0, order: 0 }) } else C = D.createBlock([], !0); let P = w.parameters.map(F => D.createParameterDeclaration(void 0, F.dotDotDotToken, F.name, void 0, void 0, F.initializer)); return D.createMethodDeclaration(void 0, void 0, g, void 0, void 0, P, void 0, C) } default: return } } function NZ(e) { let t, r = nr.createWriter(db(e)), i = nE(e, r), o = { ...r, write: S => s(S, () => r.write(S)), nonEscapingWrite: r.write, writeLiteral: S => s(S, () => r.writeLiteral(S)), writeStringLiteral: S => s(S, () => r.writeStringLiteral(S)), writeSymbol: (S, x) => s(S, () => r.writeSymbol(S, x)), writeParameter: S => s(S, () => r.writeParameter(S)), writeComment: S => s(S, () => r.writeComment(S)), writeProperty: S => s(S, () => r.writeProperty(S)) }; return { printSnippetList: l, printAndFormatSnippetList: d, printNode: g, printAndFormatNode: v }; function s(S, x) { let A = OT(S); if (A !== S) { let w = r.getTextPos(); x(); let C = r.getTextPos(); t = Sn(t || (t = []), { newText: A, span: { start: w, length: C - w } }) } else x() } function l(S, x, A) { let w = f(S, x, A); return t ? nr.applyChanges(w, t) : w } function f(S, x, A) { return t = void 0, o.clear(), i.writeList(S, x, A, o), o.getText() } function d(S, x, A, w) { let C = { text: f(S, x, A), getLineAndCharacterOfPosition(q) { return Gs(this, q) } }, P = z7(w, A), F = Uo(x, q => { let W = nr.assignPositionsToNode(q); return tl.formatNodeGivenIndentation(W, C, A.languageVariant, 0, 0, { ...w, options: P }) }), B = t ? Ag(Qi(F, t), (q, W) => f8(q.span, W.span)) : F; return nr.applyChanges(C.text, B) } function g(S, x, A) { let w = m(S, x, A); return t ? nr.applyChanges(w, t) : w } function m(S, x, A) { return t = void 0, o.clear(), i.writeNode(S, x, A, o), o.getText() } function v(S, x, A, w) { let C = { text: m(S, x, A), getLineAndCharacterOfPosition(W) { return Gs(this, W) } }, P = z7(w, A), F = nr.assignPositionsToNode(x), B = tl.formatNodeGivenIndentation(F, C, A.languageVariant, 0, 0, { ...w, options: P }), q = t ? Ag(Qi(B, t), (W, Y) => f8(W.span, Y.span)) : B; return nr.applyChanges(C.text, q) } } function tTe(e) { let t = e.fileName ? void 0 : u_(e.moduleSymbol.name), r = e.isFromPackageJson ? !0 : void 0; return eC(e) ? { exportName: e.exportName, exportMapKey: e.exportMapKey, moduleSpecifier: e.moduleSpecifier, ambientModuleName: t, fileName: e.fileName, isPackageJsonImport: r } : { exportName: e.exportName, exportMapKey: e.exportMapKey, fileName: e.fileName, ambientModuleName: e.fileName ? void 0 : u_(e.moduleSymbol.name), isPackageJsonImport: e.isFromPackageJson ? !0 : void 0 } } function LGe(e, t, r) { let i = e.exportName === "default", o = !!e.isPackageJsonImport; return XEe(e) ? { kind: 32, exportName: e.exportName, exportMapKey: e.exportMapKey, moduleSpecifier: e.moduleSpecifier, symbolName: t, fileName: e.fileName, moduleSymbol: r, isDefaultExport: i, isFromPackageJson: o } : { kind: 4, exportName: e.exportName, exportMapKey: e.exportMapKey, symbolName: t, fileName: e.fileName, moduleSymbol: r, isDefaultExport: i, isFromPackageJson: o } } function kGe(e, t, r, i, o, s, l) { let f = t.replacementSpan, d = ck(o, l, OT(r.moduleSpecifier)), g = r.isDefaultExport ? 1 : r.exportName === "export=" ? 2 : 0, m = l.includeCompletionsWithSnippetText ? "$1" : "", v = gu.getImportKind(o, g, s, !0), S = t.couldBeTypeOnlyImportSpecifier, x = t.isTopLevelTypeOnly ? ` ${Xa(154)} ` : " ", A = S ? `${Xa(154)} ` : "", w = i ? ";" : ""; switch (v) { case 3: return { replacementSpan: f, insertText: `import${x}${OT(e)}${m} = require(${d})${w}` }; case 1: return { replacementSpan: f, insertText: `import${x}${OT(e)}${m} from ${d}${w}` }; case 2: return { replacementSpan: f, insertText: `import${x}* as ${OT(e)} from ${d}${w}` }; case 0: return { replacementSpan: f, insertText: `import${x}{ ${A}${OT(e)}${m} } from ${d}${w}` } } } function nTe(e, t, r) { return /^\d+$/.test(r) ? r : ck(e, t, r) } function DGe(e, t, r) { return e === t || !!(e.flags & 1048576) && r.getExportSymbolOfSymbol(e) === t } function PZ(e) { if (_P(e)) return u_(e.moduleSymbol.name); if (eC(e)) return e.moduleSpecifier; if (e?.kind === 1) return "ThisProperty/"; if (e?.kind === 64) return "TypeOnlyAlias/" } function MZ(e, t, r, i, o, s, l, f, d, g, m, v, S, x, A, w, C, P, F, B, q, W, Y, R, ie, $ = !1) { var fe; let Z = Ms(), U = $Ge(o), re = P7(l), le = d.getTypeChecker(), _e = new Map; for (let X = 0; X < e.length; X++) { let Ve = e[X], we = W?.[X], ke = Z9(Ve, g, we, v, !!P); if (!ke || _e.get(ke.name) && (!we || !KEe(we)) || v === 1 && Y && !ge(Ve, Y)) continue; let { name: Pe, needsConvertPropertyAccess: Ce } = ke, Ie = (fe = Y?.[$a(Ve)]) != null ? fe : Pl.LocationPriority, Be = ZGe(Ve, le) ? Pl.Deprecated(Ie) : Ie, Ne = TGe(Ve, Be, r, i, o, s, l, f, d, Pe, Ce, we, q, C, F, B, re, x, S, v, A, R, ie, $); if (!Ne) continue; let Le = (!we || JEe(we)) && !(Ve.parent === void 0 && !vt(Ve.declarations, Ye => Ye.getSourceFile() === o.getSourceFile())); _e.set(Pe, Le), Ny(t, Ne, pP, !0) } return m("getCompletionsAtPosition: getCompletionEntriesFromSymbols: " + (Ms() - Z)), { has: X => _e.has(X), add: X => _e.set(X, !0) }; function ge(X, Ve) { let we = X.flags; if (!Li(o)) { if (pc(o.parent)) return !0; if (U && X.valueDeclaration === U) return !1; let ke = wd(X, le); if (l.externalModuleIndicator && !x.allowUmdGlobalAccess && Ve[$a(X)] === Pl.GlobalsOrKeywords && (Ve[$a(ke)] === Pl.AutoImportSuggestions || Ve[$a(ke)] === Pl.LocationPriority)) return !1; if (we |= XI(ke), i7(o)) return !!(we & 1920); if (w) return VZ(X, le) } return !!(we & 111551) } } function wGe(e) { let t = RGe(e); if (t.length) return { isGlobalCompletion: !1, isMemberCompletion: !1, isNewIdentifierLocation: !1, entries: t } } function RGe(e) { let t = [], r = new Map, i = e; for (; i && !Ia(i);) { if (J0(i)) { let o = i.label.text; r.has(o) || (r.set(o, !0), t.push({ name: o, kindModifiers: "", kind: "label", sortText: Pl.LocationPriority })) } i = i.parent } return t } function rTe(e, t, r, i, o, s, l) { if (o.source === "SwitchCases/") return { type: "cases" }; if (o.data) { let B = aTe(o.name, o.data, e, s); if (B) { let { contextToken: q, previousToken: W } = Q9(i, r); return { type: "symbol", symbol: B.symbol, location: ef(r, i), previousToken: W, contextToken: q, isJsxInitializer: !1, isTypeOnlyLocation: !1, origin: B.origin } } } let f = e.getCompilerOptions(), d = iTe(e, t, r, f, i, { includeCompletionsForModuleExports: !0, includeCompletionsWithInsertText: !0 }, o, s, void 0); if (!d) return { type: "none" }; if (d.kind !== 0) return { type: "request", request: d }; let { symbols: g, literals: m, location: v, completionKind: S, symbolToOriginInfoMap: x, contextToken: A, previousToken: w, isJsxInitializer: C, isTypeOnlyLocation: P } = d, F = wr(m, B => OZ(r, l, B) === o.name); return F !== void 0 ? { type: "literal", literal: F } : ks(g, (B, q) => { let W = x[q], Y = Z9(B, Do(f), W, S, d.isJsxIdentifierExpected); return Y && Y.name === o.name && (o.source === "ClassMemberSnippet/" && B.flags & 106500 || o.source === "ObjectLiteralMethodSnippet/" && B.flags & 8196 || PZ(W) === o.source) ? { type: "symbol", symbol: B, location: v, origin: W, contextToken: A, previousToken: w, isJsxInitializer: C, isTypeOnlyLocation: P } : void 0 }) || { type: "none" } } function OGe(e, t, r, i, o, s, l, f, d) { let g = e.getTypeChecker(), m = e.getCompilerOptions(), { name: v, source: S, data: x } = o, { previousToken: A, contextToken: w } = Q9(i, r); if (n1(r, i, A)) return aG.getStringLiteralCompletionDetails(v, r, i, A, g, m, s, d, f); let C = rTe(e, t, r, i, o, s, f); switch (C.type) { case "request": { let { request: P } = C; switch (P.kind) { case 1: return xb.getJSDocTagNameCompletionDetails(v); case 2: return xb.getJSDocTagCompletionDetails(v); case 3: return xb.getJSDocParameterNameCompletionDetails(v); case 4: return vt(P.keywordCompletions, F => F.name === v) ? FZ(v, "keyword", 5) : void 0; default: return L.assertNever(P) } } case "symbol": { let { symbol: P, location: F, contextToken: B, origin: q, previousToken: W } = C, { codeActions: Y, sourceDisplay: R } = NGe(v, F, B, q, P, e, s, m, r, i, W, l, f, x, S, d), ie = wZ(q) ? q.symbolName : P.name; return GZ(P, ie, g, r, F, d, Y, R) } case "literal": { let { literal: P } = C; return FZ(OZ(r, f, P), "string", typeof P == "string" ? 8 : 7) } case "cases": { let { entry: P, importAdder: F } = ZEe(w.parent, r, f, e.getCompilerOptions(), s, e, void 0); if (F.hasFixes()) { let B = nr.ChangeTracker.with({ host: s, formatContext: l, preferences: f }, F.writeFixes); return { name: P.name, kind: "", kindModifiers: "", displayParts: [], sourceDisplay: void 0, codeActions: [{ changes: B, description: ZS([_.Includes_imports_of_types_referenced_by_0, v]) }] } } return { name: P.name, kind: "", kindModifiers: "", displayParts: [], sourceDisplay: void 0 } } case "none": return JZ().some(P => P.name === v) ? FZ(v, "keyword", 5) : void 0; default: L.assertNever(C) } } function FZ(e, t, r) { return mP(e, "", t, [Qu(e, r)]) } function GZ(e, t, r, i, o, s, l, f) { let { displayParts: d, documentation: g, symbolKind: m, tags: v } = r.runWithCancellationToken(s, S => $g.getSymbolDisplayPartsDocumentationAndSymbolKind(S, e, i, o, o, 7)); return mP(t, $g.getSymbolModifiers(r, e), m, d, g, v, l, f) } function mP(e, t, r, i, o, s, l, f) { return { name: e, kindModifiers: t, kind: r, displayParts: i, documentation: o, tags: s, codeActions: l, source: f, sourceDisplay: f } } function NGe(e, t, r, i, o, s, l, f, d, g, m, v, S, x, A, w) { if (x?.moduleSpecifier && m && _Te(r || m).replacementSpan) return { codeActions: void 0, sourceDisplay: [tf(x.moduleSpecifier)] }; if (A === "ClassMemberSnippet/") { let { importAdder: Y } = eTe(l, s, f, S, e, o, t, g, r, v); if (Y) return { sourceDisplay: void 0, codeActions: [{ changes: nr.ChangeTracker.with({ host: l, formatContext: v, preferences: S }, Y.writeFixes), description: ZS([_.Includes_imports_of_types_referenced_by_0, e]) }] } } if (JEe(i)) { let Y = gu.getPromoteTypeOnlyCompletionAction(d, i.declaration.name, s, l, v, S); return L.assertIsDefined(Y, "Expected to have a code action for promoting type-only alias"), { codeActions: [Y], sourceDisplay: void 0 } } if (!i || !(_P(i) || eC(i))) return { codeActions: void 0, sourceDisplay: void 0 }; let C = i.isFromPackageJson ? l.getPackageJsonAutoImportProvider().getTypeChecker() : s.getTypeChecker(), { moduleSymbol: P } = i, F = C.getMergedSymbol(wd(o.exportSymbol || o, C)), B = r?.kind === 29 && Au(r.parent), { moduleSpecifier: q, codeAction: W } = gu.getImportCompletionAction(F, P, x?.exportMapKey, d, e, B, l, s, v, m && Re(m) ? m.getStart(d) : g, S, w); return L.assert(!x?.moduleSpecifier || q === x.moduleSpecifier), { sourceDisplay: [tf(q)], codeActions: [W] } } function PGe(e, t, r, i, o, s, l) { let f = rTe(e, t, r, i, o, s, l); return f.type === "symbol" ? f.symbol : void 0 } function MGe(e, t, r) { return ks(t && (t.isUnion() ? t.types : [t]), i => { let o = i && i.symbol; return o && o.flags & 424 && !cle(o) ? BZ(o, e, r) : void 0 }) } function FGe(e, t, r, i) { let { parent: o } = e; switch (e.kind) { case 79: return w7(e, i); case 63: switch (o.kind) { case 257: return i.getContextualType(o.initializer); case 223: return i.getTypeAtLocation(o.left); case 288: return i.getContextualTypeForJsxAttribute(o); default: return }case 103: return i.getContextualType(o); case 82: let s = zr(o, CL); return s ? TY(s, i) : void 0; case 18: return AL(o) && !Hg(o.parent) && !BS(o.parent) ? i.getContextualTypeForJsxAttribute(o.parent) : void 0; default: let l = BP.getArgumentInfoForCompletions(e, t, r); return l ? i.getContextualTypeForArgumentAtIndex(l.invocation, l.argumentIndex + (e.kind === 27 ? 1 : 0)) : R7(e.kind) && ar(o) && R7(o.operatorToken.kind) ? i.getTypeAtLocation(o.left) : i.getContextualType(e) } } function BZ(e, t, r) { let i = r.getAccessibleSymbolChain(e, t, 67108863, !1); return i ? Vo(i) : e.parent && (GGe(e.parent) ? e : BZ(e.parent, t, r)) } function GGe(e) { var t; return !!((t = e.declarations) != null && t.some(r => r.kind === 308)) } function iTe(e, t, r, i, o, s, l, f, d, g) { let m = e.getTypeChecker(), v = QEe(r, i), S = Ms(), x = Vi(r, o); t("getCompletionData: Get current token: " + (Ms() - S)), S = Ms(); let A = Kg(r, o, x); t("getCompletionData: Is inside comment: " + (Ms() - S)); let w = !1, C = !1; if (A) { if (Rhe(r, o)) { if (r.text.charCodeAt(o - 1) === 64) return { kind: 1 }; { let Te = Wf(o, r); if (!/[^\*|\s(/)]/.test(r.text.substring(Te, o))) return { kind: 2 } } } let z = jGe(x, o); if (z) { if (z.tagName.pos <= o && o <= z.tagName.end) return { kind: 1 }; let Te = zt(z); if (Te && (x = Vi(r, o), (!x || !Rh(x) && (x.parent.kind !== 351 || x.parent.name !== x)) && (w = pe(Te))), !w && xp(z) && (rc(z.name) || z.name.pos <= o && o <= z.name.end)) return { kind: 3, tag: z } } if (!w) { t("Returning an empty list because completion was inside a regular comment or plain text part of a JsDoc comment."); return } } S = Ms(); let P = !w && Cu(r), F = Q9(o, r), B = F.previousToken, q = F.contextToken; t("getCompletionData: Get previous token: " + (Ms() - S)); let W = x, Y, R = !1, ie = !1, $ = !1, fe = !1, Z = !1, U = !1, re, le = ef(r, o), _e = 0, ge = !1, X = 0; if (q) { let z = _Te(q); if (z.keywordCompletion) { if (z.isKeywordOnlyCompletion) return { kind: 4, keywordCompletions: [pGe(z.keywordCompletion)], isNewIdentifierLocation: z.isNewIdentifierLocation }; _e = hGe(z.keywordCompletion) } if (z.replacementSpan && s.includeCompletionsForImportStatements && s.includeCompletionsWithInsertText && (X |= 2, re = z, ge = z.isNewIdentifierLocation), !z.replacementSpan && Ht(q)) return t("Returning an empty list because completion was requested in an invalid position."), _e ? YEe(_e, P, dr()) : void 0; let Te = q.parent; if (q.kind === 24 || q.kind === 28) switch (R = q.kind === 24, ie = q.kind === 28, Te.kind) { case 208: Y = Te, W = Y.expression; let j = $I(Y); if (rc(j) || (Pa(W) || Ia(W)) && W.end === q.pos && W.getChildCount(r) && To(W.getChildren(r)).kind !== 21) return; break; case 163: W = Te.left; break; case 264: W = Te.name; break; case 202: W = Te; break; case 233: W = Te.getFirstToken(r), L.assert(W.kind === 100 || W.kind === 103); break; default: return } else if (!re) { if (Te && Te.kind === 208 && (q = Te, Te = Te.parent), x.parent === le) switch (x.kind) { case 31: (x.parent.kind === 281 || x.parent.kind === 283) && (le = x); break; case 43: x.parent.kind === 282 && (le = x); break }switch (Te.kind) { case 284: q.kind === 43 && (fe = !0, le = q); break; case 223: if (!fTe(Te)) break; case 282: case 281: case 283: U = !0, q.kind === 29 && ($ = !0, le = q); break; case 291: case 290: (B.kind === 19 || B.kind === 79 && B.parent.kind === 288) && (U = !0); break; case 288: if (Te.initializer === B && B.end < o) { U = !0; break } switch (B.kind) { case 63: Z = !0; break; case 79: U = !0, Te !== B.parent && !Te.initializer && Yo(Te, 63, r) && (Z = B) }break } } } let Ve = Ms(), we = 5, ke = !1, Pe = !1, Ce = [], Ie, Be = [], Ne = [], Le = new Map, Ye = nn(), _t = Jp(z => $S(z ? f.getPackageJsonAutoImportProvider() : e, f)); if (R || ie) Qt(); else if ($) Ce = m.getJsxIntrinsicTagNamesAt(le), L.assertEachIsDefined(Ce, "getJsxIntrinsicTagNames() should all be defined"), Gt(), we = 1, _e = 0; else if (fe) { let z = q.parent.parent.openingElement.tagName, Te = m.getSymbolAtLocation(z); Te && (Ce = [Te]), we = 1, _e = 0 } else if (!Gt()) return _e ? YEe(_e, P, ge) : void 0; t("getCompletionData: Semantic work: " + (Ms() - Ve)); let ct = B && FGe(B, o, r, m), Rt = Zi(ct && (ct.isUnion() ? ct.types : [ct]), z => z.isLiteral() && !(z.flags & 1024) ? z.value : void 0), We = B && ct && MGe(B, ct, m); return { kind: 0, symbols: Ce, completionKind: we, isInSnippetScope: C, propertyAccessToConvert: Y, isNewIdentifierLocation: ge, location: le, keywordFilters: _e, literals: Rt, symbolToOriginInfoMap: Be, recommendedCompletion: We, previousToken: B, contextToken: q, isJsxInitializer: Z, insideJsDocTagTypeExpression: w, symbolToSortTextMap: Ne, isTypeOnlyLocation: Ye, isJsxIdentifierExpected: U, isRightOfOpenTag: $, isRightOfDotOrQuestionDot: R || ie, importStatementCompletion: re, hasUnresolvedAutoImports: Pe, flags: X }; function qe(z) { switch (z.kind) { case 344: case 351: case 345: case 347: case 349: case 352: case 353: return !0; case 348: return !!z.constraint; default: return !1 } } function zt(z) { if (qe(z)) { let Te = H_(z) ? z.constraint : z.typeExpression; return Te && Te.kind === 312 ? Te : void 0 } if (x2(z) || qz(z)) return z.class } function Qt() { we = 2; let z = ib(W), Te = w || z && !W.isTypeOf || Gm(W.parent) || MN(q, r, m), j = i7(W); if (Cd(W) || z || br(W)) { let yt = Tc(W.parent); yt && (ge = !0); let lt = m.getSymbolAtLocation(W); if (lt && (lt = wd(lt, m), lt.flags & 1920)) { let Qe = m.getExportsOfModule(lt); L.assertEachIsDefined(Qe, "getExportsOfModule() should all be defined"); let Vt = ei => m.isValidPropertyAccess(z ? W : W.parent, ei.name), Hn = ei => VZ(ei, m), jr = yt ? ei => { var Kr; return !!(ei.flags & 1920) && !((Kr = ei.declarations) != null && Kr.every(Si => Si.parent === W.parent)) } : j ? ei => Hn(ei) || Vt(ei) : Te ? Hn : Vt; for (let ei of Qe) jr(ei) && Ce.push(ei); if (!Te && lt.declarations && lt.declarations.some(ei => ei.kind !== 308 && ei.kind !== 264 && ei.kind !== 263)) { let ei = m.getTypeOfSymbolAtLocation(lt, W).getNonOptionalType(), Kr = !1; if (ei.isNullableType()) { let Si = R && !ie && s.includeAutomaticOptionalChainCompletions !== !1; (Si || ie) && (ei = ei.getNonNullableType(), Si && (Kr = !0)) } tn(ei, !!(W.flags & 32768), Kr) } return } } if (!Te) { m.tryGetThisTypeAt(W, !1); let yt = m.getTypeAtLocation(W).getNonOptionalType(), lt = !1; if (yt.isNullableType()) { let Qe = R && !ie && s.includeAutomaticOptionalChainCompletions !== !1; (Qe || ie) && (yt = yt.getNonNullableType(), Qe && (lt = !0)) } tn(yt, !!(W.flags & 32768), lt) } } function tn(z, Te, j) { ge = !!z.getStringIndexType(), ie && vt(z.getCallSignatures()) && (ge = !0); let yt = W.kind === 202 ? W : W.parent; if (v) for (let lt of z.getApparentProperties()) m.isValidPropertyAccessForCompletions(yt, z, lt) && kn(lt, !1, j); else Ce.push(...Pr(nG(z, m), lt => m.isValidPropertyAccessForCompletions(yt, z, lt))); if (Te && s.includeCompletionsWithInsertText) { let lt = m.getPromisedTypeOfPromise(z); if (lt) for (let Qe of lt.getApparentProperties()) m.isValidPropertyAccessForCompletions(yt, lt, Qe) && kn(Qe, !0, j) } } function kn(z, Te, j) { var yt; let lt = ks(z.declarations, jr => zr(sa(jr), ts)); if (lt) { let jr = _n(lt.expression), ei = jr && m.getSymbolAtLocation(jr), Kr = ei && BZ(ei, q, m); if (Kr && V_(Le, $a(Kr))) { let Si = Ce.length; Ce.push(Kr); let Ja = Kr.parent; if (!Ja || !BN(Ja) || m.tryGetMemberInModuleExportsAndProperties(Kr.name, Ja) !== Kr) Be[Si] = { kind: Hn(2) }; else { let Za = fl(u_(Ja.name)) ? (yt = m6(Ja)) == null ? void 0 : yt.fileName : void 0, { moduleSpecifier: Fa } = (Ie || (Ie = gu.createImportSpecifierResolver(r, e, f, s))).getModuleSpecifierForBestExportInfo([{ exportKind: 0, moduleFileName: Za, isFromPackageJson: !1, moduleSymbol: Ja, symbol: Kr, targetFlags: wd(Kr, m).flags }], o, TS(le)) || {}; if (Fa) { let Hi = { kind: Hn(6), moduleSymbol: Ja, isDefaultExport: !1, symbolName: Kr.name, exportName: Kr.name, fileName: Za, moduleSpecifier: Fa }; Be[Si] = Hi } } } else s.includeCompletionsWithInsertText && (Vt(z), Qe(z), Ce.push(z)) } else Vt(z), Qe(z), Ce.push(z); function Qe(jr) { qGe(jr) && (Ne[$a(jr)] = Pl.LocalDeclarationPriority) } function Vt(jr) { s.includeCompletionsWithInsertText && (Te && V_(Le, $a(jr)) ? Be[Ce.length] = { kind: Hn(8) } : j && (Be[Ce.length] = { kind: 16 })) } function Hn(jr) { return j ? jr | 16 : jr } } function _n(z) { return Re(z) ? z : br(z) ? _n(z.expression) : void 0 } function Gt() { return (Se() || at() || Ni() || Tt() || ve() || $n() || nt() || ui() || (Pi(), 1)) === 1 } function $n() { return Q(q) ? (we = 5, ge = !0, _e = 4, 1) : 0 } function ui() { let z = G(q), Te = z && m.getContextualType(z.attributes); if (!Te) return 0; let j = z && m.getContextualType(z.attributes, 4); return Ce = Qi(Ce, oe(tG(Te, j, z.attributes, m), z.attributes.properties)), ae(), we = 3, ge = !1, 1 } function Ni() { return re ? (ge = !0, An(), 1) : 0 } function Pi() { _e = ue(q) ? 5 : 1, we = 1, ge = dr(), B !== q && L.assert(!!B, "Expected 'contextToken' to be defined when different from 'previousToken'."); let z = B !== q ? B.getStart() : o, Te = vn(q, z, r) || r; C = pt(Te); let j = (Ye ? 0 : 111551) | 788968 | 1920 | 2097152, yt = B && !TS(B); Ce = Qi(Ce, m.getSymbolsInScope(Te, j)), L.assertEachIsDefined(Ce, "getSymbolsInScope() should all be defined"); for (let lt = 0; lt < Ce.length; lt++) { let Qe = Ce[lt]; if (!m.isArgumentsSymbol(Qe) && !vt(Qe.declarations, Vt => Vt.getSourceFile() === r) && (Ne[$a(Qe)] = Pl.GlobalsOrKeywords), yt && !(Qe.flags & 111551)) { let Vt = Qe.declarations && wr(Qe.declarations, Mj); if (Vt) { let Hn = { kind: 64, declaration: Vt }; Be[lt] = Hn } } } if (s.includeCompletionsWithInsertText && Te.kind !== 308) { let lt = m.tryGetThisTypeAt(Te, !1, Yr(Te.parent) ? Te : void 0); if (lt && !KGe(lt, r, m)) for (let Qe of nG(lt, m)) Be[Ce.length] = { kind: 1 }, Ce.push(Qe), Ne[$a(Qe)] = Pl.SuggestedClassMembers } An(), Ye && (_e = q && pT(q.parent) ? 6 : 7) } function gr() { return re ? !0 : ke || !s.includeCompletionsForModuleExports ? !1 : r.externalModuleIndicator || r.commonJsModuleIndicator || aY(e.getCompilerOptions()) ? !0 : Uhe(e) } function pt(z) { switch (z.kind) { case 308: case 225: case 291: case 238: return !0; default: return ca(z) } } function nn() { return w || !!re && I0(le.parent) || !Dt(q) && (MN(q, r, m) || Gm(le) || pn(q)) } function Dt(z) { return z && (z.kind === 112 && (z.parent.kind === 183 || y2(z.parent)) || z.kind === 129 && z.parent.kind === 179) } function pn(z) { if (z) { let Te = z.parent.kind; switch (z.kind) { case 58: return Te === 169 || Te === 168 || Te === 166 || Te === 257 || nS(Te); case 63: return Te === 262; case 128: return Te === 231; case 29: return Te === 180 || Te === 213; case 94: return Te === 165; case 150: return Te === 235 } } return !1 } function An() { var z, Te; if (!gr() || (L.assert(!l?.data, "Should not run 'collectAutoImports' when faster path is available via `data`"), l && !l.source)) return; X |= 1; let yt = B === q && re ? "" : B && Re(B) ? B.text.toLowerCase() : "", lt = (z = f.getModuleSpecifierCache) == null ? void 0 : z.call(f), Qe = YN(r, f, e, s, g), Vt = (Te = f.getPackageJsonAutoImportProvider) == null ? void 0 : Te.call(f), Hn = l ? void 0 : uk(r, s, f); qEe("collectAutoImports", f, Ie || (Ie = gu.createImportSpecifierResolver(r, e, f, s)), e, o, s, !!re, TS(le), ei => { Qe.search(r.path, $, (Kr, Si) => { if (!i_(Kr, Do(f.getCompilationSettings())) || !l && fS(Kr) || !Ye && !re && !(Si & 111551) || Ye && !(Si & 790504)) return !1; let Ja = Kr.charCodeAt(0); return $ && (Ja < 65 || Ja > 90) ? !1 : l ? !0 : gTe(Kr, yt) }, (Kr, Si, Ja, Za) => { if (l && !vt(Kr, Qr => l.source === u_(Qr.moduleSymbol.name)) || (Kr = Pr(Kr, jr), !Kr.length)) return; let Fa = ei.tryResolve(Kr, Ja) || {}; if (Fa === "failed") return; let Hi = Kr[0], xi; Fa !== "skipped" && ({ exportInfo: Hi = Kr[0], moduleSpecifier: xi } = Fa); let Nr = Hi.exportKind === 1, Fo = Nr && QA(Hi.symbol) || Hi.symbol; Kn(Fo, { kind: xi ? 32 : 4, moduleSpecifier: xi, symbolName: Si, exportMapKey: Za, exportName: Hi.exportKind === 2 ? "export=" : Hi.symbol.name, fileName: Hi.moduleFileName, isDefaultExport: Nr, moduleSymbol: Hi.moduleSymbol, isFromPackageJson: Hi.isFromPackageJson }) }), Pe = ei.skippedAny(), X |= ei.resolvedAny() ? 8 : 0, X |= ei.resolvedBeyondLimit() ? 16 : 0 }); function jr(ei) { let Kr = zr(ei.moduleSymbol.valueDeclaration, Li); if (!Kr) { let Si = u_(ei.moduleSymbol.name); return QT.nodeCoreModules.has(Si) && na(Si, "node:") !== W7(r, e) ? !1 : Hn ? Hn.allowsImportingAmbientModule(ei.moduleSymbol, _t(ei.isFromPackageJson)) : !0 } return PY(ei.isFromPackageJson ? Vt : e, r, Kr, s, Hn, _t(ei.isFromPackageJson), lt) } } function Kn(z, Te) { let j = $a(z); Ne[j] !== Pl.GlobalsOrKeywords && (Be[Ce.length] = Te, Ne[j] = re ? Pl.LocationPriority : Pl.AutoImportSuggestions, Ce.push(z)) } function hi(z, Te) { Yn(le) || z.forEach(j => { if (!ri(j)) return; let yt = Z9(j, Do(i), void 0, 0, !1); if (!yt) return; let { name: lt } = yt, Qe = CGe(j, lt, Te, e, f, i, s, d); if (!Qe) return; let Vt = { kind: 128, ...Qe }; X |= 32, Be[Ce.length] = Vt, Ce.push(j) }) } function ri(z) { return !!(z.flags & 8196) } function vn(z, Te, j) { let yt = z; for (; yt && !WX(yt, Te, j);)yt = yt.parent; return yt } function Ht(z) { let Te = Ms(), j = Cr(z) || Oe(z) || kt(z) || En(z) || a3(z); return t("getCompletionsAtPosition: isCompletionListBlocker: " + (Ms() - Te)), j } function En(z) { if (z.kind === 11) return !0; if (z.kind === 31 && z.parent) { if (le === z.parent && (le.kind === 283 || le.kind === 282)) return !1; if (z.parent.kind === 283) return le.parent.kind !== 283; if (z.parent.kind === 284 || z.parent.kind === 282) return !!z.parent.parent && z.parent.parent.kind === 281 } return !1 } function dr() { if (q) { let z = q.parent.kind, Te = eG(q); switch (Te) { case 27: return z === 210 || z === 173 || z === 211 || z === 206 || z === 223 || z === 181 || z === 207; case 20: return z === 210 || z === 173 || z === 211 || z === 214 || z === 193; case 22: return z === 206 || z === 178 || z === 164; case 142: case 143: case 100: return !0; case 24: return z === 264; case 18: return z === 260 || z === 207; case 63: return z === 257 || z === 223; case 15: return z === 225; case 16: return z === 236; case 132: return z === 171 || z === 300; case 41: return z === 171 }if (hP(Te)) return !0 } return !1 } function Cr(z) { return (Cz(z) || Fj(z)) && (RN(z, o) || o === z.end && (!!z.isUnterminated || Cz(z))) } function Se() { let z = zGe(q); if (!z) return 0; let j = (dO(z.parent) ? z.parent : void 0) || z, yt = dTe(j, m); if (!yt) return 0; let lt = m.getTypeFromTypeNode(j), Qe = nG(yt, m), Vt = nG(lt, m), Hn = new Set; return Vt.forEach(jr => Hn.add(jr.escapedName)), Ce = Qi(Ce, Pr(Qe, jr => !Hn.has(jr.escapedName))), we = 0, ge = !0, 1 } function at() { let z = Ce.length, Te = BGe(q); if (!Te) return 0; we = 0; let j, yt; if (Te.kind === 207) { let lt = XGe(Te, m); if (lt === void 0) return Te.flags & 33554432 ? 2 : (ke = !0, 0); let Qe = m.getContextualType(Te, 4), Vt = (Qe || lt).getStringIndexType(), Hn = (Qe || lt).getNumberIndexType(); if (ge = !!Vt || !!Hn, j = tG(lt, Qe, Te, m), yt = Te.properties, j.length === 0 && !Hn) return ke = !0, 0 } else { L.assert(Te.kind === 203), ge = !1; let lt = nm(Te.parent); if (!PA(lt)) return L.fail("Root declaration is not variable-like."); let Qe = Jy(lt) || !!Cl(lt) || lt.parent.parent.kind === 247; if (!Qe && lt.kind === 166 && (ot(lt.parent) ? Qe = !!m.getContextualType(lt.parent) : (lt.parent.kind === 171 || lt.parent.kind === 175) && (Qe = ot(lt.parent.parent) && !!m.getContextualType(lt.parent.parent))), Qe) { let Vt = m.getTypeAtLocation(Te); if (!Vt) return 2; j = m.getPropertiesOfType(Vt).filter(Hn => m.isPropertyAccessible(Te, !1, !1, Vt, Hn)), yt = Te.elements } } if (j && j.length > 0) { let lt = ln(j, L.checkDefined(yt)); Ce = Qi(Ce, lt), ae(), Te.kind === 207 && s.includeCompletionsWithObjectLiteralMethodSnippets && s.includeCompletionsWithInsertText && (Ot(z), hi(lt, Te)) } return 1 } function Tt() { if (!q) return 0; let z = q.kind === 18 || q.kind === 27 ? zr(q.parent, bW) : b7(q) ? zr(q.parent.parent, bW) : void 0; if (!z) return 0; b7(q) || (_e = 8); let { moduleSpecifier: Te } = z.kind === 272 ? z.parent.parent : z.parent; if (!Te) return ge = !0, z.kind === 272 ? 2 : 0; let j = m.getSymbolAtLocation(Te); if (!j) return ge = !0, 2; we = 3, ge = !1; let yt = m.getExportsAndPropertiesOfModule(j), lt = new Set(z.elements.filter(Vt => !pe(Vt)).map(Vt => (Vt.propertyName || Vt.name).escapedText)), Qe = yt.filter(Vt => Vt.escapedName !== "default" && !lt.has(Vt.escapedName)); return Ce = Qi(Ce, Qe), Qe.length || (_e = 0), 1 } function ve() { var z; let Te = q && (q.kind === 18 || q.kind === 27) ? zr(q.parent, h_) : void 0; if (!Te) return 0; let j = jn(Te, Kp(Li, Tc)); return we = 5, ge = !1, (z = j.locals) == null || z.forEach((yt, lt) => { var Qe, Vt; Ce.push(yt), (Vt = (Qe = j.symbol) == null ? void 0 : Qe.exports) != null && Vt.has(lt) && (Ne[$a(yt)] = Pl.OptionalMember) }), 1 } function nt() { let z = WGe(r, q, le, o); if (!z) return 0; if (we = 3, ge = !0, _e = q.kind === 41 ? 0 : Yr(z) ? 2 : 3, !Yr(z)) return 1; let Te = q.kind === 26 ? q.parent.parent : q.parent, j = _l(Te) ? uu(Te) : 0; if (q.kind === 79 && !pe(q)) switch (q.getText()) { case "private": j = j | 8; break; case "static": j = j | 32; break; case "override": j = j | 16384; break }if (oc(Te) && (j |= 32), !(j & 8)) { let yt = Yr(z) && j & 16384 ? aT(hp(z)) : NI(z), lt = Uo(yt, Qe => { let Vt = m.getTypeAtLocation(Qe); return j & 32 ? Vt?.symbol && m.getPropertiesOfType(m.getTypeOfSymbolAtLocation(Vt.symbol, z)) : Vt && m.getPropertiesOfType(Vt) }); Ce = Qi(Ce, Ke(lt, z.members, j)), mn(Ce, (Qe, Vt) => { let Hn = Qe?.valueDeclaration; if (Hn && _l(Hn) && Hn.name && ts(Hn.name)) { let jr = { kind: 512, symbolName: m.symbolToString(Qe) }; Be[Vt] = jr } }) } return 1 } function ce(z) { return !!z.parent && ha(z.parent) && Ec(z.parent.parent) && (yI(z.kind) || Rh(z)) } function Q(z) { if (z) { let Te = z.parent; switch (z.kind) { case 20: case 27: return Ec(z.parent) ? z.parent : void 0; default: if (ce(z)) return Te.parent } } } function ue(z) { if (z) { let Te, j = jn(z.parent, yt => Yr(yt) ? "quit" : Ds(yt) && Te === yt.body ? !0 : (Te = yt, !1)); return j && j } } function G(z) { if (z) { let Te = z.parent; switch (z.kind) { case 31: case 30: case 43: case 79: case 208: case 289: case 288: case 290: if (Te && (Te.kind === 282 || Te.kind === 283)) { if (z.kind === 31) { let j = el(z.pos, r, void 0); if (!Te.typeArguments || j && j.kind === 43) break } return Te } else if (Te.kind === 288) return Te.parent.parent; break; case 10: if (Te && (Te.kind === 288 || Te.kind === 290)) return Te.parent.parent; break; case 19: if (Te && Te.kind === 291 && Te.parent && Te.parent.kind === 288) return Te.parent.parent.parent; if (Te && Te.kind === 290) return Te.parent.parent; break } } } function Oe(z) { let Te = z.parent, j = Te.kind; switch (z.kind) { case 27: return j === 257 || Kt(z) || j === 240 || j === 263 || Ge(j) || j === 261 || j === 204 || j === 262 || Yr(Te) && !!Te.typeParameters && Te.typeParameters.end >= z.pos; case 24: return j === 204; case 58: return j === 205; case 22: return j === 204; case 20: return j === 295 || Ge(j); case 18: return j === 263; case 29: return j === 260 || j === 228 || j === 261 || j === 262 || nS(j); case 124: return j === 169 && !Yr(Te.parent); case 25: return j === 166 || !!Te.parent && Te.parent.kind === 204; case 123: case 121: case 122: return j === 166 && !Ec(Te.parent); case 128: return j === 273 || j === 278 || j === 271; case 137: case 151: return !rG(z); case 79: if (j === 273 && z === Te.name && z.text === "type") return !1; break; case 84: case 92: case 118: case 98: case 113: case 100: case 119: case 85: case 138: return !0; case 154: return j !== 273; case 41: return Ia(z.parent) && !Nc(z.parent) }if (hP(eG(z)) && rG(z) || ce(z) && (!Re(z) || yI(eG(z)) || pe(z))) return !1; switch (eG(z)) { case 126: case 84: case 85: case 136: case 92: case 98: case 118: case 119: case 121: case 122: case 123: case 124: case 113: return !0; case 132: return Na(z.parent) }if (jn(z.parent, Yr) && z === B && je(z, o)) return !1; let lt = cb(z.parent, 169); if (lt && z !== B && Yr(B.parent.parent) && o <= B.end) { if (je(z, B.end)) return !1; if (z.kind !== 63 && (sN(lt) || f6(lt))) return !0 } return Rh(z) && !xf(z.parent) && !Sp(z.parent) && !(Yr(z.parent) && (z !== B || o > B.end)) } function je(z, Te) { return z.kind !== 63 && (z.kind === 26 || !Bf(z.end, Te, r)) } function Ge(z) { return nS(z) && z !== 173 } function kt(z) { if (z.kind === 8) { let Te = z.getFullText(); return Te.charAt(Te.length - 1) === "." } return !1 } function Kt(z) { return z.parent.kind === 258 && !MN(z, r, m) } function ln(z, Te) { if (Te.length === 0) return z; let j = new Set, yt = new Set; for (let Qe of Te) { if (Qe.kind !== 299 && Qe.kind !== 300 && Qe.kind !== 205 && Qe.kind !== 171 && Qe.kind !== 174 && Qe.kind !== 175 && Qe.kind !== 301 || pe(Qe)) continue; let Vt; if (VS(Qe)) ir(Qe, j); else if (Wo(Qe) && Qe.propertyName) Qe.propertyName.kind === 79 && (Vt = Qe.propertyName.escapedText); else { let Hn = sa(Qe); Vt = Hn && c_(Hn) ? MI(Hn) : void 0 } Vt !== void 0 && yt.add(Vt) } let lt = z.filter(Qe => !yt.has(Qe.escapedName)); return rt(j, lt), lt } function ir(z, Te) { let j = z.expression, yt = m.getSymbolAtLocation(j), lt = yt && m.getTypeOfSymbolAtLocation(yt, j), Qe = lt && lt.properties; Qe && Qe.forEach(Vt => { Te.add(Vt.name) }) } function ae() { Ce.forEach(z => { var Te; if (z.flags & 16777216) { let j = $a(z); Ne[j] = (Te = Ne[j]) != null ? Te : Pl.OptionalMember } }) } function rt(z, Te) { if (z.size !== 0) for (let j of Te) z.has(j.name) && (Ne[$a(j)] = Pl.MemberDeclaredBySpreadAssignment) } function Ot(z) { var Te; for (let j = z; j < Ce.length; j++) { let yt = Ce[j], lt = $a(yt), Qe = Be?.[j], Vt = Do(i), Hn = Z9(yt, Vt, Qe, 0, !1); if (Hn) { let jr = (Te = Ne[lt]) != null ? Te : Pl.LocationPriority, { name: ei } = Hn; Ne[lt] = Pl.ObjectLiteralProperty(jr, ei) } } } function Ke(z, Te, j) { let yt = new Set; for (let lt of Te) { if (lt.kind !== 169 && lt.kind !== 171 && lt.kind !== 174 && lt.kind !== 175 || pe(lt) || cd(lt, 8) || Ca(lt) !== !!(j & 32)) continue; let Qe = M0(lt.name); Qe && yt.add(Qe) } return z.filter(lt => !yt.has(lt.escapedName) && !!lt.declarations && !(Ef(lt) & 8) && !(lt.valueDeclaration && xu(lt.valueDeclaration))) } function oe(z, Te) { let j = new Set, yt = new Set; for (let Qe of Te) pe(Qe) || (Qe.kind === 288 ? j.add(Qe.name.escapedText) : GT(Qe) && ir(Qe, yt)); let lt = z.filter(Qe => !j.has(Qe.escapedName)); return rt(yt, lt), lt } function pe(z) { return z.getStart(r) <= o && o <= z.getEnd() } } function BGe(e) { if (e) { let { parent: t } = e; switch (e.kind) { case 18: case 27: if (rs(t) || cm(t)) return t; break; case 41: return Nc(t) ? zr(t.parent, rs) : void 0; case 79: return e.text === "async" && xf(e.parent) ? e.parent.parent : void 0 } } } function Q9(e, t) { let r = el(e, t); return r && e <= r.end && (Ah(r) || Xu(r.kind)) ? { contextToken: el(r.getFullStart(), t, void 0), previousToken: r } : { contextToken: r, previousToken: r } } function aTe(e, t, r, i) { let o = t.isPackageJsonImport ? i.getPackageJsonAutoImportProvider() : r, s = o.getTypeChecker(), l = t.ambientModuleName ? s.tryFindAmbientModule(t.ambientModuleName) : t.fileName ? s.getMergedSymbol(L.checkDefined(o.getSourceFile(t.fileName)).symbol) : void 0; if (!l) return; let f = t.exportName === "export=" ? s.resolveExternalModuleSymbol(l) : s.tryGetMemberInModuleExportsAndProperties(t.exportName, l); return f ? (f = t.exportName === "default" && QA(f) || f, { symbol: f, origin: LGe(t, e, l) }) : void 0 } function Z9(e, t, r, i, o) { if (dGe(r)) return; let s = sGe(r) ? r.symbolName : e.name; if (s === void 0 || e.flags & 1536 && Xw(s.charCodeAt(0)) || gR(e)) return; let l = { name: s, needsConvertPropertyAccess: !1 }; if (i_(s, t, o ? 1 : 0) || e.valueDeclaration && xu(e.valueDeclaration)) return l; switch (i) { case 3: return wZ(r) ? { name: r.symbolName, needsConvertPropertyAccess: !1 } : void 0; case 0: return { name: JSON.stringify(s), needsConvertPropertyAccess: !1 }; case 2: case 1: return s.charCodeAt(0) === 32 ? void 0 : { name: s, needsConvertPropertyAccess: !0 }; case 5: case 4: return l; default: L.assertNever(i) } } function oTe(e, t) { if (!t) return sTe(e); let r = e + 8 + 1; return gP[r] || (gP[r] = sTe(e).filter(i => !UGe(lT(i.name)))) } function sTe(e) { return gP[e] || (gP[e] = JZ().filter(t => { let r = lT(t.name); switch (e) { case 0: return !1; case 1: return lTe(r) || r === 136 || r === 142 || r === 154 || r === 143 || r === 126 || ik(r) && r !== 155; case 5: return lTe(r); case 2: return hP(r); case 3: return cTe(r); case 4: return yI(r); case 6: return ik(r) || r === 85; case 7: return ik(r); case 8: return r === 154; default: return L.assertNever(e) } })) } function UGe(e) { switch (e) { case 126: case 131: case 160: case 134: case 136: case 92: case 159: case 117: case 138: case 118: case 140: case 141: case 142: case 143: case 144: case 148: case 149: case 161: case 121: case 122: case 123: case 146: case 152: case 153: case 154: case 156: case 157: return !0; default: return !1 } } function cTe(e) { return e === 146 } function hP(e) { switch (e) { case 126: case 127: case 135: case 137: case 151: case 132: case 136: case 161: return !0; default: return Gj(e) } } function lTe(e) { return e === 132 || e === 133 || e === 128 || e === 150 || e === 154 || !K6(e) && !hP(e) } function eG(e) { var t; return Re(e) ? (t = nb(e)) != null ? t : 0 : e.kind } function VGe(e, t) { let r = []; if (e) { let i = e.getSourceFile(), o = e.parent, s = i.getLineAndCharacterOfPosition(e.end).line, l = i.getLineAndCharacterOfPosition(t).line; (gl(o) || Il(o) && o.moduleSpecifier) && e === o.moduleSpecifier && s === l && r.push({ name: Xa(130), kind: "keyword", kindModifiers: "", sortText: Pl.GlobalsOrKeywords }) } return r } function jGe(e, t) { return jn(e, r => EI(r) && wN(r, t) ? !0 : dm(r) ? "quit" : !1) } function tG(e, t, r, i) { let o = t && t !== e, s = o && !(t.flags & 3) ? i.getUnionType([e, t]) : e, l = HGe(s, r, i); return s.isClass() && uTe(l) ? [] : o ? Pr(l, f) : l; function f(d) { return Fn(d.declarations) ? vt(d.declarations, g => g.parent !== r) : !0 } } function HGe(e, t, r) { return e.isUnion() ? r.getAllPossiblePropertiesOfTypes(Pr(e.types, i => !(i.flags & 134348796 || r.isArrayLikeType(i) || r.isTypeInvalidDueToUnionDiscriminant(i, t) || r.typeHasCallOrConstructSignatures(i) || i.isClass() && uTe(i.getApparentProperties())))) : e.getApparentProperties() } function uTe(e) { return vt(e, t => !!(Ef(t) & 24)) } function nG(e, t) { return e.isUnion() ? L.checkEachDefined(t.getAllPossiblePropertiesOfTypes(e.types), "getAllPossiblePropertiesOfTypes() should all be defined") : L.checkEachDefined(e.getApparentProperties(), "getApparentProperties() should all be defined") } function WGe(e, t, r, i) { var o; switch (r.kind) { case 354: return zr(r.parent, yS); case 1: let s = zr(Os(Ga(r.parent, Li).statements), yS); if (s && !Yo(s, 19, e)) return s; break; case 79: { if (nb(r) || Na(r.parent) && r.parent.initializer === r) return; if (rG(r)) return jn(r, yS) } }if (t) { if (r.kind === 135 || Re(t) && Na(t.parent) && Yr(r)) return jn(t, Yr); switch (t.kind) { case 63: return; case 26: case 19: return rG(r) && r.parent.name === r ? r.parent.parent : zr(r, yS); case 18: case 27: return zr(t.parent, yS); default: if (yS(r)) { if (Gs(e, t.getEnd()).line !== Gs(e, i).line) return r; let s = Yr(t.parent.parent) ? hP : cTe; return s(t.kind) || t.kind === 41 || Re(t) && s((o = nb(t)) != null ? o : 0) ? t.parent.parent : void 0 } return } } } function zGe(e) { if (!e) return; let t = e.parent; switch (e.kind) { case 18: if (Rd(t)) return t; break; case 26: case 27: case 79: if (t.kind === 168 && Rd(t.parent)) return t.parent; break } } function dTe(e, t) { if (!e) return; if (bi(e) && _6(e.parent)) return t.getTypeArgumentConstraint(e); let r = dTe(e.parent, t); if (r) switch (e.kind) { case 168: return t.getTypeOfPropertyOfContextualType(r, e.symbol.escapedName); case 190: case 184: case 189: return r } } function rG(e) { return e.parent && s6(e.parent) && yS(e.parent.parent) } function JGe(e, t, r, i) { switch (t) { case ".": case "@": return !0; case '"': case "'": case "`": return !!r && age(r) && i === r.getStart(e) + 1; case "#": return !!r && pi(r) && !!Zc(r); case "<": return !!r && r.kind === 29 && (!ar(r.parent) || fTe(r.parent)); case "/": return !!r && (es(r) ? !!oR(r) : r.kind === 43 && GS(r.parent)); case " ": return !!r && gL(r) && r.parent.kind === 308; default: return L.assertNever(t) } } function fTe({ left: e }) { return rc(e) } function KGe(e, t, r) { let i = r.resolveName("self", void 0, 111551, !1); if (i && r.getTypeOfSymbolAtLocation(i, t) === e) return !0; let o = r.resolveName("global", void 0, 111551, !1); if (o && r.getTypeOfSymbolAtLocation(o, t) === e) return !0; let s = r.resolveName("globalThis", void 0, 111551, !1); return !!(s && r.getTypeOfSymbolAtLocation(s, t) === e) } function qGe(e) { return !!(e.valueDeclaration && uu(e.valueDeclaration) & 32 && Yr(e.valueDeclaration.parent)) } function XGe(e, t) { let r = t.getContextualType(e); if (r) return r; let i = qy(e.parent); if (ar(i) && i.operatorToken.kind === 63 && e === i.left) return t.getTypeAtLocation(i); if (ot(i)) return t.getContextualType(i) } function _Te(e) { var t, r, i; let o, s = !1, l = f(); return { isKeywordOnlyCompletion: s, keywordCompletion: o, isNewIdentifierLocation: !!(l || o === 154), isTopLevelTypeOnly: !!((r = (t = zr(l, gl)) == null ? void 0 : t.importClause) != null && r.isTypeOnly) || !!((i = zr(l, Nl)) != null && i.isTypeOnly), couldBeTypeOnlyImportSpecifier: !!l && mTe(l, e), replacementSpan: YGe(l) }; function f() { let d = e.parent; if (Nl(d)) return o = e.kind === 154 ? void 0 : 154, UZ(d.moduleReference) ? d : void 0; if (mTe(d, e) && hTe(d.parent)) return d; if (jg(d) || nv(d)) { if (!d.parent.isTypeOnly && (e.kind === 18 || e.kind === 100 || e.kind === 27) && (o = 154), hTe(d)) if (e.kind === 19 || e.kind === 79) s = !0, o = 158; else return d.parent.parent; return } if (gL(e) && Li(d)) return o = 154, e; if (gL(e) && gl(d)) return o = 154, UZ(d.moduleSpecifier) ? d : void 0 } } function YGe(e) { var t, r, i; if (!e) return; let o = (t = jn(e, Kp(gl, Nl))) != null ? t : e, s = o.getSourceFile(); if (DT(o, s)) return Du(o, s); L.assert(o.kind !== 100 && o.kind !== 273); let l = o.kind === 269 ? (i = pTe((r = o.importClause) == null ? void 0 : r.namedBindings)) != null ? i : o.moduleSpecifier : o.moduleReference, f = { pos: o.getFirstToken().getStart(), end: l.pos }; if (DT(f, s)) return lv(f) } function pTe(e) { var t; return wr((t = zr(e, jg)) == null ? void 0 : t.elements, r => { var i; return !r.propertyName && fS(r.name.text) && ((i = el(r.name.pos, e.getSourceFile(), e)) == null ? void 0 : i.kind) !== 27 }) } function mTe(e, t) { return $u(e) && (e.isTypeOnly || t === e.name && b7(t)) } function hTe(e) { if (!UZ(e.parent.parent.moduleSpecifier) || e.parent.name) return !1; if (jg(e)) { let t = pTe(e); return (t ? e.elements.indexOf(t) : e.elements.length) < 2 } return !0 } function UZ(e) { var t; return rc(e) ? !0 : !((t = zr(um(e) ? e.expression : e, es)) != null && t.text) } function $Ge(e) { return jn(e, r => bT(r) || QGe(r) || La(r) ? "quit" : wi(r)) } function QGe(e) { return e.parent && xs(e.parent) && e.parent.body === e } function VZ(e, t, r = new Map) { return i(e) || i(wd(e.exportSymbol || e, t)); function i(o) { return !!(o.flags & 788968) || t.isUnknownSymbol(o) || !!(o.flags & 1536) && V_(r, $a(o)) && t.getExportsOfModule(o).some(s => VZ(s, t, r)) } } function ZGe(e, t) { let r = wd(e, t).declarations; return !!Fn(r) && Ji(r, H7) } function gTe(e, t) { if (t.length === 0) return !0; let r = !1, i, o = 0, s = e.length; for (let l = 0; l < s; l++) { let f = e.charCodeAt(l), d = t.charCodeAt(o); if ((f === d || f === eBe(d)) && (r || (r = i === void 0 || 97 <= i && i <= 122 && 65 <= f && f <= 90 || i === 95 && f !== 95), r && o++, o === t.length)) return !0; i = f } return !1 } function eBe(e) { return 97 <= e && e <= 122 ? e - 32 : e } var iG, jZ, Pl, HZ, WZ, zZ, gP, JZ, tBe = gt({ "src/services/completions.ts"() { "use strict"; Fr(), QZ(), iG = 100, jZ = 1e3, Pl = { LocalDeclarationPriority: "10", LocationPriority: "11", OptionalMember: "12", MemberDeclaredBySpreadAssignment: "13", SuggestedClassMembers: "14", GlobalsOrKeywords: "15", AutoImportSuggestions: "16", ClassMemberSnippets: "17", JavascriptIdentifiers: "18", Deprecated(e) { return "z" + e }, ObjectLiteralProperty(e, t) { return `${e}\0${t}\0` }, SortBelow(e) { return e + "1" } }, HZ = (e => (e.ThisProperty = "ThisProperty/", e.ClassMemberSnippet = "ClassMemberSnippet/", e.TypeOnlyAlias = "TypeOnlyAlias/", e.ObjectLiteralMethodSnippet = "ObjectLiteralMethodSnippet/", e.SwitchCases = "SwitchCases/", e))(HZ || {}), WZ = (e => (e[e.ThisType = 1] = "ThisType", e[e.SymbolMember = 2] = "SymbolMember", e[e.Export = 4] = "Export", e[e.Promise = 8] = "Promise", e[e.Nullable = 16] = "Nullable", e[e.ResolvedExport = 32] = "ResolvedExport", e[e.TypeOnlyAlias = 64] = "TypeOnlyAlias", e[e.ObjectLiteralMethod = 128] = "ObjectLiteralMethod", e[e.Ignore = 256] = "Ignore", e[e.ComputedPropertyName = 512] = "ComputedPropertyName", e[e.SymbolMemberNoExport = 2] = "SymbolMemberNoExport", e[e.SymbolMemberExport = 6] = "SymbolMemberExport", e))(WZ || {}), zZ = (e => (e[e.ObjectPropertyDeclaration = 0] = "ObjectPropertyDeclaration", e[e.Global = 1] = "Global", e[e.PropertyAccess = 2] = "PropertyAccess", e[e.MemberLike = 3] = "MemberLike", e[e.String = 4] = "String", e[e.None = 5] = "None", e))(zZ || {}), gP = [], JZ = zu(() => { let e = []; for (let t = 81; t <= 162; t++)e.push({ name: Xa(t), kind: "keyword", kindModifiers: "", sortText: Pl.GlobalsOrKeywords }); return e }) } }); function KZ() { let e = new Map; function t(r) { let i = e.get(r.name); (!i || $Z[i.kind] < $Z[r.kind]) && e.set(r.name, r) } return { add: t, has: e.has.bind(e), values: e.values.bind(e) } } function nBe(e, t, r, i, o, s, l, f, d) { if (Fhe(e, t)) { let g = yBe(e, t, i, o); return g && yTe(g) } if (n1(e, t, r)) { if (!r || !es(r)) return; let g = bTe(e, r, t, s.getTypeChecker(), i, o, f); return rBe(g, r, e, o, s, l, i, f, t, d) } } function rBe(e, t, r, i, o, s, l, f, d, g) { if (e === void 0) return; let m = tY(t); switch (e.kind) { case 0: return yTe(e.paths); case 1: { let v = MU(); return MZ(e.symbols, v, t, t, r, d, r, i, o, 99, s, 4, f, l, void 0, void 0, void 0, void 0, void 0, void 0, void 0, void 0, void 0, void 0, void 0, g), { isGlobalCompletion: !1, isMemberCompletion: !0, isNewIdentifierLocation: e.hasIndexSignature, optionalReplacementSpan: m, entries: v } } case 2: { let v = e.types.map(S => ({ name: S.value, kindModifiers: "", kind: "string", sortText: Pl.LocationPriority, replacementSpan: eY(t) })); return { isGlobalCompletion: !1, isMemberCompletion: !1, isNewIdentifierLocation: e.isNewIdentifier, optionalReplacementSpan: m, entries: v } } default: return L.assertNever(e) } } function iBe(e, t, r, i, o, s, l, f, d) { if (!i || !es(i)) return; let g = bTe(t, i, r, o, s, l, d); return g && aBe(e, i, g, t, o, f) } function aBe(e, t, r, i, o, s) { switch (r.kind) { case 0: { let l = wr(r.paths, f => f.name === e); return l && mP(e, vTe(l.extension), l.kind, [tf(e)]) } case 1: { let l = wr(r.symbols, f => f.name === e); return l && GZ(l, l.name, o, i, t, s) } case 2: return wr(r.types, l => l.value === e) ? mP(e, "", "string", [tf(e)]) : void 0; default: return L.assertNever(r) } } function yTe(e) { return { isGlobalCompletion: !1, isMemberCompletion: !1, isNewIdentifierLocation: !0, entries: e.map(({ name: o, kind: s, span: l, extension: f }) => ({ name: o, kind: s, kindModifiers: vTe(f), sortText: Pl.LocationPriority, replacementSpan: l })) } } function vTe(e) { switch (e) { case ".d.ts": return ".d.ts"; case ".js": return ".js"; case ".json": return ".json"; case ".jsx": return ".jsx"; case ".ts": return ".ts"; case ".tsx": return ".tsx"; case ".d.mts": return ".d.mts"; case ".mjs": return ".mjs"; case ".mts": return ".mts"; case ".d.cts": return ".d.cts"; case ".cjs": return ".cjs"; case ".cts": return ".cts"; case ".tsbuildinfo": return L.fail("Extension .tsbuildinfo is unsupported."); case void 0: return ""; default: return L.assertNever(e) } } function bTe(e, t, r, i, o, s, l) { let f = ETe(t.parent); switch (f.kind) { case 198: { let S = ETe(f.parent); switch (S.kind) { case 230: case 180: { let w = jn(f, C => C.parent === S); return w ? { kind: 2, types: yP(i.getTypeArgumentConstraint(w)), isNewIdentifier: !1 } : void 0 } case 196: let { indexType: x, objectType: A } = S; return wN(x, r) ? TTe(i.getTypeFromTypeNode(A)) : void 0; case 202: return { kind: 0, paths: xTe(e, t, o, s, i, l) }; case 189: { if (!m_(S.parent)) return; let w = oBe(S, f); return { kind: 2, types: yP(i.getTypeArgumentConstraint(S)).filter(P => !ya(w, P.value)), isNewIdentifier: !1 } } default: return } } case 299: return rs(f.parent) && f.name === t ? cBe(i, f.parent) : d() || d(0); case 209: { let { expression: S, argumentExpression: x } = f; return t === vs(x) ? TTe(i.getTypeAtLocation(S)) : void 0 } case 210: case 211: case 288: if (!TBe(t) && !Dd(f)) { let S = BP.getArgumentInfoForCompletions(f.kind === 288 ? f.parent : t, r, e); return S && sBe(S.invocation, t, S, i) || d() } case 269: case 275: case 280: return { kind: 0, paths: xTe(e, t, o, s, i, l) }; case 292: let g = J7(i, f.parent.clauses), m = d(); return m ? { kind: 2, types: m.types.filter(S => !g.hasValue(S.value)), isNewIdentifier: !1 } : void 0; default: return d() }function d(g = 4) { let m = yP(w7(t, i, g)); if (m.length) return { kind: 2, types: m, isNewIdentifier: !1 } } } function ETe(e) { switch (e.kind) { case 193: return dR(e); case 214: return qy(e); default: return e } } function oBe(e, t) { return Zi(e.types, r => r !== t && mb(r) && yo(r.literal) ? r.literal.text : void 0) } function sBe(e, t, r, i) { let o = !1, s = new Map, l = [], f = Au(e) ? L.checkDefined(jn(t.parent, Sp)) : t; i.getResolvedSignatureForStringLiteralCompletions(e, f, l); let d = Uo(l, g => { if (!Xl(g) && r.argumentCount > g.parameters.length) return; let m = g.getTypeParameterAtPosition(r.argumentIndex); if (Au(e)) { let v = i.getTypeOfPropertyOfType(m, f.name.text); v && (m = v) } return o = o || !!(m.flags & 4), yP(m, s) }); return Fn(d) ? { kind: 2, types: d, isNewIdentifier: o } : void 0 } function TTe(e) { return e && { kind: 1, symbols: Pr(e.getApparentProperties(), t => !(t.valueDeclaration && xu(t.valueDeclaration))), hasIndexSignature: EY(e) } } function cBe(e, t) { let r = e.getContextualType(t); if (!r) return; let i = e.getContextualType(t, 4); return { kind: 1, symbols: tG(r, i, t, e), hasIndexSignature: EY(r) } } function yP(e, t = new Map) { return e ? (e = iY(e), e.isUnion() ? Uo(e.types, r => yP(r, t)) : e.isStringLiteral() && !(e.flags & 1024) && V_(t, e.value) ? [e] : Je) : Je } function tC(e, t, r) { return { name: e, kind: t, extension: r } } function qZ(e) { return tC(e, "directory", void 0) } function STe(e, t, r) { let i = bBe(e, t), o = e.length === 0 ? void 0 : il(t, e.length); return r.map(({ name: s, kind: l, extension: f }) => Math.max(s.indexOf(_s), s.indexOf(pw)) !== -1 ? { name: s, kind: l, extension: f, span: o } : { name: s, kind: l, extension: f, span: i }) } function xTe(e, t, r, i, o, s) { return STe(t.text, t.getStart(e) + 1, lBe(e, t, r, i, o, s)) } function lBe(e, t, r, i, o, s) { let l = Al(t.text), f = es(t) ? W_(e, t) : void 0, d = e.path, g = ni(d), m = XZ(r, 1, e, o, s, f); return EBe(l) || !r.baseUrl && (qp(l) || doe(l)) ? uBe(l, g, r, i, d, m) : pBe(l, g, f, r, i, m, o) } function XZ(e, t, r, i, o, s) { return { extensionsToSearch: t_(dBe(e, i)), referenceKind: t, importingSourceFile: r, endingPreference: o?.importModuleSpecifierEnding, resolutionMode: s } } function uBe(e, t, r, i, o, s) { return r.rootDirs ? _Be(r.rootDirs, e, t, s, r, i, o) : lo(Tk(e, t, s, i, !1, o).values()) } function dBe(e, t) { let r = t ? Zi(t.getAmbientModules(), s => { let l = s.name.slice(1, -1); if (!(!l.startsWith("*.") || l.includes("/"))) return l.slice(1) }) : [], i = [...nL(e), r], o = $s(e); return T7(o) ? FR(e, i) : i } function fBe(e, t, r, i) { e = e.map(s => So(qp(s) ? s : vi(t, s))); let o = ks(e, s => Gy(s, r, t, i) ? r.substr(s.length) : void 0); return fA([...e.map(s => vi(s, o)), r], z1, su) } function _Be(e, t, r, i, o, s, l) { let f = o.project || s.getCurrentDirectory(), d = !(s.useCaseSensitiveFileNames && s.useCaseSensitiveFileNames()), g = fBe(e, f, r, d); return Uo(g, m => lo(Tk(t, m, i, s, !0, l).values())) } function Tk(e, t, r, i, o, s, l = KZ()) { var f; e === void 0 && (e = ""), e = Al(e), My(e) || (e = ni(e)), e === "" && (e = "." + _s), e = cu(e); let d = Fy(t, e), g = My(d) ? d : ni(d); if (!o) { let x = cge(g, i); if (x) { let w = JI(x, i).typesVersions; if (typeof w == "object") { let C = (f = q3(w)) == null ? void 0 : f.paths; if (C) { let P = ni(x), F = d.slice(cu(P).length); if (CTe(l, F, P, r, i, C)) return l } } } } let m = !(i.useCaseSensitiveFileNames && i.useCaseSensitiveFileNames()); if (!G7(i, g)) return l; let v = xY(i, g, r.extensionsToSearch, void 0, ["./*"]); if (v) for (let x of v) { if (x = So(x), s && cT(x, s, t, m) === 0) continue; let { name: A, extension: w } = ATe(Hl(x), i.getCompilationSettings(), r); l.add(tC(A, "script", w)) } let S = M7(i, g); if (S) for (let x of S) { let A = Hl(So(x)); A !== "@types" && l.add(qZ(A)) } return l } function ATe(e, t, r) { let i = Q0.tryGetRealFileNameForNonJsDeclarationFileName(e); if (i) return { name: i, extension: Hm(i) }; if (r.referenceKind === 0) return { name: e, extension: Hm(e) }; let o = OW(r.endingPreference, r.resolutionMode, t, r.importingSourceFile); if (o === 3) { if ($c(e, L4)) return { name: e, extension: Hm(e) }; let l = Q0.tryGetJSExtensionForFile(e, t); return l ? { name: V0(e, l), extension: l } : { name: e, extension: Hm(e) } } if ((o === 0 || o === 1) && $c(e, [".js", ".jsx", ".ts", ".tsx", ".d.ts"])) return { name: ld(e), extension: Hm(e) }; let s = Q0.tryGetJSExtensionForFile(e, t); return s ? { name: V0(e, s), extension: s } : { name: e, extension: Hm(e) } } function CTe(e, t, r, i, o, s) { let l = d => s[d], f = (d, g) => { let m = n2(d), v = n2(g), S = typeof m == "object" ? m.prefix.length : d.length, x = typeof v == "object" ? v.prefix.length : g.length; return Es(x, S) }; return ITe(e, t, r, i, o, bh(s), l, f) } function ITe(e, t, r, i, o, s, l, f) { let d = [], g; for (let m of s) { if (m === ".") continue; let v = m.replace(/^\.\//, ""), S = l(m); if (S) { let x = n2(v); if (!x) continue; let A = typeof x == "object" && h8(x, t); A && (g === void 0 || f(m, g) === -1) && (g = m, d = d.filter(C => !C.matchedPattern)), (typeof x == "string" || g === void 0 || f(m, g) !== 1) && d.push({ matchedPattern: A, results: mBe(v, S, t, r, i, o).map(({ name: C, kind: P, extension: F }) => tC(C, P, F)) }) } } return d.forEach(m => m.results.forEach(v => e.add(v))), g !== void 0 } function pBe(e, t, r, i, o, s, l) { let { baseUrl: f, paths: d } = i, g = KZ(), m = $s(i); if (f) { let S = i.project || o.getCurrentDirectory(), x = So(vi(S, f)); Tk(e, x, s, o, !1, void 0, g), d && CTe(g, e, x, s, o, d) } let v = kTe(e); for (let S of gBe(e, v, l)) g.add(tC(S, "external module name", void 0)); if (RTe(o, i, t, v, s, g), T7(m)) { let S = !1; if (v === void 0) for (let x of vBe(o, t)) { let A = tC(x, "external module name", void 0); g.has(A.name) || (S = !0, g.add(A)) } if (!S) { let x = A => { let w = vi(A, "node_modules"); G7(o, w) && Tk(e, w, s, o, !1, void 0, g) }; if (v && xW(i)) { let A = x; x = w => { let C = Ou(e); C.shift(); let P = C.shift(); if (!P) return A(w); if (na(P, "@")) { let q = C.shift(); if (!q) return A(w); P = vi(P, q) } let F = vi(w, "node_modules", P), B = vi(F, "package.json"); if (F7(o, B)) { let W = JI(B, o).exports; if (W) { if (typeof W != "object" || W === null) return; let Y = bh(W), R = C.join("/") + (C.length && My(e) ? "/" : ""), ie = r === 99 ? ["node", "import", "types"] : ["node", "require", "types"]; ITe(g, R, F, s, o, Y, $ => aT(LTe(W[$], ie)), tK); return } } return A(w) } } Th(t, x) } } return lo(g.values()) } function LTe(e, t) { if (typeof e == "string") return e; if (e && typeof e == "object" && !ba(e)) { for (let r in e) if (r === "default" || t.indexOf(r) > -1 || QO(t, r)) { let i = e[r]; return LTe(i, t) } } } function kTe(e) { return YZ(e) ? My(e) ? e : ni(e) : void 0 } function mBe(e, t, r, i, o, s) { if (!Oc(e, "*")) return jl(e, "*") ? Je : d(e, "script"); let l = e.slice(0, e.length - 1), f = KU(r, l); if (f === void 0) return e[e.length - 2] === "/" ? d(l, "directory") : Uo(t, m => { var v; return (v = DTe("", i, m, o, s)) == null ? void 0 : v.map(({ name: S, ...x }) => ({ name: l + S, ...x })) }); return Uo(t, g => DTe(f, i, g, o, s)); function d(g, m) { return na(g, r) ? [{ name: sT(g), kind: m, extension: void 0 }] : Je } } function DTe(e, t, r, i, o) { if (!o.readDirectory) return; let s = n2(r); if (s === void 0 || Ta(s)) return; let l = Fy(s.prefix), f = My(s.prefix) ? l : ni(l), d = My(s.prefix) ? "" : Hl(l), g = YZ(e), m = g ? My(e) ? e : ni(e) : void 0, v = g ? vi(f, d + m) : f, S = So(s.suffix), x = So(vi(t, v)), A = g ? x : cu(x) + d, w = S ? "**/*" + S : "./*", C = Zi(xY(o, x, i.extensionsToSearch, void 0, [w]), B => { let q = F(B); if (q) { if (YZ(q)) return qZ(Ou(wTe(q))[1]); let { name: W, extension: Y } = ATe(q, o.getCompilationSettings(), i); return tC(W, "script", Y) } }), P = S ? Je : Zi(M7(o, x), B => B === "node_modules" ? void 0 : qZ(B)); return [...C, ...P]; function F(B) { let q = hBe(So(B), A, S); return q === void 0 ? void 0 : wTe(q) } } function hBe(e, t, r) { return na(e, t) && Oc(e, r) ? e.slice(t.length, e.length - r.length) : void 0 } function wTe(e) { return e[0] === _s ? e.slice(1) : e } function gBe(e, t, r) { let o = r.getAmbientModules().map(s => u_(s.name)).filter(s => na(s, e) && s.indexOf("*") < 0); if (t !== void 0) { let s = cu(t); return o.map(l => QC(l, s)) } return o } function yBe(e, t, r, i) { let o = Vi(e, t), s = Nm(e.text, o.pos), l = s && wr(s, A => t >= A.pos && t <= A.end); if (!l) return; let f = e.text.slice(l.pos, t), d = OTe.exec(f); if (!d) return; let [, g, m, v] = d, S = ni(e.path), x = m === "path" ? Tk(v, S, XZ(r, 0, e), i, !0, e.path) : m === "types" ? RTe(i, r, S, kTe(v), XZ(r, 1, e)) : L.fail(); return STe(v, l.pos + g.length, lo(x.values())) } function RTe(e, t, r, i, o, s = KZ()) { let l = new Map, f = B7(() => XO(t, e)) || Je; for (let g of f) d(g); for (let g of AY(r, e)) { let m = vi(ni(g), "node_modules/@types"); d(m) } return s; function d(g) { if (G7(e, g)) for (let m of M7(e, g)) { let v = iF(m); if (!(t.types && !ya(t.types, v))) if (i === void 0) l.has(v) || (s.add(tC(v, "external module name", void 0)), l.set(v, !0)); else { let S = vi(g, m), x = IW(i, v, lb(e)); x !== void 0 && Tk(x, S, o, e, !1, void 0, s) } } } } function vBe(e, t) { if (!e.readFile || !e.fileExists) return Je; let r = []; for (let i of AY(t, e)) { let o = JI(i, e); for (let s of NTe) { let l = o[s]; if (l) for (let f in l) fs(l, f) && !na(f, "@types/") && r.push(f) } } return r } function bBe(e, t) { let r = Math.max(e.lastIndexOf(_s), e.lastIndexOf(pw)), i = r !== -1 ? r + 1 : 0, o = e.length - i; return o === 0 || i_(e.substr(i, o), 99) ? void 0 : il(t + i, o) } function EBe(e) { if (e && e.length >= 2 && e.charCodeAt(0) === 46) { let t = e.length >= 3 && e.charCodeAt(1) === 46 ? 2 : 1, r = e.charCodeAt(t); return r === 47 || r === 92 } return !1 } function YZ(e) { return jl(e, _s) } function TBe(e) { return Pa(e.parent) && Sl(e.parent.arguments) === e && Re(e.parent.expression) && e.parent.expression.escapedText === "require" } var $Z, OTe, NTe, SBe = gt({ "src/services/stringCompletions.ts"() { "use strict"; Fr(), QZ(), $Z = { directory: 0, script: 1, "external module name": 2 }, OTe = /^(\/\/\/\s*<reference\s+(path|types)\s*=\s*(?:'|"))([^\3"]*)$/, NTe = ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"] } }), aG = {}; Mo(aG, { getStringLiteralCompletionDetails: () => iBe, getStringLiteralCompletions: () => nBe }); var xBe = gt({ "src/services/_namespaces/ts.Completions.StringCompletions.ts"() { "use strict"; SBe() } }), lx = {}; Mo(lx, { CompletionKind: () => zZ, CompletionSource: () => HZ, SortText: () => Pl, StringCompletions: () => aG, SymbolOriginInfoKind: () => WZ, createCompletionDetails: () => mP, createCompletionDetailsForSymbol: () => GZ, getCompletionEntriesFromSymbols: () => MZ, getCompletionEntryDetails: () => OGe, getCompletionEntrySymbol: () => PGe, getCompletionsAtPosition: () => fGe, getPropertiesForObjectExpression: () => tG, moduleSpecifierResolutionCacheAttemptLimit: () => jZ, moduleSpecifierResolutionLimit: () => iG }); var QZ = gt({ "src/services/_namespaces/ts.Completions.ts"() { "use strict"; tBe(), xBe() } }); function ZZ(e, t, r, i) { let o = LBe(e, r, i); return (s, l, f) => { let { directImports: d, indirectUsers: g } = ABe(e, t, o, l, r, i); return { indirectUsers: g, ...CBe(d, s, l.exportKind, r, f) } } } function ABe(e, t, r, { exportingModuleSymbol: i, exportKind: o }, s, l) { let f = W2(), d = W2(), g = [], m = !!i.globalExports, v = m ? void 0 : []; return x(i), { directImports: g, indirectUsers: S() }; function S() { if (m) return e; if (i.declarations) for (let B of i.declarations) D0(B) && t.has(B.getSourceFile().fileName) && P(B); return v.map(Gn) } function x(B) { let q = F(B); if (q) { for (let W of q) if (f(W)) switch (l && l.throwIfCancellationRequested(), W.kind) { case 210: if (Dd(W)) { A(W); break } if (!m) { let R = W.parent; if (o === 2 && R.kind === 257) { let { name: ie } = R; if (ie.kind === 79) { g.push(ie); break } } } break; case 79: break; case 268: C(W, W.name, Mr(W, 1), !1); break; case 269: g.push(W); let Y = W.importClause && W.importClause.namedBindings; Y && Y.kind === 271 ? C(W, Y.name, !1, !0) : !m && lS(W) && P(vP(W)); break; case 275: W.exportClause ? W.exportClause.kind === 277 ? P(vP(W), !0) : g.push(W) : x(OBe(W, s)); break; case 202: !m && W.isTypeOf && !W.qualifier && w(W) && P(W.getSourceFile(), !0), g.push(W); break; default: L.failBadSyntaxKind(W, "Unexpected import kind.") } } } function A(B) { let q = jn(B, oG) || B.getSourceFile(); P(q, !!w(B, !0)) } function w(B, q = !1) { return jn(B, W => q && oG(W) ? "quit" : g_(W) && vt(W.modifiers, c3)) } function C(B, q, W, Y) { if (o === 2) Y || g.push(B); else if (!m) { let R = vP(B); L.assert(R.kind === 308 || R.kind === 264), W || IBe(R, q, s) ? P(R, !0) : P(R) } } function P(B, q = !1) { if (L.assert(!m), !d(B) || (v.push(B), !q)) return; let Y = s.getMergedSymbol(B.symbol); if (!Y) return; L.assert(!!(Y.flags & 1536)); let R = F(Y); if (R) for (let ie of R) Mh(ie) || P(vP(ie), !0) } function F(B) { return r.get($a(B).toString()) } } function CBe(e, t, r, i, o) { let s = [], l = []; function f(S, x) { s.push([S, x]) } if (e) for (let S of e) d(S); return { importSearches: s, singleReferences: l }; function d(S) { if (S.kind === 268) { tee(S) && g(S.name); return } if (S.kind === 79) { g(S); return } if (S.kind === 202) { if (S.qualifier) { let w = Yd(S.qualifier); w.escapedText === fc(t) && l.push(w) } else r === 2 && l.push(S.argument.literal); return } if (S.moduleSpecifier.kind !== 10) return; if (S.kind === 275) { S.exportClause && h_(S.exportClause) && m(S.exportClause); return } let { name: x, namedBindings: A } = S.importClause || { name: void 0, namedBindings: void 0 }; if (A) switch (A.kind) { case 271: g(A.name); break; case 272: (r === 0 || r === 1) && m(A); break; default: L.assertNever(A) }if (x && (r === 1 || r === 2) && (!o || x.escapedText === A7(t))) { let w = i.getSymbolAtLocation(x); f(x, w) } } function g(S) { r === 2 && (!o || v(S.escapedText)) && f(S, i.getSymbolAtLocation(S)) } function m(S) { if (S) for (let x of S.elements) { let { name: A, propertyName: w } = x; if (v((w || A).escapedText)) if (w) l.push(w), (!o || A.escapedText === t.escapedName) && f(A, i.getSymbolAtLocation(A)); else { let C = x.kind === 278 && x.propertyName ? i.getExportSpecifierLocalTargetSymbol(x) : i.getSymbolAtLocation(A); f(A, C) } } } function v(S) { return S === t.escapedName || r !== 0 && S === "default" } } function IBe(e, t, r) { let i = r.getSymbolAtLocation(t); return !!MTe(e, o => { if (!Il(o)) return; let { exportClause: s, moduleSpecifier: l } = o; return !l && s && h_(s) && s.elements.some(f => r.getExportSpecifierLocalTargetSymbol(f) === i) }) } function PTe(e, t, r) { var i; let o = [], s = e.getTypeChecker(); for (let l of t) { let f = r.valueDeclaration; if (f?.kind === 308) { for (let d of l.referencedFiles) e.getSourceFileFromReference(l, d) === f && o.push({ kind: "reference", referencingFile: l, ref: d }); for (let d of l.typeReferenceDirectives) { let g = (i = e.getResolvedTypeReferenceDirectives().get(d.fileName, d.resolutionMode || l.impliedNodeFormat)) == null ? void 0 : i.resolvedTypeReferenceDirective; g !== void 0 && g.resolvedFileName === f.fileName && o.push({ kind: "reference", referencingFile: l, ref: d }) } } FTe(l, (d, g) => { s.getSymbolAtLocation(g) === r && o.push({ kind: "import", literal: g }) }) } return o } function LBe(e, t, r) { let i = new Map; for (let o of e) r && r.throwIfCancellationRequested(), FTe(o, (s, l) => { let f = t.getSymbolAtLocation(l); if (f) { let d = $a(f).toString(), g = i.get(d); g || i.set(d, g = []), g.push(s) } }); return i } function MTe(e, t) { return mn(e.kind === 308 ? e.statements : e.body.statements, r => t(r) || oG(r) && mn(r.body && r.body.statements, t)) } function FTe(e, t) { if (e.externalModuleIndicator || e.imports !== void 0) for (let r of e.imports) t(aR(r), r); else MTe(e, r => { switch (r.kind) { case 275: case 269: { let i = r; i.moduleSpecifier && yo(i.moduleSpecifier) && t(i, i.moduleSpecifier); break } case 268: { let i = r; tee(i) && t(i, i.moduleReference.expression); break } } }) } function GTe(e, t, r, i) { return i ? o() : o() || s(); function o() { var d; let { parent: g } = e, m = g.parent; if (t.exportSymbol) return g.kind === 208 ? (d = t.declarations) != null && d.some(x => x === g) && ar(m) ? S(m, !1) : void 0 : l(t.exportSymbol, f(g)); { let x = DBe(g, e); if (x && Mr(x, 1)) return Nl(x) && x.moduleReference === e ? i ? void 0 : { kind: 0, symbol: r.getSymbolAtLocation(x.name) } : l(t, f(x)); if (qm(g)) return l(t, 0); if (pc(g)) return v(g); if (pc(m)) return v(m); if (ar(g)) return S(g, !0); if (ar(m)) return S(m, !0); if (Kz(g) || Vz(g)) return l(t, 0) } function v(x) { if (!x.symbol.parent) return; let A = x.isExportEquals ? 2 : 1; return { kind: 1, symbol: t, exportInfo: { exportingModuleSymbol: x.symbol.parent, exportKind: A } } } function S(x, A) { let w; switch (ic(x)) { case 1: w = 0; break; case 2: w = 2; break; default: return }let C = A ? r.getSymbolAtLocation(ule(Ga(x.left, Us))) : t; return C && l(C, w) } } function s() { if (!wBe(e)) return; let g = r.getImmediateAliasedSymbol(t); if (!g || (g = RBe(g, r), g.escapedName === "export=" && (g = kBe(g, r), g === void 0))) return; let m = A7(g); if (m === void 0 || m === "default" || m === t.escapedName) return { kind: 0, symbol: g } } function l(d, g) { let m = eee(d, g, r); return m && { kind: 1, symbol: d, exportInfo: m } } function f(d) { return Mr(d, 1024) ? 1 : 0 } } function kBe(e, t) { var r, i; if (e.flags & 2097152) return t.getImmediateAliasedSymbol(e); let o = L.checkDefined(e.valueDeclaration); if (pc(o)) return (r = zr(o.expression, $p)) == null ? void 0 : r.symbol; if (ar(o)) return (i = zr(o.right, $p)) == null ? void 0 : i.symbol; if (Li(o)) return o.symbol } function DBe(e, t) { let r = wi(e) ? e : Wo(e) ? bA(e) : void 0; return r ? e.name !== t || E2(r.parent) ? void 0 : Bc(r.parent.parent) ? r.parent.parent : void 0 : e } function wBe(e) { let { parent: t } = e; switch (t.kind) { case 268: return t.name === e && tee(t); case 273: return !t.propertyName; case 270: case 271: return L.assert(t.name === e), !0; case 205: return Yn(e) && N0(t.parent.parent); default: return !1 } } function eee(e, t, r) { let i = e.parent; if (!i) return; let o = r.getMergedSymbol(i); return BN(o) ? { exportingModuleSymbol: o, exportKind: t } : void 0 } function RBe(e, t) { if (e.declarations) for (let r of e.declarations) { if (Mu(r) && !r.propertyName && !r.parent.parent.moduleSpecifier) return t.getExportSpecifierLocalTargetSymbol(r) || e; if (br(r) && Bm(r.expression) && !pi(r.name)) return t.getSymbolAtLocation(r); if (xf(r) && ar(r.parent.parent) && ic(r.parent.parent) === 2) return t.getExportSpecifierLocalTargetSymbol(r.name) } return e } function OBe(e, t) { return t.getMergedSymbol(vP(e).symbol) } function vP(e) { if (e.kind === 210) return e.getSourceFile(); let { parent: t } = e; return t.kind === 308 ? t : (L.assert(t.kind === 265), Ga(t.parent, oG)) } function oG(e) { return e.kind === 264 && e.name.kind === 10 } function tee(e) { return e.moduleReference.kind === 280 && e.moduleReference.expression.kind === 10 } var nee, ree, NBe = gt({ "src/services/importTracker.ts"() { "use strict"; Fr(), nee = (e => (e[e.Named = 0] = "Named", e[e.Default = 1] = "Default", e[e.ExportEquals = 2] = "ExportEquals", e))(nee || {}), ree = (e => (e[e.Import = 0] = "Import", e[e.Export = 1] = "Export", e))(ree || {}) } }); function Ym(e, t = 1) { return { kind: t, node: e.name || e, context: PBe(e) } } function BTe(e) { return e && e.kind === void 0 } function PBe(e) { if (Kl(e)) return sE(e); if (e.parent) { if (!Kl(e.parent) && !pc(e.parent)) { if (Yn(e)) { let r = ar(e.parent) ? e.parent : Us(e.parent) && ar(e.parent.parent) && e.parent.parent.left === e.parent ? e.parent.parent : void 0; if (r && ic(r) !== 0) return sE(r) } if (Xm(e.parent) || GS(e.parent)) return e.parent.parent; if (FS(e.parent) || J0(e.parent) || hI(e.parent)) return e.parent; if (es(e)) { let r = oR(e); if (r) { let i = jn(r, o => Kl(o) || ca(o) || EI(o)); return Kl(i) ? sE(i) : i } } let t = jn(e, ts); return t ? sE(t.parent) : void 0 } if (e.parent.name === e || Ec(e.parent) || pc(e.parent) || (eS(e.parent) || Wo(e.parent)) && e.parent.propertyName === e || e.kind === 88 && Mr(e.parent, 1025)) return sE(e.parent) } } function sE(e) { if (e) switch (e.kind) { case 257: return !pu(e.parent) || e.parent.declarations.length !== 1 ? e : Bc(e.parent.parent) ? e.parent.parent : CA(e.parent.parent) ? sE(e.parent.parent) : e.parent; case 205: return sE(e.parent.parent); case 273: return e.parent.parent.parent; case 278: case 271: return e.parent.parent; case 270: case 277: return e.parent; case 223: return Ol(e.parent) ? e.parent : e; case 247: case 246: return { start: e.initializer, end: e.expression }; case 299: case 300: return qg(e.parent) ? sE(jn(e.parent, t => ar(t) || CA(t))) : e; default: return e } } function iee(e, t, r) { if (!r) return; let i = BTe(r) ? EP(r.start, t, r.end) : EP(r, t); return i.start !== e.start || i.length !== e.length ? { contextSpan: i } : void 0 } function MBe(e, t, r, i, o) { let s = ef(i, o), l = { use: 1 }, f = u1.getReferencedSymbolsForNode(o, s, e, r, t, l), d = e.getTypeChecker(), g = u1.getAdjustedNode(s, l), m = FBe(g) ? d.getSymbolAtLocation(g) : void 0; return !f || !f.length ? void 0 : Zi(f, ({ definition: v, references: S }) => v && { definition: d.runWithCancellationToken(t, x => UBe(v, x, s)), references: S.map(x => jBe(x, m)) }) } function FBe(e) { return e.kind === 88 || !!fR(e) || _R(e) || e.kind === 135 && Ec(e.parent) } function GBe(e, t, r, i, o) { let s = ef(i, o), l, f = UTe(e, t, r, s, o); if (s.parent.kind === 208 || s.parent.kind === 205 || s.parent.kind === 209 || s.kind === 106) l = f && [...f]; else if (f) { let g = HU(f), m = new Map; for (; !g.isEmpty();) { let v = g.dequeue(); if (!V_(m, zo(v.node))) continue; l = Sn(l, v); let S = UTe(e, t, r, v.node, v.node.pos); S && g.enqueue(...S) } } let d = e.getTypeChecker(); return on(l, g => WBe(g, d)) } function UTe(e, t, r, i, o) { if (i.kind === 308) return; let s = e.getTypeChecker(); if (i.parent.kind === 300) { let l = []; return u1.getReferenceEntriesForShorthandPropertyAssignment(i, s, f => l.push(Ym(f))), l } else if (i.kind === 106 || Pu(i.parent)) { let l = s.getSymbolAtLocation(i); return l.valueDeclaration && [Ym(l.valueDeclaration)] } else return VTe(o, i, e, r, t, { implementations: !0, use: 1 }) } function BBe(e, t, r, i, o, s, l) { return on(jTe(u1.getReferencedSymbolsForNode(o, i, e, r, t, s)), f => l(f, i, e.getTypeChecker())) } function VTe(e, t, r, i, o, s = {}, l = new Set(i.map(f => f.fileName))) { return jTe(u1.getReferencedSymbolsForNode(e, t, r, i, o, s, l)) } function jTe(e) { return e && Uo(e, t => t.references) } function UBe(e, t, r) { let i = (() => { switch (e.type) { case 0: { let { symbol: m } = e, { displayParts: v, kind: S } = HTe(m, t, r), x = v.map(C => C.text).join(""), A = m.declarations && Sl(m.declarations), w = A ? sa(A) || A : r; return { ...bP(w), name: x, kind: S, displayParts: v, context: sE(A) } } case 1: { let { node: m } = e; return { ...bP(m), name: m.text, kind: "label", displayParts: [Qu(m.text, 17)] } } case 2: { let { node: m } = e, v = Xa(m.kind); return { ...bP(m), name: v, kind: "keyword", displayParts: [{ text: v, kind: "keyword" }] } } case 3: { let { node: m } = e, v = t.getSymbolAtLocation(m), S = v && $g.getSymbolDisplayPartsDocumentationAndSymbolKind(t, v, m.getSourceFile(), e1(m), m).displayParts || [tf("this")]; return { ...bP(m), name: "this", kind: "var", displayParts: S } } case 4: { let { node: m } = e; return { ...bP(m), name: m.text, kind: "var", displayParts: [Qu(Qc(m), 8)] } } case 5: return { textSpan: lv(e.reference), sourceFile: e.file, name: e.reference.fileName, kind: "string", displayParts: [Qu(`"${e.reference.fileName}"`, 8)] }; default: return L.assertNever(e) } })(), { sourceFile: o, textSpan: s, name: l, kind: f, displayParts: d, context: g } = i; return { containerKind: "", containerName: "", fileName: o.fileName, kind: f, name: l, textSpan: s, displayParts: d, ...iee(s, o, g) } } function bP(e) { let t = e.getSourceFile(); return { sourceFile: t, textSpan: EP(ts(e) ? e.expression : e, t) } } function HTe(e, t, r) { let i = u1.getIntersectingMeaningFromDeclarations(r, e), o = e.declarations && Sl(e.declarations) || r, { displayParts: s, symbolKind: l } = $g.getSymbolDisplayPartsDocumentationAndSymbolKind(t, e, o.getSourceFile(), o, o, i); return { displayParts: s, kind: l } } function VBe(e, t, r, i) { return { ...sG(e), ...i && HBe(e, t, r) } } function jBe(e, t) { let r = WTe(e); return t ? { ...r, isDefinition: e.kind !== 0 && JTe(e.node, t) } : r } function WTe(e) { let t = sG(e); if (e.kind === 0) return { ...t, isWriteAccess: !1 }; let { kind: r, node: i } = e; return { ...t, isWriteAccess: zTe(i), isInString: r === 2 ? !0 : void 0 } } function sG(e) { if (e.kind === 0) return { textSpan: e.textSpan, fileName: e.fileName }; { let t = e.node.getSourceFile(), r = EP(e.node, t); return { textSpan: r, fileName: t.fileName, ...iee(r, t, e.context) } } } function HBe(e, t, r) { if (e.kind !== 0 && Re(t)) { let { node: i, kind: o } = e, s = i.parent, l = t.text, f = xf(s); if (f || jN(s) && s.name === i && s.dotDotDotToken === void 0) { let d = { prefixText: l + ": " }, g = { suffixText: ": " + l }; if (o === 3) return d; if (o === 4) return g; if (f) { let m = s.parent; return rs(m) && ar(m.parent) && Bm(m.parent.left) ? d : g } else return d } else if ($u(s) && !s.propertyName) { let d = Mu(t.parent) ? r.getExportSpecifierLocalTargetSymbol(t.parent) : r.getSymbolAtLocation(t); return ya(d.declarations, s) ? { prefixText: l + " as " } : Cp } else if (Mu(s) && !s.propertyName) return t === e.node || r.getSymbolAtLocation(t) === r.getSymbolAtLocation(e.node) ? { prefixText: l + " as " } : { suffixText: " as " + l } } return Cp } function WBe(e, t) { let r = sG(e); if (e.kind !== 0) { let { node: i } = e; return { ...r, ...zBe(i, t) } } else return { ...r, kind: "", displayParts: [] } } function zBe(e, t) { let r = t.getSymbolAtLocation(Kl(e) && e.name ? e.name : e); return r ? HTe(r, t, e) : e.kind === 207 ? { kind: "interface", displayParts: [Yl(20), tf("object literal"), Yl(21)] } : e.kind === 228 ? { kind: "local class", displayParts: [Yl(20), tf("anonymous local class"), Yl(21)] } : { kind: aE(e), displayParts: [] } } function JBe(e) { let t = sG(e); if (e.kind === 0) return { fileName: t.fileName, span: { textSpan: t.textSpan, kind: "reference" } }; let r = zTe(e.node), i = { textSpan: t.textSpan, kind: r ? "writtenReference" : "reference", isInString: e.kind === 2 ? !0 : void 0, ...t.contextSpan && { contextSpan: t.contextSpan } }; return { fileName: t.fileName, span: i } } function EP(e, t, r) { let i = e.getStart(t), o = (r || e).getEnd(); return es(e) && o - i > 2 && (L.assert(r === void 0), i += 1, o -= 1), Wc(i, o) } function aee(e) { return e.kind === 0 ? e.textSpan : EP(e.node, e.node.getSourceFile()) } function zTe(e) { let t = fR(e); return !!t && KBe(t) || e.kind === 88 || YI(e) } function JTe(e, t) { var r; if (!t) return !1; let i = fR(e) || (e.kind === 88 ? e.parent : _R(e) || e.kind === 135 && Ec(e.parent) ? e.parent.parent : void 0), o = i && ar(i) ? i.left : void 0; return !!(i && ((r = t.declarations) != null && r.some(s => s === i || s === o))) } function KBe(e) { if (e.flags & 16777216) return !0; switch (e.kind) { case 223: case 205: case 260: case 228: case 88: case 263: case 302: case 278: case 270: case 268: case 273: case 261: case 341: case 349: case 288: case 264: case 267: case 271: case 277: case 166: case 300: case 262: case 165: return !0; case 299: return !qg(e.parent); case 259: case 215: case 173: case 171: case 174: case 175: return !!e.body; case 257: case 169: return !!e.initializer || E2(e.parent); case 170: case 168: case 351: case 344: return !1; default: return L.failBadSyntaxKind(e) } } var oee, see, cee, u1, qBe = gt({ "src/services/findAllReferences.ts"() { "use strict"; Fr(), KTe(), oee = (e => (e[e.Symbol = 0] = "Symbol", e[e.Label = 1] = "Label", e[e.Keyword = 2] = "Keyword", e[e.This = 3] = "This", e[e.String = 4] = "String", e[e.TripleSlashReference = 5] = "TripleSlashReference", e))(oee || {}), see = (e => (e[e.Span = 0] = "Span", e[e.Node = 1] = "Node", e[e.StringLiteral = 2] = "StringLiteral", e[e.SearchedLocalFoundProperty = 3] = "SearchedLocalFoundProperty", e[e.SearchedPropertyFoundLocal = 4] = "SearchedPropertyFoundLocal", e))(see || {}), cee = (e => (e[e.Other = 0] = "Other", e[e.References = 1] = "References", e[e.Rename = 2] = "Rename", e))(cee || {}), (e => { function t(Se, at, Tt, ve, nt, ce = {}, Q = new Set(ve.map(ue => ue.fileName))) { var ue, G, Oe; if (at = r(at, ce), Li(at)) { let ae = xk.getReferenceAtPosition(at, Se, Tt); if (!ae?.file) return; let rt = Tt.getTypeChecker().getMergedSymbol(ae.file.symbol); if (rt) return g(Tt, rt, !1, ve, Q); let Ot = Tt.getFileIncludeReasons(); return Ot ? [{ definition: { type: 5, reference: ae.reference, file: at }, references: o(ae.file, Ot, Tt) || Je }] : void 0 } if (!ce.implementations) { let ae = v(at, ve, nt); if (ae) return ae } let je = Tt.getTypeChecker(), Ge = je.getSymbolAtLocation(Ec(at) && at.parent.name || at); if (!Ge) { if (!ce.implementations && es(at)) { if (C7(at)) { let ae = Tt.getFileIncludeReasons(), rt = (Oe = (G = (ue = at.getSourceFile().resolvedModules) == null ? void 0 : ue.get(at.text, W_(at.getSourceFile(), at))) == null ? void 0 : G.resolvedModule) == null ? void 0 : Oe.resolvedFileName, Ot = rt ? Tt.getSourceFile(rt) : void 0; if (Ot) return [{ definition: { type: 4, node: at }, references: o(Ot, ae, Tt) || Je }] } return pt(at, ve, je, nt) } return } if (Ge.escapedName === "export=") return g(Tt, Ge.parent, !1, ve, Q); let kt = l(Ge, Tt, ve, nt, ce, Q); if (kt && !(Ge.flags & 33554432)) return kt; let Kt = s(at, Ge, je), ln = Kt && l(Kt, Tt, ve, nt, ce, Q), ir = S(Ge, at, ve, Q, je, nt, ce); return f(Tt, kt, ir, ln) } e.getReferencedSymbolsForNode = t; function r(Se, at) { return at.use === 1 ? Se = zX(Se) : at.use === 2 && (Se = _7(Se)), Se } e.getAdjustedNode = r; function i(Se, at, Tt, ve = new Set(Tt.map(nt => nt.fileName))) { var nt, ce; let Q = (nt = at.getSourceFile(Se)) == null ? void 0 : nt.symbol; if (Q) return ((ce = g(at, Q, !1, Tt, ve)[0]) == null ? void 0 : ce.references) || Je; let ue = at.getFileIncludeReasons(), G = at.getSourceFile(Se); return G && ue && o(G, ue, at) || Je } e.getReferencesForFileName = i; function o(Se, at, Tt) { let ve, nt = at.get(Se.path) || Je; for (let ce of nt) if (vb(ce)) { let Q = Tt.getSourceFileByPath(ce.file), ue = YL(Tt.getSourceFileByPath, ce); F2(ue) && (ve = Sn(ve, { kind: 0, fileName: Q.fileName, textSpan: lv(ue) })) } return ve } function s(Se, at, Tt) { if (Se.parent && gO(Se.parent)) { let ve = Tt.getAliasedSymbol(at), nt = Tt.getMergedSymbol(ve); if (ve !== nt) return nt } } function l(Se, at, Tt, ve, nt, ce) { let Q = Se.flags & 1536 && Se.declarations && wr(Se.declarations, Li); if (!Q) return; let ue = Se.exports.get("export="), G = g(at, Se, !!ue, Tt, ce); if (!ue || !ce.has(Q.fileName)) return G; let Oe = at.getTypeChecker(); return Se = wd(ue, Oe), f(at, G, S(Se, void 0, Tt, ce, Oe, ve, nt)) } function f(Se, ...at) { let Tt; for (let ve of at) if (!(!ve || !ve.length)) { if (!Tt) { Tt = ve; continue } for (let nt of ve) { if (!nt.definition || nt.definition.type !== 0) { Tt.push(nt); continue } let ce = nt.definition.symbol, Q = Yc(Tt, G => !!G.definition && G.definition.type === 0 && G.definition.symbol === ce); if (Q === -1) { Tt.push(nt); continue } let ue = Tt[Q]; Tt[Q] = { definition: ue.definition, references: ue.references.concat(nt.references).sort((G, Oe) => { let je = d(Se, G), Ge = d(Se, Oe); if (je !== Ge) return Es(je, Ge); let kt = aee(G), Kt = aee(Oe); return kt.start !== Kt.start ? Es(kt.start, Kt.start) : Es(kt.length, Kt.length) }) } } } return Tt } function d(Se, at) { let Tt = at.kind === 0 ? Se.getSourceFile(at.fileName) : at.node.getSourceFile(); return Se.getSourceFiles().indexOf(Tt) } function g(Se, at, Tt, ve, nt) { L.assert(!!at.valueDeclaration); let ce = Zi(PTe(Se, ve, at), ue => { if (ue.kind === "import") { let G = ue.literal.parent; if (mb(G)) { let Oe = Ga(G.parent, Mh); if (Tt && !Oe.qualifier) return } return Ym(ue.literal) } else return { kind: 0, fileName: ue.referencingFile.fileName, textSpan: lv(ue.ref) } }); if (at.declarations) for (let ue of at.declarations) switch (ue.kind) { case 308: break; case 264: nt.has(ue.getSourceFile().fileName) && ce.push(Ym(ue.name)); break; default: L.assert(!!(at.flags & 33554432), "Expected a module symbol to be declared by a SourceFile or ModuleDeclaration.") }let Q = at.exports.get("export="); if (Q?.declarations) for (let ue of Q.declarations) { let G = ue.getSourceFile(); if (nt.has(G.fileName)) { let Oe = ar(ue) && br(ue.left) ? ue.left.expression : pc(ue) ? L.checkDefined(Yo(ue, 93, G)) : sa(ue) || ue; ce.push(Ym(Oe)) } } return ce.length ? [{ definition: { type: 0, symbol: at }, references: ce }] : Je } function m(Se) { return Se.kind === 146 && RS(Se.parent) && Se.parent.operator === 146 } function v(Se, at, Tt) { if (ik(Se.kind)) return Se.kind === 114 && NS(Se.parent) || Se.kind === 146 && !m(Se) ? void 0 : we(at, Se.kind, Tt, Se.kind === 146 ? m : void 0); if (NA(Se.parent) && Se.parent.name === Se) return Ve(at, Tt); if (LS(Se) && oc(Se.parent)) return [{ definition: { type: 2, node: Se }, references: [Ym(Se)] }]; if (DN(Se)) { let ve = s7(Se.parent, Se.text); return ve && ge(ve.parent, ve) } else if (MX(Se)) return ge(Se.parent, Se); if (H2(Se)) return gr(Se, at, Tt); if (Se.kind === 106) return Ni(Se) } function S(Se, at, Tt, ve, nt, ce, Q) { let ue = at && w(Se, at, nt, !Cr(Q)) || Se, G = at ? hi(at, ue) : 7, Oe = [], je = new F(Tt, ve, at ? A(at) : 0, nt, ce, G, Q, Oe), Ge = !Cr(Q) || !ue.declarations ? void 0 : wr(ue.declarations, Mu); if (Ge) Be(Ge.name, ue, Ge, je.createSearch(at, Se, void 0), je, !0, !0); else if (at && at.kind === 88 && ue.escapedName === "default" && ue.parent) ct(at, ue, je), B(at, ue, { exportingModuleSymbol: ue.parent, exportKind: 1 }, je); else { let kt = je.createSearch(at, ue, void 0, { allSearchSymbols: at ? nn(ue, at, nt, Q.use === 2, !!Q.providePrefixAndSuffixTextForRename, !!Q.implementations) : [ue] }); x(ue, je, kt) } return Oe } function x(Se, at, Tt) { let ve = $(Se); if (ve) Pe(ve, ve.getSourceFile(), Tt, at, !(Li(ve) && !ya(at.sourceFiles, ve))); else for (let nt of at.sourceFiles) at.cancellationToken.throwIfCancellationRequested(), R(nt, Tt, at) } function A(Se) { switch (Se.kind) { case 173: case 135: return 1; case 79: if (Yr(Se.parent)) return L.assert(Se.parent.name === Se), 2; default: return 0 } } function w(Se, at, Tt, ve) { let { parent: nt } = at; return Mu(nt) && ve ? Ne(at, Se, nt, Tt) : ks(Se.declarations, ce => { if (!ce.parent) { if (Se.flags & 33554432) return; L.fail(`Unexpected symbol at ${L.formatSyntaxKind(at.kind)}: ${L.formatSymbol(Se)}`) } return Rd(ce.parent) && DS(ce.parent.parent) ? Tt.getPropertyOfType(Tt.getTypeFromTypeNode(ce.parent.parent), Se.name) : void 0 }) } let C; (Se => { Se[Se.None = 0] = "None", Se[Se.Constructor = 1] = "Constructor", Se[Se.Class = 2] = "Class" })(C || (C = {})); function P(Se) { if (!(Se.flags & 33555968)) return; let at = Se.declarations && wr(Se.declarations, Tt => !Li(Tt) && !Tc(Tt)); return at && at.symbol } class F { constructor(at, Tt, ve, nt, ce, Q, ue, G) { this.sourceFiles = at, this.sourceFilesSet = Tt, this.specialSearchKind = ve, this.checker = nt, this.cancellationToken = ce, this.searchMeaning = Q, this.options = ue, this.result = G, this.inheritsFromCache = new Map, this.markSeenContainingTypeReference = W2(), this.markSeenReExportRHS = W2(), this.symbolIdToReferences = [], this.sourceFileToSeenSymbols = [] } includesSourceFile(at) { return this.sourceFilesSet.has(at.fileName) } getImportSearches(at, Tt) { return this.importTracker || (this.importTracker = ZZ(this.sourceFiles, this.sourceFilesSet, this.checker, this.cancellationToken)), this.importTracker(at, Tt, this.options.use === 2) } createSearch(at, Tt, ve, nt = {}) { let { text: ce = u_(fc(QA(Tt) || P(Tt) || Tt)), allSearchSymbols: Q = [Tt] } = nt, ue = Bs(ce), G = this.options.implementations && at ? dr(at, Tt, this.checker) : void 0; return { symbol: Tt, comingFrom: ve, text: ce, escapedText: ue, parents: G, allSearchSymbols: Q, includes: Oe => ya(Q, Oe) } } referenceAdder(at) { let Tt = $a(at), ve = this.symbolIdToReferences[Tt]; return ve || (ve = this.symbolIdToReferences[Tt] = [], this.result.push({ definition: { type: 0, symbol: at }, references: ve })), (nt, ce) => ve.push(Ym(nt, ce)) } addStringOrCommentReference(at, Tt) { this.result.push({ definition: void 0, references: [{ kind: 0, fileName: at, textSpan: Tt }] }) } markSearchedSymbols(at, Tt) { let ve = zo(at), nt = this.sourceFileToSeenSymbols[ve] || (this.sourceFileToSeenSymbols[ve] = new Set), ce = !1; for (let Q of Tt) ce = _0(nt, $a(Q)) || ce; return ce } } function B(Se, at, Tt, ve) { let { importSearches: nt, singleReferences: ce, indirectUsers: Q } = ve.getImportSearches(at, Tt); if (ce.length) { let ue = ve.referenceAdder(at); for (let G of ce) W(G, ve) && ue(G) } for (let [ue, G] of nt) ke(ue.getSourceFile(), ve.createSearch(ue, G, 1), ve); if (Q.length) { let ue; switch (Tt.exportKind) { case 0: ue = ve.createSearch(Se, at, 1); break; case 1: ue = ve.options.use === 2 ? void 0 : ve.createSearch(Se, at, 1, { text: "default" }); break; case 2: break }if (ue) for (let G of Q) R(G, ue, ve) } } function q(Se, at, Tt, ve, nt, ce, Q, ue) { let G = ZZ(Se, new Set(Se.map(kt => kt.fileName)), at, Tt), { importSearches: Oe, indirectUsers: je, singleReferences: Ge } = G(ve, { exportKind: Q ? 1 : 0, exportingModuleSymbol: nt }, !1); for (let [kt] of Oe) ue(kt); for (let kt of Ge) Re(kt) && Mh(kt.parent) && ue(kt); for (let kt of je) for (let Kt of le(kt, Q ? "default" : ce)) { let ln = at.getSymbolAtLocation(Kt), ir = vt(ln?.declarations, ae => !!zr(ae, pc)); Re(Kt) && !eS(Kt.parent) && (ln === ve || ir) && ue(Kt) } } e.eachExportReference = q; function W(Se, at) { return Ce(Se, at) ? at.options.use !== 2 ? !0 : Re(Se) ? !(eS(Se.parent) && Se.escapedText === "default") : !1 : !1 } function Y(Se, at) { if (Se.declarations) for (let Tt of Se.declarations) { let ve = Tt.getSourceFile(); ke(ve, at.createSearch(Tt, Se, 0), at, at.includesSourceFile(ve)) } } function R(Se, at, Tt) { p$(Se).get(at.escapedText) !== void 0 && ke(Se, at, Tt) } function ie(Se, at) { return qg(Se.parent.parent) ? at.getPropertySymbolOfDestructuringAssignment(Se) : void 0 } function $(Se) { let { declarations: at, flags: Tt, parent: ve, valueDeclaration: nt } = Se; if (nt && (nt.kind === 215 || nt.kind === 228)) return nt; if (!at) return; if (Tt & 8196) { let ue = wr(at, G => cd(G, 8) || xu(G)); return ue ? cb(ue, 260) : void 0 } if (at.some(jN)) return; let ce = ve && !(Se.flags & 262144); if (ce && !(BN(ve) && !ve.globalExports)) return; let Q; for (let ue of at) { let G = e1(ue); if (Q && Q !== G || !G || G.kind === 308 && !kd(G)) return; if (Q = G, ms(Q)) { let Oe; for (; Oe = MH(Q);)Q = Oe } } return ce ? Q.getSourceFile() : Q } function fe(Se, at, Tt, ve = Tt) { return Z(Se, at, Tt, () => !0, ve) || !1 } e.isSymbolReferencedInFile = fe; function Z(Se, at, Tt, ve, nt = Tt) { let ce = Ad(Se.parent, Se.parent.parent) ? Vo(at.getSymbolsOfParameterPropertyDeclaration(Se.parent, Se.text)) : at.getSymbolAtLocation(Se); if (ce) for (let Q of le(Tt, ce.name, nt)) { if (!Re(Q) || Q === Se || Q.escapedText !== Se.escapedText) continue; let ue = at.getSymbolAtLocation(Q); if (ue === ce || at.getShorthandAssignmentValueSymbol(Q.parent) === ce || Mu(Q.parent) && Ne(Q, ue, Q.parent, at) === ce) { let G = ve(Q); if (G) return G } } } e.eachSymbolReferenceInFile = Z; function U(Se, at) { return Pr(le(at, Se), nt => !!fR(nt)).reduce((nt, ce) => { let Q = ve(ce); return !vt(nt.declarationNames) || Q === nt.depth ? (nt.declarationNames.push(ce), nt.depth = Q) : Q < nt.depth && (nt.declarationNames = [ce], nt.depth = Q), nt }, { depth: 1 / 0, declarationNames: [] }).declarationNames; function ve(nt) { let ce = 0; for (; nt;)nt = e1(nt), ce++; return ce } } e.getTopMostDeclarationNamesInFile = U; function re(Se, at, Tt, ve) { if (!Se.name || !Re(Se.name)) return !1; let nt = L.checkDefined(Tt.getSymbolAtLocation(Se.name)); for (let ce of at) for (let Q of le(ce, nt.name)) { if (!Re(Q) || Q === Se.name || Q.escapedText !== Se.name.escapedText) continue; let ue = o7(Q), G = Pa(ue.parent) && ue.parent.expression === ue ? ue.parent : void 0, Oe = Tt.getSymbolAtLocation(Q); if (Oe && Tt.getRootSymbols(Oe).some(je => je === nt) && ve(Q, G)) return !0 } return !1 } e.someSignatureUsage = re; function le(Se, at, Tt = Se) { return _e(Se, at, Tt).map(ve => ef(Se, ve)) } function _e(Se, at, Tt = Se) { let ve = []; if (!at || !at.length) return ve; let nt = Se.text, ce = nt.length, Q = at.length, ue = nt.indexOf(at, Tt.pos); for (; ue >= 0 && !(ue > Tt.end);) { let G = ue + Q; (ue === 0 || !tb(nt.charCodeAt(ue - 1), 99)) && (G === ce || !tb(nt.charCodeAt(G), 99)) && ve.push(ue), ue = nt.indexOf(at, ue + Q + 1) } return ve } function ge(Se, at) { let Tt = Se.getSourceFile(), ve = at.text, nt = Zi(le(Tt, ve, Se), ce => ce === at || DN(ce) && s7(ce, ve) === at ? Ym(ce) : void 0); return [{ definition: { type: 1, node: at }, references: nt }] } function X(Se, at) { switch (Se.kind) { case 80: if (gb(Se.parent)) return !0; case 79: return Se.text.length === at.length; case 14: case 10: { let Tt = Se; return (c7(Tt) || UX(Se) || vhe(Se) || Pa(Se.parent) && sS(Se.parent) && Se.parent.arguments[1] === Se) && Tt.text.length === at.length } case 8: return c7(Se) && Se.text.length === at.length; case 88: return at.length === 7; default: return !1 } } function Ve(Se, at) { let Tt = Uo(Se, ve => (at.throwIfCancellationRequested(), Zi(le(ve, "meta", ve), nt => { let ce = nt.parent; if (NA(ce)) return Ym(ce) }))); return Tt.length ? [{ definition: { type: 2, node: Tt[0].node }, references: Tt }] : void 0 } function we(Se, at, Tt, ve) { let nt = Uo(Se, ce => (Tt.throwIfCancellationRequested(), Zi(le(ce, Xa(at), ce), Q => { if (Q.kind === at && (!ve || ve(Q))) return Ym(Q) }))); return nt.length ? [{ definition: { type: 2, node: nt[0].node }, references: nt }] : void 0 } function ke(Se, at, Tt, ve = !0) { return Tt.cancellationToken.throwIfCancellationRequested(), Pe(Se, Se, at, Tt, ve) } function Pe(Se, at, Tt, ve, nt) { if (ve.markSearchedSymbols(at, Tt.allSearchSymbols)) for (let ce of _e(at, Tt.text, Se)) Ie(at, ce, Tt, ve, nt) } function Ce(Se, at) { return !!(ZT(Se) & at.searchMeaning) } function Ie(Se, at, Tt, ve, nt) { let ce = ef(Se, at); if (!X(ce, Tt.text)) { !ve.options.implementations && (ve.options.findInStrings && n1(Se, at) || ve.options.findInComments && Ghe(Se, at)) && ve.addStringOrCommentReference(Se.fileName, il(at, Tt.text.length)); return } if (!Ce(ce, ve)) return; let Q = ve.checker.getSymbolAtLocation(ce); if (!Q) return; let ue = ce.parent; if ($u(ue) && ue.propertyName === ce) return; if (Mu(ue)) { L.assert(ce.kind === 79), Be(ce, Q, ue, Tt, ve, nt); return } let G = Kn(Tt, Q, ce, ve); if (!G) { _t(Q, Tt, ve); return } switch (ve.specialSearchKind) { case 0: nt && ct(ce, G, ve); break; case 1: Rt(ce, Se, Tt, ve); break; case 2: We(ce, Tt, ve); break; default: L.assertNever(ve.specialSearchKind) }Yn(ce) && Wo(ce.parent) && N0(ce.parent.parent.parent) && (Q = ce.parent.symbol, !Q) || Ye(ce, Q, Tt, ve) } function Be(Se, at, Tt, ve, nt, ce, Q) { L.assert(!Q || !!nt.options.providePrefixAndSuffixTextForRename, "If alwaysGetReferences is true, then prefix/suffix text must be enabled"); let { parent: ue, propertyName: G, name: Oe } = Tt, je = ue.parent, Ge = Ne(Se, at, Tt, nt.checker); if (!Q && !ve.includes(Ge)) return; if (G ? Se === G ? (je.moduleSpecifier || kt(), ce && nt.options.use !== 2 && nt.markSeenReExportRHS(Oe) && ct(Oe, L.checkDefined(Tt.symbol), nt)) : nt.markSeenReExportRHS(Se) && kt() : nt.options.use === 2 && Oe.escapedText === "default" || kt(), !Cr(nt.options) || Q) { let ln = Se.escapedText === "default" || Tt.name.escapedText === "default" ? 1 : 0, ir = L.checkDefined(Tt.symbol), ae = eee(ir, ln, nt.checker); ae && B(Se, ir, ae, nt) } if (ve.comingFrom !== 1 && je.moduleSpecifier && !G && !Cr(nt.options)) { let Kt = nt.checker.getExportSpecifierLocalTargetSymbol(Tt); Kt && Y(Kt, nt) } function kt() { ce && ct(Se, Ge, nt) } } function Ne(Se, at, Tt, ve) { return Le(Se, Tt) && ve.getExportSpecifierLocalTargetSymbol(Tt) || at } function Le(Se, at) { let { parent: Tt, propertyName: ve, name: nt } = at; return L.assert(ve === Se || nt === Se), ve ? ve === Se : !Tt.parent.moduleSpecifier } function Ye(Se, at, Tt, ve) { let nt = GTe(Se, at, ve.checker, Tt.comingFrom === 1); if (!nt) return; let { symbol: ce } = nt; nt.kind === 0 ? Cr(ve.options) || Y(ce, ve) : B(Se, ce, nt.exportInfo, ve) } function _t({ flags: Se, valueDeclaration: at }, Tt, ve) { let nt = ve.checker.getShorthandAssignmentValueSymbol(at), ce = at && sa(at); !(Se & 33554432) && ce && Tt.includes(nt) && ct(ce, nt, ve) } function ct(Se, at, Tt) { let { kind: ve, symbol: nt } = "kind" in at ? at : { kind: void 0, symbol: at }; if (Tt.options.use === 2 && Se.kind === 88) return; let ce = Tt.referenceAdder(nt); Tt.options.implementations ? _n(Se, ce, Tt) : ce(Se, ve) } function Rt(Se, at, Tt, ve) { ZL(Se) && ct(Se, Tt.symbol, ve); let nt = () => ve.referenceAdder(Tt.symbol); if (Yr(Se.parent)) L.assert(Se.kind === 88 || Se.parent.name === Se), qe(Tt.symbol, at, nt()); else { let ce = En(Se); ce && (Qt(ce, nt()), kn(ce, ve)) } } function We(Se, at, Tt) { ct(Se, at.symbol, Tt); let ve = Se.parent; if (Tt.options.use === 2 || !Yr(ve)) return; L.assert(ve.name === Se); let nt = Tt.referenceAdder(at.symbol); for (let ce of ve.members) xA(ce) && Ca(ce) && ce.body && ce.body.forEachChild(function Q(ue) { ue.kind === 108 ? nt(ue) : !Ia(ue) && !Yr(ue) && ue.forEachChild(Q) }) } function qe(Se, at, Tt) { let ve = zt(Se); if (ve && ve.declarations) for (let nt of ve.declarations) { let ce = Yo(nt, 135, at); L.assert(nt.kind === 173 && !!ce), Tt(ce) } Se.exports && Se.exports.forEach(nt => { let ce = nt.valueDeclaration; if (ce && ce.kind === 171) { let Q = ce.body; Q && Ht(Q, 108, ue => { ZL(ue) && Tt(ue) }) } }) } function zt(Se) { return Se.members && Se.members.get("__constructor") } function Qt(Se, at) { let Tt = zt(Se.symbol); if (Tt && Tt.declarations) for (let ve of Tt.declarations) { L.assert(ve.kind === 173); let nt = ve.body; nt && Ht(nt, 106, ce => { NX(ce) && at(ce) }) } } function tn(Se) { return !!zt(Se.symbol) } function kn(Se, at) { if (tn(Se)) return; let Tt = Se.symbol, ve = at.createSearch(void 0, Tt, void 0); x(Tt, at, ve) } function _n(Se, at, Tt) { if (Rh(Se) && ri(Se.parent)) { at(Se); return } if (Se.kind !== 79) return; Se.parent.kind === 300 && vn(Se, Tt.checker, at); let ve = Gt(Se); if (ve) { at(ve); return } let nt = jn(Se, ue => !Yu(ue.parent) && !bi(ue.parent) && !_T(ue.parent)), ce = nt.parent; if (f6(ce) && ce.type === nt && Tt.markSeenContainingTypeReference(ce)) if (Jy(ce)) Q(ce.initializer); else if (Ia(ce) && ce.body) { let ue = ce.body; ue.kind === 238 ? vT(ue, G => { G.expression && Q(G.expression) }) : Q(ue) } else pT(ce) && Q(ce.expression); function Q(ue) { $n(ue) && at(ue) } } function Gt(Se) { return Re(Se) || br(Se) ? Gt(Se.parent) : Vg(Se) ? zr(Se.parent.parent, Yr) : void 0 } function $n(Se) { switch (Se.kind) { case 214: return $n(Se.expression); case 216: case 215: case 207: case 228: case 206: return !0; default: return !1 } } function ui(Se, at, Tt, ve) { if (Se === at) return !0; let nt = $a(Se) + "," + $a(at), ce = Tt.get(nt); if (ce !== void 0) return ce; Tt.set(nt, !1); let Q = !!Se.declarations && Se.declarations.some(ue => NI(ue).some(G => { let Oe = ve.getTypeAtLocation(G); return !!Oe && !!Oe.symbol && ui(Oe.symbol, at, Tt, ve) })); return Tt.set(nt, Q), Q } function Ni(Se) { let at = Ww(Se, !1); if (!at) return; let Tt = 32; switch (at.kind) { case 169: case 168: case 171: case 170: case 173: case 174: case 175: Tt &= Yy(at), at = at.parent; break; default: return }let ve = at.getSourceFile(), nt = Zi(le(ve, "super", at), ce => { if (ce.kind !== 106) return; let Q = Ww(ce, !1); return Q && Ca(Q) === !!Tt && Q.parent.symbol === at.symbol ? Ym(ce) : void 0 }); return [{ definition: { type: 0, symbol: at.symbol }, references: nt }] } function Pi(Se) { return Se.kind === 79 && Se.parent.kind === 166 && Se.parent.name === Se } function gr(Se, at, Tt) { let ve = Ku(Se, !1, !1), nt = 32; switch (ve.kind) { case 171: case 170: if (s_(ve)) { nt &= Yy(ve), ve = ve.parent; break } case 169: case 168: case 173: case 174: case 175: nt &= Yy(ve), ve = ve.parent; break; case 308: if (Lc(ve) || Pi(Se)) return; case 259: case 215: break; default: return }let ce = Uo(ve.kind === 308 ? at : [ve.getSourceFile()], ue => (Tt.throwIfCancellationRequested(), le(ue, "this", Li(ve) ? ue : ve).filter(G => { if (!H2(G)) return !1; let Oe = Ku(G, !1, !1); if (!$p(Oe)) return !1; switch (ve.kind) { case 215: case 259: return ve.symbol === Oe.symbol; case 171: case 170: return s_(ve) && ve.symbol === Oe.symbol; case 228: case 260: case 207: return Oe.parent && $p(Oe.parent) && ve.symbol === Oe.parent.symbol && Ca(Oe) === !!nt; case 308: return Oe.kind === 308 && !Lc(Oe) && !Pi(G) } }))).map(ue => Ym(ue)); return [{ definition: { type: 3, node: ks(ce, ue => ha(ue.node.parent) ? ue.node : void 0) || Se }, references: ce }] } function pt(Se, at, Tt, ve) { let nt = f7(Se, Tt), ce = Uo(at, Q => (ve.throwIfCancellationRequested(), Zi(le(Q, Se.text), ue => { if (es(ue) && ue.text === Se.text) if (nt) { let G = f7(ue, Tt); if (nt !== Tt.getStringType() && nt === G) return Ym(ue, 2) } else return IS(ue) && !DT(ue, Q) ? void 0 : Ym(ue, 2) }))); return [{ definition: { type: 4, node: Se }, references: ce }] } function nn(Se, at, Tt, ve, nt, ce) { let Q = []; return Dt(Se, at, Tt, ve, !(ve && nt), (ue, G, Oe) => { Oe && An(Se) !== An(Oe) && (Oe = void 0), Q.push(Oe || G || ue) }, () => !ce), Q } function Dt(Se, at, Tt, ve, nt, ce, Q) { let ue = nP(at); if (ue) { let ln = Tt.getShorthandAssignmentValueSymbol(at.parent); if (ln && ve) return ce(ln, void 0, void 0, 3); let ir = Tt.getContextualType(ue.parent), ae = ir && ks(_5(ue, Tt, ir, !0), oe => kt(oe, 4)); if (ae) return ae; let rt = ie(at, Tt), Ot = rt && ce(rt, void 0, void 0, 4); if (Ot) return Ot; let Ke = ln && ce(ln, void 0, void 0, 3); if (Ke) return Ke } let G = s(at, Se, Tt); if (G) { let ln = ce(G, void 0, void 0, 1); if (ln) return ln } let Oe = kt(Se); if (Oe) return Oe; if (Se.valueDeclaration && Ad(Se.valueDeclaration, Se.valueDeclaration.parent)) { let ln = Tt.getSymbolsOfParameterPropertyDeclaration(Ga(Se.valueDeclaration, ha), Se.name); return L.assert(ln.length === 2 && !!(ln[0].flags & 1) && !!(ln[1].flags & 4)), kt(Se.flags & 1 ? ln[1] : ln[0]) } let je = nc(Se, 278); if (!ve || je && !je.propertyName) { let ln = je && Tt.getExportSpecifierLocalTargetSymbol(je); if (ln) { let ir = ce(ln, void 0, void 0, 1); if (ir) return ir } } if (!ve) { let ln; return nt ? ln = jN(at.parent) ? I7(Tt, at.parent) : void 0 : ln = Kt(Se, Tt), ln && kt(ln, 4) } if (L.assert(ve), nt) { let ln = Kt(Se, Tt); return ln && kt(ln, 4) } function kt(ln, ir) { return ks(Tt.getRootSymbols(ln), ae => ce(ln, ae, void 0, ir) || (ae.parent && ae.parent.flags & 96 && Q(ae) ? pn(ae.parent, ae.name, Tt, rt => ce(ln, ae, rt, ir)) : void 0)) } function Kt(ln, ir) { let ae = nc(ln, 205); if (ae && jN(ae)) return I7(ir, ae) } } function pn(Se, at, Tt, ve) { let nt = new Map; return ce(Se); function ce(Q) { if (!(!(Q.flags & 96) || !V_(nt, $a(Q)))) return ks(Q.declarations, ue => ks(NI(ue), G => { let Oe = Tt.getTypeAtLocation(G), je = Oe && Oe.symbol && Tt.getPropertyOfType(Oe, at); return Oe && je && (ks(Tt.getRootSymbols(je), ve) || ce(Oe.symbol)) })) } } function An(Se) { return Se.valueDeclaration ? !!(uu(Se.valueDeclaration) & 32) : !1 } function Kn(Se, at, Tt, ve) { let { checker: nt } = ve; return Dt(at, Tt, nt, !1, ve.options.use !== 2 || !!ve.options.providePrefixAndSuffixTextForRename, (ce, Q, ue, G) => (ue && An(at) !== An(ue) && (ue = void 0), Se.includes(ue || Q || ce) ? { symbol: Q && !(ac(ce) & 6) ? Q : ce, kind: G } : void 0), ce => !(Se.parents && !Se.parents.some(Q => ui(ce.parent, Q, ve.inheritsFromCache, nt)))) } function hi(Se, at) { let Tt = ZT(Se), { declarations: ve } = at; if (ve) { let nt; do { nt = Tt; for (let ce of ve) { let Q = LN(ce); Q & Tt && (Tt |= Q) } } while (Tt !== nt) } return Tt } e.getIntersectingMeaningFromDeclarations = hi; function ri(Se) { return Se.flags & 16777216 ? !(ku(Se) || Ep(Se)) : PA(Se) ? Jy(Se) : Ds(Se) ? !!Se.body : Yr(Se) || Ow(Se) } function vn(Se, at, Tt) { let ve = at.getSymbolAtLocation(Se), nt = at.getShorthandAssignmentValueSymbol(ve.valueDeclaration); if (nt) for (let ce of nt.getDeclarations()) LN(ce) & 1 && Tt(ce) } e.getReferenceEntriesForShorthandPropertyAssignment = vn; function Ht(Se, at, Tt) { pa(Se, ve => { ve.kind === at && Tt(ve), Ht(ve, at, Tt) }) } function En(Se) { return lW(o7(Se).parent) } function dr(Se, at, Tt) { let ve = j2(Se) ? Se.parent : void 0, nt = ve && Tt.getTypeAtLocation(ve.expression), ce = Zi(nt && (nt.isUnionOrIntersection() ? nt.types : nt.symbol === at.parent ? void 0 : [nt]), Q => Q.symbol && Q.symbol.flags & 96 ? Q.symbol : void 0); return ce.length === 0 ? void 0 : ce } function Cr(Se) { return Se.use === 2 && Se.providePrefixAndSuffixTextForRename } })(u1 || (u1 = {})) } }), js = {}; Mo(js, { Core: () => u1, DefinitionKind: () => oee, EntryKind: () => see, ExportKind: () => nee, FindReferencesUse: () => cee, ImportExport: () => ree, createImportTracker: () => ZZ, findModuleReferences: () => PTe, findReferenceOrRenameEntries: () => BBe, findReferencedSymbols: () => MBe, getContextNode: () => sE, getExportInfo: () => eee, getImplementationsAtPosition: () => GBe, getImportOrExportSymbol: () => GTe, getReferenceEntriesForNode: () => VTe, getTextSpanOfEntry: () => aee, isContextWithStartAndEndNode: () => BTe, isDeclarationOfSymbol: () => JTe, nodeEntry: () => Ym, toContextSpan: () => iee, toHighlightSpan: () => JBe, toReferenceEntry: () => WTe, toRenameLocation: () => VBe }); var KTe = gt({ "src/services/_namespaces/ts.FindAllReferences.ts"() { "use strict"; NBe(), qBe() } }); function qTe(e, t, r, i, o) { var s, l; let f = YTe(t, r, e), d = f && [rUe(f.reference.fileName, f.fileName, f.unverified)] || Je; if (f?.file) return d; let g = ef(t, r); if (g === t) return; let { parent: m } = g, v = e.getTypeChecker(); if (g.kind === 161 || Re(g) && g3(m) && m.tagName === g) return YBe(v, g) || Je; if (DN(g)) { let C = s7(g.parent, g.text); return C ? [uee(v, C, "label", g.text, void 0)] : void 0 } if (g.kind === 105) { let C = jn(g.parent, P => oc(P) ? "quit" : Ds(P)); return C ? [TP(v, C)] : void 0 } if (g.kind === 133) { let C = jn(g, F => Ds(F)); return C && vt(C.modifiers, F => F.kind === 132) ? [TP(v, C)] : void 0 } if (g.kind === 125) { let C = jn(g, F => Ds(F)); return C && C.asteriskToken ? [TP(v, C)] : void 0 } if (LS(g) && oc(g.parent)) { let C = g.parent.parent, { symbol: P, failedAliasResolution: F } = cG(C, v, o), B = Pr(C.members, oc), q = P ? v.symbolToString(P, C) : "", W = g.getSourceFile(); return on(B, Y => { let { pos: R } = yp(Y); return R = xo(W.text, R), uee(v, Y, "constructor", "static {}", q, !1, F, { start: R, length: 6 }) }) } let { symbol: S, failedAliasResolution: x } = cG(g, v, o), A = g; if (i && x) { let C = mn([g, ...S?.declarations || Je], F => jn(F, Wse)), P = C && iR(C); P && ({ symbol: S, failedAliasResolution: x } = cG(P, v, o), A = P) } if (!S && C7(A)) { let C = (l = (s = t.resolvedModules) == null ? void 0 : s.get(A.text, W_(t, A))) == null ? void 0 : l.resolvedModule; if (C) return [{ name: A.text, fileName: C.resolvedFileName, containerName: void 0, containerKind: void 0, kind: "script", textSpan: il(0, 0), failedAliasResolution: x, isAmbient: Fu(C.resolvedFileName), unverified: A !== g }] } if (!S) return Qi(d, eUe(g, v)); if (i && Ji(S.declarations, C => C.getSourceFile().fileName === t.fileName)) return; let w = aUe(v, g); if (w && !(Au(g.parent) && oUe(w))) { let C = TP(v, w, x); if (v.getRootSymbols(S).some(P => XBe(P, w))) return [C]; { let P = nC(v, S, g, x, w) || Je; return g.kind === 106 ? [C, ...P] : [...P, C] } } if (g.parent.kind === 300) { let C = v.getShorthandAssignmentValueSymbol(S.valueDeclaration), P = C?.declarations ? C.declarations.map(F => Sk(F, v, C, g, !1, x)) : Je; return Qi(P, XTe(v, g) || Je) } if (Ys(g) && Wo(m) && cm(m.parent) && g === (m.propertyName || m.name)) { let C = VN(g), P = v.getTypeAtLocation(m.parent); return C === void 0 ? Je : Uo(P.isUnion() ? P.types : [P], F => { let B = F.getProperty(C); return B && nC(v, B, g) }) } return Qi(d, XTe(v, g) || nC(v, S, g, x)) } function XBe(e, t) { var r; return e === t.symbol || e === t.symbol.parent || Iu(t.parent) || !rS(t.parent) && e === ((r = zr(t.parent, $p)) == null ? void 0 : r.symbol) } function XTe(e, t) { let r = nP(t); if (r) { let i = r && e.getContextualType(r.parent); if (i) return Uo(_5(r, e, i, !1), o => nC(e, o, t)) } } function YBe(e, t) { let r = jn(t, _l); if (!(r && r.name)) return; let i = jn(r, Yr); if (!i) return; let o = hp(i); if (!o) return; let s = vs(o.expression), l = _u(s) ? s.symbol : e.getSymbolAtLocation(s); if (!l) return; let f = Gi(wA(r.name)), d = zc(r) ? e.getPropertyOfType(e.getTypeOfSymbol(l), f) : e.getPropertyOfType(e.getDeclaredTypeOfSymbol(l), f); if (d) return nC(e, d, t) } function YTe(e, t, r) { var i, o, s, l; let f = rC(e.referencedFiles, t); if (f) { let m = r.getSourceFileFromReference(e, f); return m && { reference: f, fileName: m.fileName, file: m, unverified: !1 } } let d = rC(e.typeReferenceDirectives, t); if (d) { let m = (i = r.getResolvedTypeReferenceDirectives().get(d.fileName, d.resolutionMode || e.impliedNodeFormat)) == null ? void 0 : i.resolvedTypeReferenceDirective, v = m && r.getSourceFile(m.resolvedFileName); return v && { reference: d, fileName: v.fileName, file: v, unverified: !1 } } let g = rC(e.libReferenceDirectives, t); if (g) { let m = r.getLibFileFromReference(g); return m && { reference: g, fileName: m.fileName, file: m, unverified: !1 } } if ((o = e.resolvedModules) != null && o.size()) { let m = nk(e, t); if (C7(m) && fl(m.text) && e.resolvedModules.has(m.text, W_(e, m))) { let v = (l = (s = e.resolvedModules.get(m.text, W_(e, m))) == null ? void 0 : s.resolvedModule) == null ? void 0 : l.resolvedFileName, S = v || Fy(ni(e.fileName), m.text); return { file: r.getSourceFile(S), fileName: S, reference: { pos: m.getStart(), end: m.getEnd(), fileName: m.text }, unverified: !v } } } } function $Be(e, t, r) { let i = ef(t, r); if (i === t) return; if (NA(i.parent) && i.parent.name === i) return lee(e.getTypeAtLocation(i.parent), e, i.parent, !1); let { symbol: o, failedAliasResolution: s } = cG(i, e, !1); if (!o) return; let l = e.getTypeOfSymbolAtLocation(o, i), f = QBe(o, l, e), d = f && lee(f, e, i, s), g = d && d.length !== 0 ? d : lee(l, e, i, s); return g.length ? g : !(o.flags & 111551) && o.flags & 788968 ? nC(e, wd(o, e), i, s) : void 0 } function lee(e, t, r, i) { return Uo(e.isUnion() && !(e.flags & 32) ? e.types : [e], o => o.symbol && nC(t, o.symbol, r, i)) } function QBe(e, t, r) { if (t.symbol === e || e.valueDeclaration && t.symbol && wi(e.valueDeclaration) && e.valueDeclaration.initializer === t.symbol.valueDeclaration) { let i = t.getCallSignatures(); if (i.length === 1) return r.getReturnTypeOfSignature(Vo(i)) } } function ZBe(e, t, r) { let i = qTe(e, t, r); if (!i || i.length === 0) return; let o = rC(t.referencedFiles, r) || rC(t.typeReferenceDirectives, r) || rC(t.libReferenceDirectives, r); if (o) return { definitions: i, textSpan: lv(o) }; let s = ef(t, r), l = il(s.getStart(), s.getWidth()); return { definitions: i, textSpan: l } } function eUe(e, t) { return Zi(t.getIndexInfosAtLocation(e), r => r.declaration && TP(t, r.declaration)) } function cG(e, t, r) { let i = t.getSymbolAtLocation(e), o = !1; if (i?.declarations && i.flags & 2097152 && !r && tUe(e, i.declarations[0])) { let s = t.getAliasedSymbol(i); if (s.declarations) return { symbol: s }; o = !0 } return { symbol: i, failedAliasResolution: o } } function tUe(e, t) { return e.kind !== 79 ? !1 : e.parent === t ? !0 : t.kind !== 271 } function nUe(e) { if (!RI(e)) return !1; let t = jn(e, r => Iu(r) ? !0 : RI(r) ? !1 : "quit"); return !!t && ic(t) === 5 } function nC(e, t, r, i, o) { let s = Pr(t.declarations, v => v !== o), l = Pr(s, v => !nUe(v)), f = vt(l) ? l : s; return d() || g() || on(f, v => Sk(v, e, t, r, !1, i)); function d() { if (t.flags & 32 && !(t.flags & 19) && (ZL(r) || r.kind === 135)) { let v = wr(s, Yr) || L.fail("Expected declaration to have at least one class-like declaration"); return m(v.members, !0) } } function g() { return PX(r) || VX(r) ? m(s, !1) : void 0 } function m(v, S) { if (!v) return; let x = v.filter(S ? Ec : Ia), A = x.filter(w => !!w.body); return x.length ? A.length !== 0 ? A.map(w => Sk(w, e, t, r)) : [Sk(To(x), e, t, r, !1, i)] : void 0 } } function Sk(e, t, r, i, o, s) { let l = t.symbolToString(r), f = $g.getSymbolKind(t, r, i), d = r.parent ? t.symbolToString(r.parent, i) : ""; return uee(t, e, f, l, d, o, s) } function uee(e, t, r, i, o, s, l, f) { let d = t.getSourceFile(); if (!f) { let g = sa(t) || t; f = Du(g, d) } return { fileName: d.fileName, textSpan: f, kind: r, name: i, containerKind: void 0, containerName: o, ...js.toContextSpan(f, d, js.getContextNode(t)), isLocal: !dee(e, t), isAmbient: !!(t.flags & 16777216), unverified: s, failedAliasResolution: l } } function dee(e, t) { if (e.isDeclarationVisible(t)) return !0; if (!t.parent) return !1; if (Jy(t.parent) && t.parent.initializer === t) return dee(e, t.parent); switch (t.kind) { case 169: case 174: case 175: case 171: if (cd(t, 8)) return !1; case 173: case 299: case 300: case 207: case 228: case 216: case 215: return dee(e, t.parent); default: return !1 } } function TP(e, t, r) { return Sk(t, e, t.symbol, t, !1, r) } function rC(e, t) { return wr(e, r => Y8(r, t)) } function rUe(e, t, r) { return { fileName: t, textSpan: Wc(0, 0), kind: "script", name: e, containerName: void 0, containerKind: void 0, unverified: r } } function iUe(e) { let t = jn(e, i => !j2(i)), r = t?.parent; return r && rS(r) && P6(r) === t ? r : void 0 } function aUe(e, t) { let r = iUe(t), i = r && e.getResolvedSignature(r); return zr(i && i.declaration, o => Ia(o) && !Jm(o)) } function oUe(e) { switch (e.kind) { case 173: case 182: case 177: return !0; default: return !1 } } var sUe = gt({ "src/services/goToDefinition.ts"() { "use strict"; Fr() } }), xk = {}; Mo(xk, { createDefinitionInfo: () => Sk, findReferenceInPosition: () => rC, getDefinitionAndBoundSpan: () => ZBe, getDefinitionAtPosition: () => qTe, getReferenceAtPosition: () => YTe, getTypeDefinitionAtPosition: () => $Be }); var cUe = gt({ "src/services/_namespaces/ts.GoToDefinition.ts"() { "use strict"; sUe() } }); function lUe(e) { return e.includeInlayParameterNameHints === "literals" || e.includeInlayParameterNameHints === "all" } function uUe(e) { return e.includeInlayParameterNameHints === "literals" } function dUe(e) { let { file: t, program: r, span: i, cancellationToken: o, preferences: s } = e, l = t.text, f = r.getCompilerOptions(), d = r.getTypeChecker(), g = []; return m(t), g; function m(le) { if (!(!le || le.getFullWidth() === 0)) { switch (le.kind) { case 264: case 260: case 261: case 259: case 228: case 215: case 171: case 216: o.throwIfCancellationRequested() }if ($8(i, le.pos, le.getFullWidth()) && !(bi(le) && !Vg(le))) return s.includeInlayVariableTypeHints && wi(le) || s.includeInlayPropertyDeclarationTypeHints && Na(le) ? P(le) : s.includeInlayEnumMemberValueHints && q0(le) ? w(le) : lUe(s) && (Pa(le) || z0(le)) ? F(le) : (s.includeInlayFunctionParameterTypeHints && Ds(le) && b4(le) && ie(le), s.includeInlayFunctionLikeReturnTypeHints && v(le) && Y(le)), pa(le, m) } } function v(le) { return xs(le) || ms(le) || Jc(le) || Nc(le) || p_(le) } function S(le, _e, ge) { g.push({ text: `${ge ? "..." : ""}${fe(le, lG)}:`, position: _e, kind: "Parameter", whitespaceAfter: !0 }) } function x(le, _e) { g.push({ text: `: ${fe(le, lG)}`, position: _e, kind: "Type", whitespaceBefore: !0 }) } function A(le, _e) { g.push({ text: `= ${fe(le, lG)}`, position: _e, kind: "Enum", whitespaceBefore: !0 }) } function w(le) { if (le.initializer) return; let _e = d.getConstantValue(le); _e !== void 0 && A(_e.toString(), le.end) } function C(le) { return le.symbol && le.symbol.flags & 1536 } function P(le) { if (!le.initializer || La(le.name) || wi(le) && !re(le) || Cl(le)) return; let ge = d.getTypeAtLocation(le); if (C(ge)) return; let X = Z(ge); if (X) { if (s.includeInlayVariableTypeHintsWhenTypeMatchesName === !1 && W1(le.name.getText(), X)) return; x(X, le.name.end) } } function F(le) { let _e = le.arguments; if (!_e || !_e.length) return; let ge = [], X = d.getResolvedSignatureForSignatureHelp(le, ge); if (!(!X || !ge.length)) for (let Ve = 0; Ve < _e.length; ++Ve) { let we = _e[Ve], ke = vs(we); if (uUe(s) && !W(ke)) continue; let Pe = d.getParameterIdentifierNameAtPosition(X, Ve); if (Pe) { let [Ce, Ie] = Pe; if (!(s.includeInlayParameterNameHintsWhenArgumentMatchesName || !B(ke, Ce)) && !Ie) continue; let Ne = Gi(Ce); if (q(ke, Ne)) continue; S(Ne, we.getStart(), Ie) } } } function B(le, _e) { return Re(le) ? le.text === _e : br(le) ? le.name.text === _e : !1 } function q(le, _e) { if (!i_(_e, f.target, RR(t.scriptKind))) return !1; let ge = Nm(l, le.pos); if (!ge?.length) return !1; let X = $Te(_e); return vt(ge, Ve => X.test(l.substring(Ve.pos, Ve.end))) } function W(le) { switch (le.kind) { case 221: { let _e = le.operand; return fT(_e) || Re(_e) && cL(_e.escapedText) } case 110: case 95: case 104: case 14: case 225: return !0; case 79: { let _e = le.escapedText; return U(_e) || cL(_e) } }return fT(le) } function Y(le) { if (xs(le) && !Yo(le, 20, t) || U_(le) || !le.body) return; let ge = d.getSignatureFromDeclaration(le); if (!ge) return; let X = d.getReturnTypeOfSignature(ge); if (C(X)) return; let Ve = Z(X); Ve && x(Ve, R(le)) } function R(le) { let _e = Yo(le, 21, t); return _e ? _e.end : le.parameters.end } function ie(le) { let _e = d.getSignatureFromDeclaration(le); if (_e) for (let ge = 0; ge < le.parameters.length && ge < _e.parameters.length; ++ge) { let X = le.parameters[ge]; if (!re(X) || Cl(X)) continue; let we = $(_e.parameters[ge]); we && x(we, X.questionToken ? X.questionToken.end : X.name.end) } } function $(le) { let _e = le.valueDeclaration; if (!_e || !ha(_e)) return; let ge = d.getTypeOfSymbolAtLocation(le, _e); if (!C(ge)) return Z(ge) } function fe(le, _e) { return le.length > _e ? le.substr(0, _e - 3) + "..." : le } function Z(le) { let ge = rE(); return SI(X => { let Ve = d.typeToTypeNode(le, void 0, 71286784); L.assertIsDefined(Ve, "should always get typenode"), ge.writeNode(4, Ve, t, X) }) } function U(le) { return le === "undefined" } function re(le) { if ((CT(le) || wi(le) && kh(le)) && le.initializer) { let _e = vs(le.initializer); return !(W(_e) || z0(_e) || rs(_e) || pT(_e)) } return !0 } } var lG, $Te, fUe = gt({ "src/services/inlayHints.ts"() { "use strict"; Fr(), lG = 30, $Te = e => new RegExp(`^\\s?/\\*\\*?\\s?${e}\\s?\\*\\/\\s?$`) } }), fee = {}; Mo(fee, { provideInlayHints: () => dUe }); var _Ue = gt({ "src/services/_namespaces/ts.InlayHints.ts"() { "use strict"; fUe() } }); function pUe(e, t) { let r = []; return lY(e, i => { for (let o of hUe(i)) { let s = dm(o) && o.tags && wr(o.tags, f => f.kind === 330 && (f.tagName.escapedText === "inheritDoc" || f.tagName.escapedText === "inheritdoc")); if (o.comment === void 0 && !s || dm(o) && i.kind !== 349 && i.kind !== 341 && o.tags && o.tags.some(f => f.kind === 349 || f.kind === 341) && !o.tags.some(f => f.kind === 344 || f.kind === 345)) continue; let l = o.comment ? ux(o.comment, t) : []; s && s.comment && (l = l.concat(ux(s.comment, t))), ya(r, l, mUe) || r.push(l) } }), t_(DU(r, [K2()])) } function mUe(e, t) { return GD(e, t, (r, i) => r.kind === i.kind && r.text === i.text) } function hUe(e) { switch (e.kind) { case 344: case 351: return [e]; case 341: case 349: return [e, e.parent]; default: return PH(e) } } function gUe(e, t) { let r = []; return lY(e, i => { let o = A0(i); if (!(o.some(s => s.kind === 349 || s.kind === 341) && !o.some(s => s.kind === 344 || s.kind === 345))) for (let s of o) r.push({ name: s.tagName.text, text: yUe(s, t) }) }), r } function ux(e, t) { return typeof e == "string" ? [tf(e)] : Uo(e, r => r.kind === 324 ? [tf(r.text)] : Qhe(r, t)) } function yUe(e, t) { let { comment: r, kind: i } = e, o = vUe(i); switch (i) { case 352: let f = e.typeExpression; return f ? s(f) : r === void 0 ? void 0 : ux(r, t); case 332: return s(e.class); case 331: return s(e.class); case 348: let d = e, g = []; if (d.constraint && g.push(tf(d.constraint.getText())), Fn(d.typeParameters)) { Fn(g) && g.push(Qs()); let v = d.typeParameters[d.typeParameters.length - 1]; mn(d.typeParameters, S => { g.push(o(S.getText())), v !== S && g.push(Yl(27), Qs()) }) } return r && g.push(Qs(), ...ux(r, t)), g; case 347: case 353: return s(e.typeExpression); case 349: case 341: case 351: case 344: case 350: let { name: m } = e; return m ? s(m) : r === void 0 ? void 0 : ux(r, t); default: return r === void 0 ? void 0 : ux(r, t) }function s(f) { return l(f.getText()) } function l(f) { return r ? f.match(/^https?$/) ? [tf(f), ...ux(r, t)] : [o(f), Qs(), ...ux(r, t)] : [tf(f)] } } function vUe(e) { switch (e) { case 344: return Khe; case 351: return qhe; case 348: return Yhe; case 349: case 341: return Xhe; default: return tf } } function bUe() { return ZTe || (ZTe = on(pee, e => ({ name: e, kind: "keyword", kindModifiers: "", sortText: lx.SortText.LocationPriority }))) } function EUe() { return e1e || (e1e = on(pee, e => ({ name: `@${e}`, kind: "keyword", kindModifiers: "", sortText: lx.SortText.LocationPriority }))) } function QTe(e) { return { name: e, kind: "", kindModifiers: "", displayParts: [tf(e)], documentation: Je, tags: void 0, codeActions: void 0 } } function TUe(e) { if (!Re(e.name)) return Je; let t = e.name.text, r = e.parent, i = r.parent; return Ia(i) ? Zi(i.parameters, o => { if (!Re(o.name)) return; let s = o.name.text; if (!(r.tags.some(l => l !== e && xp(l) && Re(l.name) && l.name.escapedText === s) || t !== void 0 && !na(s, t))) return { name: s, kind: "parameter", kindModifiers: "", sortText: lx.SortText.LocationPriority } }) : [] } function SUe(e) { return { name: e, kind: "parameter", kindModifiers: "", displayParts: [tf(e)], documentation: Je, tags: void 0, codeActions: void 0 } } function xUe(e, t, r, i) { let o = Vi(t, r), s = jn(o, dm); if (s && (s.comment !== void 0 || Fn(s.tags))) return; let l = o.getStart(t); if (!s && l < r) return; let f = LUe(o, i); if (!f) return; let { commentOwner: d, parameters: g, hasReturn: m } = f, v = Kd(d) && d.jsDoc ? d.jsDoc : void 0, S = Os(v); if (d.getStart(t) < r || S && s && S !== s) return; let x = AUe(t, r), A = ES(t.fileName), w = (g ? CUe(g || [], A, x, e) : "") + (m ? IUe(x, e) : ""), C = "/**", P = " */", F = (v || []).some(B => !!B.tags); if (w && !F) { let B = C + e + x + " * ", q = l === r ? e + x : ""; return { newText: B + e + w + x + P + q, caretOffset: B.length } } return { newText: C + P, caretOffset: 3 } } function AUe(e, t) { let { text: r } = e, i = Wf(t, e), o = i; for (; o <= t && Yp(r.charCodeAt(o)); o++); return r.slice(i, o) } function CUe(e, t, r, i) { return e.map(({ name: o, dotDotDotToken: s }, l) => { let f = o.kind === 79 ? o.text : "param" + l; return `${r} * @param ${t ? s ? "{...any} " : "{any} " : ""}${f}${i}` }).join("") } function IUe(e, t) { return `${e} * @returns${t}` } function LUe(e, t) { return Lse(e, r => _ee(r, t)) } function _ee(e, t) { switch (e.kind) { case 259: case 215: case 171: case 173: case 170: case 216: let r = e; return { commentOwner: e, parameters: r.parameters, hasReturn: SP(r, t) }; case 299: return _ee(e.initializer, t); case 260: case 261: case 263: case 302: case 262: return { commentOwner: e }; case 168: { let o = e; return o.type && Jm(o.type) ? { commentOwner: e, parameters: o.type.parameters, hasReturn: SP(o.type, t) } : { commentOwner: e } } case 240: { let s = e.declarationList.declarations, l = s.length === 1 && s[0].initializer ? kUe(s[0].initializer) : void 0; return l ? { commentOwner: e, parameters: l.parameters, hasReturn: SP(l, t) } : { commentOwner: e } } case 308: return "quit"; case 264: return e.parent.kind === 264 ? void 0 : { commentOwner: e }; case 241: return _ee(e.expression, t); case 223: { let o = e; return ic(o) === 0 ? "quit" : Ia(o.right) ? { commentOwner: e, parameters: o.right.parameters, hasReturn: SP(o.right, t) } : { commentOwner: e } } case 169: let i = e.initializer; if (i && (ms(i) || xs(i))) return { commentOwner: e, parameters: i.parameters, hasReturn: SP(i, t) } } } function SP(e, t) { return !!t?.generateReturnInDocTemplate && (Jm(e) || xs(e) && ot(e.body) || Ds(e) && e.body && Va(e.body) && !!vT(e.body, r => r)) } function kUe(e) { for (; e.kind === 214;)e = e.expression; switch (e.kind) { case 215: case 216: return e; case 228: return wr(e.members, Ec) } } var pee, ZTe, e1e, t1e, DUe = gt({ "src/services/jsDoc.ts"() { "use strict"; Fr(), pee = ["abstract", "access", "alias", "argument", "async", "augments", "author", "borrows", "callback", "class", "classdesc", "constant", "constructor", "constructs", "copyright", "default", "deprecated", "description", "emits", "enum", "event", "example", "exports", "extends", "external", "field", "file", "fileoverview", "fires", "function", "generator", "global", "hideconstructor", "host", "ignore", "implements", "inheritdoc", "inner", "instance", "interface", "kind", "lends", "license", "link", "linkcode", "linkplain", "listens", "member", "memberof", "method", "mixes", "module", "name", "namespace", "overload", "override", "package", "param", "private", "prop", "property", "protected", "public", "readonly", "requires", "returns", "satisfies", "see", "since", "static", "summary", "template", "this", "throws", "todo", "tutorial", "type", "typedef", "var", "variation", "version", "virtual", "yields"], t1e = QTe } }), xb = {}; Mo(xb, { getDocCommentTemplateAtPosition: () => xUe, getJSDocParameterNameCompletionDetails: () => SUe, getJSDocParameterNameCompletions: () => TUe, getJSDocTagCompletionDetails: () => QTe, getJSDocTagCompletions: () => EUe, getJSDocTagNameCompletionDetails: () => t1e, getJSDocTagNameCompletions: () => bUe, getJsDocCommentsFromDeclarations: () => pUe, getJsDocTagsFromDeclarations: () => gUe }); var wUe = gt({ "src/services/_namespaces/ts.JsDoc.ts"() { "use strict"; DUe() } }); function RUe(e, t, r, i, o, s) { let l = nr.ChangeTracker.fromContext({ host: r, formatContext: t, preferences: o }), f = s === "SortAndCombine" || s === "All", d = f, g = s === "RemoveUnused" || s === "All", m = mee(e, e.statements.filter(gl)), v = XUe(o, f ? () => i1e(m, o) === 2 : void 0), S = A => (g && (A = NUe(A, e, i)), d && (A = n1e(A, v, e)), f && (A = Ag(A, (w, C) => bee(w, C, v))), A); if (m.forEach(A => x(A, S)), s !== "RemoveUnused") { let A = e.statements.filter(Il); x(A, w => hee(w, v)) } for (let A of e.statements.filter(lu)) { if (!A.body) continue; if (mee(e, A.body.statements.filter(gl)).forEach(C => x(C, S)), s !== "RemoveUnused") { let C = A.body.statements.filter(Il); x(C, P => hee(P, v)) } } return l.getChanges(); function x(A, w) { if (Fn(A) === 0) return; D7(A[0]); let C = d ? YC(A, B => xP(B.moduleSpecifier)) : [A], P = f ? Ag(C, (B, q) => yee(B[0].moduleSpecifier, q[0].moduleSpecifier, v)) : C, F = Uo(P, B => xP(B[0].moduleSpecifier) ? w(B) : B); if (F.length === 0) l.deleteNodes(e, A, { leadingTriviaOption: nr.LeadingTriviaOption.Exclude, trailingTriviaOption: nr.TrailingTriviaOption.Include }, !0); else { let B = { leadingTriviaOption: nr.LeadingTriviaOption.Exclude, trailingTriviaOption: nr.TrailingTriviaOption.Include, suffix: bb(r, t.options) }; l.replaceNodeWithNodes(e, A[0], F, B); let q = l.nodeHasTrailingComment(e, A[0], B); l.deleteNodes(e, A.slice(1), { trailingTriviaOption: nr.TrailingTriviaOption.Include }, q) } } } function mee(e, t) { let r = kg(e.languageVersion, !1, e.languageVariant), i = [], o = 0; for (let s of t) i[o] && OUe(e, s, r) && o++, i[o] || (i[o] = []), i[o].push(s); return i } function OUe(e, t, r) { let i = t.getFullStart(), o = t.getStart(); r.setText(e.text, i, o - i); let s = 0; for (; r.getTokenPos() < o;)if (r.scan() === 4 && (s++, s >= 2)) return !0; return !1 } function NUe(e, t, r) { let i = r.getTypeChecker(), o = r.getCompilerOptions(), s = i.getJsxNamespace(t), l = i.getJsxFragmentFactory(t), f = !!(t.transformFlags & 2), d = []; for (let m of e) { let { importClause: v, moduleSpecifier: S } = m; if (!v) { d.push(m); continue } let { name: x, namedBindings: A } = v; if (x && !g(x) && (x = void 0), A) if (nv(A)) g(A.name) || (A = void 0); else { let w = A.elements.filter(C => g(C.name)); w.length < A.elements.length && (A = w.length ? D.updateNamedImports(A, w) : void 0) } x || A ? d.push(Ak(m, x, A)) : PUe(t, S) && (t.isDeclarationFile ? d.push(D.createImportDeclaration(m.modifiers, void 0, S, void 0)) : d.push(m)) } return d; function g(m) { return f && (m.text === s || l && m.text === l) && wY(o.jsx) || js.Core.isSymbolReferencedInFile(m, i, t) } } function PUe(e, t) { let r = yo(t) && t.text; return Ta(r) && vt(e.moduleAugmentations, i => yo(i) && i.text === r) } function xP(e) { return e !== void 0 && es(e) ? e.text : void 0 } function MUe(e, t, r) { let i = uG(t); return n1e(e, i, r) } function n1e(e, t, r) { if (e.length === 0) return e; let { importWithoutClause: i, typeOnlyImports: o, regularImports: s } = FUe(e), l = []; i && l.push(i); for (let f of [s, o]) { let d = f === o, { defaultImports: g, namespaceImports: m, namedImports: v } = f; if (!d && g.length === 1 && m.length === 1 && v.length === 0) { let q = g[0]; l.push(Ak(q, q.importClause.name, m[0].importClause.namedBindings)); continue } let S = Ag(m, (q, W) => t(q.importClause.namedBindings.name.text, W.importClause.namedBindings.name.text)); for (let q of S) l.push(Ak(q, void 0, q.importClause.namedBindings)); let x = Sl(g), A = Sl(v), w = x ?? A; if (!w) continue; let C, P = []; if (g.length === 1) C = g[0].importClause.name; else for (let q of g) P.push(D.createImportSpecifier(!1, D.createIdentifier("default"), q.importClause.name)); P.push(...zUe(v)); let F = D.createNodeArray(r1e(P, t), A?.importClause.namedBindings.elements.hasTrailingComma), B = F.length === 0 ? C ? void 0 : D.createNamedImports(Je) : A ? D.updateNamedImports(A.importClause.namedBindings, F) : D.createNamedImports(F); r && B && A?.importClause.namedBindings && !DT(A.importClause.namedBindings, r) && Jn(B, 2), d && C && B ? (l.push(Ak(w, C, void 0)), l.push(Ak(A ?? w, void 0, B))) : l.push(Ak(w, C, B)) } return l } function FUe(e) { let t, r = { defaultImports: [], namespaceImports: [], namedImports: [] }, i = { defaultImports: [], namespaceImports: [], namedImports: [] }; for (let o of e) { if (o.importClause === void 0) { t = t || o; continue } let s = o.importClause.isTypeOnly ? r : i, { name: l, namedBindings: f } = o.importClause; l && s.defaultImports.push(o), f && (nv(f) ? s.namespaceImports.push(o) : s.namedImports.push(o)) } return { importWithoutClause: t, typeOnlyImports: r, regularImports: i } } function GUe(e, t) { let r = uG(t); return hee(e, r) } function hee(e, t) { if (e.length === 0) return e; let { exportWithoutClause: r, namedExports: i, typeOnlyExports: o } = l(e), s = []; r && s.push(r); for (let f of [i, o]) { if (f.length === 0) continue; let d = []; d.push(...Uo(f, v => v.exportClause && h_(v.exportClause) ? v.exportClause.elements : Je)); let g = r1e(d, t), m = f[0]; s.push(D.updateExportDeclaration(m, m.modifiers, m.isTypeOnly, m.exportClause && (h_(m.exportClause) ? D.updateNamedExports(m.exportClause, g) : D.updateNamespaceExport(m.exportClause, m.exportClause.name)), m.moduleSpecifier, m.assertClause)) } return s; function l(f) { let d, g = [], m = []; for (let v of f) v.exportClause === void 0 ? d = d || v : v.isTypeOnly ? m.push(v) : g.push(v); return { exportWithoutClause: d, namedExports: g, typeOnlyExports: m } } } function Ak(e, t, r) { return D.updateImportDeclaration(e, e.modifiers, D.updateImportClause(e.importClause, e.importClause.isTypeOnly, t, r), e.moduleSpecifier, e.assertClause) } function r1e(e, t) { return Ag(e, (r, i) => gee(r, i, t)) } function gee(e, t, r) { return g0(e.isTypeOnly, t.isTypeOnly) || r(e.name.text, t.name.text) } function BUe(e, t, r) { let i = uG(!!r); return yee(e, t, i) } function yee(e, t, r) { let i = e === void 0 ? void 0 : xP(e), o = t === void 0 ? void 0 : xP(t); return g0(i === void 0, o === void 0) || g0(fl(i), fl(o)) || r(i, o) } function vee(e) { var t; switch (e.kind) { case 268: return (t = zr(e.moduleReference, um)) == null ? void 0 : t.expression; case 269: return e.moduleSpecifier; case 240: return e.declarationList.declarations[0].initializer.arguments[0] } } function UUe(e, t) { return i1e(mee(e, e.statements.filter(gl)), t) } function i1e(e, t) { let r = dx(t, !1), i = dx(t, !0), o = 3, s = !1; for (let l of e) { if (l.length > 1) { let d = l8(l, g => { var m, v; return (v = (m = zr(g.moduleSpecifier, yo)) == null ? void 0 : m.text) != null ? v : "" }, r, i); if (d && (o &= d, s = !0), !o) return o } let f = wr(l, d => { var g, m; return ((m = zr((g = d.importClause) == null ? void 0 : g.namedBindings, jg)) == null ? void 0 : m.elements.length) > 1 }); if (f) { let d = Eee(f.importClause.namedBindings.elements, t); if (d && (o &= d, s = !0), !o) return o } if (o !== 3) return o } return s ? 0 : o } function VUe(e, t) { let r = dx(t, !1), i = dx(t, !0); return l8(e, o => xP(vee(o)) || "", r, i) } function jUe(e, t, r) { let i = Py(e, t, Ks, (o, s) => bee(o, s, r)); return i < 0 ? ~i : i } function HUe(e, t, r) { let i = Py(e, t, Ks, (o, s) => gee(o, s, r)); return i < 0 ? ~i : i } function bee(e, t, r) { return yee(vee(e), vee(t), r) || WUe(e, t) } function WUe(e, t) { return Es(a1e(e), a1e(t)) } function a1e(e) { var t; switch (e.kind) { case 269: return e.importClause ? e.importClause.isTypeOnly ? 1 : ((t = e.importClause.namedBindings) == null ? void 0 : t.kind) === 271 ? 2 : e.importClause.name ? 3 : 4 : 0; case 268: return 5; case 240: return 6 } } function zUe(e) { return Uo(e, t => on(JUe(t), r => r.name && r.propertyName && r.name.escapedText === r.propertyName.escapedText ? D.updateImportSpecifier(r, r.isTypeOnly, void 0, r.name) : r)) } function JUe(e) { var t; return (t = e.importClause) != null && t.namedBindings && jg(e.importClause.namedBindings) ? e.importClause.namedBindings.elements : void 0 } function uG(e) { return e ? Sae : su } function KUe(e, t) { var r, i, o; let s = qUe(t), l = (r = t.organizeImportsCaseFirst) != null ? r : !1, f = (i = t.organizeImportsNumericCollation) != null ? i : !1, d = (o = t.organizeImportsAccentCollation) != null ? o : !0, g = e ? d ? "accent" : "base" : d ? "variant" : "case"; return new Intl.Collator(s, { usage: "sort", caseFirst: l || "false", sensitivity: g, numeric: f }).compare } function qUe(e) { let t = e.organizeImportsLocale; t === "auto" && (t = xae()), t === void 0 && (t = "en"); let r = Intl.Collator.supportedLocalesOf(t); return r.length ? r[0] : "en" } function dx(e, t) { var r; return ((r = e.organizeImportsCollation) != null ? r : "ordinal") === "unicode" ? KUe(t, e) : uG(t) } function XUe(e, t) { var r; let i = typeof e.organizeImportsIgnoreCase == "boolean" ? e.organizeImportsIgnoreCase : (r = t?.()) != null ? r : !1; return dx(e, i) } var o1e, Eee, YUe = gt({ "src/services/organizeImports.ts"() { "use strict"; Fr(), o1e = class { has([e, t]) { return this._lastPreferences !== t || !this._cache ? !1 : this._cache.has(e) } get([e, t]) { if (!(this._lastPreferences !== t || !this._cache)) return this._cache.get(e) } set([e, t], r) { var i; this._lastPreferences !== t && (this._lastPreferences = t, this._cache = void 0), (i = this._cache) != null || (this._cache = new WeakMap), this._cache.set(e, r) } }, Eee = Eae((e, t) => { if (!dae(e, (o, s) => g0(o.isTypeOnly, s.isTypeOnly))) return 0; let r = dx(t, !1), i = dx(t, !0); return l8(e, o => o.name.text, r, i) }, new o1e) } }), b_ = {}; Mo(b_, { coalesceExports: () => GUe, coalesceImports: () => MUe, compareImportOrExportSpecifiers: () => gee, compareImportsOrRequireStatements: () => bee, compareModuleSpecifiers: () => BUe, detectImportDeclarationSorting: () => VUe, detectImportSpecifierSorting: () => Eee, detectSorting: () => UUe, getImportDeclarationInsertionIndex: () => jUe, getImportSpecifierInsertionIndex: () => HUe, getOrganizeImportsComparer: () => dx, organizeImports: () => RUe }); var $Ue = gt({ "src/services/_namespaces/ts.OrganizeImports.ts"() { "use strict"; YUe() } }); function QUe(e, t) { let r = []; return ZUe(e, t, r), eVe(e, r), r.sort((i, o) => i.textSpan.start - o.textSpan.start) } function ZUe(e, t, r) { let i = 40, o = 0, s = [...e.statements, e.endOfFileToken], l = s.length; for (; o < l;) { for (; o < l && !yT(s[o]);)f(s[o]), o++; if (o === l) break; let d = o; for (; o < l && yT(s[o]);)f(s[o]), o++; let g = o - 1; g !== d && r.push(AP(Yo(s[d], 100, e).getStart(e), s[g].getEnd(), "imports")) } function f(d) { var g; if (i === 0) return; t.throwIfCancellationRequested(), (Kl(d) || Bc(d) || j_(d) || Ih(d) || d.kind === 1) && c1e(d, e, t, r), Ia(d) && ar(d.parent) && br(d.parent.left) && c1e(d.parent.left, e, t, r), (Va(d) || Tp(d)) && Tee(d.statements.end, e, t, r), (Yr(d) || ku(d)) && Tee(d.members.end, e, t, r); let m = tVe(d, e); m && r.push(m), i--, Pa(d) ? (i++, f(d.expression), i--, d.arguments.forEach(f), (g = d.typeArguments) == null || g.forEach(f)) : MT(d) && d.elseStatement && MT(d.elseStatement) ? (f(d.expression), f(d.thenStatement), i++, f(d.elseStatement), i--) : d.forEachChild(f), i++ } } function eVe(e, t) { let r = [], i = e.getLineStarts(); for (let o of i) { let s = e.getLineEndOfPosition(o), l = e.text.substring(o, s), f = s1e(l); if (!(!f || Kg(e, o))) if (f[1]) { let d = r.pop(); d && (d.textSpan.length = s - d.textSpan.start, d.hintSpan.length = s - d.textSpan.start, t.push(d)) } else { let d = Wc(e.text.indexOf("//", o), s); r.push(d1(d, "region", d, !1, f[2] || "#region")) } } } function s1e(e) { return e = ZC(e), na(e, "//") ? (e = v0(e.slice(2)), l1e.exec(e)) : null } function Tee(e, t, r, i) { let o = Nm(t.text, e); if (!o) return; let s = -1, l = -1, f = 0, d = t.getFullText(); for (let { kind: m, pos: v, end: S } of o) switch (r.throwIfCancellationRequested(), m) { case 2: let x = d.slice(v, S); if (s1e(x)) { g(), f = 0; break } f === 0 && (s = v), l = S, f++; break; case 3: g(), i.push(AP(v, S, "comment")), f = 0; break; default: L.assertNever(m) }g(); function g() { f > 1 && i.push(AP(s, l, "comment")) } } function c1e(e, t, r, i) { CS(e) || Tee(e.pos, t, r, i) } function AP(e, t, r) { return d1(Wc(e, t), r) } function tVe(e, t) { switch (e.kind) { case 238: if (Ia(e.parent)) return nVe(e.parent, e, t); switch (e.parent.kind) { case 243: case 246: case 247: case 245: case 242: case 244: case 251: case 295: return m(e.parent); case 255: let x = e.parent; if (x.tryBlock === e) return m(e.parent); if (x.finallyBlock === e) { let A = Yo(x, 96, t); if (A) return m(A) } default: return d1(Du(e, t), "code") }case 265: return m(e.parent); case 260: case 228: case 261: case 263: case 266: case 184: case 203: return m(e); case 186: return m(e, !1, !p2(e.parent), 22); case 292: case 293: return v(e.statements); case 207: return g(e); case 206: return g(e, 22); case 281: return s(e); case 285: return l(e); case 282: case 283: return f(e.attributes); case 225: case 14: return d(e); case 204: return m(e, !1, !Wo(e.parent), 22); case 216: return o(e); case 210: return i(e); case 214: return S(e); case 272: case 276: case 296: return r(e) }function r(x) { if (!x.elements.length) return; let A = Yo(x, 18, t), w = Yo(x, 19, t); if (!(!A || !w || Bf(A.pos, w.pos, t))) return dG(A, w, x, t, !1, !1) } function i(x) { if (!x.arguments.length) return; let A = Yo(x, 20, t), w = Yo(x, 21, t); if (!(!A || !w || Bf(A.pos, w.pos, t))) return dG(A, w, x, t, !1, !0) } function o(x) { if (Va(x.body) || ud(x.body) || Bf(x.body.getFullStart(), x.body.getEnd(), t)) return; let A = Wc(x.body.getFullStart(), x.body.getEnd()); return d1(A, "code", Du(x)) } function s(x) { let A = Wc(x.openingElement.getStart(t), x.closingElement.getEnd()), w = x.openingElement.tagName.getText(t), C = "<" + w + ">...</" + w + ">"; return d1(A, "code", A, !1, C) } function l(x) { let A = Wc(x.openingFragment.getStart(t), x.closingFragment.getEnd()); return d1(A, "code", A, !1, "<>...</>") } function f(x) { if (x.properties.length !== 0) return AP(x.getStart(t), x.getEnd(), "code") } function d(x) { if (!(x.kind === 14 && x.text.length === 0)) return AP(x.getStart(t), x.getEnd(), "code") } function g(x, A = 18) { return m(x, !1, !fu(x.parent) && !Pa(x.parent), A) } function m(x, A = !1, w = !0, C = 18, P = C === 18 ? 19 : 23) { let F = Yo(e, C, t), B = Yo(e, P, t); return F && B && dG(F, B, x, t, A, w) } function v(x) { return x.length ? d1(lv(x), "code") : void 0 } function S(x) { if (Bf(x.getStart(), x.getEnd(), t)) return; let A = Wc(x.getStart(), x.getEnd()); return d1(A, "code", Du(x)) } } function nVe(e, t, r) { let i = rVe(e, t, r), o = Yo(t, 19, r); return i && o && dG(i, o, e, r, e.kind !== 216) } function dG(e, t, r, i, o = !1, s = !0) { let l = Wc(s ? e.getFullStart() : e.getStart(i), t.getEnd()); return d1(l, "code", Du(r, i), o) } function d1(e, t, r = e, i = !1, o = "...") { return { textSpan: e, kind: t, hintSpan: r, bannerText: o, autoCollapse: i } } function rVe(e, t, r) { if (ale(e.parameters, r)) { let i = Yo(e, 20, r); if (i) return i } return Yo(t, 18, r) } var l1e, iVe = gt({ "src/services/outliningElementsCollector.ts"() { "use strict"; Fr(), l1e = /^#(end)?region(?:\s+(.*))?(?:\r)?$/ } }), See = {}; Mo(See, { collectElements: () => QUe }); var aVe = gt({ "src/services/_namespaces/ts.OutliningElementsCollector.ts"() { "use strict"; iVe() } }); function Vh(e, t) { fG.set(e, t) } function oVe(e) { return lo(OU(fG.values(), t => { var r; return e.cancellationToken && e.cancellationToken.isCancellationRequested() || !((r = t.kinds) != null && r.some(i => pv(i, e.kind))) ? void 0 : t.getAvailableActions(e) })) } function sVe(e, t, r) { let i = fG.get(t); return i && i.getEditsForAction(e, r) } var fG, cVe = gt({ "src/services/refactorProvider.ts"() { "use strict"; Fr(), Qm(), fG = new Map } }); function u1e(e, t = !0) { let { file: r, program: i } = e, o = QS(e), s = Vi(r, o.start), l = s.parent && Yy(s.parent) & 1 && t ? s.parent : HN(s, r, o); if (!l || !Li(l.parent) && !(Tp(l.parent) && lu(l.parent.parent))) return { error: uo(_.Could_not_find_export_statement) }; let f = i.getTypeChecker(), d = pVe(l.parent, f), g = Yy(l) || (pc(l) && !l.isExportEquals ? 1025 : 0), m = !!(g & 1024); if (!(g & 1) || !m && d.exports.has("default")) return { error: uo(_.This_file_already_has_a_default_export) }; let v = S => Re(S) && f.getSymbolAtLocation(S) ? void 0 : { error: uo(_.Can_only_convert_named_export) }; switch (l.kind) { case 259: case 260: case 261: case 263: case 262: case 264: { let S = l; return S.name ? v(S.name) || { exportNode: S, exportName: S.name, wasDefault: m, exportingModuleSymbol: d } : void 0 } case 240: { let S = l; if (!(S.declarationList.flags & 2) || S.declarationList.declarations.length !== 1) return; let x = Vo(S.declarationList.declarations); return x.initializer ? (L.assert(!m, "Can't have a default flag here"), v(x.name) || { exportNode: S, exportName: x.name, wasDefault: m, exportingModuleSymbol: d }) : void 0 } case 274: { let S = l; return S.isExportEquals ? void 0 : v(S.expression) || { exportNode: S, exportName: S.expression, wasDefault: m, exportingModuleSymbol: d } } default: return } } function lVe(e, t, r, i, o) { uVe(e, r, i, t.getTypeChecker()), dVe(t, r, i, o) } function uVe(e, { wasDefault: t, exportNode: r, exportName: i }, o, s) { if (t) if (pc(r) && !r.isExportEquals) { let l = r.expression, f = d1e(l.text, l.text); o.replaceNode(e, r, D.createExportDeclaration(void 0, !1, D.createNamedExports([f]))) } else o.delete(e, L.checkDefined(z2(r, 88), "Should find a default keyword in modifier list")); else { let l = L.checkDefined(z2(r, 93), "Should find an export keyword in modifier list"); switch (r.kind) { case 259: case 260: case 261: o.insertNodeAfter(e, l, D.createToken(88)); break; case 240: let f = Vo(r.declarationList.declarations); if (!js.Core.isSymbolReferencedInFile(i, s, e) && !f.type) { o.replaceNode(e, r, D.createExportDefault(L.checkDefined(f.initializer, "Initializer was previously known to be present"))); break } case 263: case 262: case 264: o.deleteModifier(e, l), o.insertNodeAfter(e, r, D.createExportDefault(D.createIdentifier(i.text))); break; default: L.fail(`Unexpected exportNode kind ${r.kind}`) } } } function dVe(e, { wasDefault: t, exportName: r, exportingModuleSymbol: i }, o, s) { let l = e.getTypeChecker(), f = L.checkDefined(l.getSymbolAtLocation(r), "Export name should resolve to a symbol"); js.Core.eachExportReference(e.getSourceFiles(), l, s, f, i, r.text, t, d => { if (r === d) return; let g = d.getSourceFile(); t ? fVe(g, d, o, r.text) : _Ve(g, d, o) }) } function fVe(e, t, r, i) { let { parent: o } = t; switch (o.kind) { case 208: r.replaceNode(e, t, D.createIdentifier(i)); break; case 273: case 278: { let l = o; r.replaceNode(e, l, xee(i, l.name.text)); break } case 270: { let l = o; L.assert(l.name === t, "Import clause name should match provided ref"); let f = xee(i, t.text), { namedBindings: d } = l; if (!d) r.replaceNode(e, t, D.createNamedImports([f])); else if (d.kind === 271) { r.deleteRange(e, { pos: t.getStart(e), end: d.getStart(e) }); let g = yo(l.parent.moduleSpecifier) ? sY(l.parent.moduleSpecifier, e) : 1, m = Xg(void 0, [xee(i, t.text)], l.parent.moduleSpecifier, g); r.insertNodeAfter(e, l.parent, m) } else r.delete(e, t), r.insertNodeAtEndOfList(e, d.elements, f); break } case 202: let s = o; r.replaceNode(e, o, D.createImportTypeNode(s.argument, s.assertions, D.createIdentifier(i), s.typeArguments, s.isTypeOf)); break; default: L.failBadSyntaxKind(o) } } function _Ve(e, t, r) { let i = t.parent; switch (i.kind) { case 208: r.replaceNode(e, t, D.createIdentifier("default")); break; case 273: { let o = D.createIdentifier(i.name.text); i.parent.elements.length === 1 ? r.replaceNode(e, i.parent, o) : (r.delete(e, i), r.insertNodeBefore(e, i.parent, o)); break } case 278: { r.replaceNode(e, i, d1e("default", i.name.text)); break } default: L.assertNever(i, `Unexpected parent kind ${i.kind}`) } } function xee(e, t) { return D.createImportSpecifier(!1, e === t ? void 0 : D.createIdentifier(e), D.createIdentifier(t)) } function d1e(e, t) { return D.createExportSpecifier(!1, e === t ? void 0 : D.createIdentifier(e), D.createIdentifier(t)) } function pVe(e, t) { if (Li(e)) return e.symbol; let r = e.parent.symbol; return r.valueDeclaration && D0(r.valueDeclaration) ? t.getMergedSymbol(r) : r } var _G, CP, IP, mVe = gt({ "src/services/refactors/convertExport.ts"() { "use strict"; Fr(), Qm(), _G = "Convert export", CP = { name: "Convert default export to named export", description: _.Convert_default_export_to_named_export.message, kind: "refactor.rewrite.export.named" }, IP = { name: "Convert named export to default export", description: _.Convert_named_export_to_default_export.message, kind: "refactor.rewrite.export.default" }, Vh(_G, { kinds: [CP.kind, IP.kind], getAvailableActions: function (t) { let r = u1e(t, t.triggerReason === "invoked"); if (!r) return Je; if (!$m(r)) { let i = r.wasDefault ? CP : IP; return [{ name: _G, description: i.description, actions: [i] }] } return t.preferences.provideRefactorNotApplicableReason ? [{ name: _G, description: _.Convert_default_export_to_named_export.message, actions: [{ ...CP, notApplicableReason: r.error }, { ...IP, notApplicableReason: r.error }] }] : Je }, getEditsForAction: function (t, r) { L.assert(r === CP.name || r === IP.name, "Unexpected action name"); let i = u1e(t); return L.assert(i && !$m(i), "Expected applicable refactor info"), { edits: nr.ChangeTracker.with(t, s => lVe(t.file, t.program, i, s, t.cancellationToken)), renameFilename: void 0, renameLocation: void 0 } } }) } }); function f1e(e, t = !0) { let { file: r } = e, i = QS(e), o = Vi(r, i.start), s = t ? jn(o, gl) : HN(o, r, i); if (!s || !gl(s)) return { error: "Selection is not an import declaration." }; let l = i.start + i.length, f = t1(s, s.parent, r); if (f && l > f.getStart()) return; let { importClause: d } = s; return d ? d.namedBindings ? d.namedBindings.kind === 271 ? { convertTo: 0, import: d.namedBindings } : _1e(e.program, d) ? { convertTo: 1, import: d.namedBindings } : { convertTo: 2, import: d.namedBindings } : { error: uo(_.Could_not_find_namespace_import_or_named_imports) } : { error: uo(_.Could_not_find_import_clause) } } function _1e(e, t) { return wT(e.getCompilerOptions()) && vVe(t.parent.moduleSpecifier, e.getTypeChecker()) } function hVe(e, t, r, i) { let o = t.getTypeChecker(); i.convertTo === 0 ? gVe(e, o, r, i.import, wT(t.getCompilerOptions())) : m1e(e, t, r, i.import, i.convertTo === 1) } function gVe(e, t, r, i, o) { let s = !1, l = [], f = new Map; js.Core.eachSymbolReferenceInFile(i.name, t, e, v => { if (!fse(v.parent)) s = !0; else { let S = p1e(v.parent).text; t.resolveName(S, v, 67108863, !0) && f.set(S, !0), L.assert(yVe(v.parent) === v, "Parent expression should match id"), l.push(v.parent) } }); let d = new Map; for (let v of l) { let S = p1e(v).text, x = d.get(S); x === void 0 && d.set(S, x = f.has(S) ? i1(S, e) : S), r.replaceNode(e, v, D.createIdentifier(x)) } let g = []; d.forEach((v, S) => { g.push(D.createImportSpecifier(!1, v === S ? void 0 : D.createIdentifier(S), D.createIdentifier(v))) }); let m = i.parent.parent; s && !o ? r.insertNodeAfter(e, m, Aee(m, void 0, g)) : r.replaceNode(e, m, Aee(m, s ? D.createIdentifier(i.name.text) : void 0, g)) } function p1e(e) { return br(e) ? e.name : e.right } function yVe(e) { return br(e) ? e.expression : e.left } function m1e(e, t, r, i, o = _1e(t, i.parent)) { let s = t.getTypeChecker(), l = i.parent.parent, { moduleSpecifier: f } = l, d = new Set; i.elements.forEach(A => { let w = s.getSymbolAtLocation(A.name); w && d.add(w) }); let g = f && yo(f) ? gu.moduleSpecifierToValidIdentifier(f.text, 99) : "module"; function m(A) { return !!js.Core.eachSymbolReferenceInFile(A.name, s, e, w => { let C = s.resolveName(g, w, 67108863, !0); return C ? d.has(C) ? Mu(w.parent) : !0 : !1 }) } let S = i.elements.some(m) ? i1(g, e) : g, x = new Set; for (let A of i.elements) { let w = (A.propertyName || A.name).text; js.Core.eachSymbolReferenceInFile(A.name, s, e, C => { let P = D.createPropertyAccessExpression(D.createIdentifier(S), w); xf(C.parent) ? r.replaceNode(e, C.parent, D.createPropertyAssignment(C.text, P)) : Mu(C.parent) ? x.add(A) : r.replaceNode(e, C, P) }) } if (r.replaceNode(e, i, o ? D.createIdentifier(S) : D.createNamespaceImport(D.createIdentifier(S))), x.size) { let A = lo(x.values(), w => D.createImportSpecifier(w.isTypeOnly, w.propertyName && D.createIdentifier(w.propertyName.text), D.createIdentifier(w.name.text))); r.insertNodeAfter(e, i.parent.parent, Aee(l, void 0, A)) } } function vVe(e, t) { let r = t.resolveExternalModuleName(e); if (!r) return !1; let i = t.resolveExternalModuleSymbol(r); return r !== i } function Aee(e, t, r) { return D.createImportDeclaration(void 0, D.createImportClause(!1, t, r && r.length ? D.createNamedImports(r) : void 0), e.moduleSpecifier, void 0) } var pG, LP, bVe = gt({ "src/services/refactors/convertImport.ts"() { "use strict"; Fr(), Qm(), pG = "Convert import", LP = { 0: { name: "Convert namespace import to named imports", description: _.Convert_namespace_import_to_named_imports.message, kind: "refactor.rewrite.import.named" }, 2: { name: "Convert named imports to namespace import", description: _.Convert_named_imports_to_namespace_import.message, kind: "refactor.rewrite.import.namespace" }, 1: { name: "Convert named imports to default import", description: _.Convert_named_imports_to_default_import.message, kind: "refactor.rewrite.import.default" } }, Vh(pG, { kinds: H1(LP).map(e => e.kind), getAvailableActions: function (t) { let r = f1e(t, t.triggerReason === "invoked"); if (!r) return Je; if (!$m(r)) { let i = LP[r.convertTo]; return [{ name: pG, description: i.description, actions: [i] }] } return t.preferences.provideRefactorNotApplicableReason ? H1(LP).map(i => ({ name: pG, description: i.description, actions: [{ ...i, notApplicableReason: r.error }] })) : Je }, getEditsForAction: function (t, r) { L.assert(vt(H1(LP), s => s.name === r), "Unexpected action name"); let i = f1e(t); return L.assert(i && !$m(i), "Expected applicable refactor info"), { edits: nr.ChangeTracker.with(t, s => hVe(t.file, t.program, s, i)), renameFilename: void 0, renameLocation: void 0 } } }) } }); function h1e(e, t = !0) { let { file: r, startPosition: i } = e, o = Cu(r), s = Vi(r, i), l = y7(QS(e)), f = l.pos === l.end && t, d = jn(s, x => x.parent && bi(x) && !Ab(l, x.parent, r) && (f || HX(s, r, l.pos, l.end))); if (!d || !bi(d)) return { error: uo(_.Selection_is_not_a_valid_type_node) }; let g = e.program.getTypeChecker(), m = AVe(d, o); if (m === void 0) return { error: uo(_.No_type_could_be_extracted_from_this_type_node) }; let v = EVe(g, d, m, r); if (!v) return { error: uo(_.No_type_could_be_extracted_from_this_type_node) }; let S = Cee(g, d); return { isJS: o, selection: d, enclosingNode: m, typeParameters: v, typeElements: S } } function Cee(e, t) { if (t) if (dO(t)) { let r = [], i = new Map; for (let o of t.types) { let s = Cee(e, o); if (!s || !s.every(l => l.name && V_(i, VN(l.name)))) return; si(r, s) } return r } else { if (wS(t)) return Cee(e, t.type); if (Rd(t)) return t.members } } function Ab(e, t, r) { return ON(e, xo(r.text, t.pos), t.end) } function EVe(e, t, r, i) { let o = []; return s(t) ? void 0 : o; function s(l) { if (m_(l)) { if (Re(l.typeName)) { let f = l.typeName, d = e.resolveName(f.text, f, 262144, !0); for (let g of d?.declarations || Je) if (_c(g) && g.getSourceFile() === i) { if (g.name.escapedText === f.escapedText && Ab(g, t, i)) return !0; if (Ab(r, g, i) && !Ab(t, g, i)) { Of(o, g); break } } } } else if (h2(l)) { let f = jn(l, d => m2(d) && Ab(d.extendsType, l, i)); if (!f || !Ab(t, f, i)) return !0 } else if (l3(l) || u3(l)) { let f = jn(l.parent, Ia); if (f && f.type && Ab(f.type, l, i) && !Ab(t, f, i)) return !0 } else if (vL(l)) { if (Re(l.exprName)) { let f = e.resolveName(l.exprName.text, l.exprName, 111551, !1); if (f?.valueDeclaration && Ab(r, f.valueDeclaration, i) && !Ab(t, f.valueDeclaration, i)) return !0 } else if (LT(l.exprName.left) && !Ab(t, l.parent, i)) return !0 } return i && p2(l) && Gs(i, l.pos).line === Gs(i, l.end).line && Jn(l, 1), pa(l, s) } } function TVe(e, t, r, i) { let { enclosingNode: o, selection: s, typeParameters: l } = i, f = D.createTypeAliasDeclaration(void 0, r, l.map(d => D.updateTypeParameterDeclaration(d, d.modifiers, d.name, d.constraint, void 0)), s); e.insertNodeBefore(t, o, Tz(f), !0), e.replaceNode(t, s, D.createTypeReferenceNode(r, l.map(d => D.createTypeReferenceNode(d.name, void 0))), { leadingTriviaOption: nr.LeadingTriviaOption.Exclude, trailingTriviaOption: nr.TrailingTriviaOption.ExcludeWhitespace }) } function SVe(e, t, r, i) { var o; let { enclosingNode: s, selection: l, typeParameters: f, typeElements: d } = i, g = D.createInterfaceDeclaration(void 0, r, f, void 0, d); it(g, (o = d[0]) == null ? void 0 : o.parent), e.insertNodeBefore(t, s, Tz(g), !0), e.replaceNode(t, l, D.createTypeReferenceNode(r, f.map(m => D.createTypeReferenceNode(m.name, void 0))), { leadingTriviaOption: nr.LeadingTriviaOption.Exclude, trailingTriviaOption: nr.TrailingTriviaOption.ExcludeWhitespace }) } function xVe(e, t, r, i, o) { var s; let { enclosingNode: l, selection: f, typeParameters: d } = o; Jn(f, 7168); let g = D.createJSDocTypedefTag(D.createIdentifier("typedef"), D.createJSDocTypeExpression(f), D.createIdentifier(i)), m = []; mn(d, S => { let x = EA(S), A = D.createTypeParameterDeclaration(void 0, S.name), w = D.createJSDocTemplateTag(D.createIdentifier("template"), x && Ga(x, UT), [A]); m.push(w) }); let v = D.createJSDocComment(void 0, D.createNodeArray(Qi(m, [g]))); if (dm(l)) { let S = l.getStart(r), x = bb(t.host, (s = t.formatContext) == null ? void 0 : s.options); e.insertNodeAt(r, l.getStart(r), v, { suffix: x + x + r.text.slice(hY(r.text, S - 1), S) }) } else e.insertNodeBefore(r, l, v, !0); e.replaceNode(r, f, D.createTypeReferenceNode(i, d.map(S => D.createTypeReferenceNode(S.name, void 0)))) } function AVe(e, t) { return jn(e, ca) || (t ? jn(e, dm) : void 0) } var mG, kP, DP, wP, CVe = gt({ "src/services/refactors/extractType.ts"() { "use strict"; Fr(), Qm(), mG = "Extract type", kP = { name: "Extract to type alias", description: uo(_.Extract_to_type_alias), kind: "refactor.extract.type" }, DP = { name: "Extract to interface", description: uo(_.Extract_to_interface), kind: "refactor.extract.interface" }, wP = { name: "Extract to typedef", description: uo(_.Extract_to_typedef), kind: "refactor.extract.typedef" }, Vh(mG, { kinds: [kP.kind, DP.kind, wP.kind], getAvailableActions: function (t) { let r = h1e(t, t.triggerReason === "invoked"); return r ? $m(r) ? t.preferences.provideRefactorNotApplicableReason ? [{ name: mG, description: uo(_.Extract_type), actions: [{ ...wP, notApplicableReason: r.error }, { ...kP, notApplicableReason: r.error }, { ...DP, notApplicableReason: r.error }] }] : Je : [{ name: mG, description: uo(_.Extract_type), actions: r.isJS ? [wP] : Sn([kP], r.typeElements && DP) }] : Je }, getEditsForAction: function (t, r) { let { file: i } = t, o = h1e(t); L.assert(o && !$m(o), "Expected to find a range to extract"); let s = i1("NewType", i), l = nr.ChangeTracker.with(t, g => { switch (r) { case kP.name: return L.assert(!o.isJS, "Invalid actionName/JS combo"), TVe(g, i, s, o); case wP.name: return L.assert(o.isJS, "Invalid actionName/JS combo"), xVe(g, t, i, s, o); case DP.name: return L.assert(!o.isJS && !!o.typeElements, "Invalid actionName/JS combo"), SVe(g, i, s, o); default: L.fail("Unexpected action name") } }), f = i.fileName, d = KN(l, f, s, !1); return { edits: l, renameFilename: f, renameLocation: d } } }) } }); function $m(e) { return e.error !== void 0 } function pv(e, t) { return t ? e.substr(0, t.length) === t : !0 } var IVe = gt({ "src/services/refactors/helpers.ts"() { "use strict" } }); function LVe(e) { let { file: t } = e, r = y7(QS(e)), { statements: i } = t, o = Yc(i, f => f.end > r.pos); if (o === -1) return; let s = i[o]; if (zl(s) && s.name && Od(s.name, r)) return { toMove: [i[o]], afterLast: i[o + 1] }; if (r.pos > s.getStart(t)) return; let l = Yc(i, f => f.end > r.end, o); if (!(l !== -1 && (l === 0 || i[l].getStart(t) < r.end))) return { toMove: i.slice(o, l === -1 ? i.length : l), afterLast: l === -1 ? void 0 : i[l] } } function kVe(e, t, r, i, o, s) { let l = t.getTypeChecker(), f = JVe(e, r.all, l), d = ni(e.fileName), g = jR(e.fileName), m = vi(d, WVe(zVe(f.oldFileImportsFromNewFile, f.movedSymbols), g, d, o)) + g; i.createNewFile(e, m, OVe(e, f, i, r, t, o, m, s)), RVe(t, i, e.fileName, m, lb(o)) } function g1e(e) { let t = LVe(e); if (t === void 0) return; let r = [], i = [], { toMove: o, afterLast: s } = t; return PU(o, DVe, (l, f) => { for (let d = l; d < f; d++)r.push(o[d]); i.push({ first: o[l], afterLast: s }) }), r.length === 0 ? void 0 : { all: r, ranges: i } } function DVe(e) { return !wVe(e) && !B_(e) } function wVe(e) { switch (e.kind) { case 269: return !0; case 268: return !Mr(e, 1); case 240: return e.declarationList.declarations.every(t => !!t.initializer && qu(t.initializer, !0)); default: return !1 } } function RVe(e, t, r, i, o) { let s = e.getCompilerOptions().configFile; if (!s) return; let l = So(vi(r, "..", i)), f = _w(s.fileName, l, o), d = s.statements[0] && zr(s.statements[0].expression, rs), g = d && wr(d.properties, m => yl(m) && yo(m.name) && m.name.text === "files"); g && fu(g.initializer) && t.insertNodeInListAfter(s, To(g.initializer.elements), D.createStringLiteral(f), g.initializer.elements) } function OVe(e, t, r, i, o, s, l, f) { let d = o.getTypeChecker(), g = v8(e.statements, B_); if (e.externalModuleIndicator === void 0 && e.commonJsModuleIndicator === void 0 && t.oldImportsNeededByNewFile.size() === 0) return y1e(e, i.ranges, r), [...g, ...i.all]; let m = !!e.externalModuleIndicator, v = J_(e, f), S = BVe(e, t.oldFileImportsFromNewFile, l, o, s, m, v); S && L7(r, e, S, !0, f), NVe(e, i.all, r, t.unusedImportsFromOldFile, d), y1e(e, i.ranges, r), PVe(r, o, s, e, t.movedSymbols, l); let x = HVe(e, t.oldImportsNeededByNewFile, t.newFileImportsFromOldFile, r, d, o, s, m, v), A = UVe(e, i.all, t.oldFileImportsFromNewFile, m); return x.length && A.length ? [...g, ...x, 4, ...A] : [...g, ...x, ...A] } function y1e(e, t, r) { for (let { first: i, afterLast: o } of t) r.deleteNodeRangeExcludingEnd(e, i, o) } function NVe(e, t, r, i, o) { for (let s of e.statements) ya(t, s) || Iee(s, l => T1e(e, l, r, f => i.has(o.getSymbolAtLocation(f)))) } function PVe(e, t, r, i, o, s) { let l = t.getTypeChecker(); for (let f of t.getSourceFiles()) if (f !== i) for (let d of f.statements) Iee(d, g => { if (l.getSymbolAtLocation(v1e(g)) !== i.symbol) return; let m = w => { let C = Wo(w.parent) ? I7(l, w.parent) : wd(l.getSymbolAtLocation(w), l); return !!C && o.has(C) }; T1e(f, g, e, m); let v = Fy(ni(i.path), s), S = sF(t.getCompilerOptions(), f, f.path, v, $S(t, r)), x = A1e(g, D.createStringLiteral(S), m); x && e.insertNodeAfter(f, d, x); let A = MVe(g); A && FVe(e, f, l, o, S, A, g) }) } function MVe(e) { switch (e.kind) { case 269: return e.importClause && e.importClause.namedBindings && e.importClause.namedBindings.kind === 271 ? e.importClause.namedBindings.name : void 0; case 268: return e.name; case 257: return zr(e.name, Re); default: return L.assertNever(e, `Unexpected node kind ${e.kind}`) } } function FVe(e, t, r, i, o, s, l) { let f = gu.moduleSpecifierToValidIdentifier(o, 99), d = !1, g = []; if (js.Core.eachSymbolReferenceInFile(s, r, t, m => { br(m.parent) && (d = d || !!r.resolveName(f, m, 67108863, !0), i.has(r.getSymbolAtLocation(m.parent.name)) && g.push(m)) }), g.length) { let m = d ? i1(f, t) : f; for (let v of g) e.replaceNode(t, v, D.createIdentifier(m)); e.insertNodeAfter(t, l, GVe(l, f, o)) } } function GVe(e, t, r) { let i = D.createIdentifier(t), o = D.createStringLiteral(r); switch (e.kind) { case 269: return D.createImportDeclaration(void 0, D.createImportClause(!1, void 0, D.createNamespaceImport(i)), o, void 0); case 268: return D.createImportEqualsDeclaration(void 0, !1, i, D.createExternalModuleReference(o)); case 257: return D.createVariableDeclaration(i, void 0, void 0, Lee(o)); default: return L.assertNever(e, `Unexpected node kind ${e.kind}`) } } function v1e(e) { return e.kind === 269 ? e.moduleSpecifier : e.kind === 268 ? e.moduleReference.expression : e.initializer.arguments[0] } function Iee(e, t) { if (gl(e)) yo(e.moduleSpecifier) && t(e); else if (Nl(e)) um(e.moduleReference) && es(e.moduleReference.expression) && t(e); else if (Bc(e)) for (let r of e.declarationList.declarations) r.initializer && qu(r.initializer, !0) && t(r) } function BVe(e, t, r, i, o, s, l) { let f, d = []; return t.forEach(g => { g.escapedName === "default" ? f = D.createIdentifier(x7(g)) : d.push(g.name) }), b1e(e, f, d, r, i, o, s, l) } function b1e(e, t, r, i, o, s, l, f) { let d = Fy(ni(e.path), i), g = sF(o.getCompilerOptions(), e, e.path, d, $S(o, s)); if (l) { let m = r.map(v => D.createImportSpecifier(!1, void 0, D.createIdentifier(v))); return jhe(t, m, g, f) } else { L.assert(!t, "No default import should exist"); let m = r.map(v => D.createBindingElement(void 0, void 0, v)); return m.length ? E1e(D.createObjectBindingPattern(m), void 0, Lee(D.createStringLiteral(g))) : void 0 } } function E1e(e, t, r, i = 2) { return D.createVariableStatement(void 0, D.createVariableDeclarationList([D.createVariableDeclaration(e, void 0, t, r)], i)) } function Lee(e) { return D.createCallExpression(D.createIdentifier("require"), void 0, [e]) } function UVe(e, t, r, i) { return Uo(t, o => { if (YVe(o) && !R1e(e, o, i) && k1e(o, s => { var l; return r.has(L.checkDefined((l = zr(s, $p)) == null ? void 0 : l.symbol)) })) { let s = ZVe(o, i); if (s) return s } return o }) } function T1e(e, t, r, i) { switch (t.kind) { case 269: VVe(e, t, r, i); break; case 268: i(t.name) && r.delete(e, t); break; case 257: jVe(e, t, r, i); break; default: L.assertNever(t, `Unexpected import decl kind ${t.kind}`) } } function VVe(e, t, r, i) { if (!t.importClause) return; let { name: o, namedBindings: s } = t.importClause, l = !o || i(o), f = !s || (s.kind === 271 ? i(s.name) : s.elements.length !== 0 && s.elements.every(d => i(d.name))); if (l && f) r.delete(e, t); else if (o && l && r.delete(e, o), s) { if (f) r.replaceNode(e, t.importClause, D.updateImportClause(t.importClause, t.importClause.isTypeOnly, o, void 0)); else if (s.kind === 272) for (let d of s.elements) i(d.name) && r.delete(e, d) } } function jVe(e, t, r, i) { let { name: o } = t; switch (o.kind) { case 79: i(o) && (t.initializer && qu(t.initializer, !0) ? r.delete(e, pu(t.parent) && Fn(t.parent.declarations) === 1 ? t.parent.parent : t) : r.delete(e, o)); break; case 204: break; case 203: if (o.elements.every(s => Re(s.name) && i(s.name))) r.delete(e, pu(t.parent) && t.parent.declarations.length === 1 ? t.parent.parent : t); else for (let s of o.elements) Re(s.name) && i(s.name) && r.delete(e, s.name); break } } function HVe(e, t, r, i, o, s, l, f, d) { let g = []; for (let x of e.statements) Iee(x, A => { Sn(g, A1e(A, v1e(A), w => t.has(o.getSymbolAtLocation(w)))) }); let m, v = [], S = W2(); return r.forEach(x => { if (x.declarations) for (let A of x.declarations) { if (!I1e(A)) continue; let w = $Ve(A); if (!w) continue; let C = w1e(A); S(C) && QVe(e, C, w, i, f), Mr(A, 1024) ? m = w : v.push(w.text) } }), Sn(g, b1e(e, m, v, Hl(e.fileName), s, l, f, d)), g } function WVe(e, t, r, i) { let o = e; for (let s = 1; ; s++) { let l = vi(r, o + t); if (!i.fileExists(l)) return o; o = `${e}.${s}` } } function zVe(e, t) { return e.forEachEntry(x7) || t.forEachEntry(x7) || "newFile" } function JVe(e, t, r) { let i = new Ik, o = new Ik, s = new Ik, l = wr(t, v => !!(v.transformFlags & 2)), f = m(l); f && o.add(f); for (let v of t) k1e(v, S => { i.add(L.checkDefined(Ol(S) ? r.getSymbolAtLocation(S.expression.left) : S.symbol, "Need a symbol here")) }); for (let v of t) C1e(v, r, S => { if (S.declarations) for (let x of S.declarations) S1e(x) ? o.add(S) : I1e(x) && XVe(x) === e && !i.has(S) && s.add(S) }); let d = o.clone(), g = new Ik; for (let v of e.statements) ya(t, v) || (f && v.transformFlags & 2 && d.delete(f), C1e(v, r, S => { i.has(S) && g.add(S), d.delete(S) })); return { movedSymbols: i, newFileImportsFromOldFile: s, oldFileImportsFromNewFile: g, oldImportsNeededByNewFile: o, unusedImportsFromOldFile: d }; function m(v) { if (v === void 0) return; let S = r.getJsxNamespace(v), x = r.resolveName(S, v, 1920, !0); return x && vt(x.declarations, S1e) ? x : void 0 } } function S1e(e) { switch (e.kind) { case 268: case 273: case 270: case 271: return !0; case 257: return x1e(e); case 205: return wi(e.parent.parent) && x1e(e.parent.parent); default: return !1 } } function x1e(e) { return Li(e.parent.parent.parent) && !!e.initializer && qu(e.initializer, !0) } function A1e(e, t, r) { switch (e.kind) { case 269: { let i = e.importClause; if (!i) return; let o = i.name && r(i.name) ? i.name : void 0, s = i.namedBindings && KVe(i.namedBindings, r); return o || s ? D.createImportDeclaration(void 0, D.createImportClause(i.isTypeOnly, o, s), t, void 0) : void 0 } case 268: return r(e.name) ? e : void 0; case 257: { let i = qVe(e.name, r); return i ? E1e(i, e.type, Lee(t), e.parent.flags) : void 0 } default: return L.assertNever(e, `Unexpected import kind ${e.kind}`) } } function KVe(e, t) { if (e.kind === 271) return t(e.name) ? e : void 0; { let r = e.elements.filter(i => t(i.name)); return r.length ? D.createNamedImports(r) : void 0 } } function qVe(e, t) { switch (e.kind) { case 79: return t(e) ? e : void 0; case 204: return e; case 203: { let r = e.elements.filter(i => i.propertyName || !Re(i.name) || t(i.name)); return r.length ? D.createObjectBindingPattern(r) : void 0 } } } function C1e(e, t, r) { e.forEachChild(function i(o) { if (Re(o) && !Rh(o)) { let s = t.getSymbolAtLocation(o); s && r(s) } else o.forEachChild(i) }) } function I1e(e) { return L1e(e) && Li(e.parent) || wi(e) && Li(e.parent.parent.parent) } function XVe(e) { return wi(e) ? e.parent.parent.parent : e.parent } function YVe(e) { return L.assert(Li(e.parent), "Node parent should be a SourceFile"), L1e(e) || Bc(e) } function L1e(e) { switch (e.kind) { case 259: case 260: case 264: case 263: case 262: case 261: case 268: return !0; default: return !1 } } function k1e(e, t) { switch (e.kind) { case 259: case 260: case 264: case 263: case 262: case 261: case 268: return t(e); case 240: return ks(e.declarationList.declarations, r => D1e(r.name, t)); case 241: { let { expression: r } = e; return ar(r) && ic(r) === 1 ? t(e) : void 0 } } } function D1e(e, t) { switch (e.kind) { case 79: return t(Ga(e.parent, r => wi(r) || Wo(r))); case 204: case 203: return ks(e.elements, r => ol(r) ? void 0 : D1e(r.name, t)); default: return L.assertNever(e, `Unexpected name kind ${e.kind}`) } } function $Ve(e) { return Ol(e) ? zr(e.expression.left.name, Re) : zr(e.name, Re) } function w1e(e) { switch (e.kind) { case 257: return e.parent.parent; case 205: return w1e(Ga(e.parent.parent, t => wi(t) || Wo(t))); default: return e } } function QVe(e, t, r, i, o) { if (!R1e(e, t, o, r)) if (o) Ol(t) || i.insertExportModifier(e, t); else { let s = kee(t); s.length !== 0 && i.insertNodesAfter(e, t, s.map(O1e)) } } function R1e(e, t, r, i) { var o; return r ? !Ol(t) && Mr(t, 1) || !!(i && ((o = e.symbol.exports) != null && o.has(i.escapedText))) : !!e.symbol && !!e.symbol.exports && kee(t).some(s => e.symbol.exports.has(Bs(s))) } function ZVe(e, t) { return t ? [eje(e)] : tje(e) } function eje(e) { let t = g_(e) ? Qi([D.createModifier(93)], uT(e)) : void 0; switch (e.kind) { case 259: return D.updateFunctionDeclaration(e, t, e.asteriskToken, e.name, e.typeParameters, e.parameters, e.type, e.body); case 260: let r = HS(e) ? Uy(e) : void 0; return D.updateClassDeclaration(e, Qi(r, t), e.name, e.typeParameters, e.heritageClauses, e.members); case 240: return D.updateVariableStatement(e, t, e.declarationList); case 264: return D.updateModuleDeclaration(e, t, e.name, e.body); case 263: return D.updateEnumDeclaration(e, t, e.name, e.members); case 262: return D.updateTypeAliasDeclaration(e, t, e.name, e.typeParameters, e.type); case 261: return D.updateInterfaceDeclaration(e, t, e.name, e.typeParameters, e.heritageClauses, e.members); case 268: return D.updateImportEqualsDeclaration(e, t, e.isTypeOnly, e.name, e.moduleReference); case 241: return L.fail(); default: return L.assertNever(e, `Unexpected declaration kind ${e.kind}`) } } function tje(e) { return [e, ...kee(e).map(O1e)] } function kee(e) { switch (e.kind) { case 259: case 260: return [e.name.text]; case 240: return Zi(e.declarationList.declarations, t => Re(t.name) ? t.name.text : void 0); case 264: case 263: case 262: case 261: case 268: return Je; case 241: return L.fail("Can't export an ExpressionStatement"); default: return L.assertNever(e, `Unexpected decl kind ${e.kind}`) } } function O1e(e) { return D.createExpressionStatement(D.createBinaryExpression(D.createPropertyAccessExpression(D.createIdentifier("exports"), D.createIdentifier(e)), 63, D.createIdentifier(e))) } var Ck, hG, gG, Ik, nje = gt({ "src/services/refactors/moveToNewFile.ts"() { "use strict"; L_e(), Fr(), Qm(), Ck = "Move to a new file", hG = uo(_.Move_to_a_new_file), gG = { name: Ck, description: hG, kind: "refactor.move.newFile" }, Vh(Ck, { kinds: [gG.kind], getAvailableActions: function (t) { let r = g1e(t); return t.preferences.allowTextChangesInNewFiles && r ? [{ name: Ck, description: hG, actions: [gG] }] : t.preferences.provideRefactorNotApplicableReason ? [{ name: Ck, description: hG, actions: [{ ...gG, notApplicableReason: uo(_.Selection_is_not_a_valid_statement_or_statements) }] }] : Je }, getEditsForAction: function (t, r) { L.assert(r === Ck, "Wrong refactor invoked"); let i = L.checkDefined(g1e(t)); return { edits: nr.ChangeTracker.with(t, s => kVe(t.file, t.program, i, s, t.host, t.preferences)), renameFilename: void 0, renameLocation: void 0 } } }), Ik = class { constructor() { this.map = new Map } add(e) { this.map.set(String($a(e)), e) } has(e) { return this.map.has(String($a(e))) } delete(e) { this.map.delete(String($a(e))) } forEach(e) { this.map.forEach(e) } forEachEntry(e) { return Ld(this.map, e) } clone() { let e = new Ik; return Mw(this.map, e.map), e } size() { return this.map.size } } } }); function rje(e) { let { file: t, startPosition: r, program: i } = e; return P1e(t, r, i) ? [{ name: yG, description: Dee, actions: [wee] }] : Je } function ije(e) {
+                let { file: t, startPosition: r, program: i } = e, o = P1e(t, r, i); if (!o) return; let s = i.getTypeChecker(), l = o[o.length - 1], f = l; switch (l.kind) { case 170: { f = D.updateMethodSignature(l, l.modifiers, l.name, l.questionToken, l.typeParameters, g(o), l.type); break } case 171: { f = D.updateMethodDeclaration(l, l.modifiers, l.asteriskToken, l.name, l.questionToken, l.typeParameters, g(o), l.type, l.body); break } case 176: { f = D.updateCallSignature(l, l.typeParameters, g(o), l.type); break } case 173: { f = D.updateConstructorDeclaration(l, l.modifiers, g(o), l.body); break } case 177: { f = D.updateConstructSignature(l, l.typeParameters, g(o), l.type); break } case 259: { f = D.updateFunctionDeclaration(l, l.modifiers, l.asteriskToken, l.name, l.typeParameters, g(o), l.type, l.body); break } default: return L.failBadSyntaxKind(l, "Unhandled signature kind in overload list conversion refactoring") }if (f === l) return; return { renameFilename: void 0, renameLocation: void 0, edits: nr.ChangeTracker.with(e, S => { S.replaceNodeRange(t, o[0], o[o.length - 1], f) }) }; function g(S) { let x = S[S.length - 1]; return Ds(x) && x.body && (S = S.slice(0, S.length - 1)), D.createNodeArray([D.createParameterDeclaration(void 0, D.createToken(25), "args", void 0, D.createUnionTypeNode(on(S, m)))]) } function m(S) { let x = on(S.parameters, v); return Jn(D.createTupleTypeNode(x), vt(x, A => !!Fn(l2(A))) ? 0 : 1) } function v(S) {
+                    L.assert(Re(S.name)); let x = it(D.createNamedTupleMember(S.dotDotDotToken, S.name, S.questionToken, S.type || D.createKeywordTypeNode(131)), S), A = S.symbol && S.symbol.getDocumentationComment(s); if (A) {
+                        let w = Mye(A); w.length && W0(x, [{
+                            text: `*
+${w.split(`
+`).map(C => ` * ${C}`).join(`
+`)}
+ `, kind: 3, pos: -1, end: -1, hasTrailingNewLine: !0, hasLeadingNewline: !0
+                        }])
+                    } return x
+                }
+            } function N1e(e) { switch (e.kind) { case 170: case 171: case 176: case 173: case 177: case 259: return !0 }return !1 } function P1e(e, t, r) { let i = Vi(e, t), o = jn(i, N1e); if (!o || Ds(o) && o.body && wN(o.body, t)) return; let s = r.getTypeChecker(), l = o.symbol; if (!l) return; let f = l.declarations; if (Fn(f) <= 1 || !Ji(f, S => Gn(S) === e) || !N1e(f[0])) return; let d = f[0].kind; if (!Ji(f, S => S.kind === d)) return; let g = f; if (vt(g, S => !!S.typeParameters || vt(S.parameters, x => !!x.modifiers || !Re(x.name)))) return; let m = Zi(g, S => s.getSignatureFromDeclaration(S)); if (Fn(m) !== Fn(f)) return; let v = s.getReturnTypeOfSignature(m[0]); if (Ji(m, S => s.getReturnTypeOfSignature(S) === v)) return g } var yG, Dee, wee, aje = gt({ "src/services/refactors/convertOverloadListToSingleSignature.ts"() { "use strict"; Fr(), Qm(), yG = "Convert overload list to single signature", Dee = _.Convert_overload_list_to_single_signature.message, wee = { name: yG, description: Dee, kind: "refactor.rewrite.function.overloadList" }, Vh(yG, { kinds: [wee.kind], getEditsForAction: ije, getAvailableActions: rje }) } }); function oje(e) { let { file: t, startPosition: r, triggerReason: i } = e, o = M1e(t, r, i === "invoked"); return o ? $m(o) ? e.preferences.provideRefactorNotApplicableReason ? [{ name: vG, description: Ree, actions: [{ ...RP, notApplicableReason: o.error }, { ...Lk, notApplicableReason: o.error }] }] : Je : [{ name: vG, description: Ree, actions: [o.addBraces ? RP : Lk] }] : Je } function sje(e, t) { let { file: r, startPosition: i } = e, o = M1e(r, i); L.assert(o && !$m(o), "Expected applicable refactor info"); let { expression: s, returnStatement: l, func: f } = o, d; if (t === RP.name) { let m = D.createReturnStatement(s); d = D.createBlock([m], !0), q2(s, m, r, 3, !0) } else if (t === Lk.name && l) { let m = s || D.createVoidZero(); d = bY(m) ? D.createParenthesizedExpression(m) : m, qN(l, d, r, 3, !1), q2(l, d, r, 3, !1), sk(l, d, r, 3, !1) } else L.fail("invalid action"); return { renameFilename: void 0, renameLocation: void 0, edits: nr.ChangeTracker.with(e, m => { m.replaceNode(r, f.body, d) }) } } function M1e(e, t, r = !0, i) { let o = Vi(e, t), s = Xd(o); if (!s) return { error: uo(_.Could_not_find_a_containing_arrow_function) }; if (!xs(s)) return { error: uo(_.Containing_function_is_not_an_arrow_function) }; if (!(!Od(s, o) || Od(s.body, o) && !r)) { if (pv(RP.kind, i) && ot(s.body)) return { func: s, addBraces: !0, expression: s.body }; if (pv(Lk.kind, i) && Va(s.body) && s.body.statements.length === 1) { let l = Vo(s.body.statements); if (j_(l)) return { func: s, addBraces: !1, expression: l.expression, returnStatement: l } } } } var vG, Ree, RP, Lk, cje = gt({ "src/services/refactors/addOrRemoveBracesToArrowFunction.ts"() { "use strict"; Fr(), Qm(), vG = "Add or remove braces in an arrow function", Ree = _.Add_or_remove_braces_in_an_arrow_function.message, RP = { name: "Add braces to arrow function", description: _.Add_braces_to_arrow_function.message, kind: "refactor.rewrite.arrow.braces.add" }, Lk = { name: "Remove braces from arrow function", description: _.Remove_braces_from_arrow_function.message, kind: "refactor.rewrite.arrow.braces.remove" }, Vh(vG, { kinds: [Lk.kind], getEditsForAction: sje, getAvailableActions: oje }) } }), lje = {}, uje = gt({ "src/services/_namespaces/ts.refactor.addOrRemoveBracesToArrowFunction.ts"() { "use strict"; aje(), cje() } }); function dje(e) { let { file: t, startPosition: r, program: i, kind: o } = e, s = G1e(t, r, i); if (!s) return Je; let { selectedVariableDeclaration: l, func: f } = s, d = [], g = []; if (pv(Dk.kind, o)) { let m = l || xs(f) && wi(f.parent) ? void 0 : uo(_.Could_not_convert_to_named_function); m ? g.push({ ...Dk, notApplicableReason: m }) : d.push(Dk) } if (pv(kk.kind, o)) { let m = !l && xs(f) ? void 0 : uo(_.Could_not_convert_to_anonymous_function); m ? g.push({ ...kk, notApplicableReason: m }) : d.push(kk) } if (pv(wk.kind, o)) { let m = ms(f) ? void 0 : uo(_.Could_not_convert_to_arrow_function); m ? g.push({ ...wk, notApplicableReason: m }) : d.push(wk) } return [{ name: Oee, description: V1e, actions: d.length === 0 && e.preferences.provideRefactorNotApplicableReason ? g : d }] } function fje(e, t) { let { file: r, startPosition: i, program: o } = e, s = G1e(r, i, o); if (!s) return; let { func: l } = s, f = []; switch (t) { case kk.name: f.push(...hje(e, l)); break; case Dk.name: let d = mje(l); if (!d) return; f.push(...gje(e, l, d)); break; case wk.name: if (!ms(l)) return; f.push(...yje(e, l)); break; default: return L.fail("invalid action") }return { renameFilename: void 0, renameLocation: void 0, edits: f } } function F1e(e) { let t = !1; return e.forEachChild(function r(i) { if (H2(i)) { t = !0; return } !Yr(i) && !Jc(i) && !ms(i) && pa(i, r) }), t } function G1e(e, t, r) { let i = Vi(e, t), o = r.getTypeChecker(), s = pje(e, o, i.parent); if (s && !F1e(s.body) && !o.containsArgumentsReference(s)) return { selectedVariableDeclaration: !0, func: s }; let l = Xd(i); if (l && (ms(l) || xs(l)) && !Od(l.body, i) && !F1e(l.body) && !o.containsArgumentsReference(l)) return ms(l) && U1e(e, o, l) ? void 0 : { selectedVariableDeclaration: !1, func: l } } function _je(e) { return wi(e) || pu(e) && e.declarations.length === 1 } function pje(e, t, r) { if (!_je(r)) return; let o = (wi(r) ? r : Vo(r.declarations)).initializer; if (o && (xs(o) || ms(o) && !U1e(e, t, o))) return o } function B1e(e) { if (ot(e)) { let t = D.createReturnStatement(e), r = e.getSourceFile(); return it(t, e), pd(t), qN(e, t, r, void 0, !0), D.createBlock([t], !0) } else return e } function mje(e) { let t = e.parent; if (!wi(t) || !L6(t)) return; let r = t.parent, i = r.parent; if (!(!pu(r) || !Bc(i) || !Re(t.name))) return { variableDeclaration: t, variableDeclarationList: r, statement: i, name: t.name } } function hje(e, t) { let { file: r } = e, i = B1e(t.body), o = D.createFunctionExpression(t.modifiers, t.asteriskToken, void 0, t.typeParameters, t.parameters, t.type, i); return nr.ChangeTracker.with(e, s => s.replaceNode(r, t, o)) } function gje(e, t, r) { let { file: i } = e, o = B1e(t.body), { variableDeclaration: s, variableDeclarationList: l, statement: f, name: d } = r; D7(f); let g = wg(s) & 1 | uu(t), m = D.createModifiersFromModifierFlags(g), v = D.createFunctionDeclaration(Fn(m) ? m : void 0, t.asteriskToken, d, t.typeParameters, t.parameters, t.type, o); return l.declarations.length === 1 ? nr.ChangeTracker.with(e, S => S.replaceNode(i, f, v)) : nr.ChangeTracker.with(e, S => { S.delete(i, s), S.insertNodeAfter(i, f, v) }) } function yje(e, t) { let { file: r } = e, o = t.body.statements[0], s; vje(t.body, o) ? (s = o.expression, pd(s), r1(o, s)) : s = t.body; let l = D.createArrowFunction(t.modifiers, t.typeParameters, t.parameters, t.type, D.createToken(38), s); return nr.ChangeTracker.with(e, f => f.replaceNode(r, t, l)) } function vje(e, t) { return e.statements.length === 1 && j_(t) && !!t.expression } function U1e(e, t, r) { return !!r.name && js.Core.isSymbolReferencedInFile(r.name, t, e) } var Oee, V1e, kk, Dk, wk, bje = gt({ "src/services/refactors/convertArrowFunctionOrFunctionExpression.ts"() { "use strict"; Fr(), Qm(), Oee = "Convert arrow function or function expression", V1e = uo(_.Convert_arrow_function_or_function_expression), kk = { name: "Convert to anonymous function", description: uo(_.Convert_to_anonymous_function), kind: "refactor.rewrite.function.anonymous" }, Dk = { name: "Convert to named function", description: uo(_.Convert_to_named_function), kind: "refactor.rewrite.function.named" }, wk = { name: "Convert to arrow function", description: uo(_.Convert_to_arrow_function), kind: "refactor.rewrite.function.arrow" }, Vh(Oee, { kinds: [kk.kind, Dk.kind, wk.kind], getEditsForAction: fje, getAvailableActions: dje }) } }), Eje = {}, Tje = gt({ "src/services/_namespaces/ts.refactor.convertArrowFunctionOrFunctionExpression.ts"() { "use strict"; bje() } }); function Sje(e) { let { file: t, startPosition: r } = e; return Cu(t) || !W1e(t, r, e.program.getTypeChecker()) ? Je : [{ name: NP, description: Fee, actions: [Gee] }] } function xje(e, t) { L.assert(t === NP, "Unexpected action name"); let { file: r, startPosition: i, program: o, cancellationToken: s, host: l } = e, f = W1e(r, i, o.getTypeChecker()); if (!f || !s) return; let d = Cje(f, o, s); return d.valid ? { renameFilename: void 0, renameLocation: void 0, edits: nr.ChangeTracker.with(e, m => Aje(r, o, l, m, f, d)) } : { edits: [] } } function Aje(e, t, r, i, o, s) { let l = s.signature, f = on(q1e(o, t, r), m => cc(m)); if (l) { let m = on(q1e(l, t, r), v => cc(v)); g(l, m) } g(o, f); let d = HD(s.functionCalls, (m, v) => Es(m.pos, v.pos)); for (let m of d) if (m.arguments && m.arguments.length) { let v = cc(Mje(o, m.arguments), !0); i.replaceNodeRange(Gn(m), Vo(m.arguments), To(m.arguments), v, { leadingTriviaOption: nr.LeadingTriviaOption.IncludeAll, trailingTriviaOption: nr.TrailingTriviaOption.Include }) } function g(m, v) { i.replaceNodeRangeWithNodes(e, Vo(m.parameters), To(m.parameters), v, { joiner: ", ", indentation: 0, leadingTriviaOption: nr.LeadingTriviaOption.IncludeAll, trailingTriviaOption: nr.TrailingTriviaOption.Include }) } } function Cje(e, t, r) { let i = Gje(e), o = Ec(e) ? Fje(e) : [], s = fA([...i, ...o], Zv), l = t.getTypeChecker(), f = Uo(s, v => js.getReferenceEntriesForNode(-1, v, t, t.getSourceFiles(), r)), d = g(f); return Ji(d.declarations, v => ya(s, v)) || (d.valid = !1), d; function g(v) { let S = { accessExpressions: [], typeUsages: [] }, x = { functionCalls: [], declarations: [], classReferences: S, valid: !0 }, A = on(i, m), w = on(o, m), C = Ec(e), P = on(i, F => Nee(F, l)); for (let F of v) { if (F.kind === js.EntryKind.Span) { x.valid = !1; continue } if (ya(P, m(F.node))) { if (Dje(F.node.parent)) { x.signature = F.node.parent; continue } let q = H1e(F); if (q) { x.functionCalls.push(q); continue } } let B = Nee(F.node, l); if (B && ya(P, B)) { let q = Pee(F); if (q) { x.declarations.push(q); continue } } if (ya(A, m(F.node)) || ZL(F.node)) { if (j1e(F)) continue; let W = Pee(F); if (W) { x.declarations.push(W); continue } let Y = H1e(F); if (Y) { x.functionCalls.push(Y); continue } } if (C && ya(w, m(F.node))) { if (j1e(F)) continue; let W = Pee(F); if (W) { x.declarations.push(W); continue } let Y = Ije(F); if (Y) { S.accessExpressions.push(Y); continue } if (sl(e.parent)) { let R = Lje(F); if (R) { S.typeUsages.push(R); continue } } } x.valid = !1 } return x } function m(v) { let S = l.getSymbolAtLocation(v); return S && ege(S, l) } } function Nee(e, t) { let r = nP(e); if (r) { let i = t.getContextualTypeForObjectLiteralElement(r), o = i?.getSymbol(); if (o && !(ac(o) & 6)) return o } } function j1e(e) { let t = e.node; if ($u(t.parent) || lm(t.parent) || Nl(t.parent) || nv(t.parent) || Mu(t.parent) || pc(t.parent)) return t } function Pee(e) { if (Kl(e.node.parent)) return e.node } function H1e(e) { if (e.node.parent) { let t = e.node, r = t.parent; switch (r.kind) { case 210: case 211: let i = zr(r, Ih); if (i && i.expression === t) return i; break; case 208: let o = zr(r, br); if (o && o.parent && o.name === t) { let l = zr(o.parent, Ih); if (l && l.expression === o) return l } break; case 209: let s = zr(r, Vs); if (s && s.parent && s.argumentExpression === t) { let l = zr(s.parent, Ih); if (l && l.expression === s) return l } break } } } function Ije(e) { if (e.node.parent) { let t = e.node, r = t.parent; switch (r.kind) { case 208: let i = zr(r, br); if (i && i.expression === t) return i; break; case 209: let o = zr(r, Vs); if (o && o.expression === t) return o; break } } } function Lje(e) { let t = e.node; if (ZT(t) === 2 || IR(t.parent)) return t } function W1e(e, t, r) { let i = nk(e, t), o = ice(i); if (!kje(i) && o && wje(o, r) && Od(o, i) && !(o.body && Od(o.body, i))) return o } function kje(e) { let t = jn(e, IA); if (t) { let r = jn(t, i => !IA(i)); return !!r && Ds(r) } return !1 } function Dje(e) { return zm(e) && (ku(e.parent) || Rd(e.parent)) } function wje(e, t) { var r; if (!Rje(e.parameters, t)) return !1; switch (e.kind) { case 259: return z1e(e) && OP(e, t); case 171: if (rs(e.parent)) { let i = Nee(e.name, t); return ((r = i?.declarations) == null ? void 0 : r.length) === 1 && OP(e, t) } return OP(e, t); case 173: return sl(e.parent) ? z1e(e.parent) && OP(e, t) : J1e(e.parent.parent) && OP(e, t); case 215: case 216: return J1e(e.parent) }return !1 } function OP(e, t) { return !!e.body && !t.isImplementationOfOverload(e) } function z1e(e) { return e.name ? !0 : !!z2(e, 88) } function Rje(e, t) { return Nje(e) >= X1e && Ji(e, r => Oje(r, t)) } function Oje(e, t) { if (Fm(e)) { let r = t.getTypeAtLocation(e); if (!t.isArrayType(r) && !t.isTupleType(r)) return !1 } return !e.modifiers && Re(e.name) } function J1e(e) { return wi(e) && kh(e) && Re(e.name) && !e.type } function Mee(e) { return e.length > 0 && H2(e[0].name) } function Nje(e) { return Mee(e) ? e.length - 1 : e.length } function K1e(e) { return Mee(e) && (e = D.createNodeArray(e.slice(1), e.hasTrailingComma)), e } function Pje(e, t) { return Re(t) && l_(t) === e ? D.createShorthandPropertyAssignment(e) : D.createPropertyAssignment(e, t) } function Mje(e, t) { let r = K1e(e.parameters), i = Fm(To(r)), o = i ? t.slice(0, r.length - 1) : t, s = on(o, (f, d) => { let g = bG(r[d]), m = Pje(g, f); return pd(m.name), yl(m) && pd(m.initializer), r1(f, m), m }); if (i && t.length >= r.length) { let f = t.slice(r.length - 1), d = D.createPropertyAssignment(bG(To(r)), D.createArrayLiteralExpression(f)); s.push(d) } return D.createObjectLiteralExpression(s, !1) } function q1e(e, t, r) { let i = t.getTypeChecker(), o = K1e(e.parameters), s = on(o, m), l = D.createObjectBindingPattern(s), f = v(o), d; Ji(o, A) && (d = D.createObjectLiteralExpression()); let g = D.createParameterDeclaration(void 0, void 0, l, void 0, f, d); if (Mee(e.parameters)) { let w = e.parameters[0], C = D.createParameterDeclaration(void 0, void 0, w.name, void 0, w.type); return pd(C.name), r1(w.name, C.name), w.type && (pd(C.type), r1(w.type, C.type)), D.createNodeArray([C, g]) } return D.createNodeArray([g]); function m(w) { let C = D.createBindingElement(void 0, void 0, bG(w), Fm(w) && A(w) ? D.createArrayLiteralExpression() : w.initializer); return pd(C), w.initializer && C.initializer && r1(w.initializer, C.initializer), C } function v(w) { let C = on(w, S); return bp(D.createTypeLiteralNode(C), 1) } function S(w) { let C = w.type; !C && (w.initializer || Fm(w)) && (C = x(w)); let P = D.createPropertySignature(void 0, bG(w), A(w) ? D.createToken(57) : w.questionToken, C); return pd(P), r1(w.name, P.name), w.type && P.type && r1(w.type, P.type), P } function x(w) { let C = i.getTypeAtLocation(w); return lk(C, w, t, r) } function A(w) { if (Fm(w)) { let C = i.getTypeAtLocation(w); return !i.isTupleType(C) } return i.isOptionalParameter(w) } } function bG(e) { return l_(e.name) } function Fje(e) { switch (e.parent.kind) { case 260: let t = e.parent; return t.name ? [t.name] : [L.checkDefined(z2(t, 88), "Nameless class declaration should be a default export")]; case 228: let i = e.parent, o = e.parent.parent, s = i.name; return s ? [s, o.name] : [o.name] } } function Gje(e) { switch (e.kind) { case 259: return e.name ? [e.name] : [L.checkDefined(z2(e, 88), "Nameless function declaration should be a default export")]; case 171: return [e.name]; case 173: let r = L.checkDefined(Yo(e, 135, e.getSourceFile()), "Constructor declaration should have constructor keyword"); return e.parent.kind === 228 ? [e.parent.parent.name, r] : [r]; case 216: return [e.parent.name]; case 215: return e.name ? [e.name, e.parent.name] : [e.parent.name]; default: return L.assertNever(e, `Unexpected function declaration kind ${e.kind}`) } } var NP, X1e, Fee, Gee, Bje = gt({ "src/services/refactors/convertParamsToDestructuredObject.ts"() { "use strict"; Fr(), Qm(), NP = "Convert parameters to destructured object", X1e = 1, Fee = uo(_.Convert_parameters_to_destructured_object), Gee = { name: NP, description: Fee, kind: "refactor.rewrite.parameters.toDestructured" }, Vh(NP, { kinds: [Gee.kind], getEditsForAction: xje, getAvailableActions: Sje }) } }), Uje = {}, Vje = gt({ "src/services/_namespaces/ts.refactor.convertParamsToDestructuredObject.ts"() { "use strict"; Bje() } }); function jje(e) { let { file: t, startPosition: r } = e, i = Y1e(t, r), o = Bee(i), s = { name: EG, description: TG, actions: [] }; return ar(o) && Uee(o).isValidConcatenation ? (s.actions.push(SG), [s]) : e.preferences.provideRefactorNotApplicableReason ? (s.actions.push({ ...SG, notApplicableReason: uo(_.Can_only_convert_string_concatenation) }), [s]) : Je } function Y1e(e, t) { let r = Vi(e, t), i = Bee(r); return !Uee(i).isValidConcatenation && ud(i.parent) && ar(i.parent.parent) ? i.parent.parent : r } function Hje(e, t) { let { file: r, startPosition: i } = e, o = Y1e(r, i); switch (t) { case TG: return { edits: Wje(e, o) }; default: return L.fail("invalid action") } } function Wje(e, t) { let r = Bee(t), i = e.file, o = Kje(Uee(r), i), s = eb(i.text, r.end); if (s) { let l = s[s.length - 1], f = { pos: s[0].pos, end: l.end }; return nr.ChangeTracker.with(e, d => { d.deleteRange(i, f), d.replaceNode(i, r, o) }) } else return nr.ChangeTracker.with(e, l => l.replaceNode(i, r, o)) } function zje(e) { return e.operatorToken.kind !== 63 } function Bee(e) { return jn(e.parent, r => { switch (r.kind) { case 208: case 209: return !1; case 225: case 223: return !(ar(r.parent) && zje(r.parent)); default: return "quit" } }) || e } function Uee(e) { let t = l => { if (!ar(l)) return { nodes: [l], operators: [], validOperators: !0, hasString: yo(l) || IS(l) }; let { nodes: f, operators: d, hasString: g, validOperators: m } = t(l.left); if (!(g || yo(l.right) || d3(l.right))) return { nodes: [l], operators: [], hasString: !1, validOperators: !0 }; let v = l.operatorToken.kind === 39, S = m && v; return f.push(l.right), d.push(l.operatorToken), { nodes: f, operators: d, hasString: !0, validOperators: S } }, { nodes: r, operators: i, validOperators: o, hasString: s } = t(e); return { nodes: r, operators: i, isValidConcatenation: o && s } } function Jje(e) { return e.replace(/\\.|[$`]/g, t => t[0] === "\\" ? t : "\\" + t) } function $1e(e) { let t = f2(e) || Aue(e) ? -2 : -1; return Qc(e).slice(1, t) } function Q1e(e, t) { let r = [], i = "", o = ""; for (; e < t.length;) { let s = t[e]; if (es(s)) i += s.text, o += Jje(Qc(s).slice(1, -1)), r.push(e), e++; else if (d3(s)) { i += s.head.text, o += $1e(s.head); break } else break } return [e, i, o, r] } function Kje({ nodes: e, operators: t }, r) { let i = eSe(t, r), o = tSe(e, r, i), [s, l, f, d] = Q1e(0, e); if (s === e.length) { let v = D.createNoSubstitutionTemplateLiteral(l, f); return o(d, v), v } let g = [], m = D.createTemplateHead(l, f); o(d, m); for (let v = s; v < e.length; v++) { let S = qje(e[v]); i(v, S); let [x, A, w, C] = Q1e(v + 1, e); v = x - 1; let P = v === e.length - 1; if (d3(S)) { let F = on(S.templateSpans, (B, q) => { Z1e(B); let W = q === S.templateSpans.length - 1, Y = B.literal.text + (W ? A : ""), R = $1e(B.literal) + (W ? w : ""); return D.createTemplateSpan(B.expression, P && W ? D.createTemplateTail(Y, R) : D.createTemplateMiddle(Y, R)) }); g.push(...F) } else { let F = P ? D.createTemplateTail(A, w) : D.createTemplateMiddle(A, w); o(C, F), g.push(D.createTemplateSpan(S, F)) } } return D.createTemplateExpression(m, g) } function Z1e(e) { let t = e.getSourceFile(); sk(e, e.expression, t, 3, !1), qN(e.expression, e.expression, t, 3, !1) } function qje(e) { return ud(e) && (Z1e(e), e = e.expression), e } var EG, TG, SG, eSe, tSe, Xje = gt({ "src/services/refactors/convertStringOrTemplateLiteral.ts"() { "use strict"; Fr(), Qm(), EG = "Convert to template string", TG = uo(_.Convert_to_template_string), SG = { name: EG, description: TG, kind: "refactor.rewrite.string" }, Vh(EG, { kinds: [SG.kind], getEditsForAction: Hje, getAvailableActions: jje }), eSe = (e, t) => (r, i) => { r < e.length && sk(e[r], i, t, 3, !1) }, tSe = (e, t, r) => (i, o) => { for (; i.length > 0;) { let s = i.shift(); sk(e[s], o, t, 3, !1), r(s, o) } } } }), Yje = {}, $je = gt({ "src/services/_namespaces/ts.refactor.convertStringOrTemplateLiteral.ts"() { "use strict"; Xje() } }); function Qje(e) { let t = nSe(e, e.triggerReason === "invoked"); return t ? $m(t) ? e.preferences.provideRefactorNotApplicableReason ? [{ name: PP, description: CG, actions: [{ ...IG, notApplicableReason: t.error }] }] : Je : [{ name: PP, description: CG, actions: [IG] }] : Je } function Zje(e, t) { let r = nSe(e); return L.assert(r && !$m(r), "Expected applicable refactor info"), { edits: nr.ChangeTracker.with(e, o => sHe(e.file, e.program.getTypeChecker(), o, r, t)), renameFilename: void 0, renameLocation: void 0 } } function xG(e) { return ar(e) || b2(e) } function eHe(e) { return Ol(e) || j_(e) || Bc(e) } function AG(e) { return xG(e) || eHe(e) } function nSe(e, t = !0) { let { file: r, program: i } = e, o = QS(e), s = o.length === 0; if (s && !t) return; let l = Vi(r, o.start), f = p7(r, o.start + o.length), d = Wc(l.pos, f && f.end >= l.pos ? f.getEnd() : l.getEnd()), g = s ? aHe(l) : iHe(l, d), m = g && AG(g) ? oHe(g) : void 0; if (!m) return { error: uo(_.Could_not_find_convertible_access_expression) }; let v = i.getTypeChecker(); return b2(m) ? tHe(m, v) : nHe(m) } function tHe(e, t) { let r = e.condition, i = jee(e.whenTrue); if (!i || t.isNullableType(t.getTypeAtLocation(i))) return { error: uo(_.Could_not_find_convertible_access_expression) }; if ((br(r) || Re(r)) && Vee(r, i.expression)) return { finalExpression: i, occurrences: [r], expression: e }; if (ar(r)) { let o = rSe(i.expression, r); return o ? { finalExpression: i, occurrences: o, expression: e } : { error: uo(_.Could_not_find_matching_access_expressions) } } } function nHe(e) { if (e.operatorToken.kind !== 55) return { error: uo(_.Can_only_convert_logical_AND_access_chains) }; let t = jee(e.right); if (!t) return { error: uo(_.Could_not_find_convertible_access_expression) }; let r = rSe(t.expression, e.left); return r ? { finalExpression: t, occurrences: r, expression: e } : { error: uo(_.Could_not_find_matching_access_expressions) } } function rSe(e, t) { let r = []; for (; ar(t) && t.operatorToken.kind === 55;) { let o = Vee(vs(e), vs(t.right)); if (!o) break; r.push(o), e = o, t = t.left } let i = Vee(e, t); return i && r.push(i), r.length > 0 ? r : void 0 } function Vee(e, t) { if (!(!Re(t) && !br(t) && !Vs(t))) return rHe(e, t) ? t : void 0 } function rHe(e, t) { for (; (Pa(e) || br(e) || Vs(e)) && Rk(e) !== Rk(t);)e = e.expression; for (; br(e) && br(t) || Vs(e) && Vs(t);) { if (Rk(e) !== Rk(t)) return !1; e = e.expression, t = t.expression } return Re(e) && Re(t) && e.getText() === t.getText() } function Rk(e) { if (Re(e) || yf(e)) return e.getText(); if (br(e)) return Rk(e.name); if (Vs(e)) return Rk(e.argumentExpression) } function iHe(e, t) { for (; e.parent;) { if (AG(e) && t.length !== 0 && e.end >= t.start + t.length) return e; e = e.parent } } function aHe(e) { for (; e.parent;) { if (AG(e) && !AG(e.parent)) return e; e = e.parent } } function oHe(e) { if (xG(e)) return e; if (Bc(e)) { let t = HA(e), r = t?.initializer; return r && xG(r) ? r : void 0 } return e.expression && xG(e.expression) ? e.expression : void 0 } function jee(e) { if (e = vs(e), ar(e)) return jee(e.left); if ((br(e) || Vs(e) || Pa(e)) && !Jl(e)) return e } function iSe(e, t, r) { if (br(t) || Vs(t) || Pa(t)) { let i = iSe(e, t.expression, r), o = r.length > 0 ? r[r.length - 1] : void 0, s = o?.getText() === t.expression.getText(); if (s && r.pop(), Pa(t)) return s ? D.createCallChain(i, D.createToken(28), t.typeArguments, t.arguments) : D.createCallChain(i, t.questionDotToken, t.typeArguments, t.arguments); if (br(t)) return s ? D.createPropertyAccessChain(i, D.createToken(28), t.name) : D.createPropertyAccessChain(i, t.questionDotToken, t.name); if (Vs(t)) return s ? D.createElementAccessChain(i, D.createToken(28), t.argumentExpression) : D.createElementAccessChain(i, t.questionDotToken, t.argumentExpression) } return t } function sHe(e, t, r, i, o) { let { finalExpression: s, occurrences: l, expression: f } = i, d = l[l.length - 1], g = iSe(t, s, l); g && (br(g) || Vs(g) || Pa(g)) && (ar(f) ? r.replaceNodeRange(e, d, s, g) : b2(f) && r.replaceNode(e, f, D.createBinaryExpression(g, D.createToken(60), f.whenFalse))) } var PP, CG, IG, cHe = gt({ "src/services/refactors/convertToOptionalChainExpression.ts"() { "use strict"; Fr(), Qm(), PP = "Convert to optional chain expression", CG = uo(_.Convert_to_optional_chain_expression), IG = { name: PP, description: CG, kind: "refactor.rewrite.expression.optionalChain" }, Vh(PP, { kinds: [IG.kind], getEditsForAction: Zje, getAvailableActions: Qje }) } }), lHe = {}, uHe = gt({ "src/services/_namespaces/ts.refactor.convertToOptionalChainExpression.ts"() { "use strict"; cHe() } }); function aSe(e) { let t = e.kind, r = Hee(e.file, QS(e), e.triggerReason === "invoked"), i = r.targetRange; if (i === void 0) { if (!r.errors || r.errors.length === 0 || !e.preferences.provideRefactorNotApplicableReason) return Je; let A = []; return pv(px.kind, t) && A.push({ name: fx, description: px.description, actions: [{ ...px, notApplicableReason: x(r.errors) }] }), pv(_x.kind, t) && A.push({ name: fx, description: _x.description, actions: [{ ..._x, notApplicableReason: x(r.errors) }] }), A } let o = hHe(i, e); if (o === void 0) return Je; let s = [], l = new Map, f, d = [], g = new Map, m, v = 0; for (let { functionExtraction: A, constantExtraction: w } of o) { if (pv(px.kind, t)) { let C = A.description; A.errors.length === 0 ? l.has(C) || (l.set(C, !0), s.push({ description: C, name: `function_scope_${v}`, kind: px.kind })) : f || (f = { description: C, name: `function_scope_${v}`, notApplicableReason: x(A.errors), kind: px.kind }) } if (pv(_x.kind, t)) { let C = w.description; w.errors.length === 0 ? g.has(C) || (g.set(C, !0), d.push({ description: C, name: `constant_scope_${v}`, kind: _x.kind })) : m || (m = { description: C, name: `constant_scope_${v}`, notApplicableReason: x(w.errors), kind: _x.kind }) } v++ } let S = []; return s.length ? S.push({ name: fx, description: uo(_.Extract_function), actions: s }) : e.preferences.provideRefactorNotApplicableReason && f && S.push({ name: fx, description: uo(_.Extract_function), actions: [f] }), d.length ? S.push({ name: fx, description: uo(_.Extract_constant), actions: d }) : e.preferences.provideRefactorNotApplicableReason && m && S.push({ name: fx, description: uo(_.Extract_constant), actions: [m] }), S.length ? S : Je; function x(A) { let w = A[0].messageText; return typeof w != "string" && (w = w.messageText), w } } function oSe(e, t) { let i = Hee(e.file, QS(e)).targetRange, o = /^function_scope_(\d+)$/.exec(t); if (o) { let l = +o[1]; return L.assert(isFinite(l), "Expected to parse a finite number from the function scope index"), pHe(i, e, l) } let s = /^constant_scope_(\d+)$/.exec(t); if (s) { let l = +s[1]; return L.assert(isFinite(l), "Expected to parse a finite number from the constant scope index"), mHe(i, e, l) } L.fail("Unrecognized action name") } function Hee(e, t, r = !0) { let { length: i } = t; if (i === 0 && !r) return { errors: [al(e, t.start, i, vl.cannotExtractEmpty)] }; let o = i === 0 && r, s = Ihe(e, t.start), l = p7(e, wl(t)), f = s && l && r ? dHe(s, l, e) : t, d = o ? MHe(s) : HN(s, e, f), g = o ? d : HN(l, e, f), m = 0, v; if (!d || !g) return { errors: [al(e, t.start, i, vl.cannotExtractRange)] }; if (d.flags & 8388608) return { errors: [al(e, t.start, i, vl.cannotExtractJSDoc)] }; if (d.parent !== g.parent) return { errors: [al(e, t.start, i, vl.cannotExtractRange)] }; if (d !== g) { if (!cSe(d.parent)) return { errors: [al(e, t.start, i, vl.cannotExtractRange)] }; let F = []; for (let B of d.parent.statements) { if (B === d || F.length) { let q = P(B); if (q) return { errors: q }; F.push(B) } if (B === g) break } return F.length ? { targetRange: { range: F, facts: m, thisNode: v } } : { errors: [al(e, t.start, i, vl.cannotExtractRange)] } } if (j_(d) && !d.expression) return { errors: [al(e, t.start, i, vl.cannotExtractRange)] }; let S = A(d), x = w(S) || P(S); if (x) return { errors: x }; return { targetRange: { range: fHe(S), facts: m, thisNode: v } }; function A(F) { if (j_(F)) { if (F.expression) return F.expression } else if (Bc(F) || pu(F)) { let B = Bc(F) ? F.declarationList.declarations : F.declarations, q = 0, W; for (let Y of B) Y.initializer && (q++, W = Y.initializer); if (q === 1) return W } else if (wi(F) && F.initializer) return F.initializer; return F } function w(F) { if (Re(Ol(F) ? F.expression : F)) return [hr(F, vl.cannotExtractIdentifier)] } function C(F, B) { let q = F; for (; q !== B;) { if (q.kind === 169) { Ca(q) && (m |= 32); break } else if (q.kind === 166) { Xd(q).kind === 173 && (m |= 32); break } else q.kind === 171 && Ca(q) && (m |= 32); q = q.parent } } function P(F) { let B; if (($ => { $[$.None = 0] = "None", $[$.Break = 1] = "Break", $[$.Continue = 2] = "Continue", $[$.Return = 4] = "Return" })(B || (B = {})), L.assert(F.pos <= F.end, "This failure could trigger https://github.com/Microsoft/TypeScript/issues/20809 (1)"), L.assert(!vp(F.pos), "This failure could trigger https://github.com/Microsoft/TypeScript/issues/20809 (2)"), !ca(F) && !(Dh(F) && sSe(F)) && !qee(F)) return [hr(F, vl.statementOrExpressionExpected)]; if (F.flags & 16777216) return [hr(F, vl.cannotExtractAmbientBlock)]; let q = Zc(F); q && C(F, q); let W, Y = 4, R; if (ie(F), m & 8) { let $ = Ku(F, !1, !1); ($.kind === 259 || $.kind === 171 && $.parent.kind === 207 || $.kind === 215) && (m |= 16) } return W; function ie($) { if (W) return !0; if (Kl($)) { let Z = $.kind === 257 ? $.parent.parent : $; if (Mr(Z, 1)) return (W || (W = [])).push(hr($, vl.cannotExtractExportedEntity)), !0 } switch ($.kind) { case 269: return (W || (W = [])).push(hr($, vl.cannotExtractImport)), !0; case 274: return (W || (W = [])).push(hr($, vl.cannotExtractExportedEntity)), !0; case 106: if ($.parent.kind === 210) { let Z = Zc($); if (Z === void 0 || Z.pos < t.start || Z.end >= t.start + t.length) return (W || (W = [])).push(hr($, vl.cannotExtractSuper)), !0 } else m |= 8, v = $; break; case 216: pa($, function Z(U) { if (H2(U)) m |= 8, v = $; else { if (Yr(U) || Ia(U) && !xs(U)) return !1; pa(U, Z) } }); case 260: case 259: Li($.parent) && $.parent.externalModuleIndicator === void 0 && (W || (W = [])).push(hr($, vl.functionWillNotBeVisibleInTheNewScope)); case 228: case 215: case 171: case 173: case 174: case 175: return !1 }let fe = Y; switch ($.kind) { case 242: Y &= -5; break; case 255: Y = 0; break; case 238: $.parent && $.parent.kind === 255 && $.parent.finallyBlock === $ && (Y = 4); break; case 293: case 292: Y |= 1; break; default: Wy($, !1) && (Y |= 3); break }switch ($.kind) { case 194: case 108: m |= 8, v = $; break; case 253: { let Z = $.label; (R || (R = [])).push(Z.escapedText), pa($, ie), R.pop(); break } case 249: case 248: { let Z = $.label; Z ? ya(R, Z.escapedText) || (W || (W = [])).push(hr($, vl.cannotExtractRangeContainingLabeledBreakOrContinueStatementWithTargetOutsideOfTheRange)) : Y & ($.kind === 249 ? 1 : 2) || (W || (W = [])).push(hr($, vl.cannotExtractRangeContainingConditionalBreakOrContinueStatements)); break } case 220: m |= 4; break; case 226: m |= 2; break; case 250: Y & 4 ? m |= 1 : (W || (W = [])).push(hr($, vl.cannotExtractRangeContainingConditionalReturnStatement)); break; default: pa($, ie); break }Y = fe } } } function dHe(e, t, r) { let i = e.getStart(r), o = t.getEnd(); return r.text.charCodeAt(o) === 59 && o++, { start: i, length: o - i } } function fHe(e) { if (ca(e)) return [e]; if (Dh(e)) return Ol(e.parent) ? [e.parent] : e; if (qee(e)) return e } function Wee(e) { return xs(e) ? Hj(e.body) : Ds(e) || Li(e) || Tp(e) || Yr(e) } function _He(e) { let t = jh(e.range) ? Vo(e.range) : e.range; if (e.facts & 8 && !(e.facts & 16)) { let i = Zc(t); if (i) { let o = jn(t, Ds); return o ? [o, i] : [i] } } let r = []; for (; ;)if (t = t.parent, t.kind === 166 && (t = jn(t, i => Ds(i)).parent), Wee(t) && (r.push(t), t.kind === 308)) return r } function pHe(e, t, r) { let { scopes: i, readsAndWrites: { target: o, usagesPerScope: s, functionErrorsPerScope: l, exposedVariableDeclarations: f } } = zee(e, t); return L.assert(!l[r].length, "The extraction went missing? How?"), t.cancellationToken.throwIfCancellationRequested(), THe(o, i[r], s[r], f, e, t) } function mHe(e, t, r) { let { scopes: i, readsAndWrites: { target: o, usagesPerScope: s, constantErrorsPerScope: l, exposedVariableDeclarations: f } } = zee(e, t); L.assert(!l[r].length, "The extraction went missing? How?"), L.assert(f.length === 0, "Extract constant accepted a range containing a variable declaration?"), t.cancellationToken.throwIfCancellationRequested(); let d = ot(o) ? o : o.statements[0].expression; return SHe(d, i[r], s[r], e.facts, t) } function hHe(e, t) { let { scopes: r, readsAndWrites: { functionErrorsPerScope: i, constantErrorsPerScope: o } } = zee(e, t); return r.map((l, f) => { let d = gHe(l), g = yHe(l), m = Ds(l) ? vHe(l) : Yr(l) ? bHe(l) : EHe(l), v, S; return m === 1 ? (v = jm(uo(_.Extract_to_0_in_1_scope), [d, "global"]), S = jm(uo(_.Extract_to_0_in_1_scope), [g, "global"])) : m === 0 ? (v = jm(uo(_.Extract_to_0_in_1_scope), [d, "module"]), S = jm(uo(_.Extract_to_0_in_1_scope), [g, "module"])) : (v = jm(uo(_.Extract_to_0_in_1), [d, m]), S = jm(uo(_.Extract_to_0_in_1), [g, m])), f === 0 && !Yr(l) && (S = jm(uo(_.Extract_to_0_in_enclosing_scope), [g])), { functionExtraction: { description: v, errors: i[f] }, constantExtraction: { description: S, errors: o[f] } } }) } function zee(e, t) { let { file: r } = t, i = _He(e), o = NHe(e, r), s = PHe(e, i, o, r, t.program.getTypeChecker(), t.cancellationToken); return { scopes: i, readsAndWrites: s } } function gHe(e) { return Ds(e) ? "inner function" : Yr(e) ? "method" : "function" } function yHe(e) { return Yr(e) ? "readonly field" : "constant" } function vHe(e) { switch (e.kind) { case 173: return "constructor"; case 215: case 259: return e.name ? `function '${e.name.text}'` : X7; case 216: return "arrow function"; case 171: return `method '${e.name.getText()}'`; case 174: return `'get ${e.name.getText()}'`; case 175: return `'set ${e.name.getText()}'`; default: throw L.assertNever(e, `Unexpected scope kind ${e.kind}`) } } function bHe(e) { return e.kind === 260 ? e.name ? `class '${e.name.text}'` : "anonymous class declaration" : e.name ? `class expression '${e.name.text}'` : "anonymous class expression" } function EHe(e) { return e.kind === 265 ? `namespace '${e.parent.name.getText()}'` : e.externalModuleIndicator ? 0 : 1 } function THe(e, t, { usages: r, typeParameterUsages: i, substitutions: o }, s, l, f) { let d = f.program.getTypeChecker(), g = Do(f.program.getCompilerOptions()), m = gu.createImportAdder(f.file, f.program, f.preferences, f.host), v = t.getSourceFile(), S = i1(Yr(t) ? "newMethod" : "newFunction", v), x = Yn(t), A = D.createIdentifier(S), w, C = [], P = [], F; r.forEach((Ce, Ie) => { let Be; if (!x) { let Le = d.getTypeOfSymbolAtLocation(Ce.symbol, Ce.node); Le = d.getBaseTypeOfLiteralType(Le), Be = gu.typeToAutoImportableTypeNode(d, m, Le, t, g, 1) } let Ne = D.createParameterDeclaration(void 0, void 0, Ie, void 0, Be); C.push(Ne), Ce.usage === 2 && (F || (F = [])).push(Ce), P.push(D.createIdentifier(Ie)) }); let q = lo(i.values(), Ce => ({ type: Ce, declaration: AHe(Ce) })).sort(CHe), W = q.length === 0 ? void 0 : q.map(Ce => Ce.declaration), Y = W !== void 0 ? W.map(Ce => D.createTypeReferenceNode(Ce.name, void 0)) : void 0; if (ot(e) && !x) { let Ce = d.getContextualType(e); w = d.typeToTypeNode(Ce, t, 1) } let { body: R, returnValueProperty: ie } = LHe(e, s, F, o, !!(l.facts & 1)); pd(R); let $, fe = !!(l.facts & 16); if (Yr(t)) { let Ce = x ? [] : [D.createModifier(121)]; l.facts & 32 && Ce.push(D.createModifier(124)), l.facts & 4 && Ce.push(D.createModifier(132)), $ = D.createMethodDeclaration(Ce.length ? Ce : void 0, l.facts & 2 ? D.createToken(41) : void 0, A, void 0, W, C, w, R) } else fe && C.unshift(D.createParameterDeclaration(void 0, void 0, "this", void 0, d.typeToTypeNode(d.getTypeAtLocation(l.thisNode), t, 1), void 0)), $ = D.createFunctionDeclaration(l.facts & 4 ? [D.createToken(132)] : void 0, l.facts & 2 ? D.createToken(41) : void 0, A, W, C, w, R); let Z = nr.ChangeTracker.fromContext(f), U = (jh(l.range) ? To(l.range) : l.range).end, re = wHe(U, t); re ? Z.insertNodeBefore(f.file, re, $, !0) : Z.insertNodeAtEndOfScope(f.file, t, $), m.writeFixes(Z); let le = [], _e = IHe(t, l, S); fe && P.unshift(D.createIdentifier("this")); let ge = D.createCallExpression(fe ? D.createPropertyAccessExpression(_e, "call") : _e, Y, P); if (l.facts & 2 && (ge = D.createYieldExpression(D.createToken(41), ge)), l.facts & 4 && (ge = D.createAwaitExpression(ge)), Kee(e) && (ge = D.createJsxExpression(void 0, ge)), s.length && !F) if (L.assert(!ie, "Expected no returnValueProperty"), L.assert(!(l.facts & 1), "Expected RangeFacts.HasReturn flag to be unset"), s.length === 1) { let Ce = s[0]; le.push(D.createVariableStatement(void 0, D.createVariableDeclarationList([D.createVariableDeclaration(cc(Ce.name), void 0, cc(Ce.type), ge)], Ce.parent.flags))) } else { let Ce = [], Ie = [], Be = s[0].parent.flags, Ne = !1; for (let Ye of s) { Ce.push(D.createBindingElement(void 0, void 0, cc(Ye.name))); let _t = d.typeToTypeNode(d.getBaseTypeOfLiteralType(d.getTypeAtLocation(Ye)), t, 1); Ie.push(D.createPropertySignature(void 0, Ye.symbol.name, void 0, _t)), Ne = Ne || Ye.type !== void 0, Be = Be & Ye.parent.flags } let Le = Ne ? D.createTypeLiteralNode(Ie) : void 0; Le && Jn(Le, 1), le.push(D.createVariableStatement(void 0, D.createVariableDeclarationList([D.createVariableDeclaration(D.createObjectBindingPattern(Ce), void 0, Le, ge)], Be))) } else if (s.length || F) { if (s.length) for (let Ie of s) { let Be = Ie.parent.flags; Be & 2 && (Be = Be & -3 | 1), le.push(D.createVariableStatement(void 0, D.createVariableDeclarationList([D.createVariableDeclaration(Ie.symbol.name, void 0, Pe(Ie.type))], Be))) } ie && le.push(D.createVariableStatement(void 0, D.createVariableDeclarationList([D.createVariableDeclaration(ie, void 0, Pe(w))], 1))); let Ce = Jee(s, F); ie && Ce.unshift(D.createShorthandPropertyAssignment(ie)), Ce.length === 1 ? (L.assert(!ie, "Shouldn't have returnValueProperty here"), le.push(D.createExpressionStatement(D.createAssignment(Ce[0].name, ge))), l.facts & 1 && le.push(D.createReturnStatement())) : (le.push(D.createExpressionStatement(D.createAssignment(D.createObjectLiteralExpression(Ce), ge))), ie && le.push(D.createReturnStatement(D.createIdentifier(ie)))) } else l.facts & 1 ? le.push(D.createReturnStatement(ge)) : jh(l.range) ? le.push(D.createExpressionStatement(ge)) : le.push(ge); jh(l.range) ? Z.replaceNodeRangeWithNodes(f.file, Vo(l.range), To(l.range), le) : Z.replaceNodeWithNodes(f.file, l.range, le); let X = Z.getChanges(), we = (jh(l.range) ? Vo(l.range) : l.range).getSourceFile().fileName, ke = KN(X, we, S, !1); return { renameFilename: we, renameLocation: ke, edits: X }; function Pe(Ce) { if (Ce === void 0) return; let Ie = cc(Ce), Be = Ie; for (; wS(Be);)Be = Be.type; return DS(Be) && wr(Be.types, Ne => Ne.kind === 155) ? Ie : D.createUnionTypeNode([Ie, D.createKeywordTypeNode(155)]) } } function SHe(e, t, { substitutions: r }, i, o) { let s = o.program.getTypeChecker(), l = t.getSourceFile(), f = br(e) && !Yr(t) && !s.resolveName(e.name.text, e, 111551, !1) && !pi(e.name) && !nb(e.name) ? e.name.text : i1(Yr(t) ? "newProperty" : "newLocal", l), d = Yn(t), g = d || !s.isContextSensitive(e) ? void 0 : s.typeToTypeNode(s.getContextualType(e), t, 1), m = kHe(vs(e), r); ({ variableType: g, initializer: m } = w(g, m)), pd(m); let v = nr.ChangeTracker.fromContext(o); if (Yr(t)) { L.assert(!d, "Cannot extract to a JS class"); let C = []; C.push(D.createModifier(121)), i & 32 && C.push(D.createModifier(124)), C.push(D.createModifier(146)); let P = D.createPropertyDeclaration(C, f, void 0, g, m), F = D.createPropertyAccessExpression(i & 32 ? D.createIdentifier(t.name.getText()) : D.createThis(), D.createIdentifier(f)); Kee(e) && (F = D.createJsxExpression(void 0, F)); let B = e.pos, q = RHe(B, t); v.insertNodeBefore(o.file, q, P, !0), v.replaceNode(o.file, e, F) } else { let C = D.createVariableDeclaration(f, void 0, g, m), P = xHe(e, t); if (P) { v.insertNodeBefore(o.file, P, C); let F = D.createIdentifier(f); v.replaceNode(o.file, e, F) } else if (e.parent.kind === 241 && t === jn(e, Wee)) { let F = D.createVariableStatement(void 0, D.createVariableDeclarationList([C], 2)); v.replaceNode(o.file, e.parent, F) } else { let F = D.createVariableStatement(void 0, D.createVariableDeclarationList([C], 2)), B = OHe(e, t); if (B.pos === 0 ? v.insertNodeAtTopOfFile(o.file, F, !1) : v.insertNodeBefore(o.file, B, F, !1), e.parent.kind === 241) v.delete(o.file, e.parent); else { let q = D.createIdentifier(f); Kee(e) && (q = D.createJsxExpression(void 0, q)), v.replaceNode(o.file, e, q) } } } let S = v.getChanges(), x = e.getSourceFile().fileName, A = KN(S, x, f, !0); return { renameFilename: x, renameLocation: A, edits: S }; function w(C, P) { if (C === void 0) return { variableType: C, initializer: P }; if (!ms(P) && !xs(P) || P.typeParameters) return { variableType: C, initializer: P }; let F = s.getTypeAtLocation(e), B = Wp(s.getSignaturesOfType(F, 0)); if (!B) return { variableType: C, initializer: P }; if (B.getTypeParameters()) return { variableType: C, initializer: P }; let q = [], W = !1; for (let Y of P.parameters) if (Y.type) q.push(Y); else { let R = s.getTypeAtLocation(Y); R === s.getAnyType() && (W = !0), q.push(D.updateParameterDeclaration(Y, Y.modifiers, Y.dotDotDotToken, Y.name, Y.questionToken, Y.type || s.typeToTypeNode(R, t, 1), Y.initializer)) } if (W) return { variableType: C, initializer: P }; if (C = void 0, xs(P)) P = D.updateArrowFunction(P, g_(e) ? uT(e) : void 0, P.typeParameters, q, P.type || s.typeToTypeNode(B.getReturnType(), t, 1), P.equalsGreaterThanToken, P.body); else { if (B && B.thisParameter) { let Y = Sl(q); if (!Y || Re(Y.name) && Y.name.escapedText !== "this") { let R = s.getTypeOfSymbolAtLocation(B.thisParameter, e); q.splice(0, 0, D.createParameterDeclaration(void 0, void 0, "this", void 0, s.typeToTypeNode(R, t, 1))) } } P = D.updateFunctionExpression(P, g_(e) ? uT(e) : void 0, P.asteriskToken, P.name, P.typeParameters, q, P.type || s.typeToTypeNode(B.getReturnType(), t, 1), P.body) } return { variableType: C, initializer: P } } } function xHe(e, t) { let r; for (; e !== void 0 && e !== t;) { if (wi(e) && e.initializer === r && pu(e.parent) && e.parent.declarations.length > 1) return e; r = e, e = e.parent } } function AHe(e) { let t, r = e.symbol; if (r && r.declarations) for (let i of r.declarations) (t === void 0 || i.pos < t.pos) && (t = i); return t } function CHe({ type: e, declaration: t }, { type: r, declaration: i }) { return Cae(t, i, "pos", Es) || su(e.symbol ? e.symbol.getName() : "", r.symbol ? r.symbol.getName() : "") || Es(e.id, r.id) } function IHe(e, t, r) { let i = D.createIdentifier(r); if (Yr(e)) { let o = t.facts & 32 ? D.createIdentifier(e.name.text) : D.createThis(); return D.createPropertyAccessExpression(o, i) } else return i } function LHe(e, t, r, i, o) { let s = r !== void 0 || t.length > 0; if (Va(e) && !s && i.size === 0) return { body: D.createBlock(e.statements, !0), returnValueProperty: void 0 }; let l, f = !1, d = D.createNodeArray(Va(e) ? e.statements.slice(0) : [ca(e) ? e : D.createReturnStatement(vs(e))]); if (s || i.size) { let m = On(d, g, ca).slice(); if (s && !o && ca(e)) { let v = Jee(t, r); v.length === 1 ? m.push(D.createReturnStatement(v[0].name)) : m.push(D.createReturnStatement(D.createObjectLiteralExpression(v))) } return { body: D.createBlock(m, !0), returnValueProperty: l } } else return { body: D.createBlock(d, !0), returnValueProperty: void 0 }; function g(m) { if (!f && j_(m) && s) { let v = Jee(t, r); return m.expression && (l || (l = "__return"), v.unshift(D.createPropertyAssignment(l, $e(m.expression, g, ot)))), v.length === 1 ? D.createReturnStatement(v[0].name) : D.createReturnStatement(D.createObjectLiteralExpression(v)) } else { let v = f; f = f || Ds(m) || Yr(m); let S = i.get(zo(m).toString()), x = S ? cc(S) : xn(m, g, Bh); return f = v, x } } } function kHe(e, t) { return t.size ? r(e) : e; function r(i) { let o = t.get(zo(i).toString()); return o ? cc(o) : xn(i, r, Bh) } } function DHe(e) { if (Ds(e)) { let t = e.body; if (Va(t)) return t.statements } else { if (Tp(e) || Li(e)) return e.statements; if (Yr(e)) return e.members; } return Je } function wHe(e, t) { return wr(DHe(t), r => r.pos >= e && Ds(r) && !Ec(r)) } function RHe(e, t) { let r = t.members; L.assert(r.length > 0, "Found no members"); let i, o = !0; for (let s of r) { if (s.pos > e) return i || r[0]; if (o && !Na(s)) { if (i !== void 0) return s; o = !1 } i = s } return i === void 0 ? L.fail() : i } function OHe(e, t) { L.assert(!Yr(t)); let r; for (let i = e; i !== t; i = i.parent)Wee(i) && (r = i); for (let i = (r || e).parent; ; i = i.parent) { if (cSe(i)) { let o; for (let s of i.statements) { if (s.pos > e.pos) break; o = s } return !o && CL(i) ? (L.assert(pO(i.parent.parent), "Grandparent isn't a switch statement"), i.parent.parent) : L.checkDefined(o, "prevStatement failed to get set") } L.assert(i !== t, "Didn't encounter a block-like before encountering scope") } } function Jee(e, t) { let r = on(e, o => D.createShorthandPropertyAssignment(o.symbol.name)), i = on(t, o => D.createShorthandPropertyAssignment(o.symbol.name)); return r === void 0 ? i : i === void 0 ? r : r.concat(i) } function jh(e) { return ba(e) } function NHe(e, t) { return jh(e.range) ? { pos: Vo(e.range).getStart(t), end: To(e.range).getEnd() } : e.range } function PHe(e, t, r, i, o, s) { let l = new Map, f = [], d = [], g = [], m = [], v = [], S = new Map, x = [], A, w = jh(e.range) ? e.range.length === 1 && Ol(e.range[0]) ? e.range[0].expression : void 0 : e.range, C; if (w === void 0) { let re = e.range, le = Vo(re).getStart(), _e = To(re).end; C = al(i, le, _e - le, vl.expressionExpected) } else o.getTypeAtLocation(w).flags & 147456 && (C = hr(w, vl.uselessConstantType)); for (let re of t) { f.push({ usages: new Map, typeParameterUsages: new Map, substitutions: new Map }), d.push(new Map), g.push([]); let le = []; C && le.push(C), Yr(re) && Yn(re) && le.push(hr(re, vl.cannotExtractToJSClass)), xs(re) && !Va(re.body) && le.push(hr(re, vl.cannotExtractToExpressionArrowFunction)), m.push(le) } let P = new Map, F = jh(e.range) ? D.createBlock(e.range) : e.range, B = jh(e.range) ? Vo(e.range) : e.range, q = W(B); if (R(F), q && !jh(e.range) && !Sp(e.range)) { let re = o.getContextualType(e.range); Y(re) } if (l.size > 0) { let re = new Map, le = 0; for (let _e = B; _e !== void 0 && le < t.length; _e = _e.parent)if (_e === t[le] && (re.forEach((ge, X) => { f[le].typeParameterUsages.set(X, ge) }), le++), mH(_e)) for (let ge of jy(_e)) { let X = o.getTypeAtLocation(ge); l.has(X.id.toString()) && re.set(X.id.toString(), X) } L.assert(le === t.length, "Should have iterated all scopes") } if (v.length) { let re = pH(t[0], t[0].parent) ? t[0] : tm(t[0]); pa(re, fe) } for (let re = 0; re < t.length; re++) { let le = f[re]; if (re > 0 && (le.usages.size > 0 || le.typeParameterUsages.size > 0)) { let X = jh(e.range) ? e.range[0] : e.range; m[re].push(hr(X, vl.cannotAccessVariablesFromNestedScopes)) } e.facts & 16 && Yr(t[re]) && g[re].push(hr(e.thisNode, vl.cannotExtractFunctionsContainingThisToMethod)); let _e = !1, ge; if (f[re].usages.forEach(X => { X.usage === 2 && (_e = !0, X.symbol.flags & 106500 && X.symbol.valueDeclaration && cd(X.symbol.valueDeclaration, 64) && (ge = X.symbol.valueDeclaration)) }), L.assert(jh(e.range) || x.length === 0, "No variable declarations expected if something was extracted"), _e && !jh(e.range)) { let X = hr(e.range, vl.cannotWriteInExpression); g[re].push(X), m[re].push(X) } else if (ge && re > 0) { let X = hr(ge, vl.cannotExtractReadonlyPropertyInitializerOutsideConstructor); g[re].push(X), m[re].push(X) } else if (A) { let X = hr(A, vl.cannotExtractExportedEntity); g[re].push(X), m[re].push(X) } } return { target: F, usagesPerScope: f, functionErrorsPerScope: g, constantErrorsPerScope: m, exposedVariableDeclarations: x }; function W(re) { return !!jn(re, le => mH(le) && jy(le).length !== 0) } function Y(re) { let le = o.getSymbolWalker(() => (s.throwIfCancellationRequested(), !0)), { visitedTypes: _e } = le.walkType(re); for (let ge of _e) ge.isTypeParameter() && l.set(ge.id.toString(), ge) } function R(re, le = 1) { if (q) { let _e = o.getTypeAtLocation(re); Y(_e) } if (Kl(re) && re.symbol && v.push(re), Iu(re)) R(re.left, 2), R(re.right); else if (mse(re)) R(re.operand, 2); else if (br(re) || Vs(re)) pa(re, R); else if (Re(re)) { if (!re.parent || Yu(re.parent) && re !== re.parent.left || br(re.parent) && re !== re.parent.expression) return; ie(re, le, Gm(re)) } else pa(re, R) } function ie(re, le, _e) { let ge = $(re, le, _e); if (ge) for (let X = 0; X < t.length; X++) { let Ve = d[X].get(ge); Ve && f[X].substitutions.set(zo(re).toString(), Ve) } } function $(re, le, _e) { let ge = Z(re); if (!ge) return; let X = $a(ge).toString(), Ve = P.get(X); if (Ve && Ve >= le) return X; if (P.set(X, le), Ve) { for (let Pe of f) Pe.usages.get(re.text) && Pe.usages.set(re.text, { usage: le, symbol: ge, node: re }); return X } let we = ge.getDeclarations(), ke = we && wr(we, Pe => Pe.getSourceFile() === i); if (ke && !ON(r, ke.getStart(), ke.end)) { if (e.facts & 2 && le === 2) { let Pe = hr(re, vl.cannotExtractRangeThatContainsWritesToReferencesLocatedOutsideOfTheTargetRangeInGenerators); for (let Ce of g) Ce.push(Pe); for (let Ce of m) Ce.push(Pe) } for (let Pe = 0; Pe < t.length; Pe++) { let Ce = t[Pe]; if (o.resolveName(ge.name, Ce, ge.flags, !1) !== ge && !d[Pe].has(X)) { let Be = U(ge.exportSymbol || ge, Ce, _e); if (Be) d[Pe].set(X, Be); else if (_e) { if (!(ge.flags & 262144)) { let Ne = hr(re, vl.typeWillNotBeVisibleInTheNewScope); g[Pe].push(Ne), m[Pe].push(Ne) } } else f[Pe].usages.set(re.text, { usage: le, symbol: ge, node: re }) } } return X } } function fe(re) { if (re === e.range || jh(e.range) && e.range.indexOf(re) >= 0) return; let le = Re(re) ? Z(re) : o.getSymbolAtLocation(re); if (le) { let _e = wr(v, ge => ge.symbol === le); if (_e) if (wi(_e)) { let ge = _e.symbol.id.toString(); S.has(ge) || (x.push(_e), S.set(ge, !0)) } else A = A || _e } pa(re, fe) } function Z(re) { return re.parent && xf(re.parent) && re.parent.name === re ? o.getShorthandAssignmentValueSymbol(re.parent) : o.getSymbolAtLocation(re) } function U(re, le, _e) { if (!re) return; let ge = re.getDeclarations(); if (ge && ge.some(Ve => Ve.parent === le)) return D.createIdentifier(re.name); let X = U(re.parent, le, _e); if (X !== void 0) return _e ? D.createQualifiedName(X, D.createIdentifier(re.name)) : D.createPropertyAccessExpression(X, re.name) } } function MHe(e) { return jn(e, t => t.parent && sSe(t) && !ar(t.parent)) } function sSe(e) { let { parent: t } = e; switch (t.kind) { case 302: return !1 }switch (e.kind) { case 10: return t.kind !== 269 && t.kind !== 273; case 227: case 203: case 205: return !1; case 79: return t.kind !== 205 && t.kind !== 273 && t.kind !== 278 }return !0 } function cSe(e) { switch (e.kind) { case 238: case 308: case 265: case 292: return !0; default: return !1 } } function Kee(e) { return qee(e) || (Hg(e) || FS(e) || BS(e)) && (Hg(e.parent) || BS(e.parent)) } function qee(e) { return yo(e) && e.parent && Sp(e.parent) } var fx, _x, px, vl, Xee, FHe = gt({ "src/services/refactors/extractSymbol.ts"() { "use strict"; Fr(), Qm(), fx = "Extract Symbol", _x = { name: "Extract Constant", description: uo(_.Extract_constant), kind: "refactor.extract.constant" }, px = { name: "Extract Function", description: uo(_.Extract_function), kind: "refactor.extract.function" }, Vh(fx, { kinds: [_x.kind, px.kind], getEditsForAction: oSe, getAvailableActions: aSe }), (e => { function t(r) { return { message: r, code: 0, category: 3, key: r } } e.cannotExtractRange = t("Cannot extract range."), e.cannotExtractImport = t("Cannot extract import statement."), e.cannotExtractSuper = t("Cannot extract super call."), e.cannotExtractJSDoc = t("Cannot extract JSDoc."), e.cannotExtractEmpty = t("Cannot extract empty range."), e.expressionExpected = t("expression expected."), e.uselessConstantType = t("No reason to extract constant of type."), e.statementOrExpressionExpected = t("Statement or expression expected."), e.cannotExtractRangeContainingConditionalBreakOrContinueStatements = t("Cannot extract range containing conditional break or continue statements."), e.cannotExtractRangeContainingConditionalReturnStatement = t("Cannot extract range containing conditional return statement."), e.cannotExtractRangeContainingLabeledBreakOrContinueStatementWithTargetOutsideOfTheRange = t("Cannot extract range containing labeled break or continue with target outside of the range."), e.cannotExtractRangeThatContainsWritesToReferencesLocatedOutsideOfTheTargetRangeInGenerators = t("Cannot extract range containing writes to references located outside of the target range in generators."), e.typeWillNotBeVisibleInTheNewScope = t("Type will not visible in the new scope."), e.functionWillNotBeVisibleInTheNewScope = t("Function will not visible in the new scope."), e.cannotExtractIdentifier = t("Select more than a single identifier."), e.cannotExtractExportedEntity = t("Cannot extract exported declaration"), e.cannotWriteInExpression = t("Cannot write back side-effects when extracting an expression"), e.cannotExtractReadonlyPropertyInitializerOutsideConstructor = t("Cannot move initialization of read-only class property outside of the constructor"), e.cannotExtractAmbientBlock = t("Cannot extract code from ambient contexts"), e.cannotAccessVariablesFromNestedScopes = t("Cannot access variables from nested scopes"), e.cannotExtractToJSClass = t("Cannot extract constant to a class scope in JS"), e.cannotExtractToExpressionArrowFunction = t("Cannot extract constant to an arrow function without a block"), e.cannotExtractFunctionsContainingThisToMethod = t("Cannot extract functions containing this to method") })(vl || (vl = {})), Xee = (e => (e[e.None = 0] = "None", e[e.HasReturn = 1] = "HasReturn", e[e.IsGenerator = 2] = "IsGenerator", e[e.IsAsyncFunction = 4] = "IsAsyncFunction", e[e.UsesThis = 8] = "UsesThis", e[e.UsesThisInFunction = 16] = "UsesThisInFunction", e[e.InStaticRegion = 32] = "InStaticRegion", e))(Xee || {}) } }), lSe = {}; Mo(lSe, { Messages: () => vl, RangeFacts: () => Xee, getRangeToExtract: () => Hee, getRefactorActionsToExtractSymbol: () => aSe, getRefactorEditsToExtractSymbol: () => oSe }); var GHe = gt({ "src/services/_namespaces/ts.refactor.extractSymbol.ts"() { "use strict"; FHe() } }), MP, LG, kG, BHe = gt({ "src/services/refactors/generateGetAccessorAndSetAccessor.ts"() { "use strict"; Fr(), Qm(), MP = "Generate 'get' and 'set' accessors", LG = _.Generate_get_and_set_accessors.message, kG = { name: MP, description: LG, kind: "refactor.rewrite.property.generateAccessors" }, Vh(MP, { kinds: [kG.kind], getEditsForAction: function (t, r) { if (!t.endPosition) return; let i = gu.getAccessorConvertiblePropertyAtPosition(t.file, t.program, t.startPosition, t.endPosition); L.assert(i && !$m(i), "Expected applicable refactor info"); let o = gu.generateAccessorFromProperty(t.file, t.program, t.startPosition, t.endPosition, t, r); if (!o) return; let s = t.file.fileName, l = i.renameAccessor ? i.accessorName : i.fieldName, d = (Re(l) ? 0 : -1) + KN(o, s, l.text, ha(i.declaration)); return { renameFilename: s, renameLocation: d, edits: o } }, getAvailableActions(e) { if (!e.endPosition) return Je; let t = gu.getAccessorConvertiblePropertyAtPosition(e.file, e.program, e.startPosition, e.endPosition, e.triggerReason === "invoked"); return t ? $m(t) ? e.preferences.provideRefactorNotApplicableReason ? [{ name: MP, description: LG, actions: [{ ...kG, notApplicableReason: t.error }] }] : Je : [{ name: MP, description: LG, actions: [kG] }] : Je } }) } }), UHe = {}, VHe = gt({ "src/services/_namespaces/ts.refactor.generateGetAccessorAndSetAccessor.ts"() { "use strict"; BHe() } }); function jHe(e) { let t = uSe(e); if (t && !$m(t)) return { renameFilename: void 0, renameLocation: void 0, edits: nr.ChangeTracker.with(e, i => WHe(e.file, i, t.declaration, t.returnTypeNode)) } } function HHe(e) { let t = uSe(e); return t ? $m(t) ? e.preferences.provideRefactorNotApplicableReason ? [{ name: FP, description: DG, actions: [{ ...GP, notApplicableReason: t.error }] }] : Je : [{ name: FP, description: DG, actions: [GP] }] : Je } function WHe(e, t, r, i) { let o = Yo(r, 21, e), s = xs(r) && o === void 0, l = s ? Vo(r.parameters) : o; l && (s && (t.insertNodeBefore(e, l, D.createToken(20)), t.insertNodeAfter(e, l, D.createToken(21))), t.insertNodeAt(e, l.end, i, { prefix: ": " })) } function uSe(e) { if (Yn(e.file) || !pv(GP.kind, e.kind)) return; let t = Vi(e.file, e.startPosition), r = jn(t, l => Va(l) || l.parent && xs(l.parent) && (l.kind === 38 || l.parent.body === l) ? "quit" : zHe(l)); if (!r || !r.body || r.type) return { error: uo(_.Return_type_must_be_inferred_from_a_function) }; let i = e.program.getTypeChecker(), o = JHe(i, r); if (!o) return { error: uo(_.Could_not_determine_function_return_type) }; let s = i.typeToTypeNode(o, r, 1); if (s) return { declaration: r, returnTypeNode: s } } function zHe(e) { switch (e.kind) { case 259: case 215: case 216: case 171: return !0; default: return !1 } } function JHe(e, t) { if (e.isImplementationOfOverload(t)) { let i = e.getTypeAtLocation(t).getCallSignatures(); if (i.length > 1) return e.getUnionType(Zi(i, o => o.getReturnType())) } let r = e.getSignatureFromDeclaration(t); if (r) return e.getReturnTypeOfSignature(r) } var FP, DG, GP, KHe = gt({ "src/services/refactors/inferFunctionReturnType.ts"() { "use strict"; Fr(), Qm(), FP = "Infer function return type", DG = _.Infer_function_return_type.message, GP = { name: FP, description: DG, kind: "refactor.rewrite.function.returnType" }, Vh(FP, { kinds: [GP.kind], getEditsForAction: jHe, getAvailableActions: HHe }) } }), qHe = {}, XHe = gt({ "src/services/_namespaces/ts.refactor.inferFunctionReturnType.ts"() { "use strict"; KHe() } }), Ok = {}; Mo(Ok, { addOrRemoveBracesToArrowFunction: () => lje, convertArrowFunctionOrFunctionExpression: () => Eje, convertParamsToDestructuredObject: () => Uje, convertStringOrTemplateLiteral: () => Yje, convertToOptionalChainExpression: () => lHe, doChangeNamedToNamespaceOrDefault: () => m1e, extractSymbol: () => lSe, generateGetAccessorAndSetAccessor: () => UHe, getApplicableRefactors: () => oVe, getEditsForRefactor: () => sVe, inferFunctionReturnType: () => qHe, isRefactorErrorInfo: () => $m, refactorKindBeginsWith: () => pv, registerRefactor: () => Vh }); var Qm = gt({ "src/services/_namespaces/ts.refactor.ts"() { "use strict"; cVe(), mVe(), bVe(), CVe(), IVe(), nje(), uje(), Tje(), Vje(), $je(), uHe(), GHe(), VHe(), XHe() } }); function YHe(e, t, r, i) { let o = _7(ef(t, r)); if (fSe(o)) { let s = $He(o, e.getTypeChecker(), t, e, i); if (s) return s } return wG(_.You_cannot_rename_this_element) } function $He(e, t, r, i, o) { let s = t.getSymbolAtLocation(e); if (!s) { if (es(e)) { let S = f7(e, t); if (S && (S.flags & 128 || S.flags & 1048576 && Ji(S.types, x => !!(x.flags & 128)))) return Yee(e.text, e.text, "string", "", e, r) } else if (FX(e)) { let S = Qc(e); return Yee(S, S, "label", "", e, r) } return } let { declarations: l } = s; if (!l || l.length === 0) return; if (l.some(S => QHe(i, S))) return wG(_.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library); if (Re(e) && e.escapedText === "default" && s.parent && s.parent.flags & 1536) return; if (es(e) && oR(e)) return o.allowRenameOfImportPath ? eWe(e, r, s) : void 0; let f = ZHe(r, s, t, o); if (f) return wG(f); let d = $g.getSymbolKind(t, s, e), g = Zhe(e) || yf(e) && e.parent.kind === 164 ? u_(l_(e)) : void 0, m = g || t.symbolToString(s), v = g || t.getFullyQualifiedName(s); return Yee(m, v, d, $g.getSymbolModifiers(t, s), e, r) } function QHe(e, t) { let r = t.getSourceFile(); return e.isSourceFileDefaultLibrary(r) && Gc(r.fileName, ".d.ts") } function ZHe(e, t, r, i) { if (!i.providePrefixAndSuffixTextForRename && t.flags & 2097152) { let l = t.declarations && wr(t.declarations, f => $u(f)); l && !l.propertyName && (t = r.getAliasedSymbol(t)) } let { declarations: o } = t; if (!o) return; let s = dSe(e.path); if (s === void 0) return vt(o, l => dge(l.getSourceFile().path)) ? _.You_cannot_rename_elements_that_are_defined_in_a_node_modules_folder : void 0; for (let l of o) { let f = dSe(l.getSourceFile().path); if (f) { let d = Math.min(s.length, f.length); for (let g = 0; g <= d; g++)if (su(s[g], f[g]) !== 0) return _.You_cannot_rename_elements_that_are_defined_in_another_node_modules_folder } } } function dSe(e) { let t = Ou(e), r = t.lastIndexOf("node_modules"); if (r !== -1) return t.slice(0, r + 2) } function eWe(e, t, r) { if (!fl(e.text)) return wG(_.You_cannot_rename_a_module_via_a_global_import); let i = r.declarations && wr(r.declarations, Li); if (!i) return; let o = Oc(e.text, "/index") || Oc(e.text, "/index.js") ? void 0 : Iae(ld(i.fileName), "/index"), s = o === void 0 ? i.fileName : o, l = o === void 0 ? "module" : "directory", f = e.text.lastIndexOf("/") + 1, d = il(e.getStart(t) + 1 + f, e.text.length - f); return { canRename: !0, fileToRename: s, kind: l, displayName: s, fullDisplayName: s, kindModifiers: "", triggerSpan: d } } function Yee(e, t, r, i, o, s) { return { canRename: !0, fileToRename: void 0, kind: r, displayName: e, fullDisplayName: t, kindModifiers: i, triggerSpan: tWe(o, s) } } function wG(e) { return { canRename: !1, localizedErrorMessage: uo(e) } } function tWe(e, t) { let r = e.getStart(t), i = e.getWidth(t); return es(e) && (r += 1, i -= 2), il(r, i) } function fSe(e) { switch (e.kind) { case 79: case 80: case 10: case 14: case 108: return !0; case 8: return c7(e); default: return !1 } } var nWe = gt({ "src/services/rename.ts"() { "use strict"; Fr() } }), RG = {}; Mo(RG, { getRenameInfo: () => YHe, nodeIsEligibleForRename: () => fSe }); var rWe = gt({ "src/services/_namespaces/ts.Rename.ts"() { "use strict"; nWe() } }); function iWe(e, t, r, i, o) { let s = e.getTypeChecker(), l = p7(t, r); if (!l) return; let f = !!i && i.kind === "characterTyped"; if (f && (n1(t, r, l) || Kg(t, r))) return; let d = !!i && i.kind === "invoked", g = vWe(l, r, t, s, d); if (!g) return; o.throwIfCancellationRequested(); let m = aWe(g, s, t, l, f); return o.throwIfCancellationRequested(), m ? s.runWithCancellationToken(o, v => m.kind === 0 ? vSe(m.candidates, m.resolvedSignature, g, t, v) : EWe(m.symbol, g, t, v)) : Cu(t) ? sWe(g, e, o) : void 0 } function aWe({ invocation: e, argumentCount: t }, r, i, o, s) { switch (e.kind) { case 0: { if (s && !oWe(o, e.node, i)) return; let l = [], f = r.getResolvedSignatureForSignatureHelp(e.node, l, t); return l.length === 0 ? void 0 : { kind: 0, candidates: l, resolvedSignature: f } } case 1: { let { called: l } = e; if (s && !_Se(o, i, Re(l) ? l.parent : l)) return; let f = XX(l, t, r); if (f.length !== 0) return { kind: 0, candidates: f, resolvedSignature: Vo(f) }; let d = r.getSymbolAtLocation(l); return d && { kind: 1, symbol: d } } case 2: return { kind: 0, candidates: [e.signature], resolvedSignature: e.signature }; default: return L.assertNever(e) } } function oWe(e, t, r) { if (!Ih(t)) return !1; let i = t.getChildren(r); switch (e.kind) { case 20: return ya(i, e); case 27: { let o = d7(e); return !!o && ya(i, o) } case 29: return _Se(e, r, t.expression); default: return !1 } } function sWe(e, t, r) { if (e.invocation.kind === 2) return; let i = gSe(e.invocation), o = br(i) ? i.name.text : void 0, s = t.getTypeChecker(); return o === void 0 ? void 0 : ks(t.getSourceFiles(), l => ks(l.getNamedDeclarations().get(o), f => { let d = f.symbol && s.getTypeOfSymbolAtLocation(f.symbol, f), g = d && d.getCallSignatures(); if (g && g.length) return s.runWithCancellationToken(r, m => vSe(g, g[0], e, l, m, !0)) })) } function _Se(e, t, r) { let i = e.getFullStart(), o = e.parent; for (; o;) { let s = el(i, t, o, !0); if (s) return Od(r, s); o = o.parent } return L.fail("Could not find preceding token") } function cWe(e, t, r) { let i = mSe(e, t, r); return !i || i.isTypeParameterList || i.invocation.kind !== 0 ? void 0 : { invocation: i.invocation.node, argumentCount: i.argumentCount, argumentIndex: i.argumentIndex } } function pSe(e, t, r) { let i = lWe(e, r); if (!i) return; let { list: o, argumentIndex: s } = i, l = mWe(o, n1(r, t, e)); s !== 0 && L.assertLessThan(s, l); let f = gWe(o, r); return { list: o, argumentIndex: s, argumentCount: l, argumentsSpan: f } } function lWe(e, t) { if (e.kind === 29 || e.kind === 20) return { list: bWe(e.parent, e, t), argumentIndex: 0 }; { let r = d7(e); return r && { list: r, argumentIndex: pWe(r, e) } } } function mSe(e, t, r) { let { parent: i } = e; if (Ih(i)) { let o = i, s = pSe(e, t, r); if (!s) return; let { list: l, argumentIndex: f, argumentCount: d, argumentsSpan: g } = s; return { isTypeParameterList: !!i.typeArguments && i.typeArguments.pos === l.pos, invocation: { kind: 0, node: o }, argumentsSpan: g, argumentIndex: f, argumentCount: d } } else { if (IS(e) && PT(i)) return FN(e, t, r) ? Qee(i, 0, r) : void 0; if (f2(e) && i.parent.kind === 212) { let o = i, s = o.parent; L.assert(o.kind === 225); let l = FN(e, t, r) ? 0 : 1; return Qee(s, l, r) } else if (xL(i) && PT(i.parent.parent)) { let o = i, s = i.parent.parent; if (Iz(e) && !FN(e, t, r)) return; let l = o.parent.templateSpans.indexOf(o), f = hWe(l, e, t, r); return Qee(s, f, r) } else if (Au(i)) { let o = i.attributes.pos, s = xo(r.text, i.attributes.end, !1); return { isTypeParameterList: !1, invocation: { kind: 0, node: i }, argumentsSpan: il(o, s - o), argumentIndex: 0, argumentCount: 1 } } else { let o = YX(e, r); if (o) { let { called: s, nTypeArguments: l } = o, f = { kind: 1, called: s }, d = Wc(s.getStart(r), e.end); return { isTypeParameterList: !0, invocation: f, argumentsSpan: d, argumentIndex: l, argumentCount: l + 1 } } return } } } function uWe(e, t, r, i) { return dWe(e, t, r, i) || mSe(e, t, r) } function hSe(e) { return ar(e.parent) ? hSe(e.parent) : e } function $ee(e) { return ar(e.left) ? $ee(e.left) + 1 : 2 } function dWe(e, t, r, i) { let o = fWe(e, r, t, i); if (!o) return; let { contextualType: s, argumentIndex: l, argumentCount: f, argumentsSpan: d } = o, g = s.getNonNullableType(), m = g.symbol; if (m === void 0) return; let v = Os(g.getCallSignatures()); return v === void 0 ? void 0 : { isTypeParameterList: !1, invocation: { kind: 2, signature: v, node: e, symbol: _We(m) }, argumentsSpan: d, argumentIndex: l, argumentCount: f } } function fWe(e, t, r, i) { if (e.kind !== 20 && e.kind !== 27) return; let { parent: o } = e; switch (o.kind) { case 214: case 171: case 215: case 216: let s = pSe(e, r, t); if (!s) return; let { argumentIndex: l, argumentCount: f, argumentsSpan: d } = s, g = Nc(o) ? i.getContextualTypeForObjectLiteralElement(o) : i.getContextualType(o); return g && { contextualType: g, argumentIndex: l, argumentCount: f, argumentsSpan: d }; case 223: { let m = hSe(o), v = i.getContextualType(m), S = e.kind === 20 ? 0 : $ee(o) - 1, x = $ee(m); return v && { contextualType: v, argumentIndex: S, argumentCount: x, argumentsSpan: Du(o) } } default: return } } function _We(e) { return e.name === "__type" && ks(e.declarations, t => { var r; return Jm(t) ? (r = zr(t.parent, $p)) == null ? void 0 : r.symbol : void 0 }) || e } function pWe(e, t) { let r = 0; for (let i of e.getChildren()) { if (i === t) break; i.kind !== 27 && r++ } return r } function mWe(e, t) { let r = e.getChildren(), i = Oy(r, o => o.kind !== 27); return !t && r.length > 0 && To(r).kind === 27 && i++, i } function hWe(e, t, r, i) { return L.assert(r >= t.getStart(), "Assumed 'position' could not occur before node."), rse(t) ? FN(t, r, i) ? 0 : e + 2 : e + 1 } function Qee(e, t, r) { let i = IS(e.template) ? 1 : e.template.templateSpans.length + 1; return t !== 0 && L.assertLessThan(t, i), { isTypeParameterList: !1, invocation: { kind: 0, node: e }, argumentsSpan: yWe(e, r), argumentIndex: t, argumentCount: i } } function gWe(e, t) { let r = e.getFullStart(), i = xo(t.text, e.getEnd(), !1); return il(r, i - r) } function yWe(e, t) { let r = e.template, i = r.getStart(), o = r.getEnd(); return r.kind === 225 && To(r.templateSpans).literal.getFullWidth() === 0 && (o = xo(t.text, o, !1)), il(i, o - i) } function vWe(e, t, r, i, o) { for (let s = e; !Li(s) && (o || !Va(s)); s = s.parent) { L.assert(Od(s.parent, s), "Not a subspan", () => `Child: ${L.formatSyntaxKind(s.kind)}, parent: ${L.formatSyntaxKind(s.parent.kind)}`); let l = uWe(s, t, r, i); if (l) return l } } function bWe(e, t, r) { let i = e.getChildren(r), o = i.indexOf(t); return L.assert(o >= 0 && i.length > o + 1), i[o + 1] } function gSe(e) { return e.kind === 0 ? P6(e.node) : e.called } function ySe(e) { return e.kind === 0 ? e.node : e.kind === 1 ? e.called : e.node } function vSe(e, t, { isTypeParameterList: r, argumentCount: i, argumentsSpan: o, invocation: s, argumentIndex: l }, f, d, g) { var m; let v = ySe(s), S = s.kind === 2 ? s.symbol : d.getSymbolAtLocation(gSe(s)) || g && ((m = t.declaration) == null ? void 0 : m.symbol), x = S ? ok(d, S, g ? f : void 0, void 0) : Je, A = on(e, B => SWe(B, x, r, d, v, f)); l !== 0 && L.assertLessThan(l, i); let w = 0, C = 0; for (let B = 0; B < A.length; B++) { let q = A[B]; if (e[B] === t && (w = C, q.length > 1)) { let W = 0; for (let Y of q) { if (Y.isVariadic || Y.parameters.length >= i) { w = C + W; break } W++ } } C += q.length } L.assert(w !== -1); let P = { items: BD(A, Ks), applicableSpan: o, selectedItemIndex: w, argumentIndex: l, argumentCount: i }, F = P.items[w]; if (F.isVariadic) { let B = Yc(F.parameters, q => !!q.isRest); -1 < B && B < F.parameters.length - 1 ? P.argumentIndex = F.parameters.length : P.argumentIndex = Math.min(P.argumentIndex, F.parameters.length - 1) } return P } function EWe(e, { argumentCount: t, argumentsSpan: r, invocation: i, argumentIndex: o }, s, l) { let f = l.getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(e); return f ? { items: [TWe(e, f, l, ySe(i), s)], applicableSpan: r, selectedItemIndex: 0, argumentIndex: o, argumentCount: t } : void 0 } function TWe(e, t, r, i, o) { let s = ok(r, e), l = rE(), f = t.map(v => bSe(v, r, i, o, l)), d = e.getDocumentationComment(r), g = e.getJsDocTags(r); return { isVariadic: !1, prefixDisplayParts: [...s, Yl(29)], suffixDisplayParts: [Yl(31)], separatorDisplayParts: Zee, parameters: f, documentation: d, tags: g } } function SWe(e, t, r, i, o, s) { let l = (r ? AWe : CWe)(e, i, o, s); return on(l, ({ isVariadic: f, parameters: d, prefix: g, suffix: m }) => { let v = [...t, ...g], S = [...m, ...xWe(e, o, i)], x = e.getDocumentationComment(i), A = e.getJsDocTags(); return { isVariadic: f, prefixDisplayParts: v, suffixDisplayParts: S, separatorDisplayParts: Zee, parameters: d, documentation: x, tags: A } }) } function xWe(e, t, r) { return uv(i => { i.writePunctuation(":"), i.writeSpace(" "); let o = r.getTypePredicateOfSignature(e); o ? r.writeTypePredicate(o, t, void 0, i) : r.writeType(r.getReturnTypeOfSignature(e), t, void 0, i) }) } function AWe(e, t, r, i) { let o = (e.target || e).typeParameters, s = rE(), l = (o || Je).map(d => bSe(d, t, r, i, s)), f = e.thisParameter ? [t.symbolToParameterDeclaration(e.thisParameter, r, Nk)] : []; return t.getExpandedParameters(e).map(d => { let g = D.createNodeArray([...f, ...on(d, v => t.symbolToParameterDeclaration(v, r, Nk))]), m = uv(v => { s.writeList(2576, g, i, v) }); return { isVariadic: !1, parameters: l, prefix: [Yl(29)], suffix: [Yl(31), ...m] } }) } function CWe(e, t, r, i) { let o = rE(), s = uv(d => { if (e.typeParameters && e.typeParameters.length) { let g = D.createNodeArray(e.typeParameters.map(m => t.typeParameterToDeclaration(m, r, Nk))); o.writeList(53776, g, i, d) } }), l = t.getExpandedParameters(e), f = t.hasEffectiveRestParameter(e) ? l.length === 1 ? d => !0 : d => { var g; return !!(d.length && ((g = zr(d[d.length - 1], Zp)) == null ? void 0 : g.links.checkFlags) & 32768) } : d => !1; return l.map(d => ({ isVariadic: f(d), parameters: d.map(g => IWe(g, t, r, i, o)), prefix: [...s, Yl(20)], suffix: [Yl(21)] })) } function IWe(e, t, r, i, o) { let s = uv(d => { let g = t.symbolToParameterDeclaration(e, r, Nk); o.writeNode(4, g, i, d) }), l = t.isOptionalParameter(e.valueDeclaration), f = Zp(e) && !!(e.links.checkFlags & 32768); return { name: e.name, documentation: e.getDocumentationComment(t), displayParts: s, isOptional: l, isRest: f } } function bSe(e, t, r, i, o) { let s = uv(l => { let f = t.typeParameterToDeclaration(e, r, Nk); o.writeNode(4, f, i, l) }); return { name: e.symbol.name, documentation: e.symbol.getDocumentationComment(t), displayParts: s, isOptional: !1, isRest: !1 } } var Nk, Zee, LWe = gt({ "src/services/signatureHelp.ts"() { "use strict"; Fr(), Nk = 70246400, Zee = [Yl(27), Qs()] } }), BP = {}; Mo(BP, { getArgumentInfoForCompletions: () => cWe, getSignatureHelpItems: () => iWe }); var kWe = gt({ "src/services/_namespaces/ts.SignatureHelp.ts"() { "use strict"; LWe() } }); function DWe(e, t) { var r, i; let o = { textSpan: Wc(t.getFullStart(), t.getEnd()) }, s = t; e: for (; ;) { let d = RWe(s); if (!d.length) break; for (let g = 0; g < d.length; g++) { let m = d[g - 1], v = d[g], S = d[g + 1]; if (gT(v, t, !0) > e) break e; let x = Wp(eb(t.text, v.end)); if (x && x.kind === 2 && f(x.pos, x.end), wWe(t, e, v)) { if (Hj(v) && Ds(s) && !Bf(v.getStart(t), v.getEnd(), t) && l(v.getStart(t), v.getEnd()), Va(v) || xL(v) || f2(v) || Iz(v) || m && f2(m) || pu(v) && Bc(s) || A2(v) && pu(s) || wi(v) && A2(s) && d.length === 1 || UT(v) || X0(v) || LL(v)) { s = v; break } if (xL(s) && S && o6(S)) { let P = v.getFullStart() - 2, F = S.getStart() + 1; l(P, F) } let A = A2(v) && OWe(m) && NWe(S) && !Bf(m.getStart(), S.getStart(), t), w = A ? m.getEnd() : v.getStart(), C = A ? S.getStart() : PWe(t, v); if (Kd(v) && ((r = v.jsDoc) != null && r.length) && l(Vo(v.jsDoc).getStart(), C), A2(v)) { let P = v.getChildren()[0]; P && Kd(P) && ((i = P.jsDoc) != null && i.length) && P.getStart() !== v.pos && (w = Math.min(w, Vo(P.jsDoc).getStart())) } l(w, C), (yo(v) || AA(v)) && l(w + 1, C - 1), s = v; break } if (g === d.length - 1) break e } } return o; function l(d, g) { if (d !== g) { let m = Wc(d, g); (!o || !J2(m, o.textSpan) && Noe(m, e)) && (o = { textSpan: m, ...o && { parent: o } }) } } function f(d, g) { l(d, g); let m = d; for (; t.text.charCodeAt(m) === 47;)m++; l(m, g) } } function wWe(e, t, r) { return L.assert(r.pos <= t), t < r.end ? !0 : r.getEnd() === t ? ef(e, t).pos < r.end : !1 } function RWe(e) { var t; if (Li(e)) return Pk(e.getChildAt(0).getChildren(), ESe); if (EL(e)) { let [r, ...i] = e.getChildren(), o = L.checkDefined(i.pop()); L.assertEqual(r.kind, 18), L.assertEqual(o.kind, 19); let s = Pk(i, f => f === e.readonlyToken || f.kind === 146 || f === e.questionToken || f.kind === 57), l = Pk(s, ({ kind: f }) => f === 22 || f === 165 || f === 23); return [r, Mk(OG(l, ({ kind: f }) => f === 58)), o] } if ($d(e)) { let r = Pk(e.getChildren(), l => l === e.name || ya(e.modifiers, l)), i = ((t = r[0]) == null ? void 0 : t.kind) === 323 ? r[0] : void 0, o = i ? r.slice(1) : r, s = OG(o, ({ kind: l }) => l === 58); return i ? [i, Mk(s)] : s } if (ha(e)) { let r = Pk(e.getChildren(), o => o === e.dotDotDotToken || o === e.name), i = Pk(r, o => o === r[0] || o === e.questionToken); return OG(i, ({ kind: o }) => o === 63) } return Wo(e) ? OG(e.getChildren(), ({ kind: r }) => r === 63) : e.getChildren() } function Pk(e, t) { let r = [], i; for (let o of e) t(o) ? (i = i || [], i.push(o)) : (i && (r.push(Mk(i)), i = void 0), r.push(o)); return i && r.push(Mk(i)), r } function OG(e, t, r = !0) { if (e.length < 2) return e; let i = Yc(e, t); if (i === -1) return e; let o = e.slice(0, i), s = e[i], l = To(e), f = r && l.kind === 26, d = e.slice(i + 1, f ? e.length - 1 : void 0), g = WD([o.length ? Mk(o) : void 0, s, d.length ? Mk(d) : void 0]); return f ? g.concat(l) : g } function Mk(e) { return L.assertGreaterThanOrEqual(e.length, 1), om(fm.createSyntaxList(e), e[0].pos, To(e).end) } function OWe(e) { let t = e && e.kind; return t === 18 || t === 22 || t === 20 || t === 283 } function NWe(e) { let t = e && e.kind; return t === 19 || t === 23 || t === 21 || t === 284 } function PWe(e, t) { switch (t.kind) { case 344: case 341: case 351: case 349: case 346: return e.getLineEndOfPosition(t.getStart()); default: return t.getEnd() } } var ESe, MWe = gt({ "src/services/smartSelection.ts"() { "use strict"; Fr(), ESe = Kp(gl, Nl) } }), ete = {}; Mo(ete, { getSmartSelectionRange: () => DWe }); var FWe = gt({ "src/services/_namespaces/ts.SmartSelectionRange.ts"() { "use strict"; MWe() } }); function TSe(e, t, r) { let i = SSe(e, t, r); if (i !== "") return i; let o = XI(t); return o & 32 ? nc(t, 228) ? "local class" : "class" : o & 384 ? "enum" : o & 524288 ? "type" : o & 64 ? "interface" : o & 262144 ? "type parameter" : o & 8 ? "enum member" : o & 2097152 ? "alias" : o & 1536 ? "module" : i } function SSe(e, t, r) { let i = e.getRootSymbols(t); if (i.length === 1 && Vo(i).flags & 8192 && e.getTypeOfSymbolAtLocation(t, r).getNonNullableType().getCallSignatures().length !== 0) return "method"; if (e.isUndefinedSymbol(t)) return "var"; if (e.isArgumentsSymbol(t)) return "local var"; if (r.kind === 108 && ot(r) || mS(r)) return "parameter"; let o = XI(t); if (o & 3) return dY(t) ? "parameter" : t.valueDeclaration && kh(t.valueDeclaration) ? "const" : mn(t.declarations, II) ? "let" : CSe(t) ? "local var" : "var"; if (o & 16) return CSe(t) ? "local function" : "function"; if (o & 32768) return "getter"; if (o & 65536) return "setter"; if (o & 8192) return "method"; if (o & 16384) return "constructor"; if (o & 131072) return "index"; if (o & 4) { if (o & 33554432 && t.links.checkFlags & 6) { let s = mn(e.getRootSymbols(t), l => { if (l.getFlags() & 98311) return "property" }); return s || (e.getTypeOfSymbolAtLocation(t, r).getCallSignatures().length ? "method" : "property") } return "property" } return "" } function xSe(e) { if (e.declarations && e.declarations.length) { let [t, ...r] = e.declarations, i = Fn(r) && H7(t) && vt(r, s => !H7(s)) ? 8192 : 0, o = rk(t, i); if (o) return o.split(",") } return [] } function GWe(e, t) { if (!t) return ""; let r = new Set(xSe(t)); if (t.flags & 2097152) { let i = e.getAliasedSymbol(t); i !== t && mn(xSe(i), o => { r.add(o) }) } return t.flags & 16777216 && r.add("optional"), r.size > 0 ? lo(r.values()).join(",") : "" } function ASe(e, t, r, i, o, s = ZT(o), l) { var f; let d = [], g = [], m = [], v = XI(t), S = s & 1 ? SSe(e, t, o) : "", x = !1, A = o.kind === 108 && F6(o) || mS(o), w, C, P, F = !1; if (o.kind === 108 && !A) return { displayParts: [_d(108)], documentation: [], symbolKind: "primitive type", tags: void 0 }; if (S !== "" || v & 32 || v & 2097152) { if (S === "getter" || S === "setter") { let le = wr(t.declarations, _e => _e.name === o); if (le) switch (le.kind) { case 174: S = "getter"; break; case 175: S = "setter"; break; case 169: S = "accessor"; break; default: L.assertNever(le) } else S = "property" } let U; if (w = A ? e.getTypeAtLocation(o) : e.getTypeOfSymbolAtLocation(t, o), o.parent && o.parent.kind === 208) { let le = o.parent.name; (le === o || le && le.getFullWidth() === 0) && (o = o.parent) } let re; if (Ih(o) ? re = o : (NX(o) || ZL(o) || o.parent && (Au(o.parent) || PT(o.parent)) && Ia(t.valueDeclaration)) && (re = o.parent), re) { U = e.getResolvedSignature(re); let le = re.kind === 211 || Pa(re) && re.expression.kind === 106, _e = le ? w.getConstructSignatures() : w.getCallSignatures(); if (U && !ya(_e, U.target) && !ya(_e, U) && (U = _e.length ? _e[0] : void 0), U) { switch (le && v & 32 ? (S = "constructor", ie(w.symbol, S)) : v & 2097152 ? (S = "alias", $(S), d.push(Qs()), le && (U.flags & 4 && (d.push(_d(126)), d.push(Qs())), d.push(_d(103)), d.push(Qs())), R(t)) : ie(t, S), S) { case "JSX attribute": case "property": case "var": case "const": case "let": case "parameter": case "local var": d.push(Yl(58)), d.push(Qs()), !(Ur(w) & 16) && w.symbol && (si(d, ok(e, w.symbol, i, void 0, 5)), d.push(K2())), le && (U.flags & 4 && (d.push(_d(126)), d.push(Qs())), d.push(_d(103)), d.push(Qs())), fe(U, _e, 262144); break; default: fe(U, _e) }x = !0, F = _e.length > 1 } } else if (VX(o) && !(v & 98304) || o.kind === 135 && o.parent.kind === 173) { let le = o.parent; if (t.declarations && wr(t.declarations, ge => ge === (o.kind === 135 ? le.parent : le))) { let ge = le.kind === 173 ? w.getNonNullableType().getConstructSignatures() : w.getNonNullableType().getCallSignatures(); e.isImplementationOfOverload(le) ? U = ge[0] : U = e.getSignatureFromDeclaration(le), le.kind === 173 ? (S = "constructor", ie(w.symbol, S)) : ie(le.kind === 176 && !(w.symbol.flags & 2048 || w.symbol.flags & 4096) ? w.symbol : t, S), U && fe(U, ge), x = !0, F = ge.length > 1 } } } if (v & 32 && !x && !A && (W(), nc(t, 228) ? $("local class") : d.push(_d(84)), d.push(Qs()), R(t), Z(t, r)), v & 64 && s & 2 && (q(), d.push(_d(118)), d.push(Qs()), R(t), Z(t, r)), v & 524288 && s & 2 && (q(), d.push(_d(154)), d.push(Qs()), R(t), Z(t, r), d.push(Qs()), d.push(ak(63)), d.push(Qs()), si(d, zN(e, Ch(o.parent) ? e.getTypeAtLocation(o.parent) : e.getDeclaredTypeOfSymbol(t), i, 8388608))), v & 384 && (q(), vt(t.declarations, U => hb(U) && R0(U)) && (d.push(_d(85)), d.push(Qs())), d.push(_d(92)), d.push(Qs()), R(t)), v & 1536 && !A) { q(); let U = nc(t, 264), re = U && U.name && U.name.kind === 79; d.push(_d(re ? 143 : 142)), d.push(Qs()), R(t) } if (v & 262144 && s & 2) if (q(), d.push(Yl(20)), d.push(tf("type parameter")), d.push(Yl(21)), d.push(Qs()), R(t), t.parent) Y(), R(t.parent, i), Z(t.parent, i); else { let U = nc(t, 165); if (U === void 0) return L.fail(); let re = U.parent; if (re) if (Ia(re)) { Y(); let le = e.getSignatureFromDeclaration(re); re.kind === 177 ? (d.push(_d(103)), d.push(Qs())) : re.kind !== 176 && re.name && R(re.symbol), si(d, pY(e, le, r, 32)) } else Ep(re) && (Y(), d.push(_d(154)), d.push(Qs()), R(re.symbol), Z(re.symbol, r)) } if (v & 8) { S = "enum member", ie(t, "enum member"); let U = (f = t.declarations) == null ? void 0 : f[0]; if (U?.kind === 302) { let re = e.getConstantValue(U); re !== void 0 && (d.push(Qs()), d.push(ak(63)), d.push(Qs()), d.push(Qu(Use(re), typeof re == "number" ? 7 : 8))) } } if (t.flags & 2097152) { if (q(), !x) { let U = e.getAliasedSymbol(t); if (U !== t && U.declarations && U.declarations.length > 0) { let re = U.declarations[0], le = sa(re); if (le) { let _e = b6(re) && Mr(re, 2), ge = t.name !== "default" && !_e, X = ASe(e, U, Gn(re), re, le, s, ge ? t : U); d.push(...X.displayParts), d.push(K2()), C = X.documentation, P = X.tags } else C = U.getContextualDocumentationComment(re, e), P = U.getJsDocTags(e) } } if (t.declarations) switch (t.declarations[0].kind) { case 267: d.push(_d(93)), d.push(Qs()), d.push(_d(143)); break; case 274: d.push(_d(93)), d.push(Qs()), d.push(_d(t.declarations[0].isExportEquals ? 63 : 88)); break; case 278: d.push(_d(93)); break; default: d.push(_d(100)) }d.push(Qs()), R(t), mn(t.declarations, U => { if (U.kind === 268) { let re = U; if (ab(re)) d.push(Qs()), d.push(ak(63)), d.push(Qs()), d.push(_d(147)), d.push(Yl(20)), d.push(Qu(Qc(wI(re)), 8)), d.push(Yl(21)); else { let le = e.getSymbolAtLocation(re.moduleReference); le && (d.push(Qs()), d.push(ak(63)), d.push(Qs()), R(le, i)) } return !0 } }) } if (!x) if (S !== "") { if (w) { if (A ? (q(), d.push(_d(108))) : ie(t, S), S === "property" || S === "accessor" || S === "getter" || S === "setter" || S === "JSX attribute" || v & 3 || S === "local var" || S === "index" || A) { if (d.push(Yl(58)), d.push(Qs()), w.symbol && w.symbol.flags & 262144 && S !== "index") { let U = uv(re => { let le = e.typeParameterToDeclaration(w, i, tte); B().writeNode(4, le, Gn(ea(i)), re) }); si(d, U) } else si(d, zN(e, w, i)); if (Zp(t) && t.links.target && Zp(t.links.target) && t.links.target.links.tupleLabelDeclaration) { let U = t.links.target.links.tupleLabelDeclaration; L.assertNode(U.name, Re), d.push(Qs()), d.push(Yl(20)), d.push(tf(vr(U.name))), d.push(Yl(21)) } } else if (v & 16 || v & 8192 || v & 16384 || v & 131072 || v & 98304 || S === "method") { let U = w.getNonNullableType().getCallSignatures(); U.length && (fe(U[0], U), F = U.length > 1) } } } else S = TSe(e, t, o); if (g.length === 0 && !F && (g = t.getContextualDocumentationComment(i, e)), g.length === 0 && v & 4 && t.parent && t.declarations && mn(t.parent.declarations, U => U.kind === 308)) for (let U of t.declarations) { if (!U.parent || U.parent.kind !== 223) continue; let re = e.getSymbolAtLocation(U.parent.right); if (re && (g = re.getDocumentationComment(e), m = re.getJsDocTags(e), g.length > 0)) break } if (g.length === 0 && Re(o) && t.valueDeclaration && Wo(t.valueDeclaration)) { let U = t.valueDeclaration, re = U.parent; if (Re(U.name) && cm(re)) { let le = l_(U.name), _e = e.getTypeAtLocation(re); g = ks(_e.isUnion() ? _e.types : [_e], ge => { let X = ge.getProperty(le); return X ? X.getDocumentationComment(e) : void 0 }) || Je } } return m.length === 0 && !F && (m = t.getContextualJsDocTags(i, e)), g.length === 0 && C && (g = C), m.length === 0 && P && (m = P), { displayParts: d, documentation: g, symbolKind: S, tags: m.length === 0 ? void 0 : m }; function B() { return rE() } function q() { d.length && d.push(K2()), W() } function W() { l && ($("alias"), d.push(Qs())) } function Y() { d.push(Qs()), d.push(_d(101)), d.push(Qs()) } function R(U, re) { let le; l && U === t && (U = l), S === "index" && (le = e.getIndexInfosOfIndexSymbol(U)); let _e = []; U.flags & 131072 && le ? (U.parent && (_e = ok(e, U.parent)), _e.push(Yl(22)), le.forEach((ge, X) => { _e.push(...zN(e, ge.keyType)), X !== le.length - 1 && (_e.push(Qs()), _e.push(Yl(51)), _e.push(Qs())) }), _e.push(Yl(23))) : _e = ok(e, U, re || r, void 0, 7), si(d, _e), t.flags & 16777216 && d.push(Yl(57)) } function ie(U, re) { q(), re && ($(re), U && !vt(U.declarations, le => xs(le) || (ms(le) || _u(le)) && !le.name) && (d.push(Qs()), R(U))) } function $(U) { switch (U) { case "var": case "function": case "let": case "const": case "constructor": d.push(fY(U)); return; default: d.push(Yl(20)), d.push(fY(U)), d.push(Yl(21)); return } } function fe(U, re, le = 0) { si(d, pY(e, U, i, le | 32)), re.length > 1 && (d.push(Qs()), d.push(Yl(20)), d.push(ak(39)), d.push(Qu((re.length - 1).toString(), 7)), d.push(Qs()), d.push(tf(re.length === 2 ? "overload" : "overloads")), d.push(Yl(21))), g = U.getDocumentationComment(e), m = U.getJsDocTags(), re.length > 1 && g.length === 0 && m.length === 0 && (g = re[0].getDocumentationComment(e), m = re[0].getJsDocTags().filter(_e => _e.name !== "deprecated")) } function Z(U, re) { let le = uv(_e => { let ge = e.symbolToTypeParameterDeclarations(U, re, tte); B().writeList(53776, ge, Gn(ea(re)), _e) }); si(d, le) } } function CSe(e) { return e.parent ? !1 : mn(e.declarations, t => { if (t.kind === 215) return !0; if (t.kind !== 257 && t.kind !== 259) return !1; for (let r = t.parent; !bT(r); r = r.parent)if (r.kind === 308 || r.kind === 265) return !1; return !0 }) } var tte, BWe = gt({ "src/services/symbolDisplay.ts"() { "use strict"; Fr(), tte = 70246400 } }), $g = {}; Mo($g, { getSymbolDisplayPartsDocumentationAndSymbolKind: () => ASe, getSymbolKind: () => TSe, getSymbolModifiers: () => GWe }); var UWe = gt({ "src/services/_namespaces/ts.SymbolDisplay.ts"() { "use strict"; BWe() } }); function ISe(e) { let t = e.__pos; return L.assert(typeof t == "number"), t } function nte(e, t) { L.assert(typeof t == "number"), e.__pos = t } function LSe(e) { let t = e.__end; return L.assert(typeof t == "number"), t } function rte(e, t) { L.assert(typeof t == "number"), e.__end = t } function kSe(e, t) { return xo(e, t, !1, !0) } function VWe(e, t) { let r = t; for (; r < e.length;) { let i = e.charCodeAt(r); if (Yp(i)) { r++; continue } return i === 47 } return !1 } function Fk(e, t, r, i) { return { pos: f1(e, t, i), end: mx(e, r, i) } } function f1(e, t, r, i = !1) { var o, s; let { leadingTriviaOption: l } = r; if (l === 0) return t.getStart(e); if (l === 3) { let x = t.getStart(e), A = Wf(x, e); return wN(t, A) ? A : x } if (l === 2) { let x = EH(t, e.text); if (x?.length) return Wf(x[0].pos, e) } let f = t.getFullStart(), d = t.getStart(e); if (f === d) return d; let g = Wf(f, e); if (Wf(d, e) === g) return l === 1 ? f : d; if (i) { let x = ((o = Nm(e.text, f)) == null ? void 0 : o[0]) || ((s = eb(e.text, f)) == null ? void 0 : s[0]); if (x) return xo(e.text, x.end, !0, !0) } let v = f > 0 ? 1 : 0, S = Ky(UI(e, g) + v, e); return S = kSe(e.text, S), Ky(UI(e, S), e) } function ite(e, t, r) { let { end: i } = t, { trailingTriviaOption: o } = r; if (o === 2) { let s = eb(e.text, i); if (s) { let l = UI(e, t.end); for (let f of s) { if (f.kind === 2 || UI(e, f.pos) > l) break; if (UI(e, f.end) > l) return xo(e.text, f.end, !0, !0) } } } } function mx(e, t, r) { var i; let { end: o } = t, { trailingTriviaOption: s } = r; if (s === 0) return o; if (s === 1) { let d = Qi(eb(e.text, o), Nm(e.text, o)), g = (i = d?.[d.length - 1]) == null ? void 0 : i.end; return g || o } let l = ite(e, t, r); if (l) return l; let f = xo(e.text, o, !0); return f !== o && (s === 2 || Wl(e.text.charCodeAt(f - 1))) ? f : o } function NG(e, t) { return !!t && !!e.parent && (t.kind === 27 || t.kind === 26 && e.parent.kind === 207) } function jWe(e) { return ms(e) || Jc(e) } function HWe(e) { if (e.kind !== 216) return e; let t = e.parent.kind === 169 ? e.parent : e.parent.parent; return t.jsDoc = e.jsDoc, t } function WWe(e, t) { if (e.kind === t.kind) switch (e.kind) { case 344: { let r = e, i = t; return Re(r.name) && Re(i.name) && r.name.escapedText === i.name.escapedText ? D.createJSDocParameterTag(void 0, i.name, !1, i.typeExpression, i.isNameFirst, r.comment) : void 0 } case 345: return D.createJSDocReturnTag(void 0, t.typeExpression, e.comment); case 347: return D.createJSDocTypeTag(void 0, t.typeExpression, e.comment) } } function ate(e, t) { return xo(e.text, f1(e, t, { leadingTriviaOption: 1 }), !1, !0) } function zWe(e, t, r, i) { let o = ate(e, i); if (r === void 0 || Bf(mx(e, t, {}), o, e)) return o; let s = el(i.getStart(e), e); if (NG(t, s)) { let l = el(t.getStart(e), e); if (NG(r, l)) { let f = xo(e.text, s.getEnd(), !0, !0); if (Bf(l.getStart(e), s.getStart(e), e)) return Wl(e.text.charCodeAt(f - 1)) ? f - 1 : f; if (Wl(e.text.charCodeAt(f))) return f } } return o } function JWe(e, t) { let r = Yo(e, 18, t), i = Yo(e, 19, t); return [r?.end, i?.end] } function PG(e) { return rs(e) ? e.properties : e.members } function KWe(e, t, r, i) { return UP.newFileChangesWorker(void 0, t, e, r, i) } function ote(e, t) { for (let r = t.length - 1; r >= 0; r--) { let { span: i, newText: o } = t[r]; e = `${e.substring(0, i.start)}${o}${e.substring(wl(i))}` } return e } function qWe(e) { return xo(e, 0) === e.length } function MG(e) { let t = xn(e, MG, RSe, XWe, MG), r = ws(t) ? t : Object.create(t); return om(r, ISe(e), LSe(e)), r } function XWe(e, t, r, i, o) { let s = On(e, t, r, i, o); if (!s) return s; L.assert(e); let l = s === e ? D.createNodeArray(s.slice(0)) : s; return om(l, ISe(e), LSe(e)), l } function DSe(e) { let t = 0, r = SR(e), i = X => { X && nte(X, t) }, o = X => { X && rte(X, t) }, s = X => { X && nte(X, t) }, l = X => { X && rte(X, t) }, f = X => { X && nte(X, t) }, d = X => { X && rte(X, t) }; function g(X, Ve) { if (Ve || !qWe(X)) { t = r.getTextPos(); let we = 0; for (; xh(X.charCodeAt(X.length - we - 1));)we++; t -= we } } function m(X) { r.write(X), g(X, !1) } function v(X) { r.writeComment(X) } function S(X) { r.writeKeyword(X), g(X, !1) } function x(X) { r.writeOperator(X), g(X, !1) } function A(X) { r.writePunctuation(X), g(X, !1) } function w(X) { r.writeTrailingSemicolon(X), g(X, !1) } function C(X) { r.writeParameter(X), g(X, !1) } function P(X) { r.writeProperty(X), g(X, !1) } function F(X) { r.writeSpace(X), g(X, !1) } function B(X) { r.writeStringLiteral(X), g(X, !1) } function q(X, Ve) { r.writeSymbol(X, Ve), g(X, !1) } function W(X) { r.writeLine(X) } function Y() { r.increaseIndent() } function R() { r.decreaseIndent() } function ie() { return r.getText() } function $(X) { r.rawWrite(X), g(X, !1) } function fe(X) { r.writeLiteral(X), g(X, !0) } function Z() { return r.getTextPos() } function U() { return r.getLine() } function re() { return r.getColumn() } function le() { return r.getIndent() } function _e() { return r.isAtStartOfLine() } function ge() { r.clear(), t = 0 } return { onBeforeEmitNode: i, onAfterEmitNode: o, onBeforeEmitNodeArray: s, onAfterEmitNodeArray: l, onBeforeEmitToken: f, onAfterEmitToken: d, write: m, writeComment: v, writeKeyword: S, writeOperator: x, writePunctuation: A, writeTrailingSemicolon: w, writeParameter: C, writeProperty: P, writeSpace: F, writeStringLiteral: B, writeSymbol: q, writeLine: W, increaseIndent: Y, decreaseIndent: R, getText: ie, rawWrite: $, writeLiteral: fe, getTextPos: Z, getLine: U, getColumn: re, getIndent: le, isAtStartOfLine: _e, hasTrailingComment: () => r.hasTrailingComment(), hasTrailingWhitespace: () => r.hasTrailingWhitespace(), clear: ge } } function YWe(e) { let t; for (let g of e.statements) if (B_(g)) t = g; else break; let r = 0, i = e.text; if (t) return r = t.end, d(), r; let o = K8(i); o !== void 0 && (r = o.length, d()); let s = Nm(i, r); if (!s) return r; let l, f; for (let g of s) { if (g.kind === 3) { if (y6(i, g.pos)) { l = { range: g, pinnedOrTripleSlash: !0 }; continue } } else if (iH(i, g.pos, g.end)) { l = { range: g, pinnedOrTripleSlash: !0 }; continue } if (l) { if (l.pinnedOrTripleSlash) break; let m = e.getLineAndCharacterOfPosition(g.pos).line, v = e.getLineAndCharacterOfPosition(l.range.end).line; if (m >= v + 2) break } if (e.statements.length) { f === void 0 && (f = e.getLineAndCharacterOfPosition(e.statements[0].getStart()).line); let m = e.getLineAndCharacterOfPosition(g.end).line; if (f < m + 2) break } l = { range: g, pinnedOrTripleSlash: !1 } } return l && (r = l.range.end, d()), r; function d() { if (r < i.length) { let g = i.charCodeAt(r); Wl(g) && (r++, r < i.length && g === 13 && i.charCodeAt(r) === 10 && r++) } } } function wSe(e, t) { return !Kg(e, t) && !n1(e, t) && !qX(e, t) && !Dhe(e, t) } function $We(e, t) { return ($d(e) || Na(e)) && s6(t) && t.name.kind === 164 || Nw(e) && Nw(t) } function Zm(e, t, r, i = { leadingTriviaOption: 1 }) { let o = f1(t, r, i), s = mx(t, r, i); e.deleteRange(t, { pos: o, end: s }) } function Gk(e, t, r, i) { let o = L.checkDefined(tl.SmartIndenter.getContainingList(i, r)), s = DA(o, i); if (L.assert(s !== -1), o.length === 1) { Zm(e, r, i); return } L.assert(!t.has(i), "Deleting a node twice"), t.add(i), e.deleteRange(r, { pos: ate(r, i), end: s === o.length - 1 ? mx(r, i, {}) : zWe(r, i, o[s - 1], o[s + 1]) }) } var ste, cte, iC, FG, UP, RSe, lte, QWe = gt({
+                "src/services/textChanges.ts"() {
+                    "use strict"; Fr(), ste = (e => (e[e.Exclude = 0] = "Exclude", e[e.IncludeAll = 1] = "IncludeAll", e[e.JSDoc = 2] = "JSDoc", e[e.StartLine = 3] = "StartLine", e))(ste || {}), cte = (e => (e[e.Exclude = 0] = "Exclude", e[e.ExcludeWhitespace = 1] = "ExcludeWhitespace", e[e.Include = 2] = "Include", e))(cte || {}), iC = { leadingTriviaOption: 0, trailingTriviaOption: 0 }, FG = class {
+                        constructor(e, t) { this.newLineCharacter = e, this.formatContext = t, this.changes = [], this.newFiles = [], this.classesWithNodesInsertedAtStart = new Map, this.deletedNodes = [] } static fromContext(e) { return new FG(bb(e.host, e.formatContext.options), e.formatContext) } static with(e, t) { let r = FG.fromContext(e); return t(r), r.getChanges() } pushRaw(e, t) { L.assertEqual(e.fileName, t.fileName); for (let r of t.textChanges) this.changes.push({ kind: 3, sourceFile: e, text: r.newText, range: y7(r.span) }) } deleteRange(e, t) { this.changes.push({ kind: 0, sourceFile: e, range: t }) } delete(e, t) { this.deletedNodes.push({ sourceFile: e, node: t }) } deleteNode(e, t, r = { leadingTriviaOption: 1 }) { this.deleteRange(e, Fk(e, t, t, r)) } deleteNodes(e, t, r = { leadingTriviaOption: 1 }, i) { for (let o of t) { let s = f1(e, o, r, i), l = mx(e, o, r); this.deleteRange(e, { pos: s, end: l }), i = !!ite(e, o, r) } } deleteModifier(e, t) { this.deleteRange(e, { pos: t.getStart(e), end: xo(e.text, t.end, !0) }) } deleteNodeRange(e, t, r, i = { leadingTriviaOption: 1 }) { let o = f1(e, t, i), s = mx(e, r, i); this.deleteRange(e, { pos: o, end: s }) } deleteNodeRangeExcludingEnd(e, t, r, i = { leadingTriviaOption: 1 }) { let o = f1(e, t, i), s = r === void 0 ? e.text.length : f1(e, r, i); this.deleteRange(e, { pos: o, end: s }) } replaceRange(e, t, r, i = {}) { this.changes.push({ kind: 1, sourceFile: e, range: t, options: i, node: r }) } replaceNode(e, t, r, i = iC) { this.replaceRange(e, Fk(e, t, t, i), r, i) } replaceNodeRange(e, t, r, i, o = iC) { this.replaceRange(e, Fk(e, t, r, o), i, o) } replaceRangeWithNodes(e, t, r, i = {}) { this.changes.push({ kind: 2, sourceFile: e, range: t, options: i, nodes: r }) } replaceNodeWithNodes(e, t, r, i = iC) { this.replaceRangeWithNodes(e, Fk(e, t, t, i), r, i) } replaceNodeWithText(e, t, r) { this.replaceRangeWithText(e, Fk(e, t, t, iC), r) } replaceNodeRangeWithNodes(e, t, r, i, o = iC) { this.replaceRangeWithNodes(e, Fk(e, t, r, o), i, o) } nodeHasTrailingComment(e, t, r = iC) { return !!ite(e, t, r) } nextCommaToken(e, t) { let r = t1(t, t.parent, e); return r && r.kind === 27 ? r : void 0 } replacePropertyAssignment(e, t, r) { let i = this.nextCommaToken(e, t) ? "" : "," + this.newLineCharacter; this.replaceNode(e, t, r, { suffix: i }) } insertNodeAt(e, t, r, i = {}) { this.replaceRange(e, Gf(t), r, i) } insertNodesAt(e, t, r, i = {}) { this.replaceRangeWithNodes(e, Gf(t), r, i) } insertNodeAtTopOfFile(e, t, r) { this.insertAtTopOfFile(e, t, r) } insertNodesAtTopOfFile(e, t, r) { this.insertAtTopOfFile(e, t, r) } insertAtTopOfFile(e, t, r) { let i = YWe(e), o = { prefix: i === 0 ? void 0 : this.newLineCharacter, suffix: (Wl(e.text.charCodeAt(i)) ? "" : this.newLineCharacter) + (r ? this.newLineCharacter : "") }; ba(t) ? this.insertNodesAt(e, i, t, o) : this.insertNodeAt(e, i, t, o) } insertFirstParameter(e, t, r) { let i = Sl(t); i ? this.insertNodeBefore(e, i, r) : this.insertNodeAt(e, t.pos, r) } insertNodeBefore(e, t, r, i = !1, o = {}) { this.insertNodeAt(e, f1(e, t, o), r, this.getOptionsForInsertNodeBefore(t, r, i)) } insertModifierAt(e, t, r, i = {}) { this.insertNodeAt(e, t, D.createToken(r), i) } insertModifierBefore(e, t, r) { return this.insertModifierAt(e, r.getStart(e), t, { suffix: " " }) } insertCommentBeforeLine(e, t, r, i) { let o = Ky(t, e), s = nge(e.text, o), l = wSe(e, s), f = nk(e, l ? s : r), d = e.text.slice(o, s), g = `${l ? "" : this.newLineCharacter}//${i}${this.newLineCharacter}${d}`; this.insertText(e, f.getStart(e), g) } insertJsdocCommentBefore(e, t, r) { let i = t.getStart(e); if (t.jsDoc) for (let l of t.jsDoc) this.deleteRange(e, { pos: Wf(l.getStart(e), e), end: mx(e, l, {}) }); let o = hY(e.text, i - 1), s = e.text.slice(o, i); this.insertNodeAt(e, i, r, { suffix: this.newLineCharacter + s }) } createJSDocText(e, t) {
+                            let r = Uo(t.jsDoc, o => Ta(o.comment) ? D.createJSDocText(o.comment) : o.comment), i = Wp(t.jsDoc); return i && Bf(i.pos, i.end, e) && Fn(r) === 0 ? void 0 : D.createNodeArray(DU(r, D.createJSDocText(`
+`)))
+                        } replaceJSDocComment(e, t, r) { this.insertJsdocCommentBefore(e, HWe(t), D.createJSDocComment(this.createJSDocText(e, t), D.createNodeArray(r))) } addJSDocTags(e, t, r) { let i = BD(t.jsDoc, s => s.tags), o = r.filter(s => !i.some((l, f) => { let d = WWe(l, s); return d && (i[f] = d), !!d })); this.replaceJSDocComment(e, t, [...i, ...o]) } filterJSDocTags(e, t, r) { this.replaceJSDocComment(e, t, Pr(BD(t.jsDoc, i => i.tags), r)) } replaceRangeWithText(e, t, r) { this.changes.push({ kind: 3, sourceFile: e, range: t, text: r }) } insertText(e, t, r) { this.replaceRangeWithText(e, Gf(t), r) } tryInsertTypeAnnotation(e, t, r) { var i; let o; if (Ia(t)) { if (o = Yo(t, 21, e), !o) { if (!xs(t)) return !1; o = Vo(t.parameters) } } else o = (i = t.kind === 257 ? t.exclamationToken : t.questionToken) != null ? i : t.name; return this.insertNodeAt(e, o.end, r, { prefix: ": " }), !0 } tryInsertThisTypeAnnotation(e, t, r) { let i = Yo(t, 20, e).getStart(e) + 1, o = t.parameters.length ? ", " : ""; this.insertNodeAt(e, i, r, { prefix: "this: ", suffix: o }) } insertTypeParameters(e, t, r) { let i = (Yo(t, 20, e) || Vo(t.parameters)).getStart(e); this.insertNodesAt(e, i, r, { prefix: "<", suffix: ">", joiner: ", " }) } getOptionsForInsertNodeBefore(e, t, r) { return ca(e) || _l(e) ? { suffix: r ? this.newLineCharacter + this.newLineCharacter : this.newLineCharacter } : wi(e) ? { suffix: ", " } : ha(e) ? ha(t) ? { suffix: ", " } : {} : yo(e) && gl(e.parent) || jg(e) ? { suffix: ", " } : $u(e) ? { suffix: "," + (r ? this.newLineCharacter : " ") } : L.failBadSyntaxKind(e) } insertNodeAtConstructorStart(e, t, r) { let i = Sl(t.body.statements); !i || !t.body.multiLine ? this.replaceConstructorBody(e, t, [r, ...t.body.statements]) : this.insertNodeBefore(e, i, r) } insertNodeAtConstructorStartAfterSuperCall(e, t, r) { let i = wr(t.body.statements, o => Ol(o) && OA(o.expression)); !i || !t.body.multiLine ? this.replaceConstructorBody(e, t, [...t.body.statements, r]) : this.insertNodeAfter(e, i, r) } insertNodeAtConstructorEnd(e, t, r) { let i = Os(t.body.statements); !i || !t.body.multiLine ? this.replaceConstructorBody(e, t, [...t.body.statements, r]) : this.insertNodeAfter(e, i, r) } replaceConstructorBody(e, t, r) { this.replaceNode(e, t.body, D.createBlock(r, !0)) } insertNodeAtEndOfScope(e, t, r) { let i = f1(e, t.getLastToken(), {}); this.insertNodeAt(e, i, r, { prefix: Wl(e.text.charCodeAt(t.getLastToken().pos)) ? this.newLineCharacter : this.newLineCharacter + this.newLineCharacter, suffix: this.newLineCharacter }) } insertMemberAtStart(e, t, r) { this.insertNodeAtStartWorker(e, t, r) } insertNodeAtObjectStart(e, t, r) { this.insertNodeAtStartWorker(e, t, r) } insertNodeAtStartWorker(e, t, r) { var i; let o = (i = this.guessIndentationFromExistingMembers(e, t)) != null ? i : this.computeIndentationForNewMember(e, t); this.insertNodeAt(e, PG(t).pos, r, this.getInsertNodeAtStartInsertOptions(e, t, o)) } guessIndentationFromExistingMembers(e, t) { let r, i = t; for (let o of PG(t)) { if (a4(i, o, e)) return; let s = o.getStart(e), l = tl.SmartIndenter.findFirstNonWhitespaceColumn(Wf(s, e), s, e, this.formatContext.options); if (r === void 0) r = l; else if (l !== r) return; i = o } return r } computeIndentationForNewMember(e, t) { var r; let i = t.getStart(e); return tl.SmartIndenter.findFirstNonWhitespaceColumn(Wf(i, e), i, e, this.formatContext.options) + ((r = this.formatContext.options.indentSize) != null ? r : 4) } getInsertNodeAtStartInsertOptions(e, t, r) { let o = PG(t).length === 0, s = V_(this.classesWithNodesInsertedAtStart, zo(t), { node: t, sourceFile: e }), l = rs(t) && (!Mf(e) || !o), f = rs(t) && Mf(e) && o && !s; return { indentation: r, prefix: (f ? "," : "") + this.newLineCharacter, suffix: l ? "," : ku(t) && o ? ";" : "" } } insertNodeAfterComma(e, t, r) { let i = this.insertNodeAfterWorker(e, this.nextCommaToken(e, t) || t, r); this.insertNodeAt(e, i, r, this.getInsertNodeAfterOptions(e, t)) } insertNodeAfter(e, t, r) { let i = this.insertNodeAfterWorker(e, t, r); this.insertNodeAt(e, i, r, this.getInsertNodeAfterOptions(e, t)) } insertNodeAtEndOfList(e, t, r) { this.insertNodeAt(e, t.end, r, { prefix: ", " }) } insertNodesAfter(e, t, r) { let i = this.insertNodeAfterWorker(e, t, Vo(r)); this.insertNodesAt(e, i, r, this.getInsertNodeAfterOptions(e, t)) } insertNodeAfterWorker(e, t, r) { return $We(t, r) && e.text.charCodeAt(t.end - 1) !== 59 && this.replaceRange(e, Gf(t.end), D.createToken(26)), mx(e, t, {}) } getInsertNodeAfterOptions(e, t) {
+                            let r = this.getInsertNodeAfterOptionsWorker(t); return {
+                                ...r, prefix: t.end === e.end && ca(t) ? r.prefix ? `
+${r.prefix}` : `
+`: r.prefix
+                            }
+                        } getInsertNodeAfterOptionsWorker(e) { switch (e.kind) { case 260: case 264: return { prefix: this.newLineCharacter, suffix: this.newLineCharacter }; case 257: case 10: case 79: return { prefix: ", " }; case 299: return { suffix: "," + this.newLineCharacter }; case 93: return { prefix: " " }; case 166: return {}; default: return L.assert(ca(e) || s6(e)), { suffix: this.newLineCharacter } } } insertName(e, t, r) { if (L.assert(!t.name), t.kind === 216) { let i = Yo(t, 38, e), o = Yo(t, 20, e); o ? (this.insertNodesAt(e, o.getStart(e), [D.createToken(98), D.createIdentifier(r)], { joiner: " " }), Zm(this, e, i)) : (this.insertText(e, Vo(t.parameters).getStart(e), `function ${r}(`), this.replaceRange(e, i, D.createToken(21))), t.body.kind !== 238 && (this.insertNodesAt(e, t.body.getStart(e), [D.createToken(18), D.createToken(105)], { joiner: " ", suffix: " " }), this.insertNodesAt(e, t.body.end, [D.createToken(26), D.createToken(19)], { joiner: " " })) } else { let i = Yo(t, t.kind === 215 ? 98 : 84, e).end; this.insertNodeAt(e, i, D.createIdentifier(r), { prefix: " " }) } } insertExportModifier(e, t) { this.insertText(e, t.getStart(e), "export ") } insertImportSpecifierAtIndex(e, t, r, i) { let o = r.elements[i - 1]; o ? this.insertNodeInListAfter(e, o, t) : this.insertNodeBefore(e, r.elements[0], t, !Bf(r.elements[0].getStart(), r.parent.parent.getStart(), e)) } insertNodeInListAfter(e, t, r, i = tl.SmartIndenter.getContainingList(t, e)) { if (!i) { L.fail("node is not a list element"); return } let o = DA(i, t); if (o < 0) return; let s = t.getEnd(); if (o !== i.length - 1) { let l = Vi(e, t.end); if (l && NG(t, l)) { let f = i[o + 1], d = kSe(e.text, f.getFullStart()), g = `${Xa(l.kind)}${e.text.substring(l.end, d)}`; this.insertNodesAt(e, d, [r], { suffix: g }) } } else { let l = t.getStart(e), f = Wf(l, e), d, g = !1; if (i.length === 1) d = 27; else { let m = el(t.pos, e); d = NG(t, m) ? m.kind : 27, g = Wf(i[o - 1].getStart(e), e) !== f } if (VWe(e.text, t.end) && (g = !0), g) { this.replaceRange(e, Gf(s), D.createToken(d)); let m = tl.SmartIndenter.findFirstNonWhitespaceColumn(f, l, e, this.formatContext.options), v = xo(e.text, s, !0, !1); for (; v !== s && Wl(e.text.charCodeAt(v - 1));)v--; this.replaceRange(e, Gf(v), r, { indentation: m, prefix: this.newLineCharacter }) } else this.replaceRange(e, Gf(s), r, { prefix: `${Xa(d)} ` }) } } parenthesizeExpression(e, t) { this.replaceRange(e, MW(t), D.createParenthesizedExpression(t)) } finishClassesWithNodesInsertedAtStart() { this.classesWithNodesInsertedAtStart.forEach(({ node: e, sourceFile: t }) => { let [r, i] = JWe(e, t); if (r !== void 0 && i !== void 0) { let o = PG(e).length === 0, s = Bf(r, i, t); o && s && r !== i - 1 && this.deleteRange(t, Gf(r, i - 1)), s && this.insertText(t, i - 1, this.newLineCharacter) } }) } finishDeleteDeclarations() { let e = new Set; for (let { sourceFile: t, node: r } of this.deletedNodes) this.deletedNodes.some(i => i.sourceFile === t && bhe(i.node, r)) || (ba(r) ? this.deleteRange(t, FW(t, r)) : lte.deleteDeclaration(this, e, t, r)); e.forEach(t => { let r = t.getSourceFile(), i = tl.SmartIndenter.getContainingList(t, r); if (t !== To(i)) return; let o = s8(i, s => !e.has(s), i.length - 2); o !== -1 && this.deleteRange(r, { pos: i[o].end, end: ate(r, i[o + 1]) }) }) } getChanges(e) { this.finishDeleteDeclarations(), this.finishClassesWithNodesInsertedAtStart(); let t = UP.getTextChangesFromChanges(this.changes, this.newLineCharacter, this.formatContext, e); for (let { oldFile: r, fileName: i, statements: o } of this.newFiles) t.push(UP.newFileChanges(r, i, o, this.newLineCharacter, this.formatContext)); return t } createNewFile(e, t, r) { this.newFiles.push({ oldFile: e, fileName: t, statements: r }) }
+                    }, (e => { function t(f, d, g, m) { return Zi(YC(f, v => v.sourceFile.path), v => { let S = v[0].sourceFile, x = Ag(v, (w, C) => w.range.pos - C.range.pos || w.range.end - C.range.end); for (let w = 0; w < x.length - 1; w++)L.assert(x[w].range.end <= x[w + 1].range.pos, "Changes overlap", () => `${JSON.stringify(x[w].range)} and ${JSON.stringify(x[w + 1].range)}`); let A = Zi(x, w => { let C = lv(w.range), P = o(w, S, d, g, m); if (!(C.length === P.length && yge(S.text, P, C.start))) return GN(C, P) }); return A.length > 0 ? { fileName: S.fileName, textChanges: A } : void 0 }) } e.getTextChangesFromChanges = t; function r(f, d, g, m, v) { let S = i(f, RW(d), g, m, v); return { fileName: d, textChanges: [GN(il(0, 0), S)], isNewFile: !0 } } e.newFileChanges = r; function i(f, d, g, m, v) { let S = g.map(w => w === 4 ? "" : l(w, f, m).text).join(m), x = DO("any file name", S, 99, !0, d), A = tl.formatDocument(x, v); return ote(S, A) + m } e.newFileChangesWorker = i; function o(f, d, g, m, v) { var S; if (f.kind === 0) return ""; if (f.kind === 3) return f.text; let { options: x = {}, range: { pos: A } } = f, w = F => s(F, d, A, x, g, m, v), C = f.kind === 2 ? f.nodes.map(F => pA(w(F), g)).join(((S = f.options) == null ? void 0 : S.joiner) || g) : w(f.node), P = x.indentation !== void 0 || Wf(A, d) === A ? C : C.replace(/^\s+/, ""); return (x.prefix || "") + P + (!x.suffix || Oc(P, x.suffix) ? "" : x.suffix) } function s(f, d, g, { indentation: m, prefix: v, delta: S }, x, A, w) { let { node: C, text: P } = l(f, d, x); w && w(C, P); let F = z7(A, d), B = m !== void 0 ? m : tl.SmartIndenter.getIndentation(g, d, F, v === x || Wf(g, d) === g); S === void 0 && (S = tl.SmartIndenter.shouldIndentChildNode(F, f) && F.indentSize || 0); let q = { text: P, getLineAndCharacterOfPosition(Y) { return Gs(this, Y) } }, W = tl.formatNodeGivenIndentation(C, q, d.languageVariant, B, S, { ...A, options: F }); return ote(P, W) } function l(f, d, g) { let m = DSe(g), v = XN(g); return nE({ newLine: v, neverAsciiEscape: !0, preserveSourceNewlines: !0, terminateUnterminatedLiterals: !0 }, m).writeNode(4, f, d, m), { text: m.getText(), node: MG(f) } } e.getNonformattedText = l })(UP || (UP = {})), RSe = { ...Bh, factory: YR(Bh.factory.flags | 1, Bh.factory.baseFactory) }, (e => { function t(s, l, f, d) { switch (d.kind) { case 166: { let x = d.parent; xs(x) && x.parameters.length === 1 && !Yo(x, 20, f) ? s.replaceNodeWithText(f, d, "()") : Gk(s, l, f, d); break } case 269: case 268: let g = f.imports.length && d === Vo(f.imports).parent || d === wr(f.statements, yT); Zm(s, f, d, { leadingTriviaOption: g ? 0 : Kd(d) ? 2 : 3 }); break; case 205: let m = d.parent; m.kind === 204 && d !== To(m.elements) ? Zm(s, f, d) : Gk(s, l, f, d); break; case 257: o(s, l, f, d); break; case 165: Gk(s, l, f, d); break; case 273: let S = d.parent; S.elements.length === 1 ? i(s, f, S) : Gk(s, l, f, d); break; case 271: i(s, f, d); break; case 26: Zm(s, f, d, { trailingTriviaOption: 0 }); break; case 98: Zm(s, f, d, { leadingTriviaOption: 0 }); break; case 260: case 259: Zm(s, f, d, { leadingTriviaOption: Kd(d) ? 2 : 3 }); break; default: d.parent ? lm(d.parent) && d.parent.name === d ? r(s, f, d.parent) : Pa(d.parent) && ya(d.parent.arguments, d) ? Gk(s, l, f, d) : Zm(s, f, d) : Zm(s, f, d) } } e.deleteDeclaration = t; function r(s, l, f) { if (!f.namedBindings) Zm(s, l, f.parent); else { let d = f.name.getStart(l), g = Vi(l, f.name.end); if (g && g.kind === 27) { let m = xo(l.text, g.end, !1, !0); s.deleteRange(l, { pos: d, end: m }) } else Zm(s, l, f.name) } } function i(s, l, f) { if (f.parent.name) { let d = L.checkDefined(Vi(l, f.pos - 1)); s.deleteRange(l, { pos: d.getStart(l), end: f.end }) } else { let d = cb(f, 269); Zm(s, l, d) } } function o(s, l, f, d) { let { parent: g } = d; if (g.kind === 295) { s.deleteNodeRange(f, Yo(g, 20, f), Yo(g, 21, f)); return } if (g.declarations.length !== 1) { Gk(s, l, f, d); return } let m = g.parent; switch (m.kind) { case 247: case 246: s.replaceNode(f, d, D.createObjectLiteralExpression()); break; case 245: Zm(s, f, g); break; case 240: Zm(s, f, m, { leadingTriviaOption: Kd(m) ? 2 : 3 }); break; default: L.assertNever(m) } } })(lte || (lte = {}))
+                }
+            }), nr = {}; Mo(nr, { ChangeTracker: () => FG, LeadingTriviaOption: () => ste, TrailingTriviaOption: () => cte, applyChanges: () => ote, assignPositionsToNode: () => MG, createWriter: () => DSe, deleteNode: () => Zm, getNewFileText: () => KWe, isThisTypeAnnotatable: () => jWe, isValidLocationToAddComment: () => wSe }); var ZWe = gt({ "src/services/_namespaces/ts.textChanges.ts"() { "use strict"; QWe() } }), ute, dte, eze = gt({ "src/services/formatting/formattingContext.ts"() { "use strict"; Fr(), ute = (e => (e[e.FormatDocument = 0] = "FormatDocument", e[e.FormatSelection = 1] = "FormatSelection", e[e.FormatOnEnter = 2] = "FormatOnEnter", e[e.FormatOnSemicolon = 3] = "FormatOnSemicolon", e[e.FormatOnOpeningCurlyBrace = 4] = "FormatOnOpeningCurlyBrace", e[e.FormatOnClosingCurlyBrace = 5] = "FormatOnClosingCurlyBrace", e))(ute || {}), dte = class { constructor(e, t, r) { this.sourceFile = e, this.formattingRequestKind = t, this.options = r } updateContext(e, t, r, i, o) { this.currentTokenSpan = L.checkDefined(e), this.currentTokenParent = L.checkDefined(t), this.nextTokenSpan = L.checkDefined(r), this.nextTokenParent = L.checkDefined(i), this.contextNode = L.checkDefined(o), this.contextNodeAllOnSameLine = void 0, this.nextNodeAllOnSameLine = void 0, this.tokensAreOnSameLine = void 0, this.contextNodeBlockIsOnOneLine = void 0, this.nextNodeBlockIsOnOneLine = void 0 } ContextNodeAllOnSameLine() { return this.contextNodeAllOnSameLine === void 0 && (this.contextNodeAllOnSameLine = this.NodeIsOnOneLine(this.contextNode)), this.contextNodeAllOnSameLine } NextNodeAllOnSameLine() { return this.nextNodeAllOnSameLine === void 0 && (this.nextNodeAllOnSameLine = this.NodeIsOnOneLine(this.nextTokenParent)), this.nextNodeAllOnSameLine } TokensAreOnSameLine() { if (this.tokensAreOnSameLine === void 0) { let e = this.sourceFile.getLineAndCharacterOfPosition(this.currentTokenSpan.pos).line, t = this.sourceFile.getLineAndCharacterOfPosition(this.nextTokenSpan.pos).line; this.tokensAreOnSameLine = e === t } return this.tokensAreOnSameLine } ContextNodeBlockIsOnOneLine() { return this.contextNodeBlockIsOnOneLine === void 0 && (this.contextNodeBlockIsOnOneLine = this.BlockIsOnOneLine(this.contextNode)), this.contextNodeBlockIsOnOneLine } NextNodeBlockIsOnOneLine() { return this.nextNodeBlockIsOnOneLine === void 0 && (this.nextNodeBlockIsOnOneLine = this.BlockIsOnOneLine(this.nextTokenParent)), this.nextNodeBlockIsOnOneLine } NodeIsOnOneLine(e) { let t = this.sourceFile.getLineAndCharacterOfPosition(e.getStart(this.sourceFile)).line, r = this.sourceFile.getLineAndCharacterOfPosition(e.getEnd()).line; return t === r } BlockIsOnOneLine(e) { let t = Yo(e, 18, this.sourceFile), r = Yo(e, 19, this.sourceFile); if (t && r) { let i = this.sourceFile.getLineAndCharacterOfPosition(t.getEnd()).line, o = this.sourceFile.getLineAndCharacterOfPosition(r.getStart(this.sourceFile)).line; return i === o } return !1 } } } }); function fte(e, t, r, i, o) { let s = t === 1 ? NSe : OSe; s.setText(e), s.setTextPos(r); let l = !0, f, d, g, m, v, S = o({ advance: x, readTokenInfo: W, readEOFTokenRange: R, isOnToken: ie, isOnEOF: $, getCurrentLeadingTrivia: () => f, lastTrailingTriviaWasNewLine: () => l, skipToEndOf: Z, skipToStartOf: U, getStartPos: () => { var re; return (re = v?.token.pos) != null ? re : s.getTokenPos() } }); return v = void 0, s.setText(void 0), S; function x() { v = void 0, s.getStartPos() !== r ? l = !!d && To(d).kind === 4 : s.scan(), f = void 0, d = void 0; let le = s.getStartPos(); for (; le < i;) { let _e = s.getToken(); if (!KA(_e)) break; s.scan(); let ge = { pos: le, end: s.getStartPos(), kind: _e }; le = s.getStartPos(), f = Sn(f, ge) } g = s.getStartPos() } function A(re) { switch (re.kind) { case 33: case 71: case 72: case 49: case 48: return !0 }return !1 } function w(re) { if (re.parent) switch (re.parent.kind) { case 288: case 283: case 284: case 282: return Xu(re.kind) || re.kind === 79 }return !1 } function C(re) { return CS(re) || Hg(re) && v?.token.kind === 11 } function P(re) { return re.kind === 13 } function F(re) { return re.kind === 16 || re.kind === 17 } function B(re) { return re.parent && Sp(re.parent) && re.parent.initializer === re } function q(re) { return re === 43 || re === 68 } function W(re) { L.assert(ie()); let le = A(re) ? 1 : P(re) ? 2 : F(re) ? 3 : w(re) ? 4 : C(re) ? 5 : B(re) ? 6 : 0; if (v && le === m) return fe(v, re); s.getStartPos() !== g && (L.assert(v !== void 0), s.setTextPos(g), s.scan()); let _e = Y(re, le), ge = VG(s.getStartPos(), s.getTextPos(), _e); for (d && (d = void 0); s.getStartPos() < i && (_e = s.scan(), !!KA(_e));) { let X = VG(s.getStartPos(), s.getTextPos(), _e); if (d || (d = []), d.push(X), _e === 4) { s.scan(); break } } return v = { leadingTrivia: f, trailingTrivia: d, token: ge }, fe(v, re) } function Y(re, le) { let _e = s.getToken(); switch (m = 0, le) { case 1: if (_e === 31) { m = 1; let ge = s.reScanGreaterToken(); return L.assert(re.kind === ge), ge } break; case 2: if (q(_e)) { m = 2; let ge = s.reScanSlashToken(); return L.assert(re.kind === ge), ge } break; case 3: if (_e === 19) return m = 3, s.reScanTemplateToken(!1); break; case 4: return m = 4, s.scanJsxIdentifier(); case 5: return m = 5, s.reScanJsxToken(!1); case 6: return m = 6, s.reScanJsxAttributeValue(); case 0: break; default: L.assertNever(le) }return _e } function R() { return L.assert($()), VG(s.getStartPos(), s.getTextPos(), 1) } function ie() { let re = v ? v.token.kind : s.getToken(); return re !== 1 && !KA(re) } function $() { return (v ? v.token.kind : s.getToken()) === 1 } function fe(re, le) { return Z1(le) && re.token.kind !== le.kind && (re.token.kind = le.kind), re } function Z(re) { s.setTextPos(re.end), g = s.getStartPos(), m = void 0, v = void 0, l = !1, f = void 0, d = void 0 } function U(re) { s.setTextPos(re.pos), g = s.getStartPos(), m = void 0, v = void 0, l = !1, f = void 0, d = void 0 } } var OSe, NSe, tze = gt({ "src/services/formatting/formattingScanner.ts"() { "use strict"; Fr(), Vk(), OSe = kg(99, !1, 0), NSe = kg(99, !1, 1) } }), VP, _te, pte, nze = gt({ "src/services/formatting/rule.ts"() { "use strict"; Fr(), VP = Je, _te = (e => (e[e.None = 0] = "None", e[e.StopProcessingSpaceActions = 1] = "StopProcessingSpaceActions", e[e.StopProcessingTokenActions = 2] = "StopProcessingTokenActions", e[e.InsertSpace = 4] = "InsertSpace", e[e.InsertNewLine = 8] = "InsertNewLine", e[e.DeleteSpace = 16] = "DeleteSpace", e[e.DeleteToken = 32] = "DeleteToken", e[e.InsertTrailingSemicolon = 64] = "InsertTrailingSemicolon", e[e.StopAction = 3] = "StopAction", e[e.ModifySpaceAction = 28] = "ModifySpaceAction", e[e.ModifyTokenAction = 96] = "ModifyTokenAction", e))(_te || {}), pte = (e => (e[e.None = 0] = "None", e[e.CanDeleteNewLines = 1] = "CanDeleteNewLines", e))(pte || {}) } }); function PSe() { let e = []; for (let Y = 0; Y <= 162; Y++)Y !== 1 && e.push(Y); function t(...Y) { return { tokens: e.filter(R => !Y.some(ie => ie === R)), isSpecific: !1 } } let r = { tokens: e, isSpecific: !1 }, i = aC([...e, 3]), o = aC([...e, 1]), s = FSe(81, 162), l = FSe(29, 78), f = [101, 102, 162, 128, 140, 150], d = [45, 46, 54, 53], g = [8, 9, 79, 20, 22, 18, 108, 103], m = [79, 20, 108, 103], v = [79, 21, 23, 103], S = [79, 20, 108, 103], x = [79, 21, 23, 103], A = [2, 3], w = [79, ...K7], C = i, P = aC([79, 3, 84, 93, 100]), F = aC([21, 3, 90, 111, 96, 91]), B = [Lr("IgnoreBeforeComment", r, A, VP, 1), Lr("IgnoreAfterLineComment", 2, r, VP, 1), Lr("NotSpaceBeforeColon", r, 58, [mi, jP, USe], 16), Lr("SpaceAfterColon", 58, r, [mi, jP], 4), Lr("NoSpaceBeforeQuestionMark", r, 57, [mi, jP, USe], 16), Lr("SpaceAfterQuestionMarkInConditionalOperator", 57, r, [mi, ize], 4), Lr("NoSpaceAfterQuestionMark", 57, r, [mi], 16), Lr("NoSpaceBeforeDot", r, [24, 28], [mi, kze], 16), Lr("NoSpaceAfterDot", [24, 28], r, [mi], 16), Lr("NoSpaceBetweenImportParenInImportType", 100, 20, [mi, mze], 16), Lr("NoSpaceAfterUnaryPrefixOperator", d, g, [mi, jP], 16), Lr("NoSpaceAfterUnaryPreincrementOperator", 45, m, [mi], 16), Lr("NoSpaceAfterUnaryPredecrementOperator", 46, S, [mi], 16), Lr("NoSpaceBeforeUnaryPostincrementOperator", v, 45, [mi, txe], 16), Lr("NoSpaceBeforeUnaryPostdecrementOperator", x, 46, [mi, txe], 16), Lr("SpaceAfterPostincrementWhenFollowedByAdd", 45, 39, [mi, Qg], 4), Lr("SpaceAfterAddWhenFollowedByUnaryPlus", 39, 39, [mi, Qg], 4), Lr("SpaceAfterAddWhenFollowedByPreincrement", 39, 45, [mi, Qg], 4), Lr("SpaceAfterPostdecrementWhenFollowedBySubtract", 46, 40, [mi, Qg], 4), Lr("SpaceAfterSubtractWhenFollowedByUnaryMinus", 40, 40, [mi, Qg], 4), Lr("SpaceAfterSubtractWhenFollowedByPredecrement", 40, 46, [mi, Qg], 4), Lr("NoSpaceAfterCloseBrace", 19, [27, 26], [mi], 16), Lr("NewLineBeforeCloseBraceInBlockContext", i, 19, [jSe], 8), Lr("SpaceAfterCloseBrace", 19, t(21), [mi, sze], 4), Lr("SpaceBetweenCloseBraceAndElse", 19, 91, [mi], 4), Lr("SpaceBetweenCloseBraceAndWhile", 19, 115, [mi], 4), Lr("NoSpaceBetweenEmptyBraceBrackets", 18, 19, [mi, qSe], 16), Lr("SpaceAfterConditionalClosingParen", 21, 22, [HP], 4), Lr("NoSpaceBetweenFunctionKeywordAndStar", 98, 41, [zSe], 16), Lr("SpaceAfterStarInGeneratorDeclaration", 41, 79, [zSe], 4), Lr("SpaceAfterFunctionInFuncDecl", 98, r, [cE], 4), Lr("NewLineAfterOpenBraceInBlockContext", 18, r, [jSe], 8), Lr("SpaceAfterGetSetInMember", [137, 151], 79, [cE], 4), Lr("NoSpaceBetweenYieldKeywordAndStar", 125, 41, [mi, exe], 16), Lr("SpaceBetweenYieldOrYieldStarAndOperand", [125, 41], r, [mi, exe], 4), Lr("NoSpaceBetweenReturnAndSemicolon", 105, 26, [mi], 16), Lr("SpaceAfterCertainKeywords", [113, 109, 103, 89, 105, 112, 133], r, [mi], 4), Lr("SpaceAfterLetConstInVariableDeclaration", [119, 85], r, [mi, vze], 4), Lr("NoSpaceBeforeOpenParenInFuncCall", r, 20, [mi, uze, dze], 16), Lr("SpaceBeforeBinaryKeywordOperator", r, f, [mi, Qg], 4), Lr("SpaceAfterBinaryKeywordOperator", f, r, [mi, Qg], 4), Lr("SpaceAfterVoidOperator", 114, r, [mi, xze], 4), Lr("SpaceBetweenAsyncAndOpenParen", 132, 20, [pze, mi], 4), Lr("SpaceBetweenAsyncAndFunctionKeyword", 132, [98, 79], [mi], 4), Lr("NoSpaceBetweenTagAndTemplateString", [79, 21], [14, 15], [mi], 16), Lr("SpaceBeforeJsxAttribute", r, 79, [hze, mi], 4), Lr("SpaceBeforeSlashInJsxOpeningElement", r, 43, [$Se, mi], 4), Lr("NoSpaceBeforeGreaterThanTokenInJsxOpeningElement", 43, 31, [$Se, mi], 16), Lr("NoSpaceBeforeEqualInJsxAttribute", r, 63, [YSe, mi], 16), Lr("NoSpaceAfterEqualInJsxAttribute", 63, r, [YSe, mi], 16), Lr("NoSpaceAfterModuleImport", [142, 147], 20, [mi], 16), Lr("SpaceAfterCertainTypeScriptKeywords", [126, 127, 84, 136, 88, 92, 93, 94, 137, 117, 100, 118, 142, 143, 121, 123, 122, 146, 151, 124, 154, 158, 141, 138], r, [mi], 4), Lr("SpaceBeforeCertainTypeScriptKeywords", r, [94, 117, 158], [mi], 4), Lr("SpaceAfterModuleName", 10, 18, [bze], 4), Lr("SpaceBeforeArrow", r, 38, [mi], 4), Lr("SpaceAfterArrow", 38, r, [mi], 4), Lr("NoSpaceAfterEllipsis", 25, 79, [mi], 16), Lr("NoSpaceAfterOptionalParameters", 57, [21, 27], [mi, jP], 16), Lr("NoSpaceBetweenEmptyInterfaceBraceBrackets", 18, 19, [mi, Eze], 16), Lr("NoSpaceBeforeOpenAngularBracket", w, 29, [mi, WP], 16), Lr("NoSpaceBetweenCloseParenAndAngularBracket", 21, 29, [mi, WP], 16), Lr("NoSpaceAfterOpenAngularBracket", 29, r, [mi, WP], 16), Lr("NoSpaceBeforeCloseAngularBracket", r, 31, [mi, WP], 16), Lr("NoSpaceAfterCloseAngularBracket", 31, [20, 22, 31, 27], [mi, WP, oze, Sze], 16), Lr("SpaceBeforeAt", [21, 79], 59, [mi], 4), Lr("NoSpaceAfterAt", 59, r, [mi], 16), Lr("SpaceAfterDecorator", r, [126, 79, 93, 88, 84, 124, 123, 121, 122, 137, 151, 22, 41], [yze], 4), Lr("NoSpaceBeforeNonNullAssertionOperator", r, 53, [mi, Aze], 16), Lr("NoSpaceAfterNewKeywordOnConstructorSignature", 103, 20, [mi, Tze], 16), Lr("SpaceLessThanAndNonJSXTypeAnnotation", 29, 29, [mi], 4)], q = [Lr("SpaceAfterConstructor", 135, 20, [Nd("insertSpaceAfterConstructor"), mi], 4), Lr("NoSpaceAfterConstructor", 135, 20, [q_("insertSpaceAfterConstructor"), mi], 16), Lr("SpaceAfterComma", 27, r, [Nd("insertSpaceAfterCommaDelimiter"), mi, Ete, fze, _ze], 4), Lr("NoSpaceAfterComma", 27, r, [q_("insertSpaceAfterCommaDelimiter"), mi, Ete], 16), Lr("SpaceAfterAnonymousFunctionKeyword", [98, 41], 20, [Nd("insertSpaceAfterFunctionKeywordForAnonymousFunctions"), cE], 4), Lr("NoSpaceAfterAnonymousFunctionKeyword", [98, 41], 20, [q_("insertSpaceAfterFunctionKeywordForAnonymousFunctions"), cE], 16), Lr("SpaceAfterKeywordInControl", s, 20, [Nd("insertSpaceAfterKeywordsInControlFlowStatements"), HP], 4), Lr("NoSpaceAfterKeywordInControl", s, 20, [q_("insertSpaceAfterKeywordsInControlFlowStatements"), HP], 16), Lr("SpaceAfterOpenParen", 20, r, [Nd("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), mi], 4), Lr("SpaceBeforeCloseParen", r, 21, [Nd("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), mi], 4), Lr("SpaceBetweenOpenParens", 20, 20, [Nd("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), mi], 4), Lr("NoSpaceBetweenParens", 20, 21, [mi], 16), Lr("NoSpaceAfterOpenParen", 20, r, [q_("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), mi], 16), Lr("NoSpaceBeforeCloseParen", r, 21, [q_("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), mi], 16), Lr("SpaceAfterOpenBracket", 22, r, [Nd("insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"), mi], 4), Lr("SpaceBeforeCloseBracket", r, 23, [Nd("insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"), mi], 4), Lr("NoSpaceBetweenBrackets", 22, 23, [mi], 16), Lr("NoSpaceAfterOpenBracket", 22, r, [q_("insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"), mi], 16), Lr("NoSpaceBeforeCloseBracket", r, 23, [q_("insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"), mi], 16), Lr("SpaceAfterOpenBrace", 18, r, [BSe("insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"), VSe], 4), Lr("SpaceBeforeCloseBrace", r, 19, [BSe("insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"), VSe], 4), Lr("NoSpaceBetweenEmptyBraceBrackets", 18, 19, [mi, qSe], 16), Lr("NoSpaceAfterOpenBrace", 18, r, [mte("insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"), mi], 16), Lr("NoSpaceBeforeCloseBrace", r, 19, [mte("insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"), mi], 16), Lr("SpaceBetweenEmptyBraceBrackets", 18, 19, [Nd("insertSpaceAfterOpeningAndBeforeClosingEmptyBraces")], 4), Lr("NoSpaceBetweenEmptyBraceBrackets", 18, 19, [mte("insertSpaceAfterOpeningAndBeforeClosingEmptyBraces"), mi], 16), Lr("SpaceAfterTemplateHeadAndMiddle", [15, 16], r, [Nd("insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"), XSe], 4, 1), Lr("SpaceBeforeTemplateMiddleAndTail", r, [16, 17], [Nd("insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"), mi], 4), Lr("NoSpaceAfterTemplateHeadAndMiddle", [15, 16], r, [q_("insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"), XSe], 16, 1), Lr("NoSpaceBeforeTemplateMiddleAndTail", r, [16, 17], [q_("insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"), mi], 16), Lr("SpaceAfterOpenBraceInJsxExpression", 18, r, [Nd("insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"), mi, BG], 4), Lr("SpaceBeforeCloseBraceInJsxExpression", r, 19, [Nd("insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"), mi, BG], 4), Lr("NoSpaceAfterOpenBraceInJsxExpression", 18, r, [q_("insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"), mi, BG], 16), Lr("NoSpaceBeforeCloseBraceInJsxExpression", r, 19, [q_("insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"), mi, BG], 16), Lr("SpaceAfterSemicolonInFor", 26, r, [Nd("insertSpaceAfterSemicolonInForStatements"), mi, gte], 4), Lr("NoSpaceAfterSemicolonInFor", 26, r, [q_("insertSpaceAfterSemicolonInForStatements"), mi, gte], 16), Lr("SpaceBeforeBinaryOperator", r, l, [Nd("insertSpaceBeforeAndAfterBinaryOperators"), mi, Qg], 4), Lr("SpaceAfterBinaryOperator", l, r, [Nd("insertSpaceBeforeAndAfterBinaryOperators"), mi, Qg], 4), Lr("NoSpaceBeforeBinaryOperator", r, l, [q_("insertSpaceBeforeAndAfterBinaryOperators"), mi, Qg], 16), Lr("NoSpaceAfterBinaryOperator", l, r, [q_("insertSpaceBeforeAndAfterBinaryOperators"), mi, Qg], 16), Lr("SpaceBeforeOpenParenInFuncDecl", r, 20, [Nd("insertSpaceBeforeFunctionParenthesis"), mi, cE], 4), Lr("NoSpaceBeforeOpenParenInFuncDecl", r, 20, [q_("insertSpaceBeforeFunctionParenthesis"), mi, cE], 16), Lr("NewLineBeforeOpenBraceInControl", F, 18, [Nd("placeOpenBraceOnNewLineForControlBlocks"), HP, bte], 8, 1), Lr("NewLineBeforeOpenBraceInFunction", C, 18, [Nd("placeOpenBraceOnNewLineForFunctions"), cE, bte], 8, 1), Lr("NewLineBeforeOpenBraceInTypeScriptDeclWithBlock", P, 18, [Nd("placeOpenBraceOnNewLineForFunctions"), JSe, bte], 8, 1), Lr("SpaceAfterTypeAssertion", 31, r, [Nd("insertSpaceAfterTypeAssertion"), mi, Ste], 4), Lr("NoSpaceAfterTypeAssertion", 31, r, [q_("insertSpaceAfterTypeAssertion"), mi, Ste], 16), Lr("SpaceBeforeTypeAnnotation", r, [57, 58], [Nd("insertSpaceBeforeTypeAnnotation"), mi, yte], 4), Lr("NoSpaceBeforeTypeAnnotation", r, [57, 58], [q_("insertSpaceBeforeTypeAnnotation"), mi, yte], 16), Lr("NoOptionalSemicolon", 26, o, [GSe("semicolons", "remove"), Ize], 32), Lr("OptionalSemicolon", r, o, [GSe("semicolons", "insert"), Lze], 64)], W = [Lr("NoSpaceBeforeSemicolon", r, 26, [mi], 16), Lr("SpaceBeforeOpenBraceInControl", F, 18, [hte("placeOpenBraceOnNewLineForControlBlocks"), HP, Tte, vte], 4, 1), Lr("SpaceBeforeOpenBraceInFunction", C, 18, [hte("placeOpenBraceOnNewLineForFunctions"), cE, GG, Tte, vte], 4, 1), Lr("SpaceBeforeOpenBraceInTypeScriptDeclWithBlock", P, 18, [hte("placeOpenBraceOnNewLineForFunctions"), JSe, Tte, vte], 4, 1), Lr("NoSpaceBeforeComma", r, 27, [mi], 16), Lr("NoSpaceBeforeOpenBracket", t(132, 82), 22, [mi], 16), Lr("NoSpaceAfterCloseBracket", 23, r, [mi, gze], 16), Lr("SpaceAfterSemicolon", 26, r, [mi], 4), Lr("SpaceBetweenForAndAwaitKeyword", 97, 133, [mi], 4), Lr("SpaceBetweenStatements", [21, 90, 91, 82], r, [mi, Ete, rze], 4), Lr("SpaceAfterTryCatchFinally", [111, 83, 96], 18, [mi], 4)]; return [...B, ...q, ...W] } function Lr(e, t, r, i, o, s = 0) { return { leftTokenRange: MSe(t), rightTokenRange: MSe(r), rule: { debugName: e, context: i, action: o, flags: s } } } function aC(e) { return { tokens: e, isSpecific: !0 } } function MSe(e) { return typeof e == "number" ? aC([e]) : ba(e) ? aC(e) : e } function FSe(e, t, r = []) { let i = []; for (let o = e; o <= t; o++)ya(r, o) || i.push(o); return aC(i) } function GSe(e, t) { return r => r.options && r.options[e] === t } function Nd(e) { return t => t.options && fs(t.options, e) && !!t.options[e] } function mte(e) { return t => t.options && fs(t.options, e) && !t.options[e] } function q_(e) { return t => !t.options || !fs(t.options, e) || !t.options[e] } function hte(e) { return t => !t.options || !fs(t.options, e) || !t.options[e] || t.TokensAreOnSameLine() } function BSe(e) { return t => !t.options || !fs(t.options, e) || !!t.options[e] } function gte(e) { return e.contextNode.kind === 245 } function rze(e) { return !gte(e) } function Qg(e) { switch (e.contextNode.kind) { case 223: return e.contextNode.operatorToken.kind !== 27; case 224: case 191: case 231: case 278: case 273: case 179: case 189: case 190: case 235: return !0; case 205: case 262: case 268: case 274: case 257: case 166: case 302: case 169: case 168: return e.currentTokenSpan.kind === 63 || e.nextTokenSpan.kind === 63; case 246: case 165: return e.currentTokenSpan.kind === 101 || e.nextTokenSpan.kind === 101 || e.currentTokenSpan.kind === 63 || e.nextTokenSpan.kind === 63; case 247: return e.currentTokenSpan.kind === 162 || e.nextTokenSpan.kind === 162 }return !1 } function jP(e) { return !Qg(e) } function USe(e) { return !yte(e) } function yte(e) { let t = e.contextNode.kind; return t === 169 || t === 168 || t === 166 || t === 257 || nS(t) } function ize(e) { return e.contextNode.kind === 224 || e.contextNode.kind === 191 } function vte(e) { return e.TokensAreOnSameLine() || GG(e) } function VSe(e) { return e.contextNode.kind === 203 || e.contextNode.kind === 197 || aze(e) } function bte(e) { return GG(e) && !(e.NextNodeAllOnSameLine() || e.NextNodeBlockIsOnOneLine()) } function jSe(e) { return HSe(e) && !(e.ContextNodeAllOnSameLine() || e.ContextNodeBlockIsOnOneLine()) } function aze(e) { return HSe(e) && (e.ContextNodeAllOnSameLine() || e.ContextNodeBlockIsOnOneLine()) } function HSe(e) { return WSe(e.contextNode) } function GG(e) { return WSe(e.nextTokenParent) } function WSe(e) { if (KSe(e)) return !0; switch (e.kind) { case 238: case 266: case 207: case 265: return !0 }return !1 } function cE(e) { switch (e.contextNode.kind) { case 259: case 171: case 170: case 174: case 175: case 176: case 215: case 173: case 216: case 261: return !0 }return !1 } function oze(e) { return !cE(e) } function zSe(e) { return e.contextNode.kind === 259 || e.contextNode.kind === 215 } function JSe(e) { return KSe(e.contextNode) } function KSe(e) { switch (e.kind) { case 260: case 228: case 261: case 263: case 184: case 264: case 275: case 276: case 269: case 272: return !0 }return !1 } function sze(e) { switch (e.currentTokenParent.kind) { case 260: case 264: case 263: case 295: case 265: case 252: return !0; case 238: { let t = e.currentTokenParent.parent; if (!t || t.kind !== 216 && t.kind !== 215) return !0 } }return !1 } function HP(e) { switch (e.contextNode.kind) { case 242: case 252: case 245: case 246: case 247: case 244: case 255: case 243: case 251: case 295: return !0; default: return !1 } } function qSe(e) { return e.contextNode.kind === 207 } function cze(e) { return e.contextNode.kind === 210 } function lze(e) { return e.contextNode.kind === 211 } function uze(e) { return cze(e) || lze(e) } function dze(e) { return e.currentTokenSpan.kind !== 27 } function fze(e) { return e.nextTokenSpan.kind !== 23 } function _ze(e) { return e.nextTokenSpan.kind !== 21 } function pze(e) { return e.contextNode.kind === 216 } function mze(e) { return e.contextNode.kind === 202 } function mi(e) { return e.TokensAreOnSameLine() && e.contextNode.kind !== 11 } function XSe(e) { return e.contextNode.kind !== 11 } function Ete(e) { return e.contextNode.kind !== 281 && e.contextNode.kind !== 285 } function BG(e) { return e.contextNode.kind === 291 || e.contextNode.kind === 290 } function hze(e) { return e.nextTokenParent.kind === 288 } function YSe(e) { return e.contextNode.kind === 288 } function $Se(e) { return e.contextNode.kind === 282 } function gze(e) { return !cE(e) && !GG(e) } function yze(e) { return e.TokensAreOnSameLine() && bf(e.contextNode) && QSe(e.currentTokenParent) && !QSe(e.nextTokenParent) } function QSe(e) { for (; e && ot(e);)e = e.parent; return e && e.kind === 167 } function vze(e) { return e.currentTokenParent.kind === 258 && e.currentTokenParent.getStart(e.sourceFile) === e.currentTokenSpan.pos } function Tte(e) { return e.formattingRequestKind !== 2 } function bze(e) { return e.contextNode.kind === 264 } function Eze(e) { return e.contextNode.kind === 184 } function Tze(e) { return e.contextNode.kind === 177 } function ZSe(e, t) { if (e.kind !== 29 && e.kind !== 31) return !1; switch (t.kind) { case 180: case 213: case 262: case 260: case 228: case 261: case 259: case 215: case 216: case 171: case 170: case 176: case 177: case 210: case 211: case 230: return !0; default: return !1 } } function WP(e) { return ZSe(e.currentTokenSpan, e.currentTokenParent) || ZSe(e.nextTokenSpan, e.nextTokenParent) } function Ste(e) { return e.contextNode.kind === 213 } function Sze(e) { return !Ste(e) } function xze(e) { return e.currentTokenSpan.kind === 114 && e.currentTokenParent.kind === 219 } function exe(e) { return e.contextNode.kind === 226 && e.contextNode.expression !== void 0 } function Aze(e) { return e.contextNode.kind === 232 } function txe(e) { return !Cze(e) } function Cze(e) { switch (e.contextNode.kind) { case 242: case 245: case 246: case 247: case 243: case 244: return !0; default: return !1 } } function Ize(e) { let t = e.nextTokenSpan.kind, r = e.nextTokenSpan.pos; if (KA(t)) { let s = e.nextTokenParent === e.currentTokenParent ? t1(e.currentTokenParent, jn(e.currentTokenParent, l => !l.parent), e.sourceFile) : e.nextTokenParent.getFirstToken(e.sourceFile); if (!s) return !0; t = s.kind, r = s.getStart(e.sourceFile) } let i = e.sourceFile.getLineAndCharacterOfPosition(e.currentTokenSpan.pos).line, o = e.sourceFile.getLineAndCharacterOfPosition(r).line; return i === o ? t === 19 || t === 1 : t === 237 || t === 26 ? !1 : e.contextNode.kind === 261 || e.contextNode.kind === 262 ? !$d(e.currentTokenParent) || !!e.currentTokenParent.type || t !== 20 : Na(e.currentTokenParent) ? !e.currentTokenParent.initializer : e.currentTokenParent.kind !== 245 && e.currentTokenParent.kind !== 239 && e.currentTokenParent.kind !== 237 && t !== 22 && t !== 20 && t !== 39 && t !== 40 && t !== 43 && t !== 13 && t !== 27 && t !== 225 && t !== 15 && t !== 14 && t !== 24 } function Lze(e) { return N7(e.currentTokenSpan.end, e.currentTokenParent, e.sourceFile) } function kze(e) { return !br(e.contextNode) || !Vf(e.contextNode.expression) || e.contextNode.expression.getText().indexOf(".") !== -1 } var Dze = gt({ "src/services/formatting/rules.ts"() { "use strict"; Fr(), Vk() } }); function wze(e, t) { return { options: e, getRules: Rze(), host: t } } function Rze() { return xte === void 0 && (xte = Nze(PSe())), xte } function Oze(e) { let t = 0; return e & 1 && (t |= 28), e & 2 && (t |= 96), e & 28 && (t |= 28), e & 96 && (t |= 96), t } function Nze(e) { let t = Pze(e); return r => { let i = t[nxe(r.currentTokenSpan.kind, r.nextTokenSpan.kind)]; if (i) { let o = [], s = 0; for (let l of i) { let f = ~Oze(s); l.action & f && Ji(l.context, d => d(r)) && (o.push(l), s |= l.action) } if (o.length) return o } } } function Pze(e) { let t = new Array(UG * UG), r = new Array(t.length); for (let i of e) { let o = i.leftTokenRange.isSpecific && i.rightTokenRange.isSpecific; for (let s of i.leftTokenRange.tokens) for (let l of i.rightTokenRange.tokens) { let f = nxe(s, l), d = t[f]; d === void 0 && (d = t[f] = []), Mze(d, i.rule, o, r, f) } } return t } function nxe(e, t) { return L.assert(e <= 162 && t <= 162, "Must compute formatting context from tokens"), e * UG + t } function Mze(e, t, r, i, o) { let s = t.action & 3 ? r ? 0 : oC.StopRulesAny : t.context !== VP ? r ? oC.ContextRulesSpecific : oC.ContextRulesAny : r ? oC.NoContextRulesSpecific : oC.NoContextRulesAny, l = i[o] || 0; e.splice(Fze(l, s), 0, t), i[o] = Gze(l, s) } function Fze(e, t) { let r = 0; for (let i = 0; i <= t; i += hx)r += e & zP, e >>= hx; return r } function Gze(e, t) { let r = (e >> t & zP) + 1; return L.assert((r & zP) === r, "Adding more rules into the sub-bucket than allowed. Maximum allowed is 32 rules."), e & ~(zP << t) | r << t } var xte, hx, zP, UG, oC, Bze = gt({ "src/services/formatting/rulesMap.ts"() { "use strict"; Fr(), Vk(), hx = 5, zP = 31, UG = 163, oC = (e => (e[e.StopRulesSpecific = 0] = "StopRulesSpecific", e[e.StopRulesAny = hx * 1] = "StopRulesAny", e[e.ContextRulesSpecific = hx * 2] = "ContextRulesSpecific", e[e.ContextRulesAny = hx * 3] = "ContextRulesAny", e[e.NoContextRulesSpecific = hx * 4] = "NoContextRulesSpecific", e[e.NoContextRulesAny = hx * 5] = "NoContextRulesAny", e))(oC || {}) } }); function VG(e, t, r) { let i = { pos: e, end: t, kind: r }; return L.isDebugging && Object.defineProperty(i, "__debugKind", { get: () => L.formatSyntaxKind(r) }), i } function Uze(e, t, r) { let i = t.getLineAndCharacterOfPosition(e).line; if (i === 0) return []; let o = Bw(i, t); for (; Yp(t.text.charCodeAt(o));)o--; Wl(t.text.charCodeAt(o)) && o--; let s = { pos: Ky(i - 1, t), end: o + 1 }; return JP(s, t, r, 2) } function Vze(e, t, r) { let i = Ate(e, 26, t); return rxe(Cte(i), t, r, 3) } function jze(e, t, r) { let i = Ate(e, 18, t); if (!i) return []; let o = i.parent, s = Cte(o), l = { pos: Wf(s.getStart(t), t), end: e }; return JP(l, t, r, 4) } function Hze(e, t, r) { let i = Ate(e, 19, t); return rxe(Cte(i), t, r, 5) } function Wze(e, t) { let r = { pos: 0, end: e.text.length }; return JP(r, e, t, 0) } function zze(e, t, r, i) { let o = { pos: Wf(e, r), end: t }; return JP(o, r, i, 1) } function Ate(e, t, r) { let i = el(e, r); return i && i.kind === t && e === i.getEnd() ? i : void 0 } function Cte(e) { let t = e; for (; t && t.parent && t.parent.end === e.end && !Jze(t.parent, t);)t = t.parent; return t } function Jze(e, t) { switch (e.kind) { case 260: case 261: return Od(e.members, t); case 264: let r = e.body; return !!r && r.kind === 265 && Od(r.statements, t); case 308: case 238: case 265: return Od(e.statements, t); case 295: return Od(e.block.statements, t) }return !1 } function Kze(e, t) { return r(t); function r(i) { let o = pa(i, s => jX(s.getStart(t), s.end, e) && s); if (o) { let s = r(o); if (s) return s } return i } } function qze(e, t) { if (!e.length) return o; let r = e.filter(s => tk(t, s.start, s.start + s.length)).sort((s, l) => s.start - l.start); if (!r.length) return o; let i = 0; return s => { for (; ;) { if (i >= r.length) return !1; let l = r[i]; if (s.end <= l.start) return !1; if (l7(s.pos, s.end, l.start, l.start + l.length)) return !0; i++ } }; function o() { return !1 } } function Xze(e, t, r) { let i = e.getStart(r); if (i === t.pos && e.end === t.end) return i; let o = el(t.pos, r); return !o || o.end >= t.pos ? e.pos : o.end } function Yze(e, t, r) { let i = -1, o; for (; e;) { let s = r.getLineAndCharacterOfPosition(e.getStart(r)).line; if (i !== -1 && s !== i) break; if (X_.shouldIndentChildNode(t, e, o, r)) return t.indentSize; i = s, o = e, e = e.parent } return 0 } function $ze(e, t, r, i, o, s) { let l = { pos: e.pos, end: e.end }; return fte(t.text, r, l.pos, l.end, f => ixe(l, e, i, o, f, s, 1, d => !1, t)) } function rxe(e, t, r, i) { if (!e) return []; let o = { pos: Wf(e.getStart(t), t), end: e.end }; return JP(o, t, r, i) } function JP(e, t, r, i) { let o = Kze(e, t); return fte(t.text, t.languageVariant, Xze(o, e, t), e.end, s => ixe(e, o, X_.getIndentationForNode(o, e, t, r.options), Yze(o, r.options, t), s, r, i, qze(t.parseDiagnostics, e), t)) } function ixe(e, t, r, i, o, { options: s, getRules: l, host: f }, d, g, m) { var v; let S = new dte(m, d, s), x, A, w, C, P, F = -1, B = []; if (o.advance(), o.isOnToken()) { let Ne = m.getLineAndCharacterOfPosition(t.getStart(m)).line, Le = Ne; bf(t) && (Le = m.getLineAndCharacterOfPosition(aH(t, m)).line), ie(t, t, Ne, Le, r, i) } if (!o.isOnToken()) { let Ne = X_.nodeWillIndentChild(s, t, void 0, m, !1) ? r + s.indentSize : r, Le = o.getCurrentLeadingTrivia(); Le && ($(Le, Ne, !1, Ye => Z(Ye, m.getLineAndCharacterOfPosition(Ye.pos), t, t, void 0)), s.trimTrailingWhitespace !== !1 && we(Le)) } if (A && o.getStartPos() >= e.end) { let Ne = o.isOnEOF() ? o.readEOFTokenRange() : o.isOnToken() ? o.readTokenInfo(t).token : void 0; if (Ne && Ne.pos === x) { let Le = ((v = el(Ne.end, m, t)) == null ? void 0 : v.parent) || w; U(Ne, m.getLineAndCharacterOfPosition(Ne.pos).line, Le, A, C, w, Le, void 0) } } return B; function q(Ne, Le, Ye, _t, ct) { if (tk(_t, Ne, Le) || ON(_t, Ne, Le)) { if (ct !== -1) return ct } else { let Rt = m.getLineAndCharacterOfPosition(Ne).line, We = Wf(Ne, m), qe = X_.findFirstNonWhitespaceColumn(We, Ne, m, s); if (Rt !== Ye || Ne === qe) { let zt = X_.getBaseIndentation(s); return zt > qe ? zt : qe } } return -1 } function W(Ne, Le, Ye, _t, ct, Rt) { let We = X_.shouldIndentChildNode(s, Ne) ? s.indentSize : 0; return Rt === Le ? { indentation: Le === P ? F : ct.getIndentation(), delta: Math.min(s.indentSize, ct.getDelta(Ne) + We) } : Ye === -1 ? Ne.kind === 20 && Le === P ? { indentation: F, delta: ct.getDelta(Ne) } : X_.childStartsOnTheSameLineWithElseInIfStatement(_t, Ne, Le, m) || X_.childIsUnindentedBranchOfConditionalExpression(_t, Ne, Le, m) || X_.argumentStartsOnSameLineAsPreviousArgument(_t, Ne, Le, m) ? { indentation: ct.getIndentation(), delta: We } : { indentation: ct.getIndentation() + ct.getDelta(Ne), delta: We } : { indentation: Ye, delta: We } } function Y(Ne) { if (g_(Ne)) { let Le = wr(Ne.modifiers, Ha, Yc(Ne.modifiers, du)); if (Le) return Le.kind } switch (Ne.kind) { case 260: return 84; case 261: return 118; case 259: return 98; case 263: return 263; case 174: return 137; case 175: return 151; case 171: if (Ne.asteriskToken) return 41; case 169: case 166: let Le = sa(Ne); if (Le) return Le.kind } } function R(Ne, Le, Ye, _t) { return { getIndentationForComment: (We, qe, zt) => { switch (We) { case 19: case 23: case 21: return Ye + Rt(zt) }return qe !== -1 ? qe : Ye }, getIndentationForToken: (We, qe, zt, Qt) => !Qt && ct(We, qe, zt) ? Ye + Rt(zt) : Ye, getIndentation: () => Ye, getDelta: Rt, recomputeIndentation: (We, qe) => { X_.shouldIndentChildNode(s, qe, Ne, m) && (Ye += We ? s.indentSize : -s.indentSize, _t = X_.shouldIndentChildNode(s, Ne) ? s.indentSize : 0) } }; function ct(We, qe, zt) { switch (qe) { case 18: case 19: case 21: case 91: case 115: case 59: return !1; case 43: case 31: switch (zt.kind) { case 283: case 284: case 282: return !1 }break; case 22: case 23: if (zt.kind !== 197) return !1; break }return Le !== We && !(bf(Ne) && qe === Y(Ne)) } function Rt(We) { return X_.nodeWillIndentChild(s, Ne, We, m, !0) ? _t : 0 } } function ie(Ne, Le, Ye, _t, ct, Rt) { if (!tk(e, Ne.getStart(m), Ne.getEnd())) return; let We = R(Ne, Ye, ct, Rt), qe = Le; for (pa(Ne, kn => { zt(kn, -1, Ne, We, Ye, _t, !1) }, kn => { Qt(kn, Ne, Ye, We) }); o.isOnToken() && o.getStartPos() < e.end;) { let kn = o.readTokenInfo(Ne); if (kn.token.end > Math.min(Ne.end, e.end)) break; tn(kn, Ne, We, Ne) } function zt(kn, _n, Gt, $n, ui, Ni, Pi, gr) { if (L.assert(!ws(kn)), rc(kn) || Nse(Gt, kn)) return _n; let pt = kn.getStart(m), nn = m.getLineAndCharacterOfPosition(pt).line, Dt = nn; bf(kn) && (Dt = m.getLineAndCharacterOfPosition(aH(kn, m)).line); let pn = -1; if (Pi && Od(e, Gt) && (pn = q(pt, kn.end, ui, e, _n), pn !== -1 && (_n = pn)), !tk(e, kn.pos, kn.end)) return kn.end < e.pos && o.skipToEndOf(kn), _n; if (kn.getFullWidth() === 0) return _n; for (; o.isOnToken() && o.getStartPos() < e.end;) { let hi = o.readTokenInfo(Ne); if (hi.token.end > e.end) return _n; if (hi.token.end > pt) { hi.token.pos > pt && o.skipToStartOf(kn); break } tn(hi, Ne, $n, Ne) } if (!o.isOnToken() || o.getStartPos() >= e.end) return _n; if (Z1(kn)) { let hi = o.readTokenInfo(kn); if (kn.kind !== 11) return L.assert(hi.token.end === kn.end, "Token end is child end"), tn(hi, Ne, $n, kn), _n } let An = kn.kind === 167 ? nn : Ni, Kn = W(kn, nn, pn, Ne, $n, An); return ie(kn, qe, nn, Dt, Kn.indentation, Kn.delta), qe = Ne, gr && Gt.kind === 206 && _n === -1 && (_n = Kn.indentation), _n } function Qt(kn, _n, Gt, $n) { L.assert(C0(kn)), L.assert(!ws(kn)); let ui = Qze(_n, kn), Ni = $n, Pi = Gt; if (!tk(e, kn.pos, kn.end)) { kn.end < e.pos && o.skipToEndOf(kn); return } if (ui !== 0) for (; o.isOnToken() && o.getStartPos() < e.end;) { let nn = o.readTokenInfo(_n); if (nn.token.end > kn.pos) break; if (nn.token.kind === ui) { Pi = m.getLineAndCharacterOfPosition(nn.token.pos).line, tn(nn, _n, $n, _n); let Dt; if (F !== -1) Dt = F; else { let pn = Wf(nn.token.pos, m); Dt = X_.findFirstNonWhitespaceColumn(pn, nn.token.pos, m, s) } Ni = R(_n, Gt, Dt, s.indentSize) } else tn(nn, _n, $n, _n) } let gr = -1; for (let nn = 0; nn < kn.length; nn++) { let Dt = kn[nn]; gr = zt(Dt, gr, Ne, Ni, Pi, Pi, !0, nn === 0) } let pt = Zze(ui); if (pt !== 0 && o.isOnToken() && o.getStartPos() < e.end) { let nn = o.readTokenInfo(_n); nn.token.kind === 27 && (tn(nn, _n, Ni, _n), nn = o.isOnToken() ? o.readTokenInfo(_n) : void 0), nn && nn.token.kind === pt && Od(_n, nn.token) && tn(nn, _n, Ni, _n, !0) } } function tn(kn, _n, Gt, $n, ui) { L.assert(Od(_n, kn.token)); let Ni = o.lastTrailingTriviaWasNewLine(), Pi = !1; kn.leadingTrivia && fe(kn.leadingTrivia, _n, qe, Gt); let gr = 0, pt = Od(e, kn.token), nn = m.getLineAndCharacterOfPosition(kn.token.pos); if (pt) { let Dt = g(kn.token), pn = A; if (gr = Z(kn.token, nn, _n, qe, Gt), !Dt) if (gr === 0) { let An = pn && m.getLineAndCharacterOfPosition(pn.end).line; Pi = Ni && nn.line !== An } else Pi = gr === 1 } if (kn.trailingTrivia && (x = To(kn.trailingTrivia).end, fe(kn.trailingTrivia, _n, qe, Gt)), Pi) { let Dt = pt && !g(kn.token) ? Gt.getIndentationForToken(nn.line, kn.token.kind, $n, !!ui) : -1, pn = !0; if (kn.leadingTrivia) { let An = Gt.getIndentationForComment(kn.token.kind, Dt, $n); pn = $(kn.leadingTrivia, An, pn, Kn => re(Kn.pos, An, !1)) } Dt !== -1 && pn && (re(kn.token.pos, Dt, gr === 1), P = nn.line, F = Dt) } o.advance(), qe = _n } } function $(Ne, Le, Ye, _t) { for (let ct of Ne) { let Rt = Od(e, ct); switch (ct.kind) { case 3: Rt && ge(ct, Le, !Ye), Ye = !1; break; case 2: Ye && Rt && _t(ct), Ye = !1; break; case 4: Ye = !0; break } } return Ye } function fe(Ne, Le, Ye, _t) { for (let ct of Ne) if (g7(ct.kind) && Od(e, ct)) { let Rt = m.getLineAndCharacterOfPosition(ct.pos); Z(ct, Rt, Le, Ye, _t) } } function Z(Ne, Le, Ye, _t, ct) { let Rt = g(Ne), We = 0; if (!Rt) if (A) We = U(Ne, Le.line, Ye, A, C, w, _t, ct); else { let qe = m.getLineAndCharacterOfPosition(e.pos); X(qe.line, Le.line) } return A = Ne, x = Ne.end, w = Ye, C = Le.line, We } function U(Ne, Le, Ye, _t, ct, Rt, We, qe) { S.updateContext(_t, Rt, Ne, Ye, We); let zt = l(S), Qt = S.options.trimTrailingWhitespace !== !1, tn = 0; return zt ? sae(zt, kn => { if (tn = Be(kn, _t, ct, Ne, Le), qe) switch (tn) { case 2: Ye.getStart(m) === Ne.pos && qe.recomputeIndentation(!1, We); break; case 1: Ye.getStart(m) === Ne.pos && qe.recomputeIndentation(!0, We); break; default: L.assert(tn === 0) }Qt = Qt && !(kn.action & 16) && kn.flags !== 1 }) : Qt = Qt && Ne.kind !== 1, Le !== ct && Qt && X(ct, Le, _t), tn } function re(Ne, Le, Ye) { let _t = Ite(Le, s); if (Ye) Ce(Ne, 0, _t); else { let ct = m.getLineAndCharacterOfPosition(Ne), Rt = Ky(ct.line, m); (Le !== le(Rt, ct.character) || _e(_t, Rt)) && Ce(Rt, ct.character, _t) } } function le(Ne, Le) { let Ye = 0; for (let _t = 0; _t < Le; _t++)m.text.charCodeAt(Ne + _t) === 9 ? Ye += s.tabSize - Ye % s.tabSize : Ye++; return Ye } function _e(Ne, Le) { return Ne !== m.text.substr(Le, Ne.length) } function ge(Ne, Le, Ye, _t = !0) { let ct = m.getLineAndCharacterOfPosition(Ne.pos).line, Rt = m.getLineAndCharacterOfPosition(Ne.end).line; if (ct === Rt) { Ye || re(Ne.pos, Le, !1); return } let We = [], qe = Ne.pos; for (let _n = ct; _n < Rt; _n++) { let Gt = Bw(_n, m); We.push({ pos: qe, end: Gt }), qe = Ky(_n + 1, m) } if (_t && We.push({ pos: qe, end: Ne.end }), We.length === 0) return; let zt = Ky(ct, m), Qt = X_.findFirstNonWhitespaceCharacterAndColumn(zt, We[0].pos, m, s), tn = 0; Ye && (tn = 1, ct++); let kn = Le - Qt.column; for (let _n = tn; _n < We.length; _n++, ct++) { let Gt = Ky(ct, m), $n = _n === 0 ? Qt : X_.findFirstNonWhitespaceCharacterAndColumn(We[_n].pos, We[_n].end, m, s), ui = $n.column + kn; if (ui > 0) { let Ni = Ite(ui, s); Ce(Gt, $n.character, Ni) } else Pe(Gt, $n.character) } } function X(Ne, Le, Ye) { for (let _t = Ne; _t < Le; _t++) { let ct = Ky(_t, m), Rt = Bw(_t, m); if (Ye && (g7(Ye.kind) || QX(Ye.kind)) && Ye.pos <= Rt && Ye.end > Rt) continue; let We = Ve(ct, Rt); We !== -1 && (L.assert(We === ct || !Yp(m.text.charCodeAt(We - 1))), Pe(We, Rt + 1 - We)) } } function Ve(Ne, Le) { let Ye = Le; for (; Ye >= Ne && Yp(m.text.charCodeAt(Ye));)Ye--; return Ye !== Le ? Ye + 1 : -1 } function we(Ne) { let Le = A ? A.end : e.pos; for (let Ye of Ne) g7(Ye.kind) && (Le < Ye.pos && ke(Le, Ye.pos - 1, A), Le = Ye.end + 1); Le < e.end && ke(Le, e.end, A) } function ke(Ne, Le, Ye) { let _t = m.getLineAndCharacterOfPosition(Ne).line, ct = m.getLineAndCharacterOfPosition(Le).line; X(_t, ct + 1, Ye) } function Pe(Ne, Le) { Le && B.push(v7(Ne, Le, "")) } function Ce(Ne, Le, Ye) { (Le || Ye) && B.push(v7(Ne, Le, Ye)) } function Ie(Ne, Le) { Le && B.push(v7(Ne, 0, Le)) } function Be(Ne, Le, Ye, _t, ct) { let Rt = ct !== Ye; switch (Ne.action) { case 1: return 0; case 16: if (Le.end !== _t.pos) return Pe(Le.end, _t.pos - Le.end), Rt ? 2 : 0; break; case 32: Pe(Le.pos, Le.end - Le.pos); break; case 8: if (Ne.flags !== 1 && Ye !== ct) return 0; if (ct - Ye !== 1) return Ce(Le.end, _t.pos - Le.end, bb(f, s)), Rt ? 0 : 1; break; case 4: if (Ne.flags !== 1 && Ye !== ct) return 0; if (_t.pos - Le.end !== 1 || m.text.charCodeAt(Le.end) !== 32) return Ce(Le.end, _t.pos - Le.end, " "), Rt ? 2 : 0; break; case 64: Ie(Le.end, ";") }return 0 } } function axe(e, t, r, i = Vi(e, t)) { let o = jn(i, dm); if (o && (i = o.parent), i.getStart(e) <= t && t < i.getEnd()) return; r = r === null ? void 0 : r === void 0 ? el(t, e) : r; let l = r && eb(e.text, r.end), f = bH(i, e), d = Qi(l, f); return d && wr(d, g => RN(g, t) || t === g.end && (g.kind === 2 || t === e.getFullWidth())) } function Qze(e, t) { switch (e.kind) { case 173: case 259: case 215: case 171: case 170: case 216: case 176: case 177: case 181: case 182: case 174: case 175: if (e.typeParameters === t) return 29; if (e.parameters === t) return 20; break; case 210: case 211: if (e.typeArguments === t) return 29; if (e.arguments === t) return 20; break; case 260: case 228: case 261: case 262: if (e.typeParameters === t) return 29; break; case 180: case 212: case 183: case 230: case 202: if (e.typeArguments === t) return 29; break; case 184: return 18 }return 0 } function Zze(e) { switch (e) { case 20: return 21; case 29: return 31; case 18: return 19 }return 0 } function Ite(e, t) { if ((!jG || jG.tabSize !== t.tabSize || jG.indentSize !== t.indentSize) && (jG = { tabSize: t.tabSize, indentSize: t.indentSize }, Bk = Uk = void 0), t.convertTabsToSpaces) { let i, o = Math.floor(e / t.indentSize), s = e % t.indentSize; return Uk || (Uk = []), Uk[o] === void 0 ? (i = UN(" ", t.indentSize * o), Uk[o] = i) : i = Uk[o], s ? i + UN(" ", s) : i } else { let i = Math.floor(e / t.tabSize), o = e - i * t.tabSize, s; return Bk || (Bk = []), Bk[i] === void 0 ? Bk[i] = s = UN("	", i) : s = Bk[i], o ? s + UN(" ", o) : s } } var jG, Bk, Uk, eJe = gt({ "src/services/formatting/formatting.ts"() { "use strict"; Fr(), Vk() } }), X_, tJe = gt({ "src/services/formatting/smartIndenter.ts"() { "use strict"; Fr(), Vk(), (e => { let t; (X => { X[X.Unknown = -1] = "Unknown" })(t || (t = {})); function r(X, Ve, we, ke = !1) { if (X > Ve.text.length) return f(we); if (we.indentStyle === 0) return 0; let Pe = el(X, Ve, void 0, !0), Ce = axe(Ve, X, Pe || null); if (Ce && Ce.kind === 3) return i(Ve, X, we, Ce); if (!Pe) return f(we); if (QX(Pe.kind) && Pe.getStart(Ve) <= X && X < Pe.end) return 0; let Be = Ve.getLineAndCharacterOfPosition(X).line, Ne = Vi(Ve, X), Le = Ne.kind === 18 && Ne.parent.kind === 207; if (we.indentStyle === 1 || Le) return o(Ve, X, we); if (Pe.kind === 27 && Pe.parent.kind !== 223) { let _t = m(Pe, Ve, we); if (_t !== -1) return _t } let Ye = q(X, Pe.parent, Ve); if (Ye && !Od(Ye, Pe)) { let ct = [215, 216].indexOf(Ne.parent.kind) !== -1 ? 0 : we.indentSize; return R(Ye, Ve, we) + ct } return s(Ve, X, Pe, Be, ke, we) } e.getIndentation = r; function i(X, Ve, we, ke) { let Pe = Gs(X, Ve).line - 1, Ce = Gs(X, ke.pos).line; if (L.assert(Ce >= 0), Pe <= Ce) return U(Ky(Ce, X), Ve, X, we); let Ie = Ky(Pe, X), { column: Be, character: Ne } = Z(Ie, Ve, X, we); return Be === 0 ? Be : X.text.charCodeAt(Ie + Ne) === 42 ? Be - 1 : Be } function o(X, Ve, we) { let ke = Ve; for (; ke > 0;) { let Ce = X.text.charCodeAt(ke); if (!xh(Ce)) break; ke-- } let Pe = Wf(ke, X); return U(Pe, ke, X, we) } function s(X, Ve, we, ke, Pe, Ce) { let Ie, Be = we; for (; Be;) { if (WX(Be, Ve, X) && _e(Ce, Be, Ie, X, !0)) { let Le = A(Be, X), Ye = x(we, Be, ke, X), _t = Ye !== 0 ? Pe && Ye === 2 ? Ce.indentSize : 0 : ke !== Le.line ? Ce.indentSize : 0; return d(Be, Le, void 0, _t, X, !0, Ce) } let Ne = ie(Be, X, Ce, !0); if (Ne !== -1) return Ne; Ie = Be, Be = Be.parent } return f(Ce) } function l(X, Ve, we, ke) { let Pe = we.getLineAndCharacterOfPosition(X.getStart(we)); return d(X, Pe, Ve, 0, we, !1, ke) } e.getIndentationForNode = l; function f(X) { return X.baseIndentSize || 0 } e.getBaseIndentation = f; function d(X, Ve, we, ke, Pe, Ce, Ie) { var Be; let Ne = X.parent; for (; Ne;) { let Le = !0; if (we) { let Rt = X.getStart(Pe); Le = Rt < we.pos || Rt > we.end } let Ye = g(Ne, X, Pe), _t = Ye.line === Ve.line || C(Ne, X, Ve.line, Pe); if (Le) { let Rt = (Be = B(X, Pe)) == null ? void 0 : Be[0], We = !!Rt && A(Rt, Pe).line > Ye.line, qe = ie(X, Pe, Ie, We); if (qe !== -1 || (qe = v(X, Ne, Ve, _t, Pe, Ie), qe !== -1)) return qe + ke } _e(Ie, Ne, X, Pe, Ce) && !_t && (ke += Ie.indentSize); let ct = w(Ne, X, Ve.line, Pe); X = Ne, Ne = X.parent, Ve = ct ? Pe.getLineAndCharacterOfPosition(X.getStart(Pe)) : Ye } return ke + f(Ie) } function g(X, Ve, we) { let ke = B(Ve, we), Pe = ke ? ke.pos : X.getStart(we); return we.getLineAndCharacterOfPosition(Pe) } function m(X, Ve, we) { let ke = Ehe(X); return ke && ke.listItemIndex > 0 ? $(ke.list.getChildren(), ke.listItemIndex - 1, Ve, we) : -1 } function v(X, Ve, we, ke, Pe, Ce) { return (Kl(X) || Nw(X)) && (Ve.kind === 308 || !ke) ? fe(we, Pe, Ce) : -1 } let S; (X => { X[X.Unknown = 0] = "Unknown", X[X.OpenBrace = 1] = "OpenBrace", X[X.CloseBrace = 2] = "CloseBrace" })(S || (S = {})); function x(X, Ve, we, ke) { let Pe = t1(X, Ve, ke); if (!Pe) return 0; if (Pe.kind === 18) return 1; if (Pe.kind === 19) { let Ce = A(Pe, ke).line; return we === Ce ? 2 : 0 } return 0 } function A(X, Ve) { return Ve.getLineAndCharacterOfPosition(X.getStart(Ve)) } function w(X, Ve, we, ke) { if (!(Pa(X) && ya(X.arguments, Ve))) return !1; let Pe = X.expression.getEnd(); return Gs(ke, Pe).line === we } e.isArgumentAndStartLineOverlapsExpressionBeingCalled = w; function C(X, Ve, we, ke) { if (X.kind === 242 && X.elseStatement === Ve) { let Pe = Yo(X, 91, ke); return L.assert(Pe !== void 0), A(Pe, ke).line === we } return !1 } e.childStartsOnTheSameLineWithElseInIfStatement = C; function P(X, Ve, we, ke) { if (b2(X) && (Ve === X.whenTrue || Ve === X.whenFalse)) { let Pe = Gs(ke, X.condition.end).line; if (Ve === X.whenTrue) return we === Pe; { let Ce = A(X.whenTrue, ke).line, Ie = Gs(ke, X.whenTrue.end).line; return Pe === Ce && Ie === we } } return !1 } e.childIsUnindentedBranchOfConditionalExpression = P; function F(X, Ve, we, ke) { if (Ih(X)) { if (!X.arguments) return !1; let Pe = wr(X.arguments, Ne => Ne.pos === Ve.pos); if (!Pe) return !1; let Ce = X.arguments.indexOf(Pe); if (Ce === 0) return !1; let Ie = X.arguments[Ce - 1], Be = Gs(ke, Ie.getEnd()).line; if (we === Be) return !0 } return !1 } e.argumentStartsOnSameLineAsPreviousArgument = F; function B(X, Ve) { return X.parent && W(X.getStart(Ve), X.getEnd(), X.parent, Ve) } e.getContainingList = B; function q(X, Ve, we) { return Ve && W(X, X, Ve, we) } function W(X, Ve, we, ke) { switch (we.kind) { case 180: return Pe(we.typeArguments); case 207: return Pe(we.properties); case 206: return Pe(we.elements); case 184: return Pe(we.members); case 259: case 215: case 216: case 171: case 170: case 176: case 173: case 182: case 177: return Pe(we.typeParameters) || Pe(we.parameters); case 174: return Pe(we.parameters); case 260: case 228: case 261: case 262: case 348: return Pe(we.typeParameters); case 211: case 210: return Pe(we.typeArguments) || Pe(we.arguments); case 258: return Pe(we.declarations); case 272: case 276: return Pe(we.elements); case 203: case 204: return Pe(we.elements) }function Pe(Ce) { return Ce && ON(Y(we, Ce, ke), X, Ve) ? Ce : void 0 } } function Y(X, Ve, we) { let ke = X.getChildren(we); for (let Pe = 1; Pe < ke.length - 1; Pe++)if (ke[Pe].pos === Ve.pos && ke[Pe].end === Ve.end) return { pos: ke[Pe - 1].end, end: ke[Pe + 1].getStart(we) }; return Ve } function R(X, Ve, we) { return X ? fe(Ve.getLineAndCharacterOfPosition(X.pos), Ve, we) : -1 } function ie(X, Ve, we, ke) { if (X.parent && X.parent.kind === 258) return -1; let Pe = B(X, Ve); if (Pe) { let Ce = Pe.indexOf(X); if (Ce !== -1) { let Ie = $(Pe, Ce, Ve, we); if (Ie !== -1) return Ie } return R(Pe, Ve, we) + (ke ? we.indentSize : 0) } return -1 } function $(X, Ve, we, ke) { L.assert(Ve >= 0 && Ve < X.length); let Pe = X[Ve], Ce = A(Pe, we); for (let Ie = Ve - 1; Ie >= 0; Ie--) { if (X[Ie].kind === 27) continue; if (we.getLineAndCharacterOfPosition(X[Ie].end).line !== Ce.line) return fe(Ce, we, ke); Ce = A(X[Ie], we) } return -1 } function fe(X, Ve, we) { let ke = Ve.getPositionOfLineAndCharacter(X.line, 0); return U(ke, ke + X.character, Ve, we) } function Z(X, Ve, we, ke) { let Pe = 0, Ce = 0; for (let Ie = X; Ie < Ve; Ie++) { let Be = we.text.charCodeAt(Ie); if (!Yp(Be)) break; Be === 9 ? Ce += ke.tabSize + Ce % ke.tabSize : Ce++, Pe++ } return { column: Ce, character: Pe } } e.findFirstNonWhitespaceCharacterAndColumn = Z; function U(X, Ve, we, ke) { return Z(X, Ve, we, ke).column } e.findFirstNonWhitespaceColumn = U; function re(X, Ve, we, ke, Pe) { let Ce = we ? we.kind : 0; switch (Ve.kind) { case 241: case 260: case 228: case 261: case 263: case 262: case 206: case 238: case 265: case 207: case 184: case 197: case 186: case 266: case 293: case 292: case 214: case 208: case 210: case 211: case 240: case 274: case 250: case 224: case 204: case 203: case 283: case 286: case 282: case 291: case 170: case 176: case 177: case 166: case 181: case 182: case 193: case 212: case 220: case 276: case 272: case 278: case 273: case 169: return !0; case 257: case 299: case 223: if (!X.indentMultiLineObjectLiteralBeginningOnBlankLine && ke && Ce === 207) return ge(ke, we); if (Ve.kind === 223 && ke && we && Ce === 281) { let Ie = ke.getLineAndCharacterOfPosition(xo(ke.text, Ve.pos)).line, Be = ke.getLineAndCharacterOfPosition(xo(ke.text, we.pos)).line; return Ie !== Be } if (Ve.kind !== 223) return !0; break; case 243: case 244: case 246: case 247: case 245: case 242: case 259: case 215: case 171: case 173: case 174: case 175: return Ce !== 238; case 216: return ke && Ce === 214 ? ge(ke, we) : Ce !== 238; case 275: return Ce !== 276; case 269: return Ce !== 270 || !!we.namedBindings && we.namedBindings.kind !== 272; case 281: return Ce !== 284; case 285: return Ce !== 287; case 190: case 189: if (Ce === 184 || Ce === 186) return !1; break }return Pe } e.nodeWillIndentChild = re; function le(X, Ve) { switch (X) { case 250: case 254: case 248: case 249: return Ve.kind !== 238; default: return !1 } } function _e(X, Ve, we, ke, Pe = !1) { return re(X, Ve, we, ke, !1) && !(Pe && we && le(we.kind, Ve)) } e.shouldIndentChildNode = _e; function ge(X, Ve) { let we = xo(X.text, Ve.pos), ke = X.getLineAndCharacterOfPosition(we).line, Pe = X.getLineAndCharacterOfPosition(Ve.end).line; return ke === Pe } })(X_ || (X_ = {})) } }), tl = {}; Mo(tl, { FormattingContext: () => dte, FormattingRequestKind: () => ute, RuleAction: () => _te, RuleFlags: () => pte, SmartIndenter: () => X_, anyContext: () => VP, createTextRangeWithKind: () => VG, formatDocument: () => Wze, formatNodeGivenIndentation: () => $ze, formatOnClosingCurly: () => Hze, formatOnEnter: () => Uze, formatOnOpeningCurly: () => jze, formatOnSemicolon: () => Vze, formatSelection: () => zze, getAllRules: () => PSe, getFormatContext: () => wze, getFormattingScanner: () => fte, getIndentationString: () => Ite, getRangeOfEnclosingComment: () => axe }); var Vk = gt({ "src/services/_namespaces/ts.formatting.ts"() { "use strict"; eze(), tze(), nze(), Dze(), Bze(), eJe(), tJe() } }), Fr = gt({ "src/services/_namespaces/ts.ts"() { "use strict"; fa(), r7(), v6e(), K6e(), $6e(), l4e(), u4e(), d4e(), y4e(), L4e(), k4e(), w4e(), B4e(), V4e(), _3e(), m3e(), y3e(), E3e(), V3e(), Q3e(), Qa(), QZ(), KTe(), cUe(), _Ue(), wUe(), lye(), wye(), $Ue(), aVe(), Qm(), rWe(), kWe(), FWe(), UWe(), ZWe(), Vk() } }); function nJe() { return kte ?? (kte = new r_(Rf)) } function oxe(e, t, r, i, o) { let s = t ? "DeprecationError: " : "DeprecationWarning: "; return s += `'${e}' `, s += i ? `has been deprecated since v${i}` : "is deprecated", s += t ? " and can no longer be used." : r ? ` and will no longer be usable after v${r}.` : ".", s += o ? ` ${jm(o, [e], 0)}` : "", s } function rJe(e, t, r, i) { let o = oxe(e, !0, t, r, i); return () => { throw new TypeError(o) } } function iJe(e, t, r, i) { let o = !1; return () => { sxe && !o && (L.log.warn(oxe(e, !1, t, r, i)), o = !0) } } function aJe(e, t = {}) { var r, i; let o = typeof t.typeScriptVersion == "string" ? new r_(t.typeScriptVersion) : (r = t.typeScriptVersion) != null ? r : nJe(), s = typeof t.errorAfter == "string" ? new r_(t.errorAfter) : t.errorAfter, l = typeof t.warnAfter == "string" ? new r_(t.warnAfter) : t.warnAfter, f = typeof t.since == "string" ? new r_(t.since) : (i = t.since) != null ? i : l, d = t.error || s && o.compareTo(s) >= 0, g = !l || o.compareTo(l) >= 0; return d ? rJe(e, s, f, t.message) : g ? iJe(e, s, f, t.message) : Ba } function oJe(e, t) { return function () { return e(), t.apply(this, arguments) } } function Lte(e, t) { var r; let i = aJe((r = t?.name) != null ? r : L.getFunctionName(e), t); return oJe(i, e) } var sxe, kte, cxe = gt({ "src/deprecatedCompat/deprecate.ts"() { "use strict"; HG(), sxe = !0 } }); function Dte(e, t, r, i) { if (Object.defineProperty(s, "name", { ...Object.getOwnPropertyDescriptor(s, "name"), value: e }), i) for (let l of Object.keys(i)) { let f = +l; !isNaN(f) && fs(t, `${f}`) && (t[f] = Lte(t[f], { ...i[f], name: e })) } let o = sJe(t, r); return s; function s(...l) { let f = o(l), d = f !== void 0 ? t[f] : void 0; if (typeof d == "function") return d(...l); throw new TypeError("Invalid arguments") } } function sJe(e, t) { return r => { for (let i = 0; fs(e, `${i}`) && fs(t, `${i}`); i++) { let o = t[i]; if (o(r)) return i } } } function cJe(e) { return { overload: t => ({ bind: r => ({ finish: () => Dte(e, t, r), deprecate: i => ({ finish: () => Dte(e, t, r, i) }) }) }) } } var lJe = gt({ "src/deprecatedCompat/deprecations.ts"() { "use strict"; HG(), cxe() } }), uJe = gt({ "src/deprecatedCompat/5.0/identifierProperties.ts"() { "use strict"; HG(), cxe(), fle(e => { let t = e.getIdentifierConstructor(); fs(t.prototype, "originalKeywordKind") || Object.defineProperty(t.prototype, "originalKeywordKind", { get: Lte(function () { return nb(this) }, { name: "originalKeywordKind", since: "5.0", warnAfter: "5.1", errorAfter: "5.2", message: "Use 'identifierToKeywordKind(identifier)' instead." }) }), fs(t.prototype, "isInJSDocNamespace") || Object.defineProperty(t.prototype, "isInJSDocNamespace", { get: Lte(function () { return this.flags & 2048 ? !0 : void 0 }, { name: "isInJSDocNamespace", since: "5.0", warnAfter: "5.1", errorAfter: "5.2", message: "Use '.parent' or the surrounding context to determine this instead." }) }) }) } }), HG = gt({ "src/deprecatedCompat/_namespaces/ts.ts"() { "use strict"; fa(), lJe(), uJe() } }), lxe = {}; Mo(lxe, { ANONYMOUS: () => X7, AccessFlags: () => IV, AssertionLevel: () => $U, AssignmentDeclarationKind: () => PV, AssignmentKind: () => YW, Associativity: () => QW, BreakpointResolver: () => x$, BuilderFileEmit: () => Iq, BuilderProgramKind: () => Lq, BuilderState: () => pm, BundleFileSectionKind: () => ej, CallHierarchy: () => rx, CharacterCodes: () => KV, CheckFlags: () => TV, CheckMode: () => _F, ClassificationType: () => OX, ClassificationTypeNames: () => RX, CommentDirectiveType: () => oV, Comparison: () => LU, CompletionInfoFlags: () => AX, CompletionTriggerKind: () => bX, Completions: () => lx, ConfigFileProgramReloadLevel: () => QK, ContextFlags: () => _V, CoreServicesShimHostAdapter: () => S$, Debug: () => L, DiagnosticCategory: () => nw, Diagnostics: () => _, DocumentHighlights: () => Q7, ElementFlags: () => CV, EmitFlags: () => U8, EmitHint: () => $V, EmitOnly: () => cV, EndOfLineState: () => LX, EnumKind: () => EV, ExitStatus: () => uV, ExportKind: () => GY, Extension: () => qV, ExternalEmitHelpers: () => YV, FileIncludeKind: () => R8, FilePreprocessingDiagnosticsKind: () => sV, FileSystemEntryKind: () => oj, FileWatcherEventKind: () => ij, FindAllReferences: () => js, FlattenLevel: () => RK, FlowFlags: () => tw, ForegroundColorEscapeSequences: () => pq, FunctionFlags: () => $W, GeneratedIdentifierFlags: () => w8, GetLiteralTextFlags: () => KW, GoToDefinition: () => xk, HighlightSpanKind: () => TX, ImportKind: () => FY, ImportsNotUsedAsValues: () => VV, IndentStyle: () => SX, IndexKind: () => DV, InferenceFlags: () => OV, InferencePriority: () => RV, InlayHintKind: () => EX, InlayHints: () => fee, InternalEmitFlags: () => XV, InternalSymbolName: () => SV, InvalidatedProjectKind: () => aX, JsDoc: () => xb, JsTyping: () => QT, JsxEmit: () => UV, JsxFlags: () => iV, JsxReferenceKind: () => LV, LanguageServiceMode: () => gX, LanguageServiceShimHostAdapter: () => T$, LanguageVariant: () => zV, LexicalEnvironmentFlags: () => ZV, ListFormat: () => tj, LogLevel: () => ZU, MemberOverrideStatus: () => dV, ModifierFlags: () => k8, ModuleDetectionKind: () => MV, ModuleInstanceState: () => sK, ModuleKind: () => F8, ModuleResolutionKind: () => rw, ModuleSpecifierEnding: () => lz, NavigateTo: () => cye, NavigationBar: () => Dye, NewLineKind: () => jV, NodeBuilderFlags: () => pV, NodeCheckFlags: () => xV, NodeFactoryFlags: () => mz, NodeFlags: () => L8, NodeResolutionFeatures: () => aK, ObjectFlags: () => P8, OperationCanceledException: () => tI, OperatorPrecedence: () => ZW, OrganizeImports: () => b_, OrganizeImportsMode: () => vX, OuterExpressionKinds: () => QV, OutliningElementsCollector: () => See, OutliningSpanKind: () => CX, OutputFileType: () => IX, PackageJsonAutoImportPreference: () => hX, PackageJsonDependencyGroup: () => mX, PatternMatchKind: () => n5, PollingInterval: () => V8, PollingWatchKind: () => BV, PragmaKindFlags: () => nj, PrivateIdentifierKind: () => Az, ProcessLevel: () => MK, QuotePreference: () => OY, RelationComparisonResult: () => D8, Rename: () => RG, ScriptElementKind: () => DX, ScriptElementKindModifier: () => wX, ScriptKind: () => HV, ScriptSnapshot: () => pX, ScriptTarget: () => WV, SemanticClassificationFormat: () => yX, SemanticMeaning: () => RY, SemicolonPreference: () => xX, SignatureCheckMode: () => pF, SignatureFlags: () => M8, SignatureHelp: () => BP, SignatureKind: () => kV, SmartSelectionRange: () => ete, SnippetKind: () => B8, SortKind: () => XU, StructureIsReused: () => lV, SymbolAccessibility: () => gV, SymbolDisplay: () => $g, SymbolDisplayPartKind: () => IN, SymbolFlags: () => O8, SymbolFormatFlags: () => hV, SyntaxKind: () => I8, SyntheticSymbolKind: () => yV, Ternary: () => NV, ThrottledCancellationToken: () => g$, TokenClass: () => kX, TokenFlags: () => aV, TransformFlags: () => G8, TypeFacts: () => dF, TypeFlags: () => N8, TypeFormatFlags: () => mV, TypeMapKind: () => wV, TypePredicateKind: () => vV, TypeReferenceSerializationKind: () => bV, TypeScriptServicesFactory: () => eve, UnionReduction: () => fV, UpToDateStatusType: () => Wq, VarianceFlags: () => AV, Version: () => r_, VersionRange: () => mA, WatchDirectoryFlags: () => JV, WatchDirectoryKind: () => GV, WatchFileKind: () => FV, WatchLogLevel: () => ZK, WatchType: () => Hf, accessPrivateIdentifier: () => $_e, addEmitFlags: () => bp, addEmitHelper: () => xS, addEmitHelpers: () => Bg, addInternalEmitFlags: () => SS, addNodeFactoryPatcher: () => ARe, addObjectAllocatorPatcher: () => fle, addRange: () => si, addRelatedInfo: () => Ao, addSyntheticLeadingComment: () => nO, addSyntheticTrailingComment: () => R4, addToSeen: () => V_, advancedAsyncSuperHelper: () => sO, affectsDeclarationPathOptionDeclarations: () => FJ, affectsEmitOptionDeclarations: () => MJ, allKeysStartWithDot: () => nF, altDirectorySeparator: () => pw, and: () => g8, append: () => Sn, appendIfUnique: () => xg, arrayFrom: () => lo, arrayIsEqualTo: () => up, arrayIsHomogeneous: () => Fle, arrayIsSorted: () => dae, arrayOf: () => mae, arrayReverseIterator: () => Cke, arrayToMap: () => p0, arrayToMultiMap: () => KD, arrayToNumericMap: () => gae, arraysEqual: () => GD, assertType: () => Pke, assign: () => JD, assignHelper: () => B4, asyncDelegator: () => V4, asyncGeneratorHelper: () => U4, asyncSuperHelper: () => oO, asyncValues: () => j4, attachFileToDiagnostics: () => vS, awaitHelper: () => AS, awaiterHelper: () => W4, base64decode: () => nle, base64encode: () => tle, binarySearch: () => Py, binarySearchKey: () => j1, bindSourceFile: () => c_e, breakIntoCharacterSpans: () => Hge, breakIntoWordSpans: () => Wge, buildLinkParts: () => Qhe, buildOpts: () => j3, buildOverload: () => cJe, bundlerModuleNameResolver: () => Wfe, canBeConvertedToAsync: () => e$, canHaveDecorators: () => HS, canHaveExportModifier: () => WR, canHaveFlowNode: () => cR, canHaveIllegalDecorators: () => aJ, canHaveIllegalModifiers: () => cde, canHaveIllegalType: () => mOe, canHaveIllegalTypeParameters: () => sde, canHaveJSDoc: () => lR, canHaveLocals: () => Qp, canHaveModifiers: () => g_, canHaveSymbol: () => $p, canJsonReportNoInputFiles: () => FO, canProduceDiagnostics: () => xF, canUsePropertyAccess: () => HW, canWatchDirectoryOrFile: () => vN, cartesianProduct: () => Rae, cast: () => Ga, chainBundle: () => y_, chainDiagnosticMessages: () => da, changeAnyExtension: () => uj, changeCompilerHostLikeToUseCache: () => pN, changeExtension: () => V0, changesAffectModuleResolution: () => eH, changesAffectingProgramStructure: () => Ise, childIsDecorated: () => kI, classElementOrClassElementParameterIsDecorated: () => AH, classOrConstructorParameterIsDecorated: () => O0, classPrivateFieldGetHelper: () => n3, classPrivateFieldInHelper: () => i3, classPrivateFieldSetHelper: () => r3, classicNameResolver: () => o_e, classifier: () => T5, cleanExtendedConfigCache: () => $K, clear: () => Om, clearMap: () => Tf, clearSharedExtendedConfigFileWatcher: () => Fpe, climbPastPropertyAccess: () => o7, climbPastPropertyOrElementAccess: () => ghe, clone: () => VU, cloneCompilerOptions: () => Mhe, closeFileWatcher: () => am, closeFileWatcherOf: () => _m, codefix: () => gu, collapseTextChangeRangesAcrossMultipleVersions: () => GDe, collectExternalModuleInfo: () => xK, combine: () => _A, combinePaths: () => vi, commentPragmas: () => iw, commonOptionsWithBuild: () => WO, commonPackageFolders: () => nz, compact: () => WD, compareBooleans: () => g0, compareDataObjects: () => gW, compareDiagnostics: () => ZI, compareDiagnosticsSkipRelatedInformation: () => c4, compareEmitHelpers: () => Sue, compareNumberOfDirectorySeparators: () => BR, comparePaths: () => cT, comparePathsCaseInsensitive: () => LDe, comparePathsCaseSensitive: () => IDe, comparePatternKeys: () => tK, compareProperties: () => Cae, compareStringsCaseInsensitive: () => _8, compareStringsCaseInsensitiveEslintCompatible: () => Sae, compareStringsCaseSensitive: () => su, compareStringsCaseSensitiveUI: () => XD, compareTextSpans: () => f8, compareValues: () => Es, compileOnSaveCommandLineOption: () => UO, compilerOptionsAffectDeclarationPath: () => Cle, compilerOptionsAffectEmit: () => Ale, compilerOptionsAffectSemanticDiagnostics: () => xle, compilerOptionsDidYouMeanDiagnostics: () => JO, compilerOptionsIndicateEsModules: () => aY, compose: () => Rke, computeCommonSourceDirectoryOfFilenames: () => jpe, computeLineAndCharacterOfPosition: () => yw, computeLineOfPosition: () => aI, computeLineStarts: () => hw, computePositionOfLineAndCharacter: () => mj, computeSignature: () => YT, computeSignatureWithDiagnostics: () => Tq, computeSuggestionDiagnostics: () => $Y, concatenate: () => Qi, concatenateDiagnosticMessageChains: () => gle, consumesNodeCoreModules: () => V7, contains: () => ya, containsIgnoredPath: () => sL, containsObjectRestOrSpread: () => IO, containsParseError: () => Gw, containsPath: () => Gy, convertCompilerOptionsForTelemetry: () => TNe, convertCompilerOptionsFromJson: () => mNe, convertJsonOption: () => GO, convertToBase64: () => ele, convertToObject: () => rfe, convertToObjectWorker: () => PO, convertToOptionsWithAbsolutePaths: () => SJ, convertToRelativePath: () => rI, convertToTSConfig: () => tNe, convertTypeAcquisitionFromJson: () => hNe, copyComments: () => r1, copyEntries: () => Mw, copyLeadingComments: () => q2, copyProperties: () => jU, copyTrailingAsLeadingComments: () => qN, copyTrailingComments: () => sk, couldStartTrivia: () => hoe, countWhere: () => Oy, createAbstractBuilder: () => S8e, createAccessorPropertyBackingField: () => sJ, createAccessorPropertyGetRedirector: () => gde, createAccessorPropertySetRedirector: () => yde, createBaseNodeFactory: () => oue, createBinaryExpressionTrampoline: () => C3, createBindingHelper: () => d2, createBuildInfo: () => dN, createBuilderProgram: () => Sq, createBuilderProgramUsingProgramBuildInfo: () => dme, createBuilderStatusReporter: () => Ame, createCacheWithRedirects: () => KJ, createCacheableExportInfoMap: () => Tge, createCachedDirectoryStructureHost: () => Mpe, createClassifier: () => Age, createCommentDirectivesMap: () => Gse, createCompilerDiagnostic: () => ps, createCompilerDiagnosticForInvalidCustomType: () => pJ, createCompilerDiagnosticFromMessageChain: () => s4, createCompilerHost: () => Hpe, createCompilerHostFromProgramHost: () => Bq, createCompilerHostWorker: () => nq, createDetachedDiagnostic: () => t2, createDiagnosticCollection: () => XA, createDiagnosticForFileFromMessageChain: () => yH, createDiagnosticForNode: () => hr, createDiagnosticForNodeArray: () => RA, createDiagnosticForNodeArrayFromMessageChain: () => jw, createDiagnosticForNodeFromMessageChain: () => Lh, createDiagnosticForNodeInSourceFile: () => Nu, createDiagnosticForRange: () => vH, createDiagnosticMessageChainFromDiagnostic: () => qse, createDiagnosticReporter: () => bN, createDocumentPositionMapper: () => H_e, createDocumentRegistry: () => VY, createDocumentRegistryInternal: () => Rge, createEmitAndSemanticDiagnosticsBuilderProgram: () => kq, createEmitHelperFactory: () => Tue, createEmptyExports: () => bO, createExpressionForJsxElement: () => Que, createExpressionForJsxFragment: () => Zue, createExpressionForObjectLiteralElementLike: () => ede, createExpressionForPropertyName: () => Zz, createExpressionFromEntityName: () => EO, createExternalHelpersImportDeclarationIfNeeded: () => nJ, createFileDiagnostic: () => al, createFileDiagnosticFromMessageChain: () => S6, createForOfBindingStatement: () => Qz, createGetCanonicalFileName: () => Dl, createGetSourceFile: () => eq, createGetSymbolAccessibilityDiagnosticForNode: () => zg, createGetSymbolAccessibilityDiagnosticForNodeName: () => Epe, createGetSymbolWalker: () => f_e, createIncrementalCompilerHost: () => jq, createIncrementalProgram: () => xme, createInputFiles: () => RRe, createInputFilesWithFilePaths: () => _z, createInputFilesWithFileTexts: () => pz, createJsxFactoryExpression: () => $z, createLanguageService: () => Bye, createLanguageServiceSourceFile: () => f5, createMemberAccessForPropertyName: () => VT, createModeAwareCache: () => WT, createModeAwareCacheKey: () => ML, createModuleResolutionCache: () => Y3, createModuleResolutionLoader: () => cq, createModuleSpecifierResolutionHost: () => $S, createMultiMap: () => Nf, createNodeConverters: () => cue, createNodeFactory: () => YR, createOptionNameMap: () => R3, createOverload: () => Dte, createPackageJsonImportFilter: () => uk, createPackageJsonInfo: () => uge, createParenthesizerRules: () => sue, createPatternMatcher: () => Fge, createPrependNodes: () => fq, createPrinter: () => nE, createPrinterWithDefaults: () => qK, createPrinterWithRemoveComments: () => rE, createPrinterWithRemoveCommentsNeverAsciiEscape: () => XK, createPrinterWithRemoveCommentsOmitTrailingSemicolon: () => fN, createProgram: () => PF, createProgramHost: () => Uq, createPropertyNameNodeForIdentifierOrLiteral: () => E4, createQueue: () => HU, createRange: () => Gf, createRedirectedBuilderProgram: () => Cq, createResolutionCache: () => fme, createRuntimeTypeSerializer: () => npe, createScanner: () => kg, createSemanticDiagnosticsBuilderProgram: () => T8e, createSet: () => Dke, createSolutionBuilder: () => U8e, createSolutionBuilderHost: () => F8e, createSolutionBuilderWithWatch: () => V8e, createSolutionBuilderWithWatchHost: () => G8e, createSortedArray: () => MU, createSourceFile: () => DO, createSourceMapGenerator: () => M_e, createSourceMapSource: () => ORe, createSuperAccessVariableStatement: () => SF, createSymbolTable: () => Ua, createSymlinkCache: () => Ile, createSystemWatchFunctions: () => loe, createTextChange: () => GN, createTextChangeFromStartLength: () => v7, createTextChangeRange: () => Sw, createTextRangeFromNode: () => nY, createTextRangeFromSpan: () => y7, createTextSpan: () => il, createTextSpanFromBounds: () => Wc, createTextSpanFromNode: () => Du, createTextSpanFromRange: () => lv, createTextSpanFromStringLiteralLikeContent: () => tY, createTextWriter: () => SR, createTokenRange: () => _W, createTypeChecker: () => k_e, createTypeReferenceDirectiveResolutionCache: () => $3, createTypeReferenceResolutionLoader: () => OF, createUnderscoreEscapedMultiMap: () => vae, createUnparsedSourceFile: () => fz, createWatchCompilerHost: () => R8e, createWatchCompilerHostOfConfigFile: () => Tme, createWatchCompilerHostOfFilesAndCompilerOptions: () => Sme, createWatchFactory: () => Gq, createWatchHost: () => Fq, createWatchProgram: () => O8e, createWatchStatusReporter: () => pme, createWriteFileMeasuringIO: () => tq, declarationNameToString: () => os, decodeMappings: () => EK, decodedTextSpanIntersectsWith: () => Q8, decorateHelper: () => N4, deduplicate: () => fA, defaultIncludeSpec: () => z3, defaultInitCompilerOptions: () => W3, defaultMaximumTruncationLength: () => KR, detectSortCaseSensitivity: () => l8, diagnosticCategoryName: () => C8, diagnosticToString: () => ZS, directoryProbablyExists: () => gp, directorySeparator: () => _s, displayPart: () => Qu, displayPartsToString: () => Mye, disposeEmitNodes: () => yz, documentSpansEqual: () => P6e, dumpTracingLegend: () => toe, elementAt: () => Ig, elideNodes: () => hde, emitComments: () => Vce, emitDetachedComments: () => jce, emitFiles: () => CF, emitFilesAndReportErrors: () => qF, emitFilesAndReportErrorsAndGetExitStatus: () => vme, emitModuleKindIsNonNodeESM: () => SW, emitNewLineBeforeLeadingCommentOfPosition: () => Uce, emitNewLineBeforeLeadingComments: () => Gce, emitNewLineBeforeLeadingCommentsOfPosition: () => Bce, emitSkippedWithNoDiagnostics: () => HF, emitUsingBuildInfo: () => Ppe, emptyArray: () => Je, emptyFileSystemEntries: () => D4, emptyMap: () => b8, emptyOptions: () => Cp, emptySet: () => Pae, endsWith: () => Oc, ensurePathIsNonModuleName: () => S0, ensureScriptKind: () => h4, ensureTrailingDirectorySeparator: () => cu, entityNameToString: () => qd, enumerateInsertsAndDeletes: () => wae, equalOwnProperties: () => hae, equateStringsCaseInsensitive: () => W1, equateStringsCaseSensitive: () => z1, equateValues: () => Zv, esDecorateHelper: () => F4, escapeJsxAttributeString: () => qH, escapeLeadingUnderscores: () => Bs, escapeNonAsciiString: () => ER, escapeSnippetText: () => OT, escapeString: () => _S, every: () => Ji, expandPreOrPostfixIncrementOrDecrementExpression: () => b3, explainFiles: () => yme, explainIfFileIsRedirectAndImpliedFormat: () => Oq, exportAssignmentIsAlias: () => zA, exportStarHelper: () => t3, expressionResultIsUnused: () => Ble, extend: () => d8, extendsHelper: () => z4, extensionFromPath: () => jR, extensionIsTS: () => y4, externalHelpersModuleNameText: () => _b, factory: () => D, fileExtensionIs: () => Gc, fileExtensionIsOneOf: () => $c, fileIncludeReasonToDiagnostics: () => Mq, filter: () => Pr, filterMutate: () => wU, filterSemanticDiagnostics: () => MF, find: () => wr, findAncestor: () => jn, findBestPatternMatch: () => JU, findChildOfKind: () => Yo, findComputedPropertyNameCacheAssignment: () => L3, findConfigFile: () => Vpe, findContainingList: () => d7, findDiagnosticForNode: () => fge, findFirstNonJsxWhitespaceToken: () => Ihe, findIndex: () => Yc, findLast: () => dA, findLastIndex: () => s8, findListItemInfo: () => Ehe, findMap: () => vke, findModifier: () => z2, findNextToken: () => t1, findPackageJson: () => cge, findPackageJsons: () => AY, findPrecedingMatchingToken: () => h7, findPrecedingToken: () => el, findSuperStatementIndex: () => bF, findTokenOnLeftOfPosition: () => p7, findUseStrictPrologue: () => tJ, first: () => Vo, firstDefined: () => ks, firstDefinedIterator: () => FD, firstIterator: () => pae, firstOrOnly: () => LY, firstOrUndefined: () => Sl, firstOrUndefinedIterator: () => u8, fixupCompilerOptions: () => t$, flatMap: () => Uo, flatMapIterator: () => OU, flatMapToMutable: () => BD, flatten: () => t_, flattenCommaList: () => vde, flattenDestructuringAssignment: () => KT, flattenDestructuringBinding: () => eE, flattenDiagnosticMessageText: () => sv, forEach: () => mn, forEachAncestor: () => Lse, forEachAncestorDirectory: () => Th, forEachChild: () => pa, forEachChildRecursively: () => kO, forEachEmittedFile: () => WK, forEachEnclosingBlockScopeContainer: () => Jse, forEachEntry: () => Ld, forEachExternalModuleToImportFrom: () => MY, forEachImportClauseDeclaration: () => z6, forEachKey: () => TI, forEachLeadingCommentRange: () => vw, forEachNameInAccessChainWalkingLeft: () => Xwe, forEachResolvedProjectReference: () => Kpe, forEachReturnStatement: () => vT, forEachRight: () => sae, forEachTrailingCommentRange: () => bw, forEachUnique: () => lY, forEachYieldExpression: () => Yse, forSomeAncestorDirectory: () => qwe, formatColorAndReset: () => iE, formatDiagnostic: () => rq, formatDiagnostics: () => e8e, formatDiagnosticsWithColorAndContext: () => Jpe, formatGeneratedName: () => jT, formatGeneratedNamePart: () => L2, formatLocation: () => iq, formatMessage: () => TW, formatStringFromArgs: () => jm, formatting: () => tl, fullTripleSlashAMDReferencePathRegEx: () => XW, fullTripleSlashReferencePathRegEx: () => qW, generateDjb2Hash: () => aw, generateTSConfig: () => oNe, generatorHelper: () => Q4, getAdjustedReferenceLocation: () => zX, getAdjustedRenameLocation: () => _7, getAliasDeclarationFromName: () => BH, getAllAccessorDeclarations: () => kT, getAllDecoratorsOfClass: () => LK, getAllDecoratorsOfClassElement: () => TF, getAllJSDocTags: () => kj, getAllJSDocTagsOfKind: () => KDe, getAllKeys: () => Ike, getAllProjectOutputs: () => AF, getAllSuperTypeNodes: () => NI, getAllUnscopedEmitHelpers: () => xz, getAllowJSCompilerOption: () => PR, getAllowSyntheticDefaultImports: () => wT, getAncestor: () => cb, getAnyExtensionFromPath: () => j8, getAreDeclarationMapsEnabled: () => d4, getAssignedExpandoInitializer: () => oS, getAssignedName: () => xj, getAssignmentDeclarationKind: () => ic, getAssignmentDeclarationPropertyAccessKind: () => tR, getAssignmentTargetKind: () => xT, getAutomaticTypeDirectiveNames: () => X3, getBaseFileName: () => Hl, getBinaryOperatorPrecedence: () => vR, getBuildInfo: () => IF, getBuildInfoFileVersionMap: () => Aq, getBuildInfoText: () => Npe, getBuildOrderFromAnyBuildOrder: () => ZF, getBuilderCreationParameters: () => zF, getBuilderFileEmit: () => cv, getCheckFlags: () => ac, getClassExtendsHeritageElement: () => P0, getClassLikeDeclarationOfSymbol: () => Nh, getCombinedLocalAndExportSymbolFlags: () => XI, getCombinedModifierFlags: () => wg, getCombinedNodeFlags: () => G_, getCombinedNodeFlagsAlwaysIncludeJSDoc: () => Tj, getCommentRange: () => sm, getCommonSourceDirectory: () => uN, getCommonSourceDirectoryOfConfig: () => XL, getCompilerOptionValue: () => f4, getCompilerOptionsDiffValue: () => aNe, getConditions: () => P2, getConfigFileParsingDiagnostics: () => XT, getConstantValue: () => mue, getContainerNode: () => e1, getContainingClass: () => Zc, getContainingClassStaticBlock: () => gwe, getContainingFunction: () => Xd, getContainingFunctionDeclaration: () => ice, getContainingFunctionOrClassStaticBlock: () => R6, getContainingNodeArray: () => Ule, getContainingObjectLiteralElement: () => nP, getContextualTypeFromParent: () => w7, getContextualTypeFromParentOrAncestorTypeNode: () => f7, getCurrentTime: () => SN, getDeclarationDiagnostics: () => Tpe, getDeclarationEmitExtensionForPath: () => QH, getDeclarationEmitOutputFilePath: () => Rce, getDeclarationEmitOutputFilePathWorker: () => $H, getDeclarationFromName: () => fR, getDeclarationModifierFlagsFromSymbol: () => Ef, getDeclarationOfKind: () => nc, getDeclarationsOfKind: () => Ase, getDeclaredExpandoInitializer: () => $w, getDecorators: () => Uy, getDefaultCompilerOptions: () => d5, getDefaultExportInfoWorker: () => $7, getDefaultFormatCodeSettings: () => fhe, getDefaultLibFileName: () => X8, getDefaultLibFilePath: () => f3e, getDefaultLikeExportInfo: () => Y7, getDiagnosticText: () => ZOe, getDiagnosticsWithinSpan: () => _ge, getDirectoryPath: () => ni, getDocumentPositionMapper: () => Yge, getESModuleInterop: () => f_, getEditsForFileRename: () => Nge, getEffectiveBaseTypeNode: () => hp, getEffectiveConstraintOfTypeParameter: () => EA, getEffectiveContainerForJSDocTemplateTag: () => J6, getEffectiveImplementsTypeNodes: () => JA, getEffectiveInitializer: () => Yw, getEffectiveJSDocHost: () => WA, getEffectiveModifierFlags: () => uu, getEffectiveModifierFlagsAlwaysIncludeJSDoc: () => Jce, getEffectiveModifierFlagsNoCache: () => qce, getEffectiveReturnTypeNode: () => U_, getEffectiveSetAccessorTypeAnnotationNode: () => Fce, getEffectiveTypeAnnotationNode: () => Cl, getEffectiveTypeParameterDeclarations: () => jy, getEffectiveTypeRoots: () => XO, getElementOrPropertyAccessArgumentExpressionOrName: () => W6, getElementOrPropertyAccessName: () => wh, getElementsOfBindingOrAssignmentPattern: () => I2, getEmitDeclarations: () => __, getEmitFlags: () => Ya, getEmitHelpers: () => O4, getEmitModuleDetectionKind: () => Ele, getEmitModuleKind: () => Rl, getEmitModuleResolutionKind: () => $s, getEmitScriptTarget: () => Do, getEnclosingBlockScopeContainer: () => tm, getEncodedSemanticClassifications: () => BY, getEncodedSyntacticClassifications: () => UY, getEndLinePosition: () => Bw, getEntityNameFromTypeNode: () => Jw, getEntrypointsFromPackageJsonInfo: () => zNe, getErrorCountForSummary: () => JF, getErrorSpanForNode: () => w0, getErrorSummaryText: () => hme, getEscapedTextOfIdentifierOrLiteral: () => MI, getExpandoInitializer: () => ob, getExportAssignmentExpression: () => UH, getExportInfoMap: () => YN, getExportNeedsImportStarHelper: () => z_e, getExpressionAssociativity: () => WH, getExpressionPrecedence: () => $6, getExternalHelpersModuleName: () => SO, getExternalModuleImportEqualsDeclarationExpression: () => wI, getExternalModuleName: () => UA, getExternalModuleNameFromDeclaration: () => Dce, getExternalModuleNameFromPath: () => YH, getExternalModuleNameLiteral: () => jS, getExternalModuleRequireArgument: () => IH, getFallbackOptions: () => _N, getFileEmitOutput: () => Ype, getFileMatcherPatterns: () => tL, getFileNamesFromConfigSpecs: () => BO, getFileWatcherEventKind: () => aoe, getFilesInErrorForSummary: () => KF, getFirstConstructorWithBody: () => Vm, getFirstIdentifier: () => Yd, getFirstNonSpaceCharacterPosition: () => nge, getFirstProjectOutput: () => JK, getFixableErrorSpanExpression: () => IY, getFormatCodeSettingsForWriting: () => z7, getFullWidth: () => Fw, getFunctionFlags: () => pl, getHeritageClause: () => mR, getHostSignatureFromJSDoc: () => sb, getIdentifierAutoGenerate: () => BRe, getIdentifierGeneratedImportReference: () => Eue, getIdentifierTypeArguments: () => NT, getImmediatelyInvokedFunctionExpression: () => ET, getImpliedNodeFormatForFile: () => NF, getImpliedNodeFormatForFileWorker: () => uq, getImportNeedsImportDefaultHelper: () => SK, getImportNeedsImportStarHelper: () => vF, getIndentSize: () => YA, getIndentString: () => Q6, getInitializedVariables: () => qI, getInitializerOfBinaryExpression: () => OH, getInitializerOfBindingOrAssignmentElement: () => AO, getInterfaceBaseTypeNodes: () => PI, getInternalEmitFlags: () => o_, getInvokedExpression: () => P6, getIsolatedModules: () => d_, getJSDocAugmentsTag: () => Koe, getJSDocClassTag: () => Aj, getJSDocCommentRanges: () => EH, getJSDocCommentsAndTags: () => PH, getJSDocDeprecatedTag: () => Cj, getJSDocDeprecatedTagNoCache: () => ese, getJSDocEnumTag: () => Ij, getJSDocHost: () => dS, getJSDocImplementsTags: () => qoe, getJSDocOverrideTagNoCache: () => Zoe, getJSDocParameterTags: () => fI, getJSDocParameterTagsNoCache: () => joe, getJSDocPrivateTag: () => jDe, getJSDocPrivateTagNoCache: () => Yoe, getJSDocProtectedTag: () => HDe, getJSDocProtectedTagNoCache: () => $oe, getJSDocPublicTag: () => VDe, getJSDocPublicTagNoCache: () => Xoe, getJSDocReadonlyTag: () => WDe, getJSDocReadonlyTagNoCache: () => Qoe, getJSDocReturnTag: () => tse, getJSDocReturnType: () => Aw, getJSDocRoot: () => OI, getJSDocSatisfiesExpressionType: () => JW, getJSDocSatisfiesTag: () => Lj, getJSDocTags: () => A0, getJSDocTagsNoCache: () => JDe, getJSDocTemplateTag: () => zDe, getJSDocThisTag: () => e6, getJSDocType: () => Vy, getJSDocTypeAliasName: () => iJ, getJSDocTypeAssertionType: () => T3, getJSDocTypeParameterDeclarations: () => t4, getJSDocTypeParameterTags: () => Woe, getJSDocTypeParameterTagsNoCache: () => zoe, getJSDocTypeTag: () => x0, getJSXImplicitImportBase: () => _4, getJSXRuntimeImport: () => p4, getJSXTransformEnabled: () => AW, getKeyForCompilerOptions: () => JJ, getLanguageVariant: () => RR, getLastChild: () => yW, getLeadingCommentRanges: () => Nm, getLeadingCommentRangesOfNode: () => bH, getLeftmostAccessExpression: () => $I, getLeftmostExpression: () => QI, getLineAndCharacterOfPosition: () => Gs, getLineInfo: () => F_e, getLineOfLocalPosition: () => UI, getLineOfLocalPositionFromLineMap: () => IT, getLineStartPositionForPosition: () => Wf, getLineStarts: () => Sh, getLinesBetweenPositionAndNextNonWhitespaceCharacter: () => sle, getLinesBetweenPositionAndPrecedingNonWhitespaceCharacter: () => ole, getLinesBetweenPositions: () => oI, getLinesBetweenRangeEndAndRangeStart: () => pW, getLinesBetweenRangeEndPositions: () => Wwe, getLiteralText: () => Bse, getLocalNameForExternalImport: () => C2, getLocalSymbolForExportDefault: () => QA, getLocaleSpecificMessage: () => uo, getLocaleTimeString: () => EN, getMappedContextSpan: () => zhe, getMappedDocumentSpan: () => uY, getMappedLocation: () => WN, getMatchedFileSpec: () => Nq, getMatchedIncludeSpec: () => Pq, getMeaningFromDeclaration: () => LN, getMeaningFromLocation: () => ZT, getMembersOfDeclaration: () => $se, getModeForFileReference: () => mN, getModeForResolutionAtIndex: () => aq, getModeForUsageLocation: () => W_, getModifiedTime: () => $1, getModifiers: () => uT, getModuleInstanceState: () => Gh, getModuleNameStringLiteralAt: () => GF, getModuleSpecifierEndingPreference: () => OW, getModuleSpecifierResolverHost: () => oY, getNameForExportedSymbol: () => j7, getNameFromIndexInfo: () => Kse, getNameFromPropertyName: () => VN, getNameOfAccessExpression: () => ule, getNameOfCompilerOptionValue: () => EJ, getNameOfDeclaration: () => sa, getNameOfExpando: () => wH, getNameOfJSDocTypedef: () => Uoe, getNameOrArgument: () => eR, getNameTable: () => p$, getNamesForExportedSymbol: () => mge, getNamespaceDeclarationNode: () => VA, getNewLineCharacter: () => db, getNewLineKind: () => XN, getNewLineOrDefaultFromHost: () => bb, getNewTargetContainer: () => oce, getNextJSDocCommentLocation: () => MH, getNodeForGeneratedName: () => I3, getNodeId: () => zo, getNodeKind: () => aE, getNodeModifiers: () => rk, getNodeModulePathParts: () => jW, getNonAssignedNameOfDeclaration: () => Sj, getNonAssignmentOperatorForCompoundAssignment: () => WL, getNonAugmentationDeclaration: () => dH, getNonDecoratorTokenPosOfNode: () => aH, getNormalizedAbsolutePath: () => _a, getNormalizedAbsolutePathWithoutRoot: () => lj, getNormalizedPathComponents: () => fw, getObjectFlags: () => Ur, getOperator: () => JH, getOperatorAssociativity: () => zH, getOperatorPrecedence: () => yR, getOptionFromName: () => gJ, getOptionsNameMap: () => w2, getOrCreateEmitNode: () => Lu, getOrCreateExternalHelpersModuleNameIfNeeded: () => ade, getOrUpdate: () => VD, getOriginalNode: () => ec, getOriginalNodeId: () => sc, getOriginalSourceFile: () => wwe, getOutputDeclarationFileName: () => qL, getOutputExtension: () => zK, getOutputFileNames: () => BMe, getOutputPathsFor: () => KL, getOutputPathsForBundle: () => JL, getOwnEmitOutputFilePath: () => wce, getOwnKeys: () => bh, getOwnValues: () => H1, getPackageJsonInfo: () => KS, getPackageJsonTypesVersionsPaths: () => q3, getPackageJsonsVisibleToFile: () => lge, getPackageNameFromTypesPackageName: () => ZO, getPackageScopeForPath: () => eF, getParameterSymbolFromJSDoc: () => uR, getParameterTypeNode: () => bRe, getParentNodeInSpan: () => HN, getParseTreeNode: () => ea, getParsedCommandLineOfConfigFile: () => RO, getPathComponents: () => Ou, getPathComponentsRelativeTo: () => _j, getPathFromPathComponents: () => T0, getPathUpdater: () => jY, getPathsBasePath: () => ZH, getPatternFromSpec: () => kW, getPendingEmitKind: () => G2, getPositionOfLineAndCharacter: () => gw, getPossibleGenericSignatures: () => XX, getPossibleOriginalInputExtensionForExtension: () => Oce, getPossibleTypeArgumentsInfo: () => YX, getPreEmitDiagnostics: () => ZMe, getPrecedingNonSpaceCharacterPosition: () => hY, getPrivateIdentifier: () => kK, getProperties: () => CK, getProperty: () => zD, getPropertyArrayElementValue: () => rce, getPropertyAssignment: () => MA, getPropertyAssignmentAliasLikeExpression: () => xce, getPropertyNameForPropertyNameNode: () => M0, getPropertyNameForUniqueESSymbol: () => kwe, getPropertyNameOfBindingOrAssignmentElement: () => rJ, getPropertySymbolFromBindingElement: () => I7, getPropertySymbolsFromContextualType: () => _5, getQuoteFromPreference: () => Hhe, getQuotePreference: () => J_, getRangesWhere: () => PU, getRefactorContextSpan: () => QS, getReferencedFileLocation: () => YL, getRegexFromPattern: () => Qy, getRegularExpressionForWildcard: () => eL, getRegularExpressionsForWildcards: () => m4, getRelativePathFromDirectory: () => Xp, getRelativePathFromFile: () => _w, getRelativePathToDirectoryOrUrl: () => Q1, getRenameLocation: () => KN, getReplacementSpanForContextToken: () => eY, getResolutionDiagnostic: () => _q, getResolutionModeOverrideForClause: () => qS, getResolveJsonModule: () => RT, getResolvePackageJsonExports: () => xW, getResolvePackageJsonImports: () => oRe, getResolvedExternalModuleName: () => Z6, getResolvedModule: () => kA, getResolvedTypeReferenceDirective: () => iwe, getRestIndicatorOfBindingOrAssignmentElement: () => x3, getRestParameterElementType: () => SH, getRightMostAssignedExpression: () => Qw, getRootDeclaration: () => nm, getRootLength: () => _p, getScriptKind: () => mY, getScriptKindFromFileName: () => RW, getScriptTargetFeatures: () => oH, getSelectedEffectiveModifierFlags: () => hS, getSelectedSyntacticModifierFlags: () => zce, getSemanticClassifications: () => Cge, getSemanticJsxChildren: () => bR, getSetAccessorTypeAnnotationNode: () => Pce, getSetAccessorValueParameter: () => VI, getSetExternalModuleIndicator: () => OR, getShebang: () => K8, getSingleInitializerOfVariableStatementOrPropertyDeclaration: () => NH, getSingleVariableOfVariableStatement: () => HA, getSnapshotText: () => E7, getSnippetElement: () => bz, getSourceFileOfModule: () => m6, getSourceFileOfNode: () => Gn, getSourceFilePathInNewDir: () => e4, getSourceFilePathInNewDirWorker: () => tW, getSourceFileVersionAsHashFromText: () => XF, getSourceFilesToEmit: () => eW, getSourceMapRange: () => pb, getSourceMapper: () => Xge, getSourceTextOfNodeFromSourceFile: () => k0, getSpanOfTokenAtPosition: () => Pg, getSpellingSuggestion: () => $C, getStartPositionOfLine: () => Ky, getStartPositionOfRange: () => KI, getStartsOnNewLine: () => tO, getStaticPropertiesAndClassStaticBlock: () => EF, getStrictOptionValue: () => Uf, getStringComparer: () => p8, getSuperCallFromStatement: () => AK, getSuperContainer: () => Ww, getSupportedCodeFixes: () => Fye, getSupportedExtensions: () => nL, getSupportedExtensionsWithJsonIfResolveJsonModule: () => FR, getSwitchedType: () => TY, getSymbolId: () => $a, getSymbolNameForPrivateIdentifier: () => hR, getSymbolTarget: () => ege, getSyntacticClassifications: () => Dge, getSyntacticModifierFlags: () => Yy, getSyntacticModifierFlagsNoCache: () => sW, getSynthesizedDeepClone: () => cc, getSynthesizedDeepCloneWithReplacements: () => JN, getSynthesizedDeepClones: () => oE, getSynthesizedDeepClonesWithReplacements: () => gY, getSyntheticLeadingComments: () => l2, getSyntheticTrailingComments: () => rO, getTargetLabel: () => s7, getTargetOfBindingOrAssignmentElement: () => iv, getTemporaryModuleResolutionState: () => Z3, getTextOfConstantValue: () => Use, getTextOfIdentifierOrLiteral: () => l_, getTextOfJSDocComment: () => Cw, getTextOfNode: () => Qc, getTextOfNodeFromSourceText: () => AI, getTextOfPropertyName: () => wA, getThisContainer: () => Ku, getThisParameter: () => F0, getTokenAtPosition: () => Vi, getTokenPosOfNode: () => gT, getTokenSourceMapRange: () => FRe, getTouchingPropertyName: () => ef, getTouchingToken: () => nk, getTrailingCommentRanges: () => eb, getTrailingSemicolonDeferringWriter: () => XH, getTransformFlagsSubtreeExclusions: () => uue, getTransformers: () => jK, getTsBuildInfoEmitOutputFilePath: () => Jg, getTsConfigObjectLiteralExpression: () => LI, getTsConfigPropArray: () => Hw, getTsConfigPropArrayElementValue: () => w6, getTypeAnnotationNode: () => Mce, getTypeArgumentOrTypeParameterList: () => Ohe, getTypeKeywordOfTypeOnlyImport: () => cY, getTypeNode: () => vue, getTypeNodeIfAccessible: () => lk, getTypeParameterFromJsDoc: () => yce, getTypeParameterOwner: () => BDe, getTypesPackageName: () => rF, getUILocale: () => xae, getUniqueName: () => i1, getUniqueSymbolId: () => tge, getUseDefineForClassFields: () => MR, getWatchErrorSummaryDiagnosticMessage: () => wq, getWatchFactory: () => Upe, group: () => YC, groupBy: () => yae, guessIndentation: () => xse, handleNoEmitOptions: () => dq, hasAbstractModifier: () => B0, hasAccessorModifier: () => rm, hasAmbientModifier: () => aW, hasChangesInResolutions: () => nH, hasChildOfKind: () => NN, hasContextSensitiveParameters: () => b4, hasDecorators: () => bf, hasDocComment: () => Rhe, hasDynamicName: () => Xy, hasEffectiveModifier: () => cd, hasEffectiveModifiers: () => n4, hasEffectiveReadonlyModifier: () => jI, hasExtension: () => gA, hasIndexSignature: () => EY, hasInitializer: () => Jy, hasInvalidEscape: () => KH, hasJSDocNodes: () => Kd, hasJSDocParameterTags: () => Joe, hasJSFileExtension: () => ES, hasJsonModuleEmitEnabled: () => l4, hasOnlyExpressionInitializer: () => mT, hasOverrideModifier: () => iW, hasPossibleExternalModuleReference: () => zse, hasProperty: () => fs, hasPropertyAccessExpressionWithName: () => kN, hasQuestionToken: () => uS, hasRecordedExternalHelpers: () => ide, hasRestParameter: () => Yj, hasScopeMarker: () => yse, hasStaticModifier: () => zc, hasSyntacticModifier: () => Mr, hasSyntacticModifiers: () => Wce, hasTSFileExtension: () => GR, hasTabstop: () => jle, hasTrailingDirectorySeparator: () => My, hasType: () => f6, hasTypeArguments: () => Awe, hasZeroOrOneAsteriskCharacter: () => CW, helperString: () => Sz, hostGetCanonicalFileName: () => lb, hostUsesCaseSensitiveFileNames: () => xR, idText: () => vr, identifierIsThisKeyword: () => rW, identifierToKeywordKind: () => nb, identity: () => Ks, identitySourceMapConsumer: () => yF, ignoreSourceNewlines: () => Tz, ignoredPaths: () => uw, importDefaultHelper: () => e3, importFromModuleSpecifier: () => aR, importNameElisionDisabled: () => u4, importStarHelper: () => aO, indexOfAnyCharCode: () => cae, indexOfNode: () => DA, indicesOf: () => jD, inferredTypesContainingFile: () => VF, insertImports: () => L7, insertLeadingStatement: () => sOe, insertSorted: () => Ny, insertStatementAfterCustomPrologue: () => L0, insertStatementAfterStandardPrologue: () => cwe, insertStatementsAfterCustomPrologue: () => rH, insertStatementsAfterStandardPrologue: () => em, intersperse: () => DU, introducesArgumentsExoticObject: () => tce, inverseJsxOptionMap: () => NL, isAbstractConstructorSymbol: () => cle, isAbstractModifier: () => Rue, isAccessExpression: () => Us, isAccessibilityModifier: () => ZX, isAccessor: () => rb, isAccessorModifier: () => Nue, isAliasSymbolDeclaration: () => Cwe, isAliasableExpression: () => pR, isAmbientModule: () => lu, isAmbientPropertyDeclaration: () => _H, isAnonymousFunctionDefinition: () => FI, isAnyDirectorySeparator: () => sj, isAnyImportOrBareOrAccessedRequire: () => Wse, isAnyImportOrReExport: () => Uw, isAnyImportSyntax: () => yT, isAnySupportedFileExtension: () => mRe, isApplicableVersionedTypesKey: () => QO, isArgumentExpressionOfElementAccess: () => BX, isArray: () => ba, isArrayBindingElement: () => c6, isArrayBindingOrAssignmentElement: () => ww, isArrayBindingOrAssignmentPattern: () => Vj, isArrayBindingPattern: () => g2, isArrayLiteralExpression: () => fu, isArrayLiteralOrObjectLiteralDestructuringPattern: () => qg, isArrayTypeNode: () => wz, isArrowFunction: () => xs, isAsExpression: () => fO, isAssertClause: () => p3, isAssertEntry: () => jue, isAssertionExpression: () => pT, isAssertionKey: () => ase, isAssertsKeyword: () => Due, isAssignmentDeclaration: () => RI, isAssignmentExpression: () => Iu, isAssignmentOperator: () => Mg, isAssignmentPattern: () => vI, isAssignmentTarget: () => Um, isAsteriskToken: () => cO, isAsyncFunction: () => qA, isAsyncModifier: () => mL, isAutoAccessorPropertyDeclaration: () => Id, isAwaitExpression: () => v2, isAwaitKeyword: () => Dz, isBigIntLiteral: () => a3, isBinaryExpression: () => ar, isBinaryOperatorToken: () => pde, isBindableObjectDefinePropertyCall: () => sS, isBindableStaticAccessExpression: () => ST, isBindableStaticElementAccessExpression: () => H6, isBindableStaticNameExpression: () => cS, isBindingElement: () => Wo, isBindingElementOfBareOrAccessedRequire: () => lce, isBindingName: () => Mm, isBindingOrAssignmentElement: () => use, isBindingOrAssignmentPattern: () => kw, isBindingPattern: () => La, isBlock: () => Va, isBlockOrCatchScoped: () => sH, isBlockScope: () => pH, isBlockScopedContainerTopLevel: () => Hse, isBooleanLiteral: () => ose, isBreakOrContinueStatement: () => hI, isBreakStatement: () => qRe, isBuildInfoFile: () => Ipe, isBuilderProgram: () => gme, isBundle: () => Bz, isBundleFileTextLike: () => dle, isCallChain: () => dT, isCallExpression: () => Pa, isCallExpressionTarget: () => NX, isCallLikeExpression: () => rS, isCallOrNewExpression: () => Ih, isCallOrNewExpressionTarget: () => PX, isCallSignatureDeclaration: () => _2, isCallToHelper: () => pL, isCaseBlock: () => hO, isCaseClause: () => CL, isCaseKeyword: () => Pue, isCaseOrDefaultClause: () => Kj, isCatchClause: () => E2, isCatchClauseVariableDeclaration: () => Vle, isCatchClauseVariableDeclarationOrBindingElement: () => cH, isCheckJsEnabledForFile: () => HR, isChildOfNodeWithKind: () => TH, isCircularBuildOrder: () => YS, isClassDeclaration: () => sl, isClassElement: () => _l, isClassExpression: () => _u, isClassLike: () => Yr, isClassMemberModifier: () => Gj, isClassOrTypeElement: () => s6, isClassStaticBlockDeclaration: () => oc, isCollapsedRange: () => Hwe, isColonToken: () => Iue, isCommaExpression: () => TO, isCommaListExpression: () => SL, isCommaSequence: () => wL, isCommaToken: () => Cue, isComment: () => g7, isCommonJsExportPropertyAssignment: () => k6, isCommonJsExportedExpression: () => Zse, isCompoundAssignment: () => oN, isComputedNonLiteralName: () => Vw, isComputedPropertyName: () => ts, isConciseBody: () => u6, isConditionalExpression: () => b2, isConditionalTypeNode: () => m2, isConstTypeReference: () => Ch, isConstructSignatureDeclaration: () => uO, isConstructorDeclaration: () => Ec, isConstructorTypeNode: () => yL, isContextualKeyword: () => K6, isContinueStatement: () => KRe, isCustomPrologue: () => A6, isDebuggerStatement: () => XRe, isDeclaration: () => Kl, isDeclarationBindingElement: () => Lw, isDeclarationFileName: () => Fu, isDeclarationName: () => Rh, isDeclarationNameOfEnumOrNamespace: () => wR, isDeclarationReadonly: () => x6, isDeclarationStatement: () => bse, isDeclarationWithTypeParameterChildren: () => hH, isDeclarationWithTypeParameters: () => mH, isDecorator: () => du, isDecoratorTarget: () => mhe, isDefaultClause: () => yO, isDefaultImport: () => lS, isDefaultModifier: () => kue, isDefaultedExpandoInitializer: () => dce, isDeleteExpression: () => Gue, isDeleteTarget: () => GH, isDeprecatedDeclaration: () => H7, isDestructuringAssignment: () => Fg, isDiagnosticWithLocation: () => CY, isDiskPathRoot: () => TDe, isDoStatement: () => zRe, isDotDotDotToken: () => o3, isDottedName: () => WI, isDynamicName: () => Y6, isESSymbolIdentifier: () => Dwe, isEffectiveExternalModule: () => aS, isEffectiveModuleDeclaration: () => jse, isEffectiveStrictModeSourceFile: () => fH, isElementAccessChain: () => Dj, isElementAccessExpression: () => Vs, isEmittedFileOfProgram: () => Bpe, isEmptyArrayLiteral: () => Zce, isEmptyBindingElement: () => Goe, isEmptyBindingPattern: () => Foe, isEmptyObjectLiteral: () => dW, isEmptyStatement: () => Pz, isEmptyStringLiteral: () => CH, isEndOfDeclarationMarker: () => QRe, isEntityName: () => Cd, isEntityNameExpression: () => bc, isEnumConst: () => R0, isEnumDeclaration: () => hb, isEnumMember: () => q0, isEqualityOperatorKind: () => R7, isEqualsGreaterThanToken: () => Lue, isExclamationToken: () => lO, isExcludedFile: () => gfe, isExclusivelyTypeOnlyImportOrExport: () => oq, isExportAssignment: () => pc, isExportDeclaration: () => Il, isExportModifier: () => c3, isExportName: () => E3, isExportNamespaceAsDefaultDeclaration: () => v6, isExportOrDefaultModifier: () => oJ, isExportSpecifier: () => Mu, isExportsIdentifier: () => TT, isExportsOrModuleExportsOrAlias: () => $0, isExpression: () => ot, isExpressionNode: () => Dh, isExpressionOfExternalModuleImportEqualsDeclaration: () => vhe, isExpressionOfOptionalChainRoot: () => r6, isExpressionStatement: () => Ol, isExpressionWithTypeArguments: () => Vg, isExpressionWithTypeArgumentsInClassExtendsClause: () => IR, isExternalModule: () => Lc, isExternalModuleAugmentation: () => D0, isExternalModuleImportEqualsDeclaration: () => ab, isExternalModuleIndicator: () => Rw, isExternalModuleNameRelative: () => fl, isExternalModuleReference: () => um, isExternalModuleSymbol: () => BN, isExternalOrCommonJsModule: () => kd, isFileLevelUniqueName: () => g6, isFileProbablyExternalModule: () => LO, isFirstDeclarationOfSymbolParameter: () => dY, isFixablePromiseHandler: () => ZY, isForInOrOfStatement: () => CA, isForInStatement: () => Mz, isForInitializer: () => pp, isForOfStatement: () => _O, isForStatement: () => FT, isFunctionBlock: () => bT, isFunctionBody: () => Hj, isFunctionDeclaration: () => Jc, isFunctionExpression: () => ms, isFunctionExpressionOrArrowFunction: () => a2, isFunctionLike: () => Ia, isFunctionLikeDeclaration: () => Ds, isFunctionLikeKind: () => nS, isFunctionLikeOrClassStaticBlockDeclaration: () => SA, isFunctionOrConstructorTypeNode: () => lse, isFunctionOrModuleBlock: () => Bj, isFunctionSymbol: () => _ce, isFunctionTypeNode: () => Jm, isFutureReservedKeyword: () => Iwe, isGeneratedIdentifier: () => tc, isGeneratedPrivateIdentifier: () => tS, isGetAccessor: () => zy, isGetAccessorDeclaration: () => p_, isGetOrSetAccessorDeclaration: () => t6, isGlobalDeclaration: () => J6e, isGlobalScopeAugmentation: () => mp, isGrammarError: () => Nse, isHeritageClause: () => dd, isHoistedFunction: () => C6, isHoistedVariableStatement: () => I6, isIdentifier: () => Re, isIdentifierANonContextualKeyword: () => q6, isIdentifierName: () => Sce, isIdentifierOrThisTypeNode: () => ude, isIdentifierPart: () => tb, isIdentifierStart: () => Pm, isIdentifierText: () => i_, isIdentifierTypePredicate: () => nce, isIdentifierTypeReference: () => Mle, isIfStatement: () => MT, isIgnoredFileFromWildCardWatching: () => DF, isImplicitGlob: () => LW, isImportCall: () => Dd, isImportClause: () => lm, isImportDeclaration: () => gl, isImportEqualsDeclaration: () => Nl, isImportKeyword: () => gL, isImportMeta: () => NA, isImportOrExportSpecifier: () => eS, isImportOrExportSpecifierName: () => Zhe, isImportSpecifier: () => $u, isImportTypeAssertionContainer: () => Vue, isImportTypeNode: () => Mh, isImportableFile: () => PY, isInComment: () => Kg, isInExpressionContext: () => F6, isInJSDoc: () => qw, isInJSFile: () => Yn, isInJSXText: () => Dhe, isInJsonFile: () => B6, isInNonReferenceComment: () => Ghe, isInReferenceComment: () => Fhe, isInRightSideOfInternalImportEqualsDeclaration: () => i7, isInString: () => n1, isInTemplateString: () => qX, isInTopLevelContext: () => O6, isIncrementalCompilation: () => NR, isIndexSignatureDeclaration: () => kS, isIndexedAccessTypeNode: () => OS, isInferTypeNode: () => h2, isInfinityOrNaNString: () => cL, isInitializedProperty: () => sN, isInitializedVariable: () => mW, isInsideJsxElement: () => m7, isInsideJsxElementOrAttribute: () => khe, isInsideNodeModules: () => dge, isInsideTemplateLiteral: () => FN, isInstantiatedModule: () => fK, isInterfaceDeclaration: () => ku, isInternalDeclaration: () => BK, isInternalModuleImportEqualsDeclaration: () => GA, isInternalName: () => eJ, isIntersectionTypeNode: () => dO, isIntrinsicJsxName: () => GI, isIterationStatement: () => Wy, isJSDoc: () => dm, isJSDocAllType: () => Kue, isJSDocAugmentsTag: () => x2, isJSDocAuthorTag: () => tOe, isJSDocCallbackTag: () => Vz, isJSDocClassTag: () => Xue, isJSDocCommentContainingNode: () => qj, isJSDocConstructSignature: () => jA, isJSDocDeprecatedTag: () => Jz, isJSDocEnumTag: () => vO, isJSDocFunctionType: () => S2, isJSDocImplementsTag: () => qz, isJSDocIndexSignature: () => U6, isJSDocLikeText: () => cJ, isJSDocLink: () => zue, isJSDocLinkCode: () => Jue, isJSDocLinkLike: () => iS, isJSDocLinkPlain: () => ZRe, isJSDocMemberName: () => gb, isJSDocNameReference: () => IL, isJSDocNamepathType: () => eOe, isJSDocNamespaceBody: () => ZDe, isJSDocNode: () => IA, isJSDocNonNullableType: () => m3, isJSDocNullableType: () => T2, isJSDocOptionalParameter: () => JR, isJSDocOptionalType: () => Uz, isJSDocOverloadTag: () => kL, isJSDocOverrideTag: () => g3, isJSDocParameterTag: () => xp, isJSDocPrivateTag: () => Hz, isJSDocPropertyLikeTag: () => a6, isJSDocPropertyTag: () => $ue, isJSDocProtectedTag: () => Wz, isJSDocPublicTag: () => jz, isJSDocReadonlyTag: () => zz, isJSDocReturnTag: () => y3, isJSDocSatisfiesExpression: () => zW, isJSDocSatisfiesTag: () => v3, isJSDocSeeTag: () => nOe, isJSDocSignature: () => X0, isJSDocTag: () => EI, isJSDocTemplateTag: () => H_, isJSDocThisTag: () => Yue, isJSDocThrowsTag: () => iOe, isJSDocTypeAlias: () => Ff, isJSDocTypeAssertion: () => RL, isJSDocTypeExpression: () => UT, isJSDocTypeLiteral: () => LL, isJSDocTypeTag: () => DL, isJSDocTypedefTag: () => Kz, isJSDocUnknownTag: () => rOe, isJSDocUnknownType: () => que, isJSDocVariadicType: () => h3, isJSXTagName: () => DI, isJsonEqual: () => GW, isJsonSourceFile: () => Mf, isJsxAttribute: () => Sp, isJsxAttributeLike: () => d6, isJsxAttributes: () => K0, isJsxChild: () => Pw, isJsxClosingElement: () => GS, isJsxClosingFragment: () => Hue, isJsxElement: () => Hg, isJsxExpression: () => AL, isJsxFragment: () => BS, isJsxOpeningElement: () => Xm, isJsxOpeningFragment: () => US, isJsxOpeningLikeElement: () => Au, isJsxOpeningLikeElementTagName: () => hhe, isJsxSelfClosingElement: () => FS, isJsxSpreadAttribute: () => GT, isJsxTagNameExpression: () => bI, isJsxText: () => CS, isJumpStatementTarget: () => DN, isKeyword: () => Xu, isKnownSymbol: () => gR, isLabelName: () => FX, isLabelOfLabeledStatement: () => MX, isLabeledStatement: () => J0, isLateVisibilityPaintedStatement: () => E6, isLeftHandSideExpression: () => Ju, isLeftHandSideOfAssignment: () => Bwe, isLet: () => II, isLineBreak: () => Wl, isLiteralComputedPropertyDeclarationName: () => _R, isLiteralExpression: () => fT, isLiteralExpressionOfObject: () => Pj, isLiteralImportTypeNode: () => ib, isLiteralKind: () => gI, isLiteralLikeAccess: () => j6, isLiteralLikeElementAccess: () => Zw, isLiteralNameOfPropertyDeclarationOrIndexAccess: () => c7, isLiteralTypeLikeExpression: () => hOe, isLiteralTypeLiteral: () => hse, isLiteralTypeNode: () => mb, isLocalName: () => rv, isLogicalOperator: () => Yce, isLogicalOrCoalescingAssignmentExpression: () => cW, isLogicalOrCoalescingAssignmentOperator: () => HI, isLogicalOrCoalescingBinaryExpression: () => CR, isLogicalOrCoalescingBinaryOperator: () => AR, isMappedTypeNode: () => EL, isMemberName: () => Ah, isMergeDeclarationMarker: () => $Re, isMetaProperty: () => TL, isMethodDeclaration: () => Nc, isMethodOrAccessor: () => xA, isMethodSignature: () => zm, isMinusToken: () => kz, isMissingDeclaration: () => YRe, isModifier: () => Ha, isModifierKind: () => Rg, isModifierLike: () => Ns, isModuleAugmentationExternal: () => uH, isModuleBlock: () => Tp, isModuleBody: () => vse, isModuleDeclaration: () => Tc, isModuleExportsAccessExpression: () => Bm, isModuleIdentifier: () => RH, isModuleName: () => _de, isModuleOrEnumDeclaration: () => Ow, isModuleReference: () => Tse, isModuleSpecifierLike: () => C7, isModuleWithStringLiteralName: () => b6, isNameOfFunctionDeclaration: () => VX, isNameOfModuleDeclaration: () => UX, isNamedClassElement: () => cse, isNamedDeclaration: () => zl, isNamedEvaluation: () => vf, isNamedEvaluationSource: () => VH, isNamedExportBindings: () => Rj, isNamedExports: () => h_, isNamedImportBindings: () => Wj, isNamedImports: () => jg, isNamedImportsOrExports: () => bW, isNamedTupleMember: () => bL, isNamespaceBody: () => QDe, isNamespaceExport: () => qm, isNamespaceExportDeclaration: () => gO, isNamespaceImport: () => nv, isNamespaceReexportDeclaration: () => cce, isNewExpression: () => z0, isNewExpressionTarget: () => ZL, isNightly: () => TR, isNoSubstitutionTemplateLiteral: () => IS, isNode: () => XDe, isNodeArray: () => C0, isNodeArrayMultiLine: () => ale, isNodeDescendantOf: () => AT, isNodeKind: () => Iw, isNodeLikeSystem: () => qU, isNodeModulesDirectory: () => H8, isNodeWithPossibleHoistedDeclaration: () => vce, isNonContextualKeyword: () => Ace, isNonExportDefaultModifier: () => NOe, isNonGlobalAmbientModule: () => lH, isNonGlobalDeclaration: () => vge, isNonNullAccess: () => Hle, isNonNullChain: () => i6, isNonNullExpression: () => PS, isNonStaticMethodOrAccessorWithPrivateName: () => K_e, isNotEmittedOrPartiallyEmittedNode: () => $De, isNotEmittedStatement: () => Gz, isNullishCoalesce: () => wj, isNumber: () => Cg, isNumericLiteral: () => Vf, isNumericLiteralName: () => Wm, isObjectBindingElementWithoutPropertyName: () => jN, isObjectBindingOrAssignmentElement: () => Dw, isObjectBindingOrAssignmentPattern: () => Uj, isObjectBindingPattern: () => cm, isObjectLiteralElement: () => Xj, isObjectLiteralElementLike: () => Og, isObjectLiteralExpression: () => rs, isObjectLiteralMethod: () => s_, isObjectLiteralOrClassExpressionMethodOrAccessor: () => D6, isObjectTypeDeclaration: () => yS, isOctalDigit: () => hj, isOmittedExpression: () => ol, isOptionalChain: () => Jl, isOptionalChainRoot: () => pI, isOptionalDeclaration: () => WW, isOptionalJSDocPropertyLikeTag: () => zR, isOptionalTypeNode: () => Rz, isOuterExpression: () => S3, isOutermostOptionalChain: () => mI, isOverrideModifier: () => Oue, isPackedArrayLiteral: () => UW, isParameter: () => ha, isParameterDeclaration: () => CT, isParameterOrCatchClauseVariable: () => VW, isParameterPropertyDeclaration: () => Ad, isParameterPropertyModifier: () => yI, isParenthesizedExpression: () => ud, isParenthesizedTypeNode: () => wS, isParseTreeNode: () => dI, isPartOfTypeNode: () => Gm, isPartOfTypeQuery: () => G6, isPartiallyEmittedExpression: () => _3, isPatternMatch: () => h8, isPinnedComment: () => y6, isPlainJsFile: () => h6, isPlusToken: () => Lz, isPossiblyTypeArgumentPosition: () => MN, isPostfixUnaryExpression: () => Nz, isPrefixUnaryExpression: () => tv, isPrivateIdentifier: () => pi, isPrivateIdentifierClassElementDeclaration: () => xu, isPrivateIdentifierPropertyAccessExpression: () => TA, isPrivateIdentifierSymbol: () => Cce, isProgramBundleEmitBuildInfo: () => ame, isProgramUptoDate: () => lq, isPrologueDirective: () => B_, isPropertyAccessChain: () => n6, isPropertyAccessEntityNameExpression: () => LR, isPropertyAccessExpression: () => br, isPropertyAccessOrQualifiedName: () => fse, isPropertyAccessOrQualifiedNameOrImportTypeNode: () => dse, isPropertyAssignment: () => yl, isPropertyDeclaration: () => Na, isPropertyName: () => Ys, isPropertyNameLiteral: () => c_, isPropertySignature: () => $d, isProtoSetter: () => Ice, isPrototypeAccess: () => ub, isPrototypePropertyAssignment: () => nR, isPunctuation: () => Phe, isPushOrUnshiftIdentifier: () => jH, isQualifiedName: () => Yu, isQuestionDotToken: () => s3, isQuestionOrExclamationToken: () => lde, isQuestionOrPlusOrMinusToken: () => fde, isQuestionToken: () => ev, isRawSourceMap: () => B_e, isReadonlyKeyword: () => wue, isReadonlyKeywordOrPlusOrMinusToken: () => dde, isRecognizedTripleSlashComment: () => iH, isReferenceFileLocation: () => F2, isReferencedFile: () => vb, isRegularExpressionLiteral: () => Cz, isRequireCall: () => qu, isRequireVariableStatement: () => DH, isRestParameter: () => Fm, isRestTypeNode: () => Oz, isReturnStatement: () => j_, isReturnStatementWithFixablePromiseHandler: () => r5, isRightSideOfAccessExpression: () => $ce, isRightSideOfPropertyAccess: () => j2, isRightSideOfQualifiedName: () => yhe, isRightSideOfQualifiedNameOrPropertyAccess: () => zI, isRightSideOfQualifiedNameOrPropertyAccessOrJSDocMemberName: () => Qce, isRootedDiskPath: () => qp, isSameEntityName: () => BA, isSatisfiesExpression: () => HRe, isScopeMarker: () => gse, isSemicolonClassElement: () => Bue, isSetAccessor: () => Ng, isSetAccessorDeclaration: () => Sf, isShebangTrivia: () => gj, isShorthandAmbientModuleSymbol: () => CI, isShorthandPropertyAssignment: () => xf, isSignedNumericLiteral: () => X6, isSimpleCopiableExpression: () => Z0, isSimpleInlineableExpression: () => Ap, isSingleOrDoubleQuote: () => Xw, isSourceFile: () => Li, isSourceFileFromLibrary: () => dk, isSourceFileJS: () => Cu, isSourceFileNotJS: () => vwe, isSourceFileNotJson: () => LH, isSourceMapping: () => U_e, isSpecialPropertyDeclaration: () => fce, isSpreadAssignment: () => VS, isSpreadElement: () => Km, isStatement: () => ca, isStatementButNotDeclaration: () => Nw, isStatementOrBlock: () => Ese, isStatementWithLocals: () => Ose, isStatic: () => Ca, isStaticModifier: () => LS, isString: () => Ta, isStringAKeyword: () => Lwe, isStringANonContextualKeyword: () => fS, isStringAndEmptyAnonymousObjectIntersection: () => Nhe, isStringDoubleQuoted: () => V6, isStringLiteral: () => yo, isStringLiteralLike: () => es, isStringLiteralOrJsxExpression: () => Sse, isStringLiteralOrTemplate: () => age, isStringOrNumericLiteralLike: () => yf, isStringOrRegularExpressionOrTemplateLiteral: () => QX, isStringTextContainingNode: () => Fj, isSuperCall: () => OA, isSuperKeyword: () => hL, isSuperOrSuperProperty: () => ywe, isSuperProperty: () => Pu, isSupportedSourceFileName: () => wle, isSwitchStatement: () => pO, isSyntaxList: () => A2, isSyntheticExpression: () => WRe, isSyntheticReference: () => MS, isTagName: () => GX, isTaggedTemplateExpression: () => PT, isTaggedTemplateTag: () => phe, isTemplateExpression: () => d3, isTemplateHead: () => f2, isTemplateLiteral: () => AA, isTemplateLiteralKind: () => Hy, isTemplateLiteralToken: () => rse, isTemplateLiteralTypeNode: () => jRe, isTemplateLiteralTypeSpan: () => Mue, isTemplateMiddle: () => Aue, isTemplateMiddleOrTemplateTail: () => o6, isTemplateSpan: () => xL, isTemplateTail: () => Iz, isTextWhiteSpaceLike: () => Whe, isThis: () => H2, isThisContainerOrFunctionBlock: () => ace, isThisIdentifier: () => LT, isThisInTypeQuery: () => mS, isThisInitializedDeclaration: () => N6, isThisInitializedObjectBindingExpression: () => sce, isThisProperty: () => zw, isThisTypeNode: () => u3, isThisTypeParameter: () => lL, isThisTypePredicate: () => hwe, isThrowStatement: () => Fz, isToken: () => Z1, isTokenKind: () => Nj, isTraceEnabled: () => ov, isTransientSymbol: () => Zp, isTrivia: () => KA, isTryStatement: () => mO, isTupleTypeNode: () => p2, isTypeAlias: () => sR, isTypeAliasDeclaration: () => Ep, isTypeAssertionExpression: () => Fue, isTypeDeclaration: () => o2, isTypeElement: () => _T, isTypeKeyword: () => ik, isTypeKeywordToken: () => rY, isTypeKeywordTokenOrIdentifier: () => b7, isTypeLiteralNode: () => Rd, isTypeNode: () => bi, isTypeNodeKind: () => vW, isTypeOfExpression: () => y2, isTypeOnlyExportDeclaration: () => ise, isTypeOnlyImportDeclaration: () => Mj, isTypeOnlyImportOrExportDeclaration: () => I0, isTypeOperatorNode: () => RS, isTypeParameterDeclaration: () => _c, isTypePredicateNode: () => l3, isTypeQueryNode: () => vL, isTypeReferenceNode: () => m_, isTypeReferenceType: () => _6, isUMDExportSymbol: () => o4, isUnaryExpression: () => jj, isUnaryExpressionWithWrite: () => mse, isUnicodeIdentifierStart: () => W8, isUnionTypeNode: () => DS, isUnparsedNode: () => Oj, isUnparsedPrepend: () => Wue, isUnparsedSource: () => BT, isUnparsedTextLike: () => nse, isUrl: () => doe, isValidBigIntString: () => v4, isValidESSymbolDeclaration: () => ece, isValidTypeOnlyAliasUseSite: () => TS, isValueSignatureDeclaration: () => bce, isVarConst: () => kh, isVariableDeclaration: () => wi, isVariableDeclarationInVariableStatement: () => L6, isVariableDeclarationInitializedToBareOrAccessedRequire: () => N0, isVariableDeclarationInitializedToRequire: () => kH, isVariableDeclarationList: () => pu, isVariableLike: () => PA, isVariableLikeOrAccessor: () => Qse, isVariableStatement: () => Bc, isVoidExpression: () => NS, isWatchSet: () => Jwe, isWhileStatement: () => JRe, isWhiteSpaceLike: () => xh, isWhiteSpaceSingleLine: () => Yp, isWithStatement: () => Uue, isWriteAccess: () => YI, isWriteOnlyAccess: () => hW, isYieldExpression: () => f3, jsxModeNeedsExplicitImport: () => wY, keywordPart: () => _d, last: () => To, lastOrUndefined: () => Os, length: () => Fn, libMap: () => jO, libs: () => VO, lineBreakPart: () => K2, linkNamePart: () => $he, linkPart: () => _Y, linkTextPart: () => k7, listFiles: () => Rq, loadModuleFromGlobalCache: () => s_e, loadWithModeAwareCache: () => hN, makeIdentifierFromModuleName: () => Vse, makeImport: () => Xg, makeImportIfNecessary: () => jhe, makeStringLiteral: () => S7, mangleScopedPackageName: () => UL, map: () => on, mapAllOrFail: () => NU, mapDefined: () => Zi, mapDefinedEntries: () => bke, mapDefinedIterator: () => UD, mapEntries: () => uae, mapIterator: () => RU, mapOneOrMany: () => pge, mapToDisplayParts: () => uv, matchFiles: () => wW, matchPatternOrExact: () => NW, matchedText: () => Dae, matchesExclude: () => G3, maybeBind: () => ho, maybeSetLocalizedDiagnosticMessages: () => mle, memoize: () => zu, memoizeCached: () => Eae, memoizeOne: () => Jp, memoizeWeak: () => wke, metadataHelper: () => P4, min: () => WU, minAndMax: () => Nle, missingFileModifiedTime: () => Eh, modifierToFlag: () => gS, modifiersToFlags: () => im, moduleOptionDeclaration: () => NJ, moduleResolutionIsEqualTo: () => wse, moduleResolutionNameAndModeGetter: () => QL, moduleResolutionOptionDeclarations: () => U3, moduleResolutionSupportsPackageJsonExportsAndImports: () => bS, moduleResolutionUsesNodeModules: () => T7, moduleSpecifiers: () => Q0, moveEmitHelpers: () => gue, moveRangeEnd: () => i4, moveRangePastDecorators: () => $y, moveRangePastModifiers: () => yp, moveRangePos: () => fb, moveSyntheticComments: () => pue, mutateMap: () => e2, mutateMapSkippingNewValues: () => Oh, needsParentheses: () => bY, needsScopeMarker: () => l6, newCaseClauseTracker: () => J7, newPrivateEnvironment: () => Y_e, noEmitNotification: () => cN, noEmitSubstitution: () => zL, noTransformers: () => HK, noTruncationMaximumTruncationLength: () => x4, nodeCanBeDecorated: () => M6, nodeHasName: () => xw, nodeIsDecorated: () => FA, nodeIsMissing: () => rc, nodeIsPresent: () => Pf, nodeIsSynthesized: () => ws, nodeModuleNameResolver: () => zfe, nodeModulesPathPart: () => Wg, nodeNextJsonConfigResolver: () => Jfe, nodeOrChildIsDecorated: () => Kw, nodeOverlapsWithStartEnd: () => HX, nodePosToString: () => swe, nodeSeenTracker: () => W2, nodeStartsNewLexicalEnvironment: () => HH, nodeToDisplayParts: () => B6e, noop: () => Ba, noopFileWatcher: () => B2, noopPush: () => E8, normalizePath: () => So, normalizeSlashes: () => Al, not: () => y8, notImplemented: () => Sa, notImplementedResolver: () => LF, nullNodeConverters: () => dz, nullParenthesizerRules: () => uz, nullTransformationContext: () => Bh, objectAllocator: () => ml, operatorPart: () => ak, optionDeclarations: () => Fh, optionMapToObject: () => bJ, optionsAffectingProgramStructure: () => GJ, optionsForBuild: () => UJ, optionsForWatch: () => HO, optionsHaveChanges: () => LA, optionsHaveModuleResolutionChanges: () => Cse, or: () => Kp, orderedRemoveItem: () => m8, orderedRemoveItemAt: () => y0, outFile: () => Ss, packageIdToPackageName: () => p6, packageIdToString: () => hT, padLeft: () => J1, padRight: () => Mke, paramHelper: () => M4, parameterIsThisKeyword: () => G0, parameterNamePart: () => Khe, parseBaseNodeFactory: () => _J, parseBigInt: () => Ple, parseBuildCommand: () => QOe, parseCommandLine: () => $Oe, parseCommandLineWorker: () => hJ, parseConfigFileTextToJson: () => vJ, parseConfigFileWithSystem: () => L8e, parseConfigHostFromCompilerHostLike: () => FF, parseCustomTypeOption: () => O3, parseIsolatedEntityName: () => zS, parseIsolatedJSDocComment: () => Mde, parseJSDocTypeExpressionForTests: () => zOe, parseJsonConfigFileContent: () => cNe, parseJsonSourceFileConfigFileContent: () => MO, parseJsonText: () => wO, parseListTypeOption: () => Kde, parseNodeFactory: () => fm, parseNodeModuleFromPath: () => XJ, parsePackageName: () => ZJ, parsePseudoBigInt: () => iL, parseValidBigInt: () => BW, patchWriteFileEnsuringDirectory: () => uoe, pathContainsNodeModules: () => JS, pathIsAbsolute: () => nI, pathIsBareSpecifier: () => cj, pathIsRelative: () => Jd, patternText: () => kae, perfLogger: () => fp, performIncrementalCompilation: () => D8e, performance: () => ZD, plainJSErrors: () => jF, positionBelongsToNode: () => WX, positionIsASICandidate: () => N7, positionIsSynthesized: () => vp, positionsAreOnSameLine: () => Bf, preProcessFile: () => qge, probablyUsesSemicolons: () => P7, processCommentPragmas: () => dJ, processPragmasIntoFields: () => fJ, processTaggedTemplateExpression: () => OK, programContainsEsModules: () => Vhe, programContainsModules: () => Uhe, projectReferenceIsEqualTo: () => tH, propKeyHelper: () => X4, propertyNamePart: () => qhe, pseudoBigIntToString: () => j0, punctuationPart: () => Yl, pushIfUnique: () => Of, quote: () => ck, quotePreferenceFromString: () => sY, rangeContainsPosition: () => wN, rangeContainsPositionExclusive: () => RN, rangeContainsRange: () => Od, rangeContainsRangeExclusive: () => bhe, rangeContainsStartEnd: () => ON, rangeEndIsOnSameLineAsRangeStart: () => DR, rangeEndPositionsAreOnSameLine: () => rle, rangeEquals: () => GU, rangeIsOnSingleLine: () => DT, rangeOfNode: () => MW, rangeOfTypeParameters: () => FW, rangeOverlapsWithStartEnd: () => tk, rangeStartIsOnSameLineAsRangeEnd: () => ile, rangeStartPositionsAreOnSameLine: () => a4, readBuilderProgram: () => QF, readConfigFile: () => OO, readHelper: () => K4, readJson: () => JI, readJsonConfigFile: () => $de, readJsonOrUndefined: () => fW, realizeDiagnostics: () => b$, reduceEachLeadingCommentRange: () => goe, reduceEachTrailingCommentRange: () => yoe, reduceLeft: () => ou, reduceLeftIterator: () => yke, reducePathComponents: () => oT, refactor: () => Ok, regExpEscape: () => lRe, relativeComplement: () => fae, removeAllComments: () => ZR, removeEmitHelper: () => GRe, removeExtension: () => UR, removeFileExtension: () => ld, removeIgnoredPath: () => Dq, removeMinAndVersionNumbers: () => Lae, removeOptionality: () => whe, removePrefix: () => QC, removeSuffix: () => pA, removeTrailingDirectorySeparator: () => sT, repeatString: () => UN, replaceElement: () => UU, resolutionExtensionIsTSOrJson: () => VR, resolveConfigFileProjectName: () => Hq, resolveJSModule: () => jfe, resolveModuleName: () => FL, resolveModuleNameFromCache: () => FNe, resolvePackageNameToPackageJson: () => wNe, resolvePath: () => Fy, resolveProjectReferencePath: () => $L, resolveTripleslashReference: () => wF, resolveTypeReferenceDirective: () => HJ, resolvingEmptyArray: () => S4, restHelper: () => H4, returnFalse: () => m0, returnNoopFileWatcher: () => TN, returnTrue: () => h0, returnUndefined: () => Qv, returnsPromise: () => QY, runInitializersHelper: () => G4, sameFlatMap: () => lae, sameMap: () => Tl, sameMapping: () => APe, scanShebangTrivia: () => yj, scanTokenAtPosition: () => Xse, scanner: () => $l, screenStartingMessageCodes: () => $F, semanticDiagnosticsOptionDeclarations: () => PJ, serializeCompilerOptions: () => TJ, server: () => dhe, servicesVersion: () => m$, setCommentRange: () => hl, setConfigFileInOptions: () => xJ, setConstantValue: () => hue, setEachParent: () => i2, setEmitFlags: () => Jn, setFunctionNameHelper: () => Y4, setGetSourceFileAsHashVersioned: () => YF, setIdentifierAutoGenerate: () => iO, setIdentifierGeneratedImportReference: () => bue, setIdentifierTypeArguments: () => Ug, setInternalEmitFlags: () => eO, setLocalizedDiagnosticMessages: () => ple, setModuleDefaultHelper: () => Z4, setNodeFlags: () => Gle, setObjectAllocator: () => _le, setOriginalNode: () => Ir, setParent: () => go, setParentRecursive: () => Zy, setPrivateIdentifier: () => JT, setResolvedModule: () => kse, setResolvedTypeReferenceDirective: () => Dse, setSnippetElement: () => Ez, setSourceMapRange: () => Ho, setStackTraceLimit: () => dDe, setStartsOnNewLine: () => vz, setSyntheticLeadingComments: () => W0, setSyntheticTrailingComments: () => u2, setSys: () => bDe, setSysLog: () => ooe, setTextRange: () => it, setTextRangeEnd: () => r2, setTextRangePos: () => aL, setTextRangePosEnd: () => om, setTextRangePosWidth: () => oL, setTokenSourceMapRange: () => _ue, setTypeNode: () => yue, setUILocale: () => Aae, setValueDeclaration: () => rR, shouldAllowImportingTsExtension: () => VL, shouldPreserveConstEnums: () => U0, shouldUseUriStyleNodeCoreModules: () => W7, showModuleSpecifier: () => lle, signatureHasLiteralTypes: () => _K, signatureHasRestParameter: () => Xl, signatureToDisplayParts: () => pY, single: () => BU, singleElementArray: () => aT, singleIterator: () => Eke, singleOrMany: () => zp, singleOrUndefined: () => Wp, skipAlias: () => wd, skipAssertions: () => fOe, skipConstraint: () => iY, skipOuterExpressions: () => ql, skipParentheses: () => vs, skipPartiallyEmittedExpressions: () => a_, skipTrivia: () => xo, skipTypeChecking: () => rL, skipTypeParentheses: () => FH, skipWhile: () => Nae, sliceAfter: () => PW, some: () => vt, sort: () => XC, sortAndDeduplicate: () => HD, sortAndDeduplicateDiagnostics: () => vA, sourceFileAffectingCompilerOptions: () => V3, sourceFileMayBeEmitted: () => pS, sourceMapCommentRegExp: () => hF, sourceMapCommentRegExpDontCareLineStart: () => TK, spacePart: () => Qs, spanMap: () => c8, spreadArrayHelper: () => q4, stableSort: () => Ag, startEndContainsRange: () => jX, startEndOverlapsWithStartEnd: () => l7, startOnNewLine: () => mu, startTracing: () => eoe, startsWith: () => na, startsWithDirectory: () => fj, startsWithUnderscore: () => DY, startsWithUseStrict: () => nde, stringContains: () => jl, stringContainsAt: () => yge, stringToToken: () => lT, stripQuotes: () => u_, supportedDeclarationExtensions: () => I4, supportedJSExtensions: () => cz, supportedJSExtensionsFlat: () => dL, supportedLocaleDirectories: () => Qj, supportedTSExtensions: () => c2, supportedTSExtensionsFlat: () => sz, supportedTSImplementationExtensions: () => L4, suppressLeadingAndTrailingTrivia: () => pd, suppressLeadingTrivia: () => D7, suppressTrailingTrivia: () => ige, symbolEscapedNameNoDefault: () => A7, symbolName: () => fc, symbolNameNoDefault: () => x7, symbolPart: () => Jhe, symbolToDisplayParts: () => ok, syntaxMayBeASICandidate: () => NY, syntaxRequiresTrailingSemicolonOrASI: () => O7, sys: () => xl, sysLog: () => ow, tagNamesAreEquivalent: () => yb, takeWhile: () => v8, targetOptionDeclaration: () => zO, templateObjectHelper: () => J4, testFormatSettings: () => _he, textChangeRangeIsUnchanged: () => Moe, textChangeRangeNewSpan: () => uI, textChanges: () => nr, textOrKeywordPart: () => fY, textPart: () => tf, textRangeContainsPositionInclusive: () => Y8, textSpanContainsPosition: () => bj, textSpanContainsTextSpan: () => Roe, textSpanEnd: () => wl, textSpanIntersection: () => Poe, textSpanIntersectsWith: () => $8, textSpanIntersectsWithPosition: () => Noe, textSpanIntersectsWithTextSpan: () => FDe, textSpanIsEmpty: () => woe, textSpanOverlap: () => Ooe, textSpanOverlapsWith: () => MDe, textSpansEqual: () => J2, textToKeywordObj: () => Ew, timestamp: () => Ms, toArray: () => qD, toBuilderFileEmit: () => lme, toBuilderStateFileInfoForMultiEmit: () => cme, toEditorSettings: () => tP, toFileNameLowerCase: () => n_, toLowerCase: () => bae, toPath: () => Ts, toProgramEmitPending: () => ume, tokenIsIdentifierOrKeyword: () => Su, tokenIsIdentifierOrKeywordOrGreaterThan: () => moe, tokenToString: () => Xa, trace: () => Xi, tracing: () => ai, tracingEnabled: () => ew, transform: () => p3e, transformClassFields: () => tpe, transformDeclarations: () => UK, transformECMAScriptModule: () => GK, transformES2015: () => mpe, transformES2016: () => _pe, transformES2017: () => ape, transformES2018: () => ope, transformES2019: () => spe, transformES2020: () => cpe, transformES2021: () => lpe, transformES5: () => hpe, transformESDecorators: () => ipe, transformESNext: () => upe, transformGenerators: () => gpe, transformJsx: () => dpe, transformLegacyDecorators: () => rpe, transformModule: () => FK, transformNodeModule: () => bpe, transformNodes: () => lN, transformSystemModule: () => vpe, transformTypeScript: () => Z_e, transpile: () => U4e, transpileModule: () => iye, transpileOptionValueCompilerOptions: () => BJ, trimString: () => v0, trimStringEnd: () => $D, trimStringStart: () => ZC, tryAddToSet: () => _0, tryAndIgnoreErrors: () => B7, tryCast: () => zr, tryDirectoryExists: () => G7, tryExtractTSExtension: () => r4, tryFileExists: () => F7, tryGetClassExtendingExpressionWithTypeArguments: () => lW, tryGetClassImplementingOrExtendingExpressionWithTypeArguments: () => uW, tryGetDirectories: () => M7, tryGetExtensionFromPath: () => Hm, tryGetImportFromModuleSpecifier: () => oR, tryGetJSDocSatisfiesTypeNode: () => T4, tryGetModuleNameFromFile: () => xO, tryGetModuleSpecifierFromDeclaration: () => iR, tryGetNativePerformanceHooks: () => Yae, tryGetPropertyAccessOrIdentifierToString: () => kR, tryGetPropertyNameOfBindingOrAssignmentElement: () => A3, tryGetSourceMappingURL: () => G_e, tryGetTextOfPropertyName: () => T6, tryIOAndConsumeErrors: () => U7, tryParsePattern: () => n2, tryParsePatterns: () => g4, tryParseRawSourceMap: () => bK, tryReadDirectory: () => xY, tryReadFile: () => NO, tryRemoveDirectoryPrefix: () => IW, tryRemoveExtension: () => Ole, tryRemovePrefix: () => KU, tryRemoveSuffix: () => Iae, typeAcquisitionDeclarations: () => H3, typeAliasNamePart: () => Xhe, typeDirectiveIsEqualTo: () => Rse, typeKeywords: () => K7, typeParameterNamePart: () => Yhe, typeReferenceResolutionNameAndModeGetter: () => yN, typeToDisplayParts: () => zN, unchangedPollThresholds: () => lw, unchangedTextChangeRange: () => $j, unescapeLeadingUnderscores: () => Gi, unmangleScopedPackageName: () => iF, unorderedRemoveItem: () => YD, unorderedRemoveItemAt: () => zU, unreachableCodeIsError: () => Tle, unusedLabelIsError: () => Sle, unwrapInnermostStatementOfLabel: () => xH, updateErrorForNoInputFiles: () => CJ, updateLanguageServiceSourceFile: () => _$, updateMissingFilePathsWatch: () => Gpe, updatePackageJsonWatch: () => YMe, updateResolutionField: () => N2, updateSharedExtendedConfigFileWatcher: () => YK, updateSourceFile: () => uJ, updateWatchingWildcardDirectories: () => kF, usesExtensionsOnImports: () => Dle, usingSingleLineStringWriter: () => SI, utf16EncodeAsString: () => lI, validateLocaleAndSetLanguage: () => UDe, valuesHelper: () => $4, version: () => Rf, versionMajorMinor: () => Sg, visitArray: () => vK, visitCommaListElements: () => aN, visitEachChild: () => xn, visitFunctionBody: () => Zd, visitIterationBody: () => jf, visitLexicalEnvironment: () => mF, visitNode: () => $e, visitNodes: () => On, visitParameterList: () => Sc, walkUpBindingElementsAndPatterns: () => bA, walkUpLexicalEnvironments: () => X_e, walkUpOuterExpressions: () => rde, walkUpParenthesizedExpressions: () => qy, walkUpParenthesizedTypes: () => dR, walkUpParenthesizedTypesAndGetParentAndChild: () => Tce, whitespaceOrMapCommentRegExp: () => gF, writeCommentRange: () => $A, writeFile: () => BI, writeFileEnsuringDirectories: () => nW, zipToModeAwareCache: () => qJ, zipWith: () => kU }); var uxe = gt({ "src/typescript/_namespaces/ts.ts"() { "use strict"; fa(), r7(), Fr(), HG() } }), dJe = hs({ "src/typescript/typescript.ts"(e, t) { uxe(), uxe(), typeof console < "u" && (L.loggingHost = { log(r, i) { switch (r) { case 1: return console.error(i); case 2: return console.warn(i); case 3: return console.log(i); case 4: return console.log(i) } } }), t.exports = lxe } }); return dJe()
+        })(); typeof IU < "u" && IU.exports && (IU.exports = f0); var Eit = f0.createClassifier, iae = f0.createLanguageService, Tit = f0.displayPartsToString, Sit = f0.EndOfLineState, xit = f0.flattenDiagnosticMessageText, Ait = f0.IndentStyle, uA = f0.ScriptKind, Cit = f0.ScriptTarget, Iit = f0.TokenClass, aae = f0; var $i = {}; $i["lib.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es5" />
+/// <reference lib="dom" />
+/// <reference lib="webworker.importscripts" />
+/// <reference lib="scripthost" />
+`; $i["lib.decorators.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/**
+ * The decorator context types provided to class element decorators.
+ */
+type ClassMemberDecoratorContext =
+    | ClassMethodDecoratorContext
+    | ClassGetterDecoratorContext
+    | ClassSetterDecoratorContext
+    | ClassFieldDecoratorContext
+    | ClassAccessorDecoratorContext
+    ;
+
+/**
+ * The decorator context types provided to any decorator.
+ */
+type DecoratorContext =
+    | ClassDecoratorContext
+    | ClassMemberDecoratorContext
+    ;
+
+/**
+ * Context provided to a class decorator.
+ * @template Class The type of the decorated class associated with this context.
+ */
+interface ClassDecoratorContext<
+    Class extends abstract new (...args: any) => any = abstract new (...args: any) => any,
+> {
+    /** The kind of element that was decorated. */
+    readonly kind: "class";
+
+    /** The name of the decorated class. */
+    readonly name: string | undefined;
+
+    /**
+     * Adds a callback to be invoked after the class definition has been finalized.
+     *
+     * @example
+     * \`\`\`ts
+     * function customElement(name: string): ClassDecoratorFunction {
+     *   return (target, context) => {
+     *     context.addInitializer(function () {
+     *       customElements.define(name, this);
+     *     });
+     *   }
+     * }
+     *
+     * @customElement("my-element")
+     * class MyElement {}
+     * \`\`\`
+     */
+    addInitializer(initializer: (this: Class) => void): void;
+}
+
+/**
+ * Context provided to a class method decorator.
+ * @template This The type on which the class element will be defined. For a static class element, this will be
+ * the type of the constructor. For a non-static class element, this will be the type of the instance.
+ * @template Value The type of the decorated class method.
+ */
+interface ClassMethodDecoratorContext<
+    This = unknown,
+    Value extends (this: This, ...args: any) => any = (this: This, ...args: any) => any,
+> {
+    /** The kind of class element that was decorated. */
+    readonly kind: "method";
+
+    /** The name of the decorated class element. */
+    readonly name: string | symbol;
+
+    /** A value indicating whether the class element is a static (\`true\`) or instance (\`false\`) element. */
+    readonly static: boolean;
+
+    /** A value indicating whether the class element has a private name. */
+    readonly private: boolean;
+
+    /** An object that can be used to access the current value of the class element at runtime. */
+    readonly access: {
+        /**
+         * Determines whether an object has a property with the same name as the decorated element.
+         */
+        has(object: This): boolean;
+        /**
+         * Gets the current value of the method from the provided object.
+         *
+         * @example
+         * let fn = context.access.get(instance);
+         */
+        get(object: This): Value;
+    };
+
+    /**
+     * Adds a callback to be invoked either before static initializers are run (when
+     * decorating a \`static\` element), or before instance initializers are run (when
+     * decorating a non-\`static\` element).
+     *
+     * @example
+     * \`\`\`ts
+     * const bound: ClassMethodDecoratorFunction = (value, context) {
+     *   if (context.private) throw new TypeError("Not supported on private methods.");
+     *   context.addInitializer(function () {
+     *     this[context.name] = this[context.name].bind(this);
+     *   });
+     * }
+     *
+     * class C {
+     *   message = "Hello";
+     *
+     *   @bound
+     *   m() {
+     *     console.log(this.message);
+     *   }
+     * }
+     * \`\`\`
+     */
+    addInitializer(initializer: (this: This) => void): void;
+}
+
+/**
+ * Context provided to a class getter decorator.
+ * @template This The type on which the class element will be defined. For a static class element, this will be
+ * the type of the constructor. For a non-static class element, this will be the type of the instance.
+ * @template Value The property type of the decorated class getter.
+ */
+interface ClassGetterDecoratorContext<
+    This = unknown,
+    Value = unknown,
+> {
+    /** The kind of class element that was decorated. */
+    readonly kind: "getter";
+
+    /** The name of the decorated class element. */
+    readonly name: string | symbol;
+
+    /** A value indicating whether the class element is a static (\`true\`) or instance (\`false\`) element. */
+    readonly static: boolean;
+
+    /** A value indicating whether the class element has a private name. */
+    readonly private: boolean;
+
+    /** An object that can be used to access the current value of the class element at runtime. */
+    readonly access: {
+        /**
+         * Determines whether an object has a property with the same name as the decorated element.
+         */
+        has(object: This): boolean;
+        /**
+         * Invokes the getter on the provided object.
+         *
+         * @example
+         * let value = context.access.get(instance);
+         */
+        get(object: This): Value;
+    };
+
+    /**
+     * Adds a callback to be invoked either before static initializers are run (when
+     * decorating a \`static\` element), or before instance initializers are run (when
+     * decorating a non-\`static\` element).
+     */
+    addInitializer(initializer: (this: This) => void): void;
+}
+
+/**
+ * Context provided to a class setter decorator.
+ * @template This The type on which the class element will be defined. For a static class element, this will be
+ * the type of the constructor. For a non-static class element, this will be the type of the instance.
+ * @template Value The type of the decorated class setter.
+ */
+interface ClassSetterDecoratorContext<
+    This = unknown,
+    Value = unknown,
+> {
+    /** The kind of class element that was decorated. */
+    readonly kind: "setter";
+
+    /** The name of the decorated class element. */
+    readonly name: string | symbol;
+
+    /** A value indicating whether the class element is a static (\`true\`) or instance (\`false\`) element. */
+    readonly static: boolean;
+
+    /** A value indicating whether the class element has a private name. */
+    readonly private: boolean;
+
+    /** An object that can be used to access the current value of the class element at runtime. */
+    readonly access: {
+        /**
+         * Determines whether an object has a property with the same name as the decorated element.
+         */
+        has(object: This): boolean;
+        /**
+         * Invokes the setter on the provided object.
+         *
+         * @example
+         * context.access.set(instance, value);
+         */
+        set(object: This, value: Value): void;
+    };
+
+    /**
+     * Adds a callback to be invoked either before static initializers are run (when
+     * decorating a \`static\` element), or before instance initializers are run (when
+     * decorating a non-\`static\` element).
+     */
+    addInitializer(initializer: (this: This) => void): void;
+}
+
+/**
+ * Context provided to a class \`accessor\` field decorator.
+ * @template This The type on which the class element will be defined. For a static class element, this will be
+ * the type of the constructor. For a non-static class element, this will be the type of the instance.
+ * @template Value The type of decorated class field.
+ */
+interface ClassAccessorDecoratorContext<
+    This = unknown,
+    Value = unknown,
+> {
+    /** The kind of class element that was decorated. */
+    readonly kind: "accessor";
+
+    /** The name of the decorated class element. */
+    readonly name: string | symbol;
+
+    /** A value indicating whether the class element is a static (\`true\`) or instance (\`false\`) element. */
+    readonly static: boolean;
+
+    /** A value indicating whether the class element has a private name. */
+    readonly private: boolean;
+
+    /** An object that can be used to access the current value of the class element at runtime. */
+    readonly access: {
+        /**
+         * Determines whether an object has a property with the same name as the decorated element.
+         */
+        has(object: This): boolean;
+
+        /**
+         * Invokes the getter on the provided object.
+         *
+         * @example
+         * let value = context.access.get(instance);
+         */
+        get(object: This): Value;
+
+        /**
+         * Invokes the setter on the provided object.
+         *
+         * @example
+         * context.access.set(instance, value);
+         */
+        set(object: This, value: Value): void;
+    };
+
+    /**
+     * Adds a callback to be invoked either before static initializers are run (when
+     * decorating a \`static\` element), or before instance initializers are run (when
+     * decorating a non-\`static\` element).
+     */
+    addInitializer(initializer: (this: This) => void): void;
+}
+
+/**
+ * Describes the target provided to class \`accessor\` field decorators.
+ * @template This The \`this\` type to which the target applies.
+ * @template Value The property type for the class \`accessor\` field.
+ */
+interface ClassAccessorDecoratorTarget<This, Value> {
+    /**
+     * Invokes the getter that was defined prior to decorator application.
+     *
+     * @example
+     * let value = target.get.call(instance);
+     */
+    get(this: This): Value;
+
+    /**
+     * Invokes the setter that was defined prior to decorator application.
+     *
+     * @example
+     * target.set.call(instance, value);
+     */
+    set(this: This, value: Value): void;
+}
+
+/**
+ * Describes the allowed return value from a class \`accessor\` field decorator.
+ * @template This The \`this\` type to which the target applies.
+ * @template Value The property type for the class \`accessor\` field.
+ */
+interface ClassAccessorDecoratorResult<This, Value> {
+    /**
+     * An optional replacement getter function. If not provided, the existing getter function is used instead.
+     */
+    get?(this: This): Value;
+
+    /**
+     * An optional replacement setter function. If not provided, the existing setter function is used instead.
+     */
+    set?(this: This, value: Value): void;
+
+    /**
+     * An optional initializer mutator that is invoked when the underlying field initializer is evaluated.
+     * @param value The incoming initializer value.
+     * @returns The replacement initializer value.
+     */
+    init?(this: This, value: Value): Value;
+}
+
+/**
+ * Context provided to a class field decorator.
+ * @template This The type on which the class element will be defined. For a static class element, this will be
+ * the type of the constructor. For a non-static class element, this will be the type of the instance.
+ * @template Value The type of the decorated class field.
+ */
+interface ClassFieldDecoratorContext<
+    This = unknown,
+    Value = unknown,
+> {
+    /** The kind of class element that was decorated. */
+    readonly kind: "field";
+
+    /** The name of the decorated class element. */
+    readonly name: string | symbol;
+
+    /** A value indicating whether the class element is a static (\`true\`) or instance (\`false\`) element. */
+    readonly static: boolean;
+
+    /** A value indicating whether the class element has a private name. */
+    readonly private: boolean;
+
+    /** An object that can be used to access the current value of the class element at runtime. */
+    readonly access: {
+        /**
+         * Determines whether an object has a property with the same name as the decorated element.
+         */
+        has(object: This): boolean;
+
+        /**
+         * Gets the value of the field on the provided object.
+         */
+        get(object: This): Value;
+
+        /**
+         * Sets the value of the field on the provided object.
+         */
+        set(object: This, value: Value): void;
+    };
+
+    /**
+     * Adds a callback to be invoked either before static initializers are run (when
+     * decorating a \`static\` element), or before instance initializers are run (when
+     * decorating a non-\`static\` element).
+     */
+    addInitializer(initializer: (this: This) => void): void;
+}
+`; $i["lib.decorators.legacy.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;
+declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
+declare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;
+declare type ParameterDecorator = (target: Object, propertyKey: string | symbol, parameterIndex: number) => void;
+`; $i["lib.dom.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/////////////////////////////
+/// Window APIs
+/////////////////////////////
+
+interface AddEventListenerOptions extends EventListenerOptions {
+    once?: boolean;
+    passive?: boolean;
+    signal?: AbortSignal;
+}
+
+interface AesCbcParams extends Algorithm {
+    iv: BufferSource;
+}
+
+interface AesCtrParams extends Algorithm {
+    counter: BufferSource;
+    length: number;
+}
+
+interface AesDerivedKeyParams extends Algorithm {
+    length: number;
+}
+
+interface AesGcmParams extends Algorithm {
+    additionalData?: BufferSource;
+    iv: BufferSource;
+    tagLength?: number;
+}
+
+interface AesKeyAlgorithm extends KeyAlgorithm {
+    length: number;
+}
+
+interface AesKeyGenParams extends Algorithm {
+    length: number;
+}
+
+interface Algorithm {
+    name: string;
+}
+
+interface AnalyserOptions extends AudioNodeOptions {
+    fftSize?: number;
+    maxDecibels?: number;
+    minDecibels?: number;
+    smoothingTimeConstant?: number;
+}
+
+interface AnimationEventInit extends EventInit {
+    animationName?: string;
+    elapsedTime?: number;
+    pseudoElement?: string;
+}
+
+interface AnimationPlaybackEventInit extends EventInit {
+    currentTime?: CSSNumberish | null;
+    timelineTime?: CSSNumberish | null;
+}
+
+interface AssignedNodesOptions {
+    flatten?: boolean;
+}
+
+interface AudioBufferOptions {
+    length: number;
+    numberOfChannels?: number;
+    sampleRate: number;
+}
+
+interface AudioBufferSourceOptions {
+    buffer?: AudioBuffer | null;
+    detune?: number;
+    loop?: boolean;
+    loopEnd?: number;
+    loopStart?: number;
+    playbackRate?: number;
+}
+
+interface AudioConfiguration {
+    bitrate?: number;
+    channels?: string;
+    contentType: string;
+    samplerate?: number;
+    spatialRendering?: boolean;
+}
+
+interface AudioContextOptions {
+    latencyHint?: AudioContextLatencyCategory | number;
+    sampleRate?: number;
+}
+
+interface AudioNodeOptions {
+    channelCount?: number;
+    channelCountMode?: ChannelCountMode;
+    channelInterpretation?: ChannelInterpretation;
+}
+
+interface AudioProcessingEventInit extends EventInit {
+    inputBuffer: AudioBuffer;
+    outputBuffer: AudioBuffer;
+    playbackTime: number;
+}
+
+interface AudioTimestamp {
+    contextTime?: number;
+    performanceTime?: DOMHighResTimeStamp;
+}
+
+interface AudioWorkletNodeOptions extends AudioNodeOptions {
+    numberOfInputs?: number;
+    numberOfOutputs?: number;
+    outputChannelCount?: number[];
+    parameterData?: Record<string, number>;
+    processorOptions?: any;
+}
+
+interface AuthenticationExtensionsClientInputs {
+    appid?: string;
+    credProps?: boolean;
+    hmacCreateSecret?: boolean;
+}
+
+interface AuthenticationExtensionsClientOutputs {
+    appid?: boolean;
+    credProps?: CredentialPropertiesOutput;
+    hmacCreateSecret?: boolean;
+}
+
+interface AuthenticatorSelectionCriteria {
+    authenticatorAttachment?: AuthenticatorAttachment;
+    requireResidentKey?: boolean;
+    residentKey?: ResidentKeyRequirement;
+    userVerification?: UserVerificationRequirement;
+}
+
+interface BiquadFilterOptions extends AudioNodeOptions {
+    Q?: number;
+    detune?: number;
+    frequency?: number;
+    gain?: number;
+    type?: BiquadFilterType;
+}
+
+interface BlobEventInit {
+    data: Blob;
+    timecode?: DOMHighResTimeStamp;
+}
+
+interface BlobPropertyBag {
+    endings?: EndingType;
+    type?: string;
+}
+
+interface CSSStyleSheetInit {
+    baseURL?: string;
+    disabled?: boolean;
+    media?: MediaList | string;
+}
+
+interface CacheQueryOptions {
+    ignoreMethod?: boolean;
+    ignoreSearch?: boolean;
+    ignoreVary?: boolean;
+}
+
+interface CanvasRenderingContext2DSettings {
+    alpha?: boolean;
+    colorSpace?: PredefinedColorSpace;
+    desynchronized?: boolean;
+    willReadFrequently?: boolean;
+}
+
+interface ChannelMergerOptions extends AudioNodeOptions {
+    numberOfInputs?: number;
+}
+
+interface ChannelSplitterOptions extends AudioNodeOptions {
+    numberOfOutputs?: number;
+}
+
+interface CheckVisibilityOptions {
+    checkOpacity?: boolean;
+    checkVisibilityCSS?: boolean;
+}
+
+interface ClientQueryOptions {
+    includeUncontrolled?: boolean;
+    type?: ClientTypes;
+}
+
+interface ClipboardEventInit extends EventInit {
+    clipboardData?: DataTransfer | null;
+}
+
+interface ClipboardItemOptions {
+    presentationStyle?: PresentationStyle;
+}
+
+interface CloseEventInit extends EventInit {
+    code?: number;
+    reason?: string;
+    wasClean?: boolean;
+}
+
+interface CompositionEventInit extends UIEventInit {
+    data?: string;
+}
+
+interface ComputedEffectTiming extends EffectTiming {
+    activeDuration?: CSSNumberish;
+    currentIteration?: number | null;
+    endTime?: CSSNumberish;
+    localTime?: CSSNumberish | null;
+    progress?: number | null;
+    startTime?: CSSNumberish;
+}
+
+interface ComputedKeyframe {
+    composite: CompositeOperationOrAuto;
+    computedOffset: number;
+    easing: string;
+    offset: number | null;
+    [property: string]: string | number | null | undefined;
+}
+
+interface ConstantSourceOptions {
+    offset?: number;
+}
+
+interface ConstrainBooleanParameters {
+    exact?: boolean;
+    ideal?: boolean;
+}
+
+interface ConstrainDOMStringParameters {
+    exact?: string | string[];
+    ideal?: string | string[];
+}
+
+interface ConstrainDoubleRange extends DoubleRange {
+    exact?: number;
+    ideal?: number;
+}
+
+interface ConstrainULongRange extends ULongRange {
+    exact?: number;
+    ideal?: number;
+}
+
+interface ConvolverOptions extends AudioNodeOptions {
+    buffer?: AudioBuffer | null;
+    disableNormalization?: boolean;
+}
+
+interface CredentialCreationOptions {
+    publicKey?: PublicKeyCredentialCreationOptions;
+    signal?: AbortSignal;
+}
+
+interface CredentialPropertiesOutput {
+    rk?: boolean;
+}
+
+interface CredentialRequestOptions {
+    mediation?: CredentialMediationRequirement;
+    publicKey?: PublicKeyCredentialRequestOptions;
+    signal?: AbortSignal;
+}
+
+interface CryptoKeyPair {
+    privateKey: CryptoKey;
+    publicKey: CryptoKey;
+}
+
+interface CustomEventInit<T = any> extends EventInit {
+    detail?: T;
+}
+
+interface DOMMatrix2DInit {
+    a?: number;
+    b?: number;
+    c?: number;
+    d?: number;
+    e?: number;
+    f?: number;
+    m11?: number;
+    m12?: number;
+    m21?: number;
+    m22?: number;
+    m41?: number;
+    m42?: number;
+}
+
+interface DOMMatrixInit extends DOMMatrix2DInit {
+    is2D?: boolean;
+    m13?: number;
+    m14?: number;
+    m23?: number;
+    m24?: number;
+    m31?: number;
+    m32?: number;
+    m33?: number;
+    m34?: number;
+    m43?: number;
+    m44?: number;
+}
+
+interface DOMPointInit {
+    w?: number;
+    x?: number;
+    y?: number;
+    z?: number;
+}
+
+interface DOMQuadInit {
+    p1?: DOMPointInit;
+    p2?: DOMPointInit;
+    p3?: DOMPointInit;
+    p4?: DOMPointInit;
+}
+
+interface DOMRectInit {
+    height?: number;
+    width?: number;
+    x?: number;
+    y?: number;
+}
+
+interface DelayOptions extends AudioNodeOptions {
+    delayTime?: number;
+    maxDelayTime?: number;
+}
+
+interface DeviceMotionEventAccelerationInit {
+    x?: number | null;
+    y?: number | null;
+    z?: number | null;
+}
+
+interface DeviceMotionEventInit extends EventInit {
+    acceleration?: DeviceMotionEventAccelerationInit;
+    accelerationIncludingGravity?: DeviceMotionEventAccelerationInit;
+    interval?: number;
+    rotationRate?: DeviceMotionEventRotationRateInit;
+}
+
+interface DeviceMotionEventRotationRateInit {
+    alpha?: number | null;
+    beta?: number | null;
+    gamma?: number | null;
+}
+
+interface DeviceOrientationEventInit extends EventInit {
+    absolute?: boolean;
+    alpha?: number | null;
+    beta?: number | null;
+    gamma?: number | null;
+}
+
+interface DisplayMediaStreamOptions {
+    audio?: boolean | MediaTrackConstraints;
+    video?: boolean | MediaTrackConstraints;
+}
+
+interface DocumentTimelineOptions {
+    originTime?: DOMHighResTimeStamp;
+}
+
+interface DoubleRange {
+    max?: number;
+    min?: number;
+}
+
+interface DragEventInit extends MouseEventInit {
+    dataTransfer?: DataTransfer | null;
+}
+
+interface DynamicsCompressorOptions extends AudioNodeOptions {
+    attack?: number;
+    knee?: number;
+    ratio?: number;
+    release?: number;
+    threshold?: number;
+}
+
+interface EcKeyAlgorithm extends KeyAlgorithm {
+    namedCurve: NamedCurve;
+}
+
+interface EcKeyGenParams extends Algorithm {
+    namedCurve: NamedCurve;
+}
+
+interface EcKeyImportParams extends Algorithm {
+    namedCurve: NamedCurve;
+}
+
+interface EcdhKeyDeriveParams extends Algorithm {
+    public: CryptoKey;
+}
+
+interface EcdsaParams extends Algorithm {
+    hash: HashAlgorithmIdentifier;
+}
+
+interface EffectTiming {
+    delay?: number;
+    direction?: PlaybackDirection;
+    duration?: number | string;
+    easing?: string;
+    endDelay?: number;
+    fill?: FillMode;
+    iterationStart?: number;
+    iterations?: number;
+    playbackRate?: number;
+}
+
+interface ElementCreationOptions {
+    is?: string;
+}
+
+interface ElementDefinitionOptions {
+    extends?: string;
+}
+
+interface ErrorEventInit extends EventInit {
+    colno?: number;
+    error?: any;
+    filename?: string;
+    lineno?: number;
+    message?: string;
+}
+
+interface EventInit {
+    bubbles?: boolean;
+    cancelable?: boolean;
+    composed?: boolean;
+}
+
+interface EventListenerOptions {
+    capture?: boolean;
+}
+
+interface EventModifierInit extends UIEventInit {
+    altKey?: boolean;
+    ctrlKey?: boolean;
+    metaKey?: boolean;
+    modifierAltGraph?: boolean;
+    modifierCapsLock?: boolean;
+    modifierFn?: boolean;
+    modifierFnLock?: boolean;
+    modifierHyper?: boolean;
+    modifierNumLock?: boolean;
+    modifierScrollLock?: boolean;
+    modifierSuper?: boolean;
+    modifierSymbol?: boolean;
+    modifierSymbolLock?: boolean;
+    shiftKey?: boolean;
+}
+
+interface EventSourceInit {
+    withCredentials?: boolean;
+}
+
+interface FilePropertyBag extends BlobPropertyBag {
+    lastModified?: number;
+}
+
+interface FileSystemFlags {
+    create?: boolean;
+    exclusive?: boolean;
+}
+
+interface FileSystemGetDirectoryOptions {
+    create?: boolean;
+}
+
+interface FileSystemGetFileOptions {
+    create?: boolean;
+}
+
+interface FileSystemRemoveOptions {
+    recursive?: boolean;
+}
+
+interface FocusEventInit extends UIEventInit {
+    relatedTarget?: EventTarget | null;
+}
+
+interface FocusOptions {
+    preventScroll?: boolean;
+}
+
+interface FontFaceDescriptors {
+    ascentOverride?: string;
+    descentOverride?: string;
+    display?: FontDisplay;
+    featureSettings?: string;
+    lineGapOverride?: string;
+    stretch?: string;
+    style?: string;
+    unicodeRange?: string;
+    variant?: string;
+    weight?: string;
+}
+
+interface FontFaceSetLoadEventInit extends EventInit {
+    fontfaces?: FontFace[];
+}
+
+interface FormDataEventInit extends EventInit {
+    formData: FormData;
+}
+
+interface FullscreenOptions {
+    navigationUI?: FullscreenNavigationUI;
+}
+
+interface GainOptions extends AudioNodeOptions {
+    gain?: number;
+}
+
+interface GamepadEventInit extends EventInit {
+    gamepad: Gamepad;
+}
+
+interface GetAnimationsOptions {
+    subtree?: boolean;
+}
+
+interface GetNotificationOptions {
+    tag?: string;
+}
+
+interface GetRootNodeOptions {
+    composed?: boolean;
+}
+
+interface HashChangeEventInit extends EventInit {
+    newURL?: string;
+    oldURL?: string;
+}
+
+interface HkdfParams extends Algorithm {
+    hash: HashAlgorithmIdentifier;
+    info: BufferSource;
+    salt: BufferSource;
+}
+
+interface HmacImportParams extends Algorithm {
+    hash: HashAlgorithmIdentifier;
+    length?: number;
+}
+
+interface HmacKeyAlgorithm extends KeyAlgorithm {
+    hash: KeyAlgorithm;
+    length: number;
+}
+
+interface HmacKeyGenParams extends Algorithm {
+    hash: HashAlgorithmIdentifier;
+    length?: number;
+}
+
+interface IDBDatabaseInfo {
+    name?: string;
+    version?: number;
+}
+
+interface IDBIndexParameters {
+    multiEntry?: boolean;
+    unique?: boolean;
+}
+
+interface IDBObjectStoreParameters {
+    autoIncrement?: boolean;
+    keyPath?: string | string[] | null;
+}
+
+interface IDBTransactionOptions {
+    durability?: IDBTransactionDurability;
+}
+
+interface IDBVersionChangeEventInit extends EventInit {
+    newVersion?: number | null;
+    oldVersion?: number;
+}
+
+interface IIRFilterOptions extends AudioNodeOptions {
+    feedback: number[];
+    feedforward: number[];
+}
+
+interface IdleRequestOptions {
+    timeout?: number;
+}
+
+interface ImageBitmapOptions {
+    colorSpaceConversion?: ColorSpaceConversion;
+    imageOrientation?: ImageOrientation;
+    premultiplyAlpha?: PremultiplyAlpha;
+    resizeHeight?: number;
+    resizeQuality?: ResizeQuality;
+    resizeWidth?: number;
+}
+
+interface ImageBitmapRenderingContextSettings {
+    alpha?: boolean;
+}
+
+interface ImageDataSettings {
+    colorSpace?: PredefinedColorSpace;
+}
+
+interface ImageEncodeOptions {
+    quality?: number;
+    type?: string;
+}
+
+interface ImportMeta {
+    url: string;
+}
+
+interface InputEventInit extends UIEventInit {
+    data?: string | null;
+    dataTransfer?: DataTransfer | null;
+    inputType?: string;
+    isComposing?: boolean;
+    targetRanges?: StaticRange[];
+}
+
+interface IntersectionObserverEntryInit {
+    boundingClientRect: DOMRectInit;
+    intersectionRatio: number;
+    intersectionRect: DOMRectInit;
+    isIntersecting: boolean;
+    rootBounds: DOMRectInit | null;
+    target: Element;
+    time: DOMHighResTimeStamp;
+}
+
+interface IntersectionObserverInit {
+    root?: Element | Document | null;
+    rootMargin?: string;
+    threshold?: number | number[];
+}
+
+interface JsonWebKey {
+    alg?: string;
+    crv?: string;
+    d?: string;
+    dp?: string;
+    dq?: string;
+    e?: string;
+    ext?: boolean;
+    k?: string;
+    key_ops?: string[];
+    kty?: string;
+    n?: string;
+    oth?: RsaOtherPrimesInfo[];
+    p?: string;
+    q?: string;
+    qi?: string;
+    use?: string;
+    x?: string;
+    y?: string;
+}
+
+interface KeyAlgorithm {
+    name: string;
+}
+
+interface KeyboardEventInit extends EventModifierInit {
+    /** @deprecated */
+    charCode?: number;
+    code?: string;
+    isComposing?: boolean;
+    key?: string;
+    /** @deprecated */
+    keyCode?: number;
+    location?: number;
+    repeat?: boolean;
+}
+
+interface Keyframe {
+    composite?: CompositeOperationOrAuto;
+    easing?: string;
+    offset?: number | null;
+    [property: string]: string | number | null | undefined;
+}
+
+interface KeyframeAnimationOptions extends KeyframeEffectOptions {
+    id?: string;
+}
+
+interface KeyframeEffectOptions extends EffectTiming {
+    composite?: CompositeOperation;
+    iterationComposite?: IterationCompositeOperation;
+    pseudoElement?: string | null;
+}
+
+interface LockInfo {
+    clientId?: string;
+    mode?: LockMode;
+    name?: string;
+}
+
+interface LockManagerSnapshot {
+    held?: LockInfo[];
+    pending?: LockInfo[];
+}
+
+interface LockOptions {
+    ifAvailable?: boolean;
+    mode?: LockMode;
+    signal?: AbortSignal;
+    steal?: boolean;
+}
+
+interface MIDIConnectionEventInit extends EventInit {
+    port?: MIDIPort;
+}
+
+interface MIDIMessageEventInit extends EventInit {
+    data?: Uint8Array;
+}
+
+interface MIDIOptions {
+    software?: boolean;
+    sysex?: boolean;
+}
+
+interface MediaCapabilitiesDecodingInfo extends MediaCapabilitiesInfo {
+    configuration?: MediaDecodingConfiguration;
+}
+
+interface MediaCapabilitiesEncodingInfo extends MediaCapabilitiesInfo {
+    configuration?: MediaEncodingConfiguration;
+}
+
+interface MediaCapabilitiesInfo {
+    powerEfficient: boolean;
+    smooth: boolean;
+    supported: boolean;
+}
+
+interface MediaConfiguration {
+    audio?: AudioConfiguration;
+    video?: VideoConfiguration;
+}
+
+interface MediaDecodingConfiguration extends MediaConfiguration {
+    type: MediaDecodingType;
+}
+
+interface MediaElementAudioSourceOptions {
+    mediaElement: HTMLMediaElement;
+}
+
+interface MediaEncodingConfiguration extends MediaConfiguration {
+    type: MediaEncodingType;
+}
+
+interface MediaEncryptedEventInit extends EventInit {
+    initData?: ArrayBuffer | null;
+    initDataType?: string;
+}
+
+interface MediaImage {
+    sizes?: string;
+    src: string;
+    type?: string;
+}
+
+interface MediaKeyMessageEventInit extends EventInit {
+    message: ArrayBuffer;
+    messageType: MediaKeyMessageType;
+}
+
+interface MediaKeySystemConfiguration {
+    audioCapabilities?: MediaKeySystemMediaCapability[];
+    distinctiveIdentifier?: MediaKeysRequirement;
+    initDataTypes?: string[];
+    label?: string;
+    persistentState?: MediaKeysRequirement;
+    sessionTypes?: string[];
+    videoCapabilities?: MediaKeySystemMediaCapability[];
+}
+
+interface MediaKeySystemMediaCapability {
+    contentType?: string;
+    encryptionScheme?: string | null;
+    robustness?: string;
+}
+
+interface MediaMetadataInit {
+    album?: string;
+    artist?: string;
+    artwork?: MediaImage[];
+    title?: string;
+}
+
+interface MediaPositionState {
+    duration?: number;
+    playbackRate?: number;
+    position?: number;
+}
+
+interface MediaQueryListEventInit extends EventInit {
+    matches?: boolean;
+    media?: string;
+}
+
+interface MediaRecorderOptions {
+    audioBitsPerSecond?: number;
+    bitsPerSecond?: number;
+    mimeType?: string;
+    videoBitsPerSecond?: number;
+}
+
+interface MediaSessionActionDetails {
+    action: MediaSessionAction;
+    fastSeek?: boolean;
+    seekOffset?: number;
+    seekTime?: number;
+}
+
+interface MediaStreamAudioSourceOptions {
+    mediaStream: MediaStream;
+}
+
+interface MediaStreamConstraints {
+    audio?: boolean | MediaTrackConstraints;
+    peerIdentity?: string;
+    preferCurrentTab?: boolean;
+    video?: boolean | MediaTrackConstraints;
+}
+
+interface MediaStreamTrackEventInit extends EventInit {
+    track: MediaStreamTrack;
+}
+
+interface MediaTrackCapabilities {
+    aspectRatio?: DoubleRange;
+    autoGainControl?: boolean[];
+    channelCount?: ULongRange;
+    deviceId?: string;
+    displaySurface?: string;
+    echoCancellation?: boolean[];
+    facingMode?: string[];
+    frameRate?: DoubleRange;
+    groupId?: string;
+    height?: ULongRange;
+    noiseSuppression?: boolean[];
+    sampleRate?: ULongRange;
+    sampleSize?: ULongRange;
+    width?: ULongRange;
+}
+
+interface MediaTrackConstraintSet {
+    aspectRatio?: ConstrainDouble;
+    autoGainControl?: ConstrainBoolean;
+    channelCount?: ConstrainULong;
+    deviceId?: ConstrainDOMString;
+    displaySurface?: ConstrainDOMString;
+    echoCancellation?: ConstrainBoolean;
+    facingMode?: ConstrainDOMString;
+    frameRate?: ConstrainDouble;
+    groupId?: ConstrainDOMString;
+    height?: ConstrainULong;
+    noiseSuppression?: ConstrainBoolean;
+    sampleRate?: ConstrainULong;
+    sampleSize?: ConstrainULong;
+    width?: ConstrainULong;
+}
+
+interface MediaTrackConstraints extends MediaTrackConstraintSet {
+    advanced?: MediaTrackConstraintSet[];
+}
+
+interface MediaTrackSettings {
+    aspectRatio?: number;
+    autoGainControl?: boolean;
+    channelCount?: number;
+    deviceId?: string;
+    displaySurface?: string;
+    echoCancellation?: boolean;
+    facingMode?: string;
+    frameRate?: number;
+    groupId?: string;
+    height?: number;
+    noiseSuppression?: boolean;
+    sampleRate?: number;
+    sampleSize?: number;
+    width?: number;
+}
+
+interface MediaTrackSupportedConstraints {
+    aspectRatio?: boolean;
+    autoGainControl?: boolean;
+    channelCount?: boolean;
+    deviceId?: boolean;
+    displaySurface?: boolean;
+    echoCancellation?: boolean;
+    facingMode?: boolean;
+    frameRate?: boolean;
+    groupId?: boolean;
+    height?: boolean;
+    noiseSuppression?: boolean;
+    sampleRate?: boolean;
+    sampleSize?: boolean;
+    width?: boolean;
+}
+
+interface MessageEventInit<T = any> extends EventInit {
+    data?: T;
+    lastEventId?: string;
+    origin?: string;
+    ports?: MessagePort[];
+    source?: MessageEventSource | null;
+}
+
+interface MouseEventInit extends EventModifierInit {
+    button?: number;
+    buttons?: number;
+    clientX?: number;
+    clientY?: number;
+    movementX?: number;
+    movementY?: number;
+    relatedTarget?: EventTarget | null;
+    screenX?: number;
+    screenY?: number;
+}
+
+interface MultiCacheQueryOptions extends CacheQueryOptions {
+    cacheName?: string;
+}
+
+interface MutationObserverInit {
+    /** Set to a list of attribute local names (without namespace) if not all attribute mutations need to be observed and attributes is true or omitted. */
+    attributeFilter?: string[];
+    /** Set to true if attributes is true or omitted and target's attribute value before the mutation needs to be recorded. */
+    attributeOldValue?: boolean;
+    /** Set to true if mutations to target's attributes are to be observed. Can be omitted if attributeOldValue or attributeFilter is specified. */
+    attributes?: boolean;
+    /** Set to true if mutations to target's data are to be observed. Can be omitted if characterDataOldValue is specified. */
+    characterData?: boolean;
+    /** Set to true if characterData is set to true or omitted and target's data before the mutation needs to be recorded. */
+    characterDataOldValue?: boolean;
+    /** Set to true if mutations to target's children are to be observed. */
+    childList?: boolean;
+    /** Set to true if mutations to not just target, but also target's descendants are to be observed. */
+    subtree?: boolean;
+}
+
+interface NavigationPreloadState {
+    enabled?: boolean;
+    headerValue?: string;
+}
+
+interface NotificationAction {
+    action: string;
+    icon?: string;
+    title: string;
+}
+
+interface NotificationOptions {
+    actions?: NotificationAction[];
+    badge?: string;
+    body?: string;
+    data?: any;
+    dir?: NotificationDirection;
+    icon?: string;
+    image?: string;
+    lang?: string;
+    renotify?: boolean;
+    requireInteraction?: boolean;
+    silent?: boolean;
+    tag?: string;
+    timestamp?: EpochTimeStamp;
+    vibrate?: VibratePattern;
+}
+
+interface OfflineAudioCompletionEventInit extends EventInit {
+    renderedBuffer: AudioBuffer;
+}
+
+interface OfflineAudioContextOptions {
+    length: number;
+    numberOfChannels?: number;
+    sampleRate: number;
+}
+
+interface OptionalEffectTiming {
+    delay?: number;
+    direction?: PlaybackDirection;
+    duration?: number | string;
+    easing?: string;
+    endDelay?: number;
+    fill?: FillMode;
+    iterationStart?: number;
+    iterations?: number;
+    playbackRate?: number;
+}
+
+interface OscillatorOptions extends AudioNodeOptions {
+    detune?: number;
+    frequency?: number;
+    periodicWave?: PeriodicWave;
+    type?: OscillatorType;
+}
+
+interface PageTransitionEventInit extends EventInit {
+    persisted?: boolean;
+}
+
+interface PannerOptions extends AudioNodeOptions {
+    coneInnerAngle?: number;
+    coneOuterAngle?: number;
+    coneOuterGain?: number;
+    distanceModel?: DistanceModelType;
+    maxDistance?: number;
+    orientationX?: number;
+    orientationY?: number;
+    orientationZ?: number;
+    panningModel?: PanningModelType;
+    positionX?: number;
+    positionY?: number;
+    positionZ?: number;
+    refDistance?: number;
+    rolloffFactor?: number;
+}
+
+interface PaymentCurrencyAmount {
+    currency: string;
+    value: string;
+}
+
+interface PaymentDetailsBase {
+    displayItems?: PaymentItem[];
+    modifiers?: PaymentDetailsModifier[];
+}
+
+interface PaymentDetailsInit extends PaymentDetailsBase {
+    id?: string;
+    total: PaymentItem;
+}
+
+interface PaymentDetailsModifier {
+    additionalDisplayItems?: PaymentItem[];
+    data?: any;
+    supportedMethods: string;
+    total?: PaymentItem;
+}
+
+interface PaymentDetailsUpdate extends PaymentDetailsBase {
+    paymentMethodErrors?: any;
+    total?: PaymentItem;
+}
+
+interface PaymentItem {
+    amount: PaymentCurrencyAmount;
+    label: string;
+    pending?: boolean;
+}
+
+interface PaymentMethodChangeEventInit extends PaymentRequestUpdateEventInit {
+    methodDetails?: any;
+    methodName?: string;
+}
+
+interface PaymentMethodData {
+    data?: any;
+    supportedMethods: string;
+}
+
+interface PaymentRequestUpdateEventInit extends EventInit {
+}
+
+interface PaymentValidationErrors {
+    error?: string;
+    paymentMethod?: any;
+}
+
+interface Pbkdf2Params extends Algorithm {
+    hash: HashAlgorithmIdentifier;
+    iterations: number;
+    salt: BufferSource;
+}
+
+interface PerformanceMarkOptions {
+    detail?: any;
+    startTime?: DOMHighResTimeStamp;
+}
+
+interface PerformanceMeasureOptions {
+    detail?: any;
+    duration?: DOMHighResTimeStamp;
+    end?: string | DOMHighResTimeStamp;
+    start?: string | DOMHighResTimeStamp;
+}
+
+interface PerformanceObserverInit {
+    buffered?: boolean;
+    entryTypes?: string[];
+    type?: string;
+}
+
+interface PeriodicWaveConstraints {
+    disableNormalization?: boolean;
+}
+
+interface PeriodicWaveOptions extends PeriodicWaveConstraints {
+    imag?: number[] | Float32Array;
+    real?: number[] | Float32Array;
+}
+
+interface PermissionDescriptor {
+    name: PermissionName;
+}
+
+interface PictureInPictureEventInit extends EventInit {
+    pictureInPictureWindow: PictureInPictureWindow;
+}
+
+interface PointerEventInit extends MouseEventInit {
+    coalescedEvents?: PointerEvent[];
+    height?: number;
+    isPrimary?: boolean;
+    pointerId?: number;
+    pointerType?: string;
+    predictedEvents?: PointerEvent[];
+    pressure?: number;
+    tangentialPressure?: number;
+    tiltX?: number;
+    tiltY?: number;
+    twist?: number;
+    width?: number;
+}
+
+interface PopStateEventInit extends EventInit {
+    state?: any;
+}
+
+interface PositionOptions {
+    enableHighAccuracy?: boolean;
+    maximumAge?: number;
+    timeout?: number;
+}
+
+interface ProgressEventInit extends EventInit {
+    lengthComputable?: boolean;
+    loaded?: number;
+    total?: number;
+}
+
+interface PromiseRejectionEventInit extends EventInit {
+    promise: Promise<any>;
+    reason?: any;
+}
+
+interface PropertyIndexedKeyframes {
+    composite?: CompositeOperationOrAuto | CompositeOperationOrAuto[];
+    easing?: string | string[];
+    offset?: number | (number | null)[];
+    [property: string]: string | string[] | number | null | (number | null)[] | undefined;
+}
+
+interface PublicKeyCredentialCreationOptions {
+    attestation?: AttestationConveyancePreference;
+    authenticatorSelection?: AuthenticatorSelectionCriteria;
+    challenge: BufferSource;
+    excludeCredentials?: PublicKeyCredentialDescriptor[];
+    extensions?: AuthenticationExtensionsClientInputs;
+    pubKeyCredParams: PublicKeyCredentialParameters[];
+    rp: PublicKeyCredentialRpEntity;
+    timeout?: number;
+    user: PublicKeyCredentialUserEntity;
+}
+
+interface PublicKeyCredentialDescriptor {
+    id: BufferSource;
+    transports?: AuthenticatorTransport[];
+    type: PublicKeyCredentialType;
+}
+
+interface PublicKeyCredentialEntity {
+    name: string;
+}
+
+interface PublicKeyCredentialParameters {
+    alg: COSEAlgorithmIdentifier;
+    type: PublicKeyCredentialType;
+}
+
+interface PublicKeyCredentialRequestOptions {
+    allowCredentials?: PublicKeyCredentialDescriptor[];
+    challenge: BufferSource;
+    extensions?: AuthenticationExtensionsClientInputs;
+    rpId?: string;
+    timeout?: number;
+    userVerification?: UserVerificationRequirement;
+}
+
+interface PublicKeyCredentialRpEntity extends PublicKeyCredentialEntity {
+    id?: string;
+}
+
+interface PublicKeyCredentialUserEntity extends PublicKeyCredentialEntity {
+    displayName: string;
+    id: BufferSource;
+}
+
+interface PushSubscriptionJSON {
+    endpoint?: string;
+    expirationTime?: EpochTimeStamp | null;
+    keys?: Record<string, string>;
+}
+
+interface PushSubscriptionOptionsInit {
+    applicationServerKey?: BufferSource | string | null;
+    userVisibleOnly?: boolean;
+}
+
+interface QueuingStrategy<T = any> {
+    highWaterMark?: number;
+    size?: QueuingStrategySize<T>;
+}
+
+interface QueuingStrategyInit {
+    /**
+     * Creates a new ByteLengthQueuingStrategy with the provided high water mark.
+     *
+     * Note that the provided high water mark will not be validated ahead of time. Instead, if it is negative, NaN, or not a number, the resulting ByteLengthQueuingStrategy will cause the corresponding stream constructor to throw.
+     */
+    highWaterMark: number;
+}
+
+interface RTCAnswerOptions extends RTCOfferAnswerOptions {
+}
+
+interface RTCCertificateExpiration {
+    expires?: number;
+}
+
+interface RTCConfiguration {
+    bundlePolicy?: RTCBundlePolicy;
+    certificates?: RTCCertificate[];
+    iceCandidatePoolSize?: number;
+    iceServers?: RTCIceServer[];
+    iceTransportPolicy?: RTCIceTransportPolicy;
+    rtcpMuxPolicy?: RTCRtcpMuxPolicy;
+}
+
+interface RTCDTMFToneChangeEventInit extends EventInit {
+    tone?: string;
+}
+
+interface RTCDataChannelEventInit extends EventInit {
+    channel: RTCDataChannel;
+}
+
+interface RTCDataChannelInit {
+    id?: number;
+    maxPacketLifeTime?: number;
+    maxRetransmits?: number;
+    negotiated?: boolean;
+    ordered?: boolean;
+    protocol?: string;
+}
+
+interface RTCDtlsFingerprint {
+    algorithm?: string;
+    value?: string;
+}
+
+interface RTCEncodedAudioFrameMetadata {
+    contributingSources?: number[];
+    synchronizationSource?: number;
+}
+
+interface RTCEncodedVideoFrameMetadata {
+    contributingSources?: number[];
+    dependencies?: number[];
+    frameId?: number;
+    height?: number;
+    spatialIndex?: number;
+    synchronizationSource?: number;
+    temporalIndex?: number;
+    width?: number;
+}
+
+interface RTCErrorEventInit extends EventInit {
+    error: RTCError;
+}
+
+interface RTCErrorInit {
+    errorDetail: RTCErrorDetailType;
+    httpRequestStatusCode?: number;
+    receivedAlert?: number;
+    sctpCauseCode?: number;
+    sdpLineNumber?: number;
+    sentAlert?: number;
+}
+
+interface RTCIceCandidateInit {
+    candidate?: string;
+    sdpMLineIndex?: number | null;
+    sdpMid?: string | null;
+    usernameFragment?: string | null;
+}
+
+interface RTCIceCandidatePairStats extends RTCStats {
+    availableIncomingBitrate?: number;
+    availableOutgoingBitrate?: number;
+    bytesReceived?: number;
+    bytesSent?: number;
+    currentRoundTripTime?: number;
+    lastPacketReceivedTimestamp?: DOMHighResTimeStamp;
+    lastPacketSentTimestamp?: DOMHighResTimeStamp;
+    localCandidateId: string;
+    nominated?: boolean;
+    remoteCandidateId: string;
+    requestsReceived?: number;
+    requestsSent?: number;
+    responsesReceived?: number;
+    responsesSent?: number;
+    state: RTCStatsIceCandidatePairState;
+    totalRoundTripTime?: number;
+    transportId: string;
+}
+
+interface RTCIceServer {
+    credential?: string;
+    urls: string | string[];
+    username?: string;
+}
+
+interface RTCInboundRtpStreamStats extends RTCReceivedRtpStreamStats {
+    audioLevel?: number;
+    bytesReceived?: number;
+    concealedSamples?: number;
+    concealmentEvents?: number;
+    decoderImplementation?: string;
+    estimatedPlayoutTimestamp?: DOMHighResTimeStamp;
+    fecPacketsDiscarded?: number;
+    fecPacketsReceived?: number;
+    firCount?: number;
+    frameHeight?: number;
+    frameWidth?: number;
+    framesDecoded?: number;
+    framesDropped?: number;
+    framesPerSecond?: number;
+    framesReceived?: number;
+    headerBytesReceived?: number;
+    insertedSamplesForDeceleration?: number;
+    jitterBufferDelay?: number;
+    jitterBufferEmittedCount?: number;
+    keyFramesDecoded?: number;
+    kind: string;
+    lastPacketReceivedTimestamp?: DOMHighResTimeStamp;
+    nackCount?: number;
+    packetsDiscarded?: number;
+    pliCount?: number;
+    qpSum?: number;
+    remoteId?: string;
+    removedSamplesForAcceleration?: number;
+    silentConcealedSamples?: number;
+    totalAudioEnergy?: number;
+    totalDecodeTime?: number;
+    totalInterFrameDelay?: number;
+    totalProcessingDelay?: number;
+    totalSamplesDuration?: number;
+    totalSamplesReceived?: number;
+    totalSquaredInterFrameDelay?: number;
+}
+
+interface RTCLocalSessionDescriptionInit {
+    sdp?: string;
+    type?: RTCSdpType;
+}
+
+interface RTCOfferAnswerOptions {
+}
+
+interface RTCOfferOptions extends RTCOfferAnswerOptions {
+    iceRestart?: boolean;
+    offerToReceiveAudio?: boolean;
+    offerToReceiveVideo?: boolean;
+}
+
+interface RTCOutboundRtpStreamStats extends RTCSentRtpStreamStats {
+    firCount?: number;
+    frameHeight?: number;
+    frameWidth?: number;
+    framesEncoded?: number;
+    framesPerSecond?: number;
+    framesSent?: number;
+    headerBytesSent?: number;
+    hugeFramesSent?: number;
+    keyFramesEncoded?: number;
+    mediaSourceId?: string;
+    nackCount?: number;
+    pliCount?: number;
+    qpSum?: number;
+    qualityLimitationResolutionChanges?: number;
+    remoteId?: string;
+    retransmittedBytesSent?: number;
+    retransmittedPacketsSent?: number;
+    rid?: string;
+    targetBitrate?: number;
+    totalEncodeTime?: number;
+    totalEncodedBytesTarget?: number;
+    totalPacketSendDelay?: number;
+}
+
+interface RTCPeerConnectionIceErrorEventInit extends EventInit {
+    address?: string | null;
+    errorCode: number;
+    errorText?: string;
+    port?: number | null;
+    url?: string;
+}
+
+interface RTCPeerConnectionIceEventInit extends EventInit {
+    candidate?: RTCIceCandidate | null;
+    url?: string | null;
+}
+
+interface RTCReceivedRtpStreamStats extends RTCRtpStreamStats {
+    jitter?: number;
+    packetsLost?: number;
+    packetsReceived?: number;
+}
+
+interface RTCRtcpParameters {
+    cname?: string;
+    reducedSize?: boolean;
+}
+
+interface RTCRtpCapabilities {
+    codecs: RTCRtpCodecCapability[];
+    headerExtensions: RTCRtpHeaderExtensionCapability[];
+}
+
+interface RTCRtpCodecCapability {
+    channels?: number;
+    clockRate: number;
+    mimeType: string;
+    sdpFmtpLine?: string;
+}
+
+interface RTCRtpCodecParameters {
+    channels?: number;
+    clockRate: number;
+    mimeType: string;
+    payloadType: number;
+    sdpFmtpLine?: string;
+}
+
+interface RTCRtpCodingParameters {
+    rid?: string;
+}
+
+interface RTCRtpContributingSource {
+    audioLevel?: number;
+    rtpTimestamp: number;
+    source: number;
+    timestamp: DOMHighResTimeStamp;
+}
+
+interface RTCRtpEncodingParameters extends RTCRtpCodingParameters {
+    active?: boolean;
+    maxBitrate?: number;
+    maxFramerate?: number;
+    networkPriority?: RTCPriorityType;
+    priority?: RTCPriorityType;
+    scaleResolutionDownBy?: number;
+}
+
+interface RTCRtpHeaderExtensionCapability {
+    uri?: string;
+}
+
+interface RTCRtpHeaderExtensionParameters {
+    encrypted?: boolean;
+    id: number;
+    uri: string;
+}
+
+interface RTCRtpParameters {
+    codecs: RTCRtpCodecParameters[];
+    headerExtensions: RTCRtpHeaderExtensionParameters[];
+    rtcp: RTCRtcpParameters;
+}
+
+interface RTCRtpReceiveParameters extends RTCRtpParameters {
+}
+
+interface RTCRtpSendParameters extends RTCRtpParameters {
+    degradationPreference?: RTCDegradationPreference;
+    encodings: RTCRtpEncodingParameters[];
+    transactionId: string;
+}
+
+interface RTCRtpStreamStats extends RTCStats {
+    codecId?: string;
+    kind: string;
+    ssrc: number;
+    transportId?: string;
+}
+
+interface RTCRtpSynchronizationSource extends RTCRtpContributingSource {
+}
+
+interface RTCRtpTransceiverInit {
+    direction?: RTCRtpTransceiverDirection;
+    sendEncodings?: RTCRtpEncodingParameters[];
+    streams?: MediaStream[];
+}
+
+interface RTCSentRtpStreamStats extends RTCRtpStreamStats {
+    bytesSent?: number;
+    packetsSent?: number;
+}
+
+interface RTCSessionDescriptionInit {
+    sdp?: string;
+    type: RTCSdpType;
+}
+
+interface RTCStats {
+    id: string;
+    timestamp: DOMHighResTimeStamp;
+    type: RTCStatsType;
+}
+
+interface RTCTrackEventInit extends EventInit {
+    receiver: RTCRtpReceiver;
+    streams?: MediaStream[];
+    track: MediaStreamTrack;
+    transceiver: RTCRtpTransceiver;
+}
+
+interface RTCTransportStats extends RTCStats {
+    bytesReceived?: number;
+    bytesSent?: number;
+    dtlsCipher?: string;
+    dtlsState: RTCDtlsTransportState;
+    localCertificateId?: string;
+    remoteCertificateId?: string;
+    selectedCandidatePairId?: string;
+    srtpCipher?: string;
+    tlsVersion?: string;
+}
+
+interface ReadableStreamGetReaderOptions {
+    /**
+     * Creates a ReadableStreamBYOBReader and locks the stream to the new reader.
+     *
+     * This call behaves the same way as the no-argument variant, except that it only works on readable byte streams, i.e. streams which were constructed specifically with the ability to handle "bring your own buffer" reading. The returned BYOB reader provides the ability to directly read individual chunks from the stream via its read() method, into developer-supplied buffers, allowing more precise control over allocation.
+     */
+    mode?: ReadableStreamReaderMode;
+}
+
+interface ReadableStreamReadDoneResult<T> {
+    done: true;
+    value?: T;
+}
+
+interface ReadableStreamReadValueResult<T> {
+    done: false;
+    value: T;
+}
+
+interface ReadableWritablePair<R = any, W = any> {
+    readable: ReadableStream<R>;
+    /**
+     * Provides a convenient, chainable way of piping this readable stream through a transform stream (or any other { writable, readable } pair). It simply pipes the stream into the writable side of the supplied pair, and returns the readable side for further use.
+     *
+     * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader.
+     */
+    writable: WritableStream<W>;
+}
+
+interface RegistrationOptions {
+    scope?: string;
+    type?: WorkerType;
+    updateViaCache?: ServiceWorkerUpdateViaCache;
+}
+
+interface RequestInit {
+    /** A BodyInit object or null to set request's body. */
+    body?: BodyInit | null;
+    /** A string indicating how the request will interact with the browser's cache to set request's cache. */
+    cache?: RequestCache;
+    /** A string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. Sets request's credentials. */
+    credentials?: RequestCredentials;
+    /** A Headers object, an object literal, or an array of two-item arrays to set request's headers. */
+    headers?: HeadersInit;
+    /** A cryptographic hash of the resource to be fetched by request. Sets request's integrity. */
+    integrity?: string;
+    /** A boolean to set request's keepalive. */
+    keepalive?: boolean;
+    /** A string to set request's method. */
+    method?: string;
+    /** A string to indicate whether the request will use CORS, or will be restricted to same-origin URLs. Sets request's mode. */
+    mode?: RequestMode;
+    /** A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. */
+    redirect?: RequestRedirect;
+    /** A string whose value is a same-origin URL, "about:client", or the empty string, to set request's referrer. */
+    referrer?: string;
+    /** A referrer policy to set request's referrerPolicy. */
+    referrerPolicy?: ReferrerPolicy;
+    /** An AbortSignal to set request's signal. */
+    signal?: AbortSignal | null;
+    /** Can only be null. Used to disassociate request from any Window. */
+    window?: null;
+}
+
+interface ResizeObserverOptions {
+    box?: ResizeObserverBoxOptions;
+}
+
+interface ResponseInit {
+    headers?: HeadersInit;
+    status?: number;
+    statusText?: string;
+}
+
+interface RsaHashedImportParams extends Algorithm {
+    hash: HashAlgorithmIdentifier;
+}
+
+interface RsaHashedKeyAlgorithm extends RsaKeyAlgorithm {
+    hash: KeyAlgorithm;
+}
+
+interface RsaHashedKeyGenParams extends RsaKeyGenParams {
+    hash: HashAlgorithmIdentifier;
+}
+
+interface RsaKeyAlgorithm extends KeyAlgorithm {
+    modulusLength: number;
+    publicExponent: BigInteger;
+}
+
+interface RsaKeyGenParams extends Algorithm {
+    modulusLength: number;
+    publicExponent: BigInteger;
+}
+
+interface RsaOaepParams extends Algorithm {
+    label?: BufferSource;
+}
+
+interface RsaOtherPrimesInfo {
+    d?: string;
+    r?: string;
+    t?: string;
+}
+
+interface RsaPssParams extends Algorithm {
+    saltLength: number;
+}
+
+interface SVGBoundingBoxOptions {
+    clipped?: boolean;
+    fill?: boolean;
+    markers?: boolean;
+    stroke?: boolean;
+}
+
+interface ScrollIntoViewOptions extends ScrollOptions {
+    block?: ScrollLogicalPosition;
+    inline?: ScrollLogicalPosition;
+}
+
+interface ScrollOptions {
+    behavior?: ScrollBehavior;
+}
+
+interface ScrollToOptions extends ScrollOptions {
+    left?: number;
+    top?: number;
+}
+
+interface SecurityPolicyViolationEventInit extends EventInit {
+    blockedURI?: string;
+    columnNumber?: number;
+    disposition: SecurityPolicyViolationEventDisposition;
+    documentURI: string;
+    effectiveDirective: string;
+    lineNumber?: number;
+    originalPolicy: string;
+    referrer?: string;
+    sample?: string;
+    sourceFile?: string;
+    statusCode: number;
+    violatedDirective: string;
+}
+
+interface ShadowRootInit {
+    delegatesFocus?: boolean;
+    mode: ShadowRootMode;
+    slotAssignment?: SlotAssignmentMode;
+}
+
+interface ShareData {
+    files?: File[];
+    text?: string;
+    title?: string;
+    url?: string;
+}
+
+interface SpeechSynthesisErrorEventInit extends SpeechSynthesisEventInit {
+    error: SpeechSynthesisErrorCode;
+}
+
+interface SpeechSynthesisEventInit extends EventInit {
+    charIndex?: number;
+    charLength?: number;
+    elapsedTime?: number;
+    name?: string;
+    utterance: SpeechSynthesisUtterance;
+}
+
+interface StaticRangeInit {
+    endContainer: Node;
+    endOffset: number;
+    startContainer: Node;
+    startOffset: number;
+}
+
+interface StereoPannerOptions extends AudioNodeOptions {
+    pan?: number;
+}
+
+interface StorageEstimate {
+    quota?: number;
+    usage?: number;
+}
+
+interface StorageEventInit extends EventInit {
+    key?: string | null;
+    newValue?: string | null;
+    oldValue?: string | null;
+    storageArea?: Storage | null;
+    url?: string;
+}
+
+interface StreamPipeOptions {
+    preventAbort?: boolean;
+    preventCancel?: boolean;
+    /**
+     * Pipes this readable stream to a given writable stream destination. The way in which the piping process behaves under various error conditions can be customized with a number of passed options. It returns a promise that fulfills when the piping process completes successfully, or rejects if any errors were encountered.
+     *
+     * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader.
+     *
+     * Errors and closures of the source and destination streams propagate as follows:
+     *
+     * An error in this source readable stream will abort destination, unless preventAbort is truthy. The returned promise will be rejected with the source's error, or with any error that occurs during aborting the destination.
+     *
+     * An error in destination will cancel this source readable stream, unless preventCancel is truthy. The returned promise will be rejected with the destination's error, or with any error that occurs during canceling the source.
+     *
+     * When this source readable stream closes, destination will be closed, unless preventClose is truthy. The returned promise will be fulfilled once this process completes, unless an error is encountered while closing the destination, in which case it will be rejected with that error.
+     *
+     * If destination starts out closed or closing, this source readable stream will be canceled, unless preventCancel is true. The returned promise will be rejected with an error indicating piping to a closed stream failed, or with any error that occurs during canceling the source.
+     *
+     * The signal option can be set to an AbortSignal to allow aborting an ongoing pipe operation via the corresponding AbortController. In this case, this source readable stream will be canceled, and destination aborted, unless the respective options preventCancel or preventAbort are set.
+     */
+    preventClose?: boolean;
+    signal?: AbortSignal;
+}
+
+interface StructuredSerializeOptions {
+    transfer?: Transferable[];
+}
+
+interface SubmitEventInit extends EventInit {
+    submitter?: HTMLElement | null;
+}
+
+interface TextDecodeOptions {
+    stream?: boolean;
+}
+
+interface TextDecoderOptions {
+    fatal?: boolean;
+    ignoreBOM?: boolean;
+}
+
+interface TextEncoderEncodeIntoResult {
+    read?: number;
+    written?: number;
+}
+
+interface TouchEventInit extends EventModifierInit {
+    changedTouches?: Touch[];
+    targetTouches?: Touch[];
+    touches?: Touch[];
+}
+
+interface TouchInit {
+    altitudeAngle?: number;
+    azimuthAngle?: number;
+    clientX?: number;
+    clientY?: number;
+    force?: number;
+    identifier: number;
+    pageX?: number;
+    pageY?: number;
+    radiusX?: number;
+    radiusY?: number;
+    rotationAngle?: number;
+    screenX?: number;
+    screenY?: number;
+    target: EventTarget;
+    touchType?: TouchType;
+}
+
+interface TrackEventInit extends EventInit {
+    track?: TextTrack | null;
+}
+
+interface Transformer<I = any, O = any> {
+    flush?: TransformerFlushCallback<O>;
+    readableType?: undefined;
+    start?: TransformerStartCallback<O>;
+    transform?: TransformerTransformCallback<I, O>;
+    writableType?: undefined;
+}
+
+interface TransitionEventInit extends EventInit {
+    elapsedTime?: number;
+    propertyName?: string;
+    pseudoElement?: string;
+}
+
+interface UIEventInit extends EventInit {
+    detail?: number;
+    view?: Window | null;
+    /** @deprecated */
+    which?: number;
+}
+
+interface ULongRange {
+    max?: number;
+    min?: number;
+}
+
+interface UnderlyingByteSource {
+    autoAllocateChunkSize?: number;
+    cancel?: UnderlyingSourceCancelCallback;
+    pull?: (controller: ReadableByteStreamController) => void | PromiseLike<void>;
+    start?: (controller: ReadableByteStreamController) => any;
+    type: "bytes";
+}
+
+interface UnderlyingDefaultSource<R = any> {
+    cancel?: UnderlyingSourceCancelCallback;
+    pull?: (controller: ReadableStreamDefaultController<R>) => void | PromiseLike<void>;
+    start?: (controller: ReadableStreamDefaultController<R>) => any;
+    type?: undefined;
+}
+
+interface UnderlyingSink<W = any> {
+    abort?: UnderlyingSinkAbortCallback;
+    close?: UnderlyingSinkCloseCallback;
+    start?: UnderlyingSinkStartCallback;
+    type?: undefined;
+    write?: UnderlyingSinkWriteCallback<W>;
+}
+
+interface UnderlyingSource<R = any> {
+    autoAllocateChunkSize?: number;
+    cancel?: UnderlyingSourceCancelCallback;
+    pull?: UnderlyingSourcePullCallback<R>;
+    start?: UnderlyingSourceStartCallback<R>;
+    type?: ReadableStreamType;
+}
+
+interface ValidityStateFlags {
+    badInput?: boolean;
+    customError?: boolean;
+    patternMismatch?: boolean;
+    rangeOverflow?: boolean;
+    rangeUnderflow?: boolean;
+    stepMismatch?: boolean;
+    tooLong?: boolean;
+    tooShort?: boolean;
+    typeMismatch?: boolean;
+    valueMissing?: boolean;
+}
+
+interface VideoColorSpaceInit {
+    fullRange?: boolean | null;
+    matrix?: VideoMatrixCoefficients | null;
+    primaries?: VideoColorPrimaries | null;
+    transfer?: VideoTransferCharacteristics | null;
+}
+
+interface VideoConfiguration {
+    bitrate: number;
+    colorGamut?: ColorGamut;
+    contentType: string;
+    framerate: number;
+    hdrMetadataType?: HdrMetadataType;
+    height: number;
+    scalabilityMode?: string;
+    transferFunction?: TransferFunction;
+    width: number;
+}
+
+interface VideoFrameCallbackMetadata {
+    captureTime?: DOMHighResTimeStamp;
+    expectedDisplayTime: DOMHighResTimeStamp;
+    height: number;
+    mediaTime: number;
+    presentationTime: DOMHighResTimeStamp;
+    presentedFrames: number;
+    processingDuration?: number;
+    receiveTime?: DOMHighResTimeStamp;
+    rtpTimestamp?: number;
+    width: number;
+}
+
+interface WaveShaperOptions extends AudioNodeOptions {
+    curve?: number[] | Float32Array;
+    oversample?: OverSampleType;
+}
+
+interface WebGLContextAttributes {
+    alpha?: boolean;
+    antialias?: boolean;
+    depth?: boolean;
+    desynchronized?: boolean;
+    failIfMajorPerformanceCaveat?: boolean;
+    powerPreference?: WebGLPowerPreference;
+    premultipliedAlpha?: boolean;
+    preserveDrawingBuffer?: boolean;
+    stencil?: boolean;
+}
+
+interface WebGLContextEventInit extends EventInit {
+    statusMessage?: string;
+}
+
+interface WheelEventInit extends MouseEventInit {
+    deltaMode?: number;
+    deltaX?: number;
+    deltaY?: number;
+    deltaZ?: number;
+}
+
+interface WindowPostMessageOptions extends StructuredSerializeOptions {
+    targetOrigin?: string;
+}
+
+interface WorkerOptions {
+    credentials?: RequestCredentials;
+    name?: string;
+    type?: WorkerType;
+}
+
+interface WorkletOptions {
+    credentials?: RequestCredentials;
+}
+
+type NodeFilter = ((node: Node) => number) | { acceptNode(node: Node): number; };
+
+declare var NodeFilter: {
+    readonly FILTER_ACCEPT: 1;
+    readonly FILTER_REJECT: 2;
+    readonly FILTER_SKIP: 3;
+    readonly SHOW_ALL: 0xFFFFFFFF;
+    readonly SHOW_ELEMENT: 0x1;
+    readonly SHOW_ATTRIBUTE: 0x2;
+    readonly SHOW_TEXT: 0x4;
+    readonly SHOW_CDATA_SECTION: 0x8;
+    readonly SHOW_ENTITY_REFERENCE: 0x10;
+    readonly SHOW_ENTITY: 0x20;
+    readonly SHOW_PROCESSING_INSTRUCTION: 0x40;
+    readonly SHOW_COMMENT: 0x80;
+    readonly SHOW_DOCUMENT: 0x100;
+    readonly SHOW_DOCUMENT_TYPE: 0x200;
+    readonly SHOW_DOCUMENT_FRAGMENT: 0x400;
+    readonly SHOW_NOTATION: 0x800;
+};
+
+type XPathNSResolver = ((prefix: string | null) => string | null) | { lookupNamespaceURI(prefix: string | null): string | null; };
+
+/** The ANGLE_instanced_arrays extension is part of the WebGL API and allows to draw the same object, or groups of similar objects multiple times, if they share the same vertex data, primitive count and type. */
+interface ANGLE_instanced_arrays {
+    drawArraysInstancedANGLE(mode: GLenum, first: GLint, count: GLsizei, primcount: GLsizei): void;
+    drawElementsInstancedANGLE(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr, primcount: GLsizei): void;
+    vertexAttribDivisorANGLE(index: GLuint, divisor: GLuint): void;
+    readonly VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: 0x88FE;
+}
+
+interface ARIAMixin {
+    ariaAtomic: string | null;
+    ariaAutoComplete: string | null;
+    ariaBusy: string | null;
+    ariaChecked: string | null;
+    ariaColCount: string | null;
+    ariaColIndex: string | null;
+    ariaColSpan: string | null;
+    ariaCurrent: string | null;
+    ariaDisabled: string | null;
+    ariaExpanded: string | null;
+    ariaHasPopup: string | null;
+    ariaHidden: string | null;
+    ariaInvalid: string | null;
+    ariaKeyShortcuts: string | null;
+    ariaLabel: string | null;
+    ariaLevel: string | null;
+    ariaLive: string | null;
+    ariaModal: string | null;
+    ariaMultiLine: string | null;
+    ariaMultiSelectable: string | null;
+    ariaOrientation: string | null;
+    ariaPlaceholder: string | null;
+    ariaPosInSet: string | null;
+    ariaPressed: string | null;
+    ariaReadOnly: string | null;
+    ariaRequired: string | null;
+    ariaRoleDescription: string | null;
+    ariaRowCount: string | null;
+    ariaRowIndex: string | null;
+    ariaRowSpan: string | null;
+    ariaSelected: string | null;
+    ariaSetSize: string | null;
+    ariaSort: string | null;
+    ariaValueMax: string | null;
+    ariaValueMin: string | null;
+    ariaValueNow: string | null;
+    ariaValueText: string | null;
+    role: string | null;
+}
+
+/** A controller object that allows you to abort one or more DOM requests as and when desired. */
+interface AbortController {
+    /** Returns the AbortSignal object associated with this object. */
+    readonly signal: AbortSignal;
+    /** Invoking this method will set this object's AbortSignal's aborted flag and signal to any observers that the associated activity is to be aborted. */
+    abort(reason?: any): void;
+}
+
+declare var AbortController: {
+    prototype: AbortController;
+    new(): AbortController;
+};
+
+interface AbortSignalEventMap {
+    "abort": Event;
+}
+
+/** A signal object that allows you to communicate with a DOM request (such as a Fetch) and abort it if required via an AbortController object. */
+interface AbortSignal extends EventTarget {
+    /** Returns true if this AbortSignal's AbortController has signaled to abort, and false otherwise. */
+    readonly aborted: boolean;
+    onabort: ((this: AbortSignal, ev: Event) => any) | null;
+    readonly reason: any;
+    throwIfAborted(): void;
+    addEventListener<K extends keyof AbortSignalEventMap>(type: K, listener: (this: AbortSignal, ev: AbortSignalEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof AbortSignalEventMap>(type: K, listener: (this: AbortSignal, ev: AbortSignalEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var AbortSignal: {
+    prototype: AbortSignal;
+    new(): AbortSignal;
+    abort(reason?: any): AbortSignal;
+    timeout(milliseconds: number): AbortSignal;
+};
+
+interface AbstractRange {
+    /** Returns true if range is collapsed, and false otherwise. */
+    readonly collapsed: boolean;
+    /** Returns range's end node. */
+    readonly endContainer: Node;
+    /** Returns range's end offset. */
+    readonly endOffset: number;
+    /** Returns range's start node. */
+    readonly startContainer: Node;
+    /** Returns range's start offset. */
+    readonly startOffset: number;
+}
+
+declare var AbstractRange: {
+    prototype: AbstractRange;
+    new(): AbstractRange;
+};
+
+interface AbstractWorkerEventMap {
+    "error": ErrorEvent;
+}
+
+interface AbstractWorker {
+    onerror: ((this: AbstractWorker, ev: ErrorEvent) => any) | null;
+    addEventListener<K extends keyof AbstractWorkerEventMap>(type: K, listener: (this: AbstractWorker, ev: AbstractWorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof AbstractWorkerEventMap>(type: K, listener: (this: AbstractWorker, ev: AbstractWorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+/** A node able to provide real-time frequency and time-domain analysis information. It is an AudioNode that passes the audio stream unchanged from the input to the output, but allows you to take the generated data, process it, and create audio visualizations. */
+interface AnalyserNode extends AudioNode {
+    fftSize: number;
+    readonly frequencyBinCount: number;
+    maxDecibels: number;
+    minDecibels: number;
+    smoothingTimeConstant: number;
+    getByteFrequencyData(array: Uint8Array): void;
+    getByteTimeDomainData(array: Uint8Array): void;
+    getFloatFrequencyData(array: Float32Array): void;
+    getFloatTimeDomainData(array: Float32Array): void;
+}
+
+declare var AnalyserNode: {
+    prototype: AnalyserNode;
+    new(context: BaseAudioContext, options?: AnalyserOptions): AnalyserNode;
+};
+
+interface Animatable {
+    animate(keyframes: Keyframe[] | PropertyIndexedKeyframes | null, options?: number | KeyframeAnimationOptions): Animation;
+    getAnimations(options?: GetAnimationsOptions): Animation[];
+}
+
+interface AnimationEventMap {
+    "cancel": AnimationPlaybackEvent;
+    "finish": AnimationPlaybackEvent;
+    "remove": Event;
+}
+
+interface Animation extends EventTarget {
+    currentTime: CSSNumberish | null;
+    effect: AnimationEffect | null;
+    readonly finished: Promise<Animation>;
+    id: string;
+    oncancel: ((this: Animation, ev: AnimationPlaybackEvent) => any) | null;
+    onfinish: ((this: Animation, ev: AnimationPlaybackEvent) => any) | null;
+    onremove: ((this: Animation, ev: Event) => any) | null;
+    readonly pending: boolean;
+    readonly playState: AnimationPlayState;
+    playbackRate: number;
+    readonly ready: Promise<Animation>;
+    readonly replaceState: AnimationReplaceState;
+    startTime: CSSNumberish | null;
+    timeline: AnimationTimeline | null;
+    cancel(): void;
+    commitStyles(): void;
+    finish(): void;
+    pause(): void;
+    persist(): void;
+    play(): void;
+    reverse(): void;
+    updatePlaybackRate(playbackRate: number): void;
+    addEventListener<K extends keyof AnimationEventMap>(type: K, listener: (this: Animation, ev: AnimationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof AnimationEventMap>(type: K, listener: (this: Animation, ev: AnimationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var Animation: {
+    prototype: Animation;
+    new(effect?: AnimationEffect | null, timeline?: AnimationTimeline | null): Animation;
+};
+
+interface AnimationEffect {
+    getComputedTiming(): ComputedEffectTiming;
+    getTiming(): EffectTiming;
+    updateTiming(timing?: OptionalEffectTiming): void;
+}
+
+declare var AnimationEffect: {
+    prototype: AnimationEffect;
+    new(): AnimationEffect;
+};
+
+/** Events providing information related to animations. */
+interface AnimationEvent extends Event {
+    readonly animationName: string;
+    readonly elapsedTime: number;
+    readonly pseudoElement: string;
+}
+
+declare var AnimationEvent: {
+    prototype: AnimationEvent;
+    new(type: string, animationEventInitDict?: AnimationEventInit): AnimationEvent;
+};
+
+interface AnimationFrameProvider {
+    cancelAnimationFrame(handle: number): void;
+    requestAnimationFrame(callback: FrameRequestCallback): number;
+}
+
+interface AnimationPlaybackEvent extends Event {
+    readonly currentTime: CSSNumberish | null;
+    readonly timelineTime: CSSNumberish | null;
+}
+
+declare var AnimationPlaybackEvent: {
+    prototype: AnimationPlaybackEvent;
+    new(type: string, eventInitDict?: AnimationPlaybackEventInit): AnimationPlaybackEvent;
+};
+
+interface AnimationTimeline {
+    readonly currentTime: number | null;
+}
+
+declare var AnimationTimeline: {
+    prototype: AnimationTimeline;
+    new(): AnimationTimeline;
+};
+
+/** A DOM element's attribute as an object. In most DOM methods, you will probably directly retrieve the attribute as a string (e.g., Element.getAttribute(), but certain functions (e.g., Element.getAttributeNode()) or means of iterating give Attr types. */
+interface Attr extends Node {
+    readonly localName: string;
+    readonly name: string;
+    readonly namespaceURI: string | null;
+    readonly ownerDocument: Document;
+    readonly ownerElement: Element | null;
+    readonly prefix: string | null;
+    /** @deprecated */
+    readonly specified: boolean;
+    value: string;
+}
+
+declare var Attr: {
+    prototype: Attr;
+    new(): Attr;
+};
+
+/** A short audio asset residing in memory, created from an audio file using the AudioContext.decodeAudioData() method, or from raw data using AudioContext.createBuffer(). Once put into an AudioBuffer, the audio can then be played by being passed into an AudioBufferSourceNode. */
+interface AudioBuffer {
+    readonly duration: number;
+    readonly length: number;
+    readonly numberOfChannels: number;
+    readonly sampleRate: number;
+    copyFromChannel(destination: Float32Array, channelNumber: number, bufferOffset?: number): void;
+    copyToChannel(source: Float32Array, channelNumber: number, bufferOffset?: number): void;
+    getChannelData(channel: number): Float32Array;
+}
+
+declare var AudioBuffer: {
+    prototype: AudioBuffer;
+    new(options: AudioBufferOptions): AudioBuffer;
+};
+
+/** An AudioScheduledSourceNode which represents an audio source consisting of in-memory audio data, stored in an AudioBuffer. It's especially useful for playing back audio which has particularly stringent timing accuracy requirements, such as for sounds that must match a specific rhythm and can be kept in memory rather than being played from disk or the network. */
+interface AudioBufferSourceNode extends AudioScheduledSourceNode {
+    buffer: AudioBuffer | null;
+    readonly detune: AudioParam;
+    loop: boolean;
+    loopEnd: number;
+    loopStart: number;
+    readonly playbackRate: AudioParam;
+    start(when?: number, offset?: number, duration?: number): void;
+    addEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: AudioBufferSourceNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: AudioBufferSourceNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var AudioBufferSourceNode: {
+    prototype: AudioBufferSourceNode;
+    new(context: BaseAudioContext, options?: AudioBufferSourceOptions): AudioBufferSourceNode;
+};
+
+/** An audio-processing graph built from audio modules linked together, each represented by an AudioNode. */
+interface AudioContext extends BaseAudioContext {
+    readonly baseLatency: number;
+    readonly outputLatency: number;
+    close(): Promise<void>;
+    createMediaElementSource(mediaElement: HTMLMediaElement): MediaElementAudioSourceNode;
+    createMediaStreamDestination(): MediaStreamAudioDestinationNode;
+    createMediaStreamSource(mediaStream: MediaStream): MediaStreamAudioSourceNode;
+    getOutputTimestamp(): AudioTimestamp;
+    resume(): Promise<void>;
+    suspend(): Promise<void>;
+    addEventListener<K extends keyof BaseAudioContextEventMap>(type: K, listener: (this: AudioContext, ev: BaseAudioContextEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof BaseAudioContextEventMap>(type: K, listener: (this: AudioContext, ev: BaseAudioContextEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var AudioContext: {
+    prototype: AudioContext;
+    new(contextOptions?: AudioContextOptions): AudioContext;
+};
+
+/** AudioDestinationNode has no output (as it is the output, no more AudioNode can be linked after it in the audio graph) and one input. The number of channels in the input must be between 0 and the maxChannelCount value or an exception is raised. */
+interface AudioDestinationNode extends AudioNode {
+    readonly maxChannelCount: number;
+}
+
+declare var AudioDestinationNode: {
+    prototype: AudioDestinationNode;
+    new(): AudioDestinationNode;
+};
+
+/** The position and orientation of the unique person listening to the audio scene, and is used in audio spatialization. All PannerNodes spatialize in relation to the AudioListener stored in the BaseAudioContext.listener attribute. */
+interface AudioListener {
+    readonly forwardX: AudioParam;
+    readonly forwardY: AudioParam;
+    readonly forwardZ: AudioParam;
+    readonly positionX: AudioParam;
+    readonly positionY: AudioParam;
+    readonly positionZ: AudioParam;
+    readonly upX: AudioParam;
+    readonly upY: AudioParam;
+    readonly upZ: AudioParam;
+    /** @deprecated */
+    setOrientation(x: number, y: number, z: number, xUp: number, yUp: number, zUp: number): void;
+    /** @deprecated */
+    setPosition(x: number, y: number, z: number): void;
+}
+
+declare var AudioListener: {
+    prototype: AudioListener;
+    new(): AudioListener;
+};
+
+/** A generic interface for representing an audio processing module. Examples include: */
+interface AudioNode extends EventTarget {
+    channelCount: number;
+    channelCountMode: ChannelCountMode;
+    channelInterpretation: ChannelInterpretation;
+    readonly context: BaseAudioContext;
+    readonly numberOfInputs: number;
+    readonly numberOfOutputs: number;
+    connect(destinationNode: AudioNode, output?: number, input?: number): AudioNode;
+    connect(destinationParam: AudioParam, output?: number): void;
+    disconnect(): void;
+    disconnect(output: number): void;
+    disconnect(destinationNode: AudioNode): void;
+    disconnect(destinationNode: AudioNode, output: number): void;
+    disconnect(destinationNode: AudioNode, output: number, input: number): void;
+    disconnect(destinationParam: AudioParam): void;
+    disconnect(destinationParam: AudioParam, output: number): void;
+}
+
+declare var AudioNode: {
+    prototype: AudioNode;
+    new(): AudioNode;
+};
+
+/** The Web Audio API's AudioParam interface represents an audio-related parameter, usually a parameter of an AudioNode (such as GainNode.gain). */
+interface AudioParam {
+    automationRate: AutomationRate;
+    readonly defaultValue: number;
+    readonly maxValue: number;
+    readonly minValue: number;
+    value: number;
+    cancelAndHoldAtTime(cancelTime: number): AudioParam;
+    cancelScheduledValues(cancelTime: number): AudioParam;
+    exponentialRampToValueAtTime(value: number, endTime: number): AudioParam;
+    linearRampToValueAtTime(value: number, endTime: number): AudioParam;
+    setTargetAtTime(target: number, startTime: number, timeConstant: number): AudioParam;
+    setValueAtTime(value: number, startTime: number): AudioParam;
+    setValueCurveAtTime(values: number[] | Float32Array, startTime: number, duration: number): AudioParam;
+}
+
+declare var AudioParam: {
+    prototype: AudioParam;
+    new(): AudioParam;
+};
+
+interface AudioParamMap {
+    forEach(callbackfn: (value: AudioParam, key: string, parent: AudioParamMap) => void, thisArg?: any): void;
+}
+
+declare var AudioParamMap: {
+    prototype: AudioParamMap;
+    new(): AudioParamMap;
+};
+
+/**
+ * The Web Audio API events that occur when a ScriptProcessorNode input buffer is ready to be processed.
+ * @deprecated As of the August 29 2014 Web Audio API spec publication, this feature has been marked as deprecated, and is soon to be replaced by AudioWorklet.
+ */
+interface AudioProcessingEvent extends Event {
+    /** @deprecated */
+    readonly inputBuffer: AudioBuffer;
+    /** @deprecated */
+    readonly outputBuffer: AudioBuffer;
+    /** @deprecated */
+    readonly playbackTime: number;
+}
+
+/** @deprecated */
+declare var AudioProcessingEvent: {
+    prototype: AudioProcessingEvent;
+    new(type: string, eventInitDict: AudioProcessingEventInit): AudioProcessingEvent;
+};
+
+interface AudioScheduledSourceNodeEventMap {
+    "ended": Event;
+}
+
+interface AudioScheduledSourceNode extends AudioNode {
+    onended: ((this: AudioScheduledSourceNode, ev: Event) => any) | null;
+    start(when?: number): void;
+    stop(when?: number): void;
+    addEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: AudioScheduledSourceNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: AudioScheduledSourceNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var AudioScheduledSourceNode: {
+    prototype: AudioScheduledSourceNode;
+    new(): AudioScheduledSourceNode;
+};
+
+/** Available only in secure contexts. */
+interface AudioWorklet extends Worklet {
+}
+
+declare var AudioWorklet: {
+    prototype: AudioWorklet;
+    new(): AudioWorklet;
+};
+
+interface AudioWorkletNodeEventMap {
+    "processorerror": Event;
+}
+
+/** Available only in secure contexts. */
+interface AudioWorkletNode extends AudioNode {
+    onprocessorerror: ((this: AudioWorkletNode, ev: Event) => any) | null;
+    readonly parameters: AudioParamMap;
+    readonly port: MessagePort;
+    addEventListener<K extends keyof AudioWorkletNodeEventMap>(type: K, listener: (this: AudioWorkletNode, ev: AudioWorkletNodeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof AudioWorkletNodeEventMap>(type: K, listener: (this: AudioWorkletNode, ev: AudioWorkletNodeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var AudioWorkletNode: {
+    prototype: AudioWorkletNode;
+    new(context: BaseAudioContext, name: string, options?: AudioWorkletNodeOptions): AudioWorkletNode;
+};
+
+/** Available only in secure contexts. */
+interface AuthenticatorAssertionResponse extends AuthenticatorResponse {
+    readonly authenticatorData: ArrayBuffer;
+    readonly signature: ArrayBuffer;
+    readonly userHandle: ArrayBuffer | null;
+}
+
+declare var AuthenticatorAssertionResponse: {
+    prototype: AuthenticatorAssertionResponse;
+    new(): AuthenticatorAssertionResponse;
+};
+
+/** Available only in secure contexts. */
+interface AuthenticatorAttestationResponse extends AuthenticatorResponse {
+    readonly attestationObject: ArrayBuffer;
+    getAuthenticatorData(): ArrayBuffer;
+    getPublicKey(): ArrayBuffer | null;
+    getPublicKeyAlgorithm(): COSEAlgorithmIdentifier;
+    getTransports(): string[];
+}
+
+declare var AuthenticatorAttestationResponse: {
+    prototype: AuthenticatorAttestationResponse;
+    new(): AuthenticatorAttestationResponse;
+};
+
+/** Available only in secure contexts. */
+interface AuthenticatorResponse {
+    readonly clientDataJSON: ArrayBuffer;
+}
+
+declare var AuthenticatorResponse: {
+    prototype: AuthenticatorResponse;
+    new(): AuthenticatorResponse;
+};
+
+interface BarProp {
+    readonly visible: boolean;
+}
+
+declare var BarProp: {
+    prototype: BarProp;
+    new(): BarProp;
+};
+
+interface BaseAudioContextEventMap {
+    "statechange": Event;
+}
+
+interface BaseAudioContext extends EventTarget {
+    /** Available only in secure contexts. */
+    readonly audioWorklet: AudioWorklet;
+    readonly currentTime: number;
+    readonly destination: AudioDestinationNode;
+    readonly listener: AudioListener;
+    onstatechange: ((this: BaseAudioContext, ev: Event) => any) | null;
+    readonly sampleRate: number;
+    readonly state: AudioContextState;
+    createAnalyser(): AnalyserNode;
+    createBiquadFilter(): BiquadFilterNode;
+    createBuffer(numberOfChannels: number, length: number, sampleRate: number): AudioBuffer;
+    createBufferSource(): AudioBufferSourceNode;
+    createChannelMerger(numberOfInputs?: number): ChannelMergerNode;
+    createChannelSplitter(numberOfOutputs?: number): ChannelSplitterNode;
+    createConstantSource(): ConstantSourceNode;
+    createConvolver(): ConvolverNode;
+    createDelay(maxDelayTime?: number): DelayNode;
+    createDynamicsCompressor(): DynamicsCompressorNode;
+    createGain(): GainNode;
+    createIIRFilter(feedforward: number[], feedback: number[]): IIRFilterNode;
+    createOscillator(): OscillatorNode;
+    createPanner(): PannerNode;
+    createPeriodicWave(real: number[] | Float32Array, imag: number[] | Float32Array, constraints?: PeriodicWaveConstraints): PeriodicWave;
+    /** @deprecated */
+    createScriptProcessor(bufferSize?: number, numberOfInputChannels?: number, numberOfOutputChannels?: number): ScriptProcessorNode;
+    createStereoPanner(): StereoPannerNode;
+    createWaveShaper(): WaveShaperNode;
+    decodeAudioData(audioData: ArrayBuffer, successCallback?: DecodeSuccessCallback | null, errorCallback?: DecodeErrorCallback | null): Promise<AudioBuffer>;
+    addEventListener<K extends keyof BaseAudioContextEventMap>(type: K, listener: (this: BaseAudioContext, ev: BaseAudioContextEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof BaseAudioContextEventMap>(type: K, listener: (this: BaseAudioContext, ev: BaseAudioContextEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var BaseAudioContext: {
+    prototype: BaseAudioContext;
+    new(): BaseAudioContext;
+};
+
+/** The beforeunload event is fired when the window, the document and its resources are about to be unloaded. */
+interface BeforeUnloadEvent extends Event {
+    returnValue: any;
+}
+
+declare var BeforeUnloadEvent: {
+    prototype: BeforeUnloadEvent;
+    new(): BeforeUnloadEvent;
+};
+
+/** A simple low-order filter, and is created using the AudioContext.createBiquadFilter() method. It is an AudioNode that can represent different kinds of filters, tone control devices, and graphic equalizers. */
+interface BiquadFilterNode extends AudioNode {
+    readonly Q: AudioParam;
+    readonly detune: AudioParam;
+    readonly frequency: AudioParam;
+    readonly gain: AudioParam;
+    type: BiquadFilterType;
+    getFrequencyResponse(frequencyHz: Float32Array, magResponse: Float32Array, phaseResponse: Float32Array): void;
+}
+
+declare var BiquadFilterNode: {
+    prototype: BiquadFilterNode;
+    new(context: BaseAudioContext, options?: BiquadFilterOptions): BiquadFilterNode;
+};
+
+/** A file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format. The File interface is based on Blob, inheriting blob functionality and expanding it to support files on the user's system. */
+interface Blob {
+    readonly size: number;
+    readonly type: string;
+    arrayBuffer(): Promise<ArrayBuffer>;
+    slice(start?: number, end?: number, contentType?: string): Blob;
+    stream(): ReadableStream<Uint8Array>;
+    text(): Promise<string>;
+}
+
+declare var Blob: {
+    prototype: Blob;
+    new(blobParts?: BlobPart[], options?: BlobPropertyBag): Blob;
+};
+
+interface BlobEvent extends Event {
+    readonly data: Blob;
+    readonly timecode: DOMHighResTimeStamp;
+}
+
+declare var BlobEvent: {
+    prototype: BlobEvent;
+    new(type: string, eventInitDict: BlobEventInit): BlobEvent;
+};
+
+interface Body {
+    readonly body: ReadableStream<Uint8Array> | null;
+    readonly bodyUsed: boolean;
+    arrayBuffer(): Promise<ArrayBuffer>;
+    blob(): Promise<Blob>;
+    formData(): Promise<FormData>;
+    json(): Promise<any>;
+    text(): Promise<string>;
+}
+
+interface BroadcastChannelEventMap {
+    "message": MessageEvent;
+    "messageerror": MessageEvent;
+}
+
+interface BroadcastChannel extends EventTarget {
+    /** Returns the channel name (as passed to the constructor). */
+    readonly name: string;
+    onmessage: ((this: BroadcastChannel, ev: MessageEvent) => any) | null;
+    onmessageerror: ((this: BroadcastChannel, ev: MessageEvent) => any) | null;
+    /** Closes the BroadcastChannel object, opening it up to garbage collection. */
+    close(): void;
+    /** Sends the given message to other BroadcastChannel objects set up for this channel. Messages can be structured objects, e.g. nested objects and arrays. */
+    postMessage(message: any): void;
+    addEventListener<K extends keyof BroadcastChannelEventMap>(type: K, listener: (this: BroadcastChannel, ev: BroadcastChannelEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof BroadcastChannelEventMap>(type: K, listener: (this: BroadcastChannel, ev: BroadcastChannelEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var BroadcastChannel: {
+    prototype: BroadcastChannel;
+    new(name: string): BroadcastChannel;
+};
+
+/** This Streams API interface provides\xA0a built-in byte length queuing strategy that can be used when constructing streams. */
+interface ByteLengthQueuingStrategy extends QueuingStrategy<ArrayBufferView> {
+    readonly highWaterMark: number;
+    readonly size: QueuingStrategySize<ArrayBufferView>;
+}
+
+declare var ByteLengthQueuingStrategy: {
+    prototype: ByteLengthQueuingStrategy;
+    new(init: QueuingStrategyInit): ByteLengthQueuingStrategy;
+};
+
+/** A CDATA section that can be used within XML to include extended portions of unescaped text. The symbols < and & don\u2019t need escaping as they normally do when inside a CDATA section. */
+interface CDATASection extends Text {
+}
+
+declare var CDATASection: {
+    prototype: CDATASection;
+    new(): CDATASection;
+};
+
+interface CSSAnimation extends Animation {
+    readonly animationName: string;
+    addEventListener<K extends keyof AnimationEventMap>(type: K, listener: (this: CSSAnimation, ev: AnimationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof AnimationEventMap>(type: K, listener: (this: CSSAnimation, ev: AnimationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var CSSAnimation: {
+    prototype: CSSAnimation;
+    new(): CSSAnimation;
+};
+
+/** A single condition CSS at-rule, which consists of a condition and a statement block. It is a child of CSSGroupingRule. */
+interface CSSConditionRule extends CSSGroupingRule {
+    readonly conditionText: string;
+}
+
+declare var CSSConditionRule: {
+    prototype: CSSConditionRule;
+    new(): CSSConditionRule;
+};
+
+interface CSSContainerRule extends CSSConditionRule {
+}
+
+declare var CSSContainerRule: {
+    prototype: CSSContainerRule;
+    new(): CSSContainerRule;
+};
+
+interface CSSCounterStyleRule extends CSSRule {
+    additiveSymbols: string;
+    fallback: string;
+    name: string;
+    negative: string;
+    pad: string;
+    prefix: string;
+    range: string;
+    speakAs: string;
+    suffix: string;
+    symbols: string;
+    system: string;
+}
+
+declare var CSSCounterStyleRule: {
+    prototype: CSSCounterStyleRule;
+    new(): CSSCounterStyleRule;
+};
+
+interface CSSFontFaceRule extends CSSRule {
+    readonly style: CSSStyleDeclaration;
+}
+
+declare var CSSFontFaceRule: {
+    prototype: CSSFontFaceRule;
+    new(): CSSFontFaceRule;
+};
+
+interface CSSFontFeatureValuesRule extends CSSRule {
+    fontFamily: string;
+}
+
+declare var CSSFontFeatureValuesRule: {
+    prototype: CSSFontFeatureValuesRule;
+    new(): CSSFontFeatureValuesRule;
+};
+
+interface CSSFontPaletteValuesRule extends CSSRule {
+    readonly basePalette: string;
+    readonly fontFamily: string;
+    readonly name: string;
+    readonly overrideColors: string;
+}
+
+declare var CSSFontPaletteValuesRule: {
+    prototype: CSSFontPaletteValuesRule;
+    new(): CSSFontPaletteValuesRule;
+};
+
+/** Any CSS at-rule that contains other rules nested within it. */
+interface CSSGroupingRule extends CSSRule {
+    readonly cssRules: CSSRuleList;
+    deleteRule(index: number): void;
+    insertRule(rule: string, index?: number): number;
+}
+
+declare var CSSGroupingRule: {
+    prototype: CSSGroupingRule;
+    new(): CSSGroupingRule;
+};
+
+interface CSSImportRule extends CSSRule {
+    readonly href: string;
+    readonly layerName: string | null;
+    readonly media: MediaList;
+    readonly styleSheet: CSSStyleSheet;
+}
+
+declare var CSSImportRule: {
+    prototype: CSSImportRule;
+    new(): CSSImportRule;
+};
+
+/** An object representing a set of style for a given keyframe. It corresponds to the contains of a single keyframe of a @keyframes at-rule. It implements the CSSRule interface with a type value of 8 (CSSRule.KEYFRAME_RULE). */
+interface CSSKeyframeRule extends CSSRule {
+    keyText: string;
+    readonly style: CSSStyleDeclaration;
+}
+
+declare var CSSKeyframeRule: {
+    prototype: CSSKeyframeRule;
+    new(): CSSKeyframeRule;
+};
+
+/** An object representing a complete set of keyframes for a CSS animation. It corresponds to the contains of a whole @keyframes at-rule. It implements the CSSRule interface with a type value of 7 (CSSRule.KEYFRAMES_RULE). */
+interface CSSKeyframesRule extends CSSRule {
+    readonly cssRules: CSSRuleList;
+    name: string;
+    appendRule(rule: string): void;
+    deleteRule(select: string): void;
+    findRule(select: string): CSSKeyframeRule | null;
+    [index: number]: CSSKeyframeRule;
+}
+
+declare var CSSKeyframesRule: {
+    prototype: CSSKeyframesRule;
+    new(): CSSKeyframesRule;
+};
+
+interface CSSLayerBlockRule extends CSSGroupingRule {
+    readonly name: string;
+}
+
+declare var CSSLayerBlockRule: {
+    prototype: CSSLayerBlockRule;
+    new(): CSSLayerBlockRule;
+};
+
+interface CSSLayerStatementRule extends CSSRule {
+    readonly nameList: ReadonlyArray<string>;
+}
+
+declare var CSSLayerStatementRule: {
+    prototype: CSSLayerStatementRule;
+    new(): CSSLayerStatementRule;
+};
+
+/** A single CSS @media rule. It implements the CSSConditionRule interface, and therefore the CSSGroupingRule and the CSSRule interface with a type value of 4 (CSSRule.MEDIA_RULE). */
+interface CSSMediaRule extends CSSConditionRule {
+    readonly media: MediaList;
+}
+
+declare var CSSMediaRule: {
+    prototype: CSSMediaRule;
+    new(): CSSMediaRule;
+};
+
+/** An object representing a single CSS @namespace at-rule. It implements the CSSRule interface, with a type value of 10 (CSSRule.NAMESPACE_RULE). */
+interface CSSNamespaceRule extends CSSRule {
+    readonly namespaceURI: string;
+    readonly prefix: string;
+}
+
+declare var CSSNamespaceRule: {
+    prototype: CSSNamespaceRule;
+    new(): CSSNamespaceRule;
+};
+
+/** CSSPageRule is an interface representing a single CSS @page rule. It implements the CSSRule interface with a type value of 6 (CSSRule.PAGE_RULE). */
+interface CSSPageRule extends CSSGroupingRule {
+    selectorText: string;
+    readonly style: CSSStyleDeclaration;
+}
+
+declare var CSSPageRule: {
+    prototype: CSSPageRule;
+    new(): CSSPageRule;
+};
+
+/** A single CSS rule. There are several types of rules, listed in the Type constants section below. */
+interface CSSRule {
+    cssText: string;
+    readonly parentRule: CSSRule | null;
+    readonly parentStyleSheet: CSSStyleSheet | null;
+    /** @deprecated */
+    readonly type: number;
+    readonly STYLE_RULE: 1;
+    readonly CHARSET_RULE: 2;
+    readonly IMPORT_RULE: 3;
+    readonly MEDIA_RULE: 4;
+    readonly FONT_FACE_RULE: 5;
+    readonly PAGE_RULE: 6;
+    readonly NAMESPACE_RULE: 10;
+    readonly KEYFRAMES_RULE: 7;
+    readonly KEYFRAME_RULE: 8;
+    readonly SUPPORTS_RULE: 12;
+}
+
+declare var CSSRule: {
+    prototype: CSSRule;
+    new(): CSSRule;
+    readonly STYLE_RULE: 1;
+    readonly CHARSET_RULE: 2;
+    readonly IMPORT_RULE: 3;
+    readonly MEDIA_RULE: 4;
+    readonly FONT_FACE_RULE: 5;
+    readonly PAGE_RULE: 6;
+    readonly NAMESPACE_RULE: 10;
+    readonly KEYFRAMES_RULE: 7;
+    readonly KEYFRAME_RULE: 8;
+    readonly SUPPORTS_RULE: 12;
+};
+
+/** A CSSRuleList is an (indirect-modify only) array-like object containing an ordered collection of CSSRule objects. */
+interface CSSRuleList {
+    readonly length: number;
+    item(index: number): CSSRule | null;
+    [index: number]: CSSRule;
+}
+
+declare var CSSRuleList: {
+    prototype: CSSRuleList;
+    new(): CSSRuleList;
+};
+
+/** An object that is a CSS declaration block, and exposes style information and various style-related methods and properties. */
+interface CSSStyleDeclaration {
+    accentColor: string;
+    alignContent: string;
+    alignItems: string;
+    alignSelf: string;
+    alignmentBaseline: string;
+    all: string;
+    animation: string;
+    animationDelay: string;
+    animationDirection: string;
+    animationDuration: string;
+    animationFillMode: string;
+    animationIterationCount: string;
+    animationName: string;
+    animationPlayState: string;
+    animationTimingFunction: string;
+    appearance: string;
+    aspectRatio: string;
+    backdropFilter: string;
+    backfaceVisibility: string;
+    background: string;
+    backgroundAttachment: string;
+    backgroundBlendMode: string;
+    backgroundClip: string;
+    backgroundColor: string;
+    backgroundImage: string;
+    backgroundOrigin: string;
+    backgroundPosition: string;
+    backgroundPositionX: string;
+    backgroundPositionY: string;
+    backgroundRepeat: string;
+    backgroundSize: string;
+    baselineShift: string;
+    blockSize: string;
+    border: string;
+    borderBlock: string;
+    borderBlockColor: string;
+    borderBlockEnd: string;
+    borderBlockEndColor: string;
+    borderBlockEndStyle: string;
+    borderBlockEndWidth: string;
+    borderBlockStart: string;
+    borderBlockStartColor: string;
+    borderBlockStartStyle: string;
+    borderBlockStartWidth: string;
+    borderBlockStyle: string;
+    borderBlockWidth: string;
+    borderBottom: string;
+    borderBottomColor: string;
+    borderBottomLeftRadius: string;
+    borderBottomRightRadius: string;
+    borderBottomStyle: string;
+    borderBottomWidth: string;
+    borderCollapse: string;
+    borderColor: string;
+    borderEndEndRadius: string;
+    borderEndStartRadius: string;
+    borderImage: string;
+    borderImageOutset: string;
+    borderImageRepeat: string;
+    borderImageSlice: string;
+    borderImageSource: string;
+    borderImageWidth: string;
+    borderInline: string;
+    borderInlineColor: string;
+    borderInlineEnd: string;
+    borderInlineEndColor: string;
+    borderInlineEndStyle: string;
+    borderInlineEndWidth: string;
+    borderInlineStart: string;
+    borderInlineStartColor: string;
+    borderInlineStartStyle: string;
+    borderInlineStartWidth: string;
+    borderInlineStyle: string;
+    borderInlineWidth: string;
+    borderLeft: string;
+    borderLeftColor: string;
+    borderLeftStyle: string;
+    borderLeftWidth: string;
+    borderRadius: string;
+    borderRight: string;
+    borderRightColor: string;
+    borderRightStyle: string;
+    borderRightWidth: string;
+    borderSpacing: string;
+    borderStartEndRadius: string;
+    borderStartStartRadius: string;
+    borderStyle: string;
+    borderTop: string;
+    borderTopColor: string;
+    borderTopLeftRadius: string;
+    borderTopRightRadius: string;
+    borderTopStyle: string;
+    borderTopWidth: string;
+    borderWidth: string;
+    bottom: string;
+    boxShadow: string;
+    boxSizing: string;
+    breakAfter: string;
+    breakBefore: string;
+    breakInside: string;
+    captionSide: string;
+    caretColor: string;
+    clear: string;
+    /** @deprecated */
+    clip: string;
+    clipPath: string;
+    clipRule: string;
+    color: string;
+    colorInterpolation: string;
+    colorInterpolationFilters: string;
+    colorScheme: string;
+    columnCount: string;
+    columnFill: string;
+    columnGap: string;
+    columnRule: string;
+    columnRuleColor: string;
+    columnRuleStyle: string;
+    columnRuleWidth: string;
+    columnSpan: string;
+    columnWidth: string;
+    columns: string;
+    contain: string;
+    containIntrinsicBlockSize: string;
+    containIntrinsicHeight: string;
+    containIntrinsicInlineSize: string;
+    containIntrinsicSize: string;
+    containIntrinsicWidth: string;
+    container: string;
+    containerName: string;
+    containerType: string;
+    content: string;
+    contentVisibility: string;
+    counterIncrement: string;
+    counterReset: string;
+    counterSet: string;
+    cssFloat: string;
+    cssText: string;
+    cursor: string;
+    direction: string;
+    display: string;
+    dominantBaseline: string;
+    emptyCells: string;
+    fill: string;
+    fillOpacity: string;
+    fillRule: string;
+    filter: string;
+    flex: string;
+    flexBasis: string;
+    flexDirection: string;
+    flexFlow: string;
+    flexGrow: string;
+    flexShrink: string;
+    flexWrap: string;
+    float: string;
+    floodColor: string;
+    floodOpacity: string;
+    font: string;
+    fontFamily: string;
+    fontFeatureSettings: string;
+    fontKerning: string;
+    fontOpticalSizing: string;
+    fontPalette: string;
+    fontSize: string;
+    fontSizeAdjust: string;
+    fontStretch: string;
+    fontStyle: string;
+    fontSynthesis: string;
+    fontVariant: string;
+    fontVariantAlternates: string;
+    fontVariantCaps: string;
+    fontVariantEastAsian: string;
+    fontVariantLigatures: string;
+    fontVariantNumeric: string;
+    fontVariantPosition: string;
+    fontVariationSettings: string;
+    fontWeight: string;
+    gap: string;
+    grid: string;
+    gridArea: string;
+    gridAutoColumns: string;
+    gridAutoFlow: string;
+    gridAutoRows: string;
+    gridColumn: string;
+    gridColumnEnd: string;
+    /** @deprecated This is a legacy alias of \`columnGap\`. */
+    gridColumnGap: string;
+    gridColumnStart: string;
+    /** @deprecated This is a legacy alias of \`gap\`. */
+    gridGap: string;
+    gridRow: string;
+    gridRowEnd: string;
+    /** @deprecated This is a legacy alias of \`rowGap\`. */
+    gridRowGap: string;
+    gridRowStart: string;
+    gridTemplate: string;
+    gridTemplateAreas: string;
+    gridTemplateColumns: string;
+    gridTemplateRows: string;
+    height: string;
+    hyphenateCharacter: string;
+    hyphens: string;
+    /** @deprecated */
+    imageOrientation: string;
+    imageRendering: string;
+    inlineSize: string;
+    inset: string;
+    insetBlock: string;
+    insetBlockEnd: string;
+    insetBlockStart: string;
+    insetInline: string;
+    insetInlineEnd: string;
+    insetInlineStart: string;
+    isolation: string;
+    justifyContent: string;
+    justifyItems: string;
+    justifySelf: string;
+    left: string;
+    readonly length: number;
+    letterSpacing: string;
+    lightingColor: string;
+    lineBreak: string;
+    lineHeight: string;
+    listStyle: string;
+    listStyleImage: string;
+    listStylePosition: string;
+    listStyleType: string;
+    margin: string;
+    marginBlock: string;
+    marginBlockEnd: string;
+    marginBlockStart: string;
+    marginBottom: string;
+    marginInline: string;
+    marginInlineEnd: string;
+    marginInlineStart: string;
+    marginLeft: string;
+    marginRight: string;
+    marginTop: string;
+    marker: string;
+    markerEnd: string;
+    markerMid: string;
+    markerStart: string;
+    mask: string;
+    maskClip: string;
+    maskComposite: string;
+    maskImage: string;
+    maskMode: string;
+    maskOrigin: string;
+    maskPosition: string;
+    maskRepeat: string;
+    maskSize: string;
+    maskType: string;
+    mathStyle: string;
+    maxBlockSize: string;
+    maxHeight: string;
+    maxInlineSize: string;
+    maxWidth: string;
+    minBlockSize: string;
+    minHeight: string;
+    minInlineSize: string;
+    minWidth: string;
+    mixBlendMode: string;
+    objectFit: string;
+    objectPosition: string;
+    offset: string;
+    offsetDistance: string;
+    offsetPath: string;
+    offsetRotate: string;
+    opacity: string;
+    order: string;
+    orphans: string;
+    outline: string;
+    outlineColor: string;
+    outlineOffset: string;
+    outlineStyle: string;
+    outlineWidth: string;
+    overflow: string;
+    overflowAnchor: string;
+    overflowClipMargin: string;
+    overflowWrap: string;
+    overflowX: string;
+    overflowY: string;
+    overscrollBehavior: string;
+    overscrollBehaviorBlock: string;
+    overscrollBehaviorInline: string;
+    overscrollBehaviorX: string;
+    overscrollBehaviorY: string;
+    padding: string;
+    paddingBlock: string;
+    paddingBlockEnd: string;
+    paddingBlockStart: string;
+    paddingBottom: string;
+    paddingInline: string;
+    paddingInlineEnd: string;
+    paddingInlineStart: string;
+    paddingLeft: string;
+    paddingRight: string;
+    paddingTop: string;
+    pageBreakAfter: string;
+    pageBreakBefore: string;
+    pageBreakInside: string;
+    paintOrder: string;
+    readonly parentRule: CSSRule | null;
+    perspective: string;
+    perspectiveOrigin: string;
+    placeContent: string;
+    placeItems: string;
+    placeSelf: string;
+    pointerEvents: string;
+    position: string;
+    printColorAdjust: string;
+    quotes: string;
+    resize: string;
+    right: string;
+    rotate: string;
+    rowGap: string;
+    rubyPosition: string;
+    scale: string;
+    scrollBehavior: string;
+    scrollMargin: string;
+    scrollMarginBlock: string;
+    scrollMarginBlockEnd: string;
+    scrollMarginBlockStart: string;
+    scrollMarginBottom: string;
+    scrollMarginInline: string;
+    scrollMarginInlineEnd: string;
+    scrollMarginInlineStart: string;
+    scrollMarginLeft: string;
+    scrollMarginRight: string;
+    scrollMarginTop: string;
+    scrollPadding: string;
+    scrollPaddingBlock: string;
+    scrollPaddingBlockEnd: string;
+    scrollPaddingBlockStart: string;
+    scrollPaddingBottom: string;
+    scrollPaddingInline: string;
+    scrollPaddingInlineEnd: string;
+    scrollPaddingInlineStart: string;
+    scrollPaddingLeft: string;
+    scrollPaddingRight: string;
+    scrollPaddingTop: string;
+    scrollSnapAlign: string;
+    scrollSnapStop: string;
+    scrollSnapType: string;
+    scrollbarGutter: string;
+    shapeImageThreshold: string;
+    shapeMargin: string;
+    shapeOutside: string;
+    shapeRendering: string;
+    stopColor: string;
+    stopOpacity: string;
+    stroke: string;
+    strokeDasharray: string;
+    strokeDashoffset: string;
+    strokeLinecap: string;
+    strokeLinejoin: string;
+    strokeMiterlimit: string;
+    strokeOpacity: string;
+    strokeWidth: string;
+    tabSize: string;
+    tableLayout: string;
+    textAlign: string;
+    textAlignLast: string;
+    textAnchor: string;
+    textCombineUpright: string;
+    textDecoration: string;
+    textDecorationColor: string;
+    textDecorationLine: string;
+    textDecorationSkipInk: string;
+    textDecorationStyle: string;
+    textDecorationThickness: string;
+    textEmphasis: string;
+    textEmphasisColor: string;
+    textEmphasisPosition: string;
+    textEmphasisStyle: string;
+    textIndent: string;
+    textOrientation: string;
+    textOverflow: string;
+    textRendering: string;
+    textShadow: string;
+    textTransform: string;
+    textUnderlineOffset: string;
+    textUnderlinePosition: string;
+    top: string;
+    touchAction: string;
+    transform: string;
+    transformBox: string;
+    transformOrigin: string;
+    transformStyle: string;
+    transition: string;
+    transitionDelay: string;
+    transitionDuration: string;
+    transitionProperty: string;
+    transitionTimingFunction: string;
+    translate: string;
+    unicodeBidi: string;
+    userSelect: string;
+    verticalAlign: string;
+    visibility: string;
+    /** @deprecated This is a legacy alias of \`alignContent\`. */
+    webkitAlignContent: string;
+    /** @deprecated This is a legacy alias of \`alignItems\`. */
+    webkitAlignItems: string;
+    /** @deprecated This is a legacy alias of \`alignSelf\`. */
+    webkitAlignSelf: string;
+    /** @deprecated This is a legacy alias of \`animation\`. */
+    webkitAnimation: string;
+    /** @deprecated This is a legacy alias of \`animationDelay\`. */
+    webkitAnimationDelay: string;
+    /** @deprecated This is a legacy alias of \`animationDirection\`. */
+    webkitAnimationDirection: string;
+    /** @deprecated This is a legacy alias of \`animationDuration\`. */
+    webkitAnimationDuration: string;
+    /** @deprecated This is a legacy alias of \`animationFillMode\`. */
+    webkitAnimationFillMode: string;
+    /** @deprecated This is a legacy alias of \`animationIterationCount\`. */
+    webkitAnimationIterationCount: string;
+    /** @deprecated This is a legacy alias of \`animationName\`. */
+    webkitAnimationName: string;
+    /** @deprecated This is a legacy alias of \`animationPlayState\`. */
+    webkitAnimationPlayState: string;
+    /** @deprecated This is a legacy alias of \`animationTimingFunction\`. */
+    webkitAnimationTimingFunction: string;
+    /** @deprecated This is a legacy alias of \`appearance\`. */
+    webkitAppearance: string;
+    /** @deprecated This is a legacy alias of \`backfaceVisibility\`. */
+    webkitBackfaceVisibility: string;
+    /** @deprecated This is a legacy alias of \`backgroundClip\`. */
+    webkitBackgroundClip: string;
+    /** @deprecated This is a legacy alias of \`backgroundOrigin\`. */
+    webkitBackgroundOrigin: string;
+    /** @deprecated This is a legacy alias of \`backgroundSize\`. */
+    webkitBackgroundSize: string;
+    /** @deprecated This is a legacy alias of \`borderBottomLeftRadius\`. */
+    webkitBorderBottomLeftRadius: string;
+    /** @deprecated This is a legacy alias of \`borderBottomRightRadius\`. */
+    webkitBorderBottomRightRadius: string;
+    /** @deprecated This is a legacy alias of \`borderRadius\`. */
+    webkitBorderRadius: string;
+    /** @deprecated This is a legacy alias of \`borderTopLeftRadius\`. */
+    webkitBorderTopLeftRadius: string;
+    /** @deprecated This is a legacy alias of \`borderTopRightRadius\`. */
+    webkitBorderTopRightRadius: string;
+    /** @deprecated This is a legacy alias of \`boxAlign\`. */
+    webkitBoxAlign: string;
+    /** @deprecated This is a legacy alias of \`boxFlex\`. */
+    webkitBoxFlex: string;
+    /** @deprecated This is a legacy alias of \`boxOrdinalGroup\`. */
+    webkitBoxOrdinalGroup: string;
+    /** @deprecated This is a legacy alias of \`boxOrient\`. */
+    webkitBoxOrient: string;
+    /** @deprecated This is a legacy alias of \`boxPack\`. */
+    webkitBoxPack: string;
+    /** @deprecated This is a legacy alias of \`boxShadow\`. */
+    webkitBoxShadow: string;
+    /** @deprecated This is a legacy alias of \`boxSizing\`. */
+    webkitBoxSizing: string;
+    /** @deprecated This is a legacy alias of \`filter\`. */
+    webkitFilter: string;
+    /** @deprecated This is a legacy alias of \`flex\`. */
+    webkitFlex: string;
+    /** @deprecated This is a legacy alias of \`flexBasis\`. */
+    webkitFlexBasis: string;
+    /** @deprecated This is a legacy alias of \`flexDirection\`. */
+    webkitFlexDirection: string;
+    /** @deprecated This is a legacy alias of \`flexFlow\`. */
+    webkitFlexFlow: string;
+    /** @deprecated This is a legacy alias of \`flexGrow\`. */
+    webkitFlexGrow: string;
+    /** @deprecated This is a legacy alias of \`flexShrink\`. */
+    webkitFlexShrink: string;
+    /** @deprecated This is a legacy alias of \`flexWrap\`. */
+    webkitFlexWrap: string;
+    /** @deprecated This is a legacy alias of \`justifyContent\`. */
+    webkitJustifyContent: string;
+    webkitLineClamp: string;
+    /** @deprecated This is a legacy alias of \`mask\`. */
+    webkitMask: string;
+    /** @deprecated This is a legacy alias of \`maskBorder\`. */
+    webkitMaskBoxImage: string;
+    /** @deprecated This is a legacy alias of \`maskBorderOutset\`. */
+    webkitMaskBoxImageOutset: string;
+    /** @deprecated This is a legacy alias of \`maskBorderRepeat\`. */
+    webkitMaskBoxImageRepeat: string;
+    /** @deprecated This is a legacy alias of \`maskBorderSlice\`. */
+    webkitMaskBoxImageSlice: string;
+    /** @deprecated This is a legacy alias of \`maskBorderSource\`. */
+    webkitMaskBoxImageSource: string;
+    /** @deprecated This is a legacy alias of \`maskBorderWidth\`. */
+    webkitMaskBoxImageWidth: string;
+    /** @deprecated This is a legacy alias of \`maskClip\`. */
+    webkitMaskClip: string;
+    webkitMaskComposite: string;
+    /** @deprecated This is a legacy alias of \`maskImage\`. */
+    webkitMaskImage: string;
+    /** @deprecated This is a legacy alias of \`maskOrigin\`. */
+    webkitMaskOrigin: string;
+    /** @deprecated This is a legacy alias of \`maskPosition\`. */
+    webkitMaskPosition: string;
+    /** @deprecated This is a legacy alias of \`maskRepeat\`. */
+    webkitMaskRepeat: string;
+    /** @deprecated This is a legacy alias of \`maskSize\`. */
+    webkitMaskSize: string;
+    /** @deprecated This is a legacy alias of \`order\`. */
+    webkitOrder: string;
+    /** @deprecated This is a legacy alias of \`perspective\`. */
+    webkitPerspective: string;
+    /** @deprecated This is a legacy alias of \`perspectiveOrigin\`. */
+    webkitPerspectiveOrigin: string;
+    webkitTextFillColor: string;
+    /** @deprecated This is a legacy alias of \`textSizeAdjust\`. */
+    webkitTextSizeAdjust: string;
+    webkitTextStroke: string;
+    webkitTextStrokeColor: string;
+    webkitTextStrokeWidth: string;
+    /** @deprecated This is a legacy alias of \`transform\`. */
+    webkitTransform: string;
+    /** @deprecated This is a legacy alias of \`transformOrigin\`. */
+    webkitTransformOrigin: string;
+    /** @deprecated This is a legacy alias of \`transformStyle\`. */
+    webkitTransformStyle: string;
+    /** @deprecated This is a legacy alias of \`transition\`. */
+    webkitTransition: string;
+    /** @deprecated This is a legacy alias of \`transitionDelay\`. */
+    webkitTransitionDelay: string;
+    /** @deprecated This is a legacy alias of \`transitionDuration\`. */
+    webkitTransitionDuration: string;
+    /** @deprecated This is a legacy alias of \`transitionProperty\`. */
+    webkitTransitionProperty: string;
+    /** @deprecated This is a legacy alias of \`transitionTimingFunction\`. */
+    webkitTransitionTimingFunction: string;
+    /** @deprecated This is a legacy alias of \`userSelect\`. */
+    webkitUserSelect: string;
+    whiteSpace: string;
+    widows: string;
+    width: string;
+    willChange: string;
+    wordBreak: string;
+    wordSpacing: string;
+    /** @deprecated */
+    wordWrap: string;
+    writingMode: string;
+    zIndex: string;
+    getPropertyPriority(property: string): string;
+    getPropertyValue(property: string): string;
+    item(index: number): string;
+    removeProperty(property: string): string;
+    setProperty(property: string, value: string | null, priority?: string): void;
+    [index: number]: string;
+}
+
+declare var CSSStyleDeclaration: {
+    prototype: CSSStyleDeclaration;
+    new(): CSSStyleDeclaration;
+};
+
+/** CSSStyleRule represents a single CSS style rule. It implements the CSSRule interface with a type value of 1 (CSSRule.STYLE_RULE). */
+interface CSSStyleRule extends CSSRule {
+    selectorText: string;
+    readonly style: CSSStyleDeclaration;
+}
+
+declare var CSSStyleRule: {
+    prototype: CSSStyleRule;
+    new(): CSSStyleRule;
+};
+
+/** A single CSS style sheet. It inherits properties and methods from its parent, StyleSheet. */
+interface CSSStyleSheet extends StyleSheet {
+    readonly cssRules: CSSRuleList;
+    readonly ownerRule: CSSRule | null;
+    /** @deprecated */
+    readonly rules: CSSRuleList;
+    /** @deprecated */
+    addRule(selector?: string, style?: string, index?: number): number;
+    deleteRule(index: number): void;
+    insertRule(rule: string, index?: number): number;
+    /** @deprecated */
+    removeRule(index?: number): void;
+    replace(text: string): Promise<CSSStyleSheet>;
+    replaceSync(text: string): void;
+}
+
+declare var CSSStyleSheet: {
+    prototype: CSSStyleSheet;
+    new(options?: CSSStyleSheetInit): CSSStyleSheet;
+};
+
+/** An object representing a single CSS @supports at-rule. It implements the CSSConditionRule interface, and therefore the CSSRule and CSSGroupingRule interfaces with a type value of 12 (CSSRule.SUPPORTS_RULE). */
+interface CSSSupportsRule extends CSSConditionRule {
+}
+
+declare var CSSSupportsRule: {
+    prototype: CSSSupportsRule;
+    new(): CSSSupportsRule;
+};
+
+interface CSSTransition extends Animation {
+    readonly transitionProperty: string;
+    addEventListener<K extends keyof AnimationEventMap>(type: K, listener: (this: CSSTransition, ev: AnimationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof AnimationEventMap>(type: K, listener: (this: CSSTransition, ev: AnimationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var CSSTransition: {
+    prototype: CSSTransition;
+    new(): CSSTransition;
+};
+
+/**
+ * Provides a storage mechanism for Request / Response object pairs that are cached, for example as part of the ServiceWorker life cycle. Note that the Cache interface is exposed to windowed scopes as well as workers. You don't have to use it in conjunction with service workers, even though it is defined in the service worker spec.
+ * Available only in secure contexts.
+ */
+interface Cache {
+    add(request: RequestInfo | URL): Promise<void>;
+    addAll(requests: RequestInfo[]): Promise<void>;
+    delete(request: RequestInfo | URL, options?: CacheQueryOptions): Promise<boolean>;
+    keys(request?: RequestInfo | URL, options?: CacheQueryOptions): Promise<ReadonlyArray<Request>>;
+    match(request: RequestInfo | URL, options?: CacheQueryOptions): Promise<Response | undefined>;
+    matchAll(request?: RequestInfo | URL, options?: CacheQueryOptions): Promise<ReadonlyArray<Response>>;
+    put(request: RequestInfo | URL, response: Response): Promise<void>;
+}
+
+declare var Cache: {
+    prototype: Cache;
+    new(): Cache;
+};
+
+/**
+ * The storage for Cache objects.
+ * Available only in secure contexts.
+ */
+interface CacheStorage {
+    delete(cacheName: string): Promise<boolean>;
+    has(cacheName: string): Promise<boolean>;
+    keys(): Promise<string[]>;
+    match(request: RequestInfo | URL, options?: MultiCacheQueryOptions): Promise<Response | undefined>;
+    open(cacheName: string): Promise<Cache>;
+}
+
+declare var CacheStorage: {
+    prototype: CacheStorage;
+    new(): CacheStorage;
+};
+
+interface CanvasCaptureMediaStreamTrack extends MediaStreamTrack {
+    readonly canvas: HTMLCanvasElement;
+    requestFrame(): void;
+    addEventListener<K extends keyof MediaStreamTrackEventMap>(type: K, listener: (this: CanvasCaptureMediaStreamTrack, ev: MediaStreamTrackEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MediaStreamTrackEventMap>(type: K, listener: (this: CanvasCaptureMediaStreamTrack, ev: MediaStreamTrackEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var CanvasCaptureMediaStreamTrack: {
+    prototype: CanvasCaptureMediaStreamTrack;
+    new(): CanvasCaptureMediaStreamTrack;
+};
+
+interface CanvasCompositing {
+    globalAlpha: number;
+    globalCompositeOperation: GlobalCompositeOperation;
+}
+
+interface CanvasDrawImage {
+    drawImage(image: CanvasImageSource, dx: number, dy: number): void;
+    drawImage(image: CanvasImageSource, dx: number, dy: number, dw: number, dh: number): void;
+    drawImage(image: CanvasImageSource, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): void;
+}
+
+interface CanvasDrawPath {
+    beginPath(): void;
+    clip(fillRule?: CanvasFillRule): void;
+    clip(path: Path2D, fillRule?: CanvasFillRule): void;
+    fill(fillRule?: CanvasFillRule): void;
+    fill(path: Path2D, fillRule?: CanvasFillRule): void;
+    isPointInPath(x: number, y: number, fillRule?: CanvasFillRule): boolean;
+    isPointInPath(path: Path2D, x: number, y: number, fillRule?: CanvasFillRule): boolean;
+    isPointInStroke(x: number, y: number): boolean;
+    isPointInStroke(path: Path2D, x: number, y: number): boolean;
+    stroke(): void;
+    stroke(path: Path2D): void;
+}
+
+interface CanvasFillStrokeStyles {
+    fillStyle: string | CanvasGradient | CanvasPattern;
+    strokeStyle: string | CanvasGradient | CanvasPattern;
+    createConicGradient(startAngle: number, x: number, y: number): CanvasGradient;
+    createLinearGradient(x0: number, y0: number, x1: number, y1: number): CanvasGradient;
+    createPattern(image: CanvasImageSource, repetition: string | null): CanvasPattern | null;
+    createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): CanvasGradient;
+}
+
+interface CanvasFilters {
+    filter: string;
+}
+
+/** An opaque object describing a gradient. It is returned by the methods CanvasRenderingContext2D.createLinearGradient() or CanvasRenderingContext2D.createRadialGradient(). */
+interface CanvasGradient {
+    /**
+     * Adds a color stop with the given color to the gradient at the given offset. 0.0 is the offset at one end of the gradient, 1.0 is the offset at the other end.
+     *
+     * Throws an "IndexSizeError" DOMException if the offset is out of range. Throws a "SyntaxError" DOMException if the color cannot be parsed.
+     */
+    addColorStop(offset: number, color: string): void;
+}
+
+declare var CanvasGradient: {
+    prototype: CanvasGradient;
+    new(): CanvasGradient;
+};
+
+interface CanvasImageData {
+    createImageData(sw: number, sh: number, settings?: ImageDataSettings): ImageData;
+    createImageData(imagedata: ImageData): ImageData;
+    getImageData(sx: number, sy: number, sw: number, sh: number, settings?: ImageDataSettings): ImageData;
+    putImageData(imagedata: ImageData, dx: number, dy: number): void;
+    putImageData(imagedata: ImageData, dx: number, dy: number, dirtyX: number, dirtyY: number, dirtyWidth: number, dirtyHeight: number): void;
+}
+
+interface CanvasImageSmoothing {
+    imageSmoothingEnabled: boolean;
+    imageSmoothingQuality: ImageSmoothingQuality;
+}
+
+interface CanvasPath {
+    arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void;
+    arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;
+    bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
+    closePath(): void;
+    ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void;
+    lineTo(x: number, y: number): void;
+    moveTo(x: number, y: number): void;
+    quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
+    rect(x: number, y: number, w: number, h: number): void;
+    roundRect(x: number, y: number, w: number, h: number, radii?: number | DOMPointInit | (number | DOMPointInit)[]): void;
+}
+
+interface CanvasPathDrawingStyles {
+    lineCap: CanvasLineCap;
+    lineDashOffset: number;
+    lineJoin: CanvasLineJoin;
+    lineWidth: number;
+    miterLimit: number;
+    getLineDash(): number[];
+    setLineDash(segments: number[]): void;
+}
+
+/** An opaque object describing a pattern, based on an image, a canvas, or a video, created by the CanvasRenderingContext2D.createPattern() method. */
+interface CanvasPattern {
+    /** Sets the transformation matrix that will be used when rendering the pattern during a fill or stroke painting operation. */
+    setTransform(transform?: DOMMatrix2DInit): void;
+}
+
+declare var CanvasPattern: {
+    prototype: CanvasPattern;
+    new(): CanvasPattern;
+};
+
+interface CanvasRect {
+    clearRect(x: number, y: number, w: number, h: number): void;
+    fillRect(x: number, y: number, w: number, h: number): void;
+    strokeRect(x: number, y: number, w: number, h: number): void;
+}
+
+/** The CanvasRenderingContext2D interface, part of the Canvas API, provides the 2D rendering context for the drawing surface of a <canvas> element. It is used for drawing shapes, text, images, and other objects. */
+interface CanvasRenderingContext2D extends CanvasCompositing, CanvasDrawImage, CanvasDrawPath, CanvasFillStrokeStyles, CanvasFilters, CanvasImageData, CanvasImageSmoothing, CanvasPath, CanvasPathDrawingStyles, CanvasRect, CanvasShadowStyles, CanvasState, CanvasText, CanvasTextDrawingStyles, CanvasTransform, CanvasUserInterface {
+    readonly canvas: HTMLCanvasElement;
+    getContextAttributes(): CanvasRenderingContext2DSettings;
+}
+
+declare var CanvasRenderingContext2D: {
+    prototype: CanvasRenderingContext2D;
+    new(): CanvasRenderingContext2D;
+};
+
+interface CanvasShadowStyles {
+    shadowBlur: number;
+    shadowColor: string;
+    shadowOffsetX: number;
+    shadowOffsetY: number;
+}
+
+interface CanvasState {
+    restore(): void;
+    save(): void;
+}
+
+interface CanvasText {
+    fillText(text: string, x: number, y: number, maxWidth?: number): void;
+    measureText(text: string): TextMetrics;
+    strokeText(text: string, x: number, y: number, maxWidth?: number): void;
+}
+
+interface CanvasTextDrawingStyles {
+    direction: CanvasDirection;
+    font: string;
+    fontKerning: CanvasFontKerning;
+    textAlign: CanvasTextAlign;
+    textBaseline: CanvasTextBaseline;
+}
+
+interface CanvasTransform {
+    getTransform(): DOMMatrix;
+    resetTransform(): void;
+    rotate(angle: number): void;
+    scale(x: number, y: number): void;
+    setTransform(a: number, b: number, c: number, d: number, e: number, f: number): void;
+    setTransform(transform?: DOMMatrix2DInit): void;
+    transform(a: number, b: number, c: number, d: number, e: number, f: number): void;
+    translate(x: number, y: number): void;
+}
+
+interface CanvasUserInterface {
+    drawFocusIfNeeded(element: Element): void;
+    drawFocusIfNeeded(path: Path2D, element: Element): void;
+}
+
+/** The ChannelMergerNode interface, often used in conjunction with its opposite, ChannelSplitterNode, reunites different mono inputs into a single output. Each input is used to fill a channel of the output. This is useful for accessing each channels separately, e.g. for performing channel mixing where gain must be separately controlled on each channel. */
+interface ChannelMergerNode extends AudioNode {
+}
+
+declare var ChannelMergerNode: {
+    prototype: ChannelMergerNode;
+    new(context: BaseAudioContext, options?: ChannelMergerOptions): ChannelMergerNode;
+};
+
+/** The ChannelSplitterNode interface, often used in conjunction with its opposite, ChannelMergerNode, separates the different channels of an audio source into a set of mono outputs. This is useful for accessing each channel separately, e.g. for performing channel mixing where gain must be separately controlled on each channel. */
+interface ChannelSplitterNode extends AudioNode {
+}
+
+declare var ChannelSplitterNode: {
+    prototype: ChannelSplitterNode;
+    new(context: BaseAudioContext, options?: ChannelSplitterOptions): ChannelSplitterNode;
+};
+
+/** The CharacterData abstract interface represents a Node object that contains characters. This is an abstract interface, meaning there aren't any object of type CharacterData: it is implemented by other interfaces, like Text, Comment, or ProcessingInstruction which aren't abstract. */
+interface CharacterData extends Node, ChildNode, NonDocumentTypeChildNode {
+    data: string;
+    readonly length: number;
+    readonly ownerDocument: Document;
+    appendData(data: string): void;
+    deleteData(offset: number, count: number): void;
+    insertData(offset: number, data: string): void;
+    replaceData(offset: number, count: number, data: string): void;
+    substringData(offset: number, count: number): string;
+}
+
+declare var CharacterData: {
+    prototype: CharacterData;
+    new(): CharacterData;
+};
+
+interface ChildNode extends Node {
+    /**
+     * Inserts nodes just after node, while replacing strings in nodes with equivalent Text nodes.
+     *
+     * Throws a "HierarchyRequestError" DOMException if the constraints of the node tree are violated.
+     */
+    after(...nodes: (Node | string)[]): void;
+    /**
+     * Inserts nodes just before node, while replacing strings in nodes with equivalent Text nodes.
+     *
+     * Throws a "HierarchyRequestError" DOMException if the constraints of the node tree are violated.
+     */
+    before(...nodes: (Node | string)[]): void;
+    /** Removes node. */
+    remove(): void;
+    /**
+     * Replaces node with nodes, while replacing strings in nodes with equivalent Text nodes.
+     *
+     * Throws a "HierarchyRequestError" DOMException if the constraints of the node tree are violated.
+     */
+    replaceWith(...nodes: (Node | string)[]): void;
+}
+
+/** @deprecated */
+interface ClientRect extends DOMRect {
+}
+
+/** Available only in secure contexts. */
+interface Clipboard extends EventTarget {
+    read(): Promise<ClipboardItems>;
+    readText(): Promise<string>;
+    write(data: ClipboardItems): Promise<void>;
+    writeText(data: string): Promise<void>;
+}
+
+declare var Clipboard: {
+    prototype: Clipboard;
+    new(): Clipboard;
+};
+
+/** Events providing information related to modification of the clipboard, that is cut, copy, and paste events. */
+interface ClipboardEvent extends Event {
+    readonly clipboardData: DataTransfer | null;
+}
+
+declare var ClipboardEvent: {
+    prototype: ClipboardEvent;
+    new(type: string, eventInitDict?: ClipboardEventInit): ClipboardEvent;
+};
+
+/** Available only in secure contexts. */
+interface ClipboardItem {
+    readonly presentationStyle: PresentationStyle;
+    readonly types: ReadonlyArray<string>;
+    getType(type: string): Promise<Blob>;
+}
+
+declare var ClipboardItem: {
+    prototype: ClipboardItem;
+    new(items: Record<string, string | Blob | PromiseLike<string | Blob>>, options?: ClipboardItemOptions): ClipboardItem;
+};
+
+/** A CloseEvent is sent to clients using WebSockets when the connection is closed. This is delivered to the listener indicated by the WebSocket object's onclose attribute. */
+interface CloseEvent extends Event {
+    /** Returns the WebSocket connection close code provided by the server. */
+    readonly code: number;
+    /** Returns the WebSocket connection close reason provided by the server. */
+    readonly reason: string;
+    /** Returns true if the connection closed cleanly; false otherwise. */
+    readonly wasClean: boolean;
+}
+
+declare var CloseEvent: {
+    prototype: CloseEvent;
+    new(type: string, eventInitDict?: CloseEventInit): CloseEvent;
+};
+
+/** Textual notations within markup; although it is generally not visually shown, such comments are available to be read in the source view. */
+interface Comment extends CharacterData {
+}
+
+declare var Comment: {
+    prototype: Comment;
+    new(data?: string): Comment;
+};
+
+/** The DOM CompositionEvent represents events that occur due to the user indirectly entering text. */
+interface CompositionEvent extends UIEvent {
+    readonly data: string;
+    /** @deprecated */
+    initCompositionEvent(typeArg: string, bubblesArg?: boolean, cancelableArg?: boolean, viewArg?: WindowProxy | null, dataArg?: string): void;
+}
+
+declare var CompositionEvent: {
+    prototype: CompositionEvent;
+    new(type: string, eventInitDict?: CompositionEventInit): CompositionEvent;
+};
+
+interface ConstantSourceNode extends AudioScheduledSourceNode {
+    readonly offset: AudioParam;
+    addEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: ConstantSourceNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: ConstantSourceNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var ConstantSourceNode: {
+    prototype: ConstantSourceNode;
+    new(context: BaseAudioContext, options?: ConstantSourceOptions): ConstantSourceNode;
+};
+
+/** An AudioNode that performs a Linear Convolution on a given AudioBuffer, often used to achieve a reverb effect. A ConvolverNode always has exactly one input and one output. */
+interface ConvolverNode extends AudioNode {
+    buffer: AudioBuffer | null;
+    normalize: boolean;
+}
+
+declare var ConvolverNode: {
+    prototype: ConvolverNode;
+    new(context: BaseAudioContext, options?: ConvolverOptions): ConvolverNode;
+};
+
+/** This Streams API interface provides\xA0a built-in byte length queuing strategy that can be used when constructing streams. */
+interface CountQueuingStrategy extends QueuingStrategy {
+    readonly highWaterMark: number;
+    readonly size: QueuingStrategySize;
+}
+
+declare var CountQueuingStrategy: {
+    prototype: CountQueuingStrategy;
+    new(init: QueuingStrategyInit): CountQueuingStrategy;
+};
+
+/** Available only in secure contexts. */
+interface Credential {
+    readonly id: string;
+    readonly type: string;
+}
+
+declare var Credential: {
+    prototype: Credential;
+    new(): Credential;
+};
+
+/** Available only in secure contexts. */
+interface CredentialsContainer {
+    create(options?: CredentialCreationOptions): Promise<Credential | null>;
+    get(options?: CredentialRequestOptions): Promise<Credential | null>;
+    preventSilentAccess(): Promise<void>;
+    store(credential: Credential): Promise<Credential>;
+}
+
+declare var CredentialsContainer: {
+    prototype: CredentialsContainer;
+    new(): CredentialsContainer;
+};
+
+/** Basic cryptography features available in the current context. It allows access to a cryptographically strong random number generator and to cryptographic primitives. */
+interface Crypto {
+    /** Available only in secure contexts. */
+    readonly subtle: SubtleCrypto;
+    getRandomValues<T extends ArrayBufferView | null>(array: T): T;
+    /** Available only in secure contexts. */
+    randomUUID(): \`\${string}-\${string}-\${string}-\${string}-\${string}\`;
+}
+
+declare var Crypto: {
+    prototype: Crypto;
+    new(): Crypto;
+};
+
+/**
+ * The CryptoKey dictionary of the Web Crypto API represents a cryptographic key.
+ * Available only in secure contexts.
+ */
+interface CryptoKey {
+    readonly algorithm: KeyAlgorithm;
+    readonly extractable: boolean;
+    readonly type: KeyType;
+    readonly usages: KeyUsage[];
+}
+
+declare var CryptoKey: {
+    prototype: CryptoKey;
+    new(): CryptoKey;
+};
+
+interface CustomElementRegistry {
+    define(name: string, constructor: CustomElementConstructor, options?: ElementDefinitionOptions): void;
+    get(name: string): CustomElementConstructor | undefined;
+    upgrade(root: Node): void;
+    whenDefined(name: string): Promise<CustomElementConstructor>;
+}
+
+declare var CustomElementRegistry: {
+    prototype: CustomElementRegistry;
+    new(): CustomElementRegistry;
+};
+
+interface CustomEvent<T = any> extends Event {
+    /** Returns any custom data event was created with. Typically used for synthetic events. */
+    readonly detail: T;
+    /** @deprecated */
+    initCustomEvent(type: string, bubbles?: boolean, cancelable?: boolean, detail?: T): void;
+}
+
+declare var CustomEvent: {
+    prototype: CustomEvent;
+    new<T>(type: string, eventInitDict?: CustomEventInit<T>): CustomEvent<T>;
+};
+
+/** An abnormal event (called an exception) which occurs as a result of calling a method or accessing a property of a web API. */
+interface DOMException extends Error {
+    /** @deprecated */
+    readonly code: number;
+    readonly message: string;
+    readonly name: string;
+    readonly INDEX_SIZE_ERR: 1;
+    readonly DOMSTRING_SIZE_ERR: 2;
+    readonly HIERARCHY_REQUEST_ERR: 3;
+    readonly WRONG_DOCUMENT_ERR: 4;
+    readonly INVALID_CHARACTER_ERR: 5;
+    readonly NO_DATA_ALLOWED_ERR: 6;
+    readonly NO_MODIFICATION_ALLOWED_ERR: 7;
+    readonly NOT_FOUND_ERR: 8;
+    readonly NOT_SUPPORTED_ERR: 9;
+    readonly INUSE_ATTRIBUTE_ERR: 10;
+    readonly INVALID_STATE_ERR: 11;
+    readonly SYNTAX_ERR: 12;
+    readonly INVALID_MODIFICATION_ERR: 13;
+    readonly NAMESPACE_ERR: 14;
+    readonly INVALID_ACCESS_ERR: 15;
+    readonly VALIDATION_ERR: 16;
+    readonly TYPE_MISMATCH_ERR: 17;
+    readonly SECURITY_ERR: 18;
+    readonly NETWORK_ERR: 19;
+    readonly ABORT_ERR: 20;
+    readonly URL_MISMATCH_ERR: 21;
+    readonly QUOTA_EXCEEDED_ERR: 22;
+    readonly TIMEOUT_ERR: 23;
+    readonly INVALID_NODE_TYPE_ERR: 24;
+    readonly DATA_CLONE_ERR: 25;
+}
+
+declare var DOMException: {
+    prototype: DOMException;
+    new(message?: string, name?: string): DOMException;
+    readonly INDEX_SIZE_ERR: 1;
+    readonly DOMSTRING_SIZE_ERR: 2;
+    readonly HIERARCHY_REQUEST_ERR: 3;
+    readonly WRONG_DOCUMENT_ERR: 4;
+    readonly INVALID_CHARACTER_ERR: 5;
+    readonly NO_DATA_ALLOWED_ERR: 6;
+    readonly NO_MODIFICATION_ALLOWED_ERR: 7;
+    readonly NOT_FOUND_ERR: 8;
+    readonly NOT_SUPPORTED_ERR: 9;
+    readonly INUSE_ATTRIBUTE_ERR: 10;
+    readonly INVALID_STATE_ERR: 11;
+    readonly SYNTAX_ERR: 12;
+    readonly INVALID_MODIFICATION_ERR: 13;
+    readonly NAMESPACE_ERR: 14;
+    readonly INVALID_ACCESS_ERR: 15;
+    readonly VALIDATION_ERR: 16;
+    readonly TYPE_MISMATCH_ERR: 17;
+    readonly SECURITY_ERR: 18;
+    readonly NETWORK_ERR: 19;
+    readonly ABORT_ERR: 20;
+    readonly URL_MISMATCH_ERR: 21;
+    readonly QUOTA_EXCEEDED_ERR: 22;
+    readonly TIMEOUT_ERR: 23;
+    readonly INVALID_NODE_TYPE_ERR: 24;
+    readonly DATA_CLONE_ERR: 25;
+};
+
+/** An object providing methods which are not dependent on any particular document. Such an object is returned by the Document.implementation property. */
+interface DOMImplementation {
+    createDocument(namespace: string | null, qualifiedName: string | null, doctype?: DocumentType | null): XMLDocument;
+    createDocumentType(qualifiedName: string, publicId: string, systemId: string): DocumentType;
+    createHTMLDocument(title?: string): Document;
+    /** @deprecated */
+    hasFeature(...args: any[]): true;
+}
+
+declare var DOMImplementation: {
+    prototype: DOMImplementation;
+    new(): DOMImplementation;
+};
+
+interface DOMMatrix extends DOMMatrixReadOnly {
+    a: number;
+    b: number;
+    c: number;
+    d: number;
+    e: number;
+    f: number;
+    m11: number;
+    m12: number;
+    m13: number;
+    m14: number;
+    m21: number;
+    m22: number;
+    m23: number;
+    m24: number;
+    m31: number;
+    m32: number;
+    m33: number;
+    m34: number;
+    m41: number;
+    m42: number;
+    m43: number;
+    m44: number;
+    invertSelf(): DOMMatrix;
+    multiplySelf(other?: DOMMatrixInit): DOMMatrix;
+    preMultiplySelf(other?: DOMMatrixInit): DOMMatrix;
+    rotateAxisAngleSelf(x?: number, y?: number, z?: number, angle?: number): DOMMatrix;
+    rotateFromVectorSelf(x?: number, y?: number): DOMMatrix;
+    rotateSelf(rotX?: number, rotY?: number, rotZ?: number): DOMMatrix;
+    scale3dSelf(scale?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
+    scaleSelf(scaleX?: number, scaleY?: number, scaleZ?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
+    setMatrixValue(transformList: string): DOMMatrix;
+    skewXSelf(sx?: number): DOMMatrix;
+    skewYSelf(sy?: number): DOMMatrix;
+    translateSelf(tx?: number, ty?: number, tz?: number): DOMMatrix;
+}
+
+declare var DOMMatrix: {
+    prototype: DOMMatrix;
+    new(init?: string | number[]): DOMMatrix;
+    fromFloat32Array(array32: Float32Array): DOMMatrix;
+    fromFloat64Array(array64: Float64Array): DOMMatrix;
+    fromMatrix(other?: DOMMatrixInit): DOMMatrix;
+};
+
+type SVGMatrix = DOMMatrix;
+declare var SVGMatrix: typeof DOMMatrix;
+
+type WebKitCSSMatrix = DOMMatrix;
+declare var WebKitCSSMatrix: typeof DOMMatrix;
+
+interface DOMMatrixReadOnly {
+    readonly a: number;
+    readonly b: number;
+    readonly c: number;
+    readonly d: number;
+    readonly e: number;
+    readonly f: number;
+    readonly is2D: boolean;
+    readonly isIdentity: boolean;
+    readonly m11: number;
+    readonly m12: number;
+    readonly m13: number;
+    readonly m14: number;
+    readonly m21: number;
+    readonly m22: number;
+    readonly m23: number;
+    readonly m24: number;
+    readonly m31: number;
+    readonly m32: number;
+    readonly m33: number;
+    readonly m34: number;
+    readonly m41: number;
+    readonly m42: number;
+    readonly m43: number;
+    readonly m44: number;
+    flipX(): DOMMatrix;
+    flipY(): DOMMatrix;
+    inverse(): DOMMatrix;
+    multiply(other?: DOMMatrixInit): DOMMatrix;
+    rotate(rotX?: number, rotY?: number, rotZ?: number): DOMMatrix;
+    rotateAxisAngle(x?: number, y?: number, z?: number, angle?: number): DOMMatrix;
+    rotateFromVector(x?: number, y?: number): DOMMatrix;
+    scale(scaleX?: number, scaleY?: number, scaleZ?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
+    scale3d(scale?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
+    /** @deprecated */
+    scaleNonUniform(scaleX?: number, scaleY?: number): DOMMatrix;
+    skewX(sx?: number): DOMMatrix;
+    skewY(sy?: number): DOMMatrix;
+    toFloat32Array(): Float32Array;
+    toFloat64Array(): Float64Array;
+    toJSON(): any;
+    transformPoint(point?: DOMPointInit): DOMPoint;
+    translate(tx?: number, ty?: number, tz?: number): DOMMatrix;
+    toString(): string;
+}
+
+declare var DOMMatrixReadOnly: {
+    prototype: DOMMatrixReadOnly;
+    new(init?: string | number[]): DOMMatrixReadOnly;
+    fromFloat32Array(array32: Float32Array): DOMMatrixReadOnly;
+    fromFloat64Array(array64: Float64Array): DOMMatrixReadOnly;
+    fromMatrix(other?: DOMMatrixInit): DOMMatrixReadOnly;
+    toString(): string;
+};
+
+/** Provides the ability to parse XML or HTML source code from a string into a DOM Document. */
+interface DOMParser {
+    /**
+     * Parses string using either the HTML or XML parser, according to type, and returns the resulting Document. type can be "text/html" (which will invoke the HTML parser), or any of "text/xml", "application/xml", "application/xhtml+xml", or "image/svg+xml" (which will invoke the XML parser).
+     *
+     * For the XML parser, if string cannot be parsed, then the returned Document will contain elements describing the resulting error.
+     *
+     * Note that script elements are not evaluated during parsing, and the resulting document's encoding will always be UTF-8.
+     *
+     * Values other than the above for type will cause a TypeError exception to be thrown.
+     */
+    parseFromString(string: string, type: DOMParserSupportedType): Document;
+}
+
+declare var DOMParser: {
+    prototype: DOMParser;
+    new(): DOMParser;
+};
+
+interface DOMPoint extends DOMPointReadOnly {
+    w: number;
+    x: number;
+    y: number;
+    z: number;
+}
+
+declare var DOMPoint: {
+    prototype: DOMPoint;
+    new(x?: number, y?: number, z?: number, w?: number): DOMPoint;
+    fromPoint(other?: DOMPointInit): DOMPoint;
+};
+
+type SVGPoint = DOMPoint;
+declare var SVGPoint: typeof DOMPoint;
+
+interface DOMPointReadOnly {
+    readonly w: number;
+    readonly x: number;
+    readonly y: number;
+    readonly z: number;
+    matrixTransform(matrix?: DOMMatrixInit): DOMPoint;
+    toJSON(): any;
+}
+
+declare var DOMPointReadOnly: {
+    prototype: DOMPointReadOnly;
+    new(x?: number, y?: number, z?: number, w?: number): DOMPointReadOnly;
+    fromPoint(other?: DOMPointInit): DOMPointReadOnly;
+};
+
+interface DOMQuad {
+    readonly p1: DOMPoint;
+    readonly p2: DOMPoint;
+    readonly p3: DOMPoint;
+    readonly p4: DOMPoint;
+    getBounds(): DOMRect;
+    toJSON(): any;
+}
+
+declare var DOMQuad: {
+    prototype: DOMQuad;
+    new(p1?: DOMPointInit, p2?: DOMPointInit, p3?: DOMPointInit, p4?: DOMPointInit): DOMQuad;
+    fromQuad(other?: DOMQuadInit): DOMQuad;
+    fromRect(other?: DOMRectInit): DOMQuad;
+};
+
+interface DOMRect extends DOMRectReadOnly {
+    height: number;
+    width: number;
+    x: number;
+    y: number;
+}
+
+declare var DOMRect: {
+    prototype: DOMRect;
+    new(x?: number, y?: number, width?: number, height?: number): DOMRect;
+    fromRect(other?: DOMRectInit): DOMRect;
+};
+
+type SVGRect = DOMRect;
+declare var SVGRect: typeof DOMRect;
+
+interface DOMRectList {
+    readonly length: number;
+    item(index: number): DOMRect | null;
+    [index: number]: DOMRect;
+}
+
+declare var DOMRectList: {
+    prototype: DOMRectList;
+    new(): DOMRectList;
+};
+
+interface DOMRectReadOnly {
+    readonly bottom: number;
+    readonly height: number;
+    readonly left: number;
+    readonly right: number;
+    readonly top: number;
+    readonly width: number;
+    readonly x: number;
+    readonly y: number;
+    toJSON(): any;
+}
+
+declare var DOMRectReadOnly: {
+    prototype: DOMRectReadOnly;
+    new(x?: number, y?: number, width?: number, height?: number): DOMRectReadOnly;
+    fromRect(other?: DOMRectInit): DOMRectReadOnly;
+};
+
+/** A type returned by some APIs which contains a list of DOMString (strings). */
+interface DOMStringList {
+    /** Returns the number of strings in strings. */
+    readonly length: number;
+    /** Returns true if strings contains string, and false otherwise. */
+    contains(string: string): boolean;
+    /** Returns the string with index index from strings. */
+    item(index: number): string | null;
+    [index: number]: string;
+}
+
+declare var DOMStringList: {
+    prototype: DOMStringList;
+    new(): DOMStringList;
+};
+
+/** Used by the dataset\xA0HTML\xA0attribute to represent data for custom attributes added to elements. */
+interface DOMStringMap {
+    [name: string]: string | undefined;
+}
+
+declare var DOMStringMap: {
+    prototype: DOMStringMap;
+    new(): DOMStringMap;
+};
+
+/** A set of space-separated tokens. Such a set is returned by Element.classList, HTMLLinkElement.relList, HTMLAnchorElement.relList, HTMLAreaElement.relList, HTMLIframeElement.sandbox, or HTMLOutputElement.htmlFor. It is indexed beginning with 0 as with JavaScript Array objects. DOMTokenList is always case-sensitive. */
+interface DOMTokenList {
+    /** Returns the number of tokens. */
+    readonly length: number;
+    /**
+     * Returns the associated set as string.
+     *
+     * Can be set, to change the associated attribute.
+     */
+    value: string;
+    toString(): string;
+    /**
+     * Adds all arguments passed, except those already present.
+     *
+     * Throws a "SyntaxError" DOMException if one of the arguments is the empty string.
+     *
+     * Throws an "InvalidCharacterError" DOMException if one of the arguments contains any ASCII whitespace.
+     */
+    add(...tokens: string[]): void;
+    /** Returns true if token is present, and false otherwise. */
+    contains(token: string): boolean;
+    /** Returns the token with index index. */
+    item(index: number): string | null;
+    /**
+     * Removes arguments passed, if they are present.
+     *
+     * Throws a "SyntaxError" DOMException if one of the arguments is the empty string.
+     *
+     * Throws an "InvalidCharacterError" DOMException if one of the arguments contains any ASCII whitespace.
+     */
+    remove(...tokens: string[]): void;
+    /**
+     * Replaces token with newToken.
+     *
+     * Returns true if token was replaced with newToken, and false otherwise.
+     *
+     * Throws a "SyntaxError" DOMException if one of the arguments is the empty string.
+     *
+     * Throws an "InvalidCharacterError" DOMException if one of the arguments contains any ASCII whitespace.
+     */
+    replace(token: string, newToken: string): boolean;
+    /**
+     * Returns true if token is in the associated attribute's supported tokens. Returns false otherwise.
+     *
+     * Throws a TypeError if the associated attribute has no supported tokens defined.
+     */
+    supports(token: string): boolean;
+    /**
+     * If force is not given, "toggles" token, removing it if it's present and adding it if it's not present. If force is true, adds token (same as add()). If force is false, removes token (same as remove()).
+     *
+     * Returns true if token is now present, and false otherwise.
+     *
+     * Throws a "SyntaxError" DOMException if token is empty.
+     *
+     * Throws an "InvalidCharacterError" DOMException if token contains any spaces.
+     */
+    toggle(token: string, force?: boolean): boolean;
+    forEach(callbackfn: (value: string, key: number, parent: DOMTokenList) => void, thisArg?: any): void;
+    [index: number]: string;
+}
+
+declare var DOMTokenList: {
+    prototype: DOMTokenList;
+    new(): DOMTokenList;
+};
+
+/** Used to hold the data that is being dragged during a drag and drop operation. It may hold one or more data items, each of one or more data types. For more information about drag and drop, see HTML Drag and Drop API. */
+interface DataTransfer {
+    /**
+     * Returns the kind of operation that is currently selected. If the kind of operation isn't one of those that is allowed by the effectAllowed attribute, then the operation will fail.
+     *
+     * Can be set, to change the selected operation.
+     *
+     * The possible values are "none", "copy", "link", and "move".
+     */
+    dropEffect: "none" | "copy" | "link" | "move";
+    /**
+     * Returns the kinds of operations that are to be allowed.
+     *
+     * Can be set (during the dragstart event), to change the allowed operations.
+     *
+     * The possible values are "none", "copy", "copyLink", "copyMove", "link", "linkMove", "move", "all", and "uninitialized",
+     */
+    effectAllowed: "none" | "copy" | "copyLink" | "copyMove" | "link" | "linkMove" | "move" | "all" | "uninitialized";
+    /** Returns a FileList of the files being dragged, if any. */
+    readonly files: FileList;
+    /** Returns a DataTransferItemList object, with the drag data. */
+    readonly items: DataTransferItemList;
+    /** Returns a frozen array listing the formats that were set in the dragstart event. In addition, if any files are being dragged, then one of the types will be the string "Files". */
+    readonly types: ReadonlyArray<string>;
+    /** Removes the data of the specified formats. Removes all data if the argument is omitted. */
+    clearData(format?: string): void;
+    /** Returns the specified data. If there is no such data, returns the empty string. */
+    getData(format: string): string;
+    /** Adds the specified data. */
+    setData(format: string, data: string): void;
+    /** Uses the given element to update the drag feedback, replacing any previously specified feedback. */
+    setDragImage(image: Element, x: number, y: number): void;
+}
+
+declare var DataTransfer: {
+    prototype: DataTransfer;
+    new(): DataTransfer;
+};
+
+/** One drag data item. During a drag operation, each drag event has a dataTransfer property which contains a list of drag data items. Each item in the list is a DataTransferItem object. */
+interface DataTransferItem {
+    /** Returns the drag data item kind, one of: "string", "file". */
+    readonly kind: string;
+    /** Returns the drag data item type string. */
+    readonly type: string;
+    /** Returns a File object, if the drag data item kind is File. */
+    getAsFile(): File | null;
+    /** Invokes the callback with the string data as the argument, if the drag data item kind is text. */
+    getAsString(callback: FunctionStringCallback | null): void;
+    webkitGetAsEntry(): FileSystemEntry | null;
+}
+
+declare var DataTransferItem: {
+    prototype: DataTransferItem;
+    new(): DataTransferItem;
+};
+
+/** A list of DataTransferItem objects representing items being dragged. During a drag operation, each DragEvent has a dataTransfer property and that property is a DataTransferItemList. */
+interface DataTransferItemList {
+    /** Returns the number of items in the drag data store. */
+    readonly length: number;
+    /** Adds a new entry for the given data to the drag data store. If the data is plain text then a type string has to be provided also. */
+    add(data: string, type: string): DataTransferItem | null;
+    add(data: File): DataTransferItem | null;
+    /** Removes all the entries in the drag data store. */
+    clear(): void;
+    /** Removes the indexth entry in the drag data store. */
+    remove(index: number): void;
+    [index: number]: DataTransferItem;
+}
+
+declare var DataTransferItemList: {
+    prototype: DataTransferItemList;
+    new(): DataTransferItemList;
+};
+
+/** A delay-line; an AudioNode audio-processing module that causes a delay between the arrival of an input data and its propagation to the output. */
+interface DelayNode extends AudioNode {
+    readonly delayTime: AudioParam;
+}
+
+declare var DelayNode: {
+    prototype: DelayNode;
+    new(context: BaseAudioContext, options?: DelayOptions): DelayNode;
+};
+
+/**
+ * The DeviceMotionEvent provides web developers with information about the speed of changes for the device's position and orientation.
+ * Available only in secure contexts.
+ */
+interface DeviceMotionEvent extends Event {
+    readonly acceleration: DeviceMotionEventAcceleration | null;
+    readonly accelerationIncludingGravity: DeviceMotionEventAcceleration | null;
+    readonly interval: number;
+    readonly rotationRate: DeviceMotionEventRotationRate | null;
+}
+
+declare var DeviceMotionEvent: {
+    prototype: DeviceMotionEvent;
+    new(type: string, eventInitDict?: DeviceMotionEventInit): DeviceMotionEvent;
+};
+
+/** Available only in secure contexts. */
+interface DeviceMotionEventAcceleration {
+    readonly x: number | null;
+    readonly y: number | null;
+    readonly z: number | null;
+}
+
+/** Available only in secure contexts. */
+interface DeviceMotionEventRotationRate {
+    readonly alpha: number | null;
+    readonly beta: number | null;
+    readonly gamma: number | null;
+}
+
+/**
+ * The DeviceOrientationEvent provides web developers with information from the physical orientation of the device running the web page.
+ * Available only in secure contexts.
+ */
+interface DeviceOrientationEvent extends Event {
+    readonly absolute: boolean;
+    readonly alpha: number | null;
+    readonly beta: number | null;
+    readonly gamma: number | null;
+}
+
+declare var DeviceOrientationEvent: {
+    prototype: DeviceOrientationEvent;
+    new(type: string, eventInitDict?: DeviceOrientationEventInit): DeviceOrientationEvent;
+};
+
+interface DocumentEventMap extends GlobalEventHandlersEventMap {
+    "DOMContentLoaded": Event;
+    "fullscreenchange": Event;
+    "fullscreenerror": Event;
+    "pointerlockchange": Event;
+    "pointerlockerror": Event;
+    "readystatechange": Event;
+    "visibilitychange": Event;
+}
+
+/** Any web page loaded in the browser and serves as an entry point into the web page's content, which is the DOM tree. */
+interface Document extends Node, DocumentOrShadowRoot, FontFaceSource, GlobalEventHandlers, NonElementParentNode, ParentNode, XPathEvaluatorBase {
+    /** Sets or gets the URL for the current document. */
+    readonly URL: string;
+    /**
+     * Sets or gets the color of all active links in the document.
+     * @deprecated
+     */
+    alinkColor: string;
+    /**
+     * Returns a reference to the collection of elements contained by the object.
+     * @deprecated
+     */
+    readonly all: HTMLAllCollection;
+    /**
+     * Retrieves a collection of all a objects that have a name and/or id property. Objects in this collection are in HTML source order.
+     * @deprecated
+     */
+    readonly anchors: HTMLCollectionOf<HTMLAnchorElement>;
+    /**
+     * Retrieves a collection of all applet objects in the document.
+     * @deprecated
+     */
+    readonly applets: HTMLCollection;
+    /**
+     * Deprecated. Sets or retrieves a value that indicates the background color behind the object.
+     * @deprecated
+     */
+    bgColor: string;
+    /** Specifies the beginning and end of the document body. */
+    body: HTMLElement;
+    /** Returns document's encoding. */
+    readonly characterSet: string;
+    /**
+     * Gets or sets the character set used to encode the object.
+     * @deprecated This is a legacy alias of \`characterSet\`.
+     */
+    readonly charset: string;
+    /** Gets a value that indicates whether standards-compliant mode is switched on for the object. */
+    readonly compatMode: string;
+    /** Returns document's content type. */
+    readonly contentType: string;
+    /**
+     * Returns the HTTP cookies that apply to the Document. If there are no cookies or cookies can't be applied to this resource, the empty string will be returned.
+     *
+     * Can be set, to add a new cookie to the element's set of HTTP cookies.
+     *
+     * If the contents are sandboxed into a unique origin (e.g. in an iframe with the sandbox attribute), a "SecurityError" DOMException will be thrown on getting and setting.
+     */
+    cookie: string;
+    /**
+     * Returns the script element, or the SVG script element, that is currently executing, as long as the element represents a classic script. In the case of reentrant script execution, returns the one that most recently started executing amongst those that have not yet finished executing.
+     *
+     * Returns null if the Document is not currently executing a script or SVG script element (e.g., because the running script is an event handler, or a timeout), or if the currently executing script or SVG script element represents a module script.
+     */
+    readonly currentScript: HTMLOrSVGScriptElement | null;
+    /** Returns the Window object of the active document. */
+    readonly defaultView: (WindowProxy & typeof globalThis) | null;
+    /** Sets or gets a value that indicates whether the document can be edited. */
+    designMode: string;
+    /** Sets or retrieves a value that indicates the reading order of the object. */
+    dir: string;
+    /** Gets an object representing the document type declaration associated with the current document. */
+    readonly doctype: DocumentType | null;
+    /** Gets a reference to the root node of the document. */
+    readonly documentElement: HTMLElement;
+    /** Returns document's URL. */
+    readonly documentURI: string;
+    /**
+     * Sets or gets the security domain of the document.
+     * @deprecated
+     */
+    domain: string;
+    /** Retrieves a collection of all embed objects in the document. */
+    readonly embeds: HTMLCollectionOf<HTMLEmbedElement>;
+    /**
+     * Sets or gets the foreground (text) color of the document.
+     * @deprecated
+     */
+    fgColor: string;
+    /** Retrieves a collection, in source order, of all form objects in the document. */
+    readonly forms: HTMLCollectionOf<HTMLFormElement>;
+    /** @deprecated */
+    readonly fullscreen: boolean;
+    /** Returns true if document has the ability to display elements fullscreen and fullscreen is supported, or false otherwise. */
+    readonly fullscreenEnabled: boolean;
+    /** Returns the head element. */
+    readonly head: HTMLHeadElement;
+    readonly hidden: boolean;
+    /** Retrieves a collection, in source order, of img objects in the document. */
+    readonly images: HTMLCollectionOf<HTMLImageElement>;
+    /** Gets the implementation object of the current document. */
+    readonly implementation: DOMImplementation;
+    /**
+     * Returns the character encoding used to create the webpage that is loaded into the document object.
+     * @deprecated This is a legacy alias of \`characterSet\`.
+     */
+    readonly inputEncoding: string;
+    /** Gets the date that the page was last modified, if the page supplies one. */
+    readonly lastModified: string;
+    /**
+     * Sets or gets the color of the document links.
+     * @deprecated
+     */
+    linkColor: string;
+    /** Retrieves a collection of all a objects that specify the href property and all area objects in the document. */
+    readonly links: HTMLCollectionOf<HTMLAnchorElement | HTMLAreaElement>;
+    /** Contains information about the current URL. */
+    get location(): Location;
+    set location(href: string | Location);
+    onfullscreenchange: ((this: Document, ev: Event) => any) | null;
+    onfullscreenerror: ((this: Document, ev: Event) => any) | null;
+    onpointerlockchange: ((this: Document, ev: Event) => any) | null;
+    onpointerlockerror: ((this: Document, ev: Event) => any) | null;
+    /**
+     * Fires when the state of the object has changed.
+     * @param ev The event
+     */
+    onreadystatechange: ((this: Document, ev: Event) => any) | null;
+    onvisibilitychange: ((this: Document, ev: Event) => any) | null;
+    readonly ownerDocument: null;
+    readonly pictureInPictureEnabled: boolean;
+    /** Return an HTMLCollection of the embed elements in the Document. */
+    readonly plugins: HTMLCollectionOf<HTMLEmbedElement>;
+    /** Retrieves a value that indicates the current state of the object. */
+    readonly readyState: DocumentReadyState;
+    /** Gets the URL of the location that referred the user to the current page. */
+    readonly referrer: string;
+    /** @deprecated */
+    readonly rootElement: SVGSVGElement | null;
+    /** Retrieves a collection of all script objects in the document. */
+    readonly scripts: HTMLCollectionOf<HTMLScriptElement>;
+    readonly scrollingElement: Element | null;
+    readonly timeline: DocumentTimeline;
+    /** Contains the title of the document. */
+    title: string;
+    readonly visibilityState: DocumentVisibilityState;
+    /**
+     * Sets or gets the color of the links that the user has visited.
+     * @deprecated
+     */
+    vlinkColor: string;
+    /**
+     * Moves node from another document and returns it.
+     *
+     * If node is a document, throws a "NotSupportedError" DOMException or, if node is a shadow root, throws a "HierarchyRequestError" DOMException.
+     */
+    adoptNode<T extends Node>(node: T): T;
+    /** @deprecated */
+    captureEvents(): void;
+    /** @deprecated */
+    caretRangeFromPoint(x: number, y: number): Range | null;
+    /** @deprecated */
+    clear(): void;
+    /** Closes an output stream and forces the sent data to display. */
+    close(): void;
+    /**
+     * Creates an attribute object with a specified name.
+     * @param name String that sets the attribute object's name.
+     */
+    createAttribute(localName: string): Attr;
+    createAttributeNS(namespace: string | null, qualifiedName: string): Attr;
+    /** Returns a CDATASection node whose data is data. */
+    createCDATASection(data: string): CDATASection;
+    /**
+     * Creates a comment object with the specified data.
+     * @param data Sets the comment object's data.
+     */
+    createComment(data: string): Comment;
+    /** Creates a new document. */
+    createDocumentFragment(): DocumentFragment;
+    /**
+     * Creates an instance of the element for the specified tag.
+     * @param tagName The name of an element.
+     */
+    createElement<K extends keyof HTMLElementTagNameMap>(tagName: K, options?: ElementCreationOptions): HTMLElementTagNameMap[K];
+    /** @deprecated */
+    createElement<K extends keyof HTMLElementDeprecatedTagNameMap>(tagName: K, options?: ElementCreationOptions): HTMLElementDeprecatedTagNameMap[K];
+    createElement(tagName: string, options?: ElementCreationOptions): HTMLElement;
+    /**
+     * Returns an element with namespace namespace. Its namespace prefix will be everything before ":" (U+003E) in qualifiedName or null. Its local name will be everything after ":" (U+003E) in qualifiedName or qualifiedName.
+     *
+     * If localName does not match the Name production an "InvalidCharacterError" DOMException will be thrown.
+     *
+     * If one of the following conditions is true a "NamespaceError" DOMException will be thrown:
+     *
+     * localName does not match the QName production.
+     * Namespace prefix is not null and namespace is the empty string.
+     * Namespace prefix is "xml" and namespace is not the XML namespace.
+     * qualifiedName or namespace prefix is "xmlns" and namespace is not the XMLNS namespace.
+     * namespace is the XMLNS namespace and neither qualifiedName nor namespace prefix is "xmlns".
+     *
+     * When supplied, options's is can be used to create a customized built-in element.
+     */
+    createElementNS(namespaceURI: "http://www.w3.org/1999/xhtml", qualifiedName: string): HTMLElement;
+    createElementNS<K extends keyof SVGElementTagNameMap>(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: K): SVGElementTagNameMap[K];
+    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: string): SVGElement;
+    createElementNS<K extends keyof MathMLElementTagNameMap>(namespaceURI: "http://www.w3.org/1998/Math/MathML", qualifiedName: K): MathMLElementTagNameMap[K];
+    createElementNS(namespaceURI: "http://www.w3.org/1998/Math/MathML", qualifiedName: string): MathMLElement;
+    createElementNS(namespaceURI: string | null, qualifiedName: string, options?: ElementCreationOptions): Element;
+    createElementNS(namespace: string | null, qualifiedName: string, options?: string | ElementCreationOptions): Element;
+    createEvent(eventInterface: "AnimationEvent"): AnimationEvent;
+    createEvent(eventInterface: "AnimationPlaybackEvent"): AnimationPlaybackEvent;
+    createEvent(eventInterface: "AudioProcessingEvent"): AudioProcessingEvent;
+    createEvent(eventInterface: "BeforeUnloadEvent"): BeforeUnloadEvent;
+    createEvent(eventInterface: "BlobEvent"): BlobEvent;
+    createEvent(eventInterface: "ClipboardEvent"): ClipboardEvent;
+    createEvent(eventInterface: "CloseEvent"): CloseEvent;
+    createEvent(eventInterface: "CompositionEvent"): CompositionEvent;
+    createEvent(eventInterface: "CustomEvent"): CustomEvent;
+    createEvent(eventInterface: "DeviceMotionEvent"): DeviceMotionEvent;
+    createEvent(eventInterface: "DeviceOrientationEvent"): DeviceOrientationEvent;
+    createEvent(eventInterface: "DragEvent"): DragEvent;
+    createEvent(eventInterface: "ErrorEvent"): ErrorEvent;
+    createEvent(eventInterface: "Event"): Event;
+    createEvent(eventInterface: "Events"): Event;
+    createEvent(eventInterface: "FocusEvent"): FocusEvent;
+    createEvent(eventInterface: "FontFaceSetLoadEvent"): FontFaceSetLoadEvent;
+    createEvent(eventInterface: "FormDataEvent"): FormDataEvent;
+    createEvent(eventInterface: "GamepadEvent"): GamepadEvent;
+    createEvent(eventInterface: "HashChangeEvent"): HashChangeEvent;
+    createEvent(eventInterface: "IDBVersionChangeEvent"): IDBVersionChangeEvent;
+    createEvent(eventInterface: "InputEvent"): InputEvent;
+    createEvent(eventInterface: "KeyboardEvent"): KeyboardEvent;
+    createEvent(eventInterface: "MIDIConnectionEvent"): MIDIConnectionEvent;
+    createEvent(eventInterface: "MIDIMessageEvent"): MIDIMessageEvent;
+    createEvent(eventInterface: "MediaEncryptedEvent"): MediaEncryptedEvent;
+    createEvent(eventInterface: "MediaKeyMessageEvent"): MediaKeyMessageEvent;
+    createEvent(eventInterface: "MediaQueryListEvent"): MediaQueryListEvent;
+    createEvent(eventInterface: "MediaStreamTrackEvent"): MediaStreamTrackEvent;
+    createEvent(eventInterface: "MessageEvent"): MessageEvent;
+    createEvent(eventInterface: "MouseEvent"): MouseEvent;
+    createEvent(eventInterface: "MouseEvents"): MouseEvent;
+    createEvent(eventInterface: "MutationEvent"): MutationEvent;
+    createEvent(eventInterface: "MutationEvents"): MutationEvent;
+    createEvent(eventInterface: "OfflineAudioCompletionEvent"): OfflineAudioCompletionEvent;
+    createEvent(eventInterface: "PageTransitionEvent"): PageTransitionEvent;
+    createEvent(eventInterface: "PaymentMethodChangeEvent"): PaymentMethodChangeEvent;
+    createEvent(eventInterface: "PaymentRequestUpdateEvent"): PaymentRequestUpdateEvent;
+    createEvent(eventInterface: "PictureInPictureEvent"): PictureInPictureEvent;
+    createEvent(eventInterface: "PointerEvent"): PointerEvent;
+    createEvent(eventInterface: "PopStateEvent"): PopStateEvent;
+    createEvent(eventInterface: "ProgressEvent"): ProgressEvent;
+    createEvent(eventInterface: "PromiseRejectionEvent"): PromiseRejectionEvent;
+    createEvent(eventInterface: "RTCDTMFToneChangeEvent"): RTCDTMFToneChangeEvent;
+    createEvent(eventInterface: "RTCDataChannelEvent"): RTCDataChannelEvent;
+    createEvent(eventInterface: "RTCErrorEvent"): RTCErrorEvent;
+    createEvent(eventInterface: "RTCPeerConnectionIceErrorEvent"): RTCPeerConnectionIceErrorEvent;
+    createEvent(eventInterface: "RTCPeerConnectionIceEvent"): RTCPeerConnectionIceEvent;
+    createEvent(eventInterface: "RTCTrackEvent"): RTCTrackEvent;
+    createEvent(eventInterface: "SecurityPolicyViolationEvent"): SecurityPolicyViolationEvent;
+    createEvent(eventInterface: "SpeechSynthesisErrorEvent"): SpeechSynthesisErrorEvent;
+    createEvent(eventInterface: "SpeechSynthesisEvent"): SpeechSynthesisEvent;
+    createEvent(eventInterface: "StorageEvent"): StorageEvent;
+    createEvent(eventInterface: "SubmitEvent"): SubmitEvent;
+    createEvent(eventInterface: "TouchEvent"): TouchEvent;
+    createEvent(eventInterface: "TrackEvent"): TrackEvent;
+    createEvent(eventInterface: "TransitionEvent"): TransitionEvent;
+    createEvent(eventInterface: "UIEvent"): UIEvent;
+    createEvent(eventInterface: "UIEvents"): UIEvent;
+    createEvent(eventInterface: "WebGLContextEvent"): WebGLContextEvent;
+    createEvent(eventInterface: "WheelEvent"): WheelEvent;
+    createEvent(eventInterface: string): Event;
+    /**
+     * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.
+     * @param root The root element or node to start traversing on.
+     * @param whatToShow The type of nodes or elements to appear in the node list
+     * @param filter A custom NodeFilter function to use. For more information, see filter. Use null for no filter.
+     */
+    createNodeIterator(root: Node, whatToShow?: number, filter?: NodeFilter | null): NodeIterator;
+    /** Returns a ProcessingInstruction node whose target is target and data is data. If target does not match the Name production an "InvalidCharacterError" DOMException will be thrown. If data contains "?>" an "InvalidCharacterError" DOMException will be thrown. */
+    createProcessingInstruction(target: string, data: string): ProcessingInstruction;
+    /**  Returns an empty range object that has both of its boundary points positioned at the beginning of the document. */
+    createRange(): Range;
+    /**
+     * Creates a text string from the specified value.
+     * @param data String that specifies the nodeValue property of the text node.
+     */
+    createTextNode(data: string): Text;
+    /**
+     * Creates a TreeWalker object that you can use to traverse filtered lists of nodes or elements in a document.
+     * @param root The root element or node to start traversing on.
+     * @param whatToShow The type of nodes or elements to appear in the node list. For more information, see whatToShow.
+     * @param filter A custom NodeFilter function to use.
+     */
+    createTreeWalker(root: Node, whatToShow?: number, filter?: NodeFilter | null): TreeWalker;
+    /**
+     * Executes a command on the current document, current selection, or the given range.
+     * @param commandId String that specifies the command to execute. This command can be any of the command identifiers that can be executed in script.
+     * @param showUI Display the user interface, defaults to false.
+     * @param value Value to assign.
+     * @deprecated
+     */
+    execCommand(commandId: string, showUI?: boolean, value?: string): boolean;
+    /** Stops document's fullscreen element from being displayed fullscreen and resolves promise when done. */
+    exitFullscreen(): Promise<void>;
+    exitPictureInPicture(): Promise<void>;
+    exitPointerLock(): void;
+    /**
+     * Returns a reference to the first object with the specified value of the ID attribute.
+     * @param elementId String that specifies the ID value.
+     */
+    getElementById(elementId: string): HTMLElement | null;
+    /** Returns a HTMLCollection of the elements in the object on which the method was invoked (a document or an element) that have all the classes given by classNames. The classNames argument is interpreted as a space-separated list of classes. */
+    getElementsByClassName(classNames: string): HTMLCollectionOf<Element>;
+    /**
+     * Gets a collection of objects based on the value of the NAME or ID attribute.
+     * @param elementName Gets a collection of objects based on the value of the NAME or ID attribute.
+     */
+    getElementsByName(elementName: string): NodeListOf<HTMLElement>;
+    /**
+     * Retrieves a collection of objects based on the specified element name.
+     * @param name Specifies the name of an element.
+     */
+    getElementsByTagName<K extends keyof HTMLElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<HTMLElementTagNameMap[K]>;
+    getElementsByTagName<K extends keyof SVGElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<SVGElementTagNameMap[K]>;
+    getElementsByTagName<K extends keyof MathMLElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<MathMLElementTagNameMap[K]>;
+    /** @deprecated */
+    getElementsByTagName<K extends keyof HTMLElementDeprecatedTagNameMap>(qualifiedName: K): HTMLCollectionOf<HTMLElementDeprecatedTagNameMap[K]>;
+    getElementsByTagName(qualifiedName: string): HTMLCollectionOf<Element>;
+    /**
+     * If namespace and localName are "*" returns a HTMLCollection of all descendant elements.
+     *
+     * If only namespace is "*" returns a HTMLCollection of all descendant elements whose local name is localName.
+     *
+     * If only localName is "*" returns a HTMLCollection of all descendant elements whose namespace is namespace.
+     *
+     * Otherwise, returns a HTMLCollection of all descendant elements whose namespace is namespace and local name is localName.
+     */
+    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/1999/xhtml", localName: string): HTMLCollectionOf<HTMLElement>;
+    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/2000/svg", localName: string): HTMLCollectionOf<SVGElement>;
+    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/1998/Math/MathML", localName: string): HTMLCollectionOf<MathMLElement>;
+    getElementsByTagNameNS(namespace: string | null, localName: string): HTMLCollectionOf<Element>;
+    /** Returns an object representing the current selection of the document that is loaded into the object displaying a webpage. */
+    getSelection(): Selection | null;
+    /** Gets a value indicating whether the object currently has focus. */
+    hasFocus(): boolean;
+    hasStorageAccess(): Promise<boolean>;
+    /**
+     * Returns a copy of node. If deep is true, the copy also includes the node's descendants.
+     *
+     * If node is a document or a shadow root, throws a "NotSupportedError" DOMException.
+     */
+    importNode<T extends Node>(node: T, deep?: boolean): T;
+    /**
+     * Opens a new window and loads a document specified by a given URL. Also, opens a new window that uses the url parameter and the name parameter to collect the output of the write method and the writeln method.
+     * @param url Specifies a MIME type for the document.
+     * @param name Specifies the name of the window. This name is used as the value for the TARGET attribute on a form or an anchor element.
+     * @param features Contains a list of items separated by commas. Each item consists of an option and a value, separated by an equals sign (for example, "fullscreen=yes, toolbar=yes"). The following values are supported.
+     * @param replace Specifies whether the existing entry for the document is replaced in the history list.
+     */
+    open(unused1?: string, unused2?: string): Document;
+    open(url: string | URL, name: string, features: string): WindowProxy | null;
+    /**
+     * Returns a Boolean value that indicates whether a specified command can be successfully executed using execCommand, given the current state of the document.
+     * @param commandId Specifies a command identifier.
+     * @deprecated
+     */
+    queryCommandEnabled(commandId: string): boolean;
+    /**
+     * Returns a Boolean value that indicates whether the specified command is in the indeterminate state.
+     * @param commandId String that specifies a command identifier.
+     * @deprecated
+     */
+    queryCommandIndeterm(commandId: string): boolean;
+    /**
+     * Returns a Boolean value that indicates the current state of the command.
+     * @param commandId String that specifies a command identifier.
+     * @deprecated
+     */
+    queryCommandState(commandId: string): boolean;
+    /**
+     * Returns a Boolean value that indicates whether the current command is supported on the current range.
+     * @param commandId Specifies a command identifier.
+     * @deprecated
+     */
+    queryCommandSupported(commandId: string): boolean;
+    /**
+     * Returns the current value of the document, range, or current selection for the given command.
+     * @param commandId String that specifies a command identifier.
+     * @deprecated
+     */
+    queryCommandValue(commandId: string): string;
+    /** @deprecated */
+    releaseEvents(): void;
+    requestStorageAccess(): Promise<void>;
+    /**
+     * Writes one or more HTML expressions to a document in the specified window.
+     * @param content Specifies the text and HTML tags to write.
+     */
+    write(...text: string[]): void;
+    /**
+     * Writes one or more HTML expressions, followed by a carriage return, to a document in the specified window.
+     * @param content The text and HTML tags to write.
+     */
+    writeln(...text: string[]): void;
+    addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var Document: {
+    prototype: Document;
+    new(): Document;
+};
+
+/** A minimal document object that has no parent. It is used as a lightweight version of Document that stores a segment of a document structure comprised of nodes just like a standard document. The key difference is that because the document fragment isn't part of the active document tree structure, changes made to the fragment don't affect the document, cause reflow, or incur any performance impact that can occur when changes are made. */
+interface DocumentFragment extends Node, NonElementParentNode, ParentNode {
+    readonly ownerDocument: Document;
+    getElementById(elementId: string): HTMLElement | null;
+}
+
+declare var DocumentFragment: {
+    prototype: DocumentFragment;
+    new(): DocumentFragment;
+};
+
+interface DocumentOrShadowRoot {
+    /**
+     * Returns the deepest element in the document through which or to which key events are being routed. This is, roughly speaking, the focused element in the document.
+     *
+     * For the purposes of this API, when a child browsing context is focused, its container is focused in the parent browsing context. For example, if the user moves the focus to a text control in an iframe, the iframe is the element returned by the activeElement API in the iframe's node document.
+     *
+     * Similarly, when the focused element is in a different node tree than documentOrShadowRoot, the element returned will be the host that's located in the same node tree as documentOrShadowRoot if documentOrShadowRoot is a shadow-including inclusive ancestor of the focused element, and null if not.
+     */
+    readonly activeElement: Element | null;
+    adoptedStyleSheets: CSSStyleSheet[];
+    /** Returns document's fullscreen element. */
+    readonly fullscreenElement: Element | null;
+    readonly pictureInPictureElement: Element | null;
+    readonly pointerLockElement: Element | null;
+    /** Retrieves a collection of styleSheet objects representing the style sheets that correspond to each instance of a link or style object in the document. */
+    readonly styleSheets: StyleSheetList;
+    /**
+     * Returns the element for the specified x coordinate and the specified y coordinate.
+     * @param x The x-offset
+     * @param y The y-offset
+     */
+    elementFromPoint(x: number, y: number): Element | null;
+    elementsFromPoint(x: number, y: number): Element[];
+    getAnimations(): Animation[];
+}
+
+interface DocumentTimeline extends AnimationTimeline {
+}
+
+declare var DocumentTimeline: {
+    prototype: DocumentTimeline;
+    new(options?: DocumentTimelineOptions): DocumentTimeline;
+};
+
+/** A Node containing a doctype. */
+interface DocumentType extends Node, ChildNode {
+    readonly name: string;
+    readonly ownerDocument: Document;
+    readonly publicId: string;
+    readonly systemId: string;
+}
+
+declare var DocumentType: {
+    prototype: DocumentType;
+    new(): DocumentType;
+};
+
+/** A DOM event that represents a drag and drop interaction. The user initiates a drag by placing a pointer device (such as a mouse) on the touch surface and then dragging the pointer to a new location (such as another DOM element). Applications are free to interpret a drag and drop interaction in an application-specific way. */
+interface DragEvent extends MouseEvent {
+    /** Returns the DataTransfer object for the event. */
+    readonly dataTransfer: DataTransfer | null;
+}
+
+declare var DragEvent: {
+    prototype: DragEvent;
+    new(type: string, eventInitDict?: DragEventInit): DragEvent;
+};
+
+/** Inherits properties from its parent, AudioNode. */
+interface DynamicsCompressorNode extends AudioNode {
+    readonly attack: AudioParam;
+    readonly knee: AudioParam;
+    readonly ratio: AudioParam;
+    readonly reduction: number;
+    readonly release: AudioParam;
+    readonly threshold: AudioParam;
+}
+
+declare var DynamicsCompressorNode: {
+    prototype: DynamicsCompressorNode;
+    new(context: BaseAudioContext, options?: DynamicsCompressorOptions): DynamicsCompressorNode;
+};
+
+interface EXT_blend_minmax {
+    readonly MIN_EXT: 0x8007;
+    readonly MAX_EXT: 0x8008;
+}
+
+interface EXT_color_buffer_float {
+}
+
+interface EXT_color_buffer_half_float {
+    readonly RGBA16F_EXT: 0x881A;
+    readonly RGB16F_EXT: 0x881B;
+    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: 0x8211;
+    readonly UNSIGNED_NORMALIZED_EXT: 0x8C17;
+}
+
+interface EXT_float_blend {
+}
+
+/** The EXT_frag_depth extension is part of the WebGL API and enables to set a depth value of a fragment from within the fragment shader. */
+interface EXT_frag_depth {
+}
+
+interface EXT_sRGB {
+    readonly SRGB_EXT: 0x8C40;
+    readonly SRGB_ALPHA_EXT: 0x8C42;
+    readonly SRGB8_ALPHA8_EXT: 0x8C43;
+    readonly FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: 0x8210;
+}
+
+interface EXT_shader_texture_lod {
+}
+
+interface EXT_texture_compression_bptc {
+    readonly COMPRESSED_RGBA_BPTC_UNORM_EXT: 0x8E8C;
+    readonly COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT: 0x8E8D;
+    readonly COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT: 0x8E8E;
+    readonly COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT: 0x8E8F;
+}
+
+interface EXT_texture_compression_rgtc {
+    readonly COMPRESSED_RED_RGTC1_EXT: 0x8DBB;
+    readonly COMPRESSED_SIGNED_RED_RGTC1_EXT: 0x8DBC;
+    readonly COMPRESSED_RED_GREEN_RGTC2_EXT: 0x8DBD;
+    readonly COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT: 0x8DBE;
+}
+
+/** The EXT_texture_filter_anisotropic extension is part of the WebGL API and exposes two constants for anisotropic filtering (AF). */
+interface EXT_texture_filter_anisotropic {
+    readonly TEXTURE_MAX_ANISOTROPY_EXT: 0x84FE;
+    readonly MAX_TEXTURE_MAX_ANISOTROPY_EXT: 0x84FF;
+}
+
+interface EXT_texture_norm16 {
+    readonly R16_EXT: 0x822A;
+    readonly RG16_EXT: 0x822C;
+    readonly RGB16_EXT: 0x8054;
+    readonly RGBA16_EXT: 0x805B;
+    readonly R16_SNORM_EXT: 0x8F98;
+    readonly RG16_SNORM_EXT: 0x8F99;
+    readonly RGB16_SNORM_EXT: 0x8F9A;
+    readonly RGBA16_SNORM_EXT: 0x8F9B;
+}
+
+interface ElementEventMap {
+    "fullscreenchange": Event;
+    "fullscreenerror": Event;
+}
+
+/** Element is the most general base class from which all objects in a Document inherit. It only has methods and properties common to all kinds of elements. More specific classes inherit from Element. */
+interface Element extends Node, ARIAMixin, Animatable, ChildNode, InnerHTML, NonDocumentTypeChildNode, ParentNode, Slottable {
+    readonly attributes: NamedNodeMap;
+    /** Allows for manipulation of element's class content attribute as a set of whitespace-separated tokens through a DOMTokenList object. */
+    readonly classList: DOMTokenList;
+    /** Returns the value of element's class content attribute. Can be set to change it. */
+    className: string;
+    readonly clientHeight: number;
+    readonly clientLeft: number;
+    readonly clientTop: number;
+    readonly clientWidth: number;
+    /** Returns the value of element's id content attribute. Can be set to change it. */
+    id: string;
+    /** Returns the local name. */
+    readonly localName: string;
+    /** Returns the namespace. */
+    readonly namespaceURI: string | null;
+    onfullscreenchange: ((this: Element, ev: Event) => any) | null;
+    onfullscreenerror: ((this: Element, ev: Event) => any) | null;
+    outerHTML: string;
+    readonly ownerDocument: Document;
+    readonly part: DOMTokenList;
+    /** Returns the namespace prefix. */
+    readonly prefix: string | null;
+    readonly scrollHeight: number;
+    scrollLeft: number;
+    scrollTop: number;
+    readonly scrollWidth: number;
+    /** Returns element's shadow root, if any, and if shadow root's mode is "open", and null otherwise. */
+    readonly shadowRoot: ShadowRoot | null;
+    /** Returns the value of element's slot content attribute. Can be set to change it. */
+    slot: string;
+    /** Returns the HTML-uppercased qualified name. */
+    readonly tagName: string;
+    /** Creates a shadow root for element and returns it. */
+    attachShadow(init: ShadowRootInit): ShadowRoot;
+    checkVisibility(options?: CheckVisibilityOptions): boolean;
+    /** Returns the first (starting at element) inclusive ancestor that matches selectors, and null otherwise. */
+    closest<K extends keyof HTMLElementTagNameMap>(selector: K): HTMLElementTagNameMap[K] | null;
+    closest<K extends keyof SVGElementTagNameMap>(selector: K): SVGElementTagNameMap[K] | null;
+    closest<K extends keyof MathMLElementTagNameMap>(selector: K): MathMLElementTagNameMap[K] | null;
+    closest<E extends Element = Element>(selectors: string): E | null;
+    /** Returns element's first attribute whose qualified name is qualifiedName, and null if there is no such attribute otherwise. */
+    getAttribute(qualifiedName: string): string | null;
+    /** Returns element's attribute whose namespace is namespace and local name is localName, and null if there is no such attribute otherwise. */
+    getAttributeNS(namespace: string | null, localName: string): string | null;
+    /** Returns the qualified names of all element's attributes. Can contain duplicates. */
+    getAttributeNames(): string[];
+    getAttributeNode(qualifiedName: string): Attr | null;
+    getAttributeNodeNS(namespace: string | null, localName: string): Attr | null;
+    getBoundingClientRect(): DOMRect;
+    getClientRects(): DOMRectList;
+    /** Returns a HTMLCollection of the elements in the object on which the method was invoked (a document or an element) that have all the classes given by classNames. The classNames argument is interpreted as a space-separated list of classes. */
+    getElementsByClassName(classNames: string): HTMLCollectionOf<Element>;
+    getElementsByTagName<K extends keyof HTMLElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<HTMLElementTagNameMap[K]>;
+    getElementsByTagName<K extends keyof SVGElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<SVGElementTagNameMap[K]>;
+    getElementsByTagName<K extends keyof MathMLElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<MathMLElementTagNameMap[K]>;
+    /** @deprecated */
+    getElementsByTagName<K extends keyof HTMLElementDeprecatedTagNameMap>(qualifiedName: K): HTMLCollectionOf<HTMLElementDeprecatedTagNameMap[K]>;
+    getElementsByTagName(qualifiedName: string): HTMLCollectionOf<Element>;
+    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/1999/xhtml", localName: string): HTMLCollectionOf<HTMLElement>;
+    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/2000/svg", localName: string): HTMLCollectionOf<SVGElement>;
+    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/1998/Math/MathML", localName: string): HTMLCollectionOf<MathMLElement>;
+    getElementsByTagNameNS(namespace: string | null, localName: string): HTMLCollectionOf<Element>;
+    /** Returns true if element has an attribute whose qualified name is qualifiedName, and false otherwise. */
+    hasAttribute(qualifiedName: string): boolean;
+    /** Returns true if element has an attribute whose namespace is namespace and local name is localName. */
+    hasAttributeNS(namespace: string | null, localName: string): boolean;
+    /** Returns true if element has attributes, and false otherwise. */
+    hasAttributes(): boolean;
+    hasPointerCapture(pointerId: number): boolean;
+    insertAdjacentElement(where: InsertPosition, element: Element): Element | null;
+    insertAdjacentHTML(position: InsertPosition, text: string): void;
+    insertAdjacentText(where: InsertPosition, data: string): void;
+    /** Returns true if matching selectors against element's root yields element, and false otherwise. */
+    matches(selectors: string): boolean;
+    releasePointerCapture(pointerId: number): void;
+    /** Removes element's first attribute whose qualified name is qualifiedName. */
+    removeAttribute(qualifiedName: string): void;
+    /** Removes element's attribute whose namespace is namespace and local name is localName. */
+    removeAttributeNS(namespace: string | null, localName: string): void;
+    removeAttributeNode(attr: Attr): Attr;
+    /**
+     * Displays element fullscreen and resolves promise when done.
+     *
+     * When supplied, options's navigationUI member indicates whether showing navigation UI while in fullscreen is preferred or not. If set to "show", navigation simplicity is preferred over screen space, and if set to "hide", more screen space is preferred. User agents are always free to honor user preference over the application's. The default value "auto" indicates no application preference.
+     */
+    requestFullscreen(options?: FullscreenOptions): Promise<void>;
+    requestPointerLock(): void;
+    scroll(options?: ScrollToOptions): void;
+    scroll(x: number, y: number): void;
+    scrollBy(options?: ScrollToOptions): void;
+    scrollBy(x: number, y: number): void;
+    scrollIntoView(arg?: boolean | ScrollIntoViewOptions): void;
+    scrollTo(options?: ScrollToOptions): void;
+    scrollTo(x: number, y: number): void;
+    /** Sets the value of element's first attribute whose qualified name is qualifiedName to value. */
+    setAttribute(qualifiedName: string, value: string): void;
+    /** Sets the value of element's attribute whose namespace is namespace and local name is localName to value. */
+    setAttributeNS(namespace: string | null, qualifiedName: string, value: string): void;
+    setAttributeNode(attr: Attr): Attr | null;
+    setAttributeNodeNS(attr: Attr): Attr | null;
+    setPointerCapture(pointerId: number): void;
+    /**
+     * If force is not given, "toggles" qualifiedName, removing it if it is present and adding it if it is not present. If force is true, adds qualifiedName. If force is false, removes qualifiedName.
+     *
+     * Returns true if qualifiedName is now present, and false otherwise.
+     */
+    toggleAttribute(qualifiedName: string, force?: boolean): boolean;
+    /** @deprecated This is a legacy alias of \`matches\`. */
+    webkitMatchesSelector(selectors: string): boolean;
+    addEventListener<K extends keyof ElementEventMap>(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof ElementEventMap>(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var Element: {
+    prototype: Element;
+    new(): Element;
+};
+
+interface ElementCSSInlineStyle {
+    readonly style: CSSStyleDeclaration;
+}
+
+interface ElementContentEditable {
+    contentEditable: string;
+    enterKeyHint: string;
+    inputMode: string;
+    readonly isContentEditable: boolean;
+}
+
+interface ElementInternals extends ARIAMixin {
+    /** Returns the form owner of internals's target element. */
+    readonly form: HTMLFormElement | null;
+    /** Returns a NodeList of all the label elements that internals's target element is associated with. */
+    readonly labels: NodeList;
+    /** Returns the ShadowRoot for internals's target element, if the target element is a shadow host, or null otherwise. */
+    readonly shadowRoot: ShadowRoot | null;
+    /** Returns the error message that would be shown to the user if internals's target element was to be checked for validity. */
+    readonly validationMessage: string;
+    /** Returns the ValidityState object for internals's target element. */
+    readonly validity: ValidityState;
+    /** Returns true if internals's target element will be validated when the form is submitted; false otherwise. */
+    readonly willValidate: boolean;
+    /** Returns true if internals's target element has no validity problems; false otherwise. Fires an invalid event at the element in the latter case. */
+    checkValidity(): boolean;
+    /** Returns true if internals's target element has no validity problems; otherwise, returns false, fires an invalid event at the element, and (if the event isn't canceled) reports the problem to the user. */
+    reportValidity(): boolean;
+    /**
+     * Sets both the state and submission value of internals's target element to value.
+     *
+     * If value is null, the element won't participate in form submission.
+     */
+    setFormValue(value: File | string | FormData | null, state?: File | string | FormData | null): void;
+    /** Marks internals's target element as suffering from the constraints indicated by the flags argument, and sets the element's validation message to message. If anchor is specified, the user agent might use it to indicate problems with the constraints of internals's target element when the form owner is validated interactively or reportValidity() is called. */
+    setValidity(flags?: ValidityStateFlags, message?: string, anchor?: HTMLElement): void;
+}
+
+declare var ElementInternals: {
+    prototype: ElementInternals;
+    new(): ElementInternals;
+};
+
+/** Events providing information related to errors in scripts or in files. */
+interface ErrorEvent extends Event {
+    readonly colno: number;
+    readonly error: any;
+    readonly filename: string;
+    readonly lineno: number;
+    readonly message: string;
+}
+
+declare var ErrorEvent: {
+    prototype: ErrorEvent;
+    new(type: string, eventInitDict?: ErrorEventInit): ErrorEvent;
+};
+
+/** An event which takes place in the DOM. */
+interface Event {
+    /** Returns true or false depending on how event was initialized. True if event goes through its target's ancestors in reverse tree order, and false otherwise. */
+    readonly bubbles: boolean;
+    /** @deprecated */
+    cancelBubble: boolean;
+    /** Returns true or false depending on how event was initialized. Its return value does not always carry meaning, but true can indicate that part of the operation during which event was dispatched, can be canceled by invoking the preventDefault() method. */
+    readonly cancelable: boolean;
+    /** Returns true or false depending on how event was initialized. True if event invokes listeners past a ShadowRoot node that is the root of its target, and false otherwise. */
+    readonly composed: boolean;
+    /** Returns the object whose event listener's callback is currently being invoked. */
+    readonly currentTarget: EventTarget | null;
+    /** Returns true if preventDefault() was invoked successfully to indicate cancelation, and false otherwise. */
+    readonly defaultPrevented: boolean;
+    /** Returns the event's phase, which is one of NONE, CAPTURING_PHASE, AT_TARGET, and BUBBLING_PHASE. */
+    readonly eventPhase: number;
+    /** Returns true if event was dispatched by the user agent, and false otherwise. */
+    readonly isTrusted: boolean;
+    /** @deprecated */
+    returnValue: boolean;
+    /** @deprecated */
+    readonly srcElement: EventTarget | null;
+    /** Returns the object to which event is dispatched (its target). */
+    readonly target: EventTarget | null;
+    /** Returns the event's timestamp as the number of milliseconds measured relative to the time origin. */
+    readonly timeStamp: DOMHighResTimeStamp;
+    /** Returns the type of event, e.g. "click", "hashchange", or "submit". */
+    readonly type: string;
+    /** Returns the invocation target objects of event's path (objects on which listeners will be invoked), except for any nodes in shadow trees of which the shadow root's mode is "closed" that are not reachable from event's currentTarget. */
+    composedPath(): EventTarget[];
+    /** @deprecated */
+    initEvent(type: string, bubbles?: boolean, cancelable?: boolean): void;
+    /** If invoked when the cancelable attribute value is true, and while executing a listener for the event with passive set to false, signals to the operation that caused event to be dispatched that it needs to be canceled. */
+    preventDefault(): void;
+    /** Invoking this method prevents event from reaching any registered event listeners after the current one finishes running and, when dispatched in a tree, also prevents event from reaching any other objects. */
+    stopImmediatePropagation(): void;
+    /** When dispatched in a tree, invoking this method prevents event from reaching any objects other than the current object. */
+    stopPropagation(): void;
+    readonly NONE: 0;
+    readonly CAPTURING_PHASE: 1;
+    readonly AT_TARGET: 2;
+    readonly BUBBLING_PHASE: 3;
+}
+
+declare var Event: {
+    prototype: Event;
+    new(type: string, eventInitDict?: EventInit): Event;
+    readonly NONE: 0;
+    readonly CAPTURING_PHASE: 1;
+    readonly AT_TARGET: 2;
+    readonly BUBBLING_PHASE: 3;
+};
+
+interface EventCounts {
+    forEach(callbackfn: (value: number, key: string, parent: EventCounts) => void, thisArg?: any): void;
+}
+
+declare var EventCounts: {
+    prototype: EventCounts;
+    new(): EventCounts;
+};
+
+interface EventListener {
+    (evt: Event): void;
+}
+
+interface EventListenerObject {
+    handleEvent(object: Event): void;
+}
+
+interface EventSourceEventMap {
+    "error": Event;
+    "message": MessageEvent;
+    "open": Event;
+}
+
+interface EventSource extends EventTarget {
+    onerror: ((this: EventSource, ev: Event) => any) | null;
+    onmessage: ((this: EventSource, ev: MessageEvent) => any) | null;
+    onopen: ((this: EventSource, ev: Event) => any) | null;
+    /** Returns the state of this EventSource object's connection. It can have the values described below. */
+    readonly readyState: number;
+    /** Returns the URL providing the event stream. */
+    readonly url: string;
+    /** Returns true if the credentials mode for connection requests to the URL providing the event stream is set to "include", and false otherwise. */
+    readonly withCredentials: boolean;
+    /** Aborts any instances of the fetch algorithm started for this EventSource object, and sets the readyState attribute to CLOSED. */
+    close(): void;
+    readonly CONNECTING: 0;
+    readonly OPEN: 1;
+    readonly CLOSED: 2;
+    addEventListener<K extends keyof EventSourceEventMap>(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof EventSourceEventMap>(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var EventSource: {
+    prototype: EventSource;
+    new(url: string | URL, eventSourceInitDict?: EventSourceInit): EventSource;
+    readonly CONNECTING: 0;
+    readonly OPEN: 1;
+    readonly CLOSED: 2;
+};
+
+/** EventTarget is a DOM interface implemented by objects that can receive events and may have listeners for them. */
+interface EventTarget {
+    /**
+     * Appends an event listener for events whose type attribute value is type. The callback argument sets the callback that will be invoked when the event is dispatched.
+     *
+     * The options argument sets listener-specific options. For compatibility this can be a boolean, in which case the method behaves exactly as if the value was specified as options's capture.
+     *
+     * When set to true, options's capture prevents callback from being invoked when the event's eventPhase attribute value is BUBBLING_PHASE. When false (or not present), callback will not be invoked when event's eventPhase attribute value is CAPTURING_PHASE. Either way, callback will be invoked if event's eventPhase attribute value is AT_TARGET.
+     *
+     * When set to true, options's passive indicates that the callback will not cancel the event by invoking preventDefault(). This is used to enable performance optimizations described in \xA7 2.8 Observing event listeners.
+     *
+     * When set to true, options's once indicates that the callback will only be invoked once after which the event listener will be removed.
+     *
+     * If an AbortSignal is passed for options's signal, then the event listener will be removed when signal is aborted.
+     *
+     * The event listener is appended to target's event listener list and is not appended if it has the same type, callback, and capture.
+     */
+    addEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: AddEventListenerOptions | boolean): void;
+    /** Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. */
+    dispatchEvent(event: Event): boolean;
+    /** Removes the event listener in target's event listener list with the same type, callback, and options. */
+    removeEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void;
+}
+
+declare var EventTarget: {
+    prototype: EventTarget;
+    new(): EventTarget;
+};
+
+/** @deprecated */
+interface External {
+    /** @deprecated */
+    AddSearchProvider(): void;
+    /** @deprecated */
+    IsSearchProviderInstalled(): void;
+}
+
+/** @deprecated */
+declare var External: {
+    prototype: External;
+    new(): External;
+};
+
+/** Provides information about files and allows JavaScript in a web page to access their content. */
+interface File extends Blob {
+    readonly lastModified: number;
+    readonly name: string;
+    readonly webkitRelativePath: string;
+}
+
+declare var File: {
+    prototype: File;
+    new(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag): File;
+};
+
+/** An object of this type is returned by the files property of the HTML <input> element; this lets you access the list of files selected with the <input type="file"> element. It's also used for a list of files dropped into web content when using the drag and drop API; see the DataTransfer object for details on this usage. */
+interface FileList {
+    readonly length: number;
+    item(index: number): File | null;
+    [index: number]: File;
+}
+
+declare var FileList: {
+    prototype: FileList;
+    new(): FileList;
+};
+
+interface FileReaderEventMap {
+    "abort": ProgressEvent<FileReader>;
+    "error": ProgressEvent<FileReader>;
+    "load": ProgressEvent<FileReader>;
+    "loadend": ProgressEvent<FileReader>;
+    "loadstart": ProgressEvent<FileReader>;
+    "progress": ProgressEvent<FileReader>;
+}
+
+/** Lets web applications asynchronously read the contents of files (or raw data buffers) stored on the user's computer, using File or Blob objects to specify the file or data to read. */
+interface FileReader extends EventTarget {
+    readonly error: DOMException | null;
+    onabort: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
+    onerror: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
+    onload: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
+    onloadend: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
+    onloadstart: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
+    onprogress: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
+    readonly readyState: typeof FileReader.EMPTY | typeof FileReader.LOADING | typeof FileReader.DONE;
+    readonly result: string | ArrayBuffer | null;
+    abort(): void;
+    readAsArrayBuffer(blob: Blob): void;
+    readAsBinaryString(blob: Blob): void;
+    readAsDataURL(blob: Blob): void;
+    readAsText(blob: Blob, encoding?: string): void;
+    readonly EMPTY: 0;
+    readonly LOADING: 1;
+    readonly DONE: 2;
+    addEventListener<K extends keyof FileReaderEventMap>(type: K, listener: (this: FileReader, ev: FileReaderEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof FileReaderEventMap>(type: K, listener: (this: FileReader, ev: FileReaderEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var FileReader: {
+    prototype: FileReader;
+    new(): FileReader;
+    readonly EMPTY: 0;
+    readonly LOADING: 1;
+    readonly DONE: 2;
+};
+
+interface FileSystem {
+    readonly name: string;
+    readonly root: FileSystemDirectoryEntry;
+}
+
+declare var FileSystem: {
+    prototype: FileSystem;
+    new(): FileSystem;
+};
+
+interface FileSystemDirectoryEntry extends FileSystemEntry {
+    createReader(): FileSystemDirectoryReader;
+    getDirectory(path?: string | null, options?: FileSystemFlags, successCallback?: FileSystemEntryCallback, errorCallback?: ErrorCallback): void;
+    getFile(path?: string | null, options?: FileSystemFlags, successCallback?: FileSystemEntryCallback, errorCallback?: ErrorCallback): void;
+}
+
+declare var FileSystemDirectoryEntry: {
+    prototype: FileSystemDirectoryEntry;
+    new(): FileSystemDirectoryEntry;
+};
+
+/** Available only in secure contexts. */
+interface FileSystemDirectoryHandle extends FileSystemHandle {
+    readonly kind: "directory";
+    getDirectoryHandle(name: string, options?: FileSystemGetDirectoryOptions): Promise<FileSystemDirectoryHandle>;
+    getFileHandle(name: string, options?: FileSystemGetFileOptions): Promise<FileSystemFileHandle>;
+    removeEntry(name: string, options?: FileSystemRemoveOptions): Promise<void>;
+    resolve(possibleDescendant: FileSystemHandle): Promise<string[] | null>;
+}
+
+declare var FileSystemDirectoryHandle: {
+    prototype: FileSystemDirectoryHandle;
+    new(): FileSystemDirectoryHandle;
+};
+
+interface FileSystemDirectoryReader {
+    readEntries(successCallback: FileSystemEntriesCallback, errorCallback?: ErrorCallback): void;
+}
+
+declare var FileSystemDirectoryReader: {
+    prototype: FileSystemDirectoryReader;
+    new(): FileSystemDirectoryReader;
+};
+
+interface FileSystemEntry {
+    readonly filesystem: FileSystem;
+    readonly fullPath: string;
+    readonly isDirectory: boolean;
+    readonly isFile: boolean;
+    readonly name: string;
+    getParent(successCallback?: FileSystemEntryCallback, errorCallback?: ErrorCallback): void;
+}
+
+declare var FileSystemEntry: {
+    prototype: FileSystemEntry;
+    new(): FileSystemEntry;
+};
+
+interface FileSystemFileEntry extends FileSystemEntry {
+    file(successCallback: FileCallback, errorCallback?: ErrorCallback): void;
+}
+
+declare var FileSystemFileEntry: {
+    prototype: FileSystemFileEntry;
+    new(): FileSystemFileEntry;
+};
+
+/** Available only in secure contexts. */
+interface FileSystemFileHandle extends FileSystemHandle {
+    readonly kind: "file";
+    getFile(): Promise<File>;
+}
+
+declare var FileSystemFileHandle: {
+    prototype: FileSystemFileHandle;
+    new(): FileSystemFileHandle;
+};
+
+/** Available only in secure contexts. */
+interface FileSystemHandle {
+    readonly kind: FileSystemHandleKind;
+    readonly name: string;
+    isSameEntry(other: FileSystemHandle): Promise<boolean>;
+}
+
+declare var FileSystemHandle: {
+    prototype: FileSystemHandle;
+    new(): FileSystemHandle;
+};
+
+/** Focus-related events like focus, blur, focusin, or focusout. */
+interface FocusEvent extends UIEvent {
+    readonly relatedTarget: EventTarget | null;
+}
+
+declare var FocusEvent: {
+    prototype: FocusEvent;
+    new(type: string, eventInitDict?: FocusEventInit): FocusEvent;
+};
+
+interface FontFace {
+    ascentOverride: string;
+    descentOverride: string;
+    display: FontDisplay;
+    family: string;
+    featureSettings: string;
+    lineGapOverride: string;
+    readonly loaded: Promise<FontFace>;
+    readonly status: FontFaceLoadStatus;
+    stretch: string;
+    style: string;
+    unicodeRange: string;
+    variant: string;
+    weight: string;
+    load(): Promise<FontFace>;
+}
+
+declare var FontFace: {
+    prototype: FontFace;
+    new(family: string, source: string | BinaryData, descriptors?: FontFaceDescriptors): FontFace;
+};
+
+interface FontFaceSetEventMap {
+    "loading": Event;
+    "loadingdone": Event;
+    "loadingerror": Event;
+}
+
+interface FontFaceSet extends EventTarget {
+    onloading: ((this: FontFaceSet, ev: Event) => any) | null;
+    onloadingdone: ((this: FontFaceSet, ev: Event) => any) | null;
+    onloadingerror: ((this: FontFaceSet, ev: Event) => any) | null;
+    readonly ready: Promise<FontFaceSet>;
+    readonly status: FontFaceSetLoadStatus;
+    check(font: string, text?: string): boolean;
+    load(font: string, text?: string): Promise<FontFace[]>;
+    forEach(callbackfn: (value: FontFace, key: FontFace, parent: FontFaceSet) => void, thisArg?: any): void;
+    addEventListener<K extends keyof FontFaceSetEventMap>(type: K, listener: (this: FontFaceSet, ev: FontFaceSetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof FontFaceSetEventMap>(type: K, listener: (this: FontFaceSet, ev: FontFaceSetEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var FontFaceSet: {
+    prototype: FontFaceSet;
+    new(initialFaces: FontFace[]): FontFaceSet;
+};
+
+interface FontFaceSetLoadEvent extends Event {
+    readonly fontfaces: ReadonlyArray<FontFace>;
+}
+
+declare var FontFaceSetLoadEvent: {
+    prototype: FontFaceSetLoadEvent;
+    new(type: string, eventInitDict?: FontFaceSetLoadEventInit): FontFaceSetLoadEvent;
+};
+
+interface FontFaceSource {
+    readonly fonts: FontFaceSet;
+}
+
+/** Provides a way to easily construct a set of key/value pairs representing form fields and their values, which can then be easily sent using the XMLHttpRequest.send() method. It uses the same format a form would use if the encoding type were set to "multipart/form-data". */
+interface FormData {
+    append(name: string, value: string | Blob, fileName?: string): void;
+    delete(name: string): void;
+    get(name: string): FormDataEntryValue | null;
+    getAll(name: string): FormDataEntryValue[];
+    has(name: string): boolean;
+    set(name: string, value: string | Blob, fileName?: string): void;
+    forEach(callbackfn: (value: FormDataEntryValue, key: string, parent: FormData) => void, thisArg?: any): void;
+}
+
+declare var FormData: {
+    prototype: FormData;
+    new(form?: HTMLFormElement): FormData;
+};
+
+interface FormDataEvent extends Event {
+    /** Returns a FormData object representing names and values of elements associated to the target form. Operations on the FormData object will affect form data to be submitted. */
+    readonly formData: FormData;
+}
+
+declare var FormDataEvent: {
+    prototype: FormDataEvent;
+    new(type: string, eventInitDict: FormDataEventInit): FormDataEvent;
+};
+
+/** A change in volume. It is an AudioNode audio-processing module that causes a given gain to be applied to the input data before its propagation to the output. A GainNode always has exactly one input and one output, both with the same number of channels. */
+interface GainNode extends AudioNode {
+    readonly gain: AudioParam;
+}
+
+declare var GainNode: {
+    prototype: GainNode;
+    new(context: BaseAudioContext, options?: GainOptions): GainNode;
+};
+
+/**
+ * This Gamepad API interface defines an individual gamepad or other controller, allowing access to information such as button presses, axis positions, and id.
+ * Available only in secure contexts.
+ */
+interface Gamepad {
+    readonly axes: ReadonlyArray<number>;
+    readonly buttons: ReadonlyArray<GamepadButton>;
+    readonly connected: boolean;
+    readonly hapticActuators: ReadonlyArray<GamepadHapticActuator>;
+    readonly id: string;
+    readonly index: number;
+    readonly mapping: GamepadMappingType;
+    readonly timestamp: DOMHighResTimeStamp;
+}
+
+declare var Gamepad: {
+    prototype: Gamepad;
+    new(): Gamepad;
+};
+
+/**
+ * An individual button of a gamepad or other controller, allowing access to the current state of different types of buttons available on the control device.
+ * Available only in secure contexts.
+ */
+interface GamepadButton {
+    readonly pressed: boolean;
+    readonly touched: boolean;
+    readonly value: number;
+}
+
+declare var GamepadButton: {
+    prototype: GamepadButton;
+    new(): GamepadButton;
+};
+
+/**
+ * This Gamepad API interface contains references to gamepads connected to the system, which is what the gamepad events Window.gamepadconnected and Window.gamepaddisconnected are fired in response to.
+ * Available only in secure contexts.
+ */
+interface GamepadEvent extends Event {
+    readonly gamepad: Gamepad;
+}
+
+declare var GamepadEvent: {
+    prototype: GamepadEvent;
+    new(type: string, eventInitDict: GamepadEventInit): GamepadEvent;
+};
+
+/** This Gamepad API interface represents hardware in the controller designed to provide haptic feedback to the user (if available), most commonly vibration hardware. */
+interface GamepadHapticActuator {
+    readonly type: GamepadHapticActuatorType;
+}
+
+declare var GamepadHapticActuator: {
+    prototype: GamepadHapticActuator;
+    new(): GamepadHapticActuator;
+};
+
+interface GenericTransformStream {
+    readonly readable: ReadableStream;
+    readonly writable: WritableStream;
+}
+
+/** An object able to programmatically obtain the position of the device. It gives Web content access to the location of the device. This allows a Web site or app to offer customized results based on the user's location. */
+interface Geolocation {
+    clearWatch(watchId: number): void;
+    getCurrentPosition(successCallback: PositionCallback, errorCallback?: PositionErrorCallback | null, options?: PositionOptions): void;
+    watchPosition(successCallback: PositionCallback, errorCallback?: PositionErrorCallback | null, options?: PositionOptions): number;
+}
+
+declare var Geolocation: {
+    prototype: Geolocation;
+    new(): Geolocation;
+};
+
+/** Available only in secure contexts. */
+interface GeolocationCoordinates {
+    readonly accuracy: number;
+    readonly altitude: number | null;
+    readonly altitudeAccuracy: number | null;
+    readonly heading: number | null;
+    readonly latitude: number;
+    readonly longitude: number;
+    readonly speed: number | null;
+}
+
+declare var GeolocationCoordinates: {
+    prototype: GeolocationCoordinates;
+    new(): GeolocationCoordinates;
+};
+
+/** Available only in secure contexts. */
+interface GeolocationPosition {
+    readonly coords: GeolocationCoordinates;
+    readonly timestamp: EpochTimeStamp;
+}
+
+declare var GeolocationPosition: {
+    prototype: GeolocationPosition;
+    new(): GeolocationPosition;
+};
+
+interface GeolocationPositionError {
+    readonly code: number;
+    readonly message: string;
+    readonly PERMISSION_DENIED: 1;
+    readonly POSITION_UNAVAILABLE: 2;
+    readonly TIMEOUT: 3;
+}
+
+declare var GeolocationPositionError: {
+    prototype: GeolocationPositionError;
+    new(): GeolocationPositionError;
+    readonly PERMISSION_DENIED: 1;
+    readonly POSITION_UNAVAILABLE: 2;
+    readonly TIMEOUT: 3;
+};
+
+interface GlobalEventHandlersEventMap {
+    "abort": UIEvent;
+    "animationcancel": AnimationEvent;
+    "animationend": AnimationEvent;
+    "animationiteration": AnimationEvent;
+    "animationstart": AnimationEvent;
+    "auxclick": MouseEvent;
+    "beforeinput": InputEvent;
+    "blur": FocusEvent;
+    "cancel": Event;
+    "canplay": Event;
+    "canplaythrough": Event;
+    "change": Event;
+    "click": MouseEvent;
+    "close": Event;
+    "compositionend": CompositionEvent;
+    "compositionstart": CompositionEvent;
+    "compositionupdate": CompositionEvent;
+    "contextmenu": MouseEvent;
+    "copy": ClipboardEvent;
+    "cuechange": Event;
+    "cut": ClipboardEvent;
+    "dblclick": MouseEvent;
+    "drag": DragEvent;
+    "dragend": DragEvent;
+    "dragenter": DragEvent;
+    "dragleave": DragEvent;
+    "dragover": DragEvent;
+    "dragstart": DragEvent;
+    "drop": DragEvent;
+    "durationchange": Event;
+    "emptied": Event;
+    "ended": Event;
+    "error": ErrorEvent;
+    "focus": FocusEvent;
+    "focusin": FocusEvent;
+    "focusout": FocusEvent;
+    "formdata": FormDataEvent;
+    "gotpointercapture": PointerEvent;
+    "input": Event;
+    "invalid": Event;
+    "keydown": KeyboardEvent;
+    "keypress": KeyboardEvent;
+    "keyup": KeyboardEvent;
+    "load": Event;
+    "loadeddata": Event;
+    "loadedmetadata": Event;
+    "loadstart": Event;
+    "lostpointercapture": PointerEvent;
+    "mousedown": MouseEvent;
+    "mouseenter": MouseEvent;
+    "mouseleave": MouseEvent;
+    "mousemove": MouseEvent;
+    "mouseout": MouseEvent;
+    "mouseover": MouseEvent;
+    "mouseup": MouseEvent;
+    "paste": ClipboardEvent;
+    "pause": Event;
+    "play": Event;
+    "playing": Event;
+    "pointercancel": PointerEvent;
+    "pointerdown": PointerEvent;
+    "pointerenter": PointerEvent;
+    "pointerleave": PointerEvent;
+    "pointermove": PointerEvent;
+    "pointerout": PointerEvent;
+    "pointerover": PointerEvent;
+    "pointerup": PointerEvent;
+    "progress": ProgressEvent;
+    "ratechange": Event;
+    "reset": Event;
+    "resize": UIEvent;
+    "scroll": Event;
+    "securitypolicyviolation": SecurityPolicyViolationEvent;
+    "seeked": Event;
+    "seeking": Event;
+    "select": Event;
+    "selectionchange": Event;
+    "selectstart": Event;
+    "slotchange": Event;
+    "stalled": Event;
+    "submit": SubmitEvent;
+    "suspend": Event;
+    "timeupdate": Event;
+    "toggle": Event;
+    "touchcancel": TouchEvent;
+    "touchend": TouchEvent;
+    "touchmove": TouchEvent;
+    "touchstart": TouchEvent;
+    "transitioncancel": TransitionEvent;
+    "transitionend": TransitionEvent;
+    "transitionrun": TransitionEvent;
+    "transitionstart": TransitionEvent;
+    "volumechange": Event;
+    "waiting": Event;
+    "webkitanimationend": Event;
+    "webkitanimationiteration": Event;
+    "webkitanimationstart": Event;
+    "webkittransitionend": Event;
+    "wheel": WheelEvent;
+}
+
+interface GlobalEventHandlers {
+    /**
+     * Fires when the user aborts the download.
+     * @param ev The event.
+     */
+    onabort: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null;
+    onanimationcancel: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null;
+    onanimationend: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null;
+    onanimationiteration: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null;
+    onanimationstart: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null;
+    onauxclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
+    onbeforeinput: ((this: GlobalEventHandlers, ev: InputEvent) => any) | null;
+    /**
+     * Fires when the object loses the input focus.
+     * @param ev The focus event.
+     */
+    onblur: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null;
+    oncancel: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Occurs when playback is possible, but would require further buffering.
+     * @param ev The event.
+     */
+    oncanplay: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    oncanplaythrough: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Fires when the contents of the object or selection have changed.
+     * @param ev The event.
+     */
+    onchange: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Fires when the user clicks the left mouse button on the object
+     * @param ev The mouse event.
+     */
+    onclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
+    onclose: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Fires when the user clicks the right mouse button in the client area, opening the context menu.
+     * @param ev The mouse event.
+     */
+    oncontextmenu: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
+    oncopy: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null;
+    oncuechange: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    oncut: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null;
+    /**
+     * Fires when the user double-clicks the object.
+     * @param ev The mouse event.
+     */
+    ondblclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
+    /**
+     * Fires on the source object continuously during a drag operation.
+     * @param ev The event.
+     */
+    ondrag: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null;
+    /**
+     * Fires on the source object when the user releases the mouse at the close of a drag operation.
+     * @param ev The event.
+     */
+    ondragend: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null;
+    /**
+     * Fires on the target element when the user drags the object to a valid drop target.
+     * @param ev The drag event.
+     */
+    ondragenter: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null;
+    /**
+     * Fires on the target object when the user moves the mouse out of a valid drop target during a drag operation.
+     * @param ev The drag event.
+     */
+    ondragleave: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null;
+    /**
+     * Fires on the target element continuously while the user drags the object over a valid drop target.
+     * @param ev The event.
+     */
+    ondragover: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null;
+    /**
+     * Fires on the source object when the user starts to drag a text selection or selected object.
+     * @param ev The event.
+     */
+    ondragstart: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null;
+    ondrop: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null;
+    /**
+     * Occurs when the duration attribute is updated.
+     * @param ev The event.
+     */
+    ondurationchange: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Occurs when the media element is reset to its initial state.
+     * @param ev The event.
+     */
+    onemptied: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Occurs when the end of playback is reached.
+     * @param ev The event
+     */
+    onended: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Fires when an error occurs during object loading.
+     * @param ev The event.
+     */
+    onerror: OnErrorEventHandler;
+    /**
+     * Fires when the object receives focus.
+     * @param ev The event.
+     */
+    onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null;
+    onformdata: ((this: GlobalEventHandlers, ev: FormDataEvent) => any) | null;
+    ongotpointercapture: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
+    oninput: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    oninvalid: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Fires when the user presses a key.
+     * @param ev The keyboard event
+     */
+    onkeydown: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null;
+    /**
+     * Fires when the user presses an alphanumeric key.
+     * @param ev The event.
+     * @deprecated
+     */
+    onkeypress: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null;
+    /**
+     * Fires when the user releases a key.
+     * @param ev The keyboard event
+     */
+    onkeyup: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null;
+    /**
+     * Fires immediately after the browser loads the object.
+     * @param ev The event.
+     */
+    onload: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Occurs when media data is loaded at the current playback position.
+     * @param ev The event.
+     */
+    onloadeddata: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Occurs when the duration and dimensions of the media have been determined.
+     * @param ev The event.
+     */
+    onloadedmetadata: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Occurs when Internet Explorer begins looking for media data.
+     * @param ev The event.
+     */
+    onloadstart: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    onlostpointercapture: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
+    /**
+     * Fires when the user clicks the object with either mouse button.
+     * @param ev The mouse event.
+     */
+    onmousedown: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
+    onmouseenter: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
+    onmouseleave: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
+    /**
+     * Fires when the user moves the mouse over the object.
+     * @param ev The mouse event.
+     */
+    onmousemove: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
+    /**
+     * Fires when the user moves the mouse pointer outside the boundaries of the object.
+     * @param ev The mouse event.
+     */
+    onmouseout: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
+    /**
+     * Fires when the user moves the mouse pointer into the object.
+     * @param ev The mouse event.
+     */
+    onmouseover: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
+    /**
+     * Fires when the user releases a mouse button while the mouse is over the object.
+     * @param ev The mouse event.
+     */
+    onmouseup: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
+    onpaste: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null;
+    /**
+     * Occurs when playback is paused.
+     * @param ev The event.
+     */
+    onpause: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Occurs when the play method is requested.
+     * @param ev The event.
+     */
+    onplay: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Occurs when the audio or video has started playing.
+     * @param ev The event.
+     */
+    onplaying: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    onpointercancel: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
+    onpointerdown: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
+    onpointerenter: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
+    onpointerleave: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
+    onpointermove: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
+    onpointerout: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
+    onpointerover: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
+    onpointerup: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
+    /**
+     * Occurs to indicate progress while downloading media data.
+     * @param ev The event.
+     */
+    onprogress: ((this: GlobalEventHandlers, ev: ProgressEvent) => any) | null;
+    /**
+     * Occurs when the playback rate is increased or decreased.
+     * @param ev The event.
+     */
+    onratechange: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Fires when the user resets a form.
+     * @param ev The event.
+     */
+    onreset: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    onresize: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null;
+    /**
+     * Fires when the user repositions the scroll box in the scroll bar on the object.
+     * @param ev The event.
+     */
+    onscroll: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    onsecuritypolicyviolation: ((this: GlobalEventHandlers, ev: SecurityPolicyViolationEvent) => any) | null;
+    /**
+     * Occurs when the seek operation ends.
+     * @param ev The event.
+     */
+    onseeked: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Occurs when the current playback position is moved.
+     * @param ev The event.
+     */
+    onseeking: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Fires when the current selection changes.
+     * @param ev The event.
+     */
+    onselect: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    onselectionchange: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    onselectstart: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    onslotchange: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Occurs when the download has stopped.
+     * @param ev The event.
+     */
+    onstalled: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    onsubmit: ((this: GlobalEventHandlers, ev: SubmitEvent) => any) | null;
+    /**
+     * Occurs if the load operation has been intentionally halted.
+     * @param ev The event.
+     */
+    onsuspend: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Occurs to indicate the current playback position.
+     * @param ev The event.
+     */
+    ontimeupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    ontoggle: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    ontouchcancel?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null | undefined;
+    ontouchend?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null | undefined;
+    ontouchmove?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null | undefined;
+    ontouchstart?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null | undefined;
+    ontransitioncancel: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null;
+    ontransitionend: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null;
+    ontransitionrun: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null;
+    ontransitionstart: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null;
+    /**
+     * Occurs when the volume is changed, or playback is muted or unmuted.
+     * @param ev The event.
+     */
+    onvolumechange: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /**
+     * Occurs when playback stops because the next frame of a video resource is not available.
+     * @param ev The event.
+     */
+    onwaiting: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /** @deprecated This is a legacy alias of \`onanimationend\`. */
+    onwebkitanimationend: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /** @deprecated This is a legacy alias of \`onanimationiteration\`. */
+    onwebkitanimationiteration: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /** @deprecated This is a legacy alias of \`onanimationstart\`. */
+    onwebkitanimationstart: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    /** @deprecated This is a legacy alias of \`ontransitionend\`. */
+    onwebkittransitionend: ((this: GlobalEventHandlers, ev: Event) => any) | null;
+    onwheel: ((this: GlobalEventHandlers, ev: WheelEvent) => any) | null;
+    addEventListener<K extends keyof GlobalEventHandlersEventMap>(type: K, listener: (this: GlobalEventHandlers, ev: GlobalEventHandlersEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof GlobalEventHandlersEventMap>(type: K, listener: (this: GlobalEventHandlers, ev: GlobalEventHandlersEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+interface HTMLAllCollection {
+    /** Returns the number of elements in the collection. */
+    readonly length: number;
+    /** Returns the item with index index from the collection (determined by tree order). */
+    item(nameOrIndex?: string): HTMLCollection | Element | null;
+    /**
+     * Returns the item with ID or name name from the collection.
+     *
+     * If there are multiple matching items, then an HTMLCollection object containing all those elements is returned.
+     *
+     * Only button, form, iframe, input, map, meta, object, select, and textarea elements can have a name for the purpose of this method; their name is given by the value of their name attribute.
+     */
+    namedItem(name: string): HTMLCollection | Element | null;
+    [index: number]: Element;
+}
+
+declare var HTMLAllCollection: {
+    prototype: HTMLAllCollection;
+    new(): HTMLAllCollection;
+};
+
+/** Hyperlink elements and provides special properties and methods (beyond those of the regular HTMLElement object interface that they inherit from) for manipulating the layout and presentation of such elements. */
+interface HTMLAnchorElement extends HTMLElement, HTMLHyperlinkElementUtils {
+    /**
+     * Sets or retrieves the character set used to encode the object.
+     * @deprecated
+     */
+    charset: string;
+    /**
+     * Sets or retrieves the coordinates of the object.
+     * @deprecated
+     */
+    coords: string;
+    download: string;
+    /** Sets or retrieves the language code of the object. */
+    hreflang: string;
+    /**
+     * Sets or retrieves the shape of the object.
+     * @deprecated
+     */
+    name: string;
+    ping: string;
+    referrerPolicy: string;
+    /** Sets or retrieves the relationship between the object and the destination of the link. */
+    rel: string;
+    readonly relList: DOMTokenList;
+    /**
+     * Sets or retrieves the relationship between the object and the destination of the link.
+     * @deprecated
+     */
+    rev: string;
+    /**
+     * Sets or retrieves the shape of the object.
+     * @deprecated
+     */
+    shape: string;
+    /** Sets or retrieves the window or frame at which to target content. */
+    target: string;
+    /** Retrieves or sets the text of the object as a string. */
+    text: string;
+    type: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLAnchorElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLAnchorElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLAnchorElement: {
+    prototype: HTMLAnchorElement;
+    new(): HTMLAnchorElement;
+};
+
+/** Provides special properties and methods (beyond those of the regular object HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of <area> elements. */
+interface HTMLAreaElement extends HTMLElement, HTMLHyperlinkElementUtils {
+    /** Sets or retrieves a text alternative to the graphic. */
+    alt: string;
+    /** Sets or retrieves the coordinates of the object. */
+    coords: string;
+    download: string;
+    /**
+     * Sets or gets whether clicks in this region cause action.
+     * @deprecated
+     */
+    noHref: boolean;
+    ping: string;
+    referrerPolicy: string;
+    rel: string;
+    readonly relList: DOMTokenList;
+    /** Sets or retrieves the shape of the object. */
+    shape: string;
+    /** Sets or retrieves the window or frame at which to target content. */
+    target: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLAreaElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLAreaElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLAreaElement: {
+    prototype: HTMLAreaElement;
+    new(): HTMLAreaElement;
+};
+
+/** Provides access to the properties of <audio> elements, as well as methods to manipulate them. It derives from the HTMLMediaElement interface. */
+interface HTMLAudioElement extends HTMLMediaElement {
+    addEventListener<K extends keyof HTMLMediaElementEventMap>(type: K, listener: (this: HTMLAudioElement, ev: HTMLMediaElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLMediaElementEventMap>(type: K, listener: (this: HTMLAudioElement, ev: HTMLMediaElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLAudioElement: {
+    prototype: HTMLAudioElement;
+    new(): HTMLAudioElement;
+};
+
+/** A HTML line break element (<br>). It inherits from HTMLElement. */
+interface HTMLBRElement extends HTMLElement {
+    /**
+     * Sets or retrieves the side on which floating objects are not to be positioned when any IHTMLBlockElement is inserted into the document.
+     * @deprecated
+     */
+    clear: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLBRElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLBRElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLBRElement: {
+    prototype: HTMLBRElement;
+    new(): HTMLBRElement;
+};
+
+/** Contains the base URI\xA0for a document. This object inherits all of the properties and methods as described in the HTMLElement interface. */
+interface HTMLBaseElement extends HTMLElement {
+    /** Gets or sets the baseline URL on which relative links are based. */
+    href: string;
+    /** Sets or retrieves the window or frame at which to target content. */
+    target: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLBaseElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLBaseElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLBaseElement: {
+    prototype: HTMLBaseElement;
+    new(): HTMLBaseElement;
+};
+
+interface HTMLBodyElementEventMap extends HTMLElementEventMap, WindowEventHandlersEventMap {
+}
+
+/** Provides special properties (beyond those inherited from the regular HTMLElement interface) for manipulating <body> elements. */
+interface HTMLBodyElement extends HTMLElement, WindowEventHandlers {
+    /** @deprecated */
+    aLink: string;
+    /** @deprecated */
+    background: string;
+    /** @deprecated */
+    bgColor: string;
+    /** @deprecated */
+    link: string;
+    /** @deprecated */
+    text: string;
+    /** @deprecated */
+    vLink: string;
+    addEventListener<K extends keyof HTMLBodyElementEventMap>(type: K, listener: (this: HTMLBodyElement, ev: HTMLBodyElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLBodyElementEventMap>(type: K, listener: (this: HTMLBodyElement, ev: HTMLBodyElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLBodyElement: {
+    prototype: HTMLBodyElement;
+    new(): HTMLBodyElement;
+};
+
+/** Provides properties and methods (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating <button> elements. */
+interface HTMLButtonElement extends HTMLElement {
+    disabled: boolean;
+    /** Retrieves a reference to the form that the object is embedded in. */
+    readonly form: HTMLFormElement | null;
+    /** Overrides the action attribute (where the data on a form is sent) on the parent form element. */
+    formAction: string;
+    /** Used to override the encoding (formEnctype attribute) specified on the form element. */
+    formEnctype: string;
+    /** Overrides the submit method attribute previously specified on a form element. */
+    formMethod: string;
+    /** Overrides any validation or required attributes on a form or form elements to allow it to be submitted without validation. This can be used to create a "save draft"-type submit option. */
+    formNoValidate: boolean;
+    /** Overrides the target attribute on a form element. */
+    formTarget: string;
+    readonly labels: NodeListOf<HTMLLabelElement>;
+    /** Sets or retrieves the name of the object. */
+    name: string;
+    /** Gets the classification and default behavior of the button. */
+    type: string;
+    /** Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting. */
+    readonly validationMessage: string;
+    /** Returns a  ValidityState object that represents the validity states of an element. */
+    readonly validity: ValidityState;
+    /** Sets or retrieves the default or selected value of the control. */
+    value: string;
+    /** Returns whether an element will successfully validate based on forms validation rules and constraints. */
+    readonly willValidate: boolean;
+    /** Returns whether a form will validate when it is submitted, without having to submit it. */
+    checkValidity(): boolean;
+    reportValidity(): boolean;
+    /**
+     * Sets a custom error message that is displayed when a form is submitted.
+     * @param error Sets a custom error message that is displayed when a form is submitted.
+     */
+    setCustomValidity(error: string): void;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLButtonElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLButtonElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLButtonElement: {
+    prototype: HTMLButtonElement;
+    new(): HTMLButtonElement;
+};
+
+/** Provides properties and methods for manipulating the layout and presentation of <canvas> elements. The HTMLCanvasElement interface also inherits the properties and methods of the HTMLElement interface. */
+interface HTMLCanvasElement extends HTMLElement {
+    /** Gets or sets the height of a canvas element on a document. */
+    height: number;
+    /** Gets or sets the width of a canvas element on a document. */
+    width: number;
+    captureStream(frameRequestRate?: number): MediaStream;
+    /**
+     * Returns an object that provides methods and properties for drawing and manipulating images and graphics on a canvas element in a document. A context object includes information about colors, line widths, fonts, and other graphic parameters that can be drawn on a canvas.
+     * @param contextId The identifier (ID) of the type of canvas to create. Internet Explorer 9 and Internet Explorer 10 support only a 2-D context using canvas.getContext("2d"); IE11 Preview also supports 3-D or WebGL context using canvas.getContext("experimental-webgl");
+     */
+    getContext(contextId: "2d", options?: CanvasRenderingContext2DSettings): CanvasRenderingContext2D | null;
+    getContext(contextId: "bitmaprenderer", options?: ImageBitmapRenderingContextSettings): ImageBitmapRenderingContext | null;
+    getContext(contextId: "webgl", options?: WebGLContextAttributes): WebGLRenderingContext | null;
+    getContext(contextId: "webgl2", options?: WebGLContextAttributes): WebGL2RenderingContext | null;
+    getContext(contextId: string, options?: any): RenderingContext | null;
+    toBlob(callback: BlobCallback, type?: string, quality?: any): void;
+    /**
+     * Returns the content of the current canvas as an image that you can use as a source for another canvas or an HTML element.
+     * @param type The standard MIME type for the image format to return. If you do not specify this parameter, the default value is a PNG format image.
+     */
+    toDataURL(type?: string, quality?: any): string;
+    transferControlToOffscreen(): OffscreenCanvas;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLCanvasElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLCanvasElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLCanvasElement: {
+    prototype: HTMLCanvasElement;
+    new(): HTMLCanvasElement;
+};
+
+/** A generic collection (array-like object similar to arguments) of elements (in document order) and offers methods and properties for selecting from the list. */
+interface HTMLCollectionBase {
+    /** Sets or retrieves the number of objects in a collection. */
+    readonly length: number;
+    /** Retrieves an object from various collections. */
+    item(index: number): Element | null;
+    [index: number]: Element;
+}
+
+interface HTMLCollection extends HTMLCollectionBase {
+    /** Retrieves a select object or an object from an options collection. */
+    namedItem(name: string): Element | null;
+}
+
+declare var HTMLCollection: {
+    prototype: HTMLCollection;
+    new(): HTMLCollection;
+};
+
+interface HTMLCollectionOf<T extends Element> extends HTMLCollectionBase {
+    item(index: number): T | null;
+    namedItem(name: string): T | null;
+    [index: number]: T;
+}
+
+/** Provides special properties (beyond those of the regular HTMLElement interface it also has available to it by inheritance) for manipulating definition list (<dl>) elements. */
+interface HTMLDListElement extends HTMLElement {
+    /** @deprecated */
+    compact: boolean;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLDListElement: {
+    prototype: HTMLDListElement;
+    new(): HTMLDListElement;
+};
+
+/** Provides special properties (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating <data> elements. */
+interface HTMLDataElement extends HTMLElement {
+    value: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDataElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDataElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLDataElement: {
+    prototype: HTMLDataElement;
+    new(): HTMLDataElement;
+};
+
+/** Provides special properties (beyond the HTMLElement object interface it also has available to it by inheritance) to manipulate <datalist> elements and their content. */
+interface HTMLDataListElement extends HTMLElement {
+    /** Returns an HTMLCollection of the option elements of the datalist element. */
+    readonly options: HTMLCollectionOf<HTMLOptionElement>;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDataListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDataListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLDataListElement: {
+    prototype: HTMLDataListElement;
+    new(): HTMLDataListElement;
+};
+
+interface HTMLDetailsElement extends HTMLElement {
+    open: boolean;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDetailsElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDetailsElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLDetailsElement: {
+    prototype: HTMLDetailsElement;
+    new(): HTMLDetailsElement;
+};
+
+interface HTMLDialogElement extends HTMLElement {
+    open: boolean;
+    returnValue: string;
+    /**
+     * Closes the dialog element.
+     *
+     * The argument, if provided, provides a return value.
+     */
+    close(returnValue?: string): void;
+    /** Displays the dialog element. */
+    show(): void;
+    showModal(): void;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDialogElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDialogElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLDialogElement: {
+    prototype: HTMLDialogElement;
+    new(): HTMLDialogElement;
+};
+
+/** @deprecated */
+interface HTMLDirectoryElement extends HTMLElement {
+    /** @deprecated */
+    compact: boolean;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDirectoryElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDirectoryElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+/** @deprecated */
+declare var HTMLDirectoryElement: {
+    prototype: HTMLDirectoryElement;
+    new(): HTMLDirectoryElement;
+};
+
+/** Provides special properties (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating <div> elements. */
+interface HTMLDivElement extends HTMLElement {
+    /**
+     * Sets or retrieves how the object is aligned with adjacent text.
+     * @deprecated
+     */
+    align: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDivElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDivElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLDivElement: {
+    prototype: HTMLDivElement;
+    new(): HTMLDivElement;
+};
+
+/** @deprecated use Document */
+interface HTMLDocument extends Document {
+    addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: HTMLDocument, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: HTMLDocument, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+/** @deprecated */
+declare var HTMLDocument: {
+    prototype: HTMLDocument;
+    new(): HTMLDocument;
+};
+
+interface HTMLElementEventMap extends ElementEventMap, GlobalEventHandlersEventMap {
+}
+
+/** Any HTML element. Some elements directly implement this interface, while others implement it via an interface that inherits it. */
+interface HTMLElement extends Element, ElementCSSInlineStyle, ElementContentEditable, GlobalEventHandlers, HTMLOrSVGElement {
+    accessKey: string;
+    readonly accessKeyLabel: string;
+    autocapitalize: string;
+    dir: string;
+    draggable: boolean;
+    hidden: boolean;
+    inert: boolean;
+    innerText: string;
+    lang: string;
+    readonly offsetHeight: number;
+    readonly offsetLeft: number;
+    readonly offsetParent: Element | null;
+    readonly offsetTop: number;
+    readonly offsetWidth: number;
+    outerText: string;
+    spellcheck: boolean;
+    title: string;
+    translate: boolean;
+    attachInternals(): ElementInternals;
+    click(): void;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLElement: {
+    prototype: HTMLElement;
+    new(): HTMLElement;
+};
+
+/** Provides special properties (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating <embed> elements. */
+interface HTMLEmbedElement extends HTMLElement {
+    /** @deprecated */
+    align: string;
+    /** Sets or retrieves the height of the object. */
+    height: string;
+    /**
+     * Sets or retrieves the name of the object.
+     * @deprecated
+     */
+    name: string;
+    /** Sets or retrieves a URL to be loaded by the object. */
+    src: string;
+    type: string;
+    /** Sets or retrieves the width of the object. */
+    width: string;
+    getSVGDocument(): Document | null;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLEmbedElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLEmbedElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLEmbedElement: {
+    prototype: HTMLEmbedElement;
+    new(): HTMLEmbedElement;
+};
+
+/** Provides special properties and methods (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of <fieldset> elements. */
+interface HTMLFieldSetElement extends HTMLElement {
+    disabled: boolean;
+    /** Returns an HTMLCollection of the form controls in the element. */
+    readonly elements: HTMLCollection;
+    /** Retrieves a reference to the form that the object is embedded in. */
+    readonly form: HTMLFormElement | null;
+    name: string;
+    /** Returns the string "fieldset". */
+    readonly type: string;
+    /** Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting. */
+    readonly validationMessage: string;
+    /** Returns a  ValidityState object that represents the validity states of an element. */
+    readonly validity: ValidityState;
+    /** Returns whether an element will successfully validate based on forms validation rules and constraints. */
+    readonly willValidate: boolean;
+    /** Returns whether a form will validate when it is submitted, without having to submit it. */
+    checkValidity(): boolean;
+    reportValidity(): boolean;
+    /**
+     * Sets a custom error message that is displayed when a form is submitted.
+     * @param error Sets a custom error message that is displayed when a form is submitted.
+     */
+    setCustomValidity(error: string): void;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFieldSetElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFieldSetElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLFieldSetElement: {
+    prototype: HTMLFieldSetElement;
+    new(): HTMLFieldSetElement;
+};
+
+/**
+ * Implements the document object model (DOM) representation of the font element. The HTML Font Element <font> defines the font size, font face and color of text.
+ * @deprecated
+ */
+interface HTMLFontElement extends HTMLElement {
+    /** @deprecated */
+    color: string;
+    /**
+     * Sets or retrieves the current typeface family.
+     * @deprecated
+     */
+    face: string;
+    /** @deprecated */
+    size: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFontElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFontElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+/** @deprecated */
+declare var HTMLFontElement: {
+    prototype: HTMLFontElement;
+    new(): HTMLFontElement;
+};
+
+/** A collection of HTML form control elements.  */
+interface HTMLFormControlsCollection extends HTMLCollectionBase {
+    /**
+     * Returns the item with ID or name name from the collection.
+     *
+     * If there are multiple matching items, then a RadioNodeList object containing all those elements is returned.
+     */
+    namedItem(name: string): RadioNodeList | Element | null;
+}
+
+declare var HTMLFormControlsCollection: {
+    prototype: HTMLFormControlsCollection;
+    new(): HTMLFormControlsCollection;
+};
+
+/** A <form> element in the DOM; it allows access to and in some cases modification of aspects of the form, as well as access to its component elements. */
+interface HTMLFormElement extends HTMLElement {
+    /** Sets or retrieves a list of character encodings for input data that must be accepted by the server processing the form. */
+    acceptCharset: string;
+    /** Sets or retrieves the URL to which the form content is sent for processing. */
+    action: string;
+    /** Specifies whether autocomplete is applied to an editable text field. */
+    autocomplete: string;
+    /** Retrieves a collection, in source order, of all controls in a given form. */
+    readonly elements: HTMLFormControlsCollection;
+    /** Sets or retrieves the MIME encoding for the form. */
+    encoding: string;
+    /** Sets or retrieves the encoding type for the form. */
+    enctype: string;
+    /** Sets or retrieves the number of objects in a collection. */
+    readonly length: number;
+    /** Sets or retrieves how to send the form data to the server. */
+    method: string;
+    /** Sets or retrieves the name of the object. */
+    name: string;
+    /** Designates a form that is not validated when submitted. */
+    noValidate: boolean;
+    rel: string;
+    readonly relList: DOMTokenList;
+    /** Sets or retrieves the window or frame at which to target content. */
+    target: string;
+    /** Returns whether a form will validate when it is submitted, without having to submit it. */
+    checkValidity(): boolean;
+    reportValidity(): boolean;
+    requestSubmit(submitter?: HTMLElement | null): void;
+    /** Fires when the user resets a form. */
+    reset(): void;
+    /** Fires when a FORM is about to be submitted. */
+    submit(): void;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFormElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFormElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+    [index: number]: Element;
+    [name: string]: any;
+}
+
+declare var HTMLFormElement: {
+    prototype: HTMLFormElement;
+    new(): HTMLFormElement;
+};
+
+/** @deprecated */
+interface HTMLFrameElement extends HTMLElement {
+    /**
+     * Retrieves the document object of the page or frame.
+     * @deprecated
+     */
+    readonly contentDocument: Document | null;
+    /**
+     * Retrieves the object of the specified.
+     * @deprecated
+     */
+    readonly contentWindow: WindowProxy | null;
+    /**
+     * Sets or retrieves whether to display a border for the frame.
+     * @deprecated
+     */
+    frameBorder: string;
+    /**
+     * Sets or retrieves a URI to a long description of the object.
+     * @deprecated
+     */
+    longDesc: string;
+    /**
+     * Sets or retrieves the top and bottom margin heights before displaying the text in a frame.
+     * @deprecated
+     */
+    marginHeight: string;
+    /**
+     * Sets or retrieves the left and right margin widths before displaying the text in a frame.
+     * @deprecated
+     */
+    marginWidth: string;
+    /**
+     * Sets or retrieves the frame name.
+     * @deprecated
+     */
+    name: string;
+    /**
+     * Sets or retrieves whether the user can resize the frame.
+     * @deprecated
+     */
+    noResize: boolean;
+    /**
+     * Sets or retrieves whether the frame can be scrolled.
+     * @deprecated
+     */
+    scrolling: string;
+    /**
+     * Sets or retrieves a URL to be loaded by the object.
+     * @deprecated
+     */
+    src: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFrameElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFrameElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+/** @deprecated */
+declare var HTMLFrameElement: {
+    prototype: HTMLFrameElement;
+    new(): HTMLFrameElement;
+};
+
+interface HTMLFrameSetElementEventMap extends HTMLElementEventMap, WindowEventHandlersEventMap {
+}
+
+/**
+ * Provides special properties (beyond those of the regular HTMLElement interface they also inherit) for manipulating <frameset> elements.
+ * @deprecated
+ */
+interface HTMLFrameSetElement extends HTMLElement, WindowEventHandlers {
+    /**
+     * Sets or retrieves the frame widths of the object.
+     * @deprecated
+     */
+    cols: string;
+    /**
+     * Sets or retrieves the frame heights of the object.
+     * @deprecated
+     */
+    rows: string;
+    addEventListener<K extends keyof HTMLFrameSetElementEventMap>(type: K, listener: (this: HTMLFrameSetElement, ev: HTMLFrameSetElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLFrameSetElementEventMap>(type: K, listener: (this: HTMLFrameSetElement, ev: HTMLFrameSetElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+/** @deprecated */
+declare var HTMLFrameSetElement: {
+    prototype: HTMLFrameSetElement;
+    new(): HTMLFrameSetElement;
+};
+
+/** Provides special properties (beyond those of the HTMLElement interface it also has available to it by inheritance) for manipulating <hr> elements. */
+interface HTMLHRElement extends HTMLElement {
+    /**
+     * Sets or retrieves how the object is aligned with adjacent text.
+     * @deprecated
+     */
+    align: string;
+    /** @deprecated */
+    color: string;
+    /**
+     * Sets or retrieves whether the horizontal rule is drawn with 3-D shading.
+     * @deprecated
+     */
+    noShade: boolean;
+    /** @deprecated */
+    size: string;
+    /**
+     * Sets or retrieves the width of the object.
+     * @deprecated
+     */
+    width: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHRElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHRElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLHRElement: {
+    prototype: HTMLHRElement;
+    new(): HTMLHRElement;
+};
+
+/** Contains the descriptive information, or metadata, for a document. This object inherits all of the properties and methods described in the HTMLElement interface. */
+interface HTMLHeadElement extends HTMLElement {
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHeadElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHeadElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLHeadElement: {
+    prototype: HTMLHeadElement;
+    new(): HTMLHeadElement;
+};
+
+/** The different heading elements. It inherits methods and properties from the HTMLElement interface. */
+interface HTMLHeadingElement extends HTMLElement {
+    /**
+     * Sets or retrieves a value that indicates the table alignment.
+     * @deprecated
+     */
+    align: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHeadingElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHeadingElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLHeadingElement: {
+    prototype: HTMLHeadingElement;
+    new(): HTMLHeadingElement;
+};
+
+/** Serves as the root node for a given HTML document. This object inherits the properties and methods described in the HTMLElement interface. */
+interface HTMLHtmlElement extends HTMLElement {
+    /**
+     * Sets or retrieves the DTD version that governs the current document.
+     * @deprecated
+     */
+    version: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHtmlElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHtmlElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLHtmlElement: {
+    prototype: HTMLHtmlElement;
+    new(): HTMLHtmlElement;
+};
+
+interface HTMLHyperlinkElementUtils {
+    /**
+     * Returns the hyperlink's URL's fragment (includes leading "#" if non-empty).
+     *
+     * Can be set, to change the URL's fragment (ignores leading "#").
+     */
+    hash: string;
+    /**
+     * Returns the hyperlink's URL's host and port (if different from the default port for the scheme).
+     *
+     * Can be set, to change the URL's host and port.
+     */
+    host: string;
+    /**
+     * Returns the hyperlink's URL's host.
+     *
+     * Can be set, to change the URL's host.
+     */
+    hostname: string;
+    /**
+     * Returns the hyperlink's URL.
+     *
+     * Can be set, to change the URL.
+     */
+    href: string;
+    toString(): string;
+    /** Returns the hyperlink's URL's origin. */
+    readonly origin: string;
+    /**
+     * Returns the hyperlink's URL's password.
+     *
+     * Can be set, to change the URL's password.
+     */
+    password: string;
+    /**
+     * Returns the hyperlink's URL's path.
+     *
+     * Can be set, to change the URL's path.
+     */
+    pathname: string;
+    /**
+     * Returns the hyperlink's URL's port.
+     *
+     * Can be set, to change the URL's port.
+     */
+    port: string;
+    /**
+     * Returns the hyperlink's URL's scheme.
+     *
+     * Can be set, to change the URL's scheme.
+     */
+    protocol: string;
+    /**
+     * Returns the hyperlink's URL's query (includes leading "?" if non-empty).
+     *
+     * Can be set, to change the URL's query (ignores leading "?").
+     */
+    search: string;
+    /**
+     * Returns the hyperlink's URL's username.
+     *
+     * Can be set, to change the URL's username.
+     */
+    username: string;
+}
+
+/** Provides special properties and methods (beyond those of the HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of inline frame elements. */
+interface HTMLIFrameElement extends HTMLElement {
+    /**
+     * Sets or retrieves how the object is aligned with adjacent text.
+     * @deprecated
+     */
+    align: string;
+    allow: string;
+    allowFullscreen: boolean;
+    /** Retrieves the document object of the page or frame. */
+    readonly contentDocument: Document | null;
+    /** Retrieves the object of the specified. */
+    readonly contentWindow: WindowProxy | null;
+    /**
+     * Sets or retrieves whether to display a border for the frame.
+     * @deprecated
+     */
+    frameBorder: string;
+    /** Sets or retrieves the height of the object. */
+    height: string;
+    /**
+     * Sets or retrieves a URI to a long description of the object.
+     * @deprecated
+     */
+    longDesc: string;
+    /**
+     * Sets or retrieves the top and bottom margin heights before displaying the text in a frame.
+     * @deprecated
+     */
+    marginHeight: string;
+    /**
+     * Sets or retrieves the left and right margin widths before displaying the text in a frame.
+     * @deprecated
+     */
+    marginWidth: string;
+    /** Sets or retrieves the frame name. */
+    name: string;
+    referrerPolicy: ReferrerPolicy;
+    readonly sandbox: DOMTokenList;
+    /**
+     * Sets or retrieves whether the frame can be scrolled.
+     * @deprecated
+     */
+    scrolling: string;
+    /** Sets or retrieves a URL to be loaded by the object. */
+    src: string;
+    /** Sets or retrives the content of the page that is to contain. */
+    srcdoc: string;
+    /** Sets or retrieves the width of the object. */
+    width: string;
+    getSVGDocument(): Document | null;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLIFrameElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLIFrameElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLIFrameElement: {
+    prototype: HTMLIFrameElement;
+    new(): HTMLIFrameElement;
+};
+
+/** Provides special properties and methods for manipulating <img> elements. */
+interface HTMLImageElement extends HTMLElement {
+    /**
+     * Sets or retrieves how the object is aligned with adjacent text.
+     * @deprecated
+     */
+    align: string;
+    /** Sets or retrieves a text alternative to the graphic. */
+    alt: string;
+    /**
+     * Specifies the properties of a border drawn around an object.
+     * @deprecated
+     */
+    border: string;
+    /** Retrieves whether the object is fully loaded. */
+    readonly complete: boolean;
+    crossOrigin: string | null;
+    readonly currentSrc: string;
+    decoding: "async" | "sync" | "auto";
+    /** Sets or retrieves the height of the object. */
+    height: number;
+    /**
+     * Sets or retrieves the width of the border to draw around the object.
+     * @deprecated
+     */
+    hspace: number;
+    /** Sets or retrieves whether the image is a server-side image map. */
+    isMap: boolean;
+    /** Sets or retrieves the policy for loading image elements that are outside the viewport. */
+    loading: "eager" | "lazy";
+    /**
+     * Sets or retrieves a Uniform Resource Identifier (URI) to a long description of the object.
+     * @deprecated
+     */
+    longDesc: string;
+    /** @deprecated */
+    lowsrc: string;
+    /**
+     * Sets or retrieves the name of the object.
+     * @deprecated
+     */
+    name: string;
+    /** The original height of the image resource before sizing. */
+    readonly naturalHeight: number;
+    /** The original width of the image resource before sizing. */
+    readonly naturalWidth: number;
+    referrerPolicy: string;
+    sizes: string;
+    /** The address or URL of the a media resource that is to be considered. */
+    src: string;
+    srcset: string;
+    /** Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map. */
+    useMap: string;
+    /**
+     * Sets or retrieves the vertical margin for the object.
+     * @deprecated
+     */
+    vspace: number;
+    /** Sets or retrieves the width of the object. */
+    width: number;
+    readonly x: number;
+    readonly y: number;
+    decode(): Promise<void>;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLImageElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLImageElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLImageElement: {
+    prototype: HTMLImageElement;
+    new(): HTMLImageElement;
+};
+
+/** Provides special properties and methods for manipulating the options, layout, and presentation of <input> elements. */
+interface HTMLInputElement extends HTMLElement {
+    /** Sets or retrieves a comma-separated list of content types. */
+    accept: string;
+    /**
+     * Sets or retrieves how the object is aligned with adjacent text.
+     * @deprecated
+     */
+    align: string;
+    /** Sets or retrieves a text alternative to the graphic. */
+    alt: string;
+    /** Specifies whether autocomplete is applied to an editable text field. */
+    autocomplete: string;
+    capture: string;
+    /** Sets or retrieves the state of the check box or radio button. */
+    checked: boolean;
+    /** Sets or retrieves the state of the check box or radio button. */
+    defaultChecked: boolean;
+    /** Sets or retrieves the initial contents of the object. */
+    defaultValue: string;
+    dirName: string;
+    disabled: boolean;
+    /** Returns a FileList object on a file type input object. */
+    files: FileList | null;
+    /** Retrieves a reference to the form that the object is embedded in. */
+    readonly form: HTMLFormElement | null;
+    /** Overrides the action attribute (where the data on a form is sent) on the parent form element. */
+    formAction: string;
+    /** Used to override the encoding (formEnctype attribute) specified on the form element. */
+    formEnctype: string;
+    /** Overrides the submit method attribute previously specified on a form element. */
+    formMethod: string;
+    /** Overrides any validation or required attributes on a form or form elements to allow it to be submitted without validation. This can be used to create a "save draft"-type submit option. */
+    formNoValidate: boolean;
+    /** Overrides the target attribute on a form element. */
+    formTarget: string;
+    /** Sets or retrieves the height of the object. */
+    height: number;
+    /** When set, overrides the rendering of checkbox controls so that the current value is not visible. */
+    indeterminate: boolean;
+    readonly labels: NodeListOf<HTMLLabelElement> | null;
+    /** Specifies the ID of a pre-defined datalist of options for an input element. */
+    readonly list: HTMLDataListElement | null;
+    /** Defines the maximum acceptable value for an input element with type="number".When used with the min and step attributes, lets you control the range and increment (such as only even numbers) that the user can enter into an input field. */
+    max: string;
+    /** Sets or retrieves the maximum number of characters that the user can enter in a text control. */
+    maxLength: number;
+    /** Defines the minimum acceptable value for an input element with type="number". When used with the max and step attributes, lets you control the range and increment (such as even numbers only) that the user can enter into an input field. */
+    min: string;
+    minLength: number;
+    /** Sets or retrieves the Boolean value indicating whether multiple items can be selected from a list. */
+    multiple: boolean;
+    /** Sets or retrieves the name of the object. */
+    name: string;
+    /** Gets or sets a string containing a regular expression that the user's input must match. */
+    pattern: string;
+    /** Gets or sets a text string that is displayed in an input field as a hint or prompt to users as the format or type of information they need to enter.The text appears in an input field until the user puts focus on the field. */
+    placeholder: string;
+    readOnly: boolean;
+    /** When present, marks an element that can't be submitted without a value. */
+    required: boolean;
+    selectionDirection: "forward" | "backward" | "none" | null;
+    /** Gets or sets the end position or offset of a text selection. */
+    selectionEnd: number | null;
+    /** Gets or sets the starting position or offset of a text selection. */
+    selectionStart: number | null;
+    size: number;
+    /** The address or URL of the a media resource that is to be considered. */
+    src: string;
+    /** Defines an increment or jump between values that you want to allow the user to enter. When used with the max and min attributes, lets you control the range and increment (for example, allow only even numbers) that the user can enter into an input field. */
+    step: string;
+    /** Returns the content type of the object. */
+    type: string;
+    /**
+     * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.
+     * @deprecated
+     */
+    useMap: string;
+    /** Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting. */
+    readonly validationMessage: string;
+    /** Returns a  ValidityState object that represents the validity states of an element. */
+    readonly validity: ValidityState;
+    /** Returns the value of the data at the cursor's current position. */
+    value: string;
+    /** Returns a Date object representing the form control's value, if applicable; otherwise, returns null. Can be set, to change the value. Throws an "InvalidStateError" DOMException if the control isn't date- or time-based. */
+    valueAsDate: Date | null;
+    /** Returns the input field value as a number. */
+    valueAsNumber: number;
+    readonly webkitEntries: ReadonlyArray<FileSystemEntry>;
+    webkitdirectory: boolean;
+    /** Sets or retrieves the width of the object. */
+    width: number;
+    /** Returns whether an element will successfully validate based on forms validation rules and constraints. */
+    readonly willValidate: boolean;
+    /** Returns whether a form will validate when it is submitted, without having to submit it. */
+    checkValidity(): boolean;
+    reportValidity(): boolean;
+    /** Makes the selection equal to the current object. */
+    select(): void;
+    /**
+     * Sets a custom error message that is displayed when a form is submitted.
+     * @param error Sets a custom error message that is displayed when a form is submitted.
+     */
+    setCustomValidity(error: string): void;
+    setRangeText(replacement: string): void;
+    setRangeText(replacement: string, start: number, end: number, selectionMode?: SelectionMode): void;
+    /**
+     * Sets the start and end positions of a selection in a text field.
+     * @param start The offset into the text field for the start of the selection.
+     * @param end The offset into the text field for the end of the selection.
+     * @param direction The direction in which the selection is performed.
+     */
+    setSelectionRange(start: number | null, end: number | null, direction?: "forward" | "backward" | "none"): void;
+    showPicker(): void;
+    /**
+     * Decrements a range input control's value by the value given by the Step attribute. If the optional parameter is used, it will decrement the input control's step value multiplied by the parameter's value.
+     * @param n Value to decrement the value by.
+     */
+    stepDown(n?: number): void;
+    /**
+     * Increments a range input control's value by the value given by the Step attribute. If the optional parameter is used, will increment the input control's value by that value.
+     * @param n Value to increment the value by.
+     */
+    stepUp(n?: number): void;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLInputElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLInputElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLInputElement: {
+    prototype: HTMLInputElement;
+    new(): HTMLInputElement;
+};
+
+/** Exposes specific properties and methods (beyond those defined by regular HTMLElement interface it also has available to it by inheritance) for manipulating list elements. */
+interface HTMLLIElement extends HTMLElement {
+    /** @deprecated */
+    type: string;
+    /** Sets or retrieves the value of a list item. */
+    value: number;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLIElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLIElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLLIElement: {
+    prototype: HTMLLIElement;
+    new(): HTMLLIElement;
+};
+
+/** Gives access to properties specific to <label> elements. It inherits methods and properties from the base HTMLElement interface. */
+interface HTMLLabelElement extends HTMLElement {
+    /** Returns the form control that is associated with this element. */
+    readonly control: HTMLElement | null;
+    /** Retrieves a reference to the form that the object is embedded in. */
+    readonly form: HTMLFormElement | null;
+    /** Sets or retrieves the object to which the given label object is assigned. */
+    htmlFor: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLabelElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLabelElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLLabelElement: {
+    prototype: HTMLLabelElement;
+    new(): HTMLLabelElement;
+};
+
+/** The HTMLLegendElement is an interface allowing to access properties of the <legend> elements. It inherits properties and methods from the HTMLElement interface. */
+interface HTMLLegendElement extends HTMLElement {
+    /** @deprecated */
+    align: string;
+    /** Retrieves a reference to the form that the object is embedded in. */
+    readonly form: HTMLFormElement | null;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLegendElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLegendElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLLegendElement: {
+    prototype: HTMLLegendElement;
+    new(): HTMLLegendElement;
+};
+
+/** Reference information for external resources and the relationship of those resources to a document and vice-versa. This object inherits all of the properties and methods of the HTMLElement interface. */
+interface HTMLLinkElement extends HTMLElement, LinkStyle {
+    as: string;
+    /**
+     * Sets or retrieves the character set used to encode the object.
+     * @deprecated
+     */
+    charset: string;
+    crossOrigin: string | null;
+    disabled: boolean;
+    /** Sets or retrieves a destination URL or an anchor point. */
+    href: string;
+    /** Sets or retrieves the language code of the object. */
+    hreflang: string;
+    imageSizes: string;
+    imageSrcset: string;
+    integrity: string;
+    /** Sets or retrieves the media type. */
+    media: string;
+    referrerPolicy: string;
+    /** Sets or retrieves the relationship between the object and the destination of the link. */
+    rel: string;
+    readonly relList: DOMTokenList;
+    /**
+     * Sets or retrieves the relationship between the object and the destination of the link.
+     * @deprecated
+     */
+    rev: string;
+    readonly sizes: DOMTokenList;
+    /**
+     * Sets or retrieves the window or frame at which to target content.
+     * @deprecated
+     */
+    target: string;
+    /** Sets or retrieves the MIME type of the object. */
+    type: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLinkElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLinkElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLLinkElement: {
+    prototype: HTMLLinkElement;
+    new(): HTMLLinkElement;
+};
+
+/** Provides special properties and methods (beyond those of the regular object HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of map elements. */
+interface HTMLMapElement extends HTMLElement {
+    /** Retrieves a collection of the area objects defined for the given map object. */
+    readonly areas: HTMLCollection;
+    /** Sets or retrieves the name of the object. */
+    name: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMapElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMapElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLMapElement: {
+    prototype: HTMLMapElement;
+    new(): HTMLMapElement;
+};
+
+/**
+ * Provides methods to manipulate <marquee> elements.
+ * @deprecated
+ */
+interface HTMLMarqueeElement extends HTMLElement {
+    /** @deprecated */
+    behavior: string;
+    /** @deprecated */
+    bgColor: string;
+    /** @deprecated */
+    direction: string;
+    /** @deprecated */
+    height: string;
+    /** @deprecated */
+    hspace: number;
+    /** @deprecated */
+    loop: number;
+    /** @deprecated */
+    scrollAmount: number;
+    /** @deprecated */
+    scrollDelay: number;
+    /** @deprecated */
+    trueSpeed: boolean;
+    /** @deprecated */
+    vspace: number;
+    /** @deprecated */
+    width: string;
+    /** @deprecated */
+    start(): void;
+    /** @deprecated */
+    stop(): void;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMarqueeElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMarqueeElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+/** @deprecated */
+declare var HTMLMarqueeElement: {
+    prototype: HTMLMarqueeElement;
+    new(): HTMLMarqueeElement;
+};
+
+interface HTMLMediaElementEventMap extends HTMLElementEventMap {
+    "encrypted": MediaEncryptedEvent;
+    "waitingforkey": Event;
+}
+
+/** Adds to HTMLElement the properties and methods needed to support basic media-related capabilities\xA0that are\xA0common to audio and video. */
+interface HTMLMediaElement extends HTMLElement {
+    /** Gets or sets a value that indicates whether to start playing the media automatically. */
+    autoplay: boolean;
+    /** Gets a collection of buffered time ranges. */
+    readonly buffered: TimeRanges;
+    /** Gets or sets a flag that indicates whether the client provides a set of controls for the media (in case the developer does not include controls for the player). */
+    controls: boolean;
+    crossOrigin: string | null;
+    /** Gets the address or URL of the current media resource that is selected by IHTMLMediaElement. */
+    readonly currentSrc: string;
+    /** Gets or sets the current playback position, in seconds. */
+    currentTime: number;
+    defaultMuted: boolean;
+    /** Gets or sets the default playback rate when the user is not using fast forward or reverse for a video or audio resource. */
+    defaultPlaybackRate: number;
+    disableRemotePlayback: boolean;
+    /** Returns the duration in seconds of the current media resource. A NaN value is returned if duration is not available, or Infinity if the media resource is streaming. */
+    readonly duration: number;
+    /** Gets information about whether the playback has ended or not. */
+    readonly ended: boolean;
+    /** Returns an object representing the current error state of the audio or video element. */
+    readonly error: MediaError | null;
+    /** Gets or sets a flag to specify whether playback should restart after it completes. */
+    loop: boolean;
+    /** Available only in secure contexts. */
+    readonly mediaKeys: MediaKeys | null;
+    /** Gets or sets a flag that indicates whether the audio (either audio or the audio track on video media) is muted. */
+    muted: boolean;
+    /** Gets the current network activity for the element. */
+    readonly networkState: number;
+    onencrypted: ((this: HTMLMediaElement, ev: MediaEncryptedEvent) => any) | null;
+    onwaitingforkey: ((this: HTMLMediaElement, ev: Event) => any) | null;
+    /** Gets a flag that specifies whether playback is paused. */
+    readonly paused: boolean;
+    /** Gets or sets the current rate of speed for the media resource to play. This speed is expressed as a multiple of the normal speed of the media resource. */
+    playbackRate: number;
+    /** Gets TimeRanges for the current media resource that has been played. */
+    readonly played: TimeRanges;
+    /** Gets or sets a value indicating what data should be preloaded, if any. */
+    preload: "none" | "metadata" | "auto" | "";
+    preservesPitch: boolean;
+    readonly readyState: number;
+    readonly remote: RemotePlayback;
+    /** Returns a TimeRanges object that represents the ranges of the current media resource that can be seeked. */
+    readonly seekable: TimeRanges;
+    /** Gets a flag that indicates whether the client is currently moving to a new playback position in the media resource. */
+    readonly seeking: boolean;
+    /** The address or URL of the a media resource that is to be considered. */
+    src: string;
+    srcObject: MediaProvider | null;
+    readonly textTracks: TextTrackList;
+    /** Gets or sets the volume level for audio portions of the media element. */
+    volume: number;
+    addTextTrack(kind: TextTrackKind, label?: string, language?: string): TextTrack;
+    /** Returns a string that specifies whether the client can play a given media resource type. */
+    canPlayType(type: string): CanPlayTypeResult;
+    fastSeek(time: number): void;
+    /** Resets the audio or video object and loads a new media resource. */
+    load(): void;
+    /** Pauses the current playback and sets paused to TRUE. This can be used to test whether the media is playing or paused. You can also use the pause or play events to tell whether the media is playing or not. */
+    pause(): void;
+    /** Loads and starts playback of a media resource. */
+    play(): Promise<void>;
+    /** Available only in secure contexts. */
+    setMediaKeys(mediaKeys: MediaKeys | null): Promise<void>;
+    readonly NETWORK_EMPTY: 0;
+    readonly NETWORK_IDLE: 1;
+    readonly NETWORK_LOADING: 2;
+    readonly NETWORK_NO_SOURCE: 3;
+    readonly HAVE_NOTHING: 0;
+    readonly HAVE_METADATA: 1;
+    readonly HAVE_CURRENT_DATA: 2;
+    readonly HAVE_FUTURE_DATA: 3;
+    readonly HAVE_ENOUGH_DATA: 4;
+    addEventListener<K extends keyof HTMLMediaElementEventMap>(type: K, listener: (this: HTMLMediaElement, ev: HTMLMediaElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLMediaElementEventMap>(type: K, listener: (this: HTMLMediaElement, ev: HTMLMediaElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLMediaElement: {
+    prototype: HTMLMediaElement;
+    new(): HTMLMediaElement;
+    readonly NETWORK_EMPTY: 0;
+    readonly NETWORK_IDLE: 1;
+    readonly NETWORK_LOADING: 2;
+    readonly NETWORK_NO_SOURCE: 3;
+    readonly HAVE_NOTHING: 0;
+    readonly HAVE_METADATA: 1;
+    readonly HAVE_CURRENT_DATA: 2;
+    readonly HAVE_FUTURE_DATA: 3;
+    readonly HAVE_ENOUGH_DATA: 4;
+};
+
+interface HTMLMenuElement extends HTMLElement {
+    /** @deprecated */
+    compact: boolean;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMenuElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMenuElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLMenuElement: {
+    prototype: HTMLMenuElement;
+    new(): HTMLMenuElement;
+};
+
+/** Contains descriptive metadata about a document. It\xA0inherits all of the properties and methods described in the HTMLElement interface. */
+interface HTMLMetaElement extends HTMLElement {
+    /** Gets or sets meta-information to associate with httpEquiv or name. */
+    content: string;
+    /** Gets or sets information used to bind the value of a content attribute of a meta element to an HTTP response header. */
+    httpEquiv: string;
+    media: string;
+    /** Sets or retrieves the value specified in the content attribute of the meta object. */
+    name: string;
+    /**
+     * Sets or retrieves a scheme to be used in interpreting the value of a property specified for the object.
+     * @deprecated
+     */
+    scheme: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMetaElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMetaElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLMetaElement: {
+    prototype: HTMLMetaElement;
+    new(): HTMLMetaElement;
+};
+
+/** The HTML <meter> elements expose the HTMLMeterElement interface, which provides special properties and methods (beyond the HTMLElement object interface they also have available to them by inheritance) for manipulating the layout and presentation of <meter> elements. */
+interface HTMLMeterElement extends HTMLElement {
+    high: number;
+    readonly labels: NodeListOf<HTMLLabelElement>;
+    low: number;
+    max: number;
+    min: number;
+    optimum: number;
+    value: number;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMeterElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMeterElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLMeterElement: {
+    prototype: HTMLMeterElement;
+    new(): HTMLMeterElement;
+};
+
+/** Provides special properties (beyond the regular methods and properties available through the HTMLElement interface they also have available to them by inheritance) for manipulating modification elements, that is <del> and <ins>. */
+interface HTMLModElement extends HTMLElement {
+    /** Sets or retrieves reference information about the object. */
+    cite: string;
+    /** Sets or retrieves the date and time of a modification to the object. */
+    dateTime: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLModElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLModElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLModElement: {
+    prototype: HTMLModElement;
+    new(): HTMLModElement;
+};
+
+/** Provides special properties (beyond those defined on the regular HTMLElement interface it also has available to it by inheritance) for manipulating ordered list elements. */
+interface HTMLOListElement extends HTMLElement {
+    /** @deprecated */
+    compact: boolean;
+    reversed: boolean;
+    /** The starting number. */
+    start: number;
+    type: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLOListElement: {
+    prototype: HTMLOListElement;
+    new(): HTMLOListElement;
+};
+
+/** Provides special properties and methods (beyond those on the HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of <object> element, representing external resources. */
+interface HTMLObjectElement extends HTMLElement {
+    /** @deprecated */
+    align: string;
+    /**
+     * Sets or retrieves a character string that can be used to implement your own archive functionality for the object.
+     * @deprecated
+     */
+    archive: string;
+    /** @deprecated */
+    border: string;
+    /**
+     * Sets or retrieves the URL of the file containing the compiled Java class.
+     * @deprecated
+     */
+    code: string;
+    /**
+     * Sets or retrieves the URL of the component.
+     * @deprecated
+     */
+    codeBase: string;
+    /**
+     * Sets or retrieves the Internet media type for the code associated with the object.
+     * @deprecated
+     */
+    codeType: string;
+    /** Retrieves the document object of the page or frame. */
+    readonly contentDocument: Document | null;
+    readonly contentWindow: WindowProxy | null;
+    /** Sets or retrieves the URL that references the data of the object. */
+    data: string;
+    /** @deprecated */
+    declare: boolean;
+    /** Retrieves a reference to the form that the object is embedded in. */
+    readonly form: HTMLFormElement | null;
+    /** Sets or retrieves the height of the object. */
+    height: string;
+    /** @deprecated */
+    hspace: number;
+    /** Sets or retrieves the name of the object. */
+    name: string;
+    /**
+     * Sets or retrieves a message to be displayed while an object is loading.
+     * @deprecated
+     */
+    standby: string;
+    /** Sets or retrieves the MIME type of the object. */
+    type: string;
+    /** Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map. */
+    useMap: string;
+    /** Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting. */
+    readonly validationMessage: string;
+    /** Returns a  ValidityState object that represents the validity states of an element. */
+    readonly validity: ValidityState;
+    /** @deprecated */
+    vspace: number;
+    /** Sets or retrieves the width of the object. */
+    width: string;
+    /** Returns whether an element will successfully validate based on forms validation rules and constraints. */
+    readonly willValidate: boolean;
+    /** Returns whether a form will validate when it is submitted, without having to submit it. */
+    checkValidity(): boolean;
+    getSVGDocument(): Document | null;
+    reportValidity(): boolean;
+    /**
+     * Sets a custom error message that is displayed when a form is submitted.
+     * @param error Sets a custom error message that is displayed when a form is submitted.
+     */
+    setCustomValidity(error: string): void;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLObjectElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLObjectElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLObjectElement: {
+    prototype: HTMLObjectElement;
+    new(): HTMLObjectElement;
+};
+
+/** Provides special properties and methods (beyond the regular HTMLElement object interface they also have available to them by inheritance) for manipulating the layout and presentation of <optgroup> elements. */
+interface HTMLOptGroupElement extends HTMLElement {
+    disabled: boolean;
+    /** Sets or retrieves a value that you can use to implement your own label functionality for the object. */
+    label: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOptGroupElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOptGroupElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLOptGroupElement: {
+    prototype: HTMLOptGroupElement;
+    new(): HTMLOptGroupElement;
+};
+
+/** <option> elements and inherits all classes and methods of the HTMLElement interface. */
+interface HTMLOptionElement extends HTMLElement {
+    /** Sets or retrieves the status of an option. */
+    defaultSelected: boolean;
+    disabled: boolean;
+    /** Retrieves a reference to the form that the object is embedded in. */
+    readonly form: HTMLFormElement | null;
+    /** Sets or retrieves the ordinal position of an option in a list box. */
+    readonly index: number;
+    /** Sets or retrieves a value that you can use to implement your own label functionality for the object. */
+    label: string;
+    /** Sets or retrieves whether the option in the list box is the default item. */
+    selected: boolean;
+    /** Sets or retrieves the text string specified by the option tag. */
+    text: string;
+    /** Sets or retrieves the value which is returned to the server when the form control is submitted. */
+    value: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOptionElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOptionElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLOptionElement: {
+    prototype: HTMLOptionElement;
+    new(): HTMLOptionElement;
+};
+
+/** HTMLOptionsCollection is an interface representing a collection of HTML option elements (in document order) and offers methods and properties for traversing the list as well as optionally altering its items. This type is returned solely by the "options" property of select. */
+interface HTMLOptionsCollection extends HTMLCollectionOf<HTMLOptionElement> {
+    /**
+     * Returns the number of elements in the collection.
+     *
+     * When set to a smaller number, truncates the number of option elements in the corresponding container.
+     *
+     * When set to a greater number, adds new blank option elements to that container.
+     */
+    length: number;
+    /**
+     * Returns the index of the first selected item, if any, or \u22121 if there is no selected item.
+     *
+     * Can be set, to change the selection.
+     */
+    selectedIndex: number;
+    /**
+     * Inserts element before the node given by before.
+     *
+     * The before argument can be a number, in which case element is inserted before the item with that number, or an element from the collection, in which case element is inserted before that element.
+     *
+     * If before is omitted, null, or a number out of range, then element will be added at the end of the list.
+     *
+     * This method will throw a "HierarchyRequestError" DOMException if element is an ancestor of the element into which it is to be inserted.
+     */
+    add(element: HTMLOptionElement | HTMLOptGroupElement, before?: HTMLElement | number | null): void;
+    /** Removes the item with index index from the collection. */
+    remove(index: number): void;
+}
+
+declare var HTMLOptionsCollection: {
+    prototype: HTMLOptionsCollection;
+    new(): HTMLOptionsCollection;
+};
+
+interface HTMLOrSVGElement {
+    autofocus: boolean;
+    readonly dataset: DOMStringMap;
+    nonce?: string;
+    tabIndex: number;
+    blur(): void;
+    focus(options?: FocusOptions): void;
+}
+
+/** Provides properties and methods (beyond those inherited from HTMLElement) for manipulating the layout and presentation of <output> elements. */
+interface HTMLOutputElement extends HTMLElement {
+    defaultValue: string;
+    readonly form: HTMLFormElement | null;
+    readonly htmlFor: DOMTokenList;
+    readonly labels: NodeListOf<HTMLLabelElement>;
+    name: string;
+    /** Returns the string "output". */
+    readonly type: string;
+    readonly validationMessage: string;
+    readonly validity: ValidityState;
+    /**
+     * Returns the element's current value.
+     *
+     * Can be set, to change the value.
+     */
+    value: string;
+    readonly willValidate: boolean;
+    checkValidity(): boolean;
+    reportValidity(): boolean;
+    setCustomValidity(error: string): void;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOutputElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOutputElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLOutputElement: {
+    prototype: HTMLOutputElement;
+    new(): HTMLOutputElement;
+};
+
+/** Provides special properties (beyond those of the regular HTMLElement object interface it inherits) for manipulating <p> elements. */
+interface HTMLParagraphElement extends HTMLElement {
+    /**
+     * Sets or retrieves how the object is aligned with adjacent text.
+     * @deprecated
+     */
+    align: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLParagraphElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLParagraphElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLParagraphElement: {
+    prototype: HTMLParagraphElement;
+    new(): HTMLParagraphElement;
+};
+
+/**
+ * Provides special properties (beyond those of the regular HTMLElement object interface it inherits) for manipulating <param> elements, representing a pair of a key and a value that acts as a parameter for an <object> element.
+ * @deprecated
+ */
+interface HTMLParamElement extends HTMLElement {
+    /**
+     * Sets or retrieves the name of an input parameter for an element.
+     * @deprecated
+     */
+    name: string;
+    /**
+     * Sets or retrieves the content type of the resource designated by the value attribute.
+     * @deprecated
+     */
+    type: string;
+    /**
+     * Sets or retrieves the value of an input parameter for an element.
+     * @deprecated
+     */
+    value: string;
+    /**
+     * Sets or retrieves the data type of the value attribute.
+     * @deprecated
+     */
+    valueType: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLParamElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLParamElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+/** @deprecated */
+declare var HTMLParamElement: {
+    prototype: HTMLParamElement;
+    new(): HTMLParamElement;
+};
+
+/** A <picture> HTML element. It doesn't implement specific properties or methods. */
+interface HTMLPictureElement extends HTMLElement {
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLPictureElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLPictureElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLPictureElement: {
+    prototype: HTMLPictureElement;
+    new(): HTMLPictureElement;
+};
+
+/** Exposes specific properties and methods (beyond those of the HTMLElement interface it also has available to it by inheritance) for manipulating a block of preformatted text (<pre>). */
+interface HTMLPreElement extends HTMLElement {
+    /**
+     * Sets or gets a value that you can use to implement your own width functionality for the object.
+     * @deprecated
+     */
+    width: number;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLPreElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLPreElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLPreElement: {
+    prototype: HTMLPreElement;
+    new(): HTMLPreElement;
+};
+
+/** Provides special properties and methods (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of <progress> elements. */
+interface HTMLProgressElement extends HTMLElement {
+    readonly labels: NodeListOf<HTMLLabelElement>;
+    /** Defines the maximum, or "done" value for a progress element. */
+    max: number;
+    /** Returns the quotient of value/max when the value attribute is set (determinate progress bar), or -1 when the value attribute is missing (indeterminate progress bar). */
+    readonly position: number;
+    /** Sets or gets the current value of a progress element. The value must be a non-negative number between 0 and the max value. */
+    value: number;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLProgressElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLProgressElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLProgressElement: {
+    prototype: HTMLProgressElement;
+    new(): HTMLProgressElement;
+};
+
+/** Provides special properties and methods (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating quoting elements, like <blockquote> and <q>, but not the <cite> element. */
+interface HTMLQuoteElement extends HTMLElement {
+    /** Sets or retrieves reference information about the object. */
+    cite: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLQuoteElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLQuoteElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLQuoteElement: {
+    prototype: HTMLQuoteElement;
+    new(): HTMLQuoteElement;
+};
+
+/** HTML <script> elements expose the HTMLScriptElement interface, which provides special properties and methods for manipulating the behavior and execution of <script> elements (beyond the inherited HTMLElement interface). */
+interface HTMLScriptElement extends HTMLElement {
+    async: boolean;
+    /**
+     * Sets or retrieves the character set used to encode the object.
+     * @deprecated
+     */
+    charset: string;
+    crossOrigin: string | null;
+    /** Sets or retrieves the status of the script. */
+    defer: boolean;
+    /**
+     * Sets or retrieves the event for which the script is written.
+     * @deprecated
+     */
+    event: string;
+    /**
+     * Sets or retrieves the object that is bound to the event script.
+     * @deprecated
+     */
+    htmlFor: string;
+    integrity: string;
+    noModule: boolean;
+    referrerPolicy: string;
+    /** Retrieves the URL to an external file that contains the source code or data. */
+    src: string;
+    /** Retrieves or sets the text of the object as a string. */
+    text: string;
+    /** Sets or retrieves the MIME type for the associated scripting engine. */
+    type: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLScriptElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLScriptElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLScriptElement: {
+    prototype: HTMLScriptElement;
+    new(): HTMLScriptElement;
+    supports(type: string): boolean;
+};
+
+/** A <select> HTML Element. These elements also share all of the properties and methods of other HTML elements via the HTMLElement interface. */
+interface HTMLSelectElement extends HTMLElement {
+    autocomplete: string;
+    disabled: boolean;
+    /** Retrieves a reference to the form that the object is embedded in. */
+    readonly form: HTMLFormElement | null;
+    readonly labels: NodeListOf<HTMLLabelElement>;
+    /** Sets or retrieves the number of objects in a collection. */
+    length: number;
+    /** Sets or retrieves the Boolean value indicating whether multiple items can be selected from a list. */
+    multiple: boolean;
+    /** Sets or retrieves the name of the object. */
+    name: string;
+    /** Returns an HTMLOptionsCollection of the list of options. */
+    readonly options: HTMLOptionsCollection;
+    /** When present, marks an element that can't be submitted without a value. */
+    required: boolean;
+    /** Sets or retrieves the index of the selected option in a select object. */
+    selectedIndex: number;
+    readonly selectedOptions: HTMLCollectionOf<HTMLOptionElement>;
+    /** Sets or retrieves the number of rows in the list box. */
+    size: number;
+    /** Retrieves the type of select control based on the value of the MULTIPLE attribute. */
+    readonly type: string;
+    /** Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting. */
+    readonly validationMessage: string;
+    /** Returns a  ValidityState object that represents the validity states of an element. */
+    readonly validity: ValidityState;
+    /** Sets or retrieves the value which is returned to the server when the form control is submitted. */
+    value: string;
+    /** Returns whether an element will successfully validate based on forms validation rules and constraints. */
+    readonly willValidate: boolean;
+    /**
+     * Adds an element to the areas, controlRange, or options collection.
+     * @param element Variant of type Number that specifies the index position in the collection where the element is placed. If no value is given, the method places the element at the end of the collection.
+     * @param before Variant of type Object that specifies an element to insert before, or null to append the object to the collection.
+     */
+    add(element: HTMLOptionElement | HTMLOptGroupElement, before?: HTMLElement | number | null): void;
+    /** Returns whether a form will validate when it is submitted, without having to submit it. */
+    checkValidity(): boolean;
+    /**
+     * Retrieves a select object or an object from an options collection.
+     * @param name Variant of type Number or String that specifies the object or collection to retrieve. If this parameter is an integer, it is the zero-based index of the object. If this parameter is a string, all objects with matching name or id properties are retrieved, and a collection is returned if more than one match is made.
+     * @param index Variant of type Number that specifies the zero-based index of the object to retrieve when a collection is returned.
+     */
+    item(index: number): HTMLOptionElement | null;
+    /**
+     * Retrieves a select object or an object from an options collection.
+     * @param namedItem A String that specifies the name or id property of the object to retrieve. A collection is returned if more than one match is made.
+     */
+    namedItem(name: string): HTMLOptionElement | null;
+    /**
+     * Removes an element from the collection.
+     * @param index Number that specifies the zero-based index of the element to remove from the collection.
+     */
+    remove(): void;
+    remove(index: number): void;
+    reportValidity(): boolean;
+    /**
+     * Sets a custom error message that is displayed when a form is submitted.
+     * @param error Sets a custom error message that is displayed when a form is submitted.
+     */
+    setCustomValidity(error: string): void;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSelectElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSelectElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+    [name: number]: HTMLOptionElement | HTMLOptGroupElement;
+}
+
+declare var HTMLSelectElement: {
+    prototype: HTMLSelectElement;
+    new(): HTMLSelectElement;
+};
+
+interface HTMLSlotElement extends HTMLElement {
+    name: string;
+    assign(...nodes: (Element | Text)[]): void;
+    assignedElements(options?: AssignedNodesOptions): Element[];
+    assignedNodes(options?: AssignedNodesOptions): Node[];
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSlotElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSlotElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLSlotElement: {
+    prototype: HTMLSlotElement;
+    new(): HTMLSlotElement;
+};
+
+/** Provides special properties (beyond the regular HTMLElement object interface it also has available to it by inheritance) for manipulating <source> elements. */
+interface HTMLSourceElement extends HTMLElement {
+    height: number;
+    /** Gets or sets the intended media type of the media source. */
+    media: string;
+    sizes: string;
+    /** The address or URL of the a media resource that is to be considered. */
+    src: string;
+    srcset: string;
+    /** Gets or sets the MIME type of a media resource. */
+    type: string;
+    width: number;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSourceElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSourceElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLSourceElement: {
+    prototype: HTMLSourceElement;
+    new(): HTMLSourceElement;
+};
+
+/** A <span> element and derives from the HTMLElement interface, but without implementing any additional properties or methods. */
+interface HTMLSpanElement extends HTMLElement {
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSpanElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSpanElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLSpanElement: {
+    prototype: HTMLSpanElement;
+    new(): HTMLSpanElement;
+};
+
+/** A <style> element. It inherits properties and methods from its parent, HTMLElement, and from LinkStyle. */
+interface HTMLStyleElement extends HTMLElement, LinkStyle {
+    /** Enables or disables the style sheet. */
+    disabled: boolean;
+    /** Sets or retrieves the media type. */
+    media: string;
+    /**
+     * Retrieves the CSS language in which the style sheet is written.
+     * @deprecated
+     */
+    type: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLStyleElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLStyleElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLStyleElement: {
+    prototype: HTMLStyleElement;
+    new(): HTMLStyleElement;
+};
+
+/** Special properties (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating table caption elements. */
+interface HTMLTableCaptionElement extends HTMLElement {
+    /**
+     * Sets or retrieves the alignment of the caption or legend.
+     * @deprecated
+     */
+    align: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableCaptionElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableCaptionElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLTableCaptionElement: {
+    prototype: HTMLTableCaptionElement;
+    new(): HTMLTableCaptionElement;
+};
+
+/** Provides special properties and methods (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of table cells, either header or data cells, in an HTML document. */
+interface HTMLTableCellElement extends HTMLElement {
+    /** Sets or retrieves abbreviated text for the object. */
+    abbr: string;
+    /**
+     * Sets or retrieves how the object is aligned with adjacent text.
+     * @deprecated
+     */
+    align: string;
+    /**
+     * Sets or retrieves a comma-delimited list of conceptual categories associated with the object.
+     * @deprecated
+     */
+    axis: string;
+    /** @deprecated */
+    bgColor: string;
+    /** Retrieves the position of the object in the cells collection of a row. */
+    readonly cellIndex: number;
+    /** @deprecated */
+    ch: string;
+    /** @deprecated */
+    chOff: string;
+    /** Sets or retrieves the number columns in the table that the object should span. */
+    colSpan: number;
+    /** Sets or retrieves a list of header cells that provide information for the object. */
+    headers: string;
+    /**
+     * Sets or retrieves the height of the object.
+     * @deprecated
+     */
+    height: string;
+    /**
+     * Sets or retrieves whether the browser automatically performs wordwrap.
+     * @deprecated
+     */
+    noWrap: boolean;
+    /** Sets or retrieves how many rows in a table the cell should span. */
+    rowSpan: number;
+    /** Sets or retrieves the group of cells in a table to which the object's information applies. */
+    scope: string;
+    /** @deprecated */
+    vAlign: string;
+    /**
+     * Sets or retrieves the width of the object.
+     * @deprecated
+     */
+    width: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableCellElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableCellElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLTableCellElement: {
+    prototype: HTMLTableCellElement;
+    new(): HTMLTableCellElement;
+};
+
+/** Provides special properties (beyond the HTMLElement interface it also has available to it inheritance) for manipulating single or grouped table column elements. */
+interface HTMLTableColElement extends HTMLElement {
+    /**
+     * Sets or retrieves the alignment of the object relative to the display or table.
+     * @deprecated
+     */
+    align: string;
+    /** @deprecated */
+    ch: string;
+    /** @deprecated */
+    chOff: string;
+    /** Sets or retrieves the number of columns in the group. */
+    span: number;
+    /** @deprecated */
+    vAlign: string;
+    /**
+     * Sets or retrieves the width of the object.
+     * @deprecated
+     */
+    width: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableColElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableColElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLTableColElement: {
+    prototype: HTMLTableColElement;
+    new(): HTMLTableColElement;
+};
+
+/** @deprecated prefer HTMLTableCellElement */
+interface HTMLTableDataCellElement extends HTMLTableCellElement {
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableDataCellElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableDataCellElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+/** Provides special properties and methods (beyond the regular HTMLElement object interface it also has available to it by inheritance) for manipulating the layout and presentation of tables in an HTML document. */
+interface HTMLTableElement extends HTMLElement {
+    /**
+     * Sets or retrieves a value that indicates the table alignment.
+     * @deprecated
+     */
+    align: string;
+    /** @deprecated */
+    bgColor: string;
+    /**
+     * Sets or retrieves the width of the border to draw around the object.
+     * @deprecated
+     */
+    border: string;
+    /** Retrieves the caption object of a table. */
+    caption: HTMLTableCaptionElement | null;
+    /**
+     * Sets or retrieves the amount of space between the border of the cell and the content of the cell.
+     * @deprecated
+     */
+    cellPadding: string;
+    /**
+     * Sets or retrieves the amount of space between cells in a table.
+     * @deprecated
+     */
+    cellSpacing: string;
+    /**
+     * Sets or retrieves the way the border frame around the table is displayed.
+     * @deprecated
+     */
+    frame: string;
+    /** Sets or retrieves the number of horizontal rows contained in the object. */
+    readonly rows: HTMLCollectionOf<HTMLTableRowElement>;
+    /**
+     * Sets or retrieves which dividing lines (inner borders) are displayed.
+     * @deprecated
+     */
+    rules: string;
+    /**
+     * Sets or retrieves a description and/or structure of the object.
+     * @deprecated
+     */
+    summary: string;
+    /** Retrieves a collection of all tBody objects in the table. Objects in this collection are in source order. */
+    readonly tBodies: HTMLCollectionOf<HTMLTableSectionElement>;
+    /** Retrieves the tFoot object of the table. */
+    tFoot: HTMLTableSectionElement | null;
+    /** Retrieves the tHead object of the table. */
+    tHead: HTMLTableSectionElement | null;
+    /**
+     * Sets or retrieves the width of the object.
+     * @deprecated
+     */
+    width: string;
+    /** Creates an empty caption element in the table. */
+    createCaption(): HTMLTableCaptionElement;
+    /** Creates an empty tBody element in the table. */
+    createTBody(): HTMLTableSectionElement;
+    /** Creates an empty tFoot element in the table. */
+    createTFoot(): HTMLTableSectionElement;
+    /** Returns the tHead element object if successful, or null otherwise. */
+    createTHead(): HTMLTableSectionElement;
+    /** Deletes the caption element and its contents from the table. */
+    deleteCaption(): void;
+    /**
+     * Removes the specified row (tr) from the element and from the rows collection.
+     * @param index Number that specifies the zero-based position in the rows collection of the row to remove.
+     */
+    deleteRow(index: number): void;
+    /** Deletes the tFoot element and its contents from the table. */
+    deleteTFoot(): void;
+    /** Deletes the tHead element and its contents from the table. */
+    deleteTHead(): void;
+    /**
+     * Creates a new row (tr) in the table, and adds the row to the rows collection.
+     * @param index Number that specifies where to insert the row in the rows collection. The default value is -1, which appends the new row to the end of the rows collection.
+     */
+    insertRow(index?: number): HTMLTableRowElement;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLTableElement: {
+    prototype: HTMLTableElement;
+    new(): HTMLTableElement;
+};
+
+/** @deprecated prefer HTMLTableCellElement */
+interface HTMLTableHeaderCellElement extends HTMLTableCellElement {
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableHeaderCellElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableHeaderCellElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+/** Provides special properties and methods (beyond the HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of rows in an HTML table. */
+interface HTMLTableRowElement extends HTMLElement {
+    /**
+     * Sets or retrieves how the object is aligned with adjacent text.
+     * @deprecated
+     */
+    align: string;
+    /** @deprecated */
+    bgColor: string;
+    /** Retrieves a collection of all cells in the table row. */
+    readonly cells: HTMLCollectionOf<HTMLTableCellElement>;
+    /** @deprecated */
+    ch: string;
+    /** @deprecated */
+    chOff: string;
+    /** Retrieves the position of the object in the rows collection for the table. */
+    readonly rowIndex: number;
+    /** Retrieves the position of the object in the collection. */
+    readonly sectionRowIndex: number;
+    /** @deprecated */
+    vAlign: string;
+    /**
+     * Removes the specified cell from the table row, as well as from the cells collection.
+     * @param index Number that specifies the zero-based position of the cell to remove from the table row. If no value is provided, the last cell in the cells collection is deleted.
+     */
+    deleteCell(index: number): void;
+    /**
+     * Creates a new cell in the table row, and adds the cell to the cells collection.
+     * @param index Number that specifies where to insert the cell in the tr. The default value is -1, which appends the new cell to the end of the cells collection.
+     */
+    insertCell(index?: number): HTMLTableCellElement;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableRowElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableRowElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLTableRowElement: {
+    prototype: HTMLTableRowElement;
+    new(): HTMLTableRowElement;
+};
+
+/** Provides special properties and methods (beyond the HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of sections, that is headers, footers and bodies, in an HTML table. */
+interface HTMLTableSectionElement extends HTMLElement {
+    /**
+     * Sets or retrieves a value that indicates the table alignment.
+     * @deprecated
+     */
+    align: string;
+    /** @deprecated */
+    ch: string;
+    /** @deprecated */
+    chOff: string;
+    /** Sets or retrieves the number of horizontal rows contained in the object. */
+    readonly rows: HTMLCollectionOf<HTMLTableRowElement>;
+    /** @deprecated */
+    vAlign: string;
+    /**
+     * Removes the specified row (tr) from the element and from the rows collection.
+     * @param index Number that specifies the zero-based position in the rows collection of the row to remove.
+     */
+    deleteRow(index: number): void;
+    /**
+     * Creates a new row (tr) in the table, and adds the row to the rows collection.
+     * @param index Number that specifies where to insert the row in the rows collection. The default value is -1, which appends the new row to the end of the rows collection.
+     */
+    insertRow(index?: number): HTMLTableRowElement;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableSectionElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableSectionElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLTableSectionElement: {
+    prototype: HTMLTableSectionElement;
+    new(): HTMLTableSectionElement;
+};
+
+/** Enables access to the contents of an HTML <template> element. */
+interface HTMLTemplateElement extends HTMLElement {
+    /** Returns the template contents (a DocumentFragment). */
+    readonly content: DocumentFragment;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTemplateElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTemplateElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLTemplateElement: {
+    prototype: HTMLTemplateElement;
+    new(): HTMLTemplateElement;
+};
+
+/** Provides special properties and methods for manipulating the layout and presentation of <textarea> elements. */
+interface HTMLTextAreaElement extends HTMLElement {
+    autocomplete: string;
+    /** Sets or retrieves the width of the object. */
+    cols: number;
+    /** Sets or retrieves the initial contents of the object. */
+    defaultValue: string;
+    dirName: string;
+    disabled: boolean;
+    /** Retrieves a reference to the form that the object is embedded in. */
+    readonly form: HTMLFormElement | null;
+    readonly labels: NodeListOf<HTMLLabelElement>;
+    /** Sets or retrieves the maximum number of characters that the user can enter in a text control. */
+    maxLength: number;
+    minLength: number;
+    /** Sets or retrieves the name of the object. */
+    name: string;
+    /** Gets or sets a text string that is displayed in an input field as a hint or prompt to users as the format or type of information they need to enter.The text appears in an input field until the user puts focus on the field. */
+    placeholder: string;
+    /** Sets or retrieves the value indicated whether the content of the object is read-only. */
+    readOnly: boolean;
+    /** When present, marks an element that can't be submitted without a value. */
+    required: boolean;
+    /** Sets or retrieves the number of horizontal rows contained in the object. */
+    rows: number;
+    selectionDirection: "forward" | "backward" | "none";
+    /** Gets or sets the end position or offset of a text selection. */
+    selectionEnd: number;
+    /** Gets or sets the starting position or offset of a text selection. */
+    selectionStart: number;
+    readonly textLength: number;
+    /** Retrieves the type of control. */
+    readonly type: string;
+    /** Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting. */
+    readonly validationMessage: string;
+    /** Returns a  ValidityState object that represents the validity states of an element. */
+    readonly validity: ValidityState;
+    /** Retrieves or sets the text in the entry field of the textArea element. */
+    value: string;
+    /** Returns whether an element will successfully validate based on forms validation rules and constraints. */
+    readonly willValidate: boolean;
+    /** Sets or retrieves how to handle wordwrapping in the object. */
+    wrap: string;
+    /** Returns whether a form will validate when it is submitted, without having to submit it. */
+    checkValidity(): boolean;
+    reportValidity(): boolean;
+    /** Highlights the input area of a form element. */
+    select(): void;
+    /**
+     * Sets a custom error message that is displayed when a form is submitted.
+     * @param error Sets a custom error message that is displayed when a form is submitted.
+     */
+    setCustomValidity(error: string): void;
+    setRangeText(replacement: string): void;
+    setRangeText(replacement: string, start: number, end: number, selectionMode?: SelectionMode): void;
+    /**
+     * Sets the start and end positions of a selection in a text field.
+     * @param start The offset into the text field for the start of the selection.
+     * @param end The offset into the text field for the end of the selection.
+     * @param direction The direction in which the selection is performed.
+     */
+    setSelectionRange(start: number | null, end: number | null, direction?: "forward" | "backward" | "none"): void;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTextAreaElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTextAreaElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLTextAreaElement: {
+    prototype: HTMLTextAreaElement;
+    new(): HTMLTextAreaElement;
+};
+
+/** Provides special properties (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating <time> elements. */
+interface HTMLTimeElement extends HTMLElement {
+    dateTime: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTimeElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTimeElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLTimeElement: {
+    prototype: HTMLTimeElement;
+    new(): HTMLTimeElement;
+};
+
+/** Contains the title for a document. This element inherits all of the properties and methods of the HTMLElement interface. */
+interface HTMLTitleElement extends HTMLElement {
+    /** Retrieves or sets the text of the object as a string. */
+    text: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTitleElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTitleElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLTitleElement: {
+    prototype: HTMLTitleElement;
+    new(): HTMLTitleElement;
+};
+
+/** The HTMLTrackElement */
+interface HTMLTrackElement extends HTMLElement {
+    default: boolean;
+    kind: string;
+    label: string;
+    readonly readyState: number;
+    src: string;
+    srclang: string;
+    /** Returns the TextTrack object corresponding to the text track of the track element. */
+    readonly track: TextTrack;
+    readonly NONE: 0;
+    readonly LOADING: 1;
+    readonly LOADED: 2;
+    readonly ERROR: 3;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTrackElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTrackElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLTrackElement: {
+    prototype: HTMLTrackElement;
+    new(): HTMLTrackElement;
+    readonly NONE: 0;
+    readonly LOADING: 1;
+    readonly LOADED: 2;
+    readonly ERROR: 3;
+};
+
+/** Provides special properties (beyond those defined on the regular HTMLElement interface it also has available to it by inheritance) for manipulating unordered list elements. */
+interface HTMLUListElement extends HTMLElement {
+    /** @deprecated */
+    compact: boolean;
+    /** @deprecated */
+    type: string;
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLUListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLUListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLUListElement: {
+    prototype: HTMLUListElement;
+    new(): HTMLUListElement;
+};
+
+/** An invalid HTML element and derives from the HTMLElement interface, but without implementing any additional properties or methods. */
+interface HTMLUnknownElement extends HTMLElement {
+    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLUnknownElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLUnknownElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLUnknownElement: {
+    prototype: HTMLUnknownElement;
+    new(): HTMLUnknownElement;
+};
+
+interface HTMLVideoElementEventMap extends HTMLMediaElementEventMap {
+    "enterpictureinpicture": Event;
+    "leavepictureinpicture": Event;
+}
+
+/** Provides special properties and methods for manipulating video objects. It also inherits properties and methods of HTMLMediaElement and HTMLElement. */
+interface HTMLVideoElement extends HTMLMediaElement {
+    disablePictureInPicture: boolean;
+    /** Gets or sets the height of the video element. */
+    height: number;
+    onenterpictureinpicture: ((this: HTMLVideoElement, ev: Event) => any) | null;
+    onleavepictureinpicture: ((this: HTMLVideoElement, ev: Event) => any) | null;
+    /** Gets or sets the playsinline of the video element. for example, On iPhone, video elements will now be allowed to play inline, and will not automatically enter fullscreen mode when playback begins. */
+    playsInline: boolean;
+    /** Gets or sets a URL of an image to display, for example, like a movie poster. This can be a still frame from the video, or another image if no video data is available. */
+    poster: string;
+    /** Gets the intrinsic height of a video in CSS pixels, or zero if the dimensions are not known. */
+    readonly videoHeight: number;
+    /** Gets the intrinsic width of a video in CSS pixels, or zero if the dimensions are not known. */
+    readonly videoWidth: number;
+    /** Gets or sets the width of the video element. */
+    width: number;
+    cancelVideoFrameCallback(handle: number): void;
+    getVideoPlaybackQuality(): VideoPlaybackQuality;
+    requestPictureInPicture(): Promise<PictureInPictureWindow>;
+    requestVideoFrameCallback(callback: VideoFrameRequestCallback): number;
+    addEventListener<K extends keyof HTMLVideoElementEventMap>(type: K, listener: (this: HTMLVideoElement, ev: HTMLVideoElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof HTMLVideoElementEventMap>(type: K, listener: (this: HTMLVideoElement, ev: HTMLVideoElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var HTMLVideoElement: {
+    prototype: HTMLVideoElement;
+    new(): HTMLVideoElement;
+};
+
+/** Events that fire when the fragment identifier of the URL has changed. */
+interface HashChangeEvent extends Event {
+    /** Returns the URL of the session history entry that is now current. */
+    readonly newURL: string;
+    /** Returns the URL of the session history entry that was previously current. */
+    readonly oldURL: string;
+}
+
+declare var HashChangeEvent: {
+    prototype: HashChangeEvent;
+    new(type: string, eventInitDict?: HashChangeEventInit): HashChangeEvent;
+};
+
+/** This Fetch API interface allows you to perform various actions on HTTP request and response headers. These actions include retrieving, setting, adding to, and removing. A Headers object has an associated header list, which is initially empty and consists\xA0of zero or more name and value pairs. \xA0You can add to this using methods like append() (see Examples.)\xA0In all methods of this interface, header names are matched by case-insensitive byte sequence. */
+interface Headers {
+    append(name: string, value: string): void;
+    delete(name: string): void;
+    get(name: string): string | null;
+    has(name: string): boolean;
+    set(name: string, value: string): void;
+    forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: any): void;
+}
+
+declare var Headers: {
+    prototype: Headers;
+    new(init?: HeadersInit): Headers;
+};
+
+/** Allows\xA0manipulation of\xA0the browser session history, that is the pages visited in the tab or frame that the current page is loaded in. */
+interface History {
+    readonly length: number;
+    scrollRestoration: ScrollRestoration;
+    readonly state: any;
+    back(): void;
+    forward(): void;
+    go(delta?: number): void;
+    pushState(data: any, unused: string, url?: string | URL | null): void;
+    replaceState(data: any, unused: string, url?: string | URL | null): void;
+}
+
+declare var History: {
+    prototype: History;
+    new(): History;
+};
+
+/** This IndexedDB API interface represents a cursor for traversing or iterating over multiple records in a database. */
+interface IDBCursor {
+    /** Returns the direction ("next", "nextunique", "prev" or "prevunique") of the cursor. */
+    readonly direction: IDBCursorDirection;
+    /** Returns the key of the cursor. Throws a "InvalidStateError" DOMException if the cursor is advancing or is finished. */
+    readonly key: IDBValidKey;
+    /** Returns the effective key of the cursor. Throws a "InvalidStateError" DOMException if the cursor is advancing or is finished. */
+    readonly primaryKey: IDBValidKey;
+    readonly request: IDBRequest;
+    /** Returns the IDBObjectStore or IDBIndex the cursor was opened from. */
+    readonly source: IDBObjectStore | IDBIndex;
+    /** Advances the cursor through the next count records in range. */
+    advance(count: number): void;
+    /** Advances the cursor to the next record in range. */
+    continue(key?: IDBValidKey): void;
+    /** Advances the cursor to the next record in range matching or after key and primaryKey. Throws an "InvalidAccessError" DOMException if the source is not an index. */
+    continuePrimaryKey(key: IDBValidKey, primaryKey: IDBValidKey): void;
+    /**
+     * Delete the record pointed at by the cursor with a new value.
+     *
+     * If successful, request's result will be undefined.
+     */
+    delete(): IDBRequest<undefined>;
+    /**
+     * Updated the record pointed at by the cursor with a new value.
+     *
+     * Throws a "DataError" DOMException if the effective object store uses in-line keys and the key would have changed.
+     *
+     * If successful, request's result will be the record's key.
+     */
+    update(value: any): IDBRequest<IDBValidKey>;
+}
+
+declare var IDBCursor: {
+    prototype: IDBCursor;
+    new(): IDBCursor;
+};
+
+/** This IndexedDB API interface represents a cursor for traversing or iterating over multiple records in a database. It is the same as the IDBCursor, except that it includes the value property. */
+interface IDBCursorWithValue extends IDBCursor {
+    /** Returns the cursor's current value. */
+    readonly value: any;
+}
+
+declare var IDBCursorWithValue: {
+    prototype: IDBCursorWithValue;
+    new(): IDBCursorWithValue;
+};
+
+interface IDBDatabaseEventMap {
+    "abort": Event;
+    "close": Event;
+    "error": Event;
+    "versionchange": IDBVersionChangeEvent;
+}
+
+/** This IndexedDB API interface provides a connection to a database; you can use an IDBDatabase object to open a transaction on your database then create, manipulate, and delete objects (data) in that database. The interface provides the only way to get and manage versions of the database. */
+interface IDBDatabase extends EventTarget {
+    /** Returns the name of the database. */
+    readonly name: string;
+    /** Returns a list of the names of object stores in the database. */
+    readonly objectStoreNames: DOMStringList;
+    onabort: ((this: IDBDatabase, ev: Event) => any) | null;
+    onclose: ((this: IDBDatabase, ev: Event) => any) | null;
+    onerror: ((this: IDBDatabase, ev: Event) => any) | null;
+    onversionchange: ((this: IDBDatabase, ev: IDBVersionChangeEvent) => any) | null;
+    /** Returns the version of the database. */
+    readonly version: number;
+    /** Closes the connection once all running transactions have finished. */
+    close(): void;
+    /**
+     * Creates a new object store with the given name and options and returns a new IDBObjectStore.
+     *
+     * Throws a "InvalidStateError" DOMException if not called within an upgrade transaction.
+     */
+    createObjectStore(name: string, options?: IDBObjectStoreParameters): IDBObjectStore;
+    /**
+     * Deletes the object store with the given name.
+     *
+     * Throws a "InvalidStateError" DOMException if not called within an upgrade transaction.
+     */
+    deleteObjectStore(name: string): void;
+    /** Returns a new transaction with the given mode ("readonly" or "readwrite") and scope which can be a single object store name or an array of names. */
+    transaction(storeNames: string | string[], mode?: IDBTransactionMode, options?: IDBTransactionOptions): IDBTransaction;
+    addEventListener<K extends keyof IDBDatabaseEventMap>(type: K, listener: (this: IDBDatabase, ev: IDBDatabaseEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof IDBDatabaseEventMap>(type: K, listener: (this: IDBDatabase, ev: IDBDatabaseEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var IDBDatabase: {
+    prototype: IDBDatabase;
+    new(): IDBDatabase;
+};
+
+/** In the following code snippet, we make a request to open a database, and include handlers for the success and error cases. For a full working example, see our To-do Notifications app (view example live.) */
+interface IDBFactory {
+    /**
+     * Compares two values as keys. Returns -1 if key1 precedes key2, 1 if key2 precedes key1, and 0 if the keys are equal.
+     *
+     * Throws a "DataError" DOMException if either input is not a valid key.
+     */
+    cmp(first: any, second: any): number;
+    databases(): Promise<IDBDatabaseInfo[]>;
+    /** Attempts to delete the named database. If the database already exists and there are open connections that don't close in response to a versionchange event, the request will be blocked until all they close. If the request is successful request's result will be null. */
+    deleteDatabase(name: string): IDBOpenDBRequest;
+    /** Attempts to open a connection to the named database with the current version, or 1 if it does not already exist. If the request is successful request's result will be the connection. */
+    open(name: string, version?: number): IDBOpenDBRequest;
+}
+
+declare var IDBFactory: {
+    prototype: IDBFactory;
+    new(): IDBFactory;
+};
+
+/** IDBIndex interface of the IndexedDB API provides asynchronous access to an index in a database. An index is a kind of object store for looking up records in another object store, called the referenced object store. You use this interface to retrieve data. */
+interface IDBIndex {
+    readonly keyPath: string | string[];
+    readonly multiEntry: boolean;
+    /** Returns the name of the index. */
+    name: string;
+    /** Returns the IDBObjectStore the index belongs to. */
+    readonly objectStore: IDBObjectStore;
+    readonly unique: boolean;
+    /**
+     * Retrieves the number of records matching the given key or key range in query.
+     *
+     * If successful, request's result will be the count.
+     */
+    count(query?: IDBValidKey | IDBKeyRange): IDBRequest<number>;
+    /**
+     * Retrieves the value of the first record matching the given key or key range in query.
+     *
+     * If successful, request's result will be the value, or undefined if there was no matching record.
+     */
+    get(query: IDBValidKey | IDBKeyRange): IDBRequest<any>;
+    /**
+     * Retrieves the values of the records matching the given key or key range in query (up to count if given).
+     *
+     * If successful, request's result will be an Array of the values.
+     */
+    getAll(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<any[]>;
+    /**
+     * Retrieves the keys of records matching the given key or key range in query (up to count if given).
+     *
+     * If successful, request's result will be an Array of the keys.
+     */
+    getAllKeys(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<IDBValidKey[]>;
+    /**
+     * Retrieves the key of the first record matching the given key or key range in query.
+     *
+     * If successful, request's result will be the key, or undefined if there was no matching record.
+     */
+    getKey(query: IDBValidKey | IDBKeyRange): IDBRequest<IDBValidKey | undefined>;
+    /**
+     * Opens a cursor over the records matching query, ordered by direction. If query is null, all records in index are matched.
+     *
+     * If successful, request's result will be an IDBCursorWithValue, or null if there were no matching records.
+     */
+    openCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursorWithValue | null>;
+    /**
+     * Opens a cursor with key only flag set over the records matching query, ordered by direction. If query is null, all records in index are matched.
+     *
+     * If successful, request's result will be an IDBCursor, or null if there were no matching records.
+     */
+    openKeyCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursor | null>;
+}
+
+declare var IDBIndex: {
+    prototype: IDBIndex;
+    new(): IDBIndex;
+};
+
+/** A key range can be a single value or a range with upper and lower bounds or endpoints. If the key range has both upper and lower bounds, then it is bounded; if it has no bounds, it is unbounded. A bounded key range can either be open (the endpoints are excluded) or closed (the endpoints are included). To retrieve all keys within a certain range, you can use the following code constructs: */
+interface IDBKeyRange {
+    /** Returns lower bound, or undefined if none. */
+    readonly lower: any;
+    /** Returns true if the lower open flag is set, and false otherwise. */
+    readonly lowerOpen: boolean;
+    /** Returns upper bound, or undefined if none. */
+    readonly upper: any;
+    /** Returns true if the upper open flag is set, and false otherwise. */
+    readonly upperOpen: boolean;
+    /** Returns true if key is included in the range, and false otherwise. */
+    includes(key: any): boolean;
+}
+
+declare var IDBKeyRange: {
+    prototype: IDBKeyRange;
+    new(): IDBKeyRange;
+    /** Returns a new IDBKeyRange spanning from lower to upper. If lowerOpen is true, lower is not included in the range. If upperOpen is true, upper is not included in the range. */
+    bound(lower: any, upper: any, lowerOpen?: boolean, upperOpen?: boolean): IDBKeyRange;
+    /** Returns a new IDBKeyRange starting at key with no upper bound. If open is true, key is not included in the range. */
+    lowerBound(lower: any, open?: boolean): IDBKeyRange;
+    /** Returns a new IDBKeyRange spanning only key. */
+    only(value: any): IDBKeyRange;
+    /** Returns a new IDBKeyRange with no lower bound and ending at key. If open is true, key is not included in the range. */
+    upperBound(upper: any, open?: boolean): IDBKeyRange;
+};
+
+/** This example shows a variety of different uses of object stores, from updating the data structure with IDBObjectStore.createIndex\xA0inside an onupgradeneeded function, to adding a new item to our object store with IDBObjectStore.add. For a full working example, see our\xA0To-do Notifications\xA0app (view example live.) */
+interface IDBObjectStore {
+    /** Returns true if the store has a key generator, and false otherwise. */
+    readonly autoIncrement: boolean;
+    /** Returns a list of the names of indexes in the store. */
+    readonly indexNames: DOMStringList;
+    /** Returns the key path of the store, or null if none. */
+    readonly keyPath: string | string[];
+    /** Returns the name of the store. */
+    name: string;
+    /** Returns the associated transaction. */
+    readonly transaction: IDBTransaction;
+    /**
+     * Adds or updates a record in store with the given value and key.
+     *
+     * If the store uses in-line keys and key is specified a "DataError" DOMException will be thrown.
+     *
+     * If put() is used, any existing record with the key will be replaced. If add() is used, and if a record with the key already exists the request will fail, with request's error set to a "ConstraintError" DOMException.
+     *
+     * If successful, request's result will be the record's key.
+     */
+    add(value: any, key?: IDBValidKey): IDBRequest<IDBValidKey>;
+    /**
+     * Deletes all records in store.
+     *
+     * If successful, request's result will be undefined.
+     */
+    clear(): IDBRequest<undefined>;
+    /**
+     * Retrieves the number of records matching the given key or key range in query.
+     *
+     * If successful, request's result will be the count.
+     */
+    count(query?: IDBValidKey | IDBKeyRange): IDBRequest<number>;
+    /**
+     * Creates a new index in store with the given name, keyPath and options and returns a new IDBIndex. If the keyPath and options define constraints that cannot be satisfied with the data already in store the upgrade transaction will abort with a "ConstraintError" DOMException.
+     *
+     * Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.
+     */
+    createIndex(name: string, keyPath: string | string[], options?: IDBIndexParameters): IDBIndex;
+    /**
+     * Deletes records in store with the given key or in the given key range in query.
+     *
+     * If successful, request's result will be undefined.
+     */
+    delete(query: IDBValidKey | IDBKeyRange): IDBRequest<undefined>;
+    /**
+     * Deletes the index in store with the given name.
+     *
+     * Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.
+     */
+    deleteIndex(name: string): void;
+    /**
+     * Retrieves the value of the first record matching the given key or key range in query.
+     *
+     * If successful, request's result will be the value, or undefined if there was no matching record.
+     */
+    get(query: IDBValidKey | IDBKeyRange): IDBRequest<any>;
+    /**
+     * Retrieves the values of the records matching the given key or key range in query (up to count if given).
+     *
+     * If successful, request's result will be an Array of the values.
+     */
+    getAll(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<any[]>;
+    /**
+     * Retrieves the keys of records matching the given key or key range in query (up to count if given).
+     *
+     * If successful, request's result will be an Array of the keys.
+     */
+    getAllKeys(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<IDBValidKey[]>;
+    /**
+     * Retrieves the key of the first record matching the given key or key range in query.
+     *
+     * If successful, request's result will be the key, or undefined if there was no matching record.
+     */
+    getKey(query: IDBValidKey | IDBKeyRange): IDBRequest<IDBValidKey | undefined>;
+    index(name: string): IDBIndex;
+    /**
+     * Opens a cursor over the records matching query, ordered by direction. If query is null, all records in store are matched.
+     *
+     * If successful, request's result will be an IDBCursorWithValue pointing at the first matching record, or null if there were no matching records.
+     */
+    openCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursorWithValue | null>;
+    /**
+     * Opens a cursor with key only flag set over the records matching query, ordered by direction. If query is null, all records in store are matched.
+     *
+     * If successful, request's result will be an IDBCursor pointing at the first matching record, or null if there were no matching records.
+     */
+    openKeyCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursor | null>;
+    /**
+     * Adds or updates a record in store with the given value and key.
+     *
+     * If the store uses in-line keys and key is specified a "DataError" DOMException will be thrown.
+     *
+     * If put() is used, any existing record with the key will be replaced. If add() is used, and if a record with the key already exists the request will fail, with request's error set to a "ConstraintError" DOMException.
+     *
+     * If successful, request's result will be the record's key.
+     */
+    put(value: any, key?: IDBValidKey): IDBRequest<IDBValidKey>;
+}
+
+declare var IDBObjectStore: {
+    prototype: IDBObjectStore;
+    new(): IDBObjectStore;
+};
+
+interface IDBOpenDBRequestEventMap extends IDBRequestEventMap {
+    "blocked": IDBVersionChangeEvent;
+    "upgradeneeded": IDBVersionChangeEvent;
+}
+
+/** Also inherits methods from its parents IDBRequest and EventTarget. */
+interface IDBOpenDBRequest extends IDBRequest<IDBDatabase> {
+    onblocked: ((this: IDBOpenDBRequest, ev: IDBVersionChangeEvent) => any) | null;
+    onupgradeneeded: ((this: IDBOpenDBRequest, ev: IDBVersionChangeEvent) => any) | null;
+    addEventListener<K extends keyof IDBOpenDBRequestEventMap>(type: K, listener: (this: IDBOpenDBRequest, ev: IDBOpenDBRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof IDBOpenDBRequestEventMap>(type: K, listener: (this: IDBOpenDBRequest, ev: IDBOpenDBRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var IDBOpenDBRequest: {
+    prototype: IDBOpenDBRequest;
+    new(): IDBOpenDBRequest;
+};
+
+interface IDBRequestEventMap {
+    "error": Event;
+    "success": Event;
+}
+
+/** The request object does not initially contain any information about the result of the operation, but once information becomes available, an event is fired on the request, and the information becomes available through the properties of the IDBRequest instance. */
+interface IDBRequest<T = any> extends EventTarget {
+    /** When a request is completed, returns the error (a DOMException), or null if the request succeeded. Throws a "InvalidStateError" DOMException if the request is still pending. */
+    readonly error: DOMException | null;
+    onerror: ((this: IDBRequest<T>, ev: Event) => any) | null;
+    onsuccess: ((this: IDBRequest<T>, ev: Event) => any) | null;
+    /** Returns "pending" until a request is complete, then returns "done". */
+    readonly readyState: IDBRequestReadyState;
+    /** When a request is completed, returns the result, or undefined if the request failed. Throws a "InvalidStateError" DOMException if the request is still pending. */
+    readonly result: T;
+    /** Returns the IDBObjectStore, IDBIndex, or IDBCursor the request was made against, or null if is was an open request. */
+    readonly source: IDBObjectStore | IDBIndex | IDBCursor;
+    /** Returns the IDBTransaction the request was made within. If this as an open request, then it returns an upgrade transaction while it is running, or null otherwise. */
+    readonly transaction: IDBTransaction | null;
+    addEventListener<K extends keyof IDBRequestEventMap>(type: K, listener: (this: IDBRequest<T>, ev: IDBRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof IDBRequestEventMap>(type: K, listener: (this: IDBRequest<T>, ev: IDBRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var IDBRequest: {
+    prototype: IDBRequest;
+    new(): IDBRequest;
+};
+
+interface IDBTransactionEventMap {
+    "abort": Event;
+    "complete": Event;
+    "error": Event;
+}
+
+interface IDBTransaction extends EventTarget {
+    /** Returns the transaction's connection. */
+    readonly db: IDBDatabase;
+    readonly durability: IDBTransactionDurability;
+    /** If the transaction was aborted, returns the error (a DOMException) providing the reason. */
+    readonly error: DOMException | null;
+    /** Returns the mode the transaction was created with ("readonly" or "readwrite"), or "versionchange" for an upgrade transaction. */
+    readonly mode: IDBTransactionMode;
+    /** Returns a list of the names of object stores in the transaction's scope. For an upgrade transaction this is all object stores in the database. */
+    readonly objectStoreNames: DOMStringList;
+    onabort: ((this: IDBTransaction, ev: Event) => any) | null;
+    oncomplete: ((this: IDBTransaction, ev: Event) => any) | null;
+    onerror: ((this: IDBTransaction, ev: Event) => any) | null;
+    /** Aborts the transaction. All pending requests will fail with a "AbortError" DOMException and all changes made to the database will be reverted. */
+    abort(): void;
+    commit(): void;
+    /** Returns an IDBObjectStore in the transaction's scope. */
+    objectStore(name: string): IDBObjectStore;
+    addEventListener<K extends keyof IDBTransactionEventMap>(type: K, listener: (this: IDBTransaction, ev: IDBTransactionEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof IDBTransactionEventMap>(type: K, listener: (this: IDBTransaction, ev: IDBTransactionEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var IDBTransaction: {
+    prototype: IDBTransaction;
+    new(): IDBTransaction;
+};
+
+/** This IndexedDB API interface indicates that the version of the database has changed, as the result of an IDBOpenDBRequest.onupgradeneeded event handler function. */
+interface IDBVersionChangeEvent extends Event {
+    readonly newVersion: number | null;
+    readonly oldVersion: number;
+}
+
+declare var IDBVersionChangeEvent: {
+    prototype: IDBVersionChangeEvent;
+    new(type: string, eventInitDict?: IDBVersionChangeEventInit): IDBVersionChangeEvent;
+};
+
+/** The\xA0IIRFilterNode\xA0interface of the\xA0Web Audio API\xA0is a AudioNode processor which implements a general infinite impulse response (IIR)\xA0 filter; this type of filter can be used to implement tone control devices and graphic equalizers as well. It lets the parameters of the filter response be specified, so that it can be tuned as needed. */
+interface IIRFilterNode extends AudioNode {
+    getFrequencyResponse(frequencyHz: Float32Array, magResponse: Float32Array, phaseResponse: Float32Array): void;
+}
+
+declare var IIRFilterNode: {
+    prototype: IIRFilterNode;
+    new(context: BaseAudioContext, options: IIRFilterOptions): IIRFilterNode;
+};
+
+interface IdleDeadline {
+    readonly didTimeout: boolean;
+    timeRemaining(): DOMHighResTimeStamp;
+}
+
+declare var IdleDeadline: {
+    prototype: IdleDeadline;
+    new(): IdleDeadline;
+};
+
+interface ImageBitmap {
+    /** Returns the intrinsic height of the image, in CSS pixels. */
+    readonly height: number;
+    /** Returns the intrinsic width of the image, in CSS pixels. */
+    readonly width: number;
+    /** Releases imageBitmap's underlying bitmap data. */
+    close(): void;
+}
+
+declare var ImageBitmap: {
+    prototype: ImageBitmap;
+    new(): ImageBitmap;
+};
+
+interface ImageBitmapRenderingContext {
+    /** Returns the canvas element that the context is bound to. */
+    readonly canvas: HTMLCanvasElement | OffscreenCanvas;
+    /** Transfers the underlying bitmap data from imageBitmap to context, and the bitmap becomes the contents of the canvas element to which context is bound. */
+    transferFromImageBitmap(bitmap: ImageBitmap | null): void;
+}
+
+declare var ImageBitmapRenderingContext: {
+    prototype: ImageBitmapRenderingContext;
+    new(): ImageBitmapRenderingContext;
+};
+
+/** The underlying pixel data of an area of a <canvas> element. It is created using the ImageData() constructor or creator methods on the CanvasRenderingContext2D object associated with a canvas: createImageData() and getImageData(). It can also be used to set a part of the canvas by using putImageData(). */
+interface ImageData {
+    readonly colorSpace: PredefinedColorSpace;
+    /** Returns the one-dimensional array containing the data in RGBA order, as integers in the range 0 to 255. */
+    readonly data: Uint8ClampedArray;
+    /** Returns the actual dimensions of the data in the ImageData object, in pixels. */
+    readonly height: number;
+    /** Returns the actual dimensions of the data in the ImageData object, in pixels. */
+    readonly width: number;
+}
+
+declare var ImageData: {
+    prototype: ImageData;
+    new(sw: number, sh: number, settings?: ImageDataSettings): ImageData;
+    new(data: Uint8ClampedArray, sw: number, sh?: number, settings?: ImageDataSettings): ImageData;
+};
+
+interface InnerHTML {
+    innerHTML: string;
+}
+
+/** Available only in secure contexts. */
+interface InputDeviceInfo extends MediaDeviceInfo {
+}
+
+declare var InputDeviceInfo: {
+    prototype: InputDeviceInfo;
+    new(): InputDeviceInfo;
+};
+
+interface InputEvent extends UIEvent {
+    readonly data: string | null;
+    readonly dataTransfer: DataTransfer | null;
+    readonly inputType: string;
+    readonly isComposing: boolean;
+    getTargetRanges(): StaticRange[];
+}
+
+declare var InputEvent: {
+    prototype: InputEvent;
+    new(type: string, eventInitDict?: InputEventInit): InputEvent;
+};
+
+/** provides a way to asynchronously observe changes in the intersection of a target element with an ancestor element or with a top-level document's viewport. */
+interface IntersectionObserver {
+    readonly root: Element | Document | null;
+    readonly rootMargin: string;
+    readonly thresholds: ReadonlyArray<number>;
+    disconnect(): void;
+    observe(target: Element): void;
+    takeRecords(): IntersectionObserverEntry[];
+    unobserve(target: Element): void;
+}
+
+declare var IntersectionObserver: {
+    prototype: IntersectionObserver;
+    new(callback: IntersectionObserverCallback, options?: IntersectionObserverInit): IntersectionObserver;
+};
+
+/** This Intersection Observer API interface describes the intersection between the target element and its root container at a specific moment of transition. */
+interface IntersectionObserverEntry {
+    readonly boundingClientRect: DOMRectReadOnly;
+    readonly intersectionRatio: number;
+    readonly intersectionRect: DOMRectReadOnly;
+    readonly isIntersecting: boolean;
+    readonly rootBounds: DOMRectReadOnly | null;
+    readonly target: Element;
+    readonly time: DOMHighResTimeStamp;
+}
+
+declare var IntersectionObserverEntry: {
+    prototype: IntersectionObserverEntry;
+    new(intersectionObserverEntryInit: IntersectionObserverEntryInit): IntersectionObserverEntry;
+};
+
+interface KHR_parallel_shader_compile {
+    readonly COMPLETION_STATUS_KHR: 0x91B1;
+}
+
+/** KeyboardEvent objects describe a user interaction with the keyboard; each event describes a single interaction between the user and a key (or combination of a key with modifier keys) on the keyboard. */
+interface KeyboardEvent extends UIEvent {
+    readonly altKey: boolean;
+    /** @deprecated */
+    readonly charCode: number;
+    readonly code: string;
+    readonly ctrlKey: boolean;
+    readonly isComposing: boolean;
+    readonly key: string;
+    /** @deprecated */
+    readonly keyCode: number;
+    readonly location: number;
+    readonly metaKey: boolean;
+    readonly repeat: boolean;
+    readonly shiftKey: boolean;
+    getModifierState(keyArg: string): boolean;
+    /** @deprecated */
+    initKeyboardEvent(typeArg: string, bubblesArg?: boolean, cancelableArg?: boolean, viewArg?: Window | null, keyArg?: string, locationArg?: number, ctrlKey?: boolean, altKey?: boolean, shiftKey?: boolean, metaKey?: boolean): void;
+    readonly DOM_KEY_LOCATION_STANDARD: 0x00;
+    readonly DOM_KEY_LOCATION_LEFT: 0x01;
+    readonly DOM_KEY_LOCATION_RIGHT: 0x02;
+    readonly DOM_KEY_LOCATION_NUMPAD: 0x03;
+}
+
+declare var KeyboardEvent: {
+    prototype: KeyboardEvent;
+    new(type: string, eventInitDict?: KeyboardEventInit): KeyboardEvent;
+    readonly DOM_KEY_LOCATION_STANDARD: 0x00;
+    readonly DOM_KEY_LOCATION_LEFT: 0x01;
+    readonly DOM_KEY_LOCATION_RIGHT: 0x02;
+    readonly DOM_KEY_LOCATION_NUMPAD: 0x03;
+};
+
+interface KeyframeEffect extends AnimationEffect {
+    composite: CompositeOperation;
+    iterationComposite: IterationCompositeOperation;
+    pseudoElement: string | null;
+    target: Element | null;
+    getKeyframes(): ComputedKeyframe[];
+    setKeyframes(keyframes: Keyframe[] | PropertyIndexedKeyframes | null): void;
+}
+
+declare var KeyframeEffect: {
+    prototype: KeyframeEffect;
+    new(target: Element | null, keyframes: Keyframe[] | PropertyIndexedKeyframes | null, options?: number | KeyframeEffectOptions): KeyframeEffect;
+    new(source: KeyframeEffect): KeyframeEffect;
+};
+
+interface LinkStyle {
+    readonly sheet: CSSStyleSheet | null;
+}
+
+/** The location (URL) of the object it is linked to. Changes done on it are reflected on the object it relates to. Both the Document and Window interface have such a linked Location, accessible via Document.location and Window.location respectively. */
+interface Location {
+    /** Returns a DOMStringList object listing the origins of the ancestor browsing contexts, from the parent browsing context to the top-level browsing context. */
+    readonly ancestorOrigins: DOMStringList;
+    /**
+     * Returns the Location object's URL's fragment (includes leading "#" if non-empty).
+     *
+     * Can be set, to navigate to the same URL with a changed fragment (ignores leading "#").
+     */
+    hash: string;
+    /**
+     * Returns the Location object's URL's host and port (if different from the default port for the scheme).
+     *
+     * Can be set, to navigate to the same URL with a changed host and port.
+     */
+    host: string;
+    /**
+     * Returns the Location object's URL's host.
+     *
+     * Can be set, to navigate to the same URL with a changed host.
+     */
+    hostname: string;
+    /**
+     * Returns the Location object's URL.
+     *
+     * Can be set, to navigate to the given URL.
+     */
+    href: string;
+    toString(): string;
+    /** Returns the Location object's URL's origin. */
+    readonly origin: string;
+    /**
+     * Returns the Location object's URL's path.
+     *
+     * Can be set, to navigate to the same URL with a changed path.
+     */
+    pathname: string;
+    /**
+     * Returns the Location object's URL's port.
+     *
+     * Can be set, to navigate to the same URL with a changed port.
+     */
+    port: string;
+    /**
+     * Returns the Location object's URL's scheme.
+     *
+     * Can be set, to navigate to the same URL with a changed scheme.
+     */
+    protocol: string;
+    /**
+     * Returns the Location object's URL's query (includes leading "?" if non-empty).
+     *
+     * Can be set, to navigate to the same URL with a changed query (ignores leading "?").
+     */
+    search: string;
+    /** Navigates to the given URL. */
+    assign(url: string | URL): void;
+    /** Reloads the current page. */
+    reload(): void;
+    /** Removes the current page from the session history and navigates to the given URL. */
+    replace(url: string | URL): void;
+}
+
+declare var Location: {
+    prototype: Location;
+    new(): Location;
+};
+
+/** Available only in secure contexts. */
+interface Lock {
+    readonly mode: LockMode;
+    readonly name: string;
+}
+
+declare var Lock: {
+    prototype: Lock;
+    new(): Lock;
+};
+
+/** Available only in secure contexts. */
+interface LockManager {
+    query(): Promise<LockManagerSnapshot>;
+    request(name: string, callback: LockGrantedCallback): Promise<any>;
+    request(name: string, options: LockOptions, callback: LockGrantedCallback): Promise<any>;
+}
+
+declare var LockManager: {
+    prototype: LockManager;
+    new(): LockManager;
+};
+
+interface MIDIAccessEventMap {
+    "statechange": Event;
+}
+
+/** Available only in secure contexts. */
+interface MIDIAccess extends EventTarget {
+    readonly inputs: MIDIInputMap;
+    onstatechange: ((this: MIDIAccess, ev: Event) => any) | null;
+    readonly outputs: MIDIOutputMap;
+    readonly sysexEnabled: boolean;
+    addEventListener<K extends keyof MIDIAccessEventMap>(type: K, listener: (this: MIDIAccess, ev: MIDIAccessEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MIDIAccessEventMap>(type: K, listener: (this: MIDIAccess, ev: MIDIAccessEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var MIDIAccess: {
+    prototype: MIDIAccess;
+    new(): MIDIAccess;
+};
+
+/** Available only in secure contexts. */
+interface MIDIConnectionEvent extends Event {
+    readonly port: MIDIPort;
+}
+
+declare var MIDIConnectionEvent: {
+    prototype: MIDIConnectionEvent;
+    new(type: string, eventInitDict?: MIDIConnectionEventInit): MIDIConnectionEvent;
+};
+
+interface MIDIInputEventMap extends MIDIPortEventMap {
+    "midimessage": Event;
+}
+
+/** Available only in secure contexts. */
+interface MIDIInput extends MIDIPort {
+    onmidimessage: ((this: MIDIInput, ev: Event) => any) | null;
+    addEventListener<K extends keyof MIDIInputEventMap>(type: K, listener: (this: MIDIInput, ev: MIDIInputEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MIDIInputEventMap>(type: K, listener: (this: MIDIInput, ev: MIDIInputEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var MIDIInput: {
+    prototype: MIDIInput;
+    new(): MIDIInput;
+};
+
+/** Available only in secure contexts. */
+interface MIDIInputMap {
+    forEach(callbackfn: (value: MIDIInput, key: string, parent: MIDIInputMap) => void, thisArg?: any): void;
+}
+
+declare var MIDIInputMap: {
+    prototype: MIDIInputMap;
+    new(): MIDIInputMap;
+};
+
+/** Available only in secure contexts. */
+interface MIDIMessageEvent extends Event {
+    readonly data: Uint8Array;
+}
+
+declare var MIDIMessageEvent: {
+    prototype: MIDIMessageEvent;
+    new(type: string, eventInitDict?: MIDIMessageEventInit): MIDIMessageEvent;
+};
+
+/** Available only in secure contexts. */
+interface MIDIOutput extends MIDIPort {
+    send(data: number[], timestamp?: DOMHighResTimeStamp): void;
+    addEventListener<K extends keyof MIDIPortEventMap>(type: K, listener: (this: MIDIOutput, ev: MIDIPortEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MIDIPortEventMap>(type: K, listener: (this: MIDIOutput, ev: MIDIPortEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var MIDIOutput: {
+    prototype: MIDIOutput;
+    new(): MIDIOutput;
+};
+
+/** Available only in secure contexts. */
+interface MIDIOutputMap {
+    forEach(callbackfn: (value: MIDIOutput, key: string, parent: MIDIOutputMap) => void, thisArg?: any): void;
+}
+
+declare var MIDIOutputMap: {
+    prototype: MIDIOutputMap;
+    new(): MIDIOutputMap;
+};
+
+interface MIDIPortEventMap {
+    "statechange": Event;
+}
+
+/** Available only in secure contexts. */
+interface MIDIPort extends EventTarget {
+    readonly connection: MIDIPortConnectionState;
+    readonly id: string;
+    readonly manufacturer: string | null;
+    readonly name: string | null;
+    onstatechange: ((this: MIDIPort, ev: Event) => any) | null;
+    readonly state: MIDIPortDeviceState;
+    readonly type: MIDIPortType;
+    readonly version: string | null;
+    close(): Promise<MIDIPort>;
+    open(): Promise<MIDIPort>;
+    addEventListener<K extends keyof MIDIPortEventMap>(type: K, listener: (this: MIDIPort, ev: MIDIPortEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MIDIPortEventMap>(type: K, listener: (this: MIDIPort, ev: MIDIPortEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var MIDIPort: {
+    prototype: MIDIPort;
+    new(): MIDIPort;
+};
+
+interface MathMLElementEventMap extends ElementEventMap, GlobalEventHandlersEventMap {
+}
+
+interface MathMLElement extends Element, ElementCSSInlineStyle, GlobalEventHandlers, HTMLOrSVGElement {
+    addEventListener<K extends keyof MathMLElementEventMap>(type: K, listener: (this: MathMLElement, ev: MathMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MathMLElementEventMap>(type: K, listener: (this: MathMLElement, ev: MathMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var MathMLElement: {
+    prototype: MathMLElement;
+    new(): MathMLElement;
+};
+
+interface MediaCapabilities {
+    decodingInfo(configuration: MediaDecodingConfiguration): Promise<MediaCapabilitiesDecodingInfo>;
+    encodingInfo(configuration: MediaEncodingConfiguration): Promise<MediaCapabilitiesEncodingInfo>;
+}
+
+declare var MediaCapabilities: {
+    prototype: MediaCapabilities;
+    new(): MediaCapabilities;
+};
+
+/**
+ * The MediaDevicesInfo interface contains information that describes a single media input or output device.
+ * Available only in secure contexts.
+ */
+interface MediaDeviceInfo {
+    readonly deviceId: string;
+    readonly groupId: string;
+    readonly kind: MediaDeviceKind;
+    readonly label: string;
+    toJSON(): any;
+}
+
+declare var MediaDeviceInfo: {
+    prototype: MediaDeviceInfo;
+    new(): MediaDeviceInfo;
+};
+
+interface MediaDevicesEventMap {
+    "devicechange": Event;
+}
+
+/**
+ * Provides access to connected media input devices like cameras and microphones, as well as screen sharing. In essence, it lets you obtain access to any hardware source of media data.
+ * Available only in secure contexts.
+ */
+interface MediaDevices extends EventTarget {
+    ondevicechange: ((this: MediaDevices, ev: Event) => any) | null;
+    enumerateDevices(): Promise<MediaDeviceInfo[]>;
+    getDisplayMedia(options?: DisplayMediaStreamOptions): Promise<MediaStream>;
+    getSupportedConstraints(): MediaTrackSupportedConstraints;
+    getUserMedia(constraints?: MediaStreamConstraints): Promise<MediaStream>;
+    addEventListener<K extends keyof MediaDevicesEventMap>(type: K, listener: (this: MediaDevices, ev: MediaDevicesEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MediaDevicesEventMap>(type: K, listener: (this: MediaDevices, ev: MediaDevicesEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var MediaDevices: {
+    prototype: MediaDevices;
+    new(): MediaDevices;
+};
+
+/** A MediaElementSourceNode has no inputs and exactly one output, and is created using the AudioContext.createMediaElementSource method. The amount of channels in the output equals the number of channels of the audio referenced by the HTMLMediaElement used in the creation of the node, or is 1 if the HTMLMediaElement has no audio. */
+interface MediaElementAudioSourceNode extends AudioNode {
+    readonly mediaElement: HTMLMediaElement;
+}
+
+declare var MediaElementAudioSourceNode: {
+    prototype: MediaElementAudioSourceNode;
+    new(context: AudioContext, options: MediaElementAudioSourceOptions): MediaElementAudioSourceNode;
+};
+
+interface MediaEncryptedEvent extends Event {
+    readonly initData: ArrayBuffer | null;
+    readonly initDataType: string;
+}
+
+declare var MediaEncryptedEvent: {
+    prototype: MediaEncryptedEvent;
+    new(type: string, eventInitDict?: MediaEncryptedEventInit): MediaEncryptedEvent;
+};
+
+/** An error which occurred while handling media in an HTML media element based on HTMLMediaElement, such as <audio> or <video>. */
+interface MediaError {
+    readonly code: number;
+    readonly message: string;
+    readonly MEDIA_ERR_ABORTED: 1;
+    readonly MEDIA_ERR_NETWORK: 2;
+    readonly MEDIA_ERR_DECODE: 3;
+    readonly MEDIA_ERR_SRC_NOT_SUPPORTED: 4;
+}
+
+declare var MediaError: {
+    prototype: MediaError;
+    new(): MediaError;
+    readonly MEDIA_ERR_ABORTED: 1;
+    readonly MEDIA_ERR_NETWORK: 2;
+    readonly MEDIA_ERR_DECODE: 3;
+    readonly MEDIA_ERR_SRC_NOT_SUPPORTED: 4;
+};
+
+/**
+ * This EncryptedMediaExtensions API interface contains the content and related data when the content decryption module generates a message for the session.
+ * Available only in secure contexts.
+ */
+interface MediaKeyMessageEvent extends Event {
+    readonly message: ArrayBuffer;
+    readonly messageType: MediaKeyMessageType;
+}
+
+declare var MediaKeyMessageEvent: {
+    prototype: MediaKeyMessageEvent;
+    new(type: string, eventInitDict: MediaKeyMessageEventInit): MediaKeyMessageEvent;
+};
+
+interface MediaKeySessionEventMap {
+    "keystatuseschange": Event;
+    "message": MediaKeyMessageEvent;
+}
+
+/**
+ * This EncryptedMediaExtensions API interface represents a\xA0context for message exchange with a content decryption module (CDM).
+ * Available only in secure contexts.
+ */
+interface MediaKeySession extends EventTarget {
+    readonly closed: Promise<MediaKeySessionClosedReason>;
+    readonly expiration: number;
+    readonly keyStatuses: MediaKeyStatusMap;
+    onkeystatuseschange: ((this: MediaKeySession, ev: Event) => any) | null;
+    onmessage: ((this: MediaKeySession, ev: MediaKeyMessageEvent) => any) | null;
+    readonly sessionId: string;
+    close(): Promise<void>;
+    generateRequest(initDataType: string, initData: BufferSource): Promise<void>;
+    load(sessionId: string): Promise<boolean>;
+    remove(): Promise<void>;
+    update(response: BufferSource): Promise<void>;
+    addEventListener<K extends keyof MediaKeySessionEventMap>(type: K, listener: (this: MediaKeySession, ev: MediaKeySessionEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MediaKeySessionEventMap>(type: K, listener: (this: MediaKeySession, ev: MediaKeySessionEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var MediaKeySession: {
+    prototype: MediaKeySession;
+    new(): MediaKeySession;
+};
+
+/**
+ * This EncryptedMediaExtensions API interface is a read-only map of media key statuses by key IDs.
+ * Available only in secure contexts.
+ */
+interface MediaKeyStatusMap {
+    readonly size: number;
+    get(keyId: BufferSource): MediaKeyStatus | undefined;
+    has(keyId: BufferSource): boolean;
+    forEach(callbackfn: (value: MediaKeyStatus, key: BufferSource, parent: MediaKeyStatusMap) => void, thisArg?: any): void;
+}
+
+declare var MediaKeyStatusMap: {
+    prototype: MediaKeyStatusMap;
+    new(): MediaKeyStatusMap;
+};
+
+/**
+ * This EncryptedMediaExtensions API interface provides access to a Key System for decryption and/or a content protection provider. You can request an instance of this object using the Navigator.requestMediaKeySystemAccess method.
+ * Available only in secure contexts.
+ */
+interface MediaKeySystemAccess {
+    readonly keySystem: string;
+    createMediaKeys(): Promise<MediaKeys>;
+    getConfiguration(): MediaKeySystemConfiguration;
+}
+
+declare var MediaKeySystemAccess: {
+    prototype: MediaKeySystemAccess;
+    new(): MediaKeySystemAccess;
+};
+
+/**
+ * This EncryptedMediaExtensions API interface the represents a set of keys that an associated HTMLMediaElement can use for decryption of media data during playback.
+ * Available only in secure contexts.
+ */
+interface MediaKeys {
+    createSession(sessionType?: MediaKeySessionType): MediaKeySession;
+    setServerCertificate(serverCertificate: BufferSource): Promise<boolean>;
+}
+
+declare var MediaKeys: {
+    prototype: MediaKeys;
+    new(): MediaKeys;
+};
+
+interface MediaList {
+    readonly length: number;
+    mediaText: string;
+    toString(): string;
+    appendMedium(medium: string): void;
+    deleteMedium(medium: string): void;
+    item(index: number): string | null;
+    [index: number]: string;
+}
+
+declare var MediaList: {
+    prototype: MediaList;
+    new(): MediaList;
+};
+
+interface MediaMetadata {
+    album: string;
+    artist: string;
+    artwork: ReadonlyArray<MediaImage>;
+    title: string;
+}
+
+declare var MediaMetadata: {
+    prototype: MediaMetadata;
+    new(init?: MediaMetadataInit): MediaMetadata;
+};
+
+interface MediaQueryListEventMap {
+    "change": MediaQueryListEvent;
+}
+
+/** Stores information on a media query applied to a document, and handles sending notifications to listeners when the media query state change (i.e. when the media query test starts or stops evaluating to true). */
+interface MediaQueryList extends EventTarget {
+    readonly matches: boolean;
+    readonly media: string;
+    onchange: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | null;
+    /** @deprecated */
+    addListener(callback: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | null): void;
+    /** @deprecated */
+    removeListener(callback: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | null): void;
+    addEventListener<K extends keyof MediaQueryListEventMap>(type: K, listener: (this: MediaQueryList, ev: MediaQueryListEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MediaQueryListEventMap>(type: K, listener: (this: MediaQueryList, ev: MediaQueryListEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var MediaQueryList: {
+    prototype: MediaQueryList;
+    new(): MediaQueryList;
+};
+
+interface MediaQueryListEvent extends Event {
+    readonly matches: boolean;
+    readonly media: string;
+}
+
+declare var MediaQueryListEvent: {
+    prototype: MediaQueryListEvent;
+    new(type: string, eventInitDict?: MediaQueryListEventInit): MediaQueryListEvent;
+};
+
+interface MediaRecorderEventMap {
+    "dataavailable": BlobEvent;
+    "error": Event;
+    "pause": Event;
+    "resume": Event;
+    "start": Event;
+    "stop": Event;
+}
+
+interface MediaRecorder extends EventTarget {
+    readonly audioBitsPerSecond: number;
+    readonly mimeType: string;
+    ondataavailable: ((this: MediaRecorder, ev: BlobEvent) => any) | null;
+    onerror: ((this: MediaRecorder, ev: Event) => any) | null;
+    onpause: ((this: MediaRecorder, ev: Event) => any) | null;
+    onresume: ((this: MediaRecorder, ev: Event) => any) | null;
+    onstart: ((this: MediaRecorder, ev: Event) => any) | null;
+    onstop: ((this: MediaRecorder, ev: Event) => any) | null;
+    readonly state: RecordingState;
+    readonly stream: MediaStream;
+    readonly videoBitsPerSecond: number;
+    pause(): void;
+    requestData(): void;
+    resume(): void;
+    start(timeslice?: number): void;
+    stop(): void;
+    addEventListener<K extends keyof MediaRecorderEventMap>(type: K, listener: (this: MediaRecorder, ev: MediaRecorderEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MediaRecorderEventMap>(type: K, listener: (this: MediaRecorder, ev: MediaRecorderEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var MediaRecorder: {
+    prototype: MediaRecorder;
+    new(stream: MediaStream, options?: MediaRecorderOptions): MediaRecorder;
+    isTypeSupported(type: string): boolean;
+};
+
+interface MediaSession {
+    metadata: MediaMetadata | null;
+    playbackState: MediaSessionPlaybackState;
+    setActionHandler(action: MediaSessionAction, handler: MediaSessionActionHandler | null): void;
+    setPositionState(state?: MediaPositionState): void;
+}
+
+declare var MediaSession: {
+    prototype: MediaSession;
+    new(): MediaSession;
+};
+
+interface MediaSourceEventMap {
+    "sourceclose": Event;
+    "sourceended": Event;
+    "sourceopen": Event;
+}
+
+/** This Media Source Extensions API interface represents a source of media data for an HTMLMediaElement object. A MediaSource object can be attached to a HTMLMediaElement to be played in the user agent. */
+interface MediaSource extends EventTarget {
+    readonly activeSourceBuffers: SourceBufferList;
+    duration: number;
+    onsourceclose: ((this: MediaSource, ev: Event) => any) | null;
+    onsourceended: ((this: MediaSource, ev: Event) => any) | null;
+    onsourceopen: ((this: MediaSource, ev: Event) => any) | null;
+    readonly readyState: ReadyState;
+    readonly sourceBuffers: SourceBufferList;
+    addSourceBuffer(type: string): SourceBuffer;
+    clearLiveSeekableRange(): void;
+    endOfStream(error?: EndOfStreamError): void;
+    removeSourceBuffer(sourceBuffer: SourceBuffer): void;
+    setLiveSeekableRange(start: number, end: number): void;
+    addEventListener<K extends keyof MediaSourceEventMap>(type: K, listener: (this: MediaSource, ev: MediaSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MediaSourceEventMap>(type: K, listener: (this: MediaSource, ev: MediaSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var MediaSource: {
+    prototype: MediaSource;
+    new(): MediaSource;
+    isTypeSupported(type: string): boolean;
+};
+
+interface MediaStreamEventMap {
+    "addtrack": MediaStreamTrackEvent;
+    "removetrack": MediaStreamTrackEvent;
+}
+
+/** A stream of media content. A stream consists of several tracks such as\xA0video or audio tracks. Each track is specified as an instance of MediaStreamTrack. */
+interface MediaStream extends EventTarget {
+    readonly active: boolean;
+    readonly id: string;
+    onaddtrack: ((this: MediaStream, ev: MediaStreamTrackEvent) => any) | null;
+    onremovetrack: ((this: MediaStream, ev: MediaStreamTrackEvent) => any) | null;
+    addTrack(track: MediaStreamTrack): void;
+    clone(): MediaStream;
+    getAudioTracks(): MediaStreamTrack[];
+    getTrackById(trackId: string): MediaStreamTrack | null;
+    getTracks(): MediaStreamTrack[];
+    getVideoTracks(): MediaStreamTrack[];
+    removeTrack(track: MediaStreamTrack): void;
+    addEventListener<K extends keyof MediaStreamEventMap>(type: K, listener: (this: MediaStream, ev: MediaStreamEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MediaStreamEventMap>(type: K, listener: (this: MediaStream, ev: MediaStreamEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var MediaStream: {
+    prototype: MediaStream;
+    new(): MediaStream;
+    new(stream: MediaStream): MediaStream;
+    new(tracks: MediaStreamTrack[]): MediaStream;
+};
+
+interface MediaStreamAudioDestinationNode extends AudioNode {
+    readonly stream: MediaStream;
+}
+
+declare var MediaStreamAudioDestinationNode: {
+    prototype: MediaStreamAudioDestinationNode;
+    new(context: AudioContext, options?: AudioNodeOptions): MediaStreamAudioDestinationNode;
+};
+
+/** A type of AudioNode which operates as an audio source whose media is received from a MediaStream obtained using the WebRTC or Media Capture and Streams APIs. */
+interface MediaStreamAudioSourceNode extends AudioNode {
+    readonly mediaStream: MediaStream;
+}
+
+declare var MediaStreamAudioSourceNode: {
+    prototype: MediaStreamAudioSourceNode;
+    new(context: AudioContext, options: MediaStreamAudioSourceOptions): MediaStreamAudioSourceNode;
+};
+
+interface MediaStreamTrackEventMap {
+    "ended": Event;
+    "mute": Event;
+    "unmute": Event;
+}
+
+/** A single media track within a stream; typically, these are audio or video tracks, but other track types may exist as well. */
+interface MediaStreamTrack extends EventTarget {
+    contentHint: string;
+    enabled: boolean;
+    readonly id: string;
+    readonly kind: string;
+    readonly label: string;
+    readonly muted: boolean;
+    onended: ((this: MediaStreamTrack, ev: Event) => any) | null;
+    onmute: ((this: MediaStreamTrack, ev: Event) => any) | null;
+    onunmute: ((this: MediaStreamTrack, ev: Event) => any) | null;
+    readonly readyState: MediaStreamTrackState;
+    applyConstraints(constraints?: MediaTrackConstraints): Promise<void>;
+    clone(): MediaStreamTrack;
+    getCapabilities(): MediaTrackCapabilities;
+    getConstraints(): MediaTrackConstraints;
+    getSettings(): MediaTrackSettings;
+    stop(): void;
+    addEventListener<K extends keyof MediaStreamTrackEventMap>(type: K, listener: (this: MediaStreamTrack, ev: MediaStreamTrackEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MediaStreamTrackEventMap>(type: K, listener: (this: MediaStreamTrack, ev: MediaStreamTrackEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var MediaStreamTrack: {
+    prototype: MediaStreamTrack;
+    new(): MediaStreamTrack;
+};
+
+/** Events which indicate that a MediaStream has had tracks added to or removed from the stream through calls to Media Stream API methods. These events are sent to the stream when these changes occur. */
+interface MediaStreamTrackEvent extends Event {
+    readonly track: MediaStreamTrack;
+}
+
+declare var MediaStreamTrackEvent: {
+    prototype: MediaStreamTrackEvent;
+    new(type: string, eventInitDict: MediaStreamTrackEventInit): MediaStreamTrackEvent;
+};
+
+/** This Channel Messaging API interface allows us to create a new message channel and send data through it via its two MessagePort properties. */
+interface MessageChannel {
+    /** Returns the first MessagePort object. */
+    readonly port1: MessagePort;
+    /** Returns the second MessagePort object. */
+    readonly port2: MessagePort;
+}
+
+declare var MessageChannel: {
+    prototype: MessageChannel;
+    new(): MessageChannel;
+};
+
+/** A message received by a target object. */
+interface MessageEvent<T = any> extends Event {
+    /** Returns the data of the message. */
+    readonly data: T;
+    /** Returns the last event ID string, for server-sent events. */
+    readonly lastEventId: string;
+    /** Returns the origin of the message, for server-sent events and cross-document messaging. */
+    readonly origin: string;
+    /** Returns the MessagePort array sent with the message, for cross-document messaging and channel messaging. */
+    readonly ports: ReadonlyArray<MessagePort>;
+    /** Returns the WindowProxy of the source window, for cross-document messaging, and the MessagePort being attached, in the connect event fired at SharedWorkerGlobalScope objects. */
+    readonly source: MessageEventSource | null;
+    /** @deprecated */
+    initMessageEvent(type: string, bubbles?: boolean, cancelable?: boolean, data?: any, origin?: string, lastEventId?: string, source?: MessageEventSource | null, ports?: MessagePort[]): void;
+}
+
+declare var MessageEvent: {
+    prototype: MessageEvent;
+    new<T>(type: string, eventInitDict?: MessageEventInit<T>): MessageEvent<T>;
+};
+
+interface MessagePortEventMap {
+    "message": MessageEvent;
+    "messageerror": MessageEvent;
+}
+
+/** This Channel Messaging API interface represents one of the two ports of a MessageChannel, allowing messages to be sent from one port and listening out for them arriving at the other. */
+interface MessagePort extends EventTarget {
+    onmessage: ((this: MessagePort, ev: MessageEvent) => any) | null;
+    onmessageerror: ((this: MessagePort, ev: MessageEvent) => any) | null;
+    /** Disconnects the port, so that it is no longer active. */
+    close(): void;
+    /**
+     * Posts a message through the channel. Objects listed in transfer are transferred, not just cloned, meaning that they are no longer usable on the sending side.
+     *
+     * Throws a "DataCloneError" DOMException if transfer contains duplicate objects or port, or if message could not be cloned.
+     */
+    postMessage(message: any, transfer: Transferable[]): void;
+    postMessage(message: any, options?: StructuredSerializeOptions): void;
+    /** Begins dispatching messages received on the port. */
+    start(): void;
+    addEventListener<K extends keyof MessagePortEventMap>(type: K, listener: (this: MessagePort, ev: MessagePortEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MessagePortEventMap>(type: K, listener: (this: MessagePort, ev: MessagePortEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var MessagePort: {
+    prototype: MessagePort;
+    new(): MessagePort;
+};
+
+/**
+ * Provides contains information about a MIME type associated with a particular plugin. NavigatorPlugins.mimeTypes returns an array of this object.
+ * @deprecated
+ */
+interface MimeType {
+    /**
+     * Returns the MIME type's description.
+     * @deprecated
+     */
+    readonly description: string;
+    /**
+     * Returns the Plugin object that implements this MIME type.
+     * @deprecated
+     */
+    readonly enabledPlugin: Plugin;
+    /**
+     * Returns the MIME type's typical file extensions, in a comma-separated list.
+     * @deprecated
+     */
+    readonly suffixes: string;
+    /**
+     * Returns the MIME type.
+     * @deprecated
+     */
+    readonly type: string;
+}
+
+/** @deprecated */
+declare var MimeType: {
+    prototype: MimeType;
+    new(): MimeType;
+};
+
+/**
+ * Returns an array of MimeType instances, each of which contains information\xA0about a supported browser plugins. This object is returned by NavigatorPlugins.mimeTypes.
+ * @deprecated
+ */
+interface MimeTypeArray {
+    /** @deprecated */
+    readonly length: number;
+    /** @deprecated */
+    item(index: number): MimeType | null;
+    /** @deprecated */
+    namedItem(name: string): MimeType | null;
+    [index: number]: MimeType;
+}
+
+/** @deprecated */
+declare var MimeTypeArray: {
+    prototype: MimeTypeArray;
+    new(): MimeTypeArray;
+};
+
+/** Events that occur due to the user interacting with a pointing device (such as a mouse). Common events using this interface include click, dblclick, mouseup, mousedown. */
+interface MouseEvent extends UIEvent {
+    readonly altKey: boolean;
+    readonly button: number;
+    readonly buttons: number;
+    readonly clientX: number;
+    readonly clientY: number;
+    readonly ctrlKey: boolean;
+    readonly metaKey: boolean;
+    readonly movementX: number;
+    readonly movementY: number;
+    readonly offsetX: number;
+    readonly offsetY: number;
+    readonly pageX: number;
+    readonly pageY: number;
+    readonly relatedTarget: EventTarget | null;
+    readonly screenX: number;
+    readonly screenY: number;
+    readonly shiftKey: boolean;
+    readonly x: number;
+    readonly y: number;
+    getModifierState(keyArg: string): boolean;
+    /** @deprecated */
+    initMouseEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget | null): void;
+}
+
+declare var MouseEvent: {
+    prototype: MouseEvent;
+    new(type: string, eventInitDict?: MouseEventInit): MouseEvent;
+};
+
+/**
+ * Provides event properties that are specific to modifications to the Document Object Model (DOM) hierarchy and nodes.
+ * @deprecated DOM4 [DOM] provides a new mechanism using a MutationObserver interface which addresses the use cases that mutation events solve, but in a more performant manner. Thus, this specification describes mutation events for reference and completeness of legacy behavior, but deprecates the use of the MutationEvent interface.
+ */
+interface MutationEvent extends Event {
+    /** @deprecated */
+    readonly attrChange: number;
+    /** @deprecated */
+    readonly attrName: string;
+    /** @deprecated */
+    readonly newValue: string;
+    /** @deprecated */
+    readonly prevValue: string;
+    /** @deprecated */
+    readonly relatedNode: Node | null;
+    /** @deprecated */
+    initMutationEvent(typeArg: string, bubblesArg?: boolean, cancelableArg?: boolean, relatedNodeArg?: Node | null, prevValueArg?: string, newValueArg?: string, attrNameArg?: string, attrChangeArg?: number): void;
+    readonly MODIFICATION: 1;
+    readonly ADDITION: 2;
+    readonly REMOVAL: 3;
+}
+
+/** @deprecated */
+declare var MutationEvent: {
+    prototype: MutationEvent;
+    new(): MutationEvent;
+    readonly MODIFICATION: 1;
+    readonly ADDITION: 2;
+    readonly REMOVAL: 3;
+};
+
+/** Provides the ability to watch for changes being made to the DOM tree. It is designed as a replacement for the older Mutation Events feature which was part of the DOM3 Events specification. */
+interface MutationObserver {
+    /** Stops observer from observing any mutations. Until the observe() method is used again, observer's callback will not be invoked. */
+    disconnect(): void;
+    /**
+     * Instructs the user agent to observe a given target (a node) and report any mutations based on the criteria given by options (an object).
+     *
+     * The options argument allows for setting mutation observation options via object members.
+     */
+    observe(target: Node, options?: MutationObserverInit): void;
+    /** Empties the record queue and returns what was in there. */
+    takeRecords(): MutationRecord[];
+}
+
+declare var MutationObserver: {
+    prototype: MutationObserver;
+    new(callback: MutationCallback): MutationObserver;
+};
+
+/** A MutationRecord represents an individual DOM mutation. It is the object that is passed to MutationObserver's callback. */
+interface MutationRecord {
+    /** Return the nodes added and removed respectively. */
+    readonly addedNodes: NodeList;
+    /** Returns the local name of the changed attribute, and null otherwise. */
+    readonly attributeName: string | null;
+    /** Returns the namespace of the changed attribute, and null otherwise. */
+    readonly attributeNamespace: string | null;
+    /** Return the previous and next sibling respectively of the added or removed nodes, and null otherwise. */
+    readonly nextSibling: Node | null;
+    /** The return value depends on type. For "attributes", it is the value of the changed attribute before the change. For "characterData", it is the data of the changed node before the change. For "childList", it is null. */
+    readonly oldValue: string | null;
+    /** Return the previous and next sibling respectively of the added or removed nodes, and null otherwise. */
+    readonly previousSibling: Node | null;
+    /** Return the nodes added and removed respectively. */
+    readonly removedNodes: NodeList;
+    /** Returns the node the mutation affected, depending on the type. For "attributes", it is the element whose attribute changed. For "characterData", it is the CharacterData node. For "childList", it is the node whose children changed. */
+    readonly target: Node;
+    /** Returns "attributes" if it was an attribute mutation. "characterData" if it was a mutation to a CharacterData node. And "childList" if it was a mutation to the tree of nodes. */
+    readonly type: MutationRecordType;
+}
+
+declare var MutationRecord: {
+    prototype: MutationRecord;
+    new(): MutationRecord;
+};
+
+/** A collection of Attr objects. Objects inside a NamedNodeMap are not in any particular order, unlike NodeList, although they may be accessed by an index as in an array. */
+interface NamedNodeMap {
+    readonly length: number;
+    getNamedItem(qualifiedName: string): Attr | null;
+    getNamedItemNS(namespace: string | null, localName: string): Attr | null;
+    item(index: number): Attr | null;
+    removeNamedItem(qualifiedName: string): Attr;
+    removeNamedItemNS(namespace: string | null, localName: string): Attr;
+    setNamedItem(attr: Attr): Attr | null;
+    setNamedItemNS(attr: Attr): Attr | null;
+    [index: number]: Attr;
+}
+
+declare var NamedNodeMap: {
+    prototype: NamedNodeMap;
+    new(): NamedNodeMap;
+};
+
+/** Available only in secure contexts. */
+interface NavigationPreloadManager {
+    disable(): Promise<void>;
+    enable(): Promise<void>;
+    getState(): Promise<NavigationPreloadState>;
+    setHeaderValue(value: string): Promise<void>;
+}
+
+declare var NavigationPreloadManager: {
+    prototype: NavigationPreloadManager;
+    new(): NavigationPreloadManager;
+};
+
+/** The state and the identity of the user agent. It allows scripts to query it and to register themselves to carry on some activities. */
+interface Navigator extends NavigatorAutomationInformation, NavigatorConcurrentHardware, NavigatorContentUtils, NavigatorCookies, NavigatorID, NavigatorLanguage, NavigatorLocks, NavigatorOnLine, NavigatorPlugins, NavigatorStorage {
+    /** Available only in secure contexts. */
+    readonly clipboard: Clipboard;
+    /** Available only in secure contexts. */
+    readonly credentials: CredentialsContainer;
+    readonly doNotTrack: string | null;
+    readonly geolocation: Geolocation;
+    readonly maxTouchPoints: number;
+    readonly mediaCapabilities: MediaCapabilities;
+    /** Available only in secure contexts. */
+    readonly mediaDevices: MediaDevices;
+    readonly mediaSession: MediaSession;
+    readonly permissions: Permissions;
+    /** Available only in secure contexts. */
+    readonly serviceWorker: ServiceWorkerContainer;
+    /** Available only in secure contexts. */
+    canShare(data?: ShareData): boolean;
+    getGamepads(): (Gamepad | null)[];
+    /** Available only in secure contexts. */
+    requestMIDIAccess(options?: MIDIOptions): Promise<MIDIAccess>;
+    /** Available only in secure contexts. */
+    requestMediaKeySystemAccess(keySystem: string, supportedConfigurations: MediaKeySystemConfiguration[]): Promise<MediaKeySystemAccess>;
+    sendBeacon(url: string | URL, data?: BodyInit | null): boolean;
+    /** Available only in secure contexts. */
+    share(data?: ShareData): Promise<void>;
+    vibrate(pattern: VibratePattern): boolean;
+}
+
+declare var Navigator: {
+    prototype: Navigator;
+    new(): Navigator;
+};
+
+interface NavigatorAutomationInformation {
+    readonly webdriver: boolean;
+}
+
+interface NavigatorConcurrentHardware {
+    readonly hardwareConcurrency: number;
+}
+
+interface NavigatorContentUtils {
+    /** Available only in secure contexts. */
+    registerProtocolHandler(scheme: string, url: string | URL): void;
+}
+
+interface NavigatorCookies {
+    readonly cookieEnabled: boolean;
+}
+
+interface NavigatorID {
+    /** @deprecated */
+    readonly appCodeName: string;
+    /** @deprecated */
+    readonly appName: string;
+    /** @deprecated */
+    readonly appVersion: string;
+    /** @deprecated */
+    readonly platform: string;
+    /** @deprecated */
+    readonly product: string;
+    /** @deprecated */
+    readonly productSub: string;
+    readonly userAgent: string;
+    /** @deprecated */
+    readonly vendor: string;
+    /** @deprecated */
+    readonly vendorSub: string;
+}
+
+interface NavigatorLanguage {
+    readonly language: string;
+    readonly languages: ReadonlyArray<string>;
+}
+
+/** Available only in secure contexts. */
+interface NavigatorLocks {
+    readonly locks: LockManager;
+}
+
+interface NavigatorOnLine {
+    readonly onLine: boolean;
+}
+
+interface NavigatorPlugins {
+    /** @deprecated */
+    readonly mimeTypes: MimeTypeArray;
+    readonly pdfViewerEnabled: boolean;
+    /** @deprecated */
+    readonly plugins: PluginArray;
+    /** @deprecated */
+    javaEnabled(): boolean;
+}
+
+/** Available only in secure contexts. */
+interface NavigatorStorage {
+    readonly storage: StorageManager;
+}
+
+/** Node is an interface from which a number of DOM API object types inherit. It allows those types to be treated similarly; for example, inheriting the same set of methods, or being tested in the same way. */
+interface Node extends EventTarget {
+    /** Returns node's node document's document base URL. */
+    readonly baseURI: string;
+    /** Returns the children. */
+    readonly childNodes: NodeListOf<ChildNode>;
+    /** Returns the first child. */
+    readonly firstChild: ChildNode | null;
+    /** Returns true if node is connected and false otherwise. */
+    readonly isConnected: boolean;
+    /** Returns the last child. */
+    readonly lastChild: ChildNode | null;
+    /** Returns the next sibling. */
+    readonly nextSibling: ChildNode | null;
+    /** Returns a string appropriate for the type of node. */
+    readonly nodeName: string;
+    /** Returns the type of node. */
+    readonly nodeType: number;
+    nodeValue: string | null;
+    /** Returns the node document. Returns null for documents. */
+    readonly ownerDocument: Document | null;
+    /** Returns the parent element. */
+    readonly parentElement: HTMLElement | null;
+    /** Returns the parent. */
+    readonly parentNode: ParentNode | null;
+    /** Returns the previous sibling. */
+    readonly previousSibling: ChildNode | null;
+    textContent: string | null;
+    appendChild<T extends Node>(node: T): T;
+    /** Returns a copy of node. If deep is true, the copy also includes the node's descendants. */
+    cloneNode(deep?: boolean): Node;
+    /** Returns a bitmask indicating the position of other relative to node. */
+    compareDocumentPosition(other: Node): number;
+    /** Returns true if other is an inclusive descendant of node, and false otherwise. */
+    contains(other: Node | null): boolean;
+    /** Returns node's root. */
+    getRootNode(options?: GetRootNodeOptions): Node;
+    /** Returns whether node has children. */
+    hasChildNodes(): boolean;
+    insertBefore<T extends Node>(node: T, child: Node | null): T;
+    isDefaultNamespace(namespace: string | null): boolean;
+    /** Returns whether node and otherNode have the same properties. */
+    isEqualNode(otherNode: Node | null): boolean;
+    isSameNode(otherNode: Node | null): boolean;
+    lookupNamespaceURI(prefix: string | null): string | null;
+    lookupPrefix(namespace: string | null): string | null;
+    /** Removes empty exclusive Text nodes and concatenates the data of remaining contiguous exclusive Text nodes into the first of their nodes. */
+    normalize(): void;
+    removeChild<T extends Node>(child: T): T;
+    replaceChild<T extends Node>(node: Node, child: T): T;
+    /** node is an element. */
+    readonly ELEMENT_NODE: 1;
+    readonly ATTRIBUTE_NODE: 2;
+    /** node is a Text node. */
+    readonly TEXT_NODE: 3;
+    /** node is a CDATASection node. */
+    readonly CDATA_SECTION_NODE: 4;
+    readonly ENTITY_REFERENCE_NODE: 5;
+    readonly ENTITY_NODE: 6;
+    /** node is a ProcessingInstruction node. */
+    readonly PROCESSING_INSTRUCTION_NODE: 7;
+    /** node is a Comment node. */
+    readonly COMMENT_NODE: 8;
+    /** node is a document. */
+    readonly DOCUMENT_NODE: 9;
+    /** node is a doctype. */
+    readonly DOCUMENT_TYPE_NODE: 10;
+    /** node is a DocumentFragment node. */
+    readonly DOCUMENT_FRAGMENT_NODE: 11;
+    readonly NOTATION_NODE: 12;
+    /** Set when node and other are not in the same tree. */
+    readonly DOCUMENT_POSITION_DISCONNECTED: 0x01;
+    /** Set when other is preceding node. */
+    readonly DOCUMENT_POSITION_PRECEDING: 0x02;
+    /** Set when other is following node. */
+    readonly DOCUMENT_POSITION_FOLLOWING: 0x04;
+    /** Set when other is an ancestor of node. */
+    readonly DOCUMENT_POSITION_CONTAINS: 0x08;
+    /** Set when other is a descendant of node. */
+    readonly DOCUMENT_POSITION_CONTAINED_BY: 0x10;
+    readonly DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20;
+}
+
+declare var Node: {
+    prototype: Node;
+    new(): Node;
+    /** node is an element. */
+    readonly ELEMENT_NODE: 1;
+    readonly ATTRIBUTE_NODE: 2;
+    /** node is a Text node. */
+    readonly TEXT_NODE: 3;
+    /** node is a CDATASection node. */
+    readonly CDATA_SECTION_NODE: 4;
+    readonly ENTITY_REFERENCE_NODE: 5;
+    readonly ENTITY_NODE: 6;
+    /** node is a ProcessingInstruction node. */
+    readonly PROCESSING_INSTRUCTION_NODE: 7;
+    /** node is a Comment node. */
+    readonly COMMENT_NODE: 8;
+    /** node is a document. */
+    readonly DOCUMENT_NODE: 9;
+    /** node is a doctype. */
+    readonly DOCUMENT_TYPE_NODE: 10;
+    /** node is a DocumentFragment node. */
+    readonly DOCUMENT_FRAGMENT_NODE: 11;
+    readonly NOTATION_NODE: 12;
+    /** Set when node and other are not in the same tree. */
+    readonly DOCUMENT_POSITION_DISCONNECTED: 0x01;
+    /** Set when other is preceding node. */
+    readonly DOCUMENT_POSITION_PRECEDING: 0x02;
+    /** Set when other is following node. */
+    readonly DOCUMENT_POSITION_FOLLOWING: 0x04;
+    /** Set when other is an ancestor of node. */
+    readonly DOCUMENT_POSITION_CONTAINS: 0x08;
+    /** Set when other is a descendant of node. */
+    readonly DOCUMENT_POSITION_CONTAINED_BY: 0x10;
+    readonly DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20;
+};
+
+/** An iterator over the members of a list of the nodes in a subtree of the DOM. The nodes will be returned in document order. */
+interface NodeIterator {
+    readonly filter: NodeFilter | null;
+    readonly pointerBeforeReferenceNode: boolean;
+    readonly referenceNode: Node;
+    readonly root: Node;
+    readonly whatToShow: number;
+    /** @deprecated */
+    detach(): void;
+    nextNode(): Node | null;
+    previousNode(): Node | null;
+}
+
+declare var NodeIterator: {
+    prototype: NodeIterator;
+    new(): NodeIterator;
+};
+
+/** NodeList objects are collections of nodes, usually returned by properties such as Node.childNodes and methods such as document.querySelectorAll(). */
+interface NodeList {
+    /** Returns the number of nodes in the collection. */
+    readonly length: number;
+    /** Returns the node with index index from the collection. The nodes are sorted in tree order. */
+    item(index: number): Node | null;
+    /**
+     * Performs the specified action for each node in an list.
+     * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the list.
+     * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: Node, key: number, parent: NodeList) => void, thisArg?: any): void;
+    [index: number]: Node;
+}
+
+declare var NodeList: {
+    prototype: NodeList;
+    new(): NodeList;
+};
+
+interface NodeListOf<TNode extends Node> extends NodeList {
+    item(index: number): TNode;
+    /**
+     * Performs the specified action for each node in an list.
+     * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the list.
+     * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: TNode, key: number, parent: NodeListOf<TNode>) => void, thisArg?: any): void;
+    [index: number]: TNode;
+}
+
+interface NonDocumentTypeChildNode {
+    /** Returns the first following sibling that is an element, and null otherwise. */
+    readonly nextElementSibling: Element | null;
+    /** Returns the first preceding sibling that is an element, and null otherwise. */
+    readonly previousElementSibling: Element | null;
+}
+
+interface NonElementParentNode {
+    /** Returns the first element within node's descendants whose ID is elementId. */
+    getElementById(elementId: string): Element | null;
+}
+
+interface NotificationEventMap {
+    "click": Event;
+    "close": Event;
+    "error": Event;
+    "show": Event;
+}
+
+/** This Notifications API interface is used to configure and display desktop notifications to the user. */
+interface Notification extends EventTarget {
+    readonly body: string;
+    readonly data: any;
+    readonly dir: NotificationDirection;
+    readonly icon: string;
+    readonly lang: string;
+    onclick: ((this: Notification, ev: Event) => any) | null;
+    onclose: ((this: Notification, ev: Event) => any) | null;
+    onerror: ((this: Notification, ev: Event) => any) | null;
+    onshow: ((this: Notification, ev: Event) => any) | null;
+    readonly tag: string;
+    readonly title: string;
+    close(): void;
+    addEventListener<K extends keyof NotificationEventMap>(type: K, listener: (this: Notification, ev: NotificationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof NotificationEventMap>(type: K, listener: (this: Notification, ev: NotificationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var Notification: {
+    prototype: Notification;
+    new(title: string, options?: NotificationOptions): Notification;
+    readonly permission: NotificationPermission;
+    requestPermission(deprecatedCallback?: NotificationPermissionCallback): Promise<NotificationPermission>;
+};
+
+interface OES_draw_buffers_indexed {
+    blendEquationSeparateiOES(buf: GLuint, modeRGB: GLenum, modeAlpha: GLenum): void;
+    blendEquationiOES(buf: GLuint, mode: GLenum): void;
+    blendFuncSeparateiOES(buf: GLuint, srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum): void;
+    blendFunciOES(buf: GLuint, src: GLenum, dst: GLenum): void;
+    colorMaskiOES(buf: GLuint, r: GLboolean, g: GLboolean, b: GLboolean, a: GLboolean): void;
+    disableiOES(target: GLenum, index: GLuint): void;
+    enableiOES(target: GLenum, index: GLuint): void;
+}
+
+/** The OES_element_index_uint extension is part of the WebGL API and adds support for gl.UNSIGNED_INT types to WebGLRenderingContext.drawElements(). */
+interface OES_element_index_uint {
+}
+
+interface OES_fbo_render_mipmap {
+}
+
+/** The OES_standard_derivatives extension is part of the WebGL API and adds the GLSL derivative functions dFdx, dFdy, and fwidth. */
+interface OES_standard_derivatives {
+    readonly FRAGMENT_SHADER_DERIVATIVE_HINT_OES: 0x8B8B;
+}
+
+/** The OES_texture_float extension is part of the WebGL API and exposes floating-point pixel types for textures. */
+interface OES_texture_float {
+}
+
+/** The OES_texture_float_linear extension is part of the WebGL API and allows linear filtering with floating-point pixel types for textures. */
+interface OES_texture_float_linear {
+}
+
+/** The OES_texture_half_float extension is part of the WebGL API and adds texture formats with 16- (aka half float) and 32-bit floating-point components. */
+interface OES_texture_half_float {
+    readonly HALF_FLOAT_OES: 0x8D61;
+}
+
+/** The OES_texture_half_float_linear extension is part of the WebGL API and allows linear filtering with half floating-point pixel types for textures. */
+interface OES_texture_half_float_linear {
+}
+
+interface OES_vertex_array_object {
+    bindVertexArrayOES(arrayObject: WebGLVertexArrayObjectOES | null): void;
+    createVertexArrayOES(): WebGLVertexArrayObjectOES | null;
+    deleteVertexArrayOES(arrayObject: WebGLVertexArrayObjectOES | null): void;
+    isVertexArrayOES(arrayObject: WebGLVertexArrayObjectOES | null): GLboolean;
+    readonly VERTEX_ARRAY_BINDING_OES: 0x85B5;
+}
+
+interface OVR_multiview2 {
+    framebufferTextureMultiviewOVR(target: GLenum, attachment: GLenum, texture: WebGLTexture | null, level: GLint, baseViewIndex: GLint, numViews: GLsizei): void;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR: 0x9630;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR: 0x9632;
+    readonly MAX_VIEWS_OVR: 0x9631;
+    readonly FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR: 0x9633;
+}
+
+/** The Web Audio API OfflineAudioCompletionEvent interface represents events that occur when the processing of an OfflineAudioContext is terminated. The complete event implements this interface. */
+interface OfflineAudioCompletionEvent extends Event {
+    readonly renderedBuffer: AudioBuffer;
+}
+
+declare var OfflineAudioCompletionEvent: {
+    prototype: OfflineAudioCompletionEvent;
+    new(type: string, eventInitDict: OfflineAudioCompletionEventInit): OfflineAudioCompletionEvent;
+};
+
+interface OfflineAudioContextEventMap extends BaseAudioContextEventMap {
+    "complete": OfflineAudioCompletionEvent;
+}
+
+/** An AudioContext interface representing an audio-processing graph built from linked together AudioNodes. In contrast with a standard AudioContext, an OfflineAudioContext doesn't render the audio to the device hardware; instead, it generates it, as fast as it can, and outputs the result to an AudioBuffer. */
+interface OfflineAudioContext extends BaseAudioContext {
+    readonly length: number;
+    oncomplete: ((this: OfflineAudioContext, ev: OfflineAudioCompletionEvent) => any) | null;
+    resume(): Promise<void>;
+    startRendering(): Promise<AudioBuffer>;
+    suspend(suspendTime: number): Promise<void>;
+    addEventListener<K extends keyof OfflineAudioContextEventMap>(type: K, listener: (this: OfflineAudioContext, ev: OfflineAudioContextEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof OfflineAudioContextEventMap>(type: K, listener: (this: OfflineAudioContext, ev: OfflineAudioContextEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var OfflineAudioContext: {
+    prototype: OfflineAudioContext;
+    new(contextOptions: OfflineAudioContextOptions): OfflineAudioContext;
+    new(numberOfChannels: number, length: number, sampleRate: number): OfflineAudioContext;
+};
+
+interface OffscreenCanvasEventMap {
+    "contextlost": Event;
+    "contextrestored": Event;
+}
+
+interface OffscreenCanvas extends EventTarget {
+    /**
+     * These attributes return the dimensions of the OffscreenCanvas object's bitmap.
+     *
+     * They can be set, to replace the bitmap with a new, transparent black bitmap of the specified dimensions (effectively resizing it).
+     */
+    height: number;
+    oncontextlost: ((this: OffscreenCanvas, ev: Event) => any) | null;
+    oncontextrestored: ((this: OffscreenCanvas, ev: Event) => any) | null;
+    /**
+     * These attributes return the dimensions of the OffscreenCanvas object's bitmap.
+     *
+     * They can be set, to replace the bitmap with a new, transparent black bitmap of the specified dimensions (effectively resizing it).
+     */
+    width: number;
+    /**
+     * Returns a promise that will fulfill with a new Blob object representing a file containing the image in the OffscreenCanvas object.
+     *
+     * The argument, if provided, is a dictionary that controls the encoding options of the image file to be created. The type field specifies the file format and has a default value of "image/png"; that type is also used if the requested type isn't supported. If the image format supports variable quality (such as "image/jpeg"), then the quality field is a number in the range 0.0 to 1.0 inclusive indicating the desired quality level for the resulting image.
+     */
+    convertToBlob(options?: ImageEncodeOptions): Promise<Blob>;
+    /**
+     * Returns an object that exposes an API for drawing on the OffscreenCanvas object. contextId specifies the desired API: "2d", "bitmaprenderer", "webgl", or "webgl2". options is handled by that API.
+     *
+     * This specification defines the "2d" context below, which is similar but distinct from the "2d" context that is created from a canvas element. The WebGL specifications define the "webgl" and "webgl2" contexts. [WEBGL]
+     *
+     * Returns null if the canvas has already been initialized with another context type (e.g., trying to get a "2d" context after getting a "webgl" context).
+     */
+    getContext(contextId: "2d", options?: any): OffscreenCanvasRenderingContext2D | null;
+    getContext(contextId: "bitmaprenderer", options?: any): ImageBitmapRenderingContext | null;
+    getContext(contextId: "webgl", options?: any): WebGLRenderingContext | null;
+    getContext(contextId: "webgl2", options?: any): WebGL2RenderingContext | null;
+    getContext(contextId: OffscreenRenderingContextId, options?: any): OffscreenRenderingContext | null;
+    /** Returns a newly created ImageBitmap object with the image in the OffscreenCanvas object. The image in the OffscreenCanvas object is replaced with a new blank image. */
+    transferToImageBitmap(): ImageBitmap;
+    addEventListener<K extends keyof OffscreenCanvasEventMap>(type: K, listener: (this: OffscreenCanvas, ev: OffscreenCanvasEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof OffscreenCanvasEventMap>(type: K, listener: (this: OffscreenCanvas, ev: OffscreenCanvasEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var OffscreenCanvas: {
+    prototype: OffscreenCanvas;
+    new(width: number, height: number): OffscreenCanvas;
+};
+
+interface OffscreenCanvasRenderingContext2D extends CanvasCompositing, CanvasDrawImage, CanvasDrawPath, CanvasFillStrokeStyles, CanvasFilters, CanvasImageData, CanvasImageSmoothing, CanvasPath, CanvasPathDrawingStyles, CanvasRect, CanvasShadowStyles, CanvasState, CanvasText, CanvasTextDrawingStyles, CanvasTransform {
+    readonly canvas: OffscreenCanvas;
+    commit(): void;
+}
+
+declare var OffscreenCanvasRenderingContext2D: {
+    prototype: OffscreenCanvasRenderingContext2D;
+    new(): OffscreenCanvasRenderingContext2D;
+};
+
+/** The OscillatorNode\xA0interface represents a periodic waveform, such as a sine wave. It is an AudioScheduledSourceNode audio-processing module that causes a specified frequency\xA0of a given wave to be created\u2014in effect, a constant tone. */
+interface OscillatorNode extends AudioScheduledSourceNode {
+    readonly detune: AudioParam;
+    readonly frequency: AudioParam;
+    type: OscillatorType;
+    setPeriodicWave(periodicWave: PeriodicWave): void;
+    addEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: OscillatorNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: OscillatorNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var OscillatorNode: {
+    prototype: OscillatorNode;
+    new(context: BaseAudioContext, options?: OscillatorOptions): OscillatorNode;
+};
+
+interface OverconstrainedError extends Error {
+    readonly constraint: string;
+}
+
+declare var OverconstrainedError: {
+    prototype: OverconstrainedError;
+    new(constraint: string, message?: string): OverconstrainedError;
+};
+
+/** The PageTransitionEvent is fired when a document is being loaded or unloaded. */
+interface PageTransitionEvent extends Event {
+    /**
+     * For the pageshow event, returns false if the page is newly being loaded (and the load event will fire). Otherwise, returns true.
+     *
+     * For the pagehide event, returns false if the page is going away for the last time. Otherwise, returns true, meaning that (if nothing conspires to make the page unsalvageable) the page might be reused if the user navigates back to this page.
+     *
+     * Things that can cause the page to be unsalvageable include:
+     *
+     * The user agent decided to not keep the Document alive in a session history entry after unload
+     * Having iframes that are not salvageable
+     * Active WebSocket objects
+     * Aborting a Document
+     */
+    readonly persisted: boolean;
+}
+
+declare var PageTransitionEvent: {
+    prototype: PageTransitionEvent;
+    new(type: string, eventInitDict?: PageTransitionEventInit): PageTransitionEvent;
+};
+
+/** A PannerNode always has exactly one input and one output: the input can be mono or stereo but the output is always stereo (2 channels); you can't have panning effects without at least two audio channels! */
+interface PannerNode extends AudioNode {
+    coneInnerAngle: number;
+    coneOuterAngle: number;
+    coneOuterGain: number;
+    distanceModel: DistanceModelType;
+    maxDistance: number;
+    readonly orientationX: AudioParam;
+    readonly orientationY: AudioParam;
+    readonly orientationZ: AudioParam;
+    panningModel: PanningModelType;
+    readonly positionX: AudioParam;
+    readonly positionY: AudioParam;
+    readonly positionZ: AudioParam;
+    refDistance: number;
+    rolloffFactor: number;
+    /** @deprecated */
+    setOrientation(x: number, y: number, z: number): void;
+    /** @deprecated */
+    setPosition(x: number, y: number, z: number): void;
+}
+
+declare var PannerNode: {
+    prototype: PannerNode;
+    new(context: BaseAudioContext, options?: PannerOptions): PannerNode;
+};
+
+interface ParentNode extends Node {
+    readonly childElementCount: number;
+    /** Returns the child elements. */
+    readonly children: HTMLCollection;
+    /** Returns the first child that is an element, and null otherwise. */
+    readonly firstElementChild: Element | null;
+    /** Returns the last child that is an element, and null otherwise. */
+    readonly lastElementChild: Element | null;
+    /**
+     * Inserts nodes after the last child of node, while replacing strings in nodes with equivalent Text nodes.
+     *
+     * Throws a "HierarchyRequestError" DOMException if the constraints of the node tree are violated.
+     */
+    append(...nodes: (Node | string)[]): void;
+    /**
+     * Inserts nodes before the first child of node, while replacing strings in nodes with equivalent Text nodes.
+     *
+     * Throws a "HierarchyRequestError" DOMException if the constraints of the node tree are violated.
+     */
+    prepend(...nodes: (Node | string)[]): void;
+    /** Returns the first element that is a descendant of node that matches selectors. */
+    querySelector<K extends keyof HTMLElementTagNameMap>(selectors: K): HTMLElementTagNameMap[K] | null;
+    querySelector<K extends keyof SVGElementTagNameMap>(selectors: K): SVGElementTagNameMap[K] | null;
+    querySelector<K extends keyof MathMLElementTagNameMap>(selectors: K): MathMLElementTagNameMap[K] | null;
+    /** @deprecated */
+    querySelector<K extends keyof HTMLElementDeprecatedTagNameMap>(selectors: K): HTMLElementDeprecatedTagNameMap[K] | null;
+    querySelector<E extends Element = Element>(selectors: string): E | null;
+    /** Returns all element descendants of node that match selectors. */
+    querySelectorAll<K extends keyof HTMLElementTagNameMap>(selectors: K): NodeListOf<HTMLElementTagNameMap[K]>;
+    querySelectorAll<K extends keyof SVGElementTagNameMap>(selectors: K): NodeListOf<SVGElementTagNameMap[K]>;
+    querySelectorAll<K extends keyof MathMLElementTagNameMap>(selectors: K): NodeListOf<MathMLElementTagNameMap[K]>;
+    /** @deprecated */
+    querySelectorAll<K extends keyof HTMLElementDeprecatedTagNameMap>(selectors: K): NodeListOf<HTMLElementDeprecatedTagNameMap[K]>;
+    querySelectorAll<E extends Element = Element>(selectors: string): NodeListOf<E>;
+    /**
+     * Replace all children of node with nodes, while replacing strings in nodes with equivalent Text nodes.
+     *
+     * Throws a "HierarchyRequestError" DOMException if the constraints of the node tree are violated.
+     */
+    replaceChildren(...nodes: (Node | string)[]): void;
+}
+
+/** This Canvas 2D API interface is used to declare a path that can then be used on a CanvasRenderingContext2D object. The path methods of the CanvasRenderingContext2D interface are also present on this interface, which gives you the convenience of being able to retain and replay your path whenever desired. */
+interface Path2D extends CanvasPath {
+    /** Adds to the path the path given by the argument. */
+    addPath(path: Path2D, transform?: DOMMatrix2DInit): void;
+}
+
+declare var Path2D: {
+    prototype: Path2D;
+    new(path?: Path2D | string): Path2D;
+};
+
+/** Available only in secure contexts. */
+interface PaymentMethodChangeEvent extends PaymentRequestUpdateEvent {
+    readonly methodDetails: any;
+    readonly methodName: string;
+}
+
+declare var PaymentMethodChangeEvent: {
+    prototype: PaymentMethodChangeEvent;
+    new(type: string, eventInitDict?: PaymentMethodChangeEventInit): PaymentMethodChangeEvent;
+};
+
+interface PaymentRequestEventMap {
+    "paymentmethodchange": Event;
+}
+
+/**
+ * This Payment Request API interface is the primary access point into the API, and lets web content and apps accept payments from the end user.
+ * Available only in secure contexts.
+ */
+interface PaymentRequest extends EventTarget {
+    readonly id: string;
+    onpaymentmethodchange: ((this: PaymentRequest, ev: Event) => any) | null;
+    abort(): Promise<void>;
+    canMakePayment(): Promise<boolean>;
+    show(detailsPromise?: PaymentDetailsUpdate | PromiseLike<PaymentDetailsUpdate>): Promise<PaymentResponse>;
+    addEventListener<K extends keyof PaymentRequestEventMap>(type: K, listener: (this: PaymentRequest, ev: PaymentRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof PaymentRequestEventMap>(type: K, listener: (this: PaymentRequest, ev: PaymentRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var PaymentRequest: {
+    prototype: PaymentRequest;
+    new(methodData: PaymentMethodData[], details: PaymentDetailsInit): PaymentRequest;
+};
+
+/**
+ * This Payment Request API interface enables a web page to update the details of a PaymentRequest in response to a user action.
+ * Available only in secure contexts.
+ */
+interface PaymentRequestUpdateEvent extends Event {
+    updateWith(detailsPromise: PaymentDetailsUpdate | PromiseLike<PaymentDetailsUpdate>): void;
+}
+
+declare var PaymentRequestUpdateEvent: {
+    prototype: PaymentRequestUpdateEvent;
+    new(type: string, eventInitDict?: PaymentRequestUpdateEventInit): PaymentRequestUpdateEvent;
+};
+
+/**
+ * This Payment Request API interface is returned after a user selects a payment method and approves a payment request.
+ * Available only in secure contexts.
+ */
+interface PaymentResponse extends EventTarget {
+    readonly details: any;
+    readonly methodName: string;
+    readonly requestId: string;
+    complete(result?: PaymentComplete): Promise<void>;
+    retry(errorFields?: PaymentValidationErrors): Promise<void>;
+    toJSON(): any;
+}
+
+declare var PaymentResponse: {
+    prototype: PaymentResponse;
+    new(): PaymentResponse;
+};
+
+interface PerformanceEventMap {
+    "resourcetimingbufferfull": Event;
+}
+
+/** Provides access to performance-related information for the current page. It's part of the High Resolution Time API, but is enhanced by the Performance Timeline API, the Navigation Timing API, the User Timing API, and the Resource Timing API. */
+interface Performance extends EventTarget {
+    readonly eventCounts: EventCounts;
+    /** @deprecated */
+    readonly navigation: PerformanceNavigation;
+    onresourcetimingbufferfull: ((this: Performance, ev: Event) => any) | null;
+    readonly timeOrigin: DOMHighResTimeStamp;
+    /** @deprecated */
+    readonly timing: PerformanceTiming;
+    clearMarks(markName?: string): void;
+    clearMeasures(measureName?: string): void;
+    clearResourceTimings(): void;
+    getEntries(): PerformanceEntryList;
+    getEntriesByName(name: string, type?: string): PerformanceEntryList;
+    getEntriesByType(type: string): PerformanceEntryList;
+    mark(markName: string, markOptions?: PerformanceMarkOptions): PerformanceMark;
+    measure(measureName: string, startOrMeasureOptions?: string | PerformanceMeasureOptions, endMark?: string): PerformanceMeasure;
+    now(): DOMHighResTimeStamp;
+    setResourceTimingBufferSize(maxSize: number): void;
+    toJSON(): any;
+    addEventListener<K extends keyof PerformanceEventMap>(type: K, listener: (this: Performance, ev: PerformanceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof PerformanceEventMap>(type: K, listener: (this: Performance, ev: PerformanceEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var Performance: {
+    prototype: Performance;
+    new(): Performance;
+};
+
+/** Encapsulates a single performance metric that is part of the performance timeline. A performance entry can be directly created by making a performance mark or measure (for example by calling the mark() method) at an explicit point in an application. Performance entries are also created in indirect ways such as loading a resource (such as an image). */
+interface PerformanceEntry {
+    readonly duration: DOMHighResTimeStamp;
+    readonly entryType: string;
+    readonly name: string;
+    readonly startTime: DOMHighResTimeStamp;
+    toJSON(): any;
+}
+
+declare var PerformanceEntry: {
+    prototype: PerformanceEntry;
+    new(): PerformanceEntry;
+};
+
+interface PerformanceEventTiming extends PerformanceEntry {
+    readonly cancelable: boolean;
+    readonly processingEnd: DOMHighResTimeStamp;
+    readonly processingStart: DOMHighResTimeStamp;
+    readonly target: Node | null;
+    toJSON(): any;
+}
+
+declare var PerformanceEventTiming: {
+    prototype: PerformanceEventTiming;
+    new(): PerformanceEventTiming;
+};
+
+/** PerformanceMark\xA0is an abstract interface for PerformanceEntry objects with an entryType of "mark". Entries of this type are created by calling performance.mark() to add a named DOMHighResTimeStamp (the mark) to the browser's performance timeline. */
+interface PerformanceMark extends PerformanceEntry {
+    readonly detail: any;
+}
+
+declare var PerformanceMark: {
+    prototype: PerformanceMark;
+    new(markName: string, markOptions?: PerformanceMarkOptions): PerformanceMark;
+};
+
+/** PerformanceMeasure is an abstract interface for PerformanceEntry objects with an entryType of "measure". Entries of this type are created by calling performance.measure() to add a named DOMHighResTimeStamp (the measure) between two marks to the browser's performance timeline. */
+interface PerformanceMeasure extends PerformanceEntry {
+    readonly detail: any;
+}
+
+declare var PerformanceMeasure: {
+    prototype: PerformanceMeasure;
+    new(): PerformanceMeasure;
+};
+
+/**
+ * The legacy PerformanceNavigation interface represents information about how the navigation to the current document was done.
+ * @deprecated This interface is deprecated in the Navigation Timing Level 2 specification. Please use the PerformanceNavigationTiming interface instead.
+ */
+interface PerformanceNavigation {
+    /** @deprecated */
+    readonly redirectCount: number;
+    /** @deprecated */
+    readonly type: number;
+    /** @deprecated */
+    toJSON(): any;
+    readonly TYPE_NAVIGATE: 0;
+    readonly TYPE_RELOAD: 1;
+    readonly TYPE_BACK_FORWARD: 2;
+    readonly TYPE_RESERVED: 255;
+}
+
+/** @deprecated */
+declare var PerformanceNavigation: {
+    prototype: PerformanceNavigation;
+    new(): PerformanceNavigation;
+    readonly TYPE_NAVIGATE: 0;
+    readonly TYPE_RELOAD: 1;
+    readonly TYPE_BACK_FORWARD: 2;
+    readonly TYPE_RESERVED: 255;
+};
+
+/** Provides methods and properties to store and retrieve metrics regarding the browser's document navigation events. For example, this interface can be used to determine how much time it takes to load or unload a document. */
+interface PerformanceNavigationTiming extends PerformanceResourceTiming {
+    readonly domComplete: DOMHighResTimeStamp;
+    readonly domContentLoadedEventEnd: DOMHighResTimeStamp;
+    readonly domContentLoadedEventStart: DOMHighResTimeStamp;
+    readonly domInteractive: DOMHighResTimeStamp;
+    readonly loadEventEnd: DOMHighResTimeStamp;
+    readonly loadEventStart: DOMHighResTimeStamp;
+    readonly redirectCount: number;
+    readonly type: NavigationTimingType;
+    readonly unloadEventEnd: DOMHighResTimeStamp;
+    readonly unloadEventStart: DOMHighResTimeStamp;
+    toJSON(): any;
+}
+
+declare var PerformanceNavigationTiming: {
+    prototype: PerformanceNavigationTiming;
+    new(): PerformanceNavigationTiming;
+};
+
+interface PerformanceObserver {
+    disconnect(): void;
+    observe(options?: PerformanceObserverInit): void;
+    takeRecords(): PerformanceEntryList;
+}
+
+declare var PerformanceObserver: {
+    prototype: PerformanceObserver;
+    new(callback: PerformanceObserverCallback): PerformanceObserver;
+    readonly supportedEntryTypes: ReadonlyArray<string>;
+};
+
+interface PerformanceObserverEntryList {
+    getEntries(): PerformanceEntryList;
+    getEntriesByName(name: string, type?: string): PerformanceEntryList;
+    getEntriesByType(type: string): PerformanceEntryList;
+}
+
+declare var PerformanceObserverEntryList: {
+    prototype: PerformanceObserverEntryList;
+    new(): PerformanceObserverEntryList;
+};
+
+interface PerformancePaintTiming extends PerformanceEntry {
+}
+
+declare var PerformancePaintTiming: {
+    prototype: PerformancePaintTiming;
+    new(): PerformancePaintTiming;
+};
+
+/** Enables retrieval and analysis of detailed network timing data regarding the loading of an application's resources. An application can use the timing metrics to determine, for example, the length of time it takes to fetch a specific resource, such as an XMLHttpRequest, <SVG>, image, or script. */
+interface PerformanceResourceTiming extends PerformanceEntry {
+    readonly connectEnd: DOMHighResTimeStamp;
+    readonly connectStart: DOMHighResTimeStamp;
+    readonly decodedBodySize: number;
+    readonly domainLookupEnd: DOMHighResTimeStamp;
+    readonly domainLookupStart: DOMHighResTimeStamp;
+    readonly encodedBodySize: number;
+    readonly fetchStart: DOMHighResTimeStamp;
+    readonly initiatorType: string;
+    readonly nextHopProtocol: string;
+    readonly redirectEnd: DOMHighResTimeStamp;
+    readonly redirectStart: DOMHighResTimeStamp;
+    readonly requestStart: DOMHighResTimeStamp;
+    readonly responseEnd: DOMHighResTimeStamp;
+    readonly responseStart: DOMHighResTimeStamp;
+    readonly secureConnectionStart: DOMHighResTimeStamp;
+    readonly serverTiming: ReadonlyArray<PerformanceServerTiming>;
+    readonly transferSize: number;
+    readonly workerStart: DOMHighResTimeStamp;
+    toJSON(): any;
+}
+
+declare var PerformanceResourceTiming: {
+    prototype: PerformanceResourceTiming;
+    new(): PerformanceResourceTiming;
+};
+
+interface PerformanceServerTiming {
+    readonly description: string;
+    readonly duration: DOMHighResTimeStamp;
+    readonly name: string;
+    toJSON(): any;
+}
+
+declare var PerformanceServerTiming: {
+    prototype: PerformanceServerTiming;
+    new(): PerformanceServerTiming;
+};
+
+/**
+ * A legacy interface kept for backwards compatibility and contains properties that offer performance timing information for various events which occur during the loading and use of the current page. You get a PerformanceTiming object describing your page using the window.performance.timing property.
+ * @deprecated This interface is deprecated in the Navigation Timing Level 2 specification. Please use the PerformanceNavigationTiming interface instead.
+ */
+interface PerformanceTiming {
+    /** @deprecated */
+    readonly connectEnd: number;
+    /** @deprecated */
+    readonly connectStart: number;
+    /** @deprecated */
+    readonly domComplete: number;
+    /** @deprecated */
+    readonly domContentLoadedEventEnd: number;
+    /** @deprecated */
+    readonly domContentLoadedEventStart: number;
+    /** @deprecated */
+    readonly domInteractive: number;
+    /** @deprecated */
+    readonly domLoading: number;
+    /** @deprecated */
+    readonly domainLookupEnd: number;
+    /** @deprecated */
+    readonly domainLookupStart: number;
+    /** @deprecated */
+    readonly fetchStart: number;
+    /** @deprecated */
+    readonly loadEventEnd: number;
+    /** @deprecated */
+    readonly loadEventStart: number;
+    /** @deprecated */
+    readonly navigationStart: number;
+    /** @deprecated */
+    readonly redirectEnd: number;
+    /** @deprecated */
+    readonly redirectStart: number;
+    /** @deprecated */
+    readonly requestStart: number;
+    /** @deprecated */
+    readonly responseEnd: number;
+    /** @deprecated */
+    readonly responseStart: number;
+    /** @deprecated */
+    readonly secureConnectionStart: number;
+    /** @deprecated */
+    readonly unloadEventEnd: number;
+    /** @deprecated */
+    readonly unloadEventStart: number;
+    /** @deprecated */
+    toJSON(): any;
+}
+
+/** @deprecated */
+declare var PerformanceTiming: {
+    prototype: PerformanceTiming;
+    new(): PerformanceTiming;
+};
+
+/** PeriodicWave has no inputs or outputs; it is used to define custom oscillators when calling OscillatorNode.setPeriodicWave(). The PeriodicWave itself is created/returned by AudioContext.createPeriodicWave(). */
+interface PeriodicWave {
+}
+
+declare var PeriodicWave: {
+    prototype: PeriodicWave;
+    new(context: BaseAudioContext, options?: PeriodicWaveOptions): PeriodicWave;
+};
+
+interface PermissionStatusEventMap {
+    "change": Event;
+}
+
+interface PermissionStatus extends EventTarget {
+    readonly name: string;
+    onchange: ((this: PermissionStatus, ev: Event) => any) | null;
+    readonly state: PermissionState;
+    addEventListener<K extends keyof PermissionStatusEventMap>(type: K, listener: (this: PermissionStatus, ev: PermissionStatusEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof PermissionStatusEventMap>(type: K, listener: (this: PermissionStatus, ev: PermissionStatusEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var PermissionStatus: {
+    prototype: PermissionStatus;
+    new(): PermissionStatus;
+};
+
+interface Permissions {
+    query(permissionDesc: PermissionDescriptor): Promise<PermissionStatus>;
+}
+
+declare var Permissions: {
+    prototype: Permissions;
+    new(): Permissions;
+};
+
+interface PictureInPictureEvent extends Event {
+    readonly pictureInPictureWindow: PictureInPictureWindow;
+}
+
+declare var PictureInPictureEvent: {
+    prototype: PictureInPictureEvent;
+    new(type: string, eventInitDict: PictureInPictureEventInit): PictureInPictureEvent;
+};
+
+interface PictureInPictureWindowEventMap {
+    "resize": Event;
+}
+
+interface PictureInPictureWindow extends EventTarget {
+    readonly height: number;
+    onresize: ((this: PictureInPictureWindow, ev: Event) => any) | null;
+    readonly width: number;
+    addEventListener<K extends keyof PictureInPictureWindowEventMap>(type: K, listener: (this: PictureInPictureWindow, ev: PictureInPictureWindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof PictureInPictureWindowEventMap>(type: K, listener: (this: PictureInPictureWindow, ev: PictureInPictureWindowEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var PictureInPictureWindow: {
+    prototype: PictureInPictureWindow;
+    new(): PictureInPictureWindow;
+};
+
+/**
+ * Provides information about a browser plugin.
+ * @deprecated
+ */
+interface Plugin {
+    /**
+     * Returns the plugin's description.
+     * @deprecated
+     */
+    readonly description: string;
+    /**
+     * Returns the plugin library's filename, if applicable on the current platform.
+     * @deprecated
+     */
+    readonly filename: string;
+    /**
+     * Returns the number of MIME types, represented by MimeType objects, supported by the plugin.
+     * @deprecated
+     */
+    readonly length: number;
+    /**
+     * Returns the plugin's name.
+     * @deprecated
+     */
+    readonly name: string;
+    /**
+     * Returns the specified MimeType object.
+     * @deprecated
+     */
+    item(index: number): MimeType | null;
+    /** @deprecated */
+    namedItem(name: string): MimeType | null;
+    [index: number]: MimeType;
+}
+
+/** @deprecated */
+declare var Plugin: {
+    prototype: Plugin;
+    new(): Plugin;
+};
+
+/**
+ * Used to store a list of Plugin objects describing the available plugins; it's returned by the window.navigator.plugins\xA0property. The PluginArray is not a JavaScript array, but has the length property and supports accessing individual items using bracket notation (plugins[2]), as well as via item(index) and namedItem("name") methods.
+ * @deprecated
+ */
+interface PluginArray {
+    /** @deprecated */
+    readonly length: number;
+    /** @deprecated */
+    item(index: number): Plugin | null;
+    /** @deprecated */
+    namedItem(name: string): Plugin | null;
+    /** @deprecated */
+    refresh(): void;
+    [index: number]: Plugin;
+}
+
+/** @deprecated */
+declare var PluginArray: {
+    prototype: PluginArray;
+    new(): PluginArray;
+};
+
+/** The state of a DOM event produced by a pointer such as the geometry of the contact point, the device type that generated the event, the amount of pressure that was applied on the contact surface, etc. */
+interface PointerEvent extends MouseEvent {
+    readonly height: number;
+    readonly isPrimary: boolean;
+    readonly pointerId: number;
+    readonly pointerType: string;
+    readonly pressure: number;
+    readonly tangentialPressure: number;
+    readonly tiltX: number;
+    readonly tiltY: number;
+    readonly twist: number;
+    readonly width: number;
+    /** Available only in secure contexts. */
+    getCoalescedEvents(): PointerEvent[];
+    getPredictedEvents(): PointerEvent[];
+}
+
+declare var PointerEvent: {
+    prototype: PointerEvent;
+    new(type: string, eventInitDict?: PointerEventInit): PointerEvent;
+};
+
+/** PopStateEvent is an event handler for the popstate event on the window. */
+interface PopStateEvent extends Event {
+    /** Returns a copy of the information that was provided to pushState() or replaceState(). */
+    readonly state: any;
+}
+
+declare var PopStateEvent: {
+    prototype: PopStateEvent;
+    new(type: string, eventInitDict?: PopStateEventInit): PopStateEvent;
+};
+
+/** A processing instruction embeds application-specific instructions in XML which can be ignored by other applications that don't recognize them. */
+interface ProcessingInstruction extends CharacterData, LinkStyle {
+    readonly ownerDocument: Document;
+    readonly target: string;
+}
+
+declare var ProcessingInstruction: {
+    prototype: ProcessingInstruction;
+    new(): ProcessingInstruction;
+};
+
+/** Events measuring progress of an underlying process, like an HTTP request (for an XMLHttpRequest, or the loading of the underlying resource of an <img>, <audio>, <video>, <style> or <link>). */
+interface ProgressEvent<T extends EventTarget = EventTarget> extends Event {
+    readonly lengthComputable: boolean;
+    readonly loaded: number;
+    readonly target: T | null;
+    readonly total: number;
+}
+
+declare var ProgressEvent: {
+    prototype: ProgressEvent;
+    new(type: string, eventInitDict?: ProgressEventInit): ProgressEvent;
+};
+
+interface PromiseRejectionEvent extends Event {
+    readonly promise: Promise<any>;
+    readonly reason: any;
+}
+
+declare var PromiseRejectionEvent: {
+    prototype: PromiseRejectionEvent;
+    new(type: string, eventInitDict: PromiseRejectionEventInit): PromiseRejectionEvent;
+};
+
+/** Available only in secure contexts. */
+interface PublicKeyCredential extends Credential {
+    readonly authenticatorAttachment: string | null;
+    readonly rawId: ArrayBuffer;
+    readonly response: AuthenticatorResponse;
+    getClientExtensionResults(): AuthenticationExtensionsClientOutputs;
+}
+
+declare var PublicKeyCredential: {
+    prototype: PublicKeyCredential;
+    new(): PublicKeyCredential;
+    isConditionalMediationAvailable(): Promise<boolean>;
+    isUserVerifyingPlatformAuthenticatorAvailable(): Promise<boolean>;
+};
+
+/**
+ * This Push API interface provides a way to receive notifications from third-party servers as well as request URLs for push notifications.
+ * Available only in secure contexts.
+ */
+interface PushManager {
+    getSubscription(): Promise<PushSubscription | null>;
+    permissionState(options?: PushSubscriptionOptionsInit): Promise<PermissionState>;
+    subscribe(options?: PushSubscriptionOptionsInit): Promise<PushSubscription>;
+}
+
+declare var PushManager: {
+    prototype: PushManager;
+    new(): PushManager;
+    readonly supportedContentEncodings: ReadonlyArray<string>;
+};
+
+/**
+ * This Push API interface provides a subcription's URL endpoint and allows unsubscription from a push service.
+ * Available only in secure contexts.
+ */
+interface PushSubscription {
+    readonly endpoint: string;
+    readonly expirationTime: EpochTimeStamp | null;
+    readonly options: PushSubscriptionOptions;
+    getKey(name: PushEncryptionKeyName): ArrayBuffer | null;
+    toJSON(): PushSubscriptionJSON;
+    unsubscribe(): Promise<boolean>;
+}
+
+declare var PushSubscription: {
+    prototype: PushSubscription;
+    new(): PushSubscription;
+};
+
+/** Available only in secure contexts. */
+interface PushSubscriptionOptions {
+    readonly applicationServerKey: ArrayBuffer | null;
+    readonly userVisibleOnly: boolean;
+}
+
+declare var PushSubscriptionOptions: {
+    prototype: PushSubscriptionOptions;
+    new(): PushSubscriptionOptions;
+};
+
+interface RTCCertificate {
+    readonly expires: EpochTimeStamp;
+    getFingerprints(): RTCDtlsFingerprint[];
+}
+
+declare var RTCCertificate: {
+    prototype: RTCCertificate;
+    new(): RTCCertificate;
+};
+
+interface RTCDTMFSenderEventMap {
+    "tonechange": RTCDTMFToneChangeEvent;
+}
+
+interface RTCDTMFSender extends EventTarget {
+    readonly canInsertDTMF: boolean;
+    ontonechange: ((this: RTCDTMFSender, ev: RTCDTMFToneChangeEvent) => any) | null;
+    readonly toneBuffer: string;
+    insertDTMF(tones: string, duration?: number, interToneGap?: number): void;
+    addEventListener<K extends keyof RTCDTMFSenderEventMap>(type: K, listener: (this: RTCDTMFSender, ev: RTCDTMFSenderEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof RTCDTMFSenderEventMap>(type: K, listener: (this: RTCDTMFSender, ev: RTCDTMFSenderEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var RTCDTMFSender: {
+    prototype: RTCDTMFSender;
+    new(): RTCDTMFSender;
+};
+
+/** Events sent to indicate that DTMF tones have started or finished playing. This interface is used by the tonechange event. */
+interface RTCDTMFToneChangeEvent extends Event {
+    readonly tone: string;
+}
+
+declare var RTCDTMFToneChangeEvent: {
+    prototype: RTCDTMFToneChangeEvent;
+    new(type: string, eventInitDict?: RTCDTMFToneChangeEventInit): RTCDTMFToneChangeEvent;
+};
+
+interface RTCDataChannelEventMap {
+    "bufferedamountlow": Event;
+    "close": Event;
+    "closing": Event;
+    "error": Event;
+    "message": MessageEvent;
+    "open": Event;
+}
+
+interface RTCDataChannel extends EventTarget {
+    binaryType: BinaryType;
+    readonly bufferedAmount: number;
+    bufferedAmountLowThreshold: number;
+    readonly id: number | null;
+    readonly label: string;
+    readonly maxPacketLifeTime: number | null;
+    readonly maxRetransmits: number | null;
+    readonly negotiated: boolean;
+    onbufferedamountlow: ((this: RTCDataChannel, ev: Event) => any) | null;
+    onclose: ((this: RTCDataChannel, ev: Event) => any) | null;
+    onclosing: ((this: RTCDataChannel, ev: Event) => any) | null;
+    onerror: ((this: RTCDataChannel, ev: Event) => any) | null;
+    onmessage: ((this: RTCDataChannel, ev: MessageEvent) => any) | null;
+    onopen: ((this: RTCDataChannel, ev: Event) => any) | null;
+    readonly ordered: boolean;
+    readonly protocol: string;
+    readonly readyState: RTCDataChannelState;
+    close(): void;
+    send(data: string): void;
+    send(data: Blob): void;
+    send(data: ArrayBuffer): void;
+    send(data: ArrayBufferView): void;
+    addEventListener<K extends keyof RTCDataChannelEventMap>(type: K, listener: (this: RTCDataChannel, ev: RTCDataChannelEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof RTCDataChannelEventMap>(type: K, listener: (this: RTCDataChannel, ev: RTCDataChannelEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var RTCDataChannel: {
+    prototype: RTCDataChannel;
+    new(): RTCDataChannel;
+};
+
+interface RTCDataChannelEvent extends Event {
+    readonly channel: RTCDataChannel;
+}
+
+declare var RTCDataChannelEvent: {
+    prototype: RTCDataChannelEvent;
+    new(type: string, eventInitDict: RTCDataChannelEventInit): RTCDataChannelEvent;
+};
+
+interface RTCDtlsTransportEventMap {
+    "error": Event;
+    "statechange": Event;
+}
+
+interface RTCDtlsTransport extends EventTarget {
+    readonly iceTransport: RTCIceTransport;
+    onerror: ((this: RTCDtlsTransport, ev: Event) => any) | null;
+    onstatechange: ((this: RTCDtlsTransport, ev: Event) => any) | null;
+    readonly state: RTCDtlsTransportState;
+    getRemoteCertificates(): ArrayBuffer[];
+    addEventListener<K extends keyof RTCDtlsTransportEventMap>(type: K, listener: (this: RTCDtlsTransport, ev: RTCDtlsTransportEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof RTCDtlsTransportEventMap>(type: K, listener: (this: RTCDtlsTransport, ev: RTCDtlsTransportEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var RTCDtlsTransport: {
+    prototype: RTCDtlsTransport;
+    new(): RTCDtlsTransport;
+};
+
+interface RTCEncodedAudioFrame {
+    data: ArrayBuffer;
+    readonly timestamp: number;
+    getMetadata(): RTCEncodedAudioFrameMetadata;
+}
+
+declare var RTCEncodedAudioFrame: {
+    prototype: RTCEncodedAudioFrame;
+    new(): RTCEncodedAudioFrame;
+};
+
+interface RTCEncodedVideoFrame {
+    data: ArrayBuffer;
+    readonly timestamp: number;
+    readonly type: RTCEncodedVideoFrameType;
+    getMetadata(): RTCEncodedVideoFrameMetadata;
+}
+
+declare var RTCEncodedVideoFrame: {
+    prototype: RTCEncodedVideoFrame;
+    new(): RTCEncodedVideoFrame;
+};
+
+interface RTCError extends DOMException {
+    readonly errorDetail: RTCErrorDetailType;
+    readonly receivedAlert: number | null;
+    readonly sctpCauseCode: number | null;
+    readonly sdpLineNumber: number | null;
+    readonly sentAlert: number | null;
+}
+
+declare var RTCError: {
+    prototype: RTCError;
+    new(init: RTCErrorInit, message?: string): RTCError;
+};
+
+interface RTCErrorEvent extends Event {
+    readonly error: RTCError;
+}
+
+declare var RTCErrorEvent: {
+    prototype: RTCErrorEvent;
+    new(type: string, eventInitDict: RTCErrorEventInit): RTCErrorEvent;
+};
+
+/** The RTCIceCandidate interface\u2014part of the WebRTC API\u2014represents a candidate Internet Connectivity Establishment (ICE) configuration which may be used to establish an RTCPeerConnection. */
+interface RTCIceCandidate {
+    readonly address: string | null;
+    readonly candidate: string;
+    readonly component: RTCIceComponent | null;
+    readonly foundation: string | null;
+    readonly port: number | null;
+    readonly priority: number | null;
+    readonly protocol: RTCIceProtocol | null;
+    readonly relatedAddress: string | null;
+    readonly relatedPort: number | null;
+    readonly sdpMLineIndex: number | null;
+    readonly sdpMid: string | null;
+    readonly tcpType: RTCIceTcpCandidateType | null;
+    readonly type: RTCIceCandidateType | null;
+    readonly usernameFragment: string | null;
+    toJSON(): RTCIceCandidateInit;
+}
+
+declare var RTCIceCandidate: {
+    prototype: RTCIceCandidate;
+    new(candidateInitDict?: RTCIceCandidateInit): RTCIceCandidate;
+};
+
+interface RTCIceTransportEventMap {
+    "gatheringstatechange": Event;
+    "statechange": Event;
+}
+
+/** Provides access to information about the ICE transport layer over which the data is being sent and received. */
+interface RTCIceTransport extends EventTarget {
+    readonly gatheringState: RTCIceGathererState;
+    ongatheringstatechange: ((this: RTCIceTransport, ev: Event) => any) | null;
+    onstatechange: ((this: RTCIceTransport, ev: Event) => any) | null;
+    readonly state: RTCIceTransportState;
+    addEventListener<K extends keyof RTCIceTransportEventMap>(type: K, listener: (this: RTCIceTransport, ev: RTCIceTransportEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof RTCIceTransportEventMap>(type: K, listener: (this: RTCIceTransport, ev: RTCIceTransportEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var RTCIceTransport: {
+    prototype: RTCIceTransport;
+    new(): RTCIceTransport;
+};
+
+interface RTCPeerConnectionEventMap {
+    "connectionstatechange": Event;
+    "datachannel": RTCDataChannelEvent;
+    "icecandidate": RTCPeerConnectionIceEvent;
+    "icecandidateerror": Event;
+    "iceconnectionstatechange": Event;
+    "icegatheringstatechange": Event;
+    "negotiationneeded": Event;
+    "signalingstatechange": Event;
+    "track": RTCTrackEvent;
+}
+
+/** A WebRTC connection between the local computer and a remote peer. It provides methods to connect to a remote peer, maintain and monitor the connection, and close the connection once it's no longer needed. */
+interface RTCPeerConnection extends EventTarget {
+    readonly canTrickleIceCandidates: boolean | null;
+    readonly connectionState: RTCPeerConnectionState;
+    readonly currentLocalDescription: RTCSessionDescription | null;
+    readonly currentRemoteDescription: RTCSessionDescription | null;
+    readonly iceConnectionState: RTCIceConnectionState;
+    readonly iceGatheringState: RTCIceGatheringState;
+    readonly localDescription: RTCSessionDescription | null;
+    onconnectionstatechange: ((this: RTCPeerConnection, ev: Event) => any) | null;
+    ondatachannel: ((this: RTCPeerConnection, ev: RTCDataChannelEvent) => any) | null;
+    onicecandidate: ((this: RTCPeerConnection, ev: RTCPeerConnectionIceEvent) => any) | null;
+    onicecandidateerror: ((this: RTCPeerConnection, ev: Event) => any) | null;
+    oniceconnectionstatechange: ((this: RTCPeerConnection, ev: Event) => any) | null;
+    onicegatheringstatechange: ((this: RTCPeerConnection, ev: Event) => any) | null;
+    onnegotiationneeded: ((this: RTCPeerConnection, ev: Event) => any) | null;
+    onsignalingstatechange: ((this: RTCPeerConnection, ev: Event) => any) | null;
+    ontrack: ((this: RTCPeerConnection, ev: RTCTrackEvent) => any) | null;
+    readonly pendingLocalDescription: RTCSessionDescription | null;
+    readonly pendingRemoteDescription: RTCSessionDescription | null;
+    readonly remoteDescription: RTCSessionDescription | null;
+    readonly sctp: RTCSctpTransport | null;
+    readonly signalingState: RTCSignalingState;
+    addIceCandidate(candidate?: RTCIceCandidateInit): Promise<void>;
+    /** @deprecated */
+    addIceCandidate(candidate: RTCIceCandidateInit, successCallback: VoidFunction, failureCallback: RTCPeerConnectionErrorCallback): Promise<void>;
+    addTrack(track: MediaStreamTrack, ...streams: MediaStream[]): RTCRtpSender;
+    addTransceiver(trackOrKind: MediaStreamTrack | string, init?: RTCRtpTransceiverInit): RTCRtpTransceiver;
+    close(): void;
+    createAnswer(options?: RTCAnswerOptions): Promise<RTCSessionDescriptionInit>;
+    /** @deprecated */
+    createAnswer(successCallback: RTCSessionDescriptionCallback, failureCallback: RTCPeerConnectionErrorCallback): Promise<void>;
+    createDataChannel(label: string, dataChannelDict?: RTCDataChannelInit): RTCDataChannel;
+    createOffer(options?: RTCOfferOptions): Promise<RTCSessionDescriptionInit>;
+    /** @deprecated */
+    createOffer(successCallback: RTCSessionDescriptionCallback, failureCallback: RTCPeerConnectionErrorCallback, options?: RTCOfferOptions): Promise<void>;
+    getConfiguration(): RTCConfiguration;
+    getReceivers(): RTCRtpReceiver[];
+    getSenders(): RTCRtpSender[];
+    getStats(selector?: MediaStreamTrack | null): Promise<RTCStatsReport>;
+    getTransceivers(): RTCRtpTransceiver[];
+    removeTrack(sender: RTCRtpSender): void;
+    restartIce(): void;
+    setConfiguration(configuration?: RTCConfiguration): void;
+    setLocalDescription(description?: RTCLocalSessionDescriptionInit): Promise<void>;
+    /** @deprecated */
+    setLocalDescription(description: RTCLocalSessionDescriptionInit, successCallback: VoidFunction, failureCallback: RTCPeerConnectionErrorCallback): Promise<void>;
+    setRemoteDescription(description: RTCSessionDescriptionInit): Promise<void>;
+    /** @deprecated */
+    setRemoteDescription(description: RTCSessionDescriptionInit, successCallback: VoidFunction, failureCallback: RTCPeerConnectionErrorCallback): Promise<void>;
+    addEventListener<K extends keyof RTCPeerConnectionEventMap>(type: K, listener: (this: RTCPeerConnection, ev: RTCPeerConnectionEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof RTCPeerConnectionEventMap>(type: K, listener: (this: RTCPeerConnection, ev: RTCPeerConnectionEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var RTCPeerConnection: {
+    prototype: RTCPeerConnection;
+    new(configuration?: RTCConfiguration): RTCPeerConnection;
+    generateCertificate(keygenAlgorithm: AlgorithmIdentifier): Promise<RTCCertificate>;
+};
+
+interface RTCPeerConnectionIceErrorEvent extends Event {
+    readonly address: string | null;
+    readonly errorCode: number;
+    readonly errorText: string;
+    readonly port: number | null;
+    readonly url: string;
+}
+
+declare var RTCPeerConnectionIceErrorEvent: {
+    prototype: RTCPeerConnectionIceErrorEvent;
+    new(type: string, eventInitDict: RTCPeerConnectionIceErrorEventInit): RTCPeerConnectionIceErrorEvent;
+};
+
+/** Events that occurs in relation to ICE candidates with the target, usually an RTCPeerConnection. Only one event is of this type: icecandidate. */
+interface RTCPeerConnectionIceEvent extends Event {
+    readonly candidate: RTCIceCandidate | null;
+}
+
+declare var RTCPeerConnectionIceEvent: {
+    prototype: RTCPeerConnectionIceEvent;
+    new(type: string, eventInitDict?: RTCPeerConnectionIceEventInit): RTCPeerConnectionIceEvent;
+};
+
+/** This WebRTC API interface manages the reception and decoding of data for a\xA0MediaStreamTrack on an\xA0RTCPeerConnection. */
+interface RTCRtpReceiver {
+    readonly track: MediaStreamTrack;
+    readonly transport: RTCDtlsTransport | null;
+    getContributingSources(): RTCRtpContributingSource[];
+    getParameters(): RTCRtpReceiveParameters;
+    getStats(): Promise<RTCStatsReport>;
+    getSynchronizationSources(): RTCRtpSynchronizationSource[];
+}
+
+declare var RTCRtpReceiver: {
+    prototype: RTCRtpReceiver;
+    new(): RTCRtpReceiver;
+    getCapabilities(kind: string): RTCRtpCapabilities | null;
+};
+
+/** Provides the ability to control and obtain details about how a particular MediaStreamTrack is encoded and sent to a remote peer. */
+interface RTCRtpSender {
+    readonly dtmf: RTCDTMFSender | null;
+    readonly track: MediaStreamTrack | null;
+    readonly transport: RTCDtlsTransport | null;
+    getParameters(): RTCRtpSendParameters;
+    getStats(): Promise<RTCStatsReport>;
+    replaceTrack(withTrack: MediaStreamTrack | null): Promise<void>;
+    setParameters(parameters: RTCRtpSendParameters): Promise<void>;
+    setStreams(...streams: MediaStream[]): void;
+}
+
+declare var RTCRtpSender: {
+    prototype: RTCRtpSender;
+    new(): RTCRtpSender;
+    getCapabilities(kind: string): RTCRtpCapabilities | null;
+};
+
+interface RTCRtpTransceiver {
+    readonly currentDirection: RTCRtpTransceiverDirection | null;
+    direction: RTCRtpTransceiverDirection;
+    readonly mid: string | null;
+    readonly receiver: RTCRtpReceiver;
+    readonly sender: RTCRtpSender;
+    setCodecPreferences(codecs: RTCRtpCodecCapability[]): void;
+    stop(): void;
+}
+
+declare var RTCRtpTransceiver: {
+    prototype: RTCRtpTransceiver;
+    new(): RTCRtpTransceiver;
+};
+
+interface RTCSctpTransportEventMap {
+    "statechange": Event;
+}
+
+interface RTCSctpTransport extends EventTarget {
+    readonly maxChannels: number | null;
+    readonly maxMessageSize: number;
+    onstatechange: ((this: RTCSctpTransport, ev: Event) => any) | null;
+    readonly state: RTCSctpTransportState;
+    readonly transport: RTCDtlsTransport;
+    addEventListener<K extends keyof RTCSctpTransportEventMap>(type: K, listener: (this: RTCSctpTransport, ev: RTCSctpTransportEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof RTCSctpTransportEventMap>(type: K, listener: (this: RTCSctpTransport, ev: RTCSctpTransportEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var RTCSctpTransport: {
+    prototype: RTCSctpTransport;
+    new(): RTCSctpTransport;
+};
+
+/** One end of a connection\u2014or potential connection\u2014and how it's configured. Each RTCSessionDescription consists of a description type indicating which part of the offer/answer negotiation process it describes and of the SDP descriptor of the session. */
+interface RTCSessionDescription {
+    readonly sdp: string;
+    readonly type: RTCSdpType;
+    toJSON(): any;
+}
+
+declare var RTCSessionDescription: {
+    prototype: RTCSessionDescription;
+    new(descriptionInitDict: RTCSessionDescriptionInit): RTCSessionDescription;
+};
+
+interface RTCStatsReport {
+    forEach(callbackfn: (value: any, key: string, parent: RTCStatsReport) => void, thisArg?: any): void;
+}
+
+declare var RTCStatsReport: {
+    prototype: RTCStatsReport;
+    new(): RTCStatsReport;
+};
+
+interface RTCTrackEvent extends Event {
+    readonly receiver: RTCRtpReceiver;
+    readonly streams: ReadonlyArray<MediaStream>;
+    readonly track: MediaStreamTrack;
+    readonly transceiver: RTCRtpTransceiver;
+}
+
+declare var RTCTrackEvent: {
+    prototype: RTCTrackEvent;
+    new(type: string, eventInitDict: RTCTrackEventInit): RTCTrackEvent;
+};
+
+interface RadioNodeList extends NodeList {
+    value: string;
+}
+
+declare var RadioNodeList: {
+    prototype: RadioNodeList;
+    new(): RadioNodeList;
+};
+
+/** A fragment of a document that can contain nodes and parts of text nodes. */
+interface Range extends AbstractRange {
+    /** Returns the node, furthest away from the document, that is an ancestor of both range's start node and end node. */
+    readonly commonAncestorContainer: Node;
+    cloneContents(): DocumentFragment;
+    cloneRange(): Range;
+    collapse(toStart?: boolean): void;
+    compareBoundaryPoints(how: number, sourceRange: Range): number;
+    /** Returns \u22121 if the point is before the range, 0 if the point is in the range, and 1 if the point is after the range. */
+    comparePoint(node: Node, offset: number): number;
+    createContextualFragment(fragment: string): DocumentFragment;
+    deleteContents(): void;
+    detach(): void;
+    extractContents(): DocumentFragment;
+    getBoundingClientRect(): DOMRect;
+    getClientRects(): DOMRectList;
+    insertNode(node: Node): void;
+    /** Returns whether range intersects node. */
+    intersectsNode(node: Node): boolean;
+    isPointInRange(node: Node, offset: number): boolean;
+    selectNode(node: Node): void;
+    selectNodeContents(node: Node): void;
+    setEnd(node: Node, offset: number): void;
+    setEndAfter(node: Node): void;
+    setEndBefore(node: Node): void;
+    setStart(node: Node, offset: number): void;
+    setStartAfter(node: Node): void;
+    setStartBefore(node: Node): void;
+    surroundContents(newParent: Node): void;
+    toString(): string;
+    readonly START_TO_START: 0;
+    readonly START_TO_END: 1;
+    readonly END_TO_END: 2;
+    readonly END_TO_START: 3;
+}
+
+declare var Range: {
+    prototype: Range;
+    new(): Range;
+    readonly START_TO_START: 0;
+    readonly START_TO_END: 1;
+    readonly END_TO_END: 2;
+    readonly END_TO_START: 3;
+    toString(): string;
+};
+
+interface ReadableByteStreamController {
+    readonly byobRequest: ReadableStreamBYOBRequest | null;
+    readonly desiredSize: number | null;
+    close(): void;
+    enqueue(chunk: ArrayBufferView): void;
+    error(e?: any): void;
+}
+
+declare var ReadableByteStreamController: {
+    prototype: ReadableByteStreamController;
+    new(): ReadableByteStreamController;
+};
+
+/** This Streams API interface represents a readable stream of byte data. The Fetch API offers a concrete instance of a ReadableStream through the body property of a Response object. */
+interface ReadableStream<R = any> {
+    readonly locked: boolean;
+    cancel(reason?: any): Promise<void>;
+    getReader(options: { mode: "byob" }): ReadableStreamBYOBReader;
+    getReader(): ReadableStreamDefaultReader<R>;
+    getReader(options?: ReadableStreamGetReaderOptions): ReadableStreamReader<R>;
+    pipeThrough<T>(transform: ReadableWritablePair<T, R>, options?: StreamPipeOptions): ReadableStream<T>;
+    pipeTo(destination: WritableStream<R>, options?: StreamPipeOptions): Promise<void>;
+    tee(): [ReadableStream<R>, ReadableStream<R>];
+}
+
+declare var ReadableStream: {
+    prototype: ReadableStream;
+    new(underlyingSource: UnderlyingByteSource, strategy?: { highWaterMark?: number }): ReadableStream<Uint8Array>;
+    new<R = any>(underlyingSource: UnderlyingDefaultSource<R>, strategy?: QueuingStrategy<R>): ReadableStream<R>;
+    new<R = any>(underlyingSource?: UnderlyingSource<R>, strategy?: QueuingStrategy<R>): ReadableStream<R>;
+};
+
+interface ReadableStreamBYOBReader extends ReadableStreamGenericReader {
+    read<T extends ArrayBufferView>(view: T): Promise<ReadableStreamReadResult<T>>;
+    releaseLock(): void;
+}
+
+declare var ReadableStreamBYOBReader: {
+    prototype: ReadableStreamBYOBReader;
+    new(stream: ReadableStream): ReadableStreamBYOBReader;
+};
+
+interface ReadableStreamBYOBRequest {
+    readonly view: ArrayBufferView | null;
+    respond(bytesWritten: number): void;
+    respondWithNewView(view: ArrayBufferView): void;
+}
+
+declare var ReadableStreamBYOBRequest: {
+    prototype: ReadableStreamBYOBRequest;
+    new(): ReadableStreamBYOBRequest;
+};
+
+interface ReadableStreamDefaultController<R = any> {
+    readonly desiredSize: number | null;
+    close(): void;
+    enqueue(chunk?: R): void;
+    error(e?: any): void;
+}
+
+declare var ReadableStreamDefaultController: {
+    prototype: ReadableStreamDefaultController;
+    new(): ReadableStreamDefaultController;
+};
+
+interface ReadableStreamDefaultReader<R = any> extends ReadableStreamGenericReader {
+    read(): Promise<ReadableStreamReadResult<R>>;
+    releaseLock(): void;
+}
+
+declare var ReadableStreamDefaultReader: {
+    prototype: ReadableStreamDefaultReader;
+    new<R = any>(stream: ReadableStream<R>): ReadableStreamDefaultReader<R>;
+};
+
+interface ReadableStreamGenericReader {
+    readonly closed: Promise<undefined>;
+    cancel(reason?: any): Promise<void>;
+}
+
+interface RemotePlaybackEventMap {
+    "connect": Event;
+    "connecting": Event;
+    "disconnect": Event;
+}
+
+interface RemotePlayback extends EventTarget {
+    onconnect: ((this: RemotePlayback, ev: Event) => any) | null;
+    onconnecting: ((this: RemotePlayback, ev: Event) => any) | null;
+    ondisconnect: ((this: RemotePlayback, ev: Event) => any) | null;
+    readonly state: RemotePlaybackState;
+    cancelWatchAvailability(id?: number): Promise<void>;
+    prompt(): Promise<void>;
+    watchAvailability(callback: RemotePlaybackAvailabilityCallback): Promise<number>;
+    addEventListener<K extends keyof RemotePlaybackEventMap>(type: K, listener: (this: RemotePlayback, ev: RemotePlaybackEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof RemotePlaybackEventMap>(type: K, listener: (this: RemotePlayback, ev: RemotePlaybackEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var RemotePlayback: {
+    prototype: RemotePlayback;
+    new(): RemotePlayback;
+};
+
+/** This Fetch API interface represents a resource request. */
+interface Request extends Body {
+    /** Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. */
+    readonly cache: RequestCache;
+    /** Returns the credentials mode associated with request, which is a string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. */
+    readonly credentials: RequestCredentials;
+    /** Returns the kind of resource requested by request, e.g., "document" or "script". */
+    readonly destination: RequestDestination;
+    /** Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the "Host" header. */
+    readonly headers: Headers;
+    /** Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] */
+    readonly integrity: string;
+    /** Returns a boolean indicating whether or not request can outlive the global in which it was created. */
+    readonly keepalive: boolean;
+    /** Returns request's HTTP method, which is "GET" by default. */
+    readonly method: string;
+    /** Returns the mode associated with request, which is a string indicating whether the request will use CORS, or will be restricted to same-origin URLs. */
+    readonly mode: RequestMode;
+    /** Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. */
+    readonly redirect: RequestRedirect;
+    /** Returns the referrer of request. Its value can be a same-origin URL if explicitly set in init, the empty string to indicate no referrer, and "about:client" when defaulting to the global's default. This is used during fetching to determine the value of the \`Referer\` header of the request being made. */
+    readonly referrer: string;
+    /** Returns the referrer policy associated with request. This is used during fetching to compute the value of the request's referrer. */
+    readonly referrerPolicy: ReferrerPolicy;
+    /** Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. */
+    readonly signal: AbortSignal;
+    /** Returns the URL of request as a string. */
+    readonly url: string;
+    clone(): Request;
+}
+
+declare var Request: {
+    prototype: Request;
+    new(input: RequestInfo | URL, init?: RequestInit): Request;
+};
+
+interface ResizeObserver {
+    disconnect(): void;
+    observe(target: Element, options?: ResizeObserverOptions): void;
+    unobserve(target: Element): void;
+}
+
+declare var ResizeObserver: {
+    prototype: ResizeObserver;
+    new(callback: ResizeObserverCallback): ResizeObserver;
+};
+
+interface ResizeObserverEntry {
+    readonly borderBoxSize: ReadonlyArray<ResizeObserverSize>;
+    readonly contentBoxSize: ReadonlyArray<ResizeObserverSize>;
+    readonly contentRect: DOMRectReadOnly;
+    readonly devicePixelContentBoxSize: ReadonlyArray<ResizeObserverSize>;
+    readonly target: Element;
+}
+
+declare var ResizeObserverEntry: {
+    prototype: ResizeObserverEntry;
+    new(): ResizeObserverEntry;
+};
+
+interface ResizeObserverSize {
+    readonly blockSize: number;
+    readonly inlineSize: number;
+}
+
+declare var ResizeObserverSize: {
+    prototype: ResizeObserverSize;
+    new(): ResizeObserverSize;
+};
+
+/** This Fetch API interface represents the response to a request. */
+interface Response extends Body {
+    readonly headers: Headers;
+    readonly ok: boolean;
+    readonly redirected: boolean;
+    readonly status: number;
+    readonly statusText: string;
+    readonly type: ResponseType;
+    readonly url: string;
+    clone(): Response;
+}
+
+declare var Response: {
+    prototype: Response;
+    new(body?: BodyInit | null, init?: ResponseInit): Response;
+    error(): Response;
+    redirect(url: string | URL, status?: number): Response;
+};
+
+/** Provides access to the properties of <a> element, as well as methods to manipulate them. */
+interface SVGAElement extends SVGGraphicsElement, SVGURIReference {
+    rel: string;
+    readonly relList: DOMTokenList;
+    readonly target: SVGAnimatedString;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGAElement: {
+    prototype: SVGAElement;
+    new(): SVGAElement;
+};
+
+/** Used to represent a value that can be an <angle> or <number> value. An SVGAngle reflected through the animVal attribute is always read only. */
+interface SVGAngle {
+    readonly unitType: number;
+    value: number;
+    valueAsString: string;
+    valueInSpecifiedUnits: number;
+    convertToSpecifiedUnits(unitType: number): void;
+    newValueSpecifiedUnits(unitType: number, valueInSpecifiedUnits: number): void;
+    readonly SVG_ANGLETYPE_UNKNOWN: 0;
+    readonly SVG_ANGLETYPE_UNSPECIFIED: 1;
+    readonly SVG_ANGLETYPE_DEG: 2;
+    readonly SVG_ANGLETYPE_RAD: 3;
+    readonly SVG_ANGLETYPE_GRAD: 4;
+}
+
+declare var SVGAngle: {
+    prototype: SVGAngle;
+    new(): SVGAngle;
+    readonly SVG_ANGLETYPE_UNKNOWN: 0;
+    readonly SVG_ANGLETYPE_UNSPECIFIED: 1;
+    readonly SVG_ANGLETYPE_DEG: 2;
+    readonly SVG_ANGLETYPE_RAD: 3;
+    readonly SVG_ANGLETYPE_GRAD: 4;
+};
+
+interface SVGAnimateElement extends SVGAnimationElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimateElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimateElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGAnimateElement: {
+    prototype: SVGAnimateElement;
+    new(): SVGAnimateElement;
+};
+
+interface SVGAnimateMotionElement extends SVGAnimationElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimateMotionElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimateMotionElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGAnimateMotionElement: {
+    prototype: SVGAnimateMotionElement;
+    new(): SVGAnimateMotionElement;
+};
+
+interface SVGAnimateTransformElement extends SVGAnimationElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimateTransformElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimateTransformElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGAnimateTransformElement: {
+    prototype: SVGAnimateTransformElement;
+    new(): SVGAnimateTransformElement;
+};
+
+/** Used for attributes of basic type <angle> which can be animated. */
+interface SVGAnimatedAngle {
+    readonly animVal: SVGAngle;
+    readonly baseVal: SVGAngle;
+}
+
+declare var SVGAnimatedAngle: {
+    prototype: SVGAnimatedAngle;
+    new(): SVGAnimatedAngle;
+};
+
+/** Used for attributes of type boolean which can be animated. */
+interface SVGAnimatedBoolean {
+    readonly animVal: boolean;
+    baseVal: boolean;
+}
+
+declare var SVGAnimatedBoolean: {
+    prototype: SVGAnimatedBoolean;
+    new(): SVGAnimatedBoolean;
+};
+
+/** Used for attributes whose value must be a constant from a particular enumeration and which can be animated. */
+interface SVGAnimatedEnumeration {
+    readonly animVal: number;
+    baseVal: number;
+}
+
+declare var SVGAnimatedEnumeration: {
+    prototype: SVGAnimatedEnumeration;
+    new(): SVGAnimatedEnumeration;
+};
+
+/** Used for attributes of basic type <integer> which can be animated. */
+interface SVGAnimatedInteger {
+    readonly animVal: number;
+    baseVal: number;
+}
+
+declare var SVGAnimatedInteger: {
+    prototype: SVGAnimatedInteger;
+    new(): SVGAnimatedInteger;
+};
+
+/** Used for attributes of basic type <length> which can be animated. */
+interface SVGAnimatedLength {
+    readonly animVal: SVGLength;
+    readonly baseVal: SVGLength;
+}
+
+declare var SVGAnimatedLength: {
+    prototype: SVGAnimatedLength;
+    new(): SVGAnimatedLength;
+};
+
+/** Used for attributes of type SVGLengthList which can be animated. */
+interface SVGAnimatedLengthList {
+    readonly animVal: SVGLengthList;
+    readonly baseVal: SVGLengthList;
+}
+
+declare var SVGAnimatedLengthList: {
+    prototype: SVGAnimatedLengthList;
+    new(): SVGAnimatedLengthList;
+};
+
+/** Used for attributes of basic type <Number> which can be animated. */
+interface SVGAnimatedNumber {
+    readonly animVal: number;
+    baseVal: number;
+}
+
+declare var SVGAnimatedNumber: {
+    prototype: SVGAnimatedNumber;
+    new(): SVGAnimatedNumber;
+};
+
+/** The SVGAnimatedNumber interface is used for attributes which take a list of numbers and which can be animated. */
+interface SVGAnimatedNumberList {
+    readonly animVal: SVGNumberList;
+    readonly baseVal: SVGNumberList;
+}
+
+declare var SVGAnimatedNumberList: {
+    prototype: SVGAnimatedNumberList;
+    new(): SVGAnimatedNumberList;
+};
+
+interface SVGAnimatedPoints {
+    readonly animatedPoints: SVGPointList;
+    readonly points: SVGPointList;
+}
+
+/** Used for attributes of type SVGPreserveAspectRatio which can be animated. */
+interface SVGAnimatedPreserveAspectRatio {
+    readonly animVal: SVGPreserveAspectRatio;
+    readonly baseVal: SVGPreserveAspectRatio;
+}
+
+declare var SVGAnimatedPreserveAspectRatio: {
+    prototype: SVGAnimatedPreserveAspectRatio;
+    new(): SVGAnimatedPreserveAspectRatio;
+};
+
+/** Used for attributes of basic SVGRect which can be animated. */
+interface SVGAnimatedRect {
+    readonly animVal: DOMRectReadOnly;
+    readonly baseVal: DOMRect;
+}
+
+declare var SVGAnimatedRect: {
+    prototype: SVGAnimatedRect;
+    new(): SVGAnimatedRect;
+};
+
+/** The SVGAnimatedString\xA0interface represents string attributes which can be animated from each SVG declaration. You need to create SVG attribute before doing anything else, everything should be declared\xA0inside this. */
+interface SVGAnimatedString {
+    readonly animVal: string;
+    baseVal: string;
+}
+
+declare var SVGAnimatedString: {
+    prototype: SVGAnimatedString;
+    new(): SVGAnimatedString;
+};
+
+/** Used for attributes which take a list of numbers and which can be animated. */
+interface SVGAnimatedTransformList {
+    readonly animVal: SVGTransformList;
+    readonly baseVal: SVGTransformList;
+}
+
+declare var SVGAnimatedTransformList: {
+    prototype: SVGAnimatedTransformList;
+    new(): SVGAnimatedTransformList;
+};
+
+interface SVGAnimationElement extends SVGElement, SVGTests {
+    readonly targetElement: SVGElement | null;
+    beginElement(): void;
+    beginElementAt(offset: number): void;
+    endElement(): void;
+    endElementAt(offset: number): void;
+    getCurrentTime(): number;
+    getSimpleDuration(): number;
+    getStartTime(): number;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimationElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimationElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGAnimationElement: {
+    prototype: SVGAnimationElement;
+    new(): SVGAnimationElement;
+};
+
+/** An interface for the <circle> element. The circle element is defined by the cx and cy attributes that denote the coordinates of the centre of the circle. */
+interface SVGCircleElement extends SVGGeometryElement {
+    readonly cx: SVGAnimatedLength;
+    readonly cy: SVGAnimatedLength;
+    readonly r: SVGAnimatedLength;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGCircleElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGCircleElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGCircleElement: {
+    prototype: SVGCircleElement;
+    new(): SVGCircleElement;
+};
+
+/** Provides access to the properties of <clipPath> elements, as well as methods to manipulate them. */
+interface SVGClipPathElement extends SVGElement {
+    readonly clipPathUnits: SVGAnimatedEnumeration;
+    readonly transform: SVGAnimatedTransformList;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGClipPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGClipPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGClipPathElement: {
+    prototype: SVGClipPathElement;
+    new(): SVGClipPathElement;
+};
+
+/** A base interface used by the component transfer function interfaces. */
+interface SVGComponentTransferFunctionElement extends SVGElement {
+    readonly amplitude: SVGAnimatedNumber;
+    readonly exponent: SVGAnimatedNumber;
+    readonly intercept: SVGAnimatedNumber;
+    readonly offset: SVGAnimatedNumber;
+    readonly slope: SVGAnimatedNumber;
+    readonly tableValues: SVGAnimatedNumberList;
+    readonly type: SVGAnimatedEnumeration;
+    readonly SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN: 0;
+    readonly SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: 1;
+    readonly SVG_FECOMPONENTTRANSFER_TYPE_TABLE: 2;
+    readonly SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: 3;
+    readonly SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: 4;
+    readonly SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: 5;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGComponentTransferFunctionElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGComponentTransferFunctionElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGComponentTransferFunctionElement: {
+    prototype: SVGComponentTransferFunctionElement;
+    new(): SVGComponentTransferFunctionElement;
+    readonly SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN: 0;
+    readonly SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: 1;
+    readonly SVG_FECOMPONENTTRANSFER_TYPE_TABLE: 2;
+    readonly SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: 3;
+    readonly SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: 4;
+    readonly SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: 5;
+};
+
+/** Corresponds to the <defs> element. */
+interface SVGDefsElement extends SVGGraphicsElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGDefsElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGDefsElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGDefsElement: {
+    prototype: SVGDefsElement;
+    new(): SVGDefsElement;
+};
+
+/** Corresponds to the <desc> element. */
+interface SVGDescElement extends SVGElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGDescElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGDescElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGDescElement: {
+    prototype: SVGDescElement;
+    new(): SVGDescElement;
+};
+
+interface SVGElementEventMap extends ElementEventMap, GlobalEventHandlersEventMap {
+}
+
+/** All of the SVG DOM interfaces that correspond directly to elements in the SVG language derive from the SVGElement interface. */
+interface SVGElement extends Element, ElementCSSInlineStyle, GlobalEventHandlers, HTMLOrSVGElement {
+    /** @deprecated */
+    readonly className: any;
+    readonly ownerSVGElement: SVGSVGElement | null;
+    readonly viewportElement: SVGElement | null;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGElement: {
+    prototype: SVGElement;
+    new(): SVGElement;
+};
+
+/** Provides access to the properties of <ellipse> elements. */
+interface SVGEllipseElement extends SVGGeometryElement {
+    readonly cx: SVGAnimatedLength;
+    readonly cy: SVGAnimatedLength;
+    readonly rx: SVGAnimatedLength;
+    readonly ry: SVGAnimatedLength;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGEllipseElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGEllipseElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGEllipseElement: {
+    prototype: SVGEllipseElement;
+    new(): SVGEllipseElement;
+};
+
+/** Corresponds to the <feBlend> element. */
+interface SVGFEBlendElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    readonly in1: SVGAnimatedString;
+    readonly in2: SVGAnimatedString;
+    readonly mode: SVGAnimatedEnumeration;
+    readonly SVG_FEBLEND_MODE_UNKNOWN: 0;
+    readonly SVG_FEBLEND_MODE_NORMAL: 1;
+    readonly SVG_FEBLEND_MODE_MULTIPLY: 2;
+    readonly SVG_FEBLEND_MODE_SCREEN: 3;
+    readonly SVG_FEBLEND_MODE_DARKEN: 4;
+    readonly SVG_FEBLEND_MODE_LIGHTEN: 5;
+    readonly SVG_FEBLEND_MODE_OVERLAY: 6;
+    readonly SVG_FEBLEND_MODE_COLOR_DODGE: 7;
+    readonly SVG_FEBLEND_MODE_COLOR_BURN: 8;
+    readonly SVG_FEBLEND_MODE_HARD_LIGHT: 9;
+    readonly SVG_FEBLEND_MODE_SOFT_LIGHT: 10;
+    readonly SVG_FEBLEND_MODE_DIFFERENCE: 11;
+    readonly SVG_FEBLEND_MODE_EXCLUSION: 12;
+    readonly SVG_FEBLEND_MODE_HUE: 13;
+    readonly SVG_FEBLEND_MODE_SATURATION: 14;
+    readonly SVG_FEBLEND_MODE_COLOR: 15;
+    readonly SVG_FEBLEND_MODE_LUMINOSITY: 16;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEBlendElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEBlendElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEBlendElement: {
+    prototype: SVGFEBlendElement;
+    new(): SVGFEBlendElement;
+    readonly SVG_FEBLEND_MODE_UNKNOWN: 0;
+    readonly SVG_FEBLEND_MODE_NORMAL: 1;
+    readonly SVG_FEBLEND_MODE_MULTIPLY: 2;
+    readonly SVG_FEBLEND_MODE_SCREEN: 3;
+    readonly SVG_FEBLEND_MODE_DARKEN: 4;
+    readonly SVG_FEBLEND_MODE_LIGHTEN: 5;
+    readonly SVG_FEBLEND_MODE_OVERLAY: 6;
+    readonly SVG_FEBLEND_MODE_COLOR_DODGE: 7;
+    readonly SVG_FEBLEND_MODE_COLOR_BURN: 8;
+    readonly SVG_FEBLEND_MODE_HARD_LIGHT: 9;
+    readonly SVG_FEBLEND_MODE_SOFT_LIGHT: 10;
+    readonly SVG_FEBLEND_MODE_DIFFERENCE: 11;
+    readonly SVG_FEBLEND_MODE_EXCLUSION: 12;
+    readonly SVG_FEBLEND_MODE_HUE: 13;
+    readonly SVG_FEBLEND_MODE_SATURATION: 14;
+    readonly SVG_FEBLEND_MODE_COLOR: 15;
+    readonly SVG_FEBLEND_MODE_LUMINOSITY: 16;
+};
+
+/** Corresponds to the <feColorMatrix> element. */
+interface SVGFEColorMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    readonly in1: SVGAnimatedString;
+    readonly type: SVGAnimatedEnumeration;
+    readonly values: SVGAnimatedNumberList;
+    readonly SVG_FECOLORMATRIX_TYPE_UNKNOWN: 0;
+    readonly SVG_FECOLORMATRIX_TYPE_MATRIX: 1;
+    readonly SVG_FECOLORMATRIX_TYPE_SATURATE: 2;
+    readonly SVG_FECOLORMATRIX_TYPE_HUEROTATE: 3;
+    readonly SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: 4;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEColorMatrixElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEColorMatrixElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEColorMatrixElement: {
+    prototype: SVGFEColorMatrixElement;
+    new(): SVGFEColorMatrixElement;
+    readonly SVG_FECOLORMATRIX_TYPE_UNKNOWN: 0;
+    readonly SVG_FECOLORMATRIX_TYPE_MATRIX: 1;
+    readonly SVG_FECOLORMATRIX_TYPE_SATURATE: 2;
+    readonly SVG_FECOLORMATRIX_TYPE_HUEROTATE: 3;
+    readonly SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: 4;
+};
+
+/** Corresponds to the <feComponentTransfer> element. */
+interface SVGFEComponentTransferElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    readonly in1: SVGAnimatedString;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEComponentTransferElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEComponentTransferElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEComponentTransferElement: {
+    prototype: SVGFEComponentTransferElement;
+    new(): SVGFEComponentTransferElement;
+};
+
+/** Corresponds to the <feComposite> element. */
+interface SVGFECompositeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    readonly in1: SVGAnimatedString;
+    readonly in2: SVGAnimatedString;
+    readonly k1: SVGAnimatedNumber;
+    readonly k2: SVGAnimatedNumber;
+    readonly k3: SVGAnimatedNumber;
+    readonly k4: SVGAnimatedNumber;
+    readonly operator: SVGAnimatedEnumeration;
+    readonly SVG_FECOMPOSITE_OPERATOR_UNKNOWN: 0;
+    readonly SVG_FECOMPOSITE_OPERATOR_OVER: 1;
+    readonly SVG_FECOMPOSITE_OPERATOR_IN: 2;
+    readonly SVG_FECOMPOSITE_OPERATOR_OUT: 3;
+    readonly SVG_FECOMPOSITE_OPERATOR_ATOP: 4;
+    readonly SVG_FECOMPOSITE_OPERATOR_XOR: 5;
+    readonly SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: 6;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFECompositeElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFECompositeElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFECompositeElement: {
+    prototype: SVGFECompositeElement;
+    new(): SVGFECompositeElement;
+    readonly SVG_FECOMPOSITE_OPERATOR_UNKNOWN: 0;
+    readonly SVG_FECOMPOSITE_OPERATOR_OVER: 1;
+    readonly SVG_FECOMPOSITE_OPERATOR_IN: 2;
+    readonly SVG_FECOMPOSITE_OPERATOR_OUT: 3;
+    readonly SVG_FECOMPOSITE_OPERATOR_ATOP: 4;
+    readonly SVG_FECOMPOSITE_OPERATOR_XOR: 5;
+    readonly SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: 6;
+};
+
+/** Corresponds to the <feConvolveMatrix> element. */
+interface SVGFEConvolveMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    readonly bias: SVGAnimatedNumber;
+    readonly divisor: SVGAnimatedNumber;
+    readonly edgeMode: SVGAnimatedEnumeration;
+    readonly in1: SVGAnimatedString;
+    readonly kernelMatrix: SVGAnimatedNumberList;
+    readonly kernelUnitLengthX: SVGAnimatedNumber;
+    readonly kernelUnitLengthY: SVGAnimatedNumber;
+    readonly orderX: SVGAnimatedInteger;
+    readonly orderY: SVGAnimatedInteger;
+    readonly preserveAlpha: SVGAnimatedBoolean;
+    readonly targetX: SVGAnimatedInteger;
+    readonly targetY: SVGAnimatedInteger;
+    readonly SVG_EDGEMODE_UNKNOWN: 0;
+    readonly SVG_EDGEMODE_DUPLICATE: 1;
+    readonly SVG_EDGEMODE_WRAP: 2;
+    readonly SVG_EDGEMODE_NONE: 3;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEConvolveMatrixElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEConvolveMatrixElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEConvolveMatrixElement: {
+    prototype: SVGFEConvolveMatrixElement;
+    new(): SVGFEConvolveMatrixElement;
+    readonly SVG_EDGEMODE_UNKNOWN: 0;
+    readonly SVG_EDGEMODE_DUPLICATE: 1;
+    readonly SVG_EDGEMODE_WRAP: 2;
+    readonly SVG_EDGEMODE_NONE: 3;
+};
+
+/** Corresponds to the <feDiffuseLighting> element. */
+interface SVGFEDiffuseLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    readonly diffuseConstant: SVGAnimatedNumber;
+    readonly in1: SVGAnimatedString;
+    readonly kernelUnitLengthX: SVGAnimatedNumber;
+    readonly kernelUnitLengthY: SVGAnimatedNumber;
+    readonly surfaceScale: SVGAnimatedNumber;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDiffuseLightingElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDiffuseLightingElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEDiffuseLightingElement: {
+    prototype: SVGFEDiffuseLightingElement;
+    new(): SVGFEDiffuseLightingElement;
+};
+
+/** Corresponds to the <feDisplacementMap> element. */
+interface SVGFEDisplacementMapElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    readonly in1: SVGAnimatedString;
+    readonly in2: SVGAnimatedString;
+    readonly scale: SVGAnimatedNumber;
+    readonly xChannelSelector: SVGAnimatedEnumeration;
+    readonly yChannelSelector: SVGAnimatedEnumeration;
+    readonly SVG_CHANNEL_UNKNOWN: 0;
+    readonly SVG_CHANNEL_R: 1;
+    readonly SVG_CHANNEL_G: 2;
+    readonly SVG_CHANNEL_B: 3;
+    readonly SVG_CHANNEL_A: 4;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDisplacementMapElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDisplacementMapElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEDisplacementMapElement: {
+    prototype: SVGFEDisplacementMapElement;
+    new(): SVGFEDisplacementMapElement;
+    readonly SVG_CHANNEL_UNKNOWN: 0;
+    readonly SVG_CHANNEL_R: 1;
+    readonly SVG_CHANNEL_G: 2;
+    readonly SVG_CHANNEL_B: 3;
+    readonly SVG_CHANNEL_A: 4;
+};
+
+/** Corresponds to the <feDistantLight> element. */
+interface SVGFEDistantLightElement extends SVGElement {
+    readonly azimuth: SVGAnimatedNumber;
+    readonly elevation: SVGAnimatedNumber;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDistantLightElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDistantLightElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEDistantLightElement: {
+    prototype: SVGFEDistantLightElement;
+    new(): SVGFEDistantLightElement;
+};
+
+interface SVGFEDropShadowElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    readonly dx: SVGAnimatedNumber;
+    readonly dy: SVGAnimatedNumber;
+    readonly in1: SVGAnimatedString;
+    readonly stdDeviationX: SVGAnimatedNumber;
+    readonly stdDeviationY: SVGAnimatedNumber;
+    setStdDeviation(stdDeviationX: number, stdDeviationY: number): void;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDropShadowElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDropShadowElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEDropShadowElement: {
+    prototype: SVGFEDropShadowElement;
+    new(): SVGFEDropShadowElement;
+};
+
+/** Corresponds to the <feFlood> element. */
+interface SVGFEFloodElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFloodElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFloodElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEFloodElement: {
+    prototype: SVGFEFloodElement;
+    new(): SVGFEFloodElement;
+};
+
+/** Corresponds to the <feFuncA> element. */
+interface SVGFEFuncAElement extends SVGComponentTransferFunctionElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncAElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncAElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEFuncAElement: {
+    prototype: SVGFEFuncAElement;
+    new(): SVGFEFuncAElement;
+};
+
+/** Corresponds to the <feFuncB> element. */
+interface SVGFEFuncBElement extends SVGComponentTransferFunctionElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncBElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncBElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEFuncBElement: {
+    prototype: SVGFEFuncBElement;
+    new(): SVGFEFuncBElement;
+};
+
+/** Corresponds to the <feFuncG> element. */
+interface SVGFEFuncGElement extends SVGComponentTransferFunctionElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEFuncGElement: {
+    prototype: SVGFEFuncGElement;
+    new(): SVGFEFuncGElement;
+};
+
+/** Corresponds to the <feFuncR> element. */
+interface SVGFEFuncRElement extends SVGComponentTransferFunctionElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncRElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncRElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEFuncRElement: {
+    prototype: SVGFEFuncRElement;
+    new(): SVGFEFuncRElement;
+};
+
+/** Corresponds to the <feGaussianBlur> element. */
+interface SVGFEGaussianBlurElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    readonly in1: SVGAnimatedString;
+    readonly stdDeviationX: SVGAnimatedNumber;
+    readonly stdDeviationY: SVGAnimatedNumber;
+    setStdDeviation(stdDeviationX: number, stdDeviationY: number): void;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEGaussianBlurElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEGaussianBlurElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEGaussianBlurElement: {
+    prototype: SVGFEGaussianBlurElement;
+    new(): SVGFEGaussianBlurElement;
+};
+
+/** Corresponds to the <feImage> element. */
+interface SVGFEImageElement extends SVGElement, SVGFilterPrimitiveStandardAttributes, SVGURIReference {
+    readonly preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEImageElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEImageElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEImageElement: {
+    prototype: SVGFEImageElement;
+    new(): SVGFEImageElement;
+};
+
+/** Corresponds to the <feMerge> element. */
+interface SVGFEMergeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMergeElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMergeElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEMergeElement: {
+    prototype: SVGFEMergeElement;
+    new(): SVGFEMergeElement;
+};
+
+/** Corresponds to the <feMergeNode> element. */
+interface SVGFEMergeNodeElement extends SVGElement {
+    readonly in1: SVGAnimatedString;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMergeNodeElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMergeNodeElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEMergeNodeElement: {
+    prototype: SVGFEMergeNodeElement;
+    new(): SVGFEMergeNodeElement;
+};
+
+/** Corresponds to the <feMorphology> element. */
+interface SVGFEMorphologyElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    readonly in1: SVGAnimatedString;
+    readonly operator: SVGAnimatedEnumeration;
+    readonly radiusX: SVGAnimatedNumber;
+    readonly radiusY: SVGAnimatedNumber;
+    readonly SVG_MORPHOLOGY_OPERATOR_UNKNOWN: 0;
+    readonly SVG_MORPHOLOGY_OPERATOR_ERODE: 1;
+    readonly SVG_MORPHOLOGY_OPERATOR_DILATE: 2;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMorphologyElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMorphologyElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEMorphologyElement: {
+    prototype: SVGFEMorphologyElement;
+    new(): SVGFEMorphologyElement;
+    readonly SVG_MORPHOLOGY_OPERATOR_UNKNOWN: 0;
+    readonly SVG_MORPHOLOGY_OPERATOR_ERODE: 1;
+    readonly SVG_MORPHOLOGY_OPERATOR_DILATE: 2;
+};
+
+/** Corresponds to the <feOffset> element. */
+interface SVGFEOffsetElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    readonly dx: SVGAnimatedNumber;
+    readonly dy: SVGAnimatedNumber;
+    readonly in1: SVGAnimatedString;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEOffsetElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEOffsetElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEOffsetElement: {
+    prototype: SVGFEOffsetElement;
+    new(): SVGFEOffsetElement;
+};
+
+/** Corresponds to the <fePointLight> element. */
+interface SVGFEPointLightElement extends SVGElement {
+    readonly x: SVGAnimatedNumber;
+    readonly y: SVGAnimatedNumber;
+    readonly z: SVGAnimatedNumber;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEPointLightElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEPointLightElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFEPointLightElement: {
+    prototype: SVGFEPointLightElement;
+    new(): SVGFEPointLightElement;
+};
+
+/** Corresponds to the <feSpecularLighting> element. */
+interface SVGFESpecularLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    readonly in1: SVGAnimatedString;
+    readonly kernelUnitLengthX: SVGAnimatedNumber;
+    readonly kernelUnitLengthY: SVGAnimatedNumber;
+    readonly specularConstant: SVGAnimatedNumber;
+    readonly specularExponent: SVGAnimatedNumber;
+    readonly surfaceScale: SVGAnimatedNumber;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFESpecularLightingElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFESpecularLightingElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFESpecularLightingElement: {
+    prototype: SVGFESpecularLightingElement;
+    new(): SVGFESpecularLightingElement;
+};
+
+/** Corresponds to the <feSpotLight> element. */
+interface SVGFESpotLightElement extends SVGElement {
+    readonly limitingConeAngle: SVGAnimatedNumber;
+    readonly pointsAtX: SVGAnimatedNumber;
+    readonly pointsAtY: SVGAnimatedNumber;
+    readonly pointsAtZ: SVGAnimatedNumber;
+    readonly specularExponent: SVGAnimatedNumber;
+    readonly x: SVGAnimatedNumber;
+    readonly y: SVGAnimatedNumber;
+    readonly z: SVGAnimatedNumber;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFESpotLightElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFESpotLightElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFESpotLightElement: {
+    prototype: SVGFESpotLightElement;
+    new(): SVGFESpotLightElement;
+};
+
+/** Corresponds to the <feTile> element. */
+interface SVGFETileElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    readonly in1: SVGAnimatedString;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFETileElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFETileElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFETileElement: {
+    prototype: SVGFETileElement;
+    new(): SVGFETileElement;
+};
+
+/** Corresponds to the <feTurbulence> element. */
+interface SVGFETurbulenceElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
+    readonly baseFrequencyX: SVGAnimatedNumber;
+    readonly baseFrequencyY: SVGAnimatedNumber;
+    readonly numOctaves: SVGAnimatedInteger;
+    readonly seed: SVGAnimatedNumber;
+    readonly stitchTiles: SVGAnimatedEnumeration;
+    readonly type: SVGAnimatedEnumeration;
+    readonly SVG_TURBULENCE_TYPE_UNKNOWN: 0;
+    readonly SVG_TURBULENCE_TYPE_FRACTALNOISE: 1;
+    readonly SVG_TURBULENCE_TYPE_TURBULENCE: 2;
+    readonly SVG_STITCHTYPE_UNKNOWN: 0;
+    readonly SVG_STITCHTYPE_STITCH: 1;
+    readonly SVG_STITCHTYPE_NOSTITCH: 2;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFETurbulenceElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFETurbulenceElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFETurbulenceElement: {
+    prototype: SVGFETurbulenceElement;
+    new(): SVGFETurbulenceElement;
+    readonly SVG_TURBULENCE_TYPE_UNKNOWN: 0;
+    readonly SVG_TURBULENCE_TYPE_FRACTALNOISE: 1;
+    readonly SVG_TURBULENCE_TYPE_TURBULENCE: 2;
+    readonly SVG_STITCHTYPE_UNKNOWN: 0;
+    readonly SVG_STITCHTYPE_STITCH: 1;
+    readonly SVG_STITCHTYPE_NOSTITCH: 2;
+};
+
+/** Provides access to the properties of <filter> elements, as well as methods to manipulate them. */
+interface SVGFilterElement extends SVGElement, SVGURIReference {
+    readonly filterUnits: SVGAnimatedEnumeration;
+    readonly height: SVGAnimatedLength;
+    readonly primitiveUnits: SVGAnimatedEnumeration;
+    readonly width: SVGAnimatedLength;
+    readonly x: SVGAnimatedLength;
+    readonly y: SVGAnimatedLength;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFilterElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFilterElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGFilterElement: {
+    prototype: SVGFilterElement;
+    new(): SVGFilterElement;
+};
+
+interface SVGFilterPrimitiveStandardAttributes {
+    readonly height: SVGAnimatedLength;
+    readonly result: SVGAnimatedString;
+    readonly width: SVGAnimatedLength;
+    readonly x: SVGAnimatedLength;
+    readonly y: SVGAnimatedLength;
+}
+
+interface SVGFitToViewBox {
+    readonly preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
+    readonly viewBox: SVGAnimatedRect;
+}
+
+/** Provides access to the properties of <foreignObject> elements, as well as methods to manipulate them. */
+interface SVGForeignObjectElement extends SVGGraphicsElement {
+    readonly height: SVGAnimatedLength;
+    readonly width: SVGAnimatedLength;
+    readonly x: SVGAnimatedLength;
+    readonly y: SVGAnimatedLength;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGForeignObjectElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGForeignObjectElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGForeignObjectElement: {
+    prototype: SVGForeignObjectElement;
+    new(): SVGForeignObjectElement;
+};
+
+/** Corresponds to the <g> element. */
+interface SVGGElement extends SVGGraphicsElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGGElement: {
+    prototype: SVGGElement;
+    new(): SVGGElement;
+};
+
+interface SVGGeometryElement extends SVGGraphicsElement {
+    readonly pathLength: SVGAnimatedNumber;
+    getPointAtLength(distance: number): DOMPoint;
+    getTotalLength(): number;
+    isPointInFill(point?: DOMPointInit): boolean;
+    isPointInStroke(point?: DOMPointInit): boolean;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGeometryElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGeometryElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGGeometryElement: {
+    prototype: SVGGeometryElement;
+    new(): SVGGeometryElement;
+};
+
+/** The SVGGradient interface is a base interface used by SVGLinearGradientElement and SVGRadialGradientElement. */
+interface SVGGradientElement extends SVGElement, SVGURIReference {
+    readonly gradientTransform: SVGAnimatedTransformList;
+    readonly gradientUnits: SVGAnimatedEnumeration;
+    readonly spreadMethod: SVGAnimatedEnumeration;
+    readonly SVG_SPREADMETHOD_UNKNOWN: 0;
+    readonly SVG_SPREADMETHOD_PAD: 1;
+    readonly SVG_SPREADMETHOD_REFLECT: 2;
+    readonly SVG_SPREADMETHOD_REPEAT: 3;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGradientElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGradientElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGGradientElement: {
+    prototype: SVGGradientElement;
+    new(): SVGGradientElement;
+    readonly SVG_SPREADMETHOD_UNKNOWN: 0;
+    readonly SVG_SPREADMETHOD_PAD: 1;
+    readonly SVG_SPREADMETHOD_REFLECT: 2;
+    readonly SVG_SPREADMETHOD_REPEAT: 3;
+};
+
+/** SVG elements whose primary purpose is to directly render graphics into a group. */
+interface SVGGraphicsElement extends SVGElement, SVGTests {
+    readonly transform: SVGAnimatedTransformList;
+    getBBox(options?: SVGBoundingBoxOptions): DOMRect;
+    getCTM(): DOMMatrix | null;
+    getScreenCTM(): DOMMatrix | null;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGraphicsElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGraphicsElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGGraphicsElement: {
+    prototype: SVGGraphicsElement;
+    new(): SVGGraphicsElement;
+};
+
+/** Corresponds to the <image> element. */
+interface SVGImageElement extends SVGGraphicsElement, SVGURIReference {
+    readonly height: SVGAnimatedLength;
+    readonly preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
+    readonly width: SVGAnimatedLength;
+    readonly x: SVGAnimatedLength;
+    readonly y: SVGAnimatedLength;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGImageElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGImageElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGImageElement: {
+    prototype: SVGImageElement;
+    new(): SVGImageElement;
+};
+
+/** Correspond to the <length> basic data type. */
+interface SVGLength {
+    readonly unitType: number;
+    value: number;
+    valueAsString: string;
+    valueInSpecifiedUnits: number;
+    convertToSpecifiedUnits(unitType: number): void;
+    newValueSpecifiedUnits(unitType: number, valueInSpecifiedUnits: number): void;
+    readonly SVG_LENGTHTYPE_UNKNOWN: 0;
+    readonly SVG_LENGTHTYPE_NUMBER: 1;
+    readonly SVG_LENGTHTYPE_PERCENTAGE: 2;
+    readonly SVG_LENGTHTYPE_EMS: 3;
+    readonly SVG_LENGTHTYPE_EXS: 4;
+    readonly SVG_LENGTHTYPE_PX: 5;
+    readonly SVG_LENGTHTYPE_CM: 6;
+    readonly SVG_LENGTHTYPE_MM: 7;
+    readonly SVG_LENGTHTYPE_IN: 8;
+    readonly SVG_LENGTHTYPE_PT: 9;
+    readonly SVG_LENGTHTYPE_PC: 10;
+}
+
+declare var SVGLength: {
+    prototype: SVGLength;
+    new(): SVGLength;
+    readonly SVG_LENGTHTYPE_UNKNOWN: 0;
+    readonly SVG_LENGTHTYPE_NUMBER: 1;
+    readonly SVG_LENGTHTYPE_PERCENTAGE: 2;
+    readonly SVG_LENGTHTYPE_EMS: 3;
+    readonly SVG_LENGTHTYPE_EXS: 4;
+    readonly SVG_LENGTHTYPE_PX: 5;
+    readonly SVG_LENGTHTYPE_CM: 6;
+    readonly SVG_LENGTHTYPE_MM: 7;
+    readonly SVG_LENGTHTYPE_IN: 8;
+    readonly SVG_LENGTHTYPE_PT: 9;
+    readonly SVG_LENGTHTYPE_PC: 10;
+};
+
+/** The SVGLengthList defines a list of SVGLength objects. */
+interface SVGLengthList {
+    readonly length: number;
+    readonly numberOfItems: number;
+    appendItem(newItem: SVGLength): SVGLength;
+    clear(): void;
+    getItem(index: number): SVGLength;
+    initialize(newItem: SVGLength): SVGLength;
+    insertItemBefore(newItem: SVGLength, index: number): SVGLength;
+    removeItem(index: number): SVGLength;
+    replaceItem(newItem: SVGLength, index: number): SVGLength;
+    [index: number]: SVGLength;
+}
+
+declare var SVGLengthList: {
+    prototype: SVGLengthList;
+    new(): SVGLengthList;
+};
+
+/** Provides access to the properties of <line> elements, as well as methods to manipulate them. */
+interface SVGLineElement extends SVGGeometryElement {
+    readonly x1: SVGAnimatedLength;
+    readonly x2: SVGAnimatedLength;
+    readonly y1: SVGAnimatedLength;
+    readonly y2: SVGAnimatedLength;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGLineElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGLineElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGLineElement: {
+    prototype: SVGLineElement;
+    new(): SVGLineElement;
+};
+
+/** Corresponds to the <linearGradient> element. */
+interface SVGLinearGradientElement extends SVGGradientElement {
+    readonly x1: SVGAnimatedLength;
+    readonly x2: SVGAnimatedLength;
+    readonly y1: SVGAnimatedLength;
+    readonly y2: SVGAnimatedLength;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGLinearGradientElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGLinearGradientElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGLinearGradientElement: {
+    prototype: SVGLinearGradientElement;
+    new(): SVGLinearGradientElement;
+};
+
+interface SVGMPathElement extends SVGElement, SVGURIReference {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGMPathElement: {
+    prototype: SVGMPathElement;
+    new(): SVGMPathElement;
+};
+
+interface SVGMarkerElement extends SVGElement, SVGFitToViewBox {
+    readonly markerHeight: SVGAnimatedLength;
+    readonly markerUnits: SVGAnimatedEnumeration;
+    readonly markerWidth: SVGAnimatedLength;
+    readonly orientAngle: SVGAnimatedAngle;
+    readonly orientType: SVGAnimatedEnumeration;
+    readonly refX: SVGAnimatedLength;
+    readonly refY: SVGAnimatedLength;
+    setOrientToAngle(angle: SVGAngle): void;
+    setOrientToAuto(): void;
+    readonly SVG_MARKERUNITS_UNKNOWN: 0;
+    readonly SVG_MARKERUNITS_USERSPACEONUSE: 1;
+    readonly SVG_MARKERUNITS_STROKEWIDTH: 2;
+    readonly SVG_MARKER_ORIENT_UNKNOWN: 0;
+    readonly SVG_MARKER_ORIENT_AUTO: 1;
+    readonly SVG_MARKER_ORIENT_ANGLE: 2;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMarkerElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMarkerElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGMarkerElement: {
+    prototype: SVGMarkerElement;
+    new(): SVGMarkerElement;
+    readonly SVG_MARKERUNITS_UNKNOWN: 0;
+    readonly SVG_MARKERUNITS_USERSPACEONUSE: 1;
+    readonly SVG_MARKERUNITS_STROKEWIDTH: 2;
+    readonly SVG_MARKER_ORIENT_UNKNOWN: 0;
+    readonly SVG_MARKER_ORIENT_AUTO: 1;
+    readonly SVG_MARKER_ORIENT_ANGLE: 2;
+};
+
+/** Provides access to the properties of <mask> elements, as well as methods to manipulate them. */
+interface SVGMaskElement extends SVGElement {
+    readonly height: SVGAnimatedLength;
+    readonly maskContentUnits: SVGAnimatedEnumeration;
+    readonly maskUnits: SVGAnimatedEnumeration;
+    readonly width: SVGAnimatedLength;
+    readonly x: SVGAnimatedLength;
+    readonly y: SVGAnimatedLength;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMaskElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMaskElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGMaskElement: {
+    prototype: SVGMaskElement;
+    new(): SVGMaskElement;
+};
+
+/** Corresponds to the <metadata> element. */
+interface SVGMetadataElement extends SVGElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMetadataElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMetadataElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGMetadataElement: {
+    prototype: SVGMetadataElement;
+    new(): SVGMetadataElement;
+};
+
+/** Corresponds to the <number> basic data type. */
+interface SVGNumber {
+    value: number;
+}
+
+declare var SVGNumber: {
+    prototype: SVGNumber;
+    new(): SVGNumber;
+};
+
+/** The SVGNumberList defines a list of SVGNumber objects. */
+interface SVGNumberList {
+    readonly length: number;
+    readonly numberOfItems: number;
+    appendItem(newItem: SVGNumber): SVGNumber;
+    clear(): void;
+    getItem(index: number): SVGNumber;
+    initialize(newItem: SVGNumber): SVGNumber;
+    insertItemBefore(newItem: SVGNumber, index: number): SVGNumber;
+    removeItem(index: number): SVGNumber;
+    replaceItem(newItem: SVGNumber, index: number): SVGNumber;
+    [index: number]: SVGNumber;
+}
+
+declare var SVGNumberList: {
+    prototype: SVGNumberList;
+    new(): SVGNumberList;
+};
+
+/** Corresponds to the <path> element. */
+interface SVGPathElement extends SVGGeometryElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGPathElement: {
+    prototype: SVGPathElement;
+    new(): SVGPathElement;
+};
+
+/** Corresponds to the <pattern> element. */
+interface SVGPatternElement extends SVGElement, SVGFitToViewBox, SVGURIReference {
+    readonly height: SVGAnimatedLength;
+    readonly patternContentUnits: SVGAnimatedEnumeration;
+    readonly patternTransform: SVGAnimatedTransformList;
+    readonly patternUnits: SVGAnimatedEnumeration;
+    readonly width: SVGAnimatedLength;
+    readonly x: SVGAnimatedLength;
+    readonly y: SVGAnimatedLength;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPatternElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPatternElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGPatternElement: {
+    prototype: SVGPatternElement;
+    new(): SVGPatternElement;
+};
+
+interface SVGPointList {
+    readonly length: number;
+    readonly numberOfItems: number;
+    appendItem(newItem: DOMPoint): DOMPoint;
+    clear(): void;
+    getItem(index: number): DOMPoint;
+    initialize(newItem: DOMPoint): DOMPoint;
+    insertItemBefore(newItem: DOMPoint, index: number): DOMPoint;
+    removeItem(index: number): DOMPoint;
+    replaceItem(newItem: DOMPoint, index: number): DOMPoint;
+    [index: number]: DOMPoint;
+}
+
+declare var SVGPointList: {
+    prototype: SVGPointList;
+    new(): SVGPointList;
+};
+
+/** Provides access to the properties of <polygon> elements, as well as methods to manipulate them. */
+interface SVGPolygonElement extends SVGGeometryElement, SVGAnimatedPoints {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPolygonElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPolygonElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGPolygonElement: {
+    prototype: SVGPolygonElement;
+    new(): SVGPolygonElement;
+};
+
+/** Provides access to the properties of <polyline> elements, as well as methods to manipulate them. */
+interface SVGPolylineElement extends SVGGeometryElement, SVGAnimatedPoints {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPolylineElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPolylineElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGPolylineElement: {
+    prototype: SVGPolylineElement;
+    new(): SVGPolylineElement;
+};
+
+/** Corresponds to the preserveAspectRatio attribute, which is available for some of SVG's elements. */
+interface SVGPreserveAspectRatio {
+    align: number;
+    meetOrSlice: number;
+    readonly SVG_PRESERVEASPECTRATIO_UNKNOWN: 0;
+    readonly SVG_PRESERVEASPECTRATIO_NONE: 1;
+    readonly SVG_PRESERVEASPECTRATIO_XMINYMIN: 2;
+    readonly SVG_PRESERVEASPECTRATIO_XMIDYMIN: 3;
+    readonly SVG_PRESERVEASPECTRATIO_XMAXYMIN: 4;
+    readonly SVG_PRESERVEASPECTRATIO_XMINYMID: 5;
+    readonly SVG_PRESERVEASPECTRATIO_XMIDYMID: 6;
+    readonly SVG_PRESERVEASPECTRATIO_XMAXYMID: 7;
+    readonly SVG_PRESERVEASPECTRATIO_XMINYMAX: 8;
+    readonly SVG_PRESERVEASPECTRATIO_XMIDYMAX: 9;
+    readonly SVG_PRESERVEASPECTRATIO_XMAXYMAX: 10;
+    readonly SVG_MEETORSLICE_UNKNOWN: 0;
+    readonly SVG_MEETORSLICE_MEET: 1;
+    readonly SVG_MEETORSLICE_SLICE: 2;
+}
+
+declare var SVGPreserveAspectRatio: {
+    prototype: SVGPreserveAspectRatio;
+    new(): SVGPreserveAspectRatio;
+    readonly SVG_PRESERVEASPECTRATIO_UNKNOWN: 0;
+    readonly SVG_PRESERVEASPECTRATIO_NONE: 1;
+    readonly SVG_PRESERVEASPECTRATIO_XMINYMIN: 2;
+    readonly SVG_PRESERVEASPECTRATIO_XMIDYMIN: 3;
+    readonly SVG_PRESERVEASPECTRATIO_XMAXYMIN: 4;
+    readonly SVG_PRESERVEASPECTRATIO_XMINYMID: 5;
+    readonly SVG_PRESERVEASPECTRATIO_XMIDYMID: 6;
+    readonly SVG_PRESERVEASPECTRATIO_XMAXYMID: 7;
+    readonly SVG_PRESERVEASPECTRATIO_XMINYMAX: 8;
+    readonly SVG_PRESERVEASPECTRATIO_XMIDYMAX: 9;
+    readonly SVG_PRESERVEASPECTRATIO_XMAXYMAX: 10;
+    readonly SVG_MEETORSLICE_UNKNOWN: 0;
+    readonly SVG_MEETORSLICE_MEET: 1;
+    readonly SVG_MEETORSLICE_SLICE: 2;
+};
+
+/** Corresponds to the <RadialGradient> element. */
+interface SVGRadialGradientElement extends SVGGradientElement {
+    readonly cx: SVGAnimatedLength;
+    readonly cy: SVGAnimatedLength;
+    readonly fr: SVGAnimatedLength;
+    readonly fx: SVGAnimatedLength;
+    readonly fy: SVGAnimatedLength;
+    readonly r: SVGAnimatedLength;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGRadialGradientElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGRadialGradientElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGRadialGradientElement: {
+    prototype: SVGRadialGradientElement;
+    new(): SVGRadialGradientElement;
+};
+
+/** Provides access to the properties of <rect> elements, as well as methods to manipulate them. */
+interface SVGRectElement extends SVGGeometryElement {
+    readonly height: SVGAnimatedLength;
+    readonly rx: SVGAnimatedLength;
+    readonly ry: SVGAnimatedLength;
+    readonly width: SVGAnimatedLength;
+    readonly x: SVGAnimatedLength;
+    readonly y: SVGAnimatedLength;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGRectElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGRectElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGRectElement: {
+    prototype: SVGRectElement;
+    new(): SVGRectElement;
+};
+
+interface SVGSVGElementEventMap extends SVGElementEventMap, WindowEventHandlersEventMap {
+}
+
+/** Provides access to the properties of <svg> elements, as well as methods to manipulate them. This interface contains also various miscellaneous commonly-used utility methods, such as matrix operations and the ability to control the time of redraw on visual rendering devices. */
+interface SVGSVGElement extends SVGGraphicsElement, SVGFitToViewBox, WindowEventHandlers {
+    currentScale: number;
+    readonly currentTranslate: DOMPointReadOnly;
+    readonly height: SVGAnimatedLength;
+    readonly width: SVGAnimatedLength;
+    readonly x: SVGAnimatedLength;
+    readonly y: SVGAnimatedLength;
+    animationsPaused(): boolean;
+    checkEnclosure(element: SVGElement, rect: DOMRectReadOnly): boolean;
+    checkIntersection(element: SVGElement, rect: DOMRectReadOnly): boolean;
+    createSVGAngle(): SVGAngle;
+    createSVGLength(): SVGLength;
+    createSVGMatrix(): DOMMatrix;
+    createSVGNumber(): SVGNumber;
+    createSVGPoint(): DOMPoint;
+    createSVGRect(): DOMRect;
+    createSVGTransform(): SVGTransform;
+    createSVGTransformFromMatrix(matrix?: DOMMatrix2DInit): SVGTransform;
+    deselectAll(): void;
+    /** @deprecated */
+    forceRedraw(): void;
+    getCurrentTime(): number;
+    getElementById(elementId: string): Element;
+    getEnclosureList(rect: DOMRectReadOnly, referenceElement: SVGElement | null): NodeListOf<SVGCircleElement | SVGEllipseElement | SVGImageElement | SVGLineElement | SVGPathElement | SVGPolygonElement | SVGPolylineElement | SVGRectElement | SVGTextElement | SVGUseElement>;
+    getIntersectionList(rect: DOMRectReadOnly, referenceElement: SVGElement | null): NodeListOf<SVGCircleElement | SVGEllipseElement | SVGImageElement | SVGLineElement | SVGPathElement | SVGPolygonElement | SVGPolylineElement | SVGRectElement | SVGTextElement | SVGUseElement>;
+    pauseAnimations(): void;
+    setCurrentTime(seconds: number): void;
+    /** @deprecated */
+    suspendRedraw(maxWaitMilliseconds: number): number;
+    unpauseAnimations(): void;
+    /** @deprecated */
+    unsuspendRedraw(suspendHandleID: number): void;
+    /** @deprecated */
+    unsuspendRedrawAll(): void;
+    addEventListener<K extends keyof SVGSVGElementEventMap>(type: K, listener: (this: SVGSVGElement, ev: SVGSVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGSVGElementEventMap>(type: K, listener: (this: SVGSVGElement, ev: SVGSVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGSVGElement: {
+    prototype: SVGSVGElement;
+    new(): SVGSVGElement;
+};
+
+/** Corresponds to the SVG <script> element. */
+interface SVGScriptElement extends SVGElement, SVGURIReference {
+    type: string;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGScriptElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGScriptElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGScriptElement: {
+    prototype: SVGScriptElement;
+    new(): SVGScriptElement;
+};
+
+interface SVGSetElement extends SVGAnimationElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSetElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSetElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGSetElement: {
+    prototype: SVGSetElement;
+    new(): SVGSetElement;
+};
+
+/** Corresponds to the <stop> element. */
+interface SVGStopElement extends SVGElement {
+    readonly offset: SVGAnimatedNumber;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGStopElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGStopElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGStopElement: {
+    prototype: SVGStopElement;
+    new(): SVGStopElement;
+};
+
+/** The SVGStringList defines a list of DOMString objects. */
+interface SVGStringList {
+    readonly length: number;
+    readonly numberOfItems: number;
+    appendItem(newItem: string): string;
+    clear(): void;
+    getItem(index: number): string;
+    initialize(newItem: string): string;
+    insertItemBefore(newItem: string, index: number): string;
+    removeItem(index: number): string;
+    replaceItem(newItem: string, index: number): string;
+    [index: number]: string;
+}
+
+declare var SVGStringList: {
+    prototype: SVGStringList;
+    new(): SVGStringList;
+};
+
+/** Corresponds to the SVG <style> element. */
+interface SVGStyleElement extends SVGElement, LinkStyle {
+    disabled: boolean;
+    media: string;
+    title: string;
+    /** @deprecated */
+    type: string;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGStyleElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGStyleElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGStyleElement: {
+    prototype: SVGStyleElement;
+    new(): SVGStyleElement;
+};
+
+/** Corresponds to the <switch> element. */
+interface SVGSwitchElement extends SVGGraphicsElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSwitchElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSwitchElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGSwitchElement: {
+    prototype: SVGSwitchElement;
+    new(): SVGSwitchElement;
+};
+
+/** Corresponds to the <symbol> element. */
+interface SVGSymbolElement extends SVGElement, SVGFitToViewBox {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSymbolElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSymbolElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGSymbolElement: {
+    prototype: SVGSymbolElement;
+    new(): SVGSymbolElement;
+};
+
+/** A <tspan> element. */
+interface SVGTSpanElement extends SVGTextPositioningElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTSpanElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTSpanElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGTSpanElement: {
+    prototype: SVGTSpanElement;
+    new(): SVGTSpanElement;
+};
+
+interface SVGTests {
+    readonly requiredExtensions: SVGStringList;
+    readonly systemLanguage: SVGStringList;
+}
+
+/** Implemented by elements that support rendering child text content. It is inherited by various text-related interfaces, such as SVGTextElement, SVGTSpanElement, SVGTRefElement, SVGAltGlyphElement and SVGTextPathElement. */
+interface SVGTextContentElement extends SVGGraphicsElement {
+    readonly lengthAdjust: SVGAnimatedEnumeration;
+    readonly textLength: SVGAnimatedLength;
+    getCharNumAtPosition(point?: DOMPointInit): number;
+    getComputedTextLength(): number;
+    getEndPositionOfChar(charnum: number): DOMPoint;
+    getExtentOfChar(charnum: number): DOMRect;
+    getNumberOfChars(): number;
+    getRotationOfChar(charnum: number): number;
+    getStartPositionOfChar(charnum: number): DOMPoint;
+    getSubStringLength(charnum: number, nchars: number): number;
+    /** @deprecated */
+    selectSubString(charnum: number, nchars: number): void;
+    readonly LENGTHADJUST_UNKNOWN: 0;
+    readonly LENGTHADJUST_SPACING: 1;
+    readonly LENGTHADJUST_SPACINGANDGLYPHS: 2;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextContentElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextContentElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGTextContentElement: {
+    prototype: SVGTextContentElement;
+    new(): SVGTextContentElement;
+    readonly LENGTHADJUST_UNKNOWN: 0;
+    readonly LENGTHADJUST_SPACING: 1;
+    readonly LENGTHADJUST_SPACINGANDGLYPHS: 2;
+};
+
+/** Corresponds to the <text> elements. */
+interface SVGTextElement extends SVGTextPositioningElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGTextElement: {
+    prototype: SVGTextElement;
+    new(): SVGTextElement;
+};
+
+/** Corresponds to the <textPath> element. */
+interface SVGTextPathElement extends SVGTextContentElement, SVGURIReference {
+    readonly method: SVGAnimatedEnumeration;
+    readonly spacing: SVGAnimatedEnumeration;
+    readonly startOffset: SVGAnimatedLength;
+    readonly TEXTPATH_METHODTYPE_UNKNOWN: 0;
+    readonly TEXTPATH_METHODTYPE_ALIGN: 1;
+    readonly TEXTPATH_METHODTYPE_STRETCH: 2;
+    readonly TEXTPATH_SPACINGTYPE_UNKNOWN: 0;
+    readonly TEXTPATH_SPACINGTYPE_AUTO: 1;
+    readonly TEXTPATH_SPACINGTYPE_EXACT: 2;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGTextPathElement: {
+    prototype: SVGTextPathElement;
+    new(): SVGTextPathElement;
+    readonly TEXTPATH_METHODTYPE_UNKNOWN: 0;
+    readonly TEXTPATH_METHODTYPE_ALIGN: 1;
+    readonly TEXTPATH_METHODTYPE_STRETCH: 2;
+    readonly TEXTPATH_SPACINGTYPE_UNKNOWN: 0;
+    readonly TEXTPATH_SPACINGTYPE_AUTO: 1;
+    readonly TEXTPATH_SPACINGTYPE_EXACT: 2;
+};
+
+/** Implemented by elements that support attributes that position individual text glyphs. It is inherited by SVGTextElement, SVGTSpanElement, SVGTRefElement and SVGAltGlyphElement. */
+interface SVGTextPositioningElement extends SVGTextContentElement {
+    readonly dx: SVGAnimatedLengthList;
+    readonly dy: SVGAnimatedLengthList;
+    readonly rotate: SVGAnimatedNumberList;
+    readonly x: SVGAnimatedLengthList;
+    readonly y: SVGAnimatedLengthList;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextPositioningElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextPositioningElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGTextPositioningElement: {
+    prototype: SVGTextPositioningElement;
+    new(): SVGTextPositioningElement;
+};
+
+/** Corresponds to the <title> element. */
+interface SVGTitleElement extends SVGElement {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTitleElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTitleElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGTitleElement: {
+    prototype: SVGTitleElement;
+    new(): SVGTitleElement;
+};
+
+/** SVGTransform is the interface for one of the component transformations within an SVGTransformList; thus, an SVGTransform object corresponds to a single component (e.g., scale(\u2026) or matrix(\u2026)) within a transform attribute. */
+interface SVGTransform {
+    readonly angle: number;
+    readonly matrix: DOMMatrix;
+    readonly type: number;
+    setMatrix(matrix?: DOMMatrix2DInit): void;
+    setRotate(angle: number, cx: number, cy: number): void;
+    setScale(sx: number, sy: number): void;
+    setSkewX(angle: number): void;
+    setSkewY(angle: number): void;
+    setTranslate(tx: number, ty: number): void;
+    readonly SVG_TRANSFORM_UNKNOWN: 0;
+    readonly SVG_TRANSFORM_MATRIX: 1;
+    readonly SVG_TRANSFORM_TRANSLATE: 2;
+    readonly SVG_TRANSFORM_SCALE: 3;
+    readonly SVG_TRANSFORM_ROTATE: 4;
+    readonly SVG_TRANSFORM_SKEWX: 5;
+    readonly SVG_TRANSFORM_SKEWY: 6;
+}
+
+declare var SVGTransform: {
+    prototype: SVGTransform;
+    new(): SVGTransform;
+    readonly SVG_TRANSFORM_UNKNOWN: 0;
+    readonly SVG_TRANSFORM_MATRIX: 1;
+    readonly SVG_TRANSFORM_TRANSLATE: 2;
+    readonly SVG_TRANSFORM_SCALE: 3;
+    readonly SVG_TRANSFORM_ROTATE: 4;
+    readonly SVG_TRANSFORM_SKEWX: 5;
+    readonly SVG_TRANSFORM_SKEWY: 6;
+};
+
+/** The SVGTransformList defines a list of SVGTransform objects. */
+interface SVGTransformList {
+    readonly length: number;
+    readonly numberOfItems: number;
+    appendItem(newItem: SVGTransform): SVGTransform;
+    clear(): void;
+    consolidate(): SVGTransform | null;
+    createSVGTransformFromMatrix(matrix?: DOMMatrix2DInit): SVGTransform;
+    getItem(index: number): SVGTransform;
+    initialize(newItem: SVGTransform): SVGTransform;
+    insertItemBefore(newItem: SVGTransform, index: number): SVGTransform;
+    removeItem(index: number): SVGTransform;
+    replaceItem(newItem: SVGTransform, index: number): SVGTransform;
+    [index: number]: SVGTransform;
+}
+
+declare var SVGTransformList: {
+    prototype: SVGTransformList;
+    new(): SVGTransformList;
+};
+
+interface SVGURIReference {
+    readonly href: SVGAnimatedString;
+}
+
+/** A commonly used set of constants used for reflecting gradientUnits, patternContentUnits and other similar attributes. */
+interface SVGUnitTypes {
+    readonly SVG_UNIT_TYPE_UNKNOWN: 0;
+    readonly SVG_UNIT_TYPE_USERSPACEONUSE: 1;
+    readonly SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: 2;
+}
+
+declare var SVGUnitTypes: {
+    prototype: SVGUnitTypes;
+    new(): SVGUnitTypes;
+    readonly SVG_UNIT_TYPE_UNKNOWN: 0;
+    readonly SVG_UNIT_TYPE_USERSPACEONUSE: 1;
+    readonly SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: 2;
+};
+
+/** Corresponds to the <use> element. */
+interface SVGUseElement extends SVGGraphicsElement, SVGURIReference {
+    readonly height: SVGAnimatedLength;
+    readonly width: SVGAnimatedLength;
+    readonly x: SVGAnimatedLength;
+    readonly y: SVGAnimatedLength;
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGUseElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGUseElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGUseElement: {
+    prototype: SVGUseElement;
+    new(): SVGUseElement;
+};
+
+/** Provides access to the properties of <view> elements, as well as methods to manipulate them. */
+interface SVGViewElement extends SVGElement, SVGFitToViewBox {
+    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGViewElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGViewElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SVGViewElement: {
+    prototype: SVGViewElement;
+    new(): SVGViewElement;
+};
+
+/** A screen, usually the one on which the current window is being rendered, and is obtained using window.screen. */
+interface Screen {
+    readonly availHeight: number;
+    readonly availWidth: number;
+    readonly colorDepth: number;
+    readonly height: number;
+    readonly orientation: ScreenOrientation;
+    readonly pixelDepth: number;
+    readonly width: number;
+}
+
+declare var Screen: {
+    prototype: Screen;
+    new(): Screen;
+};
+
+interface ScreenOrientationEventMap {
+    "change": Event;
+}
+
+interface ScreenOrientation extends EventTarget {
+    readonly angle: number;
+    onchange: ((this: ScreenOrientation, ev: Event) => any) | null;
+    readonly type: OrientationType;
+    lock(orientation: OrientationLockType): Promise<void>;
+    unlock(): void;
+    addEventListener<K extends keyof ScreenOrientationEventMap>(type: K, listener: (this: ScreenOrientation, ev: ScreenOrientationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof ScreenOrientationEventMap>(type: K, listener: (this: ScreenOrientation, ev: ScreenOrientationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var ScreenOrientation: {
+    prototype: ScreenOrientation;
+    new(): ScreenOrientation;
+};
+
+interface ScriptProcessorNodeEventMap {
+    "audioprocess": AudioProcessingEvent;
+}
+
+/**
+ * Allows the generation, processing, or analyzing of audio using JavaScript.
+ * @deprecated As of the August 29 2014 Web Audio API spec publication, this feature has been marked as deprecated, and was replaced by AudioWorklet (see AudioWorkletNode).
+ */
+interface ScriptProcessorNode extends AudioNode {
+    /** @deprecated */
+    readonly bufferSize: number;
+    /** @deprecated */
+    onaudioprocess: ((this: ScriptProcessorNode, ev: AudioProcessingEvent) => any) | null;
+    addEventListener<K extends keyof ScriptProcessorNodeEventMap>(type: K, listener: (this: ScriptProcessorNode, ev: ScriptProcessorNodeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof ScriptProcessorNodeEventMap>(type: K, listener: (this: ScriptProcessorNode, ev: ScriptProcessorNodeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+/** @deprecated */
+declare var ScriptProcessorNode: {
+    prototype: ScriptProcessorNode;
+    new(): ScriptProcessorNode;
+};
+
+/** Inherits from Event, and represents the event object of an event sent on a document or worker when its content security policy is violated. */
+interface SecurityPolicyViolationEvent extends Event {
+    readonly blockedURI: string;
+    readonly columnNumber: number;
+    readonly disposition: SecurityPolicyViolationEventDisposition;
+    readonly documentURI: string;
+    readonly effectiveDirective: string;
+    readonly lineNumber: number;
+    readonly originalPolicy: string;
+    readonly referrer: string;
+    readonly sample: string;
+    readonly sourceFile: string;
+    readonly statusCode: number;
+    readonly violatedDirective: string;
+}
+
+declare var SecurityPolicyViolationEvent: {
+    prototype: SecurityPolicyViolationEvent;
+    new(type: string, eventInitDict?: SecurityPolicyViolationEventInit): SecurityPolicyViolationEvent;
+};
+
+/** A Selection object\xA0represents the range of text selected by the user or the current position of the caret. To obtain a Selection object for examination or\xA0modification, call Window.getSelection(). */
+interface Selection {
+    readonly anchorNode: Node | null;
+    readonly anchorOffset: number;
+    readonly focusNode: Node | null;
+    readonly focusOffset: number;
+    readonly isCollapsed: boolean;
+    readonly rangeCount: number;
+    readonly type: string;
+    addRange(range: Range): void;
+    collapse(node: Node | null, offset?: number): void;
+    collapseToEnd(): void;
+    collapseToStart(): void;
+    containsNode(node: Node, allowPartialContainment?: boolean): boolean;
+    deleteFromDocument(): void;
+    empty(): void;
+    extend(node: Node, offset?: number): void;
+    getRangeAt(index: number): Range;
+    modify(alter?: string, direction?: string, granularity?: string): void;
+    removeAllRanges(): void;
+    removeRange(range: Range): void;
+    selectAllChildren(node: Node): void;
+    setBaseAndExtent(anchorNode: Node, anchorOffset: number, focusNode: Node, focusOffset: number): void;
+    setPosition(node: Node | null, offset?: number): void;
+    toString(): string;
+}
+
+declare var Selection: {
+    prototype: Selection;
+    new(): Selection;
+    toString(): string;
+};
+
+interface ServiceWorkerEventMap extends AbstractWorkerEventMap {
+    "statechange": Event;
+}
+
+/**
+ * This ServiceWorker API interface provides a reference to a service worker. Multiple browsing contexts (e.g. pages, workers, etc.) can be associated with the same service worker, each through a unique ServiceWorker object.
+ * Available only in secure contexts.
+ */
+interface ServiceWorker extends EventTarget, AbstractWorker {
+    onstatechange: ((this: ServiceWorker, ev: Event) => any) | null;
+    readonly scriptURL: string;
+    readonly state: ServiceWorkerState;
+    postMessage(message: any, transfer: Transferable[]): void;
+    postMessage(message: any, options?: StructuredSerializeOptions): void;
+    addEventListener<K extends keyof ServiceWorkerEventMap>(type: K, listener: (this: ServiceWorker, ev: ServiceWorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof ServiceWorkerEventMap>(type: K, listener: (this: ServiceWorker, ev: ServiceWorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var ServiceWorker: {
+    prototype: ServiceWorker;
+    new(): ServiceWorker;
+};
+
+interface ServiceWorkerContainerEventMap {
+    "controllerchange": Event;
+    "message": MessageEvent;
+    "messageerror": MessageEvent;
+}
+
+/**
+ * The\xA0ServiceWorkerContainer\xA0interface of the\xA0ServiceWorker API\xA0provides an object representing the service worker as an overall unit in the network ecosystem, including facilities to register, unregister and update service workers, and access the state of service workers and their registrations.
+ * Available only in secure contexts.
+ */
+interface ServiceWorkerContainer extends EventTarget {
+    readonly controller: ServiceWorker | null;
+    oncontrollerchange: ((this: ServiceWorkerContainer, ev: Event) => any) | null;
+    onmessage: ((this: ServiceWorkerContainer, ev: MessageEvent) => any) | null;
+    onmessageerror: ((this: ServiceWorkerContainer, ev: MessageEvent) => any) | null;
+    readonly ready: Promise<ServiceWorkerRegistration>;
+    getRegistration(clientURL?: string | URL): Promise<ServiceWorkerRegistration | undefined>;
+    getRegistrations(): Promise<ReadonlyArray<ServiceWorkerRegistration>>;
+    register(scriptURL: string | URL, options?: RegistrationOptions): Promise<ServiceWorkerRegistration>;
+    startMessages(): void;
+    addEventListener<K extends keyof ServiceWorkerContainerEventMap>(type: K, listener: (this: ServiceWorkerContainer, ev: ServiceWorkerContainerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof ServiceWorkerContainerEventMap>(type: K, listener: (this: ServiceWorkerContainer, ev: ServiceWorkerContainerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var ServiceWorkerContainer: {
+    prototype: ServiceWorkerContainer;
+    new(): ServiceWorkerContainer;
+};
+
+interface ServiceWorkerRegistrationEventMap {
+    "updatefound": Event;
+}
+
+/**
+ * This ServiceWorker API interface represents the service worker registration. You register a service worker to control one or more pages that share the same origin.
+ * Available only in secure contexts.
+ */
+interface ServiceWorkerRegistration extends EventTarget {
+    readonly active: ServiceWorker | null;
+    readonly installing: ServiceWorker | null;
+    readonly navigationPreload: NavigationPreloadManager;
+    onupdatefound: ((this: ServiceWorkerRegistration, ev: Event) => any) | null;
+    readonly pushManager: PushManager;
+    readonly scope: string;
+    readonly updateViaCache: ServiceWorkerUpdateViaCache;
+    readonly waiting: ServiceWorker | null;
+    getNotifications(filter?: GetNotificationOptions): Promise<Notification[]>;
+    showNotification(title: string, options?: NotificationOptions): Promise<void>;
+    unregister(): Promise<boolean>;
+    update(): Promise<void>;
+    addEventListener<K extends keyof ServiceWorkerRegistrationEventMap>(type: K, listener: (this: ServiceWorkerRegistration, ev: ServiceWorkerRegistrationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof ServiceWorkerRegistrationEventMap>(type: K, listener: (this: ServiceWorkerRegistration, ev: ServiceWorkerRegistrationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var ServiceWorkerRegistration: {
+    prototype: ServiceWorkerRegistration;
+    new(): ServiceWorkerRegistration;
+};
+
+interface ShadowRootEventMap {
+    "slotchange": Event;
+}
+
+interface ShadowRoot extends DocumentFragment, DocumentOrShadowRoot, InnerHTML {
+    readonly delegatesFocus: boolean;
+    readonly host: Element;
+    readonly mode: ShadowRootMode;
+    onslotchange: ((this: ShadowRoot, ev: Event) => any) | null;
+    readonly slotAssignment: SlotAssignmentMode;
+    /** Throws a "NotSupportedError" DOMException if context object is a shadow root. */
+    addEventListener<K extends keyof ShadowRootEventMap>(type: K, listener: (this: ShadowRoot, ev: ShadowRootEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof ShadowRootEventMap>(type: K, listener: (this: ShadowRoot, ev: ShadowRootEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var ShadowRoot: {
+    prototype: ShadowRoot;
+    new(): ShadowRoot;
+};
+
+interface SharedWorker extends EventTarget, AbstractWorker {
+    /** Returns sharedWorker's MessagePort object which can be used to communicate with the global environment. */
+    readonly port: MessagePort;
+    addEventListener<K extends keyof AbstractWorkerEventMap>(type: K, listener: (this: SharedWorker, ev: AbstractWorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof AbstractWorkerEventMap>(type: K, listener: (this: SharedWorker, ev: AbstractWorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SharedWorker: {
+    prototype: SharedWorker;
+    new(scriptURL: string | URL, options?: string | WorkerOptions): SharedWorker;
+};
+
+interface Slottable {
+    readonly assignedSlot: HTMLSlotElement | null;
+}
+
+interface SourceBufferEventMap {
+    "abort": Event;
+    "error": Event;
+    "update": Event;
+    "updateend": Event;
+    "updatestart": Event;
+}
+
+/** A chunk of media to be passed into an HTMLMediaElement and played, via a MediaSource\xA0object. This can be made up of one or several media segments. */
+interface SourceBuffer extends EventTarget {
+    appendWindowEnd: number;
+    appendWindowStart: number;
+    readonly buffered: TimeRanges;
+    mode: AppendMode;
+    onabort: ((this: SourceBuffer, ev: Event) => any) | null;
+    onerror: ((this: SourceBuffer, ev: Event) => any) | null;
+    onupdate: ((this: SourceBuffer, ev: Event) => any) | null;
+    onupdateend: ((this: SourceBuffer, ev: Event) => any) | null;
+    onupdatestart: ((this: SourceBuffer, ev: Event) => any) | null;
+    timestampOffset: number;
+    readonly updating: boolean;
+    abort(): void;
+    appendBuffer(data: BufferSource): void;
+    changeType(type: string): void;
+    remove(start: number, end: number): void;
+    addEventListener<K extends keyof SourceBufferEventMap>(type: K, listener: (this: SourceBuffer, ev: SourceBufferEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SourceBufferEventMap>(type: K, listener: (this: SourceBuffer, ev: SourceBufferEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SourceBuffer: {
+    prototype: SourceBuffer;
+    new(): SourceBuffer;
+};
+
+interface SourceBufferListEventMap {
+    "addsourcebuffer": Event;
+    "removesourcebuffer": Event;
+}
+
+/** A simple container list for multiple SourceBuffer objects. */
+interface SourceBufferList extends EventTarget {
+    readonly length: number;
+    onaddsourcebuffer: ((this: SourceBufferList, ev: Event) => any) | null;
+    onremovesourcebuffer: ((this: SourceBufferList, ev: Event) => any) | null;
+    addEventListener<K extends keyof SourceBufferListEventMap>(type: K, listener: (this: SourceBufferList, ev: SourceBufferListEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SourceBufferListEventMap>(type: K, listener: (this: SourceBufferList, ev: SourceBufferListEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+    [index: number]: SourceBuffer;
+}
+
+declare var SourceBufferList: {
+    prototype: SourceBufferList;
+    new(): SourceBufferList;
+};
+
+interface SpeechRecognitionAlternative {
+    readonly confidence: number;
+    readonly transcript: string;
+}
+
+declare var SpeechRecognitionAlternative: {
+    prototype: SpeechRecognitionAlternative;
+    new(): SpeechRecognitionAlternative;
+};
+
+interface SpeechRecognitionResult {
+    readonly isFinal: boolean;
+    readonly length: number;
+    item(index: number): SpeechRecognitionAlternative;
+    [index: number]: SpeechRecognitionAlternative;
+}
+
+declare var SpeechRecognitionResult: {
+    prototype: SpeechRecognitionResult;
+    new(): SpeechRecognitionResult;
+};
+
+interface SpeechRecognitionResultList {
+    readonly length: number;
+    item(index: number): SpeechRecognitionResult;
+    [index: number]: SpeechRecognitionResult;
+}
+
+declare var SpeechRecognitionResultList: {
+    prototype: SpeechRecognitionResultList;
+    new(): SpeechRecognitionResultList;
+};
+
+interface SpeechSynthesisEventMap {
+    "voiceschanged": Event;
+}
+
+/** This Web Speech API interface is the controller interface for the speech service; this can be used to retrieve information about the synthesis voices available on the device, start and pause speech, and other commands besides. */
+interface SpeechSynthesis extends EventTarget {
+    onvoiceschanged: ((this: SpeechSynthesis, ev: Event) => any) | null;
+    readonly paused: boolean;
+    readonly pending: boolean;
+    readonly speaking: boolean;
+    cancel(): void;
+    getVoices(): SpeechSynthesisVoice[];
+    pause(): void;
+    resume(): void;
+    speak(utterance: SpeechSynthesisUtterance): void;
+    addEventListener<K extends keyof SpeechSynthesisEventMap>(type: K, listener: (this: SpeechSynthesis, ev: SpeechSynthesisEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SpeechSynthesisEventMap>(type: K, listener: (this: SpeechSynthesis, ev: SpeechSynthesisEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SpeechSynthesis: {
+    prototype: SpeechSynthesis;
+    new(): SpeechSynthesis;
+};
+
+interface SpeechSynthesisErrorEvent extends SpeechSynthesisEvent {
+    readonly error: SpeechSynthesisErrorCode;
+}
+
+declare var SpeechSynthesisErrorEvent: {
+    prototype: SpeechSynthesisErrorEvent;
+    new(type: string, eventInitDict: SpeechSynthesisErrorEventInit): SpeechSynthesisErrorEvent;
+};
+
+/** This Web Speech API interface contains information about the current state of SpeechSynthesisUtterance objects that have been processed in the speech service. */
+interface SpeechSynthesisEvent extends Event {
+    readonly charIndex: number;
+    readonly charLength: number;
+    readonly elapsedTime: number;
+    readonly name: string;
+    readonly utterance: SpeechSynthesisUtterance;
+}
+
+declare var SpeechSynthesisEvent: {
+    prototype: SpeechSynthesisEvent;
+    new(type: string, eventInitDict: SpeechSynthesisEventInit): SpeechSynthesisEvent;
+};
+
+interface SpeechSynthesisUtteranceEventMap {
+    "boundary": SpeechSynthesisEvent;
+    "end": SpeechSynthesisEvent;
+    "error": SpeechSynthesisErrorEvent;
+    "mark": SpeechSynthesisEvent;
+    "pause": SpeechSynthesisEvent;
+    "resume": SpeechSynthesisEvent;
+    "start": SpeechSynthesisEvent;
+}
+
+/** This Web Speech API interface represents a speech request. It contains the content the speech service should read and information about how to read it (e.g. language, pitch and volume.) */
+interface SpeechSynthesisUtterance extends EventTarget {
+    lang: string;
+    onboundary: ((this: SpeechSynthesisUtterance, ev: SpeechSynthesisEvent) => any) | null;
+    onend: ((this: SpeechSynthesisUtterance, ev: SpeechSynthesisEvent) => any) | null;
+    onerror: ((this: SpeechSynthesisUtterance, ev: SpeechSynthesisErrorEvent) => any) | null;
+    onmark: ((this: SpeechSynthesisUtterance, ev: SpeechSynthesisEvent) => any) | null;
+    onpause: ((this: SpeechSynthesisUtterance, ev: SpeechSynthesisEvent) => any) | null;
+    onresume: ((this: SpeechSynthesisUtterance, ev: SpeechSynthesisEvent) => any) | null;
+    onstart: ((this: SpeechSynthesisUtterance, ev: SpeechSynthesisEvent) => any) | null;
+    pitch: number;
+    rate: number;
+    text: string;
+    voice: SpeechSynthesisVoice | null;
+    volume: number;
+    addEventListener<K extends keyof SpeechSynthesisUtteranceEventMap>(type: K, listener: (this: SpeechSynthesisUtterance, ev: SpeechSynthesisUtteranceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SpeechSynthesisUtteranceEventMap>(type: K, listener: (this: SpeechSynthesisUtterance, ev: SpeechSynthesisUtteranceEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SpeechSynthesisUtterance: {
+    prototype: SpeechSynthesisUtterance;
+    new(text?: string): SpeechSynthesisUtterance;
+};
+
+/** This Web Speech API interface represents a voice that the system supports. Every SpeechSynthesisVoice has its own relative speech service including information about language, name and URI. */
+interface SpeechSynthesisVoice {
+    readonly default: boolean;
+    readonly lang: string;
+    readonly localService: boolean;
+    readonly name: string;
+    readonly voiceURI: string;
+}
+
+declare var SpeechSynthesisVoice: {
+    prototype: SpeechSynthesisVoice;
+    new(): SpeechSynthesisVoice;
+};
+
+interface StaticRange extends AbstractRange {
+}
+
+declare var StaticRange: {
+    prototype: StaticRange;
+    new(init: StaticRangeInit): StaticRange;
+};
+
+/** The pan property takes a unitless value between -1 (full left pan) and 1 (full right pan). This interface was introduced as a much simpler way to apply a simple panning effect than having to use a full PannerNode. */
+interface StereoPannerNode extends AudioNode {
+    readonly pan: AudioParam;
+}
+
+declare var StereoPannerNode: {
+    prototype: StereoPannerNode;
+    new(context: BaseAudioContext, options?: StereoPannerOptions): StereoPannerNode;
+};
+
+/** This Web Storage API interface provides access to a particular domain's session or local storage. It allows, for example, the addition, modification, or deletion of stored data items. */
+interface Storage {
+    /** Returns the number of key/value pairs. */
+    readonly length: number;
+    /**
+     * Removes all key/value pairs, if there are any.
+     *
+     * Dispatches a storage event on Window objects holding an equivalent Storage object.
+     */
+    clear(): void;
+    /** Returns the current value associated with the given key, or null if the given key does not exist. */
+    getItem(key: string): string | null;
+    /** Returns the name of the nth key, or null if n is greater than or equal to the number of key/value pairs. */
+    key(index: number): string | null;
+    /**
+     * Removes the key/value pair with the given key, if a key/value pair with the given key exists.
+     *
+     * Dispatches a storage event on Window objects holding an equivalent Storage object.
+     */
+    removeItem(key: string): void;
+    /**
+     * Sets the value of the pair identified by key to value, creating a new key/value pair if none existed for key previously.
+     *
+     * Throws a "QuotaExceededError" DOMException exception if the new value couldn't be set. (Setting could fail if, e.g., the user has disabled storage for the site, or if the quota has been exceeded.)
+     *
+     * Dispatches a storage event on Window objects holding an equivalent Storage object.
+     */
+    setItem(key: string, value: string): void;
+    [name: string]: any;
+}
+
+declare var Storage: {
+    prototype: Storage;
+    new(): Storage;
+};
+
+/** A StorageEvent is sent to a window when a storage area it has access to is changed within the context of another document. */
+interface StorageEvent extends Event {
+    /** Returns the key of the storage item being changed. */
+    readonly key: string | null;
+    /** Returns the new value of the key of the storage item whose value is being changed. */
+    readonly newValue: string | null;
+    /** Returns the old value of the key of the storage item whose value is being changed. */
+    readonly oldValue: string | null;
+    /** Returns the Storage object that was affected. */
+    readonly storageArea: Storage | null;
+    /** Returns the URL of the document whose storage item changed. */
+    readonly url: string;
+    /** @deprecated */
+    initStorageEvent(type: string, bubbles?: boolean, cancelable?: boolean, key?: string | null, oldValue?: string | null, newValue?: string | null, url?: string | URL, storageArea?: Storage | null): void;
+}
+
+declare var StorageEvent: {
+    prototype: StorageEvent;
+    new(type: string, eventInitDict?: StorageEventInit): StorageEvent;
+};
+
+/** Available only in secure contexts. */
+interface StorageManager {
+    estimate(): Promise<StorageEstimate>;
+    getDirectory(): Promise<FileSystemDirectoryHandle>;
+    persist(): Promise<boolean>;
+    persisted(): Promise<boolean>;
+}
+
+declare var StorageManager: {
+    prototype: StorageManager;
+    new(): StorageManager;
+};
+
+/** @deprecated */
+interface StyleMedia {
+    type: string;
+    matchMedium(mediaquery: string): boolean;
+}
+
+/** A single style sheet. CSS style sheets will further implement the more specialized CSSStyleSheet interface. */
+interface StyleSheet {
+    disabled: boolean;
+    readonly href: string | null;
+    readonly media: MediaList;
+    readonly ownerNode: Element | ProcessingInstruction | null;
+    readonly parentStyleSheet: CSSStyleSheet | null;
+    readonly title: string | null;
+    readonly type: string;
+}
+
+declare var StyleSheet: {
+    prototype: StyleSheet;
+    new(): StyleSheet;
+};
+
+/** A list of StyleSheet. */
+interface StyleSheetList {
+    readonly length: number;
+    item(index: number): CSSStyleSheet | null;
+    [index: number]: CSSStyleSheet;
+}
+
+declare var StyleSheetList: {
+    prototype: StyleSheetList;
+    new(): StyleSheetList;
+};
+
+interface SubmitEvent extends Event {
+    /** Returns the element representing the submit button that triggered the form submission, or null if the submission was not triggered by a button. */
+    readonly submitter: HTMLElement | null;
+}
+
+declare var SubmitEvent: {
+    prototype: SubmitEvent;
+    new(type: string, eventInitDict?: SubmitEventInit): SubmitEvent;
+};
+
+/**
+ * This Web Crypto API interface provides a number of low-level cryptographic functions. It is accessed via the Crypto.subtle properties available in a window context (via Window.crypto).
+ * Available only in secure contexts.
+ */
+interface SubtleCrypto {
+    decrypt(algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, key: CryptoKey, data: BufferSource): Promise<ArrayBuffer>;
+    deriveBits(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, length: number): Promise<ArrayBuffer>;
+    deriveKey(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, derivedKeyType: AlgorithmIdentifier | AesDerivedKeyParams | HmacImportParams | HkdfParams | Pbkdf2Params, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
+    digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise<ArrayBuffer>;
+    encrypt(algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, key: CryptoKey, data: BufferSource): Promise<ArrayBuffer>;
+    exportKey(format: "jwk", key: CryptoKey): Promise<JsonWebKey>;
+    exportKey(format: Exclude<KeyFormat, "jwk">, key: CryptoKey): Promise<ArrayBuffer>;
+    generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKeyPair>;
+    generateKey(algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKey>;
+    generateKey(algorithm: AlgorithmIdentifier, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKeyPair | CryptoKey>;
+    importKey(format: "jwk", keyData: JsonWebKey, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKey>;
+    importKey(format: Exclude<KeyFormat, "jwk">, keyData: BufferSource, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
+    sign(algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey, data: BufferSource): Promise<ArrayBuffer>;
+    unwrapKey(format: KeyFormat, wrappedKey: BufferSource, unwrappingKey: CryptoKey, unwrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, unwrappedKeyAlgorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
+    verify(algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey, signature: BufferSource, data: BufferSource): Promise<boolean>;
+    wrapKey(format: KeyFormat, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams): Promise<ArrayBuffer>;
+}
+
+declare var SubtleCrypto: {
+    prototype: SubtleCrypto;
+    new(): SubtleCrypto;
+};
+
+/** The textual content of Element or Attr. If an element has no markup within its content, it has a single child implementing Text that contains the element's text. However, if the element contains markup, it is parsed into information items and Text nodes that form its children. */
+interface Text extends CharacterData, Slottable {
+    /** Returns the combined data of all direct Text node siblings. */
+    readonly wholeText: string;
+    /** Splits data at the given offset and returns the remainder as Text node. */
+    splitText(offset: number): Text;
+}
+
+declare var Text: {
+    prototype: Text;
+    new(data?: string): Text;
+};
+
+/** A decoder for a specific method, that is a specific character encoding, like utf-8, iso-8859-2, koi8, cp1261, gbk, etc.\xA0A decoder takes a stream of bytes as input and emits a stream of code points. For a more scalable, non-native library, see StringView \u2013 a C-like representation of strings based on typed arrays. */
+interface TextDecoder extends TextDecoderCommon {
+    /**
+     * Returns the result of running encoding's decoder. The method can be invoked zero or more times with options's stream set to true, and then once without options's stream (or set to false), to process a fragmented input. If the invocation without options's stream (or set to false) has no input, it's clearest to omit both arguments.
+     *
+     * \`\`\`
+     * var string = "", decoder = new TextDecoder(encoding), buffer;
+     * while(buffer = next_chunk()) {
+     *   string += decoder.decode(buffer, {stream:true});
+     * }
+     * string += decoder.decode(); // end-of-queue
+     * \`\`\`
+     *
+     * If the error mode is "fatal" and encoding's decoder returns error, throws a TypeError.
+     */
+    decode(input?: BufferSource, options?: TextDecodeOptions): string;
+}
+
+declare var TextDecoder: {
+    prototype: TextDecoder;
+    new(label?: string, options?: TextDecoderOptions): TextDecoder;
+};
+
+interface TextDecoderCommon {
+    /** Returns encoding's name, lowercased. */
+    readonly encoding: string;
+    /** Returns true if error mode is "fatal", otherwise false. */
+    readonly fatal: boolean;
+    /** Returns the value of ignore BOM. */
+    readonly ignoreBOM: boolean;
+}
+
+interface TextDecoderStream extends GenericTransformStream, TextDecoderCommon {
+    readonly readable: ReadableStream<string>;
+    readonly writable: WritableStream<BufferSource>;
+}
+
+declare var TextDecoderStream: {
+    prototype: TextDecoderStream;
+    new(label?: string, options?: TextDecoderOptions): TextDecoderStream;
+};
+
+/** TextEncoder takes a stream of code points as input and emits a stream of bytes. For a more scalable, non-native library, see StringView \u2013 a C-like representation of strings based on typed arrays. */
+interface TextEncoder extends TextEncoderCommon {
+    /** Returns the result of running UTF-8's encoder. */
+    encode(input?: string): Uint8Array;
+    /** Runs the UTF-8 encoder on source, stores the result of that operation into destination, and returns the progress made as an object wherein read is the number of converted code units of source and written is the number of bytes modified in destination. */
+    encodeInto(source: string, destination: Uint8Array): TextEncoderEncodeIntoResult;
+}
+
+declare var TextEncoder: {
+    prototype: TextEncoder;
+    new(): TextEncoder;
+};
+
+interface TextEncoderCommon {
+    /** Returns "utf-8". */
+    readonly encoding: string;
+}
+
+interface TextEncoderStream extends GenericTransformStream, TextEncoderCommon {
+    readonly readable: ReadableStream<Uint8Array>;
+    readonly writable: WritableStream<string>;
+}
+
+declare var TextEncoderStream: {
+    prototype: TextEncoderStream;
+    new(): TextEncoderStream;
+};
+
+/** The dimensions of a piece of text in the canvas, as created by the CanvasRenderingContext2D.measureText() method. */
+interface TextMetrics {
+    /** Returns the measurement described below. */
+    readonly actualBoundingBoxAscent: number;
+    /** Returns the measurement described below. */
+    readonly actualBoundingBoxDescent: number;
+    /** Returns the measurement described below. */
+    readonly actualBoundingBoxLeft: number;
+    /** Returns the measurement described below. */
+    readonly actualBoundingBoxRight: number;
+    /** Returns the measurement described below. */
+    readonly fontBoundingBoxAscent: number;
+    /** Returns the measurement described below. */
+    readonly fontBoundingBoxDescent: number;
+    /** Returns the measurement described below. */
+    readonly width: number;
+}
+
+declare var TextMetrics: {
+    prototype: TextMetrics;
+    new(): TextMetrics;
+};
+
+interface TextTrackEventMap {
+    "cuechange": Event;
+}
+
+/** This interface also inherits properties from EventTarget. */
+interface TextTrack extends EventTarget {
+    /** Returns the text track cues from the text track list of cues that are currently active (i.e. that start before the current playback position and end after it), as a TextTrackCueList object. */
+    readonly activeCues: TextTrackCueList | null;
+    /** Returns the text track list of cues, as a TextTrackCueList object. */
+    readonly cues: TextTrackCueList | null;
+    /**
+     * Returns the ID of the given track.
+     *
+     * For in-band tracks, this is the ID that can be used with a fragment if the format supports media fragment syntax, and that can be used with the getTrackById() method.
+     *
+     * For TextTrack objects corresponding to track elements, this is the ID of the track element.
+     */
+    readonly id: string;
+    /** Returns the text track in-band metadata track dispatch type string. */
+    readonly inBandMetadataTrackDispatchType: string;
+    /** Returns the text track kind string. */
+    readonly kind: TextTrackKind;
+    /** Returns the text track label, if there is one, or the empty string otherwise (indicating that a custom label probably needs to be generated from the other attributes of the object if the object is exposed to the user). */
+    readonly label: string;
+    /** Returns the text track language string. */
+    readonly language: string;
+    /**
+     * Returns the text track mode, represented by a string from the following list:
+     *
+     * Can be set, to change the mode.
+     */
+    mode: TextTrackMode;
+    oncuechange: ((this: TextTrack, ev: Event) => any) | null;
+    /** Adds the given cue to textTrack's text track list of cues. */
+    addCue(cue: TextTrackCue): void;
+    /** Removes the given cue from textTrack's text track list of cues. */
+    removeCue(cue: TextTrackCue): void;
+    addEventListener<K extends keyof TextTrackEventMap>(type: K, listener: (this: TextTrack, ev: TextTrackEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof TextTrackEventMap>(type: K, listener: (this: TextTrack, ev: TextTrackEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var TextTrack: {
+    prototype: TextTrack;
+    new(): TextTrack;
+};
+
+interface TextTrackCueEventMap {
+    "enter": Event;
+    "exit": Event;
+}
+
+/** TextTrackCues represent a string of text that will be displayed for some duration of time on a TextTrack. This includes the start and end times that the cue will be displayed. A TextTrackCue cannot be used directly, instead one of the derived types (e.g. VTTCue) must be used. */
+interface TextTrackCue extends EventTarget {
+    /**
+     * Returns the text track cue end time, in seconds.
+     *
+     * Can be set.
+     */
+    endTime: number;
+    /**
+     * Returns the text track cue identifier.
+     *
+     * Can be set.
+     */
+    id: string;
+    onenter: ((this: TextTrackCue, ev: Event) => any) | null;
+    onexit: ((this: TextTrackCue, ev: Event) => any) | null;
+    /**
+     * Returns true if the text track cue pause-on-exit flag is set, false otherwise.
+     *
+     * Can be set.
+     */
+    pauseOnExit: boolean;
+    /**
+     * Returns the text track cue start time, in seconds.
+     *
+     * Can be set.
+     */
+    startTime: number;
+    /** Returns the TextTrack object to which this text track cue belongs, if any, or null otherwise. */
+    readonly track: TextTrack | null;
+    addEventListener<K extends keyof TextTrackCueEventMap>(type: K, listener: (this: TextTrackCue, ev: TextTrackCueEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof TextTrackCueEventMap>(type: K, listener: (this: TextTrackCue, ev: TextTrackCueEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var TextTrackCue: {
+    prototype: TextTrackCue;
+    new(): TextTrackCue;
+};
+
+interface TextTrackCueList {
+    /** Returns the number of cues in the list. */
+    readonly length: number;
+    /**
+     * Returns the first text track cue (in text track cue order) with text track cue identifier id.
+     *
+     * Returns null if none of the cues have the given identifier or if the argument is the empty string.
+     */
+    getCueById(id: string): TextTrackCue | null;
+    [index: number]: TextTrackCue;
+}
+
+declare var TextTrackCueList: {
+    prototype: TextTrackCueList;
+    new(): TextTrackCueList;
+};
+
+interface TextTrackListEventMap {
+    "addtrack": TrackEvent;
+    "change": Event;
+    "removetrack": TrackEvent;
+}
+
+interface TextTrackList extends EventTarget {
+    readonly length: number;
+    onaddtrack: ((this: TextTrackList, ev: TrackEvent) => any) | null;
+    onchange: ((this: TextTrackList, ev: Event) => any) | null;
+    onremovetrack: ((this: TextTrackList, ev: TrackEvent) => any) | null;
+    getTrackById(id: string): TextTrack | null;
+    addEventListener<K extends keyof TextTrackListEventMap>(type: K, listener: (this: TextTrackList, ev: TextTrackListEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof TextTrackListEventMap>(type: K, listener: (this: TextTrackList, ev: TextTrackListEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+    [index: number]: TextTrack;
+}
+
+declare var TextTrackList: {
+    prototype: TextTrackList;
+    new(): TextTrackList;
+};
+
+/** Used to represent a set of time ranges, primarily for the purpose of tracking which portions of media have been buffered when loading it for use by the <audio> and <video>\xA0elements. */
+interface TimeRanges {
+    /** Returns the number of ranges in the object. */
+    readonly length: number;
+    /**
+     * Returns the time for the end of the range with the given index.
+     *
+     * Throws an "IndexSizeError" DOMException if the index is out of range.
+     */
+    end(index: number): number;
+    /**
+     * Returns the time for the start of the range with the given index.
+     *
+     * Throws an "IndexSizeError" DOMException if the index is out of range.
+     */
+    start(index: number): number;
+}
+
+declare var TimeRanges: {
+    prototype: TimeRanges;
+    new(): TimeRanges;
+};
+
+/** A single contact point on a touch-sensitive device. The contact point is commonly a finger or stylus and the device may be a touchscreen or trackpad. */
+interface Touch {
+    readonly clientX: number;
+    readonly clientY: number;
+    readonly force: number;
+    readonly identifier: number;
+    readonly pageX: number;
+    readonly pageY: number;
+    readonly radiusX: number;
+    readonly radiusY: number;
+    readonly rotationAngle: number;
+    readonly screenX: number;
+    readonly screenY: number;
+    readonly target: EventTarget;
+}
+
+declare var Touch: {
+    prototype: Touch;
+    new(touchInitDict: TouchInit): Touch;
+};
+
+/** An event sent when the state of contacts with a touch-sensitive surface changes. This surface can be a touch screen or trackpad, for example. The event can describe one or more points of contact with the screen and includes support for detecting movement, addition and removal of contact points, and so forth. */
+interface TouchEvent extends UIEvent {
+    readonly altKey: boolean;
+    readonly changedTouches: TouchList;
+    readonly ctrlKey: boolean;
+    readonly metaKey: boolean;
+    readonly shiftKey: boolean;
+    readonly targetTouches: TouchList;
+    readonly touches: TouchList;
+}
+
+declare var TouchEvent: {
+    prototype: TouchEvent;
+    new(type: string, eventInitDict?: TouchEventInit): TouchEvent;
+};
+
+/** A list of contact points on a touch surface. For example, if the user has three fingers on the touch surface (such as a screen or trackpad), the corresponding TouchList object would have one Touch object for each finger, for a total of three entries. */
+interface TouchList {
+    readonly length: number;
+    item(index: number): Touch | null;
+    [index: number]: Touch;
+}
+
+declare var TouchList: {
+    prototype: TouchList;
+    new(): TouchList;
+};
+
+/** The TrackEvent interface, part of the HTML DOM specification, is used for events which represent changes to the set of available tracks on an HTML media element; these events are addtrack and removetrack. */
+interface TrackEvent extends Event {
+    /** Returns the track object (TextTrack, AudioTrack, or VideoTrack) to which the event relates. */
+    readonly track: TextTrack | null;
+}
+
+declare var TrackEvent: {
+    prototype: TrackEvent;
+    new(type: string, eventInitDict?: TrackEventInit): TrackEvent;
+};
+
+interface TransformStream<I = any, O = any> {
+    readonly readable: ReadableStream<O>;
+    readonly writable: WritableStream<I>;
+}
+
+declare var TransformStream: {
+    prototype: TransformStream;
+    new<I = any, O = any>(transformer?: Transformer<I, O>, writableStrategy?: QueuingStrategy<I>, readableStrategy?: QueuingStrategy<O>): TransformStream<I, O>;
+};
+
+interface TransformStreamDefaultController<O = any> {
+    readonly desiredSize: number | null;
+    enqueue(chunk?: O): void;
+    error(reason?: any): void;
+    terminate(): void;
+}
+
+declare var TransformStreamDefaultController: {
+    prototype: TransformStreamDefaultController;
+    new(): TransformStreamDefaultController;
+};
+
+/** Events providing information related to transitions. */
+interface TransitionEvent extends Event {
+    readonly elapsedTime: number;
+    readonly propertyName: string;
+    readonly pseudoElement: string;
+}
+
+declare var TransitionEvent: {
+    prototype: TransitionEvent;
+    new(type: string, transitionEventInitDict?: TransitionEventInit): TransitionEvent;
+};
+
+/** The nodes of a document subtree and a position within them. */
+interface TreeWalker {
+    currentNode: Node;
+    readonly filter: NodeFilter | null;
+    readonly root: Node;
+    readonly whatToShow: number;
+    firstChild(): Node | null;
+    lastChild(): Node | null;
+    nextNode(): Node | null;
+    nextSibling(): Node | null;
+    parentNode(): Node | null;
+    previousNode(): Node | null;
+    previousSibling(): Node | null;
+}
+
+declare var TreeWalker: {
+    prototype: TreeWalker;
+    new(): TreeWalker;
+};
+
+/** Simple user interface events. */
+interface UIEvent extends Event {
+    readonly detail: number;
+    readonly view: Window | null;
+    /** @deprecated */
+    readonly which: number;
+    /** @deprecated */
+    initUIEvent(typeArg: string, bubblesArg?: boolean, cancelableArg?: boolean, viewArg?: Window | null, detailArg?: number): void;
+}
+
+declare var UIEvent: {
+    prototype: UIEvent;
+    new(type: string, eventInitDict?: UIEventInit): UIEvent;
+};
+
+/** The URL\xA0interface represents an object providing static methods used for creating object URLs. */
+interface URL {
+    hash: string;
+    host: string;
+    hostname: string;
+    href: string;
+    toString(): string;
+    readonly origin: string;
+    password: string;
+    pathname: string;
+    port: string;
+    protocol: string;
+    search: string;
+    readonly searchParams: URLSearchParams;
+    username: string;
+    toJSON(): string;
+}
+
+declare var URL: {
+    prototype: URL;
+    new(url: string | URL, base?: string | URL): URL;
+    createObjectURL(obj: Blob | MediaSource): string;
+    revokeObjectURL(url: string): void;
+};
+
+type webkitURL = URL;
+declare var webkitURL: typeof URL;
+
+interface URLSearchParams {
+    /** Appends a specified key/value pair as a new search parameter. */
+    append(name: string, value: string): void;
+    /** Deletes the given search parameter, and its associated value, from the list of all search parameters. */
+    delete(name: string): void;
+    /** Returns the first value associated to the given search parameter. */
+    get(name: string): string | null;
+    /** Returns all the values association with a given search parameter. */
+    getAll(name: string): string[];
+    /** Returns a Boolean indicating if such a search parameter exists. */
+    has(name: string): boolean;
+    /** Sets the value associated to a given search parameter to the given value. If there were several values, delete the others. */
+    set(name: string, value: string): void;
+    sort(): void;
+    /** Returns a string containing a query string suitable for use in a URL. Does not include the question mark. */
+    toString(): string;
+    forEach(callbackfn: (value: string, key: string, parent: URLSearchParams) => void, thisArg?: any): void;
+}
+
+declare var URLSearchParams: {
+    prototype: URLSearchParams;
+    new(init?: string[][] | Record<string, string> | string | URLSearchParams): URLSearchParams;
+    toString(): string;
+};
+
+interface VTTCue extends TextTrackCue {
+    align: AlignSetting;
+    line: LineAndPositionSetting;
+    lineAlign: LineAlignSetting;
+    position: LineAndPositionSetting;
+    positionAlign: PositionAlignSetting;
+    region: VTTRegion | null;
+    size: number;
+    snapToLines: boolean;
+    text: string;
+    vertical: DirectionSetting;
+    getCueAsHTML(): DocumentFragment;
+    addEventListener<K extends keyof TextTrackCueEventMap>(type: K, listener: (this: VTTCue, ev: TextTrackCueEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof TextTrackCueEventMap>(type: K, listener: (this: VTTCue, ev: TextTrackCueEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var VTTCue: {
+    prototype: VTTCue;
+    new(startTime: number, endTime: number, text: string): VTTCue;
+};
+
+interface VTTRegion {
+    id: string;
+    lines: number;
+    regionAnchorX: number;
+    regionAnchorY: number;
+    scroll: ScrollSetting;
+    viewportAnchorX: number;
+    viewportAnchorY: number;
+    width: number;
+}
+
+declare var VTTRegion: {
+    prototype: VTTRegion;
+    new(): VTTRegion;
+};
+
+/** The validity states that an element can be in, with respect to constraint validation. Together, they help explain why an element's value fails to validate, if it's not valid. */
+interface ValidityState {
+    readonly badInput: boolean;
+    readonly customError: boolean;
+    readonly patternMismatch: boolean;
+    readonly rangeOverflow: boolean;
+    readonly rangeUnderflow: boolean;
+    readonly stepMismatch: boolean;
+    readonly tooLong: boolean;
+    readonly tooShort: boolean;
+    readonly typeMismatch: boolean;
+    readonly valid: boolean;
+    readonly valueMissing: boolean;
+}
+
+declare var ValidityState: {
+    prototype: ValidityState;
+    new(): ValidityState;
+};
+
+interface VideoColorSpace {
+    readonly fullRange: boolean | null;
+    readonly matrix: VideoMatrixCoefficients | null;
+    readonly primaries: VideoColorPrimaries | null;
+    readonly transfer: VideoTransferCharacteristics | null;
+    toJSON(): VideoColorSpaceInit;
+}
+
+declare var VideoColorSpace: {
+    prototype: VideoColorSpace;
+    new(init?: VideoColorSpaceInit): VideoColorSpace;
+};
+
+/** Returned by the HTMLVideoElement.getVideoPlaybackQuality() method and contains metrics that can be used to determine the playback quality of a video. */
+interface VideoPlaybackQuality {
+    /** @deprecated */
+    readonly corruptedVideoFrames: number;
+    readonly creationTime: DOMHighResTimeStamp;
+    readonly droppedVideoFrames: number;
+    readonly totalVideoFrames: number;
+}
+
+declare var VideoPlaybackQuality: {
+    prototype: VideoPlaybackQuality;
+    new(): VideoPlaybackQuality;
+};
+
+interface VisualViewportEventMap {
+    "resize": Event;
+    "scroll": Event;
+}
+
+interface VisualViewport extends EventTarget {
+    readonly height: number;
+    readonly offsetLeft: number;
+    readonly offsetTop: number;
+    onresize: ((this: VisualViewport, ev: Event) => any) | null;
+    onscroll: ((this: VisualViewport, ev: Event) => any) | null;
+    readonly pageLeft: number;
+    readonly pageTop: number;
+    readonly scale: number;
+    readonly width: number;
+    addEventListener<K extends keyof VisualViewportEventMap>(type: K, listener: (this: VisualViewport, ev: VisualViewportEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof VisualViewportEventMap>(type: K, listener: (this: VisualViewport, ev: VisualViewportEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var VisualViewport: {
+    prototype: VisualViewport;
+    new(): VisualViewport;
+};
+
+interface WEBGL_color_buffer_float {
+    readonly RGBA32F_EXT: 0x8814;
+    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: 0x8211;
+    readonly UNSIGNED_NORMALIZED_EXT: 0x8C17;
+}
+
+interface WEBGL_compressed_texture_astc {
+    getSupportedProfiles(): string[];
+    readonly COMPRESSED_RGBA_ASTC_4x4_KHR: 0x93B0;
+    readonly COMPRESSED_RGBA_ASTC_5x4_KHR: 0x93B1;
+    readonly COMPRESSED_RGBA_ASTC_5x5_KHR: 0x93B2;
+    readonly COMPRESSED_RGBA_ASTC_6x5_KHR: 0x93B3;
+    readonly COMPRESSED_RGBA_ASTC_6x6_KHR: 0x93B4;
+    readonly COMPRESSED_RGBA_ASTC_8x5_KHR: 0x93B5;
+    readonly COMPRESSED_RGBA_ASTC_8x6_KHR: 0x93B6;
+    readonly COMPRESSED_RGBA_ASTC_8x8_KHR: 0x93B7;
+    readonly COMPRESSED_RGBA_ASTC_10x5_KHR: 0x93B8;
+    readonly COMPRESSED_RGBA_ASTC_10x6_KHR: 0x93B9;
+    readonly COMPRESSED_RGBA_ASTC_10x8_KHR: 0x93BA;
+    readonly COMPRESSED_RGBA_ASTC_10x10_KHR: 0x93BB;
+    readonly COMPRESSED_RGBA_ASTC_12x10_KHR: 0x93BC;
+    readonly COMPRESSED_RGBA_ASTC_12x12_KHR: 0x93BD;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: 0x93D0;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: 0x93D1;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: 0x93D2;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: 0x93D3;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: 0x93D4;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: 0x93D5;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: 0x93D6;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: 0x93D7;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: 0x93D8;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: 0x93D9;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: 0x93DA;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: 0x93DB;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: 0x93DC;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: 0x93DD;
+}
+
+interface WEBGL_compressed_texture_etc {
+    readonly COMPRESSED_R11_EAC: 0x9270;
+    readonly COMPRESSED_SIGNED_R11_EAC: 0x9271;
+    readonly COMPRESSED_RG11_EAC: 0x9272;
+    readonly COMPRESSED_SIGNED_RG11_EAC: 0x9273;
+    readonly COMPRESSED_RGB8_ETC2: 0x9274;
+    readonly COMPRESSED_SRGB8_ETC2: 0x9275;
+    readonly COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 0x9276;
+    readonly COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 0x9277;
+    readonly COMPRESSED_RGBA8_ETC2_EAC: 0x9278;
+    readonly COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 0x9279;
+}
+
+interface WEBGL_compressed_texture_etc1 {
+    readonly COMPRESSED_RGB_ETC1_WEBGL: 0x8D64;
+}
+
+/** The WEBGL_compressed_texture_s3tc extension is part of the WebGL API and exposes four S3TC compressed texture formats. */
+interface WEBGL_compressed_texture_s3tc {
+    readonly COMPRESSED_RGB_S3TC_DXT1_EXT: 0x83F0;
+    readonly COMPRESSED_RGBA_S3TC_DXT1_EXT: 0x83F1;
+    readonly COMPRESSED_RGBA_S3TC_DXT3_EXT: 0x83F2;
+    readonly COMPRESSED_RGBA_S3TC_DXT5_EXT: 0x83F3;
+}
+
+interface WEBGL_compressed_texture_s3tc_srgb {
+    readonly COMPRESSED_SRGB_S3TC_DXT1_EXT: 0x8C4C;
+    readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 0x8C4D;
+    readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 0x8C4E;
+    readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 0x8C4F;
+}
+
+/** The WEBGL_debug_renderer_info extension is part of the WebGL API and exposes two constants with information about the graphics driver for debugging purposes. */
+interface WEBGL_debug_renderer_info {
+    readonly UNMASKED_VENDOR_WEBGL: 0x9245;
+    readonly UNMASKED_RENDERER_WEBGL: 0x9246;
+}
+
+interface WEBGL_debug_shaders {
+    getTranslatedShaderSource(shader: WebGLShader): string;
+}
+
+/** The WEBGL_depth_texture extension is part of the WebGL API and defines 2D depth and depth-stencil textures. */
+interface WEBGL_depth_texture {
+    readonly UNSIGNED_INT_24_8_WEBGL: 0x84FA;
+}
+
+interface WEBGL_draw_buffers {
+    drawBuffersWEBGL(buffers: GLenum[]): void;
+    readonly COLOR_ATTACHMENT0_WEBGL: 0x8CE0;
+    readonly COLOR_ATTACHMENT1_WEBGL: 0x8CE1;
+    readonly COLOR_ATTACHMENT2_WEBGL: 0x8CE2;
+    readonly COLOR_ATTACHMENT3_WEBGL: 0x8CE3;
+    readonly COLOR_ATTACHMENT4_WEBGL: 0x8CE4;
+    readonly COLOR_ATTACHMENT5_WEBGL: 0x8CE5;
+    readonly COLOR_ATTACHMENT6_WEBGL: 0x8CE6;
+    readonly COLOR_ATTACHMENT7_WEBGL: 0x8CE7;
+    readonly COLOR_ATTACHMENT8_WEBGL: 0x8CE8;
+    readonly COLOR_ATTACHMENT9_WEBGL: 0x8CE9;
+    readonly COLOR_ATTACHMENT10_WEBGL: 0x8CEA;
+    readonly COLOR_ATTACHMENT11_WEBGL: 0x8CEB;
+    readonly COLOR_ATTACHMENT12_WEBGL: 0x8CEC;
+    readonly COLOR_ATTACHMENT13_WEBGL: 0x8CED;
+    readonly COLOR_ATTACHMENT14_WEBGL: 0x8CEE;
+    readonly COLOR_ATTACHMENT15_WEBGL: 0x8CEF;
+    readonly DRAW_BUFFER0_WEBGL: 0x8825;
+    readonly DRAW_BUFFER1_WEBGL: 0x8826;
+    readonly DRAW_BUFFER2_WEBGL: 0x8827;
+    readonly DRAW_BUFFER3_WEBGL: 0x8828;
+    readonly DRAW_BUFFER4_WEBGL: 0x8829;
+    readonly DRAW_BUFFER5_WEBGL: 0x882A;
+    readonly DRAW_BUFFER6_WEBGL: 0x882B;
+    readonly DRAW_BUFFER7_WEBGL: 0x882C;
+    readonly DRAW_BUFFER8_WEBGL: 0x882D;
+    readonly DRAW_BUFFER9_WEBGL: 0x882E;
+    readonly DRAW_BUFFER10_WEBGL: 0x882F;
+    readonly DRAW_BUFFER11_WEBGL: 0x8830;
+    readonly DRAW_BUFFER12_WEBGL: 0x8831;
+    readonly DRAW_BUFFER13_WEBGL: 0x8832;
+    readonly DRAW_BUFFER14_WEBGL: 0x8833;
+    readonly DRAW_BUFFER15_WEBGL: 0x8834;
+    readonly MAX_COLOR_ATTACHMENTS_WEBGL: 0x8CDF;
+    readonly MAX_DRAW_BUFFERS_WEBGL: 0x8824;
+}
+
+interface WEBGL_lose_context {
+    loseContext(): void;
+    restoreContext(): void;
+}
+
+interface WEBGL_multi_draw {
+    multiDrawArraysInstancedWEBGL(mode: GLenum, firstsList: Int32Array | GLint[], firstsOffset: GLuint, countsList: Int32Array | GLsizei[], countsOffset: GLuint, instanceCountsList: Int32Array | GLsizei[], instanceCountsOffset: GLuint, drawcount: GLsizei): void;
+    multiDrawArraysWEBGL(mode: GLenum, firstsList: Int32Array | GLint[], firstsOffset: GLuint, countsList: Int32Array | GLsizei[], countsOffset: GLuint, drawcount: GLsizei): void;
+    multiDrawElementsInstancedWEBGL(mode: GLenum, countsList: Int32Array | GLsizei[], countsOffset: GLuint, type: GLenum, offsetsList: Int32Array | GLsizei[], offsetsOffset: GLuint, instanceCountsList: Int32Array | GLsizei[], instanceCountsOffset: GLuint, drawcount: GLsizei): void;
+    multiDrawElementsWEBGL(mode: GLenum, countsList: Int32Array | GLsizei[], countsOffset: GLuint, type: GLenum, offsetsList: Int32Array | GLsizei[], offsetsOffset: GLuint, drawcount: GLsizei): void;
+}
+
+/** A WaveShaperNode always has exactly one input and one output. */
+interface WaveShaperNode extends AudioNode {
+    curve: Float32Array | null;
+    oversample: OverSampleType;
+}
+
+declare var WaveShaperNode: {
+    prototype: WaveShaperNode;
+    new(context: BaseAudioContext, options?: WaveShaperOptions): WaveShaperNode;
+};
+
+interface WebGL2RenderingContext extends WebGL2RenderingContextBase, WebGL2RenderingContextOverloads, WebGLRenderingContextBase {
+}
+
+declare var WebGL2RenderingContext: {
+    prototype: WebGL2RenderingContext;
+    new(): WebGL2RenderingContext;
+    readonly READ_BUFFER: 0x0C02;
+    readonly UNPACK_ROW_LENGTH: 0x0CF2;
+    readonly UNPACK_SKIP_ROWS: 0x0CF3;
+    readonly UNPACK_SKIP_PIXELS: 0x0CF4;
+    readonly PACK_ROW_LENGTH: 0x0D02;
+    readonly PACK_SKIP_ROWS: 0x0D03;
+    readonly PACK_SKIP_PIXELS: 0x0D04;
+    readonly COLOR: 0x1800;
+    readonly DEPTH: 0x1801;
+    readonly STENCIL: 0x1802;
+    readonly RED: 0x1903;
+    readonly RGB8: 0x8051;
+    readonly RGBA8: 0x8058;
+    readonly RGB10_A2: 0x8059;
+    readonly TEXTURE_BINDING_3D: 0x806A;
+    readonly UNPACK_SKIP_IMAGES: 0x806D;
+    readonly UNPACK_IMAGE_HEIGHT: 0x806E;
+    readonly TEXTURE_3D: 0x806F;
+    readonly TEXTURE_WRAP_R: 0x8072;
+    readonly MAX_3D_TEXTURE_SIZE: 0x8073;
+    readonly UNSIGNED_INT_2_10_10_10_REV: 0x8368;
+    readonly MAX_ELEMENTS_VERTICES: 0x80E8;
+    readonly MAX_ELEMENTS_INDICES: 0x80E9;
+    readonly TEXTURE_MIN_LOD: 0x813A;
+    readonly TEXTURE_MAX_LOD: 0x813B;
+    readonly TEXTURE_BASE_LEVEL: 0x813C;
+    readonly TEXTURE_MAX_LEVEL: 0x813D;
+    readonly MIN: 0x8007;
+    readonly MAX: 0x8008;
+    readonly DEPTH_COMPONENT24: 0x81A6;
+    readonly MAX_TEXTURE_LOD_BIAS: 0x84FD;
+    readonly TEXTURE_COMPARE_MODE: 0x884C;
+    readonly TEXTURE_COMPARE_FUNC: 0x884D;
+    readonly CURRENT_QUERY: 0x8865;
+    readonly QUERY_RESULT: 0x8866;
+    readonly QUERY_RESULT_AVAILABLE: 0x8867;
+    readonly STREAM_READ: 0x88E1;
+    readonly STREAM_COPY: 0x88E2;
+    readonly STATIC_READ: 0x88E5;
+    readonly STATIC_COPY: 0x88E6;
+    readonly DYNAMIC_READ: 0x88E9;
+    readonly DYNAMIC_COPY: 0x88EA;
+    readonly MAX_DRAW_BUFFERS: 0x8824;
+    readonly DRAW_BUFFER0: 0x8825;
+    readonly DRAW_BUFFER1: 0x8826;
+    readonly DRAW_BUFFER2: 0x8827;
+    readonly DRAW_BUFFER3: 0x8828;
+    readonly DRAW_BUFFER4: 0x8829;
+    readonly DRAW_BUFFER5: 0x882A;
+    readonly DRAW_BUFFER6: 0x882B;
+    readonly DRAW_BUFFER7: 0x882C;
+    readonly DRAW_BUFFER8: 0x882D;
+    readonly DRAW_BUFFER9: 0x882E;
+    readonly DRAW_BUFFER10: 0x882F;
+    readonly DRAW_BUFFER11: 0x8830;
+    readonly DRAW_BUFFER12: 0x8831;
+    readonly DRAW_BUFFER13: 0x8832;
+    readonly DRAW_BUFFER14: 0x8833;
+    readonly DRAW_BUFFER15: 0x8834;
+    readonly MAX_FRAGMENT_UNIFORM_COMPONENTS: 0x8B49;
+    readonly MAX_VERTEX_UNIFORM_COMPONENTS: 0x8B4A;
+    readonly SAMPLER_3D: 0x8B5F;
+    readonly SAMPLER_2D_SHADOW: 0x8B62;
+    readonly FRAGMENT_SHADER_DERIVATIVE_HINT: 0x8B8B;
+    readonly PIXEL_PACK_BUFFER: 0x88EB;
+    readonly PIXEL_UNPACK_BUFFER: 0x88EC;
+    readonly PIXEL_PACK_BUFFER_BINDING: 0x88ED;
+    readonly PIXEL_UNPACK_BUFFER_BINDING: 0x88EF;
+    readonly FLOAT_MAT2x3: 0x8B65;
+    readonly FLOAT_MAT2x4: 0x8B66;
+    readonly FLOAT_MAT3x2: 0x8B67;
+    readonly FLOAT_MAT3x4: 0x8B68;
+    readonly FLOAT_MAT4x2: 0x8B69;
+    readonly FLOAT_MAT4x3: 0x8B6A;
+    readonly SRGB: 0x8C40;
+    readonly SRGB8: 0x8C41;
+    readonly SRGB8_ALPHA8: 0x8C43;
+    readonly COMPARE_REF_TO_TEXTURE: 0x884E;
+    readonly RGBA32F: 0x8814;
+    readonly RGB32F: 0x8815;
+    readonly RGBA16F: 0x881A;
+    readonly RGB16F: 0x881B;
+    readonly VERTEX_ATTRIB_ARRAY_INTEGER: 0x88FD;
+    readonly MAX_ARRAY_TEXTURE_LAYERS: 0x88FF;
+    readonly MIN_PROGRAM_TEXEL_OFFSET: 0x8904;
+    readonly MAX_PROGRAM_TEXEL_OFFSET: 0x8905;
+    readonly MAX_VARYING_COMPONENTS: 0x8B4B;
+    readonly TEXTURE_2D_ARRAY: 0x8C1A;
+    readonly TEXTURE_BINDING_2D_ARRAY: 0x8C1D;
+    readonly R11F_G11F_B10F: 0x8C3A;
+    readonly UNSIGNED_INT_10F_11F_11F_REV: 0x8C3B;
+    readonly RGB9_E5: 0x8C3D;
+    readonly UNSIGNED_INT_5_9_9_9_REV: 0x8C3E;
+    readonly TRANSFORM_FEEDBACK_BUFFER_MODE: 0x8C7F;
+    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: 0x8C80;
+    readonly TRANSFORM_FEEDBACK_VARYINGS: 0x8C83;
+    readonly TRANSFORM_FEEDBACK_BUFFER_START: 0x8C84;
+    readonly TRANSFORM_FEEDBACK_BUFFER_SIZE: 0x8C85;
+    readonly TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 0x8C88;
+    readonly RASTERIZER_DISCARD: 0x8C89;
+    readonly MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: 0x8C8A;
+    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: 0x8C8B;
+    readonly INTERLEAVED_ATTRIBS: 0x8C8C;
+    readonly SEPARATE_ATTRIBS: 0x8C8D;
+    readonly TRANSFORM_FEEDBACK_BUFFER: 0x8C8E;
+    readonly TRANSFORM_FEEDBACK_BUFFER_BINDING: 0x8C8F;
+    readonly RGBA32UI: 0x8D70;
+    readonly RGB32UI: 0x8D71;
+    readonly RGBA16UI: 0x8D76;
+    readonly RGB16UI: 0x8D77;
+    readonly RGBA8UI: 0x8D7C;
+    readonly RGB8UI: 0x8D7D;
+    readonly RGBA32I: 0x8D82;
+    readonly RGB32I: 0x8D83;
+    readonly RGBA16I: 0x8D88;
+    readonly RGB16I: 0x8D89;
+    readonly RGBA8I: 0x8D8E;
+    readonly RGB8I: 0x8D8F;
+    readonly RED_INTEGER: 0x8D94;
+    readonly RGB_INTEGER: 0x8D98;
+    readonly RGBA_INTEGER: 0x8D99;
+    readonly SAMPLER_2D_ARRAY: 0x8DC1;
+    readonly SAMPLER_2D_ARRAY_SHADOW: 0x8DC4;
+    readonly SAMPLER_CUBE_SHADOW: 0x8DC5;
+    readonly UNSIGNED_INT_VEC2: 0x8DC6;
+    readonly UNSIGNED_INT_VEC3: 0x8DC7;
+    readonly UNSIGNED_INT_VEC4: 0x8DC8;
+    readonly INT_SAMPLER_2D: 0x8DCA;
+    readonly INT_SAMPLER_3D: 0x8DCB;
+    readonly INT_SAMPLER_CUBE: 0x8DCC;
+    readonly INT_SAMPLER_2D_ARRAY: 0x8DCF;
+    readonly UNSIGNED_INT_SAMPLER_2D: 0x8DD2;
+    readonly UNSIGNED_INT_SAMPLER_3D: 0x8DD3;
+    readonly UNSIGNED_INT_SAMPLER_CUBE: 0x8DD4;
+    readonly UNSIGNED_INT_SAMPLER_2D_ARRAY: 0x8DD7;
+    readonly DEPTH_COMPONENT32F: 0x8CAC;
+    readonly DEPTH32F_STENCIL8: 0x8CAD;
+    readonly FLOAT_32_UNSIGNED_INT_24_8_REV: 0x8DAD;
+    readonly FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: 0x8210;
+    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: 0x8211;
+    readonly FRAMEBUFFER_ATTACHMENT_RED_SIZE: 0x8212;
+    readonly FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 0x8213;
+    readonly FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 0x8214;
+    readonly FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 0x8215;
+    readonly FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 0x8216;
+    readonly FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 0x8217;
+    readonly FRAMEBUFFER_DEFAULT: 0x8218;
+    readonly UNSIGNED_INT_24_8: 0x84FA;
+    readonly DEPTH24_STENCIL8: 0x88F0;
+    readonly UNSIGNED_NORMALIZED: 0x8C17;
+    readonly DRAW_FRAMEBUFFER_BINDING: 0x8CA6;
+    readonly READ_FRAMEBUFFER: 0x8CA8;
+    readonly DRAW_FRAMEBUFFER: 0x8CA9;
+    readonly READ_FRAMEBUFFER_BINDING: 0x8CAA;
+    readonly RENDERBUFFER_SAMPLES: 0x8CAB;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: 0x8CD4;
+    readonly MAX_COLOR_ATTACHMENTS: 0x8CDF;
+    readonly COLOR_ATTACHMENT1: 0x8CE1;
+    readonly COLOR_ATTACHMENT2: 0x8CE2;
+    readonly COLOR_ATTACHMENT3: 0x8CE3;
+    readonly COLOR_ATTACHMENT4: 0x8CE4;
+    readonly COLOR_ATTACHMENT5: 0x8CE5;
+    readonly COLOR_ATTACHMENT6: 0x8CE6;
+    readonly COLOR_ATTACHMENT7: 0x8CE7;
+    readonly COLOR_ATTACHMENT8: 0x8CE8;
+    readonly COLOR_ATTACHMENT9: 0x8CE9;
+    readonly COLOR_ATTACHMENT10: 0x8CEA;
+    readonly COLOR_ATTACHMENT11: 0x8CEB;
+    readonly COLOR_ATTACHMENT12: 0x8CEC;
+    readonly COLOR_ATTACHMENT13: 0x8CED;
+    readonly COLOR_ATTACHMENT14: 0x8CEE;
+    readonly COLOR_ATTACHMENT15: 0x8CEF;
+    readonly FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: 0x8D56;
+    readonly MAX_SAMPLES: 0x8D57;
+    readonly HALF_FLOAT: 0x140B;
+    readonly RG: 0x8227;
+    readonly RG_INTEGER: 0x8228;
+    readonly R8: 0x8229;
+    readonly RG8: 0x822B;
+    readonly R16F: 0x822D;
+    readonly R32F: 0x822E;
+    readonly RG16F: 0x822F;
+    readonly RG32F: 0x8230;
+    readonly R8I: 0x8231;
+    readonly R8UI: 0x8232;
+    readonly R16I: 0x8233;
+    readonly R16UI: 0x8234;
+    readonly R32I: 0x8235;
+    readonly R32UI: 0x8236;
+    readonly RG8I: 0x8237;
+    readonly RG8UI: 0x8238;
+    readonly RG16I: 0x8239;
+    readonly RG16UI: 0x823A;
+    readonly RG32I: 0x823B;
+    readonly RG32UI: 0x823C;
+    readonly VERTEX_ARRAY_BINDING: 0x85B5;
+    readonly R8_SNORM: 0x8F94;
+    readonly RG8_SNORM: 0x8F95;
+    readonly RGB8_SNORM: 0x8F96;
+    readonly RGBA8_SNORM: 0x8F97;
+    readonly SIGNED_NORMALIZED: 0x8F9C;
+    readonly COPY_READ_BUFFER: 0x8F36;
+    readonly COPY_WRITE_BUFFER: 0x8F37;
+    readonly COPY_READ_BUFFER_BINDING: 0x8F36;
+    readonly COPY_WRITE_BUFFER_BINDING: 0x8F37;
+    readonly UNIFORM_BUFFER: 0x8A11;
+    readonly UNIFORM_BUFFER_BINDING: 0x8A28;
+    readonly UNIFORM_BUFFER_START: 0x8A29;
+    readonly UNIFORM_BUFFER_SIZE: 0x8A2A;
+    readonly MAX_VERTEX_UNIFORM_BLOCKS: 0x8A2B;
+    readonly MAX_FRAGMENT_UNIFORM_BLOCKS: 0x8A2D;
+    readonly MAX_COMBINED_UNIFORM_BLOCKS: 0x8A2E;
+    readonly MAX_UNIFORM_BUFFER_BINDINGS: 0x8A2F;
+    readonly MAX_UNIFORM_BLOCK_SIZE: 0x8A30;
+    readonly MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: 0x8A31;
+    readonly MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: 0x8A33;
+    readonly UNIFORM_BUFFER_OFFSET_ALIGNMENT: 0x8A34;
+    readonly ACTIVE_UNIFORM_BLOCKS: 0x8A36;
+    readonly UNIFORM_TYPE: 0x8A37;
+    readonly UNIFORM_SIZE: 0x8A38;
+    readonly UNIFORM_BLOCK_INDEX: 0x8A3A;
+    readonly UNIFORM_OFFSET: 0x8A3B;
+    readonly UNIFORM_ARRAY_STRIDE: 0x8A3C;
+    readonly UNIFORM_MATRIX_STRIDE: 0x8A3D;
+    readonly UNIFORM_IS_ROW_MAJOR: 0x8A3E;
+    readonly UNIFORM_BLOCK_BINDING: 0x8A3F;
+    readonly UNIFORM_BLOCK_DATA_SIZE: 0x8A40;
+    readonly UNIFORM_BLOCK_ACTIVE_UNIFORMS: 0x8A42;
+    readonly UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: 0x8A43;
+    readonly UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: 0x8A44;
+    readonly UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: 0x8A46;
+    readonly INVALID_INDEX: 0xFFFFFFFF;
+    readonly MAX_VERTEX_OUTPUT_COMPONENTS: 0x9122;
+    readonly MAX_FRAGMENT_INPUT_COMPONENTS: 0x9125;
+    readonly MAX_SERVER_WAIT_TIMEOUT: 0x9111;
+    readonly OBJECT_TYPE: 0x9112;
+    readonly SYNC_CONDITION: 0x9113;
+    readonly SYNC_STATUS: 0x9114;
+    readonly SYNC_FLAGS: 0x9115;
+    readonly SYNC_FENCE: 0x9116;
+    readonly SYNC_GPU_COMMANDS_COMPLETE: 0x9117;
+    readonly UNSIGNALED: 0x9118;
+    readonly SIGNALED: 0x9119;
+    readonly ALREADY_SIGNALED: 0x911A;
+    readonly TIMEOUT_EXPIRED: 0x911B;
+    readonly CONDITION_SATISFIED: 0x911C;
+    readonly WAIT_FAILED: 0x911D;
+    readonly SYNC_FLUSH_COMMANDS_BIT: 0x00000001;
+    readonly VERTEX_ATTRIB_ARRAY_DIVISOR: 0x88FE;
+    readonly ANY_SAMPLES_PASSED: 0x8C2F;
+    readonly ANY_SAMPLES_PASSED_CONSERVATIVE: 0x8D6A;
+    readonly SAMPLER_BINDING: 0x8919;
+    readonly RGB10_A2UI: 0x906F;
+    readonly INT_2_10_10_10_REV: 0x8D9F;
+    readonly TRANSFORM_FEEDBACK: 0x8E22;
+    readonly TRANSFORM_FEEDBACK_PAUSED: 0x8E23;
+    readonly TRANSFORM_FEEDBACK_ACTIVE: 0x8E24;
+    readonly TRANSFORM_FEEDBACK_BINDING: 0x8E25;
+    readonly TEXTURE_IMMUTABLE_FORMAT: 0x912F;
+    readonly MAX_ELEMENT_INDEX: 0x8D6B;
+    readonly TEXTURE_IMMUTABLE_LEVELS: 0x82DF;
+    readonly TIMEOUT_IGNORED: -1;
+    readonly MAX_CLIENT_WAIT_TIMEOUT_WEBGL: 0x9247;
+    readonly DEPTH_BUFFER_BIT: 0x00000100;
+    readonly STENCIL_BUFFER_BIT: 0x00000400;
+    readonly COLOR_BUFFER_BIT: 0x00004000;
+    readonly POINTS: 0x0000;
+    readonly LINES: 0x0001;
+    readonly LINE_LOOP: 0x0002;
+    readonly LINE_STRIP: 0x0003;
+    readonly TRIANGLES: 0x0004;
+    readonly TRIANGLE_STRIP: 0x0005;
+    readonly TRIANGLE_FAN: 0x0006;
+    readonly ZERO: 0;
+    readonly ONE: 1;
+    readonly SRC_COLOR: 0x0300;
+    readonly ONE_MINUS_SRC_COLOR: 0x0301;
+    readonly SRC_ALPHA: 0x0302;
+    readonly ONE_MINUS_SRC_ALPHA: 0x0303;
+    readonly DST_ALPHA: 0x0304;
+    readonly ONE_MINUS_DST_ALPHA: 0x0305;
+    readonly DST_COLOR: 0x0306;
+    readonly ONE_MINUS_DST_COLOR: 0x0307;
+    readonly SRC_ALPHA_SATURATE: 0x0308;
+    readonly FUNC_ADD: 0x8006;
+    readonly BLEND_EQUATION: 0x8009;
+    readonly BLEND_EQUATION_RGB: 0x8009;
+    readonly BLEND_EQUATION_ALPHA: 0x883D;
+    readonly FUNC_SUBTRACT: 0x800A;
+    readonly FUNC_REVERSE_SUBTRACT: 0x800B;
+    readonly BLEND_DST_RGB: 0x80C8;
+    readonly BLEND_SRC_RGB: 0x80C9;
+    readonly BLEND_DST_ALPHA: 0x80CA;
+    readonly BLEND_SRC_ALPHA: 0x80CB;
+    readonly CONSTANT_COLOR: 0x8001;
+    readonly ONE_MINUS_CONSTANT_COLOR: 0x8002;
+    readonly CONSTANT_ALPHA: 0x8003;
+    readonly ONE_MINUS_CONSTANT_ALPHA: 0x8004;
+    readonly BLEND_COLOR: 0x8005;
+    readonly ARRAY_BUFFER: 0x8892;
+    readonly ELEMENT_ARRAY_BUFFER: 0x8893;
+    readonly ARRAY_BUFFER_BINDING: 0x8894;
+    readonly ELEMENT_ARRAY_BUFFER_BINDING: 0x8895;
+    readonly STREAM_DRAW: 0x88E0;
+    readonly STATIC_DRAW: 0x88E4;
+    readonly DYNAMIC_DRAW: 0x88E8;
+    readonly BUFFER_SIZE: 0x8764;
+    readonly BUFFER_USAGE: 0x8765;
+    readonly CURRENT_VERTEX_ATTRIB: 0x8626;
+    readonly FRONT: 0x0404;
+    readonly BACK: 0x0405;
+    readonly FRONT_AND_BACK: 0x0408;
+    readonly CULL_FACE: 0x0B44;
+    readonly BLEND: 0x0BE2;
+    readonly DITHER: 0x0BD0;
+    readonly STENCIL_TEST: 0x0B90;
+    readonly DEPTH_TEST: 0x0B71;
+    readonly SCISSOR_TEST: 0x0C11;
+    readonly POLYGON_OFFSET_FILL: 0x8037;
+    readonly SAMPLE_ALPHA_TO_COVERAGE: 0x809E;
+    readonly SAMPLE_COVERAGE: 0x80A0;
+    readonly NO_ERROR: 0;
+    readonly INVALID_ENUM: 0x0500;
+    readonly INVALID_VALUE: 0x0501;
+    readonly INVALID_OPERATION: 0x0502;
+    readonly OUT_OF_MEMORY: 0x0505;
+    readonly CW: 0x0900;
+    readonly CCW: 0x0901;
+    readonly LINE_WIDTH: 0x0B21;
+    readonly ALIASED_POINT_SIZE_RANGE: 0x846D;
+    readonly ALIASED_LINE_WIDTH_RANGE: 0x846E;
+    readonly CULL_FACE_MODE: 0x0B45;
+    readonly FRONT_FACE: 0x0B46;
+    readonly DEPTH_RANGE: 0x0B70;
+    readonly DEPTH_WRITEMASK: 0x0B72;
+    readonly DEPTH_CLEAR_VALUE: 0x0B73;
+    readonly DEPTH_FUNC: 0x0B74;
+    readonly STENCIL_CLEAR_VALUE: 0x0B91;
+    readonly STENCIL_FUNC: 0x0B92;
+    readonly STENCIL_FAIL: 0x0B94;
+    readonly STENCIL_PASS_DEPTH_FAIL: 0x0B95;
+    readonly STENCIL_PASS_DEPTH_PASS: 0x0B96;
+    readonly STENCIL_REF: 0x0B97;
+    readonly STENCIL_VALUE_MASK: 0x0B93;
+    readonly STENCIL_WRITEMASK: 0x0B98;
+    readonly STENCIL_BACK_FUNC: 0x8800;
+    readonly STENCIL_BACK_FAIL: 0x8801;
+    readonly STENCIL_BACK_PASS_DEPTH_FAIL: 0x8802;
+    readonly STENCIL_BACK_PASS_DEPTH_PASS: 0x8803;
+    readonly STENCIL_BACK_REF: 0x8CA3;
+    readonly STENCIL_BACK_VALUE_MASK: 0x8CA4;
+    readonly STENCIL_BACK_WRITEMASK: 0x8CA5;
+    readonly VIEWPORT: 0x0BA2;
+    readonly SCISSOR_BOX: 0x0C10;
+    readonly COLOR_CLEAR_VALUE: 0x0C22;
+    readonly COLOR_WRITEMASK: 0x0C23;
+    readonly UNPACK_ALIGNMENT: 0x0CF5;
+    readonly PACK_ALIGNMENT: 0x0D05;
+    readonly MAX_TEXTURE_SIZE: 0x0D33;
+    readonly MAX_VIEWPORT_DIMS: 0x0D3A;
+    readonly SUBPIXEL_BITS: 0x0D50;
+    readonly RED_BITS: 0x0D52;
+    readonly GREEN_BITS: 0x0D53;
+    readonly BLUE_BITS: 0x0D54;
+    readonly ALPHA_BITS: 0x0D55;
+    readonly DEPTH_BITS: 0x0D56;
+    readonly STENCIL_BITS: 0x0D57;
+    readonly POLYGON_OFFSET_UNITS: 0x2A00;
+    readonly POLYGON_OFFSET_FACTOR: 0x8038;
+    readonly TEXTURE_BINDING_2D: 0x8069;
+    readonly SAMPLE_BUFFERS: 0x80A8;
+    readonly SAMPLES: 0x80A9;
+    readonly SAMPLE_COVERAGE_VALUE: 0x80AA;
+    readonly SAMPLE_COVERAGE_INVERT: 0x80AB;
+    readonly COMPRESSED_TEXTURE_FORMATS: 0x86A3;
+    readonly DONT_CARE: 0x1100;
+    readonly FASTEST: 0x1101;
+    readonly NICEST: 0x1102;
+    readonly GENERATE_MIPMAP_HINT: 0x8192;
+    readonly BYTE: 0x1400;
+    readonly UNSIGNED_BYTE: 0x1401;
+    readonly SHORT: 0x1402;
+    readonly UNSIGNED_SHORT: 0x1403;
+    readonly INT: 0x1404;
+    readonly UNSIGNED_INT: 0x1405;
+    readonly FLOAT: 0x1406;
+    readonly DEPTH_COMPONENT: 0x1902;
+    readonly ALPHA: 0x1906;
+    readonly RGB: 0x1907;
+    readonly RGBA: 0x1908;
+    readonly LUMINANCE: 0x1909;
+    readonly LUMINANCE_ALPHA: 0x190A;
+    readonly UNSIGNED_SHORT_4_4_4_4: 0x8033;
+    readonly UNSIGNED_SHORT_5_5_5_1: 0x8034;
+    readonly UNSIGNED_SHORT_5_6_5: 0x8363;
+    readonly FRAGMENT_SHADER: 0x8B30;
+    readonly VERTEX_SHADER: 0x8B31;
+    readonly MAX_VERTEX_ATTRIBS: 0x8869;
+    readonly MAX_VERTEX_UNIFORM_VECTORS: 0x8DFB;
+    readonly MAX_VARYING_VECTORS: 0x8DFC;
+    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: 0x8B4D;
+    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: 0x8B4C;
+    readonly MAX_TEXTURE_IMAGE_UNITS: 0x8872;
+    readonly MAX_FRAGMENT_UNIFORM_VECTORS: 0x8DFD;
+    readonly SHADER_TYPE: 0x8B4F;
+    readonly DELETE_STATUS: 0x8B80;
+    readonly LINK_STATUS: 0x8B82;
+    readonly VALIDATE_STATUS: 0x8B83;
+    readonly ATTACHED_SHADERS: 0x8B85;
+    readonly ACTIVE_UNIFORMS: 0x8B86;
+    readonly ACTIVE_ATTRIBUTES: 0x8B89;
+    readonly SHADING_LANGUAGE_VERSION: 0x8B8C;
+    readonly CURRENT_PROGRAM: 0x8B8D;
+    readonly NEVER: 0x0200;
+    readonly LESS: 0x0201;
+    readonly EQUAL: 0x0202;
+    readonly LEQUAL: 0x0203;
+    readonly GREATER: 0x0204;
+    readonly NOTEQUAL: 0x0205;
+    readonly GEQUAL: 0x0206;
+    readonly ALWAYS: 0x0207;
+    readonly KEEP: 0x1E00;
+    readonly REPLACE: 0x1E01;
+    readonly INCR: 0x1E02;
+    readonly DECR: 0x1E03;
+    readonly INVERT: 0x150A;
+    readonly INCR_WRAP: 0x8507;
+    readonly DECR_WRAP: 0x8508;
+    readonly VENDOR: 0x1F00;
+    readonly RENDERER: 0x1F01;
+    readonly VERSION: 0x1F02;
+    readonly NEAREST: 0x2600;
+    readonly LINEAR: 0x2601;
+    readonly NEAREST_MIPMAP_NEAREST: 0x2700;
+    readonly LINEAR_MIPMAP_NEAREST: 0x2701;
+    readonly NEAREST_MIPMAP_LINEAR: 0x2702;
+    readonly LINEAR_MIPMAP_LINEAR: 0x2703;
+    readonly TEXTURE_MAG_FILTER: 0x2800;
+    readonly TEXTURE_MIN_FILTER: 0x2801;
+    readonly TEXTURE_WRAP_S: 0x2802;
+    readonly TEXTURE_WRAP_T: 0x2803;
+    readonly TEXTURE_2D: 0x0DE1;
+    readonly TEXTURE: 0x1702;
+    readonly TEXTURE_CUBE_MAP: 0x8513;
+    readonly TEXTURE_BINDING_CUBE_MAP: 0x8514;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_X: 0x8515;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: 0x8516;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: 0x8517;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: 0x8518;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: 0x8519;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: 0x851A;
+    readonly MAX_CUBE_MAP_TEXTURE_SIZE: 0x851C;
+    readonly TEXTURE0: 0x84C0;
+    readonly TEXTURE1: 0x84C1;
+    readonly TEXTURE2: 0x84C2;
+    readonly TEXTURE3: 0x84C3;
+    readonly TEXTURE4: 0x84C4;
+    readonly TEXTURE5: 0x84C5;
+    readonly TEXTURE6: 0x84C6;
+    readonly TEXTURE7: 0x84C7;
+    readonly TEXTURE8: 0x84C8;
+    readonly TEXTURE9: 0x84C9;
+    readonly TEXTURE10: 0x84CA;
+    readonly TEXTURE11: 0x84CB;
+    readonly TEXTURE12: 0x84CC;
+    readonly TEXTURE13: 0x84CD;
+    readonly TEXTURE14: 0x84CE;
+    readonly TEXTURE15: 0x84CF;
+    readonly TEXTURE16: 0x84D0;
+    readonly TEXTURE17: 0x84D1;
+    readonly TEXTURE18: 0x84D2;
+    readonly TEXTURE19: 0x84D3;
+    readonly TEXTURE20: 0x84D4;
+    readonly TEXTURE21: 0x84D5;
+    readonly TEXTURE22: 0x84D6;
+    readonly TEXTURE23: 0x84D7;
+    readonly TEXTURE24: 0x84D8;
+    readonly TEXTURE25: 0x84D9;
+    readonly TEXTURE26: 0x84DA;
+    readonly TEXTURE27: 0x84DB;
+    readonly TEXTURE28: 0x84DC;
+    readonly TEXTURE29: 0x84DD;
+    readonly TEXTURE30: 0x84DE;
+    readonly TEXTURE31: 0x84DF;
+    readonly ACTIVE_TEXTURE: 0x84E0;
+    readonly REPEAT: 0x2901;
+    readonly CLAMP_TO_EDGE: 0x812F;
+    readonly MIRRORED_REPEAT: 0x8370;
+    readonly FLOAT_VEC2: 0x8B50;
+    readonly FLOAT_VEC3: 0x8B51;
+    readonly FLOAT_VEC4: 0x8B52;
+    readonly INT_VEC2: 0x8B53;
+    readonly INT_VEC3: 0x8B54;
+    readonly INT_VEC4: 0x8B55;
+    readonly BOOL: 0x8B56;
+    readonly BOOL_VEC2: 0x8B57;
+    readonly BOOL_VEC3: 0x8B58;
+    readonly BOOL_VEC4: 0x8B59;
+    readonly FLOAT_MAT2: 0x8B5A;
+    readonly FLOAT_MAT3: 0x8B5B;
+    readonly FLOAT_MAT4: 0x8B5C;
+    readonly SAMPLER_2D: 0x8B5E;
+    readonly SAMPLER_CUBE: 0x8B60;
+    readonly VERTEX_ATTRIB_ARRAY_ENABLED: 0x8622;
+    readonly VERTEX_ATTRIB_ARRAY_SIZE: 0x8623;
+    readonly VERTEX_ATTRIB_ARRAY_STRIDE: 0x8624;
+    readonly VERTEX_ATTRIB_ARRAY_TYPE: 0x8625;
+    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: 0x886A;
+    readonly VERTEX_ATTRIB_ARRAY_POINTER: 0x8645;
+    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 0x889F;
+    readonly IMPLEMENTATION_COLOR_READ_TYPE: 0x8B9A;
+    readonly IMPLEMENTATION_COLOR_READ_FORMAT: 0x8B9B;
+    readonly COMPILE_STATUS: 0x8B81;
+    readonly LOW_FLOAT: 0x8DF0;
+    readonly MEDIUM_FLOAT: 0x8DF1;
+    readonly HIGH_FLOAT: 0x8DF2;
+    readonly LOW_INT: 0x8DF3;
+    readonly MEDIUM_INT: 0x8DF4;
+    readonly HIGH_INT: 0x8DF5;
+    readonly FRAMEBUFFER: 0x8D40;
+    readonly RENDERBUFFER: 0x8D41;
+    readonly RGBA4: 0x8056;
+    readonly RGB5_A1: 0x8057;
+    readonly RGB565: 0x8D62;
+    readonly DEPTH_COMPONENT16: 0x81A5;
+    readonly STENCIL_INDEX8: 0x8D48;
+    readonly DEPTH_STENCIL: 0x84F9;
+    readonly RENDERBUFFER_WIDTH: 0x8D42;
+    readonly RENDERBUFFER_HEIGHT: 0x8D43;
+    readonly RENDERBUFFER_INTERNAL_FORMAT: 0x8D44;
+    readonly RENDERBUFFER_RED_SIZE: 0x8D50;
+    readonly RENDERBUFFER_GREEN_SIZE: 0x8D51;
+    readonly RENDERBUFFER_BLUE_SIZE: 0x8D52;
+    readonly RENDERBUFFER_ALPHA_SIZE: 0x8D53;
+    readonly RENDERBUFFER_DEPTH_SIZE: 0x8D54;
+    readonly RENDERBUFFER_STENCIL_SIZE: 0x8D55;
+    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 0x8CD0;
+    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 0x8CD1;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 0x8CD2;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 0x8CD3;
+    readonly COLOR_ATTACHMENT0: 0x8CE0;
+    readonly DEPTH_ATTACHMENT: 0x8D00;
+    readonly STENCIL_ATTACHMENT: 0x8D20;
+    readonly DEPTH_STENCIL_ATTACHMENT: 0x821A;
+    readonly NONE: 0;
+    readonly FRAMEBUFFER_COMPLETE: 0x8CD5;
+    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 0x8CD6;
+    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 0x8CD7;
+    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 0x8CD9;
+    readonly FRAMEBUFFER_UNSUPPORTED: 0x8CDD;
+    readonly FRAMEBUFFER_BINDING: 0x8CA6;
+    readonly RENDERBUFFER_BINDING: 0x8CA7;
+    readonly MAX_RENDERBUFFER_SIZE: 0x84E8;
+    readonly INVALID_FRAMEBUFFER_OPERATION: 0x0506;
+    readonly UNPACK_FLIP_Y_WEBGL: 0x9240;
+    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: 0x9241;
+    readonly CONTEXT_LOST_WEBGL: 0x9242;
+    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: 0x9243;
+    readonly BROWSER_DEFAULT_WEBGL: 0x9244;
+};
+
+interface WebGL2RenderingContextBase {
+    beginQuery(target: GLenum, query: WebGLQuery): void;
+    beginTransformFeedback(primitiveMode: GLenum): void;
+    bindBufferBase(target: GLenum, index: GLuint, buffer: WebGLBuffer | null): void;
+    bindBufferRange(target: GLenum, index: GLuint, buffer: WebGLBuffer | null, offset: GLintptr, size: GLsizeiptr): void;
+    bindSampler(unit: GLuint, sampler: WebGLSampler | null): void;
+    bindTransformFeedback(target: GLenum, tf: WebGLTransformFeedback | null): void;
+    bindVertexArray(array: WebGLVertexArrayObject | null): void;
+    blitFramebuffer(srcX0: GLint, srcY0: GLint, srcX1: GLint, srcY1: GLint, dstX0: GLint, dstY0: GLint, dstX1: GLint, dstY1: GLint, mask: GLbitfield, filter: GLenum): void;
+    clearBufferfi(buffer: GLenum, drawbuffer: GLint, depth: GLfloat, stencil: GLint): void;
+    clearBufferfv(buffer: GLenum, drawbuffer: GLint, values: Float32List, srcOffset?: GLuint): void;
+    clearBufferiv(buffer: GLenum, drawbuffer: GLint, values: Int32List, srcOffset?: GLuint): void;
+    clearBufferuiv(buffer: GLenum, drawbuffer: GLint, values: Uint32List, srcOffset?: GLuint): void;
+    clientWaitSync(sync: WebGLSync, flags: GLbitfield, timeout: GLuint64): GLenum;
+    compressedTexImage3D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, imageSize: GLsizei, offset: GLintptr): void;
+    compressedTexImage3D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
+    compressedTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, imageSize: GLsizei, offset: GLintptr): void;
+    compressedTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
+    copyBufferSubData(readTarget: GLenum, writeTarget: GLenum, readOffset: GLintptr, writeOffset: GLintptr, size: GLsizeiptr): void;
+    copyTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
+    createQuery(): WebGLQuery | null;
+    createSampler(): WebGLSampler | null;
+    createTransformFeedback(): WebGLTransformFeedback | null;
+    createVertexArray(): WebGLVertexArrayObject | null;
+    deleteQuery(query: WebGLQuery | null): void;
+    deleteSampler(sampler: WebGLSampler | null): void;
+    deleteSync(sync: WebGLSync | null): void;
+    deleteTransformFeedback(tf: WebGLTransformFeedback | null): void;
+    deleteVertexArray(vertexArray: WebGLVertexArrayObject | null): void;
+    drawArraysInstanced(mode: GLenum, first: GLint, count: GLsizei, instanceCount: GLsizei): void;
+    drawBuffers(buffers: GLenum[]): void;
+    drawElementsInstanced(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr, instanceCount: GLsizei): void;
+    drawRangeElements(mode: GLenum, start: GLuint, end: GLuint, count: GLsizei, type: GLenum, offset: GLintptr): void;
+    endQuery(target: GLenum): void;
+    endTransformFeedback(): void;
+    fenceSync(condition: GLenum, flags: GLbitfield): WebGLSync | null;
+    framebufferTextureLayer(target: GLenum, attachment: GLenum, texture: WebGLTexture | null, level: GLint, layer: GLint): void;
+    getActiveUniformBlockName(program: WebGLProgram, uniformBlockIndex: GLuint): string | null;
+    getActiveUniformBlockParameter(program: WebGLProgram, uniformBlockIndex: GLuint, pname: GLenum): any;
+    getActiveUniforms(program: WebGLProgram, uniformIndices: GLuint[], pname: GLenum): any;
+    getBufferSubData(target: GLenum, srcByteOffset: GLintptr, dstBuffer: ArrayBufferView, dstOffset?: GLuint, length?: GLuint): void;
+    getFragDataLocation(program: WebGLProgram, name: string): GLint;
+    getIndexedParameter(target: GLenum, index: GLuint): any;
+    getInternalformatParameter(target: GLenum, internalformat: GLenum, pname: GLenum): any;
+    getQuery(target: GLenum, pname: GLenum): WebGLQuery | null;
+    getQueryParameter(query: WebGLQuery, pname: GLenum): any;
+    getSamplerParameter(sampler: WebGLSampler, pname: GLenum): any;
+    getSyncParameter(sync: WebGLSync, pname: GLenum): any;
+    getTransformFeedbackVarying(program: WebGLProgram, index: GLuint): WebGLActiveInfo | null;
+    getUniformBlockIndex(program: WebGLProgram, uniformBlockName: string): GLuint;
+    getUniformIndices(program: WebGLProgram, uniformNames: string[]): GLuint[] | null;
+    invalidateFramebuffer(target: GLenum, attachments: GLenum[]): void;
+    invalidateSubFramebuffer(target: GLenum, attachments: GLenum[], x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
+    isQuery(query: WebGLQuery | null): GLboolean;
+    isSampler(sampler: WebGLSampler | null): GLboolean;
+    isSync(sync: WebGLSync | null): GLboolean;
+    isTransformFeedback(tf: WebGLTransformFeedback | null): GLboolean;
+    isVertexArray(vertexArray: WebGLVertexArrayObject | null): GLboolean;
+    pauseTransformFeedback(): void;
+    readBuffer(src: GLenum): void;
+    renderbufferStorageMultisample(target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei): void;
+    resumeTransformFeedback(): void;
+    samplerParameterf(sampler: WebGLSampler, pname: GLenum, param: GLfloat): void;
+    samplerParameteri(sampler: WebGLSampler, pname: GLenum, param: GLint): void;
+    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
+    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
+    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView | null): void;
+    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint): void;
+    texStorage2D(target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei): void;
+    texStorage3D(target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei): void;
+    texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
+    texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, source: TexImageSource): void;
+    texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, srcData: ArrayBufferView | null, srcOffset?: GLuint): void;
+    transformFeedbackVaryings(program: WebGLProgram, varyings: string[], bufferMode: GLenum): void;
+    uniform1ui(location: WebGLUniformLocation | null, v0: GLuint): void;
+    uniform1uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform2ui(location: WebGLUniformLocation | null, v0: GLuint, v1: GLuint): void;
+    uniform2uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform3ui(location: WebGLUniformLocation | null, v0: GLuint, v1: GLuint, v2: GLuint): void;
+    uniform3uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform4ui(location: WebGLUniformLocation | null, v0: GLuint, v1: GLuint, v2: GLuint, v3: GLuint): void;
+    uniform4uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformBlockBinding(program: WebGLProgram, uniformBlockIndex: GLuint, uniformBlockBinding: GLuint): void;
+    uniformMatrix2x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix2x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix3x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix3x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix4x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix4x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    vertexAttribDivisor(index: GLuint, divisor: GLuint): void;
+    vertexAttribI4i(index: GLuint, x: GLint, y: GLint, z: GLint, w: GLint): void;
+    vertexAttribI4iv(index: GLuint, values: Int32List): void;
+    vertexAttribI4ui(index: GLuint, x: GLuint, y: GLuint, z: GLuint, w: GLuint): void;
+    vertexAttribI4uiv(index: GLuint, values: Uint32List): void;
+    vertexAttribIPointer(index: GLuint, size: GLint, type: GLenum, stride: GLsizei, offset: GLintptr): void;
+    waitSync(sync: WebGLSync, flags: GLbitfield, timeout: GLint64): void;
+    readonly READ_BUFFER: 0x0C02;
+    readonly UNPACK_ROW_LENGTH: 0x0CF2;
+    readonly UNPACK_SKIP_ROWS: 0x0CF3;
+    readonly UNPACK_SKIP_PIXELS: 0x0CF4;
+    readonly PACK_ROW_LENGTH: 0x0D02;
+    readonly PACK_SKIP_ROWS: 0x0D03;
+    readonly PACK_SKIP_PIXELS: 0x0D04;
+    readonly COLOR: 0x1800;
+    readonly DEPTH: 0x1801;
+    readonly STENCIL: 0x1802;
+    readonly RED: 0x1903;
+    readonly RGB8: 0x8051;
+    readonly RGBA8: 0x8058;
+    readonly RGB10_A2: 0x8059;
+    readonly TEXTURE_BINDING_3D: 0x806A;
+    readonly UNPACK_SKIP_IMAGES: 0x806D;
+    readonly UNPACK_IMAGE_HEIGHT: 0x806E;
+    readonly TEXTURE_3D: 0x806F;
+    readonly TEXTURE_WRAP_R: 0x8072;
+    readonly MAX_3D_TEXTURE_SIZE: 0x8073;
+    readonly UNSIGNED_INT_2_10_10_10_REV: 0x8368;
+    readonly MAX_ELEMENTS_VERTICES: 0x80E8;
+    readonly MAX_ELEMENTS_INDICES: 0x80E9;
+    readonly TEXTURE_MIN_LOD: 0x813A;
+    readonly TEXTURE_MAX_LOD: 0x813B;
+    readonly TEXTURE_BASE_LEVEL: 0x813C;
+    readonly TEXTURE_MAX_LEVEL: 0x813D;
+    readonly MIN: 0x8007;
+    readonly MAX: 0x8008;
+    readonly DEPTH_COMPONENT24: 0x81A6;
+    readonly MAX_TEXTURE_LOD_BIAS: 0x84FD;
+    readonly TEXTURE_COMPARE_MODE: 0x884C;
+    readonly TEXTURE_COMPARE_FUNC: 0x884D;
+    readonly CURRENT_QUERY: 0x8865;
+    readonly QUERY_RESULT: 0x8866;
+    readonly QUERY_RESULT_AVAILABLE: 0x8867;
+    readonly STREAM_READ: 0x88E1;
+    readonly STREAM_COPY: 0x88E2;
+    readonly STATIC_READ: 0x88E5;
+    readonly STATIC_COPY: 0x88E6;
+    readonly DYNAMIC_READ: 0x88E9;
+    readonly DYNAMIC_COPY: 0x88EA;
+    readonly MAX_DRAW_BUFFERS: 0x8824;
+    readonly DRAW_BUFFER0: 0x8825;
+    readonly DRAW_BUFFER1: 0x8826;
+    readonly DRAW_BUFFER2: 0x8827;
+    readonly DRAW_BUFFER3: 0x8828;
+    readonly DRAW_BUFFER4: 0x8829;
+    readonly DRAW_BUFFER5: 0x882A;
+    readonly DRAW_BUFFER6: 0x882B;
+    readonly DRAW_BUFFER7: 0x882C;
+    readonly DRAW_BUFFER8: 0x882D;
+    readonly DRAW_BUFFER9: 0x882E;
+    readonly DRAW_BUFFER10: 0x882F;
+    readonly DRAW_BUFFER11: 0x8830;
+    readonly DRAW_BUFFER12: 0x8831;
+    readonly DRAW_BUFFER13: 0x8832;
+    readonly DRAW_BUFFER14: 0x8833;
+    readonly DRAW_BUFFER15: 0x8834;
+    readonly MAX_FRAGMENT_UNIFORM_COMPONENTS: 0x8B49;
+    readonly MAX_VERTEX_UNIFORM_COMPONENTS: 0x8B4A;
+    readonly SAMPLER_3D: 0x8B5F;
+    readonly SAMPLER_2D_SHADOW: 0x8B62;
+    readonly FRAGMENT_SHADER_DERIVATIVE_HINT: 0x8B8B;
+    readonly PIXEL_PACK_BUFFER: 0x88EB;
+    readonly PIXEL_UNPACK_BUFFER: 0x88EC;
+    readonly PIXEL_PACK_BUFFER_BINDING: 0x88ED;
+    readonly PIXEL_UNPACK_BUFFER_BINDING: 0x88EF;
+    readonly FLOAT_MAT2x3: 0x8B65;
+    readonly FLOAT_MAT2x4: 0x8B66;
+    readonly FLOAT_MAT3x2: 0x8B67;
+    readonly FLOAT_MAT3x4: 0x8B68;
+    readonly FLOAT_MAT4x2: 0x8B69;
+    readonly FLOAT_MAT4x3: 0x8B6A;
+    readonly SRGB: 0x8C40;
+    readonly SRGB8: 0x8C41;
+    readonly SRGB8_ALPHA8: 0x8C43;
+    readonly COMPARE_REF_TO_TEXTURE: 0x884E;
+    readonly RGBA32F: 0x8814;
+    readonly RGB32F: 0x8815;
+    readonly RGBA16F: 0x881A;
+    readonly RGB16F: 0x881B;
+    readonly VERTEX_ATTRIB_ARRAY_INTEGER: 0x88FD;
+    readonly MAX_ARRAY_TEXTURE_LAYERS: 0x88FF;
+    readonly MIN_PROGRAM_TEXEL_OFFSET: 0x8904;
+    readonly MAX_PROGRAM_TEXEL_OFFSET: 0x8905;
+    readonly MAX_VARYING_COMPONENTS: 0x8B4B;
+    readonly TEXTURE_2D_ARRAY: 0x8C1A;
+    readonly TEXTURE_BINDING_2D_ARRAY: 0x8C1D;
+    readonly R11F_G11F_B10F: 0x8C3A;
+    readonly UNSIGNED_INT_10F_11F_11F_REV: 0x8C3B;
+    readonly RGB9_E5: 0x8C3D;
+    readonly UNSIGNED_INT_5_9_9_9_REV: 0x8C3E;
+    readonly TRANSFORM_FEEDBACK_BUFFER_MODE: 0x8C7F;
+    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: 0x8C80;
+    readonly TRANSFORM_FEEDBACK_VARYINGS: 0x8C83;
+    readonly TRANSFORM_FEEDBACK_BUFFER_START: 0x8C84;
+    readonly TRANSFORM_FEEDBACK_BUFFER_SIZE: 0x8C85;
+    readonly TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 0x8C88;
+    readonly RASTERIZER_DISCARD: 0x8C89;
+    readonly MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: 0x8C8A;
+    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: 0x8C8B;
+    readonly INTERLEAVED_ATTRIBS: 0x8C8C;
+    readonly SEPARATE_ATTRIBS: 0x8C8D;
+    readonly TRANSFORM_FEEDBACK_BUFFER: 0x8C8E;
+    readonly TRANSFORM_FEEDBACK_BUFFER_BINDING: 0x8C8F;
+    readonly RGBA32UI: 0x8D70;
+    readonly RGB32UI: 0x8D71;
+    readonly RGBA16UI: 0x8D76;
+    readonly RGB16UI: 0x8D77;
+    readonly RGBA8UI: 0x8D7C;
+    readonly RGB8UI: 0x8D7D;
+    readonly RGBA32I: 0x8D82;
+    readonly RGB32I: 0x8D83;
+    readonly RGBA16I: 0x8D88;
+    readonly RGB16I: 0x8D89;
+    readonly RGBA8I: 0x8D8E;
+    readonly RGB8I: 0x8D8F;
+    readonly RED_INTEGER: 0x8D94;
+    readonly RGB_INTEGER: 0x8D98;
+    readonly RGBA_INTEGER: 0x8D99;
+    readonly SAMPLER_2D_ARRAY: 0x8DC1;
+    readonly SAMPLER_2D_ARRAY_SHADOW: 0x8DC4;
+    readonly SAMPLER_CUBE_SHADOW: 0x8DC5;
+    readonly UNSIGNED_INT_VEC2: 0x8DC6;
+    readonly UNSIGNED_INT_VEC3: 0x8DC7;
+    readonly UNSIGNED_INT_VEC4: 0x8DC8;
+    readonly INT_SAMPLER_2D: 0x8DCA;
+    readonly INT_SAMPLER_3D: 0x8DCB;
+    readonly INT_SAMPLER_CUBE: 0x8DCC;
+    readonly INT_SAMPLER_2D_ARRAY: 0x8DCF;
+    readonly UNSIGNED_INT_SAMPLER_2D: 0x8DD2;
+    readonly UNSIGNED_INT_SAMPLER_3D: 0x8DD3;
+    readonly UNSIGNED_INT_SAMPLER_CUBE: 0x8DD4;
+    readonly UNSIGNED_INT_SAMPLER_2D_ARRAY: 0x8DD7;
+    readonly DEPTH_COMPONENT32F: 0x8CAC;
+    readonly DEPTH32F_STENCIL8: 0x8CAD;
+    readonly FLOAT_32_UNSIGNED_INT_24_8_REV: 0x8DAD;
+    readonly FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: 0x8210;
+    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: 0x8211;
+    readonly FRAMEBUFFER_ATTACHMENT_RED_SIZE: 0x8212;
+    readonly FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 0x8213;
+    readonly FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 0x8214;
+    readonly FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 0x8215;
+    readonly FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 0x8216;
+    readonly FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 0x8217;
+    readonly FRAMEBUFFER_DEFAULT: 0x8218;
+    readonly UNSIGNED_INT_24_8: 0x84FA;
+    readonly DEPTH24_STENCIL8: 0x88F0;
+    readonly UNSIGNED_NORMALIZED: 0x8C17;
+    readonly DRAW_FRAMEBUFFER_BINDING: 0x8CA6;
+    readonly READ_FRAMEBUFFER: 0x8CA8;
+    readonly DRAW_FRAMEBUFFER: 0x8CA9;
+    readonly READ_FRAMEBUFFER_BINDING: 0x8CAA;
+    readonly RENDERBUFFER_SAMPLES: 0x8CAB;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: 0x8CD4;
+    readonly MAX_COLOR_ATTACHMENTS: 0x8CDF;
+    readonly COLOR_ATTACHMENT1: 0x8CE1;
+    readonly COLOR_ATTACHMENT2: 0x8CE2;
+    readonly COLOR_ATTACHMENT3: 0x8CE3;
+    readonly COLOR_ATTACHMENT4: 0x8CE4;
+    readonly COLOR_ATTACHMENT5: 0x8CE5;
+    readonly COLOR_ATTACHMENT6: 0x8CE6;
+    readonly COLOR_ATTACHMENT7: 0x8CE7;
+    readonly COLOR_ATTACHMENT8: 0x8CE8;
+    readonly COLOR_ATTACHMENT9: 0x8CE9;
+    readonly COLOR_ATTACHMENT10: 0x8CEA;
+    readonly COLOR_ATTACHMENT11: 0x8CEB;
+    readonly COLOR_ATTACHMENT12: 0x8CEC;
+    readonly COLOR_ATTACHMENT13: 0x8CED;
+    readonly COLOR_ATTACHMENT14: 0x8CEE;
+    readonly COLOR_ATTACHMENT15: 0x8CEF;
+    readonly FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: 0x8D56;
+    readonly MAX_SAMPLES: 0x8D57;
+    readonly HALF_FLOAT: 0x140B;
+    readonly RG: 0x8227;
+    readonly RG_INTEGER: 0x8228;
+    readonly R8: 0x8229;
+    readonly RG8: 0x822B;
+    readonly R16F: 0x822D;
+    readonly R32F: 0x822E;
+    readonly RG16F: 0x822F;
+    readonly RG32F: 0x8230;
+    readonly R8I: 0x8231;
+    readonly R8UI: 0x8232;
+    readonly R16I: 0x8233;
+    readonly R16UI: 0x8234;
+    readonly R32I: 0x8235;
+    readonly R32UI: 0x8236;
+    readonly RG8I: 0x8237;
+    readonly RG8UI: 0x8238;
+    readonly RG16I: 0x8239;
+    readonly RG16UI: 0x823A;
+    readonly RG32I: 0x823B;
+    readonly RG32UI: 0x823C;
+    readonly VERTEX_ARRAY_BINDING: 0x85B5;
+    readonly R8_SNORM: 0x8F94;
+    readonly RG8_SNORM: 0x8F95;
+    readonly RGB8_SNORM: 0x8F96;
+    readonly RGBA8_SNORM: 0x8F97;
+    readonly SIGNED_NORMALIZED: 0x8F9C;
+    readonly COPY_READ_BUFFER: 0x8F36;
+    readonly COPY_WRITE_BUFFER: 0x8F37;
+    readonly COPY_READ_BUFFER_BINDING: 0x8F36;
+    readonly COPY_WRITE_BUFFER_BINDING: 0x8F37;
+    readonly UNIFORM_BUFFER: 0x8A11;
+    readonly UNIFORM_BUFFER_BINDING: 0x8A28;
+    readonly UNIFORM_BUFFER_START: 0x8A29;
+    readonly UNIFORM_BUFFER_SIZE: 0x8A2A;
+    readonly MAX_VERTEX_UNIFORM_BLOCKS: 0x8A2B;
+    readonly MAX_FRAGMENT_UNIFORM_BLOCKS: 0x8A2D;
+    readonly MAX_COMBINED_UNIFORM_BLOCKS: 0x8A2E;
+    readonly MAX_UNIFORM_BUFFER_BINDINGS: 0x8A2F;
+    readonly MAX_UNIFORM_BLOCK_SIZE: 0x8A30;
+    readonly MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: 0x8A31;
+    readonly MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: 0x8A33;
+    readonly UNIFORM_BUFFER_OFFSET_ALIGNMENT: 0x8A34;
+    readonly ACTIVE_UNIFORM_BLOCKS: 0x8A36;
+    readonly UNIFORM_TYPE: 0x8A37;
+    readonly UNIFORM_SIZE: 0x8A38;
+    readonly UNIFORM_BLOCK_INDEX: 0x8A3A;
+    readonly UNIFORM_OFFSET: 0x8A3B;
+    readonly UNIFORM_ARRAY_STRIDE: 0x8A3C;
+    readonly UNIFORM_MATRIX_STRIDE: 0x8A3D;
+    readonly UNIFORM_IS_ROW_MAJOR: 0x8A3E;
+    readonly UNIFORM_BLOCK_BINDING: 0x8A3F;
+    readonly UNIFORM_BLOCK_DATA_SIZE: 0x8A40;
+    readonly UNIFORM_BLOCK_ACTIVE_UNIFORMS: 0x8A42;
+    readonly UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: 0x8A43;
+    readonly UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: 0x8A44;
+    readonly UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: 0x8A46;
+    readonly INVALID_INDEX: 0xFFFFFFFF;
+    readonly MAX_VERTEX_OUTPUT_COMPONENTS: 0x9122;
+    readonly MAX_FRAGMENT_INPUT_COMPONENTS: 0x9125;
+    readonly MAX_SERVER_WAIT_TIMEOUT: 0x9111;
+    readonly OBJECT_TYPE: 0x9112;
+    readonly SYNC_CONDITION: 0x9113;
+    readonly SYNC_STATUS: 0x9114;
+    readonly SYNC_FLAGS: 0x9115;
+    readonly SYNC_FENCE: 0x9116;
+    readonly SYNC_GPU_COMMANDS_COMPLETE: 0x9117;
+    readonly UNSIGNALED: 0x9118;
+    readonly SIGNALED: 0x9119;
+    readonly ALREADY_SIGNALED: 0x911A;
+    readonly TIMEOUT_EXPIRED: 0x911B;
+    readonly CONDITION_SATISFIED: 0x911C;
+    readonly WAIT_FAILED: 0x911D;
+    readonly SYNC_FLUSH_COMMANDS_BIT: 0x00000001;
+    readonly VERTEX_ATTRIB_ARRAY_DIVISOR: 0x88FE;
+    readonly ANY_SAMPLES_PASSED: 0x8C2F;
+    readonly ANY_SAMPLES_PASSED_CONSERVATIVE: 0x8D6A;
+    readonly SAMPLER_BINDING: 0x8919;
+    readonly RGB10_A2UI: 0x906F;
+    readonly INT_2_10_10_10_REV: 0x8D9F;
+    readonly TRANSFORM_FEEDBACK: 0x8E22;
+    readonly TRANSFORM_FEEDBACK_PAUSED: 0x8E23;
+    readonly TRANSFORM_FEEDBACK_ACTIVE: 0x8E24;
+    readonly TRANSFORM_FEEDBACK_BINDING: 0x8E25;
+    readonly TEXTURE_IMMUTABLE_FORMAT: 0x912F;
+    readonly MAX_ELEMENT_INDEX: 0x8D6B;
+    readonly TEXTURE_IMMUTABLE_LEVELS: 0x82DF;
+    readonly TIMEOUT_IGNORED: -1;
+    readonly MAX_CLIENT_WAIT_TIMEOUT_WEBGL: 0x9247;
+}
+
+interface WebGL2RenderingContextOverloads {
+    bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum): void;
+    bufferData(target: GLenum, srcData: BufferSource | null, usage: GLenum): void;
+    bufferData(target: GLenum, srcData: ArrayBufferView, usage: GLenum, srcOffset: GLuint, length?: GLuint): void;
+    bufferSubData(target: GLenum, dstByteOffset: GLintptr, srcData: BufferSource): void;
+    bufferSubData(target: GLenum, dstByteOffset: GLintptr, srcData: ArrayBufferView, srcOffset: GLuint, length?: GLuint): void;
+    compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, imageSize: GLsizei, offset: GLintptr): void;
+    compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
+    compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, imageSize: GLsizei, offset: GLintptr): void;
+    compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
+    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, dstData: ArrayBufferView | null): void;
+    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, offset: GLintptr): void;
+    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, dstData: ArrayBufferView, dstOffset: GLuint): void;
+    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
+    texImage2D(target: GLenum, level: GLint, internalformat: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
+    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
+    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
+    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint): void;
+    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
+    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
+    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
+    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, source: TexImageSource): void;
+    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint): void;
+    uniform1fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform1iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform2fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform2iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform3fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform3iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform4fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform4iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+}
+
+/** Part of the WebGL API and represents the information returned by calling the WebGLRenderingContext.getActiveAttrib() and WebGLRenderingContext.getActiveUniform() methods. */
+interface WebGLActiveInfo {
+    readonly name: string;
+    readonly size: GLint;
+    readonly type: GLenum;
+}
+
+declare var WebGLActiveInfo: {
+    prototype: WebGLActiveInfo;
+    new(): WebGLActiveInfo;
+};
+
+/** Part of the WebGL API and represents an opaque buffer object storing data such as vertices or colors. */
+interface WebGLBuffer {
+}
+
+declare var WebGLBuffer: {
+    prototype: WebGLBuffer;
+    new(): WebGLBuffer;
+};
+
+/** The WebContextEvent interface is part of the WebGL API and is an interface for an event that is generated in response to a status change to the WebGL rendering context. */
+interface WebGLContextEvent extends Event {
+    readonly statusMessage: string;
+}
+
+declare var WebGLContextEvent: {
+    prototype: WebGLContextEvent;
+    new(type: string, eventInit?: WebGLContextEventInit): WebGLContextEvent;
+};
+
+/** Part of the WebGL API and represents a collection of buffers that serve as a rendering destination. */
+interface WebGLFramebuffer {
+}
+
+declare var WebGLFramebuffer: {
+    prototype: WebGLFramebuffer;
+    new(): WebGLFramebuffer;
+};
+
+/** The WebGLProgram is part of the WebGL API and is a combination of two compiled WebGLShaders consisting of a vertex shader and a fragment shader (both written in GLSL). */
+interface WebGLProgram {
+}
+
+declare var WebGLProgram: {
+    prototype: WebGLProgram;
+    new(): WebGLProgram;
+};
+
+interface WebGLQuery {
+}
+
+declare var WebGLQuery: {
+    prototype: WebGLQuery;
+    new(): WebGLQuery;
+};
+
+/** Part of the WebGL API and represents a buffer that can contain an image, or can be source or target of an rendering operation. */
+interface WebGLRenderbuffer {
+}
+
+declare var WebGLRenderbuffer: {
+    prototype: WebGLRenderbuffer;
+    new(): WebGLRenderbuffer;
+};
+
+/** Provides an interface to the OpenGL ES 2.0 graphics rendering context for the drawing surface of an HTML <canvas> element. */
+interface WebGLRenderingContext extends WebGLRenderingContextBase, WebGLRenderingContextOverloads {
+}
+
+declare var WebGLRenderingContext: {
+    prototype: WebGLRenderingContext;
+    new(): WebGLRenderingContext;
+    readonly DEPTH_BUFFER_BIT: 0x00000100;
+    readonly STENCIL_BUFFER_BIT: 0x00000400;
+    readonly COLOR_BUFFER_BIT: 0x00004000;
+    readonly POINTS: 0x0000;
+    readonly LINES: 0x0001;
+    readonly LINE_LOOP: 0x0002;
+    readonly LINE_STRIP: 0x0003;
+    readonly TRIANGLES: 0x0004;
+    readonly TRIANGLE_STRIP: 0x0005;
+    readonly TRIANGLE_FAN: 0x0006;
+    readonly ZERO: 0;
+    readonly ONE: 1;
+    readonly SRC_COLOR: 0x0300;
+    readonly ONE_MINUS_SRC_COLOR: 0x0301;
+    readonly SRC_ALPHA: 0x0302;
+    readonly ONE_MINUS_SRC_ALPHA: 0x0303;
+    readonly DST_ALPHA: 0x0304;
+    readonly ONE_MINUS_DST_ALPHA: 0x0305;
+    readonly DST_COLOR: 0x0306;
+    readonly ONE_MINUS_DST_COLOR: 0x0307;
+    readonly SRC_ALPHA_SATURATE: 0x0308;
+    readonly FUNC_ADD: 0x8006;
+    readonly BLEND_EQUATION: 0x8009;
+    readonly BLEND_EQUATION_RGB: 0x8009;
+    readonly BLEND_EQUATION_ALPHA: 0x883D;
+    readonly FUNC_SUBTRACT: 0x800A;
+    readonly FUNC_REVERSE_SUBTRACT: 0x800B;
+    readonly BLEND_DST_RGB: 0x80C8;
+    readonly BLEND_SRC_RGB: 0x80C9;
+    readonly BLEND_DST_ALPHA: 0x80CA;
+    readonly BLEND_SRC_ALPHA: 0x80CB;
+    readonly CONSTANT_COLOR: 0x8001;
+    readonly ONE_MINUS_CONSTANT_COLOR: 0x8002;
+    readonly CONSTANT_ALPHA: 0x8003;
+    readonly ONE_MINUS_CONSTANT_ALPHA: 0x8004;
+    readonly BLEND_COLOR: 0x8005;
+    readonly ARRAY_BUFFER: 0x8892;
+    readonly ELEMENT_ARRAY_BUFFER: 0x8893;
+    readonly ARRAY_BUFFER_BINDING: 0x8894;
+    readonly ELEMENT_ARRAY_BUFFER_BINDING: 0x8895;
+    readonly STREAM_DRAW: 0x88E0;
+    readonly STATIC_DRAW: 0x88E4;
+    readonly DYNAMIC_DRAW: 0x88E8;
+    readonly BUFFER_SIZE: 0x8764;
+    readonly BUFFER_USAGE: 0x8765;
+    readonly CURRENT_VERTEX_ATTRIB: 0x8626;
+    readonly FRONT: 0x0404;
+    readonly BACK: 0x0405;
+    readonly FRONT_AND_BACK: 0x0408;
+    readonly CULL_FACE: 0x0B44;
+    readonly BLEND: 0x0BE2;
+    readonly DITHER: 0x0BD0;
+    readonly STENCIL_TEST: 0x0B90;
+    readonly DEPTH_TEST: 0x0B71;
+    readonly SCISSOR_TEST: 0x0C11;
+    readonly POLYGON_OFFSET_FILL: 0x8037;
+    readonly SAMPLE_ALPHA_TO_COVERAGE: 0x809E;
+    readonly SAMPLE_COVERAGE: 0x80A0;
+    readonly NO_ERROR: 0;
+    readonly INVALID_ENUM: 0x0500;
+    readonly INVALID_VALUE: 0x0501;
+    readonly INVALID_OPERATION: 0x0502;
+    readonly OUT_OF_MEMORY: 0x0505;
+    readonly CW: 0x0900;
+    readonly CCW: 0x0901;
+    readonly LINE_WIDTH: 0x0B21;
+    readonly ALIASED_POINT_SIZE_RANGE: 0x846D;
+    readonly ALIASED_LINE_WIDTH_RANGE: 0x846E;
+    readonly CULL_FACE_MODE: 0x0B45;
+    readonly FRONT_FACE: 0x0B46;
+    readonly DEPTH_RANGE: 0x0B70;
+    readonly DEPTH_WRITEMASK: 0x0B72;
+    readonly DEPTH_CLEAR_VALUE: 0x0B73;
+    readonly DEPTH_FUNC: 0x0B74;
+    readonly STENCIL_CLEAR_VALUE: 0x0B91;
+    readonly STENCIL_FUNC: 0x0B92;
+    readonly STENCIL_FAIL: 0x0B94;
+    readonly STENCIL_PASS_DEPTH_FAIL: 0x0B95;
+    readonly STENCIL_PASS_DEPTH_PASS: 0x0B96;
+    readonly STENCIL_REF: 0x0B97;
+    readonly STENCIL_VALUE_MASK: 0x0B93;
+    readonly STENCIL_WRITEMASK: 0x0B98;
+    readonly STENCIL_BACK_FUNC: 0x8800;
+    readonly STENCIL_BACK_FAIL: 0x8801;
+    readonly STENCIL_BACK_PASS_DEPTH_FAIL: 0x8802;
+    readonly STENCIL_BACK_PASS_DEPTH_PASS: 0x8803;
+    readonly STENCIL_BACK_REF: 0x8CA3;
+    readonly STENCIL_BACK_VALUE_MASK: 0x8CA4;
+    readonly STENCIL_BACK_WRITEMASK: 0x8CA5;
+    readonly VIEWPORT: 0x0BA2;
+    readonly SCISSOR_BOX: 0x0C10;
+    readonly COLOR_CLEAR_VALUE: 0x0C22;
+    readonly COLOR_WRITEMASK: 0x0C23;
+    readonly UNPACK_ALIGNMENT: 0x0CF5;
+    readonly PACK_ALIGNMENT: 0x0D05;
+    readonly MAX_TEXTURE_SIZE: 0x0D33;
+    readonly MAX_VIEWPORT_DIMS: 0x0D3A;
+    readonly SUBPIXEL_BITS: 0x0D50;
+    readonly RED_BITS: 0x0D52;
+    readonly GREEN_BITS: 0x0D53;
+    readonly BLUE_BITS: 0x0D54;
+    readonly ALPHA_BITS: 0x0D55;
+    readonly DEPTH_BITS: 0x0D56;
+    readonly STENCIL_BITS: 0x0D57;
+    readonly POLYGON_OFFSET_UNITS: 0x2A00;
+    readonly POLYGON_OFFSET_FACTOR: 0x8038;
+    readonly TEXTURE_BINDING_2D: 0x8069;
+    readonly SAMPLE_BUFFERS: 0x80A8;
+    readonly SAMPLES: 0x80A9;
+    readonly SAMPLE_COVERAGE_VALUE: 0x80AA;
+    readonly SAMPLE_COVERAGE_INVERT: 0x80AB;
+    readonly COMPRESSED_TEXTURE_FORMATS: 0x86A3;
+    readonly DONT_CARE: 0x1100;
+    readonly FASTEST: 0x1101;
+    readonly NICEST: 0x1102;
+    readonly GENERATE_MIPMAP_HINT: 0x8192;
+    readonly BYTE: 0x1400;
+    readonly UNSIGNED_BYTE: 0x1401;
+    readonly SHORT: 0x1402;
+    readonly UNSIGNED_SHORT: 0x1403;
+    readonly INT: 0x1404;
+    readonly UNSIGNED_INT: 0x1405;
+    readonly FLOAT: 0x1406;
+    readonly DEPTH_COMPONENT: 0x1902;
+    readonly ALPHA: 0x1906;
+    readonly RGB: 0x1907;
+    readonly RGBA: 0x1908;
+    readonly LUMINANCE: 0x1909;
+    readonly LUMINANCE_ALPHA: 0x190A;
+    readonly UNSIGNED_SHORT_4_4_4_4: 0x8033;
+    readonly UNSIGNED_SHORT_5_5_5_1: 0x8034;
+    readonly UNSIGNED_SHORT_5_6_5: 0x8363;
+    readonly FRAGMENT_SHADER: 0x8B30;
+    readonly VERTEX_SHADER: 0x8B31;
+    readonly MAX_VERTEX_ATTRIBS: 0x8869;
+    readonly MAX_VERTEX_UNIFORM_VECTORS: 0x8DFB;
+    readonly MAX_VARYING_VECTORS: 0x8DFC;
+    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: 0x8B4D;
+    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: 0x8B4C;
+    readonly MAX_TEXTURE_IMAGE_UNITS: 0x8872;
+    readonly MAX_FRAGMENT_UNIFORM_VECTORS: 0x8DFD;
+    readonly SHADER_TYPE: 0x8B4F;
+    readonly DELETE_STATUS: 0x8B80;
+    readonly LINK_STATUS: 0x8B82;
+    readonly VALIDATE_STATUS: 0x8B83;
+    readonly ATTACHED_SHADERS: 0x8B85;
+    readonly ACTIVE_UNIFORMS: 0x8B86;
+    readonly ACTIVE_ATTRIBUTES: 0x8B89;
+    readonly SHADING_LANGUAGE_VERSION: 0x8B8C;
+    readonly CURRENT_PROGRAM: 0x8B8D;
+    readonly NEVER: 0x0200;
+    readonly LESS: 0x0201;
+    readonly EQUAL: 0x0202;
+    readonly LEQUAL: 0x0203;
+    readonly GREATER: 0x0204;
+    readonly NOTEQUAL: 0x0205;
+    readonly GEQUAL: 0x0206;
+    readonly ALWAYS: 0x0207;
+    readonly KEEP: 0x1E00;
+    readonly REPLACE: 0x1E01;
+    readonly INCR: 0x1E02;
+    readonly DECR: 0x1E03;
+    readonly INVERT: 0x150A;
+    readonly INCR_WRAP: 0x8507;
+    readonly DECR_WRAP: 0x8508;
+    readonly VENDOR: 0x1F00;
+    readonly RENDERER: 0x1F01;
+    readonly VERSION: 0x1F02;
+    readonly NEAREST: 0x2600;
+    readonly LINEAR: 0x2601;
+    readonly NEAREST_MIPMAP_NEAREST: 0x2700;
+    readonly LINEAR_MIPMAP_NEAREST: 0x2701;
+    readonly NEAREST_MIPMAP_LINEAR: 0x2702;
+    readonly LINEAR_MIPMAP_LINEAR: 0x2703;
+    readonly TEXTURE_MAG_FILTER: 0x2800;
+    readonly TEXTURE_MIN_FILTER: 0x2801;
+    readonly TEXTURE_WRAP_S: 0x2802;
+    readonly TEXTURE_WRAP_T: 0x2803;
+    readonly TEXTURE_2D: 0x0DE1;
+    readonly TEXTURE: 0x1702;
+    readonly TEXTURE_CUBE_MAP: 0x8513;
+    readonly TEXTURE_BINDING_CUBE_MAP: 0x8514;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_X: 0x8515;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: 0x8516;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: 0x8517;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: 0x8518;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: 0x8519;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: 0x851A;
+    readonly MAX_CUBE_MAP_TEXTURE_SIZE: 0x851C;
+    readonly TEXTURE0: 0x84C0;
+    readonly TEXTURE1: 0x84C1;
+    readonly TEXTURE2: 0x84C2;
+    readonly TEXTURE3: 0x84C3;
+    readonly TEXTURE4: 0x84C4;
+    readonly TEXTURE5: 0x84C5;
+    readonly TEXTURE6: 0x84C6;
+    readonly TEXTURE7: 0x84C7;
+    readonly TEXTURE8: 0x84C8;
+    readonly TEXTURE9: 0x84C9;
+    readonly TEXTURE10: 0x84CA;
+    readonly TEXTURE11: 0x84CB;
+    readonly TEXTURE12: 0x84CC;
+    readonly TEXTURE13: 0x84CD;
+    readonly TEXTURE14: 0x84CE;
+    readonly TEXTURE15: 0x84CF;
+    readonly TEXTURE16: 0x84D0;
+    readonly TEXTURE17: 0x84D1;
+    readonly TEXTURE18: 0x84D2;
+    readonly TEXTURE19: 0x84D3;
+    readonly TEXTURE20: 0x84D4;
+    readonly TEXTURE21: 0x84D5;
+    readonly TEXTURE22: 0x84D6;
+    readonly TEXTURE23: 0x84D7;
+    readonly TEXTURE24: 0x84D8;
+    readonly TEXTURE25: 0x84D9;
+    readonly TEXTURE26: 0x84DA;
+    readonly TEXTURE27: 0x84DB;
+    readonly TEXTURE28: 0x84DC;
+    readonly TEXTURE29: 0x84DD;
+    readonly TEXTURE30: 0x84DE;
+    readonly TEXTURE31: 0x84DF;
+    readonly ACTIVE_TEXTURE: 0x84E0;
+    readonly REPEAT: 0x2901;
+    readonly CLAMP_TO_EDGE: 0x812F;
+    readonly MIRRORED_REPEAT: 0x8370;
+    readonly FLOAT_VEC2: 0x8B50;
+    readonly FLOAT_VEC3: 0x8B51;
+    readonly FLOAT_VEC4: 0x8B52;
+    readonly INT_VEC2: 0x8B53;
+    readonly INT_VEC3: 0x8B54;
+    readonly INT_VEC4: 0x8B55;
+    readonly BOOL: 0x8B56;
+    readonly BOOL_VEC2: 0x8B57;
+    readonly BOOL_VEC3: 0x8B58;
+    readonly BOOL_VEC4: 0x8B59;
+    readonly FLOAT_MAT2: 0x8B5A;
+    readonly FLOAT_MAT3: 0x8B5B;
+    readonly FLOAT_MAT4: 0x8B5C;
+    readonly SAMPLER_2D: 0x8B5E;
+    readonly SAMPLER_CUBE: 0x8B60;
+    readonly VERTEX_ATTRIB_ARRAY_ENABLED: 0x8622;
+    readonly VERTEX_ATTRIB_ARRAY_SIZE: 0x8623;
+    readonly VERTEX_ATTRIB_ARRAY_STRIDE: 0x8624;
+    readonly VERTEX_ATTRIB_ARRAY_TYPE: 0x8625;
+    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: 0x886A;
+    readonly VERTEX_ATTRIB_ARRAY_POINTER: 0x8645;
+    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 0x889F;
+    readonly IMPLEMENTATION_COLOR_READ_TYPE: 0x8B9A;
+    readonly IMPLEMENTATION_COLOR_READ_FORMAT: 0x8B9B;
+    readonly COMPILE_STATUS: 0x8B81;
+    readonly LOW_FLOAT: 0x8DF0;
+    readonly MEDIUM_FLOAT: 0x8DF1;
+    readonly HIGH_FLOAT: 0x8DF2;
+    readonly LOW_INT: 0x8DF3;
+    readonly MEDIUM_INT: 0x8DF4;
+    readonly HIGH_INT: 0x8DF5;
+    readonly FRAMEBUFFER: 0x8D40;
+    readonly RENDERBUFFER: 0x8D41;
+    readonly RGBA4: 0x8056;
+    readonly RGB5_A1: 0x8057;
+    readonly RGB565: 0x8D62;
+    readonly DEPTH_COMPONENT16: 0x81A5;
+    readonly STENCIL_INDEX8: 0x8D48;
+    readonly DEPTH_STENCIL: 0x84F9;
+    readonly RENDERBUFFER_WIDTH: 0x8D42;
+    readonly RENDERBUFFER_HEIGHT: 0x8D43;
+    readonly RENDERBUFFER_INTERNAL_FORMAT: 0x8D44;
+    readonly RENDERBUFFER_RED_SIZE: 0x8D50;
+    readonly RENDERBUFFER_GREEN_SIZE: 0x8D51;
+    readonly RENDERBUFFER_BLUE_SIZE: 0x8D52;
+    readonly RENDERBUFFER_ALPHA_SIZE: 0x8D53;
+    readonly RENDERBUFFER_DEPTH_SIZE: 0x8D54;
+    readonly RENDERBUFFER_STENCIL_SIZE: 0x8D55;
+    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 0x8CD0;
+    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 0x8CD1;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 0x8CD2;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 0x8CD3;
+    readonly COLOR_ATTACHMENT0: 0x8CE0;
+    readonly DEPTH_ATTACHMENT: 0x8D00;
+    readonly STENCIL_ATTACHMENT: 0x8D20;
+    readonly DEPTH_STENCIL_ATTACHMENT: 0x821A;
+    readonly NONE: 0;
+    readonly FRAMEBUFFER_COMPLETE: 0x8CD5;
+    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 0x8CD6;
+    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 0x8CD7;
+    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 0x8CD9;
+    readonly FRAMEBUFFER_UNSUPPORTED: 0x8CDD;
+    readonly FRAMEBUFFER_BINDING: 0x8CA6;
+    readonly RENDERBUFFER_BINDING: 0x8CA7;
+    readonly MAX_RENDERBUFFER_SIZE: 0x84E8;
+    readonly INVALID_FRAMEBUFFER_OPERATION: 0x0506;
+    readonly UNPACK_FLIP_Y_WEBGL: 0x9240;
+    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: 0x9241;
+    readonly CONTEXT_LOST_WEBGL: 0x9242;
+    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: 0x9243;
+    readonly BROWSER_DEFAULT_WEBGL: 0x9244;
+};
+
+interface WebGLRenderingContextBase {
+    readonly canvas: HTMLCanvasElement | OffscreenCanvas;
+    readonly drawingBufferHeight: GLsizei;
+    readonly drawingBufferWidth: GLsizei;
+    activeTexture(texture: GLenum): void;
+    attachShader(program: WebGLProgram, shader: WebGLShader): void;
+    bindAttribLocation(program: WebGLProgram, index: GLuint, name: string): void;
+    bindBuffer(target: GLenum, buffer: WebGLBuffer | null): void;
+    bindFramebuffer(target: GLenum, framebuffer: WebGLFramebuffer | null): void;
+    bindRenderbuffer(target: GLenum, renderbuffer: WebGLRenderbuffer | null): void;
+    bindTexture(target: GLenum, texture: WebGLTexture | null): void;
+    blendColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf): void;
+    blendEquation(mode: GLenum): void;
+    blendEquationSeparate(modeRGB: GLenum, modeAlpha: GLenum): void;
+    blendFunc(sfactor: GLenum, dfactor: GLenum): void;
+    blendFuncSeparate(srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum): void;
+    checkFramebufferStatus(target: GLenum): GLenum;
+    clear(mask: GLbitfield): void;
+    clearColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf): void;
+    clearDepth(depth: GLclampf): void;
+    clearStencil(s: GLint): void;
+    colorMask(red: GLboolean, green: GLboolean, blue: GLboolean, alpha: GLboolean): void;
+    compileShader(shader: WebGLShader): void;
+    copyTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei, border: GLint): void;
+    copyTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
+    createBuffer(): WebGLBuffer | null;
+    createFramebuffer(): WebGLFramebuffer | null;
+    createProgram(): WebGLProgram | null;
+    createRenderbuffer(): WebGLRenderbuffer | null;
+    createShader(type: GLenum): WebGLShader | null;
+    createTexture(): WebGLTexture | null;
+    cullFace(mode: GLenum): void;
+    deleteBuffer(buffer: WebGLBuffer | null): void;
+    deleteFramebuffer(framebuffer: WebGLFramebuffer | null): void;
+    deleteProgram(program: WebGLProgram | null): void;
+    deleteRenderbuffer(renderbuffer: WebGLRenderbuffer | null): void;
+    deleteShader(shader: WebGLShader | null): void;
+    deleteTexture(texture: WebGLTexture | null): void;
+    depthFunc(func: GLenum): void;
+    depthMask(flag: GLboolean): void;
+    depthRange(zNear: GLclampf, zFar: GLclampf): void;
+    detachShader(program: WebGLProgram, shader: WebGLShader): void;
+    disable(cap: GLenum): void;
+    disableVertexAttribArray(index: GLuint): void;
+    drawArrays(mode: GLenum, first: GLint, count: GLsizei): void;
+    drawElements(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr): void;
+    enable(cap: GLenum): void;
+    enableVertexAttribArray(index: GLuint): void;
+    finish(): void;
+    flush(): void;
+    framebufferRenderbuffer(target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: WebGLRenderbuffer | null): void;
+    framebufferTexture2D(target: GLenum, attachment: GLenum, textarget: GLenum, texture: WebGLTexture | null, level: GLint): void;
+    frontFace(mode: GLenum): void;
+    generateMipmap(target: GLenum): void;
+    getActiveAttrib(program: WebGLProgram, index: GLuint): WebGLActiveInfo | null;
+    getActiveUniform(program: WebGLProgram, index: GLuint): WebGLActiveInfo | null;
+    getAttachedShaders(program: WebGLProgram): WebGLShader[] | null;
+    getAttribLocation(program: WebGLProgram, name: string): GLint;
+    getBufferParameter(target: GLenum, pname: GLenum): any;
+    getContextAttributes(): WebGLContextAttributes | null;
+    getError(): GLenum;
+    getExtension(extensionName: "ANGLE_instanced_arrays"): ANGLE_instanced_arrays | null;
+    getExtension(extensionName: "EXT_blend_minmax"): EXT_blend_minmax | null;
+    getExtension(extensionName: "EXT_color_buffer_float"): EXT_color_buffer_float | null;
+    getExtension(extensionName: "EXT_color_buffer_half_float"): EXT_color_buffer_half_float | null;
+    getExtension(extensionName: "EXT_float_blend"): EXT_float_blend | null;
+    getExtension(extensionName: "EXT_frag_depth"): EXT_frag_depth | null;
+    getExtension(extensionName: "EXT_sRGB"): EXT_sRGB | null;
+    getExtension(extensionName: "EXT_shader_texture_lod"): EXT_shader_texture_lod | null;
+    getExtension(extensionName: "EXT_texture_compression_bptc"): EXT_texture_compression_bptc | null;
+    getExtension(extensionName: "EXT_texture_compression_rgtc"): EXT_texture_compression_rgtc | null;
+    getExtension(extensionName: "EXT_texture_filter_anisotropic"): EXT_texture_filter_anisotropic | null;
+    getExtension(extensionName: "KHR_parallel_shader_compile"): KHR_parallel_shader_compile | null;
+    getExtension(extensionName: "OES_element_index_uint"): OES_element_index_uint | null;
+    getExtension(extensionName: "OES_fbo_render_mipmap"): OES_fbo_render_mipmap | null;
+    getExtension(extensionName: "OES_standard_derivatives"): OES_standard_derivatives | null;
+    getExtension(extensionName: "OES_texture_float"): OES_texture_float | null;
+    getExtension(extensionName: "OES_texture_float_linear"): OES_texture_float_linear | null;
+    getExtension(extensionName: "OES_texture_half_float"): OES_texture_half_float | null;
+    getExtension(extensionName: "OES_texture_half_float_linear"): OES_texture_half_float_linear | null;
+    getExtension(extensionName: "OES_vertex_array_object"): OES_vertex_array_object | null;
+    getExtension(extensionName: "OVR_multiview2"): OVR_multiview2 | null;
+    getExtension(extensionName: "WEBGL_color_buffer_float"): WEBGL_color_buffer_float | null;
+    getExtension(extensionName: "WEBGL_compressed_texture_astc"): WEBGL_compressed_texture_astc | null;
+    getExtension(extensionName: "WEBGL_compressed_texture_etc"): WEBGL_compressed_texture_etc | null;
+    getExtension(extensionName: "WEBGL_compressed_texture_etc1"): WEBGL_compressed_texture_etc1 | null;
+    getExtension(extensionName: "WEBGL_compressed_texture_s3tc"): WEBGL_compressed_texture_s3tc | null;
+    getExtension(extensionName: "WEBGL_compressed_texture_s3tc_srgb"): WEBGL_compressed_texture_s3tc_srgb | null;
+    getExtension(extensionName: "WEBGL_debug_renderer_info"): WEBGL_debug_renderer_info | null;
+    getExtension(extensionName: "WEBGL_debug_shaders"): WEBGL_debug_shaders | null;
+    getExtension(extensionName: "WEBGL_depth_texture"): WEBGL_depth_texture | null;
+    getExtension(extensionName: "WEBGL_draw_buffers"): WEBGL_draw_buffers | null;
+    getExtension(extensionName: "WEBGL_lose_context"): WEBGL_lose_context | null;
+    getExtension(extensionName: "WEBGL_multi_draw"): WEBGL_multi_draw | null;
+    getExtension(name: string): any;
+    getFramebufferAttachmentParameter(target: GLenum, attachment: GLenum, pname: GLenum): any;
+    getParameter(pname: GLenum): any;
+    getProgramInfoLog(program: WebGLProgram): string | null;
+    getProgramParameter(program: WebGLProgram, pname: GLenum): any;
+    getRenderbufferParameter(target: GLenum, pname: GLenum): any;
+    getShaderInfoLog(shader: WebGLShader): string | null;
+    getShaderParameter(shader: WebGLShader, pname: GLenum): any;
+    getShaderPrecisionFormat(shadertype: GLenum, precisiontype: GLenum): WebGLShaderPrecisionFormat | null;
+    getShaderSource(shader: WebGLShader): string | null;
+    getSupportedExtensions(): string[] | null;
+    getTexParameter(target: GLenum, pname: GLenum): any;
+    getUniform(program: WebGLProgram, location: WebGLUniformLocation): any;
+    getUniformLocation(program: WebGLProgram, name: string): WebGLUniformLocation | null;
+    getVertexAttrib(index: GLuint, pname: GLenum): any;
+    getVertexAttribOffset(index: GLuint, pname: GLenum): GLintptr;
+    hint(target: GLenum, mode: GLenum): void;
+    isBuffer(buffer: WebGLBuffer | null): GLboolean;
+    isContextLost(): boolean;
+    isEnabled(cap: GLenum): GLboolean;
+    isFramebuffer(framebuffer: WebGLFramebuffer | null): GLboolean;
+    isProgram(program: WebGLProgram | null): GLboolean;
+    isRenderbuffer(renderbuffer: WebGLRenderbuffer | null): GLboolean;
+    isShader(shader: WebGLShader | null): GLboolean;
+    isTexture(texture: WebGLTexture | null): GLboolean;
+    lineWidth(width: GLfloat): void;
+    linkProgram(program: WebGLProgram): void;
+    pixelStorei(pname: GLenum, param: GLint | GLboolean): void;
+    polygonOffset(factor: GLfloat, units: GLfloat): void;
+    renderbufferStorage(target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei): void;
+    sampleCoverage(value: GLclampf, invert: GLboolean): void;
+    scissor(x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
+    shaderSource(shader: WebGLShader, source: string): void;
+    stencilFunc(func: GLenum, ref: GLint, mask: GLuint): void;
+    stencilFuncSeparate(face: GLenum, func: GLenum, ref: GLint, mask: GLuint): void;
+    stencilMask(mask: GLuint): void;
+    stencilMaskSeparate(face: GLenum, mask: GLuint): void;
+    stencilOp(fail: GLenum, zfail: GLenum, zpass: GLenum): void;
+    stencilOpSeparate(face: GLenum, fail: GLenum, zfail: GLenum, zpass: GLenum): void;
+    texParameterf(target: GLenum, pname: GLenum, param: GLfloat): void;
+    texParameteri(target: GLenum, pname: GLenum, param: GLint): void;
+    uniform1f(location: WebGLUniformLocation | null, x: GLfloat): void;
+    uniform1i(location: WebGLUniformLocation | null, x: GLint): void;
+    uniform2f(location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat): void;
+    uniform2i(location: WebGLUniformLocation | null, x: GLint, y: GLint): void;
+    uniform3f(location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat, z: GLfloat): void;
+    uniform3i(location: WebGLUniformLocation | null, x: GLint, y: GLint, z: GLint): void;
+    uniform4f(location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat): void;
+    uniform4i(location: WebGLUniformLocation | null, x: GLint, y: GLint, z: GLint, w: GLint): void;
+    useProgram(program: WebGLProgram | null): void;
+    validateProgram(program: WebGLProgram): void;
+    vertexAttrib1f(index: GLuint, x: GLfloat): void;
+    vertexAttrib1fv(index: GLuint, values: Float32List): void;
+    vertexAttrib2f(index: GLuint, x: GLfloat, y: GLfloat): void;
+    vertexAttrib2fv(index: GLuint, values: Float32List): void;
+    vertexAttrib3f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat): void;
+    vertexAttrib3fv(index: GLuint, values: Float32List): void;
+    vertexAttrib4f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat): void;
+    vertexAttrib4fv(index: GLuint, values: Float32List): void;
+    vertexAttribPointer(index: GLuint, size: GLint, type: GLenum, normalized: GLboolean, stride: GLsizei, offset: GLintptr): void;
+    viewport(x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
+    readonly DEPTH_BUFFER_BIT: 0x00000100;
+    readonly STENCIL_BUFFER_BIT: 0x00000400;
+    readonly COLOR_BUFFER_BIT: 0x00004000;
+    readonly POINTS: 0x0000;
+    readonly LINES: 0x0001;
+    readonly LINE_LOOP: 0x0002;
+    readonly LINE_STRIP: 0x0003;
+    readonly TRIANGLES: 0x0004;
+    readonly TRIANGLE_STRIP: 0x0005;
+    readonly TRIANGLE_FAN: 0x0006;
+    readonly ZERO: 0;
+    readonly ONE: 1;
+    readonly SRC_COLOR: 0x0300;
+    readonly ONE_MINUS_SRC_COLOR: 0x0301;
+    readonly SRC_ALPHA: 0x0302;
+    readonly ONE_MINUS_SRC_ALPHA: 0x0303;
+    readonly DST_ALPHA: 0x0304;
+    readonly ONE_MINUS_DST_ALPHA: 0x0305;
+    readonly DST_COLOR: 0x0306;
+    readonly ONE_MINUS_DST_COLOR: 0x0307;
+    readonly SRC_ALPHA_SATURATE: 0x0308;
+    readonly FUNC_ADD: 0x8006;
+    readonly BLEND_EQUATION: 0x8009;
+    readonly BLEND_EQUATION_RGB: 0x8009;
+    readonly BLEND_EQUATION_ALPHA: 0x883D;
+    readonly FUNC_SUBTRACT: 0x800A;
+    readonly FUNC_REVERSE_SUBTRACT: 0x800B;
+    readonly BLEND_DST_RGB: 0x80C8;
+    readonly BLEND_SRC_RGB: 0x80C9;
+    readonly BLEND_DST_ALPHA: 0x80CA;
+    readonly BLEND_SRC_ALPHA: 0x80CB;
+    readonly CONSTANT_COLOR: 0x8001;
+    readonly ONE_MINUS_CONSTANT_COLOR: 0x8002;
+    readonly CONSTANT_ALPHA: 0x8003;
+    readonly ONE_MINUS_CONSTANT_ALPHA: 0x8004;
+    readonly BLEND_COLOR: 0x8005;
+    readonly ARRAY_BUFFER: 0x8892;
+    readonly ELEMENT_ARRAY_BUFFER: 0x8893;
+    readonly ARRAY_BUFFER_BINDING: 0x8894;
+    readonly ELEMENT_ARRAY_BUFFER_BINDING: 0x8895;
+    readonly STREAM_DRAW: 0x88E0;
+    readonly STATIC_DRAW: 0x88E4;
+    readonly DYNAMIC_DRAW: 0x88E8;
+    readonly BUFFER_SIZE: 0x8764;
+    readonly BUFFER_USAGE: 0x8765;
+    readonly CURRENT_VERTEX_ATTRIB: 0x8626;
+    readonly FRONT: 0x0404;
+    readonly BACK: 0x0405;
+    readonly FRONT_AND_BACK: 0x0408;
+    readonly CULL_FACE: 0x0B44;
+    readonly BLEND: 0x0BE2;
+    readonly DITHER: 0x0BD0;
+    readonly STENCIL_TEST: 0x0B90;
+    readonly DEPTH_TEST: 0x0B71;
+    readonly SCISSOR_TEST: 0x0C11;
+    readonly POLYGON_OFFSET_FILL: 0x8037;
+    readonly SAMPLE_ALPHA_TO_COVERAGE: 0x809E;
+    readonly SAMPLE_COVERAGE: 0x80A0;
+    readonly NO_ERROR: 0;
+    readonly INVALID_ENUM: 0x0500;
+    readonly INVALID_VALUE: 0x0501;
+    readonly INVALID_OPERATION: 0x0502;
+    readonly OUT_OF_MEMORY: 0x0505;
+    readonly CW: 0x0900;
+    readonly CCW: 0x0901;
+    readonly LINE_WIDTH: 0x0B21;
+    readonly ALIASED_POINT_SIZE_RANGE: 0x846D;
+    readonly ALIASED_LINE_WIDTH_RANGE: 0x846E;
+    readonly CULL_FACE_MODE: 0x0B45;
+    readonly FRONT_FACE: 0x0B46;
+    readonly DEPTH_RANGE: 0x0B70;
+    readonly DEPTH_WRITEMASK: 0x0B72;
+    readonly DEPTH_CLEAR_VALUE: 0x0B73;
+    readonly DEPTH_FUNC: 0x0B74;
+    readonly STENCIL_CLEAR_VALUE: 0x0B91;
+    readonly STENCIL_FUNC: 0x0B92;
+    readonly STENCIL_FAIL: 0x0B94;
+    readonly STENCIL_PASS_DEPTH_FAIL: 0x0B95;
+    readonly STENCIL_PASS_DEPTH_PASS: 0x0B96;
+    readonly STENCIL_REF: 0x0B97;
+    readonly STENCIL_VALUE_MASK: 0x0B93;
+    readonly STENCIL_WRITEMASK: 0x0B98;
+    readonly STENCIL_BACK_FUNC: 0x8800;
+    readonly STENCIL_BACK_FAIL: 0x8801;
+    readonly STENCIL_BACK_PASS_DEPTH_FAIL: 0x8802;
+    readonly STENCIL_BACK_PASS_DEPTH_PASS: 0x8803;
+    readonly STENCIL_BACK_REF: 0x8CA3;
+    readonly STENCIL_BACK_VALUE_MASK: 0x8CA4;
+    readonly STENCIL_BACK_WRITEMASK: 0x8CA5;
+    readonly VIEWPORT: 0x0BA2;
+    readonly SCISSOR_BOX: 0x0C10;
+    readonly COLOR_CLEAR_VALUE: 0x0C22;
+    readonly COLOR_WRITEMASK: 0x0C23;
+    readonly UNPACK_ALIGNMENT: 0x0CF5;
+    readonly PACK_ALIGNMENT: 0x0D05;
+    readonly MAX_TEXTURE_SIZE: 0x0D33;
+    readonly MAX_VIEWPORT_DIMS: 0x0D3A;
+    readonly SUBPIXEL_BITS: 0x0D50;
+    readonly RED_BITS: 0x0D52;
+    readonly GREEN_BITS: 0x0D53;
+    readonly BLUE_BITS: 0x0D54;
+    readonly ALPHA_BITS: 0x0D55;
+    readonly DEPTH_BITS: 0x0D56;
+    readonly STENCIL_BITS: 0x0D57;
+    readonly POLYGON_OFFSET_UNITS: 0x2A00;
+    readonly POLYGON_OFFSET_FACTOR: 0x8038;
+    readonly TEXTURE_BINDING_2D: 0x8069;
+    readonly SAMPLE_BUFFERS: 0x80A8;
+    readonly SAMPLES: 0x80A9;
+    readonly SAMPLE_COVERAGE_VALUE: 0x80AA;
+    readonly SAMPLE_COVERAGE_INVERT: 0x80AB;
+    readonly COMPRESSED_TEXTURE_FORMATS: 0x86A3;
+    readonly DONT_CARE: 0x1100;
+    readonly FASTEST: 0x1101;
+    readonly NICEST: 0x1102;
+    readonly GENERATE_MIPMAP_HINT: 0x8192;
+    readonly BYTE: 0x1400;
+    readonly UNSIGNED_BYTE: 0x1401;
+    readonly SHORT: 0x1402;
+    readonly UNSIGNED_SHORT: 0x1403;
+    readonly INT: 0x1404;
+    readonly UNSIGNED_INT: 0x1405;
+    readonly FLOAT: 0x1406;
+    readonly DEPTH_COMPONENT: 0x1902;
+    readonly ALPHA: 0x1906;
+    readonly RGB: 0x1907;
+    readonly RGBA: 0x1908;
+    readonly LUMINANCE: 0x1909;
+    readonly LUMINANCE_ALPHA: 0x190A;
+    readonly UNSIGNED_SHORT_4_4_4_4: 0x8033;
+    readonly UNSIGNED_SHORT_5_5_5_1: 0x8034;
+    readonly UNSIGNED_SHORT_5_6_5: 0x8363;
+    readonly FRAGMENT_SHADER: 0x8B30;
+    readonly VERTEX_SHADER: 0x8B31;
+    readonly MAX_VERTEX_ATTRIBS: 0x8869;
+    readonly MAX_VERTEX_UNIFORM_VECTORS: 0x8DFB;
+    readonly MAX_VARYING_VECTORS: 0x8DFC;
+    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: 0x8B4D;
+    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: 0x8B4C;
+    readonly MAX_TEXTURE_IMAGE_UNITS: 0x8872;
+    readonly MAX_FRAGMENT_UNIFORM_VECTORS: 0x8DFD;
+    readonly SHADER_TYPE: 0x8B4F;
+    readonly DELETE_STATUS: 0x8B80;
+    readonly LINK_STATUS: 0x8B82;
+    readonly VALIDATE_STATUS: 0x8B83;
+    readonly ATTACHED_SHADERS: 0x8B85;
+    readonly ACTIVE_UNIFORMS: 0x8B86;
+    readonly ACTIVE_ATTRIBUTES: 0x8B89;
+    readonly SHADING_LANGUAGE_VERSION: 0x8B8C;
+    readonly CURRENT_PROGRAM: 0x8B8D;
+    readonly NEVER: 0x0200;
+    readonly LESS: 0x0201;
+    readonly EQUAL: 0x0202;
+    readonly LEQUAL: 0x0203;
+    readonly GREATER: 0x0204;
+    readonly NOTEQUAL: 0x0205;
+    readonly GEQUAL: 0x0206;
+    readonly ALWAYS: 0x0207;
+    readonly KEEP: 0x1E00;
+    readonly REPLACE: 0x1E01;
+    readonly INCR: 0x1E02;
+    readonly DECR: 0x1E03;
+    readonly INVERT: 0x150A;
+    readonly INCR_WRAP: 0x8507;
+    readonly DECR_WRAP: 0x8508;
+    readonly VENDOR: 0x1F00;
+    readonly RENDERER: 0x1F01;
+    readonly VERSION: 0x1F02;
+    readonly NEAREST: 0x2600;
+    readonly LINEAR: 0x2601;
+    readonly NEAREST_MIPMAP_NEAREST: 0x2700;
+    readonly LINEAR_MIPMAP_NEAREST: 0x2701;
+    readonly NEAREST_MIPMAP_LINEAR: 0x2702;
+    readonly LINEAR_MIPMAP_LINEAR: 0x2703;
+    readonly TEXTURE_MAG_FILTER: 0x2800;
+    readonly TEXTURE_MIN_FILTER: 0x2801;
+    readonly TEXTURE_WRAP_S: 0x2802;
+    readonly TEXTURE_WRAP_T: 0x2803;
+    readonly TEXTURE_2D: 0x0DE1;
+    readonly TEXTURE: 0x1702;
+    readonly TEXTURE_CUBE_MAP: 0x8513;
+    readonly TEXTURE_BINDING_CUBE_MAP: 0x8514;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_X: 0x8515;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: 0x8516;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: 0x8517;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: 0x8518;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: 0x8519;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: 0x851A;
+    readonly MAX_CUBE_MAP_TEXTURE_SIZE: 0x851C;
+    readonly TEXTURE0: 0x84C0;
+    readonly TEXTURE1: 0x84C1;
+    readonly TEXTURE2: 0x84C2;
+    readonly TEXTURE3: 0x84C3;
+    readonly TEXTURE4: 0x84C4;
+    readonly TEXTURE5: 0x84C5;
+    readonly TEXTURE6: 0x84C6;
+    readonly TEXTURE7: 0x84C7;
+    readonly TEXTURE8: 0x84C8;
+    readonly TEXTURE9: 0x84C9;
+    readonly TEXTURE10: 0x84CA;
+    readonly TEXTURE11: 0x84CB;
+    readonly TEXTURE12: 0x84CC;
+    readonly TEXTURE13: 0x84CD;
+    readonly TEXTURE14: 0x84CE;
+    readonly TEXTURE15: 0x84CF;
+    readonly TEXTURE16: 0x84D0;
+    readonly TEXTURE17: 0x84D1;
+    readonly TEXTURE18: 0x84D2;
+    readonly TEXTURE19: 0x84D3;
+    readonly TEXTURE20: 0x84D4;
+    readonly TEXTURE21: 0x84D5;
+    readonly TEXTURE22: 0x84D6;
+    readonly TEXTURE23: 0x84D7;
+    readonly TEXTURE24: 0x84D8;
+    readonly TEXTURE25: 0x84D9;
+    readonly TEXTURE26: 0x84DA;
+    readonly TEXTURE27: 0x84DB;
+    readonly TEXTURE28: 0x84DC;
+    readonly TEXTURE29: 0x84DD;
+    readonly TEXTURE30: 0x84DE;
+    readonly TEXTURE31: 0x84DF;
+    readonly ACTIVE_TEXTURE: 0x84E0;
+    readonly REPEAT: 0x2901;
+    readonly CLAMP_TO_EDGE: 0x812F;
+    readonly MIRRORED_REPEAT: 0x8370;
+    readonly FLOAT_VEC2: 0x8B50;
+    readonly FLOAT_VEC3: 0x8B51;
+    readonly FLOAT_VEC4: 0x8B52;
+    readonly INT_VEC2: 0x8B53;
+    readonly INT_VEC3: 0x8B54;
+    readonly INT_VEC4: 0x8B55;
+    readonly BOOL: 0x8B56;
+    readonly BOOL_VEC2: 0x8B57;
+    readonly BOOL_VEC3: 0x8B58;
+    readonly BOOL_VEC4: 0x8B59;
+    readonly FLOAT_MAT2: 0x8B5A;
+    readonly FLOAT_MAT3: 0x8B5B;
+    readonly FLOAT_MAT4: 0x8B5C;
+    readonly SAMPLER_2D: 0x8B5E;
+    readonly SAMPLER_CUBE: 0x8B60;
+    readonly VERTEX_ATTRIB_ARRAY_ENABLED: 0x8622;
+    readonly VERTEX_ATTRIB_ARRAY_SIZE: 0x8623;
+    readonly VERTEX_ATTRIB_ARRAY_STRIDE: 0x8624;
+    readonly VERTEX_ATTRIB_ARRAY_TYPE: 0x8625;
+    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: 0x886A;
+    readonly VERTEX_ATTRIB_ARRAY_POINTER: 0x8645;
+    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 0x889F;
+    readonly IMPLEMENTATION_COLOR_READ_TYPE: 0x8B9A;
+    readonly IMPLEMENTATION_COLOR_READ_FORMAT: 0x8B9B;
+    readonly COMPILE_STATUS: 0x8B81;
+    readonly LOW_FLOAT: 0x8DF0;
+    readonly MEDIUM_FLOAT: 0x8DF1;
+    readonly HIGH_FLOAT: 0x8DF2;
+    readonly LOW_INT: 0x8DF3;
+    readonly MEDIUM_INT: 0x8DF4;
+    readonly HIGH_INT: 0x8DF5;
+    readonly FRAMEBUFFER: 0x8D40;
+    readonly RENDERBUFFER: 0x8D41;
+    readonly RGBA4: 0x8056;
+    readonly RGB5_A1: 0x8057;
+    readonly RGB565: 0x8D62;
+    readonly DEPTH_COMPONENT16: 0x81A5;
+    readonly STENCIL_INDEX8: 0x8D48;
+    readonly DEPTH_STENCIL: 0x84F9;
+    readonly RENDERBUFFER_WIDTH: 0x8D42;
+    readonly RENDERBUFFER_HEIGHT: 0x8D43;
+    readonly RENDERBUFFER_INTERNAL_FORMAT: 0x8D44;
+    readonly RENDERBUFFER_RED_SIZE: 0x8D50;
+    readonly RENDERBUFFER_GREEN_SIZE: 0x8D51;
+    readonly RENDERBUFFER_BLUE_SIZE: 0x8D52;
+    readonly RENDERBUFFER_ALPHA_SIZE: 0x8D53;
+    readonly RENDERBUFFER_DEPTH_SIZE: 0x8D54;
+    readonly RENDERBUFFER_STENCIL_SIZE: 0x8D55;
+    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 0x8CD0;
+    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 0x8CD1;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 0x8CD2;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 0x8CD3;
+    readonly COLOR_ATTACHMENT0: 0x8CE0;
+    readonly DEPTH_ATTACHMENT: 0x8D00;
+    readonly STENCIL_ATTACHMENT: 0x8D20;
+    readonly DEPTH_STENCIL_ATTACHMENT: 0x821A;
+    readonly NONE: 0;
+    readonly FRAMEBUFFER_COMPLETE: 0x8CD5;
+    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 0x8CD6;
+    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 0x8CD7;
+    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 0x8CD9;
+    readonly FRAMEBUFFER_UNSUPPORTED: 0x8CDD;
+    readonly FRAMEBUFFER_BINDING: 0x8CA6;
+    readonly RENDERBUFFER_BINDING: 0x8CA7;
+    readonly MAX_RENDERBUFFER_SIZE: 0x84E8;
+    readonly INVALID_FRAMEBUFFER_OPERATION: 0x0506;
+    readonly UNPACK_FLIP_Y_WEBGL: 0x9240;
+    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: 0x9241;
+    readonly CONTEXT_LOST_WEBGL: 0x9242;
+    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: 0x9243;
+    readonly BROWSER_DEFAULT_WEBGL: 0x9244;
+}
+
+interface WebGLRenderingContextOverloads {
+    bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum): void;
+    bufferData(target: GLenum, data: BufferSource | null, usage: GLenum): void;
+    bufferSubData(target: GLenum, offset: GLintptr, data: BufferSource): void;
+    compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, data: ArrayBufferView): void;
+    compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, data: ArrayBufferView): void;
+    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
+    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
+    texImage2D(target: GLenum, level: GLint, internalformat: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
+    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
+    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
+    uniform1fv(location: WebGLUniformLocation | null, v: Float32List): void;
+    uniform1iv(location: WebGLUniformLocation | null, v: Int32List): void;
+    uniform2fv(location: WebGLUniformLocation | null, v: Float32List): void;
+    uniform2iv(location: WebGLUniformLocation | null, v: Int32List): void;
+    uniform3fv(location: WebGLUniformLocation | null, v: Float32List): void;
+    uniform3iv(location: WebGLUniformLocation | null, v: Int32List): void;
+    uniform4fv(location: WebGLUniformLocation | null, v: Float32List): void;
+    uniform4iv(location: WebGLUniformLocation | null, v: Int32List): void;
+    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Float32List): void;
+    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Float32List): void;
+    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Float32List): void;
+}
+
+interface WebGLSampler {
+}
+
+declare var WebGLSampler: {
+    prototype: WebGLSampler;
+    new(): WebGLSampler;
+};
+
+/** The WebGLShader is part of the WebGL API and can either be a vertex or a fragment shader. A WebGLProgram requires both types of shaders. */
+interface WebGLShader {
+}
+
+declare var WebGLShader: {
+    prototype: WebGLShader;
+    new(): WebGLShader;
+};
+
+/** Part of the WebGL API and represents the information returned by calling the WebGLRenderingContext.getShaderPrecisionFormat() method. */
+interface WebGLShaderPrecisionFormat {
+    readonly precision: GLint;
+    readonly rangeMax: GLint;
+    readonly rangeMin: GLint;
+}
+
+declare var WebGLShaderPrecisionFormat: {
+    prototype: WebGLShaderPrecisionFormat;
+    new(): WebGLShaderPrecisionFormat;
+};
+
+interface WebGLSync {
+}
+
+declare var WebGLSync: {
+    prototype: WebGLSync;
+    new(): WebGLSync;
+};
+
+/** Part of the WebGL API and represents an opaque texture object providing storage and state for texturing operations. */
+interface WebGLTexture {
+}
+
+declare var WebGLTexture: {
+    prototype: WebGLTexture;
+    new(): WebGLTexture;
+};
+
+interface WebGLTransformFeedback {
+}
+
+declare var WebGLTransformFeedback: {
+    prototype: WebGLTransformFeedback;
+    new(): WebGLTransformFeedback;
+};
+
+/** Part of the WebGL API and represents the location of a uniform variable in a shader program. */
+interface WebGLUniformLocation {
+}
+
+declare var WebGLUniformLocation: {
+    prototype: WebGLUniformLocation;
+    new(): WebGLUniformLocation;
+};
+
+interface WebGLVertexArrayObject {
+}
+
+declare var WebGLVertexArrayObject: {
+    prototype: WebGLVertexArrayObject;
+    new(): WebGLVertexArrayObject;
+};
+
+interface WebGLVertexArrayObjectOES {
+}
+
+interface WebSocketEventMap {
+    "close": CloseEvent;
+    "error": Event;
+    "message": MessageEvent;
+    "open": Event;
+}
+
+/** Provides the API for creating and managing a WebSocket connection to a server, as well as for sending and receiving data on the connection. */
+interface WebSocket extends EventTarget {
+    /**
+     * Returns a string that indicates how binary data from the WebSocket object is exposed to scripts:
+     *
+     * Can be set, to change how binary data is returned. The default is "blob".
+     */
+    binaryType: BinaryType;
+    /**
+     * Returns the number of bytes of application data (UTF-8 text and binary data) that have been queued using send() but not yet been transmitted to the network.
+     *
+     * If the WebSocket connection is closed, this attribute's value will only increase with each call to the send() method. (The number does not reset to zero once the connection closes.)
+     */
+    readonly bufferedAmount: number;
+    /** Returns the extensions selected by the server, if any. */
+    readonly extensions: string;
+    onclose: ((this: WebSocket, ev: CloseEvent) => any) | null;
+    onerror: ((this: WebSocket, ev: Event) => any) | null;
+    onmessage: ((this: WebSocket, ev: MessageEvent) => any) | null;
+    onopen: ((this: WebSocket, ev: Event) => any) | null;
+    /** Returns the subprotocol selected by the server, if any. It can be used in conjunction with the array form of the constructor's second argument to perform subprotocol negotiation. */
+    readonly protocol: string;
+    /** Returns the state of the WebSocket object's connection. It can have the values described below. */
+    readonly readyState: number;
+    /** Returns the URL that was used to establish the WebSocket connection. */
+    readonly url: string;
+    /** Closes the WebSocket connection, optionally using code as the the WebSocket connection close code and reason as the the WebSocket connection close reason. */
+    close(code?: number, reason?: string): void;
+    /** Transmits data using the WebSocket connection. data can be a string, a Blob, an ArrayBuffer, or an ArrayBufferView. */
+    send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
+    readonly CONNECTING: 0;
+    readonly OPEN: 1;
+    readonly CLOSING: 2;
+    readonly CLOSED: 3;
+    addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var WebSocket: {
+    prototype: WebSocket;
+    new(url: string | URL, protocols?: string | string[]): WebSocket;
+    readonly CONNECTING: 0;
+    readonly OPEN: 1;
+    readonly CLOSING: 2;
+    readonly CLOSED: 3;
+};
+
+/** Events that occur due to the user moving a mouse wheel or similar input device. */
+interface WheelEvent extends MouseEvent {
+    readonly deltaMode: number;
+    readonly deltaX: number;
+    readonly deltaY: number;
+    readonly deltaZ: number;
+    readonly DOM_DELTA_PIXEL: 0x00;
+    readonly DOM_DELTA_LINE: 0x01;
+    readonly DOM_DELTA_PAGE: 0x02;
+}
+
+declare var WheelEvent: {
+    prototype: WheelEvent;
+    new(type: string, eventInitDict?: WheelEventInit): WheelEvent;
+    readonly DOM_DELTA_PIXEL: 0x00;
+    readonly DOM_DELTA_LINE: 0x01;
+    readonly DOM_DELTA_PAGE: 0x02;
+};
+
+interface WindowEventMap extends GlobalEventHandlersEventMap, WindowEventHandlersEventMap {
+    "DOMContentLoaded": Event;
+    "devicemotion": DeviceMotionEvent;
+    "deviceorientation": DeviceOrientationEvent;
+    "gamepadconnected": GamepadEvent;
+    "gamepaddisconnected": GamepadEvent;
+    "orientationchange": Event;
+}
+
+/** A window containing a DOM document; the document property points to the DOM document loaded in that window. */
+interface Window extends EventTarget, AnimationFrameProvider, GlobalEventHandlers, WindowEventHandlers, WindowLocalStorage, WindowOrWorkerGlobalScope, WindowSessionStorage {
+    /** @deprecated This is a legacy alias of \`navigator\`. */
+    readonly clientInformation: Navigator;
+    /** Returns true if the window has been closed, false otherwise. */
+    readonly closed: boolean;
+    /** Defines a new custom element, mapping the given name to the given constructor as an autonomous custom element. */
+    readonly customElements: CustomElementRegistry;
+    readonly devicePixelRatio: number;
+    readonly document: Document;
+    /** @deprecated */
+    readonly event: Event | undefined;
+    /** @deprecated */
+    readonly external: External;
+    readonly frameElement: Element | null;
+    readonly frames: WindowProxy;
+    readonly history: History;
+    readonly innerHeight: number;
+    readonly innerWidth: number;
+    readonly length: number;
+    get location(): Location;
+    set location(href: string | Location);
+    /** Returns true if the location bar is visible; otherwise, returns false. */
+    readonly locationbar: BarProp;
+    /** Returns true if the menu bar is visible; otherwise, returns false. */
+    readonly menubar: BarProp;
+    name: string;
+    readonly navigator: Navigator;
+    /** Available only in secure contexts. */
+    ondevicemotion: ((this: Window, ev: DeviceMotionEvent) => any) | null;
+    /** Available only in secure contexts. */
+    ondeviceorientation: ((this: Window, ev: DeviceOrientationEvent) => any) | null;
+    /** @deprecated */
+    onorientationchange: ((this: Window, ev: Event) => any) | null;
+    opener: any;
+    /** @deprecated */
+    readonly orientation: number;
+    readonly outerHeight: number;
+    readonly outerWidth: number;
+    /** @deprecated This is a legacy alias of \`scrollX\`. */
+    readonly pageXOffset: number;
+    /** @deprecated This is a legacy alias of \`scrollY\`. */
+    readonly pageYOffset: number;
+    /**
+     * Refers to either the parent WindowProxy, or itself.
+     *
+     * It can rarely be null e.g. for contentWindow of an iframe that is already removed from the parent.
+     */
+    readonly parent: WindowProxy;
+    /** Returns true if the personal bar is visible; otherwise, returns false. */
+    readonly personalbar: BarProp;
+    readonly screen: Screen;
+    readonly screenLeft: number;
+    readonly screenTop: number;
+    readonly screenX: number;
+    readonly screenY: number;
+    readonly scrollX: number;
+    readonly scrollY: number;
+    /** Returns true if the scrollbars are visible; otherwise, returns false. */
+    readonly scrollbars: BarProp;
+    readonly self: Window & typeof globalThis;
+    readonly speechSynthesis: SpeechSynthesis;
+    /** @deprecated */
+    status: string;
+    /** Returns true if the status bar is visible; otherwise, returns false. */
+    readonly statusbar: BarProp;
+    /** Returns true if the toolbar is visible; otherwise, returns false. */
+    readonly toolbar: BarProp;
+    readonly top: WindowProxy | null;
+    readonly visualViewport: VisualViewport | null;
+    readonly window: Window & typeof globalThis;
+    alert(message?: any): void;
+    blur(): void;
+    cancelIdleCallback(handle: number): void;
+    /** @deprecated */
+    captureEvents(): void;
+    /** Closes the window. */
+    close(): void;
+    confirm(message?: string): boolean;
+    /** Moves the focus to the window's browsing context, if any. */
+    focus(): void;
+    getComputedStyle(elt: Element, pseudoElt?: string | null): CSSStyleDeclaration;
+    getSelection(): Selection | null;
+    matchMedia(query: string): MediaQueryList;
+    moveBy(x: number, y: number): void;
+    moveTo(x: number, y: number): void;
+    open(url?: string | URL, target?: string, features?: string): WindowProxy | null;
+    /**
+     * Posts a message to the given window. Messages can be structured objects, e.g. nested objects and arrays, can contain JavaScript values (strings, numbers, Date objects, etc), and can contain certain data objects such as File Blob, FileList, and ArrayBuffer objects.
+     *
+     * Objects listed in the transfer member of options are transferred, not just cloned, meaning that they are no longer usable on the sending side.
+     *
+     * A target origin can be specified using the targetOrigin member of options. If not provided, it defaults to "/". This default restricts the message to same-origin targets only.
+     *
+     * If the origin of the target window doesn't match the given target origin, the message is discarded, to avoid information leakage. To send the message to the target regardless of origin, set the target origin to "*".
+     *
+     * Throws a "DataCloneError" DOMException if transfer array contains duplicate objects or if message could not be cloned.
+     */
+    postMessage(message: any, targetOrigin: string, transfer?: Transferable[]): void;
+    postMessage(message: any, options?: WindowPostMessageOptions): void;
+    print(): void;
+    prompt(message?: string, _default?: string): string | null;
+    /** @deprecated */
+    releaseEvents(): void;
+    requestIdleCallback(callback: IdleRequestCallback, options?: IdleRequestOptions): number;
+    resizeBy(x: number, y: number): void;
+    resizeTo(width: number, height: number): void;
+    scroll(options?: ScrollToOptions): void;
+    scroll(x: number, y: number): void;
+    scrollBy(options?: ScrollToOptions): void;
+    scrollBy(x: number, y: number): void;
+    scrollTo(options?: ScrollToOptions): void;
+    scrollTo(x: number, y: number): void;
+    /** Cancels the document load. */
+    stop(): void;
+    addEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+    [index: number]: Window;
+}
+
+declare var Window: {
+    prototype: Window;
+    new(): Window;
+};
+
+interface WindowEventHandlersEventMap {
+    "afterprint": Event;
+    "beforeprint": Event;
+    "beforeunload": BeforeUnloadEvent;
+    "gamepadconnected": GamepadEvent;
+    "gamepaddisconnected": GamepadEvent;
+    "hashchange": HashChangeEvent;
+    "languagechange": Event;
+    "message": MessageEvent;
+    "messageerror": MessageEvent;
+    "offline": Event;
+    "online": Event;
+    "pagehide": PageTransitionEvent;
+    "pageshow": PageTransitionEvent;
+    "popstate": PopStateEvent;
+    "rejectionhandled": PromiseRejectionEvent;
+    "storage": StorageEvent;
+    "unhandledrejection": PromiseRejectionEvent;
+    "unload": Event;
+}
+
+interface WindowEventHandlers {
+    onafterprint: ((this: WindowEventHandlers, ev: Event) => any) | null;
+    onbeforeprint: ((this: WindowEventHandlers, ev: Event) => any) | null;
+    onbeforeunload: ((this: WindowEventHandlers, ev: BeforeUnloadEvent) => any) | null;
+    ongamepadconnected: ((this: WindowEventHandlers, ev: GamepadEvent) => any) | null;
+    ongamepaddisconnected: ((this: WindowEventHandlers, ev: GamepadEvent) => any) | null;
+    onhashchange: ((this: WindowEventHandlers, ev: HashChangeEvent) => any) | null;
+    onlanguagechange: ((this: WindowEventHandlers, ev: Event) => any) | null;
+    onmessage: ((this: WindowEventHandlers, ev: MessageEvent) => any) | null;
+    onmessageerror: ((this: WindowEventHandlers, ev: MessageEvent) => any) | null;
+    onoffline: ((this: WindowEventHandlers, ev: Event) => any) | null;
+    ononline: ((this: WindowEventHandlers, ev: Event) => any) | null;
+    onpagehide: ((this: WindowEventHandlers, ev: PageTransitionEvent) => any) | null;
+    onpageshow: ((this: WindowEventHandlers, ev: PageTransitionEvent) => any) | null;
+    onpopstate: ((this: WindowEventHandlers, ev: PopStateEvent) => any) | null;
+    onrejectionhandled: ((this: WindowEventHandlers, ev: PromiseRejectionEvent) => any) | null;
+    onstorage: ((this: WindowEventHandlers, ev: StorageEvent) => any) | null;
+    onunhandledrejection: ((this: WindowEventHandlers, ev: PromiseRejectionEvent) => any) | null;
+    onunload: ((this: WindowEventHandlers, ev: Event) => any) | null;
+    addEventListener<K extends keyof WindowEventHandlersEventMap>(type: K, listener: (this: WindowEventHandlers, ev: WindowEventHandlersEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof WindowEventHandlersEventMap>(type: K, listener: (this: WindowEventHandlers, ev: WindowEventHandlersEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+interface WindowLocalStorage {
+    readonly localStorage: Storage;
+}
+
+interface WindowOrWorkerGlobalScope {
+    /** Available only in secure contexts. */
+    readonly caches: CacheStorage;
+    readonly crossOriginIsolated: boolean;
+    readonly crypto: Crypto;
+    readonly indexedDB: IDBFactory;
+    readonly isSecureContext: boolean;
+    readonly origin: string;
+    readonly performance: Performance;
+    atob(data: string): string;
+    btoa(data: string): string;
+    clearInterval(id: number | undefined): void;
+    clearTimeout(id: number | undefined): void;
+    createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap>;
+    createImageBitmap(image: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;
+    fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
+    queueMicrotask(callback: VoidFunction): void;
+    reportError(e: any): void;
+    setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
+    setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
+    structuredClone(value: any, options?: StructuredSerializeOptions): any;
+}
+
+interface WindowSessionStorage {
+    readonly sessionStorage: Storage;
+}
+
+interface WorkerEventMap extends AbstractWorkerEventMap {
+    "message": MessageEvent;
+    "messageerror": MessageEvent;
+}
+
+/** This Web Workers API interface represents a background task that can be easily created and can send messages back to its creator. Creating a worker is as simple as calling the Worker() constructor and specifying a script to be run in the worker thread. */
+interface Worker extends EventTarget, AbstractWorker {
+    onmessage: ((this: Worker, ev: MessageEvent) => any) | null;
+    onmessageerror: ((this: Worker, ev: MessageEvent) => any) | null;
+    /** Clones message and transmits it to worker's global environment. transfer can be passed as a list of objects that are to be transferred rather than cloned. */
+    postMessage(message: any, transfer: Transferable[]): void;
+    postMessage(message: any, options?: StructuredSerializeOptions): void;
+    /** Aborts worker's associated global environment. */
+    terminate(): void;
+    addEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: Worker, ev: WorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: Worker, ev: WorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var Worker: {
+    prototype: Worker;
+    new(scriptURL: string | URL, options?: WorkerOptions): Worker;
+};
+
+/** Available only in secure contexts. */
+interface Worklet {
+    /**
+     * Loads and executes the module script given by moduleURL into all of worklet's global scopes. It can also create additional global scopes as part of this process, depending on the worklet type. The returned promise will fulfill once the script has been successfully loaded and run in all global scopes.
+     *
+     * The credentials option can be set to a credentials mode to modify the script-fetching process. It defaults to "same-origin".
+     *
+     * Any failures in fetching the script or its dependencies will cause the returned promise to be rejected with an "AbortError" DOMException. Any errors in parsing the script or its dependencies will cause the returned promise to be rejected with the exception generated during parsing.
+     */
+    addModule(moduleURL: string | URL, options?: WorkletOptions): Promise<void>;
+}
+
+declare var Worklet: {
+    prototype: Worklet;
+    new(): Worklet;
+};
+
+/** This Streams API interface provides\xA0a standard abstraction for writing streaming data to a destination, known as a sink. This object comes with built-in backpressure and queuing. */
+interface WritableStream<W = any> {
+    readonly locked: boolean;
+    abort(reason?: any): Promise<void>;
+    close(): Promise<void>;
+    getWriter(): WritableStreamDefaultWriter<W>;
+}
+
+declare var WritableStream: {
+    prototype: WritableStream;
+    new<W = any>(underlyingSink?: UnderlyingSink<W>, strategy?: QueuingStrategy<W>): WritableStream<W>;
+};
+
+/** This Streams API interface represents a controller allowing control of a\xA0WritableStream's state. When constructing a WritableStream, the underlying sink is given a corresponding WritableStreamDefaultController instance to manipulate. */
+interface WritableStreamDefaultController {
+    readonly signal: AbortSignal;
+    error(e?: any): void;
+}
+
+declare var WritableStreamDefaultController: {
+    prototype: WritableStreamDefaultController;
+    new(): WritableStreamDefaultController;
+};
+
+/** This Streams API interface is the object returned by WritableStream.getWriter() and once created locks the < writer to the WritableStream ensuring that no other streams can write to the underlying sink. */
+interface WritableStreamDefaultWriter<W = any> {
+    readonly closed: Promise<undefined>;
+    readonly desiredSize: number | null;
+    readonly ready: Promise<undefined>;
+    abort(reason?: any): Promise<void>;
+    close(): Promise<void>;
+    releaseLock(): void;
+    write(chunk?: W): Promise<void>;
+}
+
+declare var WritableStreamDefaultWriter: {
+    prototype: WritableStreamDefaultWriter;
+    new<W = any>(stream: WritableStream<W>): WritableStreamDefaultWriter<W>;
+};
+
+/** An XML document. It inherits from the generic Document and does not add any specific methods or properties to it: nevertheless, several algorithms behave differently with the two types of documents. */
+interface XMLDocument extends Document {
+    addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: XMLDocument, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: XMLDocument, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var XMLDocument: {
+    prototype: XMLDocument;
+    new(): XMLDocument;
+};
+
+interface XMLHttpRequestEventMap extends XMLHttpRequestEventTargetEventMap {
+    "readystatechange": Event;
+}
+
+/** Use XMLHttpRequest (XHR) objects to interact with servers. You can retrieve data from a URL without having to do a full page refresh. This enables a Web page to update just part of a page without disrupting what the user is doing. */
+interface XMLHttpRequest extends XMLHttpRequestEventTarget {
+    onreadystatechange: ((this: XMLHttpRequest, ev: Event) => any) | null;
+    /** Returns client's state. */
+    readonly readyState: number;
+    /** Returns the response body. */
+    readonly response: any;
+    /**
+     * Returns response as text.
+     *
+     * Throws an "InvalidStateError" DOMException if responseType is not the empty string or "text".
+     */
+    readonly responseText: string;
+    /**
+     * Returns the response type.
+     *
+     * Can be set to change the response type. Values are: the empty string (default), "arraybuffer", "blob", "document", "json", and "text".
+     *
+     * When set: setting to "document" is ignored if current global object is not a Window object.
+     *
+     * When set: throws an "InvalidStateError" DOMException if state is loading or done.
+     *
+     * When set: throws an "InvalidAccessError" DOMException if the synchronous flag is set and current global object is a Window object.
+     */
+    responseType: XMLHttpRequestResponseType;
+    readonly responseURL: string;
+    /**
+     * Returns the response as document.
+     *
+     * Throws an "InvalidStateError" DOMException if responseType is not the empty string or "document".
+     */
+    readonly responseXML: Document | null;
+    readonly status: number;
+    readonly statusText: string;
+    /**
+     * Can be set to a time in milliseconds. When set to a non-zero value will cause fetching to terminate after the given time has passed. When the time has passed, the request has not yet completed, and this's synchronous flag is unset, a timeout event will then be dispatched, or a "TimeoutError" DOMException will be thrown otherwise (for the send() method).
+     *
+     * When set: throws an "InvalidAccessError" DOMException if the synchronous flag is set and current global object is a Window object.
+     */
+    timeout: number;
+    /** Returns the associated XMLHttpRequestUpload object. It can be used to gather transmission information when data is transferred to a server. */
+    readonly upload: XMLHttpRequestUpload;
+    /**
+     * True when credentials are to be included in a cross-origin request. False when they are to be excluded in a cross-origin request and when cookies are to be ignored in its response. Initially false.
+     *
+     * When set: throws an "InvalidStateError" DOMException if state is not unsent or opened, or if the send() flag is set.
+     */
+    withCredentials: boolean;
+    /** Cancels any network activity. */
+    abort(): void;
+    getAllResponseHeaders(): string;
+    getResponseHeader(name: string): string | null;
+    /**
+     * Sets the request method, request URL, and synchronous flag.
+     *
+     * Throws a "SyntaxError" DOMException if either method is not a valid method or url cannot be parsed.
+     *
+     * Throws a "SecurityError" DOMException if method is a case-insensitive match for \`CONNECT\`, \`TRACE\`, or \`TRACK\`.
+     *
+     * Throws an "InvalidAccessError" DOMException if async is false, current global object is a Window object, and the timeout attribute is not zero or the responseType attribute is not the empty string.
+     */
+    open(method: string, url: string | URL): void;
+    open(method: string, url: string | URL, async: boolean, username?: string | null, password?: string | null): void;
+    /**
+     * Acts as if the \`Content-Type\` header value for a response is mime. (It does not change the header.)
+     *
+     * Throws an "InvalidStateError" DOMException if state is loading or done.
+     */
+    overrideMimeType(mime: string): void;
+    /**
+     * Initiates the request. The body argument provides the request body, if any, and is ignored if the request method is GET or HEAD.
+     *
+     * Throws an "InvalidStateError" DOMException if either state is not opened or the send() flag is set.
+     */
+    send(body?: Document | XMLHttpRequestBodyInit | null): void;
+    /**
+     * Combines a header in author request headers.
+     *
+     * Throws an "InvalidStateError" DOMException if either state is not opened or the send() flag is set.
+     *
+     * Throws a "SyntaxError" DOMException if name is not a header name or if value is not a header value.
+     */
+    setRequestHeader(name: string, value: string): void;
+    readonly UNSENT: 0;
+    readonly OPENED: 1;
+    readonly HEADERS_RECEIVED: 2;
+    readonly LOADING: 3;
+    readonly DONE: 4;
+    addEventListener<K extends keyof XMLHttpRequestEventMap>(type: K, listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof XMLHttpRequestEventMap>(type: K, listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var XMLHttpRequest: {
+    prototype: XMLHttpRequest;
+    new(): XMLHttpRequest;
+    readonly UNSENT: 0;
+    readonly OPENED: 1;
+    readonly HEADERS_RECEIVED: 2;
+    readonly LOADING: 3;
+    readonly DONE: 4;
+};
+
+interface XMLHttpRequestEventTargetEventMap {
+    "abort": ProgressEvent<XMLHttpRequestEventTarget>;
+    "error": ProgressEvent<XMLHttpRequestEventTarget>;
+    "load": ProgressEvent<XMLHttpRequestEventTarget>;
+    "loadend": ProgressEvent<XMLHttpRequestEventTarget>;
+    "loadstart": ProgressEvent<XMLHttpRequestEventTarget>;
+    "progress": ProgressEvent<XMLHttpRequestEventTarget>;
+    "timeout": ProgressEvent<XMLHttpRequestEventTarget>;
+}
+
+interface XMLHttpRequestEventTarget extends EventTarget {
+    onabort: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
+    onerror: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
+    onload: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
+    onloadend: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
+    onloadstart: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
+    onprogress: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
+    ontimeout: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
+    addEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestEventTarget, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestEventTarget, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var XMLHttpRequestEventTarget: {
+    prototype: XMLHttpRequestEventTarget;
+    new(): XMLHttpRequestEventTarget;
+};
+
+interface XMLHttpRequestUpload extends XMLHttpRequestEventTarget {
+    addEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestUpload, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestUpload, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var XMLHttpRequestUpload: {
+    prototype: XMLHttpRequestUpload;
+    new(): XMLHttpRequestUpload;
+};
+
+/** Provides the serializeToString() method to construct an XML string representing a DOM tree. */
+interface XMLSerializer {
+    serializeToString(root: Node): string;
+}
+
+declare var XMLSerializer: {
+    prototype: XMLSerializer;
+    new(): XMLSerializer;
+};
+
+/** The\xA0XPathEvaluator interface allows to compile and evaluate XPath expressions. */
+interface XPathEvaluator extends XPathEvaluatorBase {
+}
+
+declare var XPathEvaluator: {
+    prototype: XPathEvaluator;
+    new(): XPathEvaluator;
+};
+
+interface XPathEvaluatorBase {
+    createExpression(expression: string, resolver?: XPathNSResolver | null): XPathExpression;
+    createNSResolver(nodeResolver: Node): XPathNSResolver;
+    evaluate(expression: string, contextNode: Node, resolver?: XPathNSResolver | null, type?: number, result?: XPathResult | null): XPathResult;
+}
+
+/** This interface is a compiled XPath expression that can be evaluated on a document or specific node to return information its DOM tree. */
+interface XPathExpression {
+    evaluate(contextNode: Node, type?: number, result?: XPathResult | null): XPathResult;
+}
+
+declare var XPathExpression: {
+    prototype: XPathExpression;
+    new(): XPathExpression;
+};
+
+/** The results generated by evaluating an XPath expression within the context of a given node. */
+interface XPathResult {
+    readonly booleanValue: boolean;
+    readonly invalidIteratorState: boolean;
+    readonly numberValue: number;
+    readonly resultType: number;
+    readonly singleNodeValue: Node | null;
+    readonly snapshotLength: number;
+    readonly stringValue: string;
+    iterateNext(): Node | null;
+    snapshotItem(index: number): Node | null;
+    readonly ANY_TYPE: 0;
+    readonly NUMBER_TYPE: 1;
+    readonly STRING_TYPE: 2;
+    readonly BOOLEAN_TYPE: 3;
+    readonly UNORDERED_NODE_ITERATOR_TYPE: 4;
+    readonly ORDERED_NODE_ITERATOR_TYPE: 5;
+    readonly UNORDERED_NODE_SNAPSHOT_TYPE: 6;
+    readonly ORDERED_NODE_SNAPSHOT_TYPE: 7;
+    readonly ANY_UNORDERED_NODE_TYPE: 8;
+    readonly FIRST_ORDERED_NODE_TYPE: 9;
+}
+
+declare var XPathResult: {
+    prototype: XPathResult;
+    new(): XPathResult;
+    readonly ANY_TYPE: 0;
+    readonly NUMBER_TYPE: 1;
+    readonly STRING_TYPE: 2;
+    readonly BOOLEAN_TYPE: 3;
+    readonly UNORDERED_NODE_ITERATOR_TYPE: 4;
+    readonly ORDERED_NODE_ITERATOR_TYPE: 5;
+    readonly UNORDERED_NODE_SNAPSHOT_TYPE: 6;
+    readonly ORDERED_NODE_SNAPSHOT_TYPE: 7;
+    readonly ANY_UNORDERED_NODE_TYPE: 8;
+    readonly FIRST_ORDERED_NODE_TYPE: 9;
+};
+
+/** An XSLTProcessor applies an XSLT stylesheet transformation to an XML document to produce a new XML document as output. It has methods to load the XSLT stylesheet, to manipulate <xsl:param> parameter values, and to apply the transformation to documents. */
+interface XSLTProcessor {
+    clearParameters(): void;
+    getParameter(namespaceURI: string | null, localName: string): any;
+    importStylesheet(style: Node): void;
+    removeParameter(namespaceURI: string | null, localName: string): void;
+    reset(): void;
+    setParameter(namespaceURI: string | null, localName: string, value: any): void;
+    transformToDocument(source: Node): Document;
+    transformToFragment(source: Node, output: Document): DocumentFragment;
+}
+
+declare var XSLTProcessor: {
+    prototype: XSLTProcessor;
+    new(): XSLTProcessor;
+};
+
+interface Console {
+    assert(condition?: boolean, ...data: any[]): void;
+    clear(): void;
+    count(label?: string): void;
+    countReset(label?: string): void;
+    debug(...data: any[]): void;
+    dir(item?: any, options?: any): void;
+    dirxml(...data: any[]): void;
+    error(...data: any[]): void;
+    group(...data: any[]): void;
+    groupCollapsed(...data: any[]): void;
+    groupEnd(): void;
+    info(...data: any[]): void;
+    log(...data: any[]): void;
+    table(tabularData?: any, properties?: string[]): void;
+    time(label?: string): void;
+    timeEnd(label?: string): void;
+    timeLog(label?: string, ...data: any[]): void;
+    timeStamp(label?: string): void;
+    trace(...data: any[]): void;
+    warn(...data: any[]): void;
+}
+
+declare var console: Console;
+
+/** Holds useful CSS-related methods. No object with this interface are implemented: it contains only static methods and therefore is a utilitarian interface. */
+declare namespace CSS {
+    function escape(ident: string): string;
+    function supports(property: string, value: string): boolean;
+    function supports(conditionText: string): boolean;
+}
+
+declare namespace WebAssembly {
+    interface CompileError extends Error {
+    }
+
+    var CompileError: {
+        prototype: CompileError;
+        new(message?: string): CompileError;
+        (message?: string): CompileError;
+    };
+
+    interface Global {
+        value: any;
+        valueOf(): any;
+    }
+
+    var Global: {
+        prototype: Global;
+        new(descriptor: GlobalDescriptor, v?: any): Global;
+    };
+
+    interface Instance {
+        readonly exports: Exports;
+    }
+
+    var Instance: {
+        prototype: Instance;
+        new(module: Module, importObject?: Imports): Instance;
+    };
+
+    interface LinkError extends Error {
+    }
+
+    var LinkError: {
+        prototype: LinkError;
+        new(message?: string): LinkError;
+        (message?: string): LinkError;
+    };
+
+    interface Memory {
+        readonly buffer: ArrayBuffer;
+        grow(delta: number): number;
+    }
+
+    var Memory: {
+        prototype: Memory;
+        new(descriptor: MemoryDescriptor): Memory;
+    };
+
+    interface Module {
+    }
+
+    var Module: {
+        prototype: Module;
+        new(bytes: BufferSource): Module;
+        customSections(moduleObject: Module, sectionName: string): ArrayBuffer[];
+        exports(moduleObject: Module): ModuleExportDescriptor[];
+        imports(moduleObject: Module): ModuleImportDescriptor[];
+    };
+
+    interface RuntimeError extends Error {
+    }
+
+    var RuntimeError: {
+        prototype: RuntimeError;
+        new(message?: string): RuntimeError;
+        (message?: string): RuntimeError;
+    };
+
+    interface Table {
+        readonly length: number;
+        get(index: number): any;
+        grow(delta: number, value?: any): number;
+        set(index: number, value?: any): void;
+    }
+
+    var Table: {
+        prototype: Table;
+        new(descriptor: TableDescriptor, value?: any): Table;
+    };
+
+    interface GlobalDescriptor {
+        mutable?: boolean;
+        value: ValueType;
+    }
+
+    interface MemoryDescriptor {
+        initial: number;
+        maximum?: number;
+        shared?: boolean;
+    }
+
+    interface ModuleExportDescriptor {
+        kind: ImportExportKind;
+        name: string;
+    }
+
+    interface ModuleImportDescriptor {
+        kind: ImportExportKind;
+        module: string;
+        name: string;
+    }
+
+    interface TableDescriptor {
+        element: TableKind;
+        initial: number;
+        maximum?: number;
+    }
+
+    interface WebAssemblyInstantiatedSource {
+        instance: Instance;
+        module: Module;
+    }
+
+    type ImportExportKind = "function" | "global" | "memory" | "table";
+    type TableKind = "anyfunc" | "externref";
+    type ValueType = "anyfunc" | "externref" | "f32" | "f64" | "i32" | "i64" | "v128";
+    type ExportValue = Function | Global | Memory | Table;
+    type Exports = Record<string, ExportValue>;
+    type ImportValue = ExportValue | number;
+    type Imports = Record<string, ModuleImports>;
+    type ModuleImports = Record<string, ImportValue>;
+    function compile(bytes: BufferSource): Promise<Module>;
+    function compileStreaming(source: Response | PromiseLike<Response>): Promise<Module>;
+    function instantiate(bytes: BufferSource, importObject?: Imports): Promise<WebAssemblyInstantiatedSource>;
+    function instantiate(moduleObject: Module, importObject?: Imports): Promise<Instance>;
+    function instantiateStreaming(source: Response | PromiseLike<Response>, importObject?: Imports): Promise<WebAssemblyInstantiatedSource>;
+    function validate(bytes: BufferSource): boolean;
+}
+
+interface BlobCallback {
+    (blob: Blob | null): void;
+}
+
+interface CustomElementConstructor {
+    new (...params: any[]): HTMLElement;
+}
+
+interface DecodeErrorCallback {
+    (error: DOMException): void;
+}
+
+interface DecodeSuccessCallback {
+    (decodedData: AudioBuffer): void;
+}
+
+interface ErrorCallback {
+    (err: DOMException): void;
+}
+
+interface FileCallback {
+    (file: File): void;
+}
+
+interface FileSystemEntriesCallback {
+    (entries: FileSystemEntry[]): void;
+}
+
+interface FileSystemEntryCallback {
+    (entry: FileSystemEntry): void;
+}
+
+interface FrameRequestCallback {
+    (time: DOMHighResTimeStamp): void;
+}
+
+interface FunctionStringCallback {
+    (data: string): void;
+}
+
+interface IdleRequestCallback {
+    (deadline: IdleDeadline): void;
+}
+
+interface IntersectionObserverCallback {
+    (entries: IntersectionObserverEntry[], observer: IntersectionObserver): void;
+}
+
+interface LockGrantedCallback {
+    (lock: Lock | null): any;
+}
+
+interface MediaSessionActionHandler {
+    (details: MediaSessionActionDetails): void;
+}
+
+interface MutationCallback {
+    (mutations: MutationRecord[], observer: MutationObserver): void;
+}
+
+interface NotificationPermissionCallback {
+    (permission: NotificationPermission): void;
+}
+
+interface OnBeforeUnloadEventHandlerNonNull {
+    (event: Event): string | null;
+}
+
+interface OnErrorEventHandlerNonNull {
+    (event: Event | string, source?: string, lineno?: number, colno?: number, error?: Error): any;
+}
+
+interface PerformanceObserverCallback {
+    (entries: PerformanceObserverEntryList, observer: PerformanceObserver): void;
+}
+
+interface PositionCallback {
+    (position: GeolocationPosition): void;
+}
+
+interface PositionErrorCallback {
+    (positionError: GeolocationPositionError): void;
+}
+
+interface QueuingStrategySize<T = any> {
+    (chunk: T): number;
+}
+
+interface RTCPeerConnectionErrorCallback {
+    (error: DOMException): void;
+}
+
+interface RTCSessionDescriptionCallback {
+    (description: RTCSessionDescriptionInit): void;
+}
+
+interface RemotePlaybackAvailabilityCallback {
+    (available: boolean): void;
+}
+
+interface ResizeObserverCallback {
+    (entries: ResizeObserverEntry[], observer: ResizeObserver): void;
+}
+
+interface TransformerFlushCallback<O> {
+    (controller: TransformStreamDefaultController<O>): void | PromiseLike<void>;
+}
+
+interface TransformerStartCallback<O> {
+    (controller: TransformStreamDefaultController<O>): any;
+}
+
+interface TransformerTransformCallback<I, O> {
+    (chunk: I, controller: TransformStreamDefaultController<O>): void | PromiseLike<void>;
+}
+
+interface UnderlyingSinkAbortCallback {
+    (reason?: any): void | PromiseLike<void>;
+}
+
+interface UnderlyingSinkCloseCallback {
+    (): void | PromiseLike<void>;
+}
+
+interface UnderlyingSinkStartCallback {
+    (controller: WritableStreamDefaultController): any;
+}
+
+interface UnderlyingSinkWriteCallback<W> {
+    (chunk: W, controller: WritableStreamDefaultController): void | PromiseLike<void>;
+}
+
+interface UnderlyingSourceCancelCallback {
+    (reason?: any): void | PromiseLike<void>;
+}
+
+interface UnderlyingSourcePullCallback<R> {
+    (controller: ReadableStreamController<R>): void | PromiseLike<void>;
+}
+
+interface UnderlyingSourceStartCallback<R> {
+    (controller: ReadableStreamController<R>): any;
+}
+
+interface VideoFrameRequestCallback {
+    (now: DOMHighResTimeStamp, metadata: VideoFrameCallbackMetadata): void;
+}
+
+interface VoidFunction {
+    (): void;
+}
+
+interface HTMLElementTagNameMap {
+    "a": HTMLAnchorElement;
+    "abbr": HTMLElement;
+    "address": HTMLElement;
+    "area": HTMLAreaElement;
+    "article": HTMLElement;
+    "aside": HTMLElement;
+    "audio": HTMLAudioElement;
+    "b": HTMLElement;
+    "base": HTMLBaseElement;
+    "bdi": HTMLElement;
+    "bdo": HTMLElement;
+    "blockquote": HTMLQuoteElement;
+    "body": HTMLBodyElement;
+    "br": HTMLBRElement;
+    "button": HTMLButtonElement;
+    "canvas": HTMLCanvasElement;
+    "caption": HTMLTableCaptionElement;
+    "cite": HTMLElement;
+    "code": HTMLElement;
+    "col": HTMLTableColElement;
+    "colgroup": HTMLTableColElement;
+    "data": HTMLDataElement;
+    "datalist": HTMLDataListElement;
+    "dd": HTMLElement;
+    "del": HTMLModElement;
+    "details": HTMLDetailsElement;
+    "dfn": HTMLElement;
+    "dialog": HTMLDialogElement;
+    "div": HTMLDivElement;
+    "dl": HTMLDListElement;
+    "dt": HTMLElement;
+    "em": HTMLElement;
+    "embed": HTMLEmbedElement;
+    "fieldset": HTMLFieldSetElement;
+    "figcaption": HTMLElement;
+    "figure": HTMLElement;
+    "footer": HTMLElement;
+    "form": HTMLFormElement;
+    "h1": HTMLHeadingElement;
+    "h2": HTMLHeadingElement;
+    "h3": HTMLHeadingElement;
+    "h4": HTMLHeadingElement;
+    "h5": HTMLHeadingElement;
+    "h6": HTMLHeadingElement;
+    "head": HTMLHeadElement;
+    "header": HTMLElement;
+    "hgroup": HTMLElement;
+    "hr": HTMLHRElement;
+    "html": HTMLHtmlElement;
+    "i": HTMLElement;
+    "iframe": HTMLIFrameElement;
+    "img": HTMLImageElement;
+    "input": HTMLInputElement;
+    "ins": HTMLModElement;
+    "kbd": HTMLElement;
+    "label": HTMLLabelElement;
+    "legend": HTMLLegendElement;
+    "li": HTMLLIElement;
+    "link": HTMLLinkElement;
+    "main": HTMLElement;
+    "map": HTMLMapElement;
+    "mark": HTMLElement;
+    "menu": HTMLMenuElement;
+    "meta": HTMLMetaElement;
+    "meter": HTMLMeterElement;
+    "nav": HTMLElement;
+    "noscript": HTMLElement;
+    "object": HTMLObjectElement;
+    "ol": HTMLOListElement;
+    "optgroup": HTMLOptGroupElement;
+    "option": HTMLOptionElement;
+    "output": HTMLOutputElement;
+    "p": HTMLParagraphElement;
+    "picture": HTMLPictureElement;
+    "pre": HTMLPreElement;
+    "progress": HTMLProgressElement;
+    "q": HTMLQuoteElement;
+    "rp": HTMLElement;
+    "rt": HTMLElement;
+    "ruby": HTMLElement;
+    "s": HTMLElement;
+    "samp": HTMLElement;
+    "script": HTMLScriptElement;
+    "section": HTMLElement;
+    "select": HTMLSelectElement;
+    "slot": HTMLSlotElement;
+    "small": HTMLElement;
+    "source": HTMLSourceElement;
+    "span": HTMLSpanElement;
+    "strong": HTMLElement;
+    "style": HTMLStyleElement;
+    "sub": HTMLElement;
+    "summary": HTMLElement;
+    "sup": HTMLElement;
+    "table": HTMLTableElement;
+    "tbody": HTMLTableSectionElement;
+    "td": HTMLTableCellElement;
+    "template": HTMLTemplateElement;
+    "textarea": HTMLTextAreaElement;
+    "tfoot": HTMLTableSectionElement;
+    "th": HTMLTableCellElement;
+    "thead": HTMLTableSectionElement;
+    "time": HTMLTimeElement;
+    "title": HTMLTitleElement;
+    "tr": HTMLTableRowElement;
+    "track": HTMLTrackElement;
+    "u": HTMLElement;
+    "ul": HTMLUListElement;
+    "var": HTMLElement;
+    "video": HTMLVideoElement;
+    "wbr": HTMLElement;
+}
+
+interface HTMLElementDeprecatedTagNameMap {
+    "acronym": HTMLElement;
+    "applet": HTMLUnknownElement;
+    "basefont": HTMLElement;
+    "bgsound": HTMLUnknownElement;
+    "big": HTMLElement;
+    "blink": HTMLUnknownElement;
+    "center": HTMLElement;
+    "dir": HTMLDirectoryElement;
+    "font": HTMLFontElement;
+    "frame": HTMLFrameElement;
+    "frameset": HTMLFrameSetElement;
+    "isindex": HTMLUnknownElement;
+    "keygen": HTMLUnknownElement;
+    "listing": HTMLPreElement;
+    "marquee": HTMLMarqueeElement;
+    "menuitem": HTMLElement;
+    "multicol": HTMLUnknownElement;
+    "nextid": HTMLUnknownElement;
+    "nobr": HTMLElement;
+    "noembed": HTMLElement;
+    "noframes": HTMLElement;
+    "param": HTMLParamElement;
+    "plaintext": HTMLElement;
+    "rb": HTMLElement;
+    "rtc": HTMLElement;
+    "spacer": HTMLUnknownElement;
+    "strike": HTMLElement;
+    "tt": HTMLElement;
+    "xmp": HTMLPreElement;
+}
+
+interface SVGElementTagNameMap {
+    "a": SVGAElement;
+    "animate": SVGAnimateElement;
+    "animateMotion": SVGAnimateMotionElement;
+    "animateTransform": SVGAnimateTransformElement;
+    "circle": SVGCircleElement;
+    "clipPath": SVGClipPathElement;
+    "defs": SVGDefsElement;
+    "desc": SVGDescElement;
+    "ellipse": SVGEllipseElement;
+    "feBlend": SVGFEBlendElement;
+    "feColorMatrix": SVGFEColorMatrixElement;
+    "feComponentTransfer": SVGFEComponentTransferElement;
+    "feComposite": SVGFECompositeElement;
+    "feConvolveMatrix": SVGFEConvolveMatrixElement;
+    "feDiffuseLighting": SVGFEDiffuseLightingElement;
+    "feDisplacementMap": SVGFEDisplacementMapElement;
+    "feDistantLight": SVGFEDistantLightElement;
+    "feDropShadow": SVGFEDropShadowElement;
+    "feFlood": SVGFEFloodElement;
+    "feFuncA": SVGFEFuncAElement;
+    "feFuncB": SVGFEFuncBElement;
+    "feFuncG": SVGFEFuncGElement;
+    "feFuncR": SVGFEFuncRElement;
+    "feGaussianBlur": SVGFEGaussianBlurElement;
+    "feImage": SVGFEImageElement;
+    "feMerge": SVGFEMergeElement;
+    "feMergeNode": SVGFEMergeNodeElement;
+    "feMorphology": SVGFEMorphologyElement;
+    "feOffset": SVGFEOffsetElement;
+    "fePointLight": SVGFEPointLightElement;
+    "feSpecularLighting": SVGFESpecularLightingElement;
+    "feSpotLight": SVGFESpotLightElement;
+    "feTile": SVGFETileElement;
+    "feTurbulence": SVGFETurbulenceElement;
+    "filter": SVGFilterElement;
+    "foreignObject": SVGForeignObjectElement;
+    "g": SVGGElement;
+    "image": SVGImageElement;
+    "line": SVGLineElement;
+    "linearGradient": SVGLinearGradientElement;
+    "marker": SVGMarkerElement;
+    "mask": SVGMaskElement;
+    "metadata": SVGMetadataElement;
+    "mpath": SVGMPathElement;
+    "path": SVGPathElement;
+    "pattern": SVGPatternElement;
+    "polygon": SVGPolygonElement;
+    "polyline": SVGPolylineElement;
+    "radialGradient": SVGRadialGradientElement;
+    "rect": SVGRectElement;
+    "script": SVGScriptElement;
+    "set": SVGSetElement;
+    "stop": SVGStopElement;
+    "style": SVGStyleElement;
+    "svg": SVGSVGElement;
+    "switch": SVGSwitchElement;
+    "symbol": SVGSymbolElement;
+    "text": SVGTextElement;
+    "textPath": SVGTextPathElement;
+    "title": SVGTitleElement;
+    "tspan": SVGTSpanElement;
+    "use": SVGUseElement;
+    "view": SVGViewElement;
+}
+
+interface MathMLElementTagNameMap {
+    "annotation": MathMLElement;
+    "annotation-xml": MathMLElement;
+    "maction": MathMLElement;
+    "math": MathMLElement;
+    "merror": MathMLElement;
+    "mfrac": MathMLElement;
+    "mi": MathMLElement;
+    "mmultiscripts": MathMLElement;
+    "mn": MathMLElement;
+    "mo": MathMLElement;
+    "mover": MathMLElement;
+    "mpadded": MathMLElement;
+    "mphantom": MathMLElement;
+    "mprescripts": MathMLElement;
+    "mroot": MathMLElement;
+    "mrow": MathMLElement;
+    "ms": MathMLElement;
+    "mspace": MathMLElement;
+    "msqrt": MathMLElement;
+    "mstyle": MathMLElement;
+    "msub": MathMLElement;
+    "msubsup": MathMLElement;
+    "msup": MathMLElement;
+    "mtable": MathMLElement;
+    "mtd": MathMLElement;
+    "mtext": MathMLElement;
+    "mtr": MathMLElement;
+    "munder": MathMLElement;
+    "munderover": MathMLElement;
+    "semantics": MathMLElement;
+}
+
+/** @deprecated Directly use HTMLElementTagNameMap or SVGElementTagNameMap as appropriate, instead. */
+type ElementTagNameMap = HTMLElementTagNameMap & Pick<SVGElementTagNameMap, Exclude<keyof SVGElementTagNameMap, keyof HTMLElementTagNameMap>>;
+
+declare var Audio: {
+    new(src?: string): HTMLAudioElement;
+};
+declare var Image: {
+    new(width?: number, height?: number): HTMLImageElement;
+};
+declare var Option: {
+    new(text?: string, value?: string, defaultSelected?: boolean, selected?: boolean): HTMLOptionElement;
+};
+/** @deprecated This is a legacy alias of \`navigator\`. */
+declare var clientInformation: Navigator;
+/** Returns true if the window has been closed, false otherwise. */
+declare var closed: boolean;
+/** Defines a new custom element, mapping the given name to the given constructor as an autonomous custom element. */
+declare var customElements: CustomElementRegistry;
+declare var devicePixelRatio: number;
+declare var document: Document;
+/** @deprecated */
+declare var event: Event | undefined;
+/** @deprecated */
+declare var external: External;
+declare var frameElement: Element | null;
+declare var frames: WindowProxy;
+declare var history: History;
+declare var innerHeight: number;
+declare var innerWidth: number;
+declare var length: number;
+declare var location: Location;
+/** Returns true if the location bar is visible; otherwise, returns false. */
+declare var locationbar: BarProp;
+/** Returns true if the menu bar is visible; otherwise, returns false. */
+declare var menubar: BarProp;
+/** @deprecated */
+declare const name: void;
+declare var navigator: Navigator;
+/** Available only in secure contexts. */
+declare var ondevicemotion: ((this: Window, ev: DeviceMotionEvent) => any) | null;
+/** Available only in secure contexts. */
+declare var ondeviceorientation: ((this: Window, ev: DeviceOrientationEvent) => any) | null;
+/** @deprecated */
+declare var onorientationchange: ((this: Window, ev: Event) => any) | null;
+declare var opener: any;
+/** @deprecated */
+declare var orientation: number;
+declare var outerHeight: number;
+declare var outerWidth: number;
+/** @deprecated This is a legacy alias of \`scrollX\`. */
+declare var pageXOffset: number;
+/** @deprecated This is a legacy alias of \`scrollY\`. */
+declare var pageYOffset: number;
+/**
+ * Refers to either the parent WindowProxy, or itself.
+ *
+ * It can rarely be null e.g. for contentWindow of an iframe that is already removed from the parent.
+ */
+declare var parent: WindowProxy;
+/** Returns true if the personal bar is visible; otherwise, returns false. */
+declare var personalbar: BarProp;
+declare var screen: Screen;
+declare var screenLeft: number;
+declare var screenTop: number;
+declare var screenX: number;
+declare var screenY: number;
+declare var scrollX: number;
+declare var scrollY: number;
+/** Returns true if the scrollbars are visible; otherwise, returns false. */
+declare var scrollbars: BarProp;
+declare var self: Window & typeof globalThis;
+declare var speechSynthesis: SpeechSynthesis;
+/** @deprecated */
+declare var status: string;
+/** Returns true if the status bar is visible; otherwise, returns false. */
+declare var statusbar: BarProp;
+/** Returns true if the toolbar is visible; otherwise, returns false. */
+declare var toolbar: BarProp;
+declare var top: WindowProxy | null;
+declare var visualViewport: VisualViewport | null;
+declare var window: Window & typeof globalThis;
+declare function alert(message?: any): void;
+declare function blur(): void;
+declare function cancelIdleCallback(handle: number): void;
+/** @deprecated */
+declare function captureEvents(): void;
+/** Closes the window. */
+declare function close(): void;
+declare function confirm(message?: string): boolean;
+/** Moves the focus to the window's browsing context, if any. */
+declare function focus(): void;
+declare function getComputedStyle(elt: Element, pseudoElt?: string | null): CSSStyleDeclaration;
+declare function getSelection(): Selection | null;
+declare function matchMedia(query: string): MediaQueryList;
+declare function moveBy(x: number, y: number): void;
+declare function moveTo(x: number, y: number): void;
+declare function open(url?: string | URL, target?: string, features?: string): WindowProxy | null;
+/**
+ * Posts a message to the given window. Messages can be structured objects, e.g. nested objects and arrays, can contain JavaScript values (strings, numbers, Date objects, etc), and can contain certain data objects such as File Blob, FileList, and ArrayBuffer objects.
+ *
+ * Objects listed in the transfer member of options are transferred, not just cloned, meaning that they are no longer usable on the sending side.
+ *
+ * A target origin can be specified using the targetOrigin member of options. If not provided, it defaults to "/". This default restricts the message to same-origin targets only.
+ *
+ * If the origin of the target window doesn't match the given target origin, the message is discarded, to avoid information leakage. To send the message to the target regardless of origin, set the target origin to "*".
+ *
+ * Throws a "DataCloneError" DOMException if transfer array contains duplicate objects or if message could not be cloned.
+ */
+declare function postMessage(message: any, targetOrigin: string, transfer?: Transferable[]): void;
+declare function postMessage(message: any, options?: WindowPostMessageOptions): void;
+declare function print(): void;
+declare function prompt(message?: string, _default?: string): string | null;
+/** @deprecated */
+declare function releaseEvents(): void;
+declare function requestIdleCallback(callback: IdleRequestCallback, options?: IdleRequestOptions): number;
+declare function resizeBy(x: number, y: number): void;
+declare function resizeTo(width: number, height: number): void;
+declare function scroll(options?: ScrollToOptions): void;
+declare function scroll(x: number, y: number): void;
+declare function scrollBy(options?: ScrollToOptions): void;
+declare function scrollBy(x: number, y: number): void;
+declare function scrollTo(options?: ScrollToOptions): void;
+declare function scrollTo(x: number, y: number): void;
+/** Cancels the document load. */
+declare function stop(): void;
+declare function toString(): string;
+/** Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. */
+declare function dispatchEvent(event: Event): boolean;
+declare function cancelAnimationFrame(handle: number): void;
+declare function requestAnimationFrame(callback: FrameRequestCallback): number;
+/**
+ * Fires when the user aborts the download.
+ * @param ev The event.
+ */
+declare var onabort: ((this: Window, ev: UIEvent) => any) | null;
+declare var onanimationcancel: ((this: Window, ev: AnimationEvent) => any) | null;
+declare var onanimationend: ((this: Window, ev: AnimationEvent) => any) | null;
+declare var onanimationiteration: ((this: Window, ev: AnimationEvent) => any) | null;
+declare var onanimationstart: ((this: Window, ev: AnimationEvent) => any) | null;
+declare var onauxclick: ((this: Window, ev: MouseEvent) => any) | null;
+declare var onbeforeinput: ((this: Window, ev: InputEvent) => any) | null;
+/**
+ * Fires when the object loses the input focus.
+ * @param ev The focus event.
+ */
+declare var onblur: ((this: Window, ev: FocusEvent) => any) | null;
+declare var oncancel: ((this: Window, ev: Event) => any) | null;
+/**
+ * Occurs when playback is possible, but would require further buffering.
+ * @param ev The event.
+ */
+declare var oncanplay: ((this: Window, ev: Event) => any) | null;
+declare var oncanplaythrough: ((this: Window, ev: Event) => any) | null;
+/**
+ * Fires when the contents of the object or selection have changed.
+ * @param ev The event.
+ */
+declare var onchange: ((this: Window, ev: Event) => any) | null;
+/**
+ * Fires when the user clicks the left mouse button on the object
+ * @param ev The mouse event.
+ */
+declare var onclick: ((this: Window, ev: MouseEvent) => any) | null;
+declare var onclose: ((this: Window, ev: Event) => any) | null;
+/**
+ * Fires when the user clicks the right mouse button in the client area, opening the context menu.
+ * @param ev The mouse event.
+ */
+declare var oncontextmenu: ((this: Window, ev: MouseEvent) => any) | null;
+declare var oncopy: ((this: Window, ev: ClipboardEvent) => any) | null;
+declare var oncuechange: ((this: Window, ev: Event) => any) | null;
+declare var oncut: ((this: Window, ev: ClipboardEvent) => any) | null;
+/**
+ * Fires when the user double-clicks the object.
+ * @param ev The mouse event.
+ */
+declare var ondblclick: ((this: Window, ev: MouseEvent) => any) | null;
+/**
+ * Fires on the source object continuously during a drag operation.
+ * @param ev The event.
+ */
+declare var ondrag: ((this: Window, ev: DragEvent) => any) | null;
+/**
+ * Fires on the source object when the user releases the mouse at the close of a drag operation.
+ * @param ev The event.
+ */
+declare var ondragend: ((this: Window, ev: DragEvent) => any) | null;
+/**
+ * Fires on the target element when the user drags the object to a valid drop target.
+ * @param ev The drag event.
+ */
+declare var ondragenter: ((this: Window, ev: DragEvent) => any) | null;
+/**
+ * Fires on the target object when the user moves the mouse out of a valid drop target during a drag operation.
+ * @param ev The drag event.
+ */
+declare var ondragleave: ((this: Window, ev: DragEvent) => any) | null;
+/**
+ * Fires on the target element continuously while the user drags the object over a valid drop target.
+ * @param ev The event.
+ */
+declare var ondragover: ((this: Window, ev: DragEvent) => any) | null;
+/**
+ * Fires on the source object when the user starts to drag a text selection or selected object.
+ * @param ev The event.
+ */
+declare var ondragstart: ((this: Window, ev: DragEvent) => any) | null;
+declare var ondrop: ((this: Window, ev: DragEvent) => any) | null;
+/**
+ * Occurs when the duration attribute is updated.
+ * @param ev The event.
+ */
+declare var ondurationchange: ((this: Window, ev: Event) => any) | null;
+/**
+ * Occurs when the media element is reset to its initial state.
+ * @param ev The event.
+ */
+declare var onemptied: ((this: Window, ev: Event) => any) | null;
+/**
+ * Occurs when the end of playback is reached.
+ * @param ev The event
+ */
+declare var onended: ((this: Window, ev: Event) => any) | null;
+/**
+ * Fires when an error occurs during object loading.
+ * @param ev The event.
+ */
+declare var onerror: OnErrorEventHandler;
+/**
+ * Fires when the object receives focus.
+ * @param ev The event.
+ */
+declare var onfocus: ((this: Window, ev: FocusEvent) => any) | null;
+declare var onformdata: ((this: Window, ev: FormDataEvent) => any) | null;
+declare var ongotpointercapture: ((this: Window, ev: PointerEvent) => any) | null;
+declare var oninput: ((this: Window, ev: Event) => any) | null;
+declare var oninvalid: ((this: Window, ev: Event) => any) | null;
+/**
+ * Fires when the user presses a key.
+ * @param ev The keyboard event
+ */
+declare var onkeydown: ((this: Window, ev: KeyboardEvent) => any) | null;
+/**
+ * Fires when the user presses an alphanumeric key.
+ * @param ev The event.
+ * @deprecated
+ */
+declare var onkeypress: ((this: Window, ev: KeyboardEvent) => any) | null;
+/**
+ * Fires when the user releases a key.
+ * @param ev The keyboard event
+ */
+declare var onkeyup: ((this: Window, ev: KeyboardEvent) => any) | null;
+/**
+ * Fires immediately after the browser loads the object.
+ * @param ev The event.
+ */
+declare var onload: ((this: Window, ev: Event) => any) | null;
+/**
+ * Occurs when media data is loaded at the current playback position.
+ * @param ev The event.
+ */
+declare var onloadeddata: ((this: Window, ev: Event) => any) | null;
+/**
+ * Occurs when the duration and dimensions of the media have been determined.
+ * @param ev The event.
+ */
+declare var onloadedmetadata: ((this: Window, ev: Event) => any) | null;
+/**
+ * Occurs when Internet Explorer begins looking for media data.
+ * @param ev The event.
+ */
+declare var onloadstart: ((this: Window, ev: Event) => any) | null;
+declare var onlostpointercapture: ((this: Window, ev: PointerEvent) => any) | null;
+/**
+ * Fires when the user clicks the object with either mouse button.
+ * @param ev The mouse event.
+ */
+declare var onmousedown: ((this: Window, ev: MouseEvent) => any) | null;
+declare var onmouseenter: ((this: Window, ev: MouseEvent) => any) | null;
+declare var onmouseleave: ((this: Window, ev: MouseEvent) => any) | null;
+/**
+ * Fires when the user moves the mouse over the object.
+ * @param ev The mouse event.
+ */
+declare var onmousemove: ((this: Window, ev: MouseEvent) => any) | null;
+/**
+ * Fires when the user moves the mouse pointer outside the boundaries of the object.
+ * @param ev The mouse event.
+ */
+declare var onmouseout: ((this: Window, ev: MouseEvent) => any) | null;
+/**
+ * Fires when the user moves the mouse pointer into the object.
+ * @param ev The mouse event.
+ */
+declare var onmouseover: ((this: Window, ev: MouseEvent) => any) | null;
+/**
+ * Fires when the user releases a mouse button while the mouse is over the object.
+ * @param ev The mouse event.
+ */
+declare var onmouseup: ((this: Window, ev: MouseEvent) => any) | null;
+declare var onpaste: ((this: Window, ev: ClipboardEvent) => any) | null;
+/**
+ * Occurs when playback is paused.
+ * @param ev The event.
+ */
+declare var onpause: ((this: Window, ev: Event) => any) | null;
+/**
+ * Occurs when the play method is requested.
+ * @param ev The event.
+ */
+declare var onplay: ((this: Window, ev: Event) => any) | null;
+/**
+ * Occurs when the audio or video has started playing.
+ * @param ev The event.
+ */
+declare var onplaying: ((this: Window, ev: Event) => any) | null;
+declare var onpointercancel: ((this: Window, ev: PointerEvent) => any) | null;
+declare var onpointerdown: ((this: Window, ev: PointerEvent) => any) | null;
+declare var onpointerenter: ((this: Window, ev: PointerEvent) => any) | null;
+declare var onpointerleave: ((this: Window, ev: PointerEvent) => any) | null;
+declare var onpointermove: ((this: Window, ev: PointerEvent) => any) | null;
+declare var onpointerout: ((this: Window, ev: PointerEvent) => any) | null;
+declare var onpointerover: ((this: Window, ev: PointerEvent) => any) | null;
+declare var onpointerup: ((this: Window, ev: PointerEvent) => any) | null;
+/**
+ * Occurs to indicate progress while downloading media data.
+ * @param ev The event.
+ */
+declare var onprogress: ((this: Window, ev: ProgressEvent) => any) | null;
+/**
+ * Occurs when the playback rate is increased or decreased.
+ * @param ev The event.
+ */
+declare var onratechange: ((this: Window, ev: Event) => any) | null;
+/**
+ * Fires when the user resets a form.
+ * @param ev The event.
+ */
+declare var onreset: ((this: Window, ev: Event) => any) | null;
+declare var onresize: ((this: Window, ev: UIEvent) => any) | null;
+/**
+ * Fires when the user repositions the scroll box in the scroll bar on the object.
+ * @param ev The event.
+ */
+declare var onscroll: ((this: Window, ev: Event) => any) | null;
+declare var onsecuritypolicyviolation: ((this: Window, ev: SecurityPolicyViolationEvent) => any) | null;
+/**
+ * Occurs when the seek operation ends.
+ * @param ev The event.
+ */
+declare var onseeked: ((this: Window, ev: Event) => any) | null;
+/**
+ * Occurs when the current playback position is moved.
+ * @param ev The event.
+ */
+declare var onseeking: ((this: Window, ev: Event) => any) | null;
+/**
+ * Fires when the current selection changes.
+ * @param ev The event.
+ */
+declare var onselect: ((this: Window, ev: Event) => any) | null;
+declare var onselectionchange: ((this: Window, ev: Event) => any) | null;
+declare var onselectstart: ((this: Window, ev: Event) => any) | null;
+declare var onslotchange: ((this: Window, ev: Event) => any) | null;
+/**
+ * Occurs when the download has stopped.
+ * @param ev The event.
+ */
+declare var onstalled: ((this: Window, ev: Event) => any) | null;
+declare var onsubmit: ((this: Window, ev: SubmitEvent) => any) | null;
+/**
+ * Occurs if the load operation has been intentionally halted.
+ * @param ev The event.
+ */
+declare var onsuspend: ((this: Window, ev: Event) => any) | null;
+/**
+ * Occurs to indicate the current playback position.
+ * @param ev The event.
+ */
+declare var ontimeupdate: ((this: Window, ev: Event) => any) | null;
+declare var ontoggle: ((this: Window, ev: Event) => any) | null;
+declare var ontouchcancel: ((this: Window, ev: TouchEvent) => any) | null | undefined;
+declare var ontouchend: ((this: Window, ev: TouchEvent) => any) | null | undefined;
+declare var ontouchmove: ((this: Window, ev: TouchEvent) => any) | null | undefined;
+declare var ontouchstart: ((this: Window, ev: TouchEvent) => any) | null | undefined;
+declare var ontransitioncancel: ((this: Window, ev: TransitionEvent) => any) | null;
+declare var ontransitionend: ((this: Window, ev: TransitionEvent) => any) | null;
+declare var ontransitionrun: ((this: Window, ev: TransitionEvent) => any) | null;
+declare var ontransitionstart: ((this: Window, ev: TransitionEvent) => any) | null;
+/**
+ * Occurs when the volume is changed, or playback is muted or unmuted.
+ * @param ev The event.
+ */
+declare var onvolumechange: ((this: Window, ev: Event) => any) | null;
+/**
+ * Occurs when playback stops because the next frame of a video resource is not available.
+ * @param ev The event.
+ */
+declare var onwaiting: ((this: Window, ev: Event) => any) | null;
+/** @deprecated This is a legacy alias of \`onanimationend\`. */
+declare var onwebkitanimationend: ((this: Window, ev: Event) => any) | null;
+/** @deprecated This is a legacy alias of \`onanimationiteration\`. */
+declare var onwebkitanimationiteration: ((this: Window, ev: Event) => any) | null;
+/** @deprecated This is a legacy alias of \`onanimationstart\`. */
+declare var onwebkitanimationstart: ((this: Window, ev: Event) => any) | null;
+/** @deprecated This is a legacy alias of \`ontransitionend\`. */
+declare var onwebkittransitionend: ((this: Window, ev: Event) => any) | null;
+declare var onwheel: ((this: Window, ev: WheelEvent) => any) | null;
+declare var onafterprint: ((this: Window, ev: Event) => any) | null;
+declare var onbeforeprint: ((this: Window, ev: Event) => any) | null;
+declare var onbeforeunload: ((this: Window, ev: BeforeUnloadEvent) => any) | null;
+declare var ongamepadconnected: ((this: Window, ev: GamepadEvent) => any) | null;
+declare var ongamepaddisconnected: ((this: Window, ev: GamepadEvent) => any) | null;
+declare var onhashchange: ((this: Window, ev: HashChangeEvent) => any) | null;
+declare var onlanguagechange: ((this: Window, ev: Event) => any) | null;
+declare var onmessage: ((this: Window, ev: MessageEvent) => any) | null;
+declare var onmessageerror: ((this: Window, ev: MessageEvent) => any) | null;
+declare var onoffline: ((this: Window, ev: Event) => any) | null;
+declare var ononline: ((this: Window, ev: Event) => any) | null;
+declare var onpagehide: ((this: Window, ev: PageTransitionEvent) => any) | null;
+declare var onpageshow: ((this: Window, ev: PageTransitionEvent) => any) | null;
+declare var onpopstate: ((this: Window, ev: PopStateEvent) => any) | null;
+declare var onrejectionhandled: ((this: Window, ev: PromiseRejectionEvent) => any) | null;
+declare var onstorage: ((this: Window, ev: StorageEvent) => any) | null;
+declare var onunhandledrejection: ((this: Window, ev: PromiseRejectionEvent) => any) | null;
+declare var onunload: ((this: Window, ev: Event) => any) | null;
+declare var localStorage: Storage;
+/** Available only in secure contexts. */
+declare var caches: CacheStorage;
+declare var crossOriginIsolated: boolean;
+declare var crypto: Crypto;
+declare var indexedDB: IDBFactory;
+declare var isSecureContext: boolean;
+declare var origin: string;
+declare var performance: Performance;
+declare function atob(data: string): string;
+declare function btoa(data: string): string;
+declare function clearInterval(id: number | undefined): void;
+declare function clearTimeout(id: number | undefined): void;
+declare function createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap>;
+declare function createImageBitmap(image: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;
+declare function fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
+declare function queueMicrotask(callback: VoidFunction): void;
+declare function reportError(e: any): void;
+declare function setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
+declare function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
+declare function structuredClone(value: any, options?: StructuredSerializeOptions): any;
+declare var sessionStorage: Storage;
+declare function addEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+declare function addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+declare function removeEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+declare function removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+type AlgorithmIdentifier = Algorithm | string;
+type BigInteger = Uint8Array;
+type BinaryData = ArrayBuffer | ArrayBufferView;
+type BlobPart = BufferSource | Blob | string;
+type BodyInit = ReadableStream | XMLHttpRequestBodyInit;
+type BufferSource = ArrayBufferView | ArrayBuffer;
+type COSEAlgorithmIdentifier = number;
+type CSSNumberish = number;
+type CanvasImageSource = HTMLOrSVGImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap | OffscreenCanvas;
+type ClipboardItemData = Promise<string | Blob>;
+type ClipboardItems = ClipboardItem[];
+type ConstrainBoolean = boolean | ConstrainBooleanParameters;
+type ConstrainDOMString = string | string[] | ConstrainDOMStringParameters;
+type ConstrainDouble = number | ConstrainDoubleRange;
+type ConstrainULong = number | ConstrainULongRange;
+type DOMHighResTimeStamp = number;
+type EpochTimeStamp = number;
+type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
+type Float32List = Float32Array | GLfloat[];
+type FormDataEntryValue = File | string;
+type GLbitfield = number;
+type GLboolean = boolean;
+type GLclampf = number;
+type GLenum = number;
+type GLfloat = number;
+type GLint = number;
+type GLint64 = number;
+type GLintptr = number;
+type GLsizei = number;
+type GLsizeiptr = number;
+type GLuint = number;
+type GLuint64 = number;
+type HTMLOrSVGImageElement = HTMLImageElement | SVGImageElement;
+type HTMLOrSVGScriptElement = HTMLScriptElement | SVGScriptElement;
+type HashAlgorithmIdentifier = AlgorithmIdentifier;
+type HeadersInit = [string, string][] | Record<string, string> | Headers;
+type IDBValidKey = number | string | Date | BufferSource | IDBValidKey[];
+type ImageBitmapSource = CanvasImageSource | Blob | ImageData;
+type Int32List = Int32Array | GLint[];
+type LineAndPositionSetting = number | AutoKeyword;
+type MediaProvider = MediaStream | MediaSource | Blob;
+type MessageEventSource = WindowProxy | MessagePort | ServiceWorker;
+type MutationRecordType = "attributes" | "characterData" | "childList";
+type NamedCurve = string;
+type OffscreenRenderingContext = OffscreenCanvasRenderingContext2D | ImageBitmapRenderingContext | WebGLRenderingContext | WebGL2RenderingContext;
+type OnBeforeUnloadEventHandler = OnBeforeUnloadEventHandlerNonNull | null;
+type OnErrorEventHandler = OnErrorEventHandlerNonNull | null;
+type PerformanceEntryList = PerformanceEntry[];
+type ReadableStreamController<T> = ReadableStreamDefaultController<T> | ReadableByteStreamController;
+type ReadableStreamReadResult<T> = ReadableStreamReadValueResult<T> | ReadableStreamReadDoneResult<T>;
+type ReadableStreamReader<T> = ReadableStreamDefaultReader<T> | ReadableStreamBYOBReader;
+type RenderingContext = CanvasRenderingContext2D | ImageBitmapRenderingContext | WebGLRenderingContext | WebGL2RenderingContext;
+type RequestInfo = Request | string;
+type TexImageSource = ImageBitmap | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas;
+type TimerHandler = string | Function;
+type Transferable = OffscreenCanvas | ImageBitmap | MessagePort | ReadableStream | WritableStream | TransformStream | ArrayBuffer;
+type Uint32List = Uint32Array | GLuint[];
+type VibratePattern = number | number[];
+type WindowProxy = Window;
+type XMLHttpRequestBodyInit = Blob | BufferSource | FormData | URLSearchParams | string;
+type AlignSetting = "center" | "end" | "left" | "right" | "start";
+type AnimationPlayState = "finished" | "idle" | "paused" | "running";
+type AnimationReplaceState = "active" | "persisted" | "removed";
+type AppendMode = "segments" | "sequence";
+type AttestationConveyancePreference = "direct" | "enterprise" | "indirect" | "none";
+type AudioContextLatencyCategory = "balanced" | "interactive" | "playback";
+type AudioContextState = "closed" | "running" | "suspended";
+type AuthenticatorAttachment = "cross-platform" | "platform";
+type AuthenticatorTransport = "ble" | "hybrid" | "internal" | "nfc" | "usb";
+type AutoKeyword = "auto";
+type AutomationRate = "a-rate" | "k-rate";
+type BinaryType = "arraybuffer" | "blob";
+type BiquadFilterType = "allpass" | "bandpass" | "highpass" | "highshelf" | "lowpass" | "lowshelf" | "notch" | "peaking";
+type CanPlayTypeResult = "" | "maybe" | "probably";
+type CanvasDirection = "inherit" | "ltr" | "rtl";
+type CanvasFillRule = "evenodd" | "nonzero";
+type CanvasFontKerning = "auto" | "none" | "normal";
+type CanvasFontStretch = "condensed" | "expanded" | "extra-condensed" | "extra-expanded" | "normal" | "semi-condensed" | "semi-expanded" | "ultra-condensed" | "ultra-expanded";
+type CanvasFontVariantCaps = "all-petite-caps" | "all-small-caps" | "normal" | "petite-caps" | "small-caps" | "titling-caps" | "unicase";
+type CanvasLineCap = "butt" | "round" | "square";
+type CanvasLineJoin = "bevel" | "miter" | "round";
+type CanvasTextAlign = "center" | "end" | "left" | "right" | "start";
+type CanvasTextBaseline = "alphabetic" | "bottom" | "hanging" | "ideographic" | "middle" | "top";
+type CanvasTextRendering = "auto" | "geometricPrecision" | "optimizeLegibility" | "optimizeSpeed";
+type ChannelCountMode = "clamped-max" | "explicit" | "max";
+type ChannelInterpretation = "discrete" | "speakers";
+type ClientTypes = "all" | "sharedworker" | "window" | "worker";
+type ColorGamut = "p3" | "rec2020" | "srgb";
+type ColorSpaceConversion = "default" | "none";
+type CompositeOperation = "accumulate" | "add" | "replace";
+type CompositeOperationOrAuto = "accumulate" | "add" | "auto" | "replace";
+type CredentialMediationRequirement = "optional" | "required" | "silent";
+type DOMParserSupportedType = "application/xhtml+xml" | "application/xml" | "image/svg+xml" | "text/html" | "text/xml";
+type DirectionSetting = "" | "lr" | "rl";
+type DisplayCaptureSurfaceType = "browser" | "monitor" | "window";
+type DistanceModelType = "exponential" | "inverse" | "linear";
+type DocumentReadyState = "complete" | "interactive" | "loading";
+type DocumentVisibilityState = "hidden" | "visible";
+type EndOfStreamError = "decode" | "network";
+type EndingType = "native" | "transparent";
+type FileSystemHandleKind = "directory" | "file";
+type FillMode = "auto" | "backwards" | "both" | "forwards" | "none";
+type FontDisplay = "auto" | "block" | "fallback" | "optional" | "swap";
+type FontFaceLoadStatus = "error" | "loaded" | "loading" | "unloaded";
+type FontFaceSetLoadStatus = "loaded" | "loading";
+type FullscreenNavigationUI = "auto" | "hide" | "show";
+type GamepadHapticActuatorType = "vibration";
+type GamepadMappingType = "" | "standard" | "xr-standard";
+type GlobalCompositeOperation = "color" | "color-burn" | "color-dodge" | "copy" | "darken" | "destination-atop" | "destination-in" | "destination-out" | "destination-over" | "difference" | "exclusion" | "hard-light" | "hue" | "lighten" | "lighter" | "luminosity" | "multiply" | "overlay" | "saturation" | "screen" | "soft-light" | "source-atop" | "source-in" | "source-out" | "source-over" | "xor";
+type HdrMetadataType = "smpteSt2086" | "smpteSt2094-10" | "smpteSt2094-40";
+type IDBCursorDirection = "next" | "nextunique" | "prev" | "prevunique";
+type IDBRequestReadyState = "done" | "pending";
+type IDBTransactionDurability = "default" | "relaxed" | "strict";
+type IDBTransactionMode = "readonly" | "readwrite" | "versionchange";
+type ImageOrientation = "flipY" | "from-image";
+type ImageSmoothingQuality = "high" | "low" | "medium";
+type InsertPosition = "afterbegin" | "afterend" | "beforebegin" | "beforeend";
+type IterationCompositeOperation = "accumulate" | "replace";
+type KeyFormat = "jwk" | "pkcs8" | "raw" | "spki";
+type KeyType = "private" | "public" | "secret";
+type KeyUsage = "decrypt" | "deriveBits" | "deriveKey" | "encrypt" | "sign" | "unwrapKey" | "verify" | "wrapKey";
+type LineAlignSetting = "center" | "end" | "start";
+type LockMode = "exclusive" | "shared";
+type MIDIPortConnectionState = "closed" | "open" | "pending";
+type MIDIPortDeviceState = "connected" | "disconnected";
+type MIDIPortType = "input" | "output";
+type MediaDecodingType = "file" | "media-source" | "webrtc";
+type MediaDeviceKind = "audioinput" | "audiooutput" | "videoinput";
+type MediaEncodingType = "record" | "webrtc";
+type MediaKeyMessageType = "individualization-request" | "license-release" | "license-renewal" | "license-request";
+type MediaKeySessionClosedReason = "closed-by-application" | "hardware-context-reset" | "internal-error" | "release-acknowledged" | "resource-evicted";
+type MediaKeySessionType = "persistent-license" | "temporary";
+type MediaKeyStatus = "expired" | "internal-error" | "output-downscaled" | "output-restricted" | "released" | "status-pending" | "usable" | "usable-in-future";
+type MediaKeysRequirement = "not-allowed" | "optional" | "required";
+type MediaSessionAction = "nexttrack" | "pause" | "play" | "previoustrack" | "seekbackward" | "seekforward" | "seekto" | "skipad" | "stop";
+type MediaSessionPlaybackState = "none" | "paused" | "playing";
+type MediaStreamTrackState = "ended" | "live";
+type NavigationTimingType = "back_forward" | "navigate" | "prerender" | "reload";
+type NotificationDirection = "auto" | "ltr" | "rtl";
+type NotificationPermission = "default" | "denied" | "granted";
+type OffscreenRenderingContextId = "2d" | "bitmaprenderer" | "webgl" | "webgl2" | "webgpu";
+type OrientationLockType = "any" | "landscape" | "landscape-primary" | "landscape-secondary" | "natural" | "portrait" | "portrait-primary" | "portrait-secondary";
+type OrientationType = "landscape-primary" | "landscape-secondary" | "portrait-primary" | "portrait-secondary";
+type OscillatorType = "custom" | "sawtooth" | "sine" | "square" | "triangle";
+type OverSampleType = "2x" | "4x" | "none";
+type PanningModelType = "HRTF" | "equalpower";
+type PaymentComplete = "fail" | "success" | "unknown";
+type PermissionName = "geolocation" | "notifications" | "persistent-storage" | "push" | "screen-wake-lock" | "xr-spatial-tracking";
+type PermissionState = "denied" | "granted" | "prompt";
+type PlaybackDirection = "alternate" | "alternate-reverse" | "normal" | "reverse";
+type PositionAlignSetting = "auto" | "center" | "line-left" | "line-right";
+type PredefinedColorSpace = "display-p3" | "srgb";
+type PremultiplyAlpha = "default" | "none" | "premultiply";
+type PresentationStyle = "attachment" | "inline" | "unspecified";
+type PublicKeyCredentialType = "public-key";
+type PushEncryptionKeyName = "auth" | "p256dh";
+type RTCBundlePolicy = "balanced" | "max-bundle" | "max-compat";
+type RTCDataChannelState = "closed" | "closing" | "connecting" | "open";
+type RTCDegradationPreference = "balanced" | "maintain-framerate" | "maintain-resolution";
+type RTCDtlsTransportState = "closed" | "connected" | "connecting" | "failed" | "new";
+type RTCEncodedVideoFrameType = "delta" | "empty" | "key";
+type RTCErrorDetailType = "data-channel-failure" | "dtls-failure" | "fingerprint-failure" | "hardware-encoder-error" | "hardware-encoder-not-available" | "sctp-failure" | "sdp-syntax-error";
+type RTCIceCandidateType = "host" | "prflx" | "relay" | "srflx";
+type RTCIceComponent = "rtcp" | "rtp";
+type RTCIceConnectionState = "checking" | "closed" | "completed" | "connected" | "disconnected" | "failed" | "new";
+type RTCIceGathererState = "complete" | "gathering" | "new";
+type RTCIceGatheringState = "complete" | "gathering" | "new";
+type RTCIceProtocol = "tcp" | "udp";
+type RTCIceTcpCandidateType = "active" | "passive" | "so";
+type RTCIceTransportPolicy = "all" | "relay";
+type RTCIceTransportState = "checking" | "closed" | "completed" | "connected" | "disconnected" | "failed" | "new";
+type RTCPeerConnectionState = "closed" | "connected" | "connecting" | "disconnected" | "failed" | "new";
+type RTCPriorityType = "high" | "low" | "medium" | "very-low";
+type RTCRtcpMuxPolicy = "require";
+type RTCRtpTransceiverDirection = "inactive" | "recvonly" | "sendonly" | "sendrecv" | "stopped";
+type RTCSctpTransportState = "closed" | "connected" | "connecting";
+type RTCSdpType = "answer" | "offer" | "pranswer" | "rollback";
+type RTCSignalingState = "closed" | "have-local-offer" | "have-local-pranswer" | "have-remote-offer" | "have-remote-pranswer" | "stable";
+type RTCStatsIceCandidatePairState = "failed" | "frozen" | "in-progress" | "inprogress" | "succeeded" | "waiting";
+type RTCStatsType = "candidate-pair" | "certificate" | "codec" | "data-channel" | "inbound-rtp" | "local-candidate" | "media-source" | "outbound-rtp" | "peer-connection" | "remote-candidate" | "remote-inbound-rtp" | "remote-outbound-rtp" | "track" | "transport";
+type ReadableStreamReaderMode = "byob";
+type ReadableStreamType = "bytes";
+type ReadyState = "closed" | "ended" | "open";
+type RecordingState = "inactive" | "paused" | "recording";
+type ReferrerPolicy = "" | "no-referrer" | "no-referrer-when-downgrade" | "origin" | "origin-when-cross-origin" | "same-origin" | "strict-origin" | "strict-origin-when-cross-origin" | "unsafe-url";
+type RemotePlaybackState = "connected" | "connecting" | "disconnected";
+type RequestCache = "default" | "force-cache" | "no-cache" | "no-store" | "only-if-cached" | "reload";
+type RequestCredentials = "include" | "omit" | "same-origin";
+type RequestDestination = "" | "audio" | "audioworklet" | "document" | "embed" | "font" | "frame" | "iframe" | "image" | "manifest" | "object" | "paintworklet" | "report" | "script" | "sharedworker" | "style" | "track" | "video" | "worker" | "xslt";
+type RequestMode = "cors" | "navigate" | "no-cors" | "same-origin";
+type RequestRedirect = "error" | "follow" | "manual";
+type ResidentKeyRequirement = "discouraged" | "preferred" | "required";
+type ResizeObserverBoxOptions = "border-box" | "content-box" | "device-pixel-content-box";
+type ResizeQuality = "high" | "low" | "medium" | "pixelated";
+type ResponseType = "basic" | "cors" | "default" | "error" | "opaque" | "opaqueredirect";
+type ScrollBehavior = "auto" | "smooth";
+type ScrollLogicalPosition = "center" | "end" | "nearest" | "start";
+type ScrollRestoration = "auto" | "manual";
+type ScrollSetting = "" | "up";
+type SecurityPolicyViolationEventDisposition = "enforce" | "report";
+type SelectionMode = "end" | "preserve" | "select" | "start";
+type ServiceWorkerState = "activated" | "activating" | "installed" | "installing" | "parsed" | "redundant";
+type ServiceWorkerUpdateViaCache = "all" | "imports" | "none";
+type ShadowRootMode = "closed" | "open";
+type SlotAssignmentMode = "manual" | "named";
+type SpeechSynthesisErrorCode = "audio-busy" | "audio-hardware" | "canceled" | "interrupted" | "invalid-argument" | "language-unavailable" | "network" | "not-allowed" | "synthesis-failed" | "synthesis-unavailable" | "text-too-long" | "voice-unavailable";
+type TextTrackKind = "captions" | "chapters" | "descriptions" | "metadata" | "subtitles";
+type TextTrackMode = "disabled" | "hidden" | "showing";
+type TouchType = "direct" | "stylus";
+type TransferFunction = "hlg" | "pq" | "srgb";
+type UserVerificationRequirement = "discouraged" | "preferred" | "required";
+type VideoColorPrimaries = "bt470bg" | "bt709" | "smpte170m";
+type VideoFacingModeEnum = "environment" | "left" | "right" | "user";
+type VideoMatrixCoefficients = "bt470bg" | "bt709" | "rgb" | "smpte170m";
+type VideoTransferCharacteristics = "bt709" | "iec61966-2-1" | "smpte170m";
+type WebGLPowerPreference = "default" | "high-performance" | "low-power";
+type WorkerType = "classic" | "module";
+type XMLHttpRequestResponseType = "" | "arraybuffer" | "blob" | "document" | "json" | "text";
+`; $i["lib.dom.iterable.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/////////////////////////////
+/// Window Iterable APIs
+/////////////////////////////
+
+interface AudioParam {
+    setValueCurveAtTime(values: Iterable<number>, startTime: number, duration: number): AudioParam;
+}
+
+interface AudioParamMap extends ReadonlyMap<string, AudioParam> {
+}
+
+interface BaseAudioContext {
+    createIIRFilter(feedforward: Iterable<number>, feedback: Iterable<number>): IIRFilterNode;
+    createPeriodicWave(real: Iterable<number>, imag: Iterable<number>, constraints?: PeriodicWaveConstraints): PeriodicWave;
+}
+
+interface CSSKeyframesRule {
+    [Symbol.iterator](): IterableIterator<CSSKeyframeRule>;
+}
+
+interface CSSRuleList {
+    [Symbol.iterator](): IterableIterator<CSSRule>;
+}
+
+interface CSSStyleDeclaration {
+    [Symbol.iterator](): IterableIterator<string>;
+}
+
+interface Cache {
+    addAll(requests: Iterable<RequestInfo>): Promise<void>;
+}
+
+interface CanvasPath {
+    roundRect(x: number, y: number, w: number, h: number, radii?: number | DOMPointInit | Iterable<number | DOMPointInit>): void;
+}
+
+interface CanvasPathDrawingStyles {
+    setLineDash(segments: Iterable<number>): void;
+}
+
+interface DOMRectList {
+    [Symbol.iterator](): IterableIterator<DOMRect>;
+}
+
+interface DOMStringList {
+    [Symbol.iterator](): IterableIterator<string>;
+}
+
+interface DOMTokenList {
+    [Symbol.iterator](): IterableIterator<string>;
+    entries(): IterableIterator<[number, string]>;
+    keys(): IterableIterator<number>;
+    values(): IterableIterator<string>;
+}
+
+interface DataTransferItemList {
+    [Symbol.iterator](): IterableIterator<DataTransferItem>;
+}
+
+interface EventCounts extends ReadonlyMap<string, number> {
+}
+
+interface FileList {
+    [Symbol.iterator](): IterableIterator<File>;
+}
+
+interface FontFaceSet extends Set<FontFace> {
+}
+
+interface FormData {
+    [Symbol.iterator](): IterableIterator<[string, FormDataEntryValue]>;
+    /** Returns an array of key, value pairs for every entry in the list. */
+    entries(): IterableIterator<[string, FormDataEntryValue]>;
+    /** Returns a list of keys in the list. */
+    keys(): IterableIterator<string>;
+    /** Returns a list of values in the list. */
+    values(): IterableIterator<FormDataEntryValue>;
+}
+
+interface HTMLAllCollection {
+    [Symbol.iterator](): IterableIterator<Element>;
+}
+
+interface HTMLCollectionBase {
+    [Symbol.iterator](): IterableIterator<Element>;
+}
+
+interface HTMLCollectionOf<T extends Element> {
+    [Symbol.iterator](): IterableIterator<T>;
+}
+
+interface HTMLFormElement {
+    [Symbol.iterator](): IterableIterator<Element>;
+}
+
+interface HTMLSelectElement {
+    [Symbol.iterator](): IterableIterator<HTMLOptionElement>;
+}
+
+interface Headers {
+    [Symbol.iterator](): IterableIterator<[string, string]>;
+    /** Returns an iterator allowing to go through all key/value pairs contained in this object. */
+    entries(): IterableIterator<[string, string]>;
+    /** Returns an iterator allowing to go through all keys of the key/value pairs contained in this object. */
+    keys(): IterableIterator<string>;
+    /** Returns an iterator allowing to go through all values of the key/value pairs contained in this object. */
+    values(): IterableIterator<string>;
+}
+
+interface IDBDatabase {
+    /** Returns a new transaction with the given mode ("readonly" or "readwrite") and scope which can be a single object store name or an array of names. */
+    transaction(storeNames: string | Iterable<string>, mode?: IDBTransactionMode, options?: IDBTransactionOptions): IDBTransaction;
+}
+
+interface IDBObjectStore {
+    /**
+     * Creates a new index in store with the given name, keyPath and options and returns a new IDBIndex. If the keyPath and options define constraints that cannot be satisfied with the data already in store the upgrade transaction will abort with a "ConstraintError" DOMException.
+     *
+     * Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.
+     */
+    createIndex(name: string, keyPath: string | Iterable<string>, options?: IDBIndexParameters): IDBIndex;
+}
+
+interface MIDIInputMap extends ReadonlyMap<string, MIDIInput> {
+}
+
+interface MIDIOutput {
+    send(data: Iterable<number>, timestamp?: DOMHighResTimeStamp): void;
+}
+
+interface MIDIOutputMap extends ReadonlyMap<string, MIDIOutput> {
+}
+
+interface MediaKeyStatusMap {
+    [Symbol.iterator](): IterableIterator<[BufferSource, MediaKeyStatus]>;
+    entries(): IterableIterator<[BufferSource, MediaKeyStatus]>;
+    keys(): IterableIterator<BufferSource>;
+    values(): IterableIterator<MediaKeyStatus>;
+}
+
+interface MediaList {
+    [Symbol.iterator](): IterableIterator<string>;
+}
+
+interface MessageEvent<T = any> {
+    /** @deprecated */
+    initMessageEvent(type: string, bubbles?: boolean, cancelable?: boolean, data?: any, origin?: string, lastEventId?: string, source?: MessageEventSource | null, ports?: Iterable<MessagePort>): void;
+}
+
+interface MimeTypeArray {
+    [Symbol.iterator](): IterableIterator<MimeType>;
+}
+
+interface NamedNodeMap {
+    [Symbol.iterator](): IterableIterator<Attr>;
+}
+
+interface Navigator {
+    /** Available only in secure contexts. */
+    requestMediaKeySystemAccess(keySystem: string, supportedConfigurations: Iterable<MediaKeySystemConfiguration>): Promise<MediaKeySystemAccess>;
+    vibrate(pattern: Iterable<number>): boolean;
+}
+
+interface NodeList {
+    [Symbol.iterator](): IterableIterator<Node>;
+    /** Returns an array of key, value pairs for every entry in the list. */
+    entries(): IterableIterator<[number, Node]>;
+    /** Returns an list of keys in the list. */
+    keys(): IterableIterator<number>;
+    /** Returns an list of values in the list. */
+    values(): IterableIterator<Node>;
+}
+
+interface NodeListOf<TNode extends Node> {
+    [Symbol.iterator](): IterableIterator<TNode>;
+    /** Returns an array of key, value pairs for every entry in the list. */
+    entries(): IterableIterator<[number, TNode]>;
+    /** Returns an list of keys in the list. */
+    keys(): IterableIterator<number>;
+    /** Returns an list of values in the list. */
+    values(): IterableIterator<TNode>;
+}
+
+interface Plugin {
+    [Symbol.iterator](): IterableIterator<MimeType>;
+}
+
+interface PluginArray {
+    [Symbol.iterator](): IterableIterator<Plugin>;
+}
+
+interface RTCRtpTransceiver {
+    setCodecPreferences(codecs: Iterable<RTCRtpCodecCapability>): void;
+}
+
+interface RTCStatsReport extends ReadonlyMap<string, any> {
+}
+
+interface SVGLengthList {
+    [Symbol.iterator](): IterableIterator<SVGLength>;
+}
+
+interface SVGNumberList {
+    [Symbol.iterator](): IterableIterator<SVGNumber>;
+}
+
+interface SVGPointList {
+    [Symbol.iterator](): IterableIterator<DOMPoint>;
+}
+
+interface SVGStringList {
+    [Symbol.iterator](): IterableIterator<string>;
+}
+
+interface SVGTransformList {
+    [Symbol.iterator](): IterableIterator<SVGTransform>;
+}
+
+interface SourceBufferList {
+    [Symbol.iterator](): IterableIterator<SourceBuffer>;
+}
+
+interface SpeechRecognitionResult {
+    [Symbol.iterator](): IterableIterator<SpeechRecognitionAlternative>;
+}
+
+interface SpeechRecognitionResultList {
+    [Symbol.iterator](): IterableIterator<SpeechRecognitionResult>;
+}
+
+interface StyleSheetList {
+    [Symbol.iterator](): IterableIterator<CSSStyleSheet>;
+}
+
+interface SubtleCrypto {
+    deriveKey(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, derivedKeyType: AlgorithmIdentifier | AesDerivedKeyParams | HmacImportParams | HkdfParams | Pbkdf2Params, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKey>;
+    generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKeyPair>;
+    generateKey(algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKey>;
+    generateKey(algorithm: AlgorithmIdentifier, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKeyPair | CryptoKey>;
+    importKey(format: "jwk", keyData: JsonWebKey, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKey>;
+    importKey(format: Exclude<KeyFormat, "jwk">, keyData: BufferSource, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKey>;
+    unwrapKey(format: KeyFormat, wrappedKey: BufferSource, unwrappingKey: CryptoKey, unwrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, unwrappedKeyAlgorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKey>;
+}
+
+interface TextTrackCueList {
+    [Symbol.iterator](): IterableIterator<TextTrackCue>;
+}
+
+interface TextTrackList {
+    [Symbol.iterator](): IterableIterator<TextTrack>;
+}
+
+interface TouchList {
+    [Symbol.iterator](): IterableIterator<Touch>;
+}
+
+interface URLSearchParams {
+    [Symbol.iterator](): IterableIterator<[string, string]>;
+    /** Returns an array of key, value pairs for every entry in the search params. */
+    entries(): IterableIterator<[string, string]>;
+    /** Returns a list of keys in the search params. */
+    keys(): IterableIterator<string>;
+    /** Returns a list of values in the search params. */
+    values(): IterableIterator<string>;
+}
+
+interface WEBGL_draw_buffers {
+    drawBuffersWEBGL(buffers: Iterable<GLenum>): void;
+}
+
+interface WEBGL_multi_draw {
+    multiDrawArraysInstancedWEBGL(mode: GLenum, firstsList: Int32Array | Iterable<GLint>, firstsOffset: GLuint, countsList: Int32Array | Iterable<GLsizei>, countsOffset: GLuint, instanceCountsList: Int32Array | Iterable<GLsizei>, instanceCountsOffset: GLuint, drawcount: GLsizei): void;
+    multiDrawArraysWEBGL(mode: GLenum, firstsList: Int32Array | Iterable<GLint>, firstsOffset: GLuint, countsList: Int32Array | Iterable<GLsizei>, countsOffset: GLuint, drawcount: GLsizei): void;
+    multiDrawElementsInstancedWEBGL(mode: GLenum, countsList: Int32Array | Iterable<GLsizei>, countsOffset: GLuint, type: GLenum, offsetsList: Int32Array | Iterable<GLsizei>, offsetsOffset: GLuint, instanceCountsList: Int32Array | Iterable<GLsizei>, instanceCountsOffset: GLuint, drawcount: GLsizei): void;
+    multiDrawElementsWEBGL(mode: GLenum, countsList: Int32Array | Iterable<GLsizei>, countsOffset: GLuint, type: GLenum, offsetsList: Int32Array | Iterable<GLsizei>, offsetsOffset: GLuint, drawcount: GLsizei): void;
+}
+
+interface WebGL2RenderingContextBase {
+    clearBufferfv(buffer: GLenum, drawbuffer: GLint, values: Iterable<GLfloat>, srcOffset?: GLuint): void;
+    clearBufferiv(buffer: GLenum, drawbuffer: GLint, values: Iterable<GLint>, srcOffset?: GLuint): void;
+    clearBufferuiv(buffer: GLenum, drawbuffer: GLint, values: Iterable<GLuint>, srcOffset?: GLuint): void;
+    drawBuffers(buffers: Iterable<GLenum>): void;
+    getActiveUniforms(program: WebGLProgram, uniformIndices: Iterable<GLuint>, pname: GLenum): any;
+    getUniformIndices(program: WebGLProgram, uniformNames: Iterable<string>): Iterable<GLuint> | null;
+    invalidateFramebuffer(target: GLenum, attachments: Iterable<GLenum>): void;
+    invalidateSubFramebuffer(target: GLenum, attachments: Iterable<GLenum>, x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
+    transformFeedbackVaryings(program: WebGLProgram, varyings: Iterable<string>, bufferMode: GLenum): void;
+    uniform1uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform2uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform3uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform4uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix2x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix2x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix3x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix3x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix4x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix4x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    vertexAttribI4iv(index: GLuint, values: Iterable<GLint>): void;
+    vertexAttribI4uiv(index: GLuint, values: Iterable<GLuint>): void;
+}
+
+interface WebGL2RenderingContextOverloads {
+    uniform1fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform1iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform2fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform2iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform3fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform3iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform4fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform4iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+}
+
+interface WebGLRenderingContextBase {
+    vertexAttrib1fv(index: GLuint, values: Iterable<GLfloat>): void;
+    vertexAttrib2fv(index: GLuint, values: Iterable<GLfloat>): void;
+    vertexAttrib3fv(index: GLuint, values: Iterable<GLfloat>): void;
+    vertexAttrib4fv(index: GLuint, values: Iterable<GLfloat>): void;
+}
+
+interface WebGLRenderingContextOverloads {
+    uniform1fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;
+    uniform1iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;
+    uniform2fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;
+    uniform2iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;
+    uniform3fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;
+    uniform3iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;
+    uniform4fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;
+    uniform4iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;
+    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Iterable<GLfloat>): void;
+    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Iterable<GLfloat>): void;
+    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Iterable<GLfloat>): void;
+}
+`; $i["lib.es2015.collection.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface Map<K, V> {
+
+    clear(): void;
+    /**
+     * @returns true if an element in the Map existed and has been removed, or false if the element does not exist.
+     */
+    delete(key: K): boolean;
+    /**
+     * Executes a provided function once per each key/value pair in the Map, in insertion order.
+     */
+    forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void;
+    /**
+     * Returns a specified element from the Map object. If the value that is associated to the provided key is an object, then you will get a reference to that object and any change made to that object will effectively modify it inside the Map.
+     * @returns Returns the element associated with the specified key. If no element is associated with the specified key, undefined is returned.
+     */
+    get(key: K): V | undefined;
+    /**
+     * @returns boolean indicating whether an element with the specified key exists or not.
+     */
+    has(key: K): boolean;
+    /**
+     * Adds a new element with a specified key and value to the Map. If an element with the same key already exists, the element will be updated.
+     */
+    set(key: K, value: V): this;
+    /**
+     * @returns the number of elements in the Map.
+     */
+    readonly size: number;
+}
+
+interface MapConstructor {
+    new(): Map<any, any>;
+    new <K, V>(entries?: readonly (readonly [K, V])[] | null): Map<K, V>;
+    readonly prototype: Map<any, any>;
+}
+declare var Map: MapConstructor;
+
+interface ReadonlyMap<K, V> {
+    forEach(callbackfn: (value: V, key: K, map: ReadonlyMap<K, V>) => void, thisArg?: any): void;
+    get(key: K): V | undefined;
+    has(key: K): boolean;
+    readonly size: number;
+}
+
+interface WeakMap<K extends object, V> {
+    /**
+     * Removes the specified element from the WeakMap.
+     * @returns true if the element was successfully removed, or false if it was not present.
+     */
+    delete(key: K): boolean;
+    /**
+     * @returns a specified element.
+     */
+    get(key: K): V | undefined;
+    /**
+     * @returns a boolean indicating whether an element with the specified key exists or not.
+     */
+    has(key: K): boolean;
+    /**
+     * Adds a new element with a specified key and value.
+     * @param key Must be an object.
+     */
+    set(key: K, value: V): this;
+}
+
+interface WeakMapConstructor {
+    new <K extends object = object, V = any>(entries?: readonly [K, V][] | null): WeakMap<K, V>;
+    readonly prototype: WeakMap<object, any>;
+}
+declare var WeakMap: WeakMapConstructor;
+
+interface Set<T> {
+    /**
+     * Appends a new element with a specified value to the end of the Set.
+     */
+    add(value: T): this;
+
+    clear(): void;
+    /**
+     * Removes a specified value from the Set.
+     * @returns Returns true if an element in the Set existed and has been removed, or false if the element does not exist.
+     */
+    delete(value: T): boolean;
+    /**
+     * Executes a provided function once per each value in the Set object, in insertion order.
+     */
+    forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any): void;
+    /**
+     * @returns a boolean indicating whether an element with the specified value exists in the Set or not.
+     */
+    has(value: T): boolean;
+    /**
+     * @returns the number of (unique) elements in Set.
+     */
+    readonly size: number;
+}
+
+interface SetConstructor {
+    new <T = any>(values?: readonly T[] | null): Set<T>;
+    readonly prototype: Set<any>;
+}
+declare var Set: SetConstructor;
+
+interface ReadonlySet<T> {
+    forEach(callbackfn: (value: T, value2: T, set: ReadonlySet<T>) => void, thisArg?: any): void;
+    has(value: T): boolean;
+    readonly size: number;
+}
+
+interface WeakSet<T extends object> {
+    /**
+     * Appends a new object to the end of the WeakSet.
+     */
+    add(value: T): this;
+    /**
+     * Removes the specified element from the WeakSet.
+     * @returns Returns true if the element existed and has been removed, or false if the element does not exist.
+     */
+    delete(value: T): boolean;
+    /**
+     * @returns a boolean indicating whether an object exists in the WeakSet or not.
+     */
+    has(value: T): boolean;
+}
+
+interface WeakSetConstructor {
+    new <T extends object = object>(values?: readonly T[] | null): WeakSet<T>;
+    readonly prototype: WeakSet<object>;
+}
+declare var WeakSet: WeakSetConstructor;
+`; $i["lib.es2015.core.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface Array<T> {
+    /**
+     * Returns the value of the first element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found, find
+     * immediately returns that element value. Otherwise, find returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    find<S extends T>(predicate: (value: T, index: number, obj: T[]) => value is S, thisArg?: any): S | undefined;
+    find(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): T | undefined;
+
+    /**
+     * Returns the index of the first element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findIndex(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): number;
+
+    /**
+     * Changes all array elements from \`start\` to \`end\` index to a static \`value\` and returns the modified array
+     * @param value value to fill array section with
+     * @param start index to start filling the array at. If start is negative, it is treated as
+     * length+start where length is the length of the array.
+     * @param end index to stop filling the array at. If end is negative, it is treated as
+     * length+end.
+     */
+    fill(value: T, start?: number, end?: number): this;
+
+    /**
+     * Returns the this object after copying a section of the array identified by start and end
+     * to the same array starting at position target
+     * @param target If target is negative, it is treated as length+target where length is the
+     * length of the array.
+     * @param start If start is negative, it is treated as length+start. If end is negative, it
+     * is treated as length+end.
+     * @param end If not specified, length of the this object is used as its default value.
+     */
+    copyWithin(target: number, start: number, end?: number): this;
+}
+
+interface ArrayConstructor {
+    /**
+     * Creates an array from an array-like object.
+     * @param arrayLike An array-like object to convert to an array.
+     */
+    from<T>(arrayLike: ArrayLike<T>): T[];
+
+    /**
+     * Creates an array from an iterable object.
+     * @param arrayLike An array-like object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[];
+
+    /**
+     * Returns a new array from a set of elements.
+     * @param items A set of elements to include in the new array object.
+     */
+    of<T>(...items: T[]): T[];
+}
+
+interface DateConstructor {
+    new (value: number | string | Date): Date;
+}
+
+interface Function {
+    /**
+     * Returns the name of the function. Function names are read-only and can not be changed.
+     */
+    readonly name: string;
+}
+
+interface Math {
+    /**
+     * Returns the number of leading zero bits in the 32-bit binary representation of a number.
+     * @param x A numeric expression.
+     */
+    clz32(x: number): number;
+
+    /**
+     * Returns the result of 32-bit multiplication of two numbers.
+     * @param x First number
+     * @param y Second number
+     */
+    imul(x: number, y: number): number;
+
+    /**
+     * Returns the sign of the x, indicating whether x is positive, negative or zero.
+     * @param x The numeric expression to test
+     */
+    sign(x: number): number;
+
+    /**
+     * Returns the base 10 logarithm of a number.
+     * @param x A numeric expression.
+     */
+    log10(x: number): number;
+
+    /**
+     * Returns the base 2 logarithm of a number.
+     * @param x A numeric expression.
+     */
+    log2(x: number): number;
+
+    /**
+     * Returns the natural logarithm of 1 + x.
+     * @param x A numeric expression.
+     */
+    log1p(x: number): number;
+
+    /**
+     * Returns the result of (e^x - 1), which is an implementation-dependent approximation to
+     * subtracting 1 from the exponential function of x (e raised to the power of x, where e
+     * is the base of the natural logarithms).
+     * @param x A numeric expression.
+     */
+    expm1(x: number): number;
+
+    /**
+     * Returns the hyperbolic cosine of a number.
+     * @param x A numeric expression that contains an angle measured in radians.
+     */
+    cosh(x: number): number;
+
+    /**
+     * Returns the hyperbolic sine of a number.
+     * @param x A numeric expression that contains an angle measured in radians.
+     */
+    sinh(x: number): number;
+
+    /**
+     * Returns the hyperbolic tangent of a number.
+     * @param x A numeric expression that contains an angle measured in radians.
+     */
+    tanh(x: number): number;
+
+    /**
+     * Returns the inverse hyperbolic cosine of a number.
+     * @param x A numeric expression that contains an angle measured in radians.
+     */
+    acosh(x: number): number;
+
+    /**
+     * Returns the inverse hyperbolic sine of a number.
+     * @param x A numeric expression that contains an angle measured in radians.
+     */
+    asinh(x: number): number;
+
+    /**
+     * Returns the inverse hyperbolic tangent of a number.
+     * @param x A numeric expression that contains an angle measured in radians.
+     */
+    atanh(x: number): number;
+
+    /**
+     * Returns the square root of the sum of squares of its arguments.
+     * @param values Values to compute the square root for.
+     *     If no arguments are passed, the result is +0.
+     *     If there is only one argument, the result is the absolute value.
+     *     If any argument is +Infinity or -Infinity, the result is +Infinity.
+     *     If any argument is NaN, the result is NaN.
+     *     If all arguments are either +0 or \u22120, the result is +0.
+     */
+    hypot(...values: number[]): number;
+
+    /**
+     * Returns the integral part of the a numeric expression, x, removing any fractional digits.
+     * If x is already an integer, the result is x.
+     * @param x A numeric expression.
+     */
+    trunc(x: number): number;
+
+    /**
+     * Returns the nearest single precision float representation of a number.
+     * @param x A numeric expression.
+     */
+    fround(x: number): number;
+
+    /**
+     * Returns an implementation-dependent approximation to the cube root of number.
+     * @param x A numeric expression.
+     */
+    cbrt(x: number): number;
+}
+
+interface NumberConstructor {
+    /**
+     * The value of Number.EPSILON is the difference between 1 and the smallest value greater than 1
+     * that is representable as a Number value, which is approximately:
+     * 2.2204460492503130808472633361816 x 10\u200D\u2212\u200D16.
+     */
+    readonly EPSILON: number;
+
+    /**
+     * Returns true if passed value is finite.
+     * Unlike the global isFinite, Number.isFinite doesn't forcibly convert the parameter to a
+     * number. Only finite values of the type number, result in true.
+     * @param number A numeric value.
+     */
+    isFinite(number: unknown): boolean;
+
+    /**
+     * Returns true if the value passed is an integer, false otherwise.
+     * @param number A numeric value.
+     */
+    isInteger(number: unknown): boolean;
+
+    /**
+     * Returns a Boolean value that indicates whether a value is the reserved value NaN (not a
+     * number). Unlike the global isNaN(), Number.isNaN() doesn't forcefully convert the parameter
+     * to a number. Only values of the type number, that are also NaN, result in true.
+     * @param number A numeric value.
+     */
+    isNaN(number: unknown): boolean;
+
+    /**
+     * Returns true if the value passed is a safe integer.
+     * @param number A numeric value.
+     */
+    isSafeInteger(number: unknown): boolean;
+
+    /**
+     * The value of the largest integer n such that n and n + 1 are both exactly representable as
+     * a Number value.
+     * The value of Number.MAX_SAFE_INTEGER is 9007199254740991 2^53 \u2212 1.
+     */
+    readonly MAX_SAFE_INTEGER: number;
+
+    /**
+     * The value of the smallest integer n such that n and n \u2212 1 are both exactly representable as
+     * a Number value.
+     * The value of Number.MIN_SAFE_INTEGER is \u22129007199254740991 (\u2212(2^53 \u2212 1)).
+     */
+    readonly MIN_SAFE_INTEGER: number;
+
+    /**
+     * Converts a string to a floating-point number.
+     * @param string A string that contains a floating-point number.
+     */
+    parseFloat(string: string): number;
+
+    /**
+     * Converts A string to an integer.
+     * @param string A string to convert into a number.
+     * @param radix A value between 2 and 36 that specifies the base of the number in \`string\`.
+     * If this argument is not supplied, strings with a prefix of '0x' are considered hexadecimal.
+     * All other strings are considered decimal.
+     */
+    parseInt(string: string, radix?: number): number;
+}
+
+interface ObjectConstructor {
+    /**
+     * Copy the values of all of the enumerable own properties from one or more source objects to a
+     * target object. Returns the target object.
+     * @param target The target object to copy to.
+     * @param source The source object from which to copy properties.
+     */
+    assign<T extends {}, U>(target: T, source: U): T & U;
+
+    /**
+     * Copy the values of all of the enumerable own properties from one or more source objects to a
+     * target object. Returns the target object.
+     * @param target The target object to copy to.
+     * @param source1 The first source object from which to copy properties.
+     * @param source2 The second source object from which to copy properties.
+     */
+    assign<T extends {}, U, V>(target: T, source1: U, source2: V): T & U & V;
+
+    /**
+     * Copy the values of all of the enumerable own properties from one or more source objects to a
+     * target object. Returns the target object.
+     * @param target The target object to copy to.
+     * @param source1 The first source object from which to copy properties.
+     * @param source2 The second source object from which to copy properties.
+     * @param source3 The third source object from which to copy properties.
+     */
+    assign<T extends {}, U, V, W>(target: T, source1: U, source2: V, source3: W): T & U & V & W;
+
+    /**
+     * Copy the values of all of the enumerable own properties from one or more source objects to a
+     * target object. Returns the target object.
+     * @param target The target object to copy to.
+     * @param sources One or more source objects from which to copy properties
+     */
+    assign(target: object, ...sources: any[]): any;
+
+    /**
+     * Returns an array of all symbol properties found directly on object o.
+     * @param o Object to retrieve the symbols from.
+     */
+    getOwnPropertySymbols(o: any): symbol[];
+
+    /**
+     * Returns the names of the enumerable string properties and methods of an object.
+     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
+     */
+    keys(o: {}): string[];
+
+    /**
+     * Returns true if the values are the same value, false otherwise.
+     * @param value1 The first value.
+     * @param value2 The second value.
+     */
+    is(value1: any, value2: any): boolean;
+
+    /**
+     * Sets the prototype of a specified object o to object proto or null. Returns the object o.
+     * @param o The object to change its prototype.
+     * @param proto The value of the new prototype or null.
+     */
+    setPrototypeOf(o: any, proto: object | null): any;
+}
+
+interface ReadonlyArray<T> {
+    /**
+     * Returns the value of the first element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found, find
+     * immediately returns that element value. Otherwise, find returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    find<S extends T>(predicate: (value: T, index: number, obj: readonly T[]) => value is S, thisArg?: any): S | undefined;
+    find(predicate: (value: T, index: number, obj: readonly T[]) => unknown, thisArg?: any): T | undefined;
+
+    /**
+     * Returns the index of the first element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findIndex(predicate: (value: T, index: number, obj: readonly T[]) => unknown, thisArg?: any): number;
+}
+
+interface RegExp {
+    /**
+     * Returns a string indicating the flags of the regular expression in question. This field is read-only.
+     * The characters in this string are sequenced and concatenated in the following order:
+     *
+     *    - "g" for global
+     *    - "i" for ignoreCase
+     *    - "m" for multiline
+     *    - "u" for unicode
+     *    - "y" for sticky
+     *
+     * If no flags are set, the value is the empty string.
+     */
+    readonly flags: string;
+
+    /**
+     * Returns a Boolean value indicating the state of the sticky flag (y) used with a regular
+     * expression. Default is false. Read-only.
+     */
+    readonly sticky: boolean;
+
+    /**
+     * Returns a Boolean value indicating the state of the Unicode flag (u) used with a regular
+     * expression. Default is false. Read-only.
+     */
+    readonly unicode: boolean;
+}
+
+interface RegExpConstructor {
+    new (pattern: RegExp | string, flags?: string): RegExp;
+    (pattern: RegExp | string, flags?: string): RegExp;
+}
+
+interface String {
+    /**
+     * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point
+     * value of the UTF-16 encoded code point starting at the string element at position pos in
+     * the String resulting from converting this object to a String.
+     * If there is no element at that position, the result is undefined.
+     * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.
+     */
+    codePointAt(pos: number): number | undefined;
+
+    /**
+     * Returns true if searchString appears as a substring of the result of converting this
+     * object to a String, at one or more positions that are
+     * greater than or equal to position; otherwise, returns false.
+     * @param searchString search string
+     * @param position If position is undefined, 0 is assumed, so as to search all of the String.
+     */
+    includes(searchString: string, position?: number): boolean;
+
+    /**
+     * Returns true if the sequence of elements of searchString converted to a String is the
+     * same as the corresponding elements of this object (converted to a String) starting at
+     * endPosition \u2013 length(this). Otherwise returns false.
+     */
+    endsWith(searchString: string, endPosition?: number): boolean;
+
+    /**
+     * Returns the String value result of normalizing the string into the normalization form
+     * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.
+     * @param form Applicable values: "NFC", "NFD", "NFKC", or "NFKD", If not specified default
+     * is "NFC"
+     */
+    normalize(form: "NFC" | "NFD" | "NFKC" | "NFKD"): string;
+
+    /**
+     * Returns the String value result of normalizing the string into the normalization form
+     * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.
+     * @param form Applicable values: "NFC", "NFD", "NFKC", or "NFKD", If not specified default
+     * is "NFC"
+     */
+    normalize(form?: string): string;
+
+    /**
+     * Returns a String value that is made from count copies appended together. If count is 0,
+     * the empty string is returned.
+     * @param count number of copies to append
+     */
+    repeat(count: number): string;
+
+    /**
+     * Returns true if the sequence of elements of searchString converted to a String is the
+     * same as the corresponding elements of this object (converted to a String) starting at
+     * position. Otherwise returns false.
+     */
+    startsWith(searchString: string, position?: number): boolean;
+
+    /**
+     * Returns an \`<a>\` HTML anchor element and sets the name attribute to the text value
+     * @deprecated A legacy feature for browser compatibility
+     * @param name
+     */
+    anchor(name: string): string;
+
+    /**
+     * Returns a \`<big>\` HTML element
+     * @deprecated A legacy feature for browser compatibility
+     */
+    big(): string;
+
+    /**
+     * Returns a \`<blink>\` HTML element
+     * @deprecated A legacy feature for browser compatibility
+     */
+    blink(): string;
+
+    /**
+     * Returns a \`<b>\` HTML element
+     * @deprecated A legacy feature for browser compatibility
+     */
+    bold(): string;
+
+    /**
+     * Returns a \`<tt>\` HTML element
+     * @deprecated A legacy feature for browser compatibility
+     */
+    fixed(): string;
+
+    /**
+     * Returns a \`<font>\` HTML element and sets the color attribute value
+     * @deprecated A legacy feature for browser compatibility
+     */
+    fontcolor(color: string): string;
+
+    /**
+     * Returns a \`<font>\` HTML element and sets the size attribute value
+     * @deprecated A legacy feature for browser compatibility
+     */
+    fontsize(size: number): string;
+
+    /**
+     * Returns a \`<font>\` HTML element and sets the size attribute value
+     * @deprecated A legacy feature for browser compatibility
+     */
+    fontsize(size: string): string;
+
+    /**
+     * Returns an \`<i>\` HTML element
+     * @deprecated A legacy feature for browser compatibility
+     */
+    italics(): string;
+
+    /**
+     * Returns an \`<a>\` HTML element and sets the href attribute value
+     * @deprecated A legacy feature for browser compatibility
+     */
+    link(url: string): string;
+
+    /**
+     * Returns a \`<small>\` HTML element
+     * @deprecated A legacy feature for browser compatibility
+     */
+    small(): string;
+
+    /**
+     * Returns a \`<strike>\` HTML element
+     * @deprecated A legacy feature for browser compatibility
+     */
+    strike(): string;
+
+    /**
+     * Returns a \`<sub>\` HTML element
+     * @deprecated A legacy feature for browser compatibility
+     */
+    sub(): string;
+
+    /**
+     * Returns a \`<sup>\` HTML element
+     * @deprecated A legacy feature for browser compatibility
+     */
+    sup(): string;
+}
+
+interface StringConstructor {
+    /**
+     * Return the String value whose elements are, in order, the elements in the List elements.
+     * If length is 0, the empty string is returned.
+     */
+    fromCodePoint(...codePoints: number[]): string;
+
+    /**
+     * String.raw is usually used as a tag function of a Tagged Template String. When called as
+     * such, the first argument will be a well formed template call site object and the rest
+     * parameter will contain the substitution values. It can also be called directly, for example,
+     * to interleave strings and values from your own tag function, and in this case the only thing
+     * it needs from the first argument is the raw property.
+     * @param template A well-formed template string call site representation.
+     * @param substitutions A set of substitution values.
+     */
+    raw(template: { raw: readonly string[] | ArrayLike<string>}, ...substitutions: any[]): string;
+}
+`; $i["lib.es2015.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es5" />
+/// <reference lib="es2015.core" />
+/// <reference lib="es2015.collection" />
+/// <reference lib="es2015.iterable" />
+/// <reference lib="es2015.generator" />
+/// <reference lib="es2015.promise" />
+/// <reference lib="es2015.proxy" />
+/// <reference lib="es2015.reflect" />
+/// <reference lib="es2015.symbol" />
+/// <reference lib="es2015.symbol.wellknown" />
+`; $i["lib.es2015.generator.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2015.iterable" />
+
+interface Generator<T = unknown, TReturn = any, TNext = unknown> extends Iterator<T, TReturn, TNext> {
+    // NOTE: 'next' is defined using a tuple to ensure we report the correct assignability errors in all places.
+    next(...args: [] | [TNext]): IteratorResult<T, TReturn>;
+    return(value: TReturn): IteratorResult<T, TReturn>;
+    throw(e: any): IteratorResult<T, TReturn>;
+    [Symbol.iterator](): Generator<T, TReturn, TNext>;
+}
+
+interface GeneratorFunction {
+    /**
+     * Creates a new Generator object.
+     * @param args A list of arguments the function accepts.
+     */
+    new (...args: any[]): Generator;
+    /**
+     * Creates a new Generator object.
+     * @param args A list of arguments the function accepts.
+     */
+    (...args: any[]): Generator;
+    /**
+     * The length of the arguments.
+     */
+    readonly length: number;
+    /**
+     * Returns the name of the function.
+     */
+    readonly name: string;
+    /**
+     * A reference to the prototype.
+     */
+    readonly prototype: Generator;
+}
+
+interface GeneratorFunctionConstructor {
+    /**
+     * Creates a new Generator function.
+     * @param args A list of arguments the function accepts.
+     */
+    new (...args: string[]): GeneratorFunction;
+    /**
+     * Creates a new Generator function.
+     * @param args A list of arguments the function accepts.
+     */
+    (...args: string[]): GeneratorFunction;
+    /**
+     * The length of the arguments.
+     */
+    readonly length: number;
+    /**
+     * Returns the name of the function.
+     */
+    readonly name: string;
+    /**
+     * A reference to the prototype.
+     */
+    readonly prototype: GeneratorFunction;
+}
+`; $i["lib.es2015.iterable.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2015.symbol" />
+
+interface SymbolConstructor {
+    /**
+     * A method that returns the default iterator for an object. Called by the semantics of the
+     * for-of statement.
+     */
+    readonly iterator: unique symbol;
+}
+
+interface IteratorYieldResult<TYield> {
+    done?: false;
+    value: TYield;
+}
+
+interface IteratorReturnResult<TReturn> {
+    done: true;
+    value: TReturn;
+}
+
+type IteratorResult<T, TReturn = any> = IteratorYieldResult<T> | IteratorReturnResult<TReturn>;
+
+interface Iterator<T, TReturn = any, TNext = undefined> {
+    // NOTE: 'next' is defined using a tuple to ensure we report the correct assignability errors in all places.
+    next(...args: [] | [TNext]): IteratorResult<T, TReturn>;
+    return?(value?: TReturn): IteratorResult<T, TReturn>;
+    throw?(e?: any): IteratorResult<T, TReturn>;
+}
+
+interface Iterable<T> {
+    [Symbol.iterator](): Iterator<T>;
+}
+
+interface IterableIterator<T> extends Iterator<T> {
+    [Symbol.iterator](): IterableIterator<T>;
+}
+
+interface Array<T> {
+    /** Iterator */
+    [Symbol.iterator](): IterableIterator<T>;
+
+    /**
+     * Returns an iterable of key, value pairs for every entry in the array
+     */
+    entries(): IterableIterator<[number, T]>;
+
+    /**
+     * Returns an iterable of keys in the array
+     */
+    keys(): IterableIterator<number>;
+
+    /**
+     * Returns an iterable of values in the array
+     */
+    values(): IterableIterator<T>;
+}
+
+interface ArrayConstructor {
+    /**
+     * Creates an array from an iterable object.
+     * @param iterable An iterable object to convert to an array.
+     */
+    from<T>(iterable: Iterable<T> | ArrayLike<T>): T[];
+
+    /**
+     * Creates an array from an iterable object.
+     * @param iterable An iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from<T, U>(iterable: Iterable<T> | ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[];
+}
+
+interface ReadonlyArray<T> {
+    /** Iterator of values in the array. */
+    [Symbol.iterator](): IterableIterator<T>;
+
+    /**
+     * Returns an iterable of key, value pairs for every entry in the array
+     */
+    entries(): IterableIterator<[number, T]>;
+
+    /**
+     * Returns an iterable of keys in the array
+     */
+    keys(): IterableIterator<number>;
+
+    /**
+     * Returns an iterable of values in the array
+     */
+    values(): IterableIterator<T>;
+}
+
+interface IArguments {
+    /** Iterator */
+    [Symbol.iterator](): IterableIterator<any>;
+}
+
+interface Map<K, V> {
+    /** Returns an iterable of entries in the map. */
+    [Symbol.iterator](): IterableIterator<[K, V]>;
+
+    /**
+     * Returns an iterable of key, value pairs for every entry in the map.
+     */
+    entries(): IterableIterator<[K, V]>;
+
+    /**
+     * Returns an iterable of keys in the map
+     */
+    keys(): IterableIterator<K>;
+
+    /**
+     * Returns an iterable of values in the map
+     */
+    values(): IterableIterator<V>;
+}
+
+interface ReadonlyMap<K, V> {
+    /** Returns an iterable of entries in the map. */
+    [Symbol.iterator](): IterableIterator<[K, V]>;
+
+    /**
+     * Returns an iterable of key, value pairs for every entry in the map.
+     */
+    entries(): IterableIterator<[K, V]>;
+
+    /**
+     * Returns an iterable of keys in the map
+     */
+    keys(): IterableIterator<K>;
+
+    /**
+     * Returns an iterable of values in the map
+     */
+    values(): IterableIterator<V>;
+}
+
+interface MapConstructor {
+    new(): Map<any, any>;
+    new <K, V>(iterable?: Iterable<readonly [K, V]> | null): Map<K, V>;
+}
+
+interface WeakMap<K extends object, V> { }
+
+interface WeakMapConstructor {
+    new <K extends object, V>(iterable: Iterable<readonly [K, V]>): WeakMap<K, V>;
+}
+
+interface Set<T> {
+    /** Iterates over values in the set. */
+    [Symbol.iterator](): IterableIterator<T>;
+    /**
+     * Returns an iterable of [v,v] pairs for every value \`v\` in the set.
+     */
+    entries(): IterableIterator<[T, T]>;
+    /**
+     * Despite its name, returns an iterable of the values in the set.
+     */
+    keys(): IterableIterator<T>;
+
+    /**
+     * Returns an iterable of values in the set.
+     */
+    values(): IterableIterator<T>;
+}
+
+interface ReadonlySet<T> {
+    /** Iterates over values in the set. */
+    [Symbol.iterator](): IterableIterator<T>;
+
+    /**
+     * Returns an iterable of [v,v] pairs for every value \`v\` in the set.
+     */
+    entries(): IterableIterator<[T, T]>;
+
+    /**
+     * Despite its name, returns an iterable of the values in the set.
+     */
+    keys(): IterableIterator<T>;
+
+    /**
+     * Returns an iterable of values in the set.
+     */
+    values(): IterableIterator<T>;
+}
+
+interface SetConstructor {
+    new <T>(iterable?: Iterable<T> | null): Set<T>;
+}
+
+interface WeakSet<T extends object> { }
+
+interface WeakSetConstructor {
+    new <T extends object = object>(iterable: Iterable<T>): WeakSet<T>;
+}
+
+interface Promise<T> { }
+
+interface PromiseConstructor {
+    /**
+     * Creates a Promise that is resolved with an array of results when all of the provided Promises
+     * resolve, or rejected when any Promise is rejected.
+     * @param values An iterable of Promises.
+     * @returns A new Promise.
+     */
+    all<T>(values: Iterable<T | PromiseLike<T>>): Promise<Awaited<T>[]>;
+
+    /**
+     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
+     * or rejected.
+     * @param values An iterable of Promises.
+     * @returns A new Promise.
+     */
+    race<T>(values: Iterable<T | PromiseLike<T>>): Promise<Awaited<T>>;
+}
+
+interface String {
+    /** Iterator */
+    [Symbol.iterator](): IterableIterator<string>;
+}
+
+interface Int8Array {
+    [Symbol.iterator](): IterableIterator<number>;
+    /**
+     * Returns an array of key, value pairs for every entry in the array
+     */
+    entries(): IterableIterator<[number, number]>;
+    /**
+     * Returns an list of keys in the array
+     */
+    keys(): IterableIterator<number>;
+    /**
+     * Returns an list of values in the array
+     */
+    values(): IterableIterator<number>;
+}
+
+interface Int8ArrayConstructor {
+    new (elements: Iterable<number>): Int8Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int8Array;
+}
+
+interface Uint8Array {
+    [Symbol.iterator](): IterableIterator<number>;
+    /**
+     * Returns an array of key, value pairs for every entry in the array
+     */
+    entries(): IterableIterator<[number, number]>;
+    /**
+     * Returns an list of keys in the array
+     */
+    keys(): IterableIterator<number>;
+    /**
+     * Returns an list of values in the array
+     */
+    values(): IterableIterator<number>;
+}
+
+interface Uint8ArrayConstructor {
+    new (elements: Iterable<number>): Uint8Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint8Array;
+}
+
+interface Uint8ClampedArray {
+    [Symbol.iterator](): IterableIterator<number>;
+    /**
+     * Returns an array of key, value pairs for every entry in the array
+     */
+    entries(): IterableIterator<[number, number]>;
+
+    /**
+     * Returns an list of keys in the array
+     */
+    keys(): IterableIterator<number>;
+
+    /**
+     * Returns an list of values in the array
+     */
+    values(): IterableIterator<number>;
+}
+
+interface Uint8ClampedArrayConstructor {
+    new (elements: Iterable<number>): Uint8ClampedArray;
+
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint8ClampedArray;
+}
+
+interface Int16Array {
+    [Symbol.iterator](): IterableIterator<number>;
+    /**
+     * Returns an array of key, value pairs for every entry in the array
+     */
+    entries(): IterableIterator<[number, number]>;
+
+    /**
+     * Returns an list of keys in the array
+     */
+    keys(): IterableIterator<number>;
+
+    /**
+     * Returns an list of values in the array
+     */
+    values(): IterableIterator<number>;
+}
+
+interface Int16ArrayConstructor {
+    new (elements: Iterable<number>): Int16Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int16Array;
+}
+
+interface Uint16Array {
+    [Symbol.iterator](): IterableIterator<number>;
+    /**
+     * Returns an array of key, value pairs for every entry in the array
+     */
+    entries(): IterableIterator<[number, number]>;
+    /**
+     * Returns an list of keys in the array
+     */
+    keys(): IterableIterator<number>;
+    /**
+     * Returns an list of values in the array
+     */
+    values(): IterableIterator<number>;
+}
+
+interface Uint16ArrayConstructor {
+    new (elements: Iterable<number>): Uint16Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint16Array;
+}
+
+interface Int32Array {
+    [Symbol.iterator](): IterableIterator<number>;
+    /**
+     * Returns an array of key, value pairs for every entry in the array
+     */
+    entries(): IterableIterator<[number, number]>;
+    /**
+     * Returns an list of keys in the array
+     */
+    keys(): IterableIterator<number>;
+    /**
+     * Returns an list of values in the array
+     */
+    values(): IterableIterator<number>;
+}
+
+interface Int32ArrayConstructor {
+    new (elements: Iterable<number>): Int32Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int32Array;
+}
+
+interface Uint32Array {
+    [Symbol.iterator](): IterableIterator<number>;
+    /**
+     * Returns an array of key, value pairs for every entry in the array
+     */
+    entries(): IterableIterator<[number, number]>;
+    /**
+     * Returns an list of keys in the array
+     */
+    keys(): IterableIterator<number>;
+    /**
+     * Returns an list of values in the array
+     */
+    values(): IterableIterator<number>;
+}
+
+interface Uint32ArrayConstructor {
+    new (elements: Iterable<number>): Uint32Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint32Array;
+}
+
+interface Float32Array {
+    [Symbol.iterator](): IterableIterator<number>;
+    /**
+     * Returns an array of key, value pairs for every entry in the array
+     */
+    entries(): IterableIterator<[number, number]>;
+    /**
+     * Returns an list of keys in the array
+     */
+    keys(): IterableIterator<number>;
+    /**
+     * Returns an list of values in the array
+     */
+    values(): IterableIterator<number>;
+}
+
+interface Float32ArrayConstructor {
+    new (elements: Iterable<number>): Float32Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Float32Array;
+}
+
+interface Float64Array {
+    [Symbol.iterator](): IterableIterator<number>;
+    /**
+     * Returns an array of key, value pairs for every entry in the array
+     */
+    entries(): IterableIterator<[number, number]>;
+    /**
+     * Returns an list of keys in the array
+     */
+    keys(): IterableIterator<number>;
+    /**
+     * Returns an list of values in the array
+     */
+    values(): IterableIterator<number>;
+}
+
+interface Float64ArrayConstructor {
+    new (elements: Iterable<number>): Float64Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Float64Array;
+}
+`; $i["lib.es2015.promise.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface PromiseConstructor {
+    /**
+     * A reference to the prototype.
+     */
+    readonly prototype: Promise<any>;
+
+    /**
+     * Creates a new Promise.
+     * @param executor A callback used to initialize the promise. This callback is passed two arguments:
+     * a resolve callback used to resolve the promise with a value or the result of another promise,
+     * and a reject callback used to reject the promise with a provided reason or error.
+     */
+    new <T>(executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): Promise<T>;
+
+    /**
+     * Creates a Promise that is resolved with an array of results when all of the provided Promises
+     * resolve, or rejected when any Promise is rejected.
+     * @param values An array of Promises.
+     * @returns A new Promise.
+     */
+    all<T extends readonly unknown[] | []>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>;
+
+    // see: lib.es2015.iterable.d.ts
+    // all<T>(values: Iterable<T | PromiseLike<T>>): Promise<Awaited<T>[]>;
+
+    /**
+     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
+     * or rejected.
+     * @param values An array of Promises.
+     * @returns A new Promise.
+     */
+    race<T extends readonly unknown[] | []>(values: T): Promise<Awaited<T[number]>>;
+
+    // see: lib.es2015.iterable.d.ts
+    // race<T>(values: Iterable<T | PromiseLike<T>>): Promise<Awaited<T>>;
+
+    /**
+     * Creates a new rejected promise for the provided reason.
+     * @param reason The reason the promise was rejected.
+     * @returns A new rejected Promise.
+     */
+    reject<T = never>(reason?: any): Promise<T>;
+
+    /**
+     * Creates a new resolved promise.
+     * @returns A resolved promise.
+     */
+    resolve(): Promise<void>;
+    /**
+     * Creates a new resolved promise for the provided value.
+     * @param value A promise.
+     * @returns A promise whose internal state matches the provided promise.
+     */
+    resolve<T>(value: T): Promise<Awaited<T>>;
+    /**
+     * Creates a new resolved promise for the provided value.
+     * @param value A promise.
+     * @returns A promise whose internal state matches the provided promise.
+     */
+    resolve<T>(value: T | PromiseLike<T>): Promise<Awaited<T>>;
+}
+
+declare var Promise: PromiseConstructor;
+`; $i["lib.es2015.proxy.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface ProxyHandler<T extends object> {
+    /**
+     * A trap method for a function call.
+     * @param target The original callable object which is being proxied.
+     */
+    apply?(target: T, thisArg: any, argArray: any[]): any;
+
+    /**
+     * A trap for the \`new\` operator.
+     * @param target The original object which is being proxied.
+     * @param newTarget The constructor that was originally called.
+     */
+    construct?(target: T, argArray: any[], newTarget: Function): object;
+
+    /**
+     * A trap for \`Object.defineProperty()\`.
+     * @param target The original object which is being proxied.
+     * @returns A \`Boolean\` indicating whether or not the property has been defined.
+     */
+    defineProperty?(target: T, property: string | symbol, attributes: PropertyDescriptor): boolean;
+
+    /**
+     * A trap for the \`delete\` operator.
+     * @param target The original object which is being proxied.
+     * @param p The name or \`Symbol\` of the property to delete.
+     * @returns A \`Boolean\` indicating whether or not the property was deleted.
+     */
+    deleteProperty?(target: T, p: string | symbol): boolean;
+
+    /**
+     * A trap for getting a property value.
+     * @param target The original object which is being proxied.
+     * @param p The name or \`Symbol\` of the property to get.
+     * @param receiver The proxy or an object that inherits from the proxy.
+     */
+    get?(target: T, p: string | symbol, receiver: any): any;
+
+    /**
+     * A trap for \`Object.getOwnPropertyDescriptor()\`.
+     * @param target The original object which is being proxied.
+     * @param p The name of the property whose description should be retrieved.
+     */
+    getOwnPropertyDescriptor?(target: T, p: string | symbol): PropertyDescriptor | undefined;
+
+    /**
+     * A trap for the \`[[GetPrototypeOf]]\` internal method.
+     * @param target The original object which is being proxied.
+     */
+    getPrototypeOf?(target: T): object | null;
+
+    /**
+     * A trap for the \`in\` operator.
+     * @param target The original object which is being proxied.
+     * @param p The name or \`Symbol\` of the property to check for existence.
+     */
+    has?(target: T, p: string | symbol): boolean;
+
+    /**
+     * A trap for \`Object.isExtensible()\`.
+     * @param target The original object which is being proxied.
+     */
+    isExtensible?(target: T): boolean;
+
+    /**
+     * A trap for \`Reflect.ownKeys()\`.
+     * @param target The original object which is being proxied.
+     */
+    ownKeys?(target: T): ArrayLike<string | symbol>;
+
+    /**
+     * A trap for \`Object.preventExtensions()\`.
+     * @param target The original object which is being proxied.
+     */
+    preventExtensions?(target: T): boolean;
+
+    /**
+     * A trap for setting a property value.
+     * @param target The original object which is being proxied.
+     * @param p The name or \`Symbol\` of the property to set.
+     * @param receiver The object to which the assignment was originally directed.
+     * @returns A \`Boolean\` indicating whether or not the property was set.
+     */
+    set?(target: T, p: string | symbol, newValue: any, receiver: any): boolean;
+
+    /**
+     * A trap for \`Object.setPrototypeOf()\`.
+     * @param target The original object which is being proxied.
+     * @param newPrototype The object's new prototype or \`null\`.
+     */
+    setPrototypeOf?(target: T, v: object | null): boolean;
+}
+
+interface ProxyConstructor {
+    /**
+     * Creates a revocable Proxy object.
+     * @param target A target object to wrap with Proxy.
+     * @param handler An object whose properties define the behavior of Proxy when an operation is attempted on it.
+     */
+    revocable<T extends object>(target: T, handler: ProxyHandler<T>): { proxy: T; revoke: () => void; };
+
+    /**
+     * Creates a Proxy object. The Proxy object allows you to create an object that can be used in place of the
+     * original object, but which may redefine fundamental Object operations like getting, setting, and defining
+     * properties. Proxy objects are commonly used to log property accesses, validate, format, or sanitize inputs.
+     * @param target A target object to wrap with Proxy.
+     * @param handler An object whose properties define the behavior of Proxy when an operation is attempted on it.
+     */
+    new <T extends object>(target: T, handler: ProxyHandler<T>): T;
+}
+declare var Proxy: ProxyConstructor;
+`; $i["lib.es2015.reflect.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+declare namespace Reflect {
+    /**
+     * Calls the function with the specified object as the this value
+     * and the elements of specified array as the arguments.
+     * @param target The function to call.
+     * @param thisArgument The object to be used as the this object.
+     * @param argumentsList An array of argument values to be passed to the function.
+     */
+    function apply<T, A extends readonly any[], R>(
+        target: (this: T, ...args: A) => R,
+        thisArgument: T,
+        argumentsList: Readonly<A>,
+    ): R;
+    function apply(target: Function, thisArgument: any, argumentsList: ArrayLike<any>): any;
+
+    /**
+     * Constructs the target with the elements of specified array as the arguments
+     * and the specified constructor as the \`new.target\` value.
+     * @param target The constructor to invoke.
+     * @param argumentsList An array of argument values to be passed to the constructor.
+     * @param newTarget The constructor to be used as the \`new.target\` object.
+     */
+    function construct<A extends readonly any[], R>(
+        target: new (...args: A) => R,
+        argumentsList: Readonly<A>,
+        newTarget?: new (...args: any) => any,
+    ): R;
+    function construct(target: Function, argumentsList: ArrayLike<any>, newTarget?: Function): any;
+
+    /**
+     * Adds a property to an object, or modifies attributes of an existing property.
+     * @param target Object on which to add or modify the property. This can be a native JavaScript object
+     *        (that is, a user-defined object or a built in object) or a DOM object.
+     * @param propertyKey The property name.
+     * @param attributes Descriptor for the property. It can be for a data property or an accessor property.
+     */
+    function defineProperty(target: object, propertyKey: PropertyKey, attributes: PropertyDescriptor & ThisType<any>): boolean;
+
+    /**
+     * Removes a property from an object, equivalent to \`delete target[propertyKey]\`,
+     * except it won't throw if \`target[propertyKey]\` is non-configurable.
+     * @param target Object from which to remove the own property.
+     * @param propertyKey The property name.
+     */
+    function deleteProperty(target: object, propertyKey: PropertyKey): boolean;
+
+    /**
+     * Gets the property of target, equivalent to \`target[propertyKey]\` when \`receiver === target\`.
+     * @param target Object that contains the property on itself or in its prototype chain.
+     * @param propertyKey The property name.
+     * @param receiver The reference to use as the \`this\` value in the getter function,
+     *        if \`target[propertyKey]\` is an accessor property.
+     */
+    function get<T extends object, P extends PropertyKey>(
+        target: T,
+        propertyKey: P,
+        receiver?: unknown,
+    ): P extends keyof T ? T[P] : any;
+
+    /**
+     * Gets the own property descriptor of the specified object.
+     * An own property descriptor is one that is defined directly on the object and is not inherited from the object's prototype.
+     * @param target Object that contains the property.
+     * @param propertyKey The property name.
+     */
+    function getOwnPropertyDescriptor<T extends object, P extends PropertyKey>(
+        target: T,
+        propertyKey: P,
+    ): TypedPropertyDescriptor<P extends keyof T ? T[P] : any> | undefined;
+
+    /**
+     * Returns the prototype of an object.
+     * @param target The object that references the prototype.
+     */
+    function getPrototypeOf(target: object): object | null;
+
+    /**
+     * Equivalent to \`propertyKey in target\`.
+     * @param target Object that contains the property on itself or in its prototype chain.
+     * @param propertyKey Name of the property.
+     */
+    function has(target: object, propertyKey: PropertyKey): boolean;
+
+    /**
+     * Returns a value that indicates whether new properties can be added to an object.
+     * @param target Object to test.
+     */
+    function isExtensible(target: object): boolean;
+
+    /**
+     * Returns the string and symbol keys of the own properties of an object. The own properties of an object
+     * are those that are defined directly on that object, and are not inherited from the object's prototype.
+     * @param target Object that contains the own properties.
+     */
+    function ownKeys(target: object): (string | symbol)[];
+
+    /**
+     * Prevents the addition of new properties to an object.
+     * @param target Object to make non-extensible.
+     * @return Whether the object has been made non-extensible.
+     */
+    function preventExtensions(target: object): boolean;
+
+    /**
+     * Sets the property of target, equivalent to \`target[propertyKey] = value\` when \`receiver === target\`.
+     * @param target Object that contains the property on itself or in its prototype chain.
+     * @param propertyKey Name of the property.
+     * @param receiver The reference to use as the \`this\` value in the setter function,
+     *        if \`target[propertyKey]\` is an accessor property.
+     */
+    function set<T extends object, P extends PropertyKey>(
+        target: T,
+        propertyKey: P,
+        value: P extends keyof T ? T[P] : any,
+        receiver?: any,
+    ): boolean;
+    function set(target: object, propertyKey: PropertyKey, value: any, receiver?: any): boolean;
+
+    /**
+     * Sets the prototype of a specified object o to object proto or null.
+     * @param target The object to change its prototype.
+     * @param proto The value of the new prototype or null.
+     * @return Whether setting the prototype was successful.
+     */
+    function setPrototypeOf(target: object, proto: object | null): boolean;
+}
+`; $i["lib.es2015.symbol.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface SymbolConstructor {
+    /**
+     * A reference to the prototype.
+     */
+    readonly prototype: Symbol;
+
+    /**
+     * Returns a new unique Symbol value.
+     * @param  description Description of the new Symbol object.
+     */
+    (description?: string | number): symbol;
+
+    /**
+     * Returns a Symbol object from the global symbol registry matching the given key if found.
+     * Otherwise, returns a new symbol with this key.
+     * @param key key to search for.
+     */
+    for(key: string): symbol;
+
+    /**
+     * Returns a key from the global symbol registry matching the given Symbol if found.
+     * Otherwise, returns a undefined.
+     * @param sym Symbol to find the key for.
+     */
+    keyFor(sym: symbol): string | undefined;
+}
+
+declare var Symbol: SymbolConstructor;`; $i["lib.es2015.symbol.wellknown.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2015.symbol" />
+
+interface SymbolConstructor {
+    /**
+     * A method that determines if a constructor object recognizes an object as one of the
+     * constructor\u2019s instances. Called by the semantics of the instanceof operator.
+     */
+    readonly hasInstance: unique symbol;
+
+    /**
+     * A Boolean value that if true indicates that an object should flatten to its array elements
+     * by Array.prototype.concat.
+     */
+    readonly isConcatSpreadable: unique symbol;
+
+    /**
+     * A regular expression method that matches the regular expression against a string. Called
+     * by the String.prototype.match method.
+     */
+    readonly match: unique symbol;
+
+    /**
+     * A regular expression method that replaces matched substrings of a string. Called by the
+     * String.prototype.replace method.
+     */
+    readonly replace: unique symbol;
+
+    /**
+     * A regular expression method that returns the index within a string that matches the
+     * regular expression. Called by the String.prototype.search method.
+     */
+    readonly search: unique symbol;
+
+    /**
+     * A function valued property that is the constructor function that is used to create
+     * derived objects.
+     */
+    readonly species: unique symbol;
+
+    /**
+     * A regular expression method that splits a string at the indices that match the regular
+     * expression. Called by the String.prototype.split method.
+     */
+    readonly split: unique symbol;
+
+    /**
+     * A method that converts an object to a corresponding primitive value.
+     * Called by the ToPrimitive abstract operation.
+     */
+    readonly toPrimitive: unique symbol;
+
+    /**
+     * A String value that is used in the creation of the default string description of an object.
+     * Called by the built-in method Object.prototype.toString.
+     */
+    readonly toStringTag: unique symbol;
+
+    /**
+     * An Object whose truthy properties are properties that are excluded from the 'with'
+     * environment bindings of the associated objects.
+     */
+    readonly unscopables: unique symbol;
+}
+
+interface Symbol {
+    /**
+     * Converts a Symbol object to a symbol.
+     */
+    [Symbol.toPrimitive](hint: string): symbol;
+
+    readonly [Symbol.toStringTag]: string;
+}
+
+interface Array<T> {
+    /**
+     * Is an object whose properties have the value 'true'
+     * when they will be absent when used in a 'with' statement.
+     */
+    readonly [Symbol.unscopables]: {
+        [K in keyof any[]]?: boolean;
+    };
+}
+
+interface ReadonlyArray<T> {
+    /**
+     * Is an object whose properties have the value 'true'
+     * when they will be absent when used in a 'with' statement.
+     */
+    readonly [Symbol.unscopables]: {
+        [K in keyof readonly any[]]?: boolean;
+    };
+}
+
+interface Date {
+    /**
+     * Converts a Date object to a string.
+     */
+    [Symbol.toPrimitive](hint: "default"): string;
+    /**
+     * Converts a Date object to a string.
+     */
+    [Symbol.toPrimitive](hint: "string"): string;
+    /**
+     * Converts a Date object to a number.
+     */
+    [Symbol.toPrimitive](hint: "number"): number;
+    /**
+     * Converts a Date object to a string or number.
+     *
+     * @param hint The strings "number", "string", or "default" to specify what primitive to return.
+     *
+     * @throws {TypeError} If 'hint' was given something other than "number", "string", or "default".
+     * @returns A number if 'hint' was "number", a string if 'hint' was "string" or "default".
+     */
+    [Symbol.toPrimitive](hint: string): string | number;
+}
+
+interface Map<K, V> {
+    readonly [Symbol.toStringTag]: string;
+}
+
+interface WeakMap<K extends object, V> {
+    readonly [Symbol.toStringTag]: string;
+}
+
+interface Set<T> {
+    readonly [Symbol.toStringTag]: string;
+}
+
+interface WeakSet<T extends object> {
+    readonly [Symbol.toStringTag]: string;
+}
+
+interface JSON {
+    readonly [Symbol.toStringTag]: string;
+}
+
+interface Function {
+    /**
+     * Determines whether the given value inherits from this function if this function was used
+     * as a constructor function.
+     *
+     * A constructor function can control which objects are recognized as its instances by
+     * 'instanceof' by overriding this method.
+     */
+    [Symbol.hasInstance](value: any): boolean;
+}
+
+interface GeneratorFunction {
+    readonly [Symbol.toStringTag]: string;
+}
+
+interface Math {
+    readonly [Symbol.toStringTag]: string;
+}
+
+interface Promise<T> {
+    readonly [Symbol.toStringTag]: string;
+}
+
+interface PromiseConstructor {
+    readonly [Symbol.species]: PromiseConstructor;
+}
+
+interface RegExp {
+    /**
+     * Matches a string with this regular expression, and returns an array containing the results of
+     * that search.
+     * @param string A string to search within.
+     */
+    [Symbol.match](string: string): RegExpMatchArray | null;
+
+    /**
+     * Replaces text in a string, using this regular expression.
+     * @param string A String object or string literal whose contents matching against
+     *               this regular expression will be replaced
+     * @param replaceValue A String object or string literal containing the text to replace for every
+     *                     successful match of this regular expression.
+     */
+    [Symbol.replace](string: string, replaceValue: string): string;
+
+    /**
+     * Replaces text in a string, using this regular expression.
+     * @param string A String object or string literal whose contents matching against
+     *               this regular expression will be replaced
+     * @param replacer A function that returns the replacement text.
+     */
+    [Symbol.replace](string: string, replacer: (substring: string, ...args: any[]) => string): string;
+
+    /**
+     * Finds the position beginning first substring match in a regular expression search
+     * using this regular expression.
+     *
+     * @param string The string to search within.
+     */
+    [Symbol.search](string: string): number;
+
+    /**
+     * Returns an array of substrings that were delimited by strings in the original input that
+     * match against this regular expression.
+     *
+     * If the regular expression contains capturing parentheses, then each time this
+     * regular expression matches, the results (including any undefined results) of the
+     * capturing parentheses are spliced.
+     *
+     * @param string string value to split
+     * @param limit if not undefined, the output array is truncated so that it contains no more
+     * than 'limit' elements.
+     */
+    [Symbol.split](string: string, limit?: number): string[];
+}
+
+interface RegExpConstructor {
+    readonly [Symbol.species]: RegExpConstructor;
+}
+
+interface String {
+    /**
+     * Matches a string or an object that supports being matched against, and returns an array
+     * containing the results of that search, or null if no matches are found.
+     * @param matcher An object that supports being matched against.
+     */
+    match(matcher: { [Symbol.match](string: string): RegExpMatchArray | null; }): RegExpMatchArray | null;
+
+    /**
+     * Passes a string and {@linkcode replaceValue} to the \`[Symbol.replace]\` method on {@linkcode searchValue}. This method is expected to implement its own replacement algorithm.
+     * @param searchValue An object that supports searching for and replacing matches within a string.
+     * @param replaceValue The replacement text.
+     */
+    replace(searchValue: { [Symbol.replace](string: string, replaceValue: string): string; }, replaceValue: string): string;
+
+    /**
+     * Replaces text in a string, using an object that supports replacement within a string.
+     * @param searchValue A object can search for and replace matches within a string.
+     * @param replacer A function that returns the replacement text.
+     */
+    replace(searchValue: { [Symbol.replace](string: string, replacer: (substring: string, ...args: any[]) => string): string; }, replacer: (substring: string, ...args: any[]) => string): string;
+
+    /**
+     * Finds the first substring match in a regular expression search.
+     * @param searcher An object which supports searching within a string.
+     */
+    search(searcher: { [Symbol.search](string: string): number; }): number;
+
+    /**
+     * Split a string into substrings using the specified separator and return them as an array.
+     * @param splitter An object that can split a string.
+     * @param limit A value used to limit the number of elements returned in the array.
+     */
+    split(splitter: { [Symbol.split](string: string, limit?: number): string[]; }, limit?: number): string[];
+}
+
+interface ArrayBuffer {
+    readonly [Symbol.toStringTag]: string;
+}
+
+interface DataView {
+    readonly [Symbol.toStringTag]: string;
+}
+
+interface Int8Array {
+    readonly [Symbol.toStringTag]: "Int8Array";
+}
+
+interface Uint8Array {
+    readonly [Symbol.toStringTag]: "Uint8Array";
+}
+
+interface Uint8ClampedArray {
+    readonly [Symbol.toStringTag]: "Uint8ClampedArray";
+}
+
+interface Int16Array {
+    readonly [Symbol.toStringTag]: "Int16Array";
+}
+
+interface Uint16Array {
+    readonly [Symbol.toStringTag]: "Uint16Array";
+}
+
+interface Int32Array {
+    readonly [Symbol.toStringTag]: "Int32Array";
+}
+
+interface Uint32Array {
+    readonly [Symbol.toStringTag]: "Uint32Array";
+}
+
+interface Float32Array {
+    readonly [Symbol.toStringTag]: "Float32Array";
+}
+
+interface Float64Array {
+    readonly [Symbol.toStringTag]: "Float64Array";
+}
+
+interface ArrayConstructor {
+    readonly [Symbol.species]: ArrayConstructor;
+}
+interface MapConstructor {
+    readonly [Symbol.species]: MapConstructor;
+}
+interface SetConstructor {
+    readonly [Symbol.species]: SetConstructor;
+}
+interface ArrayBufferConstructor {
+    readonly [Symbol.species]: ArrayBufferConstructor;
+}
+`; $i["lib.es2016.array.include.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface Array<T> {
+    /**
+     * Determines whether an array includes a certain element, returning true or false as appropriate.
+     * @param searchElement The element to search for.
+     * @param fromIndex The position in this array at which to begin searching for searchElement.
+     */
+    includes(searchElement: T, fromIndex?: number): boolean;
+}
+
+interface ReadonlyArray<T> {
+    /**
+     * Determines whether an array includes a certain element, returning true or false as appropriate.
+     * @param searchElement The element to search for.
+     * @param fromIndex The position in this array at which to begin searching for searchElement.
+     */
+    includes(searchElement: T, fromIndex?: number): boolean;
+}
+
+interface Int8Array {
+    /**
+     * Determines whether an array includes a certain element, returning true or false as appropriate.
+     * @param searchElement The element to search for.
+     * @param fromIndex The position in this array at which to begin searching for searchElement.
+     */
+    includes(searchElement: number, fromIndex?: number): boolean;
+}
+
+interface Uint8Array {
+    /**
+     * Determines whether an array includes a certain element, returning true or false as appropriate.
+     * @param searchElement The element to search for.
+     * @param fromIndex The position in this array at which to begin searching for searchElement.
+     */
+    includes(searchElement: number, fromIndex?: number): boolean;
+}
+
+interface Uint8ClampedArray {
+    /**
+     * Determines whether an array includes a certain element, returning true or false as appropriate.
+     * @param searchElement The element to search for.
+     * @param fromIndex The position in this array at which to begin searching for searchElement.
+     */
+    includes(searchElement: number, fromIndex?: number): boolean;
+}
+
+interface Int16Array {
+    /**
+     * Determines whether an array includes a certain element, returning true or false as appropriate.
+     * @param searchElement The element to search for.
+     * @param fromIndex The position in this array at which to begin searching for searchElement.
+     */
+    includes(searchElement: number, fromIndex?: number): boolean;
+}
+
+interface Uint16Array {
+    /**
+     * Determines whether an array includes a certain element, returning true or false as appropriate.
+     * @param searchElement The element to search for.
+     * @param fromIndex The position in this array at which to begin searching for searchElement.
+     */
+    includes(searchElement: number, fromIndex?: number): boolean;
+}
+
+interface Int32Array {
+    /**
+     * Determines whether an array includes a certain element, returning true or false as appropriate.
+     * @param searchElement The element to search for.
+     * @param fromIndex The position in this array at which to begin searching for searchElement.
+     */
+    includes(searchElement: number, fromIndex?: number): boolean;
+}
+
+interface Uint32Array {
+    /**
+     * Determines whether an array includes a certain element, returning true or false as appropriate.
+     * @param searchElement The element to search for.
+     * @param fromIndex The position in this array at which to begin searching for searchElement.
+     */
+    includes(searchElement: number, fromIndex?: number): boolean;
+}
+
+interface Float32Array {
+    /**
+     * Determines whether an array includes a certain element, returning true or false as appropriate.
+     * @param searchElement The element to search for.
+     * @param fromIndex The position in this array at which to begin searching for searchElement.
+     */
+    includes(searchElement: number, fromIndex?: number): boolean;
+}
+
+interface Float64Array {
+    /**
+     * Determines whether an array includes a certain element, returning true or false as appropriate.
+     * @param searchElement The element to search for.
+     * @param fromIndex The position in this array at which to begin searching for searchElement.
+     */
+    includes(searchElement: number, fromIndex?: number): boolean;
+}`; $i["lib.es2016.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2015" />
+/// <reference lib="es2016.array.include" />`; $i["lib.es2016.full.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2016" />
+/// <reference lib="dom" />
+/// <reference lib="webworker.importscripts" />
+/// <reference lib="scripthost" />
+/// <reference lib="dom.iterable" />`; $i["lib.es2017.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2016" />
+/// <reference lib="es2017.object" />
+/// <reference lib="es2017.sharedmemory" />
+/// <reference lib="es2017.string" />
+/// <reference lib="es2017.intl" />
+/// <reference lib="es2017.typedarrays" />
+`; $i["lib.es2017.full.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2017" />
+/// <reference lib="dom" />
+/// <reference lib="webworker.importscripts" />
+/// <reference lib="scripthost" />
+/// <reference lib="dom.iterable" />`; $i["lib.es2017.intl.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+declare namespace Intl {
+
+    interface DateTimeFormatPartTypesRegistry {
+        day: any
+        dayPeriod: any
+        era: any
+        hour: any
+        literal: any
+        minute: any
+        month: any
+        second: any
+        timeZoneName: any
+        weekday: any
+        year: any
+    }
+
+    type DateTimeFormatPartTypes = keyof DateTimeFormatPartTypesRegistry;
+
+    interface DateTimeFormatPart {
+        type: DateTimeFormatPartTypes;
+        value: string;
+    }
+
+    interface DateTimeFormat {
+        formatToParts(date?: Date | number): DateTimeFormatPart[];
+    }
+}
+`; $i["lib.es2017.object.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface ObjectConstructor {
+    /**
+     * Returns an array of values of the enumerable properties of an object
+     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
+     */
+    values<T>(o: { [s: string]: T } | ArrayLike<T>): T[];
+
+    /**
+     * Returns an array of values of the enumerable properties of an object
+     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
+     */
+    values(o: {}): any[];
+
+    /**
+     * Returns an array of key/values of the enumerable properties of an object
+     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
+     */
+    entries<T>(o: { [s: string]: T } | ArrayLike<T>): [string, T][];
+
+    /**
+     * Returns an array of key/values of the enumerable properties of an object
+     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
+     */
+    entries(o: {}): [string, any][];
+
+    /**
+     * Returns an object containing all own property descriptors of an object
+     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
+     */
+    getOwnPropertyDescriptors<T>(o: T): {[P in keyof T]: TypedPropertyDescriptor<T[P]>} & { [x: string]: PropertyDescriptor };
+}
+`; $i["lib.es2017.sharedmemory.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2015.symbol" />
+/// <reference lib="es2015.symbol.wellknown" />
+
+interface SharedArrayBuffer {
+    /**
+     * Read-only. The length of the ArrayBuffer (in bytes).
+     */
+    readonly byteLength: number;
+
+    /**
+     * Returns a section of an SharedArrayBuffer.
+     */
+    slice(begin: number, end?: number): SharedArrayBuffer;
+    readonly [Symbol.species]: SharedArrayBuffer;
+    readonly [Symbol.toStringTag]: "SharedArrayBuffer";
+}
+
+interface SharedArrayBufferConstructor {
+    readonly prototype: SharedArrayBuffer;
+    new (byteLength: number): SharedArrayBuffer;
+}
+declare var SharedArrayBuffer: SharedArrayBufferConstructor;
+
+interface ArrayBufferTypes {
+    SharedArrayBuffer: SharedArrayBuffer;
+}
+
+interface Atomics {
+    /**
+     * Adds a value to the value at the given position in the array, returning the original value.
+     * Until this atomic operation completes, any other read or write operation against the array
+     * will block.
+     */
+    add(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, value: number): number;
+
+    /**
+     * Stores the bitwise AND of a value with the value at the given position in the array,
+     * returning the original value. Until this atomic operation completes, any other read or
+     * write operation against the array will block.
+     */
+    and(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, value: number): number;
+
+    /**
+     * Replaces the value at the given position in the array if the original value equals the given
+     * expected value, returning the original value. Until this atomic operation completes, any
+     * other read or write operation against the array will block.
+     */
+    compareExchange(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, expectedValue: number, replacementValue: number): number;
+
+    /**
+     * Replaces the value at the given position in the array, returning the original value. Until
+     * this atomic operation completes, any other read or write operation against the array will
+     * block.
+     */
+    exchange(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, value: number): number;
+
+    /**
+     * Returns a value indicating whether high-performance algorithms can use atomic operations
+     * (\`true\`) or must use locks (\`false\`) for the given number of bytes-per-element of a typed
+     * array.
+     */
+    isLockFree(size: number): boolean;
+
+    /**
+     * Returns the value at the given position in the array. Until this atomic operation completes,
+     * any other read or write operation against the array will block.
+     */
+    load(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number): number;
+
+    /**
+     * Stores the bitwise OR of a value with the value at the given position in the array,
+     * returning the original value. Until this atomic operation completes, any other read or write
+     * operation against the array will block.
+     */
+    or(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, value: number): number;
+
+    /**
+     * Stores a value at the given position in the array, returning the new value. Until this
+     * atomic operation completes, any other read or write operation against the array will block.
+     */
+    store(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, value: number): number;
+
+    /**
+     * Subtracts a value from the value at the given position in the array, returning the original
+     * value. Until this atomic operation completes, any other read or write operation against the
+     * array will block.
+     */
+    sub(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, value: number): number;
+
+    /**
+     * If the value at the given position in the array is equal to the provided value, the current
+     * agent is put to sleep causing execution to suspend until the timeout expires (returning
+     * \`"timed-out"\`) or until the agent is awoken (returning \`"ok"\`); otherwise, returns
+     * \`"not-equal"\`.
+     */
+    wait(typedArray: Int32Array, index: number, value: number, timeout?: number): "ok" | "not-equal" | "timed-out";
+
+    /**
+     * Wakes up sleeping agents that are waiting on the given index of the array, returning the
+     * number of agents that were awoken.
+     * @param typedArray A shared Int32Array.
+     * @param index The position in the typedArray to wake up on.
+     * @param count The number of sleeping agents to notify. Defaults to +Infinity.
+     */
+    notify(typedArray: Int32Array, index: number, count?: number): number;
+
+    /**
+     * Stores the bitwise XOR of a value with the value at the given position in the array,
+     * returning the original value. Until this atomic operation completes, any other read or write
+     * operation against the array will block.
+     */
+    xor(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, value: number): number;
+
+    readonly [Symbol.toStringTag]: "Atomics";
+}
+
+declare var Atomics: Atomics;
+`; $i["lib.es2017.string.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface String {
+    /**
+     * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.
+     * The padding is applied from the start (left) of the current string.
+     *
+     * @param maxLength The length of the resulting string once the current string has been padded.
+     *        If this parameter is smaller than the current string's length, the current string will be returned as it is.
+     *
+     * @param fillString The string to pad the current string with.
+     *        If this string is too long, it will be truncated and the left-most part will be applied.
+     *        The default value for this parameter is " " (U+0020).
+     */
+    padStart(maxLength: number, fillString?: string): string;
+
+    /**
+     * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.
+     * The padding is applied from the end (right) of the current string.
+     *
+     * @param maxLength The length of the resulting string once the current string has been padded.
+     *        If this parameter is smaller than the current string's length, the current string will be returned as it is.
+     *
+     * @param fillString The string to pad the current string with.
+     *        If this string is too long, it will be truncated and the left-most part will be applied.
+     *        The default value for this parameter is " " (U+0020).
+     */
+    padEnd(maxLength: number, fillString?: string): string;
+}
+`; $i["lib.es2017.typedarrays.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface Int8ArrayConstructor {
+    new (): Int8Array;
+}
+
+interface Uint8ArrayConstructor {
+    new (): Uint8Array;
+}
+
+interface Uint8ClampedArrayConstructor {
+    new (): Uint8ClampedArray;
+}
+
+interface Int16ArrayConstructor {
+    new (): Int16Array;
+}
+
+interface Uint16ArrayConstructor {
+    new (): Uint16Array;
+}
+
+interface Int32ArrayConstructor {
+    new (): Int32Array;
+}
+
+interface Uint32ArrayConstructor {
+    new (): Uint32Array;
+}
+
+interface Float32ArrayConstructor {
+    new (): Float32Array;
+}
+
+interface Float64ArrayConstructor {
+    new (): Float64Array;
+}
+`; $i["lib.es2018.asyncgenerator.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2018.asynciterable" />
+
+interface AsyncGenerator<T = unknown, TReturn = any, TNext = unknown> extends AsyncIterator<T, TReturn, TNext> {
+    // NOTE: 'next' is defined using a tuple to ensure we report the correct assignability errors in all places.
+    next(...args: [] | [TNext]): Promise<IteratorResult<T, TReturn>>;
+    return(value: TReturn | PromiseLike<TReturn>): Promise<IteratorResult<T, TReturn>>;
+    throw(e: any): Promise<IteratorResult<T, TReturn>>;
+    [Symbol.asyncIterator](): AsyncGenerator<T, TReturn, TNext>;
+}
+
+interface AsyncGeneratorFunction {
+    /**
+     * Creates a new AsyncGenerator object.
+     * @param args A list of arguments the function accepts.
+     */
+    new (...args: any[]): AsyncGenerator;
+    /**
+     * Creates a new AsyncGenerator object.
+     * @param args A list of arguments the function accepts.
+     */
+    (...args: any[]): AsyncGenerator;
+    /**
+     * The length of the arguments.
+     */
+    readonly length: number;
+    /**
+     * Returns the name of the function.
+     */
+    readonly name: string;
+    /**
+     * A reference to the prototype.
+     */
+    readonly prototype: AsyncGenerator;
+}
+
+interface AsyncGeneratorFunctionConstructor {
+    /**
+     * Creates a new AsyncGenerator function.
+     * @param args A list of arguments the function accepts.
+     */
+    new (...args: string[]): AsyncGeneratorFunction;
+    /**
+     * Creates a new AsyncGenerator function.
+     * @param args A list of arguments the function accepts.
+     */
+    (...args: string[]): AsyncGeneratorFunction;
+    /**
+     * The length of the arguments.
+     */
+    readonly length: number;
+    /**
+     * Returns the name of the function.
+     */
+    readonly name: string;
+    /**
+     * A reference to the prototype.
+     */
+    readonly prototype: AsyncGeneratorFunction;
+}
+`; $i["lib.es2018.asynciterable.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2015.symbol" />
+/// <reference lib="es2015.iterable" />
+
+interface SymbolConstructor {
+    /**
+     * A method that returns the default async iterator for an object. Called by the semantics of
+     * the for-await-of statement.
+     */
+    readonly asyncIterator: unique symbol;
+}
+
+interface AsyncIterator<T, TReturn = any, TNext = undefined> {
+    // NOTE: 'next' is defined using a tuple to ensure we report the correct assignability errors in all places.
+    next(...args: [] | [TNext]): Promise<IteratorResult<T, TReturn>>;
+    return?(value?: TReturn | PromiseLike<TReturn>): Promise<IteratorResult<T, TReturn>>;
+    throw?(e?: any): Promise<IteratorResult<T, TReturn>>;
+}
+
+interface AsyncIterable<T> {
+    [Symbol.asyncIterator](): AsyncIterator<T>;
+}
+
+interface AsyncIterableIterator<T> extends AsyncIterator<T> {
+    [Symbol.asyncIterator](): AsyncIterableIterator<T>;
+}`; $i["lib.es2018.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2017" />
+/// <reference lib="es2018.asynciterable" />
+/// <reference lib="es2018.asyncgenerator" />
+/// <reference lib="es2018.promise" />
+/// <reference lib="es2018.regexp" />
+/// <reference lib="es2018.intl" />
+`; $i["lib.es2018.full.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2018" />
+/// <reference lib="dom" />
+/// <reference lib="webworker.importscripts" />
+/// <reference lib="scripthost" />
+/// <reference lib="dom.iterable" />`; $i["lib.es2018.intl.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+declare namespace Intl {
+
+    // http://cldr.unicode.org/index/cldr-spec/plural-rules#TOC-Determining-Plural-Categories
+    type LDMLPluralRule = "zero" | "one" | "two" | "few" | "many" | "other";
+    type PluralRuleType = "cardinal" | "ordinal";
+
+    interface PluralRulesOptions {
+        localeMatcher?: "lookup" | "best fit" | undefined;
+        type?: PluralRuleType | undefined;
+        minimumIntegerDigits?: number | undefined;
+        minimumFractionDigits?: number | undefined;
+        maximumFractionDigits?: number | undefined;
+        minimumSignificantDigits?: number | undefined;
+        maximumSignificantDigits?: number | undefined;
+    }
+
+    interface ResolvedPluralRulesOptions {
+        locale: string;
+        pluralCategories: LDMLPluralRule[];
+        type: PluralRuleType;
+        minimumIntegerDigits: number;
+        minimumFractionDigits: number;
+        maximumFractionDigits: number;
+        minimumSignificantDigits?: number;
+        maximumSignificantDigits?: number;
+    }
+
+    interface PluralRules {
+        resolvedOptions(): ResolvedPluralRulesOptions;
+        select(n: number): LDMLPluralRule;
+    }
+
+    const PluralRules: {
+        new (locales?: string | string[], options?: PluralRulesOptions): PluralRules;
+        (locales?: string | string[], options?: PluralRulesOptions): PluralRules;
+
+        supportedLocalesOf(locales: string | string[], options?: { localeMatcher?: "lookup" | "best fit" }): string[];
+    };
+
+    // We can only have one definition for 'type' in TypeScript, and so you can learn where the keys come from here:
+    type ES2018NumberFormatPartType = "literal" | "nan" | "infinity" | "percent" | "integer" | "group" | "decimal" | "fraction" | "plusSign" | "minusSign" | "percentSign" | "currency" | "code" | "symbol" | "name";
+    type ES2020NumberFormatPartType = "compact" | "exponentInteger" | "exponentMinusSign" | "exponentSeparator" | "unit" | "unknown";
+    type NumberFormatPartTypes = ES2018NumberFormatPartType | ES2020NumberFormatPartType;
+
+    interface NumberFormatPart {
+        type: NumberFormatPartTypes;
+        value: string;
+    }
+
+    interface NumberFormat {
+        formatToParts(number?: number | bigint): NumberFormatPart[];
+    }
+}
+`; $i["lib.es2018.promise.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/**
+ * Represents the completion of an asynchronous operation
+ */
+interface Promise<T> {
+    /**
+     * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The
+     * resolved value cannot be modified from the callback.
+     * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected).
+     * @returns A Promise for the completion of the callback.
+     */
+    finally(onfinally?: (() => void) | undefined | null): Promise<T>
+}
+`; $i["lib.es2018.regexp.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface RegExpMatchArray {
+    groups?: {
+        [key: string]: string
+    }
+}
+
+interface RegExpExecArray {
+    groups?: {
+        [key: string]: string
+    }
+}
+
+interface RegExp {
+    /**
+     * Returns a Boolean value indicating the state of the dotAll flag (s) used with a regular expression.
+     * Default is false. Read-only.
+     */
+    readonly dotAll: boolean;
+}`; $i["lib.es2019.array.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+type FlatArray<Arr, Depth extends number> = {
+    "done": Arr,
+    "recur": Arr extends ReadonlyArray<infer InnerArr>
+        ? FlatArray<InnerArr, [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][Depth]>
+        : Arr
+}[Depth extends -1 ? "done" : "recur"];
+
+interface ReadonlyArray<T> {
+
+    /**
+     * Calls a defined callback function on each element of an array. Then, flattens the result into
+     * a new array.
+     * This is identical to a map followed by flat with depth 1.
+     *
+     * @param callback A function that accepts up to three arguments. The flatMap method calls the
+     * callback function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callback function. If
+     * thisArg is omitted, undefined is used as the this value.
+     */
+    flatMap<U, This = undefined> (
+        callback: (this: This, value: T, index: number, array: T[]) => U | ReadonlyArray<U>,
+        thisArg?: This
+    ): U[]
+
+
+    /**
+     * Returns a new array with all sub-array elements concatenated into it recursively up to the
+     * specified depth.
+     *
+     * @param depth The maximum recursion depth
+     */
+    flat<A, D extends number = 1>(
+        this: A,
+        depth?: D
+    ): FlatArray<A, D>[]
+  }
+
+interface Array<T> {
+
+    /**
+     * Calls a defined callback function on each element of an array. Then, flattens the result into
+     * a new array.
+     * This is identical to a map followed by flat with depth 1.
+     *
+     * @param callback A function that accepts up to three arguments. The flatMap method calls the
+     * callback function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callback function. If
+     * thisArg is omitted, undefined is used as the this value.
+     */
+    flatMap<U, This = undefined> (
+        callback: (this: This, value: T, index: number, array: T[]) => U | ReadonlyArray<U>,
+        thisArg?: This
+    ): U[]
+
+    /**
+     * Returns a new array with all sub-array elements concatenated into it recursively up to the
+     * specified depth.
+     *
+     * @param depth The maximum recursion depth
+     */
+    flat<A, D extends number = 1>(
+        this: A,
+        depth?: D
+    ): FlatArray<A, D>[]
+}
+`; $i["lib.es2019.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2018" />
+/// <reference lib="es2019.array" />
+/// <reference lib="es2019.object" />
+/// <reference lib="es2019.string" />
+/// <reference lib="es2019.symbol" />
+/// <reference lib="es2019.intl" />
+`; $i["lib.es2019.full.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2019" />
+/// <reference lib="dom" />
+/// <reference lib="webworker.importscripts" />
+/// <reference lib="scripthost" />
+/// <reference lib="dom.iterable" />
+`; $i["lib.es2019.intl.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+declare namespace Intl {
+    interface DateTimeFormatPartTypesRegistry {
+        unknown: any
+    }
+}
+`; $i["lib.es2019.object.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2015.iterable" />
+
+interface ObjectConstructor {
+    /**
+     * Returns an object created by key-value entries for properties and methods
+     * @param entries An iterable object that contains key-value entries for properties and methods.
+     */
+    fromEntries<T = any>(entries: Iterable<readonly [PropertyKey, T]>): { [k: string]: T };
+
+    /**
+     * Returns an object created by key-value entries for properties and methods
+     * @param entries An iterable object that contains key-value entries for properties and methods.
+     */
+    fromEntries(entries: Iterable<readonly any[]>): any;
+}
+`; $i["lib.es2019.string.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface String {
+    /** Removes the trailing white space and line terminator characters from a string. */
+    trimEnd(): string;
+
+    /** Removes the leading white space and line terminator characters from a string. */
+    trimStart(): string;
+
+    /**
+     * Removes the leading white space and line terminator characters from a string.
+     * @deprecated A legacy feature for browser compatibility. Use \`trimStart\` instead
+     */
+    trimLeft(): string;
+
+    /**
+     * Removes the trailing white space and line terminator characters from a string.
+     * @deprecated A legacy feature for browser compatibility. Use \`trimEnd\` instead
+     */
+    trimRight(): string;
+}
+`; $i["lib.es2019.symbol.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface Symbol {
+    /**
+     * Expose the [[Description]] internal slot of a symbol directly.
+     */
+    readonly description: string | undefined;
+}
+`; $i["lib.es2020.bigint.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2020.intl" />
+
+interface BigIntToLocaleStringOptions {
+    /**
+     * The locale matching algorithm to use.The default is "best fit". For information about this option, see the {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_negotiation Intl page}.
+     */
+    localeMatcher?: string;
+    /**
+     * The formatting style to use , the default is "decimal".
+     */
+    style?: string;
+
+    numberingSystem?: string;
+    /**
+     * The unit to use in unit formatting, Possible values are core unit identifiers, defined in UTS #35, Part 2, Section 6. A subset of units from the full list was selected for use in ECMAScript. Pairs of simple units can be concatenated with "-per-" to make a compound unit. There is no default value; if the style is "unit", the unit property must be provided.
+     */
+    unit?: string;
+
+    /**
+     * The unit formatting style to use in unit formatting, the defaults is "short".
+     */
+    unitDisplay?: string;
+
+    /**
+     * The currency to use in currency formatting. Possible values are the ISO 4217 currency codes, such as "USD" for the US dollar, "EUR" for the euro, or "CNY" for the Chinese RMB \u2014 see the Current currency & funds code list. There is no default value; if the style is "currency", the currency property must be provided. It is only used when [[Style]] has the value "currency".
+     */
+    currency?: string;
+
+    /**
+     * How to display the currency in currency formatting. It is only used when [[Style]] has the value "currency". The default is "symbol".
+     *
+     * "symbol" to use a localized currency symbol such as \u20AC,
+     *
+     * "code" to use the ISO currency code,
+     *
+     * "name" to use a localized currency name such as "dollar"
+     */
+    currencyDisplay?: string;
+
+    /**
+     * Whether to use grouping separators, such as thousands separators or thousand/lakh/crore separators. The default is true.
+     */
+    useGrouping?: boolean;
+
+    /**
+     * The minimum number of integer digits to use. Possible values are from 1 to 21; the default is 1.
+     */
+    minimumIntegerDigits?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21;
+
+    /**
+     * The minimum number of fraction digits to use. Possible values are from 0 to 20; the default for plain number and percent formatting is 0; the default for currency formatting is the number of minor unit digits provided by the {@link http://www.currency-iso.org/en/home/tables/table-a1.html ISO 4217 currency codes list} (2 if the list doesn't provide that information).
+     */
+    minimumFractionDigits?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20;
+
+    /**
+     * The maximum number of fraction digits to use. Possible values are from 0 to 20; the default for plain number formatting is the larger of minimumFractionDigits and 3; the default for currency formatting is the larger of minimumFractionDigits and the number of minor unit digits provided by the {@link http://www.currency-iso.org/en/home/tables/table-a1.html ISO 4217 currency codes list} (2 if the list doesn't provide that information); the default for percent formatting is the larger of minimumFractionDigits and 0.
+     */
+    maximumFractionDigits?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20;
+
+    /**
+     * The minimum number of significant digits to use. Possible values are from 1 to 21; the default is 1.
+     */
+    minimumSignificantDigits?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21;
+
+    /**
+     * The maximum number of significant digits to use. Possible values are from 1 to 21; the default is 21.
+     */
+    maximumSignificantDigits?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21;
+
+    /**
+     * The formatting that should be displayed for the number, the defaults is "standard"
+     *
+     *     "standard" plain number formatting
+     *
+     *     "scientific" return the order-of-magnitude for formatted number.
+     *
+     *     "engineering" return the exponent of ten when divisible by three
+     *
+     *     "compact" string representing exponent, defaults is using the "short" form
+     */
+    notation?: string;
+
+    /**
+     * used only when notation is "compact"
+     */
+    compactDisplay?: string;
+}
+
+interface BigInt {
+    /**
+     * Returns a string representation of an object.
+     * @param radix Specifies a radix for converting numeric values to strings.
+     */
+    toString(radix?: number): string;
+
+    /** Returns a string representation appropriate to the host environment's current locale. */
+    toLocaleString(locales?: Intl.LocalesArgument, options?: BigIntToLocaleStringOptions): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): bigint;
+
+    readonly [Symbol.toStringTag]: "BigInt";
+}
+
+interface BigIntConstructor {
+    (value: bigint | boolean | number | string): bigint;
+    readonly prototype: BigInt;
+
+    /**
+     * Interprets the low bits of a BigInt as a 2's-complement signed integer.
+     * All higher bits are discarded.
+     * @param bits The number of low bits to use
+     * @param int The BigInt whose bits to extract
+     */
+    asIntN(bits: number, int: bigint): bigint;
+    /**
+     * Interprets the low bits of a BigInt as an unsigned integer.
+     * All higher bits are discarded.
+     * @param bits The number of low bits to use
+     * @param int The BigInt whose bits to extract
+     */
+    asUintN(bits: number, int: bigint): bigint;
+}
+
+declare var BigInt: BigIntConstructor;
+
+/**
+ * A typed array of 64-bit signed integer values. The contents are initialized to 0. If the
+ * requested number of bytes could not be allocated, an exception is raised.
+ */
+interface BigInt64Array {
+    /** The size in bytes of each element in the array. */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /** The ArrayBuffer instance referenced by the array. */
+    readonly buffer: ArrayBufferLike;
+
+    /** The length in bytes of the array. */
+    readonly byteLength: number;
+
+    /** The offset in bytes of the array. */
+    readonly byteOffset: number;
+
+    /**
+     * Returns the this object after copying a section of the array identified by start and end
+     * to the same array starting at position target
+     * @param target If target is negative, it is treated as length+target where length is the
+     * length of the array.
+     * @param start If start is negative, it is treated as length+start. If end is negative, it
+     * is treated as length+end.
+     * @param end If not specified, length of the this object is used as its default value.
+     */
+    copyWithin(target: number, start: number, end?: number): this;
+
+    /** Yields index, value pairs for every entry in the array. */
+    entries(): IterableIterator<[number, bigint]>;
+
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns false,
+     * or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every(predicate: (value: bigint, index: number, array: BigInt64Array) => boolean, thisArg?: any): boolean;
+
+    /**
+     * Changes all array elements from \`start\` to \`end\` index to a static \`value\` and returns the modified array
+     * @param value value to fill array section with
+     * @param start index to start filling the array at. If start is negative, it is treated as
+     * length+start where length is the length of the array.
+     * @param end index to stop filling the array at. If end is negative, it is treated as
+     * length+end.
+     */
+    fill(value: bigint, start?: number, end?: number): this;
+
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls
+     * the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    filter(predicate: (value: bigint, index: number, array: BigInt64Array) => any, thisArg?: any): BigInt64Array;
+
+    /**
+     * Returns the value of the first element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found, find
+     * immediately returns that element value. Otherwise, find returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    find(predicate: (value: bigint, index: number, array: BigInt64Array) => boolean, thisArg?: any): bigint | undefined;
+
+    /**
+     * Returns the index of the first element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findIndex(predicate: (value: bigint, index: number, array: BigInt64Array) => boolean, thisArg?: any): number;
+
+    /**
+     * Performs the specified action for each element in an array.
+     * @param callbackfn A function that accepts up to three arguments. forEach calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: bigint, index: number, array: BigInt64Array) => void, thisArg?: any): void;
+
+    /**
+     * Determines whether an array includes a certain element, returning true or false as appropriate.
+     * @param searchElement The element to search for.
+     * @param fromIndex The position in this array at which to begin searching for searchElement.
+     */
+    includes(searchElement: bigint, fromIndex?: number): boolean;
+
+    /**
+     * Returns the index of the first occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     * search starts at index 0.
+     */
+    indexOf(searchElement: bigint, fromIndex?: number): number;
+
+    /**
+     * Adds all the elements of an array separated by the specified separator string.
+     * @param separator A string used to separate one element of an array from the next in the
+     * resulting String. If omitted, the array elements are separated with a comma.
+     */
+    join(separator?: string): string;
+
+    /** Yields each index in the array. */
+    keys(): IterableIterator<number>;
+
+    /**
+     * Returns the index of the last occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     * search starts at index 0.
+     */
+    lastIndexOf(searchElement: bigint, fromIndex?: number): number;
+
+    /** The length of the array. */
+    readonly length: number;
+
+    /**
+     * Calls a defined callback function on each element of an array, and returns an array that
+     * contains the results.
+     * @param callbackfn A function that accepts up to three arguments. The map method calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    map(callbackfn: (value: bigint, index: number, array: BigInt64Array) => bigint, thisArg?: any): BigInt64Array;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce(callbackfn: (previousValue: bigint, currentValue: bigint, currentIndex: number, array: BigInt64Array) => bigint): bigint;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce<U>(callbackfn: (previousValue: U, currentValue: bigint, currentIndex: number, array: BigInt64Array) => U, initialValue: U): U;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an
+     * argument instead of an array value.
+     */
+    reduceRight(callbackfn: (previousValue: bigint, currentValue: bigint, currentIndex: number, array: BigInt64Array) => bigint): bigint;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduceRight<U>(callbackfn: (previousValue: U, currentValue: bigint, currentIndex: number, array: BigInt64Array) => U, initialValue: U): U;
+
+    /** Reverses the elements in the array. */
+    reverse(): this;
+
+    /**
+     * Sets a value or an array of values.
+     * @param array A typed or untyped array of values to set.
+     * @param offset The index in the current array at which the values are to be written.
+     */
+    set(array: ArrayLike<bigint>, offset?: number): void;
+
+    /**
+     * Returns a section of an array.
+     * @param start The beginning of the specified portion of the array.
+     * @param end The end of the specified portion of the array.
+     */
+    slice(start?: number, end?: number): BigInt64Array;
+
+    /**
+     * Determines whether the specified callback function returns true for any element of an array.
+     * @param predicate A function that accepts up to three arguments. The some method calls the
+     * predicate function for each element in the array until the predicate returns true, or until
+     * the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    some(predicate: (value: bigint, index: number, array: BigInt64Array) => boolean, thisArg?: any): boolean;
+
+    /**
+     * Sorts the array.
+     * @param compareFn The function used to determine the order of the elements. If omitted, the elements are sorted in ascending order.
+     */
+    sort(compareFn?: (a: bigint, b: bigint) => number | bigint): this;
+
+    /**
+     * Gets a new BigInt64Array view of the ArrayBuffer store for this array, referencing the elements
+     * at begin, inclusive, up to end, exclusive.
+     * @param begin The index of the beginning of the array.
+     * @param end The index of the end of the array.
+     */
+    subarray(begin?: number, end?: number): BigInt64Array;
+
+    /** Converts the array to a string by using the current locale. */
+    toLocaleString(): string;
+
+    /** Returns a string representation of the array. */
+    toString(): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): BigInt64Array;
+
+    /** Yields each value in the array. */
+    values(): IterableIterator<bigint>;
+
+    [Symbol.iterator](): IterableIterator<bigint>;
+
+    readonly [Symbol.toStringTag]: "BigInt64Array";
+
+    [index: number]: bigint;
+}
+
+interface BigInt64ArrayConstructor {
+    readonly prototype: BigInt64Array;
+    new(length?: number): BigInt64Array;
+    new(array: Iterable<bigint>): BigInt64Array;
+    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): BigInt64Array;
+
+    /** The size in bytes of each element in the array. */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * Returns a new array from a set of elements.
+     * @param items A set of elements to include in the new array object.
+     */
+    of(...items: bigint[]): BigInt64Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from(arrayLike: ArrayLike<bigint>): BigInt64Array;
+    from<U>(arrayLike: ArrayLike<U>, mapfn: (v: U, k: number) => bigint, thisArg?: any): BigInt64Array;
+}
+
+declare var BigInt64Array: BigInt64ArrayConstructor;
+
+/**
+ * A typed array of 64-bit unsigned integer values. The contents are initialized to 0. If the
+ * requested number of bytes could not be allocated, an exception is raised.
+ */
+interface BigUint64Array {
+    /** The size in bytes of each element in the array. */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /** The ArrayBuffer instance referenced by the array. */
+    readonly buffer: ArrayBufferLike;
+
+    /** The length in bytes of the array. */
+    readonly byteLength: number;
+
+    /** The offset in bytes of the array. */
+    readonly byteOffset: number;
+
+    /**
+     * Returns the this object after copying a section of the array identified by start and end
+     * to the same array starting at position target
+     * @param target If target is negative, it is treated as length+target where length is the
+     * length of the array.
+     * @param start If start is negative, it is treated as length+start. If end is negative, it
+     * is treated as length+end.
+     * @param end If not specified, length of the this object is used as its default value.
+     */
+    copyWithin(target: number, start: number, end?: number): this;
+
+    /** Yields index, value pairs for every entry in the array. */
+    entries(): IterableIterator<[number, bigint]>;
+
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns false,
+     * or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every(predicate: (value: bigint, index: number, array: BigUint64Array) => boolean, thisArg?: any): boolean;
+
+    /**
+     * Changes all array elements from \`start\` to \`end\` index to a static \`value\` and returns the modified array
+     * @param value value to fill array section with
+     * @param start index to start filling the array at. If start is negative, it is treated as
+     * length+start where length is the length of the array.
+     * @param end index to stop filling the array at. If end is negative, it is treated as
+     * length+end.
+     */
+    fill(value: bigint, start?: number, end?: number): this;
+
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls
+     * the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    filter(predicate: (value: bigint, index: number, array: BigUint64Array) => any, thisArg?: any): BigUint64Array;
+
+    /**
+     * Returns the value of the first element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found, find
+     * immediately returns that element value. Otherwise, find returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    find(predicate: (value: bigint, index: number, array: BigUint64Array) => boolean, thisArg?: any): bigint | undefined;
+
+    /**
+     * Returns the index of the first element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findIndex(predicate: (value: bigint, index: number, array: BigUint64Array) => boolean, thisArg?: any): number;
+
+    /**
+     * Performs the specified action for each element in an array.
+     * @param callbackfn A function that accepts up to three arguments. forEach calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: bigint, index: number, array: BigUint64Array) => void, thisArg?: any): void;
+
+    /**
+     * Determines whether an array includes a certain element, returning true or false as appropriate.
+     * @param searchElement The element to search for.
+     * @param fromIndex The position in this array at which to begin searching for searchElement.
+     */
+    includes(searchElement: bigint, fromIndex?: number): boolean;
+
+    /**
+     * Returns the index of the first occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     * search starts at index 0.
+     */
+    indexOf(searchElement: bigint, fromIndex?: number): number;
+
+    /**
+     * Adds all the elements of an array separated by the specified separator string.
+     * @param separator A string used to separate one element of an array from the next in the
+     * resulting String. If omitted, the array elements are separated with a comma.
+     */
+    join(separator?: string): string;
+
+    /** Yields each index in the array. */
+    keys(): IterableIterator<number>;
+
+    /**
+     * Returns the index of the last occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     * search starts at index 0.
+     */
+    lastIndexOf(searchElement: bigint, fromIndex?: number): number;
+
+    /** The length of the array. */
+    readonly length: number;
+
+    /**
+     * Calls a defined callback function on each element of an array, and returns an array that
+     * contains the results.
+     * @param callbackfn A function that accepts up to three arguments. The map method calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    map(callbackfn: (value: bigint, index: number, array: BigUint64Array) => bigint, thisArg?: any): BigUint64Array;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce(callbackfn: (previousValue: bigint, currentValue: bigint, currentIndex: number, array: BigUint64Array) => bigint): bigint;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce<U>(callbackfn: (previousValue: U, currentValue: bigint, currentIndex: number, array: BigUint64Array) => U, initialValue: U): U;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an
+     * argument instead of an array value.
+     */
+    reduceRight(callbackfn: (previousValue: bigint, currentValue: bigint, currentIndex: number, array: BigUint64Array) => bigint): bigint;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduceRight<U>(callbackfn: (previousValue: U, currentValue: bigint, currentIndex: number, array: BigUint64Array) => U, initialValue: U): U;
+
+    /** Reverses the elements in the array. */
+    reverse(): this;
+
+    /**
+     * Sets a value or an array of values.
+     * @param array A typed or untyped array of values to set.
+     * @param offset The index in the current array at which the values are to be written.
+     */
+    set(array: ArrayLike<bigint>, offset?: number): void;
+
+    /**
+     * Returns a section of an array.
+     * @param start The beginning of the specified portion of the array.
+     * @param end The end of the specified portion of the array.
+     */
+    slice(start?: number, end?: number): BigUint64Array;
+
+    /**
+     * Determines whether the specified callback function returns true for any element of an array.
+     * @param predicate A function that accepts up to three arguments. The some method calls the
+     * predicate function for each element in the array until the predicate returns true, or until
+     * the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    some(predicate: (value: bigint, index: number, array: BigUint64Array) => boolean, thisArg?: any): boolean;
+
+    /**
+     * Sorts the array.
+     * @param compareFn The function used to determine the order of the elements. If omitted, the elements are sorted in ascending order.
+     */
+    sort(compareFn?: (a: bigint, b: bigint) => number | bigint): this;
+
+    /**
+     * Gets a new BigUint64Array view of the ArrayBuffer store for this array, referencing the elements
+     * at begin, inclusive, up to end, exclusive.
+     * @param begin The index of the beginning of the array.
+     * @param end The index of the end of the array.
+     */
+    subarray(begin?: number, end?: number): BigUint64Array;
+
+    /** Converts the array to a string by using the current locale. */
+    toLocaleString(): string;
+
+    /** Returns a string representation of the array. */
+    toString(): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): BigUint64Array;
+
+    /** Yields each value in the array. */
+    values(): IterableIterator<bigint>;
+
+    [Symbol.iterator](): IterableIterator<bigint>;
+
+    readonly [Symbol.toStringTag]: "BigUint64Array";
+
+    [index: number]: bigint;
+}
+
+interface BigUint64ArrayConstructor {
+    readonly prototype: BigUint64Array;
+    new(length?: number): BigUint64Array;
+    new(array: Iterable<bigint>): BigUint64Array;
+    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): BigUint64Array;
+
+    /** The size in bytes of each element in the array. */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * Returns a new array from a set of elements.
+     * @param items A set of elements to include in the new array object.
+     */
+    of(...items: bigint[]): BigUint64Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from(arrayLike: ArrayLike<bigint>): BigUint64Array;
+    from<U>(arrayLike: ArrayLike<U>, mapfn: (v: U, k: number) => bigint, thisArg?: any): BigUint64Array;
+}
+
+declare var BigUint64Array: BigUint64ArrayConstructor;
+
+interface DataView {
+    /**
+     * Gets the BigInt64 value at the specified byte offset from the start of the view. There is
+     * no alignment constraint; multi-byte values may be fetched from any offset.
+     * @param byteOffset The place in the buffer at which the value should be retrieved.
+     * @param littleEndian If false or undefined, a big-endian value should be read.
+     */
+    getBigInt64(byteOffset: number, littleEndian?: boolean): bigint;
+
+    /**
+     * Gets the BigUint64 value at the specified byte offset from the start of the view. There is
+     * no alignment constraint; multi-byte values may be fetched from any offset.
+     * @param byteOffset The place in the buffer at which the value should be retrieved.
+     * @param littleEndian If false or undefined, a big-endian value should be read.
+     */
+    getBigUint64(byteOffset: number, littleEndian?: boolean): bigint;
+
+    /**
+     * Stores a BigInt64 value at the specified byte offset from the start of the view.
+     * @param byteOffset The place in the buffer at which the value should be set.
+     * @param value The value to set.
+     * @param littleEndian If false or undefined, a big-endian value should be written.
+     */
+    setBigInt64(byteOffset: number, value: bigint, littleEndian?: boolean): void;
+
+    /**
+     * Stores a BigUint64 value at the specified byte offset from the start of the view.
+     * @param byteOffset The place in the buffer at which the value should be set.
+     * @param value The value to set.
+     * @param littleEndian If false or undefined, a big-endian value should be written.
+     */
+    setBigUint64(byteOffset: number, value: bigint, littleEndian?: boolean): void;
+}
+
+declare namespace Intl{
+    interface NumberFormat {
+        format(value: number | bigint): string;
+        resolvedOptions(): ResolvedNumberFormatOptions;
+    }
+}
+`; $i["lib.es2020.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2019" />
+/// <reference lib="es2020.bigint" />
+/// <reference lib="es2020.date" />
+/// <reference lib="es2020.number" />
+/// <reference lib="es2020.promise" />
+/// <reference lib="es2020.sharedmemory" />
+/// <reference lib="es2020.string" />
+/// <reference lib="es2020.symbol.wellknown" />
+/// <reference lib="es2020.intl" />
+`; $i["lib.es2020.date.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2020.intl" />
+
+interface Date {
+    /**
+     * Converts a date and time to a string by using the current or specified locale.
+     * @param locales A locale string, array of locale strings, Intl.Locale object, or array of Intl.Locale objects that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
+     * @param options An object that contains one or more properties that specify comparison options.
+     */
+    toLocaleString(locales?: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string;
+
+    /**
+     * Converts a date to a string by using the current or specified locale.
+     * @param locales A locale string, array of locale strings, Intl.Locale object, or array of Intl.Locale objects that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
+     * @param options An object that contains one or more properties that specify comparison options.
+     */
+    toLocaleDateString(locales?: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string;
+
+    /**
+     * Converts a time to a string by using the current or specified locale.
+     * @param locales A locale string, array of locale strings, Intl.Locale object, or array of Intl.Locale objects that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
+     * @param options An object that contains one or more properties that specify comparison options.
+     */
+    toLocaleTimeString(locales?: Intl.LocalesArgument, options?: Intl.DateTimeFormatOptions): string;
+}`; $i["lib.es2020.full.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2020" />
+/// <reference lib="dom" />
+/// <reference lib="webworker.importscripts" />
+/// <reference lib="scripthost" />
+/// <reference lib="dom.iterable" />
+`; $i["lib.es2020.intl.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2018.intl" />
+declare namespace Intl {
+
+    /**
+     * [Unicode BCP 47 Locale Identifiers](https://unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers) definition.
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locales_argument).
+     */
+    type UnicodeBCP47LocaleIdentifier = string;
+
+    /**
+     * Unit to use in the relative time internationalized message.
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/format#Parameters).
+     */
+    type RelativeTimeFormatUnit =
+        | "year"
+        | "years"
+        | "quarter"
+        | "quarters"
+        | "month"
+        | "months"
+        | "week"
+        | "weeks"
+        | "day"
+        | "days"
+        | "hour"
+        | "hours"
+        | "minute"
+        | "minutes"
+        | "second"
+        | "seconds";
+
+    /**
+     * Value of the \`unit\` property in objects returned by
+     * \`Intl.RelativeTimeFormat.prototype.formatToParts()\`. \`formatToParts\` and
+     * \`format\` methods accept either singular or plural unit names as input,
+     * but \`formatToParts\` only outputs singular (e.g. "day") not plural (e.g.
+     * "days").
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/formatToParts#Using_formatToParts).
+     */
+     type RelativeTimeFormatUnitSingular =
+        | "year"
+        | "quarter"
+        | "month"
+        | "week"
+        | "day"
+        | "hour"
+        | "minute"
+        | "second";
+
+    /**
+     * The locale matching algorithm to use.
+     *
+     * [MDN](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_negotiation).
+     */
+    type RelativeTimeFormatLocaleMatcher = "lookup" | "best fit";
+
+    /**
+     * The format of output message.
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/RelativeTimeFormat#Parameters).
+     */
+    type RelativeTimeFormatNumeric = "always" | "auto";
+
+    /**
+     * The length of the internationalized message.
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/RelativeTimeFormat#Parameters).
+     */
+    type RelativeTimeFormatStyle = "long" | "short" | "narrow";
+
+    /**
+     * [BCP 47 language tag](http://tools.ietf.org/html/rfc5646) definition.
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locales_argument).
+     */
+    type BCP47LanguageTag = string;
+
+    /**
+     * The locale(s) to use
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locales_argument).
+     */
+    type LocalesArgument = UnicodeBCP47LocaleIdentifier | Locale | readonly (UnicodeBCP47LocaleIdentifier | Locale)[] | undefined;
+
+    /**
+     * An object with some or all of properties of \`options\` parameter
+     * of \`Intl.RelativeTimeFormat\` constructor.
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/RelativeTimeFormat#Parameters).
+     */
+    interface RelativeTimeFormatOptions {
+        /** The locale matching algorithm to use. For information about this option, see [Intl page](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_negotiation). */
+        localeMatcher?: RelativeTimeFormatLocaleMatcher;
+        /** The format of output message. */
+        numeric?: RelativeTimeFormatNumeric;
+        /** The length of the internationalized message. */
+        style?: RelativeTimeFormatStyle;
+    }
+
+    /**
+     * An object with properties reflecting the locale
+     * and formatting options computed during initialization
+     * of the \`Intl.RelativeTimeFormat\` object
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/resolvedOptions#Description).
+     */
+    interface ResolvedRelativeTimeFormatOptions {
+        locale: UnicodeBCP47LocaleIdentifier;
+        style: RelativeTimeFormatStyle;
+        numeric: RelativeTimeFormatNumeric;
+        numberingSystem: string;
+    }
+
+    /**
+     * An object representing the relative time format in parts
+     * that can be used for custom locale-aware formatting.
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/formatToParts#Using_formatToParts).
+     */
+    type RelativeTimeFormatPart =
+        | {
+              type: "literal";
+              value: string;
+          }
+        | {
+              type: Exclude<NumberFormatPartTypes, "literal">;
+              value: string;
+              unit: RelativeTimeFormatUnitSingular;
+          };
+
+    interface RelativeTimeFormat {
+        /**
+         * Formats a value and a unit according to the locale
+         * and formatting options of the given
+         * [\`Intl.RelativeTimeFormat\`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat)
+         * object.
+         *
+         * While this method automatically provides the correct plural forms,
+         * the grammatical form is otherwise as neutral as possible.
+         *
+         * It is the caller's responsibility to handle cut-off logic
+         * such as deciding between displaying "in 7 days" or "in 1 week".
+         * This API does not support relative dates involving compound units.
+         * e.g "in 5 days and 4 hours".
+         *
+         * @param value -  Numeric value to use in the internationalized relative time message
+         *
+         * @param unit - [Unit](https://tc39.es/ecma402/#sec-singularrelativetimeunit) to use in the relative time internationalized message.
+         *
+         * @throws \`RangeError\` if \`unit\` was given something other than \`unit\` possible values
+         *
+         * @returns {string} Internationalized relative time message as string
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/format).
+         */
+        format(value: number, unit: RelativeTimeFormatUnit): string;
+
+        /**
+         *  Returns an array of objects representing the relative time format in parts that can be used for custom locale-aware formatting.
+         *
+         *  @param value - Numeric value to use in the internationalized relative time message
+         *
+         *  @param unit - [Unit](https://tc39.es/ecma402/#sec-singularrelativetimeunit) to use in the relative time internationalized message.
+         *
+         *  @throws \`RangeError\` if \`unit\` was given something other than \`unit\` possible values
+         *
+         *  [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/formatToParts).
+         */
+        formatToParts(value: number, unit: RelativeTimeFormatUnit): RelativeTimeFormatPart[];
+
+        /**
+         * Provides access to the locale and options computed during initialization of this \`Intl.RelativeTimeFormat\` object.
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/resolvedOptions).
+         */
+        resolvedOptions(): ResolvedRelativeTimeFormatOptions;
+    }
+
+    /**
+     * The [\`Intl.RelativeTimeFormat\`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat)
+     * object is a constructor for objects that enable language-sensitive relative time formatting.
+     *
+     * [Compatibility](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat#Browser_compatibility).
+     */
+    const RelativeTimeFormat: {
+        /**
+         * Creates [Intl.RelativeTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat) objects
+         *
+         * @param locales - A string with a [BCP 47 language tag](http://tools.ietf.org/html/rfc5646), or an array of such strings.
+         *  For the general form and interpretation of the locales argument,
+         *  see the [\`Intl\` page](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation).
+         *
+         * @param options - An [object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/RelativeTimeFormat#Parameters)
+         *  with some or all of options of \`RelativeTimeFormatOptions\`.
+         *
+         * @returns [Intl.RelativeTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat) object.
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/RelativeTimeFormat).
+         */
+        new(
+            locales?: UnicodeBCP47LocaleIdentifier | UnicodeBCP47LocaleIdentifier[],
+            options?: RelativeTimeFormatOptions,
+        ): RelativeTimeFormat;
+
+        /**
+         * Returns an array containing those of the provided locales
+         * that are supported in date and time formatting
+         * without having to fall back to the runtime's default locale.
+         *
+         * @param locales - A string with a [BCP 47 language tag](http://tools.ietf.org/html/rfc5646), or an array of such strings.
+         *  For the general form and interpretation of the locales argument,
+         *  see the [\`Intl\` page](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation).
+         *
+         * @param options - An [object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/RelativeTimeFormat#Parameters)
+         *  with some or all of options of the formatting.
+         *
+         * @returns An array containing those of the provided locales
+         *  that are supported in date and time formatting
+         *  without having to fall back to the runtime's default locale.
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/supportedLocalesOf).
+         */
+        supportedLocalesOf(
+            locales?: UnicodeBCP47LocaleIdentifier | UnicodeBCP47LocaleIdentifier[],
+            options?: RelativeTimeFormatOptions,
+        ): UnicodeBCP47LocaleIdentifier[];
+    };
+
+    interface NumberFormatOptions {
+        compactDisplay?: "short" | "long" | undefined;
+        notation?: "standard" | "scientific" | "engineering" | "compact" | undefined;
+        signDisplay?: "auto" | "never" | "always" | "exceptZero" | undefined;
+        unit?: string | undefined;
+        unitDisplay?: "short" | "long" | "narrow" | undefined;
+        currencyDisplay?: string | undefined;
+        currencySign?: string | undefined;
+    }
+
+    interface ResolvedNumberFormatOptions {
+        compactDisplay?: "short" | "long";
+        notation?: "standard" | "scientific" | "engineering" | "compact";
+        signDisplay?: "auto" | "never" | "always" | "exceptZero";
+        unit?: string;
+        unitDisplay?: "short" | "long" | "narrow";
+        currencyDisplay?: string;
+        currencySign?: string;
+    }
+
+    interface DateTimeFormatOptions {
+        calendar?: string | undefined;
+        dayPeriod?: "narrow" | "short" | "long" | undefined;
+        numberingSystem?: string | undefined;
+
+        dateStyle?: "full" | "long" | "medium" | "short" | undefined;
+        timeStyle?: "full" | "long" | "medium" | "short" | undefined;
+        hourCycle?: "h11" | "h12" | "h23" | "h24" | undefined;
+    }
+
+    type LocaleHourCycleKey = "h12" | "h23" | "h11" | "h24";
+    type LocaleCollationCaseFirst = "upper" | "lower" | "false";
+
+    interface LocaleOptions {
+        /** A string containing the language, and the script and region if available. */
+        baseName?: string;
+        /** The part of the Locale that indicates the locale's calendar era. */
+        calendar?: string;
+        /** Flag that defines whether case is taken into account for the locale's collation rules. */
+        caseFirst?: LocaleCollationCaseFirst;
+        /** The collation type used for sorting */
+        collation?: string;
+        /** The time keeping format convention used by the locale. */
+        hourCycle?: LocaleHourCycleKey;
+        /** The primary language subtag associated with the locale. */
+        language?: string;
+        /** The numeral system used by the locale. */
+        numberingSystem?: string;
+        /** Flag that defines whether the locale has special collation handling for numeric characters. */
+        numeric?: boolean;
+        /** The region of the world (usually a country) associated with the locale. Possible values are region codes as defined by ISO 3166-1. */
+        region?: string;
+        /** The script used for writing the particular language used in the locale. Possible values are script codes as defined by ISO 15924. */
+        script?: string;
+    }
+
+    interface Locale extends LocaleOptions {
+        /** A string containing the language, and the script and region if available. */
+        baseName: string;
+        /** The primary language subtag associated with the locale. */
+        language: string;
+        /** Gets the most likely values for the language, script, and region of the locale based on existing values. */
+        maximize(): Locale;
+        /** Attempts to remove information about the locale that would be added by calling \`Locale.maximize()\`. */
+        minimize(): Locale;
+        /** Returns the locale's full locale identifier string. */
+        toString(): BCP47LanguageTag;
+    }
+
+    /**
+     * Constructor creates [Intl.Locale](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale)
+     * objects
+     *
+     * @param tag - A string with a [BCP 47 language tag](http://tools.ietf.org/html/rfc5646).
+     *  For the general form and interpretation of the locales argument,
+     *  see the [\`Intl\` page](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation).
+     *
+     * @param options - An [object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/Locale#Parameters) with some or all of options of the locale.
+     *
+     * @returns [Intl.Locale](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale) object.
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale).
+     */
+    const Locale: {
+        new (tag: BCP47LanguageTag | Locale, options?: LocaleOptions): Locale;
+    };
+
+    type DisplayNamesFallback =
+        | "code"
+        | "none";
+
+    type DisplayNamesType =
+        | "language"
+        | "region"
+        | "script"
+        | "calendar"
+        | "dateTimeField"
+        | "currency";
+
+    type DisplayNamesLanguageDisplay =
+        | "dialect"
+        | "standard";
+
+    interface DisplayNamesOptions {
+        localeMatcher?: RelativeTimeFormatLocaleMatcher;
+        style?: RelativeTimeFormatStyle;
+        type: DisplayNamesType;
+        languageDisplay?: DisplayNamesLanguageDisplay;
+        fallback?: DisplayNamesFallback;
+    }
+
+    interface ResolvedDisplayNamesOptions {
+        locale: UnicodeBCP47LocaleIdentifier;
+        style: RelativeTimeFormatStyle;
+        type: DisplayNamesType;
+        fallback: DisplayNamesFallback;
+        languageDisplay?: DisplayNamesLanguageDisplay;
+    }
+
+    interface DisplayNames {
+        /**
+         * Receives a code and returns a string based on the locale and options provided when instantiating
+         * [\`Intl.DisplayNames()\`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames)
+         *
+         * @param code The \`code\` to provide depends on the \`type\` passed to display name during creation:
+         *  - If the type is \`"region"\`, code should be either an [ISO-3166 two letters region code](https://www.iso.org/iso-3166-country-codes.html),
+         *    or a [three digits UN M49 Geographic Regions](https://unstats.un.org/unsd/methodology/m49/).
+         *  - If the type is \`"script"\`, code should be an [ISO-15924 four letters script code](https://unicode.org/iso15924/iso15924-codes.html).
+         *  - If the type is \`"language"\`, code should be a \`languageCode\` ["-" \`scriptCode\`] ["-" \`regionCode\` ] *("-" \`variant\` )
+         *    subsequence of the unicode_language_id grammar in [UTS 35's Unicode Language and Locale Identifiers grammar](https://unicode.org/reports/tr35/#Unicode_language_identifier).
+         *    \`languageCode\` is either a two letters ISO 639-1 language code or a three letters ISO 639-2 language code.
+         *  - If the type is \`"currency"\`, code should be a [3-letter ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html).
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames/of).
+         */
+        of(code: string): string | undefined;
+        /**
+         * Returns a new object with properties reflecting the locale and style formatting options computed during the construction of the current
+         * [\`Intl/DisplayNames\`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames) object.
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames/resolvedOptions).
+         */
+        resolvedOptions(): ResolvedDisplayNamesOptions;
+    }
+
+    /**
+     * The [\`Intl.DisplayNames()\`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames)
+     * object enables the consistent translation of language, region and script display names.
+     *
+     * [Compatibility](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames#browser_compatibility).
+     */
+    const DisplayNames: {
+        prototype: DisplayNames;
+
+        /**
+         * @param locales A string with a BCP 47 language tag, or an array of such strings.
+         *   For the general form and interpretation of the \`locales\` argument, see the [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locale_identification_and_negotiation)
+         *   page.
+         *
+         * @param options An object for setting up a display name.
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames/DisplayNames).
+         */
+        new(locales: LocalesArgument, options: DisplayNamesOptions): DisplayNames;
+
+        /**
+         * Returns an array containing those of the provided locales that are supported in display names without having to fall back to the runtime's default locale.
+         *
+         * @param locales A string with a BCP 47 language tag, or an array of such strings.
+         *   For the general form and interpretation of the \`locales\` argument, see the [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locale_identification_and_negotiation)
+         *   page.
+         *
+         * @param options An object with a locale matcher.
+         *
+         * @returns An array of strings representing a subset of the given locale tags that are supported in display names without having to fall back to the runtime's default locale.
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames/supportedLocalesOf).
+         */
+        supportedLocalesOf(locales?: LocalesArgument, options?: { localeMatcher?: RelativeTimeFormatLocaleMatcher }): BCP47LanguageTag[];
+    };
+
+}
+`; $i["lib.es2020.number.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2020.intl" />
+
+interface Number {
+    /**
+     * Converts a number to a string by using the current or specified locale.
+     * @param locales A locale string, array of locale strings, Intl.Locale object, or array of Intl.Locale objects that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
+     * @param options An object that contains one or more properties that specify comparison options.
+     */
+    toLocaleString(locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string;
+}
+`; $i["lib.es2020.promise.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface PromiseFulfilledResult<T> {
+    status: "fulfilled";
+    value: T;
+}
+
+interface PromiseRejectedResult {
+    status: "rejected";
+    reason: any;
+}
+
+type PromiseSettledResult<T> = PromiseFulfilledResult<T> | PromiseRejectedResult;
+
+interface PromiseConstructor {
+    /**
+     * Creates a Promise that is resolved with an array of results when all
+     * of the provided Promises resolve or reject.
+     * @param values An array of Promises.
+     * @returns A new Promise.
+     */
+    allSettled<T extends readonly unknown[] | []>(values: T): Promise<{ -readonly [P in keyof T]: PromiseSettledResult<Awaited<T[P]>> }>;
+
+    /**
+     * Creates a Promise that is resolved with an array of results when all
+     * of the provided Promises resolve or reject.
+     * @param values An array of Promises.
+     * @returns A new Promise.
+     */
+    allSettled<T>(values: Iterable<T | PromiseLike<T>>): Promise<PromiseSettledResult<Awaited<T>>[]>;
+}
+`; $i["lib.es2020.sharedmemory.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface Atomics {
+    /**
+     * Adds a value to the value at the given position in the array, returning the original value.
+     * Until this atomic operation completes, any other read or write operation against the array
+     * will block.
+     */
+    add(typedArray: BigInt64Array | BigUint64Array, index: number, value: bigint): bigint;
+
+    /**
+     * Stores the bitwise AND of a value with the value at the given position in the array,
+     * returning the original value. Until this atomic operation completes, any other read or
+     * write operation against the array will block.
+     */
+    and(typedArray: BigInt64Array | BigUint64Array, index: number, value: bigint): bigint;
+
+    /**
+     * Replaces the value at the given position in the array if the original value equals the given
+     * expected value, returning the original value. Until this atomic operation completes, any
+     * other read or write operation against the array will block.
+     */
+    compareExchange(typedArray: BigInt64Array | BigUint64Array, index: number, expectedValue: bigint, replacementValue: bigint): bigint;
+
+    /**
+     * Replaces the value at the given position in the array, returning the original value. Until
+     * this atomic operation completes, any other read or write operation against the array will
+     * block.
+     */
+    exchange(typedArray: BigInt64Array | BigUint64Array, index: number, value: bigint): bigint;
+
+    /**
+     * Returns the value at the given position in the array. Until this atomic operation completes,
+     * any other read or write operation against the array will block.
+     */
+    load(typedArray: BigInt64Array | BigUint64Array, index: number): bigint;
+
+    /**
+     * Stores the bitwise OR of a value with the value at the given position in the array,
+     * returning the original value. Until this atomic operation completes, any other read or write
+     * operation against the array will block.
+     */
+    or(typedArray: BigInt64Array | BigUint64Array, index: number, value: bigint): bigint;
+
+    /**
+     * Stores a value at the given position in the array, returning the new value. Until this
+     * atomic operation completes, any other read or write operation against the array will block.
+     */
+    store(typedArray: BigInt64Array | BigUint64Array, index: number, value: bigint): bigint;
+
+    /**
+     * Subtracts a value from the value at the given position in the array, returning the original
+     * value. Until this atomic operation completes, any other read or write operation against the
+     * array will block.
+     */
+    sub(typedArray: BigInt64Array | BigUint64Array, index: number, value: bigint): bigint;
+
+    /**
+     * If the value at the given position in the array is equal to the provided value, the current
+     * agent is put to sleep causing execution to suspend until the timeout expires (returning
+     * \`"timed-out"\`) or until the agent is awoken (returning \`"ok"\`); otherwise, returns
+     * \`"not-equal"\`.
+     */
+    wait(typedArray: BigInt64Array, index: number, value: bigint, timeout?: number): "ok" | "not-equal" | "timed-out";
+
+    /**
+     * Wakes up sleeping agents that are waiting on the given index of the array, returning the
+     * number of agents that were awoken.
+     * @param typedArray A shared BigInt64Array.
+     * @param index The position in the typedArray to wake up on.
+     * @param count The number of sleeping agents to notify. Defaults to +Infinity.
+     */
+    notify(typedArray: BigInt64Array, index: number, count?: number): number;
+
+    /**
+     * Stores the bitwise XOR of a value with the value at the given position in the array,
+     * returning the original value. Until this atomic operation completes, any other read or write
+     * operation against the array will block.
+     */
+    xor(typedArray: BigInt64Array | BigUint64Array, index: number, value: bigint): bigint;
+}
+`; $i["lib.es2020.string.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2015.iterable" />
+
+interface String {
+    /**
+     * Matches a string with a regular expression, and returns an iterable of matches
+     * containing the results of that search.
+     * @param regexp A variable name or string literal containing the regular expression pattern and flags.
+     */
+    matchAll(regexp: RegExp): IterableIterator<RegExpMatchArray>;
+}
+`; $i["lib.es2020.symbol.wellknown.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2015.iterable" />
+/// <reference lib="es2015.symbol" />
+
+interface SymbolConstructor {
+    /**
+     * A regular expression method that matches the regular expression against a string. Called
+     * by the String.prototype.matchAll method.
+     */
+    readonly matchAll: unique symbol;
+}
+
+interface RegExp {
+    /**
+     * Matches a string with this regular expression, and returns an iterable of matches
+     * containing the results of that search.
+     * @param string A string to search within.
+     */
+    [Symbol.matchAll](str: string): IterableIterator<RegExpMatchArray>;
+}
+`; $i["lib.es2021.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2020" />
+/// <reference lib="es2021.promise" />
+/// <reference lib="es2021.string" />
+/// <reference lib="es2021.weakref" />
+/// <reference lib="es2021.intl" />
+`; $i["lib.es2021.full.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2021" />
+/// <reference lib="dom" />
+/// <reference lib="webworker.importscripts" />
+/// <reference lib="scripthost" />
+/// <reference lib="dom.iterable" />
+`; $i["lib.es2021.intl.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+declare namespace Intl {
+
+    interface DateTimeFormatPartTypesRegistry {
+        fractionalSecond: any
+     }
+
+    interface DateTimeFormatOptions {
+        formatMatcher?: "basic" | "best fit" | "best fit" | undefined;
+        dateStyle?: "full" | "long" | "medium" | "short" | undefined;
+        timeStyle?: "full" | "long" | "medium" | "short" | undefined;
+        dayPeriod?: "narrow" | "short" | "long" | undefined;
+        fractionalSecondDigits?: 1 | 2 | 3 | undefined;
+    }
+
+    interface DateTimeRangeFormatPart extends DateTimeFormatPart {
+        source: "startRange" | "endRange" | "shared"
+    }
+
+    interface DateTimeFormat {
+        formatRange(startDate: Date | number | bigint, endDate: Date | number | bigint): string;
+        formatRangeToParts(startDate: Date | number | bigint, endDate: Date | number | bigint): DateTimeRangeFormatPart[];
+    }
+
+    interface ResolvedDateTimeFormatOptions {
+        formatMatcher?: "basic" | "best fit" | "best fit";
+        dateStyle?: "full" | "long" | "medium" | "short";
+        timeStyle?: "full" | "long" | "medium" | "short";
+        hourCycle?: "h11" | "h12" | "h23" | "h24";
+        dayPeriod?: "narrow" | "short" | "long";
+        fractionalSecondDigits?: 1 | 2 | 3;
+    }
+
+    /**
+     * The locale matching algorithm to use.
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat/ListFormat#parameters).
+     */
+    type ListFormatLocaleMatcher = "lookup" | "best fit";
+
+    /**
+     * The format of output message.
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat/ListFormat#parameters).
+     */
+    type ListFormatType = "conjunction" | "disjunction" | "unit";
+
+    /**
+     * The length of the formatted message.
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat/ListFormat#parameters).
+     */
+    type ListFormatStyle = "long" | "short" | "narrow";
+
+    /**
+     * An object with some or all properties of the \`Intl.ListFormat\` constructor \`options\` parameter.
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat/ListFormat#parameters).
+     */
+    interface ListFormatOptions {
+        /** The locale matching algorithm to use. For information about this option, see [Intl page](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_negotiation). */
+        localeMatcher?: ListFormatLocaleMatcher | undefined;
+        /** The format of output message. */
+        type?: ListFormatType | undefined;
+        /** The length of the internationalized message. */
+        style?: ListFormatStyle | undefined;
+    }
+
+    interface ResolvedListFormatOptions {
+        locale: string;
+        style: ListFormatStyle;
+        type: ListFormatType;
+    }
+
+    interface ListFormat {
+        /**
+         * Returns a string with a language-specific representation of the list.
+         *
+         * @param list - An iterable object, such as an [Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array).
+         *
+         * @throws \`TypeError\` if \`list\` includes something other than the possible values.
+         *
+         * @returns {string} A language-specific formatted string representing the elements of the list.
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat/format).
+         */
+        format(list: Iterable<string>): string;
+
+        /**
+         * Returns an Array of objects representing the different components that can be used to format a list of values in a locale-aware fashion.
+         *
+         * @param list - An iterable object, such as an [Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array), to be formatted according to a locale.
+         *
+         * @throws \`TypeError\` if \`list\` includes something other than the possible values.
+         *
+         * @returns {{ type: "element" | "literal", value: string; }[]} An Array of components which contains the formatted parts from the list.
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat/formatToParts).
+         */
+        formatToParts(list: Iterable<string>): { type: "element" | "literal", value: string; }[];
+
+        /**
+         * Returns a new object with properties reflecting the locale and style
+         * formatting options computed during the construction of the current
+         * \`Intl.ListFormat\` object.
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat/resolvedOptions).
+         */
+        resolvedOptions(): ResolvedListFormatOptions;
+    }
+
+    const ListFormat: {
+        prototype: ListFormat;
+
+        /**
+         * Creates [Intl.ListFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat) objects that
+         * enable language-sensitive list formatting.
+         *
+         * @param locales - A string with a [BCP 47 language tag](http://tools.ietf.org/html/rfc5646), or an array of such strings.
+         *  For the general form and interpretation of the \`locales\` argument,
+         *  see the [\`Intl\` page](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation).
+         *
+         * @param options - An [object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat/ListFormat#parameters)
+         *  with some or all options of \`ListFormatOptions\`.
+         *
+         * @returns [Intl.ListFormatOptions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat) object.
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat).
+         */
+        new(locales?: BCP47LanguageTag | BCP47LanguageTag[], options?: ListFormatOptions): ListFormat;
+
+        /**
+         * Returns an array containing those of the provided locales that are
+         * supported in list formatting without having to fall back to the runtime's default locale.
+         *
+         * @param locales - A string with a [BCP 47 language tag](http://tools.ietf.org/html/rfc5646), or an array of such strings.
+         *  For the general form and interpretation of the \`locales\` argument,
+         *  see the [\`Intl\` page](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation).
+         *
+         * @param options - An [object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat/supportedLocalesOf#parameters).
+         *  with some or all possible options.
+         *
+         * @returns An array of strings representing a subset of the given locale tags that are supported in list
+         *  formatting without having to fall back to the runtime's default locale.
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat/supportedLocalesOf).
+         */
+        supportedLocalesOf(locales: BCP47LanguageTag | BCP47LanguageTag[], options?: Pick<ListFormatOptions, "localeMatcher">): BCP47LanguageTag[];
+    };
+}
+`; $i["lib.es2021.promise.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface AggregateError extends Error {
+    errors: any[]
+}
+
+interface AggregateErrorConstructor {
+    new(errors: Iterable<any>, message?: string): AggregateError;
+    (errors: Iterable<any>, message?: string): AggregateError;
+    readonly prototype: AggregateError;
+}
+
+declare var AggregateError: AggregateErrorConstructor;
+
+/**
+ * Represents the completion of an asynchronous operation
+ */
+interface PromiseConstructor {
+    /**
+     * The any function returns a promise that is fulfilled by the first given promise to be fulfilled, or rejected with an AggregateError containing an array of rejection reasons if all of the given promises are rejected. It resolves all elements of the passed iterable to promises as it runs this algorithm.
+     * @param values An array or iterable of Promises.
+     * @returns A new Promise.
+     */
+    any<T extends readonly unknown[] | []>(values: T): Promise<Awaited<T[number]>>;
+
+    /**
+     * The any function returns a promise that is fulfilled by the first given promise to be fulfilled, or rejected with an AggregateError containing an array of rejection reasons if all of the given promises are rejected. It resolves all elements of the passed iterable to promises as it runs this algorithm.
+     * @param values An array or iterable of Promises.
+     * @returns A new Promise.
+     */
+    any<T>(values: Iterable<T | PromiseLike<T>>): Promise<Awaited<T>>
+}
+`; $i["lib.es2021.string.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface String {
+    /**
+     * Replace all instances of a substring in a string, using a regular expression or search string.
+     * @param searchValue A string to search for.
+     * @param replaceValue A string containing the text to replace for every successful match of searchValue in this string.
+     */
+    replaceAll(searchValue: string | RegExp, replaceValue: string): string;
+
+    /**
+     * Replace all instances of a substring in a string, using a regular expression or search string.
+     * @param searchValue A string to search for.
+     * @param replacer A function that returns the replacement text.
+     */
+    replaceAll(searchValue: string | RegExp, replacer: (substring: string, ...args: any[]) => string): string;
+}
+`; $i["lib.es2021.weakref.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface WeakRef<T extends object> {
+    readonly [Symbol.toStringTag]: "WeakRef";
+
+    /**
+     * Returns the WeakRef instance's target object, or undefined if the target object has been
+     * reclaimed.
+     */
+    deref(): T | undefined;
+}
+
+interface WeakRefConstructor {
+    readonly prototype: WeakRef<any>;
+
+    /**
+     * Creates a WeakRef instance for the given target object.
+     * @param target The target object for the WeakRef instance.
+     */
+    new<T extends object>(target: T): WeakRef<T>;
+}
+
+declare var WeakRef: WeakRefConstructor;
+
+interface FinalizationRegistry<T> {
+    readonly [Symbol.toStringTag]: "FinalizationRegistry";
+
+    /**
+     * Registers an object with the registry.
+     * @param target The target object to register.
+     * @param heldValue The value to pass to the finalizer for this object. This cannot be the
+     * target object.
+     * @param unregisterToken The token to pass to the unregister method to unregister the target
+     * object. If provided (and not undefined), this must be an object. If not provided, the target
+     * cannot be unregistered.
+     */
+    register(target: object, heldValue: T, unregisterToken?: object): void;
+
+    /**
+     * Unregisters an object from the registry.
+     * @param unregisterToken The token that was used as the unregisterToken argument when calling
+     * register to register the target object.
+     */
+    unregister(unregisterToken: object): void;
+}
+
+interface FinalizationRegistryConstructor {
+    readonly prototype: FinalizationRegistry<any>;
+
+    /**
+     * Creates a finalization registry with an associated cleanup callback
+     * @param cleanupCallback The callback to call after an object in the registry has been reclaimed.
+     */
+    new<T>(cleanupCallback: (heldValue: T) => void): FinalizationRegistry<T>;
+}
+
+declare var FinalizationRegistry: FinalizationRegistryConstructor;
+`; $i["lib.es2022.array.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface Array<T> {
+    /**
+     * Returns the item located at the specified index.
+     * @param index The zero-based index of the desired code unit. A negative index will count back from the last item.
+     */
+    at(index: number): T | undefined;
+}
+
+interface ReadonlyArray<T> {
+    /**
+     * Returns the item located at the specified index.
+     * @param index The zero-based index of the desired code unit. A negative index will count back from the last item.
+     */
+    at(index: number): T | undefined;
+}
+
+interface Int8Array {
+    /**
+     * Returns the item located at the specified index.
+     * @param index The zero-based index of the desired code unit. A negative index will count back from the last item.
+     */
+    at(index: number): number | undefined;
+}
+
+interface Uint8Array {
+    /**
+     * Returns the item located at the specified index.
+     * @param index The zero-based index of the desired code unit. A negative index will count back from the last item.
+     */
+    at(index: number): number | undefined;
+}
+
+interface Uint8ClampedArray {
+    /**
+     * Returns the item located at the specified index.
+     * @param index The zero-based index of the desired code unit. A negative index will count back from the last item.
+     */
+    at(index: number): number | undefined;
+}
+
+interface Int16Array {
+    /**
+     * Returns the item located at the specified index.
+     * @param index The zero-based index of the desired code unit. A negative index will count back from the last item.
+     */
+    at(index: number): number | undefined;
+}
+
+interface Uint16Array {
+    /**
+     * Returns the item located at the specified index.
+     * @param index The zero-based index of the desired code unit. A negative index will count back from the last item.
+     */
+    at(index: number): number | undefined;
+}
+
+interface Int32Array {
+    /**
+     * Returns the item located at the specified index.
+     * @param index The zero-based index of the desired code unit. A negative index will count back from the last item.
+     */
+    at(index: number): number | undefined;
+}
+
+interface Uint32Array {
+    /**
+     * Returns the item located at the specified index.
+     * @param index The zero-based index of the desired code unit. A negative index will count back from the last item.
+     */
+    at(index: number): number | undefined;
+}
+
+interface Float32Array {
+    /**
+     * Returns the item located at the specified index.
+     * @param index The zero-based index of the desired code unit. A negative index will count back from the last item.
+     */
+    at(index: number): number | undefined;
+}
+
+interface Float64Array {
+    /**
+     * Returns the item located at the specified index.
+     * @param index The zero-based index of the desired code unit. A negative index will count back from the last item.
+     */
+    at(index: number): number | undefined;
+}
+
+interface BigInt64Array {
+    /**
+     * Returns the item located at the specified index.
+     * @param index The zero-based index of the desired code unit. A negative index will count back from the last item.
+     */
+    at(index: number): bigint | undefined;
+}
+
+interface BigUint64Array {
+    /**
+     * Returns the item located at the specified index.
+     * @param index The zero-based index of the desired code unit. A negative index will count back from the last item.
+     */
+    at(index: number): bigint | undefined;
+}
+`; $i["lib.es2022.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2021" />
+/// <reference lib="es2022.array" />
+/// <reference lib="es2022.error" />
+/// <reference lib="es2022.intl" />
+/// <reference lib="es2022.object" />
+/// <reference lib="es2022.sharedmemory" />
+/// <reference lib="es2022.string" />
+/// <reference lib="es2022.regexp" />
+`; $i["lib.es2022.error.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface ErrorOptions {
+    cause?: unknown;
+}
+
+interface Error {
+    cause?: unknown;
+}
+
+interface ErrorConstructor {
+    new (message?: string, options?: ErrorOptions): Error;
+    (message?: string, options?: ErrorOptions): Error;
+}
+
+interface EvalErrorConstructor {
+    new (message?: string, options?: ErrorOptions): EvalError;
+    (message?: string, options?: ErrorOptions): EvalError;
+}
+
+interface RangeErrorConstructor {
+    new (message?: string, options?: ErrorOptions): RangeError;
+    (message?: string, options?: ErrorOptions): RangeError;
+}
+
+interface ReferenceErrorConstructor {
+    new (message?: string, options?: ErrorOptions): ReferenceError;
+    (message?: string, options?: ErrorOptions): ReferenceError;
+}
+
+interface SyntaxErrorConstructor {
+    new (message?: string, options?: ErrorOptions): SyntaxError;
+    (message?: string, options?: ErrorOptions): SyntaxError;
+}
+
+interface TypeErrorConstructor {
+    new (message?: string, options?: ErrorOptions): TypeError;
+    (message?: string, options?: ErrorOptions): TypeError;
+}
+
+interface URIErrorConstructor {
+    new (message?: string, options?: ErrorOptions): URIError;
+    (message?: string, options?: ErrorOptions): URIError;
+}
+
+interface AggregateErrorConstructor {
+    new (
+        errors: Iterable<any>,
+        message?: string,
+        options?: ErrorOptions
+    ): AggregateError;
+    (
+        errors: Iterable<any>,
+        message?: string,
+        options?: ErrorOptions
+    ): AggregateError;
+}
+`; $i["lib.es2022.full.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2022" />
+/// <reference lib="dom" />
+/// <reference lib="webworker.importscripts" />
+/// <reference lib="scripthost" />
+/// <reference lib="dom.iterable" />
+`; $i["lib.es2022.intl.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+declare namespace Intl {
+
+    /**
+     * An object with some or all properties of the \`Intl.Segmenter\` constructor \`options\` parameter.
+     *
+     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/Segmenter#parameters)
+     */
+    interface SegmenterOptions {
+        /** The locale matching algorithm to use. For information about this option, see [Intl page](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_negotiation). */
+        localeMatcher?: "best fit" | "lookup" | undefined;
+        /** The type of input to be split */
+        granularity?: "grapheme" | "word" | "sentence" | undefined;
+    }
+
+    interface Segmenter {
+        /**
+         * Returns \`Segments\` object containing the segments of the input string, using the segmenter's locale and granularity.
+         *
+         * @param input - The text to be segmented as a \`string\`.
+         *
+         * @returns A new iterable Segments object containing the segments of the input string, using the segmenter's locale and granularity.
+         */
+        segment(input: string): Segments;
+        resolvedOptions(): ResolvedSegmenterOptions;
+    }
+
+    interface ResolvedSegmenterOptions {
+        locale: string;
+        granularity: "grapheme" | "word" | "sentence";
+    }
+
+    interface Segments {
+        /**
+         * Returns an object describing the segment in the original string that includes the code unit at a specified index.
+         *
+         * @param codeUnitIndex - A number specifying the index of the code unit in the original input string. If the value is omitted, it defaults to \`0\`.
+         */
+        containing(codeUnitIndex?: number): SegmentData;
+
+        /** Returns an iterator to iterate over the segments. */
+        [Symbol.iterator](): IterableIterator<SegmentData>;
+    }
+
+    interface SegmentData {
+        /** A string containing the segment extracted from the original input string. */
+        segment: string;
+        /** The code unit index in the original input string at which the segment begins. */
+        index: number;
+        /** The complete input string that was segmented. */
+        input: string;
+        /**
+         * A boolean value only if granularity is "word"; otherwise, undefined.
+         * If granularity is "word", then isWordLike is true when the segment is word-like (i.e., consists of letters/numbers/ideographs/etc.); otherwise, false.
+         */
+        isWordLike?: boolean;
+    }
+
+    const Segmenter: {
+        prototype: Segmenter;
+
+        /**
+         * Creates a new \`Intl.Segmenter\` object.
+         *
+         * @param locales - A string with a [BCP 47 language tag](http://tools.ietf.org/html/rfc5646), or an array of such strings.
+         *  For the general form and interpretation of the \`locales\` argument,
+         *  see the [\`Intl\` page](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation).
+         *
+         * @param options - An [object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/Segmenter#parameters)
+         *  with some or all options of \`SegmenterOptions\`.
+         *
+         * @returns [Intl.Segmenter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segments) object.
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter).
+         */
+        new(locales?: BCP47LanguageTag | BCP47LanguageTag[], options?: SegmenterOptions): Segmenter;
+
+        /**
+         * Returns an array containing those of the provided locales that are supported without having to fall back to the runtime's default locale.
+         *
+         * @param locales - A string with a [BCP 47 language tag](http://tools.ietf.org/html/rfc5646), or an array of such strings.
+         *  For the general form and interpretation of the \`locales\` argument,
+         *  see the [\`Intl\` page](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation).
+         *
+         * @param options An [object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/supportedLocalesOf#parameters).
+         *  with some or all possible options.
+         *
+         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/supportedLocalesOf)
+         */
+        supportedLocalesOf(locales: BCP47LanguageTag | BCP47LanguageTag[], options?: Pick<SegmenterOptions, "localeMatcher">): BCP47LanguageTag[];
+    };
+}
+`; $i["lib.es2022.object.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface ObjectConstructor {
+    /**
+     * Determines whether an object has a property with the specified name.
+     * @param o An object.
+     * @param v A property name.
+     */
+    hasOwn(o: object, v: PropertyKey): boolean;
+}
+`; $i["lib.es2022.regexp.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface RegExpMatchArray {
+    indices?: RegExpIndicesArray;
+}
+
+interface RegExpExecArray {
+    indices?: RegExpIndicesArray;
+}
+
+interface RegExpIndicesArray extends Array<[number, number]> {
+    groups?: {
+        [key: string]: [number, number];
+    };
+}
+
+interface RegExp {
+    /**
+     * Returns a Boolean value indicating the state of the hasIndices flag (d) used with with a regular expression.
+     * Default is false. Read-only.
+     */
+    readonly hasIndices: boolean;
+}
+`; $i["lib.es2022.sharedmemory.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface Atomics {
+    /**
+     * A non-blocking, asynchronous version of wait which is usable on the main thread.
+     * Waits asynchronously on a shared memory location and returns a Promise
+     * @param typedArray A shared Int32Array or BigInt64Array.
+     * @param index The position in the typedArray to wait on.
+     * @param value The expected value to test.
+     * @param [timeout] The expected value to test.
+     */
+    waitAsync(typedArray: Int32Array, index: number, value: number, timeout?: number): { async: false, value: "not-equal" | "timed-out" } | { async: true, value: Promise<"ok" | "timed-out"> };
+
+    /**
+     * A non-blocking, asynchronous version of wait which is usable on the main thread.
+     * Waits asynchronously on a shared memory location and returns a Promise
+     * @param typedArray A shared Int32Array or BigInt64Array.
+     * @param index The position in the typedArray to wait on.
+     * @param value The expected value to test.
+     * @param [timeout] The expected value to test.
+     */
+    waitAsync(typedArray: BigInt64Array, index: number, value: bigint, timeout?: number): { async: false, value: "not-equal" | "timed-out" } | { async: true, value: Promise<"ok" | "timed-out"> };
+}
+`; $i["lib.es2022.string.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface String {
+    /**
+     * Returns a new String consisting of the single UTF-16 code unit located at the specified index.
+     * @param index The zero-based index of the desired code unit. A negative index will count back from the last item.
+     */
+    at(index: number): string | undefined;
+}
+`; $i["lib.es2023.array.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+interface Array<T> {
+    /**
+     * Returns the value of the last element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate findLast calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found, findLast
+     * immediately returns that element value. Otherwise, findLast returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLast<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S | undefined;
+    findLast(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T | undefined;
+
+    /**
+     * Returns the index of the last element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate findLastIndex calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLastIndex(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): number;
+}
+
+interface ReadonlyArray<T> {
+    /**
+     * Returns the value of the last element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate findLast calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found, findLast
+     * immediately returns that element value. Otherwise, findLast returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLast<S extends T>(predicate: (value: T, index: number, array: readonly T[]) => value is S, thisArg?: any): S | undefined;
+    findLast(predicate: (value: T, index: number, array: readonly T[]) => unknown, thisArg?: any): T | undefined;
+
+    /**
+     * Returns the index of the last element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate findLastIndex calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLastIndex(predicate: (value: T, index: number, array: readonly T[]) => unknown, thisArg?: any): number;
+}
+
+interface Int8Array {
+    /**
+     * Returns the value of the last element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate findLast calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found, findLast
+     * immediately returns that element value. Otherwise, findLast returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLast<S extends number>(predicate: (value: number, index: number, array: Int8Array) => value is S, thisArg?: any): S | undefined;
+    findLast(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the last element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate findLastIndex calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLastIndex(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): number;
+}
+
+interface Uint8Array {
+    /**
+     * Returns the value of the last element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate findLast calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found, findLast
+     * immediately returns that element value. Otherwise, findLast returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLast<S extends number>(predicate: (value: number, index: number, array: Uint8Array) => value is S, thisArg?: any): S | undefined;
+    findLast(predicate: (value: number, index: number, array: Uint8Array) => unknown, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the last element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate findLastIndex calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLastIndex(predicate: (value: number, index: number, array: Uint8Array) => unknown, thisArg?: any): number;
+}
+
+interface Uint8ClampedArray {
+    /**
+     * Returns the value of the last element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate findLast calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found, findLast
+     * immediately returns that element value. Otherwise, findLast returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLast<S extends number>(predicate: (value: number, index: number, array: Uint8ClampedArray) => value is S, thisArg?: any): S | undefined;
+    findLast(predicate: (value: number, index: number, array: Uint8ClampedArray) => unknown, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the last element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate findLastIndex calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLastIndex(predicate: (value: number, index: number, array: Uint8ClampedArray) => unknown, thisArg?: any): number;
+}
+
+interface Int16Array {
+    /**
+     * Returns the value of the last element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate findLast calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found, findLast
+     * immediately returns that element value. Otherwise, findLast returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLast<S extends number>(predicate: (value: number, index: number, array: Int16Array) => value is S, thisArg?: any): S | undefined;
+    findLast(predicate: (value: number, index: number, array: Int16Array) => unknown, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the last element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate findLastIndex calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLastIndex(predicate: (value: number, index: number, array: Int16Array) => unknown, thisArg?: any): number;
+}
+
+interface Uint16Array {
+    /**
+     * Returns the value of the last element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate findLast calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found, findLast
+     * immediately returns that element value. Otherwise, findLast returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLast<S extends number>(predicate: (value: number, index: number, array: Uint16Array) => value is S, thisArg?: any): S | undefined;
+    findLast(predicate: (value: number, index: number, array: Uint16Array) => unknown, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the last element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate findLastIndex calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLastIndex(predicate: (value: number, index: number, array: Uint16Array) => unknown, thisArg?: any): number;
+}
+
+interface Int32Array {
+    /**
+     * Returns the value of the last element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate findLast calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found, findLast
+     * immediately returns that element value. Otherwise, findLast returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLast<S extends number>(predicate: (value: number, index: number, array: Int32Array) => value is S, thisArg?: any): S | undefined;
+    findLast(predicate: (value: number, index: number, array: Int32Array) => unknown, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the last element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate findLastIndex calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLastIndex(predicate: (value: number, index: number, array: Int32Array) => unknown, thisArg?: any): number;
+}
+
+interface Uint32Array {
+    /**
+     * Returns the value of the last element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate findLast calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found, findLast
+     * immediately returns that element value. Otherwise, findLast returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLast<S extends number>(predicate: (value: number, index: number, array: Uint32Array) => value is S, thisArg?: any): S | undefined;
+    findLast(predicate: (value: number, index: number, array: Uint32Array) => unknown, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the last element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate findLastIndex calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLastIndex(predicate: (value: number, index: number, array: Uint32Array) => unknown, thisArg?: any): number;
+}
+
+interface Float32Array {
+    /**
+     * Returns the value of the last element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate findLast calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found, findLast
+     * immediately returns that element value. Otherwise, findLast returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLast<S extends number>(predicate: (value: number, index: number, array: Float32Array) => value is S, thisArg?: any): S | undefined;
+    findLast(predicate: (value: number, index: number, array: Float32Array) => unknown, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the last element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate findLastIndex calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLastIndex(predicate: (value: number, index: number, array: Float32Array) => unknown, thisArg?: any): number;
+}
+
+interface Float64Array {
+    /**
+     * Returns the value of the last element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate findLast calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found, findLast
+     * immediately returns that element value. Otherwise, findLast returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLast<S extends number>(predicate: (value: number, index: number, array: Float64Array) => value is S, thisArg?: any): S | undefined;
+    findLast(predicate: (value: number, index: number, array: Float64Array) => unknown, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the last element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate findLastIndex calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLastIndex(predicate: (value: number, index: number, array: Float64Array) => unknown, thisArg?: any): number;
+}
+
+interface BigInt64Array {
+    /**
+     * Returns the value of the last element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate findLast calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found, findLast
+     * immediately returns that element value. Otherwise, findLast returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLast<S extends bigint>(predicate: (value: bigint, index: number, array: BigInt64Array) => value is S, thisArg?: any): S | undefined;
+    findLast(predicate: (value: bigint, index: number, array: BigInt64Array) => unknown, thisArg?: any): bigint | undefined;
+
+    /**
+     * Returns the index of the last element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate findLastIndex calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLastIndex(predicate: (value: bigint, index: number, array: BigInt64Array) => unknown, thisArg?: any): number;
+}
+
+interface BigUint64Array {
+    /**
+     * Returns the value of the last element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate findLast calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found, findLast
+     * immediately returns that element value. Otherwise, findLast returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLast<S extends bigint>(predicate: (value: bigint, index: number, array: BigUint64Array) => value is S, thisArg?: any): S | undefined;
+    findLast(predicate: (value: bigint, index: number, array: BigUint64Array) => unknown, thisArg?: any): bigint | undefined;
+
+    /**
+     * Returns the index of the last element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate findLastIndex calls predicate once for each element of the array, in descending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findLastIndex(predicate: (value: bigint, index: number, array: BigUint64Array) => unknown, thisArg?: any): number;
+}
+`; $i["lib.es2023.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2022" />
+/// <reference lib="es2023.array" />
+`; $i["lib.es2023.full.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2023" />
+/// <reference lib="dom" />
+/// <reference lib="webworker.importscripts" />
+/// <reference lib="scripthost" />
+/// <reference lib="dom.iterable" />
+`; $i["lib.es5.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="decorators" />
+/// <reference lib="decorators.legacy" />
+
+/////////////////////////////
+/// ECMAScript APIs
+/////////////////////////////
+
+declare var NaN: number;
+declare var Infinity: number;
+
+/**
+ * Evaluates JavaScript code and executes it.
+ * @param x A String value that contains valid JavaScript code.
+ */
+declare function eval(x: string): any;
+
+/**
+ * Converts a string to an integer.
+ * @param string A string to convert into a number.
+ * @param radix A value between 2 and 36 that specifies the base of the number in \`string\`.
+ * If this argument is not supplied, strings with a prefix of '0x' are considered hexadecimal.
+ * All other strings are considered decimal.
+ */
+declare function parseInt(string: string, radix?: number): number;
+
+/**
+ * Converts a string to a floating-point number.
+ * @param string A string that contains a floating-point number.
+ */
+declare function parseFloat(string: string): number;
+
+/**
+ * Returns a Boolean value that indicates whether a value is the reserved value NaN (not a number).
+ * @param number A numeric value.
+ */
+declare function isNaN(number: number): boolean;
+
+/**
+ * Determines whether a supplied number is finite.
+ * @param number Any numeric value.
+ */
+declare function isFinite(number: number): boolean;
+
+/**
+ * Gets the unencoded version of an encoded Uniform Resource Identifier (URI).
+ * @param encodedURI A value representing an encoded URI.
+ */
+declare function decodeURI(encodedURI: string): string;
+
+/**
+ * Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).
+ * @param encodedURIComponent A value representing an encoded URI component.
+ */
+declare function decodeURIComponent(encodedURIComponent: string): string;
+
+/**
+ * Encodes a text string as a valid Uniform Resource Identifier (URI)
+ * @param uri A value representing an unencoded URI.
+ */
+declare function encodeURI(uri: string): string;
+
+/**
+ * Encodes a text string as a valid component of a Uniform Resource Identifier (URI).
+ * @param uriComponent A value representing an unencoded URI component.
+ */
+declare function encodeURIComponent(uriComponent: string | number | boolean): string;
+
+/**
+ * Computes a new string in which certain characters have been replaced by a hexadecimal escape sequence.
+ * @deprecated A legacy feature for browser compatibility
+ * @param string A string value
+ */
+declare function escape(string: string): string;
+
+/**
+ * Computes a new string in which hexadecimal escape sequences are replaced with the character that it represents.
+ * @deprecated A legacy feature for browser compatibility
+ * @param string A string value
+ */
+declare function unescape(string: string): string;
+
+interface Symbol {
+    /** Returns a string representation of an object. */
+    toString(): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): symbol;
+}
+
+declare type PropertyKey = string | number | symbol;
+
+interface PropertyDescriptor {
+    configurable?: boolean;
+    enumerable?: boolean;
+    value?: any;
+    writable?: boolean;
+    get?(): any;
+    set?(v: any): void;
+}
+
+interface PropertyDescriptorMap {
+    [key: PropertyKey]: PropertyDescriptor;
+}
+
+interface Object {
+    /** The initial value of Object.prototype.constructor is the standard built-in Object constructor. */
+    constructor: Function;
+
+    /** Returns a string representation of an object. */
+    toString(): string;
+
+    /** Returns a date converted to a string using the current locale. */
+    toLocaleString(): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): Object;
+
+    /**
+     * Determines whether an object has a property with the specified name.
+     * @param v A property name.
+     */
+    hasOwnProperty(v: PropertyKey): boolean;
+
+    /**
+     * Determines whether an object exists in another object's prototype chain.
+     * @param v Another object whose prototype chain is to be checked.
+     */
+    isPrototypeOf(v: Object): boolean;
+
+    /**
+     * Determines whether a specified property is enumerable.
+     * @param v A property name.
+     */
+    propertyIsEnumerable(v: PropertyKey): boolean;
+}
+
+interface ObjectConstructor {
+    new(value?: any): Object;
+    (): any;
+    (value: any): any;
+
+    /** A reference to the prototype for a class of objects. */
+    readonly prototype: Object;
+
+    /**
+     * Returns the prototype of an object.
+     * @param o The object that references the prototype.
+     */
+    getPrototypeOf(o: any): any;
+
+    /**
+     * Gets the own property descriptor of the specified object.
+     * An own property descriptor is one that is defined directly on the object and is not inherited from the object's prototype.
+     * @param o Object that contains the property.
+     * @param p Name of the property.
+     */
+    getOwnPropertyDescriptor(o: any, p: PropertyKey): PropertyDescriptor | undefined;
+
+    /**
+     * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly
+     * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.
+     * @param o Object that contains the own properties.
+     */
+    getOwnPropertyNames(o: any): string[];
+
+    /**
+     * Creates an object that has the specified prototype or that has null prototype.
+     * @param o Object to use as a prototype. May be null.
+     */
+    create(o: object | null): any;
+
+    /**
+     * Creates an object that has the specified prototype, and that optionally contains specified properties.
+     * @param o Object to use as a prototype. May be null
+     * @param properties JavaScript object that contains one or more property descriptors.
+     */
+    create(o: object | null, properties: PropertyDescriptorMap & ThisType<any>): any;
+
+    /**
+     * Adds a property to an object, or modifies attributes of an existing property.
+     * @param o Object on which to add or modify the property. This can be a native JavaScript object (that is, a user-defined object or a built in object) or a DOM object.
+     * @param p The property name.
+     * @param attributes Descriptor for the property. It can be for a data property or an accessor property.
+     */
+    defineProperty<T>(o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>): T;
+
+    /**
+     * Adds one or more properties to an object, and/or modifies attributes of existing properties.
+     * @param o Object on which to add or modify the properties. This can be a native JavaScript object or a DOM object.
+     * @param properties JavaScript object that contains one or more descriptor objects. Each descriptor object describes a data property or an accessor property.
+     */
+    defineProperties<T>(o: T, properties: PropertyDescriptorMap & ThisType<any>): T;
+
+    /**
+     * Prevents the modification of attributes of existing properties, and prevents the addition of new properties.
+     * @param o Object on which to lock the attributes.
+     */
+    seal<T>(o: T): T;
+
+    /**
+     * Prevents the modification of existing property attributes and values, and prevents the addition of new properties.
+     * @param f Object on which to lock the attributes.
+     */
+    freeze<T extends Function>(f: T): T;
+
+    /**
+     * Prevents the modification of existing property attributes and values, and prevents the addition of new properties.
+     * @param o Object on which to lock the attributes.
+     */
+    freeze<T extends {[idx: string]: U | null | undefined | object}, U extends string | bigint | number | boolean | symbol>(o: T): Readonly<T>;
+
+    /**
+     * Prevents the modification of existing property attributes and values, and prevents the addition of new properties.
+     * @param o Object on which to lock the attributes.
+     */
+    freeze<T>(o: T): Readonly<T>;
+
+    /**
+     * Prevents the addition of new properties to an object.
+     * @param o Object to make non-extensible.
+     */
+    preventExtensions<T>(o: T): T;
+
+    /**
+     * Returns true if existing property attributes cannot be modified in an object and new properties cannot be added to the object.
+     * @param o Object to test.
+     */
+    isSealed(o: any): boolean;
+
+    /**
+     * Returns true if existing property attributes and values cannot be modified in an object, and new properties cannot be added to the object.
+     * @param o Object to test.
+     */
+    isFrozen(o: any): boolean;
+
+    /**
+     * Returns a value that indicates whether new properties can be added to an object.
+     * @param o Object to test.
+     */
+    isExtensible(o: any): boolean;
+
+    /**
+     * Returns the names of the enumerable string properties and methods of an object.
+     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
+     */
+    keys(o: object): string[];
+}
+
+/**
+ * Provides functionality common to all JavaScript objects.
+ */
+declare var Object: ObjectConstructor;
+
+/**
+ * Creates a new function.
+ */
+interface Function {
+    /**
+     * Calls the function, substituting the specified object for the this value of the function, and the specified array for the arguments of the function.
+     * @param thisArg The object to be used as the this object.
+     * @param argArray A set of arguments to be passed to the function.
+     */
+    apply(this: Function, thisArg: any, argArray?: any): any;
+
+    /**
+     * Calls a method of an object, substituting another object for the current object.
+     * @param thisArg The object to be used as the current object.
+     * @param argArray A list of arguments to be passed to the method.
+     */
+    call(this: Function, thisArg: any, ...argArray: any[]): any;
+
+    /**
+     * For a given function, creates a bound function that has the same body as the original function.
+     * The this object of the bound function is associated with the specified object, and has the specified initial parameters.
+     * @param thisArg An object to which the this keyword can refer inside the new function.
+     * @param argArray A list of arguments to be passed to the new function.
+     */
+    bind(this: Function, thisArg: any, ...argArray: any[]): any;
+
+    /** Returns a string representation of a function. */
+    toString(): string;
+
+    prototype: any;
+    readonly length: number;
+
+    // Non-standard extensions
+    arguments: any;
+    caller: Function;
+}
+
+interface FunctionConstructor {
+    /**
+     * Creates a new function.
+     * @param args A list of arguments the function accepts.
+     */
+    new(...args: string[]): Function;
+    (...args: string[]): Function;
+    readonly prototype: Function;
+}
+
+declare var Function: FunctionConstructor;
+
+/**
+ * Extracts the type of the 'this' parameter of a function type, or 'unknown' if the function type has no 'this' parameter.
+ */
+type ThisParameterType<T> = T extends (this: infer U, ...args: never) => any ? U : unknown;
+
+/**
+ * Removes the 'this' parameter from a function type.
+ */
+type OmitThisParameter<T> = unknown extends ThisParameterType<T> ? T : T extends (...args: infer A) => infer R ? (...args: A) => R : T;
+
+interface CallableFunction extends Function {
+    /**
+     * Calls the function with the specified object as the this value and the elements of specified array as the arguments.
+     * @param thisArg The object to be used as the this object.
+     * @param args An array of argument values to be passed to the function.
+     */
+    apply<T, R>(this: (this: T) => R, thisArg: T): R;
+    apply<T, A extends any[], R>(this: (this: T, ...args: A) => R, thisArg: T, args: A): R;
+
+    /**
+     * Calls the function with the specified object as the this value and the specified rest arguments as the arguments.
+     * @param thisArg The object to be used as the this object.
+     * @param args Argument values to be passed to the function.
+     */
+    call<T, A extends any[], R>(this: (this: T, ...args: A) => R, thisArg: T, ...args: A): R;
+
+    /**
+     * For a given function, creates a bound function that has the same body as the original function.
+     * The this object of the bound function is associated with the specified object, and has the specified initial parameters.
+     * @param thisArg The object to be used as the this object.
+     * @param args Arguments to bind to the parameters of the function.
+     */
+    bind<T>(this: T, thisArg: ThisParameterType<T>): OmitThisParameter<T>;
+    bind<T, A0, A extends any[], R>(this: (this: T, arg0: A0, ...args: A) => R, thisArg: T, arg0: A0): (...args: A) => R;
+    bind<T, A0, A1, A extends any[], R>(this: (this: T, arg0: A0, arg1: A1, ...args: A) => R, thisArg: T, arg0: A0, arg1: A1): (...args: A) => R;
+    bind<T, A0, A1, A2, A extends any[], R>(this: (this: T, arg0: A0, arg1: A1, arg2: A2, ...args: A) => R, thisArg: T, arg0: A0, arg1: A1, arg2: A2): (...args: A) => R;
+    bind<T, A0, A1, A2, A3, A extends any[], R>(this: (this: T, arg0: A0, arg1: A1, arg2: A2, arg3: A3, ...args: A) => R, thisArg: T, arg0: A0, arg1: A1, arg2: A2, arg3: A3): (...args: A) => R;
+    bind<T, AX, R>(this: (this: T, ...args: AX[]) => R, thisArg: T, ...args: AX[]): (...args: AX[]) => R;
+}
+
+interface NewableFunction extends Function {
+    /**
+     * Calls the function with the specified object as the this value and the elements of specified array as the arguments.
+     * @param thisArg The object to be used as the this object.
+     * @param args An array of argument values to be passed to the function.
+     */
+    apply<T>(this: new () => T, thisArg: T): void;
+    apply<T, A extends any[]>(this: new (...args: A) => T, thisArg: T, args: A): void;
+
+    /**
+     * Calls the function with the specified object as the this value and the specified rest arguments as the arguments.
+     * @param thisArg The object to be used as the this object.
+     * @param args Argument values to be passed to the function.
+     */
+    call<T, A extends any[]>(this: new (...args: A) => T, thisArg: T, ...args: A): void;
+
+    /**
+     * For a given function, creates a bound function that has the same body as the original function.
+     * The this object of the bound function is associated with the specified object, and has the specified initial parameters.
+     * @param thisArg The object to be used as the this object.
+     * @param args Arguments to bind to the parameters of the function.
+     */
+    bind<T>(this: T, thisArg: any): T;
+    bind<A0, A extends any[], R>(this: new (arg0: A0, ...args: A) => R, thisArg: any, arg0: A0): new (...args: A) => R;
+    bind<A0, A1, A extends any[], R>(this: new (arg0: A0, arg1: A1, ...args: A) => R, thisArg: any, arg0: A0, arg1: A1): new (...args: A) => R;
+    bind<A0, A1, A2, A extends any[], R>(this: new (arg0: A0, arg1: A1, arg2: A2, ...args: A) => R, thisArg: any, arg0: A0, arg1: A1, arg2: A2): new (...args: A) => R;
+    bind<A0, A1, A2, A3, A extends any[], R>(this: new (arg0: A0, arg1: A1, arg2: A2, arg3: A3, ...args: A) => R, thisArg: any, arg0: A0, arg1: A1, arg2: A2, arg3: A3): new (...args: A) => R;
+    bind<AX, R>(this: new (...args: AX[]) => R, thisArg: any, ...args: AX[]): new (...args: AX[]) => R;
+}
+
+interface IArguments {
+    [index: number]: any;
+    length: number;
+    callee: Function;
+}
+
+interface String {
+    /** Returns a string representation of a string. */
+    toString(): string;
+
+    /**
+     * Returns the character at the specified index.
+     * @param pos The zero-based index of the desired character.
+     */
+    charAt(pos: number): string;
+
+    /**
+     * Returns the Unicode value of the character at the specified location.
+     * @param index The zero-based index of the desired character. If there is no character at the specified index, NaN is returned.
+     */
+    charCodeAt(index: number): number;
+
+    /**
+     * Returns a string that contains the concatenation of two or more strings.
+     * @param strings The strings to append to the end of the string.
+     */
+    concat(...strings: string[]): string;
+
+    /**
+     * Returns the position of the first occurrence of a substring.
+     * @param searchString The substring to search for in the string
+     * @param position The index at which to begin searching the String object. If omitted, search starts at the beginning of the string.
+     */
+    indexOf(searchString: string, position?: number): number;
+
+    /**
+     * Returns the last occurrence of a substring in the string.
+     * @param searchString The substring to search for.
+     * @param position The index at which to begin searching. If omitted, the search begins at the end of the string.
+     */
+    lastIndexOf(searchString: string, position?: number): number;
+
+    /**
+     * Determines whether two strings are equivalent in the current locale.
+     * @param that String to compare to target string
+     */
+    localeCompare(that: string): number;
+
+    /**
+     * Matches a string with a regular expression, and returns an array containing the results of that search.
+     * @param regexp A variable name or string literal containing the regular expression pattern and flags.
+     */
+    match(regexp: string | RegExp): RegExpMatchArray | null;
+
+    /**
+     * Replaces text in a string, using a regular expression or search string.
+     * @param searchValue A string or regular expression to search for.
+     * @param replaceValue A string containing the text to replace. When the {@linkcode searchValue} is a \`RegExp\`, all matches are replaced if the \`g\` flag is set (or only those matches at the beginning, if the \`y\` flag is also present). Otherwise, only the first match of {@linkcode searchValue} is replaced.
+     */
+    replace(searchValue: string | RegExp, replaceValue: string): string;
+
+    /**
+     * Replaces text in a string, using a regular expression or search string.
+     * @param searchValue A string to search for.
+     * @param replacer A function that returns the replacement text.
+     */
+    replace(searchValue: string | RegExp, replacer: (substring: string, ...args: any[]) => string): string;
+
+    /**
+     * Finds the first substring match in a regular expression search.
+     * @param regexp The regular expression pattern and applicable flags.
+     */
+    search(regexp: string | RegExp): number;
+
+    /**
+     * Returns a section of a string.
+     * @param start The index to the beginning of the specified portion of stringObj.
+     * @param end The index to the end of the specified portion of stringObj. The substring includes the characters up to, but not including, the character indicated by end.
+     * If this value is not specified, the substring continues to the end of stringObj.
+     */
+    slice(start?: number, end?: number): string;
+
+    /**
+     * Split a string into substrings using the specified separator and return them as an array.
+     * @param separator A string that identifies character or characters to use in separating the string. If omitted, a single-element array containing the entire string is returned.
+     * @param limit A value used to limit the number of elements returned in the array.
+     */
+    split(separator: string | RegExp, limit?: number): string[];
+
+    /**
+     * Returns the substring at the specified location within a String object.
+     * @param start The zero-based index number indicating the beginning of the substring.
+     * @param end Zero-based index number indicating the end of the substring. The substring includes the characters up to, but not including, the character indicated by end.
+     * If end is omitted, the characters from start through the end of the original string are returned.
+     */
+    substring(start: number, end?: number): string;
+
+    /** Converts all the alphabetic characters in a string to lowercase. */
+    toLowerCase(): string;
+
+    /** Converts all alphabetic characters to lowercase, taking into account the host environment's current locale. */
+    toLocaleLowerCase(locales?: string | string[]): string;
+
+    /** Converts all the alphabetic characters in a string to uppercase. */
+    toUpperCase(): string;
+
+    /** Returns a string where all alphabetic characters have been converted to uppercase, taking into account the host environment's current locale. */
+    toLocaleUpperCase(locales?: string | string[]): string;
+
+    /** Removes the leading and trailing white space and line terminator characters from a string. */
+    trim(): string;
+
+    /** Returns the length of a String object. */
+    readonly length: number;
+
+    // IE extensions
+    /**
+     * Gets a substring beginning at the specified location and having the specified length.
+     * @deprecated A legacy feature for browser compatibility
+     * @param from The starting position of the desired substring. The index of the first character in the string is zero.
+     * @param length The number of characters to include in the returned substring.
+     */
+    substr(from: number, length?: number): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): string;
+
+    readonly [index: number]: string;
+}
+
+interface StringConstructor {
+    new(value?: any): String;
+    (value?: any): string;
+    readonly prototype: String;
+    fromCharCode(...codes: number[]): string;
+}
+
+/**
+ * Allows manipulation and formatting of text strings and determination and location of substrings within strings.
+ */
+declare var String: StringConstructor;
+
+interface Boolean {
+    /** Returns the primitive value of the specified object. */
+    valueOf(): boolean;
+}
+
+interface BooleanConstructor {
+    new(value?: any): Boolean;
+    <T>(value?: T): boolean;
+    readonly prototype: Boolean;
+}
+
+declare var Boolean: BooleanConstructor;
+
+interface Number {
+    /**
+     * Returns a string representation of an object.
+     * @param radix Specifies a radix for converting numeric values to strings. This value is only used for numbers.
+     */
+    toString(radix?: number): string;
+
+    /**
+     * Returns a string representing a number in fixed-point notation.
+     * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.
+     */
+    toFixed(fractionDigits?: number): string;
+
+    /**
+     * Returns a string containing a number represented in exponential notation.
+     * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.
+     */
+    toExponential(fractionDigits?: number): string;
+
+    /**
+     * Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.
+     * @param precision Number of significant digits. Must be in the range 1 - 21, inclusive.
+     */
+    toPrecision(precision?: number): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): number;
+}
+
+interface NumberConstructor {
+    new(value?: any): Number;
+    (value?: any): number;
+    readonly prototype: Number;
+
+    /** The largest number that can be represented in JavaScript. Equal to approximately 1.79E+308. */
+    readonly MAX_VALUE: number;
+
+    /** The closest number to zero that can be represented in JavaScript. Equal to approximately 5.00E-324. */
+    readonly MIN_VALUE: number;
+
+    /**
+     * A value that is not a number.
+     * In equality comparisons, NaN does not equal any value, including itself. To test whether a value is equivalent to NaN, use the isNaN function.
+     */
+    readonly NaN: number;
+
+    /**
+     * A value that is less than the largest negative number that can be represented in JavaScript.
+     * JavaScript displays NEGATIVE_INFINITY values as -infinity.
+     */
+    readonly NEGATIVE_INFINITY: number;
+
+    /**
+     * A value greater than the largest number that can be represented in JavaScript.
+     * JavaScript displays POSITIVE_INFINITY values as infinity.
+     */
+    readonly POSITIVE_INFINITY: number;
+}
+
+/** An object that represents a number of any kind. All JavaScript numbers are 64-bit floating-point numbers. */
+declare var Number: NumberConstructor;
+
+interface TemplateStringsArray extends ReadonlyArray<string> {
+    readonly raw: readonly string[];
+}
+
+/**
+ * The type of \`import.meta\`.
+ *
+ * If you need to declare that a given property exists on \`import.meta\`,
+ * this type may be augmented via interface merging.
+ */
+interface ImportMeta {
+}
+
+/**
+ * The type for the optional second argument to \`import()\`.
+ *
+ * If your host environment supports additional options, this type may be
+ * augmented via interface merging.
+ */
+interface ImportCallOptions {
+    assert?: ImportAssertions;
+}
+
+/**
+ * The type for the \`assert\` property of the optional second argument to \`import()\`.
+ */
+interface ImportAssertions {
+    [key: string]: string;
+}
+
+interface Math {
+    /** The mathematical constant e. This is Euler's number, the base of natural logarithms. */
+    readonly E: number;
+    /** The natural logarithm of 10. */
+    readonly LN10: number;
+    /** The natural logarithm of 2. */
+    readonly LN2: number;
+    /** The base-2 logarithm of e. */
+    readonly LOG2E: number;
+    /** The base-10 logarithm of e. */
+    readonly LOG10E: number;
+    /** Pi. This is the ratio of the circumference of a circle to its diameter. */
+    readonly PI: number;
+    /** The square root of 0.5, or, equivalently, one divided by the square root of 2. */
+    readonly SQRT1_2: number;
+    /** The square root of 2. */
+    readonly SQRT2: number;
+    /**
+     * Returns the absolute value of a number (the value without regard to whether it is positive or negative).
+     * For example, the absolute value of -5 is the same as the absolute value of 5.
+     * @param x A numeric expression for which the absolute value is needed.
+     */
+    abs(x: number): number;
+    /**
+     * Returns the arc cosine (or inverse cosine) of a number.
+     * @param x A numeric expression.
+     */
+    acos(x: number): number;
+    /**
+     * Returns the arcsine of a number.
+     * @param x A numeric expression.
+     */
+    asin(x: number): number;
+    /**
+     * Returns the arctangent of a number.
+     * @param x A numeric expression for which the arctangent is needed.
+     */
+    atan(x: number): number;
+    /**
+     * Returns the angle (in radians) from the X axis to a point.
+     * @param y A numeric expression representing the cartesian y-coordinate.
+     * @param x A numeric expression representing the cartesian x-coordinate.
+     */
+    atan2(y: number, x: number): number;
+    /**
+     * Returns the smallest integer greater than or equal to its numeric argument.
+     * @param x A numeric expression.
+     */
+    ceil(x: number): number;
+    /**
+     * Returns the cosine of a number.
+     * @param x A numeric expression that contains an angle measured in radians.
+     */
+    cos(x: number): number;
+    /**
+     * Returns e (the base of natural logarithms) raised to a power.
+     * @param x A numeric expression representing the power of e.
+     */
+    exp(x: number): number;
+    /**
+     * Returns the greatest integer less than or equal to its numeric argument.
+     * @param x A numeric expression.
+     */
+    floor(x: number): number;
+    /**
+     * Returns the natural logarithm (base e) of a number.
+     * @param x A numeric expression.
+     */
+    log(x: number): number;
+    /**
+     * Returns the larger of a set of supplied numeric expressions.
+     * @param values Numeric expressions to be evaluated.
+     */
+    max(...values: number[]): number;
+    /**
+     * Returns the smaller of a set of supplied numeric expressions.
+     * @param values Numeric expressions to be evaluated.
+     */
+    min(...values: number[]): number;
+    /**
+     * Returns the value of a base expression taken to a specified power.
+     * @param x The base value of the expression.
+     * @param y The exponent value of the expression.
+     */
+    pow(x: number, y: number): number;
+    /** Returns a pseudorandom number between 0 and 1. */
+    random(): number;
+    /**
+     * Returns a supplied numeric expression rounded to the nearest integer.
+     * @param x The value to be rounded to the nearest integer.
+     */
+    round(x: number): number;
+    /**
+     * Returns the sine of a number.
+     * @param x A numeric expression that contains an angle measured in radians.
+     */
+    sin(x: number): number;
+    /**
+     * Returns the square root of a number.
+     * @param x A numeric expression.
+     */
+    sqrt(x: number): number;
+    /**
+     * Returns the tangent of a number.
+     * @param x A numeric expression that contains an angle measured in radians.
+     */
+    tan(x: number): number;
+}
+/** An intrinsic object that provides basic mathematics functionality and constants. */
+declare var Math: Math;
+
+/** Enables basic storage and retrieval of dates and times. */
+interface Date {
+    /** Returns a string representation of a date. The format of the string depends on the locale. */
+    toString(): string;
+    /** Returns a date as a string value. */
+    toDateString(): string;
+    /** Returns a time as a string value. */
+    toTimeString(): string;
+    /** Returns a value as a string value appropriate to the host environment's current locale. */
+    toLocaleString(): string;
+    /** Returns a date as a string value appropriate to the host environment's current locale. */
+    toLocaleDateString(): string;
+    /** Returns a time as a string value appropriate to the host environment's current locale. */
+    toLocaleTimeString(): string;
+    /** Returns the stored time value in milliseconds since midnight, January 1, 1970 UTC. */
+    valueOf(): number;
+    /** Returns the stored time value in milliseconds since midnight, January 1, 1970 UTC. */
+    getTime(): number;
+    /** Gets the year, using local time. */
+    getFullYear(): number;
+    /** Gets the year using Universal Coordinated Time (UTC). */
+    getUTCFullYear(): number;
+    /** Gets the month, using local time. */
+    getMonth(): number;
+    /** Gets the month of a Date object using Universal Coordinated Time (UTC). */
+    getUTCMonth(): number;
+    /** Gets the day-of-the-month, using local time. */
+    getDate(): number;
+    /** Gets the day-of-the-month, using Universal Coordinated Time (UTC). */
+    getUTCDate(): number;
+    /** Gets the day of the week, using local time. */
+    getDay(): number;
+    /** Gets the day of the week using Universal Coordinated Time (UTC). */
+    getUTCDay(): number;
+    /** Gets the hours in a date, using local time. */
+    getHours(): number;
+    /** Gets the hours value in a Date object using Universal Coordinated Time (UTC). */
+    getUTCHours(): number;
+    /** Gets the minutes of a Date object, using local time. */
+    getMinutes(): number;
+    /** Gets the minutes of a Date object using Universal Coordinated Time (UTC). */
+    getUTCMinutes(): number;
+    /** Gets the seconds of a Date object, using local time. */
+    getSeconds(): number;
+    /** Gets the seconds of a Date object using Universal Coordinated Time (UTC). */
+    getUTCSeconds(): number;
+    /** Gets the milliseconds of a Date, using local time. */
+    getMilliseconds(): number;
+    /** Gets the milliseconds of a Date object using Universal Coordinated Time (UTC). */
+    getUTCMilliseconds(): number;
+    /** Gets the difference in minutes between the time on the local computer and Universal Coordinated Time (UTC). */
+    getTimezoneOffset(): number;
+    /**
+     * Sets the date and time value in the Date object.
+     * @param time A numeric value representing the number of elapsed milliseconds since midnight, January 1, 1970 GMT.
+     */
+    setTime(time: number): number;
+    /**
+     * Sets the milliseconds value in the Date object using local time.
+     * @param ms A numeric value equal to the millisecond value.
+     */
+    setMilliseconds(ms: number): number;
+    /**
+     * Sets the milliseconds value in the Date object using Universal Coordinated Time (UTC).
+     * @param ms A numeric value equal to the millisecond value.
+     */
+    setUTCMilliseconds(ms: number): number;
+
+    /**
+     * Sets the seconds value in the Date object using local time.
+     * @param sec A numeric value equal to the seconds value.
+     * @param ms A numeric value equal to the milliseconds value.
+     */
+    setSeconds(sec: number, ms?: number): number;
+    /**
+     * Sets the seconds value in the Date object using Universal Coordinated Time (UTC).
+     * @param sec A numeric value equal to the seconds value.
+     * @param ms A numeric value equal to the milliseconds value.
+     */
+    setUTCSeconds(sec: number, ms?: number): number;
+    /**
+     * Sets the minutes value in the Date object using local time.
+     * @param min A numeric value equal to the minutes value.
+     * @param sec A numeric value equal to the seconds value.
+     * @param ms A numeric value equal to the milliseconds value.
+     */
+    setMinutes(min: number, sec?: number, ms?: number): number;
+    /**
+     * Sets the minutes value in the Date object using Universal Coordinated Time (UTC).
+     * @param min A numeric value equal to the minutes value.
+     * @param sec A numeric value equal to the seconds value.
+     * @param ms A numeric value equal to the milliseconds value.
+     */
+    setUTCMinutes(min: number, sec?: number, ms?: number): number;
+    /**
+     * Sets the hour value in the Date object using local time.
+     * @param hours A numeric value equal to the hours value.
+     * @param min A numeric value equal to the minutes value.
+     * @param sec A numeric value equal to the seconds value.
+     * @param ms A numeric value equal to the milliseconds value.
+     */
+    setHours(hours: number, min?: number, sec?: number, ms?: number): number;
+    /**
+     * Sets the hours value in the Date object using Universal Coordinated Time (UTC).
+     * @param hours A numeric value equal to the hours value.
+     * @param min A numeric value equal to the minutes value.
+     * @param sec A numeric value equal to the seconds value.
+     * @param ms A numeric value equal to the milliseconds value.
+     */
+    setUTCHours(hours: number, min?: number, sec?: number, ms?: number): number;
+    /**
+     * Sets the numeric day-of-the-month value of the Date object using local time.
+     * @param date A numeric value equal to the day of the month.
+     */
+    setDate(date: number): number;
+    /**
+     * Sets the numeric day of the month in the Date object using Universal Coordinated Time (UTC).
+     * @param date A numeric value equal to the day of the month.
+     */
+    setUTCDate(date: number): number;
+    /**
+     * Sets the month value in the Date object using local time.
+     * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively.
+     * @param date A numeric value representing the day of the month. If this value is not supplied, the value from a call to the getDate method is used.
+     */
+    setMonth(month: number, date?: number): number;
+    /**
+     * Sets the month value in the Date object using Universal Coordinated Time (UTC).
+     * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively.
+     * @param date A numeric value representing the day of the month. If it is not supplied, the value from a call to the getUTCDate method is used.
+     */
+    setUTCMonth(month: number, date?: number): number;
+    /**
+     * Sets the year of the Date object using local time.
+     * @param year A numeric value for the year.
+     * @param month A zero-based numeric value for the month (0 for January, 11 for December). Must be specified if numDate is specified.
+     * @param date A numeric value equal for the day of the month.
+     */
+    setFullYear(year: number, month?: number, date?: number): number;
+    /**
+     * Sets the year value in the Date object using Universal Coordinated Time (UTC).
+     * @param year A numeric value equal to the year.
+     * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively. Must be supplied if numDate is supplied.
+     * @param date A numeric value equal to the day of the month.
+     */
+    setUTCFullYear(year: number, month?: number, date?: number): number;
+    /** Returns a date converted to a string using Universal Coordinated Time (UTC). */
+    toUTCString(): string;
+    /** Returns a date as a string value in ISO format. */
+    toISOString(): string;
+    /** Used by the JSON.stringify method to enable the transformation of an object's data for JavaScript Object Notation (JSON) serialization. */
+    toJSON(key?: any): string;
+}
+
+interface DateConstructor {
+    new(): Date;
+    new(value: number | string): Date;
+    /**
+     * Creates a new Date.
+     * @param year The full year designation is required for cross-century date accuracy. If year is between 0 and 99 is used, then year is assumed to be 1900 + year.
+     * @param monthIndex The month as a number between 0 and 11 (January to December).
+     * @param date The date as a number between 1 and 31.
+     * @param hours Must be supplied if minutes is supplied. A number from 0 to 23 (midnight to 11pm) that specifies the hour.
+     * @param minutes Must be supplied if seconds is supplied. A number from 0 to 59 that specifies the minutes.
+     * @param seconds Must be supplied if milliseconds is supplied. A number from 0 to 59 that specifies the seconds.
+     * @param ms A number from 0 to 999 that specifies the milliseconds.
+     */
+    new(year: number, monthIndex: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date;
+    (): string;
+    readonly prototype: Date;
+    /**
+     * Parses a string containing a date, and returns the number of milliseconds between that date and midnight, January 1, 1970.
+     * @param s A date string
+     */
+    parse(s: string): number;
+    /**
+     * Returns the number of milliseconds between midnight, January 1, 1970 Universal Coordinated Time (UTC) (or GMT) and the specified date.
+     * @param year The full year designation is required for cross-century date accuracy. If year is between 0 and 99 is used, then year is assumed to be 1900 + year.
+     * @param monthIndex The month as a number between 0 and 11 (January to December).
+     * @param date The date as a number between 1 and 31.
+     * @param hours Must be supplied if minutes is supplied. A number from 0 to 23 (midnight to 11pm) that specifies the hour.
+     * @param minutes Must be supplied if seconds is supplied. A number from 0 to 59 that specifies the minutes.
+     * @param seconds Must be supplied if milliseconds is supplied. A number from 0 to 59 that specifies the seconds.
+     * @param ms A number from 0 to 999 that specifies the milliseconds.
+     */
+    UTC(year: number, monthIndex: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): number;
+    /** Returns the number of milliseconds elapsed since midnight, January 1, 1970 Universal Coordinated Time (UTC). */
+    now(): number;
+}
+
+declare var Date: DateConstructor;
+
+interface RegExpMatchArray extends Array<string> {
+    /**
+     * The index of the search at which the result was found.
+     */
+    index?: number;
+    /**
+     * A copy of the search string.
+     */
+    input?: string;
+    /**
+     * The first match. This will always be present because \`null\` will be returned if there are no matches.
+     */
+    0: string;
+}
+
+interface RegExpExecArray extends Array<string> {
+    /**
+     * The index of the search at which the result was found.
+     */
+    index: number;
+    /**
+     * A copy of the search string.
+     */
+    input: string;
+    /**
+     * The first match. This will always be present because \`null\` will be returned if there are no matches.
+     */
+    0: string;
+}
+
+interface RegExp {
+    /**
+     * Executes a search on a string using a regular expression pattern, and returns an array containing the results of that search.
+     * @param string The String object or string literal on which to perform the search.
+     */
+    exec(string: string): RegExpExecArray | null;
+
+    /**
+     * Returns a Boolean value that indicates whether or not a pattern exists in a searched string.
+     * @param string String on which to perform the search.
+     */
+    test(string: string): boolean;
+
+    /** Returns a copy of the text of the regular expression pattern. Read-only. The regExp argument is a Regular expression object. It can be a variable name or a literal. */
+    readonly source: string;
+
+    /** Returns a Boolean value indicating the state of the global flag (g) used with a regular expression. Default is false. Read-only. */
+    readonly global: boolean;
+
+    /** Returns a Boolean value indicating the state of the ignoreCase flag (i) used with a regular expression. Default is false. Read-only. */
+    readonly ignoreCase: boolean;
+
+    /** Returns a Boolean value indicating the state of the multiline flag (m) used with a regular expression. Default is false. Read-only. */
+    readonly multiline: boolean;
+
+    lastIndex: number;
+
+    // Non-standard extensions
+    /** @deprecated A legacy feature for browser compatibility */
+    compile(pattern: string, flags?: string): this;
+}
+
+interface RegExpConstructor {
+    new(pattern: RegExp | string): RegExp;
+    new(pattern: string, flags?: string): RegExp;
+    (pattern: RegExp | string): RegExp;
+    (pattern: string, flags?: string): RegExp;
+    readonly prototype: RegExp;
+
+    // Non-standard extensions
+    /** @deprecated A legacy feature for browser compatibility */
+    $1: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    $2: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    $3: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    $4: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    $5: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    $6: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    $7: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    $8: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    $9: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    input: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    $_: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    lastMatch: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    "$&": string;
+    /** @deprecated A legacy feature for browser compatibility */
+    lastParen: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    "$+": string;
+    /** @deprecated A legacy feature for browser compatibility */
+    leftContext: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    "$\`": string;
+    /** @deprecated A legacy feature for browser compatibility */
+    rightContext: string;
+    /** @deprecated A legacy feature for browser compatibility */
+    "$'": string;
+}
+
+declare var RegExp: RegExpConstructor;
+
+interface Error {
+    name: string;
+    message: string;
+    stack?: string;
+}
+
+interface ErrorConstructor {
+    new(message?: string): Error;
+    (message?: string): Error;
+    readonly prototype: Error;
+}
+
+declare var Error: ErrorConstructor;
+
+interface EvalError extends Error {
+}
+
+interface EvalErrorConstructor extends ErrorConstructor {
+    new(message?: string): EvalError;
+    (message?: string): EvalError;
+    readonly prototype: EvalError;
+}
+
+declare var EvalError: EvalErrorConstructor;
+
+interface RangeError extends Error {
+}
+
+interface RangeErrorConstructor extends ErrorConstructor {
+    new(message?: string): RangeError;
+    (message?: string): RangeError;
+    readonly prototype: RangeError;
+}
+
+declare var RangeError: RangeErrorConstructor;
+
+interface ReferenceError extends Error {
+}
+
+interface ReferenceErrorConstructor extends ErrorConstructor {
+    new(message?: string): ReferenceError;
+    (message?: string): ReferenceError;
+    readonly prototype: ReferenceError;
+}
+
+declare var ReferenceError: ReferenceErrorConstructor;
+
+interface SyntaxError extends Error {
+}
+
+interface SyntaxErrorConstructor extends ErrorConstructor {
+    new(message?: string): SyntaxError;
+    (message?: string): SyntaxError;
+    readonly prototype: SyntaxError;
+}
+
+declare var SyntaxError: SyntaxErrorConstructor;
+
+interface TypeError extends Error {
+}
+
+interface TypeErrorConstructor extends ErrorConstructor {
+    new(message?: string): TypeError;
+    (message?: string): TypeError;
+    readonly prototype: TypeError;
+}
+
+declare var TypeError: TypeErrorConstructor;
+
+interface URIError extends Error {
+}
+
+interface URIErrorConstructor extends ErrorConstructor {
+    new(message?: string): URIError;
+    (message?: string): URIError;
+    readonly prototype: URIError;
+}
+
+declare var URIError: URIErrorConstructor;
+
+interface JSON {
+    /**
+     * Converts a JavaScript Object Notation (JSON) string into an object.
+     * @param text A valid JSON string.
+     * @param reviver A function that transforms the results. This function is called for each member of the object.
+     * If a member contains nested objects, the nested objects are transformed before the parent object is.
+     */
+    parse(text: string, reviver?: (this: any, key: string, value: any) => any): any;
+    /**
+     * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
+     * @param value A JavaScript value, usually an object or array, to be converted.
+     * @param replacer A function that transforms the results.
+     * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.
+     */
+    stringify(value: any, replacer?: (this: any, key: string, value: any) => any, space?: string | number): string;
+    /**
+     * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
+     * @param value A JavaScript value, usually an object or array, to be converted.
+     * @param replacer An array of strings and numbers that acts as an approved list for selecting the object properties that will be stringified.
+     * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.
+     */
+    stringify(value: any, replacer?: (number | string)[] | null, space?: string | number): string;
+}
+
+/**
+ * An intrinsic object that provides functions to convert JavaScript values to and from the JavaScript Object Notation (JSON) format.
+ */
+declare var JSON: JSON;
+
+
+/////////////////////////////
+/// ECMAScript Array API (specially handled by compiler)
+/////////////////////////////
+
+interface ReadonlyArray<T> {
+    /**
+     * Gets the length of the array. This is a number one higher than the highest element defined in an array.
+     */
+    readonly length: number;
+    /**
+     * Returns a string representation of an array.
+     */
+    toString(): string;
+    /**
+     * Returns a string representation of an array. The elements are converted to string using their toLocaleString methods.
+     */
+    toLocaleString(): string;
+    /**
+     * Combines two or more arrays.
+     * @param items Additional items to add to the end of array1.
+     */
+    concat(...items: ConcatArray<T>[]): T[];
+    /**
+     * Combines two or more arrays.
+     * @param items Additional items to add to the end of array1.
+     */
+    concat(...items: (T | ConcatArray<T>)[]): T[];
+    /**
+     * Adds all the elements of an array separated by the specified separator string.
+     * @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma.
+     */
+    join(separator?: string): string;
+    /**
+     * Returns a section of an array.
+     * @param start The beginning of the specified portion of the array.
+     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.
+     */
+    slice(start?: number, end?: number): T[];
+    /**
+     * Returns the index of the first occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.
+     */
+    indexOf(searchElement: T, fromIndex?: number): number;
+    /**
+     * Returns the index of the last occurrence of a specified value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the array.
+     */
+    lastIndexOf(searchElement: T, fromIndex?: number): number;
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value false, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every<S extends T>(predicate: (value: T, index: number, array: readonly T[]) => value is S, thisArg?: any): this is readonly S[];
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value false, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every(predicate: (value: T, index: number, array: readonly T[]) => unknown, thisArg?: any): boolean;
+    /**
+     * Determines whether the specified callback function returns true for any element of an array.
+     * @param predicate A function that accepts up to three arguments. The some method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value true, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    some(predicate: (value: T, index: number, array: readonly T[]) => unknown, thisArg?: any): boolean;
+    /**
+     * Performs the specified action for each element in an array.
+     * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array.
+     * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: T, index: number, array: readonly T[]) => void, thisArg?: any): void;
+    /**
+     * Calls a defined callback function on each element of an array, and returns an array that contains the results.
+     * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
+     */
+    map<U>(callbackfn: (value: T, index: number, array: readonly T[]) => U, thisArg?: any): U[];
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function. If thisArg is omitted, undefined is used as the this value.
+     */
+    filter<S extends T>(predicate: (value: T, index: number, array: readonly T[]) => value is S, thisArg?: any): S[];
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function. If thisArg is omitted, undefined is used as the this value.
+     */
+    filter(predicate: (value: T, index: number, array: readonly T[]) => unknown, thisArg?: any): T[];
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
+     */
+    reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T): T;
+    reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T, initialValue: T): T;
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
+     */
+    reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: readonly T[]) => U, initialValue: U): U;
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
+     */
+    reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T): T;
+    reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T, initialValue: T): T;
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
+     */
+    reduceRight<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: readonly T[]) => U, initialValue: U): U;
+
+    readonly [n: number]: T;
+}
+
+interface ConcatArray<T> {
+    readonly length: number;
+    readonly [n: number]: T;
+    join(separator?: string): string;
+    slice(start?: number, end?: number): T[];
+}
+
+interface Array<T> {
+    /**
+     * Gets or sets the length of the array. This is a number one higher than the highest index in the array.
+     */
+    length: number;
+    /**
+     * Returns a string representation of an array.
+     */
+    toString(): string;
+    /**
+     * Returns a string representation of an array. The elements are converted to string using their toLocaleString methods.
+     */
+    toLocaleString(): string;
+    /**
+     * Removes the last element from an array and returns it.
+     * If the array is empty, undefined is returned and the array is not modified.
+     */
+    pop(): T | undefined;
+    /**
+     * Appends new elements to the end of an array, and returns the new length of the array.
+     * @param items New elements to add to the array.
+     */
+    push(...items: T[]): number;
+    /**
+     * Combines two or more arrays.
+     * This method returns a new array without modifying any existing arrays.
+     * @param items Additional arrays and/or items to add to the end of the array.
+     */
+    concat(...items: ConcatArray<T>[]): T[];
+    /**
+     * Combines two or more arrays.
+     * This method returns a new array without modifying any existing arrays.
+     * @param items Additional arrays and/or items to add to the end of the array.
+     */
+    concat(...items: (T | ConcatArray<T>)[]): T[];
+    /**
+     * Adds all the elements of an array into a string, separated by the specified separator string.
+     * @param separator A string used to separate one element of the array from the next in the resulting string. If omitted, the array elements are separated with a comma.
+     */
+    join(separator?: string): string;
+    /**
+     * Reverses the elements in an array in place.
+     * This method mutates the array and returns a reference to the same array.
+     */
+    reverse(): T[];
+    /**
+     * Removes the first element from an array and returns it.
+     * If the array is empty, undefined is returned and the array is not modified.
+     */
+    shift(): T | undefined;
+    /**
+     * Returns a copy of a section of an array.
+     * For both start and end, a negative index can be used to indicate an offset from the end of the array.
+     * For example, -2 refers to the second to last element of the array.
+     * @param start The beginning index of the specified portion of the array.
+     * If start is undefined, then the slice begins at index 0.
+     * @param end The end index of the specified portion of the array. This is exclusive of the element at the index 'end'.
+     * If end is undefined, then the slice extends to the end of the array.
+     */
+    slice(start?: number, end?: number): T[];
+    /**
+     * Sorts an array in place.
+     * This method mutates the array and returns a reference to the same array.
+     * @param compareFn Function used to determine the order of the elements. It is expected to return
+     * a negative value if the first argument is less than the second argument, zero if they're equal, and a positive
+     * value otherwise. If omitted, the elements are sorted in ascending, ASCII character order.
+     * \`\`\`ts
+     * [11,2,22,1].sort((a, b) => a - b)
+     * \`\`\`
+     */
+    sort(compareFn?: (a: T, b: T) => number): this;
+    /**
+     * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.
+     * @param start The zero-based location in the array from which to start removing elements.
+     * @param deleteCount The number of elements to remove.
+     * @returns An array containing the elements that were deleted.
+     */
+    splice(start: number, deleteCount?: number): T[];
+    /**
+     * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.
+     * @param start The zero-based location in the array from which to start removing elements.
+     * @param deleteCount The number of elements to remove.
+     * @param items Elements to insert into the array in place of the deleted elements.
+     * @returns An array containing the elements that were deleted.
+     */
+    splice(start: number, deleteCount: number, ...items: T[]): T[];
+    /**
+     * Inserts new elements at the start of an array, and returns the new length of the array.
+     * @param items Elements to insert at the start of the array.
+     */
+    unshift(...items: T[]): number;
+    /**
+     * Returns the index of the first occurrence of a value in an array, or -1 if it is not present.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.
+     */
+    indexOf(searchElement: T, fromIndex?: number): number;
+    /**
+     * Returns the index of the last occurrence of a specified value in an array, or -1 if it is not present.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin searching backward. If fromIndex is omitted, the search starts at the last index in the array.
+     */
+    lastIndexOf(searchElement: T, fromIndex?: number): number;
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value false, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): this is S[];
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value false, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean;
+    /**
+     * Determines whether the specified callback function returns true for any element of an array.
+     * @param predicate A function that accepts up to three arguments. The some method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value true, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    some(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean;
+    /**
+     * Performs the specified action for each element in an array.
+     * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array.
+     * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;
+    /**
+     * Calls a defined callback function on each element of an array, and returns an array that contains the results.
+     * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
+     */
+    map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function. If thisArg is omitted, undefined is used as the this value.
+     */
+    filter<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[];
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function. If thisArg is omitted, undefined is used as the this value.
+     */
+    filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[];
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
+     */
+    reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T;
+    reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T;
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
+     */
+    reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
+     */
+    reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T;
+    reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T;
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
+     */
+    reduceRight<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;
+
+    [n: number]: T;
+}
+
+interface ArrayConstructor {
+    new(arrayLength?: number): any[];
+    new <T>(arrayLength: number): T[];
+    new <T>(...items: T[]): T[];
+    (arrayLength?: number): any[];
+    <T>(arrayLength: number): T[];
+    <T>(...items: T[]): T[];
+    isArray(arg: any): arg is any[];
+    readonly prototype: any[];
+}
+
+declare var Array: ArrayConstructor;
+
+interface TypedPropertyDescriptor<T> {
+    enumerable?: boolean;
+    configurable?: boolean;
+    writable?: boolean;
+    value?: T;
+    get?: () => T;
+    set?: (value: T) => void;
+}
+
+declare type PromiseConstructorLike = new <T>(executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void) => PromiseLike<T>;
+
+interface PromiseLike<T> {
+    /**
+     * Attaches callbacks for the resolution and/or rejection of the Promise.
+     * @param onfulfilled The callback to execute when the Promise is resolved.
+     * @param onrejected The callback to execute when the Promise is rejected.
+     * @returns A Promise for the completion of which ever callback is executed.
+     */
+    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): PromiseLike<TResult1 | TResult2>;
+}
+
+/**
+ * Represents the completion of an asynchronous operation
+ */
+interface Promise<T> {
+    /**
+     * Attaches callbacks for the resolution and/or rejection of the Promise.
+     * @param onfulfilled The callback to execute when the Promise is resolved.
+     * @param onrejected The callback to execute when the Promise is rejected.
+     * @returns A Promise for the completion of which ever callback is executed.
+     */
+    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;
+
+    /**
+     * Attaches a callback for only the rejection of the Promise.
+     * @param onrejected The callback to execute when the Promise is rejected.
+     * @returns A Promise for the completion of the callback.
+     */
+    catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
+}
+
+/**
+ * Recursively unwraps the "awaited type" of a type. Non-promise "thenables" should resolve to \`never\`. This emulates the behavior of \`await\`.
+ */
+type Awaited<T> =
+    T extends null | undefined ? T : // special case for \`null | undefined\` when not in \`--strictNullChecks\` mode
+        T extends object & { then(onfulfilled: infer F, ...args: infer _): any } ? // \`await\` only unwraps object types with a callable \`then\`. Non-object types are not unwrapped
+            F extends ((value: infer V, ...args: infer _) => any) ? // if the argument to \`then\` is callable, extracts the first argument
+                Awaited<V> : // recursively unwrap the value
+                never : // the argument to \`then\` was not callable
+        T; // non-object or non-thenable
+
+interface ArrayLike<T> {
+    readonly length: number;
+    readonly [n: number]: T;
+}
+
+/**
+ * Make all properties in T optional
+ */
+type Partial<T> = {
+    [P in keyof T]?: T[P];
+};
+
+/**
+ * Make all properties in T required
+ */
+type Required<T> = {
+    [P in keyof T]-?: T[P];
+};
+
+/**
+ * Make all properties in T readonly
+ */
+type Readonly<T> = {
+    readonly [P in keyof T]: T[P];
+};
+
+/**
+ * From T, pick a set of properties whose keys are in the union K
+ */
+type Pick<T, K extends keyof T> = {
+    [P in K]: T[P];
+};
+
+/**
+ * Construct a type with a set of properties K of type T
+ */
+type Record<K extends keyof any, T> = {
+    [P in K]: T;
+};
+
+/**
+ * Exclude from T those types that are assignable to U
+ */
+type Exclude<T, U> = T extends U ? never : T;
+
+/**
+ * Extract from T those types that are assignable to U
+ */
+type Extract<T, U> = T extends U ? T : never;
+
+/**
+ * Construct a type with the properties of T except for those in type K.
+ */
+type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
+
+/**
+ * Exclude null and undefined from T
+ */
+type NonNullable<T> = T & {};
+
+/**
+ * Obtain the parameters of a function type in a tuple
+ */
+type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;
+
+/**
+ * Obtain the parameters of a constructor function type in a tuple
+ */
+type ConstructorParameters<T extends abstract new (...args: any) => any> = T extends abstract new (...args: infer P) => any ? P : never;
+
+/**
+ * Obtain the return type of a function type
+ */
+type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
+
+/**
+ * Obtain the return type of a constructor function type
+ */
+type InstanceType<T extends abstract new (...args: any) => any> = T extends abstract new (...args: any) => infer R ? R : any;
+
+/**
+ * Convert string literal type to uppercase
+ */
+type Uppercase<S extends string> = intrinsic;
+
+/**
+ * Convert string literal type to lowercase
+ */
+type Lowercase<S extends string> = intrinsic;
+
+/**
+ * Convert first character of string literal type to uppercase
+ */
+type Capitalize<S extends string> = intrinsic;
+
+/**
+ * Convert first character of string literal type to lowercase
+ */
+type Uncapitalize<S extends string> = intrinsic;
+
+/**
+ * Marker for contextual 'this' type
+ */
+interface ThisType<T> { }
+
+/**
+ * Represents a raw buffer of binary data, which is used to store data for the
+ * different typed arrays. ArrayBuffers cannot be read from or written to directly,
+ * but can be passed to a typed array or DataView Object to interpret the raw
+ * buffer as needed.
+ */
+interface ArrayBuffer {
+    /**
+     * Read-only. The length of the ArrayBuffer (in bytes).
+     */
+    readonly byteLength: number;
+
+    /**
+     * Returns a section of an ArrayBuffer.
+     */
+    slice(begin: number, end?: number): ArrayBuffer;
+}
+
+/**
+ * Allowed ArrayBuffer types for the buffer of an ArrayBufferView and related Typed Arrays.
+ */
+interface ArrayBufferTypes {
+    ArrayBuffer: ArrayBuffer;
+}
+type ArrayBufferLike = ArrayBufferTypes[keyof ArrayBufferTypes];
+
+interface ArrayBufferConstructor {
+    readonly prototype: ArrayBuffer;
+    new(byteLength: number): ArrayBuffer;
+    isView(arg: any): arg is ArrayBufferView;
+}
+declare var ArrayBuffer: ArrayBufferConstructor;
+
+interface ArrayBufferView {
+    /**
+     * The ArrayBuffer instance referenced by the array.
+     */
+    buffer: ArrayBufferLike;
+
+    /**
+     * The length in bytes of the array.
+     */
+    byteLength: number;
+
+    /**
+     * The offset in bytes of the array.
+     */
+    byteOffset: number;
+}
+
+interface DataView {
+    readonly buffer: ArrayBuffer;
+    readonly byteLength: number;
+    readonly byteOffset: number;
+    /**
+     * Gets the Float32 value at the specified byte offset from the start of the view. There is
+     * no alignment constraint; multi-byte values may be fetched from any offset.
+     * @param byteOffset The place in the buffer at which the value should be retrieved.
+     * @param littleEndian If false or undefined, a big-endian value should be read.
+     */
+    getFloat32(byteOffset: number, littleEndian?: boolean): number;
+
+    /**
+     * Gets the Float64 value at the specified byte offset from the start of the view. There is
+     * no alignment constraint; multi-byte values may be fetched from any offset.
+     * @param byteOffset The place in the buffer at which the value should be retrieved.
+     * @param littleEndian If false or undefined, a big-endian value should be read.
+     */
+    getFloat64(byteOffset: number, littleEndian?: boolean): number;
+
+    /**
+     * Gets the Int8 value at the specified byte offset from the start of the view. There is
+     * no alignment constraint; multi-byte values may be fetched from any offset.
+     * @param byteOffset The place in the buffer at which the value should be retrieved.
+     */
+    getInt8(byteOffset: number): number;
+
+    /**
+     * Gets the Int16 value at the specified byte offset from the start of the view. There is
+     * no alignment constraint; multi-byte values may be fetched from any offset.
+     * @param byteOffset The place in the buffer at which the value should be retrieved.
+     * @param littleEndian If false or undefined, a big-endian value should be read.
+     */
+    getInt16(byteOffset: number, littleEndian?: boolean): number;
+    /**
+     * Gets the Int32 value at the specified byte offset from the start of the view. There is
+     * no alignment constraint; multi-byte values may be fetched from any offset.
+     * @param byteOffset The place in the buffer at which the value should be retrieved.
+     * @param littleEndian If false or undefined, a big-endian value should be read.
+     */
+    getInt32(byteOffset: number, littleEndian?: boolean): number;
+
+    /**
+     * Gets the Uint8 value at the specified byte offset from the start of the view. There is
+     * no alignment constraint; multi-byte values may be fetched from any offset.
+     * @param byteOffset The place in the buffer at which the value should be retrieved.
+     */
+    getUint8(byteOffset: number): number;
+
+    /**
+     * Gets the Uint16 value at the specified byte offset from the start of the view. There is
+     * no alignment constraint; multi-byte values may be fetched from any offset.
+     * @param byteOffset The place in the buffer at which the value should be retrieved.
+     * @param littleEndian If false or undefined, a big-endian value should be read.
+     */
+    getUint16(byteOffset: number, littleEndian?: boolean): number;
+
+    /**
+     * Gets the Uint32 value at the specified byte offset from the start of the view. There is
+     * no alignment constraint; multi-byte values may be fetched from any offset.
+     * @param byteOffset The place in the buffer at which the value should be retrieved.
+     * @param littleEndian If false or undefined, a big-endian value should be read.
+     */
+    getUint32(byteOffset: number, littleEndian?: boolean): number;
+
+    /**
+     * Stores an Float32 value at the specified byte offset from the start of the view.
+     * @param byteOffset The place in the buffer at which the value should be set.
+     * @param value The value to set.
+     * @param littleEndian If false or undefined, a big-endian value should be written.
+     */
+    setFloat32(byteOffset: number, value: number, littleEndian?: boolean): void;
+
+    /**
+     * Stores an Float64 value at the specified byte offset from the start of the view.
+     * @param byteOffset The place in the buffer at which the value should be set.
+     * @param value The value to set.
+     * @param littleEndian If false or undefined, a big-endian value should be written.
+     */
+    setFloat64(byteOffset: number, value: number, littleEndian?: boolean): void;
+
+    /**
+     * Stores an Int8 value at the specified byte offset from the start of the view.
+     * @param byteOffset The place in the buffer at which the value should be set.
+     * @param value The value to set.
+     */
+    setInt8(byteOffset: number, value: number): void;
+
+    /**
+     * Stores an Int16 value at the specified byte offset from the start of the view.
+     * @param byteOffset The place in the buffer at which the value should be set.
+     * @param value The value to set.
+     * @param littleEndian If false or undefined, a big-endian value should be written.
+     */
+    setInt16(byteOffset: number, value: number, littleEndian?: boolean): void;
+
+    /**
+     * Stores an Int32 value at the specified byte offset from the start of the view.
+     * @param byteOffset The place in the buffer at which the value should be set.
+     * @param value The value to set.
+     * @param littleEndian If false or undefined, a big-endian value should be written.
+     */
+    setInt32(byteOffset: number, value: number, littleEndian?: boolean): void;
+
+    /**
+     * Stores an Uint8 value at the specified byte offset from the start of the view.
+     * @param byteOffset The place in the buffer at which the value should be set.
+     * @param value The value to set.
+     */
+    setUint8(byteOffset: number, value: number): void;
+
+    /**
+     * Stores an Uint16 value at the specified byte offset from the start of the view.
+     * @param byteOffset The place in the buffer at which the value should be set.
+     * @param value The value to set.
+     * @param littleEndian If false or undefined, a big-endian value should be written.
+     */
+    setUint16(byteOffset: number, value: number, littleEndian?: boolean): void;
+
+    /**
+     * Stores an Uint32 value at the specified byte offset from the start of the view.
+     * @param byteOffset The place in the buffer at which the value should be set.
+     * @param value The value to set.
+     * @param littleEndian If false or undefined, a big-endian value should be written.
+     */
+    setUint32(byteOffset: number, value: number, littleEndian?: boolean): void;
+}
+
+interface DataViewConstructor {
+    readonly prototype: DataView;
+    new(buffer: ArrayBufferLike, byteOffset?: number, byteLength?: number): DataView;
+}
+declare var DataView: DataViewConstructor;
+
+/**
+ * A typed array of 8-bit integer values. The contents are initialized to 0. If the requested
+ * number of bytes could not be allocated an exception is raised.
+ */
+interface Int8Array {
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * The ArrayBuffer instance referenced by the array.
+     */
+    readonly buffer: ArrayBufferLike;
+
+    /**
+     * The length in bytes of the array.
+     */
+    readonly byteLength: number;
+
+    /**
+     * The offset in bytes of the array.
+     */
+    readonly byteOffset: number;
+
+    /**
+     * Returns the this object after copying a section of the array identified by start and end
+     * to the same array starting at position target
+     * @param target If target is negative, it is treated as length+target where length is the
+     * length of the array.
+     * @param start If start is negative, it is treated as length+start. If end is negative, it
+     * is treated as length+end.
+     * @param end If not specified, length of the this object is used as its default value.
+     */
+    copyWithin(target: number, start: number, end?: number): this;
+
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value false, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Changes all array elements from \`start\` to \`end\` index to a static \`value\` and returns the modified array
+     * @param value value to fill array section with
+     * @param start index to start filling the array at. If start is negative, it is treated as
+     * length+start where length is the length of the array.
+     * @param end index to stop filling the array at. If end is negative, it is treated as
+     * length+end.
+     */
+    fill(value: number, start?: number, end?: number): this;
+
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls
+     * the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    filter(predicate: (value: number, index: number, array: Int8Array) => any, thisArg?: any): Int8Array;
+
+    /**
+     * Returns the value of the first element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found, find
+     * immediately returns that element value. Otherwise, find returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    find(predicate: (value: number, index: number, obj: Int8Array) => boolean, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the first element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findIndex(predicate: (value: number, index: number, obj: Int8Array) => boolean, thisArg?: any): number;
+
+    /**
+     * Performs the specified action for each element in an array.
+     * @param callbackfn  A function that accepts up to three arguments. forEach calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: number, index: number, array: Int8Array) => void, thisArg?: any): void;
+
+    /**
+     * Returns the index of the first occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     *  search starts at index 0.
+     */
+    indexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * Adds all the elements of an array separated by the specified separator string.
+     * @param separator A string used to separate one element of an array from the next in the
+     * resulting String. If omitted, the array elements are separated with a comma.
+     */
+    join(separator?: string): string;
+
+    /**
+     * Returns the index of the last occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     * search starts at index 0.
+     */
+    lastIndexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * The length of the array.
+     */
+    readonly length: number;
+
+    /**
+     * Calls a defined callback function on each element of an array, and returns an array that
+     * contains the results.
+     * @param callbackfn A function that accepts up to three arguments. The map method calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    map(callbackfn: (value: number, index: number, array: Int8Array) => number, thisArg?: any): Int8Array;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number): number;
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an
+     * argument instead of an array value.
+     */
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number): number;
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;
+
+    /**
+     * Reverses the elements in an Array.
+     */
+    reverse(): Int8Array;
+
+    /**
+     * Sets a value or an array of values.
+     * @param array A typed or untyped array of values to set.
+     * @param offset The index in the current array at which the values are to be written.
+     */
+    set(array: ArrayLike<number>, offset?: number): void;
+
+    /**
+     * Returns a section of an array.
+     * @param start The beginning of the specified portion of the array.
+     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.
+     */
+    slice(start?: number, end?: number): Int8Array;
+
+    /**
+     * Determines whether the specified callback function returns true for any element of an array.
+     * @param predicate A function that accepts up to three arguments. The some method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value true, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    some(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Sorts an array.
+     * @param compareFn Function used to determine the order of the elements. It is expected to return
+     * a negative value if first argument is less than second argument, zero if they're equal and a positive
+     * value otherwise. If omitted, the elements are sorted in ascending order.
+     * \`\`\`ts
+     * [11,2,22,1].sort((a, b) => a - b)
+     * \`\`\`
+     */
+    sort(compareFn?: (a: number, b: number) => number): this;
+
+    /**
+     * Gets a new Int8Array view of the ArrayBuffer store for this array, referencing the elements
+     * at begin, inclusive, up to end, exclusive.
+     * @param begin The index of the beginning of the array.
+     * @param end The index of the end of the array.
+     */
+    subarray(begin?: number, end?: number): Int8Array;
+
+    /**
+     * Converts a number to a string by using the current locale.
+     */
+    toLocaleString(): string;
+
+    /**
+     * Returns a string representation of an array.
+     */
+    toString(): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): Int8Array;
+
+    [index: number]: number;
+}
+interface Int8ArrayConstructor {
+    readonly prototype: Int8Array;
+    new(length: number): Int8Array;
+    new(array: ArrayLike<number> | ArrayBufferLike): Int8Array;
+    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int8Array;
+
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * Returns a new array from a set of elements.
+     * @param items A set of elements to include in the new array object.
+     */
+    of(...items: number[]): Int8Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     */
+    from(arrayLike: ArrayLike<number>): Int8Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Int8Array;
+
+
+}
+declare var Int8Array: Int8ArrayConstructor;
+
+/**
+ * A typed array of 8-bit unsigned integer values. The contents are initialized to 0. If the
+ * requested number of bytes could not be allocated an exception is raised.
+ */
+interface Uint8Array {
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * The ArrayBuffer instance referenced by the array.
+     */
+    readonly buffer: ArrayBufferLike;
+
+    /**
+     * The length in bytes of the array.
+     */
+    readonly byteLength: number;
+
+    /**
+     * The offset in bytes of the array.
+     */
+    readonly byteOffset: number;
+
+    /**
+     * Returns the this object after copying a section of the array identified by start and end
+     * to the same array starting at position target
+     * @param target If target is negative, it is treated as length+target where length is the
+     * length of the array.
+     * @param start If start is negative, it is treated as length+start. If end is negative, it
+     * is treated as length+end.
+     * @param end If not specified, length of the this object is used as its default value.
+     */
+    copyWithin(target: number, start: number, end?: number): this;
+
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value false, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every(predicate: (value: number, index: number, array: Uint8Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Changes all array elements from \`start\` to \`end\` index to a static \`value\` and returns the modified array
+     * @param value value to fill array section with
+     * @param start index to start filling the array at. If start is negative, it is treated as
+     * length+start where length is the length of the array.
+     * @param end index to stop filling the array at. If end is negative, it is treated as
+     * length+end.
+     */
+    fill(value: number, start?: number, end?: number): this;
+
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls
+     * the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    filter(predicate: (value: number, index: number, array: Uint8Array) => any, thisArg?: any): Uint8Array;
+
+    /**
+     * Returns the value of the first element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found, find
+     * immediately returns that element value. Otherwise, find returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    find(predicate: (value: number, index: number, obj: Uint8Array) => boolean, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the first element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findIndex(predicate: (value: number, index: number, obj: Uint8Array) => boolean, thisArg?: any): number;
+
+    /**
+     * Performs the specified action for each element in an array.
+     * @param callbackfn  A function that accepts up to three arguments. forEach calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: number, index: number, array: Uint8Array) => void, thisArg?: any): void;
+
+    /**
+     * Returns the index of the first occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     *  search starts at index 0.
+     */
+    indexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * Adds all the elements of an array separated by the specified separator string.
+     * @param separator A string used to separate one element of an array from the next in the
+     * resulting String. If omitted, the array elements are separated with a comma.
+     */
+    join(separator?: string): string;
+
+    /**
+     * Returns the index of the last occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     * search starts at index 0.
+     */
+    lastIndexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * The length of the array.
+     */
+    readonly length: number;
+
+    /**
+     * Calls a defined callback function on each element of an array, and returns an array that
+     * contains the results.
+     * @param callbackfn A function that accepts up to three arguments. The map method calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    map(callbackfn: (value: number, index: number, array: Uint8Array) => number, thisArg?: any): Uint8Array;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number): number;
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an
+     * argument instead of an array value.
+     */
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number): number;
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;
+
+    /**
+     * Reverses the elements in an Array.
+     */
+    reverse(): Uint8Array;
+
+    /**
+     * Sets a value or an array of values.
+     * @param array A typed or untyped array of values to set.
+     * @param offset The index in the current array at which the values are to be written.
+     */
+    set(array: ArrayLike<number>, offset?: number): void;
+
+    /**
+     * Returns a section of an array.
+     * @param start The beginning of the specified portion of the array.
+     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.
+     */
+    slice(start?: number, end?: number): Uint8Array;
+
+    /**
+     * Determines whether the specified callback function returns true for any element of an array.
+     * @param predicate A function that accepts up to three arguments. The some method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value true, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    some(predicate: (value: number, index: number, array: Uint8Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Sorts an array.
+     * @param compareFn Function used to determine the order of the elements. It is expected to return
+     * a negative value if first argument is less than second argument, zero if they're equal and a positive
+     * value otherwise. If omitted, the elements are sorted in ascending order.
+     * \`\`\`ts
+     * [11,2,22,1].sort((a, b) => a - b)
+     * \`\`\`
+     */
+    sort(compareFn?: (a: number, b: number) => number): this;
+
+    /**
+     * Gets a new Uint8Array view of the ArrayBuffer store for this array, referencing the elements
+     * at begin, inclusive, up to end, exclusive.
+     * @param begin The index of the beginning of the array.
+     * @param end The index of the end of the array.
+     */
+    subarray(begin?: number, end?: number): Uint8Array;
+
+    /**
+     * Converts a number to a string by using the current locale.
+     */
+    toLocaleString(): string;
+
+    /**
+     * Returns a string representation of an array.
+     */
+    toString(): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): Uint8Array;
+
+    [index: number]: number;
+}
+
+interface Uint8ArrayConstructor {
+    readonly prototype: Uint8Array;
+    new(length: number): Uint8Array;
+    new(array: ArrayLike<number> | ArrayBufferLike): Uint8Array;
+    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint8Array;
+
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * Returns a new array from a set of elements.
+     * @param items A set of elements to include in the new array object.
+     */
+    of(...items: number[]): Uint8Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     */
+    from(arrayLike: ArrayLike<number>): Uint8Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Uint8Array;
+
+}
+declare var Uint8Array: Uint8ArrayConstructor;
+
+/**
+ * A typed array of 8-bit unsigned integer (clamped) values. The contents are initialized to 0.
+ * If the requested number of bytes could not be allocated an exception is raised.
+ */
+interface Uint8ClampedArray {
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * The ArrayBuffer instance referenced by the array.
+     */
+    readonly buffer: ArrayBufferLike;
+
+    /**
+     * The length in bytes of the array.
+     */
+    readonly byteLength: number;
+
+    /**
+     * The offset in bytes of the array.
+     */
+    readonly byteOffset: number;
+
+    /**
+     * Returns the this object after copying a section of the array identified by start and end
+     * to the same array starting at position target
+     * @param target If target is negative, it is treated as length+target where length is the
+     * length of the array.
+     * @param start If start is negative, it is treated as length+start. If end is negative, it
+     * is treated as length+end.
+     * @param end If not specified, length of the this object is used as its default value.
+     */
+    copyWithin(target: number, start: number, end?: number): this;
+
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value false, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every(predicate: (value: number, index: number, array: Uint8ClampedArray) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Changes all array elements from \`start\` to \`end\` index to a static \`value\` and returns the modified array
+     * @param value value to fill array section with
+     * @param start index to start filling the array at. If start is negative, it is treated as
+     * length+start where length is the length of the array.
+     * @param end index to stop filling the array at. If end is negative, it is treated as
+     * length+end.
+     */
+    fill(value: number, start?: number, end?: number): this;
+
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls
+     * the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    filter(predicate: (value: number, index: number, array: Uint8ClampedArray) => any, thisArg?: any): Uint8ClampedArray;
+
+    /**
+     * Returns the value of the first element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found, find
+     * immediately returns that element value. Otherwise, find returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    find(predicate: (value: number, index: number, obj: Uint8ClampedArray) => boolean, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the first element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findIndex(predicate: (value: number, index: number, obj: Uint8ClampedArray) => boolean, thisArg?: any): number;
+
+    /**
+     * Performs the specified action for each element in an array.
+     * @param callbackfn  A function that accepts up to three arguments. forEach calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: number, index: number, array: Uint8ClampedArray) => void, thisArg?: any): void;
+
+    /**
+     * Returns the index of the first occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     *  search starts at index 0.
+     */
+    indexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * Adds all the elements of an array separated by the specified separator string.
+     * @param separator A string used to separate one element of an array from the next in the
+     * resulting String. If omitted, the array elements are separated with a comma.
+     */
+    join(separator?: string): string;
+
+    /**
+     * Returns the index of the last occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     * search starts at index 0.
+     */
+    lastIndexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * The length of the array.
+     */
+    readonly length: number;
+
+    /**
+     * Calls a defined callback function on each element of an array, and returns an array that
+     * contains the results.
+     * @param callbackfn A function that accepts up to three arguments. The map method calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    map(callbackfn: (value: number, index: number, array: Uint8ClampedArray) => number, thisArg?: any): Uint8ClampedArray;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number): number;
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => U, initialValue: U): U;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an
+     * argument instead of an array value.
+     */
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number): number;
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => U, initialValue: U): U;
+
+    /**
+     * Reverses the elements in an Array.
+     */
+    reverse(): Uint8ClampedArray;
+
+    /**
+     * Sets a value or an array of values.
+     * @param array A typed or untyped array of values to set.
+     * @param offset The index in the current array at which the values are to be written.
+     */
+    set(array: ArrayLike<number>, offset?: number): void;
+
+    /**
+     * Returns a section of an array.
+     * @param start The beginning of the specified portion of the array.
+     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.
+     */
+    slice(start?: number, end?: number): Uint8ClampedArray;
+
+    /**
+     * Determines whether the specified callback function returns true for any element of an array.
+     * @param predicate A function that accepts up to three arguments. The some method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value true, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    some(predicate: (value: number, index: number, array: Uint8ClampedArray) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Sorts an array.
+     * @param compareFn Function used to determine the order of the elements. It is expected to return
+     * a negative value if first argument is less than second argument, zero if they're equal and a positive
+     * value otherwise. If omitted, the elements are sorted in ascending order.
+     * \`\`\`ts
+     * [11,2,22,1].sort((a, b) => a - b)
+     * \`\`\`
+     */
+    sort(compareFn?: (a: number, b: number) => number): this;
+
+    /**
+     * Gets a new Uint8ClampedArray view of the ArrayBuffer store for this array, referencing the elements
+     * at begin, inclusive, up to end, exclusive.
+     * @param begin The index of the beginning of the array.
+     * @param end The index of the end of the array.
+     */
+    subarray(begin?: number, end?: number): Uint8ClampedArray;
+
+    /**
+     * Converts a number to a string by using the current locale.
+     */
+    toLocaleString(): string;
+
+    /**
+     * Returns a string representation of an array.
+     */
+    toString(): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): Uint8ClampedArray;
+
+    [index: number]: number;
+}
+
+interface Uint8ClampedArrayConstructor {
+    readonly prototype: Uint8ClampedArray;
+    new(length: number): Uint8ClampedArray;
+    new(array: ArrayLike<number> | ArrayBufferLike): Uint8ClampedArray;
+    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint8ClampedArray;
+
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * Returns a new array from a set of elements.
+     * @param items A set of elements to include in the new array object.
+     */
+    of(...items: number[]): Uint8ClampedArray;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     */
+    from(arrayLike: ArrayLike<number>): Uint8ClampedArray;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Uint8ClampedArray;
+}
+declare var Uint8ClampedArray: Uint8ClampedArrayConstructor;
+
+/**
+ * A typed array of 16-bit signed integer values. The contents are initialized to 0. If the
+ * requested number of bytes could not be allocated an exception is raised.
+ */
+interface Int16Array {
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * The ArrayBuffer instance referenced by the array.
+     */
+    readonly buffer: ArrayBufferLike;
+
+    /**
+     * The length in bytes of the array.
+     */
+    readonly byteLength: number;
+
+    /**
+     * The offset in bytes of the array.
+     */
+    readonly byteOffset: number;
+
+    /**
+     * Returns the this object after copying a section of the array identified by start and end
+     * to the same array starting at position target
+     * @param target If target is negative, it is treated as length+target where length is the
+     * length of the array.
+     * @param start If start is negative, it is treated as length+start. If end is negative, it
+     * is treated as length+end.
+     * @param end If not specified, length of the this object is used as its default value.
+     */
+    copyWithin(target: number, start: number, end?: number): this;
+
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value false, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every(predicate: (value: number, index: number, array: Int16Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Changes all array elements from \`start\` to \`end\` index to a static \`value\` and returns the modified array
+     * @param value value to fill array section with
+     * @param start index to start filling the array at. If start is negative, it is treated as
+     * length+start where length is the length of the array.
+     * @param end index to stop filling the array at. If end is negative, it is treated as
+     * length+end.
+     */
+    fill(value: number, start?: number, end?: number): this;
+
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls
+     * the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    filter(predicate: (value: number, index: number, array: Int16Array) => any, thisArg?: any): Int16Array;
+
+    /**
+     * Returns the value of the first element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found, find
+     * immediately returns that element value. Otherwise, find returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    find(predicate: (value: number, index: number, obj: Int16Array) => boolean, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the first element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findIndex(predicate: (value: number, index: number, obj: Int16Array) => boolean, thisArg?: any): number;
+
+    /**
+     * Performs the specified action for each element in an array.
+     * @param callbackfn  A function that accepts up to three arguments. forEach calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: number, index: number, array: Int16Array) => void, thisArg?: any): void;
+    /**
+     * Returns the index of the first occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     *  search starts at index 0.
+     */
+    indexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * Adds all the elements of an array separated by the specified separator string.
+     * @param separator A string used to separate one element of an array from the next in the
+     * resulting String. If omitted, the array elements are separated with a comma.
+     */
+    join(separator?: string): string;
+
+    /**
+     * Returns the index of the last occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     * search starts at index 0.
+     */
+    lastIndexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * The length of the array.
+     */
+    readonly length: number;
+
+    /**
+     * Calls a defined callback function on each element of an array, and returns an array that
+     * contains the results.
+     * @param callbackfn A function that accepts up to three arguments. The map method calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    map(callbackfn: (value: number, index: number, array: Int16Array) => number, thisArg?: any): Int16Array;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number): number;
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an
+     * argument instead of an array value.
+     */
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number): number;
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;
+
+    /**
+     * Reverses the elements in an Array.
+     */
+    reverse(): Int16Array;
+
+    /**
+     * Sets a value or an array of values.
+     * @param array A typed or untyped array of values to set.
+     * @param offset The index in the current array at which the values are to be written.
+     */
+    set(array: ArrayLike<number>, offset?: number): void;
+
+    /**
+     * Returns a section of an array.
+     * @param start The beginning of the specified portion of the array.
+     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.
+     */
+    slice(start?: number, end?: number): Int16Array;
+
+    /**
+     * Determines whether the specified callback function returns true for any element of an array.
+     * @param predicate A function that accepts up to three arguments. The some method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value true, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    some(predicate: (value: number, index: number, array: Int16Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Sorts an array.
+     * @param compareFn Function used to determine the order of the elements. It is expected to return
+     * a negative value if first argument is less than second argument, zero if they're equal and a positive
+     * value otherwise. If omitted, the elements are sorted in ascending order.
+     * \`\`\`ts
+     * [11,2,22,1].sort((a, b) => a - b)
+     * \`\`\`
+     */
+    sort(compareFn?: (a: number, b: number) => number): this;
+
+    /**
+     * Gets a new Int16Array view of the ArrayBuffer store for this array, referencing the elements
+     * at begin, inclusive, up to end, exclusive.
+     * @param begin The index of the beginning of the array.
+     * @param end The index of the end of the array.
+     */
+    subarray(begin?: number, end?: number): Int16Array;
+
+    /**
+     * Converts a number to a string by using the current locale.
+     */
+    toLocaleString(): string;
+
+    /**
+     * Returns a string representation of an array.
+     */
+    toString(): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): Int16Array;
+
+    [index: number]: number;
+}
+
+interface Int16ArrayConstructor {
+    readonly prototype: Int16Array;
+    new(length: number): Int16Array;
+    new(array: ArrayLike<number> | ArrayBufferLike): Int16Array;
+    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int16Array;
+
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * Returns a new array from a set of elements.
+     * @param items A set of elements to include in the new array object.
+     */
+    of(...items: number[]): Int16Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     */
+    from(arrayLike: ArrayLike<number>): Int16Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Int16Array;
+
+
+}
+declare var Int16Array: Int16ArrayConstructor;
+
+/**
+ * A typed array of 16-bit unsigned integer values. The contents are initialized to 0. If the
+ * requested number of bytes could not be allocated an exception is raised.
+ */
+interface Uint16Array {
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * The ArrayBuffer instance referenced by the array.
+     */
+    readonly buffer: ArrayBufferLike;
+
+    /**
+     * The length in bytes of the array.
+     */
+    readonly byteLength: number;
+
+    /**
+     * The offset in bytes of the array.
+     */
+    readonly byteOffset: number;
+
+    /**
+     * Returns the this object after copying a section of the array identified by start and end
+     * to the same array starting at position target
+     * @param target If target is negative, it is treated as length+target where length is the
+     * length of the array.
+     * @param start If start is negative, it is treated as length+start. If end is negative, it
+     * is treated as length+end.
+     * @param end If not specified, length of the this object is used as its default value.
+     */
+    copyWithin(target: number, start: number, end?: number): this;
+
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value false, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every(predicate: (value: number, index: number, array: Uint16Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Changes all array elements from \`start\` to \`end\` index to a static \`value\` and returns the modified array
+     * @param value value to fill array section with
+     * @param start index to start filling the array at. If start is negative, it is treated as
+     * length+start where length is the length of the array.
+     * @param end index to stop filling the array at. If end is negative, it is treated as
+     * length+end.
+     */
+    fill(value: number, start?: number, end?: number): this;
+
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls
+     * the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    filter(predicate: (value: number, index: number, array: Uint16Array) => any, thisArg?: any): Uint16Array;
+
+    /**
+     * Returns the value of the first element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found, find
+     * immediately returns that element value. Otherwise, find returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    find(predicate: (value: number, index: number, obj: Uint16Array) => boolean, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the first element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findIndex(predicate: (value: number, index: number, obj: Uint16Array) => boolean, thisArg?: any): number;
+
+    /**
+     * Performs the specified action for each element in an array.
+     * @param callbackfn  A function that accepts up to three arguments. forEach calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: number, index: number, array: Uint16Array) => void, thisArg?: any): void;
+
+    /**
+     * Returns the index of the first occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     *  search starts at index 0.
+     */
+    indexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * Adds all the elements of an array separated by the specified separator string.
+     * @param separator A string used to separate one element of an array from the next in the
+     * resulting String. If omitted, the array elements are separated with a comma.
+     */
+    join(separator?: string): string;
+
+    /**
+     * Returns the index of the last occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     * search starts at index 0.
+     */
+    lastIndexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * The length of the array.
+     */
+    readonly length: number;
+
+    /**
+     * Calls a defined callback function on each element of an array, and returns an array that
+     * contains the results.
+     * @param callbackfn A function that accepts up to three arguments. The map method calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    map(callbackfn: (value: number, index: number, array: Uint16Array) => number, thisArg?: any): Uint16Array;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number): number;
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an
+     * argument instead of an array value.
+     */
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number): number;
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;
+
+    /**
+     * Reverses the elements in an Array.
+     */
+    reverse(): Uint16Array;
+
+    /**
+     * Sets a value or an array of values.
+     * @param array A typed or untyped array of values to set.
+     * @param offset The index in the current array at which the values are to be written.
+     */
+    set(array: ArrayLike<number>, offset?: number): void;
+
+    /**
+     * Returns a section of an array.
+     * @param start The beginning of the specified portion of the array.
+     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.
+     */
+    slice(start?: number, end?: number): Uint16Array;
+
+    /**
+     * Determines whether the specified callback function returns true for any element of an array.
+     * @param predicate A function that accepts up to three arguments. The some method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value true, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    some(predicate: (value: number, index: number, array: Uint16Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Sorts an array.
+     * @param compareFn Function used to determine the order of the elements. It is expected to return
+     * a negative value if first argument is less than second argument, zero if they're equal and a positive
+     * value otherwise. If omitted, the elements are sorted in ascending order.
+     * \`\`\`ts
+     * [11,2,22,1].sort((a, b) => a - b)
+     * \`\`\`
+     */
+    sort(compareFn?: (a: number, b: number) => number): this;
+
+    /**
+     * Gets a new Uint16Array view of the ArrayBuffer store for this array, referencing the elements
+     * at begin, inclusive, up to end, exclusive.
+     * @param begin The index of the beginning of the array.
+     * @param end The index of the end of the array.
+     */
+    subarray(begin?: number, end?: number): Uint16Array;
+
+    /**
+     * Converts a number to a string by using the current locale.
+     */
+    toLocaleString(): string;
+
+    /**
+     * Returns a string representation of an array.
+     */
+    toString(): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): Uint16Array;
+
+    [index: number]: number;
+}
+
+interface Uint16ArrayConstructor {
+    readonly prototype: Uint16Array;
+    new(length: number): Uint16Array;
+    new(array: ArrayLike<number> | ArrayBufferLike): Uint16Array;
+    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint16Array;
+
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * Returns a new array from a set of elements.
+     * @param items A set of elements to include in the new array object.
+     */
+    of(...items: number[]): Uint16Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     */
+    from(arrayLike: ArrayLike<number>): Uint16Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Uint16Array;
+
+
+}
+declare var Uint16Array: Uint16ArrayConstructor;
+/**
+ * A typed array of 32-bit signed integer values. The contents are initialized to 0. If the
+ * requested number of bytes could not be allocated an exception is raised.
+ */
+interface Int32Array {
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * The ArrayBuffer instance referenced by the array.
+     */
+    readonly buffer: ArrayBufferLike;
+
+    /**
+     * The length in bytes of the array.
+     */
+    readonly byteLength: number;
+
+    /**
+     * The offset in bytes of the array.
+     */
+    readonly byteOffset: number;
+
+    /**
+     * Returns the this object after copying a section of the array identified by start and end
+     * to the same array starting at position target
+     * @param target If target is negative, it is treated as length+target where length is the
+     * length of the array.
+     * @param start If start is negative, it is treated as length+start. If end is negative, it
+     * is treated as length+end.
+     * @param end If not specified, length of the this object is used as its default value.
+     */
+    copyWithin(target: number, start: number, end?: number): this;
+
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value false, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every(predicate: (value: number, index: number, array: Int32Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Changes all array elements from \`start\` to \`end\` index to a static \`value\` and returns the modified array
+     * @param value value to fill array section with
+     * @param start index to start filling the array at. If start is negative, it is treated as
+     * length+start where length is the length of the array.
+     * @param end index to stop filling the array at. If end is negative, it is treated as
+     * length+end.
+     */
+    fill(value: number, start?: number, end?: number): this;
+
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls
+     * the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    filter(predicate: (value: number, index: number, array: Int32Array) => any, thisArg?: any): Int32Array;
+
+    /**
+     * Returns the value of the first element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found, find
+     * immediately returns that element value. Otherwise, find returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    find(predicate: (value: number, index: number, obj: Int32Array) => boolean, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the first element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findIndex(predicate: (value: number, index: number, obj: Int32Array) => boolean, thisArg?: any): number;
+
+    /**
+     * Performs the specified action for each element in an array.
+     * @param callbackfn  A function that accepts up to three arguments. forEach calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: number, index: number, array: Int32Array) => void, thisArg?: any): void;
+
+    /**
+     * Returns the index of the first occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     *  search starts at index 0.
+     */
+    indexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * Adds all the elements of an array separated by the specified separator string.
+     * @param separator A string used to separate one element of an array from the next in the
+     * resulting String. If omitted, the array elements are separated with a comma.
+     */
+    join(separator?: string): string;
+
+    /**
+     * Returns the index of the last occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     * search starts at index 0.
+     */
+    lastIndexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * The length of the array.
+     */
+    readonly length: number;
+
+    /**
+     * Calls a defined callback function on each element of an array, and returns an array that
+     * contains the results.
+     * @param callbackfn A function that accepts up to three arguments. The map method calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    map(callbackfn: (value: number, index: number, array: Int32Array) => number, thisArg?: any): Int32Array;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number): number;
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an
+     * argument instead of an array value.
+     */
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number): number;
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;
+
+    /**
+     * Reverses the elements in an Array.
+     */
+    reverse(): Int32Array;
+
+    /**
+     * Sets a value or an array of values.
+     * @param array A typed or untyped array of values to set.
+     * @param offset The index in the current array at which the values are to be written.
+     */
+    set(array: ArrayLike<number>, offset?: number): void;
+
+    /**
+     * Returns a section of an array.
+     * @param start The beginning of the specified portion of the array.
+     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.
+     */
+    slice(start?: number, end?: number): Int32Array;
+
+    /**
+     * Determines whether the specified callback function returns true for any element of an array.
+     * @param predicate A function that accepts up to three arguments. The some method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value true, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    some(predicate: (value: number, index: number, array: Int32Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Sorts an array.
+     * @param compareFn Function used to determine the order of the elements. It is expected to return
+     * a negative value if first argument is less than second argument, zero if they're equal and a positive
+     * value otherwise. If omitted, the elements are sorted in ascending order.
+     * \`\`\`ts
+     * [11,2,22,1].sort((a, b) => a - b)
+     * \`\`\`
+     */
+    sort(compareFn?: (a: number, b: number) => number): this;
+
+    /**
+     * Gets a new Int32Array view of the ArrayBuffer store for this array, referencing the elements
+     * at begin, inclusive, up to end, exclusive.
+     * @param begin The index of the beginning of the array.
+     * @param end The index of the end of the array.
+     */
+    subarray(begin?: number, end?: number): Int32Array;
+
+    /**
+     * Converts a number to a string by using the current locale.
+     */
+    toLocaleString(): string;
+
+    /**
+     * Returns a string representation of an array.
+     */
+    toString(): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): Int32Array;
+
+    [index: number]: number;
+}
+
+interface Int32ArrayConstructor {
+    readonly prototype: Int32Array;
+    new(length: number): Int32Array;
+    new(array: ArrayLike<number> | ArrayBufferLike): Int32Array;
+    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int32Array;
+
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * Returns a new array from a set of elements.
+     * @param items A set of elements to include in the new array object.
+     */
+    of(...items: number[]): Int32Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     */
+    from(arrayLike: ArrayLike<number>): Int32Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Int32Array;
+
+}
+declare var Int32Array: Int32ArrayConstructor;
+
+/**
+ * A typed array of 32-bit unsigned integer values. The contents are initialized to 0. If the
+ * requested number of bytes could not be allocated an exception is raised.
+ */
+interface Uint32Array {
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * The ArrayBuffer instance referenced by the array.
+     */
+    readonly buffer: ArrayBufferLike;
+
+    /**
+     * The length in bytes of the array.
+     */
+    readonly byteLength: number;
+
+    /**
+     * The offset in bytes of the array.
+     */
+    readonly byteOffset: number;
+
+    /**
+     * Returns the this object after copying a section of the array identified by start and end
+     * to the same array starting at position target
+     * @param target If target is negative, it is treated as length+target where length is the
+     * length of the array.
+     * @param start If start is negative, it is treated as length+start. If end is negative, it
+     * is treated as length+end.
+     * @param end If not specified, length of the this object is used as its default value.
+     */
+    copyWithin(target: number, start: number, end?: number): this;
+
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value false, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every(predicate: (value: number, index: number, array: Uint32Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Changes all array elements from \`start\` to \`end\` index to a static \`value\` and returns the modified array
+     * @param value value to fill array section with
+     * @param start index to start filling the array at. If start is negative, it is treated as
+     * length+start where length is the length of the array.
+     * @param end index to stop filling the array at. If end is negative, it is treated as
+     * length+end.
+     */
+    fill(value: number, start?: number, end?: number): this;
+
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls
+     * the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    filter(predicate: (value: number, index: number, array: Uint32Array) => any, thisArg?: any): Uint32Array;
+
+    /**
+     * Returns the value of the first element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found, find
+     * immediately returns that element value. Otherwise, find returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    find(predicate: (value: number, index: number, obj: Uint32Array) => boolean, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the first element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findIndex(predicate: (value: number, index: number, obj: Uint32Array) => boolean, thisArg?: any): number;
+
+    /**
+     * Performs the specified action for each element in an array.
+     * @param callbackfn  A function that accepts up to three arguments. forEach calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: number, index: number, array: Uint32Array) => void, thisArg?: any): void;
+    /**
+     * Returns the index of the first occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     *  search starts at index 0.
+     */
+    indexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * Adds all the elements of an array separated by the specified separator string.
+     * @param separator A string used to separate one element of an array from the next in the
+     * resulting String. If omitted, the array elements are separated with a comma.
+     */
+    join(separator?: string): string;
+
+    /**
+     * Returns the index of the last occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     * search starts at index 0.
+     */
+    lastIndexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * The length of the array.
+     */
+    readonly length: number;
+
+    /**
+     * Calls a defined callback function on each element of an array, and returns an array that
+     * contains the results.
+     * @param callbackfn A function that accepts up to three arguments. The map method calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    map(callbackfn: (value: number, index: number, array: Uint32Array) => number, thisArg?: any): Uint32Array;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number): number;
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an
+     * argument instead of an array value.
+     */
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number): number;
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;
+
+    /**
+     * Reverses the elements in an Array.
+     */
+    reverse(): Uint32Array;
+
+    /**
+     * Sets a value or an array of values.
+     * @param array A typed or untyped array of values to set.
+     * @param offset The index in the current array at which the values are to be written.
+     */
+    set(array: ArrayLike<number>, offset?: number): void;
+
+    /**
+     * Returns a section of an array.
+     * @param start The beginning of the specified portion of the array.
+     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.
+     */
+    slice(start?: number, end?: number): Uint32Array;
+
+    /**
+     * Determines whether the specified callback function returns true for any element of an array.
+     * @param predicate A function that accepts up to three arguments. The some method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value true, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    some(predicate: (value: number, index: number, array: Uint32Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Sorts an array.
+     * @param compareFn Function used to determine the order of the elements. It is expected to return
+     * a negative value if first argument is less than second argument, zero if they're equal and a positive
+     * value otherwise. If omitted, the elements are sorted in ascending order.
+     * \`\`\`ts
+     * [11,2,22,1].sort((a, b) => a - b)
+     * \`\`\`
+     */
+    sort(compareFn?: (a: number, b: number) => number): this;
+
+    /**
+     * Gets a new Uint32Array view of the ArrayBuffer store for this array, referencing the elements
+     * at begin, inclusive, up to end, exclusive.
+     * @param begin The index of the beginning of the array.
+     * @param end The index of the end of the array.
+     */
+    subarray(begin?: number, end?: number): Uint32Array;
+
+    /**
+     * Converts a number to a string by using the current locale.
+     */
+    toLocaleString(): string;
+
+    /**
+     * Returns a string representation of an array.
+     */
+    toString(): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): Uint32Array;
+
+    [index: number]: number;
+}
+
+interface Uint32ArrayConstructor {
+    readonly prototype: Uint32Array;
+    new(length: number): Uint32Array;
+    new(array: ArrayLike<number> | ArrayBufferLike): Uint32Array;
+    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint32Array;
+
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * Returns a new array from a set of elements.
+     * @param items A set of elements to include in the new array object.
+     */
+    of(...items: number[]): Uint32Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     */
+    from(arrayLike: ArrayLike<number>): Uint32Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Uint32Array;
+
+}
+declare var Uint32Array: Uint32ArrayConstructor;
+
+/**
+ * A typed array of 32-bit float values. The contents are initialized to 0. If the requested number
+ * of bytes could not be allocated an exception is raised.
+ */
+interface Float32Array {
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * The ArrayBuffer instance referenced by the array.
+     */
+    readonly buffer: ArrayBufferLike;
+
+    /**
+     * The length in bytes of the array.
+     */
+    readonly byteLength: number;
+
+    /**
+     * The offset in bytes of the array.
+     */
+    readonly byteOffset: number;
+
+    /**
+     * Returns the this object after copying a section of the array identified by start and end
+     * to the same array starting at position target
+     * @param target If target is negative, it is treated as length+target where length is the
+     * length of the array.
+     * @param start If start is negative, it is treated as length+start. If end is negative, it
+     * is treated as length+end.
+     * @param end If not specified, length of the this object is used as its default value.
+     */
+    copyWithin(target: number, start: number, end?: number): this;
+
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value false, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every(predicate: (value: number, index: number, array: Float32Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Changes all array elements from \`start\` to \`end\` index to a static \`value\` and returns the modified array
+     * @param value value to fill array section with
+     * @param start index to start filling the array at. If start is negative, it is treated as
+     * length+start where length is the length of the array.
+     * @param end index to stop filling the array at. If end is negative, it is treated as
+     * length+end.
+     */
+    fill(value: number, start?: number, end?: number): this;
+
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls
+     * the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    filter(predicate: (value: number, index: number, array: Float32Array) => any, thisArg?: any): Float32Array;
+
+    /**
+     * Returns the value of the first element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found, find
+     * immediately returns that element value. Otherwise, find returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    find(predicate: (value: number, index: number, obj: Float32Array) => boolean, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the first element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findIndex(predicate: (value: number, index: number, obj: Float32Array) => boolean, thisArg?: any): number;
+
+    /**
+     * Performs the specified action for each element in an array.
+     * @param callbackfn  A function that accepts up to three arguments. forEach calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: number, index: number, array: Float32Array) => void, thisArg?: any): void;
+
+    /**
+     * Returns the index of the first occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     *  search starts at index 0.
+     */
+    indexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * Adds all the elements of an array separated by the specified separator string.
+     * @param separator A string used to separate one element of an array from the next in the
+     * resulting String. If omitted, the array elements are separated with a comma.
+     */
+    join(separator?: string): string;
+
+    /**
+     * Returns the index of the last occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     * search starts at index 0.
+     */
+    lastIndexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * The length of the array.
+     */
+    readonly length: number;
+
+    /**
+     * Calls a defined callback function on each element of an array, and returns an array that
+     * contains the results.
+     * @param callbackfn A function that accepts up to three arguments. The map method calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    map(callbackfn: (value: number, index: number, array: Float32Array) => number, thisArg?: any): Float32Array;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number): number;
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an
+     * argument instead of an array value.
+     */
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number): number;
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;
+
+    /**
+     * Reverses the elements in an Array.
+     */
+    reverse(): Float32Array;
+
+    /**
+     * Sets a value or an array of values.
+     * @param array A typed or untyped array of values to set.
+     * @param offset The index in the current array at which the values are to be written.
+     */
+    set(array: ArrayLike<number>, offset?: number): void;
+
+    /**
+     * Returns a section of an array.
+     * @param start The beginning of the specified portion of the array.
+     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.
+     */
+    slice(start?: number, end?: number): Float32Array;
+
+    /**
+     * Determines whether the specified callback function returns true for any element of an array.
+     * @param predicate A function that accepts up to three arguments. The some method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value true, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    some(predicate: (value: number, index: number, array: Float32Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Sorts an array.
+     * @param compareFn Function used to determine the order of the elements. It is expected to return
+     * a negative value if first argument is less than second argument, zero if they're equal and a positive
+     * value otherwise. If omitted, the elements are sorted in ascending order.
+     * \`\`\`ts
+     * [11,2,22,1].sort((a, b) => a - b)
+     * \`\`\`
+     */
+    sort(compareFn?: (a: number, b: number) => number): this;
+
+    /**
+     * Gets a new Float32Array view of the ArrayBuffer store for this array, referencing the elements
+     * at begin, inclusive, up to end, exclusive.
+     * @param begin The index of the beginning of the array.
+     * @param end The index of the end of the array.
+     */
+    subarray(begin?: number, end?: number): Float32Array;
+
+    /**
+     * Converts a number to a string by using the current locale.
+     */
+    toLocaleString(): string;
+
+    /**
+     * Returns a string representation of an array.
+     */
+    toString(): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): Float32Array;
+
+    [index: number]: number;
+}
+
+interface Float32ArrayConstructor {
+    readonly prototype: Float32Array;
+    new(length: number): Float32Array;
+    new(array: ArrayLike<number> | ArrayBufferLike): Float32Array;
+    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Float32Array;
+
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * Returns a new array from a set of elements.
+     * @param items A set of elements to include in the new array object.
+     */
+    of(...items: number[]): Float32Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     */
+    from(arrayLike: ArrayLike<number>): Float32Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Float32Array;
+
+
+}
+declare var Float32Array: Float32ArrayConstructor;
+
+/**
+ * A typed array of 64-bit float values. The contents are initialized to 0. If the requested
+ * number of bytes could not be allocated an exception is raised.
+ */
+interface Float64Array {
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * The ArrayBuffer instance referenced by the array.
+     */
+    readonly buffer: ArrayBufferLike;
+
+    /**
+     * The length in bytes of the array.
+     */
+    readonly byteLength: number;
+
+    /**
+     * The offset in bytes of the array.
+     */
+    readonly byteOffset: number;
+
+    /**
+     * Returns the this object after copying a section of the array identified by start and end
+     * to the same array starting at position target
+     * @param target If target is negative, it is treated as length+target where length is the
+     * length of the array.
+     * @param start If start is negative, it is treated as length+start. If end is negative, it
+     * is treated as length+end.
+     * @param end If not specified, length of the this object is used as its default value.
+     */
+    copyWithin(target: number, start: number, end?: number): this;
+
+    /**
+     * Determines whether all the members of an array satisfy the specified test.
+     * @param predicate A function that accepts up to three arguments. The every method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value false, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    every(predicate: (value: number, index: number, array: Float64Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Changes all array elements from \`start\` to \`end\` index to a static \`value\` and returns the modified array
+     * @param value value to fill array section with
+     * @param start index to start filling the array at. If start is negative, it is treated as
+     * length+start where length is the length of the array.
+     * @param end index to stop filling the array at. If end is negative, it is treated as
+     * length+end.
+     */
+    fill(value: number, start?: number, end?: number): this;
+
+    /**
+     * Returns the elements of an array that meet the condition specified in a callback function.
+     * @param predicate A function that accepts up to three arguments. The filter method calls
+     * the predicate function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    filter(predicate: (value: number, index: number, array: Float64Array) => any, thisArg?: any): Float64Array;
+
+    /**
+     * Returns the value of the first element in the array where predicate is true, and undefined
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found, find
+     * immediately returns that element value. Otherwise, find returns undefined.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    find(predicate: (value: number, index: number, obj: Float64Array) => boolean, thisArg?: any): number | undefined;
+
+    /**
+     * Returns the index of the first element in the array where predicate is true, and -1
+     * otherwise.
+     * @param predicate find calls predicate once for each element of the array, in ascending
+     * order, until it finds one where predicate returns true. If such an element is found,
+     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.
+     * @param thisArg If provided, it will be used as the this value for each invocation of
+     * predicate. If it is not provided, undefined is used instead.
+     */
+    findIndex(predicate: (value: number, index: number, obj: Float64Array) => boolean, thisArg?: any): number;
+
+    /**
+     * Performs the specified action for each element in an array.
+     * @param callbackfn  A function that accepts up to three arguments. forEach calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    forEach(callbackfn: (value: number, index: number, array: Float64Array) => void, thisArg?: any): void;
+
+    /**
+     * Returns the index of the first occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     *  search starts at index 0.
+     */
+    indexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * Adds all the elements of an array separated by the specified separator string.
+     * @param separator A string used to separate one element of an array from the next in the
+     * resulting String. If omitted, the array elements are separated with a comma.
+     */
+    join(separator?: string): string;
+
+    /**
+     * Returns the index of the last occurrence of a value in an array.
+     * @param searchElement The value to locate in the array.
+     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
+     * search starts at index 0.
+     */
+    lastIndexOf(searchElement: number, fromIndex?: number): number;
+
+    /**
+     * The length of the array.
+     */
+    readonly length: number;
+
+    /**
+     * Calls a defined callback function on each element of an array, and returns an array that
+     * contains the results.
+     * @param callbackfn A function that accepts up to three arguments. The map method calls the
+     * callbackfn function one time for each element in the array.
+     * @param thisArg An object to which the this keyword can refer in the callbackfn function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    map(callbackfn: (value: number, index: number, array: Float64Array) => number, thisArg?: any): Float64Array;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number): number;
+    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array. The return value of
+     * the callback function is the accumulated result, and is provided as an argument in the next
+     * call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the
+     * callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an
+     * argument instead of an array value.
+     */
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number): number;
+    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue: number): number;
+
+    /**
+     * Calls the specified callback function for all the elements in an array, in descending order.
+     * The return value of the callback function is the accumulated result, and is provided as an
+     * argument in the next call to the callback function.
+     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
+     * the callbackfn function one time for each element in the array.
+     * @param initialValue If initialValue is specified, it is used as the initial value to start
+     * the accumulation. The first call to the callbackfn function provides this value as an argument
+     * instead of an array value.
+     */
+    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;
+
+    /**
+     * Reverses the elements in an Array.
+     */
+    reverse(): Float64Array;
+
+    /**
+     * Sets a value or an array of values.
+     * @param array A typed or untyped array of values to set.
+     * @param offset The index in the current array at which the values are to be written.
+     */
+    set(array: ArrayLike<number>, offset?: number): void;
+
+    /**
+     * Returns a section of an array.
+     * @param start The beginning of the specified portion of the array.
+     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.
+     */
+    slice(start?: number, end?: number): Float64Array;
+
+    /**
+     * Determines whether the specified callback function returns true for any element of an array.
+     * @param predicate A function that accepts up to three arguments. The some method calls
+     * the predicate function for each element in the array until the predicate returns a value
+     * which is coercible to the Boolean value true, or until the end of the array.
+     * @param thisArg An object to which the this keyword can refer in the predicate function.
+     * If thisArg is omitted, undefined is used as the this value.
+     */
+    some(predicate: (value: number, index: number, array: Float64Array) => unknown, thisArg?: any): boolean;
+
+    /**
+     * Sorts an array.
+     * @param compareFn Function used to determine the order of the elements. It is expected to return
+     * a negative value if first argument is less than second argument, zero if they're equal and a positive
+     * value otherwise. If omitted, the elements are sorted in ascending order.
+     * \`\`\`ts
+     * [11,2,22,1].sort((a, b) => a - b)
+     * \`\`\`
+     */
+    sort(compareFn?: (a: number, b: number) => number): this;
+
+    /**
+     * at begin, inclusive, up to end, exclusive.
+     * @param begin The index of the beginning of the array.
+     * @param end The index of the end of the array.
+     */
+    subarray(begin?: number, end?: number): Float64Array;
+
+    toString(): string;
+
+    /** Returns the primitive value of the specified object. */
+    valueOf(): Float64Array;
+
+    [index: number]: number;
+}
+
+interface Float64ArrayConstructor {
+    readonly prototype: Float64Array;
+    new(length: number): Float64Array;
+    new(array: ArrayLike<number> | ArrayBufferLike): Float64Array;
+    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Float64Array;
+
+    /**
+     * The size in bytes of each element in the array.
+     */
+    readonly BYTES_PER_ELEMENT: number;
+
+    /**
+     * Returns a new array from a set of elements.
+     * @param items A set of elements to include in the new array object.
+     */
+    of(...items: number[]): Float64Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     */
+    from(arrayLike: ArrayLike<number>): Float64Array;
+
+    /**
+     * Creates an array from an array-like or iterable object.
+     * @param arrayLike An array-like or iterable object to convert to an array.
+     * @param mapfn A mapping function to call on every element of the array.
+     * @param thisArg Value of 'this' used to invoke the mapfn.
+     */
+    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Float64Array;
+
+}
+declare var Float64Array: Float64ArrayConstructor;
+
+/////////////////////////////
+/// ECMAScript Internationalization API
+/////////////////////////////
+
+declare namespace Intl {
+    interface CollatorOptions {
+        usage?: string | undefined;
+        localeMatcher?: string | undefined;
+        numeric?: boolean | undefined;
+        caseFirst?: string | undefined;
+        sensitivity?: string | undefined;
+        ignorePunctuation?: boolean | undefined;
+    }
+
+    interface ResolvedCollatorOptions {
+        locale: string;
+        usage: string;
+        sensitivity: string;
+        ignorePunctuation: boolean;
+        collation: string;
+        caseFirst: string;
+        numeric: boolean;
+    }
+
+    interface Collator {
+        compare(x: string, y: string): number;
+        resolvedOptions(): ResolvedCollatorOptions;
+    }
+    var Collator: {
+        new(locales?: string | string[], options?: CollatorOptions): Collator;
+        (locales?: string | string[], options?: CollatorOptions): Collator;
+        supportedLocalesOf(locales: string | string[], options?: CollatorOptions): string[];
+    };
+
+    interface NumberFormatOptions {
+        localeMatcher?: string | undefined;
+        style?: string | undefined;
+        currency?: string | undefined;
+        currencySign?: string | undefined;
+        useGrouping?: boolean | undefined;
+        minimumIntegerDigits?: number | undefined;
+        minimumFractionDigits?: number | undefined;
+        maximumFractionDigits?: number | undefined;
+        minimumSignificantDigits?: number | undefined;
+        maximumSignificantDigits?: number | undefined;
+    }
+
+    interface ResolvedNumberFormatOptions {
+        locale: string;
+        numberingSystem: string;
+        style: string;
+        currency?: string;
+        minimumIntegerDigits: number;
+        minimumFractionDigits: number;
+        maximumFractionDigits: number;
+        minimumSignificantDigits?: number;
+        maximumSignificantDigits?: number;
+        useGrouping: boolean;
+    }
+
+    interface NumberFormat {
+        format(value: number): string;
+        resolvedOptions(): ResolvedNumberFormatOptions;
+    }
+    var NumberFormat: {
+        new(locales?: string | string[], options?: NumberFormatOptions): NumberFormat;
+        (locales?: string | string[], options?: NumberFormatOptions): NumberFormat;
+        supportedLocalesOf(locales: string | string[], options?: NumberFormatOptions): string[];
+        readonly prototype: NumberFormat;
+    };
+
+    interface DateTimeFormatOptions {
+        localeMatcher?: "best fit" | "lookup" | undefined;
+        weekday?: "long" | "short" | "narrow" | undefined;
+        era?: "long" | "short" | "narrow" | undefined;
+        year?: "numeric" | "2-digit" | undefined;
+        month?: "numeric" | "2-digit" | "long" | "short" | "narrow" | undefined;
+        day?: "numeric" | "2-digit" | undefined;
+        hour?: "numeric" | "2-digit" | undefined;
+        minute?: "numeric" | "2-digit" | undefined;
+        second?: "numeric" | "2-digit" | undefined;
+        timeZoneName?: "short" | "long" | "shortOffset" | "longOffset" | "shortGeneric" | "longGeneric" | undefined;
+        formatMatcher?: "best fit" | "basic" | undefined;
+        hour12?: boolean | undefined;
+        timeZone?: string | undefined;
+    }
+
+    interface ResolvedDateTimeFormatOptions {
+        locale: string;
+        calendar: string;
+        numberingSystem: string;
+        timeZone: string;
+        hour12?: boolean;
+        weekday?: string;
+        era?: string;
+        year?: string;
+        month?: string;
+        day?: string;
+        hour?: string;
+        minute?: string;
+        second?: string;
+        timeZoneName?: string;
+    }
+
+    interface DateTimeFormat {
+        format(date?: Date | number): string;
+        resolvedOptions(): ResolvedDateTimeFormatOptions;
+    }
+    var DateTimeFormat: {
+        new(locales?: string | string[], options?: DateTimeFormatOptions): DateTimeFormat;
+        (locales?: string | string[], options?: DateTimeFormatOptions): DateTimeFormat;
+        supportedLocalesOf(locales: string | string[], options?: DateTimeFormatOptions): string[];
+        readonly prototype: DateTimeFormat;
+    };
+}
+
+interface String {
+    /**
+     * Determines whether two strings are equivalent in the current or specified locale.
+     * @param that String to compare to target string
+     * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used. This parameter must conform to BCP 47 standards; see the Intl.Collator object for details.
+     * @param options An object that contains one or more properties that specify comparison options. see the Intl.Collator object for details.
+     */
+    localeCompare(that: string, locales?: string | string[], options?: Intl.CollatorOptions): number;
+}
+
+interface Number {
+    /**
+     * Converts a number to a string by using the current or specified locale.
+     * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
+     * @param options An object that contains one or more properties that specify comparison options.
+     */
+    toLocaleString(locales?: string | string[], options?: Intl.NumberFormatOptions): string;
+}
+
+interface Date {
+    /**
+     * Converts a date and time to a string by using the current or specified locale.
+     * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
+     * @param options An object that contains one or more properties that specify comparison options.
+     */
+    toLocaleString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;
+    /**
+     * Converts a date to a string by using the current or specified locale.
+     * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
+     * @param options An object that contains one or more properties that specify comparison options.
+     */
+    toLocaleDateString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;
+
+    /**
+     * Converts a time to a string by using the current or specified locale.
+     * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
+     * @param options An object that contains one or more properties that specify comparison options.
+     */
+    toLocaleTimeString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;
+}
+`; $i["lib.es6.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2015" />
+/// <reference lib="dom" />
+/// <reference lib="dom.iterable" />
+/// <reference lib="webworker.importscripts" />
+/// <reference lib="scripthost" />
+`; $i["lib.esnext.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="es2023" />
+/// <reference lib="esnext.intl" />
+`; $i["lib.esnext.full.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/// <reference lib="esnext" />
+/// <reference lib="dom" />
+/// <reference lib="webworker.importscripts" />
+/// <reference lib="scripthost" />
+/// <reference lib="dom.iterable" />`; $i["lib.esnext.intl.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+declare namespace Intl {
+  interface NumberRangeFormatPart extends NumberFormatPart {
+    source: "startRange" | "endRange" | "shared"
+  }
+
+  interface NumberFormat {
+    formatRange(start: number | bigint, end: number | bigint): string;
+    formatRangeToParts(start: number | bigint, end: number | bigint): NumberRangeFormatPart[];
+  }
+}
+`; $i["lib.scripthost.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+
+
+/////////////////////////////
+/// Windows Script Host APIS
+/////////////////////////////
+
+
+interface ActiveXObject {
+    new (s: string): any;
+}
+declare var ActiveXObject: ActiveXObject;
+
+interface ITextWriter {
+    Write(s: string): void;
+    WriteLine(s: string): void;
+    Close(): void;
+}
+
+interface TextStreamBase {
+    /**
+     * The column number of the current character position in an input stream.
+     */
+    Column: number;
+
+    /**
+     * The current line number in an input stream.
+     */
+    Line: number;
+
+    /**
+     * Closes a text stream.
+     * It is not necessary to close standard streams; they close automatically when the process ends. If
+     * you close a standard stream, be aware that any other pointers to that standard stream become invalid.
+     */
+    Close(): void;
+}
+
+interface TextStreamWriter extends TextStreamBase {
+    /**
+     * Sends a string to an output stream.
+     */
+    Write(s: string): void;
+
+    /**
+     * Sends a specified number of blank lines (newline characters) to an output stream.
+     */
+    WriteBlankLines(intLines: number): void;
+
+    /**
+     * Sends a string followed by a newline character to an output stream.
+     */
+    WriteLine(s: string): void;
+}
+
+interface TextStreamReader extends TextStreamBase {
+    /**
+     * Returns a specified number of characters from an input stream, starting at the current pointer position.
+     * Does not return until the ENTER key is pressed.
+     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
+     */
+    Read(characters: number): string;
+
+    /**
+     * Returns all characters from an input stream.
+     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
+     */
+    ReadAll(): string;
+
+    /**
+     * Returns an entire line from an input stream.
+     * Although this method extracts the newline character, it does not add it to the returned string.
+     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
+     */
+    ReadLine(): string;
+
+    /**
+     * Skips a specified number of characters when reading from an input text stream.
+     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
+     * @param characters Positive number of characters to skip forward. (Backward skipping is not supported.)
+     */
+    Skip(characters: number): void;
+
+    /**
+     * Skips the next line when reading from an input text stream.
+     * Can only be used on a stream in reading mode, not writing or appending mode.
+     */
+    SkipLine(): void;
+
+    /**
+     * Indicates whether the stream pointer position is at the end of a line.
+     */
+    AtEndOfLine: boolean;
+
+    /**
+     * Indicates whether the stream pointer position is at the end of a stream.
+     */
+    AtEndOfStream: boolean;
+}
+
+declare var WScript: {
+    /**
+     * Outputs text to either a message box (under WScript.exe) or the command console window followed by
+     * a newline (under CScript.exe).
+     */
+    Echo(s: any): void;
+
+    /**
+     * Exposes the write-only error output stream for the current script.
+     * Can be accessed only while using CScript.exe.
+     */
+    StdErr: TextStreamWriter;
+
+    /**
+     * Exposes the write-only output stream for the current script.
+     * Can be accessed only while using CScript.exe.
+     */
+    StdOut: TextStreamWriter;
+    Arguments: { length: number; Item(n: number): string; };
+
+    /**
+     *  The full path of the currently running script.
+     */
+    ScriptFullName: string;
+
+    /**
+     * Forces the script to stop immediately, with an optional exit code.
+     */
+    Quit(exitCode?: number): number;
+
+    /**
+     * The Windows Script Host build version number.
+     */
+    BuildVersion: number;
+
+    /**
+     * Fully qualified path of the host executable.
+     */
+    FullName: string;
+
+    /**
+     * Gets/sets the script mode - interactive(true) or batch(false).
+     */
+    Interactive: boolean;
+
+    /**
+     * The name of the host executable (WScript.exe or CScript.exe).
+     */
+    Name: string;
+
+    /**
+     * Path of the directory containing the host executable.
+     */
+    Path: string;
+
+    /**
+     * The filename of the currently running script.
+     */
+    ScriptName: string;
+
+    /**
+     * Exposes the read-only input stream for the current script.
+     * Can be accessed only while using CScript.exe.
+     */
+    StdIn: TextStreamReader;
+
+    /**
+     * Windows Script Host version
+     */
+    Version: string;
+
+    /**
+     * Connects a COM object's event sources to functions named with a given prefix, in the form prefix_event.
+     */
+    ConnectObject(objEventSource: any, strPrefix: string): void;
+
+    /**
+     * Creates a COM object.
+     * @param strProgiID
+     * @param strPrefix Function names in the form prefix_event will be bound to this object's COM events.
+     */
+    CreateObject(strProgID: string, strPrefix?: string): any;
+
+    /**
+     * Disconnects a COM object from its event sources.
+     */
+    DisconnectObject(obj: any): void;
+
+    /**
+     * Retrieves an existing object with the specified ProgID from memory, or creates a new one from a file.
+     * @param strPathname Fully qualified path to the file containing the object persisted to disk.
+     *                       For objects in memory, pass a zero-length string.
+     * @param strProgID
+     * @param strPrefix Function names in the form prefix_event will be bound to this object's COM events.
+     */
+    GetObject(strPathname: string, strProgID?: string, strPrefix?: string): any;
+
+    /**
+     * Suspends script execution for a specified length of time, then continues execution.
+     * @param intTime Interval (in milliseconds) to suspend script execution.
+     */
+    Sleep(intTime: number): void;
+};
+
+/**
+ * WSH is an alias for WScript under Windows Script Host
+ */
+declare var WSH: typeof WScript;
+
+/**
+ * Represents an Automation SAFEARRAY
+ */
+declare class SafeArray<T = any> {
+    private constructor();
+    private SafeArray_typekey: SafeArray<T>;
+}
+
+/**
+ * Allows enumerating over a COM collection, which may not have indexed item access.
+ */
+interface Enumerator<T = any> {
+    /**
+     * Returns true if the current item is the last one in the collection, or the collection is empty,
+     * or the current item is undefined.
+     */
+    atEnd(): boolean;
+
+    /**
+     * Returns the current item in the collection
+     */
+    item(): T;
+
+    /**
+     * Resets the current item in the collection to the first item. If there are no items in the collection,
+     * the current item is set to undefined.
+     */
+    moveFirst(): void;
+
+    /**
+     * Moves the current item to the next item in the collection. If the enumerator is at the end of
+     * the collection or the collection is empty, the current item is set to undefined.
+     */
+    moveNext(): void;
+}
+
+interface EnumeratorConstructor {
+    new <T = any>(safearray: SafeArray<T>): Enumerator<T>;
+    new <T = any>(collection: { Item(index: any): T }): Enumerator<T>;
+    new <T = any>(collection: any): Enumerator<T>;
+}
+
+declare var Enumerator: EnumeratorConstructor;
+
+/**
+ * Enables reading from a COM safe array, which might have an alternate lower bound, or multiple dimensions.
+ */
+interface VBArray<T = any> {
+    /**
+     * Returns the number of dimensions (1-based).
+     */
+    dimensions(): number;
+
+    /**
+     * Takes an index for each dimension in the array, and returns the item at the corresponding location.
+     */
+    getItem(dimension1Index: number, ...dimensionNIndexes: number[]): T;
+
+    /**
+     * Returns the smallest available index for a given dimension.
+     * @param dimension 1-based dimension (defaults to 1)
+     */
+    lbound(dimension?: number): number;
+
+    /**
+     * Returns the largest available index for a given dimension.
+     * @param dimension 1-based dimension (defaults to 1)
+     */
+    ubound(dimension?: number): number;
+
+    /**
+     * Returns a Javascript array with all the elements in the VBArray. If there are multiple dimensions,
+     * each successive dimension is appended to the end of the array.
+     * Example: [[1,2,3],[4,5,6]] becomes [1,2,3,4,5,6]
+     */
+    toArray(): T[];
+}
+
+interface VBArrayConstructor {
+    new <T = any>(safeArray: SafeArray<T>): VBArray<T>;
+}
+
+declare var VBArray: VBArrayConstructor;
+
+/**
+ * Automation date (VT_DATE)
+ */
+declare class VarDate {
+    private constructor();
+    private VarDate_typekey: VarDate;
+}
+
+interface DateConstructor {
+    new (vd: VarDate): Date;
+}
+
+interface Date {
+    getVarDate: () => VarDate;
+}
+`; $i["lib.webworker.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/////////////////////////////
+/// Worker APIs
+/////////////////////////////
+
+interface AddEventListenerOptions extends EventListenerOptions {
+    once?: boolean;
+    passive?: boolean;
+    signal?: AbortSignal;
+}
+
+interface AesCbcParams extends Algorithm {
+    iv: BufferSource;
+}
+
+interface AesCtrParams extends Algorithm {
+    counter: BufferSource;
+    length: number;
+}
+
+interface AesDerivedKeyParams extends Algorithm {
+    length: number;
+}
+
+interface AesGcmParams extends Algorithm {
+    additionalData?: BufferSource;
+    iv: BufferSource;
+    tagLength?: number;
+}
+
+interface AesKeyAlgorithm extends KeyAlgorithm {
+    length: number;
+}
+
+interface AesKeyGenParams extends Algorithm {
+    length: number;
+}
+
+interface Algorithm {
+    name: string;
+}
+
+interface AudioConfiguration {
+    bitrate?: number;
+    channels?: string;
+    contentType: string;
+    samplerate?: number;
+    spatialRendering?: boolean;
+}
+
+interface BlobPropertyBag {
+    endings?: EndingType;
+    type?: string;
+}
+
+interface CacheQueryOptions {
+    ignoreMethod?: boolean;
+    ignoreSearch?: boolean;
+    ignoreVary?: boolean;
+}
+
+interface ClientQueryOptions {
+    includeUncontrolled?: boolean;
+    type?: ClientTypes;
+}
+
+interface CloseEventInit extends EventInit {
+    code?: number;
+    reason?: string;
+    wasClean?: boolean;
+}
+
+interface CryptoKeyPair {
+    privateKey: CryptoKey;
+    publicKey: CryptoKey;
+}
+
+interface CustomEventInit<T = any> extends EventInit {
+    detail?: T;
+}
+
+interface DOMMatrix2DInit {
+    a?: number;
+    b?: number;
+    c?: number;
+    d?: number;
+    e?: number;
+    f?: number;
+    m11?: number;
+    m12?: number;
+    m21?: number;
+    m22?: number;
+    m41?: number;
+    m42?: number;
+}
+
+interface DOMMatrixInit extends DOMMatrix2DInit {
+    is2D?: boolean;
+    m13?: number;
+    m14?: number;
+    m23?: number;
+    m24?: number;
+    m31?: number;
+    m32?: number;
+    m33?: number;
+    m34?: number;
+    m43?: number;
+    m44?: number;
+}
+
+interface DOMPointInit {
+    w?: number;
+    x?: number;
+    y?: number;
+    z?: number;
+}
+
+interface DOMQuadInit {
+    p1?: DOMPointInit;
+    p2?: DOMPointInit;
+    p3?: DOMPointInit;
+    p4?: DOMPointInit;
+}
+
+interface DOMRectInit {
+    height?: number;
+    width?: number;
+    x?: number;
+    y?: number;
+}
+
+interface EcKeyGenParams extends Algorithm {
+    namedCurve: NamedCurve;
+}
+
+interface EcKeyImportParams extends Algorithm {
+    namedCurve: NamedCurve;
+}
+
+interface EcdhKeyDeriveParams extends Algorithm {
+    public: CryptoKey;
+}
+
+interface EcdsaParams extends Algorithm {
+    hash: HashAlgorithmIdentifier;
+}
+
+interface ErrorEventInit extends EventInit {
+    colno?: number;
+    error?: any;
+    filename?: string;
+    lineno?: number;
+    message?: string;
+}
+
+interface EventInit {
+    bubbles?: boolean;
+    cancelable?: boolean;
+    composed?: boolean;
+}
+
+interface EventListenerOptions {
+    capture?: boolean;
+}
+
+interface EventSourceInit {
+    withCredentials?: boolean;
+}
+
+interface ExtendableEventInit extends EventInit {
+}
+
+interface ExtendableMessageEventInit extends ExtendableEventInit {
+    data?: any;
+    lastEventId?: string;
+    origin?: string;
+    ports?: MessagePort[];
+    source?: Client | ServiceWorker | MessagePort | null;
+}
+
+interface FetchEventInit extends ExtendableEventInit {
+    clientId?: string;
+    handled?: Promise<undefined>;
+    preloadResponse?: Promise<any>;
+    replacesClientId?: string;
+    request: Request;
+    resultingClientId?: string;
+}
+
+interface FilePropertyBag extends BlobPropertyBag {
+    lastModified?: number;
+}
+
+interface FileSystemGetDirectoryOptions {
+    create?: boolean;
+}
+
+interface FileSystemGetFileOptions {
+    create?: boolean;
+}
+
+interface FileSystemReadWriteOptions {
+    at?: number;
+}
+
+interface FileSystemRemoveOptions {
+    recursive?: boolean;
+}
+
+interface FontFaceDescriptors {
+    ascentOverride?: string;
+    descentOverride?: string;
+    display?: FontDisplay;
+    featureSettings?: string;
+    lineGapOverride?: string;
+    stretch?: string;
+    style?: string;
+    unicodeRange?: string;
+    variant?: string;
+    weight?: string;
+}
+
+interface FontFaceSetLoadEventInit extends EventInit {
+    fontfaces?: FontFace[];
+}
+
+interface GetNotificationOptions {
+    tag?: string;
+}
+
+interface HkdfParams extends Algorithm {
+    hash: HashAlgorithmIdentifier;
+    info: BufferSource;
+    salt: BufferSource;
+}
+
+interface HmacImportParams extends Algorithm {
+    hash: HashAlgorithmIdentifier;
+    length?: number;
+}
+
+interface HmacKeyGenParams extends Algorithm {
+    hash: HashAlgorithmIdentifier;
+    length?: number;
+}
+
+interface IDBDatabaseInfo {
+    name?: string;
+    version?: number;
+}
+
+interface IDBIndexParameters {
+    multiEntry?: boolean;
+    unique?: boolean;
+}
+
+interface IDBObjectStoreParameters {
+    autoIncrement?: boolean;
+    keyPath?: string | string[] | null;
+}
+
+interface IDBTransactionOptions {
+    durability?: IDBTransactionDurability;
+}
+
+interface IDBVersionChangeEventInit extends EventInit {
+    newVersion?: number | null;
+    oldVersion?: number;
+}
+
+interface ImageBitmapOptions {
+    colorSpaceConversion?: ColorSpaceConversion;
+    imageOrientation?: ImageOrientation;
+    premultiplyAlpha?: PremultiplyAlpha;
+    resizeHeight?: number;
+    resizeQuality?: ResizeQuality;
+    resizeWidth?: number;
+}
+
+interface ImageBitmapRenderingContextSettings {
+    alpha?: boolean;
+}
+
+interface ImageDataSettings {
+    colorSpace?: PredefinedColorSpace;
+}
+
+interface ImageEncodeOptions {
+    quality?: number;
+    type?: string;
+}
+
+interface ImportMeta {
+    url: string;
+}
+
+interface JsonWebKey {
+    alg?: string;
+    crv?: string;
+    d?: string;
+    dp?: string;
+    dq?: string;
+    e?: string;
+    ext?: boolean;
+    k?: string;
+    key_ops?: string[];
+    kty?: string;
+    n?: string;
+    oth?: RsaOtherPrimesInfo[];
+    p?: string;
+    q?: string;
+    qi?: string;
+    use?: string;
+    x?: string;
+    y?: string;
+}
+
+interface KeyAlgorithm {
+    name: string;
+}
+
+interface LockInfo {
+    clientId?: string;
+    mode?: LockMode;
+    name?: string;
+}
+
+interface LockManagerSnapshot {
+    held?: LockInfo[];
+    pending?: LockInfo[];
+}
+
+interface LockOptions {
+    ifAvailable?: boolean;
+    mode?: LockMode;
+    signal?: AbortSignal;
+    steal?: boolean;
+}
+
+interface MediaCapabilitiesDecodingInfo extends MediaCapabilitiesInfo {
+    configuration?: MediaDecodingConfiguration;
+}
+
+interface MediaCapabilitiesEncodingInfo extends MediaCapabilitiesInfo {
+    configuration?: MediaEncodingConfiguration;
+}
+
+interface MediaCapabilitiesInfo {
+    powerEfficient: boolean;
+    smooth: boolean;
+    supported: boolean;
+}
+
+interface MediaConfiguration {
+    audio?: AudioConfiguration;
+    video?: VideoConfiguration;
+}
+
+interface MediaDecodingConfiguration extends MediaConfiguration {
+    type: MediaDecodingType;
+}
+
+interface MediaEncodingConfiguration extends MediaConfiguration {
+    type: MediaEncodingType;
+}
+
+interface MessageEventInit<T = any> extends EventInit {
+    data?: T;
+    lastEventId?: string;
+    origin?: string;
+    ports?: MessagePort[];
+    source?: MessageEventSource | null;
+}
+
+interface MultiCacheQueryOptions extends CacheQueryOptions {
+    cacheName?: string;
+}
+
+interface NavigationPreloadState {
+    enabled?: boolean;
+    headerValue?: string;
+}
+
+interface NotificationAction {
+    action: string;
+    icon?: string;
+    title: string;
+}
+
+interface NotificationEventInit extends ExtendableEventInit {
+    action?: string;
+    notification: Notification;
+}
+
+interface NotificationOptions {
+    actions?: NotificationAction[];
+    badge?: string;
+    body?: string;
+    data?: any;
+    dir?: NotificationDirection;
+    icon?: string;
+    image?: string;
+    lang?: string;
+    renotify?: boolean;
+    requireInteraction?: boolean;
+    silent?: boolean;
+    tag?: string;
+    timestamp?: EpochTimeStamp;
+    vibrate?: VibratePattern;
+}
+
+interface Pbkdf2Params extends Algorithm {
+    hash: HashAlgorithmIdentifier;
+    iterations: number;
+    salt: BufferSource;
+}
+
+interface PerformanceMarkOptions {
+    detail?: any;
+    startTime?: DOMHighResTimeStamp;
+}
+
+interface PerformanceMeasureOptions {
+    detail?: any;
+    duration?: DOMHighResTimeStamp;
+    end?: string | DOMHighResTimeStamp;
+    start?: string | DOMHighResTimeStamp;
+}
+
+interface PerformanceObserverInit {
+    buffered?: boolean;
+    entryTypes?: string[];
+    type?: string;
+}
+
+interface PermissionDescriptor {
+    name: PermissionName;
+}
+
+interface ProgressEventInit extends EventInit {
+    lengthComputable?: boolean;
+    loaded?: number;
+    total?: number;
+}
+
+interface PromiseRejectionEventInit extends EventInit {
+    promise: Promise<any>;
+    reason?: any;
+}
+
+interface PushEventInit extends ExtendableEventInit {
+    data?: PushMessageDataInit;
+}
+
+interface PushSubscriptionJSON {
+    endpoint?: string;
+    expirationTime?: EpochTimeStamp | null;
+    keys?: Record<string, string>;
+}
+
+interface PushSubscriptionOptionsInit {
+    applicationServerKey?: BufferSource | string | null;
+    userVisibleOnly?: boolean;
+}
+
+interface QueuingStrategy<T = any> {
+    highWaterMark?: number;
+    size?: QueuingStrategySize<T>;
+}
+
+interface QueuingStrategyInit {
+    /**
+     * Creates a new ByteLengthQueuingStrategy with the provided high water mark.
+     *
+     * Note that the provided high water mark will not be validated ahead of time. Instead, if it is negative, NaN, or not a number, the resulting ByteLengthQueuingStrategy will cause the corresponding stream constructor to throw.
+     */
+    highWaterMark: number;
+}
+
+interface RTCEncodedAudioFrameMetadata {
+    contributingSources?: number[];
+    synchronizationSource?: number;
+}
+
+interface RTCEncodedVideoFrameMetadata {
+    contributingSources?: number[];
+    dependencies?: number[];
+    frameId?: number;
+    height?: number;
+    spatialIndex?: number;
+    synchronizationSource?: number;
+    temporalIndex?: number;
+    width?: number;
+}
+
+interface ReadableStreamGetReaderOptions {
+    /**
+     * Creates a ReadableStreamBYOBReader and locks the stream to the new reader.
+     *
+     * This call behaves the same way as the no-argument variant, except that it only works on readable byte streams, i.e. streams which were constructed specifically with the ability to handle "bring your own buffer" reading. The returned BYOB reader provides the ability to directly read individual chunks from the stream via its read() method, into developer-supplied buffers, allowing more precise control over allocation.
+     */
+    mode?: ReadableStreamReaderMode;
+}
+
+interface ReadableStreamReadDoneResult<T> {
+    done: true;
+    value?: T;
+}
+
+interface ReadableStreamReadValueResult<T> {
+    done: false;
+    value: T;
+}
+
+interface ReadableWritablePair<R = any, W = any> {
+    readable: ReadableStream<R>;
+    /**
+     * Provides a convenient, chainable way of piping this readable stream through a transform stream (or any other { writable, readable } pair). It simply pipes the stream into the writable side of the supplied pair, and returns the readable side for further use.
+     *
+     * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader.
+     */
+    writable: WritableStream<W>;
+}
+
+interface RegistrationOptions {
+    scope?: string;
+    type?: WorkerType;
+    updateViaCache?: ServiceWorkerUpdateViaCache;
+}
+
+interface RequestInit {
+    /** A BodyInit object or null to set request's body. */
+    body?: BodyInit | null;
+    /** A string indicating how the request will interact with the browser's cache to set request's cache. */
+    cache?: RequestCache;
+    /** A string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. Sets request's credentials. */
+    credentials?: RequestCredentials;
+    /** A Headers object, an object literal, or an array of two-item arrays to set request's headers. */
+    headers?: HeadersInit;
+    /** A cryptographic hash of the resource to be fetched by request. Sets request's integrity. */
+    integrity?: string;
+    /** A boolean to set request's keepalive. */
+    keepalive?: boolean;
+    /** A string to set request's method. */
+    method?: string;
+    /** A string to indicate whether the request will use CORS, or will be restricted to same-origin URLs. Sets request's mode. */
+    mode?: RequestMode;
+    /** A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. */
+    redirect?: RequestRedirect;
+    /** A string whose value is a same-origin URL, "about:client", or the empty string, to set request's referrer. */
+    referrer?: string;
+    /** A referrer policy to set request's referrerPolicy. */
+    referrerPolicy?: ReferrerPolicy;
+    /** An AbortSignal to set request's signal. */
+    signal?: AbortSignal | null;
+    /** Can only be null. Used to disassociate request from any Window. */
+    window?: null;
+}
+
+interface ResponseInit {
+    headers?: HeadersInit;
+    status?: number;
+    statusText?: string;
+}
+
+interface RsaHashedImportParams extends Algorithm {
+    hash: HashAlgorithmIdentifier;
+}
+
+interface RsaHashedKeyGenParams extends RsaKeyGenParams {
+    hash: HashAlgorithmIdentifier;
+}
+
+interface RsaKeyGenParams extends Algorithm {
+    modulusLength: number;
+    publicExponent: BigInteger;
+}
+
+interface RsaOaepParams extends Algorithm {
+    label?: BufferSource;
+}
+
+interface RsaOtherPrimesInfo {
+    d?: string;
+    r?: string;
+    t?: string;
+}
+
+interface RsaPssParams extends Algorithm {
+    saltLength: number;
+}
+
+interface SecurityPolicyViolationEventInit extends EventInit {
+    blockedURI?: string;
+    columnNumber?: number;
+    disposition: SecurityPolicyViolationEventDisposition;
+    documentURI: string;
+    effectiveDirective: string;
+    lineNumber?: number;
+    originalPolicy: string;
+    referrer?: string;
+    sample?: string;
+    sourceFile?: string;
+    statusCode: number;
+    violatedDirective: string;
+}
+
+interface StorageEstimate {
+    quota?: number;
+    usage?: number;
+}
+
+interface StreamPipeOptions {
+    preventAbort?: boolean;
+    preventCancel?: boolean;
+    /**
+     * Pipes this readable stream to a given writable stream destination. The way in which the piping process behaves under various error conditions can be customized with a number of passed options. It returns a promise that fulfills when the piping process completes successfully, or rejects if any errors were encountered.
+     *
+     * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader.
+     *
+     * Errors and closures of the source and destination streams propagate as follows:
+     *
+     * An error in this source readable stream will abort destination, unless preventAbort is truthy. The returned promise will be rejected with the source's error, or with any error that occurs during aborting the destination.
+     *
+     * An error in destination will cancel this source readable stream, unless preventCancel is truthy. The returned promise will be rejected with the destination's error, or with any error that occurs during canceling the source.
+     *
+     * When this source readable stream closes, destination will be closed, unless preventClose is truthy. The returned promise will be fulfilled once this process completes, unless an error is encountered while closing the destination, in which case it will be rejected with that error.
+     *
+     * If destination starts out closed or closing, this source readable stream will be canceled, unless preventCancel is true. The returned promise will be rejected with an error indicating piping to a closed stream failed, or with any error that occurs during canceling the source.
+     *
+     * The signal option can be set to an AbortSignal to allow aborting an ongoing pipe operation via the corresponding AbortController. In this case, this source readable stream will be canceled, and destination aborted, unless the respective options preventCancel or preventAbort are set.
+     */
+    preventClose?: boolean;
+    signal?: AbortSignal;
+}
+
+interface StructuredSerializeOptions {
+    transfer?: Transferable[];
+}
+
+interface TextDecodeOptions {
+    stream?: boolean;
+}
+
+interface TextDecoderOptions {
+    fatal?: boolean;
+    ignoreBOM?: boolean;
+}
+
+interface TextEncoderEncodeIntoResult {
+    read?: number;
+    written?: number;
+}
+
+interface Transformer<I = any, O = any> {
+    flush?: TransformerFlushCallback<O>;
+    readableType?: undefined;
+    start?: TransformerStartCallback<O>;
+    transform?: TransformerTransformCallback<I, O>;
+    writableType?: undefined;
+}
+
+interface UnderlyingByteSource {
+    autoAllocateChunkSize?: number;
+    cancel?: UnderlyingSourceCancelCallback;
+    pull?: (controller: ReadableByteStreamController) => void | PromiseLike<void>;
+    start?: (controller: ReadableByteStreamController) => any;
+    type: "bytes";
+}
+
+interface UnderlyingDefaultSource<R = any> {
+    cancel?: UnderlyingSourceCancelCallback;
+    pull?: (controller: ReadableStreamDefaultController<R>) => void | PromiseLike<void>;
+    start?: (controller: ReadableStreamDefaultController<R>) => any;
+    type?: undefined;
+}
+
+interface UnderlyingSink<W = any> {
+    abort?: UnderlyingSinkAbortCallback;
+    close?: UnderlyingSinkCloseCallback;
+    start?: UnderlyingSinkStartCallback;
+    type?: undefined;
+    write?: UnderlyingSinkWriteCallback<W>;
+}
+
+interface UnderlyingSource<R = any> {
+    autoAllocateChunkSize?: number;
+    cancel?: UnderlyingSourceCancelCallback;
+    pull?: UnderlyingSourcePullCallback<R>;
+    start?: UnderlyingSourceStartCallback<R>;
+    type?: ReadableStreamType;
+}
+
+interface VideoColorSpaceInit {
+    fullRange?: boolean | null;
+    matrix?: VideoMatrixCoefficients | null;
+    primaries?: VideoColorPrimaries | null;
+    transfer?: VideoTransferCharacteristics | null;
+}
+
+interface VideoConfiguration {
+    bitrate: number;
+    colorGamut?: ColorGamut;
+    contentType: string;
+    framerate: number;
+    hdrMetadataType?: HdrMetadataType;
+    height: number;
+    scalabilityMode?: string;
+    transferFunction?: TransferFunction;
+    width: number;
+}
+
+interface WebGLContextAttributes {
+    alpha?: boolean;
+    antialias?: boolean;
+    depth?: boolean;
+    desynchronized?: boolean;
+    failIfMajorPerformanceCaveat?: boolean;
+    powerPreference?: WebGLPowerPreference;
+    premultipliedAlpha?: boolean;
+    preserveDrawingBuffer?: boolean;
+    stencil?: boolean;
+}
+
+interface WebGLContextEventInit extends EventInit {
+    statusMessage?: string;
+}
+
+interface WorkerOptions {
+    credentials?: RequestCredentials;
+    name?: string;
+    type?: WorkerType;
+}
+
+/** The ANGLE_instanced_arrays extension is part of the WebGL API and allows to draw the same object, or groups of similar objects multiple times, if they share the same vertex data, primitive count and type. */
+interface ANGLE_instanced_arrays {
+    drawArraysInstancedANGLE(mode: GLenum, first: GLint, count: GLsizei, primcount: GLsizei): void;
+    drawElementsInstancedANGLE(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr, primcount: GLsizei): void;
+    vertexAttribDivisorANGLE(index: GLuint, divisor: GLuint): void;
+    readonly VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: 0x88FE;
+}
+
+/** A controller object that allows you to abort one or more DOM requests as and when desired. */
+interface AbortController {
+    /** Returns the AbortSignal object associated with this object. */
+    readonly signal: AbortSignal;
+    /** Invoking this method will set this object's AbortSignal's aborted flag and signal to any observers that the associated activity is to be aborted. */
+    abort(reason?: any): void;
+}
+
+declare var AbortController: {
+    prototype: AbortController;
+    new(): AbortController;
+};
+
+interface AbortSignalEventMap {
+    "abort": Event;
+}
+
+/** A signal object that allows you to communicate with a DOM request (such as a Fetch) and abort it if required via an AbortController object. */
+interface AbortSignal extends EventTarget {
+    /** Returns true if this AbortSignal's AbortController has signaled to abort, and false otherwise. */
+    readonly aborted: boolean;
+    onabort: ((this: AbortSignal, ev: Event) => any) | null;
+    readonly reason: any;
+    throwIfAborted(): void;
+    addEventListener<K extends keyof AbortSignalEventMap>(type: K, listener: (this: AbortSignal, ev: AbortSignalEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof AbortSignalEventMap>(type: K, listener: (this: AbortSignal, ev: AbortSignalEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var AbortSignal: {
+    prototype: AbortSignal;
+    new(): AbortSignal;
+    abort(reason?: any): AbortSignal;
+    timeout(milliseconds: number): AbortSignal;
+};
+
+interface AbstractWorkerEventMap {
+    "error": ErrorEvent;
+}
+
+interface AbstractWorker {
+    onerror: ((this: AbstractWorker, ev: ErrorEvent) => any) | null;
+    addEventListener<K extends keyof AbstractWorkerEventMap>(type: K, listener: (this: AbstractWorker, ev: AbstractWorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof AbstractWorkerEventMap>(type: K, listener: (this: AbstractWorker, ev: AbstractWorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+interface AnimationFrameProvider {
+    cancelAnimationFrame(handle: number): void;
+    requestAnimationFrame(callback: FrameRequestCallback): number;
+}
+
+/** A file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format. The File interface is based on Blob, inheriting blob functionality and expanding it to support files on the user's system. */
+interface Blob {
+    readonly size: number;
+    readonly type: string;
+    arrayBuffer(): Promise<ArrayBuffer>;
+    slice(start?: number, end?: number, contentType?: string): Blob;
+    stream(): ReadableStream<Uint8Array>;
+    text(): Promise<string>;
+}
+
+declare var Blob: {
+    prototype: Blob;
+    new(blobParts?: BlobPart[], options?: BlobPropertyBag): Blob;
+};
+
+interface Body {
+    readonly body: ReadableStream<Uint8Array> | null;
+    readonly bodyUsed: boolean;
+    arrayBuffer(): Promise<ArrayBuffer>;
+    blob(): Promise<Blob>;
+    formData(): Promise<FormData>;
+    json(): Promise<any>;
+    text(): Promise<string>;
+}
+
+interface BroadcastChannelEventMap {
+    "message": MessageEvent;
+    "messageerror": MessageEvent;
+}
+
+interface BroadcastChannel extends EventTarget {
+    /** Returns the channel name (as passed to the constructor). */
+    readonly name: string;
+    onmessage: ((this: BroadcastChannel, ev: MessageEvent) => any) | null;
+    onmessageerror: ((this: BroadcastChannel, ev: MessageEvent) => any) | null;
+    /** Closes the BroadcastChannel object, opening it up to garbage collection. */
+    close(): void;
+    /** Sends the given message to other BroadcastChannel objects set up for this channel. Messages can be structured objects, e.g. nested objects and arrays. */
+    postMessage(message: any): void;
+    addEventListener<K extends keyof BroadcastChannelEventMap>(type: K, listener: (this: BroadcastChannel, ev: BroadcastChannelEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof BroadcastChannelEventMap>(type: K, listener: (this: BroadcastChannel, ev: BroadcastChannelEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var BroadcastChannel: {
+    prototype: BroadcastChannel;
+    new(name: string): BroadcastChannel;
+};
+
+/** This Streams API interface provides\xA0a built-in byte length queuing strategy that can be used when constructing streams. */
+interface ByteLengthQueuingStrategy extends QueuingStrategy<ArrayBufferView> {
+    readonly highWaterMark: number;
+    readonly size: QueuingStrategySize<ArrayBufferView>;
+}
+
+declare var ByteLengthQueuingStrategy: {
+    prototype: ByteLengthQueuingStrategy;
+    new(init: QueuingStrategyInit): ByteLengthQueuingStrategy;
+};
+
+/**
+ * Provides a storage mechanism for Request / Response object pairs that are cached, for example as part of the ServiceWorker life cycle. Note that the Cache interface is exposed to windowed scopes as well as workers. You don't have to use it in conjunction with service workers, even though it is defined in the service worker spec.
+ * Available only in secure contexts.
+ */
+interface Cache {
+    add(request: RequestInfo | URL): Promise<void>;
+    addAll(requests: RequestInfo[]): Promise<void>;
+    delete(request: RequestInfo | URL, options?: CacheQueryOptions): Promise<boolean>;
+    keys(request?: RequestInfo | URL, options?: CacheQueryOptions): Promise<ReadonlyArray<Request>>;
+    match(request: RequestInfo | URL, options?: CacheQueryOptions): Promise<Response | undefined>;
+    matchAll(request?: RequestInfo | URL, options?: CacheQueryOptions): Promise<ReadonlyArray<Response>>;
+    put(request: RequestInfo | URL, response: Response): Promise<void>;
+}
+
+declare var Cache: {
+    prototype: Cache;
+    new(): Cache;
+};
+
+/**
+ * The storage for Cache objects.
+ * Available only in secure contexts.
+ */
+interface CacheStorage {
+    delete(cacheName: string): Promise<boolean>;
+    has(cacheName: string): Promise<boolean>;
+    keys(): Promise<string[]>;
+    match(request: RequestInfo | URL, options?: MultiCacheQueryOptions): Promise<Response | undefined>;
+    open(cacheName: string): Promise<Cache>;
+}
+
+declare var CacheStorage: {
+    prototype: CacheStorage;
+    new(): CacheStorage;
+};
+
+interface CanvasCompositing {
+    globalAlpha: number;
+    globalCompositeOperation: GlobalCompositeOperation;
+}
+
+interface CanvasDrawImage {
+    drawImage(image: CanvasImageSource, dx: number, dy: number): void;
+    drawImage(image: CanvasImageSource, dx: number, dy: number, dw: number, dh: number): void;
+    drawImage(image: CanvasImageSource, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): void;
+}
+
+interface CanvasDrawPath {
+    beginPath(): void;
+    clip(fillRule?: CanvasFillRule): void;
+    clip(path: Path2D, fillRule?: CanvasFillRule): void;
+    fill(fillRule?: CanvasFillRule): void;
+    fill(path: Path2D, fillRule?: CanvasFillRule): void;
+    isPointInPath(x: number, y: number, fillRule?: CanvasFillRule): boolean;
+    isPointInPath(path: Path2D, x: number, y: number, fillRule?: CanvasFillRule): boolean;
+    isPointInStroke(x: number, y: number): boolean;
+    isPointInStroke(path: Path2D, x: number, y: number): boolean;
+    stroke(): void;
+    stroke(path: Path2D): void;
+}
+
+interface CanvasFillStrokeStyles {
+    fillStyle: string | CanvasGradient | CanvasPattern;
+    strokeStyle: string | CanvasGradient | CanvasPattern;
+    createConicGradient(startAngle: number, x: number, y: number): CanvasGradient;
+    createLinearGradient(x0: number, y0: number, x1: number, y1: number): CanvasGradient;
+    createPattern(image: CanvasImageSource, repetition: string | null): CanvasPattern | null;
+    createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): CanvasGradient;
+}
+
+interface CanvasFilters {
+    filter: string;
+}
+
+/** An opaque object describing a gradient. It is returned by the methods CanvasRenderingContext2D.createLinearGradient() or CanvasRenderingContext2D.createRadialGradient(). */
+interface CanvasGradient {
+    /**
+     * Adds a color stop with the given color to the gradient at the given offset. 0.0 is the offset at one end of the gradient, 1.0 is the offset at the other end.
+     *
+     * Throws an "IndexSizeError" DOMException if the offset is out of range. Throws a "SyntaxError" DOMException if the color cannot be parsed.
+     */
+    addColorStop(offset: number, color: string): void;
+}
+
+declare var CanvasGradient: {
+    prototype: CanvasGradient;
+    new(): CanvasGradient;
+};
+
+interface CanvasImageData {
+    createImageData(sw: number, sh: number, settings?: ImageDataSettings): ImageData;
+    createImageData(imagedata: ImageData): ImageData;
+    getImageData(sx: number, sy: number, sw: number, sh: number, settings?: ImageDataSettings): ImageData;
+    putImageData(imagedata: ImageData, dx: number, dy: number): void;
+    putImageData(imagedata: ImageData, dx: number, dy: number, dirtyX: number, dirtyY: number, dirtyWidth: number, dirtyHeight: number): void;
+}
+
+interface CanvasImageSmoothing {
+    imageSmoothingEnabled: boolean;
+    imageSmoothingQuality: ImageSmoothingQuality;
+}
+
+interface CanvasPath {
+    arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void;
+    arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;
+    bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
+    closePath(): void;
+    ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void;
+    lineTo(x: number, y: number): void;
+    moveTo(x: number, y: number): void;
+    quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
+    rect(x: number, y: number, w: number, h: number): void;
+    roundRect(x: number, y: number, w: number, h: number, radii?: number | DOMPointInit | (number | DOMPointInit)[]): void;
+}
+
+interface CanvasPathDrawingStyles {
+    lineCap: CanvasLineCap;
+    lineDashOffset: number;
+    lineJoin: CanvasLineJoin;
+    lineWidth: number;
+    miterLimit: number;
+    getLineDash(): number[];
+    setLineDash(segments: number[]): void;
+}
+
+/** An opaque object describing a pattern, based on an image, a canvas, or a video, created by the CanvasRenderingContext2D.createPattern() method. */
+interface CanvasPattern {
+    /** Sets the transformation matrix that will be used when rendering the pattern during a fill or stroke painting operation. */
+    setTransform(transform?: DOMMatrix2DInit): void;
+}
+
+declare var CanvasPattern: {
+    prototype: CanvasPattern;
+    new(): CanvasPattern;
+};
+
+interface CanvasRect {
+    clearRect(x: number, y: number, w: number, h: number): void;
+    fillRect(x: number, y: number, w: number, h: number): void;
+    strokeRect(x: number, y: number, w: number, h: number): void;
+}
+
+interface CanvasShadowStyles {
+    shadowBlur: number;
+    shadowColor: string;
+    shadowOffsetX: number;
+    shadowOffsetY: number;
+}
+
+interface CanvasState {
+    restore(): void;
+    save(): void;
+}
+
+interface CanvasText {
+    fillText(text: string, x: number, y: number, maxWidth?: number): void;
+    measureText(text: string): TextMetrics;
+    strokeText(text: string, x: number, y: number, maxWidth?: number): void;
+}
+
+interface CanvasTextDrawingStyles {
+    direction: CanvasDirection;
+    font: string;
+    fontKerning: CanvasFontKerning;
+    textAlign: CanvasTextAlign;
+    textBaseline: CanvasTextBaseline;
+}
+
+interface CanvasTransform {
+    getTransform(): DOMMatrix;
+    resetTransform(): void;
+    rotate(angle: number): void;
+    scale(x: number, y: number): void;
+    setTransform(a: number, b: number, c: number, d: number, e: number, f: number): void;
+    setTransform(transform?: DOMMatrix2DInit): void;
+    transform(a: number, b: number, c: number, d: number, e: number, f: number): void;
+    translate(x: number, y: number): void;
+}
+
+/** The Client\xA0interface represents an executable context such as a Worker, or a SharedWorker. Window clients are represented by the more-specific\xA0WindowClient. You can get\xA0Client/WindowClient\xA0objects from methods such as Clients.matchAll() and\xA0Clients.get(). */
+interface Client {
+    readonly frameType: FrameType;
+    readonly id: string;
+    readonly type: ClientTypes;
+    readonly url: string;
+    postMessage(message: any, transfer: Transferable[]): void;
+    postMessage(message: any, options?: StructuredSerializeOptions): void;
+}
+
+declare var Client: {
+    prototype: Client;
+    new(): Client;
+};
+
+/** Provides access to\xA0Client\xA0objects. Access it\xA0via self.clients\xA0within a\xA0service worker. */
+interface Clients {
+    claim(): Promise<void>;
+    get(id: string): Promise<Client | undefined>;
+    matchAll<T extends ClientQueryOptions>(options?: T): Promise<ReadonlyArray<T["type"] extends "window" ? WindowClient : Client>>;
+    openWindow(url: string | URL): Promise<WindowClient | null>;
+}
+
+declare var Clients: {
+    prototype: Clients;
+    new(): Clients;
+};
+
+/** A CloseEvent is sent to clients using WebSockets when the connection is closed. This is delivered to the listener indicated by the WebSocket object's onclose attribute. */
+interface CloseEvent extends Event {
+    /** Returns the WebSocket connection close code provided by the server. */
+    readonly code: number;
+    /** Returns the WebSocket connection close reason provided by the server. */
+    readonly reason: string;
+    /** Returns true if the connection closed cleanly; false otherwise. */
+    readonly wasClean: boolean;
+}
+
+declare var CloseEvent: {
+    prototype: CloseEvent;
+    new(type: string, eventInitDict?: CloseEventInit): CloseEvent;
+};
+
+/** This Streams API interface provides\xA0a built-in byte length queuing strategy that can be used when constructing streams. */
+interface CountQueuingStrategy extends QueuingStrategy {
+    readonly highWaterMark: number;
+    readonly size: QueuingStrategySize;
+}
+
+declare var CountQueuingStrategy: {
+    prototype: CountQueuingStrategy;
+    new(init: QueuingStrategyInit): CountQueuingStrategy;
+};
+
+/** Basic cryptography features available in the current context. It allows access to a cryptographically strong random number generator and to cryptographic primitives. */
+interface Crypto {
+    /** Available only in secure contexts. */
+    readonly subtle: SubtleCrypto;
+    getRandomValues<T extends ArrayBufferView | null>(array: T): T;
+    /** Available only in secure contexts. */
+    randomUUID(): \`\${string}-\${string}-\${string}-\${string}-\${string}\`;
+}
+
+declare var Crypto: {
+    prototype: Crypto;
+    new(): Crypto;
+};
+
+/**
+ * The CryptoKey dictionary of the Web Crypto API represents a cryptographic key.
+ * Available only in secure contexts.
+ */
+interface CryptoKey {
+    readonly algorithm: KeyAlgorithm;
+    readonly extractable: boolean;
+    readonly type: KeyType;
+    readonly usages: KeyUsage[];
+}
+
+declare var CryptoKey: {
+    prototype: CryptoKey;
+    new(): CryptoKey;
+};
+
+interface CustomEvent<T = any> extends Event {
+    /** Returns any custom data event was created with. Typically used for synthetic events. */
+    readonly detail: T;
+    /** @deprecated */
+    initCustomEvent(type: string, bubbles?: boolean, cancelable?: boolean, detail?: T): void;
+}
+
+declare var CustomEvent: {
+    prototype: CustomEvent;
+    new<T>(type: string, eventInitDict?: CustomEventInit<T>): CustomEvent<T>;
+};
+
+/** An abnormal event (called an exception) which occurs as a result of calling a method or accessing a property of a web API. */
+interface DOMException extends Error {
+    /** @deprecated */
+    readonly code: number;
+    readonly message: string;
+    readonly name: string;
+    readonly INDEX_SIZE_ERR: 1;
+    readonly DOMSTRING_SIZE_ERR: 2;
+    readonly HIERARCHY_REQUEST_ERR: 3;
+    readonly WRONG_DOCUMENT_ERR: 4;
+    readonly INVALID_CHARACTER_ERR: 5;
+    readonly NO_DATA_ALLOWED_ERR: 6;
+    readonly NO_MODIFICATION_ALLOWED_ERR: 7;
+    readonly NOT_FOUND_ERR: 8;
+    readonly NOT_SUPPORTED_ERR: 9;
+    readonly INUSE_ATTRIBUTE_ERR: 10;
+    readonly INVALID_STATE_ERR: 11;
+    readonly SYNTAX_ERR: 12;
+    readonly INVALID_MODIFICATION_ERR: 13;
+    readonly NAMESPACE_ERR: 14;
+    readonly INVALID_ACCESS_ERR: 15;
+    readonly VALIDATION_ERR: 16;
+    readonly TYPE_MISMATCH_ERR: 17;
+    readonly SECURITY_ERR: 18;
+    readonly NETWORK_ERR: 19;
+    readonly ABORT_ERR: 20;
+    readonly URL_MISMATCH_ERR: 21;
+    readonly QUOTA_EXCEEDED_ERR: 22;
+    readonly TIMEOUT_ERR: 23;
+    readonly INVALID_NODE_TYPE_ERR: 24;
+    readonly DATA_CLONE_ERR: 25;
+}
+
+declare var DOMException: {
+    prototype: DOMException;
+    new(message?: string, name?: string): DOMException;
+    readonly INDEX_SIZE_ERR: 1;
+    readonly DOMSTRING_SIZE_ERR: 2;
+    readonly HIERARCHY_REQUEST_ERR: 3;
+    readonly WRONG_DOCUMENT_ERR: 4;
+    readonly INVALID_CHARACTER_ERR: 5;
+    readonly NO_DATA_ALLOWED_ERR: 6;
+    readonly NO_MODIFICATION_ALLOWED_ERR: 7;
+    readonly NOT_FOUND_ERR: 8;
+    readonly NOT_SUPPORTED_ERR: 9;
+    readonly INUSE_ATTRIBUTE_ERR: 10;
+    readonly INVALID_STATE_ERR: 11;
+    readonly SYNTAX_ERR: 12;
+    readonly INVALID_MODIFICATION_ERR: 13;
+    readonly NAMESPACE_ERR: 14;
+    readonly INVALID_ACCESS_ERR: 15;
+    readonly VALIDATION_ERR: 16;
+    readonly TYPE_MISMATCH_ERR: 17;
+    readonly SECURITY_ERR: 18;
+    readonly NETWORK_ERR: 19;
+    readonly ABORT_ERR: 20;
+    readonly URL_MISMATCH_ERR: 21;
+    readonly QUOTA_EXCEEDED_ERR: 22;
+    readonly TIMEOUT_ERR: 23;
+    readonly INVALID_NODE_TYPE_ERR: 24;
+    readonly DATA_CLONE_ERR: 25;
+};
+
+interface DOMMatrix extends DOMMatrixReadOnly {
+    a: number;
+    b: number;
+    c: number;
+    d: number;
+    e: number;
+    f: number;
+    m11: number;
+    m12: number;
+    m13: number;
+    m14: number;
+    m21: number;
+    m22: number;
+    m23: number;
+    m24: number;
+    m31: number;
+    m32: number;
+    m33: number;
+    m34: number;
+    m41: number;
+    m42: number;
+    m43: number;
+    m44: number;
+    invertSelf(): DOMMatrix;
+    multiplySelf(other?: DOMMatrixInit): DOMMatrix;
+    preMultiplySelf(other?: DOMMatrixInit): DOMMatrix;
+    rotateAxisAngleSelf(x?: number, y?: number, z?: number, angle?: number): DOMMatrix;
+    rotateFromVectorSelf(x?: number, y?: number): DOMMatrix;
+    rotateSelf(rotX?: number, rotY?: number, rotZ?: number): DOMMatrix;
+    scale3dSelf(scale?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
+    scaleSelf(scaleX?: number, scaleY?: number, scaleZ?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
+    skewXSelf(sx?: number): DOMMatrix;
+    skewYSelf(sy?: number): DOMMatrix;
+    translateSelf(tx?: number, ty?: number, tz?: number): DOMMatrix;
+}
+
+declare var DOMMatrix: {
+    prototype: DOMMatrix;
+    new(init?: string | number[]): DOMMatrix;
+    fromFloat32Array(array32: Float32Array): DOMMatrix;
+    fromFloat64Array(array64: Float64Array): DOMMatrix;
+    fromMatrix(other?: DOMMatrixInit): DOMMatrix;
+};
+
+interface DOMMatrixReadOnly {
+    readonly a: number;
+    readonly b: number;
+    readonly c: number;
+    readonly d: number;
+    readonly e: number;
+    readonly f: number;
+    readonly is2D: boolean;
+    readonly isIdentity: boolean;
+    readonly m11: number;
+    readonly m12: number;
+    readonly m13: number;
+    readonly m14: number;
+    readonly m21: number;
+    readonly m22: number;
+    readonly m23: number;
+    readonly m24: number;
+    readonly m31: number;
+    readonly m32: number;
+    readonly m33: number;
+    readonly m34: number;
+    readonly m41: number;
+    readonly m42: number;
+    readonly m43: number;
+    readonly m44: number;
+    flipX(): DOMMatrix;
+    flipY(): DOMMatrix;
+    inverse(): DOMMatrix;
+    multiply(other?: DOMMatrixInit): DOMMatrix;
+    rotate(rotX?: number, rotY?: number, rotZ?: number): DOMMatrix;
+    rotateAxisAngle(x?: number, y?: number, z?: number, angle?: number): DOMMatrix;
+    rotateFromVector(x?: number, y?: number): DOMMatrix;
+    scale(scaleX?: number, scaleY?: number, scaleZ?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
+    scale3d(scale?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
+    /** @deprecated */
+    scaleNonUniform(scaleX?: number, scaleY?: number): DOMMatrix;
+    skewX(sx?: number): DOMMatrix;
+    skewY(sy?: number): DOMMatrix;
+    toFloat32Array(): Float32Array;
+    toFloat64Array(): Float64Array;
+    toJSON(): any;
+    transformPoint(point?: DOMPointInit): DOMPoint;
+    translate(tx?: number, ty?: number, tz?: number): DOMMatrix;
+}
+
+declare var DOMMatrixReadOnly: {
+    prototype: DOMMatrixReadOnly;
+    new(init?: string | number[]): DOMMatrixReadOnly;
+    fromFloat32Array(array32: Float32Array): DOMMatrixReadOnly;
+    fromFloat64Array(array64: Float64Array): DOMMatrixReadOnly;
+    fromMatrix(other?: DOMMatrixInit): DOMMatrixReadOnly;
+};
+
+interface DOMPoint extends DOMPointReadOnly {
+    w: number;
+    x: number;
+    y: number;
+    z: number;
+}
+
+declare var DOMPoint: {
+    prototype: DOMPoint;
+    new(x?: number, y?: number, z?: number, w?: number): DOMPoint;
+    fromPoint(other?: DOMPointInit): DOMPoint;
+};
+
+interface DOMPointReadOnly {
+    readonly w: number;
+    readonly x: number;
+    readonly y: number;
+    readonly z: number;
+    matrixTransform(matrix?: DOMMatrixInit): DOMPoint;
+    toJSON(): any;
+}
+
+declare var DOMPointReadOnly: {
+    prototype: DOMPointReadOnly;
+    new(x?: number, y?: number, z?: number, w?: number): DOMPointReadOnly;
+    fromPoint(other?: DOMPointInit): DOMPointReadOnly;
+};
+
+interface DOMQuad {
+    readonly p1: DOMPoint;
+    readonly p2: DOMPoint;
+    readonly p3: DOMPoint;
+    readonly p4: DOMPoint;
+    getBounds(): DOMRect;
+    toJSON(): any;
+}
+
+declare var DOMQuad: {
+    prototype: DOMQuad;
+    new(p1?: DOMPointInit, p2?: DOMPointInit, p3?: DOMPointInit, p4?: DOMPointInit): DOMQuad;
+    fromQuad(other?: DOMQuadInit): DOMQuad;
+    fromRect(other?: DOMRectInit): DOMQuad;
+};
+
+interface DOMRect extends DOMRectReadOnly {
+    height: number;
+    width: number;
+    x: number;
+    y: number;
+}
+
+declare var DOMRect: {
+    prototype: DOMRect;
+    new(x?: number, y?: number, width?: number, height?: number): DOMRect;
+    fromRect(other?: DOMRectInit): DOMRect;
+};
+
+interface DOMRectReadOnly {
+    readonly bottom: number;
+    readonly height: number;
+    readonly left: number;
+    readonly right: number;
+    readonly top: number;
+    readonly width: number;
+    readonly x: number;
+    readonly y: number;
+    toJSON(): any;
+}
+
+declare var DOMRectReadOnly: {
+    prototype: DOMRectReadOnly;
+    new(x?: number, y?: number, width?: number, height?: number): DOMRectReadOnly;
+    fromRect(other?: DOMRectInit): DOMRectReadOnly;
+};
+
+/** A type returned by some APIs which contains a list of DOMString (strings). */
+interface DOMStringList {
+    /** Returns the number of strings in strings. */
+    readonly length: number;
+    /** Returns true if strings contains string, and false otherwise. */
+    contains(string: string): boolean;
+    /** Returns the string with index index from strings. */
+    item(index: number): string | null;
+    [index: number]: string;
+}
+
+declare var DOMStringList: {
+    prototype: DOMStringList;
+    new(): DOMStringList;
+};
+
+interface DedicatedWorkerGlobalScopeEventMap extends WorkerGlobalScopeEventMap {
+    "message": MessageEvent;
+    "messageerror": MessageEvent;
+}
+
+/** (the Worker global scope) is accessible through the self keyword. Some additional global functions, namespaces objects, and constructors, not typically associated with the worker global scope, but available on it, are listed in the JavaScript Reference. See also: Functions available to workers. */
+interface DedicatedWorkerGlobalScope extends WorkerGlobalScope, AnimationFrameProvider {
+    /** Returns dedicatedWorkerGlobal's name, i.e. the value given to the Worker constructor. Primarily useful for debugging. */
+    readonly name: string;
+    onmessage: ((this: DedicatedWorkerGlobalScope, ev: MessageEvent) => any) | null;
+    onmessageerror: ((this: DedicatedWorkerGlobalScope, ev: MessageEvent) => any) | null;
+    /** Aborts dedicatedWorkerGlobal. */
+    close(): void;
+    /** Clones message and transmits it to the Worker object associated with dedicatedWorkerGlobal. transfer can be passed as a list of objects that are to be transferred rather than cloned. */
+    postMessage(message: any, transfer: Transferable[]): void;
+    postMessage(message: any, options?: StructuredSerializeOptions): void;
+    addEventListener<K extends keyof DedicatedWorkerGlobalScopeEventMap>(type: K, listener: (this: DedicatedWorkerGlobalScope, ev: DedicatedWorkerGlobalScopeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof DedicatedWorkerGlobalScopeEventMap>(type: K, listener: (this: DedicatedWorkerGlobalScope, ev: DedicatedWorkerGlobalScopeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var DedicatedWorkerGlobalScope: {
+    prototype: DedicatedWorkerGlobalScope;
+    new(): DedicatedWorkerGlobalScope;
+};
+
+interface EXT_blend_minmax {
+    readonly MIN_EXT: 0x8007;
+    readonly MAX_EXT: 0x8008;
+}
+
+interface EXT_color_buffer_float {
+}
+
+interface EXT_color_buffer_half_float {
+    readonly RGBA16F_EXT: 0x881A;
+    readonly RGB16F_EXT: 0x881B;
+    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: 0x8211;
+    readonly UNSIGNED_NORMALIZED_EXT: 0x8C17;
+}
+
+interface EXT_float_blend {
+}
+
+/** The EXT_frag_depth extension is part of the WebGL API and enables to set a depth value of a fragment from within the fragment shader. */
+interface EXT_frag_depth {
+}
+
+interface EXT_sRGB {
+    readonly SRGB_EXT: 0x8C40;
+    readonly SRGB_ALPHA_EXT: 0x8C42;
+    readonly SRGB8_ALPHA8_EXT: 0x8C43;
+    readonly FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: 0x8210;
+}
+
+interface EXT_shader_texture_lod {
+}
+
+interface EXT_texture_compression_bptc {
+    readonly COMPRESSED_RGBA_BPTC_UNORM_EXT: 0x8E8C;
+    readonly COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT: 0x8E8D;
+    readonly COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT: 0x8E8E;
+    readonly COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT: 0x8E8F;
+}
+
+interface EXT_texture_compression_rgtc {
+    readonly COMPRESSED_RED_RGTC1_EXT: 0x8DBB;
+    readonly COMPRESSED_SIGNED_RED_RGTC1_EXT: 0x8DBC;
+    readonly COMPRESSED_RED_GREEN_RGTC2_EXT: 0x8DBD;
+    readonly COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT: 0x8DBE;
+}
+
+/** The EXT_texture_filter_anisotropic extension is part of the WebGL API and exposes two constants for anisotropic filtering (AF). */
+interface EXT_texture_filter_anisotropic {
+    readonly TEXTURE_MAX_ANISOTROPY_EXT: 0x84FE;
+    readonly MAX_TEXTURE_MAX_ANISOTROPY_EXT: 0x84FF;
+}
+
+interface EXT_texture_norm16 {
+    readonly R16_EXT: 0x822A;
+    readonly RG16_EXT: 0x822C;
+    readonly RGB16_EXT: 0x8054;
+    readonly RGBA16_EXT: 0x805B;
+    readonly R16_SNORM_EXT: 0x8F98;
+    readonly RG16_SNORM_EXT: 0x8F99;
+    readonly RGB16_SNORM_EXT: 0x8F9A;
+    readonly RGBA16_SNORM_EXT: 0x8F9B;
+}
+
+/** Events providing information related to errors in scripts or in files. */
+interface ErrorEvent extends Event {
+    readonly colno: number;
+    readonly error: any;
+    readonly filename: string;
+    readonly lineno: number;
+    readonly message: string;
+}
+
+declare var ErrorEvent: {
+    prototype: ErrorEvent;
+    new(type: string, eventInitDict?: ErrorEventInit): ErrorEvent;
+};
+
+/** An event which takes place in the DOM. */
+interface Event {
+    /** Returns true or false depending on how event was initialized. True if event goes through its target's ancestors in reverse tree order, and false otherwise. */
+    readonly bubbles: boolean;
+    /** @deprecated */
+    cancelBubble: boolean;
+    /** Returns true or false depending on how event was initialized. Its return value does not always carry meaning, but true can indicate that part of the operation during which event was dispatched, can be canceled by invoking the preventDefault() method. */
+    readonly cancelable: boolean;
+    /** Returns true or false depending on how event was initialized. True if event invokes listeners past a ShadowRoot node that is the root of its target, and false otherwise. */
+    readonly composed: boolean;
+    /** Returns the object whose event listener's callback is currently being invoked. */
+    readonly currentTarget: EventTarget | null;
+    /** Returns true if preventDefault() was invoked successfully to indicate cancelation, and false otherwise. */
+    readonly defaultPrevented: boolean;
+    /** Returns the event's phase, which is one of NONE, CAPTURING_PHASE, AT_TARGET, and BUBBLING_PHASE. */
+    readonly eventPhase: number;
+    /** Returns true if event was dispatched by the user agent, and false otherwise. */
+    readonly isTrusted: boolean;
+    /** @deprecated */
+    returnValue: boolean;
+    /** @deprecated */
+    readonly srcElement: EventTarget | null;
+    /** Returns the object to which event is dispatched (its target). */
+    readonly target: EventTarget | null;
+    /** Returns the event's timestamp as the number of milliseconds measured relative to the time origin. */
+    readonly timeStamp: DOMHighResTimeStamp;
+    /** Returns the type of event, e.g. "click", "hashchange", or "submit". */
+    readonly type: string;
+    /** Returns the invocation target objects of event's path (objects on which listeners will be invoked), except for any nodes in shadow trees of which the shadow root's mode is "closed" that are not reachable from event's currentTarget. */
+    composedPath(): EventTarget[];
+    /** @deprecated */
+    initEvent(type: string, bubbles?: boolean, cancelable?: boolean): void;
+    /** If invoked when the cancelable attribute value is true, and while executing a listener for the event with passive set to false, signals to the operation that caused event to be dispatched that it needs to be canceled. */
+    preventDefault(): void;
+    /** Invoking this method prevents event from reaching any registered event listeners after the current one finishes running and, when dispatched in a tree, also prevents event from reaching any other objects. */
+    stopImmediatePropagation(): void;
+    /** When dispatched in a tree, invoking this method prevents event from reaching any objects other than the current object. */
+    stopPropagation(): void;
+    readonly NONE: 0;
+    readonly CAPTURING_PHASE: 1;
+    readonly AT_TARGET: 2;
+    readonly BUBBLING_PHASE: 3;
+}
+
+declare var Event: {
+    prototype: Event;
+    new(type: string, eventInitDict?: EventInit): Event;
+    readonly NONE: 0;
+    readonly CAPTURING_PHASE: 1;
+    readonly AT_TARGET: 2;
+    readonly BUBBLING_PHASE: 3;
+};
+
+interface EventListener {
+    (evt: Event): void;
+}
+
+interface EventListenerObject {
+    handleEvent(object: Event): void;
+}
+
+interface EventSourceEventMap {
+    "error": Event;
+    "message": MessageEvent;
+    "open": Event;
+}
+
+interface EventSource extends EventTarget {
+    onerror: ((this: EventSource, ev: Event) => any) | null;
+    onmessage: ((this: EventSource, ev: MessageEvent) => any) | null;
+    onopen: ((this: EventSource, ev: Event) => any) | null;
+    /** Returns the state of this EventSource object's connection. It can have the values described below. */
+    readonly readyState: number;
+    /** Returns the URL providing the event stream. */
+    readonly url: string;
+    /** Returns true if the credentials mode for connection requests to the URL providing the event stream is set to "include", and false otherwise. */
+    readonly withCredentials: boolean;
+    /** Aborts any instances of the fetch algorithm started for this EventSource object, and sets the readyState attribute to CLOSED. */
+    close(): void;
+    readonly CONNECTING: 0;
+    readonly OPEN: 1;
+    readonly CLOSED: 2;
+    addEventListener<K extends keyof EventSourceEventMap>(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof EventSourceEventMap>(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var EventSource: {
+    prototype: EventSource;
+    new(url: string | URL, eventSourceInitDict?: EventSourceInit): EventSource;
+    readonly CONNECTING: 0;
+    readonly OPEN: 1;
+    readonly CLOSED: 2;
+};
+
+/** EventTarget is a DOM interface implemented by objects that can receive events and may have listeners for them. */
+interface EventTarget {
+    /**
+     * Appends an event listener for events whose type attribute value is type. The callback argument sets the callback that will be invoked when the event is dispatched.
+     *
+     * The options argument sets listener-specific options. For compatibility this can be a boolean, in which case the method behaves exactly as if the value was specified as options's capture.
+     *
+     * When set to true, options's capture prevents callback from being invoked when the event's eventPhase attribute value is BUBBLING_PHASE. When false (or not present), callback will not be invoked when event's eventPhase attribute value is CAPTURING_PHASE. Either way, callback will be invoked if event's eventPhase attribute value is AT_TARGET.
+     *
+     * When set to true, options's passive indicates that the callback will not cancel the event by invoking preventDefault(). This is used to enable performance optimizations described in \xA7 2.8 Observing event listeners.
+     *
+     * When set to true, options's once indicates that the callback will only be invoked once after which the event listener will be removed.
+     *
+     * If an AbortSignal is passed for options's signal, then the event listener will be removed when signal is aborted.
+     *
+     * The event listener is appended to target's event listener list and is not appended if it has the same type, callback, and capture.
+     */
+    addEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: AddEventListenerOptions | boolean): void;
+    /** Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. */
+    dispatchEvent(event: Event): boolean;
+    /** Removes the event listener in target's event listener list with the same type, callback, and options. */
+    removeEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void;
+}
+
+declare var EventTarget: {
+    prototype: EventTarget;
+    new(): EventTarget;
+};
+
+/** Extends the lifetime of the install and activate events dispatched on the global scope as part of the service worker lifecycle. This ensures that any functional events (like FetchEvent) are not dispatched until it upgrades database schemas and deletes the outdated cache entries. */
+interface ExtendableEvent extends Event {
+    waitUntil(f: Promise<any>): void;
+}
+
+declare var ExtendableEvent: {
+    prototype: ExtendableEvent;
+    new(type: string, eventInitDict?: ExtendableEventInit): ExtendableEvent;
+};
+
+/** This ServiceWorker API interface represents the event object of a message event fired on a service worker (when a channel message is received on the ServiceWorkerGlobalScope from another context) \u2014 extends the lifetime of such events. */
+interface ExtendableMessageEvent extends ExtendableEvent {
+    readonly data: any;
+    readonly lastEventId: string;
+    readonly origin: string;
+    readonly ports: ReadonlyArray<MessagePort>;
+    readonly source: Client | ServiceWorker | MessagePort | null;
+}
+
+declare var ExtendableMessageEvent: {
+    prototype: ExtendableMessageEvent;
+    new(type: string, eventInitDict?: ExtendableMessageEventInit): ExtendableMessageEvent;
+};
+
+/** This is the event type for fetch\xA0events dispatched on the\xA0service worker global scope. It contains information about the fetch, including the\xA0request and how the receiver will treat the response. It provides the event.respondWith() method, which allows us to provide a response to this fetch. */
+interface FetchEvent extends ExtendableEvent {
+    readonly clientId: string;
+    readonly handled: Promise<undefined>;
+    readonly preloadResponse: Promise<any>;
+    readonly request: Request;
+    readonly resultingClientId: string;
+    respondWith(r: Response | PromiseLike<Response>): void;
+}
+
+declare var FetchEvent: {
+    prototype: FetchEvent;
+    new(type: string, eventInitDict: FetchEventInit): FetchEvent;
+};
+
+/** Provides information about files and allows JavaScript in a web page to access their content. */
+interface File extends Blob {
+    readonly lastModified: number;
+    readonly name: string;
+    readonly webkitRelativePath: string;
+}
+
+declare var File: {
+    prototype: File;
+    new(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag): File;
+};
+
+/** An object of this type is returned by the files property of the HTML <input> element; this lets you access the list of files selected with the <input type="file"> element. It's also used for a list of files dropped into web content when using the drag and drop API; see the DataTransfer object for details on this usage. */
+interface FileList {
+    readonly length: number;
+    item(index: number): File | null;
+    [index: number]: File;
+}
+
+declare var FileList: {
+    prototype: FileList;
+    new(): FileList;
+};
+
+interface FileReaderEventMap {
+    "abort": ProgressEvent<FileReader>;
+    "error": ProgressEvent<FileReader>;
+    "load": ProgressEvent<FileReader>;
+    "loadend": ProgressEvent<FileReader>;
+    "loadstart": ProgressEvent<FileReader>;
+    "progress": ProgressEvent<FileReader>;
+}
+
+/** Lets web applications asynchronously read the contents of files (or raw data buffers) stored on the user's computer, using File or Blob objects to specify the file or data to read. */
+interface FileReader extends EventTarget {
+    readonly error: DOMException | null;
+    onabort: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
+    onerror: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
+    onload: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
+    onloadend: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
+    onloadstart: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
+    onprogress: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
+    readonly readyState: typeof FileReader.EMPTY | typeof FileReader.LOADING | typeof FileReader.DONE;
+    readonly result: string | ArrayBuffer | null;
+    abort(): void;
+    readAsArrayBuffer(blob: Blob): void;
+    readAsBinaryString(blob: Blob): void;
+    readAsDataURL(blob: Blob): void;
+    readAsText(blob: Blob, encoding?: string): void;
+    readonly EMPTY: 0;
+    readonly LOADING: 1;
+    readonly DONE: 2;
+    addEventListener<K extends keyof FileReaderEventMap>(type: K, listener: (this: FileReader, ev: FileReaderEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof FileReaderEventMap>(type: K, listener: (this: FileReader, ev: FileReaderEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var FileReader: {
+    prototype: FileReader;
+    new(): FileReader;
+    readonly EMPTY: 0;
+    readonly LOADING: 1;
+    readonly DONE: 2;
+};
+
+/** Allows to read File or Blob objects in a synchronous way. */
+interface FileReaderSync {
+    readAsArrayBuffer(blob: Blob): ArrayBuffer;
+    /** @deprecated */
+    readAsBinaryString(blob: Blob): string;
+    readAsDataURL(blob: Blob): string;
+    readAsText(blob: Blob, encoding?: string): string;
+}
+
+declare var FileReaderSync: {
+    prototype: FileReaderSync;
+    new(): FileReaderSync;
+};
+
+/** Available only in secure contexts. */
+interface FileSystemDirectoryHandle extends FileSystemHandle {
+    readonly kind: "directory";
+    getDirectoryHandle(name: string, options?: FileSystemGetDirectoryOptions): Promise<FileSystemDirectoryHandle>;
+    getFileHandle(name: string, options?: FileSystemGetFileOptions): Promise<FileSystemFileHandle>;
+    removeEntry(name: string, options?: FileSystemRemoveOptions): Promise<void>;
+    resolve(possibleDescendant: FileSystemHandle): Promise<string[] | null>;
+}
+
+declare var FileSystemDirectoryHandle: {
+    prototype: FileSystemDirectoryHandle;
+    new(): FileSystemDirectoryHandle;
+};
+
+/** Available only in secure contexts. */
+interface FileSystemFileHandle extends FileSystemHandle {
+    readonly kind: "file";
+    createSyncAccessHandle(): Promise<FileSystemSyncAccessHandle>;
+    getFile(): Promise<File>;
+}
+
+declare var FileSystemFileHandle: {
+    prototype: FileSystemFileHandle;
+    new(): FileSystemFileHandle;
+};
+
+/** Available only in secure contexts. */
+interface FileSystemHandle {
+    readonly kind: FileSystemHandleKind;
+    readonly name: string;
+    isSameEntry(other: FileSystemHandle): Promise<boolean>;
+}
+
+declare var FileSystemHandle: {
+    prototype: FileSystemHandle;
+    new(): FileSystemHandle;
+};
+
+/** Available only in secure contexts. */
+interface FileSystemSyncAccessHandle {
+    close(): void;
+    flush(): void;
+    getSize(): number;
+    read(buffer: BufferSource, options?: FileSystemReadWriteOptions): number;
+    truncate(newSize: number): void;
+    write(buffer: BufferSource, options?: FileSystemReadWriteOptions): number;
+}
+
+declare var FileSystemSyncAccessHandle: {
+    prototype: FileSystemSyncAccessHandle;
+    new(): FileSystemSyncAccessHandle;
+};
+
+interface FontFace {
+    ascentOverride: string;
+    descentOverride: string;
+    display: FontDisplay;
+    family: string;
+    featureSettings: string;
+    lineGapOverride: string;
+    readonly loaded: Promise<FontFace>;
+    readonly status: FontFaceLoadStatus;
+    stretch: string;
+    style: string;
+    unicodeRange: string;
+    variant: string;
+    weight: string;
+    load(): Promise<FontFace>;
+}
+
+declare var FontFace: {
+    prototype: FontFace;
+    new(family: string, source: string | BinaryData, descriptors?: FontFaceDescriptors): FontFace;
+};
+
+interface FontFaceSetEventMap {
+    "loading": Event;
+    "loadingdone": Event;
+    "loadingerror": Event;
+}
+
+interface FontFaceSet extends EventTarget {
+    onloading: ((this: FontFaceSet, ev: Event) => any) | null;
+    onloadingdone: ((this: FontFaceSet, ev: Event) => any) | null;
+    onloadingerror: ((this: FontFaceSet, ev: Event) => any) | null;
+    readonly ready: Promise<FontFaceSet>;
+    readonly status: FontFaceSetLoadStatus;
+    check(font: string, text?: string): boolean;
+    load(font: string, text?: string): Promise<FontFace[]>;
+    forEach(callbackfn: (value: FontFace, key: FontFace, parent: FontFaceSet) => void, thisArg?: any): void;
+    addEventListener<K extends keyof FontFaceSetEventMap>(type: K, listener: (this: FontFaceSet, ev: FontFaceSetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof FontFaceSetEventMap>(type: K, listener: (this: FontFaceSet, ev: FontFaceSetEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var FontFaceSet: {
+    prototype: FontFaceSet;
+    new(initialFaces: FontFace[]): FontFaceSet;
+};
+
+interface FontFaceSetLoadEvent extends Event {
+    readonly fontfaces: ReadonlyArray<FontFace>;
+}
+
+declare var FontFaceSetLoadEvent: {
+    prototype: FontFaceSetLoadEvent;
+    new(type: string, eventInitDict?: FontFaceSetLoadEventInit): FontFaceSetLoadEvent;
+};
+
+interface FontFaceSource {
+    readonly fonts: FontFaceSet;
+}
+
+/** Provides a way to easily construct a set of key/value pairs representing form fields and their values, which can then be easily sent using the XMLHttpRequest.send() method. It uses the same format a form would use if the encoding type were set to "multipart/form-data". */
+interface FormData {
+    append(name: string, value: string | Blob, fileName?: string): void;
+    delete(name: string): void;
+    get(name: string): FormDataEntryValue | null;
+    getAll(name: string): FormDataEntryValue[];
+    has(name: string): boolean;
+    set(name: string, value: string | Blob, fileName?: string): void;
+    forEach(callbackfn: (value: FormDataEntryValue, key: string, parent: FormData) => void, thisArg?: any): void;
+}
+
+declare var FormData: {
+    prototype: FormData;
+    new(): FormData;
+};
+
+interface GenericTransformStream {
+    readonly readable: ReadableStream;
+    readonly writable: WritableStream;
+}
+
+/** This Fetch API interface allows you to perform various actions on HTTP request and response headers. These actions include retrieving, setting, adding to, and removing. A Headers object has an associated header list, which is initially empty and consists\xA0of zero or more name and value pairs. \xA0You can add to this using methods like append() (see Examples.)\xA0In all methods of this interface, header names are matched by case-insensitive byte sequence. */
+interface Headers {
+    append(name: string, value: string): void;
+    delete(name: string): void;
+    get(name: string): string | null;
+    has(name: string): boolean;
+    set(name: string, value: string): void;
+    forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: any): void;
+}
+
+declare var Headers: {
+    prototype: Headers;
+    new(init?: HeadersInit): Headers;
+};
+
+/** This IndexedDB API interface represents a cursor for traversing or iterating over multiple records in a database. */
+interface IDBCursor {
+    /** Returns the direction ("next", "nextunique", "prev" or "prevunique") of the cursor. */
+    readonly direction: IDBCursorDirection;
+    /** Returns the key of the cursor. Throws a "InvalidStateError" DOMException if the cursor is advancing or is finished. */
+    readonly key: IDBValidKey;
+    /** Returns the effective key of the cursor. Throws a "InvalidStateError" DOMException if the cursor is advancing or is finished. */
+    readonly primaryKey: IDBValidKey;
+    readonly request: IDBRequest;
+    /** Returns the IDBObjectStore or IDBIndex the cursor was opened from. */
+    readonly source: IDBObjectStore | IDBIndex;
+    /** Advances the cursor through the next count records in range. */
+    advance(count: number): void;
+    /** Advances the cursor to the next record in range. */
+    continue(key?: IDBValidKey): void;
+    /** Advances the cursor to the next record in range matching or after key and primaryKey. Throws an "InvalidAccessError" DOMException if the source is not an index. */
+    continuePrimaryKey(key: IDBValidKey, primaryKey: IDBValidKey): void;
+    /**
+     * Delete the record pointed at by the cursor with a new value.
+     *
+     * If successful, request's result will be undefined.
+     */
+    delete(): IDBRequest<undefined>;
+    /**
+     * Updated the record pointed at by the cursor with a new value.
+     *
+     * Throws a "DataError" DOMException if the effective object store uses in-line keys and the key would have changed.
+     *
+     * If successful, request's result will be the record's key.
+     */
+    update(value: any): IDBRequest<IDBValidKey>;
+}
+
+declare var IDBCursor: {
+    prototype: IDBCursor;
+    new(): IDBCursor;
+};
+
+/** This IndexedDB API interface represents a cursor for traversing or iterating over multiple records in a database. It is the same as the IDBCursor, except that it includes the value property. */
+interface IDBCursorWithValue extends IDBCursor {
+    /** Returns the cursor's current value. */
+    readonly value: any;
+}
+
+declare var IDBCursorWithValue: {
+    prototype: IDBCursorWithValue;
+    new(): IDBCursorWithValue;
+};
+
+interface IDBDatabaseEventMap {
+    "abort": Event;
+    "close": Event;
+    "error": Event;
+    "versionchange": IDBVersionChangeEvent;
+}
+
+/** This IndexedDB API interface provides a connection to a database; you can use an IDBDatabase object to open a transaction on your database then create, manipulate, and delete objects (data) in that database. The interface provides the only way to get and manage versions of the database. */
+interface IDBDatabase extends EventTarget {
+    /** Returns the name of the database. */
+    readonly name: string;
+    /** Returns a list of the names of object stores in the database. */
+    readonly objectStoreNames: DOMStringList;
+    onabort: ((this: IDBDatabase, ev: Event) => any) | null;
+    onclose: ((this: IDBDatabase, ev: Event) => any) | null;
+    onerror: ((this: IDBDatabase, ev: Event) => any) | null;
+    onversionchange: ((this: IDBDatabase, ev: IDBVersionChangeEvent) => any) | null;
+    /** Returns the version of the database. */
+    readonly version: number;
+    /** Closes the connection once all running transactions have finished. */
+    close(): void;
+    /**
+     * Creates a new object store with the given name and options and returns a new IDBObjectStore.
+     *
+     * Throws a "InvalidStateError" DOMException if not called within an upgrade transaction.
+     */
+    createObjectStore(name: string, options?: IDBObjectStoreParameters): IDBObjectStore;
+    /**
+     * Deletes the object store with the given name.
+     *
+     * Throws a "InvalidStateError" DOMException if not called within an upgrade transaction.
+     */
+    deleteObjectStore(name: string): void;
+    /** Returns a new transaction with the given mode ("readonly" or "readwrite") and scope which can be a single object store name or an array of names. */
+    transaction(storeNames: string | string[], mode?: IDBTransactionMode, options?: IDBTransactionOptions): IDBTransaction;
+    addEventListener<K extends keyof IDBDatabaseEventMap>(type: K, listener: (this: IDBDatabase, ev: IDBDatabaseEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof IDBDatabaseEventMap>(type: K, listener: (this: IDBDatabase, ev: IDBDatabaseEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var IDBDatabase: {
+    prototype: IDBDatabase;
+    new(): IDBDatabase;
+};
+
+/** In the following code snippet, we make a request to open a database, and include handlers for the success and error cases. For a full working example, see our To-do Notifications app (view example live.) */
+interface IDBFactory {
+    /**
+     * Compares two values as keys. Returns -1 if key1 precedes key2, 1 if key2 precedes key1, and 0 if the keys are equal.
+     *
+     * Throws a "DataError" DOMException if either input is not a valid key.
+     */
+    cmp(first: any, second: any): number;
+    databases(): Promise<IDBDatabaseInfo[]>;
+    /** Attempts to delete the named database. If the database already exists and there are open connections that don't close in response to a versionchange event, the request will be blocked until all they close. If the request is successful request's result will be null. */
+    deleteDatabase(name: string): IDBOpenDBRequest;
+    /** Attempts to open a connection to the named database with the current version, or 1 if it does not already exist. If the request is successful request's result will be the connection. */
+    open(name: string, version?: number): IDBOpenDBRequest;
+}
+
+declare var IDBFactory: {
+    prototype: IDBFactory;
+    new(): IDBFactory;
+};
+
+/** IDBIndex interface of the IndexedDB API provides asynchronous access to an index in a database. An index is a kind of object store for looking up records in another object store, called the referenced object store. You use this interface to retrieve data. */
+interface IDBIndex {
+    readonly keyPath: string | string[];
+    readonly multiEntry: boolean;
+    /** Returns the name of the index. */
+    name: string;
+    /** Returns the IDBObjectStore the index belongs to. */
+    readonly objectStore: IDBObjectStore;
+    readonly unique: boolean;
+    /**
+     * Retrieves the number of records matching the given key or key range in query.
+     *
+     * If successful, request's result will be the count.
+     */
+    count(query?: IDBValidKey | IDBKeyRange): IDBRequest<number>;
+    /**
+     * Retrieves the value of the first record matching the given key or key range in query.
+     *
+     * If successful, request's result will be the value, or undefined if there was no matching record.
+     */
+    get(query: IDBValidKey | IDBKeyRange): IDBRequest<any>;
+    /**
+     * Retrieves the values of the records matching the given key or key range in query (up to count if given).
+     *
+     * If successful, request's result will be an Array of the values.
+     */
+    getAll(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<any[]>;
+    /**
+     * Retrieves the keys of records matching the given key or key range in query (up to count if given).
+     *
+     * If successful, request's result will be an Array of the keys.
+     */
+    getAllKeys(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<IDBValidKey[]>;
+    /**
+     * Retrieves the key of the first record matching the given key or key range in query.
+     *
+     * If successful, request's result will be the key, or undefined if there was no matching record.
+     */
+    getKey(query: IDBValidKey | IDBKeyRange): IDBRequest<IDBValidKey | undefined>;
+    /**
+     * Opens a cursor over the records matching query, ordered by direction. If query is null, all records in index are matched.
+     *
+     * If successful, request's result will be an IDBCursorWithValue, or null if there were no matching records.
+     */
+    openCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursorWithValue | null>;
+    /**
+     * Opens a cursor with key only flag set over the records matching query, ordered by direction. If query is null, all records in index are matched.
+     *
+     * If successful, request's result will be an IDBCursor, or null if there were no matching records.
+     */
+    openKeyCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursor | null>;
+}
+
+declare var IDBIndex: {
+    prototype: IDBIndex;
+    new(): IDBIndex;
+};
+
+/** A key range can be a single value or a range with upper and lower bounds or endpoints. If the key range has both upper and lower bounds, then it is bounded; if it has no bounds, it is unbounded. A bounded key range can either be open (the endpoints are excluded) or closed (the endpoints are included). To retrieve all keys within a certain range, you can use the following code constructs: */
+interface IDBKeyRange {
+    /** Returns lower bound, or undefined if none. */
+    readonly lower: any;
+    /** Returns true if the lower open flag is set, and false otherwise. */
+    readonly lowerOpen: boolean;
+    /** Returns upper bound, or undefined if none. */
+    readonly upper: any;
+    /** Returns true if the upper open flag is set, and false otherwise. */
+    readonly upperOpen: boolean;
+    /** Returns true if key is included in the range, and false otherwise. */
+    includes(key: any): boolean;
+}
+
+declare var IDBKeyRange: {
+    prototype: IDBKeyRange;
+    new(): IDBKeyRange;
+    /** Returns a new IDBKeyRange spanning from lower to upper. If lowerOpen is true, lower is not included in the range. If upperOpen is true, upper is not included in the range. */
+    bound(lower: any, upper: any, lowerOpen?: boolean, upperOpen?: boolean): IDBKeyRange;
+    /** Returns a new IDBKeyRange starting at key with no upper bound. If open is true, key is not included in the range. */
+    lowerBound(lower: any, open?: boolean): IDBKeyRange;
+    /** Returns a new IDBKeyRange spanning only key. */
+    only(value: any): IDBKeyRange;
+    /** Returns a new IDBKeyRange with no lower bound and ending at key. If open is true, key is not included in the range. */
+    upperBound(upper: any, open?: boolean): IDBKeyRange;
+};
+
+/** This example shows a variety of different uses of object stores, from updating the data structure with IDBObjectStore.createIndex\xA0inside an onupgradeneeded function, to adding a new item to our object store with IDBObjectStore.add. For a full working example, see our\xA0To-do Notifications\xA0app (view example live.) */
+interface IDBObjectStore {
+    /** Returns true if the store has a key generator, and false otherwise. */
+    readonly autoIncrement: boolean;
+    /** Returns a list of the names of indexes in the store. */
+    readonly indexNames: DOMStringList;
+    /** Returns the key path of the store, or null if none. */
+    readonly keyPath: string | string[];
+    /** Returns the name of the store. */
+    name: string;
+    /** Returns the associated transaction. */
+    readonly transaction: IDBTransaction;
+    /**
+     * Adds or updates a record in store with the given value and key.
+     *
+     * If the store uses in-line keys and key is specified a "DataError" DOMException will be thrown.
+     *
+     * If put() is used, any existing record with the key will be replaced. If add() is used, and if a record with the key already exists the request will fail, with request's error set to a "ConstraintError" DOMException.
+     *
+     * If successful, request's result will be the record's key.
+     */
+    add(value: any, key?: IDBValidKey): IDBRequest<IDBValidKey>;
+    /**
+     * Deletes all records in store.
+     *
+     * If successful, request's result will be undefined.
+     */
+    clear(): IDBRequest<undefined>;
+    /**
+     * Retrieves the number of records matching the given key or key range in query.
+     *
+     * If successful, request's result will be the count.
+     */
+    count(query?: IDBValidKey | IDBKeyRange): IDBRequest<number>;
+    /**
+     * Creates a new index in store with the given name, keyPath and options and returns a new IDBIndex. If the keyPath and options define constraints that cannot be satisfied with the data already in store the upgrade transaction will abort with a "ConstraintError" DOMException.
+     *
+     * Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.
+     */
+    createIndex(name: string, keyPath: string | string[], options?: IDBIndexParameters): IDBIndex;
+    /**
+     * Deletes records in store with the given key or in the given key range in query.
+     *
+     * If successful, request's result will be undefined.
+     */
+    delete(query: IDBValidKey | IDBKeyRange): IDBRequest<undefined>;
+    /**
+     * Deletes the index in store with the given name.
+     *
+     * Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.
+     */
+    deleteIndex(name: string): void;
+    /**
+     * Retrieves the value of the first record matching the given key or key range in query.
+     *
+     * If successful, request's result will be the value, or undefined if there was no matching record.
+     */
+    get(query: IDBValidKey | IDBKeyRange): IDBRequest<any>;
+    /**
+     * Retrieves the values of the records matching the given key or key range in query (up to count if given).
+     *
+     * If successful, request's result will be an Array of the values.
+     */
+    getAll(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<any[]>;
+    /**
+     * Retrieves the keys of records matching the given key or key range in query (up to count if given).
+     *
+     * If successful, request's result will be an Array of the keys.
+     */
+    getAllKeys(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<IDBValidKey[]>;
+    /**
+     * Retrieves the key of the first record matching the given key or key range in query.
+     *
+     * If successful, request's result will be the key, or undefined if there was no matching record.
+     */
+    getKey(query: IDBValidKey | IDBKeyRange): IDBRequest<IDBValidKey | undefined>;
+    index(name: string): IDBIndex;
+    /**
+     * Opens a cursor over the records matching query, ordered by direction. If query is null, all records in store are matched.
+     *
+     * If successful, request's result will be an IDBCursorWithValue pointing at the first matching record, or null if there were no matching records.
+     */
+    openCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursorWithValue | null>;
+    /**
+     * Opens a cursor with key only flag set over the records matching query, ordered by direction. If query is null, all records in store are matched.
+     *
+     * If successful, request's result will be an IDBCursor pointing at the first matching record, or null if there were no matching records.
+     */
+    openKeyCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursor | null>;
+    /**
+     * Adds or updates a record in store with the given value and key.
+     *
+     * If the store uses in-line keys and key is specified a "DataError" DOMException will be thrown.
+     *
+     * If put() is used, any existing record with the key will be replaced. If add() is used, and if a record with the key already exists the request will fail, with request's error set to a "ConstraintError" DOMException.
+     *
+     * If successful, request's result will be the record's key.
+     */
+    put(value: any, key?: IDBValidKey): IDBRequest<IDBValidKey>;
+}
+
+declare var IDBObjectStore: {
+    prototype: IDBObjectStore;
+    new(): IDBObjectStore;
+};
+
+interface IDBOpenDBRequestEventMap extends IDBRequestEventMap {
+    "blocked": IDBVersionChangeEvent;
+    "upgradeneeded": IDBVersionChangeEvent;
+}
+
+/** Also inherits methods from its parents IDBRequest and EventTarget. */
+interface IDBOpenDBRequest extends IDBRequest<IDBDatabase> {
+    onblocked: ((this: IDBOpenDBRequest, ev: IDBVersionChangeEvent) => any) | null;
+    onupgradeneeded: ((this: IDBOpenDBRequest, ev: IDBVersionChangeEvent) => any) | null;
+    addEventListener<K extends keyof IDBOpenDBRequestEventMap>(type: K, listener: (this: IDBOpenDBRequest, ev: IDBOpenDBRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof IDBOpenDBRequestEventMap>(type: K, listener: (this: IDBOpenDBRequest, ev: IDBOpenDBRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var IDBOpenDBRequest: {
+    prototype: IDBOpenDBRequest;
+    new(): IDBOpenDBRequest;
+};
+
+interface IDBRequestEventMap {
+    "error": Event;
+    "success": Event;
+}
+
+/** The request object does not initially contain any information about the result of the operation, but once information becomes available, an event is fired on the request, and the information becomes available through the properties of the IDBRequest instance. */
+interface IDBRequest<T = any> extends EventTarget {
+    /** When a request is completed, returns the error (a DOMException), or null if the request succeeded. Throws a "InvalidStateError" DOMException if the request is still pending. */
+    readonly error: DOMException | null;
+    onerror: ((this: IDBRequest<T>, ev: Event) => any) | null;
+    onsuccess: ((this: IDBRequest<T>, ev: Event) => any) | null;
+    /** Returns "pending" until a request is complete, then returns "done". */
+    readonly readyState: IDBRequestReadyState;
+    /** When a request is completed, returns the result, or undefined if the request failed. Throws a "InvalidStateError" DOMException if the request is still pending. */
+    readonly result: T;
+    /** Returns the IDBObjectStore, IDBIndex, or IDBCursor the request was made against, or null if is was an open request. */
+    readonly source: IDBObjectStore | IDBIndex | IDBCursor;
+    /** Returns the IDBTransaction the request was made within. If this as an open request, then it returns an upgrade transaction while it is running, or null otherwise. */
+    readonly transaction: IDBTransaction | null;
+    addEventListener<K extends keyof IDBRequestEventMap>(type: K, listener: (this: IDBRequest<T>, ev: IDBRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof IDBRequestEventMap>(type: K, listener: (this: IDBRequest<T>, ev: IDBRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var IDBRequest: {
+    prototype: IDBRequest;
+    new(): IDBRequest;
+};
+
+interface IDBTransactionEventMap {
+    "abort": Event;
+    "complete": Event;
+    "error": Event;
+}
+
+interface IDBTransaction extends EventTarget {
+    /** Returns the transaction's connection. */
+    readonly db: IDBDatabase;
+    readonly durability: IDBTransactionDurability;
+    /** If the transaction was aborted, returns the error (a DOMException) providing the reason. */
+    readonly error: DOMException | null;
+    /** Returns the mode the transaction was created with ("readonly" or "readwrite"), or "versionchange" for an upgrade transaction. */
+    readonly mode: IDBTransactionMode;
+    /** Returns a list of the names of object stores in the transaction's scope. For an upgrade transaction this is all object stores in the database. */
+    readonly objectStoreNames: DOMStringList;
+    onabort: ((this: IDBTransaction, ev: Event) => any) | null;
+    oncomplete: ((this: IDBTransaction, ev: Event) => any) | null;
+    onerror: ((this: IDBTransaction, ev: Event) => any) | null;
+    /** Aborts the transaction. All pending requests will fail with a "AbortError" DOMException and all changes made to the database will be reverted. */
+    abort(): void;
+    commit(): void;
+    /** Returns an IDBObjectStore in the transaction's scope. */
+    objectStore(name: string): IDBObjectStore;
+    addEventListener<K extends keyof IDBTransactionEventMap>(type: K, listener: (this: IDBTransaction, ev: IDBTransactionEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof IDBTransactionEventMap>(type: K, listener: (this: IDBTransaction, ev: IDBTransactionEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var IDBTransaction: {
+    prototype: IDBTransaction;
+    new(): IDBTransaction;
+};
+
+/** This IndexedDB API interface indicates that the version of the database has changed, as the result of an IDBOpenDBRequest.onupgradeneeded event handler function. */
+interface IDBVersionChangeEvent extends Event {
+    readonly newVersion: number | null;
+    readonly oldVersion: number;
+}
+
+declare var IDBVersionChangeEvent: {
+    prototype: IDBVersionChangeEvent;
+    new(type: string, eventInitDict?: IDBVersionChangeEventInit): IDBVersionChangeEvent;
+};
+
+interface ImageBitmap {
+    /** Returns the intrinsic height of the image, in CSS pixels. */
+    readonly height: number;
+    /** Returns the intrinsic width of the image, in CSS pixels. */
+    readonly width: number;
+    /** Releases imageBitmap's underlying bitmap data. */
+    close(): void;
+}
+
+declare var ImageBitmap: {
+    prototype: ImageBitmap;
+    new(): ImageBitmap;
+};
+
+interface ImageBitmapRenderingContext {
+    /** Transfers the underlying bitmap data from imageBitmap to context, and the bitmap becomes the contents of the canvas element to which context is bound. */
+    transferFromImageBitmap(bitmap: ImageBitmap | null): void;
+}
+
+declare var ImageBitmapRenderingContext: {
+    prototype: ImageBitmapRenderingContext;
+    new(): ImageBitmapRenderingContext;
+};
+
+/** The underlying pixel data of an area of a <canvas> element. It is created using the ImageData() constructor or creator methods on the CanvasRenderingContext2D object associated with a canvas: createImageData() and getImageData(). It can also be used to set a part of the canvas by using putImageData(). */
+interface ImageData {
+    readonly colorSpace: PredefinedColorSpace;
+    /** Returns the one-dimensional array containing the data in RGBA order, as integers in the range 0 to 255. */
+    readonly data: Uint8ClampedArray;
+    /** Returns the actual dimensions of the data in the ImageData object, in pixels. */
+    readonly height: number;
+    /** Returns the actual dimensions of the data in the ImageData object, in pixels. */
+    readonly width: number;
+}
+
+declare var ImageData: {
+    prototype: ImageData;
+    new(sw: number, sh: number, settings?: ImageDataSettings): ImageData;
+    new(data: Uint8ClampedArray, sw: number, sh?: number, settings?: ImageDataSettings): ImageData;
+};
+
+interface KHR_parallel_shader_compile {
+    readonly COMPLETION_STATUS_KHR: 0x91B1;
+}
+
+/** Available only in secure contexts. */
+interface Lock {
+    readonly mode: LockMode;
+    readonly name: string;
+}
+
+declare var Lock: {
+    prototype: Lock;
+    new(): Lock;
+};
+
+/** Available only in secure contexts. */
+interface LockManager {
+    query(): Promise<LockManagerSnapshot>;
+    request(name: string, callback: LockGrantedCallback): Promise<any>;
+    request(name: string, options: LockOptions, callback: LockGrantedCallback): Promise<any>;
+}
+
+declare var LockManager: {
+    prototype: LockManager;
+    new(): LockManager;
+};
+
+interface MediaCapabilities {
+    decodingInfo(configuration: MediaDecodingConfiguration): Promise<MediaCapabilitiesDecodingInfo>;
+    encodingInfo(configuration: MediaEncodingConfiguration): Promise<MediaCapabilitiesEncodingInfo>;
+}
+
+declare var MediaCapabilities: {
+    prototype: MediaCapabilities;
+    new(): MediaCapabilities;
+};
+
+/** This Channel Messaging API interface allows us to create a new message channel and send data through it via its two MessagePort properties. */
+interface MessageChannel {
+    /** Returns the first MessagePort object. */
+    readonly port1: MessagePort;
+    /** Returns the second MessagePort object. */
+    readonly port2: MessagePort;
+}
+
+declare var MessageChannel: {
+    prototype: MessageChannel;
+    new(): MessageChannel;
+};
+
+/** A message received by a target object. */
+interface MessageEvent<T = any> extends Event {
+    /** Returns the data of the message. */
+    readonly data: T;
+    /** Returns the last event ID string, for server-sent events. */
+    readonly lastEventId: string;
+    /** Returns the origin of the message, for server-sent events and cross-document messaging. */
+    readonly origin: string;
+    /** Returns the MessagePort array sent with the message, for cross-document messaging and channel messaging. */
+    readonly ports: ReadonlyArray<MessagePort>;
+    /** Returns the WindowProxy of the source window, for cross-document messaging, and the MessagePort being attached, in the connect event fired at SharedWorkerGlobalScope objects. */
+    readonly source: MessageEventSource | null;
+    /** @deprecated */
+    initMessageEvent(type: string, bubbles?: boolean, cancelable?: boolean, data?: any, origin?: string, lastEventId?: string, source?: MessageEventSource | null, ports?: MessagePort[]): void;
+}
+
+declare var MessageEvent: {
+    prototype: MessageEvent;
+    new<T>(type: string, eventInitDict?: MessageEventInit<T>): MessageEvent<T>;
+};
+
+interface MessagePortEventMap {
+    "message": MessageEvent;
+    "messageerror": MessageEvent;
+}
+
+/** This Channel Messaging API interface represents one of the two ports of a MessageChannel, allowing messages to be sent from one port and listening out for them arriving at the other. */
+interface MessagePort extends EventTarget {
+    onmessage: ((this: MessagePort, ev: MessageEvent) => any) | null;
+    onmessageerror: ((this: MessagePort, ev: MessageEvent) => any) | null;
+    /** Disconnects the port, so that it is no longer active. */
+    close(): void;
+    /**
+     * Posts a message through the channel. Objects listed in transfer are transferred, not just cloned, meaning that they are no longer usable on the sending side.
+     *
+     * Throws a "DataCloneError" DOMException if transfer contains duplicate objects or port, or if message could not be cloned.
+     */
+    postMessage(message: any, transfer: Transferable[]): void;
+    postMessage(message: any, options?: StructuredSerializeOptions): void;
+    /** Begins dispatching messages received on the port. */
+    start(): void;
+    addEventListener<K extends keyof MessagePortEventMap>(type: K, listener: (this: MessagePort, ev: MessagePortEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof MessagePortEventMap>(type: K, listener: (this: MessagePort, ev: MessagePortEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var MessagePort: {
+    prototype: MessagePort;
+    new(): MessagePort;
+};
+
+/** Available only in secure contexts. */
+interface NavigationPreloadManager {
+    disable(): Promise<void>;
+    enable(): Promise<void>;
+    getState(): Promise<NavigationPreloadState>;
+    setHeaderValue(value: string): Promise<void>;
+}
+
+declare var NavigationPreloadManager: {
+    prototype: NavigationPreloadManager;
+    new(): NavigationPreloadManager;
+};
+
+interface NavigatorConcurrentHardware {
+    readonly hardwareConcurrency: number;
+}
+
+interface NavigatorID {
+    /** @deprecated */
+    readonly appCodeName: string;
+    /** @deprecated */
+    readonly appName: string;
+    /** @deprecated */
+    readonly appVersion: string;
+    /** @deprecated */
+    readonly platform: string;
+    /** @deprecated */
+    readonly product: string;
+    readonly userAgent: string;
+}
+
+interface NavigatorLanguage {
+    readonly language: string;
+    readonly languages: ReadonlyArray<string>;
+}
+
+/** Available only in secure contexts. */
+interface NavigatorLocks {
+    readonly locks: LockManager;
+}
+
+interface NavigatorOnLine {
+    readonly onLine: boolean;
+}
+
+/** Available only in secure contexts. */
+interface NavigatorStorage {
+    readonly storage: StorageManager;
+}
+
+interface NotificationEventMap {
+    "click": Event;
+    "close": Event;
+    "error": Event;
+    "show": Event;
+}
+
+/** This Notifications API interface is used to configure and display desktop notifications to the user. */
+interface Notification extends EventTarget {
+    readonly body: string;
+    readonly data: any;
+    readonly dir: NotificationDirection;
+    readonly icon: string;
+    readonly lang: string;
+    onclick: ((this: Notification, ev: Event) => any) | null;
+    onclose: ((this: Notification, ev: Event) => any) | null;
+    onerror: ((this: Notification, ev: Event) => any) | null;
+    onshow: ((this: Notification, ev: Event) => any) | null;
+    readonly tag: string;
+    readonly title: string;
+    close(): void;
+    addEventListener<K extends keyof NotificationEventMap>(type: K, listener: (this: Notification, ev: NotificationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof NotificationEventMap>(type: K, listener: (this: Notification, ev: NotificationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var Notification: {
+    prototype: Notification;
+    new(title: string, options?: NotificationOptions): Notification;
+    readonly permission: NotificationPermission;
+};
+
+/** The parameter passed into the onnotificationclick handler, the NotificationEvent interface represents a notification click event that is dispatched on the ServiceWorkerGlobalScope of a ServiceWorker. */
+interface NotificationEvent extends ExtendableEvent {
+    readonly action: string;
+    readonly notification: Notification;
+}
+
+declare var NotificationEvent: {
+    prototype: NotificationEvent;
+    new(type: string, eventInitDict: NotificationEventInit): NotificationEvent;
+};
+
+interface OES_draw_buffers_indexed {
+    blendEquationSeparateiOES(buf: GLuint, modeRGB: GLenum, modeAlpha: GLenum): void;
+    blendEquationiOES(buf: GLuint, mode: GLenum): void;
+    blendFuncSeparateiOES(buf: GLuint, srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum): void;
+    blendFunciOES(buf: GLuint, src: GLenum, dst: GLenum): void;
+    colorMaskiOES(buf: GLuint, r: GLboolean, g: GLboolean, b: GLboolean, a: GLboolean): void;
+    disableiOES(target: GLenum, index: GLuint): void;
+    enableiOES(target: GLenum, index: GLuint): void;
+}
+
+/** The OES_element_index_uint extension is part of the WebGL API and adds support for gl.UNSIGNED_INT types to WebGLRenderingContext.drawElements(). */
+interface OES_element_index_uint {
+}
+
+interface OES_fbo_render_mipmap {
+}
+
+/** The OES_standard_derivatives extension is part of the WebGL API and adds the GLSL derivative functions dFdx, dFdy, and fwidth. */
+interface OES_standard_derivatives {
+    readonly FRAGMENT_SHADER_DERIVATIVE_HINT_OES: 0x8B8B;
+}
+
+/** The OES_texture_float extension is part of the WebGL API and exposes floating-point pixel types for textures. */
+interface OES_texture_float {
+}
+
+/** The OES_texture_float_linear extension is part of the WebGL API and allows linear filtering with floating-point pixel types for textures. */
+interface OES_texture_float_linear {
+}
+
+/** The OES_texture_half_float extension is part of the WebGL API and adds texture formats with 16- (aka half float) and 32-bit floating-point components. */
+interface OES_texture_half_float {
+    readonly HALF_FLOAT_OES: 0x8D61;
+}
+
+/** The OES_texture_half_float_linear extension is part of the WebGL API and allows linear filtering with half floating-point pixel types for textures. */
+interface OES_texture_half_float_linear {
+}
+
+interface OES_vertex_array_object {
+    bindVertexArrayOES(arrayObject: WebGLVertexArrayObjectOES | null): void;
+    createVertexArrayOES(): WebGLVertexArrayObjectOES | null;
+    deleteVertexArrayOES(arrayObject: WebGLVertexArrayObjectOES | null): void;
+    isVertexArrayOES(arrayObject: WebGLVertexArrayObjectOES | null): GLboolean;
+    readonly VERTEX_ARRAY_BINDING_OES: 0x85B5;
+}
+
+interface OVR_multiview2 {
+    framebufferTextureMultiviewOVR(target: GLenum, attachment: GLenum, texture: WebGLTexture | null, level: GLint, baseViewIndex: GLint, numViews: GLsizei): void;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR: 0x9630;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR: 0x9632;
+    readonly MAX_VIEWS_OVR: 0x9631;
+    readonly FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR: 0x9633;
+}
+
+interface OffscreenCanvasEventMap {
+    "contextlost": Event;
+    "contextrestored": Event;
+}
+
+interface OffscreenCanvas extends EventTarget {
+    /**
+     * These attributes return the dimensions of the OffscreenCanvas object's bitmap.
+     *
+     * They can be set, to replace the bitmap with a new, transparent black bitmap of the specified dimensions (effectively resizing it).
+     */
+    height: number;
+    oncontextlost: ((this: OffscreenCanvas, ev: Event) => any) | null;
+    oncontextrestored: ((this: OffscreenCanvas, ev: Event) => any) | null;
+    /**
+     * These attributes return the dimensions of the OffscreenCanvas object's bitmap.
+     *
+     * They can be set, to replace the bitmap with a new, transparent black bitmap of the specified dimensions (effectively resizing it).
+     */
+    width: number;
+    /**
+     * Returns a promise that will fulfill with a new Blob object representing a file containing the image in the OffscreenCanvas object.
+     *
+     * The argument, if provided, is a dictionary that controls the encoding options of the image file to be created. The type field specifies the file format and has a default value of "image/png"; that type is also used if the requested type isn't supported. If the image format supports variable quality (such as "image/jpeg"), then the quality field is a number in the range 0.0 to 1.0 inclusive indicating the desired quality level for the resulting image.
+     */
+    convertToBlob(options?: ImageEncodeOptions): Promise<Blob>;
+    /**
+     * Returns an object that exposes an API for drawing on the OffscreenCanvas object. contextId specifies the desired API: "2d", "bitmaprenderer", "webgl", or "webgl2". options is handled by that API.
+     *
+     * This specification defines the "2d" context below, which is similar but distinct from the "2d" context that is created from a canvas element. The WebGL specifications define the "webgl" and "webgl2" contexts. [WEBGL]
+     *
+     * Returns null if the canvas has already been initialized with another context type (e.g., trying to get a "2d" context after getting a "webgl" context).
+     */
+    getContext(contextId: "2d", options?: any): OffscreenCanvasRenderingContext2D | null;
+    getContext(contextId: "bitmaprenderer", options?: any): ImageBitmapRenderingContext | null;
+    getContext(contextId: "webgl", options?: any): WebGLRenderingContext | null;
+    getContext(contextId: "webgl2", options?: any): WebGL2RenderingContext | null;
+    getContext(contextId: OffscreenRenderingContextId, options?: any): OffscreenRenderingContext | null;
+    /** Returns a newly created ImageBitmap object with the image in the OffscreenCanvas object. The image in the OffscreenCanvas object is replaced with a new blank image. */
+    transferToImageBitmap(): ImageBitmap;
+    addEventListener<K extends keyof OffscreenCanvasEventMap>(type: K, listener: (this: OffscreenCanvas, ev: OffscreenCanvasEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof OffscreenCanvasEventMap>(type: K, listener: (this: OffscreenCanvas, ev: OffscreenCanvasEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var OffscreenCanvas: {
+    prototype: OffscreenCanvas;
+    new(width: number, height: number): OffscreenCanvas;
+};
+
+interface OffscreenCanvasRenderingContext2D extends CanvasCompositing, CanvasDrawImage, CanvasDrawPath, CanvasFillStrokeStyles, CanvasFilters, CanvasImageData, CanvasImageSmoothing, CanvasPath, CanvasPathDrawingStyles, CanvasRect, CanvasShadowStyles, CanvasState, CanvasText, CanvasTextDrawingStyles, CanvasTransform {
+    readonly canvas: OffscreenCanvas;
+    commit(): void;
+}
+
+declare var OffscreenCanvasRenderingContext2D: {
+    prototype: OffscreenCanvasRenderingContext2D;
+    new(): OffscreenCanvasRenderingContext2D;
+};
+
+/** This Canvas 2D API interface is used to declare a path that can then be used on a CanvasRenderingContext2D object. The path methods of the CanvasRenderingContext2D interface are also present on this interface, which gives you the convenience of being able to retain and replay your path whenever desired. */
+interface Path2D extends CanvasPath {
+    /** Adds to the path the path given by the argument. */
+    addPath(path: Path2D, transform?: DOMMatrix2DInit): void;
+}
+
+declare var Path2D: {
+    prototype: Path2D;
+    new(path?: Path2D | string): Path2D;
+};
+
+interface PerformanceEventMap {
+    "resourcetimingbufferfull": Event;
+}
+
+/** Provides access to performance-related information for the current page. It's part of the High Resolution Time API, but is enhanced by the Performance Timeline API, the Navigation Timing API, the User Timing API, and the Resource Timing API. */
+interface Performance extends EventTarget {
+    onresourcetimingbufferfull: ((this: Performance, ev: Event) => any) | null;
+    readonly timeOrigin: DOMHighResTimeStamp;
+    clearMarks(markName?: string): void;
+    clearMeasures(measureName?: string): void;
+    clearResourceTimings(): void;
+    getEntries(): PerformanceEntryList;
+    getEntriesByName(name: string, type?: string): PerformanceEntryList;
+    getEntriesByType(type: string): PerformanceEntryList;
+    mark(markName: string, markOptions?: PerformanceMarkOptions): PerformanceMark;
+    measure(measureName: string, startOrMeasureOptions?: string | PerformanceMeasureOptions, endMark?: string): PerformanceMeasure;
+    now(): DOMHighResTimeStamp;
+    setResourceTimingBufferSize(maxSize: number): void;
+    toJSON(): any;
+    addEventListener<K extends keyof PerformanceEventMap>(type: K, listener: (this: Performance, ev: PerformanceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof PerformanceEventMap>(type: K, listener: (this: Performance, ev: PerformanceEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var Performance: {
+    prototype: Performance;
+    new(): Performance;
+};
+
+/** Encapsulates a single performance metric that is part of the performance timeline. A performance entry can be directly created by making a performance mark or measure (for example by calling the mark() method) at an explicit point in an application. Performance entries are also created in indirect ways such as loading a resource (such as an image). */
+interface PerformanceEntry {
+    readonly duration: DOMHighResTimeStamp;
+    readonly entryType: string;
+    readonly name: string;
+    readonly startTime: DOMHighResTimeStamp;
+    toJSON(): any;
+}
+
+declare var PerformanceEntry: {
+    prototype: PerformanceEntry;
+    new(): PerformanceEntry;
+};
+
+/** PerformanceMark\xA0is an abstract interface for PerformanceEntry objects with an entryType of "mark". Entries of this type are created by calling performance.mark() to add a named DOMHighResTimeStamp (the mark) to the browser's performance timeline. */
+interface PerformanceMark extends PerformanceEntry {
+    readonly detail: any;
+}
+
+declare var PerformanceMark: {
+    prototype: PerformanceMark;
+    new(markName: string, markOptions?: PerformanceMarkOptions): PerformanceMark;
+};
+
+/** PerformanceMeasure is an abstract interface for PerformanceEntry objects with an entryType of "measure". Entries of this type are created by calling performance.measure() to add a named DOMHighResTimeStamp (the measure) between two marks to the browser's performance timeline. */
+interface PerformanceMeasure extends PerformanceEntry {
+    readonly detail: any;
+}
+
+declare var PerformanceMeasure: {
+    prototype: PerformanceMeasure;
+    new(): PerformanceMeasure;
+};
+
+interface PerformanceObserver {
+    disconnect(): void;
+    observe(options?: PerformanceObserverInit): void;
+    takeRecords(): PerformanceEntryList;
+}
+
+declare var PerformanceObserver: {
+    prototype: PerformanceObserver;
+    new(callback: PerformanceObserverCallback): PerformanceObserver;
+    readonly supportedEntryTypes: ReadonlyArray<string>;
+};
+
+interface PerformanceObserverEntryList {
+    getEntries(): PerformanceEntryList;
+    getEntriesByName(name: string, type?: string): PerformanceEntryList;
+    getEntriesByType(type: string): PerformanceEntryList;
+}
+
+declare var PerformanceObserverEntryList: {
+    prototype: PerformanceObserverEntryList;
+    new(): PerformanceObserverEntryList;
+};
+
+/** Enables retrieval and analysis of detailed network timing data regarding the loading of an application's resources. An application can use the timing metrics to determine, for example, the length of time it takes to fetch a specific resource, such as an XMLHttpRequest, <SVG>, image, or script. */
+interface PerformanceResourceTiming extends PerformanceEntry {
+    readonly connectEnd: DOMHighResTimeStamp;
+    readonly connectStart: DOMHighResTimeStamp;
+    readonly decodedBodySize: number;
+    readonly domainLookupEnd: DOMHighResTimeStamp;
+    readonly domainLookupStart: DOMHighResTimeStamp;
+    readonly encodedBodySize: number;
+    readonly fetchStart: DOMHighResTimeStamp;
+    readonly initiatorType: string;
+    readonly nextHopProtocol: string;
+    readonly redirectEnd: DOMHighResTimeStamp;
+    readonly redirectStart: DOMHighResTimeStamp;
+    readonly requestStart: DOMHighResTimeStamp;
+    readonly responseEnd: DOMHighResTimeStamp;
+    readonly responseStart: DOMHighResTimeStamp;
+    readonly secureConnectionStart: DOMHighResTimeStamp;
+    readonly serverTiming: ReadonlyArray<PerformanceServerTiming>;
+    readonly transferSize: number;
+    readonly workerStart: DOMHighResTimeStamp;
+    toJSON(): any;
+}
+
+declare var PerformanceResourceTiming: {
+    prototype: PerformanceResourceTiming;
+    new(): PerformanceResourceTiming;
+};
+
+interface PerformanceServerTiming {
+    readonly description: string;
+    readonly duration: DOMHighResTimeStamp;
+    readonly name: string;
+    toJSON(): any;
+}
+
+declare var PerformanceServerTiming: {
+    prototype: PerformanceServerTiming;
+    new(): PerformanceServerTiming;
+};
+
+interface PermissionStatusEventMap {
+    "change": Event;
+}
+
+interface PermissionStatus extends EventTarget {
+    readonly name: string;
+    onchange: ((this: PermissionStatus, ev: Event) => any) | null;
+    readonly state: PermissionState;
+    addEventListener<K extends keyof PermissionStatusEventMap>(type: K, listener: (this: PermissionStatus, ev: PermissionStatusEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof PermissionStatusEventMap>(type: K, listener: (this: PermissionStatus, ev: PermissionStatusEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var PermissionStatus: {
+    prototype: PermissionStatus;
+    new(): PermissionStatus;
+};
+
+interface Permissions {
+    query(permissionDesc: PermissionDescriptor): Promise<PermissionStatus>;
+}
+
+declare var Permissions: {
+    prototype: Permissions;
+    new(): Permissions;
+};
+
+/** Events measuring progress of an underlying process, like an HTTP request (for an XMLHttpRequest, or the loading of the underlying resource of an <img>, <audio>, <video>, <style> or <link>). */
+interface ProgressEvent<T extends EventTarget = EventTarget> extends Event {
+    readonly lengthComputable: boolean;
+    readonly loaded: number;
+    readonly target: T | null;
+    readonly total: number;
+}
+
+declare var ProgressEvent: {
+    prototype: ProgressEvent;
+    new(type: string, eventInitDict?: ProgressEventInit): ProgressEvent;
+};
+
+interface PromiseRejectionEvent extends Event {
+    readonly promise: Promise<any>;
+    readonly reason: any;
+}
+
+declare var PromiseRejectionEvent: {
+    prototype: PromiseRejectionEvent;
+    new(type: string, eventInitDict: PromiseRejectionEventInit): PromiseRejectionEvent;
+};
+
+/**
+ * This Push API interface represents a push message that has been received. This event is sent to the global scope of a ServiceWorker. It contains the information sent from an application server to a PushSubscription.
+ * Available only in secure contexts.
+ */
+interface PushEvent extends ExtendableEvent {
+    readonly data: PushMessageData | null;
+}
+
+declare var PushEvent: {
+    prototype: PushEvent;
+    new(type: string, eventInitDict?: PushEventInit): PushEvent;
+};
+
+/**
+ * This Push API interface provides a way to receive notifications from third-party servers as well as request URLs for push notifications.
+ * Available only in secure contexts.
+ */
+interface PushManager {
+    getSubscription(): Promise<PushSubscription | null>;
+    permissionState(options?: PushSubscriptionOptionsInit): Promise<PermissionState>;
+    subscribe(options?: PushSubscriptionOptionsInit): Promise<PushSubscription>;
+}
+
+declare var PushManager: {
+    prototype: PushManager;
+    new(): PushManager;
+    readonly supportedContentEncodings: ReadonlyArray<string>;
+};
+
+/**
+ * This Push API interface provides methods which let you retrieve the push data sent by a server in various formats.
+ * Available only in secure contexts.
+ */
+interface PushMessageData {
+    arrayBuffer(): ArrayBuffer;
+    blob(): Blob;
+    json(): any;
+    text(): string;
+}
+
+declare var PushMessageData: {
+    prototype: PushMessageData;
+    new(): PushMessageData;
+};
+
+/**
+ * This Push API interface provides a subcription's URL endpoint and allows unsubscription from a push service.
+ * Available only in secure contexts.
+ */
+interface PushSubscription {
+    readonly endpoint: string;
+    readonly expirationTime: EpochTimeStamp | null;
+    readonly options: PushSubscriptionOptions;
+    getKey(name: PushEncryptionKeyName): ArrayBuffer | null;
+    toJSON(): PushSubscriptionJSON;
+    unsubscribe(): Promise<boolean>;
+}
+
+declare var PushSubscription: {
+    prototype: PushSubscription;
+    new(): PushSubscription;
+};
+
+/** Available only in secure contexts. */
+interface PushSubscriptionOptions {
+    readonly applicationServerKey: ArrayBuffer | null;
+    readonly userVisibleOnly: boolean;
+}
+
+declare var PushSubscriptionOptions: {
+    prototype: PushSubscriptionOptions;
+    new(): PushSubscriptionOptions;
+};
+
+interface RTCEncodedAudioFrame {
+    data: ArrayBuffer;
+    readonly timestamp: number;
+    getMetadata(): RTCEncodedAudioFrameMetadata;
+}
+
+declare var RTCEncodedAudioFrame: {
+    prototype: RTCEncodedAudioFrame;
+    new(): RTCEncodedAudioFrame;
+};
+
+interface RTCEncodedVideoFrame {
+    data: ArrayBuffer;
+    readonly timestamp: number;
+    readonly type: RTCEncodedVideoFrameType;
+    getMetadata(): RTCEncodedVideoFrameMetadata;
+}
+
+declare var RTCEncodedVideoFrame: {
+    prototype: RTCEncodedVideoFrame;
+    new(): RTCEncodedVideoFrame;
+};
+
+interface ReadableByteStreamController {
+    readonly byobRequest: ReadableStreamBYOBRequest | null;
+    readonly desiredSize: number | null;
+    close(): void;
+    enqueue(chunk: ArrayBufferView): void;
+    error(e?: any): void;
+}
+
+declare var ReadableByteStreamController: {
+    prototype: ReadableByteStreamController;
+    new(): ReadableByteStreamController;
+};
+
+/** This Streams API interface represents a readable stream of byte data. The Fetch API offers a concrete instance of a ReadableStream through the body property of a Response object. */
+interface ReadableStream<R = any> {
+    readonly locked: boolean;
+    cancel(reason?: any): Promise<void>;
+    getReader(options: { mode: "byob" }): ReadableStreamBYOBReader;
+    getReader(): ReadableStreamDefaultReader<R>;
+    getReader(options?: ReadableStreamGetReaderOptions): ReadableStreamReader<R>;
+    pipeThrough<T>(transform: ReadableWritablePair<T, R>, options?: StreamPipeOptions): ReadableStream<T>;
+    pipeTo(destination: WritableStream<R>, options?: StreamPipeOptions): Promise<void>;
+    tee(): [ReadableStream<R>, ReadableStream<R>];
+}
+
+declare var ReadableStream: {
+    prototype: ReadableStream;
+    new(underlyingSource: UnderlyingByteSource, strategy?: { highWaterMark?: number }): ReadableStream<Uint8Array>;
+    new<R = any>(underlyingSource: UnderlyingDefaultSource<R>, strategy?: QueuingStrategy<R>): ReadableStream<R>;
+    new<R = any>(underlyingSource?: UnderlyingSource<R>, strategy?: QueuingStrategy<R>): ReadableStream<R>;
+};
+
+interface ReadableStreamBYOBReader extends ReadableStreamGenericReader {
+    read<T extends ArrayBufferView>(view: T): Promise<ReadableStreamReadResult<T>>;
+    releaseLock(): void;
+}
+
+declare var ReadableStreamBYOBReader: {
+    prototype: ReadableStreamBYOBReader;
+    new(stream: ReadableStream): ReadableStreamBYOBReader;
+};
+
+interface ReadableStreamBYOBRequest {
+    readonly view: ArrayBufferView | null;
+    respond(bytesWritten: number): void;
+    respondWithNewView(view: ArrayBufferView): void;
+}
+
+declare var ReadableStreamBYOBRequest: {
+    prototype: ReadableStreamBYOBRequest;
+    new(): ReadableStreamBYOBRequest;
+};
+
+interface ReadableStreamDefaultController<R = any> {
+    readonly desiredSize: number | null;
+    close(): void;
+    enqueue(chunk?: R): void;
+    error(e?: any): void;
+}
+
+declare var ReadableStreamDefaultController: {
+    prototype: ReadableStreamDefaultController;
+    new(): ReadableStreamDefaultController;
+};
+
+interface ReadableStreamDefaultReader<R = any> extends ReadableStreamGenericReader {
+    read(): Promise<ReadableStreamReadResult<R>>;
+    releaseLock(): void;
+}
+
+declare var ReadableStreamDefaultReader: {
+    prototype: ReadableStreamDefaultReader;
+    new<R = any>(stream: ReadableStream<R>): ReadableStreamDefaultReader<R>;
+};
+
+interface ReadableStreamGenericReader {
+    readonly closed: Promise<undefined>;
+    cancel(reason?: any): Promise<void>;
+}
+
+/** This Fetch API interface represents a resource request. */
+interface Request extends Body {
+    /** Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. */
+    readonly cache: RequestCache;
+    /** Returns the credentials mode associated with request, which is a string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. */
+    readonly credentials: RequestCredentials;
+    /** Returns the kind of resource requested by request, e.g., "document" or "script". */
+    readonly destination: RequestDestination;
+    /** Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the "Host" header. */
+    readonly headers: Headers;
+    /** Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] */
+    readonly integrity: string;
+    /** Returns a boolean indicating whether or not request can outlive the global in which it was created. */
+    readonly keepalive: boolean;
+    /** Returns request's HTTP method, which is "GET" by default. */
+    readonly method: string;
+    /** Returns the mode associated with request, which is a string indicating whether the request will use CORS, or will be restricted to same-origin URLs. */
+    readonly mode: RequestMode;
+    /** Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. */
+    readonly redirect: RequestRedirect;
+    /** Returns the referrer of request. Its value can be a same-origin URL if explicitly set in init, the empty string to indicate no referrer, and "about:client" when defaulting to the global's default. This is used during fetching to determine the value of the \`Referer\` header of the request being made. */
+    readonly referrer: string;
+    /** Returns the referrer policy associated with request. This is used during fetching to compute the value of the request's referrer. */
+    readonly referrerPolicy: ReferrerPolicy;
+    /** Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. */
+    readonly signal: AbortSignal;
+    /** Returns the URL of request as a string. */
+    readonly url: string;
+    clone(): Request;
+}
+
+declare var Request: {
+    prototype: Request;
+    new(input: RequestInfo | URL, init?: RequestInit): Request;
+};
+
+/** This Fetch API interface represents the response to a request. */
+interface Response extends Body {
+    readonly headers: Headers;
+    readonly ok: boolean;
+    readonly redirected: boolean;
+    readonly status: number;
+    readonly statusText: string;
+    readonly type: ResponseType;
+    readonly url: string;
+    clone(): Response;
+}
+
+declare var Response: {
+    prototype: Response;
+    new(body?: BodyInit | null, init?: ResponseInit): Response;
+    error(): Response;
+    redirect(url: string | URL, status?: number): Response;
+};
+
+/** Inherits from Event, and represents the event object of an event sent on a document or worker when its content security policy is violated. */
+interface SecurityPolicyViolationEvent extends Event {
+    readonly blockedURI: string;
+    readonly columnNumber: number;
+    readonly disposition: SecurityPolicyViolationEventDisposition;
+    readonly documentURI: string;
+    readonly effectiveDirective: string;
+    readonly lineNumber: number;
+    readonly originalPolicy: string;
+    readonly referrer: string;
+    readonly sample: string;
+    readonly sourceFile: string;
+    readonly statusCode: number;
+    readonly violatedDirective: string;
+}
+
+declare var SecurityPolicyViolationEvent: {
+    prototype: SecurityPolicyViolationEvent;
+    new(type: string, eventInitDict?: SecurityPolicyViolationEventInit): SecurityPolicyViolationEvent;
+};
+
+interface ServiceWorkerEventMap extends AbstractWorkerEventMap {
+    "statechange": Event;
+}
+
+/**
+ * This ServiceWorker API interface provides a reference to a service worker. Multiple browsing contexts (e.g. pages, workers, etc.) can be associated with the same service worker, each through a unique ServiceWorker object.
+ * Available only in secure contexts.
+ */
+interface ServiceWorker extends EventTarget, AbstractWorker {
+    onstatechange: ((this: ServiceWorker, ev: Event) => any) | null;
+    readonly scriptURL: string;
+    readonly state: ServiceWorkerState;
+    postMessage(message: any, transfer: Transferable[]): void;
+    postMessage(message: any, options?: StructuredSerializeOptions): void;
+    addEventListener<K extends keyof ServiceWorkerEventMap>(type: K, listener: (this: ServiceWorker, ev: ServiceWorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof ServiceWorkerEventMap>(type: K, listener: (this: ServiceWorker, ev: ServiceWorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var ServiceWorker: {
+    prototype: ServiceWorker;
+    new(): ServiceWorker;
+};
+
+interface ServiceWorkerContainerEventMap {
+    "controllerchange": Event;
+    "message": MessageEvent;
+    "messageerror": MessageEvent;
+}
+
+/**
+ * The\xA0ServiceWorkerContainer\xA0interface of the\xA0ServiceWorker API\xA0provides an object representing the service worker as an overall unit in the network ecosystem, including facilities to register, unregister and update service workers, and access the state of service workers and their registrations.
+ * Available only in secure contexts.
+ */
+interface ServiceWorkerContainer extends EventTarget {
+    readonly controller: ServiceWorker | null;
+    oncontrollerchange: ((this: ServiceWorkerContainer, ev: Event) => any) | null;
+    onmessage: ((this: ServiceWorkerContainer, ev: MessageEvent) => any) | null;
+    onmessageerror: ((this: ServiceWorkerContainer, ev: MessageEvent) => any) | null;
+    readonly ready: Promise<ServiceWorkerRegistration>;
+    getRegistration(clientURL?: string | URL): Promise<ServiceWorkerRegistration | undefined>;
+    getRegistrations(): Promise<ReadonlyArray<ServiceWorkerRegistration>>;
+    register(scriptURL: string | URL, options?: RegistrationOptions): Promise<ServiceWorkerRegistration>;
+    startMessages(): void;
+    addEventListener<K extends keyof ServiceWorkerContainerEventMap>(type: K, listener: (this: ServiceWorkerContainer, ev: ServiceWorkerContainerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof ServiceWorkerContainerEventMap>(type: K, listener: (this: ServiceWorkerContainer, ev: ServiceWorkerContainerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var ServiceWorkerContainer: {
+    prototype: ServiceWorkerContainer;
+    new(): ServiceWorkerContainer;
+};
+
+interface ServiceWorkerGlobalScopeEventMap extends WorkerGlobalScopeEventMap {
+    "activate": ExtendableEvent;
+    "fetch": FetchEvent;
+    "install": ExtendableEvent;
+    "message": ExtendableMessageEvent;
+    "messageerror": MessageEvent;
+    "notificationclick": NotificationEvent;
+    "notificationclose": NotificationEvent;
+    "push": PushEvent;
+    "pushsubscriptionchange": Event;
+}
+
+/** This ServiceWorker API interface represents the global execution context of a service worker. */
+interface ServiceWorkerGlobalScope extends WorkerGlobalScope {
+    readonly clients: Clients;
+    onactivate: ((this: ServiceWorkerGlobalScope, ev: ExtendableEvent) => any) | null;
+    onfetch: ((this: ServiceWorkerGlobalScope, ev: FetchEvent) => any) | null;
+    oninstall: ((this: ServiceWorkerGlobalScope, ev: ExtendableEvent) => any) | null;
+    onmessage: ((this: ServiceWorkerGlobalScope, ev: ExtendableMessageEvent) => any) | null;
+    onmessageerror: ((this: ServiceWorkerGlobalScope, ev: MessageEvent) => any) | null;
+    onnotificationclick: ((this: ServiceWorkerGlobalScope, ev: NotificationEvent) => any) | null;
+    onnotificationclose: ((this: ServiceWorkerGlobalScope, ev: NotificationEvent) => any) | null;
+    onpush: ((this: ServiceWorkerGlobalScope, ev: PushEvent) => any) | null;
+    onpushsubscriptionchange: ((this: ServiceWorkerGlobalScope, ev: Event) => any) | null;
+    readonly registration: ServiceWorkerRegistration;
+    readonly serviceWorker: ServiceWorker;
+    skipWaiting(): Promise<void>;
+    addEventListener<K extends keyof ServiceWorkerGlobalScopeEventMap>(type: K, listener: (this: ServiceWorkerGlobalScope, ev: ServiceWorkerGlobalScopeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof ServiceWorkerGlobalScopeEventMap>(type: K, listener: (this: ServiceWorkerGlobalScope, ev: ServiceWorkerGlobalScopeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var ServiceWorkerGlobalScope: {
+    prototype: ServiceWorkerGlobalScope;
+    new(): ServiceWorkerGlobalScope;
+};
+
+interface ServiceWorkerRegistrationEventMap {
+    "updatefound": Event;
+}
+
+/**
+ * This ServiceWorker API interface represents the service worker registration. You register a service worker to control one or more pages that share the same origin.
+ * Available only in secure contexts.
+ */
+interface ServiceWorkerRegistration extends EventTarget {
+    readonly active: ServiceWorker | null;
+    readonly installing: ServiceWorker | null;
+    readonly navigationPreload: NavigationPreloadManager;
+    onupdatefound: ((this: ServiceWorkerRegistration, ev: Event) => any) | null;
+    readonly pushManager: PushManager;
+    readonly scope: string;
+    readonly updateViaCache: ServiceWorkerUpdateViaCache;
+    readonly waiting: ServiceWorker | null;
+    getNotifications(filter?: GetNotificationOptions): Promise<Notification[]>;
+    showNotification(title: string, options?: NotificationOptions): Promise<void>;
+    unregister(): Promise<boolean>;
+    update(): Promise<void>;
+    addEventListener<K extends keyof ServiceWorkerRegistrationEventMap>(type: K, listener: (this: ServiceWorkerRegistration, ev: ServiceWorkerRegistrationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof ServiceWorkerRegistrationEventMap>(type: K, listener: (this: ServiceWorkerRegistration, ev: ServiceWorkerRegistrationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var ServiceWorkerRegistration: {
+    prototype: ServiceWorkerRegistration;
+    new(): ServiceWorkerRegistration;
+};
+
+interface SharedWorkerGlobalScopeEventMap extends WorkerGlobalScopeEventMap {
+    "connect": MessageEvent;
+}
+
+interface SharedWorkerGlobalScope extends WorkerGlobalScope {
+    /** Returns sharedWorkerGlobal's name, i.e. the value given to the SharedWorker constructor. Multiple SharedWorker objects can correspond to the same shared worker (and SharedWorkerGlobalScope), by reusing the same name. */
+    readonly name: string;
+    onconnect: ((this: SharedWorkerGlobalScope, ev: MessageEvent) => any) | null;
+    /** Aborts sharedWorkerGlobal. */
+    close(): void;
+    addEventListener<K extends keyof SharedWorkerGlobalScopeEventMap>(type: K, listener: (this: SharedWorkerGlobalScope, ev: SharedWorkerGlobalScopeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof SharedWorkerGlobalScopeEventMap>(type: K, listener: (this: SharedWorkerGlobalScope, ev: SharedWorkerGlobalScopeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var SharedWorkerGlobalScope: {
+    prototype: SharedWorkerGlobalScope;
+    new(): SharedWorkerGlobalScope;
+};
+
+/** Available only in secure contexts. */
+interface StorageManager {
+    estimate(): Promise<StorageEstimate>;
+    getDirectory(): Promise<FileSystemDirectoryHandle>;
+    persisted(): Promise<boolean>;
+}
+
+declare var StorageManager: {
+    prototype: StorageManager;
+    new(): StorageManager;
+};
+
+/**
+ * This Web Crypto API interface provides a number of low-level cryptographic functions. It is accessed via the Crypto.subtle properties available in a window context (via Window.crypto).
+ * Available only in secure contexts.
+ */
+interface SubtleCrypto {
+    decrypt(algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, key: CryptoKey, data: BufferSource): Promise<ArrayBuffer>;
+    deriveBits(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, length: number): Promise<ArrayBuffer>;
+    deriveKey(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, derivedKeyType: AlgorithmIdentifier | AesDerivedKeyParams | HmacImportParams | HkdfParams | Pbkdf2Params, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
+    digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise<ArrayBuffer>;
+    encrypt(algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, key: CryptoKey, data: BufferSource): Promise<ArrayBuffer>;
+    exportKey(format: "jwk", key: CryptoKey): Promise<JsonWebKey>;
+    exportKey(format: Exclude<KeyFormat, "jwk">, key: CryptoKey): Promise<ArrayBuffer>;
+    generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKeyPair>;
+    generateKey(algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKey>;
+    generateKey(algorithm: AlgorithmIdentifier, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKeyPair | CryptoKey>;
+    importKey(format: "jwk", keyData: JsonWebKey, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKey>;
+    importKey(format: Exclude<KeyFormat, "jwk">, keyData: BufferSource, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
+    sign(algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey, data: BufferSource): Promise<ArrayBuffer>;
+    unwrapKey(format: KeyFormat, wrappedKey: BufferSource, unwrappingKey: CryptoKey, unwrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, unwrappedKeyAlgorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
+    verify(algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey, signature: BufferSource, data: BufferSource): Promise<boolean>;
+    wrapKey(format: KeyFormat, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams): Promise<ArrayBuffer>;
+}
+
+declare var SubtleCrypto: {
+    prototype: SubtleCrypto;
+    new(): SubtleCrypto;
+};
+
+/** A decoder for a specific method, that is a specific character encoding, like utf-8, iso-8859-2, koi8, cp1261, gbk, etc.\xA0A decoder takes a stream of bytes as input and emits a stream of code points. For a more scalable, non-native library, see StringView \u2013 a C-like representation of strings based on typed arrays. */
+interface TextDecoder extends TextDecoderCommon {
+    /**
+     * Returns the result of running encoding's decoder. The method can be invoked zero or more times with options's stream set to true, and then once without options's stream (or set to false), to process a fragmented input. If the invocation without options's stream (or set to false) has no input, it's clearest to omit both arguments.
+     *
+     * \`\`\`
+     * var string = "", decoder = new TextDecoder(encoding), buffer;
+     * while(buffer = next_chunk()) {
+     *   string += decoder.decode(buffer, {stream:true});
+     * }
+     * string += decoder.decode(); // end-of-queue
+     * \`\`\`
+     *
+     * If the error mode is "fatal" and encoding's decoder returns error, throws a TypeError.
+     */
+    decode(input?: BufferSource, options?: TextDecodeOptions): string;
+}
+
+declare var TextDecoder: {
+    prototype: TextDecoder;
+    new(label?: string, options?: TextDecoderOptions): TextDecoder;
+};
+
+interface TextDecoderCommon {
+    /** Returns encoding's name, lowercased. */
+    readonly encoding: string;
+    /** Returns true if error mode is "fatal", otherwise false. */
+    readonly fatal: boolean;
+    /** Returns the value of ignore BOM. */
+    readonly ignoreBOM: boolean;
+}
+
+interface TextDecoderStream extends GenericTransformStream, TextDecoderCommon {
+    readonly readable: ReadableStream<string>;
+    readonly writable: WritableStream<BufferSource>;
+}
+
+declare var TextDecoderStream: {
+    prototype: TextDecoderStream;
+    new(label?: string, options?: TextDecoderOptions): TextDecoderStream;
+};
+
+/** TextEncoder takes a stream of code points as input and emits a stream of bytes. For a more scalable, non-native library, see StringView \u2013 a C-like representation of strings based on typed arrays. */
+interface TextEncoder extends TextEncoderCommon {
+    /** Returns the result of running UTF-8's encoder. */
+    encode(input?: string): Uint8Array;
+    /** Runs the UTF-8 encoder on source, stores the result of that operation into destination, and returns the progress made as an object wherein read is the number of converted code units of source and written is the number of bytes modified in destination. */
+    encodeInto(source: string, destination: Uint8Array): TextEncoderEncodeIntoResult;
+}
+
+declare var TextEncoder: {
+    prototype: TextEncoder;
+    new(): TextEncoder;
+};
+
+interface TextEncoderCommon {
+    /** Returns "utf-8". */
+    readonly encoding: string;
+}
+
+interface TextEncoderStream extends GenericTransformStream, TextEncoderCommon {
+    readonly readable: ReadableStream<Uint8Array>;
+    readonly writable: WritableStream<string>;
+}
+
+declare var TextEncoderStream: {
+    prototype: TextEncoderStream;
+    new(): TextEncoderStream;
+};
+
+/** The dimensions of a piece of text in the canvas, as created by the CanvasRenderingContext2D.measureText() method. */
+interface TextMetrics {
+    /** Returns the measurement described below. */
+    readonly actualBoundingBoxAscent: number;
+    /** Returns the measurement described below. */
+    readonly actualBoundingBoxDescent: number;
+    /** Returns the measurement described below. */
+    readonly actualBoundingBoxLeft: number;
+    /** Returns the measurement described below. */
+    readonly actualBoundingBoxRight: number;
+    /** Returns the measurement described below. */
+    readonly fontBoundingBoxAscent: number;
+    /** Returns the measurement described below. */
+    readonly fontBoundingBoxDescent: number;
+    /** Returns the measurement described below. */
+    readonly width: number;
+}
+
+declare var TextMetrics: {
+    prototype: TextMetrics;
+    new(): TextMetrics;
+};
+
+interface TransformStream<I = any, O = any> {
+    readonly readable: ReadableStream<O>;
+    readonly writable: WritableStream<I>;
+}
+
+declare var TransformStream: {
+    prototype: TransformStream;
+    new<I = any, O = any>(transformer?: Transformer<I, O>, writableStrategy?: QueuingStrategy<I>, readableStrategy?: QueuingStrategy<O>): TransformStream<I, O>;
+};
+
+interface TransformStreamDefaultController<O = any> {
+    readonly desiredSize: number | null;
+    enqueue(chunk?: O): void;
+    error(reason?: any): void;
+    terminate(): void;
+}
+
+declare var TransformStreamDefaultController: {
+    prototype: TransformStreamDefaultController;
+    new(): TransformStreamDefaultController;
+};
+
+/** The URL\xA0interface represents an object providing static methods used for creating object URLs. */
+interface URL {
+    hash: string;
+    host: string;
+    hostname: string;
+    href: string;
+    toString(): string;
+    readonly origin: string;
+    password: string;
+    pathname: string;
+    port: string;
+    protocol: string;
+    search: string;
+    readonly searchParams: URLSearchParams;
+    username: string;
+    toJSON(): string;
+}
+
+declare var URL: {
+    prototype: URL;
+    new(url: string | URL, base?: string | URL): URL;
+    createObjectURL(obj: Blob): string;
+    revokeObjectURL(url: string): void;
+};
+
+interface URLSearchParams {
+    /** Appends a specified key/value pair as a new search parameter. */
+    append(name: string, value: string): void;
+    /** Deletes the given search parameter, and its associated value, from the list of all search parameters. */
+    delete(name: string): void;
+    /** Returns the first value associated to the given search parameter. */
+    get(name: string): string | null;
+    /** Returns all the values association with a given search parameter. */
+    getAll(name: string): string[];
+    /** Returns a Boolean indicating if such a search parameter exists. */
+    has(name: string): boolean;
+    /** Sets the value associated to a given search parameter to the given value. If there were several values, delete the others. */
+    set(name: string, value: string): void;
+    sort(): void;
+    /** Returns a string containing a query string suitable for use in a URL. Does not include the question mark. */
+    toString(): string;
+    forEach(callbackfn: (value: string, key: string, parent: URLSearchParams) => void, thisArg?: any): void;
+}
+
+declare var URLSearchParams: {
+    prototype: URLSearchParams;
+    new(init?: string[][] | Record<string, string> | string | URLSearchParams): URLSearchParams;
+    toString(): string;
+};
+
+interface VideoColorSpace {
+    readonly fullRange: boolean | null;
+    readonly matrix: VideoMatrixCoefficients | null;
+    readonly primaries: VideoColorPrimaries | null;
+    readonly transfer: VideoTransferCharacteristics | null;
+    toJSON(): VideoColorSpaceInit;
+}
+
+declare var VideoColorSpace: {
+    prototype: VideoColorSpace;
+    new(init?: VideoColorSpaceInit): VideoColorSpace;
+};
+
+interface WEBGL_color_buffer_float {
+    readonly RGBA32F_EXT: 0x8814;
+    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: 0x8211;
+    readonly UNSIGNED_NORMALIZED_EXT: 0x8C17;
+}
+
+interface WEBGL_compressed_texture_astc {
+    getSupportedProfiles(): string[];
+    readonly COMPRESSED_RGBA_ASTC_4x4_KHR: 0x93B0;
+    readonly COMPRESSED_RGBA_ASTC_5x4_KHR: 0x93B1;
+    readonly COMPRESSED_RGBA_ASTC_5x5_KHR: 0x93B2;
+    readonly COMPRESSED_RGBA_ASTC_6x5_KHR: 0x93B3;
+    readonly COMPRESSED_RGBA_ASTC_6x6_KHR: 0x93B4;
+    readonly COMPRESSED_RGBA_ASTC_8x5_KHR: 0x93B5;
+    readonly COMPRESSED_RGBA_ASTC_8x6_KHR: 0x93B6;
+    readonly COMPRESSED_RGBA_ASTC_8x8_KHR: 0x93B7;
+    readonly COMPRESSED_RGBA_ASTC_10x5_KHR: 0x93B8;
+    readonly COMPRESSED_RGBA_ASTC_10x6_KHR: 0x93B9;
+    readonly COMPRESSED_RGBA_ASTC_10x8_KHR: 0x93BA;
+    readonly COMPRESSED_RGBA_ASTC_10x10_KHR: 0x93BB;
+    readonly COMPRESSED_RGBA_ASTC_12x10_KHR: 0x93BC;
+    readonly COMPRESSED_RGBA_ASTC_12x12_KHR: 0x93BD;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: 0x93D0;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: 0x93D1;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: 0x93D2;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: 0x93D3;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: 0x93D4;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: 0x93D5;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: 0x93D6;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: 0x93D7;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: 0x93D8;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: 0x93D9;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: 0x93DA;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: 0x93DB;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: 0x93DC;
+    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: 0x93DD;
+}
+
+interface WEBGL_compressed_texture_etc {
+    readonly COMPRESSED_R11_EAC: 0x9270;
+    readonly COMPRESSED_SIGNED_R11_EAC: 0x9271;
+    readonly COMPRESSED_RG11_EAC: 0x9272;
+    readonly COMPRESSED_SIGNED_RG11_EAC: 0x9273;
+    readonly COMPRESSED_RGB8_ETC2: 0x9274;
+    readonly COMPRESSED_SRGB8_ETC2: 0x9275;
+    readonly COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 0x9276;
+    readonly COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 0x9277;
+    readonly COMPRESSED_RGBA8_ETC2_EAC: 0x9278;
+    readonly COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 0x9279;
+}
+
+interface WEBGL_compressed_texture_etc1 {
+    readonly COMPRESSED_RGB_ETC1_WEBGL: 0x8D64;
+}
+
+/** The WEBGL_compressed_texture_s3tc extension is part of the WebGL API and exposes four S3TC compressed texture formats. */
+interface WEBGL_compressed_texture_s3tc {
+    readonly COMPRESSED_RGB_S3TC_DXT1_EXT: 0x83F0;
+    readonly COMPRESSED_RGBA_S3TC_DXT1_EXT: 0x83F1;
+    readonly COMPRESSED_RGBA_S3TC_DXT3_EXT: 0x83F2;
+    readonly COMPRESSED_RGBA_S3TC_DXT5_EXT: 0x83F3;
+}
+
+interface WEBGL_compressed_texture_s3tc_srgb {
+    readonly COMPRESSED_SRGB_S3TC_DXT1_EXT: 0x8C4C;
+    readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 0x8C4D;
+    readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 0x8C4E;
+    readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 0x8C4F;
+}
+
+/** The WEBGL_debug_renderer_info extension is part of the WebGL API and exposes two constants with information about the graphics driver for debugging purposes. */
+interface WEBGL_debug_renderer_info {
+    readonly UNMASKED_VENDOR_WEBGL: 0x9245;
+    readonly UNMASKED_RENDERER_WEBGL: 0x9246;
+}
+
+interface WEBGL_debug_shaders {
+    getTranslatedShaderSource(shader: WebGLShader): string;
+}
+
+/** The WEBGL_depth_texture extension is part of the WebGL API and defines 2D depth and depth-stencil textures. */
+interface WEBGL_depth_texture {
+    readonly UNSIGNED_INT_24_8_WEBGL: 0x84FA;
+}
+
+interface WEBGL_draw_buffers {
+    drawBuffersWEBGL(buffers: GLenum[]): void;
+    readonly COLOR_ATTACHMENT0_WEBGL: 0x8CE0;
+    readonly COLOR_ATTACHMENT1_WEBGL: 0x8CE1;
+    readonly COLOR_ATTACHMENT2_WEBGL: 0x8CE2;
+    readonly COLOR_ATTACHMENT3_WEBGL: 0x8CE3;
+    readonly COLOR_ATTACHMENT4_WEBGL: 0x8CE4;
+    readonly COLOR_ATTACHMENT5_WEBGL: 0x8CE5;
+    readonly COLOR_ATTACHMENT6_WEBGL: 0x8CE6;
+    readonly COLOR_ATTACHMENT7_WEBGL: 0x8CE7;
+    readonly COLOR_ATTACHMENT8_WEBGL: 0x8CE8;
+    readonly COLOR_ATTACHMENT9_WEBGL: 0x8CE9;
+    readonly COLOR_ATTACHMENT10_WEBGL: 0x8CEA;
+    readonly COLOR_ATTACHMENT11_WEBGL: 0x8CEB;
+    readonly COLOR_ATTACHMENT12_WEBGL: 0x8CEC;
+    readonly COLOR_ATTACHMENT13_WEBGL: 0x8CED;
+    readonly COLOR_ATTACHMENT14_WEBGL: 0x8CEE;
+    readonly COLOR_ATTACHMENT15_WEBGL: 0x8CEF;
+    readonly DRAW_BUFFER0_WEBGL: 0x8825;
+    readonly DRAW_BUFFER1_WEBGL: 0x8826;
+    readonly DRAW_BUFFER2_WEBGL: 0x8827;
+    readonly DRAW_BUFFER3_WEBGL: 0x8828;
+    readonly DRAW_BUFFER4_WEBGL: 0x8829;
+    readonly DRAW_BUFFER5_WEBGL: 0x882A;
+    readonly DRAW_BUFFER6_WEBGL: 0x882B;
+    readonly DRAW_BUFFER7_WEBGL: 0x882C;
+    readonly DRAW_BUFFER8_WEBGL: 0x882D;
+    readonly DRAW_BUFFER9_WEBGL: 0x882E;
+    readonly DRAW_BUFFER10_WEBGL: 0x882F;
+    readonly DRAW_BUFFER11_WEBGL: 0x8830;
+    readonly DRAW_BUFFER12_WEBGL: 0x8831;
+    readonly DRAW_BUFFER13_WEBGL: 0x8832;
+    readonly DRAW_BUFFER14_WEBGL: 0x8833;
+    readonly DRAW_BUFFER15_WEBGL: 0x8834;
+    readonly MAX_COLOR_ATTACHMENTS_WEBGL: 0x8CDF;
+    readonly MAX_DRAW_BUFFERS_WEBGL: 0x8824;
+}
+
+interface WEBGL_lose_context {
+    loseContext(): void;
+    restoreContext(): void;
+}
+
+interface WEBGL_multi_draw {
+    multiDrawArraysInstancedWEBGL(mode: GLenum, firstsList: Int32Array | GLint[], firstsOffset: GLuint, countsList: Int32Array | GLsizei[], countsOffset: GLuint, instanceCountsList: Int32Array | GLsizei[], instanceCountsOffset: GLuint, drawcount: GLsizei): void;
+    multiDrawArraysWEBGL(mode: GLenum, firstsList: Int32Array | GLint[], firstsOffset: GLuint, countsList: Int32Array | GLsizei[], countsOffset: GLuint, drawcount: GLsizei): void;
+    multiDrawElementsInstancedWEBGL(mode: GLenum, countsList: Int32Array | GLsizei[], countsOffset: GLuint, type: GLenum, offsetsList: Int32Array | GLsizei[], offsetsOffset: GLuint, instanceCountsList: Int32Array | GLsizei[], instanceCountsOffset: GLuint, drawcount: GLsizei): void;
+    multiDrawElementsWEBGL(mode: GLenum, countsList: Int32Array | GLsizei[], countsOffset: GLuint, type: GLenum, offsetsList: Int32Array | GLsizei[], offsetsOffset: GLuint, drawcount: GLsizei): void;
+}
+
+interface WebGL2RenderingContext extends WebGL2RenderingContextBase, WebGL2RenderingContextOverloads, WebGLRenderingContextBase {
+}
+
+declare var WebGL2RenderingContext: {
+    prototype: WebGL2RenderingContext;
+    new(): WebGL2RenderingContext;
+    readonly READ_BUFFER: 0x0C02;
+    readonly UNPACK_ROW_LENGTH: 0x0CF2;
+    readonly UNPACK_SKIP_ROWS: 0x0CF3;
+    readonly UNPACK_SKIP_PIXELS: 0x0CF4;
+    readonly PACK_ROW_LENGTH: 0x0D02;
+    readonly PACK_SKIP_ROWS: 0x0D03;
+    readonly PACK_SKIP_PIXELS: 0x0D04;
+    readonly COLOR: 0x1800;
+    readonly DEPTH: 0x1801;
+    readonly STENCIL: 0x1802;
+    readonly RED: 0x1903;
+    readonly RGB8: 0x8051;
+    readonly RGBA8: 0x8058;
+    readonly RGB10_A2: 0x8059;
+    readonly TEXTURE_BINDING_3D: 0x806A;
+    readonly UNPACK_SKIP_IMAGES: 0x806D;
+    readonly UNPACK_IMAGE_HEIGHT: 0x806E;
+    readonly TEXTURE_3D: 0x806F;
+    readonly TEXTURE_WRAP_R: 0x8072;
+    readonly MAX_3D_TEXTURE_SIZE: 0x8073;
+    readonly UNSIGNED_INT_2_10_10_10_REV: 0x8368;
+    readonly MAX_ELEMENTS_VERTICES: 0x80E8;
+    readonly MAX_ELEMENTS_INDICES: 0x80E9;
+    readonly TEXTURE_MIN_LOD: 0x813A;
+    readonly TEXTURE_MAX_LOD: 0x813B;
+    readonly TEXTURE_BASE_LEVEL: 0x813C;
+    readonly TEXTURE_MAX_LEVEL: 0x813D;
+    readonly MIN: 0x8007;
+    readonly MAX: 0x8008;
+    readonly DEPTH_COMPONENT24: 0x81A6;
+    readonly MAX_TEXTURE_LOD_BIAS: 0x84FD;
+    readonly TEXTURE_COMPARE_MODE: 0x884C;
+    readonly TEXTURE_COMPARE_FUNC: 0x884D;
+    readonly CURRENT_QUERY: 0x8865;
+    readonly QUERY_RESULT: 0x8866;
+    readonly QUERY_RESULT_AVAILABLE: 0x8867;
+    readonly STREAM_READ: 0x88E1;
+    readonly STREAM_COPY: 0x88E2;
+    readonly STATIC_READ: 0x88E5;
+    readonly STATIC_COPY: 0x88E6;
+    readonly DYNAMIC_READ: 0x88E9;
+    readonly DYNAMIC_COPY: 0x88EA;
+    readonly MAX_DRAW_BUFFERS: 0x8824;
+    readonly DRAW_BUFFER0: 0x8825;
+    readonly DRAW_BUFFER1: 0x8826;
+    readonly DRAW_BUFFER2: 0x8827;
+    readonly DRAW_BUFFER3: 0x8828;
+    readonly DRAW_BUFFER4: 0x8829;
+    readonly DRAW_BUFFER5: 0x882A;
+    readonly DRAW_BUFFER6: 0x882B;
+    readonly DRAW_BUFFER7: 0x882C;
+    readonly DRAW_BUFFER8: 0x882D;
+    readonly DRAW_BUFFER9: 0x882E;
+    readonly DRAW_BUFFER10: 0x882F;
+    readonly DRAW_BUFFER11: 0x8830;
+    readonly DRAW_BUFFER12: 0x8831;
+    readonly DRAW_BUFFER13: 0x8832;
+    readonly DRAW_BUFFER14: 0x8833;
+    readonly DRAW_BUFFER15: 0x8834;
+    readonly MAX_FRAGMENT_UNIFORM_COMPONENTS: 0x8B49;
+    readonly MAX_VERTEX_UNIFORM_COMPONENTS: 0x8B4A;
+    readonly SAMPLER_3D: 0x8B5F;
+    readonly SAMPLER_2D_SHADOW: 0x8B62;
+    readonly FRAGMENT_SHADER_DERIVATIVE_HINT: 0x8B8B;
+    readonly PIXEL_PACK_BUFFER: 0x88EB;
+    readonly PIXEL_UNPACK_BUFFER: 0x88EC;
+    readonly PIXEL_PACK_BUFFER_BINDING: 0x88ED;
+    readonly PIXEL_UNPACK_BUFFER_BINDING: 0x88EF;
+    readonly FLOAT_MAT2x3: 0x8B65;
+    readonly FLOAT_MAT2x4: 0x8B66;
+    readonly FLOAT_MAT3x2: 0x8B67;
+    readonly FLOAT_MAT3x4: 0x8B68;
+    readonly FLOAT_MAT4x2: 0x8B69;
+    readonly FLOAT_MAT4x3: 0x8B6A;
+    readonly SRGB: 0x8C40;
+    readonly SRGB8: 0x8C41;
+    readonly SRGB8_ALPHA8: 0x8C43;
+    readonly COMPARE_REF_TO_TEXTURE: 0x884E;
+    readonly RGBA32F: 0x8814;
+    readonly RGB32F: 0x8815;
+    readonly RGBA16F: 0x881A;
+    readonly RGB16F: 0x881B;
+    readonly VERTEX_ATTRIB_ARRAY_INTEGER: 0x88FD;
+    readonly MAX_ARRAY_TEXTURE_LAYERS: 0x88FF;
+    readonly MIN_PROGRAM_TEXEL_OFFSET: 0x8904;
+    readonly MAX_PROGRAM_TEXEL_OFFSET: 0x8905;
+    readonly MAX_VARYING_COMPONENTS: 0x8B4B;
+    readonly TEXTURE_2D_ARRAY: 0x8C1A;
+    readonly TEXTURE_BINDING_2D_ARRAY: 0x8C1D;
+    readonly R11F_G11F_B10F: 0x8C3A;
+    readonly UNSIGNED_INT_10F_11F_11F_REV: 0x8C3B;
+    readonly RGB9_E5: 0x8C3D;
+    readonly UNSIGNED_INT_5_9_9_9_REV: 0x8C3E;
+    readonly TRANSFORM_FEEDBACK_BUFFER_MODE: 0x8C7F;
+    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: 0x8C80;
+    readonly TRANSFORM_FEEDBACK_VARYINGS: 0x8C83;
+    readonly TRANSFORM_FEEDBACK_BUFFER_START: 0x8C84;
+    readonly TRANSFORM_FEEDBACK_BUFFER_SIZE: 0x8C85;
+    readonly TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 0x8C88;
+    readonly RASTERIZER_DISCARD: 0x8C89;
+    readonly MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: 0x8C8A;
+    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: 0x8C8B;
+    readonly INTERLEAVED_ATTRIBS: 0x8C8C;
+    readonly SEPARATE_ATTRIBS: 0x8C8D;
+    readonly TRANSFORM_FEEDBACK_BUFFER: 0x8C8E;
+    readonly TRANSFORM_FEEDBACK_BUFFER_BINDING: 0x8C8F;
+    readonly RGBA32UI: 0x8D70;
+    readonly RGB32UI: 0x8D71;
+    readonly RGBA16UI: 0x8D76;
+    readonly RGB16UI: 0x8D77;
+    readonly RGBA8UI: 0x8D7C;
+    readonly RGB8UI: 0x8D7D;
+    readonly RGBA32I: 0x8D82;
+    readonly RGB32I: 0x8D83;
+    readonly RGBA16I: 0x8D88;
+    readonly RGB16I: 0x8D89;
+    readonly RGBA8I: 0x8D8E;
+    readonly RGB8I: 0x8D8F;
+    readonly RED_INTEGER: 0x8D94;
+    readonly RGB_INTEGER: 0x8D98;
+    readonly RGBA_INTEGER: 0x8D99;
+    readonly SAMPLER_2D_ARRAY: 0x8DC1;
+    readonly SAMPLER_2D_ARRAY_SHADOW: 0x8DC4;
+    readonly SAMPLER_CUBE_SHADOW: 0x8DC5;
+    readonly UNSIGNED_INT_VEC2: 0x8DC6;
+    readonly UNSIGNED_INT_VEC3: 0x8DC7;
+    readonly UNSIGNED_INT_VEC4: 0x8DC8;
+    readonly INT_SAMPLER_2D: 0x8DCA;
+    readonly INT_SAMPLER_3D: 0x8DCB;
+    readonly INT_SAMPLER_CUBE: 0x8DCC;
+    readonly INT_SAMPLER_2D_ARRAY: 0x8DCF;
+    readonly UNSIGNED_INT_SAMPLER_2D: 0x8DD2;
+    readonly UNSIGNED_INT_SAMPLER_3D: 0x8DD3;
+    readonly UNSIGNED_INT_SAMPLER_CUBE: 0x8DD4;
+    readonly UNSIGNED_INT_SAMPLER_2D_ARRAY: 0x8DD7;
+    readonly DEPTH_COMPONENT32F: 0x8CAC;
+    readonly DEPTH32F_STENCIL8: 0x8CAD;
+    readonly FLOAT_32_UNSIGNED_INT_24_8_REV: 0x8DAD;
+    readonly FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: 0x8210;
+    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: 0x8211;
+    readonly FRAMEBUFFER_ATTACHMENT_RED_SIZE: 0x8212;
+    readonly FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 0x8213;
+    readonly FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 0x8214;
+    readonly FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 0x8215;
+    readonly FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 0x8216;
+    readonly FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 0x8217;
+    readonly FRAMEBUFFER_DEFAULT: 0x8218;
+    readonly UNSIGNED_INT_24_8: 0x84FA;
+    readonly DEPTH24_STENCIL8: 0x88F0;
+    readonly UNSIGNED_NORMALIZED: 0x8C17;
+    readonly DRAW_FRAMEBUFFER_BINDING: 0x8CA6;
+    readonly READ_FRAMEBUFFER: 0x8CA8;
+    readonly DRAW_FRAMEBUFFER: 0x8CA9;
+    readonly READ_FRAMEBUFFER_BINDING: 0x8CAA;
+    readonly RENDERBUFFER_SAMPLES: 0x8CAB;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: 0x8CD4;
+    readonly MAX_COLOR_ATTACHMENTS: 0x8CDF;
+    readonly COLOR_ATTACHMENT1: 0x8CE1;
+    readonly COLOR_ATTACHMENT2: 0x8CE2;
+    readonly COLOR_ATTACHMENT3: 0x8CE3;
+    readonly COLOR_ATTACHMENT4: 0x8CE4;
+    readonly COLOR_ATTACHMENT5: 0x8CE5;
+    readonly COLOR_ATTACHMENT6: 0x8CE6;
+    readonly COLOR_ATTACHMENT7: 0x8CE7;
+    readonly COLOR_ATTACHMENT8: 0x8CE8;
+    readonly COLOR_ATTACHMENT9: 0x8CE9;
+    readonly COLOR_ATTACHMENT10: 0x8CEA;
+    readonly COLOR_ATTACHMENT11: 0x8CEB;
+    readonly COLOR_ATTACHMENT12: 0x8CEC;
+    readonly COLOR_ATTACHMENT13: 0x8CED;
+    readonly COLOR_ATTACHMENT14: 0x8CEE;
+    readonly COLOR_ATTACHMENT15: 0x8CEF;
+    readonly FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: 0x8D56;
+    readonly MAX_SAMPLES: 0x8D57;
+    readonly HALF_FLOAT: 0x140B;
+    readonly RG: 0x8227;
+    readonly RG_INTEGER: 0x8228;
+    readonly R8: 0x8229;
+    readonly RG8: 0x822B;
+    readonly R16F: 0x822D;
+    readonly R32F: 0x822E;
+    readonly RG16F: 0x822F;
+    readonly RG32F: 0x8230;
+    readonly R8I: 0x8231;
+    readonly R8UI: 0x8232;
+    readonly R16I: 0x8233;
+    readonly R16UI: 0x8234;
+    readonly R32I: 0x8235;
+    readonly R32UI: 0x8236;
+    readonly RG8I: 0x8237;
+    readonly RG8UI: 0x8238;
+    readonly RG16I: 0x8239;
+    readonly RG16UI: 0x823A;
+    readonly RG32I: 0x823B;
+    readonly RG32UI: 0x823C;
+    readonly VERTEX_ARRAY_BINDING: 0x85B5;
+    readonly R8_SNORM: 0x8F94;
+    readonly RG8_SNORM: 0x8F95;
+    readonly RGB8_SNORM: 0x8F96;
+    readonly RGBA8_SNORM: 0x8F97;
+    readonly SIGNED_NORMALIZED: 0x8F9C;
+    readonly COPY_READ_BUFFER: 0x8F36;
+    readonly COPY_WRITE_BUFFER: 0x8F37;
+    readonly COPY_READ_BUFFER_BINDING: 0x8F36;
+    readonly COPY_WRITE_BUFFER_BINDING: 0x8F37;
+    readonly UNIFORM_BUFFER: 0x8A11;
+    readonly UNIFORM_BUFFER_BINDING: 0x8A28;
+    readonly UNIFORM_BUFFER_START: 0x8A29;
+    readonly UNIFORM_BUFFER_SIZE: 0x8A2A;
+    readonly MAX_VERTEX_UNIFORM_BLOCKS: 0x8A2B;
+    readonly MAX_FRAGMENT_UNIFORM_BLOCKS: 0x8A2D;
+    readonly MAX_COMBINED_UNIFORM_BLOCKS: 0x8A2E;
+    readonly MAX_UNIFORM_BUFFER_BINDINGS: 0x8A2F;
+    readonly MAX_UNIFORM_BLOCK_SIZE: 0x8A30;
+    readonly MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: 0x8A31;
+    readonly MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: 0x8A33;
+    readonly UNIFORM_BUFFER_OFFSET_ALIGNMENT: 0x8A34;
+    readonly ACTIVE_UNIFORM_BLOCKS: 0x8A36;
+    readonly UNIFORM_TYPE: 0x8A37;
+    readonly UNIFORM_SIZE: 0x8A38;
+    readonly UNIFORM_BLOCK_INDEX: 0x8A3A;
+    readonly UNIFORM_OFFSET: 0x8A3B;
+    readonly UNIFORM_ARRAY_STRIDE: 0x8A3C;
+    readonly UNIFORM_MATRIX_STRIDE: 0x8A3D;
+    readonly UNIFORM_IS_ROW_MAJOR: 0x8A3E;
+    readonly UNIFORM_BLOCK_BINDING: 0x8A3F;
+    readonly UNIFORM_BLOCK_DATA_SIZE: 0x8A40;
+    readonly UNIFORM_BLOCK_ACTIVE_UNIFORMS: 0x8A42;
+    readonly UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: 0x8A43;
+    readonly UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: 0x8A44;
+    readonly UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: 0x8A46;
+    readonly INVALID_INDEX: 0xFFFFFFFF;
+    readonly MAX_VERTEX_OUTPUT_COMPONENTS: 0x9122;
+    readonly MAX_FRAGMENT_INPUT_COMPONENTS: 0x9125;
+    readonly MAX_SERVER_WAIT_TIMEOUT: 0x9111;
+    readonly OBJECT_TYPE: 0x9112;
+    readonly SYNC_CONDITION: 0x9113;
+    readonly SYNC_STATUS: 0x9114;
+    readonly SYNC_FLAGS: 0x9115;
+    readonly SYNC_FENCE: 0x9116;
+    readonly SYNC_GPU_COMMANDS_COMPLETE: 0x9117;
+    readonly UNSIGNALED: 0x9118;
+    readonly SIGNALED: 0x9119;
+    readonly ALREADY_SIGNALED: 0x911A;
+    readonly TIMEOUT_EXPIRED: 0x911B;
+    readonly CONDITION_SATISFIED: 0x911C;
+    readonly WAIT_FAILED: 0x911D;
+    readonly SYNC_FLUSH_COMMANDS_BIT: 0x00000001;
+    readonly VERTEX_ATTRIB_ARRAY_DIVISOR: 0x88FE;
+    readonly ANY_SAMPLES_PASSED: 0x8C2F;
+    readonly ANY_SAMPLES_PASSED_CONSERVATIVE: 0x8D6A;
+    readonly SAMPLER_BINDING: 0x8919;
+    readonly RGB10_A2UI: 0x906F;
+    readonly INT_2_10_10_10_REV: 0x8D9F;
+    readonly TRANSFORM_FEEDBACK: 0x8E22;
+    readonly TRANSFORM_FEEDBACK_PAUSED: 0x8E23;
+    readonly TRANSFORM_FEEDBACK_ACTIVE: 0x8E24;
+    readonly TRANSFORM_FEEDBACK_BINDING: 0x8E25;
+    readonly TEXTURE_IMMUTABLE_FORMAT: 0x912F;
+    readonly MAX_ELEMENT_INDEX: 0x8D6B;
+    readonly TEXTURE_IMMUTABLE_LEVELS: 0x82DF;
+    readonly TIMEOUT_IGNORED: -1;
+    readonly MAX_CLIENT_WAIT_TIMEOUT_WEBGL: 0x9247;
+    readonly DEPTH_BUFFER_BIT: 0x00000100;
+    readonly STENCIL_BUFFER_BIT: 0x00000400;
+    readonly COLOR_BUFFER_BIT: 0x00004000;
+    readonly POINTS: 0x0000;
+    readonly LINES: 0x0001;
+    readonly LINE_LOOP: 0x0002;
+    readonly LINE_STRIP: 0x0003;
+    readonly TRIANGLES: 0x0004;
+    readonly TRIANGLE_STRIP: 0x0005;
+    readonly TRIANGLE_FAN: 0x0006;
+    readonly ZERO: 0;
+    readonly ONE: 1;
+    readonly SRC_COLOR: 0x0300;
+    readonly ONE_MINUS_SRC_COLOR: 0x0301;
+    readonly SRC_ALPHA: 0x0302;
+    readonly ONE_MINUS_SRC_ALPHA: 0x0303;
+    readonly DST_ALPHA: 0x0304;
+    readonly ONE_MINUS_DST_ALPHA: 0x0305;
+    readonly DST_COLOR: 0x0306;
+    readonly ONE_MINUS_DST_COLOR: 0x0307;
+    readonly SRC_ALPHA_SATURATE: 0x0308;
+    readonly FUNC_ADD: 0x8006;
+    readonly BLEND_EQUATION: 0x8009;
+    readonly BLEND_EQUATION_RGB: 0x8009;
+    readonly BLEND_EQUATION_ALPHA: 0x883D;
+    readonly FUNC_SUBTRACT: 0x800A;
+    readonly FUNC_REVERSE_SUBTRACT: 0x800B;
+    readonly BLEND_DST_RGB: 0x80C8;
+    readonly BLEND_SRC_RGB: 0x80C9;
+    readonly BLEND_DST_ALPHA: 0x80CA;
+    readonly BLEND_SRC_ALPHA: 0x80CB;
+    readonly CONSTANT_COLOR: 0x8001;
+    readonly ONE_MINUS_CONSTANT_COLOR: 0x8002;
+    readonly CONSTANT_ALPHA: 0x8003;
+    readonly ONE_MINUS_CONSTANT_ALPHA: 0x8004;
+    readonly BLEND_COLOR: 0x8005;
+    readonly ARRAY_BUFFER: 0x8892;
+    readonly ELEMENT_ARRAY_BUFFER: 0x8893;
+    readonly ARRAY_BUFFER_BINDING: 0x8894;
+    readonly ELEMENT_ARRAY_BUFFER_BINDING: 0x8895;
+    readonly STREAM_DRAW: 0x88E0;
+    readonly STATIC_DRAW: 0x88E4;
+    readonly DYNAMIC_DRAW: 0x88E8;
+    readonly BUFFER_SIZE: 0x8764;
+    readonly BUFFER_USAGE: 0x8765;
+    readonly CURRENT_VERTEX_ATTRIB: 0x8626;
+    readonly FRONT: 0x0404;
+    readonly BACK: 0x0405;
+    readonly FRONT_AND_BACK: 0x0408;
+    readonly CULL_FACE: 0x0B44;
+    readonly BLEND: 0x0BE2;
+    readonly DITHER: 0x0BD0;
+    readonly STENCIL_TEST: 0x0B90;
+    readonly DEPTH_TEST: 0x0B71;
+    readonly SCISSOR_TEST: 0x0C11;
+    readonly POLYGON_OFFSET_FILL: 0x8037;
+    readonly SAMPLE_ALPHA_TO_COVERAGE: 0x809E;
+    readonly SAMPLE_COVERAGE: 0x80A0;
+    readonly NO_ERROR: 0;
+    readonly INVALID_ENUM: 0x0500;
+    readonly INVALID_VALUE: 0x0501;
+    readonly INVALID_OPERATION: 0x0502;
+    readonly OUT_OF_MEMORY: 0x0505;
+    readonly CW: 0x0900;
+    readonly CCW: 0x0901;
+    readonly LINE_WIDTH: 0x0B21;
+    readonly ALIASED_POINT_SIZE_RANGE: 0x846D;
+    readonly ALIASED_LINE_WIDTH_RANGE: 0x846E;
+    readonly CULL_FACE_MODE: 0x0B45;
+    readonly FRONT_FACE: 0x0B46;
+    readonly DEPTH_RANGE: 0x0B70;
+    readonly DEPTH_WRITEMASK: 0x0B72;
+    readonly DEPTH_CLEAR_VALUE: 0x0B73;
+    readonly DEPTH_FUNC: 0x0B74;
+    readonly STENCIL_CLEAR_VALUE: 0x0B91;
+    readonly STENCIL_FUNC: 0x0B92;
+    readonly STENCIL_FAIL: 0x0B94;
+    readonly STENCIL_PASS_DEPTH_FAIL: 0x0B95;
+    readonly STENCIL_PASS_DEPTH_PASS: 0x0B96;
+    readonly STENCIL_REF: 0x0B97;
+    readonly STENCIL_VALUE_MASK: 0x0B93;
+    readonly STENCIL_WRITEMASK: 0x0B98;
+    readonly STENCIL_BACK_FUNC: 0x8800;
+    readonly STENCIL_BACK_FAIL: 0x8801;
+    readonly STENCIL_BACK_PASS_DEPTH_FAIL: 0x8802;
+    readonly STENCIL_BACK_PASS_DEPTH_PASS: 0x8803;
+    readonly STENCIL_BACK_REF: 0x8CA3;
+    readonly STENCIL_BACK_VALUE_MASK: 0x8CA4;
+    readonly STENCIL_BACK_WRITEMASK: 0x8CA5;
+    readonly VIEWPORT: 0x0BA2;
+    readonly SCISSOR_BOX: 0x0C10;
+    readonly COLOR_CLEAR_VALUE: 0x0C22;
+    readonly COLOR_WRITEMASK: 0x0C23;
+    readonly UNPACK_ALIGNMENT: 0x0CF5;
+    readonly PACK_ALIGNMENT: 0x0D05;
+    readonly MAX_TEXTURE_SIZE: 0x0D33;
+    readonly MAX_VIEWPORT_DIMS: 0x0D3A;
+    readonly SUBPIXEL_BITS: 0x0D50;
+    readonly RED_BITS: 0x0D52;
+    readonly GREEN_BITS: 0x0D53;
+    readonly BLUE_BITS: 0x0D54;
+    readonly ALPHA_BITS: 0x0D55;
+    readonly DEPTH_BITS: 0x0D56;
+    readonly STENCIL_BITS: 0x0D57;
+    readonly POLYGON_OFFSET_UNITS: 0x2A00;
+    readonly POLYGON_OFFSET_FACTOR: 0x8038;
+    readonly TEXTURE_BINDING_2D: 0x8069;
+    readonly SAMPLE_BUFFERS: 0x80A8;
+    readonly SAMPLES: 0x80A9;
+    readonly SAMPLE_COVERAGE_VALUE: 0x80AA;
+    readonly SAMPLE_COVERAGE_INVERT: 0x80AB;
+    readonly COMPRESSED_TEXTURE_FORMATS: 0x86A3;
+    readonly DONT_CARE: 0x1100;
+    readonly FASTEST: 0x1101;
+    readonly NICEST: 0x1102;
+    readonly GENERATE_MIPMAP_HINT: 0x8192;
+    readonly BYTE: 0x1400;
+    readonly UNSIGNED_BYTE: 0x1401;
+    readonly SHORT: 0x1402;
+    readonly UNSIGNED_SHORT: 0x1403;
+    readonly INT: 0x1404;
+    readonly UNSIGNED_INT: 0x1405;
+    readonly FLOAT: 0x1406;
+    readonly DEPTH_COMPONENT: 0x1902;
+    readonly ALPHA: 0x1906;
+    readonly RGB: 0x1907;
+    readonly RGBA: 0x1908;
+    readonly LUMINANCE: 0x1909;
+    readonly LUMINANCE_ALPHA: 0x190A;
+    readonly UNSIGNED_SHORT_4_4_4_4: 0x8033;
+    readonly UNSIGNED_SHORT_5_5_5_1: 0x8034;
+    readonly UNSIGNED_SHORT_5_6_5: 0x8363;
+    readonly FRAGMENT_SHADER: 0x8B30;
+    readonly VERTEX_SHADER: 0x8B31;
+    readonly MAX_VERTEX_ATTRIBS: 0x8869;
+    readonly MAX_VERTEX_UNIFORM_VECTORS: 0x8DFB;
+    readonly MAX_VARYING_VECTORS: 0x8DFC;
+    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: 0x8B4D;
+    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: 0x8B4C;
+    readonly MAX_TEXTURE_IMAGE_UNITS: 0x8872;
+    readonly MAX_FRAGMENT_UNIFORM_VECTORS: 0x8DFD;
+    readonly SHADER_TYPE: 0x8B4F;
+    readonly DELETE_STATUS: 0x8B80;
+    readonly LINK_STATUS: 0x8B82;
+    readonly VALIDATE_STATUS: 0x8B83;
+    readonly ATTACHED_SHADERS: 0x8B85;
+    readonly ACTIVE_UNIFORMS: 0x8B86;
+    readonly ACTIVE_ATTRIBUTES: 0x8B89;
+    readonly SHADING_LANGUAGE_VERSION: 0x8B8C;
+    readonly CURRENT_PROGRAM: 0x8B8D;
+    readonly NEVER: 0x0200;
+    readonly LESS: 0x0201;
+    readonly EQUAL: 0x0202;
+    readonly LEQUAL: 0x0203;
+    readonly GREATER: 0x0204;
+    readonly NOTEQUAL: 0x0205;
+    readonly GEQUAL: 0x0206;
+    readonly ALWAYS: 0x0207;
+    readonly KEEP: 0x1E00;
+    readonly REPLACE: 0x1E01;
+    readonly INCR: 0x1E02;
+    readonly DECR: 0x1E03;
+    readonly INVERT: 0x150A;
+    readonly INCR_WRAP: 0x8507;
+    readonly DECR_WRAP: 0x8508;
+    readonly VENDOR: 0x1F00;
+    readonly RENDERER: 0x1F01;
+    readonly VERSION: 0x1F02;
+    readonly NEAREST: 0x2600;
+    readonly LINEAR: 0x2601;
+    readonly NEAREST_MIPMAP_NEAREST: 0x2700;
+    readonly LINEAR_MIPMAP_NEAREST: 0x2701;
+    readonly NEAREST_MIPMAP_LINEAR: 0x2702;
+    readonly LINEAR_MIPMAP_LINEAR: 0x2703;
+    readonly TEXTURE_MAG_FILTER: 0x2800;
+    readonly TEXTURE_MIN_FILTER: 0x2801;
+    readonly TEXTURE_WRAP_S: 0x2802;
+    readonly TEXTURE_WRAP_T: 0x2803;
+    readonly TEXTURE_2D: 0x0DE1;
+    readonly TEXTURE: 0x1702;
+    readonly TEXTURE_CUBE_MAP: 0x8513;
+    readonly TEXTURE_BINDING_CUBE_MAP: 0x8514;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_X: 0x8515;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: 0x8516;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: 0x8517;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: 0x8518;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: 0x8519;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: 0x851A;
+    readonly MAX_CUBE_MAP_TEXTURE_SIZE: 0x851C;
+    readonly TEXTURE0: 0x84C0;
+    readonly TEXTURE1: 0x84C1;
+    readonly TEXTURE2: 0x84C2;
+    readonly TEXTURE3: 0x84C3;
+    readonly TEXTURE4: 0x84C4;
+    readonly TEXTURE5: 0x84C5;
+    readonly TEXTURE6: 0x84C6;
+    readonly TEXTURE7: 0x84C7;
+    readonly TEXTURE8: 0x84C8;
+    readonly TEXTURE9: 0x84C9;
+    readonly TEXTURE10: 0x84CA;
+    readonly TEXTURE11: 0x84CB;
+    readonly TEXTURE12: 0x84CC;
+    readonly TEXTURE13: 0x84CD;
+    readonly TEXTURE14: 0x84CE;
+    readonly TEXTURE15: 0x84CF;
+    readonly TEXTURE16: 0x84D0;
+    readonly TEXTURE17: 0x84D1;
+    readonly TEXTURE18: 0x84D2;
+    readonly TEXTURE19: 0x84D3;
+    readonly TEXTURE20: 0x84D4;
+    readonly TEXTURE21: 0x84D5;
+    readonly TEXTURE22: 0x84D6;
+    readonly TEXTURE23: 0x84D7;
+    readonly TEXTURE24: 0x84D8;
+    readonly TEXTURE25: 0x84D9;
+    readonly TEXTURE26: 0x84DA;
+    readonly TEXTURE27: 0x84DB;
+    readonly TEXTURE28: 0x84DC;
+    readonly TEXTURE29: 0x84DD;
+    readonly TEXTURE30: 0x84DE;
+    readonly TEXTURE31: 0x84DF;
+    readonly ACTIVE_TEXTURE: 0x84E0;
+    readonly REPEAT: 0x2901;
+    readonly CLAMP_TO_EDGE: 0x812F;
+    readonly MIRRORED_REPEAT: 0x8370;
+    readonly FLOAT_VEC2: 0x8B50;
+    readonly FLOAT_VEC3: 0x8B51;
+    readonly FLOAT_VEC4: 0x8B52;
+    readonly INT_VEC2: 0x8B53;
+    readonly INT_VEC3: 0x8B54;
+    readonly INT_VEC4: 0x8B55;
+    readonly BOOL: 0x8B56;
+    readonly BOOL_VEC2: 0x8B57;
+    readonly BOOL_VEC3: 0x8B58;
+    readonly BOOL_VEC4: 0x8B59;
+    readonly FLOAT_MAT2: 0x8B5A;
+    readonly FLOAT_MAT3: 0x8B5B;
+    readonly FLOAT_MAT4: 0x8B5C;
+    readonly SAMPLER_2D: 0x8B5E;
+    readonly SAMPLER_CUBE: 0x8B60;
+    readonly VERTEX_ATTRIB_ARRAY_ENABLED: 0x8622;
+    readonly VERTEX_ATTRIB_ARRAY_SIZE: 0x8623;
+    readonly VERTEX_ATTRIB_ARRAY_STRIDE: 0x8624;
+    readonly VERTEX_ATTRIB_ARRAY_TYPE: 0x8625;
+    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: 0x886A;
+    readonly VERTEX_ATTRIB_ARRAY_POINTER: 0x8645;
+    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 0x889F;
+    readonly IMPLEMENTATION_COLOR_READ_TYPE: 0x8B9A;
+    readonly IMPLEMENTATION_COLOR_READ_FORMAT: 0x8B9B;
+    readonly COMPILE_STATUS: 0x8B81;
+    readonly LOW_FLOAT: 0x8DF0;
+    readonly MEDIUM_FLOAT: 0x8DF1;
+    readonly HIGH_FLOAT: 0x8DF2;
+    readonly LOW_INT: 0x8DF3;
+    readonly MEDIUM_INT: 0x8DF4;
+    readonly HIGH_INT: 0x8DF5;
+    readonly FRAMEBUFFER: 0x8D40;
+    readonly RENDERBUFFER: 0x8D41;
+    readonly RGBA4: 0x8056;
+    readonly RGB5_A1: 0x8057;
+    readonly RGB565: 0x8D62;
+    readonly DEPTH_COMPONENT16: 0x81A5;
+    readonly STENCIL_INDEX8: 0x8D48;
+    readonly DEPTH_STENCIL: 0x84F9;
+    readonly RENDERBUFFER_WIDTH: 0x8D42;
+    readonly RENDERBUFFER_HEIGHT: 0x8D43;
+    readonly RENDERBUFFER_INTERNAL_FORMAT: 0x8D44;
+    readonly RENDERBUFFER_RED_SIZE: 0x8D50;
+    readonly RENDERBUFFER_GREEN_SIZE: 0x8D51;
+    readonly RENDERBUFFER_BLUE_SIZE: 0x8D52;
+    readonly RENDERBUFFER_ALPHA_SIZE: 0x8D53;
+    readonly RENDERBUFFER_DEPTH_SIZE: 0x8D54;
+    readonly RENDERBUFFER_STENCIL_SIZE: 0x8D55;
+    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 0x8CD0;
+    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 0x8CD1;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 0x8CD2;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 0x8CD3;
+    readonly COLOR_ATTACHMENT0: 0x8CE0;
+    readonly DEPTH_ATTACHMENT: 0x8D00;
+    readonly STENCIL_ATTACHMENT: 0x8D20;
+    readonly DEPTH_STENCIL_ATTACHMENT: 0x821A;
+    readonly NONE: 0;
+    readonly FRAMEBUFFER_COMPLETE: 0x8CD5;
+    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 0x8CD6;
+    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 0x8CD7;
+    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 0x8CD9;
+    readonly FRAMEBUFFER_UNSUPPORTED: 0x8CDD;
+    readonly FRAMEBUFFER_BINDING: 0x8CA6;
+    readonly RENDERBUFFER_BINDING: 0x8CA7;
+    readonly MAX_RENDERBUFFER_SIZE: 0x84E8;
+    readonly INVALID_FRAMEBUFFER_OPERATION: 0x0506;
+    readonly UNPACK_FLIP_Y_WEBGL: 0x9240;
+    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: 0x9241;
+    readonly CONTEXT_LOST_WEBGL: 0x9242;
+    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: 0x9243;
+    readonly BROWSER_DEFAULT_WEBGL: 0x9244;
+};
+
+interface WebGL2RenderingContextBase {
+    beginQuery(target: GLenum, query: WebGLQuery): void;
+    beginTransformFeedback(primitiveMode: GLenum): void;
+    bindBufferBase(target: GLenum, index: GLuint, buffer: WebGLBuffer | null): void;
+    bindBufferRange(target: GLenum, index: GLuint, buffer: WebGLBuffer | null, offset: GLintptr, size: GLsizeiptr): void;
+    bindSampler(unit: GLuint, sampler: WebGLSampler | null): void;
+    bindTransformFeedback(target: GLenum, tf: WebGLTransformFeedback | null): void;
+    bindVertexArray(array: WebGLVertexArrayObject | null): void;
+    blitFramebuffer(srcX0: GLint, srcY0: GLint, srcX1: GLint, srcY1: GLint, dstX0: GLint, dstY0: GLint, dstX1: GLint, dstY1: GLint, mask: GLbitfield, filter: GLenum): void;
+    clearBufferfi(buffer: GLenum, drawbuffer: GLint, depth: GLfloat, stencil: GLint): void;
+    clearBufferfv(buffer: GLenum, drawbuffer: GLint, values: Float32List, srcOffset?: GLuint): void;
+    clearBufferiv(buffer: GLenum, drawbuffer: GLint, values: Int32List, srcOffset?: GLuint): void;
+    clearBufferuiv(buffer: GLenum, drawbuffer: GLint, values: Uint32List, srcOffset?: GLuint): void;
+    clientWaitSync(sync: WebGLSync, flags: GLbitfield, timeout: GLuint64): GLenum;
+    compressedTexImage3D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, imageSize: GLsizei, offset: GLintptr): void;
+    compressedTexImage3D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
+    compressedTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, imageSize: GLsizei, offset: GLintptr): void;
+    compressedTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
+    copyBufferSubData(readTarget: GLenum, writeTarget: GLenum, readOffset: GLintptr, writeOffset: GLintptr, size: GLsizeiptr): void;
+    copyTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
+    createQuery(): WebGLQuery | null;
+    createSampler(): WebGLSampler | null;
+    createTransformFeedback(): WebGLTransformFeedback | null;
+    createVertexArray(): WebGLVertexArrayObject | null;
+    deleteQuery(query: WebGLQuery | null): void;
+    deleteSampler(sampler: WebGLSampler | null): void;
+    deleteSync(sync: WebGLSync | null): void;
+    deleteTransformFeedback(tf: WebGLTransformFeedback | null): void;
+    deleteVertexArray(vertexArray: WebGLVertexArrayObject | null): void;
+    drawArraysInstanced(mode: GLenum, first: GLint, count: GLsizei, instanceCount: GLsizei): void;
+    drawBuffers(buffers: GLenum[]): void;
+    drawElementsInstanced(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr, instanceCount: GLsizei): void;
+    drawRangeElements(mode: GLenum, start: GLuint, end: GLuint, count: GLsizei, type: GLenum, offset: GLintptr): void;
+    endQuery(target: GLenum): void;
+    endTransformFeedback(): void;
+    fenceSync(condition: GLenum, flags: GLbitfield): WebGLSync | null;
+    framebufferTextureLayer(target: GLenum, attachment: GLenum, texture: WebGLTexture | null, level: GLint, layer: GLint): void;
+    getActiveUniformBlockName(program: WebGLProgram, uniformBlockIndex: GLuint): string | null;
+    getActiveUniformBlockParameter(program: WebGLProgram, uniformBlockIndex: GLuint, pname: GLenum): any;
+    getActiveUniforms(program: WebGLProgram, uniformIndices: GLuint[], pname: GLenum): any;
+    getBufferSubData(target: GLenum, srcByteOffset: GLintptr, dstBuffer: ArrayBufferView, dstOffset?: GLuint, length?: GLuint): void;
+    getFragDataLocation(program: WebGLProgram, name: string): GLint;
+    getIndexedParameter(target: GLenum, index: GLuint): any;
+    getInternalformatParameter(target: GLenum, internalformat: GLenum, pname: GLenum): any;
+    getQuery(target: GLenum, pname: GLenum): WebGLQuery | null;
+    getQueryParameter(query: WebGLQuery, pname: GLenum): any;
+    getSamplerParameter(sampler: WebGLSampler, pname: GLenum): any;
+    getSyncParameter(sync: WebGLSync, pname: GLenum): any;
+    getTransformFeedbackVarying(program: WebGLProgram, index: GLuint): WebGLActiveInfo | null;
+    getUniformBlockIndex(program: WebGLProgram, uniformBlockName: string): GLuint;
+    getUniformIndices(program: WebGLProgram, uniformNames: string[]): GLuint[] | null;
+    invalidateFramebuffer(target: GLenum, attachments: GLenum[]): void;
+    invalidateSubFramebuffer(target: GLenum, attachments: GLenum[], x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
+    isQuery(query: WebGLQuery | null): GLboolean;
+    isSampler(sampler: WebGLSampler | null): GLboolean;
+    isSync(sync: WebGLSync | null): GLboolean;
+    isTransformFeedback(tf: WebGLTransformFeedback | null): GLboolean;
+    isVertexArray(vertexArray: WebGLVertexArrayObject | null): GLboolean;
+    pauseTransformFeedback(): void;
+    readBuffer(src: GLenum): void;
+    renderbufferStorageMultisample(target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei): void;
+    resumeTransformFeedback(): void;
+    samplerParameterf(sampler: WebGLSampler, pname: GLenum, param: GLfloat): void;
+    samplerParameteri(sampler: WebGLSampler, pname: GLenum, param: GLint): void;
+    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
+    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
+    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView | null): void;
+    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint): void;
+    texStorage2D(target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei): void;
+    texStorage3D(target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei): void;
+    texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
+    texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, source: TexImageSource): void;
+    texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, srcData: ArrayBufferView | null, srcOffset?: GLuint): void;
+    transformFeedbackVaryings(program: WebGLProgram, varyings: string[], bufferMode: GLenum): void;
+    uniform1ui(location: WebGLUniformLocation | null, v0: GLuint): void;
+    uniform1uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform2ui(location: WebGLUniformLocation | null, v0: GLuint, v1: GLuint): void;
+    uniform2uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform3ui(location: WebGLUniformLocation | null, v0: GLuint, v1: GLuint, v2: GLuint): void;
+    uniform3uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform4ui(location: WebGLUniformLocation | null, v0: GLuint, v1: GLuint, v2: GLuint, v3: GLuint): void;
+    uniform4uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformBlockBinding(program: WebGLProgram, uniformBlockIndex: GLuint, uniformBlockBinding: GLuint): void;
+    uniformMatrix2x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix2x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix3x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix3x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix4x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix4x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    vertexAttribDivisor(index: GLuint, divisor: GLuint): void;
+    vertexAttribI4i(index: GLuint, x: GLint, y: GLint, z: GLint, w: GLint): void;
+    vertexAttribI4iv(index: GLuint, values: Int32List): void;
+    vertexAttribI4ui(index: GLuint, x: GLuint, y: GLuint, z: GLuint, w: GLuint): void;
+    vertexAttribI4uiv(index: GLuint, values: Uint32List): void;
+    vertexAttribIPointer(index: GLuint, size: GLint, type: GLenum, stride: GLsizei, offset: GLintptr): void;
+    waitSync(sync: WebGLSync, flags: GLbitfield, timeout: GLint64): void;
+    readonly READ_BUFFER: 0x0C02;
+    readonly UNPACK_ROW_LENGTH: 0x0CF2;
+    readonly UNPACK_SKIP_ROWS: 0x0CF3;
+    readonly UNPACK_SKIP_PIXELS: 0x0CF4;
+    readonly PACK_ROW_LENGTH: 0x0D02;
+    readonly PACK_SKIP_ROWS: 0x0D03;
+    readonly PACK_SKIP_PIXELS: 0x0D04;
+    readonly COLOR: 0x1800;
+    readonly DEPTH: 0x1801;
+    readonly STENCIL: 0x1802;
+    readonly RED: 0x1903;
+    readonly RGB8: 0x8051;
+    readonly RGBA8: 0x8058;
+    readonly RGB10_A2: 0x8059;
+    readonly TEXTURE_BINDING_3D: 0x806A;
+    readonly UNPACK_SKIP_IMAGES: 0x806D;
+    readonly UNPACK_IMAGE_HEIGHT: 0x806E;
+    readonly TEXTURE_3D: 0x806F;
+    readonly TEXTURE_WRAP_R: 0x8072;
+    readonly MAX_3D_TEXTURE_SIZE: 0x8073;
+    readonly UNSIGNED_INT_2_10_10_10_REV: 0x8368;
+    readonly MAX_ELEMENTS_VERTICES: 0x80E8;
+    readonly MAX_ELEMENTS_INDICES: 0x80E9;
+    readonly TEXTURE_MIN_LOD: 0x813A;
+    readonly TEXTURE_MAX_LOD: 0x813B;
+    readonly TEXTURE_BASE_LEVEL: 0x813C;
+    readonly TEXTURE_MAX_LEVEL: 0x813D;
+    readonly MIN: 0x8007;
+    readonly MAX: 0x8008;
+    readonly DEPTH_COMPONENT24: 0x81A6;
+    readonly MAX_TEXTURE_LOD_BIAS: 0x84FD;
+    readonly TEXTURE_COMPARE_MODE: 0x884C;
+    readonly TEXTURE_COMPARE_FUNC: 0x884D;
+    readonly CURRENT_QUERY: 0x8865;
+    readonly QUERY_RESULT: 0x8866;
+    readonly QUERY_RESULT_AVAILABLE: 0x8867;
+    readonly STREAM_READ: 0x88E1;
+    readonly STREAM_COPY: 0x88E2;
+    readonly STATIC_READ: 0x88E5;
+    readonly STATIC_COPY: 0x88E6;
+    readonly DYNAMIC_READ: 0x88E9;
+    readonly DYNAMIC_COPY: 0x88EA;
+    readonly MAX_DRAW_BUFFERS: 0x8824;
+    readonly DRAW_BUFFER0: 0x8825;
+    readonly DRAW_BUFFER1: 0x8826;
+    readonly DRAW_BUFFER2: 0x8827;
+    readonly DRAW_BUFFER3: 0x8828;
+    readonly DRAW_BUFFER4: 0x8829;
+    readonly DRAW_BUFFER5: 0x882A;
+    readonly DRAW_BUFFER6: 0x882B;
+    readonly DRAW_BUFFER7: 0x882C;
+    readonly DRAW_BUFFER8: 0x882D;
+    readonly DRAW_BUFFER9: 0x882E;
+    readonly DRAW_BUFFER10: 0x882F;
+    readonly DRAW_BUFFER11: 0x8830;
+    readonly DRAW_BUFFER12: 0x8831;
+    readonly DRAW_BUFFER13: 0x8832;
+    readonly DRAW_BUFFER14: 0x8833;
+    readonly DRAW_BUFFER15: 0x8834;
+    readonly MAX_FRAGMENT_UNIFORM_COMPONENTS: 0x8B49;
+    readonly MAX_VERTEX_UNIFORM_COMPONENTS: 0x8B4A;
+    readonly SAMPLER_3D: 0x8B5F;
+    readonly SAMPLER_2D_SHADOW: 0x8B62;
+    readonly FRAGMENT_SHADER_DERIVATIVE_HINT: 0x8B8B;
+    readonly PIXEL_PACK_BUFFER: 0x88EB;
+    readonly PIXEL_UNPACK_BUFFER: 0x88EC;
+    readonly PIXEL_PACK_BUFFER_BINDING: 0x88ED;
+    readonly PIXEL_UNPACK_BUFFER_BINDING: 0x88EF;
+    readonly FLOAT_MAT2x3: 0x8B65;
+    readonly FLOAT_MAT2x4: 0x8B66;
+    readonly FLOAT_MAT3x2: 0x8B67;
+    readonly FLOAT_MAT3x4: 0x8B68;
+    readonly FLOAT_MAT4x2: 0x8B69;
+    readonly FLOAT_MAT4x3: 0x8B6A;
+    readonly SRGB: 0x8C40;
+    readonly SRGB8: 0x8C41;
+    readonly SRGB8_ALPHA8: 0x8C43;
+    readonly COMPARE_REF_TO_TEXTURE: 0x884E;
+    readonly RGBA32F: 0x8814;
+    readonly RGB32F: 0x8815;
+    readonly RGBA16F: 0x881A;
+    readonly RGB16F: 0x881B;
+    readonly VERTEX_ATTRIB_ARRAY_INTEGER: 0x88FD;
+    readonly MAX_ARRAY_TEXTURE_LAYERS: 0x88FF;
+    readonly MIN_PROGRAM_TEXEL_OFFSET: 0x8904;
+    readonly MAX_PROGRAM_TEXEL_OFFSET: 0x8905;
+    readonly MAX_VARYING_COMPONENTS: 0x8B4B;
+    readonly TEXTURE_2D_ARRAY: 0x8C1A;
+    readonly TEXTURE_BINDING_2D_ARRAY: 0x8C1D;
+    readonly R11F_G11F_B10F: 0x8C3A;
+    readonly UNSIGNED_INT_10F_11F_11F_REV: 0x8C3B;
+    readonly RGB9_E5: 0x8C3D;
+    readonly UNSIGNED_INT_5_9_9_9_REV: 0x8C3E;
+    readonly TRANSFORM_FEEDBACK_BUFFER_MODE: 0x8C7F;
+    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: 0x8C80;
+    readonly TRANSFORM_FEEDBACK_VARYINGS: 0x8C83;
+    readonly TRANSFORM_FEEDBACK_BUFFER_START: 0x8C84;
+    readonly TRANSFORM_FEEDBACK_BUFFER_SIZE: 0x8C85;
+    readonly TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 0x8C88;
+    readonly RASTERIZER_DISCARD: 0x8C89;
+    readonly MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: 0x8C8A;
+    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: 0x8C8B;
+    readonly INTERLEAVED_ATTRIBS: 0x8C8C;
+    readonly SEPARATE_ATTRIBS: 0x8C8D;
+    readonly TRANSFORM_FEEDBACK_BUFFER: 0x8C8E;
+    readonly TRANSFORM_FEEDBACK_BUFFER_BINDING: 0x8C8F;
+    readonly RGBA32UI: 0x8D70;
+    readonly RGB32UI: 0x8D71;
+    readonly RGBA16UI: 0x8D76;
+    readonly RGB16UI: 0x8D77;
+    readonly RGBA8UI: 0x8D7C;
+    readonly RGB8UI: 0x8D7D;
+    readonly RGBA32I: 0x8D82;
+    readonly RGB32I: 0x8D83;
+    readonly RGBA16I: 0x8D88;
+    readonly RGB16I: 0x8D89;
+    readonly RGBA8I: 0x8D8E;
+    readonly RGB8I: 0x8D8F;
+    readonly RED_INTEGER: 0x8D94;
+    readonly RGB_INTEGER: 0x8D98;
+    readonly RGBA_INTEGER: 0x8D99;
+    readonly SAMPLER_2D_ARRAY: 0x8DC1;
+    readonly SAMPLER_2D_ARRAY_SHADOW: 0x8DC4;
+    readonly SAMPLER_CUBE_SHADOW: 0x8DC5;
+    readonly UNSIGNED_INT_VEC2: 0x8DC6;
+    readonly UNSIGNED_INT_VEC3: 0x8DC7;
+    readonly UNSIGNED_INT_VEC4: 0x8DC8;
+    readonly INT_SAMPLER_2D: 0x8DCA;
+    readonly INT_SAMPLER_3D: 0x8DCB;
+    readonly INT_SAMPLER_CUBE: 0x8DCC;
+    readonly INT_SAMPLER_2D_ARRAY: 0x8DCF;
+    readonly UNSIGNED_INT_SAMPLER_2D: 0x8DD2;
+    readonly UNSIGNED_INT_SAMPLER_3D: 0x8DD3;
+    readonly UNSIGNED_INT_SAMPLER_CUBE: 0x8DD4;
+    readonly UNSIGNED_INT_SAMPLER_2D_ARRAY: 0x8DD7;
+    readonly DEPTH_COMPONENT32F: 0x8CAC;
+    readonly DEPTH32F_STENCIL8: 0x8CAD;
+    readonly FLOAT_32_UNSIGNED_INT_24_8_REV: 0x8DAD;
+    readonly FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: 0x8210;
+    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: 0x8211;
+    readonly FRAMEBUFFER_ATTACHMENT_RED_SIZE: 0x8212;
+    readonly FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 0x8213;
+    readonly FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 0x8214;
+    readonly FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 0x8215;
+    readonly FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 0x8216;
+    readonly FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 0x8217;
+    readonly FRAMEBUFFER_DEFAULT: 0x8218;
+    readonly UNSIGNED_INT_24_8: 0x84FA;
+    readonly DEPTH24_STENCIL8: 0x88F0;
+    readonly UNSIGNED_NORMALIZED: 0x8C17;
+    readonly DRAW_FRAMEBUFFER_BINDING: 0x8CA6;
+    readonly READ_FRAMEBUFFER: 0x8CA8;
+    readonly DRAW_FRAMEBUFFER: 0x8CA9;
+    readonly READ_FRAMEBUFFER_BINDING: 0x8CAA;
+    readonly RENDERBUFFER_SAMPLES: 0x8CAB;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: 0x8CD4;
+    readonly MAX_COLOR_ATTACHMENTS: 0x8CDF;
+    readonly COLOR_ATTACHMENT1: 0x8CE1;
+    readonly COLOR_ATTACHMENT2: 0x8CE2;
+    readonly COLOR_ATTACHMENT3: 0x8CE3;
+    readonly COLOR_ATTACHMENT4: 0x8CE4;
+    readonly COLOR_ATTACHMENT5: 0x8CE5;
+    readonly COLOR_ATTACHMENT6: 0x8CE6;
+    readonly COLOR_ATTACHMENT7: 0x8CE7;
+    readonly COLOR_ATTACHMENT8: 0x8CE8;
+    readonly COLOR_ATTACHMENT9: 0x8CE9;
+    readonly COLOR_ATTACHMENT10: 0x8CEA;
+    readonly COLOR_ATTACHMENT11: 0x8CEB;
+    readonly COLOR_ATTACHMENT12: 0x8CEC;
+    readonly COLOR_ATTACHMENT13: 0x8CED;
+    readonly COLOR_ATTACHMENT14: 0x8CEE;
+    readonly COLOR_ATTACHMENT15: 0x8CEF;
+    readonly FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: 0x8D56;
+    readonly MAX_SAMPLES: 0x8D57;
+    readonly HALF_FLOAT: 0x140B;
+    readonly RG: 0x8227;
+    readonly RG_INTEGER: 0x8228;
+    readonly R8: 0x8229;
+    readonly RG8: 0x822B;
+    readonly R16F: 0x822D;
+    readonly R32F: 0x822E;
+    readonly RG16F: 0x822F;
+    readonly RG32F: 0x8230;
+    readonly R8I: 0x8231;
+    readonly R8UI: 0x8232;
+    readonly R16I: 0x8233;
+    readonly R16UI: 0x8234;
+    readonly R32I: 0x8235;
+    readonly R32UI: 0x8236;
+    readonly RG8I: 0x8237;
+    readonly RG8UI: 0x8238;
+    readonly RG16I: 0x8239;
+    readonly RG16UI: 0x823A;
+    readonly RG32I: 0x823B;
+    readonly RG32UI: 0x823C;
+    readonly VERTEX_ARRAY_BINDING: 0x85B5;
+    readonly R8_SNORM: 0x8F94;
+    readonly RG8_SNORM: 0x8F95;
+    readonly RGB8_SNORM: 0x8F96;
+    readonly RGBA8_SNORM: 0x8F97;
+    readonly SIGNED_NORMALIZED: 0x8F9C;
+    readonly COPY_READ_BUFFER: 0x8F36;
+    readonly COPY_WRITE_BUFFER: 0x8F37;
+    readonly COPY_READ_BUFFER_BINDING: 0x8F36;
+    readonly COPY_WRITE_BUFFER_BINDING: 0x8F37;
+    readonly UNIFORM_BUFFER: 0x8A11;
+    readonly UNIFORM_BUFFER_BINDING: 0x8A28;
+    readonly UNIFORM_BUFFER_START: 0x8A29;
+    readonly UNIFORM_BUFFER_SIZE: 0x8A2A;
+    readonly MAX_VERTEX_UNIFORM_BLOCKS: 0x8A2B;
+    readonly MAX_FRAGMENT_UNIFORM_BLOCKS: 0x8A2D;
+    readonly MAX_COMBINED_UNIFORM_BLOCKS: 0x8A2E;
+    readonly MAX_UNIFORM_BUFFER_BINDINGS: 0x8A2F;
+    readonly MAX_UNIFORM_BLOCK_SIZE: 0x8A30;
+    readonly MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: 0x8A31;
+    readonly MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: 0x8A33;
+    readonly UNIFORM_BUFFER_OFFSET_ALIGNMENT: 0x8A34;
+    readonly ACTIVE_UNIFORM_BLOCKS: 0x8A36;
+    readonly UNIFORM_TYPE: 0x8A37;
+    readonly UNIFORM_SIZE: 0x8A38;
+    readonly UNIFORM_BLOCK_INDEX: 0x8A3A;
+    readonly UNIFORM_OFFSET: 0x8A3B;
+    readonly UNIFORM_ARRAY_STRIDE: 0x8A3C;
+    readonly UNIFORM_MATRIX_STRIDE: 0x8A3D;
+    readonly UNIFORM_IS_ROW_MAJOR: 0x8A3E;
+    readonly UNIFORM_BLOCK_BINDING: 0x8A3F;
+    readonly UNIFORM_BLOCK_DATA_SIZE: 0x8A40;
+    readonly UNIFORM_BLOCK_ACTIVE_UNIFORMS: 0x8A42;
+    readonly UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: 0x8A43;
+    readonly UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: 0x8A44;
+    readonly UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: 0x8A46;
+    readonly INVALID_INDEX: 0xFFFFFFFF;
+    readonly MAX_VERTEX_OUTPUT_COMPONENTS: 0x9122;
+    readonly MAX_FRAGMENT_INPUT_COMPONENTS: 0x9125;
+    readonly MAX_SERVER_WAIT_TIMEOUT: 0x9111;
+    readonly OBJECT_TYPE: 0x9112;
+    readonly SYNC_CONDITION: 0x9113;
+    readonly SYNC_STATUS: 0x9114;
+    readonly SYNC_FLAGS: 0x9115;
+    readonly SYNC_FENCE: 0x9116;
+    readonly SYNC_GPU_COMMANDS_COMPLETE: 0x9117;
+    readonly UNSIGNALED: 0x9118;
+    readonly SIGNALED: 0x9119;
+    readonly ALREADY_SIGNALED: 0x911A;
+    readonly TIMEOUT_EXPIRED: 0x911B;
+    readonly CONDITION_SATISFIED: 0x911C;
+    readonly WAIT_FAILED: 0x911D;
+    readonly SYNC_FLUSH_COMMANDS_BIT: 0x00000001;
+    readonly VERTEX_ATTRIB_ARRAY_DIVISOR: 0x88FE;
+    readonly ANY_SAMPLES_PASSED: 0x8C2F;
+    readonly ANY_SAMPLES_PASSED_CONSERVATIVE: 0x8D6A;
+    readonly SAMPLER_BINDING: 0x8919;
+    readonly RGB10_A2UI: 0x906F;
+    readonly INT_2_10_10_10_REV: 0x8D9F;
+    readonly TRANSFORM_FEEDBACK: 0x8E22;
+    readonly TRANSFORM_FEEDBACK_PAUSED: 0x8E23;
+    readonly TRANSFORM_FEEDBACK_ACTIVE: 0x8E24;
+    readonly TRANSFORM_FEEDBACK_BINDING: 0x8E25;
+    readonly TEXTURE_IMMUTABLE_FORMAT: 0x912F;
+    readonly MAX_ELEMENT_INDEX: 0x8D6B;
+    readonly TEXTURE_IMMUTABLE_LEVELS: 0x82DF;
+    readonly TIMEOUT_IGNORED: -1;
+    readonly MAX_CLIENT_WAIT_TIMEOUT_WEBGL: 0x9247;
+}
+
+interface WebGL2RenderingContextOverloads {
+    bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum): void;
+    bufferData(target: GLenum, srcData: BufferSource | null, usage: GLenum): void;
+    bufferData(target: GLenum, srcData: ArrayBufferView, usage: GLenum, srcOffset: GLuint, length?: GLuint): void;
+    bufferSubData(target: GLenum, dstByteOffset: GLintptr, srcData: BufferSource): void;
+    bufferSubData(target: GLenum, dstByteOffset: GLintptr, srcData: ArrayBufferView, srcOffset: GLuint, length?: GLuint): void;
+    compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, imageSize: GLsizei, offset: GLintptr): void;
+    compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
+    compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, imageSize: GLsizei, offset: GLintptr): void;
+    compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
+    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, dstData: ArrayBufferView | null): void;
+    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, offset: GLintptr): void;
+    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, dstData: ArrayBufferView, dstOffset: GLuint): void;
+    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
+    texImage2D(target: GLenum, level: GLint, internalformat: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
+    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
+    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
+    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint): void;
+    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
+    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
+    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
+    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, source: TexImageSource): void;
+    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint): void;
+    uniform1fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform1iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform2fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform2iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform3fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform3iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform4fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform4iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
+}
+
+/** Part of the WebGL API and represents the information returned by calling the WebGLRenderingContext.getActiveAttrib() and WebGLRenderingContext.getActiveUniform() methods. */
+interface WebGLActiveInfo {
+    readonly name: string;
+    readonly size: GLint;
+    readonly type: GLenum;
+}
+
+declare var WebGLActiveInfo: {
+    prototype: WebGLActiveInfo;
+    new(): WebGLActiveInfo;
+};
+
+/** Part of the WebGL API and represents an opaque buffer object storing data such as vertices or colors. */
+interface WebGLBuffer {
+}
+
+declare var WebGLBuffer: {
+    prototype: WebGLBuffer;
+    new(): WebGLBuffer;
+};
+
+/** The WebContextEvent interface is part of the WebGL API and is an interface for an event that is generated in response to a status change to the WebGL rendering context. */
+interface WebGLContextEvent extends Event {
+    readonly statusMessage: string;
+}
+
+declare var WebGLContextEvent: {
+    prototype: WebGLContextEvent;
+    new(type: string, eventInit?: WebGLContextEventInit): WebGLContextEvent;
+};
+
+/** Part of the WebGL API and represents a collection of buffers that serve as a rendering destination. */
+interface WebGLFramebuffer {
+}
+
+declare var WebGLFramebuffer: {
+    prototype: WebGLFramebuffer;
+    new(): WebGLFramebuffer;
+};
+
+/** The WebGLProgram is part of the WebGL API and is a combination of two compiled WebGLShaders consisting of a vertex shader and a fragment shader (both written in GLSL). */
+interface WebGLProgram {
+}
+
+declare var WebGLProgram: {
+    prototype: WebGLProgram;
+    new(): WebGLProgram;
+};
+
+interface WebGLQuery {
+}
+
+declare var WebGLQuery: {
+    prototype: WebGLQuery;
+    new(): WebGLQuery;
+};
+
+/** Part of the WebGL API and represents a buffer that can contain an image, or can be source or target of an rendering operation. */
+interface WebGLRenderbuffer {
+}
+
+declare var WebGLRenderbuffer: {
+    prototype: WebGLRenderbuffer;
+    new(): WebGLRenderbuffer;
+};
+
+/** Provides an interface to the OpenGL ES 2.0 graphics rendering context for the drawing surface of an HTML <canvas> element. */
+interface WebGLRenderingContext extends WebGLRenderingContextBase, WebGLRenderingContextOverloads {
+}
+
+declare var WebGLRenderingContext: {
+    prototype: WebGLRenderingContext;
+    new(): WebGLRenderingContext;
+    readonly DEPTH_BUFFER_BIT: 0x00000100;
+    readonly STENCIL_BUFFER_BIT: 0x00000400;
+    readonly COLOR_BUFFER_BIT: 0x00004000;
+    readonly POINTS: 0x0000;
+    readonly LINES: 0x0001;
+    readonly LINE_LOOP: 0x0002;
+    readonly LINE_STRIP: 0x0003;
+    readonly TRIANGLES: 0x0004;
+    readonly TRIANGLE_STRIP: 0x0005;
+    readonly TRIANGLE_FAN: 0x0006;
+    readonly ZERO: 0;
+    readonly ONE: 1;
+    readonly SRC_COLOR: 0x0300;
+    readonly ONE_MINUS_SRC_COLOR: 0x0301;
+    readonly SRC_ALPHA: 0x0302;
+    readonly ONE_MINUS_SRC_ALPHA: 0x0303;
+    readonly DST_ALPHA: 0x0304;
+    readonly ONE_MINUS_DST_ALPHA: 0x0305;
+    readonly DST_COLOR: 0x0306;
+    readonly ONE_MINUS_DST_COLOR: 0x0307;
+    readonly SRC_ALPHA_SATURATE: 0x0308;
+    readonly FUNC_ADD: 0x8006;
+    readonly BLEND_EQUATION: 0x8009;
+    readonly BLEND_EQUATION_RGB: 0x8009;
+    readonly BLEND_EQUATION_ALPHA: 0x883D;
+    readonly FUNC_SUBTRACT: 0x800A;
+    readonly FUNC_REVERSE_SUBTRACT: 0x800B;
+    readonly BLEND_DST_RGB: 0x80C8;
+    readonly BLEND_SRC_RGB: 0x80C9;
+    readonly BLEND_DST_ALPHA: 0x80CA;
+    readonly BLEND_SRC_ALPHA: 0x80CB;
+    readonly CONSTANT_COLOR: 0x8001;
+    readonly ONE_MINUS_CONSTANT_COLOR: 0x8002;
+    readonly CONSTANT_ALPHA: 0x8003;
+    readonly ONE_MINUS_CONSTANT_ALPHA: 0x8004;
+    readonly BLEND_COLOR: 0x8005;
+    readonly ARRAY_BUFFER: 0x8892;
+    readonly ELEMENT_ARRAY_BUFFER: 0x8893;
+    readonly ARRAY_BUFFER_BINDING: 0x8894;
+    readonly ELEMENT_ARRAY_BUFFER_BINDING: 0x8895;
+    readonly STREAM_DRAW: 0x88E0;
+    readonly STATIC_DRAW: 0x88E4;
+    readonly DYNAMIC_DRAW: 0x88E8;
+    readonly BUFFER_SIZE: 0x8764;
+    readonly BUFFER_USAGE: 0x8765;
+    readonly CURRENT_VERTEX_ATTRIB: 0x8626;
+    readonly FRONT: 0x0404;
+    readonly BACK: 0x0405;
+    readonly FRONT_AND_BACK: 0x0408;
+    readonly CULL_FACE: 0x0B44;
+    readonly BLEND: 0x0BE2;
+    readonly DITHER: 0x0BD0;
+    readonly STENCIL_TEST: 0x0B90;
+    readonly DEPTH_TEST: 0x0B71;
+    readonly SCISSOR_TEST: 0x0C11;
+    readonly POLYGON_OFFSET_FILL: 0x8037;
+    readonly SAMPLE_ALPHA_TO_COVERAGE: 0x809E;
+    readonly SAMPLE_COVERAGE: 0x80A0;
+    readonly NO_ERROR: 0;
+    readonly INVALID_ENUM: 0x0500;
+    readonly INVALID_VALUE: 0x0501;
+    readonly INVALID_OPERATION: 0x0502;
+    readonly OUT_OF_MEMORY: 0x0505;
+    readonly CW: 0x0900;
+    readonly CCW: 0x0901;
+    readonly LINE_WIDTH: 0x0B21;
+    readonly ALIASED_POINT_SIZE_RANGE: 0x846D;
+    readonly ALIASED_LINE_WIDTH_RANGE: 0x846E;
+    readonly CULL_FACE_MODE: 0x0B45;
+    readonly FRONT_FACE: 0x0B46;
+    readonly DEPTH_RANGE: 0x0B70;
+    readonly DEPTH_WRITEMASK: 0x0B72;
+    readonly DEPTH_CLEAR_VALUE: 0x0B73;
+    readonly DEPTH_FUNC: 0x0B74;
+    readonly STENCIL_CLEAR_VALUE: 0x0B91;
+    readonly STENCIL_FUNC: 0x0B92;
+    readonly STENCIL_FAIL: 0x0B94;
+    readonly STENCIL_PASS_DEPTH_FAIL: 0x0B95;
+    readonly STENCIL_PASS_DEPTH_PASS: 0x0B96;
+    readonly STENCIL_REF: 0x0B97;
+    readonly STENCIL_VALUE_MASK: 0x0B93;
+    readonly STENCIL_WRITEMASK: 0x0B98;
+    readonly STENCIL_BACK_FUNC: 0x8800;
+    readonly STENCIL_BACK_FAIL: 0x8801;
+    readonly STENCIL_BACK_PASS_DEPTH_FAIL: 0x8802;
+    readonly STENCIL_BACK_PASS_DEPTH_PASS: 0x8803;
+    readonly STENCIL_BACK_REF: 0x8CA3;
+    readonly STENCIL_BACK_VALUE_MASK: 0x8CA4;
+    readonly STENCIL_BACK_WRITEMASK: 0x8CA5;
+    readonly VIEWPORT: 0x0BA2;
+    readonly SCISSOR_BOX: 0x0C10;
+    readonly COLOR_CLEAR_VALUE: 0x0C22;
+    readonly COLOR_WRITEMASK: 0x0C23;
+    readonly UNPACK_ALIGNMENT: 0x0CF5;
+    readonly PACK_ALIGNMENT: 0x0D05;
+    readonly MAX_TEXTURE_SIZE: 0x0D33;
+    readonly MAX_VIEWPORT_DIMS: 0x0D3A;
+    readonly SUBPIXEL_BITS: 0x0D50;
+    readonly RED_BITS: 0x0D52;
+    readonly GREEN_BITS: 0x0D53;
+    readonly BLUE_BITS: 0x0D54;
+    readonly ALPHA_BITS: 0x0D55;
+    readonly DEPTH_BITS: 0x0D56;
+    readonly STENCIL_BITS: 0x0D57;
+    readonly POLYGON_OFFSET_UNITS: 0x2A00;
+    readonly POLYGON_OFFSET_FACTOR: 0x8038;
+    readonly TEXTURE_BINDING_2D: 0x8069;
+    readonly SAMPLE_BUFFERS: 0x80A8;
+    readonly SAMPLES: 0x80A9;
+    readonly SAMPLE_COVERAGE_VALUE: 0x80AA;
+    readonly SAMPLE_COVERAGE_INVERT: 0x80AB;
+    readonly COMPRESSED_TEXTURE_FORMATS: 0x86A3;
+    readonly DONT_CARE: 0x1100;
+    readonly FASTEST: 0x1101;
+    readonly NICEST: 0x1102;
+    readonly GENERATE_MIPMAP_HINT: 0x8192;
+    readonly BYTE: 0x1400;
+    readonly UNSIGNED_BYTE: 0x1401;
+    readonly SHORT: 0x1402;
+    readonly UNSIGNED_SHORT: 0x1403;
+    readonly INT: 0x1404;
+    readonly UNSIGNED_INT: 0x1405;
+    readonly FLOAT: 0x1406;
+    readonly DEPTH_COMPONENT: 0x1902;
+    readonly ALPHA: 0x1906;
+    readonly RGB: 0x1907;
+    readonly RGBA: 0x1908;
+    readonly LUMINANCE: 0x1909;
+    readonly LUMINANCE_ALPHA: 0x190A;
+    readonly UNSIGNED_SHORT_4_4_4_4: 0x8033;
+    readonly UNSIGNED_SHORT_5_5_5_1: 0x8034;
+    readonly UNSIGNED_SHORT_5_6_5: 0x8363;
+    readonly FRAGMENT_SHADER: 0x8B30;
+    readonly VERTEX_SHADER: 0x8B31;
+    readonly MAX_VERTEX_ATTRIBS: 0x8869;
+    readonly MAX_VERTEX_UNIFORM_VECTORS: 0x8DFB;
+    readonly MAX_VARYING_VECTORS: 0x8DFC;
+    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: 0x8B4D;
+    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: 0x8B4C;
+    readonly MAX_TEXTURE_IMAGE_UNITS: 0x8872;
+    readonly MAX_FRAGMENT_UNIFORM_VECTORS: 0x8DFD;
+    readonly SHADER_TYPE: 0x8B4F;
+    readonly DELETE_STATUS: 0x8B80;
+    readonly LINK_STATUS: 0x8B82;
+    readonly VALIDATE_STATUS: 0x8B83;
+    readonly ATTACHED_SHADERS: 0x8B85;
+    readonly ACTIVE_UNIFORMS: 0x8B86;
+    readonly ACTIVE_ATTRIBUTES: 0x8B89;
+    readonly SHADING_LANGUAGE_VERSION: 0x8B8C;
+    readonly CURRENT_PROGRAM: 0x8B8D;
+    readonly NEVER: 0x0200;
+    readonly LESS: 0x0201;
+    readonly EQUAL: 0x0202;
+    readonly LEQUAL: 0x0203;
+    readonly GREATER: 0x0204;
+    readonly NOTEQUAL: 0x0205;
+    readonly GEQUAL: 0x0206;
+    readonly ALWAYS: 0x0207;
+    readonly KEEP: 0x1E00;
+    readonly REPLACE: 0x1E01;
+    readonly INCR: 0x1E02;
+    readonly DECR: 0x1E03;
+    readonly INVERT: 0x150A;
+    readonly INCR_WRAP: 0x8507;
+    readonly DECR_WRAP: 0x8508;
+    readonly VENDOR: 0x1F00;
+    readonly RENDERER: 0x1F01;
+    readonly VERSION: 0x1F02;
+    readonly NEAREST: 0x2600;
+    readonly LINEAR: 0x2601;
+    readonly NEAREST_MIPMAP_NEAREST: 0x2700;
+    readonly LINEAR_MIPMAP_NEAREST: 0x2701;
+    readonly NEAREST_MIPMAP_LINEAR: 0x2702;
+    readonly LINEAR_MIPMAP_LINEAR: 0x2703;
+    readonly TEXTURE_MAG_FILTER: 0x2800;
+    readonly TEXTURE_MIN_FILTER: 0x2801;
+    readonly TEXTURE_WRAP_S: 0x2802;
+    readonly TEXTURE_WRAP_T: 0x2803;
+    readonly TEXTURE_2D: 0x0DE1;
+    readonly TEXTURE: 0x1702;
+    readonly TEXTURE_CUBE_MAP: 0x8513;
+    readonly TEXTURE_BINDING_CUBE_MAP: 0x8514;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_X: 0x8515;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: 0x8516;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: 0x8517;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: 0x8518;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: 0x8519;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: 0x851A;
+    readonly MAX_CUBE_MAP_TEXTURE_SIZE: 0x851C;
+    readonly TEXTURE0: 0x84C0;
+    readonly TEXTURE1: 0x84C1;
+    readonly TEXTURE2: 0x84C2;
+    readonly TEXTURE3: 0x84C3;
+    readonly TEXTURE4: 0x84C4;
+    readonly TEXTURE5: 0x84C5;
+    readonly TEXTURE6: 0x84C6;
+    readonly TEXTURE7: 0x84C7;
+    readonly TEXTURE8: 0x84C8;
+    readonly TEXTURE9: 0x84C9;
+    readonly TEXTURE10: 0x84CA;
+    readonly TEXTURE11: 0x84CB;
+    readonly TEXTURE12: 0x84CC;
+    readonly TEXTURE13: 0x84CD;
+    readonly TEXTURE14: 0x84CE;
+    readonly TEXTURE15: 0x84CF;
+    readonly TEXTURE16: 0x84D0;
+    readonly TEXTURE17: 0x84D1;
+    readonly TEXTURE18: 0x84D2;
+    readonly TEXTURE19: 0x84D3;
+    readonly TEXTURE20: 0x84D4;
+    readonly TEXTURE21: 0x84D5;
+    readonly TEXTURE22: 0x84D6;
+    readonly TEXTURE23: 0x84D7;
+    readonly TEXTURE24: 0x84D8;
+    readonly TEXTURE25: 0x84D9;
+    readonly TEXTURE26: 0x84DA;
+    readonly TEXTURE27: 0x84DB;
+    readonly TEXTURE28: 0x84DC;
+    readonly TEXTURE29: 0x84DD;
+    readonly TEXTURE30: 0x84DE;
+    readonly TEXTURE31: 0x84DF;
+    readonly ACTIVE_TEXTURE: 0x84E0;
+    readonly REPEAT: 0x2901;
+    readonly CLAMP_TO_EDGE: 0x812F;
+    readonly MIRRORED_REPEAT: 0x8370;
+    readonly FLOAT_VEC2: 0x8B50;
+    readonly FLOAT_VEC3: 0x8B51;
+    readonly FLOAT_VEC4: 0x8B52;
+    readonly INT_VEC2: 0x8B53;
+    readonly INT_VEC3: 0x8B54;
+    readonly INT_VEC4: 0x8B55;
+    readonly BOOL: 0x8B56;
+    readonly BOOL_VEC2: 0x8B57;
+    readonly BOOL_VEC3: 0x8B58;
+    readonly BOOL_VEC4: 0x8B59;
+    readonly FLOAT_MAT2: 0x8B5A;
+    readonly FLOAT_MAT3: 0x8B5B;
+    readonly FLOAT_MAT4: 0x8B5C;
+    readonly SAMPLER_2D: 0x8B5E;
+    readonly SAMPLER_CUBE: 0x8B60;
+    readonly VERTEX_ATTRIB_ARRAY_ENABLED: 0x8622;
+    readonly VERTEX_ATTRIB_ARRAY_SIZE: 0x8623;
+    readonly VERTEX_ATTRIB_ARRAY_STRIDE: 0x8624;
+    readonly VERTEX_ATTRIB_ARRAY_TYPE: 0x8625;
+    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: 0x886A;
+    readonly VERTEX_ATTRIB_ARRAY_POINTER: 0x8645;
+    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 0x889F;
+    readonly IMPLEMENTATION_COLOR_READ_TYPE: 0x8B9A;
+    readonly IMPLEMENTATION_COLOR_READ_FORMAT: 0x8B9B;
+    readonly COMPILE_STATUS: 0x8B81;
+    readonly LOW_FLOAT: 0x8DF0;
+    readonly MEDIUM_FLOAT: 0x8DF1;
+    readonly HIGH_FLOAT: 0x8DF2;
+    readonly LOW_INT: 0x8DF3;
+    readonly MEDIUM_INT: 0x8DF4;
+    readonly HIGH_INT: 0x8DF5;
+    readonly FRAMEBUFFER: 0x8D40;
+    readonly RENDERBUFFER: 0x8D41;
+    readonly RGBA4: 0x8056;
+    readonly RGB5_A1: 0x8057;
+    readonly RGB565: 0x8D62;
+    readonly DEPTH_COMPONENT16: 0x81A5;
+    readonly STENCIL_INDEX8: 0x8D48;
+    readonly DEPTH_STENCIL: 0x84F9;
+    readonly RENDERBUFFER_WIDTH: 0x8D42;
+    readonly RENDERBUFFER_HEIGHT: 0x8D43;
+    readonly RENDERBUFFER_INTERNAL_FORMAT: 0x8D44;
+    readonly RENDERBUFFER_RED_SIZE: 0x8D50;
+    readonly RENDERBUFFER_GREEN_SIZE: 0x8D51;
+    readonly RENDERBUFFER_BLUE_SIZE: 0x8D52;
+    readonly RENDERBUFFER_ALPHA_SIZE: 0x8D53;
+    readonly RENDERBUFFER_DEPTH_SIZE: 0x8D54;
+    readonly RENDERBUFFER_STENCIL_SIZE: 0x8D55;
+    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 0x8CD0;
+    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 0x8CD1;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 0x8CD2;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 0x8CD3;
+    readonly COLOR_ATTACHMENT0: 0x8CE0;
+    readonly DEPTH_ATTACHMENT: 0x8D00;
+    readonly STENCIL_ATTACHMENT: 0x8D20;
+    readonly DEPTH_STENCIL_ATTACHMENT: 0x821A;
+    readonly NONE: 0;
+    readonly FRAMEBUFFER_COMPLETE: 0x8CD5;
+    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 0x8CD6;
+    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 0x8CD7;
+    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 0x8CD9;
+    readonly FRAMEBUFFER_UNSUPPORTED: 0x8CDD;
+    readonly FRAMEBUFFER_BINDING: 0x8CA6;
+    readonly RENDERBUFFER_BINDING: 0x8CA7;
+    readonly MAX_RENDERBUFFER_SIZE: 0x84E8;
+    readonly INVALID_FRAMEBUFFER_OPERATION: 0x0506;
+    readonly UNPACK_FLIP_Y_WEBGL: 0x9240;
+    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: 0x9241;
+    readonly CONTEXT_LOST_WEBGL: 0x9242;
+    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: 0x9243;
+    readonly BROWSER_DEFAULT_WEBGL: 0x9244;
+};
+
+interface WebGLRenderingContextBase {
+    readonly drawingBufferHeight: GLsizei;
+    readonly drawingBufferWidth: GLsizei;
+    activeTexture(texture: GLenum): void;
+    attachShader(program: WebGLProgram, shader: WebGLShader): void;
+    bindAttribLocation(program: WebGLProgram, index: GLuint, name: string): void;
+    bindBuffer(target: GLenum, buffer: WebGLBuffer | null): void;
+    bindFramebuffer(target: GLenum, framebuffer: WebGLFramebuffer | null): void;
+    bindRenderbuffer(target: GLenum, renderbuffer: WebGLRenderbuffer | null): void;
+    bindTexture(target: GLenum, texture: WebGLTexture | null): void;
+    blendColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf): void;
+    blendEquation(mode: GLenum): void;
+    blendEquationSeparate(modeRGB: GLenum, modeAlpha: GLenum): void;
+    blendFunc(sfactor: GLenum, dfactor: GLenum): void;
+    blendFuncSeparate(srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum): void;
+    checkFramebufferStatus(target: GLenum): GLenum;
+    clear(mask: GLbitfield): void;
+    clearColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf): void;
+    clearDepth(depth: GLclampf): void;
+    clearStencil(s: GLint): void;
+    colorMask(red: GLboolean, green: GLboolean, blue: GLboolean, alpha: GLboolean): void;
+    compileShader(shader: WebGLShader): void;
+    copyTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei, border: GLint): void;
+    copyTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
+    createBuffer(): WebGLBuffer | null;
+    createFramebuffer(): WebGLFramebuffer | null;
+    createProgram(): WebGLProgram | null;
+    createRenderbuffer(): WebGLRenderbuffer | null;
+    createShader(type: GLenum): WebGLShader | null;
+    createTexture(): WebGLTexture | null;
+    cullFace(mode: GLenum): void;
+    deleteBuffer(buffer: WebGLBuffer | null): void;
+    deleteFramebuffer(framebuffer: WebGLFramebuffer | null): void;
+    deleteProgram(program: WebGLProgram | null): void;
+    deleteRenderbuffer(renderbuffer: WebGLRenderbuffer | null): void;
+    deleteShader(shader: WebGLShader | null): void;
+    deleteTexture(texture: WebGLTexture | null): void;
+    depthFunc(func: GLenum): void;
+    depthMask(flag: GLboolean): void;
+    depthRange(zNear: GLclampf, zFar: GLclampf): void;
+    detachShader(program: WebGLProgram, shader: WebGLShader): void;
+    disable(cap: GLenum): void;
+    disableVertexAttribArray(index: GLuint): void;
+    drawArrays(mode: GLenum, first: GLint, count: GLsizei): void;
+    drawElements(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr): void;
+    enable(cap: GLenum): void;
+    enableVertexAttribArray(index: GLuint): void;
+    finish(): void;
+    flush(): void;
+    framebufferRenderbuffer(target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: WebGLRenderbuffer | null): void;
+    framebufferTexture2D(target: GLenum, attachment: GLenum, textarget: GLenum, texture: WebGLTexture | null, level: GLint): void;
+    frontFace(mode: GLenum): void;
+    generateMipmap(target: GLenum): void;
+    getActiveAttrib(program: WebGLProgram, index: GLuint): WebGLActiveInfo | null;
+    getActiveUniform(program: WebGLProgram, index: GLuint): WebGLActiveInfo | null;
+    getAttachedShaders(program: WebGLProgram): WebGLShader[] | null;
+    getAttribLocation(program: WebGLProgram, name: string): GLint;
+    getBufferParameter(target: GLenum, pname: GLenum): any;
+    getContextAttributes(): WebGLContextAttributes | null;
+    getError(): GLenum;
+    getExtension(extensionName: "ANGLE_instanced_arrays"): ANGLE_instanced_arrays | null;
+    getExtension(extensionName: "EXT_blend_minmax"): EXT_blend_minmax | null;
+    getExtension(extensionName: "EXT_color_buffer_float"): EXT_color_buffer_float | null;
+    getExtension(extensionName: "EXT_color_buffer_half_float"): EXT_color_buffer_half_float | null;
+    getExtension(extensionName: "EXT_float_blend"): EXT_float_blend | null;
+    getExtension(extensionName: "EXT_frag_depth"): EXT_frag_depth | null;
+    getExtension(extensionName: "EXT_sRGB"): EXT_sRGB | null;
+    getExtension(extensionName: "EXT_shader_texture_lod"): EXT_shader_texture_lod | null;
+    getExtension(extensionName: "EXT_texture_compression_bptc"): EXT_texture_compression_bptc | null;
+    getExtension(extensionName: "EXT_texture_compression_rgtc"): EXT_texture_compression_rgtc | null;
+    getExtension(extensionName: "EXT_texture_filter_anisotropic"): EXT_texture_filter_anisotropic | null;
+    getExtension(extensionName: "KHR_parallel_shader_compile"): KHR_parallel_shader_compile | null;
+    getExtension(extensionName: "OES_element_index_uint"): OES_element_index_uint | null;
+    getExtension(extensionName: "OES_fbo_render_mipmap"): OES_fbo_render_mipmap | null;
+    getExtension(extensionName: "OES_standard_derivatives"): OES_standard_derivatives | null;
+    getExtension(extensionName: "OES_texture_float"): OES_texture_float | null;
+    getExtension(extensionName: "OES_texture_float_linear"): OES_texture_float_linear | null;
+    getExtension(extensionName: "OES_texture_half_float"): OES_texture_half_float | null;
+    getExtension(extensionName: "OES_texture_half_float_linear"): OES_texture_half_float_linear | null;
+    getExtension(extensionName: "OES_vertex_array_object"): OES_vertex_array_object | null;
+    getExtension(extensionName: "OVR_multiview2"): OVR_multiview2 | null;
+    getExtension(extensionName: "WEBGL_color_buffer_float"): WEBGL_color_buffer_float | null;
+    getExtension(extensionName: "WEBGL_compressed_texture_astc"): WEBGL_compressed_texture_astc | null;
+    getExtension(extensionName: "WEBGL_compressed_texture_etc"): WEBGL_compressed_texture_etc | null;
+    getExtension(extensionName: "WEBGL_compressed_texture_etc1"): WEBGL_compressed_texture_etc1 | null;
+    getExtension(extensionName: "WEBGL_compressed_texture_s3tc"): WEBGL_compressed_texture_s3tc | null;
+    getExtension(extensionName: "WEBGL_compressed_texture_s3tc_srgb"): WEBGL_compressed_texture_s3tc_srgb | null;
+    getExtension(extensionName: "WEBGL_debug_renderer_info"): WEBGL_debug_renderer_info | null;
+    getExtension(extensionName: "WEBGL_debug_shaders"): WEBGL_debug_shaders | null;
+    getExtension(extensionName: "WEBGL_depth_texture"): WEBGL_depth_texture | null;
+    getExtension(extensionName: "WEBGL_draw_buffers"): WEBGL_draw_buffers | null;
+    getExtension(extensionName: "WEBGL_lose_context"): WEBGL_lose_context | null;
+    getExtension(extensionName: "WEBGL_multi_draw"): WEBGL_multi_draw | null;
+    getExtension(name: string): any;
+    getFramebufferAttachmentParameter(target: GLenum, attachment: GLenum, pname: GLenum): any;
+    getParameter(pname: GLenum): any;
+    getProgramInfoLog(program: WebGLProgram): string | null;
+    getProgramParameter(program: WebGLProgram, pname: GLenum): any;
+    getRenderbufferParameter(target: GLenum, pname: GLenum): any;
+    getShaderInfoLog(shader: WebGLShader): string | null;
+    getShaderParameter(shader: WebGLShader, pname: GLenum): any;
+    getShaderPrecisionFormat(shadertype: GLenum, precisiontype: GLenum): WebGLShaderPrecisionFormat | null;
+    getShaderSource(shader: WebGLShader): string | null;
+    getSupportedExtensions(): string[] | null;
+    getTexParameter(target: GLenum, pname: GLenum): any;
+    getUniform(program: WebGLProgram, location: WebGLUniformLocation): any;
+    getUniformLocation(program: WebGLProgram, name: string): WebGLUniformLocation | null;
+    getVertexAttrib(index: GLuint, pname: GLenum): any;
+    getVertexAttribOffset(index: GLuint, pname: GLenum): GLintptr;
+    hint(target: GLenum, mode: GLenum): void;
+    isBuffer(buffer: WebGLBuffer | null): GLboolean;
+    isContextLost(): boolean;
+    isEnabled(cap: GLenum): GLboolean;
+    isFramebuffer(framebuffer: WebGLFramebuffer | null): GLboolean;
+    isProgram(program: WebGLProgram | null): GLboolean;
+    isRenderbuffer(renderbuffer: WebGLRenderbuffer | null): GLboolean;
+    isShader(shader: WebGLShader | null): GLboolean;
+    isTexture(texture: WebGLTexture | null): GLboolean;
+    lineWidth(width: GLfloat): void;
+    linkProgram(program: WebGLProgram): void;
+    pixelStorei(pname: GLenum, param: GLint | GLboolean): void;
+    polygonOffset(factor: GLfloat, units: GLfloat): void;
+    renderbufferStorage(target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei): void;
+    sampleCoverage(value: GLclampf, invert: GLboolean): void;
+    scissor(x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
+    shaderSource(shader: WebGLShader, source: string): void;
+    stencilFunc(func: GLenum, ref: GLint, mask: GLuint): void;
+    stencilFuncSeparate(face: GLenum, func: GLenum, ref: GLint, mask: GLuint): void;
+    stencilMask(mask: GLuint): void;
+    stencilMaskSeparate(face: GLenum, mask: GLuint): void;
+    stencilOp(fail: GLenum, zfail: GLenum, zpass: GLenum): void;
+    stencilOpSeparate(face: GLenum, fail: GLenum, zfail: GLenum, zpass: GLenum): void;
+    texParameterf(target: GLenum, pname: GLenum, param: GLfloat): void;
+    texParameteri(target: GLenum, pname: GLenum, param: GLint): void;
+    uniform1f(location: WebGLUniformLocation | null, x: GLfloat): void;
+    uniform1i(location: WebGLUniformLocation | null, x: GLint): void;
+    uniform2f(location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat): void;
+    uniform2i(location: WebGLUniformLocation | null, x: GLint, y: GLint): void;
+    uniform3f(location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat, z: GLfloat): void;
+    uniform3i(location: WebGLUniformLocation | null, x: GLint, y: GLint, z: GLint): void;
+    uniform4f(location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat): void;
+    uniform4i(location: WebGLUniformLocation | null, x: GLint, y: GLint, z: GLint, w: GLint): void;
+    useProgram(program: WebGLProgram | null): void;
+    validateProgram(program: WebGLProgram): void;
+    vertexAttrib1f(index: GLuint, x: GLfloat): void;
+    vertexAttrib1fv(index: GLuint, values: Float32List): void;
+    vertexAttrib2f(index: GLuint, x: GLfloat, y: GLfloat): void;
+    vertexAttrib2fv(index: GLuint, values: Float32List): void;
+    vertexAttrib3f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat): void;
+    vertexAttrib3fv(index: GLuint, values: Float32List): void;
+    vertexAttrib4f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat): void;
+    vertexAttrib4fv(index: GLuint, values: Float32List): void;
+    vertexAttribPointer(index: GLuint, size: GLint, type: GLenum, normalized: GLboolean, stride: GLsizei, offset: GLintptr): void;
+    viewport(x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
+    readonly DEPTH_BUFFER_BIT: 0x00000100;
+    readonly STENCIL_BUFFER_BIT: 0x00000400;
+    readonly COLOR_BUFFER_BIT: 0x00004000;
+    readonly POINTS: 0x0000;
+    readonly LINES: 0x0001;
+    readonly LINE_LOOP: 0x0002;
+    readonly LINE_STRIP: 0x0003;
+    readonly TRIANGLES: 0x0004;
+    readonly TRIANGLE_STRIP: 0x0005;
+    readonly TRIANGLE_FAN: 0x0006;
+    readonly ZERO: 0;
+    readonly ONE: 1;
+    readonly SRC_COLOR: 0x0300;
+    readonly ONE_MINUS_SRC_COLOR: 0x0301;
+    readonly SRC_ALPHA: 0x0302;
+    readonly ONE_MINUS_SRC_ALPHA: 0x0303;
+    readonly DST_ALPHA: 0x0304;
+    readonly ONE_MINUS_DST_ALPHA: 0x0305;
+    readonly DST_COLOR: 0x0306;
+    readonly ONE_MINUS_DST_COLOR: 0x0307;
+    readonly SRC_ALPHA_SATURATE: 0x0308;
+    readonly FUNC_ADD: 0x8006;
+    readonly BLEND_EQUATION: 0x8009;
+    readonly BLEND_EQUATION_RGB: 0x8009;
+    readonly BLEND_EQUATION_ALPHA: 0x883D;
+    readonly FUNC_SUBTRACT: 0x800A;
+    readonly FUNC_REVERSE_SUBTRACT: 0x800B;
+    readonly BLEND_DST_RGB: 0x80C8;
+    readonly BLEND_SRC_RGB: 0x80C9;
+    readonly BLEND_DST_ALPHA: 0x80CA;
+    readonly BLEND_SRC_ALPHA: 0x80CB;
+    readonly CONSTANT_COLOR: 0x8001;
+    readonly ONE_MINUS_CONSTANT_COLOR: 0x8002;
+    readonly CONSTANT_ALPHA: 0x8003;
+    readonly ONE_MINUS_CONSTANT_ALPHA: 0x8004;
+    readonly BLEND_COLOR: 0x8005;
+    readonly ARRAY_BUFFER: 0x8892;
+    readonly ELEMENT_ARRAY_BUFFER: 0x8893;
+    readonly ARRAY_BUFFER_BINDING: 0x8894;
+    readonly ELEMENT_ARRAY_BUFFER_BINDING: 0x8895;
+    readonly STREAM_DRAW: 0x88E0;
+    readonly STATIC_DRAW: 0x88E4;
+    readonly DYNAMIC_DRAW: 0x88E8;
+    readonly BUFFER_SIZE: 0x8764;
+    readonly BUFFER_USAGE: 0x8765;
+    readonly CURRENT_VERTEX_ATTRIB: 0x8626;
+    readonly FRONT: 0x0404;
+    readonly BACK: 0x0405;
+    readonly FRONT_AND_BACK: 0x0408;
+    readonly CULL_FACE: 0x0B44;
+    readonly BLEND: 0x0BE2;
+    readonly DITHER: 0x0BD0;
+    readonly STENCIL_TEST: 0x0B90;
+    readonly DEPTH_TEST: 0x0B71;
+    readonly SCISSOR_TEST: 0x0C11;
+    readonly POLYGON_OFFSET_FILL: 0x8037;
+    readonly SAMPLE_ALPHA_TO_COVERAGE: 0x809E;
+    readonly SAMPLE_COVERAGE: 0x80A0;
+    readonly NO_ERROR: 0;
+    readonly INVALID_ENUM: 0x0500;
+    readonly INVALID_VALUE: 0x0501;
+    readonly INVALID_OPERATION: 0x0502;
+    readonly OUT_OF_MEMORY: 0x0505;
+    readonly CW: 0x0900;
+    readonly CCW: 0x0901;
+    readonly LINE_WIDTH: 0x0B21;
+    readonly ALIASED_POINT_SIZE_RANGE: 0x846D;
+    readonly ALIASED_LINE_WIDTH_RANGE: 0x846E;
+    readonly CULL_FACE_MODE: 0x0B45;
+    readonly FRONT_FACE: 0x0B46;
+    readonly DEPTH_RANGE: 0x0B70;
+    readonly DEPTH_WRITEMASK: 0x0B72;
+    readonly DEPTH_CLEAR_VALUE: 0x0B73;
+    readonly DEPTH_FUNC: 0x0B74;
+    readonly STENCIL_CLEAR_VALUE: 0x0B91;
+    readonly STENCIL_FUNC: 0x0B92;
+    readonly STENCIL_FAIL: 0x0B94;
+    readonly STENCIL_PASS_DEPTH_FAIL: 0x0B95;
+    readonly STENCIL_PASS_DEPTH_PASS: 0x0B96;
+    readonly STENCIL_REF: 0x0B97;
+    readonly STENCIL_VALUE_MASK: 0x0B93;
+    readonly STENCIL_WRITEMASK: 0x0B98;
+    readonly STENCIL_BACK_FUNC: 0x8800;
+    readonly STENCIL_BACK_FAIL: 0x8801;
+    readonly STENCIL_BACK_PASS_DEPTH_FAIL: 0x8802;
+    readonly STENCIL_BACK_PASS_DEPTH_PASS: 0x8803;
+    readonly STENCIL_BACK_REF: 0x8CA3;
+    readonly STENCIL_BACK_VALUE_MASK: 0x8CA4;
+    readonly STENCIL_BACK_WRITEMASK: 0x8CA5;
+    readonly VIEWPORT: 0x0BA2;
+    readonly SCISSOR_BOX: 0x0C10;
+    readonly COLOR_CLEAR_VALUE: 0x0C22;
+    readonly COLOR_WRITEMASK: 0x0C23;
+    readonly UNPACK_ALIGNMENT: 0x0CF5;
+    readonly PACK_ALIGNMENT: 0x0D05;
+    readonly MAX_TEXTURE_SIZE: 0x0D33;
+    readonly MAX_VIEWPORT_DIMS: 0x0D3A;
+    readonly SUBPIXEL_BITS: 0x0D50;
+    readonly RED_BITS: 0x0D52;
+    readonly GREEN_BITS: 0x0D53;
+    readonly BLUE_BITS: 0x0D54;
+    readonly ALPHA_BITS: 0x0D55;
+    readonly DEPTH_BITS: 0x0D56;
+    readonly STENCIL_BITS: 0x0D57;
+    readonly POLYGON_OFFSET_UNITS: 0x2A00;
+    readonly POLYGON_OFFSET_FACTOR: 0x8038;
+    readonly TEXTURE_BINDING_2D: 0x8069;
+    readonly SAMPLE_BUFFERS: 0x80A8;
+    readonly SAMPLES: 0x80A9;
+    readonly SAMPLE_COVERAGE_VALUE: 0x80AA;
+    readonly SAMPLE_COVERAGE_INVERT: 0x80AB;
+    readonly COMPRESSED_TEXTURE_FORMATS: 0x86A3;
+    readonly DONT_CARE: 0x1100;
+    readonly FASTEST: 0x1101;
+    readonly NICEST: 0x1102;
+    readonly GENERATE_MIPMAP_HINT: 0x8192;
+    readonly BYTE: 0x1400;
+    readonly UNSIGNED_BYTE: 0x1401;
+    readonly SHORT: 0x1402;
+    readonly UNSIGNED_SHORT: 0x1403;
+    readonly INT: 0x1404;
+    readonly UNSIGNED_INT: 0x1405;
+    readonly FLOAT: 0x1406;
+    readonly DEPTH_COMPONENT: 0x1902;
+    readonly ALPHA: 0x1906;
+    readonly RGB: 0x1907;
+    readonly RGBA: 0x1908;
+    readonly LUMINANCE: 0x1909;
+    readonly LUMINANCE_ALPHA: 0x190A;
+    readonly UNSIGNED_SHORT_4_4_4_4: 0x8033;
+    readonly UNSIGNED_SHORT_5_5_5_1: 0x8034;
+    readonly UNSIGNED_SHORT_5_6_5: 0x8363;
+    readonly FRAGMENT_SHADER: 0x8B30;
+    readonly VERTEX_SHADER: 0x8B31;
+    readonly MAX_VERTEX_ATTRIBS: 0x8869;
+    readonly MAX_VERTEX_UNIFORM_VECTORS: 0x8DFB;
+    readonly MAX_VARYING_VECTORS: 0x8DFC;
+    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: 0x8B4D;
+    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: 0x8B4C;
+    readonly MAX_TEXTURE_IMAGE_UNITS: 0x8872;
+    readonly MAX_FRAGMENT_UNIFORM_VECTORS: 0x8DFD;
+    readonly SHADER_TYPE: 0x8B4F;
+    readonly DELETE_STATUS: 0x8B80;
+    readonly LINK_STATUS: 0x8B82;
+    readonly VALIDATE_STATUS: 0x8B83;
+    readonly ATTACHED_SHADERS: 0x8B85;
+    readonly ACTIVE_UNIFORMS: 0x8B86;
+    readonly ACTIVE_ATTRIBUTES: 0x8B89;
+    readonly SHADING_LANGUAGE_VERSION: 0x8B8C;
+    readonly CURRENT_PROGRAM: 0x8B8D;
+    readonly NEVER: 0x0200;
+    readonly LESS: 0x0201;
+    readonly EQUAL: 0x0202;
+    readonly LEQUAL: 0x0203;
+    readonly GREATER: 0x0204;
+    readonly NOTEQUAL: 0x0205;
+    readonly GEQUAL: 0x0206;
+    readonly ALWAYS: 0x0207;
+    readonly KEEP: 0x1E00;
+    readonly REPLACE: 0x1E01;
+    readonly INCR: 0x1E02;
+    readonly DECR: 0x1E03;
+    readonly INVERT: 0x150A;
+    readonly INCR_WRAP: 0x8507;
+    readonly DECR_WRAP: 0x8508;
+    readonly VENDOR: 0x1F00;
+    readonly RENDERER: 0x1F01;
+    readonly VERSION: 0x1F02;
+    readonly NEAREST: 0x2600;
+    readonly LINEAR: 0x2601;
+    readonly NEAREST_MIPMAP_NEAREST: 0x2700;
+    readonly LINEAR_MIPMAP_NEAREST: 0x2701;
+    readonly NEAREST_MIPMAP_LINEAR: 0x2702;
+    readonly LINEAR_MIPMAP_LINEAR: 0x2703;
+    readonly TEXTURE_MAG_FILTER: 0x2800;
+    readonly TEXTURE_MIN_FILTER: 0x2801;
+    readonly TEXTURE_WRAP_S: 0x2802;
+    readonly TEXTURE_WRAP_T: 0x2803;
+    readonly TEXTURE_2D: 0x0DE1;
+    readonly TEXTURE: 0x1702;
+    readonly TEXTURE_CUBE_MAP: 0x8513;
+    readonly TEXTURE_BINDING_CUBE_MAP: 0x8514;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_X: 0x8515;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: 0x8516;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: 0x8517;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: 0x8518;
+    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: 0x8519;
+    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: 0x851A;
+    readonly MAX_CUBE_MAP_TEXTURE_SIZE: 0x851C;
+    readonly TEXTURE0: 0x84C0;
+    readonly TEXTURE1: 0x84C1;
+    readonly TEXTURE2: 0x84C2;
+    readonly TEXTURE3: 0x84C3;
+    readonly TEXTURE4: 0x84C4;
+    readonly TEXTURE5: 0x84C5;
+    readonly TEXTURE6: 0x84C6;
+    readonly TEXTURE7: 0x84C7;
+    readonly TEXTURE8: 0x84C8;
+    readonly TEXTURE9: 0x84C9;
+    readonly TEXTURE10: 0x84CA;
+    readonly TEXTURE11: 0x84CB;
+    readonly TEXTURE12: 0x84CC;
+    readonly TEXTURE13: 0x84CD;
+    readonly TEXTURE14: 0x84CE;
+    readonly TEXTURE15: 0x84CF;
+    readonly TEXTURE16: 0x84D0;
+    readonly TEXTURE17: 0x84D1;
+    readonly TEXTURE18: 0x84D2;
+    readonly TEXTURE19: 0x84D3;
+    readonly TEXTURE20: 0x84D4;
+    readonly TEXTURE21: 0x84D5;
+    readonly TEXTURE22: 0x84D6;
+    readonly TEXTURE23: 0x84D7;
+    readonly TEXTURE24: 0x84D8;
+    readonly TEXTURE25: 0x84D9;
+    readonly TEXTURE26: 0x84DA;
+    readonly TEXTURE27: 0x84DB;
+    readonly TEXTURE28: 0x84DC;
+    readonly TEXTURE29: 0x84DD;
+    readonly TEXTURE30: 0x84DE;
+    readonly TEXTURE31: 0x84DF;
+    readonly ACTIVE_TEXTURE: 0x84E0;
+    readonly REPEAT: 0x2901;
+    readonly CLAMP_TO_EDGE: 0x812F;
+    readonly MIRRORED_REPEAT: 0x8370;
+    readonly FLOAT_VEC2: 0x8B50;
+    readonly FLOAT_VEC3: 0x8B51;
+    readonly FLOAT_VEC4: 0x8B52;
+    readonly INT_VEC2: 0x8B53;
+    readonly INT_VEC3: 0x8B54;
+    readonly INT_VEC4: 0x8B55;
+    readonly BOOL: 0x8B56;
+    readonly BOOL_VEC2: 0x8B57;
+    readonly BOOL_VEC3: 0x8B58;
+    readonly BOOL_VEC4: 0x8B59;
+    readonly FLOAT_MAT2: 0x8B5A;
+    readonly FLOAT_MAT3: 0x8B5B;
+    readonly FLOAT_MAT4: 0x8B5C;
+    readonly SAMPLER_2D: 0x8B5E;
+    readonly SAMPLER_CUBE: 0x8B60;
+    readonly VERTEX_ATTRIB_ARRAY_ENABLED: 0x8622;
+    readonly VERTEX_ATTRIB_ARRAY_SIZE: 0x8623;
+    readonly VERTEX_ATTRIB_ARRAY_STRIDE: 0x8624;
+    readonly VERTEX_ATTRIB_ARRAY_TYPE: 0x8625;
+    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: 0x886A;
+    readonly VERTEX_ATTRIB_ARRAY_POINTER: 0x8645;
+    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 0x889F;
+    readonly IMPLEMENTATION_COLOR_READ_TYPE: 0x8B9A;
+    readonly IMPLEMENTATION_COLOR_READ_FORMAT: 0x8B9B;
+    readonly COMPILE_STATUS: 0x8B81;
+    readonly LOW_FLOAT: 0x8DF0;
+    readonly MEDIUM_FLOAT: 0x8DF1;
+    readonly HIGH_FLOAT: 0x8DF2;
+    readonly LOW_INT: 0x8DF3;
+    readonly MEDIUM_INT: 0x8DF4;
+    readonly HIGH_INT: 0x8DF5;
+    readonly FRAMEBUFFER: 0x8D40;
+    readonly RENDERBUFFER: 0x8D41;
+    readonly RGBA4: 0x8056;
+    readonly RGB5_A1: 0x8057;
+    readonly RGB565: 0x8D62;
+    readonly DEPTH_COMPONENT16: 0x81A5;
+    readonly STENCIL_INDEX8: 0x8D48;
+    readonly DEPTH_STENCIL: 0x84F9;
+    readonly RENDERBUFFER_WIDTH: 0x8D42;
+    readonly RENDERBUFFER_HEIGHT: 0x8D43;
+    readonly RENDERBUFFER_INTERNAL_FORMAT: 0x8D44;
+    readonly RENDERBUFFER_RED_SIZE: 0x8D50;
+    readonly RENDERBUFFER_GREEN_SIZE: 0x8D51;
+    readonly RENDERBUFFER_BLUE_SIZE: 0x8D52;
+    readonly RENDERBUFFER_ALPHA_SIZE: 0x8D53;
+    readonly RENDERBUFFER_DEPTH_SIZE: 0x8D54;
+    readonly RENDERBUFFER_STENCIL_SIZE: 0x8D55;
+    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 0x8CD0;
+    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 0x8CD1;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 0x8CD2;
+    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 0x8CD3;
+    readonly COLOR_ATTACHMENT0: 0x8CE0;
+    readonly DEPTH_ATTACHMENT: 0x8D00;
+    readonly STENCIL_ATTACHMENT: 0x8D20;
+    readonly DEPTH_STENCIL_ATTACHMENT: 0x821A;
+    readonly NONE: 0;
+    readonly FRAMEBUFFER_COMPLETE: 0x8CD5;
+    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 0x8CD6;
+    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 0x8CD7;
+    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 0x8CD9;
+    readonly FRAMEBUFFER_UNSUPPORTED: 0x8CDD;
+    readonly FRAMEBUFFER_BINDING: 0x8CA6;
+    readonly RENDERBUFFER_BINDING: 0x8CA7;
+    readonly MAX_RENDERBUFFER_SIZE: 0x84E8;
+    readonly INVALID_FRAMEBUFFER_OPERATION: 0x0506;
+    readonly UNPACK_FLIP_Y_WEBGL: 0x9240;
+    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: 0x9241;
+    readonly CONTEXT_LOST_WEBGL: 0x9242;
+    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: 0x9243;
+    readonly BROWSER_DEFAULT_WEBGL: 0x9244;
+}
+
+interface WebGLRenderingContextOverloads {
+    bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum): void;
+    bufferData(target: GLenum, data: BufferSource | null, usage: GLenum): void;
+    bufferSubData(target: GLenum, offset: GLintptr, data: BufferSource): void;
+    compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, data: ArrayBufferView): void;
+    compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, data: ArrayBufferView): void;
+    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
+    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
+    texImage2D(target: GLenum, level: GLint, internalformat: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
+    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
+    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
+    uniform1fv(location: WebGLUniformLocation | null, v: Float32List): void;
+    uniform1iv(location: WebGLUniformLocation | null, v: Int32List): void;
+    uniform2fv(location: WebGLUniformLocation | null, v: Float32List): void;
+    uniform2iv(location: WebGLUniformLocation | null, v: Int32List): void;
+    uniform3fv(location: WebGLUniformLocation | null, v: Float32List): void;
+    uniform3iv(location: WebGLUniformLocation | null, v: Int32List): void;
+    uniform4fv(location: WebGLUniformLocation | null, v: Float32List): void;
+    uniform4iv(location: WebGLUniformLocation | null, v: Int32List): void;
+    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Float32List): void;
+    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Float32List): void;
+    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Float32List): void;
+}
+
+interface WebGLSampler {
+}
+
+declare var WebGLSampler: {
+    prototype: WebGLSampler;
+    new(): WebGLSampler;
+};
+
+/** The WebGLShader is part of the WebGL API and can either be a vertex or a fragment shader. A WebGLProgram requires both types of shaders. */
+interface WebGLShader {
+}
+
+declare var WebGLShader: {
+    prototype: WebGLShader;
+    new(): WebGLShader;
+};
+
+/** Part of the WebGL API and represents the information returned by calling the WebGLRenderingContext.getShaderPrecisionFormat() method. */
+interface WebGLShaderPrecisionFormat {
+    readonly precision: GLint;
+    readonly rangeMax: GLint;
+    readonly rangeMin: GLint;
+}
+
+declare var WebGLShaderPrecisionFormat: {
+    prototype: WebGLShaderPrecisionFormat;
+    new(): WebGLShaderPrecisionFormat;
+};
+
+interface WebGLSync {
+}
+
+declare var WebGLSync: {
+    prototype: WebGLSync;
+    new(): WebGLSync;
+};
+
+/** Part of the WebGL API and represents an opaque texture object providing storage and state for texturing operations. */
+interface WebGLTexture {
+}
+
+declare var WebGLTexture: {
+    prototype: WebGLTexture;
+    new(): WebGLTexture;
+};
+
+interface WebGLTransformFeedback {
+}
+
+declare var WebGLTransformFeedback: {
+    prototype: WebGLTransformFeedback;
+    new(): WebGLTransformFeedback;
+};
+
+/** Part of the WebGL API and represents the location of a uniform variable in a shader program. */
+interface WebGLUniformLocation {
+}
+
+declare var WebGLUniformLocation: {
+    prototype: WebGLUniformLocation;
+    new(): WebGLUniformLocation;
+};
+
+interface WebGLVertexArrayObject {
+}
+
+declare var WebGLVertexArrayObject: {
+    prototype: WebGLVertexArrayObject;
+    new(): WebGLVertexArrayObject;
+};
+
+interface WebGLVertexArrayObjectOES {
+}
+
+interface WebSocketEventMap {
+    "close": CloseEvent;
+    "error": Event;
+    "message": MessageEvent;
+    "open": Event;
+}
+
+/** Provides the API for creating and managing a WebSocket connection to a server, as well as for sending and receiving data on the connection. */
+interface WebSocket extends EventTarget {
+    /**
+     * Returns a string that indicates how binary data from the WebSocket object is exposed to scripts:
+     *
+     * Can be set, to change how binary data is returned. The default is "blob".
+     */
+    binaryType: BinaryType;
+    /**
+     * Returns the number of bytes of application data (UTF-8 text and binary data) that have been queued using send() but not yet been transmitted to the network.
+     *
+     * If the WebSocket connection is closed, this attribute's value will only increase with each call to the send() method. (The number does not reset to zero once the connection closes.)
+     */
+    readonly bufferedAmount: number;
+    /** Returns the extensions selected by the server, if any. */
+    readonly extensions: string;
+    onclose: ((this: WebSocket, ev: CloseEvent) => any) | null;
+    onerror: ((this: WebSocket, ev: Event) => any) | null;
+    onmessage: ((this: WebSocket, ev: MessageEvent) => any) | null;
+    onopen: ((this: WebSocket, ev: Event) => any) | null;
+    /** Returns the subprotocol selected by the server, if any. It can be used in conjunction with the array form of the constructor's second argument to perform subprotocol negotiation. */
+    readonly protocol: string;
+    /** Returns the state of the WebSocket object's connection. It can have the values described below. */
+    readonly readyState: number;
+    /** Returns the URL that was used to establish the WebSocket connection. */
+    readonly url: string;
+    /** Closes the WebSocket connection, optionally using code as the the WebSocket connection close code and reason as the the WebSocket connection close reason. */
+    close(code?: number, reason?: string): void;
+    /** Transmits data using the WebSocket connection. data can be a string, a Blob, an ArrayBuffer, or an ArrayBufferView. */
+    send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
+    readonly CONNECTING: 0;
+    readonly OPEN: 1;
+    readonly CLOSING: 2;
+    readonly CLOSED: 3;
+    addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var WebSocket: {
+    prototype: WebSocket;
+    new(url: string | URL, protocols?: string | string[]): WebSocket;
+    readonly CONNECTING: 0;
+    readonly OPEN: 1;
+    readonly CLOSING: 2;
+    readonly CLOSED: 3;
+};
+
+/** This ServiceWorker API interface represents the scope of a service worker client that is a document in a browser context, controlled by an active worker. The service worker client independently selects and uses a service worker for its own loading and sub-resources. */
+interface WindowClient extends Client {
+    readonly focused: boolean;
+    readonly visibilityState: DocumentVisibilityState;
+    focus(): Promise<WindowClient>;
+    navigate(url: string | URL): Promise<WindowClient | null>;
+}
+
+declare var WindowClient: {
+    prototype: WindowClient;
+    new(): WindowClient;
+};
+
+interface WindowOrWorkerGlobalScope {
+    /** Available only in secure contexts. */
+    readonly caches: CacheStorage;
+    readonly crossOriginIsolated: boolean;
+    readonly crypto: Crypto;
+    readonly indexedDB: IDBFactory;
+    readonly isSecureContext: boolean;
+    readonly origin: string;
+    readonly performance: Performance;
+    atob(data: string): string;
+    btoa(data: string): string;
+    clearInterval(id: number | undefined): void;
+    clearTimeout(id: number | undefined): void;
+    createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap>;
+    createImageBitmap(image: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;
+    fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
+    queueMicrotask(callback: VoidFunction): void;
+    reportError(e: any): void;
+    setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
+    setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
+    structuredClone(value: any, options?: StructuredSerializeOptions): any;
+}
+
+interface WorkerEventMap extends AbstractWorkerEventMap {
+    "message": MessageEvent;
+    "messageerror": MessageEvent;
+}
+
+/** This Web Workers API interface represents a background task that can be easily created and can send messages back to its creator. Creating a worker is as simple as calling the Worker() constructor and specifying a script to be run in the worker thread. */
+interface Worker extends EventTarget, AbstractWorker {
+    onmessage: ((this: Worker, ev: MessageEvent) => any) | null;
+    onmessageerror: ((this: Worker, ev: MessageEvent) => any) | null;
+    /** Clones message and transmits it to worker's global environment. transfer can be passed as a list of objects that are to be transferred rather than cloned. */
+    postMessage(message: any, transfer: Transferable[]): void;
+    postMessage(message: any, options?: StructuredSerializeOptions): void;
+    /** Aborts worker's associated global environment. */
+    terminate(): void;
+    addEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: Worker, ev: WorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: Worker, ev: WorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var Worker: {
+    prototype: Worker;
+    new(scriptURL: string | URL, options?: WorkerOptions): Worker;
+};
+
+interface WorkerGlobalScopeEventMap {
+    "error": ErrorEvent;
+    "languagechange": Event;
+    "offline": Event;
+    "online": Event;
+    "rejectionhandled": PromiseRejectionEvent;
+    "unhandledrejection": PromiseRejectionEvent;
+}
+
+/** This Web Workers API interface is an interface representing the scope of any worker. Workers have no browsing context; this scope contains the information usually conveyed by Window objects \u2014 in this case event handlers, the console or the associated WorkerNavigator object. Each WorkerGlobalScope has its own event loop. */
+interface WorkerGlobalScope extends EventTarget, FontFaceSource, WindowOrWorkerGlobalScope {
+    /** Returns workerGlobal's WorkerLocation object. */
+    readonly location: WorkerLocation;
+    /** Returns workerGlobal's WorkerNavigator object. */
+    readonly navigator: WorkerNavigator;
+    onerror: ((this: WorkerGlobalScope, ev: ErrorEvent) => any) | null;
+    onlanguagechange: ((this: WorkerGlobalScope, ev: Event) => any) | null;
+    onoffline: ((this: WorkerGlobalScope, ev: Event) => any) | null;
+    ononline: ((this: WorkerGlobalScope, ev: Event) => any) | null;
+    onrejectionhandled: ((this: WorkerGlobalScope, ev: PromiseRejectionEvent) => any) | null;
+    onunhandledrejection: ((this: WorkerGlobalScope, ev: PromiseRejectionEvent) => any) | null;
+    /** Returns workerGlobal. */
+    readonly self: WorkerGlobalScope & typeof globalThis;
+    /** Fetches each URL in urls, executes them one-by-one in the order they are passed, and then returns (or throws if something went amiss). */
+    importScripts(...urls: (string | URL)[]): void;
+    addEventListener<K extends keyof WorkerGlobalScopeEventMap>(type: K, listener: (this: WorkerGlobalScope, ev: WorkerGlobalScopeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof WorkerGlobalScopeEventMap>(type: K, listener: (this: WorkerGlobalScope, ev: WorkerGlobalScopeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var WorkerGlobalScope: {
+    prototype: WorkerGlobalScope;
+    new(): WorkerGlobalScope;
+};
+
+/** The absolute location of the script executed by the Worker. Such an object is initialized for each worker and is available via the WorkerGlobalScope.location property obtained by calling self.location. */
+interface WorkerLocation {
+    readonly hash: string;
+    readonly host: string;
+    readonly hostname: string;
+    readonly href: string;
+    toString(): string;
+    readonly origin: string;
+    readonly pathname: string;
+    readonly port: string;
+    readonly protocol: string;
+    readonly search: string;
+}
+
+declare var WorkerLocation: {
+    prototype: WorkerLocation;
+    new(): WorkerLocation;
+};
+
+/** A subset of the Navigator interface allowed to be accessed from a Worker. Such an object is initialized for each worker and is available via the WorkerGlobalScope.navigator property obtained by calling window.self.navigator. */
+interface WorkerNavigator extends NavigatorConcurrentHardware, NavigatorID, NavigatorLanguage, NavigatorLocks, NavigatorOnLine, NavigatorStorage {
+    readonly mediaCapabilities: MediaCapabilities;
+}
+
+declare var WorkerNavigator: {
+    prototype: WorkerNavigator;
+    new(): WorkerNavigator;
+};
+
+/** This Streams API interface provides\xA0a standard abstraction for writing streaming data to a destination, known as a sink. This object comes with built-in backpressure and queuing. */
+interface WritableStream<W = any> {
+    readonly locked: boolean;
+    abort(reason?: any): Promise<void>;
+    close(): Promise<void>;
+    getWriter(): WritableStreamDefaultWriter<W>;
+}
+
+declare var WritableStream: {
+    prototype: WritableStream;
+    new<W = any>(underlyingSink?: UnderlyingSink<W>, strategy?: QueuingStrategy<W>): WritableStream<W>;
+};
+
+/** This Streams API interface represents a controller allowing control of a\xA0WritableStream's state. When constructing a WritableStream, the underlying sink is given a corresponding WritableStreamDefaultController instance to manipulate. */
+interface WritableStreamDefaultController {
+    readonly signal: AbortSignal;
+    error(e?: any): void;
+}
+
+declare var WritableStreamDefaultController: {
+    prototype: WritableStreamDefaultController;
+    new(): WritableStreamDefaultController;
+};
+
+/** This Streams API interface is the object returned by WritableStream.getWriter() and once created locks the < writer to the WritableStream ensuring that no other streams can write to the underlying sink. */
+interface WritableStreamDefaultWriter<W = any> {
+    readonly closed: Promise<undefined>;
+    readonly desiredSize: number | null;
+    readonly ready: Promise<undefined>;
+    abort(reason?: any): Promise<void>;
+    close(): Promise<void>;
+    releaseLock(): void;
+    write(chunk?: W): Promise<void>;
+}
+
+declare var WritableStreamDefaultWriter: {
+    prototype: WritableStreamDefaultWriter;
+    new<W = any>(stream: WritableStream<W>): WritableStreamDefaultWriter<W>;
+};
+
+interface XMLHttpRequestEventMap extends XMLHttpRequestEventTargetEventMap {
+    "readystatechange": Event;
+}
+
+/** Use XMLHttpRequest (XHR) objects to interact with servers. You can retrieve data from a URL without having to do a full page refresh. This enables a Web page to update just part of a page without disrupting what the user is doing. */
+interface XMLHttpRequest extends XMLHttpRequestEventTarget {
+    onreadystatechange: ((this: XMLHttpRequest, ev: Event) => any) | null;
+    /** Returns client's state. */
+    readonly readyState: number;
+    /** Returns the response body. */
+    readonly response: any;
+    /**
+     * Returns response as text.
+     *
+     * Throws an "InvalidStateError" DOMException if responseType is not the empty string or "text".
+     */
+    readonly responseText: string;
+    /**
+     * Returns the response type.
+     *
+     * Can be set to change the response type. Values are: the empty string (default), "arraybuffer", "blob", "document", "json", and "text".
+     *
+     * When set: setting to "document" is ignored if current global object is not a Window object.
+     *
+     * When set: throws an "InvalidStateError" DOMException if state is loading or done.
+     *
+     * When set: throws an "InvalidAccessError" DOMException if the synchronous flag is set and current global object is a Window object.
+     */
+    responseType: XMLHttpRequestResponseType;
+    readonly responseURL: string;
+    readonly status: number;
+    readonly statusText: string;
+    /**
+     * Can be set to a time in milliseconds. When set to a non-zero value will cause fetching to terminate after the given time has passed. When the time has passed, the request has not yet completed, and this's synchronous flag is unset, a timeout event will then be dispatched, or a "TimeoutError" DOMException will be thrown otherwise (for the send() method).
+     *
+     * When set: throws an "InvalidAccessError" DOMException if the synchronous flag is set and current global object is a Window object.
+     */
+    timeout: number;
+    /** Returns the associated XMLHttpRequestUpload object. It can be used to gather transmission information when data is transferred to a server. */
+    readonly upload: XMLHttpRequestUpload;
+    /**
+     * True when credentials are to be included in a cross-origin request. False when they are to be excluded in a cross-origin request and when cookies are to be ignored in its response. Initially false.
+     *
+     * When set: throws an "InvalidStateError" DOMException if state is not unsent or opened, or if the send() flag is set.
+     */
+    withCredentials: boolean;
+    /** Cancels any network activity. */
+    abort(): void;
+    getAllResponseHeaders(): string;
+    getResponseHeader(name: string): string | null;
+    /**
+     * Sets the request method, request URL, and synchronous flag.
+     *
+     * Throws a "SyntaxError" DOMException if either method is not a valid method or url cannot be parsed.
+     *
+     * Throws a "SecurityError" DOMException if method is a case-insensitive match for \`CONNECT\`, \`TRACE\`, or \`TRACK\`.
+     *
+     * Throws an "InvalidAccessError" DOMException if async is false, current global object is a Window object, and the timeout attribute is not zero or the responseType attribute is not the empty string.
+     */
+    open(method: string, url: string | URL): void;
+    open(method: string, url: string | URL, async: boolean, username?: string | null, password?: string | null): void;
+    /**
+     * Acts as if the \`Content-Type\` header value for a response is mime. (It does not change the header.)
+     *
+     * Throws an "InvalidStateError" DOMException if state is loading or done.
+     */
+    overrideMimeType(mime: string): void;
+    /**
+     * Initiates the request. The body argument provides the request body, if any, and is ignored if the request method is GET or HEAD.
+     *
+     * Throws an "InvalidStateError" DOMException if either state is not opened or the send() flag is set.
+     */
+    send(body?: XMLHttpRequestBodyInit | null): void;
+    /**
+     * Combines a header in author request headers.
+     *
+     * Throws an "InvalidStateError" DOMException if either state is not opened or the send() flag is set.
+     *
+     * Throws a "SyntaxError" DOMException if name is not a header name or if value is not a header value.
+     */
+    setRequestHeader(name: string, value: string): void;
+    readonly UNSENT: 0;
+    readonly OPENED: 1;
+    readonly HEADERS_RECEIVED: 2;
+    readonly LOADING: 3;
+    readonly DONE: 4;
+    addEventListener<K extends keyof XMLHttpRequestEventMap>(type: K, listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof XMLHttpRequestEventMap>(type: K, listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var XMLHttpRequest: {
+    prototype: XMLHttpRequest;
+    new(): XMLHttpRequest;
+    readonly UNSENT: 0;
+    readonly OPENED: 1;
+    readonly HEADERS_RECEIVED: 2;
+    readonly LOADING: 3;
+    readonly DONE: 4;
+};
+
+interface XMLHttpRequestEventTargetEventMap {
+    "abort": ProgressEvent<XMLHttpRequestEventTarget>;
+    "error": ProgressEvent<XMLHttpRequestEventTarget>;
+    "load": ProgressEvent<XMLHttpRequestEventTarget>;
+    "loadend": ProgressEvent<XMLHttpRequestEventTarget>;
+    "loadstart": ProgressEvent<XMLHttpRequestEventTarget>;
+    "progress": ProgressEvent<XMLHttpRequestEventTarget>;
+    "timeout": ProgressEvent<XMLHttpRequestEventTarget>;
+}
+
+interface XMLHttpRequestEventTarget extends EventTarget {
+    onabort: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
+    onerror: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
+    onload: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
+    onloadend: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
+    onloadstart: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
+    onprogress: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
+    ontimeout: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
+    addEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestEventTarget, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestEventTarget, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var XMLHttpRequestEventTarget: {
+    prototype: XMLHttpRequestEventTarget;
+    new(): XMLHttpRequestEventTarget;
+};
+
+interface XMLHttpRequestUpload extends XMLHttpRequestEventTarget {
+    addEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestUpload, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+    removeEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestUpload, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+}
+
+declare var XMLHttpRequestUpload: {
+    prototype: XMLHttpRequestUpload;
+    new(): XMLHttpRequestUpload;
+};
+
+interface Console {
+    assert(condition?: boolean, ...data: any[]): void;
+    clear(): void;
+    count(label?: string): void;
+    countReset(label?: string): void;
+    debug(...data: any[]): void;
+    dir(item?: any, options?: any): void;
+    dirxml(...data: any[]): void;
+    error(...data: any[]): void;
+    group(...data: any[]): void;
+    groupCollapsed(...data: any[]): void;
+    groupEnd(): void;
+    info(...data: any[]): void;
+    log(...data: any[]): void;
+    table(tabularData?: any, properties?: string[]): void;
+    time(label?: string): void;
+    timeEnd(label?: string): void;
+    timeLog(label?: string, ...data: any[]): void;
+    timeStamp(label?: string): void;
+    trace(...data: any[]): void;
+    warn(...data: any[]): void;
+}
+
+declare var console: Console;
+
+declare namespace WebAssembly {
+    interface CompileError extends Error {
+    }
+
+    var CompileError: {
+        prototype: CompileError;
+        new(message?: string): CompileError;
+        (message?: string): CompileError;
+    };
+
+    interface Global {
+        value: any;
+        valueOf(): any;
+    }
+
+    var Global: {
+        prototype: Global;
+        new(descriptor: GlobalDescriptor, v?: any): Global;
+    };
+
+    interface Instance {
+        readonly exports: Exports;
+    }
+
+    var Instance: {
+        prototype: Instance;
+        new(module: Module, importObject?: Imports): Instance;
+    };
+
+    interface LinkError extends Error {
+    }
+
+    var LinkError: {
+        prototype: LinkError;
+        new(message?: string): LinkError;
+        (message?: string): LinkError;
+    };
+
+    interface Memory {
+        readonly buffer: ArrayBuffer;
+        grow(delta: number): number;
+    }
+
+    var Memory: {
+        prototype: Memory;
+        new(descriptor: MemoryDescriptor): Memory;
+    };
+
+    interface Module {
+    }
+
+    var Module: {
+        prototype: Module;
+        new(bytes: BufferSource): Module;
+        customSections(moduleObject: Module, sectionName: string): ArrayBuffer[];
+        exports(moduleObject: Module): ModuleExportDescriptor[];
+        imports(moduleObject: Module): ModuleImportDescriptor[];
+    };
+
+    interface RuntimeError extends Error {
+    }
+
+    var RuntimeError: {
+        prototype: RuntimeError;
+        new(message?: string): RuntimeError;
+        (message?: string): RuntimeError;
+    };
+
+    interface Table {
+        readonly length: number;
+        get(index: number): any;
+        grow(delta: number, value?: any): number;
+        set(index: number, value?: any): void;
+    }
+
+    var Table: {
+        prototype: Table;
+        new(descriptor: TableDescriptor, value?: any): Table;
+    };
+
+    interface GlobalDescriptor {
+        mutable?: boolean;
+        value: ValueType;
+    }
+
+    interface MemoryDescriptor {
+        initial: number;
+        maximum?: number;
+        shared?: boolean;
+    }
+
+    interface ModuleExportDescriptor {
+        kind: ImportExportKind;
+        name: string;
+    }
+
+    interface ModuleImportDescriptor {
+        kind: ImportExportKind;
+        module: string;
+        name: string;
+    }
+
+    interface TableDescriptor {
+        element: TableKind;
+        initial: number;
+        maximum?: number;
+    }
+
+    interface WebAssemblyInstantiatedSource {
+        instance: Instance;
+        module: Module;
+    }
+
+    type ImportExportKind = "function" | "global" | "memory" | "table";
+    type TableKind = "anyfunc" | "externref";
+    type ValueType = "anyfunc" | "externref" | "f32" | "f64" | "i32" | "i64" | "v128";
+    type ExportValue = Function | Global | Memory | Table;
+    type Exports = Record<string, ExportValue>;
+    type ImportValue = ExportValue | number;
+    type Imports = Record<string, ModuleImports>;
+    type ModuleImports = Record<string, ImportValue>;
+    function compile(bytes: BufferSource): Promise<Module>;
+    function compileStreaming(source: Response | PromiseLike<Response>): Promise<Module>;
+    function instantiate(bytes: BufferSource, importObject?: Imports): Promise<WebAssemblyInstantiatedSource>;
+    function instantiate(moduleObject: Module, importObject?: Imports): Promise<Instance>;
+    function instantiateStreaming(source: Response | PromiseLike<Response>, importObject?: Imports): Promise<WebAssemblyInstantiatedSource>;
+    function validate(bytes: BufferSource): boolean;
+}
+
+interface FrameRequestCallback {
+    (time: DOMHighResTimeStamp): void;
+}
+
+interface LockGrantedCallback {
+    (lock: Lock | null): any;
+}
+
+interface OnErrorEventHandlerNonNull {
+    (event: Event | string, source?: string, lineno?: number, colno?: number, error?: Error): any;
+}
+
+interface PerformanceObserverCallback {
+    (entries: PerformanceObserverEntryList, observer: PerformanceObserver): void;
+}
+
+interface QueuingStrategySize<T = any> {
+    (chunk: T): number;
+}
+
+interface TransformerFlushCallback<O> {
+    (controller: TransformStreamDefaultController<O>): void | PromiseLike<void>;
+}
+
+interface TransformerStartCallback<O> {
+    (controller: TransformStreamDefaultController<O>): any;
+}
+
+interface TransformerTransformCallback<I, O> {
+    (chunk: I, controller: TransformStreamDefaultController<O>): void | PromiseLike<void>;
+}
+
+interface UnderlyingSinkAbortCallback {
+    (reason?: any): void | PromiseLike<void>;
+}
+
+interface UnderlyingSinkCloseCallback {
+    (): void | PromiseLike<void>;
+}
+
+interface UnderlyingSinkStartCallback {
+    (controller: WritableStreamDefaultController): any;
+}
+
+interface UnderlyingSinkWriteCallback<W> {
+    (chunk: W, controller: WritableStreamDefaultController): void | PromiseLike<void>;
+}
+
+interface UnderlyingSourceCancelCallback {
+    (reason?: any): void | PromiseLike<void>;
+}
+
+interface UnderlyingSourcePullCallback<R> {
+    (controller: ReadableStreamController<R>): void | PromiseLike<void>;
+}
+
+interface UnderlyingSourceStartCallback<R> {
+    (controller: ReadableStreamController<R>): any;
+}
+
+interface VoidFunction {
+    (): void;
+}
+
+/** Returns dedicatedWorkerGlobal's name, i.e. the value given to the Worker constructor. Primarily useful for debugging. */
+declare var name: string;
+declare var onmessage: ((this: DedicatedWorkerGlobalScope, ev: MessageEvent) => any) | null;
+declare var onmessageerror: ((this: DedicatedWorkerGlobalScope, ev: MessageEvent) => any) | null;
+/** Aborts dedicatedWorkerGlobal. */
+declare function close(): void;
+/** Clones message and transmits it to the Worker object associated with dedicatedWorkerGlobal. transfer can be passed as a list of objects that are to be transferred rather than cloned. */
+declare function postMessage(message: any, transfer: Transferable[]): void;
+declare function postMessage(message: any, options?: StructuredSerializeOptions): void;
+/** Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. */
+declare function dispatchEvent(event: Event): boolean;
+/** Returns workerGlobal's WorkerLocation object. */
+declare var location: WorkerLocation;
+/** Returns workerGlobal's WorkerNavigator object. */
+declare var navigator: WorkerNavigator;
+declare var onerror: ((this: DedicatedWorkerGlobalScope, ev: ErrorEvent) => any) | null;
+declare var onlanguagechange: ((this: DedicatedWorkerGlobalScope, ev: Event) => any) | null;
+declare var onoffline: ((this: DedicatedWorkerGlobalScope, ev: Event) => any) | null;
+declare var ononline: ((this: DedicatedWorkerGlobalScope, ev: Event) => any) | null;
+declare var onrejectionhandled: ((this: DedicatedWorkerGlobalScope, ev: PromiseRejectionEvent) => any) | null;
+declare var onunhandledrejection: ((this: DedicatedWorkerGlobalScope, ev: PromiseRejectionEvent) => any) | null;
+/** Returns workerGlobal. */
+declare var self: WorkerGlobalScope & typeof globalThis;
+/** Fetches each URL in urls, executes them one-by-one in the order they are passed, and then returns (or throws if something went amiss). */
+declare function importScripts(...urls: (string | URL)[]): void;
+/** Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. */
+declare function dispatchEvent(event: Event): boolean;
+declare var fonts: FontFaceSet;
+/** Available only in secure contexts. */
+declare var caches: CacheStorage;
+declare var crossOriginIsolated: boolean;
+declare var crypto: Crypto;
+declare var indexedDB: IDBFactory;
+declare var isSecureContext: boolean;
+declare var origin: string;
+declare var performance: Performance;
+declare function atob(data: string): string;
+declare function btoa(data: string): string;
+declare function clearInterval(id: number | undefined): void;
+declare function clearTimeout(id: number | undefined): void;
+declare function createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap>;
+declare function createImageBitmap(image: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;
+declare function fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
+declare function queueMicrotask(callback: VoidFunction): void;
+declare function reportError(e: any): void;
+declare function setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
+declare function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
+declare function structuredClone(value: any, options?: StructuredSerializeOptions): any;
+declare function cancelAnimationFrame(handle: number): void;
+declare function requestAnimationFrame(callback: FrameRequestCallback): number;
+declare function addEventListener<K extends keyof DedicatedWorkerGlobalScopeEventMap>(type: K, listener: (this: DedicatedWorkerGlobalScope, ev: DedicatedWorkerGlobalScopeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
+declare function addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
+declare function removeEventListener<K extends keyof DedicatedWorkerGlobalScopeEventMap>(type: K, listener: (this: DedicatedWorkerGlobalScope, ev: DedicatedWorkerGlobalScopeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
+declare function removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
+type AlgorithmIdentifier = Algorithm | string;
+type BigInteger = Uint8Array;
+type BinaryData = ArrayBuffer | ArrayBufferView;
+type BlobPart = BufferSource | Blob | string;
+type BodyInit = ReadableStream | XMLHttpRequestBodyInit;
+type BufferSource = ArrayBufferView | ArrayBuffer;
+type CanvasImageSource = ImageBitmap | OffscreenCanvas;
+type DOMHighResTimeStamp = number;
+type EpochTimeStamp = number;
+type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
+type Float32List = Float32Array | GLfloat[];
+type FormDataEntryValue = File | string;
+type GLbitfield = number;
+type GLboolean = boolean;
+type GLclampf = number;
+type GLenum = number;
+type GLfloat = number;
+type GLint = number;
+type GLint64 = number;
+type GLintptr = number;
+type GLsizei = number;
+type GLsizeiptr = number;
+type GLuint = number;
+type GLuint64 = number;
+type HashAlgorithmIdentifier = AlgorithmIdentifier;
+type HeadersInit = [string, string][] | Record<string, string> | Headers;
+type IDBValidKey = number | string | Date | BufferSource | IDBValidKey[];
+type ImageBitmapSource = CanvasImageSource | Blob | ImageData;
+type Int32List = Int32Array | GLint[];
+type MessageEventSource = MessagePort | ServiceWorker;
+type NamedCurve = string;
+type OffscreenRenderingContext = OffscreenCanvasRenderingContext2D | ImageBitmapRenderingContext | WebGLRenderingContext | WebGL2RenderingContext;
+type OnErrorEventHandler = OnErrorEventHandlerNonNull | null;
+type PerformanceEntryList = PerformanceEntry[];
+type PushMessageDataInit = BufferSource | string;
+type ReadableStreamController<T> = ReadableStreamDefaultController<T> | ReadableByteStreamController;
+type ReadableStreamReadResult<T> = ReadableStreamReadValueResult<T> | ReadableStreamReadDoneResult<T>;
+type ReadableStreamReader<T> = ReadableStreamDefaultReader<T> | ReadableStreamBYOBReader;
+type RequestInfo = Request | string;
+type TexImageSource = ImageBitmap | ImageData | OffscreenCanvas;
+type TimerHandler = string | Function;
+type Transferable = OffscreenCanvas | ImageBitmap | MessagePort | ReadableStream | WritableStream | TransformStream | ArrayBuffer;
+type Uint32List = Uint32Array | GLuint[];
+type VibratePattern = number | number[];
+type XMLHttpRequestBodyInit = Blob | BufferSource | FormData | URLSearchParams | string;
+type BinaryType = "arraybuffer" | "blob";
+type CanvasDirection = "inherit" | "ltr" | "rtl";
+type CanvasFillRule = "evenodd" | "nonzero";
+type CanvasFontKerning = "auto" | "none" | "normal";
+type CanvasFontStretch = "condensed" | "expanded" | "extra-condensed" | "extra-expanded" | "normal" | "semi-condensed" | "semi-expanded" | "ultra-condensed" | "ultra-expanded";
+type CanvasFontVariantCaps = "all-petite-caps" | "all-small-caps" | "normal" | "petite-caps" | "small-caps" | "titling-caps" | "unicase";
+type CanvasLineCap = "butt" | "round" | "square";
+type CanvasLineJoin = "bevel" | "miter" | "round";
+type CanvasTextAlign = "center" | "end" | "left" | "right" | "start";
+type CanvasTextBaseline = "alphabetic" | "bottom" | "hanging" | "ideographic" | "middle" | "top";
+type CanvasTextRendering = "auto" | "geometricPrecision" | "optimizeLegibility" | "optimizeSpeed";
+type ClientTypes = "all" | "sharedworker" | "window" | "worker";
+type ColorGamut = "p3" | "rec2020" | "srgb";
+type ColorSpaceConversion = "default" | "none";
+type DocumentVisibilityState = "hidden" | "visible";
+type EndingType = "native" | "transparent";
+type FileSystemHandleKind = "directory" | "file";
+type FontDisplay = "auto" | "block" | "fallback" | "optional" | "swap";
+type FontFaceLoadStatus = "error" | "loaded" | "loading" | "unloaded";
+type FontFaceSetLoadStatus = "loaded" | "loading";
+type FrameType = "auxiliary" | "nested" | "none" | "top-level";
+type GlobalCompositeOperation = "color" | "color-burn" | "color-dodge" | "copy" | "darken" | "destination-atop" | "destination-in" | "destination-out" | "destination-over" | "difference" | "exclusion" | "hard-light" | "hue" | "lighten" | "lighter" | "luminosity" | "multiply" | "overlay" | "saturation" | "screen" | "soft-light" | "source-atop" | "source-in" | "source-out" | "source-over" | "xor";
+type HdrMetadataType = "smpteSt2086" | "smpteSt2094-10" | "smpteSt2094-40";
+type IDBCursorDirection = "next" | "nextunique" | "prev" | "prevunique";
+type IDBRequestReadyState = "done" | "pending";
+type IDBTransactionDurability = "default" | "relaxed" | "strict";
+type IDBTransactionMode = "readonly" | "readwrite" | "versionchange";
+type ImageOrientation = "flipY" | "from-image";
+type ImageSmoothingQuality = "high" | "low" | "medium";
+type KeyFormat = "jwk" | "pkcs8" | "raw" | "spki";
+type KeyType = "private" | "public" | "secret";
+type KeyUsage = "decrypt" | "deriveBits" | "deriveKey" | "encrypt" | "sign" | "unwrapKey" | "verify" | "wrapKey";
+type LockMode = "exclusive" | "shared";
+type MediaDecodingType = "file" | "media-source" | "webrtc";
+type MediaEncodingType = "record" | "webrtc";
+type NotificationDirection = "auto" | "ltr" | "rtl";
+type NotificationPermission = "default" | "denied" | "granted";
+type OffscreenRenderingContextId = "2d" | "bitmaprenderer" | "webgl" | "webgl2" | "webgpu";
+type PermissionName = "geolocation" | "notifications" | "persistent-storage" | "push" | "screen-wake-lock" | "xr-spatial-tracking";
+type PermissionState = "denied" | "granted" | "prompt";
+type PredefinedColorSpace = "display-p3" | "srgb";
+type PremultiplyAlpha = "default" | "none" | "premultiply";
+type PushEncryptionKeyName = "auth" | "p256dh";
+type RTCEncodedVideoFrameType = "delta" | "empty" | "key";
+type ReadableStreamReaderMode = "byob";
+type ReadableStreamType = "bytes";
+type ReferrerPolicy = "" | "no-referrer" | "no-referrer-when-downgrade" | "origin" | "origin-when-cross-origin" | "same-origin" | "strict-origin" | "strict-origin-when-cross-origin" | "unsafe-url";
+type RequestCache = "default" | "force-cache" | "no-cache" | "no-store" | "only-if-cached" | "reload";
+type RequestCredentials = "include" | "omit" | "same-origin";
+type RequestDestination = "" | "audio" | "audioworklet" | "document" | "embed" | "font" | "frame" | "iframe" | "image" | "manifest" | "object" | "paintworklet" | "report" | "script" | "sharedworker" | "style" | "track" | "video" | "worker" | "xslt";
+type RequestMode = "cors" | "navigate" | "no-cors" | "same-origin";
+type RequestRedirect = "error" | "follow" | "manual";
+type ResizeQuality = "high" | "low" | "medium" | "pixelated";
+type ResponseType = "basic" | "cors" | "default" | "error" | "opaque" | "opaqueredirect";
+type SecurityPolicyViolationEventDisposition = "enforce" | "report";
+type ServiceWorkerState = "activated" | "activating" | "installed" | "installing" | "parsed" | "redundant";
+type ServiceWorkerUpdateViaCache = "all" | "imports" | "none";
+type TransferFunction = "hlg" | "pq" | "srgb";
+type VideoColorPrimaries = "bt470bg" | "bt709" | "smpte170m";
+type VideoMatrixCoefficients = "bt470bg" | "bt709" | "rgb" | "smpte170m";
+type VideoTransferCharacteristics = "bt709" | "iec61966-2-1" | "smpte170m";
+type WebGLPowerPreference = "default" | "high-performance" | "low-power";
+type WorkerType = "classic" | "module";
+type XMLHttpRequestResponseType = "" | "arraybuffer" | "blob" | "document" | "json" | "text";
+`; $i["lib.webworker.importscripts.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+
+/////////////////////////////
+/// WorkerGlobalScope APIs
+/////////////////////////////
+// These are only available in a Web Worker
+declare function importScripts(...urls: string[]): void;
+`; $i["lib.webworker.iterable.d.ts"] = `/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+
+
+/// <reference no-default-lib="true"/>
+
+/////////////////////////////
+/// Worker Iterable APIs
+/////////////////////////////
+
+interface Cache {
+    addAll(requests: Iterable<RequestInfo>): Promise<void>;
+}
+
+interface CanvasPath {
+    roundRect(x: number, y: number, w: number, h: number, radii?: number | DOMPointInit | Iterable<number | DOMPointInit>): void;
+}
+
+interface CanvasPathDrawingStyles {
+    setLineDash(segments: Iterable<number>): void;
+}
+
+interface DOMStringList {
+    [Symbol.iterator](): IterableIterator<string>;
+}
+
+interface FileList {
+    [Symbol.iterator](): IterableIterator<File>;
+}
+
+interface FontFaceSet extends Set<FontFace> {
+}
+
+interface FormData {
+    [Symbol.iterator](): IterableIterator<[string, FormDataEntryValue]>;
+    /** Returns an array of key, value pairs for every entry in the list. */
+    entries(): IterableIterator<[string, FormDataEntryValue]>;
+    /** Returns a list of keys in the list. */
+    keys(): IterableIterator<string>;
+    /** Returns a list of values in the list. */
+    values(): IterableIterator<FormDataEntryValue>;
+}
+
+interface Headers {
+    [Symbol.iterator](): IterableIterator<[string, string]>;
+    /** Returns an iterator allowing to go through all key/value pairs contained in this object. */
+    entries(): IterableIterator<[string, string]>;
+    /** Returns an iterator allowing to go through all keys of the key/value pairs contained in this object. */
+    keys(): IterableIterator<string>;
+    /** Returns an iterator allowing to go through all values of the key/value pairs contained in this object. */
+    values(): IterableIterator<string>;
+}
+
+interface IDBDatabase {
+    /** Returns a new transaction with the given mode ("readonly" or "readwrite") and scope which can be a single object store name or an array of names. */
+    transaction(storeNames: string | Iterable<string>, mode?: IDBTransactionMode, options?: IDBTransactionOptions): IDBTransaction;
+}
+
+interface IDBObjectStore {
+    /**
+     * Creates a new index in store with the given name, keyPath and options and returns a new IDBIndex. If the keyPath and options define constraints that cannot be satisfied with the data already in store the upgrade transaction will abort with a "ConstraintError" DOMException.
+     *
+     * Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.
+     */
+    createIndex(name: string, keyPath: string | Iterable<string>, options?: IDBIndexParameters): IDBIndex;
+}
+
+interface MessageEvent<T = any> {
+    /** @deprecated */
+    initMessageEvent(type: string, bubbles?: boolean, cancelable?: boolean, data?: any, origin?: string, lastEventId?: string, source?: MessageEventSource | null, ports?: Iterable<MessagePort>): void;
+}
+
+interface SubtleCrypto {
+    deriveKey(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, derivedKeyType: AlgorithmIdentifier | AesDerivedKeyParams | HmacImportParams | HkdfParams | Pbkdf2Params, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKey>;
+    generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKeyPair>;
+    generateKey(algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKey>;
+    generateKey(algorithm: AlgorithmIdentifier, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKeyPair | CryptoKey>;
+    importKey(format: "jwk", keyData: JsonWebKey, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: ReadonlyArray<KeyUsage>): Promise<CryptoKey>;
+    importKey(format: Exclude<KeyFormat, "jwk">, keyData: BufferSource, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKey>;
+    unwrapKey(format: KeyFormat, wrappedKey: BufferSource, unwrappingKey: CryptoKey, unwrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, unwrappedKeyAlgorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKey>;
+}
+
+interface URLSearchParams {
+    [Symbol.iterator](): IterableIterator<[string, string]>;
+    /** Returns an array of key, value pairs for every entry in the search params. */
+    entries(): IterableIterator<[string, string]>;
+    /** Returns a list of keys in the search params. */
+    keys(): IterableIterator<string>;
+    /** Returns a list of values in the search params. */
+    values(): IterableIterator<string>;
+}
+
+interface WEBGL_draw_buffers {
+    drawBuffersWEBGL(buffers: Iterable<GLenum>): void;
+}
+
+interface WEBGL_multi_draw {
+    multiDrawArraysInstancedWEBGL(mode: GLenum, firstsList: Int32Array | Iterable<GLint>, firstsOffset: GLuint, countsList: Int32Array | Iterable<GLsizei>, countsOffset: GLuint, instanceCountsList: Int32Array | Iterable<GLsizei>, instanceCountsOffset: GLuint, drawcount: GLsizei): void;
+    multiDrawArraysWEBGL(mode: GLenum, firstsList: Int32Array | Iterable<GLint>, firstsOffset: GLuint, countsList: Int32Array | Iterable<GLsizei>, countsOffset: GLuint, drawcount: GLsizei): void;
+    multiDrawElementsInstancedWEBGL(mode: GLenum, countsList: Int32Array | Iterable<GLsizei>, countsOffset: GLuint, type: GLenum, offsetsList: Int32Array | Iterable<GLsizei>, offsetsOffset: GLuint, instanceCountsList: Int32Array | Iterable<GLsizei>, instanceCountsOffset: GLuint, drawcount: GLsizei): void;
+    multiDrawElementsWEBGL(mode: GLenum, countsList: Int32Array | Iterable<GLsizei>, countsOffset: GLuint, type: GLenum, offsetsList: Int32Array | Iterable<GLsizei>, offsetsOffset: GLuint, drawcount: GLsizei): void;
+}
+
+interface WebGL2RenderingContextBase {
+    clearBufferfv(buffer: GLenum, drawbuffer: GLint, values: Iterable<GLfloat>, srcOffset?: GLuint): void;
+    clearBufferiv(buffer: GLenum, drawbuffer: GLint, values: Iterable<GLint>, srcOffset?: GLuint): void;
+    clearBufferuiv(buffer: GLenum, drawbuffer: GLint, values: Iterable<GLuint>, srcOffset?: GLuint): void;
+    drawBuffers(buffers: Iterable<GLenum>): void;
+    getActiveUniforms(program: WebGLProgram, uniformIndices: Iterable<GLuint>, pname: GLenum): any;
+    getUniformIndices(program: WebGLProgram, uniformNames: Iterable<string>): Iterable<GLuint> | null;
+    invalidateFramebuffer(target: GLenum, attachments: Iterable<GLenum>): void;
+    invalidateSubFramebuffer(target: GLenum, attachments: Iterable<GLenum>, x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
+    transformFeedbackVaryings(program: WebGLProgram, varyings: Iterable<string>, bufferMode: GLenum): void;
+    uniform1uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform2uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform3uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform4uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix2x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix2x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix3x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix3x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix4x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix4x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    vertexAttribI4iv(index: GLuint, values: Iterable<GLint>): void;
+    vertexAttribI4uiv(index: GLuint, values: Iterable<GLuint>): void;
+}
+
+interface WebGL2RenderingContextOverloads {
+    uniform1fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform1iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform2fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform2iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform3fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform3iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform4fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniform4iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;
+}
+
+interface WebGLRenderingContextBase {
+    vertexAttrib1fv(index: GLuint, values: Iterable<GLfloat>): void;
+    vertexAttrib2fv(index: GLuint, values: Iterable<GLfloat>): void;
+    vertexAttrib3fv(index: GLuint, values: Iterable<GLfloat>): void;
+    vertexAttrib4fv(index: GLuint, values: Iterable<GLfloat>): void;
+}
+
+interface WebGLRenderingContextOverloads {
+    uniform1fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;
+    uniform1iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;
+    uniform2fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;
+    uniform2iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;
+    uniform3fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;
+    uniform3iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;
+    uniform4fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;
+    uniform4iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;
+    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Iterable<GLfloat>): void;
+    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Iterable<GLfloat>): void;
+    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Iterable<GLfloat>): void;
+}
+`; function e_(zd) { return typeof zd == "string" ? /^file:\/\/\//.test(zd) ? !!$i[zd.substr(8)] : !1 : zd.path.indexOf("/lib.") === 0 ? !!$i[zd.path.slice(1)] : !1 } var o8 = class zd { constructor(ti, gt) { this._extraLibs = Object.create(null); this._languageService = iae(this); this._ctx = ti, this._compilerOptions = gt.compilerOptions, this._extraLibs = gt.extraLibs, this._inlayHintsOptions = gt.inlayHintsOptions } getCompilationSettings() { return this._compilerOptions } getLanguageService() { return this._languageService } getExtraLibs() { return this._extraLibs } getScriptFileNames() { return this._ctx.getMirrorModels().map(hs => hs.uri).filter(hs => !e_(hs)).map(hs => hs.toString()).concat(Object.keys(this._extraLibs)) } _getModel(ti) { let gt = this._ctx.getMirrorModels(); for (let hs = 0; hs < gt.length; hs++) { let Mo = gt[hs].uri; if (Mo.toString() === ti || Mo.toString(!0) === ti) return gt[hs] } return null } getScriptVersion(ti) { let gt = this._getModel(ti); return gt ? gt.version.toString() : this.isDefaultLibFileName(ti) ? "1" : ti in this._extraLibs ? String(this._extraLibs[ti].version) : "" } async getScriptText(ti) { return this._getScriptText(ti) } _getScriptText(ti) { let gt, hs = this._getModel(ti), Mo = "lib." + ti + ".d.ts"; if (hs) gt = hs.getValue(); else if (ti in $i) gt = $i[ti]; else if (Mo in $i) gt = $i[Mo]; else if (ti in this._extraLibs) gt = this._extraLibs[ti].content; else return; return gt } getScriptSnapshot(ti) { let gt = this._getScriptText(ti); if (gt !== void 0) return { getText: (hs, Mo) => gt.substring(hs, Mo), getLength: () => gt.length, getChangeRange: () => { } } } getScriptKind(ti) { switch (ti.substr(ti.lastIndexOf(".") + 1)) { case "ts": return uA.TS; case "tsx": return uA.TSX; case "js": return uA.JS; case "jsx": return uA.JSX; default: return this.getCompilationSettings().allowJs ? uA.JS : uA.TS } } getCurrentDirectory() { return "" } getDefaultLibFileName(ti) { switch (ti.target) { case 99: let gt = "lib.esnext.full.d.ts"; if (gt in $i || gt in this._extraLibs) return gt; case 7: case 6: case 5: case 4: case 3: case 2: default: let hs = `lib.es${2013 + (ti.target || 99)}.full.d.ts`; return hs in $i || hs in this._extraLibs ? hs : "lib.es6.d.ts"; case 1: case 0: return "lib.d.ts" } } isDefaultLibFileName(ti) { return ti === this.getDefaultLibFileName(this._compilerOptions) } readFile(ti) { return this._getScriptText(ti) } fileExists(ti) { return this._getScriptText(ti) !== void 0 } async getLibFiles() { return $i } static clearFiles(ti) { let gt = []; for (let hs of ti) { let Mo = { ...hs }; if (Mo.file = Mo.file ? { fileName: Mo.file.fileName } : void 0, hs.relatedInformation) { Mo.relatedInformation = []; for (let Sg of hs.relatedInformation) { let Rf = { ...Sg }; Rf.file = Rf.file ? { fileName: Rf.file.fileName } : void 0, Mo.relatedInformation.push(Rf) } } gt.push(Mo) } return gt } async getSyntacticDiagnostics(ti) { if (e_(ti)) return []; let gt = this._languageService.getSyntacticDiagnostics(ti); return zd.clearFiles(gt) } async getSemanticDiagnostics(ti) { if (e_(ti)) return []; let gt = this._languageService.getSemanticDiagnostics(ti); return zd.clearFiles(gt) } async getSuggestionDiagnostics(ti) { if (e_(ti)) return []; let gt = this._languageService.getSuggestionDiagnostics(ti); return zd.clearFiles(gt) } async getCompilerOptionsDiagnostics(ti) { if (e_(ti)) return []; let gt = this._languageService.getCompilerOptionsDiagnostics(); return zd.clearFiles(gt) } async getCompletionsAtPosition(ti, gt) { if (!e_(ti)) return this._languageService.getCompletionsAtPosition(ti, gt, void 0) } async getCompletionEntryDetails(ti, gt, hs) { return this._languageService.getCompletionEntryDetails(ti, gt, hs, void 0, void 0, void 0, void 0) } async getSignatureHelpItems(ti, gt, hs) { if (!e_(ti)) return this._languageService.getSignatureHelpItems(ti, gt, hs) } async getQuickInfoAtPosition(ti, gt) { if (!e_(ti)) return this._languageService.getQuickInfoAtPosition(ti, gt) } async getDocumentHighlights(ti, gt, hs) { if (!e_(ti)) return this._languageService.getDocumentHighlights(ti, gt, hs) } async getDefinitionAtPosition(ti, gt) { if (!e_(ti)) return this._languageService.getDefinitionAtPosition(ti, gt) } async getReferencesAtPosition(ti, gt) { if (!e_(ti)) return this._languageService.getReferencesAtPosition(ti, gt) } async getNavigationTree(ti) { if (!e_(ti)) return this._languageService.getNavigationTree(ti) } async getFormattingEditsForDocument(ti, gt) { return e_(ti) ? [] : this._languageService.getFormattingEditsForDocument(ti, gt) } async getFormattingEditsForRange(ti, gt, hs, Mo) { return e_(ti) ? [] : this._languageService.getFormattingEditsForRange(ti, gt, hs, Mo) } async getFormattingEditsAfterKeystroke(ti, gt, hs, Mo) { return e_(ti) ? [] : this._languageService.getFormattingEditsAfterKeystroke(ti, gt, hs, Mo) } async findRenameLocations(ti, gt, hs, Mo, Sg) { if (!e_(ti)) return this._languageService.findRenameLocations(ti, gt, hs, Mo, Sg) } async getRenameInfo(ti, gt, hs) { return e_(ti) ? { canRename: !1, localizedErrorMessage: "Cannot rename in lib file" } : this._languageService.getRenameInfo(ti, gt, hs) } async getEmitOutput(ti) { return e_(ti) ? { outputFiles: [], emitSkipped: !0 } : this._languageService.getEmitOutput(ti) } async getCodeFixesAtPosition(ti, gt, hs, Mo, Sg) { if (e_(ti)) return []; let Rf = {}; try { return this._languageService.getCodeFixesAtPosition(ti, gt, hs, Mo, Sg, Rf) } catch { return [] } } async updateExtraLibs(ti) { this._extraLibs = ti } async provideInlayHints(ti, gt, hs) { if (e_(ti)) return []; let Mo = this._inlayHintsOptions ?? {}, Sg = { start: gt, length: hs - gt }; try { return this._languageService.provideInlayHints(ti, Sg, Mo) } catch { return [] } } }; function Lit(zd, ti) { let gt = o8; if (ti.customWorkerPath) if (typeof importScripts > "u") console.warn("Monaco is not using webworkers for background tasks, and that is needed to support the customWorkerPath flag"); else { self.importScripts(ti.customWorkerPath); let hs = self.customTSWorkerFactory; if (!hs) throw new Error(`The script at ${ti.customWorkerPath} does not add customTSWorkerFactory to self`); gt = hs(o8, oae, $i) } return new gt(zd, ti) } globalThis.ts = aae; return bit(kit);
+    })();
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+    
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+    
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+    return moduleExports;
+});
diff --git a/public/vs/loader.js b/public/vs/loader.js
new file mode 100644
index 0000000..48b1b8b
--- /dev/null
+++ b/public/vs/loader.js
@@ -0,0 +1,11 @@
+"use strict";/*!-----------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Version: 0.46.0(21007360cad28648bdf46282a2592cb47c3a7a6f)
+ * Released under the MIT license
+ * https://github.com/microsoft/vscode/blob/main/LICENSE.txt
+ *-----------------------------------------------------------*/const _amdLoaderGlobal=this,_commonjsGlobal=typeof global=="object"?global:{};var AMDLoader;(function(u){u.global=_amdLoaderGlobal;class y{get isWindows(){return this._detect(),this._isWindows}get isNode(){return this._detect(),this._isNode}get isElectronRenderer(){return this._detect(),this._isElectronRenderer}get isWebWorker(){return this._detect(),this._isWebWorker}get isElectronNodeIntegrationWebWorker(){return this._detect(),this._isElectronNodeIntegrationWebWorker}constructor(){this._detected=!1,this._isWindows=!1,this._isNode=!1,this._isElectronRenderer=!1,this._isWebWorker=!1,this._isElectronNodeIntegrationWebWorker=!1}_detect(){this._detected||(this._detected=!0,this._isWindows=y._isWindows(),this._isNode=typeof module<"u"&&!!module.exports,this._isElectronRenderer=typeof process<"u"&&typeof process.versions<"u"&&typeof process.versions.electron<"u"&&process.type==="renderer",this._isWebWorker=typeof u.global.importScripts=="function",this._isElectronNodeIntegrationWebWorker=this._isWebWorker&&typeof process<"u"&&typeof process.versions<"u"&&typeof process.versions.electron<"u"&&process.type==="worker")}static _isWindows(){return typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.indexOf("Windows")>=0?!0:typeof process<"u"?process.platform==="win32":!1}}u.Environment=y})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(u){class y{constructor(r,c,a){this.type=r,this.detail=c,this.timestamp=a}}u.LoaderEvent=y;class m{constructor(r){this._events=[new y(1,"",r)]}record(r,c){this._events.push(new y(r,c,u.Utilities.getHighPerformanceTimestamp()))}getEvents(){return this._events}}u.LoaderEventRecorder=m;class p{record(r,c){}getEvents(){return[]}}p.INSTANCE=new p,u.NullLoaderEventRecorder=p})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(u){class y{static fileUriToFilePath(p,h){if(h=decodeURI(h).replace(/%23/g,"#"),p){if(/^file:\/\/\//.test(h))return h.substr(8);if(/^file:\/\//.test(h))return h.substr(5)}else if(/^file:\/\//.test(h))return h.substr(7);return h}static startsWith(p,h){return p.length>=h.length&&p.substr(0,h.length)===h}static endsWith(p,h){return p.length>=h.length&&p.substr(p.length-h.length)===h}static containsQueryString(p){return/^[^\#]*\?/gi.test(p)}static isAbsolutePath(p){return/^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(p)}static forEachProperty(p,h){if(p){let r;for(r in p)p.hasOwnProperty(r)&&h(r,p[r])}}static isEmpty(p){let h=!0;return y.forEachProperty(p,()=>{h=!1}),h}static recursiveClone(p){if(!p||typeof p!="object"||p instanceof RegExp||!Array.isArray(p)&&Object.getPrototypeOf(p)!==Object.prototype)return p;let h=Array.isArray(p)?[]:{};return y.forEachProperty(p,(r,c)=>{c&&typeof c=="object"?h[r]=y.recursiveClone(c):h[r]=c}),h}static generateAnonymousModule(){return"===anonymous"+y.NEXT_ANONYMOUS_ID+++"==="}static isAnonymousModule(p){return y.startsWith(p,"===anonymous")}static getHighPerformanceTimestamp(){return this.PERFORMANCE_NOW_PROBED||(this.PERFORMANCE_NOW_PROBED=!0,this.HAS_PERFORMANCE_NOW=u.global.performance&&typeof u.global.performance.now=="function"),this.HAS_PERFORMANCE_NOW?u.global.performance.now():Date.now()}}y.NEXT_ANONYMOUS_ID=1,y.PERFORMANCE_NOW_PROBED=!1,y.HAS_PERFORMANCE_NOW=!1,u.Utilities=y})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(u){function y(h){if(h instanceof Error)return h;const r=new Error(h.message||String(h)||"Unknown Error");return h.stack&&(r.stack=h.stack),r}u.ensureError=y;class m{static validateConfigurationOptions(r){function c(a){if(a.phase==="loading"){console.error('Loading "'+a.moduleId+'" failed'),console.error(a),console.error("Here are the modules that depend on it:"),console.error(a.neededBy);return}if(a.phase==="factory"){console.error('The factory function of "'+a.moduleId+'" has thrown an exception'),console.error(a),console.error("Here are the modules that depend on it:"),console.error(a.neededBy);return}}if(r=r||{},typeof r.baseUrl!="string"&&(r.baseUrl=""),typeof r.isBuild!="boolean"&&(r.isBuild=!1),typeof r.paths!="object"&&(r.paths={}),typeof r.config!="object"&&(r.config={}),typeof r.catchError>"u"&&(r.catchError=!1),typeof r.recordStats>"u"&&(r.recordStats=!1),typeof r.urlArgs!="string"&&(r.urlArgs=""),typeof r.onError!="function"&&(r.onError=c),Array.isArray(r.ignoreDuplicateModules)||(r.ignoreDuplicateModules=[]),r.baseUrl.length>0&&(u.Utilities.endsWith(r.baseUrl,"/")||(r.baseUrl+="/")),typeof r.cspNonce!="string"&&(r.cspNonce=""),typeof r.preferScriptTags>"u"&&(r.preferScriptTags=!1),r.nodeCachedData&&typeof r.nodeCachedData=="object"&&(typeof r.nodeCachedData.seed!="string"&&(r.nodeCachedData.seed="seed"),(typeof r.nodeCachedData.writeDelay!="number"||r.nodeCachedData.writeDelay<0)&&(r.nodeCachedData.writeDelay=1e3*7),!r.nodeCachedData.path||typeof r.nodeCachedData.path!="string")){const a=y(new Error("INVALID cached data configuration, 'path' MUST be set"));a.phase="configuration",r.onError(a),r.nodeCachedData=void 0}return r}static mergeConfigurationOptions(r=null,c=null){let a=u.Utilities.recursiveClone(c||{});return u.Utilities.forEachProperty(r,(t,e)=>{t==="ignoreDuplicateModules"&&typeof a.ignoreDuplicateModules<"u"?a.ignoreDuplicateModules=a.ignoreDuplicateModules.concat(e):t==="paths"&&typeof a.paths<"u"?u.Utilities.forEachProperty(e,(i,s)=>a.paths[i]=s):t==="config"&&typeof a.config<"u"?u.Utilities.forEachProperty(e,(i,s)=>a.config[i]=s):a[t]=u.Utilities.recursiveClone(e)}),m.validateConfigurationOptions(a)}}u.ConfigurationOptionsUtil=m;class p{constructor(r,c){if(this._env=r,this.options=m.mergeConfigurationOptions(c),this._createIgnoreDuplicateModulesMap(),this._createSortedPathsRules(),this.options.baseUrl===""&&this.options.nodeRequire&&this.options.nodeRequire.main&&this.options.nodeRequire.main.filename&&this._env.isNode){let a=this.options.nodeRequire.main.filename,t=Math.max(a.lastIndexOf("/"),a.lastIndexOf("\\"));this.options.baseUrl=a.substring(0,t+1)}}_createIgnoreDuplicateModulesMap(){this.ignoreDuplicateModulesMap={};for(let r=0;r<this.options.ignoreDuplicateModules.length;r++)this.ignoreDuplicateModulesMap[this.options.ignoreDuplicateModules[r]]=!0}_createSortedPathsRules(){this.sortedPathsRules=[],u.Utilities.forEachProperty(this.options.paths,(r,c)=>{Array.isArray(c)?this.sortedPathsRules.push({from:r,to:c}):this.sortedPathsRules.push({from:r,to:[c]})}),this.sortedPathsRules.sort((r,c)=>c.from.length-r.from.length)}cloneAndMerge(r){return new p(this._env,m.mergeConfigurationOptions(r,this.options))}getOptionsLiteral(){return this.options}_applyPaths(r){let c;for(let a=0,t=this.sortedPathsRules.length;a<t;a++)if(c=this.sortedPathsRules[a],u.Utilities.startsWith(r,c.from)){let e=[];for(let i=0,s=c.to.length;i<s;i++)e.push(c.to[i]+r.substr(c.from.length));return e}return[r]}_addUrlArgsToUrl(r){return u.Utilities.containsQueryString(r)?r+"&"+this.options.urlArgs:r+"?"+this.options.urlArgs}_addUrlArgsIfNecessaryToUrl(r){return this.options.urlArgs?this._addUrlArgsToUrl(r):r}_addUrlArgsIfNecessaryToUrls(r){if(this.options.urlArgs)for(let c=0,a=r.length;c<a;c++)r[c]=this._addUrlArgsToUrl(r[c]);return r}moduleIdToPaths(r){if(this._env.isNode&&this.options.amdModulesPattern instanceof RegExp&&!this.options.amdModulesPattern.test(r))return this.isBuild()?["empty:"]:["node|"+r];let c=r,a;if(!u.Utilities.endsWith(c,".js")&&!u.Utilities.isAbsolutePath(c)){a=this._applyPaths(c);for(let t=0,e=a.length;t<e;t++)this.isBuild()&&a[t]==="empty:"||(u.Utilities.isAbsolutePath(a[t])||(a[t]=this.options.baseUrl+a[t]),!u.Utilities.endsWith(a[t],".js")&&!u.Utilities.containsQueryString(a[t])&&(a[t]=a[t]+".js"))}else!u.Utilities.endsWith(c,".js")&&!u.Utilities.containsQueryString(c)&&(c=c+".js"),a=[c];return this._addUrlArgsIfNecessaryToUrls(a)}requireToUrl(r){let c=r;return u.Utilities.isAbsolutePath(c)||(c=this._applyPaths(c)[0],u.Utilities.isAbsolutePath(c)||(c=this.options.baseUrl+c)),this._addUrlArgsIfNecessaryToUrl(c)}isBuild(){return this.options.isBuild}shouldInvokeFactory(r){return!!(!this.options.isBuild||u.Utilities.isAnonymousModule(r)||this.options.buildForceInvokeFactory&&this.options.buildForceInvokeFactory[r])}isDuplicateMessageIgnoredFor(r){return this.ignoreDuplicateModulesMap.hasOwnProperty(r)}getConfigForModule(r){if(this.options.config)return this.options.config[r]}shouldCatchError(){return this.options.catchError}shouldRecordStats(){return this.options.recordStats}onError(r){this.options.onError(r)}}u.Configuration=p})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(u){class y{constructor(e){this._env=e,this._scriptLoader=null,this._callbackMap={}}load(e,i,s,n){if(!this._scriptLoader)if(this._env.isWebWorker)this._scriptLoader=new h;else if(this._env.isElectronRenderer){const{preferScriptTags:d}=e.getConfig().getOptionsLiteral();d?this._scriptLoader=new m:this._scriptLoader=new r(this._env)}else this._env.isNode?this._scriptLoader=new r(this._env):this._scriptLoader=new m;let l={callback:s,errorback:n};if(this._callbackMap.hasOwnProperty(i)){this._callbackMap[i].push(l);return}this._callbackMap[i]=[l],this._scriptLoader.load(e,i,()=>this.triggerCallback(i),d=>this.triggerErrorback(i,d))}triggerCallback(e){let i=this._callbackMap[e];delete this._callbackMap[e];for(let s=0;s<i.length;s++)i[s].callback()}triggerErrorback(e,i){let s=this._callbackMap[e];delete this._callbackMap[e];for(let n=0;n<s.length;n++)s[n].errorback(i)}}class m{attachListeners(e,i,s){let n=()=>{e.removeEventListener("load",l),e.removeEventListener("error",d)},l=o=>{n(),i()},d=o=>{n(),s(o)};e.addEventListener("load",l),e.addEventListener("error",d)}load(e,i,s,n){if(/^node\|/.test(i)){let l=e.getConfig().getOptionsLiteral(),d=c(e.getRecorder(),l.nodeRequire||u.global.nodeRequire),o=i.split("|"),_=null;try{_=d(o[1])}catch(f){n(f);return}e.enqueueDefineAnonymousModule([],()=>_),s()}else{let l=document.createElement("script");l.setAttribute("async","async"),l.setAttribute("type","text/javascript"),this.attachListeners(l,s,n);const{trustedTypesPolicy:d}=e.getConfig().getOptionsLiteral();d&&(i=d.createScriptURL(i)),l.setAttribute("src",i);const{cspNonce:o}=e.getConfig().getOptionsLiteral();o&&l.setAttribute("nonce",o),document.getElementsByTagName("head")[0].appendChild(l)}}}function p(t){const{trustedTypesPolicy:e}=t.getConfig().getOptionsLiteral();try{return(e?self.eval(e.createScript("","true")):new Function("true")).call(self),!0}catch{return!1}}class h{constructor(){this._cachedCanUseEval=null}_canUseEval(e){return this._cachedCanUseEval===null&&(this._cachedCanUseEval=p(e)),this._cachedCanUseEval}load(e,i,s,n){if(/^node\|/.test(i)){const l=e.getConfig().getOptionsLiteral(),d=c(e.getRecorder(),l.nodeRequire||u.global.nodeRequire),o=i.split("|");let _=null;try{_=d(o[1])}catch(f){n(f);return}e.enqueueDefineAnonymousModule([],function(){return _}),s()}else{const{trustedTypesPolicy:l}=e.getConfig().getOptionsLiteral();if(!(/^((http:)|(https:)|(file:))/.test(i)&&i.substring(0,self.origin.length)!==self.origin)&&this._canUseEval(e)){fetch(i).then(o=>{if(o.status!==200)throw new Error(o.statusText);return o.text()}).then(o=>{o=`${o}
+//# sourceURL=${i}`,(l?self.eval(l.createScript("",o)):new Function(o)).call(self),s()}).then(void 0,n);return}try{l&&(i=l.createScriptURL(i)),importScripts(i),s()}catch(o){n(o)}}}}class r{constructor(e){this._env=e,this._didInitialize=!1,this._didPatchNodeRequire=!1}_init(e){this._didInitialize||(this._didInitialize=!0,this._fs=e("fs"),this._vm=e("vm"),this._path=e("path"),this._crypto=e("crypto"))}_initNodeRequire(e,i){const{nodeCachedData:s}=i.getConfig().getOptionsLiteral();if(!s||this._didPatchNodeRequire)return;this._didPatchNodeRequire=!0;const n=this,l=e("module");function d(o){const _=o.constructor;let f=function(v){try{return o.require(v)}finally{}};return f.resolve=function(v,E){return _._resolveFilename(v,o,!1,E)},f.resolve.paths=function(v){return _._resolveLookupPaths(v,o)},f.main=process.mainModule,f.extensions=_._extensions,f.cache=_._cache,f}l.prototype._compile=function(o,_){const f=l.wrap(o.replace(/^#!.*/,"")),g=i.getRecorder(),v=n._getCachedDataPath(s,_),E={filename:_};let I;try{const D=n._fs.readFileSync(v);I=D.slice(0,16),E.cachedData=D.slice(16),g.record(60,v)}catch{g.record(61,v)}const C=new n._vm.Script(f,E),P=C.runInThisContext(E),w=n._path.dirname(_),R=d(this),U=[this.exports,R,this,_,w,process,_commonjsGlobal,Buffer],b=P.apply(this.exports,U);return n._handleCachedData(C,f,v,!E.cachedData,i),n._verifyCachedData(C,f,v,I,i),b}}load(e,i,s,n){const l=e.getConfig().getOptionsLiteral(),d=c(e.getRecorder(),l.nodeRequire||u.global.nodeRequire),o=l.nodeInstrumenter||function(f){return f};this._init(d),this._initNodeRequire(d,e);let _=e.getRecorder();if(/^node\|/.test(i)){let f=i.split("|"),g=null;try{g=d(f[1])}catch(v){n(v);return}e.enqueueDefineAnonymousModule([],()=>g),s()}else{i=u.Utilities.fileUriToFilePath(this._env.isWindows,i);const f=this._path.normalize(i),g=this._getElectronRendererScriptPathOrUri(f),v=!!l.nodeCachedData,E=v?this._getCachedDataPath(l.nodeCachedData,i):void 0;this._readSourceAndCachedData(f,E,_,(I,C,P,w)=>{if(I){n(I);return}let R;C.charCodeAt(0)===r._BOM?R=r._PREFIX+C.substring(1)+r._SUFFIX:R=r._PREFIX+C+r._SUFFIX,R=o(R,f);const U={filename:g,cachedData:P},b=this._createAndEvalScript(e,R,U,s,n);this._handleCachedData(b,R,E,v&&!P,e),this._verifyCachedData(b,R,E,w,e)})}}_createAndEvalScript(e,i,s,n,l){const d=e.getRecorder();d.record(31,s.filename);const o=new this._vm.Script(i,s),_=o.runInThisContext(s),f=e.getGlobalAMDDefineFunc();let g=!1;const v=function(){return g=!0,f.apply(null,arguments)};return v.amd=f.amd,_.call(u.global,e.getGlobalAMDRequireFunc(),v,s.filename,this._path.dirname(s.filename)),d.record(32,s.filename),g?n():l(new Error(`Didn't receive define call in ${s.filename}!`)),o}_getElectronRendererScriptPathOrUri(e){if(!this._env.isElectronRenderer)return e;let i=e.match(/^([a-z])\:(.*)/i);return i?`file:///${(i[1].toUpperCase()+":"+i[2]).replace(/\\/g,"/")}`:`file://${e}`}_getCachedDataPath(e,i){const s=this._crypto.createHash("md5").update(i,"utf8").update(e.seed,"utf8").update(process.arch,"").digest("hex"),n=this._path.basename(i).replace(/\.js$/,"");return this._path.join(e.path,`${n}-${s}.code`)}_handleCachedData(e,i,s,n,l){e.cachedDataRejected?this._fs.unlink(s,d=>{l.getRecorder().record(62,s),this._createAndWriteCachedData(e,i,s,l),d&&l.getConfig().onError(d)}):n&&this._createAndWriteCachedData(e,i,s,l)}_createAndWriteCachedData(e,i,s,n){let l=Math.ceil(n.getConfig().getOptionsLiteral().nodeCachedData.writeDelay*(1+Math.random())),d=-1,o=0,_;const f=()=>{setTimeout(()=>{_||(_=this._crypto.createHash("md5").update(i,"utf8").digest());const g=e.createCachedData();if(!(g.length===0||g.length===d||o>=5)){if(g.length<d){f();return}d=g.length,this._fs.writeFile(s,Buffer.concat([_,g]),v=>{v&&n.getConfig().onError(v),n.getRecorder().record(63,s),f()})}},l*Math.pow(4,o++))};f()}_readSourceAndCachedData(e,i,s,n){if(!i)this._fs.readFile(e,{encoding:"utf8"},n);else{let l,d,o,_=2;const f=g=>{g?n(g):--_===0&&n(void 0,l,d,o)};this._fs.readFile(e,{encoding:"utf8"},(g,v)=>{l=v,f(g)}),this._fs.readFile(i,(g,v)=>{!g&&v&&v.length>0?(o=v.slice(0,16),d=v.slice(16),s.record(60,i)):s.record(61,i),f()})}}_verifyCachedData(e,i,s,n,l){n&&(e.cachedDataRejected||setTimeout(()=>{const d=this._crypto.createHash("md5").update(i,"utf8").digest();n.equals(d)||(l.getConfig().onError(new Error(`FAILED TO VERIFY CACHED DATA, deleting stale '${s}' now, but a RESTART IS REQUIRED`)),this._fs.unlink(s,o=>{o&&l.getConfig().onError(o)}))},Math.ceil(5e3*(1+Math.random()))))}}r._BOM=65279,r._PREFIX="(function (require, define, __filename, __dirname) { ",r._SUFFIX=`
+});`;function c(t,e){if(e.__$__isRecorded)return e;const i=function(n){t.record(33,n);try{return e(n)}finally{t.record(34,n)}};return i.__$__isRecorded=!0,i}u.ensureRecordedNodeRequire=c;function a(t){return new y(t)}u.createScriptLoader=a})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(u){class y{constructor(t){let e=t.lastIndexOf("/");e!==-1?this.fromModulePath=t.substr(0,e+1):this.fromModulePath=""}static _normalizeModuleId(t){let e=t,i;for(i=/\/\.\//;i.test(e);)e=e.replace(i,"/");for(e=e.replace(/^\.\//g,""),i=/\/(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//;i.test(e);)e=e.replace(i,"/");return e=e.replace(/^(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//,""),e}resolveModule(t){let e=t;return u.Utilities.isAbsolutePath(e)||(u.Utilities.startsWith(e,"./")||u.Utilities.startsWith(e,"../"))&&(e=y._normalizeModuleId(this.fromModulePath+e)),e}}y.ROOT=new y(""),u.ModuleIdResolver=y;class m{constructor(t,e,i,s,n,l){this.id=t,this.strId=e,this.dependencies=i,this._callback=s,this._errorback=n,this.moduleIdResolver=l,this.exports={},this.error=null,this.exportsPassedIn=!1,this.unresolvedDependenciesCount=this.dependencies.length,this._isComplete=!1}static _safeInvokeFunction(t,e){try{return{returnedValue:t.apply(u.global,e),producedError:null}}catch(i){return{returnedValue:null,producedError:i}}}static _invokeFactory(t,e,i,s){return t.shouldInvokeFactory(e)?t.shouldCatchError()?this._safeInvokeFunction(i,s):{returnedValue:i.apply(u.global,s),producedError:null}:{returnedValue:null,producedError:null}}complete(t,e,i,s){this._isComplete=!0;let n=null;if(this._callback)if(typeof this._callback=="function"){t.record(21,this.strId);let l=m._invokeFactory(e,this.strId,this._callback,i);n=l.producedError,t.record(22,this.strId),!n&&typeof l.returnedValue<"u"&&(!this.exportsPassedIn||u.Utilities.isEmpty(this.exports))&&(this.exports=l.returnedValue)}else this.exports=this._callback;if(n){let l=u.ensureError(n);l.phase="factory",l.moduleId=this.strId,l.neededBy=s(this.id),this.error=l,e.onError(l)}this.dependencies=null,this._callback=null,this._errorback=null,this.moduleIdResolver=null}onDependencyError(t){return this._isComplete=!0,this.error=t,this._errorback?(this._errorback(t),!0):!1}isComplete(){return this._isComplete}}u.Module=m;class p{constructor(){this._nextId=0,this._strModuleIdToIntModuleId=new Map,this._intModuleIdToStrModuleId=[],this.getModuleId("exports"),this.getModuleId("module"),this.getModuleId("require")}getMaxModuleId(){return this._nextId}getModuleId(t){let e=this._strModuleIdToIntModuleId.get(t);return typeof e>"u"&&(e=this._nextId++,this._strModuleIdToIntModuleId.set(t,e),this._intModuleIdToStrModuleId[e]=t),e}getStrModuleId(t){return this._intModuleIdToStrModuleId[t]}}class h{constructor(t){this.id=t}}h.EXPORTS=new h(0),h.MODULE=new h(1),h.REQUIRE=new h(2),u.RegularDependency=h;class r{constructor(t,e,i){this.id=t,this.pluginId=e,this.pluginParam=i}}u.PluginDependency=r;class c{constructor(t,e,i,s,n=0){this._env=t,this._scriptLoader=e,this._loaderAvailableTimestamp=n,this._defineFunc=i,this._requireFunc=s,this._moduleIdProvider=new p,this._config=new u.Configuration(this._env),this._hasDependencyCycle=!1,this._modules2=[],this._knownModules2=[],this._inverseDependencies2=[],this._inversePluginDependencies2=new Map,this._currentAnonymousDefineCall=null,this._recorder=null,this._buildInfoPath=[],this._buildInfoDefineStack=[],this._buildInfoDependencies=[],this._requireFunc.moduleManager=this}reset(){return new c(this._env,this._scriptLoader,this._defineFunc,this._requireFunc,this._loaderAvailableTimestamp)}getGlobalAMDDefineFunc(){return this._defineFunc}getGlobalAMDRequireFunc(){return this._requireFunc}static _findRelevantLocationInStack(t,e){let i=l=>l.replace(/\\/g,"/"),s=i(t),n=e.split(/\n/);for(let l=0;l<n.length;l++){let d=n[l].match(/(.*):(\d+):(\d+)\)?$/);if(d){let o=d[1],_=d[2],f=d[3],g=Math.max(o.lastIndexOf(" ")+1,o.lastIndexOf("(")+1);if(o=o.substr(g),o=i(o),o===s){let v={line:parseInt(_,10),col:parseInt(f,10)};return v.line===1&&(v.col-=53),v}}}throw new Error("Could not correlate define call site for needle "+t)}getBuildInfo(){if(!this._config.isBuild())return null;let t=[],e=0;for(let i=0,s=this._modules2.length;i<s;i++){let n=this._modules2[i];if(!n)continue;let l=this._buildInfoPath[n.id]||null,d=this._buildInfoDefineStack[n.id]||null,o=this._buildInfoDependencies[n.id];t[e++]={id:n.strId,path:l,defineLocation:l&&d?c._findRelevantLocationInStack(l,d):null,dependencies:o,shim:null,exports:n.exports}}return t}getRecorder(){return this._recorder||(this._config.shouldRecordStats()?this._recorder=new u.LoaderEventRecorder(this._loaderAvailableTimestamp):this._recorder=u.NullLoaderEventRecorder.INSTANCE),this._recorder}getLoaderEvents(){return this.getRecorder().getEvents()}enqueueDefineAnonymousModule(t,e){if(this._currentAnonymousDefineCall!==null)throw new Error("Can only have one anonymous define call per script file");let i=null;this._config.isBuild()&&(i=new Error("StackLocation").stack||null),this._currentAnonymousDefineCall={stack:i,dependencies:t,callback:e}}defineModule(t,e,i,s,n,l=new y(t)){let d=this._moduleIdProvider.getModuleId(t);if(this._modules2[d]){this._config.isDuplicateMessageIgnoredFor(t)||console.warn("Duplicate definition of module '"+t+"'");return}let o=new m(d,t,this._normalizeDependencies(e,l),i,s,l);this._modules2[d]=o,this._config.isBuild()&&(this._buildInfoDefineStack[d]=n,this._buildInfoDependencies[d]=(o.dependencies||[]).map(_=>this._moduleIdProvider.getStrModuleId(_.id))),this._resolve(o)}_normalizeDependency(t,e){if(t==="exports")return h.EXPORTS;if(t==="module")return h.MODULE;if(t==="require")return h.REQUIRE;let i=t.indexOf("!");if(i>=0){let s=e.resolveModule(t.substr(0,i)),n=e.resolveModule(t.substr(i+1)),l=this._moduleIdProvider.getModuleId(s+"!"+n),d=this._moduleIdProvider.getModuleId(s);return new r(l,d,n)}return new h(this._moduleIdProvider.getModuleId(e.resolveModule(t)))}_normalizeDependencies(t,e){let i=[],s=0;for(let n=0,l=t.length;n<l;n++)i[s++]=this._normalizeDependency(t[n],e);return i}_relativeRequire(t,e,i,s){if(typeof e=="string")return this.synchronousRequire(e,t);this.defineModule(u.Utilities.generateAnonymousModule(),e,i,s,null,t)}synchronousRequire(t,e=new y(t)){let i=this._normalizeDependency(t,e),s=this._modules2[i.id];if(!s)throw new Error("Check dependency list! Synchronous require cannot resolve module '"+t+"'. This is the first mention of this module!");if(!s.isComplete())throw new Error("Check dependency list! Synchronous require cannot resolve module '"+t+"'. This module has not been resolved completely yet.");if(s.error)throw s.error;return s.exports}configure(t,e){let i=this._config.shouldRecordStats();e?this._config=new u.Configuration(this._env,t):this._config=this._config.cloneAndMerge(t),this._config.shouldRecordStats()&&!i&&(this._recorder=null)}getConfig(){return this._config}_onLoad(t){if(this._currentAnonymousDefineCall!==null){let e=this._currentAnonymousDefineCall;this._currentAnonymousDefineCall=null,this.defineModule(this._moduleIdProvider.getStrModuleId(t),e.dependencies,e.callback,null,e.stack)}}_createLoadError(t,e){let i=this._moduleIdProvider.getStrModuleId(t),s=(this._inverseDependencies2[t]||[]).map(l=>this._moduleIdProvider.getStrModuleId(l));const n=u.ensureError(e);return n.phase="loading",n.moduleId=i,n.neededBy=s,n}_onLoadError(t,e){const i=this._createLoadError(t,e);this._modules2[t]||(this._modules2[t]=new m(t,this._moduleIdProvider.getStrModuleId(t),[],()=>{},null,null));let s=[];for(let d=0,o=this._moduleIdProvider.getMaxModuleId();d<o;d++)s[d]=!1;let n=!1,l=[];for(l.push(t),s[t]=!0;l.length>0;){let d=l.shift(),o=this._modules2[d];o&&(n=o.onDependencyError(i)||n);let _=this._inverseDependencies2[d];if(_)for(let f=0,g=_.length;f<g;f++){let v=_[f];s[v]||(l.push(v),s[v]=!0)}}n||this._config.onError(i)}_hasDependencyPath(t,e){let i=this._modules2[t];if(!i)return!1;let s=[];for(let l=0,d=this._moduleIdProvider.getMaxModuleId();l<d;l++)s[l]=!1;let n=[];for(n.push(i),s[t]=!0;n.length>0;){let d=n.shift().dependencies;if(d)for(let o=0,_=d.length;o<_;o++){let f=d[o];if(f.id===e)return!0;let g=this._modules2[f.id];g&&!s[f.id]&&(s[f.id]=!0,n.push(g))}}return!1}_findCyclePath(t,e,i){if(t===e||i===50)return[t];let s=this._modules2[t];if(!s)return null;let n=s.dependencies;if(n)for(let l=0,d=n.length;l<d;l++){let o=this._findCyclePath(n[l].id,e,i+1);if(o!==null)return o.push(t),o}return null}_createRequire(t){let e=(i,s,n)=>this._relativeRequire(t,i,s,n);return e.toUrl=i=>this._config.requireToUrl(t.resolveModule(i)),e.getStats=()=>this.getLoaderEvents(),e.hasDependencyCycle=()=>this._hasDependencyCycle,e.config=(i,s=!1)=>{this.configure(i,s)},e.__$__nodeRequire=u.global.nodeRequire,e}_loadModule(t){if(this._modules2[t]||this._knownModules2[t])return;this._knownModules2[t]=!0;let e=this._moduleIdProvider.getStrModuleId(t),i=this._config.moduleIdToPaths(e),s=/^@[^\/]+\/[^\/]+$/;this._env.isNode&&(e.indexOf("/")===-1||s.test(e))&&i.push("node|"+e);let n=-1,l=d=>{if(n++,n>=i.length)this._onLoadError(t,d);else{let o=i[n],_=this.getRecorder();if(this._config.isBuild()&&o==="empty:"){this._buildInfoPath[t]=o,this.defineModule(this._moduleIdProvider.getStrModuleId(t),[],null,null,null),this._onLoad(t);return}_.record(10,o),this._scriptLoader.load(this,o,()=>{this._config.isBuild()&&(this._buildInfoPath[t]=o),_.record(11,o),this._onLoad(t)},f=>{_.record(12,o),l(f)})}};l(null)}_loadPluginDependency(t,e){if(this._modules2[e.id]||this._knownModules2[e.id])return;this._knownModules2[e.id]=!0;let i=s=>{this.defineModule(this._moduleIdProvider.getStrModuleId(e.id),[],s,null,null)};i.error=s=>{this._config.onError(this._createLoadError(e.id,s))},t.load(e.pluginParam,this._createRequire(y.ROOT),i,this._config.getOptionsLiteral())}_resolve(t){let e=t.dependencies;if(e)for(let i=0,s=e.length;i<s;i++){let n=e[i];if(n===h.EXPORTS){t.exportsPassedIn=!0,t.unresolvedDependenciesCount--;continue}if(n===h.MODULE){t.unresolvedDependenciesCount--;continue}if(n===h.REQUIRE){t.unresolvedDependenciesCount--;continue}let l=this._modules2[n.id];if(l&&l.isComplete()){if(l.error){t.onDependencyError(l.error);return}t.unresolvedDependenciesCount--;continue}if(this._hasDependencyPath(n.id,t.id)){this._hasDependencyCycle=!0,console.warn("There is a dependency cycle between '"+this._moduleIdProvider.getStrModuleId(n.id)+"' and '"+this._moduleIdProvider.getStrModuleId(t.id)+"'. The cyclic path follows:");let d=this._findCyclePath(n.id,t.id,0)||[];d.reverse(),d.push(n.id),console.warn(d.map(o=>this._moduleIdProvider.getStrModuleId(o)).join(` => 
+`)),t.unresolvedDependenciesCount--;continue}if(this._inverseDependencies2[n.id]=this._inverseDependencies2[n.id]||[],this._inverseDependencies2[n.id].push(t.id),n instanceof r){let d=this._modules2[n.pluginId];if(d&&d.isComplete()){this._loadPluginDependency(d.exports,n);continue}let o=this._inversePluginDependencies2.get(n.pluginId);o||(o=[],this._inversePluginDependencies2.set(n.pluginId,o)),o.push(n),this._loadModule(n.pluginId);continue}this._loadModule(n.id)}t.unresolvedDependenciesCount===0&&this._onModuleComplete(t)}_onModuleComplete(t){let e=this.getRecorder();if(t.isComplete())return;let i=t.dependencies,s=[];if(i)for(let o=0,_=i.length;o<_;o++){let f=i[o];if(f===h.EXPORTS){s[o]=t.exports;continue}if(f===h.MODULE){s[o]={id:t.strId,config:()=>this._config.getConfigForModule(t.strId)};continue}if(f===h.REQUIRE){s[o]=this._createRequire(t.moduleIdResolver);continue}let g=this._modules2[f.id];if(g){s[o]=g.exports;continue}s[o]=null}const n=o=>(this._inverseDependencies2[o]||[]).map(_=>this._moduleIdProvider.getStrModuleId(_));t.complete(e,this._config,s,n);let l=this._inverseDependencies2[t.id];if(this._inverseDependencies2[t.id]=null,l)for(let o=0,_=l.length;o<_;o++){let f=l[o],g=this._modules2[f];g.unresolvedDependenciesCount--,g.unresolvedDependenciesCount===0&&this._onModuleComplete(g)}let d=this._inversePluginDependencies2.get(t.id);if(d){this._inversePluginDependencies2.delete(t.id);for(let o=0,_=d.length;o<_;o++)this._loadPluginDependency(t.exports,d[o])}}}u.ModuleManager=c})(AMDLoader||(AMDLoader={}));var define,AMDLoader;(function(u){const y=new u.Environment;let m=null;const p=function(a,t,e){typeof a!="string"&&(e=t,t=a,a=null),(typeof t!="object"||!Array.isArray(t))&&(e=t,t=null),t||(t=["require","exports","module"]),a?m.defineModule(a,t,e,null,null):m.enqueueDefineAnonymousModule(t,e)};p.amd={jQuery:!0};const h=function(a,t=!1){m.configure(a,t)},r=function(){if(arguments.length===1){if(arguments[0]instanceof Object&&!Array.isArray(arguments[0])){h(arguments[0]);return}if(typeof arguments[0]=="string")return m.synchronousRequire(arguments[0])}if((arguments.length===2||arguments.length===3)&&Array.isArray(arguments[0])){m.defineModule(u.Utilities.generateAnonymousModule(),arguments[0],arguments[1],arguments[2],null);return}throw new Error("Unrecognized require call")};r.config=h,r.getConfig=function(){return m.getConfig().getOptionsLiteral()},r.reset=function(){m=m.reset()},r.getBuildInfo=function(){return m.getBuildInfo()},r.getStats=function(){return m.getLoaderEvents()},r.define=p;function c(){if(typeof u.global.require<"u"||typeof require<"u"){const a=u.global.require||require;if(typeof a=="function"&&typeof a.resolve=="function"){const t=u.ensureRecordedNodeRequire(m.getRecorder(),a);u.global.nodeRequire=t,r.nodeRequire=t,r.__$__nodeRequire=t}}y.isNode&&!y.isElectronRenderer&&!y.isElectronNodeIntegrationWebWorker?module.exports=r:(y.isElectronRenderer||(u.global.define=p),u.global.require=r)}u.init=c,(typeof u.global.define!="function"||!u.global.define.amd)&&(m=new u.ModuleManager(y,u.createScriptLoader(y),p,r,u.Utilities.getHighPerformanceTimestamp()),typeof u.global.require<"u"&&typeof u.global.require!="function"&&r.config(u.global.require),define=function(){return p.apply(null,arguments)},define.amd=p.amd,typeof doNotInitLoader>"u"&&c())})(AMDLoader||(AMDLoader={}));
+
+//# sourceMappingURL=../../min-maps/vs/loader.js.map
\ No newline at end of file
diff --git a/service/_tools_util.spec.ts b/service/_tools_util.spec.ts
new file mode 100644
index 0000000..f06e5a1
--- /dev/null
+++ b/service/_tools_util.spec.ts
@@ -0,0 +1,16 @@
+import { buildProviderQuery } from './_tools_util'
+
+describe('makeProviderQuery', () => {
+  test('collectionName without special chars', () => {
+    expect(buildProviderQuery('ABC')).toBe('provider=ABC')
+  })
+  test('should escape &', () => {
+    expect(buildProviderQuery('ABC&DEF')).toBe('provider=ABC%26DEF')
+  })
+  test('should escape /', () => {
+    expect(buildProviderQuery('ABC/DEF')).toBe('provider=ABC%2FDEF')
+  })
+  test('should escape ?', () => {
+    expect(buildProviderQuery('ABC?DEF')).toBe('provider=ABC%3FDEF')
+  })
+})
diff --git a/service/_tools_util.ts b/service/_tools_util.ts
new file mode 100644
index 0000000..89dede8
--- /dev/null
+++ b/service/_tools_util.ts
@@ -0,0 +1,5 @@
+export const buildProviderQuery = (collectionName: string): string => {
+  const query = new URLSearchParams()
+  query.set('provider', collectionName)
+  return query.toString()
+}
diff --git a/service/annotation.ts b/service/annotation.ts
new file mode 100644
index 0000000..5096a4f
--- /dev/null
+++ b/service/annotation.ts
@@ -0,0 +1,65 @@
+import type { Fetcher } from 'swr'
+import { del, get, post } from './base'
+import type { AnnotationEnableStatus, AnnotationItemBasic, EmbeddingModelConfig } from '@/app/components/app/annotation/type'
+import { ANNOTATION_DEFAULT } from '@/config'
+
+export const fetchAnnotationConfig = (appId: string) => {
+  return get(`apps/${appId}/annotation-setting`)
+}
+export const updateAnnotationStatus = (appId: string, action: AnnotationEnableStatus, embeddingModel?: EmbeddingModelConfig, score?: number) => {
+  let body: any = {
+    score_threshold: score || ANNOTATION_DEFAULT.score_threshold,
+  }
+  if (embeddingModel) {
+    body = {
+      ...body,
+      ...embeddingModel,
+    }
+  }
+
+  return post(`apps/${appId}/annotation-reply/${action}`, {
+    body,
+  })
+}
+
+export const updateAnnotationScore = (appId: string, settingId: string, score: number) => {
+  return post(`apps/${appId}/annotation-settings/${settingId}`, {
+    body: { score_threshold: score },
+  })
+}
+
+export const queryAnnotationJobStatus = (appId: string, action: AnnotationEnableStatus, jobId: string) => {
+  return get(`apps/${appId}/annotation-reply/${action}/status/${jobId}`)
+}
+
+export const fetchAnnotationList = (appId: string, params: Record<string, any>) => {
+  return get(`apps/${appId}/annotations`, { params })
+}
+
+export const fetchExportAnnotationList = (appId: string) => {
+  return get(`apps/${appId}/annotations/export`)
+}
+
+export const addAnnotation = (appId: string, body: AnnotationItemBasic) => {
+  return post(`apps/${appId}/annotations`, { body })
+}
+
+export const annotationBatchImport: Fetcher<{ job_id: string; job_status: string }, { url: string; body: FormData }> = ({ url, body }) => {
+  return post<{ job_id: string; job_status: string }>(url, { body }, { bodyStringify: false, deleteContentType: true })
+}
+
+export const checkAnnotationBatchImportProgress: Fetcher<{ job_id: string; job_status: string }, { jobID: string; appId: string }> = ({ jobID, appId }) => {
+  return get<{ job_id: string; job_status: string }>(`/apps/${appId}/annotations/batch-import-status/${jobID}`)
+}
+
+export const editAnnotation = (appId: string, annotationId: string, body: AnnotationItemBasic) => {
+  return post(`apps/${appId}/annotations/${annotationId}`, { body })
+}
+
+export const delAnnotation = (appId: string, annotationId: string) => {
+  return del(`apps/${appId}/annotations/${annotationId}`)
+}
+
+export const fetchHitHistoryList = (appId: string, annotationId: string, params: Record<string, any>) => {
+  return get(`apps/${appId}/annotations/${annotationId}/hit-histories`, { params })
+}
diff --git a/service/apps.ts b/service/apps.ts
new file mode 100644
index 0000000..3f7ec7b
--- /dev/null
+++ b/service/apps.ts
@@ -0,0 +1,179 @@
+import type { Fetcher } from 'swr'
+import { del, get, patch, post, put } from './base'
+import type { ApiKeysListResponse, AppDailyConversationsResponse, AppDailyEndUsersResponse, AppDailyMessagesResponse, AppDetailResponse, AppListResponse, AppSSOResponse, AppStatisticsResponse, AppTemplatesResponse, AppTokenCostsResponse, AppVoicesListResponse, CreateApiKeyResponse, DSLImportMode, DSLImportResponse, GenerationIntroductionResponse, TracingConfig, TracingStatus, UpdateAppModelConfigResponse, UpdateAppSiteCodeResponse, UpdateOpenAIKeyResponse, ValidateOpenAIKeyResponse, WorkflowDailyConversationsResponse } from '@/models/app'
+import type { CommonResponse } from '@/models/common'
+import type { AppIconType, AppMode, ModelConfig } from '@/types/app'
+import type { TracingProvider } from '@/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/type'
+
+export const fetchAppList: Fetcher<AppListResponse, { url: string; params?: Record<string, any> }> = ({ url, params }) => {
+  return get<AppListResponse>(url, { params })
+}
+
+export const fetchAppDetail = ({ url, id }: { url: string; id: string }) => {
+  return get<AppDetailResponse>(`${url}/${id}`)
+}
+
+export const fetchAppSSO = async ({ appId }: { appId: string }) => {
+  return get<AppSSOResponse>(`/enterprise/app-setting/sso?appID=${appId}`)
+}
+export const updateAppSSO = async ({ id, enabled }: { id: string; enabled: boolean }) => {
+  return post('/enterprise/app-setting/sso', { body: { app_id: id, enabled } })
+}
+
+export const fetchAppTemplates: Fetcher<AppTemplatesResponse, { url: string }> = ({ url }) => {
+  return get<AppTemplatesResponse>(url)
+}
+
+export const createApp: Fetcher<AppDetailResponse, { name: string; icon_type?: AppIconType; icon?: string; icon_background?: string; mode: AppMode; description?: string; config?: ModelConfig }> = ({ name, icon_type, icon, icon_background, mode, description, config }) => {
+  return post<AppDetailResponse>('apps', { body: { name, icon_type, icon, icon_background, mode, description, model_config: config } })
+}
+
+export const updateAppInfo: Fetcher<AppDetailResponse, { appID: string; name: string; icon_type: AppIconType; icon: string; icon_background?: string; description: string; use_icon_as_answer_icon?: boolean }> = ({ appID, name, icon_type, icon, icon_background, description, use_icon_as_answer_icon }) => {
+  return put<AppDetailResponse>(`apps/${appID}`, { body: { name, icon_type, icon, icon_background, description, use_icon_as_answer_icon } })
+}
+
+export const copyApp: Fetcher<AppDetailResponse, { appID: string; name: string; icon_type: AppIconType; icon: string; icon_background?: string | null; mode: AppMode; description?: string }> = ({ appID, name, icon_type, icon, icon_background, mode, description }) => {
+  return post<AppDetailResponse>(`apps/${appID}/copy`, { body: { name, icon_type, icon, icon_background, mode, description } })
+}
+
+export const exportAppConfig: Fetcher<{ data: string }, { appID: string; include?: boolean }> = ({ appID, include = false }) => {
+  return get<{ data: string }>(`apps/${appID}/export?include_secret=${include}`)
+}
+
+// TODO: delete
+export const importApp: Fetcher<AppDetailResponse, { data: string; name?: string; description?: string; icon_type?: AppIconType; icon?: string; icon_background?: string }> = ({ data, name, description, icon_type, icon, icon_background }) => {
+  return post<AppDetailResponse>('apps/import', { body: { data, name, description, icon_type, icon, icon_background } })
+}
+
+// TODO: delete
+export const importAppFromUrl: Fetcher<AppDetailResponse, { url: string; name?: string; description?: string; icon?: string; icon_background?: string }> = ({ url, name, description, icon, icon_background }) => {
+  return post<AppDetailResponse>('apps/import/url', { body: { url, name, description, icon, icon_background } })
+}
+
+export const importDSL: Fetcher<DSLImportResponse, { mode: DSLImportMode; yaml_content?: string; yaml_url?: string; app_id?: string; name?: string; description?: string; icon_type?: AppIconType; icon?: string; icon_background?: string }> = ({ mode, yaml_content, yaml_url, app_id, name, description, icon_type, icon, icon_background }) => {
+  return post<DSLImportResponse>('apps/imports', { body: { mode, yaml_content, yaml_url, app_id, name, description, icon, icon_type, icon_background } })
+}
+
+export const importDSLConfirm: Fetcher<DSLImportResponse, { import_id: string }> = ({ import_id }) => {
+  return post<DSLImportResponse>(`apps/imports/${import_id}/confirm`, { body: {} })
+}
+
+export const switchApp: Fetcher<{ new_app_id: string }, { appID: string; name: string; icon_type: AppIconType; icon: string; icon_background?: string | null }> = ({ appID, name, icon_type, icon, icon_background }) => {
+  return post<{ new_app_id: string }>(`apps/${appID}/convert-to-workflow`, { body: { name, icon_type, icon, icon_background } })
+}
+
+export const deleteApp: Fetcher<CommonResponse, string> = (appID) => {
+  return del<CommonResponse>(`apps/${appID}`)
+}
+
+export const updateAppSiteStatus: Fetcher<AppDetailResponse, { url: string; body: Record<string, any> }> = ({ url, body }) => {
+  return post<AppDetailResponse>(url, { body })
+}
+
+export const updateAppApiStatus: Fetcher<AppDetailResponse, { url: string; body: Record<string, any> }> = ({ url, body }) => {
+  return post<AppDetailResponse>(url, { body })
+}
+
+// path: /apps/{appId}/rate-limit
+export const updateAppRateLimit: Fetcher<AppDetailResponse, { url: string; body: Record<string, any> }> = ({ url, body }) => {
+  return post<AppDetailResponse>(url, { body })
+}
+
+export const updateAppSiteAccessToken: Fetcher<UpdateAppSiteCodeResponse, { url: string }> = ({ url }) => {
+  return post<UpdateAppSiteCodeResponse>(url)
+}
+
+export const updateAppSiteConfig = ({ url, body }: { url: string; body: Record<string, any> }) => {
+  return post<AppDetailResponse>(url, { body })
+}
+
+export const getAppDailyMessages: Fetcher<AppDailyMessagesResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<AppDailyMessagesResponse>(url, { params })
+}
+
+export const getAppDailyConversations: Fetcher<AppDailyConversationsResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<AppDailyConversationsResponse>(url, { params })
+}
+
+export const getWorkflowDailyConversations: Fetcher<WorkflowDailyConversationsResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<WorkflowDailyConversationsResponse>(url, { params })
+}
+
+export const getAppStatistics: Fetcher<AppStatisticsResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<AppStatisticsResponse>(url, { params })
+}
+
+export const getAppDailyEndUsers: Fetcher<AppDailyEndUsersResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<AppDailyEndUsersResponse>(url, { params })
+}
+
+export const getAppTokenCosts: Fetcher<AppTokenCostsResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<AppTokenCostsResponse>(url, { params })
+}
+
+export const updateAppModelConfig: Fetcher<UpdateAppModelConfigResponse, { url: string; body: Record<string, any> }> = ({ url, body }) => {
+  return post<UpdateAppModelConfigResponse>(url, { body })
+}
+
+// For temp testing
+export const fetchAppListNoMock: Fetcher<AppListResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<AppListResponse>(url, params)
+}
+
+export const fetchApiKeysList: Fetcher<ApiKeysListResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<ApiKeysListResponse>(url, params)
+}
+
+export const delApikey: Fetcher<CommonResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return del<CommonResponse>(url, params)
+}
+
+export const createApikey: Fetcher<CreateApiKeyResponse, { url: string; body: Record<string, any> }> = ({ url, body }) => {
+  return post<CreateApiKeyResponse>(url, body)
+}
+
+export const validateOpenAIKey: Fetcher<ValidateOpenAIKeyResponse, { url: string; body: { token: string } }> = ({ url, body }) => {
+  return post<ValidateOpenAIKeyResponse>(url, { body })
+}
+
+export const updateOpenAIKey: Fetcher<UpdateOpenAIKeyResponse, { url: string; body: { token: string } }> = ({ url, body }) => {
+  return post<UpdateOpenAIKeyResponse>(url, { body })
+}
+
+export const generationIntroduction: Fetcher<GenerationIntroductionResponse, { url: string; body: { prompt_template: string } }> = ({ url, body }) => {
+  return post<GenerationIntroductionResponse>(url, { body })
+}
+
+export const fetchAppVoices: Fetcher<AppVoicesListResponse, { appId: string; language?: string }> = ({ appId, language }) => {
+  language = language || 'en-US'
+  return get<AppVoicesListResponse>(`apps/${appId}/text-to-audio/voices?language=${language}`)
+}
+
+// Tracing
+export const fetchTracingStatus: Fetcher<TracingStatus, { appId: string }> = ({ appId }) => {
+  return get(`/apps/${appId}/trace`)
+}
+
+export const updateTracingStatus: Fetcher<CommonResponse, { appId: string; body: Record<string, any> }> = ({ appId, body }) => {
+  return post(`/apps/${appId}/trace`, { body })
+}
+
+export const fetchTracingConfig: Fetcher<TracingConfig & { has_not_configured: true }, { appId: string; provider: TracingProvider }> = ({ appId, provider }) => {
+  return get(`/apps/${appId}/trace-config`, {
+    params: {
+      tracing_provider: provider,
+    },
+  })
+}
+
+export const addTracingConfig: Fetcher<CommonResponse, { appId: string; body: TracingConfig }> = ({ appId, body }) => {
+  return post(`/apps/${appId}/trace-config`, { body })
+}
+
+export const updateTracingConfig: Fetcher<CommonResponse, { appId: string; body: TracingConfig }> = ({ appId, body }) => {
+  return patch(`/apps/${appId}/trace-config`, { body })
+}
+
+export const removeTracingConfig: Fetcher<CommonResponse, { appId: string; provider: TracingProvider }> = ({ appId, provider }) => {
+  return del(`/apps/${appId}/trace-config?tracing_provider=${provider}`)
+}
diff --git a/service/base.ts b/service/base.ts
new file mode 100644
index 0000000..43e65f8
--- /dev/null
+++ b/service/base.ts
@@ -0,0 +1,584 @@
+import { API_PREFIX, IS_CE_EDITION, PUBLIC_API_PREFIX, PUBLIC_WEB_PREFIX, WEB_PREFIX } from '@/config'
+import { refreshAccessTokenOrRelogin } from './refresh-token'
+import Toast from '@/app/components/base/toast'
+import type { AnnotationReply, MessageEnd, MessageReplace, ThoughtItem } from '@/app/components/base/chat/chat/type'
+import type { VisionFile } from '@/types/app'
+import type {
+  AgentLogResponse,
+  IterationFinishedResponse,
+  IterationNextResponse,
+  IterationStartedResponse,
+  LoopFinishedResponse,
+  LoopNextResponse,
+  LoopStartedResponse,
+  NodeFinishedResponse,
+  NodeStartedResponse,
+  ParallelBranchFinishedResponse,
+  ParallelBranchStartedResponse,
+  TextChunkResponse,
+  TextReplaceResponse,
+  WorkflowFinishedResponse,
+  WorkflowStartedResponse,
+} from '@/types/workflow'
+import { removeAccessToken } from '@/app/components/share/utils'
+import type { FetchOptionType, ResponseError } from './fetch'
+import { ContentType, base, baseOptions, getAccessToken } from './fetch'
+import { asyncRunSafe } from '@/utils'
+const TIME_OUT = 100000
+
+export type IOnDataMoreInfo = {
+  conversationId?: string
+  taskId?: string
+  messageId: string
+  errorMessage?: string
+  errorCode?: string
+}
+
+export type IOnData = (message: string, isFirstMessage: boolean, moreInfo: IOnDataMoreInfo) => void
+export type IOnThought = (though: ThoughtItem) => void
+export type IOnFile = (file: VisionFile) => void
+export type IOnMessageEnd = (messageEnd: MessageEnd) => void
+export type IOnMessageReplace = (messageReplace: MessageReplace) => void
+export type IOnAnnotationReply = (messageReplace: AnnotationReply) => void
+export type IOnCompleted = (hasError?: boolean, errorMessage?: string) => void
+export type IOnError = (msg: string, code?: string) => void
+
+export type IOnWorkflowStarted = (workflowStarted: WorkflowStartedResponse) => void
+export type IOnWorkflowFinished = (workflowFinished: WorkflowFinishedResponse) => void
+export type IOnNodeStarted = (nodeStarted: NodeStartedResponse) => void
+export type IOnNodeFinished = (nodeFinished: NodeFinishedResponse) => void
+export type IOnIterationStarted = (workflowStarted: IterationStartedResponse) => void
+export type IOnIterationNext = (workflowStarted: IterationNextResponse) => void
+export type IOnNodeRetry = (nodeFinished: NodeFinishedResponse) => void
+export type IOnIterationFinished = (workflowFinished: IterationFinishedResponse) => void
+export type IOnParallelBranchStarted = (parallelBranchStarted: ParallelBranchStartedResponse) => void
+export type IOnParallelBranchFinished = (parallelBranchFinished: ParallelBranchFinishedResponse) => void
+export type IOnTextChunk = (textChunk: TextChunkResponse) => void
+export type IOnTTSChunk = (messageId: string, audioStr: string, audioType?: string) => void
+export type IOnTTSEnd = (messageId: string, audioStr: string, audioType?: string) => void
+export type IOnTextReplace = (textReplace: TextReplaceResponse) => void
+export type IOnLoopStarted = (workflowStarted: LoopStartedResponse) => void
+export type IOnLoopNext = (workflowStarted: LoopNextResponse) => void
+export type IOnLoopFinished = (workflowFinished: LoopFinishedResponse) => void
+export type IOnAgentLog = (agentLog: AgentLogResponse) => void
+
+export type IOtherOptions = {
+  isPublicAPI?: boolean
+  isMarketplaceAPI?: boolean
+  bodyStringify?: boolean
+  needAllResponseContent?: boolean
+  deleteContentType?: boolean
+  silent?: boolean
+  onData?: IOnData // for stream
+  onThought?: IOnThought
+  onFile?: IOnFile
+  onMessageEnd?: IOnMessageEnd
+  onMessageReplace?: IOnMessageReplace
+  onError?: IOnError
+  onCompleted?: IOnCompleted // for stream
+  getAbortController?: (abortController: AbortController) => void
+
+  onWorkflowStarted?: IOnWorkflowStarted
+  onWorkflowFinished?: IOnWorkflowFinished
+  onNodeStarted?: IOnNodeStarted
+  onNodeFinished?: IOnNodeFinished
+  onIterationStart?: IOnIterationStarted
+  onIterationNext?: IOnIterationNext
+  onIterationFinish?: IOnIterationFinished
+  onNodeRetry?: IOnNodeRetry
+  onParallelBranchStarted?: IOnParallelBranchStarted
+  onParallelBranchFinished?: IOnParallelBranchFinished
+  onTextChunk?: IOnTextChunk
+  onTTSChunk?: IOnTTSChunk
+  onTTSEnd?: IOnTTSEnd
+  onTextReplace?: IOnTextReplace
+  onLoopStart?: IOnLoopStarted
+  onLoopNext?: IOnLoopNext
+  onLoopFinish?: IOnLoopFinished
+  onAgentLog?: IOnAgentLog
+}
+
+function unicodeToChar(text: string) {
+  if (!text)
+    return ''
+
+  return text.replace(/\\u[0-9a-f]{4}/g, (_match, p1) => {
+    return String.fromCharCode(Number.parseInt(p1, 16))
+  })
+}
+
+function requiredWebSSOLogin() {
+  globalThis.location.href = `${PUBLIC_WEB_PREFIX}/webapp-signin?redirect_url=${globalThis.location.pathname}`
+}
+
+export function format(text: string) {
+  let res = text.trim()
+  if (res.startsWith('\n'))
+    res = res.replace('\n', '')
+
+  return res.replaceAll('\n', '<br/>').replaceAll('```', '')
+}
+
+const handleStream = (
+  response: Response,
+  onData: IOnData,
+  onCompleted?: IOnCompleted,
+  onThought?: IOnThought,
+  onMessageEnd?: IOnMessageEnd,
+  onMessageReplace?: IOnMessageReplace,
+  onFile?: IOnFile,
+  onWorkflowStarted?: IOnWorkflowStarted,
+  onWorkflowFinished?: IOnWorkflowFinished,
+  onNodeStarted?: IOnNodeStarted,
+  onNodeFinished?: IOnNodeFinished,
+  onIterationStart?: IOnIterationStarted,
+  onIterationNext?: IOnIterationNext,
+  onIterationFinish?: IOnIterationFinished,
+  onLoopStart?: IOnLoopStarted,
+  onLoopNext?: IOnLoopNext,
+  onLoopFinish?: IOnLoopFinished,
+  onNodeRetry?: IOnNodeRetry,
+  onParallelBranchStarted?: IOnParallelBranchStarted,
+  onParallelBranchFinished?: IOnParallelBranchFinished,
+  onTextChunk?: IOnTextChunk,
+  onTTSChunk?: IOnTTSChunk,
+  onTTSEnd?: IOnTTSEnd,
+  onTextReplace?: IOnTextReplace,
+  onAgentLog?: IOnAgentLog,
+) => {
+  if (!response.ok)
+    throw new Error('Network response was not ok')
+
+  const reader = response.body?.getReader()
+  const decoder = new TextDecoder('utf-8')
+  let buffer = ''
+  let bufferObj: Record<string, any>
+  let isFirstMessage = true
+  function read() {
+    let hasError = false
+    reader?.read().then((result: any) => {
+      if (result.done) {
+        onCompleted && onCompleted()
+        return
+      }
+      buffer += decoder.decode(result.value, { stream: true })
+      const lines = buffer.split('\n')
+      try {
+        lines.forEach((message) => {
+          if (message.startsWith('data: ')) { // check if it starts with data:
+            try {
+              bufferObj = JSON.parse(message.substring(6)) as Record<string, any>// remove data: and parse as json
+            }
+            catch {
+              // mute handle message cut off
+              onData('', isFirstMessage, {
+                conversationId: bufferObj?.conversation_id,
+                messageId: bufferObj?.message_id,
+              })
+              return
+            }
+            if (bufferObj.status === 400 || !bufferObj.event) {
+              onData('', false, {
+                conversationId: undefined,
+                messageId: '',
+                errorMessage: bufferObj?.message,
+                errorCode: bufferObj?.code,
+              })
+              hasError = true
+              onCompleted?.(true, bufferObj?.message)
+              return
+            }
+            if (bufferObj.event === 'message' || bufferObj.event === 'agent_message') {
+              // can not use format here. Because message is splitted.
+              onData(unicodeToChar(bufferObj.answer), isFirstMessage, {
+                conversationId: bufferObj.conversation_id,
+                taskId: bufferObj.task_id,
+                messageId: bufferObj.id,
+              })
+              isFirstMessage = false
+            }
+            else if (bufferObj.event === 'agent_thought') {
+              onThought?.(bufferObj as ThoughtItem)
+            }
+            else if (bufferObj.event === 'message_file') {
+              onFile?.(bufferObj as VisionFile)
+            }
+            else if (bufferObj.event === 'message_end') {
+              onMessageEnd?.(bufferObj as MessageEnd)
+            }
+            else if (bufferObj.event === 'message_replace') {
+              onMessageReplace?.(bufferObj as MessageReplace)
+            }
+            else if (bufferObj.event === 'workflow_started') {
+              onWorkflowStarted?.(bufferObj as WorkflowStartedResponse)
+            }
+            else if (bufferObj.event === 'workflow_finished') {
+              onWorkflowFinished?.(bufferObj as WorkflowFinishedResponse)
+            }
+            else if (bufferObj.event === 'node_started') {
+              onNodeStarted?.(bufferObj as NodeStartedResponse)
+            }
+            else if (bufferObj.event === 'node_finished') {
+              onNodeFinished?.(bufferObj as NodeFinishedResponse)
+            }
+            else if (bufferObj.event === 'iteration_started') {
+              onIterationStart?.(bufferObj as IterationStartedResponse)
+            }
+            else if (bufferObj.event === 'iteration_next') {
+              onIterationNext?.(bufferObj as IterationNextResponse)
+            }
+            else if (bufferObj.event === 'iteration_completed') {
+              onIterationFinish?.(bufferObj as IterationFinishedResponse)
+            }
+            else if (bufferObj.event === 'loop_started') {
+              onLoopStart?.(bufferObj as LoopStartedResponse)
+            }
+            else if (bufferObj.event === 'loop_next') {
+              onLoopNext?.(bufferObj as LoopNextResponse)
+            }
+            else if (bufferObj.event === 'loop_completed') {
+              onLoopFinish?.(bufferObj as LoopFinishedResponse)
+            }
+            else if (bufferObj.event === 'node_retry') {
+              onNodeRetry?.(bufferObj as NodeFinishedResponse)
+            }
+            else if (bufferObj.event === 'parallel_branch_started') {
+              onParallelBranchStarted?.(bufferObj as ParallelBranchStartedResponse)
+            }
+            else if (bufferObj.event === 'parallel_branch_finished') {
+              onParallelBranchFinished?.(bufferObj as ParallelBranchFinishedResponse)
+            }
+            else if (bufferObj.event === 'text_chunk') {
+              onTextChunk?.(bufferObj as TextChunkResponse)
+            }
+            else if (bufferObj.event === 'text_replace') {
+              onTextReplace?.(bufferObj as TextReplaceResponse)
+            }
+            else if (bufferObj.event === 'agent_log') {
+              onAgentLog?.(bufferObj as AgentLogResponse)
+            }
+            else if (bufferObj.event === 'tts_message') {
+              onTTSChunk?.(bufferObj.message_id, bufferObj.audio, bufferObj.audio_type)
+            }
+            else if (bufferObj.event === 'tts_message_end') {
+              onTTSEnd?.(bufferObj.message_id, bufferObj.audio)
+            }
+          }
+        })
+        buffer = lines[lines.length - 1]
+      }
+      catch (e) {
+        onData('', false, {
+          conversationId: undefined,
+          messageId: '',
+          errorMessage: `${e}`,
+        })
+        hasError = true
+        onCompleted?.(true, e as string)
+        return
+      }
+      if (!hasError)
+        read()
+    })
+  }
+  read()
+}
+
+const baseFetch = base
+
+export const upload = async (options: any, isPublicAPI?: boolean, url?: string, searchParams?: string): Promise<any> => {
+  const urlPrefix = isPublicAPI ? PUBLIC_API_PREFIX : API_PREFIX
+  const token = await getAccessToken(isPublicAPI)
+  const defaultOptions = {
+    method: 'POST',
+    url: (url ? `${urlPrefix}${url}` : `${urlPrefix}/files/upload`) + (searchParams || ''),
+    headers: {
+      Authorization: `Bearer ${token}`,
+    },
+    data: {},
+  }
+  options = {
+    ...defaultOptions,
+    ...options,
+    headers: { ...defaultOptions.headers, ...options.headers },
+  }
+  return new Promise((resolve, reject) => {
+    const xhr = options.xhr
+    xhr.open(options.method, options.url)
+    for (const key in options.headers)
+      xhr.setRequestHeader(key, options.headers[key])
+
+    xhr.withCredentials = true
+    xhr.responseType = 'json'
+    xhr.onreadystatechange = function () {
+      if (xhr.readyState === 4) {
+        if (xhr.status === 201)
+          resolve(xhr.response)
+        else
+          reject(xhr)
+      }
+    }
+    xhr.upload.onprogress = options.onprogress
+    xhr.send(options.data)
+  })
+}
+
+export const ssePost = async (
+  url: string,
+  fetchOptions: FetchOptionType,
+  otherOptions: IOtherOptions,
+) => {
+  const {
+    isPublicAPI = false,
+    onData,
+    onCompleted,
+    onThought,
+    onFile,
+    onMessageEnd,
+    onMessageReplace,
+    onWorkflowStarted,
+    onWorkflowFinished,
+    onNodeStarted,
+    onNodeFinished,
+    onIterationStart,
+    onIterationNext,
+    onIterationFinish,
+    onNodeRetry,
+    onParallelBranchStarted,
+    onParallelBranchFinished,
+    onTextChunk,
+    onTTSChunk,
+    onTTSEnd,
+    onTextReplace,
+    onAgentLog,
+    onError,
+    getAbortController,
+    onLoopStart,
+    onLoopNext,
+    onLoopFinish,
+  } = otherOptions
+  const abortController = new AbortController()
+
+  const token = localStorage.getItem('console_token')
+
+  const options = Object.assign({}, baseOptions, {
+    method: 'POST',
+    signal: abortController.signal,
+    headers: new Headers({
+      Authorization: `Bearer ${token}`,
+    }),
+  } as RequestInit, fetchOptions)
+
+  const contentType = (options.headers as Headers).get('Content-Type')
+  if (!contentType)
+    (options.headers as Headers).set('Content-Type', ContentType.json)
+
+  getAbortController?.(abortController)
+
+  const urlPrefix = isPublicAPI ? PUBLIC_API_PREFIX : API_PREFIX
+  const urlWithPrefix = (url.startsWith('http://') || url.startsWith('https://'))
+    ? url
+    : `${urlPrefix}${url.startsWith('/') ? url : `/${url}`}`
+
+  const { body } = options
+  if (body)
+    options.body = JSON.stringify(body)
+
+  const accessToken = await getAccessToken(isPublicAPI)
+    ; (options.headers as Headers).set('Authorization', `Bearer ${accessToken}`)
+
+  globalThis.fetch(urlWithPrefix, options as RequestInit)
+    .then((res) => {
+      if (!/^[23]\d{2}$/.test(String(res.status))) {
+        if (res.status === 401) {
+          refreshAccessTokenOrRelogin(TIME_OUT).then(() => {
+            ssePost(url, fetchOptions, otherOptions)
+          }).catch(() => {
+            res.json().then((data: any) => {
+              if (isPublicAPI) {
+                if (data.code === 'web_sso_auth_required')
+                  requiredWebSSOLogin()
+
+                if (data.code === 'unauthorized') {
+                  removeAccessToken()
+                  globalThis.location.reload()
+                }
+              }
+            })
+          })
+        }
+        else {
+          res.json().then((data) => {
+            Toast.notify({ type: 'error', message: data.message || 'Server Error' })
+          })
+          onError?.('Server Error')
+        }
+        return
+      }
+      return handleStream(res, (str: string, isFirstMessage: boolean, moreInfo: IOnDataMoreInfo) => {
+        if (moreInfo.errorMessage) {
+          onError?.(moreInfo.errorMessage, moreInfo.errorCode)
+          // TypeError: Cannot assign to read only property ... will happen in page leave, so it should be ignored.
+          if (moreInfo.errorMessage !== 'AbortError: The user aborted a request.' && !moreInfo.errorMessage.includes('TypeError: Cannot assign to read only property'))
+            Toast.notify({ type: 'error', message: moreInfo.errorMessage })
+          return
+        }
+        onData?.(str, isFirstMessage, moreInfo)
+      },
+      onCompleted,
+      onThought,
+      onMessageEnd,
+      onMessageReplace,
+      onFile,
+      onWorkflowStarted,
+      onWorkflowFinished,
+      onNodeStarted,
+      onNodeFinished,
+      onIterationStart,
+      onIterationNext,
+      onIterationFinish,
+      onLoopStart,
+      onLoopNext,
+      onLoopFinish,
+      onNodeRetry,
+      onParallelBranchStarted,
+      onParallelBranchFinished,
+      onTextChunk,
+      onTTSChunk,
+      onTTSEnd,
+      onTextReplace,
+      onAgentLog,
+      )
+    }).catch((e) => {
+      if (e.toString() !== 'AbortError: The user aborted a request.' && !e.toString().errorMessage.includes('TypeError: Cannot assign to read only property'))
+        Toast.notify({ type: 'error', message: e })
+      onError?.(e)
+    })
+}
+
+// base request
+export const request = async<T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
+  try {
+    const otherOptionsForBaseFetch = otherOptions || {}
+    const [err, resp] = await asyncRunSafe<T>(baseFetch(url, options, otherOptionsForBaseFetch))
+    if (err === null)
+      return resp
+    const errResp: Response = err as any
+    if (errResp.status === 401) {
+      const [parseErr, errRespData] = await asyncRunSafe<ResponseError>(errResp.json())
+      const loginUrl = `${WEB_PREFIX}/signin`
+      if (parseErr) {
+        globalThis.location.href = loginUrl
+        return Promise.reject(err)
+      }
+      // special code
+      const { code, message } = errRespData
+      // webapp sso
+      if (code === 'web_sso_auth_required') {
+        requiredWebSSOLogin()
+        return Promise.reject(err)
+      }
+      if (code === 'unauthorized_and_force_logout') {
+        localStorage.removeItem('console_token')
+        localStorage.removeItem('refresh_token')
+        globalThis.location.reload()
+        return Promise.reject(err)
+      }
+      const {
+        isPublicAPI = false,
+        silent,
+      } = otherOptionsForBaseFetch
+      if (isPublicAPI && code === 'unauthorized') {
+        removeAccessToken()
+        globalThis.location.reload()
+        return Promise.reject(err)
+      }
+      if (code === 'init_validate_failed' && IS_CE_EDITION && !silent) {
+        Toast.notify({ type: 'error', message, duration: 4000 })
+        return Promise.reject(err)
+      }
+      if (code === 'not_init_validated' && IS_CE_EDITION) {
+        globalThis.location.href = `${WEB_PREFIX}/init`
+        return Promise.reject(err)
+      }
+      if (code === 'not_setup' && IS_CE_EDITION) {
+        globalThis.location.href = `${WEB_PREFIX}/install`
+        return Promise.reject(err)
+      }
+
+      // refresh token
+      const [refreshErr] = await asyncRunSafe(refreshAccessTokenOrRelogin(TIME_OUT))
+      if (refreshErr === null)
+        return baseFetch<T>(url, options, otherOptionsForBaseFetch)
+      if (!location.pathname.includes('/signin') || !IS_CE_EDITION) {
+        globalThis.location.href = loginUrl
+        return Promise.reject(err)
+      }
+      if (!silent) {
+        Toast.notify({ type: 'error', message })
+        return Promise.reject(err)
+      }
+      globalThis.location.href = loginUrl
+      return Promise.reject(err)
+    }
+    else {
+      return Promise.reject(err)
+    }
+  }
+  catch (error) {
+    console.error(error)
+    return Promise.reject(error)
+  }
+}
+
+// request methods
+export const get = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
+  return request<T>(url, Object.assign({}, options, { method: 'GET' }), otherOptions)
+}
+
+// For public API
+export const getPublic = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
+  return get<T>(url, options, { ...otherOptions, isPublicAPI: true })
+}
+
+// For Marketplace API
+export const getMarketplace = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
+  return get<T>(url, options, { ...otherOptions, isMarketplaceAPI: true })
+}
+
+export const post = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
+  return request<T>(url, Object.assign({}, options, { method: 'POST' }), otherOptions)
+}
+
+// For Marketplace API
+export const postMarketplace = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
+  return post<T>(url, options, { ...otherOptions, isMarketplaceAPI: true })
+}
+
+export const postPublic = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
+  return post<T>(url, options, { ...otherOptions, isPublicAPI: true })
+}
+
+export const put = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
+  return request<T>(url, Object.assign({}, options, { method: 'PUT' }), otherOptions)
+}
+
+export const putPublic = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
+  return put<T>(url, options, { ...otherOptions, isPublicAPI: true })
+}
+
+export const del = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
+  return request<T>(url, Object.assign({}, options, { method: 'DELETE' }), otherOptions)
+}
+
+export const delPublic = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
+  return del<T>(url, options, { ...otherOptions, isPublicAPI: true })
+}
+
+export const patch = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
+  return request<T>(url, Object.assign({}, options, { method: 'PATCH' }), otherOptions)
+}
+
+export const patchPublic = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
+  return patch<T>(url, options, { ...otherOptions, isPublicAPI: true })
+}
diff --git a/service/billing.ts b/service/billing.ts
new file mode 100644
index 0000000..7dfe5ac
--- /dev/null
+++ b/service/billing.ts
@@ -0,0 +1,14 @@
+import { get } from './base'
+import type { CurrentPlanInfoBackend, SubscriptionUrlsBackend } from '@/app/components/billing/type'
+
+export const fetchCurrentPlanInfo = () => {
+  return get<CurrentPlanInfoBackend>('/features')
+}
+
+export const fetchSubscriptionUrls = (plan: string, interval: string) => {
+  return get<SubscriptionUrlsBackend>(`/billing/subscription?plan=${plan}&interval=${interval}`)
+}
+
+export const fetchBillingUrl = () => {
+  return get<{ url: string }>('/billing/invoices')
+}
diff --git a/service/common.ts b/service/common.ts
new file mode 100644
index 0000000..e76cfb4
--- /dev/null
+++ b/service/common.ts
@@ -0,0 +1,353 @@
+import type { Fetcher } from 'swr'
+import { del, get, patch, post, put } from './base'
+import type {
+  AccountIntegrate,
+  ApiBasedExtension,
+  CodeBasedExtension,
+  CommonResponse,
+  DataSourceNotion,
+  FileUploadConfigResponse,
+  ICurrentWorkspace,
+  IWorkspace,
+  InitValidateStatusResponse,
+  InvitationResponse,
+  LangGeniusVersionResponse,
+  Member,
+  ModerateResponse,
+  OauthResponse,
+  PluginProvider,
+  Provider,
+  ProviderAnthropicToken,
+  ProviderAzureToken,
+  SetupStatusResponse,
+  UserProfileOriginResponse,
+} from '@/models/common'
+import type {
+  UpdateOpenAIKeyResponse,
+  ValidateOpenAIKeyResponse,
+} from '@/models/app'
+import type {
+  DefaultModelResponse,
+  Model,
+  ModelItem,
+  ModelLoadBalancingConfig,
+  ModelParameterRule,
+  ModelProvider,
+  ModelTypeEnum,
+} from '@/app/components/header/account-setting/model-provider-page/declarations'
+import type { RETRIEVE_METHOD } from '@/types/app'
+import type { SystemFeatures } from '@/types/feature'
+
+type LoginSuccess = {
+  result: 'success'
+  data: { access_token: string; refresh_token: string }
+}
+type LoginFail = {
+  result: 'fail'
+  data: string
+  code: string
+  message: string
+}
+type LoginResponse = LoginSuccess | LoginFail
+export const login: Fetcher<LoginResponse, { url: string; body: Record<string, any> }> = ({ url, body }) => {
+  return post(url, { body }) as Promise<LoginResponse>
+}
+
+export const fetchNewToken: Fetcher<CommonResponse & { data: { access_token: string; refresh_token: string } }, { body: Record<string, any> }> = ({ body }) => {
+  return post('/refresh-token', { body }) as Promise<CommonResponse & { data: { access_token: string; refresh_token: string } }>
+}
+
+export const setup: Fetcher<CommonResponse, { body: Record<string, any> }> = ({ body }) => {
+  return post<CommonResponse>('/setup', { body })
+}
+
+export const initValidate: Fetcher<CommonResponse, { body: Record<string, any> }> = ({ body }) => {
+  return post<CommonResponse>('/init', { body })
+}
+
+export const fetchInitValidateStatus = () => {
+  return get<InitValidateStatusResponse>('/init')
+}
+
+export const fetchSetupStatus = () => {
+  return get<SetupStatusResponse>('/setup')
+}
+
+export const fetchUserProfile: Fetcher<UserProfileOriginResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<UserProfileOriginResponse>(url, params, { needAllResponseContent: true })
+}
+
+export const updateUserProfile: Fetcher<CommonResponse, { url: string; body: Record<string, any> }> = ({ url, body }) => {
+  return post<CommonResponse>(url, { body })
+}
+
+export const logout: Fetcher<CommonResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<CommonResponse>(url, params)
+}
+
+export const fetchLanggeniusVersion: Fetcher<LangGeniusVersionResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<LangGeniusVersionResponse>(url, { params })
+}
+
+export const oauth: Fetcher<OauthResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<OauthResponse>(url, { params })
+}
+
+export const oneMoreStep: Fetcher<CommonResponse, { url: string; body: Record<string, any> }> = ({ url, body }) => {
+  return post<CommonResponse>(url, { body })
+}
+
+export const fetchMembers: Fetcher<{ accounts: Member[] | null }, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<{ accounts: Member[] | null }>(url, { params })
+}
+
+export const fetchProviders: Fetcher<Provider[] | null, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<Provider[] | null>(url, { params })
+}
+
+export const validateProviderKey: Fetcher<ValidateOpenAIKeyResponse, { url: string; body: { token: string } }> = ({ url, body }) => {
+  return post<ValidateOpenAIKeyResponse>(url, { body })
+}
+export const updateProviderAIKey: Fetcher<UpdateOpenAIKeyResponse, { url: string; body: { token: string | ProviderAzureToken | ProviderAnthropicToken } }> = ({ url, body }) => {
+  return post<UpdateOpenAIKeyResponse>(url, { body })
+}
+
+export const fetchAccountIntegrates: Fetcher<{ data: AccountIntegrate[] | null }, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<{ data: AccountIntegrate[] | null }>(url, { params })
+}
+
+export const inviteMember: Fetcher<InvitationResponse, { url: string; body: Record<string, any> }> = ({ url, body }) => {
+  return post<InvitationResponse>(url, { body })
+}
+
+export const updateMemberRole: Fetcher<CommonResponse, { url: string; body: Record<string, any> }> = ({ url, body }) => {
+  return put<CommonResponse>(url, { body })
+}
+
+export const deleteMemberOrCancelInvitation: Fetcher<CommonResponse, { url: string }> = ({ url }) => {
+  return del<CommonResponse>(url)
+}
+
+export const fetchFilePreview: Fetcher<{ content: string }, { fileID: string }> = ({ fileID }) => {
+  return get<{ content: string }>(`/files/${fileID}/preview`)
+}
+
+export const fetchCurrentWorkspace: Fetcher<ICurrentWorkspace, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<ICurrentWorkspace>(url, { params })
+}
+
+export const updateCurrentWorkspace: Fetcher<ICurrentWorkspace, { url: string; body: Record<string, any> }> = ({ url, body }) => {
+  return post<ICurrentWorkspace>(url, { body })
+}
+
+export const fetchWorkspaces: Fetcher<{ workspaces: IWorkspace[] }, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<{ workspaces: IWorkspace[] }>(url, { params })
+}
+
+export const switchWorkspace: Fetcher<CommonResponse & { new_tenant: IWorkspace }, { url: string; body: Record<string, any> }> = ({ url, body }) => {
+  return post<CommonResponse & { new_tenant: IWorkspace }>(url, { body })
+}
+
+export const updateWorkspaceInfo: Fetcher<ICurrentWorkspace, { url: string; body: Record<string, any> }> = ({ url, body }) => {
+  return post<ICurrentWorkspace>(url, { body })
+}
+
+export const fetchDataSource: Fetcher<{ data: DataSourceNotion[] }, { url: string }> = ({ url }) => {
+  return get<{ data: DataSourceNotion[] }>(url)
+}
+
+export const syncDataSourceNotion: Fetcher<CommonResponse, { url: string }> = ({ url }) => {
+  return get<CommonResponse>(url)
+}
+
+export const updateDataSourceNotionAction: Fetcher<CommonResponse, { url: string }> = ({ url }) => {
+  return patch<CommonResponse>(url)
+}
+
+export const fetchPluginProviders: Fetcher<PluginProvider[] | null, string> = (url) => {
+  return get<PluginProvider[] | null>(url)
+}
+
+export const validatePluginProviderKey: Fetcher<ValidateOpenAIKeyResponse, { url: string; body: { credentials: any } }> = ({ url, body }) => {
+  return post<ValidateOpenAIKeyResponse>(url, { body })
+}
+export const updatePluginProviderAIKey: Fetcher<UpdateOpenAIKeyResponse, { url: string; body: { credentials: any } }> = ({ url, body }) => {
+  return post<UpdateOpenAIKeyResponse>(url, { body })
+}
+
+export const invitationCheck: Fetcher<CommonResponse & { is_valid: boolean; data: { workspace_name: string; email: string; workspace_id: string } }, { url: string; params: { workspace_id?: string; email?: string; token: string } }> = ({ url, params }) => {
+  return get<CommonResponse & { is_valid: boolean; data: { workspace_name: string; email: string; workspace_id: string } }>(url, { params })
+}
+
+export const activateMember: Fetcher<LoginResponse, { url: string; body: any }> = ({ url, body }) => {
+  return post<LoginResponse>(url, { body })
+}
+
+export const fetchModelProviders: Fetcher<{ data: ModelProvider[] }, string> = (url) => {
+  return get<{ data: ModelProvider[] }>(url)
+}
+
+export type ModelProviderCredentials = {
+  credentials?: Record<string, string | undefined | boolean>
+  load_balancing: ModelLoadBalancingConfig
+}
+export const fetchModelProviderCredentials: Fetcher<ModelProviderCredentials, string> = (url) => {
+  return get<ModelProviderCredentials>(url)
+}
+
+export const fetchModelLoadBalancingConfig: Fetcher<{
+  credentials?: Record<string, string | undefined | boolean>
+  load_balancing: ModelLoadBalancingConfig
+}, string> = (url) => {
+  return get<{
+    credentials?: Record<string, string | undefined | boolean>
+    load_balancing: ModelLoadBalancingConfig
+  }>(url)
+}
+
+export const fetchModelProviderModelList: Fetcher<{ data: ModelItem[] }, string> = (url) => {
+  return get<{ data: ModelItem[] }>(url)
+}
+
+export const fetchModelList: Fetcher<{ data: Model[] }, string> = (url) => {
+  return get<{ data: Model[] }>(url)
+}
+
+export const validateModelProvider: Fetcher<ValidateOpenAIKeyResponse, { url: string; body: any }> = ({ url, body }) => {
+  return post<ValidateOpenAIKeyResponse>(url, { body })
+}
+
+export const validateModelLoadBalancingCredentials: Fetcher<ValidateOpenAIKeyResponse, { url: string; body: any }> = ({ url, body }) => {
+  return post<ValidateOpenAIKeyResponse>(url, { body })
+}
+
+export const setModelProvider: Fetcher<CommonResponse, { url: string; body: any }> = ({ url, body }) => {
+  return post<CommonResponse>(url, { body })
+}
+
+export const deleteModelProvider: Fetcher<CommonResponse, { url: string; body?: any }> = ({ url, body }) => {
+  return del<CommonResponse>(url, { body })
+}
+
+export const changeModelProviderPriority: Fetcher<CommonResponse, { url: string; body: any }> = ({ url, body }) => {
+  return post<CommonResponse>(url, { body })
+}
+
+export const setModelProviderModel: Fetcher<CommonResponse, { url: string; body: any }> = ({ url, body }) => {
+  return post<CommonResponse>(url, { body })
+}
+
+export const deleteModelProviderModel: Fetcher<CommonResponse, { url: string }> = ({ url }) => {
+  return del<CommonResponse>(url)
+}
+
+export const getPayUrl: Fetcher<{ url: string }, string> = (url) => {
+  return get<{ url: string }>(url)
+}
+
+export const fetchDefaultModal: Fetcher<{ data: DefaultModelResponse }, string> = (url) => {
+  return get<{ data: DefaultModelResponse }>(url)
+}
+
+export const updateDefaultModel: Fetcher<CommonResponse, { url: string; body: any }> = ({ url, body }) => {
+  return post<CommonResponse>(url, { body })
+}
+
+export const fetchModelParameterRules: Fetcher<{ data: ModelParameterRule[] }, string> = (url) => {
+  return get<{ data: ModelParameterRule[] }>(url)
+}
+
+export const fetchFileUploadConfig: Fetcher<FileUploadConfigResponse, { url: string }> = ({ url }) => {
+  return get<FileUploadConfigResponse>(url)
+}
+
+export const fetchNotionConnection: Fetcher<{ data: string }, string> = (url) => {
+  return get(url) as Promise<{ data: string }>
+}
+
+export const fetchDataSourceNotionBinding: Fetcher<{ result: string }, string> = (url) => {
+  return get(url) as Promise<{ result: string }>
+}
+
+export const fetchApiBasedExtensionList: Fetcher<ApiBasedExtension[], string> = (url) => {
+  return get(url) as Promise<ApiBasedExtension[]>
+}
+
+export const fetchApiBasedExtensionDetail: Fetcher<ApiBasedExtension, string> = (url) => {
+  return get(url) as Promise<ApiBasedExtension>
+}
+
+export const addApiBasedExtension: Fetcher<ApiBasedExtension, { url: string; body: ApiBasedExtension }> = ({ url, body }) => {
+  return post(url, { body }) as Promise<ApiBasedExtension>
+}
+
+export const updateApiBasedExtension: Fetcher<ApiBasedExtension, { url: string; body: ApiBasedExtension }> = ({ url, body }) => {
+  return post(url, { body }) as Promise<ApiBasedExtension>
+}
+
+export const deleteApiBasedExtension: Fetcher<{ result: string }, string> = (url) => {
+  return del(url) as Promise<{ result: string }>
+}
+
+export const fetchCodeBasedExtensionList: Fetcher<CodeBasedExtension, string> = (url) => {
+  return get(url) as Promise<CodeBasedExtension>
+}
+
+export const moderate = (url: string, body: { app_id: string; text: string }) => {
+  return post(url, { body }) as Promise<ModerateResponse>
+}
+
+type RetrievalMethodsRes = {
+  retrieval_method: RETRIEVE_METHOD[]
+}
+export const fetchSupportRetrievalMethods: Fetcher<RetrievalMethodsRes, string> = (url) => {
+  return get<RetrievalMethodsRes>(url)
+}
+
+export const getSystemFeatures = () => {
+  return get<SystemFeatures>('/system-features')
+}
+
+export const enableModel = (url: string, body: { model: string; model_type: ModelTypeEnum }) =>
+  patch<CommonResponse>(url, { body })
+
+export const disableModel = (url: string, body: { model: string; model_type: ModelTypeEnum }) =>
+  patch<CommonResponse>(url, { body })
+
+export const sendForgotPasswordEmail: Fetcher<CommonResponse & { data: string }, { url: string; body: { email: string } }> = ({ url, body }) =>
+  post<CommonResponse & { data: string }>(url, { body })
+
+export const verifyForgotPasswordToken: Fetcher<CommonResponse & { is_valid: boolean; email: string }, { url: string; body: { token: string } }> = ({ url, body }) => {
+  return post(url, { body }) as Promise<CommonResponse & { is_valid: boolean; email: string }>
+}
+
+export const changePasswordWithToken: Fetcher<CommonResponse, { url: string; body: { token: string; new_password: string; password_confirm: string } }> = ({ url, body }) =>
+  post<CommonResponse>(url, { body })
+
+export const uploadRemoteFileInfo = (url: string, isPublic?: boolean) => {
+  return post<{ id: string; name: string; size: number; mime_type: string; url: string }>('/remote-files/upload', { body: { url } }, { isPublicAPI: isPublic })
+}
+
+export const sendEMailLoginCode = (email: string, language = 'en-US') =>
+  post<CommonResponse & { data: string }>('/email-code-login', { body: { email, language } })
+
+export const emailLoginWithCode = (data: { email: string; code: string; token: string }) =>
+  post<LoginResponse>('/email-code-login/validity', { body: data })
+
+export const sendResetPasswordCode = (email: string, language = 'en-US') =>
+  post<CommonResponse & { data: string; message?: string; code?: string }>('/forgot-password', { body: { email, language } })
+
+export const verifyResetPasswordCode = (body: { email: string; code: string; token: string }) =>
+  post<CommonResponse & { is_valid: boolean; token: string }>('/forgot-password/validity', { body })
+
+export const sendDeleteAccountCode = () =>
+  get<CommonResponse & { data: string }>('/account/delete/verify')
+
+export const verifyDeleteAccountCode = (body: { code: string; token: string }) =>
+  post<CommonResponse & { is_valid: boolean }>('/account/delete', { body })
+
+export const submitDeleteAccountFeedback = (body: { feedback: string; email: string }) =>
+  post<CommonResponse>('/account/delete/feedback', { body })
+
+export const getDocDownloadUrl = (doc_name: string) =>
+  get<{ url: string }>('/compliance/download', { params: { doc_name } }, { silent: true })
diff --git a/service/datasets.ts b/service/datasets.ts
new file mode 100644
index 0000000..f9edb2e
--- /dev/null
+++ b/service/datasets.ts
@@ -0,0 +1,289 @@
+import type { Fetcher } from 'swr'
+import qs from 'qs'
+import { del, get, patch, post, put } from './base'
+import type {
+  CreateDocumentReq,
+  DataSet,
+  DataSetListResponse,
+  ErrorDocsResponse,
+  ExternalAPIDeleteResponse,
+  ExternalAPIItem,
+  ExternalAPIListResponse,
+  ExternalAPIUsage,
+  ExternalKnowledgeBaseHitTestingResponse,
+  ExternalKnowledgeItem,
+  FetchDatasetsParams,
+  FileIndexingEstimateResponse,
+  HitTestingRecordsResponse,
+  HitTestingResponse,
+  IndexingEstimateParams,
+  IndexingEstimateResponse,
+  IndexingStatusBatchResponse,
+  IndexingStatusResponse,
+  ProcessRuleResponse,
+  RelatedAppResponse,
+  createDocumentResponse,
+} from '@/models/datasets'
+import type { CreateKnowledgeBaseReq } from '@/app/components/datasets/external-knowledge-base/create/declarations'
+import type { CreateExternalAPIReq } from '@/app/components/datasets/external-api/declarations'
+import type { CommonResponse, DataSourceNotionWorkspace } from '@/models/common'
+import { DataSourceProvider } from '@/models/common'
+import type {
+  ApiKeysListResponse,
+  CreateApiKeyResponse,
+} from '@/models/app'
+import type { RetrievalConfig } from '@/types/app'
+
+// apis for documents in a dataset
+
+type CommonDocReq = {
+  datasetId: string
+  documentId: string
+}
+
+type BatchReq = {
+  datasetId: string
+  batchId: string
+}
+
+export type SortType = 'created_at' | 'hit_count' | '-created_at' | '-hit_count'
+
+export type MetadataType = 'all' | 'only' | 'without'
+
+export const fetchDatasetDetail: Fetcher<DataSet, string> = (datasetId: string) => {
+  return get<DataSet>(`/datasets/${datasetId}`)
+}
+
+export const updateDatasetSetting: Fetcher<DataSet, {
+  datasetId: string
+  body: Partial<Pick<DataSet,
+    'name' | 'description' | 'permission' | 'partial_member_list' | 'indexing_technique' | 'retrieval_model' | 'embedding_model' | 'embedding_model_provider'
+  >>
+}> = ({ datasetId, body }) => {
+  return patch<DataSet>(`/datasets/${datasetId}`, { body })
+}
+
+export const fetchDatasetRelatedApps: Fetcher<RelatedAppResponse, string> = (datasetId: string) => {
+  return get<RelatedAppResponse>(`/datasets/${datasetId}/related-apps`)
+}
+
+export const fetchDatasets: Fetcher<DataSetListResponse, FetchDatasetsParams> = ({ url, params }) => {
+  const urlParams = qs.stringify(params, { indices: false })
+  return get<DataSetListResponse>(`${url}?${urlParams}`)
+}
+
+export const createEmptyDataset: Fetcher<DataSet, { name: string }> = ({ name }) => {
+  return post<DataSet>('/datasets', { body: { name } })
+}
+
+export const checkIsUsedInApp: Fetcher<{ is_using: boolean }, string> = (id) => {
+  return get<{ is_using: boolean }>(`/datasets/${id}/use-check`, {}, {
+    silent: true,
+  })
+}
+
+export const deleteDataset: Fetcher<DataSet, string> = (datasetID) => {
+  return del<DataSet>(`/datasets/${datasetID}`)
+}
+
+export const fetchExternalAPIList: Fetcher<ExternalAPIListResponse, { url: string }> = ({ url }) => {
+  return get<ExternalAPIListResponse>(url)
+}
+
+export const fetchExternalAPI: Fetcher<ExternalAPIItem, { apiTemplateId: string }> = ({ apiTemplateId }) => {
+  return get<ExternalAPIItem>(`/datasets/external-knowledge-api/${apiTemplateId}`)
+}
+
+export const updateExternalAPI: Fetcher<ExternalAPIItem, { apiTemplateId: string; body: ExternalAPIItem }> = ({ apiTemplateId, body }) => {
+  return patch<ExternalAPIItem>(`/datasets/external-knowledge-api/${apiTemplateId}`, { body })
+}
+
+export const deleteExternalAPI: Fetcher<ExternalAPIDeleteResponse, { apiTemplateId: string }> = ({ apiTemplateId }) => {
+  return del<ExternalAPIDeleteResponse>(`/datasets/external-knowledge-api/${apiTemplateId}`)
+}
+
+export const checkUsageExternalAPI: Fetcher<ExternalAPIUsage, { apiTemplateId: string }> = ({ apiTemplateId }) => {
+  return get<ExternalAPIUsage>(`/datasets/external-knowledge-api/${apiTemplateId}/use-check`)
+}
+
+export const createExternalAPI: Fetcher<ExternalAPIItem, { body: CreateExternalAPIReq }> = ({ body }) => {
+  return post<ExternalAPIItem>('/datasets/external-knowledge-api', { body })
+}
+
+export const createExternalKnowledgeBase: Fetcher<ExternalKnowledgeItem, { body: CreateKnowledgeBaseReq }> = ({ body }) => {
+  return post<ExternalKnowledgeItem>('/datasets/external', { body })
+}
+
+export const fetchDefaultProcessRule: Fetcher<ProcessRuleResponse, { url: string }> = ({ url }) => {
+  return get<ProcessRuleResponse>(url)
+}
+export const fetchProcessRule: Fetcher<ProcessRuleResponse, { params: { documentId: string } }> = ({ params: { documentId } }) => {
+  return get<ProcessRuleResponse>('/datasets/process-rule', { params: { document_id: documentId } })
+}
+
+export const createFirstDocument: Fetcher<createDocumentResponse, { body: CreateDocumentReq }> = ({ body }) => {
+  return post<createDocumentResponse>('/datasets/init', { body })
+}
+
+export const createDocument: Fetcher<createDocumentResponse, { datasetId: string; body: CreateDocumentReq }> = ({ datasetId, body }) => {
+  return post<createDocumentResponse>(`/datasets/${datasetId}/documents`, { body })
+}
+
+export const fetchIndexingEstimate: Fetcher<IndexingEstimateResponse, CommonDocReq> = ({ datasetId, documentId }) => {
+  return get<IndexingEstimateResponse>(`/datasets/${datasetId}/documents/${documentId}/indexing-estimate`, {})
+}
+export const fetchIndexingEstimateBatch: Fetcher<IndexingEstimateResponse, BatchReq> = ({ datasetId, batchId }) => {
+  return get<IndexingEstimateResponse>(`/datasets/${datasetId}/batch/${batchId}/indexing-estimate`, {})
+}
+
+export const fetchIndexingStatus: Fetcher<IndexingStatusResponse, CommonDocReq> = ({ datasetId, documentId }) => {
+  return get<IndexingStatusResponse>(`/datasets/${datasetId}/documents/${documentId}/indexing-status`, {})
+}
+
+export const fetchIndexingStatusBatch: Fetcher<IndexingStatusBatchResponse, BatchReq> = ({ datasetId, batchId }) => {
+  return get<IndexingStatusBatchResponse>(`/datasets/${datasetId}/batch/${batchId}/indexing-status`, {})
+}
+
+export const renameDocumentName: Fetcher<CommonResponse, CommonDocReq & { name: string }> = ({ datasetId, documentId, name }) => {
+  return post<CommonResponse>(`/datasets/${datasetId}/documents/${documentId}/rename`, {
+    body: { name },
+  })
+}
+
+export const pauseDocIndexing: Fetcher<CommonResponse, CommonDocReq> = ({ datasetId, documentId }) => {
+  return patch<CommonResponse>(`/datasets/${datasetId}/documents/${documentId}/processing/pause`)
+}
+
+export const resumeDocIndexing: Fetcher<CommonResponse, CommonDocReq> = ({ datasetId, documentId }) => {
+  return patch<CommonResponse>(`/datasets/${datasetId}/documents/${documentId}/processing/resume`)
+}
+
+export const preImportNotionPages: Fetcher<{ notion_info: DataSourceNotionWorkspace[] }, { url: string; datasetId?: string }> = ({ url, datasetId }) => {
+  return get<{ notion_info: DataSourceNotionWorkspace[] }>(url, { params: { dataset_id: datasetId } })
+}
+
+export const modifyDocMetadata: Fetcher<CommonResponse, CommonDocReq & { body: { doc_type: string; doc_metadata: Record<string, any> } }> = ({ datasetId, documentId, body }) => {
+  return put<CommonResponse>(`/datasets/${datasetId}/documents/${documentId}/metadata`, { body })
+}
+
+// hit testing
+export const hitTesting: Fetcher<HitTestingResponse, { datasetId: string; queryText: string; retrieval_model: RetrievalConfig }> = ({ datasetId, queryText, retrieval_model }) => {
+  return post<HitTestingResponse>(`/datasets/${datasetId}/hit-testing`, { body: { query: queryText, retrieval_model } })
+}
+
+export const externalKnowledgeBaseHitTesting: Fetcher<ExternalKnowledgeBaseHitTestingResponse, { datasetId: string; query: string; external_retrieval_model: { top_k: number; score_threshold: number; score_threshold_enabled: boolean } }> = ({ datasetId, query, external_retrieval_model }) => {
+  return post<ExternalKnowledgeBaseHitTestingResponse>(`/datasets/${datasetId}/external-hit-testing`, { body: { query, external_retrieval_model } })
+}
+
+export const fetchTestingRecords: Fetcher<HitTestingRecordsResponse, { datasetId: string; params: { page: number; limit: number } }> = ({ datasetId, params }) => {
+  return get<HitTestingRecordsResponse>(`/datasets/${datasetId}/queries`, { params })
+}
+
+export const fetchFileIndexingEstimate: Fetcher<FileIndexingEstimateResponse, IndexingEstimateParams> = (body: IndexingEstimateParams) => {
+  return post<FileIndexingEstimateResponse>('/datasets/indexing-estimate', { body })
+}
+
+export const fetchNotionPagePreview: Fetcher<{ content: string }, { workspaceID: string; pageID: string; pageType: string }> = ({ workspaceID, pageID, pageType }) => {
+  return get<{ content: string }>(`notion/workspaces/${workspaceID}/pages/${pageID}/${pageType}/preview`)
+}
+
+export const fetchApiKeysList: Fetcher<ApiKeysListResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<ApiKeysListResponse>(url, params)
+}
+
+export const delApikey: Fetcher<CommonResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return del<CommonResponse>(url, params)
+}
+
+export const createApikey: Fetcher<CreateApiKeyResponse, { url: string; body: Record<string, any> }> = ({ url, body }) => {
+  return post<CreateApiKeyResponse>(url, body)
+}
+
+export const fetchDatasetApiBaseUrl: Fetcher<{ api_base_url: string }, string> = (url) => {
+  return get<{ api_base_url: string }>(url)
+}
+
+export const fetchDataSources = () => {
+  return get<CommonResponse>('api-key-auth/data-source')
+}
+
+export const createDataSourceApiKeyBinding: Fetcher<CommonResponse, Record<string, any>> = (body) => {
+  return post<CommonResponse>('api-key-auth/data-source/binding', { body })
+}
+
+export const removeDataSourceApiKeyBinding: Fetcher<CommonResponse, string> = (id: string) => {
+  return del<CommonResponse>(`api-key-auth/data-source/${id}`)
+}
+
+export const createFirecrawlTask: Fetcher<CommonResponse, Record<string, any>> = (body) => {
+  return post<CommonResponse>('website/crawl', {
+    body: {
+      ...body,
+      provider: DataSourceProvider.fireCrawl,
+    },
+  })
+}
+
+export const checkFirecrawlTaskStatus: Fetcher<CommonResponse, string> = (jobId: string) => {
+  return get<CommonResponse>(`website/crawl/status/${jobId}`, {
+    params: {
+      provider: DataSourceProvider.fireCrawl,
+    },
+  }, {
+    silent: true,
+  })
+}
+
+export const createJinaReaderTask: Fetcher<CommonResponse, Record<string, any>> = (body) => {
+  return post<CommonResponse>('website/crawl', {
+    body: {
+      ...body,
+      provider: DataSourceProvider.jinaReader,
+    },
+  })
+}
+
+export const checkJinaReaderTaskStatus: Fetcher<CommonResponse, string> = (jobId: string) => {
+  return get<CommonResponse>(`website/crawl/status/${jobId}`, {
+    params: {
+      provider: 'jinareader',
+    },
+  }, {
+    silent: true,
+  })
+}
+
+export const createWatercrawlTask: Fetcher<CommonResponse, Record<string, any>> = (body) => {
+  return post<CommonResponse>('website/crawl', {
+    body: {
+      ...body,
+      provider: DataSourceProvider.waterCrawl,
+    },
+  })
+}
+
+export const checkWatercrawlTaskStatus: Fetcher<CommonResponse, string> = (jobId: string) => {
+  return get<CommonResponse>(`website/crawl/status/${jobId}`, {
+    params: {
+      provider: DataSourceProvider.waterCrawl,
+    },
+  }, {
+    silent: true,
+  })
+}
+
+type FileTypesRes = {
+  allowed_extensions: string[]
+}
+
+export const fetchSupportFileTypes: Fetcher<FileTypesRes, { url: string }> = ({ url }) => {
+  return get<FileTypesRes>(url)
+}
+
+export const getErrorDocs: Fetcher<ErrorDocsResponse, { datasetId: string }> = ({ datasetId }) => {
+  return get<ErrorDocsResponse>(`/datasets/${datasetId}/error-docs`)
+}
+
+export const retryErrorDocs: Fetcher<CommonResponse, { datasetId: string; document_ids: string[] }> = ({ datasetId, document_ids }) => {
+  return post<CommonResponse>(`/datasets/${datasetId}/retry`, { body: { document_ids } })
+}
diff --git a/service/debug.ts b/service/debug.ts
new file mode 100644
index 0000000..3770c4d
--- /dev/null
+++ b/service/debug.ts
@@ -0,0 +1,114 @@
+import { get, post, ssePost } from './base'
+import type { IOnCompleted, IOnData, IOnError, IOnFile, IOnMessageEnd, IOnMessageReplace, IOnThought } from './base'
+import type { ChatPromptConfig, CompletionPromptConfig } from '@/models/debug'
+import type { ModelModeType } from '@/types/app'
+import type { ModelParameterRule } from '@/app/components/header/account-setting/model-provider-page/declarations'
+export type AutomaticRes = {
+  prompt: string
+  variables: string[]
+  opening_statement: string
+  error?: string
+}
+export type CodeGenRes = {
+  code: string
+  language: string[]
+  error?: string
+}
+
+export const sendChatMessage = async (appId: string, body: Record<string, any>, { onData, onCompleted, onThought, onFile, onError, getAbortController, onMessageEnd, onMessageReplace }: {
+  onData: IOnData
+  onCompleted: IOnCompleted
+  onFile: IOnFile
+  onThought: IOnThought
+  onMessageEnd: IOnMessageEnd
+  onMessageReplace: IOnMessageReplace
+  onError: IOnError
+  getAbortController?: (abortController: AbortController) => void
+}) => {
+  return ssePost(`apps/${appId}/chat-messages`, {
+    body: {
+      ...body,
+      response_mode: 'streaming',
+    },
+  }, { onData, onCompleted, onThought, onFile, onError, getAbortController, onMessageEnd, onMessageReplace })
+}
+
+export const stopChatMessageResponding = async (appId: string, taskId: string) => {
+  return post(`apps/${appId}/chat-messages/${taskId}/stop`)
+}
+
+export const sendCompletionMessage = async (appId: string, body: Record<string, any>, { onData, onCompleted, onError, onMessageReplace }: {
+  onData: IOnData
+  onCompleted: IOnCompleted
+  onError: IOnError
+  onMessageReplace: IOnMessageReplace
+}) => {
+  return ssePost(`apps/${appId}/completion-messages`, {
+    body: {
+      ...body,
+      response_mode: 'streaming',
+    },
+  }, { onData, onCompleted, onError, onMessageReplace })
+}
+
+export const fetchSuggestedQuestions = (appId: string, messageId: string, getAbortController?: any) => {
+  return get(
+    `apps/${appId}/chat-messages/${messageId}/suggested-questions`,
+    {},
+    {
+      getAbortController,
+    },
+  )
+}
+
+export const fetchConversationMessages = (appId: string, conversation_id: string, getAbortController?: any) => {
+  return get(`apps/${appId}/chat-messages`, {
+    params: {
+      conversation_id,
+    },
+  }, {
+    getAbortController,
+  })
+}
+
+export const generateRule = (body: Record<string, any>) => {
+  return post<AutomaticRes>('/rule-generate', {
+    body,
+  })
+}
+export const generateRuleCode = (body: Record<string, any>) => {
+  return post<CodeGenRes>('/rule-code-generate', {
+    body,
+  })
+}
+
+export const fetchModelParams = (providerName: string, modelId: string) => {
+  return get(`workspaces/current/model-providers/${providerName}/models/parameter-rules`, {
+    params: {
+      model: modelId,
+    },
+  }) as Promise<{ data: ModelParameterRule[] }>
+}
+
+export const fetchPromptTemplate = ({
+  appMode,
+  mode,
+  modelName,
+  hasSetDataSet,
+}: { appMode: string; mode: ModelModeType; modelName: string; hasSetDataSet: boolean }) => {
+  return get<Promise<{ chat_prompt_config: ChatPromptConfig; completion_prompt_config: CompletionPromptConfig; stop: [] }>>('/app/prompt-templates', {
+    params: {
+      app_mode: appMode,
+      model_mode: mode,
+      model_name: modelName,
+      has_context: hasSetDataSet,
+    },
+  })
+}
+
+export const fetchTextGenerationMessage = ({
+  appId,
+  messageId,
+}: { appId: string; messageId: string }) => {
+  return get<Promise<any>>(`/apps/${appId}/messages/${messageId}`)
+}
diff --git a/service/demo/index.tsx b/service/demo/index.tsx
new file mode 100644
index 0000000..5088977
--- /dev/null
+++ b/service/demo/index.tsx
@@ -0,0 +1,100 @@
+'use client'
+import type { FC } from 'react'
+import React from 'react'
+import useSWR, { useSWRConfig } from 'swr'
+import { createApp, fetchAppDetail, fetchAppList, getAppDailyConversations, getAppDailyEndUsers, updateAppApiStatus, updateAppModelConfig, updateAppRateLimit, updateAppSiteAccessToken, updateAppSiteConfig, updateAppSiteStatus } from '../apps'
+import Loading from '@/app/components/base/loading'
+const Service: FC = () => {
+  const { data: appList, error: appListError } = useSWR({ url: '/apps', params: { page: 1 } }, fetchAppList)
+  const { data: firstApp, error: appDetailError } = useSWR({ url: '/apps', id: '1' }, fetchAppDetail)
+  const { data: updateAppSiteStatusRes, error: err1 } = useSWR({ url: '/apps', id: '1', body: { enable_site: false } }, updateAppSiteStatus)
+  const { data: updateAppApiStatusRes, error: err2 } = useSWR({ url: '/apps', id: '1', body: { enable_api: true } }, updateAppApiStatus)
+  const { data: updateAppRateLimitRes, error: err3 } = useSWR({ url: '/apps', id: '1', body: { api_rpm: 10, api_rph: 20 } }, updateAppRateLimit)
+  const { data: updateAppSiteCodeRes, error: err4 } = useSWR({ url: '/apps', id: '1', body: {} }, updateAppSiteAccessToken)
+  const { data: updateAppSiteConfigRes, error: err5 } = useSWR({ url: '/apps', id: '1', body: { title: 'title test', author: 'author test' } }, updateAppSiteConfig)
+  const { data: getAppDailyConversationsRes, error: err6 } = useSWR({ url: '/apps', id: '1', body: { start: '1', end: '2' } }, getAppDailyConversations)
+  const { data: getAppDailyEndUsersRes, error: err7 } = useSWR({ url: '/apps', id: '1', body: { start: '1', end: '2' } }, getAppDailyEndUsers)
+  const { data: updateAppModelConfigRes, error: err8 } = useSWR({ url: '/apps', id: '1', body: { model_id: 'gpt-100' } }, updateAppModelConfig)
+
+  const { mutate } = useSWRConfig()
+
+  const handleCreateApp = async () => {
+    await createApp({
+      name: `new app${Math.round(Math.random() * 100)}`,
+      mode: 'chat',
+    })
+    // reload app list
+    mutate({ url: '/apps', params: { page: 1 } })
+  }
+
+  if (appListError || appDetailError || err1 || err2 || err3 || err4 || err5 || err6 || err7 || err8)
+    return <div>{JSON.stringify(appListError)}</div>
+
+  if (!appList || !firstApp || !updateAppSiteStatusRes || !updateAppApiStatusRes || !updateAppRateLimitRes || !updateAppSiteCodeRes || !updateAppSiteConfigRes || !getAppDailyConversationsRes || !getAppDailyEndUsersRes || !updateAppModelConfigRes)
+    return <Loading />
+
+  return (
+    <div>
+      <div className='flex flex-col gap-3'>
+        <div>
+          <div>1.App list</div>
+          <div>
+            {appList.data.map(item => (
+              <div key={item.id}>{item.id} {item.name}</div>
+            ))}
+          </div>
+        </div>
+
+        <div>
+          <div>2.First app detail</div>
+          <div>{JSON.stringify(firstApp)}</div>
+        </div>
+
+        <div>
+          <button onClick={handleCreateApp}>Click me to Create App</button>
+        </div>
+
+        <div>
+          <div>4.updateAppSiteStatusRes</div>
+          <div>{JSON.stringify(updateAppSiteStatusRes)}</div>
+        </div>
+
+        <div>
+          <div>5.updateAppApiStatusRes</div>
+          <div>{JSON.stringify(updateAppApiStatusRes)}</div>
+        </div>
+
+        <div>
+          <div>6.updateAppRateLimitRes</div>
+          <div>{JSON.stringify(updateAppRateLimitRes)}</div>
+        </div>
+
+        <div>
+          <div>7.updateAppSiteCodeRes</div>
+          <div>{JSON.stringify(updateAppSiteCodeRes)}</div>
+        </div>
+
+        <div>
+          <div>8.updateAppSiteConfigRes</div>
+          <div>{JSON.stringify(updateAppSiteConfigRes)}</div>
+        </div>
+
+        <div>
+          <div>9.getAppDailyConversationsRes</div>
+          <div>{JSON.stringify(getAppDailyConversationsRes)}</div>
+        </div>
+
+        <div>
+          <div>10.getAppDailyEndUsersRes</div>
+          <div>{JSON.stringify(getAppDailyEndUsersRes)}</div>
+        </div>
+
+        <div>
+          <div>11.updateAppModelConfigRes</div>
+          <div>{JSON.stringify(updateAppModelConfigRes)}</div>
+        </div>
+      </div>
+    </div>
+  )
+}
+export default React.memo(Service)
diff --git a/service/explore.ts b/service/explore.ts
new file mode 100644
index 0000000..e9e1741
--- /dev/null
+++ b/service/explore.ts
@@ -0,0 +1,41 @@
+import { del, get, patch, post } from './base'
+import type { App, AppCategory } from '@/models/explore'
+
+export const fetchAppList = () => {
+  return get<{
+    categories: AppCategory[]
+    recommended_apps: App[]
+  }>('/explore/apps')
+}
+
+export const fetchAppDetail = (id: string): Promise<any> => {
+  return get(`/explore/apps/${id}`)
+}
+
+export const fetchInstalledAppList = (app_id?: string | null) => {
+  return get(`/installed-apps${app_id ? `?app_id=${app_id}` : ''}`)
+}
+
+export const installApp = (id: string) => {
+  return post('/installed-apps', {
+    body: {
+      app_id: id,
+    },
+  })
+}
+
+export const uninstallApp = (id: string) => {
+  return del(`/installed-apps/${id}`)
+}
+
+export const updatePinStatus = (id: string, isPinned: boolean) => {
+  return patch(`/installed-apps/${id}`, {
+    body: {
+      is_pinned: isPinned,
+    },
+  })
+}
+
+export const getToolProviders = () => {
+  return get('/workspaces/current/tool-providers')
+}
diff --git a/service/fetch.ts b/service/fetch.ts
new file mode 100644
index 0000000..05d39c6
--- /dev/null
+++ b/service/fetch.ts
@@ -0,0 +1,208 @@
+import type { AfterResponseHook, BeforeErrorHook, BeforeRequestHook, Hooks } from 'ky'
+import ky from 'ky'
+import type { IOtherOptions } from './base'
+import Toast from '@/app/components/base/toast'
+import { API_PREFIX, MARKETPLACE_API_PREFIX, PUBLIC_API_PREFIX, WEB_PREFIX } from '@/config'
+import { getInitialTokenV2, isTokenV1 } from '@/app/components/share/utils'
+import { getProcessedSystemVariablesFromUrlParams } from '@/app/components/base/chat/utils'
+
+const TIME_OUT = 100000
+
+export const ContentType = {
+  json: 'application/json',
+  stream: 'text/event-stream',
+  audio: 'audio/mpeg',
+  form: 'application/x-www-form-urlencoded; charset=UTF-8',
+  download: 'application/octet-stream', // for download
+  downloadZip: 'application/zip', // for download
+  upload: 'multipart/form-data', // for upload
+}
+
+export type FetchOptionType = Omit<RequestInit, 'body'> & {
+  params?: Record<string, any>
+  body?: BodyInit | Record<string, any> | null
+}
+
+const afterResponse204: AfterResponseHook = async (_request, _options, response) => {
+  if (response.status === 204) return Response.json({ result: 'success' })
+}
+
+export type ResponseError = {
+  code: string
+  message: string
+  status: number
+}
+
+const afterResponseErrorCode = (otherOptions: IOtherOptions): AfterResponseHook => {
+  return async (_request, _options, response) => {
+    const clonedResponse = response.clone()
+    if (!/^([23])\d{2}$/.test(String(clonedResponse.status))) {
+      const bodyJson = clonedResponse.json() as Promise<ResponseError>
+      switch (clonedResponse.status) {
+        case 403:
+          bodyJson.then((data: ResponseError) => {
+            if (!otherOptions.silent)
+              Toast.notify({ type: 'error', message: data.message })
+            if (data.code === 'already_setup')
+              globalThis.location.href = `${WEB_PREFIX}/signin`
+          })
+          break
+        case 401:
+          return Promise.reject(response)
+        // fall through
+        default:
+          bodyJson.then((data: ResponseError) => {
+            if (!otherOptions.silent)
+              Toast.notify({ type: 'error', message: data.message })
+          })
+          return Promise.reject(response)
+      }
+    }
+  }
+}
+
+const beforeErrorToast = (otherOptions: IOtherOptions): BeforeErrorHook => {
+  return (error) => {
+    if (!otherOptions.silent)
+      Toast.notify({ type: 'error', message: error.message })
+    return error
+  }
+}
+
+export async function getAccessToken(isPublicAPI?: boolean) {
+  if (isPublicAPI) {
+    const sharedToken = globalThis.location.pathname.split('/').slice(-1)[0]
+    const userId = (await getProcessedSystemVariablesFromUrlParams()).user_id
+    const accessToken = localStorage.getItem('token') || JSON.stringify({ version: 2 })
+    let accessTokenJson: Record<string, any> = { version: 2 }
+    try {
+      accessTokenJson = JSON.parse(accessToken)
+      if (isTokenV1(accessTokenJson))
+        accessTokenJson = getInitialTokenV2()
+    }
+    catch {
+
+    }
+    return accessTokenJson[sharedToken]?.[userId || 'DEFAULT']
+  }
+  else {
+    return localStorage.getItem('console_token') || ''
+  }
+}
+
+const beforeRequestPublicAuthorization: BeforeRequestHook = async (request) => {
+  const token = await getAccessToken(true)
+  request.headers.set('Authorization', `Bearer ${token}`)
+}
+
+const beforeRequestAuthorization: BeforeRequestHook = async (request) => {
+  const accessToken = await getAccessToken()
+  request.headers.set('Authorization', `Bearer ${accessToken}`)
+}
+
+const baseHooks: Hooks = {
+  afterResponse: [
+    afterResponse204,
+  ],
+}
+
+const baseClient = ky.create({
+  hooks: baseHooks,
+  timeout: TIME_OUT,
+})
+
+export const baseOptions: RequestInit = {
+  method: 'GET',
+  mode: 'cors',
+  credentials: 'include', // always send cookies銆丠TTP Basic authentication.
+  headers: new Headers({
+    'Content-Type': ContentType.json,
+  }),
+  redirect: 'follow',
+}
+
+async function base<T>(url: string, options: FetchOptionType = {}, otherOptions: IOtherOptions = {}): Promise<T> {
+  const { params, body, headers, ...init } = Object.assign({}, baseOptions, options)
+  const {
+    isPublicAPI = false,
+    isMarketplaceAPI = false,
+    bodyStringify = true,
+    needAllResponseContent,
+    deleteContentType,
+    getAbortController,
+  } = otherOptions
+
+  let base: string
+  if (isMarketplaceAPI)
+    base = MARKETPLACE_API_PREFIX
+   else if (isPublicAPI)
+    base = PUBLIC_API_PREFIX
+   else
+    base = API_PREFIX
+
+  if (getAbortController) {
+    const abortController = new AbortController()
+    getAbortController(abortController)
+    options.signal = abortController.signal
+  }
+
+  const fetchPathname = base + (url.startsWith('/') ? url : `/${url}`)
+
+  if (deleteContentType)
+    (headers as any).delete('Content-Type')
+
+  const client = baseClient.extend({
+    hooks: {
+      ...baseHooks,
+      beforeError: [
+        ...baseHooks.beforeError || [],
+        beforeErrorToast(otherOptions),
+      ],
+      beforeRequest: [
+        ...baseHooks.beforeRequest || [],
+        isPublicAPI && beforeRequestPublicAuthorization,
+        !isPublicAPI && !isMarketplaceAPI && beforeRequestAuthorization,
+      ].filter(Boolean),
+      afterResponse: [
+        ...baseHooks.afterResponse || [],
+        afterResponseErrorCode(otherOptions),
+      ],
+    },
+  })
+
+  const res = await client(fetchPathname, {
+    ...init,
+    headers,
+    credentials: isMarketplaceAPI
+      ? 'omit'
+      : (options.credentials || 'include'),
+    retry: {
+      methods: [],
+    },
+    ...(bodyStringify ? { json: body } : { body: body as BodyInit }),
+    searchParams: params,
+    fetch(resource: RequestInfo | URL, options?: RequestInit) {
+      if (resource instanceof Request && options) {
+        const mergedHeaders = new Headers(options.headers || {})
+        resource.headers.forEach((value, key) => {
+          mergedHeaders.append(key, value)
+        })
+        options.headers = mergedHeaders
+      }
+      return globalThis.fetch(resource, options)
+    },
+  })
+
+  if (needAllResponseContent)
+    return res as T
+  const contentType = res.headers.get('content-type')
+  if (
+    contentType
+    && [ContentType.download, ContentType.audio, ContentType.downloadZip].includes(contentType)
+  )
+    return await res.blob() as T
+
+  return await res.json() as T
+}
+
+export { base }
diff --git a/service/knowledge/use-create-dataset.ts b/service/knowledge/use-create-dataset.ts
new file mode 100644
index 0000000..88ef1d9
--- /dev/null
+++ b/service/knowledge/use-create-dataset.ts
@@ -0,0 +1,223 @@
+import groupBy from 'lodash-es/groupBy'
+import type { MutationOptions } from '@tanstack/react-query'
+import { useMutation } from '@tanstack/react-query'
+import { createDocument, createFirstDocument, fetchDefaultProcessRule, fetchFileIndexingEstimate } from '../datasets'
+import type { IndexingType } from '@/app/components/datasets/create/step-two'
+import type { ChunkingMode, CrawlOptions, CrawlResultItem, CreateDocumentReq, CustomFile, DataSourceType, FileIndexingEstimateResponse, IndexingEstimateParams, NotionInfo, ProcessRule, ProcessRuleResponse, createDocumentResponse } from '@/models/datasets'
+import type { DataSourceProvider, NotionPage } from '@/models/common'
+
+export const getNotionInfo = (
+  notionPages: NotionPage[],
+) => {
+  const workspacesMap = groupBy(notionPages, 'workspace_id')
+  const workspaces = Object.keys(workspacesMap).map((workspaceId) => {
+    return {
+      workspaceId,
+      pages: workspacesMap[workspaceId],
+    }
+  })
+  return workspaces.map((workspace) => {
+    return {
+      workspace_id: workspace.workspaceId,
+      pages: workspace.pages.map((page) => {
+        const { page_id, page_name, page_icon, type } = page
+        return {
+          page_id,
+          page_name,
+          page_icon,
+          type,
+        }
+      }),
+    }
+  }) as NotionInfo[]
+}
+
+export const getWebsiteInfo = (
+  opts: {
+    websiteCrawlProvider: DataSourceProvider
+    websiteCrawlJobId: string
+    websitePages: CrawlResultItem[]
+    crawlOptions?: CrawlOptions
+  },
+) => {
+  const { websiteCrawlProvider, websiteCrawlJobId, websitePages, crawlOptions } = opts
+  return {
+    provider: websiteCrawlProvider,
+    job_id: websiteCrawlJobId,
+    urls: websitePages.map(page => page.source_url),
+    only_main_content: crawlOptions?.only_main_content,
+  }
+}
+
+type GetFileIndexingEstimateParamsOptionBase = {
+  docForm: ChunkingMode
+  docLanguage: string
+  indexingTechnique: IndexingType
+  processRule: ProcessRule
+  dataset_id: string
+}
+
+type GetFileIndexingEstimateParamsOptionFile = GetFileIndexingEstimateParamsOptionBase & {
+  dataSourceType: DataSourceType.FILE
+  files: CustomFile[]
+}
+
+const getFileIndexingEstimateParamsForFile = ({
+  docForm,
+  docLanguage,
+  dataSourceType,
+  files,
+  indexingTechnique,
+  processRule,
+  dataset_id,
+}: GetFileIndexingEstimateParamsOptionFile): IndexingEstimateParams => {
+  return {
+    info_list: {
+      data_source_type: dataSourceType,
+      file_info_list: {
+        file_ids: files.map(file => file.id) as string[],
+      },
+    },
+    indexing_technique: indexingTechnique,
+    process_rule: processRule,
+    doc_form: docForm,
+    doc_language: docLanguage,
+    dataset_id,
+  }
+}
+
+export const useFetchFileIndexingEstimateForFile = (
+  options: GetFileIndexingEstimateParamsOptionFile,
+  mutationOptions: MutationOptions<FileIndexingEstimateResponse> = {},
+) => {
+  return useMutation({
+    mutationFn: async () => {
+      return fetchFileIndexingEstimate(getFileIndexingEstimateParamsForFile(options))
+    },
+    ...mutationOptions,
+  })
+}
+
+type GetFileIndexingEstimateParamsOptionNotion = GetFileIndexingEstimateParamsOptionBase & {
+  dataSourceType: DataSourceType.NOTION
+  notionPages: NotionPage[]
+}
+
+const getFileIndexingEstimateParamsForNotion = ({
+  docForm,
+  docLanguage,
+  dataSourceType,
+  notionPages,
+  indexingTechnique,
+  processRule,
+  dataset_id,
+}: GetFileIndexingEstimateParamsOptionNotion): IndexingEstimateParams => {
+  return {
+    info_list: {
+      data_source_type: dataSourceType,
+      notion_info_list: getNotionInfo(notionPages),
+    },
+    indexing_technique: indexingTechnique,
+    process_rule: processRule,
+    doc_form: docForm,
+    doc_language: docLanguage,
+    dataset_id,
+  }
+}
+
+export const useFetchFileIndexingEstimateForNotion = (
+  options: GetFileIndexingEstimateParamsOptionNotion,
+  mutationOptions: MutationOptions<FileIndexingEstimateResponse> = {},
+) => {
+  return useMutation({
+    mutationFn: async () => {
+      return fetchFileIndexingEstimate(getFileIndexingEstimateParamsForNotion(options))
+    },
+    ...mutationOptions,
+  })
+}
+
+type GetFileIndexingEstimateParamsOptionWeb = GetFileIndexingEstimateParamsOptionBase & {
+  dataSourceType: DataSourceType.WEB
+  websitePages: CrawlResultItem[]
+  crawlOptions?: CrawlOptions
+  websiteCrawlProvider: DataSourceProvider
+  websiteCrawlJobId: string
+}
+
+const getFileIndexingEstimateParamsForWeb = ({
+  docForm,
+  docLanguage,
+  dataSourceType,
+  websitePages,
+  crawlOptions,
+  websiteCrawlProvider,
+  websiteCrawlJobId,
+  indexingTechnique,
+  processRule,
+  dataset_id,
+}: GetFileIndexingEstimateParamsOptionWeb): IndexingEstimateParams => {
+  return {
+    info_list: {
+      data_source_type: dataSourceType,
+      website_info_list: getWebsiteInfo({
+        websiteCrawlProvider,
+        websiteCrawlJobId,
+        websitePages,
+        crawlOptions,
+      }),
+    },
+    indexing_technique: indexingTechnique,
+    process_rule: processRule,
+    doc_form: docForm,
+    doc_language: docLanguage,
+    dataset_id,
+  }
+}
+
+export const useFetchFileIndexingEstimateForWeb = (
+  options: GetFileIndexingEstimateParamsOptionWeb,
+  mutationOptions: MutationOptions<FileIndexingEstimateResponse> = {},
+) => {
+  return useMutation({
+    mutationFn: async () => {
+      return fetchFileIndexingEstimate(getFileIndexingEstimateParamsForWeb(options))
+    },
+    ...mutationOptions,
+  })
+}
+
+export const useCreateFirstDocument = (
+  mutationOptions: MutationOptions<createDocumentResponse, Error, CreateDocumentReq> = {},
+) => {
+  return useMutation({
+    mutationFn: async (createDocumentReq: CreateDocumentReq,
+    ) => {
+      return createFirstDocument({ body: createDocumentReq })
+    },
+    ...mutationOptions,
+  })
+}
+
+export const useCreateDocument = (
+  datasetId: string,
+  mutationOptions: MutationOptions<createDocumentResponse, Error, CreateDocumentReq> = {},
+) => {
+  return useMutation({
+    mutationFn: async (req: CreateDocumentReq) => {
+      return createDocument({ datasetId, body: req })
+    },
+    ...mutationOptions,
+  })
+}
+
+export const useFetchDefaultProcessRule = (
+  mutationOptions: MutationOptions<ProcessRuleResponse, Error, string> = {},
+) => {
+  return useMutation({
+    mutationFn: async (url: string) => {
+      return fetchDefaultProcessRule({ url })
+    },
+    ...mutationOptions,
+  })
+}
diff --git a/service/knowledge/use-document.ts b/service/knowledge/use-document.ts
new file mode 100644
index 0000000..6dabe7d
--- /dev/null
+++ b/service/knowledge/use-document.ts
@@ -0,0 +1,132 @@
+import {
+  useMutation,
+  useQuery,
+} from '@tanstack/react-query'
+import { del, get, patch } from '../base'
+import { useInvalid } from '../use-base'
+import type { MetadataType, SortType } from '../datasets'
+import type { DocumentDetailResponse, DocumentListResponse, UpdateDocumentBatchParams } from '@/models/datasets'
+import { DocumentActionType } from '@/models/datasets'
+import type { CommonResponse } from '@/models/common'
+
+const NAME_SPACE = 'knowledge/document'
+
+export const useDocumentListKey = [NAME_SPACE, 'documentList']
+export const useDocumentList = (payload: {
+  datasetId: string
+  query: {
+    keyword: string
+    page: number
+    limit: number
+    sort?: SortType
+  },
+  refetchInterval?: number | false
+}) => {
+  const { query, datasetId, refetchInterval } = payload
+  const { keyword, page, limit, sort } = query
+  return useQuery<DocumentListResponse>({
+    queryKey: [...useDocumentListKey, datasetId, keyword, page, limit, sort],
+    queryFn: () => get<DocumentListResponse>(`/datasets/${datasetId}/documents`, {
+      params: query,
+    }),
+    refetchInterval,
+  })
+}
+
+export const useInvalidDocumentList = (datasetId?: string) => {
+  return useInvalid(datasetId ? [...useDocumentListKey, datasetId] : useDocumentListKey)
+}
+
+const useAutoDisabledDocumentKey = [NAME_SPACE, 'autoDisabledDocument']
+export const useAutoDisabledDocuments = (datasetId: string) => {
+  return useQuery({
+    queryKey: [...useAutoDisabledDocumentKey, datasetId],
+    queryFn: () => get<{ document_ids: string[] }>(`/datasets/${datasetId}/auto-disable-logs`),
+  })
+}
+
+export const useInvalidDisabledDocument = () => {
+  return useInvalid(useAutoDisabledDocumentKey)
+}
+
+const toBatchDocumentsIdParams = (documentIds: string[] | string) => {
+  const ids = Array.isArray(documentIds) ? documentIds : [documentIds]
+  return ids.map(id => `document_id=${id}`).join('&')
+}
+
+export const useDocumentBatchAction = (action: DocumentActionType) => {
+  return useMutation({
+    mutationFn: ({ datasetId, documentIds, documentId }: UpdateDocumentBatchParams) => {
+      return patch<CommonResponse>(`/datasets/${datasetId}/documents/status/${action}/batch?${toBatchDocumentsIdParams(documentId || documentIds!)}`)
+    },
+  })
+}
+
+export const useDocumentEnable = () => {
+  return useDocumentBatchAction(DocumentActionType.enable)
+}
+
+export const useDocumentDisable = () => {
+  return useDocumentBatchAction(DocumentActionType.disable)
+}
+
+export const useDocumentArchive = () => {
+  return useDocumentBatchAction(DocumentActionType.archive)
+}
+
+export const useDocumentUnArchive = () => {
+  return useDocumentBatchAction(DocumentActionType.unArchive)
+}
+
+export const useDocumentDelete = () => {
+  return useMutation({
+    mutationFn: ({ datasetId, documentIds, documentId }: UpdateDocumentBatchParams) => {
+      return del<CommonResponse>(`/datasets/${datasetId}/documents?${toBatchDocumentsIdParams(documentId || documentIds!)}`)
+    },
+  })
+}
+
+export const useSyncDocument = () => {
+  return useMutation({
+    mutationFn: ({ datasetId, documentId }: UpdateDocumentBatchParams) => {
+      return get<CommonResponse>(`/datasets/${datasetId}/documents/${documentId}/notion/sync`)
+    },
+  })
+}
+
+export const useSyncWebsite = () => {
+  return useMutation({
+    mutationFn: ({ datasetId, documentId }: UpdateDocumentBatchParams) => {
+      return get<CommonResponse>(`/datasets/${datasetId}/documents/${documentId}/website-sync`)
+    },
+  })
+}
+
+const useDocumentDetailKey = [NAME_SPACE, 'documentDetail', 'withoutMetaData']
+export const useDocumentDetail = (payload: {
+  datasetId: string
+  documentId: string
+  params: { metadata: MetadataType }
+}) => {
+  const { datasetId, documentId, params } = payload
+  return useQuery<DocumentDetailResponse>({
+    queryKey: [...useDocumentDetailKey, 'withoutMetaData', datasetId, documentId],
+    queryFn: () => get<DocumentDetailResponse>(`/datasets/${datasetId}/documents/${documentId}`, { params }),
+  })
+}
+
+export const useDocumentMetadata = (payload: {
+  datasetId: string
+  documentId: string
+  params: { metadata: MetadataType }
+}) => {
+  const { datasetId, documentId, params } = payload
+  return useQuery<DocumentDetailResponse>({
+    queryKey: [...useDocumentDetailKey, 'onlyMetaData', datasetId, documentId],
+    queryFn: () => get<DocumentDetailResponse>(`/datasets/${datasetId}/documents/${documentId}`, { params }),
+  })
+}
+
+export const useInvalidDocumentDetailKey = () => {
+  return useInvalid(useDocumentDetailKey)
+}
diff --git a/service/knowledge/use-hit-testing.ts b/service/knowledge/use-hit-testing.ts
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/service/knowledge/use-hit-testing.ts
diff --git a/service/knowledge/use-import.ts b/service/knowledge/use-import.ts
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/service/knowledge/use-import.ts
diff --git a/service/knowledge/use-metadata.ts b/service/knowledge/use-metadata.ts
new file mode 100644
index 0000000..5e9186f
--- /dev/null
+++ b/service/knowledge/use-metadata.ts
@@ -0,0 +1,146 @@
+import type { BuiltInMetadataItem, MetadataBatchEditToServer, MetadataItemWithValueLength } from '@/app/components/datasets/metadata/types'
+import { del, get, patch, post } from '../base'
+import { useDocumentListKey, useInvalidDocumentList } from './use-document'
+import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
+import { useInvalid } from '../use-base'
+import type { DocumentDetailResponse } from '@/models/datasets'
+
+const NAME_SPACE = 'dataset-metadata'
+
+export const useDatasetMetaData = (datasetId: string) => {
+  return useQuery<{ doc_metadata: MetadataItemWithValueLength[], built_in_field_enabled: boolean }>({
+    queryKey: [NAME_SPACE, 'dataset', datasetId],
+    queryFn: () => {
+      return get<{ doc_metadata: MetadataItemWithValueLength[], built_in_field_enabled: boolean }>(`/datasets/${datasetId}/metadata`)
+    },
+  })
+}
+
+export const useInvalidDatasetMetaData = (datasetId: string) => {
+  return useInvalid([NAME_SPACE, 'dataset', datasetId])
+}
+
+export const useCreateMetaData = (datasetId: string) => {
+  const invalidDatasetMetaData = useInvalidDatasetMetaData(datasetId)
+  return useMutation({
+    mutationFn: async (payload: BuiltInMetadataItem) => {
+      await post(`/datasets/${datasetId}/metadata`, {
+        body: payload,
+      })
+      await invalidDatasetMetaData()
+      return Promise.resolve(true)
+    },
+  })
+}
+export const useInvalidAllDocumentMetaData = (datasetId: string) => {
+  const queryClient = useQueryClient()
+  return () => {
+    queryClient.invalidateQueries({
+      queryKey: [NAME_SPACE, 'document', datasetId],
+      exact: false, // invalidate all document metadata: [NAME_SPACE, 'document', datasetId, documentId]
+    })
+  }
+}
+
+const useInvalidAllMetaData = (datasetId: string) => {
+  const invalidDatasetMetaData = useInvalidDatasetMetaData(datasetId)
+  const invalidDocumentList = useInvalidDocumentList(datasetId)
+  const invalidateAllDocumentMetaData = useInvalidAllDocumentMetaData(datasetId)
+
+  return async () => {
+    // meta data in dataset
+    await invalidDatasetMetaData()
+    // meta data in document list
+    invalidDocumentList()
+    // meta data in single document
+    await invalidateAllDocumentMetaData() // meta data in document
+  }
+}
+
+export const useRenameMeta = (datasetId: string) => {
+  const invalidateAllMetaData = useInvalidAllMetaData(datasetId)
+  return useMutation({
+    mutationFn: async (payload: MetadataItemWithValueLength) => {
+      await patch(`/datasets/${datasetId}/metadata/${payload.id}`, {
+        body: {
+          name: payload.name,
+        },
+      })
+      await invalidateAllMetaData()
+    },
+  })
+}
+
+export const useDeleteMetaData = (datasetId: string) => {
+  const invalidateAllMetaData = useInvalidAllMetaData(datasetId)
+  return useMutation({
+    mutationFn: async (metaDataId: string) => {
+      // datasetMetaData = datasetMetaData.filter(item => item.id !== metaDataId)
+      await del(`/datasets/${datasetId}/metadata/${metaDataId}`)
+      await invalidateAllMetaData()
+    },
+  })
+}
+
+export const useBuiltInMetaDataFields = () => {
+  return useQuery<{ fields: BuiltInMetadataItem[] }>({
+    queryKey: [NAME_SPACE, 'built-in'],
+    queryFn: () => {
+      return get('/datasets/metadata/built-in')
+    },
+  })
+}
+
+export const useDocumentMetaData = ({ datasetId, documentId }: { datasetId: string, documentId: string }) => {
+  return useQuery<DocumentDetailResponse>({
+    queryKey: [NAME_SPACE, 'document', datasetId, documentId],
+    queryFn: () => {
+      return get<DocumentDetailResponse>(`/datasets/${datasetId}/documents/${documentId}`, { params: { metadata: 'only' } })
+    },
+  })
+}
+
+export const useBatchUpdateDocMetadata = () => {
+  const queryClient = useQueryClient()
+  return useMutation({
+    mutationFn: async (payload: {
+      dataset_id: string
+      metadata_list: MetadataBatchEditToServer
+    }) => {
+      const documentIds = payload.metadata_list.map(item => item.document_id)
+      await post(`/datasets/${payload.dataset_id}/documents/metadata`, {
+        body: {
+          operation_data: payload.metadata_list,
+        },
+      })
+      // meta data in dataset
+      await queryClient.invalidateQueries({
+        queryKey: [NAME_SPACE, 'dataset', payload.dataset_id],
+      })
+      // meta data in document list
+      await queryClient.invalidateQueries({
+        queryKey: [NAME_SPACE, 'dataset', payload.dataset_id],
+      })
+      await queryClient.invalidateQueries({
+        queryKey: [...useDocumentListKey, payload.dataset_id],
+      })
+
+      // meta data in single document
+      await Promise.all(documentIds.map(documentId => queryClient.invalidateQueries(
+        {
+          queryKey: [NAME_SPACE, 'document', payload.dataset_id, documentId],
+        },
+      )))
+    },
+  })
+}
+
+export const useUpdateBuiltInStatus = (datasetId: string) => {
+  const invalidDatasetMetaData = useInvalidDatasetMetaData(datasetId)
+  return useMutation({
+    mutationFn: async (enabled: boolean) => {
+      await post(`/datasets/${datasetId}/metadata/built-in/${enabled ? 'enable' : 'disable'}`)
+      invalidDatasetMetaData()
+    },
+  })
+}
diff --git a/service/knowledge/use-segment.ts b/service/knowledge/use-segment.ts
new file mode 100644
index 0000000..ca1778f
--- /dev/null
+++ b/service/knowledge/use-segment.ts
@@ -0,0 +1,172 @@
+import { useMutation, useQuery } from '@tanstack/react-query'
+import { del, get, patch, post } from '../base'
+import type { CommonResponse } from '@/models/common'
+import type {
+  BatchImportResponse,
+  ChildChunkDetail,
+  ChildSegmentsResponse,
+  ChunkingMode,
+  SegmentDetailModel,
+  SegmentUpdater,
+  SegmentsResponse,
+} from '@/models/datasets'
+
+const NAME_SPACE = 'segment'
+
+export const useSegmentListKey = [NAME_SPACE, 'chunkList']
+export const useChunkListEnabledKey = [NAME_SPACE, 'chunkList', { enabled: true }]
+export const useChunkListDisabledKey = [NAME_SPACE, 'chunkList', { enabled: false }]
+export const useChunkListAllKey = [NAME_SPACE, 'chunkList', { enabled: 'all' }]
+
+export const useSegmentList = (
+  payload: {
+    datasetId: string
+    documentId: string
+    params: {
+      page: number
+      limit: number
+      keyword: string
+      enabled: boolean | 'all' | ''
+    }
+  },
+  disable?: boolean,
+) => {
+  const { datasetId, documentId, params } = payload
+  const { page, limit, keyword, enabled } = params
+  return useQuery<SegmentsResponse>({
+    queryKey: [...useSegmentListKey, { datasetId, documentId, page, limit, keyword, enabled }],
+    queryFn: () => {
+      return get<SegmentsResponse>(`/datasets/${datasetId}/documents/${documentId}/segments`, { params })
+    },
+    enabled: !disable,
+  })
+}
+
+export const useUpdateSegment = () => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'update'],
+    mutationFn: (payload: { datasetId: string; documentId: string; segmentId: string; body: SegmentUpdater }) => {
+      const { datasetId, documentId, segmentId, body } = payload
+      return patch<{ data: SegmentDetailModel; doc_form: ChunkingMode }>(`/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}`, { body })
+    },
+  })
+}
+
+export const useAddSegment = () => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'add'],
+    mutationFn: (payload: { datasetId: string; documentId: string; body: SegmentUpdater }) => {
+      const { datasetId, documentId, body } = payload
+      return post<{ data: SegmentDetailModel; doc_form: ChunkingMode }>(`/datasets/${datasetId}/documents/${documentId}/segment`, { body })
+    },
+  })
+}
+
+export const useEnableSegment = () => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'enable'],
+    mutationFn: (payload: { datasetId: string; documentId: string; segmentIds: string[] }) => {
+      const { datasetId, documentId, segmentIds } = payload
+      const query = segmentIds.map(id => `segment_id=${id}`).join('&')
+      return patch<CommonResponse>(`/datasets/${datasetId}/documents/${documentId}/segment/enable?${query}`)
+    },
+  })
+}
+
+export const useDisableSegment = () => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'disable'],
+    mutationFn: (payload: { datasetId: string; documentId: string; segmentIds: string[] }) => {
+      const { datasetId, documentId, segmentIds } = payload
+      const query = segmentIds.map(id => `segment_id=${id}`).join('&')
+      return patch<CommonResponse>(`/datasets/${datasetId}/documents/${documentId}/segment/disable?${query}`)
+    },
+  })
+}
+
+export const useDeleteSegment = () => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'delete'],
+    mutationFn: (payload: { datasetId: string; documentId: string; segmentIds: string[] }) => {
+      const { datasetId, documentId, segmentIds } = payload
+      const query = segmentIds.map(id => `segment_id=${id}`).join('&')
+      return del<CommonResponse>(`/datasets/${datasetId}/documents/${documentId}/segments?${query}`)
+    },
+  })
+}
+
+export const useChildSegmentListKey = [NAME_SPACE, 'childChunkList']
+
+export const useChildSegmentList = (
+  payload: {
+    datasetId: string
+    documentId: string
+    segmentId: string
+    params: {
+      page: number
+      limit: number
+      keyword: string
+    }
+  },
+  disable?: boolean,
+) => {
+  const { datasetId, documentId, segmentId, params } = payload
+  const { page, limit, keyword } = params
+  return useQuery({
+    queryKey: [...useChildSegmentListKey, { datasetId, documentId, segmentId, page, limit, keyword }],
+    queryFn: () => {
+      return get<ChildSegmentsResponse>(`/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}/child_chunks`, { params })
+    },
+    enabled: !disable,
+  })
+}
+
+export const useDeleteChildSegment = () => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'childChunk', 'delete'],
+    mutationFn: (payload: { datasetId: string; documentId: string; segmentId: string; childChunkId: string }) => {
+      const { datasetId, documentId, segmentId, childChunkId } = payload
+      return del<CommonResponse>(`/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}/child_chunks/${childChunkId}`)
+    },
+  })
+}
+
+export const useAddChildSegment = () => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'childChunk', 'add'],
+    mutationFn: (payload: { datasetId: string; documentId: string; segmentId: string; body: { content: string } }) => {
+      const { datasetId, documentId, segmentId, body } = payload
+      return post<{ data: ChildChunkDetail }>(`/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}/child_chunks`, { body })
+    },
+  })
+}
+
+export const useUpdateChildSegment = () => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'childChunk', 'update'],
+    mutationFn: (payload: { datasetId: string; documentId: string; segmentId: string; childChunkId: string; body: { content: string } }) => {
+      const { datasetId, documentId, segmentId, childChunkId, body } = payload
+      return patch<{ data: ChildChunkDetail }>(`/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}/child_chunks/${childChunkId}`, { body })
+    },
+  })
+}
+
+export const useSegmentBatchImport = () => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'batchImport'],
+    mutationFn: (payload: { url: string; body: FormData }) => {
+      const { url, body } = payload
+      return post<BatchImportResponse>(url, { body }, { bodyStringify: false, deleteContentType: true })
+    },
+  })
+}
+
+export const useCheckSegmentBatchImportProgress = () => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'batchImport', 'checkProgress'],
+    mutationFn: (payload: { jobID: string }) => {
+      const { jobID } = payload
+      return get<BatchImportResponse>(`/datasets/batch_import_status/${jobID}`)
+    },
+  })
+}
diff --git a/service/log.ts b/service/log.ts
new file mode 100644
index 0000000..4bb4626
--- /dev/null
+++ b/service/log.ts
@@ -0,0 +1,80 @@
+import type { Fetcher } from 'swr'
+import { get, post } from './base'
+import type {
+  AgentLogDetailRequest,
+  AgentLogDetailResponse,
+  AnnotationsCountResponse,
+  ChatConversationFullDetailResponse,
+  ChatConversationsRequest,
+  ChatConversationsResponse,
+  ChatMessagesRequest,
+  ChatMessagesResponse,
+  CompletionConversationFullDetailResponse,
+  CompletionConversationsRequest,
+  CompletionConversationsResponse,
+  ConversationListResponse,
+  LogMessageAnnotationsRequest,
+  LogMessageAnnotationsResponse,
+  LogMessageFeedbacksRequest,
+  LogMessageFeedbacksResponse,
+  WorkflowLogsResponse,
+  WorkflowRunDetailResponse,
+} from '@/models/log'
+import type { NodeTracingListResponse } from '@/types/workflow'
+
+export const fetchConversationList: Fetcher<ConversationListResponse, { name: string; appId: string; params?: Record<string, any> }> = ({ appId, params }) => {
+  return get<ConversationListResponse>(`/console/api/apps/${appId}/messages`, params)
+}
+
+// (Text Generation Application) Session List
+export const fetchCompletionConversations: Fetcher<CompletionConversationsResponse, { url: string; params?: CompletionConversationsRequest }> = ({ url, params }) => {
+  return get<CompletionConversationsResponse>(url, { params })
+}
+
+// (Text Generation Application) Session Detail
+export const fetchCompletionConversationDetail: Fetcher<CompletionConversationFullDetailResponse, { url: string }> = ({ url }) => {
+  return get<CompletionConversationFullDetailResponse>(url, {})
+}
+
+// (Chat Application) Session List
+export const fetchChatConversations: Fetcher<ChatConversationsResponse, { url: string; params?: ChatConversationsRequest }> = ({ url, params }) => {
+  return get<ChatConversationsResponse>(url, { params })
+}
+
+// (Chat Application) Session Detail
+export const fetchChatConversationDetail: Fetcher<ChatConversationFullDetailResponse, { url: string }> = ({ url }) => {
+  return get<ChatConversationFullDetailResponse>(url, {})
+}
+
+// (Chat Application) Message list in one session
+export const fetchChatMessages: Fetcher<ChatMessagesResponse, { url: string; params: ChatMessagesRequest }> = ({ url, params }) => {
+  return get<ChatMessagesResponse>(url, { params })
+}
+
+export const updateLogMessageFeedbacks: Fetcher<LogMessageFeedbacksResponse, { url: string; body: LogMessageFeedbacksRequest }> = ({ url, body }) => {
+  return post<LogMessageFeedbacksResponse>(url, { body })
+}
+
+export const updateLogMessageAnnotations: Fetcher<LogMessageAnnotationsResponse, { url: string; body: LogMessageAnnotationsRequest }> = ({ url, body }) => {
+  return post<LogMessageAnnotationsResponse>(url, { body })
+}
+
+export const fetchAnnotationsCount: Fetcher<AnnotationsCountResponse, { url: string }> = ({ url }) => {
+  return get<AnnotationsCountResponse>(url)
+}
+
+export const fetchWorkflowLogs: Fetcher<WorkflowLogsResponse, { url: string; params: Record<string, any> }> = ({ url, params }) => {
+  return get<WorkflowLogsResponse>(url, { params })
+}
+
+export const fetchRunDetail = ({ appID, runID }: { appID: string; runID: string }) => {
+  return get<WorkflowRunDetailResponse>(`/apps/${appID}/workflow-runs/${runID}`)
+}
+
+export const fetchTracingList: Fetcher<NodeTracingListResponse, { url: string }> = ({ url }) => {
+  return get<NodeTracingListResponse>(url)
+}
+
+export const fetchAgentLogDetail = ({ appID, params }: { appID: string; params: AgentLogDetailRequest }) => {
+  return get<AgentLogDetailResponse>(`/apps/${appID}/agent/logs`, { params })
+}
diff --git a/service/plugins.ts b/service/plugins.ts
new file mode 100644
index 0000000..0a880b8
--- /dev/null
+++ b/service/plugins.ts
@@ -0,0 +1,108 @@
+import type { Fetcher } from 'swr'
+import { get, getMarketplace, post, upload } from './base'
+import type {
+  Dependency,
+  InstallPackageResponse,
+  Permissions,
+  PluginDeclaration,
+  PluginInfoFromMarketPlace,
+  PluginManifestInMarket,
+  PluginTasksResponse,
+  TaskStatusResponse,
+  UninstallPluginResponse,
+  updatePackageResponse,
+  uploadGitHubResponse,
+} from '@/app/components/plugins/types'
+import type {
+  MarketplaceCollectionPluginsResponse,
+  MarketplaceCollectionsResponse,
+} from '@/app/components/plugins/marketplace/types'
+
+export const uploadFile = async (file: File, isBundle: boolean) => {
+  const formData = new FormData()
+  formData.append(isBundle ? 'bundle' : 'pkg', file)
+  return upload({
+    xhr: new XMLHttpRequest(),
+    data: formData,
+  }, false, `/workspaces/current/plugin/upload/${isBundle ? 'bundle' : 'pkg'}`)
+}
+
+export const updateFromMarketPlace = async (body: Record<string, string>) => {
+  return post<InstallPackageResponse>('/workspaces/current/plugin/upgrade/marketplace', {
+    body,
+  })
+}
+
+export const updateFromGitHub = async (repoUrl: string, selectedVersion: string, selectedPackage: string,
+  originalPlugin: string, newPlugin: string) => {
+  return post<updatePackageResponse>('/workspaces/current/plugin/upgrade/github', {
+    body: {
+      repo: repoUrl,
+      version: selectedVersion,
+      package: selectedPackage,
+      original_plugin_unique_identifier: originalPlugin,
+      new_plugin_unique_identifier: newPlugin,
+    },
+  })
+}
+
+export const uploadGitHub = async (repoUrl: string, selectedVersion: string, selectedPackage: string) => {
+  return post<uploadGitHubResponse>('/workspaces/current/plugin/upload/github', {
+    body: {
+      repo: repoUrl,
+      version: selectedVersion,
+      package: selectedPackage,
+    },
+  })
+}
+
+export const fetchIcon = (tenantId: string, fileName: string) => {
+  return get(`workspaces/current/plugin/icon?tenant_id=${tenantId}&filename=${fileName}`)
+}
+
+export const fetchManifest = async (uniqueIdentifier: string) => {
+  return get<PluginDeclaration>(`/workspaces/current/plugin/fetch-manifest?plugin_unique_identifier=${uniqueIdentifier}`)
+}
+
+export const fetchManifestFromMarketPlace = async (uniqueIdentifier: string) => {
+  return getMarketplace<{ data: { plugin: PluginManifestInMarket, version: { version: string } } }>(`/plugins/identifier?unique_identifier=${uniqueIdentifier}`)
+}
+
+export const fetchBundleInfoFromMarketPlace = async ({
+  org,
+  name,
+  version,
+}: Record<string, string>) => {
+  return getMarketplace<{ data: { version: { dependencies: Dependency[] } } }>(`/bundles/${org}/${name}/${version}`)
+}
+
+export const fetchPluginInfoFromMarketPlace = async ({
+  org,
+  name,
+}: Record<string, string>) => {
+  return getMarketplace<{ data: { plugin: PluginInfoFromMarketPlace, version: { version: string } } }>(`/plugins/${org}/${name}`)
+}
+
+export const fetchMarketplaceCollections: Fetcher<MarketplaceCollectionsResponse, { url: string; }> = ({ url }) => {
+  return get<MarketplaceCollectionsResponse>(url)
+}
+
+export const fetchMarketplaceCollectionPlugins: Fetcher<MarketplaceCollectionPluginsResponse, { url: string }> = ({ url }) => {
+  return get<MarketplaceCollectionPluginsResponse>(url)
+}
+
+export const fetchPluginTasks = async () => {
+  return get<PluginTasksResponse>('/workspaces/current/plugin/tasks?page=1&page_size=255')
+}
+
+export const checkTaskStatus = async (taskId: string) => {
+  return get<TaskStatusResponse>(`/workspaces/current/plugin/tasks/${taskId}`)
+}
+
+export const updatePermission = async (permissions: Permissions) => {
+  return post('/workspaces/current/plugin/permission/change', { body: permissions })
+}
+
+export const uninstallPlugin = async (pluginId: string) => {
+  return post<UninstallPluginResponse>('/workspaces/current/plugin/uninstall', { body: { plugin_installation_id: pluginId } })
+}
diff --git a/service/refresh-token.ts b/service/refresh-token.ts
new file mode 100644
index 0000000..4f295f3
--- /dev/null
+++ b/service/refresh-token.ts
@@ -0,0 +1,92 @@
+import { apiPrefix } from '@/config'
+import { fetchWithRetry } from '@/utils'
+
+const LOCAL_STORAGE_KEY = 'is_other_tab_refreshing'
+
+let isRefreshing = false
+function waitUntilTokenRefreshed() {
+  return new Promise<void>((resolve) => {
+    function _check() {
+      const isRefreshingSign = globalThis.localStorage.getItem(LOCAL_STORAGE_KEY)
+      if ((isRefreshingSign && isRefreshingSign === '1') || isRefreshing) {
+        setTimeout(() => {
+          _check()
+        }, 1000)
+      }
+      else {
+        resolve()
+      }
+    }
+    _check()
+  })
+}
+
+const isRefreshingSignAvailable = function (delta: number) {
+  const nowTime = new Date().getTime()
+  const lastTime = globalThis.localStorage.getItem('last_refresh_time') || '0'
+  return nowTime - Number.parseInt(lastTime) <= delta
+}
+
+// only one request can send
+async function getNewAccessToken(timeout: number): Promise<void> {
+  try {
+    const isRefreshingSign = globalThis.localStorage.getItem(LOCAL_STORAGE_KEY)
+    if ((isRefreshingSign && isRefreshingSign === '1' && isRefreshingSignAvailable(timeout)) || isRefreshing) {
+      await waitUntilTokenRefreshed()
+    }
+    else {
+      isRefreshing = true
+      globalThis.localStorage.setItem(LOCAL_STORAGE_KEY, '1')
+      globalThis.localStorage.setItem('last_refresh_time', new Date().getTime().toString())
+      globalThis.addEventListener('beforeunload', releaseRefreshLock)
+      const refresh_token = globalThis.localStorage.getItem('refresh_token')
+
+      // Do not use baseFetch to refresh tokens.
+      // If a 401 response occurs and baseFetch itself attempts to refresh the token,
+      // it can lead to an infinite loop if the refresh attempt also returns 401.
+      // To avoid this, handle token refresh separately in a dedicated function
+      // that does not call baseFetch and uses a single retry mechanism.
+      const [error, ret] = await fetchWithRetry(globalThis.fetch(`${apiPrefix}/refresh-token`, {
+        method: 'POST',
+        headers: {
+          'Content-Type': 'application/json;utf-8',
+        },
+        body: JSON.stringify({ refresh_token }),
+      }))
+      if (error) {
+        return Promise.reject(error)
+      }
+      else {
+        if (ret.status === 401)
+          return Promise.reject(ret)
+
+        const { data } = await ret.json()
+        globalThis.localStorage.setItem('console_token', data.access_token)
+        globalThis.localStorage.setItem('refresh_token', data.refresh_token)
+      }
+    }
+  }
+  catch (error) {
+    console.error(error)
+    return Promise.reject(error)
+  }
+  finally {
+    releaseRefreshLock()
+  }
+}
+
+function releaseRefreshLock() {
+  if (isRefreshing) {
+    isRefreshing = false
+    globalThis.localStorage.removeItem(LOCAL_STORAGE_KEY)
+    globalThis.localStorage.removeItem('last_refresh_time')
+    globalThis.removeEventListener('beforeunload', releaseRefreshLock)
+  }
+}
+
+export async function refreshAccessTokenOrRelogin(timeout: number) {
+  return Promise.race([new Promise<void>((resolve, reject) => setTimeout(() => {
+    releaseRefreshLock()
+    reject(new Error('request timeout'))
+  }, timeout)), getNewAccessToken(timeout)])
+}
diff --git a/service/share.ts b/service/share.ts
new file mode 100644
index 0000000..7cc292e
--- /dev/null
+++ b/service/share.ts
@@ -0,0 +1,270 @@
+import type {
+  IOnCompleted,
+  IOnData,
+  IOnError,
+  IOnFile,
+  IOnIterationFinished,
+  IOnIterationNext,
+  IOnIterationStarted,
+  IOnLoopFinished,
+  IOnLoopNext,
+  IOnLoopStarted,
+  IOnMessageEnd,
+  IOnMessageReplace,
+  IOnNodeFinished,
+  IOnNodeStarted,
+  IOnTTSChunk,
+  IOnTTSEnd,
+  IOnTextChunk,
+  IOnTextReplace,
+  IOnThought,
+  IOnWorkflowFinished,
+  IOnWorkflowStarted,
+} from './base'
+import {
+  del as consoleDel, get as consoleGet, patch as consolePatch, post as consolePost,
+  delPublic as del, getPublic as get, patchPublic as patch, postPublic as post, ssePost,
+} from './base'
+import type { FeedbackType } from '@/app/components/base/chat/chat/type'
+import type {
+  AppConversationData,
+  AppData,
+  AppMeta,
+  ConversationItem,
+} from '@/models/share'
+import type { ChatConfig } from '@/app/components/base/chat/types'
+import type { SystemFeatures } from '@/types/feature'
+
+function getAction(action: 'get' | 'post' | 'del' | 'patch', isInstalledApp: boolean) {
+  switch (action) {
+    case 'get':
+      return isInstalledApp ? consoleGet : get
+    case 'post':
+      return isInstalledApp ? consolePost : post
+    case 'patch':
+      return isInstalledApp ? consolePatch : patch
+    case 'del':
+      return isInstalledApp ? consoleDel : del
+  }
+}
+
+export function getUrl(url: string, isInstalledApp: boolean, installedAppId: string) {
+  return isInstalledApp ? `installed-apps/${installedAppId}/${url.startsWith('/') ? url.slice(1) : url}` : url
+}
+
+export const sendChatMessage = async (body: Record<string, any>, { onData, onCompleted, onThought, onFile, onError, getAbortController, onMessageEnd, onMessageReplace, onTTSChunk, onTTSEnd }: {
+  onData: IOnData
+  onCompleted: IOnCompleted
+  onFile: IOnFile
+  onThought: IOnThought
+  onError: IOnError
+  onMessageEnd?: IOnMessageEnd
+  onMessageReplace?: IOnMessageReplace
+  getAbortController?: (abortController: AbortController) => void
+  onTTSChunk?: IOnTTSChunk
+  onTTSEnd?: IOnTTSEnd
+}, isInstalledApp: boolean, installedAppId = '') => {
+  return ssePost(getUrl('chat-messages', isInstalledApp, installedAppId), {
+    body: {
+      ...body,
+      response_mode: 'streaming',
+    },
+  }, { onData, onCompleted, onThought, onFile, isPublicAPI: !isInstalledApp, onError, getAbortController, onMessageEnd, onMessageReplace, onTTSChunk, onTTSEnd })
+}
+
+export const stopChatMessageResponding = async (appId: string, taskId: string, isInstalledApp: boolean, installedAppId = '') => {
+  return getAction('post', isInstalledApp)(getUrl(`chat-messages/${taskId}/stop`, isInstalledApp, installedAppId))
+}
+
+export const sendCompletionMessage = async (body: Record<string, any>, { onData, onCompleted, onError, onMessageReplace }: {
+  onData: IOnData
+  onCompleted: IOnCompleted
+  onError: IOnError
+  onMessageReplace: IOnMessageReplace
+}, isInstalledApp: boolean, installedAppId = '') => {
+  return ssePost(getUrl('completion-messages', isInstalledApp, installedAppId), {
+    body: {
+      ...body,
+      response_mode: 'streaming',
+    },
+  }, { onData, onCompleted, isPublicAPI: !isInstalledApp, onError, onMessageReplace })
+}
+
+export const sendWorkflowMessage = async (
+  body: Record<string, any>,
+  {
+    onWorkflowStarted,
+    onNodeStarted,
+    onNodeFinished,
+    onWorkflowFinished,
+    onIterationStart,
+    onIterationNext,
+    onIterationFinish,
+    onLoopStart,
+    onLoopNext,
+    onLoopFinish,
+    onTextChunk,
+    onTextReplace,
+  }: {
+    onWorkflowStarted: IOnWorkflowStarted
+    onNodeStarted: IOnNodeStarted
+    onNodeFinished: IOnNodeFinished
+    onWorkflowFinished: IOnWorkflowFinished
+    onIterationStart: IOnIterationStarted
+    onIterationNext: IOnIterationNext
+    onIterationFinish: IOnIterationFinished
+    onLoopStart: IOnLoopStarted
+    onLoopNext: IOnLoopNext
+    onLoopFinish: IOnLoopFinished
+    onTextChunk: IOnTextChunk
+    onTextReplace: IOnTextReplace
+  },
+  isInstalledApp: boolean,
+  installedAppId = '',
+) => {
+  return ssePost(getUrl('workflows/run', isInstalledApp, installedAppId), {
+    body: {
+      ...body,
+      response_mode: 'streaming',
+    },
+  }, {
+    onNodeStarted,
+    onWorkflowStarted,
+    onWorkflowFinished,
+    isPublicAPI: !isInstalledApp,
+    onNodeFinished,
+    onIterationStart,
+    onIterationNext,
+    onIterationFinish,
+    onLoopStart,
+    onLoopNext,
+    onLoopFinish,
+    onTextChunk,
+    onTextReplace,
+  })
+}
+
+export const fetchAppInfo = async () => {
+  return get('/site') as Promise<AppData>
+}
+
+export const fetchConversations = async (isInstalledApp: boolean, installedAppId = '', last_id?: string, pinned?: boolean, limit?: number) => {
+  return getAction('get', isInstalledApp)(getUrl('conversations', isInstalledApp, installedAppId), { params: { ...{ limit: limit || 20 }, ...(last_id ? { last_id } : {}), ...(pinned !== undefined ? { pinned } : {}) } }) as Promise<AppConversationData>
+}
+
+export const pinConversation = async (isInstalledApp: boolean, installedAppId = '', id: string) => {
+  return getAction('patch', isInstalledApp)(getUrl(`conversations/${id}/pin`, isInstalledApp, installedAppId))
+}
+
+export const unpinConversation = async (isInstalledApp: boolean, installedAppId = '', id: string) => {
+  return getAction('patch', isInstalledApp)(getUrl(`conversations/${id}/unpin`, isInstalledApp, installedAppId))
+}
+
+export const delConversation = async (isInstalledApp: boolean, installedAppId = '', id: string) => {
+  return getAction('del', isInstalledApp)(getUrl(`conversations/${id}`, isInstalledApp, installedAppId))
+}
+
+export const renameConversation = async (isInstalledApp: boolean, installedAppId = '', id: string, name: string) => {
+  return getAction('post', isInstalledApp)(getUrl(`conversations/${id}/name`, isInstalledApp, installedAppId), { body: { name } })
+}
+
+export const generationConversationName = async (isInstalledApp: boolean, installedAppId = '', id: string) => {
+  return getAction('post', isInstalledApp)(getUrl(`conversations/${id}/name`, isInstalledApp, installedAppId), { body: { auto_generate: true } }) as Promise<ConversationItem>
+}
+
+export const fetchChatList = async (conversationId: string, isInstalledApp: boolean, installedAppId = '') => {
+  return getAction('get', isInstalledApp)(getUrl('messages', isInstalledApp, installedAppId), { params: { conversation_id: conversationId, limit: 20, last_id: '' } }) as any
+}
+
+// Abandoned API interface
+// export const fetchAppVariables = async () => {
+//   return get(`variables`)
+// }
+
+// init value. wait for server update
+export const fetchAppParams = async (isInstalledApp: boolean, installedAppId = '') => {
+  return (getAction('get', isInstalledApp))(getUrl('parameters', isInstalledApp, installedAppId)) as Promise<ChatConfig>
+}
+
+export const fetchSystemFeatures = async () => {
+  return (getAction('get', false))(getUrl('system-features', false, '')) as Promise<SystemFeatures>
+}
+
+export const fetchWebSAMLSSOUrl = async (appCode: string, redirectUrl: string) => {
+  return (getAction('get', false))(getUrl('/enterprise/sso/saml/login', false, ''), {
+    params: {
+      app_code: appCode,
+      redirect_url: redirectUrl,
+    },
+  }) as Promise<{ url: string }>
+}
+
+export const fetchWebOIDCSSOUrl = async (appCode: string, redirectUrl: string) => {
+  return (getAction('get', false))(getUrl('/enterprise/sso/oidc/login', false, ''), {
+    params: {
+      app_code: appCode,
+      redirect_url: redirectUrl,
+    },
+
+  }) as Promise<{ url: string }>
+}
+
+export const fetchWebOAuth2SSOUrl = async (appCode: string, redirectUrl: string) => {
+  return (getAction('get', false))(getUrl('/enterprise/sso/oauth2/login', false, ''), {
+    params: {
+      app_code: appCode,
+      redirect_url: redirectUrl,
+    },
+  }) as Promise<{ url: string }>
+}
+
+export const fetchAppMeta = async (isInstalledApp: boolean, installedAppId = '') => {
+  return (getAction('get', isInstalledApp))(getUrl('meta', isInstalledApp, installedAppId)) as Promise<AppMeta>
+}
+
+export const updateFeedback = async ({ url, body }: { url: string; body: FeedbackType }, isInstalledApp: boolean, installedAppId = '') => {
+  return (getAction('post', isInstalledApp))(getUrl(url, isInstalledApp, installedAppId), { body })
+}
+
+export const fetchMoreLikeThis = async (messageId: string, isInstalledApp: boolean, installedAppId = '') => {
+  return (getAction('get', isInstalledApp))(getUrl(`/messages/${messageId}/more-like-this`, isInstalledApp, installedAppId), {
+    params: {
+      response_mode: 'blocking',
+    },
+  })
+}
+
+export const saveMessage = (messageId: string, isInstalledApp: boolean, installedAppId = '') => {
+  return (getAction('post', isInstalledApp))(getUrl('/saved-messages', isInstalledApp, installedAppId), { body: { message_id: messageId } })
+}
+
+export const fetchSavedMessage = async (isInstalledApp: boolean, installedAppId = '') => {
+  return (getAction('get', isInstalledApp))(getUrl('/saved-messages', isInstalledApp, installedAppId))
+}
+
+export const removeMessage = (messageId: string, isInstalledApp: boolean, installedAppId = '') => {
+  return (getAction('del', isInstalledApp))(getUrl(`/saved-messages/${messageId}`, isInstalledApp, installedAppId))
+}
+
+export const fetchSuggestedQuestions = (messageId: string, isInstalledApp: boolean, installedAppId = '') => {
+  return (getAction('get', isInstalledApp))(getUrl(`/messages/${messageId}/suggested-questions`, isInstalledApp, installedAppId))
+}
+
+export const audioToText = (url: string, isPublicAPI: boolean, body: FormData) => {
+  return (getAction('post', !isPublicAPI))(url, { body }, { bodyStringify: false, deleteContentType: true }) as Promise<{ text: string }>
+}
+
+export const textToAudio = (url: string, isPublicAPI: boolean, body: FormData) => {
+  return (getAction('post', !isPublicAPI))(url, { body }, { bodyStringify: false, deleteContentType: true }) as Promise<{ data: string }>
+}
+
+export const textToAudioStream = (url: string, isPublicAPI: boolean, header: { content_type: string }, body: { streaming: boolean; voice?: string; message_id?: string; text?: string | null | undefined }) => {
+  return (getAction('post', !isPublicAPI))(url, { body, header }, { needAllResponseContent: true })
+}
+
+export const fetchAccessToken = async (appCode: string, userId?: string) => {
+  const headers = new Headers()
+  headers.append('X-App-Code', appCode)
+  const url = userId ? `/passport?user_id=${encodeURIComponent(userId)}` : '/passport'
+  return get(url, { headers }) as Promise<{ access_token: string }>
+}
diff --git a/service/sso.ts b/service/sso.ts
new file mode 100644
index 0000000..eb22799
--- /dev/null
+++ b/service/sso.ts
@@ -0,0 +1,16 @@
+import { get } from './base'
+
+export const getUserSAMLSSOUrl = (invite_token?: string) => {
+  const url = invite_token ? `/enterprise/sso/saml/login?invite_token=${invite_token}` : '/enterprise/sso/saml/login'
+  return get<{ url: string }>(url)
+}
+
+export const getUserOIDCSSOUrl = (invite_token?: string) => {
+  const url = invite_token ? `/enterprise/sso/oidc/login?invite_token=${invite_token}` : '/enterprise/sso/oidc/login'
+  return get<{ url: string; state: string }>(url)
+}
+
+export const getUserOAuth2SSOUrl = (invite_token?: string) => {
+  const url = invite_token ? `/enterprise/sso/oauth2/login?invite_token=${invite_token}` : '/enterprise/sso/oauth2/login'
+  return get<{ url: string; state: string }>(url)
+}
diff --git a/service/strategy.ts b/service/strategy.ts
new file mode 100644
index 0000000..bb032ba
--- /dev/null
+++ b/service/strategy.ts
@@ -0,0 +1,10 @@
+import type { StrategyPluginDetail } from '@/app/components/plugins/types'
+import { get } from './base'
+
+export const fetchStrategyList = () => {
+  return get<StrategyPluginDetail[]>('/workspaces/current/agent-providers')
+}
+
+export const fetchStrategyDetail = (agentProvider: string) => {
+  return get<StrategyPluginDetail>(`/workspaces/current/agent-provider/${agentProvider}`)
+}
diff --git a/service/tag.ts b/service/tag.ts
new file mode 100644
index 0000000..99cfe07
--- /dev/null
+++ b/service/tag.ts
@@ -0,0 +1,47 @@
+import { del, get, patch, post } from './base'
+import type { Tag } from '@/app/components/base/tag-management/constant'
+
+export const fetchTagList = (type: string) => {
+  return get<Tag[]>('/tags', { params: { type } })
+}
+
+export const createTag = (name: string, type: string) => {
+  return post<Tag>('/tags', {
+    body: {
+      name,
+      type,
+    },
+  })
+}
+
+export const updateTag = (tagID: string, name: string) => {
+  return patch(`/tags/${tagID}`, {
+    body: {
+      name,
+    },
+  })
+}
+
+export const deleteTag = (tagID: string) => {
+  return del(`/tags/${tagID}`)
+}
+
+export const bindTag = (tagIDList: string[], targetID: string, type: string) => {
+  return post('/tag-bindings/create', {
+    body: {
+      tag_ids: tagIDList,
+      target_id: targetID,
+      type,
+    },
+  })
+}
+
+export const unBindTag = (tagID: string, targetID: string, type: string) => {
+  return post('/tag-bindings/remove', {
+    body: {
+      tag_id: tagID,
+      target_id: targetID,
+      type,
+    },
+  })
+}
diff --git a/service/tools.ts b/service/tools.ts
new file mode 100644
index 0000000..38dcf38
--- /dev/null
+++ b/service/tools.ts
@@ -0,0 +1,160 @@
+import { get, post } from './base'
+import type {
+  Collection,
+  CustomCollectionBackend,
+  CustomParamSchema,
+  Tool,
+  ToolCredential,
+  WorkflowToolProviderRequest,
+  WorkflowToolProviderResponse,
+} from '@/app/components/tools/types'
+import type { ToolWithProvider } from '@/app/components/workflow/types'
+import type { Label } from '@/app/components/tools/labels/constant'
+import { buildProviderQuery } from './_tools_util'
+
+export const fetchCollectionList = () => {
+  return get<Collection[]>('/workspaces/current/tool-providers')
+}
+
+export const fetchCollectionDetail = (collectionName: string) => {
+  return get<Collection>(`/workspaces/current/tool-provider/${collectionName}/info`)
+}
+
+export const fetchBuiltInToolList = (collectionName: string) => {
+  return get<Tool[]>(`/workspaces/current/tool-provider/builtin/${collectionName}/tools`)
+}
+
+export const fetchCustomToolList = (collectionName: string) => {
+  const query = buildProviderQuery(collectionName)
+  return get<Tool[]>(`/workspaces/current/tool-provider/api/tools?${query}`)
+}
+
+export const fetchModelToolList = (collectionName: string) => {
+  const query = buildProviderQuery(collectionName)
+  return get<Tool[]>(`/workspaces/current/tool-provider/model/tools?${query}`)
+}
+
+export const fetchWorkflowToolList = (appID: string) => {
+  return get<Tool[]>(`/workspaces/current/tool-provider/workflow/tools?workflow_tool_id=${appID}`)
+}
+
+export const fetchBuiltInToolCredentialSchema = (collectionName: string) => {
+  return get<ToolCredential[]>(`/workspaces/current/tool-provider/builtin/${collectionName}/credentials_schema`)
+}
+
+export const fetchBuiltInToolCredential = (collectionName: string) => {
+  return get<ToolCredential[]>(`/workspaces/current/tool-provider/builtin/${collectionName}/credentials`)
+}
+export const updateBuiltInToolCredential = (collectionName: string, credential: Record<string, any>) => {
+  return post(`/workspaces/current/tool-provider/builtin/${collectionName}/update`, {
+    body: {
+      credentials: credential,
+    },
+  })
+}
+
+export const removeBuiltInToolCredential = (collectionName: string) => {
+  return post(`/workspaces/current/tool-provider/builtin/${collectionName}/delete`, {
+    body: {},
+  })
+}
+
+export const parseParamsSchema = (schema: string) => {
+  return post<{ parameters_schema: CustomParamSchema[]; schema_type: string }>('/workspaces/current/tool-provider/api/schema', {
+    body: {
+      schema,
+    },
+  })
+}
+
+export const fetchCustomCollection = (collectionName: string) => {
+  const query = buildProviderQuery(collectionName)
+  return get<CustomCollectionBackend>(`/workspaces/current/tool-provider/api/get?${query}`)
+}
+
+export const createCustomCollection = (collection: CustomCollectionBackend) => {
+  return post('/workspaces/current/tool-provider/api/add', {
+    body: {
+      ...collection,
+    },
+  })
+}
+
+export const updateCustomCollection = (collection: CustomCollectionBackend) => {
+  return post('/workspaces/current/tool-provider/api/update', {
+    body: {
+      ...collection,
+    },
+  })
+}
+
+export const removeCustomCollection = (collectionName: string) => {
+  return post('/workspaces/current/tool-provider/api/delete', {
+    body: {
+      provider: collectionName,
+    },
+  })
+}
+
+export const importSchemaFromURL = (url: string) => {
+  return get('/workspaces/current/tool-provider/api/remote', {
+    params: {
+      url,
+    },
+  })
+}
+
+export const testAPIAvailable = (payload: any) => {
+  return post('/workspaces/current/tool-provider/api/test/pre', {
+    body: {
+      ...payload,
+    },
+  })
+}
+
+export const fetchAllBuiltInTools = () => {
+  return get<ToolWithProvider[]>('/workspaces/current/tools/builtin')
+}
+
+export const fetchAllCustomTools = () => {
+  return get<ToolWithProvider[]>('/workspaces/current/tools/api')
+}
+
+export const fetchAllWorkflowTools = () => {
+  return get<ToolWithProvider[]>('/workspaces/current/tools/workflow')
+}
+
+export const fetchLabelList = () => {
+  return get<Label[]>('/workspaces/current/tool-labels')
+}
+
+export const createWorkflowToolProvider = (payload: WorkflowToolProviderRequest & { workflow_app_id: string }) => {
+  return post('/workspaces/current/tool-provider/workflow/create', {
+    body: { ...payload },
+  })
+}
+
+export const saveWorkflowToolProvider = (payload: WorkflowToolProviderRequest & Partial<{
+  workflow_app_id: string
+  workflow_tool_id: string
+}>) => {
+  return post('/workspaces/current/tool-provider/workflow/update', {
+    body: { ...payload },
+  })
+}
+
+export const fetchWorkflowToolDetailByAppID = (appID: string) => {
+  return get<WorkflowToolProviderResponse>(`/workspaces/current/tool-provider/workflow/get?workflow_app_id=${appID}`)
+}
+
+export const fetchWorkflowToolDetail = (toolID: string) => {
+  return get<WorkflowToolProviderResponse>(`/workspaces/current/tool-provider/workflow/get?workflow_tool_id=${toolID}`)
+}
+
+export const deleteWorkflowTool = (toolID: string) => {
+  return post('/workspaces/current/tool-provider/workflow/delete', {
+    body: {
+      workflow_tool_id: toolID,
+    },
+  })
+}
diff --git a/service/use-apps.ts b/service/use-apps.ts
new file mode 100644
index 0000000..1a3e9ce
--- /dev/null
+++ b/service/use-apps.ts
@@ -0,0 +1,27 @@
+import { get } from './base'
+import type { App } from '@/types/app'
+import type { AppListResponse } from '@/models/app'
+import { useInvalid } from './use-base'
+import { useQuery } from '@tanstack/react-query'
+
+const NAME_SPACE = 'apps'
+
+// TODO paging for list
+const useAppFullListKey = [NAME_SPACE, 'full-list']
+export const useAppFullList = () => {
+  return useQuery<AppListResponse>({
+    queryKey: useAppFullListKey,
+    queryFn: () => get<AppListResponse>('/apps', { params: { page: 1, limit: 100 } }),
+  })
+}
+
+export const useInvalidateAppFullList = () => {
+  return useInvalid(useAppFullListKey)
+}
+
+export const useAppDetail = (appID: string) => {
+  return useQuery<App>({
+    queryKey: [NAME_SPACE, 'detail', appID],
+    queryFn: () => get<App>(`/apps/${appID}`),
+  })
+}
diff --git a/service/use-base.ts b/service/use-base.ts
new file mode 100644
index 0000000..37af55a
--- /dev/null
+++ b/service/use-base.ts
@@ -0,0 +1,26 @@
+import {
+  type QueryKey,
+  useQueryClient,
+} from '@tanstack/react-query'
+
+export const useInvalid = (key: QueryKey) => {
+  const queryClient = useQueryClient()
+  return () => {
+    queryClient.invalidateQueries(
+      {
+        queryKey: key,
+      },
+    )
+  }
+}
+
+export const useReset = (key: QueryKey) => {
+  const queryClient = useQueryClient()
+  return () => {
+    queryClient.resetQueries(
+      {
+        queryKey: key,
+      },
+    )
+  }
+}
diff --git a/service/use-common.ts b/service/use-common.ts
new file mode 100644
index 0000000..d49f380
--- /dev/null
+++ b/service/use-common.ts
@@ -0,0 +1,28 @@
+import { get, post } from './base'
+import type {
+  FileUploadConfigResponse,
+  StructuredOutputRulesRequestBody,
+  StructuredOutputRulesResponse,
+} from '@/models/common'
+import { useMutation, useQuery } from '@tanstack/react-query'
+
+const NAME_SPACE = 'common'
+
+export const useFileUploadConfig = () => {
+  return useQuery<FileUploadConfigResponse>({
+    queryKey: [NAME_SPACE, 'file-upload-config'],
+    queryFn: () => get<FileUploadConfigResponse>('/files/upload'),
+  })
+}
+
+export const useGenerateStructuredOutputRules = () => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'generate-structured-output-rules'],
+    mutationFn: (body: StructuredOutputRulesRequestBody) => {
+      return post<StructuredOutputRulesResponse>(
+        '/rule-structured-output-generate',
+        { body },
+      )
+    },
+  })
+}
diff --git a/service/use-education.ts b/service/use-education.ts
new file mode 100644
index 0000000..4405db7
--- /dev/null
+++ b/service/use-education.ts
@@ -0,0 +1,67 @@
+import { get, post } from './base'
+import {
+  useMutation,
+  useQuery,
+} from '@tanstack/react-query'
+import { useInvalid } from './use-base'
+import type { EducationAddParams } from '@/app/education-apply/types'
+
+const NAME_SPACE = 'education'
+
+export const useEducationVerify = () => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'education-verify'],
+    mutationFn: () => {
+      return get<{ token: string }>('/account/education/verify', {}, { silent: true })
+    },
+  })
+}
+
+export const useEducationAdd = ({
+  onSuccess,
+}: {
+  onSuccess?: () => void
+}) => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'education-add'],
+    mutationFn: (params: EducationAddParams) => {
+      return post<{ message: string }>('/account/education', {
+        body: params,
+      })
+    },
+    onSuccess,
+  })
+}
+
+type SearchParams = {
+  keywords?: string
+  page?: number
+  limit?: number
+}
+export const useEducationAutocomplete = () => {
+  return useMutation({
+    mutationFn: (searchParams: SearchParams) => {
+      const {
+        keywords = '',
+        page = 0,
+        limit = 40,
+      } = searchParams
+      return get<{ data: string[]; has_next: boolean; curr_page: number }>(`/account/education/autocomplete?keywords=${keywords}&page=${page}&limit=${limit}`)
+    },
+  })
+}
+
+export const useEducationStatus = (disable?: boolean) => {
+  return useQuery({
+    enabled: !disable,
+    queryKey: [NAME_SPACE, 'education-status'],
+    queryFn: () => {
+      return get<{ result: boolean }>('/account/education')
+    },
+    retry: false,
+  })
+}
+
+export const useInvalidateEducationStatus = () => {
+  return useInvalid([NAME_SPACE, 'education-status'])
+}
diff --git a/service/use-endpoints.ts b/service/use-endpoints.ts
new file mode 100644
index 0000000..43a8248
--- /dev/null
+++ b/service/use-endpoints.ts
@@ -0,0 +1,149 @@
+import { get, post } from './base'
+import type {
+  EndpointsResponse,
+} from '@/app/components/plugins/types'
+import {
+  useMutation,
+  useQuery,
+  useQueryClient,
+} from '@tanstack/react-query'
+
+const NAME_SPACE = 'endpoints'
+
+export const useEndpointList = (pluginID: string) => {
+  return useQuery({
+    queryKey: [NAME_SPACE, 'list', pluginID],
+    queryFn: () => get<EndpointsResponse>('/workspaces/current/endpoints/list/plugin', {
+      params: {
+        plugin_id: pluginID,
+        page: 1,
+        page_size: 100,
+      },
+    }),
+  })
+}
+
+export const useInvalidateEndpointList = () => {
+  const queryClient = useQueryClient()
+  return (pluginID: string) => {
+    queryClient.invalidateQueries(
+      {
+        queryKey: [NAME_SPACE, 'list', pluginID],
+      })
+  }
+}
+
+export const useCreateEndpoint = ({
+  onSuccess,
+  onError,
+}: {
+  onSuccess?: () => void
+  onError?: (error: any) => void
+}) => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'create'],
+    mutationFn: (payload: { pluginUniqueID: string, state: Record<string, any> }) => {
+      const { pluginUniqueID, state } = payload
+      const newName = state.name
+      delete state.name
+      return post('/workspaces/current/endpoints/create', {
+        body: {
+          plugin_unique_identifier: pluginUniqueID,
+          settings: state,
+          name: newName,
+        },
+      })
+    },
+    onSuccess,
+    onError,
+  })
+}
+
+export const useUpdateEndpoint = ({
+  onSuccess,
+  onError,
+}: {
+  onSuccess?: () => void
+  onError?: (error: any) => void
+}) => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'update'],
+    mutationFn: (payload: { endpointID: string, state: Record<string, any> }) => {
+      const { endpointID, state } = payload
+      const newName = state.name
+      delete state.name
+      return post('/workspaces/current/endpoints/update', {
+        body: {
+          endpoint_id: endpointID,
+          settings: state,
+          name: newName,
+        },
+      })
+    },
+    onSuccess,
+    onError,
+  })
+}
+
+export const useDeleteEndpoint = ({
+  onSuccess,
+  onError,
+}: {
+  onSuccess?: () => void
+  onError?: (error: any) => void
+}) => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'delete'],
+    mutationFn: (endpointID: string) => {
+      return post('/workspaces/current/endpoints/delete', {
+        body: {
+          endpoint_id: endpointID,
+        },
+      })
+    },
+    onSuccess,
+    onError,
+  })
+}
+
+export const useEnableEndpoint = ({
+  onSuccess,
+  onError,
+}: {
+  onSuccess?: () => void
+  onError?: (error: any) => void
+}) => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'enable'],
+    mutationFn: (endpointID: string) => {
+      return post('/workspaces/current/endpoints/enable', {
+        body: {
+          endpoint_id: endpointID,
+        },
+      })
+    },
+    onSuccess,
+    onError,
+  })
+}
+
+export const useDisableEndpoint = ({
+  onSuccess,
+  onError,
+}: {
+  onSuccess?: () => void
+  onError?: (error: any) => void
+}) => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'disable'],
+    mutationFn: (endpointID: string) => {
+      return post('/workspaces/current/endpoints/disable', {
+        body: {
+          endpoint_id: endpointID,
+        },
+      })
+    },
+    onSuccess,
+    onError,
+  })
+}
diff --git a/service/use-models.ts b/service/use-models.ts
new file mode 100644
index 0000000..84122cd
--- /dev/null
+++ b/service/use-models.ts
@@ -0,0 +1,17 @@
+import { get } from './base'
+import type {
+  ModelItem,
+} from '@/app/components/header/account-setting/model-provider-page/declarations'
+import {
+  useQuery,
+  // useQueryClient,
+} from '@tanstack/react-query'
+
+const NAME_SPACE = 'models'
+
+export const useModelProviderModelList = (provider: string) => {
+  return useQuery({
+    queryKey: [NAME_SPACE, 'model-list', provider],
+    queryFn: () => get<{ data: ModelItem[] }>(`/workspaces/current/model-providers/${provider}/models`),
+  })
+}
diff --git a/service/use-plugins.ts b/service/use-plugins.ts
new file mode 100644
index 0000000..13a494b
--- /dev/null
+++ b/service/use-plugins.ts
@@ -0,0 +1,529 @@
+import { useCallback, useEffect } from 'react'
+import type {
+  ModelProvider,
+} from '@/app/components/header/account-setting/model-provider-page/declarations'
+import { fetchModelProviderModelList } from '@/service/common'
+import { fetchPluginInfoFromMarketPlace } from '@/service/plugins'
+import type {
+  DebugInfo as DebugInfoTypes,
+  Dependency,
+  GitHubItemAndMarketPlaceDependency,
+  InstallPackageResponse,
+  InstalledLatestVersionResponse,
+  InstalledPluginListResponse,
+  PackageDependency,
+  Permissions,
+  Plugin,
+  PluginDeclaration,
+  PluginDetail,
+  PluginInfoFromMarketPlace,
+  PluginTask,
+  PluginType,
+  PluginsFromMarketplaceByInfoResponse,
+  PluginsFromMarketplaceResponse,
+  VersionInfo,
+  VersionListResponse,
+  uploadGitHubResponse,
+} from '@/app/components/plugins/types'
+import { TaskStatus } from '@/app/components/plugins/types'
+import { PluginType as PluginTypeEnum } from '@/app/components/plugins/types'
+import type {
+  PluginsSearchParams,
+} from '@/app/components/plugins/marketplace/types'
+import { get, getMarketplace, post, postMarketplace } from './base'
+import type { MutateOptions, QueryOptions } from '@tanstack/react-query'
+import {
+  useMutation,
+  useQuery,
+  useQueryClient,
+} from '@tanstack/react-query'
+import { useInvalidateAllBuiltInTools } from './use-tools'
+import usePermission from '@/app/components/plugins/plugin-page/use-permission'
+import { uninstallPlugin } from '@/service/plugins'
+import useRefreshPluginList from '@/app/components/plugins/install-plugin/hooks/use-refresh-plugin-list'
+import { cloneDeep } from 'lodash-es'
+
+const NAME_SPACE = 'plugins'
+
+const useInstalledPluginListKey = [NAME_SPACE, 'installedPluginList']
+export const useCheckInstalled = ({
+  pluginIds,
+  enabled,
+}: {
+  pluginIds: string[],
+  enabled: boolean
+}) => {
+  return useQuery<{ plugins: PluginDetail[] }>({
+    queryKey: [NAME_SPACE, 'checkInstalled', pluginIds],
+    queryFn: () => post<{ plugins: PluginDetail[] }>('/workspaces/current/plugin/list/installations/ids', {
+      body: {
+        plugin_ids: pluginIds,
+      },
+    }),
+    enabled,
+    staleTime: 0, // always fresh
+  })
+}
+
+export const useInstalledPluginList = (disable?: boolean) => {
+  return useQuery<InstalledPluginListResponse>({
+    queryKey: useInstalledPluginListKey,
+    queryFn: () => get<InstalledPluginListResponse>('/workspaces/current/plugin/list'),
+    enabled: !disable,
+    initialData: !disable ? undefined : { plugins: [] },
+  })
+}
+
+export const useInstalledLatestVersion = (pluginIds: string[]) => {
+  return useQuery<InstalledLatestVersionResponse>({
+    queryKey: [NAME_SPACE, 'installedLatestVersion', pluginIds],
+    queryFn: () => post<InstalledLatestVersionResponse>('/workspaces/current/plugin/list/latest-versions', {
+      body: {
+        plugin_ids: pluginIds,
+      },
+    }),
+    enabled: !!pluginIds.length,
+    initialData: pluginIds.length ? undefined : { versions: {} },
+  })
+}
+
+export const useInvalidateInstalledPluginList = () => {
+  const queryClient = useQueryClient()
+  const invalidateAllBuiltInTools = useInvalidateAllBuiltInTools()
+  return () => {
+    queryClient.invalidateQueries(
+      {
+        queryKey: useInstalledPluginListKey,
+      })
+    invalidateAllBuiltInTools()
+  }
+}
+
+export const useInstallPackageFromMarketPlace = (options?: MutateOptions<InstallPackageResponse, Error, string>) => {
+  return useMutation({
+    ...options,
+    mutationFn: (uniqueIdentifier: string) => {
+      return post<InstallPackageResponse>('/workspaces/current/plugin/install/marketplace', { body: { plugin_unique_identifiers: [uniqueIdentifier] } })
+    },
+  })
+}
+
+export const useUpdatePackageFromMarketPlace = (options?: MutateOptions<InstallPackageResponse, Error, object>) => {
+  return useMutation({
+    ...options,
+    mutationFn: (body: object) => {
+      return post<InstallPackageResponse>('/workspaces/current/plugin/upgrade/marketplace', {
+        body,
+      })
+    },
+  })
+}
+
+export const usePluginDeclarationFromMarketPlace = (pluginUniqueIdentifier: string) => {
+  return useQuery({
+    queryKey: [NAME_SPACE, 'pluginDeclaration', pluginUniqueIdentifier],
+    queryFn: () => get<{ manifest: PluginDeclaration }>('/workspaces/current/plugin/marketplace/pkg', { params: { plugin_unique_identifier: pluginUniqueIdentifier } }),
+    enabled: !!pluginUniqueIdentifier,
+  })
+}
+
+export const useVersionListOfPlugin = (pluginID: string) => {
+  return useQuery<{ data: VersionListResponse }>({
+    enabled: !!pluginID,
+    queryKey: [NAME_SPACE, 'versions', pluginID],
+    queryFn: () => getMarketplace<{ data: VersionListResponse }>(`/plugins/${pluginID}/versions`, { params: { page: 1, page_size: 100 } }),
+  })
+}
+export const useInvalidateVersionListOfPlugin = () => {
+  const queryClient = useQueryClient()
+  return (pluginID: string) => {
+    queryClient.invalidateQueries({ queryKey: [NAME_SPACE, 'versions', pluginID] })
+  }
+}
+
+export const useInstallPackageFromLocal = () => {
+  return useMutation({
+    mutationFn: (uniqueIdentifier: string) => {
+      return post<InstallPackageResponse>('/workspaces/current/plugin/install/pkg', {
+        body: { plugin_unique_identifiers: [uniqueIdentifier] },
+      })
+    },
+  })
+}
+
+export const useInstallPackageFromGitHub = () => {
+  return useMutation({
+    mutationFn: ({ repoUrl, selectedVersion, selectedPackage, uniqueIdentifier }: {
+      repoUrl: string
+      selectedVersion: string
+      selectedPackage: string
+      uniqueIdentifier: string
+    }) => {
+      return post<InstallPackageResponse>('/workspaces/current/plugin/install/github', {
+        body: {
+          repo: repoUrl,
+          version: selectedVersion,
+          package: selectedPackage,
+          plugin_unique_identifier: uniqueIdentifier,
+        },
+      })
+    },
+  })
+}
+
+export const useUploadGitHub = (payload: {
+  repo: string
+  version: string
+  package: string
+}) => {
+  return useQuery({
+    queryKey: [NAME_SPACE, 'uploadGitHub', payload],
+    queryFn: () => post<uploadGitHubResponse>('/workspaces/current/plugin/upload/github', {
+      body: payload,
+    }),
+    retry: 0,
+  })
+}
+
+export const useInstallOrUpdate = ({
+  onSuccess,
+}: {
+  onSuccess?: (res: { success: boolean }[]) => void
+}) => {
+  const { mutateAsync: updatePackageFromMarketPlace } = useUpdatePackageFromMarketPlace()
+
+  return useMutation({
+    mutationFn: (data: {
+      payload: Dependency[],
+      plugin: Plugin[],
+      installedInfo: Record<string, VersionInfo>
+    }) => {
+      const { payload, plugin, installedInfo } = data
+
+      return Promise.all(payload.map(async (item, i) => {
+        try {
+          const orgAndName = `${plugin[i]?.org || plugin[i]?.author}/${plugin[i]?.name}`
+          const installedPayload = installedInfo[orgAndName]
+          const isInstalled = !!installedPayload
+          let uniqueIdentifier = ''
+
+          if (item.type === 'github') {
+            const data = item as GitHubItemAndMarketPlaceDependency
+            // From local bundle don't have data.value.github_plugin_unique_identifier
+            uniqueIdentifier = data.value.github_plugin_unique_identifier!
+            if (!uniqueIdentifier) {
+              const { unique_identifier } = await post<uploadGitHubResponse>('/workspaces/current/plugin/upload/github', {
+                body: {
+                  repo: data.value.repo!,
+                  version: data.value.release! || data.value.version!,
+                  package: data.value.packages! || data.value.package!,
+                },
+              })
+              uniqueIdentifier = data.value.github_plugin_unique_identifier! || unique_identifier
+              // has the same version, but not installed
+              if (uniqueIdentifier === installedPayload?.uniqueIdentifier) {
+                return {
+                  success: true,
+                }
+              }
+            }
+            if (!isInstalled) {
+              await post<InstallPackageResponse>('/workspaces/current/plugin/install/github', {
+                body: {
+                  repo: data.value.repo!,
+                  version: data.value.release! || data.value.version!,
+                  package: data.value.packages! || data.value.package!,
+                  plugin_unique_identifier: uniqueIdentifier,
+                },
+              })
+            }
+          }
+          if (item.type === 'marketplace') {
+            const data = item as GitHubItemAndMarketPlaceDependency
+            uniqueIdentifier = data.value.marketplace_plugin_unique_identifier! || plugin[i]?.plugin_id
+            if (uniqueIdentifier === installedPayload?.uniqueIdentifier) {
+              return {
+                success: true,
+              }
+            }
+            if (!isInstalled) {
+              await post<InstallPackageResponse>('/workspaces/current/plugin/install/marketplace', {
+                body: {
+                  plugin_unique_identifiers: [uniqueIdentifier],
+                },
+              })
+            }
+          }
+          if (item.type === 'package') {
+            const data = item as PackageDependency
+            uniqueIdentifier = data.value.unique_identifier
+            if (uniqueIdentifier === installedPayload?.uniqueIdentifier) {
+              return {
+                success: true,
+              }
+            }
+            if (!isInstalled) {
+              await post<InstallPackageResponse>('/workspaces/current/plugin/install/pkg', {
+                body: {
+                  plugin_unique_identifiers: [uniqueIdentifier],
+                },
+              })
+            }
+          }
+          if (isInstalled) {
+            if (item.type === 'package') {
+              await uninstallPlugin(installedPayload.installedId)
+              await post<InstallPackageResponse>('/workspaces/current/plugin/install/pkg', {
+                body: {
+                  plugin_unique_identifiers: [uniqueIdentifier],
+                },
+              })
+            }
+            else {
+              await updatePackageFromMarketPlace({
+                original_plugin_unique_identifier: installedPayload?.uniqueIdentifier,
+                new_plugin_unique_identifier: uniqueIdentifier,
+              })
+            }
+          }
+          return ({ success: true })
+        }
+        // eslint-disable-next-line unused-imports/no-unused-vars
+        catch (e) {
+          return Promise.resolve({ success: false })
+        }
+      }))
+    },
+    onSuccess,
+  })
+}
+
+export const useDebugKey = () => {
+  return useQuery({
+    queryKey: [NAME_SPACE, 'debugKey'],
+    queryFn: () => get<DebugInfoTypes>('/workspaces/current/plugin/debugging-key'),
+  })
+}
+
+const usePermissionsKey = [NAME_SPACE, 'permissions']
+export const usePermissions = () => {
+  return useQuery({
+    queryKey: usePermissionsKey,
+    queryFn: () => get<Permissions>('/workspaces/current/plugin/permission/fetch'),
+  })
+}
+
+export const useInvalidatePermissions = () => {
+  const queryClient = useQueryClient()
+  return () => {
+    queryClient.invalidateQueries(
+      {
+        queryKey: usePermissionsKey,
+      })
+  }
+}
+
+export const useMutationPermissions = ({
+  onSuccess,
+}: {
+  onSuccess?: () => void
+}) => {
+  return useMutation({
+    mutationFn: (payload: Permissions) => {
+      return post('/workspaces/current/plugin/permission/change', { body: payload })
+    },
+    onSuccess,
+  })
+}
+
+export const useMutationPluginsFromMarketplace = () => {
+  return useMutation({
+    mutationFn: (pluginsSearchParams: PluginsSearchParams) => {
+      const {
+        query,
+        sortBy,
+        sortOrder,
+        category,
+        tags,
+        exclude,
+        type,
+        page = 1,
+        pageSize = 40,
+      } = pluginsSearchParams
+      const pluginOrBundle = type === 'bundle' ? 'bundles' : 'plugins'
+      return postMarketplace<{ data: PluginsFromMarketplaceResponse }>(`/${pluginOrBundle}/search/advanced`, {
+        body: {
+          page,
+          page_size: pageSize,
+          query,
+          sort_by: sortBy,
+          sort_order: sortOrder,
+          category: category !== 'all' ? category : '',
+          tags,
+          exclude,
+          type,
+        },
+      })
+    },
+  })
+}
+
+export const useFetchPluginsInMarketPlaceByIds = (unique_identifiers: string[], options?: QueryOptions<{ data: PluginsFromMarketplaceResponse }>) => {
+  return useQuery({
+    ...options,
+    queryKey: [NAME_SPACE, 'fetchPluginsInMarketPlaceByIds', unique_identifiers],
+    queryFn: () => postMarketplace<{ data: PluginsFromMarketplaceResponse }>('/plugins/identifier/batch', {
+      body: {
+        unique_identifiers,
+      },
+    }),
+    enabled: unique_identifiers?.filter(i => !!i).length > 0,
+    retry: 0,
+  })
+}
+
+export const useFetchPluginsInMarketPlaceByInfo = (infos: Record<string, any>[]) => {
+  return useQuery({
+    queryKey: [NAME_SPACE, 'fetchPluginsInMarketPlaceByInfo', infos],
+    queryFn: () => postMarketplace<{ data: PluginsFromMarketplaceByInfoResponse }>('/plugins/versions/batch', {
+      body: {
+        plugin_tuples: infos.map(info => ({
+          org: info.organization,
+          name: info.plugin,
+          version: info.version,
+        })),
+      },
+    }),
+    enabled: infos?.filter(i => !!i).length > 0,
+    retry: 0,
+  })
+}
+
+const usePluginTaskListKey = [NAME_SPACE, 'pluginTaskList']
+export const usePluginTaskList = (category?: PluginType) => {
+  const {
+    canManagement,
+  } = usePermission()
+  const { refreshPluginList } = useRefreshPluginList()
+  const {
+    data,
+    isFetched,
+    isRefetching,
+    refetch,
+    ...rest
+  } = useQuery({
+    enabled: canManagement,
+    queryKey: usePluginTaskListKey,
+    queryFn: () => get<{ tasks: PluginTask[] }>('/workspaces/current/plugin/tasks?page=1&page_size=100'),
+    refetchInterval: (lastQuery) => {
+      const lastData = lastQuery.state.data
+      const taskDone = lastData?.tasks.every(task => task.status === TaskStatus.success || task.status === TaskStatus.failed)
+      return taskDone ? false : 5000
+    },
+  })
+
+  useEffect(() => {
+    // After first fetch, refresh plugin list each time all tasks are done
+    if (!isRefetching) {
+      const lastData = cloneDeep(data)
+      const taskDone = lastData?.tasks.every(task => task.status === TaskStatus.success || task.status === TaskStatus.failed)
+      const taskAllFailed = lastData?.tasks.every(task => task.status === TaskStatus.failed)
+      if (taskDone) {
+        if (lastData?.tasks.length && !taskAllFailed)
+          refreshPluginList(category ? { category } as any : undefined, !category)
+      }
+    }
+  // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [isRefetching])
+
+  const handleRefetch = useCallback(() => {
+    refetch()
+  }, [refetch])
+
+  return {
+    data,
+    pluginTasks: data?.tasks || [],
+    isFetched,
+    handleRefetch,
+    ...rest,
+  }
+}
+
+export const useMutationClearTaskPlugin = () => {
+  return useMutation({
+    mutationFn: ({ taskId, pluginId }: { taskId: string; pluginId: string }) => {
+      return post<{ success: boolean }>(`/workspaces/current/plugin/tasks/${taskId}/delete/${pluginId}`)
+    },
+  })
+}
+
+export const useMutationClearAllTaskPlugin = () => {
+  return useMutation({
+    mutationFn: () => {
+      return post<{ success: boolean }>('/workspaces/current/plugin/tasks/delete_all')
+    },
+  })
+}
+
+export const usePluginManifestInfo = (pluginUID: string) => {
+  return useQuery({
+    enabled: !!pluginUID,
+    queryKey: [[NAME_SPACE, 'manifest', pluginUID]],
+    queryFn: () => getMarketplace<{ data: { plugin: PluginInfoFromMarketPlace, version: { version: string } } }>(`/plugins/${pluginUID}`),
+    retry: 0,
+  })
+}
+
+export const useDownloadPlugin = (info: { organization: string; pluginName: string; version: string }, needDownload: boolean) => {
+  return useQuery({
+    queryKey: [NAME_SPACE, 'downloadPlugin', info],
+    queryFn: () => getMarketplace<Blob>(`/plugins/${info.organization}/${info.pluginName}/${info.version}/download`),
+    enabled: needDownload,
+    retry: 0,
+  })
+}
+
+export const useMutationCheckDependencies = () => {
+  return useMutation({
+    mutationFn: (appId: string) => {
+      return get<{ leaked_dependencies: Dependency[] }>(`/apps/imports/${appId}/check-dependencies`)
+    },
+  })
+}
+
+export const useModelInList = (currentProvider?: ModelProvider, modelId?: string) => {
+  return useQuery({
+    queryKey: ['modelInList', currentProvider?.provider, modelId],
+    queryFn: async () => {
+      if (!modelId || !currentProvider) return false
+      try {
+        const modelsData = await fetchModelProviderModelList(`/workspaces/current/model-providers/${currentProvider?.provider}/models`)
+        return !!modelId && !!modelsData.data.find(item => item.model === modelId)
+      }
+      catch {
+        return false
+      }
+    },
+    enabled: !!modelId && !!currentProvider,
+  })
+}
+
+export const usePluginInfo = (providerName?: string) => {
+  return useQuery({
+    queryKey: ['pluginInfo', providerName],
+    queryFn: async () => {
+      if (!providerName) return null
+      const parts = providerName.split('/')
+      const org = parts[0]
+      const name = parts[1]
+      try {
+        const response = await fetchPluginInfoFromMarketPlace({ org, name })
+        return response.data.plugin.category === PluginTypeEnum.model ? response.data.plugin : null
+      }
+      catch {
+        return null
+      }
+    },
+    enabled: !!providerName,
+  })
+}
diff --git a/service/use-strategy.ts b/service/use-strategy.ts
new file mode 100644
index 0000000..af591ac
--- /dev/null
+++ b/service/use-strategy.ts
@@ -0,0 +1,36 @@
+import type {
+  StrategyPluginDetail,
+} from '@/app/components/plugins/types'
+import { useInvalid } from './use-base'
+import type { QueryOptions } from '@tanstack/react-query'
+import {
+  useQuery,
+} from '@tanstack/react-query'
+import { fetchStrategyDetail, fetchStrategyList } from './strategy'
+
+const NAME_SPACE = 'agent_strategy'
+
+const useStrategyListKey = [NAME_SPACE, 'strategyList']
+export const useStrategyProviders = () => {
+  return useQuery<StrategyPluginDetail[]>({
+    queryKey: useStrategyListKey,
+    queryFn: fetchStrategyList,
+  })
+}
+
+export const useInvalidateStrategyProviders = () => {
+  return useInvalid(useStrategyListKey)
+}
+
+export const useStrategyProviderDetail = (agentProvider: string, options?: QueryOptions<StrategyPluginDetail>) => {
+  return useQuery<StrategyPluginDetail>({
+    ...options,
+    queryKey: [NAME_SPACE, 'detail', agentProvider],
+    queryFn: () => fetchStrategyDetail(agentProvider),
+    enabled: !!agentProvider,
+  })
+}
+
+export const useInvalidateStrategyProviderDetail = (agentProvider: string) => {
+  return useInvalid([NAME_SPACE, 'detail', agentProvider])
+}
diff --git a/service/use-tools.ts b/service/use-tools.ts
new file mode 100644
index 0000000..ceaa4b1
--- /dev/null
+++ b/service/use-tools.ts
@@ -0,0 +1,121 @@
+import { get, post } from './base'
+import type {
+  Collection,
+  Tool,
+} from '@/app/components/tools/types'
+import type { ToolWithProvider } from '@/app/components/workflow/types'
+import { useInvalid } from './use-base'
+import {
+  useMutation,
+  useQuery,
+  useQueryClient,
+} from '@tanstack/react-query'
+
+const NAME_SPACE = 'tools'
+
+const useAllToolProvidersKey = [NAME_SPACE, 'allToolProviders']
+export const useAllToolProviders = () => {
+  return useQuery<Collection[]>({
+    queryKey: useAllToolProvidersKey,
+    queryFn: () => get<Collection[]>('/workspaces/current/tool-providers'),
+  })
+}
+
+export const useInvalidateAllToolProviders = () => {
+  return useInvalid(useAllToolProvidersKey)
+}
+
+const useAllBuiltInToolsKey = [NAME_SPACE, 'builtIn']
+export const useAllBuiltInTools = () => {
+  return useQuery<ToolWithProvider[]>({
+    queryKey: useAllBuiltInToolsKey,
+    queryFn: () => get<ToolWithProvider[]>('/workspaces/current/tools/builtin'),
+  })
+}
+
+export const useInvalidateAllBuiltInTools = () => {
+  return useInvalid(useAllBuiltInToolsKey)
+}
+
+const useAllCustomToolsKey = [NAME_SPACE, 'customTools']
+export const useAllCustomTools = () => {
+  return useQuery<ToolWithProvider[]>({
+    queryKey: useAllCustomToolsKey,
+    queryFn: () => get<ToolWithProvider[]>('/workspaces/current/tools/api'),
+  })
+}
+
+export const useInvalidateAllCustomTools = () => {
+  return useInvalid(useAllCustomToolsKey)
+}
+
+const useAllWorkflowToolsKey = [NAME_SPACE, 'workflowTools']
+export const useAllWorkflowTools = () => {
+  return useQuery<ToolWithProvider[]>({
+    queryKey: useAllWorkflowToolsKey,
+    queryFn: () => get<ToolWithProvider[]>('/workspaces/current/tools/workflow'),
+  })
+}
+
+export const useInvalidateAllWorkflowTools = () => {
+  return useInvalid(useAllWorkflowToolsKey)
+}
+
+export const useBuiltinProviderInfo = (providerName: string) => {
+  return useQuery({
+    queryKey: [NAME_SPACE, 'builtin-provider-info', providerName],
+    queryFn: () => get<Collection>(`/workspaces/current/tool-provider/builtin/${providerName}/info`),
+  })
+}
+
+export const useInvalidateBuiltinProviderInfo = () => {
+  const queryClient = useQueryClient()
+  return (providerName: string) => {
+    queryClient.invalidateQueries(
+      {
+        queryKey: [NAME_SPACE, 'builtin-provider-info', providerName],
+      })
+  }
+}
+
+export const useBuiltinTools = (providerName: string) => {
+  return useQuery({
+    queryKey: [NAME_SPACE, 'builtin-provider-tools', providerName],
+    queryFn: () => get<Tool[]>(`/workspaces/current/tool-provider/builtin/${providerName}/tools`),
+  })
+}
+
+export const useUpdateProviderCredentials = ({
+  onSuccess,
+}: {
+  onSuccess?: () => void
+}) => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'update-provider-credentials'],
+    mutationFn: (payload: { providerName: string, credentials: Record<string, any> }) => {
+      const { providerName, credentials } = payload
+      return post(`/workspaces/current/tool-provider/builtin/${providerName}/update`, {
+        body: {
+          credentials,
+        },
+      })
+    },
+    onSuccess,
+  })
+}
+
+export const useRemoveProviderCredentials = ({
+  onSuccess,
+}: {
+  onSuccess?: () => void
+}) => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'remove-provider-credentials'],
+    mutationFn: (providerName: string) => {
+      return post(`/workspaces/current/tool-provider/builtin/${providerName}/delete`, {
+        body: {},
+      })
+    },
+    onSuccess,
+  })
+}
diff --git a/service/use-workflow.ts b/service/use-workflow.ts
new file mode 100644
index 0000000..4321552
--- /dev/null
+++ b/service/use-workflow.ts
@@ -0,0 +1,87 @@
+import { del, get, patch, post } from './base'
+import { useInfiniteQuery, useMutation, useQuery } from '@tanstack/react-query'
+import type {
+  FetchWorkflowDraftPageParams,
+  FetchWorkflowDraftPageResponse,
+  FetchWorkflowDraftResponse,
+  PublishWorkflowParams,
+  UpdateWorkflowParams,
+  WorkflowConfigResponse,
+} from '@/types/workflow'
+import type { CommonResponse } from '@/models/common'
+import { useReset } from './use-base'
+
+const NAME_SPACE = 'workflow'
+
+export const useAppWorkflow = (appID: string) => {
+  return useQuery<FetchWorkflowDraftResponse>({
+    enabled: !!appID,
+    queryKey: [NAME_SPACE, 'publish', appID],
+    queryFn: () => get<FetchWorkflowDraftResponse>(`/apps/${appID}/workflows/publish`),
+  })
+}
+
+export const useWorkflowConfig = (appId: string, onSuccess: (v: WorkflowConfigResponse) => void) => {
+  return useQuery({
+    queryKey: [NAME_SPACE, 'config', appId],
+    queryFn: async () => {
+      const data = await get<WorkflowConfigResponse>(`/apps/${appId}/workflows/draft/config`)
+      onSuccess(data)
+      return data
+    },
+  })
+}
+
+const WorkflowVersionHistoryKey = [NAME_SPACE, 'versionHistory']
+
+export const useWorkflowVersionHistory = (params: FetchWorkflowDraftPageParams) => {
+  const { appId, initialPage, limit, userId, namedOnly } = params
+  return useInfiniteQuery({
+    queryKey: [...WorkflowVersionHistoryKey, appId, initialPage, limit, userId, namedOnly],
+    queryFn: ({ pageParam = 1 }) => get<FetchWorkflowDraftPageResponse>(`/apps/${appId}/workflows`, {
+      params: {
+        page: pageParam,
+        limit,
+        user_id: userId || '',
+        named_only: !!namedOnly,
+      },
+    }),
+    getNextPageParam: lastPage => lastPage.has_more ? lastPage.page + 1 : null,
+    initialPageParam: initialPage,
+  })
+}
+
+export const useResetWorkflowVersionHistory = (appId: string) => {
+  return useReset([...WorkflowVersionHistoryKey, appId])
+}
+
+export const useUpdateWorkflow = (appId: string) => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'update'],
+    mutationFn: (params: UpdateWorkflowParams) => patch(`/apps/${appId}/workflows/${params.workflowId}`, {
+      body: {
+        marked_name: params.title,
+        marked_comment: params.releaseNotes,
+      },
+    }),
+  })
+}
+
+export const useDeleteWorkflow = (appId: string) => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'delete'],
+    mutationFn: (workflowId: string) => del(`/apps/${appId}/workflows/${workflowId}`),
+  })
+}
+
+export const usePublishWorkflow = (appId: string) => {
+  return useMutation({
+    mutationKey: [NAME_SPACE, 'publish'],
+    mutationFn: (params: PublishWorkflowParams) => post<CommonResponse & { created_at: number }>(`/apps/${appId}/workflows/publish`, {
+      body: {
+        marked_name: params.title,
+        marked_comment: params.releaseNotes,
+      },
+    }),
+  })
+}
diff --git a/service/workflow.ts b/service/workflow.ts
new file mode 100644
index 0000000..7d10394
--- /dev/null
+++ b/service/workflow.ts
@@ -0,0 +1,72 @@
+import type { Fetcher } from 'swr'
+import { get, post } from './base'
+import type { CommonResponse } from '@/models/common'
+import type {
+  ChatRunHistoryResponse,
+  ConversationVariableResponse,
+  FetchWorkflowDraftResponse,
+  NodesDefaultConfigsResponse,
+  WorkflowRunHistoryResponse,
+} from '@/types/workflow'
+import type { BlockEnum } from '@/app/components/workflow/types'
+
+export const fetchWorkflowDraft = (url: string) => {
+  return get(url, {}, { silent: true }) as Promise<FetchWorkflowDraftResponse>
+}
+
+export const syncWorkflowDraft = ({ url, params }: {
+  url: string
+  params: Pick<FetchWorkflowDraftResponse, 'graph' | 'features' | 'environment_variables' | 'conversation_variables'>
+}) => {
+  return post<CommonResponse & { updated_at: number; hash: string }>(url, { body: params }, { silent: true })
+}
+
+export const fetchNodesDefaultConfigs: Fetcher<NodesDefaultConfigsResponse, string> = (url) => {
+  return get<NodesDefaultConfigsResponse>(url)
+}
+
+export const fetchWorkflowRunHistory: Fetcher<WorkflowRunHistoryResponse, string> = (url) => {
+  return get<WorkflowRunHistoryResponse>(url)
+}
+
+export const fetchChatRunHistory: Fetcher<ChatRunHistoryResponse, string> = (url) => {
+  return get<ChatRunHistoryResponse>(url)
+}
+
+export const singleNodeRun = (appId: string, nodeId: string, params: object) => {
+  return post(`apps/${appId}/workflows/draft/nodes/${nodeId}/run`, { body: params })
+}
+
+export const getIterationSingleNodeRunUrl = (isChatFlow: boolean, appId: string, nodeId: string) => {
+  return `apps/${appId}/${isChatFlow ? 'advanced-chat/' : ''}workflows/draft/iteration/nodes/${nodeId}/run`
+}
+
+export const getLoopSingleNodeRunUrl = (isChatFlow: boolean, appId: string, nodeId: string) => {
+  return `apps/${appId}/${isChatFlow ? 'advanced-chat/' : ''}workflows/draft/loop/nodes/${nodeId}/run`
+}
+
+export const fetchPublishedWorkflow: Fetcher<FetchWorkflowDraftResponse, string> = (url) => {
+  return get<FetchWorkflowDraftResponse>(url)
+}
+
+export const stopWorkflowRun = (url: string) => {
+  return post<CommonResponse>(url)
+}
+
+export const fetchNodeDefault = (appId: string, blockType: BlockEnum, query = {}) => {
+  return get(`apps/${appId}/workflows/default-workflow-block-configs/${blockType}`, {
+    params: { q: JSON.stringify(query) },
+  })
+}
+
+// TODO: archived
+export const updateWorkflowDraftFromDSL = (appId: string, data: string) => {
+  return post<FetchWorkflowDraftResponse>(`apps/${appId}/workflows/draft/import`, { body: { data } })
+}
+
+export const fetchCurrentValueOfConversationVariable: Fetcher<ConversationVariableResponse, {
+  url: string
+  params: { conversation_id: string }
+}> = ({ url, params }) => {
+  return get<ConversationVariableResponse>(url, { params })
+}
diff --git a/tailwind-common-config.ts b/tailwind-common-config.ts
new file mode 100644
index 0000000..3f64afc
--- /dev/null
+++ b/tailwind-common-config.ts
@@ -0,0 +1,138 @@
+import tailwindThemeVarDefine from './themes/tailwind-theme-var-define'
+
+const config = {
+  theme: {
+    typography: require('./typography'),
+    extend: {
+      colors: {
+        gray: {
+          25: '#fcfcfd',
+          50: '#f9fafb',
+          100: '#f2f4f7',
+          200: '#eaecf0',
+          300: '#d0d5dd',
+          400: '#98a2b3',
+          500: '#667085',
+          700: '#475467',
+          600: '#344054',
+          800: '#1d2939',
+          900: '#101828',
+        },
+        primary: {
+          25: '#f5f8ff',
+          50: '#eff4ff',
+          100: '#d1e0ff',
+          200: '#b2ccff',
+          300: '#84adff',
+          400: '#528bff',
+          500: '#2970ff',
+          600: '#155eef',
+          700: '#004eeb',
+          800: '#0040c1',
+          900: '#00359e',
+        },
+        blue: {
+          500: '#E1EFFE',
+        },
+        green: {
+          50: '#F3FAF7',
+          100: '#DEF7EC',
+          800: '#03543F',
+
+        },
+        yellow: {
+          100: '#FDF6B2',
+          800: '#723B13',
+        },
+        purple: {
+          50: '#F6F5FF',
+          200: '#DCD7FE',
+        },
+        indigo: {
+          25: '#F5F8FF',
+          50: '#EEF4FF',
+          100: '#E0EAFF',
+          300: '#A4BCFD',
+          400: '#8098F9',
+          600: '#444CE7',
+          800: '#2D31A6',
+        },
+        ...tailwindThemeVarDefine,
+      },
+      screens: {
+        'mobile': '100px',
+        // => @media (min-width: 100px) { ... }
+        'tablet': '640px', // 391
+        // => @media (min-width: 600px) { ... }
+        'pc': '769px',
+        // => @media (min-width: 769px) { ... }
+        '2k': '2560px',
+      },
+      boxShadow: {
+        'xs': '0px 1px 2px 0px rgba(16, 24, 40, 0.05)',
+        'sm': '0px 1px 2px 0px rgba(16, 24, 40, 0.06), 0px 1px 3px 0px rgba(16, 24, 40, 0.10)',
+        'md': '0px 2px 4px -2px rgba(16, 24, 40, 0.06), 0px 4px 8px -2px rgba(16, 24, 40, 0.10)',
+        'lg': '0px 4px 6px -2px rgba(16, 24, 40, 0.03), 0px 12px 16px -4px rgba(16, 24, 40, 0.08)',
+        'xl': '0px 8px 8px -4px rgba(16, 24, 40, 0.03), 0px 20px 24px -4px rgba(16, 24, 40, 0.08)',
+        '2xl': '0px 24px 48px -12px rgba(16, 24, 40, 0.18)',
+        '3xl': '0px 32px 64px -12px rgba(16, 24, 40, 0.14)',
+        'status-indicator-green-shadow': '0px 2px 6px 0px var(--color-components-badge-status-light-success-halo), 0px 0px 0px 1px var(--color-components-badge-status-light-border-outer)',
+        'status-indicator-warning-shadow': '0px 2px 6px 0px var(--color-components-badge-status-light-warning-halo), 0px 0px 0px 1px var(--color-components-badge-status-light-border-outer)',
+        'status-indicator-red-shadow': '0px 2px 6px 0px var(--color-components-badge-status-light-error-halo), 0px 0px 0px 1px var(--color-components-badge-status-light-border-outer)',
+        'status-indicator-blue-shadow': '0px 2px 6px 0px var(--color-components-badge-status-light-normal-halo), 0px 0px 0px 1px var(--color-components-badge-status-light-border-outer)',
+        'status-indicator-gray-shadow': '0px 1px 2px 0px var(--color-components-badge-status-light-disabled-halo), 0px 0px 0px 1px var(--color-components-badge-status-light-border-outer)',
+      },
+      opacity: {
+        2: '0.02',
+        8: '0.08',
+      },
+      fontSize: {
+        '2xs': '0.625rem',
+      },
+      backgroundImage: {
+        'chatbot-bg': 'var(--color-chatbot-bg)',
+        'chat-bubble-bg': 'var(--color-chat-bubble-bg)',
+        'chat-input-mask': 'var(--color-chat-input-mask)',
+        'workflow-process-bg': 'var(--color-workflow-process-bg)',
+        'workflow-run-failed-bg': 'var(--color-workflow-run-failed-bg)',
+        'workflow-batch-failed-bg': 'var(--color-workflow-batch-failed-bg)',
+        'mask-top2bottom-gray-50-to-transparent': 'var(--mask-top2bottom-gray-50-to-transparent)',
+        'marketplace-divider-bg': 'var(--color-marketplace-divider-bg)',
+        'marketplace-plugin-empty': 'var(--color-marketplace-plugin-empty)',
+        'toast-success-bg': 'var(--color-toast-success-bg)',
+        'toast-warning-bg': 'var(--color-toast-warning-bg)',
+        'toast-error-bg': 'var(--color-toast-error-bg)',
+        'toast-info-bg': 'var(--color-toast-info-bg)',
+        'app-detail-bg': 'var(--color-app-detail-bg)',
+        'app-detail-overlay-bg': 'var(--color-app-detail-overlay-bg)',
+        'dataset-chunk-process-success-bg': 'var(--color-dataset-chunk-process-success-bg)',
+        'dataset-chunk-process-error-bg': 'var(--color-dataset-chunk-process-error-bg)',
+        'dataset-chunk-detail-card-hover-bg': 'var(--color-dataset-chunk-detail-card-hover-bg)',
+        'dataset-child-chunk-expand-btn-bg': 'var(--color-dataset-child-chunk-expand-btn-bg)',
+        'dataset-option-card-blue-gradient': 'var(--color-dataset-option-card-blue-gradient)',
+        'dataset-option-card-purple-gradient': 'var(--color-dataset-option-card-purple-gradient)',
+        'dataset-option-card-orange-gradient': 'var(--color-dataset-option-card-orange-gradient)',
+        'dataset-chunk-list-mask-bg': 'var(--color-dataset-chunk-list-mask-bg)',
+        'line-divider-bg': 'var(--color-line-divider-bg)',
+        'dataset-warning-message-bg': 'var(--color-dataset-warning-message-bg)',
+        'price-premium-badge-background': 'var(--color-premium-badge-background)',
+        'premium-yearly-tip-text-background': 'var(--color-premium-yearly-tip-text-background)',
+        'price-premium-text-background': 'var(--color-premium-text-background)',
+        'price-enterprise-background': 'var(--color-price-enterprise-background)',
+        'grid-mask-background': 'var(--color-grid-mask-background)',
+      },
+      animation: {
+        'spin-slow': 'spin 2s linear infinite',
+      },
+    },
+  },
+  plugins: [
+    require('@tailwindcss/typography'),
+  ],
+  // https://github.com/tailwindlabs/tailwindcss/discussions/5969
+  corePlugins: {
+    preflight: false,
+  },
+}
+
+export default config
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000..a9959e7
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,12 @@
+// import type { Config } from 'tailwindcss'
+import commonConfig from './tailwind-common-config'
+const config = {
+  content: [
+    './app/**/*.{js,ts,jsx,tsx}',
+    './components/**/*.{js,ts,jsx,tsx}',
+    './context/**/*.{js,ts,jsx,tsx}',
+  ],
+  ...commonConfig,
+}
+
+export default config
diff --git a/themes/dark.css b/themes/dark.css
new file mode 100644
index 0000000..edbd9de
--- /dev/null
+++ b/themes/dark.css
@@ -0,0 +1,739 @@
+/* Attention: Generate by code. Don't update by hand!!! */
+html[data-theme="dark"] {
+  --color-components-input-bg-normal: #ffffff14;
+  --color-components-input-text-placeholder: #c8ceda4d;
+  --color-components-input-bg-hover: #ffffff08;
+  --color-components-input-bg-active: #ffffff0d;
+  --color-components-input-border-active: #747481;
+  --color-components-input-border-destructive: #f97066;
+  --color-components-input-text-filled: #f4f4f5;
+  --color-components-input-bg-destructive: #ffffff03;
+  --color-components-input-bg-disabled: #ffffff08;
+  --color-components-input-text-disabled: #c8ceda4d;
+  --color-components-input-text-filled-disabled: #c8ceda99;
+  --color-components-input-border-hover: #3a3a40;
+  --color-components-input-border-active-prompt-1: #36bffa;
+  --color-components-input-border-active-prompt-2: #296dff;
+
+  --color-components-kbd-bg-gray: #ffffff08;
+  --color-components-kbd-bg-white: #ffffff1f;
+
+  --color-components-tooltip-bg: #18181bf2;
+
+  --color-components-button-primary-text: #fffffff2;
+  --color-components-button-primary-bg: #155aef;
+  --color-components-button-primary-border: #ffffff1f;
+  --color-components-button-primary-bg-hover: #296dff;
+  --color-components-button-primary-border-hover: #ffffff33;
+  --color-components-button-primary-bg-disabled: #ffffff08;
+  --color-components-button-primary-border-disabled: #ffffff14;
+  --color-components-button-primary-text-disabled: #ffffff33;
+
+  --color-components-button-secondary-text: #ffffffcc;
+  --color-components-button-secondary-text-disabled: #ffffff33;
+  --color-components-button-secondary-bg: #ffffff1f;
+  --color-components-button-secondary-bg-hover: #ffffff33;
+  --color-components-button-secondary-bg-disabled: #ffffff08;
+  --color-components-button-secondary-border: #ffffff14;
+  --color-components-button-secondary-border-hover: #ffffff1f;
+  --color-components-button-secondary-border-disabled: #ffffff0d;
+
+  --color-components-button-tertiary-text: #d9d9de;
+  --color-components-button-tertiary-text-disabled: #ffffff33;
+  --color-components-button-tertiary-bg: #ffffff14;
+  --color-components-button-tertiary-bg-hover: #ffffff1f;
+  --color-components-button-tertiary-bg-disabled: #ffffff08;
+
+  --color-components-button-ghost-text: #d9d9de;
+  --color-components-button-ghost-text-disabled: #ffffff33;
+  --color-components-button-ghost-bg-hover: #c8ceda14;
+
+  --color-components-button-destructive-primary-text: #fffffff2;
+  --color-components-button-destructive-primary-text-disabled: #ffffff33;
+  --color-components-button-destructive-primary-bg: #d92d20;
+  --color-components-button-destructive-primary-bg-hover: #f04438;
+  --color-components-button-destructive-primary-bg-disabled: #f0443824;
+  --color-components-button-destructive-primary-border: #ffffff1f;
+  --color-components-button-destructive-primary-border-hover: #ffffff33;
+  --color-components-button-destructive-primary-border-disabled: #ffffff14;
+
+  --color-components-button-destructive-secondary-text: #f97066;
+  --color-components-button-destructive-secondary-text-disabled: #f0443833;
+  --color-components-button-destructive-secondary-bg: #ffffff1f;
+  --color-components-button-destructive-secondary-bg-hover: #f0443824;
+  --color-components-button-destructive-secondary-bg-disabled: #f0443814;
+  --color-components-button-destructive-secondary-border: #ffffff14;
+  --color-components-button-destructive-secondary-border-hover: #ffffff1f;
+  --color-components-button-destructive-secondary-border-disabled: #f0443814;
+
+  --color-components-button-destructive-tertiary-text: #f97066;
+  --color-components-button-destructive-tertiary-text-disabled: #f0443833;
+  --color-components-button-destructive-tertiary-bg: #f0443824;
+  --color-components-button-destructive-tertiary-bg-hover: #f0443840;
+  --color-components-button-destructive-tertiary-bg-disabled: #f0443814;
+
+  --color-components-button-destructive-ghost-text: #f97066;
+  --color-components-button-destructive-ghost-text-disabled: #f0443833;
+  --color-components-button-destructive-ghost-bg-hover: #f0443824;
+
+  --color-components-button-secondary-accent-text: #ffffffcc;
+  --color-components-button-secondary-accent-text-disabled: #ffffff33;
+  --color-components-button-secondary-accent-bg: #ffffff0d;
+  --color-components-button-secondary-accent-bg-hover: #ffffff14;
+  --color-components-button-secondary-accent-bg-disabled: #ffffff08;
+  --color-components-button-secondary-accent-border: #ffffff14;
+  --color-components-button-secondary-accent-border-hover: #ffffff1f;
+  --color-components-button-secondary-accent-border-disabled: #ffffff0d;
+
+  --color-components-button-indigo-bg: #444ce7;
+  --color-components-button-indigo-bg-hover: #6172f3;
+  --color-components-button-indigo-bg-disabled: #ffffff08;
+
+  --color-components-checkbox-icon: #fffffff2;
+  --color-components-checkbox-icon-disabled: #ffffff33;
+  --color-components-checkbox-bg: #296dff;
+  --color-components-checkbox-bg-hover: #5289ff;
+  --color-components-checkbox-bg-disabled: #ffffff08;
+  --color-components-checkbox-border: #ffffff66;
+  --color-components-checkbox-border-hover: #ffffff99;
+  --color-components-checkbox-border-disabled: #ffffff03;
+  --color-components-checkbox-bg-unchecked: #ffffff08;
+  --color-components-checkbox-bg-unchecked-hover: #ffffff0d;
+  --color-components-checkbox-bg-disabled-checked: #155aef33;
+
+  --color-components-radio-border-checked: #296dff;
+  --color-components-radio-border-checked-hover: #5289ff;
+  --color-components-radio-border-checked-disabled: #155aef33;
+  --color-components-radio-bg-disabled: #ffffff08;
+  --color-components-radio-border: #ffffff66;
+  --color-components-radio-border-hover: #ffffff99;
+  --color-components-radio-border-disabled: #ffffff03;
+  --color-components-radio-bg: #ffffff00;
+  --color-components-radio-bg-hover: #ffffff0d;
+
+  --color-components-toggle-knob: #f4f4f5;
+  --color-components-toggle-knob-disabled: #ffffff33;
+  --color-components-toggle-bg: #296dff;
+  --color-components-toggle-bg-hover: #5289ff;
+  --color-components-toggle-bg-disabled: #ffffff14;
+  --color-components-toggle-bg-unchecked: #ffffff33;
+  --color-components-toggle-bg-unchecked-hover: #ffffff4d;
+  --color-components-toggle-bg-unchecked-disabled: #ffffff14;
+  --color-components-toggle-knob-hover: #fefefe;
+
+  --color-components-card-bg: #222225;
+  --color-components-card-border: #ffffff08;
+  --color-components-card-bg-alt: #27272b;
+
+  --color-components-menu-item-text: #c8ceda99;
+  --color-components-menu-item-text-active: #fffffff2;
+  --color-components-menu-item-text-hover: #c8cedacc;
+  --color-components-menu-item-text-active-accent: #fffffff2;
+
+  --color-components-panel-bg: #222225;
+  --color-components-panel-bg-blur: #2c2c30f2;
+  --color-components-panel-border: #c8ceda24;
+  --color-components-panel-border-subtle: #c8ceda14;
+  --color-components-panel-gradient-2: #222225;
+  --color-components-panel-gradient-1: #27272b;
+  --color-components-panel-bg-alt: #222225;
+  --color-components-panel-on-panel-item-bg: #27272b;
+  --color-components-panel-on-panel-item-bg-hover: #3a3a40;
+  --color-components-panel-on-panel-item-bg-alt: #3a3a40;
+  --color-components-panel-on-panel-item-bg-transparent: #2c2c30f2;
+  --color-components-panel-on-panel-item-bg-hover-transparent: #3a3a4000;
+  --color-components-panel-on-panel-item-bg-destructive-hover-transparent: #fffbfa00;
+
+  --color-components-panel-bg-transparent: #22222500;
+
+  --color-components-main-nav-nav-button-text: #c8ceda99;
+  --color-components-main-nav-nav-button-text-active: #f4f4f5;
+  --color-components-main-nav-nav-button-bg: #ffffff00;
+  --color-components-main-nav-nav-button-bg-active: #c8ceda24;
+  --color-components-main-nav-nav-button-border: #ffffff14;
+  --color-components-main-nav-nav-button-bg-hover: #c8ceda0a;
+
+  --color-components-main-nav-nav-user-border: #ffffff0d;
+
+  --color-components-slider-knob: #f4f4f5;
+  --color-components-slider-knob-hover: #fefefe;
+  --color-components-slider-knob-disabled: #ffffff33;
+  --color-components-slider-range: #296dff;
+  --color-components-slider-track: #ffffff33;
+  --color-components-slider-knob-border-hover: #1018284d;
+  --color-components-slider-knob-border: #10182833;
+
+  --color-components-segmented-control-item-active-bg: #ffffff14;
+  --color-components-segmented-control-item-active-border: #c8ceda14;
+  --color-components-segmented-control-bg-normal: #18181bb3;
+  --color-components-segmented-control-item-active-accent-bg: #155aef33;
+  --color-components-segmented-control-item-active-accent-border: #155aef4d;
+
+  --color-components-option-card-option-bg: #c8ceda0a;
+  --color-components-option-card-option-selected-bg: #ffffff0d;
+  --color-components-option-card-option-selected-border: #5289ff;
+  --color-components-option-card-option-border: #c8ceda33;
+  --color-components-option-card-option-bg-hover: #c8ceda24;
+  --color-components-option-card-option-border-hover: #c8ceda4d;
+
+  --color-components-tab-active: #296dff;
+
+  --color-components-badge-white-to-dark: #18181bcc;
+  --color-components-badge-status-light-success-bg: #17b26a;
+  --color-components-badge-status-light-success-border-inner: #47cd89;
+  --color-components-badge-status-light-success-halo: #17b26a4d;
+
+  --color-components-badge-status-light-border-outer: #222225;
+  --color-components-badge-status-light-high-light: #ffffff4d;
+  --color-components-badge-status-light-warning-bg: #f79009;
+  --color-components-badge-status-light-warning-border-inner: #fdb022;
+  --color-components-badge-status-light-warning-halo: #f790094d;
+
+  --color-components-badge-status-light-error-bg: #f04438;
+  --color-components-badge-status-light-error-border-inner: #f97066;
+  --color-components-badge-status-light-error-halo: #f044384d;
+
+  --color-components-badge-status-light-normal-bg: #0ba5ec;
+  --color-components-badge-status-light-normal-border-inner: #36bffa;
+  --color-components-badge-status-light-normal-halo: #0ba5ec4d;
+
+  --color-components-badge-status-light-disabled-bg: #676f83;
+  --color-components-badge-status-light-disabled-border-inner: #98a2b2;
+  --color-components-badge-status-light-disabled-halo: #c8ceda14;
+
+  --color-components-badge-bg-green-soft: #17b26a24;
+  --color-components-badge-bg-orange-soft: #f7900924;
+  --color-components-badge-bg-red-soft: #f0443824;
+  --color-components-badge-bg-blue-light-soft: #0ba5ec24;
+  --color-components-badge-bg-gray-soft: #c8ceda14;
+  --color-components-badge-bg-dimm: #ffffff08;
+
+  --color-components-chart-line: #5289ff;
+  --color-components-chart-area-1: #155aef33;
+  --color-components-chart-area-2: #155aef0a;
+  --color-components-chart-current-1: #5289ff;
+  --color-components-chart-current-2: #155aef4d;
+  --color-components-chart-bg: #18181bf2;
+
+  --color-components-actionbar-bg: #222225;
+  --color-components-actionbar-border: #c8ceda14;
+  --color-components-actionbar-bg-accent: #27272b;
+  --color-components-actionbar-border-accent: #5289ff;
+
+  --color-components-dropzone-bg-alt: #18181bcc;
+  --color-components-dropzone-bg: #18181b66;
+  --color-components-dropzone-bg-accent: #155aef33;
+  --color-components-dropzone-border: #c8ceda24;
+  --color-components-dropzone-border-alt: #c8ceda33;
+  --color-components-dropzone-border-accent: #84abff;
+
+  --color-components-progress-brand-progress: #5289ff;
+  --color-components-progress-brand-border: #5289ff;
+  --color-components-progress-brand-bg: #155aef0a;
+
+  --color-components-progress-white-progress: #ffffff;
+  --color-components-progress-white-border: #fffffff2;
+  --color-components-progress-white-bg: #ffffff03;
+
+  --color-components-progress-gray-progress: #98a2b2;
+  --color-components-progress-gray-border: #98a2b2;
+  --color-components-progress-gray-bg: #c8ceda05;
+
+  --color-components-progress-warning-progress: #fdb022;
+  --color-components-progress-warning-border: #fdb022;
+  --color-components-progress-warning-bg: #f790090a;
+
+  --color-components-progress-error-progress: #f97066;
+  --color-components-progress-error-border: #f97066;
+  --color-components-progress-error-bg: #f044380a;
+
+  --color-components-chat-input-audio-bg: #155aef33;
+  --color-components-chat-input-audio-wave-default: #c8ceda24;
+  --color-components-chat-input-bg-mask-1: #18181b0a;
+  --color-components-chat-input-bg-mask-2: #18181b99;
+  --color-components-chat-input-border: #c8ceda33;
+  --color-components-chat-input-audio-wave-active: #84abff;
+  --color-components-chat-input-audio-bg-alt: #18181be6;
+
+  --color-components-avatar-shape-fill-stop-0: #fffffff2;
+  --color-components-avatar-shape-fill-stop-100: #ffffffcc;
+
+  --color-components-avatar-bg-mask-stop-0: #ffffff33;
+  --color-components-avatar-bg-mask-stop-100: #ffffff08;
+
+  --color-components-avatar-default-avatar-bg: #222225;
+  --color-components-avatar-mask-darkmode-dimmed: #0000001f;
+
+  --color-components-label-gray: #c8ceda24;
+
+  --color-components-premium-badge-blue-bg-stop-0: #5289ff;
+  --color-components-premium-badge-blue-bg-stop-100: #296dff;
+  --color-components-premium-badge-blue-stroke-stop-0: #ffffff33;
+  --color-components-premium-badge-blue-stroke-stop-100: #296dff;
+  --color-components-premium-badge-blue-text-stop-0: #eff4ff;
+  --color-components-premium-badge-blue-text-stop-100: #b2caff;
+  --color-components-premium-badge-blue-glow: #004aeb;
+  --color-components-premium-badge-blue-bg-stop-0-hover: #84abff;
+  --color-components-premium-badge-blue-bg-stop-100-hover: #004aeb;
+  --color-components-premium-badge-blue-glow-hover: #d1e0ff;
+  --color-components-premium-badge-blue-stroke-stop-0-hover: #ffffff80;
+  --color-components-premium-badge-blue-stroke-stop-100-hover: #296dff;
+
+  --color-components-premium-badge-highlight-stop-0: #ffffff1f;
+  --color-components-premium-badge-highlight-stop-100: #ffffff33;
+  --color-components-premium-badge-indigo-bg-stop-0: #6172f3;
+  --color-components-premium-badge-indigo-bg-stop-100: #3538cd;
+  --color-components-premium-badge-indigo-stroke-stop-0: #ffffff33;
+  --color-components-premium-badge-indigo-stroke-stop-100: #444ce7;
+  --color-components-premium-badge-indigo-text-stop-0: #eef4ff;
+  --color-components-premium-badge-indigo-text-stop-100: #c7d7fe;
+  --color-components-premium-badge-indigo-glow: #3538cd;
+  --color-components-premium-badge-indigo-glow-hover: #e0eaff;
+  --color-components-premium-badge-indigo-bg-stop-0-hover: #a4bcfd;
+  --color-components-premium-badge-indigo-bg-stop-100-hover: #3538cd;
+  --color-components-premium-badge-indigo-stroke-stop-0-hover: #ffffff80;
+  --color-components-premium-badge-indigo-stroke-stop-100-hover: #444ce7;
+
+  --color-components-premium-badge-grey-bg-stop-0: #676f83;
+  --color-components-premium-badge-grey-bg-stop-100: #495464;
+  --color-components-premium-badge-grey-stroke-stop-0: #ffffff1f;
+  --color-components-premium-badge-grey-stroke-stop-100: #495464;
+  --color-components-premium-badge-grey-text-stop-0: #f9fafb;
+  --color-components-premium-badge-grey-text-stop-100: #e9ebf0;
+  --color-components-premium-badge-grey-glow: #354052;
+  --color-components-premium-badge-grey-glow-hover: #f2f4f7;
+  --color-components-premium-badge-grey-bg-stop-0-hover: #98a2b2;
+  --color-components-premium-badge-grey-bg-stop-100-hover: #354052;
+  --color-components-premium-badge-grey-stroke-stop-0-hover: #ffffff80;
+  --color-components-premium-badge-grey-stroke-stop-100-hover: #676f83;
+
+  --color-components-premium-badge-orange-bg-stop-0: #ff692e;
+  --color-components-premium-badge-orange-bg-stop-100: #e04f16;
+  --color-components-premium-badge-orange-stroke-stop-0: #ffffff33;
+  --color-components-premium-badge-orange-stroke-stop-100: #ff4405;
+  --color-components-premium-badge-orange-text-stop-0: #fef6ee;
+  --color-components-premium-badge-orange-text-stop-100: #f9dbaf;
+  --color-components-premium-badge-orange-glow: #b93815;
+  --color-components-premium-badge-orange-glow-hover: #fdead7;
+  --color-components-premium-badge-orange-bg-stop-0-hover: #ff692e;
+  --color-components-premium-badge-orange-bg-stop-100-hover: #b93815;
+  --color-components-premium-badge-orange-stroke-stop-0-hover: #ffffff80;
+  --color-components-premium-badge-orange-stroke-stop-100-hover: #ff4405;
+
+  --color-components-progress-bar-bg: #c8ceda14;
+  --color-components-progress-bar-progress: #c8ceda24;
+  --color-components-progress-bar-border: #ffffff08;
+  --color-components-progress-bar-progress-solid: #fffffff2;
+  --color-components-progress-bar-progress-highlight: #c8ceda33;
+
+  --color-components-icon-bg-red-solid: #d92d20;
+  --color-components-icon-bg-rose-solid: #e31b54;
+  --color-components-icon-bg-pink-solid: #dd2590;
+  --color-components-icon-bg-orange-dark-solid: #ff4405;
+  --color-components-icon-bg-yellow-solid: #eaaa08;
+  --color-components-icon-bg-green-solid: #4ca30d;
+  --color-components-icon-bg-teal-solid: #0e9384;
+  --color-components-icon-bg-blue-light-solid: #0ba5ec;
+  --color-components-icon-bg-blue-solid: #155aef;
+  --color-components-icon-bg-indigo-solid: #444ce7;
+  --color-components-icon-bg-violet-solid: #7839ee;
+  --color-components-icon-bg-midnight-solid: #5d698d;
+  --color-components-icon-bg-rose-soft: #f63d6833;
+  --color-components-icon-bg-pink-soft: #ee46bc33;
+  --color-components-icon-bg-orange-dark-soft: #ff440533;
+  --color-components-icon-bg-yellow-soft: #eaaa0833;
+  --color-components-icon-bg-green-soft: #66c61c33;
+  --color-components-icon-bg-teal-soft: #15b79e33;
+  --color-components-icon-bg-blue-light-soft: #0ba5ec33;
+  --color-components-icon-bg-blue-soft: #155aef33;
+  --color-components-icon-bg-indigo-soft: #6172f333;
+  --color-components-icon-bg-violet-soft: #875bf733;
+  --color-components-icon-bg-midnight-soft: #828dad33;
+  --color-components-icon-bg-red-soft: #f0443833;
+  --color-components-icon-bg-orange-solid: #f79009;
+  --color-components-icon-bg-orange-soft: #f7900933;
+
+  --color-text-primary: #fbfbfc;
+  --color-text-secondary: #d9d9de;
+  --color-text-tertiary: #c8ceda99;
+  --color-text-quaternary: #c8ceda66;
+  --color-text-destructive: #f97066;
+  --color-text-success: #17b26a;
+  --color-text-warning: #f79009;
+  --color-text-destructive-secondary: #f97066;
+  --color-text-success-secondary: #47cd89;
+  --color-text-warning-secondary: #fdb022;
+  --color-text-accent: #5289ff;
+  --color-text-primary-on-surface: #fffffff2;
+  --color-text-placeholder: #c8ceda4d;
+  --color-text-disabled: #c8ceda4d;
+  --color-text-accent-secondary: #84abff;
+  --color-text-accent-light-mode-only: #d9d9de;
+  --color-text-text-selected: #155aef4d;
+  --color-text-secondary-on-surface: #ffffffe6;
+  --color-text-logo-text: #e9e9ec;
+  --color-text-empty-state-icon: #c8ceda4d;
+  --color-text-inverted: #ffffff;
+  --color-text-inverted-dimmed: #ffffffcc;
+
+  --color-background-body: #1d1d20;
+  --color-background-default-subtle: #222225;
+  --color-background-neutral-subtle: #1d1d20;
+  --color-background-sidenav-bg: #27272aeb;
+  --color-background-default: #222225;
+  --color-background-soft: #18181b40;
+  --color-background-gradient-bg-fill-chat-bg-1: #222225;
+  --color-background-gradient-bg-fill-chat-bg-2: #1d1d20;
+  --color-background-gradient-bg-fill-chat-bubble-bg-1: #c8ceda14;
+  --color-background-gradient-bg-fill-chat-bubble-bg-2: #c8ceda05;
+  --color-background-gradient-bg-fill-debug-bg-1: #c8ceda14;
+  --color-background-gradient-bg-fill-debug-bg-2: #18181b0a;
+
+  --color-background-gradient-mask-gray: #18181b14;
+  --color-background-gradient-mask-transparent: #00000000;
+  --color-background-gradient-mask-input-clear-2: #393a3e00;
+  --color-background-gradient-mask-input-clear-1: #393a3e;
+  --color-background-gradient-mask-transparent-dark: #00000000;
+  --color-background-gradient-mask-side-panel-2: #18181be6;
+  --color-background-gradient-mask-side-panel-1: #18181b0a;
+
+  --color-background-default-burn: #1d1d20;
+  --color-background-overlay-fullscreen: #27272af7;
+  --color-background-default-lighter: #c8ceda0a;
+  --color-background-section: #18181b66;
+  --color-background-interaction-from-bg-1: #18181b66;
+  --color-background-interaction-from-bg-2: #18181b24;
+  --color-background-section-burn: #18181b99;
+  --color-background-default-dodge: #3a3a40;
+  --color-background-overlay: #18181bcc;
+  --color-background-default-dimmed: #27272b;
+  --color-background-default-hover: #27272b;
+  --color-background-overlay-alt: #18181b66;
+  --color-background-surface-white: #ffffffe6;
+  --color-background-overlay-destructive: #f044384d;
+  --color-background-overlay-backdrop: #18181bf2;
+
+  --color-shadow-shadow-1: #0000000d;
+  --color-shadow-shadow-3: #0000001a;
+  --color-shadow-shadow-4: #0000001f;
+  --color-shadow-shadow-5: #00000029;
+  --color-shadow-shadow-6: #00000033;
+  --color-shadow-shadow-7: #0000003d;
+  --color-shadow-shadow-8: #00000047;
+  --color-shadow-shadow-9: #0000005c;
+  --color-shadow-shadow-2: #00000014;
+  --color-shadow-shadow-10: #00000066;
+
+  --color-workflow-block-border: #ffffff14;
+  --color-workflow-block-parma-bg: #ffffff0d;
+  --color-workflow-block-bg: #27272b;
+  --color-workflow-block-bg-transparent: #27272bf5;
+  --color-workflow-block-border-highlight: #c8ceda33;
+
+  --color-workflow-canvas-workflow-dot-color: #8585ad1c;
+  --color-workflow-canvas-workflow-bg: #1d1d20;
+
+  --color-workflow-link-line-active: #5289ff;
+  --color-workflow-link-line-normal: #676f83;
+  --color-workflow-link-line-handle: #5289ff;
+  --color-workflow-link-line-normal-transparent: #676f8333;
+  --color-workflow-link-line-failure-active: #fdb022;
+  --color-workflow-link-line-failure-handle: #fdb022;
+  --color-workflow-link-line-failure-button-bg: #f79009;
+  --color-workflow-link-line-failure-button-hover: #dc6803;
+
+  --color-workflow-link-line-success-active: #47cd89;
+  --color-workflow-link-line-success-handle: #47cd89;
+
+  --color-workflow-link-line-error-active: #f97066;
+  --color-workflow-link-line-error-handle: #f97066;
+
+  --color-workflow-minimap-bg: #27272b;
+  --color-workflow-minimap-block: #c8ceda14;
+
+  --color-workflow-display-success-bg: #17b26a33;
+  --color-workflow-display-success-border-1: #17b26ae6;
+  --color-workflow-display-success-border-2: #17b26acc;
+  --color-workflow-display-success-vignette-color: #17b26a40;
+  --color-workflow-display-success-bg-line-pattern: #18181bcc;
+
+  --color-workflow-display-glass-1: #ffffff08;
+  --color-workflow-display-glass-2: #ffffff0d;
+  --color-workflow-display-vignette-dark: #00000066;
+  --color-workflow-display-highlight: #ffffff1f;
+  --color-workflow-display-outline: #18181bf2;
+  --color-workflow-display-error-bg: #f0443833;
+  --color-workflow-display-error-bg-line-pattern: #18181bcc;
+  --color-workflow-display-error-border-1: #f04438e6;
+  --color-workflow-display-error-border-2: #f04438cc;
+  --color-workflow-display-error-vignette-color: #f0443840;
+
+  --color-workflow-display-warning-bg: #f7900933;
+  --color-workflow-display-warning-bg-line-pattern: #18181bcc;
+  --color-workflow-display-warning-border-1: #f79009e6;
+  --color-workflow-display-warning-border-2: #f79009cc;
+  --color-workflow-display-warning-vignette-color: #f7900940;
+
+  --color-workflow-display-normal-bg: #0ba5ec33;
+  --color-workflow-display-normal-bg-line-pattern: #18181bcc;
+  --color-workflow-display-normal-border-1: #0ba5ece6;
+  --color-workflow-display-normal-border-2: #0ba5eccc;
+  --color-workflow-display-normal-vignette-color: #0ba5ec40;
+
+  --color-workflow-display-disabled-bg: #c8ceda33;
+  --color-workflow-display-disabled-bg-line-pattern: #18181bcc;
+  --color-workflow-display-disabled-border-1: #c8ceda99;
+  --color-workflow-display-disabled-border-2: #c8ceda40;
+  --color-workflow-display-disabled-vignette-color: #c8ceda40;
+  --color-workflow-display-disabled-outline: #18181bf2;
+
+  --color-workflow-workflow-progress-bg-1: #18181b40;
+  --color-workflow-workflow-progress-bg-2: #18181b0a;
+
+  --color-divider-subtle: #c8ceda14;
+  --color-divider-regular: #c8ceda24;
+  --color-divider-deep: #c8ceda33;
+  --color-divider-burn: #18181bf2;
+  --color-divider-intense: #c8ceda66;
+  --color-divider-solid: #3a3a40;
+  --color-divider-solid-alt: #747481;
+
+  --color-state-base-hover: #c8ceda14;
+  --color-state-base-active: #c8ceda33;
+  --color-state-base-hover-alt: #c8ceda24;
+  --color-state-base-handle: #c8ceda4d;
+  --color-state-base-handle-hover: #c8ceda80;
+  --color-state-base-hover-subtle: #c8ceda0a;
+
+  --color-state-accent-hover: #155aef24;
+  --color-state-accent-active: #155aef24;
+  --color-state-accent-hover-alt: #155aef40;
+  --color-state-accent-solid: #5289ff;
+  --color-state-accent-active-alt: #155aef33;
+
+  --color-state-destructive-hover: #f0443824;
+  --color-state-destructive-hover-alt: #f0443840;
+  --color-state-destructive-active: #f044384d;
+  --color-state-destructive-solid: #f97066;
+  --color-state-destructive-border: #f97066;
+
+  --color-state-success-hover: #17b26a24;
+  --color-state-success-hover-alt: #17b26a40;
+  --color-state-success-active: #17b26a4d;
+  --color-state-success-solid: #47cd89;
+
+  --color-state-warning-hover: #f7900924;
+  --color-state-warning-hover-alt: #f7900940;
+  --color-state-warning-active: #f790094d;
+  --color-state-warning-solid: #f79009;
+
+  --color-effects-highlight: #c8ceda14;
+  --color-effects-highlight-lightmode-off: #c8ceda14;
+  --color-effects-image-frame: #ffffff;
+
+  --color-util-colors-orange-dark-orange-dark-50: #57130a;
+  --color-util-colors-orange-dark-orange-dark-100: #771a0d;
+  --color-util-colors-orange-dark-orange-dark-200: #97180c;
+  --color-util-colors-orange-dark-orange-dark-300: #bc1b06;
+  --color-util-colors-orange-dark-orange-dark-400: #e62e05;
+  --color-util-colors-orange-dark-orange-dark-500: #ff4405;
+  --color-util-colors-orange-dark-orange-dark-600: #ff692e;
+  --color-util-colors-orange-dark-orange-dark-700: #ff9c66;
+
+  --color-util-colors-orange-orange-50: #511c10;
+  --color-util-colors-orange-orange-100: #772917;
+  --color-util-colors-orange-orange-200: #932f19;
+  --color-util-colors-orange-orange-300: #b93815;
+  --color-util-colors-orange-orange-400: #e04f16;
+  --color-util-colors-orange-orange-500: #ef6820;
+  --color-util-colors-orange-orange-600: #f38744;
+  --color-util-colors-orange-orange-700: #f7b27a;
+  --color-util-colors-orange-orange-100-transparent: #77291700;
+
+  --color-util-colors-pink-pink-50: #4e0d30;
+  --color-util-colors-pink-pink-100: #851651;
+  --color-util-colors-pink-pink-200: #9e165f;
+  --color-util-colors-pink-pink-300: #c11574;
+  --color-util-colors-pink-pink-400: #dd2590;
+  --color-util-colors-pink-pink-500: #ee46bc;
+  --color-util-colors-pink-pink-600: #f670c7;
+  --color-util-colors-pink-pink-700: #faa7e0;
+
+  --color-util-colors-fuchsia-fuchsia-50: #47104c;
+  --color-util-colors-fuchsia-fuchsia-100: #6f1877;
+  --color-util-colors-fuchsia-fuchsia-200: #821890;
+  --color-util-colors-fuchsia-fuchsia-300: #9f1ab1;
+  --color-util-colors-fuchsia-fuchsia-400: #ba24d5;
+  --color-util-colors-fuchsia-fuchsia-500: #d444f1;
+  --color-util-colors-fuchsia-fuchsia-600: #e478fa;
+  --color-util-colors-fuchsia-fuchsia-700: #eeaafd;
+
+  --color-util-colors-purple-purple-50: #27115f;
+  --color-util-colors-purple-purple-100: #3e1c96;
+  --color-util-colors-purple-purple-200: #4a1fb8;
+  --color-util-colors-purple-purple-300: #5925dc;
+  --color-util-colors-purple-purple-400: #6938ef;
+  --color-util-colors-purple-purple-500: #7a5af8;
+  --color-util-colors-purple-purple-600: #9b8afb;
+  --color-util-colors-purple-purple-700: #bdb4fe;
+
+  --color-util-colors-indigo-indigo-50: #1f235b;
+  --color-util-colors-indigo-indigo-100: #2d3282;
+  --color-util-colors-indigo-indigo-200: #2d31a6;
+  --color-util-colors-indigo-indigo-300: #3538cd;
+  --color-util-colors-indigo-indigo-400: #444ce7;
+  --color-util-colors-indigo-indigo-500: #6172f3;
+  --color-util-colors-indigo-indigo-600: #8098f9;
+  --color-util-colors-indigo-indigo-700: #a4bcfd;
+
+  --color-util-colors-blue-blue-50: #102a56;
+  --color-util-colors-blue-blue-100: #194185;
+  --color-util-colors-blue-blue-200: #1849a9;
+  --color-util-colors-blue-blue-300: #175cd3;
+  --color-util-colors-blue-blue-400: #1570ef;
+  --color-util-colors-blue-blue-500: #2e90fa;
+  --color-util-colors-blue-blue-600: #53b1fd;
+  --color-util-colors-blue-blue-700: #84caff;
+
+  --color-util-colors-blue-light-blue-light-50: #062c41;
+  --color-util-colors-blue-light-blue-light-100: #0b4a6f;
+  --color-util-colors-blue-light-blue-light-200: #065986;
+  --color-util-colors-blue-light-blue-light-300: #026aa2;
+  --color-util-colors-blue-light-blue-light-400: #0086c9;
+  --color-util-colors-blue-light-blue-light-500: #0ba5ec;
+  --color-util-colors-blue-light-blue-light-600: #36bffa;
+  --color-util-colors-blue-light-blue-light-700: #7cd4fd;
+
+  --color-util-colors-gray-blue-gray-blue-50: #0d0f1c;
+  --color-util-colors-gray-blue-gray-blue-100: #101323;
+  --color-util-colors-gray-blue-gray-blue-200: #293056;
+  --color-util-colors-gray-blue-gray-blue-300: #363f72;
+  --color-util-colors-gray-blue-gray-blue-400: #3e4784;
+  --color-util-colors-gray-blue-gray-blue-500: #4e5ba6;
+  --color-util-colors-gray-blue-gray-blue-600: #717bbc;
+  --color-util-colors-gray-blue-gray-blue-700: #b3b8db;
+
+  --color-util-colors-blue-brand-blue-brand-50: #002066;
+  --color-util-colors-blue-brand-blue-brand-100: #00329e;
+  --color-util-colors-blue-brand-blue-brand-200: #003dc1;
+  --color-util-colors-blue-brand-blue-brand-300: #004aeb;
+  --color-util-colors-blue-brand-blue-brand-400: #155aef;
+  --color-util-colors-blue-brand-blue-brand-500: #296dff;
+  --color-util-colors-blue-brand-blue-brand-600: #5289ff;
+  --color-util-colors-blue-brand-blue-brand-700: #84abff;
+
+  --color-util-colors-red-red-50: #55160c;
+  --color-util-colors-red-red-100: #7a271a;
+  --color-util-colors-red-red-200: #912018;
+  --color-util-colors-red-red-300: #b42318;
+  --color-util-colors-red-red-400: #d92d20;
+  --color-util-colors-red-red-500: #f04438;
+  --color-util-colors-red-red-600: #f97066;
+  --color-util-colors-red-red-700: #fda29b;
+
+  --color-util-colors-green-green-50: #053321;
+  --color-util-colors-green-green-100: #074d31;
+  --color-util-colors-green-green-200: #085d3a;
+  --color-util-colors-green-green-300: #067647;
+  --color-util-colors-green-green-400: #079455;
+  --color-util-colors-green-green-500: #17b26a;
+  --color-util-colors-green-green-600: #47cd89;
+  --color-util-colors-green-green-700: #75e0a7;
+
+  --color-util-colors-warning-warning-50: #4e1d09;
+  --color-util-colors-warning-warning-100: #7a2e0e;
+  --color-util-colors-warning-warning-200: #93370d;
+  --color-util-colors-warning-warning-300: #b54708;
+  --color-util-colors-warning-warning-400: #dc6803;
+  --color-util-colors-warning-warning-500: #f79009;
+  --color-util-colors-warning-warning-600: #fdb022;
+  --color-util-colors-warning-warning-700: #fec84b;
+
+  --color-util-colors-yellow-yellow-50: #542c0d;
+  --color-util-colors-yellow-yellow-100: #713b12;
+  --color-util-colors-yellow-yellow-200: #854a0e;
+  --color-util-colors-yellow-yellow-300: #a15c07;
+  --color-util-colors-yellow-yellow-400: #ca8504;
+  --color-util-colors-yellow-yellow-500: #eaaa08;
+  --color-util-colors-yellow-yellow-600: #fac515;
+  --color-util-colors-yellow-yellow-700: #fde272;
+
+  --color-util-colors-teal-teal-50: #0a2926;
+  --color-util-colors-teal-teal-100: #134e48;
+  --color-util-colors-teal-teal-200: #125d56;
+  --color-util-colors-teal-teal-300: #107569;
+  --color-util-colors-teal-teal-400: #0e9384;
+  --color-util-colors-teal-teal-500: #15b79e;
+  --color-util-colors-teal-teal-600: #2ed3b7;
+  --color-util-colors-teal-teal-700: #5fe9d0;
+
+  --color-util-colors-cyan-cyan-50: #0d2d3a;
+  --color-util-colors-cyan-cyan-100: #164c63;
+  --color-util-colors-cyan-cyan-200: #155b75;
+  --color-util-colors-cyan-cyan-300: #0e7090;
+  --color-util-colors-cyan-cyan-400: #088ab2;
+  --color-util-colors-cyan-cyan-500: #06aed4;
+  --color-util-colors-cyan-cyan-600: #22ccee;
+  --color-util-colors-cyan-cyan-700: #67e3f9;
+
+  --color-util-colors-violet-violet-50: #2e125e;
+  --color-util-colors-violet-violet-100: #491c96;
+  --color-util-colors-violet-violet-200: #5720b7;
+  --color-util-colors-violet-violet-300: #6927da;
+  --color-util-colors-violet-violet-400: #7839ee;
+  --color-util-colors-violet-violet-500: #875bf7;
+  --color-util-colors-violet-violet-600: #a48afb;
+  --color-util-colors-violet-violet-700: #c3b5fd;
+
+  --color-util-colors-gray-gray-50: #0c111c;
+  --color-util-colors-gray-gray-100: #101828;
+  --color-util-colors-gray-gray-200: #18222f;
+  --color-util-colors-gray-gray-300: #354052;
+  --color-util-colors-gray-gray-400: #495464;
+  --color-util-colors-gray-gray-500: #676f83;
+  --color-util-colors-gray-gray-600: #98a2b2;
+  --color-util-colors-gray-gray-700: #d0d5dc;
+
+  --color-util-colors-green-light-green-light-50: #15290a;
+  --color-util-colors-green-light-green-light-100: #2b5314;
+  --color-util-colors-green-light-green-light-200: #326212;
+  --color-util-colors-green-light-green-light-300: #3b7c0f;
+  --color-util-colors-green-light-green-light-500: #66c61c;
+  --color-util-colors-green-light-green-light-400: #4ca30d;
+  --color-util-colors-green-light-green-light-600: #85e13a;
+  --color-util-colors-green-light-green-light-700: #a6ef67;
+
+  --color-util-colors-rose-rose-50: #510b24;
+  --color-util-colors-rose-rose-100: #89123e;
+  --color-util-colors-rose-rose-200: #a11043;
+  --color-util-colors-rose-rose-300: #c01048;
+  --color-util-colors-rose-rose-400: #e31b54;
+  --color-util-colors-rose-rose-500: #f63d68;
+  --color-util-colors-rose-rose-600: #fd6f8e;
+  --color-util-colors-rose-rose-700: #fea3b4;
+
+  --color-util-colors-midnight-midnight-50: #171c22;
+  --color-util-colors-midnight-midnight-100: #202431;
+  --color-util-colors-midnight-midnight-200: #2f3648;
+  --color-util-colors-midnight-midnight-300: #3e465e;
+  --color-util-colors-midnight-midnight-400: #5d698d;
+  --color-util-colors-midnight-midnight-500: #828dad;
+  --color-util-colors-midnight-midnight-600: #a7aec5;
+  --color-util-colors-midnight-midnight-700: #c6cbd9;
+
+  --color-third-party-LangChain: #ffffff;
+  --color-third-party-Langfuse: #ffffff;
+  --color-third-party-Github: #ffffff;
+  --color-third-party-Github-tertiary: #c8ceda99;
+  --color-third-party-Github-secondary: #d9d9de;
+  --color-third-party-model-bg-openai: #121212;
+  --color-third-party-model-bg-anthropic: #1d1917;
+  --color-third-party-model-bg-default: #0b0b0e;
+
+  --color-third-party-aws: #141f2e;
+  --color-third-party-aws-alt: #192639;
+
+  --color-saas-background: #0b0b0e;
+  --color-saas-pricing-grid-bg: #c8ceda33;
+
+}
diff --git a/themes/light.css b/themes/light.css
new file mode 100644
index 0000000..1d96658
--- /dev/null
+++ b/themes/light.css
@@ -0,0 +1,739 @@
+/* Attention: Generate by code. Don't update by hand!!! */
+html[data-theme="light"] {
+  --color-components-input-bg-normal: #c8ceda40;
+  --color-components-input-text-placeholder: #98a2b2;
+  --color-components-input-bg-hover: #c8ceda24;
+  --color-components-input-bg-active: #f9fafb;
+  --color-components-input-border-active: #d0d5dc;
+  --color-components-input-border-destructive: #fda29b;
+  --color-components-input-text-filled: #101828;
+  --color-components-input-bg-destructive: #ffffff;
+  --color-components-input-bg-disabled: #c8ceda24;
+  --color-components-input-text-disabled: #d0d5dc;
+  --color-components-input-text-filled-disabled: #676f83;
+  --color-components-input-border-hover: #d0d5dc;
+  --color-components-input-border-active-prompt-1: #0ba5ec;
+  --color-components-input-border-active-prompt-2: #155aef;
+
+  --color-components-kbd-bg-gray: #1018280a;
+  --color-components-kbd-bg-white: #ffffff1f;
+
+  --color-components-tooltip-bg: #fffffff2;
+
+  --color-components-button-primary-text: #ffffff;
+  --color-components-button-primary-bg: #155aef;
+  --color-components-button-primary-border: #1018280a;
+  --color-components-button-primary-bg-hover: #004aeb;
+  --color-components-button-primary-border-hover: #10182814;
+  --color-components-button-primary-bg-disabled: #155aef24;
+  --color-components-button-primary-border-disabled: #ffffff00;
+  --color-components-button-primary-text-disabled: #ffffff99;
+
+  --color-components-button-secondary-text: #354052;
+  --color-components-button-secondary-text-disabled: #10182840;
+  --color-components-button-secondary-bg: #ffffff;
+  --color-components-button-secondary-bg-hover: #f9fafb;
+  --color-components-button-secondary-bg-disabled: #f9fafb;
+  --color-components-button-secondary-border: #10182824;
+  --color-components-button-secondary-border-hover: #10182833;
+  --color-components-button-secondary-border-disabled: #1018280a;
+
+  --color-components-button-tertiary-text: #354052;
+  --color-components-button-tertiary-text-disabled: #10182840;
+  --color-components-button-tertiary-bg: #f2f4f7;
+  --color-components-button-tertiary-bg-hover: #e9ebf0;
+  --color-components-button-tertiary-bg-disabled: #f9fafb;
+
+  --color-components-button-ghost-text: #354052;
+  --color-components-button-ghost-text-disabled: #10182840;
+  --color-components-button-ghost-bg-hover: #c8ceda33;
+
+  --color-components-button-destructive-primary-text: #ffffff;
+  --color-components-button-destructive-primary-text-disabled: #ffffff99;
+  --color-components-button-destructive-primary-bg: #d92d20;
+  --color-components-button-destructive-primary-bg-hover: #b42318;
+  --color-components-button-destructive-primary-bg-disabled: #fee4e2;
+  --color-components-button-destructive-primary-border: #18181b0a;
+  --color-components-button-destructive-primary-border-hover: #18181b14;
+  --color-components-button-destructive-primary-border-disabled: #ffffff00;
+
+  --color-components-button-destructive-secondary-text: #d92d20;
+  --color-components-button-destructive-secondary-text-disabled: #f0443833;
+  --color-components-button-destructive-secondary-bg: #ffffff;
+  --color-components-button-destructive-secondary-bg-hover: #fef3f2;
+  --color-components-button-destructive-secondary-bg-disabled: #fef3f2;
+  --color-components-button-destructive-secondary-border: #18181b14;
+  --color-components-button-destructive-secondary-border-hover: #f0443840;
+  --color-components-button-destructive-secondary-border-disabled: #f044380a;
+
+  --color-components-button-destructive-tertiary-text: #d92d20;
+  --color-components-button-destructive-tertiary-text-disabled: #f0443833;
+  --color-components-button-destructive-tertiary-bg: #fee4e2;
+  --color-components-button-destructive-tertiary-bg-hover: #fecdca;
+  --color-components-button-destructive-tertiary-bg-disabled: #f044380a;
+
+  --color-components-button-destructive-ghost-text: #d92d20;
+  --color-components-button-destructive-ghost-text-disabled: #f0443833;
+  --color-components-button-destructive-ghost-bg-hover: #fee4e2;
+
+  --color-components-button-secondary-accent-text: #155aef;
+  --color-components-button-secondary-accent-text-disabled: #b2caff;
+  --color-components-button-secondary-accent-bg: #ffffff;
+  --color-components-button-secondary-accent-bg-hover: #f2f4f7;
+  --color-components-button-secondary-accent-bg-disabled: #f9fafb;
+  --color-components-button-secondary-accent-border: #10182824;
+  --color-components-button-secondary-accent-border-hover: #10182824;
+  --color-components-button-secondary-accent-border-disabled: #1018280a;
+
+  --color-components-button-indigo-bg: #444ce7;
+  --color-components-button-indigo-bg-hover: #3538cd;
+  --color-components-button-indigo-bg-disabled: #6172f324;
+
+  --color-components-checkbox-icon: #ffffff;
+  --color-components-checkbox-icon-disabled: #ffffff80;
+  --color-components-checkbox-bg: #155aef;
+  --color-components-checkbox-bg-hover: #004aeb;
+  --color-components-checkbox-bg-disabled: #f2f4f7;
+  --color-components-checkbox-border: #d0d5dc;
+  --color-components-checkbox-border-hover: #98a2b2;
+  --color-components-checkbox-border-disabled: #18181b0a;
+  --color-components-checkbox-bg-unchecked: #ffffff;
+  --color-components-checkbox-bg-unchecked-hover: #ffffff;
+  --color-components-checkbox-bg-disabled-checked: #b2caff;
+
+  --color-components-radio-border-checked: #155aef;
+  --color-components-radio-border-checked-hover: #004aeb;
+  --color-components-radio-border-checked-disabled: #b2caff;
+  --color-components-radio-bg-disabled: #ffffff00;
+  --color-components-radio-border: #d0d5dc;
+  --color-components-radio-border-hover: #98a2b2;
+  --color-components-radio-border-disabled: #18181b0a;
+  --color-components-radio-bg: #ffffff00;
+  --color-components-radio-bg-hover: #ffffff00;
+
+  --color-components-toggle-knob: #ffffff;
+  --color-components-toggle-knob-disabled: #fffffff2;
+  --color-components-toggle-bg: #155aef;
+  --color-components-toggle-bg-hover: #004aeb;
+  --color-components-toggle-bg-disabled: #d1e0ff;
+  --color-components-toggle-bg-unchecked: #e9ebf0;
+  --color-components-toggle-bg-unchecked-hover: #d0d5dc;
+  --color-components-toggle-bg-unchecked-disabled: #f2f4f7;
+  --color-components-toggle-knob-hover: #ffffff;
+
+  --color-components-card-bg: #fcfcfd;
+  --color-components-card-border: #ffffff;
+  --color-components-card-bg-alt: #ffffff;
+
+  --color-components-menu-item-text: #495464;
+  --color-components-menu-item-text-active: #18222f;
+  --color-components-menu-item-text-hover: #354052;
+  --color-components-menu-item-text-active-accent: #18222f;
+
+  --color-components-panel-bg: #ffffff;
+  --color-components-panel-bg-blur: #fffffff2;
+  --color-components-panel-border: #10182814;
+  --color-components-panel-border-subtle: #10182814;
+  --color-components-panel-gradient-2: #f9fafb;
+  --color-components-panel-gradient-1: #ffffff;
+  --color-components-panel-bg-alt: #f9fafb;
+  --color-components-panel-on-panel-item-bg: #ffffff;
+  --color-components-panel-on-panel-item-bg-hover: #f9fafb;
+  --color-components-panel-on-panel-item-bg-alt: #f9fafb;
+  --color-components-panel-on-panel-item-bg-transparent: #fffffff2;
+  --color-components-panel-on-panel-item-bg-hover-transparent: #f9fafb00;
+  --color-components-panel-on-panel-item-bg-destructive-hover-transparent: #fef3f200;
+
+  --color-components-panel-bg-transparent: #ffffff00;
+
+  --color-components-main-nav-nav-button-text: #495464;
+  --color-components-main-nav-nav-button-text-active: #155aef;
+  --color-components-main-nav-nav-button-bg: #ffffff00;
+  --color-components-main-nav-nav-button-bg-active: #fcfcfd;
+  --color-components-main-nav-nav-button-border: #fffffff2;
+  --color-components-main-nav-nav-button-bg-hover: #1018280a;
+
+  --color-components-main-nav-nav-user-border: #ffffff;
+
+  --color-components-slider-knob: #ffffff;
+  --color-components-slider-knob-hover: #ffffff;
+  --color-components-slider-knob-disabled: #fffffff2;
+  --color-components-slider-range: #296dff;
+  --color-components-slider-track: #e9ebf0;
+  --color-components-slider-knob-border-hover: #10182833;
+  --color-components-slider-knob-border: #10182824;
+
+  --color-components-segmented-control-item-active-bg: #ffffff;
+  --color-components-segmented-control-item-active-border: #ffffff;
+  --color-components-segmented-control-bg-normal: #c8ceda33;
+  --color-components-segmented-control-item-active-accent-bg: #ffffff;
+  --color-components-segmented-control-item-active-accent-border: #ffffff;
+
+  --color-components-option-card-option-bg: #fcfcfd;
+  --color-components-option-card-option-selected-bg: #ffffff;
+  --color-components-option-card-option-selected-border: #296dff;
+  --color-components-option-card-option-border: #e9ebf0;
+  --color-components-option-card-option-bg-hover: #ffffff;
+  --color-components-option-card-option-border-hover: #d0d5dc;
+
+  --color-components-tab-active: #155aef;
+
+  --color-components-badge-white-to-dark: #ffffff;
+  --color-components-badge-status-light-success-bg: #47cd89;
+  --color-components-badge-status-light-success-border-inner: #17b26a;
+  --color-components-badge-status-light-success-halo: #17b26a40;
+
+  --color-components-badge-status-light-border-outer: #ffffff;
+  --color-components-badge-status-light-high-light: #ffffff4d;
+  --color-components-badge-status-light-warning-bg: #fdb022;
+  --color-components-badge-status-light-warning-border-inner: #f79009;
+  --color-components-badge-status-light-warning-halo: #f7900940;
+
+  --color-components-badge-status-light-error-bg: #f97066;
+  --color-components-badge-status-light-error-border-inner: #f04438;
+  --color-components-badge-status-light-error-halo: #f0443840;
+
+  --color-components-badge-status-light-normal-bg: #36bffa;
+  --color-components-badge-status-light-normal-border-inner: #0ba5ec;
+  --color-components-badge-status-light-normal-halo: #0ba5ec40;
+
+  --color-components-badge-status-light-disabled-bg: #98a2b2;
+  --color-components-badge-status-light-disabled-border-inner: #676f83;
+  --color-components-badge-status-light-disabled-halo: #1018280a;
+
+  --color-components-badge-bg-green-soft: #17b26a14;
+  --color-components-badge-bg-orange-soft: #f7900914;
+  --color-components-badge-bg-red-soft: #f0443814;
+  --color-components-badge-bg-blue-light-soft: #0ba5ec14;
+  --color-components-badge-bg-gray-soft: #1018280a;
+  --color-components-badge-bg-dimm: #ffffff0d;
+
+  --color-components-chart-line: #296dff;
+  --color-components-chart-area-1: #155aef24;
+  --color-components-chart-area-2: #155aef0a;
+  --color-components-chart-current-1: #155aef;
+  --color-components-chart-current-2: #d1e0ff;
+  --color-components-chart-bg: #ffffff;
+
+  --color-components-actionbar-bg: #fffffff2;
+  --color-components-actionbar-border: #1018280a;
+  --color-components-actionbar-bg-accent: #f5f7ff;
+  --color-components-actionbar-border-accent: #b2caff;
+
+  --color-components-dropzone-bg-alt: #f2f4f7;
+  --color-components-dropzone-bg: #f9fafb;
+  --color-components-dropzone-bg-accent: #155aef24;
+  --color-components-dropzone-border: #10182814;
+  --color-components-dropzone-border-alt: #10182833;
+  --color-components-dropzone-border-accent: #84abff;
+
+  --color-components-progress-brand-progress: #296dff;
+  --color-components-progress-brand-border: #296dff;
+  --color-components-progress-brand-bg: #155aef0a;
+
+  --color-components-progress-white-progress: #ffffff;
+  --color-components-progress-white-border: #fffffff2;
+  --color-components-progress-white-bg: #ffffff03;
+
+  --color-components-progress-gray-progress: #98a2b2;
+  --color-components-progress-gray-border: #98a2b2;
+  --color-components-progress-gray-bg: #c8ceda05;
+
+  --color-components-progress-warning-progress: #f79009;
+  --color-components-progress-warning-border: #f79009;
+  --color-components-progress-warning-bg: #f790090a;
+
+  --color-components-progress-error-progress: #f04438;
+  --color-components-progress-error-border: #f04438;
+  --color-components-progress-error-bg: #f044380a;
+
+  --color-components-chat-input-audio-bg: #eff4ff;
+  --color-components-chat-input-audio-wave-default: #155aef33;
+  --color-components-chat-input-bg-mask-1: #ffffff03;
+  --color-components-chat-input-bg-mask-2: #f2f4f7;
+  --color-components-chat-input-border: #ffffff;
+  --color-components-chat-input-audio-wave-active: #296dff;
+  --color-components-chat-input-audio-bg-alt: #fcfcfd;
+
+  --color-components-avatar-shape-fill-stop-0: #ffffff;
+  --color-components-avatar-shape-fill-stop-100: #ffffffe6;
+
+  --color-components-avatar-bg-mask-stop-0: #ffffff1f;
+  --color-components-avatar-bg-mask-stop-100: #ffffff14;
+
+  --color-components-avatar-default-avatar-bg: #d0d5dc;
+  --color-components-avatar-mask-darkmode-dimmed: #ffffff00;
+
+  --color-components-label-gray: #f2f4f7;
+
+  --color-components-premium-badge-blue-bg-stop-0: #5289ff;
+  --color-components-premium-badge-blue-bg-stop-100: #155aef;
+  --color-components-premium-badge-blue-stroke-stop-0: #fffffff2;
+  --color-components-premium-badge-blue-stroke-stop-100: #155aef;
+  --color-components-premium-badge-blue-text-stop-0: #f5f7ff;
+  --color-components-premium-badge-blue-text-stop-100: #d1e0ff;
+  --color-components-premium-badge-blue-glow: #00329e;
+  --color-components-premium-badge-blue-bg-stop-0-hover: #296dff;
+  --color-components-premium-badge-blue-bg-stop-100-hover: #004aeb;
+  --color-components-premium-badge-blue-glow-hover: #84abff;
+  --color-components-premium-badge-blue-stroke-stop-0-hover: #fffffff2;
+  --color-components-premium-badge-blue-stroke-stop-100-hover: #00329e;
+
+  --color-components-premium-badge-highlight-stop-0: #ffffff1f;
+  --color-components-premium-badge-highlight-stop-100: #ffffff4d;
+  --color-components-premium-badge-indigo-bg-stop-0: #8098f9;
+  --color-components-premium-badge-indigo-bg-stop-100: #444ce7;
+  --color-components-premium-badge-indigo-stroke-stop-0: #fffffff2;
+  --color-components-premium-badge-indigo-stroke-stop-100: #6172f3;
+  --color-components-premium-badge-indigo-text-stop-0: #f5f8ff;
+  --color-components-premium-badge-indigo-text-stop-100: #e0eaff;
+  --color-components-premium-badge-indigo-glow: #2d3282;
+  --color-components-premium-badge-indigo-glow-hover: #a4bcfd;
+  --color-components-premium-badge-indigo-bg-stop-0-hover: #6172f3;
+  --color-components-premium-badge-indigo-bg-stop-100-hover: #2d31a6;
+  --color-components-premium-badge-indigo-stroke-stop-0-hover: #fffffff2;
+  --color-components-premium-badge-indigo-stroke-stop-100-hover: #2d31a6;
+
+  --color-components-premium-badge-grey-bg-stop-0: #98a2b2;
+  --color-components-premium-badge-grey-bg-stop-100: #676f83;
+  --color-components-premium-badge-grey-stroke-stop-0: #fffffff2;
+  --color-components-premium-badge-grey-stroke-stop-100: #676f83;
+  --color-components-premium-badge-grey-text-stop-0: #fcfcfd;
+  --color-components-premium-badge-grey-text-stop-100: #f2f4f7;
+  --color-components-premium-badge-grey-glow: #101828;
+  --color-components-premium-badge-grey-glow-hover: #d0d5dc;
+  --color-components-premium-badge-grey-bg-stop-0-hover: #676f83;
+  --color-components-premium-badge-grey-bg-stop-100-hover: #354052;
+  --color-components-premium-badge-grey-stroke-stop-0-hover: #fffffff2;
+  --color-components-premium-badge-grey-stroke-stop-100-hover: #354052;
+
+  --color-components-premium-badge-orange-bg-stop-0: #ff692e;
+  --color-components-premium-badge-orange-bg-stop-100: #e04f16;
+  --color-components-premium-badge-orange-stroke-stop-0: #fffffff2;
+  --color-components-premium-badge-orange-stroke-stop-100: #e62e05;
+  --color-components-premium-badge-orange-text-stop-0: #fefaf5;
+  --color-components-premium-badge-orange-text-stop-100: #fdead7;
+  --color-components-premium-badge-orange-glow: #772917;
+  --color-components-premium-badge-orange-glow-hover: #f7b27a;
+  --color-components-premium-badge-orange-bg-stop-0-hover: #ff4405;
+  --color-components-premium-badge-orange-bg-stop-100-hover: #b93815;
+  --color-components-premium-badge-orange-stroke-stop-0-hover: #fffffff2;
+  --color-components-premium-badge-orange-stroke-stop-100-hover: #bc1b06;
+
+  --color-components-progress-bar-bg: #155aef0a;
+  --color-components-progress-bar-progress: #155aef24;
+  --color-components-progress-bar-border: #1018280a;
+  --color-components-progress-bar-progress-solid: #296dff;
+  --color-components-progress-bar-progress-highlight: #155aef33;
+
+  --color-components-icon-bg-red-solid: #d92d20;
+  --color-components-icon-bg-rose-solid: #e31b54;
+  --color-components-icon-bg-pink-solid: #dd2590;
+  --color-components-icon-bg-orange-dark-solid: #ff4405;
+  --color-components-icon-bg-yellow-solid: #eaaa08;
+  --color-components-icon-bg-green-solid: #4ca30d;
+  --color-components-icon-bg-teal-solid: #0e9384;
+  --color-components-icon-bg-blue-light-solid: #0ba5ec;
+  --color-components-icon-bg-blue-solid: #155aef;
+  --color-components-icon-bg-indigo-solid: #444ce7;
+  --color-components-icon-bg-violet-solid: #7839ee;
+  --color-components-icon-bg-midnight-solid: #828dad;
+  --color-components-icon-bg-rose-soft: #fff1f3;
+  --color-components-icon-bg-pink-soft: #fdf2fa;
+  --color-components-icon-bg-orange-dark-soft: #fff4ed;
+  --color-components-icon-bg-yellow-soft: #fefbe8;
+  --color-components-icon-bg-green-soft: #f3fee7;
+  --color-components-icon-bg-teal-soft: #f0fdf9;
+  --color-components-icon-bg-blue-light-soft: #f0f9ff;
+  --color-components-icon-bg-blue-soft: #eff4ff;
+  --color-components-icon-bg-indigo-soft: #eef4ff;
+  --color-components-icon-bg-violet-soft: #f5f3ff;
+  --color-components-icon-bg-midnight-soft: #f0f2f5;
+  --color-components-icon-bg-red-soft: #fef3f2;
+  --color-components-icon-bg-orange-solid: #f79009;
+  --color-components-icon-bg-orange-soft: #fffaeb;
+
+  --color-text-primary: #101828;
+  --color-text-secondary: #354052;
+  --color-text-tertiary: #676f83;
+  --color-text-quaternary: #1018284d;
+  --color-text-destructive: #d92d20;
+  --color-text-success: #079455;
+  --color-text-warning: #dc6803;
+  --color-text-destructive-secondary: #f04438;
+  --color-text-success-secondary: #17b26a;
+  --color-text-warning-secondary: #f79009;
+  --color-text-accent: #155aef;
+  --color-text-primary-on-surface: #ffffff;
+  --color-text-placeholder: #98a2b2;
+  --color-text-disabled: #d0d5dc;
+  --color-text-accent-secondary: #296dff;
+  --color-text-accent-light-mode-only: #155aef;
+  --color-text-text-selected: #155aef24;
+  --color-text-secondary-on-surface: #ffffffe6;
+  --color-text-logo-text: #18222f;
+  --color-text-empty-state-icon: #d0d5dc;
+  --color-text-inverted: #000000;
+  --color-text-inverted-dimmed: #000000f2;
+
+  --color-background-body: #f2f4f7;
+  --color-background-default-subtle: #fcfcfd;
+  --color-background-neutral-subtle: #f9fafb;
+  --color-background-sidenav-bg: #ffffffcc;
+  --color-background-default: #ffffff;
+  --color-background-soft: #f9fafb;
+  --color-background-gradient-bg-fill-chat-bg-1: #f9fafb;
+  --color-background-gradient-bg-fill-chat-bg-2: #f2f4f7;
+  --color-background-gradient-bg-fill-chat-bubble-bg-1: #ffffff;
+  --color-background-gradient-bg-fill-chat-bubble-bg-2: #ffffff99;
+  --color-background-gradient-bg-fill-debug-bg-1: #ffffff00;
+  --color-background-gradient-bg-fill-debug-bg-2: #c8ceda24;
+
+  --color-background-gradient-mask-gray: #c8ceda33;
+  --color-background-gradient-mask-transparent: #ffffff00;
+  --color-background-gradient-mask-input-clear-2: #e9ebf000;
+  --color-background-gradient-mask-input-clear-1: #e9ebf0;
+  --color-background-gradient-mask-transparent-dark: #00000000;
+  --color-background-gradient-mask-side-panel-2: #1018284d;
+  --color-background-gradient-mask-side-panel-1: #10182805;
+
+  --color-background-default-burn: #e9ebf0;
+  --color-background-overlay-fullscreen: #f9fafbf2;
+  --color-background-default-lighter: #ffffff80;
+  --color-background-section: #f9fafb;
+  --color-background-interaction-from-bg-1: #c8ceda33;
+  --color-background-interaction-from-bg-2: #c8ceda24;
+  --color-background-section-burn: #f2f4f7;
+  --color-background-default-dodge: #ffffff;
+  --color-background-overlay: #10182899;
+  --color-background-default-dimmed: #e9ebf0;
+  --color-background-default-hover: #f9fafb;
+  --color-background-overlay-alt: #10182866;
+  --color-background-surface-white: #fffffff2;
+  --color-background-overlay-destructive: #f044384d;
+  --color-background-overlay-backdrop: #f2f4f7f2;
+
+  --color-shadow-shadow-1: #09090b08;
+  --color-shadow-shadow-3: #09090b0d;
+  --color-shadow-shadow-4: #09090b0f;
+  --color-shadow-shadow-5: #09090b14;
+  --color-shadow-shadow-6: #09090b1a;
+  --color-shadow-shadow-7: #09090b1f;
+  --color-shadow-shadow-8: #09090b24;
+  --color-shadow-shadow-9: #09090b2e;
+  --color-shadow-shadow-2: #09090b0a;
+  --color-shadow-shadow-10: #09090b0d;
+
+  --color-workflow-block-border: #ffffff;
+  --color-workflow-block-parma-bg: #f2f4f7;
+  --color-workflow-block-bg: #fcfcfd;
+  --color-workflow-block-bg-transparent: #fcfcfde6;
+  --color-workflow-block-border-highlight: #155aef24;
+
+  --color-workflow-canvas-workflow-dot-color: #8585ad26;
+  --color-workflow-canvas-workflow-bg: #f2f4f7;
+
+  --color-workflow-link-line-active: #296dff;
+  --color-workflow-link-line-normal: #d0d5dc;
+  --color-workflow-link-line-handle: #296dff;
+  --color-workflow-link-line-normal-transparent: #d0d5dc33;
+  --color-workflow-link-line-failure-active: #f79009;
+  --color-workflow-link-line-failure-handle: #f79009;
+  --color-workflow-link-line-failure-button-bg: #dc6803;
+  --color-workflow-link-line-failure-button-hover: #b54708;
+
+  --color-workflow-link-line-success-active: #17b26a;
+  --color-workflow-link-line-success-handle: #17b26a;
+
+  --color-workflow-link-line-error-active: #f04438;
+  --color-workflow-link-line-error-handle: #f04438;
+
+  --color-workflow-minimap-bg: #e9ebf0;
+  --color-workflow-minimap-block: #c8ceda4d;
+
+  --color-workflow-display-success-bg: #ecfdf3;
+  --color-workflow-display-success-border-1: #17b26acc;
+  --color-workflow-display-success-border-2: #17b26a80;
+  --color-workflow-display-success-vignette-color: #17b26a33;
+  --color-workflow-display-success-bg-line-pattern: #17b26a4d;
+
+  --color-workflow-display-glass-1: #ffffff1f;
+  --color-workflow-display-glass-2: #ffffff80;
+  --color-workflow-display-vignette-dark: #0000001f;
+  --color-workflow-display-highlight: #ffffff80;
+  --color-workflow-display-outline: #0000000d;
+  --color-workflow-display-error-bg: #fef3f2;
+  --color-workflow-display-error-bg-line-pattern: #f044384d;
+  --color-workflow-display-error-border-1: #f04438cc;
+  --color-workflow-display-error-border-2: #f0443880;
+  --color-workflow-display-error-vignette-color: #f0443833;
+
+  --color-workflow-display-warning-bg: #fffaeb;
+  --color-workflow-display-warning-bg-line-pattern: #f790094d;
+  --color-workflow-display-warning-border-1: #f79009cc;
+  --color-workflow-display-warning-border-2: #f7900980;
+  --color-workflow-display-warning-vignette-color: #f7900933;
+
+  --color-workflow-display-normal-bg: #f0f9ff;
+  --color-workflow-display-normal-bg-line-pattern: #0ba5ec4d;
+  --color-workflow-display-normal-border-1: #0ba5eccc;
+  --color-workflow-display-normal-border-2: #0ba5ec80;
+  --color-workflow-display-normal-vignette-color: #0ba5ec33;
+
+  --color-workflow-display-disabled-bg: #f9fafb;
+  --color-workflow-display-disabled-bg-line-pattern: #c8ceda4d;
+  --color-workflow-display-disabled-border-1: #c8ceda99;
+  --color-workflow-display-disabled-border-2: #c8ceda66;
+  --color-workflow-display-disabled-vignette-color: #c8ceda66;
+  --color-workflow-display-disabled-outline: #00000000;
+
+  --color-workflow-workflow-progress-bg-1: #c8ceda33;
+  --color-workflow-workflow-progress-bg-2: #c8ceda0a;
+
+  --color-divider-subtle: #1018280a;
+  --color-divider-regular: #10182814;
+  --color-divider-deep: #10182824;
+  --color-divider-burn: #1018280a;
+  --color-divider-intense: #1018284d;
+  --color-divider-solid: #d0d5dc;
+  --color-divider-solid-alt: #98a2b2;
+
+  --color-state-base-hover: #c8ceda33;
+  --color-state-base-active: #c8ceda66;
+  --color-state-base-hover-alt: #c8ceda66;
+  --color-state-base-handle: #10182833;
+  --color-state-base-handle-hover: #1018284d;
+  --color-state-base-hover-subtle: #c8ceda14;
+
+  --color-state-accent-hover: #eff4ff;
+  --color-state-accent-active: #155aef14;
+  --color-state-accent-hover-alt: #d1e0ff;
+  --color-state-accent-solid: #296dff;
+  --color-state-accent-active-alt: #155aef24;
+
+  --color-state-destructive-hover: #fef3f2;
+  --color-state-destructive-hover-alt: #fee4e2;
+  --color-state-destructive-active: #fecdca;
+  --color-state-destructive-solid: #f04438;
+  --color-state-destructive-border: #fda29b;
+
+  --color-state-success-hover: #ecfdf3;
+  --color-state-success-hover-alt: #dcfae6;
+  --color-state-success-active: #abefc6;
+  --color-state-success-solid: #17b26a;
+
+  --color-state-warning-hover: #fffaeb;
+  --color-state-warning-hover-alt: #fef0c7;
+  --color-state-warning-active: #fedf89;
+  --color-state-warning-solid: #f79009;
+
+  --color-effects-highlight: #ffffff;
+  --color-effects-highlight-lightmode-off: #ffffff00;
+  --color-effects-image-frame: #ffffff;
+
+  --color-util-colors-orange-dark-orange-dark-50: #fff4ed;
+  --color-util-colors-orange-dark-orange-dark-100: #ffe6d5;
+  --color-util-colors-orange-dark-orange-dark-200: #ffd6ae;
+  --color-util-colors-orange-dark-orange-dark-300: #ff9c66;
+  --color-util-colors-orange-dark-orange-dark-400: #ff692e;
+  --color-util-colors-orange-dark-orange-dark-500: #ff4405;
+  --color-util-colors-orange-dark-orange-dark-600: #e62e05;
+  --color-util-colors-orange-dark-orange-dark-700: #bc1b06;
+
+  --color-util-colors-orange-orange-50: #fef6ee;
+  --color-util-colors-orange-orange-100: #fdead7;
+  --color-util-colors-orange-orange-200: #f9dbaf;
+  --color-util-colors-orange-orange-300: #f7b27a;
+  --color-util-colors-orange-orange-400: #f38744;
+  --color-util-colors-orange-orange-500: #ef6820;
+  --color-util-colors-orange-orange-600: #e04f16;
+  --color-util-colors-orange-orange-700: #b93815;
+  --color-util-colors-orange-orange-100-transparent: #fdead700;
+
+  --color-util-colors-pink-pink-50: #fdf2fa;
+  --color-util-colors-pink-pink-100: #fce7f6;
+  --color-util-colors-pink-pink-200: #fcceee;
+  --color-util-colors-pink-pink-300: #faa7e0;
+  --color-util-colors-pink-pink-400: #f670c7;
+  --color-util-colors-pink-pink-500: #ee46bc;
+  --color-util-colors-pink-pink-600: #dd2590;
+  --color-util-colors-pink-pink-700: #c11574;
+
+  --color-util-colors-fuchsia-fuchsia-50: #fdf4ff;
+  --color-util-colors-fuchsia-fuchsia-100: #fbe8ff;
+  --color-util-colors-fuchsia-fuchsia-200: #f6d0fe;
+  --color-util-colors-fuchsia-fuchsia-300: #eeaafd;
+  --color-util-colors-fuchsia-fuchsia-400: #e478fa;
+  --color-util-colors-fuchsia-fuchsia-500: #d444f1;
+  --color-util-colors-fuchsia-fuchsia-600: #ba24d5;
+  --color-util-colors-fuchsia-fuchsia-700: #9f1ab1;
+
+  --color-util-colors-purple-purple-50: #f4f3ff;
+  --color-util-colors-purple-purple-100: #ebe9fe;
+  --color-util-colors-purple-purple-200: #d9d6fe;
+  --color-util-colors-purple-purple-300: #bdb4fe;
+  --color-util-colors-purple-purple-400: #9b8afb;
+  --color-util-colors-purple-purple-500: #7a5af8;
+  --color-util-colors-purple-purple-600: #6938ef;
+  --color-util-colors-purple-purple-700: #5925dc;
+
+  --color-util-colors-indigo-indigo-50: #eef4ff;
+  --color-util-colors-indigo-indigo-100: #e0eaff;
+  --color-util-colors-indigo-indigo-200: #c7d7fe;
+  --color-util-colors-indigo-indigo-300: #a4bcfd;
+  --color-util-colors-indigo-indigo-400: #8098f9;
+  --color-util-colors-indigo-indigo-500: #6172f3;
+  --color-util-colors-indigo-indigo-600: #444ce7;
+  --color-util-colors-indigo-indigo-700: #3538cd;
+
+  --color-util-colors-blue-blue-50: #eff8ff;
+  --color-util-colors-blue-blue-100: #d1e9ff;
+  --color-util-colors-blue-blue-200: #b2ddff;
+  --color-util-colors-blue-blue-300: #84caff;
+  --color-util-colors-blue-blue-400: #53b1fd;
+  --color-util-colors-blue-blue-500: #2e90fa;
+  --color-util-colors-blue-blue-600: #1570ef;
+  --color-util-colors-blue-blue-700: #175cd3;
+
+  --color-util-colors-blue-light-blue-light-50: #f0f9ff;
+  --color-util-colors-blue-light-blue-light-100: #e0f2fe;
+  --color-util-colors-blue-light-blue-light-200: #b9e6fe;
+  --color-util-colors-blue-light-blue-light-300: #7cd4fd;
+  --color-util-colors-blue-light-blue-light-400: #36bffa;
+  --color-util-colors-blue-light-blue-light-500: #0ba5ec;
+  --color-util-colors-blue-light-blue-light-600: #0086c9;
+  --color-util-colors-blue-light-blue-light-700: #026aa2;
+
+  --color-util-colors-gray-blue-gray-blue-50: #f8f9fc;
+  --color-util-colors-gray-blue-gray-blue-100: #eaecf5;
+  --color-util-colors-gray-blue-gray-blue-200: #d5d9eb;
+  --color-util-colors-gray-blue-gray-blue-300: #b3b8db;
+  --color-util-colors-gray-blue-gray-blue-400: #717bbc;
+  --color-util-colors-gray-blue-gray-blue-500: #4e5ba6;
+  --color-util-colors-gray-blue-gray-blue-600: #3e4784;
+  --color-util-colors-gray-blue-gray-blue-700: #363f72;
+
+  --color-util-colors-blue-brand-blue-brand-50: #f5f7ff;
+  --color-util-colors-blue-brand-blue-brand-100: #d1e0ff;
+  --color-util-colors-blue-brand-blue-brand-200: #b2caff;
+  --color-util-colors-blue-brand-blue-brand-300: #84abff;
+  --color-util-colors-blue-brand-blue-brand-400: #5289ff;
+  --color-util-colors-blue-brand-blue-brand-500: #296dff;
+  --color-util-colors-blue-brand-blue-brand-600: #155aef;
+  --color-util-colors-blue-brand-blue-brand-700: #004aeb;
+
+  --color-util-colors-red-red-50: #fef3f2;
+  --color-util-colors-red-red-100: #fee4e2;
+  --color-util-colors-red-red-200: #fecdca;
+  --color-util-colors-red-red-300: #fda29b;
+  --color-util-colors-red-red-400: #f97066;
+  --color-util-colors-red-red-500: #f04438;
+  --color-util-colors-red-red-600: #d92d20;
+  --color-util-colors-red-red-700: #b42318;
+
+  --color-util-colors-green-green-50: #ecfdf3;
+  --color-util-colors-green-green-100: #dcfae6;
+  --color-util-colors-green-green-200: #abefc6;
+  --color-util-colors-green-green-300: #75e0a7;
+  --color-util-colors-green-green-400: #47cd89;
+  --color-util-colors-green-green-500: #17b26a;
+  --color-util-colors-green-green-600: #079455;
+  --color-util-colors-green-green-700: #067647;
+
+  --color-util-colors-warning-warning-50: #fffaeb;
+  --color-util-colors-warning-warning-100: #fef0c7;
+  --color-util-colors-warning-warning-200: #fedf89;
+  --color-util-colors-warning-warning-300: #fec84b;
+  --color-util-colors-warning-warning-400: #fdb022;
+  --color-util-colors-warning-warning-500: #f79009;
+  --color-util-colors-warning-warning-600: #dc6803;
+  --color-util-colors-warning-warning-700: #b54708;
+
+  --color-util-colors-yellow-yellow-50: #fefbe8;
+  --color-util-colors-yellow-yellow-100: #fef7c3;
+  --color-util-colors-yellow-yellow-200: #feee95;
+  --color-util-colors-yellow-yellow-300: #fde272;
+  --color-util-colors-yellow-yellow-400: #fac515;
+  --color-util-colors-yellow-yellow-500: #eaaa08;
+  --color-util-colors-yellow-yellow-600: #ca8504;
+  --color-util-colors-yellow-yellow-700: #a15c07;
+
+  --color-util-colors-teal-teal-50: #f0fdf9;
+  --color-util-colors-teal-teal-100: #ccfbef;
+  --color-util-colors-teal-teal-200: #99f6e0;
+  --color-util-colors-teal-teal-300: #5fe9d0;
+  --color-util-colors-teal-teal-400: #2ed3b7;
+  --color-util-colors-teal-teal-500: #15b79e;
+  --color-util-colors-teal-teal-600: #0e9384;
+  --color-util-colors-teal-teal-700: #107569;
+
+  --color-util-colors-cyan-cyan-50: #ecfdff;
+  --color-util-colors-cyan-cyan-100: #cff9fe;
+  --color-util-colors-cyan-cyan-200: #a5f0fc;
+  --color-util-colors-cyan-cyan-300: #67e3f9;
+  --color-util-colors-cyan-cyan-400: #22ccee;
+  --color-util-colors-cyan-cyan-500: #06aed4;
+  --color-util-colors-cyan-cyan-600: #088ab2;
+  --color-util-colors-cyan-cyan-700: #0e7090;
+
+  --color-util-colors-violet-violet-50: #f5f3ff;
+  --color-util-colors-violet-violet-100: #ece9fe;
+  --color-util-colors-violet-violet-200: #ddd6fe;
+  --color-util-colors-violet-violet-300: #c3b5fd;
+  --color-util-colors-violet-violet-400: #a48afb;
+  --color-util-colors-violet-violet-500: #875bf7;
+  --color-util-colors-violet-violet-600: #7839ee;
+  --color-util-colors-violet-violet-700: #6927da;
+
+  --color-util-colors-gray-gray-50: #f9fafb;
+  --color-util-colors-gray-gray-100: #f2f4f7;
+  --color-util-colors-gray-gray-200: #e9ebf0;
+  --color-util-colors-gray-gray-300: #d0d5dc;
+  --color-util-colors-gray-gray-400: #98a2b2;
+  --color-util-colors-gray-gray-500: #676f83;
+  --color-util-colors-gray-gray-600: #495464;
+  --color-util-colors-gray-gray-700: #354052;
+
+  --color-util-colors-green-light-green-light-50: #f3fee7;
+  --color-util-colors-green-light-green-light-100: #e3fbcc;
+  --color-util-colors-green-light-green-light-200: #d0f8ab;
+  --color-util-colors-green-light-green-light-300: #a6ef67;
+  --color-util-colors-green-light-green-light-500: #66c61c;
+  --color-util-colors-green-light-green-light-400: #85e13a;
+  --color-util-colors-green-light-green-light-600: #4ca30d;
+  --color-util-colors-green-light-green-light-700: #3b7c0f;
+
+  --color-util-colors-rose-rose-50: #fff1f3;
+  --color-util-colors-rose-rose-100: #ffe4e8;
+  --color-util-colors-rose-rose-200: #fecdd6;
+  --color-util-colors-rose-rose-300: #fea3b4;
+  --color-util-colors-rose-rose-400: #fd6f8e;
+  --color-util-colors-rose-rose-500: #f63d68;
+  --color-util-colors-rose-rose-600: #e31b54;
+  --color-util-colors-rose-rose-700: #c01048;
+
+  --color-util-colors-midnight-midnight-50: #fbfbfc;
+  --color-util-colors-midnight-midnight-100: #f0f2f5;
+  --color-util-colors-midnight-midnight-200: #dfe1ea;
+  --color-util-colors-midnight-midnight-300: #c6cbd9;
+  --color-util-colors-midnight-midnight-400: #a7aec5;
+  --color-util-colors-midnight-midnight-500: #828dad;
+  --color-util-colors-midnight-midnight-600: #5d698d;
+  --color-util-colors-midnight-midnight-700: #3e465e;
+
+  --color-third-party-LangChain: #1c3c3c;
+  --color-third-party-Langfuse: #000000;
+  --color-third-party-Github: #1b1f24;
+  --color-third-party-Github-tertiary: #1b1f24;
+  --color-third-party-Github-secondary: #1b1f24;
+  --color-third-party-model-bg-openai: #e3e5e8;
+  --color-third-party-model-bg-anthropic: #eeede7;
+  --color-third-party-model-bg-default: #f9fafb;
+
+  --color-third-party-aws: #141f2e;
+  --color-third-party-aws-alt: #0f1824;
+
+  --color-saas-background: #fcfcfd;
+  --color-saas-pricing-grid-bg: #c8ceda80;
+
+}
diff --git a/themes/manual-dark.css b/themes/manual-dark.css
new file mode 100644
index 0000000..881f9d2
--- /dev/null
+++ b/themes/manual-dark.css
@@ -0,0 +1,65 @@
+html[data-theme="dark"] {
+  --color-premium-yearly-tip-text-background: linear-gradient(91deg, #FDB022 2.18%, #F79009 108.79%);
+  --color-premium-badge-background: linear-gradient(95deg, rgba(103, 111, 131, 0.90) 0%, rgba(73, 84, 100, 0.90) 105.58%), var(--util-colors-gray-gray-200, #18222F);
+  --color-premium-text-background: linear-gradient(92deg, rgba(249, 250, 251, 0.95) 0%, rgba(233, 235, 240, 0.95) 97.78%);
+  --color-premium-badge-border-highlight-color: #ffffff33;
+  --color-price-enterprise-background: linear-gradient(180deg, rgba(185, 211, 234, 0.00) 0%, rgba(180, 209, 234, 0.92) 100%);
+  --color-grid-mask-background: linear-gradient(0deg, rgba(0, 0, 0, 0.00) 0%, rgba(24, 24, 25, 0.1) 62.25%, rgba(24, 24, 25, 0.10) 100%);
+  --color-chatbot-bg: linear-gradient(180deg,
+      rgba(34, 34, 37, 0.9) 0%,
+      rgba(29, 29, 32, 0.9) 90.48%);
+  --color-chat-bubble-bg: linear-gradient(180deg,
+      rgba(200, 206, 218, 0.08) 0%,
+      rgba(200, 206, 218, 0.02) 100%);
+  --color-chat-input-mask: linear-gradient(180deg,
+      rgba(24, 24, 27, 0.04) 0%,
+      rgba(24, 24, 27, 0.60) 100%);
+  --color-workflow-process-bg: linear-gradient(90deg,
+      rgba(24, 24, 27, 0.25) 0%,
+      rgba(24, 24, 27, 0.04) 100%);
+  --color-workflow-run-failed-bg: linear-gradient(98deg,
+      rgba(240, 68, 56, 0.12) 0%,
+      rgba(0, 0, 0, 0) 26.01%);
+  --color-workflow-batch-failed-bg: linear-gradient(92deg,
+      rgba(240, 68, 56, 0.3) 0%,
+      rgba(0, 0, 0, 0) 100%);
+  --color-marketplace-divider-bg: linear-gradient(90deg,
+      rgba(200, 206, 218, 0.14) 0%,
+      rgba(0, 0, 0, 0) 100%);
+  --color-marketplace-plugin-empty: linear-gradient(180deg,
+      rgba(0, 0, 0, 0) 0%,
+      #222225 100%);
+  --color-toast-success-bg: linear-gradient(92deg,
+      rgba(23, 178, 106, 0.3) 0%,
+      rgba(0, 0, 0, 0) 100%);
+  --color-toast-warning-bg: linear-gradient(92deg,
+      rgba(247, 144, 9, 0.3) 0%,
+      rgba(0, 0, 0, 0) 100%);
+  --color-toast-error-bg: linear-gradient(92deg,
+      rgba(240, 68, 56, 0.3) 0%,
+      rgba(0, 0, 0, 0) 100%);
+  --color-toast-info-bg: linear-gradient(92deg,
+      rgba(11, 165, 236, 0.3) 0%);
+  --color-account-teams-bg: linear-gradient(271deg,
+      rgba(34, 34, 37, 0.9) -0.1%,
+      rgba(29, 29, 32, 0.9) 98.26%);
+  --color-app-detail-bg: linear-gradient(169deg,
+      #1D1D20 1.18%,
+      #222225 99.52%);
+  --color-app-detail-overlay-bg: linear-gradient(270deg,
+      rgba(0, 0, 0, 0.00) 0%,
+      rgba(24, 24, 27, 0.02) 8%,
+      rgba(24, 24, 27, 0.54) 100%);
+  --color-dataset-chunk-process-success-bg: linear-gradient(92deg, rgba(23, 178, 106, 0.30) 0%, rgba(0, 0, 0, 0.00) 100%);
+  --color-dataset-chunk-process-error-bg: linear-gradient(92deg, rgba(240, 68, 56, 0.30) 0%, rgba(0, 0, 0, 0.00) 100%);
+  --color-dataset-chunk-detail-card-hover-bg: linear-gradient(180deg, #1D1D20 0%, #222225 100%);
+  --color-dataset-child-chunk-expand-btn-bg: linear-gradient(90deg, rgba(24, 24, 27, 0.25) 0%, rgba(24, 24, 27, 0.04) 100%);
+  --color-dataset-option-card-blue-gradient: linear-gradient(90deg, #24252E 0%, #1E1E21 100%);
+  --color-dataset-option-card-purple-gradient: linear-gradient(90deg, #25242E 0%, #1E1E21 100%);
+  --color-dataset-option-card-orange-gradient: linear-gradient(90deg, #2B2322 0%, #1E1E21 100%);
+  --color-dataset-chunk-list-mask-bg: linear-gradient(180deg, rgba(34, 34, 37, 0.00) 0%, #222225 100%);
+  --mask-top2bottom-gray-50-to-transparent: linear-gradient(180deg,
+      rgba(24, 24, 27, 0.08) 0%,
+      rgba(0, 0, 0, 0) 100%);
+  --color-line-divider-bg: linear-gradient(90deg, rgba(200, 206, 218, 0.14) 0%, rgba(0, 0, 0, 0) 100%);
+}
diff --git a/themes/manual-light.css b/themes/manual-light.css
new file mode 100644
index 0000000..ab6f144
--- /dev/null
+++ b/themes/manual-light.css
@@ -0,0 +1,65 @@
+html[data-theme="light"] {
+  --color-premium-yearly-tip-text-background: linear-gradient(91deg, #F79009 2.18%, #DC6803 108.79%);
+  --color-premium-badge-background: linear-gradient(95deg, rgba(152, 162, 178, 0.90) 0%, rgba(103, 111, 131, 0.90) 105.58%);
+  --color-premium-text-background: linear-gradient(92deg, rgba(252, 252, 253, 0.95) 0%, rgba(242, 244, 247, 0.95) 97.78%);
+  --color-premium-badge-border-highlight-color: #fffffff2;
+  --color-price-enterprise-background: linear-gradient(180deg, rgba(185, 211, 234, 0.00) 0%, rgba(180, 209, 234, 0.92) 100%);
+  --color-grid-mask-background: linear-gradient(0deg, #FFF 0%, rgba(217, 217, 217, 0.10) 62.25%, rgba(217, 217, 217, 0.10) 100%);
+  --color-chatbot-bg: linear-gradient(180deg,
+      rgba(249, 250, 251, 0.9) 0%,
+      rgba(242, 244, 247, 0.9) 90.48%);
+  --color-chat-bubble-bg: linear-gradient(180deg,
+      #fff 0%,
+      rgba(255, 255, 255, 0.6) 100%);
+  --color-chat-input-mask: linear-gradient(180deg,
+      rgba(255, 255, 255, 0.01) 0%,
+      #F2F4F7 100%);
+  --color-workflow-process-bg: linear-gradient(90deg,
+      rgba(200, 206, 218, 0.2) 0%,
+      rgba(200, 206, 218, 0.04) 100%);
+  --color-workflow-run-failed-bg: linear-gradient(98deg,
+      rgba(240, 68, 56, 0.10) 0%,
+      rgba(255, 255, 255, 0) 26.01%);
+  --color-workflow-batch-failed-bg: linear-gradient(92deg,
+      rgba(240, 68, 56, 0.25) 0%,
+      rgba(255, 255, 255, 0) 100%);
+  --color-marketplace-divider-bg: linear-gradient(90deg,
+      rgba(16, 24, 40, 0.08) 0%,
+      rgba(255, 255, 255, 0) 100%);
+  --color-marketplace-plugin-empty: linear-gradient(180deg,
+      rgba(255, 255, 255, 0) 0%,
+      #fcfcfd 100%);
+  --color-toast-success-bg: linear-gradient(92deg,
+      rgba(23, 178, 106, 0.25) 0%,
+      rgba(255, 255, 255, 0) 100%);
+  --color-toast-warning-bg: linear-gradient(92deg,
+      rgba(247, 144, 9, 0.25) 0%,
+      rgba(255, 255, 255, 0) 100%);
+  --color-toast-error-bg: linear-gradient(92deg,
+      rgba(240, 68, 56, 0.25) 0%,
+      rgba(255, 255, 255, 0) 100%);
+  --color-toast-info-bg: linear-gradient(92deg,
+      rgba(11, 165, 236, 0.25) 0%);
+  --color-account-teams-bg: linear-gradient(271deg,
+      rgba(249, 250, 251, 0.9) -0.1%,
+      rgba(242, 244, 247, 0.9) 98.26%);
+  --color-app-detail-bg: linear-gradient(169deg,
+      #F2F4F7 1.18%,
+      #F9FAFB 99.52%);
+  --color-app-detail-overlay-bg: linear-gradient(270deg,
+      rgba(0, 0, 0, 0.00) 0%,
+      rgba(16, 24, 40, 0.01) 8%,
+      rgba(16, 24, 40, 0.18) 100%);
+  --color-dataset-chunk-process-success-bg: linear-gradient(92deg, rgba(23, 178, 106, 0.25) 0%, rgba(255, 255, 255, 0.00) 100%);
+  --color-dataset-chunk-process-error-bg: linear-gradient(92deg, rgba(240, 68, 56, 0.25) 0%, rgba(255, 255, 255, 0.00) 100%);
+  --color-dataset-chunk-detail-card-hover-bg: linear-gradient(180deg, #F2F4F7 0%, #F9FAFB 100%);
+  --color-dataset-child-chunk-expand-btn-bg: linear-gradient(90deg, rgba(200, 206, 218, 0.20) 0%, rgba(200, 206, 218, 0.04) 100%);
+  --color-dataset-option-card-blue-gradient: linear-gradient(90deg, #F2F4F7 0%, #F9FAFB 100%);
+  --color-dataset-option-card-purple-gradient: linear-gradient(90deg, #F0EEFA 0%, #F9FAFB 100%);
+  --color-dataset-option-card-orange-gradient: linear-gradient(90deg, #F8F2EE 0%, #F9FAFB 100%);
+  --color-dataset-chunk-list-mask-bg: linear-gradient(180deg, rgba(255, 255, 255, 0.00) 0%, #FCFCFD 100%);
+  --mask-top2bottom-gray-50-to-transparent: linear-gradient(180deg,
+      rgba(200, 206, 218, 0.2) 0%,
+      rgba(255, 255, 255, 0) 100%);
+  --color-line-divider-bg: linear-gradient(90deg, rgba(16, 24, 40, 0.08) 0%, rgba(255, 255, 255, 0) 100%);
+}
diff --git a/themes/markdown-dark.css b/themes/markdown-dark.css
new file mode 100644
index 0000000..3dc4728
--- /dev/null
+++ b/themes/markdown-dark.css
@@ -0,0 +1,44 @@
+html[data-theme="dark"] {
+    --color-prettylights-syntax-comment: #6e7781;
+    --color-prettylights-syntax-constant: #0550ae;
+    --color-prettylights-syntax-entity: #8250df;
+    --color-prettylights-syntax-storage-modifier-import: #24292f;
+    --color-prettylights-syntax-entity-tag: #116329;
+    --color-prettylights-syntax-keyword: #cf222e;
+    --color-prettylights-syntax-string: #0a3069;
+    --color-prettylights-syntax-variable: #953800;
+    --color-prettylights-syntax-brackethighlighter-unmatched: #82071e;
+    --color-prettylights-syntax-invalid-illegal-text: #f6f8fa;
+    --color-prettylights-syntax-invalid-illegal-bg: #82071e;
+    --color-prettylights-syntax-carriage-return-text: #f6f8fa;
+    --color-prettylights-syntax-carriage-return-bg: #cf222e;
+    --color-prettylights-syntax-string-regexp: #116329;
+    --color-prettylights-syntax-markup-list: #3b2300;
+    --color-prettylights-syntax-markup-heading: #0550ae;
+    --color-prettylights-syntax-markup-italic: #24292f;
+    --color-prettylights-syntax-markup-bold: #24292f;
+    --color-prettylights-syntax-markup-deleted-text: #82071e;
+    --color-prettylights-syntax-markup-deleted-bg: #ffebe9;
+    --color-prettylights-syntax-markup-inserted-text: #116329;
+    --color-prettylights-syntax-markup-inserted-bg: #dafbe1;
+    --color-prettylights-syntax-markup-changed-text: #953800;
+    --color-prettylights-syntax-markup-changed-bg: #ffd8b5;
+    --color-prettylights-syntax-markup-ignored-text: #eaeef2;
+    --color-prettylights-syntax-markup-ignored-bg: #0550ae;
+    --color-prettylights-syntax-meta-diff-range: #8250df;
+    --color-prettylights-syntax-brackethighlighter-angle: #57606a;
+    --color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f;
+    --color-prettylights-syntax-constant-other-reference-link: #0a3069;
+    --color-fg-default: #24292f;
+    --color-fg-muted: #57606a;
+    --color-fg-subtle: #6e7781;
+    --color-canvas-default: transparent;
+    --color-canvas-subtle: #f6f8fa;
+    --color-border-default: #d0d7de;
+    --color-border-muted: hsla(210, 18%, 87%, 1);
+    --color-neutral-muted: rgba(175, 184, 193, 0.2);
+    --color-accent-fg: #0969da;
+    --color-accent-emphasis: #0969da;
+    --color-attention-subtle: #fff8c5;
+    --color-danger-fg: #cf222e;
+  }
diff --git a/themes/markdown-light.css b/themes/markdown-light.css
new file mode 100644
index 0000000..7399325
--- /dev/null
+++ b/themes/markdown-light.css
@@ -0,0 +1,44 @@
+html[data-theme="light"] {
+    --color-prettylights-syntax-comment: #6e7781;
+    --color-prettylights-syntax-constant: #0550ae;
+    --color-prettylights-syntax-entity: #8250df;
+    --color-prettylights-syntax-storage-modifier-import: #24292f;
+    --color-prettylights-syntax-entity-tag: #116329;
+    --color-prettylights-syntax-keyword: #cf222e;
+    --color-prettylights-syntax-string: #0a3069;
+    --color-prettylights-syntax-variable: #953800;
+    --color-prettylights-syntax-brackethighlighter-unmatched: #82071e;
+    --color-prettylights-syntax-invalid-illegal-text: #f6f8fa;
+    --color-prettylights-syntax-invalid-illegal-bg: #82071e;
+    --color-prettylights-syntax-carriage-return-text: #f6f8fa;
+    --color-prettylights-syntax-carriage-return-bg: #cf222e;
+    --color-prettylights-syntax-string-regexp: #116329;
+    --color-prettylights-syntax-markup-list: #3b2300;
+    --color-prettylights-syntax-markup-heading: #0550ae;
+    --color-prettylights-syntax-markup-italic: #24292f;
+    --color-prettylights-syntax-markup-bold: #24292f;
+    --color-prettylights-syntax-markup-deleted-text: #82071e;
+    --color-prettylights-syntax-markup-deleted-bg: #ffebe9;
+    --color-prettylights-syntax-markup-inserted-text: #116329;
+    --color-prettylights-syntax-markup-inserted-bg: #dafbe1;
+    --color-prettylights-syntax-markup-changed-text: #953800;
+    --color-prettylights-syntax-markup-changed-bg: #ffd8b5;
+    --color-prettylights-syntax-markup-ignored-text: #eaeef2;
+    --color-prettylights-syntax-markup-ignored-bg: #0550ae;
+    --color-prettylights-syntax-meta-diff-range: #8250df;
+    --color-prettylights-syntax-brackethighlighter-angle: #57606a;
+    --color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f;
+    --color-prettylights-syntax-constant-other-reference-link: #0a3069;
+    --color-fg-default: #24292f;
+    --color-fg-muted: #57606a;
+    --color-fg-subtle: #6e7781;
+    --color-canvas-default: transparent;
+    --color-canvas-subtle: #f6f8fa;
+    --color-border-default: #d0d7de;
+    --color-border-muted: hsla(210, 18%, 87%, 1);
+    --color-neutral-muted: rgba(175, 184, 193, 0.2);
+    --color-accent-fg: #0969da;
+    --color-accent-emphasis: #0969da;
+    --color-attention-subtle: #fff8c5;
+    --color-danger-fg: #cf222e;
+  }
diff --git a/themes/tailwind-theme-var-define.ts b/themes/tailwind-theme-var-define.ts
new file mode 100644
index 0000000..62c0ed8
--- /dev/null
+++ b/themes/tailwind-theme-var-define.ts
@@ -0,0 +1,740 @@
+/* Attention: Generate by code. Don't update by hand!!! */
+const vars = {
+  'components-input-bg-normal': 'var(--color-components-input-bg-normal)',
+  'components-input-text-placeholder': 'var(--color-components-input-text-placeholder)',
+  'components-input-bg-hover': 'var(--color-components-input-bg-hover)',
+  'components-input-bg-active': 'var(--color-components-input-bg-active)',
+  'components-input-border-active': 'var(--color-components-input-border-active)',
+  'components-input-border-destructive': 'var(--color-components-input-border-destructive)',
+  'components-input-text-filled': 'var(--color-components-input-text-filled)',
+  'components-input-bg-destructive': 'var(--color-components-input-bg-destructive)',
+  'components-input-bg-disabled': 'var(--color-components-input-bg-disabled)',
+  'components-input-text-disabled': 'var(--color-components-input-text-disabled)',
+  'components-input-text-filled-disabled': 'var(--color-components-input-text-filled-disabled)',
+  'components-input-border-hover': 'var(--color-components-input-border-hover)',
+  'components-input-border-active-prompt-1': 'var(--color-components-input-border-active-prompt-1)',
+  'components-input-border-active-prompt-2': 'var(--color-components-input-border-active-prompt-2)',
+
+  'components-kbd-bg-gray': 'var(--color-components-kbd-bg-gray)',
+  'components-kbd-bg-white': 'var(--color-components-kbd-bg-white)',
+
+  'components-tooltip-bg': 'var(--color-components-tooltip-bg)',
+
+  'components-button-primary-text': 'var(--color-components-button-primary-text)',
+  'components-button-primary-bg': 'var(--color-components-button-primary-bg)',
+  'components-button-primary-border': 'var(--color-components-button-primary-border)',
+  'components-button-primary-bg-hover': 'var(--color-components-button-primary-bg-hover)',
+  'components-button-primary-border-hover': 'var(--color-components-button-primary-border-hover)',
+  'components-button-primary-bg-disabled': 'var(--color-components-button-primary-bg-disabled)',
+  'components-button-primary-border-disabled': 'var(--color-components-button-primary-border-disabled)',
+  'components-button-primary-text-disabled': 'var(--color-components-button-primary-text-disabled)',
+
+  'components-button-secondary-text': 'var(--color-components-button-secondary-text)',
+  'components-button-secondary-text-disabled': 'var(--color-components-button-secondary-text-disabled)',
+  'components-button-secondary-bg': 'var(--color-components-button-secondary-bg)',
+  'components-button-secondary-bg-hover': 'var(--color-components-button-secondary-bg-hover)',
+  'components-button-secondary-bg-disabled': 'var(--color-components-button-secondary-bg-disabled)',
+  'components-button-secondary-border': 'var(--color-components-button-secondary-border)',
+  'components-button-secondary-border-hover': 'var(--color-components-button-secondary-border-hover)',
+  'components-button-secondary-border-disabled': 'var(--color-components-button-secondary-border-disabled)',
+
+  'components-button-tertiary-text': 'var(--color-components-button-tertiary-text)',
+  'components-button-tertiary-text-disabled': 'var(--color-components-button-tertiary-text-disabled)',
+  'components-button-tertiary-bg': 'var(--color-components-button-tertiary-bg)',
+  'components-button-tertiary-bg-hover': 'var(--color-components-button-tertiary-bg-hover)',
+  'components-button-tertiary-bg-disabled': 'var(--color-components-button-tertiary-bg-disabled)',
+
+  'components-button-ghost-text': 'var(--color-components-button-ghost-text)',
+  'components-button-ghost-text-disabled': 'var(--color-components-button-ghost-text-disabled)',
+  'components-button-ghost-bg-hover': 'var(--color-components-button-ghost-bg-hover)',
+
+  'components-button-destructive-primary-text': 'var(--color-components-button-destructive-primary-text)',
+  'components-button-destructive-primary-text-disabled': 'var(--color-components-button-destructive-primary-text-disabled)',
+  'components-button-destructive-primary-bg': 'var(--color-components-button-destructive-primary-bg)',
+  'components-button-destructive-primary-bg-hover': 'var(--color-components-button-destructive-primary-bg-hover)',
+  'components-button-destructive-primary-bg-disabled': 'var(--color-components-button-destructive-primary-bg-disabled)',
+  'components-button-destructive-primary-border': 'var(--color-components-button-destructive-primary-border)',
+  'components-button-destructive-primary-border-hover': 'var(--color-components-button-destructive-primary-border-hover)',
+  'components-button-destructive-primary-border-disabled': 'var(--color-components-button-destructive-primary-border-disabled)',
+
+  'components-button-destructive-secondary-text': 'var(--color-components-button-destructive-secondary-text)',
+  'components-button-destructive-secondary-text-disabled': 'var(--color-components-button-destructive-secondary-text-disabled)',
+  'components-button-destructive-secondary-bg': 'var(--color-components-button-destructive-secondary-bg)',
+  'components-button-destructive-secondary-bg-hover': 'var(--color-components-button-destructive-secondary-bg-hover)',
+  'components-button-destructive-secondary-bg-disabled': 'var(--color-components-button-destructive-secondary-bg-disabled)',
+  'components-button-destructive-secondary-border': 'var(--color-components-button-destructive-secondary-border)',
+  'components-button-destructive-secondary-border-hover': 'var(--color-components-button-destructive-secondary-border-hover)',
+  'components-button-destructive-secondary-border-disabled': 'var(--color-components-button-destructive-secondary-border-disabled)',
+
+  'components-button-destructive-tertiary-text': 'var(--color-components-button-destructive-tertiary-text)',
+  'components-button-destructive-tertiary-text-disabled': 'var(--color-components-button-destructive-tertiary-text-disabled)',
+  'components-button-destructive-tertiary-bg': 'var(--color-components-button-destructive-tertiary-bg)',
+  'components-button-destructive-tertiary-bg-hover': 'var(--color-components-button-destructive-tertiary-bg-hover)',
+  'components-button-destructive-tertiary-bg-disabled': 'var(--color-components-button-destructive-tertiary-bg-disabled)',
+
+  'components-button-destructive-ghost-text': 'var(--color-components-button-destructive-ghost-text)',
+  'components-button-destructive-ghost-text-disabled': 'var(--color-components-button-destructive-ghost-text-disabled)',
+  'components-button-destructive-ghost-bg-hover': 'var(--color-components-button-destructive-ghost-bg-hover)',
+
+  'components-button-secondary-accent-text': 'var(--color-components-button-secondary-accent-text)',
+  'components-button-secondary-accent-text-disabled': 'var(--color-components-button-secondary-accent-text-disabled)',
+  'components-button-secondary-accent-bg': 'var(--color-components-button-secondary-accent-bg)',
+  'components-button-secondary-accent-bg-hover': 'var(--color-components-button-secondary-accent-bg-hover)',
+  'components-button-secondary-accent-bg-disabled': 'var(--color-components-button-secondary-accent-bg-disabled)',
+  'components-button-secondary-accent-border': 'var(--color-components-button-secondary-accent-border)',
+  'components-button-secondary-accent-border-hover': 'var(--color-components-button-secondary-accent-border-hover)',
+  'components-button-secondary-accent-border-disabled': 'var(--color-components-button-secondary-accent-border-disabled)',
+
+  'components-button-indigo-bg': 'var(--color-components-button-indigo-bg)',
+  'components-button-indigo-bg-hover': 'var(--color-components-button-indigo-bg-hover)',
+  'components-button-indigo-bg-disabled': 'var(--color-components-button-indigo-bg-disabled)',
+
+  'components-checkbox-icon': 'var(--color-components-checkbox-icon)',
+  'components-checkbox-icon-disabled': 'var(--color-components-checkbox-icon-disabled)',
+  'components-checkbox-bg': 'var(--color-components-checkbox-bg)',
+  'components-checkbox-bg-hover': 'var(--color-components-checkbox-bg-hover)',
+  'components-checkbox-bg-disabled': 'var(--color-components-checkbox-bg-disabled)',
+  'components-checkbox-border': 'var(--color-components-checkbox-border)',
+  'components-checkbox-border-hover': 'var(--color-components-checkbox-border-hover)',
+  'components-checkbox-border-disabled': 'var(--color-components-checkbox-border-disabled)',
+  'components-checkbox-bg-unchecked': 'var(--color-components-checkbox-bg-unchecked)',
+  'components-checkbox-bg-unchecked-hover': 'var(--color-components-checkbox-bg-unchecked-hover)',
+  'components-checkbox-bg-disabled-checked': 'var(--color-components-checkbox-bg-disabled-checked)',
+
+  'components-radio-border-checked': 'var(--color-components-radio-border-checked)',
+  'components-radio-border-checked-hover': 'var(--color-components-radio-border-checked-hover)',
+  'components-radio-border-checked-disabled': 'var(--color-components-radio-border-checked-disabled)',
+  'components-radio-bg-disabled': 'var(--color-components-radio-bg-disabled)',
+  'components-radio-border': 'var(--color-components-radio-border)',
+  'components-radio-border-hover': 'var(--color-components-radio-border-hover)',
+  'components-radio-border-disabled': 'var(--color-components-radio-border-disabled)',
+  'components-radio-bg': 'var(--color-components-radio-bg)',
+  'components-radio-bg-hover': 'var(--color-components-radio-bg-hover)',
+
+  'components-toggle-knob': 'var(--color-components-toggle-knob)',
+  'components-toggle-knob-disabled': 'var(--color-components-toggle-knob-disabled)',
+  'components-toggle-bg': 'var(--color-components-toggle-bg)',
+  'components-toggle-bg-hover': 'var(--color-components-toggle-bg-hover)',
+  'components-toggle-bg-disabled': 'var(--color-components-toggle-bg-disabled)',
+  'components-toggle-bg-unchecked': 'var(--color-components-toggle-bg-unchecked)',
+  'components-toggle-bg-unchecked-hover': 'var(--color-components-toggle-bg-unchecked-hover)',
+  'components-toggle-bg-unchecked-disabled': 'var(--color-components-toggle-bg-unchecked-disabled)',
+  'components-toggle-knob-hover': 'var(--color-components-toggle-knob-hover)',
+
+  'components-card-bg': 'var(--color-components-card-bg)',
+  'components-card-border': 'var(--color-components-card-border)',
+  'components-card-bg-alt': 'var(--color-components-card-bg-alt)',
+
+  'components-menu-item-text': 'var(--color-components-menu-item-text)',
+  'components-menu-item-text-active': 'var(--color-components-menu-item-text-active)',
+  'components-menu-item-text-hover': 'var(--color-components-menu-item-text-hover)',
+  'components-menu-item-text-active-accent': 'var(--color-components-menu-item-text-active-accent)',
+
+  'components-panel-bg': 'var(--color-components-panel-bg)',
+  'components-panel-bg-blur': 'var(--color-components-panel-bg-blur)',
+  'components-panel-border': 'var(--color-components-panel-border)',
+  'components-panel-border-subtle': 'var(--color-components-panel-border-subtle)',
+  'components-panel-gradient-2': 'var(--color-components-panel-gradient-2)',
+  'components-panel-gradient-1': 'var(--color-components-panel-gradient-1)',
+  'components-panel-bg-alt': 'var(--color-components-panel-bg-alt)',
+  'components-panel-on-panel-item-bg': 'var(--color-components-panel-on-panel-item-bg)',
+  'components-panel-on-panel-item-bg-hover': 'var(--color-components-panel-on-panel-item-bg-hover)',
+  'components-panel-on-panel-item-bg-alt': 'var(--color-components-panel-on-panel-item-bg-alt)',
+  'components-panel-on-panel-item-bg-transparent': 'var(--color-components-panel-on-panel-item-bg-transparent)',
+  'components-panel-on-panel-item-bg-hover-transparent': 'var(--color-components-panel-on-panel-item-bg-hover-transparent)',
+  'components-panel-on-panel-item-bg-destructive-hover-transparent': 'var(--color-components-panel-on-panel-item-bg-destructive-hover-transparent)',
+
+  'components-panel-bg-transparent': 'var(--color-components-panel-bg-transparent)',
+
+  'components-main-nav-nav-button-text': 'var(--color-components-main-nav-nav-button-text)',
+  'components-main-nav-nav-button-text-active': 'var(--color-components-main-nav-nav-button-text-active)',
+  'components-main-nav-nav-button-bg': 'var(--color-components-main-nav-nav-button-bg)',
+  'components-main-nav-nav-button-bg-active': 'var(--color-components-main-nav-nav-button-bg-active)',
+  'components-main-nav-nav-button-border': 'var(--color-components-main-nav-nav-button-border)',
+  'components-main-nav-nav-button-bg-hover': 'var(--color-components-main-nav-nav-button-bg-hover)',
+
+  'components-main-nav-nav-user-border': 'var(--color-components-main-nav-nav-user-border)',
+
+  'components-slider-knob': 'var(--color-components-slider-knob)',
+  'components-slider-knob-hover': 'var(--color-components-slider-knob-hover)',
+  'components-slider-knob-disabled': 'var(--color-components-slider-knob-disabled)',
+  'components-slider-range': 'var(--color-components-slider-range)',
+  'components-slider-track': 'var(--color-components-slider-track)',
+  'components-slider-knob-border-hover': 'var(--color-components-slider-knob-border-hover)',
+  'components-slider-knob-border': 'var(--color-components-slider-knob-border)',
+
+  'components-segmented-control-item-active-bg': 'var(--color-components-segmented-control-item-active-bg)',
+  'components-segmented-control-item-active-border': 'var(--color-components-segmented-control-item-active-border)',
+  'components-segmented-control-bg-normal': 'var(--color-components-segmented-control-bg-normal)',
+  'components-segmented-control-item-active-accent-bg': 'var(--color-components-segmented-control-item-active-accent-bg)',
+  'components-segmented-control-item-active-accent-border': 'var(--color-components-segmented-control-item-active-accent-border)',
+
+  'components-option-card-option-bg': 'var(--color-components-option-card-option-bg)',
+  'components-option-card-option-selected-bg': 'var(--color-components-option-card-option-selected-bg)',
+  'components-option-card-option-selected-border': 'var(--color-components-option-card-option-selected-border)',
+  'components-option-card-option-border': 'var(--color-components-option-card-option-border)',
+  'components-option-card-option-bg-hover': 'var(--color-components-option-card-option-bg-hover)',
+  'components-option-card-option-border-hover': 'var(--color-components-option-card-option-border-hover)',
+
+  'components-tab-active': 'var(--color-components-tab-active)',
+
+  'components-badge-white-to-dark': 'var(--color-components-badge-white-to-dark)',
+  'components-badge-status-light-success-bg': 'var(--color-components-badge-status-light-success-bg)',
+  'components-badge-status-light-success-border-inner': 'var(--color-components-badge-status-light-success-border-inner)',
+  'components-badge-status-light-success-halo': 'var(--color-components-badge-status-light-success-halo)',
+
+  'components-badge-status-light-border-outer': 'var(--color-components-badge-status-light-border-outer)',
+  'components-badge-status-light-high-light': 'var(--color-components-badge-status-light-high-light)',
+  'components-badge-status-light-warning-bg': 'var(--color-components-badge-status-light-warning-bg)',
+  'components-badge-status-light-warning-border-inner': 'var(--color-components-badge-status-light-warning-border-inner)',
+  'components-badge-status-light-warning-halo': 'var(--color-components-badge-status-light-warning-halo)',
+
+  'components-badge-status-light-error-bg': 'var(--color-components-badge-status-light-error-bg)',
+  'components-badge-status-light-error-border-inner': 'var(--color-components-badge-status-light-error-border-inner)',
+  'components-badge-status-light-error-halo': 'var(--color-components-badge-status-light-error-halo)',
+
+  'components-badge-status-light-normal-bg': 'var(--color-components-badge-status-light-normal-bg)',
+  'components-badge-status-light-normal-border-inner': 'var(--color-components-badge-status-light-normal-border-inner)',
+  'components-badge-status-light-normal-halo': 'var(--color-components-badge-status-light-normal-halo)',
+
+  'components-badge-status-light-disabled-bg': 'var(--color-components-badge-status-light-disabled-bg)',
+  'components-badge-status-light-disabled-border-inner': 'var(--color-components-badge-status-light-disabled-border-inner)',
+  'components-badge-status-light-disabled-halo': 'var(--color-components-badge-status-light-disabled-halo)',
+
+  'components-badge-bg-green-soft': 'var(--color-components-badge-bg-green-soft)',
+  'components-badge-bg-orange-soft': 'var(--color-components-badge-bg-orange-soft)',
+  'components-badge-bg-red-soft': 'var(--color-components-badge-bg-red-soft)',
+  'components-badge-bg-blue-light-soft': 'var(--color-components-badge-bg-blue-light-soft)',
+  'components-badge-bg-gray-soft': 'var(--color-components-badge-bg-gray-soft)',
+  'components-badge-bg-dimm': 'var(--color-components-badge-bg-dimm)',
+
+  'components-chart-line': 'var(--color-components-chart-line)',
+  'components-chart-area-1': 'var(--color-components-chart-area-1)',
+  'components-chart-area-2': 'var(--color-components-chart-area-2)',
+  'components-chart-current-1': 'var(--color-components-chart-current-1)',
+  'components-chart-current-2': 'var(--color-components-chart-current-2)',
+  'components-chart-bg': 'var(--color-components-chart-bg)',
+
+  'components-actionbar-bg': 'var(--color-components-actionbar-bg)',
+  'components-actionbar-border': 'var(--color-components-actionbar-border)',
+  'components-actionbar-bg-accent': 'var(--color-components-actionbar-bg-accent)',
+  'components-actionbar-border-accent': 'var(--color-components-actionbar-border-accent)',
+
+  'components-dropzone-bg-alt': 'var(--color-components-dropzone-bg-alt)',
+  'components-dropzone-bg': 'var(--color-components-dropzone-bg)',
+  'components-dropzone-bg-accent': 'var(--color-components-dropzone-bg-accent)',
+  'components-dropzone-border': 'var(--color-components-dropzone-border)',
+  'components-dropzone-border-alt': 'var(--color-components-dropzone-border-alt)',
+  'components-dropzone-border-accent': 'var(--color-components-dropzone-border-accent)',
+
+  'components-progress-brand-progress': 'var(--color-components-progress-brand-progress)',
+  'components-progress-brand-border': 'var(--color-components-progress-brand-border)',
+  'components-progress-brand-bg': 'var(--color-components-progress-brand-bg)',
+
+  'components-progress-white-progress': 'var(--color-components-progress-white-progress)',
+  'components-progress-white-border': 'var(--color-components-progress-white-border)',
+  'components-progress-white-bg': 'var(--color-components-progress-white-bg)',
+
+  'components-progress-gray-progress': 'var(--color-components-progress-gray-progress)',
+  'components-progress-gray-border': 'var(--color-components-progress-gray-border)',
+  'components-progress-gray-bg': 'var(--color-components-progress-gray-bg)',
+
+  'components-progress-warning-progress': 'var(--color-components-progress-warning-progress)',
+  'components-progress-warning-border': 'var(--color-components-progress-warning-border)',
+  'components-progress-warning-bg': 'var(--color-components-progress-warning-bg)',
+
+  'components-progress-error-progress': 'var(--color-components-progress-error-progress)',
+  'components-progress-error-border': 'var(--color-components-progress-error-border)',
+  'components-progress-error-bg': 'var(--color-components-progress-error-bg)',
+
+  'components-chat-input-audio-bg': 'var(--color-components-chat-input-audio-bg)',
+  'components-chat-input-audio-wave-default': 'var(--color-components-chat-input-audio-wave-default)',
+  'components-chat-input-bg-mask-1': 'var(--color-components-chat-input-bg-mask-1)',
+  'components-chat-input-bg-mask-2': 'var(--color-components-chat-input-bg-mask-2)',
+  'components-chat-input-border': 'var(--color-components-chat-input-border)',
+  'components-chat-input-audio-wave-active': 'var(--color-components-chat-input-audio-wave-active)',
+  'components-chat-input-audio-bg-alt': 'var(--color-components-chat-input-audio-bg-alt)',
+
+  'components-avatar-shape-fill-stop-0': 'var(--color-components-avatar-shape-fill-stop-0)',
+  'components-avatar-shape-fill-stop-100': 'var(--color-components-avatar-shape-fill-stop-100)',
+
+  'components-avatar-bg-mask-stop-0': 'var(--color-components-avatar-bg-mask-stop-0)',
+  'components-avatar-bg-mask-stop-100': 'var(--color-components-avatar-bg-mask-stop-100)',
+
+  'components-avatar-default-avatar-bg': 'var(--color-components-avatar-default-avatar-bg)',
+  'components-avatar-mask-darkmode-dimmed': 'var(--color-components-avatar-mask-darkmode-dimmed)',
+
+  'components-label-gray': 'var(--color-components-label-gray)',
+
+  'components-premium-badge-blue-bg-stop-0': 'var(--color-components-premium-badge-blue-bg-stop-0)',
+  'components-premium-badge-blue-bg-stop-100': 'var(--color-components-premium-badge-blue-bg-stop-100)',
+  'components-premium-badge-blue-stroke-stop-0': 'var(--color-components-premium-badge-blue-stroke-stop-0)',
+  'components-premium-badge-blue-stroke-stop-100': 'var(--color-components-premium-badge-blue-stroke-stop-100)',
+  'components-premium-badge-blue-text-stop-0': 'var(--color-components-premium-badge-blue-text-stop-0)',
+  'components-premium-badge-blue-text-stop-100': 'var(--color-components-premium-badge-blue-text-stop-100)',
+  'components-premium-badge-blue-glow': 'var(--color-components-premium-badge-blue-glow)',
+  'components-premium-badge-blue-bg-stop-0-hover': 'var(--color-components-premium-badge-blue-bg-stop-0-hover)',
+  'components-premium-badge-blue-bg-stop-100-hover': 'var(--color-components-premium-badge-blue-bg-stop-100-hover)',
+  'components-premium-badge-blue-glow-hover': 'var(--color-components-premium-badge-blue-glow-hover)',
+  'components-premium-badge-blue-stroke-stop-0-hover': 'var(--color-components-premium-badge-blue-stroke-stop-0-hover)',
+  'components-premium-badge-blue-stroke-stop-100-hover': 'var(--color-components-premium-badge-blue-stroke-stop-100-hover)',
+
+  'components-premium-badge-highlight-stop-0': 'var(--color-components-premium-badge-highlight-stop-0)',
+  'components-premium-badge-highlight-stop-100': 'var(--color-components-premium-badge-highlight-stop-100)',
+  'components-premium-badge-indigo-bg-stop-0': 'var(--color-components-premium-badge-indigo-bg-stop-0)',
+  'components-premium-badge-indigo-bg-stop-100': 'var(--color-components-premium-badge-indigo-bg-stop-100)',
+  'components-premium-badge-indigo-stroke-stop-0': 'var(--color-components-premium-badge-indigo-stroke-stop-0)',
+  'components-premium-badge-indigo-stroke-stop-100': 'var(--color-components-premium-badge-indigo-stroke-stop-100)',
+  'components-premium-badge-indigo-text-stop-0': 'var(--color-components-premium-badge-indigo-text-stop-0)',
+  'components-premium-badge-indigo-text-stop-100': 'var(--color-components-premium-badge-indigo-text-stop-100)',
+  'components-premium-badge-indigo-glow': 'var(--color-components-premium-badge-indigo-glow)',
+  'components-premium-badge-indigo-glow-hover': 'var(--color-components-premium-badge-indigo-glow-hover)',
+  'components-premium-badge-indigo-bg-stop-0-hover': 'var(--color-components-premium-badge-indigo-bg-stop-0-hover)',
+  'components-premium-badge-indigo-bg-stop-100-hover': 'var(--color-components-premium-badge-indigo-bg-stop-100-hover)',
+  'components-premium-badge-indigo-stroke-stop-0-hover': 'var(--color-components-premium-badge-indigo-stroke-stop-0-hover)',
+  'components-premium-badge-indigo-stroke-stop-100-hover': 'var(--color-components-premium-badge-indigo-stroke-stop-100-hover)',
+
+  'components-premium-badge-grey-bg-stop-0': 'var(--color-components-premium-badge-grey-bg-stop-0)',
+  'components-premium-badge-grey-bg-stop-100': 'var(--color-components-premium-badge-grey-bg-stop-100)',
+  'components-premium-badge-grey-stroke-stop-0': 'var(--color-components-premium-badge-grey-stroke-stop-0)',
+  'components-premium-badge-grey-stroke-stop-100': 'var(--color-components-premium-badge-grey-stroke-stop-100)',
+  'components-premium-badge-grey-text-stop-0': 'var(--color-components-premium-badge-grey-text-stop-0)',
+  'components-premium-badge-grey-text-stop-100': 'var(--color-components-premium-badge-grey-text-stop-100)',
+  'components-premium-badge-grey-glow': 'var(--color-components-premium-badge-grey-glow)',
+  'components-premium-badge-grey-glow-hover': 'var(--color-components-premium-badge-grey-glow-hover)',
+  'components-premium-badge-grey-bg-stop-0-hover': 'var(--color-components-premium-badge-grey-bg-stop-0-hover)',
+  'components-premium-badge-grey-bg-stop-100-hover': 'var(--color-components-premium-badge-grey-bg-stop-100-hover)',
+  'components-premium-badge-grey-stroke-stop-0-hover': 'var(--color-components-premium-badge-grey-stroke-stop-0-hover)',
+  'components-premium-badge-grey-stroke-stop-100-hover': 'var(--color-components-premium-badge-grey-stroke-stop-100-hover)',
+
+  'components-premium-badge-orange-bg-stop-0': 'var(--color-components-premium-badge-orange-bg-stop-0)',
+  'components-premium-badge-orange-bg-stop-100': 'var(--color-components-premium-badge-orange-bg-stop-100)',
+  'components-premium-badge-orange-stroke-stop-0': 'var(--color-components-premium-badge-orange-stroke-stop-0)',
+  'components-premium-badge-orange-stroke-stop-100': 'var(--color-components-premium-badge-orange-stroke-stop-100)',
+  'components-premium-badge-orange-text-stop-0': 'var(--color-components-premium-badge-orange-text-stop-0)',
+  'components-premium-badge-orange-text-stop-100': 'var(--color-components-premium-badge-orange-text-stop-100)',
+  'components-premium-badge-orange-glow': 'var(--color-components-premium-badge-orange-glow)',
+  'components-premium-badge-orange-glow-hover': 'var(--color-components-premium-badge-orange-glow-hover)',
+  'components-premium-badge-orange-bg-stop-0-hover': 'var(--color-components-premium-badge-orange-bg-stop-0-hover)',
+  'components-premium-badge-orange-bg-stop-100-hover': 'var(--color-components-premium-badge-orange-bg-stop-100-hover)',
+  'components-premium-badge-orange-stroke-stop-0-hover': 'var(--color-components-premium-badge-orange-stroke-stop-0-hover)',
+  'components-premium-badge-orange-stroke-stop-100-hover': 'var(--color-components-premium-badge-orange-stroke-stop-100-hover)',
+
+  'components-progress-bar-bg': 'var(--color-components-progress-bar-bg)',
+  'components-progress-bar-progress': 'var(--color-components-progress-bar-progress)',
+  'components-progress-bar-border': 'var(--color-components-progress-bar-border)',
+  'components-progress-bar-progress-solid': 'var(--color-components-progress-bar-progress-solid)',
+  'components-progress-bar-progress-highlight': 'var(--color-components-progress-bar-progress-highlight)',
+
+  'components-icon-bg-red-solid': 'var(--color-components-icon-bg-red-solid)',
+  'components-icon-bg-rose-solid': 'var(--color-components-icon-bg-rose-solid)',
+  'components-icon-bg-pink-solid': 'var(--color-components-icon-bg-pink-solid)',
+  'components-icon-bg-orange-dark-solid': 'var(--color-components-icon-bg-orange-dark-solid)',
+  'components-icon-bg-yellow-solid': 'var(--color-components-icon-bg-yellow-solid)',
+  'components-icon-bg-green-solid': 'var(--color-components-icon-bg-green-solid)',
+  'components-icon-bg-teal-solid': 'var(--color-components-icon-bg-teal-solid)',
+  'components-icon-bg-blue-light-solid': 'var(--color-components-icon-bg-blue-light-solid)',
+  'components-icon-bg-blue-solid': 'var(--color-components-icon-bg-blue-solid)',
+  'components-icon-bg-indigo-solid': 'var(--color-components-icon-bg-indigo-solid)',
+  'components-icon-bg-violet-solid': 'var(--color-components-icon-bg-violet-solid)',
+  'components-icon-bg-midnight-solid': 'var(--color-components-icon-bg-midnight-solid)',
+  'components-icon-bg-rose-soft': 'var(--color-components-icon-bg-rose-soft)',
+  'components-icon-bg-pink-soft': 'var(--color-components-icon-bg-pink-soft)',
+  'components-icon-bg-orange-dark-soft': 'var(--color-components-icon-bg-orange-dark-soft)',
+  'components-icon-bg-yellow-soft': 'var(--color-components-icon-bg-yellow-soft)',
+  'components-icon-bg-green-soft': 'var(--color-components-icon-bg-green-soft)',
+  'components-icon-bg-teal-soft': 'var(--color-components-icon-bg-teal-soft)',
+  'components-icon-bg-blue-light-soft': 'var(--color-components-icon-bg-blue-light-soft)',
+  'components-icon-bg-blue-soft': 'var(--color-components-icon-bg-blue-soft)',
+  'components-icon-bg-indigo-soft': 'var(--color-components-icon-bg-indigo-soft)',
+  'components-icon-bg-violet-soft': 'var(--color-components-icon-bg-violet-soft)',
+  'components-icon-bg-midnight-soft': 'var(--color-components-icon-bg-midnight-soft)',
+  'components-icon-bg-red-soft': 'var(--color-components-icon-bg-red-soft)',
+  'components-icon-bg-orange-solid': 'var(--color-components-icon-bg-orange-solid)',
+  'components-icon-bg-orange-soft': 'var(--color-components-icon-bg-orange-soft)',
+
+  'text-primary': 'var(--color-text-primary)',
+  'text-secondary': 'var(--color-text-secondary)',
+  'text-tertiary': 'var(--color-text-tertiary)',
+  'text-quaternary': 'var(--color-text-quaternary)',
+  'text-destructive': 'var(--color-text-destructive)',
+  'text-success': 'var(--color-text-success)',
+  'text-warning': 'var(--color-text-warning)',
+  'text-destructive-secondary': 'var(--color-text-destructive-secondary)',
+  'text-success-secondary': 'var(--color-text-success-secondary)',
+  'text-warning-secondary': 'var(--color-text-warning-secondary)',
+  'text-accent': 'var(--color-text-accent)',
+  'text-primary-on-surface': 'var(--color-text-primary-on-surface)',
+  'text-placeholder': 'var(--color-text-placeholder)',
+  'text-disabled': 'var(--color-text-disabled)',
+  'text-accent-secondary': 'var(--color-text-accent-secondary)',
+  'text-accent-light-mode-only': 'var(--color-text-accent-light-mode-only)',
+  'text-text-selected': 'var(--color-text-text-selected)',
+  'text-secondary-on-surface': 'var(--color-text-secondary-on-surface)',
+  'text-logo-text': 'var(--color-text-logo-text)',
+  'text-empty-state-icon': 'var(--color-text-empty-state-icon)',
+  'text-inverted': 'var(--color-text-inverted)',
+  'text-inverted-dimmed': 'var(--color-text-inverted-dimmed)',
+
+  'background-body': 'var(--color-background-body)',
+  'background-default-subtle': 'var(--color-background-default-subtle)',
+  'background-neutral-subtle': 'var(--color-background-neutral-subtle)',
+  'background-sidenav-bg': 'var(--color-background-sidenav-bg)',
+  'background-default': 'var(--color-background-default)',
+  'background-soft': 'var(--color-background-soft)',
+  'background-gradient-bg-fill-chat-bg-1': 'var(--color-background-gradient-bg-fill-chat-bg-1)',
+  'background-gradient-bg-fill-chat-bg-2': 'var(--color-background-gradient-bg-fill-chat-bg-2)',
+  'background-gradient-bg-fill-chat-bubble-bg-1': 'var(--color-background-gradient-bg-fill-chat-bubble-bg-1)',
+  'background-gradient-bg-fill-chat-bubble-bg-2': 'var(--color-background-gradient-bg-fill-chat-bubble-bg-2)',
+  'background-gradient-bg-fill-debug-bg-1': 'var(--color-background-gradient-bg-fill-debug-bg-1)',
+  'background-gradient-bg-fill-debug-bg-2': 'var(--color-background-gradient-bg-fill-debug-bg-2)',
+
+  'background-gradient-mask-gray': 'var(--color-background-gradient-mask-gray)',
+  'background-gradient-mask-transparent': 'var(--color-background-gradient-mask-transparent)',
+  'background-gradient-mask-input-clear-2': 'var(--color-background-gradient-mask-input-clear-2)',
+  'background-gradient-mask-input-clear-1': 'var(--color-background-gradient-mask-input-clear-1)',
+  'background-gradient-mask-transparent-dark': 'var(--color-background-gradient-mask-transparent-dark)',
+  'background-gradient-mask-side-panel-2': 'var(--color-background-gradient-mask-side-panel-2)',
+  'background-gradient-mask-side-panel-1': 'var(--color-background-gradient-mask-side-panel-1)',
+
+  'background-default-burn': 'var(--color-background-default-burn)',
+  'background-overlay-fullscreen': 'var(--color-background-overlay-fullscreen)',
+  'background-default-lighter': 'var(--color-background-default-lighter)',
+  'background-section': 'var(--color-background-section)',
+  'background-interaction-from-bg-1': 'var(--color-background-interaction-from-bg-1)',
+  'background-interaction-from-bg-2': 'var(--color-background-interaction-from-bg-2)',
+  'background-section-burn': 'var(--color-background-section-burn)',
+  'background-default-dodge': 'var(--color-background-default-dodge)',
+  'background-overlay': 'var(--color-background-overlay)',
+  'background-default-dimmed': 'var(--color-background-default-dimmed)',
+  'background-default-hover': 'var(--color-background-default-hover)',
+  'background-overlay-alt': 'var(--color-background-overlay-alt)',
+  'background-surface-white': 'var(--color-background-surface-white)',
+  'background-overlay-destructive': 'var(--color-background-overlay-destructive)',
+  'background-overlay-backdrop': 'var(--color-background-overlay-backdrop)',
+
+  'shadow-shadow-1': 'var(--color-shadow-shadow-1)',
+  'shadow-shadow-3': 'var(--color-shadow-shadow-3)',
+  'shadow-shadow-4': 'var(--color-shadow-shadow-4)',
+  'shadow-shadow-5': 'var(--color-shadow-shadow-5)',
+  'shadow-shadow-6': 'var(--color-shadow-shadow-6)',
+  'shadow-shadow-7': 'var(--color-shadow-shadow-7)',
+  'shadow-shadow-8': 'var(--color-shadow-shadow-8)',
+  'shadow-shadow-9': 'var(--color-shadow-shadow-9)',
+  'shadow-shadow-2': 'var(--color-shadow-shadow-2)',
+  'shadow-shadow-10': 'var(--color-shadow-shadow-10)',
+
+  'workflow-block-border': 'var(--color-workflow-block-border)',
+  'workflow-block-parma-bg': 'var(--color-workflow-block-parma-bg)',
+  'workflow-block-bg': 'var(--color-workflow-block-bg)',
+  'workflow-block-bg-transparent': 'var(--color-workflow-block-bg-transparent)',
+  'workflow-block-border-highlight': 'var(--color-workflow-block-border-highlight)',
+
+  'workflow-canvas-workflow-dot-color': 'var(--color-workflow-canvas-workflow-dot-color)',
+  'workflow-canvas-workflow-bg': 'var(--color-workflow-canvas-workflow-bg)',
+
+  'workflow-link-line-active': 'var(--color-workflow-link-line-active)',
+  'workflow-link-line-normal': 'var(--color-workflow-link-line-normal)',
+  'workflow-link-line-handle': 'var(--color-workflow-link-line-handle)',
+  'workflow-link-line-normal-transparent': 'var(--color-workflow-link-line-normal-transparent)',
+  'workflow-link-line-failure-active': 'var(--color-workflow-link-line-failure-active)',
+  'workflow-link-line-failure-handle': 'var(--color-workflow-link-line-failure-handle)',
+  'workflow-link-line-failure-button-bg': 'var(--color-workflow-link-line-failure-button-bg)',
+  'workflow-link-line-failure-button-hover': 'var(--color-workflow-link-line-failure-button-hover)',
+
+  'workflow-link-line-success-active': 'var(--color-workflow-link-line-success-active)',
+  'workflow-link-line-success-handle': 'var(--color-workflow-link-line-success-handle)',
+
+  'workflow-link-line-error-active': 'var(--color-workflow-link-line-error-active)',
+  'workflow-link-line-error-handle': 'var(--color-workflow-link-line-error-handle)',
+
+  'workflow-minimap-bg': 'var(--color-workflow-minimap-bg)',
+  'workflow-minimap-block': 'var(--color-workflow-minimap-block)',
+
+  'workflow-display-success-bg': 'var(--color-workflow-display-success-bg)',
+  'workflow-display-success-border-1': 'var(--color-workflow-display-success-border-1)',
+  'workflow-display-success-border-2': 'var(--color-workflow-display-success-border-2)',
+  'workflow-display-success-vignette-color': 'var(--color-workflow-display-success-vignette-color)',
+  'workflow-display-success-bg-line-pattern': 'var(--color-workflow-display-success-bg-line-pattern)',
+
+  'workflow-display-glass-1': 'var(--color-workflow-display-glass-1)',
+  'workflow-display-glass-2': 'var(--color-workflow-display-glass-2)',
+  'workflow-display-vignette-dark': 'var(--color-workflow-display-vignette-dark)',
+  'workflow-display-highlight': 'var(--color-workflow-display-highlight)',
+  'workflow-display-outline': 'var(--color-workflow-display-outline)',
+  'workflow-display-error-bg': 'var(--color-workflow-display-error-bg)',
+  'workflow-display-error-bg-line-pattern': 'var(--color-workflow-display-error-bg-line-pattern)',
+  'workflow-display-error-border-1': 'var(--color-workflow-display-error-border-1)',
+  'workflow-display-error-border-2': 'var(--color-workflow-display-error-border-2)',
+  'workflow-display-error-vignette-color': 'var(--color-workflow-display-error-vignette-color)',
+
+  'workflow-display-warning-bg': 'var(--color-workflow-display-warning-bg)',
+  'workflow-display-warning-bg-line-pattern': 'var(--color-workflow-display-warning-bg-line-pattern)',
+  'workflow-display-warning-border-1': 'var(--color-workflow-display-warning-border-1)',
+  'workflow-display-warning-border-2': 'var(--color-workflow-display-warning-border-2)',
+  'workflow-display-warning-vignette-color': 'var(--color-workflow-display-warning-vignette-color)',
+
+  'workflow-display-normal-bg': 'var(--color-workflow-display-normal-bg)',
+  'workflow-display-normal-bg-line-pattern': 'var(--color-workflow-display-normal-bg-line-pattern)',
+  'workflow-display-normal-border-1': 'var(--color-workflow-display-normal-border-1)',
+  'workflow-display-normal-border-2': 'var(--color-workflow-display-normal-border-2)',
+  'workflow-display-normal-vignette-color': 'var(--color-workflow-display-normal-vignette-color)',
+
+  'workflow-display-disabled-bg': 'var(--color-workflow-display-disabled-bg)',
+  'workflow-display-disabled-bg-line-pattern': 'var(--color-workflow-display-disabled-bg-line-pattern)',
+  'workflow-display-disabled-border-1': 'var(--color-workflow-display-disabled-border-1)',
+  'workflow-display-disabled-border-2': 'var(--color-workflow-display-disabled-border-2)',
+  'workflow-display-disabled-vignette-color': 'var(--color-workflow-display-disabled-vignette-color)',
+  'workflow-display-disabled-outline': 'var(--color-workflow-display-disabled-outline)',
+
+  'workflow-workflow-progress-bg-1': 'var(--color-workflow-workflow-progress-bg-1)',
+  'workflow-workflow-progress-bg-2': 'var(--color-workflow-workflow-progress-bg-2)',
+
+  'divider-subtle': 'var(--color-divider-subtle)',
+  'divider-regular': 'var(--color-divider-regular)',
+  'divider-deep': 'var(--color-divider-deep)',
+  'divider-burn': 'var(--color-divider-burn)',
+  'divider-intense': 'var(--color-divider-intense)',
+  'divider-solid': 'var(--color-divider-solid)',
+  'divider-solid-alt': 'var(--color-divider-solid-alt)',
+
+  'state-base-hover': 'var(--color-state-base-hover)',
+  'state-base-active': 'var(--color-state-base-active)',
+  'state-base-hover-alt': 'var(--color-state-base-hover-alt)',
+  'state-base-handle': 'var(--color-state-base-handle)',
+  'state-base-handle-hover': 'var(--color-state-base-handle-hover)',
+  'state-base-hover-subtle': 'var(--color-state-base-hover-subtle)',
+
+  'state-accent-hover': 'var(--color-state-accent-hover)',
+  'state-accent-active': 'var(--color-state-accent-active)',
+  'state-accent-hover-alt': 'var(--color-state-accent-hover-alt)',
+  'state-accent-solid': 'var(--color-state-accent-solid)',
+  'state-accent-active-alt': 'var(--color-state-accent-active-alt)',
+
+  'state-destructive-hover': 'var(--color-state-destructive-hover)',
+  'state-destructive-hover-alt': 'var(--color-state-destructive-hover-alt)',
+  'state-destructive-active': 'var(--color-state-destructive-active)',
+  'state-destructive-solid': 'var(--color-state-destructive-solid)',
+  'state-destructive-border': 'var(--color-state-destructive-border)',
+
+  'state-success-hover': 'var(--color-state-success-hover)',
+  'state-success-hover-alt': 'var(--color-state-success-hover-alt)',
+  'state-success-active': 'var(--color-state-success-active)',
+  'state-success-solid': 'var(--color-state-success-solid)',
+
+  'state-warning-hover': 'var(--color-state-warning-hover)',
+  'state-warning-hover-alt': 'var(--color-state-warning-hover-alt)',
+  'state-warning-active': 'var(--color-state-warning-active)',
+  'state-warning-solid': 'var(--color-state-warning-solid)',
+
+  'effects-highlight': 'var(--color-effects-highlight)',
+  'effects-highlight-lightmode-off': 'var(--color-effects-highlight-lightmode-off)',
+  'effects-image-frame': 'var(--color-effects-image-frame)',
+
+  'util-colors-orange-dark-orange-dark-50': 'var(--color-util-colors-orange-dark-orange-dark-50)',
+  'util-colors-orange-dark-orange-dark-100': 'var(--color-util-colors-orange-dark-orange-dark-100)',
+  'util-colors-orange-dark-orange-dark-200': 'var(--color-util-colors-orange-dark-orange-dark-200)',
+  'util-colors-orange-dark-orange-dark-300': 'var(--color-util-colors-orange-dark-orange-dark-300)',
+  'util-colors-orange-dark-orange-dark-400': 'var(--color-util-colors-orange-dark-orange-dark-400)',
+  'util-colors-orange-dark-orange-dark-500': 'var(--color-util-colors-orange-dark-orange-dark-500)',
+  'util-colors-orange-dark-orange-dark-600': 'var(--color-util-colors-orange-dark-orange-dark-600)',
+  'util-colors-orange-dark-orange-dark-700': 'var(--color-util-colors-orange-dark-orange-dark-700)',
+
+  'util-colors-orange-orange-50': 'var(--color-util-colors-orange-orange-50)',
+  'util-colors-orange-orange-100': 'var(--color-util-colors-orange-orange-100)',
+  'util-colors-orange-orange-200': 'var(--color-util-colors-orange-orange-200)',
+  'util-colors-orange-orange-300': 'var(--color-util-colors-orange-orange-300)',
+  'util-colors-orange-orange-400': 'var(--color-util-colors-orange-orange-400)',
+  'util-colors-orange-orange-500': 'var(--color-util-colors-orange-orange-500)',
+  'util-colors-orange-orange-600': 'var(--color-util-colors-orange-orange-600)',
+  'util-colors-orange-orange-700': 'var(--color-util-colors-orange-orange-700)',
+  'util-colors-orange-orange-100-transparent': 'var(--color-util-colors-orange-orange-100-transparent)',
+
+  'util-colors-pink-pink-50': 'var(--color-util-colors-pink-pink-50)',
+  'util-colors-pink-pink-100': 'var(--color-util-colors-pink-pink-100)',
+  'util-colors-pink-pink-200': 'var(--color-util-colors-pink-pink-200)',
+  'util-colors-pink-pink-300': 'var(--color-util-colors-pink-pink-300)',
+  'util-colors-pink-pink-400': 'var(--color-util-colors-pink-pink-400)',
+  'util-colors-pink-pink-500': 'var(--color-util-colors-pink-pink-500)',
+  'util-colors-pink-pink-600': 'var(--color-util-colors-pink-pink-600)',
+  'util-colors-pink-pink-700': 'var(--color-util-colors-pink-pink-700)',
+
+  'util-colors-fuchsia-fuchsia-50': 'var(--color-util-colors-fuchsia-fuchsia-50)',
+  'util-colors-fuchsia-fuchsia-100': 'var(--color-util-colors-fuchsia-fuchsia-100)',
+  'util-colors-fuchsia-fuchsia-200': 'var(--color-util-colors-fuchsia-fuchsia-200)',
+  'util-colors-fuchsia-fuchsia-300': 'var(--color-util-colors-fuchsia-fuchsia-300)',
+  'util-colors-fuchsia-fuchsia-400': 'var(--color-util-colors-fuchsia-fuchsia-400)',
+  'util-colors-fuchsia-fuchsia-500': 'var(--color-util-colors-fuchsia-fuchsia-500)',
+  'util-colors-fuchsia-fuchsia-600': 'var(--color-util-colors-fuchsia-fuchsia-600)',
+  'util-colors-fuchsia-fuchsia-700': 'var(--color-util-colors-fuchsia-fuchsia-700)',
+
+  'util-colors-purple-purple-50': 'var(--color-util-colors-purple-purple-50)',
+  'util-colors-purple-purple-100': 'var(--color-util-colors-purple-purple-100)',
+  'util-colors-purple-purple-200': 'var(--color-util-colors-purple-purple-200)',
+  'util-colors-purple-purple-300': 'var(--color-util-colors-purple-purple-300)',
+  'util-colors-purple-purple-400': 'var(--color-util-colors-purple-purple-400)',
+  'util-colors-purple-purple-500': 'var(--color-util-colors-purple-purple-500)',
+  'util-colors-purple-purple-600': 'var(--color-util-colors-purple-purple-600)',
+  'util-colors-purple-purple-700': 'var(--color-util-colors-purple-purple-700)',
+
+  'util-colors-indigo-indigo-50': 'var(--color-util-colors-indigo-indigo-50)',
+  'util-colors-indigo-indigo-100': 'var(--color-util-colors-indigo-indigo-100)',
+  'util-colors-indigo-indigo-200': 'var(--color-util-colors-indigo-indigo-200)',
+  'util-colors-indigo-indigo-300': 'var(--color-util-colors-indigo-indigo-300)',
+  'util-colors-indigo-indigo-400': 'var(--color-util-colors-indigo-indigo-400)',
+  'util-colors-indigo-indigo-500': 'var(--color-util-colors-indigo-indigo-500)',
+  'util-colors-indigo-indigo-600': 'var(--color-util-colors-indigo-indigo-600)',
+  'util-colors-indigo-indigo-700': 'var(--color-util-colors-indigo-indigo-700)',
+
+  'util-colors-blue-blue-50': 'var(--color-util-colors-blue-blue-50)',
+  'util-colors-blue-blue-100': 'var(--color-util-colors-blue-blue-100)',
+  'util-colors-blue-blue-200': 'var(--color-util-colors-blue-blue-200)',
+  'util-colors-blue-blue-300': 'var(--color-util-colors-blue-blue-300)',
+  'util-colors-blue-blue-400': 'var(--color-util-colors-blue-blue-400)',
+  'util-colors-blue-blue-500': 'var(--color-util-colors-blue-blue-500)',
+  'util-colors-blue-blue-600': 'var(--color-util-colors-blue-blue-600)',
+  'util-colors-blue-blue-700': 'var(--color-util-colors-blue-blue-700)',
+
+  'util-colors-blue-light-blue-light-50': 'var(--color-util-colors-blue-light-blue-light-50)',
+  'util-colors-blue-light-blue-light-100': 'var(--color-util-colors-blue-light-blue-light-100)',
+  'util-colors-blue-light-blue-light-200': 'var(--color-util-colors-blue-light-blue-light-200)',
+  'util-colors-blue-light-blue-light-300': 'var(--color-util-colors-blue-light-blue-light-300)',
+  'util-colors-blue-light-blue-light-400': 'var(--color-util-colors-blue-light-blue-light-400)',
+  'util-colors-blue-light-blue-light-500': 'var(--color-util-colors-blue-light-blue-light-500)',
+  'util-colors-blue-light-blue-light-600': 'var(--color-util-colors-blue-light-blue-light-600)',
+  'util-colors-blue-light-blue-light-700': 'var(--color-util-colors-blue-light-blue-light-700)',
+
+  'util-colors-gray-blue-gray-blue-50': 'var(--color-util-colors-gray-blue-gray-blue-50)',
+  'util-colors-gray-blue-gray-blue-100': 'var(--color-util-colors-gray-blue-gray-blue-100)',
+  'util-colors-gray-blue-gray-blue-200': 'var(--color-util-colors-gray-blue-gray-blue-200)',
+  'util-colors-gray-blue-gray-blue-300': 'var(--color-util-colors-gray-blue-gray-blue-300)',
+  'util-colors-gray-blue-gray-blue-400': 'var(--color-util-colors-gray-blue-gray-blue-400)',
+  'util-colors-gray-blue-gray-blue-500': 'var(--color-util-colors-gray-blue-gray-blue-500)',
+  'util-colors-gray-blue-gray-blue-600': 'var(--color-util-colors-gray-blue-gray-blue-600)',
+  'util-colors-gray-blue-gray-blue-700': 'var(--color-util-colors-gray-blue-gray-blue-700)',
+
+  'util-colors-blue-brand-blue-brand-50': 'var(--color-util-colors-blue-brand-blue-brand-50)',
+  'util-colors-blue-brand-blue-brand-100': 'var(--color-util-colors-blue-brand-blue-brand-100)',
+  'util-colors-blue-brand-blue-brand-200': 'var(--color-util-colors-blue-brand-blue-brand-200)',
+  'util-colors-blue-brand-blue-brand-300': 'var(--color-util-colors-blue-brand-blue-brand-300)',
+  'util-colors-blue-brand-blue-brand-400': 'var(--color-util-colors-blue-brand-blue-brand-400)',
+  'util-colors-blue-brand-blue-brand-500': 'var(--color-util-colors-blue-brand-blue-brand-500)',
+  'util-colors-blue-brand-blue-brand-600': 'var(--color-util-colors-blue-brand-blue-brand-600)',
+  'util-colors-blue-brand-blue-brand-700': 'var(--color-util-colors-blue-brand-blue-brand-700)',
+
+  'util-colors-red-red-50': 'var(--color-util-colors-red-red-50)',
+  'util-colors-red-red-100': 'var(--color-util-colors-red-red-100)',
+  'util-colors-red-red-200': 'var(--color-util-colors-red-red-200)',
+  'util-colors-red-red-300': 'var(--color-util-colors-red-red-300)',
+  'util-colors-red-red-400': 'var(--color-util-colors-red-red-400)',
+  'util-colors-red-red-500': 'var(--color-util-colors-red-red-500)',
+  'util-colors-red-red-600': 'var(--color-util-colors-red-red-600)',
+  'util-colors-red-red-700': 'var(--color-util-colors-red-red-700)',
+
+  'util-colors-green-green-50': 'var(--color-util-colors-green-green-50)',
+  'util-colors-green-green-100': 'var(--color-util-colors-green-green-100)',
+  'util-colors-green-green-200': 'var(--color-util-colors-green-green-200)',
+  'util-colors-green-green-300': 'var(--color-util-colors-green-green-300)',
+  'util-colors-green-green-400': 'var(--color-util-colors-green-green-400)',
+  'util-colors-green-green-500': 'var(--color-util-colors-green-green-500)',
+  'util-colors-green-green-600': 'var(--color-util-colors-green-green-600)',
+  'util-colors-green-green-700': 'var(--color-util-colors-green-green-700)',
+
+  'util-colors-warning-warning-50': 'var(--color-util-colors-warning-warning-50)',
+  'util-colors-warning-warning-100': 'var(--color-util-colors-warning-warning-100)',
+  'util-colors-warning-warning-200': 'var(--color-util-colors-warning-warning-200)',
+  'util-colors-warning-warning-300': 'var(--color-util-colors-warning-warning-300)',
+  'util-colors-warning-warning-400': 'var(--color-util-colors-warning-warning-400)',
+  'util-colors-warning-warning-500': 'var(--color-util-colors-warning-warning-500)',
+  'util-colors-warning-warning-600': 'var(--color-util-colors-warning-warning-600)',
+  'util-colors-warning-warning-700': 'var(--color-util-colors-warning-warning-700)',
+
+  'util-colors-yellow-yellow-50': 'var(--color-util-colors-yellow-yellow-50)',
+  'util-colors-yellow-yellow-100': 'var(--color-util-colors-yellow-yellow-100)',
+  'util-colors-yellow-yellow-200': 'var(--color-util-colors-yellow-yellow-200)',
+  'util-colors-yellow-yellow-300': 'var(--color-util-colors-yellow-yellow-300)',
+  'util-colors-yellow-yellow-400': 'var(--color-util-colors-yellow-yellow-400)',
+  'util-colors-yellow-yellow-500': 'var(--color-util-colors-yellow-yellow-500)',
+  'util-colors-yellow-yellow-600': 'var(--color-util-colors-yellow-yellow-600)',
+  'util-colors-yellow-yellow-700': 'var(--color-util-colors-yellow-yellow-700)',
+
+  'util-colors-teal-teal-50': 'var(--color-util-colors-teal-teal-50)',
+  'util-colors-teal-teal-100': 'var(--color-util-colors-teal-teal-100)',
+  'util-colors-teal-teal-200': 'var(--color-util-colors-teal-teal-200)',
+  'util-colors-teal-teal-300': 'var(--color-util-colors-teal-teal-300)',
+  'util-colors-teal-teal-400': 'var(--color-util-colors-teal-teal-400)',
+  'util-colors-teal-teal-500': 'var(--color-util-colors-teal-teal-500)',
+  'util-colors-teal-teal-600': 'var(--color-util-colors-teal-teal-600)',
+  'util-colors-teal-teal-700': 'var(--color-util-colors-teal-teal-700)',
+
+  'util-colors-cyan-cyan-50': 'var(--color-util-colors-cyan-cyan-50)',
+  'util-colors-cyan-cyan-100': 'var(--color-util-colors-cyan-cyan-100)',
+  'util-colors-cyan-cyan-200': 'var(--color-util-colors-cyan-cyan-200)',
+  'util-colors-cyan-cyan-300': 'var(--color-util-colors-cyan-cyan-300)',
+  'util-colors-cyan-cyan-400': 'var(--color-util-colors-cyan-cyan-400)',
+  'util-colors-cyan-cyan-500': 'var(--color-util-colors-cyan-cyan-500)',
+  'util-colors-cyan-cyan-600': 'var(--color-util-colors-cyan-cyan-600)',
+  'util-colors-cyan-cyan-700': 'var(--color-util-colors-cyan-cyan-700)',
+
+  'util-colors-violet-violet-50': 'var(--color-util-colors-violet-violet-50)',
+  'util-colors-violet-violet-100': 'var(--color-util-colors-violet-violet-100)',
+  'util-colors-violet-violet-200': 'var(--color-util-colors-violet-violet-200)',
+  'util-colors-violet-violet-300': 'var(--color-util-colors-violet-violet-300)',
+  'util-colors-violet-violet-400': 'var(--color-util-colors-violet-violet-400)',
+  'util-colors-violet-violet-500': 'var(--color-util-colors-violet-violet-500)',
+  'util-colors-violet-violet-600': 'var(--color-util-colors-violet-violet-600)',
+  'util-colors-violet-violet-700': 'var(--color-util-colors-violet-violet-700)',
+
+  'util-colors-gray-gray-50': 'var(--color-util-colors-gray-gray-50)',
+  'util-colors-gray-gray-100': 'var(--color-util-colors-gray-gray-100)',
+  'util-colors-gray-gray-200': 'var(--color-util-colors-gray-gray-200)',
+  'util-colors-gray-gray-300': 'var(--color-util-colors-gray-gray-300)',
+  'util-colors-gray-gray-400': 'var(--color-util-colors-gray-gray-400)',
+  'util-colors-gray-gray-500': 'var(--color-util-colors-gray-gray-500)',
+  'util-colors-gray-gray-600': 'var(--color-util-colors-gray-gray-600)',
+  'util-colors-gray-gray-700': 'var(--color-util-colors-gray-gray-700)',
+
+  'util-colors-green-light-green-light-50': 'var(--color-util-colors-green-light-green-light-50)',
+  'util-colors-green-light-green-light-100': 'var(--color-util-colors-green-light-green-light-100)',
+  'util-colors-green-light-green-light-200': 'var(--color-util-colors-green-light-green-light-200)',
+  'util-colors-green-light-green-light-300': 'var(--color-util-colors-green-light-green-light-300)',
+  'util-colors-green-light-green-light-500': 'var(--color-util-colors-green-light-green-light-500)',
+  'util-colors-green-light-green-light-400': 'var(--color-util-colors-green-light-green-light-400)',
+  'util-colors-green-light-green-light-600': 'var(--color-util-colors-green-light-green-light-600)',
+  'util-colors-green-light-green-light-700': 'var(--color-util-colors-green-light-green-light-700)',
+
+  'util-colors-rose-rose-50': 'var(--color-util-colors-rose-rose-50)',
+  'util-colors-rose-rose-100': 'var(--color-util-colors-rose-rose-100)',
+  'util-colors-rose-rose-200': 'var(--color-util-colors-rose-rose-200)',
+  'util-colors-rose-rose-300': 'var(--color-util-colors-rose-rose-300)',
+  'util-colors-rose-rose-400': 'var(--color-util-colors-rose-rose-400)',
+  'util-colors-rose-rose-500': 'var(--color-util-colors-rose-rose-500)',
+  'util-colors-rose-rose-600': 'var(--color-util-colors-rose-rose-600)',
+  'util-colors-rose-rose-700': 'var(--color-util-colors-rose-rose-700)',
+
+  'util-colors-midnight-midnight-50': 'var(--color-util-colors-midnight-midnight-50)',
+  'util-colors-midnight-midnight-100': 'var(--color-util-colors-midnight-midnight-100)',
+  'util-colors-midnight-midnight-200': 'var(--color-util-colors-midnight-midnight-200)',
+  'util-colors-midnight-midnight-300': 'var(--color-util-colors-midnight-midnight-300)',
+  'util-colors-midnight-midnight-400': 'var(--color-util-colors-midnight-midnight-400)',
+  'util-colors-midnight-midnight-500': 'var(--color-util-colors-midnight-midnight-500)',
+  'util-colors-midnight-midnight-600': 'var(--color-util-colors-midnight-midnight-600)',
+  'util-colors-midnight-midnight-700': 'var(--color-util-colors-midnight-midnight-700)',
+
+  'third-party-LangChain': 'var(--color-third-party-LangChain)',
+  'third-party-Langfuse': 'var(--color-third-party-Langfuse)',
+  'third-party-Github': 'var(--color-third-party-Github)',
+  'third-party-Github-tertiary': 'var(--color-third-party-Github-tertiary)',
+  'third-party-Github-secondary': 'var(--color-third-party-Github-secondary)',
+  'third-party-model-bg-openai': 'var(--color-third-party-model-bg-openai)',
+  'third-party-model-bg-anthropic': 'var(--color-third-party-model-bg-anthropic)',
+  'third-party-model-bg-default': 'var(--color-third-party-model-bg-default)',
+
+  'third-party-aws': 'var(--color-third-party-aws)',
+  'third-party-aws-alt': 'var(--color-third-party-aws-alt)',
+
+  'saas-background': 'var(--color-saas-background)',
+  'saas-pricing-grid-bg': 'var(--color-saas-pricing-grid-bg)',
+
+}
+export default vars
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..c3e0bca
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,42 @@
+{
+  "compilerOptions": {
+    "target": "es2015",
+    "lib": [
+      "dom",
+      "dom.iterable",
+      "esnext"
+    ],
+    "allowJs": true,
+    "skipLibCheck": true,
+    "strict": true,
+    "forceConsistentCasingInFileNames": true,
+    "noEmit": true,
+    "esModuleInterop": true,
+    "module": "esnext",
+    "moduleResolution": "node",
+    "resolveJsonModule": true,
+    "isolatedModules": true,
+    "jsx": "preserve",
+    "incremental": true,
+    "plugins": [
+      {
+        "name": "next"
+      }
+    ],
+    "paths": {
+      "@/*": [
+        "./*"
+      ]
+    }
+  },
+  "include": [
+    "next-env.d.ts",
+    "**/*.ts",
+    "**/*.tsx",
+    ".next/types/**/*.ts",
+    "app/components/develop/Prose.jsx"
+  ],
+  "exclude": [
+    "node_modules"
+  ]
+}
diff --git a/types/app.ts b/types/app.ts
new file mode 100644
index 0000000..39f011d
--- /dev/null
+++ b/types/app.ts
@@ -0,0 +1,450 @@
+import type { AnnotationReplyConfig, ChatPromptConfig, CompletionPromptConfig, DatasetConfigs, PromptMode } from '@/models/debug'
+import type { CollectionType } from '@/app/components/tools/types'
+import type { LanguagesSupported } from '@/i18n/language'
+import type { Tag } from '@/app/components/base/tag-management/constant'
+import type {
+  RerankingModeEnum,
+  WeightedScoreEnum,
+} from '@/models/datasets'
+import type { UploadFileSetting } from '@/app/components/workflow/types'
+
+export enum Theme {
+  light = 'light',
+  dark = 'dark',
+  system = 'system',
+}
+
+export enum ProviderType {
+  openai = 'openai',
+  anthropic = 'anthropic',
+  azure_openai = 'azure_openai',
+  replicate = 'replicate',
+  huggingface_hub = 'huggingface_hub',
+  minimax = 'minimax',
+  tongyi = 'tongyi',
+  spark = 'spark',
+}
+
+export enum AppType {
+  chat = 'chat',
+  completion = 'completion',
+}
+
+export enum ModelModeType {
+  chat = 'chat',
+  completion = 'completion',
+  unset = '',
+}
+
+export enum RETRIEVE_TYPE {
+  oneWay = 'single',
+  multiWay = 'multiple',
+}
+
+export enum RETRIEVE_METHOD {
+  semantic = 'semantic_search',
+  fullText = 'full_text_search',
+  hybrid = 'hybrid_search',
+  invertedIndex = 'invertedIndex',
+  keywordSearch = 'keyword_search',
+}
+
+export type VariableInput = {
+  key: string
+  name: string
+  value: string
+}
+
+/**
+ * App modes
+ */
+export const AppModes = ['advanced-chat', 'agent-chat', 'chat', 'completion', 'workflow'] as const
+export type AppMode = typeof AppModes[number]
+
+/**
+ * Variable type
+ */
+export const VariableTypes = ['string', 'number', 'select'] as const
+export type VariableType = typeof VariableTypes[number]
+
+/**
+ * Prompt variable parameter
+ */
+export type PromptVariable = {
+  /** Variable key */
+  key: string
+  /** Variable name */
+  name: string
+  /** Type */
+  type: VariableType
+  required: boolean
+  /** Enumeration of single-selection drop-down values */
+  options?: string[]
+  max_length?: number
+}
+
+export type TextTypeFormItem = {
+  default: string
+  label: string
+  variable: string
+  required: boolean
+  max_length: number
+}
+
+export type SelectTypeFormItem = {
+  default: string
+  label: string
+  variable: string
+  required: boolean
+  options: string[]
+}
+
+export type ParagraphTypeFormItem = {
+  default: string
+  label: string
+  variable: string
+  required: boolean
+}
+/**
+ * User Input Form Item
+ */
+export type UserInputFormItem = {
+  'text-input': TextTypeFormItem
+} | {
+  select: SelectTypeFormItem
+} | {
+  paragraph: TextTypeFormItem
+}
+
+export type AgentTool = {
+  provider_id: string
+  provider_type: CollectionType
+  provider_name: string
+  tool_name: string
+  tool_label: string
+  tool_parameters: Record<string, any>
+  enabled: boolean
+  isDeleted?: boolean
+  notAuthor?: boolean
+}
+
+export type ToolItem = {
+  dataset: {
+    enabled: boolean
+    id: string
+  }
+} | {
+  'sensitive-word-avoidance': {
+    enabled: boolean
+    words: string[]
+    canned_response: string
+  }
+} | AgentTool
+
+export enum AgentStrategy {
+  functionCall = 'function_call',
+  react = 'react',
+}
+
+export type CompletionParams = {
+  /** Maximum number of tokens in the answer message returned by Completion */
+  max_tokens: number
+  /**
+   * A number between 0 and 2.
+   * The larger the number, the more random the result;
+   * otherwise, the more deterministic.
+   * When in use, choose either `temperature` or `top_p`.
+   * Default is 1.
+   */
+  temperature: number
+  /**
+   * Represents the proportion of probability mass samples to take,
+   * e.g., 0.1 means taking the top 10% probability mass samples.
+   * The determinism between the samples is basically consistent.
+   * Among these results, the `top_p` probability mass results are taken.
+   * When in use, choose either `temperature` or `top_p`.
+   * Default is 1.
+   */
+  top_p: number
+  /** When enabled, the Completion Text will concatenate the Prompt content together and return it. */
+  echo: boolean
+  /**
+   * Specify up to 4 to automatically stop generating before the text specified in `stop`.
+   * Suitable for use in chat mode.
+   * For example, specify "Q" and "A",
+   * and provide some Q&A examples as context,
+   * and the model will give out in Q&A format and stop generating before Q&A.
+   */
+  stop: string[]
+  /**
+   * A number between -2.0 and 2.0.
+   * The larger the value, the less the model will repeat topics and the more it will provide new topics.
+   */
+  presence_penalty: number
+  /**
+   * A number between -2.0 and 2.0.
+   * A lower setting will make the model appear less cultured,
+   * always repeating expressions.
+   * The difference between `frequency_penalty` and `presence_penalty`
+   * is that `frequency_penalty` penalizes a word based on its frequency in the training data,
+   * while `presence_penalty` penalizes a word based on its occurrence in the input text.
+   */
+  frequency_penalty: number
+}
+/**
+ * Model configuration. The backend type.
+ */
+export type Model = {
+  /** LLM provider, e.g., OPENAI */
+  provider: string
+  /** Model name, e.g, gpt-3.5.turbo */
+  name: string
+  mode: ModelModeType
+  /** Default Completion call parameters */
+  completion_params: CompletionParams
+}
+
+export type ModelConfig = {
+  opening_statement: string
+  suggested_questions?: string[]
+  pre_prompt: string
+  prompt_type: PromptMode
+  chat_prompt_config: ChatPromptConfig | {}
+  completion_prompt_config: CompletionPromptConfig | {}
+  user_input_form: UserInputFormItem[]
+  dataset_query_variable?: string
+  more_like_this: {
+    enabled?: boolean
+  }
+  suggested_questions_after_answer: {
+    enabled: boolean
+  }
+  speech_to_text: {
+    enabled: boolean
+  }
+  text_to_speech: {
+    enabled: boolean
+    voice?: string
+    language?: string
+    autoPlay?: TtsAutoPlay
+  }
+  retriever_resource: {
+    enabled: boolean
+  }
+  sensitive_word_avoidance: {
+    enabled: boolean
+  }
+  annotation_reply?: AnnotationReplyConfig
+  agent_mode: {
+    enabled: boolean
+    strategy?: AgentStrategy
+    tools: ToolItem[]
+  }
+  model: Model
+  dataset_configs: DatasetConfigs
+  file_upload?: {
+    image: VisionSettings
+  } & UploadFileSetting
+  files?: VisionFile[]
+  created_at?: number
+  updated_at?: number
+}
+
+export type Language = typeof LanguagesSupported[number]
+
+/**
+ * Web Application Configuration
+ */
+export type SiteConfig = {
+  /** Application URL Identifier: `http://dify.app/{access_token}` */
+  access_token: string
+  /** Public Title */
+  title: string
+  /** Application Description will be shown in the Client  */
+  description: string
+  /** Define the color in hex for different elements of the chatbot, such as:
+   * The header, the button , etc.
+    */
+  chat_color_theme: string
+  /** Invert the color of the theme set in chat_color_theme */
+  chat_color_theme_inverted: boolean
+  /** Author */
+  author: string
+  /** User Support Email Address */
+  support_email: string
+  /**
+   * Default Language, e.g. zh-Hans, en-US
+   * Use standard RFC 4646, see https://www.ruanyifeng.com/blog/2008/02/codes_for_language_names.html
+   */
+  default_language: Language
+  /**  Custom Domain */
+  customize_domain: string
+  /** Theme */
+  theme: string
+  /** Custom Token strategy Whether Terminal Users can choose their OpenAI Key */
+  customize_token_strategy: 'must' | 'allow' | 'not_allow'
+  /** Is Prompt Public */
+  prompt_public: boolean
+  /** Web API and APP Base Domain Name */
+  app_base_url: string
+  /** Copyright */
+  copyright: string
+  /** Privacy Policy */
+  privacy_policy: string
+  /** Custom Disclaimer */
+  custom_disclaimer: string
+
+  icon_type: AppIconType | null
+  icon: string
+  icon_background: string | null
+  icon_url: string | null
+
+  show_workflow_steps: boolean
+  use_icon_as_answer_icon: boolean
+}
+
+export type AppIconType = 'image' | 'emoji'
+
+/**
+ * App
+ */
+export type App = {
+  /** App ID */
+  id: string
+  /** Name */
+  name: string
+  /** Description */
+  description: string
+
+  /**
+   * Icon Type
+   * @default 'emoji'
+  */
+  icon_type: AppIconType | null
+  /** Icon, stores file ID if icon_type is 'image' */
+  icon: string
+  /** Icon Background, only available when icon_type is null or 'emoji' */
+  icon_background: string | null
+  /** Icon URL, only available when icon_type is 'image' */
+  icon_url: string | null
+  /** Whether to use app icon as answer icon */
+  use_icon_as_answer_icon: boolean
+
+  /** Mode */
+  mode: AppMode
+  /** Enable web app */
+  enable_site: boolean
+  /** Enable web API */
+  enable_api: boolean
+  /** API requests per minute, default is 60 */
+  api_rpm: number
+  /** API requests per hour, default is 3600 */
+  api_rph: number
+  /** Whether it's a demo app */
+  is_demo: boolean
+  /** Model configuration */
+  model_config: ModelConfig
+  app_model_config: ModelConfig
+  /** Timestamp of creation */
+  created_at: number
+  /** Web Application Configuration */
+  site: SiteConfig
+  /** api site url */
+  api_base_url: string
+  tags: Tag[]
+  workflow?: {
+    id: string
+    created_at: number
+    created_by?: string
+    updated_at: number
+    updated_by?: string
+  }
+}
+
+export type AppSSO = {
+  enable_sso: boolean
+}
+
+/**
+ * App Template
+ */
+export type AppTemplate = {
+  /** Name */
+  name: string
+  /** Description */
+  description: string
+  /** Mode */
+  mode: AppMode
+  /** Model */
+  model_config: ModelConfig
+}
+
+export enum Resolution {
+  low = 'low',
+  high = 'high',
+}
+
+export enum TransferMethod {
+  all = 'all',
+  local_file = 'local_file',
+  remote_url = 'remote_url',
+}
+
+export enum TtsAutoPlay {
+  enabled = 'enabled',
+  disabled = 'disabled',
+}
+
+export const ALLOW_FILE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'webp', 'gif']
+
+export type VisionSettings = {
+  enabled: boolean
+  number_limits: number
+  detail: Resolution
+  transfer_methods: TransferMethod[]
+  image_file_size_limit?: number | string
+}
+
+export type ImageFile = {
+  type: TransferMethod
+  _id: string
+  fileId: string
+  file?: File
+  progress: number
+  url: string
+  base64Url?: string
+  deleted?: boolean
+}
+
+export type VisionFile = {
+  id?: string
+  type: string
+  transfer_method: TransferMethod
+  url: string
+  upload_file_id: string
+  belongs_to?: string
+}
+
+export type RetrievalConfig = {
+  search_method: RETRIEVE_METHOD
+  reranking_enable: boolean
+  reranking_model: {
+    reranking_provider_name: string
+    reranking_model_name: string
+  }
+  top_k: number
+  score_threshold_enabled: boolean
+  score_threshold: number
+  reranking_mode?: RerankingModeEnum
+  weights?: {
+    weight_type: WeightedScoreEnum
+    vector_setting: {
+      vector_weight: number
+      embedding_provider_name: string
+      embedding_model_name: string
+    }
+    keyword_setting: {
+      keyword_weight: number
+    }
+  }
+}
diff --git a/types/feature.ts b/types/feature.ts
new file mode 100644
index 0000000..3d7763b
--- /dev/null
+++ b/types/feature.ts
@@ -0,0 +1,54 @@
+export enum SSOProtocol {
+  SAML = 'saml',
+  OIDC = 'oidc',
+  OAuth2 = 'oauth2',
+}
+
+export enum LicenseStatus {
+  NONE = 'none',
+  INACTIVE = 'inactive',
+  ACTIVE = 'active',
+  EXPIRING = 'expiring',
+  EXPIRED = 'expired',
+  LOST = 'lost',
+}
+
+type License = {
+  status: LicenseStatus
+  expired_at: string | null
+}
+
+export type SystemFeatures = {
+  sso_enforced_for_signin: boolean
+  sso_enforced_for_signin_protocol: SSOProtocol | ''
+  sso_enforced_for_web: boolean
+  sso_enforced_for_web_protocol: SSOProtocol | ''
+  enable_web_sso_switch_component: boolean
+  enable_marketplace: boolean
+  enable_email_code_login: boolean
+  enable_email_password_login: boolean
+  enable_social_oauth_login: boolean
+  is_allow_create_workspace: boolean
+  is_allow_register: boolean
+  is_email_setup: boolean
+  license: License
+}
+
+export const defaultSystemFeatures: SystemFeatures = {
+  sso_enforced_for_signin: false,
+  sso_enforced_for_signin_protocol: '',
+  sso_enforced_for_web: false,
+  sso_enforced_for_web_protocol: '',
+  enable_web_sso_switch_component: false,
+  enable_marketplace: false,
+  enable_email_code_login: false,
+  enable_email_password_login: false,
+  enable_social_oauth_login: false,
+  is_allow_create_workspace: false,
+  is_allow_register: false,
+  is_email_setup: false,
+  license: {
+    status: LicenseStatus.NONE,
+    expired_at: '',
+  },
+}
diff --git a/types/workflow.ts b/types/workflow.ts
new file mode 100644
index 0000000..bd7334a
--- /dev/null
+++ b/types/workflow.ts
@@ -0,0 +1,354 @@
+import type { Viewport } from 'reactflow'
+import type { BlockEnum, ConversationVariable, Edge, EnvironmentVariable, Node } from '@/app/components/workflow/types'
+import type { TransferMethod } from '@/types/app'
+import type { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/components/error-handle/types'
+
+export type AgentLogItem = {
+  node_execution_id: string,
+  id: string,
+  node_id: string,
+  parent_id?: string,
+  label: string,
+  data: object, // debug data
+  error?: string,
+  status: string,
+  metadata?: {
+    elapsed_time?: number
+    provider?: string
+    icon?: string
+  },
+}
+
+export type AgentLogItemWithChildren = AgentLogItem & {
+  hasCircle?: boolean
+  children: AgentLogItemWithChildren[]
+}
+
+export type NodeTracing = {
+  id: string
+  index: number
+  predecessor_node_id: string
+  node_id: string
+  iteration_id?: string
+  loop_id?: string
+  node_type: BlockEnum
+  title: string
+  inputs: any
+  process_data: any
+  outputs?: any
+  status: string
+  parallel_run_id?: string
+  error?: string
+  elapsed_time: number
+  execution_metadata?: {
+    total_tokens: number
+    total_price: number
+    currency: string
+    iteration_id?: string
+    iteration_index?: number
+    loop_id?: string
+    loop_index?: number
+    parallel_id?: string
+    parallel_start_node_id?: string
+    parent_parallel_id?: string
+    parent_parallel_start_node_id?: string
+    parallel_mode_run_id?: string
+    iteration_duration_map?: IterationDurationMap
+    loop_duration_map?: LoopDurationMap
+    error_strategy?: ErrorHandleTypeEnum
+    agent_log?: AgentLogItem[]
+    tool_info?: {
+      agent_strategy?: string
+      icon?: string
+    }
+    loop_variable_map?: Record<string, any>
+  }
+  metadata: {
+    iterator_length: number
+    iterator_index: number
+    loop_length: number
+    loop_index: number
+  }
+  created_at: number
+  created_by: {
+    id: string
+    name: string
+    email: string
+  }
+  iterDurationMap?: IterationDurationMap
+  loopDurationMap?: LoopDurationMap
+  finished_at: number
+  extras?: any
+  expand?: boolean // for UI
+  details?: NodeTracing[][] // iteration or loop detail
+  retryDetail?: NodeTracing[] // retry detail
+  retry_index?: number
+  parallelDetail?: { // parallel detail. if is in parallel, this field will be set
+    isParallelStartNode?: boolean
+    parallelTitle?: string
+    branchTitle?: string
+    children?: NodeTracing[]
+  }
+  parallel_id?: string
+  parallel_start_node_id?: string
+  parent_parallel_id?: string
+  parent_parallel_start_node_id?: string
+  agentLog?: AgentLogItemWithChildren[] // agent log
+}
+
+export type FetchWorkflowDraftResponse = {
+  id: string
+  graph: {
+    nodes: Node[]
+    edges: Edge[]
+    viewport?: Viewport
+  }
+  features?: any
+  created_at: number
+  created_by: {
+    id: string
+    name: string
+    email: string
+  }
+  hash: string
+  updated_at: number
+  updated_by: {
+    id: string
+    name: string
+    email: string
+  },
+  tool_published: boolean
+  environment_variables?: EnvironmentVariable[]
+  conversation_variables?: ConversationVariable[]
+  version: string
+  marked_name: string
+  marked_comment: string
+}
+
+export type VersionHistory = FetchWorkflowDraftResponse
+
+export type FetchWorkflowDraftPageParams = {
+  appId: string
+  initialPage: number
+  limit: number
+  userId?: string
+  namedOnly?: boolean
+}
+
+export type FetchWorkflowDraftPageResponse = {
+  items: VersionHistory[]
+  has_more: boolean
+  page: number
+}
+
+export type NodeTracingListResponse = {
+  data: NodeTracing[]
+}
+
+export type WorkflowStartedResponse = {
+  task_id: string
+  workflow_run_id: string
+  event: string
+  data: {
+    id: string
+    workflow_id: string
+    sequence_number: number
+    created_at: number
+  }
+}
+
+export type WorkflowFinishedResponse = {
+  task_id: string
+  workflow_run_id: string
+  event: string
+  data: {
+    id: string
+    workflow_id: string
+    status: string
+    outputs: any
+    error: string
+    elapsed_time: number
+    total_tokens: number
+    total_steps: number
+    created_at: number
+    created_by: {
+      id: string
+      name: string
+      email: string
+    }
+    finished_at: number
+    files?: FileResponse[]
+  }
+}
+
+export type NodeStartedResponse = {
+  task_id: string
+  workflow_run_id: string
+  event: string
+  data: NodeTracing
+}
+
+export type FileResponse = {
+  related_id: string
+  extension: string
+  filename: string
+  size: number
+  mime_type: string
+  transfer_method: TransferMethod
+  type: string
+  url: string
+  upload_file_id: string
+}
+
+export type NodeFinishedResponse = {
+  task_id: string
+  workflow_run_id: string
+  event: string
+  data: NodeTracing
+}
+
+export type IterationStartedResponse = {
+  task_id: string
+  workflow_run_id: string
+  event: string
+  data: NodeTracing
+}
+
+export type IterationNextResponse = {
+  task_id: string
+  workflow_run_id: string
+  event: string
+  data: NodeTracing
+}
+
+export type IterationFinishedResponse = {
+  task_id: string
+  workflow_run_id: string
+  event: string
+  data: NodeTracing
+}
+
+export type LoopStartedResponse = {
+  task_id: string
+  workflow_run_id: string
+  event: string
+  data: NodeTracing
+}
+
+export type LoopNextResponse = {
+  task_id: string
+  workflow_run_id: string
+  event: string
+  data: NodeTracing
+}
+
+export type LoopFinishedResponse = {
+  task_id: string
+  workflow_run_id: string
+  event: string
+  data: NodeTracing
+}
+
+export type ParallelBranchStartedResponse = {
+  task_id: string
+  workflow_run_id: string
+  event: string
+  data: NodeTracing
+}
+
+export type ParallelBranchFinishedResponse = {
+  task_id: string
+  workflow_run_id: string
+  event: string
+  data: NodeTracing
+}
+
+export type TextChunkResponse = {
+  task_id: string
+  workflow_run_id: string
+  event: string
+  data: {
+    text: string
+  }
+}
+
+export type TextReplaceResponse = {
+  task_id: string
+  workflow_run_id: string
+  event: string
+  data: {
+    text: string
+  }
+}
+
+export type AgentLogResponse = {
+  task_id: string
+  event: string
+  data: AgentLogItemWithChildren
+}
+
+export type WorkflowRunHistory = {
+  id: string
+  sequence_number: number
+  version: string
+  conversation_id?: string
+  message_id?: string
+  graph: {
+    nodes: Node[]
+    edges: Edge[]
+    viewport?: Viewport
+  }
+  inputs: Record<string, string>
+  status: string
+  outputs: Record<string, any>
+  error?: string
+  elapsed_time: number
+  total_tokens: number
+  total_steps: number
+  created_at: number
+  finished_at: number
+  created_by_account: {
+    id: string
+    name: string
+    email: string
+  }
+}
+export type WorkflowRunHistoryResponse = {
+  data: WorkflowRunHistory[]
+}
+
+export type ChatRunHistoryResponse = {
+  data: WorkflowRunHistory[]
+}
+
+export type NodesDefaultConfigsResponse = {
+  type: string
+  config: any
+}[]
+
+export type ConversationVariableResponse = {
+  data: (ConversationVariable & { updated_at: number; created_at: number })[]
+  has_more: boolean
+  limit: number
+  total: number
+  page: number
+}
+
+export type IterationDurationMap = Record<string, number>
+export type LoopDurationMap = Record<string, number>
+export type LoopVariableMap = Record<string, any>
+
+export type WorkflowConfigResponse = {
+  parallel_depth_limit: number
+}
+
+export type PublishWorkflowParams = {
+  title: string
+  releaseNotes: string
+}
+
+export type UpdateWorkflowParams = {
+  workflowId: string
+  title: string
+  releaseNotes: string
+}
diff --git a/typography.js b/typography.js
new file mode 100644
index 0000000..92bea1e
--- /dev/null
+++ b/typography.js
@@ -0,0 +1,357 @@
+module.exports = ({ theme }) => ({
+  DEFAULT: {
+    css: {
+      '--tw-prose-body': theme('colors.zinc.700'),
+      '--tw-prose-headings': theme('colors.zinc.900'),
+      '--tw-prose-links': theme('colors.emerald.500'),
+      '--tw-prose-links-hover': theme('colors.emerald.600'),
+      '--tw-prose-links-underline': theme('colors.emerald.500 / 0.3'),
+      '--tw-prose-bold': theme('colors.zinc.900'),
+      '--tw-prose-counters': theme('colors.zinc.500'),
+      '--tw-prose-bullets': theme('colors.zinc.300'),
+      '--tw-prose-hr': theme('colors.zinc.900 / 0.05'),
+      '--tw-prose-quotes': theme('colors.zinc.900'),
+      '--tw-prose-quote-borders': theme('colors.zinc.200'),
+      '--tw-prose-captions': theme('colors.zinc.500'),
+      '--tw-prose-code': theme('colors.zinc.900'),
+      '--tw-prose-code-bg': theme('colors.zinc.100'),
+      '--tw-prose-code-ring': theme('colors.zinc.300'),
+      '--tw-prose-th-borders': theme('colors.zinc.300'),
+      '--tw-prose-td-borders': theme('colors.zinc.200'),
+
+      '--tw-prose-invert-body': theme('colors.zinc.400'),
+      '--tw-prose-invert-headings': theme('colors.white'),
+      '--tw-prose-invert-links': theme('colors.emerald.400'),
+      '--tw-prose-invert-links-hover': theme('colors.emerald.500'),
+      '--tw-prose-invert-links-underline': theme('colors.emerald.500 / 0.3'),
+      '--tw-prose-invert-bold': theme('colors.white'),
+      '--tw-prose-invert-counters': theme('colors.zinc.400'),
+      '--tw-prose-invert-bullets': theme('colors.zinc.600'),
+      '--tw-prose-invert-hr': theme('colors.white / 0.05'),
+      '--tw-prose-invert-quotes': theme('colors.zinc.100'),
+      '--tw-prose-invert-quote-borders': theme('colors.zinc.700'),
+      '--tw-prose-invert-captions': theme('colors.zinc.400'),
+      '--tw-prose-invert-code': theme('colors.white'),
+      '--tw-prose-invert-code-bg': theme('colors.zinc.700 / 0.15'),
+      '--tw-prose-invert-code-ring': theme('colors.white / 0.1'),
+      '--tw-prose-invert-th-borders': theme('colors.zinc.600'),
+      '--tw-prose-invert-td-borders': theme('colors.zinc.700'),
+
+      // Base
+      'color': 'var(--tw-prose-body)',
+      'fontSize': theme('fontSize.sm')[0],
+      'lineHeight': theme('lineHeight.7'),
+
+      // Layout
+      '> *': {
+        'maxWidth': theme('maxWidth.2xl'),
+        'marginLeft': 'auto',
+        'marginRight': 'auto',
+        '@screen lg': {
+          maxWidth: theme('maxWidth.3xl'),
+          marginLeft: `calc(50% - min(50%, ${theme('maxWidth.lg')}))`,
+          marginRight: `calc(50% - min(50%, ${theme('maxWidth.lg')}))`,
+        },
+      },
+
+      // Text
+      'p': {
+        marginTop: theme('spacing.6'),
+        marginBottom: theme('spacing.6'),
+      },
+      '[class~="lead"]': {
+        fontSize: theme('fontSize.base')[0],
+        ...theme('fontSize.base')[1],
+      },
+
+      // Lists
+      'ol': {
+        listStyleType: 'decimal',
+        marginTop: theme('spacing.5'),
+        marginBottom: theme('spacing.5'),
+        paddingLeft: '1.625rem',
+      },
+      'ol[type="A"]': {
+        listStyleType: 'upper-alpha',
+      },
+      'ol[type="a"]': {
+        listStyleType: 'lower-alpha',
+      },
+      'ol[type="A" s]': {
+        listStyleType: 'upper-alpha',
+      },
+      'ol[type="a" s]': {
+        listStyleType: 'lower-alpha',
+      },
+      'ol[type="I"]': {
+        listStyleType: 'upper-roman',
+      },
+      'ol[type="i"]': {
+        listStyleType: 'lower-roman',
+      },
+      'ol[type="I" s]': {
+        listStyleType: 'upper-roman',
+      },
+      'ol[type="i" s]': {
+        listStyleType: 'lower-roman',
+      },
+      'ol[type="1"]': {
+        listStyleType: 'decimal',
+      },
+      'ul': {
+        listStyleType: 'disc',
+        marginTop: theme('spacing.5'),
+        marginBottom: theme('spacing.5'),
+        paddingLeft: '1.625rem',
+      },
+      'li': {
+        marginTop: theme('spacing.2'),
+        marginBottom: theme('spacing.2'),
+      },
+      ':is(ol, ul) > li': {
+        paddingLeft: theme('spacing[1.5]'),
+      },
+      'ol > li::marker': {
+        fontWeight: '400',
+        color: 'var(--tw-prose-counters)',
+      },
+      'ul > li::marker': {
+        color: 'var(--tw-prose-bullets)',
+      },
+      '> ul > li p': {
+        marginTop: theme('spacing.3'),
+        marginBottom: theme('spacing.3'),
+      },
+      '> ul > li > *:first-child': {
+        marginTop: theme('spacing.5'),
+      },
+      '> ul > li > *:last-child': {
+        marginBottom: theme('spacing.5'),
+      },
+      '> ol > li > *:first-child': {
+        marginTop: theme('spacing.5'),
+      },
+      '> ol > li > *:last-child': {
+        marginBottom: theme('spacing.5'),
+      },
+      'ul ul, ul ol, ol ul, ol ol': {
+        marginTop: theme('spacing.3'),
+        marginBottom: theme('spacing.3'),
+      },
+
+      // Horizontal rules
+      'hr': {
+        'borderColor': 'var(--tw-prose-hr)',
+        'borderTopWidth': 1,
+        'marginTop': theme('spacing.16'),
+        'marginBottom': theme('spacing.16'),
+        'maxWidth': 'none',
+        'marginLeft': `calc(-1 * ${theme('spacing.4')})`,
+        'marginRight': `calc(-1 * ${theme('spacing.4')})`,
+        '@screen sm': {
+          marginLeft: `calc(-1 * ${theme('spacing.6')})`,
+          marginRight: `calc(-1 * ${theme('spacing.6')})`,
+        },
+        '@screen lg': {
+          marginLeft: `calc(-1 * ${theme('spacing.8')})`,
+          marginRight: `calc(-1 * ${theme('spacing.8')})`,
+        },
+      },
+
+      // Quotes
+      'blockquote': {
+        fontWeight: '500',
+        fontStyle: 'italic',
+        color: 'var(--tw-prose-quotes)',
+        borderLeftWidth: '0.25rem',
+        borderLeftColor: 'var(--tw-prose-quote-borders)',
+        quotes: '"\\201C""\\201D""\\2018""\\2019"',
+        marginTop: theme('spacing.8'),
+        marginBottom: theme('spacing.8'),
+        paddingLeft: theme('spacing.5'),
+      },
+      'blockquote p:first-of-type::before': {
+        content: 'open-quote',
+      },
+      'blockquote p:last-of-type::after': {
+        content: 'close-quote',
+      },
+
+      // Headings
+      'h1': {
+        color: 'var(--tw-prose-headings)',
+        fontWeight: '700',
+        fontSize: theme('fontSize.2xl')[0],
+        ...theme('fontSize.2xl')[1],
+        marginBottom: theme('spacing.2'),
+      },
+      'h2': {
+        color: 'var(--tw-prose-headings)',
+        fontWeight: '600',
+        fontSize: theme('fontSize.lg')[0],
+        ...theme('fontSize.lg')[1],
+        marginTop: theme('spacing.16'),
+        marginBottom: theme('spacing.2'),
+      },
+      'h3': {
+        color: 'var(--tw-prose-headings)',
+        fontSize: theme('fontSize.base')[0],
+        ...theme('fontSize.base')[1],
+        fontWeight: '600',
+        marginTop: theme('spacing.10'),
+        marginBottom: theme('spacing.2'),
+      },
+
+      // Media
+      'img, video, figure': {
+        marginTop: theme('spacing.8'),
+        marginBottom: theme('spacing.8'),
+      },
+      'figure > *': {
+        marginTop: '0',
+        marginBottom: '0',
+      },
+      'figcaption': {
+        color: 'var(--tw-prose-captions)',
+        fontSize: theme('fontSize.xs')[0],
+        ...theme('fontSize.xs')[1],
+        marginTop: theme('spacing.2'),
+      },
+
+      // Tables
+      'table': {
+        width: '100%',
+        tableLayout: 'auto',
+        textAlign: 'left',
+        marginTop: theme('spacing.8'),
+        marginBottom: theme('spacing.8'),
+        lineHeight: theme('lineHeight.6'),
+      },
+      'thead': {
+        borderBottomWidth: '1px',
+        borderBottomColor: 'var(--tw-prose-th-borders)',
+      },
+      'thead th': {
+        color: 'var(--tw-prose-headings)',
+        fontWeight: '600',
+        verticalAlign: 'bottom',
+        paddingRight: theme('spacing.2'),
+        paddingBottom: theme('spacing.2'),
+        paddingLeft: theme('spacing.2'),
+      },
+      'thead th:first-child': {
+        paddingLeft: '0',
+      },
+      'thead th:last-child': {
+        paddingRight: '0',
+      },
+      'tbody tr': {
+        borderBottomWidth: '1px',
+        borderBottomColor: 'var(--tw-prose-td-borders)',
+      },
+      'tbody tr:last-child': {
+        borderBottomWidth: '0',
+      },
+      'tbody td': {
+        verticalAlign: 'baseline',
+      },
+      'tfoot': {
+        borderTopWidth: '1px',
+        borderTopColor: 'var(--tw-prose-th-borders)',
+      },
+      'tfoot td': {
+        verticalAlign: 'top',
+      },
+      ':is(tbody, tfoot) td': {
+        paddingTop: theme('spacing.2'),
+        paddingRight: theme('spacing.2'),
+        paddingBottom: theme('spacing.2'),
+        paddingLeft: theme('spacing.2'),
+      },
+      ':is(tbody, tfoot) td:first-child': {
+        paddingLeft: '0',
+      },
+      ':is(tbody, tfoot) td:last-child': {
+        paddingRight: '0',
+      },
+
+      // Inline elements
+      'a': {
+        'color': 'var(--tw-prose-links)',
+        'textDecoration': 'underline transparent',
+        'fontWeight': '500',
+        'transitionProperty': 'color, text-decoration-color',
+        'transitionDuration': theme('transitionDuration.DEFAULT'),
+        'transitionTimingFunction': theme('transitionTimingFunction.DEFAULT'),
+        '&:hover': {
+          color: 'var(--tw-prose-links-hover)',
+          textDecorationColor: 'var(--tw-prose-links-underline)',
+        },
+      },
+      ':is(h1, h2, h3) a': {
+        fontWeight: 'inherit',
+      },
+      'strong': {
+        color: 'var(--tw-prose-bold)',
+        fontWeight: '600',
+      },
+      ':is(a, blockquote, thead th) strong': {
+        color: 'inherit',
+      },
+      'code': {
+        color: 'var(--tw-prose-code)',
+        borderRadius: theme('borderRadius.lg'),
+        paddingTop: theme('padding.1'),
+        paddingRight: theme('padding[1.5]'),
+        paddingBottom: theme('padding.1'),
+        paddingLeft: theme('padding[1.5]'),
+        boxShadow: 'inset 0 0 0 1px var(--tw-prose-code-ring)',
+        backgroundColor: 'var(--tw-prose-code-bg)',
+        fontSize: theme('fontSize.2xs'),
+      },
+      ':is(a, h1, h2, h3, blockquote, thead th) code': {
+        color: 'inherit',
+      },
+      'h2 code': {
+        fontSize: theme('fontSize.base')[0],
+        fontWeight: 'inherit',
+      },
+      'h3 code': {
+        fontSize: theme('fontSize.sm')[0],
+        fontWeight: 'inherit',
+      },
+
+      // Overrides
+      ':is(h1, h2, h3) + *': {
+        marginTop: '0',
+      },
+      '> :first-child': {
+        marginTop: '0 !important',
+      },
+      '> :last-child': {
+        marginBottom: '0 !important',
+      },
+    },
+  },
+  invert: {
+    css: {
+      '--tw-prose-body': 'var(--tw-prose-invert-body)',
+      '--tw-prose-headings': 'var(--tw-prose-invert-headings)',
+      '--tw-prose-links': 'var(--tw-prose-invert-links)',
+      '--tw-prose-links-hover': 'var(--tw-prose-invert-links-hover)',
+      '--tw-prose-links-underline': 'var(--tw-prose-invert-links-underline)',
+      '--tw-prose-bold': 'var(--tw-prose-invert-bold)',
+      '--tw-prose-counters': 'var(--tw-prose-invert-counters)',
+      '--tw-prose-bullets': 'var(--tw-prose-invert-bullets)',
+      '--tw-prose-hr': 'var(--tw-prose-invert-hr)',
+      '--tw-prose-quotes': 'var(--tw-prose-invert-quotes)',
+      '--tw-prose-quote-borders': 'var(--tw-prose-invert-quote-borders)',
+      '--tw-prose-captions': 'var(--tw-prose-invert-captions)',
+      '--tw-prose-code': 'var(--tw-prose-invert-code)',
+      '--tw-prose-code-bg': 'var(--tw-prose-invert-code-bg)',
+      '--tw-prose-code-ring': 'var(--tw-prose-invert-code-ring)',
+      '--tw-prose-th-borders': 'var(--tw-prose-invert-th-borders)',
+      '--tw-prose-td-borders': 'var(--tw-prose-invert-td-borders)',
+    },
+  },
+})
diff --git a/utils/app-redirection.ts b/utils/app-redirection.ts
new file mode 100644
index 0000000..9327312
--- /dev/null
+++ b/utils/app-redirection.ts
@@ -0,0 +1,17 @@
+import type { AppMode } from '@/types/app'
+
+export const getRedirection = (
+  isCurrentWorkspaceEditor: boolean,
+  app: { id: string, mode: AppMode },
+  redirectionFunc: (href: string) => void,
+) => {
+  if (!isCurrentWorkspaceEditor) {
+    redirectionFunc(`/app/${app.id}/overview`)
+  }
+  else {
+    if (app.mode === 'workflow' || app.mode === 'advanced-chat')
+      redirectionFunc(`/app/${app.id}/workflow`)
+    else
+      redirectionFunc(`/app/${app.id}/configuration`)
+  }
+}
diff --git a/utils/classnames.spec.ts b/utils/classnames.spec.ts
new file mode 100644
index 0000000..a0b4068
--- /dev/null
+++ b/utils/classnames.spec.ts
@@ -0,0 +1,56 @@
+import cn from './classnames'
+
+describe('classnames', () => {
+  test('classnames libs feature', () => {
+    expect(cn('foo')).toBe('foo')
+    expect(cn('foo', 'bar')).toBe('foo bar')
+    expect(cn(['foo', 'bar'])).toBe('foo bar')
+
+    expect(cn(undefined)).toBe('')
+    expect(cn(null)).toBe('')
+    expect(cn(false)).toBe('')
+
+    expect(cn({
+      foo: true,
+      bar: false,
+      baz: true,
+    })).toBe('foo baz')
+  })
+
+  test('tailwind-merge', () => {
+    /* eslint-disable tailwindcss/classnames-order */
+    expect(cn('p-0')).toBe('p-0')
+    expect(cn('text-right text-center text-left')).toBe('text-left')
+    expect(cn('pl-4 p-8')).toBe('p-8')
+    expect(cn('m-[2px] m-[4px]')).toBe('m-[4px]')
+    expect(cn('m-1 m-[4px]')).toBe('m-[4px]')
+    expect(cn('overflow-x-auto hover:overflow-x-hidden overflow-x-scroll')).toBe(
+      'hover:overflow-x-hidden overflow-x-scroll',
+    )
+    expect(cn('h-10 h-min')).toBe('h-min')
+    expect(cn('bg-grey-5 bg-hotpink')).toBe('bg-hotpink')
+
+    expect(cn('hover:block hover:inline')).toBe('hover:inline')
+
+    expect(cn('font-medium !font-bold')).toBe('font-medium !font-bold')
+    expect(cn('!font-medium !font-bold')).toBe('!font-bold')
+
+    expect(cn('text-gray-100 text-primary-200')).toBe('text-primary-200')
+    expect(cn('text-some-unknown-color text-components-input-bg-disabled text-primary-200')).toBe('text-primary-200')
+    expect(cn('bg-some-unknown-color bg-components-input-bg-disabled bg-primary-200')).toBe('bg-primary-200')
+
+    expect(cn('border-t border-white/10')).toBe('border-t border-white/10')
+    expect(cn('border-t border-white')).toBe('border-t border-white')
+    expect(cn('text-3.5xl text-black')).toBe('text-3.5xl text-black')
+  })
+
+  test('classnames combined with tailwind-merge', () => {
+    expect(cn('text-right', {
+      'text-center': true,
+    })).toBe('text-center')
+
+    expect(cn('text-right', {
+      'text-center': false,
+    })).toBe('text-right')
+  })
+})
diff --git a/utils/classnames.ts b/utils/classnames.ts
new file mode 100644
index 0000000..6ce2284
--- /dev/null
+++ b/utils/classnames.ts
@@ -0,0 +1,8 @@
+import { twMerge } from 'tailwind-merge'
+import cn from 'classnames'
+
+const classNames = (...cls: cn.ArgumentArray) => {
+  return twMerge(cn(cls))
+}
+
+export default classNames
diff --git a/utils/clipboard.ts b/utils/clipboard.ts
new file mode 100644
index 0000000..8e7a449
--- /dev/null
+++ b/utils/clipboard.ts
@@ -0,0 +1,35 @@
+export async function writeTextToClipboard(text: string): Promise<void> {
+  if (navigator.clipboard && navigator.clipboard.writeText)
+    return navigator.clipboard.writeText(text)
+
+  return fallbackCopyTextToClipboard(text)
+}
+
+async function fallbackCopyTextToClipboard(text: string): Promise<void> {
+  const textArea = document.createElement('textarea')
+  textArea.value = text
+  textArea.style.position = 'fixed' // Avoid scrolling to bottom
+  document.body.appendChild(textArea)
+  textArea.focus()
+  textArea.select()
+  try {
+    const successful = document.execCommand('copy')
+    if (successful)
+      return Promise.resolve()
+
+    return Promise.reject(new Error('document.execCommand failed'))
+  }
+  catch (err) {
+    return Promise.reject(convertAnyToError(err))
+  }
+  finally {
+    document.body.removeChild(textArea)
+  }
+}
+
+function convertAnyToError(err: any): Error {
+  if (err instanceof Error)
+    return err
+
+  return new Error(`Caught: ${String(err)}`)
+}
diff --git a/utils/context.ts b/utils/context.ts
new file mode 100644
index 0000000..8829a67
--- /dev/null
+++ b/utils/context.ts
@@ -0,0 +1,45 @@
+import { type Context, type Provider, createContext, useContext } from 'react'
+import * as selector from 'use-context-selector'
+
+const createCreateCtxFunction = (
+  useContextImpl: typeof useContext,
+  createContextImpl: typeof createContext) => {
+  return function<T>({ name, defaultValue }: CreateCtxOptions<T> = {}): CreateCtxReturn<T> {
+    const emptySymbol = Symbol(`empty ${name}`)
+    // @ts-expect-error it's ok here
+    const context = createContextImpl<T>(defaultValue ?? emptySymbol)
+    const useContextValue = () => {
+      const ctx = useContextImpl(context)
+      if (ctx === emptySymbol)
+        throw new Error(`No ${name ?? 'related'} context found.`)
+
+      return ctx
+    }
+    const result = [context.Provider, useContextValue, context] as CreateCtxReturn<T>
+    result.context = context
+    result.provider = context.Provider
+    result.useContextValue = useContextValue
+    return result
+  }
+}
+
+type CreateCtxOptions<T> = {
+  defaultValue?: T
+  name?: string
+}
+
+type CreateCtxReturn<T> = [Provider<T>, () => T, Context<T>] & {
+  context: Context<T>
+  provider: Provider<T>
+  useContextValue: () => T
+}
+
+// example
+// const [AppProvider, useApp, AppContext] = createCtx<AppContextValue>()
+
+export const createCtx = createCreateCtxFunction(useContext, createContext)
+
+export const createSelectorCtx = createCreateCtxFunction(
+  selector.useContext,
+  selector.createContext as typeof createContext,
+)
diff --git a/utils/emoji.ts b/utils/emoji.ts
new file mode 100644
index 0000000..9123f78
--- /dev/null
+++ b/utils/emoji.ts
@@ -0,0 +1,11 @@
+import { SearchIndex } from 'emoji-mart'
+import type { Emoji } from '@emoji-mart/data'
+
+export async function searchEmoji(value: string) {
+  const emojis: Emoji[] = await SearchIndex.search(value) || []
+
+  const results = emojis.map((emoji) => {
+    return emoji.skins[0].native
+  })
+  return results
+}
diff --git a/utils/format.spec.ts b/utils/format.spec.ts
new file mode 100644
index 0000000..ab1c5c1
--- /dev/null
+++ b/utils/format.spec.ts
@@ -0,0 +1,104 @@
+import { downloadFile, formatFileSize, formatNumber, formatTime } from './format'
+
+describe('formatNumber', () => {
+  test('should correctly format integers', () => {
+    expect(formatNumber(1234567)).toBe('1,234,567')
+  })
+  test('should correctly format decimals', () => {
+    expect(formatNumber(1234567.89)).toBe('1,234,567.89')
+  })
+  test('should correctly handle string input', () => {
+    expect(formatNumber('1234567')).toBe('1,234,567')
+  })
+  test('should correctly handle zero', () => {
+    expect(formatNumber(0)).toBe(0)
+  })
+  test('should correctly handle negative numbers', () => {
+    expect(formatNumber(-1234567)).toBe('-1,234,567')
+  })
+  test('should correctly handle empty input', () => {
+    expect(formatNumber('')).toBe('')
+  })
+})
+describe('formatFileSize', () => {
+  test('should return the input if it is falsy', () => {
+    expect(formatFileSize(0)).toBe(0)
+  })
+  test('should format bytes correctly', () => {
+    expect(formatFileSize(500)).toBe('500.00B')
+  })
+  test('should format kilobytes correctly', () => {
+    expect(formatFileSize(1500)).toBe('1.46KB')
+  })
+  test('should format megabytes correctly', () => {
+    expect(formatFileSize(1500000)).toBe('1.43MB')
+  })
+  test('should format gigabytes correctly', () => {
+    expect(formatFileSize(1500000000)).toBe('1.40GB')
+  })
+  test('should format terabytes correctly', () => {
+    expect(formatFileSize(1500000000000)).toBe('1.36TB')
+  })
+  test('should format petabytes correctly', () => {
+    expect(formatFileSize(1500000000000000)).toBe('1.33PB')
+  })
+})
+describe('formatTime', () => {
+  test('should return the input if it is falsy', () => {
+    expect(formatTime(0)).toBe(0)
+  })
+  test('should format seconds correctly', () => {
+    expect(formatTime(30)).toBe('30.00 sec')
+  })
+  test('should format minutes correctly', () => {
+    expect(formatTime(90)).toBe('1.50 min')
+  })
+  test('should format hours correctly', () => {
+    expect(formatTime(3600)).toBe('1.00 h')
+  })
+  test('should handle large numbers', () => {
+    expect(formatTime(7200)).toBe('2.00 h')
+  })
+})
+describe('downloadFile', () => {
+  test('should create a link and trigger a download correctly', () => {
+    // Mock data
+    const blob = new Blob(['test content'], { type: 'text/plain' })
+    const fileName = 'test-file.txt'
+    const mockUrl = 'blob:mockUrl'
+
+    // Mock URL.createObjectURL
+    const createObjectURLMock = jest.fn().mockReturnValue(mockUrl)
+    const revokeObjectURLMock = jest.fn()
+    Object.defineProperty(window.URL, 'createObjectURL', { value: createObjectURLMock })
+    Object.defineProperty(window.URL, 'revokeObjectURL', { value: revokeObjectURLMock })
+
+    // Mock createElement and appendChild
+    const mockLink = {
+      href: '',
+      download: '',
+      click: jest.fn(),
+      remove: jest.fn(),
+    }
+    const createElementMock = jest.spyOn(document, 'createElement').mockReturnValue(mockLink as any)
+    const appendChildMock = jest.spyOn(document.body, 'appendChild').mockImplementation((node: Node) => {
+      return node
+    })
+
+    // Call the function
+    downloadFile({ data: blob, fileName })
+
+    // Assertions
+    expect(createObjectURLMock).toHaveBeenCalledWith(blob)
+    expect(createElementMock).toHaveBeenCalledWith('a')
+    expect(mockLink.href).toBe(mockUrl)
+    expect(mockLink.download).toBe(fileName)
+    expect(appendChildMock).toHaveBeenCalledWith(mockLink)
+    expect(mockLink.click).toHaveBeenCalled()
+    expect(mockLink.remove).toHaveBeenCalled()
+    expect(revokeObjectURLMock).toHaveBeenCalledWith(mockUrl)
+
+    // Clean up mocks
+    jest.restoreAllMocks()
+  })
+})
diff --git a/utils/format.ts b/utils/format.ts
new file mode 100644
index 0000000..720c8f6
--- /dev/null
+++ b/utils/format.ts
@@ -0,0 +1,58 @@
+/**
+ * Formats a number with comma separators.
+ * @example formatNumber(1234567) will return '1,234,567'
+ * @example formatNumber(1234567.89) will return '1,234,567.89'
+ */
+export const formatNumber = (num: number | string) => {
+  if (!num)
+    return num
+  const parts = num.toString().split('.')
+  parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',')
+  return parts.join('.')
+}
+
+/**
+ * Format file size into standard string format.
+ * @param fileSize file size (Byte)
+ * @example formatFileSize(1024) will return '1.00KB'
+ * @example formatFileSize(1024 * 1024) will return '1.00MB'
+ */
+export const formatFileSize = (fileSize: number) => {
+  if (!fileSize)
+    return fileSize
+  const units = ['', 'K', 'M', 'G', 'T', 'P']
+  let index = 0
+  while (fileSize >= 1024 && index < units.length) {
+    fileSize = fileSize / 1024
+    index++
+  }
+  return `${fileSize.toFixed(2)}${units[index]}B`
+}
+
+/**
+ * Format time into standard string format.
+ * @example formatTime(60) will return '1.00 min'
+ * @example formatTime(60 * 60) will return '1.00 h'
+ */
+export const formatTime = (seconds: number) => {
+  if (!seconds)
+    return seconds
+  const units = ['sec', 'min', 'h']
+  let index = 0
+  while (seconds >= 60 && index < units.length) {
+    seconds = seconds / 60
+    index++
+  }
+  return `${seconds.toFixed(2)} ${units[index]}`
+}
+
+export const downloadFile = ({ data, fileName }: { data: Blob; fileName: string }) => {
+  const url = window.URL.createObjectURL(data)
+  const a = document.createElement('a')
+  a.href = url
+  a.download = fileName
+  document.body.appendChild(a)
+  a.click()
+  a.remove()
+  window.URL.revokeObjectURL(url)
+}
diff --git a/utils/get-icon.ts b/utils/get-icon.ts
new file mode 100644
index 0000000..f2ed116
--- /dev/null
+++ b/utils/get-icon.ts
@@ -0,0 +1,5 @@
+import { MARKETPLACE_API_PREFIX } from '@/config'
+
+export const getIconFromMarketPlace = (plugin_id: string) => {
+  return `${MARKETPLACE_API_PREFIX}/plugins/${plugin_id}/icon`
+}
diff --git a/utils/index.spec.ts b/utils/index.spec.ts
new file mode 100644
index 0000000..21a0d80
--- /dev/null
+++ b/utils/index.spec.ts
@@ -0,0 +1,295 @@
+import {
+  asyncRunSafe,
+  canFindTool,
+  correctModelProvider,
+  correctToolProvider,
+  fetchWithRetry,
+  getPurifyHref,
+  getTextWidthWithCanvas,
+  randomString,
+  removeSpecificQueryParam,
+  sleep,
+} from './index'
+
+describe('sleep', () => {
+  it('should wait for the specified time', async () => {
+    const timeVariance = 10
+    const sleepTime = 100
+    const start = Date.now()
+    await sleep(sleepTime)
+    const elapsed = Date.now() - start
+    expect(elapsed).toBeGreaterThanOrEqual(sleepTime - timeVariance)
+  })
+})
+
+describe('asyncRunSafe', () => {
+  it('should return [null, result] when promise resolves', async () => {
+    const result = await asyncRunSafe(Promise.resolve('success'))
+    expect(result).toEqual([null, 'success'])
+  })
+
+  it('should return [error] when promise rejects', async () => {
+    const error = new Error('test error')
+    const result = await asyncRunSafe(Promise.reject(error))
+    expect(result).toEqual([error])
+  })
+
+  it('should return [Error] when promise rejects with undefined', async () => {
+    // eslint-disable-next-line prefer-promise-reject-errors
+    const result = await asyncRunSafe(Promise.reject())
+    expect(result[0]).toBeInstanceOf(Error)
+    expect(result[0]?.message).toBe('unknown error')
+  })
+})
+
+describe('getTextWidthWithCanvas', () => {
+  let originalCreateElement: typeof document.createElement
+
+  beforeEach(() => {
+    // Store original implementation
+    originalCreateElement = document.createElement
+
+    // Mock canvas and context
+    const measureTextMock = jest.fn().mockReturnValue({ width: 100 })
+    const getContextMock = jest.fn().mockReturnValue({
+      measureText: measureTextMock,
+      font: '',
+    })
+
+    document.createElement = jest.fn().mockReturnValue({
+      getContext: getContextMock,
+    })
+  })
+
+  afterEach(() => {
+    // Restore original implementation
+    document.createElement = originalCreateElement
+  })
+
+  it('should return the width of text', () => {
+    const width = getTextWidthWithCanvas('test text')
+    expect(width).toBe(100)
+  })
+
+  it('should return 0 if context is not available', () => {
+    // Override mock for this test
+    document.createElement = jest.fn().mockReturnValue({
+      getContext: () => null,
+    })
+
+    const width = getTextWidthWithCanvas('test text')
+    expect(width).toBe(0)
+  })
+})
+
+describe('randomString', () => {
+  it('should generate string of specified length', () => {
+    const result = randomString(10)
+    expect(result.length).toBe(10)
+  })
+
+  it('should only contain valid characters', () => {
+    const result = randomString(100)
+    const validChars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_'
+    for (const char of result)
+      expect(validChars).toContain(char)
+  })
+
+  it('should generate different strings on consecutive calls', () => {
+    const result1 = randomString(20)
+    const result2 = randomString(20)
+    expect(result1).not.toEqual(result2)
+  })
+})
+
+describe('getPurifyHref', () => {
+  it('should return empty string for falsy input', () => {
+    expect(getPurifyHref('')).toBe('')
+    expect(getPurifyHref(undefined as any)).toBe('')
+  })
+
+  it('should escape HTML characters', () => {
+    expect(getPurifyHref('<script>alert("xss")</script>')).not.toContain('<script>')
+  })
+})
+
+describe('fetchWithRetry', () => {
+  it('should return successfully on first try', async () => {
+    const successData = { status: 'success' }
+    const promise = Promise.resolve(successData)
+
+    const result = await fetchWithRetry(promise)
+
+    expect(result).toEqual([null, successData])
+  })
+
+  // it('should retry and succeed on second attempt', async () => {
+  //   let attemptCount = 0
+  //   const mockFn = new Promise((resolve, reject) => {
+  //     attemptCount++
+  //     if (attemptCount === 1)
+  //       reject(new Error('First attempt failed'))
+  //     else
+  //       resolve('success')
+  //   })
+
+  //   const result = await fetchWithRetry(mockFn)
+
+  //   expect(result).toEqual([null, 'success'])
+  //   expect(attemptCount).toBe(2)
+  // })
+
+  // it('should stop after max retries and return last error', async () => {
+  //   const testError = new Error('Test error')
+  //   const promise = Promise.reject(testError)
+
+  //   const result = await fetchWithRetry(promise, 2)
+
+  //   expect(result).toEqual([testError])
+  // })
+
+  // it('should handle non-Error rejection with custom error', async () => {
+  //   const stringError = 'string error message'
+  //   const promise = Promise.reject(stringError)
+
+  //   const result = await fetchWithRetry(promise, 0)
+
+  //   expect(result[0]).toBeInstanceOf(Error)
+  //   expect(result[0]?.message).toBe('unknown error')
+  // })
+
+  // it('should use default 3 retries when retries parameter is not provided', async () => {
+  //   let attempts = 0
+  //   const mockFn = () => new Promise((resolve, reject) => {
+  //     attempts++
+  //     reject(new Error(`Attempt ${attempts} failed`))
+  //   })
+
+  //   await fetchWithRetry(mockFn())
+
+  //   expect(attempts).toBe(4) // Initial attempt + 3 retries
+  // })
+})
+
+describe('correctModelProvider', () => {
+  it('should return empty string for falsy input', () => {
+    expect(correctModelProvider('')).toBe('')
+  })
+
+  it('should return the provider if it already contains a slash', () => {
+    expect(correctModelProvider('company/model')).toBe('company/model')
+  })
+
+  it('should format google provider correctly', () => {
+    expect(correctModelProvider('google')).toBe('langgenius/gemini/google')
+  })
+
+  it('should format standard providers correctly', () => {
+    expect(correctModelProvider('openai')).toBe('langgenius/openai/openai')
+  })
+})
+
+describe('correctToolProvider', () => {
+  it('should return empty string for falsy input', () => {
+    expect(correctToolProvider('')).toBe('')
+  })
+
+  it('should return the provider if toolInCollectionList is true', () => {
+    expect(correctToolProvider('any-provider', true)).toBe('any-provider')
+  })
+
+  it('should return the provider if it already contains a slash', () => {
+    expect(correctToolProvider('company/tool')).toBe('company/tool')
+  })
+
+  it('should format special tool providers correctly', () => {
+    expect(correctToolProvider('stepfun')).toBe('langgenius/stepfun_tool/stepfun')
+    expect(correctToolProvider('jina')).toBe('langgenius/jina_tool/jina')
+  })
+
+  it('should format standard tool providers correctly', () => {
+    expect(correctToolProvider('standard')).toBe('langgenius/standard/standard')
+  })
+})
+
+describe('canFindTool', () => {
+  it('should match when IDs are identical', () => {
+    expect(canFindTool('tool-id', 'tool-id')).toBe(true)
+  })
+
+  it('should match when provider ID is formatted with standard pattern', () => {
+    expect(canFindTool('langgenius/tool-id/tool-id', 'tool-id')).toBe(true)
+  })
+
+  it('should match when provider ID is formatted with tool pattern', () => {
+    expect(canFindTool('langgenius/tool-id_tool/tool-id', 'tool-id')).toBe(true)
+  })
+
+  it('should not match when IDs are completely different', () => {
+    expect(canFindTool('provider-a', 'tool-b')).toBe(false)
+  })
+})
+
+describe('removeSpecificQueryParam', () => {
+  let originalLocation: Location
+  let originalReplaceState: typeof window.history.replaceState
+
+  beforeEach(() => {
+    originalLocation = window.location
+    originalReplaceState = window.history.replaceState
+
+    const mockUrl = new URL('https://example.com?param1=value1&param2=value2&param3=value3')
+
+    // Mock window.location using defineProperty to handle URL properly
+    delete (window as any).location
+    Object.defineProperty(window, 'location', {
+      writable: true,
+      value: {
+        ...originalLocation,
+        href: mockUrl.href,
+        search: mockUrl.search,
+        toString: () => mockUrl.toString(),
+      },
+    })
+
+    window.history.replaceState = jest.fn()
+  })
+
+  afterEach(() => {
+    Object.defineProperty(window, 'location', {
+      writable: true,
+      value: originalLocation,
+    })
+    window.history.replaceState = originalReplaceState
+  })
+
+  it('should remove a single query parameter', () => {
+    removeSpecificQueryParam('param2')
+    expect(window.history.replaceState).toHaveBeenCalledTimes(1)
+    const replaceStateCall = (window.history.replaceState as jest.Mock).mock.calls[0]
+    expect(replaceStateCall[0]).toBe(null)
+    expect(replaceStateCall[1]).toBe('')
+    expect(replaceStateCall[2]).toMatch(/param1=value1/)
+    expect(replaceStateCall[2]).toMatch(/param3=value3/)
+    expect(replaceStateCall[2]).not.toMatch(/param2=value2/)
+  })
+
+  it('should remove multiple query parameters', () => {
+    removeSpecificQueryParam(['param1', 'param3'])
+    expect(window.history.replaceState).toHaveBeenCalledTimes(1)
+    const replaceStateCall = (window.history.replaceState as jest.Mock).mock.calls[0]
+    expect(replaceStateCall[2]).toMatch(/param2=value2/)
+    expect(replaceStateCall[2]).not.toMatch(/param1=value1/)
+    expect(replaceStateCall[2]).not.toMatch(/param3=value3/)
+  })
+
+  it('should handle non-existent parameters gracefully', () => {
+    removeSpecificQueryParam('nonexistent')
+
+    expect(window.history.replaceState).toHaveBeenCalledTimes(1)
+    const replaceStateCall = (window.history.replaceState as jest.Mock).mock.calls[0]
+    expect(replaceStateCall[2]).toMatch(/param1=value1/)
+    expect(replaceStateCall[2]).toMatch(/param2=value2/)
+    expect(replaceStateCall[2]).toMatch(/param3=value3/)
+  })
+})
diff --git a/utils/index.ts b/utils/index.ts
new file mode 100644
index 0000000..263d415
--- /dev/null
+++ b/utils/index.ts
@@ -0,0 +1,101 @@
+import { escape } from 'lodash-es'
+
+export const sleep = (ms: number) => {
+  return new Promise(resolve => setTimeout(resolve, ms))
+}
+
+export async function asyncRunSafe<T = any>(fn: Promise<T>): Promise<[Error] | [null, T]> {
+  try {
+    return [null, await fn]
+  }
+  catch (e: any) {
+    return [e || new Error('unknown error')]
+  }
+}
+
+export const getTextWidthWithCanvas = (text: string, font?: string) => {
+  const canvas = document.createElement('canvas')
+  const ctx = canvas.getContext('2d')
+  if (ctx) {
+    ctx.font = font ?? '12px Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"'
+    return Number(ctx.measureText(text).width.toFixed(2))
+  }
+  return 0
+}
+
+const chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_'
+
+export function randomString(length: number) {
+  let result = ''
+  for (let i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]
+  return result
+}
+
+export const getPurifyHref = (href: string) => {
+  if (!href)
+    return ''
+
+  return escape(href)
+}
+
+export async function fetchWithRetry<T = any>(fn: Promise<T>, retries = 3): Promise<[Error] | [null, T]> {
+  const [error, res] = await asyncRunSafe(fn)
+  if (error) {
+    if (retries > 0) {
+      const res = await fetchWithRetry(fn, retries - 1)
+      return res
+    }
+    else {
+      if (error instanceof Error)
+        return [error]
+      return [new Error('unknown error')]
+    }
+  }
+  else {
+    return [null, res]
+  }
+}
+
+export const correctModelProvider = (provider: string) => {
+  if (!provider)
+    return ''
+
+  if (provider.includes('/'))
+    return provider
+
+  if (['google'].includes(provider))
+    return 'langgenius/gemini/google'
+
+  return `langgenius/${provider}/${provider}`
+}
+
+export const correctToolProvider = (provider: string, toolInCollectionList?: boolean) => {
+  if (!provider)
+    return ''
+
+  if (toolInCollectionList)
+    return provider
+
+  if (provider.includes('/'))
+    return provider
+
+  if (['stepfun', 'jina', 'siliconflow', 'gitee_ai'].includes(provider))
+    return `langgenius/${provider}_tool/${provider}`
+
+  return `langgenius/${provider}/${provider}`
+}
+
+export const canFindTool = (providerId: string, oldToolId?: string) => {
+  return providerId === oldToolId
+    || providerId === `langgenius/${oldToolId}/${oldToolId}`
+    || providerId === `langgenius/${oldToolId}_tool/${oldToolId}`
+}
+
+export const removeSpecificQueryParam = (key: string | string[]) => {
+  const url = new URL(window.location.href)
+  if (Array.isArray(key))
+    key.forEach(k => url.searchParams.delete(k))
+  else
+    url.searchParams.delete(key)
+  window.history.replaceState(null, '', url.toString())
+}
diff --git a/utils/model-config.ts b/utils/model-config.ts
new file mode 100644
index 0000000..74d8848
--- /dev/null
+++ b/utils/model-config.ts
@@ -0,0 +1,164 @@
+import type { UserInputFormItem } from '@/types/app'
+import type { PromptVariable } from '@/models/debug'
+
+export const userInputsFormToPromptVariables = (useInputs: UserInputFormItem[] | null, dataset_query_variable?: string) => {
+  if (!useInputs)
+    return []
+  const promptVariables: PromptVariable[] = []
+  useInputs.forEach((item: any) => {
+    const isParagraph = !!item.paragraph
+
+    const [type, content] = (() => {
+      if (isParagraph)
+        return ['paragraph', item.paragraph]
+
+      if (item['text-input'])
+        return ['string', item['text-input']]
+
+      if (item.number)
+        return ['number', item.number]
+
+      if (item.file)
+        return ['file', item.file]
+
+      if (item['file-list'])
+        return ['file-list', item['file-list']]
+
+      if (item.external_data_tool)
+        return [item.external_data_tool.type, item.external_data_tool]
+
+      return ['select', item.select || {}]
+    })()
+    const is_context_var = dataset_query_variable === content?.variable
+
+    if (type === 'string' || type === 'paragraph') {
+      promptVariables.push({
+        key: content.variable,
+        name: content.label,
+        required: content.required,
+        type,
+        max_length: content.max_length,
+        options: [],
+        is_context_var,
+      })
+    }
+    else if (type === 'number') {
+      promptVariables.push({
+        key: content.variable,
+        name: content.label,
+        required: content.required,
+        type,
+        options: [],
+      })
+    }
+    else if (type === 'select') {
+      promptVariables.push({
+        key: content.variable,
+        name: content.label,
+        required: content.required,
+        type: 'select',
+        options: content.options,
+        is_context_var,
+      })
+    }
+    else if (type === 'file') {
+      promptVariables.push({
+        key: content.variable,
+        name: content.label,
+        required: content.required,
+        type,
+        config: {
+          allowed_file_types: content.allowed_file_types,
+          allowed_file_extensions: content.allowed_file_extensions,
+          allowed_file_upload_methods: content.allowed_file_upload_methods,
+          number_limits: 1,
+        },
+      })
+    }
+    else if (type === 'file-list') {
+      promptVariables.push({
+        key: content.variable,
+        name: content.label,
+        required: content.required,
+        type,
+        config: {
+          allowed_file_types: content.allowed_file_types,
+          allowed_file_extensions: content.allowed_file_extensions,
+          allowed_file_upload_methods: content.allowed_file_upload_methods,
+          number_limits: content.max_length,
+        },
+      })
+    }
+    else {
+      promptVariables.push({
+        key: content.variable,
+        name: content.label,
+        required: content.required,
+        type: content.type,
+        enabled: content.enabled,
+        config: content.config,
+        icon: content.icon,
+        icon_background: content.icon_background,
+        is_context_var,
+      })
+    }
+  })
+  return promptVariables
+}
+
+export const promptVariablesToUserInputsForm = (promptVariables: PromptVariable[]) => {
+  const userInputs: UserInputFormItem[] = []
+  promptVariables.filter(({ key, name }) => {
+    return key && key.trim() && name && name.trim()
+  }).forEach((item: any) => {
+    if (item.type === 'string' || item.type === 'paragraph') {
+      userInputs.push({
+        [item.type === 'string' ? 'text-input' : 'paragraph']: {
+          label: item.name,
+          variable: item.key,
+          required: item.required !== false, // default true
+          max_length: item.max_length,
+          default: '',
+        },
+      } as any)
+      return
+    }
+    if (item.type === 'number') {
+      userInputs.push({
+        number: {
+          label: item.name,
+          variable: item.key,
+          required: item.required !== false, // default true
+          default: '',
+        },
+      } as any)
+    }
+    else if (item.type === 'select') {
+      userInputs.push({
+        select: {
+          label: item.name,
+          variable: item.key,
+          required: item.required !== false, // default true
+          options: item.options,
+          default: '',
+        },
+      } as any)
+    }
+    else {
+      userInputs.push({
+        external_data_tool: {
+          label: item.name,
+          variable: item.key,
+          enabled: item.enabled,
+          type: item.type,
+          config: item.config,
+          required: item.required,
+          icon: item.icon,
+          icon_background: item.icon_background,
+        },
+      } as any)
+    }
+  })
+
+  return userInputs
+}
diff --git a/utils/permission.ts b/utils/permission.ts
new file mode 100644
index 0000000..8a7b9f5
--- /dev/null
+++ b/utils/permission.ts
@@ -0,0 +1,18 @@
+import { DatasetPermission } from '@/models/datasets'
+
+type DatasetConfig = {
+  createdBy: string
+  partialMemberList: string[]
+  permission: DatasetPermission
+}
+
+export const hasEditPermissionForDataset = (userId: string, datasetConfig: DatasetConfig) => {
+  const { createdBy, partialMemberList, permission } = datasetConfig
+  if (permission === DatasetPermission.onlyMe)
+    return userId === createdBy
+  if (permission === DatasetPermission.allTeamMembers)
+    return true
+  if (permission === DatasetPermission.partialMembers)
+    return partialMemberList.includes(userId)
+  return false
+}
diff --git a/utils/semver.ts b/utils/semver.ts
new file mode 100644
index 0000000..f1b9eb8
--- /dev/null
+++ b/utils/semver.ts
@@ -0,0 +1,9 @@
+import semver from 'semver'
+
+export const getLatestVersion = (versionList: string[]) => {
+  return semver.rsort(versionList)[0]
+}
+
+export const compareVersion = (v1: string, v2: string) => {
+  return semver.compare(v1, v2)
+}
diff --git a/utils/time.ts b/utils/time.ts
new file mode 100644
index 0000000..ff2e383
--- /dev/null
+++ b/utils/time.ts
@@ -0,0 +1,12 @@
+import dayjs, { type ConfigType } from 'dayjs'
+import utc from 'dayjs/plugin/utc'
+
+dayjs.extend(utc)
+
+export const isAfter = (date: ConfigType, compare: ConfigType) => {
+  return dayjs(date).isAfter(dayjs(compare))
+}
+
+export const formatTime = ({ date, dateFormat }: { date: ConfigType; dateFormat: string }) => {
+  return dayjs(date).format(dateFormat)
+}
diff --git a/utils/timezone.json b/utils/timezone.json
new file mode 100644
index 0000000..80e07ac
--- /dev/null
+++ b/utils/timezone.json
@@ -0,0 +1,1274 @@
+[
+	{
+		"name": "-11:00 Niue Time - Alofi",
+		"value": "Pacific/Niue"
+	},
+	{
+		"name": "-11:00 Samoa Time - Midway",
+		"value": "Pacific/Midway"
+	},
+	{
+		"name": "-11:00 Samoa Time - Pago Pago",
+		"value": "Pacific/Pago_Pago"
+	},
+	{
+		"name": "-10:00 Cook Islands Time - Avarua",
+		"value": "Pacific/Rarotonga"
+	},
+	{
+		"name": "-10:00 Hawaii-Aleutian Time - Adak",
+		"value": "America/Adak"
+	},
+	{
+		"name": "-10:00 Hawaii-Aleutian Time - Honolulu, East Honolulu, Pearl City, Hilo",
+		"value": "Pacific/Honolulu"
+	},
+	{
+		"name": "-10:00 Tahiti Time - Faaa, Papeete, Punaauia",
+		"value": "Pacific/Tahiti"
+	},
+	{
+		"name": "-09:30 Marquesas Time - Marquesas",
+		"value": "Pacific/Marquesas"
+	},
+	{
+		"name": "-09:00 Alaska Time - Anchorage, Juneau, Fairbanks, Eagle River",
+		"value": "America/Anchorage"
+	},
+	{
+		"name": "-09:00 Gambier Time - Gambier",
+		"value": "Pacific/Gambier"
+	},
+	{
+		"name": "-08:00 Pacific Time - Los Angeles, San Diego, San Jose, San Francisco",
+		"value": "America/Los_Angeles"
+	},
+	{
+		"name": "-08:00 Pacific Time - Tijuana, Mexicali, Ensenada, Rosarito",
+		"value": "America/Tijuana"
+	},
+	{
+		"name": "-08:00 Pacific Time - Vancouver, Surrey, Okanagan, Victoria",
+		"value": "America/Vancouver"
+	},
+	{
+		"name": "-08:00 Pitcairn Time - Adamstown",
+		"value": "Pacific/Pitcairn"
+	},
+	{
+		"name": "-07:00 Mexican Pacific Time - Hermosillo, Culiac谩n, Ciudad Obreg贸n, Mazatl谩n",
+		"value": "America/Hermosillo"
+	},
+	{
+		"name": "-07:00 Mountain Time - Calgary, Edmonton, Red Deer, Sherwood Park",
+		"value": "America/Edmonton"
+	},
+	{
+		"name": "-07:00 Mountain Time - Ciudad Ju谩rez",
+		"value": "America/Ciudad_Juarez"
+	},
+	{
+		"name": "-07:00 Mountain Time - Denver, El Paso, Albuquerque, Colorado Springs",
+		"value": "America/Denver"
+	},
+	{
+		"name": "-07:00 Mountain Time - Phoenix, Tucson, Mesa, Chandler",
+		"value": "America/Phoenix"
+	},
+	{
+		"name": "-07:00 Yukon Time - Whitehorse, Fort St. John, Creston, Dawson",
+		"value": "America/Whitehorse"
+	},
+	{
+		"name": "-06:00 Central Time - Belize City, San Ignacio, San Pedro, Orange Walk",
+		"value": "America/Belize"
+	},
+	{
+		"name": "-06:00 Central Time - Chicago, Houston, San Antonio, Dallas",
+		"value": "America/Chicago"
+	},
+	{
+		"name": "-06:00 Central Time - Guatemala City, Villa Nueva, Mixco, Cob谩n",
+		"value": "America/Guatemala"
+	},
+	{
+		"name": "-06:00 Central Time - Managua, Le贸n, Masaya, Chinandega",
+		"value": "America/Managua"
+	},
+	{
+		"name": "-06:00 Central Time - Mexico City, Iztapalapa, Le贸n de los Aldama, Puebla",
+		"value": "America/Mexico_City"
+	},
+	{
+		"name": "-06:00 Central Time - Reynosa, Heroica Matamoros, Nuevo Laredo, Piedras Negras",
+		"value": "America/Matamoros"
+	},
+	{
+		"name": "-06:00 Central Time - San Jos茅, Lim贸n, San Francisco, Alajuela",
+		"value": "America/Costa_Rica"
+	},
+	{
+		"name": "-06:00 Central Time - San Salvador, Soyapango, San Miguel, Santa Ana",
+		"value": "America/El_Salvador"
+	},
+	{
+		"name": "-06:00 Central Time - Saskatoon, Regina, Prince Albert, Moose Jaw",
+		"value": "America/Regina"
+	},
+	{
+		"name": "-06:00 Central Time - Tegucigalpa, San Pedro Sula, La Ceiba, Choloma",
+		"value": "America/Tegucigalpa"
+	},
+	{
+		"name": "-06:00 Central Time - Winnipeg, Brandon, Steinbach, Kenora",
+		"value": "America/Winnipeg"
+	},
+	{
+		"name": "-06:00 Easter Island Time - Easter",
+		"value": "Pacific/Easter"
+	},
+	{
+		"name": "-06:00 Galapagos Time - Galapagos",
+		"value": "Pacific/Galapagos"
+	},
+	{
+		"name": "-05:00 Acre Time - Rio Branco, Cruzeiro do Sul, Senador Guiomard, Sena Madureira",
+		"value": "America/Rio_Branco"
+	},
+	{
+		"name": "-05:00 Colombia Time - Bogot谩, Cali, Medell铆n, Barranquilla",
+		"value": "America/Bogota"
+	},
+	{
+		"name": "-05:00 Cuba Time - Havana, Santiago de Cuba, Camag眉ey, Holgu铆n",
+		"value": "America/Havana"
+	},
+	{
+		"name": "-05:00 Eastern Time - Atikokan",
+		"value": "America/Atikokan"
+	},
+	{
+		"name": "-05:00 Eastern Time - Canc煤n, Chetumal, Playa del Carmen, Cozumel",
+		"value": "America/Cancun"
+	},
+	{
+		"name": "-05:00 Eastern Time - Cockburn Town",
+		"value": "America/Grand_Turk"
+	},
+	{
+		"name": "-05:00 Eastern Time - George Town, West Bay",
+		"value": "America/Cayman"
+	},
+	{
+		"name": "-05:00 Eastern Time - Kingston, New Kingston, Spanish Town, Portmore",
+		"value": "America/Jamaica"
+	},
+	{
+		"name": "-05:00 Eastern Time - Nassau, Lucaya, Freeport",
+		"value": "America/Nassau"
+	},
+	{
+		"name": "-05:00 Eastern Time - New York City, Brooklyn, Queens, Philadelphia",
+		"value": "America/New_York"
+	},
+	{
+		"name": "-05:00 Eastern Time - Panam谩, San Miguelito, Juan D铆az, David",
+		"value": "America/Panama"
+	},
+	{
+		"name": "-05:00 Eastern Time - Port-au-Prince, Carrefour, Delmas 73, Port-de-Paix",
+		"value": "America/Port-au-Prince"
+	},
+	{
+		"name": "-05:00 Eastern Time - Toronto, Montr茅al, Ottawa, Mississauga",
+		"value": "America/Toronto"
+	},
+	{
+		"name": "-05:00 Ecuador Time - Quito, Guayaquil, Cuenca, Santo Domingo de los Colorados",
+		"value": "America/Guayaquil"
+	},
+	{
+		"name": "-05:00 Peru Time - Lima, Callao, Arequipa, Trujillo",
+		"value": "America/Lima"
+	},
+	{
+		"name": "-04:00 Amazon Time - Manaus, Campo Grande, Cuiab谩, Porto Velho",
+		"value": "America/Manaus"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Basseterre",
+		"value": "America/St_Kitts"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Blanc-Sablon",
+		"value": "America/Blanc-Sablon"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Brades, Plymouth",
+		"value": "America/Montserrat"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Bridgetown",
+		"value": "America/Barbados"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Castries",
+		"value": "America/St_Lucia"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Chaguanas, Mon Repos, San Fernando, Port of Spain",
+		"value": "America/Port_of_Spain"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Fort-de-France, Le Lamentin, Le Robert, Sainte-Marie",
+		"value": "America/Martinique"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Gustavia",
+		"value": "America/St_Barthelemy"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Halifax, Moncton, Sydney, Dartmouth",
+		"value": "America/Halifax"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Hamilton",
+		"value": "Atlantic/Bermuda"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Kingstown, Kingstown Park",
+		"value": "America/St_Vincent"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Kralendijk",
+		"value": "America/Kralendijk"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Les Abymes, Baie-Mahault, Le Gosier, Petit-Bourg",
+		"value": "America/Guadeloupe"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Marigot",
+		"value": "America/Marigot"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Oranjestad, Tanki Leendert, San Nicolas",
+		"value": "America/Aruba"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Philipsburg",
+		"value": "America/Lower_Princes"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Road Town",
+		"value": "America/Tortola"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Roseau",
+		"value": "America/Dominica"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Saint Croix, Charlotte Amalie",
+		"value": "America/St_Thomas"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Saint George's",
+		"value": "America/Grenada"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Saint John鈥檚",
+		"value": "America/Antigua"
+	},
+	{
+		"name": "-04:00 Atlantic Time - San Juan, Bayam贸n, Carolina, Ponce",
+		"value": "America/Puerto_Rico"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Santo Domingo, Santiago de los Caballeros, Santo Domingo Oeste, Santo Domingo Este",
+		"value": "America/Santo_Domingo"
+	},
+	{
+		"name": "-04:00 Atlantic Time - The Valley",
+		"value": "America/Anguilla"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Thule",
+		"value": "America/Thule"
+	},
+	{
+		"name": "-04:00 Atlantic Time - Willemstad",
+		"value": "America/Curacao"
+	},
+	{
+		"name": "-04:00 Bolivia Time - La Paz, Santa Cruz de la Sierra, Cochabamba, Sucre",
+		"value": "America/La_Paz"
+	},
+	{
+		"name": "-04:00 Chile Time - Santiago, Puente Alto, Antofagasta, Vi帽a del Mar",
+		"value": "America/Santiago"
+	},
+	{
+		"name": "-04:00 Guyana Time - Georgetown, Linden, New Amsterdam",
+		"value": "America/Guyana"
+	},
+	{
+		"name": "-04:00 Paraguay Time - Asunci贸n, Ciudad del Este, San Lorenzo, Capiat谩",
+		"value": "America/Asuncion"
+	},
+	{
+		"name": "-04:00 Venezuela Time - Caracas, Maracaibo, Maracay, Valencia",
+		"value": "America/Caracas"
+	},
+	{
+		"name": "-03:30 Newfoundland Time - St. John's, Mount Pearl, Corner Brook, Conception Bay South",
+		"value": "America/St_Johns"
+	},
+	{
+		"name": "-03:00 Argentina Time - Buenos Aires, C贸rdoba, Rosario, Mar del Plata",
+		"value": "America/Argentina/Buenos_Aires"
+	},
+	{
+		"name": "-03:00 Brasilia Time - S茫o Paulo, Rio de Janeiro, Belo Horizonte, Salvador",
+		"value": "America/Sao_Paulo"
+	},
+	{
+		"name": "-03:00 Chile Time - Palmer, Rothera",
+		"value": "Antarctica/Palmer"
+	},
+	{
+		"name": "-03:00 Chile Time - Punta Arenas, Puerto Natales",
+		"value": "America/Punta_Arenas"
+	},
+	{
+		"name": "-03:00 Falkland Islands Time - Stanley",
+		"value": "Atlantic/Stanley"
+	},
+	{
+		"name": "-03:00 French Guiana Time - Cayenne, Matoury, Saint-Laurent-du-Maroni, Kourou",
+		"value": "America/Cayenne"
+	},
+	{
+		"name": "-03:00 St. Pierre & Miquelon Time - Saint-Pierre",
+		"value": "America/Miquelon"
+	},
+	{
+		"name": "-03:00 Suriname Time - Paramaribo, Lelydorp",
+		"value": "America/Paramaribo"
+	},
+	{
+		"name": "-03:00 Uruguay Time - Montevideo, Salto, Paysand煤, Las Piedras",
+		"value": "America/Montevideo"
+	},
+	{
+		"name": "-03:00 West Greenland Time - Nuuk",
+		"value": "America/Nuuk"
+	},
+	{
+		"name": "-02:00 Fernando de Noronha Time - Noronha",
+		"value": "America/Noronha"
+	},
+	{
+		"name": "-02:00 South Georgia Time - Grytviken",
+		"value": "Atlantic/South_Georgia"
+	},
+	{
+		"name": "-01:00 Azores Time - Ponta Delgada",
+		"value": "Atlantic/Azores"
+	},
+	{
+		"name": "-01:00 Cape Verde Time - Praia, Mindelo, Santa Maria, Cova Figueira",
+		"value": "Atlantic/Cape_Verde"
+	},
+	{
+		"name": "-01:00 East Greenland Time - Scoresbysund",
+		"value": "America/Scoresbysund"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Abidjan, Abobo, Bouak茅, Korhogo",
+		"value": "Africa/Abidjan"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Accra, Kumasi, Tamale, Takoradi",
+		"value": "Africa/Accra"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Bamako, S茅gou, Sikasso, Mopti",
+		"value": "Africa/Bamako"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Bissau, Bafat谩",
+		"value": "Africa/Bissau"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Camayenne, Conakry, Nz茅r茅kor茅, Kindia",
+		"value": "Africa/Conakry"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Dakar, Pikine, Touba, Thi猫s",
+		"value": "Africa/Dakar"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Danmarkshavn",
+		"value": "America/Danmarkshavn"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Douglas",
+		"value": "Europe/Isle_of_Man"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Dublin, South Dublin, Cork, Limerick",
+		"value": "Europe/Dublin"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Freetown, Bo, Kenema, Koidu",
+		"value": "Africa/Freetown"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Jamestown",
+		"value": "Atlantic/St_Helena"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Lom茅, Sokod茅, Kara, Atakpam茅",
+		"value": "Africa/Lome"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - London, Birmingham, Liverpool, Glasgow",
+		"value": "Europe/London"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Monrovia, Gbarnga, Kakata, Bensonville",
+		"value": "Africa/Monrovia"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Nouakchott, Nouadhibou, Dar Naim, N茅ma",
+		"value": "Africa/Nouakchott"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Ouagadougou, Bobo-Dioulasso, Koudougou, Ouahigouya",
+		"value": "Africa/Ouagadougou"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Reykjav铆k, K贸pavogur, Hafnarfj枚r冒ur, Reykjanesb忙r",
+		"value": "Atlantic/Reykjavik"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Saint Helier",
+		"value": "Europe/Jersey"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Saint Peter Port",
+		"value": "Europe/Guernsey"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Serekunda, Brikama, Bakau, Banjul",
+		"value": "Africa/Banjul"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - S茫o Tom茅",
+		"value": "Africa/Sao_Tome"
+	},
+	{
+		"name": "+00:00 Greenwich Mean Time - Troll",
+		"value": "Antarctica/Troll"
+	},
+	{
+		"name": "+00:00 Western European Time - Casablanca, Rabat, F猫s, Sale",
+		"value": "Africa/Casablanca"
+	},
+	{
+		"name": "+00:00 Western European Time - Laayoune, Dakhla, Boujdour",
+		"value": "Africa/El_Aaiun"
+	},
+	{
+		"name": "+00:00 Western European Time - Las Palmas de Gran Canaria, Santa Cruz de Tenerife, La Laguna, Telde",
+		"value": "Atlantic/Canary"
+	},
+	{
+		"name": "+00:00 Western European Time - Lisbon, Porto, Amadora, Braga",
+		"value": "Europe/Lisbon"
+	},
+	{
+		"name": "+00:00 Western European Time - T贸rshavn",
+		"value": "Atlantic/Faroe"
+	},
+	{
+		"name": "+01:00 Central Africa Time - Windhoek, Rundu, Walvis Bay, Oshakati",
+		"value": "Africa/Windhoek"
+	},
+	{
+		"name": "+01:00 Central European Time - Algiers, Boumerdas, Oran, T茅bessa",
+		"value": "Africa/Algiers"
+	},
+	{
+		"name": "+01:00 Central European Time - Amsterdam, Rotterdam, The Hague, Utrecht",
+		"value": "Europe/Amsterdam"
+	},
+	{
+		"name": "+01:00 Central European Time - Andorra la Vella, les Escaldes",
+		"value": "Europe/Andorra"
+	},
+	{
+		"name": "+01:00 Central European Time - Belgrade, Ni拧, Novi Sad, Zemun",
+		"value": "Europe/Belgrade"
+	},
+	{
+		"name": "+01:00 Central European Time - Berlin, Hamburg, Munich, K枚ln",
+		"value": "Europe/Berlin"
+	},
+	{
+		"name": "+01:00 Central European Time - Bratislava, Ko拧ice, Nitra, Pre拧ov",
+		"value": "Europe/Bratislava"
+	},
+	{
+		"name": "+01:00 Central European Time - Brussels, Antwerpen, Gent, Charleroi",
+		"value": "Europe/Brussels"
+	},
+	{
+		"name": "+01:00 Central European Time - Budapest, Debrecen, Szeged, Miskolc",
+		"value": "Europe/Budapest"
+	},
+	{
+		"name": "+01:00 Central European Time - Copenhagen, 脜rhus, Odense, Aalborg",
+		"value": "Europe/Copenhagen"
+	},
+	{
+		"name": "+01:00 Central European Time - Gibraltar",
+		"value": "Europe/Gibraltar"
+	},
+	{
+		"name": "+01:00 Central European Time - Ljubljana, Maribor, Kranj, Celje",
+		"value": "Europe/Ljubljana"
+	},
+	{
+		"name": "+01:00 Central European Time - Longyearbyen",
+		"value": "Arctic/Longyearbyen"
+	},
+	{
+		"name": "+01:00 Central European Time - Luxembourg, Esch-sur-Alzette, Dudelange",
+		"value": "Europe/Luxembourg"
+	},
+	{
+		"name": "+01:00 Central European Time - Madrid, Barcelona, Valencia, Sevilla",
+		"value": "Europe/Madrid"
+	},
+	{
+		"name": "+01:00 Central European Time - Monaco, Monte-Carlo",
+		"value": "Europe/Monaco"
+	},
+	{
+		"name": "+01:00 Central European Time - Oslo, Bergen, Trondheim, Stavanger",
+		"value": "Europe/Oslo"
+	},
+	{
+		"name": "+01:00 Central European Time - Paris, Marseille, Lyon, Toulouse",
+		"value": "Europe/Paris"
+	},
+	{
+		"name": "+01:00 Central European Time - Podgorica, Nik拧i膰, Herceg Novi, Pljevlja",
+		"value": "Europe/Podgorica"
+	},
+	{
+		"name": "+01:00 Central European Time - Prague, Brno, Ostrava, Pilsen",
+		"value": "Europe/Prague"
+	},
+	{
+		"name": "+01:00 Central European Time - Rome, Milan, Naples, Turin",
+		"value": "Europe/Rome"
+	},
+	{
+		"name": "+01:00 Central European Time - San Marino",
+		"value": "Europe/San_Marino"
+	},
+	{
+		"name": "+01:00 Central European Time - San Pawl il-Ba魔ar, Birkirkara, Mosta, Sliema",
+		"value": "Europe/Malta"
+	},
+	{
+		"name": "+01:00 Central European Time - Sarajevo, Banja Luka, Zenica, Tuzla",
+		"value": "Europe/Sarajevo"
+	},
+	{
+		"name": "+01:00 Central European Time - Skopje, Kumanovo, Prilep, Bitola",
+		"value": "Europe/Skopje"
+	},
+	{
+		"name": "+01:00 Central European Time - Stockholm, G枚teborg, Malm枚, Uppsala",
+		"value": "Europe/Stockholm"
+	},
+	{
+		"name": "+01:00 Central European Time - Tirana, Durr毛s, Elbasan, Vlor毛",
+		"value": "Europe/Tirane"
+	},
+	{
+		"name": "+01:00 Central European Time - Tunis, Sfax, Sousse, Kairouan",
+		"value": "Africa/Tunis"
+	},
+	{
+		"name": "+01:00 Central European Time - Vaduz",
+		"value": "Europe/Vaduz"
+	},
+	{
+		"name": "+01:00 Central European Time - Vatican City",
+		"value": "Europe/Vatican"
+	},
+	{
+		"name": "+01:00 Central European Time - Vienna, Graz, Linz, Favoriten",
+		"value": "Europe/Vienna"
+	},
+	{
+		"name": "+01:00 Central European Time - Warsaw, 艁贸d藕, Krak贸w, Wroc艂aw",
+		"value": "Europe/Warsaw"
+	},
+	{
+		"name": "+01:00 Central European Time - Zagreb, Split, Rijeka, Osijek",
+		"value": "Europe/Zagreb"
+	},
+	{
+		"name": "+01:00 Central European Time - Z眉rich, Gen猫ve, Basel, Lausanne",
+		"value": "Europe/Zurich"
+	},
+	{
+		"name": "+01:00 West Africa Time - Bangui, Bimbo, Mba茂ki, Berb茅rati",
+		"value": "Africa/Bangui"
+	},
+	{
+		"name": "+01:00 West Africa Time - Bata, Malabo, Ebebiyin",
+		"value": "Africa/Malabo"
+	},
+	{
+		"name": "+01:00 West Africa Time - Brazzaville, Pointe-Noire, Dolisie, Kayes",
+		"value": "Africa/Brazzaville"
+	},
+	{
+		"name": "+01:00 West Africa Time - Cotonou, Abomey-Calavi, Djougou, Porto-Novo",
+		"value": "Africa/Porto-Novo"
+	},
+	{
+		"name": "+01:00 West Africa Time - Douala, Yaound茅, Garoua, Kouss茅ri",
+		"value": "Africa/Douala"
+	},
+	{
+		"name": "+01:00 West Africa Time - Kinshasa, Masina, Kikwit, Mbandaka",
+		"value": "Africa/Kinshasa"
+	},
+	{
+		"name": "+01:00 West Africa Time - Lagos, Kano, Ibadan, Port Harcourt",
+		"value": "Africa/Lagos"
+	},
+	{
+		"name": "+01:00 West Africa Time - Libreville, Port-Gentil, Franceville, Oyem",
+		"value": "Africa/Libreville"
+	},
+	{
+		"name": "+01:00 West Africa Time - Luanda, N鈥檇alatando, Huambo, Lobito",
+		"value": "Africa/Luanda"
+	},
+	{
+		"name": "+01:00 West Africa Time - N'Djamena, Moundou, Sarh, Ab茅ch茅",
+		"value": "Africa/Ndjamena"
+	},
+	{
+		"name": "+01:00 West Africa Time - Niamey, Zinder, Maradi, Agadez",
+		"value": "Africa/Niamey"
+	},
+	{
+		"name": "+02:00 Central Africa Time - Bujumbura, Muyinga, Gitega, Ruyigi",
+		"value": "Africa/Bujumbura"
+	},
+	{
+		"name": "+02:00 Central Africa Time - Gaborone, Francistown, Molepolole, Maun",
+		"value": "Africa/Gaborone"
+	},
+	{
+		"name": "+02:00 Central Africa Time - Harare, Bulawayo, Chitungwiza, Mutare",
+		"value": "Africa/Harare"
+	},
+	{
+		"name": "+02:00 Central Africa Time - Juba, Winejok, Yei, Malakal",
+		"value": "Africa/Juba"
+	},
+	{
+		"name": "+02:00 Central Africa Time - Khartoum, Omdurman, Nyala, Port Sudan",
+		"value": "Africa/Khartoum"
+	},
+	{
+		"name": "+02:00 Central Africa Time - Kigali, Gisenyi, Butare, Gitarama",
+		"value": "Africa/Kigali"
+	},
+	{
+		"name": "+02:00 Central Africa Time - Lilongwe, Blantyre, Mzuzu, Zomba",
+		"value": "Africa/Blantyre"
+	},
+	{
+		"name": "+02:00 Central Africa Time - Lubumbashi, Mbuji-Mayi, Kisangani, Kananga",
+		"value": "Africa/Lubumbashi"
+	},
+	{
+		"name": "+02:00 Central Africa Time - Lusaka, Ndola, Kitwe, Chipata",
+		"value": "Africa/Lusaka"
+	},
+	{
+		"name": "+02:00 Central Africa Time - Maputo, Matola, Nampula, Beira",
+		"value": "Africa/Maputo"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Athens, Thessalon铆ki, P谩tra, Piraeus",
+		"value": "Europe/Athens"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Beirut, Ra鈥檚 Bayr奴t, Tripoli, Sidon",
+		"value": "Asia/Beirut"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Bucharest, Sector 3, Ia艧i, Sector 6",
+		"value": "Europe/Bucharest"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Cairo, Alexandria, Giza, Shubr膩 al Khaymah",
+		"value": "Africa/Cairo"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Chisinau, Tiraspol, B膬l牛i, Bender",
+		"value": "Europe/Chisinau"
+	},
+	{
+		"name": "+02:00 Eastern European Time - East Jerusalem, Gaza, Kh膩n Y奴nis, Jab膩ly膩",
+		"value": "Asia/Hebron"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Helsinki, Espoo, Tampere, Oulu",
+		"value": "Europe/Helsinki"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Kaliningrad, Chernyakhovsk, Sovetsk, Baltiysk",
+		"value": "Europe/Kaliningrad"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Kyiv, Kharkiv, Odesa, Dnipro",
+		"value": "Europe/Kyiv"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Mariehamn",
+		"value": "Europe/Mariehamn"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Nicosia, Limassol, Larnaca, Str贸volos",
+		"value": "Asia/Nicosia"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Riga, Daugavpils, Liep膩ja, Jelgava",
+		"value": "Europe/Riga"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Sofia, Plovdiv, Varna, Burgas",
+		"value": "Europe/Sofia"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Tallinn, Tartu, Narva, P盲rnu",
+		"value": "Europe/Tallinn"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Tripoli, Benghazi, Ajdabiya, Mi艧r膩tah",
+		"value": "Africa/Tripoli"
+	},
+	{
+		"name": "+02:00 Eastern European Time - Vilnius, Kaunas, Klaip臈da, 艩iauliai",
+		"value": "Europe/Vilnius"
+	},
+	{
+		"name": "+02:00 Israel Time - Jerusalem, Tel Aviv, West Jerusalem, Haifa",
+		"value": "Asia/Jerusalem"
+	},
+	{
+		"name": "+02:00 South Africa Time - Johannesburg, Cape Town, Durban, Soweto",
+		"value": "Africa/Johannesburg"
+	},
+	{
+		"name": "+02:00 South Africa Time - Manzini, Mbabane, Lobamba",
+		"value": "Africa/Mbabane"
+	},
+	{
+		"name": "+02:00 South Africa Time - Maseru, Mohale鈥檚 Hoek, Mafeteng, Leribe",
+		"value": "Africa/Maseru"
+	},
+	{
+		"name": "+03:00 Arabian Time - Al A岣﹎ad墨, 岣╝wall墨, As S膩lim墨yah, 艦ab膩岣� as S膩lim",
+		"value": "Asia/Kuwait"
+	},
+	{
+		"name": "+03:00 Arabian Time - Ar Rif膩鈥�, Manama, Al Muharraq, D膩r Kulayb",
+		"value": "Asia/Bahrain"
+	},
+	{
+		"name": "+03:00 Arabian Time - Baghdad, Al Maw艧il al Jad墨dah, Al Ba艧rah al Qad墨mah, Mosul",
+		"value": "Asia/Baghdad"
+	},
+	{
+		"name": "+03:00 Arabian Time - Doha, Ar Rayy膩n, Umm 艦al膩l Mu岣゛mmad, Al Wakrah",
+		"value": "Asia/Qatar"
+	},
+	{
+		"name": "+03:00 Arabian Time - Jeddah, Riyadh, Mecca, Medina",
+		"value": "Asia/Riyadh"
+	},
+	{
+		"name": "+03:00 Arabian Time - Sanaa, Aden, Al 岣╱daydah, Taiz",
+		"value": "Asia/Aden"
+	},
+	{
+		"name": "+03:00 Asia/Amman - Amman, Zarqa, Irbid, Russeifa",
+		"value": "Asia/Amman"
+	},
+	{
+		"name": "+03:00 Asia/Damascus - Aleppo, Damascus, Homs, Latakia",
+		"value": "Asia/Damascus"
+	},
+	{
+		"name": "+03:00 East Africa Time - Addis Ababa, Jijiga, Gondar, Mek'ele",
+		"value": "Africa/Addis_Ababa"
+	},
+	{
+		"name": "+03:00 East Africa Time - Antananarivo, Toamasina, Antsirabe, Mahajanga",
+		"value": "Indian/Antananarivo"
+	},
+	{
+		"name": "+03:00 East Africa Time - Asmara, Keren, Massawa, Assab",
+		"value": "Africa/Asmara"
+	},
+	{
+		"name": "+03:00 East Africa Time - Dar es Salaam, Mwanza, Zanzibar, Arusha",
+		"value": "Africa/Dar_es_Salaam"
+	},
+	{
+		"name": "+03:00 East Africa Time - Djibouti, 'Ali Sabieh, Tadjourah, Obock",
+		"value": "Africa/Djibouti"
+	},
+	{
+		"name": "+03:00 East Africa Time - Kampala, Gulu, Lira, Mbarara",
+		"value": "Africa/Kampala"
+	},
+	{
+		"name": "+03:00 East Africa Time - Mamoudzou, Koungou, Dzaoudzi",
+		"value": "Indian/Mayotte"
+	},
+	{
+		"name": "+03:00 East Africa Time - Mogadishu, Hargeysa, Berbera, Kismayo",
+		"value": "Africa/Mogadishu"
+	},
+	{
+		"name": "+03:00 East Africa Time - Moroni, Moutsamoudou",
+		"value": "Indian/Comoro"
+	},
+	{
+		"name": "+03:00 East Africa Time - Nairobi, Kakamega, Mombasa, Ruiru",
+		"value": "Africa/Nairobi"
+	},
+	{
+		"name": "+03:00 Moscow Time - Minsk, Homyel', Hrodna, Mahilyow",
+		"value": "Europe/Minsk"
+	},
+	{
+		"name": "+03:00 Moscow Time - Moscow, Saint Petersburg, Nizhniy Novgorod, Kazan",
+		"value": "Europe/Moscow"
+	},
+	{
+		"name": "+03:00 Moscow Time - Sevastopol, Simferopol, Kerch, Yevpatoriya",
+		"value": "Europe/Simferopol"
+	},
+	{
+		"name": "+03:00 Syowa Time - Syowa",
+		"value": "Antarctica/Syowa"
+	},
+	{
+		"name": "+03:00 Turkey Time - Istanbul, Ankara, Bursa, 陌zmir",
+		"value": "Europe/Istanbul"
+	},
+	{
+		"name": "+03:30 Iran Time - Tehran, Mashhad, Isfahan, Karaj",
+		"value": "Asia/Tehran"
+	},
+	{
+		"name": "+04:00 Armenia Time - Yerevan, Gyumri, Vanadzor, Vagharshapat",
+		"value": "Asia/Yerevan"
+	},
+	{
+		"name": "+04:00 Azerbaijan Time - Baku, Sumqay谋t, Ganja, Lankaran",
+		"value": "Asia/Baku"
+	},
+	{
+		"name": "+04:00 Georgia Time - Tbilisi, Batumi, Kutaisi, Rustavi",
+		"value": "Asia/Tbilisi"
+	},
+	{
+		"name": "+04:00 Gulf Time - Dubai, Abu Dhabi, Sharjah, Al Ain City",
+		"value": "Asia/Dubai"
+	},
+	{
+		"name": "+04:00 Gulf Time - Muscat, Seeb, Bawshar, 鈥業br墨",
+		"value": "Asia/Muscat"
+	},
+	{
+		"name": "+04:00 Mauritius Time - Port Louis, Vacoas, Beau Bassin-Rose Hill, Curepipe",
+		"value": "Indian/Mauritius"
+	},
+	{
+		"name": "+04:00 R茅union Time - Saint-Denis, Saint-Paul, Le Tampon, Saint-Pierre",
+		"value": "Indian/Reunion"
+	},
+	{
+		"name": "+04:00 Samara Time - Samara, Saratov, Tolyatti, Izhevsk",
+		"value": "Europe/Samara"
+	},
+	{
+		"name": "+04:00 Seychelles Time - Victoria",
+		"value": "Indian/Mahe"
+	},
+	{
+		"name": "+04:30 Afghanistan Time - Kabul, Her膩t, Maz膩r-e Shar墨f, Kandah膩r",
+		"value": "Asia/Kabul"
+	},
+	{
+		"name": "+05:00 French Southern & Antarctic Time - Port-aux-Fran莽ais",
+		"value": "Indian/Kerguelen"
+	},
+	{
+		"name": "+05:00 Maldives Time - Male",
+		"value": "Indian/Maldives"
+	},
+	{
+		"name": "+05:00 Mawson Time - Mawson",
+		"value": "Antarctica/Mawson"
+	},
+	{
+		"name": "+05:00 Pakistan Time - Karachi, Lahore, Faisalabad, Rawalpindi",
+		"value": "Asia/Karachi"
+	},
+	{
+		"name": "+05:00 Tajikistan Time - Dushanbe, Isfara, Istaravshan, K怒lob",
+		"value": "Asia/Dushanbe"
+	},
+	{
+		"name": "+05:00 Turkmenistan Time - Ashgabat, T眉rkmenabat, Da艧oguz, Mary",
+		"value": "Asia/Ashgabat"
+	},
+	{
+		"name": "+05:00 Uzbekistan Time - Tashkent, Namangan, Samarkand, Andijon",
+		"value": "Asia/Tashkent"
+	},
+	{
+		"name": "+05:00 West Kazakhstan Time - Aktobe, Kyzylorda, Oral, Atyrau",
+		"value": "Asia/Aqtobe"
+	},
+	{
+		"name": "+05:00 Yekaterinburg Time - Yekaterinburg, Chelyabinsk, Ufa, Perm",
+		"value": "Asia/Yekaterinburg"
+	},
+	{
+		"name": "+05:30 India Time - Colombo, Dehiwala-Mount Lavinia, Maharagama, Jaffna",
+		"value": "Asia/Colombo"
+	},
+	{
+		"name": "+05:30 India Time - Mumbai, Delhi, Bengaluru, Hyder膩b膩d",
+		"value": "Asia/Kolkata"
+	},
+	{
+		"name": "+05:45 Nepal Time - Kathmandu, Bharatpur, P膩tan, Birga帽j",
+		"value": "Asia/Kathmandu"
+	},
+	{
+		"name": "+06:00 Bangladesh Time - Dhaka, Chattogram, Khulna, Rangpur",
+		"value": "Asia/Dhaka"
+	},
+	{
+		"name": "+06:00 Bhutan Time - Thimphu, Phuntsholing, Tsirang, Pun膩kha",
+		"value": "Asia/Thimphu"
+	},
+	{
+		"name": "+06:00 China Time - 脺r眉mqi, Shihezi, Korla, Aksu",
+		"value": "Asia/Urumqi"
+	},
+	{
+		"name": "+06:00 East Kazakhstan Time - Almaty, Shymkent, Karagandy, Taraz",
+		"value": "Asia/Almaty"
+	},
+	{
+		"name": "+06:00 Indian Ocean Time - Chagos",
+		"value": "Indian/Chagos"
+	},
+	{
+		"name": "+06:00 Kyrgyzstan Time - Bishkek, Osh, Jalal-Abad, Karakol",
+		"value": "Asia/Bishkek"
+	},
+	{
+		"name": "+06:00 Omsk Time - Omsk, Tara, Kalachinsk",
+		"value": "Asia/Omsk"
+	},
+	{
+		"name": "+06:00 Vostok Time - Vostok",
+		"value": "Antarctica/Vostok"
+	},
+	{
+		"name": "+06:30 Cocos Islands Time - West Island",
+		"value": "Indian/Cocos"
+	},
+	{
+		"name": "+06:30 Myanmar Time - Yangon, Mandalay, Nay Pyi Taw, Mawlamyine",
+		"value": "Asia/Yangon"
+	},
+	{
+		"name": "+07:00 Christmas Island Time - Flying Fish Cove",
+		"value": "Indian/Christmas"
+	},
+	{
+		"name": "+07:00 Davis Time - Davis",
+		"value": "Antarctica/Davis"
+	},
+	{
+		"name": "+07:00 Hovd Time - Ulaangom, Khovd, 脰lgii, Altai",
+		"value": "Asia/Hovd"
+	},
+	{
+		"name": "+07:00 Indochina Time - Bangkok, Samut Prakan, Mueang Nonthaburi, Chon Buri",
+		"value": "Asia/Bangkok"
+	},
+	{
+		"name": "+07:00 Indochina Time - Ho Chi Minh City, Da Nang, Bi锚n H貌a, C岷 Th啤",
+		"value": "Asia/Ho_Chi_Minh"
+	},
+	{
+		"name": "+07:00 Indochina Time - Phnom Penh, Takeo, Siem Reap, Battambang",
+		"value": "Asia/Phnom_Penh"
+	},
+	{
+		"name": "+07:00 Indochina Time - Vientiane, Savannakhet, Pakse, Thakh猫k",
+		"value": "Asia/Vientiane"
+	},
+	{
+		"name": "+07:00 Novosibirsk Time - Novosibirsk, Krasnoyarsk, Barnaul, Tomsk",
+		"value": "Asia/Novosibirsk"
+	},
+	{
+		"name": "+07:00 Western Indonesia Time - Jakarta, Surabaya, Bekasi, Bandung",
+		"value": "Asia/Jakarta"
+	},
+	{
+		"name": "+08:00 Australian Western Time - Perth, Mandurah, Bunbury, Baldivis",
+		"value": "Australia/Perth"
+	},
+	{
+		"name": "+08:00 Brunei Darussalam Time - Bandar Seri Begawan, Kuala Belait, Seria, Tutong",
+		"value": "Asia/Brunei"
+	},
+	{
+		"name": "+08:00 Central Indonesia Time - Makassar, Samarinda, Denpasar, Balikpapan",
+		"value": "Asia/Makassar"
+	},
+	{
+		"name": "+08:00 China Time - Macau",
+		"value": "Asia/Macau"
+	},
+	{
+		"name": "+08:00 China Time - Shanghai, Beijing, Shenzhen, Guangzhou",
+		"value": "Asia/Shanghai"
+	},
+	{
+		"name": "+08:00 Hong Kong Time - Hong Kong, Kowloon, Victoria, Tuen Mun",
+		"value": "Asia/Hong_Kong"
+	},
+	{
+		"name": "+08:00 Irkutsk Time - Irkutsk, Ulan-Ude, Bratsk, Angarsk",
+		"value": "Asia/Irkutsk"
+	},
+	{
+		"name": "+08:00 Malaysia Time - Kuala Lumpur, Petaling Jaya, Klang, Johor Bahru",
+		"value": "Asia/Kuala_Lumpur"
+	},
+	{
+		"name": "+08:00 Philippine Time - Quezon City, Davao, Manila, Caloocan City",
+		"value": "Asia/Manila"
+	},
+	{
+		"name": "+08:00 Singapore Time - Singapore, Woodlands, Geylang, Queenstown Estate",
+		"value": "Asia/Singapore"
+	},
+	{
+		"name": "+08:00 Taipei Time - Taipei, Kaohsiung, Taichung, Tainan",
+		"value": "Asia/Taipei"
+	},
+	{
+		"name": "+08:00 Ulaanbaatar Time - Ulan Bator, Erdenet, Darhan, M枚r枚n",
+		"value": "Asia/Ulaanbaatar"
+	},
+	{
+		"name": "+08:45 Australian Central Western Time - Eucla",
+		"value": "Australia/Eucla"
+	},
+	{
+		"name": "+09:00 East Timor Time - Dili, Maliana, Suai, Likis谩",
+		"value": "Asia/Dili"
+	},
+	{
+		"name": "+09:00 Eastern Indonesia Time - Jayapura, Ambon, Sorong, Ternate",
+		"value": "Asia/Jayapura"
+	},
+	{
+		"name": "+09:00 Japan Time - Tokyo, Yokohama, Osaka, Nagoya",
+		"value": "Asia/Tokyo"
+	},
+	{
+		"name": "+09:00 Korean Time - Pyongyang, Hamh怒ng, Namp鈥檕, Sunch鈥櫯弉",
+		"value": "Asia/Pyongyang"
+	},
+	{
+		"name": "+09:00 Korean Time - Seoul, Busan, Incheon, Daegu",
+		"value": "Asia/Seoul"
+	},
+	{
+		"name": "+09:00 Palau Time - Ngerulmud",
+		"value": "Pacific/Palau"
+	},
+	{
+		"name": "+09:00 Yakutsk Time - Chita, Yakutsk, Blagoveshchensk, Belogorsk",
+		"value": "Asia/Chita"
+	},
+	{
+		"name": "+09:30 Australian Central Time - Adelaide, Adelaide Hills, Mount Gambier, Morphett Vale",
+		"value": "Australia/Adelaide"
+	},
+	{
+		"name": "+09:30 Australian Central Time - Darwin, Alice Springs, Palmerston",
+		"value": "Australia/Darwin"
+	},
+	{
+		"name": "+10:00 Australian Eastern Time - Brisbane, Gold Coast, Logan City, Townsville",
+		"value": "Australia/Brisbane"
+	},
+	{
+		"name": "+10:00 Australian Eastern Time - Sydney, Melbourne, Canberra, Newcastle",
+		"value": "Australia/Sydney"
+	},
+	{
+		"name": "+10:00 Chamorro Time - Dededo Village, Yigo Village, Tamuning-Tumon-Harmon Village, Tamuning",
+		"value": "Pacific/Guam"
+	},
+	{
+		"name": "+10:00 Chamorro Time - Saipan",
+		"value": "Pacific/Saipan"
+	},
+	{
+		"name": "+10:00 Chuuk Time - Chuuk",
+		"value": "Pacific/Chuuk"
+	},
+	{
+		"name": "+10:00 Dumont-d鈥橴rville Time - DumontDUrville",
+		"value": "Antarctica/DumontDUrville"
+	},
+	{
+		"name": "+10:00 Papua New Guinea Time - Port Moresby, Lae, Mount Hagen, Popondetta",
+		"value": "Pacific/Port_Moresby"
+	},
+	{
+		"name": "+10:00 Vladivostok Time - Khabarovsk, Vladivostok, Khabarovsk Vtoroy, Komsomolsk-on-Amur",
+		"value": "Asia/Vladivostok"
+	},
+	{
+		"name": "+10:30 Lord Howe Time - Lord Howe",
+		"value": "Australia/Lord_Howe"
+	},
+	{
+		"name": "+11:00 Bougainville Time - Arawa",
+		"value": "Pacific/Bougainville"
+	},
+	{
+		"name": "+11:00 Casey Time - Casey",
+		"value": "Antarctica/Casey"
+	},
+	{
+		"name": "+11:00 Kosrae Time - Kosrae, Palikir - National Government Center",
+		"value": "Pacific/Kosrae"
+	},
+	{
+		"name": "+11:00 New Caledonia Time - Noum茅a, Mont-Dore, Dumb茅a",
+		"value": "Pacific/Noumea"
+	},
+	{
+		"name": "+11:00 Norfolk Island Time - Kingston",
+		"value": "Pacific/Norfolk"
+	},
+	{
+		"name": "+11:00 Sakhalin Time - Yuzhno-Sakhalinsk, Magadan, Korsakov, Kholmsk",
+		"value": "Asia/Sakhalin"
+	},
+	{
+		"name": "+11:00 Solomon Islands Time - Honiara",
+		"value": "Pacific/Guadalcanal"
+	},
+	{
+		"name": "+11:00 Vanuatu Time - Port-Vila",
+		"value": "Pacific/Efate"
+	},
+	{
+		"name": "+12:00 Fiji Time - Nasinu, Suva, Lautoka, Nadi",
+		"value": "Pacific/Fiji"
+	},
+	{
+		"name": "+12:00 Gilbert Islands Time - Tarawa",
+		"value": "Pacific/Tarawa"
+	},
+	{
+		"name": "+12:00 Marshall Islands Time - Majuro, Kwajalein, RMI Capitol",
+		"value": "Pacific/Majuro"
+	},
+	{
+		"name": "+12:00 Nauru Time - Yaren",
+		"value": "Pacific/Nauru"
+	},
+	{
+		"name": "+12:00 New Zealand Time - Auckland, Wellington, Christchurch, Manukau City",
+		"value": "Pacific/Auckland"
+	},
+	{
+		"name": "+12:00 New Zealand Time - McMurdo",
+		"value": "Antarctica/McMurdo"
+	},
+	{
+		"name": "+12:00 Petropavlovsk-Kamchatski Time - Petropavlovsk-Kamchatsky, Yelizovo, Vilyuchinsk, Anadyr",
+		"value": "Asia/Kamchatka"
+	},
+	{
+		"name": "+12:00 Tuvalu Time - Funafuti",
+		"value": "Pacific/Funafuti"
+	},
+	{
+		"name": "+12:00 Wake Island Time - Wake",
+		"value": "Pacific/Wake"
+	},
+	{
+		"name": "+12:00 Wallis & Futuna Time - Mata-Utu",
+		"value": "Pacific/Wallis"
+	},
+	{
+		"name": "+12:45 Chatham Time - Chatham",
+		"value": "Pacific/Chatham"
+	},
+	{
+		"name": "+13:00 Apia Time - Apia",
+		"value": "Pacific/Apia"
+	},
+	{
+		"name": "+13:00 Phoenix Islands Time - Kanton",
+		"value": "Pacific/Kanton"
+	},
+	{
+		"name": "+13:00 Tokelau Time - Fakaofo",
+		"value": "Pacific/Fakaofo"
+	},
+	{
+		"name": "+13:00 Tonga Time - Nuku鈥榓lofa",
+		"value": "Pacific/Tongatapu"
+	},
+	{
+		"name": "+14:00 Line Islands Time - Kiritimati",
+		"value": "Pacific/Kiritimati"
+	}
+]
diff --git a/utils/timezone.ts b/utils/timezone.ts
new file mode 100644
index 0000000..e854ae7
--- /dev/null
+++ b/utils/timezone.ts
@@ -0,0 +1,7 @@
+import tz from './timezone.json'
+
+type Item = {
+  value: number | string
+  name: string
+}
+export const timezones: Item[] = tz
diff --git a/utils/tool-call.ts b/utils/tool-call.ts
new file mode 100644
index 0000000..8735cc5
--- /dev/null
+++ b/utils/tool-call.ts
@@ -0,0 +1,6 @@
+import { ModelFeatureEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
+
+export const supportFunctionCall = (features: ModelFeatureEnum[] = []): boolean => {
+  if (!features || !features.length) return false
+  return features.some(feature => [ModelFeatureEnum.toolCall, ModelFeatureEnum.multiToolCall, ModelFeatureEnum.streamToolCall].includes(feature))
+}
diff --git a/utils/var-basePath.js b/utils/var-basePath.js
new file mode 100644
index 0000000..07b7f75
--- /dev/null
+++ b/utils/var-basePath.js
@@ -0,0 +1,6 @@
+// export basePath to next.config.js
+// same as the one exported from var.ts
+module.exports = {
+  basePath: '',
+  assetPrefix: '',
+}
diff --git a/utils/var.ts b/utils/var.ts
new file mode 100644
index 0000000..06cb43c
--- /dev/null
+++ b/utils/var.ts
@@ -0,0 +1,110 @@
+import { MAX_VAR_KEY_LENGTH, VAR_ITEM_TEMPLATE, VAR_ITEM_TEMPLATE_IN_WORKFLOW, getMaxVarNameLength } from '@/config'
+import {
+  CONTEXT_PLACEHOLDER_TEXT,
+  HISTORY_PLACEHOLDER_TEXT,
+  PRE_PROMPT_PLACEHOLDER_TEXT,
+  QUERY_PLACEHOLDER_TEXT,
+} from '@/app/components/base/prompt-editor/constants'
+import { InputVarType } from '@/app/components/workflow/types'
+
+const otherAllowedRegex = /^\w+$/
+
+export const getNewVar = (key: string, type: string) => {
+  const { ...rest } = VAR_ITEM_TEMPLATE
+  if (type !== 'string') {
+    return {
+      ...rest,
+      type: type || 'string',
+      key,
+      name: key.slice(0, getMaxVarNameLength(key)),
+    }
+  }
+  return {
+    ...VAR_ITEM_TEMPLATE,
+    type: type || 'string',
+    key,
+    name: key.slice(0, getMaxVarNameLength(key)),
+  }
+}
+
+export const getNewVarInWorkflow = (key: string, type = InputVarType.textInput) => {
+  const { max_length, ...rest } = VAR_ITEM_TEMPLATE_IN_WORKFLOW
+  if (type !== InputVarType.textInput) {
+    return {
+      ...rest,
+      type,
+      variable: key,
+      label: key.slice(0, getMaxVarNameLength(key)),
+    }
+  }
+  return {
+    ...VAR_ITEM_TEMPLATE_IN_WORKFLOW,
+    type,
+    variable: key,
+    label: key.slice(0, getMaxVarNameLength(key)),
+  }
+}
+
+export const checkKey = (key: string, canBeEmpty?: boolean) => {
+  if (key.length === 0 && !canBeEmpty)
+    return 'canNoBeEmpty'
+
+  if (canBeEmpty && key === '')
+    return true
+
+  if (key.length > MAX_VAR_KEY_LENGTH)
+    return 'tooLong'
+
+  if (otherAllowedRegex.test(key)) {
+    if (/\d/.test(key[0]))
+      return 'notStartWithNumber'
+
+    return true
+  }
+  return 'notValid'
+}
+
+export const checkKeys = (keys: string[], canBeEmpty?: boolean) => {
+  let isValid = true
+  let errorKey = ''
+  let errorMessageKey = ''
+  keys.forEach((key) => {
+    if (!isValid)
+      return
+
+    const res = checkKey(key, canBeEmpty)
+    if (res !== true) {
+      isValid = false
+      errorKey = key
+      errorMessageKey = res
+    }
+  })
+  return { isValid, errorKey, errorMessageKey }
+}
+
+const varRegex = /\{\{([a-zA-Z_]\w*)\}\}/g
+export const getVars = (value: string) => {
+  if (!value)
+    return []
+
+  const keys = value.match(varRegex)?.filter((item) => {
+    return ![CONTEXT_PLACEHOLDER_TEXT, HISTORY_PLACEHOLDER_TEXT, QUERY_PLACEHOLDER_TEXT, PRE_PROMPT_PLACEHOLDER_TEXT].includes(item)
+  }).map((item) => {
+    return item.replace('{{', '').replace('}}', '')
+  }).filter(key => key.length <= MAX_VAR_KEY_LENGTH) || []
+  const keyObj: Record<string, boolean> = {}
+  // remove duplicate keys
+  const res: string[] = []
+  keys.forEach((key) => {
+    if (keyObj[key])
+      return
+
+    keyObj[key] = true
+    res.push(key)
+  })
+  return res
+}
+
+// Set the value of basePath
+// example: /dify
+export const basePath = ''
diff --git a/utils/zod.spec.ts b/utils/zod.spec.ts
new file mode 100644
index 0000000..4dc711c
--- /dev/null
+++ b/utils/zod.spec.ts
@@ -0,0 +1,173 @@
+import { ZodError, z } from 'zod'
+
+describe('Zod Features', () => {
+  it('should support string', () => {
+    const stringSchema = z.string()
+    const numberLikeStringSchema = z.coerce.string() // 12 would be converted to '12'
+    const stringSchemaWithError = z.string({
+      required_error: 'Name is required',
+      invalid_type_error: 'Invalid name type, expected string',
+    })
+
+    const urlSchema = z.string().url()
+    const uuidSchema = z.string().uuid()
+
+    expect(stringSchema.parse('hello')).toBe('hello')
+    expect(() => stringSchema.parse(12)).toThrow()
+    expect(numberLikeStringSchema.parse('12')).toBe('12')
+    expect(numberLikeStringSchema.parse(12)).toBe('12')
+    expect(() => stringSchemaWithError.parse(undefined)).toThrow('Name is required')
+    expect(() => stringSchemaWithError.parse(12)).toThrow('Invalid name type, expected string')
+
+    expect(urlSchema.parse('https://dify.ai')).toBe('https://dify.ai')
+    expect(uuidSchema.parse('123e4567-e89b-12d3-a456-426614174000')).toBe('123e4567-e89b-12d3-a456-426614174000')
+  })
+
+  it('should support enum', () => {
+    enum JobStatus {
+      waiting = 'waiting',
+      processing = 'processing',
+      completed = 'completed',
+    }
+    expect(z.nativeEnum(JobStatus).parse(JobStatus.waiting)).toBe(JobStatus.waiting)
+    expect(z.nativeEnum(JobStatus).parse('completed')).toBe('completed')
+    expect(() => z.nativeEnum(JobStatus).parse('invalid')).toThrow()
+  })
+
+  it('should support number', () => {
+    const numberSchema = z.number()
+    const numberWithMin = z.number().gt(0) // alias min
+    const numberWithMinEqual = z.number().gte(0)
+    const numberWithMax = z.number().lt(100) // alias max
+
+    expect(numberSchema.parse(123)).toBe(123)
+    expect(numberWithMin.parse(50)).toBe(50)
+    expect(numberWithMinEqual.parse(0)).toBe(0)
+    expect(() => numberWithMin.parse(-1)).toThrow()
+    expect(numberWithMax.parse(50)).toBe(50)
+    expect(() => numberWithMax.parse(101)).toThrow()
+  })
+
+  it('should support boolean', () => {
+    const booleanSchema = z.boolean()
+    expect(booleanSchema.parse(true)).toBe(true)
+    expect(booleanSchema.parse(false)).toBe(false)
+    expect(() => booleanSchema.parse('true')).toThrow()
+  })
+
+  it('should support date', () => {
+    const dateSchema = z.date()
+    expect(dateSchema.parse(new Date('2023-01-01'))).toEqual(new Date('2023-01-01'))
+  })
+
+  it('should support object', () => {
+    const userSchema = z.object({
+      id: z.union([z.string(), z.number()]),
+      name: z.string(),
+      email: z.string().email(),
+      age: z.number().min(0).max(120).optional(),
+    })
+
+    type User = z.infer<typeof userSchema>
+
+    const validUser: User = {
+      id: 1,
+      name: 'John',
+      email: 'john@example.com',
+      age: 30,
+    }
+
+    expect(userSchema.parse(validUser)).toEqual(validUser)
+  })
+
+  it('should support object optional field', () => {
+    const userSchema = z.object({
+      name: z.string(),
+      optionalField: z.optional(z.string()),
+    })
+    type User = z.infer<typeof userSchema>
+
+    const user: User = {
+      name: 'John',
+    }
+    const userWithOptionalField: User = {
+      name: 'John',
+      optionalField: 'optional',
+    }
+    expect(userSchema.safeParse(user).success).toEqual(true)
+    expect(userSchema.safeParse(userWithOptionalField).success).toEqual(true)
+  })
+
+  it('should support object intersection', () => {
+    const Person = z.object({
+      name: z.string(),
+    })
+
+    const Employee = z.object({
+      role: z.string(),
+    })
+
+    const EmployedPerson = z.intersection(Person, Employee)
+    const validEmployedPerson = {
+      name: 'John',
+      role: 'Developer',
+    }
+    expect(EmployedPerson.parse(validEmployedPerson)).toEqual(validEmployedPerson)
+  })
+
+  it('should support record', () => {
+    const recordSchema = z.record(z.string(), z.number())
+    const validRecord = {
+      a: 1,
+      b: 2,
+    }
+    expect(recordSchema.parse(validRecord)).toEqual(validRecord)
+  })
+
+  it('should support array', () => {
+    const numbersSchema = z.array(z.number())
+    const stringArraySchema = z.string().array()
+
+    expect(numbersSchema.parse([1, 2, 3])).toEqual([1, 2, 3])
+    expect(stringArraySchema.parse(['a', 'b', 'c'])).toEqual(['a', 'b', 'c'])
+  })
+
+  it('should support promise', () => {
+    const promiseSchema = z.promise(z.string())
+    const validPromise = Promise.resolve('success')
+
+    expect(promiseSchema.parse(validPromise)).resolves.toBe('success')
+  })
+
+  it('should support unions', () => {
+    const unionSchema = z.union([z.string(), z.number()])
+
+    expect(unionSchema.parse('success')).toBe('success')
+    expect(unionSchema.parse(404)).toBe(404)
+  })
+
+  it('should support functions', () => {
+    const functionSchema = z.function().args(z.string(), z.number(), z.optional(z.string())).returns(z.number())
+    const validFunction = (name: string, age: number, _optional?: string): number => {
+      return age
+    }
+    expect(functionSchema.safeParse(validFunction).success).toEqual(true)
+  })
+
+  it('should support undefined, null, any, and void', () => {
+    const undefinedSchema = z.undefined()
+    const nullSchema = z.null()
+    const anySchema = z.any()
+
+    expect(undefinedSchema.parse(undefined)).toBeUndefined()
+    expect(nullSchema.parse(null)).toBeNull()
+    expect(anySchema.parse('anything')).toBe('anything')
+    expect(anySchema.parse(3)).toBe(3)
+  })
+
+  it('should safeParse would not throw', () => {
+    expect(z.string().safeParse('abc').success).toBe(true)
+    expect(z.string().safeParse(123).success).toBe(false)
+    expect(z.string().safeParse(123).error).toBeInstanceOf(ZodError)
+  })
+})

--
Gitblit v1.8.0